diff --git a/Mednafen/English.lproj/InfoPlist.strings b/Mednafen/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000..5e45963c38 Binary files /dev/null and b/Mednafen/English.lproj/InfoPlist.strings differ diff --git a/Mednafen/Info.plist b/Mednafen/Info.plist new file mode 100644 index 0000000000..3ead16707b --- /dev/null +++ b/Mednafen/Info.plist @@ -0,0 +1,182 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + Mednafen + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 0.9.38.7.1 + NSPrincipalClass + OEGameCoreController + OEGameCoreClass + MednafenGameCore + OEGameCoreOptions + + openemu.system.lynx + + OEGameCoreRequiresFiles + + OEGameCoreRewindBufferSeconds + 60 + OEGameCoreRewindInterval + 0 + OEGameCoreSupportsRewinding + + OERequiredFiles + + + Description + Lynx boot ROM + MD5 + fcd403db69f54290b51035d82f835e7b + Name + lynxboot.img + Size + 512 + + + + openemu.system.pce + + OEGameCoreRewindBufferSeconds + 60 + OEGameCoreRewindInterval + 0 + OEGameCoreSupportsRewinding + + + openemu.system.pcecd + + OEGameCoreRequiresFiles + + OEGameCoreRewindBufferSeconds + 60 + OEGameCoreRewindInterval + 0 + OEGameCoreSupportsRewinding + + OERequiredFiles + + + Description + TurboGrafx-CD/PC Engine CD BIOS + MD5 + ff1a674273fe3540ccef576376407d1d + Name + syscard3.pce + Size + 262656 + + + + openemu.system.pcfx + + OEGameCoreRequiresFiles + + OERequiredFiles + + + Description + PC-FX BIOS + MD5 + 08e36edbea28a017f79f8d4f7ff9b6d7 + Name + pcfx.rom + Size + 1048576 + + + + openemu.system.psx + + OEGameCoreRequiresFiles + + OEGameCoreSupportsMultipleDiscs + + OERequiredFiles + + + Description + PlayStation (JP) SCPH-5500 BIOS + MD5 + 8dd7d5296a650fac7319bce665a6a53c + Name + scph5500.bin + Size + 524288 + + + Description + PlayStation (NA) SCPH-5501 BIOS + MD5 + 490f666e1afb15b7362b406ed1cea246 + Name + scph5501.bin + Size + 524288 + + + Description + PlayStation (EU) SCPH-5502 BIOS + MD5 + 32736f17079d0b2b7024407c39bd3050 + Name + scph5502.bin + Size + 524288 + + + + openemu.system.vb + + OEGameCoreRewindBufferSeconds + 60 + OEGameCoreRewindInterval + 0 + OEGameCoreSupportsRewinding + + + openemu.system.ws + + OEGameCoreRewindBufferSeconds + 60 + OEGameCoreRewindInterval + 0 + OEGameCoreSupportsRewinding + + + + OEGameCorePlayerCount + 2 + OEProjectURL + http://mednafen.sourceforge.net/ + OESystemIdentifiers + + openemu.system.lynx + openemu.system.pce + openemu.system.pcecd + openemu.system.pcfx + openemu.system.psx + openemu.system.vb + openemu.system.ws + + SUEnableAutomaticChecks + 1 + SUFeedURL + https://raw.github.com/OpenEmu/OpenEmu-Update/master/mednafen_appcast.xml + + diff --git a/Mednafen/Mednafen.icns b/Mednafen/Mednafen.icns new file mode 100644 index 0000000000..af8627be5f Binary files /dev/null and b/Mednafen/Mednafen.icns differ diff --git a/Mednafen/MednafenGameCore.h b/Mednafen/MednafenGameCore.h new file mode 100644 index 0000000000..e66ae458ab --- /dev/null +++ b/Mednafen/MednafenGameCore.h @@ -0,0 +1,202 @@ +/* + Copyright (c) 2013, OpenEmu Team + + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import + +@class OERingBuffer; + +typedef NS_ENUM(NSInteger, PVPSXButton) +{ + PVPSXButtonUp, + PVPSXButtonDown, + PVPSXButtonLeft, + PVPSXButtonRight, + PVPSXButtonTriangle, + PVPSXButtonCircle, + PVPSXButtonCross, + PVPSXButtonSquare, + PVPSXButtonL1, + PVPSXButtonL2, + PVPSXButtonL3, + PVPSXButtonR1, + PVPSXButtonR2, + PVPSXButtonR3, + PVPSXButtonStart, + PVPSXButtonSelect, + PVPSXButtonAnalogMode, + OEPSXLeftAnalogUp, + OEPSXLeftAnalogDown, + OEPSXLeftAnalogLeft, + OEPSXLeftAnalogRight, + OEPSXRightAnalogUp, + OEPSXRightAnalogDown, + OEPSXRightAnalogLeft, + OEPSXRightAnalogRight, + PVPSXButtonCount +}; + +typedef NS_ENUM(NSInteger, OEWSButton) { + OEWSButtonX1, // Up + OEWSButtonX3, // Down + OEWSButtonX4, // Left + OEWSButtonX2, // Right + OEWSButtonY1, + OEWSButtonY3, + OEWSButtonY4, + OEWSButtonY2, + OEWSButtonA, + OEWSButtonB, + OEWSButtonStart, + OEWSButtonSound, + OEWSButtonCount +}; + +typedef NS_ENUM(NSInteger, OEVBButton) { + OEVBButtonLeftUp, + OEVBButtonLeftDown, + OEVBButtonLeftLeft, + OEVBButtonLeftRight, + OEVBButtonRightUp, + OEVBButtonRightDown, + OEVBButtonRightLeft, + OEVBButtonRightRight, + OEVBButtonL, + OEVBButtonR, + OEVBButtonA, + OEVBButtonB, + OEVBButtonStart, + OEVBButtonSelect, + OEVBButtonCount +}; + +typedef NS_ENUM(NSInteger, OEPCEButton) { + OEPCEButtonUp, + OEPCEButtonDown, + OEPCEButtonLeft, + OEPCEButtonRight, + OEPCEButton1, + OEPCEButton2, + OEPCEButton3, + OEPCEButton4, + OEPCEButton5, + OEPCEButton6, + OEPCEButtonRun, + OEPCEButtonSelect, + OEPCEButtonMode, + OEPCEButtonCount +}; + +typedef NS_ENUM(NSInteger, OEPCFXButton) { + OEPCFXButtonUp, + OEPCFXButtonDown, + OEPCFXButtonLeft, + OEPCFXButtonRight, + OEPCFXButton1, + OEPCFXButton2, + OEPCFXButton3, + OEPCFXButton4, + OEPCFXButton5, + OEPCFXButton6, + OEPCFXButtonRun, + OEPCFXButtonSelect, + OEPCFXButtonCount, +}; + +typedef NS_ENUM(NSInteger, OEPCECDButton) { + OEPCECDButtonUp, + OEPCECDButtonDown, + OEPCECDButtonLeft, + OEPCECDButtonRight, + OEPCECDButton1, + OEPCECDButton2, + OEPCECDButton3, + OEPCECDButton4, + OEPCECDButton5, + OEPCECDButton6, + OEPCECDButtonRun, + OEPCECDButtonSelect, + OEPCECDButtonMode, + OEPCECDButtonCount +}; + +typedef NS_ENUM(NSInteger, OELynxButton) { + OELynxButtonUp, + OELynxButtonDown, + OELynxButtonLeft, + OELynxButtonRight, + OELynxButtonA, + OELynxButtonB, + OELynxButtonOption1, + OELynxButtonOption2, + OELynxButtonCount +}; + +typedef NS_ENUM(NSInteger, OENGPButton) { + OENGPButtonUp, + OENGPButtonDown, + OENGPButtonLeft, + OENGPButtonRight, + OENGPButtonA, + OENGPButtonB, + OENGPButtonOption, + OENGPButtonCount, +}; + +__attribute__((visibility("default"))) +@interface MednafenGameCore : PVEmulatorCore + +// Atari Lynx +- (oneway void)didPushLynxButton:(OELynxButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleaseLynxButton:(OELynxButton)button forPlayer:(NSUInteger)player; + +// Neo Geo Pocket + Color +- (oneway void)didPushNGPButton:(OENGPButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleaseNGPButton:(OENGPButton)button forPlayer:(NSUInteger)player; + +// PC-* +- (oneway void)didPushPCEButton:(OEPCEButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleasePCEButton:(OEPCEButton)button forPlayer:(NSUInteger)player; +- (oneway void)didPushPCECDButton:(OEPCECDButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleasePCECDButton:(OEPCECDButton)button forPlayer:(NSUInteger)player; +- (oneway void)didPushPCFXButton:(OEPCFXButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleasePCFXButton:(OEPCFXButton)button forPlayer:(NSUInteger)player; + +// PSX +- (oneway void)didPushPSXButton:(PVPSXButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleasePSXButton:(PVPSXButton)button forPlayer:(NSUInteger)player; +- (oneway void)didMovePSXJoystickDirection:(PVPSXButton)button withValue:(CGFloat)value forPlayer:(NSUInteger)player; + +// Virtual Boy +- (oneway void)didPushVBButton:(OEVBButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleaseVBButton:(OEVBButton)button forPlayer:(NSUInteger)player; + +// WonderSwan +- (oneway void)didPushWSButton:(OEWSButton)button forPlayer:(NSUInteger)player; +- (oneway void)didReleaseWSButton:(OEWSButton)button forPlayer:(NSUInteger)player; + +@end diff --git a/Mednafen/MednafenGameCore.mm b/Mednafen/MednafenGameCore.mm new file mode 100644 index 0000000000..56ba67481e --- /dev/null +++ b/Mednafen/MednafenGameCore.mm @@ -0,0 +1,2156 @@ +/* + Copyright (c) 2013, OpenEmu Team + + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "mednafen.h" +#include "settings-driver.h" +#include "state-driver.h" +#include "mednafen-driver.h" +#include "MemoryStream.h" + +#import "MednafenGameCore.h" +#import +#import +#import + +#import + +#define GET_CURRENT_OR_RETURN(...) __strong __typeof__(_current) current = _current; if(current == nil) return __VA_ARGS__; + +typedef struct OEIntPoint { + int x; + int y; +} OEIntPoint; + +typedef struct OEIntSize { + int width; + int height; +} OEIntSize; + +typedef struct OEIntRect { + OEIntPoint origin; + OEIntSize size; +} OEIntRect; + +static inline OEIntSize OEIntSizeMake(int width, int height) +{ + return (OEIntSize){ width, height }; +} +static inline BOOL OEIntSizeEqualToSize(OEIntSize size1, OEIntSize size2) +{ + return size1.width == size2.width && size1.height == size2.height; +} +static inline BOOL OEIntSizeIsEmpty(OEIntSize size) +{ + return size.width == 0 || size.height == 0; +} + +static inline OEIntRect OEIntRectMake(int x, int y, int width, int height) +{ + return (OEIntRect){ (OEIntPoint){ x, y }, (OEIntSize){ width, height } }; +} + +static MDFNGI *game; +static MDFN_Surface *surf; + +namespace MDFN_IEN_VB +{ + extern void VIP_SetParallaxDisable(bool disabled); + extern void VIP_SetAnaglyphColors(uint32 lcolor, uint32 rcolor); + int mednafenCurrentDisplayMode = 1; +} + +typedef enum MednaSystem {lynx, neogeo, pce, pcfx, psx, vb, wswan }; + +@interface MednafenGameCore () +{ + uint32_t *inputBuffer[8]; + MednaSystem systemType; + int videoWidth, videoHeight; + int videoOffsetX, videoOffsetY; + int multiTapPlayerCount; + NSString *romName; + double sampleRate; + double masterClock; + + NSString *mednafenCoreModule; + NSTimeInterval mednafenCoreTiming; + OEIntSize mednafenCoreAspect; + NSUInteger maxDiscs; +} + +@end + +static __weak MednafenGameCore *_current; + +@implementation MednafenGameCore + +-(uint32_t*) getInputBuffer:(int)bufferId +{ + return inputBuffer[bufferId]; +} + +static void mednafen_init(MednafenGameCore* current) +{ + //passing by parameter + //GET_CURRENT_OR_RETURN(); + + NSString* batterySavesDirectory = current.batterySavesPath; + NSString* biosPath = current.BIOSPath; + + std::vector ext; + MDFNI_InitializeModules(ext); + + std::vector settings; + + //passing by parameter + //NSString *batterySavesDirectory = [self batterySavesPath]; + //NSString *biosPath = current.biosDirectoryPath; + + MDFNI_Initialize([biosPath UTF8String], settings); + + // Set bios/system file and memcard save paths + MDFNI_SetSetting("pce.cdbios", [[[biosPath stringByAppendingPathComponent:@"syscard3"] stringByAppendingPathExtension:@"pce"] UTF8String]); // PCE CD BIOS + MDFNI_SetSetting("pcfx.bios", [[[biosPath stringByAppendingPathComponent:@"pcfx"] stringByAppendingPathExtension:@"rom"] UTF8String]); // PCFX BIOS + MDFNI_SetSetting("psx.bios_jp", [[[biosPath stringByAppendingPathComponent:@"scph5500"] stringByAppendingPathExtension:@"bin"] UTF8String]); // JP SCPH-5500 BIOS + MDFNI_SetSetting("psx.bios_na", [[[biosPath stringByAppendingPathComponent:@"scph5501"] stringByAppendingPathExtension:@"bin"] UTF8String]); // NA SCPH-5501 BIOS + MDFNI_SetSetting("psx.bios_eu", [[[biosPath stringByAppendingPathComponent:@"scph5502"] stringByAppendingPathExtension:@"bin"] UTF8String]); // EU SCPH-5502 BIOS + MDFNI_SetSetting("filesys.path_sav", [batterySavesDirectory UTF8String]); // Memcards + + // VB defaults. dox http://mednafen.sourceforge.net/documentation/09x/vb.html + MDFNI_SetSetting("vb.disable_parallax", "1"); // Disable parallax for BG and OBJ rendering + MDFNI_SetSetting("vb.anaglyph.preset", "disabled"); // Disable anaglyph preset + MDFNI_SetSetting("vb.anaglyph.lcolor", "0xFF0000"); // Anaglyph l color + MDFNI_SetSetting("vb.anaglyph.rcolor", "0x000000"); // Anaglyph r color + //MDFNI_SetSetting("vb.allow_draw_skip", "1"); // Allow draw skipping + //MDFNI_SetSetting("vb.instant_display_hack", "1"); // Display latency reduction hack + + MDFNI_SetSetting("pce.slstart", "0"); // PCE: First rendered scanline + MDFNI_SetSetting("pce.slend", "239"); // PCE: Last rendered scanline + + MDFNI_SetSetting("psx.h_overscan", "0"); // Remove PSX overscan + + // PlayStation Multitap supported games (incomplete list) + NSDictionary *multiTapGames = + @{ + @"SLES-02339" : @3, // Arcade Party Pak (Europe, Australia) + @"SLUS-00952" : @3, // Arcade Party Pak (USA) + @"SLES-02537" : @3, // Bishi Bashi Special (Europe) + @"SLPM-86123" : @3, // Bishi Bashi Special (Japan) + @"SLPM-86539" : @3, // Bishi Bashi Special 3: Step Champ (Japan) + @"SLPS-01701" : @3, // Capcom Generation - Dai 4 Shuu Kokou no Eiyuu (Japan) + @"SLPS-01567" : @3, // Captain Commando (Japan) + @"SLUS-00682" : @3, // Jeopardy! (USA) + @"SLUS-01173" : @3, // Jeopardy! 2nd Edition (USA) + @"SLES-03752" : @3, // Quiz Show (Italy) (Disc 1) + @"SLES-13752" : @3, // Quiz Show (Italy) (Disc 2) + @"SLES-02849" : @3, // Rampage - Through Time (Europe) (En,Fr,De) + @"SLUS-01065" : @3, // Rampage - Through Time (USA) + @"SLES-02021" : @3, // Rampage 2 - Universal Tour (Europe) + @"SLUS-00742" : @3, // Rampage 2 - Universal Tour (USA) + @"SLUS-01174" : @3, // Wheel of Fortune - 2nd Edition (USA) + @"SLES-03499" : @3, // You Don't Know Jack (Germany) + @"SLUS-00716" : @3, // You Don't Know Jack (USA) (Disc 1) + @"SLUS-00762" : @3, // You Don't Know Jack (USA) (Disc 2) + @"SLUS-01194" : @3, // You Don't Know Jack - Mock 2 (USA) + @"SLES-00015" : @4, // Actua Golf (Europe) (En,Fr,De) + @"SLPS-00298" : @4, // Actua Golf (Japan) + @"SLUS-00198" : @4, // VR Golf '97 (USA) (En,Fr) + @"SLES-00044" : @4, // Actua Golf 2 (Europe) + @"SLUS-00636" : @4, // FOX Sports Golf '99 (USA) + @"SLES-01042" : @4, // Actua Golf 3 (Europe) + @"SLES-00188" : @4, // Actua Ice Hockey (Europe) (En,Fr,De,Sv,Fi) + @"SLPM-86078" : @4, // Actua Ice Hockey (Japan) + @"SLES-01226" : @4, // Actua Ice Hockey 2 (Europe) + @"SLES-00021" : @4, // Actua Soccer 2 (Europe) (En,Fr) + @"SLES-01029" : @4, // Actua Soccer 2 (Germany) (En,De) + @"SLES-01028" : @4, // Actua Soccer 2 (Italy) + @"SLES-00265" : @4, // Actua Tennis (Europe) + @"SLES-01396" : @4, // Actua Tennis (Europe) (Fr,De) + @"SLES-00189" : @4, // Adidas Power Soccer (Europe) (En,Fr,De,Es,It) + @"SCUS-94502" : @4, // Adidas Power Soccer (USA) + @"SLES-00857" : @4, // Adidas Power Soccer 2 (Europe) (En,Fr,De,Es,It,Nl) + @"SLES-00270" : @4, // Adidas Power Soccer International '97 (Europe) (En,Fr,De,Es,It,Nl) + @"SLES-01239" : @4, // Adidas Power Soccer 98 (Europe) (En,Fr,De,Es,It,Nl) + @"SLUS-00547" : @4, // Adidas Power Soccer 98 (USA) + @"SLES-03963" : @4, // All Star Tennis (Europe) + @"SLPS-02228" : @4, // Simple 1500 Series Vol. 26 - The Tennis (Japan) + @"SLUS-01348" : @4, // Tennis (USA) + @"SLES-01433" : @4, // All Star Tennis '99 (Europe) (En,Fr,De,Es,It) + @"SLES-02764" : @4, // All Star Tennis 2000 (Europe) (En,De,Es,It) + @"SLES-02765" : @4, // All Star Tennis 2000 (France) + @"SCES-00263" : @4, // Namco Tennis Smash Court (Europe) + @"SLPS-00450" : @4, // Smash Court (Japan) + @"SCES-01833" : @4, // Anna Kournikova's Smash Court Tennis (Europe) + @"SLPS-01693" : @4, // Smash Court 2 (Japan) + @"SLPS-03001" : @4, // Smash Court 3 (Japan) + @"SLES-03579" : @4, // Junior Sports Football (Europe) + @"SLES-03581" : @4, // Junior Sports Fussball (Germany) + @"SLUS-01094" : @4, // Backyard Soccer (USA) + @"SLES-03210" : @4, // Hunter, The (Europe) + @"SLPM-86400" : @4, // SuperLite 1500 Series - Battle Sugoroku the Hunter - A.R.0062 (Japan) + @"SLUS-01335" : @4, // Battle Hunter (USA) + @"SLES-00476" : @4, // Blast Chamber (Europe) (En,Fr,De,Es,It) + @"SLPS-00622" : @4, // Kyuu Bakukku (Japan) + @"SLUS-00219" : @4, // Blast Chamber (USA) + @"SLES-00845" : @4, // Blaze & Blade - Eternal Quest (Europe) + @"SLES-01274" : @4, // Blaze & Blade - Eternal Quest (Germany) + @"SLPS-01209" : @4, // Blaze & Blade - Eternal Quest (Japan) + @"SLPS-01576" : @4, // Blaze & Blade Busters (Japan) + @"SCES-01443" : @4, // Blood Lines (Europe) (En,Fr,De,Es,It) + @"SLPS-03002" : @4, // Bomberman Land (Japan) (v1.0) / (v1.1) / (v1.2) + @"SLES-00258" : @4, // Break Point (Europe) (En,Fr) + @"SLES-02854" : @4, // Break Out (Europe) (En,Fr,De,It) + @"SLUS-01170" : @4, // Break Out (USA) + @"SLES-00759" : @4, // Brian Lara Cricket (Europe) + @"SLES-01486" : @4, // Caesars Palace II (Europe) + @"SLES-02476" : @4, // Caesars Palace 2000 - Millennium Gold Edition (Europe) + @"SLUS-01089" : @4, // Caesars Palace 2000 - Millennium Gold Edition (USA) + @"SLES-03206" : @4, // Card Shark (Europe) + @"SLPS-02225" : @4, // Trump Shiyouyo! (Japan) (v1.0) + @"SLPS-02612" : @4, // Trump Shiyouyo! (Japan) (v1.1) + @"SLES-02825" : @4, // Catan - Die erste Insel (Germany) + @"SLUS-00886" : @4, // Chessmaster II (USA) + @"SLES-00753" : @4, // Circuit Breakers (Europe) (En,Fr,De,Es,It) + @"SLUS-00697" : @4, // Circuit Breakers (USA) + @"SLUS-00196" : @4, // College Slam (USA) + @"SCES-02834" : @4, // Crash Bash (Europe) (En,Fr,De,Es,It) + @"SCPS-10140" : @4, // Crash Bandicoot Carnival (Japan) + @"SCUS-94570" : @4, // Crash Bash (USA) + @"SCES-02105" : @4, // CTR - Crash Team Racing (Europe) (En,Fr,De,Es,It,Nl) (EDC) / (No EDC) + @"SCPS-10118" : @4, // Crash Bandicoot Racing (Japan) + @"SCUS-94426" : @4, // CTR - Crash Team Racing (USA) + @"SLES-02371" : @4, // CyberTiger (Australia) + @"SLES-02370" : @4, // CyberTiger (Europe) (En,Fr,De,Es,Sv) + @"SLUS-01004" : @4, // CyberTiger (USA) + @"SLES-03488" : @4, // David Beckham Soccer (Europe) + @"SLES-03682" : @4, // David Beckham Soccer (Europe) (Fr,De,Es,It) + @"SLUS-01455" : @4, // David Beckham Soccer (USA) + @"SLES-00096" : @4, // Davis Cup Complete Tennis (Europe) + @"SCES-03705" : @4, // Disney's Party Time with Winnie the Pooh (Europe) + @"SCES-03744" : @4, // Disney's Winnie l'Ourson - C'est la récré! (France) + @"SCES-03745" : @4, // Disney's Party mit Winnie Puuh (Germany) + @"SCES-03749" : @4, // Disney Pooh e Tigro! E Qui la Festa (Italy) + @"SLPS-03460" : @4, // Pooh-San no Minna de Mori no Daikyosou! (Japan) + @"SCES-03746" : @4, // Disney's Spelen met Winnie de Poeh en zijn Vriendjes! (Netherlands) + @"SCES-03748" : @4, // Disney Ven a la Fiesta! con Winnie the Pooh (Spain) + @"SLUS-01437" : @4, // Disney's Pooh's Party Game - In Search of the Treasure (USA) + @"SLPS-00155" : @4, // DX Jinsei Game (Japan) + @"SLPS-00918" : @4, // DX Jinsei Game II (Japan) (v1.0) / (v1.1) + @"SLPS-02469" : @4, // DX Jinsei Game III (Japan) + @"SLPM-86963" : @4, // DX Jinsei Game IV (Japan) + @"SLPM-87187" : @4, // DX Jinsei Game V (Japan) + @"SLES-02823" : @4, // ECW Anarchy Rulz (Europe) + @"SLES-03069" : @4, // ECW Anarchy Rulz (Germany) + @"SLUS-01169" : @4, // ECW Anarchy Rulz (USA) + @"SLES-02535" : @4, // ECW Hardcore Revolution (Europe) (v1.0) / (v1.1) + @"SLES-02536" : @4, // ECW Hardcore Revolution (Germany) (v1.0) / (v1.1) + @"SLUS-01045" : @4, // ECW Hardcore Revolution (USA) + @"SLUS-01186" : @4, // ESPN MLS Gamenight (USA) + @"SLES-03082" : @4, // European Super League (Europe) (En,Fr,De,Es,It,Pt) + @"SLES-02142" : @4, // F.A. Premier League Stars, The (Europe) + @"SLES-02143" : @4, // Bundesliga Stars 2000 (Germany) + @"SLES-02702" : @4, // Primera Division Stars (Spain) + @"SLES-03063" : @4, // F.A. Premier League Stars 2001, The (Europe) + @"SLES-03064" : @4, // LNF Stars 2001 (France) + @"SLES-03065" : @4, // Bundesliga Stars 2001 (Germany) + @"SLES-00548" : @4, // Fantastic Four (Europe) (En,Fr,De,Es,It) + @"SLPS-01034" : @4, // Fantastic Four (Japan) + @"SLUS-00395" : @4, // Fantastic Four (USA) + @"SLPS-02065" : @4, // Fire Pro Wrestling G (Japan) (v1.0) + @"SLPS-02817" : @4, // Fire Pro Wrestling G (Japan) (v1.1) + @"SLES-00704" : @4, // Frogger (Europe) (En,Fr,De,Es,It) + @"SLPS-01399" : @4, // Frogger (Japan) + @"SLUS-00506" : @4, // Frogger (USA) + @"SLES-02853" : @4, // Frogger 2 - Swampy's Revenge (Europe) (En,Fr,De,It) + @"SLUS-01172" : @4, // Frogger 2 - Swampy's Revenge (USA) + @"SLES-01241" : @4, // Gekido - Urban Fighters (Europe) (En,Fr,De,Es,It) + @"SLUS-00970" : @4, // Gekido - Urban Fighters (USA) + @"SLPM-86761" : @4, // Simple 1500 Series Vol. 60 - The Table Hockey (Japan) + @"SLPS-03362" : @4, // Simple Character 2000 Series Vol. 05 - High School Kimengumi - The Table Hockey (Japan) + @"SLES-01041" : @4, // Hogs of War (Europe) + @"SLUS-01195" : @4, // Hogs of War (USA) + @"SCES-00983" : @4, // Everybody's Golf (Europe) (En,Fr,De,Es,It) + @"SCPS-10042" : @4, // Minna no Golf (Japan) + @"SCUS-94188" : @4, // Hot Shots Golf (USA) + @"SCES-02146" : @4, // Everybody's Golf 2 (Europe) + @"SCPS-10093" : @4, // Minna no Golf 2 (Japan) (v1.0) + @"SCUS-94476" : @4, // Hot Shots Golf 2 (USA) + @"SLES-03595" : @4, // Hot Wheels - Extreme Racing (Europe) + @"SLUS-01293" : @4, // Hot Wheels - Extreme Racing (USA) + @"SLPM-86651" : @4, // Hunter X Hunter - Maboroshi no Greed Island (Japan) + @"SLES-00309" : @4, // Hyper Tennis - Final Match (Europe) + @"SLES-00309" : @4, // Hyper Final Match Tennis (Japan) + @"SLES-02550" : @4, // International Superstar Soccer (Europe) (En,De) + @"SLES-03149" : @4, // International Superstar Soccer (Europe) (Fr,Es,It) + @"SLPM-86317" : @4, // Jikkyou J. League 1999 - Perfect Striker (Japan) + @"SLES-00511" : @4, // International Superstar Soccer Deluxe (Europe) + @"SLPM-86538" : @4, // J. League Jikkyou Winning Eleven 2000 (Japan) + @"SLPM-86668" : @4, // J. League Jikkyou Winning Eleven 2000 2nd (Japan) + @"SLPM-86835" : @4, // J. League Jikkyou Winning Eleven 2001 (Japan) + @"SLES-00333" : @4, // International Track & Field (Europe) + @"SLPM-86002" : @4, // Hyper Olympic in Atlanta (Japan) + @"SLUS-00238" : @4, // International Track & Field (USA) + @"SLES-02448" : @4, // International Track & Field 2 (Europe) + @"SLPM-86482" : @4, // Ganbare! Nippon! Olympic 2000 (Japan) + @"SLUS-00987" : @4, // International Track & Field 2000 (USA) + @"SLES-02424" : @4, // ISS Pro Evolution (Europe) (Es,It) + @"SLES-02095" : @4, // ISS Pro Evolution (Europe) (En,Fr,De) (EDC) / (No EDC) + @"SLPM-86291" : @4, // World Soccer Jikkyou Winning Eleven 4 (Japan) (v1.0) / (v1.1) + @"SLUS-01014" : @4, // ISS Pro Evolution (USA) + @"SLES-03321" : @4, // ISS Pro Evolution 2 (Europe) (En,Fr,De) + @"SLPM-86600" : @4, // World Soccer Jikkyou Winning Eleven 2000 - U-23 Medal e no Chousen (Japan) + @"SLPS-00832" : @4, // Iwatobi Penguin Rocky x Hopper (Japan) + @"SLPS-01283" : @4, // Iwatobi Penguin Rocky x Hopper 2 - Tantei Monogatari (Japan) + @"SLES-02572" : @4, // TOCA World Touring Cars (Europe) (En,Fr,De) + @"SLES-02573" : @4, // TOCA World Touring Cars (Europe) (Es,It) + @"SLPS-02852" : @4, // WTC World Touring Car Championship (Japan) + @"SLUS-01139" : @4, // Jarrett & Labonte Stock Car Racing (USA) + @"SLES-03328" : @4, // Jetracer (Europe) (En,Fr,De) + @"SLES-00377" : @4, // Jonah Lomu Rugby (Europe) (En,De,Es,It) + @"SLES-00611" : @4, // Jonah Lomu Rugby (France) + @"SLPS-01268" : @4, // Great Rugby Jikkyou '98 - World Cup e no Michi (Japan) + @"SLES-01061" : @4, // Kick Off World (Europe) (En,Fr) + @"SLES-01327" : @4, // Kick Off World (Europe) (Es,Nl) + @"SLES-01062" : @4, // Kick Off World (Germany) + @"SLES-01328" : @4, // Kick Off World (Greece) + @"SLES-01063" : @4, // Kick Off World Manager (Italy) + @"SCES-03922" : @4, // Klonoa - Beach Volleyball (Europe) (En,Fr,De,Es,It) + @"SLPS-03433" : @4, // Klonoa Beach Volley - Saikyou Team Ketteisen! (Japan) + @"SLUS-01125" : @4, // Kurt Warner's Arena Football Unleashed (USA) + @"SLPS-00686" : @4, // Love Game's - Wai Wai Tennis (Japan) + @"SLES-02272" : @4, // Yeh Yeh Tennis (Europe) (En,Fr,De) + @"SLPS-02983" : @4, // Love Game's - Wai Wai Tennis 2 (Japan) + @"SLPM-86899" : @4, // Love Game's - Wai Wai Tennis Plus (Japan) + @"SLES-01594" : @4, // Michael Owen's World League Soccer 99 (Europe) (En,Fr,It) + @"SLES-02499" : @4, // Midnight in Vegas (Europe) (En,Fr,De) (v1.0) / (v1.1) + @"SLUS-00836" : @4, // Vegas Games 2000 (USA) + @"SLES-03246" : @4, // Monster Racer (Europe) (En,Fr,De,Es,It,Pt) + @"SLES-03813" : @4, // Monte Carlo Games Compendium (Europe) (Disc 1) + @"SLES-13813" : @4, // Monte Carlo Games Compendium (Europe) (Disc 2) + @"SLES-00945" : @4, // Monopoly (Europe) (En,Fr,De,Es,Nl) (v1.0) / (v1.1) + @"SLPS-00741" : @4, // Monopoly (Japan) + @"SLES-00310" : @4, // Motor Mash (Europe) (En,Fr,De) + @"SCES-03085" : @4, // Ms. Pac-Man Maze Madness (Europe) (En,Fr,De,Es,It) + @"SLPS-03000" : @4, // Ms. Pac-Man Maze Madness (Japan) + @"SLUS-01018" : @4, // Ms. Pac-Man Maze Madness (USA) (v1.0) / (v1.1) + @"SLES-02224" : @4, // Music 2000 (Europe) (En,Fr,De,Es,It) + @"SLUS-01006" : @4, // MTV Music Generator (USA) + @"SLES-00999" : @4, // Nagano Winter Olympics '98 (Europe) + @"SLPM-86056" : @4, // Hyper Olympic in Nagano (Japan) + @"SLUS-00591" : @4, // Nagano Winter Olympics '98 (USA) + @"SLUS-00329" : @4, // NBA Hangtime (USA) + @"SLES-00529" : @4, // NBA Jam Extreme (Europe) + @"SLPS-00699" : @4, // NBA Jam Extreme (Japan) + @"SLUS-00388" : @4, // NBA Jam Extreme (USA) + @"SLES-00068" : @4, // NBA Jam - Tournament Edition (Europe) + @"SLPS-00199" : @4, // NBA Jam - Tournament Edition (Japan) + @"SLUS-00002" : @4, // NBA Jam - Tournament Edition (USA) + @"SLES-02336" : @4, // NBA Showtime - NBA on NBC (Europe) + @"SLUS-00948" : @4, // NBA Showtime - NBA on NBC (USA) + @"SLES-02689" : @4, // Need for Speed - Porsche 2000 (Europe) (En,De,Sv) + @"SLES-02700" : @4, // Need for Speed - Porsche 2000 (Europe) (Fr,Es,It) + @"SLUS-01104" : @4, // Need for Speed - Porsche Unleashed (USA) + @"SLES-01907" : @4, // V-Rally - Championship Edition 2 (Europe) (En,Fr,De) + @"SLPS-02516" : @4, // V-Rally - Championship Edition 2 (Japan) + @"SLUS-01003" : @4, // Need for Speed - V-Rally 2 (USA) + @"SLES-02335" : @4, // NFL Blitz 2000 (Europe) + @"SLUS-00861" : @4, // NFL Blitz 2000 (USA) + @"SLUS-01146" : @4, // NFL Blitz 2001 (USA) + @"SLUS-00327" : @4, // NHL Open Ice - 2 on 2 Challenge (USA) + @"SLES-00113" : @4, // Olympic Soccer (Europe) (En,Fr,De,Es,It) + @"SLPS-00523" : @4, // Olympic Soccer (Japan) + @"SLUS-00156" : @4, // Olympic Soccer (USA) + @"SLPS-03056" : @4, // Oshigoto-shiki Jinsei Game - Mezase Shokugyou King (Japan) + @"SLPS-00899" : @4, // Panzer Bandit (Japan) + @"SLPM-86016" : @4, // Paro Wars (Japan) + @"SLUS-01130" : @4, // Peter Jacobsen's Golden Tee Golf (USA) + @"SLES-00201" : @4, // Pitball (Europe) (En,Fr,De,Es,It) + @"SLPS-00607" : @4, // Pitball (Japan) + @"SLUS-00146" : @4, // Pitball (USA) + @"SLUS-01033" : @4, // Polaris SnoCross (USA) + @"SLES-02020" : @4, // Pong (Europe) (En,Fr,De,Es,It,Nl) + @"SLUS-00889" : @4, // Pong - The Next Level (USA) + @"SLES-02808" : @4, // Beach Volleyball (Europe) (En,Fr,De,Es,It) + @"SLUS-01196" : @4, // Power Spike - Pro Beach Volleyball (USA) + @"SLES-00785" : @4, // Poy Poy (Europe) + @"SLPM-86034" : @4, // Poitters' Point (Japan) + @"SLUS-00486" : @4, // Poy Poy (USA) + @"SLES-01536" : @4, // Poy Poy 2 (Europe) + @"SLPM-86061" : @4, // Poitters' Point 2 - Sodom no Inbou + @"SLES-01544" : @4, // Premier Manager Ninety Nine (Europe) + @"SLES-01864" : @4, // Premier Manager Novanta Nove (Italy) + @"SLES-02292" : @4, // Premier Manager 2000 (Europe) + @"SLES-02293" : @4, // Canal+ Premier Manager (Europe) (Fr,Es,It) + @"SLES-02563" : @4, // Anstoss - Premier Manager (Germany) + @"SLES-00738" : @4, // Premier Manager 98 (Europe) + @"SLES-01284" : @4, // Premier Manager 98 (Italy) + @"SLES-03795" : @4, // Pro Evolution Soccer (Europe) (En,Fr,De) + @"SLES-03796" : @4, // Pro Evolution Soccer (Europe) (Es,It) + @"SLES-03946" : @4, // Pro Evolution Soccer 2 (Europe) (En,Fr,De) + @"SLES-03957" : @4, // Pro Evolution Soccer 2 (Europe) (Es,It) + @"SLPM-87056" : @4, // World Soccer Winning Eleven 2002 (Japan) + @"SLPM-86868" : @4, // Simple 1500 Series Vol. 69 - The Putter Golf (Japan) + @"SLUS-01371" : @4, // Putter Golf (USA) + @"SLPS-03114" : @4, // Puyo Puyo Box (Japan) + @"SLUS-00757" : @4, // Quake II (USA) + @"SLPS-02909" : @4, // Simple 1500 Series Vol. 34 - The Quiz Bangumi (Japan) + @"SLPS-03384" : @4, // Nice Price Series Vol. 06 - Quiz de Battle (Japan) + @"SLES-03511" : @4, // Rageball (Europe) + @"SLUS-01461" : @4, // Rageball (USA) + @"SLPM-86272" : @4, // Rakugaki Showtime + @"SCES-00408" : @4, // Rally Cross (Europe) + @"SIPS-60022" : @4, // Rally Cross (Japan) + @"SCUS-94308" : @4, // Rally Cross (USA) + @"SLES-01103" : @4, // Rat Attack (Europe) (En,Fr,De,Es,It,Nl) + @"SLUS-00656" : @4, // Rat Attack! (USA) + @"SLES-00707" : @4, // Risk (Europe) (En,Fr,De,Es) + @"SLUS-00616" : @4, // Risk - The Game of Global Domination (USA) + @"SLES-02552" : @4, // Road Rash - Jailbreak (Europe) (En,Fr,De) + @"SLUS-01053" : @4, // Road Rash - Jailbreak (USA) + @"SCES-01630" : @4, // Running Wild (Europe) + @"SCUS-94272" : @4, // Running Wild (USA) + @"SLES-00217" : @4, // Sampras Extreme Tennis (Europe) (En,Fr,De,Es,It) + @"SLPS-00594" : @4, // Sampras Extreme Tennis (Japan) + @"SLES-01286" : @4, // S.C.A.R.S. (Europe) (En,Fr,De,Es,It) + @"SLUS-00692" : @4, // S.C.A.R.S. (USA) + @"SLES-03642" : @4, // Scrabble (Europe) (En,De,Es) + @"SLUS-00903" : @4, // Scrabble (USA) + @"SLPS-02912" : @4, // SD Gundam - G Generation-F (Japan) (Disc 1) + @"SLPS-02913" : @4, // SD Gundam - G Generation-F (Japan) (Disc 2) + @"SLPS-02914" : @4, // SD Gundam - G Generation-F (Japan) (Disc 3) + @"SLPS-02915" : @4, // SD Gundam - G Generation-F (Japan) (Premium Disc) + @"SLPS-03195" : @4, // SD Gundam - G Generation-F.I.F (Japan) + @"SLPS-00785" : @4, // SD Gundam - GCentury (Japan) (v1.0) / (v1.1) + @"SLPS-01560" : @4, // SD Gundam - GGeneration (Japan) (v1.0) / (v1.1) + @"SLPS-01561" : @4, // SD Gundam - GGeneration (Premium Disc) (Japan) + @"SLPS-02200" : @4, // SD Gundam - GGeneration-0 (Japan) (Disc 1) (v1.0) + @"SLPS-02201" : @4, // SD Gundam - GGeneration-0 (Japan) (Disc 2) (v1.0) + @"SLES-03776" : @4, // Sky Sports Football Quiz (Europe) + @"SLES-03856" : @4, // Sky Sports Football Quiz - Season 02 (Europe) + @"SLES-00076" : @4, // Slam 'n Jam '96 featuring Magic & Kareem (Europe) + @"SLPS-00426" : @4, // Magic Johnson to Kareem Abdul-Jabbar no Slam 'n Jam '96 (Japan) + @"SLUS-00022" : @4, // Slam 'n Jam '96 featuring Magic & Kareem (USA) + @"SLES-02194" : @4, // Sled Storm (Europe) (En,Fr,De,Es) + @"SLUS-00955" : @4, // Sled Storm (USA) + @"SLES-01972" : @4, // South Park - Chef's Luv Shack (Europe) + @"SLUS-00997" : @4, // South Park - Chef's Luv Shack (USA) + @"SCES-01763" : @4, // Speed Freaks (Europe) + @"SCUS-94563" : @4, // Speed Punks (USA) + @"SLES-00023" : @4, // Striker 96 (Europe) (v1.0) + @"SLPS-00127" : @4, // Striker - World Cup Premiere Stage (Japan) + @"SLUS-00210" : @4, // Striker 96 (USA) + @"SLES-01733" : @4, // UEFA Striker (Europe) (En,Fr,De,Es,It,Nl) + @"SLUS-01078" : @4, // Striker Pro 2000 (USA) + @"SLPS-01264" : @4, // Suchie-Pai Adventure - Doki Doki Nightmare (Japan) (Disc 1) + @"SLPS-01265" : @4, // Suchie-Pai Adventure - Doki Doki Nightmare (Japan) (Disc 2) + @"SLES-00213" : @4, // Syndicate Wars (Europe) (En,Fr,Es,It,Sv) + @"SLES-00212" : @4, // Syndicate Wars (Germany) + @"SLUS-00262" : @4, // Syndicate Wars (USA) + @"SLPS-03050" : @4, // Tales of Eternia (Japan) (Disc 1) + @"SLPS-03051" : @4, // Tales of Eternia (Japan) (Disc 2) + @"SLPS-03052" : @4, // Tales of Eternia (Japan) (Disc 3) + @"SLUS-01355" : @4, // Tales of Destiny II (USA) (Disc 1) + @"SLUS-01367" : @4, // Tales of Destiny II (USA) (Disc 2) + @"SLUS-01368" : @4, // Tales of Destiny II (USA) (Disc 3) + @"SCES-01923" : @4, // Team Buddies (Europe) (En,Fr,De) + @"SLUS-00869" : @4, // Team Buddies (USA) + @"SLPS-00321" : @4, // Tetris X (Japan) + @"SLES-01675" : @4, // Tiger Woods 99 USA Tour Golf (Australia) + @"SLES-01674" : @4, // Tiger Woods 99 PGA Tour Golf (Europe) (En,Fr,De,Es,Sv) + @"SLPS-02012" : @4, // Tiger Woods 99 PGA Tour Golf (Japan) + @"SLUS-00785" : @4, // Tiger Woods 99 PGA Tour Golf (USA) (v1.0) / (v1.1) + @"SLES-03148" : @4, // Tiger Woods PGA Tour Golf (Europe) + @"SLUS-01273" : @4, // Tiger Woods PGA Tour Golf (USA) + @"SLES-02595" : @4, // Tiger Woods USA Tour 2000 (Australia) + @"SLES-02551" : @4, // Tiger Woods PGA Tour 2000 (Europe) (En,Fr,De,Es,Sv) + @"SLUS-01054" : @4, // Tiger Woods PGA Tour 2000 (USA) + @"SLPS-01113" : @4, // Toshinden Card Quest (Japan) + @"SLES-00256" : @4, // Trash It (Europe) (En,Fr,De,Es,It) + @"SCUS-94249" : @4, // Twisted Metal III (USA) (v1.0) / (v1.1) + @"SCUS-94560" : @4, // Twisted Metal 4 (USA) + @"SLES-02806" : @4, // UEFA Challenge (Europe) (En,Fr,De,Nl) + @"SLES-02807" : @4, // UEFA Challenge (Europe) (Fr,Es,It,Pt) + @"SLES-01622" : @4, // UEFA Champions League - Season 1998-99 (Europe) + @"SLES-01745" : @4, // UEFA Champions League - Saison 1998-99 (Germany) + @"SLES-01746" : @4, // UEFA Champions League - Stagione 1998-99 (Italy) + @"SLES-02918" : @4, // Vegas Casino (Europe) + @"SLPS-00467" : @4, // Super Casino Special (Japan) + @"SLES-00761" : @4, // Viva Football (Europe) (En,Fr,De,Es,It,Pt) + @"SLES-01341" : @4, // Absolute Football (France) (En,Fr,De,Es,It,Pt) + @"SLUS-00953" : @4, // Viva Soccer (USA) (En,Fr,De,Es,It,Pt) + @"SLES-02193" : @4, // WCW Mayhem (Europe) + @"SLUS-00963" : @4, // WCW Mayhem (USA) + @"SLES-03806" : @4, // Westlife - Fan-O-Mania (Europe) + @"SLES-03779" : @4, // Westlife - Fan-O-Mania (Europe) (Fr,De) + @"SLES-00717" : @4, // World League Soccer '98 (Europe) (En,Es,It) + @"SLES-01166" : @4, // World League Soccer '98 (France) + @"SLES-01167" : @4, // World League Soccer '98 (Germany) + @"SLPS-01389" : @4, // World League Soccer (Japan) + @"SLES-02170" : @4, // Wu-Tang - Taste the Pain (Europe) + @"SLES-02171" : @4, // Wu-Tang - Shaolin Style (France) + @"SLES-02172" : @4, // Wu-Tang - Shaolin Style (Germany) + @"SLUS-00929" : @4, // Wu-Tang - Shaolin Style (USA) + @"SLES-01980" : @4, // WWF Attitude (Europe) + @"SLES-02255" : @4, // WWF Attitude (Germany) + @"SLUS-00831" : @4, // WWF Attitude (USA) + @"SLES-00286" : @4, // WWF In Your House (Europe) + @"SLPS-00695" : @4, // WWF In Your House (Japan) + @"SLUS-00246" : @4, // WWF In Your House (USA) (v1.0) / (v1.1) + @"SLES-02619" : @4, // WWF SmackDown! (Europe) + @"SLPS-02885" : @4, // Exciting Pro Wres (Japan) + @"SLUS-00927" : @4, // WWF SmackDown! (USA) + @"SLES-03251" : @4, // WWF SmackDown! 2 - Know Your Role (Europe) + @"SLPS-03122" : @4, // Exciting Pro Wres 2 (Japan) + @"SLUS-01234" : @4, // WWF SmackDown! 2 - Know Your Role (USA) + @"SLES-00804" : @4, // WWF War Zone (Europe) + @"SLUS-00495" : @4, // WWF War Zone (USA) (v1.0) / (v1.1) + @"SLES-01893" : @5, // Bomberman (Europe) + @"SLPS-01717" : @5, // Bomberman (Japan) + @"SLUS-01189" : @5, // Bomberman - Party Edition (USA) + @"SCES-01078" : @5, // Bomberman World (Europe) (En,Fr,De,Es,It) + @"SLPS-01155" : @5, // Bomberman World (Japan) + @"SLUS-00680" : @5, // Bomberman World (USA) + @"SCES-01312" : @5, // Devil Dice (Europe) (En,Fr,De,Es,It) + @"SCPS-10051" : @5, // XI [sai] (Japan) (En,Ja) + @"SLUS-00672" : @5, // Devil Dice (USA) + @"SLPS-02943" : @5, // DX Monopoly (Japan) + @"SLES-00865" : @5, // Overboard! (Europe) + @"SLUS-00558" : @5, // Shipwreckers! (USA) + @"SLES-01376" : @6, // Brunswick Circuit Pro Bowling (Europe) + @"SLUS-00571" : @6, // Brunswick Circuit Pro Bowling (USA) + @"SLUS-00769" : @6, // Game of Life, The (USA) + @"SLES-03362" : @6, // NBA Hoopz (Europe) (En,Fr,De) + @"SLUS-01331" : @6, // NBA Hoopz (USA) + @"SLES-00284" : @6, // Space Jam (Europe) + @"SLPS-00697" : @6, // Space Jam (Japan) + @"SLUS-00243" : @6, // Space Jam (USA) + @"SLES-00534" : @6, // Ten Pin Alley (Europe) + @"SLUS-00377" : @6, // Ten Pin Alley (USA) + @"SLPS-01243" : @6, // Tenant Wars (Japan) + @"SLPM-86240" : @6, // SuperLite 1500 Series - Tenant Wars Alpha - SuperLite 1500 Version (Japan) + @"SLUS-01333" : @6, // Board Game - Top Shop (USA) + @"SLES-03830" : @8, // 2002 FIFA World Cup Korea Japan (Europe) (En,Sv) + @"SLES-03831" : @8, // Coupe du Monde FIFA 2002 (France) + @"SLES-03832" : @8, // 2002 FIFA World Cup Korea Japan (Germany) + @"SLES-03833" : @8, // 2002 FIFA World Cup Korea Japan (Italy) + @"SLES-03834" : @8, // 2002 FIFA World Cup Korea Japan (Spain) + @"SLUS-01449" : @8, // 2002 FIFA World Cup (USA) (En,Es) + @"SLES-01210" : @8, // Actua Soccer 3 (Europe) + @"SLES-01644" : @8, // Actua Soccer 3 (France) + @"SLES-01645" : @8, // Actua Soccer 3 (Germany) + @"SLES-01646" : @8, // Actua Soccer 3 (Italy) + @"SLPM-86044" : @8, // Break Point (Japan) + @"SCUS-94156" : @8, // Cardinal Syn (USA) + @"SLES-02948" : @8, // Chris Kamara's Street Soccer (Europe) + @"SLES-00080" : @8, // Supersonic Racers (Europe) (En,Fr,De,Es,It) + @"SLPS-01025" : @8, // Dare Devil Derby 3D (Japan) + @"SLUS-00300" : @8, // Dare Devil Derby 3D (USA) + @"SLES-00116" : @8, // FIFA Soccer 96 (Europe) (En,Fr,De,Es,It,Sv) + @"SLUS-00038" : @8, // FIFA Soccer 96 (USA) + @"SLES-00504" : @8, // FIFA 97 (Europe) (En,Fr,De,Es,It,Sv) + @"SLES-00505" : @8, // FIFA 97 (France) (En,Fr,De,Es,It,Sv) + @"SLES-00506" : @8, // FIFA 97 (Germany) (En,Fr,De,Es,It,Sv) + @"SLPS-00878" : @8, // FIFA Soccer 97 (Japan) + @"SLUS-00269" : @8, // FIFA Soccer 97 (USA) + @"SLES-00914" : @8, // FIFA - Road to World Cup 98 (Europe) (En,Fr,De,Es,Nl,Sv) + @"SLES-00915" : @8, // FIFA - En Route pour la Coupe du Monde 98 (France) (En,Fr,De,Es,Nl,Sv) + @"SLES-00916" : @8, // FIFA - Die WM-Qualifikation 98 (Germany) (En,Fr,De,Es,Nl,Sv) + @"SLES-00917" : @8, // FIFA - Road to World Cup 98 (Italy) + @"SLPS-01383" : @8, // FIFA - Road to World Cup 98 (Japan) + @"SLES-00918" : @8, // FIFA - Rumbo al Mundial 98 (Spain) (En,Fr,De,Es,Nl,Sv) + @"SLUS-00520" : @8, // FIFA - Road to World Cup 98 (USA) (En,Fr,De,Es,Nl,Sv) + @"SLES-01584" : @8, // FIFA 99 (Europe) (En,Fr,De,Es,Nl,Sv) + @"SLES-01585" : @8, // FIFA 99 (France) (En,Fr,De,Es,Nl,Sv) + @"SLES-01586" : @8, // FIFA 99 (Germany) (En,Fr,De,Es,Nl,Sv) + @"SLES-01587" : @8, // FIFA 99 (Italy) + @"SLPS-02309" : @8, // FIFA 99 - Europe League Soccer (Japan) + @"SLES-01588" : @8, // FIFA 99 (Spain) (En,Fr,De,Es,Nl,Sv) + @"SLUS-00782" : @8, // FIFA 99 (USA) + @"SLES-02315" : @8, // FIFA 2000 (Europe) (En,De,Es,Nl,Sv) (v1.0) / (v1.1) + @"SLES-02316" : @8, // FIFA 2000 (France) + @"SLES-02317" : @8, // FIFA 2000 (Germany) (En,De,Es,Nl,Sv) + @"SLES-02320" : @8, // FIFA 2000 (Greece) + @"SLES-02319" : @8, // FIFA 2000 (Italy) + @"SLPS-02675" : @8, // FIFA 2000 - Europe League Soccer (Japan) + @"SLES-02318" : @8, // FIFA 2000 (Spain) (En,De,Es,Nl,Sv) + @"SLUS-00994" : @8, // FIFA 2000 - Major League Soccer (USA) (En,De,Es,Nl,Sv) + @"SLES-03140" : @8, // FIFA 2001 (Europe) (En,De,Es,Nl,Sv) + @"SLES-03141" : @8, // FIFA 2001 (France) + @"SLES-03142" : @8, // FIFA 2001 (Germany) (En,De,Es,Nl,Sv) + @"SLES-03143" : @8, // FIFA 2001 (Greece) + @"SLES-03145" : @8, // FIFA 2001 (Italy) + @"SLES-03146" : @8, // FIFA 2001 (Spain) (En,De,Es,Nl,Sv) + @"SLUS-01262" : @8, // FIFA 2001 (USA) + @"SLES-03666" : @8, // FIFA Football 2002 (Europe) (En,De,Es,Nl,Sv) + @"SLES-03668" : @8, // FIFA Football 2002 (France) + @"SLES-03669" : @8, // FIFA Football 2002 (Germany) (En,De,Es,Nl,Sv) + @"SLES-03671" : @8, // FIFA Football 2002 (Italy) + @"SLES-03672" : @8, // FIFA Football 2002 (Spain) (En,De,Es,Nl,Sv) + @"SLUS-01408" : @8, // FIFA Soccer 2002 (USA) (En,Es) + @"SLES-03977" : @8, // FIFA Football 2003 (Europe) (En,Nl,Sv) + @"SLES-03978" : @8, // FIFA Football 2003 (France) + @"SLES-03979" : @8, // FIFA Football 2003 (Germany) + @"SLES-03980" : @8, // FIFA Football 2003 (Italy) + @"SLES-03981" : @8, // FIFA Football 2003 (Spain) + @"SLUS-01504" : @8, // FIFA Soccer 2003 (USA) + @"SLES-04115" : @8, // FIFA Football 2004 (Europe) (En,Nl,Sv) + @"SLES-04116" : @8, // FIFA Football 2004 (France) + @"SLES-04117" : @8, // FIFA Football 2004 (Germany) + @"SLES-04119" : @8, // FIFA Football 2004 (Italy) + @"SLES-04118" : @8, // FIFA Football 2004 (Spain) + @"SLUS-01578" : @8, // FIFA Soccer 2004 (USA) (En,Es) + @"SLES-04165" : @8, // FIFA Football 2005 (Europe) (En,Nl) + @"SLES-04166" : @8, // FIFA Football 2005 (France) + @"SLES-04168" : @8, // FIFA Football 2005 (Germany) + @"SLES-04167" : @8, // FIFA Football 2005 (Italy) + @"SLES-04169" : @8, // FIFA Football 2005 (Spain) + @"SLUS-01585" : @8, // FIFA Soccer 2005 (USA) (En,Es) + @"SLUS-01129" : @8, // FoxKids.com - Micro Maniacs Racing (USA) + @"SLES-03084" : @8, // Inspector Gadget - Gadget's Crazy Maze (Europe) (En,Fr,De,Es,It,Nl) + @"SLUS-01267" : @8, // Inspector Gadget - Gadget's Crazy Maze (USA) (En,Fr,De,Es,It,Nl) + @"SLUS-00500" : @8, // Jimmy Johnson's VR Football '98 (USA) + @"SLES-00436" : @8, // Madden NFL 97 (Europe) + @"SLUS-00018" : @8, // Madden NFL 97 (USA) + @"SLES-00904" : @8, // Madden NFL 98 (Europe) + @"SLUS-00516" : @8, // Madden NFL 98 (USA) / (Alt) + @"SLES-01427" : @8, // Madden NFL 99 (Europe) + @"SLUS-00729" : @8, // Madden NFL 99 (USA) + @"SLES-02192" : @8, // Madden NFL 2000 (Europe) + @"SLUS-00961" : @8, // Madden NFL 2000 (USA) + @"SLES-03067" : @8, // Madden NFL 2001 (Europe) + @"SLUS-01241" : @8, // Madden NFL 2001 (USA) + @"SLUS-01402" : @8, // Madden NFL 2002 (USA) + @"SLUS-01482" : @8, // Madden NFL 2003 (USA) + @"SLUS-01570" : @8, // Madden NFL 2004 (USA) + @"SLUS-01584" : @8, // Madden NFL 2005 (USA) + @"SLUS-00526" : @8, // March Madness '98 (USA) + @"SLUS-00559" : @8, // Micro Machines V3 (USA) + @"SLUS-00507" : @8, // Monopoly (USA) + @"SLUS-01178" : @8, // Monster Rancher Battle Card - Episode II (USA) + @"SLES-02299" : @8, // NBA Basketball 2000 (Europe) (En,Fr,De,Es,It) + @"SLUS-00926" : @8, // NBA Basketball 2000 (USA) + @"SLES-01003" : @8, // NBA Fastbreak '98 (Europe) + @"SLUS-00492" : @8, // NBA Fastbreak '98 (USA) + @"SLES-00171" : @8, // NBA in the Zone (Europe) + @"SLPS-00188" : @8, // NBA Power Dunkers (Japan) + @"SLUS-00048" : @8, // NBA in the Zone (USA) + @"SLES-00560" : @8, // NBA in the Zone 2 (Europe) + @"SLPM-86011" : @8, // NBA Power Dunkers 2 (Japan) + @"SLUS-00294" : @8, // NBA in the Zone 2 (USA) + @"SLES-00882" : @8, // NBA Pro 98 (Europe) + @"SLPM-86060" : @8, // NBA Power Dunkers 3 (Japan) + @"SLUS-00445" : @8, // NBA in the Zone '98 (USA) (v1.0) / (v1.1) + @"SLES-01970" : @8, // NBA Pro 99 (Europe) + @"SLPM-86176" : @8, // NBA Power Dunkers 4 (Japan) + @"SLUS-00791" : @8, // NBA in the Zone '99 (USA) + @"SLES-02513" : @8, // NBA in the Zone 2000 (Europe) + @"SLPM-86397" : @8, // NBA Power Dunkers 5 (Japan) + @"SLUS-01028" : @8, // NBA in the Zone 2000 (USA) + @"SLES-00225" : @8, // NBA Live 96 (Europe) + @"SLPS-00389" : @8, // NBA Live 96 (Japan) + @"SLUS-00060" : @8, // NBA Live 96 (USA) + @"SLES-00517" : @8, // NBA Live 97 (Europe) (En,Fr,De) + @"SLPS-00736" : @8, // NBA Live 97 (Japan) + @"SLUS-00267" : @8, // NBA Live 97 (USA) + @"SLES-00906" : @8, // NBA Live 98 (Europe) (En,Es,It) + @"SLES-00952" : @8, // NBA Live 98 (Germany) + @"SLPS-01296" : @8, // NBA Live 98 (Japan) + @"SLUS-00523" : @8, // NBA Live 98 (USA) + @"SLES-01446" : @8, // NBA Live 99 (Europe) + @"SLES-01455" : @8, // NBA Live 99 (Germany) + @"SLES-01456" : @8, // NBA Live 99 (Italy) + @"SLPS-02033" : @8, // NBA Live 99 (Japan) + @"SLES-01457" : @8, // NBA Live 99 (Spain) + @"SLUS-00736" : @8, // NBA Live 99 (USA) + @"SLES-02358" : @8, // NBA Live 2000 (Europe) + @"SLES-02360" : @8, // NBA Live 2000 (Germany) + @"SLES-02361" : @8, // NBA Live 2000 (Italy) + @"SLPS-02603" : @8, // NBA Live 2000 (Japan) + @"SLES-02362" : @8, // NBA Live 2000 (Spain) + @"SLUS-00998" : @8, // NBA Live 2000 (USA) + @"SLES-03128" : @8, // NBA Live 2001 (Europe) + @"SLES-03129" : @8, // NBA Live 2001 (France) + @"SLES-03130" : @8, // NBA Live 2001 (Germany) + @"SLES-03131" : @8, // NBA Live 2001 (Italy) + @"SLES-03132" : @8, // NBA Live 2001 (Spain) + @"SLUS-01271" : @8, // NBA Live 2001 (USA) + @"SLES-03718" : @8, // NBA Live 2002 (Europe) + @"SLES-03719" : @8, // NBA Live 2002 (France) + @"SLES-03720" : @8, // NBA Live 2002 (Germany) + @"SLES-03721" : @8, // NBA Live 2002 (Italy) + @"SLES-03722" : @8, // NBA Live 2002 (Spain) + @"SLUS-01416" : @8, // NBA Live 2002 (USA) + @"SLES-03982" : @8, // NBA Live 2003 (Europe) + @"SLES-03969" : @8, // NBA Live 2003 (France) + @"SLES-03968" : @8, // NBA Live 2003 (Germany) + @"SLES-03970" : @8, // NBA Live 2003 (Italy) + @"SLES-03971" : @8, // NBA Live 2003 (Spain) + @"SLUS-01483" : @8, // NBA Live 2003 (USA) + @"SCES-00067" : @8, // Total NBA '96 (Europe) + @"SIPS-60008" : @8, // Total NBA '96 (Japan) + @"SCUS-94500" : @8, // NBA Shoot Out (USA) + @"SCES-00623" : @8, // Total NBA '97 (Europe) + @"SIPS-60015" : @8, // Total NBA '97 (Japan) + @"SCUS-94552" : @8, // NBA Shoot Out '97 (USA) + @"SCES-01079" : @8, // Total NBA 98 (Europe) + @"SCUS-94171" : @8, // NBA ShootOut 98 (USA) + @"SCUS-94561" : @8, // NBA ShootOut 2000 (USA) + @"SCUS-94581" : @8, // NBA ShootOut 2001 (USA) + @"SCUS-94641" : @8, // NBA ShootOut 2002 (USA) + @"SCUS-94673" : @8, // NBA ShootOut 2003 (USA) + @"SCUS-94691" : @8, // NBA ShootOut 2004 (USA) + @"SLUS-00142" : @8, // NCAA Basketball Final Four 97 (USA) + @"SCUS-94264" : @8, // NCAA Final Four 99 (USA) + @"SCUS-94562" : @8, // NCAA Final Four 2000 (USA) + @"SCUS-94579" : @8, // NCAA Final Four 2001 (USA) + @"SLUS-00514" : @8, // NCAA Football 98 (USA) + @"SLUS-00688" : @8, // NCAA Football 99 (USA) + @"SLUS-00932" : @8, // NCAA Football 2000 (USA) (v1.0) / (v1.1) + @"SLUS-01219" : @8, // NCAA Football 2001 (USA) + @"SCUS-94509" : @8, // NCAA Football GameBreaker (USA) + @"SCUS-94172" : @8, // NCAA GameBreaker 98 (USA) + @"SCUS-94246" : @8, // NCAA GameBreaker 99 (USA) + @"SCUS-94557" : @8, // NCAA GameBreaker 2000 (USA) + @"SCUS-94573" : @8, // NCAA GameBreaker 2001 (USA) + @"SLUS-00805" : @8, // NCAA March Madness 99 (USA) + @"SLUS-01023" : @8, // NCAA March Madness 2000 (USA) + @"SLUS-01320" : @8, // NCAA March Madness 2001 (USA) + @"SCES-00219" : @8, // NFL GameDay (Europe) + @"SCUS-94505" : @8, // NFL GameDay (USA) + @"SCUS-94510" : @8, // NFL GameDay 97 (USA) + @"SCUS-94173" : @8, // NFL GameDay 98 (USA) + @"SCUS-94234" : @8, // NFL GameDay 99 (USA) (v1.0) / (v1.1) + @"SCUS-94556" : @8, // NFL GameDay 2000 (USA) + @"SCUS-94575" : @8, // NFL GameDay 2001 (USA) + @"SCUS-94639" : @8, // NFL GameDay 2002 (USA) + @"SCUS-94665" : @8, // NFL GameDay 2003 (USA) + @"SCUS-94690" : @8, // NFL GameDay 2004 (USA) + @"SCUS-94695" : @8, // NFL GameDay 2005 (USA) + @"SLES-00449" : @8, // NFL Quarterback Club 97 (Europe) + @"SLUS-00011" : @8, // NFL Quarterback Club 97 (USA) + @"SCUS-94420" : @8, // NFL Xtreme 2 (USA) + @"SLES-00492" : @8, // NHL 97 (Europe) + @"SLES-00533" : @8, // NHL 97 (Germany) + @"SLPS-00861" : @8, // NHL 97 (Japan) + @"SLUS-00030" : @8, // NHL 97 (USA) + @"SLES-00907" : @8, // NHL 98 (Europe) (En,Sv,Fi) + @"SLES-00512" : @8, // NHL 98 (Germany) + @"SLUS-00519" : @8, // NHL 98 (USA) + @"SLES-01445" : @8, // NHL 99 (Europe) (En,Fr,Sv,Fi) + @"SLES-01458" : @8, // NHL 99 (Germany) + @"SLUS-00735" : @8, // NHL 99 (USA) + @"SLES-02225" : @8, // NHL 2000 (Europe) (En,Sv,Fi) + @"SLES-02227" : @8, // NHL 2000 (Germany) + @"SLUS-00965" : @8, // NHL 2000 (USA) + @"SLES-03139" : @8, // NHL 2001 (Europe) (En,Sv,Fi) + @"SLES-03154" : @8, // NHL 2001 (Germany) + @"SLUS-01264" : @8, // NHL 2001 (USA) + @"SLES-02514" : @8, // NHL Blades of Steel 2000 (Europe) + @"SLPM-86193" : @8, // NHL Blades of Steel 2000 (Japan) + @"SLUS-00825" : @8, // NHL Blades of Steel 2000 (USA) + @"SLES-00624" : @8, // NHL Breakaway 98 (Europe) + @"SLUS-00391" : @8, // NHL Breakaway 98 (USA) + @"SLES-02298" : @8, // NHL Championship 2000 (Europe) (En,Fr,De,Sv) + @"SLUS-00925" : @8, // NHL Championship 2000 (USA) + @"SCES-00392" : @8, // NHL Face Off '97 (Europe) + @"SIPS-60018" : @8, // NHL PowerRink '97 (Japan) + @"SCUS-94550" : @8, // NHL Face Off '97 (USA) + @"SCES-01022" : @8, // NHL FaceOff 98 (Europe) + @"SCUS-94174" : @8, // NHL FaceOff 98 (USA) + @"SCES-01736" : @8, // NHL FaceOff 99 (Europe) + @"SCUS-94235" : @8, // NHL FaceOff 99 (USA) + @"SCES-02451" : @8, // NHL FaceOff 2000 (Europe) + @"SCUS-94558" : @8, // NHL FaceOff 2000 (USA) + @"SCUS-94577" : @8, // NHL FaceOff 2001 (USA) + @"SLES-00418" : @8, // NHL Powerplay 98 (Europe) (En,Fr,De) + @"SLUS-00528" : @8, // NHL Powerplay 98 (USA) (En,Fr,De) + @"SLES-00110" : @8, // Olympic Games (Europe) (En,Fr,De,Es,It) + @"SLPS-00465" : @8, // Atlanta Olympics '96 + @"SLUS-00148" : @8, // Olympic Summer Games (USA) + @"SLES-01559" : @8, // Pro 18 - World Tour Golf (Europe) (En,Fr,De,Es,It,Sv) + @"SLUS-00817" : @8, // Pro 18 - World Tour Golf (USA) + @"SLES-00472" : @8, // Riot (Europe) + @"SCUS-94551" : @8, // Professional Underground League of Pain (USA) + @"SLES-01203" : @8, // Puma Street Soccer (Europe) (En,Fr,De,It) + @"SLES-01436" : @8, // Rival Schools - United by Fate (Europe) (Disc 1) (Evolution Disc) + @"SLES-11436" : @8, // Rival Schools - United by Fate (Europe) (Disc 2) (Arcade Disc) + @"SLPS-01240" : @8, // Shiritsu Justice Gakuen - Legion of Heroes (Japan) (Disc 1) (Evolution Disc) + @"SLPS-01241" : @8, // Shiritsu Justice Gakuen - Legion of Heroes (Japan) (Disc 2) (Arcade Disc) + @"SLPS-02120" : @8, // Shiritsu Justice Gakuen - Nekketsu Seishun Nikki 2 (Japan) + @"SLES-01658" : @8, // Shaolin (Europe) + @"SLPS-02168" : @8, // Lord of Fist (Japan) + @"SLES-00296" : @8, // Street Racer (Europe) + @"SLPS-00610" : @8, // Street Racer Extra (Japan) + @"SLUS-00099" : @8, // Street Racer (USA) + @"SLES-02857" : @8, // Sydney 2000 (Europe) + @"SLES-02858" : @8, // Sydney 2000 (France) + @"SLES-02859" : @8, // Sydney 2000 (Germany) + @"SLPM-86626" : @8, // Sydney 2000 (Japan) + @"SLES-02861" : @8, // Sydney 2000 (Spain) + @"SLUS-01177" : @8, // Sydney 2000 (USA) + @"SCES-01700" : @8, // This Is Football (Europe) + @"SCES-01882" : @8, // This Is Football (Europe) (Fr,Nl) + @"SCES-01701" : @8, // Monde des Bleus, Le - Le jeu officiel de l'equipe de France (France) + @"SCES-01702" : @8, // Fussball Live (Germany) + @"SCES-01703" : @8, // This Is Football (Italy) + @"SCES-01704" : @8, // Esto es Futbol (Spain) + @"SCES-03070" : @8, // This Is Football 2 (Europe) + @"SCES-03073" : @8, // Monde des Bleus 2, Le (France) + @"SCES-03074" : @8, // Fussball Live 2 (Germany) + @"SCES-03075" : @8, // This Is Football 2 (Italy) + @"SCES-03072" : @8, // This Is Football 2 (Netherlands) + @"SCES-03076" : @8, // Esto es Futbol 2 (Spain) + @"SLPS-00682" : @8, // Triple Play 97 (Japan) + @"SLUS-00237" : @8, // Triple Play 97 (USA) + @"SLPS-00887" : @8, // Triple Play 98 (Japan) + @"SLUS-00465" : @8, // Triple Play 98 (USA) + @"SLUS-00618" : @8, // Triple Play 99 (USA) (En,Es) + @"SLES-02577" : @8, // UEFA Champions League - Season 1999-2000 (Europe) + @"SLES-02578" : @8, // UEFA Champions League - Season 1999-2000 (France) + @"SLES-02579" : @8, // UEFA Champions League - Season 1999-2000 (Germany) + @"SLES-02580" : @8, // UEFA Champions League - Season 1999-2000 (Italy) + @"SLES-03262" : @8, // UEFA Champions League - Season 2000-2001 (Europe) + @"SLES-03281" : @8, // UEFA Champions League - Season 2000-2001 (Germany) + @"SLES-02704" : @8, // UEFA Euro 2000 (Europe) + @"SLES-02705" : @8, // UEFA Euro 2000 (France) + @"SLES-02706" : @8, // UEFA Euro 2000 (Germany) + @"SLES-02707" : @8, // UEFA Euro 2000 (Italy) + @"SLES-01265" : @8, // World Cup 98 (Europe) (En,Fr,De,Es,Nl,Sv,Da) + @"SLES-01266" : @8, // Coupe du Monde 98 (France) + @"SLES-01267" : @8, // Frankreich 98 - Die Fussball-WM (Germany) (En,Fr,De,Es,Nl,Sv,Da) + @"SLES-01268" : @8, // World Cup 98 - Coppa del Mondo (Italy) + @"SLPS-01719" : @8, // FIFA World Cup 98 - France 98 Soushuuhen (Japan) + @"SLUS-00644" : @8, // World Cup 98 (USA) + }; + + // 5-player games requiring Multitap on port 2 instead of port 1 + NSArray *multiTap5PlayerPort2 = + @[ + @"SLES-01893", // Bomberman (Europe) + @"SLPS-01717", // Bomberman (Japan) + @"SLUS-01189", // Bomberman - Party Edition (USA) + ]; + +#pragma message "forget about multitap for now :)" + // Set multitap configuration if detected +// if (multiTapGames[[current ROMSerial]]) +// { +// current->multiTapPlayerCount = [[multiTapGames objectForKey:[current ROMSerial]] intValue]; +// +// if([multiTap5PlayerPort2 containsObject:[current ROMSerial]]) +// MDFNI_SetSetting("psx.input.pport2.multitap", "1"); // Enable multitap on PSX port 2 +// else +// { +// MDFNI_SetSetting("psx.input.pport1.multitap", "1"); // Enable multitap on PSX port 1 +// if(current->multiTapPlayerCount > 5) +// MDFNI_SetSetting("psx.input.pport2.multitap", "1"); // Enable multitap on PSX port 2 +// } +// } +} + +- (id)init { + if((self = [super init])) + { + _current = self; + + multiTapPlayerCount = 2; + + for(unsigned i = 0; i < 8; i++) { + inputBuffer[i] = (uint32_t *) calloc(9, sizeof(uint32_t)); + } + } + + return self; +} + +- (void)dealloc { + for(unsigned i = 0; i < 8; i++) { + free(inputBuffer[i]); + } + + delete surf; + + if (_current == self) { + _current = nil; + } +} + +# pragma mark - Execution + +static void emulation_run() { + GET_CURRENT_OR_RETURN(); + + static int16_t sound_buf[0x10000]; + int32 rects[game->fb_height]; + rects[0] = ~0; + + EmulateSpecStruct spec = {0}; + spec.surface = surf; + spec.SoundRate = current->sampleRate; + spec.SoundBuf = sound_buf; + spec.LineWidths = rects; + spec.SoundBufMaxSize = sizeof(sound_buf) / 2; + spec.SoundVolume = 1.0; + spec.soundmultiplier = 1.0; + + MDFNI_Emulate(&spec); + + current->mednafenCoreTiming = current->masterClock / spec.MasterCycles; + + // Fix for game stutter. mednafenCoreTiming flutters on init before settling and we only read it + // after the first frame wot set the current->gameInterval in the super class. This work around + // resets the value after a few frames. -Joe M + static int fixCount = 0; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // The looping counter wasn't enough sometimes, just adding a 2 second one time trigger to rsset frame timing + // Need to investigate more why this happens at all but this seems to resolve with no known side effects - jm + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + current->gameInterval = 1.0 / current->mednafenCoreTiming; + }); + }); + + if(fixCount < 10) { + current->gameInterval = 1.0 / current->mednafenCoreTiming; + NSLog(@"%f", current->mednafenCoreTiming); + fixCount++; + } + + if(current->systemType == psx) + { + current->videoWidth = rects[spec.DisplayRect.y]; + current->videoOffsetX = spec.DisplayRect.x; + } + else if(game->multires) + { + current->videoWidth = rects[spec.DisplayRect.y]; + current->videoOffsetX = spec.DisplayRect.x; + } + else + { + current->videoWidth = spec.DisplayRect.w; + current->videoOffsetX = spec.DisplayRect.x; + } + + current->videoHeight = spec.DisplayRect.h; + current->videoOffsetY = spec.DisplayRect.y; + + update_audio_batch(spec.SoundBuf, spec.SoundBufSize); +} + +- (BOOL)loadFileAtPath:(NSString *)path +{ + [[NSFileManager defaultManager] createDirectoryAtPath:[self batterySavesPath] withIntermediateDirectories:YES attributes:nil error:NULL]; + + if([[self systemIdentifier] isEqualToString:@"com.provenance.lynx"]) + { + systemType = lynx; + + mednafenCoreModule = @"lynx"; + mednafenCoreAspect = OEIntSizeMake(80, 51); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 48000; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.ngp"] || [[self systemIdentifier] isEqualToString:@"com.provenance.ngpc"]) + { + systemType = neogeo; + + mednafenCoreModule = @"ngp"; + mednafenCoreAspect = OEIntSizeMake(20, 19); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 44100; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.pce"] || [[self systemIdentifier] isEqualToString:@"com.provenance.pcecd"] || [[self systemIdentifier] isEqualToString:@"com.provenance.sgfx"]) + { + systemType = pce; + + mednafenCoreModule = @"pce"; + mednafenCoreAspect = OEIntSizeMake(256 * (8.0/7.0), 240); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 48000; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.pcfx"]) + { + systemType = pcfx; + + mednafenCoreModule = @"pcfx"; + mednafenCoreAspect = OEIntSizeMake(4, 3); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 48000; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.psx"]) + { + systemType = psx; + + mednafenCoreModule = @"psx"; + // Note: OpenEMU sets this to 4, 3. + mednafenCoreAspect = OEIntSizeMake(3, 2); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 44100; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.vb"]) + { + systemType = vb; + + mednafenCoreModule = @"vb"; + mednafenCoreAspect = OEIntSizeMake(12, 7); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 48000; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.ws"] || [[self systemIdentifier] isEqualToString:@"com.provenance.wsc"]) + { + systemType = wswan; + + mednafenCoreModule = @"wswan"; + mednafenCoreAspect = OEIntSizeMake(14, 9); + //mednafenCoreAspect = OEIntSizeMake(game->nominal_width, game->nominal_height); + sampleRate = 48000; + } + else + { + NSLog(@"MednafenGameCore loadFileAtPath: Incorrect systemIdentifier"); + assert(false); + } + + assert(_current); + mednafen_init(_current); + + game = MDFNI_LoadGame([mednafenCoreModule UTF8String], [path UTF8String]); + + if(!game) { + return NO; + } + + // BGRA pixel format + MDFN_PixelFormat pix_fmt(MDFN_COLORSPACE_RGB, 16, 8, 0, 24); + surf = new MDFN_Surface(NULL, game->fb_width, game->fb_height, game->fb_width, pix_fmt); + + masterClock = game->MasterClock >> 32; + + if (systemType == pce) + { + game->SetInput(0, "gamepad", (uint8_t *)inputBuffer[0]); + game->SetInput(1, "gamepad", (uint8_t *)inputBuffer[1]); + game->SetInput(2, "gamepad", (uint8_t *)inputBuffer[2]); + game->SetInput(3, "gamepad", (uint8_t *)inputBuffer[3]); + game->SetInput(4, "gamepad", (uint8_t *)inputBuffer[4]); + } + else if (systemType == pcfx) + { + game->SetInput(0, "gamepad", (uint8_t *)inputBuffer[0]); + game->SetInput(1, "gamepad", (uint8_t *)inputBuffer[1]); + } + else if (systemType == psx) + { + for(unsigned i = 0; i < multiTapPlayerCount; i++) { + game->SetInput(i, "dualshock", (uint8_t *)inputBuffer[i]); + } + } + else + { + game->SetInput(0, "gamepad", (uint8_t *)inputBuffer[0]); + } + + MDFNI_SetMedia(0, 2, 0, 0); // Disc selection API + + // Parse number of discs in m3u + if([[[path pathExtension] lowercaseString] isEqualToString:@"m3u"]) + { + NSString *m3uString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@".cue|.ccd" options:NSRegularExpressionCaseInsensitive error:nil]; + NSUInteger numberOfMatches = [regex numberOfMatchesInString:m3uString options:0 range:NSMakeRange(0, [m3uString length])]; + + NSLog(@"Loaded m3u containing %lu cue sheets or ccd",numberOfMatches); + + maxDiscs = numberOfMatches; + } + + emulation_run(); + + return YES; +} + +- (void)pollControllers { + unsigned maxValue = 0; + const int*map; + switch (systemType) { + case psx: + maxValue = PVPSXButtonCount; + map = PSXMap; + break; + case neogeo: + maxValue = OENGPButtonCount; + map = NeoMap; + break; + case lynx: + maxValue = OELynxButtonCount; + map = LynxMap; + break; + case pce: + maxValue = OEPCEButtonCount; + map = PCEMap; + break; + case pcfx: + maxValue = OEPCFXButtonCount; + map = PCFXMap; + break; + case vb: + maxValue = OEVBButtonCount; + map = VBMap; + break; + case wswan: + maxValue = OEWSButtonCount; + map = WSMap; + break; + return; + } + + for (NSInteger playerIndex = 0; playerIndex < 2; playerIndex++) { + GCController *controller = nil; + + if (self.controller1 && playerIndex == 0) { + controller = self.controller1; + } + else if (self.controller2 && playerIndex == 1) + { + controller = self.controller2; + } + + if (controller) { + for (unsigned i=0; i 0) { + inputBuffer[playerIndex][0] |= 1 << map[i]; + } else { + inputBuffer[playerIndex][0] &= ~(1 << map[i]); + } + } else { + float analogValue = [self PSXAnalogControllerValueForButtonID:i forController:controller]; + [self didMovePSXJoystickDirection:(PVPSXButton)i + withValue:analogValue + forPlayer:playerIndex]; + } + } + } + } +} + +- (void)executeFrame +{ + // Should we be using controller callbacks instead? + if (self.controller1 || self.controller2) { + [self pollControllers]; + } + + emulation_run(); +} + +- (void)resetEmulation +{ + MDFNI_Reset(); +} + +- (void)stopEmulation +{ + MDFNI_CloseGame(); + MDFNI_Kill(); + [super stopEmulation]; +} + +- (NSTimeInterval)frameInterval +{ + return mednafenCoreTiming ?: 60; +} + +# pragma mark - Video + +- (CGRect)screenRect +{ + return CGRectMake(videoOffsetX, videoOffsetY, videoWidth, videoHeight); +} + +- (CGSize)bufferSize +{ + + return CGSizeMake(game->fb_width, game->fb_height); +} + +- (CGSize)aspectSize +{ + return CGSizeMake(mednafenCoreAspect.width,mednafenCoreAspect.height); +} + +- (const void *)videoBuffer +{ + return surf->pixels; +} + +- (GLenum)pixelFormat +{ + return GL_BGRA; +} + +- (GLenum)pixelType +{ + return GL_UNSIGNED_BYTE; +} + +- (GLenum)internalPixelFormat +{ + return GL_RGBA; +} + +- (BOOL)wideScreen { + switch (systemType) { + case psx: + return YES; + case neogeo: + case lynx: + case pce: + case pcfx: + case vb: + case wswan: + return NO; + } +} + +# pragma mark - Audio + +static size_t update_audio_batch(const int16_t *data, size_t frames) +{ + GET_CURRENT_OR_RETURN(frames); + + [[current ringBufferAtIndex:0] write:data maxLength:frames * [current channelCount] * 2]; + return frames; +} + +- (double)audioSampleRate +{ + return sampleRate ? sampleRate : 48000; +} + +- (NSUInteger)channelCount +{ + return game->soundchan; +} + +# pragma mark - Save States + +- (BOOL)saveStateToFileAtPath:(NSString *)fileName { + return MDFNI_SaveState(fileName.fileSystemRepresentation, "", NULL, NULL, NULL); +} + +- (BOOL)loadStateFromFileAtPath:(NSString *)fileName { + return MDFNI_LoadState(fileName.fileSystemRepresentation, ""); +} + +- (NSData *)serializeStateWithError:(NSError **)outError +{ + MemoryStream stream(65536, false); + MDFNSS_SaveSM(&stream, true); + size_t length = stream.map_size(); + void *bytes = stream.map(); + + if(length) { + return [NSData dataWithBytes:bytes length:length]; + } + + if(outError) { + assert(false); +#pragma message "fix error log" +// *outError = [NSError errorWithDomain:OEGameCoreErrorDomain code:OEGameCoreCouldNotSaveStateError userInfo:@{ +// NSLocalizedDescriptionKey : @"Save state data could not be written", +// NSLocalizedRecoverySuggestionErrorKey : @"The emulator could not write the state data." +// }]; + } + + return nil; +} + +- (BOOL)deserializeState:(NSData *)state withError:(NSError **)outError { + NSError *error; + const void *bytes = [state bytes]; + size_t length = [state length]; + + MemoryStream stream(length, -1); + memcpy(stream.map(), bytes, length); + MDFNSS_LoadSM(&stream, true); + size_t serialSize = stream.map_size(); + + if(serialSize != length) + { + #pragma message "fix error log" +// error = [NSError errorWithDomain:OEGameCoreErrorDomain +// code:OEGameCoreStateHasWrongSizeError +// userInfo:@{ +// NSLocalizedDescriptionKey : @"Save state has wrong file size.", +// NSLocalizedRecoverySuggestionErrorKey : [NSString stringWithFormat:@"The size of the save state does not have the right size, %lu expected, got: %ld.", serialSize, [state length]], +// }]; + } + + if(error) { + if(outError) { + *outError = error; + } + return false; + } else { + return true; + } +} + +# pragma mark - Input + +// Map OE button order to Mednafen button order +const int LynxMap[] = { 6, 7, 4, 5, 0, 1, 3, 2 }; +const int PCEMap[] = { 4, 6, 7, 5, 0, 1, 8, 9, 10, 11, 3, 2, 12 }; +const int PCFXMap[] = { 8, 10, 11, 9, 0, 1, 2, 3, 4, 5, 7, 6 }; +const int PSXMap[] = { 4, 6, 7, 5, 12, 13, 14, 15, 10, 8, 1, 11, 9, 2, 3, 0, 16, 24, 23, 22, 21, 20, 19, 18, 17 }; +const int VBMap[] = { 9, 8, 7, 6, 4, 13, 12, 5, 3, 2, 0, 1, 10, 11 }; +const int WSMap[] = { 0, 2, 3, 1, 4, 6, 7, 5, 9, 10, 8, 11 }; +const int NeoMap[] = { 0, 1, 2, 3, 4, 5, 6}; + +#pragma mark Atari Lynx +- (oneway void)didPushLynxButton:(OELynxButton)button forPlayer:(NSUInteger)player { + inputBuffer[player][0] |= 1 << LynxMap[button]; +} + +- (oneway void)didReleaseLynxButton:(OELynxButton)button forPlayer:(NSUInteger)player { + inputBuffer[player][0] &= ~(1 << LynxMap[button]); +} + +- (NSInteger)LynxControllerValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) { + GCExtendedGamepad *pad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OELynxButtonUp: + return [[dpad up] isPressed]?:[[[pad leftThumbstick] up] isPressed]; + case OELynxButtonDown: + return [[dpad down] isPressed]?:[[[pad leftThumbstick] down] isPressed]; + case OELynxButtonLeft: + return [[dpad left] isPressed]?:[[[pad leftThumbstick] left] isPressed]; + case OELynxButtonRight: + return [[dpad right] isPressed]?:[[[pad leftThumbstick] right] isPressed]; + case OELynxButtonB: + return [[pad buttonB] isPressed]?:[[pad buttonX] isPressed]; + case OELynxButtonA: + return [[pad buttonA] isPressed]?:[[pad buttonY] isPressed]; + case OELynxButtonOption1: + return [[pad leftShoulder] isPressed]?:[[pad leftTrigger] isPressed]; + case OELynxButtonOption2: + return [[pad rightShoulder] isPressed]?:[[pad rightTrigger] isPressed]; + default: + break; + } + } else if ([controller gamepad]) { + GCGamepad *pad = [controller gamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OELynxButtonUp: + return [[dpad up] isPressed]; + case OELynxButtonDown: + return [[dpad down] isPressed]; + case OELynxButtonLeft: + return [[dpad left] isPressed]; + case OELynxButtonRight: + return [[dpad right] isPressed]; + case OELynxButtonB: + return [[pad buttonB] isPressed]?:[[pad buttonX] isPressed]; + case OELynxButtonA: + return [[pad buttonA] isPressed]?:[[pad buttonY] isPressed]; + case OELynxButtonOption1: + return [[pad leftShoulder] isPressed]; + case OELynxButtonOption2: + return [[pad rightShoulder] isPressed]; + default: + break; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) { + GCMicroGamepad *pad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OELynxButtonUp: + return [[dpad up] value] > 0.5; + break; + case OELynxButtonDown: + return [[dpad down] value] > 0.5; + break; + case OELynxButtonLeft: + return [[dpad left] value] > 0.5; + break; + case OELynxButtonRight: + return [[dpad right] value] > 0.5; + break; + case OELynxButtonA: + return [[pad buttonA] isPressed]; + break; + case OELynxButtonB: + return [[pad buttonX] isPressed]; + break; + default: + break; + } + } +#endif + return 0; +} + +#pragma mark Neo Geo +- (oneway void)didPushNGPButton:(OENGPButton)button forPlayer:(NSUInteger)player +{ + inputBuffer[player][0] |= 1 << NeoMap[button]; +} + +- (oneway void)didReleaseNGPButton:(OENGPButton)button forPlayer:(NSUInteger)player +{ + inputBuffer[player][0] &= ~(1 << NeoMap[button]); +} + +#pragma mark PC-* +- (oneway void)didPushPCEButton:(OEPCEButton)button forPlayer:(NSUInteger)player +{ + if (button != OEPCEButtonMode) { // Check for six button mode toggle + inputBuffer[player][0] |= 1 << PCEMap[button]; + } else { + inputBuffer[player][0] ^= 1 << PCEMap[button]; + } +} + +- (oneway void)didReleasePCEButton:(OEPCEButton)button forPlayer:(NSUInteger)player +{ + if (button != OEPCEButtonMode) + inputBuffer[player][0] &= ~(1 << PCEMap[button]); +} + +- (oneway void)didPushPCECDButton:(OEPCECDButton)button forPlayer:(NSUInteger)player +{ + if (button != OEPCECDButtonMode) { // Check for six button mode toggle + inputBuffer[player][0] |= 1 << PCEMap[button]; + } else { + inputBuffer[player][0] ^= 1 << PCEMap[button]; + } +} + +- (oneway void)didReleasePCECDButton:(OEPCECDButton)button forPlayer:(NSUInteger)player; +{ + if (button != OEPCECDButtonMode) { + inputBuffer[player][0] &= ~(1 << PCEMap[button]); + } +} + +- (oneway void)didPushPCFXButton:(OEPCFXButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] |= 1 << PCFXMap[button]; +} + +- (oneway void)didReleasePCFXButton:(OEPCFXButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] &= ~(1 << PCFXMap[button]); +} + +#pragma mark PSX +- (oneway void)didPushPSXButton:(PVPSXButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] |= 1 << PSXMap[button]; +} + +- (oneway void)didReleasePSXButton:(PVPSXButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] &= ~(1 << PSXMap[button]); +} + +- (oneway void)didMovePSXJoystickDirection:(PVPSXButton)button withValue:(CGFloat)value forPlayer:(NSUInteger)player +{ + int analogNumber = PSXMap[button] - 17; + uint8_t *buf = (uint8_t *)inputBuffer[player]; + *(uint16*)& buf[3 + analogNumber * 2] = 32767 * value; +} + +#pragma mark Virtual Boy +- (oneway void)didPushVBButton:(OEVBButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] |= 1 << VBMap[button]; +} + +- (oneway void)didReleaseVBButton:(OEVBButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] &= ~(1 << VBMap[button]); +} + +#pragma mark WonderSwan +- (oneway void)didPushWSButton:(OEWSButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] |= 1 << WSMap[button]; +} + +- (oneway void)didReleaseWSButton:(OEWSButton)button forPlayer:(NSUInteger)player; +{ + inputBuffer[player][0] &= ~(1 << WSMap[button]); +} + +- (NSInteger)controllerValueForButtonID:(unsigned)buttonID forPlayer:(NSInteger)player { + GCController *controller = nil; + + if (player == 0) { + controller = self.controller1; + } else { + controller = self.controller2; + } + + switch (systemType) { + case neogeo: + return [self NeoGeoValueForButtonID:buttonID forController:controller]; + break; + + case lynx: + return [self LynxControllerValueForButtonID:buttonID forController:controller]; + break; + + case pce: + case pcfx: + return [self PCEValueForButtonID:buttonID forController:controller]; + break; + + case psx: + return [self PSXcontrollerValueForButtonID:buttonID forController:controller]; + break; + + case vb: + return [self VirtualBoyControllerValueForButtonID:buttonID forController:controller]; + break; + + case wswan: + return [self WonderSwanControllerValueForButtonID:buttonID forController:controller]; + break; + + default: + break; + } + + return 0; +} + +- (NSInteger)NeoGeoValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) { + GCExtendedGamepad *pad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OENGPButtonUp: + return [[dpad up] isPressed]?:[[[pad leftThumbstick] up] isPressed]; + case OENGPButtonDown: + return [[dpad down] isPressed]?:[[[pad leftThumbstick] down] isPressed]; + case OENGPButtonLeft: + return [[dpad left] isPressed]?:[[[pad leftThumbstick] left] isPressed]; + case OENGPButtonRight: + return [[dpad right] isPressed]?:[[[pad leftThumbstick] right] isPressed]; + case OENGPButtonB: + return [[pad buttonB] isPressed]?:[[pad buttonX] isPressed]; + case OENGPButtonA: + return [[pad buttonA] isPressed]?:[[pad buttonY] isPressed]; + case OENGPButtonOption: + return [[pad leftShoulder] isPressed]?:[[pad leftTrigger] isPressed] ?: [[pad rightShoulder] isPressed]?:[[pad rightTrigger] isPressed]; + default: + break; + } + } else if ([controller gamepad]) { + GCGamepad *pad = [controller gamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OENGPButtonUp: + return [[dpad up] isPressed]; + case OENGPButtonDown: + return [[dpad down] isPressed]; + case OENGPButtonLeft: + return [[dpad left] isPressed]; + case OENGPButtonRight: + return [[dpad right] isPressed]; + case OENGPButtonB: + return [[pad buttonB] isPressed]?:[[pad buttonX] isPressed]; + case OENGPButtonA: + return [[pad buttonA] isPressed]?:[[pad buttonY] isPressed]; + case OENGPButtonOption: + return [[pad leftShoulder] isPressed] ?: [[pad rightShoulder] isPressed]; + default: + break; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) + { + GCMicroGamepad *pad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OENGPButtonUp: + return [[dpad up] value] > 0.5; + break; + case OENGPButtonDown: + return [[dpad down] value] > 0.5; + break; + case OENGPButtonLeft: + return [[dpad left] value] > 0.5; + break; + case OENGPButtonRight: + return [[dpad right] value] > 0.5; + break; + case OENGPButtonA: + return [[pad buttonA] isPressed]; + break; + case OENGPButtonB: + return [[pad buttonX] isPressed]; + break; + default: + break; + } + } +#endif + return 0; +} + +- (NSInteger)PCEValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) + { + GCExtendedGamepad *gamePad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [gamePad dpad]; + switch (buttonID) { + case OEPCEButtonUp: + return [[dpad up] isPressed]?:[[[gamePad leftThumbstick] up] isPressed]; + case OEPCEButtonDown: + return [[dpad down] isPressed]?:[[[gamePad leftThumbstick] down] isPressed]; + case OEPCEButtonLeft: + return [[dpad left] isPressed]?:[[[gamePad leftThumbstick] left] isPressed]; + case OEPCEButtonRight: + return [[dpad right] isPressed]?:[[[gamePad leftThumbstick] right] isPressed]; + case OEPCEButton3: + return [[gamePad buttonX] isPressed]; + case OEPCEButton2: + return [[gamePad buttonA] isPressed]; + case OEPCEButton1: + return [[gamePad buttonB] isPressed]; + case OEPCEButton4: + return [[gamePad leftShoulder] isPressed]; + case OEPCEButton5: + return [[gamePad buttonY] isPressed]; + case OEPCEButton6: + return [[gamePad rightShoulder] isPressed]; + case OEPCEButtonMode: + return [[gamePad leftTrigger] isPressed]; + case OEPCEButtonRun: + return [[gamePad leftTrigger] isPressed]; + default: + break; + } + } + else if ([controller gamepad]) + { + GCGamepad *gamePad = [controller gamepad]; + GCControllerDirectionPad *dpad = [gamePad dpad]; + switch (buttonID) { + case OEPCEButtonUp: + return [[dpad up] isPressed]; + case OEPCEButtonDown: + return [[dpad down] isPressed]; + case OEPCEButtonLeft: + return [[dpad left] isPressed]; + case OEPCEButtonRight: + return [[dpad right] isPressed]; + case OEPCEButton3: + return [[gamePad buttonX] isPressed]; + case OEPCEButton2: + return [[gamePad buttonA] isPressed]; + case OEPCEButton1: + return [[gamePad buttonB] isPressed]; + case OEPCEButton4: + return [[gamePad leftShoulder] isPressed]; + case OEPCEButton5: + return [[gamePad buttonY] isPressed]; + case OEPCEButton6: + return [[gamePad rightShoulder] isPressed]; + default: + break; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) + { + GCMicroGamepad *gamePad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [gamePad dpad]; + switch (buttonID) { + case OEPCEButtonUp: + return [[dpad up] value] > 0.5; + break; + case OEPCEButtonDown: + return [[dpad down] value] > 0.5; + break; + case OEPCEButtonLeft: + return [[dpad left] value] > 0.5; + break; + case OEPCEButtonRight: + return [[dpad right] value] > 0.5; + break; + case OEPCEButton2: + return [[gamePad buttonA] isPressed]; + break; + case OEPCEButton1: + return [[gamePad buttonX] isPressed]; + break; + default: + break; + } + } +#endif + + return 0; +} + +- (float)PSXAnalogControllerValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) + { + GCExtendedGamepad *pad = [controller extendedGamepad]; + switch (buttonID) { + case OEPSXLeftAnalogUp: + return [pad leftThumbstick].up.value; + case OEPSXLeftAnalogDown: + return [pad leftThumbstick].down.value; + case OEPSXLeftAnalogLeft: + return [pad leftThumbstick].left.value; + case OEPSXLeftAnalogRight: + return [pad leftThumbstick].right.value; + case OEPSXRightAnalogUp: + return [pad rightThumbstick].up.value; + case OEPSXRightAnalogDown: + return [pad rightThumbstick].down.value; + case OEPSXRightAnalogLeft: + return [pad rightThumbstick].left.value; + case OEPSXRightAnalogRight: + return [pad rightThumbstick].right.value; + default: + break; + } + } + return 0; +} + +- (NSInteger)PSXcontrollerValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) + { + GCExtendedGamepad *pad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case PVPSXButtonUp: + return [[dpad up] isPressed]; + case PVPSXButtonDown: + return [[dpad down] isPressed]; + case PVPSXButtonLeft: + return [[dpad left] isPressed]; + case PVPSXButtonRight: + return [[dpad right] isPressed]; + case OEPSXLeftAnalogUp: + return [pad leftThumbstick].up.value; + case OEPSXLeftAnalogDown: + return [pad leftThumbstick].down.value; + case OEPSXLeftAnalogLeft: + return [pad leftThumbstick].left.value; + case OEPSXLeftAnalogRight: + return [pad leftThumbstick].right.value; + case PVPSXButtonSquare: + return [[pad buttonX] isPressed]; + case PVPSXButtonCross: + return [[pad buttonA] isPressed]; + case PVPSXButtonCircle: + return [[pad buttonB] isPressed]; + case PVPSXButtonL1: + return [[pad leftShoulder] isPressed]; + case PVPSXButtonTriangle: + return [[pad buttonY] isPressed]; + case PVPSXButtonR1: + return [[pad rightShoulder] isPressed]; + case PVPSXButtonStart: + return [[pad leftTrigger] isPressed]; + case PVPSXButtonSelect: + return [[pad rightTrigger] isPressed]; + default: + break; + } + } + else if ([controller gamepad]) + { + GCGamepad *pad = [controller gamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case PVPSXButtonUp: + return [[dpad up] isPressed]; + case PVPSXButtonDown: + return [[dpad down] isPressed]; + case PVPSXButtonLeft: + return [[dpad left] isPressed]; + case PVPSXButtonRight: + return [[dpad right] isPressed]; + case PVPSXButtonSquare: + return [[pad buttonX] isPressed]; + case PVPSXButtonCross: + return [[pad buttonA] isPressed]; + case PVPSXButtonCircle: + return [[pad buttonB] isPressed]; + case PVPSXButtonL1: + return [[pad leftShoulder] isPressed]; + case PVPSXButtonTriangle: + return [[pad buttonY] isPressed]; + case PVPSXButtonR1: + return [[pad rightShoulder] isPressed]; + default: + break; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) + { + GCMicroGamepad *pad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case PVPSXButtonUp: + return [[dpad up] value] > 0.5; + break; + case PVPSXButtonDown: + return [[dpad down] value] > 0.5; + break; + case PVPSXButtonLeft: + return [[dpad left] value] > 0.5; + break; + case PVPSXButtonRight: + return [[dpad right] value] > 0.5; + break; + case PVPSXButtonCross: + return [[pad buttonA] isPressed]; + break; + case PVPSXButtonCircle: + return [[pad buttonX] isPressed]; + break; + default: + break; + } + } +#endif + return 0; +} + +- (NSInteger)VirtualBoyControllerValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) + { + GCExtendedGamepad *pad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OEVBButtonLeftUp: + return [[dpad up] isPressed]?:[[[pad leftThumbstick] up] isPressed]; + case OEVBButtonLeftDown: + return [[dpad down] isPressed]?:[[[pad leftThumbstick] down] isPressed]; + case OEVBButtonLeftLeft: + return [[dpad left] isPressed]?:[[[pad leftThumbstick] left] isPressed]; + case OEVBButtonLeftRight: + return [[dpad right] isPressed]?:[[[pad leftThumbstick] right] isPressed]; + case OEVBButtonRightUp: + return [[[pad rightThumbstick] up] isPressed]; + case OEVBButtonRightDown: + return [[[pad rightThumbstick] down] isPressed]; + case OEVBButtonRightLeft: + return [[[pad rightThumbstick] left] isPressed]; + case OEVBButtonRightRight: + return [[[pad rightThumbstick] right] isPressed]; + case OEVBButtonB: + return [[pad buttonB] isPressed]?:[[pad buttonX] isPressed]; + case OEVBButtonA: + return [[pad buttonA] isPressed]?:[[pad buttonY] isPressed]; + case OEVBButtonL: + return [[pad leftShoulder] isPressed]; + case OEVBButtonR: + return [[pad rightShoulder] isPressed]; + case OEVBButtonStart: + return [[pad leftTrigger] isPressed]; + case OEVBButtonSelect: + return [[pad rightTrigger] isPressed]; + default: + break; + } + } + else if ([controller gamepad]) + { + GCGamepad *pad = [controller gamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OEVBButtonLeftUp: + return [[dpad up] isPressed]; + case OEVBButtonLeftDown: + return [[dpad down] isPressed]; + case OEVBButtonLeftLeft: + return [[dpad left] isPressed]; + case OEVBButtonLeftRight: + return [[dpad right] isPressed]; + case OEVBButtonB: + return [[pad buttonB] isPressed]; + case OEVBButtonA: + return [[pad buttonA] isPressed]; + case OEVBButtonL: + return [[pad leftShoulder] isPressed]; + case OEVBButtonR: + return [[pad rightShoulder] isPressed]; + case OEVBButtonStart: + return [[pad buttonX] isPressed]; + case OEVBButtonSelect: + return [[pad buttonY] isPressed]; + default: + break; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) + { + GCMicroGamepad *pad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OEVBButtonLeftUp: + return [[dpad up] value] > 0.5; + break; + case OEVBButtonLeftDown: + return [[dpad down] value] > 0.5; + break; + case OEVBButtonLeftLeft: + return [[dpad left] value] > 0.5; + break; + case OEVBButtonLeftRight: + return [[dpad right] value] > 0.5; + break; + case OEVBButtonA: + return [[pad buttonA] isPressed]; + break; + case OEVBButtonB: + return [[pad buttonX] isPressed]; + break; + default: + break; + } + } +#endif + return 0; +} + +- (NSInteger)WonderSwanControllerValueForButtonID:(unsigned)buttonID forController:(GCController*)controller { + if ([controller extendedGamepad]) + { + GCExtendedGamepad *pad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + /* WonderSwan has a Top (Y) D-Pad and a lower (X) D-Pad. MFi controllers + may have the Joy Stick and Left D-Pad in either Top/Bottom configuration. + Another Option is to map to Left/Right Joystick and Make left D-Pad same as + left JoyStick, but if the games require using Left/Right hand at same time it + may be difficult to his the right d-pad and action buttons at the same time. + -joe M */ + case OEWSButtonX1: + return [[[pad leftThumbstick] up] isPressed]; + case OEWSButtonX3: + return [[[pad leftThumbstick] down] isPressed]; + case OEWSButtonX4: + return [[[pad leftThumbstick] left] isPressed]; + case OEWSButtonX2: + return [[[pad leftThumbstick] right] isPressed]; + case OEWSButtonY1: + return [[dpad up] isPressed]; + case OEWSButtonY3: + return [[dpad down] isPressed]; + case OEWSButtonY4: + return [[dpad left] isPressed]; + case OEWSButtonY2: + return [[dpad right] isPressed]; + case OEWSButtonA: + return [[pad buttonX] isPressed]; + case OEWSButtonB: + return [[pad buttonA] isPressed]; + case OEWSButtonStart: + return [[pad buttonB] isPressed]; + case OEWSButtonSound: + return [[pad leftShoulder] isPressed]; + default: + break; + } + } + else if ([controller gamepad]) + { + GCGamepad *pad = [controller gamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OEWSButtonX1: + return [[dpad up] isPressed]; + case OEWSButtonX3: + return [[dpad down] isPressed]; + case OEWSButtonX4: + return [[dpad left] isPressed]; + case OEWSButtonX2: + return [[dpad right] isPressed]; + case OEWSButtonA: + return [[pad buttonX] isPressed]; + case OEWSButtonB: + return [[pad buttonA] isPressed]; + case OEWSButtonStart: + return [[pad buttonB] isPressed]; + case OEWSButtonSound: + return [[pad leftShoulder] isPressed]; + default: + break; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) + { + GCMicroGamepad *pad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [pad dpad]; + switch (buttonID) { + case OEWSButtonX1: + return [[dpad up] value] > 0.5; + break; + case OEWSButtonX3: + return [[dpad down] value] > 0.5; + break; + case OEWSButtonX4: + return [[dpad left] value] > 0.5; + break; + case OEWSButtonX2: + return [[dpad right] value] > 0.5; + break; + case OEWSButtonA: + return [[pad buttonA] isPressed]; + break; + case OEWSButtonB: + return [[pad buttonX] isPressed]; + break; + default: + break; + } + } +#endif + return 0; +} + +- (void)changeDisplayMode +{ + if (systemType == vb) + { + switch (MDFN_IEN_VB::mednafenCurrentDisplayMode) + { + case 0: // (2D) red/black + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFF0000, 0x000000); + MDFN_IEN_VB::VIP_SetParallaxDisable(true); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 1: // (2D) white/black + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFFFFFF, 0x000000); + MDFN_IEN_VB::VIP_SetParallaxDisable(true); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 2: // (2D) purple/black + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFF00FF, 0x000000); + MDFN_IEN_VB::VIP_SetParallaxDisable(true); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 3: // (3D) red/blue + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFF0000, 0x0000FF); + MDFN_IEN_VB::VIP_SetParallaxDisable(false); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 4: // (3D) red/cyan + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFF0000, 0x00B7EB); + MDFN_IEN_VB::VIP_SetParallaxDisable(false); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 5: // (3D) red/electric cyan + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFF0000, 0x00FFFF); + MDFN_IEN_VB::VIP_SetParallaxDisable(false); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 6: // (3D) red/green + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFF0000, 0x00FF00); + MDFN_IEN_VB::VIP_SetParallaxDisable(false); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 7: // (3D) green/red + MDFN_IEN_VB::VIP_SetAnaglyphColors(0x00FF00, 0xFF0000); + MDFN_IEN_VB::VIP_SetParallaxDisable(false); + MDFN_IEN_VB::mednafenCurrentDisplayMode++; + break; + + case 8: // (3D) yellow/blue + MDFN_IEN_VB::VIP_SetAnaglyphColors(0xFFFF00, 0x0000FF); + MDFN_IEN_VB::VIP_SetParallaxDisable(false); + MDFN_IEN_VB::mednafenCurrentDisplayMode = 0; + break; + + default: + return; + break; + } + } +} + +- (void)setDisc:(NSUInteger)discNumber { + uint32_t index = discNumber - 1; // 0-based index + MDFNI_SetMedia(0, 0, 0, 0); // open drive/eject disc + + // Open/eject needs a bit of delay, so wait 1 second until inserting new disc + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + MDFNI_SetMedia(0, 2, index, 0); // close drive/insert disc (2 = close) + }); +} + +- (NSUInteger)discCount { + return maxDiscs ? maxDiscs : 1; +} + +- (BOOL)supportsDiskSwapping { + switch (systemType) { + case psx: + return YES; + case neogeo: + case lynx: + case pce: + case pcfx: + case vb: + case wswan: + return NO; + } +} + +@end diff --git a/Mednafen/PVMednafen.xcodeproj/TemplateIcon.icns b/Mednafen/PVMednafen.xcodeproj/TemplateIcon.icns new file mode 100644 index 0000000000..62cb7015e0 Binary files /dev/null and b/Mednafen/PVMednafen.xcodeproj/TemplateIcon.icns differ diff --git a/Mednafen/PVMednafen.xcodeproj/project.pbxproj b/Mednafen/PVMednafen.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..7237a109c7 --- /dev/null +++ b/Mednafen/PVMednafen.xcodeproj/project.pbxproj @@ -0,0 +1,5417 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + B3223CDD1E09E0CA007BB244 /* MednafenGameCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 824088340FFDDCF400F0FE7D /* MednafenGameCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3223CDE1E09E0CB007BB244 /* MednafenGameCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 824088340FFDDCF400F0FE7D /* MednafenGameCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B340E4661E08887700AD0E8B /* PVMednafen.h in Headers */ = {isa = PBXBuildFile; fileRef = B340E4641E08887700AD0E8B /* PVMednafen.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B340E4791E08893000AD0E8B /* c68k.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6371A75DA89001F174F /* c68k.cpp */; }; + B340E47A1E08893000AD0E8B /* c68kexec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6381A75DA9C001F174F /* c68kexec.cpp */; }; + B340E47B1E08893000AD0E8B /* MednafenGameCore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 824088350FFDDCF400F0FE7D /* MednafenGameCore.mm */; }; + B340E47C1E08893000AD0E8B /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8317F1DE5D0090372A /* video.cpp */; }; + B340E47D1E08893000AD0E8B /* negcon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89317F1DE5C0090372A /* negcon.cpp */; }; + B340E47E1E08893000AD0E8B /* ZLInflateFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6231A75D6CB001F174F /* ZLInflateFilter.cpp */; }; + B340E47F1E08893000AD0E8B /* soundbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86417F1DE5C0090372A /* soundbox.cpp */; }; + B340E4801E08893000AD0E8B /* galois.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53317F1DE5A0090372A /* galois.cpp */; }; + B340E4811E08893000AD0E8B /* PSFLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86A17F1DE5C0090372A /* PSFLoader.cpp */; }; + B340E4821E08893000AD0E8B /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81E17F1DE5C0090372A /* input.cpp */; }; + B340E4831E08893000AD0E8B /* res012.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4417F1DE5D0090372A /* res012.c */; }; + B340E4841E08893000AD0E8B /* hes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81317F1DE5C0090372A /* hes.cpp */; }; + B340E4851E08893000AD0E8B /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9F17F1DE5E0090372A /* sound.cpp */; }; + B340E4861E08893000AD0E8B /* arcade_card.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D64F17F1DE5B0090372A /* arcade_card.cpp */; }; + B340E4871E08893000AD0E8B /* psx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89D17F1DE5C0090372A /* psx.cpp */; }; + B340E4881E08893000AD0E8B /* c65c02.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D67A17F1DE5B0090372A /* c65c02.cpp */; }; + B340E4891E08893000AD0E8B /* OwlResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 948D5B4418C805E500346504 /* OwlResampler.cpp */; }; + B340E48A1E08893000AD0E8B /* CDUtility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52E17F1DE5A0090372A /* CDUtility.cpp */; }; + B340E48B1E08893000AD0E8B /* huc6273.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84A17F1DE5C0090372A /* huc6273.cpp */; }; + B340E48C1E08893000AD0E8B /* crc32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53017F1DE5A0090372A /* crc32.cpp */; }; + B340E48D1E08893000AD0E8B /* sio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8A017F1DE5C0090372A /* sio.cpp */; }; + B340E48F1E08893000AD0E8B /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3917F1DE5D0090372A /* mapping0.c */; }; + B340E4901E08893000AD0E8B /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4217F1DE5D0090372A /* registry.c */; }; + B340E4911E08893000AD0E8B /* okiadpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94817C381922B53900FDFC99 /* okiadpcm.cpp */; }; + B340E4921E08893000AD0E8B /* mpc_demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70117F1DE5B0090372A /* mpc_demux.c */; }; + B340E4931E08893000AD0E8B /* mdec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89917F1DE5C0090372A /* mdec.cpp */; }; + B340E4941E08893000AD0E8B /* tcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DCA217F1DE5E0090372A /* tcache.cpp */; }; + B340E4951E08893000AD0E8B /* general.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D60B17F1DE5B0090372A /* general.cpp */; }; + B340E4961E08893000AD0E8B /* vsu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6317F1DE5D0090372A /* vsu.cpp */; }; + B340E4971E08893000AD0E8B /* frontio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87717F1DE5C0090372A /* frontio.cpp */; }; + B340E4981E08893000AD0E8B /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3017F1DE5D0090372A /* framing.c */; }; + B340E4991E08893000AD0E8B /* triostr.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5317F1DE5D0090372A /* triostr.c */; }; + B340E49A1E08893000AD0E8B /* png.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7317F1DE5D0090372A /* png.cpp */; }; + B340E49B1E08893000AD0E8B /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4617F1DE5D0090372A /* synthesis.c */; }; + B340E49C1E08893000AD0E8B /* endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5CD17F1DE5B0090372A /* endian.cpp */; }; + B340E49D1E08893000AD0E8B /* FileStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5D317F1DE5B0090372A /* FileStream.cpp */; }; + B340E49E1E08893000AD0E8B /* gpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87917F1DE5C0090372A /* gpu.cpp */; }; + B340E49F1E08893000AD0E8B /* synth_filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70D17F1DE5B0090372A /* synth_filter.c */; }; + B340E4A01E08893000AD0E8B /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB62D1A75D73F001F174F /* sha1.cpp */; }; + B340E4A11E08893000AD0E8B /* MemoryStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E517F1DE5B0090372A /* MemoryStream.cpp */; }; + B340E4A21E08893000AD0E8B /* trio.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5117F1DE5D0090372A /* trio.c */; }; + B340E4A31E08893000AD0E8B /* vb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5E17F1DE5D0090372A /* vb.cpp */; }; + B340E4A41E08893000AD0E8B /* netplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7C417F1DE5B0090372A /* netplay.cpp */; }; + B340E4A51E08893000AD0E8B /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D55917F1DE5A0090372A /* debug.cpp */; }; + B340E4A61E08893000AD0E8B /* dualshock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88517F1DE5C0090372A /* dualshock.cpp */; }; + B340E4A71E08893000AD0E8B /* mpc_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70017F1DE5B0090372A /* mpc_decoder.c */; }; + B340E4A81E08893000AD0E8B /* mpc_bits_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6FE17F1DE5B0090372A /* mpc_bits_reader.c */; }; + B340E4A91E08893000AD0E8B /* v30mz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DCA617F1DE5E0090372A /* v30mz.cpp */; }; + B340E4AA1E08893000AD0E8B /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9D17F1DE5E0090372A /* rtc.cpp */; }; + B340E4AB1E08893000AD0E8B /* vip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6017F1DE5D0090372A /* vip.cpp */; }; + B340E4AC1E08893000AD0E8B /* mempatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E817F1DE5B0090372A /* mempatcher.cpp */; }; + B340E4AD1E08893000AD0E8B /* irq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89517F1DE5C0090372A /* irq.cpp */; }; + B340E4AE1E08893000AD0E8B /* dis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87317F1DE5C0090372A /* dis.cpp */; }; + B340E4AF1E08893000AD0E8B /* spu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8A317F1DE5C0090372A /* spu.cpp */; }; + B340E4B01E08893000AD0E8B /* thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94454E3617852E44006C057B /* thread.cpp */; }; + B340E4B11E08893000AD0E8B /* dis_groups.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8B17F1DE5D0090372A /* dis_groups.cpp */; }; + B340E4B21E08893000AD0E8B /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E317F1DE5B0090372A /* memory.cpp */; }; + B340E4B31E08893000AD0E8B /* qtrecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8AA17F1DE5C0090372A /* qtrecord.cpp */; }; + B340E4B41E08893000AD0E8B /* streaminfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70B17F1DE5B0090372A /* streaminfo.c */; }; + B340E4B51E08893000AD0E8B /* mednafen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E117F1DE5B0090372A /* mednafen.cpp */; }; + B340E4B61E08893000AD0E8B /* Fir_Resampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0A17F1DE5D0090372A /* Fir_Resampler.cpp */; }; + B340E4B71E08893000AD0E8B /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4517F1DE5D0090372A /* sharedbook.c */; }; + B340E4B81E08893000AD0E8B /* Stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1417F1DE5D0090372A /* Stream.cpp */; }; + B340E4B91E08893000AD0E8B /* gpu_line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6411A75DB60001F174F /* gpu_line.cpp */; }; + B340E4BA1E08893000AD0E8B /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6F317F1DE5B0090372A /* crc32.c */; }; + B340E4BB1E08893000AD0E8B /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6EB17F1DE5B0090372A /* movie.cpp */; }; + B340E4BC1E08893000AD0E8B /* CDAccess_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52817F1DE5A0090372A /* CDAccess_Image.cpp */; }; + B340E4BD1E08893000AD0E8B /* gte.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87F17F1DE5C0090372A /* gte.cpp */; }; + B340E4BE1E08893000AD0E8B /* guncon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88917F1DE5C0090372A /* guncon.cpp */; }; + B340E4BF1E08893000AD0E8B /* v810_fp_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94817C3D1922B75000FDFC99 /* v810_fp_ops.cpp */; }; + B340E4C01E08893000AD0E8B /* system.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68F17F1DE5B0090372A /* system.cpp */; }; + B340E4C11E08893000AD0E8B /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8017F1DE5D0090372A /* text.cpp */; }; + B340E4C21E08893000AD0E8B /* ConvertUTF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1817F1DE5D0090372A /* ConvertUTF.cpp */; }; + B340E4C31E08893000AD0E8B /* z80.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D64517F1DE5B0090372A /* z80.cpp */; }; + B340E4C41E08893000AD0E8B /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5D117F1DE5B0090372A /* file.cpp */; }; + B340E4C51E08893000AD0E8B /* huc6280.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D62C17F1DE5B0090372A /* huc6280.cpp */; }; + B340E4C61E08893000AD0E8B /* CDAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52417F1DE5A0090372A /* CDAccess.cpp */; }; + B340E4C71E08893000AD0E8B /* justifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88B17F1DE5C0090372A /* justifier.cpp */; }; + B340E4C81E08893000AD0E8B /* CDAFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B0824B1A8697EF00D3C0BC /* CDAFReader.cpp */; }; + B340E4C91E08893000AD0E8B /* mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84F17F1DE5C0090372A /* mouse.cpp */; }; + B340E4CA1E08893000AD0E8B /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2917F1DE5D0090372A /* codebook.c */; }; + B340E4CB1E08893000AD0E8B /* stubs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94454E3B17852E61006C057B /* stubs.cpp */; }; + B340E4CC1E08893000AD0E8B /* player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86817F1DE5C0090372A /* player.cpp */; }; + B340E4CD1E08893000AD0E8B /* l-ec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53417F1DE5A0090372A /* l-ec.cpp */; }; + B340E4CE1E08893000AD0E8B /* settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8B617F1DE5C0090372A /* settings.cpp */; }; + B340E4CF1E08893000AD0E8B /* trionan.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5217F1DE5D0090372A /* trionan.c */; }; + B340E4D01E08893000AD0E8B /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6F817F1DE5B0090372A /* huffman.c */; }; + B340E4D11E08893000AD0E8B /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2517F1DE5D0090372A /* bitwise.c */; }; + B340E4D21E08893000AD0E8B /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB62B1A75D73F001F174F /* md5.cpp */; }; + B340E4D31E08893000AD0E8B /* tblur.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7E17F1DE5D0090372A /* tblur.cpp */; }; + B340E4D41E08893000AD0E8B /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4817F1DE5D0090372A /* vorbisfile.c */; }; + B340E4D51E08893000AD0E8B /* minilzo.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D54917F1DE5A0090372A /* minilzo.c */; }; + B340E4D61E08893000AD0E8B /* pcecd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FD853018C7F53C001B426D /* pcecd.cpp */; }; + B340E4D71E08893000AD0E8B /* cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86F17F1DE5C0090372A /* cpu.cpp */; }; + B340E4D81E08893000AD0E8B /* mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81A17F1DE5C0090372A /* mouse.cpp */; }; + B340E4D91E08893000AD0E8B /* requant.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70917F1DE5B0090372A /* requant.c */; }; + B340E4DA1E08893000AD0E8B /* git.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB61E1A75D654001F174F /* git.cpp */; }; + B340E4DB1E08893000AD0E8B /* surface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7C17F1DE5D0090372A /* surface.cpp */; }; + B340E4DC1E08893000AD0E8B /* Deinterlacer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6617F1DE5D0090372A /* Deinterlacer.cpp */; }; + B340E4DD1E08893000AD0E8B /* gfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9417F1DE5D0090372A /* gfx.cpp */; }; + B340E4DE1E08893000AD0E8B /* fxscsi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84717F1DE5C0090372A /* fxscsi.cpp */; }; + B340E4DF1E08893000AD0E8B /* gpu_sprite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6431A75DB60001F174F /* gpu_sprite.cpp */; }; + B340E4E01E08893000AD0E8B /* trim.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FD853318C7F58C001B426D /* trim.cpp */; }; + B340E4E11E08893000AD0E8B /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85117F1DE5C0090372A /* input.cpp */; }; + B340E4E21E08893000AD0E8B /* multitap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89117F1DE5C0090372A /* multitap.cpp */; }; + B340E4E31E08893000AD0E8B /* memmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68417F1DE5B0090372A /* memmap.cpp */; }; + B340E4E41E08893000AD0E8B /* state_rewind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6591A75DC7B001F174F /* state_rewind.cpp */; }; + B340E4E51E08893000AD0E8B /* cart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D67C17F1DE5B0090372A /* cart.cpp */; }; + B340E4E61E08893000AD0E8B /* ram.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68817F1DE5B0090372A /* ram.cpp */; }; + B340E4E71E08893000AD0E8B /* mikie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68617F1DE5B0090372A /* mikie.cpp */; }; + B340E4E81E08893000AD0E8B /* interrupt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9617F1DE5D0090372A /* interrupt.cpp */; }; + B340E4E91E08893000AD0E8B /* syntax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9117F1DE5D0090372A /* syntax.cpp */; }; + B340E4EA1E08893000AD0E8B /* mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88F17F1DE5C0090372A /* mouse.cpp */; }; + B340E4EB1E08893000AD0E8B /* lec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53517F1DE5A0090372A /* lec.cpp */; }; + B340E4EC1E08893000AD0E8B /* dis_decode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8A17F1DE5D0090372A /* dis_decode.cpp */; }; + B340E4ED1E08893000AD0E8B /* interrupt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85317F1DE5C0090372A /* interrupt.cpp */; }; + B340E4EE1E08893000AD0E8B /* dma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87517F1DE5C0090372A /* dma.cpp */; }; + B340E4EF1E08893000AD0E8B /* tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1F17F1DE5D0090372A /* tests.cpp */; }; + B340E4F01E08893000AD0E8B /* cdc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86D17F1DE5C0090372A /* cdc.cpp */; }; + B340E4F11E08893000AD0E8B /* dualanalog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88317F1DE5C0090372A /* dualanalog.cpp */; }; + B340E4F21E08893000AD0E8B /* huc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81517F1DE5C0090372A /* huc.cpp */; }; + B340E4F31E08893000AD0E8B /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9B17F1DE5E0090372A /* memory.cpp */; }; + B340E4F41E08893000AD0E8B /* cdplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94817C2A1922B45500FDFC99 /* cdplay.cpp */; }; + B340E4F51E08893000AD0E8B /* eeprom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9217F1DE5D0090372A /* eeprom.cpp */; }; + B340E4F61E08893000AD0E8B /* vce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82D17F1DE5C0090372A /* vce.cpp */; }; + B340E4F71E08893000AD0E8B /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4A17F1DE5D0090372A /* window.c */; }; + B340E4F81E08893000AD0E8B /* quicklz.c in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6541A75DC2D001F174F /* quicklz.c */; }; + B340E4F91E08893000AD0E8B /* CDAFReader_MPC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B082451A8697EF00D3C0BC /* CDAFReader_MPC.cpp */; }; + B340E4FA1E08893000AD0E8B /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8A817F1DE5C0090372A /* timer.cpp */; }; + B340E4FB1E08893000AD0E8B /* Blip_Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0917F1DE5D0090372A /* Blip_Buffer.cpp */; }; + B340E4FC1E08893000AD0E8B /* tsushinkb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81C17F1DE5C0090372A /* tsushinkb.cpp */; }; + B340E4FD1E08893000AD0E8B /* mcgenjin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82217F1DE5C0090372A /* mcgenjin.cpp */; }; + B340E4FE1E08893000AD0E8B /* pcfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86017F1DE5C0090372A /* pcfx.cpp */; }; + B340E4FF1E08893000AD0E8B /* gpu_polygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6421A75DB60001F174F /* gpu_polygon.cpp */; }; + B340E5001E08893000AD0E8B /* gamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88717F1DE5C0090372A /* gamepad.cpp */; }; + B340E5011E08893000AD0E8B /* vdc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D67317F1DE5B0090372A /* vdc.cpp */; }; + B340E5021E08893000AD0E8B /* rainbow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86217F1DE5C0090372A /* rainbow.cpp */; }; + B340E5031E08893000AD0E8B /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5C17F1DE5D0090372A /* timer.cpp */; }; + B340E5041E08893000AD0E8B /* GZFileStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B082511A86982900D3C0BC /* GZFileStream.cpp */; }; + B340E5051E08893000AD0E8B /* IPSPatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6261A75D70C001F174F /* IPSPatcher.cpp */; }; + B340E5061E08893000AD0E8B /* rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68A17F1DE5B0090372A /* rom.cpp */; }; + B340E5071E08893000AD0E8B /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D54E17F1DE5A0090372A /* unzip.c */; }; + B340E5081E08893000AD0E8B /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8B017F1DE5C0090372A /* resample.c */; }; + B340E5091E08893000AD0E8B /* cdromif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52C17F1DE5A0090372A /* cdromif.cpp */; }; + B340E50A1E08893000AD0E8B /* comm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9454E32919516301005A5CFE /* comm.cpp */; }; + B340E50B1E08893000AD0E8B /* error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5CF17F1DE5B0090372A /* error.cpp */; }; + B340E50C1E08893000AD0E8B /* pce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82517F1DE5C0090372A /* pce.cpp */; }; + B340E50D1E08893000AD0E8B /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3117F1DE5D0090372A /* info.c */; }; + B340E50E1E08893000AD0E8B /* king.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85A17F1DE5C0090372A /* king.cpp */; }; + B340E50F1E08893000AD0E8B /* resize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7817F1DE5D0090372A /* resize.cpp */; }; + B340E5101E08893000AD0E8B /* v810_cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D63B17F1DE5B0090372A /* v810_cpu.cpp */; }; + B340E5111E08893000AD0E8B /* WAVRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0E17F1DE5D0090372A /* WAVRecord.cpp */; }; + B340E5121E08893000AD0E8B /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2617F1DE5D0090372A /* block.c */; }; + B340E5131E08893000AD0E8B /* memcard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88D17F1DE5C0090372A /* memcard.cpp */; }; + B340E5141E08893000AD0E8B /* gamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84D17F1DE5C0090372A /* gamepad.cpp */; }; + B340E5151E08893000AD0E8B /* pce_psg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D66017F1DE5B0090372A /* pce_psg.cpp */; }; + B340E5161E08893000AD0E8B /* state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1217F1DE5D0090372A /* state.cpp */; }; + B340E5171E08893000AD0E8B /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86617F1DE5C0090372A /* timer.cpp */; }; + B340E5181E08893000AD0E8B /* CDAFReader_Vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B082491A8697EF00D3C0BC /* CDAFReader_Vorbis.cpp */; }; + B340E5191E08893000AD0E8B /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2E17F1DE5D0090372A /* floor0.c */; }; + B340E51A1E08893000AD0E8B /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D54417F1DE5A0090372A /* ioapi.c */; }; + B340E51B1E08893000AD0E8B /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3A17F1DE5D0090372A /* mdct.c */; }; + B340E51C1E08893000AD0E8B /* CDAccess_CCD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52617F1DE5A0090372A /* CDAccess_CCD.cpp */; }; + B340E51D1E08893000AD0E8B /* recover-raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53A17F1DE5A0090372A /* recover-raw.cpp */; }; + B340E51E1E08893000AD0E8B /* scsicd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53C17F1DE5A0090372A /* scsicd.cpp */; }; + B340E51F1E08893000AD0E8B /* tsushin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82B17F1DE5C0090372A /* tsushin.cpp */; }; + B340E5201E08893000AD0E8B /* font-data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6A17F1DE5D0090372A /* font-data.cpp */; }; + B340E5211E08893000AD0E8B /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2F17F1DE5D0090372A /* floor1.c */; }; + B340E5221E08893000AD0E8B /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9817F1DE5D0090372A /* main.cpp */; }; + B340E5231E08893000AD0E8B /* susie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68C17F1DE5B0090372A /* susie.cpp */; }; + B340E5241E08893000AD0E8B /* jrevdct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85617F1DE5C0090372A /* jrevdct.cpp */; }; + B340E5251E08893000AD0E8B /* gamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81817F1DE5C0090372A /* gamepad.cpp */; }; + B340E5261E08893000AD0E8B /* escape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1A17F1DE5D0090372A /* escape.cpp */; }; + B340E5271E08893000AD0E8B /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5817F1DE5D0090372A /* input.cpp */; }; + B340E5281E08893000AD0E8B /* resolve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9017F1DE5D0090372A /* resolve.cpp */; }; + B340E5291E08893000AD0E8B /* Stereo_Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0D17F1DE5D0090372A /* Stereo_Buffer.cpp */; }; + B340E52A1E08893000AD0E8B /* cputest.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D55217F1DE5A0090372A /* cputest.c */; }; + B340E52C1E08893000AD0E8B /* demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D55C17F1DE5A0090372A /* demo.cpp */; }; + B340E52D1E08893000AD0E8B /* sha256.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB62F1A75D73F001F174F /* sha256.cpp */; }; + B340E52E1E08893000AD0E8B /* primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7517F1DE5D0090372A /* primitives.cpp */; }; + B340E52F1E08893000AD0E8B /* c68k.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6371A75DA89001F174F /* c68k.cpp */; }; + B340E5301E08893000AD0E8B /* c68kexec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6381A75DA9C001F174F /* c68kexec.cpp */; }; + B340E5311E08893000AD0E8B /* MednafenGameCore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 824088350FFDDCF400F0FE7D /* MednafenGameCore.mm */; }; + B340E5321E08893000AD0E8B /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8317F1DE5D0090372A /* video.cpp */; }; + B340E5331E08893000AD0E8B /* negcon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89317F1DE5C0090372A /* negcon.cpp */; }; + B340E5341E08893000AD0E8B /* ZLInflateFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6231A75D6CB001F174F /* ZLInflateFilter.cpp */; }; + B340E5351E08893000AD0E8B /* soundbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86417F1DE5C0090372A /* soundbox.cpp */; }; + B340E5361E08893000AD0E8B /* galois.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53317F1DE5A0090372A /* galois.cpp */; }; + B340E5371E08893000AD0E8B /* PSFLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86A17F1DE5C0090372A /* PSFLoader.cpp */; }; + B340E5381E08893000AD0E8B /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81E17F1DE5C0090372A /* input.cpp */; }; + B340E5391E08893000AD0E8B /* res012.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4417F1DE5D0090372A /* res012.c */; }; + B340E53A1E08893000AD0E8B /* hes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81317F1DE5C0090372A /* hes.cpp */; }; + B340E53B1E08893000AD0E8B /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9F17F1DE5E0090372A /* sound.cpp */; }; + B340E53C1E08893000AD0E8B /* arcade_card.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D64F17F1DE5B0090372A /* arcade_card.cpp */; }; + B340E53D1E08893000AD0E8B /* psx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89D17F1DE5C0090372A /* psx.cpp */; }; + B340E53E1E08893000AD0E8B /* c65c02.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D67A17F1DE5B0090372A /* c65c02.cpp */; }; + B340E53F1E08893000AD0E8B /* OwlResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 948D5B4418C805E500346504 /* OwlResampler.cpp */; }; + B340E5401E08893000AD0E8B /* CDUtility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52E17F1DE5A0090372A /* CDUtility.cpp */; }; + B340E5411E08893000AD0E8B /* huc6273.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84A17F1DE5C0090372A /* huc6273.cpp */; }; + B340E5421E08893000AD0E8B /* crc32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53017F1DE5A0090372A /* crc32.cpp */; }; + B340E5431E08893000AD0E8B /* sio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8A017F1DE5C0090372A /* sio.cpp */; }; + B340E5451E08893000AD0E8B /* mapping0.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3917F1DE5D0090372A /* mapping0.c */; }; + B340E5461E08893000AD0E8B /* registry.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4217F1DE5D0090372A /* registry.c */; }; + B340E5471E08893000AD0E8B /* okiadpcm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94817C381922B53900FDFC99 /* okiadpcm.cpp */; }; + B340E5481E08893000AD0E8B /* mpc_demux.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70117F1DE5B0090372A /* mpc_demux.c */; }; + B340E5491E08893000AD0E8B /* mdec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89917F1DE5C0090372A /* mdec.cpp */; }; + B340E54A1E08893000AD0E8B /* tcache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DCA217F1DE5E0090372A /* tcache.cpp */; }; + B340E54B1E08893000AD0E8B /* general.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D60B17F1DE5B0090372A /* general.cpp */; }; + B340E54C1E08893000AD0E8B /* vsu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6317F1DE5D0090372A /* vsu.cpp */; }; + B340E54D1E08893000AD0E8B /* frontio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87717F1DE5C0090372A /* frontio.cpp */; }; + B340E54E1E08893000AD0E8B /* framing.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3017F1DE5D0090372A /* framing.c */; }; + B340E54F1E08893000AD0E8B /* triostr.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5317F1DE5D0090372A /* triostr.c */; }; + B340E5501E08893000AD0E8B /* png.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7317F1DE5D0090372A /* png.cpp */; }; + B340E5511E08893000AD0E8B /* synthesis.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4617F1DE5D0090372A /* synthesis.c */; }; + B340E5521E08893000AD0E8B /* endian.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5CD17F1DE5B0090372A /* endian.cpp */; }; + B340E5531E08893000AD0E8B /* FileStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5D317F1DE5B0090372A /* FileStream.cpp */; }; + B340E5541E08893000AD0E8B /* gpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87917F1DE5C0090372A /* gpu.cpp */; }; + B340E5551E08893000AD0E8B /* synth_filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70D17F1DE5B0090372A /* synth_filter.c */; }; + B340E5561E08893000AD0E8B /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB62D1A75D73F001F174F /* sha1.cpp */; }; + B340E5571E08893000AD0E8B /* MemoryStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E517F1DE5B0090372A /* MemoryStream.cpp */; }; + B340E5581E08893000AD0E8B /* trio.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5117F1DE5D0090372A /* trio.c */; }; + B340E5591E08893000AD0E8B /* vb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5E17F1DE5D0090372A /* vb.cpp */; }; + B340E55A1E08893000AD0E8B /* netplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7C417F1DE5B0090372A /* netplay.cpp */; }; + B340E55B1E08893000AD0E8B /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D55917F1DE5A0090372A /* debug.cpp */; }; + B340E55C1E08893000AD0E8B /* dualshock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88517F1DE5C0090372A /* dualshock.cpp */; }; + B340E55D1E08893000AD0E8B /* mpc_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70017F1DE5B0090372A /* mpc_decoder.c */; }; + B340E55E1E08893000AD0E8B /* mpc_bits_reader.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6FE17F1DE5B0090372A /* mpc_bits_reader.c */; }; + B340E55F1E08893000AD0E8B /* v30mz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DCA617F1DE5E0090372A /* v30mz.cpp */; }; + B340E5601E08893000AD0E8B /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9D17F1DE5E0090372A /* rtc.cpp */; }; + B340E5611E08893000AD0E8B /* vip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6017F1DE5D0090372A /* vip.cpp */; }; + B340E5621E08893000AD0E8B /* mempatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E817F1DE5B0090372A /* mempatcher.cpp */; }; + B340E5631E08893000AD0E8B /* irq.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89517F1DE5C0090372A /* irq.cpp */; }; + B340E5641E08893000AD0E8B /* dis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87317F1DE5C0090372A /* dis.cpp */; }; + B340E5651E08893000AD0E8B /* spu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8A317F1DE5C0090372A /* spu.cpp */; }; + B340E5661E08893000AD0E8B /* thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94454E3617852E44006C057B /* thread.cpp */; }; + B340E5671E08893000AD0E8B /* dis_groups.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8B17F1DE5D0090372A /* dis_groups.cpp */; }; + B340E5681E08893000AD0E8B /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E317F1DE5B0090372A /* memory.cpp */; }; + B340E5691E08893000AD0E8B /* qtrecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8AA17F1DE5C0090372A /* qtrecord.cpp */; }; + B340E56A1E08893000AD0E8B /* streaminfo.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70B17F1DE5B0090372A /* streaminfo.c */; }; + B340E56B1E08893000AD0E8B /* mednafen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6E117F1DE5B0090372A /* mednafen.cpp */; }; + B340E56C1E08893000AD0E8B /* Fir_Resampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0A17F1DE5D0090372A /* Fir_Resampler.cpp */; }; + B340E56D1E08893000AD0E8B /* sharedbook.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4517F1DE5D0090372A /* sharedbook.c */; }; + B340E56E1E08893000AD0E8B /* Stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1417F1DE5D0090372A /* Stream.cpp */; }; + B340E56F1E08893000AD0E8B /* gpu_line.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6411A75DB60001F174F /* gpu_line.cpp */; }; + B340E5701E08893000AD0E8B /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6F317F1DE5B0090372A /* crc32.c */; }; + B340E5711E08893000AD0E8B /* movie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6EB17F1DE5B0090372A /* movie.cpp */; }; + B340E5721E08893000AD0E8B /* CDAccess_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52817F1DE5A0090372A /* CDAccess_Image.cpp */; }; + B340E5731E08893000AD0E8B /* gte.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87F17F1DE5C0090372A /* gte.cpp */; }; + B340E5741E08893000AD0E8B /* guncon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88917F1DE5C0090372A /* guncon.cpp */; }; + B340E5751E08893000AD0E8B /* v810_fp_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94817C3D1922B75000FDFC99 /* v810_fp_ops.cpp */; }; + B340E5761E08893000AD0E8B /* system.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68F17F1DE5B0090372A /* system.cpp */; }; + B340E5771E08893000AD0E8B /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8017F1DE5D0090372A /* text.cpp */; }; + B340E5781E08893000AD0E8B /* ConvertUTF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1817F1DE5D0090372A /* ConvertUTF.cpp */; }; + B340E5791E08893000AD0E8B /* z80.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D64517F1DE5B0090372A /* z80.cpp */; }; + B340E57A1E08893000AD0E8B /* file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5D117F1DE5B0090372A /* file.cpp */; }; + B340E57B1E08893000AD0E8B /* huc6280.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D62C17F1DE5B0090372A /* huc6280.cpp */; }; + B340E57C1E08893000AD0E8B /* CDAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52417F1DE5A0090372A /* CDAccess.cpp */; }; + B340E57D1E08893000AD0E8B /* justifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88B17F1DE5C0090372A /* justifier.cpp */; }; + B340E57E1E08893000AD0E8B /* CDAFReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B0824B1A8697EF00D3C0BC /* CDAFReader.cpp */; }; + B340E57F1E08893000AD0E8B /* mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84F17F1DE5C0090372A /* mouse.cpp */; }; + B340E5801E08893000AD0E8B /* codebook.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2917F1DE5D0090372A /* codebook.c */; }; + B340E5811E08893000AD0E8B /* stubs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94454E3B17852E61006C057B /* stubs.cpp */; }; + B340E5821E08893000AD0E8B /* player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86817F1DE5C0090372A /* player.cpp */; }; + B340E5831E08893000AD0E8B /* l-ec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53417F1DE5A0090372A /* l-ec.cpp */; }; + B340E5841E08893000AD0E8B /* settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8B617F1DE5C0090372A /* settings.cpp */; }; + B340E5851E08893000AD0E8B /* trionan.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5217F1DE5D0090372A /* trionan.c */; }; + B340E5861E08893000AD0E8B /* huffman.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D6F817F1DE5B0090372A /* huffman.c */; }; + B340E5871E08893000AD0E8B /* bitwise.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2517F1DE5D0090372A /* bitwise.c */; }; + B340E5881E08893000AD0E8B /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB62B1A75D73F001F174F /* md5.cpp */; }; + B340E5891E08893000AD0E8B /* tblur.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7E17F1DE5D0090372A /* tblur.cpp */; }; + B340E58A1E08893000AD0E8B /* vorbisfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4817F1DE5D0090372A /* vorbisfile.c */; }; + B340E58B1E08893000AD0E8B /* minilzo.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D54917F1DE5A0090372A /* minilzo.c */; }; + B340E58C1E08893000AD0E8B /* pcecd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FD853018C7F53C001B426D /* pcecd.cpp */; }; + B340E58D1E08893000AD0E8B /* cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86F17F1DE5C0090372A /* cpu.cpp */; }; + B340E58E1E08893000AD0E8B /* mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81A17F1DE5C0090372A /* mouse.cpp */; }; + B340E58F1E08893000AD0E8B /* requant.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D70917F1DE5B0090372A /* requant.c */; }; + B340E5901E08893000AD0E8B /* git.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB61E1A75D654001F174F /* git.cpp */; }; + B340E5911E08893000AD0E8B /* surface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7C17F1DE5D0090372A /* surface.cpp */; }; + B340E5921E08893000AD0E8B /* Deinterlacer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6617F1DE5D0090372A /* Deinterlacer.cpp */; }; + B340E5931E08893000AD0E8B /* gfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9417F1DE5D0090372A /* gfx.cpp */; }; + B340E5941E08893000AD0E8B /* fxscsi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84717F1DE5C0090372A /* fxscsi.cpp */; }; + B340E5951E08893000AD0E8B /* gpu_sprite.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6431A75DB60001F174F /* gpu_sprite.cpp */; }; + B340E5961E08893000AD0E8B /* trim.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FD853318C7F58C001B426D /* trim.cpp */; }; + B340E5971E08893000AD0E8B /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85117F1DE5C0090372A /* input.cpp */; }; + B340E5981E08893000AD0E8B /* multitap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D89117F1DE5C0090372A /* multitap.cpp */; }; + B340E5991E08893000AD0E8B /* memmap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68417F1DE5B0090372A /* memmap.cpp */; }; + B340E59A1E08893000AD0E8B /* state_rewind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6591A75DC7B001F174F /* state_rewind.cpp */; }; + B340E59B1E08893000AD0E8B /* cart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D67C17F1DE5B0090372A /* cart.cpp */; }; + B340E59C1E08893000AD0E8B /* ram.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68817F1DE5B0090372A /* ram.cpp */; }; + B340E59D1E08893000AD0E8B /* mikie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68617F1DE5B0090372A /* mikie.cpp */; }; + B340E59E1E08893000AD0E8B /* interrupt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9617F1DE5D0090372A /* interrupt.cpp */; }; + B340E59F1E08893000AD0E8B /* syntax.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9117F1DE5D0090372A /* syntax.cpp */; }; + B340E5A01E08893000AD0E8B /* mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88F17F1DE5C0090372A /* mouse.cpp */; }; + B340E5A11E08893000AD0E8B /* lec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53517F1DE5A0090372A /* lec.cpp */; }; + B340E5A21E08893000AD0E8B /* dis_decode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC8A17F1DE5D0090372A /* dis_decode.cpp */; }; + B340E5A31E08893000AD0E8B /* interrupt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85317F1DE5C0090372A /* interrupt.cpp */; }; + B340E5A41E08893000AD0E8B /* dma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D87517F1DE5C0090372A /* dma.cpp */; }; + B340E5A51E08893000AD0E8B /* tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1F17F1DE5D0090372A /* tests.cpp */; }; + B340E5A61E08893000AD0E8B /* cdc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86D17F1DE5C0090372A /* cdc.cpp */; }; + B340E5A71E08893000AD0E8B /* dualanalog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88317F1DE5C0090372A /* dualanalog.cpp */; }; + B340E5A81E08893000AD0E8B /* huc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81517F1DE5C0090372A /* huc.cpp */; }; + B340E5A91E08893000AD0E8B /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9B17F1DE5E0090372A /* memory.cpp */; }; + B340E5AA1E08893000AD0E8B /* cdplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94817C2A1922B45500FDFC99 /* cdplay.cpp */; }; + B340E5AB1E08893000AD0E8B /* eeprom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9217F1DE5D0090372A /* eeprom.cpp */; }; + B340E5AC1E08893000AD0E8B /* vce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82D17F1DE5C0090372A /* vce.cpp */; }; + B340E5AD1E08893000AD0E8B /* window.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC4A17F1DE5D0090372A /* window.c */; }; + B340E5AE1E08893000AD0E8B /* quicklz.c in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6541A75DC2D001F174F /* quicklz.c */; }; + B340E5AF1E08893000AD0E8B /* CDAFReader_MPC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B082451A8697EF00D3C0BC /* CDAFReader_MPC.cpp */; }; + B340E5B01E08893000AD0E8B /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8A817F1DE5C0090372A /* timer.cpp */; }; + B340E5B11E08893000AD0E8B /* Blip_Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0917F1DE5D0090372A /* Blip_Buffer.cpp */; }; + B340E5B21E08893000AD0E8B /* tsushinkb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81C17F1DE5C0090372A /* tsushinkb.cpp */; }; + B340E5B31E08893000AD0E8B /* mcgenjin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82217F1DE5C0090372A /* mcgenjin.cpp */; }; + B340E5B41E08893000AD0E8B /* pcfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86017F1DE5C0090372A /* pcfx.cpp */; }; + B340E5B51E08893000AD0E8B /* gpu_polygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6421A75DB60001F174F /* gpu_polygon.cpp */; }; + B340E5B61E08893000AD0E8B /* gamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88717F1DE5C0090372A /* gamepad.cpp */; }; + B340E5B71E08893000AD0E8B /* vdc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D67317F1DE5B0090372A /* vdc.cpp */; }; + B340E5B81E08893000AD0E8B /* rainbow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86217F1DE5C0090372A /* rainbow.cpp */; }; + B340E5B91E08893000AD0E8B /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5C17F1DE5D0090372A /* timer.cpp */; }; + B340E5BA1E08893000AD0E8B /* GZFileStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B082511A86982900D3C0BC /* GZFileStream.cpp */; }; + B340E5BB1E08893000AD0E8B /* IPSPatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB6261A75D70C001F174F /* IPSPatcher.cpp */; }; + B340E5BC1E08893000AD0E8B /* rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68A17F1DE5B0090372A /* rom.cpp */; }; + B340E5BD1E08893000AD0E8B /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D54E17F1DE5A0090372A /* unzip.c */; }; + B340E5BE1E08893000AD0E8B /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D8B017F1DE5C0090372A /* resample.c */; }; + B340E5BF1E08893000AD0E8B /* cdromif.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52C17F1DE5A0090372A /* cdromif.cpp */; }; + B340E5C01E08893000AD0E8B /* comm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9454E32919516301005A5CFE /* comm.cpp */; }; + B340E5C11E08893000AD0E8B /* error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D5CF17F1DE5B0090372A /* error.cpp */; }; + B340E5C21E08893000AD0E8B /* pce.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82517F1DE5C0090372A /* pce.cpp */; }; + B340E5C31E08893000AD0E8B /* info.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3117F1DE5D0090372A /* info.c */; }; + B340E5C41E08893000AD0E8B /* king.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85A17F1DE5C0090372A /* king.cpp */; }; + B340E5C51E08893000AD0E8B /* resize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7817F1DE5D0090372A /* resize.cpp */; }; + B340E5C61E08893000AD0E8B /* v810_cpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D63B17F1DE5B0090372A /* v810_cpu.cpp */; }; + B340E5C71E08893000AD0E8B /* WAVRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0E17F1DE5D0090372A /* WAVRecord.cpp */; }; + B340E5C81E08893000AD0E8B /* block.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2617F1DE5D0090372A /* block.c */; }; + B340E5C91E08893000AD0E8B /* memcard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D88D17F1DE5C0090372A /* memcard.cpp */; }; + B340E5CA1E08893000AD0E8B /* gamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D84D17F1DE5C0090372A /* gamepad.cpp */; }; + B340E5CB1E08893000AD0E8B /* pce_psg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D66017F1DE5B0090372A /* pce_psg.cpp */; }; + B340E5CC1E08893000AD0E8B /* state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1217F1DE5D0090372A /* state.cpp */; }; + B340E5CD1E08893000AD0E8B /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D86617F1DE5C0090372A /* timer.cpp */; }; + B340E5CE1E08893000AD0E8B /* CDAFReader_Vorbis.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B082491A8697EF00D3C0BC /* CDAFReader_Vorbis.cpp */; }; + B340E5CF1E08893000AD0E8B /* floor0.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2E17F1DE5D0090372A /* floor0.c */; }; + B340E5D01E08893000AD0E8B /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D54417F1DE5A0090372A /* ioapi.c */; }; + B340E5D11E08893000AD0E8B /* mdct.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC3A17F1DE5D0090372A /* mdct.c */; }; + B340E5D21E08893000AD0E8B /* CDAccess_CCD.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D52617F1DE5A0090372A /* CDAccess_CCD.cpp */; }; + B340E5D31E08893000AD0E8B /* recover-raw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53A17F1DE5A0090372A /* recover-raw.cpp */; }; + B340E5D41E08893000AD0E8B /* scsicd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D53C17F1DE5A0090372A /* scsicd.cpp */; }; + B340E5D51E08893000AD0E8B /* tsushin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D82B17F1DE5C0090372A /* tsushin.cpp */; }; + B340E5D61E08893000AD0E8B /* font-data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC6A17F1DE5D0090372A /* font-data.cpp */; }; + B340E5D71E08893000AD0E8B /* floor1.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC2F17F1DE5D0090372A /* floor1.c */; }; + B340E5D81E08893000AD0E8B /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9817F1DE5D0090372A /* main.cpp */; }; + B340E5D91E08893000AD0E8B /* susie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D68C17F1DE5B0090372A /* susie.cpp */; }; + B340E5DA1E08893000AD0E8B /* jrevdct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D85617F1DE5C0090372A /* jrevdct.cpp */; }; + B340E5DB1E08893000AD0E8B /* gamepad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D81817F1DE5C0090372A /* gamepad.cpp */; }; + B340E5DC1E08893000AD0E8B /* escape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC1A17F1DE5D0090372A /* escape.cpp */; }; + B340E5DD1E08893000AD0E8B /* input.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC5817F1DE5D0090372A /* input.cpp */; }; + B340E5DE1E08893000AD0E8B /* resolve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC9017F1DE5D0090372A /* resolve.cpp */; }; + B340E5DF1E08893000AD0E8B /* Stereo_Buffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC0D17F1DE5D0090372A /* Stereo_Buffer.cpp */; }; + B340E5E01E08893000AD0E8B /* cputest.c in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D55217F1DE5A0090372A /* cputest.c */; }; + B340E5E21E08893000AD0E8B /* demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D55C17F1DE5A0090372A /* demo.cpp */; }; + B340E5E31E08893000AD0E8B /* sha256.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CFB62F1A75D73F001F174F /* sha256.cpp */; }; + B340E5E41E08893000AD0E8B /* primitives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3DC7517F1DE5D0090372A /* primitives.cpp */; }; + B340E5E71E0889FB00AD0E8B /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5E61E0889FB00AD0E8B /* libz.tbd */; }; + B340E5E91E088A0100AD0E8B /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5E81E088A0100AD0E8B /* libz.tbd */; }; + B340E5EB1E088A1100AD0E8B /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5EA1E088A1100AD0E8B /* libiconv.tbd */; }; + B340E5ED1E088A1E00AD0E8B /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5EC1E088A1E00AD0E8B /* libiconv.tbd */; }; + B340E5EF1E088A3500AD0E8B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5EE1E088A3500AD0E8B /* UIKit.framework */; }; + B340E5F11E088A3A00AD0E8B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5F01E088A3A00AD0E8B /* Foundation.framework */; }; + B340E5F31E088A4000AD0E8B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5F21E088A4000AD0E8B /* UIKit.framework */; }; + B340E5F51E088A4500AD0E8B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5F41E088A4500AD0E8B /* Foundation.framework */; }; + B340E5FB1E088AF100AD0E8B /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5FA1E088AF100AD0E8B /* PVSupport.framework */; }; + B340E5FD1E088AF700AD0E8B /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E5FC1E088AF700AD0E8B /* PVSupport.framework */; }; + B39578C91E6D57DD00854D7A /* neopop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D817F1DE5B0090372A /* neopop.cpp */; }; + B39578CA1E6D57DE00854D7A /* neopop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D817F1DE5B0090372A /* neopop.cpp */; }; + B39578CB1E6D57F900854D7A /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7C717F1DE5B0090372A /* bios.cpp */; }; + B39578CC1E6D57F900854D7A /* biosHLE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7C917F1DE5B0090372A /* biosHLE.cpp */; }; + B39578CD1E6D57F900854D7A /* dma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7CA17F1DE5B0090372A /* dma.cpp */; }; + B39578CE1E6D57FA00854D7A /* bios.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7C717F1DE5B0090372A /* bios.cpp */; }; + B39578CF1E6D57FA00854D7A /* biosHLE.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7C917F1DE5B0090372A /* biosHLE.cpp */; }; + B39578D01E6D57FA00854D7A /* dma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7CA17F1DE5B0090372A /* dma.cpp */; }; + B39578D11E6D582300854D7A /* flash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7CC17F1DE5B0090372A /* flash.cpp */; }; + B39578D21E6D582300854D7A /* gfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7CE17F1DE5B0090372A /* gfx.cpp */; }; + B39578D31E6D582300854D7A /* gfx_scanline_colour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D017F1DE5B0090372A /* gfx_scanline_colour.cpp */; }; + B39578D41E6D582300854D7A /* interrupt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D217F1DE5B0090372A /* interrupt.cpp */; }; + B39578D51E6D582300854D7A /* mem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D617F1DE5B0090372A /* mem.cpp */; }; + B39578D61E6D582300854D7A /* rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DA17F1DE5B0090372A /* rom.cpp */; }; + B39578D71E6D582300854D7A /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DB17F1DE5B0090372A /* rtc.cpp */; }; + B39578D81E6D582300854D7A /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DD17F1DE5B0090372A /* sound.cpp */; }; + B39578D91E6D582300854D7A /* T6W28_Apu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DF17F1DE5B0090372A /* T6W28_Apu.cpp */; }; + B39578DB1E6D582300854D7A /* flash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7CC17F1DE5B0090372A /* flash.cpp */; }; + B39578DC1E6D582300854D7A /* gfx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7CE17F1DE5B0090372A /* gfx.cpp */; }; + B39578DD1E6D582300854D7A /* gfx_scanline_colour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D017F1DE5B0090372A /* gfx_scanline_colour.cpp */; }; + B39578DE1E6D582300854D7A /* interrupt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D217F1DE5B0090372A /* interrupt.cpp */; }; + B39578DF1E6D582300854D7A /* mem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D617F1DE5B0090372A /* mem.cpp */; }; + B39578E01E6D582300854D7A /* rom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DA17F1DE5B0090372A /* rom.cpp */; }; + B39578E11E6D582300854D7A /* rtc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DB17F1DE5B0090372A /* rtc.cpp */; }; + B39578E21E6D582300854D7A /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DD17F1DE5B0090372A /* sound.cpp */; }; + B39578E31E6D582300854D7A /* T6W28_Apu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7DF17F1DE5B0090372A /* T6W28_Apu.cpp */; }; + B39578E51E6D583B00854D7A /* TLCS900h_disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E317F1DE5B0090372A /* TLCS900h_disassemble.cpp */; }; + B39578E61E6D583B00854D7A /* TLCS900h_disassemble_dst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E517F1DE5B0090372A /* TLCS900h_disassemble_dst.cpp */; }; + B39578E71E6D583B00854D7A /* TLCS900h_disassemble_extra.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E617F1DE5B0090372A /* TLCS900h_disassemble_extra.cpp */; }; + B39578E81E6D583B00854D7A /* TLCS900h_disassemble_reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E717F1DE5B0090372A /* TLCS900h_disassemble_reg.cpp */; }; + B39578E91E6D583B00854D7A /* TLCS900h_disassemble_src.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E817F1DE5B0090372A /* TLCS900h_disassemble_src.cpp */; }; + B39578EA1E6D583B00854D7A /* TLCS900h_interpret.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E917F1DE5B0090372A /* TLCS900h_interpret.cpp */; }; + B39578EB1E6D583B00854D7A /* TLCS900h_interpret_dst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7EB17F1DE5B0090372A /* TLCS900h_interpret_dst.cpp */; }; + B39578EC1E6D583B00854D7A /* TLCS900h_interpret_reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7ED17F1DE5B0090372A /* TLCS900h_interpret_reg.cpp */; }; + B39578ED1E6D583B00854D7A /* TLCS900h_interpret_single.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7EF17F1DE5B0090372A /* TLCS900h_interpret_single.cpp */; }; + B39578EE1E6D583B00854D7A /* TLCS900h_interpret_src.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7F117F1DE5B0090372A /* TLCS900h_interpret_src.cpp */; }; + B39578EF1E6D583B00854D7A /* TLCS900h_registers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7F317F1DE5B0090372A /* TLCS900h_registers.cpp */; }; + B39578F01E6D583C00854D7A /* TLCS900h_disassemble.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E317F1DE5B0090372A /* TLCS900h_disassemble.cpp */; }; + B39578F11E6D583C00854D7A /* TLCS900h_disassemble_dst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E517F1DE5B0090372A /* TLCS900h_disassemble_dst.cpp */; }; + B39578F21E6D583C00854D7A /* TLCS900h_disassemble_extra.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E617F1DE5B0090372A /* TLCS900h_disassemble_extra.cpp */; }; + B39578F31E6D583C00854D7A /* TLCS900h_disassemble_reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E717F1DE5B0090372A /* TLCS900h_disassemble_reg.cpp */; }; + B39578F41E6D583C00854D7A /* TLCS900h_disassemble_src.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E817F1DE5B0090372A /* TLCS900h_disassemble_src.cpp */; }; + B39578F51E6D583C00854D7A /* TLCS900h_interpret.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7E917F1DE5B0090372A /* TLCS900h_interpret.cpp */; }; + B39578F61E6D583C00854D7A /* TLCS900h_interpret_dst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7EB17F1DE5B0090372A /* TLCS900h_interpret_dst.cpp */; }; + B39578F71E6D583C00854D7A /* TLCS900h_interpret_reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7ED17F1DE5B0090372A /* TLCS900h_interpret_reg.cpp */; }; + B39578F81E6D583C00854D7A /* TLCS900h_interpret_single.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7EF17F1DE5B0090372A /* TLCS900h_interpret_single.cpp */; }; + B39578F91E6D583C00854D7A /* TLCS900h_interpret_src.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7F117F1DE5B0090372A /* TLCS900h_interpret_src.cpp */; }; + B39578FA1E6D583C00854D7A /* TLCS900h_registers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7F317F1DE5B0090372A /* TLCS900h_registers.cpp */; }; + B39578FB1E6D585C00854D7A /* Z80_interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D80417F1DE5B0090372A /* Z80_interface.cpp */; }; + B39578FC1E6D585D00854D7A /* Z80_interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D80417F1DE5B0090372A /* Z80_interface.cpp */; }; + B39578FD1E6D58FF00854D7A /* gfx_scanline_mono.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D117F1DE5B0090372A /* gfx_scanline_mono.cpp */; }; + B39578FE1E6D58FF00854D7A /* gfx_scanline_mono.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D7D117F1DE5B0090372A /* gfx_scanline_mono.cpp */; }; + B39578FF1E6D591E00854D7A /* z80_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D64C17F1DE5B0090372A /* z80_ops.cpp */; }; + B39579001E6D591E00854D7A /* z80_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CB3D64C17F1DE5B0090372A /* z80_ops.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 27FF3AC11B1CF78F002F941E /* libsndfile_FLAC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsndfile_FLAC.a; path = libsndfile/libsndfile_FLAC.a; sourceTree = ""; }; + 8240861A0FFDD64600F0FE7D /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + 824088340FFDDCF400F0FE7D /* MednafenGameCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MednafenGameCore.h; sourceTree = ""; }; + 824088350FFDDCF400F0FE7D /* MednafenGameCore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MednafenGameCore.mm; sourceTree = ""; }; + 82CFBC510FFEF432002B6C7C /* Mednafen.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Mednafen.icns; sourceTree = ""; }; + 8305628B1A98C6AD0030F6DB /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; + 87CD091F1B3DFB3100021C64 /* SNSFLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SNSFLoader.cpp; sourceTree = ""; }; + 87CD09201B3DFB3100021C64 /* SNSFLoader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SNSFLoader.h; sourceTree = ""; }; + 87CD09211B3DFB4500021C64 /* SPCReader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SPCReader.cpp; sourceTree = ""; }; + 87CD09221B3DFB4500021C64 /* SPCReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SPCReader.h; sourceTree = ""; }; + 87CD09241B3DFB7600021C64 /* apu.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = apu.cpp; path = snes_faust/apu.cpp; sourceTree = ""; }; + 87CD09251B3DFB7600021C64 /* apu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = apu.h; path = snes_faust/apu.h; sourceTree = ""; }; + 87CD09261B3DFB7600021C64 /* cart.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cart.cpp; path = snes_faust/cart.cpp; sourceTree = ""; }; + 87CD09271B3DFB7600021C64 /* cart.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cart.h; path = snes_faust/cart.h; sourceTree = ""; }; + 87CD09281B3DFB7600021C64 /* cpu_loop_body.inc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.pascal; name = cpu_loop_body.inc; path = snes_faust/cpu_loop_body.inc; sourceTree = ""; }; + 87CD09291B3DFB7600021C64 /* cpu.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = cpu.cpp; path = snes_faust/cpu.cpp; sourceTree = ""; }; + 87CD092A1B3DFB7600021C64 /* cpu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cpu.h; path = snes_faust/cpu.h; sourceTree = ""; }; + 87CD092B1B3DFB7600021C64 /* dma.inc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.pascal; name = dma.inc; path = snes_faust/dma.inc; sourceTree = ""; }; + 87CD092C1B3DFB7600021C64 /* dsp.inc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.pascal; name = dsp.inc; path = snes_faust/dsp.inc; sourceTree = ""; }; + 87CD092D1B3DFB7600021C64 /* input.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = input.cpp; path = snes_faust/input.cpp; sourceTree = ""; }; + 87CD092E1B3DFB7600021C64 /* input.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = input.h; path = snes_faust/input.h; sourceTree = ""; }; + 87CD092F1B3DFB7600021C64 /* Makefile.am */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makefile.am; path = snes_faust/Makefile.am; sourceTree = ""; }; + 87CD09301B3DFB7600021C64 /* Makefile.in */ = {isa = PBXFileReference; lastKnownFileType = text; name = Makefile.in; path = snes_faust/Makefile.in; sourceTree = ""; }; + 87CD09311B3DFB7600021C64 /* PPU_DESIGN */ = {isa = PBXFileReference; lastKnownFileType = text; name = PPU_DESIGN; path = snes_faust/PPU_DESIGN; sourceTree = ""; }; + 87CD09321B3DFB7600021C64 /* ppu.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ppu.cpp; path = snes_faust/ppu.cpp; sourceTree = ""; }; + 87CD09331B3DFB7600021C64 /* ppu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ppu.h; path = snes_faust/ppu.h; sourceTree = ""; }; + 87CD09341B3DFB7600021C64 /* snes.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = snes.cpp; path = snes_faust/snes.cpp; sourceTree = ""; }; + 87CD09351B3DFB7600021C64 /* snes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = snes.h; path = snes_faust/snes.h; sourceTree = ""; }; + 87CD09361B3DFB7600021C64 /* spc700.inc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.pascal; name = spc700.inc; path = snes_faust/spc700.inc; sourceTree = ""; }; + 87DC74711AE45DCF006F1CD7 /* notes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = notes; sourceTree = ""; }; + 87DC74721AE45E31006F1CD7 /* notes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = notes; sourceTree = ""; }; + 8CB3D52417F1DE5A0090372A /* CDAccess.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAccess.cpp; sourceTree = ""; }; + 8CB3D52517F1DE5A0090372A /* CDAccess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAccess.h; sourceTree = ""; }; + 8CB3D52617F1DE5A0090372A /* CDAccess_CCD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAccess_CCD.cpp; sourceTree = ""; }; + 8CB3D52717F1DE5A0090372A /* CDAccess_CCD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAccess_CCD.h; sourceTree = ""; }; + 8CB3D52817F1DE5A0090372A /* CDAccess_Image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAccess_Image.cpp; sourceTree = ""; }; + 8CB3D52917F1DE5A0090372A /* CDAccess_Image.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAccess_Image.h; sourceTree = ""; }; + 8CB3D52C17F1DE5A0090372A /* cdromif.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cdromif.cpp; sourceTree = ""; }; + 8CB3D52D17F1DE5A0090372A /* cdromif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cdromif.h; sourceTree = ""; }; + 8CB3D52E17F1DE5A0090372A /* CDUtility.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDUtility.cpp; sourceTree = ""; }; + 8CB3D52F17F1DE5A0090372A /* CDUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDUtility.h; sourceTree = ""; }; + 8CB3D53017F1DE5A0090372A /* crc32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = crc32.cpp; sourceTree = ""; }; + 8CB3D53117F1DE5A0090372A /* dvdisaster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dvdisaster.h; sourceTree = ""; }; + 8CB3D53217F1DE5A0090372A /* galois-inlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "galois-inlines.h"; sourceTree = ""; }; + 8CB3D53317F1DE5A0090372A /* galois.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = galois.cpp; sourceTree = ""; }; + 8CB3D53417F1DE5A0090372A /* l-ec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "l-ec.cpp"; sourceTree = ""; }; + 8CB3D53517F1DE5A0090372A /* lec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lec.cpp; sourceTree = ""; }; + 8CB3D53617F1DE5A0090372A /* lec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lec.h; sourceTree = ""; }; + 8CB3D53717F1DE5A0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D53A17F1DE5A0090372A /* recover-raw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "recover-raw.cpp"; sourceTree = ""; }; + 8CB3D53B17F1DE5A0090372A /* scsicd-pce-commands.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "scsicd-pce-commands.inc"; sourceTree = ""; }; + 8CB3D53C17F1DE5A0090372A /* scsicd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scsicd.cpp; sourceTree = ""; }; + 8CB3D53D17F1DE5A0090372A /* scsicd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scsicd.h; sourceTree = ""; }; + 8CB3D53F17F1DE5A0090372A /* SimpleFIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleFIFO.h; sourceTree = ""; }; + 8CB3D54417F1DE5A0090372A /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = ""; }; + 8CB3D54517F1DE5A0090372A /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = ""; }; + 8CB3D54617F1DE5A0090372A /* lzoconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lzoconf.h; sourceTree = ""; }; + 8CB3D54717F1DE5A0090372A /* lzodefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lzodefs.h; sourceTree = ""; }; + 8CB3D54817F1DE5A0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D54917F1DE5A0090372A /* minilzo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = minilzo.c; sourceTree = ""; }; + 8CB3D54A17F1DE5A0090372A /* minilzo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minilzo.h; sourceTree = ""; }; + 8CB3D54D17F1DE5A0090372A /* README.LZO */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.LZO; sourceTree = ""; }; + 8CB3D54E17F1DE5A0090372A /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = ""; }; + 8CB3D54F17F1DE5A0090372A /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = ""; }; + 8CB3D55117F1DE5A0090372A /* arm_cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arm_cpu.c; sourceTree = ""; }; + 8CB3D55217F1DE5A0090372A /* cputest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cputest.c; sourceTree = ""; }; + 8CB3D55317F1DE5A0090372A /* cputest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cputest.h; sourceTree = ""; }; + 8CB3D55417F1DE5A0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D55517F1DE5A0090372A /* ppc_cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ppc_cpu.c; sourceTree = ""; }; + 8CB3D55617F1DE5A0090372A /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 8CB3D55717F1DE5A0090372A /* x86_cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x86_cpu.c; sourceTree = ""; }; + 8CB3D55817F1DE5A0090372A /* x86_cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x86_cpu.h; sourceTree = ""; }; + 8CB3D55917F1DE5A0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3D55A17F1DE5A0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3D55C17F1DE5A0090372A /* demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = demo.cpp; sourceTree = ""; }; + 8CB3D55D17F1DE5A0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D55E17F1DE5A0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D56017F1DE5A0090372A /* desa68.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = desa68.c; sourceTree = ""; }; + 8CB3D56117F1DE5A0090372A /* desa68.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = desa68.h; sourceTree = ""; }; + 8CB3D56217F1DE5A0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D56317F1DE5A0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D56417F1DE5A0090372A /* dis6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dis6502.cpp; sourceTree = ""; }; + 8CB3D56517F1DE5A0090372A /* dis6502.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dis6502.h; sourceTree = ""; }; + 8CB3D56617F1DE5A0090372A /* driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = driver.h; sourceTree = ""; }; + 8CB3D56817F1DE5A0090372A /* 2xSaI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 2xSaI.cpp; sourceTree = ""; }; + 8CB3D56917F1DE5A0090372A /* 2xSaI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 2xSaI.h; sourceTree = ""; }; + 8CB3D56A17F1DE5A0090372A /* args.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = args.cpp; sourceTree = ""; }; + 8CB3D56B17F1DE5A0090372A /* args.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = args.h; sourceTree = ""; }; + 8CB3D56C17F1DE5A0090372A /* cheat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cheat.cpp; sourceTree = ""; }; + 8CB3D56D17F1DE5A0090372A /* cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheat.h; sourceTree = ""; }; + 8CB3D56E17F1DE5A0090372A /* console.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = console.cpp; sourceTree = ""; }; + 8CB3D56F17F1DE5A0090372A /* console.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = console.h; sourceTree = ""; }; + 8CB3D57017F1DE5A0090372A /* debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debugger.cpp; sourceTree = ""; }; + 8CB3D57117F1DE5A0090372A /* debugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debugger.h; sourceTree = ""; }; + 8CB3D57217F1DE5A0090372A /* ers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ers.cpp; sourceTree = ""; }; + 8CB3D57317F1DE5A0090372A /* ers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ers.h; sourceTree = ""; }; + 8CB3D57417F1DE5A0090372A /* fps.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fps.cpp; sourceTree = ""; }; + 8CB3D57517F1DE5A0090372A /* fps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fps.h; sourceTree = ""; }; + 8CB3D57617F1DE5A0090372A /* gfxdebugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gfxdebugger.cpp; sourceTree = ""; }; + 8CB3D57717F1DE5A0090372A /* gfxdebugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gfxdebugger.h; sourceTree = ""; }; + 8CB3D57817F1DE5A0090372A /* help.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = help.cpp; sourceTree = ""; }; + 8CB3D57917F1DE5A0090372A /* help.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = help.h; sourceTree = ""; }; + 8CB3D57A17F1DE5A0090372A /* hq2x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq2x.cpp; sourceTree = ""; }; + 8CB3D57B17F1DE5A0090372A /* hq3x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq3x.cpp; sourceTree = ""; }; + 8CB3D57C17F1DE5A0090372A /* hq4x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq4x.cpp; sourceTree = ""; }; + 8CB3D57D17F1DE5A0090372A /* hqxx-common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "hqxx-common.cpp"; sourceTree = ""; }; + 8CB3D57E17F1DE5A0090372A /* hqxx-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "hqxx-common.h"; sourceTree = ""; }; + 8CB3D57F17F1DE5A0090372A /* icon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = icon.h; sourceTree = ""; }; + 8CB3D58017F1DE5A0090372A /* input-config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "input-config.cpp"; sourceTree = ""; }; + 8CB3D58117F1DE5A0090372A /* input-config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "input-config.h"; sourceTree = ""; }; + 8CB3D58217F1DE5A0090372A /* input-default-buttons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "input-default-buttons.h"; sourceTree = ""; }; + 8CB3D58317F1DE5A0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3D58417F1DE5A0090372A /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8CB3D58517F1DE5A0090372A /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick.cpp; sourceTree = ""; }; + 8CB3D58617F1DE5A0090372A /* Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick.h; sourceTree = ""; }; + 8CB3D58717F1DE5A0090372A /* Joystick_DX5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick_DX5.cpp; sourceTree = ""; }; + 8CB3D58817F1DE5A0090372A /* Joystick_DX5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick_DX5.h; sourceTree = ""; }; + 8CB3D58B17F1DE5A0090372A /* Joystick_Linux.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick_Linux.cpp; sourceTree = ""; }; + 8CB3D58C17F1DE5A0090372A /* Joystick_Linux.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick_Linux.h; sourceTree = ""; }; + 8CB3D58D17F1DE5A0090372A /* Joystick_SDL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick_SDL.cpp; sourceTree = ""; }; + 8CB3D58E17F1DE5A0090372A /* Joystick_SDL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick_SDL.h; sourceTree = ""; }; + 8CB3D58F17F1DE5A0090372A /* Joystick_XInput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick_XInput.cpp; sourceTree = ""; }; + 8CB3D59017F1DE5A0090372A /* Joystick_XInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick_XInput.h; sourceTree = ""; }; + 8CB3D59117F1DE5A0090372A /* logdebugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logdebugger.cpp; sourceTree = ""; }; + 8CB3D59217F1DE5A0090372A /* logdebugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logdebugger.h; sourceTree = ""; }; + 8CB3D59317F1DE5A0090372A /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 8CB3D59417F1DE5A0090372A /* main.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = main.h; sourceTree = ""; }; + 8CB3D59517F1DE5A0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D59617F1DE5A0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D59717F1DE5A0090372A /* memdebugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memdebugger.cpp; sourceTree = ""; }; + 8CB3D59817F1DE5A0090372A /* memdebugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memdebugger.h; sourceTree = ""; }; + 8CB3D59917F1DE5A0090372A /* NetClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetClient.h; sourceTree = ""; }; + 8CB3D59A17F1DE5A0090372A /* NetClient_POSIX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetClient_POSIX.cpp; sourceTree = ""; }; + 8CB3D59B17F1DE5A0090372A /* NetClient_POSIX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetClient_POSIX.h; sourceTree = ""; }; + 8CB3D59C17F1DE5A0090372A /* NetClient_WS2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetClient_WS2.cpp; sourceTree = ""; }; + 8CB3D59D17F1DE5B0090372A /* NetClient_WS2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetClient_WS2.h; sourceTree = ""; }; + 8CB3D59E17F1DE5B0090372A /* netplay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = netplay.cpp; sourceTree = ""; }; + 8CB3D59F17F1DE5B0090372A /* netplay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netplay.h; sourceTree = ""; }; + 8CB3D5A017F1DE5B0090372A /* nnx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nnx.cpp; sourceTree = ""; }; + 8CB3D5A117F1DE5B0090372A /* nnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nnx.h; sourceTree = ""; }; + 8CB3D5A217F1DE5B0090372A /* nongl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nongl.cpp; sourceTree = ""; }; + 8CB3D5A317F1DE5B0090372A /* nongl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nongl.h; sourceTree = ""; }; + 8CB3D5A417F1DE5B0090372A /* opengl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opengl.cpp; sourceTree = ""; }; + 8CB3D5A517F1DE5B0090372A /* opengl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opengl.h; sourceTree = ""; }; + 8CB3D5A617F1DE5B0090372A /* overlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = overlay.cpp; sourceTree = ""; }; + 8CB3D5A717F1DE5B0090372A /* overlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = overlay.h; sourceTree = ""; }; + 8CB3D5A817F1DE5B0090372A /* prompt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = prompt.cpp; sourceTree = ""; }; + 8CB3D5A917F1DE5B0090372A /* prompt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prompt.h; sourceTree = ""; }; + 8CB3D5AA17F1DE5B0090372A /* remote.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remote.cpp; sourceTree = ""; }; + 8CB3D5AB17F1DE5B0090372A /* remote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remote.h; sourceTree = ""; }; + 8CB3D5AC17F1DE5B0090372A /* scale2x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scale2x.c; sourceTree = ""; }; + 8CB3D5AD17F1DE5B0090372A /* scale2x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scale2x.h; sourceTree = ""; }; + 8CB3D5AE17F1DE5B0090372A /* scale3x.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scale3x.c; sourceTree = ""; }; + 8CB3D5AF17F1DE5B0090372A /* scale3x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scale3x.h; sourceTree = ""; }; + 8CB3D5B017F1DE5B0090372A /* scalebit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = scalebit.c; sourceTree = ""; }; + 8CB3D5B117F1DE5B0090372A /* scalebit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalebit.h; sourceTree = ""; }; + 8CB3D5B217F1DE5B0090372A /* shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shader.cpp; sourceTree = ""; }; + 8CB3D5B317F1DE5B0090372A /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = ""; }; + 8CB3D5B417F1DE5B0090372A /* shader_sabr.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = shader_sabr.inc; sourceTree = ""; }; + 8CB3D5B517F1DE5B0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3D5B617F1DE5B0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3D5B717F1DE5B0090372A /* video-state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "video-state.cpp"; sourceTree = ""; }; + 8CB3D5B817F1DE5B0090372A /* video-state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "video-state.h"; sourceTree = ""; }; + 8CB3D5B917F1DE5B0090372A /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = video.cpp; sourceTree = ""; }; + 8CB3D5BA17F1DE5B0090372A /* video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video.h; sourceTree = ""; }; + 8CB3D5BC17F1DE5B0090372A /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick.cpp; sourceTree = ""; }; + 8CB3D5BD17F1DE5B0090372A /* Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick.h; sourceTree = ""; }; + 8CB3D5C017F1DE5B0090372A /* Joystick_DOS_Standard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick_DOS_Standard.cpp; sourceTree = ""; }; + 8CB3D5C117F1DE5B0090372A /* Joystick_DOS_Standard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick_DOS_Standard.h; sourceTree = ""; }; + 8CB3D5C417F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D5C617F1DE5B0090372A /* Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = ""; }; + 8CB3D5CA17F1DE5B0090372A /* Video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Video.h; sourceTree = ""; }; + 8CB3D5CC17F1DE5B0090372A /* Video_VGA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Video_VGA.h; sourceTree = ""; }; + 8CB3D5CD17F1DE5B0090372A /* endian.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = endian.cpp; sourceTree = ""; }; + 8CB3D5CE17F1DE5B0090372A /* endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = endian.h; sourceTree = ""; }; + 8CB3D5CF17F1DE5B0090372A /* error.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = error.cpp; sourceTree = ""; }; + 8CB3D5D017F1DE5B0090372A /* error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = error.h; sourceTree = ""; }; + 8CB3D5D117F1DE5B0090372A /* file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = file.cpp; sourceTree = ""; }; + 8CB3D5D217F1DE5B0090372A /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = ""; }; + 8CB3D5D317F1DE5B0090372A /* FileStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileStream.cpp; sourceTree = ""; }; + 8CB3D5D417F1DE5B0090372A /* FileStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileStream.h; sourceTree = ""; }; + 8CB3D5D817F1DE5B0090372A /* gb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gb.cpp; sourceTree = ""; }; + 8CB3D5D917F1DE5B0090372A /* gb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gb.h; sourceTree = ""; }; + 8CB3D5DA17F1DE5B0090372A /* gbCodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gbCodes.h; sourceTree = ""; }; + 8CB3D5DB17F1DE5B0090372A /* gbCodesCB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gbCodesCB.h; sourceTree = ""; }; + 8CB3D5DC17F1DE5B0090372A /* gbGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gbGlobals.cpp; sourceTree = ""; }; + 8CB3D5DD17F1DE5B0090372A /* gbGlobals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gbGlobals.h; sourceTree = ""; }; + 8CB3D5DE17F1DE5B0090372A /* gfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gfx.cpp; sourceTree = ""; }; + 8CB3D5DF17F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D5E017F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D5E117F1DE5B0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3D5E217F1DE5B0090372A /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 8CB3D5E317F1DE5B0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3D5E417F1DE5B0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3D5E517F1DE5B0090372A /* z80.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = z80.cpp; sourceTree = ""; }; + 8CB3D5E617F1DE5B0090372A /* z80.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = z80.h; sourceTree = ""; }; + 8CB3D5E817F1DE5B0090372A /* arm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = arm.cpp; sourceTree = ""; }; + 8CB3D5E917F1DE5B0090372A /* arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arm.h; sourceTree = ""; }; + 8CB3D5EA17F1DE5B0090372A /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bios.cpp; sourceTree = ""; }; + 8CB3D5EB17F1DE5B0090372A /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bios.h; sourceTree = ""; }; + 8CB3D5EC17F1DE5B0090372A /* eeprom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eeprom.cpp; sourceTree = ""; }; + 8CB3D5ED17F1DE5B0090372A /* eeprom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eeprom.h; sourceTree = ""; }; + 8CB3D5EE17F1DE5B0090372A /* flash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flash.cpp; sourceTree = ""; }; + 8CB3D5EF17F1DE5B0090372A /* flash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flash.h; sourceTree = ""; }; + 8CB3D5F017F1DE5B0090372A /* GBA.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GBA.cpp; sourceTree = ""; }; + 8CB3D5F117F1DE5B0090372A /* GBA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GBA.h; sourceTree = ""; }; + 8CB3D5F217F1DE5B0090372A /* GBAinline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GBAinline.cpp; sourceTree = ""; }; + 8CB3D5F317F1DE5B0090372A /* GBAinline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GBAinline.h; sourceTree = ""; }; + 8CB3D5F417F1DE5B0090372A /* gfx-draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gfx-draw.h"; sourceTree = ""; }; + 8CB3D5F517F1DE5B0090372A /* Gfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gfx.cpp; sourceTree = ""; }; + 8CB3D5F617F1DE5B0090372A /* Gfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gfx.h; sourceTree = ""; }; + 8CB3D5F717F1DE5B0090372A /* Globals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Globals.cpp; sourceTree = ""; }; + 8CB3D5F817F1DE5B0090372A /* Globals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Globals.h; sourceTree = ""; }; + 8CB3D5F917F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D5FA17F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D5FB17F1DE5B0090372A /* Mode0.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode0.cpp; sourceTree = ""; }; + 8CB3D5FC17F1DE5B0090372A /* Mode1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode1.cpp; sourceTree = ""; }; + 8CB3D5FD17F1DE5B0090372A /* Mode2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode2.cpp; sourceTree = ""; }; + 8CB3D5FE17F1DE5B0090372A /* Mode3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode3.cpp; sourceTree = ""; }; + 8CB3D5FF17F1DE5B0090372A /* Mode4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode4.cpp; sourceTree = ""; }; + 8CB3D60017F1DE5B0090372A /* Mode5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mode5.cpp; sourceTree = ""; }; + 8CB3D60117F1DE5B0090372A /* myrom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = myrom.h; sourceTree = ""; }; + 8CB3D60217F1DE5B0090372A /* Port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Port.h; sourceTree = ""; }; + 8CB3D60317F1DE5B0090372A /* RTC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTC.cpp; sourceTree = ""; }; + 8CB3D60417F1DE5B0090372A /* RTC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTC.h; sourceTree = ""; }; + 8CB3D60517F1DE5B0090372A /* Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = ""; }; + 8CB3D60617F1DE5B0090372A /* Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = ""; }; + 8CB3D60717F1DE5B0090372A /* sram.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sram.cpp; sourceTree = ""; }; + 8CB3D60817F1DE5B0090372A /* sram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sram.h; sourceTree = ""; }; + 8CB3D60917F1DE5B0090372A /* thumb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thumb.cpp; sourceTree = ""; }; + 8CB3D60A17F1DE5B0090372A /* thumb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thumb.h; sourceTree = ""; }; + 8CB3D60B17F1DE5B0090372A /* general.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = general.cpp; sourceTree = ""; }; + 8CB3D60C17F1DE5B0090372A /* general.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = general.h; sourceTree = ""; }; + 8CB3D60D17F1DE5B0090372A /* gettext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gettext.h; sourceTree = ""; }; + 8CB3D60E17F1DE5B0090372A /* git.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = git.h; sourceTree = ""; }; + 8CB3D61217F1DE5B0090372A /* c68k.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = c68k.h; sourceTree = ""; }; + 8CB3D61317F1DE5B0090372A /* c68k_ini.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_ini.inc; sourceTree = ""; }; + 8CB3D61417F1DE5B0090372A /* c68k_op0.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op0.inc; sourceTree = ""; }; + 8CB3D61517F1DE5B0090372A /* c68k_op1.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op1.inc; sourceTree = ""; }; + 8CB3D61617F1DE5B0090372A /* c68k_op2.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op2.inc; sourceTree = ""; }; + 8CB3D61717F1DE5B0090372A /* c68k_op3.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op3.inc; sourceTree = ""; }; + 8CB3D61817F1DE5B0090372A /* c68k_op4.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op4.inc; sourceTree = ""; }; + 8CB3D61917F1DE5B0090372A /* c68k_op5.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op5.inc; sourceTree = ""; }; + 8CB3D61A17F1DE5B0090372A /* c68k_op6.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op6.inc; sourceTree = ""; }; + 8CB3D61B17F1DE5B0090372A /* c68k_op7.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op7.inc; sourceTree = ""; }; + 8CB3D61C17F1DE5B0090372A /* c68k_op8.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op8.inc; sourceTree = ""; }; + 8CB3D61D17F1DE5B0090372A /* c68k_op9.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_op9.inc; sourceTree = ""; }; + 8CB3D61E17F1DE5B0090372A /* c68k_opA.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_opA.inc; sourceTree = ""; }; + 8CB3D61F17F1DE5B0090372A /* c68k_opB.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_opB.inc; sourceTree = ""; }; + 8CB3D62017F1DE5B0090372A /* c68k_opC.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_opC.inc; sourceTree = ""; }; + 8CB3D62117F1DE5B0090372A /* c68k_opD.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_opD.inc; sourceTree = ""; }; + 8CB3D62217F1DE5B0090372A /* c68k_opE.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_opE.inc; sourceTree = ""; }; + 8CB3D62317F1DE5B0090372A /* c68k_opF.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68k_opF.inc; sourceTree = ""; }; + 8CB3D62517F1DE5B0090372A /* c68kmac.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = c68kmac.inc; sourceTree = ""; }; + 8CB3D62717F1DE5B0090372A /* gen68k.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gen68k.h; sourceTree = ""; }; + 8CB3D62817F1DE5B0090372A /* gen68k.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = gen68k.inc; sourceTree = ""; }; + 8CB3D62A17F1DE5B0090372A /* dis6280.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dis6280.cpp; sourceTree = ""; }; + 8CB3D62B17F1DE5B0090372A /* dis6280.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dis6280.h; sourceTree = ""; }; + 8CB3D62C17F1DE5B0090372A /* huc6280.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = huc6280.cpp; sourceTree = ""; }; + 8CB3D62D17F1DE5B0090372A /* huc6280.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huc6280.h; sourceTree = ""; }; + 8CB3D62E17F1DE5B0090372A /* huc6280_step.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = huc6280_step.inc; sourceTree = ""; }; + 8CB3D62F17F1DE5B0090372A /* ops.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = ops.inc; sourceTree = ""; }; + 8CB3D63017F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D63117F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D63B17F1DE5B0090372A /* v810_cpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = v810_cpu.cpp; sourceTree = ""; }; + 8CB3D63C17F1DE5B0090372A /* v810_cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = v810_cpu.h; sourceTree = ""; }; + 8CB3D63D17F1DE5B0090372A /* v810_cpuD.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = v810_cpuD.cpp; sourceTree = ""; }; + 8CB3D63E17F1DE5B0090372A /* v810_cpuD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = v810_cpuD.h; sourceTree = ""; }; + 8CB3D63F17F1DE5B0090372A /* v810_do_am.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = v810_do_am.h; sourceTree = ""; }; + 8CB3D64117F1DE5B0090372A /* v810_oploop.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = v810_oploop.inc; sourceTree = ""; }; + 8CB3D64217F1DE5B0090372A /* v810_opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = v810_opt.h; sourceTree = ""; }; + 8CB3D64417F1DE5B0090372A /* opcodes_base.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = opcodes_base.c; sourceTree = ""; }; + 8CB3D64517F1DE5B0090372A /* z80.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = z80.cpp; sourceTree = ""; }; + 8CB3D64617F1DE5B0090372A /* z80.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = z80.h; sourceTree = ""; }; + 8CB3D64717F1DE5B0090372A /* z80_cb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = z80_cb.c; sourceTree = ""; }; + 8CB3D64817F1DE5B0090372A /* z80_ddfd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = z80_ddfd.c; sourceTree = ""; }; + 8CB3D64917F1DE5B0090372A /* z80_ddfdcb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = z80_ddfdcb.c; sourceTree = ""; }; + 8CB3D64A17F1DE5B0090372A /* z80_ed.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = z80_ed.c; sourceTree = ""; }; + 8CB3D64B17F1DE5B0090372A /* z80_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = z80_macros.h; sourceTree = ""; }; + 8CB3D64C17F1DE5B0090372A /* z80_ops.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = z80_ops.cpp; sourceTree = ""; }; + 8CB3D64F17F1DE5B0090372A /* arcade_card.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = arcade_card.cpp; sourceTree = ""; }; + 8CB3D65017F1DE5B0090372A /* arcade_card.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arcade_card.h; sourceTree = ""; }; + 8CB3D65117F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D65217F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D65517F1DE5B0090372A /* blargg_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blargg_common.h; sourceTree = ""; }; + 8CB3D65617F1DE5B0090372A /* blargg_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blargg_config.h; sourceTree = ""; }; + 8CB3D65717F1DE5B0090372A /* blargg_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blargg_source.h; sourceTree = ""; }; + 8CB3D65817F1DE5B0090372A /* Gb_Apu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gb_Apu.cpp; sourceTree = ""; }; + 8CB3D65917F1DE5B0090372A /* Gb_Apu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gb_Apu.h; sourceTree = ""; }; + 8CB3D65A17F1DE5B0090372A /* Gb_Apu_State.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gb_Apu_State.cpp; sourceTree = ""; }; + 8CB3D65B17F1DE5B0090372A /* Gb_Oscs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gb_Oscs.cpp; sourceTree = ""; }; + 8CB3D65C17F1DE5B0090372A /* Gb_Oscs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gb_Oscs.h; sourceTree = ""; }; + 8CB3D65D17F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D65E17F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D66017F1DE5B0090372A /* pce_psg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pce_psg.cpp; sourceTree = ""; }; + 8CB3D66117F1DE5B0090372A /* pce_psg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pce_psg.h; sourceTree = ""; }; + 8CB3D66317F1DE5B0090372A /* Sms_Apu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sms_Apu.cpp; sourceTree = ""; }; + 8CB3D66417F1DE5B0090372A /* Sms_Apu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sms_Apu.h; sourceTree = ""; }; + 8CB3D66517F1DE5B0090372A /* Sms_Oscs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sms_Oscs.h; sourceTree = ""; }; + 8CB3D66717F1DE5B0090372A /* 2413tone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 2413tone.h; sourceTree = ""; }; + 8CB3D66817F1DE5B0090372A /* emu2413.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emu2413.cpp; sourceTree = ""; }; + 8CB3D66917F1DE5B0090372A /* emu2413.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emu2413.h; sourceTree = ""; }; + 8CB3D66B17F1DE5B0090372A /* Ym2612_Emu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Ym2612_Emu.cpp; sourceTree = ""; }; + 8CB3D66C17F1DE5B0090372A /* Ym2612_Emu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Ym2612_Emu.h; sourceTree = ""; }; + 8CB3D66D17F1DE5B0090372A /* ym2612_opeg.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = ym2612_opeg.inc; sourceTree = ""; }; + 8CB3D67317F1DE5B0090372A /* vdc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vdc.cpp; sourceTree = ""; }; + 8CB3D67417F1DE5B0090372A /* vdc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vdc.h; sourceTree = ""; }; + 8CB3D67517F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D67617F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D67717F1DE5B0090372A /* lepacker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lepacker.h; sourceTree = ""; }; + 8CB3D67917F1DE5B0090372A /* c6502mak.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = c6502mak.h; sourceTree = ""; }; + 8CB3D67A17F1DE5B0090372A /* c65c02.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = c65c02.cpp; sourceTree = ""; }; + 8CB3D67B17F1DE5B0090372A /* c65c02.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = c65c02.h; sourceTree = ""; }; + 8CB3D67C17F1DE5B0090372A /* cart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cart.cpp; sourceTree = ""; }; + 8CB3D67D17F1DE5B0090372A /* cart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cart.h; sourceTree = ""; }; + 8CB3D67E17F1DE5B0090372A /* license.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license.txt; sourceTree = ""; }; + 8CB3D67F17F1DE5B0090372A /* lynxbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lynxbase.h; sourceTree = ""; }; + 8CB3D68017F1DE5B0090372A /* lynxdef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lynxdef.h; sourceTree = ""; }; + 8CB3D68117F1DE5B0090372A /* machine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = machine.h; sourceTree = ""; }; + 8CB3D68217F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D68317F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D68417F1DE5B0090372A /* memmap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memmap.cpp; sourceTree = ""; }; + 8CB3D68517F1DE5B0090372A /* memmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memmap.h; sourceTree = ""; }; + 8CB3D68617F1DE5B0090372A /* mikie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mikie.cpp; sourceTree = ""; }; + 8CB3D68717F1DE5B0090372A /* mikie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mikie.h; sourceTree = ""; }; + 8CB3D68817F1DE5B0090372A /* ram.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ram.cpp; sourceTree = ""; }; + 8CB3D68917F1DE5B0090372A /* ram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ram.h; sourceTree = ""; }; + 8CB3D68A17F1DE5B0090372A /* rom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rom.cpp; sourceTree = ""; }; + 8CB3D68B17F1DE5B0090372A /* rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rom.h; sourceTree = ""; }; + 8CB3D68C17F1DE5B0090372A /* susie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = susie.cpp; sourceTree = ""; }; + 8CB3D68D17F1DE5B0090372A /* susie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = susie.h; sourceTree = ""; }; + 8CB3D68E17F1DE5B0090372A /* sysbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysbase.h; sourceTree = ""; }; + 8CB3D68F17F1DE5B0090372A /* system.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = system.cpp; sourceTree = ""; }; + 8CB3D69017F1DE5B0090372A /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = system.h; sourceTree = ""; }; + 8CB3D69117F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D69217F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D69417F1DE5B0090372A /* math_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_ops.h; sourceTree = ""; }; + 8CB3D69717F1DE5B0090372A /* cart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cart.cpp; sourceTree = ""; }; + 8CB3D69817F1DE5B0090372A /* cart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cart.h; sourceTree = ""; }; + 8CB3D69917F1DE5B0090372A /* map_eeprom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_eeprom.cpp; sourceTree = ""; }; + 8CB3D69A17F1DE5B0090372A /* map_eeprom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_eeprom.h; sourceTree = ""; }; + 8CB3D69B17F1DE5B0090372A /* map_ff.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_ff.cpp; sourceTree = ""; }; + 8CB3D69C17F1DE5B0090372A /* map_ff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_ff.h; sourceTree = ""; }; + 8CB3D69D17F1DE5B0090372A /* map_realtec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_realtec.cpp; sourceTree = ""; }; + 8CB3D69E17F1DE5B0090372A /* map_realtec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_realtec.h; sourceTree = ""; }; + 8CB3D69F17F1DE5B0090372A /* map_rmx3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_rmx3.cpp; sourceTree = ""; }; + 8CB3D6A017F1DE5B0090372A /* map_rmx3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_rmx3.h; sourceTree = ""; }; + 8CB3D6A117F1DE5B0090372A /* map_rom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_rom.cpp; sourceTree = ""; }; + 8CB3D6A217F1DE5B0090372A /* map_rom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_rom.h; sourceTree = ""; }; + 8CB3D6A317F1DE5B0090372A /* map_sbb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_sbb.cpp; sourceTree = ""; }; + 8CB3D6A417F1DE5B0090372A /* map_sbb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_sbb.h; sourceTree = ""; }; + 8CB3D6A517F1DE5B0090372A /* map_sram.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_sram.cpp; sourceTree = ""; }; + 8CB3D6A617F1DE5B0090372A /* map_sram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_sram.h; sourceTree = ""; }; + 8CB3D6A717F1DE5B0090372A /* map_ssf2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_ssf2.cpp; sourceTree = ""; }; + 8CB3D6A817F1DE5B0090372A /* map_ssf2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_ssf2.h; sourceTree = ""; }; + 8CB3D6A917F1DE5B0090372A /* map_svp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_svp.cpp; sourceTree = ""; }; + 8CB3D6AA17F1DE5B0090372A /* map_svp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_svp.h; sourceTree = ""; }; + 8CB3D6AB17F1DE5B0090372A /* map_yase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map_yase.cpp; sourceTree = ""; }; + 8CB3D6AC17F1DE5B0090372A /* map_yase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_yase.h; sourceTree = ""; }; + 8CB3D6AD17F1DE5B0090372A /* ssp16.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssp16.c; sourceTree = ""; }; + 8CB3D6AE17F1DE5B0090372A /* ssp16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssp16.h; sourceTree = ""; }; + 8CB3D6B017F1DE5B0090372A /* cd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cd.cpp; sourceTree = ""; }; + 8CB3D6B117F1DE5B0090372A /* cd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cd.h; sourceTree = ""; }; + 8CB3D6B217F1DE5B0090372A /* cdc_cdd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cdc_cdd.cpp; sourceTree = ""; }; + 8CB3D6B317F1DE5B0090372A /* cdc_cdd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cdc_cdd.h; sourceTree = ""; }; + 8CB3D6B417F1DE5B0090372A /* interrupt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interrupt.cpp; sourceTree = ""; }; + 8CB3D6B517F1DE5B0090372A /* interrupt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interrupt.h; sourceTree = ""; }; + 8CB3D6B617F1DE5B0090372A /* pcm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pcm.cpp; sourceTree = ""; }; + 8CB3D6B717F1DE5B0090372A /* pcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcm.h; sourceTree = ""; }; + 8CB3D6B817F1DE5B0090372A /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = ""; }; + 8CB3D6B917F1DE5B0090372A /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = ""; }; + 8CB3D6BB17F1DE5B0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3D6BC17F1DE5B0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3D6BD17F1DE5B0090372A /* genesis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = genesis.cpp; sourceTree = ""; }; + 8CB3D6BE17F1DE5B0090372A /* genesis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = genesis.h; sourceTree = ""; }; + 8CB3D6BF17F1DE5B0090372A /* genio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = genio.cpp; sourceTree = ""; }; + 8CB3D6C017F1DE5B0090372A /* genio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = genio.h; sourceTree = ""; }; + 8CB3D6C117F1DE5B0090372A /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; + 8CB3D6C217F1DE5B0090372A /* header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = header.h; sourceTree = ""; }; + 8CB3D6C317F1DE5B0090372A /* hvc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hvc.h; sourceTree = ""; }; + 8CB3D6C517F1DE5B0090372A /* gamepad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gamepad.cpp; sourceTree = ""; }; + 8CB3D6C617F1DE5B0090372A /* gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gamepad.h; sourceTree = ""; }; + 8CB3D6C917F1DE5B0090372A /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; + 8CB3D6CA17F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D6CB17F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D6CC17F1DE5B0090372A /* mem68k.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mem68k.cpp; sourceTree = ""; }; + 8CB3D6CD17F1DE5B0090372A /* mem68k.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem68k.h; sourceTree = ""; }; + 8CB3D6CE17F1DE5B0090372A /* membnk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = membnk.cpp; sourceTree = ""; }; + 8CB3D6CF17F1DE5B0090372A /* membnk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = membnk.h; sourceTree = ""; }; + 8CB3D6D017F1DE5B0090372A /* memvdp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memvdp.cpp; sourceTree = ""; }; + 8CB3D6D117F1DE5B0090372A /* memvdp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memvdp.h; sourceTree = ""; }; + 8CB3D6D217F1DE5B0090372A /* memz80.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memz80.cpp; sourceTree = ""; }; + 8CB3D6D317F1DE5B0090372A /* memz80.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memz80.h; sourceTree = ""; }; + 8CB3D6D517F1DE5B0090372A /* shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shared.h; sourceTree = ""; }; + 8CB3D6D617F1DE5B0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3D6D717F1DE5B0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3D6D817F1DE5B0090372A /* system.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = system.cpp; sourceTree = ""; }; + 8CB3D6D917F1DE5B0090372A /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = system.h; sourceTree = ""; }; + 8CB3D6DA17F1DE5B0090372A /* vcnt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vcnt.h; sourceTree = ""; }; + 8CB3D6DB17F1DE5B0090372A /* vdp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vdp.cpp; sourceTree = ""; }; + 8CB3D6DC17F1DE5B0090372A /* vdp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vdp.h; sourceTree = ""; }; + 8CB3D6DD17F1DE5B0090372A /* vdp_run.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = vdp_run.inc; sourceTree = ""; }; + 8CB3D6E017F1DE5B0090372A /* mednafen-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mednafen-driver.h"; sourceTree = ""; }; + 8CB3D6E117F1DE5B0090372A /* mednafen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mednafen.cpp; sourceTree = ""; }; + 8CB3D6E217F1DE5B0090372A /* mednafen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mednafen.h; sourceTree = ""; }; + 8CB3D6E317F1DE5B0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3D6E417F1DE5B0090372A /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 8CB3D6E517F1DE5B0090372A /* MemoryStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryStream.cpp; sourceTree = ""; }; + 8CB3D6E617F1DE5B0090372A /* MemoryStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryStream.h; sourceTree = ""; }; + 8CB3D6E717F1DE5B0090372A /* mempatcher-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mempatcher-driver.h"; sourceTree = ""; }; + 8CB3D6E817F1DE5B0090372A /* mempatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mempatcher.cpp; sourceTree = ""; }; + 8CB3D6E917F1DE5B0090372A /* mempatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mempatcher.h; sourceTree = ""; }; + 8CB3D6EA17F1DE5B0090372A /* movie-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "movie-driver.h"; sourceTree = ""; }; + 8CB3D6EB17F1DE5B0090372A /* movie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = movie.cpp; sourceTree = ""; }; + 8CB3D6EC17F1DE5B0090372A /* movie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = movie.h; sourceTree = ""; }; + 8CB3D6EE17F1DE5B0090372A /* !VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "!VERSION"; sourceTree = ""; }; + 8CB3D6EF17F1DE5B0090372A /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS; sourceTree = ""; }; + 8CB3D6F017F1DE5B0090372A /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ChangeLog; sourceTree = ""; }; + 8CB3D6F117F1DE5B0090372A /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; + 8CB3D6F217F1DE5B0090372A /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; + 8CB3D6F317F1DE5B0090372A /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crc32.c; sourceTree = ""; }; + 8CB3D6F417F1DE5B0090372A /* datatypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datatypes.h; sourceTree = ""; }; + 8CB3D6F517F1DE5B0090372A /* decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoder.h; sourceTree = ""; }; + 8CB3D6F817F1DE5B0090372A /* huffman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = huffman.c; sourceTree = ""; }; + 8CB3D6F917F1DE5B0090372A /* huffman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huffman.h; sourceTree = ""; }; + 8CB3D6FA17F1DE5B0090372A /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; + 8CB3D6FB17F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D6FC17F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D6FD17F1DE5B0090372A /* minimax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minimax.h; sourceTree = ""; }; + 8CB3D6FE17F1DE5B0090372A /* mpc_bits_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpc_bits_reader.c; sourceTree = ""; }; + 8CB3D6FF17F1DE5B0090372A /* mpc_bits_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpc_bits_reader.h; sourceTree = ""; }; + 8CB3D70017F1DE5B0090372A /* mpc_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpc_decoder.c; sourceTree = ""; }; + 8CB3D70117F1DE5B0090372A /* mpc_demux.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpc_demux.c; sourceTree = ""; }; + 8CB3D70217F1DE5B0090372A /* mpc_reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpc_reader.c; sourceTree = ""; }; + 8CB3D70317F1DE5B0090372A /* mpc_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpc_types.h; sourceTree = ""; }; + 8CB3D70417F1DE5B0090372A /* mpcdec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpcdec.h; sourceTree = ""; }; + 8CB3D70517F1DE5B0090372A /* mpcdec_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpcdec_math.h; sourceTree = ""; }; + 8CB3D70617F1DE5B0090372A /* mpcmath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpcmath.h; sourceTree = ""; }; + 8CB3D70717F1DE5B0090372A /* reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reader.h; sourceTree = ""; }; + 8CB3D70817F1DE5B0090372A /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 8CB3D70917F1DE5B0090372A /* requant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = requant.c; sourceTree = ""; }; + 8CB3D70A17F1DE5B0090372A /* requant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = requant.h; sourceTree = ""; }; + 8CB3D70B17F1DE5B0090372A /* streaminfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = streaminfo.c; sourceTree = ""; }; + 8CB3D70C17F1DE5B0090372A /* streaminfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = streaminfo.h; sourceTree = ""; }; + 8CB3D70D17F1DE5B0090372A /* synth_filter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = synth_filter.c; sourceTree = ""; }; + 8CB3D71117F1DE5B0090372A /* 107.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 107.cpp; sourceTree = ""; }; + 8CB3D71217F1DE5B0090372A /* 112.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 112.cpp; sourceTree = ""; }; + 8CB3D71317F1DE5B0090372A /* 113.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 113.cpp; sourceTree = ""; }; + 8CB3D71417F1DE5B0090372A /* 114.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 114.cpp; sourceTree = ""; }; + 8CB3D71517F1DE5B0090372A /* 117.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 117.cpp; sourceTree = ""; }; + 8CB3D71617F1DE5B0090372A /* 140.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 140.cpp; sourceTree = ""; }; + 8CB3D71717F1DE5B0090372A /* 15.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 15.cpp; sourceTree = ""; }; + 8CB3D71817F1DE5B0090372A /* 151.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 151.cpp; sourceTree = ""; }; + 8CB3D71917F1DE5B0090372A /* 152.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 152.cpp; sourceTree = ""; }; + 8CB3D71A17F1DE5B0090372A /* 156.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 156.cpp; sourceTree = ""; }; + 8CB3D71B17F1DE5B0090372A /* 16.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 16.cpp; sourceTree = ""; }; + 8CB3D71C17F1DE5B0090372A /* 163.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 163.cpp; sourceTree = ""; }; + 8CB3D71D17F1DE5B0090372A /* 18.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 18.cpp; sourceTree = ""; }; + 8CB3D71E17F1DE5B0090372A /* 180.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 180.cpp; sourceTree = ""; }; + 8CB3D71F17F1DE5B0090372A /* 182.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 182.cpp; sourceTree = ""; }; + 8CB3D72017F1DE5B0090372A /* 184.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 184.cpp; sourceTree = ""; }; + 8CB3D72117F1DE5B0090372A /* 185.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 185.cpp; sourceTree = ""; }; + 8CB3D72217F1DE5B0090372A /* 187.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 187.cpp; sourceTree = ""; }; + 8CB3D72317F1DE5B0090372A /* 189.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 189.cpp; sourceTree = ""; }; + 8CB3D72417F1DE5B0090372A /* 193.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 193.cpp; sourceTree = ""; }; + 8CB3D72517F1DE5B0090372A /* 208.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 208.cpp; sourceTree = ""; }; + 8CB3D72617F1DE5B0090372A /* 21.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 21.cpp; sourceTree = ""; }; + 8CB3D72717F1DE5B0090372A /* 22.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 22.cpp; sourceTree = ""; }; + 8CB3D72817F1DE5B0090372A /* 222.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 222.cpp; sourceTree = ""; }; + 8CB3D72917F1DE5B0090372A /* 228.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 228.cpp; sourceTree = ""; }; + 8CB3D72A17F1DE5B0090372A /* 23.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 23.cpp; sourceTree = ""; }; + 8CB3D72B17F1DE5B0090372A /* 232.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 232.cpp; sourceTree = ""; }; + 8CB3D72C17F1DE5B0090372A /* 234.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 234.cpp; sourceTree = ""; }; + 8CB3D72D17F1DE5B0090372A /* 240.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 240.cpp; sourceTree = ""; }; + 8CB3D72E17F1DE5B0090372A /* 241.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 241.cpp; sourceTree = ""; }; + 8CB3D72F17F1DE5B0090372A /* 242.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 242.cpp; sourceTree = ""; }; + 8CB3D73017F1DE5B0090372A /* 244.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 244.cpp; sourceTree = ""; }; + 8CB3D73117F1DE5B0090372A /* 246.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 246.cpp; sourceTree = ""; }; + 8CB3D73217F1DE5B0090372A /* 248.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 248.cpp; sourceTree = ""; }; + 8CB3D73317F1DE5B0090372A /* 25.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 25.cpp; sourceTree = ""; }; + 8CB3D73417F1DE5B0090372A /* 32.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 32.cpp; sourceTree = ""; }; + 8CB3D73517F1DE5B0090372A /* 33.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 33.cpp; sourceTree = ""; }; + 8CB3D73617F1DE5B0090372A /* 34.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 34.cpp; sourceTree = ""; }; + 8CB3D73717F1DE5B0090372A /* 38.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 38.cpp; sourceTree = ""; }; + 8CB3D73817F1DE5B0090372A /* 41.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 41.cpp; sourceTree = ""; }; + 8CB3D73917F1DE5B0090372A /* 42.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 42.cpp; sourceTree = ""; }; + 8CB3D73A17F1DE5B0090372A /* 46.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 46.cpp; sourceTree = ""; }; + 8CB3D73B17F1DE5B0090372A /* 51.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 51.cpp; sourceTree = ""; }; + 8CB3D73C17F1DE5B0090372A /* 65.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 65.cpp; sourceTree = ""; }; + 8CB3D73D17F1DE5B0090372A /* 67.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 67.cpp; sourceTree = ""; }; + 8CB3D73E17F1DE5B0090372A /* 68.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 68.cpp; sourceTree = ""; }; + 8CB3D73F17F1DE5B0090372A /* 70.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 70.cpp; sourceTree = ""; }; + 8CB3D74017F1DE5B0090372A /* 72.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 72.cpp; sourceTree = ""; }; + 8CB3D74117F1DE5B0090372A /* 73.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 73.cpp; sourceTree = ""; }; + 8CB3D74217F1DE5B0090372A /* 75.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 75.cpp; sourceTree = ""; }; + 8CB3D74317F1DE5B0090372A /* 76.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 76.cpp; sourceTree = ""; }; + 8CB3D74417F1DE5B0090372A /* 77.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 77.cpp; sourceTree = ""; }; + 8CB3D74517F1DE5B0090372A /* 78.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 78.cpp; sourceTree = ""; }; + 8CB3D74617F1DE5B0090372A /* 8.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 8.cpp; sourceTree = ""; }; + 8CB3D74717F1DE5B0090372A /* 80.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 80.cpp; sourceTree = ""; }; + 8CB3D74817F1DE5B0090372A /* 82.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 82.cpp; sourceTree = ""; }; + 8CB3D74917F1DE5B0090372A /* 8237.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 8237.cpp; sourceTree = ""; }; + 8CB3D74A17F1DE5B0090372A /* 86.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 86.cpp; sourceTree = ""; }; + 8CB3D74B17F1DE5B0090372A /* 87.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 87.cpp; sourceTree = ""; }; + 8CB3D74C17F1DE5B0090372A /* 88.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 88.cpp; sourceTree = ""; }; + 8CB3D74D17F1DE5B0090372A /* 89.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 89.cpp; sourceTree = ""; }; + 8CB3D74E17F1DE5B0090372A /* 90.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 90.cpp; sourceTree = ""; }; + 8CB3D74F17F1DE5B0090372A /* 92.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 92.cpp; sourceTree = ""; }; + 8CB3D75017F1DE5B0090372A /* 93.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 93.cpp; sourceTree = ""; }; + 8CB3D75117F1DE5B0090372A /* 94.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 94.cpp; sourceTree = ""; }; + 8CB3D75217F1DE5B0090372A /* 95.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 95.cpp; sourceTree = ""; }; + 8CB3D75317F1DE5B0090372A /* 96.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 96.cpp; sourceTree = ""; }; + 8CB3D75417F1DE5B0090372A /* 97.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 97.cpp; sourceTree = ""; }; + 8CB3D75517F1DE5B0090372A /* 99.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 99.cpp; sourceTree = ""; }; + 8CB3D75617F1DE5B0090372A /* codemasters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = codemasters.cpp; sourceTree = ""; }; + 8CB3D75717F1DE5B0090372A /* colordreams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = colordreams.cpp; sourceTree = ""; }; + 8CB3D75817F1DE5B0090372A /* deirom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = deirom.cpp; sourceTree = ""; }; + 8CB3D75917F1DE5B0090372A /* emu2413.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emu2413.cpp; sourceTree = ""; }; + 8CB3D75A17F1DE5B0090372A /* emu2413.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emu2413.h; sourceTree = ""; }; + 8CB3D75B17F1DE5B0090372A /* emutypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emutypes.h; sourceTree = ""; }; + 8CB3D75C17F1DE5B0090372A /* ffe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ffe.cpp; sourceTree = ""; }; + 8CB3D75D17F1DE5B0090372A /* fme7.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fme7.cpp; sourceTree = ""; }; + 8CB3D75E17F1DE5B0090372A /* h2288.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = h2288.cpp; sourceTree = ""; }; + 8CB3D75F17F1DE5B0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D76017F1DE5B0090372A /* malee.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = malee.cpp; sourceTree = ""; }; + 8CB3D76117F1DE5B0090372A /* mapinc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mapinc.h; sourceTree = ""; }; + 8CB3D76217F1DE5B0090372A /* maxicart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = maxicart.cpp; sourceTree = ""; }; + 8CB3D76317F1DE5B0090372A /* mmc1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmc1.cpp; sourceTree = ""; }; + 8CB3D76417F1DE5B0090372A /* mmc2and4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmc2and4.cpp; sourceTree = ""; }; + 8CB3D76517F1DE5B0090372A /* mmc3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmc3.cpp; sourceTree = ""; }; + 8CB3D76617F1DE5B0090372A /* mmc5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmc5.cpp; sourceTree = ""; }; + 8CB3D76717F1DE5B0090372A /* n106.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = n106.cpp; sourceTree = ""; }; + 8CB3D76817F1DE5B0090372A /* nina06.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nina06.cpp; sourceTree = ""; }; + 8CB3D76917F1DE5B0090372A /* novel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = novel.cpp; sourceTree = ""; }; + 8CB3D76A17F1DE5B0090372A /* sachen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sachen.cpp; sourceTree = ""; }; + 8CB3D76B17F1DE5B0090372A /* simple.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simple.cpp; sourceTree = ""; }; + 8CB3D76C17F1DE5B0090372A /* super24.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = super24.cpp; sourceTree = ""; }; + 8CB3D76D17F1DE5B0090372A /* supervision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = supervision.cpp; sourceTree = ""; }; + 8CB3D76E17F1DE5B0090372A /* tengen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tengen.cpp; sourceTree = ""; }; + 8CB3D76F17F1DE5B0090372A /* vrc6.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vrc6.cpp; sourceTree = ""; }; + 8CB3D77017F1DE5B0090372A /* vrc7.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vrc7.cpp; sourceTree = ""; }; + 8CB3D77117F1DE5B0090372A /* vrc7tone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vrc7tone.h; sourceTree = ""; }; + 8CB3D77217F1DE5B0090372A /* cart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cart.cpp; sourceTree = ""; }; + 8CB3D77317F1DE5B0090372A /* cart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cart.h; sourceTree = ""; }; + 8CB3D77517F1DE5B0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3D77617F1DE5B0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3D77817F1DE5B0090372A /* fds-sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "fds-sound.cpp"; sourceTree = ""; }; + 8CB3D77917F1DE5B0090372A /* fds-sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fds-sound.h"; sourceTree = ""; }; + 8CB3D77A17F1DE5B0090372A /* fds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fds.cpp; sourceTree = ""; }; + 8CB3D77B17F1DE5B0090372A /* fds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fds.h; sourceTree = ""; }; + 8CB3D77C17F1DE5B0090372A /* filter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter.cpp; sourceTree = ""; }; + 8CB3D77D17F1DE5B0090372A /* filter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; + 8CB3D77E17F1DE5B0090372A /* ines-bad.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "ines-bad.inc"; sourceTree = ""; }; + 8CB3D77F17F1DE5B0090372A /* ines-correct.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "ines-correct.inc"; sourceTree = ""; }; + 8CB3D78017F1DE5B0090372A /* ines.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ines.cpp; sourceTree = ""; }; + 8CB3D78117F1DE5B0090372A /* ines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ines.h; sourceTree = ""; }; + 8CB3D78317F1DE5B0090372A /* arkanoid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = arkanoid.cpp; sourceTree = ""; }; + 8CB3D78417F1DE5B0090372A /* bworld.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bworld.cpp; sourceTree = ""; }; + 8CB3D78517F1DE5B0090372A /* cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cursor.cpp; sourceTree = ""; }; + 8CB3D78617F1DE5B0090372A /* fkb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fkb.cpp; sourceTree = ""; }; + 8CB3D78717F1DE5B0090372A /* fkb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fkb.h; sourceTree = ""; }; + 8CB3D78817F1DE5B0090372A /* ftrainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ftrainer.cpp; sourceTree = ""; }; + 8CB3D78917F1DE5B0090372A /* hypershot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hypershot.cpp; sourceTree = ""; }; + 8CB3D78A17F1DE5B0090372A /* mahjong.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mahjong.cpp; sourceTree = ""; }; + 8CB3D78B17F1DE5B0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D78C17F1DE5B0090372A /* oekakids.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = oekakids.cpp; sourceTree = ""; }; + 8CB3D78D17F1DE5B0090372A /* partytap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = partytap.cpp; sourceTree = ""; }; + 8CB3D78E17F1DE5B0090372A /* powerpad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = powerpad.cpp; sourceTree = ""; }; + 8CB3D78F17F1DE5B0090372A /* shadow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = shadow.cpp; sourceTree = ""; }; + 8CB3D79017F1DE5B0090372A /* share.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = share.h; sourceTree = ""; }; + 8CB3D79117F1DE5B0090372A /* suborkb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = suborkb.cpp; sourceTree = ""; }; + 8CB3D79217F1DE5B0090372A /* suborkb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = suborkb.h; sourceTree = ""; }; + 8CB3D79317F1DE5B0090372A /* toprider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = toprider.cpp; sourceTree = ""; }; + 8CB3D79417F1DE5B0090372A /* zapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = zapper.cpp; sourceTree = ""; }; + 8CB3D79517F1DE5B0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3D79617F1DE5B0090372A /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8CB3D79717F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D79817F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D79917F1DE5B0090372A /* nes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nes.cpp; sourceTree = ""; }; + 8CB3D79A17F1DE5B0090372A /* nes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nes.h; sourceTree = ""; }; + 8CB3D79B17F1DE5B0090372A /* nsf.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nsf.cpp; sourceTree = ""; }; + 8CB3D79C17F1DE5B0090372A /* nsf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsf.h; sourceTree = ""; }; + 8CB3D79D17F1DE5B0090372A /* nsfe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nsfe.cpp; sourceTree = ""; }; + 8CB3D79E17F1DE5B0090372A /* nsfe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsfe.h; sourceTree = ""; }; + 8CB3D7A017F1DE5B0090372A /* benchmark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = benchmark.c; sourceTree = ""; }; + 8CB3D7A117F1DE5B0090372A /* changes.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = changes.txt; sourceTree = ""; }; + 8CB3D7A217F1DE5B0090372A /* demo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = demo.c; sourceTree = ""; }; + 8CB3D7A317F1DE5B0090372A /* LGPL.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LGPL.txt; sourceTree = ""; }; + 8CB3D7A417F1DE5B0090372A /* nes.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = nes.raw; sourceTree = ""; }; + 8CB3D7A517F1DE5B0090372A /* nes_ntsc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nes_ntsc.cpp; sourceTree = ""; }; + 8CB3D7A617F1DE5B0090372A /* nes_ntsc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nes_ntsc.h; sourceTree = ""; }; + 8CB3D7A717F1DE5B0090372A /* nes_ntsc.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = nes_ntsc.txt; sourceTree = ""; }; + 8CB3D7A817F1DE5B0090372A /* readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = readme.txt; sourceTree = ""; }; + 8CB3D7A917F1DE5B0090372A /* ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ops.h; sourceTree = ""; }; + 8CB3D7AB17F1DE5B0090372A /* fast-pputile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fast-pputile.h"; sourceTree = ""; }; + 8CB3D7AC17F1DE5B0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D7AD17F1DE5B0090372A /* palette.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = palette.cpp; sourceTree = ""; }; + 8CB3D7AE17F1DE5B0090372A /* palette.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = palette.h; sourceTree = ""; }; + 8CB3D7B017F1DE5B0090372A /* default.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = default.h; sourceTree = ""; }; + 8CB3D7B117F1DE5B0090372A /* rp2c04-0001.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "rp2c04-0001.h"; sourceTree = ""; }; + 8CB3D7B217F1DE5B0090372A /* rp2c04-0002.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "rp2c04-0002.h"; sourceTree = ""; }; + 8CB3D7B317F1DE5B0090372A /* rp2c04-0003.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "rp2c04-0003.h"; sourceTree = ""; }; + 8CB3D7B417F1DE5B0090372A /* rp2c04-0004.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "rp2c04-0004.h"; sourceTree = ""; }; + 8CB3D7B517F1DE5B0090372A /* rp2c0x.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rp2c0x.h; sourceTree = ""; }; + 8CB3D7B617F1DE5B0090372A /* ppu-fastrl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ppu-fastrl.h"; sourceTree = ""; }; + 8CB3D7B717F1DE5B0090372A /* ppu-subline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ppu-subline.h"; sourceTree = ""; }; + 8CB3D7B817F1DE5B0090372A /* ppu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ppu.cpp; sourceTree = ""; }; + 8CB3D7B917F1DE5B0090372A /* ppu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ppu.h; sourceTree = ""; }; + 8CB3D7BA17F1DE5B0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3D7BB17F1DE5B0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3D7BC17F1DE5B0090372A /* unif.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unif.cpp; sourceTree = ""; }; + 8CB3D7BD17F1DE5B0090372A /* unif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unif.h; sourceTree = ""; }; + 8CB3D7BE17F1DE5B0090372A /* vsuni.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vsuni.cpp; sourceTree = ""; }; + 8CB3D7BF17F1DE5B0090372A /* vsuni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vsuni.h; sourceTree = ""; }; + 8CB3D7C017F1DE5B0090372A /* x6502.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = x6502.cpp; sourceTree = ""; }; + 8CB3D7C117F1DE5B0090372A /* x6502.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x6502.h; sourceTree = ""; }; + 8CB3D7C217F1DE5B0090372A /* x6502struct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x6502struct.h; sourceTree = ""; }; + 8CB3D7C317F1DE5B0090372A /* netplay-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "netplay-driver.h"; sourceTree = ""; }; + 8CB3D7C417F1DE5B0090372A /* netplay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = netplay.cpp; sourceTree = ""; }; + 8CB3D7C517F1DE5B0090372A /* netplay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netplay.h; sourceTree = ""; }; + 8CB3D7C717F1DE5B0090372A /* bios.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bios.cpp; sourceTree = ""; }; + 8CB3D7C817F1DE5B0090372A /* bios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bios.h; sourceTree = ""; }; + 8CB3D7C917F1DE5B0090372A /* biosHLE.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = biosHLE.cpp; sourceTree = ""; }; + 8CB3D7CA17F1DE5B0090372A /* dma.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dma.cpp; sourceTree = ""; }; + 8CB3D7CB17F1DE5B0090372A /* dma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dma.h; sourceTree = ""; }; + 8CB3D7CC17F1DE5B0090372A /* flash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = flash.cpp; sourceTree = ""; }; + 8CB3D7CD17F1DE5B0090372A /* flash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flash.h; sourceTree = ""; }; + 8CB3D7CE17F1DE5B0090372A /* gfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gfx.cpp; sourceTree = ""; }; + 8CB3D7CF17F1DE5B0090372A /* gfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gfx.h; sourceTree = ""; }; + 8CB3D7D017F1DE5B0090372A /* gfx_scanline_colour.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gfx_scanline_colour.cpp; sourceTree = ""; }; + 8CB3D7D117F1DE5B0090372A /* gfx_scanline_mono.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gfx_scanline_mono.cpp; sourceTree = ""; }; + 8CB3D7D217F1DE5B0090372A /* interrupt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interrupt.cpp; sourceTree = ""; }; + 8CB3D7D317F1DE5B0090372A /* interrupt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interrupt.h; sourceTree = ""; }; + 8CB3D7D417F1DE5B0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D7D517F1DE5B0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D7D617F1DE5B0090372A /* mem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mem.cpp; sourceTree = ""; }; + 8CB3D7D717F1DE5B0090372A /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem.h; sourceTree = ""; }; + 8CB3D7D817F1DE5B0090372A /* neopop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = neopop.cpp; sourceTree = ""; }; + 8CB3D7D917F1DE5B0090372A /* neopop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = neopop.h; sourceTree = ""; }; + 8CB3D7DA17F1DE5B0090372A /* rom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rom.cpp; sourceTree = ""; }; + 8CB3D7DB17F1DE5B0090372A /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rtc.cpp; sourceTree = ""; }; + 8CB3D7DC17F1DE5B0090372A /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rtc.h; sourceTree = ""; }; + 8CB3D7DD17F1DE5B0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3D7DE17F1DE5B0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3D7DF17F1DE5B0090372A /* T6W28_Apu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = T6W28_Apu.cpp; sourceTree = ""; }; + 8CB3D7E017F1DE5B0090372A /* T6W28_Apu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = T6W28_Apu.h; sourceTree = ""; }; + 8CB3D7E117F1DE5B0090372A /* T6W28_Oscs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = T6W28_Oscs.h; sourceTree = ""; }; + 8CB3D7E317F1DE5B0090372A /* TLCS900h_disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_disassemble.cpp; sourceTree = ""; }; + 8CB3D7E417F1DE5B0090372A /* TLCS900h_disassemble.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_disassemble.h; sourceTree = ""; }; + 8CB3D7E517F1DE5B0090372A /* TLCS900h_disassemble_dst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_disassemble_dst.cpp; sourceTree = ""; }; + 8CB3D7E617F1DE5B0090372A /* TLCS900h_disassemble_extra.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_disassemble_extra.cpp; sourceTree = ""; }; + 8CB3D7E717F1DE5B0090372A /* TLCS900h_disassemble_reg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_disassemble_reg.cpp; sourceTree = ""; }; + 8CB3D7E817F1DE5B0090372A /* TLCS900h_disassemble_src.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_disassemble_src.cpp; sourceTree = ""; }; + 8CB3D7E917F1DE5B0090372A /* TLCS900h_interpret.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_interpret.cpp; sourceTree = ""; }; + 8CB3D7EA17F1DE5B0090372A /* TLCS900h_interpret.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_interpret.h; sourceTree = ""; }; + 8CB3D7EB17F1DE5B0090372A /* TLCS900h_interpret_dst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_interpret_dst.cpp; sourceTree = ""; }; + 8CB3D7EC17F1DE5B0090372A /* TLCS900h_interpret_dst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_interpret_dst.h; sourceTree = ""; }; + 8CB3D7ED17F1DE5B0090372A /* TLCS900h_interpret_reg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_interpret_reg.cpp; sourceTree = ""; }; + 8CB3D7EE17F1DE5B0090372A /* TLCS900h_interpret_reg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_interpret_reg.h; sourceTree = ""; }; + 8CB3D7EF17F1DE5B0090372A /* TLCS900h_interpret_single.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_interpret_single.cpp; sourceTree = ""; }; + 8CB3D7F017F1DE5B0090372A /* TLCS900h_interpret_single.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_interpret_single.h; sourceTree = ""; }; + 8CB3D7F117F1DE5B0090372A /* TLCS900h_interpret_src.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_interpret_src.cpp; sourceTree = ""; }; + 8CB3D7F217F1DE5B0090372A /* TLCS900h_interpret_src.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_interpret_src.h; sourceTree = ""; }; + 8CB3D7F317F1DE5B0090372A /* TLCS900h_registers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TLCS900h_registers.cpp; sourceTree = ""; }; + 8CB3D7F417F1DE5B0090372A /* TLCS900h_registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers.h; sourceTree = ""; }; + 8CB3D7F517F1DE5B0090372A /* TLCS900h_registers_mapB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapB.h; sourceTree = ""; }; + 8CB3D7F617F1DE5B0090372A /* TLCS900h_registers_mapCodeB0.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeB0.h; sourceTree = ""; }; + 8CB3D7F717F1DE5B0090372A /* TLCS900h_registers_mapCodeB1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeB1.h; sourceTree = ""; }; + 8CB3D7F817F1DE5B0090372A /* TLCS900h_registers_mapCodeB2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeB2.h; sourceTree = ""; }; + 8CB3D7F917F1DE5B0090372A /* TLCS900h_registers_mapCodeB3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeB3.h; sourceTree = ""; }; + 8CB3D7FA17F1DE5B0090372A /* TLCS900h_registers_mapCodeL0.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeL0.h; sourceTree = ""; }; + 8CB3D7FB17F1DE5B0090372A /* TLCS900h_registers_mapCodeL1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeL1.h; sourceTree = ""; }; + 8CB3D7FC17F1DE5B0090372A /* TLCS900h_registers_mapCodeL2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeL2.h; sourceTree = ""; }; + 8CB3D7FD17F1DE5B0090372A /* TLCS900h_registers_mapCodeL3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeL3.h; sourceTree = ""; }; + 8CB3D7FE17F1DE5B0090372A /* TLCS900h_registers_mapCodeW0.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeW0.h; sourceTree = ""; }; + 8CB3D7FF17F1DE5B0090372A /* TLCS900h_registers_mapCodeW1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeW1.h; sourceTree = ""; }; + 8CB3D80017F1DE5B0090372A /* TLCS900h_registers_mapCodeW2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeW2.h; sourceTree = ""; }; + 8CB3D80117F1DE5B0090372A /* TLCS900h_registers_mapCodeW3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapCodeW3.h; sourceTree = ""; }; + 8CB3D80217F1DE5B0090372A /* TLCS900h_registers_mapL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapL.h; sourceTree = ""; }; + 8CB3D80317F1DE5B0090372A /* TLCS900h_registers_mapW.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCS900h_registers_mapW.h; sourceTree = ""; }; + 8CB3D80417F1DE5B0090372A /* Z80_interface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Z80_interface.cpp; sourceTree = ""; }; + 8CB3D80517F1DE5B0090372A /* Z80_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Z80_interface.h; sourceTree = ""; }; + 8CB3D81017F1DE5C0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3D81117F1DE5C0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3D81317F1DE5C0090372A /* hes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hes.cpp; sourceTree = ""; }; + 8CB3D81417F1DE5C0090372A /* hes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hes.h; sourceTree = ""; }; + 8CB3D81517F1DE5C0090372A /* huc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = huc.cpp; sourceTree = ""; }; + 8CB3D81617F1DE5C0090372A /* huc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huc.h; sourceTree = ""; }; + 8CB3D81817F1DE5C0090372A /* gamepad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gamepad.cpp; sourceTree = ""; }; + 8CB3D81917F1DE5C0090372A /* gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gamepad.h; sourceTree = ""; }; + 8CB3D81A17F1DE5C0090372A /* mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mouse.cpp; sourceTree = ""; }; + 8CB3D81B17F1DE5C0090372A /* mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mouse.h; sourceTree = ""; }; + 8CB3D81C17F1DE5C0090372A /* tsushinkb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tsushinkb.cpp; sourceTree = ""; }; + 8CB3D81D17F1DE5C0090372A /* tsushinkb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tsushinkb.h; sourceTree = ""; }; + 8CB3D81E17F1DE5C0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3D81F17F1DE5C0090372A /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8CB3D82017F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D82117F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D82217F1DE5C0090372A /* mcgenjin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mcgenjin.cpp; sourceTree = ""; }; + 8CB3D82317F1DE5C0090372A /* mcgenjin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mcgenjin.h; sourceTree = ""; }; + 8CB3D82517F1DE5C0090372A /* pce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pce.cpp; sourceTree = ""; }; + 8CB3D82617F1DE5C0090372A /* pce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pce.h; sourceTree = ""; }; + 8CB3D82B17F1DE5C0090372A /* tsushin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tsushin.cpp; sourceTree = ""; }; + 8CB3D82C17F1DE5C0090372A /* tsushin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tsushin.h; sourceTree = ""; }; + 8CB3D82D17F1DE5C0090372A /* vce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vce.cpp; sourceTree = ""; }; + 8CB3D82E17F1DE5C0090372A /* vce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vce.h; sourceTree = ""; }; + 8CB3D82F17F1DE5C0090372A /* vce_sync.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = vce_sync.inc; sourceTree = ""; }; + 8CB3D83117F1DE5C0090372A /* hes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hes.cpp; sourceTree = ""; }; + 8CB3D83217F1DE5C0090372A /* hes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hes.h; sourceTree = ""; }; + 8CB3D83317F1DE5C0090372A /* huc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = huc.cpp; sourceTree = ""; }; + 8CB3D83417F1DE5C0090372A /* huc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huc.h; sourceTree = ""; }; + 8CB3D83517F1DE5C0090372A /* huc6280.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = huc6280.cpp; sourceTree = ""; }; + 8CB3D83617F1DE5C0090372A /* huc6280.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huc6280.h; sourceTree = ""; }; + 8CB3D83717F1DE5C0090372A /* huc6280_ops.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = huc6280_ops.inc; sourceTree = ""; }; + 8CB3D83817F1DE5C0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3D83917F1DE5C0090372A /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8CB3D83A17F1DE5C0090372A /* ioread.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = ioread.inc; sourceTree = ""; }; + 8CB3D83B17F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D83C17F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D83D17F1DE5C0090372A /* pce.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pce.cpp; sourceTree = ""; }; + 8CB3D83E17F1DE5C0090372A /* pce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pce.h; sourceTree = ""; }; + 8CB3D84117F1DE5C0090372A /* vdc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vdc.cpp; sourceTree = ""; }; + 8CB3D84217F1DE5C0090372A /* vdc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vdc.h; sourceTree = ""; }; + 8CB3D84317F1DE5C0090372A /* vpc_mix_inner.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = vpc_mix_inner.inc; sourceTree = ""; }; + 8CB3D84517F1DE5C0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3D84617F1DE5C0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3D84717F1DE5C0090372A /* fxscsi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fxscsi.cpp; sourceTree = ""; }; + 8CB3D84817F1DE5C0090372A /* fxscsi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fxscsi.h; sourceTree = ""; }; + 8CB3D84917F1DE5C0090372A /* gamedb.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = gamedb.inc; sourceTree = ""; }; + 8CB3D84A17F1DE5C0090372A /* huc6273.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = huc6273.cpp; sourceTree = ""; }; + 8CB3D84B17F1DE5C0090372A /* huc6273.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = huc6273.h; sourceTree = ""; }; + 8CB3D84D17F1DE5C0090372A /* gamepad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gamepad.cpp; sourceTree = ""; }; + 8CB3D84E17F1DE5C0090372A /* gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gamepad.h; sourceTree = ""; }; + 8CB3D84F17F1DE5C0090372A /* mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mouse.cpp; sourceTree = ""; }; + 8CB3D85017F1DE5C0090372A /* mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mouse.h; sourceTree = ""; }; + 8CB3D85117F1DE5C0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3D85217F1DE5C0090372A /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8CB3D85317F1DE5C0090372A /* interrupt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interrupt.cpp; sourceTree = ""; }; + 8CB3D85417F1DE5C0090372A /* interrupt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interrupt.h; sourceTree = ""; }; + 8CB3D85517F1DE5C0090372A /* io-handler.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "io-handler.inc"; sourceTree = ""; }; + 8CB3D85617F1DE5C0090372A /* jrevdct.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jrevdct.cpp; sourceTree = ""; }; + 8CB3D85717F1DE5C0090372A /* jrevdct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jrevdct.h; sourceTree = ""; }; + 8CB3D85817F1DE5C0090372A /* king-bgfast-blit.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "king-bgfast-blit.inc"; sourceTree = ""; }; + 8CB3D85917F1DE5C0090372A /* king-bgfast.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "king-bgfast.inc"; sourceTree = ""; }; + 8CB3D85A17F1DE5C0090372A /* king.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = king.cpp; sourceTree = ""; }; + 8CB3D85B17F1DE5C0090372A /* king.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = king.h; sourceTree = ""; }; + 8CB3D85C17F1DE5C0090372A /* king_mix_body.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = king_mix_body.inc; sourceTree = ""; }; + 8CB3D85D17F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D85E17F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D85F17F1DE5C0090372A /* mem-handler.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "mem-handler.inc"; sourceTree = ""; }; + 8CB3D86017F1DE5C0090372A /* pcfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pcfx.cpp; sourceTree = ""; }; + 8CB3D86117F1DE5C0090372A /* pcfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcfx.h; sourceTree = ""; }; + 8CB3D86217F1DE5C0090372A /* rainbow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rainbow.cpp; sourceTree = ""; }; + 8CB3D86317F1DE5C0090372A /* rainbow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rainbow.h; sourceTree = ""; }; + 8CB3D86417F1DE5C0090372A /* soundbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = soundbox.cpp; sourceTree = ""; }; + 8CB3D86517F1DE5C0090372A /* soundbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = soundbox.h; sourceTree = ""; }; + 8CB3D86617F1DE5C0090372A /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = ""; }; + 8CB3D86717F1DE5C0090372A /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = ""; }; + 8CB3D86817F1DE5C0090372A /* player.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = player.cpp; sourceTree = ""; }; + 8CB3D86917F1DE5C0090372A /* player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = player.h; sourceTree = ""; }; + 8CB3D86A17F1DE5C0090372A /* PSFLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PSFLoader.cpp; sourceTree = ""; }; + 8CB3D86B17F1DE5C0090372A /* PSFLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSFLoader.h; sourceTree = ""; }; + 8CB3D86D17F1DE5C0090372A /* cdc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cdc.cpp; sourceTree = ""; }; + 8CB3D86E17F1DE5C0090372A /* cdc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cdc.h; sourceTree = ""; }; + 8CB3D86F17F1DE5C0090372A /* cpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu.cpp; sourceTree = ""; }; + 8CB3D87017F1DE5C0090372A /* cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu.h; sourceTree = ""; }; + 8CB3D87117F1DE5C0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3D87217F1DE5C0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3D87317F1DE5C0090372A /* dis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dis.cpp; sourceTree = ""; }; + 8CB3D87417F1DE5C0090372A /* dis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dis.h; sourceTree = ""; }; + 8CB3D87517F1DE5C0090372A /* dma.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dma.cpp; sourceTree = ""; }; + 8CB3D87617F1DE5C0090372A /* dma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dma.h; sourceTree = ""; }; + 8CB3D87717F1DE5C0090372A /* frontio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = frontio.cpp; sourceTree = ""; }; + 8CB3D87817F1DE5C0090372A /* frontio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frontio.h; sourceTree = ""; }; + 8CB3D87917F1DE5C0090372A /* gpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gpu.cpp; sourceTree = ""; }; + 8CB3D87A17F1DE5C0090372A /* gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gpu.h; sourceTree = ""; }; + 8CB3D87F17F1DE5C0090372A /* gte.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gte.cpp; sourceTree = ""; }; + 8CB3D88017F1DE5C0090372A /* gte.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gte.h; sourceTree = ""; }; + 8CB3D88317F1DE5C0090372A /* dualanalog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dualanalog.cpp; sourceTree = ""; }; + 8CB3D88417F1DE5C0090372A /* dualanalog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dualanalog.h; sourceTree = ""; }; + 8CB3D88517F1DE5C0090372A /* dualshock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dualshock.cpp; sourceTree = ""; }; + 8CB3D88617F1DE5C0090372A /* dualshock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dualshock.h; sourceTree = ""; }; + 8CB3D88717F1DE5C0090372A /* gamepad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gamepad.cpp; sourceTree = ""; }; + 8CB3D88817F1DE5C0090372A /* gamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gamepad.h; sourceTree = ""; }; + 8CB3D88917F1DE5C0090372A /* guncon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = guncon.cpp; sourceTree = ""; }; + 8CB3D88A17F1DE5C0090372A /* guncon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guncon.h; sourceTree = ""; }; + 8CB3D88B17F1DE5C0090372A /* justifier.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = justifier.cpp; sourceTree = ""; }; + 8CB3D88C17F1DE5C0090372A /* justifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = justifier.h; sourceTree = ""; }; + 8CB3D88D17F1DE5C0090372A /* memcard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memcard.cpp; sourceTree = ""; }; + 8CB3D88E17F1DE5C0090372A /* memcard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memcard.h; sourceTree = ""; }; + 8CB3D88F17F1DE5C0090372A /* mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mouse.cpp; sourceTree = ""; }; + 8CB3D89017F1DE5C0090372A /* mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mouse.h; sourceTree = ""; }; + 8CB3D89117F1DE5C0090372A /* multitap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = multitap.cpp; sourceTree = ""; }; + 8CB3D89217F1DE5C0090372A /* multitap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = multitap.h; sourceTree = ""; }; + 8CB3D89317F1DE5C0090372A /* negcon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = negcon.cpp; sourceTree = ""; }; + 8CB3D89417F1DE5C0090372A /* negcon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = negcon.h; sourceTree = ""; }; + 8CB3D89517F1DE5C0090372A /* irq.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = irq.cpp; sourceTree = ""; }; + 8CB3D89617F1DE5C0090372A /* irq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irq.h; sourceTree = ""; }; + 8CB3D89717F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D89817F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D89917F1DE5C0090372A /* mdec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mdec.cpp; sourceTree = ""; }; + 8CB3D89A17F1DE5C0090372A /* mdec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdec.h; sourceTree = ""; }; + 8CB3D89D17F1DE5C0090372A /* psx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = psx.cpp; sourceTree = ""; }; + 8CB3D89E17F1DE5C0090372A /* psx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = psx.h; sourceTree = ""; }; + 8CB3D8A017F1DE5C0090372A /* sio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sio.cpp; sourceTree = ""; }; + 8CB3D8A117F1DE5C0090372A /* sio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sio.h; sourceTree = ""; }; + 8CB3D8A317F1DE5C0090372A /* spu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spu.cpp; sourceTree = ""; }; + 8CB3D8A417F1DE5C0090372A /* spu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spu.h; sourceTree = ""; }; + 8CB3D8A517F1DE5C0090372A /* spu_fir_table.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = spu_fir_table.inc; sourceTree = ""; }; + 8CB3D8A717F1DE5C0090372A /* spu_reverb.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = spu_reverb.inc; sourceTree = ""; }; + 8CB3D8A817F1DE5C0090372A /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = ""; }; + 8CB3D8A917F1DE5C0090372A /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = ""; }; + 8CB3D8AA17F1DE5C0090372A /* qtrecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qtrecord.cpp; sourceTree = ""; }; + 8CB3D8AB17F1DE5C0090372A /* qtrecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qtrecord.h; sourceTree = ""; }; + 8CB3D8AD17F1DE5C0090372A /* arch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arch.h; sourceTree = ""; }; + 8CB3D8AE17F1DE5C0090372A /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixed_generic.h; sourceTree = ""; }; + 8CB3D8AF17F1DE5C0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3D8B017F1DE5C0090372A /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; + 8CB3D8B117F1DE5C0090372A /* resample_sse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample_sse.h; sourceTree = ""; }; + 8CB3D8B217F1DE5C0090372A /* resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resampler.h; sourceTree = ""; }; + 8CB3D8B317F1DE5C0090372A /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack_alloc.h; sourceTree = ""; }; + 8CB3D8B417F1DE5C0090372A /* settings-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "settings-common.h"; sourceTree = ""; }; + 8CB3D8B517F1DE5C0090372A /* settings-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "settings-driver.h"; sourceTree = ""; }; + 8CB3D8B617F1DE5C0090372A /* settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = settings.cpp; sourceTree = ""; }; + 8CB3D8B717F1DE5C0090372A /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = settings.h; sourceTree = ""; }; + 8CB3D8B917F1DE5C0090372A /* convert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = convert.cpp; sourceTree = ""; }; + 8CB3D8BA17F1DE5C0090372A /* convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = convert.h; sourceTree = ""; }; + 8CB3D8BB17F1DE5C0090372A /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; + 8CB3D8BD17F1DE5C0090372A /* alsa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = alsa.cpp; sourceTree = ""; }; + 8CB3D8BE17F1DE5C0090372A /* dsound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsound.cpp; sourceTree = ""; }; + 8CB3D8BF17F1DE5C0090372A /* dummy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dummy.cpp; sourceTree = ""; }; + 8CB3D8C017F1DE5C0090372A /* jack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jack.cpp; sourceTree = ""; }; + 8CB3D8C117F1DE5C0090372A /* oss.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = oss.cpp; sourceTree = ""; }; + 8CB3D8C217F1DE5C0090372A /* sdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdl.cpp; sourceTree = ""; }; + 8CB3D8C317F1DE5C0090372A /* wasapi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wasapi.cpp; sourceTree = ""; }; + 8CB3D8C417F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D8C517F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D8C617F1DE5C0090372A /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 8CB3D8C717F1DE5C0090372A /* sexyal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sexyal.cpp; sourceTree = ""; }; + 8CB3D8C817F1DE5C0090372A /* sexyal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sexyal.h; sourceTree = ""; }; + 8CB3D8CA17F1DE5C0090372A /* cart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cart.cpp; sourceTree = ""; }; + 8CB3D8CB17F1DE5C0090372A /* cart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cart.h; sourceTree = ""; }; + 8CB3D8CD17F1DE5C0090372A /* changelog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = changelog; sourceTree = ""; }; + 8CB3D8CE17F1DE5C0090372A /* compatability.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = compatability.txt; sourceTree = ""; }; + 8CB3D8CF17F1DE5C0090372A /* license */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = license; sourceTree = ""; }; + 8CB3D8D017F1DE5C0090372A /* porting.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = porting.txt; sourceTree = ""; }; + 8CB3D8D117F1DE5C0090372A /* readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = readme.txt; sourceTree = ""; }; + 8CB3D8D217F1DE5C0090372A /* hvc.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = hvc.inc; sourceTree = ""; }; + 8CB3D8D317F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D8D417F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D8D517F1DE5C0090372A /* memz80.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memz80.cpp; sourceTree = ""; }; + 8CB3D8D617F1DE5C0090372A /* memz80.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memz80.h; sourceTree = ""; }; + 8CB3D8D717F1DE5C0090372A /* pio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pio.cpp; sourceTree = ""; }; + 8CB3D8D817F1DE5C0090372A /* pio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pio.h; sourceTree = ""; }; + 8CB3D8D917F1DE5C0090372A /* render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render.cpp; sourceTree = ""; }; + 8CB3D8DA17F1DE5C0090372A /* render.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render.h; sourceTree = ""; }; + 8CB3D8DB17F1DE5C0090372A /* romdb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = romdb.cpp; sourceTree = ""; }; + 8CB3D8DC17F1DE5C0090372A /* romdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = romdb.h; sourceTree = ""; }; + 8CB3D8DD17F1DE5C0090372A /* shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shared.h; sourceTree = ""; }; + 8CB3D8DE17F1DE5C0090372A /* sms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sms.cpp; sourceTree = ""; }; + 8CB3D8DF17F1DE5C0090372A /* sms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sms.h; sourceTree = ""; }; + 8CB3D8E017F1DE5C0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3D8E117F1DE5C0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3D8E217F1DE5C0090372A /* system.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = system.cpp; sourceTree = ""; }; + 8CB3D8E317F1DE5C0090372A /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = system.h; sourceTree = ""; }; + 8CB3D8E417F1DE5C0090372A /* tms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tms.cpp; sourceTree = ""; }; + 8CB3D8E517F1DE5C0090372A /* tms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tms.h; sourceTree = ""; }; + 8CB3D8E617F1DE5C0090372A /* vdp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vdp.cpp; sourceTree = ""; }; + 8CB3D8E717F1DE5C0090372A /* vdp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vdp.h; sourceTree = ""; }; + 8CB3D8E917F1DE5C0090372A /* interface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interface.cpp; sourceTree = ""; }; + 8CB3D8EA17F1DE5C0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3D8EB17F1DE5C0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3D8ED17F1DE5C0090372A /* base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = base.hpp; sourceTree = ""; }; + 8CB3D8EF17F1DE5C0090372A /* cartridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cartridge.cpp; sourceTree = ""; }; + 8CB3D8F017F1DE5C0090372A /* cartridge.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cartridge.hpp; sourceTree = ""; }; + 8CB3D8F117F1DE5C0090372A /* gameboyheader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gameboyheader.cpp; sourceTree = ""; }; + 8CB3D8F217F1DE5C0090372A /* header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = header.cpp; sourceTree = ""; }; + 8CB3D8F317F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D8F617F1DE5C0090372A /* cheat-inline.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "cheat-inline.hpp"; sourceTree = ""; }; + 8CB3D8F717F1DE5C0090372A /* cheat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cheat.cpp; sourceTree = ""; }; + 8CB3D8F817F1DE5C0090372A /* cheat.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cheat.hpp; sourceTree = ""; }; + 8CB3D8FF17F1DE5C0090372A /* bsx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bsx.cpp; sourceTree = ""; }; + 8CB3D90017F1DE5C0090372A /* bsx.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bsx.hpp; sourceTree = ""; }; + 8CB3D90117F1DE5C0090372A /* bsx_base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bsx_base.cpp; sourceTree = ""; }; + 8CB3D90217F1DE5C0090372A /* bsx_cart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bsx_cart.cpp; sourceTree = ""; }; + 8CB3D90317F1DE5C0090372A /* bsx_flash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bsx_flash.cpp; sourceTree = ""; }; + 8CB3D90417F1DE5C0090372A /* chip.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = chip.hpp; sourceTree = ""; }; + 8CB3D90617F1DE5C0090372A /* cx4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cx4.cpp; sourceTree = ""; }; + 8CB3D90717F1DE5C0090372A /* cx4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cx4.hpp; sourceTree = ""; }; + 8CB3D90817F1DE5C0090372A /* data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = data.cpp; sourceTree = ""; }; + 8CB3D90917F1DE5C0090372A /* functions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = functions.cpp; sourceTree = ""; }; + 8CB3D90A17F1DE5C0090372A /* oam.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = oam.cpp; sourceTree = ""; }; + 8CB3D90B17F1DE5C0090372A /* opcodes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcodes.cpp; sourceTree = ""; }; + 8CB3D90C17F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D90E17F1DE5C0090372A /* dsp1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsp1.cpp; sourceTree = ""; }; + 8CB3D90F17F1DE5C0090372A /* dsp1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dsp1.hpp; sourceTree = ""; }; + 8CB3D91017F1DE5C0090372A /* dsp1emu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsp1emu.cpp; sourceTree = ""; }; + 8CB3D91117F1DE5C0090372A /* dsp1emu.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dsp1emu.hpp; sourceTree = ""; }; + 8CB3D91217F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D91417F1DE5C0090372A /* dsp2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsp2.cpp; sourceTree = ""; }; + 8CB3D91517F1DE5C0090372A /* dsp2.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dsp2.hpp; sourceTree = ""; }; + 8CB3D91617F1DE5C0090372A /* opcodes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcodes.cpp; sourceTree = ""; }; + 8CB3D91717F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D91917F1DE5C0090372A /* dsp3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsp3.cpp; sourceTree = ""; }; + 8CB3D91A17F1DE5C0090372A /* dsp3.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dsp3.hpp; sourceTree = ""; }; + 8CB3D91B17F1DE5C0090372A /* dsp3emu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dsp3emu.c; sourceTree = ""; }; + 8CB3D91D17F1DE5C0090372A /* dsp4.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dsp4.cpp; sourceTree = ""; }; + 8CB3D91E17F1DE5C0090372A /* dsp4.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dsp4.hpp; sourceTree = ""; }; + 8CB3D91F17F1DE5C0090372A /* dsp4emu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dsp4emu.c; sourceTree = ""; }; + 8CB3D92017F1DE5C0090372A /* dsp4emu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsp4emu.h; sourceTree = ""; }; + 8CB3D92217F1DE5C0090372A /* obc1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = obc1.cpp; sourceTree = ""; }; + 8CB3D92317F1DE5C0090372A /* obc1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = obc1.hpp; sourceTree = ""; }; + 8CB3D92417F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D92717F1DE5C0090372A /* bus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bus.cpp; sourceTree = ""; }; + 8CB3D92817F1DE5C0090372A /* bus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bus.hpp; sourceTree = ""; }; + 8CB3D92A17F1DE5C0090372A /* dma.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dma.cpp; sourceTree = ""; }; + 8CB3D92B17F1DE5C0090372A /* dma.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dma.hpp; sourceTree = ""; }; + 8CB3D92D17F1DE5C0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3D92E17F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3D93017F1DE5C0090372A /* mmio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmio.cpp; sourceTree = ""; }; + 8CB3D93117F1DE5C0090372A /* mmio.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mmio.hpp; sourceTree = ""; }; + 8CB3D93217F1DE5C0090372A /* sa1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sa1.cpp; sourceTree = ""; }; + 8CB3D93317F1DE5C0090372A /* sa1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sa1.hpp; sourceTree = ""; }; + 8CB3D93417F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D93617F1DE5C0090372A /* sdd1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdd1.cpp; sourceTree = ""; }; + 8CB3D93717F1DE5C0090372A /* sdd1.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sdd1.hpp; sourceTree = ""; }; + 8CB3D93817F1DE5C0090372A /* sdd1emu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sdd1emu.cpp; sourceTree = ""; }; + 8CB3D93917F1DE5C0090372A /* sdd1emu.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sdd1emu.hpp; sourceTree = ""; }; + 8CB3D93A17F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D93C17F1DE5C0090372A /* decomp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = decomp.cpp; sourceTree = ""; }; + 8CB3D93D17F1DE5C0090372A /* decomp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = decomp.hpp; sourceTree = ""; }; + 8CB3D93E17F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D93F17F1DE5C0090372A /* spc7110.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = spc7110.cpp; sourceTree = ""; }; + 8CB3D94017F1DE5C0090372A /* spc7110.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = spc7110.hpp; sourceTree = ""; }; + 8CB3D94217F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D94317F1DE5C0090372A /* srtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = srtc.cpp; sourceTree = ""; }; + 8CB3D94417F1DE5C0090372A /* srtc.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = srtc.hpp; sourceTree = ""; }; + 8CB3D94617F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D94717F1DE5C0090372A /* st010.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = st010.cpp; sourceTree = ""; }; + 8CB3D94817F1DE5C0090372A /* st010.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = st010.hpp; sourceTree = ""; }; + 8CB3D94917F1DE5C0090372A /* st010_data.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = st010_data.hpp; sourceTree = ""; }; + 8CB3D94A17F1DE5C0090372A /* st010_op.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = st010_op.cpp; sourceTree = ""; }; + 8CB3D95317F1DE5C0090372A /* bus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bus.cpp; sourceTree = ""; }; + 8CB3D95417F1DE5C0090372A /* bus.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bus.hpp; sourceTree = ""; }; + 8CB3D95617F1DE5C0090372A /* core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core.cpp; sourceTree = ""; }; + 8CB3D95717F1DE5C0090372A /* core.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core.hpp; sourceTree = ""; }; + 8CB3D95817F1DE5C0090372A /* opcode_table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_table.cpp; sourceTree = ""; }; + 8CB3D95917F1DE5C0090372A /* opcodes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcodes.cpp; sourceTree = ""; }; + 8CB3D95A17F1DE5C0090372A /* registers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = registers.hpp; sourceTree = ""; }; + 8CB3D95C17F1DE5C0090372A /* disasm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disasm.cpp; sourceTree = ""; }; + 8CB3D95D17F1DE5C0090372A /* disasm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = disasm.hpp; sourceTree = ""; }; + 8CB3D95F17F1DE5C0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3D96017F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3D96217F1DE5C0090372A /* mmio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmio.cpp; sourceTree = ""; }; + 8CB3D96317F1DE5C0090372A /* mmio.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mmio.hpp; sourceTree = ""; }; + 8CB3D96417F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D96517F1DE5C0090372A /* superfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = superfx.cpp; sourceTree = ""; }; + 8CB3D96617F1DE5C0090372A /* superfx.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = superfx.hpp; sourceTree = ""; }; + 8CB3D96817F1DE5C0090372A /* timing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timing.cpp; sourceTree = ""; }; + 8CB3D96917F1DE5C0090372A /* timing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = timing.hpp; sourceTree = ""; }; + 8CB3D97017F1DE5C0090372A /* algorithms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = algorithms.cpp; sourceTree = ""; }; + 8CB3D97117F1DE5C0090372A /* core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core.cpp; sourceTree = ""; }; + 8CB3D97217F1DE5C0090372A /* core.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core.hpp; sourceTree = ""; }; + 8CB3D97417F1DE5C0090372A /* disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassembler.cpp; sourceTree = ""; }; + 8CB3D97517F1DE5C0090372A /* disassembler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = disassembler.hpp; sourceTree = ""; }; + 8CB3D97617F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3D97717F1DE5C0090372A /* opcode_misc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_misc.cpp; sourceTree = ""; }; + 8CB3D97817F1DE5C0090372A /* opcode_pc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_pc.cpp; sourceTree = ""; }; + 8CB3D97917F1DE5C0090372A /* opcode_read.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_read.cpp; sourceTree = ""; }; + 8CB3D97A17F1DE5C0090372A /* opcode_rmw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_rmw.cpp; sourceTree = ""; }; + 8CB3D97B17F1DE5C0090372A /* opcode_write.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_write.cpp; sourceTree = ""; }; + 8CB3D97C17F1DE5C0090372A /* registers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = registers.hpp; sourceTree = ""; }; + 8CB3D97D17F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D97E17F1DE5C0090372A /* table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = table.cpp; sourceTree = ""; }; + 8CB3D98117F1DE5C0090372A /* cpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cpu.cpp; sourceTree = ""; }; + 8CB3D98217F1DE5C0090372A /* cpu.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cpu.hpp; sourceTree = ""; }; + 8CB3D98517F1DE5C0090372A /* debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debugger.cpp; sourceTree = ""; }; + 8CB3D98617F1DE5C0090372A /* debugger.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = debugger.hpp; sourceTree = ""; }; + 8CB3D98817F1DE5C0090372A /* dma.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dma.cpp; sourceTree = ""; }; + 8CB3D98917F1DE5C0090372A /* dma.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dma.hpp; sourceTree = ""; }; + 8CB3D98B17F1DE5C0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3D98C17F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3D98E17F1DE5C0090372A /* mmio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmio.cpp; sourceTree = ""; }; + 8CB3D98F17F1DE5C0090372A /* mmio.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mmio.hpp; sourceTree = ""; }; + 8CB3D99017F1DE5C0090372A /* scpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scpu.cpp; sourceTree = ""; }; + 8CB3D99117F1DE5C0090372A /* scpu.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scpu.hpp; sourceTree = ""; }; + 8CB3D99217F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3D99417F1DE5C0090372A /* event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event.cpp; sourceTree = ""; }; + 8CB3D99517F1DE5C0090372A /* irq.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = irq.cpp; sourceTree = ""; }; + 8CB3D99617F1DE5C0090372A /* joypad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = joypad.cpp; sourceTree = ""; }; + 8CB3D99717F1DE5C0090372A /* timing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timing.cpp; sourceTree = ""; }; + 8CB3D99817F1DE5C0090372A /* timing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = timing.hpp; sourceTree = ""; }; + 8CB3D99A17F1DE5C0090372A /* documentation.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = documentation.html; sourceTree = ""; }; + 8CB3D99B17F1DE5C0090372A /* license.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = license.html; sourceTree = ""; }; + 8CB3D9AC17F1DE5C0090372A /* interface.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = interface.hpp; sourceTree = ""; }; + 8CB3D9AF17F1DE5C0090372A /* amd64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = amd64.c; sourceTree = ""; }; + 8CB3D9B117F1DE5C0090372A /* benchmark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = benchmark.c; sourceTree = ""; }; + 8CB3D9B217F1DE5C0090372A /* benchmark_impl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = benchmark_impl.c; sourceTree = ""; }; + 8CB3D9B417F1DE5C0090372A /* libco.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libco.c; sourceTree = ""; }; + 8CB3D9B517F1DE5C0090372A /* libco.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libco.h; sourceTree = ""; }; + 8CB3D9B617F1DE5C0090372A /* ppc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ppc.c; sourceTree = ""; }; + 8CB3D9B717F1DE5C0090372A /* ppc.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = ppc.S; sourceTree = ""; }; + 8CB3D9B817F1DE5C0090372A /* ppc_regs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ppc_regs.h; sourceTree = ""; }; + 8CB3D9B917F1DE5C0090372A /* ppc_regs.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = ppc_regs.S; sourceTree = ""; }; + 8CB3D9BA17F1DE5C0090372A /* readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = readme.txt; sourceTree = ""; }; + 8CB3D9BB17F1DE5C0090372A /* run_tests */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = run_tests; sourceTree = ""; }; + 8CB3D9BC17F1DE5C0090372A /* run_tests.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = run_tests.txt; sourceTree = ""; }; + 8CB3D9BD17F1DE5C0090372A /* test_libco.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = test_libco.c; sourceTree = ""; }; + 8CB3D9BE17F1DE5C0090372A /* test_regs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = test_regs.c; sourceTree = ""; }; + 8CB3D9BF17F1DE5C0090372A /* test_threads.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = test_threads.c; sourceTree = ""; }; + 8CB3D9C017F1DE5C0090372A /* testing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = testing.h; sourceTree = ""; }; + 8CB3D9C117F1DE5C0090372A /* fiber.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fiber.c; sourceTree = ""; }; + 8CB3D9C217F1DE5C0090372A /* libco.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libco.c; sourceTree = ""; }; + 8CB3D9C317F1DE5C0090372A /* libco.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libco.h; sourceTree = ""; }; + 8CB3D9C417F1DE5C0090372A /* ppc-elf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "ppc-elf.c"; sourceTree = ""; }; + 8CB3D9C517F1DE5C0090372A /* ppc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ppc.c; sourceTree = ""; }; + 8CB3D9C617F1DE5C0090372A /* ppc.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = ppc.s; sourceTree = ""; }; + 8CB3D9C717F1DE5C0090372A /* ppc64.s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = ppc64.s; sourceTree = ""; }; + 8CB3D9C817F1DE5C0090372A /* sjlj.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sjlj.c; sourceTree = ""; }; + 8CB3D9C917F1DE5C0090372A /* ucontext.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ucontext.c; sourceTree = ""; }; + 8CB3D9CA17F1DE5C0090372A /* x86.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x86.c; sourceTree = ""; }; + 8CB3D9CC17F1DE5C0090372A /* algorithm.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = algorithm.hpp; sourceTree = ""; }; + 8CB3D9CD17F1DE5C0090372A /* any.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = any.hpp; sourceTree = ""; }; + 8CB3D9CE17F1DE5C0090372A /* array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = array.hpp; sourceTree = ""; }; + 8CB3D9D017F1DE5C0090372A /* bit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bit.hpp; sourceTree = ""; }; + 8CB3D9D217F1DE5C0090372A /* crc32.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = crc32.hpp; sourceTree = ""; }; + 8CB3D9D317F1DE5C0090372A /* detect.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = detect.hpp; sourceTree = ""; }; + 8CB3D9D617F1DE5C0090372A /* endian.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = endian.hpp; sourceTree = ""; }; + 8CB3D9D917F1DE5C0090372A /* function.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = function.hpp; sourceTree = ""; }; + 8CB3D9DE17F1DE5C0090372A /* moduloarray.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = moduloarray.hpp; sourceTree = ""; }; + 8CB3D9DF17F1DE5C0090372A /* platform.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = platform.hpp; sourceTree = ""; }; + 8CB3D9E017F1DE5C0090372A /* priorityqueue.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = priorityqueue.hpp; sourceTree = ""; }; + 8CB3D9E117F1DE5C0090372A /* property.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = property.hpp; sourceTree = ""; }; + 8CB3D9E217F1DE5C0090372A /* serial.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = serial.hpp; sourceTree = ""; }; + 8CB3D9E317F1DE5C0090372A /* serializer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = serializer.hpp; sourceTree = ""; }; + 8CB3D9E617F1DE5C0090372A /* static.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = static.hpp; sourceTree = ""; }; + 8CB3D9E717F1DE5C0090372A /* stdint.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = stdint.hpp; sourceTree = ""; }; + 8CB3D9F717F1DE5C0090372A /* traits.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = traits.hpp; sourceTree = ""; }; + 8CB3D9FA17F1DE5C0090372A /* utility.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utility.hpp; sourceTree = ""; }; + 8CB3D9FB17F1DE5C0090372A /* varint.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = varint.hpp; sourceTree = ""; }; + 8CB3D9FC17F1DE5C0090372A /* vector.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vector.hpp; sourceTree = ""; }; + 8CB3DA0117F1DE5C0090372A /* memory-inline.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "memory-inline.hpp"; sourceTree = ""; }; + 8CB3DA0217F1DE5C0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3DA0317F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3DA0517F1DE5C0090372A /* generic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generic.cpp; sourceTree = ""; }; + 8CB3DA0617F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3DA0717F1DE5C0090372A /* smemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smemory.cpp; sourceTree = ""; }; + 8CB3DA0817F1DE5C0090372A /* smemory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = smemory.hpp; sourceTree = ""; }; + 8CB3DA0917F1DE5C0090372A /* system.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = system.cpp; sourceTree = ""; }; + 8CB3DA0C17F1DE5C0090372A /* debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debugger.cpp; sourceTree = ""; }; + 8CB3DA0D17F1DE5C0090372A /* debugger.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = debugger.hpp; sourceTree = ""; }; + 8CB3DA0E17F1DE5C0090372A /* render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render.cpp; sourceTree = ""; }; + 8CB3DA1017F1DE5C0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3DA1117F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3DA1317F1DE5C0090372A /* mmio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mmio.cpp; sourceTree = ""; }; + 8CB3DA1417F1DE5C0090372A /* mmio.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mmio.hpp; sourceTree = ""; }; + 8CB3DA1717F1DE5C0090372A /* ppu-inline.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "ppu-inline.hpp"; sourceTree = ""; }; + 8CB3DA1817F1DE5C0090372A /* ppu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ppu.cpp; sourceTree = ""; }; + 8CB3DA1917F1DE5C0090372A /* ppu.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ppu.hpp; sourceTree = ""; }; + 8CB3DA1B17F1DE5C0090372A /* addsub.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = addsub.cpp; sourceTree = ""; }; + 8CB3DA1C17F1DE5C0090372A /* bg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bg.cpp; sourceTree = ""; }; + 8CB3DA1D17F1DE5C0090372A /* cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cache.cpp; sourceTree = ""; }; + 8CB3DA1E17F1DE5C0090372A /* line.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = line.cpp; sourceTree = ""; }; + 8CB3DA1F17F1DE5C0090372A /* mode7.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mode7.cpp; sourceTree = ""; }; + 8CB3DA2017F1DE5C0090372A /* oam.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = oam.cpp; sourceTree = ""; }; + 8CB3DA2117F1DE5C0090372A /* render.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render.cpp; sourceTree = ""; }; + 8CB3DA2217F1DE5C0090372A /* render.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = render.hpp; sourceTree = ""; }; + 8CB3DA2317F1DE5C0090372A /* windows.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = windows.cpp; sourceTree = ""; }; + 8CB3DA2417F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3DA2717F1DE5C0090372A /* algorithms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = algorithms.cpp; sourceTree = ""; }; + 8CB3DA2817F1DE5C0090372A /* core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core.cpp; sourceTree = ""; }; + 8CB3DA2917F1DE5C0090372A /* core.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = core.hpp; sourceTree = ""; }; + 8CB3DA2B17F1DE5C0090372A /* disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassembler.cpp; sourceTree = ""; }; + 8CB3DA2C17F1DE5C0090372A /* disassembler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = disassembler.hpp; sourceTree = ""; }; + 8CB3DA2D17F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3DA2E17F1DE5C0090372A /* opcode_misc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_misc.cpp; sourceTree = ""; }; + 8CB3DA2F17F1DE5C0090372A /* opcode_mov.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_mov.cpp; sourceTree = ""; }; + 8CB3DA3017F1DE5C0090372A /* opcode_pc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_pc.cpp; sourceTree = ""; }; + 8CB3DA3117F1DE5C0090372A /* opcode_read.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_read.cpp; sourceTree = ""; }; + 8CB3DA3217F1DE5C0090372A /* opcode_rmw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opcode_rmw.cpp; sourceTree = ""; }; + 8CB3DA3317F1DE5C0090372A /* registers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = registers.hpp; sourceTree = ""; }; + 8CB3DA3417F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3DA3517F1DE5C0090372A /* table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = table.cpp; sourceTree = ""; }; + 8CB3DA3617F1DE5C0090372A /* smp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = smp.cpp; sourceTree = ""; }; + 8CB3DA3717F1DE5C0090372A /* smp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = smp.hpp; sourceTree = ""; }; + 8CB3DA3A17F1DE5C0090372A /* debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debugger.cpp; sourceTree = ""; }; + 8CB3DA3B17F1DE5C0090372A /* debugger.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = debugger.hpp; sourceTree = ""; }; + 8CB3DA3D17F1DE5C0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3DA3E17F1DE5C0090372A /* memory.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = memory.hpp; sourceTree = ""; }; + 8CB3DA3F17F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3DA4017F1DE5C0090372A /* ssmp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ssmp.cpp; sourceTree = ""; }; + 8CB3DA4117F1DE5C0090372A /* ssmp.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = ssmp.hpp; sourceTree = ""; }; + 8CB3DA4317F1DE5C0090372A /* timing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timing.cpp; sourceTree = ""; }; + 8CB3DA4417F1DE5C0090372A /* timing.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = timing.hpp; sourceTree = ""; }; + 8CB3DA4717F1DE5C0090372A /* audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio.cpp; sourceTree = ""; }; + 8CB3DA4817F1DE5C0090372A /* audio.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = audio.hpp; sourceTree = ""; }; + 8CB3DA4A17F1DE5C0090372A /* config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = config.cpp; sourceTree = ""; }; + 8CB3DA4B17F1DE5C0090372A /* config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = config.hpp; sourceTree = ""; }; + 8CB3DA4D17F1DE5C0090372A /* debugger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debugger.cpp; sourceTree = ""; }; + 8CB3DA4E17F1DE5C0090372A /* debugger.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = debugger.hpp; sourceTree = ""; }; + 8CB3DA5017F1DE5C0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3DA5117F1DE5C0090372A /* input.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = input.hpp; sourceTree = ""; }; + 8CB3DA5317F1DE5C0090372A /* interface.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = interface.hpp; sourceTree = ""; }; + 8CB3DA5517F1DE5C0090372A /* scheduler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scheduler.cpp; sourceTree = ""; }; + 8CB3DA5617F1DE5C0090372A /* scheduler.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scheduler.hpp; sourceTree = ""; }; + 8CB3DA5717F1DE5C0090372A /* serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 8CB3DA5817F1DE5C0090372A /* system.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = system.cpp; sourceTree = ""; }; + 8CB3DA5917F1DE5C0090372A /* system.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = system.hpp; sourceTree = ""; }; + 8CB3DA5B17F1DE5C0090372A /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = video.cpp; sourceTree = ""; }; + 8CB3DA5C17F1DE5C0090372A /* video.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = video.hpp; sourceTree = ""; }; + 8CB3DA5D17F1DE5C0090372A /* VERSION.BSNES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION.BSNES; sourceTree = ""; }; + 8CB3DC0917F1DE5D0090372A /* Blip_Buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Blip_Buffer.cpp; sourceTree = ""; }; + 8CB3DC0A17F1DE5D0090372A /* Fir_Resampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Fir_Resampler.cpp; sourceTree = ""; }; + 8CB3DC0B17F1DE5D0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3DC0C17F1DE5D0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3DC0D17F1DE5D0090372A /* Stereo_Buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Stereo_Buffer.cpp; sourceTree = ""; }; + 8CB3DC0E17F1DE5D0090372A /* WAVRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WAVRecord.cpp; sourceTree = ""; }; + 8CB3DC0F17F1DE5D0090372A /* WAVRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WAVRecord.h; sourceTree = ""; }; + 8CB3DC1017F1DE5D0090372A /* state-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "state-common.h"; sourceTree = ""; }; + 8CB3DC1117F1DE5D0090372A /* state-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "state-driver.h"; sourceTree = ""; }; + 8CB3DC1217F1DE5D0090372A /* state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = state.cpp; sourceTree = ""; }; + 8CB3DC1317F1DE5D0090372A /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = state.h; sourceTree = ""; }; + 8CB3DC1417F1DE5D0090372A /* Stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Stream.cpp; sourceTree = ""; }; + 8CB3DC1517F1DE5D0090372A /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stream.h; sourceTree = ""; }; + 8CB3DC1817F1DE5D0090372A /* ConvertUTF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConvertUTF.cpp; sourceTree = ""; }; + 8CB3DC1917F1DE5D0090372A /* ConvertUTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConvertUTF.h; sourceTree = ""; }; + 8CB3DC1A17F1DE5D0090372A /* escape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = escape.cpp; sourceTree = ""; }; + 8CB3DC1B17F1DE5D0090372A /* escape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = escape.h; sourceTree = ""; }; + 8CB3DC1C17F1DE5D0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3DC1F17F1DE5D0090372A /* tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tests.cpp; sourceTree = ""; }; + 8CB3DC2017F1DE5D0090372A /* tests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tests.h; sourceTree = ""; }; + 8CB3DC2217F1DE5D0090372A /* !!!VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "!!!VERSION"; sourceTree = ""; }; + 8CB3DC2317F1DE5D0090372A /* asm_arm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm_arm.h; sourceTree = ""; }; + 8CB3DC2417F1DE5D0090372A /* backends.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backends.h; sourceTree = ""; }; + 8CB3DC2517F1DE5D0090372A /* bitwise.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitwise.c; sourceTree = ""; }; + 8CB3DC2617F1DE5D0090372A /* block.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = block.c; sourceTree = ""; }; + 8CB3DC2717F1DE5D0090372A /* block.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block.h; sourceTree = ""; }; + 8CB3DC2817F1DE5D0090372A /* CHANGELOG */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGELOG; sourceTree = ""; }; + 8CB3DC2917F1DE5D0090372A /* codebook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = codebook.c; sourceTree = ""; }; + 8CB3DC2A17F1DE5D0090372A /* codebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codebook.h; sourceTree = ""; }; + 8CB3DC2B17F1DE5D0090372A /* codec_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codec_internal.h; sourceTree = ""; }; + 8CB3DC2C17F1DE5D0090372A /* configure.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = configure.in; sourceTree = ""; }; + 8CB3DC2D17F1DE5D0090372A /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; + 8CB3DC2E17F1DE5D0090372A /* floor0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = floor0.c; sourceTree = ""; }; + 8CB3DC2F17F1DE5D0090372A /* floor1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = floor1.c; sourceTree = ""; }; + 8CB3DC3017F1DE5D0090372A /* framing.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = framing.c; sourceTree = ""; }; + 8CB3DC3117F1DE5D0090372A /* info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = info.c; sourceTree = ""; }; + 8CB3DC3217F1DE5D0090372A /* iseeking_example.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iseeking_example.c; sourceTree = ""; }; + 8CB3DC3317F1DE5D0090372A /* ivorbiscodec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ivorbiscodec.h; sourceTree = ""; }; + 8CB3DC3417F1DE5D0090372A /* ivorbisfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ivorbisfile.h; sourceTree = ""; }; + 8CB3DC3517F1DE5D0090372A /* ivorbisfile_example.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ivorbisfile_example.c; sourceTree = ""; }; + 8CB3DC3617F1DE5D0090372A /* lsp_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lsp_lookup.h; sourceTree = ""; }; + 8CB3DC3717F1DE5D0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3DC3817F1DE5D0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3DC3917F1DE5D0090372A /* mapping0.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mapping0.c; sourceTree = ""; }; + 8CB3DC3A17F1DE5D0090372A /* mdct.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mdct.c; sourceTree = ""; }; + 8CB3DC3B17F1DE5D0090372A /* mdct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdct.h; sourceTree = ""; }; + 8CB3DC3C17F1DE5D0090372A /* mdct_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdct_lookup.h; sourceTree = ""; }; + 8CB3DC3D17F1DE5D0090372A /* misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = misc.h; sourceTree = ""; }; + 8CB3DC3E17F1DE5D0090372A /* ogg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ogg.h; sourceTree = ""; }; + 8CB3DC3F17F1DE5D0090372A /* os.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os.h; sourceTree = ""; }; + 8CB3DC4017F1DE5D0090372A /* os_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = os_types.h; sourceTree = ""; }; + 8CB3DC4117F1DE5D0090372A /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 8CB3DC4217F1DE5D0090372A /* registry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = registry.c; sourceTree = ""; }; + 8CB3DC4317F1DE5D0090372A /* registry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = registry.h; sourceTree = ""; }; + 8CB3DC4417F1DE5D0090372A /* res012.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res012.c; sourceTree = ""; }; + 8CB3DC4517F1DE5D0090372A /* sharedbook.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sharedbook.c; sourceTree = ""; }; + 8CB3DC4617F1DE5D0090372A /* synthesis.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = synthesis.c; sourceTree = ""; }; + 8CB3DC4717F1DE5D0090372A /* Version_script.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Version_script.in; sourceTree = ""; }; + 8CB3DC4817F1DE5D0090372A /* vorbisfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vorbisfile.c; sourceTree = ""; }; + 8CB3DC4917F1DE5D0090372A /* vorbisidec.pc.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vorbisidec.pc.in; sourceTree = ""; }; + 8CB3DC4A17F1DE5D0090372A /* window.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = window.c; sourceTree = ""; }; + 8CB3DC4B17F1DE5D0090372A /* window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = window.h; sourceTree = ""; }; + 8CB3DC4C17F1DE5D0090372A /* window_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = window_lookup.h; sourceTree = ""; }; + 8CB3DC4E17F1DE5D0090372A /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGES; sourceTree = ""; }; + 8CB3DC4F17F1DE5D0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3DC5017F1DE5D0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3DC5117F1DE5D0090372A /* trio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = trio.c; sourceTree = ""; }; + 8CB3DC5217F1DE5D0090372A /* trionan.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = trionan.c; sourceTree = ""; }; + 8CB3DC5317F1DE5D0090372A /* triostr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = triostr.c; sourceTree = ""; }; + 8CB3DC5417F1DE5D0090372A /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; + 8CB3DC5617F1DE5D0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3DC5717F1DE5D0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3DC5817F1DE5D0090372A /* input.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = input.cpp; sourceTree = ""; }; + 8CB3DC5917F1DE5D0090372A /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input.h; sourceTree = ""; }; + 8CB3DC5A17F1DE5D0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3DC5B17F1DE5D0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3DC5C17F1DE5D0090372A /* timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timer.cpp; sourceTree = ""; }; + 8CB3DC5D17F1DE5D0090372A /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = ""; }; + 8CB3DC5E17F1DE5D0090372A /* vb.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vb.cpp; sourceTree = ""; }; + 8CB3DC5F17F1DE5D0090372A /* vb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vb.h; sourceTree = ""; }; + 8CB3DC6017F1DE5D0090372A /* vip.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vip.cpp; sourceTree = ""; }; + 8CB3DC6117F1DE5D0090372A /* vip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vip.h; sourceTree = ""; }; + 8CB3DC6217F1DE5D0090372A /* vip_draw.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = vip_draw.inc; sourceTree = ""; }; + 8CB3DC6317F1DE5D0090372A /* vsu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vsu.cpp; sourceTree = ""; }; + 8CB3DC6417F1DE5D0090372A /* vsu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vsu.h; sourceTree = ""; }; + 8CB3DC6617F1DE5D0090372A /* Deinterlacer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Deinterlacer.cpp; sourceTree = ""; }; + 8CB3DC6717F1DE5D0090372A /* Deinterlacer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Deinterlacer.h; sourceTree = ""; }; + 8CB3DC6817F1DE5D0090372A /* font-data-12x13.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "font-data-12x13.c"; sourceTree = ""; }; + 8CB3DC6917F1DE5D0090372A /* font-data-18x18.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "font-data-18x18.c"; sourceTree = ""; }; + 8CB3DC6A17F1DE5D0090372A /* font-data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "font-data.cpp"; sourceTree = ""; }; + 8CB3DC6B17F1DE5D0090372A /* font-data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "font-data.h"; sourceTree = ""; }; + 8CB3DC6C17F1DE5D0090372A /* font12x13.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font12x13.h; sourceTree = ""; }; + 8CB3DC6D17F1DE5D0090372A /* font18x18.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font18x18.h; sourceTree = ""; }; + 8CB3DC6E17F1DE5D0090372A /* font4x5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font4x5.h; sourceTree = ""; }; + 8CB3DC6F17F1DE5D0090372A /* font5x7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font5x7.h; sourceTree = ""; }; + 8CB3DC7017F1DE5D0090372A /* font6x13.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font6x13.h; sourceTree = ""; }; + 8CB3DC7117F1DE5D0090372A /* font9x18.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = font9x18.h; sourceTree = ""; }; + 8CB3DC7217F1DE5D0090372A /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 8CB3DC7317F1DE5D0090372A /* png.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = png.cpp; sourceTree = ""; }; + 8CB3DC7417F1DE5D0090372A /* png.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = png.h; sourceTree = ""; }; + 8CB3DC7517F1DE5D0090372A /* primitives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = primitives.cpp; sourceTree = ""; }; + 8CB3DC7617F1DE5D0090372A /* primitives.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = primitives.h; sourceTree = ""; }; + 8CB3DC7717F1DE5D0090372A /* README.FONTS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.FONTS; sourceTree = ""; }; + 8CB3DC7817F1DE5D0090372A /* resize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resize.cpp; sourceTree = ""; }; + 8CB3DC7917F1DE5D0090372A /* resize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resize.h; sourceTree = ""; }; + 8CB3DC7C17F1DE5D0090372A /* surface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = surface.cpp; sourceTree = ""; }; + 8CB3DC7D17F1DE5D0090372A /* surface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = surface.h; sourceTree = ""; }; + 8CB3DC7E17F1DE5D0090372A /* tblur.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tblur.cpp; sourceTree = ""; }; + 8CB3DC7F17F1DE5D0090372A /* tblur.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tblur.h; sourceTree = ""; }; + 8CB3DC8017F1DE5D0090372A /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text.cpp; sourceTree = ""; }; + 8CB3DC8117F1DE5D0090372A /* text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text.h; sourceTree = ""; }; + 8CB3DC8217F1DE5D0090372A /* video-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "video-common.h"; sourceTree = ""; }; + 8CB3DC8317F1DE5D0090372A /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = video.cpp; sourceTree = ""; }; + 8CB3DC8417F1DE5D0090372A /* video-driver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "video-driver.h"; sourceTree = ""; }; + 8CB3DC8517F1DE5D0090372A /* video.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video.h; sourceTree = ""; }; + 8CB3DC8717F1DE5D0090372A /* debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debug.cpp; sourceTree = ""; }; + 8CB3DC8817F1DE5D0090372A /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; + 8CB3DC8A17F1DE5D0090372A /* dis_decode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dis_decode.cpp; sourceTree = ""; }; + 8CB3DC8B17F1DE5D0090372A /* dis_groups.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dis_groups.cpp; sourceTree = ""; }; + 8CB3DC8C17F1DE5D0090372A /* dis_tables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dis_tables.h; sourceTree = ""; }; + 8CB3DC8D17F1DE5D0090372A /* dis_tables.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = dis_tables.inc; sourceTree = ""; }; + 8CB3DC8E17F1DE5D0090372A /* disasm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disasm.h; sourceTree = ""; }; + 8CB3DC8F17F1DE5D0090372A /* opcodes.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = opcodes.inc; sourceTree = ""; }; + 8CB3DC9017F1DE5D0090372A /* resolve.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resolve.cpp; sourceTree = ""; }; + 8CB3DC9117F1DE5D0090372A /* syntax.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syntax.cpp; sourceTree = ""; }; + 8CB3DC9217F1DE5D0090372A /* eeprom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eeprom.cpp; sourceTree = ""; }; + 8CB3DC9317F1DE5D0090372A /* eeprom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eeprom.h; sourceTree = ""; }; + 8CB3DC9417F1DE5D0090372A /* gfx.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gfx.cpp; sourceTree = ""; }; + 8CB3DC9517F1DE5D0090372A /* gfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gfx.h; sourceTree = ""; }; + 8CB3DC9617F1DE5D0090372A /* interrupt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = interrupt.cpp; sourceTree = ""; }; + 8CB3DC9717F1DE5D0090372A /* interrupt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interrupt.h; sourceTree = ""; }; + 8CB3DC9817F1DE5D0090372A /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + 8CB3DC9917F1DE5D0090372A /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 8CB3DC9A17F1DE5E0090372A /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 8CB3DC9B17F1DE5E0090372A /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = ""; }; + 8CB3DC9C17F1DE5E0090372A /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; + 8CB3DC9D17F1DE5E0090372A /* rtc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rtc.cpp; sourceTree = ""; }; + 8CB3DC9E17F1DE5E0090372A /* rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rtc.h; sourceTree = ""; }; + 8CB3DC9F17F1DE5E0090372A /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + 8CB3DCA017F1DE5E0090372A /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sound.h; sourceTree = ""; }; + 8CB3DCA117F1DE5E0090372A /* start.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = start.inc; sourceTree = ""; }; + 8CB3DCA217F1DE5E0090372A /* tcache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tcache.cpp; sourceTree = ""; }; + 8CB3DCA317F1DE5E0090372A /* v30mz-ea.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "v30mz-ea.inc"; sourceTree = ""; }; + 8CB3DCA417F1DE5E0090372A /* v30mz-modrm.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = "v30mz-modrm.inc"; sourceTree = ""; }; + 8CB3DCA517F1DE5E0090372A /* v30mz-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "v30mz-private.h"; sourceTree = ""; }; + 8CB3DCA617F1DE5E0090372A /* v30mz.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = v30mz.cpp; sourceTree = ""; }; + 8CB3DCA717F1DE5E0090372A /* v30mz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = v30mz.h; sourceTree = ""; }; + 8CB3DCA817F1DE5E0090372A /* wstech24.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wstech24.txt; sourceTree = ""; }; + 8CB3DCA917F1DE5E0090372A /* wswan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wswan.h; sourceTree = ""; }; + 8CB3E09A17F1DFFF0090372A /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGES; sourceTree = ""; }; + 8CB3E09B17F1DFFF0090372A /* trio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trio.h; sourceTree = ""; }; + 8CB3E09C17F1DFFF0090372A /* triodef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = triodef.h; sourceTree = ""; }; + 8CB3E09D17F1DFFF0090372A /* trionan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trionan.h; sourceTree = ""; }; + 8CB3E09E17F1DFFF0090372A /* triop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = triop.h; sourceTree = ""; }; + 8CB3E09F17F1DFFF0090372A /* triostr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = triostr.h; sourceTree = ""; }; + 8CB3E0A517F1E1B80090372A /* OELynxSystemResponderClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OELynxSystemResponderClient.h; path = ../OpenEmu/Lynx/OELynxSystemResponderClient.h; sourceTree = ""; }; + 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 940553AC17A3533E009B505D /* OEPCECDSystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEPCECDSystemResponderClient.h; path = "../OpenEmu/PC Engine CD/OEPCECDSystemResponderClient.h"; sourceTree = ""; }; + 944543EE17852820006C057B /* OEPSXSystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEPSXSystemResponderClient.h; path = ../OpenEmu/PlayStation/OEPSXSystemResponderClient.h; sourceTree = ""; }; + 944543EF1785282E006C057B /* OEPCESystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEPCESystemResponderClient.h; path = "../OpenEmu/PC Engine/OEPCESystemResponderClient.h"; sourceTree = ""; }; + 944543F01785283A006C057B /* OEPCFXSystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEPCFXSystemResponderClient.h; path = "../OpenEmu/PC-FX/OEPCFXSystemResponderClient.h"; sourceTree = ""; }; + 944543F21785288D006C057B /* OEVBSystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEVBSystemResponderClient.h; path = "../OpenEmu/Virtual Boy/OEVBSystemResponderClient.h"; sourceTree = ""; }; + 944543F31785289B006C057B /* OEWSSystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OEWSSystemResponderClient.h; path = ../OpenEmu/WonderSwan/OEWSSystemResponderClient.h; sourceTree = ""; }; + 94454E3617852E44006C057B /* thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread.cpp; sourceTree = ""; }; + 94454E3717852E44006C057B /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread.h; sourceTree = ""; }; + 94454E3B17852E61006C057B /* stubs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stubs.cpp; sourceTree = ""; }; + 9453E3761AC5DA22004F42AD /* libsndfile.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsndfile.a; path = libsndfile/libsndfile.a; sourceTree = ""; }; + 9453E3791AC5DA93004F42AD /* sndfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sndfile.h; path = libsndfile/sndfile.h; sourceTree = ""; }; + 9453E37A1AC5E051004F42AD /* libFLAC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libFLAC.a; path = libsndfile/libFLAC.a; sourceTree = ""; }; + 9453E37C1AC5E1E9004F42AD /* libvorbis.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvorbis.a; path = libsndfile/libvorbis.a; sourceTree = ""; }; + 9453E37E1AC5E305004F42AD /* libvorbisenc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvorbisenc.a; path = libsndfile/libvorbisenc.a; sourceTree = ""; }; + 9454E32919516301005A5CFE /* comm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = comm.cpp; sourceTree = ""; }; + 9454E32A19516301005A5CFE /* comm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comm.h; sourceTree = ""; }; + 94817C2A1922B45500FDFC99 /* cdplay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cdplay.cpp; sourceTree = ""; }; + 94817C2B1922B45500FDFC99 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 94817C2C1922B45500FDFC99 /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 94817C301922B53900FDFC99 /* Blip_Buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Blip_Buffer.h; sourceTree = ""; }; + 94817C311922B53900FDFC99 /* fir_blargg_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_blargg_common.h; sourceTree = ""; }; + 94817C321922B53900FDFC99 /* fir_blargg_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_blargg_config.h; sourceTree = ""; }; + 94817C331922B53900FDFC99 /* fir_blargg_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_blargg_endian.h; sourceTree = ""; }; + 94817C341922B53900FDFC99 /* fir_blargg_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fir_blargg_source.h; sourceTree = ""; }; + 94817C351922B53900FDFC99 /* Fir_Resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fir_Resampler.h; sourceTree = ""; }; + 94817C361922B53900FDFC99 /* okiadpcm_generate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = okiadpcm_generate.cpp; sourceTree = ""; }; + 94817C371922B53900FDFC99 /* okiadpcm-deltatable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "okiadpcm-deltatable.h"; sourceTree = ""; }; + 94817C381922B53900FDFC99 /* okiadpcm.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = okiadpcm.cpp; sourceTree = ""; }; + 94817C391922B53900FDFC99 /* okiadpcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = okiadpcm.h; sourceTree = ""; }; + 94817C3C1922B56300FDFC99 /* Stereo_Buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stereo_Buffer.h; sourceTree = ""; }; + 94817C3D1922B75000FDFC99 /* v810_fp_ops.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = v810_fp_ops.cpp; sourceTree = ""; }; + 94817C3E1922B75000FDFC99 /* v810_fp_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = v810_fp_ops.h; sourceTree = ""; }; + 94817C401922B8A500FDFC99 /* wasapish.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wasapish.cpp; sourceTree = ""; }; + 94817C411922B8DF00FDFC99 /* thread_sdl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = thread_sdl.cpp; sourceTree = ""; }; + 94817C421922B8DF00FDFC99 /* thread_win32.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = thread_win32.cpp; sourceTree = ""; }; + 948D5B4418C805E500346504 /* OwlResampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OwlResampler.cpp; sourceTree = ""; }; + 948D5B4518C805E500346504 /* OwlResampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OwlResampler.h; sourceTree = ""; }; + 94B082451A8697EF00D3C0BC /* CDAFReader_MPC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAFReader_MPC.cpp; sourceTree = ""; }; + 94B082461A8697EF00D3C0BC /* CDAFReader_MPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAFReader_MPC.h; sourceTree = ""; }; + 94B082471A8697EF00D3C0BC /* CDAFReader_SF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAFReader_SF.cpp; sourceTree = ""; }; + 94B082481A8697EF00D3C0BC /* CDAFReader_SF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAFReader_SF.h; sourceTree = ""; }; + 94B082491A8697EF00D3C0BC /* CDAFReader_Vorbis.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAFReader_Vorbis.cpp; sourceTree = ""; }; + 94B0824A1A8697EF00D3C0BC /* CDAFReader_Vorbis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAFReader_Vorbis.h; sourceTree = ""; }; + 94B0824B1A8697EF00D3C0BC /* CDAFReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CDAFReader.cpp; sourceTree = ""; }; + 94B0824C1A8697EF00D3C0BC /* CDAFReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDAFReader.h; sourceTree = ""; }; + 94B082511A86982900D3C0BC /* GZFileStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GZFileStream.cpp; sourceTree = ""; }; + 94B082521A86982900D3C0BC /* GZFileStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GZFileStream.h; sourceTree = ""; }; + 94B082541A86987300D3C0BC /* FastFIFO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FastFIFO.h; sourceTree = ""; }; + 94B082561A8698A200D3C0BC /* PROBLEMATIC-GAMES */ = {isa = PBXFileReference; lastKnownFileType = text; path = "PROBLEMATIC-GAMES"; sourceTree = ""; }; + 94CFB61E1A75D654001F174F /* git.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = git.cpp; sourceTree = ""; }; + 94CFB6231A75D6CB001F174F /* ZLInflateFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ZLInflateFilter.cpp; sourceTree = ""; }; + 94CFB6241A75D6CB001F174F /* ZLInflateFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZLInflateFilter.h; sourceTree = ""; }; + 94CFB6261A75D70C001F174F /* IPSPatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IPSPatcher.cpp; sourceTree = ""; }; + 94CFB6271A75D70C001F174F /* IPSPatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IPSPatcher.h; sourceTree = ""; }; + 94CFB62A1A75D73F001F174F /* Makefile.am.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = Makefile.am.inc; sourceTree = ""; }; + 94CFB62B1A75D73F001F174F /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; + 94CFB62C1A75D73F001F174F /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + 94CFB62D1A75D73F001F174F /* sha1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sha1.cpp; sourceTree = ""; }; + 94CFB62E1A75D73F001F174F /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = ""; }; + 94CFB62F1A75D73F001F174F /* sha256.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sha256.cpp; sourceTree = ""; }; + 94CFB6301A75D73F001F174F /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha256.h; sourceTree = ""; }; + 94CFB6351A75DA0E001F174F /* rmdui.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = rmdui.cpp; sourceTree = ""; }; + 94CFB6361A75DA0E001F174F /* rmdui.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rmdui.h; sourceTree = ""; }; + 94CFB6371A75DA89001F174F /* c68k.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = c68k.cpp; sourceTree = ""; }; + 94CFB6381A75DA9C001F174F /* c68kexec.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = c68kexec.cpp; sourceTree = ""; }; + 94CFB6391A75DAAC001F174F /* gen68k.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = gen68k.cpp; sourceTree = ""; }; + 94CFB63A1A75DB0A001F174F /* 4way.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = 4way.cpp; sourceTree = ""; }; + 94CFB63B1A75DB0A001F174F /* 4way.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 4way.h; sourceTree = ""; }; + 94CFB63C1A75DB15001F174F /* megamouse.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = megamouse.cpp; sourceTree = ""; }; + 94CFB63D1A75DB15001F174F /* megamouse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = megamouse.h; sourceTree = ""; }; + 94CFB63E1A75DB15001F174F /* multitap.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = multitap.cpp; sourceTree = ""; }; + 94CFB63F1A75DB15001F174F /* multitap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = multitap.h; sourceTree = ""; }; + 94CFB6401A75DB60001F174F /* gpu_common.inc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 4; path = gpu_common.inc; sourceTree = ""; }; + 94CFB6411A75DB60001F174F /* gpu_line.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gpu_line.cpp; sourceTree = ""; }; + 94CFB6421A75DB60001F174F /* gpu_polygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gpu_polygon.cpp; sourceTree = ""; }; + 94CFB6431A75DB60001F174F /* gpu_sprite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gpu_sprite.cpp; sourceTree = ""; }; + 94CFB6481A75DBAC001F174F /* masmem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = masmem.h; sourceTree = ""; }; + 94CFB64C1A75DBE2001F174F /* MULTITAP */ = {isa = PBXFileReference; lastKnownFileType = text; path = MULTITAP; sourceTree = ""; }; + 94CFB64D1A75DBE2001F174F /* PSX-TODO */ = {isa = PBXFileReference; lastKnownFileType = text; path = "PSX-TODO"; sourceTree = ""; }; + 94CFB64E1A75DBE2001F174F /* SOURCES */ = {isa = PBXFileReference; lastKnownFileType = text; path = SOURCES; sourceTree = ""; }; + 94CFB64F1A75DBE2001F174F /* SPU-IRQ */ = {isa = PBXFileReference; lastKnownFileType = text; path = "SPU-IRQ"; sourceTree = ""; }; + 94CFB6501A75DBE2001F174F /* tristep.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = tristep.cpp; sourceTree = ""; }; + 94CFB6521A75DC2D001F174F /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; + 94CFB6531A75DC2D001F174F /* Makefile.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.in; sourceTree = ""; }; + 94CFB6541A75DC2D001F174F /* quicklz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = quicklz.c; sourceTree = ""; }; + 94CFB6551A75DC2D001F174F /* quicklz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quicklz.h; sourceTree = ""; }; + 94CFB6591A75DC7B001F174F /* state_rewind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = state_rewind.cpp; sourceTree = ""; }; + 94CFB65A1A75DC7B001F174F /* state_rewind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = state_rewind.h; sourceTree = ""; }; + 94CFB65D1A75DCB0001F174F /* brr.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = brr.cpp; sourceTree = ""; }; + 94CFB65E1A75DCB0001F174F /* counter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = counter.cpp; sourceTree = ""; }; + 94CFB65F1A75DCB0001F174F /* echo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = echo.cpp; sourceTree = ""; }; + 94CFB6601A75DCB0001F174F /* envelope.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = envelope.cpp; sourceTree = ""; }; + 94CFB6611A75DCB0001F174F /* gaussian.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = gaussian.cpp; sourceTree = ""; }; + 94CFB6621A75DCB0001F174F /* misc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = misc.cpp; sourceTree = ""; }; + 94CFB6631A75DCB0001F174F /* sdsp.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = sdsp.cpp; sourceTree = ""; }; + 94CFB6641A75DCB0001F174F /* sdsp.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = sdsp.hpp; sourceTree = ""; }; + 94CFB6651A75DCB0001F174F /* serialization.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = serialization.cpp; sourceTree = ""; }; + 94CFB6661A75DCB0001F174F /* voice.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = voice.cpp; sourceTree = ""; }; + 94FD853018C7F53C001B426D /* pcecd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pcecd.cpp; sourceTree = ""; }; + 94FD853118C7F53C001B426D /* pcecd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcecd.h; sourceTree = ""; }; + 94FD853318C7F58C001B426D /* trim.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = trim.cpp; sourceTree = ""; }; + 94FD853418C7F58C001B426D /* trim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trim.h; sourceTree = ""; }; + B340E4621E08887600AD0E8B /* PVMednafen.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PVMednafen.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B340E4641E08887700AD0E8B /* PVMednafen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PVMednafen.h; sourceTree = ""; }; + B340E4651E08887700AD0E8B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B340E46F1E08888700AD0E8B /* PVMednafen.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PVMednafen.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B340E5E61E0889FB00AD0E8B /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.1.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; + B340E5E81E088A0100AD0E8B /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; + B340E5EA1E088A1100AD0E8B /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.1.sdk/usr/lib/libiconv.tbd; sourceTree = DEVELOPER_DIR; }; + B340E5EC1E088A1E00AD0E8B /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/usr/lib/libiconv.tbd; sourceTree = DEVELOPER_DIR; }; + B340E5EE1E088A3500AD0E8B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + B340E5F01E088A3A00AD0E8B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.1.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + B340E5F21E088A4000AD0E8B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.1.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + B340E5F41E088A4500AD0E8B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + B340E5FA1E088AF100AD0E8B /* PVSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVSupport.framework; path = "../PVSupport/build/Debug-iphoneos/PVSupport.framework"; sourceTree = ""; }; + B340E5FC1E088AF700AD0E8B /* PVSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVSupport.framework; path = "../PVSupport/build/Debug-appletvos/PVSupport.framework"; sourceTree = ""; }; + D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B340E45E1E08887600AD0E8B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B340E5FB1E088AF100AD0E8B /* PVSupport.framework in Frameworks */, + B340E5F31E088A4000AD0E8B /* UIKit.framework in Frameworks */, + B340E5F11E088A3A00AD0E8B /* Foundation.framework in Frameworks */, + B340E5EB1E088A1100AD0E8B /* libiconv.tbd in Frameworks */, + B340E5E71E0889FB00AD0E8B /* libz.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B340E46B1E08888700AD0E8B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B340E5FD1E088AF700AD0E8B /* PVSupport.framework in Frameworks */, + B340E5F51E088A4500AD0E8B /* Foundation.framework in Frameworks */, + B340E5EF1E088A3500AD0E8B /* UIKit.framework in Frameworks */, + B340E5ED1E088A1E00AD0E8B /* libiconv.tbd in Frameworks */, + B340E5E91E088A0100AD0E8B /* libz.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 089C166AFE841209C02AAC07 /* Mednafen */ = { + isa = PBXGroup; + children = ( + 08FB77AFFE84173DC02AAC07 /* Classes */, + 32C88E010371C26100C91783 /* Other Sources */, + 089C167CFE841241C02AAC07 /* Resources */, + 089C1671FE841209C02AAC07 /* Frameworks and Libraries */, + B340E4631E08887700AD0E8B /* PVMednafen */, + 19C28FB8FE9D52D311CA2CBB /* Products */, + B340E5E51E0889FB00AD0E8B /* Frameworks */, + ); + name = Mednafen; + sourceTree = ""; + }; + 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 27FF3AC11B1CF78F002F941E /* libsndfile_FLAC.a */, + 9453E37E1AC5E305004F42AD /* libvorbisenc.a */, + 9453E37C1AC5E1E9004F42AD /* libvorbis.a */, + 9453E37A1AC5E051004F42AD /* libFLAC.a */, + 9453E3791AC5DA93004F42AD /* sndfile.h */, + 9453E3761AC5DA22004F42AD /* libsndfile.a */, + 8305628B1A98C6AD0030F6DB /* libiconv.dylib */, + 8240861A0FFDD64600F0FE7D /* libz.dylib */, + 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */, + 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */, + ); + name = "Frameworks and Libraries"; + sourceTree = ""; + }; + 089C167CFE841241C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 82CFBC510FFEF432002B6C7C /* Mednafen.icns */, + 8D5B49B7048680CD000E48DA /* Info.plist */, + 089C167DFE841241C02AAC07 /* InfoPlist.strings */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77AFFE84173DC02AAC07 /* Classes */ = { + isa = PBXGroup; + children = ( + 8CB3E08917F1DFFF0090372A /* include */, + 8CB3D51D17F1DE5A0090372A /* mednafen */, + 8CB3E0A517F1E1B80090372A /* OELynxSystemResponderClient.h */, + 944543EF1785282E006C057B /* OEPCESystemResponderClient.h */, + 940553AC17A3533E009B505D /* OEPCECDSystemResponderClient.h */, + 944543F01785283A006C057B /* OEPCFXSystemResponderClient.h */, + 944543EE17852820006C057B /* OEPSXSystemResponderClient.h */, + 944543F21785288D006C057B /* OEVBSystemResponderClient.h */, + 944543F31785289B006C057B /* OEWSSystemResponderClient.h */, + 824088340FFDDCF400F0FE7D /* MednafenGameCore.h */, + 824088350FFDDCF400F0FE7D /* MednafenGameCore.mm */, + 94454E3B17852E61006C057B /* stubs.cpp */, + 94454E3617852E44006C057B /* thread.cpp */, + 94454E3717852E44006C057B /* thread.h */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 089C167FFE841241C02AAC07 /* AppKit.framework */, + D2F7E65807B2D6F200F64583 /* CoreData.framework */, + 089C1672FE841209C02AAC07 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FB8FE9D52D311CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + B340E4621E08887600AD0E8B /* PVMednafen.framework */, + B340E46F1E08888700AD0E8B /* PVMednafen.framework */, + ); + name = Products; + sourceTree = ""; + }; + 32C88E010371C26100C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + ); + name = "Other Sources"; + sourceTree = ""; + }; + 87CD09231B3DFB5400021C64 /* snes_faust */ = { + isa = PBXGroup; + children = ( + 87CD09241B3DFB7600021C64 /* apu.cpp */, + 87CD09251B3DFB7600021C64 /* apu.h */, + 87CD09261B3DFB7600021C64 /* cart.cpp */, + 87CD09271B3DFB7600021C64 /* cart.h */, + 87CD09281B3DFB7600021C64 /* cpu_loop_body.inc */, + 87CD09291B3DFB7600021C64 /* cpu.cpp */, + 87CD092A1B3DFB7600021C64 /* cpu.h */, + 87CD092B1B3DFB7600021C64 /* dma.inc */, + 87CD092C1B3DFB7600021C64 /* dsp.inc */, + 87CD092D1B3DFB7600021C64 /* input.cpp */, + 87CD092E1B3DFB7600021C64 /* input.h */, + 87CD092F1B3DFB7600021C64 /* Makefile.am */, + 87CD09301B3DFB7600021C64 /* Makefile.in */, + 87CD09311B3DFB7600021C64 /* PPU_DESIGN */, + 87CD09321B3DFB7600021C64 /* ppu.cpp */, + 87CD09331B3DFB7600021C64 /* ppu.h */, + 87CD09341B3DFB7600021C64 /* snes.cpp */, + 87CD09351B3DFB7600021C64 /* snes.h */, + 87CD09361B3DFB7600021C64 /* spc700.inc */, + ); + name = snes_faust; + sourceTree = ""; + }; + 8CB3D51D17F1DE5A0090372A /* mednafen */ = { + isa = PBXGroup; + children = ( + 94817C291922B45500FDFC99 /* cdplay */, + 8CB3D51F17F1DE5A0090372A /* cdrom */, + 8CB3D54117F1DE5A0090372A /* compress */, + 8CB3D55017F1DE5A0090372A /* cputest */, + 8CB3D55917F1DE5A0090372A /* debug.cpp */, + 8CB3D55A17F1DE5A0090372A /* debug.h */, + 8CB3D55B17F1DE5A0090372A /* demo */, + 8CB3D55F17F1DE5A0090372A /* desa68 */, + 8CB3D56417F1DE5A0090372A /* dis6502.cpp */, + 8CB3D56517F1DE5A0090372A /* dis6502.h */, + 8CB3D56617F1DE5A0090372A /* driver.h */, + 8CB3D56717F1DE5A0090372A /* drivers */, + 8CB3D5BB17F1DE5B0090372A /* drivers_dos */, + 8CB3D5CD17F1DE5B0090372A /* endian.cpp */, + 8CB3D5CE17F1DE5B0090372A /* endian.h */, + 8CB3D5CF17F1DE5B0090372A /* error.cpp */, + 8CB3D5D017F1DE5B0090372A /* error.h */, + 8CB3D5D117F1DE5B0090372A /* file.cpp */, + 8CB3D5D217F1DE5B0090372A /* file.h */, + 8CB3D5D317F1DE5B0090372A /* FileStream.cpp */, + 8CB3D5D417F1DE5B0090372A /* FileStream.h */, + 8CB3D5D717F1DE5B0090372A /* gb */, + 8CB3D5E717F1DE5B0090372A /* gba */, + 8CB3D60B17F1DE5B0090372A /* general.cpp */, + 8CB3D60C17F1DE5B0090372A /* general.h */, + 8CB3D60D17F1DE5B0090372A /* gettext.h */, + 94CFB61E1A75D654001F174F /* git.cpp */, + 8CB3D60E17F1DE5B0090372A /* git.h */, + 94CFB6291A75D73F001F174F /* hash */, + 8CB3D60F17F1DE5B0090372A /* hw_cpu */, + 8CB3D64D17F1DE5B0090372A /* hw_misc */, + 8CB3D65317F1DE5B0090372A /* hw_sound */, + 8CB3D66E17F1DE5B0090372A /* hw_video */, + 94CFB6261A75D70C001F174F /* IPSPatcher.cpp */, + 94CFB6271A75D70C001F174F /* IPSPatcher.h */, + 8CB3D67717F1DE5B0090372A /* lepacker.h */, + 8CB3D67817F1DE5B0090372A /* lynx */, + 8CB3D69117F1DE5B0090372A /* Makefile.am */, + 8CB3D69217F1DE5B0090372A /* Makefile.in */, + 8CB3D69417F1DE5B0090372A /* math_ops.h */, + 8CB3D69517F1DE5B0090372A /* md */, + 8CB3D6E017F1DE5B0090372A /* mednafen-driver.h */, + 8CB3D6E117F1DE5B0090372A /* mednafen.cpp */, + 8CB3D6E217F1DE5B0090372A /* mednafen.h */, + 8CB3D6E317F1DE5B0090372A /* memory.cpp */, + 8CB3D6E417F1DE5B0090372A /* memory.h */, + 8CB3D6E517F1DE5B0090372A /* MemoryStream.cpp */, + 8CB3D6E617F1DE5B0090372A /* MemoryStream.h */, + 8CB3D6E717F1DE5B0090372A /* mempatcher-driver.h */, + 8CB3D6E817F1DE5B0090372A /* mempatcher.cpp */, + 8CB3D6E917F1DE5B0090372A /* mempatcher.h */, + 8CB3D6EA17F1DE5B0090372A /* movie-driver.h */, + 8CB3D6EB17F1DE5B0090372A /* movie.cpp */, + 8CB3D6EC17F1DE5B0090372A /* movie.h */, + 8CB3D6ED17F1DE5B0090372A /* mpcdec */, + 8CB3D70F17F1DE5B0090372A /* nes */, + 8CB3D7C317F1DE5B0090372A /* netplay-driver.h */, + 8CB3D7C417F1DE5B0090372A /* netplay.cpp */, + 8CB3D7C517F1DE5B0090372A /* netplay.h */, + 8CB3D7C617F1DE5B0090372A /* ngp */, + 8CB3D80F17F1DE5C0090372A /* pce */, + 8CB3D83017F1DE5C0090372A /* pce_fast */, + 8CB3D84417F1DE5C0090372A /* pcfx */, + 8CB3D86817F1DE5C0090372A /* player.cpp */, + 8CB3D86917F1DE5C0090372A /* player.h */, + 8CB3D86A17F1DE5C0090372A /* PSFLoader.cpp */, + 8CB3D86B17F1DE5C0090372A /* PSFLoader.h */, + 8CB3D86C17F1DE5C0090372A /* psx */, + 8CB3D8AA17F1DE5C0090372A /* qtrecord.cpp */, + 8CB3D8AB17F1DE5C0090372A /* qtrecord.h */, + 94CFB6511A75DC2D001F174F /* quicklz */, + 8CB3D8AC17F1DE5C0090372A /* resampler */, + 8CB3D8B417F1DE5C0090372A /* settings-common.h */, + 8CB3D8B517F1DE5C0090372A /* settings-driver.h */, + 8CB3D8B617F1DE5C0090372A /* settings.cpp */, + 8CB3D8B717F1DE5C0090372A /* settings.h */, + 8CB3D8B817F1DE5C0090372A /* sexyal */, + 8CB3D8C917F1DE5C0090372A /* sms */, + 8CB3D8E817F1DE5C0090372A /* snes */, + 87CD09231B3DFB5400021C64 /* snes_faust */, + 87CD091F1B3DFB3100021C64 /* SNSFLoader.cpp */, + 87CD09201B3DFB3100021C64 /* SNSFLoader.h */, + 8CB3DC0817F1DE5D0090372A /* sound */, + 87CD09211B3DFB4500021C64 /* SPCReader.cpp */, + 87CD09221B3DFB4500021C64 /* SPCReader.h */, + 94CFB6591A75DC7B001F174F /* state_rewind.cpp */, + 94CFB65A1A75DC7B001F174F /* state_rewind.h */, + 8CB3DC1017F1DE5D0090372A /* state-common.h */, + 8CB3DC1117F1DE5D0090372A /* state-driver.h */, + 8CB3DC1217F1DE5D0090372A /* state.cpp */, + 8CB3DC1317F1DE5D0090372A /* state.h */, + 8CB3DC1417F1DE5D0090372A /* Stream.cpp */, + 8CB3DC1517F1DE5D0090372A /* Stream.h */, + 8CB3DC1717F1DE5D0090372A /* string */, + 8CB3DC1F17F1DE5D0090372A /* tests.cpp */, + 8CB3DC2017F1DE5D0090372A /* tests.h */, + 8CB3DC2117F1DE5D0090372A /* tremor */, + 8CB3DC4D17F1DE5D0090372A /* trio */, + 8CB3DC5417F1DE5D0090372A /* types.h */, + 8CB3DC5517F1DE5D0090372A /* vb */, + 8CB3DC6517F1DE5D0090372A /* video */, + 8CB3DC8417F1DE5D0090372A /* video-driver.h */, + 8CB3DC8517F1DE5D0090372A /* video.h */, + 8CB3DC8617F1DE5D0090372A /* wswan */, + ); + path = mednafen; + sourceTree = ""; + }; + 8CB3D51F17F1DE5A0090372A /* cdrom */ = { + isa = PBXGroup; + children = ( + 8CB3D52417F1DE5A0090372A /* CDAccess.cpp */, + 8CB3D52517F1DE5A0090372A /* CDAccess.h */, + 8CB3D52617F1DE5A0090372A /* CDAccess_CCD.cpp */, + 8CB3D52717F1DE5A0090372A /* CDAccess_CCD.h */, + 8CB3D52817F1DE5A0090372A /* CDAccess_Image.cpp */, + 8CB3D52917F1DE5A0090372A /* CDAccess_Image.h */, + 94B082451A8697EF00D3C0BC /* CDAFReader_MPC.cpp */, + 94B082461A8697EF00D3C0BC /* CDAFReader_MPC.h */, + 94B082471A8697EF00D3C0BC /* CDAFReader_SF.cpp */, + 94B082481A8697EF00D3C0BC /* CDAFReader_SF.h */, + 94B082491A8697EF00D3C0BC /* CDAFReader_Vorbis.cpp */, + 94B0824A1A8697EF00D3C0BC /* CDAFReader_Vorbis.h */, + 94B0824B1A8697EF00D3C0BC /* CDAFReader.cpp */, + 94B0824C1A8697EF00D3C0BC /* CDAFReader.h */, + 8CB3D52C17F1DE5A0090372A /* cdromif.cpp */, + 8CB3D52D17F1DE5A0090372A /* cdromif.h */, + 8CB3D52E17F1DE5A0090372A /* CDUtility.cpp */, + 8CB3D52F17F1DE5A0090372A /* CDUtility.h */, + 8CB3D53017F1DE5A0090372A /* crc32.cpp */, + 8CB3D53117F1DE5A0090372A /* dvdisaster.h */, + 8CB3D53217F1DE5A0090372A /* galois-inlines.h */, + 8CB3D53317F1DE5A0090372A /* galois.cpp */, + 8CB3D53417F1DE5A0090372A /* l-ec.cpp */, + 8CB3D53517F1DE5A0090372A /* lec.cpp */, + 8CB3D53617F1DE5A0090372A /* lec.h */, + 8CB3D53717F1DE5A0090372A /* Makefile.am.inc */, + 8CB3D53A17F1DE5A0090372A /* recover-raw.cpp */, + 8CB3D53B17F1DE5A0090372A /* scsicd-pce-commands.inc */, + 8CB3D53C17F1DE5A0090372A /* scsicd.cpp */, + 8CB3D53D17F1DE5A0090372A /* scsicd.h */, + 8CB3D53F17F1DE5A0090372A /* SimpleFIFO.h */, + ); + path = cdrom; + sourceTree = ""; + }; + 8CB3D54117F1DE5A0090372A /* compress */ = { + isa = PBXGroup; + children = ( + 94B082511A86982900D3C0BC /* GZFileStream.cpp */, + 94B082521A86982900D3C0BC /* GZFileStream.h */, + 8CB3D54417F1DE5A0090372A /* ioapi.c */, + 8CB3D54517F1DE5A0090372A /* ioapi.h */, + 8CB3D54617F1DE5A0090372A /* lzoconf.h */, + 8CB3D54717F1DE5A0090372A /* lzodefs.h */, + 8CB3D54817F1DE5A0090372A /* Makefile.am.inc */, + 8CB3D54917F1DE5A0090372A /* minilzo.c */, + 8CB3D54A17F1DE5A0090372A /* minilzo.h */, + 8CB3D54D17F1DE5A0090372A /* README.LZO */, + 8CB3D54E17F1DE5A0090372A /* unzip.c */, + 8CB3D54F17F1DE5A0090372A /* unzip.h */, + 94CFB6231A75D6CB001F174F /* ZLInflateFilter.cpp */, + 94CFB6241A75D6CB001F174F /* ZLInflateFilter.h */, + ); + path = compress; + sourceTree = ""; + }; + 8CB3D55017F1DE5A0090372A /* cputest */ = { + isa = PBXGroup; + children = ( + 8CB3D55117F1DE5A0090372A /* arm_cpu.c */, + 8CB3D55217F1DE5A0090372A /* cputest.c */, + 8CB3D55317F1DE5A0090372A /* cputest.h */, + 8CB3D55417F1DE5A0090372A /* Makefile.am.inc */, + 8CB3D55517F1DE5A0090372A /* ppc_cpu.c */, + 8CB3D55617F1DE5A0090372A /* README */, + 8CB3D55717F1DE5A0090372A /* x86_cpu.c */, + 8CB3D55817F1DE5A0090372A /* x86_cpu.h */, + ); + path = cputest; + sourceTree = ""; + }; + 8CB3D55B17F1DE5A0090372A /* demo */ = { + isa = PBXGroup; + children = ( + 8CB3D55C17F1DE5A0090372A /* demo.cpp */, + 8CB3D55D17F1DE5A0090372A /* Makefile.am */, + 8CB3D55E17F1DE5A0090372A /* Makefile.in */, + ); + path = demo; + sourceTree = ""; + }; + 8CB3D55F17F1DE5A0090372A /* desa68 */ = { + isa = PBXGroup; + children = ( + 8CB3D56017F1DE5A0090372A /* desa68.c */, + 8CB3D56117F1DE5A0090372A /* desa68.h */, + 8CB3D56217F1DE5A0090372A /* Makefile.am */, + 8CB3D56317F1DE5A0090372A /* Makefile.in */, + ); + path = desa68; + sourceTree = ""; + }; + 8CB3D56717F1DE5A0090372A /* drivers */ = { + isa = PBXGroup; + children = ( + 8CB3D56817F1DE5A0090372A /* 2xSaI.cpp */, + 8CB3D56917F1DE5A0090372A /* 2xSaI.h */, + 8CB3D56A17F1DE5A0090372A /* args.cpp */, + 8CB3D56B17F1DE5A0090372A /* args.h */, + 8CB3D56C17F1DE5A0090372A /* cheat.cpp */, + 8CB3D56D17F1DE5A0090372A /* cheat.h */, + 8CB3D56E17F1DE5A0090372A /* console.cpp */, + 8CB3D56F17F1DE5A0090372A /* console.h */, + 8CB3D57017F1DE5A0090372A /* debugger.cpp */, + 8CB3D57117F1DE5A0090372A /* debugger.h */, + 8CB3D57217F1DE5A0090372A /* ers.cpp */, + 8CB3D57317F1DE5A0090372A /* ers.h */, + 8CB3D57417F1DE5A0090372A /* fps.cpp */, + 8CB3D57517F1DE5A0090372A /* fps.h */, + 8CB3D57617F1DE5A0090372A /* gfxdebugger.cpp */, + 8CB3D57717F1DE5A0090372A /* gfxdebugger.h */, + 8CB3D57817F1DE5A0090372A /* help.cpp */, + 8CB3D57917F1DE5A0090372A /* help.h */, + 8CB3D57A17F1DE5A0090372A /* hq2x.cpp */, + 8CB3D57B17F1DE5A0090372A /* hq3x.cpp */, + 8CB3D57C17F1DE5A0090372A /* hq4x.cpp */, + 8CB3D57D17F1DE5A0090372A /* hqxx-common.cpp */, + 8CB3D57E17F1DE5A0090372A /* hqxx-common.h */, + 8CB3D57F17F1DE5A0090372A /* icon.h */, + 8CB3D58017F1DE5A0090372A /* input-config.cpp */, + 8CB3D58117F1DE5A0090372A /* input-config.h */, + 8CB3D58217F1DE5A0090372A /* input-default-buttons.h */, + 8CB3D58317F1DE5A0090372A /* input.cpp */, + 8CB3D58417F1DE5A0090372A /* input.h */, + 8CB3D58517F1DE5A0090372A /* Joystick.cpp */, + 8CB3D58617F1DE5A0090372A /* Joystick.h */, + 8CB3D58717F1DE5A0090372A /* Joystick_DX5.cpp */, + 8CB3D58817F1DE5A0090372A /* Joystick_DX5.h */, + 8CB3D58B17F1DE5A0090372A /* Joystick_Linux.cpp */, + 8CB3D58C17F1DE5A0090372A /* Joystick_Linux.h */, + 8CB3D58D17F1DE5A0090372A /* Joystick_SDL.cpp */, + 8CB3D58E17F1DE5A0090372A /* Joystick_SDL.h */, + 8CB3D58F17F1DE5A0090372A /* Joystick_XInput.cpp */, + 8CB3D59017F1DE5A0090372A /* Joystick_XInput.h */, + 8CB3D59117F1DE5A0090372A /* logdebugger.cpp */, + 8CB3D59217F1DE5A0090372A /* logdebugger.h */, + 8CB3D59317F1DE5A0090372A /* main.cpp */, + 8CB3D59417F1DE5A0090372A /* main.h */, + 8CB3D59517F1DE5A0090372A /* Makefile.am */, + 8CB3D59617F1DE5A0090372A /* Makefile.in */, + 8CB3D59717F1DE5A0090372A /* memdebugger.cpp */, + 8CB3D59817F1DE5A0090372A /* memdebugger.h */, + 8CB3D59917F1DE5A0090372A /* NetClient.h */, + 8CB3D59A17F1DE5A0090372A /* NetClient_POSIX.cpp */, + 8CB3D59B17F1DE5A0090372A /* NetClient_POSIX.h */, + 8CB3D59C17F1DE5A0090372A /* NetClient_WS2.cpp */, + 8CB3D59D17F1DE5B0090372A /* NetClient_WS2.h */, + 8CB3D59E17F1DE5B0090372A /* netplay.cpp */, + 8CB3D59F17F1DE5B0090372A /* netplay.h */, + 8CB3D5A017F1DE5B0090372A /* nnx.cpp */, + 8CB3D5A117F1DE5B0090372A /* nnx.h */, + 8CB3D5A217F1DE5B0090372A /* nongl.cpp */, + 8CB3D5A317F1DE5B0090372A /* nongl.h */, + 8CB3D5A417F1DE5B0090372A /* opengl.cpp */, + 8CB3D5A517F1DE5B0090372A /* opengl.h */, + 8CB3D5A617F1DE5B0090372A /* overlay.cpp */, + 8CB3D5A717F1DE5B0090372A /* overlay.h */, + 8CB3D5A817F1DE5B0090372A /* prompt.cpp */, + 8CB3D5A917F1DE5B0090372A /* prompt.h */, + 8CB3D5AA17F1DE5B0090372A /* remote.cpp */, + 8CB3D5AB17F1DE5B0090372A /* remote.h */, + 94CFB6351A75DA0E001F174F /* rmdui.cpp */, + 94CFB6361A75DA0E001F174F /* rmdui.h */, + 8CB3D5AC17F1DE5B0090372A /* scale2x.c */, + 8CB3D5AD17F1DE5B0090372A /* scale2x.h */, + 8CB3D5AE17F1DE5B0090372A /* scale3x.c */, + 8CB3D5AF17F1DE5B0090372A /* scale3x.h */, + 8CB3D5B017F1DE5B0090372A /* scalebit.c */, + 8CB3D5B117F1DE5B0090372A /* scalebit.h */, + 8CB3D5B217F1DE5B0090372A /* shader.cpp */, + 8CB3D5B317F1DE5B0090372A /* shader.h */, + 8CB3D5B417F1DE5B0090372A /* shader_sabr.inc */, + 8CB3D5B517F1DE5B0090372A /* sound.cpp */, + 8CB3D5B617F1DE5B0090372A /* sound.h */, + 94817C411922B8DF00FDFC99 /* thread_sdl.cpp */, + 94817C421922B8DF00FDFC99 /* thread_win32.cpp */, + 8CB3D5B717F1DE5B0090372A /* video-state.cpp */, + 8CB3D5B817F1DE5B0090372A /* video-state.h */, + 8CB3D5B917F1DE5B0090372A /* video.cpp */, + 8CB3D5BA17F1DE5B0090372A /* video.h */, + ); + path = drivers; + sourceTree = ""; + }; + 8CB3D5BB17F1DE5B0090372A /* drivers_dos */ = { + isa = PBXGroup; + children = ( + 8CB3D5BC17F1DE5B0090372A /* Joystick.cpp */, + 8CB3D5BD17F1DE5B0090372A /* Joystick.h */, + 8CB3D5C017F1DE5B0090372A /* Joystick_DOS_Standard.cpp */, + 8CB3D5C117F1DE5B0090372A /* Joystick_DOS_Standard.h */, + 8CB3D5C417F1DE5B0090372A /* Makefile.am */, + 8CB3D5C617F1DE5B0090372A /* Sound.h */, + 8CB3D5CA17F1DE5B0090372A /* Video.h */, + 8CB3D5CC17F1DE5B0090372A /* Video_VGA.h */, + ); + path = drivers_dos; + sourceTree = ""; + }; + 8CB3D5D717F1DE5B0090372A /* gb */ = { + isa = PBXGroup; + children = ( + 8CB3D5D817F1DE5B0090372A /* gb.cpp */, + 8CB3D5D917F1DE5B0090372A /* gb.h */, + 8CB3D5DA17F1DE5B0090372A /* gbCodes.h */, + 8CB3D5DB17F1DE5B0090372A /* gbCodesCB.h */, + 8CB3D5DC17F1DE5B0090372A /* gbGlobals.cpp */, + 8CB3D5DD17F1DE5B0090372A /* gbGlobals.h */, + 8CB3D5DE17F1DE5B0090372A /* gfx.cpp */, + 8CB3D5DF17F1DE5B0090372A /* Makefile.am */, + 8CB3D5E017F1DE5B0090372A /* Makefile.in */, + 8CB3D5E117F1DE5B0090372A /* memory.cpp */, + 8CB3D5E217F1DE5B0090372A /* memory.h */, + 8CB3D5E317F1DE5B0090372A /* sound.cpp */, + 8CB3D5E417F1DE5B0090372A /* sound.h */, + 8CB3D5E517F1DE5B0090372A /* z80.cpp */, + 8CB3D5E617F1DE5B0090372A /* z80.h */, + ); + path = gb; + sourceTree = ""; + }; + 8CB3D5E717F1DE5B0090372A /* gba */ = { + isa = PBXGroup; + children = ( + 8CB3D5E817F1DE5B0090372A /* arm.cpp */, + 8CB3D5E917F1DE5B0090372A /* arm.h */, + 8CB3D5EA17F1DE5B0090372A /* bios.cpp */, + 8CB3D5EB17F1DE5B0090372A /* bios.h */, + 8CB3D5EC17F1DE5B0090372A /* eeprom.cpp */, + 8CB3D5ED17F1DE5B0090372A /* eeprom.h */, + 8CB3D5EE17F1DE5B0090372A /* flash.cpp */, + 8CB3D5EF17F1DE5B0090372A /* flash.h */, + 8CB3D5F017F1DE5B0090372A /* GBA.cpp */, + 8CB3D5F117F1DE5B0090372A /* GBA.h */, + 8CB3D5F217F1DE5B0090372A /* GBAinline.cpp */, + 8CB3D5F317F1DE5B0090372A /* GBAinline.h */, + 8CB3D5F417F1DE5B0090372A /* gfx-draw.h */, + 8CB3D5F517F1DE5B0090372A /* Gfx.cpp */, + 8CB3D5F617F1DE5B0090372A /* Gfx.h */, + 8CB3D5F717F1DE5B0090372A /* Globals.cpp */, + 8CB3D5F817F1DE5B0090372A /* Globals.h */, + 8CB3D5F917F1DE5B0090372A /* Makefile.am */, + 8CB3D5FA17F1DE5B0090372A /* Makefile.in */, + 8CB3D5FB17F1DE5B0090372A /* Mode0.cpp */, + 8CB3D5FC17F1DE5B0090372A /* Mode1.cpp */, + 8CB3D5FD17F1DE5B0090372A /* Mode2.cpp */, + 8CB3D5FE17F1DE5B0090372A /* Mode3.cpp */, + 8CB3D5FF17F1DE5B0090372A /* Mode4.cpp */, + 8CB3D60017F1DE5B0090372A /* Mode5.cpp */, + 8CB3D60117F1DE5B0090372A /* myrom.h */, + 8CB3D60217F1DE5B0090372A /* Port.h */, + 8CB3D60317F1DE5B0090372A /* RTC.cpp */, + 8CB3D60417F1DE5B0090372A /* RTC.h */, + 8CB3D60517F1DE5B0090372A /* Sound.cpp */, + 8CB3D60617F1DE5B0090372A /* Sound.h */, + 8CB3D60717F1DE5B0090372A /* sram.cpp */, + 8CB3D60817F1DE5B0090372A /* sram.h */, + 8CB3D60917F1DE5B0090372A /* thumb.cpp */, + 8CB3D60A17F1DE5B0090372A /* thumb.h */, + ); + path = gba; + sourceTree = ""; + }; + 8CB3D60F17F1DE5B0090372A /* hw_cpu */ = { + isa = PBXGroup; + children = ( + 8CB3D61017F1DE5B0090372A /* c68k */, + 8CB3D62917F1DE5B0090372A /* huc6280 */, + 8CB3D63017F1DE5B0090372A /* Makefile.am */, + 8CB3D63117F1DE5B0090372A /* Makefile.in */, + 8CB3D63217F1DE5B0090372A /* v810 */, + 8CB3D64317F1DE5B0090372A /* z80-fuse */, + ); + path = hw_cpu; + sourceTree = ""; + }; + 8CB3D61017F1DE5B0090372A /* c68k */ = { + isa = PBXGroup; + children = ( + 94CFB6371A75DA89001F174F /* c68k.cpp */, + 8CB3D61217F1DE5B0090372A /* c68k.h */, + 8CB3D61317F1DE5B0090372A /* c68k_ini.inc */, + 8CB3D61417F1DE5B0090372A /* c68k_op0.inc */, + 8CB3D61517F1DE5B0090372A /* c68k_op1.inc */, + 8CB3D61617F1DE5B0090372A /* c68k_op2.inc */, + 8CB3D61717F1DE5B0090372A /* c68k_op3.inc */, + 8CB3D61817F1DE5B0090372A /* c68k_op4.inc */, + 8CB3D61917F1DE5B0090372A /* c68k_op5.inc */, + 8CB3D61A17F1DE5B0090372A /* c68k_op6.inc */, + 8CB3D61B17F1DE5B0090372A /* c68k_op7.inc */, + 8CB3D61C17F1DE5B0090372A /* c68k_op8.inc */, + 8CB3D61D17F1DE5B0090372A /* c68k_op9.inc */, + 8CB3D61E17F1DE5B0090372A /* c68k_opA.inc */, + 8CB3D61F17F1DE5B0090372A /* c68k_opB.inc */, + 8CB3D62017F1DE5B0090372A /* c68k_opC.inc */, + 8CB3D62117F1DE5B0090372A /* c68k_opD.inc */, + 8CB3D62217F1DE5B0090372A /* c68k_opE.inc */, + 8CB3D62317F1DE5B0090372A /* c68k_opF.inc */, + 94CFB6381A75DA9C001F174F /* c68kexec.cpp */, + 8CB3D62517F1DE5B0090372A /* c68kmac.inc */, + 94CFB6391A75DAAC001F174F /* gen68k.cpp */, + 8CB3D62717F1DE5B0090372A /* gen68k.h */, + 8CB3D62817F1DE5B0090372A /* gen68k.inc */, + ); + path = c68k; + sourceTree = ""; + }; + 8CB3D62917F1DE5B0090372A /* huc6280 */ = { + isa = PBXGroup; + children = ( + 8CB3D62A17F1DE5B0090372A /* dis6280.cpp */, + 8CB3D62B17F1DE5B0090372A /* dis6280.h */, + 8CB3D62C17F1DE5B0090372A /* huc6280.cpp */, + 8CB3D62D17F1DE5B0090372A /* huc6280.h */, + 8CB3D62E17F1DE5B0090372A /* huc6280_step.inc */, + 8CB3D62F17F1DE5B0090372A /* ops.inc */, + ); + path = huc6280; + sourceTree = ""; + }; + 8CB3D63217F1DE5B0090372A /* v810 */ = { + isa = PBXGroup; + children = ( + 8CB3D63B17F1DE5B0090372A /* v810_cpu.cpp */, + 8CB3D63C17F1DE5B0090372A /* v810_cpu.h */, + 8CB3D63D17F1DE5B0090372A /* v810_cpuD.cpp */, + 8CB3D63E17F1DE5B0090372A /* v810_cpuD.h */, + 8CB3D63F17F1DE5B0090372A /* v810_do_am.h */, + 94817C3D1922B75000FDFC99 /* v810_fp_ops.cpp */, + 94817C3E1922B75000FDFC99 /* v810_fp_ops.h */, + 8CB3D64117F1DE5B0090372A /* v810_oploop.inc */, + 8CB3D64217F1DE5B0090372A /* v810_opt.h */, + ); + path = v810; + sourceTree = ""; + }; + 8CB3D64317F1DE5B0090372A /* z80-fuse */ = { + isa = PBXGroup; + children = ( + 8CB3D64417F1DE5B0090372A /* opcodes_base.c */, + 8CB3D64517F1DE5B0090372A /* z80.cpp */, + 8CB3D64617F1DE5B0090372A /* z80.h */, + 8CB3D64717F1DE5B0090372A /* z80_cb.c */, + 8CB3D64817F1DE5B0090372A /* z80_ddfd.c */, + 8CB3D64917F1DE5B0090372A /* z80_ddfdcb.c */, + 8CB3D64A17F1DE5B0090372A /* z80_ed.c */, + 8CB3D64B17F1DE5B0090372A /* z80_macros.h */, + 8CB3D64C17F1DE5B0090372A /* z80_ops.cpp */, + ); + path = "z80-fuse"; + sourceTree = ""; + }; + 8CB3D64D17F1DE5B0090372A /* hw_misc */ = { + isa = PBXGroup; + children = ( + 8CB3D64E17F1DE5B0090372A /* arcade_card */, + 8CB3D65117F1DE5B0090372A /* Makefile.am */, + 8CB3D65217F1DE5B0090372A /* Makefile.in */, + ); + path = hw_misc; + sourceTree = ""; + }; + 8CB3D64E17F1DE5B0090372A /* arcade_card */ = { + isa = PBXGroup; + children = ( + 8CB3D64F17F1DE5B0090372A /* arcade_card.cpp */, + 8CB3D65017F1DE5B0090372A /* arcade_card.h */, + ); + path = arcade_card; + sourceTree = ""; + }; + 8CB3D65317F1DE5B0090372A /* hw_sound */ = { + isa = PBXGroup; + children = ( + 8CB3D65417F1DE5B0090372A /* gb_apu */, + 8CB3D65D17F1DE5B0090372A /* Makefile.am */, + 8CB3D65E17F1DE5B0090372A /* Makefile.in */, + 8CB3D65F17F1DE5B0090372A /* pce_psg */, + 8CB3D66217F1DE5B0090372A /* sms_apu */, + 8CB3D66617F1DE5B0090372A /* ym2413 */, + 8CB3D66A17F1DE5B0090372A /* ym2612 */, + ); + path = hw_sound; + sourceTree = ""; + }; + 8CB3D65417F1DE5B0090372A /* gb_apu */ = { + isa = PBXGroup; + children = ( + 8CB3D65517F1DE5B0090372A /* blargg_common.h */, + 8CB3D65617F1DE5B0090372A /* blargg_config.h */, + 8CB3D65717F1DE5B0090372A /* blargg_source.h */, + 8CB3D65817F1DE5B0090372A /* Gb_Apu.cpp */, + 8CB3D65917F1DE5B0090372A /* Gb_Apu.h */, + 8CB3D65A17F1DE5B0090372A /* Gb_Apu_State.cpp */, + 8CB3D65B17F1DE5B0090372A /* Gb_Oscs.cpp */, + 8CB3D65C17F1DE5B0090372A /* Gb_Oscs.h */, + ); + path = gb_apu; + sourceTree = ""; + }; + 8CB3D65F17F1DE5B0090372A /* pce_psg */ = { + isa = PBXGroup; + children = ( + 8CB3D66017F1DE5B0090372A /* pce_psg.cpp */, + 8CB3D66117F1DE5B0090372A /* pce_psg.h */, + ); + path = pce_psg; + sourceTree = ""; + }; + 8CB3D66217F1DE5B0090372A /* sms_apu */ = { + isa = PBXGroup; + children = ( + 8CB3D66317F1DE5B0090372A /* Sms_Apu.cpp */, + 8CB3D66417F1DE5B0090372A /* Sms_Apu.h */, + 8CB3D66517F1DE5B0090372A /* Sms_Oscs.h */, + ); + path = sms_apu; + sourceTree = ""; + }; + 8CB3D66617F1DE5B0090372A /* ym2413 */ = { + isa = PBXGroup; + children = ( + 8CB3D66717F1DE5B0090372A /* 2413tone.h */, + 8CB3D66817F1DE5B0090372A /* emu2413.cpp */, + 8CB3D66917F1DE5B0090372A /* emu2413.h */, + ); + path = ym2413; + sourceTree = ""; + }; + 8CB3D66A17F1DE5B0090372A /* ym2612 */ = { + isa = PBXGroup; + children = ( + 8CB3D66B17F1DE5B0090372A /* Ym2612_Emu.cpp */, + 8CB3D66C17F1DE5B0090372A /* Ym2612_Emu.h */, + 8CB3D66D17F1DE5B0090372A /* ym2612_opeg.inc */, + ); + path = ym2612; + sourceTree = ""; + }; + 8CB3D66E17F1DE5B0090372A /* hw_video */ = { + isa = PBXGroup; + children = ( + 8CB3D66F17F1DE5B0090372A /* huc6270 */, + 8CB3D67517F1DE5B0090372A /* Makefile.am */, + 8CB3D67617F1DE5B0090372A /* Makefile.in */, + ); + path = hw_video; + sourceTree = ""; + }; + 8CB3D66F17F1DE5B0090372A /* huc6270 */ = { + isa = PBXGroup; + children = ( + 8CB3D67317F1DE5B0090372A /* vdc.cpp */, + 8CB3D67417F1DE5B0090372A /* vdc.h */, + ); + path = huc6270; + sourceTree = ""; + }; + 8CB3D67817F1DE5B0090372A /* lynx */ = { + isa = PBXGroup; + children = ( + 8CB3D67917F1DE5B0090372A /* c6502mak.h */, + 8CB3D67A17F1DE5B0090372A /* c65c02.cpp */, + 8CB3D67B17F1DE5B0090372A /* c65c02.h */, + 8CB3D67C17F1DE5B0090372A /* cart.cpp */, + 8CB3D67D17F1DE5B0090372A /* cart.h */, + 8CB3D67E17F1DE5B0090372A /* license.txt */, + 8CB3D67F17F1DE5B0090372A /* lynxbase.h */, + 8CB3D68017F1DE5B0090372A /* lynxdef.h */, + 8CB3D68117F1DE5B0090372A /* machine.h */, + 8CB3D68217F1DE5B0090372A /* Makefile.am */, + 8CB3D68317F1DE5B0090372A /* Makefile.in */, + 8CB3D68417F1DE5B0090372A /* memmap.cpp */, + 8CB3D68517F1DE5B0090372A /* memmap.h */, + 8CB3D68617F1DE5B0090372A /* mikie.cpp */, + 8CB3D68717F1DE5B0090372A /* mikie.h */, + 8CB3D68817F1DE5B0090372A /* ram.cpp */, + 8CB3D68917F1DE5B0090372A /* ram.h */, + 8CB3D68A17F1DE5B0090372A /* rom.cpp */, + 8CB3D68B17F1DE5B0090372A /* rom.h */, + 8CB3D68C17F1DE5B0090372A /* susie.cpp */, + 8CB3D68D17F1DE5B0090372A /* susie.h */, + 8CB3D68E17F1DE5B0090372A /* sysbase.h */, + 8CB3D68F17F1DE5B0090372A /* system.cpp */, + 8CB3D69017F1DE5B0090372A /* system.h */, + ); + path = lynx; + sourceTree = ""; + }; + 8CB3D69517F1DE5B0090372A /* md */ = { + isa = PBXGroup; + children = ( + 8CB3D69617F1DE5B0090372A /* cart */, + 8CB3D6AF17F1DE5B0090372A /* cd */, + 8CB3D6BB17F1DE5B0090372A /* debug.cpp */, + 8CB3D6BC17F1DE5B0090372A /* debug.h */, + 8CB3D6BD17F1DE5B0090372A /* genesis.cpp */, + 8CB3D6BE17F1DE5B0090372A /* genesis.h */, + 8CB3D6BF17F1DE5B0090372A /* genio.cpp */, + 8CB3D6C017F1DE5B0090372A /* genio.h */, + 8CB3D6C117F1DE5B0090372A /* header.cpp */, + 8CB3D6C217F1DE5B0090372A /* header.h */, + 8CB3D6C317F1DE5B0090372A /* hvc.h */, + 8CB3D6C417F1DE5B0090372A /* input */, + 8CB3D6C917F1DE5B0090372A /* macros.h */, + 8CB3D6CA17F1DE5B0090372A /* Makefile.am */, + 8CB3D6CB17F1DE5B0090372A /* Makefile.in */, + 8CB3D6CC17F1DE5B0090372A /* mem68k.cpp */, + 8CB3D6CD17F1DE5B0090372A /* mem68k.h */, + 8CB3D6CE17F1DE5B0090372A /* membnk.cpp */, + 8CB3D6CF17F1DE5B0090372A /* membnk.h */, + 8CB3D6D017F1DE5B0090372A /* memvdp.cpp */, + 8CB3D6D117F1DE5B0090372A /* memvdp.h */, + 8CB3D6D217F1DE5B0090372A /* memz80.cpp */, + 8CB3D6D317F1DE5B0090372A /* memz80.h */, + 8CB3D6D517F1DE5B0090372A /* shared.h */, + 8CB3D6D617F1DE5B0090372A /* sound.cpp */, + 8CB3D6D717F1DE5B0090372A /* sound.h */, + 8CB3D6D817F1DE5B0090372A /* system.cpp */, + 8CB3D6D917F1DE5B0090372A /* system.h */, + 8CB3D6DA17F1DE5B0090372A /* vcnt.h */, + 8CB3D6DB17F1DE5B0090372A /* vdp.cpp */, + 8CB3D6DC17F1DE5B0090372A /* vdp.h */, + 8CB3D6DD17F1DE5B0090372A /* vdp_run.inc */, + ); + path = md; + sourceTree = ""; + }; + 8CB3D69617F1DE5B0090372A /* cart */ = { + isa = PBXGroup; + children = ( + 8CB3D69717F1DE5B0090372A /* cart.cpp */, + 8CB3D69817F1DE5B0090372A /* cart.h */, + 8CB3D69917F1DE5B0090372A /* map_eeprom.cpp */, + 8CB3D69A17F1DE5B0090372A /* map_eeprom.h */, + 8CB3D69B17F1DE5B0090372A /* map_ff.cpp */, + 8CB3D69C17F1DE5B0090372A /* map_ff.h */, + 8CB3D69D17F1DE5B0090372A /* map_realtec.cpp */, + 8CB3D69E17F1DE5B0090372A /* map_realtec.h */, + 8CB3D69F17F1DE5B0090372A /* map_rmx3.cpp */, + 8CB3D6A017F1DE5B0090372A /* map_rmx3.h */, + 8CB3D6A117F1DE5B0090372A /* map_rom.cpp */, + 8CB3D6A217F1DE5B0090372A /* map_rom.h */, + 8CB3D6A317F1DE5B0090372A /* map_sbb.cpp */, + 8CB3D6A417F1DE5B0090372A /* map_sbb.h */, + 8CB3D6A517F1DE5B0090372A /* map_sram.cpp */, + 8CB3D6A617F1DE5B0090372A /* map_sram.h */, + 8CB3D6A717F1DE5B0090372A /* map_ssf2.cpp */, + 8CB3D6A817F1DE5B0090372A /* map_ssf2.h */, + 8CB3D6A917F1DE5B0090372A /* map_svp.cpp */, + 8CB3D6AA17F1DE5B0090372A /* map_svp.h */, + 8CB3D6AB17F1DE5B0090372A /* map_yase.cpp */, + 8CB3D6AC17F1DE5B0090372A /* map_yase.h */, + 8CB3D6AD17F1DE5B0090372A /* ssp16.c */, + 8CB3D6AE17F1DE5B0090372A /* ssp16.h */, + ); + path = cart; + sourceTree = ""; + }; + 8CB3D6AF17F1DE5B0090372A /* cd */ = { + isa = PBXGroup; + children = ( + 8CB3D6B017F1DE5B0090372A /* cd.cpp */, + 8CB3D6B117F1DE5B0090372A /* cd.h */, + 8CB3D6B217F1DE5B0090372A /* cdc_cdd.cpp */, + 8CB3D6B317F1DE5B0090372A /* cdc_cdd.h */, + 8CB3D6B417F1DE5B0090372A /* interrupt.cpp */, + 8CB3D6B517F1DE5B0090372A /* interrupt.h */, + 8CB3D6B617F1DE5B0090372A /* pcm.cpp */, + 8CB3D6B717F1DE5B0090372A /* pcm.h */, + 8CB3D6B817F1DE5B0090372A /* timer.cpp */, + 8CB3D6B917F1DE5B0090372A /* timer.h */, + ); + path = cd; + sourceTree = ""; + }; + 8CB3D6C417F1DE5B0090372A /* input */ = { + isa = PBXGroup; + children = ( + 94CFB63A1A75DB0A001F174F /* 4way.cpp */, + 94CFB63B1A75DB0A001F174F /* 4way.h */, + 8CB3D6C517F1DE5B0090372A /* gamepad.cpp */, + 8CB3D6C617F1DE5B0090372A /* gamepad.h */, + 94CFB63C1A75DB15001F174F /* megamouse.cpp */, + 94CFB63D1A75DB15001F174F /* megamouse.h */, + 94CFB63E1A75DB15001F174F /* multitap.cpp */, + 94CFB63F1A75DB15001F174F /* multitap.h */, + ); + path = input; + sourceTree = ""; + }; + 8CB3D6ED17F1DE5B0090372A /* mpcdec */ = { + isa = PBXGroup; + children = ( + 8CB3D6EE17F1DE5B0090372A /* !VERSION */, + 8CB3D6EF17F1DE5B0090372A /* AUTHORS */, + 8CB3D6F017F1DE5B0090372A /* ChangeLog */, + 8CB3D6F117F1DE5B0090372A /* CMakeLists.txt */, + 8CB3D6F217F1DE5B0090372A /* COPYING */, + 8CB3D6F317F1DE5B0090372A /* crc32.c */, + 8CB3D6F417F1DE5B0090372A /* datatypes.h */, + 8CB3D6F517F1DE5B0090372A /* decoder.h */, + 8CB3D6F817F1DE5B0090372A /* huffman.c */, + 8CB3D6F917F1DE5B0090372A /* huffman.h */, + 8CB3D6FA17F1DE5B0090372A /* internal.h */, + 8CB3D6FB17F1DE5B0090372A /* Makefile.am */, + 8CB3D6FC17F1DE5B0090372A /* Makefile.in */, + 8CB3D6FD17F1DE5B0090372A /* minimax.h */, + 8CB3D6FE17F1DE5B0090372A /* mpc_bits_reader.c */, + 8CB3D6FF17F1DE5B0090372A /* mpc_bits_reader.h */, + 8CB3D70017F1DE5B0090372A /* mpc_decoder.c */, + 8CB3D70117F1DE5B0090372A /* mpc_demux.c */, + 8CB3D70217F1DE5B0090372A /* mpc_reader.c */, + 8CB3D70317F1DE5B0090372A /* mpc_types.h */, + 8CB3D70417F1DE5B0090372A /* mpcdec.h */, + 8CB3D70517F1DE5B0090372A /* mpcdec_math.h */, + 8CB3D70617F1DE5B0090372A /* mpcmath.h */, + 8CB3D70717F1DE5B0090372A /* reader.h */, + 8CB3D70817F1DE5B0090372A /* README */, + 8CB3D70917F1DE5B0090372A /* requant.c */, + 8CB3D70A17F1DE5B0090372A /* requant.h */, + 8CB3D70B17F1DE5B0090372A /* streaminfo.c */, + 8CB3D70C17F1DE5B0090372A /* streaminfo.h */, + 8CB3D70D17F1DE5B0090372A /* synth_filter.c */, + ); + path = mpcdec; + sourceTree = ""; + }; + 8CB3D70F17F1DE5B0090372A /* nes */ = { + isa = PBXGroup; + children = ( + 8CB3D71017F1DE5B0090372A /* boards */, + 8CB3D77217F1DE5B0090372A /* cart.cpp */, + 8CB3D77317F1DE5B0090372A /* cart.h */, + 8CB3D77517F1DE5B0090372A /* debug.cpp */, + 8CB3D77617F1DE5B0090372A /* debug.h */, + 8CB3D77817F1DE5B0090372A /* fds-sound.cpp */, + 8CB3D77917F1DE5B0090372A /* fds-sound.h */, + 8CB3D77A17F1DE5B0090372A /* fds.cpp */, + 8CB3D77B17F1DE5B0090372A /* fds.h */, + 8CB3D77C17F1DE5B0090372A /* filter.cpp */, + 8CB3D77D17F1DE5B0090372A /* filter.h */, + 8CB3D77E17F1DE5B0090372A /* ines-bad.inc */, + 8CB3D77F17F1DE5B0090372A /* ines-correct.inc */, + 8CB3D78017F1DE5B0090372A /* ines.cpp */, + 8CB3D78117F1DE5B0090372A /* ines.h */, + 8CB3D78217F1DE5B0090372A /* input */, + 8CB3D79517F1DE5B0090372A /* input.cpp */, + 8CB3D79617F1DE5B0090372A /* input.h */, + 8CB3D79717F1DE5B0090372A /* Makefile.am */, + 8CB3D79817F1DE5B0090372A /* Makefile.in */, + 8CB3D79917F1DE5B0090372A /* nes.cpp */, + 8CB3D79A17F1DE5B0090372A /* nes.h */, + 8CB3D79B17F1DE5B0090372A /* nsf.cpp */, + 8CB3D79C17F1DE5B0090372A /* nsf.h */, + 8CB3D79D17F1DE5B0090372A /* nsfe.cpp */, + 8CB3D79E17F1DE5B0090372A /* nsfe.h */, + 8CB3D79F17F1DE5B0090372A /* ntsc */, + 8CB3D7A917F1DE5B0090372A /* ops.h */, + 8CB3D7AA17F1DE5B0090372A /* ppu */, + 8CB3D7BA17F1DE5B0090372A /* sound.cpp */, + 8CB3D7BB17F1DE5B0090372A /* sound.h */, + 8CB3D7BC17F1DE5B0090372A /* unif.cpp */, + 8CB3D7BD17F1DE5B0090372A /* unif.h */, + 8CB3D7BE17F1DE5B0090372A /* vsuni.cpp */, + 8CB3D7BF17F1DE5B0090372A /* vsuni.h */, + 8CB3D7C017F1DE5B0090372A /* x6502.cpp */, + 8CB3D7C117F1DE5B0090372A /* x6502.h */, + 8CB3D7C217F1DE5B0090372A /* x6502struct.h */, + ); + path = nes; + sourceTree = ""; + }; + 8CB3D71017F1DE5B0090372A /* boards */ = { + isa = PBXGroup; + children = ( + 8CB3D71117F1DE5B0090372A /* 107.cpp */, + 8CB3D71217F1DE5B0090372A /* 112.cpp */, + 8CB3D71317F1DE5B0090372A /* 113.cpp */, + 8CB3D71417F1DE5B0090372A /* 114.cpp */, + 8CB3D71517F1DE5B0090372A /* 117.cpp */, + 8CB3D71617F1DE5B0090372A /* 140.cpp */, + 8CB3D71717F1DE5B0090372A /* 15.cpp */, + 8CB3D71817F1DE5B0090372A /* 151.cpp */, + 8CB3D71917F1DE5B0090372A /* 152.cpp */, + 8CB3D71A17F1DE5B0090372A /* 156.cpp */, + 8CB3D71B17F1DE5B0090372A /* 16.cpp */, + 8CB3D71C17F1DE5B0090372A /* 163.cpp */, + 8CB3D71D17F1DE5B0090372A /* 18.cpp */, + 8CB3D71E17F1DE5B0090372A /* 180.cpp */, + 8CB3D71F17F1DE5B0090372A /* 182.cpp */, + 8CB3D72017F1DE5B0090372A /* 184.cpp */, + 8CB3D72117F1DE5B0090372A /* 185.cpp */, + 8CB3D72217F1DE5B0090372A /* 187.cpp */, + 8CB3D72317F1DE5B0090372A /* 189.cpp */, + 8CB3D72417F1DE5B0090372A /* 193.cpp */, + 8CB3D72517F1DE5B0090372A /* 208.cpp */, + 8CB3D72617F1DE5B0090372A /* 21.cpp */, + 8CB3D72717F1DE5B0090372A /* 22.cpp */, + 8CB3D72817F1DE5B0090372A /* 222.cpp */, + 8CB3D72917F1DE5B0090372A /* 228.cpp */, + 8CB3D72A17F1DE5B0090372A /* 23.cpp */, + 8CB3D72B17F1DE5B0090372A /* 232.cpp */, + 8CB3D72C17F1DE5B0090372A /* 234.cpp */, + 8CB3D72D17F1DE5B0090372A /* 240.cpp */, + 8CB3D72E17F1DE5B0090372A /* 241.cpp */, + 8CB3D72F17F1DE5B0090372A /* 242.cpp */, + 8CB3D73017F1DE5B0090372A /* 244.cpp */, + 8CB3D73117F1DE5B0090372A /* 246.cpp */, + 8CB3D73217F1DE5B0090372A /* 248.cpp */, + 8CB3D73317F1DE5B0090372A /* 25.cpp */, + 8CB3D73417F1DE5B0090372A /* 32.cpp */, + 8CB3D73517F1DE5B0090372A /* 33.cpp */, + 8CB3D73617F1DE5B0090372A /* 34.cpp */, + 8CB3D73717F1DE5B0090372A /* 38.cpp */, + 8CB3D73817F1DE5B0090372A /* 41.cpp */, + 8CB3D73917F1DE5B0090372A /* 42.cpp */, + 8CB3D73A17F1DE5B0090372A /* 46.cpp */, + 8CB3D73B17F1DE5B0090372A /* 51.cpp */, + 8CB3D73C17F1DE5B0090372A /* 65.cpp */, + 8CB3D73D17F1DE5B0090372A /* 67.cpp */, + 8CB3D73E17F1DE5B0090372A /* 68.cpp */, + 8CB3D73F17F1DE5B0090372A /* 70.cpp */, + 8CB3D74017F1DE5B0090372A /* 72.cpp */, + 8CB3D74117F1DE5B0090372A /* 73.cpp */, + 8CB3D74217F1DE5B0090372A /* 75.cpp */, + 8CB3D74317F1DE5B0090372A /* 76.cpp */, + 8CB3D74417F1DE5B0090372A /* 77.cpp */, + 8CB3D74517F1DE5B0090372A /* 78.cpp */, + 8CB3D74617F1DE5B0090372A /* 8.cpp */, + 8CB3D74717F1DE5B0090372A /* 80.cpp */, + 8CB3D74817F1DE5B0090372A /* 82.cpp */, + 8CB3D74917F1DE5B0090372A /* 8237.cpp */, + 8CB3D74A17F1DE5B0090372A /* 86.cpp */, + 8CB3D74B17F1DE5B0090372A /* 87.cpp */, + 8CB3D74C17F1DE5B0090372A /* 88.cpp */, + 8CB3D74D17F1DE5B0090372A /* 89.cpp */, + 8CB3D74E17F1DE5B0090372A /* 90.cpp */, + 8CB3D74F17F1DE5B0090372A /* 92.cpp */, + 8CB3D75017F1DE5B0090372A /* 93.cpp */, + 8CB3D75117F1DE5B0090372A /* 94.cpp */, + 8CB3D75217F1DE5B0090372A /* 95.cpp */, + 8CB3D75317F1DE5B0090372A /* 96.cpp */, + 8CB3D75417F1DE5B0090372A /* 97.cpp */, + 8CB3D75517F1DE5B0090372A /* 99.cpp */, + 8CB3D75617F1DE5B0090372A /* codemasters.cpp */, + 8CB3D75717F1DE5B0090372A /* colordreams.cpp */, + 8CB3D75817F1DE5B0090372A /* deirom.cpp */, + 8CB3D75917F1DE5B0090372A /* emu2413.cpp */, + 8CB3D75A17F1DE5B0090372A /* emu2413.h */, + 8CB3D75B17F1DE5B0090372A /* emutypes.h */, + 8CB3D75C17F1DE5B0090372A /* ffe.cpp */, + 8CB3D75D17F1DE5B0090372A /* fme7.cpp */, + 8CB3D75E17F1DE5B0090372A /* h2288.cpp */, + 8CB3D75F17F1DE5B0090372A /* Makefile.am.inc */, + 8CB3D76017F1DE5B0090372A /* malee.cpp */, + 8CB3D76117F1DE5B0090372A /* mapinc.h */, + 8CB3D76217F1DE5B0090372A /* maxicart.cpp */, + 8CB3D76317F1DE5B0090372A /* mmc1.cpp */, + 8CB3D76417F1DE5B0090372A /* mmc2and4.cpp */, + 8CB3D76517F1DE5B0090372A /* mmc3.cpp */, + 8CB3D76617F1DE5B0090372A /* mmc5.cpp */, + 8CB3D76717F1DE5B0090372A /* n106.cpp */, + 8CB3D76817F1DE5B0090372A /* nina06.cpp */, + 8CB3D76917F1DE5B0090372A /* novel.cpp */, + 8CB3D76A17F1DE5B0090372A /* sachen.cpp */, + 8CB3D76B17F1DE5B0090372A /* simple.cpp */, + 8CB3D76C17F1DE5B0090372A /* super24.cpp */, + 8CB3D76D17F1DE5B0090372A /* supervision.cpp */, + 8CB3D76E17F1DE5B0090372A /* tengen.cpp */, + 8CB3D76F17F1DE5B0090372A /* vrc6.cpp */, + 8CB3D77017F1DE5B0090372A /* vrc7.cpp */, + 8CB3D77117F1DE5B0090372A /* vrc7tone.h */, + ); + path = boards; + sourceTree = ""; + }; + 8CB3D78217F1DE5B0090372A /* input */ = { + isa = PBXGroup; + children = ( + 8CB3D78317F1DE5B0090372A /* arkanoid.cpp */, + 8CB3D78417F1DE5B0090372A /* bworld.cpp */, + 8CB3D78517F1DE5B0090372A /* cursor.cpp */, + 8CB3D78617F1DE5B0090372A /* fkb.cpp */, + 8CB3D78717F1DE5B0090372A /* fkb.h */, + 8CB3D78817F1DE5B0090372A /* ftrainer.cpp */, + 8CB3D78917F1DE5B0090372A /* hypershot.cpp */, + 8CB3D78A17F1DE5B0090372A /* mahjong.cpp */, + 8CB3D78B17F1DE5B0090372A /* Makefile.am.inc */, + 8CB3D78C17F1DE5B0090372A /* oekakids.cpp */, + 8CB3D78D17F1DE5B0090372A /* partytap.cpp */, + 8CB3D78E17F1DE5B0090372A /* powerpad.cpp */, + 8CB3D78F17F1DE5B0090372A /* shadow.cpp */, + 8CB3D79017F1DE5B0090372A /* share.h */, + 8CB3D79117F1DE5B0090372A /* suborkb.cpp */, + 8CB3D79217F1DE5B0090372A /* suborkb.h */, + 8CB3D79317F1DE5B0090372A /* toprider.cpp */, + 8CB3D79417F1DE5B0090372A /* zapper.cpp */, + ); + path = input; + sourceTree = ""; + }; + 8CB3D79F17F1DE5B0090372A /* ntsc */ = { + isa = PBXGroup; + children = ( + 8CB3D7A017F1DE5B0090372A /* benchmark.c */, + 8CB3D7A117F1DE5B0090372A /* changes.txt */, + 8CB3D7A217F1DE5B0090372A /* demo.c */, + 8CB3D7A317F1DE5B0090372A /* LGPL.txt */, + 8CB3D7A417F1DE5B0090372A /* nes.raw */, + 8CB3D7A517F1DE5B0090372A /* nes_ntsc.cpp */, + 8CB3D7A617F1DE5B0090372A /* nes_ntsc.h */, + 8CB3D7A717F1DE5B0090372A /* nes_ntsc.txt */, + 8CB3D7A817F1DE5B0090372A /* readme.txt */, + ); + path = ntsc; + sourceTree = ""; + }; + 8CB3D7AA17F1DE5B0090372A /* ppu */ = { + isa = PBXGroup; + children = ( + 8CB3D7AB17F1DE5B0090372A /* fast-pputile.h */, + 8CB3D7AC17F1DE5B0090372A /* Makefile.am.inc */, + 8CB3D7AD17F1DE5B0090372A /* palette.cpp */, + 8CB3D7AE17F1DE5B0090372A /* palette.h */, + 8CB3D7AF17F1DE5B0090372A /* palettes */, + 8CB3D7B617F1DE5B0090372A /* ppu-fastrl.h */, + 8CB3D7B717F1DE5B0090372A /* ppu-subline.h */, + 8CB3D7B817F1DE5B0090372A /* ppu.cpp */, + 8CB3D7B917F1DE5B0090372A /* ppu.h */, + ); + path = ppu; + sourceTree = ""; + }; + 8CB3D7AF17F1DE5B0090372A /* palettes */ = { + isa = PBXGroup; + children = ( + 8CB3D7B017F1DE5B0090372A /* default.h */, + 8CB3D7B117F1DE5B0090372A /* rp2c04-0001.h */, + 8CB3D7B217F1DE5B0090372A /* rp2c04-0002.h */, + 8CB3D7B317F1DE5B0090372A /* rp2c04-0003.h */, + 8CB3D7B417F1DE5B0090372A /* rp2c04-0004.h */, + 8CB3D7B517F1DE5B0090372A /* rp2c0x.h */, + ); + path = palettes; + sourceTree = ""; + }; + 8CB3D7C617F1DE5B0090372A /* ngp */ = { + isa = PBXGroup; + children = ( + 8CB3D7C717F1DE5B0090372A /* bios.cpp */, + 8CB3D7C817F1DE5B0090372A /* bios.h */, + 8CB3D7C917F1DE5B0090372A /* biosHLE.cpp */, + 8CB3D7CA17F1DE5B0090372A /* dma.cpp */, + 8CB3D7CB17F1DE5B0090372A /* dma.h */, + 8CB3D7CC17F1DE5B0090372A /* flash.cpp */, + 8CB3D7CD17F1DE5B0090372A /* flash.h */, + 8CB3D7CE17F1DE5B0090372A /* gfx.cpp */, + 8CB3D7CF17F1DE5B0090372A /* gfx.h */, + 8CB3D7D017F1DE5B0090372A /* gfx_scanline_colour.cpp */, + 8CB3D7D117F1DE5B0090372A /* gfx_scanline_mono.cpp */, + 8CB3D7D217F1DE5B0090372A /* interrupt.cpp */, + 8CB3D7D317F1DE5B0090372A /* interrupt.h */, + 8CB3D7D417F1DE5B0090372A /* Makefile.am */, + 8CB3D7D517F1DE5B0090372A /* Makefile.in */, + 8CB3D7D617F1DE5B0090372A /* mem.cpp */, + 8CB3D7D717F1DE5B0090372A /* mem.h */, + 8CB3D7D817F1DE5B0090372A /* neopop.cpp */, + 8CB3D7D917F1DE5B0090372A /* neopop.h */, + 8CB3D7DA17F1DE5B0090372A /* rom.cpp */, + 8CB3D7DB17F1DE5B0090372A /* rtc.cpp */, + 8CB3D7DC17F1DE5B0090372A /* rtc.h */, + 8CB3D7DD17F1DE5B0090372A /* sound.cpp */, + 8CB3D7DE17F1DE5B0090372A /* sound.h */, + 8CB3D7DF17F1DE5B0090372A /* T6W28_Apu.cpp */, + 8CB3D7E017F1DE5B0090372A /* T6W28_Apu.h */, + 8CB3D7E117F1DE5B0090372A /* T6W28_Oscs.h */, + 8CB3D7E217F1DE5B0090372A /* TLCS-900h */, + 8CB3D80417F1DE5B0090372A /* Z80_interface.cpp */, + 8CB3D80517F1DE5B0090372A /* Z80_interface.h */, + ); + path = ngp; + sourceTree = ""; + }; + 8CB3D7E217F1DE5B0090372A /* TLCS-900h */ = { + isa = PBXGroup; + children = ( + 8CB3D7E317F1DE5B0090372A /* TLCS900h_disassemble.cpp */, + 8CB3D7E417F1DE5B0090372A /* TLCS900h_disassemble.h */, + 8CB3D7E517F1DE5B0090372A /* TLCS900h_disassemble_dst.cpp */, + 8CB3D7E617F1DE5B0090372A /* TLCS900h_disassemble_extra.cpp */, + 8CB3D7E717F1DE5B0090372A /* TLCS900h_disassemble_reg.cpp */, + 8CB3D7E817F1DE5B0090372A /* TLCS900h_disassemble_src.cpp */, + 8CB3D7E917F1DE5B0090372A /* TLCS900h_interpret.cpp */, + 8CB3D7EA17F1DE5B0090372A /* TLCS900h_interpret.h */, + 8CB3D7EB17F1DE5B0090372A /* TLCS900h_interpret_dst.cpp */, + 8CB3D7EC17F1DE5B0090372A /* TLCS900h_interpret_dst.h */, + 8CB3D7ED17F1DE5B0090372A /* TLCS900h_interpret_reg.cpp */, + 8CB3D7EE17F1DE5B0090372A /* TLCS900h_interpret_reg.h */, + 8CB3D7EF17F1DE5B0090372A /* TLCS900h_interpret_single.cpp */, + 8CB3D7F017F1DE5B0090372A /* TLCS900h_interpret_single.h */, + 8CB3D7F117F1DE5B0090372A /* TLCS900h_interpret_src.cpp */, + 8CB3D7F217F1DE5B0090372A /* TLCS900h_interpret_src.h */, + 8CB3D7F317F1DE5B0090372A /* TLCS900h_registers.cpp */, + 8CB3D7F417F1DE5B0090372A /* TLCS900h_registers.h */, + 8CB3D7F517F1DE5B0090372A /* TLCS900h_registers_mapB.h */, + 8CB3D7F617F1DE5B0090372A /* TLCS900h_registers_mapCodeB0.h */, + 8CB3D7F717F1DE5B0090372A /* TLCS900h_registers_mapCodeB1.h */, + 8CB3D7F817F1DE5B0090372A /* TLCS900h_registers_mapCodeB2.h */, + 8CB3D7F917F1DE5B0090372A /* TLCS900h_registers_mapCodeB3.h */, + 8CB3D7FA17F1DE5B0090372A /* TLCS900h_registers_mapCodeL0.h */, + 8CB3D7FB17F1DE5B0090372A /* TLCS900h_registers_mapCodeL1.h */, + 8CB3D7FC17F1DE5B0090372A /* TLCS900h_registers_mapCodeL2.h */, + 8CB3D7FD17F1DE5B0090372A /* TLCS900h_registers_mapCodeL3.h */, + 8CB3D7FE17F1DE5B0090372A /* TLCS900h_registers_mapCodeW0.h */, + 8CB3D7FF17F1DE5B0090372A /* TLCS900h_registers_mapCodeW1.h */, + 8CB3D80017F1DE5B0090372A /* TLCS900h_registers_mapCodeW2.h */, + 8CB3D80117F1DE5B0090372A /* TLCS900h_registers_mapCodeW3.h */, + 8CB3D80217F1DE5B0090372A /* TLCS900h_registers_mapL.h */, + 8CB3D80317F1DE5B0090372A /* TLCS900h_registers_mapW.h */, + ); + path = "TLCS-900h"; + sourceTree = ""; + }; + 8CB3D80F17F1DE5C0090372A /* pce */ = { + isa = PBXGroup; + children = ( + 94FD853018C7F53C001B426D /* pcecd.cpp */, + 94FD853118C7F53C001B426D /* pcecd.h */, + 8CB3D81017F1DE5C0090372A /* debug.cpp */, + 8CB3D81117F1DE5C0090372A /* debug.h */, + 8CB3D81317F1DE5C0090372A /* hes.cpp */, + 8CB3D81417F1DE5C0090372A /* hes.h */, + 8CB3D81517F1DE5C0090372A /* huc.cpp */, + 8CB3D81617F1DE5C0090372A /* huc.h */, + 8CB3D81717F1DE5C0090372A /* input */, + 8CB3D81E17F1DE5C0090372A /* input.cpp */, + 8CB3D81F17F1DE5C0090372A /* input.h */, + 8CB3D82017F1DE5C0090372A /* Makefile.am */, + 8CB3D82117F1DE5C0090372A /* Makefile.in */, + 8CB3D82217F1DE5C0090372A /* mcgenjin.cpp */, + 8CB3D82317F1DE5C0090372A /* mcgenjin.h */, + 87DC74711AE45DCF006F1CD7 /* notes */, + 8CB3D82517F1DE5C0090372A /* pce.cpp */, + 8CB3D82617F1DE5C0090372A /* pce.h */, + 8CB3D82B17F1DE5C0090372A /* tsushin.cpp */, + 8CB3D82C17F1DE5C0090372A /* tsushin.h */, + 8CB3D82D17F1DE5C0090372A /* vce.cpp */, + 8CB3D82E17F1DE5C0090372A /* vce.h */, + 8CB3D82F17F1DE5C0090372A /* vce_sync.inc */, + ); + path = pce; + sourceTree = ""; + }; + 8CB3D81717F1DE5C0090372A /* input */ = { + isa = PBXGroup; + children = ( + 8CB3D81817F1DE5C0090372A /* gamepad.cpp */, + 8CB3D81917F1DE5C0090372A /* gamepad.h */, + 8CB3D81A17F1DE5C0090372A /* mouse.cpp */, + 8CB3D81B17F1DE5C0090372A /* mouse.h */, + 8CB3D81C17F1DE5C0090372A /* tsushinkb.cpp */, + 8CB3D81D17F1DE5C0090372A /* tsushinkb.h */, + ); + path = input; + sourceTree = ""; + }; + 8CB3D83017F1DE5C0090372A /* pce_fast */ = { + isa = PBXGroup; + children = ( + 8CB3D83117F1DE5C0090372A /* hes.cpp */, + 8CB3D83217F1DE5C0090372A /* hes.h */, + 8CB3D83317F1DE5C0090372A /* huc.cpp */, + 8CB3D83417F1DE5C0090372A /* huc.h */, + 8CB3D83517F1DE5C0090372A /* huc6280.cpp */, + 8CB3D83617F1DE5C0090372A /* huc6280.h */, + 8CB3D83717F1DE5C0090372A /* huc6280_ops.inc */, + 8CB3D83817F1DE5C0090372A /* input.cpp */, + 8CB3D83917F1DE5C0090372A /* input.h */, + 8CB3D83A17F1DE5C0090372A /* ioread.inc */, + 8CB3D83B17F1DE5C0090372A /* Makefile.am */, + 8CB3D83C17F1DE5C0090372A /* Makefile.in */, + 8CB3D83D17F1DE5C0090372A /* pce.cpp */, + 8CB3D83E17F1DE5C0090372A /* pce.h */, + 8CB3D84117F1DE5C0090372A /* vdc.cpp */, + 8CB3D84217F1DE5C0090372A /* vdc.h */, + 8CB3D84317F1DE5C0090372A /* vpc_mix_inner.inc */, + ); + path = pce_fast; + sourceTree = ""; + }; + 8CB3D84417F1DE5C0090372A /* pcfx */ = { + isa = PBXGroup; + children = ( + 8CB3D84517F1DE5C0090372A /* debug.cpp */, + 8CB3D84617F1DE5C0090372A /* debug.h */, + 8CB3D84717F1DE5C0090372A /* fxscsi.cpp */, + 8CB3D84817F1DE5C0090372A /* fxscsi.h */, + 8CB3D84917F1DE5C0090372A /* gamedb.inc */, + 8CB3D84A17F1DE5C0090372A /* huc6273.cpp */, + 8CB3D84B17F1DE5C0090372A /* huc6273.h */, + 8CB3D84C17F1DE5C0090372A /* input */, + 8CB3D85117F1DE5C0090372A /* input.cpp */, + 8CB3D85217F1DE5C0090372A /* input.h */, + 8CB3D85317F1DE5C0090372A /* interrupt.cpp */, + 8CB3D85417F1DE5C0090372A /* interrupt.h */, + 8CB3D85517F1DE5C0090372A /* io-handler.inc */, + 8CB3D85617F1DE5C0090372A /* jrevdct.cpp */, + 8CB3D85717F1DE5C0090372A /* jrevdct.h */, + 8CB3D85817F1DE5C0090372A /* king-bgfast-blit.inc */, + 8CB3D85917F1DE5C0090372A /* king-bgfast.inc */, + 8CB3D85A17F1DE5C0090372A /* king.cpp */, + 8CB3D85B17F1DE5C0090372A /* king.h */, + 8CB3D85C17F1DE5C0090372A /* king_mix_body.inc */, + 8CB3D85D17F1DE5C0090372A /* Makefile.am */, + 8CB3D85E17F1DE5C0090372A /* Makefile.in */, + 8CB3D85F17F1DE5C0090372A /* mem-handler.inc */, + 87DC74721AE45E31006F1CD7 /* notes */, + 8CB3D86017F1DE5C0090372A /* pcfx.cpp */, + 8CB3D86117F1DE5C0090372A /* pcfx.h */, + 8CB3D86217F1DE5C0090372A /* rainbow.cpp */, + 8CB3D86317F1DE5C0090372A /* rainbow.h */, + 8CB3D86417F1DE5C0090372A /* soundbox.cpp */, + 8CB3D86517F1DE5C0090372A /* soundbox.h */, + 8CB3D86617F1DE5C0090372A /* timer.cpp */, + 8CB3D86717F1DE5C0090372A /* timer.h */, + ); + path = pcfx; + sourceTree = ""; + }; + 8CB3D84C17F1DE5C0090372A /* input */ = { + isa = PBXGroup; + children = ( + 8CB3D84D17F1DE5C0090372A /* gamepad.cpp */, + 8CB3D84E17F1DE5C0090372A /* gamepad.h */, + 8CB3D84F17F1DE5C0090372A /* mouse.cpp */, + 8CB3D85017F1DE5C0090372A /* mouse.h */, + ); + path = input; + sourceTree = ""; + }; + 8CB3D86C17F1DE5C0090372A /* psx */ = { + isa = PBXGroup; + children = ( + 8CB3D86D17F1DE5C0090372A /* cdc.cpp */, + 8CB3D86E17F1DE5C0090372A /* cdc.h */, + 8CB3D86F17F1DE5C0090372A /* cpu.cpp */, + 8CB3D87017F1DE5C0090372A /* cpu.h */, + 8CB3D87117F1DE5C0090372A /* debug.cpp */, + 8CB3D87217F1DE5C0090372A /* debug.h */, + 8CB3D87317F1DE5C0090372A /* dis.cpp */, + 8CB3D87417F1DE5C0090372A /* dis.h */, + 8CB3D87517F1DE5C0090372A /* dma.cpp */, + 8CB3D87617F1DE5C0090372A /* dma.h */, + 94B082541A86987300D3C0BC /* FastFIFO.h */, + 8CB3D87717F1DE5C0090372A /* frontio.cpp */, + 8CB3D87817F1DE5C0090372A /* frontio.h */, + 94CFB6401A75DB60001F174F /* gpu_common.inc */, + 94CFB6411A75DB60001F174F /* gpu_line.cpp */, + 94CFB6421A75DB60001F174F /* gpu_polygon.cpp */, + 94CFB6431A75DB60001F174F /* gpu_sprite.cpp */, + 8CB3D87917F1DE5C0090372A /* gpu.cpp */, + 8CB3D87A17F1DE5C0090372A /* gpu.h */, + 8CB3D87F17F1DE5C0090372A /* gte.cpp */, + 8CB3D88017F1DE5C0090372A /* gte.h */, + 8CB3D88217F1DE5C0090372A /* input */, + 8CB3D89517F1DE5C0090372A /* irq.cpp */, + 8CB3D89617F1DE5C0090372A /* irq.h */, + 8CB3D89717F1DE5C0090372A /* Makefile.am */, + 8CB3D89817F1DE5C0090372A /* Makefile.in */, + 94CFB6481A75DBAC001F174F /* masmem.h */, + 8CB3D89917F1DE5C0090372A /* mdec.cpp */, + 8CB3D89A17F1DE5C0090372A /* mdec.h */, + 94CFB6491A75DBE2001F174F /* notes */, + 8CB3D89D17F1DE5C0090372A /* psx.cpp */, + 8CB3D89E17F1DE5C0090372A /* psx.h */, + 8CB3D8A017F1DE5C0090372A /* sio.cpp */, + 8CB3D8A117F1DE5C0090372A /* sio.h */, + 8CB3D8A317F1DE5C0090372A /* spu.cpp */, + 8CB3D8A417F1DE5C0090372A /* spu.h */, + 8CB3D8A517F1DE5C0090372A /* spu_fir_table.inc */, + 8CB3D8A717F1DE5C0090372A /* spu_reverb.inc */, + 8CB3D8A817F1DE5C0090372A /* timer.cpp */, + 8CB3D8A917F1DE5C0090372A /* timer.h */, + ); + path = psx; + sourceTree = ""; + }; + 8CB3D88217F1DE5C0090372A /* input */ = { + isa = PBXGroup; + children = ( + 8CB3D88317F1DE5C0090372A /* dualanalog.cpp */, + 8CB3D88417F1DE5C0090372A /* dualanalog.h */, + 8CB3D88517F1DE5C0090372A /* dualshock.cpp */, + 8CB3D88617F1DE5C0090372A /* dualshock.h */, + 8CB3D88717F1DE5C0090372A /* gamepad.cpp */, + 8CB3D88817F1DE5C0090372A /* gamepad.h */, + 8CB3D88917F1DE5C0090372A /* guncon.cpp */, + 8CB3D88A17F1DE5C0090372A /* guncon.h */, + 8CB3D88B17F1DE5C0090372A /* justifier.cpp */, + 8CB3D88C17F1DE5C0090372A /* justifier.h */, + 8CB3D88D17F1DE5C0090372A /* memcard.cpp */, + 8CB3D88E17F1DE5C0090372A /* memcard.h */, + 8CB3D88F17F1DE5C0090372A /* mouse.cpp */, + 8CB3D89017F1DE5C0090372A /* mouse.h */, + 8CB3D89117F1DE5C0090372A /* multitap.cpp */, + 8CB3D89217F1DE5C0090372A /* multitap.h */, + 8CB3D89317F1DE5C0090372A /* negcon.cpp */, + 8CB3D89417F1DE5C0090372A /* negcon.h */, + ); + path = input; + sourceTree = ""; + }; + 8CB3D8AC17F1DE5C0090372A /* resampler */ = { + isa = PBXGroup; + children = ( + 8CB3D8AD17F1DE5C0090372A /* arch.h */, + 8CB3D8AE17F1DE5C0090372A /* fixed_generic.h */, + 8CB3D8AF17F1DE5C0090372A /* Makefile.am.inc */, + 8CB3D8B017F1DE5C0090372A /* resample.c */, + 8CB3D8B117F1DE5C0090372A /* resample_sse.h */, + 8CB3D8B217F1DE5C0090372A /* resampler.h */, + 8CB3D8B317F1DE5C0090372A /* stack_alloc.h */, + ); + path = resampler; + sourceTree = ""; + }; + 8CB3D8B817F1DE5C0090372A /* sexyal */ = { + isa = PBXGroup; + children = ( + 8CB3D8B917F1DE5C0090372A /* convert.cpp */, + 8CB3D8BA17F1DE5C0090372A /* convert.h */, + 8CB3D8BB17F1DE5C0090372A /* COPYING */, + 8CB3D8BC17F1DE5C0090372A /* drivers */, + 8CB3D8C417F1DE5C0090372A /* Makefile.am */, + 8CB3D8C517F1DE5C0090372A /* Makefile.in */, + 8CB3D8C617F1DE5C0090372A /* README */, + 8CB3D8C717F1DE5C0090372A /* sexyal.cpp */, + 8CB3D8C817F1DE5C0090372A /* sexyal.h */, + ); + path = sexyal; + sourceTree = ""; + }; + 8CB3D8BC17F1DE5C0090372A /* drivers */ = { + isa = PBXGroup; + children = ( + 8CB3D8BD17F1DE5C0090372A /* alsa.cpp */, + 8CB3D8BE17F1DE5C0090372A /* dsound.cpp */, + 8CB3D8BF17F1DE5C0090372A /* dummy.cpp */, + 8CB3D8C017F1DE5C0090372A /* jack.cpp */, + 8CB3D8C117F1DE5C0090372A /* oss.cpp */, + 8CB3D8C217F1DE5C0090372A /* sdl.cpp */, + 8CB3D8C317F1DE5C0090372A /* wasapi.cpp */, + 94817C401922B8A500FDFC99 /* wasapish.cpp */, + ); + path = drivers; + sourceTree = ""; + }; + 8CB3D8C917F1DE5C0090372A /* sms */ = { + isa = PBXGroup; + children = ( + 8CB3D8CA17F1DE5C0090372A /* cart.cpp */, + 8CB3D8CB17F1DE5C0090372A /* cart.h */, + 8CB3D8CC17F1DE5C0090372A /* docs */, + 8CB3D8D217F1DE5C0090372A /* hvc.inc */, + 8CB3D8D317F1DE5C0090372A /* Makefile.am */, + 8CB3D8D417F1DE5C0090372A /* Makefile.in */, + 8CB3D8D517F1DE5C0090372A /* memz80.cpp */, + 8CB3D8D617F1DE5C0090372A /* memz80.h */, + 8CB3D8D717F1DE5C0090372A /* pio.cpp */, + 8CB3D8D817F1DE5C0090372A /* pio.h */, + 8CB3D8D917F1DE5C0090372A /* render.cpp */, + 8CB3D8DA17F1DE5C0090372A /* render.h */, + 8CB3D8DB17F1DE5C0090372A /* romdb.cpp */, + 8CB3D8DC17F1DE5C0090372A /* romdb.h */, + 8CB3D8DD17F1DE5C0090372A /* shared.h */, + 8CB3D8DE17F1DE5C0090372A /* sms.cpp */, + 8CB3D8DF17F1DE5C0090372A /* sms.h */, + 8CB3D8E017F1DE5C0090372A /* sound.cpp */, + 8CB3D8E117F1DE5C0090372A /* sound.h */, + 8CB3D8E217F1DE5C0090372A /* system.cpp */, + 8CB3D8E317F1DE5C0090372A /* system.h */, + 8CB3D8E417F1DE5C0090372A /* tms.cpp */, + 8CB3D8E517F1DE5C0090372A /* tms.h */, + 8CB3D8E617F1DE5C0090372A /* vdp.cpp */, + 8CB3D8E717F1DE5C0090372A /* vdp.h */, + ); + path = sms; + sourceTree = ""; + }; + 8CB3D8CC17F1DE5C0090372A /* docs */ = { + isa = PBXGroup; + children = ( + 8CB3D8CD17F1DE5C0090372A /* changelog */, + 8CB3D8CE17F1DE5C0090372A /* compatability.txt */, + 8CB3D8CF17F1DE5C0090372A /* license */, + 8CB3D8D017F1DE5C0090372A /* porting.txt */, + 8CB3D8D117F1DE5C0090372A /* readme.txt */, + ); + path = docs; + sourceTree = ""; + }; + 8CB3D8E817F1DE5C0090372A /* snes */ = { + isa = PBXGroup; + children = ( + 8CB3D8E917F1DE5C0090372A /* interface.cpp */, + 8CB3D8EA17F1DE5C0090372A /* Makefile.am */, + 8CB3D8EB17F1DE5C0090372A /* Makefile.in */, + 8CB3D8EC17F1DE5C0090372A /* src */, + 8CB3DA5D17F1DE5C0090372A /* VERSION.BSNES */, + ); + path = snes; + sourceTree = ""; + }; + 8CB3D8EC17F1DE5C0090372A /* src */ = { + isa = PBXGroup; + children = ( + 8CB3D8ED17F1DE5C0090372A /* base.hpp */, + 8CB3D8EE17F1DE5C0090372A /* cartridge */, + 8CB3D8F517F1DE5C0090372A /* cheat */, + 8CB3D8F917F1DE5C0090372A /* chip */, + 8CB3D96E17F1DE5C0090372A /* cpu */, + 8CB3D99917F1DE5C0090372A /* data */, + 8CB3D9AC17F1DE5C0090372A /* interface.hpp */, + 8CB3D9AD17F1DE5C0090372A /* lib */, + 8CB3DA0017F1DE5C0090372A /* memory */, + 8CB3DA0A17F1DE5C0090372A /* ppu */, + 94CFB65C1A75DCB0001F174F /* sdsp */, + 8CB3DA2517F1DE5C0090372A /* smp */, + 8CB3DA4517F1DE5C0090372A /* system */, + ); + path = src; + sourceTree = ""; + }; + 8CB3D8EE17F1DE5C0090372A /* cartridge */ = { + isa = PBXGroup; + children = ( + 8CB3D8EF17F1DE5C0090372A /* cartridge.cpp */, + 8CB3D8F017F1DE5C0090372A /* cartridge.hpp */, + 8CB3D8F117F1DE5C0090372A /* gameboyheader.cpp */, + 8CB3D8F217F1DE5C0090372A /* header.cpp */, + 8CB3D8F317F1DE5C0090372A /* serialization.cpp */, + ); + path = cartridge; + sourceTree = ""; + }; + 8CB3D8F517F1DE5C0090372A /* cheat */ = { + isa = PBXGroup; + children = ( + 8CB3D8F617F1DE5C0090372A /* cheat-inline.hpp */, + 8CB3D8F717F1DE5C0090372A /* cheat.cpp */, + 8CB3D8F817F1DE5C0090372A /* cheat.hpp */, + ); + path = cheat; + sourceTree = ""; + }; + 8CB3D8F917F1DE5C0090372A /* chip */ = { + isa = PBXGroup; + children = ( + 8CB3D8FE17F1DE5C0090372A /* bsx */, + 8CB3D90417F1DE5C0090372A /* chip.hpp */, + 8CB3D90517F1DE5C0090372A /* cx4 */, + 8CB3D90D17F1DE5C0090372A /* dsp1 */, + 8CB3D91317F1DE5C0090372A /* dsp2 */, + 8CB3D91817F1DE5C0090372A /* dsp3 */, + 8CB3D91C17F1DE5C0090372A /* dsp4 */, + 8CB3D92117F1DE5C0090372A /* obc1 */, + 8CB3D92517F1DE5C0090372A /* sa1 */, + 8CB3D93517F1DE5C0090372A /* sdd1 */, + 8CB3D93B17F1DE5C0090372A /* spc7110 */, + 8CB3D94117F1DE5C0090372A /* srtc */, + 8CB3D94517F1DE5C0090372A /* st010 */, + 8CB3D95117F1DE5C0090372A /* superfx */, + ); + path = chip; + sourceTree = ""; + }; + 8CB3D8FE17F1DE5C0090372A /* bsx */ = { + isa = PBXGroup; + children = ( + 8CB3D8FF17F1DE5C0090372A /* bsx.cpp */, + 8CB3D90017F1DE5C0090372A /* bsx.hpp */, + 8CB3D90117F1DE5C0090372A /* bsx_base.cpp */, + 8CB3D90217F1DE5C0090372A /* bsx_cart.cpp */, + 8CB3D90317F1DE5C0090372A /* bsx_flash.cpp */, + ); + path = bsx; + sourceTree = ""; + }; + 8CB3D90517F1DE5C0090372A /* cx4 */ = { + isa = PBXGroup; + children = ( + 8CB3D90617F1DE5C0090372A /* cx4.cpp */, + 8CB3D90717F1DE5C0090372A /* cx4.hpp */, + 8CB3D90817F1DE5C0090372A /* data.cpp */, + 8CB3D90917F1DE5C0090372A /* functions.cpp */, + 8CB3D90A17F1DE5C0090372A /* oam.cpp */, + 8CB3D90B17F1DE5C0090372A /* opcodes.cpp */, + 8CB3D90C17F1DE5C0090372A /* serialization.cpp */, + ); + path = cx4; + sourceTree = ""; + }; + 8CB3D90D17F1DE5C0090372A /* dsp1 */ = { + isa = PBXGroup; + children = ( + 8CB3D90E17F1DE5C0090372A /* dsp1.cpp */, + 8CB3D90F17F1DE5C0090372A /* dsp1.hpp */, + 8CB3D91017F1DE5C0090372A /* dsp1emu.cpp */, + 8CB3D91117F1DE5C0090372A /* dsp1emu.hpp */, + 8CB3D91217F1DE5C0090372A /* serialization.cpp */, + ); + path = dsp1; + sourceTree = ""; + }; + 8CB3D91317F1DE5C0090372A /* dsp2 */ = { + isa = PBXGroup; + children = ( + 8CB3D91417F1DE5C0090372A /* dsp2.cpp */, + 8CB3D91517F1DE5C0090372A /* dsp2.hpp */, + 8CB3D91617F1DE5C0090372A /* opcodes.cpp */, + 8CB3D91717F1DE5C0090372A /* serialization.cpp */, + ); + path = dsp2; + sourceTree = ""; + }; + 8CB3D91817F1DE5C0090372A /* dsp3 */ = { + isa = PBXGroup; + children = ( + 8CB3D91917F1DE5C0090372A /* dsp3.cpp */, + 8CB3D91A17F1DE5C0090372A /* dsp3.hpp */, + 8CB3D91B17F1DE5C0090372A /* dsp3emu.c */, + ); + path = dsp3; + sourceTree = ""; + }; + 8CB3D91C17F1DE5C0090372A /* dsp4 */ = { + isa = PBXGroup; + children = ( + 8CB3D91D17F1DE5C0090372A /* dsp4.cpp */, + 8CB3D91E17F1DE5C0090372A /* dsp4.hpp */, + 8CB3D91F17F1DE5C0090372A /* dsp4emu.c */, + 8CB3D92017F1DE5C0090372A /* dsp4emu.h */, + ); + path = dsp4; + sourceTree = ""; + }; + 8CB3D92117F1DE5C0090372A /* obc1 */ = { + isa = PBXGroup; + children = ( + 8CB3D92217F1DE5C0090372A /* obc1.cpp */, + 8CB3D92317F1DE5C0090372A /* obc1.hpp */, + 8CB3D92417F1DE5C0090372A /* serialization.cpp */, + ); + path = obc1; + sourceTree = ""; + }; + 8CB3D92517F1DE5C0090372A /* sa1 */ = { + isa = PBXGroup; + children = ( + 8CB3D92617F1DE5C0090372A /* bus */, + 8CB3D92917F1DE5C0090372A /* dma */, + 8CB3D92C17F1DE5C0090372A /* memory */, + 8CB3D92F17F1DE5C0090372A /* mmio */, + 8CB3D93217F1DE5C0090372A /* sa1.cpp */, + 8CB3D93317F1DE5C0090372A /* sa1.hpp */, + 8CB3D93417F1DE5C0090372A /* serialization.cpp */, + ); + path = sa1; + sourceTree = ""; + }; + 8CB3D92617F1DE5C0090372A /* bus */ = { + isa = PBXGroup; + children = ( + 8CB3D92717F1DE5C0090372A /* bus.cpp */, + 8CB3D92817F1DE5C0090372A /* bus.hpp */, + ); + path = bus; + sourceTree = ""; + }; + 8CB3D92917F1DE5C0090372A /* dma */ = { + isa = PBXGroup; + children = ( + 8CB3D92A17F1DE5C0090372A /* dma.cpp */, + 8CB3D92B17F1DE5C0090372A /* dma.hpp */, + ); + path = dma; + sourceTree = ""; + }; + 8CB3D92C17F1DE5C0090372A /* memory */ = { + isa = PBXGroup; + children = ( + 8CB3D92D17F1DE5C0090372A /* memory.cpp */, + 8CB3D92E17F1DE5C0090372A /* memory.hpp */, + ); + path = memory; + sourceTree = ""; + }; + 8CB3D92F17F1DE5C0090372A /* mmio */ = { + isa = PBXGroup; + children = ( + 8CB3D93017F1DE5C0090372A /* mmio.cpp */, + 8CB3D93117F1DE5C0090372A /* mmio.hpp */, + ); + path = mmio; + sourceTree = ""; + }; + 8CB3D93517F1DE5C0090372A /* sdd1 */ = { + isa = PBXGroup; + children = ( + 8CB3D93617F1DE5C0090372A /* sdd1.cpp */, + 8CB3D93717F1DE5C0090372A /* sdd1.hpp */, + 8CB3D93817F1DE5C0090372A /* sdd1emu.cpp */, + 8CB3D93917F1DE5C0090372A /* sdd1emu.hpp */, + 8CB3D93A17F1DE5C0090372A /* serialization.cpp */, + ); + path = sdd1; + sourceTree = ""; + }; + 8CB3D93B17F1DE5C0090372A /* spc7110 */ = { + isa = PBXGroup; + children = ( + 8CB3D93C17F1DE5C0090372A /* decomp.cpp */, + 8CB3D93D17F1DE5C0090372A /* decomp.hpp */, + 8CB3D93E17F1DE5C0090372A /* serialization.cpp */, + 8CB3D93F17F1DE5C0090372A /* spc7110.cpp */, + 8CB3D94017F1DE5C0090372A /* spc7110.hpp */, + ); + path = spc7110; + sourceTree = ""; + }; + 8CB3D94117F1DE5C0090372A /* srtc */ = { + isa = PBXGroup; + children = ( + 8CB3D94217F1DE5C0090372A /* serialization.cpp */, + 8CB3D94317F1DE5C0090372A /* srtc.cpp */, + 8CB3D94417F1DE5C0090372A /* srtc.hpp */, + ); + path = srtc; + sourceTree = ""; + }; + 8CB3D94517F1DE5C0090372A /* st010 */ = { + isa = PBXGroup; + children = ( + 8CB3D94617F1DE5C0090372A /* serialization.cpp */, + 8CB3D94717F1DE5C0090372A /* st010.cpp */, + 8CB3D94817F1DE5C0090372A /* st010.hpp */, + 8CB3D94917F1DE5C0090372A /* st010_data.hpp */, + 8CB3D94A17F1DE5C0090372A /* st010_op.cpp */, + ); + path = st010; + sourceTree = ""; + }; + 8CB3D95117F1DE5C0090372A /* superfx */ = { + isa = PBXGroup; + children = ( + 8CB3D95217F1DE5C0090372A /* bus */, + 8CB3D95517F1DE5C0090372A /* core */, + 8CB3D95B17F1DE5C0090372A /* disasm */, + 8CB3D95E17F1DE5C0090372A /* memory */, + 8CB3D96117F1DE5C0090372A /* mmio */, + 8CB3D96417F1DE5C0090372A /* serialization.cpp */, + 8CB3D96517F1DE5C0090372A /* superfx.cpp */, + 8CB3D96617F1DE5C0090372A /* superfx.hpp */, + 8CB3D96717F1DE5C0090372A /* timing */, + ); + path = superfx; + sourceTree = ""; + }; + 8CB3D95217F1DE5C0090372A /* bus */ = { + isa = PBXGroup; + children = ( + 8CB3D95317F1DE5C0090372A /* bus.cpp */, + 8CB3D95417F1DE5C0090372A /* bus.hpp */, + ); + path = bus; + sourceTree = ""; + }; + 8CB3D95517F1DE5C0090372A /* core */ = { + isa = PBXGroup; + children = ( + 8CB3D95617F1DE5C0090372A /* core.cpp */, + 8CB3D95717F1DE5C0090372A /* core.hpp */, + 8CB3D95817F1DE5C0090372A /* opcode_table.cpp */, + 8CB3D95917F1DE5C0090372A /* opcodes.cpp */, + 8CB3D95A17F1DE5C0090372A /* registers.hpp */, + ); + path = core; + sourceTree = ""; + }; + 8CB3D95B17F1DE5C0090372A /* disasm */ = { + isa = PBXGroup; + children = ( + 8CB3D95C17F1DE5C0090372A /* disasm.cpp */, + 8CB3D95D17F1DE5C0090372A /* disasm.hpp */, + ); + path = disasm; + sourceTree = ""; + }; + 8CB3D95E17F1DE5C0090372A /* memory */ = { + isa = PBXGroup; + children = ( + 8CB3D95F17F1DE5C0090372A /* memory.cpp */, + 8CB3D96017F1DE5C0090372A /* memory.hpp */, + ); + path = memory; + sourceTree = ""; + }; + 8CB3D96117F1DE5C0090372A /* mmio */ = { + isa = PBXGroup; + children = ( + 8CB3D96217F1DE5C0090372A /* mmio.cpp */, + 8CB3D96317F1DE5C0090372A /* mmio.hpp */, + ); + path = mmio; + sourceTree = ""; + }; + 8CB3D96717F1DE5C0090372A /* timing */ = { + isa = PBXGroup; + children = ( + 8CB3D96817F1DE5C0090372A /* timing.cpp */, + 8CB3D96917F1DE5C0090372A /* timing.hpp */, + ); + path = timing; + sourceTree = ""; + }; + 8CB3D96E17F1DE5C0090372A /* cpu */ = { + isa = PBXGroup; + children = ( + 8CB3D96F17F1DE5C0090372A /* core */, + 8CB3D98117F1DE5C0090372A /* cpu.cpp */, + 8CB3D98217F1DE5C0090372A /* cpu.hpp */, + 8CB3D98317F1DE5C0090372A /* scpu */, + ); + path = cpu; + sourceTree = ""; + }; + 8CB3D96F17F1DE5C0090372A /* core */ = { + isa = PBXGroup; + children = ( + 8CB3D97017F1DE5C0090372A /* algorithms.cpp */, + 8CB3D97117F1DE5C0090372A /* core.cpp */, + 8CB3D97217F1DE5C0090372A /* core.hpp */, + 8CB3D97317F1DE5C0090372A /* disassembler */, + 8CB3D97617F1DE5C0090372A /* memory.hpp */, + 8CB3D97717F1DE5C0090372A /* opcode_misc.cpp */, + 8CB3D97817F1DE5C0090372A /* opcode_pc.cpp */, + 8CB3D97917F1DE5C0090372A /* opcode_read.cpp */, + 8CB3D97A17F1DE5C0090372A /* opcode_rmw.cpp */, + 8CB3D97B17F1DE5C0090372A /* opcode_write.cpp */, + 8CB3D97C17F1DE5C0090372A /* registers.hpp */, + 8CB3D97D17F1DE5C0090372A /* serialization.cpp */, + 8CB3D97E17F1DE5C0090372A /* table.cpp */, + ); + path = core; + sourceTree = ""; + }; + 8CB3D97317F1DE5C0090372A /* disassembler */ = { + isa = PBXGroup; + children = ( + 8CB3D97417F1DE5C0090372A /* disassembler.cpp */, + 8CB3D97517F1DE5C0090372A /* disassembler.hpp */, + ); + path = disassembler; + sourceTree = ""; + }; + 8CB3D98317F1DE5C0090372A /* scpu */ = { + isa = PBXGroup; + children = ( + 8CB3D98417F1DE5C0090372A /* debugger */, + 8CB3D98717F1DE5C0090372A /* dma */, + 8CB3D98A17F1DE5C0090372A /* memory */, + 8CB3D98D17F1DE5C0090372A /* mmio */, + 8CB3D99017F1DE5C0090372A /* scpu.cpp */, + 8CB3D99117F1DE5C0090372A /* scpu.hpp */, + 8CB3D99217F1DE5C0090372A /* serialization.cpp */, + 8CB3D99317F1DE5C0090372A /* timing */, + ); + path = scpu; + sourceTree = ""; + }; + 8CB3D98417F1DE5C0090372A /* debugger */ = { + isa = PBXGroup; + children = ( + 8CB3D98517F1DE5C0090372A /* debugger.cpp */, + 8CB3D98617F1DE5C0090372A /* debugger.hpp */, + ); + path = debugger; + sourceTree = ""; + }; + 8CB3D98717F1DE5C0090372A /* dma */ = { + isa = PBXGroup; + children = ( + 8CB3D98817F1DE5C0090372A /* dma.cpp */, + 8CB3D98917F1DE5C0090372A /* dma.hpp */, + ); + path = dma; + sourceTree = ""; + }; + 8CB3D98A17F1DE5C0090372A /* memory */ = { + isa = PBXGroup; + children = ( + 8CB3D98B17F1DE5C0090372A /* memory.cpp */, + 8CB3D98C17F1DE5C0090372A /* memory.hpp */, + ); + path = memory; + sourceTree = ""; + }; + 8CB3D98D17F1DE5C0090372A /* mmio */ = { + isa = PBXGroup; + children = ( + 8CB3D98E17F1DE5C0090372A /* mmio.cpp */, + 8CB3D98F17F1DE5C0090372A /* mmio.hpp */, + ); + path = mmio; + sourceTree = ""; + }; + 8CB3D99317F1DE5C0090372A /* timing */ = { + isa = PBXGroup; + children = ( + 8CB3D99417F1DE5C0090372A /* event.cpp */, + 8CB3D99517F1DE5C0090372A /* irq.cpp */, + 8CB3D99617F1DE5C0090372A /* joypad.cpp */, + 8CB3D99717F1DE5C0090372A /* timing.cpp */, + 8CB3D99817F1DE5C0090372A /* timing.hpp */, + ); + path = timing; + sourceTree = ""; + }; + 8CB3D99917F1DE5C0090372A /* data */ = { + isa = PBXGroup; + children = ( + 8CB3D99A17F1DE5C0090372A /* documentation.html */, + 8CB3D99B17F1DE5C0090372A /* license.html */, + ); + path = data; + sourceTree = ""; + }; + 8CB3D9AD17F1DE5C0090372A /* lib */ = { + isa = PBXGroup; + children = ( + 8CB3D9AE17F1DE5C0090372A /* libco */, + 8CB3D9CB17F1DE5C0090372A /* nall */, + ); + path = lib; + sourceTree = ""; + }; + 8CB3D9AE17F1DE5C0090372A /* libco */ = { + isa = PBXGroup; + children = ( + 8CB3D9AF17F1DE5C0090372A /* amd64.c */, + 8CB3D9B017F1DE5C0090372A /* blargg_libco_ppc64-5 */, + 8CB3D9C117F1DE5C0090372A /* fiber.c */, + 8CB3D9C217F1DE5C0090372A /* libco.c */, + 8CB3D9C317F1DE5C0090372A /* libco.h */, + 8CB3D9C417F1DE5C0090372A /* ppc-elf.c */, + 8CB3D9C517F1DE5C0090372A /* ppc.c */, + 8CB3D9C617F1DE5C0090372A /* ppc.s */, + 8CB3D9C717F1DE5C0090372A /* ppc64.s */, + 8CB3D9C817F1DE5C0090372A /* sjlj.c */, + 8CB3D9C917F1DE5C0090372A /* ucontext.c */, + 8CB3D9CA17F1DE5C0090372A /* x86.c */, + ); + path = libco; + sourceTree = ""; + }; + 8CB3D9B017F1DE5C0090372A /* blargg_libco_ppc64-5 */ = { + isa = PBXGroup; + children = ( + 8CB3D9B117F1DE5C0090372A /* benchmark.c */, + 8CB3D9B217F1DE5C0090372A /* benchmark_impl.c */, + 8CB3D9B317F1DE5C0090372A /* libco */, + 8CB3D9B717F1DE5C0090372A /* ppc.S */, + 8CB3D9B817F1DE5C0090372A /* ppc_regs.h */, + 8CB3D9B917F1DE5C0090372A /* ppc_regs.S */, + 8CB3D9BA17F1DE5C0090372A /* readme.txt */, + 8CB3D9BB17F1DE5C0090372A /* run_tests */, + 8CB3D9BC17F1DE5C0090372A /* run_tests.txt */, + 8CB3D9BD17F1DE5C0090372A /* test_libco.c */, + 8CB3D9BE17F1DE5C0090372A /* test_regs.c */, + 8CB3D9BF17F1DE5C0090372A /* test_threads.c */, + 8CB3D9C017F1DE5C0090372A /* testing.h */, + ); + path = "blargg_libco_ppc64-5"; + sourceTree = ""; + }; + 8CB3D9B317F1DE5C0090372A /* libco */ = { + isa = PBXGroup; + children = ( + 8CB3D9B417F1DE5C0090372A /* libco.c */, + 8CB3D9B517F1DE5C0090372A /* libco.h */, + 8CB3D9B617F1DE5C0090372A /* ppc.c */, + ); + path = libco; + sourceTree = ""; + }; + 8CB3D9CB17F1DE5C0090372A /* nall */ = { + isa = PBXGroup; + children = ( + 8CB3D9CC17F1DE5C0090372A /* algorithm.hpp */, + 8CB3D9CD17F1DE5C0090372A /* any.hpp */, + 8CB3D9CE17F1DE5C0090372A /* array.hpp */, + 8CB3D9D017F1DE5C0090372A /* bit.hpp */, + 8CB3D9D217F1DE5C0090372A /* crc32.hpp */, + 8CB3D9D317F1DE5C0090372A /* detect.hpp */, + 8CB3D9D617F1DE5C0090372A /* endian.hpp */, + 8CB3D9D917F1DE5C0090372A /* function.hpp */, + 8CB3D9DE17F1DE5C0090372A /* moduloarray.hpp */, + 8CB3D9DF17F1DE5C0090372A /* platform.hpp */, + 8CB3D9E017F1DE5C0090372A /* priorityqueue.hpp */, + 8CB3D9E117F1DE5C0090372A /* property.hpp */, + 8CB3D9E217F1DE5C0090372A /* serial.hpp */, + 8CB3D9E317F1DE5C0090372A /* serializer.hpp */, + 8CB3D9E617F1DE5C0090372A /* static.hpp */, + 8CB3D9E717F1DE5C0090372A /* stdint.hpp */, + 8CB3D9F717F1DE5C0090372A /* traits.hpp */, + 8CB3D9FA17F1DE5C0090372A /* utility.hpp */, + 8CB3D9FB17F1DE5C0090372A /* varint.hpp */, + 8CB3D9FC17F1DE5C0090372A /* vector.hpp */, + ); + path = nall; + sourceTree = ""; + }; + 8CB3DA0017F1DE5C0090372A /* memory */ = { + isa = PBXGroup; + children = ( + 8CB3DA0117F1DE5C0090372A /* memory-inline.hpp */, + 8CB3DA0217F1DE5C0090372A /* memory.cpp */, + 8CB3DA0317F1DE5C0090372A /* memory.hpp */, + 8CB3DA0417F1DE5C0090372A /* smemory */, + ); + path = memory; + sourceTree = ""; + }; + 8CB3DA0417F1DE5C0090372A /* smemory */ = { + isa = PBXGroup; + children = ( + 8CB3DA0517F1DE5C0090372A /* generic.cpp */, + 8CB3DA0617F1DE5C0090372A /* serialization.cpp */, + 8CB3DA0717F1DE5C0090372A /* smemory.cpp */, + 8CB3DA0817F1DE5C0090372A /* smemory.hpp */, + 8CB3DA0917F1DE5C0090372A /* system.cpp */, + ); + path = smemory; + sourceTree = ""; + }; + 8CB3DA0A17F1DE5C0090372A /* ppu */ = { + isa = PBXGroup; + children = ( + 8CB3DA0B17F1DE5C0090372A /* debugger */, + 8CB3DA0F17F1DE5C0090372A /* memory */, + 8CB3DA1217F1DE5C0090372A /* mmio */, + 8CB3DA1717F1DE5C0090372A /* ppu-inline.hpp */, + 8CB3DA1817F1DE5C0090372A /* ppu.cpp */, + 8CB3DA1917F1DE5C0090372A /* ppu.hpp */, + 8CB3DA1A17F1DE5C0090372A /* render */, + 8CB3DA2417F1DE5C0090372A /* serialization.cpp */, + ); + path = ppu; + sourceTree = ""; + }; + 8CB3DA0B17F1DE5C0090372A /* debugger */ = { + isa = PBXGroup; + children = ( + 8CB3DA0C17F1DE5C0090372A /* debugger.cpp */, + 8CB3DA0D17F1DE5C0090372A /* debugger.hpp */, + 8CB3DA0E17F1DE5C0090372A /* render.cpp */, + ); + path = debugger; + sourceTree = ""; + }; + 8CB3DA0F17F1DE5C0090372A /* memory */ = { + isa = PBXGroup; + children = ( + 8CB3DA1017F1DE5C0090372A /* memory.cpp */, + 8CB3DA1117F1DE5C0090372A /* memory.hpp */, + ); + path = memory; + sourceTree = ""; + }; + 8CB3DA1217F1DE5C0090372A /* mmio */ = { + isa = PBXGroup; + children = ( + 8CB3DA1317F1DE5C0090372A /* mmio.cpp */, + 8CB3DA1417F1DE5C0090372A /* mmio.hpp */, + ); + path = mmio; + sourceTree = ""; + }; + 8CB3DA1A17F1DE5C0090372A /* render */ = { + isa = PBXGroup; + children = ( + 8CB3DA1B17F1DE5C0090372A /* addsub.cpp */, + 8CB3DA1C17F1DE5C0090372A /* bg.cpp */, + 8CB3DA1D17F1DE5C0090372A /* cache.cpp */, + 8CB3DA1E17F1DE5C0090372A /* line.cpp */, + 8CB3DA1F17F1DE5C0090372A /* mode7.cpp */, + 8CB3DA2017F1DE5C0090372A /* oam.cpp */, + 8CB3DA2117F1DE5C0090372A /* render.cpp */, + 8CB3DA2217F1DE5C0090372A /* render.hpp */, + 8CB3DA2317F1DE5C0090372A /* windows.cpp */, + ); + path = render; + sourceTree = ""; + }; + 8CB3DA2517F1DE5C0090372A /* smp */ = { + isa = PBXGroup; + children = ( + 8CB3DA2617F1DE5C0090372A /* core */, + 8CB3DA3617F1DE5C0090372A /* smp.cpp */, + 8CB3DA3717F1DE5C0090372A /* smp.hpp */, + 8CB3DA3817F1DE5C0090372A /* ssmp */, + ); + path = smp; + sourceTree = ""; + }; + 8CB3DA2617F1DE5C0090372A /* core */ = { + isa = PBXGroup; + children = ( + 8CB3DA2717F1DE5C0090372A /* algorithms.cpp */, + 8CB3DA2817F1DE5C0090372A /* core.cpp */, + 8CB3DA2917F1DE5C0090372A /* core.hpp */, + 8CB3DA2A17F1DE5C0090372A /* disassembler */, + 8CB3DA2D17F1DE5C0090372A /* memory.hpp */, + 8CB3DA2E17F1DE5C0090372A /* opcode_misc.cpp */, + 8CB3DA2F17F1DE5C0090372A /* opcode_mov.cpp */, + 8CB3DA3017F1DE5C0090372A /* opcode_pc.cpp */, + 8CB3DA3117F1DE5C0090372A /* opcode_read.cpp */, + 8CB3DA3217F1DE5C0090372A /* opcode_rmw.cpp */, + 8CB3DA3317F1DE5C0090372A /* registers.hpp */, + 8CB3DA3417F1DE5C0090372A /* serialization.cpp */, + 8CB3DA3517F1DE5C0090372A /* table.cpp */, + ); + path = core; + sourceTree = ""; + }; + 8CB3DA2A17F1DE5C0090372A /* disassembler */ = { + isa = PBXGroup; + children = ( + 8CB3DA2B17F1DE5C0090372A /* disassembler.cpp */, + 8CB3DA2C17F1DE5C0090372A /* disassembler.hpp */, + ); + path = disassembler; + sourceTree = ""; + }; + 8CB3DA3817F1DE5C0090372A /* ssmp */ = { + isa = PBXGroup; + children = ( + 8CB3DA3917F1DE5C0090372A /* debugger */, + 8CB3DA3C17F1DE5C0090372A /* memory */, + 8CB3DA3F17F1DE5C0090372A /* serialization.cpp */, + 8CB3DA4017F1DE5C0090372A /* ssmp.cpp */, + 8CB3DA4117F1DE5C0090372A /* ssmp.hpp */, + 8CB3DA4217F1DE5C0090372A /* timing */, + ); + path = ssmp; + sourceTree = ""; + }; + 8CB3DA3917F1DE5C0090372A /* debugger */ = { + isa = PBXGroup; + children = ( + 8CB3DA3A17F1DE5C0090372A /* debugger.cpp */, + 8CB3DA3B17F1DE5C0090372A /* debugger.hpp */, + ); + path = debugger; + sourceTree = ""; + }; + 8CB3DA3C17F1DE5C0090372A /* memory */ = { + isa = PBXGroup; + children = ( + 8CB3DA3D17F1DE5C0090372A /* memory.cpp */, + 8CB3DA3E17F1DE5C0090372A /* memory.hpp */, + ); + path = memory; + sourceTree = ""; + }; + 8CB3DA4217F1DE5C0090372A /* timing */ = { + isa = PBXGroup; + children = ( + 8CB3DA4317F1DE5C0090372A /* timing.cpp */, + 8CB3DA4417F1DE5C0090372A /* timing.hpp */, + ); + path = timing; + sourceTree = ""; + }; + 8CB3DA4517F1DE5C0090372A /* system */ = { + isa = PBXGroup; + children = ( + 8CB3DA4617F1DE5C0090372A /* audio */, + 8CB3DA4917F1DE5C0090372A /* config */, + 8CB3DA4C17F1DE5C0090372A /* debugger */, + 8CB3DA4F17F1DE5C0090372A /* input */, + 8CB3DA5217F1DE5C0090372A /* interface */, + 8CB3DA5417F1DE5C0090372A /* scheduler */, + 8CB3DA5717F1DE5C0090372A /* serialization.cpp */, + 8CB3DA5817F1DE5C0090372A /* system.cpp */, + 8CB3DA5917F1DE5C0090372A /* system.hpp */, + 8CB3DA5A17F1DE5C0090372A /* video */, + ); + path = system; + sourceTree = ""; + }; + 8CB3DA4617F1DE5C0090372A /* audio */ = { + isa = PBXGroup; + children = ( + 8CB3DA4717F1DE5C0090372A /* audio.cpp */, + 8CB3DA4817F1DE5C0090372A /* audio.hpp */, + ); + path = audio; + sourceTree = ""; + }; + 8CB3DA4917F1DE5C0090372A /* config */ = { + isa = PBXGroup; + children = ( + 8CB3DA4A17F1DE5C0090372A /* config.cpp */, + 8CB3DA4B17F1DE5C0090372A /* config.hpp */, + ); + path = config; + sourceTree = ""; + }; + 8CB3DA4C17F1DE5C0090372A /* debugger */ = { + isa = PBXGroup; + children = ( + 8CB3DA4D17F1DE5C0090372A /* debugger.cpp */, + 8CB3DA4E17F1DE5C0090372A /* debugger.hpp */, + ); + path = debugger; + sourceTree = ""; + }; + 8CB3DA4F17F1DE5C0090372A /* input */ = { + isa = PBXGroup; + children = ( + 8CB3DA5017F1DE5C0090372A /* input.cpp */, + 8CB3DA5117F1DE5C0090372A /* input.hpp */, + ); + path = input; + sourceTree = ""; + }; + 8CB3DA5217F1DE5C0090372A /* interface */ = { + isa = PBXGroup; + children = ( + 8CB3DA5317F1DE5C0090372A /* interface.hpp */, + ); + path = interface; + sourceTree = ""; + }; + 8CB3DA5417F1DE5C0090372A /* scheduler */ = { + isa = PBXGroup; + children = ( + 8CB3DA5517F1DE5C0090372A /* scheduler.cpp */, + 8CB3DA5617F1DE5C0090372A /* scheduler.hpp */, + ); + path = scheduler; + sourceTree = ""; + }; + 8CB3DA5A17F1DE5C0090372A /* video */ = { + isa = PBXGroup; + children = ( + 8CB3DA5B17F1DE5C0090372A /* video.cpp */, + 8CB3DA5C17F1DE5C0090372A /* video.hpp */, + ); + path = video; + sourceTree = ""; + }; + 8CB3DC0817F1DE5D0090372A /* sound */ = { + isa = PBXGroup; + children = ( + 8CB3DC0917F1DE5D0090372A /* Blip_Buffer.cpp */, + 94817C301922B53900FDFC99 /* Blip_Buffer.h */, + 94817C311922B53900FDFC99 /* fir_blargg_common.h */, + 94817C321922B53900FDFC99 /* fir_blargg_config.h */, + 94817C331922B53900FDFC99 /* fir_blargg_endian.h */, + 94817C341922B53900FDFC99 /* fir_blargg_source.h */, + 8CB3DC0A17F1DE5D0090372A /* Fir_Resampler.cpp */, + 94817C351922B53900FDFC99 /* Fir_Resampler.h */, + 8CB3DC0B17F1DE5D0090372A /* Makefile.am */, + 8CB3DC0C17F1DE5D0090372A /* Makefile.in */, + 94817C371922B53900FDFC99 /* okiadpcm-deltatable.h */, + 94817C381922B53900FDFC99 /* okiadpcm.cpp */, + 94817C391922B53900FDFC99 /* okiadpcm.h */, + 94817C361922B53900FDFC99 /* okiadpcm_generate.cpp */, + 948D5B4418C805E500346504 /* OwlResampler.cpp */, + 948D5B4518C805E500346504 /* OwlResampler.h */, + 8CB3DC0D17F1DE5D0090372A /* Stereo_Buffer.cpp */, + 94817C3C1922B56300FDFC99 /* Stereo_Buffer.h */, + 8CB3DC0E17F1DE5D0090372A /* WAVRecord.cpp */, + 8CB3DC0F17F1DE5D0090372A /* WAVRecord.h */, + ); + path = sound; + sourceTree = ""; + }; + 8CB3DC1717F1DE5D0090372A /* string */ = { + isa = PBXGroup; + children = ( + 94FD853318C7F58C001B426D /* trim.cpp */, + 94FD853418C7F58C001B426D /* trim.h */, + 8CB3DC1817F1DE5D0090372A /* ConvertUTF.cpp */, + 8CB3DC1917F1DE5D0090372A /* ConvertUTF.h */, + 8CB3DC1A17F1DE5D0090372A /* escape.cpp */, + 8CB3DC1B17F1DE5D0090372A /* escape.h */, + 8CB3DC1C17F1DE5D0090372A /* Makefile.am.inc */, + ); + path = string; + sourceTree = ""; + }; + 8CB3DC2117F1DE5D0090372A /* tremor */ = { + isa = PBXGroup; + children = ( + 8CB3DC2217F1DE5D0090372A /* !!!VERSION */, + 8CB3DC2317F1DE5D0090372A /* asm_arm.h */, + 8CB3DC2417F1DE5D0090372A /* backends.h */, + 8CB3DC2517F1DE5D0090372A /* bitwise.c */, + 8CB3DC2617F1DE5D0090372A /* block.c */, + 8CB3DC2717F1DE5D0090372A /* block.h */, + 8CB3DC2817F1DE5D0090372A /* CHANGELOG */, + 8CB3DC2917F1DE5D0090372A /* codebook.c */, + 8CB3DC2A17F1DE5D0090372A /* codebook.h */, + 8CB3DC2B17F1DE5D0090372A /* codec_internal.h */, + 8CB3DC2C17F1DE5D0090372A /* configure.in */, + 8CB3DC2D17F1DE5D0090372A /* COPYING */, + 8CB3DC2E17F1DE5D0090372A /* floor0.c */, + 8CB3DC2F17F1DE5D0090372A /* floor1.c */, + 8CB3DC3017F1DE5D0090372A /* framing.c */, + 8CB3DC3117F1DE5D0090372A /* info.c */, + 8CB3DC3217F1DE5D0090372A /* iseeking_example.c */, + 8CB3DC3317F1DE5D0090372A /* ivorbiscodec.h */, + 8CB3DC3417F1DE5D0090372A /* ivorbisfile.h */, + 8CB3DC3517F1DE5D0090372A /* ivorbisfile_example.c */, + 8CB3DC3617F1DE5D0090372A /* lsp_lookup.h */, + 8CB3DC3717F1DE5D0090372A /* Makefile.am */, + 8CB3DC3817F1DE5D0090372A /* Makefile.in */, + 8CB3DC3917F1DE5D0090372A /* mapping0.c */, + 8CB3DC3A17F1DE5D0090372A /* mdct.c */, + 8CB3DC3B17F1DE5D0090372A /* mdct.h */, + 8CB3DC3C17F1DE5D0090372A /* mdct_lookup.h */, + 8CB3DC3D17F1DE5D0090372A /* misc.h */, + 8CB3DC3E17F1DE5D0090372A /* ogg.h */, + 8CB3DC3F17F1DE5D0090372A /* os.h */, + 8CB3DC4017F1DE5D0090372A /* os_types.h */, + 8CB3DC4117F1DE5D0090372A /* README */, + 8CB3DC4217F1DE5D0090372A /* registry.c */, + 8CB3DC4317F1DE5D0090372A /* registry.h */, + 8CB3DC4417F1DE5D0090372A /* res012.c */, + 8CB3DC4517F1DE5D0090372A /* sharedbook.c */, + 8CB3DC4617F1DE5D0090372A /* synthesis.c */, + 8CB3DC4717F1DE5D0090372A /* Version_script.in */, + 8CB3DC4817F1DE5D0090372A /* vorbisfile.c */, + 8CB3DC4917F1DE5D0090372A /* vorbisidec.pc.in */, + 8CB3DC4A17F1DE5D0090372A /* window.c */, + 8CB3DC4B17F1DE5D0090372A /* window.h */, + 8CB3DC4C17F1DE5D0090372A /* window_lookup.h */, + ); + path = tremor; + sourceTree = ""; + }; + 8CB3DC4D17F1DE5D0090372A /* trio */ = { + isa = PBXGroup; + children = ( + 8CB3DC4E17F1DE5D0090372A /* CHANGES */, + 8CB3DC4F17F1DE5D0090372A /* Makefile.am */, + 8CB3DC5017F1DE5D0090372A /* Makefile.in */, + 8CB3DC5117F1DE5D0090372A /* trio.c */, + 8CB3DC5217F1DE5D0090372A /* trionan.c */, + 8CB3DC5317F1DE5D0090372A /* triostr.c */, + ); + path = trio; + sourceTree = ""; + }; + 8CB3DC5517F1DE5D0090372A /* vb */ = { + isa = PBXGroup; + children = ( + 8CB3DC5617F1DE5D0090372A /* debug.cpp */, + 8CB3DC5717F1DE5D0090372A /* debug.h */, + 8CB3DC5817F1DE5D0090372A /* input.cpp */, + 8CB3DC5917F1DE5D0090372A /* input.h */, + 8CB3DC5A17F1DE5D0090372A /* Makefile.am */, + 8CB3DC5B17F1DE5D0090372A /* Makefile.in */, + 8CB3DC5C17F1DE5D0090372A /* timer.cpp */, + 8CB3DC5D17F1DE5D0090372A /* timer.h */, + 8CB3DC5E17F1DE5D0090372A /* vb.cpp */, + 8CB3DC5F17F1DE5D0090372A /* vb.h */, + 8CB3DC6017F1DE5D0090372A /* vip.cpp */, + 8CB3DC6117F1DE5D0090372A /* vip.h */, + 8CB3DC6217F1DE5D0090372A /* vip_draw.inc */, + 8CB3DC6317F1DE5D0090372A /* vsu.cpp */, + 8CB3DC6417F1DE5D0090372A /* vsu.h */, + ); + path = vb; + sourceTree = ""; + }; + 8CB3DC6517F1DE5D0090372A /* video */ = { + isa = PBXGroup; + children = ( + 8CB3DC6617F1DE5D0090372A /* Deinterlacer.cpp */, + 8CB3DC6717F1DE5D0090372A /* Deinterlacer.h */, + 8CB3DC6817F1DE5D0090372A /* font-data-12x13.c */, + 8CB3DC6917F1DE5D0090372A /* font-data-18x18.c */, + 8CB3DC6A17F1DE5D0090372A /* font-data.cpp */, + 8CB3DC6B17F1DE5D0090372A /* font-data.h */, + 8CB3DC6C17F1DE5D0090372A /* font12x13.h */, + 8CB3DC6D17F1DE5D0090372A /* font18x18.h */, + 8CB3DC6E17F1DE5D0090372A /* font4x5.h */, + 8CB3DC6F17F1DE5D0090372A /* font5x7.h */, + 8CB3DC7017F1DE5D0090372A /* font6x13.h */, + 8CB3DC7117F1DE5D0090372A /* font9x18.h */, + 8CB3DC7217F1DE5D0090372A /* Makefile.am.inc */, + 8CB3DC7317F1DE5D0090372A /* png.cpp */, + 8CB3DC7417F1DE5D0090372A /* png.h */, + 8CB3DC7517F1DE5D0090372A /* primitives.cpp */, + 8CB3DC7617F1DE5D0090372A /* primitives.h */, + 8CB3DC7717F1DE5D0090372A /* README.FONTS */, + 8CB3DC7817F1DE5D0090372A /* resize.cpp */, + 8CB3DC7917F1DE5D0090372A /* resize.h */, + 8CB3DC7C17F1DE5D0090372A /* surface.cpp */, + 8CB3DC7D17F1DE5D0090372A /* surface.h */, + 8CB3DC7E17F1DE5D0090372A /* tblur.cpp */, + 8CB3DC7F17F1DE5D0090372A /* tblur.h */, + 8CB3DC8017F1DE5D0090372A /* text.cpp */, + 8CB3DC8117F1DE5D0090372A /* text.h */, + 8CB3DC8217F1DE5D0090372A /* video-common.h */, + 8CB3DC8317F1DE5D0090372A /* video.cpp */, + ); + path = video; + sourceTree = ""; + }; + 8CB3DC8617F1DE5D0090372A /* wswan */ = { + isa = PBXGroup; + children = ( + 9454E32919516301005A5CFE /* comm.cpp */, + 9454E32A19516301005A5CFE /* comm.h */, + 8CB3DC8717F1DE5D0090372A /* debug.cpp */, + 8CB3DC8817F1DE5D0090372A /* debug.h */, + 8CB3DC8917F1DE5D0090372A /* dis */, + 8CB3DC9217F1DE5D0090372A /* eeprom.cpp */, + 8CB3DC9317F1DE5D0090372A /* eeprom.h */, + 8CB3DC9417F1DE5D0090372A /* gfx.cpp */, + 8CB3DC9517F1DE5D0090372A /* gfx.h */, + 8CB3DC9617F1DE5D0090372A /* interrupt.cpp */, + 8CB3DC9717F1DE5D0090372A /* interrupt.h */, + 8CB3DC9817F1DE5D0090372A /* main.cpp */, + 8CB3DC9917F1DE5D0090372A /* Makefile.am */, + 8CB3DC9A17F1DE5E0090372A /* Makefile.in */, + 8CB3DC9B17F1DE5E0090372A /* memory.cpp */, + 8CB3DC9C17F1DE5E0090372A /* memory.h */, + 8CB3DC9D17F1DE5E0090372A /* rtc.cpp */, + 8CB3DC9E17F1DE5E0090372A /* rtc.h */, + 8CB3DC9F17F1DE5E0090372A /* sound.cpp */, + 8CB3DCA017F1DE5E0090372A /* sound.h */, + 8CB3DCA117F1DE5E0090372A /* start.inc */, + 8CB3DCA217F1DE5E0090372A /* tcache.cpp */, + 8CB3DCA317F1DE5E0090372A /* v30mz-ea.inc */, + 8CB3DCA417F1DE5E0090372A /* v30mz-modrm.inc */, + 8CB3DCA517F1DE5E0090372A /* v30mz-private.h */, + 8CB3DCA617F1DE5E0090372A /* v30mz.cpp */, + 8CB3DCA717F1DE5E0090372A /* v30mz.h */, + 8CB3DCA817F1DE5E0090372A /* wstech24.txt */, + 8CB3DCA917F1DE5E0090372A /* wswan.h */, + ); + path = wswan; + sourceTree = ""; + }; + 8CB3DC8917F1DE5D0090372A /* dis */ = { + isa = PBXGroup; + children = ( + 8CB3DC8A17F1DE5D0090372A /* dis_decode.cpp */, + 8CB3DC8B17F1DE5D0090372A /* dis_groups.cpp */, + 8CB3DC8C17F1DE5D0090372A /* dis_tables.h */, + 8CB3DC8D17F1DE5D0090372A /* dis_tables.inc */, + 8CB3DC8E17F1DE5D0090372A /* disasm.h */, + 8CB3DC8F17F1DE5D0090372A /* opcodes.inc */, + 8CB3DC9017F1DE5D0090372A /* resolve.cpp */, + 8CB3DC9117F1DE5D0090372A /* syntax.cpp */, + ); + path = dis; + sourceTree = ""; + }; + 8CB3E08917F1DFFF0090372A /* include */ = { + isa = PBXGroup; + children = ( + 8CB3E09917F1DFFF0090372A /* trio */, + ); + path = include; + sourceTree = ""; + }; + 8CB3E09917F1DFFF0090372A /* trio */ = { + isa = PBXGroup; + children = ( + 8CB3E09A17F1DFFF0090372A /* CHANGES */, + 8CB3E09B17F1DFFF0090372A /* trio.h */, + 8CB3E09C17F1DFFF0090372A /* triodef.h */, + 8CB3E09D17F1DFFF0090372A /* trionan.h */, + 8CB3E09E17F1DFFF0090372A /* triop.h */, + 8CB3E09F17F1DFFF0090372A /* triostr.h */, + ); + path = trio; + sourceTree = ""; + }; + 94817C291922B45500FDFC99 /* cdplay */ = { + isa = PBXGroup; + children = ( + 94817C2A1922B45500FDFC99 /* cdplay.cpp */, + 94817C2B1922B45500FDFC99 /* Makefile.am */, + 94817C2C1922B45500FDFC99 /* Makefile.in */, + ); + path = cdplay; + sourceTree = ""; + }; + 94CFB6291A75D73F001F174F /* hash */ = { + isa = PBXGroup; + children = ( + 94CFB62A1A75D73F001F174F /* Makefile.am.inc */, + 94CFB62B1A75D73F001F174F /* md5.cpp */, + 94CFB62C1A75D73F001F174F /* md5.h */, + 94CFB62D1A75D73F001F174F /* sha1.cpp */, + 94CFB62E1A75D73F001F174F /* sha1.h */, + 94CFB62F1A75D73F001F174F /* sha256.cpp */, + 94CFB6301A75D73F001F174F /* sha256.h */, + ); + path = hash; + sourceTree = ""; + }; + 94CFB6491A75DBE2001F174F /* notes */ = { + isa = PBXGroup; + children = ( + 94CFB64C1A75DBE2001F174F /* MULTITAP */, + 94B082561A8698A200D3C0BC /* PROBLEMATIC-GAMES */, + 94CFB64D1A75DBE2001F174F /* PSX-TODO */, + 94CFB64E1A75DBE2001F174F /* SOURCES */, + 94CFB64F1A75DBE2001F174F /* SPU-IRQ */, + 94CFB6501A75DBE2001F174F /* tristep.cpp */, + ); + path = notes; + sourceTree = ""; + }; + 94CFB6511A75DC2D001F174F /* quicklz */ = { + isa = PBXGroup; + children = ( + 94CFB6521A75DC2D001F174F /* Makefile.am */, + 94CFB6531A75DC2D001F174F /* Makefile.in */, + 94CFB6541A75DC2D001F174F /* quicklz.c */, + 94CFB6551A75DC2D001F174F /* quicklz.h */, + ); + path = quicklz; + sourceTree = ""; + }; + 94CFB65C1A75DCB0001F174F /* sdsp */ = { + isa = PBXGroup; + children = ( + 94CFB65D1A75DCB0001F174F /* brr.cpp */, + 94CFB65E1A75DCB0001F174F /* counter.cpp */, + 94CFB65F1A75DCB0001F174F /* echo.cpp */, + 94CFB6601A75DCB0001F174F /* envelope.cpp */, + 94CFB6611A75DCB0001F174F /* gaussian.cpp */, + 94CFB6621A75DCB0001F174F /* misc.cpp */, + 94CFB6631A75DCB0001F174F /* sdsp.cpp */, + 94CFB6641A75DCB0001F174F /* sdsp.hpp */, + 94CFB6651A75DCB0001F174F /* serialization.cpp */, + 94CFB6661A75DCB0001F174F /* voice.cpp */, + ); + path = sdsp; + sourceTree = ""; + }; + B340E4631E08887700AD0E8B /* PVMednafen */ = { + isa = PBXGroup; + children = ( + B340E4641E08887700AD0E8B /* PVMednafen.h */, + B340E4651E08887700AD0E8B /* Info.plist */, + ); + path = PVMednafen; + sourceTree = ""; + }; + B340E5E51E0889FB00AD0E8B /* Frameworks */ = { + isa = PBXGroup; + children = ( + B340E5FC1E088AF700AD0E8B /* PVSupport.framework */, + B340E5FA1E088AF100AD0E8B /* PVSupport.framework */, + B340E5F41E088A4500AD0E8B /* Foundation.framework */, + B340E5F21E088A4000AD0E8B /* UIKit.framework */, + B340E5F01E088A3A00AD0E8B /* Foundation.framework */, + B340E5EE1E088A3500AD0E8B /* UIKit.framework */, + B340E5EC1E088A1E00AD0E8B /* libiconv.tbd */, + B340E5EA1E088A1100AD0E8B /* libiconv.tbd */, + B340E5E81E088A0100AD0E8B /* libz.tbd */, + B340E5E61E0889FB00AD0E8B /* libz.tbd */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + B340E45F1E08887600AD0E8B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B340E4661E08887700AD0E8B /* PVMednafen.h in Headers */, + B3223CDD1E09E0CA007BB244 /* MednafenGameCore.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B340E46C1E08888700AD0E8B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B3223CDE1E09E0CB007BB244 /* MednafenGameCore.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + B340E4611E08887600AD0E8B /* PVMednafen */ = { + isa = PBXNativeTarget; + buildConfigurationList = B340E4671E08887700AD0E8B /* Build configuration list for PBXNativeTarget "PVMednafen" */; + buildPhases = ( + B340E45D1E08887600AD0E8B /* Sources */, + B340E45E1E08887600AD0E8B /* Frameworks */, + B340E45F1E08887600AD0E8B /* Headers */, + B340E4601E08887600AD0E8B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PVMednafen; + productName = PVMednafen; + productReference = B340E4621E08887600AD0E8B /* PVMednafen.framework */; + productType = "com.apple.product-type.framework"; + }; + B340E46E1E08888700AD0E8B /* PVMednafen tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = B340E4741E08888700AD0E8B /* Build configuration list for PBXNativeTarget "PVMednafen tvOS" */; + buildPhases = ( + B340E46A1E08888700AD0E8B /* Sources */, + B340E46B1E08888700AD0E8B /* Frameworks */, + B340E46C1E08888700AD0E8B /* Headers */, + B340E46D1E08888700AD0E8B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "PVMednafen tvOS"; + productName = "PVMednafen tvOS"; + productReference = B340E46F1E08888700AD0E8B /* PVMednafen.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 089C1669FE841209C02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 0700; + TargetAttributes = { + B340E4611E08887600AD0E8B = { + CreatedOnToolsVersion = 8.1; + ProvisioningStyle = Automatic; + }; + B340E46E1E08888700AD0E8B = { + CreatedOnToolsVersion = 8.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "PVMednafen" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 089C166AFE841209C02AAC07 /* Mednafen */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B340E4611E08887600AD0E8B /* PVMednafen */, + B340E46E1E08888700AD0E8B /* PVMednafen tvOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B340E4601E08887600AD0E8B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B340E46D1E08888700AD0E8B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B340E45D1E08887600AD0E8B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B340E4791E08893000AD0E8B /* c68k.cpp in Sources */, + B340E47A1E08893000AD0E8B /* c68kexec.cpp in Sources */, + B340E47B1E08893000AD0E8B /* MednafenGameCore.mm in Sources */, + B39578D91E6D582300854D7A /* T6W28_Apu.cpp in Sources */, + B340E47C1E08893000AD0E8B /* video.cpp in Sources */, + B340E47D1E08893000AD0E8B /* negcon.cpp in Sources */, + B340E47E1E08893000AD0E8B /* ZLInflateFilter.cpp in Sources */, + B340E47F1E08893000AD0E8B /* soundbox.cpp in Sources */, + B340E4801E08893000AD0E8B /* galois.cpp in Sources */, + B39578D61E6D582300854D7A /* rom.cpp in Sources */, + B340E4811E08893000AD0E8B /* PSFLoader.cpp in Sources */, + B340E4821E08893000AD0E8B /* input.cpp in Sources */, + B340E4831E08893000AD0E8B /* res012.c in Sources */, + B340E4841E08893000AD0E8B /* hes.cpp in Sources */, + B340E4851E08893000AD0E8B /* sound.cpp in Sources */, + B340E4861E08893000AD0E8B /* arcade_card.cpp in Sources */, + B340E4871E08893000AD0E8B /* psx.cpp in Sources */, + B340E4881E08893000AD0E8B /* c65c02.cpp in Sources */, + B340E4891E08893000AD0E8B /* OwlResampler.cpp in Sources */, + B340E48A1E08893000AD0E8B /* CDUtility.cpp in Sources */, + B340E48B1E08893000AD0E8B /* huc6273.cpp in Sources */, + B340E48C1E08893000AD0E8B /* crc32.cpp in Sources */, + B39578EF1E6D583B00854D7A /* TLCS900h_registers.cpp in Sources */, + B340E48D1E08893000AD0E8B /* sio.cpp in Sources */, + B340E48F1E08893000AD0E8B /* mapping0.c in Sources */, + B39578CB1E6D57F900854D7A /* bios.cpp in Sources */, + B340E4901E08893000AD0E8B /* registry.c in Sources */, + B340E4911E08893000AD0E8B /* okiadpcm.cpp in Sources */, + B39578FF1E6D591E00854D7A /* z80_ops.cpp in Sources */, + B39578CC1E6D57F900854D7A /* biosHLE.cpp in Sources */, + B340E4921E08893000AD0E8B /* mpc_demux.c in Sources */, + B340E4931E08893000AD0E8B /* mdec.cpp in Sources */, + B340E4941E08893000AD0E8B /* tcache.cpp in Sources */, + B340E4951E08893000AD0E8B /* general.cpp in Sources */, + B340E4961E08893000AD0E8B /* vsu.cpp in Sources */, + B340E4971E08893000AD0E8B /* frontio.cpp in Sources */, + B39578ED1E6D583B00854D7A /* TLCS900h_interpret_single.cpp in Sources */, + B340E4981E08893000AD0E8B /* framing.c in Sources */, + B39578D21E6D582300854D7A /* gfx.cpp in Sources */, + B340E4991E08893000AD0E8B /* triostr.c in Sources */, + B340E49A1E08893000AD0E8B /* png.cpp in Sources */, + B340E49B1E08893000AD0E8B /* synthesis.c in Sources */, + B340E49C1E08893000AD0E8B /* endian.cpp in Sources */, + B340E49D1E08893000AD0E8B /* FileStream.cpp in Sources */, + B340E49E1E08893000AD0E8B /* gpu.cpp in Sources */, + B340E49F1E08893000AD0E8B /* synth_filter.c in Sources */, + B340E4A01E08893000AD0E8B /* sha1.cpp in Sources */, + B340E4A11E08893000AD0E8B /* MemoryStream.cpp in Sources */, + B39578CD1E6D57F900854D7A /* dma.cpp in Sources */, + B340E4A21E08893000AD0E8B /* trio.c in Sources */, + B340E4A31E08893000AD0E8B /* vb.cpp in Sources */, + B340E4A41E08893000AD0E8B /* netplay.cpp in Sources */, + B340E4A51E08893000AD0E8B /* debug.cpp in Sources */, + B340E4A61E08893000AD0E8B /* dualshock.cpp in Sources */, + B340E4A71E08893000AD0E8B /* mpc_decoder.c in Sources */, + B340E4A81E08893000AD0E8B /* mpc_bits_reader.c in Sources */, + B340E4A91E08893000AD0E8B /* v30mz.cpp in Sources */, + B340E4AA1E08893000AD0E8B /* rtc.cpp in Sources */, + B39578D71E6D582300854D7A /* rtc.cpp in Sources */, + B39578EE1E6D583B00854D7A /* TLCS900h_interpret_src.cpp in Sources */, + B340E4AB1E08893000AD0E8B /* vip.cpp in Sources */, + B340E4AC1E08893000AD0E8B /* mempatcher.cpp in Sources */, + B340E4AD1E08893000AD0E8B /* irq.cpp in Sources */, + B340E4AE1E08893000AD0E8B /* dis.cpp in Sources */, + B340E4AF1E08893000AD0E8B /* spu.cpp in Sources */, + B340E4B01E08893000AD0E8B /* thread.cpp in Sources */, + B340E4B11E08893000AD0E8B /* dis_groups.cpp in Sources */, + B340E4B21E08893000AD0E8B /* memory.cpp in Sources */, + B340E4B31E08893000AD0E8B /* qtrecord.cpp in Sources */, + B340E4B41E08893000AD0E8B /* streaminfo.c in Sources */, + B340E4B51E08893000AD0E8B /* mednafen.cpp in Sources */, + B340E4B61E08893000AD0E8B /* Fir_Resampler.cpp in Sources */, + B340E4B71E08893000AD0E8B /* sharedbook.c in Sources */, + B340E4B81E08893000AD0E8B /* Stream.cpp in Sources */, + B340E4B91E08893000AD0E8B /* gpu_line.cpp in Sources */, + B340E4BA1E08893000AD0E8B /* crc32.c in Sources */, + B340E4BB1E08893000AD0E8B /* movie.cpp in Sources */, + B340E4BC1E08893000AD0E8B /* CDAccess_Image.cpp in Sources */, + B340E4BD1E08893000AD0E8B /* gte.cpp in Sources */, + B340E4BE1E08893000AD0E8B /* guncon.cpp in Sources */, + B340E4BF1E08893000AD0E8B /* v810_fp_ops.cpp in Sources */, + B340E4C01E08893000AD0E8B /* system.cpp in Sources */, + B340E4C11E08893000AD0E8B /* text.cpp in Sources */, + B340E4C21E08893000AD0E8B /* ConvertUTF.cpp in Sources */, + B340E4C31E08893000AD0E8B /* z80.cpp in Sources */, + B340E4C41E08893000AD0E8B /* file.cpp in Sources */, + B340E4C51E08893000AD0E8B /* huc6280.cpp in Sources */, + B340E4C61E08893000AD0E8B /* CDAccess.cpp in Sources */, + B340E4C71E08893000AD0E8B /* justifier.cpp in Sources */, + B39578FB1E6D585C00854D7A /* Z80_interface.cpp in Sources */, + B340E4C81E08893000AD0E8B /* CDAFReader.cpp in Sources */, + B340E4C91E08893000AD0E8B /* mouse.cpp in Sources */, + B340E4CA1E08893000AD0E8B /* codebook.c in Sources */, + B340E4CB1E08893000AD0E8B /* stubs.cpp in Sources */, + B340E4CC1E08893000AD0E8B /* player.cpp in Sources */, + B340E4CD1E08893000AD0E8B /* l-ec.cpp in Sources */, + B340E4CE1E08893000AD0E8B /* settings.cpp in Sources */, + B340E4CF1E08893000AD0E8B /* trionan.c in Sources */, + B340E4D01E08893000AD0E8B /* huffman.c in Sources */, + B340E4D11E08893000AD0E8B /* bitwise.c in Sources */, + B340E4D21E08893000AD0E8B /* md5.cpp in Sources */, + B340E4D31E08893000AD0E8B /* tblur.cpp in Sources */, + B340E4D41E08893000AD0E8B /* vorbisfile.c in Sources */, + B340E4D51E08893000AD0E8B /* minilzo.c in Sources */, + B340E4D61E08893000AD0E8B /* pcecd.cpp in Sources */, + B340E4D71E08893000AD0E8B /* cpu.cpp in Sources */, + B340E4D81E08893000AD0E8B /* mouse.cpp in Sources */, + B39578D41E6D582300854D7A /* interrupt.cpp in Sources */, + B39578FD1E6D58FF00854D7A /* gfx_scanline_mono.cpp in Sources */, + B39578E81E6D583B00854D7A /* TLCS900h_disassemble_reg.cpp in Sources */, + B39578E71E6D583B00854D7A /* TLCS900h_disassemble_extra.cpp in Sources */, + B340E4D91E08893000AD0E8B /* requant.c in Sources */, + B340E4DA1E08893000AD0E8B /* git.cpp in Sources */, + B340E4DB1E08893000AD0E8B /* surface.cpp in Sources */, + B340E4DC1E08893000AD0E8B /* Deinterlacer.cpp in Sources */, + B340E4DD1E08893000AD0E8B /* gfx.cpp in Sources */, + B39578D51E6D582300854D7A /* mem.cpp in Sources */, + B340E4DE1E08893000AD0E8B /* fxscsi.cpp in Sources */, + B340E4DF1E08893000AD0E8B /* gpu_sprite.cpp in Sources */, + B340E4E01E08893000AD0E8B /* trim.cpp in Sources */, + B340E4E11E08893000AD0E8B /* input.cpp in Sources */, + B340E4E21E08893000AD0E8B /* multitap.cpp in Sources */, + B340E4E31E08893000AD0E8B /* memmap.cpp in Sources */, + B340E4E41E08893000AD0E8B /* state_rewind.cpp in Sources */, + B340E4E51E08893000AD0E8B /* cart.cpp in Sources */, + B340E4E61E08893000AD0E8B /* ram.cpp in Sources */, + B340E4E71E08893000AD0E8B /* mikie.cpp in Sources */, + B340E4E81E08893000AD0E8B /* interrupt.cpp in Sources */, + B340E4E91E08893000AD0E8B /* syntax.cpp in Sources */, + B340E4EA1E08893000AD0E8B /* mouse.cpp in Sources */, + B340E4EB1E08893000AD0E8B /* lec.cpp in Sources */, + B340E4EC1E08893000AD0E8B /* dis_decode.cpp in Sources */, + B340E4ED1E08893000AD0E8B /* interrupt.cpp in Sources */, + B340E4EE1E08893000AD0E8B /* dma.cpp in Sources */, + B340E4EF1E08893000AD0E8B /* tests.cpp in Sources */, + B340E4F01E08893000AD0E8B /* cdc.cpp in Sources */, + B340E4F11E08893000AD0E8B /* dualanalog.cpp in Sources */, + B340E4F21E08893000AD0E8B /* huc.cpp in Sources */, + B340E4F31E08893000AD0E8B /* memory.cpp in Sources */, + B340E4F41E08893000AD0E8B /* cdplay.cpp in Sources */, + B340E4F51E08893000AD0E8B /* eeprom.cpp in Sources */, + B340E4F61E08893000AD0E8B /* vce.cpp in Sources */, + B340E4F71E08893000AD0E8B /* window.c in Sources */, + B340E4F81E08893000AD0E8B /* quicklz.c in Sources */, + B39578EB1E6D583B00854D7A /* TLCS900h_interpret_dst.cpp in Sources */, + B39578E91E6D583B00854D7A /* TLCS900h_disassemble_src.cpp in Sources */, + B340E4F91E08893000AD0E8B /* CDAFReader_MPC.cpp in Sources */, + B340E4FA1E08893000AD0E8B /* timer.cpp in Sources */, + B340E4FB1E08893000AD0E8B /* Blip_Buffer.cpp in Sources */, + B340E4FC1E08893000AD0E8B /* tsushinkb.cpp in Sources */, + B340E4FD1E08893000AD0E8B /* mcgenjin.cpp in Sources */, + B340E4FE1E08893000AD0E8B /* pcfx.cpp in Sources */, + B340E4FF1E08893000AD0E8B /* gpu_polygon.cpp in Sources */, + B340E5001E08893000AD0E8B /* gamepad.cpp in Sources */, + B340E5011E08893000AD0E8B /* vdc.cpp in Sources */, + B340E5021E08893000AD0E8B /* rainbow.cpp in Sources */, + B340E5031E08893000AD0E8B /* timer.cpp in Sources */, + B340E5041E08893000AD0E8B /* GZFileStream.cpp in Sources */, + B340E5051E08893000AD0E8B /* IPSPatcher.cpp in Sources */, + B340E5061E08893000AD0E8B /* rom.cpp in Sources */, + B39578EA1E6D583B00854D7A /* TLCS900h_interpret.cpp in Sources */, + B39578E51E6D583B00854D7A /* TLCS900h_disassemble.cpp in Sources */, + B340E5071E08893000AD0E8B /* unzip.c in Sources */, + B340E5081E08893000AD0E8B /* resample.c in Sources */, + B340E5091E08893000AD0E8B /* cdromif.cpp in Sources */, + B340E50A1E08893000AD0E8B /* comm.cpp in Sources */, + B340E50B1E08893000AD0E8B /* error.cpp in Sources */, + B340E50C1E08893000AD0E8B /* pce.cpp in Sources */, + B340E50D1E08893000AD0E8B /* info.c in Sources */, + B340E50E1E08893000AD0E8B /* king.cpp in Sources */, + B340E50F1E08893000AD0E8B /* resize.cpp in Sources */, + B340E5101E08893000AD0E8B /* v810_cpu.cpp in Sources */, + B340E5111E08893000AD0E8B /* WAVRecord.cpp in Sources */, + B340E5121E08893000AD0E8B /* block.c in Sources */, + B340E5131E08893000AD0E8B /* memcard.cpp in Sources */, + B340E5141E08893000AD0E8B /* gamepad.cpp in Sources */, + B39578D81E6D582300854D7A /* sound.cpp in Sources */, + B340E5151E08893000AD0E8B /* pce_psg.cpp in Sources */, + B340E5161E08893000AD0E8B /* state.cpp in Sources */, + B39578C91E6D57DD00854D7A /* neopop.cpp in Sources */, + B340E5171E08893000AD0E8B /* timer.cpp in Sources */, + B340E5181E08893000AD0E8B /* CDAFReader_Vorbis.cpp in Sources */, + B340E5191E08893000AD0E8B /* floor0.c in Sources */, + B39578E61E6D583B00854D7A /* TLCS900h_disassemble_dst.cpp in Sources */, + B340E51A1E08893000AD0E8B /* ioapi.c in Sources */, + B340E51B1E08893000AD0E8B /* mdct.c in Sources */, + B39578D11E6D582300854D7A /* flash.cpp in Sources */, + B340E51C1E08893000AD0E8B /* CDAccess_CCD.cpp in Sources */, + B39578D31E6D582300854D7A /* gfx_scanline_colour.cpp in Sources */, + B340E51D1E08893000AD0E8B /* recover-raw.cpp in Sources */, + B340E51E1E08893000AD0E8B /* scsicd.cpp in Sources */, + B340E51F1E08893000AD0E8B /* tsushin.cpp in Sources */, + B340E5201E08893000AD0E8B /* font-data.cpp in Sources */, + B340E5211E08893000AD0E8B /* floor1.c in Sources */, + B340E5221E08893000AD0E8B /* main.cpp in Sources */, + B340E5231E08893000AD0E8B /* susie.cpp in Sources */, + B340E5241E08893000AD0E8B /* jrevdct.cpp in Sources */, + B340E5251E08893000AD0E8B /* gamepad.cpp in Sources */, + B340E5261E08893000AD0E8B /* escape.cpp in Sources */, + B340E5271E08893000AD0E8B /* input.cpp in Sources */, + B340E5281E08893000AD0E8B /* resolve.cpp in Sources */, + B340E5291E08893000AD0E8B /* Stereo_Buffer.cpp in Sources */, + B340E52A1E08893000AD0E8B /* cputest.c in Sources */, + B340E52C1E08893000AD0E8B /* demo.cpp in Sources */, + B39578EC1E6D583B00854D7A /* TLCS900h_interpret_reg.cpp in Sources */, + B340E52D1E08893000AD0E8B /* sha256.cpp in Sources */, + B340E52E1E08893000AD0E8B /* primitives.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B340E46A1E08888700AD0E8B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B340E52F1E08893000AD0E8B /* c68k.cpp in Sources */, + B340E5301E08893000AD0E8B /* c68kexec.cpp in Sources */, + B340E5311E08893000AD0E8B /* MednafenGameCore.mm in Sources */, + B39578E31E6D582300854D7A /* T6W28_Apu.cpp in Sources */, + B340E5321E08893000AD0E8B /* video.cpp in Sources */, + B340E5331E08893000AD0E8B /* negcon.cpp in Sources */, + B340E5341E08893000AD0E8B /* ZLInflateFilter.cpp in Sources */, + B340E5351E08893000AD0E8B /* soundbox.cpp in Sources */, + B340E5361E08893000AD0E8B /* galois.cpp in Sources */, + B39578E01E6D582300854D7A /* rom.cpp in Sources */, + B340E5371E08893000AD0E8B /* PSFLoader.cpp in Sources */, + B340E5381E08893000AD0E8B /* input.cpp in Sources */, + B340E5391E08893000AD0E8B /* res012.c in Sources */, + B340E53A1E08893000AD0E8B /* hes.cpp in Sources */, + B340E53B1E08893000AD0E8B /* sound.cpp in Sources */, + B340E53C1E08893000AD0E8B /* arcade_card.cpp in Sources */, + B340E53D1E08893000AD0E8B /* psx.cpp in Sources */, + B340E53E1E08893000AD0E8B /* c65c02.cpp in Sources */, + B340E53F1E08893000AD0E8B /* OwlResampler.cpp in Sources */, + B340E5401E08893000AD0E8B /* CDUtility.cpp in Sources */, + B340E5411E08893000AD0E8B /* huc6273.cpp in Sources */, + B340E5421E08893000AD0E8B /* crc32.cpp in Sources */, + B39578FA1E6D583C00854D7A /* TLCS900h_registers.cpp in Sources */, + B340E5431E08893000AD0E8B /* sio.cpp in Sources */, + B340E5451E08893000AD0E8B /* mapping0.c in Sources */, + B39578CE1E6D57FA00854D7A /* bios.cpp in Sources */, + B340E5461E08893000AD0E8B /* registry.c in Sources */, + B340E5471E08893000AD0E8B /* okiadpcm.cpp in Sources */, + B39579001E6D591E00854D7A /* z80_ops.cpp in Sources */, + B39578CF1E6D57FA00854D7A /* biosHLE.cpp in Sources */, + B340E5481E08893000AD0E8B /* mpc_demux.c in Sources */, + B340E5491E08893000AD0E8B /* mdec.cpp in Sources */, + B340E54A1E08893000AD0E8B /* tcache.cpp in Sources */, + B340E54B1E08893000AD0E8B /* general.cpp in Sources */, + B340E54C1E08893000AD0E8B /* vsu.cpp in Sources */, + B340E54D1E08893000AD0E8B /* frontio.cpp in Sources */, + B39578F81E6D583C00854D7A /* TLCS900h_interpret_single.cpp in Sources */, + B340E54E1E08893000AD0E8B /* framing.c in Sources */, + B39578DC1E6D582300854D7A /* gfx.cpp in Sources */, + B340E54F1E08893000AD0E8B /* triostr.c in Sources */, + B340E5501E08893000AD0E8B /* png.cpp in Sources */, + B340E5511E08893000AD0E8B /* synthesis.c in Sources */, + B340E5521E08893000AD0E8B /* endian.cpp in Sources */, + B340E5531E08893000AD0E8B /* FileStream.cpp in Sources */, + B340E5541E08893000AD0E8B /* gpu.cpp in Sources */, + B340E5551E08893000AD0E8B /* synth_filter.c in Sources */, + B340E5561E08893000AD0E8B /* sha1.cpp in Sources */, + B340E5571E08893000AD0E8B /* MemoryStream.cpp in Sources */, + B39578D01E6D57FA00854D7A /* dma.cpp in Sources */, + B340E5581E08893000AD0E8B /* trio.c in Sources */, + B340E5591E08893000AD0E8B /* vb.cpp in Sources */, + B340E55A1E08893000AD0E8B /* netplay.cpp in Sources */, + B340E55B1E08893000AD0E8B /* debug.cpp in Sources */, + B340E55C1E08893000AD0E8B /* dualshock.cpp in Sources */, + B340E55D1E08893000AD0E8B /* mpc_decoder.c in Sources */, + B340E55E1E08893000AD0E8B /* mpc_bits_reader.c in Sources */, + B340E55F1E08893000AD0E8B /* v30mz.cpp in Sources */, + B340E5601E08893000AD0E8B /* rtc.cpp in Sources */, + B39578E11E6D582300854D7A /* rtc.cpp in Sources */, + B39578F91E6D583C00854D7A /* TLCS900h_interpret_src.cpp in Sources */, + B340E5611E08893000AD0E8B /* vip.cpp in Sources */, + B340E5621E08893000AD0E8B /* mempatcher.cpp in Sources */, + B340E5631E08893000AD0E8B /* irq.cpp in Sources */, + B340E5641E08893000AD0E8B /* dis.cpp in Sources */, + B340E5651E08893000AD0E8B /* spu.cpp in Sources */, + B340E5661E08893000AD0E8B /* thread.cpp in Sources */, + B340E5671E08893000AD0E8B /* dis_groups.cpp in Sources */, + B340E5681E08893000AD0E8B /* memory.cpp in Sources */, + B340E5691E08893000AD0E8B /* qtrecord.cpp in Sources */, + B340E56A1E08893000AD0E8B /* streaminfo.c in Sources */, + B340E56B1E08893000AD0E8B /* mednafen.cpp in Sources */, + B340E56C1E08893000AD0E8B /* Fir_Resampler.cpp in Sources */, + B340E56D1E08893000AD0E8B /* sharedbook.c in Sources */, + B340E56E1E08893000AD0E8B /* Stream.cpp in Sources */, + B340E56F1E08893000AD0E8B /* gpu_line.cpp in Sources */, + B340E5701E08893000AD0E8B /* crc32.c in Sources */, + B340E5711E08893000AD0E8B /* movie.cpp in Sources */, + B340E5721E08893000AD0E8B /* CDAccess_Image.cpp in Sources */, + B340E5731E08893000AD0E8B /* gte.cpp in Sources */, + B340E5741E08893000AD0E8B /* guncon.cpp in Sources */, + B340E5751E08893000AD0E8B /* v810_fp_ops.cpp in Sources */, + B340E5761E08893000AD0E8B /* system.cpp in Sources */, + B340E5771E08893000AD0E8B /* text.cpp in Sources */, + B340E5781E08893000AD0E8B /* ConvertUTF.cpp in Sources */, + B340E5791E08893000AD0E8B /* z80.cpp in Sources */, + B340E57A1E08893000AD0E8B /* file.cpp in Sources */, + B340E57B1E08893000AD0E8B /* huc6280.cpp in Sources */, + B340E57C1E08893000AD0E8B /* CDAccess.cpp in Sources */, + B340E57D1E08893000AD0E8B /* justifier.cpp in Sources */, + B39578FC1E6D585D00854D7A /* Z80_interface.cpp in Sources */, + B340E57E1E08893000AD0E8B /* CDAFReader.cpp in Sources */, + B340E57F1E08893000AD0E8B /* mouse.cpp in Sources */, + B340E5801E08893000AD0E8B /* codebook.c in Sources */, + B340E5811E08893000AD0E8B /* stubs.cpp in Sources */, + B340E5821E08893000AD0E8B /* player.cpp in Sources */, + B340E5831E08893000AD0E8B /* l-ec.cpp in Sources */, + B340E5841E08893000AD0E8B /* settings.cpp in Sources */, + B340E5851E08893000AD0E8B /* trionan.c in Sources */, + B340E5861E08893000AD0E8B /* huffman.c in Sources */, + B340E5871E08893000AD0E8B /* bitwise.c in Sources */, + B340E5881E08893000AD0E8B /* md5.cpp in Sources */, + B340E5891E08893000AD0E8B /* tblur.cpp in Sources */, + B340E58A1E08893000AD0E8B /* vorbisfile.c in Sources */, + B340E58B1E08893000AD0E8B /* minilzo.c in Sources */, + B340E58C1E08893000AD0E8B /* pcecd.cpp in Sources */, + B340E58D1E08893000AD0E8B /* cpu.cpp in Sources */, + B340E58E1E08893000AD0E8B /* mouse.cpp in Sources */, + B39578DE1E6D582300854D7A /* interrupt.cpp in Sources */, + B39578FE1E6D58FF00854D7A /* gfx_scanline_mono.cpp in Sources */, + B39578F31E6D583C00854D7A /* TLCS900h_disassemble_reg.cpp in Sources */, + B39578F21E6D583C00854D7A /* TLCS900h_disassemble_extra.cpp in Sources */, + B340E58F1E08893000AD0E8B /* requant.c in Sources */, + B340E5901E08893000AD0E8B /* git.cpp in Sources */, + B340E5911E08893000AD0E8B /* surface.cpp in Sources */, + B340E5921E08893000AD0E8B /* Deinterlacer.cpp in Sources */, + B340E5931E08893000AD0E8B /* gfx.cpp in Sources */, + B39578DF1E6D582300854D7A /* mem.cpp in Sources */, + B340E5941E08893000AD0E8B /* fxscsi.cpp in Sources */, + B340E5951E08893000AD0E8B /* gpu_sprite.cpp in Sources */, + B340E5961E08893000AD0E8B /* trim.cpp in Sources */, + B340E5971E08893000AD0E8B /* input.cpp in Sources */, + B340E5981E08893000AD0E8B /* multitap.cpp in Sources */, + B340E5991E08893000AD0E8B /* memmap.cpp in Sources */, + B340E59A1E08893000AD0E8B /* state_rewind.cpp in Sources */, + B340E59B1E08893000AD0E8B /* cart.cpp in Sources */, + B340E59C1E08893000AD0E8B /* ram.cpp in Sources */, + B340E59D1E08893000AD0E8B /* mikie.cpp in Sources */, + B340E59E1E08893000AD0E8B /* interrupt.cpp in Sources */, + B340E59F1E08893000AD0E8B /* syntax.cpp in Sources */, + B340E5A01E08893000AD0E8B /* mouse.cpp in Sources */, + B340E5A11E08893000AD0E8B /* lec.cpp in Sources */, + B340E5A21E08893000AD0E8B /* dis_decode.cpp in Sources */, + B340E5A31E08893000AD0E8B /* interrupt.cpp in Sources */, + B340E5A41E08893000AD0E8B /* dma.cpp in Sources */, + B340E5A51E08893000AD0E8B /* tests.cpp in Sources */, + B340E5A61E08893000AD0E8B /* cdc.cpp in Sources */, + B340E5A71E08893000AD0E8B /* dualanalog.cpp in Sources */, + B340E5A81E08893000AD0E8B /* huc.cpp in Sources */, + B340E5A91E08893000AD0E8B /* memory.cpp in Sources */, + B340E5AA1E08893000AD0E8B /* cdplay.cpp in Sources */, + B340E5AB1E08893000AD0E8B /* eeprom.cpp in Sources */, + B340E5AC1E08893000AD0E8B /* vce.cpp in Sources */, + B340E5AD1E08893000AD0E8B /* window.c in Sources */, + B340E5AE1E08893000AD0E8B /* quicklz.c in Sources */, + B39578F61E6D583C00854D7A /* TLCS900h_interpret_dst.cpp in Sources */, + B39578F41E6D583C00854D7A /* TLCS900h_disassemble_src.cpp in Sources */, + B340E5AF1E08893000AD0E8B /* CDAFReader_MPC.cpp in Sources */, + B340E5B01E08893000AD0E8B /* timer.cpp in Sources */, + B340E5B11E08893000AD0E8B /* Blip_Buffer.cpp in Sources */, + B340E5B21E08893000AD0E8B /* tsushinkb.cpp in Sources */, + B340E5B31E08893000AD0E8B /* mcgenjin.cpp in Sources */, + B340E5B41E08893000AD0E8B /* pcfx.cpp in Sources */, + B340E5B51E08893000AD0E8B /* gpu_polygon.cpp in Sources */, + B340E5B61E08893000AD0E8B /* gamepad.cpp in Sources */, + B340E5B71E08893000AD0E8B /* vdc.cpp in Sources */, + B340E5B81E08893000AD0E8B /* rainbow.cpp in Sources */, + B340E5B91E08893000AD0E8B /* timer.cpp in Sources */, + B340E5BA1E08893000AD0E8B /* GZFileStream.cpp in Sources */, + B340E5BB1E08893000AD0E8B /* IPSPatcher.cpp in Sources */, + B340E5BC1E08893000AD0E8B /* rom.cpp in Sources */, + B39578F51E6D583C00854D7A /* TLCS900h_interpret.cpp in Sources */, + B39578F01E6D583C00854D7A /* TLCS900h_disassemble.cpp in Sources */, + B340E5BD1E08893000AD0E8B /* unzip.c in Sources */, + B340E5BE1E08893000AD0E8B /* resample.c in Sources */, + B340E5BF1E08893000AD0E8B /* cdromif.cpp in Sources */, + B340E5C01E08893000AD0E8B /* comm.cpp in Sources */, + B340E5C11E08893000AD0E8B /* error.cpp in Sources */, + B340E5C21E08893000AD0E8B /* pce.cpp in Sources */, + B340E5C31E08893000AD0E8B /* info.c in Sources */, + B340E5C41E08893000AD0E8B /* king.cpp in Sources */, + B340E5C51E08893000AD0E8B /* resize.cpp in Sources */, + B340E5C61E08893000AD0E8B /* v810_cpu.cpp in Sources */, + B340E5C71E08893000AD0E8B /* WAVRecord.cpp in Sources */, + B340E5C81E08893000AD0E8B /* block.c in Sources */, + B340E5C91E08893000AD0E8B /* memcard.cpp in Sources */, + B340E5CA1E08893000AD0E8B /* gamepad.cpp in Sources */, + B39578E21E6D582300854D7A /* sound.cpp in Sources */, + B340E5CB1E08893000AD0E8B /* pce_psg.cpp in Sources */, + B340E5CC1E08893000AD0E8B /* state.cpp in Sources */, + B39578CA1E6D57DE00854D7A /* neopop.cpp in Sources */, + B340E5CD1E08893000AD0E8B /* timer.cpp in Sources */, + B340E5CE1E08893000AD0E8B /* CDAFReader_Vorbis.cpp in Sources */, + B340E5CF1E08893000AD0E8B /* floor0.c in Sources */, + B39578F11E6D583C00854D7A /* TLCS900h_disassemble_dst.cpp in Sources */, + B340E5D01E08893000AD0E8B /* ioapi.c in Sources */, + B340E5D11E08893000AD0E8B /* mdct.c in Sources */, + B39578DB1E6D582300854D7A /* flash.cpp in Sources */, + B340E5D21E08893000AD0E8B /* CDAccess_CCD.cpp in Sources */, + B39578DD1E6D582300854D7A /* gfx_scanline_colour.cpp in Sources */, + B340E5D31E08893000AD0E8B /* recover-raw.cpp in Sources */, + B340E5D41E08893000AD0E8B /* scsicd.cpp in Sources */, + B340E5D51E08893000AD0E8B /* tsushin.cpp in Sources */, + B340E5D61E08893000AD0E8B /* font-data.cpp in Sources */, + B340E5D71E08893000AD0E8B /* floor1.c in Sources */, + B340E5D81E08893000AD0E8B /* main.cpp in Sources */, + B340E5D91E08893000AD0E8B /* susie.cpp in Sources */, + B340E5DA1E08893000AD0E8B /* jrevdct.cpp in Sources */, + B340E5DB1E08893000AD0E8B /* gamepad.cpp in Sources */, + B340E5DC1E08893000AD0E8B /* escape.cpp in Sources */, + B340E5DD1E08893000AD0E8B /* input.cpp in Sources */, + B340E5DE1E08893000AD0E8B /* resolve.cpp in Sources */, + B340E5DF1E08893000AD0E8B /* Stereo_Buffer.cpp in Sources */, + B340E5E01E08893000AD0E8B /* cputest.c in Sources */, + B340E5E21E08893000AD0E8B /* demo.cpp in Sources */, + B39578F71E6D583C00854D7A /* TLCS900h_interpret_reg.cpp in Sources */, + B340E5E31E08893000AD0E8B /* sha256.cpp in Sources */, + B340E5E41E08893000AD0E8B /* primitives.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C167EFE841241C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1DEB913F08733D840010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_EXPERIMENTAL = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; + GCC_OPTIMIZATION_LEVEL = 1; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LLVM_LTO = NO; + MACOSX_DEPLOYMENT_TARGET = 10.11; + SDKROOT = macosx; + }; + name = Debug; + }; + 1DEB914008733D840010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_EXPERIMENTAL = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_INCREASE_PRECOMPILED_HEADER_SHARING = YES; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LLVM_LTO = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + SDKROOT = macosx; + }; + name = Release; + }; + B340E4681E08887700AD0E8B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_TESTABILITY = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + LSB_FIRST, + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/include\"", + "\"$(SRCROOT)/mednafen/hw_cpu\"", + "\"$(SRCROOT)/mednafen/hw_misc\"", + "\"$(SRCROOT)/mednafen/hw_sound\"", + "\"$(SRCROOT)/mednafen/hw_video\"", + "\"$(SRCROOT)/libsndfile\"", + ); + INFOPLIST_FILE = PVMednafen/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/libsndfile", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-fwrapv", + "-DHAVE_MKDIR", + "-DSIZEOF_DOUBLE=8", + "-DMEDNAFEN_VERSION=\\\"0.9.38.7\\\"", + "-DPACKAGE=\\\"mednafen\\\"", + "-DMEDNAFEN_VERSION_NUMERIC=0x000938", + "-DPSS_STYLE=1", + "-DMPC_FIXED_POINT", + "-DARCH_ARM", + "-DWANT_NGP_EMU", + "-DWANT_LYNX_EMU", + "-DWANT_PCE_EMU", + "-DWANT_PCFX_EMU", + "-DWANT_PSX_EMU", + "-DWANT_VB_EMU", + "-DWANT_WSWAN_EMU", + "-DSTDC_HEADERS", + "-DICONV_CONST=", + "-DLSB_FIRST", + "-D__STDC_LIMIT_MACROS", + "-DSIZEOF_CHAR=1", + "-DSIZEOF_SHORT=2", + "-DSIZEOF_INT=4", + "-DSIZEOF_LONG=8", + "-DSIZEOF_LONG_LONG=8", + "-DSIZEOF_OFF_T=8", + "-mllvm", + "-disable-lsr", + ); + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVMednafen; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B340E4691E08887700AD0E8B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + LSB_FIRST, + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/include\"", + "\"$(SRCROOT)/mednafen/hw_cpu\"", + "\"$(SRCROOT)/mednafen/hw_misc\"", + "\"$(SRCROOT)/mednafen/hw_sound\"", + "\"$(SRCROOT)/mednafen/hw_video\"", + "\"$(SRCROOT)/libsndfile\"", + ); + INFOPLIST_FILE = PVMednafen/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/libsndfile", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-fwrapv", + "-DHAVE_MKDIR", + "-DSIZEOF_DOUBLE=8", + "-DMEDNAFEN_VERSION=\\\"0.9.38.7\\\"", + "-DPACKAGE=\\\"mednafen\\\"", + "-DMEDNAFEN_VERSION_NUMERIC=0x000938", + "-DPSS_STYLE=1", + "-DMPC_FIXED_POINT", + "-DARCH_ARM", + "-DWANT_NGP_EMU", + "-DWANT_LYNX_EMU", + "-DWANT_PCE_EMU", + "-DWANT_PCFX_EMU", + "-DWANT_PSX_EMU", + "-DWANT_VB_EMU", + "-DWANT_WSWAN_EMU", + "-DSTDC_HEADERS", + "-DICONV_CONST=", + "-DLSB_FIRST", + "-D__STDC_LIMIT_MACROS", + "-DSIZEOF_CHAR=1", + "-DSIZEOF_SHORT=2", + "-DSIZEOF_INT=4", + "-DSIZEOF_LONG=8", + "-DSIZEOF_LONG_LONG=8", + "-DSIZEOF_OFF_T=8", + "-mllvm", + "-disable-lsr", + ); + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVMednafen; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B340E4751E08888700AD0E8B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_TESTABILITY = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + LSB_FIRST, + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/include\"", + "\"$(SRCROOT)/mednafen/hw_cpu\"", + "\"$(SRCROOT)/mednafen/hw_misc\"", + "\"$(SRCROOT)/mednafen/hw_sound\"", + "\"$(SRCROOT)/mednafen/hw_video\"", + "\"$(SRCROOT)/libsndfile\"", + ); + INFOPLIST_FILE = "$(SRCROOT)/PVMednafen/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/libsndfile", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "$(inherited)", + "-fwrapv", + "-DHAVE_MKDIR", + "-DSIZEOF_DOUBLE=8", + "-DMEDNAFEN_VERSION=\\\"0.9.38.7\\\"", + "-DPACKAGE=\\\"mednafen\\\"", + "-DMEDNAFEN_VERSION_NUMERIC=0x000938", + "-DPSS_STYLE=1", + "-DMPC_FIXED_POINT", + "-DARCH_ARM", + "-DWANT_LYNX_EMU", + "-DWANT_NGP_EMU", + "-DWANT_PCE_EMU", + "-DWANT_PCFX_EMU", + "-DWANT_PSX_EMU", + "-DWANT_VB_EMU", + "-DWANT_WSWAN_EMU", + "-DSTDC_HEADERS", + "-DICONV_CONST=", + "-DLSB_FIRST", + "-D__STDC_LIMIT_MACROS", + "-DSIZEOF_CHAR=1", + "-DSIZEOF_SHORT=2", + "-DSIZEOF_INT=4", + "-DSIZEOF_LONG=8", + "-DSIZEOF_LONG_LONG=8", + "-DSIZEOF_OFF_T=8", + "-mllvm", + "-disable-lsr", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVMednafen; + PRODUCT_NAME = PVMednafen; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B340E4761E08888700AD0E8B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + LSB_FIRST, + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)\"", + "\"$(SRCROOT)/include\"", + "\"$(SRCROOT)/mednafen/hw_cpu\"", + "\"$(SRCROOT)/mednafen/hw_misc\"", + "\"$(SRCROOT)/mednafen/hw_sound\"", + "\"$(SRCROOT)/mednafen/hw_video\"", + "\"$(SRCROOT)/libsndfile\"", + ); + INFOPLIST_FILE = "$(SRCROOT)/PVMednafen/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/libsndfile", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = ( + "$(inherited)", + "-fwrapv", + "-DHAVE_MKDIR", + "-DSIZEOF_DOUBLE=8", + "-DMEDNAFEN_VERSION=\\\"0.9.38.7\\\"", + "-DPACKAGE=\\\"mednafen\\\"", + "-DMEDNAFEN_VERSION_NUMERIC=0x000938", + "-DPSS_STYLE=1", + "-DMPC_FIXED_POINT", + "-DARCH_ARM", + "-DWANT_LYNX_EMU", + "-DWANT_NGP_EMU", + "-DWANT_PCE_EMU", + "-DWANT_PCFX_EMU", + "-DWANT_PSX_EMU", + "-DWANT_VB_EMU", + "-DWANT_WSWAN_EMU", + "-DSTDC_HEADERS", + "-DICONV_CONST=", + "-DLSB_FIRST", + "-D__STDC_LIMIT_MACROS", + "-DSIZEOF_CHAR=1", + "-DSIZEOF_SHORT=2", + "-DSIZEOF_INT=4", + "-DSIZEOF_LONG=8", + "-DSIZEOF_LONG_LONG=8", + "-DSIZEOF_OFF_T=8", + "-mllvm", + "-disable-lsr", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVMednafen; + PRODUCT_NAME = PVMednafen; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 10.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "PVMednafen" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB913F08733D840010E9CD /* Debug */, + 1DEB914008733D840010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B340E4671E08887700AD0E8B /* Build configuration list for PBXNativeTarget "PVMednafen" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B340E4681E08887700AD0E8B /* Debug */, + B340E4691E08887700AD0E8B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B340E4741E08888700AD0E8B /* Build configuration list for PBXNativeTarget "PVMednafen tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B340E4751E08888700AD0E8B /* Debug */, + B340E4761E08888700AD0E8B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 089C1669FE841209C02AAC07 /* Project object */; +} diff --git a/Mednafen/PVMednafen.xcodeproj/xcshareddata/xcschemes/PVMednafen tvOS.xcscheme b/Mednafen/PVMednafen.xcodeproj/xcshareddata/xcschemes/PVMednafen tvOS.xcscheme new file mode 100644 index 0000000000..c739650e4d --- /dev/null +++ b/Mednafen/PVMednafen.xcodeproj/xcshareddata/xcschemes/PVMednafen tvOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mednafen/PVMednafen.xcodeproj/xcshareddata/xcschemes/PVMednafen.xcscheme b/Mednafen/PVMednafen.xcodeproj/xcshareddata/xcschemes/PVMednafen.xcscheme new file mode 100644 index 0000000000..4f9be3e202 --- /dev/null +++ b/Mednafen/PVMednafen.xcodeproj/xcshareddata/xcschemes/PVMednafen.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mednafen/PVMednafen/Info.plist b/Mednafen/PVMednafen/Info.plist new file mode 100644 index 0000000000..fbe1e6b314 --- /dev/null +++ b/Mednafen/PVMednafen/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Mednafen/PVMednafen/PVMednafen.h b/Mednafen/PVMednafen/PVMednafen.h new file mode 100644 index 0000000000..a8e4d76d43 --- /dev/null +++ b/Mednafen/PVMednafen/PVMednafen.h @@ -0,0 +1,19 @@ +// +// PVMednafen.h +// PVMednafen +// +// Created by Mattiello, Joseph R on 12/19/16. +// +// + +#import + +//! Project version number for PVMednafen. +FOUNDATION_EXPORT double PVMednafenVersionNumber; + +//! Project version string for PVMednafen. +FOUNDATION_EXPORT const unsigned char PVMednafenVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import +#import + diff --git a/Mednafen/include/trio/CHANGES b/Mednafen/include/trio/CHANGES new file mode 120000 index 0000000000..5fe5890cf3 --- /dev/null +++ b/Mednafen/include/trio/CHANGES @@ -0,0 +1 @@ +../../src/trio/CHANGES \ No newline at end of file diff --git a/Mednafen/include/trio/MEDNAFEN-MODIFICATIONS b/Mednafen/include/trio/MEDNAFEN-MODIFICATIONS new file mode 100644 index 0000000000..d58bb46ec6 --- /dev/null +++ b/Mednafen/include/trio/MEDNAFEN-MODIFICATIONS @@ -0,0 +1,74 @@ +diff -rupN trio.orig/triodef.h trio/triodef.h +--- trio.orig/triodef.h 2014-05-19 17:04:22.000000000 -0700 ++++ trio/triodef.h 2014-05-19 17:07:02.000000000 -0700 +@@ -264,6 +264,12 @@ typedef void * trio_pointer_t; + # define TRIO_VA_END(x) va_end(x) + #endif + ++#if defined(TRIO_COMPILER_GCC) ++ #define TRIO_FORMATSTR(a,b,c) __attribute__ ((format (a, b, c))) ++#else ++ #define TRIO_FORMATSTR(a,b,c) ++#endif ++ + #if defined(PREDEF_STANDARD_C99) || defined(PREDEF_STANDARD_CXX) + # define TRIO_INLINE inline + #else +diff -rupN trio.orig/trio.h trio/trio.h +--- trio.orig/trio.h 2014-05-19 17:04:22.000000000 -0700 ++++ trio/trio.h 2014-05-19 17:04:55.000000000 -0700 +@@ -71,45 +71,45 @@ TRIO_CONST char *trio_strerror TRIO_PROT + * Print Functions + */ + +-int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)); ++int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 1, 2); + int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); + int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); + +-int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)); ++int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); + int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); + int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); + +-int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)); ++int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); + int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); + int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); + + int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, +- TRIO_CONST char *format, ...)); ++ TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 3, 4); + int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, va_list args)); + int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, void **args)); + +-int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)); ++int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); + int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); + int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); + +-int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); ++int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 3, 4); + int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + va_list args)); + int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + void **args)); + +-int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)); ++int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 3, 4); + int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + va_list args)); + + #if defined(TRIO_DEPRECATED) +-char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)); ++char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 1, 2); + char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); + #endif + +-int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)); ++int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); + int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); + int trio_asprintfv TRIO_PROTO((char **result, TRIO_CONST char *format, trio_pointer_t * args)); + diff --git a/Mednafen/include/trio/trio.h b/Mednafen/include/trio/trio.h new file mode 100644 index 0000000000..d48e6f969f --- /dev/null +++ b/Mednafen/include/trio/trio.h @@ -0,0 +1,235 @@ +/************************************************************************* + * + * $Id: trio.h,v 1.19 2009/09/13 10:12:22 breese Exp $ + * + * Copyright (C) 1998 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************* + * + * http://ctrio.sourceforge.net/ + * + ************************************************************************/ + +#ifndef TRIO_TRIO_H +#define TRIO_TRIO_H + +#if !defined(WITHOUT_TRIO) + +/* + * Use autoconf defines if present. Packages using trio must define + * HAVE_CONFIG_H as a compiler option themselves. + */ +#if defined(HAVE_CONFIG_H) +# include +#endif + +#include "triop.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Error codes. + * + * Remember to add a textual description to trio_strerror. + */ +enum { + TRIO_EOF = 1, + TRIO_EINVAL = 2, + TRIO_ETOOMANY = 3, + TRIO_EDBLREF = 4, + TRIO_EGAP = 5, + TRIO_ENOMEM = 6, + TRIO_ERANGE = 7, + TRIO_ERRNO = 8, + TRIO_ECUSTOM = 9 +}; + +/* Error macros */ +#define TRIO_ERROR_CODE(x) ((-(x)) & 0x00FF) +#define TRIO_ERROR_POSITION(x) ((-(x)) >> 8) +#define TRIO_ERROR_NAME(x) trio_strerror(x) + +typedef int (*trio_outstream_t) TRIO_PROTO((trio_pointer_t, int)); +typedef int (*trio_instream_t) TRIO_PROTO((trio_pointer_t)); + +TRIO_CONST char *trio_strerror TRIO_PROTO((int)); + +/************************************************************************* + * Print Functions + */ + +int trio_printf TRIO_PROTO((TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 1, 2); +int trio_vprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); +int trio_printfv TRIO_PROTO((TRIO_CONST char *format, void **args)); + +int trio_fprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); +int trio_vfprintf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); +int trio_fprintfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); + +int trio_dprintf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); +int trio_vdprintf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); +int trio_dprintfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); + +int trio_cprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 3, 4); +int trio_vcprintf TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, va_list args)); +int trio_cprintfv TRIO_PROTO((trio_outstream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, void **args)); + +int trio_sprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); +int trio_vsprintf TRIO_PROTO((char *buffer, TRIO_CONST char *format, va_list args)); +int trio_sprintfv TRIO_PROTO((char *buffer, TRIO_CONST char *format, void **args)); + +int trio_snprintf TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 3, 4); +int trio_vsnprintf TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + va_list args)); +int trio_snprintfv TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + void **args)); + +int trio_snprintfcat TRIO_PROTO((char *buffer, size_t max, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 3, 4); +int trio_vsnprintfcat TRIO_PROTO((char *buffer, size_t bufferSize, TRIO_CONST char *format, + va_list args)); + +#if defined(TRIO_DEPRECATED) +char *trio_aprintf TRIO_PROTO((TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 1, 2); +char *trio_vaprintf TRIO_PROTO((TRIO_CONST char *format, va_list args)); +#endif + +int trio_asprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_printf, 2, 3); +int trio_vasprintf TRIO_PROTO((char **ret, TRIO_CONST char *format, va_list args)); +int trio_asprintfv TRIO_PROTO((char **result, TRIO_CONST char *format, trio_pointer_t * args)); + +/************************************************************************* + * Scan Functions + */ +int trio_scanf TRIO_PROTO((TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_scanf, 1, 2); +int trio_vscanf TRIO_PROTO((TRIO_CONST char *format, va_list args)); +int trio_scanfv TRIO_PROTO((TRIO_CONST char *format, void **args)); + +int trio_fscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_scanf, 2, 3); +int trio_vfscanf TRIO_PROTO((FILE *file, TRIO_CONST char *format, va_list args)); +int trio_fscanfv TRIO_PROTO((FILE *file, TRIO_CONST char *format, void **args)); + +int trio_dscanf TRIO_PROTO((int fd, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_scanf, 2, 3); +int trio_vdscanf TRIO_PROTO((int fd, TRIO_CONST char *format, va_list args)); +int trio_dscanfv TRIO_PROTO((int fd, TRIO_CONST char *format, void **args)); + +int trio_cscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, ...)); +int trio_vcscanf TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, va_list args)); +int trio_cscanfv TRIO_PROTO((trio_instream_t stream, trio_pointer_t closure, + TRIO_CONST char *format, void **args)); + +int trio_sscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, ...)) TRIO_FORMATSTR(gnu_scanf, 2, 3); +int trio_vsscanf TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, va_list args)); +int trio_sscanfv TRIO_PROTO((TRIO_CONST char *buffer, TRIO_CONST char *format, void **args)); + +/************************************************************************* + * Locale Functions + */ +void trio_locale_set_decimal_point TRIO_PROTO((char *decimalPoint)); +void trio_locale_set_thousand_separator TRIO_PROTO((char *thousandSeparator)); +void trio_locale_set_grouping TRIO_PROTO((char *grouping)); + +/************************************************************************* + * Renaming + */ +#ifdef TRIO_REPLACE_STDIO +/* Replace the functions */ +#ifndef HAVE_PRINTF +# undef printf +# define printf trio_printf +#endif +#ifndef HAVE_VPRINTF +# undef vprintf +# define vprintf trio_vprintf +#endif +#ifndef HAVE_FPRINTF +# undef fprintf +# define fprintf trio_fprintf +#endif +#ifndef HAVE_VFPRINTF +# undef vfprintf +# define vfprintf trio_vfprintf +#endif +#ifndef HAVE_SPRINTF +# undef sprintf +# define sprintf trio_sprintf +#endif +#ifndef HAVE_VSPRINTF +# undef vsprintf +# define vsprintf trio_vsprintf +#endif +#ifndef HAVE_SNPRINTF +# undef snprintf +# define snprintf trio_snprintf +#endif +#ifndef HAVE_VSNPRINTF +# undef vsnprintf +# define vsnprintf trio_vsnprintf +#endif +#ifndef HAVE_SCANF +# undef scanf +# define scanf trio_scanf +#endif +#ifndef HAVE_VSCANF +# undef vscanf +# define vscanf trio_vscanf +#endif +#ifndef HAVE_FSCANF +# undef fscanf +# define fscanf trio_fscanf +#endif +#ifndef HAVE_VFSCANF +# undef vfscanf +# define vfscanf trio_vfscanf +#endif +#ifndef HAVE_SSCANF +# undef sscanf +# define sscanf trio_sscanf +#endif +#ifndef HAVE_VSSCANF +# undef vsscanf +# define vsscanf trio_vsscanf +#endif +/* These aren't stdio functions, but we make them look similar */ +#undef dprintf +#define dprintf trio_dprintf +#undef vdprintf +#define vdprintf trio_vdprintf +#undef aprintf +#define aprintf trio_aprintf +#undef vaprintf +#define vaprintf trio_vaprintf +#undef asprintf +#define asprintf trio_asprintf +#undef vasprintf +#define vasprintf trio_vasprintf +#undef dscanf +#define dscanf trio_dscanf +#undef vdscanf +#define vdscanf trio_vdscanf +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* WITHOUT_TRIO */ + +#endif /* TRIO_TRIO_H */ diff --git a/Mednafen/include/trio/triodef.h b/Mednafen/include/trio/triodef.h new file mode 100644 index 0000000000..0ec7c3cc35 --- /dev/null +++ b/Mednafen/include/trio/triodef.h @@ -0,0 +1,341 @@ +/************************************************************************* + * + * $Id: triodef.h,v 1.35 2009/09/20 11:37:14 breese Exp $ + * + * Copyright (C) 2001 Bjorn Reese + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +#ifndef TRIO_TRIODEF_H +#define TRIO_TRIODEF_H + +/************************************************************************* + * Compiler support detection + */ + +#if defined(__GNUC__) +# define TRIO_COMPILER_GCC +#endif + +#if defined(__SUNPRO_CC) +# define TRIO_COMPILER_SUNPRO __SUNPRO_CC +#else +# if defined(__SUNPRO_C) +# define TRIO_COMPILER_SUNPRO __SUNPRO_C +# endif +#endif + +#if defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__) +# define TRIO_COMPILER_XLC +#else +# if defined(_AIX) && !defined(__GNUC__) +# define TRIO_COMPILER_XLC /* Workaround for old xlc */ +# endif +#endif + +#if defined(__DECC) || defined(__DECCXX) +# define TRIO_COMPILER_DECC +#else +# if defined(__osf__) && defined(__LANGUAGE_C__) && !defined(__GNUC__) +# define TRIO_COMPILER_DECC /* Workaround for old DEC C compilers */ +# endif +#endif + +#if defined(__HP_aCC) || defined(__HP_cc) +# define TRIO_COMPILER_HP +#endif + +#if defined(sgi) || defined(__sgi) +# define TRIO_COMPILER_MIPSPRO +#endif + +#if defined(_MSC_VER) +# define TRIO_COMPILER_MSVC +#endif + +#if defined(__BORLANDC__) +# define TRIO_COMPILER_BCB +#endif + +/************************************************************************* + * Platform support detection + */ + +#if defined(VMS) || defined(__VMS) +# define TRIO_PLATFORM_VMS +#endif + +#if defined(unix) || defined(__unix) || defined(__unix__) +# define TRIO_PLATFORM_UNIX +#endif + +#if defined(TRIO_COMPILER_XLC) || defined(_AIX) +# define TRIO_PLATFORM_UNIX +#endif + +#if defined(TRIO_COMPILER_DECC) || defined(__osf___) +# if !defined(TRIO_PLATFORM_VMS) +# define TRIO_PLATFORM_UNIX +# endif +#endif + +#if defined(__NetBSD__) +# define TRIO_PLATFORM_UNIX +#endif + +#if defined(__Lynx__) +# define TRIO_PLATFORM_UNIX +# define TRIO_PLATFORM_LYNX +#endif + +#if defined(__APPLE__) && defined(__MACH__) +# define TRIO_PLATFORM_UNIX +#endif + +#if defined(__QNX__) +# define TRIO_PLATFORM_UNIX +# define TRIO_PLATFORM_QNX +#endif + +#if defined(__CYGWIN__) +# define TRIO_PLATFORM_UNIX +#endif + +#if defined(AMIGA) && defined(TRIO_COMPILER_GCC) +# define TRIO_PLATFORM_UNIX +#endif + +#if defined(TRIO_COMPILER_MSVC) || defined(WIN32) || defined(_WIN32) +# define TRIO_PLATFORM_WIN32 +#endif + +#if defined(_WIN32_WCE) +# define TRIO_PLATFORM_WINCE +#endif + +#if defined(mpeix) || defined(__mpexl) +# define TRIO_PLATFORM_MPEIX +#endif + +#if defined(_AIX) +# define TRIO_PLATFORM_AIX +#endif + +#if defined(__hpux) +# define TRIO_PLATFORM_HPUX +#endif + +#if defined(sun) || defined(__sun__) +# if defined(__SVR4) || defined(__svr4__) +# define TRIO_PLATFORM_SOLARIS +# else +# define TRIO_PLATFORM_SUNOS +# endif +#endif + +/************************************************************************* + * Standards support detection + */ + +#if defined(__STDC__) \ + || defined(_MSC_EXTENSIONS) \ + || defined(TRIO_COMPILER_BCB) +# define PREDEF_STANDARD_C89 +#endif +#if defined(__STDC_VERSION__) +# define PREDEF_STANDARD_C90 +#endif +#if (__STDC_VERSION__ - 0 >= 199409L) +# define PREDEF_STANDARD_C94 +#endif +#if (__STDC_VERSION__ - 0 >= 199901L) +# define PREDEF_STANDARD_C99 +#endif +#if defined(TRIO_COMPILER_SUNPRO) && (TRIO_COMPILER_SUNPRO >= 0x420) +# if !defined(PREDEF_STANDARD_C94) +# define PREDEF_STANDARD_C94 +# endif +#endif + +#if defined(__cplusplus) +# define PREDEF_STANDARD_CXX +#endif +#if __cplusplus - 0 >= 199711L +# define PREDEF_STANDARD_CXX89 +#endif + +#if defined(TRIO_PLATFORM_UNIX) +# include +#endif + +#if defined(_POSIX_VERSION) +# define PREDEF_STANDARD_POSIX _POSIX_VERSION +# if (_POSIX_VERSION >= 199506L) +# define PREDEF_STANDARD_POSIX_1996 +# endif +#endif + +#if (_XOPEN_VERSION - 0 >= 3) || defined(_XOPEN_XPG3) +# define PREDEF_STANDARD_XPG3 +#endif +#if (_XOPEN_VERSION - 0 >= 4) || defined(_XOPEN_XPG4) +# define PREDEF_STANDARD_XPG4 +#endif +#if (_XOPEN_VERSION - 0 > 4) \ + || (defined(_XOPEN_UNIX) && (_XOPEN_VERSION - 0 == 4)) +# define PREDEF_STANDARD_UNIX95 +#endif +#if (_XOPEN_VERSION - 0 >= 500) +# define PREDEF_STANDARD_UNIX98 +#endif +#if (_XOPEN_VERSION - 0 >= 600) +# define PREDEF_STANDARD_UNIX03 +#endif + +/************************************************************************* + * Generic defines + */ + +#if !defined(TRIO_PUBLIC) +# define TRIO_PUBLIC +#endif +#if !defined(TRIO_PRIVATE) +# define TRIO_PRIVATE static +#endif + +#if !(defined(PREDEF_STANDARD_C89) || defined(PREDEF_STANDARD_CXX)) +# define TRIO_COMPILER_ANCIENT +#endif + +#if defined(TRIO_COMPILER_ANCIENT) +# define TRIO_CONST +# define TRIO_VOLATILE +# define TRIO_SIGNED +typedef double trio_long_double_t; +typedef char * trio_pointer_t; +# define TRIO_SUFFIX_LONG(x) x +# define TRIO_PROTO(x) () +# define TRIO_NOARGS +# define TRIO_ARGS1(list,a1) list a1; +# define TRIO_ARGS2(list,a1,a2) list a1; a2; +# define TRIO_ARGS3(list,a1,a2,a3) list a1; a2; a3; +# define TRIO_ARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4; +# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5; +# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) list a1; a2; a3; a4; a5; a6; +# define TRIO_ARGS7(list,a1,a2,a3,a4,a5,a6,a7) list a1; a2; a3; a4; a5; a6; a7; +# define TRIO_VARGS2(list,a1,a2) list a1; a2 +# define TRIO_VARGS3(list,a1,a2,a3) list a1; a2; a3 +# define TRIO_VARGS4(list,a1,a2,a3,a4) list a1; a2; a3; a4 +# define TRIO_VARGS5(list,a1,a2,a3,a4,a5) list a1; a2; a3; a4; a5 +# define TRIO_VA_DECL va_dcl +# define TRIO_VA_START(x,y) va_start(x) +# define TRIO_VA_END(x) va_end(x) +#else /* ANSI C */ +# define TRIO_CONST const +# define TRIO_VOLATILE volatile +# define TRIO_SIGNED signed +typedef long double trio_long_double_t; +typedef void * trio_pointer_t; +# define TRIO_SUFFIX_LONG(x) x ## L +# define TRIO_PROTO(x) x +# define TRIO_NOARGS void +# define TRIO_ARGS1(list,a1) (a1) +# define TRIO_ARGS2(list,a1,a2) (a1,a2) +# define TRIO_ARGS3(list,a1,a2,a3) (a1,a2,a3) +# define TRIO_ARGS4(list,a1,a2,a3,a4) (a1,a2,a3,a4) +# define TRIO_ARGS5(list,a1,a2,a3,a4,a5) (a1,a2,a3,a4,a5) +# define TRIO_ARGS6(list,a1,a2,a3,a4,a5,a6) (a1,a2,a3,a4,a5,a6) +# define TRIO_ARGS7(list,a1,a2,a3,a4,a5,a6,a7) (a1,a2,a3,a4,a5,a6,a7) +# define TRIO_VARGS2 TRIO_ARGS2 +# define TRIO_VARGS3 TRIO_ARGS3 +# define TRIO_VARGS4 TRIO_ARGS4 +# define TRIO_VARGS5 TRIO_ARGS5 +# define TRIO_VA_DECL ... +# define TRIO_VA_START(x,y) va_start(x,y) +# define TRIO_VA_END(x) va_end(x) +#endif + +#if defined(TRIO_COMPILER_GCC) && !defined(__clang__) //(!defined(__clang__) || ((__clang_major__ * 1000) + __clang_minor__) >= 3005) + #define TRIO_FORMATSTR(a,b,c) __attribute__ ((format (a, b, c))) +#else + #define TRIO_FORMATSTR(a,b,c) +#endif + +#if defined(PREDEF_STANDARD_C99) || defined(PREDEF_STANDARD_CXX) +# define TRIO_INLINE inline +#else +# if defined(TRIO_COMPILER_GCC) +# define TRIO_INLINE __inline__ +# endif +# if defined(TRIO_COMPILER_MSVC) +# define TRIO_INLINE _inline +# endif +# if defined(TRIO_COMPILER_BCB) +# define TRIO_INLINE __inline +# endif +#endif +#if !defined(TRIO_INLINE) +# define TRIO_INLINE +#endif + +/************************************************************************* + * Workarounds + */ + +#if defined(TRIO_PLATFORM_VMS) +/* + * Computations done with constants at compile time can trigger these + * even when compiling with IEEE enabled. + */ +# pragma message disable (UNDERFLOW, FLOATOVERFL) + +# if (__CRTL_VER < 80210001) +/* + * Although the compiler supports C99 language constructs, the C + * run-time library does not contain all C99 functions. + */ +# if defined(PREDEF_STANDARD_C99) +# undef PREDEF_STANDARD_C99 +# endif +# endif +#endif + +/* + * Not all preprocessors supports the LL token. + */ +#if defined(TRIO_COMPILER_MSVC) || defined(TRIO_COMPILER_BCB) +#else +# define TRIO_COMPILER_SUPPORTS_LL +#endif + +#if defined(__CYGWIN__) +/* + * Cygwin defines the macros for hosted C99, but does not support certain + * long double math functions. + */ +# include +# define TRIO_CYGWIN_VERSION_API CYGWIN_VERSION_API_MAJOR * 1000 + \ + CYGWIN_VERSION_API_MINOR +/* + * Please change the version number below when the Cygwin API supports + * long double math functions (powl, fmodl, etc.) + */ +# if TRIO_CYGWIN_VERSION_API < 99999999 +# define TRIO_NO_FLOORL 1 +# define TRIO_NO_CEILL 1 +# define TRIO_NO_POWL 1 +# define TRIO_NO_FMODL 1 +# define TRIO_NO_LOG10L 1 +# endif +#endif + +#endif /* TRIO_TRIODEF_H */ diff --git a/Mednafen/include/trio/trionan.h b/Mednafen/include/trio/trionan.h new file mode 100644 index 0000000000..a38b1cc26f --- /dev/null +++ b/Mednafen/include/trio/trionan.h @@ -0,0 +1,183 @@ +/************************************************************************* + * + * $Id: trionan.h,v 1.9 2005/03/27 18:52:45 breese Exp $ + * + * Copyright (C) 2001 Bjorn Reese + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +#ifndef TRIO_TRIONAN_H +#define TRIO_TRIONAN_H + +#include "triodef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(TRIO_PUBLIC_NAN) +# if !defined(TRIO_PUBLIC) +# define TRIO_PUBLIC +# endif +# define TRIO_PUBLIC_NAN TRIO_PUBLIC +#endif + +enum { + TRIO_FP_INFINITE, + TRIO_FP_NAN, + TRIO_FP_NORMAL, + TRIO_FP_SUBNORMAL, + TRIO_FP_ZERO +}; + +/************************************************************************* + * Dependencies + */ + +#if defined(TRIO_EMBED_NAN) + +/* + * The application that trionan is embedded in must define which functions + * it uses. + * + * The following resolves internal dependencies. + */ + +# if defined(TRIO_FUNC_ISNAN) \ + || defined(TRIO_FUNC_ISINF) +# if !defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT) +# define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT +# endif +# endif + +# if defined(TRIO_FUNC_NAN) +# if !defined(TRIO_FUNC_PINF) +# define TRIO_FUNC_PINF +# endif +# endif + +# if defined(TRIO_FUNC_NINF) +# if !defined(TRIO_FUNC_PINF) +# define TRIO_FUNC_PINF +# endif +# endif + +#else + +/* + * When trionan is not embedded all all functions are defined. + */ + +# define TRIO_FUNC_NAN +# define TRIO_FUNC_PINF +# define TRIO_FUNC_NINF +# define TRIO_FUNC_NZERO +# define TRIO_FUNC_ISNAN +# define TRIO_FUNC_ISINF +# define TRIO_FUNC_ISFINITE +# define TRIO_FUNC_SIGNBIT +# define TRIO_FUNC_FPCLASSIFY +# define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT + +#endif + +/************************************************************************* + * Functions + */ + +/* + * Return NaN (Not-a-Number). + */ +#if defined(TRIO_FUNC_NAN) +TRIO_PUBLIC_NAN double +trio_nan +TRIO_PROTO((void)); +#endif + +/* + * Return positive infinity. + */ +#if defined(TRIO_FUNC_PINF) +TRIO_PUBLIC_NAN double +trio_pinf +TRIO_PROTO((void)); +#endif + +/* + * Return negative infinity. + */ +#if defined(TRIO_FUNC_NINF) +TRIO_PUBLIC_NAN double +trio_ninf +TRIO_PROTO((void)); +#endif + +/* + * Return negative zero. + */ +#if defined(TRIO_FUNC_NZERO) +TRIO_PUBLIC_NAN double +trio_nzero +TRIO_PROTO((TRIO_NOARGS)); +#endif + +/* + * If number is a NaN return non-zero, otherwise return zero. + */ +#if defined(TRIO_FUNC_ISNAN) +TRIO_PUBLIC_NAN int +trio_isnan +TRIO_PROTO((double number)); +#endif + +/* + * If number is positive infinity return 1, if number is negative + * infinity return -1, otherwise return 0. + */ +#if defined(TRIO_FUNC_ISINF) +TRIO_PUBLIC_NAN int +trio_isinf +TRIO_PROTO((double number)); +#endif + +/* + * If number is finite return non-zero, otherwise return zero. + */ +#if defined(TRIO_FUNC_ISFINITE) +TRIO_PUBLIC_NAN int +trio_isfinite +TRIO_PROTO((double number)); +#endif + +#if defined(TRIO_FUNC_SIGNBIT) +TRIO_PUBLIC_NAN int +trio_signbit +TRIO_PROTO((double number)); +#endif + +#if defined(TRIO_FUNC_FPCLASSIFY) +TRIO_PUBLIC_NAN int +trio_fpclassify +TRIO_PROTO((double number)); +#endif + +#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT) +TRIO_PUBLIC_NAN int +trio_fpclassify_and_signbit +TRIO_PROTO((double number, int *is_negative)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* TRIO_TRIONAN_H */ diff --git a/Mednafen/include/trio/triop.h b/Mednafen/include/trio/triop.h new file mode 100644 index 0000000000..86d29940ef --- /dev/null +++ b/Mednafen/include/trio/triop.h @@ -0,0 +1,473 @@ +/************************************************************************* + * + * $Id: triop.h,v 1.18 2009/07/05 10:14:07 breese Exp $ + * + * Copyright (C) 2000 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************ + * + * Private functions, types, etc. used for callback functions. + * + * The ref pointer is an opaque type and should remain as such. + * Private data must only be accessible through the getter and + * setter functions. + * + ************************************************************************/ + +#ifndef TRIO_TRIOP_H +#define TRIO_TRIOP_H + +#include "triodef.h" + +#include +#if defined(TRIO_COMPILER_ANCIENT) +# include +#else +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************* + * Supported standards + */ + +/* + * TRIO_C99 (=0 or =1) + * + * Define this to 0 to disable C99 format specifier extensions, or + * define to 1 to enable them. The format specifiers that are + * disabled by this switch are labelled with [C99] in the format + * specifier documentation. + */ +#if !defined(TRIO_C99) +# define TRIO_C99 1 +#endif + +/* + * TRIO_BSD (=0 or =1) + * + * Define this to 0 to disable BSD format specifier extensions, or + * define to 1 to enable them. The format specifiers that are + * disabled by this switch are labelled with [BSD] in the format + * specifier documentation. + */ +#if !defined(TRIO_BSD) +# define TRIO_BSD 1 +#endif + +/* + * TRIO_GNU (=0 or =1) + * + * Define this to 0 to disable GNU format specifier extensions, or + * define to 1 to enable them. The format specifiers that are + * disabled by this switch are labelled with [GNU] in the format + * specifier documentation. + */ +#if !defined(TRIO_GNU) +# define TRIO_GNU 1 +#endif + +/* + * TRIO_MISC (=0 or =1) + * + * Define this to 0 to disable miscellaneous format specifier + * extensions, or define to 1 to enable them. The format specifiers + * that are disabled by this switch are labelled with [MISC] in the + * format specifier documentation. + */ +#if !defined(TRIO_MISC) +# define TRIO_MISC 1 +#endif + +/* + * TRIO_UNIX98 (=0 or =1) + * + * Define this to 0 to disable UNIX98 format specifier extensions, + * or define to 1 to enable them. The format specifiers that are + * disabled by this switch are labelled with [UNIX98] in the format + * specifier documentation. + */ +#if !defined(TRIO_UNIX98) +# define TRIO_UNIX98 1 +#endif + +/* + * TRIO_MICROSOFT (=0 or =1) + * + * Define this to 0 to disable Microsoft Visual C format specifier + * extensions, or define to 1 to enable them. The format specifiers + * that are disabled by this switch are labelled with [MSVC] in the + * format specifier documentation. + */ +#if !defined(TRIO_MICROSOFT) +# define TRIO_MICROSOFT 1 +#endif + +/* + * TRIO_EXTENSION (=0 or =1) + * + * Define this to 0 to disable Trio-specific extensions, or define + * to 1 to enable them. This has two effects: it controls whether + * or not the Trio user-defined formating mechanism + * (trio_register() etc) is supported, and it enables or disables + * Trio's own format specifier extensions. The format specifiers + * that are disabled by this switch are labelled with [TRIO] in + * the format specifier documentation. + */ +#if !defined(TRIO_EXTENSION) +# define TRIO_EXTENSION 1 +#endif + +/* + * TRIO_DEPRECATED (=0 or =1) + * + * Define this to 0 to disable deprecated functionality, or define + * to 1 to enable them. + */ +#if !defined(TRIO_DEPRECATED) +# define TRIO_DEPRECATED 1 +#endif + +/************************************************************************* + * Features + */ + +#if defined(TRIO_SNPRINTF_ONLY) +# define TRIO_FEATURE_SCANF 0 +# define TRIO_FEATURE_FILE 0 +# define TRIO_FEATURE_STDIO 0 +# define TRIO_FEATURE_FD 0 +# define TRIO_FEATURE_DYNAMICSTRING 0 +# define TRIO_FEATURE_CLOSURE 0 +# define TRIO_FEATURE_STRERR 0 +# define TRIO_FEATURE_LOCALE 0 +# define TRIO_EMBED_NAN 1 +# define TRIO_EMBED_STRING 1 +#endif + +/* + * TRIO_FEATURE_SCANF (=0 or =1) + * + * Define this to 0 to disable all the scanf() variants, or define to 1 + * to enable them. + */ +#if !defined(TRIO_FEATURE_SCANF) +# define TRIO_FEATURE_SCANF 1 +#endif + +/* + * TRIO_FEATURE_FILE (=0 or =1) + * + * Define this to 0 to disable compilation of the trio_fprintf() and + * trio_fscanf() family of functions, or define to 1 to enable them. + * + * This may be useful on an embedded platform with no filesystem. + * Note that trio_printf() uses fwrite to write to stdout, so if you + * do not have an implementation of fwrite() at all then you must also + * define TRIO_FEATURE_STDIO to 0. + */ +#if !defined(TRIO_FEATURE_FILE) +# define TRIO_FEATURE_FILE 1 +#endif + +/* + * TRIO_FEATURE_STDIO (=0 or =1) + * + * Define this to 0 to disable compilation of the trio_printf() and + * trio_scanf() family of functions, or define to 1 to enable them. + * + * This may be useful on an embedded platform with no standard I/O. + */ +#if !defined(TRIO_FEATURE_STDIO) +# define TRIO_FEATURE_STDIO 1 +#endif + +/* + * TRIO_FEATURE_FD (=0 or =1) + * + * Define this to 0 to disable compilation of the trio_dprintf() and + * trio_dscanf() family of functions, or define to 1 to enable them. + * + * This may be useful on an embedded platform with no filesystem, or on + * a platform that supports file I/O using FILE* but not using raw file + * descriptors. + */ +#if !defined(TRIO_FEATURE_FD) +# define TRIO_FEATURE_FD 1 +#endif + +/* + * TRIO_FEATURE_DYNAMICSTRING (=0 or =1) + * + * Define this to 0 to disable compilation of the trio_aprintf() + * family of functions, or define to 1 to enable them. + * + * If you define both this and TRIO_MINIMAL to 0, then Trio will never + * call malloc or free. + */ +#if !defined(TRIO_FEATURE_DYNAMICSTRING) +# define TRIO_FEATURE_DYNAMICSTRING 1 +#endif + +/* + * TRIO_FEATURE_CLOSURE (=0 or =1) + * + * Define this to 0 to disable compilation of the trio_cprintf() and + * trio_cscanf() family of functions, or define to 1 to enable them. + * + * These functions are rarely needed. This saves a (small) amount of code. + */ +#if !defined(TRIO_FEATURE_CLOSURE) +# define TRIO_FEATURE_CLOSURE 1 +#endif + +/* + * TRIO_FEATURE_ERRORCODE (=0 or =1) + * + * Define this to 0 to return -1 from the print and scan function on + * error, or define to 1 to return a negative number with debugging + * information as part of the return code. + * + * If enabled, the return code will be a negative number, which encodes + * an error code and an error location. These can be decoded with the + * TRIO_ERROR_CODE and TRIO_ERROR_POSITION macros. + */ +#if defined(TRIO_ERRORS) +# define TRIO_FEATURE_ERRORCODE TRIO_ERRORS +#endif +#if !defined(TRIO_FEATURE_ERRORCODE) +# define TRIO_FEATURE_ERRORCODE 1 +#endif + +/* + * TRIO_FEATURE_STRERR (=0 or =1) + * + * Define this to 0 if you do not use trio_strerror(), or define to 1 if + * you do use it. + * + * This saves a (small) amount of code. + */ +#if !defined(TRIO_FEATURE_STRERR) +# define TRIO_FEATURE_STRERR 1 +#endif + +/* + * TRIO_FEATURE_FLOAT (=0 or =1) + * + * Define this to 0 to disable all floating-point support, or define + * to 1 to enable it. + * + * This is useful in restricted embedded platforms that do not support + * floating-point. Obviously you cannot use floating-point format + * specifiers if you define this. + * + * Do not compile trionan.c if you disable this. + */ +#if !defined(TRIO_FEATURE_FLOAT) +# define TRIO_FEATURE_FLOAT 1 +#endif + +/* + * TRIO_FEATURE_LOCALE (=0 or =1) + * + * Define this to 0 to disable customized locale support, or define + * to 1 to enable it. + * + * This saves a (small) amount of code. + */ +#if !defined(TRIO_FEATURE_LOCALE) +# define TRIO_FEATURE_LOCALE 1 +#endif + +/* + * TRIO_MINIMAL + * + * Define this to disable building the public trionan.h and triostr.h. + * If you define this, then you must not compile trionan.c and triostr.c + * separately. + */ +#if defined(TRIO_MINIMAL) +# if !defined(TRIO_EMBED_NAN) +# define TRIO_EMBED_NAN +# endif +# if !defined(TRIO_EMBED_STRING) +# define TRIO_EMBED_STRING +# endif +#endif + +/* Does not work yet. Do not enable */ +#ifndef TRIO_FEATURE_WIDECHAR +# define TRIO_FEATURE_WIDECHAR 0 +#endif + +/************************************************************************* + * Mapping standards to internal features + */ + +#if !defined(TRIO_FEATURE_HEXFLOAT) +# define TRIO_FEATURE_HEXFLOAT (TRIO_C99 && TRIO_FEATURE_FLOAT) +#endif + +#if !defined(TRIO_FEATURE_LONGDOUBLE) +# define TRIO_FEATURE_LONGDOUBLE TRIO_FEATURE_FLOAT +#endif + +#if !defined(TRIO_FEATURE_ERRNO) +# define TRIO_FEATURE_ERRNO TRIO_GNU +#endif + +#if !defined(TRIO_FEATURE_QUAD) +# define TRIO_FEATURE_QUAD (TRIO_BSD || TRIO_GNU) +#endif + +#if !defined(TRIO_FEATURE_SIZE_T) +# define TRIO_FEATURE_SIZE_T TRIO_C99 +#endif + +#if !defined(TRIO_FEATURE_SIZE_T_UPPER) +# define TRIO_FEATURE_SIZE_T_UPPER TRIO_GNU +#endif + +#if !defined(TRIO_FEATURE_PTRDIFF_T) +# define TRIO_FEATURE_PTRDIFF_T TRIO_C99 +#endif + +#if !defined(TRIO_FEATURE_INTMAX_T) +# define TRIO_FEATURE_INTMAX_T TRIO_C99 +#endif + +#if !defined(TRIO_FEATURE_FIXED_SIZE) +# define TRIO_FEATURE_FIXED_SIZE TRIO_MICROSOFT +#endif + +#if !defined(TRIO_FEATURE_POSITIONAL) +# define TRIO_FEATURE_POSITIONAL TRIO_UNIX98 +#endif + +#if !defined(TRIO_FEATURE_USER_DEFINED) +# define TRIO_FEATURE_USER_DEFINED TRIO_EXTENSION +#endif + +#if !defined(TRIO_FEATURE_BINARY) +# define TRIO_FEATURE_BINARY TRIO_EXTENSION +#endif + +#if !defined(TRIO_FEATURE_QUOTE) +# define TRIO_FEATURE_QUOTE TRIO_EXTENSION +#endif + +#if !defined(TRIO_FEATURE_STICKY) +# define TRIO_FEATURE_STICKY TRIO_EXTENSION +#endif + +#if !defined(TRIO_FEATURE_VARSIZE) +# define TRIO_FEATURE_VARSIZE TRIO_EXTENSION +#endif + +#if !defined(TRIO_FEATURE_ROUNDING) +# define TRIO_FEATURE_ROUNDING TRIO_EXTENSION +#endif + +/************************************************************************* + * Memory handling + */ +#ifndef TRIO_MALLOC +# define TRIO_MALLOC(n) malloc(n) +#endif +#ifndef TRIO_REALLOC +# define TRIO_REALLOC(x,n) realloc((x),(n)) +#endif +#ifndef TRIO_FREE +# define TRIO_FREE(x) free(x) +#endif + + +/************************************************************************* + * User-defined specifiers + */ + +typedef int (*trio_callback_t) TRIO_PROTO((trio_pointer_t)); + +trio_pointer_t trio_register TRIO_PROTO((trio_callback_t callback, const char *name)); +void trio_unregister TRIO_PROTO((trio_pointer_t handle)); + +TRIO_CONST char *trio_get_format TRIO_PROTO((trio_pointer_t ref)); +/* Mednafen modification to fix a gcc warning */ +/*TRIO_CONST*/ trio_pointer_t trio_get_argument TRIO_PROTO((trio_pointer_t ref)); + +/* Modifiers */ +int trio_get_width TRIO_PROTO((trio_pointer_t ref)); +void trio_set_width TRIO_PROTO((trio_pointer_t ref, int width)); +int trio_get_precision TRIO_PROTO((trio_pointer_t ref)); +void trio_set_precision TRIO_PROTO((trio_pointer_t ref, int precision)); +int trio_get_base TRIO_PROTO((trio_pointer_t ref)); +void trio_set_base TRIO_PROTO((trio_pointer_t ref, int base)); +int trio_get_padding TRIO_PROTO((trio_pointer_t ref)); +void trio_set_padding TRIO_PROTO((trio_pointer_t ref, int is_padding)); +int trio_get_short TRIO_PROTO((trio_pointer_t ref)); /* h */ +void trio_set_shortshort TRIO_PROTO((trio_pointer_t ref, int is_shortshort)); +int trio_get_shortshort TRIO_PROTO((trio_pointer_t ref)); /* hh */ +void trio_set_short TRIO_PROTO((trio_pointer_t ref, int is_short)); +int trio_get_long TRIO_PROTO((trio_pointer_t ref)); /* l */ +void trio_set_long TRIO_PROTO((trio_pointer_t ref, int is_long)); +int trio_get_longlong TRIO_PROTO((trio_pointer_t ref)); /* ll */ +void trio_set_longlong TRIO_PROTO((trio_pointer_t ref, int is_longlong)); +int trio_get_longdouble TRIO_PROTO((trio_pointer_t ref)); /* L */ +void trio_set_longdouble TRIO_PROTO((trio_pointer_t ref, int is_longdouble)); +int trio_get_alternative TRIO_PROTO((trio_pointer_t ref)); /* # */ +void trio_set_alternative TRIO_PROTO((trio_pointer_t ref, int is_alternative)); +int trio_get_alignment TRIO_PROTO((trio_pointer_t ref)); /* - */ +void trio_set_alignment TRIO_PROTO((trio_pointer_t ref, int is_leftaligned)); +int trio_get_spacing TRIO_PROTO((trio_pointer_t ref)); /* (space) */ +void trio_set_spacing TRIO_PROTO((trio_pointer_t ref, int is_space)); +int trio_get_sign TRIO_PROTO((trio_pointer_t ref)); /* + */ +void trio_set_sign TRIO_PROTO((trio_pointer_t ref, int is_showsign)); +#if TRIO_FEATURE_QUOTE +int trio_get_quote TRIO_PROTO((trio_pointer_t ref)); /* ' */ +void trio_set_quote TRIO_PROTO((trio_pointer_t ref, int is_quote)); +#endif +int trio_get_upper TRIO_PROTO((trio_pointer_t ref)); +void trio_set_upper TRIO_PROTO((trio_pointer_t ref, int is_upper)); +#if TRIO_FEATURE_INTMAX_T +int trio_get_largest TRIO_PROTO((trio_pointer_t ref)); /* j */ +void trio_set_largest TRIO_PROTO((trio_pointer_t ref, int is_largest)); +#endif +#if TRIO_FEATURE_PTRDIFF_T +int trio_get_ptrdiff TRIO_PROTO((trio_pointer_t ref)); /* t */ +void trio_set_ptrdiff TRIO_PROTO((trio_pointer_t ref, int is_ptrdiff)); +#endif +#if TRIO_FEATURE_SIZE_T +int trio_get_size TRIO_PROTO((trio_pointer_t ref)); /* z / Z */ +void trio_set_size TRIO_PROTO((trio_pointer_t ref, int is_size)); +#endif + +/* Printing */ +int trio_print_ref TRIO_PROTO((trio_pointer_t ref, const char *format, ...)); +int trio_vprint_ref TRIO_PROTO((trio_pointer_t ref, const char *format, va_list args)); +int trio_printv_ref TRIO_PROTO((trio_pointer_t ref, const char *format, trio_pointer_t *args)); + +void trio_print_int TRIO_PROTO((trio_pointer_t ref, int number)); +void trio_print_uint TRIO_PROTO((trio_pointer_t ref, unsigned int number)); +/* void trio_print_long TRIO_PROTO((trio_pointer_t ref, long number)); */ +/* void trio_print_ulong TRIO_PROTO((trio_pointer_t ref, unsigned long number)); */ +void trio_print_double TRIO_PROTO((trio_pointer_t ref, double number)); +void trio_print_string TRIO_PROTO((trio_pointer_t ref, TRIO_CONST char *string)); +void trio_print_pointer TRIO_PROTO((trio_pointer_t ref, trio_pointer_t pointer)); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* TRIO_TRIOP_H */ diff --git a/Mednafen/include/trio/triostr.h b/Mednafen/include/trio/triostr.h new file mode 100644 index 0000000000..847fb7232f --- /dev/null +++ b/Mednafen/include/trio/triostr.h @@ -0,0 +1,681 @@ +/************************************************************************* + * + * $Id: triostr.h,v 1.18 2010/01/26 13:02:02 breese Exp $ + * + * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +#ifndef TRIO_TRIOSTR_H +#define TRIO_TRIOSTR_H + +/* + * Documentation is located in triostr.c + */ + +#include +#include +#include +#include +#include "triodef.h" +#include "triop.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + TRIO_HASH_NONE = 0, + TRIO_HASH_PLAIN, + TRIO_HASH_TWOSIGNED +}; + +#if !defined(TRIO_PUBLIC_STRING) +# if !defined(TRIO_PUBLIC) +# define TRIO_PUBLIC +# endif +# define TRIO_PUBLIC_STRING TRIO_PUBLIC +#endif + +/************************************************************************* + * Dependencies + */ + +#if defined(TRIO_EMBED_STRING) + +/* + * The application that triostr is embedded in must define which functions + * it uses. + * + * The following resolves internal dependencies. + */ + +# if defined(TRIO_FUNC_XSTRING_SET) +# if !defined(TRIO_FUNC_DUPLICATE) +# define TRIO_FUNC_DUPLICATE +# endif +# endif + +# if defined(TRIO_FUNC_DUPLICATE) \ + || defined(TRIO_FUNC_DUPLICATE_MAX) \ + || defined(TRIO_FUNC_STRING_DUPLICATE) \ + || defined(TRIO_FUNC_XSTRING_DUPLICATE) +# if !defined(TRIO_FUNC_CREATE) +# define TRIO_FUNC_CREATE +# endif +# if !defined(TRIO_FUNC_COPY_MAX) +# define TRIO_FUNC_COPY_MAX +# endif +# endif + +# if defined(TRIO_FUNC_STRING_CREATE) +# if !defined(TRIO_FUNC_STRING_DESTROY) +# define TRIO_FUNC_STRING_DESTROY +# endif +# endif + +# if defined(TRIO_FUNC_STRING_DESTROY) \ + || defined(TRIO_FUNC_XSTRING_SET) +# if !defined(TRIO_FUNC_DESTROY) +# define TRIO_FUNC_DESTROY +# endif +# endif + +# if defined(TRIO_FUNC_EQUAL_LOCALE) \ + || defined(TRIO_FUNC_STRING_EQUAL) \ + || defined(TRIO_FUNC_XSTRING_EQUAL) +# if !defined(TRIO_FUNC_EQUAL) +# define TRIO_FUNC_EQUAL +# endif +# endif + +# if defined(TRIO_FUNC_EQUAL_CASE) \ + || defined(TRIO_FUNC_STRING_EQUAL_CASE) \ + || defined(TRIO_FUNC_XSTRING_EQUAL_CASE) +# if !defined(TRIO_FUNC_EQUAL_CASE) +# define TRIO_FUNC_EQUAL_CASE +# endif +# endif + +# if defined(TRIO_FUNC_SUBSTRING_MAX) \ + || defined(TRIO_FUNC_STRING_EQUAL_MAX) \ + || defined(TRIO_FUNC_XSTRING_EQUAL_MAX) +# if !defined(TRIO_FUNC_EQUAL_MAX) +# define TRIO_FUNC_EQUAL_MAX +# endif +# endif + +# if defined(TRIO_FUNC_TO_DOUBLE) \ + || defined(TRIO_FUNC_TO_FLOAT) +# if !defined(TRIO_FUNC_TO_LONG_DOUBLE) +# define TRIO_FUNC_TO_LONG_DOUBLE +# endif +# endif + +# if defined(TRIO_FUNC_STRING_TERMINATE) +# if !defined(TRIO_FUNC_XSTRING_APPEND_CHAR) +# define TRIO_FUNC_XSTRING_APPEND_CHAR +# endif +# endif + +# if defined(TRIO_FUNC_XSTRING_APPEND_CHAR) +# if !defined(TRIO_FUNC_STRING_SIZE) +# define TRIO_FUNC_STRING_SIZE +# endif +# endif + +#else + +/* + * When triostr is not embedded all functions are defined. + */ + +# define TRIO_FUNC_APPEND +# define TRIO_FUNC_APPEND_MAX +# define TRIO_FUNC_CONTAINS +# define TRIO_FUNC_COPY +# define TRIO_FUNC_COPY_MAX +# define TRIO_FUNC_CREATE +# define TRIO_FUNC_DESTROY +# define TRIO_FUNC_DUPLICATE +# define TRIO_FUNC_DUPLICATE_MAX +# define TRIO_FUNC_EQUAL +# define TRIO_FUNC_EQUAL_CASE +# define TRIO_FUNC_EQUAL_CASE_MAX +# define TRIO_FUNC_EQUAL_LOCALE +# define TRIO_FUNC_EQUAL_MAX +# define TRIO_FUNC_ERROR +# if !defined(TRIO_PLATFORM_WINCE) +# define TRIO_FUNC_FORMAT_DATE_MAX +# endif +# define TRIO_FUNC_HASH +# define TRIO_FUNC_INDEX +# define TRIO_FUNC_INDEX_LAST +# define TRIO_FUNC_LENGTH +# define TRIO_FUNC_LENGTH_MAX +# define TRIO_FUNC_LOWER +# define TRIO_FUNC_MATCH +# define TRIO_FUNC_MATCH_CASE +# define TRIO_FUNC_SPAN_FUNCTION +# define TRIO_FUNC_SUBSTRING +# define TRIO_FUNC_SUBSTRING_MAX +# define TRIO_FUNC_TO_DOUBLE +# define TRIO_FUNC_TO_FLOAT +# define TRIO_FUNC_TO_LONG +# define TRIO_FUNC_TO_LONG_DOUBLE +# define TRIO_FUNC_TO_LOWER +# define TRIO_FUNC_TO_UNSIGNED_LONG +# define TRIO_FUNC_TO_UPPER +# define TRIO_FUNC_TOKENIZE +# define TRIO_FUNC_UPPER + +# define TRIO_FUNC_STRING_APPEND +# define TRIO_FUNC_STRING_CONTAINS +# define TRIO_FUNC_STRING_COPY +# define TRIO_FUNC_STRING_CREATE +# define TRIO_FUNC_STRING_DESTROY +# define TRIO_FUNC_STRING_DUPLICATE +# define TRIO_FUNC_STRING_EQUAL +# define TRIO_FUNC_STRING_EQUAL_CASE +# define TRIO_FUNC_STRING_EQUAL_CASE_MAX +# define TRIO_FUNC_STRING_EQUAL_MAX +# define TRIO_FUNC_STRING_EXTRACT +# if !defined(TRIO_PLATFORM_WINCE) +# define TRIO_FUNC_STRING_FORMAT_DATE_MAX +# endif +# define TRIO_FUNC_STRING_GET +# define TRIO_FUNC_STRING_INDEX +# define TRIO_FUNC_STRING_INDEX_LAST +# define TRIO_FUNC_STRING_LENGTH +# define TRIO_FUNC_STRING_LOWER +# define TRIO_FUNC_STRING_MATCH +# define TRIO_FUNC_STRING_MATCH_CASE +# define TRIO_FUNC_STRING_SIZE +# define TRIO_FUNC_STRING_SUBSTRING +# define TRIO_FUNC_STRING_TERMINATE +# define TRIO_FUNC_STRING_UPPER + +# define TRIO_FUNC_XSTRING_APPEND +# define TRIO_FUNC_XSTRING_APPEND_CHAR +# define TRIO_FUNC_XSTRING_APPEND_MAX +# define TRIO_FUNC_XSTRING_CONTAINS +# define TRIO_FUNC_XSTRING_COPY +# define TRIO_FUNC_XSTRING_DUPLICATE +# define TRIO_FUNC_XSTRING_EQUAL +# define TRIO_FUNC_XSTRING_EQUAL_CASE +# define TRIO_FUNC_XSTRING_EQUAL_CASE_MAX +# define TRIO_FUNC_XSTRING_EQUAL_MAX +# define TRIO_FUNC_XSTRING_MATCH +# define TRIO_FUNC_XSTRING_MATCH_CASE +# define TRIO_FUNC_XSTRING_SET +# define TRIO_FUNC_XSTRING_SUBSTRING + +#endif + + +/************************************************************************* + * String functions + */ + +#if defined(TRIO_FUNC_APPEND) +TRIO_PUBLIC_STRING int +trio_append +TRIO_PROTO((char *target, TRIO_CONST char *source)); +#endif + +#if defined(TRIO_FUNC_APPEND_MAX) +TRIO_PUBLIC_STRING int +trio_append_max +TRIO_PROTO((char *target, size_t max, TRIO_CONST char *source)); +#endif + +#if defined(TRIO_FUNC_CONTAINS) +TRIO_PUBLIC_STRING int +trio_contains +TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *substring)); +#endif + +#if defined(TRIO_FUNC_COPY) +TRIO_PUBLIC_STRING int +trio_copy +TRIO_PROTO((char *target, TRIO_CONST char *source)); +#endif + +#if defined(TRIO_FUNC_COPY_MAX) +TRIO_PUBLIC_STRING int +trio_copy_max +TRIO_PROTO((char *target, size_t max, TRIO_CONST char *source)); +#endif + +#if defined(TRIO_FUNC_CREATE) +TRIO_PUBLIC_STRING char * +trio_create +TRIO_PROTO((size_t size)); +#endif + +#if defined(TRIO_FUNC_DESTROY) +TRIO_PUBLIC_STRING void +trio_destroy +TRIO_PROTO((char *string)); +#endif + +#if defined(TRIO_FUNC_DUPLICATE) +TRIO_PUBLIC_STRING char * +trio_duplicate +TRIO_PROTO((TRIO_CONST char *source)); +#endif + +#if defined(TRIO_FUNC_DUPLICATE_MAX) +TRIO_PUBLIC_STRING char * +trio_duplicate_max +TRIO_PROTO((TRIO_CONST char *source, size_t max)); +#endif + +#if defined(TRIO_FUNC_EQUAL) +TRIO_PUBLIC_STRING int +trio_equal +TRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second)); +#endif + +#if defined(TRIO_FUNC_EQUAL_CASE) +TRIO_PUBLIC_STRING int +trio_equal_case +TRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second)); +#endif + +#if defined(TRIO_FUNC_EQUAL_CASE_MAX) +TRIO_PUBLIC_STRING int +trio_equal_case_max +TRIO_PROTO((TRIO_CONST char *first, size_t max, TRIO_CONST char *second)); +#endif + +#if defined(TRIO_FUNC_EQUAL_LOCALE) +TRIO_PUBLIC_STRING int +trio_equal_locale +TRIO_PROTO((TRIO_CONST char *first, TRIO_CONST char *second)); +#endif + +#if defined(TRIO_FUNC_EQUAL_MAX) +TRIO_PUBLIC_STRING int +trio_equal_max +TRIO_PROTO((TRIO_CONST char *first, size_t max, TRIO_CONST char *second)); +#endif + +#if defined(TRIO_FUNC_ERROR) +TRIO_PUBLIC_STRING TRIO_CONST char * +trio_error +TRIO_PROTO((int)); +#endif + +#if defined(TRIO_FUNC_FORMAT_DATE_MAX) +TRIO_PUBLIC_STRING size_t +trio_format_date_max +TRIO_PROTO((char *target, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime)); +#endif + +#if defined(TRIO_FUNC_HASH) +TRIO_PUBLIC_STRING unsigned long +trio_hash +TRIO_PROTO((TRIO_CONST char *string, int type)); +#endif + +#if defined(TRIO_FUNC_INDEX) +TRIO_PUBLIC_STRING char * +trio_index +TRIO_PROTO((TRIO_CONST char *string, int character)); +#endif + +#if defined(TRIO_FUNC_INDEX_LAST) +TRIO_PUBLIC_STRING char * +trio_index_last +TRIO_PROTO((TRIO_CONST char *string, int character)); +#endif + +#if defined(TRIO_FUNC_LENGTH) +TRIO_PUBLIC_STRING size_t +trio_length +TRIO_PROTO((TRIO_CONST char *string)); +#endif + +#if defined(TRIO_FUNC_LENGTH_MAX) +TRIO_PUBLIC_STRING size_t +trio_length_max +TRIO_PROTO((TRIO_CONST char *string, size_t max)); +#endif + +#if defined(TRIO_FUNC_LOWER) +TRIO_PUBLIC_STRING int +trio_lower +TRIO_PROTO((char *target)); +#endif + +#if defined(TRIO_FUNC_MATCH) +TRIO_PUBLIC_STRING int +trio_match +TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *pattern)); +#endif + +#if defined(TRIO_FUNC_MATCH_CASE) +TRIO_PUBLIC_STRING int +trio_match_case +TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *pattern)); +#endif + +#if defined(TRIO_FUNC_SPAN_FUNCTION) +TRIO_PUBLIC_STRING size_t +trio_span_function +TRIO_PROTO((char *target, TRIO_CONST char *source, int (*Function) TRIO_PROTO((int)))); +#endif + +#if defined(TRIO_FUNC_SUBSTRING) +TRIO_PUBLIC_STRING char * +trio_substring +TRIO_PROTO((TRIO_CONST char *string, TRIO_CONST char *substring)); +#endif + +#if defined(TRIO_FUNC_SUBSTRING_MAX) +TRIO_PUBLIC_STRING char * +trio_substring_max +TRIO_PROTO((TRIO_CONST char *string, size_t max, TRIO_CONST char *substring)); +#endif + +#if defined(TRIO_FUNC_TO_DOUBLE) +TRIO_PUBLIC_STRING double +trio_to_double +TRIO_PROTO((TRIO_CONST char *source, char **endp)); +#endif + +#if defined(TRIO_FUNC_TO_FLOAT) +TRIO_PUBLIC_STRING float +trio_to_float +TRIO_PROTO((TRIO_CONST char *source, char **endp)); +#endif + +#if defined(TRIO_FUNC_TO_LONG) +TRIO_PUBLIC_STRING long +trio_to_long +TRIO_PROTO((TRIO_CONST char *source, char **endp, int base)); +#endif + +#if defined(TRIO_FUNC_TO_LOWER) +TRIO_PUBLIC_STRING int +trio_to_lower +TRIO_PROTO((int source)); +#endif + +#if defined(TRIO_FUNC_TO_LONG_DOUBLE) +TRIO_PUBLIC_STRING trio_long_double_t +trio_to_long_double +TRIO_PROTO((TRIO_CONST char *source, char **endp)); +#endif + +#if defined(TRIO_FUNC_TO_UNSIGNED_LONG) +TRIO_PUBLIC_STRING unsigned long +trio_to_unsigned_long +TRIO_PROTO((TRIO_CONST char *source, char **endp, int base)); +#endif + +#if defined(TRIO_FUNC_TO_UPPER) +TRIO_PUBLIC_STRING int +trio_to_upper +TRIO_PROTO((int source)); +#endif + +#if defined(TRIO_FUNC_TOKENIZE) +TRIO_PUBLIC_STRING char * +trio_tokenize +TRIO_PROTO((char *string, TRIO_CONST char *delimiters)); +#endif + +#if defined(TRIO_FUNC_UPPER) +TRIO_PUBLIC_STRING int +trio_upper +TRIO_PROTO((char *target)); +#endif + +/************************************************************************* + * Dynamic string functions + */ + +/* + * Opaque type for dynamic strings + */ + +typedef struct _trio_string_t trio_string_t; + +#if defined(TRIO_FUNC_STRING_APPEND) +TRIO_PUBLIC_STRING int +trio_string_append +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_CONTAINS) +TRIO_PUBLIC_STRING int +trio_string_contains +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_COPY) +TRIO_PUBLIC_STRING int +trio_string_copy +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_CREATE) +TRIO_PUBLIC_STRING trio_string_t * +trio_string_create +TRIO_PROTO((int initial_size)); +#endif + +#if defined(TRIO_FUNC_STRING_DESTROY) +TRIO_PUBLIC_STRING void +trio_string_destroy +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_STRING_DUPLICATE) +TRIO_PUBLIC_STRING trio_string_t * +trio_string_duplicate +TRIO_PROTO((trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_EQUAL) +TRIO_PUBLIC_STRING int +trio_string_equal +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_EQUAL_MAX) +TRIO_PUBLIC_STRING int +trio_string_equal_max +TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *second)); +#endif + +#if defined(TRIO_FUNC_STRING_EQUAL_CASE) +TRIO_PUBLIC_STRING int +trio_string_equal_case +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_EQUAL_CASE_MAX) +TRIO_PUBLIC_STRING int +trio_string_equal_case_max +TRIO_PROTO((trio_string_t *self, size_t max, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_EXTRACT) +TRIO_PUBLIC_STRING char * +trio_string_extract +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_STRING_FORMAT_DATE_MAX) +TRIO_PUBLIC_STRING size_t +trio_string_format_date_max +TRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *format, TRIO_CONST struct tm *datetime)); +#endif + +#if defined(TRIO_FUNC_STRING_GET) +TRIO_PUBLIC_STRING char * +trio_string_get +TRIO_PROTO((trio_string_t *self, int offset)); +#endif + +#if defined(TRIO_FUNC_STRING_INDEX) +TRIO_PUBLIC_STRING char * +trio_string_index +TRIO_PROTO((trio_string_t *self, int character)); +#endif + +#if defined(TRIO_FUNC_STRING_INDEX_LAST) +TRIO_PUBLIC_STRING char * +trio_string_index_last +TRIO_PROTO((trio_string_t *self, int character)); +#endif + +#if defined(TRIO_FUNC_STRING_LENGTH) +TRIO_PUBLIC_STRING int +trio_string_length +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_STRING_LOWER) +TRIO_PUBLIC_STRING int +trio_string_lower +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_STRING_MATCH) +TRIO_PUBLIC_STRING int +trio_string_match +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_MATCH_CASE) +TRIO_PUBLIC_STRING int +trio_string_match_case +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_SIZE) +TRIO_PUBLIC_STRING int +trio_string_size +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_STRING_SUBSTRING) +TRIO_PUBLIC_STRING char * +trio_string_substring +TRIO_PROTO((trio_string_t *self, trio_string_t *other)); +#endif + +#if defined(TRIO_FUNC_STRING_TERMINATE) +TRIO_PUBLIC_STRING void +trio_string_terminate +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_STRING_UPPER) +TRIO_PUBLIC_STRING int +trio_string_upper +TRIO_PROTO((trio_string_t *self)); +#endif + +#if defined(TRIO_FUNC_XSTRING_APPEND) +TRIO_PUBLIC_STRING int +trio_xstring_append +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_APPEND_CHAR) +TRIO_PUBLIC_STRING int +trio_xstring_append_char +TRIO_PROTO((trio_string_t *self, char character)); +#endif + +#if defined(TRIO_FUNC_XSTRING_APPEND_MAX) +TRIO_PUBLIC_STRING int +trio_xstring_append_max +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other, size_t max)); +#endif + +#if defined(TRIO_FUNC_XSTRING_CONTAINS) +TRIO_PUBLIC_STRING int +trio_xstring_contains +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_COPY) +TRIO_PUBLIC_STRING int +trio_xstring_copy +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_DUPLICATE) +TRIO_PUBLIC_STRING trio_string_t * +trio_xstring_duplicate +TRIO_PROTO((TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_EQUAL) +TRIO_PUBLIC_STRING int +trio_xstring_equal +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_EQUAL_MAX) +TRIO_PUBLIC_STRING int +trio_xstring_equal_max +TRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE) +TRIO_PUBLIC_STRING int +trio_xstring_equal_case +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE_MAX) +TRIO_PUBLIC_STRING int +trio_xstring_equal_case_max +TRIO_PROTO((trio_string_t *self, size_t max, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_MATCH) +TRIO_PUBLIC_STRING int +trio_xstring_match +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_MATCH_CASE) +TRIO_PUBLIC_STRING int +trio_xstring_match_case +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#if defined(TRIO_FUNC_XSTRING_SET) +TRIO_PUBLIC_STRING void +trio_xstring_set +TRIO_PROTO((trio_string_t *self, char *buffer)); +#endif + +#if defined(TRIO_FUNC_XSTRING_SUBSTRING) +TRIO_PUBLIC_STRING char * +trio_xstring_substring +TRIO_PROTO((trio_string_t *self, TRIO_CONST char *other)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* TRIO_TRIOSTR_H */ diff --git a/Mednafen/libsndfile/libsndfile_FLAC.a b/Mednafen/libsndfile/libsndfile_FLAC.a new file mode 100644 index 0000000000..4814bd0921 Binary files /dev/null and b/Mednafen/libsndfile/libsndfile_FLAC.a differ diff --git a/Mednafen/libsndfile/libvorbis.a b/Mednafen/libsndfile/libvorbis.a new file mode 100644 index 0000000000..74a8b7e262 Binary files /dev/null and b/Mednafen/libsndfile/libvorbis.a differ diff --git a/Mednafen/libsndfile/libvorbisenc.a b/Mednafen/libsndfile/libvorbisenc.a new file mode 100644 index 0000000000..fcd6fbab2a Binary files /dev/null and b/Mednafen/libsndfile/libvorbisenc.a differ diff --git a/Mednafen/libsndfile/sndfile.h b/Mednafen/libsndfile/sndfile.h new file mode 100644 index 0000000000..d0b26dedaa --- /dev/null +++ b/Mednafen/libsndfile/sndfile.h @@ -0,0 +1,666 @@ +/* +** Copyright (C) 1999-2011Erik de Castro Lopo +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU Lesser General Public License as published by +** the Free Software Foundation; either version 2.1 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* +** sndfile.h -- system-wide definitions +** +** API documentation is in the doc/ directory of the source code tarball +** and at http://www.mega-nerd.com/libsndfile/api.html. +*/ + +#ifndef SNDFILE_H +#define SNDFILE_H + +/* This is the version 1.0.X header file. */ +#define SNDFILE_1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* The following file types can be read and written. +** A file type would consist of a major type (ie SF_FORMAT_WAV) bitwise +** ORed with a minor type (ie SF_FORMAT_PCM). SF_FORMAT_TYPEMASK and +** SF_FORMAT_SUBMASK can be used to separate the major and minor file +** types. +*/ + +enum +{ /* Major formats. */ + SF_FORMAT_WAV = 0x010000, /* Microsoft WAV format (little endian default). */ + SF_FORMAT_AIFF = 0x020000, /* Apple/SGI AIFF format (big endian). */ + SF_FORMAT_AU = 0x030000, /* Sun/NeXT AU format (big endian). */ + SF_FORMAT_RAW = 0x040000, /* RAW PCM data. */ + SF_FORMAT_PAF = 0x050000, /* Ensoniq PARIS file format. */ + SF_FORMAT_SVX = 0x060000, /* Amiga IFF / SVX8 / SV16 format. */ + SF_FORMAT_NIST = 0x070000, /* Sphere NIST format. */ + SF_FORMAT_VOC = 0x080000, /* VOC files. */ + SF_FORMAT_IRCAM = 0x0A0000, /* Berkeley/IRCAM/CARL */ + SF_FORMAT_W64 = 0x0B0000, /* Sonic Foundry's 64 bit RIFF/WAV */ + SF_FORMAT_MAT4 = 0x0C0000, /* Matlab (tm) V4.2 / GNU Octave 2.0 */ + SF_FORMAT_MAT5 = 0x0D0000, /* Matlab (tm) V5.0 / GNU Octave 2.1 */ + SF_FORMAT_PVF = 0x0E0000, /* Portable Voice Format */ + SF_FORMAT_XI = 0x0F0000, /* Fasttracker 2 Extended Instrument */ + SF_FORMAT_HTK = 0x100000, /* HMM Tool Kit format */ + SF_FORMAT_SDS = 0x110000, /* Midi Sample Dump Standard */ + SF_FORMAT_AVR = 0x120000, /* Audio Visual Research */ + SF_FORMAT_WAVEX = 0x130000, /* MS WAVE with WAVEFORMATEX */ + SF_FORMAT_SD2 = 0x160000, /* Sound Designer 2 */ + SF_FORMAT_FLAC = 0x170000, /* FLAC lossless file format */ + SF_FORMAT_CAF = 0x180000, /* Core Audio File format */ + SF_FORMAT_WVE = 0x190000, /* Psion WVE format */ + SF_FORMAT_OGG = 0x200000, /* Xiph OGG container */ + SF_FORMAT_MPC2K = 0x210000, /* Akai MPC 2000 sampler */ + SF_FORMAT_RF64 = 0x220000, /* RF64 WAV file */ + + /* Subtypes from here on. */ + + SF_FORMAT_PCM_S8 = 0x0001, /* Signed 8 bit data */ + SF_FORMAT_PCM_16 = 0x0002, /* Signed 16 bit data */ + SF_FORMAT_PCM_24 = 0x0003, /* Signed 24 bit data */ + SF_FORMAT_PCM_32 = 0x0004, /* Signed 32 bit data */ + + SF_FORMAT_PCM_U8 = 0x0005, /* Unsigned 8 bit data (WAV and RAW only) */ + + SF_FORMAT_FLOAT = 0x0006, /* 32 bit float data */ + SF_FORMAT_DOUBLE = 0x0007, /* 64 bit float data */ + + SF_FORMAT_ULAW = 0x0010, /* U-Law encoded. */ + SF_FORMAT_ALAW = 0x0011, /* A-Law encoded. */ + SF_FORMAT_IMA_ADPCM = 0x0012, /* IMA ADPCM. */ + SF_FORMAT_MS_ADPCM = 0x0013, /* Microsoft ADPCM. */ + + SF_FORMAT_GSM610 = 0x0020, /* GSM 6.10 encoding. */ + SF_FORMAT_VOX_ADPCM = 0x0021, /* OKI / Dialogix ADPCM */ + + SF_FORMAT_G721_32 = 0x0030, /* 32kbs G721 ADPCM encoding. */ + SF_FORMAT_G723_24 = 0x0031, /* 24kbs G723 ADPCM encoding. */ + SF_FORMAT_G723_40 = 0x0032, /* 40kbs G723 ADPCM encoding. */ + + SF_FORMAT_DWVW_12 = 0x0040, /* 12 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_16 = 0x0041, /* 16 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_24 = 0x0042, /* 24 bit Delta Width Variable Word encoding. */ + SF_FORMAT_DWVW_N = 0x0043, /* N bit Delta Width Variable Word encoding. */ + + SF_FORMAT_DPCM_8 = 0x0050, /* 8 bit differential PCM (XI only) */ + SF_FORMAT_DPCM_16 = 0x0051, /* 16 bit differential PCM (XI only) */ + + SF_FORMAT_VORBIS = 0x0060, /* Xiph Vorbis encoding. */ + + /* Endian-ness options. */ + + SF_ENDIAN_FILE = 0x00000000, /* Default file endian-ness. */ + SF_ENDIAN_LITTLE = 0x10000000, /* Force little endian-ness. */ + SF_ENDIAN_BIG = 0x20000000, /* Force big endian-ness. */ + SF_ENDIAN_CPU = 0x30000000, /* Force CPU endian-ness. */ + + SF_FORMAT_SUBMASK = 0x0000FFFF, + SF_FORMAT_TYPEMASK = 0x0FFF0000, + SF_FORMAT_ENDMASK = 0x30000000 +} ; + +/* +** The following are the valid command numbers for the sf_command() +** interface. The use of these commands is documented in the file +** command.html in the doc directory of the source code distribution. +*/ + +enum +{ SFC_GET_LIB_VERSION = 0x1000, + SFC_GET_LOG_INFO = 0x1001, + SFC_GET_CURRENT_SF_INFO = 0x1002, + + + SFC_GET_NORM_DOUBLE = 0x1010, + SFC_GET_NORM_FLOAT = 0x1011, + SFC_SET_NORM_DOUBLE = 0x1012, + SFC_SET_NORM_FLOAT = 0x1013, + SFC_SET_SCALE_FLOAT_INT_READ = 0x1014, + SFC_SET_SCALE_INT_FLOAT_WRITE = 0x1015, + + SFC_GET_SIMPLE_FORMAT_COUNT = 0x1020, + SFC_GET_SIMPLE_FORMAT = 0x1021, + + SFC_GET_FORMAT_INFO = 0x1028, + + SFC_GET_FORMAT_MAJOR_COUNT = 0x1030, + SFC_GET_FORMAT_MAJOR = 0x1031, + SFC_GET_FORMAT_SUBTYPE_COUNT = 0x1032, + SFC_GET_FORMAT_SUBTYPE = 0x1033, + + SFC_CALC_SIGNAL_MAX = 0x1040, + SFC_CALC_NORM_SIGNAL_MAX = 0x1041, + SFC_CALC_MAX_ALL_CHANNELS = 0x1042, + SFC_CALC_NORM_MAX_ALL_CHANNELS = 0x1043, + SFC_GET_SIGNAL_MAX = 0x1044, + SFC_GET_MAX_ALL_CHANNELS = 0x1045, + + SFC_SET_ADD_PEAK_CHUNK = 0x1050, + SFC_SET_ADD_HEADER_PAD_CHUNK = 0x1051, + + SFC_UPDATE_HEADER_NOW = 0x1060, + SFC_SET_UPDATE_HEADER_AUTO = 0x1061, + + SFC_FILE_TRUNCATE = 0x1080, + + SFC_SET_RAW_START_OFFSET = 0x1090, + + SFC_SET_DITHER_ON_WRITE = 0x10A0, + SFC_SET_DITHER_ON_READ = 0x10A1, + + SFC_GET_DITHER_INFO_COUNT = 0x10A2, + SFC_GET_DITHER_INFO = 0x10A3, + + SFC_GET_EMBED_FILE_INFO = 0x10B0, + + SFC_SET_CLIPPING = 0x10C0, + SFC_GET_CLIPPING = 0x10C1, + + SFC_GET_INSTRUMENT = 0x10D0, + SFC_SET_INSTRUMENT = 0x10D1, + + SFC_GET_LOOP_INFO = 0x10E0, + + SFC_GET_BROADCAST_INFO = 0x10F0, + SFC_SET_BROADCAST_INFO = 0x10F1, + + SFC_GET_CHANNEL_MAP_INFO = 0x1100, + SFC_SET_CHANNEL_MAP_INFO = 0x1101, + + SFC_RAW_DATA_NEEDS_ENDSWAP = 0x1110, + + /* Support for Wavex Ambisonics Format */ + SFC_WAVEX_SET_AMBISONIC = 0x1200, + SFC_WAVEX_GET_AMBISONIC = 0x1201, + + SFC_SET_VBR_ENCODING_QUALITY = 0x1300, + + /* Following commands for testing only. */ + SFC_TEST_IEEE_FLOAT_REPLACE = 0x6001, + + /* + ** SFC_SET_ADD_* values are deprecated and will disappear at some + ** time in the future. They are guaranteed to be here up to and + ** including version 1.0.8 to avoid breakage of existng software. + ** They currently do nothing and will continue to do nothing. + */ + SFC_SET_ADD_DITHER_ON_WRITE = 0x1070, + SFC_SET_ADD_DITHER_ON_READ = 0x1071 +} ; + + +/* +** String types that can be set and read from files. Not all file types +** support this and even the file types which support one, may not support +** all string types. +*/ + +enum +{ SF_STR_TITLE = 0x01, + SF_STR_COPYRIGHT = 0x02, + SF_STR_SOFTWARE = 0x03, + SF_STR_ARTIST = 0x04, + SF_STR_COMMENT = 0x05, + SF_STR_DATE = 0x06, + SF_STR_ALBUM = 0x07, + SF_STR_LICENSE = 0x08, + SF_STR_TRACKNUMBER = 0x09, + SF_STR_GENRE = 0x10 +} ; + +/* +** Use the following as the start and end index when doing metadata +** transcoding. +*/ + +#define SF_STR_FIRST SF_STR_TITLE +#define SF_STR_LAST SF_STR_GENRE + +enum +{ /* True and false */ + SF_FALSE = 0, + SF_TRUE = 1, + + /* Modes for opening files. */ + SFM_READ = 0x10, + SFM_WRITE = 0x20, + SFM_RDWR = 0x30, + + SF_AMBISONIC_NONE = 0x40, + SF_AMBISONIC_B_FORMAT = 0x41 +} ; + +/* Public error values. These are guaranteed to remain unchanged for the duration +** of the library major version number. +** There are also a large number of private error numbers which are internal to +** the library which can change at any time. +*/ + +enum +{ SF_ERR_NO_ERROR = 0, + SF_ERR_UNRECOGNISED_FORMAT = 1, + SF_ERR_SYSTEM = 2, + SF_ERR_MALFORMED_FILE = 3, + SF_ERR_UNSUPPORTED_ENCODING = 4 +} ; + + +/* Channel map values (used with SFC_SET/GET_CHANNEL_MAP). +*/ + +enum +{ SF_CHANNEL_MAP_INVALID = 0, + SF_CHANNEL_MAP_MONO = 1, + SF_CHANNEL_MAP_LEFT, /* Apple calls this 'Left' */ + SF_CHANNEL_MAP_RIGHT, /* Apple calls this 'Right' */ + SF_CHANNEL_MAP_CENTER, /* Apple calls this 'Center' */ + SF_CHANNEL_MAP_FRONT_LEFT, + SF_CHANNEL_MAP_FRONT_RIGHT, + SF_CHANNEL_MAP_FRONT_CENTER, + SF_CHANNEL_MAP_REAR_CENTER, /* Apple calls this 'Center Surround', Msft calls this 'Back Center' */ + SF_CHANNEL_MAP_REAR_LEFT, /* Apple calls this 'Left Surround', Msft calls this 'Back Left' */ + SF_CHANNEL_MAP_REAR_RIGHT, /* Apple calls this 'Right Surround', Msft calls this 'Back Right' */ + SF_CHANNEL_MAP_LFE, /* Apple calls this 'LFEScreen', Msft calls this 'Low Frequency' */ + SF_CHANNEL_MAP_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */ + SF_CHANNEL_MAP_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */ + SF_CHANNEL_MAP_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */ + SF_CHANNEL_MAP_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */ + SF_CHANNEL_MAP_TOP_CENTER, /* Apple calls this 'Top Center Surround' */ + SF_CHANNEL_MAP_TOP_FRONT_LEFT, /* Apple calls this 'Vertical Height Left' */ + SF_CHANNEL_MAP_TOP_FRONT_RIGHT, /* Apple calls this 'Vertical Height Right' */ + SF_CHANNEL_MAP_TOP_FRONT_CENTER, /* Apple calls this 'Vertical Height Center' */ + SF_CHANNEL_MAP_TOP_REAR_LEFT, /* Apple and MS call this 'Top Back Left' */ + SF_CHANNEL_MAP_TOP_REAR_RIGHT, /* Apple and MS call this 'Top Back Right' */ + SF_CHANNEL_MAP_TOP_REAR_CENTER, /* Apple and MS call this 'Top Back Center' */ + + SF_CHANNEL_MAP_AMBISONIC_B_W, + SF_CHANNEL_MAP_AMBISONIC_B_X, + SF_CHANNEL_MAP_AMBISONIC_B_Y, + SF_CHANNEL_MAP_AMBISONIC_B_Z, + + SF_CHANNEL_MAP_MAX +} ; + + +/* A SNDFILE* pointer can be passed around much like stdio.h's FILE* pointer. */ + +typedef struct SNDFILE_tag SNDFILE ; + +/* The following typedef is system specific and is defined when libsndfile is +** compiled. sf_count_t will be a 64 bit value when the underlying OS allows +** 64 bit file offsets. +** On windows, we need to allow the same header file to be compiler by both GCC +** and the Microsoft compiler. +*/ + +#if (defined (_MSCVER) || defined (_MSC_VER)) +typedef __int64 sf_count_t ; +#define SF_COUNT_MAX 0x7fffffffffffffffi64 +#else +typedef int64_t sf_count_t ; +#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL +#endif + + +/* A pointer to a SF_INFO structure is passed to sf_open () and filled in. +** On write, the SF_INFO structure is filled in by the user and passed into +** sf_open (). +*/ + +struct SF_INFO +{ sf_count_t frames ; /* Used to be called samples. Changed to avoid confusion. */ + int samplerate ; + int channels ; + int format ; + int sections ; + int seekable ; +} ; + +typedef struct SF_INFO SF_INFO ; + +/* The SF_FORMAT_INFO struct is used to retrieve information about the sound +** file formats libsndfile supports using the sf_command () interface. +** +** Using this interface will allow applications to support new file formats +** and encoding types when libsndfile is upgraded, without requiring +** re-compilation of the application. +** +** Please consult the libsndfile documentation (particularly the information +** on the sf_command () interface) for examples of its use. +*/ + +typedef struct +{ int format ; + const char *name ; + const char *extension ; +} SF_FORMAT_INFO ; + +/* +** Enums and typedefs for adding dither on read and write. +** See the html documentation for sf_command(), SFC_SET_DITHER_ON_WRITE +** and SFC_SET_DITHER_ON_READ. +*/ + +enum +{ SFD_DEFAULT_LEVEL = 0, + SFD_CUSTOM_LEVEL = 0x40000000, + + SFD_NO_DITHER = 500, + SFD_WHITE = 501, + SFD_TRIANGULAR_PDF = 502 +} ; + +typedef struct +{ int type ; + double level ; + const char *name ; +} SF_DITHER_INFO ; + +/* Struct used to retrieve information about a file embedded within a +** larger file. See SFC_GET_EMBED_FILE_INFO. +*/ + +typedef struct +{ sf_count_t offset ; + sf_count_t length ; +} SF_EMBED_FILE_INFO ; + +/* +** Structs used to retrieve music sample information from a file. +*/ + +enum +{ /* + ** The loop mode field in SF_INSTRUMENT will be one of the following. + */ + SF_LOOP_NONE = 800, + SF_LOOP_FORWARD, + SF_LOOP_BACKWARD, + SF_LOOP_ALTERNATING +} ; + +typedef struct +{ int gain ; + char basenote, detune ; + char velocity_lo, velocity_hi ; + char key_lo, key_hi ; + int loop_count ; + + struct + { int mode ; + unsigned int start ; + unsigned int end ; + unsigned int count ; + } loops [16] ; /* make variable in a sensible way */ +} SF_INSTRUMENT ; + + + +/* Struct used to retrieve loop information from a file.*/ +typedef struct +{ + short time_sig_num ; /* any positive integer > 0 */ + short time_sig_den ; /* any positive power of 2 > 0 */ + int loop_mode ; /* see SF_LOOP enum */ + + int num_beats ; /* this is NOT the amount of quarter notes !!!*/ + /* a full bar of 4/4 is 4 beats */ + /* a full bar of 7/8 is 7 beats */ + + float bpm ; /* suggestion, as it can be calculated using other fields:*/ + /* file's lenght, file's sampleRate and our time_sig_den*/ + /* -> bpms are always the amount of _quarter notes_ per minute */ + + int root_key ; /* MIDI note, or -1 for None */ + int future [6] ; +} SF_LOOP_INFO ; + + +/* Struct used to retrieve broadcast (EBU) information from a file. +** Strongly (!) based on EBU "bext" chunk format used in Broadcast WAVE. +*/ +#define SF_BROADCAST_INFO_VAR(coding_hist_size) \ + struct \ + { char description [256] ; \ + char originator [32] ; \ + char originator_reference [32] ; \ + char origination_date [10] ; \ + char origination_time [8] ; \ + unsigned int time_reference_low ; \ + unsigned int time_reference_high ; \ + short version ; \ + char umid [64] ; \ + char reserved [190] ; \ + unsigned int coding_history_size ; \ + char coding_history [coding_hist_size] ; \ + } + +/* SF_BROADCAST_INFO is the above struct with coding_history field of 256 bytes. */ +typedef SF_BROADCAST_INFO_VAR (256) SF_BROADCAST_INFO ; + + +/* Virtual I/O functionality. */ + +typedef sf_count_t (*sf_vio_get_filelen) (void *user_data) ; +typedef sf_count_t (*sf_vio_seek) (sf_count_t offset, int whence, void *user_data) ; +typedef sf_count_t (*sf_vio_read) (void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_write) (const void *ptr, sf_count_t count, void *user_data) ; +typedef sf_count_t (*sf_vio_tell) (void *user_data) ; + +struct SF_VIRTUAL_IO +{ sf_vio_get_filelen get_filelen ; + sf_vio_seek seek ; + sf_vio_read read ; + sf_vio_write write ; + sf_vio_tell tell ; +} ; + +typedef struct SF_VIRTUAL_IO SF_VIRTUAL_IO ; + + +/* Open the specified file for read, write or both. On error, this will +** return a NULL pointer. To find the error number, pass a NULL SNDFILE +** to sf_strerror (). +** All calls to sf_open() should be matched with a call to sf_close(). +*/ + +SNDFILE* sf_open (const char *path, int mode, SF_INFO *sfinfo) ; + + +/* Use the existing file descriptor to create a SNDFILE object. If close_desc +** is TRUE, the file descriptor will be closed when sf_close() is called. If +** it is FALSE, the descritor will not be closed. +** When passed a descriptor like this, the library will assume that the start +** of file header is at the current file offset. This allows sound files within +** larger container files to be read and/or written. +** On error, this will return a NULL pointer. To find the error number, pass a +** NULL SNDFILE to sf_strerror (). +** All calls to sf_open_fd() should be matched with a call to sf_close(). + +*/ + +SNDFILE* sf_open_fd (int fd, int mode, SF_INFO *sfinfo, int close_desc) ; + +SNDFILE* sf_open_virtual (SF_VIRTUAL_IO *sfvirtual, int mode, SF_INFO *sfinfo, void *user_data) ; + + +/* sf_error () returns a error number which can be translated to a text +** string using sf_error_number(). +*/ + +int sf_error (SNDFILE *sndfile) ; + + +/* sf_strerror () returns to the caller a pointer to the current error message for +** the given SNDFILE. +*/ + +const char* sf_strerror (SNDFILE *sndfile) ; + + +/* sf_error_number () allows the retrieval of the error string for each internal +** error number. +** +*/ + +const char* sf_error_number (int errnum) ; + + +/* The following two error functions are deprecated but they will remain in the +** library for the forseeable future. The function sf_strerror() should be used +** in their place. +*/ + +int sf_perror (SNDFILE *sndfile) ; +int sf_error_str (SNDFILE *sndfile, char* str, size_t len) ; + + +/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ + +int sf_command (SNDFILE *sndfile, int command, void *data, int datasize) ; + + +/* Return TRUE if fields of the SF_INFO struct are a valid combination of values. */ + +int sf_format_check (const SF_INFO *info) ; + + +/* Seek within the waveform data chunk of the SNDFILE. sf_seek () uses +** the same values for whence (SEEK_SET, SEEK_CUR and SEEK_END) as +** stdio.h function fseek (). +** An offset of zero with whence set to SEEK_SET will position the +** read / write pointer to the first data sample. +** On success sf_seek returns the current position in (multi-channel) +** samples from the start of the file. +** Please see the libsndfile documentation for moving the read pointer +** separately from the write pointer on files open in mode SFM_RDWR. +** On error all of these functions return -1. +*/ + +sf_count_t sf_seek (SNDFILE *sndfile, sf_count_t frames, int whence) ; + + +/* Functions for retrieving and setting string data within sound files. +** Not all file types support this features; AIFF and WAV do. For both +** functions, the str_type parameter must be one of the SF_STR_* values +** defined above. +** On error, sf_set_string() returns non-zero while sf_get_string() +** returns NULL. +*/ + +int sf_set_string (SNDFILE *sndfile, int str_type, const char* str) ; + +const char* sf_get_string (SNDFILE *sndfile, int str_type) ; + + +/* Return the library version string. */ + +const char * sf_version_string (void) ; + + +/* Functions for reading/writing the waveform data of a sound file. +*/ + +sf_count_t sf_read_raw (SNDFILE *sndfile, void *ptr, sf_count_t bytes) ; +sf_count_t sf_write_raw (SNDFILE *sndfile, const void *ptr, sf_count_t bytes) ; + + +/* Functions for reading and writing the data chunk in terms of frames. +** The number of items actually read/written = frames * number of channels. +** sf_xxxx_raw read/writes the raw data bytes from/to the file +** sf_xxxx_short passes data in the native short format +** sf_xxxx_int passes data in the native int format +** sf_xxxx_float passes data in the native float format +** sf_xxxx_double passes data in the native double format +** All of these read/write function return number of frames read/written. +*/ + +sf_count_t sf_readf_short (SNDFILE *sndfile, short *ptr, sf_count_t frames) ; +sf_count_t sf_writef_short (SNDFILE *sndfile, const short *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_int (SNDFILE *sndfile, int *ptr, sf_count_t frames) ; +sf_count_t sf_writef_int (SNDFILE *sndfile, const int *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_float (SNDFILE *sndfile, float *ptr, sf_count_t frames) ; +sf_count_t sf_writef_float (SNDFILE *sndfile, const float *ptr, sf_count_t frames) ; + +sf_count_t sf_readf_double (SNDFILE *sndfile, double *ptr, sf_count_t frames) ; +sf_count_t sf_writef_double (SNDFILE *sndfile, const double *ptr, sf_count_t frames) ; + + +/* Functions for reading and writing the data chunk in terms of items. +** Otherwise similar to above. +** All of these read/write function return number of items read/written. +*/ + +sf_count_t sf_read_short (SNDFILE *sndfile, short *ptr, sf_count_t items) ; +sf_count_t sf_write_short (SNDFILE *sndfile, const short *ptr, sf_count_t items) ; + +sf_count_t sf_read_int (SNDFILE *sndfile, int *ptr, sf_count_t items) ; +sf_count_t sf_write_int (SNDFILE *sndfile, const int *ptr, sf_count_t items) ; + +sf_count_t sf_read_float (SNDFILE *sndfile, float *ptr, sf_count_t items) ; +sf_count_t sf_write_float (SNDFILE *sndfile, const float *ptr, sf_count_t items) ; + +sf_count_t sf_read_double (SNDFILE *sndfile, double *ptr, sf_count_t items) ; +sf_count_t sf_write_double (SNDFILE *sndfile, const double *ptr, sf_count_t items) ; + + +/* Close the SNDFILE and clean up all memory allocations associated with this +** file. +** Returns 0 on success, or an error number. +*/ + +int sf_close (SNDFILE *sndfile) ; + + +/* If the file is opened SFM_WRITE or SFM_RDWR, call fsync() on the file +** to force the writing of data to disk. If the file is opened SFM_READ +** no action is taken. +*/ + +void sf_write_sync (SNDFILE *sndfile) ; + + + +/* The function sf_wchar_open() is Windows Only! +** Open a file passing in a Windows Unicode filename. Otherwise, this is +** the same as sf_open(). +** +** In order for this to work, you need to do the following: +** +** #include +** #define ENABLE_SNDFILE_WINDOWS_PROTOTYPES 1 +** #including +*/ + +#if (defined (ENABLE_SNDFILE_WINDOWS_PROTOTYPES) && ENABLE_SNDFILE_WINDOWS_PROTOTYPES) +SNDFILE* sf_wchar_open (LPCWSTR wpath, int mode, SF_INFO *sfinfo) ; +#endif + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* __cplusplus */ + +#endif /* SNDFILE_H */ + diff --git a/Mednafen/mednafen/FileStream.cpp b/Mednafen/mednafen/FileStream.cpp new file mode 100644 index 0000000000..5c13c5eacf --- /dev/null +++ b/Mednafen/mednafen/FileStream.cpp @@ -0,0 +1,339 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "FileStream.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_MMAP +#include +#include +#include +#include +#endif + +// Some really bad preprocessor abuse follows to handle platforms that don't have fseeko and ftello...and of course +// for largefile support on Windows: + +#ifndef HAVE_FSEEKO + #define fseeko fseek +#endif + +#ifndef HAVE_FTELLO + #define ftello ftell +#endif + +#define STRUCT_STAT struct stat + +#if SIZEOF_OFF_T == 4 + + #ifdef HAVE_FOPEN64 + #define fopen fopen64 + #endif + + #ifdef HAVE_FTELLO64 + #undef ftello + #define ftello ftello64 + #endif + + #ifdef HAVE_FSEEKO64 + #undef fseeko + #define fseeko fseeko64 + #endif + + #ifdef HAVE_FSTAT64 + #define fstat fstat64 + #define stat stat64 + #undef STRUCT_STAT + #define STRUCT_STAT struct stat64 + #endif + + #ifdef HAVE_FTRUNCATE64 + #define ftruncate ftruncate64 + #endif +#endif + +FileStream::FileStream(const std::string& path, const int mode) : OpenedMode(mode), mapping(NULL), mapping_size(0) +{ + path_save = path; + + if(mode == MODE_READ) + fp = fopen(path.c_str(), "rb"); + else if(mode == MODE_WRITE) + fp = fopen(path.c_str(), "wb"); + else if(mode == MODE_WRITE_SAFE || mode == MODE_WRITE_INPLACE) // SO ANNOYING + { + int open_flags = O_WRONLY | O_CREAT; + + if(mode == MODE_WRITE_SAFE) + open_flags |= O_EXCL; + + #ifdef O_BINARY + open_flags |= O_BINARY; + #elif defined(_O_BINARY) + open_flags |= _O_BINARY; + #endif + + #if defined(S_IRGRP) && defined(S_IROTH) + int tmpfd = open(path.c_str(), open_flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + #else + int tmpfd = open(path.c_str(), open_flags, S_IRUSR | S_IWUSR); + #endif + if(tmpfd == -1) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error opening file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } + fp = fdopen(tmpfd, "wb"); + } + else + abort(); + + if(!fp) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error opening file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } +} + +FileStream::~FileStream() +{ + try + { + close(); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } +} + +uint64 FileStream::attributes(void) +{ + uint64 ret = ATTRIBUTE_SEEKABLE; + + switch(OpenedMode) + { + case MODE_READ: + ret |= ATTRIBUTE_READABLE; + break; + + case MODE_WRITE_INPLACE: + case MODE_WRITE_SAFE: + case MODE_WRITE: + ret |= ATTRIBUTE_WRITEABLE; + break; + } + + return ret; +} + +uint8 *FileStream::map(void) noexcept +{ + if(!mapping) + { +#ifdef HAVE_MMAP + uint64 length = size(); + int prot = 0; + int flags = 0; + void* tptr; + + if(OpenedMode == MODE_READ) + { + prot |= PROT_READ; // | PROT_EXEC; + flags |= MAP_PRIVATE; + } + else + { + prot |= PROT_WRITE; + prot |= MAP_SHARED; + } + + if(length > SIZE_MAX) + return(NULL); + + tptr = mmap(NULL, length, prot, flags, fileno(fp), 0); + if(tptr != (void*)-1) + { + mapping = tptr; + mapping_size = length; + + #ifdef HAVE_MADVISE + // Should probably make this controllable via flag or somesuch. + madvise(mapping, mapping_size, MADV_SEQUENTIAL | MADV_WILLNEED); + #endif + } +#endif + } + + return((uint8*)mapping); +} + +uint64 FileStream::map_size(void) noexcept +{ + return mapping_size; +} + +void FileStream::unmap(void) noexcept +{ + if(mapping) + { +#ifdef HAVE_MMAP + munmap(mapping, mapping_size); +#endif + mapping = NULL; + mapping_size = 0; + } +} + + +uint64 FileStream::read(void *data, uint64 count, bool error_on_eos) +{ + uint64 read_count; + + clearerr(fp); + + read_count = fread(data, 1, count, fp); + + if(read_count != count) + { + ErrnoHolder ene(errno); + + if(ferror(fp)) + throw(MDFN_Error(ene.Errno(), _("Error reading from opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + + if(error_on_eos) + throw(MDFN_Error(0, _("Error reading from opened file \"%s\": %s"), path_save.c_str(), _("Unexpected EOF"))); + } + + return(read_count); +} + +void FileStream::write(const void *data, uint64 count) +{ + if(fwrite(data, 1, count, fp) != count) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error writing to opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } +} + +void FileStream::truncate(uint64 length) +{ + if(fflush(fp) == EOF || ftruncate(fileno(fp), length) != 0) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error truncating opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } +} + +void FileStream::seek(int64 offset, int whence) +{ + if(fseeko(fp, offset, whence) == -1) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error seeking in opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } +} + +void FileStream::flush(void) +{ + if(fflush(fp) == EOF) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error flushing to opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } +} + +uint64 FileStream::tell(void) +{ + auto offset = ftello(fp); + + if(offset == -1) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error getting position in opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } + + return (std::make_unsigned::type)offset; +} + +uint64 FileStream::size(void) +{ + STRUCT_STAT buf; + + if((OpenedMode != MODE_READ && fflush(fp) == EOF) || fstat(fileno(fp), &buf) == -1) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error getting the size of opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } + + return (std::make_unsigned::type)buf.st_size; +} + +void FileStream::close(void) +{ + if(fp) + { + FILE *tmp = fp; + + unmap(); + fp = NULL; + + if(fclose(tmp) == EOF) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error closing opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } + } +} + +int FileStream::get_line(std::string &str) +{ + int c; + + str.clear(); + + while((c = get_char()) >= 0) + { + if(c == '\r' || c == '\n' || c == 0) + return(c); + + str.push_back(c); + } + + return(str.length() ? 256 : -1); +} + diff --git a/Mednafen/mednafen/FileStream.h b/Mednafen/mednafen/FileStream.h new file mode 100644 index 0000000000..6c900c0f0a --- /dev/null +++ b/Mednafen/mednafen/FileStream.h @@ -0,0 +1,88 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_FILESTREAM_H +#define __MDFN_FILESTREAM_H + +#include "Stream.h" + +#include +#include + +class FileStream : public Stream +{ + public: + + enum + { + MODE_READ = 0, + MODE_WRITE, + MODE_WRITE_SAFE, // Will throw an exception instead of overwriting an existing file. + MODE_WRITE_INPLACE, // Like MODE_WRITE, but won't truncate the file if it already exists. + }; + + FileStream(const std::string& path, const int mode); + virtual ~FileStream() override; + + virtual uint64 attributes(void) override; + + virtual uint8 *map(void) noexcept override; + virtual uint64 map_size(void) noexcept override; + virtual void unmap(void) noexcept override; + + virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) override; + virtual void write(const void *data, uint64 count) override; + virtual void truncate(uint64 length) override; + virtual void seek(int64 offset, int whence) override; + virtual uint64 tell(void) override; + virtual uint64 size(void) override; + virtual void flush(void) override; + virtual void close(void) override; + + virtual int get_line(std::string &str) override; + + INLINE int get_char(void) + { + int ret; + + errno = 0; + ret = fgetc(fp); + + if(MDFN_UNLIKELY(errno != 0)) + { + ErrnoHolder ene(errno); + throw(MDFN_Error(ene.Errno(), _("Error reading from opened file \"%s\": %s"), path_save.c_str(), ene.StrError())); + } + return(ret); + } + + private: + FileStream & operator=(const FileStream &); // Assignment operator + FileStream(const FileStream &); // Copy constructor + //FileStream(FileStream &); // Copy constructor + + FILE *fp; + std::string path_save; + const int OpenedMode; + + void* mapping; + uint64 mapping_size; +}; + + + +#endif diff --git a/Mednafen/mednafen/IPSPatcher.cpp b/Mednafen/mednafen/IPSPatcher.cpp new file mode 100644 index 0000000000..1b889a7eae --- /dev/null +++ b/Mednafen/mednafen/IPSPatcher.cpp @@ -0,0 +1,76 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include "IPSPatcher.h" + +uint32 IPSPatcher::Apply(Stream* ips, Stream* targ) +{ + std::unique_ptr tmpbuf(new uint8[65536]); + uint8 file_header[5]; + uint32 count = 0; + + if(ips->read(file_header, 5, false) < 5 || memcmp(file_header, "PATCH", 5)) + throw MDFN_Error(0, _("IPS file header is invalid.")); + + for(;;) + { + uint8 header[3]; + uint32 offset; + uint32 patch_size; // Max value: 65536 + bool rle = false; + + ips->read(header, 3); + offset = MDFN_de24msb(&header[0]); + + if(offset == 0x454f46) // EOF + return(count); + + patch_size = ips->get_BE(); + + if(!patch_size) /* RLE */ + { + patch_size = ips->get_BE(); + + // Is this right? + if(!patch_size) + patch_size = 65536; + + rle = true; + //MDFN_printf(_("Offset: %8u Size: %5u RLE\n"), offset, patch_size); + } + + targ->seek(offset, SEEK_SET); + + if(rle) // RLE patch. + { + const uint8 b = ips->get_u8(); + + memset(&tmpbuf[0], b, patch_size); + targ->write(&tmpbuf[0], patch_size); + } + else // Normal patch + { + //MDFN_printf(_("Offset: %8u Size: %5u\n"), offset, patch_size); + ips->read(&tmpbuf[0], patch_size); + targ->write(&tmpbuf[0], patch_size); + } + count++; + } +} diff --git a/Mednafen/mednafen/IPSPatcher.h b/Mednafen/mednafen/IPSPatcher.h new file mode 100644 index 0000000000..b452cf05c4 --- /dev/null +++ b/Mednafen/mednafen/IPSPatcher.h @@ -0,0 +1,13 @@ +#ifndef __MDFN_IPSPATCHER_H +#define __MDFN_IPSPATCHER_H + +#include + +struct IPSPatcher +{ + // Returns the number of patches encountered(!= bytes patched, usually). + static uint32 Apply(Stream* ips, Stream* targ); +}; + + +#endif diff --git a/Mednafen/mednafen/Makefile.am b/Mednafen/mednafen/Makefile.am new file mode 100644 index 0000000000..d7cfdd336e --- /dev/null +++ b/Mednafen/mednafen/Makefile.am @@ -0,0 +1,192 @@ +SUBDIRS = trio +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +bin_PROGRAMS = mednafen + +mednafen_SOURCES = debug.cpp error.cpp mempatcher.cpp settings.cpp endian.cpp mednafen.cpp git.cpp file.cpp general.cpp memory.cpp netplay.cpp state.cpp state_rewind.cpp movie.cpp player.cpp PSFLoader.cpp SNSFLoader.cpp SPCReader.cpp tests.cpp qtrecord.cpp Stream.cpp MemoryStream.cpp FileStream.cpp IPSPatcher.cpp +mednafen_LDADD = trio/libtrio.a +mednafen_DEPENDENCIES = trio/libtrio.a + +if HAVE_SDL +SUBDIRS += drivers +mednafen_LDADD += drivers/libmdfnsdl.a +mednafen_DEPENDENCIES += drivers/libmdfnsdl.a + +# +# Resource file wasn't linking in properly when it was in an archive, so we resort to this! +# +if WIN32 +.rc.o: + @WINDRES@ -o $@ $< + +mednafen_SOURCES += drivers/win-resource.rc +endif + +endif + +if DOS +SUBDIRS += drivers_dos +mednafen_LDADD += drivers_dos/libmdfndos.a +mednafen_DEPENDENCIES += drivers_dos/libmdfndos.a +endif + +SUBDIRS += sexyal +mednafen_LDADD += sexyal/libsexyal.a +mednafen_DEPENDENCIES += sexyal/libsexyal.a + +if HAVE_SDL +mednafen_LDADD += @SDL_LIBS@ +endif + + +if WANT_DEBUGGER +mednafen_SOURCES += dis6502.cpp +endif + +SUBDIRS += cdplay +mednafen_LDADD += cdplay/libcdplay.a +mednafen_DEPENDENCIES += cdplay/libcdplay.a + +SUBDIRS += demo +mednafen_LDADD += demo/libdemo.a +mednafen_DEPENDENCIES += demo/libdemo.a + +if WANT_GB_EMU +SUBDIRS += gb +mednafen_LDADD += gb/libgb.a +mednafen_DEPENDENCIES += gb/libgb.a +endif + +if WANT_GBA_EMU +SUBDIRS += gba +mednafen_LDADD += gba/libgba.a +mednafen_DEPENDENCIES += gba/libgba.a +endif + +if WANT_LYNX_EMU +SUBDIRS += lynx +mednafen_LDADD += lynx/liblynx.a +mednafen_DEPENDENCIES += lynx/liblynx.a +endif + +if WANT_MD_EMU +SUBDIRS += md +mednafen_LDADD += md/libmd.a +mednafen_DEPENDENCIES += md/libmd.a +endif + +if WANT_NES_EMU +SUBDIRS += nes +mednafen_LDADD += nes/libnes.a +mednafen_DEPENDENCIES += nes/libnes.a +endif + +if WANT_NGP_EMU +SUBDIRS += ngp +mednafen_LDADD += ngp/libngp.a +mednafen_DEPENDENCIES += ngp/libngp.a +endif + +if WANT_PCE_EMU +SUBDIRS += pce +mednafen_LDADD += pce/libpce.a +mednafen_DEPENDENCIES += pce/libpce.a +endif + +if WANT_PCE_FAST_EMU +SUBDIRS += pce_fast +mednafen_LDADD += pce_fast/libpce_fast.a +mednafen_DEPENDENCIES += pce_fast/libpce_fast.a +endif + +if WANT_PCFX_EMU +SUBDIRS += pcfx +mednafen_LDADD += pcfx/libpcfx.a +mednafen_DEPENDENCIES += pcfx/libpcfx.a +endif + +if WANT_PSX_EMU +SUBDIRS += psx +mednafen_LDADD += psx/libpsx.a +mednafen_DEPENDENCIES += psx/libpsx.a +endif + + +if WANT_SMS_EMU +SUBDIRS += sms +mednafen_LDADD += sms/libsms.a +mednafen_DEPENDENCIES += sms/libsms.a +endif + +if WANT_SNES_EMU +SUBDIRS += snes +mednafen_LDADD += snes/libsnes.a +mednafen_DEPENDENCIES += snes/libsnes.a +endif + +if WANT_SNES_FAUST_EMU +SUBDIRS += snes_faust +mednafen_LDADD += snes_faust/libsnes_faust.a +mednafen_DEPENDENCIES += snes_faust/libsnes_faust.a +endif + +if WANT_VB_EMU +SUBDIRS += vb +mednafen_LDADD += vb/libvb.a +mednafen_DEPENDENCIES += vb/libvb.a +endif + +if WANT_WSWAN_EMU +SUBDIRS += wswan +mednafen_LDADD += wswan/libwswan.a +mednafen_DEPENDENCIES += wswan/libwswan.a +endif + +if WANT_DEBUGGER +SUBDIRS += desa68 +mednafen_LDADD += desa68/libdesa68.a +mednafen_DEPENDENCIES += desa68/libdesa68.a +endif + +SUBDIRS += hw_cpu +mednafen_LDADD += hw_cpu/libmdfnhwcpu.a +mednafen_DEPENDENCIES += hw_cpu/libmdfnhwcpu.a + +SUBDIRS += hw_misc +mednafen_LDADD += hw_misc/libmdfnhwmisc.a +mednafen_DEPENDENCIES += hw_misc/libmdfnhwmisc.a + +SUBDIRS += hw_sound +mednafen_LDADD += hw_sound/libmdfnhwsound.a +mednafen_DEPENDENCIES += hw_sound/libmdfnhwsound.a + +SUBDIRS += hw_video +mednafen_LDADD += hw_video/libmdfnhwvideo.a +mednafen_DEPENDENCIES += hw_video/libmdfnhwvideo.a + +SUBDIRS += tremor mpcdec +mednafen_LDADD += tremor/libvorbisidec.a mpcdec/libmpcdec.a +mednafen_DEPENDENCIES += tremor/libvorbisidec.a mpcdec/libmpcdec.a + +include cdrom/Makefile.am.inc + + +SUBDIRS += sound +mednafen_LDADD += sound/libmdfnsound.a +mednafen_DEPENDENCIES += sound/libmdfnsound.a + +SUBDIRS += quicklz +mednafen_LDADD += quicklz/libmdfnquicklz.a +mednafen_DEPENDENCIES += quicklz/libmdfnquicklz.a + +include compress/Makefile.am.inc +include hash/Makefile.am.inc +include string/Makefile.am.inc +include video/Makefile.am.inc +include resampler/Makefile.am.inc +include cputest/Makefile.am.inc + +mednafen_LDADD += @LIBINTL@ @LIBICONV@ + diff --git a/Mednafen/mednafen/Makefile.in b/Mednafen/mednafen/Makefile.in new file mode 100644 index 0000000000..548504ce63 --- /dev/null +++ b/Mednafen/mednafen/Makefile.in @@ -0,0 +1,1287 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +bin_PROGRAMS = mednafen$(EXEEXT) +@HAVE_SDL_TRUE@am__append_1 = drivers +@HAVE_SDL_TRUE@am__append_2 = drivers/libmdfnsdl.a +@HAVE_SDL_TRUE@am__append_3 = drivers/libmdfnsdl.a +@HAVE_SDL_TRUE@@WIN32_TRUE@am__append_4 = drivers/win-resource.rc +@DOS_TRUE@am__append_5 = drivers_dos +@DOS_TRUE@am__append_6 = drivers_dos/libmdfndos.a +@DOS_TRUE@am__append_7 = drivers_dos/libmdfndos.a +@HAVE_SDL_TRUE@am__append_8 = @SDL_LIBS@ +@WANT_DEBUGGER_TRUE@am__append_9 = dis6502.cpp +@WANT_GB_EMU_TRUE@am__append_10 = gb +@WANT_GB_EMU_TRUE@am__append_11 = gb/libgb.a +@WANT_GB_EMU_TRUE@am__append_12 = gb/libgb.a +@WANT_GBA_EMU_TRUE@am__append_13 = gba +@WANT_GBA_EMU_TRUE@am__append_14 = gba/libgba.a +@WANT_GBA_EMU_TRUE@am__append_15 = gba/libgba.a +@WANT_LYNX_EMU_TRUE@am__append_16 = lynx +@WANT_LYNX_EMU_TRUE@am__append_17 = lynx/liblynx.a +@WANT_LYNX_EMU_TRUE@am__append_18 = lynx/liblynx.a +@WANT_MD_EMU_TRUE@am__append_19 = md +@WANT_MD_EMU_TRUE@am__append_20 = md/libmd.a +@WANT_MD_EMU_TRUE@am__append_21 = md/libmd.a +@WANT_NES_EMU_TRUE@am__append_22 = nes +@WANT_NES_EMU_TRUE@am__append_23 = nes/libnes.a +@WANT_NES_EMU_TRUE@am__append_24 = nes/libnes.a +@WANT_NGP_EMU_TRUE@am__append_25 = ngp +@WANT_NGP_EMU_TRUE@am__append_26 = ngp/libngp.a +@WANT_NGP_EMU_TRUE@am__append_27 = ngp/libngp.a +@WANT_PCE_EMU_TRUE@am__append_28 = pce +@WANT_PCE_EMU_TRUE@am__append_29 = pce/libpce.a +@WANT_PCE_EMU_TRUE@am__append_30 = pce/libpce.a +@WANT_PCE_FAST_EMU_TRUE@am__append_31 = pce_fast +@WANT_PCE_FAST_EMU_TRUE@am__append_32 = pce_fast/libpce_fast.a +@WANT_PCE_FAST_EMU_TRUE@am__append_33 = pce_fast/libpce_fast.a +@WANT_PCFX_EMU_TRUE@am__append_34 = pcfx +@WANT_PCFX_EMU_TRUE@am__append_35 = pcfx/libpcfx.a +@WANT_PCFX_EMU_TRUE@am__append_36 = pcfx/libpcfx.a +@WANT_PSX_EMU_TRUE@am__append_37 = psx +@WANT_PSX_EMU_TRUE@am__append_38 = psx/libpsx.a +@WANT_PSX_EMU_TRUE@am__append_39 = psx/libpsx.a +@WANT_SMS_EMU_TRUE@am__append_40 = sms +@WANT_SMS_EMU_TRUE@am__append_41 = sms/libsms.a +@WANT_SMS_EMU_TRUE@am__append_42 = sms/libsms.a +@WANT_SNES_EMU_TRUE@am__append_43 = snes +@WANT_SNES_EMU_TRUE@am__append_44 = snes/libsnes.a +@WANT_SNES_EMU_TRUE@am__append_45 = snes/libsnes.a +@WANT_SNES_FAUST_EMU_TRUE@am__append_46 = snes_faust +@WANT_SNES_FAUST_EMU_TRUE@am__append_47 = snes_faust/libsnes_faust.a +@WANT_SNES_FAUST_EMU_TRUE@am__append_48 = snes_faust/libsnes_faust.a +@WANT_VB_EMU_TRUE@am__append_49 = vb +@WANT_VB_EMU_TRUE@am__append_50 = vb/libvb.a +@WANT_VB_EMU_TRUE@am__append_51 = vb/libvb.a +@WANT_WSWAN_EMU_TRUE@am__append_52 = wswan +@WANT_WSWAN_EMU_TRUE@am__append_53 = wswan/libwswan.a +@WANT_WSWAN_EMU_TRUE@am__append_54 = wswan/libwswan.a +@WANT_DEBUGGER_TRUE@am__append_55 = desa68 +@WANT_DEBUGGER_TRUE@am__append_56 = desa68/libdesa68.a +@WANT_DEBUGGER_TRUE@am__append_57 = desa68/libdesa68.a +DIST_COMMON = $(srcdir)/cdrom/Makefile.am.inc \ + $(srcdir)/compress/Makefile.am.inc \ + $(srcdir)/hash/Makefile.am.inc \ + $(srcdir)/string/Makefile.am.inc \ + $(srcdir)/video/Makefile.am.inc \ + $(srcdir)/resampler/Makefile.am.inc \ + $(srcdir)/cputest/Makefile.am.inc $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ + $(top_srcdir)/depcomp +@HAVE_LIBSNDFILE_TRUE@am__append_58 = cdrom/CDAFReader_SF.cpp +@ARCH_X86_TRUE@am__append_59 = cputest/x86_cpu.c +@ARCH_POWERPC_TRUE@am__append_60 = cputest/ppc_cpu.c +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am__mednafen_SOURCES_DIST = debug.cpp error.cpp mempatcher.cpp \ + settings.cpp endian.cpp mednafen.cpp git.cpp file.cpp \ + general.cpp memory.cpp netplay.cpp state.cpp state_rewind.cpp \ + movie.cpp player.cpp PSFLoader.cpp SNSFLoader.cpp \ + SPCReader.cpp tests.cpp qtrecord.cpp Stream.cpp \ + MemoryStream.cpp FileStream.cpp IPSPatcher.cpp \ + drivers/win-resource.rc dis6502.cpp cdrom/cdromif.cpp \ + cdrom/scsicd.cpp cdrom/CDUtility.cpp cdrom/crc32.cpp \ + cdrom/galois.cpp cdrom/l-ec.cpp cdrom/recover-raw.cpp \ + cdrom/lec.cpp cdrom/CDAccess.cpp cdrom/CDAccess_Image.cpp \ + cdrom/CDAccess_CCD.cpp cdrom/CDAFReader.cpp \ + cdrom/CDAFReader_Vorbis.cpp cdrom/CDAFReader_MPC.cpp \ + cdrom/CDAFReader_SF.cpp compress/minilzo.c compress/ioapi.c \ + compress/unzip.c compress/GZFileStream.cpp \ + compress/ZLInflateFilter.cpp hash/md5.cpp hash/sha1.cpp \ + hash/sha256.cpp string/escape.cpp string/trim.cpp \ + string/ConvertUTF.cpp video/surface.cpp video/font-data.cpp \ + video/font-data-18x18.c video/font-data-12x13.c video/png.cpp \ + video/primitives.cpp video/text.cpp video/video.cpp \ + video/tblur.cpp video/resize.cpp video/Deinterlacer.cpp \ + resampler/resample.c cputest/cputest.c cputest/x86_cpu.c \ + cputest/ppc_cpu.c +am__dirstamp = $(am__leading_dot)dirstamp +@HAVE_SDL_TRUE@@WIN32_TRUE@am__objects_1 = \ +@HAVE_SDL_TRUE@@WIN32_TRUE@ drivers/win-resource.$(OBJEXT) +@WANT_DEBUGGER_TRUE@am__objects_2 = dis6502.$(OBJEXT) +@HAVE_LIBSNDFILE_TRUE@am__objects_3 = cdrom/CDAFReader_SF.$(OBJEXT) +@ARCH_X86_TRUE@am__objects_4 = cputest/x86_cpu.$(OBJEXT) +@ARCH_POWERPC_TRUE@am__objects_5 = cputest/ppc_cpu.$(OBJEXT) +am_mednafen_OBJECTS = debug.$(OBJEXT) error.$(OBJEXT) \ + mempatcher.$(OBJEXT) settings.$(OBJEXT) endian.$(OBJEXT) \ + mednafen.$(OBJEXT) git.$(OBJEXT) file.$(OBJEXT) \ + general.$(OBJEXT) memory.$(OBJEXT) netplay.$(OBJEXT) \ + state.$(OBJEXT) state_rewind.$(OBJEXT) movie.$(OBJEXT) \ + player.$(OBJEXT) PSFLoader.$(OBJEXT) SNSFLoader.$(OBJEXT) \ + SPCReader.$(OBJEXT) tests.$(OBJEXT) qtrecord.$(OBJEXT) \ + Stream.$(OBJEXT) MemoryStream.$(OBJEXT) FileStream.$(OBJEXT) \ + IPSPatcher.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ + cdrom/cdromif.$(OBJEXT) cdrom/scsicd.$(OBJEXT) \ + cdrom/CDUtility.$(OBJEXT) cdrom/crc32.$(OBJEXT) \ + cdrom/galois.$(OBJEXT) cdrom/l-ec.$(OBJEXT) \ + cdrom/recover-raw.$(OBJEXT) cdrom/lec.$(OBJEXT) \ + cdrom/CDAccess.$(OBJEXT) cdrom/CDAccess_Image.$(OBJEXT) \ + cdrom/CDAccess_CCD.$(OBJEXT) cdrom/CDAFReader.$(OBJEXT) \ + cdrom/CDAFReader_Vorbis.$(OBJEXT) \ + cdrom/CDAFReader_MPC.$(OBJEXT) $(am__objects_3) \ + compress/minilzo.$(OBJEXT) compress/ioapi.$(OBJEXT) \ + compress/unzip.$(OBJEXT) compress/GZFileStream.$(OBJEXT) \ + compress/ZLInflateFilter.$(OBJEXT) hash/md5.$(OBJEXT) \ + hash/sha1.$(OBJEXT) hash/sha256.$(OBJEXT) \ + string/escape.$(OBJEXT) string/trim.$(OBJEXT) \ + string/ConvertUTF.$(OBJEXT) video/surface.$(OBJEXT) \ + video/font-data.$(OBJEXT) video/font-data-18x18.$(OBJEXT) \ + video/font-data-12x13.$(OBJEXT) video/png.$(OBJEXT) \ + video/primitives.$(OBJEXT) video/text.$(OBJEXT) \ + video/video.$(OBJEXT) video/tblur.$(OBJEXT) \ + video/resize.$(OBJEXT) video/Deinterlacer.$(OBJEXT) \ + resampler/resample.$(OBJEXT) cputest/cputest.$(OBJEXT) \ + $(am__objects_4) $(am__objects_5) +mednafen_OBJECTS = $(am_mednafen_OBJECTS) +am__DEPENDENCIES_1 = +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(mednafen_SOURCES) +DIST_SOURCES = $(am__mednafen_SOURCES_DIST) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = trio drivers drivers_dos sexyal cdplay demo gb gba lynx \ + md nes ngp pce pce_fast pcfx psx sms snes snes_faust vb wswan \ + desa68 hw_cpu hw_misc hw_sound hw_video tremor mpcdec sound \ + quicklz +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = trio $(am__append_1) $(am__append_5) sexyal cdplay demo \ + $(am__append_10) $(am__append_13) $(am__append_16) \ + $(am__append_19) $(am__append_22) $(am__append_25) \ + $(am__append_28) $(am__append_31) $(am__append_34) \ + $(am__append_37) $(am__append_40) $(am__append_43) \ + $(am__append_46) $(am__append_49) $(am__append_52) \ + $(am__append_55) hw_cpu hw_misc hw_sound hw_video tremor \ + mpcdec sound quicklz +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +mednafen_SOURCES = debug.cpp error.cpp mempatcher.cpp settings.cpp \ + endian.cpp mednafen.cpp git.cpp file.cpp general.cpp \ + memory.cpp netplay.cpp state.cpp state_rewind.cpp movie.cpp \ + player.cpp PSFLoader.cpp SNSFLoader.cpp SPCReader.cpp \ + tests.cpp qtrecord.cpp Stream.cpp MemoryStream.cpp \ + FileStream.cpp IPSPatcher.cpp $(am__append_4) $(am__append_9) \ + cdrom/cdromif.cpp cdrom/scsicd.cpp cdrom/CDUtility.cpp \ + cdrom/crc32.cpp cdrom/galois.cpp cdrom/l-ec.cpp \ + cdrom/recover-raw.cpp cdrom/lec.cpp cdrom/CDAccess.cpp \ + cdrom/CDAccess_Image.cpp cdrom/CDAccess_CCD.cpp \ + cdrom/CDAFReader.cpp cdrom/CDAFReader_Vorbis.cpp \ + cdrom/CDAFReader_MPC.cpp $(am__append_58) compress/minilzo.c \ + compress/ioapi.c compress/unzip.c compress/GZFileStream.cpp \ + compress/ZLInflateFilter.cpp hash/md5.cpp hash/sha1.cpp \ + hash/sha256.cpp string/escape.cpp string/trim.cpp \ + string/ConvertUTF.cpp video/surface.cpp video/font-data.cpp \ + video/font-data-18x18.c video/font-data-12x13.c video/png.cpp \ + video/primitives.cpp video/text.cpp video/video.cpp \ + video/tblur.cpp video/resize.cpp video/Deinterlacer.cpp \ + resampler/resample.c cputest/cputest.c $(am__append_59) \ + $(am__append_60) +mednafen_LDADD = trio/libtrio.a $(am__append_2) $(am__append_6) \ + sexyal/libsexyal.a $(am__append_8) cdplay/libcdplay.a \ + demo/libdemo.a $(am__append_11) $(am__append_14) \ + $(am__append_17) $(am__append_20) $(am__append_23) \ + $(am__append_26) $(am__append_29) $(am__append_32) \ + $(am__append_35) $(am__append_38) $(am__append_41) \ + $(am__append_44) $(am__append_47) $(am__append_50) \ + $(am__append_53) $(am__append_56) hw_cpu/libmdfnhwcpu.a \ + hw_misc/libmdfnhwmisc.a hw_sound/libmdfnhwsound.a \ + hw_video/libmdfnhwvideo.a tremor/libvorbisidec.a \ + mpcdec/libmpcdec.a sound/libmdfnsound.a \ + quicklz/libmdfnquicklz.a @LIBINTL@ @LIBICONV@ +mednafen_DEPENDENCIES = trio/libtrio.a $(am__append_3) $(am__append_7) \ + sexyal/libsexyal.a cdplay/libcdplay.a demo/libdemo.a \ + $(am__append_12) $(am__append_15) $(am__append_18) \ + $(am__append_21) $(am__append_24) $(am__append_27) \ + $(am__append_30) $(am__append_33) $(am__append_36) \ + $(am__append_39) $(am__append_42) $(am__append_45) \ + $(am__append_48) $(am__append_51) $(am__append_54) \ + $(am__append_57) hw_cpu/libmdfnhwcpu.a hw_misc/libmdfnhwmisc.a \ + hw_sound/libmdfnhwsound.a hw_video/libmdfnhwvideo.a \ + tremor/libvorbisidec.a mpcdec/libmpcdec.a sound/libmdfnsound.a \ + quicklz/libmdfnquicklz.a +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .o .obj .rc +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/cdrom/Makefile.am.inc $(srcdir)/compress/Makefile.am.inc $(srcdir)/hash/Makefile.am.inc $(srcdir)/string/Makefile.am.inc $(srcdir)/video/Makefile.am.inc $(srcdir)/resampler/Makefile.am.inc $(srcdir)/cputest/Makefile.am.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/cdrom/Makefile.am.inc $(srcdir)/compress/Makefile.am.inc $(srcdir)/hash/Makefile.am.inc $(srcdir)/string/Makefile.am.inc $(srcdir)/video/Makefile.am.inc $(srcdir)/resampler/Makefile.am.inc $(srcdir)/cputest/Makefile.am.inc: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +drivers/$(am__dirstamp): + @$(MKDIR_P) drivers + @: > drivers/$(am__dirstamp) +drivers/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) drivers/$(DEPDIR) + @: > drivers/$(DEPDIR)/$(am__dirstamp) +drivers/win-resource.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +cdrom/$(am__dirstamp): + @$(MKDIR_P) cdrom + @: > cdrom/$(am__dirstamp) +cdrom/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) cdrom/$(DEPDIR) + @: > cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/cdromif.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/scsicd.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDUtility.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/crc32.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/galois.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/l-ec.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/recover-raw.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/lec.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAccess.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAccess_Image.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAccess_CCD.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAFReader.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAFReader_Vorbis.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAFReader_MPC.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +cdrom/CDAFReader_SF.$(OBJEXT): cdrom/$(am__dirstamp) \ + cdrom/$(DEPDIR)/$(am__dirstamp) +compress/$(am__dirstamp): + @$(MKDIR_P) compress + @: > compress/$(am__dirstamp) +compress/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) compress/$(DEPDIR) + @: > compress/$(DEPDIR)/$(am__dirstamp) +compress/minilzo.$(OBJEXT): compress/$(am__dirstamp) \ + compress/$(DEPDIR)/$(am__dirstamp) +compress/ioapi.$(OBJEXT): compress/$(am__dirstamp) \ + compress/$(DEPDIR)/$(am__dirstamp) +compress/unzip.$(OBJEXT): compress/$(am__dirstamp) \ + compress/$(DEPDIR)/$(am__dirstamp) +compress/GZFileStream.$(OBJEXT): compress/$(am__dirstamp) \ + compress/$(DEPDIR)/$(am__dirstamp) +compress/ZLInflateFilter.$(OBJEXT): compress/$(am__dirstamp) \ + compress/$(DEPDIR)/$(am__dirstamp) +hash/$(am__dirstamp): + @$(MKDIR_P) hash + @: > hash/$(am__dirstamp) +hash/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) hash/$(DEPDIR) + @: > hash/$(DEPDIR)/$(am__dirstamp) +hash/md5.$(OBJEXT): hash/$(am__dirstamp) \ + hash/$(DEPDIR)/$(am__dirstamp) +hash/sha1.$(OBJEXT): hash/$(am__dirstamp) \ + hash/$(DEPDIR)/$(am__dirstamp) +hash/sha256.$(OBJEXT): hash/$(am__dirstamp) \ + hash/$(DEPDIR)/$(am__dirstamp) +string/$(am__dirstamp): + @$(MKDIR_P) string + @: > string/$(am__dirstamp) +string/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) string/$(DEPDIR) + @: > string/$(DEPDIR)/$(am__dirstamp) +string/escape.$(OBJEXT): string/$(am__dirstamp) \ + string/$(DEPDIR)/$(am__dirstamp) +string/trim.$(OBJEXT): string/$(am__dirstamp) \ + string/$(DEPDIR)/$(am__dirstamp) +string/ConvertUTF.$(OBJEXT): string/$(am__dirstamp) \ + string/$(DEPDIR)/$(am__dirstamp) +video/$(am__dirstamp): + @$(MKDIR_P) video + @: > video/$(am__dirstamp) +video/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) video/$(DEPDIR) + @: > video/$(DEPDIR)/$(am__dirstamp) +video/surface.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/font-data.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/font-data-18x18.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/font-data-12x13.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/png.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/primitives.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/text.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/video.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/tblur.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/resize.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +video/Deinterlacer.$(OBJEXT): video/$(am__dirstamp) \ + video/$(DEPDIR)/$(am__dirstamp) +resampler/$(am__dirstamp): + @$(MKDIR_P) resampler + @: > resampler/$(am__dirstamp) +resampler/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) resampler/$(DEPDIR) + @: > resampler/$(DEPDIR)/$(am__dirstamp) +resampler/resample.$(OBJEXT): resampler/$(am__dirstamp) \ + resampler/$(DEPDIR)/$(am__dirstamp) +cputest/$(am__dirstamp): + @$(MKDIR_P) cputest + @: > cputest/$(am__dirstamp) +cputest/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) cputest/$(DEPDIR) + @: > cputest/$(DEPDIR)/$(am__dirstamp) +cputest/cputest.$(OBJEXT): cputest/$(am__dirstamp) \ + cputest/$(DEPDIR)/$(am__dirstamp) +cputest/x86_cpu.$(OBJEXT): cputest/$(am__dirstamp) \ + cputest/$(DEPDIR)/$(am__dirstamp) +cputest/ppc_cpu.$(OBJEXT): cputest/$(am__dirstamp) \ + cputest/$(DEPDIR)/$(am__dirstamp) + +mednafen$(EXEEXT): $(mednafen_OBJECTS) $(mednafen_DEPENDENCIES) $(EXTRA_mednafen_DEPENDENCIES) + @rm -f mednafen$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(mednafen_OBJECTS) $(mednafen_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f cdrom/*.$(OBJEXT) + -rm -f compress/*.$(OBJEXT) + -rm -f cputest/*.$(OBJEXT) + -rm -f drivers/*.$(OBJEXT) + -rm -f hash/*.$(OBJEXT) + -rm -f resampler/*.$(OBJEXT) + -rm -f string/*.$(OBJEXT) + -rm -f video/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/FileStream.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/IPSPatcher.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/MemoryStream.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PSFLoader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SNSFLoader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SPCReader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Stream.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dis6502.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/endian.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/general.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/git.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mednafen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempatcher.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/movie.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netplay.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/player.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qtrecord.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state_rewind.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tests.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAFReader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAFReader_MPC.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAFReader_SF.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAFReader_Vorbis.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAccess.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAccess_CCD.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDAccess_Image.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/CDUtility.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/cdromif.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/crc32.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/galois.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/l-ec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/lec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/recover-raw.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cdrom/$(DEPDIR)/scsicd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@compress/$(DEPDIR)/GZFileStream.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@compress/$(DEPDIR)/ZLInflateFilter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@compress/$(DEPDIR)/ioapi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@compress/$(DEPDIR)/minilzo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@compress/$(DEPDIR)/unzip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cputest/$(DEPDIR)/cputest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cputest/$(DEPDIR)/ppc_cpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cputest/$(DEPDIR)/x86_cpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@hash/$(DEPDIR)/md5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@hash/$(DEPDIR)/sha1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@hash/$(DEPDIR)/sha256.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@resampler/$(DEPDIR)/resample.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@string/$(DEPDIR)/ConvertUTF.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@string/$(DEPDIR)/escape.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@string/$(DEPDIR)/trim.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/Deinterlacer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/font-data-12x13.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/font-data-18x18.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/font-data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/png.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/primitives.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/resize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/surface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/tblur.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/text.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@video/$(DEPDIR)/video.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(PROGRAMS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f cdrom/$(DEPDIR)/$(am__dirstamp) + -rm -f cdrom/$(am__dirstamp) + -rm -f compress/$(DEPDIR)/$(am__dirstamp) + -rm -f compress/$(am__dirstamp) + -rm -f cputest/$(DEPDIR)/$(am__dirstamp) + -rm -f cputest/$(am__dirstamp) + -rm -f drivers/$(DEPDIR)/$(am__dirstamp) + -rm -f drivers/$(am__dirstamp) + -rm -f hash/$(DEPDIR)/$(am__dirstamp) + -rm -f hash/$(am__dirstamp) + -rm -f resampler/$(DEPDIR)/$(am__dirstamp) + -rm -f resampler/$(am__dirstamp) + -rm -f string/$(DEPDIR)/$(am__dirstamp) + -rm -f string/$(am__dirstamp) + -rm -f video/$(DEPDIR)/$(am__dirstamp) + -rm -f video/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) cdrom/$(DEPDIR) compress/$(DEPDIR) cputest/$(DEPDIR) hash/$(DEPDIR) resampler/$(DEPDIR) string/$(DEPDIR) video/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) cdrom/$(DEPDIR) compress/$(DEPDIR) cputest/$(DEPDIR) hash/$(DEPDIR) resampler/$(DEPDIR) string/$(DEPDIR) video/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: $(am__recursive_targets) install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ + check-am clean clean-binPROGRAMS clean-generic clean-libtool \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS + + +# +# Resource file wasn't linking in properly when it was in an archive, so we resort to this! +# +@HAVE_SDL_TRUE@@WIN32_TRUE@.rc.o: +@HAVE_SDL_TRUE@@WIN32_TRUE@ @WINDRES@ -o $@ $< + +#if ARCH_ARM +#mednafen_SOURCES += cputest/arm_cpu.c +#endif + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/MemoryStream.cpp b/Mednafen/mednafen/MemoryStream.cpp new file mode 100644 index 0000000000..d03ff26637 --- /dev/null +++ b/Mednafen/mednafen/MemoryStream.cpp @@ -0,0 +1,330 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "MemoryStream.h" +#include +#include + +/* + TODO: Copy and assignment constructor fixes. + + Proper negative position behavior? +*/ + +MemoryStream::MemoryStream() : data_buffer(NULL), data_buffer_size(0), data_buffer_alloced(0), position(0) +{ + data_buffer_size = 0; + data_buffer_alloced = 64; + if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); +} + +MemoryStream::MemoryStream(uint64 alloc_hint, int alloc_hint_is_size) : data_buffer(NULL), data_buffer_size(0), data_buffer_alloced(0), position(0) +{ + if(alloc_hint_is_size != 0) + { + data_buffer_size = alloc_hint; + data_buffer_alloced = alloc_hint; + + if(alloc_hint > SIZE_MAX) + throw MDFN_Error(ErrnoHolder(ENOMEM)); + } + else + { + data_buffer_size = 0; + data_buffer_alloced = (alloc_hint > SIZE_MAX) ? SIZE_MAX : alloc_hint; + } + + if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + + if(alloc_hint_is_size > 0) + memset(data_buffer, 0, data_buffer_size); +} + +MemoryStream::MemoryStream(Stream *stream, uint64 size_limit) : data_buffer(NULL), data_buffer_size(0), data_buffer_alloced(0), position(0) +{ + try + { + if((position = stream->tell()) != 0) + stream->seek(0, SEEK_SET); + + void* tp; + data_buffer_size = data_buffer_alloced = stream->alloc_and_read(&tp, size_limit); + data_buffer = (uint8*)tp; + stream->close(); + } + catch(...) + { + if(data_buffer) + { + free(data_buffer); + data_buffer = NULL; + } + + delete stream; + throw; + } + delete stream; +} + +MemoryStream::MemoryStream(const MemoryStream &zs) +{ + data_buffer_size = zs.data_buffer_size; + data_buffer_alloced = zs.data_buffer_alloced; + if(!(data_buffer = (uint8*)malloc(data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + + memcpy(data_buffer, zs.data_buffer, data_buffer_size); + + position = zs.position; +} + +#if 0 +MemoryStream & MemoryStream::operator=(const MemoryStream &zs) +{ + if(this != &zs) + { + if(data_buffer) + { + free(data_buffer); + data_buffer = NULL; + } + + data_buffer_size = zs.data_buffer_size; + data_buffer_alloced = zs.data_buffer_alloced; + + if(!(data_buffer = (uint8*)malloc(data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + + memcpy(data_buffer, zs.data_buffer, data_buffer_size); + + position = zs.position; + } + return(*this); +} +#endif + +MemoryStream::~MemoryStream() +{ + close(); +} + +uint64 MemoryStream::attributes(void) +{ + return (ATTRIBUTE_READABLE | ATTRIBUTE_WRITEABLE | ATTRIBUTE_SEEKABLE); +} + + +uint8 *MemoryStream::map(void) noexcept +{ + return data_buffer; +} + +uint64 MemoryStream::map_size(void) noexcept +{ + return data_buffer_size; +} + +void MemoryStream::unmap(void) noexcept +{ + +} + + +INLINE void MemoryStream::grow_if_necessary(uint64 new_required_size, uint64 hole_end) +{ + if(new_required_size > data_buffer_size) + { + const uint64 old_data_buffer_size = data_buffer_size; + + if(new_required_size > data_buffer_alloced) + { + uint64 new_required_alloced = round_up_pow2(new_required_size); + uint8 *new_data_buffer; + + // first condition will happen at new_required_size > (1ULL << 63) due to round_up_pow2() "wrapping". + // second condition can occur when running on a 32-bit system. + if(new_required_alloced < new_required_size || new_required_alloced > SIZE_MAX) + new_required_alloced = SIZE_MAX; + + // If constrained alloc size isn't enough, throw an out-of-memory/address-space type error. + if(new_required_alloced < new_required_size) + throw MDFN_Error(ErrnoHolder(ENOMEM)); + + if(!(new_data_buffer = (uint8*)realloc(data_buffer, new_required_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + + // + // Assign all in one go after the realloc() so we don't leave our object in an inconsistent state if the realloc() fails. + // + data_buffer = new_data_buffer; + data_buffer_size = new_required_size; + data_buffer_alloced = new_required_alloced; + } + else + data_buffer_size = new_required_size; + + if(hole_end > old_data_buffer_size) + memset(data_buffer + old_data_buffer_size, 0, hole_end - old_data_buffer_size); + } +} + +void MemoryStream::shrink_to_fit(void) noexcept +{ + if(data_buffer_alloced > data_buffer_size) + { + uint8 *new_data_buffer; + + new_data_buffer = (uint8*)realloc(data_buffer, data_buffer_size); + + if(new_data_buffer != NULL) + { + data_buffer = new_data_buffer; + data_buffer_alloced = data_buffer_size; + } + } +} + +uint64 MemoryStream::read(void *data, uint64 count, bool error_on_eos) +{ + //printf("%llu %llu %llu\n", position, count, data_buffer_size); + + if(count > data_buffer_size) + { + if(error_on_eos) + throw MDFN_Error(0, _("Unexpected EOF")); + + count = data_buffer_size; + } + + if(position > (data_buffer_size - count)) + { + if(error_on_eos) + throw MDFN_Error(0, _("Unexpected EOF")); + + if(data_buffer_size > position) + count = data_buffer_size - position; + else + count = 0; + } + + memmove(data, &data_buffer[position], count); + position += count; + + return count; +} + +void MemoryStream::write(const void *data, uint64 count) +{ + uint64 nrs = position + count; + + if(nrs < position) + throw MDFN_Error(ErrnoHolder(EFBIG)); + + grow_if_necessary(nrs, position); + + memmove(&data_buffer[position], data, count); + position += count; +} + +// +// Don't add code to reduce the amount of memory allocated(when possible) without providing a +// per-stream setting to disable that behavior. +// +void MemoryStream::truncate(uint64 length) +{ + grow_if_necessary(length, length); + + data_buffer_size = length; +} + +void MemoryStream::seek(int64 offset, int whence) +{ + uint64 new_position; + + switch(whence) + { + default: + throw MDFN_Error(ErrnoHolder(EINVAL)); + break; + + case SEEK_SET: + new_position = offset; + break; + + case SEEK_CUR: + new_position = position + offset; + break; + + case SEEK_END: + new_position = data_buffer_size + offset; + break; + } + + if(new_position < 0) + throw MDFN_Error(ErrnoHolder(EINVAL)); + + position = new_position; +} + +uint64 MemoryStream::tell(void) +{ + return position; +} + +uint64 MemoryStream::size(void) +{ + return data_buffer_size; +} + +void MemoryStream::flush(void) +{ + +} + +void MemoryStream::close(void) +{ + if(data_buffer) + { + free(data_buffer); + data_buffer = NULL; + } + + data_buffer_size = 0; + data_buffer_alloced = 0; + position = 0; +} + + +int MemoryStream::get_line(std::string &str) +{ + str.clear(); // or str.resize(0)?? + + while((uint64)position < data_buffer_size) + { + uint8 c = data_buffer[position++]; + + if(c == '\r' || c == '\n' || c == 0) + return(c); + + str.push_back(c); // Should be faster than str.append(1, c) + } + + return(str.length() ? 256 : -1); +} + diff --git a/Mednafen/mednafen/MemoryStream.h b/Mednafen/mednafen/MemoryStream.h new file mode 100644 index 0000000000..2c0531a235 --- /dev/null +++ b/Mednafen/mednafen/MemoryStream.h @@ -0,0 +1,77 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Notes: + For performance reasons(like in the state rewinding code), we should try to make sure map() + returns a pointer that is aligned to at least what malloc()/realloc() provides. + (And maybe forcefully align it to at least 16 bytes in the future) +*/ + +#ifndef __MDFN_MEMORYSTREAM_H +#define __MDFN_MEMORYSTREAM_H + +#include "Stream.h" + +class MemoryStream : public Stream +{ + public: + + MemoryStream(); + MemoryStream(uint64 alloc_hint, int alloc_hint_is_size = false); // Pass -1 instead of 1 for alloc_hint_is_size to skip initialization of the memory. + MemoryStream(Stream *stream, uint64 size_limit = ~(uint64)0); + // Will create a MemoryStream equivalent of the contents of "stream", and then "delete stream". + // Will only work if stream->tell() == 0, or if "stream" is seekable. + // stream will be deleted even if this constructor throws. + // + // Will throw an exception if the initial size() of the MemoryStream would be greater than size_limit(useful for when passing + // in GZFileStream streams). + + MemoryStream(const MemoryStream &zs); + MemoryStream & operator=(const MemoryStream &zs); + + virtual ~MemoryStream() override; + + virtual uint64 attributes(void) override; + + virtual uint8 *map(void) noexcept override; + virtual uint64 map_size(void) noexcept override; + virtual void unmap(void) noexcept override; + + virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) override; + virtual void write(const void *data, uint64 count) override; + virtual void truncate(uint64 length) override; + virtual void seek(int64 offset, int whence) override; + virtual uint64 tell(void) override; + virtual uint64 size(void) override; + virtual void flush(void) override; + virtual void close(void) override; + + virtual int get_line(std::string &str) override; + + void shrink_to_fit(void) noexcept; // Minimizes alloced memory. + + private: + uint8 *data_buffer; + uint64 data_buffer_size; + uint64 data_buffer_alloced; + + uint64 position; + + void grow_if_necessary(uint64 new_required_size, uint64 hole_end); +}; +#endif diff --git a/Mednafen/mednafen/PSFLoader.cpp b/Mednafen/mednafen/PSFLoader.cpp new file mode 100644 index 0000000000..db01bd8fda --- /dev/null +++ b/Mednafen/mednafen/PSFLoader.cpp @@ -0,0 +1,334 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + TODO: + Time string parsing convenience functions. + + Character set autodetect heuristics and conversion for when the "utf8" tag is missing. +*/ +#include "mednafen.h" +#include +#include +#include "PSFLoader.h" +#include "endian.h" +#include "general.h" +#include "string/trim.h" + +#include +#include +#include +//#include + +#include + +PSFTags::PSFTags() +{ + + +} + +PSFTags::~PSFTags() +{ + +} + +void PSFTags::AddTag(char *tag_line) +{ + char *eq; + + // Transform 0x01-0x1F -> 0x20 + for(unsigned int i = 0; i < strlen(tag_line); i++) + if((unsigned char)tag_line[i] < 0x20) + tag_line[i] = 0x20; + + eq = strchr(tag_line, '='); + + if(eq) + { + *eq = 0; + + MDFN_trim(tag_line); + MDFN_trim(eq + 1); + + for(unsigned int i = 0; i < strlen(tag_line); i++) + tag_line[i] = tolower(tag_line[i]); + + if(TagExists(tag_line)) + tags[tag_line] = tags[std::string(tag_line)] + std::string(1, '\n') + std::string(eq + 1); + else + tags[tag_line] = std::string(eq + 1); + } +} + +#if 0 +static const char *DetectCharset(const uint8 *data, const uint32 data_size) +{ + static const char *TestCharsets[] = { "UTF-8", /*"SJIS",*/ "WINDOWS-1252" }; + + for(unsigned int i = 0; i < sizeof(TestCharsets) / sizeof(TestCharsets[0]); i++) + { + iconv_t cd; + + cd = iconv_open("UTF-32", TestCharsets[i]); + if(cd != (iconv_t)-1) + { + size_t in_len = data_size; + size_t out_len = data_size * 4 + 4; + char *in_ptr = (char *)data; + char *const out_ptr_mem = new char[out_len]; + char *out_ptr = out_ptr_mem; + + if(iconv(cd, (ICONV_CONST char **)&in_ptr, &in_len, &out_ptr, &out_len) != (size_t)-1) + { + delete[] out_ptr_mem; + return(TestCharsets[i]); + } + delete[] out_ptr_mem; + } + } + + return(NULL); +} +#endif + +void PSFTags::LoadTags(Stream* fp) +{ + uint64 size = fp->size() - fp->tell(); + std::vector tags_heap; + char *data; + char *spos; + //const char *detected_charset = DetectCharset(data_in, size); + + tags_heap.resize(size + 1); + tags_heap[size] = 0; + + fp->read(&tags_heap[0], size); + + data = &tags_heap[0]; + spos = data; + + while(size) + { + if(*data == 0x0A || *data == 0x00) + { + *data = 0; + + if(data - spos) + { + if(*(data - 1) == 0xD) // handle \r + *(data - 1) = 0; + + AddTag(spos); + } + + spos = data + 1; // Skip \n for next tag + } + + size--; + data++; + } + +} + +int64 PSFTags::GetTagI(const char *name) +{ + std::map::iterator it; + + it = tags.find(name); + if(it != tags.end()) + { + long long ret = 0; + std::string &tmp = tags[name]; + + trio_sscanf(tmp.c_str(), "%lld", &ret); + + return(ret); + } + return(0); // INT64_MIN +} + +bool PSFTags::TagExists(const char *name) +{ + if(tags.find(name) != tags.end()) + return(true); + + return(false); +} + + +std::string PSFTags::GetTag(const char *name) +{ + std::map::iterator it; + + it = tags.find(name); + + if(it != tags.end()) + return(it->second); + + return(""); +} + +void PSFTags::EraseTag(const char *name) +{ + std::map::iterator it; + + it = tags.find(name); + if(it != tags.end()) + tags.erase(it); +} + +PSFLoader::PSFLoader() +{ + + +} + +PSFLoader::~PSFLoader() +{ + + +} + +bool PSFLoader::TestMagic(uint8 version, Stream* fp) +{ + uint8 buf[3 + 1 + 4 + 4 + 4]; + uint64 rc; + + rc = fp->read(buf, sizeof(buf), false); + fp->rewind(); + + if(rc != sizeof(buf)) + return(false); + + if(memcmp(buf, "PSF", 3)) + return(false); + + if(buf[3] != version) + return(false); + + return(true); +} + +PSFTags PSFLoader::LoadInternal(uint8 version, uint32 max_exe_size, Stream *fp, uint32 level, bool force_ignore_pcsp) +{ + uint32 reserved_size, compressed_size, compressed_crc32; + bool _lib_present = false; + PSFTags tags; + uint8 raw_header[16]; + + fp->read(raw_header, 16); + + if(memcmp(raw_header, "PSF", 3) || raw_header[3] != version) + throw(MDFN_Error(0, _("Not a PSF(version=0x%02x) file!"), version)); + + reserved_size = MDFN_de32lsb(&raw_header[4]); + compressed_size = MDFN_de32lsb(&raw_header[8]); + compressed_crc32 = MDFN_de32lsb(&raw_header[12]); + + (void)compressed_crc32; + + // + // Load tags. + // + { + uint8 theader[5]; + + fp->seek(16 + reserved_size + compressed_size); + + if(fp->read(theader, 5, false) == 5 && !memcmp(theader, "[TAG]", 5)) + tags.LoadTags(fp); + } + + // + // Handle minipsf simple _lib + // + if(level < 15) + { + if(tags.TagExists("_lib")) + { + std::string tp = tags.GetTag("_lib"); + + if(!MDFN_IsFIROPSafe(tp)) + { + throw(MDFN_Error(0, _("Referenced path \"%s\" is potentially unsafe. See \"filesys.untrusted_fip_check\" setting."), tp.c_str())); + } + + FileStream subfile(MDFN_MakeFName(MDFNMKF_AUX, 0, tp.c_str()).c_str(), FileStream::MODE_READ); + + LoadInternal(version, max_exe_size, &subfile, level + 1); + + _lib_present = true; + } + } + + // + // Handle reserved section. + // + { + fp->seek(16); + HandleReserved(fp, reserved_size); + } + + // + // Handle compressed EXE section + // + { + fp->seek(16 + reserved_size); + ZLInflateFilter ifs(fp, ZLInflateFilter::FORMAT::ZLIB, compressed_size); + HandleEXE(&ifs, force_ignore_pcsp | _lib_present); + } + + // + // handle libN + // + if(level < 15) + { + for(unsigned int n = 2; n <= INT_MAX; n++) + { + char tmpbuf[32]; + + trio_snprintf(tmpbuf, 32, "_lib%d", (int)n); + + if(tags.TagExists(tmpbuf)) + { + FileStream subfile(MDFN_MakeFName(MDFNMKF_AUX, 0, tags.GetTag(tmpbuf).c_str()).c_str(), FileStream::MODE_READ); + + LoadInternal(version, max_exe_size, &subfile, level + 1, true); + } + else + break; + } + } + + return(tags); +} + +PSFTags PSFLoader::Load(uint8 version, uint32 max_exe_size, Stream* fp) +{ + return(LoadInternal(version, max_exe_size, fp, 0, false)); +} + +void PSFLoader::HandleReserved(Stream* fp, uint32 len) +{ + fp->seek(SEEK_CUR, len); +} + +void PSFLoader::HandleEXE(Stream* fp, bool ignore_pcsp) +{ + +} + diff --git a/Mednafen/mednafen/PSFLoader.h b/Mednafen/mednafen/PSFLoader.h new file mode 100644 index 0000000000..089ff70020 --- /dev/null +++ b/Mednafen/mednafen/PSFLoader.h @@ -0,0 +1,51 @@ +#ifndef __MDFN_PSFLOADER_H +#define __MDFN_PSFLOADER_H + +#include + +#include +#include +#include +#include + +class PSFTags +{ + public: + + PSFTags(); + ~PSFTags(); + + int64 GetTagI(const char *name); + std::string GetTag(const char *name); + bool TagExists(const char *name); + + void LoadTags(Stream* fp); + void EraseTag(const char *name); + + + private: + + void AddTag(char *tag_line); + std::map tags; +}; + +class PSFLoader +{ + public: + PSFLoader(); + virtual ~PSFLoader(); + + static bool TestMagic(uint8 version, Stream *fp); + + PSFTags Load(uint8 version, uint32 max_exe_size, Stream *fp); + + virtual void HandleReserved(Stream* fp, uint32 len); + virtual void HandleEXE(Stream* fp, bool ignore_pcsp = false); + + private: + + PSFTags LoadInternal(uint8 version, uint32 max_exe_size, Stream *fp, uint32 level, bool force_ignore_pcsp = false); +}; + + +#endif diff --git a/Mednafen/mednafen/SNSFLoader.cpp b/Mednafen/mednafen/SNSFLoader.cpp new file mode 100644 index 0000000000..42476cafe1 --- /dev/null +++ b/Mednafen/mednafen/SNSFLoader.cpp @@ -0,0 +1,131 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include + +bool SNSFLoader::TestMagic(Stream* fp) +{ + return PSFLoader::TestMagic(0x23, fp); +} + +SNSFLoader::SNSFLoader(Stream *fp) +{ + tags = Load(0x23, 8 + 1024 * 8192, fp); + + assert(ROM_Data.size() <= 8192 * 1024); +} + +SNSFLoader::~SNSFLoader() +{ + +} + +void SNSFLoader::HandleReserved(Stream* fp, uint32 len) +{ + uint64 bound_pos = fp->tell() + len; + + if(len < 9) + return; + + while(fp->tell() < bound_pos) + { + uint8 raw_header[8]; + uint32 header_type; + uint32 header_size; + + fp->read(raw_header, sizeof(raw_header)); + + header_type = MDFN_de32lsb(&raw_header[0]); + header_size = MDFN_de32lsb(&raw_header[4]); + + switch(header_type) + { + case 0xFFFFFFFF: // EOR + goto Breakout; + + default: + throw MDFN_Error(0, _("SNSF Reserved Section Unknown/Unsupported Data Type 0x%08x"), header_type); + break; + + case 0: // SRAM + { + uint8 raw_subheader[4]; + uint32 srd_offset, srd_size; + + fp->read(raw_subheader, sizeof(raw_subheader)); + + srd_offset = MDFN_de32lsb(&raw_subheader[0]); + srd_size = header_size - 4; + + if(srd_size > 0x20000) + { + throw MDFN_Error(0, _("SNSF Reserved Section SRAM block size(=%u) is too large."), srd_size); + } + + if(((uint64)srd_offset + srd_size) > 0x20000) + { + throw MDFN_Error(0, _("SNSF Reserved Section SRAM block combined offset+size(=%llu) is too large."), (unsigned long long)srd_offset + srd_size); + } + + MDFN_printf("SNSF SRAM Data(not implemented yet): Offset=0x%08x, Size=0x%08x\n", srd_offset, srd_size); + //printf("%d\n", bSNES_v059::memory::cartram.size()); + fp->seek(srd_size, SEEK_CUR); + } + break; + } + } + + Breakout:; + + if(fp->tell() != bound_pos) + throw MDFN_Error(0, _("Malformed SNSF reserved section.")); +} + + +void SNSFLoader::HandleEXE(Stream* fp, bool ignore_pcsp) +{ + uint8 raw_header[8]; + + fp->read(raw_header, sizeof(raw_header)); + + const uint32 header_offset = MDFN_de32lsb(&raw_header[0]); + const uint32 header_size = MDFN_de32lsb(&raw_header[4]); + + MDFN_printf("SNSF ROM Data: SNSF_Offset=0x%08x Size=0x%08x\n", header_offset, header_size); + + if(header_offset > (1024 * 8192)) + { + throw MDFN_Error(0, _("SNSF Header Field Offset(=%u) is too large."), header_offset); + } + + if(header_size > (1024 * 8192)) + { + throw MDFN_Error(0, _("SNSF Header Field Size(=%u) is too large."), header_size); + } + + if(((uint64)header_offset + header_size) > (1024 * 8192)) + { + throw MDFN_Error(0, _("SNSF Combined Header Fields Offset(=%u) + Size(=%u) is too large."), header_offset, header_size); + } + + if((header_offset + header_size) > ROM_Data.size()) + ROM_Data.truncate(header_offset + header_size); + + fp->read(&ROM_Data.map()[header_offset], header_size); +} + diff --git a/Mednafen/mednafen/SNSFLoader.h b/Mednafen/mednafen/SNSFLoader.h new file mode 100644 index 0000000000..214a3c23d6 --- /dev/null +++ b/Mednafen/mednafen/SNSFLoader.h @@ -0,0 +1,25 @@ +#ifndef __MDFN_SNSFLOADER_H +#define __MDFN_SNSFLOADER_H + +#include +#include + +class SNSFLoader : public PSFLoader +{ + public: + + SNSFLoader(Stream *fp); + virtual ~SNSFLoader(); + + static bool TestMagic(Stream* fp); + + virtual void HandleEXE(Stream* fp, bool ignore_pcsp = false) override; + virtual void HandleReserved(Stream* fp, uint32 len) override; + + PSFTags tags; + + MemoryStream ROM_Data; +}; + + +#endif diff --git a/Mednafen/mednafen/SPCReader.cpp b/Mednafen/mednafen/SPCReader.cpp new file mode 100644 index 0000000000..2d3b19c42d --- /dev/null +++ b/Mednafen/mednafen/SPCReader.cpp @@ -0,0 +1,164 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include + +bool SPCReader::TestMagic(Stream* fp) +{ +#if 0 + return true; +#endif + static const char* spc_magic = "SNES-SPC700 Sound File Data"; + uint8 header[0x100]; + uint64 rc; + + if(fp->size() < 0x10200) + return false; + + rc = fp->read(header, sizeof(header), false); + fp->rewind(); + + if(rc != sizeof(header)) + return false; + + if(memcmp(header, spc_magic, strlen(spc_magic))) + return false; + + return true; +} + +static std::string GrabString(Stream* fp, size_t len) +{ + std::string ret; + size_t null_pos; + + ret.resize(len); + fp->read(&ret[0], len); + + null_pos = ret.find('\0'); // ANDDYYYYYYYYY + if(null_pos != std::string::npos) + ret.resize(null_pos); + + MDFN_RemoveControlChars(ret); + MDFN_trim(ret); + + return ret; +} + +SPCReader::SPCReader(Stream* fp) +{ +#if 0 + reg_pc = 0x430; + reg_a = 0; + reg_x = 0; + reg_y = 0; + reg_psw = 0; + reg_sp = 0xFF; + + memset(apuram, 0x00, sizeof(apuram)); + memset(dspregs, 0x00, sizeof(dspregs)); + dspregs[0x6C] = 0xE0; + + fp->read(&apuram[0x400], 0x1000); + return; +#endif + + if(!TestMagic(fp)) + throw MDFN_Error(0, _("Not a valid SPC file!")); + + uint8 header[0x100]; + + fp->rewind(); + fp->read(header, sizeof(header)); + + reg_pc = MDFN_de16lsb(&header[0x25]); + reg_a = header[0x27]; + reg_x = header[0x28]; + reg_y = header[0x29]; + reg_psw = header[0x2A]; + reg_sp = header[0x2B]; + + fp->read(apuram, 65536); + fp->read(dspregs, 0x80); + fp->seek(0x101C0, SEEK_SET); + fp->read(apuram + 0xFFC0, 0x40); + + if(header[0x23] == 0x1A) + { + bool binary_tags = true; + + if(header[0xA0] == '/' && header[0xA3] == '/') + binary_tags = false; + + if(header[0xD2] >= '0' && header[0xD2] <= '9' && header[0xD3] == 0x00) + binary_tags = false; + + fp->seek(0x2E, SEEK_SET); + + song_name = GrabString(fp, 32); + game_name = GrabString(fp, 32); + + fp->seek(binary_tags ? 0xB0 : 0xB1, SEEK_SET); + artist_name = GrabString(fp, 32); + } + + // + // + // +#if 0 + fp->seek(0x10200, SEEK_SET); + uint8 xid_header[8]; + + if(fp->read(xid_header, sizeof(xid_header), false) == sizeof(xid_header) && !memcmp(xid_header, "xid6", 4)) + { + uint8 sub_header[4]; + + while(fp->read(sub_header, sizeof(sub_header), false) == sizeof(sub_header)) + { + const uint8 id = sub_header[0]; + const uint8 type = sub_header[1]; + uint16 len = MDFN_de16lsb(&sub_header[2]); + + printf("ID: 0x%02x, Type: 0x%02x, Len: 0x%04x\n", id, type, len); + + if(type == 1 && len > 4) + len = (len + 3) &~ 3; + + switch(id) + { + default: + if(type) + fp->seek(len, SEEK_CUR); + break; + + case 0x01: song_name = GrabString(fp, len); break; + case 0x02: game_name = GrabString(fp, len); break; + case 0x03: artist_name = GrabString(fp, len); break; + } + } + } +#endif +} + +SPCReader::~SPCReader() +{ + +} diff --git a/Mednafen/mednafen/SPCReader.h b/Mednafen/mednafen/SPCReader.h new file mode 100644 index 0000000000..7e90757e03 --- /dev/null +++ b/Mednafen/mednafen/SPCReader.h @@ -0,0 +1,63 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __MDFN_SPCREADER_H +#define __MDFN_SPCREADER_H + +#include + +#include + +class SPCReader +{ + public: + + static bool TestMagic(Stream* fp); + + SPCReader(Stream* fp); + ~SPCReader(); + + INLINE const uint8* APURAM(void) { return apuram; } + INLINE const uint8* DSPRegs(void) { return dspregs; } + + INLINE uint16 PC(void) { return reg_pc; } + INLINE uint8 A(void) { return reg_a; } + INLINE uint8 X(void) { return reg_x; } + INLINE uint8 Y(void) { return reg_y; } + INLINE uint8 PSW(void) { return reg_psw; } + INLINE uint8 SP(void) { return reg_sp; } + + INLINE std::string GameName(void) { return game_name; } + INLINE std::string ArtistName(void) { return artist_name; } + INLINE std::string SongName(void) { return song_name; } + + private: + uint8 apuram[65536]; + uint8 dspregs[128]; + + uint16 reg_pc; + uint8 reg_a, reg_x, reg_y; + uint8 reg_psw; + uint8 reg_sp; + + std::string game_name; + std::string artist_name; + std::string song_name; +}; + + +#endif diff --git a/Mednafen/mednafen/Stream.cpp b/Mednafen/mednafen/Stream.cpp new file mode 100644 index 0000000000..2697f8bc52 --- /dev/null +++ b/Mednafen/mednafen/Stream.cpp @@ -0,0 +1,206 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "Stream.h" + +#include +#include + +Stream::Stream() +{ + +} + +Stream::~Stream() +{ + +} + +uint64 Stream::read_discard(uint64 count) +{ + uint8 buf[1024]; + uint64 tmp; + uint64 ret = 0; + + do + { + tmp = read(buf, std::min(count, sizeof(buf)), false); + count -= tmp; + ret += tmp; + } while(tmp == sizeof(buf)); + + return ret; +} + +uint64 Stream::alloc_and_read(void** data_out, uint64 size_limit) +{ + uint8 *data_buffer = NULL; + uint64 data_buffer_size = 0; + uint64 data_buffer_alloced = 0; + + try + { + if(attributes() & ATTRIBUTE_SLOW_SIZE) + { + uint64 rti; + + data_buffer_size = 0; + data_buffer_alloced = 65536; + + if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + + while((rti = read(data_buffer + data_buffer_size, data_buffer_alloced - data_buffer_size, false)) > 0) + { + uint8* new_data_buffer; + + data_buffer_size += rti; + + if(data_buffer_size == data_buffer_alloced) + { + data_buffer_alloced <<= 1; + + if(data_buffer_alloced > size_limit) // So we can test against our size limit without going far far over it in temporary memory allocations. + data_buffer_alloced = size_limit + 1; + + if(data_buffer_size > size_limit) + throw MDFN_Error(0, _("Size limit of %llu bytes would be exceeded."), (unsigned long long)size_limit); + + if(!(new_data_buffer = (uint8 *)realloc(data_buffer, data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + data_buffer = new_data_buffer; + } + else // EOS + break; + } + + if(data_buffer_alloced > data_buffer_size) + { + uint8 *new_data_buffer; + + new_data_buffer = (uint8*)realloc(data_buffer, data_buffer_size); + + if(new_data_buffer != NULL) + { + data_buffer = new_data_buffer; + data_buffer_alloced = data_buffer_size; + } + } + } + else + { + data_buffer_size = size(); + data_buffer_alloced = data_buffer_size; + + if(data_buffer_size > size_limit) + throw MDFN_Error(0, _("Size limit of %llu bytes would be exceeded."), (unsigned long long)size_limit); + + if(data_buffer_alloced > SIZE_MAX) + throw MDFN_Error(ErrnoHolder(ENOMEM)); + + if(!(data_buffer = (uint8*)realloc(data_buffer, data_buffer_alloced))) + throw MDFN_Error(ErrnoHolder(errno)); + + read(data_buffer, data_buffer_size); + } + } + catch(...) + { + if(data_buffer) + { + free(data_buffer); + data_buffer = NULL; + } + throw; + } + + *data_out = data_buffer; + return data_buffer_size; +} + +uint8* Stream::map(void) noexcept +{ + return(NULL); +} + +uint64 Stream::map_size(void) noexcept +{ + return 0; +} + +void Stream::unmap(void) noexcept +{ + +} + +void Stream::put_line(const std::string& str) +{ + char l = '\n'; + + write(&str[0], str.size()); + write(&l, sizeof(l)); +} + + +void Stream::print_format(const char *format, ...) +{ + char *str = NULL; + int rc; + + va_list ap; + + va_start(ap, format); + + rc = trio_vasprintf(&str, format, ap); + + va_end(ap); + + if(rc < 0) + throw MDFN_Error(0, "Error in trio_vasprintf()"); + else + { + try // Bleck + { + write(str, rc); + } + catch(...) + { + free(str); + throw; + } + free(str); + } +} + +int Stream::get_line(std::string &str) +{ + uint8 c; + + str.clear(); // or str.resize(0)?? + + while(read(&c, sizeof(c), false) > 0) + { + if(c == '\r' || c == '\n' || c == 0) + return(c); + + str.push_back(c); + } + + return(str.length() ? 256 : -1); +} + diff --git a/Mednafen/mednafen/Stream.h b/Mednafen/mednafen/Stream.h new file mode 100644 index 0000000000..9ce1ae931e --- /dev/null +++ b/Mednafen/mednafen/Stream.h @@ -0,0 +1,226 @@ +#ifndef __MDFN_STREAM_H +#define __MDFN_STREAM_H + +// TODO?: BufferedStream, no virtual functions, yes inline functions, constructor takes a Stream* argument. + +#include + +#include "gettext.h" +#define _(String) gettext (String) + +#include + +#include // For SEEK_* defines, which we will use in Stream out of FORCE OF HABIT. +#include + +#include + +class Stream +{ + public: + + Stream(); + virtual ~Stream(); + + enum + { + ATTRIBUTE_READABLE = 1U << 0, + ATTRIBUTE_WRITEABLE = 1U << 1, + ATTRIBUTE_SEEKABLE = 1U << 2, + ATTRIBUTE_SLOW_SEEK = 1U << 3, + ATTRIBUTE_SLOW_SIZE = 1U << 4 + }; + virtual uint64 attributes(void) = 0; + + virtual uint8 *map(void) noexcept; + // Map the entirety of the stream data into the address space of the process, if possible, and return a pointer. + // (the returned pointer must be cached, and returned on any subsequent calls to map() without an unmap() + // in-between, to facilitate a sort of "feature-testing", to determine if an alternative like "MemoryStream" + // should be used). + // + // If the mapping fails for whatever reason, return NULL rather than throwing an exception. + // + // For code using this functionality, ensure usage of map_size() instead of size(), unless you're only using a specific derived + // class like MemoryStream() where the value returned by size() won't change unexpectedly due to outside factors. + + virtual uint64 map_size(void) noexcept; + // The size of the memory mapping area, point to which returned by map(). + // + // Returns 0 on supported, or if no mapping currently exists. + + virtual void unmap(void) noexcept; + // Unmap the stream data from the address space. (Possibly invalidating the pointer returned from map()). + // (must automatically be called, if necessary, from the destructor). + // + // If the data can't be "unmapped" as such because it was never mmap()'d or similar in the first place(such as with MemoryStream), + // then this will be a nop. + + virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) = 0; + virtual void write(const void *data, uint64 count) = 0; + + virtual void truncate(uint64 length) = 0; // Should have ftruncate()-like semantics; but avoid using it to extend files. + + virtual void seek(int64 offset, int whence = SEEK_SET) = 0; + inline void rewind(void) + { + seek(0, SEEK_SET); + } + virtual uint64 tell(void) = 0; + virtual uint64 size(void) = 0; // May implicitly call flush() if the stream is writeable. + virtual void flush(void) = 0; + virtual void close(void) = 0; // Flushes(in the case of writeable streams) and closes the stream. + // Necessary since this operation can fail(running out of disk space, for instance), + // and throw an exception in the destructor would be a Bad Idea(TM). + // + // Manually calling this function isn't strictly necessary, but recommended when the + // stream is writeable; it will be called automatically from the destructor, with any + // exceptions thrown caught and logged. + + // + // Utility functions(TODO): + // + INLINE uint8 get_u8(void) + { + uint8 ret; + + read(&ret, sizeof(ret)); + + return ret; + } + + INLINE void put_u8(uint8 c) + { + write(&c, sizeof(c)); + } + + + template + INLINE T get_NE(void) + { + T ret; + + read(&ret, sizeof(ret)); + + return ret; + } + + + template + INLINE T get_RE(void) + { + uint8 tmp[sizeof(T)]; + union + { + T ret; + uint8 ret_u8[sizeof(T)]; + }; + + read(tmp, sizeof(tmp)); + + for(unsigned i = 0; i < sizeof(T); i++) + ret_u8[i] = tmp[sizeof(T) - 1 - i]; + + return ret; + } + + template + INLINE void put_NE(T c) + { + write(&c, sizeof(c)); + } + + template + INLINE void put_RE(T c) + { + uint8 tmp[sizeof(T)]; + + for(unsigned i = 0; i < sizeof(T); i++) + tmp[i] = ((uint8 *)&c)[sizeof(T) - 1 - i]; + + write(tmp, sizeof(tmp)); + } + + template + INLINE T get_LE(void) + { + #ifdef LSB_FIRST + return get_NE(); + #else + return get_RE(); + #endif + } + + template + INLINE void put_LE(T c) + { + #ifdef LSB_FIRST + return put_NE(c); + #else + return put_RE(c); + #endif + } + + template + INLINE T get_BE(void) + { + #ifndef LSB_FIRST + return get_NE(); + #else + return get_RE(); + #endif + } + + template + INLINE void put_BE(T c) + { + #ifndef LSB_FIRST + return put_NE(c); + #else + return put_RE(c); + #endif + } + + INLINE void put_string(const char* str) + { + write(str, strlen(str)); + } + + // Reads a line into "str", overwriting its contents; returns the line-end char('\n' or '\r' or '\0'), or 256 on EOF and + // data has been read into "str", and -1 on EOF when no data has been read into "str". + // The line-end char won't be added to "str". + // It's up to the caller to handle extraneous empty lines caused by DOS-format text lines(\r\n). + // ("str" is passed by reference for the possibility of improved performance by reusing alloced memory for the std::string, though part + // of it would be up to the STL implementation). + // Implemented as virtual so that a higher-performance version can be implemented if possible(IE with MemoryStream) + virtual int get_line(std::string &str); + + virtual void put_line(const std::string& str); + + virtual void print_format(const char *format, ...) MDFN_FORMATSTR(gnu_printf, 2, 3); + +#if 0 + int scanf(const char *format, ...) MDFN_FORMATSTR(gnu_scanf, 2, 3); + void put_string(const char *str); + void put_string(const std::string &str); +#endif + + // + // Read until end-of-stream(or count), discarding any read data, and returns the amount of data "read". + // (Useful for detecting and printing warnings about extra garbage data without needing to call size(), + // which can be problematic for some types of Streams). + uint64 read_discard(uint64 count = ~(uint64)0); + + // + // Reads stream starting at the current stream position(as returned by tell()), into memory allocated with malloc() and realloc(), and + // sets *data_out to a pointer to the memory(which the caller will need to free() at some point). + // + // *data_out is only an output. + // + // If size_limit is/will be exceeded, an exception will be thrown, and *data_out will not be written to. + // + // Will return the amount of data read(and the size of the alloced memory). + // + uint64 alloc_and_read(void** data_out, uint64 size_limit = ~(uint64)0); +}; + +#endif diff --git a/Mednafen/mednafen/cdplay/Makefile.am b/Mednafen/mednafen/cdplay/Makefile.am new file mode 100644 index 0000000000..6187f0fa17 --- /dev/null +++ b/Mednafen/mednafen/cdplay/Makefile.am @@ -0,0 +1,7 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libcdplay.a + +libcdplay_a_SOURCES = cdplay.cpp diff --git a/Mednafen/mednafen/cdplay/Makefile.in b/Mednafen/mednafen/cdplay/Makefile.in new file mode 100644 index 0000000000..0f4654b748 --- /dev/null +++ b/Mednafen/mednafen/cdplay/Makefile.in @@ -0,0 +1,676 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/cdplay +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libcdplay_a_AR = $(AR) $(ARFLAGS) +libcdplay_a_LIBADD = +am_libcdplay_a_OBJECTS = cdplay.$(OBJEXT) +libcdplay_a_OBJECTS = $(am_libcdplay_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libcdplay_a_SOURCES) +DIST_SOURCES = $(libcdplay_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libcdplay.a +libcdplay_a_SOURCES = cdplay.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cdplay/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/cdplay/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libcdplay.a: $(libcdplay_a_OBJECTS) $(libcdplay_a_DEPENDENCIES) $(EXTRA_libcdplay_a_DEPENDENCIES) + $(AM_V_at)-rm -f libcdplay.a + $(AM_V_AR)$(libcdplay_a_AR) libcdplay.a $(libcdplay_a_OBJECTS) $(libcdplay_a_LIBADD) + $(AM_V_at)$(RANLIB) libcdplay.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdplay.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/cdplay/cdplay.cpp b/Mednafen/mednafen/cdplay/cdplay.cpp new file mode 100644 index 0000000000..7fa5675c94 --- /dev/null +++ b/Mednafen/mednafen/cdplay/cdplay.cpp @@ -0,0 +1,595 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: Clear Q subchannel data on disc change and manual track change, add Q subchannel mode have variable(s). + +#include +#include +#include +#include +#include + +using namespace CDUtility; + +#include + +extern MDFNGI EmulatedCDPlay; + +namespace MDFN_IEN_CDPLAY +{ + +static std::vector sin_lut; //[65536]; +static SpeexResamplerState *resampler = NULL; + +static uint8 *controller_ptr; +static uint8 last_controller; + +enum +{ + PLAYMODE_PAUSE = -1, + PLAYMODE_STOP = 0, + PLAYMODE_PLAY = 1, + PLAYMODE_SCAN_FORWARD = 2, + PLAYMODE_SCAN_REVERSE = 3, +}; + +static int PlayMode; +static int32 PlaySector; +static int16 CDDABuffer[588 * 2]; + +static int16 ResampBuffer[588 * 2][2]; // Resampler input buffer, * 2 for resampler leftovers +static uint32 ResampBufferPos; +static uint32 PrevRate; + +static std::vector *cdifs; + +static uint32 CurrentATLI; + +struct AudioTrackInfo +{ + inline AudioTrackInfo(unsigned disc_, int32 track_, int32 lba_, int32 final_lba_) + { + disc = disc_; + track = track_; + lba = lba_; + final_lba = final_lba_; + } + + unsigned disc; + int32 track; + int32 lba; + int32 final_lba; // Inclusive. +}; + +static std::vector AudioTrackList; + +static void InitLUT(void); + +static void LoadCD(std::vector *CDInterfaces) +{ + cdifs = CDInterfaces; + + AudioTrackList.clear(); + + for(unsigned disc = 0; disc < cdifs->size(); disc++) + { + TOC toc; + + (*cdifs)[disc]->ReadTOC(&toc); + + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].valid && !(toc.tracks[track].control & 0x4)) + { + AudioTrackList.push_back(AudioTrackInfo(disc, track, toc.tracks[track].lba, toc.tracks[(track == toc.last_track) ? 100 : track + 1].lba - 1)); + } + } + } + + if(!AudioTrackList.size()) + throw MDFN_Error(0, _("Audio track doesn't exist.")); + + CurrentATLI = 0; + PlaySector = AudioTrackList[CurrentATLI].lba; + PlayMode = PLAYMODE_PLAY; //STOP; + + { + int err; + resampler = speex_resampler_init(2, 44100, (int)48000, 5, &err); + PrevRate = 48000; + } + ResampBufferPos = 0; + + InitLUT(); + + // + // + EmulatedCDPlay.RMD->Drives.clear(); + EmulatedCDPlay.RMD->MediaTypes.clear(); + EmulatedCDPlay.RMD->Media.clear(); +} + +static bool TestMagicCD(std::vector *CDInterfaces) +{ + CDUtility::TOC magic_toc; + + for(unsigned i = 0; i < CDInterfaces->size(); i++) + { + (*CDInterfaces)[i]->ReadTOC(&magic_toc); + + // If any audio track is found, return true. + for(int32 track = magic_toc.first_track; track <= magic_toc.last_track; track++) + if(magic_toc.tracks[track].valid && !(magic_toc.tracks[track].control & 0x4)) + return(true); + } + + return(false); +} + +static void CloseGame(void) +{ + if(resampler) + { + speex_resampler_destroy(resampler); + resampler = NULL; + } + sin_lut.resize(0); +} + +static uint8 SubQBuf[3][0xC]; +//static bool SubQHave[3]; +static uint8 SubQBuf_LastValid[0xC]; + +static void GenSubQFromSubPW(uint8 *SubPWBuf) +{ + uint8 sq[0xC]; + + memset(sq, 0, 0xC); + + for(int i = 0; i < 96; i++) + sq[i >> 3] |= ((SubPWBuf[i] & 0x40) >> 6) << (7 - (i & 7)); + + if(!subq_check_checksum(sq)) + puts("SubQ checksum error!"); + else + { + uint8 adr = sq[0] & 0xF; + + if(adr <= 0x3) + memcpy(SubQBuf[adr], sq, 0xC); + + memcpy(SubQBuf_LastValid, sq, 0xC); + } +} + +static void InitLUT(void) +{ + sin_lut.resize(65536); + + for(int i = 0; i < 65536; i++) + sin_lut[i] = sin((double)i * M_PI * 2 / 65536); +} + +static void Emulate(EmulateSpecStruct *espec) +{ + uint8 sector_buffer[2352 + 96]; + uint8 new_controller = *controller_ptr; + + espec->MasterCycles = 588; + + //printf("%d %d\n", toc.tracks[100].lba, AudioTrackList[AudioTrackList.size() - 1] + 1); + + if(PlaySector < AudioTrackList[CurrentATLI].lba) // Reverse-scanning handling. + { + if(CurrentATLI > 0) + { + CurrentATLI--; + PlaySector = AudioTrackList[CurrentATLI].final_lba; + } + else + { + CurrentATLI = 0; + PlayMode = PLAYMODE_STOP; + PlaySector = AudioTrackList[CurrentATLI].lba; + } + } + else if(PlaySector > AudioTrackList[CurrentATLI].final_lba) + { + if((CurrentATLI + 1) < AudioTrackList.size()) + CurrentATLI++; + else + { + CurrentATLI = 0; + PlayMode = PLAYMODE_STOP; + } + + PlaySector = AudioTrackList[CurrentATLI].lba; + } + + if(PlayMode == PLAYMODE_STOP || PlayMode == PLAYMODE_PAUSE) + { + //memset(CDDABuffer, 0, sizeof(CDDABuffer)); + for(int i = 0; i < 588; i++) + { + ResampBuffer[ResampBufferPos][0] = 0; + ResampBuffer[ResampBufferPos][1] = 0; + ResampBufferPos++; + } + } + else + { + (*cdifs)[AudioTrackList[CurrentATLI].disc]->ReadRawSector(sector_buffer, PlaySector); + GenSubQFromSubPW(sector_buffer + 2352); + + for(int i = 0; i < 588 * 2; i++) + { + CDDABuffer[i] = MDFN_de16lsb(§or_buffer[i * sizeof(int16)]); + + ResampBuffer[ResampBufferPos + (i >> 1)][i & 1] = (CDDABuffer[i] * 3 + 2) >> 2; + } + ResampBufferPos += 588; + } + + if(espec->SoundBuf) + { + if((int)espec->SoundRate == 44100) + { + memcpy(espec->SoundBuf, ResampBuffer, ResampBufferPos * 2 * sizeof(int16)); + espec->SoundBufSize = ResampBufferPos; + ResampBufferPos = 0; + } + else + { + spx_uint32_t in_len; + spx_uint32_t out_len; + + if(PrevRate != (uint32)espec->SoundRate) + { + speex_resampler_set_rate(resampler, 44100, (uint32)espec->SoundRate); + PrevRate = (uint32)espec->SoundRate; + } + + in_len = ResampBufferPos; + out_len = 524288; // FIXME, real size. + + speex_resampler_process_interleaved_int(resampler, (const spx_int16_t *)ResampBuffer, &in_len, (spx_int16_t *)espec->SoundBuf, &out_len); + + assert(in_len <= ResampBufferPos); + + if((ResampBufferPos - in_len) > 0) + memmove(ResampBuffer, ResampBuffer + in_len, (ResampBufferPos - in_len) * sizeof(int16) * 2); + + ResampBufferPos -= in_len; + + //printf("%d\n", ResampBufferPos); + assert((ResampBufferPos + 588) <= (sizeof(ResampBuffer) / sizeof(int16) / 2)); + + espec->SoundBufSize = out_len; + } + } + else + ResampBufferPos = 0; + +// for(int i = 0; i < espec->SoundBufSize * 2; i++) +// espec->SoundBuf[i] = (rand() & 0x7FFF) - 0x4000; //(rand() * 192) >> 8 + + if(!espec->skip) + { + char tmpbuf[256]; + const MDFN_PixelFormat &format = espec->surface->format; + uint32 *pixels = espec->surface->pixels; + uint32 text_color = format.MakeColor(0xE0, 0xE0, 0xE0); + uint32 text_shadow_color = format.MakeColor(0x20, 0x20, 0x20); + uint32 wf_color = format.MakeColor(0xE0, 0x00, 0xE0); + uint32 cur_sector = PlaySector; + + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + + espec->DisplayRect.w = 192; + espec->DisplayRect.h = 144; + + espec->surface->Fill(0, 0, 0, 0); + + if(MDFN_GetSettingB("cdplay.visualization")) + { + static const int lobes = 2; + static const int oversample_shift = 5; // Don't increase without resolving integer overflow issues. + static const int oversample = 1 << oversample_shift; + + for(int i = 0; i < 588; i++) + { + const float rawp_adjust = 1.0 / (1 * M_PI * 2 / 65536); + const float unip_samp = (float)(((CDDABuffer[i * 2 + 0] + CDDABuffer[i * 2 + 1]) >> 1) + 32768) / 65536; + const float next_unip_samp = (float)(((CDDABuffer[(i * 2 + 2) % 1176] + CDDABuffer[(i * 2 + 3) % 1176]) >> 1) + 32768) / 65536; + const float sample_inc = (next_unip_samp - unip_samp) / oversample; + float sample = (unip_samp - 0.5) / 2; + + for(int osi = 0; osi < oversample; osi++, sample += sample_inc) + { + unsigned x; // Make sure x and y are unsigned, else we need to change our in-bounds if() check. + unsigned y; + float x_raw, y_raw; + float x_raw2, y_raw2; + float x_raw_prime, y_raw_prime; + int32 theta_i = (uint32)65536 * (i * oversample + osi) / (oversample * 588); + + float radius = sin_lut[(lobes * theta_i) & 0xFFFF]; + float radius2 = sin_lut[(lobes * (theta_i + 1)) & 0xFFFF]; + + x_raw = radius * sin_lut[(16384 + theta_i) & 0xFFFF]; + y_raw = radius * sin_lut[theta_i & 0xFFFF]; + + x_raw2 = radius2 * sin_lut[(16384 + theta_i + 1) & 0xFFFF]; + y_raw2 = radius2 * sin_lut[(theta_i + 1) & 0xFFFF]; + + // Approximation, of course. + x_raw_prime = (x_raw2 - x_raw) * rawp_adjust; + y_raw_prime = (y_raw2 - y_raw) * rawp_adjust; + + x_raw_prime = x_raw_prime / (float)sqrt(x_raw_prime * x_raw_prime + y_raw_prime * y_raw_prime); + y_raw_prime = y_raw_prime / (float)sqrt(x_raw_prime * x_raw_prime + y_raw_prime * y_raw_prime); + + x_raw += sample * y_raw_prime; + y_raw += sample * -x_raw_prime; + + x = 96 + 60 * x_raw; + y = 72 + 60 * y_raw; + + if(x < 192 && y < 144) + pixels[x + y * espec->surface->pitch32] = wf_color; + } + } + } + + { + TOC toc; + const char *disctype_string = ""; + + (*cdifs)[AudioTrackList[CurrentATLI].disc]->ReadTOC(&toc); + + if(toc.disc_type == 0x10) + disctype_string = "(CD-i)"; + else if(toc.disc_type == 0x20) + disctype_string = "(CD-ROM XA)"; + else if(toc.disc_type != 0x00) + disctype_string = "(unknown type)"; + + trio_snprintf(tmpbuf, 256, "Disc: %u/%u %s", AudioTrackList[CurrentATLI].disc + 1, (unsigned)cdifs->size(), disctype_string); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + trio_snprintf(tmpbuf, 256, "Track: %d/%d", AudioTrackList[CurrentATLI].track, toc.last_track); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + trio_snprintf(tmpbuf, 256, "Sector: %d/%d", cur_sector, toc.tracks[100].lba - 1); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + //assert(AudioTrackList[CurrentATLI].track == toc.FindTrackByLBA(cur_sector)); + } + + pixels += 13 * espec->surface->pitch32; + + + //trio_snprintf(tmpbuf, 256, "Q-Mode: %01x", SubQBuf[1][0] & 0xF); + //DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + //pixels += 13 * espec->surface->pitch32; + + trio_snprintf(tmpbuf, 256, "Track: %d", BCD_to_U8(SubQBuf[1][1])); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + trio_snprintf(tmpbuf, 256, "Index: %d", BCD_to_U8(SubQBuf[1][2])); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + + trio_snprintf(tmpbuf, 256, "Relative: %02d:%02d:%02d", BCD_to_U8(SubQBuf[1][3]), BCD_to_U8(SubQBuf[1][4]), BCD_to_U8(SubQBuf[1][5])); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + trio_snprintf(tmpbuf, 256, "Absolute: %02d:%02d:%02d", BCD_to_U8(SubQBuf[1][7]), BCD_to_U8(SubQBuf[1][8]), BCD_to_U8(SubQBuf[1][9])); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + trio_snprintf(tmpbuf, 256, "Control: 0x%02x", (SubQBuf_LastValid[0] >> 4) & 0xF); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + + + // Catalog + trio_snprintf(tmpbuf, 256, "Catalog: %x%x%x%x%x%x%x%x%x%x%x%x%x", + (SubQBuf[2][1] >> 4) & 0xF, (SubQBuf[2][1] >> 0) & 0xF, (SubQBuf[2][2] >> 4) & 0xF, (SubQBuf[2][2] >> 0) & 0xF, + (SubQBuf[2][3] >> 4) & 0xF, (SubQBuf[2][3] >> 0) & 0xF, (SubQBuf[2][4] >> 4) & 0xF, (SubQBuf[2][4] >> 0) & 0xF, + (SubQBuf[2][5] >> 4) & 0xF, (SubQBuf[2][5] >> 0) & 0xF, (SubQBuf[2][6] >> 4) & 0xF, (SubQBuf[2][6] >> 0) & 0xF, + (SubQBuf[2][7] >> 4) & 0xF); + DrawTextTransShadow(pixels, espec->surface->pitch32 * 4, 192, tmpbuf, text_color, text_shadow_color, 0, MDFN_FONT_6x13_12x13); + pixels += 13 * espec->surface->pitch32; + } + + if(PlayMode != PLAYMODE_STOP && PlayMode != PLAYMODE_PAUSE) + { + const int scan_amount = 4; //16; + + if(new_controller & 0x40) + PlaySector += scan_amount; + else if(new_controller & 0x80) + PlaySector -= scan_amount; + else + PlaySector++; + } + + if(!(last_controller & 0x1) && (new_controller & 1)) + { + PlayMode = (PlayMode == PLAYMODE_PLAY) ? PLAYMODE_PAUSE : PLAYMODE_PLAY; + } + + if(!(last_controller & 0x2) && (new_controller & 2)) // Stop + { + PlayMode = PLAYMODE_STOP; + PlaySector = AudioTrackList[CurrentATLI].lba; + } + + if(!(last_controller & 0x4) && (new_controller & 4)) + { + if(CurrentATLI < (AudioTrackList.size() - 1)) + CurrentATLI++; + + PlaySector = AudioTrackList[CurrentATLI].lba; + } + + if(!(last_controller & 0x8) && (new_controller & 8)) + { + if(CurrentATLI) + CurrentATLI--; + + PlaySector = AudioTrackList[CurrentATLI].lba; + } + + if(!(last_controller & 0x10) && (new_controller & 0x10)) + { + CurrentATLI = std::min(CurrentATLI + 10, AudioTrackList.size() - 1); + PlaySector = AudioTrackList[CurrentATLI].lba; + } + + if(!(last_controller & 0x20) && (new_controller & 0x20)) + { + CurrentATLI -= std::min(CurrentATLI, 10); + PlaySector = AudioTrackList[CurrentATLI].lba; + } + + + last_controller = new_controller; +} + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { NULL, NULL } +}; + +static void SetInput(unsigned port, const char *type, uint8* ptr) +{ + controller_ptr = ptr; +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: + case MDFN_MSC_RESET: break; + } +} + +static MDFNSetting CDPlaySettings[] = +{ + { "cdplay.visualization", MDFNSF_NOFLAGS, gettext_noop("Enable simple waveform visualization."), NULL, MDFNST_BOOL, "1" }, + { NULL } +}; + +static const IDIISG IDII = +{ + { "play_pause", "Play/Pause", 0, IDIT_BUTTON, NULL }, + { "stop", "Stop", 1, IDIT_BUTTON, NULL }, + { "next_track", "Next Track", 2, IDIT_BUTTON, NULL }, + { "previous_track", "Previous Track", 3, IDIT_BUTTON, NULL }, + + { "next_track_10", "Next Track 10", 4, IDIT_BUTTON, NULL }, + { "previous_track_10", "Previous Track 10", 5, IDIT_BUTTON, NULL }, + + { "scan_forward", "Scan Forward", 6, IDIT_BUTTON, NULL }, + { "scan_reverse", "Scan Reverse", 7, IDIT_BUTTON, NULL }, + + //{ "reverse_seek", "Reverse Seek", 1, IDIT_BUTTON, NULL }, + //{ "forward_seek", "Forward Seek", 2, IDIT_BUTTON, NULL }, + //{ "fast_reverse_seek", "Fast Reverse Seek", 3, IDIT_BUTTON, NULL }, + //{ "fast_forward_seek", "Fast Forward Seek", 4, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "controller", + "Controller", + NULL, + IDII, + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo } +}; +} + +using namespace MDFN_IEN_CDPLAY; + +MDFNGI EmulatedCDPlay = +{ + "cdplay", + "Mednafen Test CD-DA Player", + KnownExtensions, + MODPRIO_INTERNAL_EXTRA_LOW, + NULL, // Debug info + PortInfo, // + NULL, + NULL, + LoadCD, + TestMagicCD, + CloseGame, + + NULL, + NULL, // Layer names, null-delimited + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + NULL, + false, + NULL, //StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + CDPlaySettings, + MDFN_MASTERCLOCK_FIXED(44100), + 75 * 65536 * 256, + false, // Multires possible? + + 192, // lcm_width + 144, // lcm_height + NULL, // Dummy + + + 192, // Nominal width + 144, // Nominal height + + 192, // Framebuffer width + 144 + 1, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/cdrom/CDAFReader.cpp b/Mednafen/mednafen/cdrom/CDAFReader.cpp new file mode 100644 index 0000000000..11b2a52c6a --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader.cpp @@ -0,0 +1,69 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// CDAFR_Open(), and CDAFReader, will NOT take "ownership" of the Stream object(IE it won't ever delete it). Though it does assume it has exclusive access +// to it for as long as the CDAFReader object exists. + +// Don't allow exceptions to propagate into the vorbis/musepack/etc. libraries, as it could easily leave the state of the library's decoder "object" in an +// inconsistent state, which would cause all sorts of unfun when we try to destroy it while handling the exception farther up. + +#include +#include "CDAFReader.h" +#include "CDAFReader_Vorbis.h" +#include "CDAFReader_MPC.h" + +#ifdef HAVE_LIBSNDFILE +#include "CDAFReader_SF.h" +#endif + +CDAFReader::CDAFReader() : LastReadPos(0) +{ + +} + +CDAFReader::~CDAFReader() +{ + +} + +CDAFReader *CDAFR_Open(Stream *fp) +{ + static CDAFReader* (* const OpenFuncs[])(Stream* fp) = + { + CDAFR_MPC_Open, + CDAFR_Vorbis_Open, // Must come before CDAFR_SF_Open +#ifdef HAVE_LIBSNDFILE + CDAFR_SF_Open, +#endif + }; + + for(auto const& f : OpenFuncs) + { + try + { + fp->rewind(); + return f(fp); + } + catch(int i) + { + + } + } + + return(NULL); +} + diff --git a/Mednafen/mednafen/cdrom/CDAFReader.h b/Mednafen/mednafen/cdrom/CDAFReader.h new file mode 100644 index 0000000000..b42c7c75f5 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader.h @@ -0,0 +1,41 @@ +#ifndef __MDFN_CDAFREADER_H +#define __MDFN_CDAFREADER_H + +#include + +class CDAFReader +{ + public: + CDAFReader(); + virtual ~CDAFReader(); + + virtual uint64 FrameCount(void) = 0; + INLINE uint64 Read(uint64 frame_offset, int16 *buffer, uint64 frames) + { + uint64 ret; + + if(LastReadPos != frame_offset) + { + //puts("SEEK"); + if(!Seek_(frame_offset)) + return(0); + LastReadPos = frame_offset; + } + + ret = Read_(buffer, frames); + LastReadPos += ret; + return(ret); + } + + private: + virtual uint64 Read_(int16 *buffer, uint64 frames) = 0; + virtual bool Seek_(uint64 frame_offset) = 0; + + uint64 LastReadPos; +}; + +// AR_Open(), and CDAFReader, will NOT take "ownership" of the Stream object(IE it won't ever delete it). Though it does assume it has exclusive access +// to it for as long as the CDAFReader object exists. +CDAFReader *CDAFR_Open(Stream *fp); + +#endif diff --git a/Mednafen/mednafen/cdrom/CDAFReader_MPC.cpp b/Mednafen/mednafen/cdrom/CDAFReader_MPC.cpp new file mode 100644 index 0000000000..3f26026c17 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader_MPC.cpp @@ -0,0 +1,238 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "CDAFReader.h" +#include "CDAFReader_MPC.h" + +#if 0 + #include +#else + #include +#endif + +class CDAFReader_MPC final : public CDAFReader +{ + public: + CDAFReader_MPC(Stream *fp); + ~CDAFReader_MPC(); + + uint64 Read_(int16 *buffer, uint64 frames) override; + bool Seek_(uint64 frame_offset) override; + uint64 FrameCount(void) override; + + private: + mpc_reader reader; + mpc_demux *demux; + mpc_streaminfo si; + + MPC_SAMPLE_FORMAT MPCBuffer[MPC_DECODER_BUFFER_LENGTH]; + + uint32 MPCBufferIn; + uint32 MPCBufferOffs; + Stream *fw; +}; + + +/// Reads size bytes of data into buffer at ptr. +static mpc_int32_t impc_read(mpc_reader *p_reader, void *ptr, mpc_int32_t size) +{ + Stream *fw = (Stream*)(p_reader->data); + + try + { + return fw->read(ptr, size, false); + } + catch(...) + { + return(MPC_STATUS_FAIL); + } +} + +/// Seeks to byte position offset. +static mpc_bool_t impc_seek(mpc_reader *p_reader, mpc_int32_t offset) +{ + Stream *fw = (Stream*)(p_reader->data); + + try + { + fw->seek(offset, SEEK_SET); + return(MPC_TRUE); + } + catch(...) + { + return(MPC_FALSE); + } +} + +/// Returns the current byte offset in the stream. +static mpc_int32_t impc_tell(mpc_reader *p_reader) +{ + Stream *fw = (Stream*)(p_reader->data); + + try + { + return fw->tell(); + } + catch(...) + { + return(MPC_STATUS_FAIL); + } +} + +/// Returns the total length of the source stream, in bytes. +static mpc_int32_t impc_get_size(mpc_reader *p_reader) +{ + Stream *fw = (Stream*)(p_reader->data); + + try + { + return fw->size(); + } + catch(...) + { + return(MPC_STATUS_FAIL); + } +} + +/// True if the stream is a seekable stream. +static mpc_bool_t impc_canseek(mpc_reader *p_reader) +{ + return(MPC_TRUE); +} + +CDAFReader_MPC::CDAFReader_MPC(Stream *fp) : fw(fp) +{ + demux = NULL; + memset(&si, 0, sizeof(si)); + memset(MPCBuffer, 0, sizeof(MPCBuffer)); + MPCBufferOffs = 0; + MPCBufferIn = 0; + + memset(&reader, 0, sizeof(reader)); + reader.read = impc_read; + reader.seek = impc_seek; + reader.tell = impc_tell; + reader.get_size = impc_get_size; + reader.canseek = impc_canseek; + reader.data = (void*)fp; + + if(!(demux = mpc_demux_init(&reader))) + { + throw(0); + } + mpc_demux_get_info(demux, &si); + + if(si.channels != 2) + { + mpc_demux_exit(demux); + demux = NULL; + throw MDFN_Error(0, _("MusePack stream has wrong number of channels(%u); the correct number is 2."), si.channels); + } + + if(si.sample_freq != 44100) + { + mpc_demux_exit(demux); + demux = NULL; + throw MDFN_Error(0, _("MusePack stream has wrong samplerate(%u Hz); the correct samplerate is 44100 Hz."), si.sample_freq); + } +} + +CDAFReader_MPC::~CDAFReader_MPC() +{ + if(demux) + { + mpc_demux_exit(demux); + demux = NULL; + } +} + +uint64 CDAFReader_MPC::Read_(int16 *buffer, uint64 frames) +{ + mpc_status err; + int16 *cowbuf = (int16 *)buffer; + int32 toread = frames * 2; + + while(toread > 0) + { + int32 tmplen; + + if(!MPCBufferIn) + { + mpc_frame_info fi; + memset(&fi, 0, sizeof(fi)); + + fi.buffer = MPCBuffer; + if((err = mpc_demux_decode(demux, &fi)) < 0 || fi.bits == -1) + return(frames - toread / 2); + + MPCBufferIn = fi.samples * 2; + MPCBufferOffs = 0; + } + + tmplen = MPCBufferIn; + + if(tmplen >= toread) + tmplen = toread; + + for(int x = 0; x < tmplen; x++) + { +#ifdef MPC_FIXED_POINT + int32 samp = MPCBuffer[MPCBufferOffs + x] >> MPC_FIXED_POINT_FRACTPART; +#else + #warning Floating-point MPC decoding path not tested. + int32 samp = (int32)(MPCBuffer[MPCBufferOffs + x] * 32767); +#endif + if(samp < -32768) + samp = -32768; + + if(samp > 32767) + samp = 32767; + + *cowbuf = (int16)samp; + cowbuf++; + } + + MPCBufferOffs += tmplen; + toread -= tmplen; + MPCBufferIn -= tmplen; + } + + return(frames - toread / 2); +} + +bool CDAFReader_MPC::Seek_(uint64 frame_offset) +{ + MPCBufferOffs = 0; + MPCBufferIn = 0; + + if(mpc_demux_seek_sample(demux, frame_offset) < 0) + return(false); + + return(true); +} + +uint64 CDAFReader_MPC::FrameCount(void) +{ + return(mpc_streaminfo_get_length_samples(&si)); +} + + +CDAFReader* CDAFR_MPC_Open(Stream* fp) +{ + return new CDAFReader_MPC(fp); +} diff --git a/Mednafen/mednafen/cdrom/CDAFReader_MPC.h b/Mednafen/mednafen/cdrom/CDAFReader_MPC.h new file mode 100644 index 0000000000..6580fba79c --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader_MPC.h @@ -0,0 +1,6 @@ +#ifndef __MDFN_CDAFREADER_MPC_H +#define __MDFN_CDAFREADER_MPC_H + +CDAFReader* CDAFR_MPC_Open(Stream* fp); + +#endif diff --git a/Mednafen/mednafen/cdrom/CDAFReader_SF.cpp b/Mednafen/mednafen/cdrom/CDAFReader_SF.cpp new file mode 100644 index 0000000000..9abc6a6f0d --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader_SF.cpp @@ -0,0 +1,155 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "CDAFReader.h" +#include "CDAFReader_SF.h" + +#include + +class CDAFReader_SF final : public CDAFReader +{ + public: + + CDAFReader_SF(Stream *fp); + ~CDAFReader_SF(); + + uint64 Read_(int16 *buffer, uint64 frames) override; + bool Seek_(uint64 frame_offset) override; + uint64 FrameCount(void) override; + + private: + SNDFILE *sf; + SF_INFO sfinfo; + SF_VIRTUAL_IO sfvf; + + Stream *fw; +}; + +static sf_count_t isf_get_filelen(void *user_data) +{ + Stream *fw = (Stream*)user_data; + + try + { + return fw->size(); + } + catch(...) + { + return(-1); + } +} + +static sf_count_t isf_seek(sf_count_t offset, int whence, void *user_data) +{ + Stream *fw = (Stream*)user_data; + + try + { + //printf("Seek: offset=%lld, whence=%lld\n", (long long)offset, (long long)whence); + + fw->seek(offset, whence); + return fw->tell(); + } + catch(...) + { + //printf(" SEEK FAILED\n"); + return(-1); + } +} + +static sf_count_t isf_read(void *ptr, sf_count_t count, void *user_data) +{ + Stream *fw = (Stream*)user_data; + + try + { + sf_count_t ret = fw->read(ptr, count, false); + + //printf("Read: count=%lld, ret=%lld\n", (long long)count, (long long)ret); + + return ret; + } + catch(...) + { + //printf(" READ FAILED\n"); + return(0); + } +} + +static sf_count_t isf_write(const void *ptr, sf_count_t count, void *user_data) +{ + return(0); +} + +static sf_count_t isf_tell(void *user_data) +{ + Stream *fw = (Stream*)user_data; + + try + { + return fw->tell(); + } + catch(...) + { + return(-1); + } +} + +CDAFReader_SF::CDAFReader_SF(Stream *fp) : fw(fp) +{ + memset(&sfvf, 0, sizeof(sfvf)); + sfvf.get_filelen = isf_get_filelen; + sfvf.seek = isf_seek; + sfvf.read = isf_read; + sfvf.write = isf_write; + sfvf.tell = isf_tell; + + memset(&sfinfo, 0, sizeof(sfinfo)); + if(!(sf = sf_open_virtual(&sfvf, SFM_READ, &sfinfo, (void*)fp))) + throw(0); +} + +CDAFReader_SF::~CDAFReader_SF() +{ + sf_close(sf); +} + +uint64 CDAFReader_SF::Read_(int16 *buffer, uint64 frames) +{ + return(sf_read_short(sf, (short*)buffer, frames * 2) / 2); +} + +bool CDAFReader_SF::Seek_(uint64 frame_offset) +{ + // FIXME error condition + if((uint64)sf_seek(sf, frame_offset, SEEK_SET) != frame_offset) + return(false); + + return(true); +} + +uint64 CDAFReader_SF::FrameCount(void) +{ + return(sfinfo.frames); +} + + +CDAFReader* CDAFR_SF_Open(Stream* fp) +{ + return new CDAFReader_SF(fp); +} diff --git a/Mednafen/mednafen/cdrom/CDAFReader_SF.h b/Mednafen/mednafen/cdrom/CDAFReader_SF.h new file mode 100644 index 0000000000..2ab145bb37 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader_SF.h @@ -0,0 +1,6 @@ +#ifndef __MDFN_CDAFREADER_SF_H +#define __MDFN_CDAFREADER_SF_H + +CDAFReader* CDAFR_SF_Open(Stream* fp); + +#endif diff --git a/Mednafen/mednafen/cdrom/CDAFReader_Vorbis.cpp b/Mednafen/mednafen/cdrom/CDAFReader_Vorbis.cpp new file mode 100644 index 0000000000..5975b215b2 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader_Vorbis.cpp @@ -0,0 +1,158 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "CDAFReader.h" +#include "CDAFReader_Vorbis.h" + +#if 0 + #include +#else + #include +#endif + +class CDAFReader_Vorbis final : public CDAFReader +{ + public: + CDAFReader_Vorbis(Stream *fp); + ~CDAFReader_Vorbis(); + + uint64 Read_(int16 *buffer, uint64 frames) override; + bool Seek_(uint64 frame_offset) override; + uint64 FrameCount(void) override; + + private: + OggVorbis_File ovfile; + Stream *fw; +}; + + +static size_t iov_read_func(void *ptr, size_t size, size_t nmemb, void *user_data) +{ + Stream *fw = (Stream*)user_data; + + if(!size) + return(0); + + try + { + return fw->read(ptr, size * nmemb, false) / size; + } + catch(...) + { + return(0); + } +} + +static int iov_seek_func(void *user_data, ogg_int64_t offset, int whence) +{ + Stream *fw = (Stream*)user_data; + + try + { + fw->seek(offset, whence); + return(0); + } + catch(...) + { + return(-1); + } +} + +static int iov_close_func(void *user_data) +{ + Stream *fw = (Stream*)user_data; + + try + { + fw->close(); + return(0); + } + catch(...) + { + return EOF; + } +} + +static long iov_tell_func(void *user_data) +{ + Stream *fw = (Stream*)user_data; + + try + { + return fw->tell(); + } + catch(...) + { + return(-1); + } +} + +CDAFReader_Vorbis::CDAFReader_Vorbis(Stream *fp) : fw(fp) +{ + ov_callbacks cb; + + memset(&cb, 0, sizeof(cb)); + cb.read_func = iov_read_func; + cb.seek_func = iov_seek_func; + cb.close_func = iov_close_func; + cb.tell_func = iov_tell_func; + + if(ov_open_callbacks(fp, &ovfile, NULL, 0, cb)) + throw(0); +} + +CDAFReader_Vorbis::~CDAFReader_Vorbis() +{ + ov_clear(&ovfile); +} + +uint64 CDAFReader_Vorbis::Read_(int16 *buffer, uint64 frames) +{ + uint8 *tw_buf = (uint8 *)buffer; + int cursection = 0; + long toread = frames * sizeof(int16) * 2; + + while(toread > 0) + { + long didread = ov_read(&ovfile, (char*)tw_buf, toread, &cursection); + + if(didread == 0) + break; + + tw_buf = (uint8 *)tw_buf + didread; + toread -= didread; + } + + return(frames - toread / sizeof(int16) / 2); +} + +bool CDAFReader_Vorbis::Seek_(uint64 frame_offset) +{ + ov_pcm_seek(&ovfile, frame_offset); + return(true); +} + +uint64 CDAFReader_Vorbis::FrameCount(void) +{ + return(ov_pcm_total(&ovfile, -1)); +} + +CDAFReader* CDAFR_Vorbis_Open(Stream* fp) +{ + return new CDAFReader_Vorbis(fp); +} diff --git a/Mednafen/mednafen/cdrom/CDAFReader_Vorbis.h b/Mednafen/mednafen/cdrom/CDAFReader_Vorbis.h new file mode 100644 index 0000000000..f4a8c55b4f --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAFReader_Vorbis.h @@ -0,0 +1,7 @@ +#ifndef __MDFN_CDAFREADER_VORBIS_H +#define __MDFN_CDAFREADER_VORBIS_H + +CDAFReader* CDAFR_Vorbis_Open(Stream* fp); + +#endif + diff --git a/Mednafen/mednafen/cdrom/CDAccess.cpp b/Mednafen/mednafen/cdrom/CDAccess.cpp new file mode 100644 index 0000000000..2b1925804c --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAccess.cpp @@ -0,0 +1,46 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "CDAccess.h" +#include "CDAccess_Image.h" +#include "CDAccess_CCD.h" + +using namespace CDUtility; + +CDAccess::CDAccess() +{ + +} + +CDAccess::~CDAccess() +{ + +} + +CDAccess* CDAccess_Open(const std::string& path, bool image_memcache) +{ + CDAccess *ret = NULL; + + if(path.size() >= 4 && !strcasecmp(path.c_str() + path.size() - 4, ".ccd")) + ret = new CDAccess_CCD(path, image_memcache); + else + ret = new CDAccess_Image(path, image_memcache); + + return ret; +} + diff --git a/Mednafen/mednafen/cdrom/CDAccess.h b/Mednafen/mednafen/cdrom/CDAccess.h new file mode 100644 index 0000000000..0c0759d9b9 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAccess.h @@ -0,0 +1,32 @@ +#ifndef __MDFN_CDROMFILE_H +#define __MDFN_CDROMFILE_H + +#include + +#include "CDUtility.h" + +class CDAccess +{ + public: + + CDAccess(); + virtual ~CDAccess(); + + virtual void Read_Raw_Sector(uint8 *buf, int32 lba) = 0; + + // Returns false if the read wouldn't be "fast"(i.e. reading from a disk), + // or if the read can't be done in a thread-safe re-entrant manner. + // + // Writes 96 bytes into pwbuf, and returns 'true' otherwise. + virtual bool Fast_Read_Raw_PW_TSRE(uint8* pwbuf, int32 lba) const noexcept = 0; + + virtual void Read_TOC(CDUtility::TOC *toc) = 0; + + private: + CDAccess(const CDAccess&); // No copy constructor. + CDAccess& operator=(const CDAccess&); // No assignment operator. +}; + +CDAccess* CDAccess_Open(const std::string& path, bool image_memcache); + +#endif diff --git a/Mednafen/mednafen/cdrom/CDAccess_CCD.cpp b/Mednafen/mednafen/cdrom/CDAccess_CCD.cpp new file mode 100644 index 0000000000..63b5541d19 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAccess_CCD.cpp @@ -0,0 +1,416 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "../general.h" +#include "../string/trim.h" +#include "CDAccess_CCD.h" +#include + +#include +#include +#include + +using namespace CDUtility; + +static void MDFN_strtoupper(std::string &str) +{ + const size_t len = str.length(); + + for(size_t x = 0; x < len; x++) + { + if(str[x] >= 'a' && str[x] <= 'z') + { + str[x] = str[x] - 'a' + 'A'; + } + } +} + +typedef std::map CCD_Section; + +template +static T CCD_ReadInt(CCD_Section &s, const std::string &propname, const bool have_defval = false, const int defval = 0) +{ + CCD_Section::iterator zit = s.find(propname); + + if(zit == s.end()) + { + if(have_defval) + return defval; + else + throw MDFN_Error(0, _("Missing property: %s"), propname.c_str()); + } + + const std::string &v = zit->second; + int scan_base = 10; + size_t scan_offset = 0; + long ret = 0; + + if(v.length() >= 3 && v[0] == '0' && v[1] == 'x') + { + scan_base = 16; + scan_offset = 2; + } + + const char *vp = v.c_str() + scan_offset; + char *ep = NULL; + + if(std::numeric_limits::is_signed) + ret = strtol(vp, &ep, scan_base); + else + ret = strtoul(vp, &ep, scan_base); + + if(!vp[0] || ep[0]) + { + throw MDFN_Error(0, _("Property %s: Malformed integer: %s"), propname.c_str(), v.c_str()); + } + + //if(ret < minv || ret > maxv) + //{ + // throw MDFN_Error(0, _("Property %s: Integer %ld out of range(accepted: %d through %d)."), propname.c_str(), ret, minv, maxv); + //} + + return ret; +} + + +CDAccess_CCD::CDAccess_CCD(const std::string& path, bool image_memcache) : img_numsectors(0) +{ + Load(path, image_memcache); +} + +void CDAccess_CCD::Load(const std::string& path, bool image_memcache) +{ + FileStream cf(path, FileStream::MODE_READ); + std::map Sections; + std::string linebuf; + std::string cur_section_name; + std::string dir_path, file_base, file_ext; + char img_extsd[4] = { 'i', 'm', 'g', 0 }; + char sub_extsd[4] = { 's', 'u', 'b', 0 }; + + MDFN_GetFilePathComponents(path, &dir_path, &file_base, &file_ext); + + if(file_ext.length() == 4 && file_ext[0] == '.') + { + signed char extupt[3] = { -1, -1, -1 }; + + for(int i = 1; i < 4; i++) + { + if(file_ext[i] >= 'A' && file_ext[i] <= 'Z') + extupt[i - 1] = 'A' - 'a'; + else if(file_ext[i] >= 'a' && file_ext[i] <= 'z') + extupt[i - 1] = 0; + } + + signed char av = -1; + for(int i = 0; i < 3; i++) + { + if(extupt[i] != -1) + av = extupt[i]; + else + extupt[i] = av; + } + + if(av == -1) + av = 0; + + for(int i = 0; i < 3; i++) + { + if(extupt[i] == -1) + extupt[i] = av; + } + + for(int i = 0; i < 3; i++) + { + img_extsd[i] += extupt[i]; + sub_extsd[i] += extupt[i]; + } + } + + //printf("%s %d %d %d\n", file_ext.c_str(), extupt[0], extupt[1], extupt[2]); + + linebuf.reserve(256); + + while(cf.get_line(linebuf) >= 0) + { + MDFN_trim(linebuf); + + if(linebuf.length() == 0) // Skip blank lines. + continue; + + if(linebuf[0] == '[') + { + if(linebuf.length() < 3 || linebuf[linebuf.length() - 1] != ']') + throw MDFN_Error(0, _("Malformed section specifier: %s"), linebuf.c_str()); + + cur_section_name = linebuf.substr(1, linebuf.length() - 2); + MDFN_strtoupper(cur_section_name); + } + else + { + const size_t feqpos = linebuf.find('='); + const size_t leqpos = linebuf.rfind('='); + std::string k, v; + + if(feqpos == std::string::npos || feqpos != leqpos) + throw MDFN_Error(0, _("Malformed value pair specifier: %s"), linebuf.c_str()); + + k = linebuf.substr(0, feqpos); + v = linebuf.substr(feqpos + 1); + + MDFN_trim(k); + MDFN_trim(v); + + MDFN_strtoupper(k); + + Sections[cur_section_name][k] = v; + } + } + + { + CCD_Section& ds = Sections["DISC"]; + unsigned toc_entries = CCD_ReadInt(ds, "TOCENTRIES"); + unsigned num_sessions = CCD_ReadInt(ds, "SESSIONS"); + bool data_tracks_scrambled = CCD_ReadInt(ds, "DATATRACKSSCRAMBLED"); + + if(num_sessions != 1) + throw MDFN_Error(0, _("Unsupported number of sessions: %u"), num_sessions); + + if(data_tracks_scrambled) + throw MDFN_Error(0, _("Scrambled CCD data tracks currently not supported.")); + + //printf("MOO: %d\n", toc_entries); + + for(unsigned te = 0; te < toc_entries; te++) + { + char tmpbuf[64]; + trio_snprintf(tmpbuf, sizeof(tmpbuf), "ENTRY %u", te); + CCD_Section& ts = Sections[std::string(tmpbuf)]; + unsigned session = CCD_ReadInt(ts, "SESSION"); + uint8 point = CCD_ReadInt(ts, "POINT"); + uint8 adr = CCD_ReadInt(ts, "ADR"); + uint8 control = CCD_ReadInt(ts, "CONTROL"); + uint8 pmin = CCD_ReadInt(ts, "PMIN"); + uint8 psec = CCD_ReadInt(ts, "PSEC"); + //uint8 pframe = CCD_ReadInt(ts, "PFRAME"); + signed plba = CCD_ReadInt(ts, "PLBA"); + + if(session != 1) + throw MDFN_Error(0, "Unsupported TOC entry Session value: %u", session); + + // Reference: ECMA-394, page 5-14 + if(point >= 1 && point <= 99) + { + tocd.tracks[point].adr = adr; + tocd.tracks[point].control = control; + tocd.tracks[point].lba = plba; + tocd.tracks[point].valid = true; + } + else switch(point) + { + default: + throw MDFN_Error(0, "Unsupported TOC entry Point value: %u", point); + break; + + case 0xA0: + tocd.first_track = pmin; + tocd.disc_type = psec; + break; + + case 0xA1: + tocd.last_track = pmin; + break; + + case 0xA2: + tocd.tracks[100].adr = adr; + tocd.tracks[100].control = control; + tocd.tracks[100].lba = plba; + tocd.tracks[100].valid = true; + break; + } + } + } + + // + // Open image stream. + { + std::string image_path = MDFN_EvalFIP(dir_path, file_base + std::string(".") + std::string(img_extsd), true); + + if(image_memcache) + { + img_stream.reset(new MemoryStream(new FileStream(image_path, FileStream::MODE_READ))); + } + else + { + img_stream.reset(new FileStream(image_path, FileStream::MODE_READ)); + } + + uint64 ss = img_stream->size(); + + if(ss % 2352) + throw MDFN_Error(0, _("CCD image size is not evenly divisible by 2352.")); + + if(ss > 0x7FFFFFFF) + throw MDFN_Error(0, _("CCD image is too large.")); + + img_numsectors = ss / 2352; + } + + // + // Open subchannel stream + { + std::string sub_path = MDFN_EvalFIP(dir_path, file_base + std::string(".") + std::string(sub_extsd), true); + FileStream sub_stream(sub_path, FileStream::MODE_READ); + + if(sub_stream.size() != (uint64)img_numsectors * 96) + throw MDFN_Error(0, _("CCD SUB file size mismatch.")); + + sub_data.reset(new uint8[(uint64)img_numsectors * 96]); + sub_stream.read(sub_data.get(), (uint64)img_numsectors * 96); + } + + CheckSubQSanity(); +} + +// +// Checks for Q subchannel mode 1(current time) data that has a correct checksum, but the data is nonsensical or corrupted nonetheless; this is the +// case for some bad rips floating around on the Internet. Allowing these bad rips to be used will cause all sorts of problems during emulation, so we +// error out here if a bad rip is detected. +// +// This check is not as aggressive or exhaustive as it could be, and will not detect all potential Q subchannel rip errors; as such, it should definitely NOT be +// used in an effort to "repair" a broken rip. +// +void CDAccess_CCD::CheckSubQSanity(void) +{ + size_t checksum_pass_counter = 0; + int prev_lba = INT_MAX; + uint8 prev_track = 0; + + for(size_t s = 0; s < img_numsectors; s++) + { + union + { + uint8 full[96]; + struct + { + uint8 pbuf[12]; + uint8 qbuf[12]; + }; + } buf; + + memcpy(buf.full, &sub_data[s * 96], 96); + + if(subq_check_checksum(buf.qbuf)) + { + uint8 adr = buf.qbuf[0] & 0xF; + + if(adr == 0x01) + { + uint8 track_bcd = buf.qbuf[1]; + uint8 index_bcd = buf.qbuf[2]; + uint8 rm_bcd = buf.qbuf[3]; + uint8 rs_bcd = buf.qbuf[4]; + uint8 rf_bcd = buf.qbuf[5]; + uint8 am_bcd = buf.qbuf[7]; + uint8 as_bcd = buf.qbuf[8]; + uint8 af_bcd = buf.qbuf[9]; + + //printf("%2x %2x %2x\n", am_bcd, as_bcd, af_bcd); + + if(!BCD_is_valid(track_bcd) || !BCD_is_valid(index_bcd) || !BCD_is_valid(rm_bcd) || !BCD_is_valid(rs_bcd) || !BCD_is_valid(rf_bcd) || + !BCD_is_valid(am_bcd) || !BCD_is_valid(as_bcd) || !BCD_is_valid(af_bcd) || + rs_bcd > 0x59 || rf_bcd > 0x74 || as_bcd > 0x59 || af_bcd > 0x74) + { + throw MDFN_Error(0, _("Garbage subchannel Q data detected(bad BCD/out of range): %02x:%02x:%02x %02x:%02x:%02x"), rm_bcd, rs_bcd, rf_bcd, am_bcd, as_bcd, af_bcd); + } + else + { + int lba = ((BCD_to_U8(am_bcd) * 60 + BCD_to_U8(as_bcd)) * 75 + BCD_to_U8(af_bcd)) - 150; + uint8 track = BCD_to_U8(track_bcd); + + if(prev_lba != INT_MAX && abs(lba - prev_lba) > 100) + throw MDFN_Error(0, _("Garbage subchannel Q data detected(excessively large jump in AMSF)")); + + if(labs(lba - s) > 100) + throw MDFN_Error(0, _("Garbage subchannel Q data detected(AMSF value is out of tolerance)")); + + prev_lba = lba; + + if(track < prev_track) + throw MDFN_Error(0, _("Garbage subchannel Q data detected(bad track number)")); + //else if(prev_track && track - pre + + prev_track = track; + } + checksum_pass_counter++; + } + } + } + + //printf("%u/%u\n", checksum_pass_counter, img_numsectors); +} + +CDAccess_CCD::~CDAccess_CCD() +{ + +} + +void CDAccess_CCD::Read_Raw_Sector(uint8 *buf, int32 lba) +{ + if(lba < 0) + { + synth_udapp_sector_lba(0xFF, tocd, lba, 0, buf); + return; + } + + if((size_t)lba >= img_numsectors) + { + synth_leadout_sector_lba(0xFF, tocd, lba, buf); + return; + } + + img_stream->seek(lba * 2352, SEEK_SET); + img_stream->read(buf, 2352); + + subpw_interleave(&sub_data[lba * 96], buf + 2352); +} + +bool CDAccess_CCD::Fast_Read_Raw_PW_TSRE(uint8* pwbuf, int32 lba) const noexcept +{ + if(lba < 0) + { + subpw_synth_udapp_lba(tocd, lba, 0, pwbuf); + return true; + } + + if((size_t)lba >= img_numsectors) + { + subpw_synth_leadout_lba(tocd, lba, pwbuf); + return true; + } + + subpw_interleave(&sub_data[lba * 96], pwbuf); + + return true; +} + +void CDAccess_CCD::Read_TOC(CDUtility::TOC *toc) +{ + *toc = tocd; +} + diff --git a/Mednafen/mednafen/cdrom/CDAccess_CCD.h b/Mednafen/mednafen/cdrom/CDAccess_CCD.h new file mode 100644 index 0000000000..2d3d2292d5 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAccess_CCD.h @@ -0,0 +1,47 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../FileStream.h" +#include "../MemoryStream.h" +#include "CDAccess.h" + +class CDAccess_CCD : public CDAccess +{ + public: + + CDAccess_CCD(const std::string& path, bool image_memcache); + virtual ~CDAccess_CCD(); + + virtual void Read_Raw_Sector(uint8 *buf, int32 lba); + + virtual bool Fast_Read_Raw_PW_TSRE(uint8* pwbuf, int32 lba) const noexcept; + + virtual void Read_TOC(CDUtility::TOC *toc); + + private: + + void Load(const std::string& path, bool image_memcache); + void Cleanup(void); + + void CheckSubQSanity(void); + + std::unique_ptr img_stream; + std::unique_ptr sub_data; + + size_t img_numsectors; + CDUtility::TOC tocd; +}; diff --git a/Mednafen/mednafen/cdrom/CDAccess_Image.cpp b/Mednafen/mednafen/cdrom/CDAccess_Image.cpp new file mode 100644 index 0000000000..5b96877907 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAccess_Image.cpp @@ -0,0 +1,1310 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Notes and TODO: + + POSTGAP in CUE sheets may not be handled properly, should the directive automatically increment the index number? + + INDEX nn where 02 <= nn <= 99 is not supported in CUE sheets. + + TOC reading code is extremely barebones, leaving out support for more esoteric features. + + A PREGAP statement in the first track definition in a CUE sheet may not work properly(depends on what is proper); + it will be added onto the implicit default 00:02:00 of pregap. +*/ + +#include "../mednafen.h" + +#include + +#include +#include +#include +#include +#include + +#include "../general.h" +#include "../string/trim.h" +#include "../endian.h" +#include "../FileStream.h" +#include "../MemoryStream.h" + +#include "CDAccess.h" +#include "CDAccess_Image.h" + +#include "CDAFReader.h" + +#include + +using namespace CDUtility; + +enum +{ + CDRF_SUBM_NONE = 0, + CDRF_SUBM_RW = 1, + CDRF_SUBM_RW_RAW = 2 +}; + +// Disk-image(rip) track/sector formats +enum +{ + DI_FORMAT_AUDIO = 0x00, + DI_FORMAT_MODE1 = 0x01, + DI_FORMAT_MODE1_RAW = 0x02, + DI_FORMAT_MODE2 = 0x03, + DI_FORMAT_MODE2_FORM1 = 0x04, + DI_FORMAT_MODE2_FORM2 = 0x05, + DI_FORMAT_MODE2_RAW = 0x06, + DI_FORMAT_CDI_RAW = 0x07, + _DI_FORMAT_COUNT +}; + +static const int32 DI_Size_Table[8] = +{ + 2352, // Audio + 2048, // MODE1 + 2352, // MODE1 RAW + 2336, // MODE2 + 2048, // MODE2 Form 1 + 2324, // Mode 2 Form 2 + 2352, // MODE2 RAW + 2352, // CD-I RAW +}; + +static const char *DI_CDRDAO_Strings[8] = +{ + "AUDIO", + "MODE1", + "MODE1_RAW", + "MODE2", + "MODE2_FORM1", + "MODE2_FORM2", + "MODE2_RAW", + "CDI_RAW" +}; + +static const char *DI_CUE_Strings[8] = +{ + "AUDIO", + "MODE1/2048", + "MODE1/2352", + "MODE2/2336", // FIXME: A guess + "MODE2/2048", // FIXME: A guess + "MODE2/2324", // FIXME: A guess + "MODE2/2352", // FIXME: A guess + "CDI/2352", +}; + +// Should return an offset to the start of the next argument(past any whitespace), or if there isn't a next argument, +// it'll return the length of the src string. +static size_t UnQuotify(const std::string &src, size_t source_offset, std::string &dest, bool parse_quotes = true) +{ + const size_t source_len = src.length(); + bool in_quote = 0; + bool already_normal = 0; + + dest.clear(); + + while(source_offset < source_len) + { + if(src[source_offset] == ' ' || src[source_offset] == '\t') + { + if(!in_quote) + { + if(already_normal) // Trailing whitespace(IE we're done with this argument) + break; + else // Leading whitespace, ignore it. + { + source_offset++; + continue; + } + } + } + + if(src[source_offset] == '"' && parse_quotes) + { + if(in_quote) + { + source_offset++; +// Not sure which behavior is most useful(or correct :b). +#if 0 + in_quote = false; + already_normal = true; +#else + break; +#endif + } + else + in_quote = 1; + } + else + { + dest.push_back(src[source_offset]); + already_normal = 1; + } + source_offset++; + } + + while(source_offset < source_len) + { + if(src[source_offset] != ' ' && src[source_offset] != '\t') + break; + + source_offset++; + } + + return source_offset; +} + +uint32 CDAccess_Image::GetSectorCount(CDRFILE_TRACK_INFO *track) +{ + if(track->DIFormat == DI_FORMAT_AUDIO) + { + if(track->AReader) + return(((track->AReader->FrameCount() * 4) - track->FileOffset) / 2352); + else + { + const int64 size = track->fp->size(); + + //printf("%d %d %d\n", (int)stat_buf.st_size, (int)track->FileOffset, (int)stat_buf.st_size - (int)track->FileOffset); + if(track->SubchannelMode) + return((size - track->FileOffset) / (2352 + 96)); + else + return((size - track->FileOffset) / 2352); + } + } + else + { + const int64 size = track->fp->size(); + + return((size - track->FileOffset) / DI_Size_Table[track->DIFormat]); + } + + return(0); +} + +void CDAccess_Image::ParseTOCFileLineInfo(CDRFILE_TRACK_INFO *track, const int tracknum, const std::string &filename, const char *binoffset, const char *msfoffset, const char *length, bool image_memcache, std::map &toc_streamcache) +{ + long offset = 0; // In bytes! + long tmp_long; + int m, s, f; + uint32 sector_mult; + long sectors; + std::map::iterator ribbit; + + ribbit = toc_streamcache.find(filename); + + if(ribbit != toc_streamcache.end()) + { + track->FirstFileInstance = 0; + + track->fp = ribbit->second; + } + else + { + std::string efn; + + track->FirstFileInstance = 1; + + efn = MDFN_EvalFIP(base_dir, filename); + + if(image_memcache) + track->fp = new MemoryStream(new FileStream(efn, FileStream::MODE_READ)); + else + track->fp = new FileStream(efn, FileStream::MODE_READ); + + toc_streamcache[filename] = track->fp; + } + + if(filename.length() >= 4 && !strcasecmp(filename.c_str() + filename.length() - 4, ".wav")) + { + track->AReader = CDAFR_Open(track->fp); + + if(!track->AReader) + throw MDFN_Error(0, "TODO ERROR"); + } + + sector_mult = DI_Size_Table[track->DIFormat]; + + if(track->SubchannelMode) + sector_mult += 96; + + if(binoffset && trio_sscanf(binoffset, "%ld", &tmp_long) == 1) + { + offset += tmp_long; + } + + if(msfoffset && trio_sscanf(msfoffset, "%d:%d:%d", &m, &s, &f) == 3) + { + offset += ((m * 60 + s) * 75 + f) * sector_mult; + } + + track->FileOffset = offset; // Make sure this is set before calling GetSectorCount()! + sectors = GetSectorCount(track); + //printf("Track: %d, offset: %ld, %ld\n", tracknum, offset, sectors); + + if(length) + { + tmp_long = sectors; + + if(trio_sscanf(length, "%d:%d:%d", &m, &s, &f) == 3) + tmp_long = (m * 60 + s) * 75 + f; + else if(track->DIFormat == DI_FORMAT_AUDIO) + { + char *endptr = NULL; + + tmp_long = strtol(length, &endptr, 10); + + // Error? + if(endptr == length) + { + tmp_long = sectors; + } + else + tmp_long /= 588; + + } + + if(tmp_long > sectors) + { + throw MDFN_Error(0, _("Length specified in TOC file for track %d is too large by %ld sectors!\n"), tracknum, (long)(tmp_long - sectors)); + } + sectors = tmp_long; + } + + track->sectors = sectors; +} + +static void MDFN_strtoupper(std::string &str) +{ + const size_t len = str.length(); + + for(size_t x = 0; x < len; x++) + { + if(str[x] >= 'a' && str[x] <= 'z') + { + str[x] = str[x] - 'a' + 'A'; + } + } +} + +#if 0 +std::string MDFN_toupper(const std::string &str) +{ + const size_t len = str.length(); + std::string new_str; + + new_str.reserve(len); + + for(size_t x = 0; x < len; x++) + { + int c = str[x]; + + if(c >= 'a' && c <= 'z') + c = c - 'a' + 'A'; + + new_str.push_back(c); + } +} +#endif + +void CDAccess_Image::LoadSBI(const std::string& sbi_path) +{ + MDFN_printf(_("Loading SBI file \"%s\"...\n"), sbi_path.c_str()); + { + MDFN_AutoIndent aind(1); + + try + { + FileStream sbis(sbi_path, FileStream::MODE_READ); + uint8 header[4]; + uint8 ed[4 + 10]; + uint8 tmpq[12]; + + sbis.read(header, 4); + + if(memcmp(header, "SBI\0", 4)) + throw MDFN_Error(0, _("Not recognized a valid SBI file.")); + + while(sbis.read(ed, sizeof(ed), false) == sizeof(ed)) + { + if(!BCD_is_valid(ed[0]) || !BCD_is_valid(ed[1]) || !BCD_is_valid(ed[2])) + throw MDFN_Error(0, _("Bad BCD MSF offset in SBI file: %02x:%02x:%02x"), ed[0], ed[1], ed[2]); + + if(ed[3] != 0x01) + throw MDFN_Error(0, _("Unrecognized boogly oogly in SBI file: %02x"), ed[3]); + + memcpy(tmpq, &ed[4], 10); + + // + subq_generate_checksum(tmpq); + tmpq[10] ^= 0xFF; + tmpq[11] ^= 0xFF; + // + + //printf("%02x:%02x:%02x --- ", ed[0], ed[1], ed[2]); + //for(unsigned i = 0; i < 12; i++) + // printf("%02x ", tmpq[i]); + //printf("\n"); + + uint32 aba = AMSF_to_ABA(BCD_to_U8(ed[0]), BCD_to_U8(ed[1]), BCD_to_U8(ed[2])); + + memcpy(SubQReplaceMap[aba].data(), tmpq, 12); + } + MDFN_printf(_("Loaded Q subchannel replacements for %zu sectors.\n"), SubQReplaceMap.size()); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + else + MDFN_printf(_("Error: %s\n"), e.what()); + } + catch(std::exception &e) + { + throw; + } + } +} + +static void StringToMSF(const char* str, unsigned* m, unsigned* s, unsigned* f) +{ + if(trio_sscanf(str, "%u:%u:%u", m, s, f) != 3) + throw MDFN_Error(0, _("M:S:F time \"%s\" is malformed."), str); + + if(*m > 99 || *s > 59 || *f > 74) + throw MDFN_Error(0, _("M:S:F time \"%s\" contains component(s) out of range."), str); +} + +void CDAccess_Image::ImageOpen(const std::string& path, bool image_memcache) +{ + MemoryStream fp(new FileStream(path, FileStream::MODE_READ)); + static const unsigned max_args = 4; + std::string linebuf; + std::string cmdbuf, args[max_args]; + bool IsTOC = FALSE; + int32 active_track = -1; + int32 AutoTrackInc = 1; // For TOC + CDRFILE_TRACK_INFO TmpTrack; + std::string file_base, file_ext; + std::map toc_streamcache; + + disc_type = DISC_TYPE_CDDA_OR_M1; + memset(&TmpTrack, 0, sizeof(TmpTrack)); + + MDFN_GetFilePathComponents(path, &base_dir, &file_base, &file_ext); + + if(!strcasecmp(file_ext.c_str(), ".toc")) + { + MDFN_printf(_("TOC file detected.\n")); + IsTOC = true; + } + + // Check for annoying UTF-8 BOM. + if(!IsTOC) + { + uint8 bom_tmp[3]; + + if(fp.read(bom_tmp, 3, false) == 3 && bom_tmp[0] == 0xEF && bom_tmp[1] == 0xBB && bom_tmp[2] == 0xBF) + { + // Print an annoying error message, but don't actually error out. + MDFN_PrintError(_("UTF-8 BOM detected at start of CUE sheet.")); + } + else + fp.seek(0, SEEK_SET); + } + + + // Assign opposite maximum values so our tests will work! + FirstTrack = 99; + LastTrack = 0; + + linebuf.reserve(1024); + while(fp.get_line(linebuf) >= 0) + { + unsigned argcount = 0; + + if(IsTOC) + { + // Handle TOC format comments + size_t ss_loc = linebuf.find("//"); + + if(ss_loc != std::string::npos) + linebuf.resize(ss_loc); + } + + // Call trim AFTER we handle TOC-style comments, so we'll be sure to remove trailing whitespace in lines like: MONKEY // BABIES + MDFN_trim(linebuf); + + if(linebuf.length() == 0) // Skip blank lines. + continue; + + // Grab command and arguments. + { + size_t offs = 0; + + offs = UnQuotify(linebuf, offs, cmdbuf, false); + for(argcount = 0; argcount < max_args && offs < linebuf.length(); argcount++) + offs = UnQuotify(linebuf, offs, args[argcount]); + + // Make sure unused arguments are cleared out so we don't have inter-line leaks! + for(unsigned x = argcount; x < max_args; x++) + args[x].clear(); + + MDFN_strtoupper(cmdbuf); + } + + //printf("%s\n", cmdbuf.c_str()); //: %s %s %s %s\n", cmdbuf.c_str(), args[0].c_str(), args[1].c_str(), args[2].c_str(), args[3].c_str()); + + if(IsTOC) + { + if(cmdbuf == "TRACK") + { + if(active_track >= 0) + { + memcpy(&Tracks[active_track], &TmpTrack, sizeof(TmpTrack)); + memset(&TmpTrack, 0, sizeof(TmpTrack)); + active_track = -1; + } + + if(AutoTrackInc > 99) + { + throw(MDFN_Error(0, _("Invalid track number: %d"), AutoTrackInc)); + } + + active_track = AutoTrackInc++; + if(active_track < FirstTrack) + FirstTrack = active_track; + if(active_track > LastTrack) + LastTrack = active_track; + + int format_lookup; + for(format_lookup = 0; format_lookup < _DI_FORMAT_COUNT; format_lookup++) + { + if(!strcasecmp(args[0].c_str(), DI_CDRDAO_Strings[format_lookup])) + { + TmpTrack.DIFormat = format_lookup; + break; + } + } + + if(format_lookup == _DI_FORMAT_COUNT) + { + throw(MDFN_Error(0, _("Invalid track format: %s"), args[0].c_str())); + } + + if(TmpTrack.DIFormat == DI_FORMAT_AUDIO) + TmpTrack.RawAudioMSBFirst = TRUE; // Silly cdrdao... + + if(!strcasecmp(args[1].c_str(), "RW")) + { + TmpTrack.SubchannelMode = CDRF_SUBM_RW; + throw(MDFN_Error(0, _("\"RW\" format subchannel data not supported, only \"RW_RAW\" is!"))); + } + else if(!strcasecmp(args[1].c_str(), "RW_RAW")) + TmpTrack.SubchannelMode = CDRF_SUBM_RW_RAW; + + } // end to TRACK + else if(cmdbuf == "SILENCE") + { + //throw MDFN_Error(0, _("Unsupported directive: %s"), cmdbuf.c_str()); + } + else if(cmdbuf == "ZERO") + { + //throw MDFN_Error(0, _("Unsupported directive: %s"), cmdbuf.c_str()); + } + else if(cmdbuf == "FIFO") + { + throw MDFN_Error(0, _("Unsupported directive: %s"), cmdbuf.c_str()); + } + else if(cmdbuf == "FILE" || cmdbuf == "AUDIOFILE") + { + const char *binoffset = NULL; + const char *msfoffset = NULL; + const char *length = NULL; + + if(args[1].c_str()[0] == '#') + { + binoffset = args[1].c_str() + 1; + msfoffset = args[2].c_str(); + length = args[3].c_str(); + } + else + { + msfoffset = args[1].c_str(); + length = args[2].c_str(); + } + //printf("%s, %s, %s, %s\n", args[0].c_str(), binoffset, msfoffset, length); + ParseTOCFileLineInfo(&TmpTrack, active_track, args[0], binoffset, msfoffset, length, image_memcache, toc_streamcache); + } + else if(cmdbuf == "DATAFILE") + { + const char *binoffset = NULL; + const char *length = NULL; + + if(args[1].c_str()[0] == '#') + { + binoffset = args[1].c_str() + 1; + length = args[2].c_str(); + } + else + length = args[1].c_str(); + + ParseTOCFileLineInfo(&TmpTrack, active_track, args[0], binoffset, NULL, length, image_memcache, toc_streamcache); + } + else if(cmdbuf == "INDEX") + { + + } + else if(cmdbuf == "PREGAP") + { + if(active_track < 0) + { + throw(MDFN_Error(0, _("Command %s is outside of a TRACK definition!\n"), cmdbuf.c_str())); + } + + unsigned int m,s,f; + + StringToMSF(args[0].c_str(), &m, &s, &f); + + TmpTrack.pregap = (m * 60 + s) * 75 + f; + } // end to PREGAP + else if(cmdbuf == "START") + { + if(active_track < 0) + { + throw(MDFN_Error(0, _("Command %s is outside of a TRACK definition!\n"), cmdbuf.c_str())); + } + + unsigned int m,s,f; + + StringToMSF(args[0].c_str(), &m, &s, &f); + + TmpTrack.pregap = (m * 60 + s) * 75 + f; + } + else if(cmdbuf == "TWO_CHANNEL_AUDIO") + { + TmpTrack.subq_control &= ~SUBQ_CTRLF_4CH; + } + else if(cmdbuf == "FOUR_CHANNEL_AUDIO") + { + TmpTrack.subq_control |= SUBQ_CTRLF_4CH; + } + else if(cmdbuf == "NO") + { + MDFN_strtoupper(args[0]); + + if(args[0] == "COPY") + { + TmpTrack.subq_control &= ~SUBQ_CTRLF_DCP; + } + else if(args[0] == "PRE_EMPHASIS") + { + TmpTrack.subq_control &= ~SUBQ_CTRLF_PRE; + } + else + { + throw MDFN_Error(0, _("Unsupported argument to \"NO\" directive: %s"), args[0].c_str()); + } + } + else if(cmdbuf == "COPY") + { + TmpTrack.subq_control |= SUBQ_CTRLF_DCP; + } + else if(cmdbuf == "PRE_EMPHASIS") + { + TmpTrack.subq_control |= SUBQ_CTRLF_PRE; + } + // TODO: Confirm that these are taken from the TOC of the disc, and not synthesized by cdrdao. + else if(cmdbuf == "CD_DA") + disc_type = DISC_TYPE_CDDA_OR_M1; + else if(cmdbuf == "CD_ROM") + disc_type = DISC_TYPE_CDDA_OR_M1; + else if(cmdbuf == "CD_ROM_XA") + disc_type = DISC_TYPE_CD_XA; + else + { + //throw MDFN_Error(0, _("Unsupported directive: %s"), cmdbuf.c_str()); + } + // TODO: CATALOG + + } /*********** END TOC HANDLING ************/ + else // now for CUE sheet handling + { + if(cmdbuf == "FILE") + { + if(active_track >= 0) + { + memcpy(&Tracks[active_track], &TmpTrack, sizeof(TmpTrack)); + memset(&TmpTrack, 0, sizeof(TmpTrack)); + active_track = -1; + } + + std::string efn = MDFN_EvalFIP(base_dir, args[0]); + TmpTrack.fp = new FileStream(efn, FileStream::MODE_READ); + TmpTrack.FirstFileInstance = 1; + + if(image_memcache) + TmpTrack.fp = new MemoryStream(TmpTrack.fp); + + if(!strcasecmp(args[1].c_str(), "BINARY")) + { + //TmpTrack.Format = TRACK_FORMAT_DATA; + //struct stat stat_buf; + //fstat(fileno(TmpTrack.fp), &stat_buf); + //TmpTrack.sectors = stat_buf.st_size; // / 2048; + } + else if(!strcasecmp(args[1].c_str(), "OGG") || !strcasecmp(args[1].c_str(), "VORBIS") || !strcasecmp(args[1].c_str(), "WAVE") || !strcasecmp(args[1].c_str(), "WAV") || !strcasecmp(args[1].c_str(), "PCM") + || !strcasecmp(args[1].c_str(), "MPC") || !strcasecmp(args[1].c_str(), "MP+")) + { + TmpTrack.AReader = CDAFR_Open(TmpTrack.fp); + if(!TmpTrack.AReader) + { + throw(MDFN_Error(0, _("Unsupported audio track file format: %s\n"), args[0].c_str())); + } + } + else + { + throw(MDFN_Error(0, _("Unsupported track format: %s\n"), args[1].c_str())); + } + } + else if(cmdbuf == "TRACK") + { + if(active_track >= 0) + { + memcpy(&Tracks[active_track], &TmpTrack, sizeof(TmpTrack)); + TmpTrack.FirstFileInstance = 0; + TmpTrack.pregap = 0; + TmpTrack.pregap_dv = 0; + TmpTrack.postgap = 0; + TmpTrack.index[0] = -1; + TmpTrack.index[1] = 0; + } + active_track = atoi(args[0].c_str()); + + if(active_track < 1 || active_track > 99) + { + throw(MDFN_Error(0, _("Invalid track number: %d\n"), active_track)); + } + + if(active_track < FirstTrack) + FirstTrack = active_track; + if(active_track > LastTrack) + LastTrack = active_track; + + int format_lookup; + for(format_lookup = 0; format_lookup < _DI_FORMAT_COUNT; format_lookup++) + { + if(!strcasecmp(args[1].c_str(), DI_CUE_Strings[format_lookup])) + { + TmpTrack.DIFormat = format_lookup; + break; + } + } + + if(format_lookup == _DI_FORMAT_COUNT) + { + throw(MDFN_Error(0, _("Invalid track format: %s\n"), args[1].c_str())); + } + } + else if(cmdbuf == "INDEX") + { + if(active_track >= 0) + { + unsigned int m,s,f; + + StringToMSF(args[1].c_str(), &m, &s, &f); + + if(!strcasecmp(args[0].c_str(), "01") || !strcasecmp(args[0].c_str(), "1")) + TmpTrack.index[1] = (m * 60 + s) * 75 + f; + else if(!strcasecmp(args[0].c_str(), "00") || !strcasecmp(args[0].c_str(), "0")) + TmpTrack.index[0] = (m * 60 + s) * 75 + f; + } + } + else if(cmdbuf == "PREGAP") + { + if(active_track >= 0) + { + unsigned int m,s,f; + + StringToMSF(args[0].c_str(), &m, &s, &f); + + TmpTrack.pregap = (m * 60 + s) * 75 + f; + } + } + else if(cmdbuf == "POSTGAP") + { + if(active_track >= 0) + { + unsigned int m,s,f; + + StringToMSF(args[0].c_str(), &m, &s, &f); + + TmpTrack.postgap = (m * 60 + s) * 75 + f; + } + } + else if(cmdbuf == "REM") + { + + } + else if(cmdbuf == "FLAGS") + { + TmpTrack.subq_control &= ~(SUBQ_CTRLF_PRE | SUBQ_CTRLF_DCP | SUBQ_CTRLF_4CH); + for(unsigned i = 0; i < argcount; i++) + { + if(args[i] == "DCP") + { + TmpTrack.subq_control |= SUBQ_CTRLF_DCP; + } + else if(args[i] == "4CH") + { + TmpTrack.subq_control |= SUBQ_CTRLF_4CH; + } + else if(args[i] == "PRE") + { + TmpTrack.subq_control |= SUBQ_CTRLF_PRE; + } + else if(args[i] == "SCMS") + { + // Not implemented, likely pointless. PROBABLY indicates that the copy bit of the subchannel Q control field is supposed to + // alternate between 1 and 0 at 9.375 Hz(four 1, four 0, four 1, four 0, etc.). + } + else + { + throw MDFN_Error(0, _("Unknown CUE sheet \"FLAGS\" directive flag \"%s\".\n"), args[i].c_str()); + } + } + } + else if(cmdbuf == "CDTEXTFILE" || cmdbuf == "CATALOG" || cmdbuf == "ISRC" || + cmdbuf == "TITLE" || cmdbuf == "PERFORMER" || cmdbuf == "SONGWRITER") + { + MDFN_printf(_("Unsupported CUE sheet directive: \"%s\".\n"), cmdbuf.c_str()); // FIXME, generic logger passed by pointer to constructor + } + else + { + throw MDFN_Error(0, _("Unknown CUE sheet directive \"%s\".\n"), cmdbuf.c_str()); + } + } // end of CUE sheet handling + } // end of fgets() loop + + if(active_track >= 0) + memcpy(&Tracks[active_track], &TmpTrack, sizeof(TmpTrack)); + + if(FirstTrack > LastTrack) + { + throw(MDFN_Error(0, _("No tracks found!\n"))); + } + + FirstTrack = FirstTrack; + NumTracks = 1 + LastTrack - FirstTrack; + + int32 RunningLBA = 0; + int32 LastIndex = 0; + long FileOffset = 0; + + RunningLBA -= 150; + Tracks[FirstTrack].pregap += 150; + + for(int x = FirstTrack; x < (FirstTrack + NumTracks); x++) + { + if(!Tracks[x].fp && !Tracks[x].AReader) + throw MDFN_Error(0, _("Missing track %u."), x); + + if(Tracks[x].DIFormat == DI_FORMAT_AUDIO) + Tracks[x].subq_control &= ~SUBQ_CTRLF_DATA; + else + Tracks[x].subq_control |= SUBQ_CTRLF_DATA; + + if(!IsTOC) // TOC-format disc_type calculation is handled differently. + { + if(disc_type != DISC_TYPE_CD_I) + { + switch(Tracks[x].DIFormat) + { + default: break; + + case DI_FORMAT_MODE2: + case DI_FORMAT_MODE2_FORM1: + case DI_FORMAT_MODE2_FORM2: + case DI_FORMAT_MODE2_RAW: + disc_type = DISC_TYPE_CD_XA; + break; + + case DI_FORMAT_CDI_RAW: + disc_type = DISC_TYPE_CD_I; + break; + } + } + } + + if(IsTOC) + { + RunningLBA += Tracks[x].pregap; + Tracks[x].LBA = RunningLBA; + RunningLBA += Tracks[x].sectors; + RunningLBA += Tracks[x].postgap; + } + else // else handle CUE sheet... + { + if(Tracks[x].FirstFileInstance) + { + LastIndex = 0; + FileOffset = 0; + } + + RunningLBA += Tracks[x].pregap; + + Tracks[x].pregap_dv = 0; + + if(Tracks[x].index[0] != -1) + Tracks[x].pregap_dv = Tracks[x].index[1] - Tracks[x].index[0]; + + FileOffset += Tracks[x].pregap_dv * DI_Size_Table[Tracks[x].DIFormat]; + + RunningLBA += Tracks[x].pregap_dv; + + Tracks[x].LBA = RunningLBA; + + // Make sure FileOffset this is set before the call to GetSectorCount() + Tracks[x].FileOffset = FileOffset; + Tracks[x].sectors = GetSectorCount(&Tracks[x]); + + if((x + 1) >= (FirstTrack + NumTracks) || Tracks[x+1].FirstFileInstance) + { + + } + else + { + // Fix the sector count if we have multiple tracks per one binary image file. + if(Tracks[x + 1].index[0] == -1) + Tracks[x].sectors = Tracks[x + 1].index[1] - Tracks[x].index[1]; + else + Tracks[x].sectors = Tracks[x + 1].index[0] - Tracks[x].index[1]; //Tracks[x + 1].index - Tracks[x].index; + } + + //printf("Poo: %d %d\n", x, Tracks[x].sectors); + RunningLBA += Tracks[x].sectors; + RunningLBA += Tracks[x].postgap; + + //printf("%d, %ld %d %d %d %d\n", x, FileOffset, Tracks[x].index, Tracks[x].pregap, Tracks[x].sectors, Tracks[x].LBA); + + FileOffset += Tracks[x].sectors * DI_Size_Table[Tracks[x].DIFormat]; + } // end to cue sheet handling + } // end to track loop + + total_sectors = RunningLBA; + + // + // Load SBI file, if present + // + if(!IsTOC) + { + char sbi_ext[4] = { 's', 'b', 'i', 0 }; + + if(file_ext.length() == 4 && file_ext[0] == '.') + { + for(unsigned i = 0; i < 3; i++) + { + if(file_ext[1 + i] >= 'A' && file_ext[1 + i] <= 'Z') + sbi_ext[i] += 'A' - 'a'; + } + } +#pragma message "test emulator do not load it because we dont have one" + //LoadSBI(MDFN_EvalFIP(base_dir, file_base + std::string(".") + std::string(sbi_ext), true).c_str()); + } + + GenerateTOC(); +} + +void CDAccess_Image::Cleanup(void) +{ + for(int32 track = 0; track < 100; track++) + { + CDRFILE_TRACK_INFO *this_track = &Tracks[track]; + + if(this_track->FirstFileInstance) + { + if(Tracks[track].AReader) + { + delete Tracks[track].AReader; + Tracks[track].AReader = NULL; + } + + if(this_track->fp) + { + delete this_track->fp; + this_track->fp = NULL; + } + } + } +} + +CDAccess_Image::CDAccess_Image(const std::string& path, bool image_memcache) : NumTracks(0), FirstTrack(0), LastTrack(0), total_sectors(0) +{ + memset(Tracks, 0, sizeof(Tracks)); + + try + { + ImageOpen(path, image_memcache); + } + catch(...) + { + Cleanup(); + throw; + } +} + +CDAccess_Image::~CDAccess_Image() +{ + Cleanup(); +} + +void CDAccess_Image::Read_Raw_Sector(uint8 *buf, int32 lba) +{ + uint8 SimuQ[0xC]; + int32 track; + CDRFILE_TRACK_INFO *ct; + + // + // Leadout synthesis + // + if(lba >= total_sectors) + { + uint8 data_synth_mode = (disc_type == DISC_TYPE_CD_XA ? 0x02 : 0x01); + + switch(Tracks[LastTrack].DIFormat) + { + case DI_FORMAT_AUDIO: + break; + + case DI_FORMAT_MODE1_RAW: + case DI_FORMAT_MODE1: + data_synth_mode = 0x01; + break; + + case DI_FORMAT_MODE2_RAW: + case DI_FORMAT_MODE2_FORM1: + case DI_FORMAT_MODE2_FORM2: + case DI_FORMAT_MODE2: + case DI_FORMAT_CDI_RAW: + data_synth_mode = 0x02; + break; + } + + synth_leadout_sector_lba(data_synth_mode, toc, lba, buf); + return; + } + // + // + // + + memset(buf + 2352, 0, 96); + track = MakeSubPQ(lba, buf + 2352); + subq_deinterleave(buf + 2352, SimuQ); + + ct = &Tracks[track]; + + // + // Handle pregap and postgap reading + // + if(lba < (ct->LBA - ct->pregap_dv) || lba >= (ct->LBA + ct->sectors)) + { + int32 pg_offset = lba - ct->LBA; + CDRFILE_TRACK_INFO* et = ct; + + if(pg_offset < -150) + { + if((Tracks[track].subq_control & SUBQ_CTRLF_DATA) && (FirstTrack < track) && !(Tracks[track - 1].subq_control & SUBQ_CTRLF_DATA)) + et = &Tracks[track - 1]; + } + + memset(buf, 0, 2352); + switch(et->DIFormat) + { + case DI_FORMAT_AUDIO: + break; + + case DI_FORMAT_MODE1_RAW: + case DI_FORMAT_MODE1: + encode_mode1_sector(lba + 150, buf); + break; + + case DI_FORMAT_MODE2_RAW: + case DI_FORMAT_MODE2_FORM1: + case DI_FORMAT_MODE2_FORM2: + case DI_FORMAT_MODE2: + case DI_FORMAT_CDI_RAW: + buf[12 + 6] = 0x20; + buf[12 + 10] = 0x20; + encode_mode2_form2_sector(lba + 150, buf); + // TODO: Zero out optional(?) checksum bytes? + break; + } + //printf("Pre/post-gap read, LBA=%d(LBA-track_start_LBA=%d)\n", lba, lba - ct->LBA); + } + else + { + if(ct->AReader) + { + int16 AudioBuf[588 * 2]; + uint64 frames_read = ct->AReader->Read((ct->FileOffset / 4) + (lba - ct->LBA) * 588, AudioBuf, 588); + + ct->LastSamplePos += frames_read; + + if(frames_read > 588) // This shouldn't happen. + { + printf("Error: frames_read out of range: %llu\n", (unsigned long long)frames_read); + frames_read = 0; + } + + if(frames_read < 588) + memset((uint8 *)AudioBuf + frames_read * 2 * sizeof(int16), 0, (588 - frames_read) * 2 * sizeof(int16)); + + for(int i = 0; i < 588 * 2; i++) + MDFN_en16lsb(buf + i * 2, AudioBuf[i]); + } + else // Binary, woo. + { + long SeekPos = ct->FileOffset; + long LBARelPos = lba - ct->LBA; + + SeekPos += LBARelPos * DI_Size_Table[ct->DIFormat]; + + if(ct->SubchannelMode) + SeekPos += 96 * (lba - ct->LBA); + + ct->fp->seek(SeekPos, SEEK_SET); + + switch(ct->DIFormat) + { + case DI_FORMAT_AUDIO: + ct->fp->read(buf, 2352); + + if(ct->RawAudioMSBFirst) + Endian_A16_Swap(buf, 588 * 2); + break; + + case DI_FORMAT_MODE1: + ct->fp->read(buf + 12 + 3 + 1, 2048); + encode_mode1_sector(lba + 150, buf); + break; + + case DI_FORMAT_MODE1_RAW: + case DI_FORMAT_MODE2_RAW: + case DI_FORMAT_CDI_RAW: + ct->fp->read(buf, 2352); + break; + + case DI_FORMAT_MODE2: + ct->fp->read(buf + 16, 2336); + encode_mode2_sector(lba + 150, buf); + break; + + + // FIXME: M2F1, M2F2, does sub-header come before or after user data(standards say before, but I wonder + // about cdrdao...). + case DI_FORMAT_MODE2_FORM1: + ct->fp->read(buf + 24, 2048); + //encode_mode2_form1_sector(lba + 150, buf); + break; + + case DI_FORMAT_MODE2_FORM2: + ct->fp->read(buf + 24, 2324); + //encode_mode2_form2_sector(lba + 150, buf); + break; + + } + + if(ct->SubchannelMode) + ct->fp->read(buf + 2352, 96); + } + } // end if audible part of audio track read. +} + +bool CDAccess_Image::Fast_Read_Raw_PW_TSRE(uint8* pwbuf, int32 lba) const noexcept +{ + int32 track; + + if(lba >= total_sectors) + { + subpw_synth_leadout_lba(toc, lba, pwbuf); + return(true); + } + + memset(pwbuf, 0, 96); + try + { + track = MakeSubPQ(lba, pwbuf); + } + catch(...) + { + return(false); + } + + // + // If TOC+BIN has embedded subchannel data, we can't fast-read(synthesize) it... + // + if(Tracks[track].SubchannelMode && lba >= (Tracks[track].LBA - Tracks[track].pregap_dv) && (lba < Tracks[track].LBA + Tracks[track].sectors)) + return(false); + + return(true); +} + +// +// Note: this function makes use of the current contents(as in |=) in SubPWBuf. +// +int32 CDAccess_Image::MakeSubPQ(int32 lba, uint8 *SubPWBuf) const +{ + uint8 buf[0xC]; + int32 track; + uint32 lba_relative; + uint32 ma, sa, fa; + uint32 m, s, f; + uint8 pause_or = 0x00; + bool track_found = false; + + for(track = FirstTrack; track < (FirstTrack + NumTracks); track++) + { + if(lba >= (Tracks[track].LBA - Tracks[track].pregap_dv - Tracks[track].pregap) && lba < (Tracks[track].LBA + Tracks[track].sectors + Tracks[track].postgap)) + { + track_found = true; + break; + } + } + + if(!track_found) + throw(MDFN_Error(0, _("Could not find track for sector %u!"), lba)); + + if(lba < Tracks[track].LBA) + lba_relative = Tracks[track].LBA - 1 - lba; + else + lba_relative = lba - Tracks[track].LBA; + + f = (lba_relative % 75); + s = ((lba_relative / 75) % 60); + m = (lba_relative / 75 / 60); + + fa = (lba + 150) % 75; + sa = ((lba + 150) / 75) % 60; + ma = ((lba + 150) / 75 / 60); + + uint8 adr = 0x1; // Q channel data encodes position + uint8 control = Tracks[track].subq_control; + + // Handle pause(D7 of interleaved subchannel byte) bit, should be set to 1 when in pregap or postgap. + if((lba < Tracks[track].LBA) || (lba >= Tracks[track].LBA + Tracks[track].sectors)) + { + //printf("pause_or = 0x80 --- %d\n", lba); + pause_or = 0x80; + } + + // Handle pregap between audio->data track + { + int32 pg_offset = (int32)lba - Tracks[track].LBA; + + // If we're more than 2 seconds(150 sectors) from the real "start" of the track/INDEX 01, and the track is a data track, + // and the preceding track is an audio track, encode it as audio(by taking the SubQ control field from the preceding track). + // + // TODO: Look into how we're supposed to handle subq control field in the four combinations of track types(data/audio). + // + if(pg_offset < -150) + { + if((Tracks[track].subq_control & SUBQ_CTRLF_DATA) && (FirstTrack < track) && !(Tracks[track - 1].subq_control & SUBQ_CTRLF_DATA)) + { + //printf("Pregap part 1 audio->data: lba=%d track_lba=%d\n", lba, Tracks[track].LBA); + control = Tracks[track - 1].subq_control; + } + } + } + + + memset(buf, 0, 0xC); + buf[0] = (adr << 0) | (control << 4); + buf[1] = U8_to_BCD(track); + + if(lba < Tracks[track].LBA) // Index is 00 in pregap + buf[2] = U8_to_BCD(0x00); + else + buf[2] = U8_to_BCD(0x01); + + // Track relative MSF address + buf[3] = U8_to_BCD(m); + buf[4] = U8_to_BCD(s); + buf[5] = U8_to_BCD(f); + + buf[6] = 0; // Zerroooo + + // Absolute MSF address + buf[7] = U8_to_BCD(ma); + buf[8] = U8_to_BCD(sa); + buf[9] = U8_to_BCD(fa); + + subq_generate_checksum(buf); + + if(!SubQReplaceMap.empty()) + { + //printf("%d\n", lba); + auto it = SubQReplaceMap.find(LBA_to_ABA(lba)); + + if(it != SubQReplaceMap.end()) + { + //printf("Replace: %d\n", lba); + memcpy(buf, it->second.data(), 12); + } + } + + for(int i = 0; i < 96; i++) + SubPWBuf[i] |= (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | pause_or; + + return track; +} + +void CDAccess_Image::Read_TOC(TOC *rtoc) +{ + *rtoc = toc; +} + +void CDAccess_Image::GenerateTOC(void) +{ + toc.Clear(); + + toc.first_track = FirstTrack; + toc.last_track = FirstTrack + NumTracks - 1; + toc.disc_type = disc_type; + + for(int i = FirstTrack; i < FirstTrack + NumTracks; i++) + { + if(Tracks[i].DIFormat == DI_FORMAT_CDI_RAW) + { + toc.first_track = std::min(99, i + 1); + toc.last_track = std::max(toc.first_track, toc.last_track); + } + + toc.tracks[i].lba = Tracks[i].LBA; + toc.tracks[i].adr = ADR_CURPOS; + toc.tracks[i].control = Tracks[i].subq_control; + toc.tracks[i].valid = true; + } + + toc.tracks[100].lba = total_sectors; + toc.tracks[100].adr = ADR_CURPOS; + toc.tracks[100].control = Tracks[FirstTrack + NumTracks - 1].subq_control & 0x4; + toc.tracks[100].valid = true; +} + + diff --git a/Mednafen/mednafen/cdrom/CDAccess_Image.h b/Mednafen/mednafen/cdrom/CDAccess_Image.h new file mode 100644 index 0000000000..659032164a --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDAccess_Image.h @@ -0,0 +1,103 @@ +#ifndef __MDFN_CDACCESS_IMAGE_H +#define __MDFN_CDACCESS_IMAGE_H + +#include +#include + +class Stream; +class CDAFReader; + +struct CDRFILE_TRACK_INFO +{ + int32 LBA; + + uint32 DIFormat; + uint8 subq_control; + + int32 pregap; + int32 pregap_dv; + + int32 postgap; + + int32 index[2]; + + int32 sectors; // Not including pregap sectors! + Stream *fp; + bool FirstFileInstance; + bool RawAudioMSBFirst; + long FileOffset; + unsigned int SubchannelMode; + + uint32 LastSamplePos; + + CDAFReader *AReader; +}; +#if 0 +struct Medium_Chunk +{ + int64 Offset; // Offset in [..TODO..] + uint32 DIFormat; + + FILE *fp; + bool FirstFileInstance; + bool RawAudioMSBFirst; + unsigned int SubchannelMode; + + uint32 LastSamplePos; + AudioReader *AReader; +}; + +struct CD_Chunk +{ + int32 LBA; + int32 Track; + int32 Index; + bool DataType; + + Medium_Chunk Medium; +}; + +static std::vector Chunks; +#endif + +class CDAccess_Image : public CDAccess +{ + public: + + CDAccess_Image(const std::string& path, bool image_memcache); + virtual ~CDAccess_Image(); + + virtual void Read_Raw_Sector(uint8 *buf, int32 lba); + + virtual bool Fast_Read_Raw_PW_TSRE(uint8* pwbuf, int32 lba) const noexcept; + + virtual void Read_TOC(CDUtility::TOC *toc); + + private: + + int32 NumTracks; + int32 FirstTrack; + int32 LastTrack; + int32 total_sectors; + uint8 disc_type; + CDRFILE_TRACK_INFO Tracks[100]; // Track #0(HMM?) through 99 + CDUtility::TOC toc; + + std::map> SubQReplaceMap; + + std::string base_dir; + + void ImageOpen(const std::string& path, bool image_memcache); + void LoadSBI(const std::string& sbi_path); + void GenerateTOC(void); + void Cleanup(void); + + // MakeSubPQ will OR the simulated P and Q subchannel data into SubPWBuf. + int32 MakeSubPQ(int32 lba, uint8 *SubPWBuf) const; + + void ParseTOCFileLineInfo(CDRFILE_TRACK_INFO *track, const int tracknum, const std::string &filename, const char *binoffset, const char *msfoffset, const char *length, bool image_memcache, std::map &toc_streamcache); + uint32 GetSectorCount(CDRFILE_TRACK_INFO *track); +}; + + +#endif diff --git a/Mednafen/mednafen/cdrom/CDUtility.cpp b/Mednafen/mednafen/cdrom/CDUtility.cpp new file mode 100644 index 0000000000..dd54239fa5 --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDUtility.cpp @@ -0,0 +1,432 @@ +/* Mednafen - Multi-system Emulator + * + * Subchannel Q CRC Code: Copyright (C) 1998 Andreas Mueller + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "CDUtility.h" +#include "dvdisaster.h" +#include "lec.h" + +#include +// Kill_LEC_Correct(); + + +namespace CDUtility +{ + +// lookup table for crc calculation +static uint16 subq_crctab[256] = +{ + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, + 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, + 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, + 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, + 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, + 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, + 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, + 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, + 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, + 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, + 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, + 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, + 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, + 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, + 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, + 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, + 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, + 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, + 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, + 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, + 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, + 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, + 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, + 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, + 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, + 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; + + +static uint8 scramble_table[2352 - 12]; + +static bool CDUtility_Inited = false; + +static void InitScrambleTable(void) +{ + unsigned cv = 1; + + for(unsigned i = 12; i < 2352; i++) + { + unsigned char z = 0; + + for(int b = 0; b < 8; b++) + { + z |= (cv & 1) << b; + + int feedback = ((cv >> 1) & 1) ^ (cv & 1); + cv = (cv >> 1) | (feedback << 14); + } + + scramble_table[i - 12] = z; + } + + //for(int i = 0; i < 2352 - 12; i++) + // printf("0x%02x, ", scramble_table[i]); +} + +void CDUtility_Init(void) +{ + if(!CDUtility_Inited) + { + Init_LEC_Correct(); + + InitScrambleTable(); + + CDUtility_Inited = true; + } +} + +void encode_mode0_sector(uint32 aba, uint8 *sector_data) +{ + CDUtility_Init(); + + lec_encode_mode0_sector(aba, sector_data); +} + +void encode_mode1_sector(uint32 aba, uint8 *sector_data) +{ + CDUtility_Init(); + + lec_encode_mode1_sector(aba, sector_data); +} + +void encode_mode2_sector(uint32 aba, uint8 *sector_data) +{ + CDUtility_Init(); + + lec_encode_mode2_sector(aba, sector_data); +} + +void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data) +{ + CDUtility_Init(); + + lec_encode_mode2_form1_sector(aba, sector_data); +} + +void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data) +{ + CDUtility_Init(); + + lec_encode_mode2_form2_sector(aba, sector_data); +} + +bool edc_check(const uint8 *sector_data, bool xa) +{ + CDUtility_Init(); + + return(CheckEDC(sector_data, xa)); +} + +bool edc_lec_check_and_correct(uint8 *sector_data, bool xa) +{ + CDUtility_Init(); + + return(ValidateRawSector(sector_data, xa)); +} + + +bool subq_check_checksum(const uint8 *SubQBuf) +{ + uint16 crc = 0; + uint16 stored_crc = 0; + + stored_crc = SubQBuf[0xA] << 8; + stored_crc |= SubQBuf[0xB]; + + for(int i = 0; i < 0xA; i++) + crc = subq_crctab[(crc >> 8) ^ SubQBuf[i]] ^ (crc << 8); + + crc = ~crc; + + return(crc == stored_crc); +} + +void subq_generate_checksum(uint8 *buf) +{ + uint16 crc = 0; + + for(int i = 0; i < 0xA; i++) + crc = subq_crctab[(crc >> 8) ^ buf[i]] ^ (crc << 8); + + // Checksum + buf[0xa] = ~(crc >> 8); + buf[0xb] = ~(crc); +} + +void subq_deinterleave(const uint8 *SubPWBuf, uint8 *qbuf) +{ + memset(qbuf, 0, 0xC); + + for(int i = 0; i < 96; i++) + { + qbuf[i >> 3] |= ((SubPWBuf[i] >> 6) & 0x1) << (7 - (i & 0x7)); + } +} + + +// Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data. +void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf) +{ + assert(in_buf != out_buf); + + memset(out_buf, 0, 96); + + for(unsigned ch = 0; ch < 8; ch++) + { + for(unsigned i = 0; i < 96; i++) + { + out_buf[(ch * 12) + (i >> 3)] |= ((in_buf[i] >> (7 - ch)) & 0x1) << (7 - (i & 0x7)); + } + } + +} + +// Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data. +void subpw_interleave(const uint8 *in_buf, uint8 *out_buf) +{ + assert(in_buf != out_buf); + + for(unsigned d = 0; d < 12; d++) + { + for(unsigned bitpoodle = 0; bitpoodle < 8; bitpoodle++) + { + uint8 rawb = 0; + + for(unsigned ch = 0; ch < 8; ch++) + { + rawb |= ((in_buf[ch * 12 + d] >> (7 - bitpoodle)) & 1) << (7 - ch); + } + out_buf[(d << 3) + bitpoodle] = rawb; + } + } +} + +// NOTES ON LEADOUT AREA SYNTHESIS +// +// I'm not trusting that the "control" field for the TOC leadout entry will always be set properly, so | the control fields for the last track entry +// and the leadout entry together before extracting the D2 bit. Audio track->data leadout is fairly benign though maybe noisy(especially if we ever implement +// data scrambling properly), but data track->audio leadout could break things in an insidious manner for the more accurate drive emulation code). +// +void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf) +{ + uint8 buf[0xC]; + uint32 lba_relative; + uint32 ma, sa, fa; + uint32 m, s, f; + + lba_relative = lba - toc.tracks[100].lba; + + f = (lba_relative % 75); + s = ((lba_relative / 75) % 60); + m = (lba_relative / 75 / 60); + + fa = (lba + 150) % 75; + sa = ((lba + 150) / 75) % 60; + ma = ((lba + 150) / 75 / 60); + + uint8 adr = 0x1; // Q channel data encodes position + uint8 control = toc.tracks[100].control; + + if(toc.tracks[toc.last_track].valid) + control |= toc.tracks[toc.last_track].control & 0x4; + else if(toc.disc_type == DISC_TYPE_CD_I) + control |= 0x4; + + memset(buf, 0, 0xC); + buf[0] = (adr << 0) | (control << 4); + buf[1] = 0xAA; + buf[2] = 0x01; + + // Track relative MSF address + buf[3] = U8_to_BCD(m); + buf[4] = U8_to_BCD(s); + buf[5] = U8_to_BCD(f); + + buf[6] = 0; // Zerroooo + + // Absolute MSF address + buf[7] = U8_to_BCD(ma); + buf[8] = U8_to_BCD(sa); + buf[9] = U8_to_BCD(fa); + + subq_generate_checksum(buf); + + for(int i = 0; i < 96; i++) + SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80; +} + +void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf) +{ + memset(out_buf, 0, 2352 + 96); + subpw_synth_leadout_lba(toc, lba, out_buf + 2352); + + if(out_buf[2352 + 1] & 0x40) + { + if(mode == 0xFF) + { + if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I) + mode = 0x02; + else + mode = 0x01; + } + + switch(mode) + { + default: + encode_mode0_sector(LBA_to_ABA(lba), out_buf); + break; + + case 0x01: + encode_mode1_sector(LBA_to_ABA(lba), out_buf); + break; + + case 0x02: + out_buf[12 + 6] = 0x20; + out_buf[12 + 10] = 0x20; + encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf); + break; + } + } +} + +// ISO/IEC 10149:1995 (E): 20.2 +// +void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf) +{ + uint8 buf[0xC]; + uint32 lba_relative; + uint32 ma, sa, fa; + uint32 m, s, f; + + if(lba < -150 || lba >= 0) + printf("[BUG] subpw_synth_udapp_lba() lba out of range --- %d\n", lba); + + { + int32 lba_tmp = lba + lba_subq_relative_offs; + + if(lba_tmp < 0) + lba_relative = 0 - 1 - lba_tmp; + else + lba_relative = lba_tmp - 0; + } + + f = (lba_relative % 75); + s = ((lba_relative / 75) % 60); + m = (lba_relative / 75 / 60); + + fa = (lba + 150) % 75; + sa = ((lba + 150) / 75) % 60; + ma = ((lba + 150) / 75 / 60); + + uint8 adr = 0x1; // Q channel data encodes position + uint8 control; + + if(toc.disc_type == DISC_TYPE_CD_I && toc.first_track > 1) + control = 0x4; + else if(toc.tracks[toc.first_track].valid) + control = toc.tracks[toc.first_track].control; + else + control = 0x0; + + memset(buf, 0, 0xC); + buf[0] = (adr << 0) | (control << 4); + buf[1] = U8_to_BCD(toc.first_track); + buf[2] = U8_to_BCD(0x00); + + // Track relative MSF address + buf[3] = U8_to_BCD(m); + buf[4] = U8_to_BCD(s); + buf[5] = U8_to_BCD(f); + + buf[6] = 0; // Zerroooo + + // Absolute MSF address + buf[7] = U8_to_BCD(ma); + buf[8] = U8_to_BCD(sa); + buf[9] = U8_to_BCD(fa); + + subq_generate_checksum(buf); + + for(int i = 0; i < 96; i++) + SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80; +} + +void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf) +{ + memset(out_buf, 0, 2352 + 96); + subpw_synth_udapp_lba(toc, lba, lba_subq_relative_offs, out_buf + 2352); + + if(out_buf[2352 + 1] & 0x40) + { + if(mode == 0xFF) + { + if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I) + mode = 0x02; + else + mode = 0x01; + } + + switch(mode) + { + default: + encode_mode0_sector(LBA_to_ABA(lba), out_buf); + break; + + case 0x01: + encode_mode1_sector(LBA_to_ABA(lba), out_buf); + break; + + case 0x02: + out_buf[12 + 6] = 0x20; + out_buf[12 + 10] = 0x20; + encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf); + break; + } + } +} + +#if 0 +bool subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output) +{ + assert(subq_check_checksum(subq_input)); + + + subq_generate_checksum(subq_output); +} +#endif + +void scrambleize_data_sector(uint8 *sector_data) +{ + for(unsigned i = 12; i < 2352; i++) + sector_data[i] ^= scramble_table[i - 12]; +} + +} diff --git a/Mednafen/mednafen/cdrom/CDUtility.h b/Mednafen/mednafen/cdrom/CDUtility.h new file mode 100644 index 0000000000..18a14b9edd --- /dev/null +++ b/Mednafen/mednafen/cdrom/CDUtility.h @@ -0,0 +1,237 @@ +#ifndef __MDFN_CDROM_CDUTILITY_H +#define __MDFN_CDROM_CDUTILITY_H + +namespace CDUtility +{ + // Call once at app startup before creating any threads that could potentially cause re-entrancy to these functions. + // It will also be called automatically if needed for the first time a function in this namespace that requires + // the initialization function to be called is called, for potential + // usage in constructors of statically-declared objects. + void CDUtility_Init(void); + + // Quick definitions here: + // + // ABA - Absolute block address, synonymous to absolute MSF + // aba = (m_a * 60 * 75) + (s_a * 75) + f_a + // + // LBA - Logical block address(related: data CDs are required to have a pregap of 2 seconds, IE 150 frames/sectors) + // lba = aba - 150 + + + enum + { + ADR_NOQINFO = 0x00, + ADR_CURPOS = 0x01, + ADR_MCN = 0x02, + ADR_ISRC = 0x03 + }; + + + struct TOC_Track + { + uint8 adr; + uint8 control; + uint32 lba; + bool valid; // valid/present; oh CD-i... + }; + + // SubQ control field flags. + enum + { + SUBQ_CTRLF_PRE = 0x01, // With 50/15us pre-emphasis. + SUBQ_CTRLF_DCP = 0x02, // Digital copy permitted. + SUBQ_CTRLF_DATA = 0x04, // Data track. + SUBQ_CTRLF_4CH = 0x08, // 4-channel CD-DA. + }; + + enum + { + DISC_TYPE_CDDA_OR_M1 = 0x00, + DISC_TYPE_CD_I = 0x10, + DISC_TYPE_CD_XA = 0x20 + }; + + struct TOC + { + INLINE TOC() + { + Clear(); + } + + INLINE void Clear(void) + { + first_track = last_track = 0; + disc_type = 0; + + memset(tracks, 0, sizeof(tracks)); // FIXME if we change TOC_Track to non-POD type. + } + + INLINE int FindTrackByLBA(uint32 LBA) const + { + int32 lvt = 0; + + for(int32 track = 1; track <= 100; track++) + { + if(!tracks[track].valid) + continue; + + if(LBA < tracks[track].lba) + break; + + lvt = track; + } + + return(lvt); + } + + uint8 first_track; + uint8 last_track; + uint8 disc_type; + TOC_Track tracks[100 + 1]; // [0] is unused, [100] is for the leadout track. + }; + + // + // Address conversion functions. + // + static INLINE uint32 AMSF_to_ABA(int32 m_a, int32 s_a, int32 f_a) + { + return(f_a + 75 * s_a + 75 * 60 * m_a); + } + + static INLINE void ABA_to_AMSF(uint32 aba, uint8 *m_a, uint8 *s_a, uint8 *f_a) + { + *m_a = aba / 75 / 60; + *s_a = (aba - *m_a * 75 * 60) / 75; + *f_a = aba - (*m_a * 75 * 60) - (*s_a * 75); + } + + static INLINE int32 ABA_to_LBA(uint32 aba) + { + return(aba - 150); + } + + static INLINE uint32 LBA_to_ABA(int32 lba) + { + return(lba + 150); + } + + static INLINE int32 AMSF_to_LBA(uint8 m_a, uint8 s_a, uint8 f_a) + { + return(ABA_to_LBA(AMSF_to_ABA(m_a, s_a, f_a))); + } + + static INLINE void LBA_to_AMSF(int32 lba, uint8 *m_a, uint8 *s_a, uint8 *f_a) + { + ABA_to_AMSF(LBA_to_ABA(lba), m_a, s_a, f_a); + } + + // + // BCD conversion functions + // + static INLINE bool BCD_is_valid(uint8 bcd_number) + { + if((bcd_number & 0xF0) >= 0xA0) + return(false); + + if((bcd_number & 0x0F) >= 0x0A) + return(false); + + return(true); + } + + static INLINE uint8 BCD_to_U8(uint8 bcd_number) + { + return( ((bcd_number >> 4) * 10) + (bcd_number & 0x0F) ); + } + + static INLINE uint8 U8_to_BCD(uint8 num) + { + return( ((num / 10) << 4) + (num % 10) ); + } + + // should always perform the conversion, even if the bcd number is invalid. + static INLINE bool BCD_to_U8_check(uint8 bcd_number, uint8 *out_number) + { + *out_number = BCD_to_U8(bcd_number); + + if(!BCD_is_valid(bcd_number)) + return(false); + + return(true); + } + + // + // Sector data encoding functions(to full 2352 bytes raw sector). + // + // sector_data must be able to contain at least 2352 bytes. + void encode_mode0_sector(uint32 aba, uint8 *sector_data); + void encode_mode1_sector(uint32 aba, uint8 *sector_data); // 2048 bytes of user data at offset 16 + void encode_mode2_sector(uint32 aba, uint8 *sector_data); // 2336 bytes of user data at offset 16 + void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data); // 2048+8 bytes of user data at offset 16 + void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data); // 2324+8 bytes of user data at offset 16 + + + // User data area pre-pause(MSF 00:00:00 through 00:01:74), lba -150 through -1 + // out_buf must be able to contain 2352+96 bytes. + // "mode" is not used if the area is to be encoded as audio. + // pass 0xFF for "mode" for "don't know", and to make guess based on the TOC. + void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf); + void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf); + + // out_buf must be able to contain 2352+96 bytes. + // "mode" is not used if the area is to be encoded as audio. + // pass 0xFF for "mode" for "don't know", and to make guess based on the TOC. + void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf); + void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf); + + + // + // User data error detection and correction + // + + // Check EDC of a mode 1 or mode 2 form 1 sector. + // Returns "true" if checksum is ok(matches). + // Returns "false" if checksum mismatch. + // sector_data should contain 2352 bytes of raw sector data. + bool edc_check(const uint8 *sector_data, bool xa); + + // Check EDC and L-EC data of a mode 1 or mode 2 form 1 sector, and correct bit errors if any exist. + // Returns "true" if errors weren't detected, or they were corrected succesfully. + // Returns "false" if errors couldn't be corrected. + // sector_data should contain 2352 bytes of raw sector data. + // + // Note: mode 2 form 1 L-EC data can't correct errors in the 4-byte sector header(address + mode), + // but the error(s) will still be detected by EDC. + bool edc_lec_check_and_correct(uint8 *sector_data, bool xa); + + // + // Subchannel(Q in particular) functions + // + + // Returns false on checksum mismatch, true on match. + bool subq_check_checksum(const uint8 *subq_buf); + + // Calculates the checksum of Q subchannel data(not including the checksum bytes of course ;)) from subq_buf, and stores it into the appropriate position + // in subq_buf. + void subq_generate_checksum(uint8 *subq_buf); + + // Deinterleaves 12 bytes of subchannel Q data from 96 bytes of interleaved subchannel PW data. + void subq_deinterleave(const uint8 *subpw_buf, uint8 *subq_buf); + + // Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data. + void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf); + + // Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data. + void subpw_interleave(const uint8 *in_buf, uint8 *out_buf); + + // Extrapolates Q subchannel current position data from subq_input, with frame/sector delta position_delta, and writes to subq_output. + // Only valid for ADR_CURPOS. + // subq_input must pass subq_check_checksum(). + // TODO + //void subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output); + + // (De)Scrambles data sector. + void scrambleize_data_sector(uint8 *sector_data); +} + +#endif diff --git a/Mednafen/mednafen/cdrom/Makefile.am.inc b/Mednafen/mednafen/cdrom/Makefile.am.inc new file mode 100644 index 0000000000..b06d158c12 --- /dev/null +++ b/Mednafen/mednafen/cdrom/Makefile.am.inc @@ -0,0 +1,11 @@ +mednafen_SOURCES += cdrom/cdromif.cpp cdrom/scsicd.cpp +mednafen_SOURCES += cdrom/CDUtility.cpp cdrom/crc32.cpp cdrom/galois.cpp cdrom/l-ec.cpp cdrom/recover-raw.cpp +mednafen_SOURCES += cdrom/lec.cpp cdrom/CDAccess.cpp cdrom/CDAccess_Image.cpp cdrom/CDAccess_CCD.cpp + +mednafen_SOURCES += cdrom/CDAFReader.cpp +mednafen_SOURCES += cdrom/CDAFReader_Vorbis.cpp +mednafen_SOURCES += cdrom/CDAFReader_MPC.cpp + +if HAVE_LIBSNDFILE +mednafen_SOURCES += cdrom/CDAFReader_SF.cpp +endif diff --git a/Mednafen/mednafen/cdrom/SimpleFIFO.h b/Mednafen/mednafen/cdrom/SimpleFIFO.h new file mode 100644 index 0000000000..0e612435bc --- /dev/null +++ b/Mednafen/mednafen/cdrom/SimpleFIFO.h @@ -0,0 +1,140 @@ +#ifndef __MDFN_SIMPLEFIFO_H +#define __MDFN_SIMPLEFIFO_H + +#include +#include + +#include "../math_ops.h" + +template +class SimpleFIFO +{ + public: + + // Constructor + SimpleFIFO(uint32 the_size) // Size should be a power of 2! + { + data.resize(round_up_pow2(the_size)); + size = the_size; + read_pos = 0; + write_pos = 0; + in_count = 0; + } + + // Destructor + INLINE ~SimpleFIFO() + { + + } + + INLINE void SaveStatePostLoad(void) + { + read_pos %= data.size(); + write_pos %= data.size(); + in_count %= (data.size() + 1); + } + +#if 0 + INLINE int StateAction(StateMem *sm, int load, int data_only, const char* sname) + { + SFORMAT StateRegs[] = + { + std::vector data; + uint32 size; + + SFVAR(read_pos), + SFVAR(write_pos), + SFVAR(in_count), + SFEND; + } + int ret = MDFNSS_StateAction(sm, load, data_only, sname); + + if(load) + { + read_pos %= data.size(); + write_pos %= data.size(); + in_count %= (data.size() + 1); + } + + return(ret); + } +#endif + + INLINE uint32 CanRead(void) + { + return(in_count); + } + + INLINE uint32 CanWrite(void) + { + return(size - in_count); + } + + INLINE T ReadUnit(bool peek = false) + { + T ret; + + assert(in_count > 0); + + ret = data[read_pos]; + + if(!peek) + { + read_pos = (read_pos + 1) & (data.size() - 1); + in_count--; + } + + return(ret); + } + + INLINE uint8 ReadByte(bool peek = false) + { + assert(sizeof(T) == 1); + + return(ReadUnit(peek)); + } + + INLINE void Write(const T *happy_data, uint32 happy_count) + { + assert(CanWrite() >= happy_count); + + while(happy_count) + { + data[write_pos] = *happy_data; + + write_pos = (write_pos + 1) & (data.size() - 1); + in_count++; + happy_data++; + happy_count--; + } + } + + INLINE void WriteUnit(const T& wr_data) + { + Write(&wr_data, 1); + } + + INLINE void WriteByte(const T& wr_data) + { + assert(sizeof(T) == 1); + Write(&wr_data, 1); + } + + + INLINE void Flush(void) + { + read_pos = 0; + write_pos = 0; + in_count = 0; + } + + //private: + std::vector data; + uint32 size; + uint32 read_pos; // Read position + uint32 write_pos; // Write position + uint32 in_count; // Number of units in the FIFO +}; + + +#endif diff --git a/Mednafen/mednafen/cdrom/cdromif.cpp b/Mednafen/mednafen/cdrom/cdromif.cpp new file mode 100644 index 0000000000..ab8154c1dd --- /dev/null +++ b/Mednafen/mednafen/cdrom/cdromif.cpp @@ -0,0 +1,885 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include +#include +#include +#include "cdromif.h" +#include "CDAccess.h" +#include "../general.h" + +#include + +using namespace CDUtility; + +enum +{ + // Status/Error messages + CDIF_MSG_DONE = 0, // Read -> emu. args: No args. + CDIF_MSG_INFO, // Read -> emu. args: str_message + CDIF_MSG_FATAL_ERROR, // Read -> emu. args: *TODO ARGS* + + // + // Command messages. + // + CDIF_MSG_DIEDIEDIE, // Emu -> read + + CDIF_MSG_READ_SECTOR, /* Emu -> read + args[0] = lba + */ +}; + +class CDIF_Message +{ + public: + + CDIF_Message(); + CDIF_Message(unsigned int message_, uint32 arg0 = 0, uint32 arg1 = 0, uint32 arg2 = 0, uint32 arg3 = 0); + CDIF_Message(unsigned int message_, const std::string &str); + ~CDIF_Message(); + + unsigned int message; + uint32 args[4]; + void *parg; + std::string str_message; +}; + +class CDIF_Queue +{ + public: + + CDIF_Queue(); + ~CDIF_Queue(); + + bool Read(CDIF_Message *message, bool blocking = TRUE); + + void Write(const CDIF_Message &message); + + private: + std::queue ze_queue; + MDFN_Mutex *ze_mutex; + MDFN_Cond *ze_cond; +}; + + +typedef struct +{ + bool valid; + bool error; + int32 lba; + uint8 data[2352 + 96]; +} CDIF_Sector_Buffer; + +// TODO: prohibit copy constructor +class CDIF_MT : public CDIF +{ + public: + + CDIF_MT(CDAccess *cda); + virtual ~CDIF_MT(); + + virtual void HintReadSector(int32 lba); + virtual bool ReadRawSector(uint8 *buf, int32 lba); + virtual bool ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread); + + // FIXME: Semi-private: + int ReadThreadStart(void); + + private: + + CDAccess *disc_cdaccess; + + MDFN_Thread *CDReadThread; + + // Queue for messages to the read thread. + CDIF_Queue ReadThreadQueue; + + // Queue for messages to the emu thread. + CDIF_Queue EmuThreadQueue; + + + enum { SBSize = 256 }; + CDIF_Sector_Buffer SectorBuffers[SBSize]; + + uint32 SBWritePos; + + MDFN_Mutex *SBMutex; + MDFN_Cond *SBCond; + + + // + // Read-thread-only: + // + int32 ra_lba; + int32 ra_count; + int32 last_read_lba; +}; + + +// TODO: prohibit copy constructor +class CDIF_ST : public CDIF +{ + public: + + CDIF_ST(CDAccess *cda); + virtual ~CDIF_ST(); + + virtual void HintReadSector(int32 lba); + virtual bool ReadRawSector(uint8 *buf, int32 lba); + virtual bool ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread); + + private: + CDAccess *disc_cdaccess; +}; + +CDIF::CDIF() : UnrecoverableError(false) +{ + +} + +CDIF::~CDIF() +{ + +} + + +CDIF_Message::CDIF_Message() +{ + message = 0; + + memset(args, 0, sizeof(args)); +} + +CDIF_Message::CDIF_Message(unsigned int message_, uint32 arg0, uint32 arg1, uint32 arg2, uint32 arg3) +{ + message = message_; + args[0] = arg0; + args[1] = arg1; + args[2] = arg2; + args[3] = arg3; +} + +CDIF_Message::CDIF_Message(unsigned int message_, const std::string &str) +{ + message = message_; + str_message = str; +} + +CDIF_Message::~CDIF_Message() +{ + +} + +CDIF_Queue::CDIF_Queue() +{ + ze_mutex = MDFND_CreateMutex(); + ze_cond = MDFND_CreateCond(); +} + +CDIF_Queue::~CDIF_Queue() +{ + MDFND_DestroyMutex(ze_mutex); + MDFND_DestroyCond(ze_cond); +} + +// Returns FALSE if message not read, TRUE if it was read. Will always return TRUE if "blocking" is set. +// Will throw MDFN_Error if the read message code is CDIF_MSG_FATAL_ERROR +bool CDIF_Queue::Read(CDIF_Message *message, bool blocking) +{ + bool ret = true; + + // + // + // + MDFND_LockMutex(ze_mutex); + + if(blocking) + { + while(ze_queue.size() == 0) // while, not just if. + { + MDFND_WaitCond(ze_cond, ze_mutex); + } + } + + if(ze_queue.size() == 0) + ret = false; + else + { + *message = ze_queue.front(); + ze_queue.pop(); + } + + MDFND_UnlockMutex(ze_mutex); + // + // + // + + if(ret && message->message == CDIF_MSG_FATAL_ERROR) + throw MDFN_Error(0, "%s", message->str_message.c_str()); + + return(ret); +} + +void CDIF_Queue::Write(const CDIF_Message &message) +{ + MDFND_LockMutex(ze_mutex); + + try + { + ze_queue.push(message); + } + catch(...) + { + fprintf(stderr, "\n\nCDIF_Message queue push failed!!! (We now return you to your regularly unscheduled lockup)\n\n"); + } + + MDFND_SignalCond(ze_cond); // Signal while the mutex is held to prevent icky race conditions. + + MDFND_UnlockMutex(ze_mutex); +} + +struct RTS_Args +{ + CDIF_MT *cdif_ptr; +}; + +static int ReadThreadStart_C(void *v_arg) +{ + RTS_Args *args = (RTS_Args *)v_arg; + + return args->cdif_ptr->ReadThreadStart(); +} + +int CDIF_MT::ReadThreadStart() +{ + bool Running = TRUE; + + SBWritePos = 0; + ra_lba = 0; + ra_count = 0; + last_read_lba = LBA_Read_Maximum + 1; + + try + { + disc_cdaccess->Read_TOC(&disc_toc); + + if(disc_toc.first_track < 1 || disc_toc.last_track > 99 || disc_toc.first_track > disc_toc.last_track) + { + throw(MDFN_Error(0, _("TOC first(%d)/last(%d) track numbers bad."), disc_toc.first_track, disc_toc.last_track)); + } + + SBWritePos = 0; + ra_lba = 0; + ra_count = 0; + last_read_lba = LBA_Read_Maximum + 1; + memset(SectorBuffers, 0, SBSize * sizeof(CDIF_Sector_Buffer)); + } + catch(std::exception &e) + { + EmuThreadQueue.Write(CDIF_Message(CDIF_MSG_FATAL_ERROR, std::string(e.what()))); + return(0); + } + + EmuThreadQueue.Write(CDIF_Message(CDIF_MSG_DONE)); + + while(Running) + { + CDIF_Message msg; + + // Only do a blocking-wait for a message if we don't have any sectors to read-ahead. + // MDFN_DispMessage("%d %d %d\n", last_read_lba, ra_lba, ra_count); + if(ReadThreadQueue.Read(&msg, ra_count ? FALSE : TRUE)) + { + switch(msg.message) + { + case CDIF_MSG_DIEDIEDIE: + Running = FALSE; + break; + + case CDIF_MSG_READ_SECTOR: + { + static const int max_ra = 16; + static const int initial_ra = 1; + static const int speedmult_ra = 2; + int32 new_lba = msg.args[0]; + + assert((unsigned int)max_ra < (SBSize / 4)); + + if(new_lba == (last_read_lba + 1)) + { + int how_far_ahead = ra_lba - new_lba; + + if(how_far_ahead <= max_ra) + ra_count = std::min(speedmult_ra, 1 + max_ra - how_far_ahead); + else + ra_count++; + } + else if(new_lba != last_read_lba) + { + ra_lba = new_lba; + ra_count = initial_ra; + } + + last_read_lba = new_lba; + } + break; + } + } + + // + // Don't read beyond what the disc (image) readers can handle sanely. + // + if(ra_count && ra_lba == LBA_Read_Maximum) + { + ra_count = 0; + //printf("Ephemeral scarabs: %d!\n", ra_lba); + } + + if(ra_count) + { + uint8 tmpbuf[2352 + 96]; + bool error_condition = false; + + try + { + disc_cdaccess->Read_Raw_Sector(tmpbuf, ra_lba); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Sector %u read error: %s"), ra_lba, e.what()); + memset(tmpbuf, 0, sizeof(tmpbuf)); + error_condition = true; + } + + // + // + MDFND_LockMutex(SBMutex); + + SectorBuffers[SBWritePos].lba = ra_lba; + memcpy(SectorBuffers[SBWritePos].data, tmpbuf, 2352 + 96); + SectorBuffers[SBWritePos].valid = TRUE; + SectorBuffers[SBWritePos].error = error_condition; + SBWritePos = (SBWritePos + 1) % SBSize; + + MDFND_SignalCond(SBCond); + + MDFND_UnlockMutex(SBMutex); + // + // + + ra_lba++; + ra_count--; + } + } + + return(1); +} + +CDIF_MT::CDIF_MT(CDAccess *cda) : disc_cdaccess(cda), CDReadThread(NULL), SBMutex(NULL), SBCond(NULL) +{ + try + { + CDIF_Message msg; + RTS_Args s; + + if(!(SBMutex = MDFND_CreateMutex())) + throw MDFN_Error(0, _("Error creating CD read thread mutex.")); + + if(!(SBCond = MDFND_CreateCond())) + throw MDFN_Error(0, _("Error creating CD read thread condition variable.")); + + UnrecoverableError = false; + + s.cdif_ptr = this; + + if(!(CDReadThread = MDFND_CreateThread(ReadThreadStart_C, &s))) + throw MDFN_Error(0, _("Error creating CD read thread.")); + + EmuThreadQueue.Read(&msg); + } + catch(...) + { + if(CDReadThread) + { + MDFND_WaitThread(CDReadThread, NULL); + CDReadThread = NULL; + } + + if(SBMutex) + { + MDFND_DestroyMutex(SBMutex); + SBMutex = NULL; + } + + if(SBCond) + { + MDFND_DestroyCond(SBCond); + SBCond = NULL; + } + + if(disc_cdaccess) + { + delete disc_cdaccess; + disc_cdaccess = NULL; + } + + throw; + } +} + + +CDIF_MT::~CDIF_MT() +{ + bool thread_deaded_failed = false; + + try + { + ReadThreadQueue.Write(CDIF_Message(CDIF_MSG_DIEDIEDIE)); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + thread_deaded_failed = true; + } + + if(!thread_deaded_failed) + MDFND_WaitThread(CDReadThread, NULL); + + if(SBMutex) + { + MDFND_DestroyMutex(SBMutex); + SBMutex = NULL; + } + + if(SBCond) + { + MDFND_DestroyCond(SBCond); + SBCond = NULL; + } + + if(disc_cdaccess) + { + delete disc_cdaccess; + disc_cdaccess = NULL; + } +} + +bool CDIF::ValidateRawSector(uint8 *buf) +{ + int mode = buf[12 + 3]; + + if(mode != 0x1 && mode != 0x2) + return(false); + + if(!edc_lec_check_and_correct(buf, mode == 2)) + return(false); + + return(true); +} + +bool CDIF_MT::ReadRawSector(uint8 *buf, int32 lba) +{ + bool found = FALSE; + bool error_condition = false; + + if(UnrecoverableError) + { + memset(buf, 0, 2352 + 96); + return(false); + } + + if(lba < LBA_Read_Minimum || lba > LBA_Read_Maximum) + { + printf("Attempt to read sector out of bounds; LBA=%d\n", lba); + memset(buf, 0, 2352 + 96); + return(false); + } + + ReadThreadQueue.Write(CDIF_Message(CDIF_MSG_READ_SECTOR, lba)); + + // + // + // + MDFND_LockMutex(SBMutex); + + do + { + for(int i = 0; i < SBSize; i++) + { + if(SectorBuffers[i].valid && SectorBuffers[i].lba == lba) + { + error_condition = SectorBuffers[i].error; + memcpy(buf, SectorBuffers[i].data, 2352 + 96); + found = TRUE; + } + } + + if(!found) + { + //int32 swt = MDFND_GetTime(); + MDFND_WaitCond(SBCond, SBMutex); + //printf("SB Waited: %d\n", MDFND_GetTime() - swt); + } + } while(!found); + + MDFND_UnlockMutex(SBMutex); + // + // + // + + + return(!error_condition); +} + +bool CDIF_MT::ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread) +{ + if(UnrecoverableError) + { + memset(pwbuf, 0, 96); + return(false); + } + + if(lba < LBA_Read_Minimum || lba > LBA_Read_Maximum) + { + printf("Attempt to read sector out of bounds; LBA=%d\n", lba); + memset(pwbuf, 0, 96); + return(false); + } + + if(disc_cdaccess->Fast_Read_Raw_PW_TSRE(pwbuf, lba)) + { + if(hint_fullread) + ReadThreadQueue.Write(CDIF_Message(CDIF_MSG_READ_SECTOR, lba)); + + return(true); + } + else + { + uint8 tmpbuf[2352 + 96]; + bool ret; + + ret = ReadRawSector(tmpbuf, lba); + memcpy(pwbuf, tmpbuf + 2352, 96); + + return ret; + } +} + +void CDIF_MT::HintReadSector(int32 lba) +{ + if(UnrecoverableError) + return; + + ReadThreadQueue.Write(CDIF_Message(CDIF_MSG_READ_SECTOR, lba)); +} + +int CDIF::ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message) +{ + int ret = 0; + + if(UnrecoverableError) + return(false); + + while(sector_count--) + { + uint8 tmpbuf[2352 + 96]; + + if(!ReadRawSector(tmpbuf, lba)) + { + puts("CDIF Raw Read error"); + return(FALSE); + } + + if(!ValidateRawSector(tmpbuf)) + { + if(!suppress_uncorrectable_message) + { + MDFN_DispMessage(_("Uncorrectable data at sector %d"), lba); + MDFN_PrintError(_("Uncorrectable data at sector %d"), lba); + } + + return(false); + } + + const int mode = tmpbuf[12 + 3]; + + if(!ret) + ret = mode; + + if(mode == 1) + { + memcpy(buf, &tmpbuf[12 + 4], 2048); + } + else if(mode == 2) + { + memcpy(buf, &tmpbuf[12 + 4 + 8], 2048); + } + else + { + printf("CDIF_ReadSector() invalid sector type at LBA=%u\n", (unsigned int)lba); + return(false); + } + + buf += 2048; + lba++; + } + + return(ret); +} + +// +// +// Single-threaded implementation follows. +// +// + +CDIF_ST::CDIF_ST(CDAccess *cda) : disc_cdaccess(cda) +{ + //puts("***WARNING USING SINGLE-THREADED CD READER***"); + + UnrecoverableError = false; + + disc_cdaccess->Read_TOC(&disc_toc); + + if(disc_toc.first_track < 1 || disc_toc.last_track > 99 || disc_toc.first_track > disc_toc.last_track) + { + throw(MDFN_Error(0, _("TOC first(%d)/last(%d) track numbers bad."), disc_toc.first_track, disc_toc.last_track)); + } +} + +CDIF_ST::~CDIF_ST() +{ + if(disc_cdaccess) + { + delete disc_cdaccess; + disc_cdaccess = NULL; + } +} + +void CDIF_ST::HintReadSector(int32 lba) +{ + // TODO: disc_cdaccess seek hint? (probably not, would require asynchronousitycamel) +} + +bool CDIF_ST::ReadRawSector(uint8 *buf, int32 lba) +{ + if(UnrecoverableError) + { + memset(buf, 0, 2352 + 96); + return(false); + } + + if(lba < LBA_Read_Minimum || lba > LBA_Read_Maximum) + { + printf("Attempt to read sector out of bounds; LBA=%d\n", lba); + memset(buf, 0, 2352 + 96); + return(false); + } + + try + { + disc_cdaccess->Read_Raw_Sector(buf, lba); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Sector %u read error: %s"), lba, e.what()); + memset(buf, 0, 2352 + 96); + return(false); + } + + return(true); +} + +bool CDIF_ST::ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread) +{ + if(UnrecoverableError) + { + memset(pwbuf, 0, 96); + return(false); + } + + if(lba < LBA_Read_Minimum || lba > LBA_Read_Maximum) + { + printf("Attempt to read sector out of bounds; LBA=%d\n", lba); + memset(pwbuf, 0, 96); + return(false); + } + + if(disc_cdaccess->Fast_Read_Raw_PW_TSRE(pwbuf, lba)) + return(true); + else + { + uint8 tmpbuf[2352 + 96]; + bool ret; + + ret = ReadRawSector(tmpbuf, lba); + memcpy(pwbuf, tmpbuf + 2352, 96); + + return ret; + } +} + +class CDIF_Stream_Thing : public Stream +{ + public: + + CDIF_Stream_Thing(CDIF *cdintf_arg, uint32 lba_arg, uint32 sector_count_arg); + ~CDIF_Stream_Thing(); + + virtual uint64 attributes(void) override; + + virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) override; + virtual void write(const void *data, uint64 count) override; + virtual void truncate(uint64 length) override; + + virtual void seek(int64 offset, int whence) override; + virtual uint64 tell(void) override; + virtual uint64 size(void) override; + virtual void flush(void) override; + virtual void close(void) override; + + private: + CDIF *cdintf; + const uint32 start_lba; + const uint32 sector_count; + int64 position; +}; + +CDIF_Stream_Thing::CDIF_Stream_Thing(CDIF *cdintf_arg, uint32 start_lba_arg, uint32 sector_count_arg) : cdintf(cdintf_arg), start_lba(start_lba_arg), sector_count(sector_count_arg) +{ + +} + +CDIF_Stream_Thing::~CDIF_Stream_Thing() +{ + +} + +uint64 CDIF_Stream_Thing::attributes(void) +{ + return(ATTRIBUTE_READABLE | ATTRIBUTE_SEEKABLE); +} + +uint64 CDIF_Stream_Thing::read(void *data, uint64 count, bool error_on_eos) +{ + if(count > (((uint64)sector_count * 2048) - position)) + { + if(error_on_eos) + { + throw MDFN_Error(0, "EOF"); + } + + count = ((uint64)sector_count * 2048) - position; + } + + if(!count) + return(0); + + for(uint64 rp = position; rp < (position + count); rp = (rp &~ 2047) + 2048) + { + uint8 buf[2048]; + + if(!cdintf->ReadSector(buf, start_lba + (rp / 2048), 1)) + { + throw MDFN_Error(ErrnoHolder(EIO)); + } + + //::printf("Meow: %08llx -- %08llx\n", count, (rp - position) + std::min(2048 - (rp & 2047), count - (rp - position))); + memcpy((uint8*)data + (rp - position), buf + (rp & 2047), std::min(2048 - (rp & 2047), count - (rp - position))); + } + + position += count; + + return count; +} + +void CDIF_Stream_Thing::write(const void *data, uint64 count) +{ + throw MDFN_Error(ErrnoHolder(EBADF)); +} + +void CDIF_Stream_Thing::truncate(uint64 length) +{ + throw MDFN_Error(ErrnoHolder(EBADF)); +} + +void CDIF_Stream_Thing::seek(int64 offset, int whence) +{ + int64 new_position; + + switch(whence) + { + default: + throw MDFN_Error(ErrnoHolder(EINVAL)); + break; + + case SEEK_SET: + new_position = offset; + break; + + case SEEK_CUR: + new_position = position + offset; + break; + + case SEEK_END: + new_position = ((int64)sector_count * 2048) + offset; + break; + } + + if(new_position < 0 || new_position > ((int64)sector_count * 2048)) + throw MDFN_Error(ErrnoHolder(EINVAL)); + + position = new_position; +} + +uint64 CDIF_Stream_Thing::tell(void) +{ + return position; +} + +uint64 CDIF_Stream_Thing::size(void) +{ + return(sector_count * 2048); +} + +void CDIF_Stream_Thing::flush(void) +{ + +} + +void CDIF_Stream_Thing::close(void) +{ + +} + + +Stream *CDIF::MakeStream(int32 lba, uint32 sector_count) +{ + return new CDIF_Stream_Thing(this, lba, sector_count); +} + + +CDIF *CDIF_Open(const std::string& path, bool image_memcache) +{ + CDAccess *cda = CDAccess_Open(path, image_memcache); + + if(!image_memcache) + return new CDIF_MT(cda); + else + return new CDIF_ST(cda); +} diff --git a/Mednafen/mednafen/cdrom/cdromif.h b/Mednafen/mednafen/cdrom/cdromif.h new file mode 100644 index 0000000000..aa7dda71b6 --- /dev/null +++ b/Mednafen/mednafen/cdrom/cdromif.h @@ -0,0 +1,66 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_CDROM_CDROMIF_H +#define __MDFN_CDROM_CDROMIF_H + +#include "CDUtility.h" +#include + +#include + +typedef CDUtility::TOC CD_TOC; + +class CDIF +{ + public: + + CDIF(); + virtual ~CDIF(); + + static const int32 LBA_Read_Minimum = -150; + static const int32 LBA_Read_Maximum = 449849; // 100 * 75 * 60 - 150 - 1 + + inline void ReadTOC(CDUtility::TOC *read_target) + { + *read_target = disc_toc; + } + + virtual void HintReadSector(int32 lba) = 0; + virtual bool ReadRawSector(uint8 *buf, int32 lba) = 0; // Reads 2352+96 bytes of data into buf. + virtual bool ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread) = 0; // Reads 96 bytes(of raw subchannel PW data) into pwbuf. + + // Call for mode 1 or mode 2 form 1 only. + bool ValidateRawSector(uint8 *buf); + + // Utility/Wrapped functions + // Reads mode 1 and mode2 form 1 sectors(2048 bytes per sector returned) + // Will return the type(1, 2) of the first sector read to the buffer supplied, 0 on error + int ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message = false); + + // For Mode 1, or Mode 2 Form 1. + // No reference counting or whatever is done, so if you destroy the CDIF object before you destroy the returned Stream, things will go BOOM. + Stream *MakeStream(int32 lba, uint32 sector_count); + + protected: + bool UnrecoverableError; + CDUtility::TOC disc_toc; +}; + +CDIF *CDIF_Open(const std::string& path, bool image_memcache); + +#endif diff --git a/Mednafen/mednafen/cdrom/crc32.cpp b/Mednafen/mednafen/cdrom/crc32.cpp new file mode 100644 index 0000000000..9b3b2c8e6b --- /dev/null +++ b/Mednafen/mednafen/cdrom/crc32.cpp @@ -0,0 +1,130 @@ +/* dvdisaster: Additional error correction for optical media. + * Copyright (C) 2004-2007 Carsten Gnoerlich. + * Project home page: http://www.dvdisaster.com + * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org + * + * CRC32 code based upon public domain code by Ross Williams (see notes below) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, + * or direct your browser at http://www.gnu.org. + */ + +#include "dvdisaster.h" + +/*** + *** EDC checksum used in CDROM sectors + ***/ + +/*****************************************************************/ +/* */ +/* CRC LOOKUP TABLE */ +/* ================ */ +/* The following CRC lookup table was generated automagically */ +/* by the Rocksoft^tm Model CRC Algorithm Table Generation */ +/* Program V1.0 using the following model parameters: */ +/* */ +/* Width : 4 bytes. */ +/* Poly : 0x8001801BL */ +/* Reverse : TRUE. */ +/* */ +/* For more information on the Rocksoft^tm Model CRC Algorithm, */ +/* see the document titled "A Painless Guide to CRC Error */ +/* Detection Algorithms" by Ross Williams */ +/* (ross@guest.adelaide.edu.au.). This document is likely to be */ +/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */ +/* */ +/*****************************************************************/ + +unsigned long edctable[256] = +{ + 0x00000000L, 0x90910101L, 0x91210201L, 0x01B00300L, + 0x92410401L, 0x02D00500L, 0x03600600L, 0x93F10701L, + 0x94810801L, 0x04100900L, 0x05A00A00L, 0x95310B01L, + 0x06C00C00L, 0x96510D01L, 0x97E10E01L, 0x07700F00L, + 0x99011001L, 0x09901100L, 0x08201200L, 0x98B11301L, + 0x0B401400L, 0x9BD11501L, 0x9A611601L, 0x0AF01700L, + 0x0D801800L, 0x9D111901L, 0x9CA11A01L, 0x0C301B00L, + 0x9FC11C01L, 0x0F501D00L, 0x0EE01E00L, 0x9E711F01L, + 0x82012001L, 0x12902100L, 0x13202200L, 0x83B12301L, + 0x10402400L, 0x80D12501L, 0x81612601L, 0x11F02700L, + 0x16802800L, 0x86112901L, 0x87A12A01L, 0x17302B00L, + 0x84C12C01L, 0x14502D00L, 0x15E02E00L, 0x85712F01L, + 0x1B003000L, 0x8B913101L, 0x8A213201L, 0x1AB03300L, + 0x89413401L, 0x19D03500L, 0x18603600L, 0x88F13701L, + 0x8F813801L, 0x1F103900L, 0x1EA03A00L, 0x8E313B01L, + 0x1DC03C00L, 0x8D513D01L, 0x8CE13E01L, 0x1C703F00L, + 0xB4014001L, 0x24904100L, 0x25204200L, 0xB5B14301L, + 0x26404400L, 0xB6D14501L, 0xB7614601L, 0x27F04700L, + 0x20804800L, 0xB0114901L, 0xB1A14A01L, 0x21304B00L, + 0xB2C14C01L, 0x22504D00L, 0x23E04E00L, 0xB3714F01L, + 0x2D005000L, 0xBD915101L, 0xBC215201L, 0x2CB05300L, + 0xBF415401L, 0x2FD05500L, 0x2E605600L, 0xBEF15701L, + 0xB9815801L, 0x29105900L, 0x28A05A00L, 0xB8315B01L, + 0x2BC05C00L, 0xBB515D01L, 0xBAE15E01L, 0x2A705F00L, + 0x36006000L, 0xA6916101L, 0xA7216201L, 0x37B06300L, + 0xA4416401L, 0x34D06500L, 0x35606600L, 0xA5F16701L, + 0xA2816801L, 0x32106900L, 0x33A06A00L, 0xA3316B01L, + 0x30C06C00L, 0xA0516D01L, 0xA1E16E01L, 0x31706F00L, + 0xAF017001L, 0x3F907100L, 0x3E207200L, 0xAEB17301L, + 0x3D407400L, 0xADD17501L, 0xAC617601L, 0x3CF07700L, + 0x3B807800L, 0xAB117901L, 0xAAA17A01L, 0x3A307B00L, + 0xA9C17C01L, 0x39507D00L, 0x38E07E00L, 0xA8717F01L, + 0xD8018001L, 0x48908100L, 0x49208200L, 0xD9B18301L, + 0x4A408400L, 0xDAD18501L, 0xDB618601L, 0x4BF08700L, + 0x4C808800L, 0xDC118901L, 0xDDA18A01L, 0x4D308B00L, + 0xDEC18C01L, 0x4E508D00L, 0x4FE08E00L, 0xDF718F01L, + 0x41009000L, 0xD1919101L, 0xD0219201L, 0x40B09300L, + 0xD3419401L, 0x43D09500L, 0x42609600L, 0xD2F19701L, + 0xD5819801L, 0x45109900L, 0x44A09A00L, 0xD4319B01L, + 0x47C09C00L, 0xD7519D01L, 0xD6E19E01L, 0x46709F00L, + 0x5A00A000L, 0xCA91A101L, 0xCB21A201L, 0x5BB0A300L, + 0xC841A401L, 0x58D0A500L, 0x5960A600L, 0xC9F1A701L, + 0xCE81A801L, 0x5E10A900L, 0x5FA0AA00L, 0xCF31AB01L, + 0x5CC0AC00L, 0xCC51AD01L, 0xCDE1AE01L, 0x5D70AF00L, + 0xC301B001L, 0x5390B100L, 0x5220B200L, 0xC2B1B301L, + 0x5140B400L, 0xC1D1B501L, 0xC061B601L, 0x50F0B700L, + 0x5780B800L, 0xC711B901L, 0xC6A1BA01L, 0x5630BB00L, + 0xC5C1BC01L, 0x5550BD00L, 0x54E0BE00L, 0xC471BF01L, + 0x6C00C000L, 0xFC91C101L, 0xFD21C201L, 0x6DB0C300L, + 0xFE41C401L, 0x6ED0C500L, 0x6F60C600L, 0xFFF1C701L, + 0xF881C801L, 0x6810C900L, 0x69A0CA00L, 0xF931CB01L, + 0x6AC0CC00L, 0xFA51CD01L, 0xFBE1CE01L, 0x6B70CF00L, + 0xF501D001L, 0x6590D100L, 0x6420D200L, 0xF4B1D301L, + 0x6740D400L, 0xF7D1D501L, 0xF661D601L, 0x66F0D700L, + 0x6180D800L, 0xF111D901L, 0xF0A1DA01L, 0x6030DB00L, + 0xF3C1DC01L, 0x6350DD00L, 0x62E0DE00L, 0xF271DF01L, + 0xEE01E001L, 0x7E90E100L, 0x7F20E200L, 0xEFB1E301L, + 0x7C40E400L, 0xECD1E501L, 0xED61E601L, 0x7DF0E700L, + 0x7A80E800L, 0xEA11E901L, 0xEBA1EA01L, 0x7B30EB00L, + 0xE8C1EC01L, 0x7850ED00L, 0x79E0EE00L, 0xE971EF01L, + 0x7700F000L, 0xE791F101L, 0xE621F201L, 0x76B0F300L, + 0xE541F401L, 0x75D0F500L, 0x7460F600L, 0xE4F1F701L, + 0xE381F801L, 0x7310F900L, 0x72A0FA00L, 0xE231FB01L, + 0x71C0FC00L, 0xE151FD01L, 0xE0E1FE01L, 0x7070FF00L +}; + +/* + * CDROM EDC calculation + */ + +uint32 EDCCrc32(const unsigned char *data, int len) +{ + uint32 crc = 0; + + while(len--) + crc = edctable[(crc ^ *data++) & 0xFF] ^ (crc >> 8); + + return crc; +} diff --git a/Mednafen/mednafen/cdrom/dvdisaster.h b/Mednafen/mednafen/cdrom/dvdisaster.h new file mode 100644 index 0000000000..70b3159d14 --- /dev/null +++ b/Mednafen/mednafen/cdrom/dvdisaster.h @@ -0,0 +1,172 @@ +/* dvdisaster: Additional error correction for optical media. + * Copyright (C) 2004-2007 Carsten Gnoerlich. + * Project home page: http://www.dvdisaster.com + * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, + * or direct your browser at http://www.gnu.org. + */ + +#ifndef DVDISASTER_H +#define DVDISASTER_H + +/* "Dare to be gorgeous and unique. + * But don't ever be cryptic or otherwise unfathomable. + * Make it unforgettably great." + * + * From "A Final Note on Style", + * Amiga Intuition Reference Manual, 1986, p. 231 + */ + +/*** + *** I'm too lazy to mess with #include dependencies. + *** Everything #includeable is rolled up herein... + */ + +#include "../types.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*** + *** dvdisaster.c + ***/ + +void PrepareDeadSector(void); + +void CreateEcc(void); +void FixEcc(void); +void Verify(void); + +uint32 EDCCrc32(const unsigned char*, int); + +/*** + *** galois.c + *** + * This is currently the hardcoded GF(2**8). + * int32 gives abundant space for the GF. + * Squeezing it down to uint8 won't probably gain much, + * so we implement this defensively here. + * + * Note that some performance critical stuff needs to + * be #included from galois-inlines.h + */ + +/* Galois field parameters for 8bit symbol Reed-Solomon code */ + +#define GF_SYMBOLSIZE 8 +#define GF_FIELDSIZE (1<= GF_FIELDMAX) + { + x -= GF_FIELDMAX; + x = (x >> GF_SYMBOLSIZE) + (x & GF_FIELDMAX); + } + + return x; +} diff --git a/Mednafen/mednafen/cdrom/galois.cpp b/Mednafen/mednafen/cdrom/galois.cpp new file mode 100644 index 0000000000..2792cfc341 --- /dev/null +++ b/Mednafen/mednafen/cdrom/galois.cpp @@ -0,0 +1,156 @@ +/* dvdisaster: Additional error correction for optical media. + * Copyright (C) 2004-2007 Carsten Gnoerlich. + * Project home page: http://www.dvdisaster.com + * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org + * + * The Reed-Solomon error correction draws a lot of inspiration - and even code - + * from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, + * or direct your browser at http://www.gnu.org. + */ + +#include "dvdisaster.h" + +#include "galois-inlines.h" + +/*** + *** Galois field arithmetic. + *** + * Calculations are done over the extension field GF(2**n). + * Be careful not to overgeneralize these arithmetics; + * they only work for the case of GF(p**n) with p being prime. + */ + +/* Initialize the Galois field tables */ + + +GaloisTables* CreateGaloisTables(int32 gf_generator) +{ + GaloisTables *gt = (GaloisTables *)calloc(1, sizeof(GaloisTables)); + int32 b,log; + + /* Allocate the tables. + The encoder uses a special version of alpha_to which has the mod_fieldmax() + folded into the table. */ + + gt->gfGenerator = gf_generator; + + gt->indexOf = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32)); + gt->alphaTo = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32)); + gt->encAlphaTo = (int32 *)calloc(2*GF_FIELDSIZE, sizeof(int32)); + + /* create the log/ilog values */ + + for(b=1, log=0; logindexOf[b] = log; + gt->alphaTo[log] = b; + b = b << 1; + if(b & GF_FIELDSIZE) + b = b ^ gf_generator; + } + + if(b!=1) + { + printf("Failed to create the Galois field log tables!\n"); + exit(1); + } + + /* we're even closed using infinity (makes things easier) */ + + gt->indexOf[0] = GF_ALPHA0; /* log(0) = inf */ + gt->alphaTo[GF_ALPHA0] = 0; /* and the other way around */ + + for(b=0; b<2*GF_FIELDSIZE; b++) + gt->encAlphaTo[b] = gt->alphaTo[mod_fieldmax(b)]; + + return gt; +} + +void FreeGaloisTables(GaloisTables *gt) +{ + if(gt->indexOf) free(gt->indexOf); + if(gt->alphaTo) free(gt->alphaTo); + if(gt->encAlphaTo) free(gt->encAlphaTo); + + free(gt); +} + +/*** + *** Create the the Reed-Solomon generator polynomial + *** and some auxiliary data structures. + */ + +ReedSolomonTables *CreateReedSolomonTables(GaloisTables *gt, + int32 first_consecutive_root, + int32 prim_elem, + int nroots_in) +{ ReedSolomonTables *rt = (ReedSolomonTables *)calloc(1, sizeof(ReedSolomonTables)); + int32 i,j,root; + + rt->gfTables = gt; + rt->fcr = first_consecutive_root; + rt->primElem = prim_elem; + rt->nroots = nroots_in; + rt->ndata = GF_FIELDMAX - rt->nroots; + + rt->gpoly = (int32 *)calloc((rt->nroots+1), sizeof(int32)); + + /* Create the RS code generator polynomial */ + + rt->gpoly[0] = 1; + + for(i=0, root=first_consecutive_root*prim_elem; inroots; i++, root+=prim_elem) + { rt->gpoly[i+1] = 1; + + /* Multiply gpoly by alpha**(root+x) */ + + for(j=i; j>0; j--) + { + if(rt->gpoly[j] != 0) + rt->gpoly[j] = rt->gpoly[j-1] ^ gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[j]] + root)]; + else + rt->gpoly[j] = rt->gpoly[j-1]; + } + + rt->gpoly[0] = gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[0]] + root)]; + } + + /* Store the polynomials index for faster encoding */ + + for(i=0; i<=rt->nroots; i++) + rt->gpoly[i] = gt->indexOf[rt->gpoly[i]]; + +#if 0 + /* for the precalculated unrolled loops only */ + + for(i=gt->nroots-1; i>0; i--) + PrintCLI( + " par_idx[((++spk)&%d)] ^= enc_alpha_to[feedback + %3d];\n", + nroots-1,gt->gpoly[i]); + + PrintCLI(" par_idx[sp] = enc_alpha_to[feedback + %3d];\n", + gt->gpoly[0]); +#endif + + return rt; +} + +void FreeReedSolomonTables(ReedSolomonTables *rt) +{ + if(rt->gpoly) free(rt->gpoly); + + free(rt); +} diff --git a/Mednafen/mednafen/cdrom/l-ec.cpp b/Mednafen/mednafen/cdrom/l-ec.cpp new file mode 100644 index 0000000000..5c035ce4ab --- /dev/null +++ b/Mednafen/mednafen/cdrom/l-ec.cpp @@ -0,0 +1,478 @@ +/* dvdisaster: Additional error correction for optical media. + * Copyright (C) 2004-2007 Carsten Gnoerlich. + * Project home page: http://www.dvdisaster.com + * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org + * + * The Reed-Solomon error correction draws a lot of inspiration - and even code - + * from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, + * or direct your browser at http://www.gnu.org. + */ + +#include "dvdisaster.h" + +#include "galois-inlines.h" + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/*** + *** Mapping between cd frame and parity vectors + ***/ + +/* + * Mapping of frame bytes to P/Q Vectors + */ + +int PToByteIndex(int p, int i) +{ return 12 + p + i*86; +} + +void ByteIndexToP(int b, int *p, int *i) +{ *p = (b-12)%86; + *i = (b-12)/86; +} + +int QToByteIndex(int q, int i) +{ int offset = 12 + (q & 1); + + if(i == 43) return 2248+q; + if(i == 44) return 2300+q; + + q&=~1; + return offset + (q*43 + i*88) % 2236; +} + +void ByteIndexToQ(int b, int *q, int *i) +{ int x,y,offset; + + if(b >= 2300) + { *i = 44; + *q = (b-2300); + return; + } + + if(b >= 2248) + { *i = 43; + *q = (b-2248); + return; + } + + offset = b&1; + b = (b-12)/2; + x = b/43; + y = (b-(x*43))%26; + *i = b-(x*43); + *q = 2*((x+26-y)%26)+offset; +} + +/* + * There are 86 vectors of P-parity, yielding a RS(26,24) code. + */ + +void GetPVector(unsigned char *frame, unsigned char *data, int n) +{ int i; + int w_idx = n+12; + + for(i=0; i<26; i++, w_idx+=86) + data[i] = frame[w_idx]; +} + +void SetPVector(unsigned char *frame, unsigned char *data, int n) +{ int i; + int w_idx = n+12; + + for(i=0; i<26; i++, w_idx+=86) + frame[w_idx] = data[i]; +} + +void FillPVector(unsigned char *frame, unsigned char data, int n) +{ int i; + int w_idx = n+12; + + for(i=0; i<26; i++, w_idx+=86) + frame[w_idx] = data; +} + +void OrPVector(unsigned char *frame, unsigned char value, int n) +{ int i; + int w_idx = n+12; + + for(i=0; i<26; i++, w_idx+=86) + frame[w_idx] |= value; +} + +void AndPVector(unsigned char *frame, unsigned char value, int n) +{ int i; + int w_idx = n+12; + + for(i=0; i<26; i++, w_idx+=86) + frame[w_idx] &= value; +} + +/* + * There are 52 vectors of Q-parity, yielding a RS(45,43) code. + */ + +void GetQVector(unsigned char *frame, unsigned char *data, int n) +{ int offset = 12 + (n & 1); + int w_idx = (n&~1) * 43; + int i; + + for(i=0; i<43; i++, w_idx+=88) + data[i] = frame[(w_idx % 2236) + offset]; + + data[43] = frame[2248 + n]; + data[44] = frame[2300 + n]; +} + +void SetQVector(unsigned char *frame, unsigned char *data, int n) +{ int offset = 12 + (n & 1); + int w_idx = (n&~1) * 43; + int i; + + for(i=0; i<43; i++, w_idx+=88) + frame[(w_idx % 2236) + offset] = data[i]; + + frame[2248 + n] = data[43]; + frame[2300 + n] = data[44]; +} + +void FillQVector(unsigned char *frame, unsigned char data, int n) +{ int offset = 12 + (n & 1); + int w_idx = (n&~1) * 43; + int i; + + for(i=0; i<43; i++, w_idx+=88) + frame[(w_idx % 2236) + offset] = data; + + frame[2248 + n] = data; + frame[2300 + n] = data; +} + +void OrQVector(unsigned char *frame, unsigned char data, int n) +{ int offset = 12 + (n & 1); + int w_idx = (n&~1) * 43; + int i; + + for(i=0; i<43; i++, w_idx+=88) + frame[(w_idx % 2236) + offset] |= data; + + frame[2248 + n] |= data; + frame[2300 + n] |= data; +} + +void AndQVector(unsigned char *frame, unsigned char data, int n) +{ int offset = 12 + (n & 1); + int w_idx = (n&~1) * 43; + int i; + + for(i=0; i<43; i++, w_idx+=88) + frame[(w_idx % 2236) + offset] &= data; + + frame[2248 + n] &= data; + frame[2300 + n] &= data; +} + +/*** + *** C2 error counting + ***/ + +int CountC2Errors(unsigned char *frame) +{ int i,count = 0; + frame += 2352; + + for(i=0; i<294; i++, frame++) + { if(*frame & 0x01) count++; + if(*frame & 0x02) count++; + if(*frame & 0x04) count++; + if(*frame & 0x08) count++; + if(*frame & 0x10) count++; + if(*frame & 0x20) count++; + if(*frame & 0x40) count++; + if(*frame & 0x80) count++; + } + + return count; +} + +/*** + *** L-EC error correction for CD raw data sectors + ***/ + +/* + * These could be used from ReedSolomonTables, + * but hardcoding them is faster. + */ + +#define NROOTS 2 +#define LEC_FIRST_ROOT 0 //GF_ALPHA0 +#define LEC_PRIM_ELEM 1 +#define LEC_PRIMTH_ROOT 1 + +/* + * Calculate the error syndrome + */ + +int DecodePQ(ReedSolomonTables *rt, unsigned char *data, int padding, + int *erasure_list, int erasure_count) +{ GaloisTables *gt = rt->gfTables; + int syndrome[NROOTS]; + int lambda[NROOTS+1]; + int omega[NROOTS+1]; + int b[NROOTS+1]; + int reg[NROOTS+1]; + int root[NROOTS]; + int loc[NROOTS]; + int syn_error; + int deg_lambda,lambda_roots; + int deg_omega; + int shortened_size = GF_FIELDMAX - padding; + int corrected = 0; + int i,j,k; + int r,el; + + /*** Form the syndromes: Evaluate data(x) at roots of g(x) */ + + for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[syndrome[i]] + + (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)]; + + /*** Convert syndrome to index form, check for nonzero condition. */ + + syn_error = 0; + for(i=0; iindexOf[syndrome[i]]; + } + + /*** If the syndrome is zero, everything is fine. */ + + if(!syn_error) + return 0; + + /*** Initialize lambda to be the erasure locator polynomial */ + + lambda[0] = 1; + lambda[1] = lambda[2] = 0; + + erasure_list[0] += padding; + erasure_list[1] += padding; + + if(erasure_count > 2) /* sanity check */ + erasure_count = 0; + + if(erasure_count > 0) + { lambda[1] = gt->alphaTo[mod_fieldmax(LEC_PRIM_ELEM*(GF_FIELDMAX-1-erasure_list[0]))]; + + for(i=1; i0; j--) + { int tmp = gt->indexOf[lambda[j-1]]; + + if(tmp != GF_ALPHA0) + lambda[j] ^= gt->alphaTo[mod_fieldmax(u + tmp)]; + } + } + } + + for(i=0; iindexOf[lambda[i]]; + + /*** Berlekamp-Massey algorithm to determine error+erasure locator polynomial */ + + r = erasure_count; /* r is the step number */ + el = erasure_count; + + /* Compute discrepancy at the r-th step in poly-form */ + + while(++r <= NROOTS) + { int discr_r = 0; + + for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[lambda[i]] + syndrome[r-i-1])]; + + discr_r = gt->indexOf[discr_r]; + + if(discr_r == GF_ALPHA0) + { /* B(x) = x*B(x) */ + memmove(b+1, b, NROOTS*sizeof(b[0])); + b[0] = GF_ALPHA0; + } + else + { int t[NROOTS+1]; + + /* T(x) = lambda(x) - discr_r*x*b(x) */ + t[0] = lambda[0]; + for(i=0; ialphaTo[mod_fieldmax(discr_r + b[i])]; + else t[i+1] = lambda[i+1]; + } + + if(2*el <= r+erasure_count-1) + { el = r + erasure_count - el; + + /* B(x) <-- inv(discr_r) * lambda(x) */ + for(i=0; i<=NROOTS; i++) + b[i] = (lambda[i] == 0) ? GF_ALPHA0 + : mod_fieldmax(gt->indexOf[lambda[i]] - discr_r + GF_FIELDMAX); + } + else + { /* 2 lines below: B(x) <-- x*B(x) */ + memmove(b+1, b, NROOTS*sizeof(b[0])); + b[0] = GF_ALPHA0; + } + + memcpy(lambda, t, (NROOTS+1)*sizeof(t[0])); + } + } + + /*** Convert lambda to index form and compute deg(lambda(x)) */ + + deg_lambda = 0; + for(i=0; iindexOf[lambda[i]]; + if(lambda[i] != GF_ALPHA0) + deg_lambda = i; + } + + /*** Find roots of the error+erasure locator polynomial by Chien search */ + + memcpy(reg+1, lambda+1, NROOTS*sizeof(reg[0])); + lambda_roots = 0; /* Number of roots of lambda(x) */ + + for(i=1, k=LEC_PRIMTH_ROOT-1; i<=GF_FIELDMAX; i++, k=mod_fieldmax(k+LEC_PRIMTH_ROOT)) + { int q=1; /* lambda[0] is always 0 */ + + for(j=deg_lambda; j>0; j--) + { if(reg[j] != GF_ALPHA0) + { reg[j] = mod_fieldmax(reg[j] + j); + q ^= gt->alphaTo[reg[j]]; + } + } + + if(q != 0) continue; /* Not a root */ + + /* store root in index-form and the error location number */ + + root[lambda_roots] = i; + loc[lambda_roots] = k; + + /* If we've already found max possible roots, abort the search to save time */ + + if(++lambda_roots == deg_lambda) break; + } + + /* deg(lambda) unequal to number of roots => uncorrectable error detected + This is not reliable for very small numbers of roots, e.g. nroots = 2 */ + + if(deg_lambda != lambda_roots) + { return -1; + } + + /* Compute err+eras evaluator poly omega(x) = syn(x)*lambda(x) + (modulo x**nroots). in index form. Also find deg(omega). */ + + deg_omega = deg_lambda-1; + + for(i=0; i<=deg_omega; i++) + { int tmp = 0; + + for(j=i; j>=0; j--) + { if((syndrome[i - j] != GF_ALPHA0) && (lambda[j] != GF_ALPHA0)) + tmp ^= gt->alphaTo[mod_fieldmax(syndrome[i - j] + lambda[j])]; + } + + omega[i] = gt->indexOf[tmp]; + } + + /* Compute error values in poly-form. + num1 = omega(inv(X(l))), + num2 = inv(X(l))**(FIRST_ROOT-1) and + den = lambda_pr(inv(X(l))) all in poly-form. */ + + for(j=lambda_roots-1; j>=0; j--) + { int num1 = 0; + int num2; + int den; + int location = loc[j]; + + for(i=deg_omega; i>=0; i--) + { if(omega[i] != GF_ALPHA0) + num1 ^= gt->alphaTo[mod_fieldmax(omega[i] + i * root[j])]; + } + + num2 = gt->alphaTo[mod_fieldmax(root[j] * (LEC_FIRST_ROOT - 1) + GF_FIELDMAX)]; + den = 0; + + /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ + + for(i=MIN(deg_lambda, NROOTS-1) & ~1; i>=0; i-=2) + { if(lambda[i+1] != GF_ALPHA0) + den ^= gt->alphaTo[mod_fieldmax(lambda[i+1] + i * root[j])]; + } + + /* Apply error to data */ + + if(num1 != 0 && location >= padding) + { + corrected++; + data[location-padding] ^= gt->alphaTo[mod_fieldmax(gt->indexOf[num1] + gt->indexOf[num2] + + GF_FIELDMAX - gt->indexOf[den])]; + + /* If no erasures were given, at most one error was corrected. + Return its position in erasure_list[0]. */ + + if(!erasure_count) + erasure_list[0] = location-padding; + } +#if 1 + else return -3; +#endif + } + + /*** Form the syndromes: Evaluate data(x) at roots of g(x) */ + + for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[syndrome[i]] + + (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)]; + } + + /*** Convert syndrome to index form, check for nonzero condition. */ +#if 1 + for(i=0; i + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "lec.h" + +#define GF8_PRIM_POLY 0x11d /* x^8 + x^4 + x^3 + x^2 + 1 */ + +#define EDC_POLY 0x8001801b /* (x^16 + x^15 + x^2 + 1) (x^16 + x^2 + x + 1) */ + +#define LEC_HEADER_OFFSET 12 +#define LEC_DATA_OFFSET 16 +#define LEC_MODE1_DATA_LEN 2048 +#define LEC_MODE1_EDC_OFFSET 2064 +#define LEC_MODE1_INTERMEDIATE_OFFSET 2068 +#define LEC_MODE1_P_PARITY_OFFSET 2076 +#define LEC_MODE1_Q_PARITY_OFFSET 2248 +#define LEC_MODE2_FORM1_DATA_LEN (2048+8) +#define LEC_MODE2_FORM1_EDC_OFFSET 2072 +#define LEC_MODE2_FORM2_DATA_LEN (2324+8) +#define LEC_MODE2_FORM2_EDC_OFFSET 2348 + + +typedef u_int8_t gf8_t; + +static u_int8_t GF8_LOG[256]; +static gf8_t GF8_ILOG[256]; + +static const class Gf8_Q_Coeffs_Results_01 { +private: + u_int16_t table[43][256]; +public: + Gf8_Q_Coeffs_Results_01(); + ~Gf8_Q_Coeffs_Results_01() {} + const u_int16_t *operator[] (int i) const { return &table[i][0]; } + operator const u_int16_t *() const { return &table[0][0]; } +} CF8_Q_COEFFS_RESULTS_01; + +static const class CrcTable { +private: + u_int32_t table[256]; +public: + CrcTable(); + ~CrcTable() {} + u_int32_t operator[](int i) const { return table[i]; } + operator const u_int32_t *() const { return table; } +} CRCTABLE; + +static const class ScrambleTable { +private: + u_int8_t table[2340]; +public: + ScrambleTable(); + ~ScrambleTable() {} + u_int8_t operator[](int i) const { return table[i]; } + operator const u_int8_t *() const { return table; } +} SCRAMBLE_TABLE; + +/* Creates the logarithm and inverse logarithm table that is required + * for performing multiplication in the GF(8) domain. + */ +static void gf8_create_log_tables() +{ + u_int8_t log; + u_int16_t b; + + for (b = 0; b <= 255; b++) { + GF8_LOG[b] = 0; + GF8_ILOG[b] = 0; + } + + b = 1; + + for (log = 0; log < 255; log++) { + GF8_LOG[(u_int8_t)b] = log; + GF8_ILOG[log] = (u_int8_t)b; + + b <<= 1; + + if ((b & 0x100) != 0) + b ^= GF8_PRIM_POLY; + } +} + +/* Addition in the GF(8) domain: just the XOR of the values. + */ +#define gf8_add(a, b) (a) ^ (b) + + +/* Multiplication in the GF(8) domain: add the logarithms (modulo 255) + * and return the inverse logarithm. Not used! + */ +#if 0 +static gf8_t gf8_mult(gf8_t a, gf8_t b) +{ + int16_t sum; + + if (a == 0 || b == 0) + return 0; + + sum = GF8_LOG[a] + GF8_LOG[b]; + + if (sum >= 255) + sum -= 255; + + return GF8_ILOG[sum]; +} +#endif + +/* Division in the GF(8) domain: Like multiplication but logarithms a + * subtracted. + */ +static gf8_t gf8_div(gf8_t a, gf8_t b) +{ + int16_t sum; + + assert(b != 0); + + if (a == 0) + return 0; + + sum = GF8_LOG[a] - GF8_LOG[b]; + + if (sum < 0) + sum += 255; + + return GF8_ILOG[sum]; +} + +Gf8_Q_Coeffs_Results_01::Gf8_Q_Coeffs_Results_01() +{ + int i, j; + u_int16_t c; + gf8_t GF8_COEFFS_HELP[2][45]; + u_int8_t GF8_Q_COEFFS[2][45]; + + + gf8_create_log_tables(); + + /* build matrix H: + * 1 1 ... 1 1 + * a^44 a^43 ... a^1 a^0 + * + * + */ + + for (j = 0; j < 45; j++) { + GF8_COEFFS_HELP[0][j] = 1; /* e0 */ + GF8_COEFFS_HELP[1][j] = GF8_ILOG[44-j]; /* e1 */ + } + + + /* resolve equation system for parity byte 0 and 1 */ + + /* e1' = e1 + e0 */ + for (j = 0; j < 45; j++) { + GF8_Q_COEFFS[1][j] = gf8_add(GF8_COEFFS_HELP[1][j], + GF8_COEFFS_HELP[0][j]); + } + + /* e1'' = e1' / (a^1 + 1) */ + for (j = 0; j < 45; j++) { + GF8_Q_COEFFS[1][j] = gf8_div(GF8_Q_COEFFS[1][j], GF8_Q_COEFFS[1][43]); + } + + /* e0' = e0 + e1 / a^1 */ + for (j = 0; j < 45; j++) { + GF8_Q_COEFFS[0][j] = gf8_add(GF8_COEFFS_HELP[0][j], + gf8_div(GF8_COEFFS_HELP[1][j], + GF8_ILOG[1])); + } + + /* e0'' = e0' / (1 + 1 / a^1) */ + for (j = 0; j < 45; j++) { + GF8_Q_COEFFS[0][j] = gf8_div(GF8_Q_COEFFS[0][j], GF8_Q_COEFFS[0][44]); + } + + /* + * Compute the products of 0..255 with all of the Q coefficients in + * advance. When building the scalar product between the data vectors + * and the P/Q vectors the individual products can be looked up in + * this table + * + * The P parity coefficients are just a subset of the Q coefficients so + * that we do not need to create a separate table for them. + */ + + for (j = 0; j < 43; j++) { + + table[j][0] = 0; + + for (i = 1; i < 256; i++) { + c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[0][j]]; + if (c >= 255) c -= 255; + table[j][i] = GF8_ILOG[c]; + + c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[1][j]]; + if (c >= 255) c -= 255; + table[j][i] |= GF8_ILOG[c]<<8; + } + } +} + +/* Reverses the bits in 'd'. 'bits' defines the bit width of 'd'. + */ +static u_int32_t mirror_bits(u_int32_t d, int bits) +{ + int i; + u_int32_t r = 0; + + for (i = 0; i < bits; i++) { + r <<= 1; + + if ((d & 0x1) != 0) + r |= 0x1; + + d >>= 1; + } + + return r; +} + +/* Build the CRC lookup table for EDC_POLY poly. The CRC is 32 bit wide + * and reversed (i.e. the bit stream is divided by the EDC_POLY with the + * LSB first order). + */ +CrcTable::CrcTable () +{ + u_int32_t i, j; + u_int32_t r; + + for (i = 0; i < 256; i++) { + r = mirror_bits(i, 8); + + r <<= 24; + + for (j = 0; j < 8; j++) { + if ((r & 0x80000000) != 0) { + r <<= 1; + r ^= EDC_POLY; + } + else { + r <<= 1; + } + } + + r = mirror_bits(r, 32); + + table[i] = r; + } +} + +/* Calculates the CRC of given data with given lengths based on the + * table lookup algorithm. + */ +static u_int32_t calc_edc(u_int8_t *data, int len) +{ + u_int32_t crc = 0; + + while (len--) { + crc = CRCTABLE[(int)(crc ^ *data++) & 0xff] ^ (crc >> 8); + } + + return crc; +} + +/* Build the scramble table as defined in the yellow book. The bytes + 12 to 2351 of a sector will be XORed with the data of this table. + */ +ScrambleTable::ScrambleTable() +{ + u_int16_t i, j; + u_int16_t reg = 1; + u_int8_t d; + + for (i = 0; i < 2340; i++) { + d = 0; + + for (j = 0; j < 8; j++) { + d >>= 1; + + if ((reg & 0x1) != 0) + d |= 0x80; + + if ((reg & 0x1) != ((reg >> 1) & 0x1)) { + reg >>= 1; + reg |= 0x4000; /* 15-bit register */ + } + else { + reg >>= 1; + } + } + + table[i] = d; + } +} + +/* Calc EDC for a MODE 1 sector + */ +static void calc_mode1_edc(u_int8_t *sector) +{ + u_int32_t crc = calc_edc(sector, LEC_MODE1_DATA_LEN + 16); + + sector[LEC_MODE1_EDC_OFFSET] = crc & 0xffL; + sector[LEC_MODE1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; + sector[LEC_MODE1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; + sector[LEC_MODE1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; +} + +/* Calc EDC for a XA form 1 sector + */ +static void calc_mode2_form1_edc(u_int8_t *sector) +{ + u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET, + LEC_MODE2_FORM1_DATA_LEN); + + sector[LEC_MODE2_FORM1_EDC_OFFSET] = crc & 0xffL; + sector[LEC_MODE2_FORM1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; + sector[LEC_MODE2_FORM1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; + sector[LEC_MODE2_FORM1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; +} + +/* Calc EDC for a XA form 2 sector + */ +static void calc_mode2_form2_edc(u_int8_t *sector) +{ + u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET, + LEC_MODE2_FORM2_DATA_LEN); + + sector[LEC_MODE2_FORM2_EDC_OFFSET] = crc & 0xffL; + sector[LEC_MODE2_FORM2_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; + sector[LEC_MODE2_FORM2_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; + sector[LEC_MODE2_FORM2_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; +} + +/* Writes the sync pattern to the given sector. + */ +static void set_sync_pattern(u_int8_t *sector) +{ + sector[0] = 0; + + sector[1] = sector[2] = sector[3] = sector[4] = sector[5] = + sector[6] = sector[7] = sector[8] = sector[9] = sector[10] = 0xff; + + sector[11] = 0; +} + + +static u_int8_t bin2bcd(u_int8_t b) +{ + return (((b/10) << 4) & 0xf0) | ((b%10) & 0x0f); +} + +/* Builds the sector header. + */ +static void set_sector_header(u_int8_t mode, u_int32_t adr, u_int8_t *sector) +{ + sector[LEC_HEADER_OFFSET] = bin2bcd(adr / (60*75)); + sector[LEC_HEADER_OFFSET + 1] = bin2bcd((adr / 75) % 60); + sector[LEC_HEADER_OFFSET + 2] = bin2bcd(adr % 75); + sector[LEC_HEADER_OFFSET + 3] = mode; +} + +/* Calculate the P parities for the sector. + * The 43 P vectors of length 24 are combined with the GF8_P_COEFFS. + */ +static void calc_P_parity(u_int8_t *sector) +{ + int i, j; + u_int16_t p01_msb, p01_lsb; + u_int8_t *p_lsb_start; + u_int8_t *p_lsb; + u_int8_t *p0, *p1; + u_int8_t d0,d1; + + p_lsb_start = sector + LEC_HEADER_OFFSET; + + p1 = sector + LEC_MODE1_P_PARITY_OFFSET; + p0 = sector + LEC_MODE1_P_PARITY_OFFSET + 2 * 43; + + for (i = 0; i <= 42; i++) { + p_lsb = p_lsb_start; + + p01_lsb = p01_msb = 0; + + for (j = 19; j <= 42; j++) { + d0 = *p_lsb; + d1 = *(p_lsb+1); + + p01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0]; + p01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1]; + + p_lsb += 2 * 43; + } + + *p0 = p01_lsb; + *(p0 + 1) = p01_msb; + + *p1 = p01_lsb>>8; + *(p1 + 1) = p01_msb>>8; + + p0 += 2; + p1 += 2; + + p_lsb_start += 2; + } +} + +/* Calculate the Q parities for the sector. + * The 26 Q vectors of length 43 are combined with the GF8_Q_COEFFS. + */ +static void calc_Q_parity(u_int8_t *sector) +{ + int i, j; + u_int16_t q01_lsb, q01_msb; + u_int8_t *q_lsb_start; + u_int8_t *q_lsb; + u_int8_t *q0, *q1, *q_start; + u_int8_t d0,d1; + + q_lsb_start = sector + LEC_HEADER_OFFSET; + + q_start = sector + LEC_MODE1_Q_PARITY_OFFSET; + q1 = sector + LEC_MODE1_Q_PARITY_OFFSET; + q0 = sector + LEC_MODE1_Q_PARITY_OFFSET + 2 * 26; + + for (i = 0; i <= 25; i++) { + q_lsb = q_lsb_start; + + q01_lsb = q01_msb = 0; + + for (j = 0; j <= 42; j++) { + d0 = *q_lsb; + d1 = *(q_lsb+1); + + q01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0]; + q01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1]; + + q_lsb += 2 * 44; + + if (q_lsb >= q_start) { + q_lsb -= 2 * 1118; + } + } + + *q0 = q01_lsb; + *(q0 + 1) = q01_msb; + + *q1 = q01_lsb>>8; + *(q1 + 1) = q01_msb>>8; + + q0 += 2; + q1 += 2; + + q_lsb_start += 2 * 43; + } +} + +/* Encodes a MODE 0 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide + */ +void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector) +{ + u_int16_t i; + + set_sync_pattern(sector); + set_sector_header(0, adr, sector); + + sector += 16; + + for (i = 0; i < 2336; i++) + *sector++ = 0; +} + +/* Encodes a MODE 1 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2048 bytes user data at + * offset 16 + */ +void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector) +{ + set_sync_pattern(sector); + set_sector_header(1, adr, sector); + + calc_mode1_edc(sector); + + /* clear the intermediate field */ + sector[LEC_MODE1_INTERMEDIATE_OFFSET] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 1] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 2] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 3] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 4] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 5] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 6] = + sector[LEC_MODE1_INTERMEDIATE_OFFSET + 7] = 0; + + calc_P_parity(sector); + calc_Q_parity(sector); +} + +/* Encodes a MODE 2 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2336 bytes user data at + * offset 16 + */ +void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector) +{ + set_sync_pattern(sector); + set_sector_header(2, adr, sector); +} + +/* Encodes a XA form 1 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2048+8 bytes user data at + * offset 16 + */ +void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector) +{ + set_sync_pattern(sector); + + calc_mode2_form1_edc(sector); + + /* P/Q partiy must not contain the sector header so clear it */ + sector[LEC_HEADER_OFFSET] = + sector[LEC_HEADER_OFFSET + 1] = + sector[LEC_HEADER_OFFSET + 2] = + sector[LEC_HEADER_OFFSET + 3] = 0; + + calc_P_parity(sector); + calc_Q_parity(sector); + + /* finally add the sector header */ + set_sector_header(2, adr, sector); +} + +/* Encodes a XA form 2 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2324+8 bytes user data at + * offset 16 + */ +void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector) +{ + set_sync_pattern(sector); + + calc_mode2_form2_edc(sector); + + set_sector_header(2, adr, sector); +} + +/* Scrambles and byte swaps an encoded sector. + * 'sector' must be 2352 byte wide. + */ +void lec_scramble(u_int8_t *sector) +{ + u_int16_t i; + const u_int8_t *stable = SCRAMBLE_TABLE; + u_int8_t *p = sector; + u_int8_t tmp; + + + for (i = 0; i < 6; i++) { + /* just swap bytes of sector sync */ + tmp = *p; + *p = *(p + 1); + p++; + *p++ = tmp; + } + for (;i < (2352 / 2); i++) { + /* scramble and swap bytes */ + tmp = *p ^ *stable++; + *p = *(p + 1) ^ *stable++; + p++; + *p++ = tmp; + } +} + +#if 0 +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + char *infile; + char *outfile; + int fd_in, fd_out; + u_int8_t buffer1[2352]; + u_int8_t buffer2[2352]; + u_int32_t lba; + int i; + +#if 0 + for (i = 0; i < 2048; i++) + buffer1[i + 16] = 234; + + lba = 150; + + for (i = 0; i < 100000; i++) { + lec_encode_mode1_sector(lba, buffer1); + lec_scramble(buffer2); + lba++; + } + +#else + + if (argc != 3) + return 1; + + infile = argv[1]; + outfile = argv[2]; + + + if ((fd_in = open(infile, O_RDONLY)) < 0) { + perror("Cannot open input file"); + return 1; + } + + if ((fd_out = open(outfile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) { + perror("Cannot open output file"); + return 1; + } + + lba = 150; + + do { + if (read(fd_in, buffer1, 2352) != 2352) + break; + + switch (*(buffer1 + 12 + 3)) { + case 1: + memcpy(buffer2 + 16, buffer1 + 16, 2048); + + lec_encode_mode1_sector(lba, buffer2); + break; + + case 2: + if ((*(buffer1 + 12 + 4 + 2) & 0x20) != 0) { + /* form 2 sector */ + memcpy(buffer2 + 16, buffer1 + 16, 2324 + 8); + lec_encode_mode2_form2_sector(lba, buffer2); + } + else { + /* form 1 sector */ + memcpy(buffer2 + 16, buffer1 + 16, 2048 + 8); + lec_encode_mode2_form1_sector(lba, buffer2); + } + break; + } + + if (memcmp(buffer1, buffer2, 2352) != 0) { + printf("Verify error at lba %ld\n", lba); + } + + lec_scramble(buffer2); + write(fd_out, buffer2, 2352); + + lba++; + } while (1); + + close(fd_in); + close(fd_out); + +#endif + + return 0; +} +#endif diff --git a/Mednafen/mednafen/cdrom/lec.h b/Mednafen/mednafen/cdrom/lec.h new file mode 100644 index 0000000000..c5e874c3f3 --- /dev/null +++ b/Mednafen/mednafen/cdrom/lec.h @@ -0,0 +1,77 @@ +/* cdrdao - write audio CD-Rs in disc-at-once mode + * + * Copyright (C) 1998-2002 Andreas Mueller + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __LEC_H__ +#define __LEC_H__ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +typedef uint32_t u_int32_t; +typedef uint16_t u_int16_t; +typedef uint8_t u_int8_t; + +#ifndef TRUE +#define TRUE 1 +#endif + +/* Encodes a MODE 0 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide + */ +void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector); + +/* Encodes a MODE 1 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2048 bytes user data at + * offset 16 + */ +void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector); + +/* Encodes a MODE 2 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2336 bytes user data at + * offset 16 + */ +void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector); + +/* Encodes a XA form 1 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2048+8 bytes user data at + * offset 16 + */ +void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector); + +/* Encodes a XA form 2 sector. + * 'adr' is the current physical sector address + * 'sector' must be 2352 byte wide containing 2324+8 bytes user data at + * offset 16 + */ +void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector); + +/* Scrambles and byte swaps an encoded sector. + * 'sector' must be 2352 byte wide. + */ +void lec_scramble(u_int8_t *sector); + +#endif diff --git a/Mednafen/mednafen/cdrom/recover-raw.cpp b/Mednafen/mednafen/cdrom/recover-raw.cpp new file mode 100644 index 0000000000..e7dee73b18 --- /dev/null +++ b/Mednafen/mednafen/cdrom/recover-raw.cpp @@ -0,0 +1,214 @@ +/* dvdisaster: Additional error correction for optical media. + * Copyright (C) 2004-2007 Carsten Gnoerlich. + * Project home page: http://www.dvdisaster.com + * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, + * or direct your browser at http://www.gnu.org. + */ + +#include "dvdisaster.h" + +static GaloisTables *gt = NULL; /* for L-EC Reed-Solomon */ +static ReedSolomonTables *rt = NULL; + +bool Init_LEC_Correct(void) +{ + gt = CreateGaloisTables(0x11d); + rt = CreateReedSolomonTables(gt, 0, 1, 10); + + return(1); +} + +void Kill_LEC_Correct(void) +{ + FreeGaloisTables(gt); + FreeReedSolomonTables(rt); +} + +/*** + *** CD level CRC calculation + ***/ + +/* + * Test raw sector against its 32bit CRC. + * Returns TRUE if frame is good. + */ + +int CheckEDC(const unsigned char *cd_frame, bool xa_mode) +{ + unsigned int expected_crc, real_crc; + unsigned int crc_base = xa_mode ? 2072 : 2064; + + expected_crc = cd_frame[crc_base + 0] << 0; + expected_crc |= cd_frame[crc_base + 1] << 8; + expected_crc |= cd_frame[crc_base + 2] << 16; + expected_crc |= cd_frame[crc_base + 3] << 24; + + if(xa_mode) + real_crc = EDCCrc32(cd_frame+16, 2056); + else + real_crc = EDCCrc32(cd_frame, 2064); + + if(expected_crc == real_crc) + return(1); + else + { + //printf("Bad EDC CRC: Calculated: %08x, Recorded: %08x\n", real_crc, expected_crc); + return(0); + } +} + +/*** + *** A very simple L-EC error correction. + *** + * Perform just one pass over the Q and P vectors to see if everything + * is okay respectively correct minor errors. This is pretty much the + * same stuff the drive is supposed to do in the final L-EC stage. + */ + +static int simple_lec(unsigned char *frame) +{ + unsigned char byte_state[2352]; + unsigned char p_vector[P_VECTOR_SIZE]; + unsigned char q_vector[Q_VECTOR_SIZE]; + unsigned char p_state[P_VECTOR_SIZE]; + int erasures[Q_VECTOR_SIZE], erasure_count; + int ignore[2]; + int p_failures, q_failures; + int p_corrected, q_corrected; + int p,q; + + /* Setup */ + + memset(byte_state, 0, 2352); + + p_failures = q_failures = 0; + p_corrected = q_corrected = 0; + + /* Perform Q-Parity error correction */ + + for(q=0; q 2) + { GetPVector(byte_state, p_state, p); + erasure_count = 0; + + for(i=0; i 0 && erasure_count <= 2) + { GetPVector(frame, p_vector, p); + err = DecodePQ(rt, p_vector, P_PADDING, erasures, erasure_count); + } + } + + /* See what we've got */ + + if(err < 0) /* Uncorrectable. */ + { p_failures++; + } + else /* Correctable. */ + { if(err == 1 || err == 2) /* Store back corrected vector */ + { SetPVector(frame, p_vector, p); + p_corrected++; + } + } + } + + /* Sum up */ + + if(q_failures || p_failures || q_corrected || p_corrected) + { + return 1; + } + + return 0; +} + +/*** + *** Validate CD raw sector + ***/ + +int ValidateRawSector(unsigned char *frame, bool xaMode) +{ + int lec_did_sth = FALSE; + + /* Do simple L-EC. + It seems that drives stop their internal L-EC as soon as the + EDC is okay, so we may see uncorrected errors in the parity bytes. + Since we are also interested in the user data only and doing the + L-EC is expensive, we skip our L-EC as well when the EDC is fine. */ + + if(!CheckEDC(frame, xaMode)) + { + unsigned char header[4]; + + if(xaMode) + { + memcpy(header, frame + 12, 4); + memset(frame + 12, 0, 4); + } + + lec_did_sth = simple_lec(frame); + + if(xaMode) + memcpy(frame + 12, header, 4); + } + + /* Test internal sector checksum again */ + if(!CheckEDC(frame, xaMode)) + { + /* EDC failure in RAW sector */ + return FALSE; + } + + return TRUE; +} + diff --git a/Mednafen/mednafen/cdrom/scsicd-pce-commands.inc b/Mednafen/mednafen/cdrom/scsicd-pce-commands.inc new file mode 100644 index 0000000000..4441e9304b --- /dev/null +++ b/Mednafen/mednafen/cdrom/scsicd-pce-commands.inc @@ -0,0 +1,259 @@ +/******************************************************** +* * +* PC Engine CD Command 0xD8 - SAPSP * +* * +********************************************************/ +static void DoNEC_PCE_SAPSP(const uint8 *cdb) +{ + uint32 new_read_sec_start; + + //printf("Set audio start: %02x %02x %02x %02x %02x %02x %02x\n", cdb[9], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6]); + switch (cdb[9] & 0xc0) + { + default: //SCSIDBG("Unknown SAPSP 9: %02x\n", cdb[9]); + case 0x00: + new_read_sec_start = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + break; + + case 0x40: + new_read_sec_start = AMSF_to_LBA(BCD_to_U8(cdb[2]), BCD_to_U8(cdb[3]), BCD_to_U8(cdb[4])); + break; + + case 0x80: + { + int track = BCD_to_U8(cdb[2]); + + if(!track) + track = 1; + else if(track >= toc.last_track + 1) + track = 100; + new_read_sec_start = toc.tracks[track].lba; + } + break; + } + + //printf("%lld\n", (long long)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock); + if(cdda.CDDAStatus == CDDASTATUS_PLAYING && new_read_sec_start == read_sec_start && ((int64)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock) < 190) + { + pce_lastsapsp_timestamp = monotonic_timestamp; + + SendStatusAndMessage(STATUS_GOOD, 0x00); + CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); + return; + } + + pce_lastsapsp_timestamp = monotonic_timestamp; + + read_sec = read_sec_start = new_read_sec_start; + read_sec_end = toc.tracks[100].lba; + + + cdda.CDDAReadPos = 588; + + cdda.CDDAStatus = CDDASTATUS_PAUSED; + cdda.PlayMode = PLAYMODE_SILENT; + + if(cdb[1]) + { + cdda.PlayMode = PLAYMODE_NORMAL; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + } + + if(read_sec < toc.tracks[100].lba) + Cur_CDIF->HintReadSector(read_sec); + + SendStatusAndMessage(STATUS_GOOD, 0x00); + CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xD9 - SAPEP * +* * +********************************************************/ +static void DoNEC_PCE_SAPEP(const uint8 *cdb) +{ + uint32 new_read_sec_end; + + //printf("Set audio end: %02x %02x %02x %02x %02x %02x %02x\n", cdb[9], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6]); + + switch (cdb[9] & 0xc0) + { + default: //SCSIDBG("Unknown SAPEP 9: %02x\n", cdb[9]); + + case 0x00: + new_read_sec_end = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + break; + + case 0x40: + new_read_sec_end = BCD_to_U8(cdb[4]) + 75 * (BCD_to_U8(cdb[3]) + 60 * BCD_to_U8(cdb[2])); + new_read_sec_end -= 150; + break; + + case 0x80: + { + int track = BCD_to_U8(cdb[2]); + + if(!track) + track = 1; + else if(track >= toc.last_track + 1) + track = 100; + new_read_sec_end = toc.tracks[track].lba; + } + break; + } + + read_sec_end = new_read_sec_end; + + switch(cdb[1]) // PCE CD(TODO: Confirm these, and check the mode mask): + { + default: + case 0x03: cdda.PlayMode = PLAYMODE_NORMAL; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + break; + + case 0x02: cdda.PlayMode = PLAYMODE_INTERRUPT; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + break; + + case 0x01: cdda.PlayMode = PLAYMODE_LOOP; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + break; + + case 0x00: cdda.PlayMode = PLAYMODE_SILENT; + cdda.CDDAStatus = CDDASTATUS_STOPPED; + break; + } + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xDA - Pause * +* * +********************************************************/ +static void DoNEC_PCE_PAUSE(const uint8 *cdb) +{ + if(cdda.CDDAStatus != CDDASTATUS_STOPPED) // Hmm, should we give an error if it tries to pause and it's already paused? + { + cdda.CDDAStatus = CDDASTATUS_PAUSED; + SendStatusAndMessage(STATUS_GOOD, 0x00); + } + else // Definitely give an error if it tries to pause when no track is playing! + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); + } +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xDD - Read Subchannel Q * +* * +********************************************************/ +static void DoNEC_PCE_READSUBQ(const uint8 *cdb) +{ + uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; + uint8 data_in[8192]; + + memset(data_in, 0x00, 10); + + data_in[2] = SubQBuf[1]; // Track + data_in[3] = SubQBuf[2]; // Index + data_in[4] = SubQBuf[3]; // M(rel) + data_in[5] = SubQBuf[4]; // S(rel) + data_in[6] = SubQBuf[5]; // F(rel) + data_in[7] = SubQBuf[7]; // M(abs) + data_in[8] = SubQBuf[8]; // S(abs) + data_in[9] = SubQBuf[9]; // F(abs) + + if(cdda.CDDAStatus == CDDASTATUS_PAUSED) + data_in[0] = 2; // Pause + else if(cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) // FIXME: Is this the correct status code for scanning playback? + data_in[0] = 0; // Playing + else + data_in[0] = 3; // Stopped + + DoSimpleDataIn(data_in, 10); +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xDE - Get Directory Info * +* * +********************************************************/ +static void DoNEC_PCE_GETDIRINFO(const uint8 *cdb) +{ + // Problems: + // Returned data lengths on real PCE are not confirmed. + // Mode 0x03 behavior not tested on real PCE + + uint8 data_in[2048]; + uint32 data_in_size = 0; + + memset(data_in, 0, sizeof(data_in)); + + switch(cdb[1]) + { + default: //MDFN_DispMessage("Unknown GETDIRINFO Mode: %02x", cdb[1]); + //printf("Unknown GETDIRINFO Mode: %02x", cdb[1]); + case 0x0: + data_in[0] = U8_to_BCD(toc.first_track); + data_in[1] = U8_to_BCD(toc.last_track); + + data_in_size = 2; + break; + + case 0x1: + { + uint8 m, s, f; + + LBA_to_AMSF(toc.tracks[100].lba, &m, &s, &f); + + data_in[0] = U8_to_BCD(m); + data_in[1] = U8_to_BCD(s); + data_in[2] = U8_to_BCD(f); + + data_in_size = 3; + } + break; + + case 0x2: + { + uint8 m, s, f; + int track = BCD_to_U8(cdb[2]); + + if(!track) + track = 1; + else if(cdb[2] == 0xAA) + { + track = 100; + } + else if(track > 99) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); + + data_in[0] = U8_to_BCD(m); + data_in[1] = U8_to_BCD(s); + data_in[2] = U8_to_BCD(f); + data_in[3] = toc.tracks[track].control; + data_in_size = 4; + } + break; + } + + DoSimpleDataIn(data_in, data_in_size); +} + diff --git a/Mednafen/mednafen/cdrom/scsicd.cpp b/Mednafen/mednafen/cdrom/scsicd.cpp new file mode 100644 index 0000000000..9e963fee65 --- /dev/null +++ b/Mednafen/mednafen/cdrom/scsicd.cpp @@ -0,0 +1,3246 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include "scsicd.h" +#include "cdromif.h" +#include "SimpleFIFO.h" + +#if defined(__SSE2__) +#include +#include +#endif + +//#define SCSIDBG(format, ...) { printf("[SCSICD] " format "\n", ## __VA_ARGS__); } +//#define SCSIDBG(format, ...) { } + +using namespace CDUtility; + +static uint32 CD_DATA_TRANSFER_RATE; +static uint32 System_Clock; +static void (*CDIRQCallback)(int); +static void (*CDStuffSubchannels)(uint8, int); +static int32* HRBufs[2]; +static int WhichSystem; + +static CDIF *Cur_CDIF; +static bool TrayOpen; + +// Internal operation to the SCSI CD unit. Only pass 1 or 0 to these macros! +#define SetIOP(mask, set) { cd_bus.signals &= ~mask; if(set) cd_bus.signals |= mask; } + +#define SetBSY(set) SetIOP(SCSICD_BSY_mask, set) +#define SetIO(set) SetIOP(SCSICD_IO_mask, set) +#define SetCD(set) SetIOP(SCSICD_CD_mask, set) +#define SetMSG(set) SetIOP(SCSICD_MSG_mask, set) + +static INLINE void SetREQ(bool set) +{ + if(set && !REQ_signal) + CDIRQCallback(SCSICD_IRQ_MAGICAL_REQ); + + SetIOP(SCSICD_REQ_mask, set); +} + +#define SetkingACK(set) SetIOP(SCSICD_kingACK_mask, set) +#define SetkingRST(set) SetIOP(SCSICD_kingRST_mask, set) +#define SetkingSEL(set) SetIOP(SCSICD_kingSEL_mask, set) +#define SetkingATN(set) SetIOP(SCSICD_kingATN_mask, set) + + +enum +{ + QMode_Zero = 0, + QMode_Time = 1, + QMode_MCN = 2, // Media Catalog Number + QMode_ISRC = 3 // International Standard Recording Code +}; + +typedef struct +{ + bool last_RST_signal; + + // The pending message to send(in the message phase) + uint8 message_pending; + + bool status_sent, message_sent; + + // Pending error codes + uint8 key_pending, asc_pending, ascq_pending, fru_pending; + + uint8 command_buffer[256]; + uint8 command_buffer_pos; + uint8 command_size_left; + + // FALSE if not all pending data is in the FIFO, TRUE if it is. + // Used for multiple sector CD reads. + bool data_transfer_done; + + // To target(the cd unit); for "MODE SELECT". + uint8 data_out[256]; // Technically it only needs to be 255, but powers of 2 are better than those degenerate powers of 2 minus one goons. + uint8 data_out_pos; // Current index for writing into data_out. + uint8 data_out_want; // Total number of bytes to buffer into data_out. + + bool DiscChanged; + + uint8 SubQBuf[4][0xC]; // One for each of the 4 most recent q-Modes. + uint8 SubQBuf_Last[0xC]; // The most recent q subchannel data, regardless of q-mode. + + uint8 SubPWBuf[96]; + +} scsicd_t; + +enum +{ + CDDASTATUS_PAUSED = -1, + CDDASTATUS_STOPPED = 0, + CDDASTATUS_PLAYING = 1, + CDDASTATUS_SCANNING = 2, +}; + +enum +{ + PLAYMODE_SILENT = 0x00, + PLAYMODE_NORMAL, + PLAYMODE_INTERRUPT, + PLAYMODE_LOOP, +}; + +typedef struct +{ + uint32 CDDADivAcc; + uint8 CDDADivAccVolFudge; // For PC-FX CD-DA rate control RE impulses and resampling; 100 = 1.0. + uint32 scan_sec_end; + + uint8 PlayMode; + int32 CDDAVolume[2]; // 65536 = 1.0, the maximum. + int16 CDDASectorBuffer[1176]; + uint32 CDDAReadPos; + + int8 CDDAStatus; + uint8 ScanMode; + int64 CDDADiv; + int CDDATimeDiv; + + int16 OversampleBuffer[2][0x10 * 2]; // *2 so our MAC loop can blast through without masking the index. + unsigned OversamplePos; + + int16 sr[2]; + + uint8 OutPortChSelect[2]; + uint32 OutPortChSelectCache[2]; + int32 OutPortVolumeCache[2]; + + float DeemphState[2][2]; +} cdda_t; + +void MakeSense(uint8 * target, uint8 key, uint8 asc, uint8 ascq, uint8 fru) +{ + memset(target, 0, 18); + + target[0] = 0x70; // Current errors and sense data is not SCSI compliant + target[2] = key; + target[7] = 0x0A; + target[12] = asc; // Additional Sense Code + target[13] = ascq; // Additional Sense Code Qualifier + target[14] = fru; // Field Replaceable Unit code +} + +static void (*SCSILog)(const char *, const char *format, ...); +static void InitModePages(void); + +static scsicd_timestamp_t lastts; +static int64 monotonic_timestamp; +static int64 pce_lastsapsp_timestamp; + +scsicd_t cd; +scsicd_bus_t cd_bus; +static cdda_t cdda; + +static SimpleFIFO *din = NULL; + +static CDUtility::TOC toc; + +static uint32 read_sec_start; +static uint32 read_sec; +static uint32 read_sec_end; + +static int32 CDReadTimer; +static uint32 SectorAddr; +static uint32 SectorCount; + + +enum +{ + PHASE_BUS_FREE = 0, + PHASE_COMMAND, + PHASE_DATA_IN, + PHASE_DATA_OUT, + PHASE_STATUS, + PHASE_MESSAGE_IN, + PHASE_MESSAGE_OUT +}; +static unsigned int CurrentPhase; +static void ChangePhase(const unsigned int new_phase); + + +static void FixOPV(void) +{ + for(int port = 0; port < 2; port++) + { + int32 tmpvol = cdda.CDDAVolume[port] * 100 / (2 * cdda.CDDADivAccVolFudge); + + //printf("TV: %d\n", tmpvol); + + cdda.OutPortVolumeCache[port] = tmpvol; + + if(cdda.OutPortChSelect[port] & 0x01) + cdda.OutPortChSelectCache[port] = 0; + else if(cdda.OutPortChSelect[port] & 0x02) + cdda.OutPortChSelectCache[port] = 1; + else + { + cdda.OutPortChSelectCache[port] = 0; + cdda.OutPortVolumeCache[port] = 0; + } + } +} + +static void VirtualReset(void) +{ + InitModePages(); + + din->Flush(); + + CDReadTimer = 0; + + pce_lastsapsp_timestamp = monotonic_timestamp; + + SectorAddr = SectorCount = 0; + read_sec_start = read_sec = 0; + read_sec_end = ~0; + + cdda.PlayMode = PLAYMODE_SILENT; + cdda.CDDAReadPos = 0; + cdda.CDDAStatus = CDDASTATUS_STOPPED; + cdda.CDDADiv = 0; + + cdda.ScanMode = 0; + cdda.scan_sec_end = 0; + + cdda.OversamplePos = 0; + memset(cdda.sr, 0, sizeof(cdda.sr)); + memset(cdda.OversampleBuffer, 0, sizeof(cdda.OversampleBuffer)); + memset(cdda.DeemphState, 0, sizeof(cdda.DeemphState)); + + memset(cd.data_out, 0, sizeof(cd.data_out)); + cd.data_out_pos = 0; + cd.data_out_want = 0; + + + FixOPV(); + + ChangePhase(PHASE_BUS_FREE); +} + +void SCSICD_Power(scsicd_timestamp_t system_timestamp) +{ + memset(&cd, 0, sizeof(scsicd_t)); + memset(&cd_bus, 0, sizeof(scsicd_bus_t)); + + monotonic_timestamp = system_timestamp; + + cd.DiscChanged = false; + + if(Cur_CDIF && !TrayOpen) + Cur_CDIF->ReadTOC(&toc); + + CurrentPhase = PHASE_BUS_FREE; + + VirtualReset(); +} + + +void SCSICD_SetDB(uint8 data) +{ + cd_bus.DB = data; + //printf("Set DB: %02x\n", data); +} + +void SCSICD_SetACK(bool set) +{ + SetkingACK(set); + //printf("Set ACK: %d\n", set); +} + +void SCSICD_SetSEL(bool set) +{ + SetkingSEL(set); + //printf("Set SEL: %d\n", set); +} + +void SCSICD_SetRST(bool set) +{ + SetkingRST(set); + //printf("Set RST: %d\n", set); +} + +void SCSICD_SetATN(bool set) +{ + SetkingATN(set); + //printf("Set ATN: %d\n", set); +} + +static void GenSubQFromSubPW(void) +{ + uint8 SubQBuf[0xC]; + + memset(SubQBuf, 0, 0xC); + + for(int i = 0; i < 96; i++) + SubQBuf[i >> 3] |= ((cd.SubPWBuf[i] & 0x40) >> 6) << (7 - (i & 7)); + + //printf("Real %d/ SubQ %d - ", read_sec, BCD_to_U8(SubQBuf[7]) * 75 * 60 + BCD_to_U8(SubQBuf[8]) * 75 + BCD_to_U8(SubQBuf[9]) - 150); + // Debug code, remove me. + //for(int i = 0; i < 0xC; i++) + // printf("%02x ", SubQBuf[i]); + //printf("\n"); + + if(!subq_check_checksum(SubQBuf)) + { + //SCSIDBG("SubQ checksum error!"); + } + else + { + memcpy(cd.SubQBuf_Last, SubQBuf, 0xC); + + uint8 adr = SubQBuf[0] & 0xF; + + if(adr <= 0x3) + memcpy(cd.SubQBuf[adr], SubQBuf, 0xC); + + //if(adr == 0x02) + //for(int i = 0; i < 12; i++) + // printf("%02x\n", cd.SubQBuf[0x2][i]); + } +} + + +#define STATUS_GOOD 0 +#define STATUS_CHECK_CONDITION 1 +#define STATUS_CONDITION_MET 2 +#define STATUS_BUSY 4 +#define STATUS_INTERMEDIATE 8 + +#define SENSEKEY_NO_SENSE 0x0 +#define SENSEKEY_NOT_READY 0x2 +#define SENSEKEY_MEDIUM_ERROR 0x3 +#define SENSEKEY_HARDWARE_ERROR 0x4 +#define SENSEKEY_ILLEGAL_REQUEST 0x5 +#define SENSEKEY_UNIT_ATTENTION 0x6 +#define SENSEKEY_ABORTED_COMMAND 0xB + +#define ASC_MEDIUM_NOT_PRESENT 0x3A + + +// NEC sub-errors(ASC), no ASCQ. +#define NSE_NO_DISC 0x0B // Used with SENSEKEY_NOT_READY - This condition occurs when tray is closed with no disc present. +#define NSE_TRAY_OPEN 0x0D // Used with SENSEKEY_NOT_READY +#define NSE_SEEK_ERROR 0x15 +#define NSE_HEADER_READ_ERROR 0x16 // Used with SENSEKEY_MEDIUM_ERROR +#define NSE_NOT_AUDIO_TRACK 0x1C // Used with SENSEKEY_MEDIUM_ERROR +#define NSE_NOT_DATA_TRACK 0x1D // Used with SENSEKEY_MEDIUM_ERROR +#define NSE_INVALID_COMMAND 0x20 +#define NSE_INVALID_ADDRESS 0x21 +#define NSE_INVALID_PARAMETER 0x22 +#define NSE_END_OF_VOLUME 0x25 +#define NSE_INVALID_REQUEST_IN_CDB 0x27 +#define NSE_DISC_CHANGED 0x28 // Used with SENSEKEY_UNIT_ATTENTION +#define NSE_AUDIO_NOT_PLAYING 0x2C + +// ASC, ASCQ pair +#define AP_UNRECOVERED_READ_ERROR 0x11, 0x00 +#define AP_LEC_UNCORRECTABLE_ERROR 0x11, 0x05 +#define AP_CIRC_UNRECOVERED_ERROR 0x11, 0x06 + +#define AP_UNKNOWN_MEDIUM_FORMAT 0x30, 0x01 +#define AP_INCOMPAT_MEDIUM_FORMAT 0x30, 0x02 + +static void ChangePhase(const unsigned int new_phase) +{ + //printf("New phase: %d %lld\n", new_phase, monotonic_timestamp); + switch(new_phase) + { + case PHASE_BUS_FREE: + SetBSY(false); + SetMSG(false); + SetCD(false); + SetIO(false); + SetREQ(false); + + CDIRQCallback(0x8000 | SCSICD_IRQ_DATA_TRANSFER_DONE); + break; + + case PHASE_DATA_IN: // Us to them + SetBSY(true); + SetMSG(false); + SetCD(false); + SetIO(true); + //SetREQ(true); + SetREQ(false); + break; + + case PHASE_STATUS: // Us to them + SetBSY(true); + SetMSG(false); + SetCD(true); + SetIO(true); + SetREQ(true); + break; + + case PHASE_MESSAGE_IN: // Us to them + SetBSY(true); + SetMSG(true); + SetCD(true); + SetIO(true); + SetREQ(true); + break; + + + case PHASE_DATA_OUT: // Them to us + SetBSY(true); + SetMSG(false); + SetCD(false); + SetIO(false); + SetREQ(true); + break; + + case PHASE_COMMAND: // Them to us + SetBSY(true); + SetMSG(false); + SetCD(true); + SetIO(false); + SetREQ(true); + break; + + case PHASE_MESSAGE_OUT: // Them to us + SetBSY(true); + SetMSG(true); + SetCD(true); + SetIO(false); + SetREQ(true); + break; + } + CurrentPhase = new_phase; +} + +static void SendStatusAndMessage(uint8 status, uint8 message) +{ + // This should never ever happen, but that doesn't mean it won't. ;) + if(din->CanRead()) + { + //printf("[SCSICD] BUG: %d bytes still in SCSI CD FIFO\n", din->CanRead()); + din->Flush(); + } + + cd.message_pending = message; + + cd.status_sent = FALSE; + cd.message_sent = FALSE; + + if(WhichSystem == SCSICD_PCE) + { + if(status == STATUS_GOOD || status == STATUS_CONDITION_MET) + cd_bus.DB = 0x00; + else + cd_bus.DB = 0x01; + } + else + cd_bus.DB = status << 1; + + ChangePhase(PHASE_STATUS); +} + +static void DoSimpleDataIn(const uint8 *data_in, uint32 len) +{ + din->Write(data_in, len); + + cd.data_transfer_done = true; + + ChangePhase(PHASE_DATA_IN); +} + +void SCSICD_SetDisc(bool new_tray_open, CDIF *cdif, bool no_emu_side_effects) +{ + Cur_CDIF = cdif; + + // Closing the tray. + if(TrayOpen && !new_tray_open) + { + TrayOpen = false; + + if(cdif) + { + cdif->ReadTOC(&toc); + + if(!no_emu_side_effects) + { + memset(cd.SubQBuf, 0, sizeof(cd.SubQBuf)); + memset(cd.SubQBuf_Last, 0, sizeof(cd.SubQBuf_Last)); + cd.DiscChanged = true; + } + } + } + else if(!TrayOpen && new_tray_open) // Opening the tray + { + TrayOpen = true; + } +} + +static void CommandCCError(int key, int asc = 0, int ascq = 0) +{ + //printf("[SCSICD] CC Error: %02x %02x %02x\n", key, asc, ascq); + + cd.key_pending = key; + cd.asc_pending = asc; + cd.ascq_pending = ascq; + cd.fru_pending = 0x00; + + SendStatusAndMessage(STATUS_CHECK_CONDITION, 0x00); +} + +static bool ValidateRawDataSector(uint8 *data, const uint32 lba) +{ + if(!Cur_CDIF->ValidateRawSector(data)) + { + MDFN_DispMessage(_("Uncorrectable data at sector %d"), lba); + MDFN_PrintError(_("Uncorrectable data at sector %d"), lba); + + din->Flush(); + cd.data_transfer_done = false; + + CommandCCError(SENSEKEY_MEDIUM_ERROR, AP_LEC_UNCORRECTABLE_ERROR); + return(false); + } + + return(true); +} + +static void DoMODESELECT6(const uint8 *cdb) +{ + if(cdb[4]) + { + cd.data_out_pos = 0; + cd.data_out_want = cdb[4]; + //printf("Switch to DATA OUT phase, len: %d\n", cd.data_out_want); + + ChangePhase(PHASE_DATA_OUT); + } + else + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +/* + All Japan Female Pro Wrestle: + Datumama: 10, 00 00 00 00 00 00 00 00 00 0a + + Kokuu Hyouryuu Nirgends: + Datumama: 10, 00 00 00 00 00 00 00 00 00 0f + Datumama: 10, 00 00 00 00 00 00 00 00 00 0f + + Last Imperial Prince: + Datumama: 10, 00 00 00 00 00 00 00 00 00 0f + Datumama: 10, 00 00 00 00 00 00 00 00 00 0f + + Megami Paradise II: + Datumama: 10, 00 00 00 00 00 00 00 00 00 0a + + Miraculum: + Datumama: 7, 00 00 00 00 29 01 00 + Datumama: 10, 00 00 00 00 00 00 00 00 00 0f + Datumama: 7, 00 00 00 00 29 01 00 + Datumama: 10, 00 00 00 00 00 00 00 00 00 00 + Datumama: 7, 00 00 00 00 29 01 00 + + Pachio Kun FX: + Datumama: 10, 00 00 00 00 00 00 00 00 00 14 + + Return to Zork: + Datumama: 10, 00 00 00 00 00 00 00 00 00 00 + + Sotsugyou II: + Datumama: 10, 00 00 00 00 01 00 00 00 00 01 + + Tokimeki Card Paradise: + Datumama: 10, 00 00 00 00 00 00 00 00 00 14 + Datumama: 10, 00 00 00 00 00 00 00 00 00 07 + + Tonari no Princess Rolfee: + Datumama: 10, 00 00 00 00 00 00 00 00 00 00 + + Zoku Hakutoi Monogatari: + Datumama: 10, 00 00 00 00 00 00 00 00 00 14 +*/ + + // Page 151: MODE SENSE(6) + // PC = 0 current + // PC = 1 Changeable + // PC = 2 Default + // PC = 3 Saved + // Page 183: Mode parameter header. + // Page 363: CD-ROM density codes. + // Page 364: CD-ROM mode page codes. + // Page 469: ASC and ASCQ table + + +struct ModePageParam +{ + uint8 default_value; + uint8 alterable_mask; // Alterable mask reported when PC == 1 + uint8 real_mask; // Real alterable mask. +}; + +struct ModePage +{ + const uint8 code; + const uint8 param_length; + const ModePageParam params[64]; // 64 should be more than enough + uint8 current_value[64]; +}; + +/* + Mode pages present: + 0x00: + 0x0E: + 0x28: + 0x29: + 0x2A: + 0x2B: + 0x3F(Yes, not really a mode page but a fetch method) +*/ +// Remember to update the code in StateAction() if we change the number or layout of modepages here. +static const int NumModePages = 5; +static ModePage ModePages[NumModePages] = +{ + // Unknown + { 0x28, + 0x04, + { + { 0x00, 0x00, 0xFF }, + { 0x00, 0x00, 0xFF }, + { 0x00, 0x00, 0xFF }, + { 0x00, 0x00, 0xFF }, + } + }, + + // Unknown + { 0x29, + 0x01, + { + { 0x00, 0x00, 0xFF }, + } + }, + + // Unknown + { 0x2a, + 0x02, + { + { 0x00, 0x00, 0xFF }, + { 0x11, 0x00, 0xFF }, + } + }, + + // CD-DA playback speed modifier + { 0x2B, + 0x01, + { + { 0x00, 0x00, 0xFF }, + } + }, + + // 0x0E goes last, for correct order of return data when page code == 0x3F + // Real mask values are probably not right; some functionality not emulated yet. + // CD-ROM audio control parameters + { 0x0E, + 0x0E, + { + { 0x04, 0x04, 0x04 }, // Immed + { 0x00, 0x00, 0x00 }, // Reserved + { 0x00, 0x00, 0x00 }, // Reserved + { 0x00, 0x01, 0x01 }, // Reserved? + { 0x00, 0x00, 0x00 }, // MSB of LBA per second. + { 0x00, 0x00, 0x00 }, // LSB of LBA per second. + { 0x01, 0x01, 0x03 }, // Outport port 0 channel selection. + { 0xFF, 0x00, 0x00 }, // Outport port 0 volume. + { 0x02, 0x02, 0x03 }, // Outport port 1 channel selection. + { 0xFF, 0x00, 0x00 }, // Outport port 1 volume. + { 0x00, 0x00, 0x00 }, // Outport port 2 channel selection. + { 0x00, 0x00, 0x00 }, // Outport port 2 volume. + { 0x00, 0x00, 0x00 }, // Outport port 3 channel selection. + { 0x00, 0x00, 0x00 }, // Outport port 3 volume. + } + }, +}; + +static void UpdateMPCacheP(const ModePage* mp) +{ + switch(mp->code) + { + case 0x0E: + { + const uint8 *pd = &mp->current_value[0]; + + for(int i = 0; i < 2; i++) + cdda.OutPortChSelect[i] = pd[6 + i * 2]; + FixOPV(); + } + break; + + case 0x28: + break; + + case 0x29: + break; + + case 0x2A: + break; + + case 0x2B: + { + int speed; + int rate; + + // + // Not sure what the actual limits are, or what happens when exceeding them, but these will at least keep the + // CD-DA playback system from imploding in on itself. + // + // The range of speed values accessible via the BIOS CD-DA player is apparently -10 to 10. + // + // No game is known to use the CD-DA playback speed control. It may be useful in homebrew to lower the rate for fitting more CD-DA onto the disc, + // is implemented on the PC-FX in such a way that it degrades audio quality, so it wouldn't really make sense to increase the rate in homebrew. + // + // Due to performance considerations, we only partially emulate the CD-DA oversampling filters used on the PC Engine and PC-FX, and instead + // blast impulses into the 1.78MHz buffer, relying on the final sound resampler to kill spectrum mirrors. This is less than ideal, but generally + // works well in practice, except when lowering CD-DA playback rate...which causes the spectrum mirrors to enter the non-murder zone, causing + // the sound output amplitude to approach overflow levels. + // But, until there's a killer PC-FX homebrew game that necessitates more computationally-expensive CD-DA handling, + // I don't see a good reason to change how CD-DA resampling is currently implemented. + // + speed = std::max(-32, std::min(32, (int8)mp->current_value[0])); + rate = 44100 + 441 * speed; + + //printf("[SCSICD] Speed: %d(pre-clamped=%d) %d\n", speed, (int8)mp->current_value[0], rate); + cdda.CDDADivAcc = ((int64)System_Clock * (1024 * 1024) / (2 * rate)); + cdda.CDDADivAccVolFudge = 100 + speed; + FixOPV(); // Resampler impulse amplitude volume adjustment(call after setting cdda.CDDADivAccVolFudge) + } + break; + } +} + +static void UpdateMPCache(uint8 code) +{ + for(int pi = 0; pi < NumModePages; pi++) + { + const ModePage* mp = &ModePages[pi]; + + if(mp->code == code) + { + UpdateMPCacheP(mp); + break; + } + } +} + +static void InitModePages(void) +{ + for(int pi = 0; pi < NumModePages; pi++) + { + ModePage *mp = &ModePages[pi]; + const ModePageParam *params = &ModePages[pi].params[0]; + + for(int parami = 0; parami < mp->param_length; parami++) + mp->current_value[parami] = params[parami].default_value; + + UpdateMPCacheP(mp); + } +} + +static void FinishMODESELECT6(const uint8 *data, const uint8 data_len) +{ + uint8 mode_data_length, medium_type, device_specific, block_descriptor_length; + uint32 offset = 0; + + //printf("[SCSICD] Mode Select (6) Data: Length=0x%02x, ", data_len); + //for(uint32 i = 0; i < data_len; i++) + // printf("0x%02x ", data[i]); + //printf("\n"); + + if(data_len < 4) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + mode_data_length = data[offset++]; + medium_type = data[offset++]; + device_specific = data[offset++]; + block_descriptor_length = data[offset++]; + + // For now, shut up gcc. + (void)mode_data_length; + (void)medium_type; + (void)device_specific; + + if(block_descriptor_length & 0x7) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if((offset + block_descriptor_length) > data_len) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + // TODO: block descriptors. + offset += block_descriptor_length; + + // Now handle mode pages + while(offset < data_len) + { + const uint8 code = data[offset++]; + uint8 param_len = 0; + bool page_found = false; + + if(code == 0x00) + { + if((offset + 0x5) > data_len) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + UpdateMPCache(0x00); + + offset += 0x5; + continue; + } + + if(offset >= data_len) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + param_len = data[offset++]; + + for(int pi = 0; pi < NumModePages; pi++) + { + ModePage *mp = &ModePages[pi]; + + if(code == mp->code) + { + page_found = true; + + if(param_len != mp->param_length) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if((param_len + offset) > data_len) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + for(int parami = 0; parami < mp->param_length; parami++) + { + mp->current_value[parami] &= ~mp->params[parami].real_mask; + mp->current_value[parami] |= (data[offset++]) & mp->params[parami].real_mask; + } + + UpdateMPCacheP(mp); + break; + } + } + + if(!page_found) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + } + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +static void DoMODESENSE6(const uint8 *cdb) +{ + unsigned int PC = (cdb[2] >> 6) & 0x3; + unsigned int PageCode = cdb[2] & 0x3F; + bool DBD = cdb[1] & 0x08; + int AllocSize = cdb[4]; + int index = 0; + uint8 data_in[8192]; + uint8 PageMatchOR = 0x00; + bool AnyPageMatch = false; + + //SCSIDBG("Mode sense 6: %02x %d %d %d", PageCode, PC, DBD, AllocSize); + + if(!AllocSize) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + + if(PC == 3) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(PageCode == 0x00) // Special weird case. + { + if(DBD || PC) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + memset(data_in, 0, 0xA); + data_in[0] = 0x09; + data_in[2] = 0x80; + data_in[9] = 0x0F; + + if(AllocSize > 0xA) + AllocSize = 0xA; + + DoSimpleDataIn(data_in, AllocSize); + return; + } + + data_in[0] = 0x00; // Fill this in later. + data_in[1] = 0x00; // Medium type + data_in[2] = 0x00; // Device-specific parameter. + data_in[3] = DBD ? 0x00 : 0x08; // Block descriptor length. + index += 4; + + if(!DBD) + { + data_in[index++] = 0x00; // Density code. + MDFN_en24msb(&data_in[index], 0x6E); // Number of blocks? + index += 3; + + data_in[index++] = 0x00; // Reserved + MDFN_en24msb(&data_in[index], 0x800); // Block length; + index += 3; + } + + PageMatchOR = 0x00; + if(PageCode == 0x3F) + PageMatchOR = 0x3F; + + for(int pi = 0; pi < NumModePages; pi++) + { + const ModePage *mp = &ModePages[pi]; + const ModePageParam *params = &ModePages[pi].params[0]; + + if((mp->code | PageMatchOR) != PageCode) + continue; + + AnyPageMatch = true; + + data_in[index++] = mp->code; + data_in[index++] = mp->param_length; + + for(int parami = 0; parami < mp->param_length; parami++) + { + uint8 data; + + if(PC == 0x02) + data = params[parami].default_value; + else if(PC == 0x01) + data = params[parami].alterable_mask; + else + data = mp->current_value[parami]; + + data_in[index++] = data; + } + } + + if(!AnyPageMatch) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(AllocSize > index) + AllocSize = index; + + data_in[0] = AllocSize - 1; + + DoSimpleDataIn(data_in, AllocSize); +} + +static void DoSTARTSTOPUNIT6(const uint8 *cdb) +{ + //bool Immed = cdb[1] & 0x01; + //bool LoEj = cdb[4] & 0x02; + //bool Start = cdb[4] & 0x01; + + //SCSIDBG("Do start stop unit 6: %d %d %d\n", Immed, LoEj, Start); + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +static void DoREZEROUNIT(const uint8 *cdb) +{ + //SCSIDBG("Rezero Unit: %02x\n", cdb[5]); + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +// This data was originally taken from a PC-FXGA software loader, but +// while it was mostly correct(maybe it is correct for the FXGA, but not for the PC-FX?), +// it was 3 bytes too long, and the last real byte was 0x45 instead of 0x20. +// TODO: Investigate this discrepancy by testing an FXGA with the official loader software. +#if 0 +static const uint8 InqData[0x24] = +{ + // Standard + 0x05, 0x80, 0x02, 0x00, + + // Additional Length + 0x1F, + + // Vendor Specific + 0x00, 0x00, 0x00, 0x4E, 0x45, 0x43, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x43, 0x44, 0x2D, 0x52, 0x4F, + 0x4D, 0x20, 0x44, 0x52, 0x49, 0x56, 0x45, 0x3A, + 0x46, 0x58, 0x20, 0x31, 0x2E, 0x30, 0x20 +}; +#endif + +// Miraculum behaves differently if the last byte(offset 0x23) of the inquiry data is 0x45(ASCII character 'E'). Relavent code is at PC=0x3E382 +// If it's = 0x45, it will run MODE SELECT, and transfer this data to the CD unit: 00 00 00 00 29 01 00 +static const uint8 InqData[0x24] = +{ + // Peripheral device-type: CD-ROM/read-only direct access device + 0x05, + + // Removable media: yes + // Device-type qualifier: 0 + 0x80, + + // ISO version: 0 + // ECMA version: 0 + // ANSI version: 2 (SCSI-2? ORLY?) + 0x02, + + // Supports asynchronous event notification: no + // Supports the terminate I/O process message: no + // Response data format: 0 (not exactly correct, not exactly incorrect, meh. :b) + 0x00, + + // Additional Length + 0x1F, + + // Reserved + 0x00, 0x00, + + // Yay, no special funky features. + 0x00, + + // 8-15, vendor ID + // NEC + 0x4E, 0x45, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, + + // 16-31, product ID + // CD-ROM DRIVE:FX + 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x20, 0x44, 0x52, 0x49, 0x56, 0x45, 0x3A, 0x46, 0x58, 0x20, + + // 32-35, product revision level + // 1.0 + 0x31, 0x2E, 0x30, 0x20 +}; + +static void DoINQUIRY(const uint8 *cdb) +{ + unsigned int AllocSize = (cdb[4] < sizeof(InqData)) ? cdb[4] : sizeof(InqData); + + if(AllocSize) + DoSimpleDataIn(InqData, AllocSize); + else + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +static void DoNEC_NOP(const uint8 *cdb) +{ + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* PC-FX CD Command 0xDC - EJECT * +* * +********************************************************/ +static void DoNEC_EJECT(const uint8 *cdb) +{ + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_REQUEST_IN_CDB); +} + +static void DoREQUESTSENSE(const uint8 *cdb) +{ + uint8 data_in[8192]; + + MakeSense(data_in, cd.key_pending, cd.asc_pending, cd.ascq_pending, cd.fru_pending); + + DoSimpleDataIn(data_in, 18); + + cd.key_pending = 0; + cd.asc_pending = 0; + cd.ascq_pending = 0; + cd.fru_pending = 0; +} + +static void EncodeM3TOC(uint8 *buf, uint8 POINTER_RAW, int32 LBA, uint32 PLBA, uint8 control) +{ + uint8 MIN, SEC, FRAC; + uint8 PMIN, PSEC, PFRAC; + + LBA_to_AMSF(LBA, &MIN, &SEC, &FRAC); + LBA_to_AMSF(PLBA, &PMIN, &PSEC, &PFRAC); + + buf[0x0] = control << 4; + buf[0x1] = 0x00; // TNO + buf[0x2] = POINTER_RAW; + buf[0x3] = U8_to_BCD(MIN); + buf[0x4] = U8_to_BCD(SEC); + buf[0x5] = U8_to_BCD(FRAC); + buf[0x6] = 0x00; // Zero + buf[0x7] = U8_to_BCD(PMIN); + buf[0x8] = U8_to_BCD(PSEC); + buf[0x9] = U8_to_BCD(PFRAC); +} + +/******************************************************** +* * +* PC-FX CD Command 0xDE - Get Directory Info * +* * +********************************************************/ +static void DoNEC_GETDIRINFO(const uint8 *cdb) +{ + // Problems: + // Mode 0x03 has a few semi-indeterminate(but within a range, and they only change when the disc is reloaded) fields on a real PC-FX, that correspond to where in the lead-in area the data + // was read, that we don't bother to handle here. + // Mode 0x03 returns weird/wrong control field data for the "last track" and "leadout" entries in the "Blue Breaker" TOC. + // A bug in the PC-FX CD firmware, or an oddity of the disc(maybe other PC-FX discs are similar)? Or maybe it's an undefined field in that context? + // "Match" value of 0xB0 is probably not handled properly. Is it to return the catalog number, or something else? + + uint8 data_in[2048]; + uint32 data_in_size = 0; + + memset(data_in, 0, sizeof(data_in)); + + switch(cdb[1] & 0x03) + { + // This commands returns relevant raw TOC data as encoded in the Q subchannel(sans the CRC bytes). + case 0x3: + { + int offset = 0; + int32 lilba = -150; + uint8 match = cdb[2]; + + if(match != 0x00 && match != 0xA0 && match != 0xA1 && match != 0xA2 && match != 0xB0) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_ADDRESS); + return; + } + memset(data_in, 0, sizeof(data_in)); + + data_in[0] = 0x00; // Size MSB??? + data_in[1] = 0x00; // Total Size - 2(we'll fill it in later). + offset = 2; + + if(!match || match == 0xA0) + { + EncodeM3TOC(&data_in[offset], 0xA0, lilba, toc.first_track * 75 * 60 - 150, toc.tracks[toc.first_track].control); + lilba++; + offset += 0xA; + } + + if(!match || match == 0xA1) + { + EncodeM3TOC(&data_in[offset], 0xA1, lilba, toc.last_track * 75 * 60 - 150, toc.tracks[toc.last_track].control); + lilba++; + offset += 0xA; + } + + if(!match || match == 0xA2) + { + EncodeM3TOC(&data_in[offset], 0xA2, lilba, toc.tracks[100].lba, toc.tracks[100].control); + lilba++; + offset += 0xA; + } + + if(!match) + for(int track = toc.first_track; track <= toc.last_track; track++) + { + EncodeM3TOC(&data_in[offset], U8_to_BCD(track), lilba, toc.tracks[track].lba, toc.tracks[track].control); + lilba++; + offset += 0xA; + } + + if(match == 0xB0) + { + memset(&data_in[offset], 0, 0x14); + offset += 0x14; + } + + assert((unsigned int)offset <= sizeof(data_in)); + data_in_size = offset; + MDFN_en16msb(&data_in[0], offset - 2); + } + break; + + case 0x0: + data_in[0] = U8_to_BCD(toc.first_track); + data_in[1] = U8_to_BCD(toc.last_track); + + data_in_size = 4; + break; + + case 0x1: + { + uint8 m, s, f; + + LBA_to_AMSF(toc.tracks[100].lba, &m, &s, &f); + + data_in[0] = U8_to_BCD(m); + data_in[1] = U8_to_BCD(s); + data_in[2] = U8_to_BCD(f); + + data_in_size = 4; + } + break; + + case 0x2: + { + uint8 m, s, f; + int track = BCD_to_U8(cdb[2]); + + if(track < toc.first_track || track > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_ADDRESS); + return; + } + + LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); + + data_in[0] = U8_to_BCD(m); + data_in[1] = U8_to_BCD(s); + data_in[2] = U8_to_BCD(f); + data_in[3] = toc.tracks[track].control; + data_in_size = 4; + } + break; + } + + DoSimpleDataIn(data_in, data_in_size); +} + +static void DoREADTOC(const uint8 *cdb) +{ + uint8 data_in[8192]; + int FirstTrack = toc.first_track; + int LastTrack = toc.last_track; + int StartingTrack = cdb[6]; + unsigned int AllocSize = (cdb[7] << 8) | cdb[8]; + unsigned int RealSize = 0; + const bool WantInMSF = cdb[1] & 0x2; + + if(!AllocSize) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + + if((cdb[1] & ~0x2) || cdb[2] || cdb[3] || cdb[4] || cdb[5] || cdb[9]) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(!StartingTrack) + StartingTrack = 1; + else if(StartingTrack == 0xAA) + { + StartingTrack = LastTrack + 1; + } + else if(StartingTrack > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + data_in[2] = FirstTrack; + data_in[3] = LastTrack; + + RealSize += 4; + + // Read leadout track too LastTrack + 1 ??? + for(int track = StartingTrack; track <= (LastTrack + 1); track++) + { + uint8 *subptr = &data_in[RealSize]; + uint32 lba; + uint8 m, s, f; + uint32 eff_track; + + if(track == (LastTrack + 1)) + eff_track = 100; + else + eff_track = track; + + lba = toc.tracks[eff_track].lba; + LBA_to_AMSF(lba, &m, &s, &f); + + subptr[0] = 0; + subptr[1] = toc.tracks[eff_track].control | (toc.tracks[eff_track].adr << 4); + + if(eff_track == 100) + subptr[2] = 0xAA; + else + subptr[2] = track; + + subptr[3] = 0; + + if(WantInMSF) + { + subptr[4] = 0; + subptr[5] = m; // Min + subptr[6] = s; // Sec + subptr[7] = f; // Frames + } + else + { + subptr[4] = lba >> 24; + subptr[5] = lba >> 16; + subptr[6] = lba >> 8; + subptr[7] = lba >> 0; + } + RealSize += 8; + } + + // PC-FX: AllocSize too small doesn't reflect in this. + data_in[0] = (RealSize - 2) >> 8; + data_in[1] = (RealSize - 2) >> 0; + + DoSimpleDataIn(data_in, (AllocSize < RealSize) ? AllocSize : RealSize); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x25 - READ CD-ROM CAPACITY * +* * +********************************************************/ +static void DoREADCDCAP10(const uint8 *cdb) +{ + bool pmi = cdb[8] & 0x1; + uint32 lba = MDFN_de32msb(cdb + 0x2); + uint32 ret_lba; + uint32 ret_bl; + uint8 data_in[8]; + + memset(data_in, 0, sizeof(data_in)); + + if(lba > 0x05FF69) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + ret_lba = toc.tracks[100].lba - 1; + + if(pmi) + { + // Look for the track containing the LBA specified, then search for the first track afterwards that has a different track type(audio, data), + // and set the returned LBA to the sector preceding that track. + // + // If the specified LBA is >= leadout track, return the LBA of the sector immediately before the leadout track. + // + // If the specified LBA is < than the LBA of the first track, then return the LBA of sector preceding the first track. (I don't know if PC-FX can even handle discs like this, though) + if(lba >= toc.tracks[100].lba) + ret_lba = toc.tracks[100].lba - 1; + else if(lba < toc.tracks[toc.first_track].lba) + ret_lba = toc.tracks[toc.first_track].lba - 1; + else + { + const int track = toc.FindTrackByLBA(lba); + + for(int st = track + 1; st <= toc.last_track; st++) + { + if((toc.tracks[st].control ^ toc.tracks[track].control) & 0x4) + { + ret_lba = toc.tracks[st].lba - 1; + break; + } + } + } + } + + ret_bl = 2048; + + MDFN_en32msb(&data_in[0], ret_lba); + MDFN_en32msb(&data_in[4], ret_bl); + + cdda.CDDAStatus = CDDASTATUS_STOPPED; + + DoSimpleDataIn(data_in, 8); +} + +static void DoREADHEADER10(const uint8 *cdb) +{ + uint8 data_in[8192]; + bool WantInMSF = cdb[1] & 0x2; + uint32 HeaderLBA = MDFN_de32msb(cdb + 0x2); + int AllocSize = MDFN_de16msb(cdb + 0x7); + uint8 raw_buf[2352 + 96]; + uint8 mode; + int m, s, f; + uint32 lba; + + // Don't run command at all if AllocSize == 0(FIXME: On a real PC-FX, this command will return success + // if there's no CD when AllocSize == 0, implement this here, might require refactoring). + if(!AllocSize) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + + if(HeaderLBA >= toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(HeaderLBA < toc.tracks[toc.first_track].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + Cur_CDIF->ReadRawSector(raw_buf, HeaderLBA); //, HeaderLBA + 1); + if(!ValidateRawDataSector(raw_buf, HeaderLBA)) + return; + + m = BCD_to_U8(raw_buf[12 + 0]); + s = BCD_to_U8(raw_buf[12 + 1]); + f = BCD_to_U8(raw_buf[12 + 2]); + mode = raw_buf[12 + 3]; + lba = AMSF_to_LBA(m, s, f); + + //printf("%d:%d:%d(LBA=%08x) %02x\n", m, s, f, lba, mode); + + data_in[0] = mode; + data_in[1] = 0; + data_in[2] = 0; + data_in[3] = 0; + + if(WantInMSF) + { + data_in[4] = 0; + data_in[5] = m; // Min + data_in[6] = s; // Sec + data_in[7] = f; // Frames + } + else + { + data_in[4] = lba >> 24; + data_in[5] = lba >> 16; + data_in[6] = lba >> 8; + data_in[7] = lba >> 0; + } + + cdda.CDDAStatus = CDDASTATUS_STOPPED; + + DoSimpleDataIn(data_in, 8); +} + +static void DoNEC_SST(const uint8 *cdb) // Command 0xDB, Set Stop Time +{ + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +static void DoPABase(const uint32 lba, const uint32 length, unsigned int status = CDDASTATUS_PLAYING, unsigned int mode = PLAYMODE_NORMAL) +{ + if(lba > toc.tracks[100].lba) // > is not a typo, it's a PC-FX bug apparently. + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(lba < toc.tracks[toc.first_track].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(!length) // FIXME to return good status in this case even if no CD is present + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + else + { + if(toc.tracks[toc.FindTrackByLBA(lba)].control & 0x04) + { + CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_NOT_AUDIO_TRACK); + return; + } + + cdda.CDDAReadPos = 588; + read_sec = read_sec_start = lba; + read_sec_end = read_sec_start + length; + + cdda.CDDAStatus = status; + cdda.PlayMode = mode; + + if(read_sec < toc.tracks[100].lba) + { + Cur_CDIF->HintReadSector(read_sec); //, read_sec_end, read_sec_start); + } + } + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* PC-FX CD Command 0xD8 - SAPSP * +* * +********************************************************/ +static void DoNEC_SAPSP(const uint8 *cdb) +{ + uint32 lba; + + switch (cdb[9] & 0xc0) + { + default: + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + break; + + case 0x00: + lba = MDFN_de24msb(&cdb[3]); + break; + + case 0x40: + { + uint8 m, s, f; + + if(!BCD_to_U8_check(cdb[2], &m) || !BCD_to_U8_check(cdb[3], &s) || !BCD_to_U8_check(cdb[4], &f)) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + lba = AMSF_to_LBA(m, s, f); + } + break; + + case 0x80: + { + uint8 track; + + if(!cdb[2] || !BCD_to_U8_check(cdb[2], &track)) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(track == toc.last_track + 1) + track = 100; + else if(track > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + lba = toc.tracks[track].lba; + } + break; + } + + if(cdb[1] & 0x01) + DoPABase(lba, toc.tracks[100].lba - lba, CDDASTATUS_PLAYING, PLAYMODE_NORMAL); + else + DoPABase(lba, toc.tracks[100].lba - lba, CDDASTATUS_PAUSED, PLAYMODE_SILENT); +} + + + +/******************************************************** +* * +* PC-FX CD Command 0xD9 - SAPEP * +* * +********************************************************/ +static void DoNEC_SAPEP(const uint8 *cdb) +{ + uint32 lba; + + if(cdda.CDDAStatus == CDDASTATUS_STOPPED) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); + return; + } + + switch (cdb[9] & 0xc0) + { + default: + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + break; + + case 0x00: + lba = MDFN_de24msb(&cdb[3]); + break; + + case 0x40: + { + uint8 m, s, f; + + if(!BCD_to_U8_check(cdb[2], &m) || !BCD_to_U8_check(cdb[3], &s) || !BCD_to_U8_check(cdb[4], &f)) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + lba = AMSF_to_LBA(m, s, f); + } + break; + + case 0x80: + { + uint8 track; + + if(!cdb[2] || !BCD_to_U8_check(cdb[2], &track)) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(track == toc.last_track + 1) + track = 100; + else if(track > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + lba = toc.tracks[track].lba; + } + break; + } + + switch(cdb[1] & 0x7) + { + case 0x00: cdda.PlayMode = PLAYMODE_SILENT; + break; + + case 0x04: cdda.PlayMode = PLAYMODE_LOOP; + break; + + default: cdda.PlayMode = PLAYMODE_NORMAL; + break; + } + cdda.CDDAStatus = CDDASTATUS_PLAYING; + + read_sec_end = lba; + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x45 - PLAY AUDIO(10) * +* * +********************************************************/ +static void DoPA10(const uint8 *cdb) +{ + // Real PC-FX Bug: Error out on LBA >(not >=) leadout sector number + const uint32 lba = MDFN_de32msb(cdb + 0x2); + const uint16 length = MDFN_de16msb(cdb + 0x7); + + DoPABase(lba, length); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0xA5 - PLAY AUDIO(12) * +* * +********************************************************/ +static void DoPA12(const uint8 *cdb) +{ + // Real PC-FX Bug: Error out on LBA >(not >=) leadout sector number + const uint32 lba = MDFN_de32msb(cdb + 0x2); + const uint32 length = MDFN_de32msb(cdb + 0x6); + + DoPABase(lba, length); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x47 - PLAY AUDIO MSF * +* * +********************************************************/ +static void DoPAMSF(const uint8 *cdb) +{ + int32 lba_start, lba_end; + + lba_start = AMSF_to_LBA(cdb[3], cdb[4], cdb[5]); + lba_end = AMSF_to_LBA(cdb[6], cdb[7], cdb[8]); + + if(lba_start < 0 || lba_end < 0 || lba_start >= (int32)toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + if(lba_start == lba_end) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + else if(lba_start > lba_end) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_ADDRESS); + return; + } + + cdda.CDDAReadPos = 588; + read_sec = read_sec_start = lba_start; + read_sec_end = lba_end; + + cdda.CDDAStatus = CDDASTATUS_PLAYING; + cdda.PlayMode = PLAYMODE_NORMAL; + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +static void DoPATI(const uint8 *cdb) +{ + // "Boundary Gate" uses this command. + // Problems: + // The index fields aren't handled. The ending index wouldn't be too bad, but the starting index would require a bit of work and code uglyfying(to scan for the index), and may be highly + // problematic when Mednafen is used with a physical CD. + int StartTrack = cdb[4]; + int EndTrack = cdb[7]; + //int StartIndex = cdb[5]; + //int EndIndex = cdb[8]; + + if(!StartTrack || StartTrack < toc.first_track || StartTrack > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + //printf("PATI: %d %d %d SI: %d, EI: %d\n", StartTrack, EndTrack, Cur_CDIF->GetTrackStartPositionLBA(StartTrack), StartIndex, EndIndex); + + DoPABase(toc.tracks[StartTrack].lba, toc.tracks[EndTrack].lba - toc.tracks[StartTrack].lba); +} + + +static void DoPATRBase(const uint32 lba, const uint32 length) +{ + if(lba >= toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(lba < toc.tracks[toc.first_track].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(!length) // FIXME to return good status in this case even if no CD is present + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + else + { + if(toc.tracks[toc.FindTrackByLBA(lba)].control & 0x04) + { + CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_NOT_AUDIO_TRACK); + return; + } + + cdda.CDDAReadPos = 588; + read_sec = read_sec_start = lba; + read_sec_end = read_sec_start + length; + + cdda.CDDAStatus = CDDASTATUS_PLAYING; + cdda.PlayMode = PLAYMODE_NORMAL; + } + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + +/******************************************************** +* * +* SCSI-2 CD Command 0x49 - PLAY AUDIO TRACK * +* RELATIVE(10) * +********************************************************/ +static void DoPATR10(const uint8 *cdb) +{ + const int32 rel_lba = MDFN_de32msb(cdb + 0x2); + const int StartTrack = cdb[6]; + const uint16 length = MDFN_de16msb(cdb + 0x7); + + if(!StartTrack || StartTrack < toc.first_track || StartTrack > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + DoPATRBase(toc.tracks[StartTrack].lba + rel_lba, length); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0xA9 - PLAY AUDIO TRACK * +* RELATIVE(12) * +********************************************************/ +static void DoPATR12(const uint8 *cdb) +{ + const int32 rel_lba = MDFN_de32msb(cdb + 0x2); + const int StartTrack = cdb[10]; + const uint32 length = MDFN_de32msb(cdb + 0x6); + + if(!StartTrack || StartTrack < toc.first_track || StartTrack > toc.last_track) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + DoPATRBase(toc.tracks[StartTrack].lba + rel_lba, length); +} + +static void DoPAUSERESUME(const uint8 *cdb) +{ + // Pause/resume + // "It shall not be considered an error to request a pause when a pause is already in effect, + // or to request a resume when a play operation is in progress." + + if(cdda.CDDAStatus == CDDASTATUS_STOPPED) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); + return; + } + + if(cdb[8] & 1) // Resume + cdda.CDDAStatus = CDDASTATUS_PLAYING; + else + cdda.CDDAStatus = CDDASTATUS_PAUSED; + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + + + +static void DoREADBase(uint32 sa, uint32 sc) +{ + int track; + + if(sa > toc.tracks[100].lba) // Another one of those off-by-one PC-FX CD bugs. + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + if((track = toc.FindTrackByLBA(sa)) == 0) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + if(!(toc.tracks[track].control) & 0x4) + { + CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_NOT_DATA_TRACK); + return; + } + + // Case for READ(10) and READ(12) where sc == 0, and sa == toc.tracks[100].lba + if(!sc && sa == toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_HEADER_READ_ERROR); + return; + } + + if(SCSILog) + { + int Track = toc.FindTrackByLBA(sa); + uint32 Offset = sa - toc.tracks[Track].lba; //Cur_CDIF->GetTrackStartPositionLBA(Track); + SCSILog("SCSI", "Read: start=0x%08x(track=%d, offs=0x%08x), cnt=0x%08x", sa, Track, Offset, sc); + } + + SectorAddr = sa; + SectorCount = sc; + if(SectorCount) + { + Cur_CDIF->HintReadSector(sa); //, sa + sc); + + CDReadTimer = (uint64)((WhichSystem == SCSICD_PCE) ? 3 : 1) * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; + } + else + { + CDReadTimer = 0; + SendStatusAndMessage(STATUS_GOOD, 0x00); + } + cdda.CDDAStatus = CDDASTATUS_STOPPED; +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x08 - READ(6) * +* * +********************************************************/ +static void DoREAD6(const uint8 *cdb) +{ + uint32 sa = ((cdb[1] & 0x1F) << 16) | (cdb[2] << 8) | (cdb[3] << 0); + uint32 sc = cdb[4]; + + // TODO: confirm real PCE does this(PC-FX does at least). + if(!sc) + { + //SCSIDBG("READ(6) with count == 0.\n"); + sc = 256; + } + + DoREADBase(sa, sc); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x28 - READ(10) * +* * +********************************************************/ +static void DoREAD10(const uint8 *cdb) +{ + uint32 sa = MDFN_de32msb(cdb + 0x2); + uint32 sc = MDFN_de16msb(cdb + 0x7); + + DoREADBase(sa, sc); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0xA8 - READ(12) * +* * +********************************************************/ +static void DoREAD12(const uint8 *cdb) +{ + uint32 sa = MDFN_de32msb(cdb + 0x2); + uint32 sc = MDFN_de32msb(cdb + 0x6); + + DoREADBase(sa, sc); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x34 - PREFETCH(10) * +* * +********************************************************/ +static void DoPREFETCH(const uint8 *cdb) +{ + uint32 lba = MDFN_de32msb(cdb + 0x2); + //uint32 len = MDFN_de16msb(cdb + 0x7); + //bool reladdr = cdb[1] & 0x1; + //bool immed = cdb[1] & 0x2; + + // Note: This command appears to lock up the CD unit to some degree on a real PC-FX if the (lba + len) >= leadout_track_lba, + // more testing is needed if we ever try to fully emulate this command. + if(lba >= toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + //printf("Prefetch: %08x %08x %d %d %d %d\n", lba, len, link, flag, reladdr, immed); + //SendStatusAndMessage(STATUS_GOOD, 0x00); + SendStatusAndMessage(STATUS_CONDITION_MET, 0x00); +} + + + + +// SEEK functions are mostly just stubs for now, until(if) we emulate seek delays. +static void DoSEEKBase(uint32 lba) +{ + if(lba >= toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + cdda.CDDAStatus = CDDASTATUS_STOPPED; + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x0B - SEEK(6) * +* * +********************************************************/ +static void DoSEEK6(const uint8 *cdb) +{ + uint32 lba = ((cdb[1] & 0x1F) << 16) | (cdb[2] << 8) | cdb[3]; + + DoSEEKBase(lba); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x2B - SEEK(10) * +* * +********************************************************/ +static void DoSEEK10(const uint8 *cdb) +{ + uint32 lba = MDFN_de32msb(cdb + 0x2); + + DoSEEKBase(lba); +} + +// 353 +/******************************************************** +* * +* SCSI-2 CD Command 0x42 - READ SUB-CHANNEL(10) * +* * +********************************************************/ +static void DoREADSUBCHANNEL(const uint8 *cdb) +{ + uint8 data_in[8192]; + int DataFormat = cdb[3]; + int TrackNum = cdb[6]; + unsigned AllocSize = (cdb[7] << 8) | cdb[8]; + bool WantQ = cdb[2] & 0x40; + bool WantMSF = cdb[1] & 0x02; + uint32 offset = 0; + + if(!AllocSize) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + return; + } + + if(DataFormat > 0x3) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + if(DataFormat == 0x3 && (TrackNum < toc.first_track || TrackNum > toc.last_track)) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + data_in[offset++] = 0; + + // FIXME: Is this audio status code correct for scanning playback?? + if(cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) + data_in[offset++] = 0x11; // Audio play operation in progress + else if(cdda.CDDAStatus == CDDASTATUS_PAUSED) + data_in[offset++] = 0x12; // Audio play operation paused + else + data_in[offset++] = 0x13; // 0x13(audio play operation completed successfully) or 0x15(no current audio status to return)? :( + + + // Subchannel data length(at data_in[0x2], filled out at the end of the function) + data_in[offset++] = 0x00; + data_in[offset++] = 0x00; + + //printf("42Read SubChannel: %02x %02x %d %d %d\n", DataFormat, TrackNum, AllocSize, WantQ, WantMSF); + if(WantQ) + { + // Sub-channel format code + data_in[offset++] = DataFormat; + if(!DataFormat || DataFormat == 0x01) + { + uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; + + data_in[offset++] = ((SubQBuf[0] & 0x0F) << 4) | ((SubQBuf[0] & 0xF0) >> 4); // Control/adr + data_in[offset++] = SubQBuf[1]; // Track + data_in[offset++] = SubQBuf[2]; // Index + + // Absolute CD-ROM address + if(WantMSF) + { + data_in[offset++] = 0; + data_in[offset++] = BCD_to_U8(SubQBuf[7]); // M + data_in[offset++] = BCD_to_U8(SubQBuf[8]); // S + data_in[offset++] = BCD_to_U8(SubQBuf[9]); // F + } + else + { + uint32 tmp_lba = BCD_to_U8(SubQBuf[7]) * 60 * 75 + BCD_to_U8(SubQBuf[8]) * 75 + BCD_to_U8(SubQBuf[9]) - 150; + + data_in[offset++] = tmp_lba >> 24; + data_in[offset++] = tmp_lba >> 16; + data_in[offset++] = tmp_lba >> 8; + data_in[offset++] = tmp_lba >> 0; + } + + // Relative CD-ROM address + if(WantMSF) + { + data_in[offset++] = 0; + data_in[offset++] = BCD_to_U8(SubQBuf[3]); // M + data_in[offset++] = BCD_to_U8(SubQBuf[4]); // S + data_in[offset++] = BCD_to_U8(SubQBuf[5]); // F + } + else + { + uint32 tmp_lba = BCD_to_U8(SubQBuf[3]) * 60 * 75 + BCD_to_U8(SubQBuf[4]) * 75 + BCD_to_U8(SubQBuf[5]); // Don't subtract 150 in the conversion! + + data_in[offset++] = tmp_lba >> 24; + data_in[offset++] = tmp_lba >> 16; + data_in[offset++] = tmp_lba >> 8; + data_in[offset++] = tmp_lba >> 0; + } + } + + if(!DataFormat || DataFormat == 0x02) + { + if(DataFormat == 0x02) + { + data_in[offset++] = 0x00; + data_in[offset++] = 0x00; + data_in[offset++] = 0x00; + } + data_in[offset++] = 0x00; // MCVal and reserved. + for(int i = 0; i < 15; i++) + data_in[offset++] = 0x00; + } + + // Track ISRC + if(!DataFormat || DataFormat == 0x03) + { + if(DataFormat == 0x03) + { + uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; // FIXME + data_in[offset++] = ((SubQBuf[0] & 0x0F) << 4) | ((SubQBuf[0] & 0xF0) >> 4); // Control/adr + data_in[offset++] = TrackNum; // From sub Q or from parameter? + data_in[offset++] = 0x00; // Reserved. + } + data_in[offset++] = 0x00; // TCVal and reserved + for(int i = 0; i < 15; i++) + data_in[offset++] = 0x00; + } + } + + MDFN_en16msb(&data_in[0x2], offset - 0x4); + + DoSimpleDataIn(data_in, (AllocSize > offset) ? offset : AllocSize); +} + + + +/******************************************************** +* * +* PC-FX CD Command 0xDD - READ SUB Q * +* * +********************************************************/ +static void DoNEC_READSUBQ(const uint8 *cdb) +{ + uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; + uint8 data_in[10]; + const uint8 alloc_size = (cdb[1] < 10) ? cdb[1] : 10; + + memset(data_in, 0x00, 10); + + if(cdda.CDDAStatus == CDDASTATUS_PAUSED) + data_in[0] = 2; // Pause + else if(cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) // FIXME: Is this the correct status code for scanning playback? + data_in[0] = 0; // Playing + else + data_in[0] = 3; // Stopped + + data_in[1] = SubQBuf[0]; // Control/adr + data_in[2] = SubQBuf[1]; // Track + data_in[3] = SubQBuf[2]; // Index + data_in[4] = SubQBuf[3]; // M(rel) + data_in[5] = SubQBuf[4]; // S(rel) + data_in[6] = SubQBuf[5]; // F(rel) + data_in[7] = SubQBuf[7]; // M(abs) + data_in[8] = SubQBuf[8]; // S(abs) + data_in[9] = SubQBuf[9]; // F(abs) + + DoSimpleDataIn(data_in, alloc_size); +} + +static void DoTESTUNITREADY(const uint8 *cdb) +{ + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +static void DoNEC_PAUSE(const uint8 *cdb) +{ + if(cdda.CDDAStatus != CDDASTATUS_STOPPED) // Hmm, should we give an error if it tries to pause and it's already paused? + { + cdda.CDDAStatus = CDDASTATUS_PAUSED; + SendStatusAndMessage(STATUS_GOOD, 0x00); + } + else // Definitely give an error if it tries to pause when no track is playing! + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); + } +} + +static void DoNEC_SCAN(const uint8 *cdb) +{ + uint32 sector_tmp = 0; + + // 0: 0xD2 + // 1: 0x03 = reverse scan, 0x02 = forward scan + // 2: End M + // 3: End S + // 4: End F + + switch (cdb[9] & 0xc0) + { + default: + //SCSIDBG("Unknown NECSCAN format"); + break; + + case 0x00: + sector_tmp = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + break; + + case 0x40: + sector_tmp = AMSF_to_LBA(BCD_to_U8(cdb[2]), BCD_to_U8(cdb[3]), BCD_to_U8(cdb[4])); + break; + + case 0x80: // FIXME: error on invalid track number??? + sector_tmp = toc.tracks[BCD_to_U8(cdb[2])].lba; + break; + } + + cdda.ScanMode = cdb[1] & 0x3; + cdda.scan_sec_end = sector_tmp; + + if(cdda.CDDAStatus != CDDASTATUS_STOPPED) + { + if(cdda.ScanMode) + { + cdda.CDDAStatus = CDDASTATUS_SCANNING; + } + } + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* SCSI-2 CD Command 0x1E - PREVENT/ALLOW MEDIUM * +* REMOVAL * +********************************************************/ +static void DoPREVENTALLOWREMOVAL(const uint8 *cdb) +{ + //bool prevent = cdb[4] & 0x01; + //const int logical_unit = cdb[1] >> 5; + //SCSIDBG("PREVENT ALLOW MEDIUM REMOVAL: %d for %d\n", cdb[4] & 0x1, logical_unit); + //SendStatusAndMessage(STATUS_GOOD, 0x00); + + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_REQUEST_IN_CDB); +} + +// +// +// +#include "scsicd-pce-commands.inc" + + +#define SCF_REQUIRES_MEDIUM 0x0001 +#define SCF_INCOMPLETE 0x4000 +#define SCF_UNTESTED 0x8000 + +typedef struct +{ + uint8 cmd; + uint32 flags; + void (*func)(const uint8 *cdb); + const char *pretty_name; + const char *format_string; +} SCSICH; + +static const int32 RequiredCDBLen[16] = +{ + 6, // 0x0n + 6, // 0x1n + 10, // 0x2n + 10, // 0x3n + 10, // 0x4n + 10, // 0x5n + 10, // 0x6n + 10, // 0x7n + 10, // 0x8n + 10, // 0x9n + 12, // 0xAn + 12, // 0xBn + 10, // 0xCn + 10, // 0xDn + 10, // 0xEn + 10, // 0xFn +}; + +static SCSICH PCFXCommandDefs[] = +{ + { 0x00, SCF_REQUIRES_MEDIUM, DoTESTUNITREADY, "Test Unit Ready" }, + { 0x01, 0/* ? */, DoREZEROUNIT, "Rezero Unit" }, + { 0x03, 0, DoREQUESTSENSE, "Request Sense" }, + { 0x08, SCF_REQUIRES_MEDIUM, DoREAD6, "Read(6)" }, + { 0x0B, SCF_REQUIRES_MEDIUM, DoSEEK6, "Seek(6)" }, + { 0x0D, 0, DoNEC_NOP, "No Operation" }, + { 0x12, 0, DoINQUIRY, "Inquiry" }, + { 0x15, 0, DoMODESELECT6, "Mode Select(6)" }, + // TODO: { 0x16, 0 /* ? */, DoRESERVE, "Reserve" }, // 9.2.12 + // TODO: { 0x17, 0 /* ? */, DoRELEASE, "Release" }, // 9.2.11 + { 0x1A, 0, DoMODESENSE6, "Mode Sense(6)" }, + { 0x1B, SCF_REQUIRES_MEDIUM, DoSTARTSTOPUNIT6, "Start/Stop Unit" }, // 9.2.17 + // TODO: { 0x1D, , DoSENDDIAG, "Send Diagnostic" }, // 8.2.15 + { 0x1E, 0, DoPREVENTALLOWREMOVAL, "Prevent/Allow Media Removal" }, + + { 0x25, SCF_REQUIRES_MEDIUM, DoREADCDCAP10, "Read CD-ROM Capacity" }, // 14.2.8 + { 0x28, SCF_REQUIRES_MEDIUM, DoREAD10, "Read(10)" }, + { 0x2B, SCF_REQUIRES_MEDIUM, DoSEEK10, "Seek(10)" }, + + // TODO: { 0x2F, SCF_REQUIRES_MEDIUM, DoVERIFY10, "Verify(10)" }, // 16.2.11 + + { 0x34, SCF_REQUIRES_MEDIUM, DoPREFETCH, "Prefetch" }, + // TODO: { 0x3B, 0, 10, DoWRITEBUFFER, "Write Buffer" }, // 8.2.17 + // TODO: { 0x3C, 0, 10, DoREADBUFFER, "Read Buffer" }, // 8.2.12 + + { 0x42, SCF_REQUIRES_MEDIUM, DoREADSUBCHANNEL, "Read Subchannel" }, + { 0x43, SCF_REQUIRES_MEDIUM, DoREADTOC, "Read TOC" }, + { 0x44, SCF_REQUIRES_MEDIUM, DoREADHEADER10, "Read Header" }, + + { 0x45, SCF_REQUIRES_MEDIUM, DoPA10, "Play Audio(10)" }, + { 0x47, SCF_REQUIRES_MEDIUM, DoPAMSF, "Play Audio MSF" }, + { 0x48, SCF_REQUIRES_MEDIUM, DoPATI, "Play Audio Track Index" }, + { 0x49, SCF_REQUIRES_MEDIUM, DoPATR10, "Play Audio Track Relative(10)" }, + { 0x4B, SCF_REQUIRES_MEDIUM, DoPAUSERESUME, "Pause/Resume" }, + + { 0xA5, SCF_REQUIRES_MEDIUM, DoPA12, "Play Audio(12)" }, + { 0xA8, SCF_REQUIRES_MEDIUM, DoREAD12, "Read(12)" }, + { 0xA9, SCF_REQUIRES_MEDIUM, DoPATR12, "Play Audio Track Relative(12)" }, + + // TODO: { 0xAF, SCF_REQUIRES_MEDIUM, DoVERIFY12, "Verify(12)" }, // 16.2.12 + + { 0xD2, SCF_REQUIRES_MEDIUM, DoNEC_SCAN, "Scan" }, + { 0xD8, SCF_REQUIRES_MEDIUM, DoNEC_SAPSP, "Set Audio Playback Start Position" }, // "Audio track search" + { 0xD9, SCF_REQUIRES_MEDIUM, DoNEC_SAPEP, "Set Audio Playback End Position" }, // "Play" + { 0xDA, SCF_REQUIRES_MEDIUM, DoNEC_PAUSE, "Pause" }, // "Still" + { 0xDB, SCF_REQUIRES_MEDIUM | SCF_UNTESTED, DoNEC_SST, "Set Stop Time" }, + { 0xDC, SCF_REQUIRES_MEDIUM, DoNEC_EJECT, "Eject" }, + { 0xDD, SCF_REQUIRES_MEDIUM, DoNEC_READSUBQ, "Read Subchannel Q" }, + { 0xDE, SCF_REQUIRES_MEDIUM, DoNEC_GETDIRINFO, "Get Dir Info" }, + + { 0xFF, 0, 0, NULL, NULL }, +}; + +static SCSICH PCECommandDefs[] = +{ + { 0x00, SCF_REQUIRES_MEDIUM, DoTESTUNITREADY, "Test Unit Ready" }, + { 0x03, 0, DoREQUESTSENSE, "Request Sense" }, + { 0x08, SCF_REQUIRES_MEDIUM, DoREAD6, "Read(6)" }, + //{ 0x15, DoMODESELECT6, "Mode Select(6)" }, + { 0xD8, SCF_REQUIRES_MEDIUM, DoNEC_PCE_SAPSP, "Set Audio Playback Start Position" }, + { 0xD9, SCF_REQUIRES_MEDIUM, DoNEC_PCE_SAPEP, "Set Audio Playback End Position" }, + { 0xDA, SCF_REQUIRES_MEDIUM, DoNEC_PCE_PAUSE, "Pause" }, + { 0xDD, SCF_REQUIRES_MEDIUM, DoNEC_PCE_READSUBQ, "Read Subchannel Q" }, + { 0xDE, SCF_REQUIRES_MEDIUM, DoNEC_PCE_GETDIRINFO, "Get Dir Info" }, + + { 0xFF, 0, 0, NULL, NULL }, +}; + +void SCSICD_ResetTS(uint32 ts_base) +{ + lastts = ts_base; +} + +void SCSICD_GetCDDAValues(int16 &left, int16 &right) +{ + if(cdda.CDDAStatus) + { + left = cdda.sr[0]; + right = cdda.sr[1]; + } + else + left = right = 0; +} + +#define CDDA_FILTER_NUMCONVOLUTIONS 7 +#define CDDA_FILTER_NUMCONVOLUTIONS_PADDED 8 + +#define CDDA_FILTER_NUMPHASES_SHIFT 6 +#define CDDA_FILTER_NUMPHASES (1 << CDDA_FILTER_NUMPHASES_SHIFT) + +alignas(16) static const int16 CDDA_Filter[1 + CDDA_FILTER_NUMPHASES + 1][CDDA_FILTER_NUMCONVOLUTIONS_PADDED] = +{ + #include "scsicd_cdda_filter.inc" +}; + +alignas(16) static const int16 OversampleFilter[2][0x10] = +{ + { -82, 217, -463, 877, -1562, 2783, -5661, 29464, 9724, -3844, 2074, -1176, 645, -323, 138, -43, }, /* sum=32768, sum_abs=59076 */ + { -43, 138, -323, 645, -1176, 2074, -3844, 9724, 29464, -5661, 2783, -1562, 877, -463, 217, -82, }, /* sum=32768, sum_abs=59076 */ +}; + +static INLINE void RunCDDA(uint32 system_timestamp, int32 run_time) +{ + if(cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) + { + cdda.CDDADiv -= (int64)run_time << 20; + + while(cdda.CDDADiv <= 0) + { + const uint32 synthtime_ex = (((uint64)system_timestamp << 20) + (int64)cdda.CDDADiv) / cdda.CDDATimeDiv; + const int synthtime = (synthtime_ex >> 16) & 0xFFFF; // & 0xFFFF(or equivalent) to prevent overflowing HRBufs[] + const int synthtime_phase = (int)(synthtime_ex & 0xFFFF) - 0x80; + const int synthtime_phase_int = synthtime_phase >> (16 - CDDA_FILTER_NUMPHASES_SHIFT); + const int synthtime_phase_fract = synthtime_phase & ((1 << (16 - CDDA_FILTER_NUMPHASES_SHIFT)) - 1); + int32 sample_va[2]; + + cdda.CDDADiv += cdda.CDDADivAcc; + + if(!(cdda.OversamplePos & 1)) + { + if(cdda.CDDAReadPos == 588) + { + if(read_sec >= read_sec_end || (cdda.CDDAStatus == CDDASTATUS_SCANNING && read_sec == cdda.scan_sec_end)) + { + switch(cdda.PlayMode) + { + case PLAYMODE_SILENT: + case PLAYMODE_NORMAL: + cdda.CDDAStatus = CDDASTATUS_STOPPED; + break; + + case PLAYMODE_INTERRUPT: + cdda.CDDAStatus = CDDASTATUS_STOPPED; + CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); + break; + + case PLAYMODE_LOOP: + read_sec = read_sec_start; + break; + } + + // If CDDA playback is stopped, break out of our while(CDDADiv ...) loop and don't play any more sound! + if(cdda.CDDAStatus == CDDASTATUS_STOPPED) + break; + } + + // Don't play past the user area of the disc. + if(read_sec >= toc.tracks[100].lba) + { + cdda.CDDAStatus = CDDASTATUS_STOPPED; + break; + } + + if(TrayOpen || !Cur_CDIF) + { + cdda.CDDAStatus = CDDASTATUS_STOPPED; + + #if 0 + cd.data_transfer_done = FALSE; + cd.key_pending = SENSEKEY_NOT_READY; + cd.asc_pending = ASC_MEDIUM_NOT_PRESENT; + cd.ascq_pending = 0x00; + cd.fru_pending = 0x00; + SendStatusAndMessage(STATUS_CHECK_CONDITION, 0x00); + #endif + + break; + } + + + cdda.CDDAReadPos = 0; + + { + uint8 tmpbuf[2352 + 96]; + + Cur_CDIF->ReadRawSector(tmpbuf, read_sec); //, read_sec_end, read_sec_start); + + for(int i = 0; i < 588 * 2; i++) + cdda.CDDASectorBuffer[i] = MDFN_de16lsb(&tmpbuf[i * 2]); + + memcpy(cd.SubPWBuf, tmpbuf + 2352, 96); + } + GenSubQFromSubPW(); + + if(!(cd.SubQBuf_Last[0] & 0x10)) + { + // Not using de-emphasis, so clear the de-emphasis filter state. + memset(cdda.DeemphState, 0, sizeof(cdda.DeemphState)); + } + + if(cdda.CDDAStatus == CDDASTATUS_SCANNING) + { + int64 tmp_read_sec = read_sec; + + if(cdda.ScanMode & 1) + { + tmp_read_sec -= 24; + if(tmp_read_sec < cdda.scan_sec_end) + tmp_read_sec = cdda.scan_sec_end; + } + else + { + tmp_read_sec += 24; + if(tmp_read_sec > cdda.scan_sec_end) + tmp_read_sec = cdda.scan_sec_end; + } + read_sec = tmp_read_sec; + } + else + read_sec++; + } // End if(CDDAReadPos == 588) + + if(!(cdda.CDDAReadPos % 6)) + { + int subindex = cdda.CDDAReadPos / 6 - 2; + + if(subindex >= 0) + CDStuffSubchannels(cd.SubPWBuf[subindex], subindex); + else // The system-specific emulation code should handle what value the sync bytes are. + CDStuffSubchannels(0x00, subindex); + } + + // If the last valid sub-Q data decoded indicate that the corresponding sector is a data sector, don't output the + // current sector as audio. + if(!(cd.SubQBuf_Last[0] & 0x40) && cdda.PlayMode != PLAYMODE_SILENT) + { + cdda.sr[0] = cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + cdda.OutPortChSelectCache[0]]; + cdda.sr[1] = cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + cdda.OutPortChSelectCache[1]]; + } + +#if 0 + { + static int16 wv = 0x7FFF; //0x5000; + static unsigned counter = 0; + static double phase = 0; + static double phase_inc = 0; + static const double phase_inc_inc = 0.000003 / 2; + + cdda.sr[0] = 32767 * sin(phase); + cdda.sr[1] = 32767 * sin(phase); + + //cdda.sr[0] = wv; + //cdda.sr[1] = wv; + + if(counter == 0) + wv = -wv; + counter = (counter + 1) & 1; + phase += phase_inc; + phase_inc += phase_inc_inc; + } +#endif + + { + const unsigned obwp = cdda.OversamplePos >> 1; + cdda.OversampleBuffer[0][obwp] = cdda.OversampleBuffer[0][0x10 + obwp] = cdda.sr[0]; + cdda.OversampleBuffer[1][obwp] = cdda.OversampleBuffer[1][0x10 + obwp] = cdda.sr[1]; + } + + cdda.CDDAReadPos++; + } // End if(!(cdda.OversamplePos & 1)) + + { + const int16* f = OversampleFilter[cdda.OversamplePos & 1]; +#if defined(__SSE2__) + __m128i f0 = _mm_load_si128((__m128i *)&f[0]); + __m128i f1 = _mm_load_si128((__m128i *)&f[8]); +#endif + + for(unsigned lr = 0; lr < 2; lr++) + { + const int16* b = &cdda.OversampleBuffer[lr][((cdda.OversamplePos >> 1) + 1) & 0xF]; +#if defined(__SSE2__) + union + { + int32 accum; + float accum_f; + //__m128i accum_m128; + }; + + { + __m128i b0; + __m128i b1; + __m128i sum; + + b0 = _mm_loadu_si128((__m128i *)&b[0]); + b1 = _mm_loadu_si128((__m128i *)&b[8]); + + sum = _mm_add_epi32(_mm_madd_epi16(f0, b0), _mm_madd_epi16(f1, b1)); + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, (3 << 0) | (2 << 2) | (1 << 4) | (0 << 6))); + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, (1 << 0) | (0 << 2) | (3 << 4) | (2 << 6))); + _mm_store_ss(&accum_f, (__m128)sum); + //_mm_store_si128(&accum_m128, sum); + } +#else + int32 accum = 0; + + for(unsigned i = 0; i < 0x10; i++) + accum += f[i] * b[i]; +#endif + // sum_abs * cdda_min = + // 59076 * -32768 = -1935802368 + // OPVC can have a maximum value of 65536. + // -1935802368 * 65536 = -126864743989248 + // + // -126864743989248 / 65536 = -1935802368 + sample_va[lr] = ((int64)accum * cdda.OutPortVolumeCache[lr]) >> 16; + // Output of this stage will be (approximate max ranges) -2147450880 through 2147385345. + } + } + + // + // This de-emphasis filter's frequency response isn't totally correct, but it's much better than nothing(and it's not like any known PCE CD/TG16 CD/PC-FX games + // utilize pre-emphasis anyway). + // + if(MDFN_UNLIKELY(cd.SubQBuf_Last[0] & 0x10)) + { + //puts("Deemph"); + for(unsigned lr = 0; lr < 2; lr++) + { + float inv = sample_va[lr] * 0.35971507338824012f; + + cdda.DeemphState[lr][1] = (cdda.DeemphState[lr][0] - 0.4316395666f * inv) + (0.7955522347f * cdda.DeemphState[lr][1]); + cdda.DeemphState[lr][0] = inv; + + sample_va[lr] = std::max(-2147483648.0, std::min(2147483647.0, cdda.DeemphState[lr][1])); + //printf("%u: %f, %d\n", lr, cdda.DeemphState[lr][1], sample_va[lr]); + } + } + + + if(HRBufs[0] && HRBufs[1]) + { + // + // FINAL_OUT_SHIFT should be 32 so we can take advantage of 32x32->64 multipliers on 32-bit CPUs. + // + #define FINAL_OUT_SHIFT 32 + #define MULT_SHIFT_ADJ (32 - (26 + (8 - CDDA_FILTER_NUMPHASES_SHIFT))) + + #if (((1 << (16 - CDDA_FILTER_NUMPHASES_SHIFT)) - 0) << MULT_SHIFT_ADJ) > 32767 + #error "COEFF MULT OVERFLOW" + #endif + + const int16 mult_a = ((1 << (16 - CDDA_FILTER_NUMPHASES_SHIFT)) - synthtime_phase_fract) << MULT_SHIFT_ADJ; + const int16 mult_b = synthtime_phase_fract << MULT_SHIFT_ADJ; + int32 coeff[CDDA_FILTER_NUMCONVOLUTIONS]; + + //if(synthtime_phase_fract == 0) + // printf("%5d: %d %d\n", synthtime_phase_fract, mult_a, mult_b); + + for(unsigned c = 0; c < CDDA_FILTER_NUMCONVOLUTIONS; c++) + { + coeff[c] = (CDDA_Filter[1 + synthtime_phase_int + 0][c] * mult_a + + CDDA_Filter[1 + synthtime_phase_int + 1][c] * mult_b); + } + + int32* tb0 = &HRBufs[0][synthtime]; + int32* tb1 = &HRBufs[1][synthtime]; + + for(unsigned c = 0; c < CDDA_FILTER_NUMCONVOLUTIONS; c++) + { + tb0[c] += ((int64)coeff[c] * sample_va[0]) >> FINAL_OUT_SHIFT; + tb1[c] += ((int64)coeff[c] * sample_va[1]) >> FINAL_OUT_SHIFT; + } + #undef FINAL_OUT_SHIFT + #undef MULT_SHIFT_ADJ + } + + cdda.OversamplePos = (cdda.OversamplePos + 1) & 0x1F; + } // end while(cdda.CDDADiv <= 0) + } +} + +static INLINE void RunCDRead(uint32 system_timestamp, int32 run_time) +{ + if(CDReadTimer > 0) + { + CDReadTimer -= run_time; + + if(CDReadTimer <= 0) + { + if(din->CanWrite() < ((WhichSystem == SCSICD_PCFX) ? 2352 : 2048)) // +96 if we find out the PC-FX can read subchannel data along with raw data too. ;) + { + //printf("Carp: %d %d %d\n", din->CanWrite(), SectorCount, CDReadTimer); + //CDReadTimer = (cd.data_in_size - cd.data_in_pos) * 10; + + CDReadTimer += (uint64) 1 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; + + //CDReadTimer += (uint64) 1 * 128 * System_Clock / CD_DATA_TRANSFER_RATE; + } + else + { + uint8 tmp_read_buf[2352 + 96]; + + if(TrayOpen) + { + din->Flush(); + cd.data_transfer_done = FALSE; + + CommandCCError(SENSEKEY_NOT_READY, NSE_TRAY_OPEN); + } + else if(!Cur_CDIF) + { + CommandCCError(SENSEKEY_NOT_READY, NSE_NO_DISC); + } + else if(SectorAddr >= toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + } + else if(!Cur_CDIF->ReadRawSector(tmp_read_buf, SectorAddr)) //, SectorAddr + SectorCount)) + { + cd.data_transfer_done = FALSE; + + CommandCCError(SENSEKEY_ILLEGAL_REQUEST); + } + else if(ValidateRawDataSector(tmp_read_buf, SectorAddr)) + { + memcpy(cd.SubPWBuf, tmp_read_buf + 2352, 96); + + if(tmp_read_buf[12 + 3] == 0x2) + din->Write(tmp_read_buf + 24, 2048); + else + din->Write(tmp_read_buf + 16, 2048); + + GenSubQFromSubPW(); + + CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_READY); + + SectorAddr++; + SectorCount--; + + if(CurrentPhase != PHASE_DATA_IN) + ChangePhase(PHASE_DATA_IN); + + if(SectorCount) + { + cd.data_transfer_done = FALSE; + CDReadTimer += (uint64) 1 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; + } + else + { + cd.data_transfer_done = TRUE; + } + } + } // end else to if(!Cur_CDIF->ReadSector + + } + } +} + + +uint32 SCSICD_Run(scsicd_timestamp_t system_timestamp) +{ + int32 run_time = system_timestamp - lastts; + + if(system_timestamp < lastts) + { + fprintf(stderr, "Meow: %d %d\n", system_timestamp, lastts); + assert(system_timestamp >= lastts); + } + + monotonic_timestamp += run_time; + + lastts = system_timestamp; + + RunCDRead(system_timestamp, run_time); + RunCDDA(system_timestamp, run_time); + + bool ResetNeeded = false; + + if(RST_signal && !cd.last_RST_signal) + ResetNeeded = true; + + cd.last_RST_signal = RST_signal; + + if(ResetNeeded) + { + //puts("RST"); + VirtualReset(); + } + else if(CurrentPhase == PHASE_BUS_FREE) + { + if(SEL_signal) + { + if(WhichSystem == SCSICD_PCFX) + { + //if(cd_bus.DB == 0x84) + { + ChangePhase(PHASE_COMMAND); + } + } + else // PCE + { + ChangePhase(PHASE_COMMAND); + } + } + } + else if(ATN_signal && !REQ_signal && !ACK_signal) + { + //printf("Yay: %d %d\n", REQ_signal, ACK_signal); + ChangePhase(PHASE_MESSAGE_OUT); + } + else switch(CurrentPhase) + { + case PHASE_COMMAND: + if(REQ_signal && ACK_signal) // Data bus is valid nowww + { + //printf("Command Phase Byte I->T: %02x, %d\n", cd_bus.DB, cd.command_buffer_pos); + cd.command_buffer[cd.command_buffer_pos++] = cd_bus.DB; + SetREQ(FALSE); + } + + if(!REQ_signal && !ACK_signal && cd.command_buffer_pos) // Received at least one byte, what should we do? + { + if(cd.command_buffer_pos == RequiredCDBLen[cd.command_buffer[0] >> 4]) + { + const SCSICH *cmd_info_ptr; + + if(WhichSystem == SCSICD_PCFX) + cmd_info_ptr = PCFXCommandDefs; + else + cmd_info_ptr = PCECommandDefs; + + while(cmd_info_ptr->pretty_name && cmd_info_ptr->cmd != cd.command_buffer[0]) + cmd_info_ptr++; + + if(SCSILog) + { + char log_buffer[1024]; + int lb_pos; + + log_buffer[0] = 0; + + lb_pos = trio_snprintf(log_buffer, 1024, "Command: %02x, %s%s ", cd.command_buffer[0], cmd_info_ptr->pretty_name ? cmd_info_ptr->pretty_name : "!!BAD COMMAND!!", + (cmd_info_ptr->flags & SCF_UNTESTED) ? "(UNTESTED)" : ""); + + for(int i = 0; i < RequiredCDBLen[cd.command_buffer[0] >> 4]; i++) + lb_pos += trio_snprintf(log_buffer + lb_pos, 1024 - lb_pos, "%02x ", cd.command_buffer[i]); + + SCSILog("SCSI", "%s", log_buffer); + //puts(log_buffer); + } + + + if(cmd_info_ptr->pretty_name == NULL) // Command not found! + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_COMMAND); + + //SCSIDBG("Bad Command: %02x\n", cd.command_buffer[0]); + + if(SCSILog) + SCSILog("SCSI", "Bad Command: %02x", cd.command_buffer[0]); + + cd.command_buffer_pos = 0; + } + else + { + if(cmd_info_ptr->flags & SCF_UNTESTED) + { + //SCSIDBG("Untested SCSI command: %02x, %s", cd.command_buffer[0], cmd_info_ptr->pretty_name); + } + + if(TrayOpen && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) + { + CommandCCError(SENSEKEY_NOT_READY, NSE_TRAY_OPEN); + } + else if(!Cur_CDIF && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) + { + CommandCCError(SENSEKEY_NOT_READY, NSE_NO_DISC); + } + else if(cd.DiscChanged && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) + { + CommandCCError(SENSEKEY_UNIT_ATTENTION, NSE_DISC_CHANGED); + cd.DiscChanged = false; + } + else + { + bool prev_ps = (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING); + + cmd_info_ptr->func(cd.command_buffer); + + bool new_ps = (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING); + + // A bit kludgey, but ehhhh. + if(!prev_ps && new_ps) + { + memset(cdda.sr, 0, sizeof(cdda.sr)); + memset(cdda.OversampleBuffer, 0, sizeof(cdda.OversampleBuffer)); + memset(cdda.DeemphState, 0, sizeof(cdda.DeemphState)); + //printf("CLEAR BUFFERS LALALA\n"); + } + } + + cd.command_buffer_pos = 0; + } + } // end if(cd.command_buffer_pos == RequiredCDBLen[cd.command_buffer[0] >> 4]) + else // Otherwise, get more data for the command! + SetREQ(TRUE); + } + break; + + case PHASE_DATA_OUT: + if(REQ_signal && ACK_signal) // Data bus is valid nowww + { + //printf("DATAOUT-SCSIIN: %d %02x\n", cd.data_out_pos, cd_bus.DB); + cd.data_out[cd.data_out_pos++] = cd_bus.DB; + SetREQ(FALSE); + } + else if(!REQ_signal && !ACK_signal && cd.data_out_pos) + { + if(cd.data_out_pos == cd.data_out_want) + { + cd.data_out_pos = 0; + + if(cd.command_buffer[0] == 0x15) + FinishMODESELECT6(cd.data_out, cd.data_out_want); + else // Error out here? It shouldn't be reached: + SendStatusAndMessage(STATUS_GOOD, 0x00); + } + else + SetREQ(TRUE); + } + break; + + + case PHASE_MESSAGE_OUT: + //printf("%d %d, %02x\n", REQ_signal, ACK_signal, cd_bus.DB); + if(REQ_signal && ACK_signal) + { + SetREQ(FALSE); + + // ABORT message is 0x06, but the code isn't set up to be able to recover from a MESSAGE OUT phase back to the previous phase, so we treat any message as an ABORT. + // Real tests are needed on the PC-FX to determine its behavior. + // (Previously, ATN emulation was a bit broken, which resulted in the wrong data on the data bus in this code path in at least "Battle Heat", but it's fixed now and 0x06 is on the data bus). + //if(cd_bus.DB == 0x6) // ABORT message! + if(1) + { + //printf("[SCSICD] Abort Received(DB=0x%02x)\n", cd_bus.DB); + din->Flush(); + cd.data_out_pos = cd.data_out_want = 0; + + CDReadTimer = 0; + cdda.CDDAStatus = CDDASTATUS_STOPPED; + ChangePhase(PHASE_BUS_FREE); + } + //else + // printf("[SCSICD] Message to target: 0x%02x\n", cd_bus.DB); + } + break; + + + case PHASE_STATUS: + if(REQ_signal && ACK_signal) + { + SetREQ(FALSE); + cd.status_sent = TRUE; + } + + if(!REQ_signal && !ACK_signal && cd.status_sent) + { + // Status sent, so get ready to send the message! + cd.status_sent = FALSE; + cd_bus.DB = cd.message_pending; + + ChangePhase(PHASE_MESSAGE_IN); + } + break; + + case PHASE_DATA_IN: + if(!REQ_signal && !ACK_signal) + { + //puts("REQ and ACK false"); + if(din->CanRead() == 0) // aaand we're done! + { + CDIRQCallback(0x8000 | SCSICD_IRQ_DATA_TRANSFER_READY); + + if(cd.data_transfer_done) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + cd.data_transfer_done = FALSE; + CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); + } + } + else + { + cd_bus.DB = din->ReadByte(); + SetREQ(TRUE); + } + } + if(REQ_signal && ACK_signal) + { + //puts("REQ and ACK true"); + SetREQ(FALSE); + } + break; + + case PHASE_MESSAGE_IN: + if(REQ_signal && ACK_signal) + { + SetREQ(FALSE); + cd.message_sent = TRUE; + } + + if(!REQ_signal && !ACK_signal && cd.message_sent) + { + cd.message_sent = FALSE; + ChangePhase(PHASE_BUS_FREE); + } + break; + } + + int32 next_time = 0x7fffffff; + + if(CDReadTimer > 0 && CDReadTimer < next_time) + next_time = CDReadTimer; + + if(cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) + { + int32 cdda_div_sexytime = (cdda.CDDADiv + (cdda.CDDADivAcc * (cdda.OversamplePos & 1)) + ((1 << 20) - 1)) >> 20; + if(cdda_div_sexytime > 0 && cdda_div_sexytime < next_time) + next_time = cdda_div_sexytime; + } + + assert(next_time >= 0); + + return(next_time); +} + +void SCSICD_SetLog(void (*logfunc)(const char *, const char *, ...)) +{ + SCSILog = logfunc; +} + +void SCSICD_SetTransferRate(uint32 TransferRate) +{ + CD_DATA_TRANSFER_RATE = TransferRate; +} + +void SCSICD_Close(void) +{ + if(din) + { + delete din; + din = NULL; + } +} + +void SCSICD_Init(int type, int cdda_time_div, int32* left_hrbuf, int32* right_hrbuf, uint32 TransferRate, uint32 SystemClock, void (*IRQFunc)(int), void (*SSCFunc)(uint8, int)) +{ + Cur_CDIF = NULL; + TrayOpen = true; + + assert(SystemClock < 30000000); // 30 million, sanity check. + + monotonic_timestamp = 0; + lastts = 0; + + SCSILog = NULL; + + if(type == SCSICD_PCFX) + din = new SimpleFIFO(65536); //4096); + else + din = new SimpleFIFO(2048); //8192); //1024); /2048); + + WhichSystem = type; + + cdda.CDDADivAcc = (int64)System_Clock * (1024 * 1024) / 88200; + cdda.CDDADivAccVolFudge = 100; + cdda.CDDATimeDiv = cdda_time_div * (1 << (4 + 2)); + + cdda.CDDAVolume[0] = 65536; + cdda.CDDAVolume[1] = 65536; + + FixOPV(); + + HRBufs[0] = left_hrbuf; + HRBufs[1] = right_hrbuf; + + CD_DATA_TRANSFER_RATE = TransferRate; + System_Clock = SystemClock; + CDIRQCallback = IRQFunc; + CDStuffSubchannels = SSCFunc; +} + +void SCSICD_SetCDDAVolume(double left, double right) +{ + cdda.CDDAVolume[0] = 65536 * left; + cdda.CDDAVolume[1] = 65536 * right; + + for(int i = 0; i < 2; i++) + { + if(cdda.CDDAVolume[i] > 65536) + { + printf("[SCSICD] Debug Warning: CD-DA volume %d too large: %d\n", i, cdda.CDDAVolume[i]); + cdda.CDDAVolume[i] = 65536; + } + } + + FixOPV(); +} + +void SCSICD_StateAction(StateMem* sm, const unsigned load, const bool data_only, const char *sname) +{ + SFORMAT StateRegs[] = + { + SFVARN(cd_bus.DB, "DB"), + SFVARN(cd_bus.signals, "Signals"), + SFVAR(CurrentPhase), + + SFVARN(cd.last_RST_signal, "last_RST"), + SFVARN(cd.message_pending, "message_pending"), + SFVARN(cd.status_sent, "status_sent"), + SFVARN(cd.message_sent, "message_sent"), + SFVARN(cd.key_pending, "key_pending"), + SFVARN(cd.asc_pending, "asc_pending"), + SFVARN(cd.ascq_pending, "ascq_pending"), + SFVARN(cd.fru_pending, "fru_pending"), + + SFARRAYN(cd.command_buffer, 256, "command_buffer"), + SFVARN(cd.command_buffer_pos, "command_buffer_pos"), + SFVARN(cd.command_size_left, "command_size_left"), + + // Don't save the FIFO's write position, it will be reconstructed from read_pos and in_count + SFARRAYN(&din->data[0], din->data.size(), "din_fifo"), + SFVARN(din->read_pos, "din_read_pos"), + SFVARN(din->in_count, "din_in_count"), + SFVARN(cd.data_transfer_done, "data_transfer_done"), + + SFARRAYN(cd.data_out, sizeof(cd.data_out), "data_out"), + SFVARN(cd.data_out_pos, "data_out_pos"), + SFVARN(cd.data_out_want, "data_out_want"), + + SFVARN(cd.DiscChanged, "DiscChanged"), + + SFVAR(cdda.PlayMode), + SFARRAY16(cdda.CDDASectorBuffer, 1176), + SFVAR(cdda.CDDAReadPos), + SFVAR(cdda.CDDAStatus), + SFVAR(cdda.CDDADiv), + SFVAR(read_sec_start), + SFVAR(read_sec), + SFVAR(read_sec_end), + + SFVAR(CDReadTimer), + SFVAR(SectorAddr), + SFVAR(SectorCount), + + SFVAR(cdda.ScanMode), + SFVAR(cdda.scan_sec_end), + + SFVAR(cdda.OversamplePos), + SFARRAY16(&cdda.sr[0], sizeof(cdda.sr) / sizeof(cdda.sr[0])), + SFARRAY16(&cdda.OversampleBuffer[0][0], sizeof(cdda.OversampleBuffer) / sizeof(cdda.OversampleBuffer[0][0])), + + SFVAR(cdda.DeemphState[0][0]), + SFVAR(cdda.DeemphState[0][1]), + SFVAR(cdda.DeemphState[1][0]), + SFVAR(cdda.DeemphState[1][1]), + + SFARRAYN(&cd.SubQBuf[0][0], sizeof(cd.SubQBuf), "SubQBufs"), + SFARRAYN(cd.SubQBuf_Last, sizeof(cd.SubQBuf_Last), "SubQBufLast"), + SFARRAYN(cd.SubPWBuf, sizeof(cd.SubPWBuf), "SubPWBuf"), + + SFVAR(monotonic_timestamp), + SFVAR(pce_lastsapsp_timestamp), + + // + // + // + SFARRAY(ModePages[0].current_value, ModePages[0].param_length), + SFARRAY(ModePages[1].current_value, ModePages[1].param_length), + SFARRAY(ModePages[2].current_value, ModePages[2].param_length), + SFARRAY(ModePages[3].current_value, ModePages[3].param_length), + SFARRAY(ModePages[4].current_value, ModePages[4].param_length), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, sname); + + if(load) + { + din->in_count &= din->size - 1; + din->read_pos &= din->size - 1; + din->write_pos = (din->read_pos + din->in_count) & (din->size - 1); + //printf("%d %d %d\n", din->in_count, din->read_pos, din->write_pos); + + if(load < 0x0935) + cdda.CDDADiv /= 2; + + if(cdda.CDDADiv <= 0) + cdda.CDDADiv = 1; + + cdda.OversamplePos &= 0x1F; + + for(int i = 0; i < NumModePages; i++) + UpdateMPCacheP(&ModePages[i]); + } +} diff --git a/Mednafen/mednafen/cdrom/scsicd.h b/Mednafen/mednafen/cdrom/scsicd.h new file mode 100644 index 0000000000..8fc7496bd3 --- /dev/null +++ b/Mednafen/mednafen/cdrom/scsicd.h @@ -0,0 +1,99 @@ +#ifndef __PCFX_SCSICD_H +#define __PCFX_SCSICD_H + +typedef int32 scsicd_timestamp_t; + +typedef struct +{ + // Data bus(FIXME: we should have a variable for the target and the initiator, and OR them together to be truly accurate). + uint8 DB; + + uint32 signals; + + // Signals under our(the "target") control. + //bool BSY, MSG, CD, REQ, IO; + + // Signals under the control of the initiator(not us!) + //bool kingACK, kingRST, kingSEL, kingATN; +} scsicd_bus_t; + +extern scsicd_bus_t cd_bus; // Don't access this structure directly by name outside of scsicd.c, but use the macros below. + +// Signals under our(the "target") control. +#define SCSICD_IO_mask 0x001 +#define SCSICD_CD_mask 0x002 +#define SCSICD_MSG_mask 0x004 +#define SCSICD_REQ_mask 0x008 +#define SCSICD_BSY_mask 0x010 + +// Signals under the control of the initiator(not us!) +#define SCSICD_kingRST_mask 0x020 +#define SCSICD_kingACK_mask 0x040 +#define SCSICD_kingATN_mask 0x080 +#define SCSICD_kingSEL_mask 0x100 + +#define BSY_signal ((const bool)(cd_bus.signals & SCSICD_BSY_mask)) +#define ACK_signal ((const bool)(cd_bus.signals & SCSICD_kingACK_mask)) +#define RST_signal ((const bool)(cd_bus.signals & SCSICD_kingRST_mask)) +#define MSG_signal ((const bool)(cd_bus.signals & SCSICD_MSG_mask)) +#define SEL_signal ((const bool)(cd_bus.signals & SCSICD_kingSEL_mask)) +#define REQ_signal ((const bool)(cd_bus.signals & SCSICD_REQ_mask)) +#define IO_signal ((const bool)(cd_bus.signals & SCSICD_IO_mask)) +#define CD_signal ((const bool)(cd_bus.signals & SCSICD_CD_mask)) +#define ATN_signal ((const bool)(cd_bus.signals & SCSICD_kingATN_mask)) + +#define DB_signal ((const uint8)cd_bus.DB) + +#define SCSICD_GetDB() DB_signal +#define SCSICD_GetBSY() BSY_signal +#define SCSICD_GetIO() IO_signal +#define SCSICD_GetCD() CD_signal +#define SCSICD_GetMSG() MSG_signal +#define SCSICD_GetREQ() REQ_signal + +// Should we phase out getting these initiator-driven signals like this(the initiator really should keep track of them itself)? +#define SCSICD_GetACK() ACK_signal +#define SCSICD_GetRST() RST_signal +#define SCSICD_GetSEL() SEL_signal +#define SCSICD_GetATN() ATN_signal + +void SCSICD_Power(scsicd_timestamp_t system_timestamp); +void SCSICD_SetDB(uint8 data); + +// These SCSICD_Set* functions are kind of misnomers, at least in comparison to the SCSICD_Get* functions... +// They will set/clear the bits corresponding to the KING's side of the bus. +void SCSICD_SetACK(bool set); +void SCSICD_SetSEL(bool set); +void SCSICD_SetRST(bool set); +void SCSICD_SetATN(bool set); + +uint32 SCSICD_Run(scsicd_timestamp_t); +void SCSICD_ResetTS(uint32 ts_base); + +enum +{ + SCSICD_PCE = 1, + SCSICD_PCFX +}; + +enum +{ + SCSICD_IRQ_DATA_TRANSFER_DONE = 1, + SCSICD_IRQ_DATA_TRANSFER_READY, + SCSICD_IRQ_MAGICAL_REQ, +}; + +void SCSICD_GetCDDAValues(int16 &left, int16 &right); + +void SCSICD_SetLog(void (*logfunc)(const char *, const char *, ...)); + +void SCSICD_Init(int type, int CDDATimeDiv, int32* left_hrbuf, int32* right_hrbuf, uint32 TransferRate, uint32 SystemClock, void (*IRQFunc)(int), void (*SSCFunc)(uint8, int)); +void SCSICD_Close(void); + +void SCSICD_SetTransferRate(uint32 TransferRate); +void SCSICD_SetCDDAVolume(double left, double right); +void SCSICD_StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *sname); + +void SCSICD_SetDisc(bool tray_open, CDIF *cdif, bool no_emu_side_effects = false); + +#endif diff --git a/Mednafen/mednafen/cdrom/scsicd_cdda_filter.inc b/Mednafen/mednafen/cdrom/scsicd_cdda_filter.inc new file mode 100644 index 0000000000..bef57166d3 --- /dev/null +++ b/Mednafen/mednafen/cdrom/scsicd_cdda_filter.inc @@ -0,0 +1,69 @@ +// WARNING: Check resampling algorithm in scsicd.cpp for overflows if any value in here is negative. + + /* -1 */ { 1777, 12211, 27812, 27640, 11965, 1703, 9, 0 }, // 83117 83119.332059(diff = 2.332059) + /* 0 */ { 1702, 11965, 27640, 27811, 12211, 1777, 11, 0 }, // 83117 83121.547903(diff = 4.547903) + /* 1 */ { 1630, 11720, 27463, 27977, 12459, 1854, 14, 0 }, // 83117 83123.444392(diff = 6.444392) + /* 2 */ { 1560, 11478, 27282, 28139, 12708, 1933, 17, 0 }, // 83117 83125.036510(diff = 8.036510) + /* 3 */ { 1492, 11238, 27098, 28296, 12959, 2014, 20, 0 }, // 83117 83126.338722(diff = 9.338722) + /* 4 */ { 1427, 11000, 26909, 28448, 13212, 2098, 23, 0 }, // 83117 83127.364983(diff = 10.364983) + /* 5 */ { 1363, 10764, 26716, 28595, 13467, 2185, 27, 0 }, // 83117 83128.128743(diff = 11.128743) + /* 6 */ { 1302, 10530, 26519, 28738, 13723, 2274, 31, 0 }, // 83117 83128.642956(diff = 11.642956) + /* 7 */ { 1242, 10299, 26319, 28876, 13981, 2365, 35, 0 }, // 83117 83128.920096(diff = 11.920096) + /* 8 */ { 1185, 10071, 26115, 29009, 14239, 2459, 39, 0 }, // 83117 83128.972128(diff = 11.972128) + /* 9 */ { 1129, 9844, 25907, 29137, 14499, 2556, 45, 0 }, // 83117 83128.810568(diff = 11.810568) + /* 10 */ { 1076, 9620, 25695, 29260, 14761, 2655, 50, 0 }, // 83117 83128.446456(diff = 11.446456) + /* 11 */ { 1024, 9399, 25481, 29377, 15023, 2757, 56, 0 }, // 83117 83127.890369(diff = 10.890369) + /* 12 */ { 975, 9180, 25263, 29489, 15287, 2861, 62, 0 }, // 83117 83127.152431(diff = 10.152431) + /* 13 */ { 927, 8964, 25041, 29596, 15552, 2968, 69, 0 }, // 83117 83126.242312(diff = 9.242312) + /* 14 */ { 880, 8750, 24817, 29698, 15818, 3078, 76, 0 }, // 83117 83125.169251(diff = 8.169251) + /* 15 */ { 836, 8539, 24590, 29794, 16083, 3191, 84, 0 }, // 83117 83123.942037(diff = 6.942037) + /* 16 */ { 793, 8331, 24359, 29884, 16350, 3307, 93, 0 }, // 83117 83122.569034(diff = 5.569034) + /* 17 */ { 752, 8125, 24126, 29969, 16618, 3425, 102, 0 }, // 83117 83121.058175(diff = 4.058175) + /* 18 */ { 712, 7923, 23890, 30049, 16886, 3546, 111, 0 }, // 83117 83119.416975(diff = 2.416975) + /* 19 */ { 674, 7723, 23651, 30123, 17154, 3670, 122, 0 }, // 83117 83117.652622(diff = 0.652622) + /* 20 */ { 638, 7526, 23410, 30191, 17422, 3797, 133, 0 }, // 83117 83115.771622(diff = 1.228378) + /* 21 */ { 603, 7331, 23167, 30254, 17691, 3927, 144, 0 }, // 83117 83113.780335(diff = 3.219665) + /* 22 */ { 569, 7140, 22922, 30310, 17960, 4059, 157, 0 }, // 83117 83111.684630(diff = 5.315370) + /* 23 */ { 537, 6951, 22674, 30361, 18229, 4195, 170, 0 }, // 83117 83109.489972(diff = 7.510028) + /* 24 */ { 506, 6766, 22424, 30407, 18497, 4334, 183, 0 }, // 83117 83107.201429(diff = 9.798571) + /* 25 */ { 477, 6583, 22172, 30446, 18766, 4475, 198, 0 }, // 83117 83104.823668(diff = 12.176332) + /* 26 */ { 449, 6403, 21919, 30479, 19034, 4619, 214, 0 }, // 83117 83102.360963(diff = 14.639037) + /* 27 */ { 422, 6226, 21664, 30507, 19301, 4767, 230, 0 }, // 83117 83099.817193(diff = 17.182807) + /* 28 */ { 396, 6053, 21407, 30529, 19568, 4917, 247, 0 }, // 83117 83097.195820(diff = 19.804180) + /* 29 */ { 372, 5882, 21148, 30545, 19834, 5071, 265, 0 }, // 83117 83094.499993(diff = 22.500007) + /* 30 */ { 348, 5714, 20888, 30555, 20100, 5227, 285, 0 }, // 83117 83091.732389(diff = 25.267611) + /* 31 */ { 326, 5549, 20627, 30559, 20365, 5386, 305, 0 }, // 83117 83088.895321(diff = 28.104679) + /* 32 */ { 305, 5386, 20365, 30559, 20627, 5549, 326, 0 }, // 83117 83088.895321(diff = 28.104679) + /* 33 */ { 285, 5227, 20100, 30555, 20888, 5714, 348, 0 }, // 83117 83091.732389(diff = 25.267611) + /* 34 */ { 265, 5071, 19834, 30545, 21148, 5882, 372, 0 }, // 83117 83094.499993(diff = 22.500007) + /* 35 */ { 247, 4917, 19568, 30529, 21407, 6053, 396, 0 }, // 83117 83097.195820(diff = 19.804180) + /* 36 */ { 230, 4767, 19301, 30507, 21664, 6226, 422, 0 }, // 83117 83099.817193(diff = 17.182807) + /* 37 */ { 214, 4619, 19034, 30479, 21919, 6403, 449, 0 }, // 83117 83102.360963(diff = 14.639037) + /* 38 */ { 198, 4475, 18766, 30446, 22172, 6583, 477, 0 }, // 83117 83104.823668(diff = 12.176332) + /* 39 */ { 183, 4334, 18497, 30407, 22424, 6766, 506, 0 }, // 83117 83107.201429(diff = 9.798571) + /* 40 */ { 170, 4195, 18229, 30361, 22674, 6951, 537, 0 }, // 83117 83109.489972(diff = 7.510028) + /* 41 */ { 157, 4059, 17960, 30310, 22922, 7140, 569, 0 }, // 83117 83111.684630(diff = 5.315370) + /* 42 */ { 144, 3927, 17691, 30254, 23167, 7331, 603, 0 }, // 83117 83113.780335(diff = 3.219665) + /* 43 */ { 133, 3797, 17422, 30191, 23410, 7526, 638, 0 }, // 83117 83115.771622(diff = 1.228378) + /* 44 */ { 122, 3670, 17154, 30123, 23651, 7723, 674, 0 }, // 83117 83117.652622(diff = 0.652622) + /* 45 */ { 111, 3546, 16886, 30049, 23890, 7923, 712, 0 }, // 83117 83119.416975(diff = 2.416975) + /* 46 */ { 102, 3425, 16618, 29969, 24126, 8125, 752, 0 }, // 83117 83121.058175(diff = 4.058175) + /* 47 */ { 93, 3307, 16350, 29884, 24359, 8331, 793, 0 }, // 83117 83122.569034(diff = 5.569034) + /* 48 */ { 84, 3191, 16083, 29794, 24590, 8539, 836, 0 }, // 83117 83123.942037(diff = 6.942037) + /* 49 */ { 76, 3078, 15818, 29698, 24817, 8750, 880, 0 }, // 83117 83125.169251(diff = 8.169251) + /* 50 */ { 69, 2968, 15552, 29596, 25041, 8964, 927, 0 }, // 83117 83126.242312(diff = 9.242312) + /* 51 */ { 62, 2861, 15287, 29489, 25263, 9180, 975, 0 }, // 83117 83127.152431(diff = 10.152431) + /* 52 */ { 56, 2757, 15023, 29377, 25481, 9399, 1024, 0 }, // 83117 83127.890369(diff = 10.890369) + /* 53 */ { 50, 2655, 14761, 29260, 25695, 9620, 1076, 0 }, // 83117 83128.446456(diff = 11.446456) + /* 54 */ { 45, 2556, 14499, 29137, 25907, 9844, 1129, 0 }, // 83117 83128.810568(diff = 11.810568) + /* 55 */ { 39, 2459, 14239, 29009, 26115, 10071, 1185, 0 }, // 83117 83128.972128(diff = 11.972128) + /* 56 */ { 35, 2365, 13981, 28876, 26319, 10299, 1242, 0 }, // 83117 83128.920096(diff = 11.920096) + /* 57 */ { 31, 2274, 13723, 28738, 26519, 10530, 1302, 0 }, // 83117 83128.642956(diff = 11.642956) + /* 58 */ { 27, 2185, 13467, 28595, 26716, 10764, 1363, 0 }, // 83117 83128.128743(diff = 11.128743) + /* 59 */ { 23, 2098, 13212, 28448, 26909, 11000, 1427, 0 }, // 83117 83127.364983(diff = 10.364983) + /* 60 */ { 20, 2014, 12959, 28296, 27098, 11238, 1492, 0 }, // 83117 83126.338722(diff = 9.338722) + /* 61 */ { 17, 1933, 12708, 28139, 27282, 11478, 1560, 0 }, // 83117 83125.036510(diff = 8.036510) + /* 62 */ { 14, 1854, 12459, 27977, 27463, 11720, 1630, 0 }, // 83117 83123.444392(diff = 6.444392) + /* 63 */ { 11, 1777, 12211, 27811, 27640, 11965, 1702, 0 }, // 83117 83121.547903(diff = 4.547903) + /* 64 */ { 9, 1703, 11965, 27640, 27812, 12211, 1777, 0 }, // 83117 83119.332059(diff = 2.332059) + diff --git a/Mednafen/mednafen/compress/GZFileStream.cpp b/Mednafen/mednafen/compress/GZFileStream.cpp new file mode 100644 index 0000000000..01432d9e62 --- /dev/null +++ b/Mednafen/mednafen/compress/GZFileStream.cpp @@ -0,0 +1,244 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "GZFileStream.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +GZFileStream::GZFileStream(const std::string& path, const MODE mode, const int level) : OpenedMode(mode) +{ + path_save = path; + + // Clear errno to 0 so can we detect internal zlib errors. + errno = 0; + if(mode == MODE::READ) + gzp = gzopen(path.c_str(), "rb"); + else if(mode == MODE::WRITE) + { + char tmp[16]; + + if(level >= 0) + trio_snprintf(tmp, sizeof(tmp), "wb%u", level); + else + trio_snprintf(tmp, sizeof(tmp), "wbT"); + + gzp = gzopen(path.c_str(), tmp); + } + else + abort(); + + if(!gzp) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), _("Error opening file \"%s\": %s"), path_save.c_str(), (ene.Errno() == 0) ? _("zlib error") : ene.StrError())); + } +} + +GZFileStream::~GZFileStream() +{ + try + { + close(); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } +} + +void GZFileStream::close(void) +{ + if(gzp != NULL) + { + gzFile tmp = gzp; + + gzp = NULL; + + if(gzclose(tmp) != Z_OK) + { + throw MDFN_Error(0, _("Error closing opened file \"%s\"."), path_save.c_str()); + } + } +} + +uint64 GZFileStream::read(void *data, uint64 count, bool error_on_eof) +{ + const auto read_count = gzread(gzp, data, count); + + if(read_count == -1) + { + int errnum; + const char* errstring; + + errstring = gzerror(gzp, &errnum); + throw MDFN_Error(0, _("Error reading from opened file \"%s\": %s"), path_save.c_str(), errstring); + } + + const uint64 read_count_u64 = (std::make_unsigned::type)read_count; + + if(read_count_u64 != count && error_on_eof) + throw MDFN_Error(0, _("Error reading from opened file \"%s\": %s"), path_save.c_str(), _("Unexpected EOF")); + + return(read_count_u64); +} + +int GZFileStream::get_line(std::string &str) +{ + int c; + + str.clear(); + + while((c = gzgetc(gzp)) >= 0) + { + if(c == '\r' || c == '\n' || c == 0) + return(c); + + str.push_back(c); + } + + if(c == -1 && !gzeof(gzp)) + { + int errnum; + const char* errstring; + + errstring = gzerror(gzp, &errnum); + throw MDFN_Error(0, _("Error reading from opened file \"%s\": %s"), path_save.c_str(), errstring); + } + + return(str.length() ? 256 : -1); +} + +void GZFileStream::flush(void) +{ + int errnum; + + errnum = gzflush(gzp, Z_FINISH); + if(errnum != Z_OK) + { + //ErrnoHolder ene(errno); + const char* errstring; + + errstring = gzerror(gzp, &errnum); + throw MDFN_Error(0, _("Error flushing to opened file \"%s\": %s"), path_save.c_str(), errstring); + } +} + +void GZFileStream::write(const void *data, uint64 count) +{ + const auto write_count = gzwrite(gzp, data, count); + const uint64 write_count_u64 = (std::make_unsigned::type)write_count; + + if(write_count_u64 != count) + { + //ErrnoHolder ene(errno); + int errnum; + const char* errstring; + + errstring = gzerror(gzp, &errnum); + throw MDFN_Error(0, _("Error writing to opened file \"%s\": %s"), path_save.c_str(), errstring); + } +} + +void GZFileStream::truncate(uint64 length) +{ + throw MDFN_Error(ErrnoHolder(ENOSYS)); +} + +void GZFileStream::seek(int64 offset, int whence) +{ + // TODO: Throw error if offset is beyond the range that can be represented by the gz*() offset type. + if(gzseek(gzp, offset, whence) == -1) + { + //ErrnoHolder ene(errno); + int errnum; + const char* errstring; + + errstring = gzerror(gzp, &errnum); + + throw MDFN_Error(0, _("Error seeking in opened file \"%s\": %s"), path_save.c_str(), errstring); + } +} + +uint64 GZFileStream::size(void) +{ + const uint64 p = tell(); + + if(OpenedMode == MODE::WRITE) + return(p); + else + { + uint64 s = 0; + int c; + + rewind(); + + while((c = get_char()) >= 0) + s++; + + seek(p, SEEK_SET); + + return s; + } +} + +uint64 GZFileStream::tell(void) +{ + auto gofs = gztell(gzp); + + if(gofs == -1) + { + //ErrnoHolder ene(errno); + int errnum; + const char* errstring; + + errstring = gzerror(gzp, &errnum); + + throw MDFN_Error(0, _("Error getting position in opened file \"%s\": %s"), path_save.c_str(), errstring); + } + + return (std::make_unsigned::type)gofs; +} + + +uint64 GZFileStream::attributes(void) +{ + uint64 ret = ATTRIBUTE_SEEKABLE | ATTRIBUTE_SLOW_SEEK | ATTRIBUTE_SLOW_SIZE; + + switch(OpenedMode) + { + case MODE::READ: + ret |= ATTRIBUTE_READABLE; + break; + + case MODE::WRITE: + ret |= ATTRIBUTE_WRITEABLE; + break; + } + + return ret; +} diff --git a/Mednafen/mednafen/compress/GZFileStream.h b/Mednafen/mednafen/compress/GZFileStream.h new file mode 100644 index 0000000000..83dad011c7 --- /dev/null +++ b/Mednafen/mednafen/compress/GZFileStream.h @@ -0,0 +1,82 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_GZFILESTREAM_H +#define __MDFN_GZFILESTREAM_H + +#include + +#include + +class GZFileStream : public Stream +{ + public: + + enum class MODE + { + READ = 0, + WRITE = 1, + }; + + // + // Pass negative value for level for raw(non-gzip) file access with MODE::WRITE. + // + GZFileStream(const std::string& path, const MODE mode, const int level = 6); + virtual ~GZFileStream() override; + + virtual uint64 attributes(void) override; + + virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) override; + virtual void write(const void *data, uint64 count) override; + virtual void truncate(uint64 length) override; + virtual void seek(int64 offset, int whence) override; + virtual uint64 tell(void) override; + virtual uint64 size(void) override; + virtual void close(void) override; + virtual void flush(void) override; + INLINE int get_char(void) + { + int c; + + c = gzgetc(gzp); + + if(MDFN_UNLIKELY(c == -1 && !gzeof(gzp))) + { + int errnum; + const char* errstring; + + errstring = gzerror(gzp, &errnum); + throw MDFN_Error(0, _("Error reading from opened file \"%s\": %s"), path_save.c_str(), errstring); + } + return(c); + } + + virtual int get_line(std::string &str) override; + + private: + + GZFileStream & operator=(const GZFileStream &); // Assignment operator + GZFileStream(const GZFileStream &); // Copy constructor + + gzFile gzp; + const MODE OpenedMode; + std::string path_save; +}; + + + +#endif diff --git a/Mednafen/mednafen/compress/Makefile.am.inc b/Mednafen/mednafen/compress/Makefile.am.inc new file mode 100644 index 0000000000..74bce5670c --- /dev/null +++ b/Mednafen/mednafen/compress/Makefile.am.inc @@ -0,0 +1 @@ +mednafen_SOURCES += compress/minilzo.c compress/ioapi.c compress/unzip.c compress/GZFileStream.cpp compress/ZLInflateFilter.cpp diff --git a/Mednafen/mednafen/compress/README.LZO b/Mednafen/mednafen/compress/README.LZO new file mode 100644 index 0000000000..058eace70a --- /dev/null +++ b/Mednafen/mednafen/compress/README.LZO @@ -0,0 +1,124 @@ + + ============================================================================ + miniLZO -- mini subset of the LZO real-time data compression library + ============================================================================ + + Author : Markus Franz Xaver Johannes Oberhumer + + http://www.oberhumer.com/opensource/lzo/ + Version : 2.06 + Date : 12 Aug 2011 + + I've created miniLZO for projects where it is inconvenient to + include (or require) the full LZO source code just because you + want to add a little bit of data compression to your application. + + miniLZO implements the LZO1X-1 compressor and both the standard and + safe LZO1X decompressor. Apart from fast compression it also useful + for situations where you want to use pre-compressed data files (which + must have been compressed with LZO1X-999). + + miniLZO consists of one C source file and three header files: + minilzo.c + minilzo.h, lzoconf.h, lzodefs.h + + To use miniLZO just copy these files into your source directory, add + minilzo.c to your Makefile and #include minilzo.h from your program. + Note: you also must distribute this file ('README.LZO') with your project. + + minilzo.o compiles to about 6 KiB (using gcc or Visual C on an i386), and + the sources are about 30 KiB when packed with zip - so there's no more + excuse that your application doesn't support data compression :-) + + For more information, documentation, example programs and other support + files (like Makefiles and build scripts) please download the full LZO + package from + http://www.oberhumer.com/opensource/lzo/ + + Have fun, + Markus + + + P.S. minilzo.c is generated automatically from the LZO sources and + therefore functionality is completely identical + + + Appendix A: building miniLZO + ---------------------------- + miniLZO is written such a way that it should compile and run + out-of-the-box on most machines. + + If you are running on a very unusual architecture and lzo_init() fails then + you should first recompile with '-DLZO_DEBUG' to see what causes the failure. + The most probable case is something like 'sizeof(void *) != sizeof(size_t)'. + After identifying the problem you can compile by adding some defines + like '-DSIZEOF_VOID_P=8' to your Makefile. + + The best solution is (of course) using Autoconf - if your project uses + Autoconf anyway just add '-DMINILZO_HAVE_CONFIG_H' to your compiler + flags when compiling minilzo.c. See the LZO distribution for an example + how to set up configure.ac. + + + Appendix B: list of public functions available in miniLZO + --------------------------------------------------------- + Library initialization + lzo_init() + + Compression + lzo1x_1_compress() + + Decompression + lzo1x_decompress() + lzo1x_decompress_safe() + + Checksum functions + lzo_adler32() + + Version functions + lzo_version() + lzo_version_string() + lzo_version_date() + + Portable (but slow) string functions + lzo_memcmp() + lzo_memcpy() + lzo_memmove() + lzo_memset() + + + Appendix C: suggested macros for 'configure.ac' when using Autoconf + ------------------------------------------------------------------- + Checks for typedefs and structures + AC_CHECK_TYPE(ptrdiff_t,long) + AC_TYPE_SIZE_T + AC_CHECK_SIZEOF(short) + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long) + AC_CHECK_SIZEOF(long long) + AC_CHECK_SIZEOF(__int64) + AC_CHECK_SIZEOF(void *) + AC_CHECK_SIZEOF(size_t) + AC_CHECK_SIZEOF(ptrdiff_t) + + Checks for compiler characteristics + AC_C_CONST + + Checks for library functions + AC_CHECK_FUNCS(memcmp memcpy memmove memset) + + + Appendix D: Copyright + --------------------- + LZO and miniLZO are Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Markus Franz Xaver Oberhumer . + + LZO and miniLZO are distributed under the terms of the GNU General + Public License (GPL). See the file COPYING. + + Special licenses for commercial and other applications which + are not willing to accept the GNU General Public License + are available by contacting the author. + + diff --git a/Mednafen/mednafen/compress/ZLInflateFilter.cpp b/Mednafen/mednafen/compress/ZLInflateFilter.cpp new file mode 100644 index 0000000000..911824a02a --- /dev/null +++ b/Mednafen/mednafen/compress/ZLInflateFilter.cpp @@ -0,0 +1,213 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: Seek testing and fixes, ensure will work for >2GB streams(see zs.total_out, zs.avail_out usage) on 32-bit platforms + +#include +#include "ZLInflateFilter.h" +#include + +ZLInflateFilter::ZLInflateFilter(Stream *source_stream, FORMAT df, uint64 csize, uint64 ucs) + : ss(source_stream), ss_startpos(source_stream->tell()), ss_boundpos(ss_startpos + csize), uc_size(ucs) +{ + int irc; + int iiwbits; + + switch(df) + { + default: + abort(); + break; + + case FORMAT::RAW: + iiwbits = 0 - 15; + break; + + case FORMAT::ZLIB: + iiwbits = 0 + 15; + break; + + case FORMAT::GZIP: + iiwbits = 16 + 15; + break; + + case FORMAT::AUTO_ZGZ: + iiwbits = 32 + 15; + break; + } + + memset(&zs, 0, sizeof(zs)); + irc = inflateInit2(&zs, iiwbits); + + if(MDFN_UNLIKELY(irc < 0)) + throw MDFN_Error(0, _("zlib error: %d"), irc); + + position = 0; +} + +ZLInflateFilter::~ZLInflateFilter() +{ + try + { + close(); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } +} + +uint64 ZLInflateFilter::read(void *data, uint64 count, bool error_on_eos) +{ + zs.next_out = (Bytef*)data; + zs.avail_out = count; + + while((uint64)(zs.next_out - (Bytef*)data) < count) + { + if(!zs.avail_in) + { + uint64 rc = ss->read(buf, std::min(sizeof(buf), ss_boundpos - ss->tell()), false); + zs.next_in = buf; + zs.avail_in = rc; + } + + bool no_more_input = !zs.avail_in; + int irc; + + zs.total_out = 0; + irc = inflate(&zs, no_more_input ? Z_SYNC_FLUSH : Z_NO_FLUSH); + if(MDFN_UNLIKELY(irc < 0)) + throw MDFN_Error(0, _("zlib error %d"), irc); + position += zs.total_out; + + if(no_more_input) + { + //if(irc != Z_STREAM_END) + // throw MDFN_Error(0, _("Ran out of data for inflate(), but not at + + break; + } + } + + uint64 ret = zs.next_out - (Bytef*)data; + assert(ret <= count); + + if(MDFN_UNLIKELY(ret < count && error_on_eos)) + { + throw MDFN_Error(0, _("Unexpected EOF")); + } + + return ret; +} + +void ZLInflateFilter::write(const void *data, uint64 count) +{ + throw MDFN_Error(ErrnoHolder(EINVAL)); +} + +void ZLInflateFilter::seek(int64 offset, int whence) +{ + uint64 new_position; + + switch(whence) + { + default: + throw MDFN_Error(ErrnoHolder(EINVAL)); + break; + + case SEEK_SET: + new_position = offset; + break; + + case SEEK_CUR: + new_position = position + offset; + break; + + case SEEK_END: + if(MDFN_UNLIKELY(uc_size == ~(uint64)0)) + throw MDFN_Error(EINVAL, _("Attempted to seek relative to end-of-file in deflate-compressed stream of indeterminate uncompressed size.")); + else + new_position = uc_size + offset; + break; + } + + if(MDFN_UNLIKELY((int64)new_position < 0 || new_position > uc_size)) + throw MDFN_Error(EINVAL, _("Attempted to seek to out-of-bounds position %llu in deflate-compressed stream."), (unsigned long long)new_position); + + if(new_position < position) + { + int irc = inflateReset(&zs); + + if(MDFN_UNLIKELY(irc < 0)) + throw MDFN_Error(0, _("zlib error %d"), irc); + + ss->seek(ss_startpos, SEEK_SET); + position = 0; + } + + while(position < new_position) + { + uint8 dummy[4096]; + uint64 toread = std::min(new_position - position, sizeof(dummy)); + + if(MDFN_UNLIKELY(read(dummy, toread, false) != toread)) + throw MDFN_Error(EINVAL, _("Ran out of data while seeking to position %llu in deflate-compressed stream."), (unsigned long long)new_position); + } +} + +uint64 ZLInflateFilter::tell(void) +{ + return position; +} + +uint64 ZLInflateFilter::size(void) +{ + if(uc_size == ~(uint64)0) + throw MDFN_Error(ErrnoHolder(EINVAL)); + else + return uc_size; +} + +void ZLInflateFilter::close(void) +{ + inflateEnd(&zs); + memset(&zs, 0, sizeof(zs)); +} + +uint64 ZLInflateFilter::attributes(void) +{ + uint64 ret = ss->attributes() & (ATTRIBUTE_READABLE | ATTRIBUTE_SEEKABLE); + + if(ret & ATTRIBUTE_SEEKABLE) + ret |= ATTRIBUTE_SLOW_SEEK; + + if(uc_size == ~(uint64)0) + ret |= ATTRIBUTE_SLOW_SIZE; + + return ret; +} + +void ZLInflateFilter::truncate(uint64 length) +{ + throw MDFN_Error(ErrnoHolder(EINVAL)); +} + +void ZLInflateFilter::flush(void) +{ + throw MDFN_Error(ErrnoHolder(EINVAL)); +} + diff --git a/Mednafen/mednafen/compress/ZLInflateFilter.h b/Mednafen/mednafen/compress/ZLInflateFilter.h new file mode 100644 index 0000000000..44d9e1f76c --- /dev/null +++ b/Mednafen/mednafen/compress/ZLInflateFilter.h @@ -0,0 +1,62 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_ZLINFLATEFILTER_H +#define __MDFN_ZLINFLATEFILTER_H + +#include + +#include + +class ZLInflateFilter : public Stream +{ + public: + + enum class FORMAT + { + RAW = 0, // Raw inflate + ZLIB = 1, // zlib format + GZIP = 2, // gzip format + AUTO_ZGZ = 3 // zlib or gzip, autodetect + }; + + ZLInflateFilter(Stream *source_stream, FORMAT df, uint64 csize, uint64 ucs = ~(uint64)0); + virtual ~ZLInflateFilter() override; + virtual uint64 read(void *data, uint64 count, bool error_on_eos = true) override; + virtual void write(const void *data, uint64 count) override; + virtual void seek(int64 offset, int whence) override; + virtual uint64 tell(void) override; + virtual uint64 size(void) override; + virtual void close(void) override; + virtual uint64 attributes(void) override; + virtual void truncate(uint64 length) override; + virtual void flush(void) override; + + private: + + Stream* ss; + const uint64 ss_startpos; + const uint64 ss_boundpos; + + z_stream zs; + uint8 buf[8192]; + + uint64 position; + const uint64 uc_size; +}; + +#endif diff --git a/Mednafen/mednafen/compress/ioapi.c b/Mednafen/mednafen/compress/ioapi.c new file mode 100644 index 0000000000..122b3760ec --- /dev/null +++ b/Mednafen/mednafen/compress/ioapi.c @@ -0,0 +1,180 @@ +/* ioapi.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include +#include +#include + +#include "zlib.h" +#ifndef OF +#define OF(a) a +#endif +#include "ioapi.h" + + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +voidpf ZCALLBACK fopen_file_func OF(( + voidpf opaque, + const char* filename, + int mode)); + +uLong ZCALLBACK fread_file_func OF(( + voidpf opaque, + voidpf stream, + void* buf, + uLong size)); + +uLong ZCALLBACK fwrite_file_func OF(( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size)); + +long ZCALLBACK ftell_file_func OF(( + voidpf opaque, + voidpf stream)); + +long ZCALLBACK fseek_file_func OF(( + voidpf opaque, + voidpf stream, + uLong offset, + int origin)); + +int ZCALLBACK fclose_file_func OF(( + voidpf opaque, + voidpf stream)); + +int ZCALLBACK ferror_file_func OF(( + voidpf opaque, + voidpf stream)); + + +voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) + voidpf opaque; + const char* filename; + int mode; +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + + +uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + + +uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + const void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +long ZCALLBACK ftell_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + +long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) + voidpf opaque; + voidpf stream; + uLong offset; + int origin; +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + fseek((FILE *)stream, offset, fseek_origin); + return ret; +} + +int ZCALLBACK fclose_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +int ZCALLBACK ferror_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/Mednafen/mednafen/compress/ioapi.h b/Mednafen/mednafen/compress/ioapi.h new file mode 100644 index 0000000000..7d457baab3 --- /dev/null +++ b/Mednafen/mednafen/compress/ioapi.h @@ -0,0 +1,75 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#ifndef _ZLIBIOAPI_H +#define _ZLIBIOAPI_H + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#define ZCALLBACK CALLBACK +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + + + +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Mednafen/mednafen/compress/lzoconf.h b/Mednafen/mednafen/compress/lzoconf.h new file mode 100644 index 0000000000..23c6ca93fc --- /dev/null +++ b/Mednafen/mednafen/compress/lzoconf.h @@ -0,0 +1,446 @@ +/* lzoconf.h -- configuration of the LZO data compression library + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2011 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + The LZO library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + + http://www.oberhumer.com/opensource/lzo/ + */ + + +#ifndef __LZOCONF_H_INCLUDED +#define __LZOCONF_H_INCLUDED 1 + +#define LZO_VERSION 0x2060 +#define LZO_VERSION_STRING "2.06" +#define LZO_VERSION_DATE "Aug 12 2011" + +/* internal Autoconf configuration file - only used when building LZO */ +#if defined(LZO_HAVE_CONFIG_H) +# include +#endif +#include +#include + + +/*********************************************************************** +// LZO requires a conforming +************************************************************************/ + +#if !defined(CHAR_BIT) || (CHAR_BIT != 8) +# error "invalid CHAR_BIT" +#endif +#if !defined(UCHAR_MAX) || !defined(UINT_MAX) || !defined(ULONG_MAX) +# error "check your compiler installation" +#endif +#if (USHRT_MAX < 1) || (UINT_MAX < 1) || (ULONG_MAX < 1) +# error "your limits.h macros are broken" +#endif + +/* get OS and architecture defines */ +#ifndef __LZODEFS_H_INCLUDED +#include "lzodefs.h" +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +/*********************************************************************** +// some core defines +************************************************************************/ + +#if !defined(LZO_UINT32_C) +# if (UINT_MAX < LZO_0xffffffffL) +# define LZO_UINT32_C(c) c ## UL +# else +# define LZO_UINT32_C(c) ((c) + 0U) +# endif +#endif + +/* memory checkers */ +#if !defined(__LZO_CHECKER) +# if defined(__BOUNDS_CHECKING_ON) +# define __LZO_CHECKER 1 +# elif defined(__CHECKER__) +# define __LZO_CHECKER 1 +# elif defined(__INSURE__) +# define __LZO_CHECKER 1 +# elif defined(__PURIFY__) +# define __LZO_CHECKER 1 +# endif +#endif + + +/*********************************************************************** +// integral and pointer types +************************************************************************/ + +/* lzo_uint should match size_t */ +#if !defined(LZO_UINT_MAX) +# if defined(LZO_ABI_LLP64) /* WIN64 */ +# if defined(LZO_OS_WIN64) + typedef unsigned __int64 lzo_uint; + typedef __int64 lzo_int; +# else + typedef unsigned long long lzo_uint; + typedef long long lzo_int; +# endif +# define LZO_UINT_MAX 0xffffffffffffffffull +# define LZO_INT_MAX 9223372036854775807LL +# define LZO_INT_MIN (-1LL - LZO_INT_MAX) +# elif defined(LZO_ABI_IP32L64) /* MIPS R5900 */ + typedef unsigned int lzo_uint; + typedef int lzo_int; +# define LZO_UINT_MAX UINT_MAX +# define LZO_INT_MAX INT_MAX +# define LZO_INT_MIN INT_MIN +# elif (ULONG_MAX >= LZO_0xffffffffL) + typedef unsigned long lzo_uint; + typedef long lzo_int; +# define LZO_UINT_MAX ULONG_MAX +# define LZO_INT_MAX LONG_MAX +# define LZO_INT_MIN LONG_MIN +# else +# error "lzo_uint" +# endif +#endif + +/* Integral types with 32 bits or more. */ +#if !defined(LZO_UINT32_MAX) +# if (UINT_MAX >= LZO_0xffffffffL) + typedef unsigned int lzo_uint32; + typedef int lzo_int32; +# define LZO_UINT32_MAX UINT_MAX +# define LZO_INT32_MAX INT_MAX +# define LZO_INT32_MIN INT_MIN +# elif (ULONG_MAX >= LZO_0xffffffffL) + typedef unsigned long lzo_uint32; + typedef long lzo_int32; +# define LZO_UINT32_MAX ULONG_MAX +# define LZO_INT32_MAX LONG_MAX +# define LZO_INT32_MIN LONG_MIN +# else +# error "lzo_uint32" +# endif +#endif + +/* Integral types with exactly 64 bits. */ +#if !defined(LZO_UINT64_MAX) +# if (LZO_UINT_MAX >= LZO_0xffffffffL) +# if ((((LZO_UINT_MAX) >> 31) >> 31) == 3) +# define lzo_uint64 lzo_uint +# define lzo_int64 lzo_int +# define LZO_UINT64_MAX LZO_UINT_MAX +# define LZO_INT64_MAX LZO_INT_MAX +# define LZO_INT64_MIN LZO_INT_MIN +# endif +# elif (ULONG_MAX >= LZO_0xffffffffL) +# if ((((ULONG_MAX) >> 31) >> 31) == 3) + typedef unsigned long lzo_uint64; + typedef long lzo_int64; +# define LZO_UINT64_MAX ULONG_MAX +# define LZO_INT64_MAX LONG_MAX +# define LZO_INT64_MIN LONG_MIN +# endif +# endif +#endif + +/* The larger type of lzo_uint and lzo_uint32. */ +#if (LZO_UINT_MAX >= LZO_UINT32_MAX) +# define lzo_xint lzo_uint +#else +# define lzo_xint lzo_uint32 +#endif + +/* Memory model that allows to access memory at offsets of lzo_uint. */ +#if !defined(__LZO_MMODEL) +# if (LZO_UINT_MAX <= UINT_MAX) +# define __LZO_MMODEL /*empty*/ +# elif defined(LZO_HAVE_MM_HUGE_PTR) +# define __LZO_MMODEL_HUGE 1 +# define __LZO_MMODEL __huge +# else +# define __LZO_MMODEL /*empty*/ +# endif +#endif + +/* no typedef here because of const-pointer issues */ +#define lzo_bytep unsigned char __LZO_MMODEL * +#define lzo_charp char __LZO_MMODEL * +#define lzo_voidp void __LZO_MMODEL * +#define lzo_shortp short __LZO_MMODEL * +#define lzo_ushortp unsigned short __LZO_MMODEL * +#define lzo_uint32p lzo_uint32 __LZO_MMODEL * +#define lzo_int32p lzo_int32 __LZO_MMODEL * +#if defined(LZO_UINT64_MAX) +#define lzo_uint64p lzo_uint64 __LZO_MMODEL * +#define lzo_int64p lzo_int64 __LZO_MMODEL * +#endif +#define lzo_uintp lzo_uint __LZO_MMODEL * +#define lzo_intp lzo_int __LZO_MMODEL * +#define lzo_xintp lzo_xint __LZO_MMODEL * +#define lzo_voidpp lzo_voidp __LZO_MMODEL * +#define lzo_bytepp lzo_bytep __LZO_MMODEL * +/* deprecated - use 'lzo_bytep' instead of 'lzo_byte *' */ +#define lzo_byte unsigned char __LZO_MMODEL + +typedef int lzo_bool; + + +/*********************************************************************** +// function types +************************************************************************/ + +/* name mangling */ +#if !defined(__LZO_EXTERN_C) +# ifdef __cplusplus +# define __LZO_EXTERN_C extern "C" +# else +# define __LZO_EXTERN_C extern +# endif +#endif + +/* calling convention */ +#if !defined(__LZO_CDECL) +# define __LZO_CDECL __lzo_cdecl +#endif + +/* DLL export information */ +#if !defined(__LZO_EXPORT1) +# define __LZO_EXPORT1 /*empty*/ +#endif +#if !defined(__LZO_EXPORT2) +# define __LZO_EXPORT2 /*empty*/ +#endif + +/* __cdecl calling convention for public C and assembly functions */ +#if !defined(LZO_PUBLIC) +# define LZO_PUBLIC(_rettype) __LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_CDECL +#endif +#if !defined(LZO_EXTERN) +# define LZO_EXTERN(_rettype) __LZO_EXTERN_C LZO_PUBLIC(_rettype) +#endif +#if !defined(LZO_PRIVATE) +# define LZO_PRIVATE(_rettype) static _rettype __LZO_CDECL +#endif + +/* function types */ +typedef int +(__LZO_CDECL *lzo_compress_t) ( const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem ); + +typedef int +(__LZO_CDECL *lzo_decompress_t) ( const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem ); + +typedef int +(__LZO_CDECL *lzo_optimize_t) ( lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem ); + +typedef int +(__LZO_CDECL *lzo_compress_dict_t)(const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem, + const lzo_bytep dict, lzo_uint dict_len ); + +typedef int +(__LZO_CDECL *lzo_decompress_dict_t)(const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem, + const lzo_bytep dict, lzo_uint dict_len ); + + +/* Callback interface. Currently only the progress indicator ("nprogress") + * is used, but this may change in a future release. */ + +struct lzo_callback_t; +typedef struct lzo_callback_t lzo_callback_t; +#define lzo_callback_p lzo_callback_t __LZO_MMODEL * + +/* malloc & free function types */ +typedef lzo_voidp (__LZO_CDECL *lzo_alloc_func_t) + (lzo_callback_p self, lzo_uint items, lzo_uint size); +typedef void (__LZO_CDECL *lzo_free_func_t) + (lzo_callback_p self, lzo_voidp ptr); + +/* a progress indicator callback function */ +typedef void (__LZO_CDECL *lzo_progress_func_t) + (lzo_callback_p, lzo_uint, lzo_uint, int); + +struct lzo_callback_t +{ + /* custom allocators (set to 0 to disable) */ + lzo_alloc_func_t nalloc; /* [not used right now] */ + lzo_free_func_t nfree; /* [not used right now] */ + + /* a progress indicator callback function (set to 0 to disable) */ + lzo_progress_func_t nprogress; + + /* NOTE: the first parameter "self" of the nalloc/nfree/nprogress + * callbacks points back to this struct, so you are free to store + * some extra info in the following variables. */ + lzo_voidp user1; + lzo_xint user2; + lzo_xint user3; +}; + + +/*********************************************************************** +// error codes and prototypes +************************************************************************/ + +/* Error codes for the compression/decompression functions. Negative + * values are errors, positive values will be used for special but + * normal events. + */ +#define LZO_E_OK 0 +#define LZO_E_ERROR (-1) +#define LZO_E_OUT_OF_MEMORY (-2) /* [lzo_alloc_func_t failure] */ +#define LZO_E_NOT_COMPRESSIBLE (-3) /* [not used right now] */ +#define LZO_E_INPUT_OVERRUN (-4) +#define LZO_E_OUTPUT_OVERRUN (-5) +#define LZO_E_LOOKBEHIND_OVERRUN (-6) +#define LZO_E_EOF_NOT_FOUND (-7) +#define LZO_E_INPUT_NOT_CONSUMED (-8) +#define LZO_E_NOT_YET_IMPLEMENTED (-9) /* [not used right now] */ +#define LZO_E_INVALID_ARGUMENT (-10) + + +#ifndef lzo_sizeof_dict_t +# define lzo_sizeof_dict_t ((unsigned)sizeof(lzo_bytep)) +#endif + +/* lzo_init() should be the first function you call. + * Check the return code ! + * + * lzo_init() is a macro to allow checking that the library and the + * compiler's view of various types are consistent. + */ +#define lzo_init() __lzo_init_v2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\ + (int)sizeof(long),(int)sizeof(lzo_uint32),(int)sizeof(lzo_uint),\ + (int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\ + (int)sizeof(lzo_callback_t)) +LZO_EXTERN(int) __lzo_init_v2(unsigned,int,int,int,int,int,int,int,int,int); + +/* version functions (useful for shared libraries) */ +LZO_EXTERN(unsigned) lzo_version(void); +LZO_EXTERN(const char *) lzo_version_string(void); +LZO_EXTERN(const char *) lzo_version_date(void); +LZO_EXTERN(const lzo_charp) _lzo_version_string(void); +LZO_EXTERN(const lzo_charp) _lzo_version_date(void); + +/* string functions */ +LZO_EXTERN(int) + lzo_memcmp(const lzo_voidp a, const lzo_voidp b, lzo_uint len); +LZO_EXTERN(lzo_voidp) + lzo_memcpy(lzo_voidp dst, const lzo_voidp src, lzo_uint len); +LZO_EXTERN(lzo_voidp) + lzo_memmove(lzo_voidp dst, const lzo_voidp src, lzo_uint len); +LZO_EXTERN(lzo_voidp) + lzo_memset(lzo_voidp buf, int c, lzo_uint len); + +/* checksum functions */ +LZO_EXTERN(lzo_uint32) + lzo_adler32(lzo_uint32 c, const lzo_bytep buf, lzo_uint len); +LZO_EXTERN(lzo_uint32) + lzo_crc32(lzo_uint32 c, const lzo_bytep buf, lzo_uint len); +LZO_EXTERN(const lzo_uint32p) + lzo_get_crc32_table(void); + +/* misc. */ +LZO_EXTERN(int) _lzo_config_check(void); +typedef union { lzo_bytep p; lzo_uint u; } __lzo_pu_u; +typedef union { lzo_bytep p; lzo_uint32 u32; } __lzo_pu32_u; +typedef union { void *vp; lzo_bytep bp; lzo_uint u; lzo_uint32 u32; unsigned long l; } lzo_align_t; + +/* align a char pointer on a boundary that is a multiple of 'size' */ +LZO_EXTERN(unsigned) __lzo_align_gap(const lzo_voidp p, lzo_uint size); +#define LZO_PTR_ALIGN_UP(p,size) \ + ((p) + (lzo_uint) __lzo_align_gap((const lzo_voidp)(p),(lzo_uint)(size))) + + +/*********************************************************************** +// deprecated macros - only for backward compatibility with LZO v1.xx +************************************************************************/ + +#if defined(LZO_CFG_COMPAT) + +#define __LZOCONF_H 1 + +#if defined(LZO_ARCH_I086) +# define __LZO_i386 1 +#elif defined(LZO_ARCH_I386) +# define __LZO_i386 1 +#endif + +#if defined(LZO_OS_DOS16) +# define __LZO_DOS 1 +# define __LZO_DOS16 1 +#elif defined(LZO_OS_DOS32) +# define __LZO_DOS 1 +#elif defined(LZO_OS_WIN16) +# define __LZO_WIN 1 +# define __LZO_WIN16 1 +#elif defined(LZO_OS_WIN32) +# define __LZO_WIN 1 +#endif + +#define __LZO_CMODEL /*empty*/ +#define __LZO_DMODEL /*empty*/ +#define __LZO_ENTRY __LZO_CDECL +#define LZO_EXTERN_CDECL LZO_EXTERN +#define LZO_ALIGN LZO_PTR_ALIGN_UP + +#define lzo_compress_asm_t lzo_compress_t +#define lzo_decompress_asm_t lzo_decompress_t + +#endif /* LZO_CFG_COMPAT */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* already included */ + + +/* vim:set ts=4 et: */ diff --git a/Mednafen/mednafen/compress/lzodefs.h b/Mednafen/mednafen/compress/lzodefs.h new file mode 100644 index 0000000000..0e40e332a8 --- /dev/null +++ b/Mednafen/mednafen/compress/lzodefs.h @@ -0,0 +1,1852 @@ +/* lzodefs.h -- architecture, OS and compiler specific defines + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2011 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + The LZO library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + + http://www.oberhumer.com/opensource/lzo/ + */ + + +#ifndef __LZODEFS_H_INCLUDED +#define __LZODEFS_H_INCLUDED 1 + +#if defined(__CYGWIN32__) && !defined(__CYGWIN__) +# define __CYGWIN__ __CYGWIN32__ +#endif +#if defined(__IBMCPP__) && !defined(__IBMC__) +# define __IBMC__ __IBMCPP__ +#endif +#if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER) +# define __INTEL_COMPILER __ICL +#endif +#if 1 && defined(__INTERIX) && defined(__GNUC__) && !defined(_ALL_SOURCE) +# define _ALL_SOURCE 1 +#endif +#if defined(__mips__) && defined(__R5900__) +# if !defined(__LONG_MAX__) +# define __LONG_MAX__ 9223372036854775807L +# endif +#endif +#if defined(__INTEL_COMPILER) && defined(__linux__) +# pragma warning(disable: 193) +#endif +#if defined(__KEIL__) && defined(__C166__) +# pragma warning disable = 322 +#elif 0 && defined(__C251__) +# pragma warning disable = 322 +#endif +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__MWERKS__) +# if (_MSC_VER >= 1300) +# pragma warning(disable: 4668) +# endif +#endif +#if 0 && defined(__WATCOMC__) +# if (__WATCOMC__ >= 1050) && (__WATCOMC__ < 1060) +# pragma warning 203 9 +# endif +#endif +#if defined(__BORLANDC__) && defined(__MSDOS__) && !defined(__FLAT__) +# pragma option -h +#endif +#if 0 +#define LZO_0xffffL 0xfffful +#define LZO_0xffffffffL 0xfffffffful +#else +#define LZO_0xffffL 65535ul +#define LZO_0xffffffffL 4294967295ul +#endif +#if (LZO_0xffffL == LZO_0xffffffffL) +# error "your preprocessor is broken 1" +#endif +#if (16ul * 16384ul != 262144ul) +# error "your preprocessor is broken 2" +#endif +#if 0 +#if (32767 >= 4294967295ul) +# error "your preprocessor is broken 3" +#endif +#if (65535u >= 4294967295ul) +# error "your preprocessor is broken 4" +#endif +#endif +#if (UINT_MAX == LZO_0xffffL) +#if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__) +# if !defined(MSDOS) +# define MSDOS 1 +# endif +# if !defined(_MSDOS) +# define _MSDOS 1 +# endif +#elif 0 && defined(__VERSION) && defined(MB_LEN_MAX) +# if (__VERSION == 520) && (MB_LEN_MAX == 1) +# if !defined(__AZTEC_C__) +# define __AZTEC_C__ __VERSION +# endif +# if !defined(__DOS__) +# define __DOS__ 1 +# endif +# endif +#endif +#endif +#if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == LZO_0xffffL) +# define ptrdiff_t long +# define _PTRDIFF_T_DEFINED 1 +#endif +#if (UINT_MAX == LZO_0xffffL) +# undef __LZO_RENAME_A +# undef __LZO_RENAME_B +# if defined(__AZTEC_C__) && defined(__DOS__) +# define __LZO_RENAME_A 1 +# elif defined(_MSC_VER) && defined(MSDOS) +# if (_MSC_VER < 600) +# define __LZO_RENAME_A 1 +# elif (_MSC_VER < 700) +# define __LZO_RENAME_B 1 +# endif +# elif defined(__TSC__) && defined(__OS2__) +# define __LZO_RENAME_A 1 +# elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410) +# define __LZO_RENAME_A 1 +# elif defined(__PACIFIC__) && defined(DOS) +# if !defined(__far) +# define __far far +# endif +# if !defined(__near) +# define __near near +# endif +# endif +# if defined(__LZO_RENAME_A) +# if !defined(__cdecl) +# define __cdecl cdecl +# endif +# if !defined(__far) +# define __far far +# endif +# if !defined(__huge) +# define __huge huge +# endif +# if !defined(__near) +# define __near near +# endif +# if !defined(__pascal) +# define __pascal pascal +# endif +# if !defined(__huge) +# define __huge huge +# endif +# elif defined(__LZO_RENAME_B) +# if !defined(__cdecl) +# define __cdecl _cdecl +# endif +# if !defined(__far) +# define __far _far +# endif +# if !defined(__huge) +# define __huge _huge +# endif +# if !defined(__near) +# define __near _near +# endif +# if !defined(__pascal) +# define __pascal _pascal +# endif +# elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) +# if !defined(__cdecl) +# define __cdecl cdecl +# endif +# if !defined(__pascal) +# define __pascal pascal +# endif +# endif +# undef __LZO_RENAME_A +# undef __LZO_RENAME_B +#endif +#if (UINT_MAX == LZO_0xffffL) +#if defined(__AZTEC_C__) && defined(__DOS__) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +#elif defined(_MSC_VER) && defined(MSDOS) +# if (_MSC_VER < 600) +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +# endif +# if (_MSC_VER < 700) +# define LZO_BROKEN_INTEGRAL_PROMOTION 1 +# define LZO_BROKEN_SIZEOF 1 +# endif +#elif defined(__PACIFIC__) && defined(DOS) +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +#elif defined(__TURBOC__) && defined(__MSDOS__) +# if (__TURBOC__ < 0x0150) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +# define LZO_BROKEN_INTEGRAL_PROMOTION 1 +# endif +# if (__TURBOC__ < 0x0200) +# define LZO_BROKEN_SIZEOF 1 +# endif +# if (__TURBOC__ < 0x0400) && defined(__cplusplus) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +# endif +#elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +# define LZO_BROKEN_SIZEOF 1 +#endif +#endif +#if defined(__WATCOMC__) && (__WATCOMC__ < 900) +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +#endif +#if defined(_CRAY) && defined(_CRAY1) +# define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1 +#endif +#define LZO_PP_STRINGIZE(x) #x +#define LZO_PP_MACRO_EXPAND(x) LZO_PP_STRINGIZE(x) +#define LZO_PP_CONCAT2(a,b) a ## b +#define LZO_PP_CONCAT3(a,b,c) a ## b ## c +#define LZO_PP_CONCAT4(a,b,c,d) a ## b ## c ## d +#define LZO_PP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e +#define LZO_PP_ECONCAT2(a,b) LZO_PP_CONCAT2(a,b) +#define LZO_PP_ECONCAT3(a,b,c) LZO_PP_CONCAT3(a,b,c) +#define LZO_PP_ECONCAT4(a,b,c,d) LZO_PP_CONCAT4(a,b,c,d) +#define LZO_PP_ECONCAT5(a,b,c,d,e) LZO_PP_CONCAT5(a,b,c,d,e) +#if 1 +#define LZO_CPP_STRINGIZE(x) #x +#define LZO_CPP_MACRO_EXPAND(x) LZO_CPP_STRINGIZE(x) +#define LZO_CPP_CONCAT2(a,b) a ## b +#define LZO_CPP_CONCAT3(a,b,c) a ## b ## c +#define LZO_CPP_CONCAT4(a,b,c,d) a ## b ## c ## d +#define LZO_CPP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e +#define LZO_CPP_ECONCAT2(a,b) LZO_CPP_CONCAT2(a,b) +#define LZO_CPP_ECONCAT3(a,b,c) LZO_CPP_CONCAT3(a,b,c) +#define LZO_CPP_ECONCAT4(a,b,c,d) LZO_CPP_CONCAT4(a,b,c,d) +#define LZO_CPP_ECONCAT5(a,b,c,d,e) LZO_CPP_CONCAT5(a,b,c,d,e) +#endif +#define __LZO_MASK_GEN(o,b) (((((o) << ((b)-1)) - (o)) << 1) + (o)) +#if 1 && defined(__cplusplus) +# if !defined(__STDC_CONSTANT_MACROS) +# define __STDC_CONSTANT_MACROS 1 +# endif +# if !defined(__STDC_LIMIT_MACROS) +# define __STDC_LIMIT_MACROS 1 +# endif +#endif +#if defined(__cplusplus) +# define LZO_EXTERN_C extern "C" +#else +# define LZO_EXTERN_C extern +#endif +#if !defined(__LZO_OS_OVERRIDE) +#if (LZO_OS_FREESTANDING) +# define LZO_INFO_OS "freestanding" +#elif (LZO_OS_EMBEDDED) +# define LZO_INFO_OS "embedded" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_OS_EMBEDDED 1 +# define LZO_INFO_OS "embedded" +#elif defined(__CYGWIN__) && defined(__GNUC__) +# define LZO_OS_CYGWIN 1 +# define LZO_INFO_OS "cygwin" +#elif defined(__EMX__) && defined(__GNUC__) +# define LZO_OS_EMX 1 +# define LZO_INFO_OS "emx" +#elif defined(__BEOS__) +# define LZO_OS_BEOS 1 +# define LZO_INFO_OS "beos" +#elif defined(__Lynx__) +# define LZO_OS_LYNXOS 1 +# define LZO_INFO_OS "lynxos" +#elif defined(__OS400__) +# define LZO_OS_OS400 1 +# define LZO_INFO_OS "os400" +#elif defined(__QNX__) +# define LZO_OS_QNX 1 +# define LZO_INFO_OS "qnx" +#elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460) +# define LZO_OS_DOS32 1 +# define LZO_INFO_OS "dos32" +#elif defined(__BORLANDC__) && defined(__DPMI16__) +# define LZO_OS_DOS16 1 +# define LZO_INFO_OS "dos16" +#elif defined(__ZTC__) && defined(DOS386) +# define LZO_OS_DOS32 1 +# define LZO_INFO_OS "dos32" +#elif defined(__OS2__) || defined(__OS2V2__) +# if (UINT_MAX == LZO_0xffffL) +# define LZO_OS_OS216 1 +# define LZO_INFO_OS "os216" +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_OS_OS2 1 +# define LZO_INFO_OS "os2" +# else +# error "check your limits.h header" +# endif +#elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64) +# define LZO_OS_WIN64 1 +# define LZO_INFO_OS "win64" +#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +#elif defined(__MWERKS__) && defined(__INTEL__) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +#elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows) +# if (UINT_MAX == LZO_0xffffL) +# define LZO_OS_WIN16 1 +# define LZO_INFO_OS "win16" +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +# else +# error "check your limits.h header" +# endif +#elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS)) +# if (UINT_MAX == LZO_0xffffL) +# define LZO_OS_DOS16 1 +# define LZO_INFO_OS "dos16" +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_OS_DOS32 1 +# define LZO_INFO_OS "dos32" +# else +# error "check your limits.h header" +# endif +#elif defined(__WATCOMC__) +# if defined(__NT__) && (UINT_MAX == LZO_0xffffL) +# define LZO_OS_DOS16 1 +# define LZO_INFO_OS "dos16" +# elif defined(__NT__) && (__WATCOMC__ < 1100) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +# elif defined(__linux__) || defined(__LINUX__) +# define LZO_OS_POSIX 1 +# define LZO_INFO_OS "posix" +# else +# error "please specify a target using the -bt compiler option" +# endif +#elif defined(__palmos__) +# define LZO_OS_PALMOS 1 +# define LZO_INFO_OS "palmos" +#elif defined(__TOS__) || defined(__atarist__) +# define LZO_OS_TOS 1 +# define LZO_INFO_OS "tos" +#elif defined(macintosh) && !defined(__ppc__) +# define LZO_OS_MACCLASSIC 1 +# define LZO_INFO_OS "macclassic" +#elif defined(__VMS) +# define LZO_OS_VMS 1 +# define LZO_INFO_OS "vms" +#elif ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) +# define LZO_OS_CONSOLE 1 +# define LZO_OS_CONSOLE_PS2 1 +# define LZO_INFO_OS "console" +# define LZO_INFO_OS_CONSOLE "ps2" +#elif (defined(__mips__) && defined(__psp__)) +# define LZO_OS_CONSOLE 1 +# define LZO_OS_CONSOLE_PSP 1 +# define LZO_INFO_OS "console" +# define LZO_INFO_OS_CONSOLE "psp" +#else +# define LZO_OS_POSIX 1 +# define LZO_INFO_OS "posix" +#endif +#if (LZO_OS_POSIX) +# if defined(_AIX) || defined(__AIX__) || defined(__aix__) +# define LZO_OS_POSIX_AIX 1 +# define LZO_INFO_OS_POSIX "aix" +# elif defined(__FreeBSD__) +# define LZO_OS_POSIX_FREEBSD 1 +# define LZO_INFO_OS_POSIX "freebsd" +# elif defined(__hpux__) || defined(__hpux) +# define LZO_OS_POSIX_HPUX 1 +# define LZO_INFO_OS_POSIX "hpux" +# elif defined(__INTERIX) +# define LZO_OS_POSIX_INTERIX 1 +# define LZO_INFO_OS_POSIX "interix" +# elif defined(__IRIX__) || defined(__irix__) +# define LZO_OS_POSIX_IRIX 1 +# define LZO_INFO_OS_POSIX "irix" +# elif defined(__linux__) || defined(__linux) || defined(__LINUX__) +# define LZO_OS_POSIX_LINUX 1 +# define LZO_INFO_OS_POSIX "linux" +# elif defined(__APPLE__) || defined(__MACOS__) +# define LZO_OS_POSIX_MACOSX 1 +# define LZO_INFO_OS_POSIX "macosx" +# elif defined(__minix__) || defined(__minix) +# define LZO_OS_POSIX_MINIX 1 +# define LZO_INFO_OS_POSIX "minix" +# elif defined(__NetBSD__) +# define LZO_OS_POSIX_NETBSD 1 +# define LZO_INFO_OS_POSIX "netbsd" +# elif defined(__OpenBSD__) +# define LZO_OS_POSIX_OPENBSD 1 +# define LZO_INFO_OS_POSIX "openbsd" +# elif defined(__osf__) +# define LZO_OS_POSIX_OSF 1 +# define LZO_INFO_OS_POSIX "osf" +# elif defined(__solaris__) || defined(__sun) +# if defined(__SVR4) || defined(__svr4__) +# define LZO_OS_POSIX_SOLARIS 1 +# define LZO_INFO_OS_POSIX "solaris" +# else +# define LZO_OS_POSIX_SUNOS 1 +# define LZO_INFO_OS_POSIX "sunos" +# endif +# elif defined(__ultrix__) || defined(__ultrix) +# define LZO_OS_POSIX_ULTRIX 1 +# define LZO_INFO_OS_POSIX "ultrix" +# elif defined(_UNICOS) +# define LZO_OS_POSIX_UNICOS 1 +# define LZO_INFO_OS_POSIX "unicos" +# else +# define LZO_OS_POSIX_UNKNOWN 1 +# define LZO_INFO_OS_POSIX "unknown" +# endif +#endif +#endif +#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +# if (UINT_MAX != LZO_0xffffL) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if (LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_WIN32 || LZO_OS_WIN64) +# if (UINT_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if defined(CIL) && defined(_GNUCC) && defined(__GNUC__) +# define LZO_CC_CILLY 1 +# define LZO_INFO_CC "Cilly" +# if defined(__CILLY__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CILLY__) +# else +# define LZO_INFO_CCVER "unknown" +# endif +#elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__) +# define LZO_CC_SDCC 1 +# define LZO_INFO_CC "sdcc" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(SDCC) +#elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__) +# define LZO_CC_PATHSCALE (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__) +# define LZO_INFO_CC "Pathscale C" +# define LZO_INFO_CCVER __PATHSCALE__ +#elif defined(__INTEL_COMPILER) +# define LZO_CC_INTELC 1 +# define LZO_INFO_CC "Intel C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__INTEL_COMPILER) +# if defined(_WIN32) || defined(_WIN64) +# define LZO_CC_SYNTAX_MSC 1 +# else +# define LZO_CC_SYNTAX_GNUC 1 +# endif +#elif defined(__POCC__) && defined(_WIN32) +# define LZO_CC_PELLESC 1 +# define LZO_INFO_CC "Pelles C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__POCC__) +#elif defined(__clang__) && defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) +# if defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# else +# define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# endif +# if defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__) +# define LZO_CC_CLANG_CLANG (__clang_major__ * 0x10000L + __clang_minor__ * 0x100 + __clang_patchlevel__) +# else +# define LZO_CC_CLANG_CLANG 0x010000L +# endif +# define LZO_CC_CLANG LZO_CC_CLANG_GNUC +# define LZO_INFO_CC "clang" +# define LZO_INFO_CCVER __VERSION__ +#elif defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) +# if defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# else +# define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# endif +# define LZO_CC_LLVM LZO_CC_LLVM_GNUC +# define LZO_INFO_CC "llvm-gcc" +# define LZO_INFO_CCVER __VERSION__ +#elif defined(__GNUC__) && defined(__VERSION__) +# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# elif defined(__GNUC_MINOR__) +# define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# else +# define LZO_CC_GNUC (__GNUC__ * 0x10000L) +# endif +# define LZO_INFO_CC "gcc" +# define LZO_INFO_CCVER __VERSION__ +#elif defined(__ACK__) && defined(_ACK) +# define LZO_CC_ACK 1 +# define LZO_INFO_CC "Amsterdam Compiler Kit C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__AZTEC_C__) +# define LZO_CC_AZTECC 1 +# define LZO_INFO_CC "Aztec C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__AZTEC_C__) +#elif defined(__CODEGEARC__) +# define LZO_CC_CODEGEARC 1 +# define LZO_INFO_CC "CodeGear C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CODEGEARC__) +#elif defined(__BORLANDC__) +# define LZO_CC_BORLANDC 1 +# define LZO_INFO_CC "Borland C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__BORLANDC__) +#elif defined(_CRAYC) && defined(_RELEASE) +# define LZO_CC_CRAYC 1 +# define LZO_INFO_CC "Cray C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_RELEASE) +#elif defined(__DMC__) && defined(__SC__) +# define LZO_CC_DMC 1 +# define LZO_INFO_CC "Digital Mars C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DMC__) +#elif defined(__DECC) +# define LZO_CC_DECC 1 +# define LZO_INFO_CC "DEC C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DECC) +#elif defined(__HIGHC__) +# define LZO_CC_HIGHC 1 +# define LZO_INFO_CC "MetaWare High C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__IAR_SYSTEMS_ICC__) +# define LZO_CC_IARC 1 +# define LZO_INFO_CC "IAR C" +# if defined(__VER__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__VER__) +# else +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__IBMC__) +# define LZO_CC_IBMC 1 +# define LZO_INFO_CC "IBM C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__IBMC__) +#elif defined(__KEIL__) && defined(__C166__) +# define LZO_CC_KEILC 1 +# define LZO_INFO_CC "Keil C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__C166__) +#elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL) +# define LZO_CC_LCCWIN32 1 +# define LZO_INFO_CC "lcc-win32" +# define LZO_INFO_CCVER "unknown" +#elif defined(__LCC__) +# define LZO_CC_LCC 1 +# define LZO_INFO_CC "lcc" +# if defined(__LCC_VERSION__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__LCC_VERSION__) +# else +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(_MSC_VER) +# define LZO_CC_MSC 1 +# define LZO_INFO_CC "Microsoft C" +# if defined(_MSC_FULL_VER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER) +# else +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) +# endif +#elif defined(__MWERKS__) +# define LZO_CC_MWERKS 1 +# define LZO_INFO_CC "Metrowerks C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__MWERKS__) +#elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386) +# define LZO_CC_NDPC 1 +# define LZO_INFO_CC "Microway NDP C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__PACIFIC__) +# define LZO_CC_PACIFICC 1 +# define LZO_INFO_CC "Pacific C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PACIFIC__) +#elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__)) +# define LZO_CC_PGI 1 +# define LZO_INFO_CC "Portland Group PGI C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__PUREC__) && defined(__TOS__) +# define LZO_CC_PUREC 1 +# define LZO_INFO_CC "Pure C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PUREC__) +#elif defined(__SC__) && defined(__ZTC__) +# define LZO_CC_SYMANTECC 1 +# define LZO_INFO_CC "Symantec C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SC__) +#elif defined(__SUNPRO_C) +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_C)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_C +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_C) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__SUNPRO_CC) +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_CC)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_CC +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_CC) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__TINYC__) +# define LZO_CC_TINYC 1 +# define LZO_INFO_CC "Tiny C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TINYC__) +#elif defined(__TSC__) +# define LZO_CC_TOPSPEEDC 1 +# define LZO_INFO_CC "TopSpeed C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TSC__) +#elif defined(__WATCOMC__) +# define LZO_CC_WATCOMC 1 +# define LZO_INFO_CC "Watcom C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__WATCOMC__) +#elif defined(__TURBOC__) +# define LZO_CC_TURBOC 1 +# define LZO_INFO_CC "Turbo C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TURBOC__) +#elif defined(__ZTC__) +# define LZO_CC_ZORTECHC 1 +# define LZO_INFO_CC "Zortech C" +# if (__ZTC__ == 0x310) +# define LZO_INFO_CCVER "0x310" +# else +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__ZTC__) +# endif +#else +# define LZO_CC_UNKNOWN 1 +# define LZO_INFO_CC "unknown" +# define LZO_INFO_CCVER "unknown" +#endif +#if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER) +# error "LZO_CC_MSC: _MSC_FULL_VER is not defined" +#endif +#if !defined(__LZO_ARCH_OVERRIDE) && !(LZO_ARCH_GENERIC) && defined(_CRAY) +# if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY) +# if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E) +# define LZO_ARCH_CRAY_MPP 1 +# elif defined(_CRAY1) +# define LZO_ARCH_CRAY_PVP 1 +# endif +# endif +#endif +#if !defined(__LZO_ARCH_OVERRIDE) +#if (LZO_ARCH_GENERIC) +# define LZO_INFO_ARCH "generic" +#elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +# define LZO_ARCH_I086 1 +# define LZO_ARCH_IA16 1 +# define LZO_INFO_ARCH "i086" +#elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) +# define LZO_ARCH_ALPHA 1 +# define LZO_INFO_ARCH "alpha" +#elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E)) +# define LZO_ARCH_ALPHA 1 +# define LZO_INFO_ARCH "alpha" +#elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) +# define LZO_ARCH_AMD64 1 +# define LZO_INFO_ARCH "amd64" +#elif defined(__thumb__) || (defined(_M_ARM) && defined(_M_THUMB)) +# define LZO_ARCH_ARM 1 +# define LZO_ARCH_ARM_THUMB 1 +# define LZO_INFO_ARCH "arm_thumb" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__) +# define LZO_ARCH_ARM 1 +# if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1) +# define LZO_ARCH_ARM_THUMB 1 +# define LZO_INFO_ARCH "arm_thumb" +# elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2) +# define LZO_INFO_ARCH "arm" +# else +# define LZO_INFO_ARCH "arm" +# endif +#elif defined(__arm__) || defined(_M_ARM) +# define LZO_ARCH_ARM 1 +# define LZO_INFO_ARCH "arm" +#elif (UINT_MAX <= LZO_0xffffL) && defined(__AVR__) +# define LZO_ARCH_AVR 1 +# define LZO_INFO_ARCH "avr" +#elif defined(__avr32__) || defined(__AVR32__) +# define LZO_ARCH_AVR32 1 +# define LZO_INFO_ARCH "avr32" +#elif defined(__bfin__) +# define LZO_ARCH_BLACKFIN 1 +# define LZO_INFO_ARCH "blackfin" +#elif (UINT_MAX == LZO_0xffffL) && defined(__C166__) +# define LZO_ARCH_C166 1 +# define LZO_INFO_ARCH "c166" +#elif defined(__cris__) +# define LZO_ARCH_CRIS 1 +# define LZO_INFO_ARCH "cris" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__) +# define LZO_ARCH_EZ80 1 +# define LZO_INFO_ARCH "ez80" +#elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) +# define LZO_ARCH_H8300 1 +# define LZO_INFO_ARCH "h8300" +#elif defined(__hppa__) || defined(__hppa) +# define LZO_ARCH_HPPA 1 +# define LZO_INFO_ARCH "hppa" +#elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) +# define LZO_ARCH_I386 1 +# define LZO_ARCH_IA32 1 +# define LZO_INFO_ARCH "i386" +#elif (LZO_CC_ZORTECHC && defined(__I86__)) +# define LZO_ARCH_I386 1 +# define LZO_ARCH_IA32 1 +# define LZO_INFO_ARCH "i386" +#elif (LZO_OS_DOS32 && LZO_CC_HIGHC) && defined(_I386) +# define LZO_ARCH_I386 1 +# define LZO_ARCH_IA32 1 +# define LZO_INFO_ARCH "i386" +#elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64) +# define LZO_ARCH_IA64 1 +# define LZO_INFO_ARCH "ia64" +#elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__) +# define LZO_ARCH_M16C 1 +# define LZO_INFO_ARCH "m16c" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__) +# define LZO_ARCH_M16C 1 +# define LZO_INFO_ARCH "m16c" +#elif defined(__m32r__) +# define LZO_ARCH_M32R 1 +# define LZO_INFO_ARCH "m32r" +#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K) +# define LZO_ARCH_M68K 1 +# define LZO_INFO_ARCH "m68k" +#elif (UINT_MAX == LZO_0xffffL) && defined(__C251__) +# define LZO_ARCH_MCS251 1 +# define LZO_INFO_ARCH "mcs251" +#elif (UINT_MAX == LZO_0xffffL) && defined(__C51__) +# define LZO_ARCH_MCS51 1 +# define LZO_INFO_ARCH "mcs51" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) +# define LZO_ARCH_MCS51 1 +# define LZO_INFO_ARCH "mcs51" +#elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) +# define LZO_ARCH_MIPS 1 +# define LZO_INFO_ARCH "mips" +#elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__) +# define LZO_ARCH_MSP430 1 +# define LZO_INFO_ARCH "msp430" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__) +# define LZO_ARCH_MSP430 1 +# define LZO_INFO_ARCH "msp430" +#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR) +# define LZO_ARCH_POWERPC 1 +# define LZO_INFO_ARCH "powerpc" +#elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x) +# define LZO_ARCH_S390 1 +# define LZO_INFO_ARCH "s390" +#elif defined(__sh__) || defined(_M_SH) +# define LZO_ARCH_SH 1 +# define LZO_INFO_ARCH "sh" +#elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8) +# define LZO_ARCH_SPARC 1 +# define LZO_INFO_ARCH "sparc" +#elif defined(__SPU__) +# define LZO_ARCH_SPU 1 +# define LZO_INFO_ARCH "spu" +#elif (UINT_MAX == LZO_0xffffL) && defined(__z80) +# define LZO_ARCH_Z80 1 +# define LZO_INFO_ARCH "z80" +#elif (LZO_ARCH_CRAY_PVP) +# if defined(_CRAYSV1) +# define LZO_ARCH_CRAY_SV1 1 +# define LZO_INFO_ARCH "cray_sv1" +# elif (_ADDR64) +# define LZO_ARCH_CRAY_T90 1 +# define LZO_INFO_ARCH "cray_t90" +# elif (_ADDR32) +# define LZO_ARCH_CRAY_YMP 1 +# define LZO_INFO_ARCH "cray_ymp" +# else +# define LZO_ARCH_CRAY_XMP 1 +# define LZO_INFO_ARCH "cray_xmp" +# endif +#else +# define LZO_ARCH_UNKNOWN 1 +# define LZO_INFO_ARCH "unknown" +#endif +#endif +#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_DOS32 || LZO_OS_OS2) +# error "FIXME - missing define for CPU architecture" +#endif +#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN32) +# error "FIXME - missing WIN32 define for CPU architecture" +#endif +#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN64) +# error "FIXME - missing WIN64 define for CPU architecture" +#endif +#if (LZO_OS_OS216 || LZO_OS_WIN16) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#elif 1 && (LZO_OS_DOS16 && defined(BLX286)) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#elif 1 && (LZO_OS_DOS16 && defined(DOSX286)) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#elif 1 && (LZO_OS_DOS16 && LZO_CC_BORLANDC && defined(__DPMI16__)) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#endif +#if (LZO_ARCH_ARM_THUMB) && !(LZO_ARCH_ARM) +# error "this should not happen" +#endif +#if (LZO_ARCH_I086PM) && !(LZO_ARCH_I086) +# error "this should not happen" +#endif +#if (LZO_ARCH_I086) +# if (UINT_MAX != LZO_0xffffL) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if (LZO_ARCH_I386) +# if (UINT_MAX != LZO_0xffffL) && defined(__i386_int16__) +# error "this should not happen" +# endif +# if (UINT_MAX != LZO_0xffffffffL) && !defined(__i386_int16__) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if !defined(__LZO_MM_OVERRIDE) +#if (LZO_ARCH_I086) +#if (UINT_MAX != LZO_0xffffL) +# error "this should not happen" +#endif +#if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM) +# define LZO_MM_TINY 1 +#elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM) +# define LZO_MM_HUGE 1 +#elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL) +# define LZO_MM_SMALL 1 +#elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM) +# define LZO_MM_MEDIUM 1 +#elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM) +# define LZO_MM_COMPACT 1 +#elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL) +# define LZO_MM_LARGE 1 +#elif (LZO_CC_AZTECC) +# if defined(_LARGE_CODE) && defined(_LARGE_DATA) +# define LZO_MM_LARGE 1 +# elif defined(_LARGE_CODE) +# define LZO_MM_MEDIUM 1 +# elif defined(_LARGE_DATA) +# define LZO_MM_COMPACT 1 +# else +# define LZO_MM_SMALL 1 +# endif +#elif (LZO_CC_ZORTECHC && defined(__VCM__)) +# define LZO_MM_LARGE 1 +#else +# error "unknown memory model" +#endif +#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +#define LZO_HAVE_MM_HUGE_PTR 1 +#define LZO_HAVE_MM_HUGE_ARRAY 1 +#if (LZO_MM_TINY) +# undef LZO_HAVE_MM_HUGE_ARRAY +#endif +#if (LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_ZORTECHC) +# undef LZO_HAVE_MM_HUGE_PTR +# undef LZO_HAVE_MM_HUGE_ARRAY +#elif (LZO_CC_DMC || LZO_CC_SYMANTECC) +# undef LZO_HAVE_MM_HUGE_ARRAY +#elif (LZO_CC_MSC && defined(_QC)) +# undef LZO_HAVE_MM_HUGE_ARRAY +# if (_MSC_VER < 600) +# undef LZO_HAVE_MM_HUGE_PTR +# endif +#elif (LZO_CC_TURBOC && (__TURBOC__ < 0x0295)) +# undef LZO_HAVE_MM_HUGE_ARRAY +#endif +#if (LZO_ARCH_I086PM) && !(LZO_HAVE_MM_HUGE_PTR) +# if (LZO_OS_DOS16) +# error "this should not happen" +# elif (LZO_CC_ZORTECHC) +# else +# error "this should not happen" +# endif +#endif +#ifdef __cplusplus +extern "C" { +#endif +#if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0200)) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif (LZO_CC_MSC || LZO_CC_TOPSPEEDC) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif (LZO_CC_TURBOC && (__TURBOC__ >= 0x0295)) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif ((LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_TURBOC) && LZO_OS_DOS16) +# define LZO_MM_AHSHIFT 12 +#elif (LZO_CC_WATCOMC) + extern unsigned char _HShift; +# define LZO_MM_AHSHIFT ((unsigned) _HShift) +#else +# error "FIXME - implement LZO_MM_AHSHIFT" +#endif +#ifdef __cplusplus +} +#endif +#endif +#elif (LZO_ARCH_C166) +#if !defined(__MODEL__) +# error "FIXME - C166 __MODEL__" +#elif ((__MODEL__) == 0) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 1) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 2) +# define LZO_MM_LARGE 1 +#elif ((__MODEL__) == 3) +# define LZO_MM_TINY 1 +#elif ((__MODEL__) == 4) +# define LZO_MM_XTINY 1 +#elif ((__MODEL__) == 5) +# define LZO_MM_XSMALL 1 +#else +# error "FIXME - C166 __MODEL__" +#endif +#elif (LZO_ARCH_MCS251) +#if !defined(__MODEL__) +# error "FIXME - MCS251 __MODEL__" +#elif ((__MODEL__) == 0) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 2) +# define LZO_MM_LARGE 1 +#elif ((__MODEL__) == 3) +# define LZO_MM_TINY 1 +#elif ((__MODEL__) == 4) +# define LZO_MM_XTINY 1 +#elif ((__MODEL__) == 5) +# define LZO_MM_XSMALL 1 +#else +# error "FIXME - MCS251 __MODEL__" +#endif +#elif (LZO_ARCH_MCS51) +#if !defined(__MODEL__) +# error "FIXME - MCS51 __MODEL__" +#elif ((__MODEL__) == 1) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 2) +# define LZO_MM_LARGE 1 +#elif ((__MODEL__) == 3) +# define LZO_MM_TINY 1 +#elif ((__MODEL__) == 4) +# define LZO_MM_XTINY 1 +#elif ((__MODEL__) == 5) +# define LZO_MM_XSMALL 1 +#else +# error "FIXME - MCS51 __MODEL__" +#endif +#elif (LZO_ARCH_CRAY_PVP) +# define LZO_MM_PVP 1 +#else +# define LZO_MM_FLAT 1 +#endif +#if (LZO_MM_COMPACT) +# define LZO_INFO_MM "compact" +#elif (LZO_MM_FLAT) +# define LZO_INFO_MM "flat" +#elif (LZO_MM_HUGE) +# define LZO_INFO_MM "huge" +#elif (LZO_MM_LARGE) +# define LZO_INFO_MM "large" +#elif (LZO_MM_MEDIUM) +# define LZO_INFO_MM "medium" +#elif (LZO_MM_PVP) +# define LZO_INFO_MM "pvp" +#elif (LZO_MM_SMALL) +# define LZO_INFO_MM "small" +#elif (LZO_MM_TINY) +# define LZO_INFO_MM "tiny" +#else +# error "unknown memory model" +#endif +#endif +#if defined(SIZEOF_SHORT) +# define LZO_SIZEOF_SHORT (SIZEOF_SHORT) +#endif +#if defined(SIZEOF_INT) +# define LZO_SIZEOF_INT (SIZEOF_INT) +#endif +#if defined(SIZEOF_LONG) +# define LZO_SIZEOF_LONG (SIZEOF_LONG) +#endif +#if defined(SIZEOF_LONG_LONG) +# define LZO_SIZEOF_LONG_LONG (SIZEOF_LONG_LONG) +#endif +#if defined(SIZEOF___INT16) +# define LZO_SIZEOF___INT16 (SIZEOF___INT16) +#endif +#if defined(SIZEOF___INT32) +# define LZO_SIZEOF___INT32 (SIZEOF___INT32) +#endif +#if defined(SIZEOF___INT64) +# define LZO_SIZEOF___INT64 (SIZEOF___INT64) +#endif +#if defined(SIZEOF_VOID_P) +# define LZO_SIZEOF_VOID_P (SIZEOF_VOID_P) +#endif +#if defined(SIZEOF_SIZE_T) +# define LZO_SIZEOF_SIZE_T (SIZEOF_SIZE_T) +#endif +#if defined(SIZEOF_PTRDIFF_T) +# define LZO_SIZEOF_PTRDIFF_T (SIZEOF_PTRDIFF_T) +#endif +#define __LZO_LSR(x,b) (((x)+0ul) >> (b)) +#if !defined(LZO_SIZEOF_SHORT) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_SHORT 8 +# elif (USHRT_MAX == LZO_0xffffL) +# define LZO_SIZEOF_SHORT 2 +# elif (__LZO_LSR(USHRT_MAX,7) == 1) +# define LZO_SIZEOF_SHORT 1 +# elif (__LZO_LSR(USHRT_MAX,15) == 1) +# define LZO_SIZEOF_SHORT 2 +# elif (__LZO_LSR(USHRT_MAX,31) == 1) +# define LZO_SIZEOF_SHORT 4 +# elif (__LZO_LSR(USHRT_MAX,63) == 1) +# define LZO_SIZEOF_SHORT 8 +# elif (__LZO_LSR(USHRT_MAX,127) == 1) +# define LZO_SIZEOF_SHORT 16 +# else +# error "LZO_SIZEOF_SHORT" +# endif +#endif +#if !defined(LZO_SIZEOF_INT) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_INT 8 +# elif (UINT_MAX == LZO_0xffffL) +# define LZO_SIZEOF_INT 2 +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_SIZEOF_INT 4 +# elif (__LZO_LSR(UINT_MAX,7) == 1) +# define LZO_SIZEOF_INT 1 +# elif (__LZO_LSR(UINT_MAX,15) == 1) +# define LZO_SIZEOF_INT 2 +# elif (__LZO_LSR(UINT_MAX,31) == 1) +# define LZO_SIZEOF_INT 4 +# elif (__LZO_LSR(UINT_MAX,63) == 1) +# define LZO_SIZEOF_INT 8 +# elif (__LZO_LSR(UINT_MAX,127) == 1) +# define LZO_SIZEOF_INT 16 +# else +# error "LZO_SIZEOF_INT" +# endif +#endif +#if !defined(LZO_SIZEOF_LONG) +# if (ULONG_MAX == LZO_0xffffffffL) +# define LZO_SIZEOF_LONG 4 +# elif (__LZO_LSR(ULONG_MAX,7) == 1) +# define LZO_SIZEOF_LONG 1 +# elif (__LZO_LSR(ULONG_MAX,15) == 1) +# define LZO_SIZEOF_LONG 2 +# elif (__LZO_LSR(ULONG_MAX,31) == 1) +# define LZO_SIZEOF_LONG 4 +# elif (__LZO_LSR(ULONG_MAX,63) == 1) +# define LZO_SIZEOF_LONG 8 +# elif (__LZO_LSR(ULONG_MAX,127) == 1) +# define LZO_SIZEOF_LONG 16 +# else +# error "LZO_SIZEOF_LONG" +# endif +#endif +#if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) +#if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) +# if defined(__LONG_MAX__) && defined(__LONG_LONG_MAX__) +# if (LZO_CC_GNUC >= 0x030300ul) +# if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0) +# define LZO_SIZEOF_LONG_LONG LZO_SIZEOF_LONG +# elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1) +# define LZO_SIZEOF_LONG_LONG 4 +# endif +# endif +# endif +#endif +#endif +#if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) +#if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) +#if (LZO_ARCH_I086 && LZO_CC_DMC) +#elif (LZO_CC_CILLY) && defined(__GNUC__) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define LZO_SIZEOF_LONG_LONG 8 +#elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400)) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_OS_WIN64 || defined(_WIN64)) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_ARCH_I386 && (LZO_CC_DMC)) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_SYMANTECC && (__SC__ >= 0x700))) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__))) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC)) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC)) +# define LZO_SIZEOF___INT64 8 +#elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC)) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520))) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_ARCH_I386 && (LZO_CC_WATCOMC && (__WATCOMC__ >= 1100))) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64)) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_CC_SDCC) && (LZO_SIZEOF_INT == 2) +#elif 1 && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# define LZO_SIZEOF_LONG_LONG 8 +#endif +#endif +#endif +#if defined(__cplusplus) && (LZO_CC_GNUC) +# if (LZO_CC_GNUC < 0x020800ul) +# undef LZO_SIZEOF_LONG_LONG +# endif +#endif +#if (LZO_CFG_NO_LONG_LONG) || defined(__NO_LONG_LONG) +# undef LZO_SIZEOF_LONG_LONG +#endif +#if !defined(LZO_SIZEOF_VOID_P) +#if (LZO_ARCH_I086) +# define __LZO_WORDSIZE 2 +# if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM) +# define LZO_SIZEOF_VOID_P 2 +# elif (LZO_MM_COMPACT || LZO_MM_LARGE || LZO_MM_HUGE) +# define LZO_SIZEOF_VOID_P 4 +# else +# error "LZO_MM" +# endif +#elif (LZO_ARCH_AVR || LZO_ARCH_Z80) +# define __LZO_WORDSIZE 1 +# define LZO_SIZEOF_VOID_P 2 +#elif (LZO_ARCH_C166 || LZO_ARCH_MCS51 || LZO_ARCH_MCS251 || LZO_ARCH_MSP430) +# define LZO_SIZEOF_VOID_P 2 +#elif (LZO_ARCH_H8300) +# if defined(__NORMAL_MODE__) +# define __LZO_WORDSIZE 4 +# define LZO_SIZEOF_VOID_P 2 +# elif defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) +# define __LZO_WORDSIZE 4 +# define LZO_SIZEOF_VOID_P 4 +# else +# define __LZO_WORDSIZE 2 +# define LZO_SIZEOF_VOID_P 2 +# endif +# if (LZO_CC_GNUC && (LZO_CC_GNUC < 0x040000ul)) && (LZO_SIZEOF_INT == 4) +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_INT +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_INT +# endif +#elif (LZO_ARCH_M16C) +# define __LZO_WORDSIZE 2 +# if defined(__m32c_cpu__) || defined(__m32cm_cpu__) +# define LZO_SIZEOF_VOID_P 4 +# else +# define LZO_SIZEOF_VOID_P 2 +# endif +#elif (LZO_SIZEOF_LONG == 8) && ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) +# define __LZO_WORDSIZE 8 +# define LZO_SIZEOF_VOID_P 4 +#elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64) +# define __LZO_WORDSIZE 8 +# define LZO_SIZEOF_VOID_P 8 +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) +# define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (LZO_OS_OS400 || defined(__OS400__)) +# define __LZO_WORDSIZE LZO_SIZEOF_LONG +# define LZO_SIZEOF_VOID_P 16 +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) +# define LZO_SIZEOF_VOID_P 8 +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (LZO_ARCH_SPU) +# if 0 +# define __LZO_WORDSIZE 16 +# endif +# define LZO_SIZEOF_VOID_P 4 +#else +# define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG +#endif +#endif +#if !defined(LZO_WORDSIZE) +# if defined(__LZO_WORDSIZE) +# define LZO_WORDSIZE __LZO_WORDSIZE +# else +# define LZO_WORDSIZE LZO_SIZEOF_VOID_P +# endif +#endif +#if !defined(LZO_SIZEOF_SIZE_T) +#if (LZO_ARCH_I086 || LZO_ARCH_M16C) +# define LZO_SIZEOF_SIZE_T 2 +#else +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_VOID_P +#endif +#endif +#if !defined(LZO_SIZEOF_PTRDIFF_T) +#if (LZO_ARCH_I086) +# if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM || LZO_MM_HUGE) +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_VOID_P +# elif (LZO_MM_COMPACT || LZO_MM_LARGE) +# if (LZO_CC_BORLANDC || LZO_CC_TURBOC) +# define LZO_SIZEOF_PTRDIFF_T 4 +# else +# define LZO_SIZEOF_PTRDIFF_T 2 +# endif +# else +# error "LZO_MM" +# endif +#else +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_SIZE_T +#endif +#endif +#if (LZO_ABI_NEUTRAL_ENDIAN) +# undef LZO_ABI_BIG_ENDIAN +# undef LZO_ABI_LITTLE_ENDIAN +#elif !(LZO_ABI_BIG_ENDIAN) && !(LZO_ABI_LITTLE_ENDIAN) +#if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP) +# define LZO_ABI_BIG_ENDIAN 1 +#elif (LZO_ARCH_IA64) && (LZO_OS_POSIX_LINUX || LZO_OS_WIN64) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif (LZO_ARCH_AVR32 || LZO_ARCH_M68K || LZO_ARCH_S390) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__) +# if (__LITTLE_ENDIAN__ == 1) +# define LZO_ABI_LITTLE_ENDIAN 1 +# else +# define LZO_ABI_BIG_ENDIAN 1 +# endif +#elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__) +# define LZO_ABI_LITTLE_ENDIAN 1 +#endif +#endif +#if (LZO_ABI_BIG_ENDIAN) && (LZO_ABI_LITTLE_ENDIAN) +# error "this should not happen" +#endif +#if (LZO_ABI_BIG_ENDIAN) +# define LZO_INFO_ABI_ENDIAN "be" +#elif (LZO_ABI_LITTLE_ENDIAN) +# define LZO_INFO_ABI_ENDIAN "le" +#elif (LZO_ABI_NEUTRAL_ENDIAN) +# define LZO_INFO_ABI_ENDIAN "neutral" +#endif +#if (LZO_SIZEOF_INT == 1 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) +# define LZO_ABI_I8LP16 1 +# define LZO_INFO_ABI_PM "i8lp16" +#elif (LZO_SIZEOF_INT == 2 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) +# define LZO_ABI_ILP16 1 +# define LZO_INFO_ABI_PM "ilp16" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 4) +# define LZO_ABI_ILP32 1 +# define LZO_INFO_ABI_PM "ilp32" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 8 && LZO_SIZEOF_SIZE_T == 8) +# define LZO_ABI_LLP64 1 +# define LZO_INFO_ABI_PM "llp64" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) +# define LZO_ABI_LP64 1 +# define LZO_INFO_ABI_PM "lp64" +#elif (LZO_SIZEOF_INT == 8 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) +# define LZO_ABI_ILP64 1 +# define LZO_INFO_ABI_PM "ilp64" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 4) +# define LZO_ABI_IP32L64 1 +# define LZO_INFO_ABI_PM "ip32l64" +#endif +#if !defined(__LZO_LIBC_OVERRIDE) +#if (LZO_LIBC_NAKED) +# define LZO_INFO_LIBC "naked" +#elif (LZO_LIBC_FREESTANDING) +# define LZO_INFO_LIBC "freestanding" +#elif (LZO_LIBC_MOSTLY_FREESTANDING) +# define LZO_INFO_LIBC "mfreestanding" +#elif (LZO_LIBC_ISOC90) +# define LZO_INFO_LIBC "isoc90" +#elif (LZO_LIBC_ISOC99) +# define LZO_INFO_LIBC "isoc99" +#elif defined(__dietlibc__) +# define LZO_LIBC_DIETLIBC 1 +# define LZO_INFO_LIBC "dietlibc" +#elif defined(_NEWLIB_VERSION) +# define LZO_LIBC_NEWLIB 1 +# define LZO_INFO_LIBC "newlib" +#elif defined(__UCLIBC__) && defined(__UCLIBC_MAJOR__) && defined(__UCLIBC_MINOR__) +# if defined(__UCLIBC_SUBLEVEL__) +# define LZO_LIBC_UCLIBC (__UCLIBC_MAJOR__ * 0x10000L + __UCLIBC_MINOR__ * 0x100 + __UCLIBC_SUBLEVEL__) +# else +# define LZO_LIBC_UCLIBC 0x00090bL +# endif +# define LZO_INFO_LIBC "uclibc" +#elif defined(__GLIBC__) && defined(__GLIBC_MINOR__) +# define LZO_LIBC_GLIBC (__GLIBC__ * 0x10000L + __GLIBC_MINOR__ * 0x100) +# define LZO_INFO_LIBC "glibc" +#elif (LZO_CC_MWERKS) && defined(__MSL__) +# define LZO_LIBC_MSL __MSL__ +# define LZO_INFO_LIBC "msl" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_LIBC_ISOC90 1 +# define LZO_INFO_LIBC "isoc90" +#else +# define LZO_LIBC_DEFAULT 1 +# define LZO_INFO_LIBC "default" +#endif +#endif +#if !defined(__lzo_gnuc_extension__) +#if (LZO_CC_GNUC >= 0x020800ul) +# define __lzo_gnuc_extension__ __extension__ +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_gnuc_extension__ __extension__ +#else +# define __lzo_gnuc_extension__ /*empty*/ +#endif +#endif +#if !defined(__lzo_ua_volatile) +# define __lzo_ua_volatile volatile +#endif +#if !defined(__lzo_alignof) +#if (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) +# define __lzo_alignof(e) __alignof__(e) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700)) +# define __lzo_alignof(e) __alignof__(e) +#elif (LZO_CC_MSC && (_MSC_VER >= 1300)) +# define __lzo_alignof(e) __alignof(e) +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_alignof(e) __alignof__(e) +#endif +#endif +#if defined(__lzo_alignof) +# define __lzo_HAVE_alignof 1 +#endif +#if !defined(__lzo_constructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_constructor __attribute__((__constructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_constructor __attribute__((__constructor__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_constructor __attribute__((__constructor__)) +#endif +#endif +#if defined(__lzo_constructor) +# define __lzo_HAVE_constructor 1 +#endif +#if !defined(__lzo_destructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_destructor __attribute__((__destructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_destructor __attribute__((__destructor__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_destructor __attribute__((__destructor__)) +#endif +#endif +#if defined(__lzo_destructor) +# define __lzo_HAVE_destructor 1 +#endif +#if (__lzo_HAVE_destructor) && !(__lzo_HAVE_constructor) +# error "this should not happen" +#endif +#if !defined(__lzo_inline) +#if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295)) +#elif defined(__cplusplus) +# define __lzo_inline inline +#elif (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0550)) +# define __lzo_inline __inline +#elif (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) +# define __lzo_inline __inline__ +#elif (LZO_CC_DMC) +# define __lzo_inline __inline +#elif (LZO_CC_INTELC) +# define __lzo_inline __inline +#elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x2405)) +# define __lzo_inline __inline +#elif (LZO_CC_MSC && (_MSC_VER >= 900)) +# define __lzo_inline __inline +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_inline __inline__ +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# define __lzo_inline inline +#endif +#endif +#if defined(__lzo_inline) +# define __lzo_HAVE_inline 1 +#else +# define __lzo_inline /*empty*/ +#endif +#if !defined(__lzo_forceinline) +#if (LZO_CC_GNUC >= 0x030200ul) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) +# define __lzo_forceinline __forceinline +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) +# define __lzo_forceinline __forceinline +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#endif +#endif +#if defined(__lzo_forceinline) +# define __lzo_HAVE_forceinline 1 +#else +# define __lzo_forceinline /*empty*/ +#endif +#if !defined(__lzo_noinline) +#if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul) +# define __lzo_noinline __attribute__((__noinline__,__used__)) +#elif (LZO_CC_GNUC >= 0x030200ul) +# define __lzo_noinline __attribute__((__noinline__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC) +# define __lzo_noinline __declspec(noinline) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) +# define __lzo_noinline __attribute__((__noinline__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_noinline __attribute__((__noinline__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1300)) +# define __lzo_noinline __declspec(noinline) +#elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x3200) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +# if defined(__cplusplus) +# else +# define __lzo_noinline __declspec(noinline) +# endif +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_noinline __attribute__((__noinline__)) +#endif +#endif +#if defined(__lzo_noinline) +# define __lzo_HAVE_noinline 1 +#else +# define __lzo_noinline /*empty*/ +#endif +#if (__lzo_HAVE_forceinline || __lzo_HAVE_noinline) && !(__lzo_HAVE_inline) +# error "this should not happen" +#endif +#if !defined(__lzo_noreturn) +#if (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_noreturn __attribute__((__noreturn__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) +# define __lzo_noreturn __declspec(noreturn) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) +# define __lzo_noreturn __attribute__((__noreturn__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_noreturn __attribute__((__noreturn__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) +# define __lzo_noreturn __declspec(noreturn) +#endif +#endif +#if defined(__lzo_noreturn) +# define __lzo_HAVE_noreturn 1 +#else +# define __lzo_noreturn /*empty*/ +#endif +#if !defined(__lzo_nothrow) +#if (LZO_CC_GNUC >= 0x030300ul) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 900) && LZO_CC_SYNTAX_GNUC) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#endif +#endif +#if defined(__lzo_nothrow) +# define __lzo_HAVE_nothrow 1 +#else +# define __lzo_nothrow /*empty*/ +#endif +#if !defined(__lzo_restrict) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_CLANG || LZO_CC_LLVM) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_MSC && (_MSC_VER >= 1400)) +# define __lzo_restrict __restrict +#endif +#endif +#if defined(__lzo_restrict) +# define __lzo_HAVE_restrict 1 +#else +# define __lzo_restrict /*empty*/ +#endif +#if !defined(__lzo_likely) && !defined(__lzo_unlikely) +#if (LZO_CC_GNUC >= 0x030200ul) +# define __lzo_likely(e) (__builtin_expect(!!(e),1)) +# define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) +# define __lzo_likely(e) (__builtin_expect(!!(e),1)) +# define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_likely(e) (__builtin_expect(!!(e),1)) +# define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#endif +#endif +#if defined(__lzo_likely) +# define __lzo_HAVE_likely 1 +#else +# define __lzo_likely(e) (e) +#endif +#if defined(__lzo_unlikely) +# define __lzo_HAVE_unlikely 1 +#else +# define __lzo_unlikely(e) (e) +#endif +#if !defined(LZO_UNUSED) +# if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) +# define LZO_UNUSED(var) ((void) &var) +# elif (LZO_CC_BORLANDC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PELLESC || LZO_CC_TURBOC) +# define LZO_UNUSED(var) if (&var) ; else +# elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define LZO_UNUSED(var) ((void) var) +# elif (LZO_CC_MSC && (_MSC_VER < 900)) +# define LZO_UNUSED(var) if (&var) ; else +# elif (LZO_CC_KEILC) +# define LZO_UNUSED(var) {extern int __lzo_unused[1-2*!(sizeof(var)>0)];} +# elif (LZO_CC_PACIFICC) +# define LZO_UNUSED(var) ((void) sizeof(var)) +# elif (LZO_CC_WATCOMC) && defined(__cplusplus) +# define LZO_UNUSED(var) ((void) var) +# else +# define LZO_UNUSED(var) ((void) &var) +# endif +#endif +#if !defined(LZO_UNUSED_FUNC) +# if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) +# define LZO_UNUSED_FUNC(func) ((void) func) +# elif (LZO_CC_BORLANDC || LZO_CC_NDPC || LZO_CC_TURBOC) +# define LZO_UNUSED_FUNC(func) if (func) ; else +# elif (LZO_CC_CLANG || LZO_CC_LLVM) +# define LZO_UNUSED_FUNC(func) ((void) &func) +# elif (LZO_CC_MSC && (_MSC_VER < 900)) +# define LZO_UNUSED_FUNC(func) if (func) ; else +# elif (LZO_CC_MSC) +# define LZO_UNUSED_FUNC(func) ((void) &func) +# elif (LZO_CC_KEILC || LZO_CC_PELLESC) +# define LZO_UNUSED_FUNC(func) {extern int __lzo_unused[1-2*!(sizeof((int)func)>0)];} +# else +# define LZO_UNUSED_FUNC(func) ((void) func) +# endif +#endif +#if !defined(LZO_UNUSED_LABEL) +# if (LZO_CC_WATCOMC) && defined(__cplusplus) +# define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l +# elif (LZO_CC_CLANG || LZO_CC_INTELC || LZO_CC_WATCOMC) +# define LZO_UNUSED_LABEL(l) if (0) goto l +# else +# define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l +# endif +#endif +#if !defined(LZO_DEFINE_UNINITIALIZED_VAR) +# if 0 +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var +# elif 0 && (LZO_CC_GNUC) +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var +# else +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init +# endif +#endif +#if !defined(LZO_UNCONST_CAST) +# if 0 && defined(__cplusplus) +# define LZO_UNCONST_CAST(t,e) (const_cast (e)) +# elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((lzo_uintptr_t) ((const void *) (e)))))) +# else +# define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((const void *) (e))))) +# endif +#endif +#if !defined(LZO_COMPILE_TIME_ASSERT_HEADER) +# if (LZO_CC_AZTECC || LZO_CC_ZORTECHC) +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; +# elif (LZO_CC_DMC || LZO_CC_SYMANTECC) +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1u-2*!(e)]; +# elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; +# else +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-2*!(e)]; +# endif +#endif +#if !defined(LZO_COMPILE_TIME_ASSERT) +# if (LZO_CC_AZTECC) +# define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-!(e)];} +# elif (LZO_CC_DMC || LZO_CC_PACIFICC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) +# define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; +# elif (LZO_CC_MSC && (_MSC_VER < 900)) +# define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; +# elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) +# define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; +# else +# define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-2*!(e)];} +# endif +#endif +#if (LZO_ARCH_I086 || LZO_ARCH_I386) && (LZO_OS_DOS16 || LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_OS216 || LZO_OS_WIN16 || LZO_OS_WIN32 || LZO_OS_WIN64) +# if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC) +# elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) +# define __lzo_cdecl __cdecl +# define __lzo_cdecl_atexit /*empty*/ +# define __lzo_cdecl_main __cdecl +# if (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) +# define __lzo_cdecl_qsort __pascal +# elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) +# define __lzo_cdecl_qsort _stdcall +# else +# define __lzo_cdecl_qsort __cdecl +# endif +# elif (LZO_CC_WATCOMC) +# define __lzo_cdecl __cdecl +# else +# define __lzo_cdecl __cdecl +# define __lzo_cdecl_atexit __cdecl +# define __lzo_cdecl_main __cdecl +# define __lzo_cdecl_qsort __cdecl +# endif +# if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC || LZO_CC_WATCOMC) +# elif (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) +# define __lzo_cdecl_sighandler __pascal +# elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) +# define __lzo_cdecl_sighandler _stdcall +# elif (LZO_CC_MSC && (_MSC_VER >= 1400)) && defined(_M_CEE_PURE) +# define __lzo_cdecl_sighandler __clrcall +# elif (LZO_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700)) +# if defined(_DLL) +# define __lzo_cdecl_sighandler _far _cdecl _loadds +# elif defined(_MT) +# define __lzo_cdecl_sighandler _far _cdecl +# else +# define __lzo_cdecl_sighandler _cdecl +# endif +# else +# define __lzo_cdecl_sighandler __cdecl +# endif +#elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC) +# define __lzo_cdecl __cdecl +#elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC)) +# define __lzo_cdecl cdecl +#endif +#if !defined(__lzo_cdecl) +# define __lzo_cdecl /*empty*/ +#endif +#if !defined(__lzo_cdecl_atexit) +# define __lzo_cdecl_atexit /*empty*/ +#endif +#if !defined(__lzo_cdecl_main) +# define __lzo_cdecl_main /*empty*/ +#endif +#if !defined(__lzo_cdecl_qsort) +# define __lzo_cdecl_qsort /*empty*/ +#endif +#if !defined(__lzo_cdecl_sighandler) +# define __lzo_cdecl_sighandler /*empty*/ +#endif +#if !defined(__lzo_cdecl_va) +# define __lzo_cdecl_va __lzo_cdecl +#endif +#if !(LZO_CFG_NO_WINDOWS_H) +#if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64) +# if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000)) +# elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__) +# elif ((LZO_OS_CYGWIN || defined(__MINGW32__)) && (LZO_CC_GNUC && (LZO_CC_GNUC < 0x025f00ul))) +# else +# define LZO_HAVE_WINDOWS_H 1 +# endif +#endif +#endif +#if (LZO_ARCH_ALPHA) +# define LZO_OPT_AVOID_UINT_INDEX 1 +# define LZO_OPT_AVOID_SHORT 1 +# define LZO_OPT_AVOID_USHORT 1 +#elif (LZO_ARCH_AMD64) +# define LZO_OPT_AVOID_INT_INDEX 1 +# define LZO_OPT_AVOID_UINT_INDEX 1 +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# define LZO_OPT_UNALIGNED64 1 +#elif (LZO_ARCH_ARM && LZO_ARCH_ARM_THUMB) +#elif (LZO_ARCH_ARM) +# define LZO_OPT_AVOID_SHORT 1 +# define LZO_OPT_AVOID_USHORT 1 +#elif (LZO_ARCH_CRIS) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +#elif (LZO_ARCH_I386) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +#elif (LZO_ARCH_IA64) +# define LZO_OPT_AVOID_INT_INDEX 1 +# define LZO_OPT_AVOID_UINT_INDEX 1 +# define LZO_OPT_PREFER_POSTINC 1 +#elif (LZO_ARCH_M68K) +# define LZO_OPT_PREFER_POSTINC 1 +# define LZO_OPT_PREFER_PREDEC 1 +# if defined(__mc68020__) && !defined(__mcoldfire__) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# endif +#elif (LZO_ARCH_MIPS) +# define LZO_OPT_AVOID_UINT_INDEX 1 +#elif (LZO_ARCH_POWERPC) +# define LZO_OPT_PREFER_PREINC 1 +# define LZO_OPT_PREFER_PREDEC 1 +# if (LZO_ABI_BIG_ENDIAN) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# endif +#elif (LZO_ARCH_S390) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# if (LZO_SIZEOF_SIZE_T == 8) +# define LZO_OPT_UNALIGNED64 1 +# endif +#elif (LZO_ARCH_SH) +# define LZO_OPT_PREFER_POSTINC 1 +# define LZO_OPT_PREFER_PREDEC 1 +#endif +#ifndef LZO_CFG_NO_INLINE_ASM +#if (LZO_CC_LLVM) +# define LZO_CFG_NO_INLINE_ASM 1 +#endif +#endif +#ifndef LZO_CFG_NO_UNALIGNED +#if (LZO_ABI_NEUTRAL_ENDIAN) || (LZO_ARCH_GENERIC) +# define LZO_CFG_NO_UNALIGNED 1 +#endif +#endif +#if (LZO_CFG_NO_UNALIGNED) +# undef LZO_OPT_UNALIGNED16 +# undef LZO_OPT_UNALIGNED32 +# undef LZO_OPT_UNALIGNED64 +#endif +#if (LZO_CFG_NO_INLINE_ASM) +#elif (LZO_ARCH_I386 && (LZO_OS_DOS32 || LZO_OS_WIN32) && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) +# define LZO_ASM_SYNTAX_MSC 1 +#elif (LZO_OS_WIN64 && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) +#elif (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC == 0x011f00ul)) +#elif (LZO_ARCH_I386 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) +# define LZO_ASM_SYNTAX_GNUC 1 +#elif (LZO_ARCH_AMD64 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) +# define LZO_ASM_SYNTAX_GNUC 1 +#endif +#if (LZO_ASM_SYNTAX_GNUC) +#if (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC < 0x020000ul)) +# define __LZO_ASM_CLOBBER "ax" +#elif (LZO_CC_INTELC) +# define __LZO_ASM_CLOBBER "memory" +#else +# define __LZO_ASM_CLOBBER "cc", "memory" +#endif +#endif +#if defined(__LZO_INFOSTR_MM) +#elif (LZO_MM_FLAT) && (defined(__LZO_INFOSTR_PM) || defined(LZO_INFO_ABI_PM)) +# define __LZO_INFOSTR_MM "" +#elif defined(LZO_INFO_MM) +# define __LZO_INFOSTR_MM "." LZO_INFO_MM +#else +# define __LZO_INFOSTR_MM "" +#endif +#if defined(__LZO_INFOSTR_PM) +#elif defined(LZO_INFO_ABI_PM) +# define __LZO_INFOSTR_PM "." LZO_INFO_ABI_PM +#else +# define __LZO_INFOSTR_PM "" +#endif +#if defined(__LZO_INFOSTR_ENDIAN) +#elif defined(LZO_INFO_ABI_ENDIAN) +# define __LZO_INFOSTR_ENDIAN "." LZO_INFO_ABI_ENDIAN +#else +# define __LZO_INFOSTR_ENDIAN "" +#endif +#if defined(__LZO_INFOSTR_OSNAME) +#elif defined(LZO_INFO_OS_CONSOLE) +# define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_CONSOLE +#elif defined(LZO_INFO_OS_POSIX) +# define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_POSIX +#else +# define __LZO_INFOSTR_OSNAME LZO_INFO_OS +#endif +#if defined(__LZO_INFOSTR_LIBC) +#elif defined(LZO_INFO_LIBC) +# define __LZO_INFOSTR_LIBC "." LZO_INFO_LIBC +#else +# define __LZO_INFOSTR_LIBC "" +#endif +#if defined(__LZO_INFOSTR_CCVER) +#elif defined(LZO_INFO_CCVER) +# define __LZO_INFOSTR_CCVER " " LZO_INFO_CCVER +#else +# define __LZO_INFOSTR_CCVER "" +#endif +#define LZO_INFO_STRING \ + LZO_INFO_ARCH __LZO_INFOSTR_MM __LZO_INFOSTR_PM __LZO_INFOSTR_ENDIAN \ + " " __LZO_INFOSTR_OSNAME __LZO_INFOSTR_LIBC " " LZO_INFO_CC __LZO_INFOSTR_CCVER + +#endif /* already included */ + +/* vim:set ts=4 et: */ diff --git a/Mednafen/mednafen/compress/minilzo.c b/Mednafen/mednafen/compress/minilzo.c new file mode 100644 index 0000000000..34ce0f090b --- /dev/null +++ b/Mednafen/mednafen/compress/minilzo.c @@ -0,0 +1,4579 @@ +/* minilzo.c -- mini subset of the LZO real-time data compression library + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2011 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + The LZO library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + + http://www.oberhumer.com/opensource/lzo/ + */ + +/* + * NOTE: + * the full LZO package can be found at + * http://www.oberhumer.com/opensource/lzo/ + */ + +#define __LZO_IN_MINILZO 1 + +#if defined(LZO_CFG_FREESTANDING) +# undef MINILZO_HAVE_CONFIG_H +# define LZO_LIBC_FREESTANDING 1 +# define LZO_OS_FREESTANDING 1 +#endif + +#ifdef MINILZO_HAVE_CONFIG_H +# include +#endif +#include +#include +#if defined(MINILZO_CFG_USE_INTERNAL_LZODEFS) + +#ifndef __LZODEFS_H_INCLUDED +#define __LZODEFS_H_INCLUDED 1 + +#if defined(__CYGWIN32__) && !defined(__CYGWIN__) +# define __CYGWIN__ __CYGWIN32__ +#endif +#if defined(__IBMCPP__) && !defined(__IBMC__) +# define __IBMC__ __IBMCPP__ +#endif +#if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER) +# define __INTEL_COMPILER __ICL +#endif +#if 1 && defined(__INTERIX) && defined(__GNUC__) && !defined(_ALL_SOURCE) +# define _ALL_SOURCE 1 +#endif +#if defined(__mips__) && defined(__R5900__) +# if !defined(__LONG_MAX__) +# define __LONG_MAX__ 9223372036854775807L +# endif +#endif +#if defined(__INTEL_COMPILER) && defined(__linux__) +# pragma warning(disable: 193) +#endif +#if defined(__KEIL__) && defined(__C166__) +# pragma warning disable = 322 +#elif 0 && defined(__C251__) +# pragma warning disable = 322 +#endif +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__MWERKS__) +# if (_MSC_VER >= 1300) +# pragma warning(disable: 4668) +# endif +#endif +#if 0 && defined(__WATCOMC__) +# if (__WATCOMC__ >= 1050) && (__WATCOMC__ < 1060) +# pragma warning 203 9 +# endif +#endif +#if defined(__BORLANDC__) && defined(__MSDOS__) && !defined(__FLAT__) +# pragma option -h +#endif +#if 0 +#define LZO_0xffffL 0xfffful +#define LZO_0xffffffffL 0xfffffffful +#else +#define LZO_0xffffL 65535ul +#define LZO_0xffffffffL 4294967295ul +#endif +#if (LZO_0xffffL == LZO_0xffffffffL) +# error "your preprocessor is broken 1" +#endif +#if (16ul * 16384ul != 262144ul) +# error "your preprocessor is broken 2" +#endif +#if 0 +#if (32767 >= 4294967295ul) +# error "your preprocessor is broken 3" +#endif +#if (65535u >= 4294967295ul) +# error "your preprocessor is broken 4" +#endif +#endif +#if (UINT_MAX == LZO_0xffffL) +#if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__) +# if !defined(MSDOS) +# define MSDOS 1 +# endif +# if !defined(_MSDOS) +# define _MSDOS 1 +# endif +#elif 0 && defined(__VERSION) && defined(MB_LEN_MAX) +# if (__VERSION == 520) && (MB_LEN_MAX == 1) +# if !defined(__AZTEC_C__) +# define __AZTEC_C__ __VERSION +# endif +# if !defined(__DOS__) +# define __DOS__ 1 +# endif +# endif +#endif +#endif +#if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == LZO_0xffffL) +# define ptrdiff_t long +# define _PTRDIFF_T_DEFINED 1 +#endif +#if (UINT_MAX == LZO_0xffffL) +# undef __LZO_RENAME_A +# undef __LZO_RENAME_B +# if defined(__AZTEC_C__) && defined(__DOS__) +# define __LZO_RENAME_A 1 +# elif defined(_MSC_VER) && defined(MSDOS) +# if (_MSC_VER < 600) +# define __LZO_RENAME_A 1 +# elif (_MSC_VER < 700) +# define __LZO_RENAME_B 1 +# endif +# elif defined(__TSC__) && defined(__OS2__) +# define __LZO_RENAME_A 1 +# elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410) +# define __LZO_RENAME_A 1 +# elif defined(__PACIFIC__) && defined(DOS) +# if !defined(__far) +# define __far far +# endif +# if !defined(__near) +# define __near near +# endif +# endif +# if defined(__LZO_RENAME_A) +# if !defined(__cdecl) +# define __cdecl cdecl +# endif +# if !defined(__far) +# define __far far +# endif +# if !defined(__huge) +# define __huge huge +# endif +# if !defined(__near) +# define __near near +# endif +# if !defined(__pascal) +# define __pascal pascal +# endif +# if !defined(__huge) +# define __huge huge +# endif +# elif defined(__LZO_RENAME_B) +# if !defined(__cdecl) +# define __cdecl _cdecl +# endif +# if !defined(__far) +# define __far _far +# endif +# if !defined(__huge) +# define __huge _huge +# endif +# if !defined(__near) +# define __near _near +# endif +# if !defined(__pascal) +# define __pascal _pascal +# endif +# elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) +# if !defined(__cdecl) +# define __cdecl cdecl +# endif +# if !defined(__pascal) +# define __pascal pascal +# endif +# endif +# undef __LZO_RENAME_A +# undef __LZO_RENAME_B +#endif +#if (UINT_MAX == LZO_0xffffL) +#if defined(__AZTEC_C__) && defined(__DOS__) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +#elif defined(_MSC_VER) && defined(MSDOS) +# if (_MSC_VER < 600) +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +# endif +# if (_MSC_VER < 700) +# define LZO_BROKEN_INTEGRAL_PROMOTION 1 +# define LZO_BROKEN_SIZEOF 1 +# endif +#elif defined(__PACIFIC__) && defined(DOS) +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +#elif defined(__TURBOC__) && defined(__MSDOS__) +# if (__TURBOC__ < 0x0150) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +# define LZO_BROKEN_INTEGRAL_PROMOTION 1 +# endif +# if (__TURBOC__ < 0x0200) +# define LZO_BROKEN_SIZEOF 1 +# endif +# if (__TURBOC__ < 0x0400) && defined(__cplusplus) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +# endif +#elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) +# define LZO_BROKEN_CDECL_ALT_SYNTAX 1 +# define LZO_BROKEN_SIZEOF 1 +#endif +#endif +#if defined(__WATCOMC__) && (__WATCOMC__ < 900) +# define LZO_BROKEN_INTEGRAL_CONSTANTS 1 +#endif +#if defined(_CRAY) && defined(_CRAY1) +# define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1 +#endif +#define LZO_PP_STRINGIZE(x) #x +#define LZO_PP_MACRO_EXPAND(x) LZO_PP_STRINGIZE(x) +#define LZO_PP_CONCAT2(a,b) a ## b +#define LZO_PP_CONCAT3(a,b,c) a ## b ## c +#define LZO_PP_CONCAT4(a,b,c,d) a ## b ## c ## d +#define LZO_PP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e +#define LZO_PP_ECONCAT2(a,b) LZO_PP_CONCAT2(a,b) +#define LZO_PP_ECONCAT3(a,b,c) LZO_PP_CONCAT3(a,b,c) +#define LZO_PP_ECONCAT4(a,b,c,d) LZO_PP_CONCAT4(a,b,c,d) +#define LZO_PP_ECONCAT5(a,b,c,d,e) LZO_PP_CONCAT5(a,b,c,d,e) +#if 1 +#define LZO_CPP_STRINGIZE(x) #x +#define LZO_CPP_MACRO_EXPAND(x) LZO_CPP_STRINGIZE(x) +#define LZO_CPP_CONCAT2(a,b) a ## b +#define LZO_CPP_CONCAT3(a,b,c) a ## b ## c +#define LZO_CPP_CONCAT4(a,b,c,d) a ## b ## c ## d +#define LZO_CPP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e +#define LZO_CPP_ECONCAT2(a,b) LZO_CPP_CONCAT2(a,b) +#define LZO_CPP_ECONCAT3(a,b,c) LZO_CPP_CONCAT3(a,b,c) +#define LZO_CPP_ECONCAT4(a,b,c,d) LZO_CPP_CONCAT4(a,b,c,d) +#define LZO_CPP_ECONCAT5(a,b,c,d,e) LZO_CPP_CONCAT5(a,b,c,d,e) +#endif +#define __LZO_MASK_GEN(o,b) (((((o) << ((b)-1)) - (o)) << 1) + (o)) +#if 1 && defined(__cplusplus) +# if !defined(__STDC_CONSTANT_MACROS) +# define __STDC_CONSTANT_MACROS 1 +# endif +# if !defined(__STDC_LIMIT_MACROS) +# define __STDC_LIMIT_MACROS 1 +# endif +#endif +#if defined(__cplusplus) +# define LZO_EXTERN_C extern "C" +#else +# define LZO_EXTERN_C extern +#endif +#if !defined(__LZO_OS_OVERRIDE) +#if (LZO_OS_FREESTANDING) +# define LZO_INFO_OS "freestanding" +#elif (LZO_OS_EMBEDDED) +# define LZO_INFO_OS "embedded" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_OS_EMBEDDED 1 +# define LZO_INFO_OS "embedded" +#elif defined(__CYGWIN__) && defined(__GNUC__) +# define LZO_OS_CYGWIN 1 +# define LZO_INFO_OS "cygwin" +#elif defined(__EMX__) && defined(__GNUC__) +# define LZO_OS_EMX 1 +# define LZO_INFO_OS "emx" +#elif defined(__BEOS__) +# define LZO_OS_BEOS 1 +# define LZO_INFO_OS "beos" +#elif defined(__Lynx__) +# define LZO_OS_LYNXOS 1 +# define LZO_INFO_OS "lynxos" +#elif defined(__OS400__) +# define LZO_OS_OS400 1 +# define LZO_INFO_OS "os400" +#elif defined(__QNX__) +# define LZO_OS_QNX 1 +# define LZO_INFO_OS "qnx" +#elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460) +# define LZO_OS_DOS32 1 +# define LZO_INFO_OS "dos32" +#elif defined(__BORLANDC__) && defined(__DPMI16__) +# define LZO_OS_DOS16 1 +# define LZO_INFO_OS "dos16" +#elif defined(__ZTC__) && defined(DOS386) +# define LZO_OS_DOS32 1 +# define LZO_INFO_OS "dos32" +#elif defined(__OS2__) || defined(__OS2V2__) +# if (UINT_MAX == LZO_0xffffL) +# define LZO_OS_OS216 1 +# define LZO_INFO_OS "os216" +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_OS_OS2 1 +# define LZO_INFO_OS "os2" +# else +# error "check your limits.h header" +# endif +#elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64) +# define LZO_OS_WIN64 1 +# define LZO_INFO_OS "win64" +#elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +#elif defined(__MWERKS__) && defined(__INTEL__) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +#elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows) +# if (UINT_MAX == LZO_0xffffL) +# define LZO_OS_WIN16 1 +# define LZO_INFO_OS "win16" +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +# else +# error "check your limits.h header" +# endif +#elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS)) +# if (UINT_MAX == LZO_0xffffL) +# define LZO_OS_DOS16 1 +# define LZO_INFO_OS "dos16" +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_OS_DOS32 1 +# define LZO_INFO_OS "dos32" +# else +# error "check your limits.h header" +# endif +#elif defined(__WATCOMC__) +# if defined(__NT__) && (UINT_MAX == LZO_0xffffL) +# define LZO_OS_DOS16 1 +# define LZO_INFO_OS "dos16" +# elif defined(__NT__) && (__WATCOMC__ < 1100) +# define LZO_OS_WIN32 1 +# define LZO_INFO_OS "win32" +# elif defined(__linux__) || defined(__LINUX__) +# define LZO_OS_POSIX 1 +# define LZO_INFO_OS "posix" +# else +# error "please specify a target using the -bt compiler option" +# endif +#elif defined(__palmos__) +# define LZO_OS_PALMOS 1 +# define LZO_INFO_OS "palmos" +#elif defined(__TOS__) || defined(__atarist__) +# define LZO_OS_TOS 1 +# define LZO_INFO_OS "tos" +#elif defined(macintosh) && !defined(__ppc__) +# define LZO_OS_MACCLASSIC 1 +# define LZO_INFO_OS "macclassic" +#elif defined(__VMS) +# define LZO_OS_VMS 1 +# define LZO_INFO_OS "vms" +#elif ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) +# define LZO_OS_CONSOLE 1 +# define LZO_OS_CONSOLE_PS2 1 +# define LZO_INFO_OS "console" +# define LZO_INFO_OS_CONSOLE "ps2" +#elif (defined(__mips__) && defined(__psp__)) +# define LZO_OS_CONSOLE 1 +# define LZO_OS_CONSOLE_PSP 1 +# define LZO_INFO_OS "console" +# define LZO_INFO_OS_CONSOLE "psp" +#else +# define LZO_OS_POSIX 1 +# define LZO_INFO_OS "posix" +#endif +#if (LZO_OS_POSIX) +# if defined(_AIX) || defined(__AIX__) || defined(__aix__) +# define LZO_OS_POSIX_AIX 1 +# define LZO_INFO_OS_POSIX "aix" +# elif defined(__FreeBSD__) +# define LZO_OS_POSIX_FREEBSD 1 +# define LZO_INFO_OS_POSIX "freebsd" +# elif defined(__hpux__) || defined(__hpux) +# define LZO_OS_POSIX_HPUX 1 +# define LZO_INFO_OS_POSIX "hpux" +# elif defined(__INTERIX) +# define LZO_OS_POSIX_INTERIX 1 +# define LZO_INFO_OS_POSIX "interix" +# elif defined(__IRIX__) || defined(__irix__) +# define LZO_OS_POSIX_IRIX 1 +# define LZO_INFO_OS_POSIX "irix" +# elif defined(__linux__) || defined(__linux) || defined(__LINUX__) +# define LZO_OS_POSIX_LINUX 1 +# define LZO_INFO_OS_POSIX "linux" +# elif defined(__APPLE__) || defined(__MACOS__) +# define LZO_OS_POSIX_MACOSX 1 +# define LZO_INFO_OS_POSIX "macosx" +# elif defined(__minix__) || defined(__minix) +# define LZO_OS_POSIX_MINIX 1 +# define LZO_INFO_OS_POSIX "minix" +# elif defined(__NetBSD__) +# define LZO_OS_POSIX_NETBSD 1 +# define LZO_INFO_OS_POSIX "netbsd" +# elif defined(__OpenBSD__) +# define LZO_OS_POSIX_OPENBSD 1 +# define LZO_INFO_OS_POSIX "openbsd" +# elif defined(__osf__) +# define LZO_OS_POSIX_OSF 1 +# define LZO_INFO_OS_POSIX "osf" +# elif defined(__solaris__) || defined(__sun) +# if defined(__SVR4) || defined(__svr4__) +# define LZO_OS_POSIX_SOLARIS 1 +# define LZO_INFO_OS_POSIX "solaris" +# else +# define LZO_OS_POSIX_SUNOS 1 +# define LZO_INFO_OS_POSIX "sunos" +# endif +# elif defined(__ultrix__) || defined(__ultrix) +# define LZO_OS_POSIX_ULTRIX 1 +# define LZO_INFO_OS_POSIX "ultrix" +# elif defined(_UNICOS) +# define LZO_OS_POSIX_UNICOS 1 +# define LZO_INFO_OS_POSIX "unicos" +# else +# define LZO_OS_POSIX_UNKNOWN 1 +# define LZO_INFO_OS_POSIX "unknown" +# endif +#endif +#endif +#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +# if (UINT_MAX != LZO_0xffffL) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if (LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_WIN32 || LZO_OS_WIN64) +# if (UINT_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if defined(CIL) && defined(_GNUCC) && defined(__GNUC__) +# define LZO_CC_CILLY 1 +# define LZO_INFO_CC "Cilly" +# if defined(__CILLY__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CILLY__) +# else +# define LZO_INFO_CCVER "unknown" +# endif +#elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__) +# define LZO_CC_SDCC 1 +# define LZO_INFO_CC "sdcc" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(SDCC) +#elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__) +# define LZO_CC_PATHSCALE (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__) +# define LZO_INFO_CC "Pathscale C" +# define LZO_INFO_CCVER __PATHSCALE__ +#elif defined(__INTEL_COMPILER) +# define LZO_CC_INTELC 1 +# define LZO_INFO_CC "Intel C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__INTEL_COMPILER) +# if defined(_WIN32) || defined(_WIN64) +# define LZO_CC_SYNTAX_MSC 1 +# else +# define LZO_CC_SYNTAX_GNUC 1 +# endif +#elif defined(__POCC__) && defined(_WIN32) +# define LZO_CC_PELLESC 1 +# define LZO_INFO_CC "Pelles C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__POCC__) +#elif defined(__clang__) && defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) +# if defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# else +# define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# endif +# if defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__) +# define LZO_CC_CLANG_CLANG (__clang_major__ * 0x10000L + __clang_minor__ * 0x100 + __clang_patchlevel__) +# else +# define LZO_CC_CLANG_CLANG 0x010000L +# endif +# define LZO_CC_CLANG LZO_CC_CLANG_GNUC +# define LZO_INFO_CC "clang" +# define LZO_INFO_CCVER __VERSION__ +#elif defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) +# if defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# else +# define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# endif +# define LZO_CC_LLVM LZO_CC_LLVM_GNUC +# define LZO_INFO_CC "llvm-gcc" +# define LZO_INFO_CCVER __VERSION__ +#elif defined(__GNUC__) && defined(__VERSION__) +# if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) +# define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) +# elif defined(__GNUC_MINOR__) +# define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) +# else +# define LZO_CC_GNUC (__GNUC__ * 0x10000L) +# endif +# define LZO_INFO_CC "gcc" +# define LZO_INFO_CCVER __VERSION__ +#elif defined(__ACK__) && defined(_ACK) +# define LZO_CC_ACK 1 +# define LZO_INFO_CC "Amsterdam Compiler Kit C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__AZTEC_C__) +# define LZO_CC_AZTECC 1 +# define LZO_INFO_CC "Aztec C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__AZTEC_C__) +#elif defined(__CODEGEARC__) +# define LZO_CC_CODEGEARC 1 +# define LZO_INFO_CC "CodeGear C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CODEGEARC__) +#elif defined(__BORLANDC__) +# define LZO_CC_BORLANDC 1 +# define LZO_INFO_CC "Borland C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__BORLANDC__) +#elif defined(_CRAYC) && defined(_RELEASE) +# define LZO_CC_CRAYC 1 +# define LZO_INFO_CC "Cray C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_RELEASE) +#elif defined(__DMC__) && defined(__SC__) +# define LZO_CC_DMC 1 +# define LZO_INFO_CC "Digital Mars C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DMC__) +#elif defined(__DECC) +# define LZO_CC_DECC 1 +# define LZO_INFO_CC "DEC C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DECC) +#elif defined(__HIGHC__) +# define LZO_CC_HIGHC 1 +# define LZO_INFO_CC "MetaWare High C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__IAR_SYSTEMS_ICC__) +# define LZO_CC_IARC 1 +# define LZO_INFO_CC "IAR C" +# if defined(__VER__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__VER__) +# else +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__IBMC__) +# define LZO_CC_IBMC 1 +# define LZO_INFO_CC "IBM C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__IBMC__) +#elif defined(__KEIL__) && defined(__C166__) +# define LZO_CC_KEILC 1 +# define LZO_INFO_CC "Keil C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__C166__) +#elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL) +# define LZO_CC_LCCWIN32 1 +# define LZO_INFO_CC "lcc-win32" +# define LZO_INFO_CCVER "unknown" +#elif defined(__LCC__) +# define LZO_CC_LCC 1 +# define LZO_INFO_CC "lcc" +# if defined(__LCC_VERSION__) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__LCC_VERSION__) +# else +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(_MSC_VER) +# define LZO_CC_MSC 1 +# define LZO_INFO_CC "Microsoft C" +# if defined(_MSC_FULL_VER) +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER) +# else +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) +# endif +#elif defined(__MWERKS__) +# define LZO_CC_MWERKS 1 +# define LZO_INFO_CC "Metrowerks C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__MWERKS__) +#elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386) +# define LZO_CC_NDPC 1 +# define LZO_INFO_CC "Microway NDP C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__PACIFIC__) +# define LZO_CC_PACIFICC 1 +# define LZO_INFO_CC "Pacific C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PACIFIC__) +#elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__)) +# define LZO_CC_PGI 1 +# define LZO_INFO_CC "Portland Group PGI C" +# define LZO_INFO_CCVER "unknown" +#elif defined(__PUREC__) && defined(__TOS__) +# define LZO_CC_PUREC 1 +# define LZO_INFO_CC "Pure C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PUREC__) +#elif defined(__SC__) && defined(__ZTC__) +# define LZO_CC_SYMANTECC 1 +# define LZO_INFO_CC "Symantec C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SC__) +#elif defined(__SUNPRO_C) +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_C)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_C +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_C) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__SUNPRO_CC) +# define LZO_INFO_CC "SunPro C" +# if ((__SUNPRO_CC)+0 > 0) +# define LZO_CC_SUNPROC __SUNPRO_CC +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_CC) +# else +# define LZO_CC_SUNPROC 1 +# define LZO_INFO_CCVER "unknown" +# endif +#elif defined(__TINYC__) +# define LZO_CC_TINYC 1 +# define LZO_INFO_CC "Tiny C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TINYC__) +#elif defined(__TSC__) +# define LZO_CC_TOPSPEEDC 1 +# define LZO_INFO_CC "TopSpeed C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TSC__) +#elif defined(__WATCOMC__) +# define LZO_CC_WATCOMC 1 +# define LZO_INFO_CC "Watcom C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__WATCOMC__) +#elif defined(__TURBOC__) +# define LZO_CC_TURBOC 1 +# define LZO_INFO_CC "Turbo C" +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TURBOC__) +#elif defined(__ZTC__) +# define LZO_CC_ZORTECHC 1 +# define LZO_INFO_CC "Zortech C" +# if (__ZTC__ == 0x310) +# define LZO_INFO_CCVER "0x310" +# else +# define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__ZTC__) +# endif +#else +# define LZO_CC_UNKNOWN 1 +# define LZO_INFO_CC "unknown" +# define LZO_INFO_CCVER "unknown" +#endif +#if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER) +# error "LZO_CC_MSC: _MSC_FULL_VER is not defined" +#endif +#if !defined(__LZO_ARCH_OVERRIDE) && !(LZO_ARCH_GENERIC) && defined(_CRAY) +# if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY) +# if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E) +# define LZO_ARCH_CRAY_MPP 1 +# elif defined(_CRAY1) +# define LZO_ARCH_CRAY_PVP 1 +# endif +# endif +#endif +#if !defined(__LZO_ARCH_OVERRIDE) +#if (LZO_ARCH_GENERIC) +# define LZO_INFO_ARCH "generic" +#elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +# define LZO_ARCH_I086 1 +# define LZO_ARCH_IA16 1 +# define LZO_INFO_ARCH "i086" +#elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) +# define LZO_ARCH_ALPHA 1 +# define LZO_INFO_ARCH "alpha" +#elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E)) +# define LZO_ARCH_ALPHA 1 +# define LZO_INFO_ARCH "alpha" +#elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) +# define LZO_ARCH_AMD64 1 +# define LZO_INFO_ARCH "amd64" +#elif defined(__thumb__) || (defined(_M_ARM) && defined(_M_THUMB)) +# define LZO_ARCH_ARM 1 +# define LZO_ARCH_ARM_THUMB 1 +# define LZO_INFO_ARCH "arm_thumb" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__) +# define LZO_ARCH_ARM 1 +# if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1) +# define LZO_ARCH_ARM_THUMB 1 +# define LZO_INFO_ARCH "arm_thumb" +# elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2) +# define LZO_INFO_ARCH "arm" +# else +# define LZO_INFO_ARCH "arm" +# endif +#elif defined(__arm__) || defined(_M_ARM) +# define LZO_ARCH_ARM 1 +# define LZO_INFO_ARCH "arm" +#elif (UINT_MAX <= LZO_0xffffL) && defined(__AVR__) +# define LZO_ARCH_AVR 1 +# define LZO_INFO_ARCH "avr" +#elif defined(__avr32__) || defined(__AVR32__) +# define LZO_ARCH_AVR32 1 +# define LZO_INFO_ARCH "avr32" +#elif defined(__bfin__) +# define LZO_ARCH_BLACKFIN 1 +# define LZO_INFO_ARCH "blackfin" +#elif (UINT_MAX == LZO_0xffffL) && defined(__C166__) +# define LZO_ARCH_C166 1 +# define LZO_INFO_ARCH "c166" +#elif defined(__cris__) +# define LZO_ARCH_CRIS 1 +# define LZO_INFO_ARCH "cris" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__) +# define LZO_ARCH_EZ80 1 +# define LZO_INFO_ARCH "ez80" +#elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) +# define LZO_ARCH_H8300 1 +# define LZO_INFO_ARCH "h8300" +#elif defined(__hppa__) || defined(__hppa) +# define LZO_ARCH_HPPA 1 +# define LZO_INFO_ARCH "hppa" +#elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) +# define LZO_ARCH_I386 1 +# define LZO_ARCH_IA32 1 +# define LZO_INFO_ARCH "i386" +#elif (LZO_CC_ZORTECHC && defined(__I86__)) +# define LZO_ARCH_I386 1 +# define LZO_ARCH_IA32 1 +# define LZO_INFO_ARCH "i386" +#elif (LZO_OS_DOS32 && LZO_CC_HIGHC) && defined(_I386) +# define LZO_ARCH_I386 1 +# define LZO_ARCH_IA32 1 +# define LZO_INFO_ARCH "i386" +#elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64) +# define LZO_ARCH_IA64 1 +# define LZO_INFO_ARCH "ia64" +#elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__) +# define LZO_ARCH_M16C 1 +# define LZO_INFO_ARCH "m16c" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__) +# define LZO_ARCH_M16C 1 +# define LZO_INFO_ARCH "m16c" +#elif defined(__m32r__) +# define LZO_ARCH_M32R 1 +# define LZO_INFO_ARCH "m32r" +#elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K) +# define LZO_ARCH_M68K 1 +# define LZO_INFO_ARCH "m68k" +#elif (UINT_MAX == LZO_0xffffL) && defined(__C251__) +# define LZO_ARCH_MCS251 1 +# define LZO_INFO_ARCH "mcs251" +#elif (UINT_MAX == LZO_0xffffL) && defined(__C51__) +# define LZO_ARCH_MCS51 1 +# define LZO_INFO_ARCH "mcs51" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) +# define LZO_ARCH_MCS51 1 +# define LZO_INFO_ARCH "mcs51" +#elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) +# define LZO_ARCH_MIPS 1 +# define LZO_INFO_ARCH "mips" +#elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__) +# define LZO_ARCH_MSP430 1 +# define LZO_INFO_ARCH "msp430" +#elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__) +# define LZO_ARCH_MSP430 1 +# define LZO_INFO_ARCH "msp430" +#elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR) +# define LZO_ARCH_POWERPC 1 +# define LZO_INFO_ARCH "powerpc" +#elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x) +# define LZO_ARCH_S390 1 +# define LZO_INFO_ARCH "s390" +#elif defined(__sh__) || defined(_M_SH) +# define LZO_ARCH_SH 1 +# define LZO_INFO_ARCH "sh" +#elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8) +# define LZO_ARCH_SPARC 1 +# define LZO_INFO_ARCH "sparc" +#elif defined(__SPU__) +# define LZO_ARCH_SPU 1 +# define LZO_INFO_ARCH "spu" +#elif (UINT_MAX == LZO_0xffffL) && defined(__z80) +# define LZO_ARCH_Z80 1 +# define LZO_INFO_ARCH "z80" +#elif (LZO_ARCH_CRAY_PVP) +# if defined(_CRAYSV1) +# define LZO_ARCH_CRAY_SV1 1 +# define LZO_INFO_ARCH "cray_sv1" +# elif (_ADDR64) +# define LZO_ARCH_CRAY_T90 1 +# define LZO_INFO_ARCH "cray_t90" +# elif (_ADDR32) +# define LZO_ARCH_CRAY_YMP 1 +# define LZO_INFO_ARCH "cray_ymp" +# else +# define LZO_ARCH_CRAY_XMP 1 +# define LZO_INFO_ARCH "cray_xmp" +# endif +#else +# define LZO_ARCH_UNKNOWN 1 +# define LZO_INFO_ARCH "unknown" +#endif +#endif +#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_DOS32 || LZO_OS_OS2) +# error "FIXME - missing define for CPU architecture" +#endif +#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN32) +# error "FIXME - missing WIN32 define for CPU architecture" +#endif +#if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN64) +# error "FIXME - missing WIN64 define for CPU architecture" +#endif +#if (LZO_OS_OS216 || LZO_OS_WIN16) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#elif 1 && (LZO_OS_DOS16 && defined(BLX286)) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#elif 1 && (LZO_OS_DOS16 && defined(DOSX286)) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#elif 1 && (LZO_OS_DOS16 && LZO_CC_BORLANDC && defined(__DPMI16__)) +# define LZO_ARCH_I086PM 1 +# define LZO_ARCH_IA16PM 1 +#endif +#if (LZO_ARCH_ARM_THUMB) && !(LZO_ARCH_ARM) +# error "this should not happen" +#endif +#if (LZO_ARCH_I086PM) && !(LZO_ARCH_I086) +# error "this should not happen" +#endif +#if (LZO_ARCH_I086) +# if (UINT_MAX != LZO_0xffffL) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if (LZO_ARCH_I386) +# if (UINT_MAX != LZO_0xffffL) && defined(__i386_int16__) +# error "this should not happen" +# endif +# if (UINT_MAX != LZO_0xffffffffL) && !defined(__i386_int16__) +# error "this should not happen" +# endif +# if (ULONG_MAX != LZO_0xffffffffL) +# error "this should not happen" +# endif +#endif +#if !defined(__LZO_MM_OVERRIDE) +#if (LZO_ARCH_I086) +#if (UINT_MAX != LZO_0xffffL) +# error "this should not happen" +#endif +#if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM) +# define LZO_MM_TINY 1 +#elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM) +# define LZO_MM_HUGE 1 +#elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL) +# define LZO_MM_SMALL 1 +#elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM) +# define LZO_MM_MEDIUM 1 +#elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM) +# define LZO_MM_COMPACT 1 +#elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL) +# define LZO_MM_LARGE 1 +#elif (LZO_CC_AZTECC) +# if defined(_LARGE_CODE) && defined(_LARGE_DATA) +# define LZO_MM_LARGE 1 +# elif defined(_LARGE_CODE) +# define LZO_MM_MEDIUM 1 +# elif defined(_LARGE_DATA) +# define LZO_MM_COMPACT 1 +# else +# define LZO_MM_SMALL 1 +# endif +#elif (LZO_CC_ZORTECHC && defined(__VCM__)) +# define LZO_MM_LARGE 1 +#else +# error "unknown memory model" +#endif +#if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +#define LZO_HAVE_MM_HUGE_PTR 1 +#define LZO_HAVE_MM_HUGE_ARRAY 1 +#if (LZO_MM_TINY) +# undef LZO_HAVE_MM_HUGE_ARRAY +#endif +#if (LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_ZORTECHC) +# undef LZO_HAVE_MM_HUGE_PTR +# undef LZO_HAVE_MM_HUGE_ARRAY +#elif (LZO_CC_DMC || LZO_CC_SYMANTECC) +# undef LZO_HAVE_MM_HUGE_ARRAY +#elif (LZO_CC_MSC && defined(_QC)) +# undef LZO_HAVE_MM_HUGE_ARRAY +# if (_MSC_VER < 600) +# undef LZO_HAVE_MM_HUGE_PTR +# endif +#elif (LZO_CC_TURBOC && (__TURBOC__ < 0x0295)) +# undef LZO_HAVE_MM_HUGE_ARRAY +#endif +#if (LZO_ARCH_I086PM) && !(LZO_HAVE_MM_HUGE_PTR) +# if (LZO_OS_DOS16) +# error "this should not happen" +# elif (LZO_CC_ZORTECHC) +# else +# error "this should not happen" +# endif +#endif +#ifdef __cplusplus +extern "C" { +#endif +#if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0200)) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif (LZO_CC_MSC || LZO_CC_TOPSPEEDC) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif (LZO_CC_TURBOC && (__TURBOC__ >= 0x0295)) + extern void __near __cdecl _AHSHIFT(void); +# define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) +#elif ((LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_TURBOC) && LZO_OS_DOS16) +# define LZO_MM_AHSHIFT 12 +#elif (LZO_CC_WATCOMC) + extern unsigned char _HShift; +# define LZO_MM_AHSHIFT ((unsigned) _HShift) +#else +# error "FIXME - implement LZO_MM_AHSHIFT" +#endif +#ifdef __cplusplus +} +#endif +#endif +#elif (LZO_ARCH_C166) +#if !defined(__MODEL__) +# error "FIXME - C166 __MODEL__" +#elif ((__MODEL__) == 0) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 1) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 2) +# define LZO_MM_LARGE 1 +#elif ((__MODEL__) == 3) +# define LZO_MM_TINY 1 +#elif ((__MODEL__) == 4) +# define LZO_MM_XTINY 1 +#elif ((__MODEL__) == 5) +# define LZO_MM_XSMALL 1 +#else +# error "FIXME - C166 __MODEL__" +#endif +#elif (LZO_ARCH_MCS251) +#if !defined(__MODEL__) +# error "FIXME - MCS251 __MODEL__" +#elif ((__MODEL__) == 0) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 2) +# define LZO_MM_LARGE 1 +#elif ((__MODEL__) == 3) +# define LZO_MM_TINY 1 +#elif ((__MODEL__) == 4) +# define LZO_MM_XTINY 1 +#elif ((__MODEL__) == 5) +# define LZO_MM_XSMALL 1 +#else +# error "FIXME - MCS251 __MODEL__" +#endif +#elif (LZO_ARCH_MCS51) +#if !defined(__MODEL__) +# error "FIXME - MCS51 __MODEL__" +#elif ((__MODEL__) == 1) +# define LZO_MM_SMALL 1 +#elif ((__MODEL__) == 2) +# define LZO_MM_LARGE 1 +#elif ((__MODEL__) == 3) +# define LZO_MM_TINY 1 +#elif ((__MODEL__) == 4) +# define LZO_MM_XTINY 1 +#elif ((__MODEL__) == 5) +# define LZO_MM_XSMALL 1 +#else +# error "FIXME - MCS51 __MODEL__" +#endif +#elif (LZO_ARCH_CRAY_PVP) +# define LZO_MM_PVP 1 +#else +# define LZO_MM_FLAT 1 +#endif +#if (LZO_MM_COMPACT) +# define LZO_INFO_MM "compact" +#elif (LZO_MM_FLAT) +# define LZO_INFO_MM "flat" +#elif (LZO_MM_HUGE) +# define LZO_INFO_MM "huge" +#elif (LZO_MM_LARGE) +# define LZO_INFO_MM "large" +#elif (LZO_MM_MEDIUM) +# define LZO_INFO_MM "medium" +#elif (LZO_MM_PVP) +# define LZO_INFO_MM "pvp" +#elif (LZO_MM_SMALL) +# define LZO_INFO_MM "small" +#elif (LZO_MM_TINY) +# define LZO_INFO_MM "tiny" +#else +# error "unknown memory model" +#endif +#endif +#if defined(SIZEOF_SHORT) +# define LZO_SIZEOF_SHORT (SIZEOF_SHORT) +#endif +#if defined(SIZEOF_INT) +# define LZO_SIZEOF_INT (SIZEOF_INT) +#endif +#if defined(SIZEOF_LONG) +# define LZO_SIZEOF_LONG (SIZEOF_LONG) +#endif +#if defined(SIZEOF_LONG_LONG) +# define LZO_SIZEOF_LONG_LONG (SIZEOF_LONG_LONG) +#endif +#if defined(SIZEOF___INT16) +# define LZO_SIZEOF___INT16 (SIZEOF___INT16) +#endif +#if defined(SIZEOF___INT32) +# define LZO_SIZEOF___INT32 (SIZEOF___INT32) +#endif +#if defined(SIZEOF___INT64) +# define LZO_SIZEOF___INT64 (SIZEOF___INT64) +#endif +#if defined(SIZEOF_VOID_P) +# define LZO_SIZEOF_VOID_P (SIZEOF_VOID_P) +#endif +#if defined(SIZEOF_SIZE_T) +# define LZO_SIZEOF_SIZE_T (SIZEOF_SIZE_T) +#endif +#if defined(SIZEOF_PTRDIFF_T) +# define LZO_SIZEOF_PTRDIFF_T (SIZEOF_PTRDIFF_T) +#endif +#define __LZO_LSR(x,b) (((x)+0ul) >> (b)) +#if !defined(LZO_SIZEOF_SHORT) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_SHORT 8 +# elif (USHRT_MAX == LZO_0xffffL) +# define LZO_SIZEOF_SHORT 2 +# elif (__LZO_LSR(USHRT_MAX,7) == 1) +# define LZO_SIZEOF_SHORT 1 +# elif (__LZO_LSR(USHRT_MAX,15) == 1) +# define LZO_SIZEOF_SHORT 2 +# elif (__LZO_LSR(USHRT_MAX,31) == 1) +# define LZO_SIZEOF_SHORT 4 +# elif (__LZO_LSR(USHRT_MAX,63) == 1) +# define LZO_SIZEOF_SHORT 8 +# elif (__LZO_LSR(USHRT_MAX,127) == 1) +# define LZO_SIZEOF_SHORT 16 +# else +# error "LZO_SIZEOF_SHORT" +# endif +#endif +#if !defined(LZO_SIZEOF_INT) +# if (LZO_ARCH_CRAY_PVP) +# define LZO_SIZEOF_INT 8 +# elif (UINT_MAX == LZO_0xffffL) +# define LZO_SIZEOF_INT 2 +# elif (UINT_MAX == LZO_0xffffffffL) +# define LZO_SIZEOF_INT 4 +# elif (__LZO_LSR(UINT_MAX,7) == 1) +# define LZO_SIZEOF_INT 1 +# elif (__LZO_LSR(UINT_MAX,15) == 1) +# define LZO_SIZEOF_INT 2 +# elif (__LZO_LSR(UINT_MAX,31) == 1) +# define LZO_SIZEOF_INT 4 +# elif (__LZO_LSR(UINT_MAX,63) == 1) +# define LZO_SIZEOF_INT 8 +# elif (__LZO_LSR(UINT_MAX,127) == 1) +# define LZO_SIZEOF_INT 16 +# else +# error "LZO_SIZEOF_INT" +# endif +#endif +#if !defined(LZO_SIZEOF_LONG) +# if (ULONG_MAX == LZO_0xffffffffL) +# define LZO_SIZEOF_LONG 4 +# elif (__LZO_LSR(ULONG_MAX,7) == 1) +# define LZO_SIZEOF_LONG 1 +# elif (__LZO_LSR(ULONG_MAX,15) == 1) +# define LZO_SIZEOF_LONG 2 +# elif (__LZO_LSR(ULONG_MAX,31) == 1) +# define LZO_SIZEOF_LONG 4 +# elif (__LZO_LSR(ULONG_MAX,63) == 1) +# define LZO_SIZEOF_LONG 8 +# elif (__LZO_LSR(ULONG_MAX,127) == 1) +# define LZO_SIZEOF_LONG 16 +# else +# error "LZO_SIZEOF_LONG" +# endif +#endif +#if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) +#if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) +# if defined(__LONG_MAX__) && defined(__LONG_LONG_MAX__) +# if (LZO_CC_GNUC >= 0x030300ul) +# if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0) +# define LZO_SIZEOF_LONG_LONG LZO_SIZEOF_LONG +# elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1) +# define LZO_SIZEOF_LONG_LONG 4 +# endif +# endif +# endif +#endif +#endif +#if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) +#if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) +#if (LZO_ARCH_I086 && LZO_CC_DMC) +#elif (LZO_CC_CILLY) && defined(__GNUC__) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define LZO_SIZEOF_LONG_LONG 8 +#elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400)) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_OS_WIN64 || defined(_WIN64)) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_ARCH_I386 && (LZO_CC_DMC)) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_SYMANTECC && (__SC__ >= 0x700))) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__))) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC)) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC)) +# define LZO_SIZEOF___INT64 8 +#elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC)) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520))) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_ARCH_I386 && (LZO_CC_WATCOMC && (__WATCOMC__ >= 1100))) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64)) +# define LZO_SIZEOF___INT64 8 +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) +# define LZO_SIZEOF_LONG_LONG 8 +#elif (LZO_CC_SDCC) && (LZO_SIZEOF_INT == 2) +#elif 1 && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# define LZO_SIZEOF_LONG_LONG 8 +#endif +#endif +#endif +#if defined(__cplusplus) && (LZO_CC_GNUC) +# if (LZO_CC_GNUC < 0x020800ul) +# undef LZO_SIZEOF_LONG_LONG +# endif +#endif +#if (LZO_CFG_NO_LONG_LONG) || defined(__NO_LONG_LONG) +# undef LZO_SIZEOF_LONG_LONG +#endif +#if !defined(LZO_SIZEOF_VOID_P) +#if (LZO_ARCH_I086) +# define __LZO_WORDSIZE 2 +# if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM) +# define LZO_SIZEOF_VOID_P 2 +# elif (LZO_MM_COMPACT || LZO_MM_LARGE || LZO_MM_HUGE) +# define LZO_SIZEOF_VOID_P 4 +# else +# error "LZO_MM" +# endif +#elif (LZO_ARCH_AVR || LZO_ARCH_Z80) +# define __LZO_WORDSIZE 1 +# define LZO_SIZEOF_VOID_P 2 +#elif (LZO_ARCH_C166 || LZO_ARCH_MCS51 || LZO_ARCH_MCS251 || LZO_ARCH_MSP430) +# define LZO_SIZEOF_VOID_P 2 +#elif (LZO_ARCH_H8300) +# if defined(__NORMAL_MODE__) +# define __LZO_WORDSIZE 4 +# define LZO_SIZEOF_VOID_P 2 +# elif defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) +# define __LZO_WORDSIZE 4 +# define LZO_SIZEOF_VOID_P 4 +# else +# define __LZO_WORDSIZE 2 +# define LZO_SIZEOF_VOID_P 2 +# endif +# if (LZO_CC_GNUC && (LZO_CC_GNUC < 0x040000ul)) && (LZO_SIZEOF_INT == 4) +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_INT +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_INT +# endif +#elif (LZO_ARCH_M16C) +# define __LZO_WORDSIZE 2 +# if defined(__m32c_cpu__) || defined(__m32cm_cpu__) +# define LZO_SIZEOF_VOID_P 4 +# else +# define LZO_SIZEOF_VOID_P 2 +# endif +#elif (LZO_SIZEOF_LONG == 8) && ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) +# define __LZO_WORDSIZE 8 +# define LZO_SIZEOF_VOID_P 4 +#elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64) +# define __LZO_WORDSIZE 8 +# define LZO_SIZEOF_VOID_P 8 +#elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) +# define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (LZO_OS_OS400 || defined(__OS400__)) +# define __LZO_WORDSIZE LZO_SIZEOF_LONG +# define LZO_SIZEOF_VOID_P 16 +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) +# define LZO_SIZEOF_VOID_P 8 +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG +#elif (LZO_ARCH_SPU) +# if 0 +# define __LZO_WORDSIZE 16 +# endif +# define LZO_SIZEOF_VOID_P 4 +#else +# define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG +#endif +#endif +#if !defined(LZO_WORDSIZE) +# if defined(__LZO_WORDSIZE) +# define LZO_WORDSIZE __LZO_WORDSIZE +# else +# define LZO_WORDSIZE LZO_SIZEOF_VOID_P +# endif +#endif +#if !defined(LZO_SIZEOF_SIZE_T) +#if (LZO_ARCH_I086 || LZO_ARCH_M16C) +# define LZO_SIZEOF_SIZE_T 2 +#else +# define LZO_SIZEOF_SIZE_T LZO_SIZEOF_VOID_P +#endif +#endif +#if !defined(LZO_SIZEOF_PTRDIFF_T) +#if (LZO_ARCH_I086) +# if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM || LZO_MM_HUGE) +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_VOID_P +# elif (LZO_MM_COMPACT || LZO_MM_LARGE) +# if (LZO_CC_BORLANDC || LZO_CC_TURBOC) +# define LZO_SIZEOF_PTRDIFF_T 4 +# else +# define LZO_SIZEOF_PTRDIFF_T 2 +# endif +# else +# error "LZO_MM" +# endif +#else +# define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_SIZE_T +#endif +#endif +#if (LZO_ABI_NEUTRAL_ENDIAN) +# undef LZO_ABI_BIG_ENDIAN +# undef LZO_ABI_LITTLE_ENDIAN +#elif !(LZO_ABI_BIG_ENDIAN) && !(LZO_ABI_LITTLE_ENDIAN) +#if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP) +# define LZO_ABI_BIG_ENDIAN 1 +#elif (LZO_ARCH_IA64) && (LZO_OS_POSIX_LINUX || LZO_OS_WIN64) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif (LZO_ARCH_AVR32 || LZO_ARCH_M68K || LZO_ARCH_S390) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__) +# if (__LITTLE_ENDIAN__ == 1) +# define LZO_ABI_LITTLE_ENDIAN 1 +# else +# define LZO_ABI_BIG_ENDIAN 1 +# endif +#elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__) +# define LZO_ABI_LITTLE_ENDIAN 1 +#elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__) +# define LZO_ABI_BIG_ENDIAN 1 +#elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__) +# define LZO_ABI_LITTLE_ENDIAN 1 +#endif +#endif +#if (LZO_ABI_BIG_ENDIAN) && (LZO_ABI_LITTLE_ENDIAN) +# error "this should not happen" +#endif +#if (LZO_ABI_BIG_ENDIAN) +# define LZO_INFO_ABI_ENDIAN "be" +#elif (LZO_ABI_LITTLE_ENDIAN) +# define LZO_INFO_ABI_ENDIAN "le" +#elif (LZO_ABI_NEUTRAL_ENDIAN) +# define LZO_INFO_ABI_ENDIAN "neutral" +#endif +#if (LZO_SIZEOF_INT == 1 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) +# define LZO_ABI_I8LP16 1 +# define LZO_INFO_ABI_PM "i8lp16" +#elif (LZO_SIZEOF_INT == 2 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) +# define LZO_ABI_ILP16 1 +# define LZO_INFO_ABI_PM "ilp16" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 4) +# define LZO_ABI_ILP32 1 +# define LZO_INFO_ABI_PM "ilp32" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 8 && LZO_SIZEOF_SIZE_T == 8) +# define LZO_ABI_LLP64 1 +# define LZO_INFO_ABI_PM "llp64" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) +# define LZO_ABI_LP64 1 +# define LZO_INFO_ABI_PM "lp64" +#elif (LZO_SIZEOF_INT == 8 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) +# define LZO_ABI_ILP64 1 +# define LZO_INFO_ABI_PM "ilp64" +#elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 4) +# define LZO_ABI_IP32L64 1 +# define LZO_INFO_ABI_PM "ip32l64" +#endif +#if !defined(__LZO_LIBC_OVERRIDE) +#if (LZO_LIBC_NAKED) +# define LZO_INFO_LIBC "naked" +#elif (LZO_LIBC_FREESTANDING) +# define LZO_INFO_LIBC "freestanding" +#elif (LZO_LIBC_MOSTLY_FREESTANDING) +# define LZO_INFO_LIBC "mfreestanding" +#elif (LZO_LIBC_ISOC90) +# define LZO_INFO_LIBC "isoc90" +#elif (LZO_LIBC_ISOC99) +# define LZO_INFO_LIBC "isoc99" +#elif defined(__dietlibc__) +# define LZO_LIBC_DIETLIBC 1 +# define LZO_INFO_LIBC "dietlibc" +#elif defined(_NEWLIB_VERSION) +# define LZO_LIBC_NEWLIB 1 +# define LZO_INFO_LIBC "newlib" +#elif defined(__UCLIBC__) && defined(__UCLIBC_MAJOR__) && defined(__UCLIBC_MINOR__) +# if defined(__UCLIBC_SUBLEVEL__) +# define LZO_LIBC_UCLIBC (__UCLIBC_MAJOR__ * 0x10000L + __UCLIBC_MINOR__ * 0x100 + __UCLIBC_SUBLEVEL__) +# else +# define LZO_LIBC_UCLIBC 0x00090bL +# endif +# define LZO_INFO_LIBC "uclibc" +#elif defined(__GLIBC__) && defined(__GLIBC_MINOR__) +# define LZO_LIBC_GLIBC (__GLIBC__ * 0x10000L + __GLIBC_MINOR__ * 0x100) +# define LZO_INFO_LIBC "glibc" +#elif (LZO_CC_MWERKS) && defined(__MSL__) +# define LZO_LIBC_MSL __MSL__ +# define LZO_INFO_LIBC "msl" +#elif 1 && defined(__IAR_SYSTEMS_ICC__) +# define LZO_LIBC_ISOC90 1 +# define LZO_INFO_LIBC "isoc90" +#else +# define LZO_LIBC_DEFAULT 1 +# define LZO_INFO_LIBC "default" +#endif +#endif +#if !defined(__lzo_gnuc_extension__) +#if (LZO_CC_GNUC >= 0x020800ul) +# define __lzo_gnuc_extension__ __extension__ +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_gnuc_extension__ __extension__ +#else +# define __lzo_gnuc_extension__ /*empty*/ +#endif +#endif +#if !defined(__lzo_ua_volatile) +# define __lzo_ua_volatile volatile +#endif +#if !defined(__lzo_alignof) +#if (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) +# define __lzo_alignof(e) __alignof__(e) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700)) +# define __lzo_alignof(e) __alignof__(e) +#elif (LZO_CC_MSC && (_MSC_VER >= 1300)) +# define __lzo_alignof(e) __alignof(e) +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_alignof(e) __alignof__(e) +#endif +#endif +#if defined(__lzo_alignof) +# define __lzo_HAVE_alignof 1 +#endif +#if !defined(__lzo_constructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_constructor __attribute__((__constructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_constructor __attribute__((__constructor__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_constructor __attribute__((__constructor__)) +#endif +#endif +#if defined(__lzo_constructor) +# define __lzo_HAVE_constructor 1 +#endif +#if !defined(__lzo_destructor) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_destructor __attribute__((__destructor__,__used__)) +#elif (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_destructor __attribute__((__destructor__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_destructor __attribute__((__destructor__)) +#endif +#endif +#if defined(__lzo_destructor) +# define __lzo_HAVE_destructor 1 +#endif +#if (__lzo_HAVE_destructor) && !(__lzo_HAVE_constructor) +# error "this should not happen" +#endif +#if !defined(__lzo_inline) +#if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295)) +#elif defined(__cplusplus) +# define __lzo_inline inline +#elif (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0550)) +# define __lzo_inline __inline +#elif (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) +# define __lzo_inline __inline__ +#elif (LZO_CC_DMC) +# define __lzo_inline __inline +#elif (LZO_CC_INTELC) +# define __lzo_inline __inline +#elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x2405)) +# define __lzo_inline __inline +#elif (LZO_CC_MSC && (_MSC_VER >= 900)) +# define __lzo_inline __inline +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_inline __inline__ +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +# define __lzo_inline inline +#endif +#endif +#if defined(__lzo_inline) +# define __lzo_HAVE_inline 1 +#else +# define __lzo_inline /*empty*/ +#endif +#if !defined(__lzo_forceinline) +#if (LZO_CC_GNUC >= 0x030200ul) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) +# define __lzo_forceinline __forceinline +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) +# define __lzo_forceinline __forceinline +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_forceinline __inline__ __attribute__((__always_inline__)) +#endif +#endif +#if defined(__lzo_forceinline) +# define __lzo_HAVE_forceinline 1 +#else +# define __lzo_forceinline /*empty*/ +#endif +#if !defined(__lzo_noinline) +#if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul) +# define __lzo_noinline __attribute__((__noinline__,__used__)) +#elif (LZO_CC_GNUC >= 0x030200ul) +# define __lzo_noinline __attribute__((__noinline__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC) +# define __lzo_noinline __declspec(noinline) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) +# define __lzo_noinline __attribute__((__noinline__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_noinline __attribute__((__noinline__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1300)) +# define __lzo_noinline __declspec(noinline) +#elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x3200) && (LZO_OS_WIN32 || LZO_OS_WIN64)) +# if defined(__cplusplus) +# else +# define __lzo_noinline __declspec(noinline) +# endif +#elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) +# define __lzo_noinline __attribute__((__noinline__)) +#endif +#endif +#if defined(__lzo_noinline) +# define __lzo_HAVE_noinline 1 +#else +# define __lzo_noinline /*empty*/ +#endif +#if (__lzo_HAVE_forceinline || __lzo_HAVE_noinline) && !(__lzo_HAVE_inline) +# error "this should not happen" +#endif +#if !defined(__lzo_noreturn) +#if (LZO_CC_GNUC >= 0x020700ul) +# define __lzo_noreturn __attribute__((__noreturn__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) +# define __lzo_noreturn __declspec(noreturn) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) +# define __lzo_noreturn __attribute__((__noreturn__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_noreturn __attribute__((__noreturn__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) +# define __lzo_noreturn __declspec(noreturn) +#endif +#endif +#if defined(__lzo_noreturn) +# define __lzo_HAVE_noreturn 1 +#else +# define __lzo_noreturn /*empty*/ +#endif +#if !defined(__lzo_nothrow) +#if (LZO_CC_GNUC >= 0x030300ul) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 900) && LZO_CC_SYNTAX_GNUC) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_nothrow __attribute__((__nothrow__)) +#elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus) +# define __lzo_nothrow __declspec(nothrow) +#endif +#endif +#if defined(__lzo_nothrow) +# define __lzo_HAVE_nothrow 1 +#else +# define __lzo_nothrow /*empty*/ +#endif +#if !defined(__lzo_restrict) +#if (LZO_CC_GNUC >= 0x030400ul) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_CLANG || LZO_CC_LLVM) +# define __lzo_restrict __restrict__ +#elif (LZO_CC_MSC && (_MSC_VER >= 1400)) +# define __lzo_restrict __restrict +#endif +#endif +#if defined(__lzo_restrict) +# define __lzo_HAVE_restrict 1 +#else +# define __lzo_restrict /*empty*/ +#endif +#if !defined(__lzo_likely) && !defined(__lzo_unlikely) +#if (LZO_CC_GNUC >= 0x030200ul) +# define __lzo_likely(e) (__builtin_expect(!!(e),1)) +# define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) +# define __lzo_likely(e) (__builtin_expect(!!(e),1)) +# define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define __lzo_likely(e) (__builtin_expect(!!(e),1)) +# define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) +#endif +#endif +#if defined(__lzo_likely) +# define __lzo_HAVE_likely 1 +#else +# define __lzo_likely(e) (e) +#endif +#if defined(__lzo_unlikely) +# define __lzo_HAVE_unlikely 1 +#else +# define __lzo_unlikely(e) (e) +#endif +#if !defined(LZO_UNUSED) +# if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) +# define LZO_UNUSED(var) ((void) &var) +# elif (LZO_CC_BORLANDC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PELLESC || LZO_CC_TURBOC) +# define LZO_UNUSED(var) if (&var) ; else +# elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define LZO_UNUSED(var) ((void) var) +# elif (LZO_CC_MSC && (_MSC_VER < 900)) +# define LZO_UNUSED(var) if (&var) ; else +# elif (LZO_CC_KEILC) +# define LZO_UNUSED(var) {extern int __lzo_unused[1-2*!(sizeof(var)>0)];} +# elif (LZO_CC_PACIFICC) +# define LZO_UNUSED(var) ((void) sizeof(var)) +# elif (LZO_CC_WATCOMC) && defined(__cplusplus) +# define LZO_UNUSED(var) ((void) var) +# else +# define LZO_UNUSED(var) ((void) &var) +# endif +#endif +#if !defined(LZO_UNUSED_FUNC) +# if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) +# define LZO_UNUSED_FUNC(func) ((void) func) +# elif (LZO_CC_BORLANDC || LZO_CC_NDPC || LZO_CC_TURBOC) +# define LZO_UNUSED_FUNC(func) if (func) ; else +# elif (LZO_CC_CLANG || LZO_CC_LLVM) +# define LZO_UNUSED_FUNC(func) ((void) &func) +# elif (LZO_CC_MSC && (_MSC_VER < 900)) +# define LZO_UNUSED_FUNC(func) if (func) ; else +# elif (LZO_CC_MSC) +# define LZO_UNUSED_FUNC(func) ((void) &func) +# elif (LZO_CC_KEILC || LZO_CC_PELLESC) +# define LZO_UNUSED_FUNC(func) {extern int __lzo_unused[1-2*!(sizeof((int)func)>0)];} +# else +# define LZO_UNUSED_FUNC(func) ((void) func) +# endif +#endif +#if !defined(LZO_UNUSED_LABEL) +# if (LZO_CC_WATCOMC) && defined(__cplusplus) +# define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l +# elif (LZO_CC_CLANG || LZO_CC_INTELC || LZO_CC_WATCOMC) +# define LZO_UNUSED_LABEL(l) if (0) goto l +# else +# define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l +# endif +#endif +#if !defined(LZO_DEFINE_UNINITIALIZED_VAR) +# if 0 +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var +# elif 0 && (LZO_CC_GNUC) +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var +# else +# define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init +# endif +#endif +#if !defined(LZO_UNCONST_CAST) +# if 0 && defined(__cplusplus) +# define LZO_UNCONST_CAST(t,e) (const_cast (e)) +# elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) +# define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((lzo_uintptr_t) ((const void *) (e)))))) +# else +# define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((const void *) (e))))) +# endif +#endif +#if !defined(LZO_COMPILE_TIME_ASSERT_HEADER) +# if (LZO_CC_AZTECC || LZO_CC_ZORTECHC) +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; +# elif (LZO_CC_DMC || LZO_CC_SYMANTECC) +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1u-2*!(e)]; +# elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; +# else +# define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-2*!(e)]; +# endif +#endif +#if !defined(LZO_COMPILE_TIME_ASSERT) +# if (LZO_CC_AZTECC) +# define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-!(e)];} +# elif (LZO_CC_DMC || LZO_CC_PACIFICC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) +# define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; +# elif (LZO_CC_MSC && (_MSC_VER < 900)) +# define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; +# elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) +# define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; +# else +# define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-2*!(e)];} +# endif +#endif +#if (LZO_ARCH_I086 || LZO_ARCH_I386) && (LZO_OS_DOS16 || LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_OS216 || LZO_OS_WIN16 || LZO_OS_WIN32 || LZO_OS_WIN64) +# if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC) +# elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) +# define __lzo_cdecl __cdecl +# define __lzo_cdecl_atexit /*empty*/ +# define __lzo_cdecl_main __cdecl +# if (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) +# define __lzo_cdecl_qsort __pascal +# elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) +# define __lzo_cdecl_qsort _stdcall +# else +# define __lzo_cdecl_qsort __cdecl +# endif +# elif (LZO_CC_WATCOMC) +# define __lzo_cdecl __cdecl +# else +# define __lzo_cdecl __cdecl +# define __lzo_cdecl_atexit __cdecl +# define __lzo_cdecl_main __cdecl +# define __lzo_cdecl_qsort __cdecl +# endif +# if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC || LZO_CC_WATCOMC) +# elif (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) +# define __lzo_cdecl_sighandler __pascal +# elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) +# define __lzo_cdecl_sighandler _stdcall +# elif (LZO_CC_MSC && (_MSC_VER >= 1400)) && defined(_M_CEE_PURE) +# define __lzo_cdecl_sighandler __clrcall +# elif (LZO_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700)) +# if defined(_DLL) +# define __lzo_cdecl_sighandler _far _cdecl _loadds +# elif defined(_MT) +# define __lzo_cdecl_sighandler _far _cdecl +# else +# define __lzo_cdecl_sighandler _cdecl +# endif +# else +# define __lzo_cdecl_sighandler __cdecl +# endif +#elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC) +# define __lzo_cdecl __cdecl +#elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC)) +# define __lzo_cdecl cdecl +#endif +#if !defined(__lzo_cdecl) +# define __lzo_cdecl /*empty*/ +#endif +#if !defined(__lzo_cdecl_atexit) +# define __lzo_cdecl_atexit /*empty*/ +#endif +#if !defined(__lzo_cdecl_main) +# define __lzo_cdecl_main /*empty*/ +#endif +#if !defined(__lzo_cdecl_qsort) +# define __lzo_cdecl_qsort /*empty*/ +#endif +#if !defined(__lzo_cdecl_sighandler) +# define __lzo_cdecl_sighandler /*empty*/ +#endif +#if !defined(__lzo_cdecl_va) +# define __lzo_cdecl_va __lzo_cdecl +#endif +#if !(LZO_CFG_NO_WINDOWS_H) +#if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64) +# if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000)) +# elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__) +# elif ((LZO_OS_CYGWIN || defined(__MINGW32__)) && (LZO_CC_GNUC && (LZO_CC_GNUC < 0x025f00ul))) +# else +# define LZO_HAVE_WINDOWS_H 1 +# endif +#endif +#endif +#if (LZO_ARCH_ALPHA) +# define LZO_OPT_AVOID_UINT_INDEX 1 +# define LZO_OPT_AVOID_SHORT 1 +# define LZO_OPT_AVOID_USHORT 1 +#elif (LZO_ARCH_AMD64) +# define LZO_OPT_AVOID_INT_INDEX 1 +# define LZO_OPT_AVOID_UINT_INDEX 1 +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# define LZO_OPT_UNALIGNED64 1 +#elif (LZO_ARCH_ARM && LZO_ARCH_ARM_THUMB) +#elif (LZO_ARCH_ARM) +# define LZO_OPT_AVOID_SHORT 1 +# define LZO_OPT_AVOID_USHORT 1 +#elif (LZO_ARCH_CRIS) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +#elif (LZO_ARCH_I386) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +#elif (LZO_ARCH_IA64) +# define LZO_OPT_AVOID_INT_INDEX 1 +# define LZO_OPT_AVOID_UINT_INDEX 1 +# define LZO_OPT_PREFER_POSTINC 1 +#elif (LZO_ARCH_M68K) +# define LZO_OPT_PREFER_POSTINC 1 +# define LZO_OPT_PREFER_PREDEC 1 +# if defined(__mc68020__) && !defined(__mcoldfire__) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# endif +#elif (LZO_ARCH_MIPS) +# define LZO_OPT_AVOID_UINT_INDEX 1 +#elif (LZO_ARCH_POWERPC) +# define LZO_OPT_PREFER_PREINC 1 +# define LZO_OPT_PREFER_PREDEC 1 +# if (LZO_ABI_BIG_ENDIAN) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# endif +#elif (LZO_ARCH_S390) +# define LZO_OPT_UNALIGNED16 1 +# define LZO_OPT_UNALIGNED32 1 +# if (LZO_SIZEOF_SIZE_T == 8) +# define LZO_OPT_UNALIGNED64 1 +# endif +#elif (LZO_ARCH_SH) +# define LZO_OPT_PREFER_POSTINC 1 +# define LZO_OPT_PREFER_PREDEC 1 +#endif +#ifndef LZO_CFG_NO_INLINE_ASM +#if (LZO_CC_LLVM) +# define LZO_CFG_NO_INLINE_ASM 1 +#endif +#endif +#ifndef LZO_CFG_NO_UNALIGNED +#if (LZO_ABI_NEUTRAL_ENDIAN) || (LZO_ARCH_GENERIC) +# define LZO_CFG_NO_UNALIGNED 1 +#endif +#endif +#if (LZO_CFG_NO_UNALIGNED) +# undef LZO_OPT_UNALIGNED16 +# undef LZO_OPT_UNALIGNED32 +# undef LZO_OPT_UNALIGNED64 +#endif +#if (LZO_CFG_NO_INLINE_ASM) +#elif (LZO_ARCH_I386 && (LZO_OS_DOS32 || LZO_OS_WIN32) && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) +# define LZO_ASM_SYNTAX_MSC 1 +#elif (LZO_OS_WIN64 && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) +#elif (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC == 0x011f00ul)) +#elif (LZO_ARCH_I386 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) +# define LZO_ASM_SYNTAX_GNUC 1 +#elif (LZO_ARCH_AMD64 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) +# define LZO_ASM_SYNTAX_GNUC 1 +#endif +#if (LZO_ASM_SYNTAX_GNUC) +#if (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC < 0x020000ul)) +# define __LZO_ASM_CLOBBER "ax" +#elif (LZO_CC_INTELC) +# define __LZO_ASM_CLOBBER "memory" +#else +# define __LZO_ASM_CLOBBER "cc", "memory" +#endif +#endif +#if defined(__LZO_INFOSTR_MM) +#elif (LZO_MM_FLAT) && (defined(__LZO_INFOSTR_PM) || defined(LZO_INFO_ABI_PM)) +# define __LZO_INFOSTR_MM "" +#elif defined(LZO_INFO_MM) +# define __LZO_INFOSTR_MM "." LZO_INFO_MM +#else +# define __LZO_INFOSTR_MM "" +#endif +#if defined(__LZO_INFOSTR_PM) +#elif defined(LZO_INFO_ABI_PM) +# define __LZO_INFOSTR_PM "." LZO_INFO_ABI_PM +#else +# define __LZO_INFOSTR_PM "" +#endif +#if defined(__LZO_INFOSTR_ENDIAN) +#elif defined(LZO_INFO_ABI_ENDIAN) +# define __LZO_INFOSTR_ENDIAN "." LZO_INFO_ABI_ENDIAN +#else +# define __LZO_INFOSTR_ENDIAN "" +#endif +#if defined(__LZO_INFOSTR_OSNAME) +#elif defined(LZO_INFO_OS_CONSOLE) +# define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_CONSOLE +#elif defined(LZO_INFO_OS_POSIX) +# define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_POSIX +#else +# define __LZO_INFOSTR_OSNAME LZO_INFO_OS +#endif +#if defined(__LZO_INFOSTR_LIBC) +#elif defined(LZO_INFO_LIBC) +# define __LZO_INFOSTR_LIBC "." LZO_INFO_LIBC +#else +# define __LZO_INFOSTR_LIBC "" +#endif +#if defined(__LZO_INFOSTR_CCVER) +#elif defined(LZO_INFO_CCVER) +# define __LZO_INFOSTR_CCVER " " LZO_INFO_CCVER +#else +# define __LZO_INFOSTR_CCVER "" +#endif +#define LZO_INFO_STRING \ + LZO_INFO_ARCH __LZO_INFOSTR_MM __LZO_INFOSTR_PM __LZO_INFOSTR_ENDIAN \ + " " __LZO_INFOSTR_OSNAME __LZO_INFOSTR_LIBC " " LZO_INFO_CC __LZO_INFOSTR_CCVER + +#endif + +#endif + +#undef LZO_HAVE_CONFIG_H +#include "minilzo.h" + +#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2060) +# error "version mismatch in miniLZO source files" +#endif + +#ifdef MINILZO_HAVE_CONFIG_H +# define LZO_HAVE_CONFIG_H 1 +#endif + +#ifndef __LZO_CONF_H +#define __LZO_CONF_H 1 + +#if !defined(__LZO_IN_MINILZO) +#if (LZO_CFG_FREESTANDING) +# define LZO_LIBC_FREESTANDING 1 +# define LZO_OS_FREESTANDING 1 +# define ACC_LIBC_FREESTANDING 1 +# define ACC_OS_FREESTANDING 1 +#endif +#if (LZO_CFG_NO_UNALIGNED) +# define ACC_CFG_NO_UNALIGNED 1 +#endif +#if (LZO_ARCH_GENERIC) +# define ACC_ARCH_GENERIC 1 +#endif +#if (LZO_ABI_NEUTRAL_ENDIAN) +# define ACC_ABI_NEUTRAL_ENDIAN 1 +#endif +#if (LZO_HAVE_CONFIG_H) +# define ACC_CONFIG_NO_HEADER 1 +#endif +#if defined(LZO_CFG_EXTRA_CONFIG_HEADER) +# include LZO_CFG_EXTRA_CONFIG_HEADER +#endif +#if defined(__LZOCONF_H) || defined(__LZOCONF_H_INCLUDED) +# error "include this file first" +#endif +#include "lzo/lzoconf.h" +#endif + +#if (LZO_VERSION < 0x02000) || !defined(__LZOCONF_H_INCLUDED) +# error "version mismatch" +#endif + +#if (LZO_CC_BORLANDC && LZO_ARCH_I086) +# pragma option -h +#endif + +#if (LZO_CC_MSC && (_MSC_VER >= 1000)) +# pragma warning(disable: 4127 4701) +#endif +#if (LZO_CC_MSC && (_MSC_VER >= 1300)) +# pragma warning(disable: 4820) +# pragma warning(disable: 4514 4710 4711) +#endif + +#if (LZO_CC_SUNPROC) +#if !defined(__cplusplus) +# pragma error_messages(off,E_END_OF_LOOP_CODE_NOT_REACHED) +# pragma error_messages(off,E_LOOP_NOT_ENTERED_AT_TOP) +# pragma error_messages(off,E_STATEMENT_NOT_REACHED) +#endif +#endif + +#if (__LZO_MMODEL_HUGE) && !(LZO_HAVE_MM_HUGE_PTR) +# error "this should not happen - check defines for __huge" +#endif + +#if defined(__LZO_IN_MINILZO) || defined(LZO_CFG_FREESTANDING) +#elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) +# define ACC_WANT_ACC_INCD_H 1 +# define ACC_WANT_ACC_INCE_H 1 +# define ACC_WANT_ACC_INCI_H 1 +#elif 1 +# include +#else +# define ACC_WANT_ACC_INCD_H 1 +#endif + +#if (LZO_ARCH_I086) +# define ACC_MM_AHSHIFT LZO_MM_AHSHIFT +# define ACC_PTR_FP_OFF(x) (((const unsigned __far*)&(x))[0]) +# define ACC_PTR_FP_SEG(x) (((const unsigned __far*)&(x))[1]) +# define ACC_PTR_MK_FP(s,o) ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o))) +#endif + +#if !defined(lzo_uintptr_t) +# if defined(__LZO_MMODEL_HUGE) +# define lzo_uintptr_t unsigned long +# elif 1 && defined(LZO_OS_OS400) && (LZO_SIZEOF_VOID_P == 16) +# define __LZO_UINTPTR_T_IS_POINTER 1 + typedef char* lzo_uintptr_t; +# define lzo_uintptr_t lzo_uintptr_t +# elif (LZO_SIZEOF_SIZE_T == LZO_SIZEOF_VOID_P) +# define lzo_uintptr_t size_t +# elif (LZO_SIZEOF_LONG == LZO_SIZEOF_VOID_P) +# define lzo_uintptr_t unsigned long +# elif (LZO_SIZEOF_INT == LZO_SIZEOF_VOID_P) +# define lzo_uintptr_t unsigned int +# elif (LZO_SIZEOF_LONG_LONG == LZO_SIZEOF_VOID_P) +# define lzo_uintptr_t unsigned long long +# else +# define lzo_uintptr_t size_t +# endif +#endif +LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uintptr_t) >= sizeof(lzo_voidp)) + +#if 1 && !defined(LZO_CFG_FREESTANDING) +#if 1 && !defined(HAVE_STRING_H) +#define HAVE_STRING_H 1 +#endif +#if 1 && !defined(HAVE_MEMCMP) +#define HAVE_MEMCMP 1 +#endif +#if 1 && !defined(HAVE_MEMCPY) +#define HAVE_MEMCPY 1 +#endif +#if 1 && !defined(HAVE_MEMMOVE) +#define HAVE_MEMMOVE 1 +#endif +#if 1 && !defined(HAVE_MEMSET) +#define HAVE_MEMSET 1 +#endif +#endif + +#if 1 && defined(HAVE_STRING_H) +#include +#endif + +#if (LZO_CFG_FREESTANDING) +# undef HAVE_MEMCMP +# undef HAVE_MEMCPY +# undef HAVE_MEMMOVE +# undef HAVE_MEMSET +#endif + +#if !(HAVE_MEMCMP) +# undef memcmp +# define memcmp(a,b,c) lzo_memcmp(a,b,c) +#elif !(__LZO_MMODEL_HUGE) +# undef lzo_memcmp +# define lzo_memcmp(a,b,c) memcmp(a,b,c) +#endif +#if !(HAVE_MEMCPY) +# undef memcpy +# define memcpy(a,b,c) lzo_memcpy(a,b,c) +#elif !(__LZO_MMODEL_HUGE) +# undef lzo_memcpy +# define lzo_memcpy(a,b,c) memcpy(a,b,c) +#endif +#if !(HAVE_MEMMOVE) +# undef memmove +# define memmove(a,b,c) lzo_memmove(a,b,c) +#elif !(__LZO_MMODEL_HUGE) +# undef lzo_memmove +# define lzo_memmove(a,b,c) memmove(a,b,c) +#endif +#if !(HAVE_MEMSET) +# undef memset +# define memset(a,b,c) lzo_memset(a,b,c) +#elif !(__LZO_MMODEL_HUGE) +# undef lzo_memset +# define lzo_memset(a,b,c) memset(a,b,c) +#endif + +#undef NDEBUG +#if (LZO_CFG_FREESTANDING) +# undef LZO_DEBUG +# define NDEBUG 1 +# undef assert +# define assert(e) ((void)0) +#else +# if !defined(LZO_DEBUG) +# define NDEBUG 1 +# endif +# include +#endif + +#if 0 && defined(__BOUNDS_CHECKING_ON) +# include +#else +# define BOUNDS_CHECKING_OFF_DURING(stmt) stmt +# define BOUNDS_CHECKING_OFF_IN_EXPR(expr) (expr) +#endif + +#if !defined(__lzo_inline) +# define __lzo_inline /*empty*/ +#endif +#if !defined(__lzo_forceinline) +# define __lzo_forceinline /*empty*/ +#endif +#if !defined(__lzo_noinline) +# define __lzo_noinline /*empty*/ +#endif + +#if (LZO_CFG_PGO) +# undef __acc_likely +# undef __acc_unlikely +# undef __lzo_likely +# undef __lzo_unlikely +# define __acc_likely(e) (e) +# define __acc_unlikely(e) (e) +# define __lzo_likely(e) (e) +# define __lzo_unlikely(e) (e) +#endif + +#if 1 +# define LZO_BYTE(x) ((unsigned char) (x)) +#else +# define LZO_BYTE(x) ((unsigned char) ((x) & 0xff)) +#endif + +#define LZO_MAX(a,b) ((a) >= (b) ? (a) : (b)) +#define LZO_MIN(a,b) ((a) <= (b) ? (a) : (b)) +#define LZO_MAX3(a,b,c) ((a) >= (b) ? LZO_MAX(a,c) : LZO_MAX(b,c)) +#define LZO_MIN3(a,b,c) ((a) <= (b) ? LZO_MIN(a,c) : LZO_MIN(b,c)) + +#define lzo_sizeof(type) ((lzo_uint) (sizeof(type))) + +#define LZO_HIGH(array) ((lzo_uint) (sizeof(array)/sizeof(*(array)))) + +#define LZO_SIZE(bits) (1u << (bits)) +#define LZO_MASK(bits) (LZO_SIZE(bits) - 1) + +#define LZO_LSIZE(bits) (1ul << (bits)) +#define LZO_LMASK(bits) (LZO_LSIZE(bits) - 1) + +#define LZO_USIZE(bits) ((lzo_uint) 1 << (bits)) +#define LZO_UMASK(bits) (LZO_USIZE(bits) - 1) + +#if !defined(DMUL) +#if 0 + +# define DMUL(a,b) ((lzo_xint) ((lzo_uint32)(a) * (lzo_uint32)(b))) +#else +# define DMUL(a,b) ((lzo_xint) ((a) * (b))) +#endif +#endif + +#if 1 && (LZO_ARCH_AMD64 || LZO_ARCH_I386 || LZO_ARCH_POWERPC) +# if (LZO_SIZEOF_SHORT == 2) +# define LZO_UNALIGNED_OK_2 1 +# endif +# if (LZO_SIZEOF_INT == 4) +# define LZO_UNALIGNED_OK_4 1 +# endif +#endif +#if 1 && (LZO_ARCH_AMD64) +# if defined(LZO_UINT64_MAX) +# define LZO_UNALIGNED_OK_8 1 +# endif +#endif +#if (LZO_CFG_NO_UNALIGNED) +# undef LZO_UNALIGNED_OK_2 +# undef LZO_UNALIGNED_OK_4 +# undef LZO_UNALIGNED_OK_8 +#endif + +#undef UA_GET16 +#undef UA_SET16 +#undef UA_COPY16 +#undef UA_GET32 +#undef UA_SET32 +#undef UA_COPY32 +#undef UA_GET64 +#undef UA_SET64 +#undef UA_COPY64 +#if defined(LZO_UNALIGNED_OK_2) + LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(unsigned short) == 2) +# if 1 && defined(ACC_UA_COPY16) +# define UA_GET16 ACC_UA_GET16 +# define UA_SET16 ACC_UA_SET16 +# define UA_COPY16 ACC_UA_COPY16 +# else +# define UA_GET16(p) (* (__lzo_ua_volatile const lzo_ushortp) (__lzo_ua_volatile const lzo_voidp) (p)) +# define UA_SET16(p,v) ((* (__lzo_ua_volatile lzo_ushortp) (__lzo_ua_volatile lzo_voidp) (p)) = (unsigned short) (v)) +# define UA_COPY16(d,s) UA_SET16(d, UA_GET16(s)) +# endif +#endif +#if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) + LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uint32) == 4) +# if 1 && defined(ACC_UA_COPY32) +# define UA_GET32 ACC_UA_GET32 +# define UA_SET32 ACC_UA_SET32 +# define UA_COPY32 ACC_UA_COPY32 +# else +# define UA_GET32(p) (* (__lzo_ua_volatile const lzo_uint32p) (__lzo_ua_volatile const lzo_voidp) (p)) +# define UA_SET32(p,v) ((* (__lzo_ua_volatile lzo_uint32p) (__lzo_ua_volatile lzo_voidp) (p)) = (lzo_uint32) (v)) +# define UA_COPY32(d,s) UA_SET32(d, UA_GET32(s)) +# endif +#endif +#if defined(LZO_UNALIGNED_OK_8) + LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uint64) == 8) +# if 1 && defined(ACC_UA_COPY64) +# define UA_GET64 ACC_UA_GET64 +# define UA_SET64 ACC_UA_SET64 +# define UA_COPY64 ACC_UA_COPY64 +# else +# define UA_GET64(p) (* (__lzo_ua_volatile const lzo_uint64p) (__lzo_ua_volatile const lzo_voidp) (p)) +# define UA_SET64(p,v) ((* (__lzo_ua_volatile lzo_uint64p) (__lzo_ua_volatile lzo_voidp) (p)) = (lzo_uint64) (v)) +# define UA_COPY64(d,s) UA_SET64(d, UA_GET64(s)) +# endif +#endif + +#define MEMCPY8_DS(dest,src,len) \ + lzo_memcpy(dest,src,len); dest += len; src += len + +#define BZERO8_PTR(s,l,n) \ + lzo_memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n)) + +#define MEMCPY_DS(dest,src,len) \ + do *dest++ = *src++; while (--len > 0) + +LZO_EXTERN(const lzo_bytep) lzo_copyright(void); + +#ifndef __LZO_PTR_H +#define __LZO_PTR_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(lzo_uintptr_t) +# if (__LZO_MMODEL_HUGE) +# define lzo_uintptr_t unsigned long +# else +# define lzo_uintptr_t acc_uintptr_t +# ifdef __ACC_INTPTR_T_IS_POINTER +# define __LZO_UINTPTR_T_IS_POINTER 1 +# endif +# endif +#endif + +#if (LZO_ARCH_I086) +#define PTR(a) ((lzo_bytep) (a)) +#define PTR_ALIGNED_4(a) ((ACC_PTR_FP_OFF(a) & 3) == 0) +#define PTR_ALIGNED2_4(a,b) (((ACC_PTR_FP_OFF(a) | ACC_PTR_FP_OFF(b)) & 3) == 0) +#elif (LZO_MM_PVP) +#define PTR(a) ((lzo_bytep) (a)) +#define PTR_ALIGNED_8(a) ((((lzo_uintptr_t)(a)) >> 61) == 0) +#define PTR_ALIGNED2_8(a,b) ((((lzo_uintptr_t)(a)|(lzo_uintptr_t)(b)) >> 61) == 0) +#else +#define PTR(a) ((lzo_uintptr_t) (a)) +#define PTR_LINEAR(a) PTR(a) +#define PTR_ALIGNED_4(a) ((PTR_LINEAR(a) & 3) == 0) +#define PTR_ALIGNED_8(a) ((PTR_LINEAR(a) & 7) == 0) +#define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0) +#define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0) +#endif + +#define PTR_LT(a,b) (PTR(a) < PTR(b)) +#define PTR_GE(a,b) (PTR(a) >= PTR(b)) +#define PTR_DIFF(a,b) (PTR(a) - PTR(b)) +#define pd(a,b) ((lzo_uint) ((a)-(b))) + +LZO_EXTERN(lzo_uintptr_t) +__lzo_ptr_linear(const lzo_voidp ptr); + +typedef union +{ + char a_char; + unsigned char a_uchar; + short a_short; + unsigned short a_ushort; + int a_int; + unsigned int a_uint; + long a_long; + unsigned long a_ulong; + lzo_int a_lzo_int; + lzo_uint a_lzo_uint; + lzo_int32 a_lzo_int32; + lzo_uint32 a_lzo_uint32; +#if defined(LZO_UINT64_MAX) + lzo_int64 a_lzo_int64; + lzo_uint64 a_lzo_uint64; +#endif + ptrdiff_t a_ptrdiff_t; + lzo_uintptr_t a_lzo_uintptr_t; + lzo_voidp a_lzo_voidp; + void * a_void_p; + lzo_bytep a_lzo_bytep; + lzo_bytepp a_lzo_bytepp; + lzo_uintp a_lzo_uintp; + lzo_uint * a_lzo_uint_p; + lzo_uint32p a_lzo_uint32p; + lzo_uint32 * a_lzo_uint32_p; + unsigned char * a_uchar_p; + char * a_char_p; +} +lzo_full_align_t; + +#ifdef __cplusplus +} +#endif + +#endif + +#ifndef LZO_DETERMINISTIC +#define LZO_DETERMINISTIC 1 +#endif + +#ifndef LZO_DICT_USE_PTR +#define LZO_DICT_USE_PTR 1 +#if 0 && (LZO_ARCH_I086) +# undef LZO_DICT_USE_PTR +# define LZO_DICT_USE_PTR 0 +#endif +#endif + +#if (LZO_DICT_USE_PTR) +# define lzo_dict_t const lzo_bytep +# define lzo_dict_p lzo_dict_t __LZO_MMODEL * +#else +# define lzo_dict_t lzo_uint +# define lzo_dict_p lzo_dict_t __LZO_MMODEL * +#endif + +#endif + +#if !defined(MINILZO_CFG_SKIP_LZO_PTR) + +LZO_PUBLIC(lzo_uintptr_t) +__lzo_ptr_linear(const lzo_voidp ptr) +{ + lzo_uintptr_t p; + +#if (LZO_ARCH_I086) + p = (((lzo_uintptr_t)(ACC_PTR_FP_SEG(ptr))) << (16 - ACC_MM_AHSHIFT)) + (ACC_PTR_FP_OFF(ptr)); +#elif (LZO_MM_PVP) + p = (lzo_uintptr_t) (ptr); + p = (p << 3) | (p >> 61); +#else + p = (lzo_uintptr_t) PTR_LINEAR(ptr); +#endif + + return p; +} + +LZO_PUBLIC(unsigned) +__lzo_align_gap(const lzo_voidp ptr, lzo_uint size) +{ +#if defined(__LZO_UINTPTR_T_IS_POINTER) + size_t n = (size_t) ptr; + n = (((n + size - 1) / size) * size) - n; +#else + lzo_uintptr_t p, n; + p = __lzo_ptr_linear(ptr); + n = (((p + size - 1) / size) * size) - p; +#endif + + assert(size > 0); + assert((long)n >= 0); + assert(n <= size); + return (unsigned)n; +} + +#endif +#if !defined(MINILZO_CFG_SKIP_LZO_UTIL) + +/* If you use the LZO library in a product, I would appreciate that you + * keep this copyright string in the executable of your product. + */ + +static const char __lzo_copyright[] = +#if !defined(__LZO_IN_MINLZO) + LZO_VERSION_STRING; +#else + "\r\n\n" + "LZO data compression library.\n" + "$Copyright: LZO Copyright (C) 1996-2011 Markus Franz Xaver Johannes Oberhumer\n" + "\n" + "http://www.oberhumer.com $\n\n" + "$Id: LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE " $\n" + "$Info: " LZO_INFO_STRING " $\n"; +#endif + +LZO_PUBLIC(const lzo_bytep) +lzo_copyright(void) +{ +#if (LZO_OS_DOS16 && LZO_CC_TURBOC) + return (lzo_voidp) __lzo_copyright; +#else + return (const lzo_bytep) __lzo_copyright; +#endif +} + +LZO_PUBLIC(unsigned) +lzo_version(void) +{ + return LZO_VERSION; +} + +LZO_PUBLIC(const char *) +lzo_version_string(void) +{ + return LZO_VERSION_STRING; +} + +LZO_PUBLIC(const char *) +lzo_version_date(void) +{ + return LZO_VERSION_DATE; +} + +LZO_PUBLIC(const lzo_charp) +_lzo_version_string(void) +{ + return LZO_VERSION_STRING; +} + +LZO_PUBLIC(const lzo_charp) +_lzo_version_date(void) +{ + return LZO_VERSION_DATE; +} + +#define LZO_BASE 65521u +#define LZO_NMAX 5552 + +#define LZO_DO1(buf,i) s1 += buf[i]; s2 += s1 +#define LZO_DO2(buf,i) LZO_DO1(buf,i); LZO_DO1(buf,i+1); +#define LZO_DO4(buf,i) LZO_DO2(buf,i); LZO_DO2(buf,i+2); +#define LZO_DO8(buf,i) LZO_DO4(buf,i); LZO_DO4(buf,i+4); +#define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8); + +LZO_PUBLIC(lzo_uint32) +lzo_adler32(lzo_uint32 adler, const lzo_bytep buf, lzo_uint len) +{ + lzo_uint32 s1 = adler & 0xffff; + lzo_uint32 s2 = (adler >> 16) & 0xffff; + unsigned k; + + if (buf == NULL) + return 1; + + while (len > 0) + { + k = len < LZO_NMAX ? (unsigned) len : LZO_NMAX; + len -= k; + if (k >= 16) do + { + LZO_DO16(buf,0); + buf += 16; + k -= 16; + } while (k >= 16); + if (k != 0) do + { + s1 += *buf++; + s2 += s1; + } while (--k > 0); + s1 %= LZO_BASE; + s2 %= LZO_BASE; + } + return (s2 << 16) | s1; +} + +#undef LZO_DO1 +#undef LZO_DO2 +#undef LZO_DO4 +#undef LZO_DO8 +#undef LZO_DO16 + +#endif +#if !defined(MINILZO_CFG_SKIP_LZO_STRING) +#undef lzo_memcmp +#undef lzo_memcpy +#undef lzo_memmove +#undef lzo_memset +#if !defined(__LZO_MMODEL_HUGE) +# undef LZO_HAVE_MM_HUGE_PTR +#endif +#define lzo_hsize_t lzo_uint +#define lzo_hvoid_p lzo_voidp +#define lzo_hbyte_p lzo_bytep +#define LZOLIB_PUBLIC(r,f) LZO_PUBLIC(r) f +#define lzo_hmemcmp lzo_memcmp +#define lzo_hmemcpy lzo_memcpy +#define lzo_hmemmove lzo_memmove +#define lzo_hmemset lzo_memset +#define __LZOLIB_HMEMCPY_CH_INCLUDED 1 +#if !defined(LZOLIB_PUBLIC) +# define LZOLIB_PUBLIC(r,f) r __LZOLIB_FUNCNAME(f) +#endif +LZOLIB_PUBLIC(int, lzo_hmemcmp) (const lzo_hvoid_p s1, const lzo_hvoid_p s2, lzo_hsize_t len) +{ +#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCMP) + const lzo_hbyte_p p1 = (const lzo_hbyte_p) s1; + const lzo_hbyte_p p2 = (const lzo_hbyte_p) s2; + if __lzo_likely(len > 0) do + { + int d = *p1 - *p2; + if (d != 0) + return d; + p1++; p2++; + } while __lzo_likely(--len > 0); + return 0; +#else + return memcmp(s1, s2, len); +#endif +} +LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemcpy) (lzo_hvoid_p dest, const lzo_hvoid_p src, lzo_hsize_t len) +{ +#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCPY) + lzo_hbyte_p p1 = (lzo_hbyte_p) dest; + const lzo_hbyte_p p2 = (const lzo_hbyte_p) src; + if (!(len > 0) || p1 == p2) + return dest; + do + *p1++ = *p2++; + while __lzo_likely(--len > 0); + return dest; +#else + return memcpy(dest, src, len); +#endif +} +LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemmove) (lzo_hvoid_p dest, const lzo_hvoid_p src, lzo_hsize_t len) +{ +#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMMOVE) + lzo_hbyte_p p1 = (lzo_hbyte_p) dest; + const lzo_hbyte_p p2 = (const lzo_hbyte_p) src; + if (!(len > 0) || p1 == p2) + return dest; + if (p1 < p2) + { + do + *p1++ = *p2++; + while __lzo_likely(--len > 0); + } + else + { + p1 += len; + p2 += len; + do + *--p1 = *--p2; + while __lzo_likely(--len > 0); + } + return dest; +#else + return memmove(dest, src, len); +#endif +} +LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemset) (lzo_hvoid_p s, int c, lzo_hsize_t len) +{ +#if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMSET) + lzo_hbyte_p p = (lzo_hbyte_p) s; + if __lzo_likely(len > 0) do + *p++ = (unsigned char) c; + while __lzo_likely(--len > 0); + return s; +#else + return memset(s, c, len); +#endif +} +#undef LZOLIB_PUBLIC +#endif +#if !defined(MINILZO_CFG_SKIP_LZO_INIT) + +#if !defined(__LZO_IN_MINILZO) + +#define ACC_WANT_ACC_CHK_CH 1 +#undef ACCCHK_ASSERT + + ACCCHK_ASSERT_IS_SIGNED_T(lzo_int) + ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint) + + ACCCHK_ASSERT_IS_SIGNED_T(lzo_int32) + ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint32) + ACCCHK_ASSERT((LZO_UINT32_C(1) << (int)(8*sizeof(LZO_UINT32_C(1))-1)) > 0) + ACCCHK_ASSERT(sizeof(lzo_uint32) >= 4) +#if defined(LZO_UINT64_MAX) + ACCCHK_ASSERT(sizeof(lzo_uint64) == 8) + ACCCHK_ASSERT_IS_SIGNED_T(lzo_int64) + ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint64) +#endif + +#if !defined(__LZO_UINTPTR_T_IS_POINTER) + ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uintptr_t) +#endif + ACCCHK_ASSERT(sizeof(lzo_uintptr_t) >= sizeof(lzo_voidp)) + + ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_xint) + ACCCHK_ASSERT(sizeof(lzo_xint) >= sizeof(lzo_uint32)) + ACCCHK_ASSERT(sizeof(lzo_xint) >= sizeof(lzo_uint)) + ACCCHK_ASSERT(sizeof(lzo_xint) == sizeof(lzo_uint32) || sizeof(lzo_xint) == sizeof(lzo_uint)) + +#endif +#undef ACCCHK_ASSERT + +#define WANT_lzo_bitops_clz32 1 +#define WANT_lzo_bitops_clz64 1 +#define WANT_lzo_bitops_ctz32 1 +#define WANT_lzo_bitops_ctz64 1 + +#if (defined(_WIN32) || defined(_WIN64)) && ((LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_MSC && (_MSC_VER >= 1400))) +#include +#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32) && 0 +#pragma intrinsic(_BitScanReverse) +static __lzo_inline unsigned lzo_bitops_clz32(lzo_uint32 v) +{ + unsigned long r; + (void) _BitScanReverse(&r, v); + return (unsigned) r; +} +#define lzo_bitops_clz32 lzo_bitops_clz32 +#endif +#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX) && 0 +#pragma intrinsic(_BitScanReverse64) +static __lzo_inline unsigned lzo_bitops_clz64(lzo_uint64 v) +{ + unsigned long r; + (void) _BitScanReverse64(&r, v); + return (unsigned) r; +} +#define lzo_bitops_clz64 lzo_bitops_clz64 +#endif +#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32) +#pragma intrinsic(_BitScanForward) +static __lzo_inline unsigned lzo_bitops_ctz32(lzo_uint32 v) +{ + unsigned long r; + (void) _BitScanForward(&r, v); + return (unsigned) r; +} +#define lzo_bitops_ctz32 lzo_bitops_ctz32 +#endif +#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX) +#pragma intrinsic(_BitScanForward64) +static __lzo_inline unsigned lzo_bitops_ctz64(lzo_uint64 v) +{ + unsigned long r; + (void) _BitScanForward64(&r, v); + return (unsigned) r; +} +#define lzo_bitops_ctz64 lzo_bitops_ctz64 +#endif + +#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul)))) +#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32) +#define lzo_bitops_clz32(v) ((unsigned) __builtin_clz(v)) +#endif +#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX) +#define lzo_bitops_clz64(v) ((unsigned) __builtin_clzll(v)) +#endif +#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32) +#define lzo_bitops_ctz32(v) ((unsigned) __builtin_ctz(v)) +#endif +#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX) +#define lzo_bitops_ctz64(v) ((unsigned) __builtin_ctzll(v)) +#endif +#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount32) +#define lzo_bitops_popcount32(v) ((unsigned) __builtin_popcount(v)) +#endif +#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount64) && defined(LZO_UINT64_MAX) +#define lzo_bitops_popcount64(v) ((unsigned) __builtin_popcountll(v)) +#endif +#endif + +#if 0 +#define u2p(ptr,off) ((lzo_voidp) (((lzo_bytep)(lzo_voidp)(ptr)) + (off))) +#else +static __lzo_noinline lzo_voidp u2p(lzo_voidp ptr, lzo_uint off) +{ + return (lzo_voidp) ((lzo_bytep) ptr + off); +} +#endif + +LZO_PUBLIC(int) +_lzo_config_check(void) +{ + lzo_bool r = 1; + union { + lzo_xint a[2]; unsigned char b[2*LZO_MAX(8,sizeof(lzo_xint))]; +#if defined(LZO_UNALIGNED_OK_8) + lzo_uint64 c[2]; +#endif + unsigned short x[2]; lzo_uint32 y[2]; lzo_uint z[2]; + } u; + lzo_voidp p; + + u.a[0] = u.a[1] = 0; + p = u2p(&u, 0); + r &= ((* (lzo_bytep) p) == 0); +#if !defined(LZO_CFG_NO_CONFIG_CHECK) +#if defined(LZO_ABI_BIG_ENDIAN) + u.a[0] = u.a[1] = 0; u.b[sizeof(lzo_uint) - 1] = 128; + p = u2p(&u, 0); + r &= ((* (lzo_uintp) p) == 128); +#endif +#if defined(LZO_ABI_LITTLE_ENDIAN) + u.a[0] = u.a[1] = 0; u.b[0] = 128; + p = u2p(&u, 0); + r &= ((* (lzo_uintp) p) == 128); +#endif +#if defined(LZO_UNALIGNED_OK_2) + u.a[0] = u.a[1] = 0; + u.b[0] = 1; u.b[sizeof(unsigned short) + 1] = 2; + p = u2p(&u, 1); + r &= ((* (lzo_ushortp) p) == 0); +#endif +#if defined(LZO_UNALIGNED_OK_4) + u.a[0] = u.a[1] = 0; + u.b[0] = 3; u.b[sizeof(lzo_uint32) + 1] = 4; + p = u2p(&u, 1); + r &= ((* (lzo_uint32p) p) == 0); +#endif +#if defined(LZO_UNALIGNED_OK_8) + u.c[0] = u.c[1] = 0; + u.b[0] = 5; u.b[sizeof(lzo_uint64) + 1] = 6; + p = u2p(&u, 1); + r &= ((* (lzo_uint64p) p) == 0); +#endif +#if defined(lzo_bitops_clz32) + { unsigned i; lzo_uint32 v = 1; + for (i = 0; i < 32; i++, v <<= 1) + r &= lzo_bitops_clz32(v) == 31 - i; + } +#endif +#if defined(lzo_bitops_clz64) + { unsigned i; lzo_uint64 v = 1; + for (i = 0; i < 64; i++, v <<= 1) + r &= lzo_bitops_clz64(v) == 63 - i; + } +#endif +#if defined(lzo_bitops_ctz32) + { unsigned i; lzo_uint32 v = 1; + for (i = 0; i < 32; i++, v <<= 1) + r &= lzo_bitops_ctz32(v) == i; + } +#endif +#if defined(lzo_bitops_ctz64) + { unsigned i; lzo_uint64 v = 1; + for (i = 0; i < 64; i++, v <<= 1) + r &= lzo_bitops_ctz64(v) == i; + } +#endif +#endif + + return r == 1 ? LZO_E_OK : LZO_E_ERROR; +} + +LZO_PUBLIC(int) +__lzo_init_v2(unsigned v, int s1, int s2, int s3, int s4, int s5, + int s6, int s7, int s8, int s9) +{ + int r; + +#if defined(__LZO_IN_MINILZO) +#elif (LZO_CC_MSC && ((_MSC_VER) < 700)) +#else +#define ACC_WANT_ACC_CHK_CH 1 +#undef ACCCHK_ASSERT +#define ACCCHK_ASSERT(expr) LZO_COMPILE_TIME_ASSERT(expr) +#endif +#undef ACCCHK_ASSERT + + if (v == 0) + return LZO_E_ERROR; + + r = (s1 == -1 || s1 == (int) sizeof(short)) && + (s2 == -1 || s2 == (int) sizeof(int)) && + (s3 == -1 || s3 == (int) sizeof(long)) && + (s4 == -1 || s4 == (int) sizeof(lzo_uint32)) && + (s5 == -1 || s5 == (int) sizeof(lzo_uint)) && + (s6 == -1 || s6 == (int) lzo_sizeof_dict_t) && + (s7 == -1 || s7 == (int) sizeof(char *)) && + (s8 == -1 || s8 == (int) sizeof(lzo_voidp)) && + (s9 == -1 || s9 == (int) sizeof(lzo_callback_t)); + if (!r) + return LZO_E_ERROR; + + r = _lzo_config_check(); + if (r != LZO_E_OK) + return r; + + return r; +} + +#if !defined(__LZO_IN_MINILZO) + +#if (LZO_OS_WIN16 && LZO_CC_WATCOMC) && defined(__SW_BD) + +#if 0 +BOOL FAR PASCAL LibMain ( HANDLE hInstance, WORD wDataSegment, + WORD wHeapSize, LPSTR lpszCmdLine ) +#else +int __far __pascal LibMain ( int a, short b, short c, long d ) +#endif +{ + LZO_UNUSED(a); LZO_UNUSED(b); LZO_UNUSED(c); LZO_UNUSED(d); + return 1; +} + +#endif + +#endif + +#endif + +#define LZO1X 1 +#define LZO_EOF_CODE 1 +#define M2_MAX_OFFSET 0x0800 + +#if !defined(MINILZO_CFG_SKIP_LZO1X_1_COMPRESS) + +#if 1 && defined(UA_GET32) +#undef LZO_DICT_USE_PTR +#define LZO_DICT_USE_PTR 0 +#undef lzo_dict_t +#define lzo_dict_t unsigned short +#endif + +#define LZO_NEED_DICT_H 1 +#ifndef D_BITS +#define D_BITS 14 +#endif +#define D_INDEX1(d,p) d = DM(DMUL(0x21,DX3(p,5,5,6)) >> 5) +#define D_INDEX2(d,p) d = (d & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f) +#if 1 +#define DINDEX(dv,p) DM(((DMUL(0x1824429d,dv)) >> (32-D_BITS))) +#else +#define DINDEX(dv,p) DM((dv) + ((dv) >> (32-D_BITS))) +#endif + +#ifndef __LZO_CONFIG1X_H +#define __LZO_CONFIG1X_H 1 + +#if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z) +# define LZO1X 1 +#endif + +#if !defined(__LZO_IN_MINILZO) +#include "lzo/lzo1x.h" +#endif + +#ifndef LZO_EOF_CODE +#define LZO_EOF_CODE 1 +#endif +#undef LZO_DETERMINISTIC + +#define M1_MAX_OFFSET 0x0400 +#ifndef M2_MAX_OFFSET +#define M2_MAX_OFFSET 0x0800 +#endif +#define M3_MAX_OFFSET 0x4000 +#define M4_MAX_OFFSET 0xbfff + +#define MX_MAX_OFFSET (M1_MAX_OFFSET + M2_MAX_OFFSET) + +#define M1_MIN_LEN 2 +#define M1_MAX_LEN 2 +#define M2_MIN_LEN 3 +#ifndef M2_MAX_LEN +#define M2_MAX_LEN 8 +#endif +#define M3_MIN_LEN 3 +#define M3_MAX_LEN 33 +#define M4_MIN_LEN 3 +#define M4_MAX_LEN 9 + +#define M1_MARKER 0 +#define M2_MARKER 64 +#define M3_MARKER 32 +#define M4_MARKER 16 + +#ifndef MIN_LOOKAHEAD +#define MIN_LOOKAHEAD (M2_MAX_LEN + 1) +#endif + +#if defined(LZO_NEED_DICT_H) + +#ifndef LZO_HASH +#define LZO_HASH LZO_HASH_LZO_INCREMENTAL_B +#endif +#define DL_MIN_LEN M2_MIN_LEN + +#ifndef __LZO_DICT_H +#define __LZO_DICT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(D_BITS) && defined(DBITS) +# define D_BITS DBITS +#endif +#if !defined(D_BITS) +# error "D_BITS is not defined" +#endif +#if (D_BITS < 16) +# define D_SIZE LZO_SIZE(D_BITS) +# define D_MASK LZO_MASK(D_BITS) +#else +# define D_SIZE LZO_USIZE(D_BITS) +# define D_MASK LZO_UMASK(D_BITS) +#endif +#define D_HIGH ((D_MASK >> 1) + 1) + +#if !defined(DD_BITS) +# define DD_BITS 0 +#endif +#define DD_SIZE LZO_SIZE(DD_BITS) +#define DD_MASK LZO_MASK(DD_BITS) + +#if !defined(DL_BITS) +# define DL_BITS (D_BITS - DD_BITS) +#endif +#if (DL_BITS < 16) +# define DL_SIZE LZO_SIZE(DL_BITS) +# define DL_MASK LZO_MASK(DL_BITS) +#else +# define DL_SIZE LZO_USIZE(DL_BITS) +# define DL_MASK LZO_UMASK(DL_BITS) +#endif + +#if (D_BITS != DL_BITS + DD_BITS) +# error "D_BITS does not match" +#endif +#if (D_BITS < 6 || D_BITS > 18) +# error "invalid D_BITS" +#endif +#if (DL_BITS < 6 || DL_BITS > 20) +# error "invalid DL_BITS" +#endif +#if (DD_BITS < 0 || DD_BITS > 6) +# error "invalid DD_BITS" +#endif + +#if !defined(DL_MIN_LEN) +# define DL_MIN_LEN 3 +#endif +#if !defined(DL_SHIFT) +# define DL_SHIFT ((DL_BITS + (DL_MIN_LEN - 1)) / DL_MIN_LEN) +#endif + +#define LZO_HASH_GZIP 1 +#define LZO_HASH_GZIP_INCREMENTAL 2 +#define LZO_HASH_LZO_INCREMENTAL_A 3 +#define LZO_HASH_LZO_INCREMENTAL_B 4 + +#if !defined(LZO_HASH) +# error "choose a hashing strategy" +#endif + +#undef DM +#undef DX + +#if (DL_MIN_LEN == 3) +# define _DV2_A(p,shift1,shift2) \ + (((( (lzo_xint)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2]) +# define _DV2_B(p,shift1,shift2) \ + (((( (lzo_xint)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0]) +# define _DV3_B(p,shift1,shift2,shift3) \ + ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0]) +#elif (DL_MIN_LEN == 2) +# define _DV2_A(p,shift1,shift2) \ + (( (lzo_xint)(p[0]) << shift1) ^ p[1]) +# define _DV2_B(p,shift1,shift2) \ + (( (lzo_xint)(p[1]) << shift1) ^ p[2]) +#else +# error "invalid DL_MIN_LEN" +#endif +#define _DV_A(p,shift) _DV2_A(p,shift,shift) +#define _DV_B(p,shift) _DV2_B(p,shift,shift) +#define DA2(p,s1,s2) \ + (((((lzo_xint)((p)[2]) << (s2)) + (p)[1]) << (s1)) + (p)[0]) +#define DS2(p,s1,s2) \ + (((((lzo_xint)((p)[2]) << (s2)) - (p)[1]) << (s1)) - (p)[0]) +#define DX2(p,s1,s2) \ + (((((lzo_xint)((p)[2]) << (s2)) ^ (p)[1]) << (s1)) ^ (p)[0]) +#define DA3(p,s1,s2,s3) ((DA2((p)+1,s2,s3) << (s1)) + (p)[0]) +#define DS3(p,s1,s2,s3) ((DS2((p)+1,s2,s3) << (s1)) - (p)[0]) +#define DX3(p,s1,s2,s3) ((DX2((p)+1,s2,s3) << (s1)) ^ (p)[0]) +#define DMS(v,s) ((lzo_uint) (((v) & (D_MASK >> (s))) << (s))) +#define DM(v) DMS(v,0) + +#if (LZO_HASH == LZO_HASH_GZIP) +# define _DINDEX(dv,p) (_DV_A((p),DL_SHIFT)) + +#elif (LZO_HASH == LZO_HASH_GZIP_INCREMENTAL) +# define __LZO_HASH_INCREMENTAL 1 +# define DVAL_FIRST(dv,p) dv = _DV_A((p),DL_SHIFT) +# define DVAL_NEXT(dv,p) dv = (((dv) << DL_SHIFT) ^ p[2]) +# define _DINDEX(dv,p) (dv) +# define DVAL_LOOKAHEAD DL_MIN_LEN + +#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_A) +# define __LZO_HASH_INCREMENTAL 1 +# define DVAL_FIRST(dv,p) dv = _DV_A((p),5) +# define DVAL_NEXT(dv,p) \ + dv ^= (lzo_xint)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2]) +# define _DINDEX(dv,p) ((DMUL(0x9f5f,dv)) >> 5) +# define DVAL_LOOKAHEAD DL_MIN_LEN + +#elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_B) +# define __LZO_HASH_INCREMENTAL 1 +# define DVAL_FIRST(dv,p) dv = _DV_B((p),5) +# define DVAL_NEXT(dv,p) \ + dv ^= p[-1]; dv = (((dv) >> 5) ^ ((lzo_xint)(p[2]) << (2*5))) +# define _DINDEX(dv,p) ((DMUL(0x9f5f,dv)) >> 5) +# define DVAL_LOOKAHEAD DL_MIN_LEN + +#else +# error "choose a hashing strategy" +#endif + +#ifndef DINDEX +#define DINDEX(dv,p) ((lzo_uint)((_DINDEX(dv,p)) & DL_MASK) << DD_BITS) +#endif +#if !defined(DINDEX1) && defined(D_INDEX1) +#define DINDEX1 D_INDEX1 +#endif +#if !defined(DINDEX2) && defined(D_INDEX2) +#define DINDEX2 D_INDEX2 +#endif + +#if !defined(__LZO_HASH_INCREMENTAL) +# define DVAL_FIRST(dv,p) ((void) 0) +# define DVAL_NEXT(dv,p) ((void) 0) +# define DVAL_LOOKAHEAD 0 +#endif + +#if !defined(DVAL_ASSERT) +#if defined(__LZO_HASH_INCREMENTAL) && !defined(NDEBUG) +#if (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_LLVM) +static void __attribute__((__unused__)) +#else +static void +#endif +DVAL_ASSERT(lzo_xint dv, const lzo_bytep p) +{ + lzo_xint df; + DVAL_FIRST(df,(p)); + assert(DINDEX(dv,p) == DINDEX(df,p)); +} +#else +# define DVAL_ASSERT(dv,p) ((void) 0) +#endif +#endif + +#if (LZO_DICT_USE_PTR) +# define DENTRY(p,in) (p) +# define GINDEX(m_pos,m_off,dict,dindex,in) m_pos = dict[dindex] +#else +# define DENTRY(p,in) ((lzo_dict_t) pd(p, in)) +# define GINDEX(m_pos,m_off,dict,dindex,in) m_off = dict[dindex] +#endif + +#if (DD_BITS == 0) + +# define UPDATE_D(dict,drun,dv,p,in) dict[ DINDEX(dv,p) ] = DENTRY(p,in) +# define UPDATE_I(dict,drun,index,p,in) dict[index] = DENTRY(p,in) +# define UPDATE_P(ptr,drun,p,in) (ptr)[0] = DENTRY(p,in) + +#else + +# define UPDATE_D(dict,drun,dv,p,in) \ + dict[ DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= DD_MASK +# define UPDATE_I(dict,drun,index,p,in) \ + dict[ (index) + drun++ ] = DENTRY(p,in); drun &= DD_MASK +# define UPDATE_P(ptr,drun,p,in) \ + (ptr) [ drun++ ] = DENTRY(p,in); drun &= DD_MASK + +#endif + +#if (LZO_DICT_USE_PTR) + +#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ + (m_pos == NULL || (m_off = pd(ip, m_pos)) > max_offset) + +#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ + (BOUNDS_CHECKING_OFF_IN_EXPR(( \ + m_pos = ip - (lzo_uint) PTR_DIFF(ip,m_pos), \ + PTR_LT(m_pos,in) || \ + (m_off = (lzo_uint) PTR_DIFF(ip,m_pos)) == 0 || \ + m_off > max_offset ))) + +#else + +#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ + (m_off == 0 || \ + ((m_off = pd(ip, in) - m_off) > max_offset) || \ + (m_pos = (ip) - (m_off), 0) ) + +#define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ + (pd(ip, in) <= m_off || \ + ((m_off = pd(ip, in) - m_off) > max_offset) || \ + (m_pos = (ip) - (m_off), 0) ) + +#endif + +#if (LZO_DETERMINISTIC) +# define LZO_CHECK_MPOS LZO_CHECK_MPOS_DET +#else +# define LZO_CHECK_MPOS LZO_CHECK_MPOS_NON_DET +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +#endif + +#endif + +#define LZO_DETERMINISTIC !(LZO_DICT_USE_PTR) + +#ifndef DO_COMPRESS +#define DO_COMPRESS lzo1x_1_compress +#endif + +#if 1 && defined(DO_COMPRESS) && !defined(do_compress) +# define do_compress LZO_CPP_ECONCAT2(DO_COMPRESS,_core) +#endif + +#if defined(UA_GET64) && (LZO_ABI_BIG_ENDIAN) +# define WANT_lzo_bitops_clz64 1 +#elif defined(UA_GET64) && (LZO_ABI_LITTLE_ENDIAN) +# define WANT_lzo_bitops_ctz64 1 +#elif defined(UA_GET32) && (LZO_ABI_BIG_ENDIAN) +# define WANT_lzo_bitops_clz32 1 +#elif defined(UA_GET32) && (LZO_ABI_LITTLE_ENDIAN) +# define WANT_lzo_bitops_ctz32 1 +#endif + +#if (defined(_WIN32) || defined(_WIN64)) && ((LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_MSC && (_MSC_VER >= 1400))) +#include +#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32) && 0 +#pragma intrinsic(_BitScanReverse) +static __lzo_inline unsigned lzo_bitops_clz32(lzo_uint32 v) +{ + unsigned long r; + (void) _BitScanReverse(&r, v); + return (unsigned) r; +} +#define lzo_bitops_clz32 lzo_bitops_clz32 +#endif +#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX) && 0 +#pragma intrinsic(_BitScanReverse64) +static __lzo_inline unsigned lzo_bitops_clz64(lzo_uint64 v) +{ + unsigned long r; + (void) _BitScanReverse64(&r, v); + return (unsigned) r; +} +#define lzo_bitops_clz64 lzo_bitops_clz64 +#endif +#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32) +#pragma intrinsic(_BitScanForward) +static __lzo_inline unsigned lzo_bitops_ctz32(lzo_uint32 v) +{ + unsigned long r; + (void) _BitScanForward(&r, v); + return (unsigned) r; +} +#define lzo_bitops_ctz32 lzo_bitops_ctz32 +#endif +#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX) +#pragma intrinsic(_BitScanForward64) +static __lzo_inline unsigned lzo_bitops_ctz64(lzo_uint64 v) +{ + unsigned long r; + (void) _BitScanForward64(&r, v); + return (unsigned) r; +} +#define lzo_bitops_ctz64 lzo_bitops_ctz64 +#endif + +#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul)))) +#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32) +#define lzo_bitops_clz32(v) ((unsigned) __builtin_clz(v)) +#endif +#if !defined(lzo_bitops_clz64) && defined(WANT_lzo_bitops_clz64) && defined(LZO_UINT64_MAX) +#define lzo_bitops_clz64(v) ((unsigned) __builtin_clzll(v)) +#endif +#if !defined(lzo_bitops_ctz32) && defined(WANT_lzo_bitops_ctz32) +#define lzo_bitops_ctz32(v) ((unsigned) __builtin_ctz(v)) +#endif +#if !defined(lzo_bitops_ctz64) && defined(WANT_lzo_bitops_ctz64) && defined(LZO_UINT64_MAX) +#define lzo_bitops_ctz64(v) ((unsigned) __builtin_ctzll(v)) +#endif +#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount32) +#define lzo_bitops_popcount32(v) ((unsigned) __builtin_popcount(v)) +#endif +#if !defined(lzo_bitops_popcount32) && defined(WANT_lzo_bitops_popcount64) && defined(LZO_UINT64_MAX) +#define lzo_bitops_popcount64(v) ((unsigned) __builtin_popcountll(v)) +#endif +#endif + +static __lzo_noinline lzo_uint +do_compress ( const lzo_bytep in , lzo_uint in_len, + lzo_bytep out, lzo_uintp out_len, + lzo_uint ti, lzo_voidp wrkmem) +{ + register const lzo_bytep ip; + lzo_bytep op; + const lzo_bytep const in_end = in + in_len; + const lzo_bytep const ip_end = in + in_len - 20; + const lzo_bytep ii; + lzo_dict_p const dict = (lzo_dict_p) wrkmem; + + op = out; + ip = in; + ii = ip; + + ip += ti < 4 ? 4 - ti : 0; + for (;;) + { + const lzo_bytep m_pos; +#if !(LZO_DETERMINISTIC) + LZO_DEFINE_UNINITIALIZED_VAR(lzo_uint, m_off, 0); + lzo_uint m_len; + lzo_uint dindex; +next: + if __lzo_unlikely(ip >= ip_end) + break; + DINDEX1(dindex,ip); + GINDEX(m_pos,m_off,dict,dindex,in); + if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) + goto literal; +#if 1 + if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) + goto try_match; + DINDEX2(dindex,ip); +#endif + GINDEX(m_pos,m_off,dict,dindex,in); + if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) + goto literal; + if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) + goto try_match; + goto literal; + +try_match: +#if defined(UA_GET32) + if (UA_GET32(m_pos) != UA_GET32(ip)) +#else + if (m_pos[0] != ip[0] || m_pos[1] != ip[1] || m_pos[2] != ip[2] || m_pos[3] != ip[3]) +#endif + { +literal: + UPDATE_I(dict,0,dindex,ip,in); + ip += 1 + ((ip - ii) >> 5); + continue; + } + UPDATE_I(dict,0,dindex,ip,in); +#else + lzo_uint m_off; + lzo_uint m_len; + { + lzo_uint32 dv; + lzo_uint dindex; +literal: + ip += 1 + ((ip - ii) >> 5); +next: + if __lzo_unlikely(ip >= ip_end) + break; + dv = UA_GET32(ip); + dindex = DINDEX(dv,ip); + GINDEX(m_off,m_pos,in+dict,dindex,in); + UPDATE_I(dict,0,dindex,ip,in); + if __lzo_unlikely(dv != UA_GET32(m_pos)) + goto literal; + } +#endif + + ii -= ti; ti = 0; + { + register lzo_uint t = pd(ip,ii); + if (t != 0) + { + if (t <= 3) + { + op[-2] |= LZO_BYTE(t); +#if defined(UA_COPY32) + UA_COPY32(op, ii); + op += t; +#else + { do *op++ = *ii++; while (--t > 0); } +#endif + } +#if defined(UA_COPY32) || defined(UA_COPY64) + else if (t <= 16) + { + *op++ = LZO_BYTE(t - 3); +#if defined(UA_COPY64) + UA_COPY64(op, ii); + UA_COPY64(op+8, ii+8); +#else + UA_COPY32(op, ii); + UA_COPY32(op+4, ii+4); + UA_COPY32(op+8, ii+8); + UA_COPY32(op+12, ii+12); +#endif + op += t; + } +#endif + else + { + if (t <= 18) + *op++ = LZO_BYTE(t - 3); + else + { + register lzo_uint tt = t - 18; + *op++ = 0; + while __lzo_unlikely(tt > 255) + { + tt -= 255; +#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400)) + * (volatile unsigned char *) op++ = 0; +#else + *op++ = 0; +#endif + } + assert(tt > 0); + *op++ = LZO_BYTE(tt); + } +#if defined(UA_COPY32) || defined(UA_COPY64) + do { +#if defined(UA_COPY64) + UA_COPY64(op, ii); + UA_COPY64(op+8, ii+8); +#else + UA_COPY32(op, ii); + UA_COPY32(op+4, ii+4); + UA_COPY32(op+8, ii+8); + UA_COPY32(op+12, ii+12); +#endif + op += 16; ii += 16; t -= 16; + } while (t >= 16); if (t > 0) +#endif + { do *op++ = *ii++; while (--t > 0); } + } + } + } + m_len = 4; + { +#if defined(UA_GET64) + lzo_uint64 v; + v = UA_GET64(ip + m_len) ^ UA_GET64(m_pos + m_len); + if __lzo_unlikely(v == 0) { + do { + m_len += 8; + v = UA_GET64(ip + m_len) ^ UA_GET64(m_pos + m_len); + if __lzo_unlikely(ip + m_len >= ip_end) + goto m_len_done; + } while (v == 0); + } +#if (LZO_ABI_BIG_ENDIAN) && defined(lzo_bitops_clz64) + m_len += lzo_bitops_clz64(v) / CHAR_BIT; +#elif (LZO_ABI_BIG_ENDIAN) + if ((v >> (64 - CHAR_BIT)) == 0) do { + v <<= CHAR_BIT; + m_len += 1; + } while ((v >> (64 - CHAR_BIT)) == 0); +#elif (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz64) + m_len += lzo_bitops_ctz64(v) / CHAR_BIT; +#elif (LZO_ABI_LITTLE_ENDIAN) + if ((v & UCHAR_MAX) == 0) do { + v >>= CHAR_BIT; + m_len += 1; + } while ((v & UCHAR_MAX) == 0); +#else + if (ip[m_len] == m_pos[m_len]) do { + m_len += 1; + } while (ip[m_len] == m_pos[m_len]); +#endif +#elif defined(UA_GET32) + lzo_uint32 v; + v = UA_GET32(ip + m_len) ^ UA_GET32(m_pos + m_len); + if __lzo_unlikely(v == 0) { + do { + m_len += 4; + v = UA_GET32(ip + m_len) ^ UA_GET32(m_pos + m_len); + if __lzo_unlikely(ip + m_len >= ip_end) + goto m_len_done; + } while (v == 0); + } +#if (LZO_ABI_BIG_ENDIAN) && defined(lzo_bitops_clz32) + m_len += lzo_bitops_clz32(v) / CHAR_BIT; +#elif (LZO_ABI_BIG_ENDIAN) + if ((v >> (32 - CHAR_BIT)) == 0) do { + v <<= CHAR_BIT; + m_len += 1; + } while ((v >> (32 - CHAR_BIT)) == 0); +#elif (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz32) + m_len += lzo_bitops_ctz32(v) / CHAR_BIT; +#elif (LZO_ABI_LITTLE_ENDIAN) + if ((v & UCHAR_MAX) == 0) do { + v >>= CHAR_BIT; + m_len += 1; + } while ((v & UCHAR_MAX) == 0); +#else + if (ip[m_len] == m_pos[m_len]) do { + m_len += 1; + } while (ip[m_len] == m_pos[m_len]); +#endif +#else + if __lzo_unlikely(ip[m_len] == m_pos[m_len]) { + do { + m_len += 1; + if __lzo_unlikely(ip + m_len >= ip_end) + goto m_len_done; + } while (ip[m_len] == m_pos[m_len]); + } +#endif + } +m_len_done: + m_off = pd(ip,m_pos); + ip += m_len; + ii = ip; + if (m_len <= M2_MAX_LEN && m_off <= M2_MAX_OFFSET) + { + m_off -= 1; +#if defined(LZO1X) + *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); + *op++ = LZO_BYTE(m_off >> 3); +#elif defined(LZO1Y) + *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); + *op++ = LZO_BYTE(m_off >> 2); +#endif + } + else if (m_off <= M3_MAX_OFFSET) + { + m_off -= 1; + if (m_len <= M3_MAX_LEN) + *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); + else + { + m_len -= M3_MAX_LEN; + *op++ = M3_MARKER | 0; + while __lzo_unlikely(m_len > 255) + { + m_len -= 255; +#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400)) + * (volatile unsigned char *) op++ = 0; +#else + *op++ = 0; +#endif + } + *op++ = LZO_BYTE(m_len); + } + *op++ = LZO_BYTE(m_off << 2); + *op++ = LZO_BYTE(m_off >> 6); + } + else + { + m_off -= 0x4000; + if (m_len <= M4_MAX_LEN) + *op++ = LZO_BYTE(M4_MARKER | ((m_off >> 11) & 8) | (m_len - 2)); + else + { + m_len -= M4_MAX_LEN; + *op++ = LZO_BYTE(M4_MARKER | ((m_off >> 11) & 8)); + while __lzo_unlikely(m_len > 255) + { + m_len -= 255; +#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400)) + * (volatile unsigned char *) op++ = 0; +#else + *op++ = 0; +#endif + } + *op++ = LZO_BYTE(m_len); + } + *op++ = LZO_BYTE(m_off << 2); + *op++ = LZO_BYTE(m_off >> 6); + } + goto next; + } + + *out_len = pd(op, out); + return pd(in_end,ii-ti); +} + +LZO_PUBLIC(int) +DO_COMPRESS ( const lzo_bytep in , lzo_uint in_len, + lzo_bytep out, lzo_uintp out_len, + lzo_voidp wrkmem ) +{ + const lzo_bytep ip = in; + lzo_bytep op = out; + lzo_uint l = in_len; + lzo_uint t = 0; + + while (l > 20) + { + lzo_uint ll = l; + lzo_uintptr_t ll_end; +#if 0 || (LZO_DETERMINISTIC) + ll = LZO_MIN(ll, 49152); +#endif + ll_end = (lzo_uintptr_t)ip + ll; + if ((ll_end + ((t + ll) >> 5)) <= ll_end || (const lzo_bytep)(ll_end + ((t + ll) >> 5)) <= ip + ll) + break; +#if (LZO_DETERMINISTIC) + lzo_memset(wrkmem, 0, ((lzo_uint)1 << D_BITS) * sizeof(lzo_dict_t)); +#endif + t = do_compress(ip,ll,op,out_len,t,wrkmem); + ip += ll; + op += *out_len; + l -= ll; + } + t += l; + + if (t > 0) + { + const lzo_bytep ii = in + in_len - t; + + if (op == out && t <= 238) + *op++ = LZO_BYTE(17 + t); + else if (t <= 3) + op[-2] |= LZO_BYTE(t); + else if (t <= 18) + *op++ = LZO_BYTE(t - 3); + else + { + lzo_uint tt = t - 18; + + *op++ = 0; + while (tt > 255) + { + tt -= 255; +#if 1 && (LZO_CC_MSC && (_MSC_VER >= 1400)) + + * (volatile unsigned char *) op++ = 0; +#else + *op++ = 0; +#endif + } + assert(tt > 0); + *op++ = LZO_BYTE(tt); + } + do *op++ = *ii++; while (--t > 0); + } + + *op++ = M4_MARKER | 1; + *op++ = 0; + *op++ = 0; + + *out_len = pd(op, out); + return LZO_E_OK; +} + +#endif + +#undef do_compress +#undef DO_COMPRESS +#undef LZO_HASH + +#undef LZO_TEST_OVERRUN +#undef DO_DECOMPRESS +#define DO_DECOMPRESS lzo1x_decompress + +#if !defined(MINILZO_CFG_SKIP_LZO1X_DECOMPRESS) + +#if defined(LZO_TEST_OVERRUN) +# if !defined(LZO_TEST_OVERRUN_INPUT) +# define LZO_TEST_OVERRUN_INPUT 2 +# endif +# if !defined(LZO_TEST_OVERRUN_OUTPUT) +# define LZO_TEST_OVERRUN_OUTPUT 2 +# endif +# if !defined(LZO_TEST_OVERRUN_LOOKBEHIND) +# define LZO_TEST_OVERRUN_LOOKBEHIND 1 +# endif +#endif + +#undef TEST_IP +#undef TEST_OP +#undef TEST_LB +#undef TEST_LBO +#undef NEED_IP +#undef NEED_OP +#undef HAVE_TEST_IP +#undef HAVE_TEST_OP +#undef HAVE_NEED_IP +#undef HAVE_NEED_OP +#undef HAVE_ANY_IP +#undef HAVE_ANY_OP + +#if defined(LZO_TEST_OVERRUN_INPUT) +# if (LZO_TEST_OVERRUN_INPUT >= 1) +# define TEST_IP (ip < ip_end) +# endif +# if (LZO_TEST_OVERRUN_INPUT >= 2) +# define NEED_IP(x) \ + if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun +# endif +#endif + +#if defined(LZO_TEST_OVERRUN_OUTPUT) +# if (LZO_TEST_OVERRUN_OUTPUT >= 1) +# define TEST_OP (op <= op_end) +# endif +# if (LZO_TEST_OVERRUN_OUTPUT >= 2) +# undef TEST_OP +# define NEED_OP(x) \ + if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun +# endif +#endif + +#if defined(LZO_TEST_OVERRUN_LOOKBEHIND) +# define TEST_LB(m_pos) if (m_pos < out || m_pos >= op) goto lookbehind_overrun +# define TEST_LBO(m_pos,o) if (m_pos < out || m_pos >= op - (o)) goto lookbehind_overrun +#else +# define TEST_LB(m_pos) ((void) 0) +# define TEST_LBO(m_pos,o) ((void) 0) +#endif + +#if !defined(LZO_EOF_CODE) && !defined(TEST_IP) +# define TEST_IP (ip < ip_end) +#endif + +#if defined(TEST_IP) +# define HAVE_TEST_IP 1 +#else +# define TEST_IP 1 +#endif +#if defined(TEST_OP) +# define HAVE_TEST_OP 1 +#else +# define TEST_OP 1 +#endif + +#if defined(NEED_IP) +# define HAVE_NEED_IP 1 +#else +# define NEED_IP(x) ((void) 0) +#endif +#if defined(NEED_OP) +# define HAVE_NEED_OP 1 +#else +# define NEED_OP(x) ((void) 0) +#endif + +#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP) +# define HAVE_ANY_IP 1 +#endif +#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP) +# define HAVE_ANY_OP 1 +#endif + +#if defined(DO_DECOMPRESS) +LZO_PUBLIC(int) +DO_DECOMPRESS ( const lzo_bytep in , lzo_uint in_len, + lzo_bytep out, lzo_uintp out_len, + lzo_voidp wrkmem ) +#endif +{ + register lzo_bytep op; + register const lzo_bytep ip; + register lzo_uint t; +#if defined(COPY_DICT) + lzo_uint m_off; + const lzo_bytep dict_end; +#else + register const lzo_bytep m_pos; +#endif + + const lzo_bytep const ip_end = in + in_len; +#if defined(HAVE_ANY_OP) + lzo_bytep const op_end = out + *out_len; +#endif +#if defined(LZO1Z) + lzo_uint last_m_off = 0; +#endif + + LZO_UNUSED(wrkmem); + +#if defined(COPY_DICT) + if (dict) + { + if (dict_len > M4_MAX_OFFSET) + { + dict += dict_len - M4_MAX_OFFSET; + dict_len = M4_MAX_OFFSET; + } + dict_end = dict + dict_len; + } + else + { + dict_len = 0; + dict_end = NULL; + } +#endif + + *out_len = 0; + + op = out; + ip = in; + + if (*ip > 17) + { + t = *ip++ - 17; + if (t < 4) + goto match_next; + assert(t > 0); NEED_OP(t); NEED_IP(t+1); + do *op++ = *ip++; while (--t > 0); + goto first_literal_run; + } + + while (TEST_IP && TEST_OP) + { + t = *ip++; + if (t >= 16) + goto match; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 15 + *ip++; + } + assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); +#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4) + t += 3; + if (t >= 8) do + { + UA_COPY64(op,ip); + op += 8; ip += 8; t -= 8; + } while (t >= 8); + if (t >= 4) + { + UA_COPY32(op,ip); + op += 4; ip += 4; t -= 4; + } + if (t > 0) + { + *op++ = *ip++; + if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } + } +#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) +#if !defined(LZO_UNALIGNED_OK_4) + if (PTR_ALIGNED2_4(op,ip)) + { +#endif + UA_COPY32(op,ip); + op += 4; ip += 4; + if (--t > 0) + { + if (t >= 4) + { + do { + UA_COPY32(op,ip); + op += 4; ip += 4; t -= 4; + } while (t >= 4); + if (t > 0) do *op++ = *ip++; while (--t > 0); + } + else + do *op++ = *ip++; while (--t > 0); + } +#if !defined(LZO_UNALIGNED_OK_4) + } + else +#endif +#endif +#if !defined(LZO_UNALIGNED_OK_4) && !defined(LZO_UNALIGNED_OK_8) + { + *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; + do *op++ = *ip++; while (--t > 0); + } +#endif + +first_literal_run: + + t = *ip++; + if (t >= 16) + goto match; +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); + last_m_off = m_off; +#else + m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); +#endif + NEED_OP(3); + t = 3; COPY_DICT(t,m_off) +#else +#if defined(LZO1Z) + t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); + m_pos = op - t; + last_m_off = t; +#else + m_pos = op - (1 + M2_MAX_OFFSET); + m_pos -= t >> 2; + m_pos -= *ip++ << 2; +#endif + TEST_LB(m_pos); NEED_OP(3); + *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; +#endif + goto match_done; + + do { +match: + if (t >= 64) + { +#if defined(COPY_DICT) +#if defined(LZO1X) + m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); + t = (t >> 5) - 1; +#elif defined(LZO1Y) + m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); + t = (t >> 4) - 3; +#elif defined(LZO1Z) + m_off = t & 0x1f; + if (m_off >= 0x1c) + m_off = last_m_off; + else + { + m_off = 1 + (m_off << 6) + (*ip++ >> 2); + last_m_off = m_off; + } + t = (t >> 5) - 1; +#endif +#else +#if defined(LZO1X) + m_pos = op - 1; + m_pos -= (t >> 2) & 7; + m_pos -= *ip++ << 3; + t = (t >> 5) - 1; +#elif defined(LZO1Y) + m_pos = op - 1; + m_pos -= (t >> 2) & 3; + m_pos -= *ip++ << 2; + t = (t >> 4) - 3; +#elif defined(LZO1Z) + { + lzo_uint off = t & 0x1f; + m_pos = op; + if (off >= 0x1c) + { + assert(last_m_off > 0); + m_pos -= last_m_off; + } + else + { + off = 1 + (off << 6) + (*ip++ >> 2); + m_pos -= off; + last_m_off = off; + } + } + t = (t >> 5) - 1; +#endif + TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); + goto copy_match; +#endif + } + else if (t >= 32) + { + t &= 31; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 31 + *ip++; + } +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); + last_m_off = m_off; +#else + m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); +#endif +#else +#if defined(LZO1Z) + { + lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2); + m_pos = op - off; + last_m_off = off; + } +#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) + m_pos = op - 1; + m_pos -= UA_GET16(ip) >> 2; +#else + m_pos = op - 1; + m_pos -= (ip[0] >> 2) + (ip[1] << 6); +#endif +#endif + ip += 2; + } + else if (t >= 16) + { +#if defined(COPY_DICT) + m_off = (t & 8) << 11; +#else + m_pos = op; + m_pos -= (t & 8) << 11; +#endif + t &= 7; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 7 + *ip++; + } +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off += (ip[0] << 6) + (ip[1] >> 2); +#else + m_off += (ip[0] >> 2) + (ip[1] << 6); +#endif + ip += 2; + if (m_off == 0) + goto eof_found; + m_off += 0x4000; +#if defined(LZO1Z) + last_m_off = m_off; +#endif +#else +#if defined(LZO1Z) + m_pos -= (ip[0] << 6) + (ip[1] >> 2); +#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) + m_pos -= UA_GET16(ip) >> 2; +#else + m_pos -= (ip[0] >> 2) + (ip[1] << 6); +#endif + ip += 2; + if (m_pos == op) + goto eof_found; + m_pos -= 0x4000; +#if defined(LZO1Z) + last_m_off = pd((const lzo_bytep)op, m_pos); +#endif +#endif + } + else + { +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off = 1 + (t << 6) + (*ip++ >> 2); + last_m_off = m_off; +#else + m_off = 1 + (t >> 2) + (*ip++ << 2); +#endif + NEED_OP(2); + t = 2; COPY_DICT(t,m_off) +#else +#if defined(LZO1Z) + t = 1 + (t << 6) + (*ip++ >> 2); + m_pos = op - t; + last_m_off = t; +#else + m_pos = op - 1; + m_pos -= t >> 2; + m_pos -= *ip++ << 2; +#endif + TEST_LB(m_pos); NEED_OP(2); + *op++ = *m_pos++; *op++ = *m_pos; +#endif + goto match_done; + } + +#if defined(COPY_DICT) + + NEED_OP(t+3-1); + t += 3-1; COPY_DICT(t,m_off) + +#else + + TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); +#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4) + if (op - m_pos >= 8) + { + t += (3 - 1); + if (t >= 8) do + { + UA_COPY64(op,m_pos); + op += 8; m_pos += 8; t -= 8; + } while (t >= 8); + if (t >= 4) + { + UA_COPY32(op,m_pos); + op += 4; m_pos += 4; t -= 4; + } + if (t > 0) + { + *op++ = m_pos[0]; + if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } } + } + } + else +#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) +#if !defined(LZO_UNALIGNED_OK_4) + if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos)) + { + assert((op - m_pos) >= 4); +#else + if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) + { +#endif + UA_COPY32(op,m_pos); + op += 4; m_pos += 4; t -= 4 - (3 - 1); + do { + UA_COPY32(op,m_pos); + op += 4; m_pos += 4; t -= 4; + } while (t >= 4); + if (t > 0) do *op++ = *m_pos++; while (--t > 0); + } + else +#endif + { +copy_match: + *op++ = *m_pos++; *op++ = *m_pos++; + do *op++ = *m_pos++; while (--t > 0); + } + +#endif + +match_done: +#if defined(LZO1Z) + t = ip[-1] & 3; +#else + t = ip[-2] & 3; +#endif + if (t == 0) + break; + +match_next: + assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1); +#if 0 + do *op++ = *ip++; while (--t > 0); +#else + *op++ = *ip++; + if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } +#endif + t = *ip++; + } while (TEST_IP && TEST_OP); + } + +#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) + *out_len = pd(op, out); + return LZO_E_EOF_NOT_FOUND; +#endif + +eof_found: + assert(t == 1); + *out_len = pd(op, out); + return (ip == ip_end ? LZO_E_OK : + (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); + +#if defined(HAVE_NEED_IP) +input_overrun: + *out_len = pd(op, out); + return LZO_E_INPUT_OVERRUN; +#endif + +#if defined(HAVE_NEED_OP) +output_overrun: + *out_len = pd(op, out); + return LZO_E_OUTPUT_OVERRUN; +#endif + +#if defined(LZO_TEST_OVERRUN_LOOKBEHIND) +lookbehind_overrun: + *out_len = pd(op, out); + return LZO_E_LOOKBEHIND_OVERRUN; +#endif +} + +#endif + +#define LZO_TEST_OVERRUN 1 +#undef DO_DECOMPRESS +#define DO_DECOMPRESS lzo1x_decompress_safe + +#if !defined(MINILZO_CFG_SKIP_LZO1X_DECOMPRESS_SAFE) + +#if defined(LZO_TEST_OVERRUN) +# if !defined(LZO_TEST_OVERRUN_INPUT) +# define LZO_TEST_OVERRUN_INPUT 2 +# endif +# if !defined(LZO_TEST_OVERRUN_OUTPUT) +# define LZO_TEST_OVERRUN_OUTPUT 2 +# endif +# if !defined(LZO_TEST_OVERRUN_LOOKBEHIND) +# define LZO_TEST_OVERRUN_LOOKBEHIND 1 +# endif +#endif + +#undef TEST_IP +#undef TEST_OP +#undef TEST_LB +#undef TEST_LBO +#undef NEED_IP +#undef NEED_OP +#undef HAVE_TEST_IP +#undef HAVE_TEST_OP +#undef HAVE_NEED_IP +#undef HAVE_NEED_OP +#undef HAVE_ANY_IP +#undef HAVE_ANY_OP + +#if defined(LZO_TEST_OVERRUN_INPUT) +# if (LZO_TEST_OVERRUN_INPUT >= 1) +# define TEST_IP (ip < ip_end) +# endif +# if (LZO_TEST_OVERRUN_INPUT >= 2) +# define NEED_IP(x) \ + if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun +# endif +#endif + +#if defined(LZO_TEST_OVERRUN_OUTPUT) +# if (LZO_TEST_OVERRUN_OUTPUT >= 1) +# define TEST_OP (op <= op_end) +# endif +# if (LZO_TEST_OVERRUN_OUTPUT >= 2) +# undef TEST_OP +# define NEED_OP(x) \ + if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun +# endif +#endif + +#if defined(LZO_TEST_OVERRUN_LOOKBEHIND) +# define TEST_LB(m_pos) if (m_pos < out || m_pos >= op) goto lookbehind_overrun +# define TEST_LBO(m_pos,o) if (m_pos < out || m_pos >= op - (o)) goto lookbehind_overrun +#else +# define TEST_LB(m_pos) ((void) 0) +# define TEST_LBO(m_pos,o) ((void) 0) +#endif + +#if !defined(LZO_EOF_CODE) && !defined(TEST_IP) +# define TEST_IP (ip < ip_end) +#endif + +#if defined(TEST_IP) +# define HAVE_TEST_IP 1 +#else +# define TEST_IP 1 +#endif +#if defined(TEST_OP) +# define HAVE_TEST_OP 1 +#else +# define TEST_OP 1 +#endif + +#if defined(NEED_IP) +# define HAVE_NEED_IP 1 +#else +# define NEED_IP(x) ((void) 0) +#endif +#if defined(NEED_OP) +# define HAVE_NEED_OP 1 +#else +# define NEED_OP(x) ((void) 0) +#endif + +#if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP) +# define HAVE_ANY_IP 1 +#endif +#if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP) +# define HAVE_ANY_OP 1 +#endif + +#if defined(DO_DECOMPRESS) +LZO_PUBLIC(int) +DO_DECOMPRESS ( const lzo_bytep in , lzo_uint in_len, + lzo_bytep out, lzo_uintp out_len, + lzo_voidp wrkmem ) +#endif +{ + register lzo_bytep op; + register const lzo_bytep ip; + register lzo_uint t; +#if defined(COPY_DICT) + lzo_uint m_off; + const lzo_bytep dict_end; +#else + register const lzo_bytep m_pos; +#endif + + const lzo_bytep const ip_end = in + in_len; +#if defined(HAVE_ANY_OP) + lzo_bytep const op_end = out + *out_len; +#endif +#if defined(LZO1Z) + lzo_uint last_m_off = 0; +#endif + + LZO_UNUSED(wrkmem); + +#if defined(COPY_DICT) + if (dict) + { + if (dict_len > M4_MAX_OFFSET) + { + dict += dict_len - M4_MAX_OFFSET; + dict_len = M4_MAX_OFFSET; + } + dict_end = dict + dict_len; + } + else + { + dict_len = 0; + dict_end = NULL; + } +#endif + + *out_len = 0; + + op = out; + ip = in; + + if (*ip > 17) + { + t = *ip++ - 17; + if (t < 4) + goto match_next; + assert(t > 0); NEED_OP(t); NEED_IP(t+1); + do *op++ = *ip++; while (--t > 0); + goto first_literal_run; + } + + while (TEST_IP && TEST_OP) + { + t = *ip++; + if (t >= 16) + goto match; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 15 + *ip++; + } + assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); +#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4) + t += 3; + if (t >= 8) do + { + UA_COPY64(op,ip); + op += 8; ip += 8; t -= 8; + } while (t >= 8); + if (t >= 4) + { + UA_COPY32(op,ip); + op += 4; ip += 4; t -= 4; + } + if (t > 0) + { + *op++ = *ip++; + if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } + } +#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) +#if !defined(LZO_UNALIGNED_OK_4) + if (PTR_ALIGNED2_4(op,ip)) + { +#endif + UA_COPY32(op,ip); + op += 4; ip += 4; + if (--t > 0) + { + if (t >= 4) + { + do { + UA_COPY32(op,ip); + op += 4; ip += 4; t -= 4; + } while (t >= 4); + if (t > 0) do *op++ = *ip++; while (--t > 0); + } + else + do *op++ = *ip++; while (--t > 0); + } +#if !defined(LZO_UNALIGNED_OK_4) + } + else +#endif +#endif +#if !defined(LZO_UNALIGNED_OK_4) && !defined(LZO_UNALIGNED_OK_8) + { + *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; + do *op++ = *ip++; while (--t > 0); + } +#endif + +first_literal_run: + + t = *ip++; + if (t >= 16) + goto match; +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); + last_m_off = m_off; +#else + m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); +#endif + NEED_OP(3); + t = 3; COPY_DICT(t,m_off) +#else +#if defined(LZO1Z) + t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); + m_pos = op - t; + last_m_off = t; +#else + m_pos = op - (1 + M2_MAX_OFFSET); + m_pos -= t >> 2; + m_pos -= *ip++ << 2; +#endif + TEST_LB(m_pos); NEED_OP(3); + *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; +#endif + goto match_done; + + do { +match: + if (t >= 64) + { +#if defined(COPY_DICT) +#if defined(LZO1X) + m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); + t = (t >> 5) - 1; +#elif defined(LZO1Y) + m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); + t = (t >> 4) - 3; +#elif defined(LZO1Z) + m_off = t & 0x1f; + if (m_off >= 0x1c) + m_off = last_m_off; + else + { + m_off = 1 + (m_off << 6) + (*ip++ >> 2); + last_m_off = m_off; + } + t = (t >> 5) - 1; +#endif +#else +#if defined(LZO1X) + m_pos = op - 1; + m_pos -= (t >> 2) & 7; + m_pos -= *ip++ << 3; + t = (t >> 5) - 1; +#elif defined(LZO1Y) + m_pos = op - 1; + m_pos -= (t >> 2) & 3; + m_pos -= *ip++ << 2; + t = (t >> 4) - 3; +#elif defined(LZO1Z) + { + lzo_uint off = t & 0x1f; + m_pos = op; + if (off >= 0x1c) + { + assert(last_m_off > 0); + m_pos -= last_m_off; + } + else + { + off = 1 + (off << 6) + (*ip++ >> 2); + m_pos -= off; + last_m_off = off; + } + } + t = (t >> 5) - 1; +#endif + TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); + goto copy_match; +#endif + } + else if (t >= 32) + { + t &= 31; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 31 + *ip++; + } +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); + last_m_off = m_off; +#else + m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); +#endif +#else +#if defined(LZO1Z) + { + lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2); + m_pos = op - off; + last_m_off = off; + } +#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) + m_pos = op - 1; + m_pos -= UA_GET16(ip) >> 2; +#else + m_pos = op - 1; + m_pos -= (ip[0] >> 2) + (ip[1] << 6); +#endif +#endif + ip += 2; + } + else if (t >= 16) + { +#if defined(COPY_DICT) + m_off = (t & 8) << 11; +#else + m_pos = op; + m_pos -= (t & 8) << 11; +#endif + t &= 7; + if (t == 0) + { + NEED_IP(1); + while (*ip == 0) + { + t += 255; + ip++; + NEED_IP(1); + } + t += 7 + *ip++; + } +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off += (ip[0] << 6) + (ip[1] >> 2); +#else + m_off += (ip[0] >> 2) + (ip[1] << 6); +#endif + ip += 2; + if (m_off == 0) + goto eof_found; + m_off += 0x4000; +#if defined(LZO1Z) + last_m_off = m_off; +#endif +#else +#if defined(LZO1Z) + m_pos -= (ip[0] << 6) + (ip[1] >> 2); +#elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) + m_pos -= UA_GET16(ip) >> 2; +#else + m_pos -= (ip[0] >> 2) + (ip[1] << 6); +#endif + ip += 2; + if (m_pos == op) + goto eof_found; + m_pos -= 0x4000; +#if defined(LZO1Z) + last_m_off = pd((const lzo_bytep)op, m_pos); +#endif +#endif + } + else + { +#if defined(COPY_DICT) +#if defined(LZO1Z) + m_off = 1 + (t << 6) + (*ip++ >> 2); + last_m_off = m_off; +#else + m_off = 1 + (t >> 2) + (*ip++ << 2); +#endif + NEED_OP(2); + t = 2; COPY_DICT(t,m_off) +#else +#if defined(LZO1Z) + t = 1 + (t << 6) + (*ip++ >> 2); + m_pos = op - t; + last_m_off = t; +#else + m_pos = op - 1; + m_pos -= t >> 2; + m_pos -= *ip++ << 2; +#endif + TEST_LB(m_pos); NEED_OP(2); + *op++ = *m_pos++; *op++ = *m_pos; +#endif + goto match_done; + } + +#if defined(COPY_DICT) + + NEED_OP(t+3-1); + t += 3-1; COPY_DICT(t,m_off) + +#else + + TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); +#if defined(LZO_UNALIGNED_OK_8) && defined(LZO_UNALIGNED_OK_4) + if (op - m_pos >= 8) + { + t += (3 - 1); + if (t >= 8) do + { + UA_COPY64(op,m_pos); + op += 8; m_pos += 8; t -= 8; + } while (t >= 8); + if (t >= 4) + { + UA_COPY32(op,m_pos); + op += 4; m_pos += 4; t -= 4; + } + if (t > 0) + { + *op++ = m_pos[0]; + if (t > 1) { *op++ = m_pos[1]; if (t > 2) { *op++ = m_pos[2]; } } + } + } + else +#elif defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) +#if !defined(LZO_UNALIGNED_OK_4) + if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos)) + { + assert((op - m_pos) >= 4); +#else + if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) + { +#endif + UA_COPY32(op,m_pos); + op += 4; m_pos += 4; t -= 4 - (3 - 1); + do { + UA_COPY32(op,m_pos); + op += 4; m_pos += 4; t -= 4; + } while (t >= 4); + if (t > 0) do *op++ = *m_pos++; while (--t > 0); + } + else +#endif + { +copy_match: + *op++ = *m_pos++; *op++ = *m_pos++; + do *op++ = *m_pos++; while (--t > 0); + } + +#endif + +match_done: +#if defined(LZO1Z) + t = ip[-1] & 3; +#else + t = ip[-2] & 3; +#endif + if (t == 0) + break; + +match_next: + assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1); +#if 0 + do *op++ = *ip++; while (--t > 0); +#else + *op++ = *ip++; + if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } +#endif + t = *ip++; + } while (TEST_IP && TEST_OP); + } + +#if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) + *out_len = pd(op, out); + return LZO_E_EOF_NOT_FOUND; +#endif + +eof_found: + assert(t == 1); + *out_len = pd(op, out); + return (ip == ip_end ? LZO_E_OK : + (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); + +#if defined(HAVE_NEED_IP) +input_overrun: + *out_len = pd(op, out); + return LZO_E_INPUT_OVERRUN; +#endif + +#if defined(HAVE_NEED_OP) +output_overrun: + *out_len = pd(op, out); + return LZO_E_OUTPUT_OVERRUN; +#endif + +#if defined(LZO_TEST_OVERRUN_LOOKBEHIND) +lookbehind_overrun: + *out_len = pd(op, out); + return LZO_E_LOOKBEHIND_OVERRUN; +#endif +} + +#endif + +/***** End of minilzo.c *****/ + diff --git a/Mednafen/mednafen/compress/minilzo.h b/Mednafen/mednafen/compress/minilzo.h new file mode 100644 index 0000000000..4c7b237849 --- /dev/null +++ b/Mednafen/mednafen/compress/minilzo.h @@ -0,0 +1,109 @@ +/* minilzo.h -- mini subset of the LZO real-time data compression library + + This file is part of the LZO real-time data compression library. + + Copyright (C) 2011 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer + All Rights Reserved. + + The LZO library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + The LZO library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the LZO library; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Markus F.X.J. Oberhumer + + http://www.oberhumer.com/opensource/lzo/ + */ + +/* + * NOTE: + * the full LZO package can be found at + * http://www.oberhumer.com/opensource/lzo/ + */ + + +#ifndef __MINILZO_H +#define __MINILZO_H 1 + +#define MINILZO_VERSION 0x2060 + +#ifdef __LZOCONF_H +# error "you cannot use both LZO and miniLZO" +#endif + +#undef LZO_HAVE_CONFIG_H +#include "lzoconf.h" + +#if !defined(LZO_VERSION) || (LZO_VERSION != MINILZO_VERSION) +# error "version mismatch in header files" +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +/*********************************************************************** +// +************************************************************************/ + +/* Memory required for the wrkmem parameter. + * When the required size is 0, you can also pass a NULL pointer. + */ + +#define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS +#define LZO1X_1_MEM_COMPRESS ((lzo_uint32) (16384L * lzo_sizeof_dict_t)) +#define LZO1X_MEM_DECOMPRESS (0) + + +/* compression */ +LZO_EXTERN(int) +lzo1x_1_compress ( const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem ); + +/* decompression */ +LZO_EXTERN(int) +lzo1x_decompress ( const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem /* NOT USED */ ); + +/* safe decompression with overrun testing */ +LZO_EXTERN(int) +lzo1x_decompress_safe ( const lzo_bytep src, lzo_uint src_len, + lzo_bytep dst, lzo_uintp dst_len, + lzo_voidp wrkmem /* NOT USED */ ); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* already included */ + diff --git a/Mednafen/mednafen/compress/unzip.c b/Mednafen/mednafen/compress/unzip.c new file mode 100644 index 0000000000..362dcc1cb0 --- /dev/null +++ b/Mednafen/mednafen/compress/unzip.c @@ -0,0 +1,1561 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + Read unzip.h for more info +*/ + +/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of +compatibility with older software. The following is from the original crypt.c. Code +woven in by Terry Thorsen 1/2003. +*/ +/* + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + */ + +/* + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + */ + +/* Altered for use in Mednafen: + Removed encryption code. +*/ + +#include +#include +#include +#include "zlib.h" +#ifndef OF +#define OF(a) a +#endif +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile;/* relative offset of local header 4 bytes */ +} unz_file_info_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + uLong offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + uLong pos_local_extrafield; /* position in the local extra field in read*/ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be decompressed */ + uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip_read_info_s; + + +/* unz_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + uLong num_file; /* number of the current file in the zipfile*/ + uLong pos_in_central_dir; /* pos of the current file in the central dir*/ + uLong current_file_ok; /* flag about the usability of the current file*/ + uLong central_pos; /* position of the beginning of the central dir*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file in zip*/ + unz_file_info_internal cur_file_info_internal; /* private info about it*/ + file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; +} unz_s; + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unzlocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unzlocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unzlocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) + const char *path; + zlib_filefunc_def* pzlib_filefunc_def; +{ + unz_s us; + unz_s *s; + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&us.z_filefunc); + else + us.z_filefunc = *pzlib_filefunc_def; + + us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + if (ZSEEK(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (ZSEEK(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + + if ((err==UNZ_OK) && (extraField!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } + else + lSeek+=file_info.size_file_extra; + + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info cur_file_infoSaved; + unz_file_info_internal cur_file_info_internalSaved; + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; // offset in file + uLong num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGoToFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) + unzFile file; + int* method; + int* level; + int raw; + const char* password; +{ + int err=UNZ_OK; + uInt iSizeVar; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ + if (password != NULL) + return UNZ_PARAMERROR; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, + &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s*) + ALLOC(sizeof(file_in_zip_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_DEFLATED) && + (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=1; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (file) + unzFile file; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (file, password) + unzFile file; + const char* password; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) + unzFile file; + int* method; + int* level; + int raw; +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ + unz_s* s; + uLong uReadThis ; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern uLong ZEXPORT unzGetOffset (file) + unzFile file; +{ + unz_s* s; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern int ZEXPORT unzSetOffset (file, pos) + unzFile file; + uLong pos; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} diff --git a/Mednafen/mednafen/compress/unzip.h b/Mednafen/mednafen/compress/unzip.h new file mode 100644 index 0000000000..b6fff6af7c --- /dev/null +++ b/Mednafen/mednafen/compress/unzip.h @@ -0,0 +1,357 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#ifndef OF +#define OF(a) a +#endif +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/Mednafen/mednafen/cputest/Makefile.am.inc b/Mednafen/mednafen/cputest/Makefile.am.inc new file mode 100644 index 0000000000..eca5d0e220 --- /dev/null +++ b/Mednafen/mednafen/cputest/Makefile.am.inc @@ -0,0 +1,13 @@ +mednafen_SOURCES += cputest/cputest.c + +if ARCH_X86 +mednafen_SOURCES += cputest/x86_cpu.c +endif + +if ARCH_POWERPC +mednafen_SOURCES += cputest/ppc_cpu.c +endif + +#if ARCH_ARM +#mednafen_SOURCES += cputest/arm_cpu.c +#endif diff --git a/Mednafen/mednafen/cputest/README b/Mednafen/mednafen/cputest/README new file mode 100644 index 0000000000..cf38101162 --- /dev/null +++ b/Mednafen/mednafen/cputest/README @@ -0,0 +1,3 @@ +modified slightly for usage in Mednafen + +ARM stuff not compiled in, for now. diff --git a/Mednafen/mednafen/cputest/arm_cpu.c b/Mednafen/mednafen/cputest/arm_cpu.c new file mode 100644 index 0000000000..cc1189b9e0 --- /dev/null +++ b/Mednafen/mednafen/cputest/arm_cpu.c @@ -0,0 +1,29 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "cputest.h" +#ifdef HAVE_CONFIG_H +#include +#endif + +int ff_get_cpu_flags_arm(void) +{ + + return 0; + // return HAVE_IWMMXT * CPUTEST_FLAG_IWMMXT; +} diff --git a/Mednafen/mednafen/cputest/cputest.c b/Mednafen/mednafen/cputest/cputest.c new file mode 100644 index 0000000000..113d1ab14a --- /dev/null +++ b/Mednafen/mednafen/cputest/cputest.c @@ -0,0 +1,86 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "cputest.h" +#ifdef HAVE_CONFIG_H +#include +#endif + +static int flags, checked = 0; + + +void cputest_force_flags(int arg) +{ + flags = arg; + checked = 1; +} + +int cputest_get_flags(void) +{ + if (checked) + return flags; + +// if (ARCH_ARM) flags = ff_get_cpu_flags_arm(); +#if ARCH_POWERPC + flags = ff_get_cpu_flags_ppc(); +#endif + +#if ARCH_X86 + flags = ff_get_cpu_flags_x86(); +#endif + + checked = 1; + return flags; +} + +#if 0 +//#ifdef TEST + +#undef printf +#include + +int main(void) +{ + int cpu_flags = av_get_cpu_flags(); + + printf("cpu_flags = 0x%08X\n", cpu_flags); + printf("cpu_flags = %s%s%s%s%s%s%s%s%s%s%s%s%s\n", +#if ARCH_ARM + cpu_flags & CPUTEST_FLAG_IWMMXT ? "IWMMXT " : "", +#elif ARCH_POWERPC + cpu_flags & CPUTEST_FLAG_ALTIVEC ? "ALTIVEC " : "", +#elif ARCH_X86 + cpu_flags & CPUTEST_FLAG_MMX ? "MMX " : "", + cpu_flags & CPUTEST_FLAG_MMX2 ? "MMX2 " : "", + cpu_flags & CPUTEST_FLAG_SSE ? "SSE " : "", + cpu_flags & CPUTEST_FLAG_SSE2 ? "SSE2 " : "", + cpu_flags & CPUTEST_FLAG_SSE2SLOW ? "SSE2(slow) " : "", + cpu_flags & CPUTEST_FLAG_SSE3 ? "SSE3 " : "", + cpu_flags & CPUTEST_FLAG_SSE3SLOW ? "SSE3(slow) " : "", + cpu_flags & CPUTEST_FLAG_SSSE3 ? "SSSE3 " : "", + cpu_flags & CPUTEST_FLAG_ATOM ? "Atom " : "", + cpu_flags & CPUTEST_FLAG_SSE4 ? "SSE4.1 " : "", + cpu_flags & CPUTEST_FLAG_SSE42 ? "SSE4.2 " : "", + cpu_flags & CPUTEST_FLAG_AVX ? "AVX " : "", + cpu_flags & CPUTEST_FLAG_3DNOW ? "3DNow " : "", + cpu_flags & CPUTEST_FLAG_3DNOWEXT ? "3DNowExt " : ""); +#endif + return 0; +} + +#endif diff --git a/Mednafen/mednafen/cputest/cputest.h b/Mednafen/mednafen/cputest/cputest.h new file mode 100644 index 0000000000..5371177ff4 --- /dev/null +++ b/Mednafen/mednafen/cputest/cputest.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2000, 2001, 2002 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef AVUTIL_CPU_H +#define AVUTIL_CPU_H + +#define CPUTEST_FLAG_FORCE 0x80000000 /* force usage of selected flags (OR) */ + + /* lower 16 bits - CPU features */ +#define CPUTEST_FLAG_MMX 0x0001 ///< standard MMX +#define CPUTEST_FLAG_MMX2 0x0002 ///< SSE integer functions or AMD MMX ext +#define CPUTEST_FLAG_3DNOW 0x0004 ///< AMD 3DNOW +#define CPUTEST_FLAG_SSE 0x0008 ///< SSE functions +#define CPUTEST_FLAG_SSE2 0x0010 ///< PIV SSE2 functions +#define CPUTEST_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster +#define CPUTEST_FLAG_3DNOWEXT 0x0020 ///< AMD 3DNowExt +#define CPUTEST_FLAG_SSE3 0x0040 ///< Prescott SSE3 functions +#define CPUTEST_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster +#define CPUTEST_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions +#define CPUTEST_FLAG_ATOM 0x10000000 ///< Atom processor, some SSSE3 instructions are slower +#define CPUTEST_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions +#define CPUTEST_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions +#define CPUTEST_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used + +#define CPUTEST_FLAG_CMOV 0x8000 // CMOVcc support (Mednafen addition) + +//#define CPUTEST_FLAG_IWMMXT 0x0100 ///< XScale IWMMXT +#define CPUTEST_FLAG_ALTIVEC 0x0001 ///< standard + +/** + * Return the flags which specify extensions supported by the CPU. + */ +int cputest_get_flags(void); + + +/** + * Disables cpu detection and forces the specified flags. + */ +void cputest_force_flags(int flags); + + +/* The following CPU-specific functions shall not be called directly. */ +int ff_get_cpu_flags_arm(void); +int ff_get_cpu_flags_ppc(void); +int ff_get_cpu_flags_x86(void); + +#endif /* AVUTIL_CPU_H */ + +#ifdef __cplusplus +} //extern "C" +#endif + diff --git a/Mednafen/mednafen/cputest/ppc_cpu.c b/Mednafen/mednafen/cputest/ppc_cpu.c new file mode 100644 index 0000000000..3a79690cd5 --- /dev/null +++ b/Mednafen/mednafen/cputest/ppc_cpu.c @@ -0,0 +1,87 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef __APPLE__ +#include +#elif defined(__OpenBSD__) +#include +#include +#include +#elif defined(__AMIGAOS4__) +#include +#include +#include +#endif /* __APPLE__ */ + +#include "cputest.h" + +/** + * This function MAY rely on signal() or fork() in order to make sure AltiVec + * is present. + */ +int ff_get_cpu_flags_ppc(void) +{ +//#if HAVE_ALTIVEC +#if ARCH_POWERPC_ALTIVEC +#ifdef __AMIGAOS4__ + ULONG result = 0; + extern struct ExecIFace *IExec; + + IExec->GetCPUInfoTags(GCIT_VectorUnit, &result, TAG_DONE); + if (result == VECTORTYPE_ALTIVEC) + return CPUTEST_FLAG_ALTIVEC; + return 0; +#elif defined(__APPLE__) || defined(__OpenBSD__) +#ifdef __OpenBSD__ + int sels[2] = {CTL_MACHDEP, CPU_ALTIVEC}; +#else + int sels[2] = {CTL_HW, HW_VECTORUNIT}; +#endif + int has_vu = 0; + size_t len = sizeof(has_vu); + int err; + + err = sysctl(sels, 2, &has_vu, &len, NULL, 0); + + if (err == 0) + return has_vu ? CPUTEST_FLAG_ALTIVEC : 0; + return 0; +#elif CONFIG_RUNTIME_CPUDETECT + int proc_ver; + // Support of mfspr PVR emulation added in Linux 2.6.17. + __asm__ volatile("mfspr %0, 287" : "=r" (proc_ver)); + proc_ver >>= 16; + if (proc_ver & 0x8000 || + proc_ver == 0x000c || + proc_ver == 0x0039 || proc_ver == 0x003c || + proc_ver == 0x0044 || proc_ver == 0x0045 || + proc_ver == 0x0070) + return CPUTEST_FLAG_ALTIVEC; + return 0; +#else + // Since we were compiled for AltiVec, just assume we have it + // until someone comes up with a proper way (not involving signal hacks). + return CPUTEST_FLAG_ALTIVEC; +#endif /* __AMIGAOS4__ */ +#endif /* HAVE_ALTIVEC */ + return 0; +} diff --git a/Mednafen/mednafen/cputest/x86_cpu.c b/Mednafen/mednafen/cputest/x86_cpu.c new file mode 100644 index 0000000000..345c230b3c --- /dev/null +++ b/Mednafen/mednafen/cputest/x86_cpu.c @@ -0,0 +1,165 @@ +/* + * CPU detection code, extracted from mmx.h + * (c)1997-99 by H. Dietz and R. Fisher + * Converted to C and improved by Fabrice Bellard. + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "x86_cpu.h" +#include "cputest.h" + +/* ebx saving is necessary for PIC. gcc seems unable to see it alone */ + +#define cpuid(index,eax,ebx,ecx,edx)\ + __asm__ volatile\ + ("mov %%"REG_b", %%"REG_S"\n\t"\ + "cpuid\n\t"\ + "xchg %%"REG_b", %%"REG_S\ + : "=a" (eax), "=S" (ebx),\ + "=c" (ecx), "=d" (edx)\ + : "0" (index)); + +#define xgetbv(index,eax,edx) \ + __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (index)) + +/* Function to test if multimedia instructions are supported... */ +int ff_get_cpu_flags_x86(void) +{ + int rval = 0; + int eax, ebx, ecx, edx; + int max_std_level, max_ext_level, std_caps=0, ext_caps=0; + int family=0, model=0; + union { int i[3]; char c[12]; } vendor; + +#if ARCH_X86_32 + x86_reg a, c; + __asm__ volatile ( + /* See if CPUID instruction is supported ... */ + /* ... Get copies of EFLAGS into eax and ecx */ + "pushfl\n\t" + "pop %0\n\t" + "mov %0, %1\n\t" + + /* ... Toggle the ID bit in one copy and store */ + /* to the EFLAGS reg */ + "xor $0x200000, %0\n\t" + "push %0\n\t" + "popfl\n\t" + + /* ... Get the (hopefully modified) EFLAGS */ + "pushfl\n\t" + "pop %0\n\t" + : "=a" (a), "=c" (c) + : + : "cc" + ); + + if (a == c) + return 0; /* CPUID not supported */ +#endif + + cpuid(0, max_std_level, vendor.i[0], vendor.i[2], vendor.i[1]); + + if(max_std_level >= 1){ + cpuid(1, eax, ebx, ecx, std_caps); + family = ((eax>>8)&0xf) + ((eax>>20)&0xff); + model = ((eax>>4)&0xf) + ((eax>>12)&0xf0); + + // Mednafen addition(cmov): + if (std_caps & (1<<15)) + rval |= CPUTEST_FLAG_CMOV; + + if (std_caps & (1<<23)) + rval |= CPUTEST_FLAG_MMX; + if (std_caps & (1<<25)) + rval |= CPUTEST_FLAG_MMX2 +//#if HAVE_SSE + | CPUTEST_FLAG_SSE; + if (std_caps & (1<<26)) + rval |= CPUTEST_FLAG_SSE2; + if (ecx & 1) + rval |= CPUTEST_FLAG_SSE3; + if (ecx & 0x00000200 ) + rval |= CPUTEST_FLAG_SSSE3; + if (ecx & 0x00080000 ) + rval |= CPUTEST_FLAG_SSE4; + if (ecx & 0x00100000 ) + rval |= CPUTEST_FLAG_SSE42; +//#if HAVE_AVX + /* Check OXSAVE and AVX bits */ + if ((ecx & 0x18000000) == 0x18000000) { + /* Check for OS support */ + xgetbv(0, eax, edx); + if ((eax & 0x6) == 0x6) + rval |= CPUTEST_FLAG_AVX; + } +//#endif +//#endif + ; + } + + cpuid(0x80000000, max_ext_level, ebx, ecx, edx); + + if(max_ext_level >= 0x80000001){ + cpuid(0x80000001, eax, ebx, ecx, ext_caps); + if (ext_caps & (1<<31)) + rval |= CPUTEST_FLAG_3DNOW; + if (ext_caps & (1<<30)) + rval |= CPUTEST_FLAG_3DNOWEXT; + if (ext_caps & (1<<23)) + rval |= CPUTEST_FLAG_MMX; + if (ext_caps & (1<<22)) + rval |= CPUTEST_FLAG_MMX2; + + /* Allow for selectively disabling SSE2 functions on AMD processors + with SSE2 support but not SSE4a. This includes Athlon64, some + Opteron, and some Sempron processors. MMX, SSE, or 3DNow! are faster + than SSE2 often enough to utilize this special-case flag. + CPUTEST_FLAG_SSE2 and CPUTEST_FLAG_SSE2SLOW are both set in this case + so that SSE2 is used unless explicitly disabled by checking + CPUTEST_FLAG_SSE2SLOW. */ + if (!strncmp(vendor.c, "AuthenticAMD", 12) && + rval & CPUTEST_FLAG_SSE2 && !(ecx & 0x00000040)) { + rval |= CPUTEST_FLAG_SSE2SLOW; + } + } + + if (!strncmp(vendor.c, "GenuineIntel", 12)) { + if (family == 6 && (model == 9 || model == 13 || model == 14)) { + /* 6/9 (pentium-m "banias"), 6/13 (pentium-m "dothan"), and 6/14 (core1 "yonah") + * theoretically support sse2, but it's usually slower than mmx, + * so let's just pretend they don't. CPUTEST_FLAG_SSE2 is disabled and + * CPUTEST_FLAG_SSE2SLOW is enabled so that SSE2 is not used unless + * explicitly enabled by checking CPUTEST_FLAG_SSE2SLOW. The same + * situation applies for CPUTEST_FLAG_SSE3 and CPUTEST_FLAG_SSE3SLOW. */ + if (rval & CPUTEST_FLAG_SSE2) rval ^= CPUTEST_FLAG_SSE2SLOW|CPUTEST_FLAG_SSE2; + if (rval & CPUTEST_FLAG_SSE3) rval ^= CPUTEST_FLAG_SSE3SLOW|CPUTEST_FLAG_SSE3; + } + /* The Atom processor has SSSE3 support, which is useful in many cases, + * but sometimes the SSSE3 version is slower than the SSE2 equivalent + * on the Atom, but is generally faster on other processors supporting + * SSSE3. This flag allows for selectively disabling certain SSSE3 + * functions on the Atom. */ + if (family == 6 && model == 28) + rval |= CPUTEST_FLAG_ATOM; + } + + return rval; +} diff --git a/Mednafen/mednafen/cputest/x86_cpu.h b/Mednafen/mednafen/cputest/x86_cpu.h new file mode 100644 index 0000000000..dd1edbaea6 --- /dev/null +++ b/Mednafen/mednafen/cputest/x86_cpu.h @@ -0,0 +1,101 @@ +/* + * copyright (c) 2006 Michael Niedermayer + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_X86_CPU_H +#define AVUTIL_X86_CPU_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#if ARCH_X86_64 +# define OPSIZE "q" +# define REG_a "rax" +# define REG_b "rbx" +# define REG_c "rcx" +# define REG_d "rdx" +# define REG_D "rdi" +# define REG_S "rsi" +# define PTR_SIZE "8" +typedef int64_t x86_reg; + +# define REG_SP "rsp" +# define REG_BP "rbp" +# define REGBP rbp +# define REGa rax +# define REGb rbx +# define REGc rcx +# define REGd rdx +# define REGSP rsp + +#elif ARCH_X86_32 + +# define OPSIZE "l" +# define REG_a "eax" +# define REG_b "ebx" +# define REG_c "ecx" +# define REG_d "edx" +# define REG_D "edi" +# define REG_S "esi" +# define PTR_SIZE "4" +typedef int32_t x86_reg; + +# define REG_SP "esp" +# define REG_BP "ebp" +# define REGBP ebp +# define REGa eax +# define REGb ebx +# define REGc ecx +# define REGd edx +# define REGSP esp +#else +typedef int x86_reg; +#endif + +#define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE)) +#define HAVE_6REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE || HAVE_EBP_AVAILABLE)) + +#if ARCH_X86_64 && defined(PIC) +# define BROKEN_RELOCATIONS 1 +#endif + +/* + * If gcc is not set to support sse (-msse) it will not accept xmm registers + * in the clobber list for inline asm. XMM_CLOBBERS takes a list of xmm + * registers to be marked as clobbered and evaluates to nothing if they are + * not supported, or to the list itself if they are supported. Since a clobber + * list may not be empty, XMM_CLOBBERS_ONLY should be used if the xmm + * registers are the only in the clobber list. + * For example a list with "eax" and "xmm0" as clobbers should become: + * : XMM_CLOBBERS("xmm0",) "eax" + * and a list with only "xmm0" should become: + * XMM_CLOBBERS_ONLY("xmm0") + */ +#if HAVE_XMM_CLOBBERS +# define XMM_CLOBBERS(...) __VA_ARGS__ +# define XMM_CLOBBERS_ONLY(...) : __VA_ARGS__ +#else +# define XMM_CLOBBERS(...) +# define XMM_CLOBBERS_ONLY(...) +#endif + +#endif /* AVUTIL_X86_CPU_H */ diff --git a/Mednafen/mednafen/debug.cpp b/Mednafen/mednafen/debug.cpp new file mode 100644 index 0000000000..9b57a29d26 --- /dev/null +++ b/Mednafen/mednafen/debug.cpp @@ -0,0 +1,239 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Support functions for the emulated system code-side of the debugger. */ +#include "mednafen.h" + +#ifdef WANT_DEBUGGER + +static std::vector AddressSpaces; +static std::vector RegGroups; + +// Currently only called on emulator startup, not game load... +void MDFNDBG_Init(void) +{ + AddressSpaces.clear(); + RegGroups.clear(); +} + +void MDFNDBG_PostGameLoad(void) +{ + if(MDFNGameInfo->Debugger) + { + MDFNGameInfo->Debugger->AddressSpaces = &AddressSpaces; + MDFNGameInfo->Debugger->RegGroups = &RegGroups; + } +} + +// Called on game close. +void MDFNDBG_Kill(void) +{ + AddressSpaces.clear(); + RegGroups.clear(); +} + + + +AddressSpaceType::AddressSpaceType() : TotalBits(0), NP2Size(0), IsWave(false), WaveFormat(ASPACE_WFMT_UNSIGNED), WaveBits(0), + GetAddressSpaceBytes(NULL), PutAddressSpaceBytes(NULL), private_data(NULL), EnableUsageMap(NULL), + UsageMapRead(NULL), UsageMapWrite(NULL), UsageReadMemUsed(0), UsageWriteMemUsed(0) +{ + +} + +AddressSpaceType::~AddressSpaceType() +{ + +} + +int ASpace_Add(void (*gasb)(const char *name, uint32 Address, uint32 Length, uint8 *Buffer), + void (*pasb)(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer), const char *name, const char *long_name, + uint32 TotalBits, uint32 NP2Size) +{ + AddressSpaceType newt; + + newt.GetAddressSpaceBytes = gasb; + newt.PutAddressSpaceBytes = pasb; + + newt.name = std::string(name); + newt.long_name = std::string(long_name); + newt.TotalBits = TotalBits; + newt.NP2Size = NP2Size; + + AddressSpaces.push_back(newt); + + return(AddressSpaces.size() - 1); +} + +int ASpace_Add(const AddressSpaceType &newt) +{ + AddressSpaces.push_back(newt); + return(AddressSpaces.size() - 1); +} + +// Returns number of new bytes allocated. +static INLINE uint64 IncUsageMap(uint64 *****UsageMap, const uint32 address) +{ + uint64 ret = 0; + + if(!(*UsageMap)) + { + (*UsageMap) = (uint64 ****)MDFN_calloc(sizeof(uint64 ***), 256, "Usage map"); + ret += sizeof(uint64 ***) * 256; + } + + if(!(*UsageMap)[address >> 24]) + { + (*UsageMap)[address >> 24] = (uint64 ***)MDFN_calloc(sizeof(uint64 **), 256, "Usage map"); + ret += sizeof(uint64 **) * 256; + } + + if(!(*UsageMap)[address >> 24][(address >> 16) & 0xFF]) + { + (*UsageMap)[address >> 24][(address >> 16) & 0xFF] = (uint64 **)MDFN_calloc(sizeof(uint64 *), 256, "Usage map"); + ret += sizeof(uint64 *) * 256; + } + + if(!(*UsageMap)[address >> 24][(address >> 16) & 0xFF][(address >> 8) & 0xFF]) + { + (*UsageMap)[address >> 24][(address >> 16) & 0xFF][(address >> 8) & 0xFF] = (uint64 *)MDFN_calloc(sizeof(uint64), 256, "Usage map"); + ret += sizeof(uint64) * 256; + } + + (*UsageMap)[address >> 24][(address >> 16) & 0xFF][(address >> 8) & 0xFF][address & 0xFF]++; + + return(ret); +} + +bool ASpace_Read(const int id, const uint32 address, const unsigned int size, const bool pre_bpoint) +{ + AddressSpaceType *as; + + assert(id > 0 && (const unsigned int)id < AddressSpaces.size()); + + as = &AddressSpaces[id]; + + if(pre_bpoint) + return(FALSE); + else + { + as->UsageReadMemUsed += IncUsageMap(&as->UsageMapRead, address); + } + return(FALSE); +} + +bool ASpace_Write(const int id, const uint32 address, const uint32 value, const unsigned int size, const bool pre_bpoint) +{ + AddressSpaceType *as; + + assert(id > 0 && (const unsigned int)id < AddressSpaces.size()); + + as = &AddressSpaces[id]; + + if(pre_bpoint) + return(FALSE); + else + { + as->UsageWriteMemUsed += IncUsageMap(&as->UsageMapWrite, address); + return(FALSE); + } +} + +static INLINE void ClearUsageMap(uint64 *****UsageMap) +{ + // Maybe we should use an alloced memory vector to speed this up... + if((*UsageMap)) + { + for(int a = 0; a < 256; a++) + { + if((*UsageMap)[a]) + { + for(int b = 0; b < 256; b++) + { + if((*UsageMap)[a][b]) + { + for(int c = 0; c < 256; c++) + { + if((*UsageMap)[a][b][c]) + { + MDFN_free((*UsageMap)[a][b][c]); + (*UsageMap)[a][b][c] = NULL; + } + } + MDFN_free((*UsageMap)[a][b]); + (*UsageMap)[a][b] = NULL; + } + } + + MDFN_free((*UsageMap)[a]); + (*UsageMap)[a] = NULL; + } + } + + MDFN_free((*UsageMap)); + (*UsageMap) = NULL; + } +} + +void ASpace_ClearReadMap(const int id) +{ + AddressSpaceType *as; + + assert(id > 0 && (const unsigned int)id < AddressSpaces.size()); + + as = &AddressSpaces[id]; + + ClearUsageMap(&as->UsageMapRead); + + as->UsageReadMemUsed = 0; +} + +void ASpace_ClearWriteMap(const int id) +{ + AddressSpaceType *as; + + assert(id > 0 && (const unsigned int)id < AddressSpaces.size()); + + as = &AddressSpaces[id]; + + ClearUsageMap(&as->UsageMapWrite); + + as->UsageWriteMemUsed = 0; +} + +void MDFNDBG_ResetRegGroupsInfo(void) +{ + RegGroups.clear(); +} + +void MDFNDBG_AddRegGroup(RegGroupType *groupie) +{ + RegGroups.push_back(groupie); +} + +void ASpace_Reset(void) +{ + AddressSpaces.clear(); +} + + +RegType::~RegType() +{ + +} + +#endif diff --git a/Mednafen/mednafen/debug.h b/Mednafen/mednafen/debug.h new file mode 100644 index 0000000000..6e101a6e32 --- /dev/null +++ b/Mednafen/mednafen/debug.h @@ -0,0 +1,224 @@ +#ifndef __MDFN_DEBUG_H +#define __MDFN_DEBUG_H + +#ifdef WANT_DEBUGGER + +enum +{ + BPOINT_READ = 1, + BPOINT_WRITE, + BPOINT_PC, + BPOINT_IO_READ, + BPOINT_IO_WRITE, + BPOINT_AUX_READ, + BPOINT_AUX_WRITE, + BPOINT_OP // Opcode +}; + +struct RegType +{ + ~RegType(); + const unsigned int id; + std::string name; + std::string long_name; + unsigned int bsize; // Byte size, 1, 2, 4 +}; + +struct RegGroupType +{ + const char *name; + RegType *Regs; + + // GetRegister() should modify the string at special if special is non-NULL, to provide + // more details about the register. + uint32 (*GetRegister)(const unsigned int id, char *special, const uint32 special_len); + void (*SetRegister)(const unsigned int id, uint32 value); +}; + +typedef enum +{ + ASPACE_WFMT_UNSIGNED = 0, // Unsigned, wooo. + ASPACE_WFMT_SIGNED, // Signed two's complement + ASPACE_WMFT_SIGNED_MAG_0NEG, // Signed/magnitude. 0 in the sign bit means negative. + ASPACE_WFMT_SIGNED_MAG_1NEG, // Sign/magnitude style. 1 in the sign bit means negative. + ASPACE_WFMT_SIGNED_ONES, // Signed one's complement +} ASpace_WFMT; + +// +// Visible to CPU, physical, RAM, ROM, ADPCM RAM, etc etc. +// +struct AddressSpaceType +{ + AddressSpaceType() MDFN_COLD; + ~AddressSpaceType() MDFN_COLD; + + // The short name, all lowercase, 0-9 a-z _ + std::string name; + + // The longer, descriptive name for this address space. + std::string long_name; + + // The number of address bits for this address space. + uint32 TotalBits; + + // Non-power-of-2 size. Normally 0, unless the size of the address space isn't a power of 2! + uint32 NP2Size; + + bool IsWave; + ASpace_WFMT WaveFormat; // TODO + uint32 WaveBits; // Total number of bits(including sign) per waveform sample. Only <= 8 for now... + + void (*GetAddressSpaceBytes)(const char *name, uint32 Address, uint32 Length, uint8 *Buffer); + void (*PutAddressSpaceBytes)(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer); + + void *private_data; + + // Internal use... + void (*EnableUsageMap)(bool); + + uint64 ****UsageMapRead; // [a.24:31][a.16:23][a.8:15][a.0:7], pointer tables allocated as needed. + uint64 ****UsageMapWrite; // (same) + + uint64 UsageReadMemUsed; // Keep track of how much memory we've allocated for UsageMap, so we don't go kaka-kookoo and use up an // excessive amount of RAM. + uint64 UsageWriteMemUsed; +}; + +// TODO: newer branch trace interface not implemented yet. +struct BranchTraceResult +{ +#if 0 + // Segment stuff is only to be hackishly implemented, for WonderSwan debugger support. + uint32 from; + uint32 to; + uint16 from_segment; + uint16 to_segment; + + bool from_valid; + bool segment_valid; +#endif + char from[32]; + char to[32]; + char code[16]; + + uint32 count; +}; + +#if 0 +struct DGD_Source +{ + int id; + const char *name; + + unsigned width; + unsigned height; + + unsigned pb_bpp; // Palette bank bits-per-pixel +}; +#endif + +typedef struct +{ + const char *DefaultCharEnc; // Default(or most common) internal character encoding for text for the system. + + uint32 MaxInstructionSize; // Maximum instruction size in bytes + uint32 InstructionAlignment; // Required instruction alignment, in bytes(frequently 1 on CISC, and other powers of 2 on RISC, but not always ;)). + uint32 LogAddrBits; // Logical address bits + uint32 PhysAddrBits; // Physical address bits + + uint32 DefaultWatchAddr; + + uint32 ZPAddr; // Set to ~0U to disable + + // If logical is true, then do the peek/poke on logical address A, else do the + // peek/poke on physical address A. For now, this distinction only exists + // on CPUs with built-in bank-switching, like the HuC6280. + + // If hl is true, do not cause any change in the underlying hardware state. + uint32 (*MemPeek)(uint32 A, unsigned int bsize, bool hl, bool logical); + + // Disassemble one instruction at logical address A, and increment A to point to the next instruction. + // TextBuf should point to at least 256 bytes of space! + void (*Disassemble)(uint32 &A, uint32 SpecialA, char *TextBuf); + + // Toggle syntax mode(example: for WonderSwan x86 decoding, Intel or AT&T) + void (*ToggleSyntax)(void); + + // Force an IRQ at the desired level(IRQ0, IRQ1, or whatever). Pass -1 to cause an NMI, if available. + // Note that this should cause an interrupt regardless of any flag settings or interrupt status. + void (*IRQ)(int level); + + // Get the vector for the specified IRQ level. -1 is NMI(if available), and -2 is RESET. + uint32 (*GetVector)(int level); + + void (*FlushBreakPoints)(int type); + + void (*AddBreakPoint)(int type, unsigned int A1, unsigned int A2, bool logical); + + // 'bpoint' to callb() will be true if the instruction at this PC triggered a breakpoint(or previous instruction maybe in some + // more complex breakpoint cases where we don't have a time machine?). + // + // If 'continuous' is true, then callb() is called for every instruction; if it's false, it's only called for instructions + // that trigger breakpoints AND all instructions afterwards until this function is called with 'continuous' set to false again. + // + // This function IS legal to call from within callb(), and even necessary for good performance. + // + void (*SetCPUCallback)(void (*callb)(uint32 PC, bool bpoint), bool continuous); + + void (*EnableBranchTrace)(bool enable); + + std::vector (*GetBranchTrace)(void); + + // If surface is NULL, disable decoding. + // If line is -1, do decoding instantaneously, before this function returns. + // "which" is the same index as passed to MDFNI_ToggleLayer() + void (*SetGraphicsDecode)(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn); + + void (*SetLogFunc)(void (*logfunc)(const char *type, const char *text)); + + // Game emulation code shouldn't touch these directly. + std::vector *AddressSpaces; + std::vector *RegGroups; +} DebuggerInfoStruct; + +// ASpace_Add() functions return an ID that should be used with with MDFNDBG_ASpace_Read() +// and ASpace_Write() functions. The ID is guaranteed to be 0 for the first address space, +// and increment by 1 for each address space added thereafter. +// An address space should only be added during Load() or LoadCD(). +int ASpace_Add(void (*gasb)(const char *name, uint32 Address, uint32 Length, uint8 *Buffer), + void (*pasb)(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer), const char *name, const char *long_name, + uint32 TotalBits, uint32 NP2Size = 0); + +int ASpace_Add(const AddressSpaceType &); + +// Removes all registered address spaces. +void ASpace_Reset(void); + +// pre_bpoint should be TRUE if these are "estimated" read/writes that will occur when the current instruction +// is actually executed/committed. +// size is the size of the read/write(ex: 1 byte, 2 bytes, 4 bytes), defaulting to 1 byte. +// +// The return value is always FALSE if pre_bpoint is FALSE. If pre_bpoint is TRUE, the return value will be +// TRUE if the "estimated" read/write matches a registered breakpoint. +bool ASpace_Read(const int id, const uint32 address, const unsigned int size = 1, const bool pre_bpoint = FALSE); +bool ASpace_Write(const int id, const uint32 address, const uint32 value, const unsigned int size = 1, const bool pre_bpoint = FALSE); + +// Clears read/write usage maps. +void ASpace_ClearReadMap(const int id); +void ASpace_ClearWriteMap(const int id); + + +void ASpace_AddBreakPoint(const int id, const int type, const uint32 A1, const uint32 A2, const bool logical); +void ASpace_FlushBreakPoints(const int id); + + +void MDFNDBG_ResetRegGroupsInfo(void); +void MDFNDBG_AddRegGroup(RegGroupType *groupie); + + +void MDFNDBG_Init(void); +void MDFNDBG_PostGameLoad(void); +void MDFNDBG_Kill(void); + +#endif + +#endif diff --git a/Mednafen/mednafen/demo/Makefile.am b/Mednafen/mednafen/demo/Makefile.am new file mode 100644 index 0000000000..8f2dfde695 --- /dev/null +++ b/Mednafen/mednafen/demo/Makefile.am @@ -0,0 +1,7 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libdemo.a + +libdemo_a_SOURCES = demo.cpp diff --git a/Mednafen/mednafen/demo/Makefile.in b/Mednafen/mednafen/demo/Makefile.in new file mode 100644 index 0000000000..8e32a19960 --- /dev/null +++ b/Mednafen/mednafen/demo/Makefile.in @@ -0,0 +1,676 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/demo +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libdemo_a_AR = $(AR) $(ARFLAGS) +libdemo_a_LIBADD = +am_libdemo_a_OBJECTS = demo.$(OBJEXT) +libdemo_a_OBJECTS = $(am_libdemo_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libdemo_a_SOURCES) +DIST_SOURCES = $(libdemo_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libdemo.a +libdemo_a_SOURCES = demo.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/demo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/demo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libdemo.a: $(libdemo_a_OBJECTS) $(libdemo_a_DEPENDENCIES) $(EXTRA_libdemo_a_DEPENDENCIES) + $(AM_V_at)-rm -f libdemo.a + $(AM_V_AR)$(libdemo_a_AR) libdemo.a $(libdemo_a_OBJECTS) $(libdemo_a_LIBADD) + $(AM_V_at)$(RANLIB) libdemo.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/demo.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/demo/demo.cpp b/Mednafen/mednafen/demo/demo.cpp new file mode 100644 index 0000000000..7ccb7dccc4 --- /dev/null +++ b/Mednafen/mednafen/demo/demo.cpp @@ -0,0 +1,462 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include + +#include + +namespace MDFN_IEN_DEMO +{ + +static uint8* controller_ptr[2] = { NULL, NULL }; +static uint8 last_cstate[2]; + +static OwlResampler* HRRes = NULL; +static OwlBuffer* HRBufs[2] = { NULL, NULL }; + +static const int DEMO_MASTER_CLOCK = 9000000; +static const int DEMO_FRAME_RATE = 80; +static bool Interlace; +static bool InterlaceField; +static int middle_size; +static int middle_size_inc; +static unsigned w2_select; + +static unsigned cur_test_mode; + +static double phase; +static double phase_inc; + +static void Power(void) +{ + for(unsigned i = 0; i < 2; i++) + last_cstate[i] = 0; + + Interlace = false; + InterlaceField = 0; + + middle_size = 24; + middle_size_inc = 1; + + w2_select = 0; + + cur_test_mode = 0; + + phase = 0; + phase_inc = 0; +} + +static void SetSoundRate(double rate) +{ + if(HRRes) + { + delete HRRes; + HRRes = NULL; + } + + if(rate > 0) + { + HRRes = new OwlResampler(DEMO_MASTER_CLOCK / 8, rate, MDFN_GetSettingF("demo.resamp_rate_error"), 20, MDFN_GetSettingF("demo.resamp_quality")); + + for(unsigned ch = 0; ch < 2; ch++) + HRRes->ResetBufResampState(HRBufs[ch]); + } +} + +static inline uint32_t DemoRandU32(void) +{ + static uint32_t x = 123456789; + static uint32_t y = 987654321; + static uint32_t z = 43219876; + static uint32_t c = 6543217; + uint64_t t; + + x = 314527869 * x + 1234567; + y ^= y << 5; y ^= y >> 7; y ^= y << 22; + t = 4294584393ULL * z + c; c = t >> 32; z = t; + + return(x + y + z); +} + +static void Draw(EmulateSpecStruct* espec) +{ + espec->DisplayRect.x = DemoRandU32() & 31; + espec->DisplayRect.y = DemoRandU32() & 31; + + espec->DisplayRect.w = 400; + espec->DisplayRect.h = 300 << Interlace; + + if(!espec->skip) + { + espec->surface->Fill(DemoRandU32() & 0xFF, DemoRandU32() & 0xFF, DemoRandU32() & 0xFF, 0); + + if(cur_test_mode == 1) + { + char width_text[16]; + + espec->DisplayRect.w = 800 / (1 + ((w2_select >> 8) & 31)); + trio_snprintf(width_text, sizeof(width_text), "%d", espec->DisplayRect.w); + + MDFN_DrawFillRect(espec->surface, espec->DisplayRect.x, espec->DisplayRect.y, espec->DisplayRect.w, espec->DisplayRect.h, espec->surface->MakeColor(0xFF, 0xFF, 0xFF), espec->surface->MakeColor(0x7F, 0x00, 0xFF)); + + for(int z = 0; z < std::min(espec->DisplayRect.w, espec->DisplayRect.h) / 2; z += 7) + MDFN_DrawFillRect(espec->surface, espec->DisplayRect.x + z, espec->DisplayRect.y + z, espec->DisplayRect.w - z * 2, espec->DisplayRect.h - z * 2, espec->surface->MakeColor(0, (z * 8) & 0xFF, 0), espec->surface->MakeColor(0, 0, (z * 17) & 0xFF)); + + DrawTextTransShadow(espec->surface->pixels + espec->DisplayRect.x + (espec->DisplayRect.y + espec->DisplayRect.h / 2 - 9) * espec->surface->pitchinpix, espec->surface->pitchinpix << 2, espec->DisplayRect.w, width_text, espec->surface->MakeColor(0xFF, 0, 0), espec->surface->MakeColor(0, 0, 0), true, MDFN_FONT_9x18_18x18); + } + else + { + int y0 = espec->DisplayRect.y; + int y1 = espec->DisplayRect.y + (espec->DisplayRect.h - middle_size) / 3; + int y2 = espec->DisplayRect.y + (espec->DisplayRect.h - middle_size) / 3 + middle_size; + int y3 = espec->DisplayRect.y + espec->DisplayRect.h; + static const int w2_tab[16] = { 200, 160, 100, 80, 50, 40, 32, 25, + 20, 16, 10, 8, 5, 4, 2, 1 }; + int w0 = 400; + int w1 = 800; + int w2 = w2_tab[((w2_select >> 8) & 0xF)]; + int w2_font = MDFN_FONT_9x18_18x18; + char w2_text[16]; + + if(w2 < 8) + w2_font = MDFN_FONT_4x5; + else if(w2 < 16) + w2_font = MDFN_FONT_5x7; + else if(w2 < 20) + w2_font = MDFN_FONT_6x13_12x13; + + + trio_snprintf(w2_text, sizeof(w2_text), "%d", w2); + + espec->LineWidths[0] = 0; + for(int y = espec->DisplayRect.y; y < (espec->DisplayRect.y + espec->DisplayRect.h); y++) + { + int w = w0; + + if(y >= y1) + w = w1; + + if(y >= y2) + w = w2; + + espec->LineWidths[y] = w; + } + + assert( (y0 + (y1 - y0) / 2 - 9) >= 0); + + MDFN_DrawFillRect(espec->surface, espec->DisplayRect.x, y0, w0, y1 - y0, espec->surface->MakeColor(0xFF, 0xFF, 0xFF), espec->surface->MakeColor(0x7F, 0x00, 0xFF)); + DrawTextTransShadow(espec->surface->pixels + espec->DisplayRect.x + (y0 + (y1 - y0) / 2 - 9) * espec->surface->pitchinpix, espec->surface->pitchinpix << 2, w0, "400", espec->surface->MakeColor(0xFF, 0, 0), espec->surface->MakeColor(0, 0, 0), true, MDFN_FONT_9x18_18x18); + + MDFN_DrawFillRect(espec->surface, espec->DisplayRect.x, y1, w1, y2 - y1, espec->surface->MakeColor(0xFF, 0xFF, 0xFF), espec->surface->MakeColor(0x00, 0x7F, 0xFF)); + DrawTextTransShadow(espec->surface->pixels + espec->DisplayRect.x + (y1 + (y2 - y1) / 2 - 9) * espec->surface->pitchinpix, espec->surface->pitchinpix << 2, w1, "800", espec->surface->MakeColor(0xFF, 0, 0), espec->surface->MakeColor(0, 0, 0), true, MDFN_FONT_9x18_18x18); + + MDFN_DrawFillRect(espec->surface, espec->DisplayRect.x, y2, w2, y3 - y2, espec->surface->MakeColor(0xFF, 0xFF, 0xFF), espec->surface->MakeColor(0x00, 0x00, 0xFF)); + DrawTextTransShadow(espec->surface->pixels + espec->DisplayRect.x + (y2 + (y3 - y2) / 2 - 9) * espec->surface->pitchinpix, espec->surface->pitchinpix << 2, w2, w2_text, espec->surface->MakeColor(0xFF, 0, 0), espec->surface->MakeColor(0, 0, 0), true, w2_font); + } + } + middle_size += middle_size_inc; + if(middle_size >= 240) + middle_size_inc = -1; + if(middle_size <= 0) + middle_size_inc = 1; + + w2_select += 9; +} + + +static void Emulate(EmulateSpecStruct* espec) +{ + int hrc = DEMO_MASTER_CLOCK / DEMO_FRAME_RATE / 8; + + if(espec->SoundFormatChanged) + SetSoundRate(espec->SoundRate); + + for(unsigned i = 0; i < 2; i++) + { + { + uint8 cur_cstate = *controller_ptr[i]; + + if((cur_cstate ^ last_cstate[i]) & cur_cstate & 1) + Interlace = !Interlace; + + if((cur_cstate ^ last_cstate[i]) & cur_cstate & 2) + cur_test_mode = (cur_test_mode + 1) % 2; + + last_cstate[i] = cur_cstate; + } + + { + uint8 weak = MDFN_de16lsb(&controller_ptr[i][3]) >> 7; + uint8 strong = MDFN_de16lsb(&controller_ptr[i][5]) >> 7; + + MDFN_en16lsb(&controller_ptr[i][1], (weak << 0) | (strong << 8)); + } + } + + Draw(espec); + + { + int sc = 0; + + { + static const double phase_inc_inc = 0.000000002; + + for(int r = 0; r < hrc; r++) + { + (&HRBufs[0]->BufPudding()->f)[r] = 256 * 32767 * 0.20 * sin(phase); + (&HRBufs[1]->BufPudding()->f)[r] = ((int32)DemoRandU32() >> 8); + + phase += phase_inc; + phase_inc += phase_inc_inc; + } + } + + + for(int ch = 0; ch < 2; ch++) + { + if(HRRes) + { + sc = HRRes->Resample(HRBufs[ch], hrc, espec->SoundBuf + (espec->SoundBufSize * 2) + ch, espec->SoundBufMaxSize - espec->SoundBufSize); + } + else + { + HRBufs[ch]->ResampleSkipped(hrc); + } + } + + espec->SoundBufSize += sc; + } + + espec->MasterCycles = DEMO_MASTER_CLOCK / DEMO_FRAME_RATE; + espec->InterlaceOn = Interlace; + espec->InterlaceField = InterlaceField; + + if(Interlace) + InterlaceField = !InterlaceField; + else + InterlaceField = 0; +} + +static bool TestMagic(MDFNFILE* fp) +{ + return(false); +} + +static void Cleanup(void) +{ + for(unsigned ch = 0; ch < 2; ch++) + { + if(HRBufs[ch]) + { + delete HRBufs[ch]; + HRBufs[ch] = NULL; + } + } + + if(HRRes) + { + delete HRRes; + HRRes = NULL; + } +} + +static void Load(MDFNFILE* fp) +{ + try + { + for(unsigned ch = 0; ch < 2; ch++) + HRBufs[ch] = new OwlBuffer(); + + Power(); + } + catch(...) + { + Cleanup(); + throw; + } +} + + +static void CloseGame(void) +{ + Cleanup(); +} + +static void StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Interlace), + SFVAR(InterlaceField), + + SFVAR(middle_size), + SFVAR(middle_size_inc), + + SFVAR(w2_select), + + SFVAR(cur_test_mode), + + SFVAR(phase), + SFVAR(phase_inc), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + if(load) + { + if(middle_size_inc != -1 && middle_size_inc != 1) + middle_size_inc = 1; + + if(middle_size >= 240) + { + middle_size = 240; + middle_size_inc = -1; + } + + if(middle_size <= 0) + { + middle_size = 0; + middle_size_inc = 1; + } + } +} + + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { NULL, NULL } +}; + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + controller_ptr[port] = (uint8 *)ptr; +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_RESET: + case MDFN_MSC_POWER: Power(); break; + } +} + +static MDFNSetting DEMOSettings[] = +{ + { "demo.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("Sound quality."), gettext_noop("Higher values correspond to better SNR and better preservation of higher frequencies(\"brightness\"), at the cost of increased computational complexity and a negligible increase in latency.\n\nHigher values will also slightly increase the probability of sample clipping(relevant if Mednafen's volume control settings are set too high), due to increased (time-domain) ringing."), MDFNST_INT, "3", "0", "5" }, + { "demo.resamp_rate_error", MDFNSF_NOFLAGS, gettext_noop("Sound output rate tolerance."), gettext_noop("Lower values correspond to better matching of the output rate of the resampler to the actual desired output rate, at the expense of increased RAM usage and poorer CPU cache utilization."), MDFNST_FLOAT, "0.0000009", "0.0000001", "0.0000350" }, + { NULL } +}; + +static const char* SwitchPositions[] = +{ + gettext_noop("Waffles 0"), + gettext_noop("Oranges 1"), + gettext_noop("Monkeys 2"), + gettext_noop("Zebra-Z 3"), + gettext_noop("Snorkle 4") +}; + +static const IDIISG IDII = +{ + { "toggle_ilace", "Toggle Interlace Mode", 0, IDIT_BUTTON, NULL }, + { "stm", "Select Test Mode", 1, IDIT_BUTTON, NULL }, + IDIIS_Switch("swt", "Switch Meow", 2, SwitchPositions, sizeof(SwitchPositions) / sizeof(SwitchPositions[0])), + { "rumble", "RUMBLOOS", -1, IDIT_RUMBLE, NULL }, + { "rcweak", "Rumble Control Weak", 3, IDIT_BUTTON_ANALOG, NULL }, + { "rcstrong", "Rumble Control Strong", 4, IDIT_BUTTON_ANALOG, NULL }, +}; + +static std::vector InputDeviceInfo = +{ + { + "controller", + "Controller", + NULL, + IDII, + } +}; + +static const std::vector PortInfo = +{ + { "port1", "Port 1", InputDeviceInfo }, + { "port2", "Port 2", InputDeviceInfo }, +}; +} + +using namespace MDFN_IEN_DEMO; + +MDFNGI EmulatedDEMO = +{ + "demo", + "Mednafen Demo/Example Module", + KnownExtensions, + MODPRIO_INTERNAL_LOW, + NULL, + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + NULL, //SetLayerEnableMask, + NULL, //"Background\0Sprites\0Window\0", + + NULL, + NULL, + + NULL, + 0, + + NULL, //InstallReadPatch, + NULL, //RemoveReadPatches, + NULL, + NULL, //&CheatFormatInfo, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + DEMOSettings, + MDFN_MASTERCLOCK_FIXED(DEMO_MASTER_CLOCK), + (uint32)((double)DEMO_MASTER_CLOCK / (450 * 250) * 65536 * 256), + true, // Multires possible? + + 800, // lcm_width + 600, // lcm_height + NULL, // Dummy + + 400, // Nominal width + 300, // Nominal height + + 1024, // Framebuffer width + 768, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/desa68/Makefile.am b/Mednafen/mednafen/desa68/Makefile.am new file mode 100644 index 0000000000..9024223f76 --- /dev/null +++ b/Mednafen/mednafen/desa68/Makefile.am @@ -0,0 +1,13 @@ +#lib_LTLIBRARIES = libdesa68.la +#libdesa68_la_SOURCES = desa68.c desa68.h +#libdesa68_la_LDFLAGS = -version-info 2:0:0 -release @VERSION@ +#libdesa68_la_CFLAGS = -Wno-multichar $(AM_CFLAGS) +##EXTRA_DIST = desa68.vcproj + +AUTOMAKE_OPTIONS = subdir-objects +AM_CFLAGS = @AM_CFLAGS@ -Wno-multichar +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libdesa68.a +libdesa68_a_SOURCES = desa68.c diff --git a/Mednafen/mednafen/desa68/Makefile.in b/Mednafen/mednafen/desa68/Makefile.in new file mode 100644 index 0000000000..9b1f9d5fee --- /dev/null +++ b/Mednafen/mednafen/desa68/Makefile.in @@ -0,0 +1,681 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +#lib_LTLIBRARIES = libdesa68.la +#libdesa68_la_SOURCES = desa68.c desa68.h +#libdesa68_la_LDFLAGS = -version-info 2:0:0 -release @VERSION@ +#libdesa68_la_CFLAGS = -Wno-multichar $(AM_CFLAGS) + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/desa68 +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libdesa68_a_AR = $(AR) $(ARFLAGS) +libdesa68_a_LIBADD = +am_libdesa68_a_OBJECTS = desa68.$(OBJEXT) +libdesa68_a_OBJECTS = $(am_libdesa68_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libdesa68_a_SOURCES) +DIST_SOURCES = $(libdesa68_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ -Wno-multichar +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libdesa68.a +libdesa68_a_SOURCES = desa68.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/desa68/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/desa68/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libdesa68.a: $(libdesa68_a_OBJECTS) $(libdesa68_a_DEPENDENCIES) $(EXTRA_libdesa68_a_DEPENDENCIES) + $(AM_V_at)-rm -f libdesa68.a + $(AM_V_AR)$(libdesa68_a_AR) libdesa68.a $(libdesa68_a_OBJECTS) $(libdesa68_a_LIBADD) + $(AM_V_at)$(RANLIB) libdesa68.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/desa68.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/desa68/desa68.c b/Mednafen/mednafen/desa68/desa68.c new file mode 100644 index 0000000000..1ab61480a7 --- /dev/null +++ b/Mednafen/mednafen/desa68/desa68.c @@ -0,0 +1,1572 @@ +/* + * sc68 - 68000 disassembler + * Copyright (C) 2001 Benjamin Gerard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* $Id: desa68.c,v 2.3 2003/09/25 01:00:05 benjihan Exp $ */ + +/* Modified for usage in Mednafen */ + +/* #include */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _TEST_DESA68_ +# include +# include +# include +#endif + +#include "desa68.h" + +/********************************************************** + * Defines my types : * + * Should be OK without configure, since 32-bit and 16-bit * + * are not really needed. * + **********************************************************/ +typedef signed char s8; +typedef unsigned char u8; +typedef int s32; +typedef unsigned int u32; +typedef unsigned short u16; +typedef short s16; + +#define REG0(W) (((W))&7) +#define REG9(W) (((W)>>9)&7) +#define OPSZ(W) (((W)>>6)&3) +#define LINE(W) (((W)>>12)&15) +#define MODE3(W) (((W)>>3)&7) +#define MODE6(W) (((W)>>6)&7) + +/***************************** + * Disassembler string tables * + *****************************/ + +enum adressingword + { + MODE_DN=0, + MODE_AN, + MODE_iAN, + MODE_ANp, + MODE_pAN, + MODE_dAN, + MODE_dANXI, + MODE_ABSW, + MODE_ABSL, + MODE_dPC, + MODE_dPCXI, + MODE_IMM + }; + +static char Thex[16] = { + '0','1','2','3','4','5','6','7', + '8','9','A','B','C','D','E','F' }; + +/* Condition Code String Tables */ +static u16 bcc_ascii[] = + { + 'RA','SR','HI','LS', + 'CC','CS','NE','EQ', + 'VC','VS','PL','MI', + 'GE','LT','GT','LE' + }; + +static u16 scc_ascii[] = + { + 'T','F','HI','LS', + 'CC','CS','NE','EQ', + 'VC','VS','PL','MI', + 'GE','LT','GT','LE' + }; + +static u16 dbcc_ascii[] = + { + 'RA','F','HI','LS', + 'CC','CS','NE','EQ', + 'VC','VS','PL','MI', + 'GE','LT','GT','LE' + }; + +DESA68parm_t d; + +/* instruction operand size */ +/*static char sz_str[4][4] = { ".B", ".W", ".L", ".?" };*/ + +/******************* + * String functions * + *******************/ + +/* Add a char to disassembly string */ +#if 0 +static void desa_char(const unsigned char c) +{ + *d.s++ = c; +} +#else +# define desa_char(C) (*d.s++ = (C)) +#endif + +/* Add a string to disassembly string */ +static void desa_str(char *str) +{ + char c; + while(c=*str++, c) + desa_char(c); +} + +/* Add a string to disassembly string */ +static void desa_ascii(unsigned int n) +{ + int shift; + for(shift=(sizeof(int)-1)*8; shift>=0; shift-=8) + { + u8 c; + c = (u8)(n>>shift); + if(c) desa_char(c); + } +} + +#if 0 +/* Count signifiant hexa digit */ +static int nuhexadigit(unsigned int n) +{ + int ct; + for(ct=1, n>>=4; n; ct++, n>>=4); + return ct; +} + +/* Count significatif hexa digit */ +static int nhexadigit(int n) +{ + return nuhexadigit(n<0?-n:n); +} +#endif + +/* Add a N-ndigit digit unsigned hexa number with header char to disassembly string */ +static void desa_uhexacat(unsigned int n, int ndigit, int header_char) +{ + int shf; + desa_char(header_char); + for(shf=(ndigit-1)*4; shf>=0; shf-=4) { + desa_char(Thex[(n>>shf)&15] ); + } +} + +#if 0 +/* Add a N-ndigit digit signed hexa number with heading '$' to disassembly string */ +void desa_hexacat(int n, int ndigit) +{ + if(n<0) + { + desa_char('-' ); + n = -n; + } + desa_uhexacat(n, ndigit, '$'); +} +#endif + +/* Add a signifiant digit only unsigned hexa number + * with heading '$' to disassembly string + */ +static void desa_usignifiant(unsigned int n) +{ + int shf; + desa_char('$'); + for(shf=(sizeof(int)*2-1)*4; shf>=0 && !(n>>shf); shf-=4); + if(shf<0) shf=0; + for(; shf>=0; shf-=4) + desa_char(Thex[(n>>shf)&15] ); +} + +/* idem desa_usignifiant, except it is signed */ +static void desa_signifiant(int n) +{ + if(n<0) + { + desa_char('-'); + n = -n; + } + desa_usignifiant(n); +} + +static int desa_isascii(u8 c) +{ + return c=='_' || c==' ' + || (c>='a' && c<='z') + || (c>='A' && c<='Z') + || (c>='0' && c<='9'); +} + +/******************************* + * General disassembly function * + *******************************/ + +/* Get addressing mode number at bit #6 [0..14], only [0..11] are valid */ +/*static u32 getmode_6(u32 w) + { + u32 mode; + mode = ((w>>6)&7); + if(mode==7) + mode += (w>>9)&7; + return mode; + }*/ + +/* Read next word , increment pc */ +static int read_pc(void) +{ + unsigned int pc = d.pc; + +/* + d.w = (s8)d.mem[pc++&d.memmsk]<<8; + d.w += d.mem[pc++&d.memmsk]; +*/ + + d.w = d.mem_callb(pc & d.memmsk, d.private_data); + pc += 2; + + d.pc = pc; + return d.w; +} + +static s32 immB(void) +{ + return (s32)(s8)read_pc(); +} + +#if 0 +static s32 immW(void) +{ + read_pc(); + return d.w; +} +#else +# define immW read_pc +#endif + +static s32 immL(void) +{ + return (read_pc()<<16) | (read_pc()&0xffff ); +} + +static s32 adrL(void) +{ + return immL()/* & d.memmsk*/ ; /* Problem with hardware reg ! */ +} + +#if 0 +static s32 adrW(void) +{ + read_pc(); + return d.w; +} +#else +# define adrW immW +#endif + +static s32 relPC(void) +{ + read_pc(); + return (d.pc + d.w - 2) & d.memmsk; +} + +/* return [AD][0-7][d][WL] : SZ='W'/'L' XI = hexa value for reg ($D0) */ +static s32 indAnXi() +{ + s32 v; + read_pc(); + v = (d.w&0x8000)? ('A'<<24) : ('D'<<24); + v |= ('0'+((d.w>>12)&7)) << 16; + v |= (u8)d.w<<8; + v |= ((d.w&(1<<11))? 'L' : 'W'); + return v; +} + +static void desa_dcw(void) +{ + desa_str("DC.W"); + desa_char (' '); + desa_uhexacat((u16)d.w, 4, '$'); + d.status = 0; +} + +static void update_ea(unsigned int v) +{ + v &= 0xFFFFFF; + if (d.ea_src == -1) { + d.ea_src = v; + } else if (d.ea_dst == -1) { + d.ea_dst = v; + } +} + +static void desa_label(unsigned int v) +{ + desa_uhexacat(v, 6, 'L'); +} + +static void desa_immL(int v) +{ + unsigned int v2 = v; + desa_char('#'); + if ((d.flags&DESA68_SYMBOL_FLAG) && v2>=d.immsym_min && v2>8) && desa_isascii(v2>>16) && desa_isascii(v2>>24)) { + desa_char ('\''); + desa_ascii((u32)v2); + desa_char ('\''); + } else { + desa_signifiant(v); + } + } +} + +static void desa_absL(int v) +{ + unsigned int v2 = v & 0xFFFFFF; + + if ((d.flags&DESA68_SYMBOL_FLAG) && v2>=d.immsym_min && v2>8); + desa_signifiant((s8)(v>>8)); + desa_ascii('(A0,'+(reg<<8)); + v = (v&0xFFFF00FF)+('.'<<8); + desa_ascii(v); + desa_char(')'); + break; + case MODE_ABSW: + d.ea = v = adrW(); + desa_usignifiant(v); + desa_ascii('.W'); + break; + case MODE_ABSL: + d.ea = v = adrL(); + update_ea(v); + desa_absL(v); + break; + case MODE_dPC: + d.ea = v = relPC(); + update_ea(v); + if (d.flags & DESA68_SYMBOL_FLAG) { + desa_label(v); + } else { + desa_usignifiant(v); + } + desa_str("(PC)"); + break; + case MODE_dPCXI: + v = indAnXi(); + d.ea = d.pc-2+(s8)(v>>8); + update_ea(d.ea); + if (d.flags & DESA68_SYMBOL_FLAG) { + desa_label(d.ea); + } else { + desa_usignifiant(d.ea); + } + desa_str("(PC,"); + v = (v&0xFFFF00FF)+('.'<<8); + desa_ascii(v); + desa_char(')'); + break; + case MODE_IMM: + switch(sz ) + { + case 1: + case 'B': + v = (s8)immB(); + desa_immL(v); + break; + case 2: + case 'W': + v = (s16)immW(); + desa_immL(v); + break; + case 4: + case 'L': + v = (u32)immL(); + desa_immL(v); + return; + default: + desa_str("#"); + /*BREAKPOINT68;*/ + break; + } + break; + default: + desa_char('?'); + desa_usignifiant(mode); + desa_char('?'); + break; + } +} + +/* Get move operand + * bit : 0/6 -> src/dest + * w : current opcode + */ +static void get_ea_move(int bit, s32 w, u32 easz) +{ + u32 ea = (w>>bit)&63; + + if(bit) + get_ea_2(ea&7,ea>>3, easz); + else if(bit==0) + get_ea_2(ea>>3,ea&7, easz); +} + +static void desa_reg(int reg) +{ + desa_ascii(((reg&8)? 'A0':'D0') + (reg&7)); +} + +/* Used with ABCD, SBCD, ADDX, SUBX */ +static void desa_ry_rx(int inst, int size) +{ + desa_ascii(inst); + desa_ascii(size); + desa_char(' '); + if(d.mode3&1) /* -(Ay),-(Ax) */ + { + desa_ascii('-(A0'+d.reg0); + desa_ascii('),-('); + desa_ascii('A0)' + (d.reg9<<8)); + } + else /* Dy,Dx */ + { + desa_reg(d.reg0); + desa_char(','); + desa_reg(d.reg9); + } +} + +static void desa_dn_ae(int name) +{ + desa_ascii(name); + desa_ascii(d.szchar); + desa_char (' '); + /* dn, */ + if(d.w&0400) + { + desa_ascii('D0,' + (d.reg9<<8)); + get_ea_2(d.mode3, d.reg0, d.szchar); + } + + /* ,dn */ + else + { + get_ea_2(d.mode3, d.reg0, d.szchar); + desa_ascii(',D0'+d.reg9); + } +} + +/************** + * + * LINE 0 : + * -Immediat operations + * -SR & CCR operations + * -Bit operations + * -Movep + * + ***************/ + +static int check_desa_bitop(void) +{ + static u32 fn[] = { 'BTST', 'BCHG', 'BCLR', 'BSET'}; + int modemsk = 00775; + unsigned int inst; + + if(!(modemsk&(1<*/ + if(!(d.w&0400)) + { + if((d.w&0xF00)!=0x800) + return 0; + desa_ascii(inst); + desa_ascii(' #'); + read_pc(); + desa_usignifiant((u8)d.w); + } + else + /* B... dn,*/ + { + desa_ascii(inst); + desa_ascii(' D0'+d.reg9); + } + desa_char(','); + get_ea_2(d.mode3, d.reg0, 'B'); + + return 1; +} + +static int check_desa_IMM_SR(void) +{ + u32 modemsk = 1 + (1<<2) + (1<<10); + int mode = (d.w>>8)&15, inst='ORI'; + + if((d.w&0677)!=0074 || !(modemsk&(1<> ((w&(3<<12))>>(12-3))); + desa_ascii('MOVE'); + desa_ascii(((d.adrmode6==MODE_AN)? ('A'<<24) : 0) + ('.'<<16) + ' ' + (movsz<<8) ); + get_ea_move(0,w,movsz); + desa_char(','); + get_ea_move(6,w,movsz); +} + +/* Check and disassemble a valid move + * return TRUE if valid move + */ +static int check_desa_move() +{ + u32 srcmsk = 0xFFF; + u32 destmsk = 0x1FF; + /* Remove An source & destination addressing mode for byte access */ + if(d.line==0x1) + { + srcmsk &= ~(1< reg */ + if(w&02000) + { + get_ea_2(mode3, reg0, 0); + desa_char(','); + get_movemreg(regmsk,0); + } + /* -> mem */ + else + { + get_movemreg(regmsk, (mode3==MODE_pAN) ? 15 : 0); + desa_char(','); + get_ea_2(mode3, reg0, 0); + } + return 1; +} + +static int check_desa_jmp() +{ + int modemsk = 03744; + if((d.w&07600) != 07200) { + return 0; + } + /* JMP / JSR */ + if(modemsk & (1<>8)&15]); + desa_ascii(' D0,' + (d.reg0<<8)); + get_ea_2(MODE_ABSW, MODE_dPC-MODE_ABSW, 0); + /* $$$ hack : remove (PC) at the end */ + d.s[-4] = 0; + d.branch = d.ea; + d.status = DESA68_INST | DESA68_BRA | DESA68_BSR; +} + +static void desa_Scc() +{ + desa_ascii(('S'<<24) + ' ' + scc_ascii[(d.w>>8)&15]*256); + get_ea_2(d.mode3, d.reg0, d.szchar); +} + +static void desa_line5(void) +{ + if((d.w&0370)==0310) { + desa_Dcc(); + } else if(d.opsz==3) { + desa_Scc(); + } else { + desa_addq_subq(); + } +} + +/************** + * + * LINE 6 : + * -Bcc + * + * Format 0110 COND OFFSET08 [OFFSET16 if OFFSET08==0] + * !!! COND=0001(false) => BSR + ***************/ + +static void desa_line6(void) +{ + s32 a; + int cond = (d.w>>8) & 0xF; + desa_ascii(('B'<<16) + bcc_ascii[cond]); + /* Bcc.S */ + if(d.w&255) + { + desa_ascii('.S'); + a = (s32)(s8)d.w; + a += (s32)d.pc; + } + /* Bcc.W */ + else a = relPC(); + desa_char(' '); + + desa_absL(a&d.memmsk); + + d.status = DESA68_INST | DESA68_BRA | (-(cond!=0) & DESA68_BSR ); + d.branch = a; +} + +/************** + * + * LINE 7 : + * -MOVEQ + * + * Format : 01111 REG 0 XXXXXXXX + * + ***************/ +static void desa_line7(void) +{ + if(d.w&0400) { + desa_dcw(); + } else { + desa_str("MOVEQ #"); + desa_signifiant((int)(s8)d.w); + desa_ascii(',D0'+d.reg9); + } +} + + +/************** + * + * LINE B : + * -CMP + * -CMPM + * -EOR + * + ***************/ + +static int check_desa_cmpa() +{ + int modemsk = 07777; + if(d.opsz!=3 || !(modemsk&(1<>8)); + desa_char (','); + desa_reg(d.reg0 + (reg&8)); + return 1; +} + +static int check_desa_mul_div(void) +{ + int modemsk = 0xFFD; + if((d.w&0300)!=0300 || !(modemsk&(1<>3)&3; + desa_ascii (shf_ascii[type]); + desa_char ((d.w&0400) ? 'L' :'R'); + if(type==2) desa_char('X'); + desa_ascii(d.szchar); + /* dn,dn */ + if(d.w&(1<<5)) + desa_ascii(' D0'+d.reg9); + /* #x,dn */ + else + desa_ascii(' #1'+((d.reg9-1)&7)); + desa_ascii(',D0'+d.reg0); + } +} + +/************** + * + * LINE A : + * -LineA + * LINE F : + * -LineF + * + * Format : LINE XXXX XXXX XXXX + * + ***************/ + +static void desa_linAF(void) +{ + desa_ascii('LINE'); + desa_ascii('A '+((d.line-0xA)<<8)); + desa_uhexacat(d.w, 3, '$'); +} + +static void (*desa_line[16])(void) = +{ + desa_line0, desa_li123, desa_li123, desa_li123, + desa_line4, desa_line5, desa_line6, desa_line7, + desa_lin8C, desa_lin9D, desa_linAF, desa_lineB, + desa_lin8C, desa_lin9D, desa_lineE, desa_linAF, +}; + +void desa68(DESA68parm_t *dparm) +{ + char tmp[64]; + dparm->ea = dparm->branch = d.memmsk+1; + dparm->status = DESA68_INST; /* Assume valid instruction */ + d = *dparm; + d.s = d.str; + if (!d.s) { + d.s = tmp; + d.strmax = sizeof(tmp); + } + d.s[0]=0; + read_pc(); + + d.reg0 = REG0(d.w); + d.reg9 = REG9(d.w); + d.mode3 = MODE3(d.w); + d.mode6 = MODE6(d.w); + d.line = LINE(d.w); + d.opsz = OPSZ(d.w); + d.adrmode0 = d.mode3 + ((d.mode3==MODE_ABSW)?d.reg0 : 0); + d.adrmode6 = d.mode6 + ((d.mode6==MODE_ABSW)?d.reg9 : 0); + d.szchar = ('.'<<8)|(u8)('?LWB'>>(d.opsz*8)); + + d.ea_src = d.ea_dst = -1; + + (desa_line[d.line])(); + desa_char(0); + /* Restore current status to caller struct */ + dparm->pc = d.pc; + dparm->status = d.status; + dparm->branch = d.branch; + dparm->ea_src = d.ea_src; + dparm->ea_dst = d.ea_dst; +} + +#ifdef _TEST_DESA68_ + +static void message(void ) +{ + printf("Desa68 -- Built-in test\n(c) BeN / SasHipA - Dev\n"); +} + + +int main(int na, char **a) +{ + FILE *f; + u8 *b; + int l,i,nline=50; + static char s[256]; + + DESA68parm_t d; + + message(); + + if(na<2) + { + perror("No input file\n"); + return 1; + } + + if(f=fopen(a[1],"rb"), f==NULL) + { + perror("Can't open input file\n"); + return 2; + } + + fseek(f,0L,SEEK_END); + l = (int)ftell(f); + fseek(f,0L,SEEK_SET); + if(b=malloc(l), b==NULL) + { + fclose(f); + perror("Can't alloc memory\n"); + return 3; + } + + if(fread(b,l,1,f)!=1) + { + fclose(f); + free(b); + perror("Read error\n"); + return 4; + } + + if (na > 2) { + int n = atoi (a[2]); + if (n > 0) { + nline = n; + } + } + + fclose(f); + + + + { +#if 0 + char b[1024]; + /* + b[0] = 0x4e; + b[1] = 0xf6; + b[2] = 0x12; + b[3] = 0x32; + */ + /* + b[0] = 0x4a; + b[1] = 0x87; + b[2] = 0x12; + b[3] = 0x32; + */ + b[0] = 0x08; + b[1] = 0xb9; + b[2] = 0x00; + b[3] = 0x05; + b[4] = 0x00; + b[5] = 0xff; + b[6] = 0xfa; + b[7] = 0x11; +#endif + + d.mem = b; + d.memmsk = 0xFFFFFF; + d.pc = 0; + d.str = s; + + for(i=0; i + * @date 17/03/1999 + * @brief Motorola 68K disassembler + * + * $Id: desa68.h,v 2.3 2003/08/26 23:14:02 benjihan Exp $ + */ + +/* + * sc68 - 68000 disassembler + * Copyright (C) 2001-2003 Benjamin Gerard + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/* Modified for usage in Mednafen */ + +#ifndef _DESA68_H_ +#define _DESA68_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef EMU68DEBUG +#define EMU68DEBUG +#endif + +/** @defgroup desa68_devel desa68 library documentation. + * + * @author Benjamin Gerard + * + * desa68 library is a 68000 disassembler with enhanced features that help to + * trace branch instructions. + * + * Optionnally the disassembler may disassemble with symbol instead of + * absolute address or long immediat. A supplemental control is available + * to choose the range of address that must be disassembled as symbol. + * + * A good sample is may be found in the sourcer68 directory. This library + * is also used by debug68 programs. + * + * @{ + */ + +/** @name Disassembly option flags. + * @anchor desa68_opt_flags + * + * Use bitwise OR operation with these values to set the + * the DESA68parm_t::flags in order to configure the disassembler. + * + * @{ + */ + +/** Disassemble with symbol. + * + * If the DESA68_SYMBOL_FLAG is set in the DESA68parm_t::flags + * and the value of absolute long addressing mode or an immediat long + * is in greater or equal to DESA68parm_t::immsym_min and less than + * DESA68parm_t::immsym_max + * then the disassembler replaces the value by a named symbol. + * The named symbol constist on the value transformed to an 6 hexadecimal + * digit number with a prefixed 'L'. + */ +#define DESA68_SYMBOL_FLAG (1<<0) + +/**@}*/ + +/** @name Instruction type flags. + * @anchor desa68_inst_flags + * + * These flags are setted in the DESA68parm_t::status field by desa68() + * function. It allow to determine the type of the dissassembled instruction. + * + * @{ + */ + +/** Valid instruction. */ +#define DESA68_INST (1<<0) + +/** Branch always instruction (bra/jmp/dbcc). */ +#define DESA68_BRA (1<<1) + +/** Subroutine (bsr/jsr)/ Conditionnal branch instruction (bcc/dbcc). */ +#define DESA68_BSR (1<<2) + +/** Return from subroutine/Interruption instruction (rts/rte). */ +#define DESA68_RTS (1<<3) + +/** Software interrupt instruction (trap/chk). */ +#define DESA68_INT (1<<4) + +/** nop instruction. */ +#define DESA68_NOP (1<<5) + +/**@}*/ + + +/** 68K disassemble pass parameters. + * + * The DESA68parm_t data structure contains the information necessary to + * disassemble 68K instructions. + * + * There are 3 categories of fields in this structure. + * - Input parameters; Must be set before calling the desa68() function. + * - Output parameters; Information on disassembled instruction + * filled by desa68() function. + * - Miscellaneous internal fields. + * + * @note The DESA68parm_t::pc field is both input and output since it is use + * to set the address of the instruction to decode and returns with + * the value of the next one. + */ +typedef struct +{ + + /** @name Input parameters. + * + * These parameters must be set before calling the desa68() functions. + * + * @{ + */ + + uint16_t (*mem_callb)(uint32_t address, void *private_data); + void *private_data; + + /*unsigned char *mem; */ /**< Base of 68K memory. */ + + unsigned int memmsk; /**< Size of memory - 1 (mask). */ + /** Address (Offset in mem) of instruction to disassemble; Returns + * with the address of the next instruction. + */ + unsigned int pc; + int flags; /**< @ref desa68_opt_flags "Disassemble options" */ + char *str; /**< Destination string. */ + int strmax; /**< Destination string buffer size. + @warning Unused */ + /** Minimum value to interpret long immediat or absolute long as symbol. + * @see DESA68_SYMBOL_FLAG for more details + * @see immsym_max + */ + unsigned int immsym_min; + /** Maximum value to interpret long immediat or absolute long as symbol. + * @see DESA68_SYMBOL_FLAG for more details + * @see immsym_min + */ + unsigned int immsym_max; + + /**@}*/ + + + /** @name Output parameters. + * + * These parameters are setted by the desa68() functions. + * @{ + */ + + /** Effective address of source operand (-1:not a memory operand). */ + unsigned int ea_src; + /** Effective address of destiantion operand (-1:not a memory operand). */ + unsigned int ea_dst; /**< Effective address of destination operand */ + /** @ref desa68_inst_flags "disassembly instruction flags" */ + unsigned int status; + /** Branch or interrupt vector address. + * + * If the dissassembled instruction was a branch a call or a sotfware + * interrupt the DESA68parm_t::branch is set to the jump address or + * the interrupt vector involved. + * + * @see status for more information on instruction type. + */ + unsigned int branch; + /** Last decoded word (16 bit sign extended). */ + int w; + /** Pointer to current destination char. */ + char *s; + + /**@}*/ + + + /** @name Miscellaneous internal variables. + * @internal + * @{ + */ + + /** Intermediat opcode decoding. */ + int reg0; + int reg9; + int mode3; + int mode6; + int opsz; + int line; + int adrmode0; + int adrmode6; + int szchar; + unsigned int ea; + + /**@}*/ + +} DESA68parm_t; + + +/** Disassemble a single 68000 instruction. + * + * param d Pointer to disassemble pass parameter structure. + */ +void desa68(DESA68parm_t *d); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef _DESA68_H_ */ diff --git a/Mednafen/mednafen/dis6502.cpp b/Mednafen/mednafen/dis6502.cpp new file mode 100644 index 0000000000..7c0175dc95 --- /dev/null +++ b/Mednafen/mednafen/dis6502.cpp @@ -0,0 +1,313 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include "dis6502.h" + +Dis6502::Dis6502(bool is_cmos) +{ + IsCMOS = is_cmos; + +} + +Dis6502::~Dis6502() +{ + +} + +uint8 Dis6502::Read(uint16 A) +{ + return(0); +} + +uint8 Dis6502::GetX(void) +{ + return(0); +} + +uint8 Dis6502::GetY(void) +{ + return(0); +} + + +static const char *fstrings[12]= +{ + "#$%02X", // immediate + "$%04X", // RELATIVE(jump) + "$%02X", // Z + "$%02X,X", // Z,x + "$%02X,Y", // Z,y + "$%04X", //ABS + "$%04X,X", // ABS,x + "$%04X,Y", // ABS,y + "($%04X)", // IND + "($%02X,X)", // INX + "($%02X),Y", // INY + "" +}; +static const int flengths[12]={1,1,1,1,1,2,2,2,2,1,1,0}; + +#define IMD(x) ((0<<16)|x) +#define REL(x) ((1<<16)|x) +#define ZP(x) ((2<<16)|x) +#define ZPX(x) ((3<<16)|x) +#define ZPY(x) ((4<<16)|x) +#define ABS(x) ((5<<16)|x) +#define ABX(x) ((6<<16)|x) +#define ABY(x) ((7<<16)|x) +#define IND(x) ((8<<16)|x) +#define INX(x) ((9<<16)|x) +#define INY(x) ((10<<16)|x) +#define IMP(x) ((11<<16)|x) + +typedef struct { + const char *name; + int type; /* 1 for read, 2 for write, 3 for r then write. */ + int32 modes[10]; +} OPS; + +#define NUMOPS 56 +static OPS optable[NUMOPS]= +{ + {"BRK",0,{IMP(0x00),-1}}, + {"RTI",0,{IMP(0x40),-1}}, + {"RTS",0,{IMP(0x60),-1}}, + {"PHA",2,{IMP(0x48),-1}}, + {"PHP",2,{IMP(0x08),-1}}, + {"PLA",1,{IMP(0x68),-1}}, + {"PLP",1,{IMP(0x28),-1}}, + {"JMP",0,{ABS(0x4C),IND(0x6C),-1}}, + {"JSR",0,{ABS(0x20),-1}}, + {"TAX",0,{IMP(0xAA),-1}}, + {"TXA",0,{IMP(0x8A),-1}}, + {"TAY",0,{IMP(0xA8),-1}}, + {"TYA",0,{IMP(0x98),-1}}, + {"TSX",0,{IMP(0xBA),-1}}, + {"TXS",0,{IMP(0x9A),-1}}, + {"DEX",0,{IMP(0xCA),-1}}, + {"DEY",0,{IMP(0x88),-1}}, + {"INX",0,{IMP(0xE8),-1}}, + {"INY",0,{IMP(0xC8),-1}}, + {"CLC",0,{IMP(0x18),-1}}, + {"CLD",0,{IMP(0xD8),-1}}, + {"CLI",0,{IMP(0x58),-1}}, + {"CLV",0,{IMP(0xB8),-1}}, + {"SEC",0,{IMP(0x38),-1}}, + {"SED",0,{IMP(0xF8),-1}}, + {"SEI",0,{IMP(0x78),-1}}, + {"NOP",0,{IMP(0xEA),-1}}, + {"ASL",1,{IMP(0x0a),ZP(0x06),ZPX(0x16),ABS(0x0E),ABX(0x1E),-1}}, + {"DEC",3,{ZP(0xc6),ZPX(0xd6),ABS(0xcE),ABX(0xdE),-1}}, + {"INC",3,{ZP(0xe6),ZPX(0xf6),ABS(0xeE),ABX(0xfE),-1}}, + {"LSR",3,{IMP(0x4a),ZP(0x46),ZPX(0x56),ABS(0x4E),ABX(0x5E),-1}}, + {"ROL",3,{IMP(0x2a),ZP(0x26),ZPX(0x36),ABS(0x2E),ABX(0x3E),-1}}, + {"ROR",3,{IMP(0x6a),ZP(0x66),ZPX(0x76),ABS(0x6E),ABX(0x7E),-1}}, + {"ADC",1,{IMD(0x69),ZP(0x65),ZPX(0x75),ABS(0x6D),ABX(0x7d),ABY(0x79), + INX(0x61),INY(0x71),-1}}, + {"AND",1,{IMD(0x29),ZP(0x25),ZPX(0x35),ABS(0x2D),ABX(0x3d),ABY(0x39), + INX(0x21),INY(0x31),-1}}, + {"BIT",1,{ZP(0x24),ABS(0x2c),-1}}, + {"CMP",1,{IMD(0xc9),ZP(0xc5),ZPX(0xd5),ABS(0xcD),ABX(0xdd),ABY(0xd9), + INX(0xc1),INY(0xd1),-1}}, + {"CPX",1,{IMD(0xe0),ZP(0xe4),ABS(0xec),-1}}, + {"CPY",1,{IMD(0xc0),ZP(0xc4),ABS(0xcc),-1}}, + {"EOR",1,{IMD(0x49),ZP(0x45),ZPX(0x55),ABS(0x4D),ABX(0x5d),ABY(0x59), + INX(0x41),INY(0x51),-1}}, + {"LDA",1,{IMD(0xa9),ZP(0xa5),ZPX(0xb5),ABS(0xaD),ABX(0xbd),ABY(0xb9), + INX(0xa1),INY(0xb1),-1}}, + {"LDX",1,{IMD(0xa2),ZP(0xa6),ZPY(0xB6),ABS(0xae),ABY(0xbe),-1}}, + {"LDY",1,{IMD(0xa0),ZP(0xa4),ZPX(0xB4),ABS(0xac),ABX(0xbc),-1}}, + {"ORA",1,{IMD(0x09),ZP(0x05),ZPX(0x15),ABS(0x0D),ABX(0x1d),ABY(0x19), + INX(0x01),INY(0x11),-1}}, + {"SBC",1,{IMD(0xEB),IMD(0xe9),ZP(0xe5),ZPX(0xf5),ABS(0xeD),ABX(0xfd),ABY(0xf9), + INX(0xe1),INY(0xf1),-1}}, + {"STA",2,{ZP(0x85),ZPX(0x95),ABS(0x8D),ABX(0x9d),ABY(0x99), + INX(0x81),INY(0x91),-1}}, + {"STX",2,{ZP(0x86),ZPY(0x96),ABS(0x8E),-1}}, + {"STY",2,{ZP(0x84),ZPX(0x94),ABS(0x8C),-1}}, + {"BCC",1,{REL(0x90),-1}}, + {"BCS",1,{REL(0xb0),-1}}, + {"BEQ",1,{REL(0xf0),-1}}, + {"BNE",1,{REL(0xd0),-1}}, + {"BMI",1,{REL(0x30),-1}}, + {"BPL",1,{REL(0x10),-1}}, + {"BVC",1,{REL(0x50),-1}}, + {"BVS",1,{REL(0x70),-1}}, +}; + +void Dis6502::Disassemble(uint16 &a, uint16 SpecialA, char *stringo) +{ + uint8 buf; + unsigned int arg; + int32 info; + int x; + int y; + + info=-1; + + buf=Read(a); + a++; + + for(x=0;x=0) + { + if((optable[x].modes[y]&0xFF)==buf) + { + info=optable[x].modes[y]; + goto endy; + } + y++; + } + } + + endy: + sprintf(stringo,"%02X ",buf); + if(info>=0) + { + int z=flengths[(info>>16)]; + bool borked = 0; + + if(z) + { + arg=Read(a); + + if(a == SpecialA) + borked = 1; + + if(z == 2 && ((a + 1) & 0xFFFF) == SpecialA) + { + if(!borked) + { + sprintf(stringo+strlen(stringo),"%02X ", Read(a)); + a++; + } + borked = 1; + } + if(!borked) + { + sprintf(stringo+strlen(stringo),"%02X ",arg); + + a++; + if(z == 2) + { + arg|=Read(a)<<8; + sprintf(stringo+strlen(stringo),"%02X ",arg>>8); + a++; + } + else + strcat(stringo," "); + if((info>>16)==1) /* Relative branch */ + arg=(a+(char)arg) & 0xFFFF; + } + + if(borked) + strcat(stringo, "--------"); + else + { + sprintf(stringo+strlen(stringo),"%s ",optable[x].name); + sprintf(stringo+strlen(stringo),fstrings[info>>16],arg); + } +/* + 0 "#$%02X", // immediate + 1 "$%04X", // RELATIVE(jump) + 2 "$%02X", // Z + 3 "$%02X,X", // Z,x + 4 "$%02X,Y", // Z,y + 5 "$%04X", //ABS + 6 "$%04X,X", // ABS,x + 7 "$%04X,Y", // ABS,y + 8 "($%04X)", // IND + 9 "($%02X,X)", // INX + 10 "($%02X),Y", // INY + 11 #define IMP(x) ((11<<16)|x) +*/ + if(!borked) + { + unsigned int tmp; + switch(info>>16) + { + case 2:tmp=arg; + if(optable[x].type&1) + { + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + } + break; + case 3:tmp=(arg+GetX())&0xff; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[x].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 4:tmp=(arg+GetY())&0xff; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[x].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 5:tmp=arg; + if(optable[x].type&1) + { + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + } + break; + case 6:tmp=(arg+GetX())&0xffff; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[x].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 7:tmp=(arg+GetY())&0xffff; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[x].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 8: + if(IsCMOS) + tmp=Read(arg)|(Read((arg+1)&0xffff)<<8); + else + tmp=Read(arg)|(Read( ((arg+1)&0x00ff) | (arg & 0xFF00))<<8); + sprintf(stringo+strlen(stringo)," $%04X",tmp); + break; + case 9:tmp=(arg+GetX())&0xFF; + tmp=Read(tmp) | (Read((tmp+1)&0xFF)<<8); + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[x].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 10:tmp=Read(arg) | (Read((arg+1)&0xFF)<<8); + tmp=(tmp+GetY())&0xFFFF; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[x].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + + } + } + + + } + else + { + strcat(stringo," "); + strcat(stringo,optable[x].name); + } + } + else + sprintf(stringo+strlen(stringo)," .db $%02X",buf); +} diff --git a/Mednafen/mednafen/dis6502.h b/Mednafen/mednafen/dis6502.h new file mode 100644 index 0000000000..987bb89af0 --- /dev/null +++ b/Mednafen/mednafen/dis6502.h @@ -0,0 +1,15 @@ +class Dis6502 +{ + public: + Dis6502(bool); + virtual ~Dis6502(); + + virtual uint8 Read(uint16 A); + virtual uint8 GetX(void); + virtual uint8 GetY(void); + + void Disassemble(uint16 &a, uint16 SpecialA, char *); + + private: + bool IsCMOS; +}; diff --git a/Mednafen/mednafen/driver.h b/Mednafen/mednafen/driver.h new file mode 100644 index 0000000000..aa9eefd9db --- /dev/null +++ b/Mednafen/mednafen/driver.h @@ -0,0 +1,13 @@ +#ifndef __MDFN_DRIVER_H +#define __MDFN_DRIVER_H + +#include "mednafen.h" +#include "settings-driver.h" +#include "mednafen-driver.h" +#include "netplay-driver.h" +#include "state-driver.h" +#include "movie-driver.h" +#include "mempatcher-driver.h" +#include "video-driver.h" + +#endif diff --git a/Mednafen/mednafen/drivers/2xSaI.cpp b/Mednafen/mednafen/drivers/2xSaI.cpp new file mode 100644 index 0000000000..c16abe406e --- /dev/null +++ b/Mednafen/mednafen/drivers/2xSaI.cpp @@ -0,0 +1,1344 @@ +/* 2xSaI + * Copyright (c) Derek Liauw Kie Fa, 1999-2002 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* http://lists.fedoraproject.org/pipermail/legal/2009-October/000928.html */ + +#include "2xSaI.h" +#include "main.h" + +#if defined(__GNUC__) && defined(__i386__) + #define MMX 1 +#else + #undef MMX +#endif + +#undef MMX // Remove when we have a system for compiling 32-bit x86 standalone assembly files. + +extern "C" +{ +#ifdef MMX + void _2xSaILine (sai_uint8 *srcPtr, sai_uint8 *deltaPtr, sai_uint32 srcPitch, + sai_uint32 width, sai_uint8 *dstPtr, sai_uint32 dstPitch); + void _2xSaISuperEagleLine (sai_uint8 *srcPtr, sai_uint8 *deltaPtr, + sai_uint32 srcPitch, sai_uint32 width, + sai_uint8 *dstPtr, sai_uint32 dstPitch); + void _2xSaISuper2xSaILine (sai_uint8 *srcPtr, sai_uint8 *deltaPtr, + sai_uint32 srcPitch, sai_uint32 width, + sai_uint8 *dstPtr, sai_uint32 dstPitch); + void Init_2xSaIMMX (sai_uint32 BitFormat); + + bool cpu_mmx = 1; +#endif +} +static sai_uint32 colorMask = 0xF7DEF7DE; +static sai_uint32 lowPixelMask = 0x08210821; +static sai_uint32 qcolorMask = 0xE79CE79C; +static sai_uint32 qlowpixelMask = 0x18631863; +static sai_uint32 redblueMask = 0xF81F; +static sai_uint32 greenMask = 0x7E0; + +sai_uint32 qRGB_COLOR_MASK[2] = { 0xF7DEF7DE, 0xF7DEF7DE }; + +//extern void hq2x_init(unsigned); + +int Init_2xSaI(sai_uint32 systemColorDepth, sai_uint32 BitFormat) +{ + if(systemColorDepth == 16) { + if (BitFormat == 565) { + colorMask = 0xF7DEF7DE; + lowPixelMask = 0x08210821; + qcolorMask = 0xE79CE79C; + qlowpixelMask = 0x18631863; + redblueMask = 0xF81F; + greenMask = 0x7E0; + qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xF7DEF7DE; + //hq2x_init(16); + } else if (BitFormat == 555) { + colorMask = 0x7BDE7BDE; + lowPixelMask = 0x04210421; + qcolorMask = 0x739C739C; + qlowpixelMask = 0x0C630C63; + redblueMask = 0x7C1F; + greenMask = 0x3E0; + qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0x7BDE7BDE; + //hq2x_init(15); + } else { + return 0; + } + } else if(systemColorDepth == 32) { + colorMask = 0xfefefefe; + lowPixelMask = 0x01010101; + qcolorMask = 0xfcfcfcfc; + qlowpixelMask = 0x03030303; + qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xfefefefe; + //hq2x_init(32); + } else + return 0; + +#ifdef MMX + Init_2xSaIMMX (BitFormat); +#endif + + return 1; +} + +static inline int GetResult1 (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D, + sai_uint32 /* E */) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +static inline int GetResult2 (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D, + sai_uint32 /* E */) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r -= 1; + if (y <= 1) + r += 1; + return r; +} + +static inline int GetResult (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +static inline sai_uint32 INTERPOLATE (sai_uint32 A, sai_uint32 B) +{ + if (A != B) { + return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + + (A & B & lowPixelMask)); + } else + return A; +} + +static inline sai_uint32 Q_INTERPOLATE (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D) +{ + register sai_uint32 x = ((A & qcolorMask) >> 2) + + ((B & qcolorMask) >> 2) + + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); + register sai_uint32 y = (A & qlowpixelMask) + + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); + + y = (y >> 2) & qlowpixelMask; + return x + y; +} + +static inline int GetResult1_32 (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D, + sai_uint32 /* E */) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r += 1; + if (y <= 1) + r -= 1; + return r; +} + +static inline int GetResult2_32 (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D, + sai_uint32 /* E */) +{ + int x = 0; + int y = 0; + int r = 0; + + if (A == C) + x += 1; + else if (B == C) + y += 1; + if (A == D) + x += 1; + else if (B == D) + y += 1; + if (x <= 1) + r -= 1; + if (y <= 1) + r += 1; + return r; +} + +void Super2xSaI (sai_uint8 *srcPtr, sai_uint32 srcPitch, + sai_uint8 *deltaPtr, sai_uint8 *dstPtr, sai_uint32 dstPitch, + int width, int height) +{ + sai_uint16 *bP; + sai_uint8 *dP; + sai_uint32 inc_bP; + sai_uint32 Nextline = srcPitch >> 1; +#ifdef MMX + if (cpu_mmx) { + for (; height; height--) { + _2xSaISuper2xSaILine (srcPtr, deltaPtr, srcPitch, width, + dstPtr, dstPitch); + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } + } else +#endif + { + inc_bP = 1; + + for (; height; height--) { + bP = (sai_uint16 *) srcPtr; + dP = (sai_uint8 *) dstPtr; + + for (sai_uint32 finish = width; finish; finish -= inc_bP) { + sai_uint32 color4, color5, color6; + sai_uint32 color1, color2, color3; + sai_uint32 colorA0, colorA1, colorA2, colorA3, + colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; + sai_uint32 product1a, product1b, product2a, product2b; + + //--------------------------------------- B1 B2 + // 4 5 6 S2 + // 1 2 3 S1 + // A1 A2 + + colorB0 = *(bP - Nextline - 1); + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + colorB3 = *(bP - Nextline + 2); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA0 = *(bP + Nextline + Nextline - 1); + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + colorA3 = *(bP + Nextline + Nextline + 2); + + //-------------------------------------- + if (color2 == color6 && color5 != color3) { + product2b = product1b = color2; + } else if (color5 == color3 && color2 != color6) { + product2b = product1b = color5; + } else if (color5 == color3 && color2 == color6) { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) + product2b = product1b = color6; + else if (r < 0) + product2b = product1b = color5; + else { + product2b = product1b = INTERPOLATE (color5, color6); + } + } else { + if (color6 == color3 && color3 == colorA1 + && color2 != colorA2 && color3 != colorA0) + product2b = + Q_INTERPOLATE (color3, color3, color3, color2); + else if (color5 == color2 && color2 == colorA2 + && colorA1 != color3 && color2 != colorA3) + product2b = + Q_INTERPOLATE (color2, color2, color2, color3); + else + product2b = INTERPOLATE (color2, color3); + + if (color6 == color3 && color6 == colorB1 + && color5 != colorB2 && color6 != colorB0) + product1b = + Q_INTERPOLATE (color6, color6, color6, color5); + else if (color5 == color2 && color5 == colorB2 + && colorB1 != color6 && color5 != colorB3) + product1b = + Q_INTERPOLATE (color6, color5, color5, color5); + else + product1b = INTERPOLATE (color5, color6); + } + + if (color5 == color3 && color2 != color6 && color4 == color5 + && color5 != colorA2) + product2a = INTERPOLATE (color2, color5); + else + if (color5 == color1 && color6 == color5 + && color4 != color2 && color5 != colorA0) + product2a = INTERPOLATE (color2, color5); + else + product2a = color2; + + if (color2 == color6 && color5 != color3 && color1 == color2 + && color2 != colorB2) + product1a = INTERPOLATE (color2, color5); + else + if (color4 == color2 && color3 == color2 + && color1 != color5 && color2 != colorB0) + product1a = INTERPOLATE (color2, color5); + else + product1a = color5; + +#ifdef WORDS_BIGENDIAN + product1a = (product1a << 16) | product1b; + product2a = (product2a << 16) | product2b; +#else + product1a = product1a | (product1b << 16); + product2a = product2a | (product2b << 16); +#endif + + *((sai_uint32 *) dP) = product1a; + *((sai_uint32 *) (dP + dstPitch)) = product2a; + + bP += inc_bP; + dP += sizeof (sai_uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + deltaPtr += srcPitch; + } // endof: for (; height; height--) + } +} + +void Super2xSaI32 (sai_uint8 *srcPtr, sai_uint32 srcPitch, + sai_uint8 *dstPtr, sai_uint32 dstPitch, + int width, int height) +{ + sai_uint32 *bP; + sai_uint32 *dP; + sai_uint32 inc_bP; + sai_uint32 Nextline = srcPitch >> 2; + inc_bP = 1; + + for (; height; height--) { + bP = (sai_uint32 *) srcPtr; + dP = (sai_uint32 *) dstPtr; + + for (sai_uint32 finish = width; finish; finish -= inc_bP) { + sai_uint32 color4, color5, color6; + sai_uint32 color1, color2, color3; + sai_uint32 colorA0, colorA1, colorA2, colorA3, + colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; + sai_uint32 product1a, product1b, product2a, product2b; + + //--------------------------------------- B1 B2 + // 4 5 6 S2 + // 1 2 3 S1 + // A1 A2 + + colorB0 = *(bP - Nextline - 1); + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + colorB3 = *(bP - Nextline + 2); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA0 = *(bP + Nextline + Nextline - 1); + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + colorA3 = *(bP + Nextline + Nextline + 2); + + //-------------------------------------- + if (color2 == color6 && color5 != color3) { + product2b = product1b = color2; + } else if (color5 == color3 && color2 != color6) { + product2b = product1b = color5; + } else if (color5 == color3 && color2 == color6) { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) + product2b = product1b = color6; + else if (r < 0) + product2b = product1b = color5; + else { + product2b = product1b = INTERPOLATE (color5, color6); + } + } else { + if (color6 == color3 && color3 == colorA1 + && color2 != colorA2 && color3 != colorA0) + product2b = + Q_INTERPOLATE (color3, color3, color3, color2); + else if (color5 == color2 && color2 == colorA2 + && colorA1 != color3 && color2 != colorA3) + product2b = + Q_INTERPOLATE (color2, color2, color2, color3); + else + product2b = INTERPOLATE (color2, color3); + + if (color6 == color3 && color6 == colorB1 + && color5 != colorB2 && color6 != colorB0) + product1b = + Q_INTERPOLATE (color6, color6, color6, color5); + else if (color5 == color2 && color5 == colorB2 + && colorB1 != color6 && color5 != colorB3) + product1b = + Q_INTERPOLATE (color6, color5, color5, color5); + else + product1b = INTERPOLATE (color5, color6); + } + + if (color5 == color3 && color2 != color6 && color4 == color5 + && color5 != colorA2) + product2a = INTERPOLATE (color2, color5); + else + if (color5 == color1 && color6 == color5 + && color4 != color2 && color5 != colorA0) + product2a = INTERPOLATE (color2, color5); + else + product2a = color2; + + if (color2 == color6 && color5 != color3 && color1 == color2 + && color2 != colorB2) + product1a = INTERPOLATE (color2, color5); + else + if (color4 == color2 && color3 == color2 + && color1 != color5 && color2 != colorB0) + product1a = INTERPOLATE (color2, color5); + else + product1a = color5; + *(dP) = product1a; + *(dP+1) = product1b; + *(dP + (dstPitch >> 2)) = product2a; + *(dP + (dstPitch >> 2) + 1) = product2b; + + bP += inc_bP; + dP += 2; + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + // deltaPtr += srcPitch; + } // endof: for (; height; height--) +} + +void SuperEagle (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *deltaPtr, + sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height) +{ + sai_uint8 *dP; + sai_uint16 *bP; + sai_uint16 *xP; + sai_uint32 inc_bP; + +#ifdef MMX + if (cpu_mmx) { + for (; height; height--) { + _2xSaISuperEagleLine (srcPtr, deltaPtr, srcPitch, width, + dstPtr, dstPitch); + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } + } else +#endif + { + inc_bP = 1; + + sai_uint32 Nextline = srcPitch >> 1; + + for (; height; height--) { + bP = (sai_uint16 *) srcPtr; + xP = (sai_uint16 *) deltaPtr; + dP = dstPtr; + for (sai_uint32 finish = width; finish; finish -= inc_bP) { + sai_uint32 color4, color5, color6; + sai_uint32 color1, color2, color3; + sai_uint32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; + sai_uint32 product1a, product1b, product2a, product2b; + + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + + // -------------------------------------- + if (color2 == color6 && color5 != color3) { + product1b = product2a = color2; + if ((color1 == color2) || (color6 == colorB2)) { + product1a = INTERPOLATE (color2, color5); + product1a = INTERPOLATE (color2, product1a); + // product1a = color2; + } else { + product1a = INTERPOLATE (color5, color6); + } + + if ((color6 == colorS2) || (color2 == colorA1)) { + product2b = INTERPOLATE (color2, color3); + product2b = INTERPOLATE (color2, product2b); + // product2b = color2; + } else { + product2b = INTERPOLATE (color2, color3); + } + } else if (color5 == color3 && color2 != color6) { + product2b = product1a = color5; + + if ((colorB1 == color5) || (color3 == colorS1)) { + product1b = INTERPOLATE (color5, color6); + product1b = INTERPOLATE (color5, product1b); + // product1b = color5; + } else { + product1b = INTERPOLATE (color5, color6); + } + + if ((color3 == colorA2) || (color4 == color5)) { + product2a = INTERPOLATE (color5, color2); + product2a = INTERPOLATE (color5, product2a); + // product2a = color5; + } else { + product2a = INTERPOLATE (color2, color3); + } + + } else if (color5 == color3 && color2 == color6) { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) { + product1b = product2a = color2; + product1a = product2b = INTERPOLATE (color5, color6); + } else if (r < 0) { + product2b = product1a = color5; + product1b = product2a = INTERPOLATE (color5, color6); + } else { + product2b = product1a = color5; + product1b = product2a = color2; + } + } else { + product2b = product1a = INTERPOLATE (color2, color6); + product2b = + Q_INTERPOLATE (color3, color3, color3, product2b); + product1a = + Q_INTERPOLATE (color5, color5, color5, product1a); + + product2a = product1b = INTERPOLATE (color5, color3); + product2a = + Q_INTERPOLATE (color2, color2, color2, product2a); + product1b = + Q_INTERPOLATE (color6, color6, color6, product1b); + + // product1a = color5; + // product1b = color6; + // product2a = color2; + // product2b = color3; + } +#ifdef WORDS_BIGENDIAN + product1a = (product1a << 16) | product1b; + product2a = (product2a << 16) | product2b; +#else + product1a = product1a | (product1b << 16); + product2a = product2a | (product2b << 16); +#endif + + *((sai_uint32 *) dP) = product1a; + *((sai_uint32 *) (dP + dstPitch)) = product2a; + *xP = color5; + + bP += inc_bP; + xP += inc_bP; + dP += sizeof (sai_uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + deltaPtr += srcPitch; + } // endof: for (height; height; height--) + } +} + +void SuperEagle32 (sai_uint8 *srcPtr, sai_uint32 srcPitch, + sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height) +{ + sai_uint32 *dP; + sai_uint32 *bP; + sai_uint32 inc_bP; + + inc_bP = 1; + + sai_uint32 Nextline = srcPitch >> 2; + + for (; height; height--) { + bP = (sai_uint32 *) srcPtr; + dP = (sai_uint32 *)dstPtr; + for (sai_uint32 finish = width; finish; finish -= inc_bP) { + sai_uint32 color4, color5, color6; + sai_uint32 color1, color2, color3; + sai_uint32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; + sai_uint32 product1a, product1b, product2a, product2b; + + colorB1 = *(bP - Nextline); + colorB2 = *(bP - Nextline + 1); + + color4 = *(bP - 1); + color5 = *(bP); + color6 = *(bP + 1); + colorS2 = *(bP + 2); + + color1 = *(bP + Nextline - 1); + color2 = *(bP + Nextline); + color3 = *(bP + Nextline + 1); + colorS1 = *(bP + Nextline + 2); + + colorA1 = *(bP + Nextline + Nextline); + colorA2 = *(bP + Nextline + Nextline + 1); + + // -------------------------------------- + if (color2 == color6 && color5 != color3) { + product1b = product2a = color2; + if ((color1 == color2) || (color6 == colorB2)) { + product1a = INTERPOLATE (color2, color5); + product1a = INTERPOLATE (color2, product1a); + // product1a = color2; + } else { + product1a = INTERPOLATE (color5, color6); + } + + if ((color6 == colorS2) || (color2 == colorA1)) { + product2b = INTERPOLATE (color2, color3); + product2b = INTERPOLATE (color2, product2b); + // product2b = color2; + } else { + product2b = INTERPOLATE (color2, color3); + } + } else if (color5 == color3 && color2 != color6) { + product2b = product1a = color5; + + if ((colorB1 == color5) || (color3 == colorS1)) { + product1b = INTERPOLATE (color5, color6); + product1b = INTERPOLATE (color5, product1b); + // product1b = color5; + } else { + product1b = INTERPOLATE (color5, color6); + } + + if ((color3 == colorA2) || (color4 == color5)) { + product2a = INTERPOLATE (color5, color2); + product2a = INTERPOLATE (color5, product2a); + // product2a = color5; + } else { + product2a = INTERPOLATE (color2, color3); + } + + } else if (color5 == color3 && color2 == color6) { + register int r = 0; + + r += GetResult (color6, color5, color1, colorA1); + r += GetResult (color6, color5, color4, colorB1); + r += GetResult (color6, color5, colorA2, colorS1); + r += GetResult (color6, color5, colorB2, colorS2); + + if (r > 0) { + product1b = product2a = color2; + product1a = product2b = INTERPOLATE (color5, color6); + } else if (r < 0) { + product2b = product1a = color5; + product1b = product2a = INTERPOLATE (color5, color6); + } else { + product2b = product1a = color5; + product1b = product2a = color2; + } + } else { + product2b = product1a = INTERPOLATE (color2, color6); + product2b = + Q_INTERPOLATE (color3, color3, color3, product2b); + product1a = + Q_INTERPOLATE (color5, color5, color5, product1a); + + product2a = product1b = INTERPOLATE (color5, color3); + product2a = + Q_INTERPOLATE (color2, color2, color2, product2a); + product1b = + Q_INTERPOLATE (color6, color6, color6, product1b); + + // product1a = color5; + // product1b = color6; + // product2a = color2; + // product2b = color3; + } + *(dP) = product1a; + *(dP+1) = product1b; + *(dP + (dstPitch >> 2)) = product2a; + *(dP + (dstPitch >> 2) +1) = product2b; + + bP += inc_bP; + dP += 2; + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + } // endof: for (height; height; height--) +} + +void _2xSaI (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *deltaPtr, + sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height) +{ + sai_uint8 *dP; + sai_uint16 *bP; + sai_uint32 inc_bP; + +#ifdef MMX + if (cpu_mmx) { + for (; height; height -= 1) { + _2xSaILine (srcPtr, deltaPtr, srcPitch, width, dstPtr, dstPitch); + srcPtr += srcPitch; + dstPtr += dstPitch * 2; + deltaPtr += srcPitch; + } + } else +#endif + { + inc_bP = 1; + + sai_uint32 Nextline = srcPitch >> 1; + + for (; height; height--) { + bP = (sai_uint16 *) srcPtr; + dP = dstPtr; + + for (sai_uint32 finish = width; finish; finish -= inc_bP) { + + register sai_uint32 colorA, colorB; + sai_uint32 colorC, colorD, + colorE, colorF, colorG, colorH, + colorI, colorJ, colorK, colorL, + + colorM, colorN, colorO, colorP; + sai_uint32 product, product1, product2; + + //--------------------------------------- + // Map of the pixels: I|E F|J + // G|A B|K + // H|C D|L + // M|N O|P + colorI = *(bP - Nextline - 1); + colorE = *(bP - Nextline); + colorF = *(bP - Nextline + 1); + colorJ = *(bP - Nextline + 2); + + colorG = *(bP - 1); + colorA = *(bP); + colorB = *(bP + 1); + colorK = *(bP + 2); + + colorH = *(bP + Nextline - 1); + colorC = *(bP + Nextline); + colorD = *(bP + Nextline + 1); + colorL = *(bP + Nextline + 2); + + colorM = *(bP + Nextline + Nextline - 1); + colorN = *(bP + Nextline + Nextline); + colorO = *(bP + Nextline + Nextline + 1); + colorP = *(bP + Nextline + Nextline + 2); + + if ((colorA == colorD) && (colorB != colorC)) { + if (((colorA == colorE) && (colorB == colorL)) || + ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ))) { + product = colorA; + } else { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorA == colorG) && (colorC == colorO)) || + ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM))) { + product1 = colorA; + } else { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorA; + } else if ((colorB == colorC) && (colorA != colorD)) { + if (((colorB == colorF) && (colorA == colorH)) || + ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI))) { + product = colorB; + } else { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorC == colorH) && (colorA == colorF)) || + ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI))) { + product1 = colorC; + } else { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorB; + } else if ((colorA == colorD) && (colorB == colorC)) { + if (colorA == colorB) { + product = colorA; + product1 = colorA; + product2 = colorA; + } else { + register int r = 0; + + product1 = INTERPOLATE (colorA, colorC); + product = INTERPOLATE (colorA, colorB); + + r += + GetResult1 (colorA, colorB, colorG, colorE, + colorI); + r += + GetResult2 (colorB, colorA, colorK, colorF, + colorJ); + r += + GetResult2 (colorB, colorA, colorH, colorN, + colorM); + r += + GetResult1 (colorA, colorB, colorL, colorO, + colorP); + + if (r > 0) + product2 = colorA; + else if (r < 0) + product2 = colorB; + else { + product2 = + Q_INTERPOLATE (colorA, colorB, colorC, + colorD); + } + } + } else { + product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); + + if ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ)) { + product = colorA; + } else if ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI)) { + product = colorB; + } else { + product = INTERPOLATE (colorA, colorB); + } + + if ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM)) { + product1 = colorA; + } else if ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI)) { + product1 = colorC; + } else { + product1 = INTERPOLATE (colorA, colorC); + } + } + +#ifdef WORDS_BIGENDIAN + product = (colorA << 16) | product ; + product1 = (product1 << 16) | product2 ; +#else + product = colorA | (product << 16); + product1 = product1 | (product2 << 16); +#endif + *((int *) dP) = product; + *((sai_uint32 *) (dP + dstPitch)) = product1; + + bP += inc_bP; + dP += sizeof (sai_uint32); + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + deltaPtr += srcPitch; + } // endof: for (height; height; height--) + } +} + +void _2xSaI32 (sai_uint8 *srcPtr, sai_uint32 srcPitch, + sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height) +{ + sai_uint32 *dP; + sai_uint32 *bP; + sai_uint32 inc_bP = 1; + + sai_uint32 Nextline = srcPitch >> 2; + + for (; height; height--) { + bP = (sai_uint32 *) srcPtr; + dP = (sai_uint32 *) dstPtr; + + for (sai_uint32 finish = width; finish; finish -= inc_bP) { + register sai_uint32 colorA, colorB; + sai_uint32 colorC, colorD, + colorE, colorF, colorG, colorH, + colorI, colorJ, colorK, colorL, + + colorM, colorN, colorO, colorP; + sai_uint32 product, product1, product2; + + //--------------------------------------- + // Map of the pixels: I|E F|J + // G|A B|K + // H|C D|L + // M|N O|P + colorI = *(bP - Nextline - 1); + colorE = *(bP - Nextline); + colorF = *(bP - Nextline + 1); + colorJ = *(bP - Nextline + 2); + + colorG = *(bP - 1); + colorA = *(bP); + colorB = *(bP + 1); + colorK = *(bP + 2); + + colorH = *(bP + Nextline - 1); + colorC = *(bP + Nextline); + colorD = *(bP + Nextline + 1); + colorL = *(bP + Nextline + 2); + + colorM = *(bP + Nextline + Nextline - 1); + colorN = *(bP + Nextline + Nextline); + colorO = *(bP + Nextline + Nextline + 1); + colorP = *(bP + Nextline + Nextline + 2); + + if ((colorA == colorD) && (colorB != colorC)) { + if (((colorA == colorE) && (colorB == colorL)) || + ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ))) { + product = colorA; + } else { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorA == colorG) && (colorC == colorO)) || + ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM))) { + product1 = colorA; + } else { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorA; + } else if ((colorB == colorC) && (colorA != colorD)) { + if (((colorB == colorF) && (colorA == colorH)) || + ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI))) { + product = colorB; + } else { + product = INTERPOLATE (colorA, colorB); + } + + if (((colorC == colorH) && (colorA == colorF)) || + ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI))) { + product1 = colorC; + } else { + product1 = INTERPOLATE (colorA, colorC); + } + product2 = colorB; + } else if ((colorA == colorD) && (colorB == colorC)) { + if (colorA == colorB) { + product = colorA; + product1 = colorA; + product2 = colorA; + } else { + register int r = 0; + + product1 = INTERPOLATE (colorA, colorC); + product = INTERPOLATE (colorA, colorB); + + r += + GetResult1 (colorA, colorB, colorG, colorE, + colorI); + r += + GetResult2 (colorB, colorA, colorK, colorF, + colorJ); + r += + GetResult2 (colorB, colorA, colorH, colorN, + colorM); + r += + GetResult1 (colorA, colorB, colorL, colorO, + colorP); + + if (r > 0) + product2 = colorA; + else if (r < 0) + product2 = colorB; + else { + product2 = + Q_INTERPOLATE (colorA, colorB, colorC, + colorD); + } + } + } else { + product2 = Q_INTERPOLATE (colorA, colorB, colorC, colorD); + + if ((colorA == colorC) && (colorA == colorF) + && (colorB != colorE) && (colorB == colorJ)) { + product = colorA; + } else if ((colorB == colorE) && (colorB == colorD) + && (colorA != colorF) && (colorA == colorI)) { + product = colorB; + } else { + product = INTERPOLATE (colorA, colorB); + } + + if ((colorA == colorB) && (colorA == colorH) + && (colorG != colorC) && (colorC == colorM)) { + product1 = colorA; + } else if ((colorC == colorG) && (colorC == colorD) + && (colorA != colorH) && (colorA == colorI)) { + product1 = colorC; + } else { + product1 = INTERPOLATE (colorA, colorC); + } + } + *(dP) = colorA; + *(dP + 1) = product; + *(dP + (dstPitch >> 2)) = product1; + *(dP + (dstPitch >> 2) + 1) = product2; + + bP += inc_bP; + dP += 2; + } // end of for ( finish= width etc..) + + srcPtr += srcPitch; + dstPtr += dstPitch << 1; + // deltaPtr += srcPitch; + } // endof: for (height; height; height--) +} + +static sai_uint32 Bilinear (sai_uint32 A, sai_uint32 B, sai_uint32 x) +{ + unsigned long areaA, areaB; + unsigned long result; + + if (A == B) + return A; + + areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits + areaA = 0x20 - areaB; + + A = (A & redblueMask) | ((A & greenMask) << 16); + B = (B & redblueMask) | ((B & greenMask) << 16); + + result = ((areaA * A) + (areaB * B)) >> 5; + + return (result & redblueMask) | ((result >> 16) & greenMask); +} + +static sai_uint32 Bilinear4 (sai_uint32 A, sai_uint32 B, sai_uint32 C, sai_uint32 D, sai_uint32 x, + sai_uint32 y) +{ + unsigned long areaA, areaB, areaC, areaD; + unsigned long result, xy; + + x = (x >> 11) & 0x1f; + y = (y >> 11) & 0x1f; + xy = (x * y) >> 5; + + A = (A & redblueMask) | ((A & greenMask) << 16); + B = (B & redblueMask) | ((B & greenMask) << 16); + C = (C & redblueMask) | ((C & greenMask) << 16); + D = (D & redblueMask) | ((D & greenMask) << 16); + + areaA = 0x20 + xy - x - y; + areaB = x - xy; + areaC = y - xy; + areaD = xy; + + result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5; + + return (result & redblueMask) | ((result >> 16) & greenMask); +} + +void Scale_2xSaI (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 * /* deltaPtr */, + sai_uint8 *dstPtr, sai_uint32 dstPitch, + sai_uint32 dstWidth, sai_uint32 dstHeight, int width, int height) +{ + sai_uint8 *dP; + sai_uint16 *bP; + + sai_uint32 w; + sai_uint32 h; + sai_uint32 dw; + sai_uint32 dh; + sai_uint32 hfinish; + sai_uint32 wfinish; + + sai_uint32 Nextline = srcPitch >> 1; + + wfinish = (width - 1) << 16; // convert to fixed point + dw = wfinish / (dstWidth - 1); + hfinish = (height - 1) << 16; // convert to fixed point + dh = hfinish / (dstHeight - 1); + + for (h = 0; h < hfinish; h += dh) { + sai_uint32 y1, y2; + + y1 = h & 0xffff; // fraction part of fixed point + bP = (sai_uint16 *) (srcPtr + ((h >> 16) * srcPitch)); + dP = dstPtr; + y2 = 0x10000 - y1; + + w = 0; + + for (; w < wfinish;) { + sai_uint32 A, B, C, D; + sai_uint32 E, F, G, H; + sai_uint32 I, J, K, L; + sai_uint32 x1, x2, a1, f1, f2; + sai_uint32 position, product1; + + position = w >> 16; + A = bP[position]; // current pixel + B = bP[position + 1]; // next pixel + C = bP[position + Nextline]; + D = bP[position + Nextline + 1]; + E = bP[position - Nextline]; + F = bP[position - Nextline + 1]; + G = bP[position - 1]; + H = bP[position + Nextline - 1]; + I = bP[position + 2]; + J = bP[position + Nextline + 2]; + K = bP[position + Nextline + Nextline]; + L = bP[position + Nextline + Nextline + 1]; + + x1 = w & 0xffff; // fraction part of fixed point + x2 = 0x10000 - x1; + + /*0*/ + if (A == B && C == D && A == C) + product1 = A; + else /*1*/ if (A == D && B != C) { + f1 = (x1 >> 1) + (0x10000 >> 2); + f2 = (y1 >> 1) + (0x10000 >> 2); + if (y1 <= f1 && A == J && A != E) // close to B + { + a1 = f1 - y1; + product1 = Bilinear (A, B, a1); + } else if (y1 >= f1 && A == G && A != L) // close to C + { + a1 = y1 - f1; + product1 = Bilinear (A, C, a1); + } + else if (x1 >= f2 && A == E && A != J) // close to B + { + a1 = x1 - f2; + product1 = Bilinear (A, B, a1); + } + else if (x1 <= f2 && A == L && A != G) // close to C + { + a1 = f2 - x1; + product1 = Bilinear (A, C, a1); + } + else if (y1 >= x1) // close to C + { + a1 = y1 - x1; + product1 = Bilinear (A, C, a1); + } + else if (y1 <= x1) // close to B + { + a1 = x1 - y1; + product1 = Bilinear (A, B, a1); + } + } + else + /*2*/ + if (B == C && A != D) + { + f1 = (x1 >> 1) + (0x10000 >> 2); + f2 = (y1 >> 1) + (0x10000 >> 2); + if (y2 >= f1 && B == H && B != F) // close to A + { + a1 = y2 - f1; + product1 = Bilinear (B, A, a1); + } + else if (y2 <= f1 && B == I && B != K) // close to D + { + a1 = f1 - y2; + product1 = Bilinear (B, D, a1); + } + else if (x2 >= f2 && B == F && B != H) // close to A + { + a1 = x2 - f2; + product1 = Bilinear (B, A, a1); + } + else if (x2 <= f2 && B == K && B != I) // close to D + { + a1 = f2 - x2; + product1 = Bilinear (B, D, a1); + } + else if (y2 >= x1) // close to A + { + a1 = y2 - x1; + product1 = Bilinear (B, A, a1); + } + else if (y2 <= x1) // close to D + { + a1 = x1 - y2; + product1 = Bilinear (B, D, a1); + } + } + /*3*/ + else + { + product1 = Bilinear4 (A, B, C, D, x1, y1); + } + + //end First Pixel + *(sai_uint32 *) dP = product1; + dP += 2; + w += dw; + } + dstPtr += dstPitch; + } +} +/* +int Init_2xSaI(sai_uint32 BitFormat) { + // Store some stuff +// push ebp +// mov ebp, esp +// push edx + + __asm__ __volatile__( + //"movq 0(%1), %%mm0\n" + "mov eax, (%1)\n" //PixelFormat + "cmp eax, 555\n" + "jz Bits555\n" + "cmp eax, 565\n" + "jz Bits565\n" +"end2:\n" + "mov eax, 1\n" + "jmp end3\n" +"Bits555:\n" + "mov edx, 0x7BDE7BDE\n" + "mov eax, colorMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov edx, 0x04210421\n" + "mov eax, lowPixelMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov edx, 0x739C739C\n" + "mov eax, qcolorMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov edx, 0x0C630C63\n" + "mov eax, qlowpixelMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov eax, 0\n" + "jmp end3\n" +"Bits565:\n" + "mov edx, 0xF7DEF7DE\n" + "mov eax, colorMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov edx, 0x08210821\n" + "mov eax, lowPixelMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov edx, 0xE79CE79C\n" + "mov eax, qcolorMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov edx, 0x18631863\n" + "mov eax, qlowpixelMask\n" + "mov [eax], edx\n" + "mov [eax+4], edx\n" + "mov eax, 0\n" + "jmp end3\n" +"end3:\n" +// "pop edx\n" +// "mov esp, ebp\n" +// "pop ebp\n" +// "ret\n" + : "+r" (BitFormat) + : + : "cc" + ); +}*/ diff --git a/Mednafen/mednafen/drivers/2xSaI.h b/Mednafen/mednafen/drivers/2xSaI.h new file mode 100644 index 0000000000..0075ec14a3 --- /dev/null +++ b/Mednafen/mednafen/drivers/2xSaI.h @@ -0,0 +1,51 @@ +/* 2xSaI + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* http://lists.fedoraproject.org/pipermail/legal/2009-October/000928.html */ + +//#include "main.h" + +//#if defined(__GNUC__) && defined(__i386__) +// #define 2XSAI_MMX 1 +//#else +// #undef 2XSAI_MMX +//#endif + +#ifndef __2XSAI_H +#define __2XSAI_H + +typedef unsigned char sai_uint8; +typedef unsigned short sai_uint16; +typedef unsigned sai_uint32; + +//#define BLUE_MASK565 0x001F001F +//#define RED_MASK565 0xF800F800 +//#define GREEN_MASK565 0x07E007E0 + +//#define BLUE_MASK555 0x001F001F +//#define RED_MASK555 0x7C007C00 +//#define GREEN_MASK555 0x03E003E0 + +int Init_2xSaI(sai_uint32 systemColorDepth, sai_uint32 BitFormat); +void Super2xSaI (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *deltaPtr, sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height); +void Super2xSaI32 (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height); +void SuperEagle (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *deltaPtr, sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height); +void SuperEagle32 (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height); +void _2xSaI (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *deltaPtr, sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height); +void _2xSaI32 (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 *dstPtr, sai_uint32 dstPitch, int width, int height); +void Scale_2xSaI (sai_uint8 *srcPtr, sai_uint32 srcPitch, sai_uint8 * /* deltaPtr */, sai_uint8 *dstPtr, sai_uint32 dstPitch, sai_uint32 dstWidth, sai_uint32 dstHeight, int width, int height); + +#endif diff --git a/Mednafen/mednafen/drivers/Joystick.cpp b/Mednafen/mednafen/drivers/Joystick.cpp new file mode 100644 index 0000000000..2732f591be --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick.cpp @@ -0,0 +1,599 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + The joystick driver configuration priority system should be considered as last-resort protection for multiple-API platforms(such as DirectInput + XInput on Windows), in the + event that all reasonable attempts at preventing the same physical device from being opened via multiple APIs fail. (The configuration priority system generally should + work ok as long as the user isn't extremely unlucky, doesn't try to configure too quickly(or too slowly ;)), and the controller is well-behaved; but it is still + inherently race-conditiony). +*/ +#include "main.h" +#include "input.h" +#include +#include + +#include "Joystick.h" + +#ifdef HAVE_SDL + #include "Joystick_SDL.h" +#endif + +#ifdef HAVE_LINUX_JOYSTICK + #include "Joystick_Linux.h" +#endif + +#ifdef WIN32 + #include "Joystick_DX5.h" + #include "Joystick_XInput.h" +#endif + +#ifdef DOS + #include "Joystick_DOS_Standard.h" + //#include "Joystick_DOS_SideWinder.h" +#endif + +Joystick::Joystick() : num_axes(0), num_rel_axes(0), num_buttons(0), id(0) +{ + name[0] = 0; +} + +Joystick::~Joystick() +{ + +} + +void Joystick::CalcOldStyleID(unsigned arg_num_axes, unsigned arg_num_balls, unsigned arg_num_hats, unsigned arg_num_buttons) +{ + uint8 digest[16]; + int tohash[4]; + md5_context hashie; + uint64 ret = 0; + + //printf("%u %u %u %u\n", arg_num_axes, arg_num_balls, arg_num_hats, arg_num_buttons); + + tohash[0] = arg_num_axes; + tohash[1] = arg_num_balls; + tohash[2] = arg_num_hats; + tohash[3] = arg_num_buttons; + + hashie.starts(); + hashie.update((uint8 *)tohash, sizeof(tohash)); + hashie.finish(digest); + + for(int x = 0; x < 16; x++) + { + ret ^= (uint64)digest[x] << ((x & 7) * 8); + } + + id = ret; +} + +void Joystick::SetRumble(uint8 weak_intensity, uint8 strong_intensity) +{ + + +} + +bool Joystick::IsAxisButton(unsigned axis) +{ + return(false); +} + +unsigned Joystick::HatToAxisCompat(unsigned hat) +{ + return(~0U); +} + +unsigned Joystick::HatToButtonCompat(unsigned hat) +{ + return(~0U); +} + +JoystickDriver::JoystickDriver() +{ + +} + +JoystickDriver::~JoystickDriver() +{ + +} + +unsigned JoystickDriver::NumJoysticks() +{ + return 0; +} + +Joystick *JoystickDriver::GetJoystick(unsigned index) +{ + return NULL; +} + +void JoystickDriver::UpdateJoysticks(void) +{ + +} + +JoystickManager::JoystickManager() +{ + JoystickDriver *main_driver = NULL; + JoystickDriver *hicp_driver = NULL; + + MDFNI_printf(_("Initializing joysticks...\n")); + MDFN_indent(1); + +#if 0 && defined(WIN32) + { + JoystickDriver *dx5_driver = JoystickDriver_DX5_New(false); + JoystickDriver *dx8_driver = JoystickDriver_DX8_New(false); + + while(1) + { + dx5_driver->UpdateJoysticks(); + dx8_driver->UpdateJoysticks(); + + + } + } +#endif + + try + { + #ifdef HAVE_LINUX_JOYSTICK + main_driver = JoystickDriver_Linux_New(); + #elif defined(WIN32) + { + hicp_driver = JoystickDriver_XInput_New(); + main_driver = JoystickDriver_DX5_New(hicp_driver != NULL && hicp_driver->NumJoysticks() > 0); + } + #elif defined(HAVE_SDL) + main_driver = JoystickDriver_SDL_New(); + #endif + + if(hicp_driver != NULL) + { + JoystickDrivers.push_back(hicp_driver); + } + + if(main_driver != NULL) + { + JoystickDrivers.push_back(main_driver); + } + + for(unsigned jd = 0; jd < JoystickDrivers.size(); jd++) + { + for(unsigned i = 0; i < JoystickDrivers[jd]->NumJoysticks(); i++) + { + JoystickManager_Cache ce; + + ce.joystick = JoystickDrivers[jd]->GetJoystick(i); + ce.UniqueID = ce.joystick->ID(); + ce.config_prio = (JoystickDrivers[jd] == hicp_driver) ? 1 : 0; + + TryAgain: + for(unsigned nji = 0; nji < JoystickCache.size(); nji++) + { + if(JoystickCache[nji].UniqueID == ce.UniqueID) + { + ce.UniqueID++; + goto TryAgain; + } + } + + MDFN_printf(_("Joystick %u - %s - Unique ID: %016llx\n"), (unsigned)JoystickCache.size(), ce.joystick->Name(), (unsigned long long)ce.UniqueID); + + ce.axis_config_type.resize(ce.joystick->NumAxes()); + ce.prev_state_valid = false; + ce.prev_axis_state.resize(ce.joystick->NumAxes()); + ce.axis_hysterical_ax_murderer.resize(ce.joystick->NumAxes()); + ce.prev_button_state.resize(ce.joystick->NumButtons()); + ce.rel_axis_accum_state.resize(ce.joystick->NumRelAxes()); + + JoystickCache.push_back(ce); + } + } + + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + if(main_driver != NULL) + { + delete main_driver; + main_driver = NULL; + } + if(hicp_driver != NULL) + { + delete hicp_driver; + hicp_driver = NULL; + } + } + MDFN_indent(-1); +} + +void JoystickManager::SetAnalogThreshold(double thresh) +{ + AnalogThreshold = thresh * 32767; +} + +JoystickManager::~JoystickManager() +{ + for(unsigned i = 0; i < JoystickDrivers.size(); i++) + delete JoystickDrivers[i]; +} + +unsigned JoystickManager::DetectAnalogButtonsForChangeCheck(void) +{ + unsigned ret = 0; + + for(unsigned i = 0; i < JoystickCache.size(); i++) + { + for(unsigned axis = 0; axis < JoystickCache[i].joystick->NumAxes(); axis++) + { + JoystickCache[i].axis_config_type[axis] = JoystickManager_Cache::AXIS_CONFIG_TYPE_GENERIC; + + if(JoystickCache[i].joystick->IsAxisButton(axis)) + ret++; + else + { + int pos = JoystickCache[i].joystick->GetAxis(axis); + + if(abs(pos) >= 31000) + { + if(pos < 0) + JoystickCache[i].axis_config_type[axis] = JoystickManager_Cache::AXIS_CONFIG_TYPE_ANABUTTON_POSPRESS; + else + JoystickCache[i].axis_config_type[axis] = JoystickManager_Cache::AXIS_CONFIG_TYPE_ANABUTTON_NEGPRESS; + + printf("SPOON -- joystick=%u, axis=%u, type=%u\n", i, axis, JoystickCache[i].axis_config_type[axis]); + ret++; + } + } + } + } + return ret; +} + +void JoystickManager::Reset_BC_ChangeCheck(void) +{ + for(unsigned i = 0; i < JoystickCache.size(); i++) + JoystickCache[i].prev_state_valid = false; + + memset(&BCPending, 0, sizeof(BCPending)); + BCPending.ButtType = BUTTC_NONE; + BCPending_Prio = -1; + BCPending_CCCC = 0; +} + +bool JoystickManager::Do_BC_ChangeCheck(ButtConfig *bc) //, bool hint_analog) +{ + if(BCPending.ButtType != BUTTC_NONE) + { + if((BCPending_Time + 150) <= MDFND_GetTime() && BCPending_CCCC >= 5) //(int32)(MDFND_GetTime() - BCPending_Time) >= 150) + { + *bc = BCPending; + BCPending.ButtType = BUTTC_NONE; + BCPending_Prio = -1; + BCPending_CCCC = 0; + return(true); + } + + int SaveAT = AnalogThreshold; // Begin Kludge + AnalogThreshold = ((JoystickCache[BCPending.DeviceNum].config_prio > 0) ? 25000 : 26000); + if(!TestButton(BCPending)) + { + BCPending.ButtType = BUTTC_NONE; + BCPending_Prio = -1; + BCPending_CCCC = 0; + } + else + BCPending_CCCC++; + AnalogThreshold = SaveAT; // End Kludge. + } + + for(unsigned i = 0; i < JoystickCache.size(); i++) + { + JoystickManager_Cache *const jsc = &JoystickCache[i]; + Joystick *const js = jsc->joystick; + const int ana_low_thresh = ((jsc->config_prio > 0) ? 6000 : 5000); + const int ana_high_thresh = ((jsc->config_prio > 0) ? 25000 : 26000); + + // Search buttons first, then axes? + for(unsigned button = 0; button < js->NumButtons(); button++) + { + bool button_state = js->GetButton(button); + + if(jsc->prev_state_valid && (button_state != jsc->prev_button_state[button]) && button_state) + { + ButtConfig bctmp; + + bctmp.ButtType = BUTTC_JOYSTICK; + bctmp.DeviceNum = i; + bctmp.ButtonNum = button; + bctmp.DeviceID = jsc->UniqueID; + + if(jsc->config_prio >= 0 && (jsc->config_prio > BCPending_Prio || 0)) // TODO: add axis/button priority logic(replace || 0) for gamepads that send axis and button events for analog button presses. + { + BCPending = bctmp; + BCPending_Prio = jsc->config_prio; + BCPending_Time = MDFND_GetTime(); + BCPending_CCCC = 0; + } + } + jsc->prev_button_state[button] = button_state; + } + + for(unsigned axis = 0; axis < js->NumAxes(); axis++) + { + int16 axis_state = js->GetAxis(axis); + + if(jsc->axis_config_type[axis] == JoystickManager_Cache::AXIS_CONFIG_TYPE_ANABUTTON_POSPRESS) + { + if(axis_state < -32767) + axis_state = -32767; + + axis_state = (axis_state + 32767) >> 1; + //printf("%u: %u\n", axis, axis_state); + } + else if(jsc->axis_config_type[axis] == JoystickManager_Cache::AXIS_CONFIG_TYPE_ANABUTTON_NEGPRESS) + { + if(axis_state < -32767) + axis_state = -32767; + + axis_state = -axis_state; + + axis_state = (axis_state + 32767) >> 1; + //printf("%u: %u\n", axis, axis_state); + } + + if(jsc->prev_state_valid) + { + if(jsc->axis_hysterical_ax_murderer[axis] && abs(axis_state) >= ana_high_thresh) + { + ButtConfig bctmp; + + bctmp.ButtType = BUTTC_JOYSTICK; + bctmp.DeviceNum = i; + + if(jsc->axis_config_type[axis] == JoystickManager_Cache::AXIS_CONFIG_TYPE_ANABUTTON_POSPRESS) + bctmp.ButtonNum = (1 << 16) | axis; + else if(jsc->axis_config_type[axis] == JoystickManager_Cache::AXIS_CONFIG_TYPE_ANABUTTON_NEGPRESS) + bctmp.ButtonNum = (1 << 16) | (1 << 17) | axis; + else + bctmp.ButtonNum = 0x8000 | axis | ((axis_state < 0) ? 0x4000 : 0); + + bctmp.DeviceID = jsc->UniqueID; + + if(jsc->config_prio >= 0 && (jsc->config_prio > BCPending_Prio || 0)) // TODO: add axis/button priority logic(replace || 0) for gamepads that send axis and button events for analog button presses. + { + BCPending = bctmp; + BCPending_Prio = jsc->config_prio; + BCPending_Time = MDFND_GetTime(); + BCPending_CCCC = 0; + } + } + else if(!jsc->axis_hysterical_ax_murderer[axis] && abs(axis_state) < ana_low_thresh) + { + jsc->axis_hysterical_ax_murderer[axis] = 1; + } + } + else + { + if(abs(axis_state) >= ana_low_thresh) + jsc->axis_hysterical_ax_murderer[axis] = 0; + else + jsc->axis_hysterical_ax_murderer[axis] = 1; + } + + jsc->prev_axis_state[axis] = axis_state; + } + // + // + jsc->prev_state_valid = true; + } + + return(false); +} + +void JoystickManager::SetRumble(const std::vector &bc, uint8 weak_intensity, uint8 strong_intensity) +{ + for(unsigned i = 0; i < bc.size(); i++) + { + if(bc[i].ButtType != BUTTC_JOYSTICK) + continue; + + if(bc[i].DeviceNum >= JoystickCache.size()) + continue; + + Joystick *joy = JoystickCache[bc[i].DeviceNum].joystick; + joy->SetRumble(weak_intensity, strong_intensity); + } +} + +void JoystickManager::TestRumble(void) +{ + uint8 weak, strong; + //uint32 cur_time = MDFND_GetTime(); + + strong = 255; + weak = 0; + for(unsigned i = 0; i < JoystickCache.size(); i++) + { + Joystick *joy = JoystickCache[i].joystick; + joy->SetRumble(weak, strong); + } +} + +void JoystickManager::UpdateJoysticks(void) +{ + //TestRumble(); + for(unsigned i = 0; i < JoystickDrivers.size(); i++) + { + JoystickDrivers[i]->UpdateJoysticks(); + } +} + +bool JoystickManager::TestButton(const ButtConfig &bc) +{ + if(bc.DeviceNum >= JoystickCache.size()) + return(0); + + //printf("%u\n", AnalogThreshold); + + Joystick *joy = JoystickCache[bc.DeviceNum].joystick; + + if(bc.ButtonNum & (0x8000 | 0x2000)) /* Axis "button" (| 0x2000 for backwards-compat hat translation)*/ + { + bool neg_req = (bool)(bc.ButtonNum & 0x4000); + unsigned axis = bc.ButtonNum & 0x3FFF; + int pos; + + if(bc.ButtonNum & 0x2000) + { + axis = joy->HatToAxisCompat((bc.ButtonNum >> 8) & 0x1F); + if(axis == ~0U) // Not-implemented case. See if implemented for buttons. + { + unsigned button = joy->HatToButtonCompat((bc.ButtonNum >> 8) & 0x1F); + + if(button != ~0U) + { + button += uilog2(bc.ButtonNum & 0xF); + + if(button >= joy->NumButtons()) + return(0); + + return joy->GetButton(button); + } + return(0); + } + + if(bc.ButtonNum & 0x05) + axis++; + + neg_req = bc.ButtonNum & 0x09; + } + + if(axis >= joy->NumAxes()) + return(0); + + pos = joy->GetAxis(axis); + + if(neg_req && (pos <= -AnalogThreshold)) + return(1); + else if(!neg_req && (pos >= AnalogThreshold)) + return(1); + } + else if(bc.ButtonNum & (1 << 16)) // Analog button axis. + { + unsigned axis = bc.ButtonNum & 0x3FFF; + int pos; + + if(axis >= joy->NumAxes()) + return(0); + + pos = joy->GetAxis(axis); + if(pos < -32767) + pos = -32767; + + if(bc.ButtonNum & (1 << 17)) + pos = -pos; + + pos += 32767; + pos >>= 1; + + if(pos >= AnalogThreshold) + return(1); + } + else + { + unsigned button = bc.ButtonNum; + + if(button >= joy->NumButtons()) + return(0); + + return joy->GetButton(button); + } + + return(0); +} + +int JoystickManager::TestAnalogButton(const ButtConfig &bc) +{ + if(bc.DeviceNum >= JoystickCache.size()) + return(0); + + Joystick *joy = JoystickCache[bc.DeviceNum].joystick; + + if(bc.ButtonNum & 0x8000) /* Axis "button" */ + { + unsigned axis = bc.ButtonNum & 0x3FFF; + int pos; + + if(axis >= joy->NumAxes()) + return(0); + pos = joy->GetAxis(axis); + + if((bc.ButtonNum & 0x4000) && pos < 0) + return(std::min(-pos, 32767)); + else if (!(bc.ButtonNum & 0x4000) && pos > 0) + return(pos); + } + else if(bc.ButtonNum & (1 << 16)) // Analog button axis. + { + unsigned axis = bc.ButtonNum & 0x3FFF; + int pos; + + if(axis >= joy->NumAxes()) + return(0); + + pos = joy->GetAxis(axis); + if(pos < -32767) + pos = -32767; + + if(bc.ButtonNum & (1 << 17)) + pos = -pos; + + pos += 32767; + pos >>= 1; + + return(pos); + } + else + { + return(TestButton(bc) ? 32767 : 0); + } + + return(0); +} + +unsigned JoystickManager::GetIndexByUniqueID(uint64 unique_id) +{ + for(unsigned i = 0; i < JoystickCache.size(); i++) + { + if(JoystickCache[i].UniqueID == unique_id) + { + //printf("%16llx %u\n", unique_id, i); + return(i); + } + } + + return(~0U); +} + +unsigned JoystickManager::GetUniqueIDByIndex(unsigned index) +{ + return JoystickCache[index].UniqueID; +} diff --git a/Mednafen/mednafen/drivers/Joystick.h b/Mednafen/mednafen/drivers/Joystick.h new file mode 100644 index 0000000000..ce63231bc0 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick.h @@ -0,0 +1,118 @@ +#ifndef __MDFN_DRIVERS_N_JOYSTICK_H +#define __MDFN_DRIVERS_N_JOYSTICK_H + +#include +#include +#include + +class Joystick +{ + public: + + Joystick(); + virtual ~Joystick(); + + INLINE uint64 ID(void) { return id; } // Should be guaranteed unique if at all possible, but if it's not, JoystickManager will handle clashes. + INLINE const char *Name(void) { return name; } + INLINE unsigned NumAxes(void) { return num_axes; } + INLINE unsigned NumRelAxes(void) { return num_rel_axes; } + INLINE unsigned NumButtons(void) { return num_buttons; } + + INLINE int16 GetAxis(unsigned axis) { return axis_state[axis]; } // return value should be -32767 through 32767 for stick-type axes, and 0 through 32767 + // for analog buttons(if that information is even available, which it is commonly not). + // If an axis is an analog button and the value returned will be 0 through 32767, then you must + // also implement the IsAxisButton() method. + INLINE int GetRelAxis(unsigned rel_axis) { return rel_axis_state[rel_axis]; } + INLINE bool GetButton(unsigned button) { return button_state[button]; } + + virtual bool IsAxisButton(unsigned axis); + virtual void SetRumble(uint8 weak_intensity, uint8 strong_intensity); + virtual unsigned HatToAxisCompat(unsigned hat); + virtual unsigned HatToButtonCompat(unsigned hat); + + protected: + + void CalcOldStyleID(unsigned num_axes, unsigned num_balls, unsigned num_hats, unsigned num_buttons); + + char name[256]; + unsigned num_axes; + unsigned num_rel_axes; + unsigned num_buttons; + uint64 id; + + std::vector axis_state; + std::vector rel_axis_state; + std::vector button_state; +}; + + +class JoystickDriver +{ + public: + + JoystickDriver(); + virtual ~JoystickDriver(); + + virtual unsigned NumJoysticks(); // Cached internally on JoystickDriver instantiation. + virtual Joystick *GetJoystick(unsigned index); + virtual void UpdateJoysticks(void); +}; + +struct JoystickManager_Cache +{ + Joystick *joystick; + uint64 UniqueID; + + enum + { + AXIS_CONFIG_TYPE_GENERIC = 0, + AXIS_CONFIG_TYPE_ANABUTTON_POSPRESS, + AXIS_CONFIG_TYPE_ANABUTTON_NEGPRESS + }; + + // Helpers for input configuration(may have semantics that differ from what the names would suggest)! + int config_prio; // Set to -1 to exclude this joystick instance from configuration, 0 is normal, 1 is SPECIALSAUCEWITHBACON. + std::vector axis_config_type; + bool prev_state_valid; + std::vector prev_axis_state; + std::vector axis_hysterical_ax_murderer; + std::vector prev_button_state; + std::vector rel_axis_accum_state; +}; + +class JoystickManager +{ + public: + + JoystickManager(); + ~JoystickManager(); + + unsigned DetectAnalogButtonsForChangeCheck(void); + void Reset_BC_ChangeCheck(void); + bool Do_BC_ChangeCheck(ButtConfig *bc); // TODO: , bool hint_analog); // hint_analog = true if the emulated button is an analog button/axis/whatever, false if it's digital(binary 0/1). + // affects sort order if multiple events come in during the debouncey time period. + void SetAnalogThreshold(double thresh); // 0.0..-1.0... + + void UpdateJoysticks(void); + + void SetRumble(const std::vector &bc, uint8 weak_intensity, uint8 strong_intensity); + bool TestButton(const ButtConfig &bc); + int TestAnalogButton(const ButtConfig &bc); + + unsigned GetIndexByUniqueID(uint64 unique_id); // Returns ~0U if joystick was not found. + unsigned GetUniqueIDByIndex(unsigned index); + + void TestRumble(void); + + private: + int AnalogThreshold; + + std::vector JoystickDrivers; + std::vector JoystickCache; + ButtConfig BCPending; + int BCPending_Prio; + uint32 BCPending_Time; + uint32 BCPending_CCCC; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/Joystick_DX5.cpp b/Mednafen/mednafen/drivers/Joystick_DX5.cpp new file mode 100644 index 0000000000..4f4855ca51 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_DX5.cpp @@ -0,0 +1,431 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "input.h" +#include "Joystick.h" +#include "Joystick_DX5.h" + +#define DIRECTINPUT_VERSION 0x0500 +#include +#include +#include + +#include +#include + +struct di_axis_info +{ + int32 minimum, maximum; + uint32 jd_logical_offset; +}; + +class Joystick_DX5 : public Joystick +{ + public: + + Joystick_DX5(LPDIRECTINPUT dii, DIDEVICEINSTANCE *ddi); + virtual ~Joystick_DX5(); + virtual unsigned HatToAxisCompat(unsigned hat); + virtual void SetRumble(uint8 weak_intensity, uint8 strong_intensity); + + void UpdateInternal(void); + + private: + LPDIRECTINPUTDEVICE2 dev; + DIDEVCAPS DevCaps; + std::vector DIAxisInfo; + int have_exclusive_access; + void RequestExclusive(bool value); +}; + +#define REQUIRE_DI_CALL(code) { HRESULT hres = (code); if(hres != DI_OK) { throw MDFN_Error(0, "\"" #code "\"" "failed: %u", (unsigned)hres); } } + +void Joystick_DX5::RequestExclusive(bool value) +{ + if(value != have_exclusive_access) + { + if(value && SUCCEEDED(dev->SetCooperativeLevel(GetDesktopWindow(), DISCL_BACKGROUND | DISCL_EXCLUSIVE)) && SUCCEEDED(dev->Acquire())) + have_exclusive_access = true; + else + { + have_exclusive_access = false; + dev->SetCooperativeLevel(GetDesktopWindow(), DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); + dev->Acquire(); + } + } +} + +Joystick_DX5::Joystick_DX5(LPDIRECTINPUT dii, DIDEVICEINSTANCE *ddi) : dev(NULL), have_exclusive_access(-1) +{ + LPDIRECTINPUTDEVICE tmp_dev = NULL; + + try + { + REQUIRE_DI_CALL( dii->CreateDevice(ddi->guidInstance, &tmp_dev, NULL) ); + REQUIRE_DI_CALL( tmp_dev->QueryInterface(IID_IDirectInputDevice2, (LPVOID *)&dev) ); + REQUIRE_DI_CALL( dev->SetDataFormat(&c_dfDIJoystick2) ); + DevCaps.dwSize = sizeof(DevCaps); + REQUIRE_DI_CALL( dev->GetCapabilities(&DevCaps) ); + + for(unsigned rax = 0; rax < 8; rax++) + { + DIPROPRANGE diprg; + HRESULT hres; + + diprg.diph.dwSize = sizeof(diprg); + diprg.diph.dwHeaderSize = sizeof(diprg.diph); + diprg.diph.dwObj = rax * sizeof(LONG); + diprg.diph.dwHow = DIPH_BYOFFSET; + + // TODO: Handle DIPROPRANGE_NOMIN and DIPROPRANGE_NOMAX + hres = dev->GetProperty(DIPROP_RANGE, &diprg.diph); + if(hres == DI_OK) + { + if(diprg.lMin < diprg.lMax) + { + di_axis_info dai; + + dai.jd_logical_offset = rax; + dai.minimum = diprg.lMin; + dai.maximum = diprg.lMax; + + DIAxisInfo.push_back(dai); + } + } + //else if(hres != DIERR_OBJECTNOTFOUND) + } + + num_rel_axes = 0; + num_axes = DIAxisInfo.size() + DevCaps.dwPOVs * 2; + num_buttons = DevCaps.dwButtons; + axis_state.resize(num_axes); + rel_axis_state.resize(num_rel_axes); + button_state.resize(num_buttons); + // id, guidinstance, etc. + + // + // + // +#if 0 + { + DIEFFECTINFO eff_inf; + + eff_inf.dwSize = sizeof(eff_inf); + if(dev->GetEffectInfo(&eff_inf, GUID_Square) == DI_OK || dev->GetEffectInfo(&eff_inf, GUID_Sine) == DI_OK) + { + + } + } +#endif + RequestExclusive(false); + + CalcOldStyleID(DIAxisInfo.size(), 0, DevCaps.dwPOVs, DevCaps.dwButtons); + snprintf(name, sizeof(name), "%s", ddi->tszProductName); + } + catch(...) + { + if(tmp_dev != NULL) + tmp_dev->Release(); + + if(dev != NULL) + dev->Release(); + + throw; + } +} + +Joystick_DX5::~Joystick_DX5() +{ + if(dev != NULL) + { + dev->Unacquire(); + dev->Release(); + dev = NULL; + } +} + +unsigned Joystick_DX5::HatToAxisCompat(unsigned hat) +{ + return(DIAxisInfo.size() + (hat * 2)); +} + +// TODO: RequestExclusive(false) when SetRumble() hasn't been called for several seconds. +void Joystick_DX5::UpdateInternal(void) +{ + DIJOYSTATE2 js; + HRESULT hres; + + if(DevCaps.dwFlags & (DIDC_POLLEDDEVICE | DIDC_POLLEDDATAFORMAT)) + { + do { /* */ hres = dev->Poll(); /* */ } while((hres == DIERR_INPUTLOST) && ((hres = dev->Acquire()) == DI_OK)); + if(hres != DI_OK) + return; + } + + do { /* */ hres = dev->GetDeviceState(sizeof(js), &js); /* */ } while((hres == DIERR_INPUTLOST) && ((hres = dev->Acquire()) == DI_OK)); + if(hres != DI_OK) + return; + + for(unsigned button = 0; button < DevCaps.dwButtons; button++) + { + button_state[button] = (bool)(js.rgbButtons[button] & 0x80); + } + + for(unsigned axis = 0; axis < DIAxisInfo.size(); axis++) + { + int64 rv = (&js.lX)[DIAxisInfo[axis].jd_logical_offset]; + + rv = (((rv - DIAxisInfo[axis].minimum) * 32767 * 2) / (DIAxisInfo[axis].maximum - DIAxisInfo[axis].minimum)) - 32767; + if(rv < -32767) + rv = -32767; + + if(rv > 32767) + rv = 32767; + axis_state[axis] = rv; + } + + for(unsigned hat = 0; hat < DevCaps.dwPOVs; hat++) + { + DWORD hat_val = js.rgdwPOV[hat]; + + //if((uint16)hat_val == 0xFFFF) // Reportedly some drivers report 0xFFFF instead of 0xFFFFFFFF? (comment from byuu) + if(hat_val >= 36000) + { + axis_state[(DIAxisInfo.size() + hat * 2) + 0] = 0; + axis_state[(DIAxisInfo.size() + hat * 2) + 1] = 0; + } + else + { + int32 x, y; + + //axis_state[(DIAxisInfo.size() + hat * 2) + 0] = 32767 * sin((double)M_PI * 2 * hat_val / 36000); // x + //axis_state[(DIAxisInfo.size() + hat * 2) + 1] = 32767 * -cos((double)M_PI * 2 * hat_val / 36000); // y + unsigned octant = (hat_val / 4500) & 0x7; + signed octant_doff = hat_val % 4500; + + switch(octant) + { + case 0: x = octant_doff * 32767 / 4500; y = -32767; break; + case 1: x = 32767; y = (-4500 + octant_doff) * 32767 / 4500; break; + + case 2: x = 32767; y = octant_doff * 32767 / 4500; break; + case 3: x = (4500 - octant_doff) * 32767 / 4500; y = 32767; break; + + case 4: x = (-octant_doff) * 32767 / 4500; y = 32767; break; + case 5: x = -32767; y = (4500 - octant_doff) * 32767 / 4500; break; + + case 6: x = -32767; y = (-octant_doff) * 32767 / 4500; break; + case 7: x = (-4500 + octant_doff) * 32767 / 4500; y = -32767; break; + } + + axis_state[(DIAxisInfo.size() + hat * 2) + 0] = x; + axis_state[(DIAxisInfo.size() + hat * 2) + 1] = y; + } + } +} + +void Joystick_DX5::SetRumble(uint8 weak_intensity, uint8 strong_intensity) +{ + //if((weak_intensity || strong_intensity) && rumble_supported) + // RequestExclusive(true); +} + +class JoystickDriver_DX5 : public JoystickDriver +{ + public: + + JoystickDriver_DX5(bool exclude_xinput); + virtual ~JoystickDriver_DX5(); + + virtual unsigned NumJoysticks(); // Cached internally on JoystickDriver instantiation. + virtual Joystick *GetJoystick(unsigned index); + virtual void UpdateJoysticks(void); + + private: + std::vector joys; + LPDIRECTINPUT dii; +}; + + +static INLINE std::set GetXInputVidPid(void) +{ + HMODULE us32 = NULL; + UINT WINAPI (*p_GetRawInputDeviceList)(PRAWINPUTDEVICELIST, PUINT, UINT) = NULL; + UINT WINAPI (*p_GetRawInputDeviceInfo)(HANDLE, UINT, LPVOID, PUINT) = NULL; + std::set exclude_vps; + + if((us32 = LoadLibrary("user32.dll")) == NULL) + return exclude_vps; + + p_GetRawInputDeviceList = (UINT WINAPI (*)(PRAWINPUTDEVICELIST, PUINT, UINT))GetProcAddress(us32, "GetRawInputDeviceList"); + p_GetRawInputDeviceInfo = (UINT WINAPI (*)(HANDLE, UINT, LPVOID, PUINT))GetProcAddress(us32, "GetRawInputDeviceInfoA"); + + if(p_GetRawInputDeviceList && p_GetRawInputDeviceInfo) + { + std::vector ridl; + unsigned int alloc_num_devices = 0; + unsigned int num_devices = 0; + + p_GetRawInputDeviceList(NULL, &alloc_num_devices, sizeof(RAWINPUTDEVICELIST)); + ridl.resize(alloc_num_devices); + + if((num_devices = p_GetRawInputDeviceList(&ridl[0], &alloc_num_devices, sizeof(RAWINPUTDEVICELIST))) > 0) + { + for(unsigned i = 0; i < num_devices; i++) + { + if(ridl[i].dwType != RIM_TYPEHID) + continue; + + RID_DEVICE_INFO devinfo; + std::vector devname; + unsigned int sizepar; + + memset(&devinfo, 0, sizeof(devinfo)); + devinfo.cbSize = sizeof(RID_DEVICE_INFO); + sizepar = sizeof(RID_DEVICE_INFO); + if(p_GetRawInputDeviceInfo(ridl[i].hDevice, RIDI_DEVICEINFO, &devinfo, &sizepar) != sizeof(RID_DEVICE_INFO)) + continue; + + sizepar = 0; + p_GetRawInputDeviceInfo(ridl[i].hDevice, RIDI_DEVICENAME, NULL, &sizepar); + devname.resize(sizepar + 1); + p_GetRawInputDeviceInfo(ridl[i].hDevice, RIDI_DEVICENAME, &devname[0], &sizepar); + + //printf("MOOCOW: %s\n", devname); + if(!strncmp(&devname[0], "IG_", 3) || strstr(&devname[0], "&IG_") != NULL) + { + exclude_vps.insert(MAKELONG(devinfo.hid.dwVendorId, devinfo.hid.dwProductId)); + } + } + } + } + + FreeLibrary(us32); + + return exclude_vps; +} + + +struct enum_device_list +{ + enum_device_list() : valid_count(0) { ddi.resize(max_count); } + static const unsigned max_count = 256; + std::vector ddi; + unsigned valid_count; +}; + +static BOOL CALLBACK GLOB_EnumJoysticksProc(LPCDIDEVICEINSTANCE ddi, LPVOID private_data) __attribute__((force_align_arg_pointer)); +static BOOL CALLBACK GLOB_EnumJoysticksProc(LPCDIDEVICEINSTANCE ddi, LPVOID private_data) +{ + enum_device_list *edl = (enum_device_list*)private_data; + + //printf("%08x\n", (unsigned int)ddi->guidInstance.Data1); + + if((ddi->dwDevType & 0xFF) != DIDEVTYPE_JOYSTICK) + return DIENUM_CONTINUE; + + if(edl->valid_count < edl->max_count) + { + memcpy(&edl->ddi[edl->valid_count], ddi, sizeof(DIDEVICEINSTANCE)); + edl->valid_count++; + } + + return DIENUM_CONTINUE; +} + +JoystickDriver_DX5::JoystickDriver_DX5(bool exclude_xinput) : dii(NULL) +{ + enum_device_list edl; + std::set exclude_vps; + + try + { + REQUIRE_DI_CALL( DirectInputCreate(GetModuleHandle(NULL), DIRECTINPUT_VERSION, &dii, NULL) ); + REQUIRE_DI_CALL( dii->EnumDevices(DIDEVTYPE_JOYSTICK, GLOB_EnumJoysticksProc, &edl, DIEDFL_ATTACHEDONLY) ); + + if(exclude_xinput) + { + exclude_vps = GetXInputVidPid(); + } + + for(unsigned i = 0; i < edl.valid_count; i++) + { + Joystick_DX5 *jdx5 = NULL; + + if(edl.ddi[i].guidProduct.Data1 && exclude_vps.count(edl.ddi[i].guidProduct.Data1)) + continue; + + try + { + jdx5 = new Joystick_DX5(dii, &edl.ddi[i]); + joys.push_back(jdx5); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + if(jdx5 != NULL) + { + delete jdx5; + jdx5 = NULL; + } + } + } + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } +} + +JoystickDriver_DX5::~JoystickDriver_DX5() +{ + for(unsigned int n = 0; n < joys.size(); n++) + { + delete joys[n]; + } + + if(dii != NULL) + { + dii->Release(); + dii = NULL; + } +} + +unsigned JoystickDriver_DX5::NumJoysticks(void) +{ + return joys.size(); +} + +Joystick *JoystickDriver_DX5::GetJoystick(unsigned index) +{ + return joys[index]; +} + +void JoystickDriver_DX5::UpdateJoysticks(void) +{ + for(unsigned int n = 0; n < joys.size(); n++) + { + joys[n]->UpdateInternal(); + } +} + +JoystickDriver *JoystickDriver_DX5_New(bool exclude_xinput) +{ + return new JoystickDriver_DX5(exclude_xinput); +} + diff --git a/Mednafen/mednafen/drivers/Joystick_DX5.h b/Mednafen/mednafen/drivers/Joystick_DX5.h new file mode 100644 index 0000000000..a1d9c84c59 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_DX5.h @@ -0,0 +1,6 @@ +#ifndef __MDFN_DRIVERS_JOYSTICK_DX5_H +#define __MDFN_DRIVERS_JOYSTICK_DX5_H + +JoystickDriver *JoystickDriver_DX5_New(bool exclude_xinput); + +#endif diff --git a/Mednafen/mednafen/drivers/Joystick_Linux.cpp b/Mednafen/mednafen/drivers/Joystick_Linux.cpp new file mode 100644 index 0000000000..89ac51a297 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_Linux.cpp @@ -0,0 +1,601 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "input.h" +#include "Joystick.h" +#include "Joystick_Linux.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class Joystick_Linux : public Joystick +{ + public: + + Joystick_Linux(const char *jsdev_path, const char *evdev_path); + ~Joystick_Linux(); + + virtual unsigned HatToAxisCompat(unsigned hat); + + void UpdateInternal(void); + + void SetRumble(uint8 weak_intensity, uint8 strong_intensity); + + inline bool RumbleUsed(void) + { + return rumble_used; + } + + private: + + void InitFF(void); + + int jsdev_fd; + int evdev_fd; + + unsigned compat_hat_offs; + //unsigned ev_num_buttons; + //unsigned ev_num_axes; + //unsigned ev_button_map[KEY_CNT]; + + bool rumble_supported; + struct ff_effect current_rumble; + bool rumble_used; +}; + +unsigned Joystick_Linux::HatToAxisCompat(unsigned hat) +{ + if(compat_hat_offs == ~0U) + return(~0U); + else + return(compat_hat_offs + (hat * 2)); +} + +static bool TestEVBit(uint8 *data, unsigned bit_offset) +{ + return (bool)(data[(bit_offset >> 3)] & (1U << (bit_offset & 0x7))); +} + +Joystick_Linux::Joystick_Linux(const char *jsdev_path, const char *evdev_path) : jsdev_fd(-1), evdev_fd(-1) +{ + unsigned char tmp; + + //printf("%s %s\n", jsdev_path, evdev_path); + + jsdev_fd = open(jsdev_path, O_RDONLY); + if(jsdev_fd == -1) + { + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("Error opening joystick device \"%s\": %s"), jsdev_path, ene.StrError()); + } + + fcntl(jsdev_fd, F_SETFL, fcntl(jsdev_fd, F_GETFL) | O_NONBLOCK); + + if(evdev_path != NULL) + { + evdev_fd = open(evdev_path, O_RDWR); + if(evdev_fd == -1) + { + ErrnoHolder ene(errno); + + if(ene.Errno() == EACCES) + { + evdev_fd = open(evdev_path, O_RDONLY); + if(evdev_fd == -1) + { + ErrnoHolder ene2(errno); + + fprintf(stderr, _("WARNING: Failed to open event device \"%s\": %s --- !!!!! BASE JOYSTICK FUNCTIONALITY WILL BE AVAILABLE, BUT FORCE-FEEDBACK(E.G. RUMBLE) WILL BE UNAVAILABLE, AND THE CALCULATED JOYSTICK ID WILL BE DIFFERENT. !!!!!\n"), evdev_path, ene2.StrError()); + } + else + { + fprintf(stderr, _("WARNING: Could only open event device \"%s\" for reading, and not reading+writing: %s --- !!!!! FORCE-FEEDBACK(E.G. RUMBLE) WILL BE UNAVAILABLE. !!!!!\n"), evdev_path, ene.StrError()); + } + } + else + fprintf(stderr, _("WARNING: Failed to open event device \"%s\": %s --- !!!!! BASE JOYSTICK FUNCTIONALITY WILL BE AVAILABLE, BUT FORCE-FEEDBACK(E.G. RUMBLE) WILL BE UNAVAILABLE, AND THE CALCULATED JOYSTICK ID WILL BE DIFFERENT. !!!!!\n"), evdev_path, ene.StrError()); + } + } + else + fprintf(stderr, _("WARNING: Failed to find a valid corresponding event device to joystick device \"%s\" --- !!!!! BASE JOYSTICK FUNCTIONALITY WILL BE AVAILABLE, BUT FORCE-FEEDBACK(E.G. RUMBLE) WILL BE UNAVAILABLE, AND THE CALCULATED JOYSTICK ID WILL BE DIFFERENT. !!!!!\n"), jsdev_path); + + if(evdev_fd != -1) + fcntl(evdev_fd, F_SETFL, fcntl(evdev_fd, F_GETFL) | O_NONBLOCK); + + + + num_rel_axes = 0; + + if(ioctl(jsdev_fd, JSIOCGAXES, &tmp) == -1) + { + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("Failed to get number of axes: %s"), ene.StrError()); + } + else + num_axes = tmp; + + if(ioctl(jsdev_fd, JSIOCGBUTTONS, &tmp) == -1) + { + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("Failed to get number of buttons: %s"), ene.StrError()); + } + else + num_buttons = tmp; + + axis_state.resize(num_axes); + button_state.resize(num_buttons); + + memset(name, 0, sizeof(name)); + ioctl(jsdev_fd, JSIOCGNAME(sizeof(name) - 1), name); + if(name[0] == 0) + snprintf(name, sizeof(name), _("%u-button, %u-axis controller"), num_buttons, num_axes); + + compat_hat_offs = ~0U; + CalcOldStyleID(num_axes, 0, 0, num_buttons); + if(evdev_fd != -1) + { +#if 0 + uint8 keybits[(KEY_CNT + 7) / 8]; + unsigned ev_button_count = 0; + + memset(keybits, 0, sizeof(keybits)); + ioctl(evdev_fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits); + + for(unsigned kbt = 0; kbt < KEY_CNT; kbt++) + { + if(keybits[kbt >> 3] & (1 << (kbt & 0x7))) + { + ev_button_count++; + } + } + printf("moo: %u\n", ev_button_count); +#endif + uint8 absaxbits[(ABS_CNT + 7) / 8]; + unsigned ev_abs_count = 0; + unsigned ev_hat_count = 0; + + memset(absaxbits, 0, sizeof(absaxbits)); + ioctl(evdev_fd, EVIOCGBIT(EV_ABS, sizeof(absaxbits)), absaxbits); + for(unsigned aat = 0; aat < ABS_CNT; aat++) + { + if(TestEVBit(absaxbits, aat)) + { + if(aat >= ABS_HAT0X && aat <= ABS_HAT3Y) + { + if(compat_hat_offs == ~0U) + compat_hat_offs = ev_abs_count; + ev_hat_count++; + } + ev_abs_count++; + } + } + //printf("%u\n", compat_hat_offs); + CalcOldStyleID(ev_abs_count - ev_hat_count, 0, ev_hat_count / 2, num_buttons); + } + +#if 0 + uint8 keybits[(KEY_CNT + 7) / 8]; + unsigned ev_button_count = 0; + + memset(keybits, 0, sizeof(keybits)); + ioctl(evdev_fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits); + hashie.update(keybits, sizeof(keybits)); + + for(unsigned kbt = 0; kbt < KEY_CNT; kbt++) + { + if(keybits[kbt >> 3] & (1 << (kbt & 0x7))) + { + ev_button_count++; + } + } + printf("moo: %u\n", ev_button_count); + } +#endif + + rumble_supported = false; + rumble_used = false; + if(evdev_fd != -1) + InitFF(); +} + +void Joystick_Linux::InitFF(void) +{ + uint8 features[(FF_CNT + 7) / 8]; + + if(ioctl(evdev_fd, EVIOCGBIT(EV_FF, sizeof(features)), features) != -1) + { + if(TestEVBit((uint8 *)features, FF_RUMBLE)) + { + rumble_supported = true; + memset(¤t_rumble, 0, sizeof(current_rumble)); + current_rumble.id = -1; + current_rumble.type = FF_RUMBLE; + current_rumble.replay.length = 3000; + current_rumble.replay.delay = 0; + } + } +} + +Joystick_Linux::~Joystick_Linux() +{ + if(jsdev_fd != -1) + { + close(jsdev_fd); + jsdev_fd = -1; + } + + if(evdev_fd != -1) + { + close(evdev_fd); + evdev_fd = -1; + } +} + +void Joystick_Linux::SetRumble(uint8 weak_intensity, uint8 strong_intensity) +{ + if(rumble_supported) + { + uint32 scaled_weak = weak_intensity * (65535 / 255); + uint32 scaled_strong = strong_intensity * (65535 / 255); + input_event play; + + if(!scaled_weak && !scaled_strong && !rumble_used) + return; + + //printf("RUMBLE SET: %d %d\n", weak_intensity, strong_intensity); + rumble_used = true; + current_rumble.u.rumble.weak_magnitude = scaled_weak; + current_rumble.u.rumble.strong_magnitude = scaled_strong; + + if(ioctl(evdev_fd, EVIOCSFF, ¤t_rumble) == -1) + { + printf("EVIOCSFF failed: %m\n"); + return; + } + + memset(&play, 0, sizeof(play)); + + play.type = EV_FF; + play.code = current_rumble.id; + play.value = 1; + write(evdev_fd, (const void *)&play, sizeof(play)); + } +} + + +void Joystick_Linux::UpdateInternal(void) +{ + // Axis movement generates a LOT of events very quickly(especially if you hack the kernel to poll USB HID game devices every 1ms instead of 8ms ;)), so read multiple events at once. + union // Save a bit of stack space. + { + struct js_event jse[32]; + struct input_event eve[32]; + }; + ssize_t read_count; + + while((read_count = read(jsdev_fd, &jse[0], sizeof(jse))) > 0) + { + for(unsigned i = 0; i < ((size_t)read_count / sizeof(jse[0])); i++) + { + //printf("JLinux: (%u) %u %u %d\n", i, jse[i].type, jse[i].number, jse[i].value); + switch(jse[i].type & ~JS_EVENT_INIT) + { + default: break; + case JS_EVENT_BUTTON: + button_state[jse[i].number] = jse[i].value; + break; + + case JS_EVENT_AXIS: + axis_state[jse[i].number] = jse[i].value; + break; + } + } + } + + if(evdev_fd != -1) + { + while((read_count = read(evdev_fd, &eve[0], sizeof(eve))) > 0) + { + //for(unsigned i = 0; i < ((size_t)read_count / sizeof(eve[0])); i++) + //{ + //} + //puts("YAY"); + } + } +} + +class JoystickDriver_Linux : public JoystickDriver +{ + public: + + JoystickDriver_Linux(); + virtual ~JoystickDriver_Linux(); + + virtual unsigned NumJoysticks(); // Cached internally on JoystickDriver instantiation. + virtual Joystick *GetJoystick(unsigned index); + virtual void UpdateJoysticks(void); + + private: + std::vector joys; +}; + +static void FreeNamelist(struct dirent **namelist, int namelist_num) +{ + if(namelist_num > 0) + { + for(int i = 0; i < namelist_num; i++) + { + free(namelist[i]); + } + } + + if(namelist) + { + free(namelist); + } +} + +static int evdev_filter(const struct dirent *de) +{ + unsigned num; + int ccount = 0; + + if(sscanf(de->d_name, "event%u%n", &num, &ccount) >= 1 && de->d_name[ccount] == 0) + { + return(1); + } + + return(0); +} + + +std::string FindEVDevFullPathByJSDev(const char *jsdev_name) +{ + char search_dir[512]; + struct dirent **namelist = NULL; + int namelist_num = 0; + std::string ret = ""; + + snprintf(search_dir, sizeof(search_dir), "/sys/class/input/%s/device", jsdev_name); + + namelist_num = scandir(search_dir, &namelist, evdev_filter, alphasort); + if(namelist_num > 0) + { + ret = std::string("/dev/input") + std::string("/") + std::string(namelist[0]->d_name); + } + FreeNamelist(namelist, namelist_num); + namelist = NULL; + + // Alternate matching, but a bit too complicated. +#if 0 + if(ret == "") + { + snprintf(search_dir, sizeof(search_dir), "/dev/input/by-id"); + + namelist_num = scandir(search_dir, &namelist, NULL, alphasort); + if(namelist_num > 0) + { + for(int i = 0; i < namelist_num; i++) + { + char link_buf[256 + 1]; + std::string tmp_path; + + memset(link_buf, 0, sizeof(link_buf)); + tmp_path = std::string("/dev/input/by-id/") + std::string(namelist[i]->d_name); + if(readlink(tmp_path.c_str(), link_buf, sizeof(link_buf) - 1) > 0) + { + std::string link_str = std::string(link_buf); + size_t spos; + std::string fstr = std::string("/") + std::string(jsdev_name); + + //printf("TP: %s, LS: %s, FS: %s\n", tmp_path.c_str(), link_str.c_str(), fstr.c_str()); + + spos = link_str.find(fstr); + if(spos != std::string::npos && ((link_str.size() - spos) == fstr.size())) + { + std::string jsuffix = std::string("-joystick"); + std::string repsuffix = std::string("-event-joystick"); + std::string new_path = tmp_path; + size_t jpos; + + jpos = new_path.find(jsuffix); + if(jpos != std::string::npos && ((new_path.size() - jpos) == jsuffix.size())) + { + struct stat stat_buf; + new_path.replace(jpos, jsuffix.size(), repsuffix); + + if(stat(new_path.c_str(), &stat_buf) != -1) + { + ret = new_path; + //printf("POO: %s\n", new_path.c_str()); + break; + } + } + } + } + } + } + FreeNamelist(namelist, namelist_num); + namelist_num = NULL; + } +#endif + + return ret; +} + +static int jsdev_filter(const struct dirent *de) +{ + unsigned num; + int ccount = 0; + + if(sscanf(de->d_name, "js%u%n", &num, &ccount) >= 1 && de->d_name[ccount] == 0) + { + return(1); + } + + return(0); +} + +JoystickDriver_Linux::JoystickDriver_Linux() +{ + struct dirent **inputdir_namelist = NULL; + struct dirent **basedir_namelist = NULL; + struct dirent **namelist = NULL; + int inputdir_namelist_num = 0; + int basedir_namelist_num = 0; + int namelist_num = 0; + const char *base_path; + + inputdir_namelist_num = scandir("/dev/input", &inputdir_namelist, jsdev_filter, alphasort); + basedir_namelist_num = scandir("/dev", &basedir_namelist, jsdev_filter, alphasort); + + if(basedir_namelist_num > inputdir_namelist_num) + { + namelist_num = basedir_namelist_num; + namelist = basedir_namelist; + base_path = "/dev"; + } + else + { + namelist_num = inputdir_namelist_num; + namelist = inputdir_namelist; + base_path = "/dev/input"; + } + + if(namelist_num > 0) + { + for(int i = 0; i < namelist_num; i++) + { + char jsdev_path[256]; + Joystick_Linux *jslin = NULL; + + snprintf(jsdev_path, sizeof(jsdev_path), "%s/%s", base_path, namelist[i]->d_name); + + try + { + std::string evdev_path; + + evdev_path = FindEVDevFullPathByJSDev(namelist[i]->d_name); + + jslin = new Joystick_Linux(jsdev_path, (evdev_path.size() > 0) ? evdev_path.c_str() : NULL ); + joys.push_back(jslin); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + if(jslin) + { + delete jslin; + jslin = NULL; + } + } + } + } + + namelist = NULL; + if(inputdir_namelist) + { + FreeNamelist(inputdir_namelist, inputdir_namelist_num); + inputdir_namelist = NULL; + } + + if(basedir_namelist) + { + FreeNamelist(basedir_namelist, basedir_namelist_num); + basedir_namelist = NULL; + } +} + +JoystickDriver_Linux::~JoystickDriver_Linux() +{ + bool any_rumble_used = false; + + /* + Try to work around bugs in the Linux kernel that can lead to a kernel panic. + (and turns rumble off on the controllers in the process) + */ + for(unsigned int n = 0; n < joys.size(); n++) + { + if(joys[n]->RumbleUsed()) + { + any_rumble_used = true; + break; + } + } + + if(any_rumble_used) + { + usleep(20000); + + for(unsigned int n = 0; n < joys.size(); n++) + { + if(joys[n]->RumbleUsed()) + joys[n]->SetRumble(1, 1); + } + + usleep(50000); + + for(unsigned int n = 0; n < joys.size(); n++) + { + if(joys[n]->RumbleUsed()) + joys[n]->SetRumble(0, 0); + } + + usleep(50000); + } + + for(unsigned int n = 0; n < joys.size(); n++) + { + delete joys[n]; + } +} + +unsigned JoystickDriver_Linux::NumJoysticks(void) +{ + return joys.size(); +} + +Joystick *JoystickDriver_Linux::GetJoystick(unsigned index) +{ + return joys[index]; +} + +void JoystickDriver_Linux::UpdateJoysticks(void) +{ + for(unsigned int n = 0; n < joys.size(); n++) + { + joys[n]->UpdateInternal(); + } +} + +JoystickDriver *JoystickDriver_Linux_New(void) +{ + return new JoystickDriver_Linux(); +} diff --git a/Mednafen/mednafen/drivers/Joystick_Linux.h b/Mednafen/mednafen/drivers/Joystick_Linux.h new file mode 100644 index 0000000000..fbc343b3de --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_Linux.h @@ -0,0 +1,4 @@ +#ifndef __MDFN_DRIVERS_JOYSTICK_LINUX_H +#define __MDFN_DRIVERS_JOYSTICK_LINUX_H +JoystickDriver *JoystickDriver_Linux_New(void); +#endif diff --git a/Mednafen/mednafen/drivers/Joystick_SDL.cpp b/Mednafen/mednafen/drivers/Joystick_SDL.cpp new file mode 100644 index 0000000000..f997c2fbf9 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_SDL.cpp @@ -0,0 +1,187 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "input.h" +#include "Joystick.h" +#include "Joystick_SDL.h" + +#include + +class Joystick_SDL : public Joystick +{ + public: + + Joystick_SDL(unsigned index); + ~Joystick_SDL(); + + void UpdateInternal(void); + + virtual unsigned HatToButtonCompat(unsigned hat); + + private: + SDL_Joystick *sdl_joy; + unsigned sdl_num_axes; + unsigned sdl_num_hats; + unsigned sdl_num_balls; + unsigned sdl_num_buttons; +}; + +unsigned Joystick_SDL::HatToButtonCompat(unsigned hat) +{ + return(sdl_num_buttons + (hat * 4)); +} + +Joystick_SDL::Joystick_SDL(unsigned index) : sdl_joy(NULL) +{ + sdl_joy = SDL_JoystickOpen(index); + if(sdl_joy == NULL) + { + throw MDFN_Error(0, "SDL_JoystickOpen(%u) failed: %s", index, SDL_GetError()); + } + + strncpy(name, SDL_JoystickName(index), sizeof(name)); + name[sizeof(name) - 1] = 0; + + sdl_num_axes = SDL_JoystickNumAxes(sdl_joy); + sdl_num_balls = SDL_JoystickNumBalls(sdl_joy); + sdl_num_buttons = SDL_JoystickNumButtons(sdl_joy); + sdl_num_hats = SDL_JoystickNumHats(sdl_joy); + + CalcOldStyleID(sdl_num_axes, sdl_num_balls, sdl_num_hats, sdl_num_buttons); + + num_axes = sdl_num_axes; + num_rel_axes = sdl_num_balls * 2; + num_buttons = sdl_num_buttons + (sdl_num_hats * 4); + + axis_state.resize(num_axes); + rel_axis_state.resize(num_rel_axes); + button_state.resize(num_buttons); +} + +Joystick_SDL::~Joystick_SDL() +{ + if(sdl_joy) + { + SDL_JoystickClose(sdl_joy); + sdl_joy = NULL; + } +} + +void Joystick_SDL::UpdateInternal(void) +{ + for(unsigned i = 0; i < sdl_num_axes; i++) + { + axis_state[i] = SDL_JoystickGetAxis(sdl_joy, i); + if(axis_state[i] < -32767) + axis_state[i] = -32767; + } + + for(unsigned i = 0; i < sdl_num_balls; i++) + { + int dx, dy; + + SDL_JoystickGetBall(sdl_joy, i, &dx, &dy); + + rel_axis_state[i * 2 + 0] = dx; + rel_axis_state[i * 2 + 1] = dy; + } + + for(unsigned i = 0; i < sdl_num_buttons; i++) + { + button_state[i] = SDL_JoystickGetButton(sdl_joy, i); + } + + for(unsigned i = 0; i < sdl_num_hats; i++) + { + uint8 hs = SDL_JoystickGetHat(sdl_joy, i); + + button_state[sdl_num_buttons + (i * 4) + 0] = (bool)(hs & SDL_HAT_UP); + button_state[sdl_num_buttons + (i * 4) + 1] = (bool)(hs & SDL_HAT_RIGHT); + button_state[sdl_num_buttons + (i * 4) + 2] = (bool)(hs & SDL_HAT_DOWN); + button_state[sdl_num_buttons + (i * 4) + 3] = (bool)(hs & SDL_HAT_LEFT); + } +} + +class JoystickDriver_SDL : public JoystickDriver +{ + public: + + JoystickDriver_SDL(); + virtual ~JoystickDriver_SDL(); + + virtual unsigned NumJoysticks(); // Cached internally on JoystickDriver instantiation. + virtual Joystick *GetJoystick(unsigned index); + virtual void UpdateJoysticks(void); + + private: + std::vector joys; +}; + + +JoystickDriver_SDL::JoystickDriver_SDL() +{ + SDL_InitSubSystem(SDL_INIT_JOYSTICK); + + for(int n = 0; n < SDL_NumJoysticks(); n++) + { + try + { + Joystick_SDL *jsdl = new Joystick_SDL(n); + joys.push_back(jsdl); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } + } +} + +JoystickDriver_SDL::~JoystickDriver_SDL() +{ + for(unsigned int n = 0; n < joys.size(); n++) + { + delete joys[n]; + } + + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); +} + +unsigned JoystickDriver_SDL::NumJoysticks(void) +{ + return joys.size(); +} + +Joystick *JoystickDriver_SDL::GetJoystick(unsigned index) +{ + return joys[index]; +} + +void JoystickDriver_SDL::UpdateJoysticks(void) +{ + SDL_JoystickUpdate(); + + for(unsigned int n = 0; n < joys.size(); n++) + { + joys[n]->UpdateInternal(); + } +} + +JoystickDriver *JoystickDriver_SDL_New(void) +{ + return new JoystickDriver_SDL(); +} diff --git a/Mednafen/mednafen/drivers/Joystick_SDL.h b/Mednafen/mednafen/drivers/Joystick_SDL.h new file mode 100644 index 0000000000..f224f16773 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_SDL.h @@ -0,0 +1,4 @@ +#ifndef __MDFN_DRIVERS_JOYSTICK_SDL_H +#define __MDFN_DRIVERS_JOYSTICK_SDL_H +JoystickDriver *JoystickDriver_SDL_New(void); +#endif diff --git a/Mednafen/mednafen/drivers/Joystick_XInput.cpp b/Mednafen/mednafen/drivers/Joystick_XInput.cpp new file mode 100644 index 0000000000..86d6c9c47b --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_XInput.cpp @@ -0,0 +1,263 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "input.h" +#include "Joystick.h" +#include "Joystick_XInput.h" + +#include +#include +#include + +#include +#include + +struct XInputFuncPointers +{ + void WINAPI (*p_XInputEnable)(BOOL); + DWORD WINAPI (*p_XInputSetState)(DWORD, XINPUT_VIBRATION*); + DWORD WINAPI (*p_XInputGetState)(DWORD, XINPUT_STATE*); // Pointer to XInputGetState or XInputGetStateEx(if available). + DWORD WINAPI (*p_XInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*); +}; + +class Joystick_XInput : public Joystick +{ + public: + + Joystick_XInput(unsigned index, const XINPUT_CAPABILITIES &caps_in, const XInputFuncPointers* xfps_in); + ~Joystick_XInput(); + + virtual void SetRumble(uint8 weak_intensity, uint8 strong_intensity); + virtual bool IsAxisButton(unsigned axis); + void UpdateInternal(void); + + private: + const unsigned joy_index; + const XINPUT_CAPABILITIES caps; + const XInputFuncPointers *xfps; +}; + +Joystick_XInput::Joystick_XInput(unsigned index, const XINPUT_CAPABILITIES &caps_in, const XInputFuncPointers* xfps_in) : joy_index(index), caps(caps_in), xfps(xfps_in) +{ + num_buttons = sizeof(((XINPUT_GAMEPAD*)0)->wButtons) * 8; + num_axes = 6; + num_rel_axes = 0; + + button_state.resize(num_buttons); + axis_state.resize(num_axes); + + id = (caps.Type << 24) | (caps.SubType << 16); // Don't include the XInput index in the id, it'll just cause problems, especially when multiple different subtypes of controllers are connected. | (index << 8); + + snprintf(name, sizeof(name), "XInput Unknown Controller"); + if(caps.Type == XINPUT_DEVTYPE_GAMEPAD) + { + switch(caps.SubType) + { + default: break; + case XINPUT_DEVSUBTYPE_GAMEPAD: snprintf(name, sizeof(name), "XInput Gamepad"); break; + case XINPUT_DEVSUBTYPE_WHEEL: snprintf(name, sizeof(name), "XInput Wheel"); break; + case XINPUT_DEVSUBTYPE_ARCADE_STICK: snprintf(name, sizeof(name), "XInput Arcade Stick"); break; +#ifdef XINPUT_DEVSUBTYPE_FLIGHT_STICK + case XINPUT_DEVSUBTYPE_FLIGHT_STICK: snprintf(name, sizeof(name), "XInput Flight Stick"); break; +#endif + case XINPUT_DEVSUBTYPE_DANCE_PAD: snprintf(name, sizeof(name), "XInput Dance Pad"); break; + +#ifdef XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE + case XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE: +#endif +#ifdef XINPUT_DEVSUBTYPE_GUITAR_BASS + case XINPUT_DEVSUBTYPE_GUITAR_BASS: +#endif + case XINPUT_DEVSUBTYPE_GUITAR: snprintf(name, sizeof(name), "XInput Guitar"); break; + + case XINPUT_DEVSUBTYPE_DRUM_KIT: snprintf(name, sizeof(name), "XInput Drum Kit"); break; +#ifdef XINPUT_DEVSUBTYPE_ARCADE_PAD + case XINPUT_DEVSUBTYPE_ARCADE_PAD: snprintf(name, sizeof(name), "XInput Arcade Pad"); break; +#endif + } + } +} + + +Joystick_XInput::~Joystick_XInput() +{ + +} + +bool Joystick_XInput::IsAxisButton(unsigned axis) +{ + if(axis >= 4) + return(true); + + return(false); +} + +void Joystick_XInput::UpdateInternal(void) +{ + XINPUT_STATE joy_state; + memset(&joy_state, 0, sizeof(XINPUT_STATE)); + + xfps->p_XInputGetState(joy_index, &joy_state); + + for(unsigned b = 0; b < num_buttons; b++) + button_state[b] = (joy_state.Gamepad.wButtons >> b) & 1; + + axis_state[0] = std::max(-32767, joy_state.Gamepad.sThumbLX); + axis_state[1] = std::max(-32767, joy_state.Gamepad.sThumbLY); + axis_state[2] = std::max(-32767, joy_state.Gamepad.sThumbRX); + axis_state[3] = std::max(-32767, joy_state.Gamepad.sThumbRY); + + axis_state[4] = (((unsigned)joy_state.Gamepad.bLeftTrigger * 32767) + 127) / 255; + axis_state[5] = (((unsigned)joy_state.Gamepad.bRightTrigger * 32767) + 127) / 255; +} + +void Joystick_XInput::SetRumble(uint8 weak_intensity, uint8 strong_intensity) +{ + XINPUT_VIBRATION vib; + + memset(&vib, 0, sizeof(XINPUT_VIBRATION)); + vib.wLeftMotorSpeed = (((unsigned int)strong_intensity * 65535) + 127) / 255; + vib.wRightMotorSpeed = (((unsigned int)weak_intensity * 65535) + 127) / 255; + xfps->p_XInputSetState(joy_index, &vib); +} + +class JoystickDriver_XInput : public JoystickDriver +{ + public: + + JoystickDriver_XInput(); + virtual ~JoystickDriver_XInput(); + + virtual unsigned NumJoysticks(); // Cached internally on JoystickDriver instantiation. + virtual Joystick *GetJoystick(unsigned index); + virtual void UpdateJoysticks(void); + + private: + Joystick_XInput *joys[XUSER_MAX_COUNT]; + unsigned joy_count; + + + HMODULE dll_handle; + XInputFuncPointers xfps; +}; + +template +bool GetXIPA(HMODULE dll_handle, T& pf, const char *name) +{ + pf = (T)GetProcAddress(dll_handle, name); + return(pf != NULL); +} + +JoystickDriver_XInput::JoystickDriver_XInput() : joy_count(0), dll_handle(NULL) +{ + if((dll_handle = LoadLibrary("xinput1_3.dll")) == NULL) + { + if((dll_handle = LoadLibrary("xinput1_4.dll")) == NULL) + { + if((dll_handle = LoadLibrary("xinput9_1_0.dll")) == NULL) + { + return; + } + } + } + + // 9.1.0 supposedly lacks XInputEnable() + xfps.p_XInputEnable = NULL; + GetXIPA(dll_handle, xfps.p_XInputEnable, "XInputEnable"); + + if(!GetXIPA(dll_handle, xfps.p_XInputSetState, "XInputSetState") || + (!GetXIPA(dll_handle, xfps.p_XInputGetState, (const char *)100/*"XInputGetStateEx"*/) && !GetXIPA(dll_handle, xfps.p_XInputGetState, "XInputGetState")) || + !GetXIPA(dll_handle, xfps.p_XInputGetCapabilities, "XInputGetCapabilities")) + { + FreeLibrary(dll_handle); + return; + } + + if(xfps.p_XInputEnable) + xfps.p_XInputEnable(TRUE); + + for(unsigned i = 0; i < XUSER_MAX_COUNT; i++) + { + joys[i] = NULL; + try + { + XINPUT_CAPABILITIES caps; + + if(xfps.p_XInputGetCapabilities(i, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS) + { + joys[joy_count] = new Joystick_XInput(i, caps, &xfps); + joy_count++; // joys[joy_count++] would not be exception-safe. + } + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } + } +} + +JoystickDriver_XInput::~JoystickDriver_XInput() +{ + if(xfps.p_XInputEnable) + xfps.p_XInputEnable(FALSE); + + for(unsigned i = 0; i < joy_count; i++) + { + if(joys[i]) + { + delete joys[i]; + joys[i] = NULL; + } + } + + joy_count = 0; + if(dll_handle != NULL) + { + FreeLibrary(dll_handle); + dll_handle = NULL; + } +} + +unsigned JoystickDriver_XInput::NumJoysticks(void) +{ + return joy_count; +} + +Joystick *JoystickDriver_XInput::GetJoystick(unsigned index) +{ + return joys[index]; +} + +void JoystickDriver_XInput::UpdateJoysticks(void) +{ + for(unsigned i = 0; i < joy_count; i++) + joys[i]->UpdateInternal(); +} + +JoystickDriver *JoystickDriver_XInput_New(void) +{ + JoystickDriver_XInput* jdxi = new JoystickDriver_XInput(); + + if(!jdxi->NumJoysticks()) + { + delete jdxi; + jdxi = NULL; + } + + return(jdxi); +} diff --git a/Mednafen/mednafen/drivers/Joystick_XInput.h b/Mednafen/mednafen/drivers/Joystick_XInput.h new file mode 100644 index 0000000000..6441955c50 --- /dev/null +++ b/Mednafen/mednafen/drivers/Joystick_XInput.h @@ -0,0 +1,5 @@ +#ifndef __MDFN_DRIVERS_JOYSTICK_XINPUT_H +#define __MDFN_DRIVERS_JOYSTICK_XINPUT_H +// Returns NULL if XInput is not available, or if no attached XInput controllers were found. +JoystickDriver *JoystickDriver_XInput_New(void); +#endif diff --git a/Mednafen/mednafen/drivers/Makefile.am b/Mednafen/mednafen/drivers/Makefile.am new file mode 100644 index 0000000000..3ac4c63ac1 --- /dev/null +++ b/Mednafen/mednafen/drivers/Makefile.am @@ -0,0 +1,45 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @SDL_CFLAGS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnsdl.a + +libmdfnsdl_a_SOURCES = main.cpp input.cpp args.cpp help.cpp ers.cpp sound.cpp netplay.cpp input-config.cpp +libmdfnsdl_a_SOURCES += console.cpp cheat.cpp fps.cpp video-state.cpp remote.cpp rmdui.cpp + +libmdfnsdl_a_SOURCES += opengl.cpp shader.cpp +libmdfnsdl_a_SOURCES += overlay.cpp + +libmdfnsdl_a_SOURCES += video.cpp + +libmdfnsdl_a_SOURCES += nongl.cpp nnx.cpp + +if WIN32 +libmdfnsdl_a_SOURCES += thread_win32.cpp +else +libmdfnsdl_a_SOURCES += thread_sdl.cpp +endif + +if WANT_FANCY_SCALERS +libmdfnsdl_a_SOURCES += hqxx-common.cpp hq2x.cpp hq3x.cpp hq4x.cpp scale2x.c scale3x.c scalebit.c 2xSaI.cpp +endif + +libmdfnsdl_a_SOURCES += Joystick.cpp Joystick_SDL.cpp + +if HAVE_LINUX_JOYSTICK +libmdfnsdl_a_SOURCES += Joystick_Linux.cpp +endif + +if HAVE_POSIX_SOCKETS +libmdfnsdl_a_SOURCES += NetClient_POSIX.cpp +endif + +if WIN32 +libmdfnsdl_a_SOURCES += Joystick_XInput.cpp +libmdfnsdl_a_SOURCES += Joystick_DX5.cpp +libmdfnsdl_a_SOURCES += NetClient_WS2.cpp +endif + +if WANT_DEBUGGER +libmdfnsdl_a_SOURCES += debugger.cpp gfxdebugger.cpp memdebugger.cpp logdebugger.cpp prompt.cpp +endif diff --git a/Mednafen/mednafen/drivers/Makefile.in b/Mednafen/mednafen/drivers/Makefile.in new file mode 100644 index 0000000000..85c86c501a --- /dev/null +++ b/Mednafen/mednafen/drivers/Makefile.in @@ -0,0 +1,807 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WIN32_TRUE@am__append_1 = thread_win32.cpp +@WIN32_FALSE@am__append_2 = thread_sdl.cpp +@WANT_FANCY_SCALERS_TRUE@am__append_3 = hqxx-common.cpp hq2x.cpp hq3x.cpp hq4x.cpp scale2x.c scale3x.c scalebit.c 2xSaI.cpp +@HAVE_LINUX_JOYSTICK_TRUE@am__append_4 = Joystick_Linux.cpp +@HAVE_POSIX_SOCKETS_TRUE@am__append_5 = NetClient_POSIX.cpp +@WIN32_TRUE@am__append_6 = Joystick_XInput.cpp Joystick_DX5.cpp \ +@WIN32_TRUE@ NetClient_WS2.cpp +@WANT_DEBUGGER_TRUE@am__append_7 = debugger.cpp gfxdebugger.cpp memdebugger.cpp logdebugger.cpp prompt.cpp +subdir = src/drivers +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnsdl_a_AR = $(AR) $(ARFLAGS) +libmdfnsdl_a_LIBADD = +am__libmdfnsdl_a_SOURCES_DIST = main.cpp input.cpp args.cpp help.cpp \ + ers.cpp sound.cpp netplay.cpp input-config.cpp console.cpp \ + cheat.cpp fps.cpp video-state.cpp remote.cpp rmdui.cpp \ + opengl.cpp shader.cpp overlay.cpp video.cpp nongl.cpp nnx.cpp \ + thread_win32.cpp thread_sdl.cpp hqxx-common.cpp hq2x.cpp \ + hq3x.cpp hq4x.cpp scale2x.c scale3x.c scalebit.c 2xSaI.cpp \ + Joystick.cpp Joystick_SDL.cpp Joystick_Linux.cpp \ + NetClient_POSIX.cpp Joystick_XInput.cpp Joystick_DX5.cpp \ + NetClient_WS2.cpp debugger.cpp gfxdebugger.cpp memdebugger.cpp \ + logdebugger.cpp prompt.cpp +@WIN32_TRUE@am__objects_1 = thread_win32.$(OBJEXT) +@WIN32_FALSE@am__objects_2 = thread_sdl.$(OBJEXT) +@WANT_FANCY_SCALERS_TRUE@am__objects_3 = hqxx-common.$(OBJEXT) \ +@WANT_FANCY_SCALERS_TRUE@ hq2x.$(OBJEXT) hq3x.$(OBJEXT) \ +@WANT_FANCY_SCALERS_TRUE@ hq4x.$(OBJEXT) scale2x.$(OBJEXT) \ +@WANT_FANCY_SCALERS_TRUE@ scale3x.$(OBJEXT) scalebit.$(OBJEXT) \ +@WANT_FANCY_SCALERS_TRUE@ 2xSaI.$(OBJEXT) +@HAVE_LINUX_JOYSTICK_TRUE@am__objects_4 = Joystick_Linux.$(OBJEXT) +@HAVE_POSIX_SOCKETS_TRUE@am__objects_5 = NetClient_POSIX.$(OBJEXT) +@WIN32_TRUE@am__objects_6 = Joystick_XInput.$(OBJEXT) \ +@WIN32_TRUE@ Joystick_DX5.$(OBJEXT) NetClient_WS2.$(OBJEXT) +@WANT_DEBUGGER_TRUE@am__objects_7 = debugger.$(OBJEXT) \ +@WANT_DEBUGGER_TRUE@ gfxdebugger.$(OBJEXT) \ +@WANT_DEBUGGER_TRUE@ memdebugger.$(OBJEXT) \ +@WANT_DEBUGGER_TRUE@ logdebugger.$(OBJEXT) prompt.$(OBJEXT) +am_libmdfnsdl_a_OBJECTS = main.$(OBJEXT) input.$(OBJEXT) \ + args.$(OBJEXT) help.$(OBJEXT) ers.$(OBJEXT) sound.$(OBJEXT) \ + netplay.$(OBJEXT) input-config.$(OBJEXT) console.$(OBJEXT) \ + cheat.$(OBJEXT) fps.$(OBJEXT) video-state.$(OBJEXT) \ + remote.$(OBJEXT) rmdui.$(OBJEXT) opengl.$(OBJEXT) \ + shader.$(OBJEXT) overlay.$(OBJEXT) video.$(OBJEXT) \ + nongl.$(OBJEXT) nnx.$(OBJEXT) $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) Joystick.$(OBJEXT) \ + Joystick_SDL.$(OBJEXT) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) +libmdfnsdl_a_OBJECTS = $(am_libmdfnsdl_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfnsdl_a_SOURCES) +DIST_SOURCES = $(am__libmdfnsdl_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @SDL_CFLAGS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnsdl.a +libmdfnsdl_a_SOURCES = main.cpp input.cpp args.cpp help.cpp ers.cpp \ + sound.cpp netplay.cpp input-config.cpp console.cpp cheat.cpp \ + fps.cpp video-state.cpp remote.cpp rmdui.cpp opengl.cpp \ + shader.cpp overlay.cpp video.cpp nongl.cpp nnx.cpp \ + $(am__append_1) $(am__append_2) $(am__append_3) Joystick.cpp \ + Joystick_SDL.cpp $(am__append_4) $(am__append_5) \ + $(am__append_6) $(am__append_7) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/drivers/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/drivers/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libmdfnsdl.a: $(libmdfnsdl_a_OBJECTS) $(libmdfnsdl_a_DEPENDENCIES) $(EXTRA_libmdfnsdl_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnsdl.a + $(AM_V_AR)$(libmdfnsdl_a_AR) libmdfnsdl.a $(libmdfnsdl_a_OBJECTS) $(libmdfnsdl_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnsdl.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/2xSaI.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Joystick.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Joystick_DX5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Joystick_Linux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Joystick_SDL.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Joystick_XInput.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetClient_POSIX.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NetClient_WS2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/args.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/console.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debugger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fps.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfxdebugger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq2x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq3x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hq4x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hqxx-common.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input-config.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logdebugger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memdebugger.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netplay.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nongl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opengl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/overlay.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prompt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmdui.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scale2x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scale3x.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scalebit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread_sdl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thread_win32.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/video-state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/video.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/drivers/NetClient.h b/Mednafen/mednafen/drivers/NetClient.h new file mode 100644 index 0000000000..e8db52262b --- /dev/null +++ b/Mednafen/mednafen/drivers/NetClient.h @@ -0,0 +1,31 @@ +#ifndef __MDFN_DRIVERS_NETCLIENT_H +#define __MDFN_DRIVERS_NETCLIENT_H + +#include + +class NetClient +{ + public: + + //NetClient(); //const char *host); + virtual ~NetClient() { }; + + virtual void Connect(const char *host, unsigned int port) = 0; + + virtual void Disconnect(void) = 0; + + virtual bool IsConnected(void) = 0; + + // + // Returns 'true' if Send()/Receive() with len=1 would be non-blocking if Send()/Receive() actually were blocking; i.e. Can*() have select() style semantics. + // + // May timeout before timeout specified(if a signal interrupts an underlying system call). + // + virtual bool CanSend(int32 timeout = 0) = 0; + virtual bool CanReceive(int32 timeout = 0) = 0; + + virtual uint32 Send(const void *data, uint32 len) = 0; // Non-blocking + virtual uint32 Receive(void *data, uint32 len) = 0; // Non-blocking +}; + +#endif diff --git a/Mednafen/mednafen/drivers/NetClient_POSIX.cpp b/Mednafen/mednafen/drivers/NetClient_POSIX.cpp new file mode 100644 index 0000000000..2d496a65fe --- /dev/null +++ b/Mednafen/mednafen/drivers/NetClient_POSIX.cpp @@ -0,0 +1,276 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "NetClient_POSIX.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef SOL_TCP + #define SOL_TCP IPPROTO_TCP +#endif + +NetClient_POSIX::NetClient_POSIX() : fd(-1) +{ + +} + +NetClient_POSIX::~NetClient_POSIX() +{ + Disconnect(); +} + +void NetClient_POSIX::Connect(const char *host, unsigned int port) +{ + { + struct addrinfo hints; + struct addrinfo *result; + int rv; + char service[64]; + + fd = -1; + + snprintf(service, sizeof(service), "%u", port); + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; +#ifdef AI_ADDRCONFIG + hints.ai_flags = AI_ADDRCONFIG; +#else + hints.ai_flags = 0; +#endif + hints.ai_protocol = 0; + + if((rv = getaddrinfo(host, service, &hints, &result)) != 0) + { + if(rv == EAI_SYSTEM) + { + ErrnoHolder ene(errno); + throw MDFN_Error(ene.Errno(), _("getaddrinfo() failed: %s"), ene.StrError()); + } + else + throw MDFN_Error(0, _("getaddrinfo() failed: %s"), gai_strerror(rv)); + } + + for(int tryit = 0; tryit < 2; tryit++) // Quick hackish way to "sort" IPv4 ahead of everything else. + { + for(struct addrinfo *rp = result; rp != NULL; rp = rp->ai_next) + { + //printf("%u\n", rp->ai_family); + if(tryit == 0 && rp->ai_family != AF_INET) + continue; + + fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if(fd == -1) + { + ErrnoHolder ene(errno); + + freeaddrinfo(result); + + throw(MDFN_Error(ene.Errno(), _("socket() failed: %s"), ene.StrError())); + } + + if(connect(fd, rp->ai_addr, rp->ai_addrlen) == -1) + { + ErrnoHolder ene(errno); + + freeaddrinfo(result); + close(fd); + fd = -1; + + throw(MDFN_Error(ene.Errno(), _("connect() failed: %s"), ene.StrError())); + } + goto BreakOut; + } + } + + BreakOut: ; + + freeaddrinfo(result); + result = NULL; + + if(fd == -1) + { + throw MDFN_Error(0, "BOOGA BOOGA"); + } + } + + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); + { + int tcpopt = 1; + if(setsockopt(fd, SOL_TCP, TCP_NODELAY, &tcpopt, sizeof(int)) == -1) + { + ErrnoHolder ene(errno); + + close(fd); + fd = -1; + + throw(MDFN_Error(ene.Errno(), _("setsockopt() failed: %s"), ene.StrError())); + } + } + + #ifdef SO_NOSIGPIPE + { + int opt = 1; + + if(setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt)) == -1) + { + ErrnoHolder ene(errno); + + close(fd); + fd = -1; + + throw(MDFN_Error(ene.Errno(), _("setsockopt() failed: %s"), ene.StrError())); + } + } + #endif +} + +void NetClient_POSIX::Disconnect(void) +{ + if(fd != -1) + { + //shutdown(fd, SHUT_RDWR); // TODO: investigate usage scenarios + close(fd); + fd = -1; + } +} + +bool NetClient_POSIX::IsConnected(void) +{ + if(fd == -1) + return(false); + + + return(true); +} + +// +// Use poll() instead of select() so the code doesn't malfunction when +// exceeding the FD_SETSIZE ceiling(which can occur in some quasi-pathological Mednafen use cases, such as making and running with an M3U file +// that ultimately references thousands of files through CUE sheets). +// +bool NetClient_POSIX::CanSend(int32 timeout) +{ + int rv; + struct pollfd fds[1]; + + TryAgain: + memset(fds, 0, sizeof(fds)); + fds[0].fd = fd; + fds[0].events = POLLOUT | POLLHUP | POLLERR; + rv = poll(fds, 1, ((timeout >= 0) ? (timeout + 500) / 1000 : -1)); + + if(rv == -1) + { + if(errno == EINTR) + { + timeout = 0; + goto TryAgain; + } + + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("poll() failed: %s"), ene.StrError()); + } + + return (bool)(fds[0].revents & (POLLOUT | POLLERR)); +} + +bool NetClient_POSIX::CanReceive(int32 timeout) +{ + int rv; + struct pollfd fds[1]; + + TryAgain: + memset(fds, 0, sizeof(fds)); + fds[0].fd = fd; + fds[0].events = POLLIN | POLLHUP | POLLERR; + rv = poll(fds, 1, ((timeout >= 0) ? (timeout + 500) / 1000 : -1)); + + if(rv == -1) + { + if(errno == EINTR) + { + timeout = 0; + goto TryAgain; + } + + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("poll() failed: %s"), ene.StrError()); + } + + return (bool)(fds[0].revents & (POLLIN | POLLHUP | POLLERR)); +} + +uint32 NetClient_POSIX::Send(const void *data, uint32 len) +{ + ssize_t rv; + + #ifdef MSG_NOSIGNAL + rv = send(fd, data, len, MSG_NOSIGNAL); + #else + rv = send(fd, data, len, 0); + #endif + + if(rv < 0) + { + if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR) + { + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("send() failed: %s"), ene.StrError()); + } + return(0); + } + + return rv; +} + +uint32 NetClient_POSIX::Receive(void *data, uint32 len) +{ + ssize_t rv; + + rv = recv(fd, data, len, 0); + + if(rv < 0) + { + if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR) + { + ErrnoHolder ene(errno); + + throw MDFN_Error(ene.Errno(), _("recv() failed: %s"), ene.StrError()); + } + return(0); + } + else if(rv == 0) + { + throw MDFN_Error(0, _("recv() failed: peer has closed connection")); + } + return rv; +} + diff --git a/Mednafen/mednafen/drivers/NetClient_POSIX.h b/Mednafen/mednafen/drivers/NetClient_POSIX.h new file mode 100644 index 0000000000..00083787e3 --- /dev/null +++ b/Mednafen/mednafen/drivers/NetClient_POSIX.h @@ -0,0 +1,31 @@ +#ifndef __MDFN_DRIVERS_NETCLIENT_POSIX_H +#define __MDFN_DRIVERS_NETCLIENT_POSIX_H + +#include "NetClient.h" + +class NetClient_POSIX : public NetClient +{ + public: + + NetClient_POSIX(); //const char *host); + virtual ~NetClient_POSIX(); + + virtual void Connect(const char *host, unsigned int port); + + virtual void Disconnect(void); + + virtual bool IsConnected(void); + + virtual bool CanSend(int32 timeout = 0); + virtual bool CanReceive(int32 timeout = 0); + + virtual uint32 Send(const void *data, uint32 len); + + virtual uint32 Receive(void *data, uint32 len); + + private: + + int fd; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/NetClient_WS2.cpp b/Mednafen/mednafen/drivers/NetClient_WS2.cpp new file mode 100644 index 0000000000..0d6eda73ce --- /dev/null +++ b/Mednafen/mednafen/drivers/NetClient_WS2.cpp @@ -0,0 +1,303 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "NetClient_WS2.h" + +#include +#include +#include +#include +#include +#include + +#ifndef AI_ADDRCONFIG + #define AI_ADDRCONFIG 0x0400 +#endif + +#include + +static std::string ErrCodeToString(int errcode) +{ + std::string ret; + void *msg_buffer; + unsigned int tchar_count; + + tchar_count = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, errcode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&msg_buffer, 0, NULL); + + if(tchar_count == 0) + { + return std::string("Error Error"); + } + + //{ + // TCHAR trim_chars[] = TEXT("\r\n\t "); + // + // StrTrim((PTSTR)msg_buffer, trim_chars); + //} + + #ifdef UNICODE + #warning "UNICODE TODO" + ret = ""; + #else + ret = std::string((char *)msg_buffer); + #endif + LocalFree(msg_buffer); + + return(ret); +} + +NetClient_WS2::NetClient_WS2() +{ + WORD requested_version; + WSADATA wsa_data; + + requested_version = MAKEWORD(2, 2); + + if(WSAStartup(requested_version, &wsa_data) != 0) + { + int errcode = WSAGetLastError(); + + throw MDFN_Error(0, _("WSAStartup() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + + if(wsa_data.wVersion < 0x202) + { + WSACleanup(); + throw MDFN_Error(0, _("Suitable version of Winsock not found.")); + } + + sd = new SOCKET; + *(SOCKET*)sd = INVALID_SOCKET; +} + +NetClient_WS2::~NetClient_WS2() +{ + Disconnect(); + delete (SOCKET*)sd; + + WSACleanup(); +} + +void NetClient_WS2::Connect(const char *host, unsigned int port) +{ + { + struct addrinfo hints; + struct addrinfo *result; + int rv; + char service[64]; + + *(SOCKET*)sd = INVALID_SOCKET; + + snprintf(service, sizeof(service), "%u", port); + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_ADDRCONFIG; + hints.ai_protocol = 0; + + if((rv = getaddrinfo(host, service, &hints, &result)) != 0) + { + int errcode = WSAGetLastError(); + + throw MDFN_Error(0, _("getaddrinfo() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + + for(int tryit = 0; tryit < 2; tryit++) // Quick hackish way to "sort" IPv4 ahead of everything else. + { + for(struct addrinfo *rp = result; rp != NULL; rp = rp->ai_next) + { + //printf("%u\n", rp->ai_family); + if(tryit == 0 && rp->ai_family != AF_INET) + continue; + + *(SOCKET *)sd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + if(*(SOCKET *)sd == INVALID_SOCKET) + { + int errcode = WSAGetLastError(); + + freeaddrinfo(result); + + throw MDFN_Error(0, _("socket() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + + if(connect(*(SOCKET*)sd, rp->ai_addr, rp->ai_addrlen) != 0) + { + int errcode = WSAGetLastError(); + + freeaddrinfo(result); + + closesocket(*(SOCKET *)sd); + *(SOCKET *)sd = INVALID_SOCKET; + + throw MDFN_Error(0, _("connect() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + goto BreakOut; + } + } + + BreakOut: ; + + freeaddrinfo(result); + result = NULL; + + if(*(SOCKET *)sd == INVALID_SOCKET) + { + throw MDFN_Error(0, "BOOGA BOOGA"); + } + } + + { + BOOL tcpopt = 1; + if(setsockopt(*(SOCKET*)sd, IPPROTO_TCP, TCP_NODELAY, (char*)&tcpopt, sizeof(BOOL)) == SOCKET_ERROR) + { + int errcode = WSAGetLastError(); + + closesocket(*(SOCKET *)sd); + *(SOCKET *)sd = INVALID_SOCKET; + + throw MDFN_Error(0, _("setsockopt() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + } + + { + unsigned long nbv = 1; + DWORD numbytesout = 0; + + if(WSAIoctl(*(SOCKET*)sd, FIONBIO, &nbv, sizeof(nbv), NULL, 0, &numbytesout, NULL, NULL) == SOCKET_ERROR) + { + int errcode = WSAGetLastError(); + + closesocket(*(SOCKET *)sd); + *(SOCKET *)sd = INVALID_SOCKET; + + throw MDFN_Error(0, _("WSAIoctl() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + } +} + +void NetClient_WS2::Disconnect(void) +{ + if(*(SOCKET *)sd != INVALID_SOCKET) + { + //shutdown(*(SOCKET*)sd, SHUT_RDWR); // TODO: investigate usage scenarios + closesocket(*(SOCKET *)sd); + *(SOCKET *)sd = INVALID_SOCKET; + } +} + +bool NetClient_WS2::IsConnected(void) +{ + if(*(SOCKET *)sd == INVALID_SOCKET) + return(false); + + return(true); +} + +bool NetClient_WS2::CanSend(int32 timeout) +{ + int rv; + fd_set wfds; + struct timeval tv; + + FD_ZERO(&wfds); + FD_SET(*(SOCKET*)sd, &wfds); + + tv.tv_sec = timeout / (1000 * 1000); + tv.tv_usec = timeout % (1000 * 1000); + + rv = select(-1, NULL, &wfds, NULL, &tv); + + if(rv == -1) + { + int errcode = WSAGetLastError(); + + throw MDFN_Error(0, _("select() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + + return (bool)rv; +} + +bool NetClient_WS2::CanReceive(int32 timeout) +{ + int rv; + fd_set rfds; + struct timeval tv; + + FD_ZERO(&rfds); + FD_SET(*(SOCKET*)sd, &rfds); + + tv.tv_sec = timeout / (1000 * 1000); + tv.tv_usec = timeout % (1000 * 1000); + + rv = select(-1, &rfds, NULL, NULL, (timeout == -1) ? NULL : &tv); + + if(rv == -1) + { + int errcode = WSAGetLastError(); + + throw MDFN_Error(0, _("select() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + + return (bool)rv; +} + +uint32 NetClient_WS2::Send(const void *data, uint32 len) +{ + int rv; + + rv = send(*(SOCKET*)sd, (const char *)data, len, 0); + + if(rv < 0) + { + int errcode = WSAGetLastError(); + if(errcode != WSAEWOULDBLOCK && errcode != WSAEINTR) + { + throw MDFN_Error(0, _("send() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + return(0); + } + + return rv; +} + +uint32 NetClient_WS2::Receive(void *data, uint32 len) +{ + int rv; + + rv = recv(*(SOCKET*)sd, (char *)data, len, 0); + + if(rv < 0) + { + int errcode = WSAGetLastError(); + if(errcode != WSAEWOULDBLOCK && errcode != WSAEINTR) + { + throw MDFN_Error(0, _("recv() failed: %d %s"), errcode, ErrCodeToString(errcode).c_str()); + } + return(0); + } + else if(rv == 0) + { + throw MDFN_Error(0, _("recv() failed: peer has closed connection")); + } + + return rv; +} + diff --git a/Mednafen/mednafen/drivers/NetClient_WS2.h b/Mednafen/mednafen/drivers/NetClient_WS2.h new file mode 100644 index 0000000000..41b4462b55 --- /dev/null +++ b/Mednafen/mednafen/drivers/NetClient_WS2.h @@ -0,0 +1,31 @@ +#ifndef __MDFN_DRIVERS_NETCLIENT_WS2_H +#define __MDFN_DRIVERS_NETCLIENT_WS2_H + +#include "NetClient.h" + +class NetClient_WS2 : public NetClient +{ + public: + + NetClient_WS2(); + virtual ~NetClient_WS2(); + + virtual void Connect(const char *host, unsigned int port); + + virtual void Disconnect(void); + + virtual bool IsConnected(void); + + virtual bool CanSend(int32 timeout = 0); + virtual bool CanReceive(int32 timeout = 0); + + virtual uint32 Send(const void *data, uint32 len); + + virtual uint32 Receive(void *data, uint32 len); + + private: + + void *sd; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/README.WIN32 b/Mednafen/mednafen/drivers/README.WIN32 new file mode 100644 index 0000000000..f86886fcb9 --- /dev/null +++ b/Mednafen/mednafen/drivers/README.WIN32 @@ -0,0 +1,2 @@ +Remember to use: __attribute__((force_align_arg_pointer)); +on callback functions from the SDL and Win32 APIs! diff --git a/Mednafen/mednafen/drivers/args.cpp b/Mednafen/mednafen/drivers/args.cpp new file mode 100644 index 0000000000..41d251b7ff --- /dev/null +++ b/Mednafen/mednafen/drivers/args.cpp @@ -0,0 +1,189 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/****************************************************************/ +/* Mednafen */ +/* */ +/* This file contains code for parsing command-line */ +/* options. */ +/* */ +/****************************************************************/ + +#include + +#include +#include +#include + +#include "args.h" + +static int ParseEA(int x, int argc, char *argv[], ARGPSTRUCT *argsps) +{ + int y=0; + int ret = 0; + + do + { + if(!argsps[y].name) + { + int tmpie = ParseEA(x,argc,argv,(ARGPSTRUCT*)argsps[y].var); + if(-1 == tmpie) return(-1); + ret += tmpie; + y++; + if(ret) + return(ret); + continue; + } + if((argv[x][0] == '-' && argv[x][1] == '-' && !strcmp(argv[x]+2,argsps[y].name)) || + (argv[x][0] == '-' && !strcmp(argv[x]+1, argsps[y].name)) ) // A match. + { + ret++; + + if(argsps[y].subs) + { + if((x+1)>=argc) + // || argv[x+1][0] == '-') // Breaks negative numbers! + { + printf("Argument %s requires a parameter!\n", argsps[y].name); + return(-1); + } + + if(argsps[y].substype&0x2000) // Function + { + int funcretval = ((int (*)(const char *, const char *))argsps[y].subs)(argsps[y].name, argv[x+1]); + if(!funcretval) + { + //printf("Invalid parameter \"%s\" to argument \"%s\"!\n", argv[x+1], argsps[y].name); + return(-1); + } + } + + ret++; + + if(argsps[y].substype&0x8000) // Bool + { + *(int *)argsps[y].subs&=~(argsps[y].substype&(~0x8000)); + *(int *)argsps[y].subs|=atoi(argv[x+1])?(argsps[y].substype&(~0x8000)):0; + } + else // Value + switch(argsps[y].substype&(~0x4000)) + { + case SUBSTYPE_INTEGER: + { + char *endptr = NULL; + *(int *)argsps[y].subs = strtol(argv[x+1], &endptr, 10); + if(endptr == argv[x+1] || endptr[0] != 0) + { + printf("Argument %s requires a valid integer, not: %s\n", argv[x], argv[x+1]); + return(-1); + } + } + break; + + case SUBSTYPE_DOUBLE: + { + char *endptr = NULL; + *(double *)argsps[y].subs = strtod(argv[x+1], &endptr); + if(endptr == argv[x+1] || endptr[0] != 0) + { + printf("Argument %s requires a valid decimal number, not: %s\n", argv[x], argv[x+1]); + return(-1); + } + } + break; + + case SUBSTYPE_STRING: // String + if(argsps[y].substype&0x4000) + { + if(*(char **)argsps[y].subs) + free(*(char **)argsps[y].subs); + if(!( *(char **)argsps[y].subs=(char*)malloc(strlen(argv[x+1])+1) )) + break; + } + strcpy(*(char **)argsps[y].subs,argv[x+1]); + break; + } + } + if(argsps[y].var) + *argsps[y].var=1; + return(ret); + } + y++; + } while(argsps[y].var || argsps[y].subs); + + return(0); +} + +int ParseArguments(int argc, char *argv[], ARGPSTRUCT *argsps, char **first_not) +{ + int x = 0; + + while(xvar || argsps->subs) + { + if(!argsps->name) + { + if(show_linked) + ShowArgumentsHelpSub((ARGPSTRUCT *)argsps->var, show_linked); + } + else + { + if(argsps->description) + { + if(argsps->subs) + printf(" -%s \n\t%s\n", argsps->name, argsps->description); + else + printf(" -%s\n\t%s\n", argsps->name, argsps->description); + } + } + argsps++; + } + +} + +int ShowArgumentsHelp(ARGPSTRUCT *argsps, bool show_linked) +{ + printf("\nOptions:\n\n"); + + ShowArgumentsHelpSub(argsps, show_linked); + + return(1); +} diff --git a/Mednafen/mednafen/drivers/args.h b/Mednafen/mednafen/drivers/args.h new file mode 100644 index 0000000000..07499a15b7 --- /dev/null +++ b/Mednafen/mednafen/drivers/args.h @@ -0,0 +1,27 @@ +#ifndef _DRIVERS_ARGH + +enum +{ + SUBSTYPE_INTEGER = 0, + SUBSTYPE_STRING = 1, + SUBSTYPE_DOUBLE = 2, + + SUBSTYPE_FUNCTION = 0x2000, + + SUBSTYPE_STRING_ALLOC = 0x4001, +}; + +typedef struct { + const char *name; + const char *description; + int *var; + + void *subs; + int substype; +} ARGPSTRUCT; + +int ParseArguments(int argc, char *argv[], ARGPSTRUCT *argsps, char **); +int ShowArgumentsHelp(ARGPSTRUCT *argsps, bool show_linked = true); + +#define _DRIVERS_ARGH +#endif diff --git a/Mednafen/mednafen/drivers/cheat.cpp b/Mednafen/mednafen/drivers/cheat.cpp new file mode 100644 index 0000000000..1d3b4884b7 --- /dev/null +++ b/Mednafen/mednafen/drivers/cheat.cpp @@ -0,0 +1,931 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include +#include +#include "console.h" +#include +#include + +static MDFN_Thread *CheatThread = NULL; +static MDFN_Mutex *CheatMutex = NULL; +static MDFN_Cond *CheatCond = NULL; +static bool isactive = 0; +static char * volatile pending_text = NULL; +static bool volatile need_thread_exit; + +class CheatConsoleT : public MDFNConsole +{ + public: + + CheatConsoleT(void) + { + SetShellStyle(1); + SetFont(MDFN_FONT_9x18_18x18); + } + + virtual bool TextHook(const std::string &text) override + { + char* tmp_ptr = strdup(text.c_str()); + + MDFND_LockMutex(CheatMutex); + if(!pending_text) + { + pending_text = tmp_ptr; + MDFND_SignalCond(CheatCond); + } + MDFND_UnlockMutex(CheatMutex); + + return(1); + } + + void Draw(MDFN_Surface *surface, const MDFN_Rect *src_rect) + { + MDFND_LockMutex(CheatMutex); + MDFNConsole::Draw(surface, src_rect); + MDFND_UnlockMutex(CheatMutex); + } + + void WriteLine(const std::string &text) + { + MDFND_LockMutex(CheatMutex); + MDFNConsole::WriteLine(text); + MDFND_UnlockMutex(CheatMutex); + } + + void AppendLastLine(const std::string &text) + { + MDFND_LockMutex(CheatMutex); + MDFNConsole::AppendLastLine(text); + MDFND_UnlockMutex(CheatMutex); + } +}; + +static CheatConsoleT CheatConsole; + +static void CHEAT_printf(const char *format, ...) +{ + char temp[2048]; + + va_list ap; + + va_start(ap, format); + trio_vsnprintf(temp, 2048, format, ap); + va_end(ap); + + CheatConsole.WriteLine(temp); +} + +static void CHEAT_puts(const char *string) +{ + CheatConsole.WriteLine(string); +} + +static void CHEAT_gets(char *s, int size) +{ + char* lpt = NULL; + + // + // + // + MDFND_LockMutex(CheatMutex); + while(!pending_text && !need_thread_exit) + { + MDFND_WaitCond(CheatCond, CheatMutex); + } + + lpt = pending_text; + pending_text = NULL; + MDFND_UnlockMutex(CheatMutex); + // + // + // + + if(lpt) + { + strncpy(s, lpt, size - 1); + s[size - 1] = 0; + free(lpt); + + CheatConsole.AppendLastLine(s); + } + + if(need_thread_exit) + { + puts("WHEEE"); + throw(0); // Sloppy laziness, but it works! SWEAT PANTS OF PRAGMATISM. + } +} + +static char CHEAT_getchar(char def) +{ + uint8 buf[2]; + + CHEAT_gets((char *)buf, 2); + if(buf[0] == 0) + return(def); + return(buf[0]); +} + + +static void GetString(char *s, int max) +{ + CHEAT_gets(s, max); + MDFN_trim(s); +} + +static uint64 GetUI(uint64 def) +{ + char buf[64]; + + memset(buf, 0, sizeof(buf)); + + CHEAT_gets(buf,64); + + if(!buf[0]) + return(def); + + if(buf[0] == '$') + trio_sscanf(buf + 1, "%llx", &def); // $0FCE + else if(buf[0] == '0' && tolower(buf[1]) == 'x') + trio_sscanf(buf + 2, "%llx", &def); // 0x0FCE + else if(tolower(buf[strlen(buf) - 1]) == 'h') // 0FCEh + trio_sscanf(buf, "%llx", &def); + else + trio_sscanf(buf,"%lld", &def); + + return def; +} + + +static int GetYN(int def) +{ + char buf[32]; + + CHEAT_printf("(Y/N)[%s]: ", def ? "Y" : "N"); + CHEAT_gets(buf, 32); + + if(buf[0] == 'y' || buf[0] == 'Y') + return(1); + + if(buf[0] == 'n' || buf[0] == 'N') + return(0); + + return(def); +} + +/* +** Begin list code. +** +*/ +static int listcount; +static int listids[10]; +static int listsel; +static int mordoe; + +void BeginListShow(void) +{ + listcount=0; + listsel=-1; + mordoe=0; +} + +/* Hmm =0 for in list choices, hmm=1 for end of list choices. */ +/* Return equals 0 to continue, -1 to stop, otherwise a number. */ +int ListChoice(int hmm) +{ + char buf[32]; + + if(!hmm) + { + int num=0; + + tryagain: + CHEAT_printf(" <'Enter' to continue, (S)top, or #> "); + CHEAT_gets(buf,32); + + if(buf[0]=='s' || buf[0]=='S') return(-1); + if(!buf[0]) return(0); + if(!trio_sscanf(buf,"%d",&num)) + return(0); + if(num<1) goto tryagain; + return(num); + } + else + { + int num=0; + + tryagain2: + CHEAT_printf(" <'Enter' to make no selection, or #> "); + CHEAT_gets(buf,32); + if(!buf[0]) return(0); + if(!trio_sscanf(buf,"%d",&num)) + return(0); + if(num<1) goto tryagain2; + return(num); + } +} + +int EndListShow(void) +{ + if(mordoe) + { + int r=ListChoice(1); + if(r>0 && r<=listcount) + listsel=listids[r-1]; + } + return(listsel); +} + +/* Returns 0 to stop listing, 1 to continue. */ +int AddToList(const char *text, uint32 id, const char* second_text = NULL) +{ + if(listcount==10) + { + int t=ListChoice(0); + mordoe=0; + + if(t==-1) return(0); // Stop listing. + else if(t>0 && t<11) + { + listsel=listids[t-1]; + return(0); + } + listcount=0; + } + mordoe = 1; + listids[listcount] = id; + CHEAT_printf("%2d) %s",listcount+1,text); + + if(second_text != NULL) + CHEAT_printf(" %s", second_text); + + listcount++; + return(1); +} + +/* +** +** End list code. +**/ + +struct MENU +{ + MENU(const char* t, void (*f)(void*), std::vector* m, void* d = NULL); + ~MENU(); + + std::string text; + void (*func_action)(void*); + std::vector* menu_action; + void* data; +}; + +MENU::MENU(const char* t, void (*f)(void*), std::vector* m, void* d) +{ + text = std::string(t); + func_action = f; + menu_action = m; + data = d; +} + +MENU::~MENU() +{ + +} + +static void SetOC(void* data) +{ + MDFNI_CheatSearchSetCurrentAsOriginal(); +} + +static void UnhideEx(void* data) +{ + MDFNI_CheatSearchShowExcluded(); +} + +static void ToggleCheat(int num) +{ + CHEAT_printf("Cheat %d %sabled.",1+num, + MDFNI_ToggleCheat(num)?"en":"dis"); +} + +static MemoryPatch GetCheatFields(const MemoryPatch &pin) +{ + MemoryPatch patch = pin; + char buf[256]; + const bool support_read_subst = CurGame->InstallReadPatch && CurGame->RemoveReadPatches; + + CHEAT_printf("Name [%s]: ", patch.name.c_str()); + GetString(buf, 256); + if(buf[0] != 0) + patch.name = std::string(buf); + + CHEAT_printf("Available types:"); + CHEAT_printf(" R - Replace/RAM write(high-level)."); + CHEAT_printf(" A - Addition/RAM read->add->write(high-level)."); + CHEAT_printf(" T - Transfer/RAM copy(high-level)."); + + if(support_read_subst) + { + CHEAT_printf(" S - Subsitute on reads."); + CHEAT_printf(" C - Substitute on reads, with compare."); + } + + for(;;) + { + CHEAT_printf("Type [%c]: ", patch.type); + patch.type = toupper(CHEAT_getchar(patch.type)); + + if(patch.type == 'R' || patch.type == 'A' || patch.type == 'T') + break; + + if(support_read_subst && (patch.type == 'S' || patch.type == 'C')) + break; + } + + if(patch.type == 'T') + { + CHEAT_printf("Source address [$%08x]: ", (unsigned int)patch.copy_src_addr); + patch.copy_src_addr = GetUI(patch.copy_src_addr); + + CHEAT_printf("Source address inc [%u]: ", patch.copy_src_addr_inc); + patch.copy_src_addr_inc = GetUI(patch.copy_src_addr_inc); + + CHEAT_printf("Dest address [$%08x]: ", (unsigned int)patch.addr); + patch.addr = GetUI(patch.addr); + + CHEAT_printf("Dest address inc [%u]: ", patch.mltpl_addr_inc); + patch.mltpl_addr_inc = GetUI(patch.mltpl_addr_inc); + + CHEAT_printf("Count [%u]: ", patch.mltpl_count); + patch.mltpl_count = GetUI(patch.mltpl_count); + + } + else + { + CHEAT_printf("Address [$%08x]: ", (unsigned int)patch.addr); + patch.addr = GetUI(patch.addr); + } + + if(patch.type == 'S' || patch.type == 'C') + patch.length = 1; // TODO in the future for GBA: support lengths other than 1 in core. + else + { + do + { + if(patch.type == 'T') + { + //if(patch.length == 1 && patch.copy_src_addr_inc == 1 && patch.mltpl_addr_inc == 1) + // break; + + //if((patch.copy_src_addr_inc == patch.mltpl_addr_inc) && patch.copy_src_addr_inc >= 1 && patch.copy_src_addr_inc <= 8) + // CHEAT_printf("Transfer unit byte length should probably be \"%u\".", patch.copy_src_addr_inc); + + CHEAT_printf("Transfer unit byte length(1-8) [%u]: ", patch.length); + } + else + CHEAT_printf("Byte length(1-8) [%u]: ", patch.length); + patch.length = GetUI(patch.length); + } while(patch.length < 1 || patch.length > 8); + } + + if(patch.length > 1 && (patch.type != 'S' && patch.type != 'C')) + { + CHEAT_printf("Big endian? [%c]: ", patch.bigendian ? 'Y' : 'N'); + patch.bigendian = GetYN(patch.bigendian); + } + else + patch.bigendian = false; + + if(patch.type != 'T') + { + CHEAT_printf("Value [%03llu]: ", (unsigned long long)patch.val); + patch.val = GetUI(patch.val); + } + + // T type loop stuff is handled up above. + if((patch.type != 'C' && patch.type != 'S' && patch.type != 'T') && patch.mltpl_count != 1) + { + CHEAT_printf("Loop count [%u]: ", patch.mltpl_count); + patch.mltpl_count = GetUI(patch.mltpl_count); + + CHEAT_printf("Loop address inc [%u]: ", patch.mltpl_addr_inc); + patch.mltpl_addr_inc = GetUI(patch.mltpl_addr_inc); + + CHEAT_printf("Loop value inc [%u]: ", patch.mltpl_val_inc); + patch.mltpl_val_inc = GetUI(patch.mltpl_val_inc); + } + + + if(patch.type == 'C') + { + CHEAT_printf("Compare [%03lld]: ", patch.compare); + patch.compare = GetUI(patch.compare); + } + + if((patch.type != 'C' && patch.type != 'S') && patch.conditions.size()) + { + CHEAT_printf("Conditions: %s", patch.conditions.c_str()); // Just informational for now. + //CHEAT_printf("Conditions [%s]: ", ); + //patch.conditions = GetString(); + } + + CHEAT_printf("Enable? "); + patch.status = GetYN(patch.status); + + return(patch); +} + +static void ModifyCheat(int num) +{ + MemoryPatch patch = MDFNI_GetCheat(num); + + patch = GetCheatFields(patch); + + MDFNI_SetCheat(num, patch); +} + +static void AddCodeCheat(void* data) +{ + const CheatFormatStruct* cf = (CheatFormatStruct*)data; + char name[256],code[256]; + MemoryPatch patch; + unsigned iter = 0; + + while(1) + { + if(iter == 0) + CHEAT_printf("%s Code: ", cf->FullName); + else + CHEAT_printf("%s Code(part %u): ", cf->FullName, iter + 1); + + GetString(code, 256); + + if(code[0] == 0) + { + CHEAT_printf("Aborted."); + return; + } + + try + { + if(!cf->DecodeCheat(std::string(code), &patch)) + break; + + iter++; + } + catch(std::exception &e) + { + CHEAT_printf("Decode error: %s", e.what()); + } + } + + if(patch.name.size() == 0) + patch.name = std::string(code); + + CHEAT_printf("Name[%s]: ", patch.name.c_str()); + GetString(name, 256); + + if(name[0] != 0) + patch.name = std::string(name); + + patch.status = true; + + CHEAT_printf("Add cheat?"); + if(GetYN(true)) + { + try + { + MDFNI_AddCheat(patch); + } + catch(std::exception &e) + { + CHEAT_printf("Error adding cheat: %s", e.what()); + return; + } + CHEAT_puts("Cheat added."); + } +} + +static void AddCheatParam(uint32 A, uint64 V, unsigned int bytelen, bool bigendian) +{ + MemoryPatch patch; + + patch.addr = A; + patch.val = V; + patch.length = bytelen; + patch.bigendian = bigendian; + patch.type = 'R'; + patch.status = true; + + patch = GetCheatFields(patch); + + CHEAT_printf("Add cheat \"%s\" for address $%08x with value %llu?", patch.name.c_str(), (unsigned int)patch.addr, (unsigned long long)patch.val); + if(GetYN(true)) + { + try + { + MDFNI_AddCheat(patch); + } + catch(std::exception &e) + { + CHEAT_printf("Error adding cheat: %s", e.what()); + return; + } + CHEAT_puts("Cheat added."); + } +} + +static void AddCheat(void* data) +{ + AddCheatParam(0, 0, 1, false); +} + +static int lid; +static int clistcallb(const MemoryPatch& patch, void *data) +{ + char tmp[512]; + int ret; + + if(!lid) + { + CHEAT_printf(" /---------------------------------------\\"); + CHEAT_printf(" | Type | Affected Addr Range | Name \\"); + CHEAT_printf(" |-----------------------------------------\\"); + } + + if(patch.type == 'C' || patch.type == 'S') + { + trio_snprintf(tmp, 512, "%c %c | $%08x | %s", patch.status ? '*' : ' ', patch.type, patch.addr, patch.name.c_str()); + //trio_snprintf(tmp, 512, "%s %c $%08x:%lld:%lld - %s", patch.status ? "*" : " ", patch.type, patch.addr, patch.val, patch.compare, patch.name.c_str()); + } + else + { + uint32 sa = patch.addr; + uint32 ea = patch.addr + ((patch.mltpl_count - 1) * patch.mltpl_addr_inc) + (patch.length - 1); + + if(patch.mltpl_count == 0 || patch.length == 0) + trio_snprintf(tmp, 512, "%c %c%s | | %s", patch.status ? '*' : ' ', patch.type, patch.conditions.size() ? "+CC" : " ", patch.name.c_str()); + else + { + if(sa == ea) + trio_snprintf(tmp, 512, "%c %c%s | $%08x | %s", patch.status ? '*' : ' ', patch.type, patch.conditions.size() ? "+CC" : " ", sa, patch.name.c_str()); + else + trio_snprintf(tmp, 512, "%c %c%s | $%08x-$%08x | %s", patch.status ? '*' : ' ', patch.type, patch.conditions.size() ? "+CC" : " ", sa, ea, patch.name.c_str()); + } + } + + ret = AddToList(tmp, lid); + lid++; + return(ret); +} + +static void ListCheats(void* data) +{ + int which; + lid=0; + + BeginListShow(); + MDFNI_ListCheats(clistcallb,0); + which=EndListShow(); + if(which>=0) + { + char tmp[32]; + CHEAT_printf(" <(T)oggle status, (M)odify, or (D)elete this cheat.> "); + CHEAT_gets(tmp,32); + switch(tolower(tmp[0])) + { + case 't':ToggleCheat(which); + break; + + case 'd': + try + { + MDFNI_DelCheat(which); + } + catch(std::exception &e) + { + CHEAT_printf("Error deleting cheat: %s", e.what()); + break; + } + CHEAT_puts("Cheat has been deleted."); + break; + + case 'm':ModifyCheat(which); + break; + } + } +} + +static void ResetSearch(void* data) +{ + MDFNI_CheatSearchBegin(); + CHEAT_puts("Done."); +} + +static unsigned int searchbytelen = 1; +static bool searchbigendian = 0; + +static int srescallb(uint32 a, uint64 last, uint64 current, void *data) +{ + char tmp[256]; + + if(searchbytelen == 8) + trio_snprintf(tmp, 256, "$%08x:%020llu:%020llu",(unsigned int)a,(unsigned long long)last,(unsigned long long)current); + if(searchbytelen == 7) + trio_snprintf(tmp, 256, "$%08x:%017llu:%017llu",(unsigned int)a,(unsigned long long)last,(unsigned long long)current); + if(searchbytelen == 6) + trio_snprintf(tmp, 256, "$%08x:%015llu:%015llu",(unsigned int)a,(unsigned long long)last,(unsigned long long)current); + if(searchbytelen == 5) + trio_snprintf(tmp, 256, "$%08x:%013llu:%013llu",(unsigned int)a,(unsigned long long)last,(unsigned long long)current); + if(searchbytelen == 4) + trio_snprintf(tmp, 256, "$%08x:%10u:%10u",(unsigned int)a,(unsigned int)last,(unsigned int)current); + else if(searchbytelen == 3) + trio_snprintf(tmp, 256, "$%08x:%08u:%08u",(unsigned int)a,(unsigned int)last,(unsigned int)current); + else if(searchbytelen == 2) + trio_snprintf(tmp, 256, "$%08x:%05u:%05u",(unsigned int)a,(unsigned int)last,(unsigned int)current); + else if(searchbytelen == 1) + trio_snprintf(tmp, 256, "$%08x:%03u:%03u",(unsigned int)a,(unsigned int)last,(unsigned int)current); + else // > 4 + trio_snprintf(tmp, 256, "$%08x:%020llu:%020llu",(unsigned int)a,(unsigned long long)last,(unsigned long long)current); + return(AddToList(tmp,a)); +} + +static void ShowRes(void* data) +{ + int n=MDFNI_CheatSearchGetCount(); + CHEAT_printf(" %d results:",n); + if(n) + { + int which; + BeginListShow(); + MDFNI_CheatSearchGet(srescallb, 0); + which=EndListShow(); + if(which>=0) + AddCheatParam(which,0, searchbytelen, searchbigendian); + } +} + +static int ShowShortList(const char *moe[], unsigned int n, int def) +{ + unsigned int x; + int c; + unsigned int baa; + char tmp[256]; + + red: + for(x=0;x ",def+1); + CHEAT_gets(tmp,256); + if(!tmp[0]) + return def; + c=tolower(tmp[0]); + baa=c-'1'; + + if(baa 1) + { + CHEAT_printf("Big endian? [%c]: ", searchbigendian ? 'Y' : 'N'); + searchbigendian = GetYN(searchbigendian); + } + else + searchbigendian = 0; + + MDFNI_CheatSearchEnd(method, v1, v2, searchbytelen, searchbigendian); + CHEAT_puts("Search completed."); +} + +static void DoMenu(const std::vector& men, bool topmost = 0) +{ + bool MenuLoop = TRUE; + + while(MenuLoop) + { + int x; + + CHEAT_puts(""); + + for(x = 0; x < (int)men.size(); x++) + CHEAT_printf("%d) %s", x + 1, men[x].text.c_str()); + + CHEAT_puts("D) Display Menu"); + + if(!topmost) + CHEAT_puts("X) Return to Previous"); + + bool CommandLoop = TRUE; + + while(CommandLoop) + { + char buf[32]; + int c, c_numeral; + + CHEAT_printf("Command> "); + CHEAT_gets(buf,32); + + c = tolower(buf[0]); + if(c == 0) + continue; + else if(c == 'd') + { + CommandLoop = FALSE; + } + else if(c == 'x' && !topmost) + { + CommandLoop = FALSE; + MenuLoop = FALSE; + } + else if(trio_sscanf(buf, "%d", &c_numeral) == 1 && c_numeral <= x && c_numeral >= 1) + { + assert(!(men[c_numeral - 1].func_action && men[c_numeral - 1].menu_action)); + + if(men[c_numeral - 1].func_action) + men[c_numeral - 1].func_action(men[c_numeral - 1].data); + else if(men[c_numeral - 1].menu_action) + DoMenu(*men[c_numeral - 1].menu_action); /* Mmm...recursivey goodness. */ + + CommandLoop = FALSE; + } + else + { + CHEAT_puts("Invalid command."); + } + } // while(CommandLoop) + } // while(MenuLoop) +} + +int CheatLoop(void *arg) +{ + std::vector NewCheatsMenu; + std::vector MainMenu; + + NewCheatsMenu.push_back( MENU(_("Add Cheat"), AddCheat, NULL) ); + NewCheatsMenu.push_back( MENU(_("Reset Search"), ResetSearch, NULL) ); + NewCheatsMenu.push_back( MENU(_("Do Search"), DoSearch, NULL) ); + NewCheatsMenu.push_back( MENU(_("Set Original to Current"), SetOC, NULL) ); + NewCheatsMenu.push_back( MENU(_("Unhide Excluded"), UnhideEx, NULL) ); + NewCheatsMenu.push_back( MENU(_("Show Results"), ShowRes, NULL) ); + + MainMenu.push_back( MENU(_("List Cheats"), ListCheats, NULL) ); + MainMenu.push_back( MENU(_("Cheat Search..."), NULL, &NewCheatsMenu) ); + + if(CurGame->CheatFormatInfo != NULL) + { + for(unsigned i = 0; i < CurGame->CheatFormatInfo->NumFormats; i++) + { + char buf[256]; + trio_snprintf(buf, 256, _("Add %s Code"), CurGame->CheatFormatInfo->Formats[i].FullName); + + MainMenu.push_back( MENU(buf, AddCodeCheat, NULL, (void*)&CurGame->CheatFormatInfo->Formats[i]) ); + } + } + + try + { + DoMenu(MainMenu, 1); + } + catch(...) + { + + } + + return(1); +} + +void CheatIF_GT_Show(bool show) +{ + if(!CheatMutex) + CheatMutex = MDFND_CreateMutex(); + + if(!CheatCond) + CheatCond = MDFND_CreateCond(); + + PauseGameLoop(show); + if(show) + { + if(!CheatThread) + { + need_thread_exit = false; + CheatThread = MDFND_CreateThread(CheatLoop, NULL); + } + } + isactive = show; +} + +bool CheatIF_Active(void) +{ + return(isactive); +} + +void CheatIF_MT_Draw(MDFN_Surface *surface, const MDFN_Rect *src_rect) +{ + if(!isactive) + return; + + if(src_rect->w < 342 || src_rect->h < 342) + CheatConsole.SetFont(MDFN_FONT_5x7); + else if(src_rect->w < 512 || src_rect->h < 480) + CheatConsole.SetFont(MDFN_FONT_6x13_12x13); + else + CheatConsole.SetFont(MDFN_FONT_9x18_18x18); + + + CheatConsole.Draw(surface, src_rect); +} + +int CheatIF_MT_EventHook(const SDL_Event *event) +{ + if(!isactive) return(1); + + return(CheatConsole.Event(event)); +} + +#if 0 +// TODO: +void CheatIF_Kill(void) +{ + if(CheatThread != NULL) + { + MDFND_LockMutex(CheatMutex); + need_thread_exit = true; + MDFND_SignalCond(CheatCond); + MDFND_UnlockMutex(CheatMutex); + + MDFND_WaitThread(CheatThread, NULL); + } + + if(CheatCond != NULL) + { + MDFND_DestroyCond(CheatCond); + CheatCond = NULL; + } + + if(CheatMutex != NULL) + { + MDFND_DestroyMutex(CheatMutex); + CheatMutex = NULL; + } + + if(pending_text) + { + free(pending_text); + pending_text = NULL; + } +} +#endif diff --git a/Mednafen/mednafen/drivers/cheat.h b/Mednafen/mednafen/drivers/cheat.h new file mode 100644 index 0000000000..b57a0c4cd6 --- /dev/null +++ b/Mednafen/mednafen/drivers/cheat.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_DRIVERS_CHEAT_H +#define __MDFN_DRIVERS_CHEAT_H + +void CheatIF_GT_Show(bool show); +bool CheatIF_Active(void); +void CheatIF_MT_Draw(MDFN_Surface *surface, const MDFN_Rect *src_rect); +int CheatIF_MT_EventHook(const SDL_Event *event); + +#endif diff --git a/Mednafen/mednafen/drivers/console.cpp b/Mednafen/mednafen/drivers/console.cpp new file mode 100644 index 0000000000..a866d511de --- /dev/null +++ b/Mednafen/mednafen/drivers/console.cpp @@ -0,0 +1,297 @@ +#include "main.h" +#include "console.h" +#include +#include "nongl.h" + +MDFNConsole::MDFNConsole(bool setshellstyle, unsigned setfont) +{ + prompt_visible = TRUE; + shellstyle = setshellstyle; + Scrolled = 0; + Font = setfont; + opacity = 0xC0; +} + +MDFNConsole::~MDFNConsole() +{ + kb_cursor_pos = 0; +} + +bool MDFNConsole::TextHook(const std::string &text) +{ + WriteLine(text); + + return(1); +} + +void MDFNConsole::Scroll(int32 amount, bool SetPos) +{ + if(SetPos) + { + // Scroll to the beginning + if(amount == 0) + { + //Scrolled = + } + else // Scroll to the end + { + Scrolled = 0; + } + } + else + { + int64 ts = Scrolled; + ts += amount; + + if(ts < 0) + ts = 0; + Scrolled = ts; + } +} + +#include +int MDFNConsole::Event(const SDL_Event *event) +{ + switch(event->type) + { + case SDL_KEYDOWN: + if(event->key.keysym.mod & KMOD_ALT) + break; + switch(event->key.keysym.sym) + { + case SDLK_HOME: + if(event->key.keysym.mod & KMOD_SHIFT) + { + Scroll(0, TRUE); // Scroll to the beginning + } + else + kb_cursor_pos = 0; + break; + case SDLK_END: + if(event->key.keysym.mod & KMOD_SHIFT) + { + Scroll(-1, TRUE); // Scroll to the end + } + else + kb_cursor_pos = kb_buffer.size(); + break; + case SDLK_LEFT: + if(kb_cursor_pos) + kb_cursor_pos--; + break; + case SDLK_RIGHT: + if(kb_cursor_pos < kb_buffer.size()) + kb_cursor_pos++; + break; + + case SDLK_UP: + if(event->key.keysym.mod & KMOD_SHIFT) + Scroll(1); + else + { + + } + break; + case SDLK_DOWN: + if(event->key.keysym.mod & KMOD_SHIFT) + { + Scroll(-1); + } + else + { + + } + break; + + case SDLK_RETURN: + { + std::string concat_str; + for(unsigned int i = 0; i < kb_buffer.size(); i++) + concat_str += kb_buffer[i]; + + TextHook(strdup(concat_str.c_str())); + kb_buffer.clear(); + kb_cursor_pos = 0; + } + break; + case SDLK_BACKSPACE: + if(kb_buffer.size() && kb_cursor_pos) + { + kb_buffer.erase(kb_buffer.begin() + kb_cursor_pos - 1, kb_buffer.begin() + kb_cursor_pos); + kb_cursor_pos--; + } + break; + case SDLK_DELETE: + if(kb_buffer.size() && kb_cursor_pos < kb_buffer.size()) + { + kb_buffer.erase(kb_buffer.begin() + kb_cursor_pos, kb_buffer.begin() + kb_cursor_pos + 1); + } + break; + default: + if(event->key.keysym.unicode >= 0x20) + { + uint8 utf8_buffer[8]; + UTF8 *dest_ptr = utf8_buffer; + memset(utf8_buffer, 0, sizeof(utf8_buffer)); + const UTF16 *start_utf16 = &event->key.keysym.unicode; + ConvertUTF16toUTF8(&start_utf16, (UTF16 *)&event->key.keysym.unicode + 1, &dest_ptr, &utf8_buffer[8], lenientConversion); + kb_buffer.insert(kb_buffer.begin() + kb_cursor_pos, std::string((char *)utf8_buffer)); + kb_cursor_pos++; + } + break; + } + break; + } + return(1); +} + +#define MK_COLOR_A(r,g,b,a) (pf_cache.MakeColor(r,g,b,a)) + +void MDFNConsole::Draw(MDFN_Surface *surface, const MDFN_Rect *src_rect) +{ + const MDFN_PixelFormat pf_cache = surface->format; + uint32 pitch32 = surface->pitchinpix; + uint32 w = src_rect->w; + uint32 h = src_rect->h; + uint32 *pixels = surface->pixels + src_rect->x + src_rect->y * pitch32; + const unsigned int EffFont = Font; + const unsigned int font_height = GetFontHeight(EffFont); + + MDFN_Surface *tmp_surface = new MDFN_Surface(NULL, 1024, font_height + 1, 1024, surface->format); + + for(unsigned int y = 0; y < h; y++) + { + uint32 *row = pixels + y * pitch32; + for(unsigned int x = 0; x < w; x++) + { + //printf("%d %d %d\n", y, x, pixels); + row[x] = MK_COLOR_A(0, 0, 0, opacity); + //row[x] = MK_COLOR_A(0x00, 0x00, 0x00, 0x7F); + } + } + int32 destline; + int32 vec_index = TextLog.size() - 1; + + if(vec_index > 0) + { + vec_index -= Scrolled; + } + + destline = ((h - font_height) / font_height) - 1; + + if(shellstyle) + vec_index--; + else if(!prompt_visible) + { + destline = (h / font_height) - 1; + //vec_index--; + } + + while(destline >= 0 && vec_index >= 0) + { + int32 pw = GetTextPixLength(TextLog[vec_index].c_str(), EffFont) + 1; + + if(pw > tmp_surface->w) + { + delete tmp_surface; + tmp_surface = new MDFN_Surface(NULL, pw, font_height + 1, pw, surface->format); + } + + tmp_surface->Fill(0, 0, 0, opacity); + DrawTextTransShadow(tmp_surface->pixels, tmp_surface->pitchinpix << 2, tmp_surface->w, TextLog[vec_index].c_str(), MK_COLOR_A(0xff, 0xff, 0xff, 0xFF), MK_COLOR_A(0x00, 0x00, 0x01, 0xFF), 0, EffFont); + int32 numlines = (uint32)ceil((double)pw / w); + + while(numlines > 0 && destline >= 0) + { + int32 offs = (numlines - 1) * w; + MDFN_Rect tmp_rect, dest_rect; + tmp_rect.x = offs; + tmp_rect.y = 0; + tmp_rect.h = font_height; + tmp_rect.w = (pw - offs) > (int32)w ? w : pw - offs; + + dest_rect.x = src_rect->x; + dest_rect.y = src_rect->y + destline * font_height; + dest_rect.w = tmp_rect.w; + dest_rect.h = tmp_rect.h; + + MDFN_StretchBlitSurface(tmp_surface, &tmp_rect, surface, &dest_rect); + numlines--; + destline--; + } + vec_index--; + } + delete tmp_surface; + + if(prompt_visible) + { + std::string concat_str; + + if(shellstyle) + { + int t = TextLog.size() - 1; + if(t >= 0) + concat_str = TextLog[t]; + else + concat_str = ""; + } + else + concat_str = "#>"; + for(unsigned int i = 0; i < kb_buffer.size(); i++) + { + if(i == kb_cursor_pos && (SDL_GetTicks() & 0x100)) + concat_str += "▉"; + else + concat_str += kb_buffer[i]; + } + + if(kb_cursor_pos == kb_buffer.size()) + { + if(SDL_GetTicks() & 0x100) + concat_str += "▉"; + else + concat_str += " "; + } + + { + uint32 nw = GetTextPixLength(concat_str.c_str()) + 1; + tmp_surface = new MDFN_Surface(NULL, nw, font_height + 1, nw, surface->format); + tmp_surface->Fill(0, 0, 0, opacity); + } + + MDFN_Rect tmp_rect, dest_rect; + + tmp_rect.w = DrawTextTransShadow(tmp_surface->pixels, tmp_surface->pitchinpix << 2, tmp_surface->w, concat_str.c_str(),MK_COLOR_A(0xff, 0xff, 0xff, 0xff), MK_COLOR_A(0x00, 0x00, 0x01, 0xFF), 0, EffFont); + tmp_rect.h = dest_rect.h = font_height; + tmp_rect.x = 0; + tmp_rect.y = 0; + + if(tmp_rect.w >= w) + { + tmp_rect.x = tmp_rect.w - w; + tmp_rect.w -= tmp_rect.x; + } + dest_rect.w = tmp_rect.w; + dest_rect.x = src_rect->x; + dest_rect.y = src_rect->y + h - (font_height + 1); + + MDFN_StretchBlitSurface(tmp_surface, &tmp_rect, surface, &dest_rect); + delete tmp_surface; + } +} + +void MDFNConsole::WriteLine(const std::string &text) +{ + TextLog.push_back(text); +} + +void MDFNConsole::AppendLastLine(const std::string &text) +{ + if(TextLog.size()) // Should we throw an exception if this isn't true? + TextLog[TextLog.size() - 1] += text; +} + +void MDFNConsole::ShowPrompt(bool shown) +{ + prompt_visible = shown; +} diff --git a/Mednafen/mednafen/drivers/console.h b/Mednafen/mednafen/drivers/console.h new file mode 100644 index 0000000000..89d984a0ba --- /dev/null +++ b/Mednafen/mednafen/drivers/console.h @@ -0,0 +1,32 @@ +#include +#include + +class MDFNConsole +{ + public: + MDFNConsole(bool shellstyle = 0, unsigned setfont = MDFN_FONT_9x18_18x18); + ~MDFNConsole(); + + void ShowPrompt(bool shown); + void Draw(MDFN_Surface *surface, const MDFN_Rect *src_rect); + + int Event(const SDL_Event *event); + + void WriteLine(const std::string &text); + void AppendLastLine(const std::string &text); + virtual bool TextHook(const std::string &text); + + void SetFont(unsigned newfont) { Font = newfont; } + void SetShellStyle(bool newsetting) { shellstyle = newsetting; } + void Scroll(int32 amount, bool SetPos = FALSE); + + private: + std::vector TextLog; + std::vector kb_buffer; + unsigned int kb_cursor_pos; + bool shellstyle; + bool prompt_visible; + uint32 Scrolled; + unsigned Font; + uint8 opacity; +}; diff --git a/Mednafen/mednafen/drivers/debugger.cpp b/Mednafen/mednafen/drivers/debugger.cpp new file mode 100644 index 0000000000..32623a423d --- /dev/null +++ b/Mednafen/mednafen/drivers/debugger.cpp @@ -0,0 +1,1915 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include +#include +#include +#include "debugger.h" +#include "gfxdebugger.h" +#include "memdebugger.h" +#include "logdebugger.h" +#include "prompt.h" +#include "video.h" + +static MemDebugger* memdbg = NULL; +static FILE *TraceLog = NULL; +static std::string TraceLogSpec; +static int64 TraceLogEnd; +static unsigned TraceLogRTO; + +static bool NeedInit; +static bool WatchLogical; // Watch logical memory addresses, not physical +static bool IsActive; +static bool CompactMode = FALSE; + +static unsigned int WhichMode; // 0 = normal, 1 = gfx, 2 = memory + +static bool NeedPCBPToggle; +static int NeedStep; // 0 =, 1 = , 2 = +static int NeedRun; +static bool InSteppingMode; + +static std::vector PCBreakPoints; +static std::string ReadBreakpoints, IOReadBreakpoints, AuxReadBreakpoints; +static std::string WriteBreakpoints, IOWriteBreakpoints, AuxWriteBreakpoints; +static std::string OpBreakpoints; + +static MDFN_Surface* DebuggerSurface[2] = { NULL, NULL }; +static MDFN_Rect DebuggerRect[2]; + +static int volatile DMTV_BackBuffer; +static MDFN_Surface* volatile DMTV_Surface; +static MDFN_Rect* volatile DMTV_Rect; + +// +// Used for translating mouse coordinates and whatnot. Doesn't really matter if it's not atomically updated, there +// are sanity checks to prevent dividing by zero, and it'll just cause mouse coordinate translation to be wonky for a tiny fraction of a second. +// +static MDFN_Rect volatile dlc_screen_dest_rect = { 0 }; + +static int DebuggerOpacity; + +typedef std::vector DisComment; +static std::map Comments; // Lower 32 bits == address, upper 32 bits == 4 bytes data match + +static void CPUCallback(uint32 PC, bool bpoint); // Called from game thread. + +bool Debugger_GT_IsInSteppingMode(void) +{ + return(InSteppingMode); +} + +static uint32 GetPC(void) +{ + RegGroupType *rg = (*CurGame->Debugger->RegGroups)[0]; + + return rg->GetRegister(rg->Regs[0].id, NULL, 0); // FIXME +} + +static void MemPoke(uint32 A, uint32 V, uint32 Size, bool hl, bool logical) +{ + AddressSpaceType *found = NULL; + + if(logical) + { + for(unsigned int x = 0; x < CurGame->Debugger->AddressSpaces->size(); x++) + if((*CurGame->Debugger->AddressSpaces)[x].name == "logical") + { + found = &(*CurGame->Debugger->AddressSpaces)[x]; + break; + } + } + else + { + for(unsigned int x = 0; x < CurGame->Debugger->AddressSpaces->size(); x++) + if((*CurGame->Debugger->AddressSpaces)[x].name == "physical") + { + found = &(*CurGame->Debugger->AddressSpaces)[x]; + break; + } + } + + if(!found) + { + for(unsigned int x = 0; x < CurGame->Debugger->AddressSpaces->size(); x++) + if((*CurGame->Debugger->AddressSpaces)[x].name == "cpu") + { + found = &(*CurGame->Debugger->AddressSpaces)[x]; + break; + } + } + + if(found) + { + uint8 tmp_buffer[4]; + + // FIXME if we ever add a non-LSB-first system! + tmp_buffer[0] = V; + tmp_buffer[1] = V >> 8; + tmp_buffer[2] = V >> 16; + tmp_buffer[3] = V >> 24; + found->PutAddressSpaceBytes(found->name.c_str(), A, Size, Size, hl, tmp_buffer); + } + else + puts("Error"); +} + +static unsigned long long ParsePhysAddr(const char *za) +{ + unsigned long long ret = 0; + + if(strchr(za, ':')) + { + unsigned int bank = 0, offset = 0; + + if(!strcasecmp(CurGame->shortname, "wswan")) + { + trio_sscanf(za, "%04x:%04x", &bank, &offset); + ret = ((bank << 4) + offset) & 0xFFFFF; + } + else + { + trio_sscanf(za, "%02x:%04x", &bank, &offset); + ret = (bank * 8192) | (offset & 0x1FFF); + } + } + else + trio_sscanf(za, "%llx", &ret); + + return(ret); +} + +static void UpdateCoreHooks(void) +{ + bool BPInUse = PCBreakPoints.size() || ReadBreakpoints.size() || WriteBreakpoints.size() || IOReadBreakpoints.size() || + IOWriteBreakpoints.size() || AuxReadBreakpoints.size() || AuxWriteBreakpoints.size() || OpBreakpoints.size(); + bool CPUCBNeeded = BPInUse || TraceLog || InSteppingMode || (NeedStep == 2); + + CurGame->Debugger->EnableBranchTrace(BPInUse || TraceLog || IsActive); + CurGame->Debugger->SetCPUCallback(CPUCBNeeded ? CPUCallback : NULL, TraceLog || InSteppingMode || (NeedStep == 2)); +} + +static void UpdatePCBreakpoints(void) +{ + CurGame->Debugger->FlushBreakPoints(BPOINT_PC); + + for(unsigned int x = 0; x < PCBreakPoints.size(); x++) + { + CurGame->Debugger->AddBreakPoint(BPOINT_PC, PCBreakPoints[x], PCBreakPoints[x], 1); + } + UpdateCoreHooks(); +} + +static INLINE bool IsPCBreakPoint(uint32 A) +{ + unsigned int max = PCBreakPoints.size(); + + for(unsigned int x = 0; x < max; x++) + if(PCBreakPoints[x] == A) + return(1); + return(0); +} + +static void TogglePCBreakPoint(uint32 A) +{ + for(unsigned int x = 0; x < PCBreakPoints.size(); x++) + { + if(PCBreakPoints[x] == A) + { + PCBreakPoints.erase(PCBreakPoints.begin() + x); + + UpdatePCBreakpoints(); + + return; + } + } + PCBreakPoints.push_back(A); + + UpdatePCBreakpoints(); +} + +static void UpdateBreakpoints(const std::string &Breakpoints, int type) +{ + size_t len = Breakpoints.size(); + const char *zestring = Breakpoints.c_str(); + unsigned int last_x, x; + bool two_parter = 0; + bool logical = 1; + + CurGame->Debugger->FlushBreakPoints(type); + + for(last_x = x = 0; x < len; x++) + { + if(zestring[x] == '-') + two_parter = 1; + else if(zestring[x] == '*') + { + logical = 0; + last_x++; + } + else if(zestring[x] == ' ' || x == len - 1) + { + uint32 A1, A2; + + if(two_parter) + { + char sa1[64], sa2[64]; + + if(!logical) + { + if(trio_sscanf(zestring + last_x, "%63[^-]%*[-]%63s", sa1, sa2) < 2) continue; + + //printf("%s %s\n", sa1, sa2); + A1 = ParsePhysAddr(sa1); + A2 = ParsePhysAddr(sa2); + } + else + if(trio_sscanf(zestring + last_x, "%x%*[-]%x", &A1, &A2) < 2) continue; + + two_parter = 0; + } + else + { + if(!logical) + { + char sa1[64]; + + trio_sscanf(zestring + last_x, "%s", sa1); + + A1 = ParsePhysAddr(sa1); + } + else + if(trio_sscanf(zestring + last_x, "%x", &A1) != 1) continue; + + A2 = A1; + } + //printf("%04x %04x %d\n", A1, A2, logical); + CurGame->Debugger->AddBreakPoint(type, A1, A2, logical); + last_x = x + 1; + logical = 1; + } + } + UpdateCoreHooks(); +} + + +static void UpdateBreakpoints(void) +{ + UpdatePCBreakpoints(); + UpdateBreakpoints(ReadBreakpoints, BPOINT_READ); + UpdateBreakpoints(WriteBreakpoints, BPOINT_WRITE); + UpdateBreakpoints(IOReadBreakpoints, BPOINT_IO_READ); + UpdateBreakpoints(IOWriteBreakpoints, BPOINT_IO_WRITE); + UpdateBreakpoints(AuxReadBreakpoints, BPOINT_AUX_READ); + UpdateBreakpoints(AuxWriteBreakpoints, BPOINT_AUX_WRITE); + UpdateBreakpoints(OpBreakpoints, BPOINT_OP); +} + +static unsigned RegsPosX; +static unsigned RegsPosY; +static bool InRegs; +static uint32 RegsCols; +static uint32 RegsColsCounts[16]; // FIXME[5]; +static uint32 RegsColsPixOffset[16]; //[5]; +static uint32 RegsWhichFont[16]; //[5]; +static uint32 RegsTotalWidth; + +static std::string CurRegLongName; +static std::string CurRegDetails; + +#define MK_COLOR_A(r,g,b,a) (pf_cache.MakeColor(r, g, b, a)) + +static void Regs_Init(const int max_height_hint) +{ + RegsPosX = RegsPosY = 0; + InRegs = false; + RegsCols = 0; + + memset(RegsColsCounts, 0, sizeof(RegsColsCounts)); + memset(RegsColsPixOffset, 0, sizeof(RegsColsPixOffset)); + memset(RegsWhichFont, 0, sizeof(RegsWhichFont)); + RegsTotalWidth = 0; + + CurRegLongName = ""; + CurRegDetails = ""; + + // + // + // + RegsCols = 0; + RegsTotalWidth = 0; + + memset(RegsColsCounts, 0, sizeof(RegsColsCounts)); + + int pw_offset = 0; + for(unsigned int r = 0; r < CurGame->Debugger->RegGroups->size(); r++) + { + uint32 pw = 0; + int x; + + for(x = 0; (*CurGame->Debugger->RegGroups)[r]->Regs[x].bsize; x++) + { + if((*CurGame->Debugger->RegGroups)[r]->Regs[x].bsize != 0xFFFF) + { + uint32 tmp_pw = strlen((*CurGame->Debugger->RegGroups)[r]->Regs[x].name.c_str()); + unsigned int bsize = (*CurGame->Debugger->RegGroups)[r]->Regs[x].bsize; + + if(bsize & 0x100) + tmp_pw += ((bsize & 0xFF) + 3) / 4 + 2 + 2; + else + tmp_pw += bsize * 2 + 2 + 2; + + if(tmp_pw > pw) + pw = tmp_pw; + } + + RegsColsCounts[r]++; + } + + if(r == (CurGame->Debugger->RegGroups->size() - 1)) + pw -= 2; + + if(x * 7 > max_height_hint) + { + pw *= 4; + RegsWhichFont[r] = MDFN_FONT_4x5; + } + else + { + pw *= 5; + RegsWhichFont[r] = MDFN_FONT_5x7; + } + + RegsCols++; + RegsColsPixOffset[r] = pw_offset; + + //printf("Column %d, Offset %d\n", r, pw_offset); + + pw_offset += pw; + } + RegsTotalWidth = pw_offset; +} + +static void Regs_DrawGroup(RegGroupType *rg, MDFN_Surface *surface, uint32 *pixels, int highlight, uint32 which_font) +{ + const MDFN_PixelFormat pf_cache = surface->format; + uint32 pitch32 = surface->pitchinpix; + uint32 *row = pixels; + unsigned int meowcow = 0; + RegType *rec = rg->Regs; + + while(rec->bsize) + { + char nubuf[256]; + uint32 color = MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF); + uint32 rname_color = MK_COLOR_A(0xE0, 0xFF, 0xFF, 0xFF); + + std::string *details_ptr = NULL; + char details_string[256]; + uint32 details_string_len = sizeof(details_string); + + details_string[0] = 0; + + if(highlight != -1) + { + if((unsigned int)highlight == meowcow) + { + CurRegLongName = rec->long_name; + rname_color = color = MK_COLOR_A(0xFF, 0x00, 0x00, 0xFF); + details_ptr = &CurRegDetails; + } + } + int prew = DrawTextTrans(row, surface->pitchinpix << 2, 128, rec->name.c_str(), rname_color, 0, which_font); + + if(rec->bsize != 0xFFFF) + { + uint32 regval; + + regval = rg->GetRegister(rec->id, details_ptr ? details_string : NULL, details_string_len); + + if(rec->bsize & 0x100) + { + char fstring[7] = ": %08X"; + int nib_size = ((rec->bsize & 0xFF) + 3) / 4; + + fstring[3] = '0' + (nib_size / 10); + fstring[4] = '0' + (nib_size % 10); + + trio_snprintf(nubuf, 256, fstring, regval); + } + else + { + if(rec->bsize == 4) + trio_snprintf(nubuf, 256, ": %08X", regval); + else if(rec->bsize == 3) + trio_snprintf(nubuf, 256, ": %06X", regval); + else if(rec->bsize == 2) + trio_snprintf(nubuf, 256, ": %04X", regval); + else if(rec->bsize == 1) + trio_snprintf(nubuf, 256, ": %02X", regval); + } + + if(details_ptr && details_string[0]) + *details_ptr = std::string(details_string); + + DrawTextTrans(row + prew, surface->pitchinpix << 2, 64, nubuf, color, 0, which_font); + } + + if(which_font == MDFN_FONT_5x7) + row += 7 * pitch32; + else if(which_font == MDFN_FONT_4x5) + row += 6 * pitch32; + else + row += 18 * pitch32; + + rec++; + meowcow++; + } +} + + + + +static int DIS_ENTRIES = 58; +static int DisFont = MDFN_FONT_5x7; +static int DisFontHeight = 7; + +static uint32 WatchAddr = 0x0000, WatchAddrPhys = 0x0000; +static uint32 DisAddr = 0x0000; +static uint32 DisCOffs = 0xFFFFFFFF; +static int NeedDisAddrChange = 0; + +static void DrawZP(MDFN_Surface *surface, uint32 *pixels) +{ + const MDFN_PixelFormat pf_cache = surface->format; + uint32 addr = CurGame->Debugger->ZPAddr; + + for(int y = -1; y < 17; y++) + for(int x = -1; x < 17; x++) + { + uint8 zebyte = CurGame->Debugger->MemPeek(addr, 1, 1, TRUE); + char tbuf[32]; + int r, g, b; + bool NeedInc = FALSE; + + if((y == -1 || y == 16) && (x == -1 || x == 16)) continue; + + if(y == -1 || y == 16) + { + r = 0x00; + g = 0xE0; + b = 0x00; + trio_snprintf(tbuf, 32, "x%1X", x); + } + else if(x == -1 || x == 16) + { + r = 0x00; + g = 0xE0; + b = 0x00; + trio_snprintf(tbuf, 32, "%1Xx", y); + } + else + { + trio_snprintf(tbuf, 32, "%02X", zebyte); + + r = 0x00; + g = 0x00; + b = 0x00; + + if(x & 4) { r += 0xeF; } + if(y & 4) { b += 0xFF; g += 0x80; } + if(!(x & 4) && !(y & 4)) + r = g = b = 0xE0; + NeedInc = TRUE; + } + + DrawTextTrans(pixels + (x + 1) * 13 + (y + 1) * 10 * surface->pitchinpix, surface->pitchinpix << 2, 1024, tbuf, MK_COLOR_A(r, g, b, 0xFF), FALSE, MDFN_FONT_5x7); + if(NeedInc) + addr++; + } + +} + +typedef enum +{ + None = 0, + DisGoto, + WatchGoto, + EditRegs, + PokeMe, + PokeMeHL, + ReadBPS, + WriteBPS, + IOReadBPS, + IOWriteBPS, + AuxReadBPS, + AuxWriteBPS, + OpBPS, + ForceInt, + TraceLogPrompt +} PromptType; + +// FIXME, cleanup, less spaghetti: +static PromptType InPrompt = None; +static RegType *CurRegIP; +static RegGroupType *CurRegGroupIP; + +class DebuggerPrompt : public HappyPrompt +{ + public: + + DebuggerPrompt(const std::string &ptext, const std::string &zestring) : HappyPrompt(ptext, zestring) + { + + } + ~DebuggerPrompt() + { + + } + private: + + void TheEnd(const std::string &pstring) + { + char *tmp_c_str = strdup(pstring.c_str()); + + if(InPrompt == DisGoto) + { + unsigned long long tmpaddr; + + if(trio_sscanf(tmp_c_str, "%llx", &tmpaddr) == 1) + { + DisAddr = tmpaddr; + DisAddr &= ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + DisAddr &= ~(CurGame->Debugger->InstructionAlignment - 1); + DisCOffs = 0xFFFFFFFF; + } + } + else if(InPrompt == ReadBPS) + { + ReadBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(ReadBreakpoints, BPOINT_READ); + } + else if(InPrompt == WriteBPS) + { + WriteBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(WriteBreakpoints, BPOINT_WRITE); + } + else if(InPrompt == IOReadBPS) + { + IOReadBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(IOReadBreakpoints, BPOINT_IO_READ); + } + else if(InPrompt == IOWriteBPS) + { + IOWriteBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(IOWriteBreakpoints, BPOINT_IO_WRITE); + } + else if(InPrompt == AuxReadBPS) + { + AuxReadBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(AuxReadBreakpoints, BPOINT_AUX_READ); + } + else if(InPrompt == AuxWriteBPS) + { + AuxWriteBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(AuxWriteBreakpoints, BPOINT_AUX_WRITE); + } + else if(InPrompt == OpBPS) + { + OpBreakpoints = std::string(tmp_c_str); + UpdateBreakpoints(OpBreakpoints, BPOINT_OP); + } + else if(InPrompt == TraceLogPrompt) + { + if(pstring != TraceLogSpec) + { + TraceLogSpec = pstring; + + if(TraceLog) + { + fclose(TraceLog); + TraceLog = NULL; + UpdateCoreHooks(); + } + + unsigned int endpc; + char tmpfn[256]; + int num = trio_sscanf(tmp_c_str, "%255s %x", tmpfn, &endpc); + if(num >= 1) + { + if((TraceLog = fopen(tmpfn, "ab"))) + { + time_t lovelytime; + lovelytime = time(NULL); + + if(ftell(TraceLog) != 0) + trio_fprintf(TraceLog, "\n\n\n"); + + trio_fprintf(TraceLog, "Tracing began: %s", asctime(gmtime(&lovelytime))); + trio_fprintf(TraceLog, "[ADDRESS]: [INSTRUCTION] [REGISTERS(before instruction exec)]"); + if(num == 1) + TraceLogEnd = -1; + else + TraceLogEnd = endpc; + TraceLogRTO = 0; + UpdateCoreHooks(); + } + } + } + } + else if(InPrompt == ForceInt) + { + CurGame->Debugger->IRQ(atoi(tmp_c_str)); + } + else if(InPrompt == PokeMe || InPrompt == PokeMeHL) + { + const bool hl = (InPrompt == PokeMeHL); + uint32 A = 0, V = 0, S = 1; + bool logical = true; + char *meow_str = tmp_c_str; + int ssf_ret; + + if(meow_str[0] == '*') + { + meow_str++; + logical = false; + } + + if(logical) + ssf_ret = trio_sscanf(tmp_c_str, "%x %x %d", &A, &V, &S); + else + { + char sa[64]; + + ssf_ret = trio_sscanf(tmp_c_str, "%63s %x %d", sa, &V, &S); + + A = ParsePhysAddr(sa); + } + + if(ssf_ret >= 2) // Allow size to be omitted, implicit as '1' + { + A &= ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + + if(S < 1) S = 1; + if(S > 4) S = 4; + + MemPoke(A, V, S, hl, logical); + } + } + else if(InPrompt == EditRegs) + { + unsigned long long RegValue = 0; + + trio_sscanf(tmp_c_str, "%llx", &RegValue); + + if(CurRegGroupIP->SetRegister) + CurRegGroupIP->SetRegister(CurRegIP->id, RegValue); + else + puts("Null SetRegister!"); + } + else if(InPrompt == WatchGoto) + { + if(WatchLogical) + { + trio_sscanf(tmp_c_str, "%x", &WatchAddr); + WatchAddr &= 0xFFF0; + } + else + { + trio_sscanf(tmp_c_str, "%x", &WatchAddrPhys); + WatchAddrPhys &= (((uint64)1 << CurGame->Debugger->PhysAddrBits) - 1); + WatchAddrPhys &= ~0xF; + } + } + free(tmp_c_str); + InPrompt = None; + + } +}; + +struct DisasmEntry +{ + std::string text; + uint32 A; + uint32 COffs; + bool ForcedResync; +}; + + +static DebuggerPrompt *myprompt = NULL; + +// +// +// +void Debugger_GTR_PassBlit(void) +{ + DMTV_Rect = &DebuggerRect[DMTV_BackBuffer]; + DMTV_Surface = DebuggerSurface[DMTV_BackBuffer]; + + DMTV_BackBuffer ^= 1; +} + +void Debugger_MT_DrawToScreen(const MDFN_PixelFormat& pf, signed screen_w, signed screen_h) +{ + if(!DMTV_Rect || !DMTV_Surface || !DMTV_Rect->w || !DMTV_Rect->h) + return; + + MDFN_Surface* debsurf = DMTV_Surface; + MDFN_Rect* debrect = DMTV_Rect; + MDFN_Rect zederect; + int xm = screen_w / debrect->w; + int ym = screen_h / debrect->h; + + debsurf->SetFormat(pf, true); + + if(xm < 1) xm = 1; + if(ym < 1) ym = 1; + + // Allow it to be compacted horizontally, but don't stretch it out, as it's hard(IMHO) to read. + if(xm > ym) xm = ym; + if(ym > (2 * xm)) ym = 2 * xm; + + zederect.w = debrect->w * xm; + zederect.h = debrect->h * ym; + + zederect.x = (screen_w - zederect.w) / 2; + zederect.y = (screen_h - zederect.h) / 2; + + *(MDFN_Rect*)&dlc_screen_dest_rect = zederect; + BlitRaw(debsurf, debrect, &zederect); +} + +void Debugger_GT_Draw(void) +{ + MDFN_Surface* surface = DebuggerSurface[DMTV_BackBuffer]; + MDFN_Rect* rect = &DebuggerRect[DMTV_BackBuffer]; + MDFN_Rect screen_rect = *(MDFN_Rect*)&dlc_screen_dest_rect; + + if(!IsActive) + { + rect->w = 0; + rect->h = 0; + return; + } + + // + // Kludges to prevent div by zero. We're a little sloppy with the dest rect thingy... + // + if(!screen_rect.w) + screen_rect.w = 1; + + if(!screen_rect.h) + screen_rect.h = 1; + + + switch(WhichMode) + { + default: + case 0: rect->w = CompactMode ? 512 : 640; + rect->h = CompactMode ? 448 : 480; + break; + + case 1: rect->w = 384; + rect->h = 320; + break; + + case 2: rect->w = 320; + rect->h = 240; + break; + + case 3: rect->w = 512; + rect->h = 448; + break; + } + + if(WhichMode == 1) + { + surface->Fill(0, 0, 0, 0); + + GfxDebugger_Draw(surface, rect, &screen_rect); + return; + } + else if(WhichMode == 2) + { + surface->Fill(0, 0, 0, DebuggerOpacity); + + memdbg->Draw(surface, rect, &screen_rect); + return; + } + else if(WhichMode == 3) + { + surface->Fill(0, 0, 0, DebuggerOpacity); + + LogDebugger_Draw(surface, rect, &screen_rect); + return; + } + + const MDFN_PixelFormat pf_cache = surface->format; + uint32 *pixels = surface->pixels; + uint32 pitch32 = surface->pitchinpix; + + surface->Fill(0, 0, 0, DebuggerOpacity); + + // We need to disassemble (maximum_instruction_size * (DIS_ENTRIES / 2) * 3) + // bytes to make sure we can center our desired DisAddr, and + // that we have enough disassembled datums for displayaling and + // worshipping cactus mules. + + + int PreBytes = CurGame->Debugger->MaxInstructionSize * ((DIS_ENTRIES + 1) / 2) * 2; + int DisBytes = CurGame->Debugger->MaxInstructionSize * ((DIS_ENTRIES + 1) / 2) * 3; + + uint32 A = (DisAddr - PreBytes) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + + std::vector DisBuffer; + int indexcow = -1; + const uint32 PC = GetPC(); + + while(DisBytes > 0) + { + DisasmEntry NewEntry; + uint32 lastA = A; + char dis_text_buf[256]; + uint32 ResyncAddr; + + // Handling resynch address ->0 wrapping is a bit more complex... + { + const uint32 da_distance = (DisAddr - A - 1) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + const uint32 pc_distance = (PC - A - 1) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + uint32 distance; + + distance = da_distance; + ResyncAddr = DisAddr; + + if(pc_distance < distance) + { + distance = pc_distance; + ResyncAddr = PC; + } + + // Handle comment forced resynchronizations + { + std::map::const_iterator it; + + for(it = Comments.begin(); it != Comments.end(); it++) + { + uint32 comment_distance = ((uint32)it->first - A - 1) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + + if(comment_distance < distance) + { + // FIXME: data byte validation + + distance = comment_distance; + ResyncAddr = (uint32)it->first; + } + } + } + + } + + //printf("%08x %08x\n", A, DisAddr); + CurGame->Debugger->Disassemble(A, ResyncAddr, dis_text_buf); // A is passed by reference to Disassemble() + + NewEntry.A = lastA; + NewEntry.text = std::string(dis_text_buf); + NewEntry.COffs = 0xFFFFFFFF; + + const uint64 a_m_la = (A - lastA) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + const uint64 ra_m_la = (ResyncAddr - lastA) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + + //printf("A=%16llx lastA=%16llx a_m_la=%16llx ra_m_la=%16llx RA=%16llx\n", (unsigned long long)A, (unsigned long long)lastA, a_m_la, ra_m_la, (unsigned long long)ResyncAddr); + + // Resynch if necessary + if(ra_m_la != 0 && a_m_la > ra_m_la) + { + A = ResyncAddr; + NewEntry.ForcedResync = true; + } + else + NewEntry.ForcedResync = false; + + DisBytes -= a_m_la; + + + { + std::map::const_iterator it = Comments.find(lastA); + + if(it != Comments.end()) + { + //const std::string &rawstring = it->second; + const DisComment &zec = it->second; + DisasmEntry CommentEntry; + + CommentEntry.A = lastA; + CommentEntry.ForcedResync = false; + + for(uint32 i = 0; i < zec.size(); i++) + { + CommentEntry.COffs = i; + CommentEntry.text = zec[i]; + + if(CommentEntry.A == DisAddr && CommentEntry.COffs == DisCOffs) + indexcow = DisBuffer.size(); + + DisBuffer.push_back(CommentEntry); + } + } + } + + if(NewEntry.A == DisAddr && (NewEntry.COffs == DisCOffs || indexcow == -1)) // Also handles case where comments disappear out from underneath us. + indexcow = DisBuffer.size(); + + DisBuffer.push_back(NewEntry); + } + + char addr_text_fs[64]; // Format string. + + trio_snprintf(addr_text_fs, 64, " %%0%0dX%%s", (CurGame->Debugger->LogAddrBits + 3) / 4); + + for(int x = 0; x < DIS_ENTRIES; x++) + { + int32 dbi = indexcow - (DIS_ENTRIES / 2) + x; + + if(dbi < 0 || dbi >= (int32)DisBuffer.size()) + { + puts("Disassembly error!"); + break; + } + + if(DisBuffer[dbi].COffs != 0xFFFFFFFF) // Comment + { + uint32 color = MK_COLOR_A(0xFF, 0xA5, 0x00, 0xFF); + uint32 cursor_color = MK_COLOR_A(0xFF, 0x80, 0xE0, 0xFF); + //char textbuf[256]; + + //trio_snprintf(textbuf, sizeof(textbuf), "// %s", DisBuffer[dbi].text.c_str()); + + if(DisBuffer[dbi].A == DisAddr && DisBuffer[dbi].COffs == DisCOffs) + DrawTextTrans(pixels + x * DisFontHeight * pitch32, surface->pitchinpix << 2, rect->w, ">", cursor_color, 0, DisFont); + + DrawTextTrans(pixels + 5 + x * DisFontHeight * pitch32, surface->pitchinpix << 2, rect->w, DisBuffer[dbi].text.c_str(), color, 0, DisFont); + } + else // Disassembly + { + std::string dis_str = DisBuffer[dbi].text; + uint32 dis_A = DisBuffer[dbi].A; + + char addr_text[64]; + uint32 color = MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF); + uint32 addr_color = MK_COLOR_A(0xa0, 0xa0, 0xFF, 0xFF); + + trio_snprintf(addr_text, 256, addr_text_fs, dis_A, (DisBuffer[dbi].ForcedResync ? "!!" : ": ")); + + if(dis_A == DisAddr && DisBuffer[dbi].COffs == DisCOffs) + { + addr_text[0] = '>'; + if(!InRegs) + { + if(dis_A == PC) + addr_color = color = MK_COLOR_A(0xFF, 0x00, 0x00, 0xFF); + else + addr_color = color = MK_COLOR_A(0xFF, 0x80, 0xE0, 0xFF); + } + + if(NeedPCBPToggle) + { + if(DisCOffs == 0xFFFFFFFF) + TogglePCBreakPoint(dis_A); + NeedPCBPToggle = 0; + } + } + + if(dis_A == PC && (dis_A != DisAddr || InRegs)) + addr_color = color = MK_COLOR_A(0x00, 0xFF, 0x00, 0xFF); + + if(IsPCBreakPoint(dis_A)) + addr_text[0] = addr_text[0] == '>' ? '#' : '*'; + + int addrpixlen; + + addrpixlen = DrawTextTrans(pixels + x * DisFontHeight * pitch32, surface->pitchinpix << 2, rect->w, addr_text, addr_color, 0, DisFont); + DrawTextTrans(pixels + x * DisFontHeight * pitch32 + addrpixlen, surface->pitchinpix << 2, rect->w - strlen(addr_text) * 5, dis_str.c_str(), color, 0, DisFont); + } + } + + if(NeedDisAddrChange) + { + if((indexcow + NeedDisAddrChange) >= (int32)DisBuffer.size()) + { + puts("Error, gack!"); + } + else + { + DisAddr = DisBuffer[indexcow + NeedDisAddrChange].A; + DisCOffs = DisBuffer[indexcow + NeedDisAddrChange].COffs; + NeedDisAddrChange = 0; + } + } + + CurRegLongName = ""; + CurRegDetails = ""; + + for(unsigned int rp = 0; rp < CurGame->Debugger->RegGroups->size(); rp++) + Regs_DrawGroup((*CurGame->Debugger->RegGroups)[rp], surface, pixels + rect->w - RegsTotalWidth + RegsColsPixOffset[rp], (InRegs && RegsPosX == rp) ? (int)RegsPosY : -1, RegsWhichFont[rp]); // 175 + + if(CurGame->Debugger->ZPAddr != (uint32)~0UL) + DrawZP(surface, pixels + 324 + 224 * pitch32); + + int moo = 8; + + if(CompactMode) + moo = 16; + + if(InRegs) + { + DrawTextTrans(pixels + (rect->h - (moo + 2) * 7) * pitch32, surface->pitchinpix << 2, surface->w, CurRegLongName.c_str(), MK_COLOR_A(0xa0, 0xa0, 0xFF, 0xFF), TRUE, 1); + DrawTextTrans(pixels + (rect->h - (moo + 1) * 7) * pitch32, surface->pitchinpix << 2, surface->w, CurRegDetails.c_str(), MK_COLOR_A(0x60, 0xb0, 0xFF, 0xFF), TRUE, 1); + } + else if(CurGame->Debugger->GetBranchTrace) + { + const int btrace_rows = 4; + const int btrace_cols = 96; + std::vector btrace = CurGame->Debugger->GetBranchTrace(); + uint32 *btpixels = pixels + (rect->h - (moo + 2) * 7) * pitch32 + 7; // + ((128 - btrace_cols) / 2) * 5; + int draw_position = btrace_rows * btrace_cols; + bool color_osc = false; + const uint32 hcolors[2] = { MK_COLOR_A(0x60, 0xb0, 0xfF, 0xFF), MK_COLOR_A(0xb0, 0x70, 0xfF, 0xFF) }; + + for(int i = (int)btrace.size() - 1; i >= 0; i--) + { + char strbuf[4][256]; // [0] = from, [1] = arrow/special, [2] = to, [3] = ... + int strbuf_len; + int new_draw_position; + int col, row; + uint32 *pix_tmp; + + trio_snprintf(strbuf[0], 256, "%s", btrace[i].from); + + if(btrace[i].code[0]) + trio_snprintf(strbuf[1], 256, "[%s‣]", btrace[i].code); + else + trio_snprintf(strbuf[1], 256, "‣"); + + if(btrace[i].count > 1) + trio_snprintf(strbuf[2], 256, "%s(*%d)", btrace[i].to, btrace[i].count); + else + trio_snprintf(strbuf[2], 256, "%s", btrace[i].to); + + if(i == ((int)btrace.size() - 1)) + strbuf[3][0] = 0; + else + snprintf(strbuf[3], 256, "…"); + +//trio_snprintf(tmp, sizeof(tmp), "%04X%s%04X(*%d)", bt->from, arrow, bt->to, bt->branch_count); + + strbuf_len = (GetTextPixLength(strbuf[0], MDFN_FONT_5x7) + + GetTextPixLength(strbuf[1], MDFN_FONT_5x7) + + GetTextPixLength(strbuf[2], MDFN_FONT_5x7) + 5 + GetTextPixLength(strbuf[3], MDFN_FONT_5x7) + 4) / 5; + new_draw_position = draw_position - strbuf_len; + + if(new_draw_position < 0) + break; + + if(((draw_position - 1) / btrace_cols) > (new_draw_position / btrace_cols)) + new_draw_position = ((new_draw_position / btrace_cols) + 1) * btrace_cols - strbuf_len; + + col = new_draw_position % btrace_cols; + row = new_draw_position / btrace_cols; + + pix_tmp = btpixels + col * 5 + row * 10 * pitch32; + pix_tmp += DrawTextTrans(pix_tmp, surface->pitchinpix << 2, rect->w, strbuf[0], (btrace[i].count > 1) ? MK_COLOR_A(0xe0, 0xe0, 0x00, 0xFF) : hcolors[color_osc], false, MDFN_FONT_5x7); + pix_tmp += DrawTextTrans(pix_tmp, surface->pitchinpix << 2, rect->w, strbuf[1], btrace[i].code[0] ? MK_COLOR_A(0xb0, 0xFF, 0xff, 0xFF) : MK_COLOR_A(0xb0, 0xb0, 0xff, 0xFF), false, MDFN_FONT_5x7); + + color_osc = !color_osc; + + pix_tmp += DrawTextTrans(pix_tmp, surface->pitchinpix << 2, rect->w, strbuf[2], (btrace[i].count > 1) ? MK_COLOR_A(0xe0, 0xe0, 0x00, 0xFF) : hcolors[color_osc], false, MDFN_FONT_5x7); + pix_tmp += 2; + pix_tmp += DrawTextTrans(pix_tmp, surface->pitchinpix << 2, rect->w, strbuf[3], MK_COLOR_A(0x60, 0x70, 0x80, 0xFF), false, MDFN_FONT_5x7); + pix_tmp += 3; + draw_position = new_draw_position; + } + +#if 0 + for(int bt_row = 0; bt_row < btrace_rows; bt_row++) + { + strbuf[0] = 0; + strbuf_len = 0; + for(unsigned int y = 0; y < (btrace.size() + btrace_rows - 1) / btrace_rows && btrace_index < btrace.size(); y++) + { + strbuf_len += trio_snprintf(strbuf + strbuf_len, 256 - strbuf_len, /*"%s→"*/ "%s ", btrace[btrace_index].c_str()); + btrace_index++; + } + + strbuf[strbuf_len - 1] = 0; // Get rid of the trailing space + + DrawTextTrans(btpixels + bt_row * 8 * pitch32, surface->pitchinpix << 2, rect->w, strbuf, MK_COLOR_A(0x60, 0xb0, 0xfF, 0xFF), TRUE, MDFN_FONT_5x7); + } +#endif + } + + // Draw memory watch section + { + uint32 *watchpixels = pixels + (rect->h - moo * 7 + (InRegs ? 0 : 4) * 7) * pitch32; + int mw_rows = InRegs ? 8 : 4; + int bytes_per_row = 32; + + if(CompactMode) + mw_rows = 16; + + if(CompactMode) + bytes_per_row = 16; + + for(int y = 0; y < mw_rows; y++) + { + uint32 *row = watchpixels + y * pitch32 * 7; + char tbuf[256]; + char asciistr[32 + 1]; + uint32 ewa; + uint32 ewa_bits; + uint32 ewa_mask; + + asciistr[32] = 0; + + if(WatchLogical) + { + ewa_bits = CurGame->Debugger->LogAddrBits; + ewa = WatchAddr; + } + else + { + ewa_bits = CurGame->Debugger->PhysAddrBits; + ewa = WatchAddrPhys; + } + + ewa_mask = ((uint64)1 << ewa_bits) - 1; + + if(InRegs) + ewa = (ewa - 0x80) & ewa_mask; + + if(ewa_bits <= 16) + trio_snprintf(tbuf, 256, "%04X: ", (ewa + y * bytes_per_row) & ewa_mask); + else if(ewa_bits <= 20) + trio_snprintf(tbuf, 256, "%05X: ", (ewa + y * bytes_per_row) & ewa_mask); + else if(ewa_bits <= 24) + trio_snprintf(tbuf, 256, "%06X: ", (ewa + y * bytes_per_row) & ewa_mask); + else + trio_snprintf(tbuf, 256, "%08X: ", (ewa + y * bytes_per_row) & ewa_mask); + + row += DrawTextTrans(row, surface->pitchinpix << 2, rect->w, tbuf, MK_COLOR_A(0xa0, 0xa0, 0xFF, 0xFF), FALSE, MDFN_FONT_5x7); + for(int x = 0; x < bytes_per_row; x++) + { + uint8 zebyte = CurGame->Debugger->MemPeek((ewa + y * bytes_per_row + x) & ewa_mask, 1, 1, WatchLogical); + uint32 bcolor = MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF); + + if(x & 1) + bcolor = MK_COLOR_A(0xD0, 0xFF, 0xF0, 0xFF); + if(!(x & 0x7)) + bcolor = MK_COLOR_A(0xFF, 0x80, 0xFF, 0xFF); + asciistr[x] = zebyte; + if(zebyte & 0x80 || !zebyte) + asciistr[x] = '.'; + + if(x == 16) row += 7; + + trio_snprintf(tbuf, 256, "%02X", zebyte); + row += DrawTextTrans(row, surface->pitchinpix << 2, rect->w, tbuf, bcolor, 0, 1) + 2; + } + DrawTextTrans(row + 5, surface->pitchinpix << 2, rect->w, asciistr, MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, MDFN_FONT_5x7); + } + } + + if(InPrompt) + myprompt->Draw(surface, rect); + else if(myprompt) + { + delete myprompt; + myprompt = NULL; + } +} + +static void MDFN_COLD SetActive(bool active, unsigned which_ms) +{ + IsActive = active; + WhichMode = which_ms; + + if(IsActive) + { + if(!DebuggerSurface[0]) + { + DebuggerSurface[0] = new MDFN_Surface(NULL, 640, 480, 640, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, 0, 8, 16, 24)); + DebuggerSurface[1] = new MDFN_Surface(NULL, 640, 480, 640, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, 0, 8, 16, 24)); + } + + if(NeedInit) + { + std::string des_disfont = MDFN_GetSettingS(std::string(std::string(CurGame->shortname) + "." + std::string("debugger.disfontsize"))); + DebuggerOpacity = 0xC0; + + // Debug remove me +#if 0 + { + DisComment comment; + + comment.push_back("// Hi!"); + comment.push_back("// We welcome you to the wonderful world"); + comment.push_back("// of tomorrow...TODAY!"); + comment.push_back("//"); + comment.push_back("// Warning: Beware of deathbots."); + + Comments[0x8001] = comment; + } +#endif + // End debug remove me + + if(des_disfont == "xsmall") + { + DisFont = MDFN_FONT_4x5; + DisFontHeight = 6; + } + else if(des_disfont == "medium") + { + DisFont = MDFN_FONT_6x13_12x13; + DisFontHeight = 12; + } + else if(des_disfont == "large") + { + DisFont = MDFN_FONT_9x18_18x18; + DisFontHeight = 17; + } + else // small + { + DisFont = MDFN_FONT_5x7; + DisFontHeight = 7; + } + + DIS_ENTRIES = 406 / DisFontHeight; + + //DIS_ENTRIES = CompactMode ? 46 : 58; + + NeedInit = FALSE; + WatchAddr = CurGame->Debugger->DefaultWatchAddr; + + DisAddr = GetPC(); + DisCOffs = 0xFFFFFFFF; + //DisAddr = (*CurGame->Debugger->RegGroups)[0]->GetRegister(/*PC*/0, NULL, 0); // FIXME + + Regs_Init(DIS_ENTRIES * DisFontHeight); + } + } + + UpdateCoreHooks(); // Note: Relies on value of IsActive. + UpdateBreakpoints(); + + GfxDebugger_SetActive((WhichMode == 1) && IsActive); + memdbg->SetActive((WhichMode == 2) && IsActive); + LogDebugger_SetActive((WhichMode == 3) && IsActive); + + SDL_MDFN_ShowCursor(IsActive); +} + +static const char HexLUT[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +static void DoTraceLog(const uint32 PC) +{ + uint32 trace_PC = PC; + + char dis_text_buf[256 + 64]; + char *distbp = dis_text_buf; + + *distbp++ = '\n'; + + for(unsigned i = 0; i < CurGame->Debugger->LogAddrBits; i += 4) + *distbp++ = HexLUT[(trace_PC >> (CurGame->Debugger->LogAddrBits - i - 4)) & 0xF]; + + *distbp++ = ':'; + *distbp++ = ' '; + + CurGame->Debugger->Disassemble(trace_PC, trace_PC, distbp); + fputs(dis_text_buf, TraceLog); + + if(1) + { + char regs_buf[1024 + 1]; + unsigned tpos = 0; + RegGroupType *rg = (*CurGame->Debugger->RegGroups)[0]; + + { + unsigned sl = strlen(dis_text_buf); + + if((sl + 3) > TraceLogRTO) + TraceLogRTO = sl + 3; + + for(unsigned i = sl; i < TraceLogRTO && tpos < 1024; i++) + regs_buf[tpos++] = ' '; + } + + for(unsigned i = 0; rg->Regs[i].bsize > 0; i++) + { + const RegType* rt = &rg->Regs[i]; + uint32 val; + + if(rg->Regs[i].bsize == 0xFFFF) + continue; + + val = rg->GetRegister(rt->id, NULL, 0); + + if(i) + { + if(tpos < 1024) + regs_buf[tpos++] = ' '; + } + + for(unsigned s = 0; s < rt->name.size() && tpos < 1024; s++) + { + regs_buf[tpos++] = rt->name[s]; + } + + if(tpos < 1024) + regs_buf[tpos++] = '='; + + for(unsigned n = 0; n < (rt->bsize * 2) && tpos < 1024; n++) + regs_buf[tpos++] = HexLUT[(val >> (((rt->bsize * 2) - 1 - n) * 4)) & 0xF]; + } + + regs_buf[tpos] = 0; + + fputs(regs_buf, TraceLog); + } + + if(TraceLogEnd >= 0 && (uint32)TraceLogEnd == PC) + { + fclose(TraceLog); + TraceLog = 0; + UpdateCoreHooks(); + } +} + +// Function called from game thread +static void CPUCallback(uint32 PC, bool bpoint) +{ + if((NeedStep == 2 && !InSteppingMode) || bpoint) + { + if(bpoint) + SetActive(true, 0); + + DisAddr = PC; + DisCOffs = 0xFFFFFFFF; + NeedStep = 0; + InSteppingMode = 1; + } + + if(NeedStep == 1) + { + DisAddr = PC; + DisCOffs = 0xFFFFFFFF; + NeedStep = 0; + } + + if(TraceLog) + DoTraceLog(PC); + + while(InSteppingMode && GameThreadRun) + { + DebuggerFudge(); + if(NeedStep == 2) + { + NeedStep--; + break; + } + if(NeedRun) + { + NeedStep = 0; + NeedRun = 0; + InSteppingMode = 0; + } + if(!InSteppingMode) + UpdateCoreHooks(); + } + if(NeedRun) NeedRun = 0; +} + + +// Function called from game thread, input driver code. +void Debugger_GT_ForceStepIfStepping(void) +{ + if(InSteppingMode) + NeedStep = 2; +} + +// Function called from game thread, input driver code. +void Debugger_GT_SyncDisToPC(void) +{ + if(CurGame->Debugger && !NeedInit) + { + DisAddr = GetPC(); + DisCOffs = 0xFFFFFFFF; + } +} + +// Called from game thread, or in the main thread game thread creation sequence code. +void Debugger_GT_ForceSteppingMode(void) +{ + if(!InSteppingMode) + { + NeedStep = 2; + UpdateCoreHooks(); + } +} + +// Call this function from any thread: +bool Debugger_IsActive(void) +{ + return(IsActive); +} + +// Call this function from the game thread: +bool Debugger_GT_Toggle(void) +{ + if(CurGame->Debugger) + SetActive(!IsActive, WhichMode); + + return(IsActive); +} + +void Debugger_GT_ModOpacity(int deltalove) +{ + DebuggerOpacity += deltalove; + if(DebuggerOpacity < 0) DebuggerOpacity = 0; + if(DebuggerOpacity > 0xFF) DebuggerOpacity = 0xFF; +} + +void Debugger_GT_Event(const SDL_Event *event) +{ + if(event->type == SDL_KEYDOWN) + { + if(event->key.keysym.mod & KMOD_ALT) + { + switch(event->key.keysym.sym) + { + case SDLK_1: WhichMode = 0; + GfxDebugger_SetActive(FALSE); + memdbg->SetActive(FALSE); + LogDebugger_SetActive(FALSE); + break; + case SDLK_2: WhichMode = 1; + GfxDebugger_SetActive(TRUE); + memdbg->SetActive(FALSE); + LogDebugger_SetActive(FALSE); + break; + case SDLK_3: if(CurGame->Debugger->AddressSpaces->size()) + { + WhichMode = 2; + GfxDebugger_SetActive(FALSE); + memdbg->SetActive(TRUE); + LogDebugger_SetActive(FALSE); + } + break; + case SDLK_4: if(CurGame->Debugger->SetLogFunc) + { + WhichMode = 3; + GfxDebugger_SetActive(FALSE); + memdbg->SetActive(FALSE); + LogDebugger_SetActive(TRUE); + } + break; + + default: break; + } + } + } + + if(WhichMode == 1) + { + GfxDebugger_Event(event); + return; + } + else if(WhichMode == 2) + { + memdbg->Event(event); + return; + } + else if(WhichMode == 3) + { + LogDebugger_Event(event); + return; + } + + switch(event->type) + { + case SDL_KEYDOWN: + if(event->key.keysym.mod & KMOD_ALT) + break; + + if(InPrompt) + { + myprompt->Event(event); + + if(event->key.keysym.sym == SDLK_ESCAPE) + { + delete myprompt; + myprompt = NULL; + InPrompt = None; + } + } + else switch(event->key.keysym.sym) + { + default: break; + case SDLK_MINUS: Debugger_GT_ModOpacity(-8); + break; + case SDLK_EQUALS: Debugger_GT_ModOpacity(8); + break; + + case SDLK_HOME: + if(event->key.keysym.mod & KMOD_SHIFT) + { + if(WatchLogical) + WatchAddr = 0; + else + WatchAddrPhys = 0; + } + else + { + DisAddr = 0x0000; + DisCOffs = 0xFFFFFFFF; + } + break; + case SDLK_END: + if(event->key.keysym.mod & KMOD_SHIFT) + { + if(WatchLogical) + WatchAddr = ((1ULL << CurGame->Debugger->LogAddrBits) - 1) & ~0x7F; + else + WatchAddrPhys = (((uint64)1 << CurGame->Debugger->PhysAddrBits) - 1) & ~0x7F; + } + else + { + DisAddr = ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + DisAddr &= ~(CurGame->Debugger->InstructionAlignment - 1); + DisCOffs = 0xFFFFFFFF; + } + break; + + case SDLK_PAGEUP: + if(event->key.keysym.mod & KMOD_SHIFT) + { + int change = 0x80; //InRegs ? 0x100 : 0x80; + + if(WatchLogical) + WatchAddr = (WatchAddr - change) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + else + WatchAddrPhys = (WatchAddrPhys - change) & (((uint64)1 << CurGame->Debugger->PhysAddrBits) - 1); + } + else + NeedDisAddrChange = -11; + break; + + case SDLK_PAGEDOWN: + if(event->key.keysym.mod & KMOD_SHIFT) + { + int change = 0x80; //InRegs ? 0x100 : 0x80; + + if(WatchLogical) + WatchAddr = (WatchAddr + change) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + else + WatchAddrPhys = (WatchAddrPhys + change) & (((uint64)1 << CurGame->Debugger->PhysAddrBits) - 1); + } + else + NeedDisAddrChange = 11; + break; + + case SDLK_m: + WatchLogical = !WatchLogical; + break; + + case SDLK_TAB: + if(RegsCols) + InRegs = !InRegs; + break; + + case SDLK_LEFT: + if(!InRegs) + { + if(RegsCols) + { + InRegs = true; + RegsPosX = RegsCols - 1; + } + } + else + { + if(!RegsPosX) + InRegs = false; + else + RegsPosX--; + } + + if(InRegs && RegsPosY >= RegsColsCounts[RegsPosX]) + RegsPosY = RegsColsCounts[RegsPosX] - 1; + break; + + case SDLK_RIGHT: + if(!InRegs) + { + if(RegsCols) + { + InRegs = true; + RegsPosX = 0; + } + } + else + { + if(RegsPosX == RegsCols - 1) + InRegs = false; + else + RegsPosX++; + } + + if(InRegs && RegsPosY >= RegsColsCounts[RegsPosX]) + RegsPosY = RegsColsCounts[RegsPosX] - 1; + break; + + case SDLK_UP: + if(InRegs) + { + if(RegsPosY) + RegsPosY--; + } + else + { + if(event->key.keysym.mod & KMOD_SHIFT) + { + if(WatchLogical) + WatchAddr = (WatchAddr - 0x10) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + else + WatchAddrPhys = (WatchAddrPhys - 0x10) & (((uint64)1 << CurGame->Debugger->PhysAddrBits) - 1); + } + else + { + NeedDisAddrChange = -1; + } + } + break; + + case SDLK_DOWN: + if(InRegs) + { + if(RegsPosY < (RegsColsCounts[RegsPosX] - 1)) + RegsPosY++; + } + else + { + if(event->key.keysym.mod & KMOD_SHIFT) + { + if(WatchLogical) + WatchAddr = (WatchAddr + 0x10) & ((1ULL << CurGame->Debugger->LogAddrBits) - 1); + else + WatchAddrPhys = (WatchAddrPhys + 0x10) & (((uint64)1 << CurGame->Debugger->PhysAddrBits) - 1); + } + else + { + NeedDisAddrChange = 1; + } + } + break; + + case SDLK_t: + if(CurGame->Debugger->ToggleSyntax) + { + CurGame->Debugger->ToggleSyntax(); + } + break; + + case SDLK_SPACE: + NeedPCBPToggle = 1; + break; + + case SDLK_s: + NeedStep = 2; + UpdateCoreHooks(); + break; + + case SDLK_w: + if(event->key.keysym.mod & KMOD_SHIFT) + { + if(event->key.keysym.mod & KMOD_CTRL) + { + InPrompt = IOWriteBPS; + myprompt = new DebuggerPrompt("I/O Write Breakpoints", IOWriteBreakpoints); + } + else + { + InPrompt = WriteBPS; + myprompt = new DebuggerPrompt("Write Breakpoints", WriteBreakpoints); + } + } + else if(event->key.keysym.mod & KMOD_CTRL) + { + InPrompt = AuxWriteBPS; + myprompt = new DebuggerPrompt("Aux Write Breakpoints", AuxWriteBreakpoints); + } + break; + + case SDLK_o: + if(event->key.keysym.mod & KMOD_SHIFT) + { + InPrompt = OpBPS; + myprompt = new DebuggerPrompt("Opcode Breakpoints", OpBreakpoints); + } + break; + case SDLK_r: + if(event->key.keysym.mod & KMOD_SHIFT) + { + if(event->key.keysym.mod & KMOD_CTRL) + { + InPrompt = IOReadBPS; + myprompt = new DebuggerPrompt("I/O Read Breakpoints", IOReadBreakpoints); + } + else + { + InPrompt = ReadBPS; + myprompt = new DebuggerPrompt("Read Breakpoints", ReadBreakpoints); + } + } + else if(event->key.keysym.mod & KMOD_CTRL) + { + InPrompt = AuxReadBPS; + myprompt = new DebuggerPrompt("Aux Read Breakpoints", AuxReadBreakpoints); + } + else if(InSteppingMode) + NeedRun = true; + break; + + case SDLK_l: + if(!InPrompt) + { + InPrompt = TraceLogPrompt; + myprompt = new DebuggerPrompt("Trace Log(filename end_pc)", TraceLogSpec); + } + case SDLK_i: + if(!InPrompt && CurGame->Debugger->IRQ) + { + InPrompt = ForceInt; + myprompt = new DebuggerPrompt("Force Interrupt", ""); + } + break; + case SDLK_p: + if(!InPrompt) + { + if(event->key.keysym.mod & KMOD_SHIFT) + { + InPrompt = PokeMeHL; + myprompt = new DebuggerPrompt("HL Poke(address value size)", ""); + } + else + { + InPrompt = PokeMe; + myprompt = new DebuggerPrompt("Poke(address value size)", ""); + } + } + break; + + case SDLK_g: + case SDLK_RETURN: + { + char buf[64]; + std::string ptext; + + if(event->key.keysym.mod & KMOD_SHIFT) + { + InPrompt = WatchGoto; + ptext = "Watch Address"; + trio_snprintf(buf, 64, "%08X", WatchLogical ? WatchAddr : WatchAddrPhys); + } + else + { + if(InRegs && event->key.keysym.sym != SDLK_g) + { + if((*CurGame->Debugger->RegGroups)[RegsPosX]->Regs[RegsPosY].bsize == 0xFFFF) + break; + + InPrompt = (PromptType)(EditRegs); + CurRegIP = &(*CurGame->Debugger->RegGroups)[RegsPosX]->Regs[RegsPosY]; + CurRegGroupIP = (*CurGame->Debugger->RegGroups)[RegsPosX]; + + ptext = CurRegIP->name; + int len = CurRegIP->bsize; + + uint32 RegValue; + + RegValue = CurRegGroupIP->GetRegister(CurRegIP->id, NULL, 0); + + if(len == 1) + trio_snprintf(buf, 64, "%02X", RegValue); + else if(len == 2) + trio_snprintf(buf, 64, "%04X", RegValue); + else + trio_snprintf(buf, 64, "%08X", RegValue); + } + else + { + char addr_text_fs[64]; // Format string. + + trio_snprintf(addr_text_fs, 64, "%%0%uX", (CurGame->Debugger->LogAddrBits + 3) / 4); + + InPrompt = DisGoto; + ptext = "Disassembly Address"; + trio_snprintf(buf, 64, addr_text_fs, DisAddr); + } + } + + myprompt = new DebuggerPrompt(ptext, buf); + } + break; + } + break; + } +} + +// +// Note: A lot of the more expensive initialization is deferred to when the debugger is first activated after a game is loaded. +// +void Debugger_Init(void) +{ + memdbg = new MemDebugger(); + + TraceLogSpec = ""; + TraceLogEnd = 0; + TraceLogRTO = 0; + + NeedInit = true; + WatchLogical = true; + IsActive = false; + CompactMode = false; + + WhichMode = 0; + + NeedPCBPToggle = false; + NeedStep = 0; + NeedRun = 0; + InSteppingMode = false; + + ReadBreakpoints = ""; + IOReadBreakpoints = ""; + AuxReadBreakpoints = ""; + WriteBreakpoints = ""; + IOWriteBreakpoints = ""; + AuxWriteBreakpoints = ""; + OpBreakpoints = ""; + PCBreakPoints.clear(); + + Comments.clear(); + + // + + DMTV_BackBuffer = 0; + DMTV_Surface = NULL; + DMTV_Rect = NULL; + + // + // + // + if(MDFN_GetSettingB("debugger.autostepmode")) + { + Debugger_GT_Toggle(); + Debugger_GT_ForceSteppingMode(); + } +} + +void Debugger_Kill(void) +{ + if(TraceLog) + { + fclose(TraceLog); + TraceLog = NULL; + } + + if(memdbg != NULL) + { + delete memdbg; + memdbg = NULL; + } + + for(unsigned i = 0; i < 2; i++) + { + if(DebuggerSurface[i] != NULL) + { + delete DebuggerSurface[i]; + DebuggerSurface[i] = NULL; + } + } +} diff --git a/Mednafen/mednafen/drivers/debugger.h b/Mednafen/mednafen/drivers/debugger.h new file mode 100644 index 0000000000..0d320c5b13 --- /dev/null +++ b/Mednafen/mednafen/drivers/debugger.h @@ -0,0 +1,47 @@ +#ifndef __MDFN_DRIVERS_DEBUGGER_H +#define __MDFN_DRIVERS_DEBUGGER_H + +#ifdef WANT_DEBUGGER +// _GT_ = call from game thread +// _MT_ = call from main(video blitting) thread. + +void Debugger_GT_Draw(void); +void Debugger_GT_Event(const SDL_Event* event); +bool Debugger_GT_Toggle(void); +void Debugger_GT_ModOpacity(int deltalove); + +bool Debugger_GT_IsInSteppingMode(void); +void Debugger_GT_ForceSteppingMode(void); +void Debugger_GT_ForceStepIfStepping(void); // For synchronizations with save state loading and reset/power toggles. +void Debugger_GT_SyncDisToPC(void); // Synch disassembly address to current PC/IP/whatever. + +// Must be called in a specific place in the game thread's execution path. +void Debugger_GTR_PassBlit(void); + +void Debugger_MT_DrawToScreen(const MDFN_PixelFormat& pf, signed screen_w, signed screen_h); + +bool Debugger_IsActive(void); + +void Debugger_Init(void); + +void Debugger_Kill(void); +#else + +static INLINE void Debugger_GT_Draw(void) { } +static INLINE void Debugger_GT_Event(const SDL_Event* event) { } +static INLINE bool Debugger_GT_Toggle(void) { return(false); } +static INLINE void Debugger_GT_ModOpacity(int deltalove) { } + +static INLINE bool Debugger_GT_IsInSteppingMode(void) { return(false); } +static INLINE void Debugger_GT_ForceSteppingMode(void) { } +static INLINE void Debugger_GT_ForceStepIfStepping(void) { } +static INLINE void Debugger_GT_SyncDisToPC(void) { } +static INLINE void Debugger_GTR_PassBlit(void) { } +static INLINE void Debugger_MT_DrawToScreen(const MDFN_PixelFormat& pf, signed screen_w, signed screen_h) { } +static INLINE bool Debugger_IsActive(void) { return(false); } + +static INLINE void Debugger_Init(void) { } +static INLINE void Debugger_Kill(void) { } +#endif + +#endif diff --git a/Mednafen/mednafen/drivers/ers.cpp b/Mednafen/mednafen/drivers/ers.cpp new file mode 100644 index 0000000000..d7b9e0aea0 --- /dev/null +++ b/Mednafen/mednafen/drivers/ers.cpp @@ -0,0 +1,102 @@ +#include "main.h" +#include "ers.h" + + +// Typical call sequence(example not done completely): +// NeedFrameSkip() +// (Emulate frame) +// AddEmuTime() +// Sync() or SetETtoRT() as appropriate if using another timebase too. +// (repeat) + +EmuRealSyncher::EmuRealSyncher() +{ + EmuClock = 0; +} + +void EmuRealSyncher::SetEmuClock(int64 EmuClock_arg) +{ + EmuClock = EmuClock_arg; + + NoFrameSkipTH = 50 * EmuClock / 1000; + ForcedCatchupTH = 75 * EmuClock / 1000; + + // This is overwritten in the auto-frame-rate detection code. + FrameSkipTH = 25 * EmuClock / 1000; + SetETtoRT(); + + AvgTimePerFrame = 0; + tmp_frame_accumtime = 0; +} + + +bool EmuRealSyncher::NeedFrameSkip(void) +{ + int64 RealTime = (int64)MDFND_GetTime() * EmuClock / 1000; + + // If emulation time has fallen behind real time a bit(due to Mednafen not getting enough host CPU time), + // indicate a frameskip condition in an effort to reduce Mednafen's host CPU usage so emulation time can catch up + // to real time. + if((RealTime - EmuTime) >= FrameSkipTH) + { + if((RealTime - LastNoFrameSkipTime) < NoFrameSkipTH) + return(true); + } + + LastNoFrameSkipTime = RealTime; + return(false); +} + +void EmuRealSyncher::AddEmuTime(const int64 zetime, bool frame_end) +{ + EmuTime += zetime; + + tmp_frame_accumtime += zetime; + + if(frame_end) + { + if(!AvgTimePerFrame) + AvgTimePerFrame = tmp_frame_accumtime << 8; + else + AvgTimePerFrame += ((tmp_frame_accumtime << 8) - AvgTimePerFrame) >> 2; + + FrameSkipTH = 1.5 * (AvgTimePerFrame >> 8); + + //printf("%lld\n", AvgTimePerFrame >> 8); + tmp_frame_accumtime = 0; + } +} + +void EmuRealSyncher::SetETtoRT(void) +{ + int64 RealTime = (int64)MDFND_GetTime() * EmuClock / 1000; + + EmuTime = RealTime; +} + +void EmuRealSyncher::Sync(void) +{ + int64 RealTime; + + do + { + int64 SleepTime; + + RealTime = (int64)MDFND_GetTime() * EmuClock / 1000; + + // If emulation time has fallen behind real time too far(due to Mednafen not getting enough host CPU time), + // do a forced catchup, to prevent running way too fast for an excessive period of time(which makes the game as unplayable + // as it would be when emulation was running way too slow for an excessive period of time) + if((RealTime - EmuTime) >= ForcedCatchupTH) + { + EmuTime = RealTime; + } + + SleepTime = ((EmuTime - RealTime) * 1000 / EmuClock) - 1; + + if(SleepTime >= 0) + MDFND_Sleep(SleepTime); + + } while(RealTime < EmuTime); +} + diff --git a/Mednafen/mednafen/drivers/ers.h b/Mednafen/mednafen/drivers/ers.h new file mode 100644 index 0000000000..795d59d6ae --- /dev/null +++ b/Mednafen/mednafen/drivers/ers.h @@ -0,0 +1,33 @@ +class EmuRealSyncher +{ + public: + EmuRealSyncher(); + ~EmuRealSyncher() + { + + } + + void SetEmuClock(int64 EmuClock_arg); + + bool NeedFrameSkip(void); + void Sync(); + void AddEmuTime(const int64 zetime, bool frame_end = true); + + void SetETtoRT(void); + + private: + int64 EmuClock; + + int64 EmuTime; + + int64 ForcedCatchupTH; + int64 FrameSkipTH; + int64 NoFrameSkipTH; + + int64 LastNoFrameSkipTime; + + int64 AvgTimePerFrame; // 56.8 + + int64 tmp_frame_accumtime; +}; + diff --git a/Mednafen/mednafen/drivers/fps.cpp b/Mednafen/mednafen/drivers/fps.cpp new file mode 100644 index 0000000000..b1bd8a38e5 --- /dev/null +++ b/Mednafen/mednafen/drivers/fps.cpp @@ -0,0 +1,209 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "video.h" +#include +#include + +static struct +{ + uint32 t; + uint8 mask; +} TimeDrawn[128]; + +static unsigned TDIndex; +static MDFN_Surface *FPSSurface = NULL; +static MDFN_Rect FPSRect; +static volatile float cur_vfps, cur_dfps, cur_bfps; +static uint8 inc_mask; + +void FPS_Init(void) +{ + TDIndex = 0; + + inc_mask = 0; + + cur_vfps = 0; + cur_dfps = 0; + cur_bfps = 0; + + memset(TimeDrawn, 0, sizeof(TimeDrawn)); +} + +void FPS_IncVirtual(void) +{ + inc_mask |= 1; +} + +void FPS_IncDrawn(void) +{ + inc_mask |= 2; +} + +void FPS_IncBlitted(void) +{ + inc_mask |= 4; +} + +static bool isactive = 0; + +void FPS_ToggleView(void) +{ + isactive ^= 1; +} + +const int box_width = 6 * 5; +const int box_height = 3 * 7; + +bool FPS_IsActive(int *w, int *h) +{ + if(!isactive) + return(FALSE); + + if(w) + *w = box_width; + + if(h) + *h = box_height; + + return(TRUE); +} + +void FPS_UpdateCalc(void) +{ + uint32 curtime = SDL_GetTicks(); + uint32 mintime = ~0U; + + TimeDrawn[TDIndex].t = curtime; + TimeDrawn[TDIndex].mask = inc_mask; + TDIndex = (TDIndex + 1) & 127; + inc_mask = 0; + + if(!isactive) + return; + + uint32 vt_frames_drawn = 0, dt_frames_drawn = 0, bt_frames_drawn = 0; + + for(int x = 0; x < 128; x++) + { + int qi = (x + TDIndex) & 127; + + if(TimeDrawn[qi].t >= (curtime - 1000)) + { + if(mintime != ~0U) + { + vt_frames_drawn += (bool)(TimeDrawn[qi].mask & 0x1); + dt_frames_drawn += (bool)(TimeDrawn[qi].mask & 0x2); + bt_frames_drawn += (bool)(TimeDrawn[qi].mask & 0x4); + } + + mintime = std::min(TimeDrawn[qi].t, mintime); + } + } + + if(curtime > mintime) + { + cur_vfps = (float)vt_frames_drawn * 1000 / (curtime - mintime); + cur_dfps = (float)dt_frames_drawn * 1000 / (curtime - mintime); + cur_bfps = (float)bt_frames_drawn * 1000 / (curtime - mintime); + } + else + { + cur_vfps = 0; + cur_dfps = 0; + cur_bfps = 0; + } +} + +static void CalcFramerates(char *virtfps, char *drawnfps, char *blitfps, size_t maxlen) +{ + double vf = cur_vfps, df = cur_dfps, bf = cur_bfps; + + if(vf != 0) + trio_snprintf(virtfps, maxlen, "%f", vf); + else + trio_snprintf(virtfps, maxlen, "?"); + + if(df != 0) + trio_snprintf(drawnfps, maxlen, "%f", df); + else + trio_snprintf(drawnfps, maxlen, "?"); + + if(bf != 0) + trio_snprintf(blitfps, maxlen, "%f", bf); + else + trio_snprintf(blitfps, maxlen, "?"); +} + +void FPS_Draw(MDFN_Surface *target, const int xpos, const int ypos) +{ + if(!isactive) + return; + + const uint32 bg_color = target->MakeColor(0, 0, 0); + const uint32 text_color = target->MakeColor(0xFF, 0xFF, 0xFF); + char virtfps[32], drawnfps[32], blitfps[32]; + + CalcFramerates(virtfps, drawnfps, blitfps, 32); + + MDFN_DrawFillRect(target, xpos, ypos, box_width, box_height, bg_color); + + DrawTextTrans(target->pixels + xpos + ypos * target->pitch32, target->pitch32 << 2, box_width, virtfps, text_color, FALSE, TRUE); + DrawTextTrans(target->pixels + xpos + (ypos + 7) * target->pitch32, target->pitch32 << 2, box_width, drawnfps, text_color, FALSE, TRUE); + DrawTextTrans(target->pixels + xpos + (ypos + 7 * 2) * target->pitch32, target->pitch32 << 2, box_width, blitfps, text_color, FALSE, TRUE); +} + +#define MK_COLOR_A(surface, r,g,b,a) ( surface->MakeColor(r, g, b, a)) +void FPS_DrawToScreen(SDL_Surface *screen, int rs, int gs, int bs, int as, unsigned offsx, unsigned offsy) +{ + if(!isactive) + { + if(FPSSurface) + { + delete FPSSurface; + FPSSurface = NULL; + } + return; + } + + if(!FPSSurface) + { + FPSSurface = new MDFN_Surface(NULL, box_width, box_height, box_width, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, rs, gs, bs, as)); + FPSRect.w = box_width; + FPSRect.h = box_height; + FPSRect.x = FPSRect.y = 0; + } + + char virtfps[32], drawnfps[32], blitfps[32]; + + CalcFramerates(virtfps, drawnfps, blitfps, 32); + + FPSSurface->Fill(0, 0, 0, 0x80); + + DrawTextTrans(FPSSurface->pixels, FPSSurface->pitchinpix << 2, FPSSurface->w, virtfps, MK_COLOR_A(FPSSurface, 0xFF, 0xFF, 0xFF, 0xFF), FALSE, TRUE); + DrawTextTrans(FPSSurface->pixels + 7 * FPSSurface->pitchinpix, FPSSurface->pitchinpix << 2, FPSSurface->w, drawnfps, MK_COLOR_A(FPSSurface, 0xFF, 0xFF, 0xFF, 0xFF), FALSE, TRUE); + DrawTextTrans(FPSSurface->pixels + 7 * 2 * FPSSurface->pitchinpix, FPSSurface->pitchinpix << 2, FPSSurface->w, blitfps, MK_COLOR_A(FPSSurface, 0xFF, 0xFF, 0xFF, 0xFF), FALSE, TRUE); + + MDFN_Rect drect; + drect.x = offsx; + drect.y = offsy; + drect.w = FPSRect.w; + drect.h = FPSRect.h; + + BlitRaw(FPSSurface, &FPSRect, &drect, -1); +} diff --git a/Mednafen/mednafen/drivers/fps.h b/Mednafen/mednafen/drivers/fps.h new file mode 100644 index 0000000000..e27f1d18ae --- /dev/null +++ b/Mednafen/mednafen/drivers/fps.h @@ -0,0 +1,16 @@ +#ifndef __MDFN_DRIVERS_FPS_H +#define __MDFN_DRIVERS_FPS_H + +void FPS_Init(void); // GT +void FPS_IncVirtual(void); // GT +void FPS_IncDrawn(void); // GT +void FPS_IncBlitted(void); // GT +void FPS_UpdateCalc(void); // GT + +void FPS_Draw(MDFN_Surface *target, const int xpos, const int ypos); // MT +void FPS_DrawToScreen(SDL_Surface *screen, int rs, int gs, int bs, int as, unsigned offsx, unsigned offsy); // MT + +bool FPS_IsActive(int *w, int *h); +void FPS_ToggleView(void); // GT + +#endif diff --git a/Mednafen/mednafen/drivers/gfxdebugger.cpp b/Mednafen/mednafen/drivers/gfxdebugger.cpp new file mode 100644 index 0000000000..b5c7f926f5 --- /dev/null +++ b/Mednafen/mednafen/drivers/gfxdebugger.cpp @@ -0,0 +1,258 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "gfxdebugger.h" +#include "debugger.h" +#include + +static MDFN_Surface *gd_surface = NULL; +static bool IsActive = 0; +static const char *LayerNames[16]; +static int LayerScanline[16] = { 0 }; +static int LayerScroll[16] = { 0 }; +static int LayerPBN[16] = { 0 }; +static int LayerCount = 0; +static int CurLayer = 0; + +static void RedoSGD(bool instant = 0) +{ + CurGame->Debugger->SetGraphicsDecode(gd_surface, instant ? -1 : LayerScanline[CurLayer], CurLayer, 0, LayerScroll[CurLayer], LayerPBN[CurLayer]); +} + +// Call this function from the game thread. +void GfxDebugger_SetActive(bool newia) +{ + if(CurGame->Debugger && CurGame->Debugger->SetGraphicsDecode) + { + IsActive = newia; + + if(IsActive && !LayerCount) + { + LayerCount = 0; + + int clen; + const char *lnp = CurGame->LayerNames; + while((clen = strlen(lnp))) + { + LayerNames[LayerCount] = lnp; + LayerCount++; + lnp += clen + 1; + } + } + + if(!IsActive) + { + if(gd_surface) + { + delete gd_surface; + gd_surface = NULL; + } + } + else if(IsActive) + { + if(!gd_surface) + gd_surface = new MDFN_Surface(NULL, 128, 128, 128 * 3, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, 0, 8, 16, 24)); + } + RedoSGD(); + } +} + +#define MK_COLOR_A(r,g,b,a) (pf_cache.MakeColor(r, g, b, a)) + +// Call this function from the game thread +void GfxDebugger_Draw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *screen_rect) +{ + if(!IsActive) + return; + + const MDFN_PixelFormat pf_cache = surface->format; + uint32 *src_pixels; + uint32 * pixels = surface->pixels; + uint32 pitch32 = surface->pitchinpix; + const bool ism = Debugger_GT_IsInSteppingMode(); + + if(ism) + { + RedoSGD(TRUE); + } + + if(gd_surface->format.Rshift != surface->format.Rshift || gd_surface->format.Gshift != surface->format.Gshift || + gd_surface->format.Bshift != surface->format.Bshift || gd_surface->format.Ashift != surface->format.Ashift || + gd_surface->format.colorspace != surface->format.colorspace) + { + //puts("Convert Meow"); + gd_surface->SetFormat(surface->format, TRUE); + } + + src_pixels = gd_surface->pixels; + + if(!src_pixels) + { + + return; + } + + for(unsigned int y = 0; y < 128; y++) + { + uint32 *row = pixels + ((rect->w - 256) / 2) + y * pitch32 * 2; + for(unsigned int x = 0; x < 128; x++) + { + //printf("%d %d %d\n", y, x, pixels); + row[x*2] = row[x*2 + 1] = row[pitch32 + x*2] = row[pitch32 + x*2 + 1] = src_pixels[x + y * 128 * 3]; + //row[x] = MK_COLOR_A(0, 0, 0, 0xc0); + //row[x] = MK_COLOR_A(0x00, 0x00, 0x00, 0x7F); + } + } + + + // Draw layer name + { + for(int y = 256; y < 256 + 18; y++) + { + for(int x = 0; x < rect->w; x++) + { + pixels[y * pitch32 + x] = MK_COLOR_A(0x00, 0x00, 0x00, 0xC0); + } + } + char buf[256]; + + if(ism) + trio_snprintf(buf, 256, "%s, PBN: %d, Scroll: %d, Instant", LayerNames[CurLayer], LayerPBN[CurLayer], LayerScroll[CurLayer]); + else + trio_snprintf(buf, 256, "%s, PBN: %d, Scroll: %d, Line: %d", LayerNames[CurLayer], LayerPBN[CurLayer], LayerScroll[CurLayer], LayerScanline[CurLayer]); + DrawTextTransShadow(pixels + 256 * pitch32, surface->pitchinpix << 2, rect->w, buf, MK_COLOR_A(0xF0, 0xF0, 0xF0, 0xFF), MK_COLOR_A(0, 0, 0, 0xFF), 1, FALSE); + } + + int mousex, mousey; + SDL_GetMouseState(&mousex, &mousey); + int vx, vy; + + vx = (mousex - screen_rect->x) * rect->w / screen_rect->w - ((rect->w - 256) / 2); + vy = (mousey - screen_rect->y) * rect->h / screen_rect->h; + + vx /= 2; + vy /= 2; + + if(vx < 128 && vy < 128 && vx >= 0 && vy >= 0) + { + if(src_pixels[vx + vy * 128 * 3] & (0xFF << surface->format.Ashift)) + { + for(int y = 278; y < 278 + 18; y++) + for(int x = 0; x < rect->w; x++) + { + pixels[y * pitch32 + x] = MK_COLOR_A(0x00, 0x00, 0x00, 0xC0); + } + char buf[256]; + + trio_snprintf(buf, 256, "Tile: %08x, Address: %08x", src_pixels[128 + vx + vy * 128 * 3], src_pixels[256 + vx + vy * 128 * 3]); + + DrawTextTransShadow(pixels + 278 * pitch32, surface->pitchinpix << 2, rect->w, buf, MK_COLOR_A(0xF0, 0xF0, 0xF0, 0xFF), MK_COLOR_A(0, 0, 0, 0xFF), 1, FALSE); + } + } + + +} + +// Call this from the game thread +int GfxDebugger_Event(const SDL_Event *event) +{ + switch(event->type) + { + case SDL_KEYDOWN: + switch(event->key.keysym.sym) + { + default: break; + + case SDLK_MINUS: + + if(LayerScanline[CurLayer]) + { + LayerScanline[CurLayer]--; + RedoSGD(); + } + + break; + case SDLK_EQUALS: + + LayerScanline[CurLayer]++; + RedoSGD(); + + break; + case SDLK_UP: + if(LayerScroll[CurLayer]) + { + LayerScroll[CurLayer]--; + RedoSGD(); + } + + break; + + case SDLK_PAGEUP: + + LayerScroll[CurLayer] -= 8; + if(LayerScroll[CurLayer] < 0) + LayerScroll[CurLayer] = 0; + RedoSGD(); + + break; + + case SDLK_PAGEDOWN: + + LayerScroll[CurLayer] += 8; + RedoSGD(); + + break; + case SDLK_DOWN: + LayerScroll[CurLayer]++; + RedoSGD(); + + break; + case SDLK_LEFT: + CurLayer = (CurLayer - 1); + + if(CurLayer < 0) CurLayer = LayerCount - 1; + + RedoSGD(); + + break; + case SDLK_RIGHT: + CurLayer = (CurLayer + 1) % LayerCount; + RedoSGD(); + + break; + + + case SDLK_COMMA: + if(LayerPBN[CurLayer] >= 0) + LayerPBN[CurLayer]--; + RedoSGD(); + + break; + + case SDLK_PERIOD: + + LayerPBN[CurLayer]++; + RedoSGD(); + + break; + } + break; + } + return(1); +} + diff --git a/Mednafen/mednafen/drivers/gfxdebugger.h b/Mednafen/mednafen/drivers/gfxdebugger.h new file mode 100644 index 0000000000..6a7f4a3868 --- /dev/null +++ b/Mednafen/mednafen/drivers/gfxdebugger.h @@ -0,0 +1,8 @@ +#ifndef __MDFN_DRIVERS_GFXDEBUGGER_H +#define __MDFN_DRIVERS_GFXDEBUGGER_H + +void GfxDebugger_Draw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *screen_rect); +int GfxDebugger_Event(const SDL_Event *event); +void GfxDebugger_SetActive(bool newia); + +#endif diff --git a/Mednafen/mednafen/drivers/help.cpp b/Mednafen/mednafen/drivers/help.cpp new file mode 100644 index 0000000000..9c072b284c --- /dev/null +++ b/Mednafen/mednafen/drivers/help.cpp @@ -0,0 +1,122 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include + +static bool IsActive; + +void Help_Draw(MDFN_Surface *surface, const MDFN_Rect *rect) +{ + if(!IsActive) return; + + uint32 bgcolor = surface->MakeColor(0, 0, 0, 0xFF); + uint32 *pixels = surface->pixels; + uint32 pitch32 = surface->pitch32; + + for(int y = 0; y < rect->h; y++) + { + uint32 *row = pixels + y * pitch32; + + for(int x = 0; x < rect->w; x++) + row[x] = bgcolor; + } + + static const char *HelpStrings[][2] = { + { "F1", gettext_noop("Toggle Help") }, + { "-", NULL }, + { "F2", gettext_noop("Configure Command Key") }, + { "SHIFT + F2", gettext_noop("Configure Command Key, for logical AND mode") }, + { "ALT + SHIFT + [n]", gettext_noop("Configure buttons on port n(1-8)") }, + { "CTRL + SHIFT + [n]", gettext_noop("Select device on port n") }, + { "Scroll Lock", gettext_noop("Toggle input grabbing(for emulated mice)") }, + { "SHIFT + Scroll Lock", gettext_noop("\" \" \" + command key disabling") }, + { "-", NULL }, + { "ALT + O", gettext_noop("Rotate Screen") }, + { "ALT + ENTER", gettext_noop("Toggle Fullscreen Mode") }, + { "F9", gettext_noop("Take Screen Snapshot") }, + { "-", NULL }, + { "ALT + S", gettext_noop("Enable state rewinding") }, + { "BACKSPACE", gettext_noop("Rewind") }, + { "F5", gettext_noop("Save State") }, + { "F7", gettext_noop("Load State") }, + { "F6", gettext_noop("Select Disk") }, + { "F8", gettext_noop("Insert coin; Insert/Eject disk") }, + { "-", NULL }, + { "F10", gettext_noop("(Soft) Reset, if available on emulated system.") }, + { "F11", gettext_noop("Power Toggle/Hard Reset") }, + { "F12", gettext_noop("Exit") }, +}; + + unsigned y = 0; + + DrawTextTrans(pixels + pitch32 * y, surface->pitch32 << 2, rect->w, _("Default key assignments:"), surface->MakeColor(0x00,0xFF,0x00,0xFF), false, MDFN_FONT_9x18_18x18); + y += 18; + + for(unsigned int i = 0; i < sizeof(HelpStrings) / sizeof(HelpStrings[0]); i++) + { + if((int)(y + 18) > rect->h) + break; + + unsigned x = 0; + if(HelpStrings[i][0][0] == '-') + { + y -= 4; + DrawTextTrans(pixels + pitch32 * y, surface->pitch32 << 2, rect->w, " -------------------------------------------------------", surface->MakeColor(0x60,0x60,0x60,0xFF), FALSE, MDFN_FONT_9x18_18x18); + y += 14; + } + else + { + x += 9; + + x += DrawTextTrans(pixels + pitch32 * y + x, surface->pitch32 << 2, rect->w - x, HelpStrings[i][0], + surface->MakeColor(0x40,0xDF,0x40,0xFF), FALSE, MDFN_FONT_9x18_18x18); + + x += DrawTextTrans(pixels + pitch32 * y + x, surface->pitch32 << 2, rect->w - x, " - ", + surface->MakeColor(0x40,0x40,0x40,0xFF), FALSE, MDFN_FONT_9x18_18x18); + + x += DrawTextTrans(pixels + pitch32 * y + x, surface->pitch32 << 2, rect->w - x, _(HelpStrings[i][1]), + surface->MakeColor(0xC0,0xC0,0xC0,0xFF), FALSE, MDFN_FONT_9x18_18x18); + + y += 18; + } + + } +} + +bool Help_IsActive(void) +{ + + return(IsActive); +} + +bool Help_Toggle(void) +{ + IsActive = !IsActive; + return(IsActive); +} + +void Help_Init(void) +{ + IsActive = false; +} + +void Help_Close(void) +{ + +} diff --git a/Mednafen/mednafen/drivers/help.h b/Mednafen/mednafen/drivers/help.h new file mode 100644 index 0000000000..8bfcc5cec9 --- /dev/null +++ b/Mednafen/mednafen/drivers/help.h @@ -0,0 +1,10 @@ +#ifndef __MDFN_DRIVERS_HELP_H +#define __MDFN_DRIVERS_HELP_H + +void Help_Draw(MDFN_Surface *surface, const MDFN_Rect *rect); +bool Help_IsActive(void); +bool Help_Toggle(void); +void Help_Init(void); +void Help_Close(void); + +#endif diff --git a/Mednafen/mednafen/drivers/hq2x.cpp b/Mednafen/mednafen/drivers/hq2x.cpp new file mode 100644 index 0000000000..04d3d919ba --- /dev/null +++ b/Mednafen/mednafen/drivers/hq2x.cpp @@ -0,0 +1,2860 @@ +//hq2x filter demo program +//---------------------------------------------------------- +//Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) + +//This program is free software; you can redistribute it and/or +//modify it under the terms of the GNU Lesser General Public +//License as published by the Free Software Foundation; either +//version 2.1 of the License, or (at your option) any later version. +// +//This program is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//Lesser General Public License for more details. +// +//You should have received a copy of the GNU Lesser General Public +//License along with this program; if not, write to the Free Software +//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +/* Modified for usage in Mednafen */ + +#include "main.h" +#include + +#define HQXX_INTERNAL +#include "hqxx-common.h" + +static inline void Interp1(unsigned char * pc, int c1, int c2) +{ + *((int*)pc) = (c1*3+c2) >> 2; +} + +static inline void Interp2(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = (c1*2+c2+c3) >> 2; +} + +static inline void Interp5(unsigned char * pc, int c1, int c2) +{ + *((int*)pc) = (c1+c2) >> 1; +} + +static inline void Interp6(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*2 + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*2 + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +static inline void Interp7(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = ((((c1 & 0x00FF00)*6 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*6 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +static inline void Interp9(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*3 ) & 0x0007F800) + + (((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*3 ) & 0x07F807F8)) >> 3; +} + +static inline void Interp10(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = ((((c1 & 0x00FF00)*14 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x000FF000) + + (((c1 & 0xFF00FF)*14 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x0FF00FF0)) >> 4; +} + + +#define PIXEL00_0 *((int*)(pOut)) = w[5]; +#define PIXEL00_10 Interp1(pOut, w[5], w[1]); +#define PIXEL00_11 Interp1(pOut, w[5], w[4]); +#define PIXEL00_12 Interp1(pOut, w[5], w[2]); +#define PIXEL00_20 Interp2(pOut, w[5], w[4], w[2]); +#define PIXEL00_21 Interp2(pOut, w[5], w[1], w[2]); +#define PIXEL00_22 Interp2(pOut, w[5], w[1], w[4]); +#define PIXEL00_60 Interp6(pOut, w[5], w[2], w[4]); +#define PIXEL00_61 Interp6(pOut, w[5], w[4], w[2]); +#define PIXEL00_70 Interp7(pOut, w[5], w[4], w[2]); +#define PIXEL00_90 Interp9(pOut, w[5], w[4], w[2]); +#define PIXEL00_100 Interp10(pOut, w[5], w[4], w[2]); +#define PIXEL01_0 *((int*)(pOut+4)) = w[5]; +#define PIXEL01_10 Interp1(pOut+4, w[5], w[3]); +#define PIXEL01_11 Interp1(pOut+4, w[5], w[2]); +#define PIXEL01_12 Interp1(pOut+4, w[5], w[6]); +#define PIXEL01_20 Interp2(pOut+4, w[5], w[2], w[6]); +#define PIXEL01_21 Interp2(pOut+4, w[5], w[3], w[6]); +#define PIXEL01_22 Interp2(pOut+4, w[5], w[3], w[2]); +#define PIXEL01_60 Interp6(pOut+4, w[5], w[6], w[2]); +#define PIXEL01_61 Interp6(pOut+4, w[5], w[2], w[6]); +#define PIXEL01_70 Interp7(pOut+4, w[5], w[2], w[6]); +#define PIXEL01_90 Interp9(pOut+4, w[5], w[2], w[6]); +#define PIXEL01_100 Interp10(pOut+4, w[5], w[2], w[6]); +#define PIXEL10_0 *((int*)(pOut+BpL)) = w[5]; +#define PIXEL10_10 Interp1(pOut+BpL, w[5], w[7]); +#define PIXEL10_11 Interp1(pOut+BpL, w[5], w[8]); +#define PIXEL10_12 Interp1(pOut+BpL, w[5], w[4]); +#define PIXEL10_20 Interp2(pOut+BpL, w[5], w[8], w[4]); +#define PIXEL10_21 Interp2(pOut+BpL, w[5], w[7], w[4]); +#define PIXEL10_22 Interp2(pOut+BpL, w[5], w[7], w[8]); +#define PIXEL10_60 Interp6(pOut+BpL, w[5], w[4], w[8]); +#define PIXEL10_61 Interp6(pOut+BpL, w[5], w[8], w[4]); +#define PIXEL10_70 Interp7(pOut+BpL, w[5], w[8], w[4]); +#define PIXEL10_90 Interp9(pOut+BpL, w[5], w[8], w[4]); +#define PIXEL10_100 Interp10(pOut+BpL, w[5], w[8], w[4]); +#define PIXEL11_0 *((int*)(pOut+BpL+4)) = w[5]; +#define PIXEL11_10 Interp1(pOut+BpL+4, w[5], w[9]); +#define PIXEL11_11 Interp1(pOut+BpL+4, w[5], w[6]); +#define PIXEL11_12 Interp1(pOut+BpL+4, w[5], w[8]); +#define PIXEL11_20 Interp2(pOut+BpL+4, w[5], w[6], w[8]); +#define PIXEL11_21 Interp2(pOut+BpL+4, w[5], w[9], w[8]); +#define PIXEL11_22 Interp2(pOut+BpL+4, w[5], w[9], w[6]); +#define PIXEL11_60 Interp6(pOut+BpL+4, w[5], w[8], w[6]); +#define PIXEL11_61 Interp6(pOut+BpL+4, w[5], w[6], w[8]); +#define PIXEL11_70 Interp7(pOut+BpL+4, w[5], w[6], w[8]); +#define PIXEL11_90 Interp9(pOut+BpL+4, w[5], w[6], w[8]); +#define PIXEL11_100 Interp10(pOut+BpL+4, w[5], w[6], w[8]); + +static int MDFN_FASTCALL Diff(unsigned int w1, unsigned int w2) +{ + int YUV1; + int YUV2; + + YUV1 = hqxx_RGB_to_YUV(w1); + YUV2 = hqxx_RGB_to_YUV(w2); + + return ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ); +} + +void hq2x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int srcBpL, int BpL ) +{ + int i, j, k; + int prevline, nextline; + unsigned int w[10]; + + // +----+----+----+ + // | | | | + // | w1 | w2 | w3 | + // +----+----+----+ + // | | | | + // | w4 | w5 | w6 | + // +----+----+----+ + // | | | | + // | w7 | w8 | w9 | + // +----+----+----+ + + for (j=0; j0) prevline = -srcBpL; else prevline = 0; + if (j0) + { + w[1] = *((unsigned int*)(pIn + prevline - sizeof(uint32))) & 0xFCFCFC; + w[4] = *((unsigned int*)(pIn - sizeof(uint32))) & 0xFCFCFC; + w[7] = *((unsigned int*)(pIn + nextline - sizeof(uint32))) & 0xFCFCFC; + } + else + { + w[1] = w[2]; + w[4] = w[5]; + w[7] = w[8]; + } + + if (i trY ) || + ( abs(YUV1U - (YUV2 & Umask)) > trU ) || + ( abs(YUV1V - (YUV2 & Vmask)) > trV ) ) + pattern |= flag; + } + flag <<= 1; + } + + switch (pattern) + { + case 0: + case 1: + case 4: + case 32: + case 128: + case 5: + case 132: + case 160: + case 33: + case 129: + case 36: + case 133: + case 164: + case 161: + case 37: + case 165: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_20 + PIXEL11_20 + break; + } + case 2: + case 34: + case 130: + case 162: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + } + case 16: + case 17: + case 48: + case 49: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_21 + break; + } + case 64: + case 65: + case 68: + case 69: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_22 + break; + } + case 8: + case 12: + case 136: + case 140: + { + PIXEL00_21 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + } + case 3: + case 35: + case 131: + case 163: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_20 + PIXEL11_20 + break; + } + case 6: + case 38: + case 134: + case 166: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 20: + case 21: + case 52: + case 53: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_21 + break; + } + case 144: + case 145: + case 176: + case 177: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_20 + PIXEL11_12 + break; + } + case 192: + case 193: + case 196: + case 197: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_21 + PIXEL11_11 + break; + } + case 96: + case 97: + case 100: + case 101: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_22 + break; + } + case 40: + case 44: + case 168: + case 172: + { + PIXEL00_21 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 9: + case 13: + case 137: + case 141: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_22 + PIXEL11_20 + break; + } + case 18: + case 50: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 80: + case 81: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_20 + } + break; + } + case 72: + case 76: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 10: + case 138: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + } + case 66: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + } + case 24: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + } + case 7: + case 39: + case 135: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 148: + case 149: + case 180: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_12 + break; + } + case 224: + case 228: + case 225: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_11 + break; + } + case 41: + case 169: + case 45: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 22: + case 54: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 208: + case 209: + { + PIXEL00_20 + PIXEL01_22 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 104: + case 108: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 11: + case 139: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_22 + PIXEL11_20 + break; + } + case 19: + case 51: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_10 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 146: + case 178: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + } + case 84: + case 85: + { + PIXEL00_20 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_10 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + } + case 112: + case 113: + { + PIXEL00_20 + PIXEL01_22 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_10 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 200: + case 204: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 73: + case 77: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_10 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + } + case 42: + case 170: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + } + case 14: + case 142: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + } + case 67: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_22 + break; + } + case 70: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + } + case 28: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + } + case 152: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + } + case 194: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + } + case 98: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + } + case 56: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + } + case 25: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_21 + break; + } + case 26: + case 31: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + } + case 82: + case 214: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 88: + case 248: + { + PIXEL00_21 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 74: + case 107: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 27: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_21 + break; + } + case 86: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + PIXEL11_10 + break; + } + case 216: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 106: + { + PIXEL00_10 + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 30: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_21 + break; + } + case 210: + { + PIXEL00_22 + PIXEL01_10 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 120: + { + PIXEL00_21 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 75: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_22 + break; + } + case 29: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_21 + break; + } + case 198: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + } + case 184: + { + PIXEL00_21 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + } + case 99: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_22 + break; + } + case 57: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_21 + break; + } + case 71: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_22 + break; + } + case 156: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + } + case 226: + { + PIXEL00_22 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + } + case 60: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + } + case 195: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_21 + PIXEL11_11 + break; + } + case 102: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + } + case 153: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_22 + PIXEL11_12 + break; + } + case 58: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 83: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 92: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 202: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 78: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_22 + break; + } + case 154: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 114: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 89: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 90: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 55: + case 23: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_0 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_20 + PIXEL11_21 + break; + } + case 182: + case 150: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_20 + break; + } + case 213: + case 212: + { + PIXEL00_20 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_0 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_21 + break; + } + case 241: + case 240: + { + PIXEL00_20 + PIXEL01_22 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_0 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 236: + case 232: + { + PIXEL00_21 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 109: + case 105: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_0 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_20 + PIXEL11_22 + break; + } + case 171: + case 43: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_21 + PIXEL11_20 + break; + } + case 143: + case 15: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_22 + PIXEL11_20 + break; + } + case 124: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 203: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + PIXEL10_10 + PIXEL11_11 + break; + } + case 62: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 211: + { + PIXEL00_11 + PIXEL01_10 + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 118: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_12 + PIXEL11_10 + break; + } + case 217: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 110: + { + PIXEL00_10 + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 155: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_22 + PIXEL11_12 + break; + } + case 188: + { + PIXEL00_21 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + } + case 185: + { + PIXEL00_12 + PIXEL01_22 + PIXEL10_11 + PIXEL11_12 + break; + } + case 61: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_21 + break; + } + case 157: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_22 + PIXEL11_12 + break; + } + case 103: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_22 + break; + } + case 227: + { + PIXEL00_11 + PIXEL01_21 + PIXEL10_12 + PIXEL11_11 + break; + } + case 230: + { + PIXEL00_22 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + } + case 199: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_21 + PIXEL11_11 + break; + } + case 220: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 158: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 234: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_11 + break; + } + case 242: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 59: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 121: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 87: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 79: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_22 + break; + } + case 122: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 94: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 218: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 91: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 229: + { + PIXEL00_20 + PIXEL01_20 + PIXEL10_12 + PIXEL11_11 + break; + } + case 167: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_20 + PIXEL11_20 + break; + } + case 173: + { + PIXEL00_12 + PIXEL01_20 + PIXEL10_11 + PIXEL11_20 + break; + } + case 181: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_20 + PIXEL11_12 + break; + } + case 186: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_11 + PIXEL11_12 + break; + } + case 115: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 93: + { + PIXEL00_12 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 206: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 205: + case 201: + { + PIXEL00_12 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_10 + } + else + { + PIXEL10_70 + } + PIXEL11_11 + break; + } + case 174: + case 46: + { + if (Diff(w[4], w[2])) + { + PIXEL00_10 + } + else + { + PIXEL00_70 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + } + case 179: + case 147: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_10 + } + else + { + PIXEL01_70 + } + PIXEL10_20 + PIXEL11_12 + break; + } + case 117: + case 116: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_10 + } + else + { + PIXEL11_70 + } + break; + } + case 189: + { + PIXEL00_12 + PIXEL01_11 + PIXEL10_11 + PIXEL11_12 + break; + } + case 231: + { + PIXEL00_11 + PIXEL01_12 + PIXEL10_12 + PIXEL11_11 + break; + } + case 126: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 219: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 125: + { + if (Diff(w[8], w[4])) + { + PIXEL00_12 + PIXEL10_0 + } + else + { + PIXEL00_61 + PIXEL10_90 + } + PIXEL01_11 + PIXEL11_10 + break; + } + case 221: + { + PIXEL00_12 + if (Diff(w[6], w[8])) + { + PIXEL01_11 + PIXEL11_0 + } + else + { + PIXEL01_60 + PIXEL11_90 + } + PIXEL10_10 + break; + } + case 207: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_12 + } + else + { + PIXEL00_90 + PIXEL01_61 + } + PIXEL10_10 + PIXEL11_11 + break; + } + case 238: + { + PIXEL00_10 + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + PIXEL11_11 + } + else + { + PIXEL10_90 + PIXEL11_60 + } + break; + } + case 190: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + PIXEL11_12 + } + else + { + PIXEL01_90 + PIXEL11_61 + } + PIXEL10_11 + break; + } + case 187: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL10_11 + } + else + { + PIXEL00_90 + PIXEL10_60 + } + PIXEL01_10 + PIXEL11_12 + break; + } + case 243: + { + PIXEL00_11 + PIXEL01_10 + if (Diff(w[6], w[8])) + { + PIXEL10_12 + PIXEL11_0 + } + else + { + PIXEL10_61 + PIXEL11_90 + } + break; + } + case 119: + { + if (Diff(w[2], w[6])) + { + PIXEL00_11 + PIXEL01_0 + } + else + { + PIXEL00_60 + PIXEL01_90 + } + PIXEL10_12 + PIXEL11_10 + break; + } + case 237: + case 233: + { + PIXEL00_12 + PIXEL01_20 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 175: + case 47: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + PIXEL10_11 + PIXEL11_20 + break; + } + case 183: + case 151: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_20 + PIXEL11_12 + break; + } + case 245: + case 244: + { + PIXEL00_20 + PIXEL01_11 + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 250: + { + PIXEL00_10 + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 123: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 95: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_10 + PIXEL11_10 + break; + } + case 222: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 252: + { + PIXEL00_21 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 249: + { + PIXEL00_12 + PIXEL01_22 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 235: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_21 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 111: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_22 + break; + } + case 63: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_11 + PIXEL11_21 + break; + } + case 159: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_22 + PIXEL11_12 + break; + } + case 215: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_21 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 246: + { + PIXEL00_22 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 254: + { + PIXEL00_10 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 253: + { + PIXEL00_12 + PIXEL01_11 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 251: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_10 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 239: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + PIXEL01_12 + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + PIXEL11_11 + break; + } + case 127: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_20 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_20 + } + PIXEL11_10 + break; + } + case 191: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_11 + PIXEL11_12 + break; + } + case 223: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_10 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_20 + } + break; + } + case 247: + { + PIXEL00_11 + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + PIXEL10_12 + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + case 255: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_100 + } + if (Diff(w[2], w[6])) + { + PIXEL01_0 + } + else + { + PIXEL01_100 + } + if (Diff(w[8], w[4])) + { + PIXEL10_0 + } + else + { + PIXEL10_100 + } + if (Diff(w[6], w[8])) + { + PIXEL11_0 + } + else + { + PIXEL11_100 + } + break; + } + } + pIn += sizeof(uint32); + pOut += sizeof(uint32) * 2; + } + pOut += BpL + (BpL - Xres * 2 * sizeof(uint32)); + pIn += srcBpL - Xres * sizeof(uint32); + } +} diff --git a/Mednafen/mednafen/drivers/hq3x.cpp b/Mednafen/mednafen/drivers/hq3x.cpp new file mode 100644 index 0000000000..15ef66c955 --- /dev/null +++ b/Mednafen/mednafen/drivers/hq3x.cpp @@ -0,0 +1,3828 @@ +//hq3x filter demo program +//---------------------------------------------------------- +//Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) + +//This program is free software; you can redistribute it and/or +//modify it under the terms of the GNU Lesser General Public +//License as published by the Free Software Foundation; either +//version 2.1 of the License, or (at your option) any later version. +// +//This program is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//Lesser General Public License for more details. +// +//You should have received a copy of the GNU Lesser General Public +//License along with this program; if not, write to the Free Software +//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +/* Modified for usage in Mednafen */ + +#include "main.h" + +#define HQXX_INTERNAL +#include "hqxx-common.h" + +static inline void Interp1(unsigned char * pc, int c1, int c2) +{ + *((int*)pc) = (c1*3+c2) >> 2; +} + +static inline void Interp2(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = (c1*2+c2+c3) >> 2; +} + +static inline void Interp3(unsigned char * pc, int c1, int c2) +{ + //*((int*)pc) = (c1*7+c2)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*7 + (c2 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*7 + (c2 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +static inline void Interp4(unsigned char * pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*2+(c2+c3)*7)/16; + + *((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*7 ) & 0x000FF000) + + (((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*7 ) & 0x0FF00FF0)) >> 4; +} + +static inline void Interp5(unsigned char * pc, int c1, int c2) +{ + *((int*)pc) = (c1+c2) >> 1; +} + +#define PIXEL00_1M Interp1(pOut, w[5], w[1]); +#define PIXEL00_1U Interp1(pOut, w[5], w[2]); +#define PIXEL00_1L Interp1(pOut, w[5], w[4]); +#define PIXEL00_2 Interp2(pOut, w[5], w[4], w[2]); +#define PIXEL00_4 Interp4(pOut, w[5], w[4], w[2]); +#define PIXEL00_5 Interp5(pOut, w[4], w[2]); +#define PIXEL00_C *((int*)(pOut)) = w[5]; + +#define PIXEL01_1 Interp1(pOut+4, w[5], w[2]); +#define PIXEL01_3 Interp3(pOut+4, w[5], w[2]); +#define PIXEL01_6 Interp1(pOut+4, w[2], w[5]); +#define PIXEL01_C *((int*)(pOut+4)) = w[5]; + +#define PIXEL02_1M Interp1(pOut+8, w[5], w[3]); +#define PIXEL02_1U Interp1(pOut+8, w[5], w[2]); +#define PIXEL02_1R Interp1(pOut+8, w[5], w[6]); +#define PIXEL02_2 Interp2(pOut+8, w[5], w[2], w[6]); +#define PIXEL02_4 Interp4(pOut+8, w[5], w[2], w[6]); +#define PIXEL02_5 Interp5(pOut+8, w[2], w[6]); +#define PIXEL02_C *((int*)(pOut+8)) = w[5]; + +#define PIXEL10_1 Interp1(pOut+BpL, w[5], w[4]); +#define PIXEL10_3 Interp3(pOut+BpL, w[5], w[4]); +#define PIXEL10_6 Interp1(pOut+BpL, w[4], w[5]); +#define PIXEL10_C *((int*)(pOut+BpL)) = w[5]; + +#define PIXEL11 *((int*)(pOut+BpL+4)) = w[5]; + +#define PIXEL12_1 Interp1(pOut+BpL+8, w[5], w[6]); +#define PIXEL12_3 Interp3(pOut+BpL+8, w[5], w[6]); +#define PIXEL12_6 Interp1(pOut+BpL+8, w[6], w[5]); +#define PIXEL12_C *((int*)(pOut+BpL+8)) = w[5]; + +#define PIXEL20_1M Interp1(pOut+BpL+BpL, w[5], w[7]); +#define PIXEL20_1D Interp1(pOut+BpL+BpL, w[5], w[8]); +#define PIXEL20_1L Interp1(pOut+BpL+BpL, w[5], w[4]); +#define PIXEL20_2 Interp2(pOut+BpL+BpL, w[5], w[8], w[4]); +#define PIXEL20_4 Interp4(pOut+BpL+BpL, w[5], w[8], w[4]); +#define PIXEL20_5 Interp5(pOut+BpL+BpL, w[8], w[4]); +#define PIXEL20_C *((int*)(pOut+BpL+BpL)) = w[5]; + +#define PIXEL21_1 Interp1(pOut+BpL+BpL+4, w[5], w[8]); +#define PIXEL21_3 Interp3(pOut+BpL+BpL+4, w[5], w[8]); +#define PIXEL21_6 Interp1(pOut+BpL+BpL+4, w[8], w[5]); +#define PIXEL21_C *((int*)(pOut+BpL+BpL+4)) = w[5]; + +#define PIXEL22_1M Interp1(pOut+BpL+BpL+8, w[5], w[9]); +#define PIXEL22_1D Interp1(pOut+BpL+BpL+8, w[5], w[8]); +#define PIXEL22_1R Interp1(pOut+BpL+BpL+8, w[5], w[6]); +#define PIXEL22_2 Interp2(pOut+BpL+BpL+8, w[5], w[6], w[8]); +#define PIXEL22_4 Interp4(pOut+BpL+BpL+8, w[5], w[6], w[8]); +#define PIXEL22_5 Interp5(pOut+BpL+BpL+8, w[6], w[8]); +#define PIXEL22_C *((int*)(pOut+BpL+BpL+8)) = w[5]; + +static int MDFN_FASTCALL Diff(unsigned int w1, unsigned int w2) +{ + int YUV1; + int YUV2; + + YUV1 = hqxx_RGB_to_YUV(w1); + YUV2 = hqxx_RGB_to_YUV(w2); + return ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ); +} + +void hq3x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int srcBpL, int BpL ) +{ + int i, j, k; + int prevline, nextline; + int w[10]; + + // +----+----+----+ + // | | | | + // | w1 | w2 | w3 | + // +----+----+----+ + // | | | | + // | w4 | w5 | w6 | + // +----+----+----+ + // | | | | + // | w7 | w8 | w9 | + // +----+----+----+ + + for (j=0; j0) prevline = -srcBpL; else prevline = 0; + if (j0) + { + w[1] = *((unsigned int*)(pIn + prevline - sizeof(uint32))) & 0xFCFCFC; + w[4] = *((unsigned int*)(pIn - sizeof(uint32))) & 0xFCFCFC; + w[7] = *((unsigned int*)(pIn + nextline - sizeof(uint32))) & 0xFCFCFC; + } + else + { + w[1] = w[2]; + w[4] = w[5]; + w[7] = w[8]; + } + + if (i trY ) || + ( abs(YUV1U - (YUV2 & Umask)) > trU ) || + ( abs(YUV1V - (YUV2 & Vmask)) > trV ) ) + pattern |= flag; + } + flag <<= 1; + } + + switch (pattern) + { + case 0: + case 1: + case 4: + case 32: + case 128: + case 5: + case 132: + case 160: + case 33: + case 129: + case 36: + case 133: + case 164: + case 161: + case 37: + case 165: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_2 + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_2 + PIXEL21_1 + PIXEL22_2 + break; + } + case 2: + case 34: + case 130: + case 162: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_2 + PIXEL21_1 + PIXEL22_2 + break; + } + case 16: + case 17: + case 48: + case 49: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1M + break; + } + case 64: + case 65: + case 68: + case 69: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_2 + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 8: + case 12: + case 136: + case 140: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_1 + PIXEL22_2 + break; + } + case 3: + case 35: + case 131: + case 163: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_2 + PIXEL21_1 + PIXEL22_2 + break; + } + case 6: + case 38: + case 134: + case 166: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_2 + PIXEL21_1 + PIXEL22_2 + break; + } + case 20: + case 21: + case 52: + case 53: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1U + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1M + break; + } + case 144: + case 145: + case 176: + case 177: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1D + break; + } + case 192: + case 193: + case 196: + case 197: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_2 + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 96: + case 97: + case 100: + case 101: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_2 + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 40: + case 44: + case 168: + case 172: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1D + PIXEL21_1 + PIXEL22_2 + break; + } + case 9: + case 13: + case 137: + case 141: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_1 + PIXEL22_2 + break; + } + case 18: + case 50: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_1M + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_1 + PIXEL11 + PIXEL20_2 + PIXEL21_1 + PIXEL22_1M + break; + } + case 80: + case 81: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_1M + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 72: + case 76: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_2 + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_1M + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 10: + case 138: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_1 + PIXEL22_2 + break; + } + case 66: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 24: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 7: + case 39: + case 135: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_2 + PIXEL21_1 + PIXEL22_2 + break; + } + case 148: + case 149: + case 180: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1U + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1D + break; + } + case 224: + case 228: + case 225: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_2 + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1R + break; + } + case 41: + case 169: + case 45: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1D + PIXEL21_1 + PIXEL22_2 + break; + } + case 22: + case 54: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_1 + PIXEL11 + PIXEL20_2 + PIXEL21_1 + PIXEL22_1M + break; + } + case 208: + case 209: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 104: + case 108: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_2 + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 11: + case 139: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_1 + PIXEL22_2 + break; + } + case 19: + case 51: + { + if (Diff(w[2], w[6])) + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL12_C + } + else + { + PIXEL00_2 + PIXEL01_6 + PIXEL02_5 + PIXEL12_1 + } + PIXEL10_1 + PIXEL11 + PIXEL20_2 + PIXEL21_1 + PIXEL22_1M + break; + } + case 146: + case 178: + { + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_1M + PIXEL12_C + PIXEL22_1D + } + else + { + PIXEL01_1 + PIXEL02_5 + PIXEL12_6 + PIXEL22_2 + } + PIXEL00_1M + PIXEL10_1 + PIXEL11 + PIXEL20_2 + PIXEL21_1 + break; + } + case 84: + case 85: + { + if (Diff(w[6], w[8])) + { + PIXEL02_1U + PIXEL12_C + PIXEL21_C + PIXEL22_1M + } + else + { + PIXEL02_2 + PIXEL12_6 + PIXEL21_1 + PIXEL22_5 + } + PIXEL00_2 + PIXEL01_1 + PIXEL10_1 + PIXEL11 + PIXEL20_1M + break; + } + case 112: + case 113: + { + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + } + else + { + PIXEL12_1 + PIXEL20_2 + PIXEL21_6 + PIXEL22_5 + } + PIXEL00_2 + PIXEL01_1 + PIXEL02_1M + PIXEL10_1 + PIXEL11 + break; + } + case 200: + case 204: + { + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + } + else + { + PIXEL10_1 + PIXEL20_5 + PIXEL21_6 + PIXEL22_2 + } + PIXEL00_1M + PIXEL01_1 + PIXEL02_2 + PIXEL11 + PIXEL12_1 + break; + } + case 73: + case 77: + { + if (Diff(w[8], w[4])) + { + PIXEL00_1U + PIXEL10_C + PIXEL20_1M + PIXEL21_C + } + else + { + PIXEL00_2 + PIXEL10_6 + PIXEL20_5 + PIXEL21_1 + } + PIXEL01_1 + PIXEL02_2 + PIXEL11 + PIXEL12_1 + PIXEL22_1M + break; + } + case 42: + case 170: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + PIXEL01_C + PIXEL10_C + PIXEL20_1D + } + else + { + PIXEL00_5 + PIXEL01_1 + PIXEL10_6 + PIXEL20_2 + } + PIXEL02_1M + PIXEL11 + PIXEL12_1 + PIXEL21_1 + PIXEL22_2 + break; + } + case 14: + case 142: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL10_C + } + else + { + PIXEL00_5 + PIXEL01_6 + PIXEL02_2 + PIXEL10_1 + } + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_1 + PIXEL22_2 + break; + } + case 67: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 70: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 28: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 152: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 194: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 98: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 56: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 25: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 26: + case 31: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL10_3 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 82: + case 214: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + } + else + { + PIXEL01_3 + PIXEL02_4 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 88: + case 248: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + } + else + { + PIXEL10_3 + PIXEL20_4 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL22_4 + } + break; + } + case 74: + case 107: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + } + else + { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 27: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 86: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 216: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 106: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 30: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 210: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 120: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 75: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 29: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1M + break; + } + case 198: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 184: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + } + case 99: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 57: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 71: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 156: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 226: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1R + break; + } + case 60: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 195: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 102: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 153: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 58: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 83: + { + PIXEL00_1L + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 92: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 202: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + } + case 78: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1M + break; + } + case 154: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 114: + { + PIXEL00_1M + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 89: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 90: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 55: + case 23: + { + if (Diff(w[2], w[6])) + { + PIXEL00_1L + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL00_2 + PIXEL01_6 + PIXEL02_5 + PIXEL12_1 + } + PIXEL10_1 + PIXEL11 + PIXEL20_2 + PIXEL21_1 + PIXEL22_1M + break; + } + case 182: + case 150: + { + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + PIXEL22_1D + } + else + { + PIXEL01_1 + PIXEL02_5 + PIXEL12_6 + PIXEL22_2 + } + PIXEL00_1M + PIXEL10_1 + PIXEL11 + PIXEL20_2 + PIXEL21_1 + break; + } + case 213: + case 212: + { + if (Diff(w[6], w[8])) + { + PIXEL02_1U + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL02_2 + PIXEL12_6 + PIXEL21_1 + PIXEL22_5 + } + PIXEL00_2 + PIXEL01_1 + PIXEL10_1 + PIXEL11 + PIXEL20_1M + break; + } + case 241: + case 240: + { + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL20_1L + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_1 + PIXEL20_2 + PIXEL21_6 + PIXEL22_5 + } + PIXEL00_2 + PIXEL01_1 + PIXEL02_1M + PIXEL10_1 + PIXEL11 + break; + } + case 236: + case 232: + { + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + PIXEL22_1R + } + else + { + PIXEL10_1 + PIXEL20_5 + PIXEL21_6 + PIXEL22_2 + } + PIXEL00_1M + PIXEL01_1 + PIXEL02_2 + PIXEL11 + PIXEL12_1 + break; + } + case 109: + case 105: + { + if (Diff(w[8], w[4])) + { + PIXEL00_1U + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL00_2 + PIXEL10_6 + PIXEL20_5 + PIXEL21_1 + } + PIXEL01_1 + PIXEL02_2 + PIXEL11 + PIXEL12_1 + PIXEL22_1M + break; + } + case 171: + case 43: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + PIXEL20_1D + } + else + { + PIXEL00_5 + PIXEL01_1 + PIXEL10_6 + PIXEL20_2 + } + PIXEL02_1M + PIXEL11 + PIXEL12_1 + PIXEL21_1 + PIXEL22_2 + break; + } + case 143: + case 15: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL02_1R + PIXEL10_C + } + else + { + PIXEL00_5 + PIXEL01_6 + PIXEL02_2 + PIXEL10_1 + } + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_1 + PIXEL22_2 + break; + } + case 124: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 203: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 62: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 211: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 118: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 217: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 110: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 155: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 188: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + } + case 185: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + } + case 61: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 157: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 103: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 227: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1R + break; + } + case 230: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1R + break; + } + case 199: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 220: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 158: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 234: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1M + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1R + break; + } + case 242: + { + PIXEL00_1M + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1L + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 59: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 121: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 87: + { + PIXEL00_1L + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1M + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 79: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1R + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1M + break; + } + case 122: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 94: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 218: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 91: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 229: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_2 + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1R + break; + } + case 167: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_2 + PIXEL21_1 + PIXEL22_2 + break; + } + case 173: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1D + PIXEL21_1 + PIXEL22_2 + break; + } + case 181: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1U + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1D + break; + } + case 186: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + } + case 115: + { + PIXEL00_1L + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 93: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 206: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + } + case 205: + case 201: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_1M + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + } + case 174: + case 46: + { + if (Diff(w[4], w[2])) + { + PIXEL00_1M + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1D + PIXEL21_1 + PIXEL22_2 + break; + } + case 179: + case 147: + { + PIXEL00_1L + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_1M + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1D + break; + } + case 117: + case 116: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1U + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_1M + } + else + { + PIXEL22_2 + } + break; + } + case 189: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + } + case 231: + { + PIXEL00_1L + PIXEL01_C + PIXEL02_1R + PIXEL10_1 + PIXEL11 + PIXEL12_1 + PIXEL20_1L + PIXEL21_C + PIXEL22_1R + break; + } + case 126: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 219: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL01_3 + PIXEL10_3 + } + PIXEL02_1M + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 125: + { + if (Diff(w[8], w[4])) + { + PIXEL00_1U + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL00_2 + PIXEL10_6 + PIXEL20_5 + PIXEL21_1 + } + PIXEL01_1 + PIXEL02_1U + PIXEL11 + PIXEL12_C + PIXEL22_1M + break; + } + case 221: + { + if (Diff(w[6], w[8])) + { + PIXEL02_1U + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL02_2 + PIXEL12_6 + PIXEL21_1 + PIXEL22_5 + } + PIXEL00_1U + PIXEL01_1 + PIXEL10_C + PIXEL11 + PIXEL20_1M + break; + } + case 207: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL02_1R + PIXEL10_C + } + else + { + PIXEL00_5 + PIXEL01_6 + PIXEL02_2 + PIXEL10_1 + } + PIXEL11 + PIXEL12_1 + PIXEL20_1M + PIXEL21_C + PIXEL22_1R + break; + } + case 238: + { + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + PIXEL22_1R + } + else + { + PIXEL10_1 + PIXEL20_5 + PIXEL21_6 + PIXEL22_2 + } + PIXEL00_1M + PIXEL01_C + PIXEL02_1R + PIXEL11 + PIXEL12_1 + break; + } + case 190: + { + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + PIXEL22_1D + } + else + { + PIXEL01_1 + PIXEL02_5 + PIXEL12_6 + PIXEL22_2 + } + PIXEL00_1M + PIXEL10_C + PIXEL11 + PIXEL20_1D + PIXEL21_1 + break; + } + case 187: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + PIXEL20_1D + } + else + { + PIXEL00_5 + PIXEL01_1 + PIXEL10_6 + PIXEL20_2 + } + PIXEL02_1M + PIXEL11 + PIXEL12_C + PIXEL21_1 + PIXEL22_1D + break; + } + case 243: + { + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL20_1L + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_1 + PIXEL20_2 + PIXEL21_6 + PIXEL22_5 + } + PIXEL00_1L + PIXEL01_C + PIXEL02_1M + PIXEL10_1 + PIXEL11 + break; + } + case 119: + { + if (Diff(w[2], w[6])) + { + PIXEL00_1L + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL00_2 + PIXEL01_6 + PIXEL02_5 + PIXEL12_1 + } + PIXEL10_1 + PIXEL11 + PIXEL20_1L + PIXEL21_C + PIXEL22_1M + break; + } + case 237: + case 233: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_2 + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_C + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + } + case 175: + case 47: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + PIXEL20_1D + PIXEL21_1 + PIXEL22_2 + break; + } + case 183: + case 151: + { + PIXEL00_1L + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_2 + PIXEL21_1 + PIXEL22_1D + break; + } + case 245: + case 244: + { + PIXEL00_2 + PIXEL01_1 + PIXEL02_1U + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_C + } + else + { + PIXEL22_2 + } + break; + } + case 250: + { + PIXEL00_1M + PIXEL01_C + PIXEL02_1M + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + } + else + { + PIXEL10_3 + PIXEL20_4 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL22_4 + } + break; + } + case 123: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + } + else + { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 95: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL10_3 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + PIXEL20_1M + PIXEL21_C + PIXEL22_1M + break; + } + case 222: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + } + else + { + PIXEL01_3 + PIXEL02_4 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 252: + { + PIXEL00_1M + PIXEL01_1 + PIXEL02_1U + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + } + else + { + PIXEL10_3 + PIXEL20_4 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_C + } + else + { + PIXEL22_2 + } + break; + } + case 249: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1M + PIXEL10_C + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL20_C + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL22_4 + } + break; + } + case 235: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + } + else + { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_C + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + } + case 111: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 63: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL02_4 + PIXEL12_3 + } + PIXEL10_C + PIXEL11 + PIXEL20_1D + PIXEL21_1 + PIXEL22_1M + break; + } + case 159: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL10_3 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + } + else + { + PIXEL02_2 + } + PIXEL11 + PIXEL12_C + PIXEL20_1M + PIXEL21_1 + PIXEL22_1D + break; + } + case 215: + { + PIXEL00_1L + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 246: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + } + else + { + PIXEL01_3 + PIXEL02_4 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_C + } + else + { + PIXEL22_2 + } + break; + } + case 254: + { + PIXEL00_1M + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + } + else + { + PIXEL01_3 + PIXEL02_4 + } + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + } + else + { + PIXEL10_3 + PIXEL20_4 + } + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL21_3 + PIXEL22_2 + } + break; + } + case 253: + { + PIXEL00_1U + PIXEL01_1 + PIXEL02_1U + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_C + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_C + } + else + { + PIXEL22_2 + } + break; + } + case 251: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + } + else + { + PIXEL00_4 + PIXEL01_3 + } + PIXEL02_1M + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL10_C + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL10_3 + PIXEL20_2 + PIXEL21_3 + } + if (Diff(w[6], w[8])) + { + PIXEL12_C + PIXEL22_C + } + else + { + PIXEL12_3 + PIXEL22_4 + } + break; + } + case 239: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + } + else + { + PIXEL00_2 + } + PIXEL01_C + PIXEL02_1R + PIXEL10_C + PIXEL11 + PIXEL12_1 + if (Diff(w[8], w[4])) + { + PIXEL20_C + } + else + { + PIXEL20_2 + } + PIXEL21_C + PIXEL22_1R + break; + } + case 127: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL01_C + PIXEL10_C + } + else + { + PIXEL00_2 + PIXEL01_3 + PIXEL10_3 + } + if (Diff(w[2], w[6])) + { + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL02_4 + PIXEL12_3 + } + PIXEL11 + if (Diff(w[8], w[4])) + { + PIXEL20_C + PIXEL21_C + } + else + { + PIXEL20_4 + PIXEL21_3 + } + PIXEL22_1M + break; + } + case 191: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + PIXEL20_1D + PIXEL21_1 + PIXEL22_1D + break; + } + case 223: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + PIXEL10_C + } + else + { + PIXEL00_4 + PIXEL10_3 + } + if (Diff(w[2], w[6])) + { + PIXEL01_C + PIXEL02_C + PIXEL12_C + } + else + { + PIXEL01_3 + PIXEL02_2 + PIXEL12_3 + } + PIXEL11 + PIXEL20_1M + if (Diff(w[6], w[8])) + { + PIXEL21_C + PIXEL22_C + } + else + { + PIXEL21_3 + PIXEL22_4 + } + break; + } + case 247: + { + PIXEL00_1L + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + } + else + { + PIXEL02_2 + } + PIXEL10_1 + PIXEL11 + PIXEL12_C + PIXEL20_1L + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_C + } + else + { + PIXEL22_2 + } + break; + } + case 255: + { + if (Diff(w[4], w[2])) + { + PIXEL00_C + } + else + { + PIXEL00_2 + } + PIXEL01_C + if (Diff(w[2], w[6])) + { + PIXEL02_C + } + else + { + PIXEL02_2 + } + PIXEL10_C + PIXEL11 + PIXEL12_C + if (Diff(w[8], w[4])) + { + PIXEL20_C + } + else + { + PIXEL20_2 + } + PIXEL21_C + if (Diff(w[6], w[8])) + { + PIXEL22_C + } + else + { + PIXEL22_2 + } + break; + } + } + pIn += sizeof(uint32); + pOut+=12; + } + pOut += BpL * 3 - Xres * 3 * sizeof(uint32); + pIn += srcBpL - Xres * sizeof(uint32); + } +} diff --git a/Mednafen/mednafen/drivers/hq4x.cpp b/Mednafen/mednafen/drivers/hq4x.cpp new file mode 100644 index 0000000000..921b892558 --- /dev/null +++ b/Mednafen/mednafen/drivers/hq4x.cpp @@ -0,0 +1,5280 @@ +//hq4x filter demo program +//---------------------------------------------------------- +//Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) + +//This program is free software; you can redistribute it and/or +//modify it under the terms of the GNU Lesser General Public +//License as published by the Free Software Foundation; either +//version 2.1 of the License, or (at your option) any later version. +// +//This program is distributed in the hope that it will be useful, +//but WITHOUT ANY WARRANTY; without even the implied warranty of +//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +//Lesser General Public License for more details. +// +//You should have received a copy of the GNU Lesser General Public +//License along with this program; if not, write to the Free Software +//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +/* Modified for usage in Mednafen */ + +#include "main.h" + +#define HQXX_INTERNAL +#include "hqxx-common.h" + +static int YUV1, YUV2; + +static inline void Interp1(unsigned char * pc, int c1, int c2) +{ + *((int*)pc) = (c1*3+c2) >> 2; +} + +static inline void Interp2(unsigned char * pc, int c1, int c2, int c3) +{ + *((int*)pc) = (c1*2+c2+c3) >> 2; +} + +static inline void Interp3(unsigned char * pc, int c1, int c2) +{ + //*((int*)pc) = (c1*7+c2)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*7 + (c2 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*7 + (c2 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +static inline void Interp5(unsigned char * pc, int c1, int c2) +{ + *((int*)pc) = (c1+c2) >> 1; +} + +static inline void Interp6(unsigned char * pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*5+c2*2+c3)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*2 + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*2 + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +static inline void Interp7(unsigned char * pc, int c1, int c2, int c3) +{ + //*((int*)pc) = (c1*6+c2+c3)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*6 + (c2 & 0x00FF00) + (c3 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*6 + (c2 & 0xFF00FF) + (c3 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +} + +static inline void Interp8(unsigned char * pc, int c1, int c2) +{ + //*((int*)pc) = (c1*5+c2*3)/8; + + *((int*)pc) = ((((c1 & 0x00FF00)*5 + (c2 & 0x00FF00)*3 ) & 0x0007F800) + + (((c1 & 0xFF00FF)*5 + (c2 & 0xFF00FF)*3 ) & 0x07F807F8)) >> 3; +} + +#define PIXEL00_0 *((int*)(pOut)) = w[5]; +#define PIXEL00_11 Interp1(pOut, w[5], w[4]); +#define PIXEL00_12 Interp1(pOut, w[5], w[2]); +#define PIXEL00_20 Interp2(pOut, w[5], w[2], w[4]); +#define PIXEL00_50 Interp5(pOut, w[2], w[4]); +#define PIXEL00_80 Interp8(pOut, w[5], w[1]); +#define PIXEL00_81 Interp8(pOut, w[5], w[4]); +#define PIXEL00_82 Interp8(pOut, w[5], w[2]); +#define PIXEL01_0 *((int*)(pOut+4)) = w[5]; +#define PIXEL01_10 Interp1(pOut+4, w[5], w[1]); +#define PIXEL01_12 Interp1(pOut+4, w[5], w[2]); +#define PIXEL01_14 Interp1(pOut+4, w[2], w[5]); +#define PIXEL01_21 Interp2(pOut+4, w[2], w[5], w[4]); +#define PIXEL01_31 Interp3(pOut+4, w[5], w[4]); +#define PIXEL01_50 Interp5(pOut+4, w[2], w[5]); +#define PIXEL01_60 Interp6(pOut+4, w[5], w[2], w[4]); +#define PIXEL01_61 Interp6(pOut+4, w[5], w[2], w[1]); +#define PIXEL01_82 Interp8(pOut+4, w[5], w[2]); +#define PIXEL01_83 Interp8(pOut+4, w[2], w[4]); +#define PIXEL02_0 *((int*)(pOut+8)) = w[5]; +#define PIXEL02_10 Interp1(pOut+8, w[5], w[3]); +#define PIXEL02_11 Interp1(pOut+8, w[5], w[2]); +#define PIXEL02_13 Interp1(pOut+8, w[2], w[5]); +#define PIXEL02_21 Interp2(pOut+8, w[2], w[5], w[6]); +#define PIXEL02_32 Interp3(pOut+8, w[5], w[6]); +#define PIXEL02_50 Interp5(pOut+8, w[2], w[5]); +#define PIXEL02_60 Interp6(pOut+8, w[5], w[2], w[6]); +#define PIXEL02_61 Interp6(pOut+8, w[5], w[2], w[3]); +#define PIXEL02_81 Interp8(pOut+8, w[5], w[2]); +#define PIXEL02_83 Interp8(pOut+8, w[2], w[6]); +#define PIXEL03_0 *((int*)(pOut+12)) = w[5]; +#define PIXEL03_11 Interp1(pOut+12, w[5], w[2]); +#define PIXEL03_12 Interp1(pOut+12, w[5], w[6]); +#define PIXEL03_20 Interp2(pOut+12, w[5], w[2], w[6]); +#define PIXEL03_50 Interp5(pOut+12, w[2], w[6]); +#define PIXEL03_80 Interp8(pOut+12, w[5], w[3]); +#define PIXEL03_81 Interp8(pOut+12, w[5], w[2]); +#define PIXEL03_82 Interp8(pOut+12, w[5], w[6]); +#define PIXEL10_0 *((int*)(pOut+BpL)) = w[5]; +#define PIXEL10_10 Interp1(pOut+BpL, w[5], w[1]); +#define PIXEL10_11 Interp1(pOut+BpL, w[5], w[4]); +#define PIXEL10_13 Interp1(pOut+BpL, w[4], w[5]); +#define PIXEL10_21 Interp2(pOut+BpL, w[4], w[5], w[2]); +#define PIXEL10_32 Interp3(pOut+BpL, w[5], w[2]); +#define PIXEL10_50 Interp5(pOut+BpL, w[4], w[5]); +#define PIXEL10_60 Interp6(pOut+BpL, w[5], w[4], w[2]); +#define PIXEL10_61 Interp6(pOut+BpL, w[5], w[4], w[1]); +#define PIXEL10_81 Interp8(pOut+BpL, w[5], w[4]); +#define PIXEL10_83 Interp8(pOut+BpL, w[4], w[2]); +#define PIXEL11_0 *((int*)(pOut+BpL+4)) = w[5]; +#define PIXEL11_30 Interp3(pOut+BpL+4, w[5], w[1]); +#define PIXEL11_31 Interp3(pOut+BpL+4, w[5], w[4]); +#define PIXEL11_32 Interp3(pOut+BpL+4, w[5], w[2]); +#define PIXEL11_70 Interp7(pOut+BpL+4, w[5], w[4], w[2]); +#define PIXEL12_0 *((int*)(pOut+BpL+8)) = w[5]; +#define PIXEL12_30 Interp3(pOut+BpL+8, w[5], w[3]); +#define PIXEL12_31 Interp3(pOut+BpL+8, w[5], w[2]); +#define PIXEL12_32 Interp3(pOut+BpL+8, w[5], w[6]); +#define PIXEL12_70 Interp7(pOut+BpL+8, w[5], w[6], w[2]); +#define PIXEL13_0 *((int*)(pOut+BpL+12)) = w[5]; +#define PIXEL13_10 Interp1(pOut+BpL+12, w[5], w[3]); +#define PIXEL13_12 Interp1(pOut+BpL+12, w[5], w[6]); +#define PIXEL13_14 Interp1(pOut+BpL+12, w[6], w[5]); +#define PIXEL13_21 Interp2(pOut+BpL+12, w[6], w[5], w[2]); +#define PIXEL13_31 Interp3(pOut+BpL+12, w[5], w[2]); +#define PIXEL13_50 Interp5(pOut+BpL+12, w[6], w[5]); +#define PIXEL13_60 Interp6(pOut+BpL+12, w[5], w[6], w[2]); +#define PIXEL13_61 Interp6(pOut+BpL+12, w[5], w[6], w[3]); +#define PIXEL13_82 Interp8(pOut+BpL+12, w[5], w[6]); +#define PIXEL13_83 Interp8(pOut+BpL+12, w[6], w[2]); +#define PIXEL20_0 *((int*)(pOut+BpL+BpL)) = w[5]; +#define PIXEL20_10 Interp1(pOut+BpL+BpL, w[5], w[7]); +#define PIXEL20_12 Interp1(pOut+BpL+BpL, w[5], w[4]); +#define PIXEL20_14 Interp1(pOut+BpL+BpL, w[4], w[5]); +#define PIXEL20_21 Interp2(pOut+BpL+BpL, w[4], w[5], w[8]); +#define PIXEL20_31 Interp3(pOut+BpL+BpL, w[5], w[8]); +#define PIXEL20_50 Interp5(pOut+BpL+BpL, w[4], w[5]); +#define PIXEL20_60 Interp6(pOut+BpL+BpL, w[5], w[4], w[8]); +#define PIXEL20_61 Interp6(pOut+BpL+BpL, w[5], w[4], w[7]); +#define PIXEL20_82 Interp8(pOut+BpL+BpL, w[5], w[4]); +#define PIXEL20_83 Interp8(pOut+BpL+BpL, w[4], w[8]); +#define PIXEL21_0 *((int*)(pOut+BpL+BpL+4)) = w[5]; +#define PIXEL21_30 Interp3(pOut+BpL+BpL+4, w[5], w[7]); +#define PIXEL21_31 Interp3(pOut+BpL+BpL+4, w[5], w[8]); +#define PIXEL21_32 Interp3(pOut+BpL+BpL+4, w[5], w[4]); +#define PIXEL21_70 Interp7(pOut+BpL+BpL+4, w[5], w[4], w[8]); +#define PIXEL22_0 *((int*)(pOut+BpL+BpL+8)) = w[5]; +#define PIXEL22_30 Interp3(pOut+BpL+BpL+8, w[5], w[9]); +#define PIXEL22_31 Interp3(pOut+BpL+BpL+8, w[5], w[6]); +#define PIXEL22_32 Interp3(pOut+BpL+BpL+8, w[5], w[8]); +#define PIXEL22_70 Interp7(pOut+BpL+BpL+8, w[5], w[6], w[8]); +#define PIXEL23_0 *((int*)(pOut+BpL+BpL+12)) = w[5]; +#define PIXEL23_10 Interp1(pOut+BpL+BpL+12, w[5], w[9]); +#define PIXEL23_11 Interp1(pOut+BpL+BpL+12, w[5], w[6]); +#define PIXEL23_13 Interp1(pOut+BpL+BpL+12, w[6], w[5]); +#define PIXEL23_21 Interp2(pOut+BpL+BpL+12, w[6], w[5], w[8]); +#define PIXEL23_32 Interp3(pOut+BpL+BpL+12, w[5], w[8]); +#define PIXEL23_50 Interp5(pOut+BpL+BpL+12, w[6], w[5]); +#define PIXEL23_60 Interp6(pOut+BpL+BpL+12, w[5], w[6], w[8]); +#define PIXEL23_61 Interp6(pOut+BpL+BpL+12, w[5], w[6], w[9]); +#define PIXEL23_81 Interp8(pOut+BpL+BpL+12, w[5], w[6]); +#define PIXEL23_83 Interp8(pOut+BpL+BpL+12, w[6], w[8]); +#define PIXEL30_0 *((int*)(pOut+BpL+BpL+BpL)) = w[5]; +#define PIXEL30_11 Interp1(pOut+BpL+BpL+BpL, w[5], w[8]); +#define PIXEL30_12 Interp1(pOut+BpL+BpL+BpL, w[5], w[4]); +#define PIXEL30_20 Interp2(pOut+BpL+BpL+BpL, w[5], w[8], w[4]); +#define PIXEL30_50 Interp5(pOut+BpL+BpL+BpL, w[8], w[4]); +#define PIXEL30_80 Interp8(pOut+BpL+BpL+BpL, w[5], w[7]); +#define PIXEL30_81 Interp8(pOut+BpL+BpL+BpL, w[5], w[8]); +#define PIXEL30_82 Interp8(pOut+BpL+BpL+BpL, w[5], w[4]); +#define PIXEL31_0 *((int*)(pOut+BpL+BpL+BpL+4)) = w[5]; +#define PIXEL31_10 Interp1(pOut+BpL+BpL+BpL+4, w[5], w[7]); +#define PIXEL31_11 Interp1(pOut+BpL+BpL+BpL+4, w[5], w[8]); +#define PIXEL31_13 Interp1(pOut+BpL+BpL+BpL+4, w[8], w[5]); +#define PIXEL31_21 Interp2(pOut+BpL+BpL+BpL+4, w[8], w[5], w[4]); +#define PIXEL31_32 Interp3(pOut+BpL+BpL+BpL+4, w[5], w[4]); +#define PIXEL31_50 Interp5(pOut+BpL+BpL+BpL+4, w[8], w[5]); +#define PIXEL31_60 Interp6(pOut+BpL+BpL+BpL+4, w[5], w[8], w[4]); +#define PIXEL31_61 Interp6(pOut+BpL+BpL+BpL+4, w[5], w[8], w[7]); +#define PIXEL31_81 Interp8(pOut+BpL+BpL+BpL+4, w[5], w[8]); +#define PIXEL31_83 Interp8(pOut+BpL+BpL+BpL+4, w[8], w[4]); +#define PIXEL32_0 *((int*)(pOut+BpL+BpL+BpL+8)) = w[5]; +#define PIXEL32_10 Interp1(pOut+BpL+BpL+BpL+8, w[5], w[9]); +#define PIXEL32_12 Interp1(pOut+BpL+BpL+BpL+8, w[5], w[8]); +#define PIXEL32_14 Interp1(pOut+BpL+BpL+BpL+8, w[8], w[5]); +#define PIXEL32_21 Interp2(pOut+BpL+BpL+BpL+8, w[8], w[5], w[6]); +#define PIXEL32_31 Interp3(pOut+BpL+BpL+BpL+8, w[5], w[6]); +#define PIXEL32_50 Interp5(pOut+BpL+BpL+BpL+8, w[8], w[5]); +#define PIXEL32_60 Interp6(pOut+BpL+BpL+BpL+8, w[5], w[8], w[6]); +#define PIXEL32_61 Interp6(pOut+BpL+BpL+BpL+8, w[5], w[8], w[9]); +#define PIXEL32_82 Interp8(pOut+BpL+BpL+BpL+8, w[5], w[8]); +#define PIXEL32_83 Interp8(pOut+BpL+BpL+BpL+8, w[8], w[6]); +#define PIXEL33_0 *((int*)(pOut+BpL+BpL+BpL+12)) = w[5]; +#define PIXEL33_11 Interp1(pOut+BpL+BpL+BpL+12, w[5], w[6]); +#define PIXEL33_12 Interp1(pOut+BpL+BpL+BpL+12, w[5], w[8]); +#define PIXEL33_20 Interp2(pOut+BpL+BpL+BpL+12, w[5], w[8], w[6]); +#define PIXEL33_50 Interp5(pOut+BpL+BpL+BpL+12, w[8], w[6]); +#define PIXEL33_80 Interp8(pOut+BpL+BpL+BpL+12, w[5], w[9]); +#define PIXEL33_81 Interp8(pOut+BpL+BpL+BpL+12, w[5], w[6]); +#define PIXEL33_82 Interp8(pOut+BpL+BpL+BpL+12, w[5], w[8]); + +static int MDFN_FASTCALL Diff(unsigned int w1, unsigned int w2) +{ + YUV1 = hqxx_RGB_to_YUV(w1); + YUV2 = hqxx_RGB_to_YUV(w2); + return ( ( abs((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ); +} + +void hq4x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int srcBpL, int BpL) +{ + int i, j, k; + int prevline, nextline; + int w[10]; + + // +----+----+----+ + // | | | | + // | w1 | w2 | w3 | + // +----+----+----+ + // | | | | + // | w4 | w5 | w6 | + // +----+----+----+ + // | | | | + // | w7 | w8 | w9 | + // +----+----+----+ + + for (j=0; j0) prevline = -srcBpL; else prevline = 0; + if (j0) + { + w[1] = *((unsigned int*)(pIn + prevline - sizeof(uint32))) & 0xFCFCFC; + w[4] = *((unsigned int*)(pIn - sizeof(uint32))) & 0xFCFCFC; + w[7] = *((unsigned int*)(pIn + nextline - sizeof(uint32))) & 0xFCFCFC; + } + else + { + w[1] = w[2]; + w[4] = w[5]; + w[7] = w[8]; + } + + if (i trY ) || + ( abs((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ) ) + pattern |= flag; + } + flag <<= 1; + } + + switch (pattern) + { + case 0: + case 1: + case 4: + case 32: + case 128: + case 5: + case 132: + case 160: + case 33: + case 129: + case 36: + case 133: + case 164: + case 161: + case 37: + case 165: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_60 + PIXEL03_20 + PIXEL10_60 + PIXEL11_70 + PIXEL12_70 + PIXEL13_60 + PIXEL20_60 + PIXEL21_70 + PIXEL22_70 + PIXEL23_60 + PIXEL30_20 + PIXEL31_60 + PIXEL32_60 + PIXEL33_20 + break; + } + case 2: + case 34: + case 130: + case 162: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_61 + PIXEL11_30 + PIXEL12_30 + PIXEL13_61 + PIXEL20_60 + PIXEL21_70 + PIXEL22_70 + PIXEL23_60 + PIXEL30_20 + PIXEL31_60 + PIXEL32_60 + PIXEL33_20 + break; + } + case 16: + case 17: + case 48: + case 49: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_61 + PIXEL03_80 + PIXEL10_60 + PIXEL11_70 + PIXEL12_30 + PIXEL13_10 + PIXEL20_60 + PIXEL21_70 + PIXEL22_30 + PIXEL23_10 + PIXEL30_20 + PIXEL31_60 + PIXEL32_61 + PIXEL33_80 + break; + } + case 64: + case 65: + case 68: + case 69: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_60 + PIXEL03_20 + PIXEL10_60 + PIXEL11_70 + PIXEL12_70 + PIXEL13_60 + PIXEL20_61 + PIXEL21_30 + PIXEL22_30 + PIXEL23_61 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 8: + case 12: + case 136: + case 140: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_60 + PIXEL03_20 + PIXEL10_10 + PIXEL11_30 + PIXEL12_70 + PIXEL13_60 + PIXEL20_10 + PIXEL21_30 + PIXEL22_70 + PIXEL23_60 + PIXEL30_80 + PIXEL31_61 + PIXEL32_60 + PIXEL33_20 + break; + } + case 3: + case 35: + case 131: + case 163: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_61 + PIXEL20_60 + PIXEL21_70 + PIXEL22_70 + PIXEL23_60 + PIXEL30_20 + PIXEL31_60 + PIXEL32_60 + PIXEL33_20 + break; + } + case 6: + case 38: + case 134: + case 166: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_61 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + PIXEL20_60 + PIXEL21_70 + PIXEL22_70 + PIXEL23_60 + PIXEL30_20 + PIXEL31_60 + PIXEL32_60 + PIXEL33_20 + break; + } + case 20: + case 21: + case 52: + case 53: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + PIXEL03_81 + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL13_31 + PIXEL20_60 + PIXEL21_70 + PIXEL22_30 + PIXEL23_10 + PIXEL30_20 + PIXEL31_60 + PIXEL32_61 + PIXEL33_80 + break; + } + case 144: + case 145: + case 176: + case 177: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_61 + PIXEL03_80 + PIXEL10_60 + PIXEL11_70 + PIXEL12_30 + PIXEL13_10 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL23_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + PIXEL33_82 + break; + } + case 192: + case 193: + case 196: + case 197: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_60 + PIXEL03_20 + PIXEL10_60 + PIXEL11_70 + PIXEL12_70 + PIXEL13_60 + PIXEL20_61 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 96: + case 97: + case 100: + case 101: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_60 + PIXEL03_20 + PIXEL10_60 + PIXEL11_70 + PIXEL12_70 + PIXEL13_60 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_61 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 40: + case 44: + case 168: + case 172: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_60 + PIXEL03_20 + PIXEL10_10 + PIXEL11_30 + PIXEL12_70 + PIXEL13_60 + PIXEL20_31 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL30_81 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 9: + case 13: + case 137: + case 141: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL10_32 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + PIXEL20_10 + PIXEL21_30 + PIXEL22_70 + PIXEL23_60 + PIXEL30_80 + PIXEL31_61 + PIXEL32_60 + PIXEL33_20 + break; + } + case 18: + case 50: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL12_0 + PIXEL13_50 + } + PIXEL10_61 + PIXEL11_30 + PIXEL20_60 + PIXEL21_70 + PIXEL22_30 + PIXEL23_10 + PIXEL30_20 + PIXEL31_60 + PIXEL32_61 + PIXEL33_80 + break; + } + case 80: + case 81: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_61 + PIXEL03_80 + PIXEL10_60 + PIXEL11_70 + PIXEL12_30 + PIXEL13_10 + PIXEL20_61 + PIXEL21_30 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 72: + case 76: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_60 + PIXEL03_20 + PIXEL10_10 + PIXEL11_30 + PIXEL12_70 + PIXEL13_60 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_50 + PIXEL21_0 + PIXEL30_50 + PIXEL31_50 + } + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 10: + case 138: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + PIXEL11_0 + } + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_61 + PIXEL20_10 + PIXEL21_30 + PIXEL22_70 + PIXEL23_60 + PIXEL30_80 + PIXEL31_61 + PIXEL32_60 + PIXEL33_20 + break; + } + case 66: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_61 + PIXEL11_30 + PIXEL12_30 + PIXEL13_61 + PIXEL20_61 + PIXEL21_30 + PIXEL22_30 + PIXEL23_61 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 24: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 7: + case 39: + case 135: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_32 + PIXEL03_82 + PIXEL10_81 + PIXEL11_31 + PIXEL12_32 + PIXEL13_82 + PIXEL20_60 + PIXEL21_70 + PIXEL22_70 + PIXEL23_60 + PIXEL30_20 + PIXEL31_60 + PIXEL32_60 + PIXEL33_20 + break; + } + case 148: + case 149: + case 180: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + PIXEL03_81 + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL13_31 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL23_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + PIXEL33_82 + break; + } + case 224: + case 228: + case 225: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_60 + PIXEL03_20 + PIXEL10_60 + PIXEL11_70 + PIXEL12_70 + PIXEL13_60 + PIXEL20_82 + PIXEL21_32 + PIXEL22_31 + PIXEL23_81 + PIXEL30_82 + PIXEL31_32 + PIXEL32_31 + PIXEL33_81 + break; + } + case 41: + case 169: + case 45: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL10_32 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + PIXEL20_31 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL30_81 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 22: + case 54: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_61 + PIXEL11_30 + PIXEL12_0 + PIXEL20_60 + PIXEL21_70 + PIXEL22_30 + PIXEL23_10 + PIXEL30_20 + PIXEL31_60 + PIXEL32_61 + PIXEL33_80 + break; + } + case 208: + case 209: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_61 + PIXEL03_80 + PIXEL10_60 + PIXEL11_70 + PIXEL12_30 + PIXEL13_10 + PIXEL20_61 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 104: + case 108: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_60 + PIXEL03_20 + PIXEL10_10 + PIXEL11_30 + PIXEL12_70 + PIXEL13_60 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 11: + case 139: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_61 + PIXEL20_10 + PIXEL21_30 + PIXEL22_70 + PIXEL23_60 + PIXEL30_80 + PIXEL31_61 + PIXEL32_60 + PIXEL33_20 + break; + } + case 19: + case 51: + { + if (Diff(w[2], w[6])) + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL00_12 + PIXEL01_14 + PIXEL02_83 + PIXEL03_50 + PIXEL12_70 + PIXEL13_21 + } + PIXEL10_81 + PIXEL11_31 + PIXEL20_60 + PIXEL21_70 + PIXEL22_30 + PIXEL23_10 + PIXEL30_20 + PIXEL31_60 + PIXEL32_61 + PIXEL33_80 + break; + } + case 146: + case 178: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + PIXEL23_32 + PIXEL33_82 + } + else + { + PIXEL02_21 + PIXEL03_50 + PIXEL12_70 + PIXEL13_83 + PIXEL23_13 + PIXEL33_11 + } + PIXEL10_61 + PIXEL11_30 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + break; + } + case 84: + case 85: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + if (Diff(w[6], w[8])) + { + PIXEL03_81 + PIXEL13_31 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL03_12 + PIXEL13_14 + PIXEL22_70 + PIXEL23_83 + PIXEL32_21 + PIXEL33_50 + } + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL20_61 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + break; + } + case 112: + case 113: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_61 + PIXEL03_80 + PIXEL10_60 + PIXEL11_70 + PIXEL12_30 + PIXEL13_10 + PIXEL20_82 + PIXEL21_32 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_70 + PIXEL23_21 + PIXEL30_11 + PIXEL31_13 + PIXEL32_83 + PIXEL33_50 + } + break; + } + case 200: + case 204: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_60 + PIXEL03_20 + PIXEL10_10 + PIXEL11_30 + PIXEL12_70 + PIXEL13_60 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + } + else + { + PIXEL20_21 + PIXEL21_70 + PIXEL30_50 + PIXEL31_83 + PIXEL32_14 + PIXEL33_12 + } + PIXEL22_31 + PIXEL23_81 + break; + } + case 73: + case 77: + { + if (Diff(w[8], w[4])) + { + PIXEL00_82 + PIXEL10_32 + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL00_11 + PIXEL10_13 + PIXEL20_83 + PIXEL21_70 + PIXEL30_50 + PIXEL31_21 + } + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 42: + case 170: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + PIXEL20_31 + PIXEL30_81 + } + else + { + PIXEL00_50 + PIXEL01_21 + PIXEL10_83 + PIXEL11_70 + PIXEL20_14 + PIXEL30_12 + } + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_61 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 14: + case 142: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_50 + PIXEL01_83 + PIXEL02_13 + PIXEL03_11 + PIXEL10_21 + PIXEL11_70 + } + PIXEL12_32 + PIXEL13_82 + PIXEL20_10 + PIXEL21_30 + PIXEL22_70 + PIXEL23_60 + PIXEL30_80 + PIXEL31_61 + PIXEL32_60 + PIXEL33_20 + break; + } + case 67: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_61 + PIXEL20_61 + PIXEL21_30 + PIXEL22_30 + PIXEL23_61 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 70: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_61 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + PIXEL20_61 + PIXEL21_30 + PIXEL22_30 + PIXEL23_61 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 28: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 152: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 194: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_61 + PIXEL11_30 + PIXEL12_30 + PIXEL13_61 + PIXEL20_61 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 98: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_61 + PIXEL11_30 + PIXEL12_30 + PIXEL13_61 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_61 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 56: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 25: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 26: + case 31: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL11_0 + PIXEL12_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 82: + case 214: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_61 + PIXEL11_30 + PIXEL12_0 + PIXEL20_61 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 88: + case 248: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + break; + } + case 74: + case 107: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_61 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 27: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 86: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_61 + PIXEL11_30 + PIXEL12_0 + PIXEL20_61 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 216: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 106: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_61 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 30: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_10 + PIXEL11_30 + PIXEL12_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 210: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_61 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + PIXEL20_61 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 120: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 75: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_61 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_61 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 29: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_61 + PIXEL32_61 + PIXEL33_80 + break; + } + case 198: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_61 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + PIXEL20_61 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 184: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_61 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 99: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_61 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_61 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 57: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 71: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_32 + PIXEL03_82 + PIXEL10_81 + PIXEL11_31 + PIXEL12_32 + PIXEL13_82 + PIXEL20_61 + PIXEL21_30 + PIXEL22_30 + PIXEL23_61 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 156: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 226: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_61 + PIXEL11_30 + PIXEL12_30 + PIXEL13_61 + PIXEL20_82 + PIXEL21_32 + PIXEL22_31 + PIXEL23_81 + PIXEL30_82 + PIXEL31_32 + PIXEL32_31 + PIXEL33_81 + break; + } + case 60: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 195: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_61 + PIXEL20_61 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 102: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_61 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_61 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 153: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 58: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 83: + { + PIXEL00_81 + PIXEL01_31 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL10_81 + PIXEL11_31 + PIXEL20_61 + PIXEL21_30 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 92: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 202: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_61 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_31 + PIXEL23_81 + PIXEL32_31 + PIXEL33_81 + break; + } + case 78: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + PIXEL02_32 + PIXEL03_82 + PIXEL12_32 + PIXEL13_82 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 154: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 114: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL10_61 + PIXEL11_30 + PIXEL20_82 + PIXEL21_32 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + PIXEL30_82 + PIXEL31_32 + break; + } + case 89: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 90: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 55: + case 23: + { + if (Diff(w[2], w[6])) + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_0 + PIXEL03_0 + PIXEL12_0 + PIXEL13_0 + } + else + { + PIXEL00_12 + PIXEL01_14 + PIXEL02_83 + PIXEL03_50 + PIXEL12_70 + PIXEL13_21 + } + PIXEL10_81 + PIXEL11_31 + PIXEL20_60 + PIXEL21_70 + PIXEL22_30 + PIXEL23_10 + PIXEL30_20 + PIXEL31_60 + PIXEL32_61 + PIXEL33_80 + break; + } + case 182: + case 150: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL12_0 + PIXEL13_0 + PIXEL23_32 + PIXEL33_82 + } + else + { + PIXEL02_21 + PIXEL03_50 + PIXEL12_70 + PIXEL13_83 + PIXEL23_13 + PIXEL33_11 + } + PIXEL10_61 + PIXEL11_30 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + break; + } + case 213: + case 212: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + if (Diff(w[6], w[8])) + { + PIXEL03_81 + PIXEL13_31 + PIXEL22_0 + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL03_12 + PIXEL13_14 + PIXEL22_70 + PIXEL23_83 + PIXEL32_21 + PIXEL33_50 + } + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL20_61 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + break; + } + case 241: + case 240: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_61 + PIXEL03_80 + PIXEL10_60 + PIXEL11_70 + PIXEL12_30 + PIXEL13_10 + PIXEL20_82 + PIXEL21_32 + if (Diff(w[6], w[8])) + { + PIXEL22_0 + PIXEL23_0 + PIXEL30_82 + PIXEL31_32 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL22_70 + PIXEL23_21 + PIXEL30_11 + PIXEL31_13 + PIXEL32_83 + PIXEL33_50 + } + break; + } + case 236: + case 232: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_60 + PIXEL03_20 + PIXEL10_10 + PIXEL11_30 + PIXEL12_70 + PIXEL13_60 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL21_0 + PIXEL30_0 + PIXEL31_0 + PIXEL32_31 + PIXEL33_81 + } + else + { + PIXEL20_21 + PIXEL21_70 + PIXEL30_50 + PIXEL31_83 + PIXEL32_14 + PIXEL33_12 + } + PIXEL22_31 + PIXEL23_81 + break; + } + case 109: + case 105: + { + if (Diff(w[8], w[4])) + { + PIXEL00_82 + PIXEL10_32 + PIXEL20_0 + PIXEL21_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL00_11 + PIXEL10_13 + PIXEL20_83 + PIXEL21_70 + PIXEL30_50 + PIXEL31_21 + } + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 171: + case 43: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + PIXEL11_0 + PIXEL20_31 + PIXEL30_81 + } + else + { + PIXEL00_50 + PIXEL01_21 + PIXEL10_83 + PIXEL11_70 + PIXEL20_14 + PIXEL30_12 + } + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_61 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 143: + case 15: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL02_32 + PIXEL03_82 + PIXEL10_0 + PIXEL11_0 + } + else + { + PIXEL00_50 + PIXEL01_83 + PIXEL02_13 + PIXEL03_11 + PIXEL10_21 + PIXEL11_70 + } + PIXEL12_32 + PIXEL13_82 + PIXEL20_10 + PIXEL21_30 + PIXEL22_70 + PIXEL23_60 + PIXEL30_80 + PIXEL31_61 + PIXEL32_60 + PIXEL33_20 + break; + } + case 124: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 203: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_61 + PIXEL20_10 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 62: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_10 + PIXEL11_30 + PIXEL12_0 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 211: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_10 + PIXEL20_61 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 118: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_61 + PIXEL11_30 + PIXEL12_0 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_10 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 217: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 110: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_10 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 155: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 188: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 185: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 61: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 157: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 103: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_32 + PIXEL03_82 + PIXEL10_81 + PIXEL11_31 + PIXEL12_32 + PIXEL13_82 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_61 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 227: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_61 + PIXEL20_82 + PIXEL21_32 + PIXEL22_31 + PIXEL23_81 + PIXEL30_82 + PIXEL31_32 + PIXEL32_31 + PIXEL33_81 + break; + } + case 230: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_61 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + PIXEL20_82 + PIXEL21_32 + PIXEL22_31 + PIXEL23_81 + PIXEL30_82 + PIXEL31_32 + PIXEL32_31 + PIXEL33_81 + break; + } + case 199: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_32 + PIXEL03_82 + PIXEL10_81 + PIXEL11_31 + PIXEL12_32 + PIXEL13_82 + PIXEL20_61 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 220: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + break; + } + case 158: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL12_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 234: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_61 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_31 + PIXEL23_81 + PIXEL32_31 + PIXEL33_81 + break; + } + case 242: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL10_61 + PIXEL11_30 + PIXEL20_82 + PIXEL21_32 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_82 + PIXEL31_32 + break; + } + case 59: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL11_0 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 121: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 87: + { + PIXEL00_81 + PIXEL01_31 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_81 + PIXEL11_31 + PIXEL12_0 + PIXEL20_61 + PIXEL21_30 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 79: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_32 + PIXEL03_82 + PIXEL11_0 + PIXEL12_32 + PIXEL13_82 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 122: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 94: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL12_0 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 218: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + break; + } + case 91: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL11_0 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 229: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_60 + PIXEL03_20 + PIXEL10_60 + PIXEL11_70 + PIXEL12_70 + PIXEL13_60 + PIXEL20_82 + PIXEL21_32 + PIXEL22_31 + PIXEL23_81 + PIXEL30_82 + PIXEL31_32 + PIXEL32_31 + PIXEL33_81 + break; + } + case 167: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_32 + PIXEL03_82 + PIXEL10_81 + PIXEL11_31 + PIXEL12_32 + PIXEL13_82 + PIXEL20_60 + PIXEL21_70 + PIXEL22_70 + PIXEL23_60 + PIXEL30_20 + PIXEL31_60 + PIXEL32_60 + PIXEL33_20 + break; + } + case 173: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL10_32 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + PIXEL20_31 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL30_81 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 181: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + PIXEL03_81 + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL13_31 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL23_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + PIXEL33_82 + break; + } + case 186: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 115: + { + PIXEL00_81 + PIXEL01_31 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL10_81 + PIXEL11_31 + PIXEL20_82 + PIXEL21_32 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + PIXEL30_82 + PIXEL31_32 + break; + } + case 93: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + break; + } + case 206: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + PIXEL02_32 + PIXEL03_82 + PIXEL12_32 + PIXEL13_82 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_31 + PIXEL23_81 + PIXEL32_31 + PIXEL33_81 + break; + } + case 205: + case 201: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL10_32 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + if (Diff(w[8], w[4])) + { + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + } + else + { + PIXEL20_12 + PIXEL21_0 + PIXEL30_20 + PIXEL31_11 + } + PIXEL22_31 + PIXEL23_81 + PIXEL32_31 + PIXEL33_81 + break; + } + case 174: + case 46: + { + if (Diff(w[4], w[2])) + { + PIXEL00_80 + PIXEL01_10 + PIXEL10_10 + PIXEL11_30 + } + else + { + PIXEL00_20 + PIXEL01_12 + PIXEL10_11 + PIXEL11_0 + } + PIXEL02_32 + PIXEL03_82 + PIXEL12_32 + PIXEL13_82 + PIXEL20_31 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL30_81 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 179: + case 147: + { + PIXEL00_81 + PIXEL01_31 + if (Diff(w[2], w[6])) + { + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + } + else + { + PIXEL02_11 + PIXEL03_20 + PIXEL12_0 + PIXEL13_12 + } + PIXEL10_81 + PIXEL11_31 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL23_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + PIXEL33_82 + break; + } + case 117: + case 116: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + PIXEL03_81 + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL13_31 + PIXEL20_82 + PIXEL21_32 + if (Diff(w[6], w[8])) + { + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + } + else + { + PIXEL22_0 + PIXEL23_11 + PIXEL32_12 + PIXEL33_20 + } + PIXEL30_82 + PIXEL31_32 + break; + } + case 189: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 231: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_32 + PIXEL03_82 + PIXEL10_81 + PIXEL11_31 + PIXEL12_32 + PIXEL13_82 + PIXEL20_82 + PIXEL21_32 + PIXEL22_31 + PIXEL23_81 + PIXEL30_82 + PIXEL31_32 + PIXEL32_31 + PIXEL33_81 + break; + } + case 126: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_10 + PIXEL11_30 + PIXEL12_0 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 219: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_10 + PIXEL20_10 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 125: + { + if (Diff(w[8], w[4])) + { + PIXEL00_82 + PIXEL10_32 + PIXEL20_0 + PIXEL21_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL00_11 + PIXEL10_13 + PIXEL20_83 + PIXEL21_70 + PIXEL30_50 + PIXEL31_21 + } + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 221: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + if (Diff(w[6], w[8])) + { + PIXEL03_81 + PIXEL13_31 + PIXEL22_0 + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL03_12 + PIXEL13_14 + PIXEL22_70 + PIXEL23_83 + PIXEL32_21 + PIXEL33_50 + } + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL20_10 + PIXEL21_30 + PIXEL30_80 + PIXEL31_10 + break; + } + case 207: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL02_32 + PIXEL03_82 + PIXEL10_0 + PIXEL11_0 + } + else + { + PIXEL00_50 + PIXEL01_83 + PIXEL02_13 + PIXEL03_11 + PIXEL10_21 + PIXEL11_70 + } + PIXEL12_32 + PIXEL13_82 + PIXEL20_10 + PIXEL21_30 + PIXEL22_31 + PIXEL23_81 + PIXEL30_80 + PIXEL31_10 + PIXEL32_31 + PIXEL33_81 + break; + } + case 238: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_32 + PIXEL03_82 + PIXEL10_10 + PIXEL11_30 + PIXEL12_32 + PIXEL13_82 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL21_0 + PIXEL30_0 + PIXEL31_0 + PIXEL32_31 + PIXEL33_81 + } + else + { + PIXEL20_21 + PIXEL21_70 + PIXEL30_50 + PIXEL31_83 + PIXEL32_14 + PIXEL33_12 + } + PIXEL22_31 + PIXEL23_81 + break; + } + case 190: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL12_0 + PIXEL13_0 + PIXEL23_32 + PIXEL33_82 + } + else + { + PIXEL02_21 + PIXEL03_50 + PIXEL12_70 + PIXEL13_83 + PIXEL23_13 + PIXEL33_11 + } + PIXEL10_10 + PIXEL11_30 + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + break; + } + case 187: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + PIXEL11_0 + PIXEL20_31 + PIXEL30_81 + } + else + { + PIXEL00_50 + PIXEL01_21 + PIXEL10_83 + PIXEL11_70 + PIXEL20_14 + PIXEL30_12 + } + PIXEL02_10 + PIXEL03_80 + PIXEL12_30 + PIXEL13_10 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 243: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_10 + PIXEL03_80 + PIXEL10_81 + PIXEL11_31 + PIXEL12_30 + PIXEL13_10 + PIXEL20_82 + PIXEL21_32 + if (Diff(w[6], w[8])) + { + PIXEL22_0 + PIXEL23_0 + PIXEL30_82 + PIXEL31_32 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL22_70 + PIXEL23_21 + PIXEL30_11 + PIXEL31_13 + PIXEL32_83 + PIXEL33_50 + } + break; + } + case 119: + { + if (Diff(w[2], w[6])) + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_0 + PIXEL03_0 + PIXEL12_0 + PIXEL13_0 + } + else + { + PIXEL00_12 + PIXEL01_14 + PIXEL02_83 + PIXEL03_50 + PIXEL12_70 + PIXEL13_21 + } + PIXEL10_81 + PIXEL11_31 + PIXEL20_82 + PIXEL21_32 + PIXEL22_30 + PIXEL23_10 + PIXEL30_82 + PIXEL31_32 + PIXEL32_10 + PIXEL33_80 + break; + } + case 237: + case 233: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_60 + PIXEL03_20 + PIXEL10_32 + PIXEL11_32 + PIXEL12_70 + PIXEL13_60 + PIXEL20_0 + PIXEL21_0 + PIXEL22_31 + PIXEL23_81 + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + PIXEL32_31 + PIXEL33_81 + break; + } + case 175: + case 47: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + PIXEL02_32 + PIXEL03_82 + PIXEL10_0 + PIXEL11_0 + PIXEL12_32 + PIXEL13_82 + PIXEL20_31 + PIXEL21_31 + PIXEL22_70 + PIXEL23_60 + PIXEL30_81 + PIXEL31_81 + PIXEL32_60 + PIXEL33_20 + break; + } + case 183: + case 151: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL10_81 + PIXEL11_31 + PIXEL12_0 + PIXEL13_0 + PIXEL20_60 + PIXEL21_70 + PIXEL22_32 + PIXEL23_32 + PIXEL30_20 + PIXEL31_60 + PIXEL32_82 + PIXEL33_82 + break; + } + case 245: + case 244: + { + PIXEL00_20 + PIXEL01_60 + PIXEL02_81 + PIXEL03_81 + PIXEL10_60 + PIXEL11_70 + PIXEL12_31 + PIXEL13_31 + PIXEL20_82 + PIXEL21_32 + PIXEL22_0 + PIXEL23_0 + PIXEL30_82 + PIXEL31_32 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + case 250: + { + PIXEL00_80 + PIXEL01_10 + PIXEL02_10 + PIXEL03_80 + PIXEL10_10 + PIXEL11_30 + PIXEL12_30 + PIXEL13_10 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + break; + } + case 123: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_10 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 95: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL11_0 + PIXEL12_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_30 + PIXEL23_10 + PIXEL30_80 + PIXEL31_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 222: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_10 + PIXEL11_30 + PIXEL12_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 252: + { + PIXEL00_80 + PIXEL01_61 + PIXEL02_81 + PIXEL03_81 + PIXEL10_10 + PIXEL11_30 + PIXEL12_31 + PIXEL13_31 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_0 + PIXEL23_0 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + case 249: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_61 + PIXEL03_80 + PIXEL10_32 + PIXEL11_32 + PIXEL12_30 + PIXEL13_10 + PIXEL20_0 + PIXEL21_0 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + break; + } + case 235: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_61 + PIXEL20_0 + PIXEL21_0 + PIXEL22_31 + PIXEL23_81 + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + PIXEL32_31 + PIXEL33_81 + break; + } + case 111: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + PIXEL02_32 + PIXEL03_82 + PIXEL10_0 + PIXEL11_0 + PIXEL12_32 + PIXEL13_82 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_61 + PIXEL32_10 + PIXEL33_80 + break; + } + case 63: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_0 + PIXEL11_0 + PIXEL12_0 + PIXEL20_31 + PIXEL21_31 + PIXEL22_30 + PIXEL23_10 + PIXEL30_81 + PIXEL31_81 + PIXEL32_61 + PIXEL33_80 + break; + } + case 159: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL11_0 + PIXEL12_0 + PIXEL13_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_32 + PIXEL23_32 + PIXEL30_80 + PIXEL31_61 + PIXEL32_82 + PIXEL33_82 + break; + } + case 215: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL10_81 + PIXEL11_31 + PIXEL12_0 + PIXEL13_0 + PIXEL20_61 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 246: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_61 + PIXEL11_30 + PIXEL12_0 + PIXEL20_82 + PIXEL21_32 + PIXEL22_0 + PIXEL23_0 + PIXEL30_82 + PIXEL31_32 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + case 254: + { + PIXEL00_80 + PIXEL01_10 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_10 + PIXEL11_30 + PIXEL12_0 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_0 + PIXEL23_0 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + case 253: + { + PIXEL00_82 + PIXEL01_82 + PIXEL02_81 + PIXEL03_81 + PIXEL10_32 + PIXEL11_32 + PIXEL12_31 + PIXEL13_31 + PIXEL20_0 + PIXEL21_0 + PIXEL22_0 + PIXEL23_0 + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + case 251: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_10 + PIXEL03_80 + PIXEL11_0 + PIXEL12_30 + PIXEL13_10 + PIXEL20_0 + PIXEL21_0 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + break; + } + case 239: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + PIXEL02_32 + PIXEL03_82 + PIXEL10_0 + PIXEL11_0 + PIXEL12_32 + PIXEL13_82 + PIXEL20_0 + PIXEL21_0 + PIXEL22_31 + PIXEL23_81 + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + PIXEL32_31 + PIXEL33_81 + break; + } + case 127: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + if (Diff(w[2], w[6])) + { + PIXEL02_0 + PIXEL03_0 + PIXEL13_0 + } + else + { + PIXEL02_50 + PIXEL03_50 + PIXEL13_50 + } + PIXEL10_0 + PIXEL11_0 + PIXEL12_0 + if (Diff(w[8], w[4])) + { + PIXEL20_0 + PIXEL30_0 + PIXEL31_0 + } + else + { + PIXEL20_50 + PIXEL30_50 + PIXEL31_50 + } + PIXEL21_0 + PIXEL22_30 + PIXEL23_10 + PIXEL32_10 + PIXEL33_80 + break; + } + case 191: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL10_0 + PIXEL11_0 + PIXEL12_0 + PIXEL13_0 + PIXEL20_31 + PIXEL21_31 + PIXEL22_32 + PIXEL23_32 + PIXEL30_81 + PIXEL31_81 + PIXEL32_82 + PIXEL33_82 + break; + } + case 223: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + PIXEL01_0 + PIXEL10_0 + } + else + { + PIXEL00_50 + PIXEL01_50 + PIXEL10_50 + } + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL11_0 + PIXEL12_0 + PIXEL13_0 + PIXEL20_10 + PIXEL21_30 + PIXEL22_0 + if (Diff(w[6], w[8])) + { + PIXEL23_0 + PIXEL32_0 + PIXEL33_0 + } + else + { + PIXEL23_50 + PIXEL32_50 + PIXEL33_50 + } + PIXEL30_80 + PIXEL31_10 + break; + } + case 247: + { + PIXEL00_81 + PIXEL01_31 + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL10_81 + PIXEL11_31 + PIXEL12_0 + PIXEL13_0 + PIXEL20_82 + PIXEL21_32 + PIXEL22_0 + PIXEL23_0 + PIXEL30_82 + PIXEL31_32 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + case 255: + { + if (Diff(w[4], w[2])) + { + PIXEL00_0 + } + else + { + PIXEL00_20 + } + PIXEL01_0 + PIXEL02_0 + if (Diff(w[2], w[6])) + { + PIXEL03_0 + } + else + { + PIXEL03_20 + } + PIXEL10_0 + PIXEL11_0 + PIXEL12_0 + PIXEL13_0 + PIXEL20_0 + PIXEL21_0 + PIXEL22_0 + PIXEL23_0 + if (Diff(w[8], w[4])) + { + PIXEL30_0 + } + else + { + PIXEL30_20 + } + PIXEL31_0 + PIXEL32_0 + if (Diff(w[6], w[8])) + { + PIXEL33_0 + } + else + { + PIXEL33_20 + } + break; + } + } + pIn += sizeof(uint32); + pOut+=16; + } + pOut += BpL * 4 - Xres * 4 * sizeof(uint32); + pIn += srcBpL - Xres * sizeof(uint32); + } +} diff --git a/Mednafen/mednafen/drivers/hqxx-common.cpp b/Mednafen/mednafen/drivers/hqxx-common.cpp new file mode 100644 index 0000000000..1cee1de9f7 --- /dev/null +++ b/Mednafen/mednafen/drivers/hqxx-common.cpp @@ -0,0 +1,3 @@ +#include "main.h" + +#include "hqxx-common.h" diff --git a/Mednafen/mednafen/drivers/hqxx-common.h b/Mednafen/mednafen/drivers/hqxx-common.h new file mode 100644 index 0000000000..8c5aed5b77 --- /dev/null +++ b/Mednafen/mednafen/drivers/hqxx-common.h @@ -0,0 +1,39 @@ +void hq4x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int srcBpL, int BpL); +void hq3x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int srcBpL, int BpL); +void hq2x_32( unsigned char * pIn, unsigned char * pOut, int Xres, int Yres, int srcBpL, int BpL); + +#ifdef HQXX_INTERNAL + +static const int Ymask = 0x00FF0000; +static const int Umask = 0x0000FF00; +static const int Vmask = 0x000000FF; +static const int trY = 0x00300000; +static const int trU = 0x00000700; +static const int trV = 0x00000006; + +static inline unsigned int hqxx_RGB_to_YUV(unsigned int value) +{ + int r,g,b; + int Y, u, v; + +#if 0 + r = (value >> 0) & 0xF8; + g = (value >> 8) & 0xFC; + b = (value >> 16) & 0xF8; + + Y = (r + g + b) >> 2; + u = 128 + ((r - b) >> 2); + v = 128 + ((-r + 2*g - b) >> 3); +#endif + + r = (value >> (16 + 2)) & 0x3E; + g = (value >> ( 8 + 2)) & 0x3F; + b = (value >> ( 0 + 2)) & 0x3E; + + Y = (r + g + b); + u = 128 + (r - b); + v = 128 + ((-r + 2*g - b) >> 1); + + return((Y<<16) + (u<<8) + v); +} +#endif diff --git a/Mednafen/mednafen/drivers/icon.h b/Mednafen/mednafen/drivers/icon.h new file mode 100644 index 0000000000..054123cbae --- /dev/null +++ b/Mednafen/mednafen/drivers/icon.h @@ -0,0 +1,2263 @@ +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + uint8 pixel_data[32 * 32 * 4 + 1]; +} mednafen_playicon = { + 32, 32, 4, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\34\0\0\0\262\0\0\0\352\0\0" + "\0\305\0\0\0\253\0\0\0\236\0\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0""3'\1\244\235{\4\377_B\3\260\0\0\0\10\0\0\0\0\0\0\0\14" + "\0\0\0y\0\0\0o\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\256\242\15" + "\264\366\347\23\377\236s\3\377\0\0\0S\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0F\0\0" + "\0q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\2\0\0\0^\0\0\0\205\0\0\0\215\0\0\0\255\16\11\0\337\6\4\0m\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0^T\7n\261\224\10\377Q7" + "\2\355\0\0\0\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0[\0\0\0M\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0\206\0\0\0,\0" + "\0\0\0\0\0\0\0;&\1\222\326\260\11\377\242\217\11\371\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\32\0\0\0`\27\20\0\225H<\0\364uj\1\341\225\213" + "\7\317\232\217\10\306\222\210\7\256yn\2\21293\0Y\0\0\0\33\0\0\0\221\0\0\0" + "\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0\206\0\0\0\13\0" + "\0\0\0\0\0\0\0\0\0\0\0'\31\1\233\272\223\6\377\237\221\14\323\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0=\2\1\0\2709*\1\375jV\1\377\177k\1\377\212r\2\377\231x" + "\2\377\247\203\2\377\300\240\6\377\353\324\14\377\370\354\24\377\370\354" + "\24\377\314\300\15\376\215\202\5\342\21\17\0\255\0\0\0\30\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0~\0\0\0\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3" + "\0\0\0@\0\0\0\30\0\0\0\0\0\0\0\5\0\0\0\226\30\21\0\376\253\220\1\377\351" + "\323\3\377\366\351\21\377\374\361\30\377\374\362\30\377\373\360\27\377\367" + "\351\22\377\341\312\12\377\253\210\2\377\222l\2\377\313\253\6\377\363\342" + "\20\377\374\361\27\377}w\13\377\216\203\4\371g]\0\236\1\1\0#\0\0\0\0\0\0" + "\0B\0\0\0T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\237\24\15\0\377\271\216\3\377\345\313\1\377\353\326\4\377" + "\367\351\22\377\372\357\26\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\364\344\16\377\333\273\1\377R9\1\377E0\1\377\240\177\3\377" + "\276\231\5\377[N\3\377\323\257\2\377\252\217\1\372NE\0\220\0\0\0\226\0\0" + "\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0""2\0\0\0\377|Q\3\377\323\244\3\377\340\300\2\377\343\306\1\377\344\311" + "\1\377\346\315\0\377\351\323\2\377\355\332\6\377\366\350\20\377\357\335\11" + "\377\347\317\2\377\326\260\2\377lH\2\377+\36\1\377hW\5\377\214t\6\377G8\3" + "\377\210l\5\377\221p\5\377tY\3\37790\3\345\7\6\0J\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0[\0\0\0\377\244j\3\377\307" + "\214\3\377\337\275\2\377\337\276\2\377\337\276\2\377\337\276\2\377\340\300" + "\2\377\345\313\1\377\346\315\0\377\335\273\2\377\216l\2\377oN\2\377\256\210" + "\5\377\212r\6\377D4\2\377\30\20\0\377\24\15\0\377\31\21\1\377*\33\1\377\23" + "\14\0\377\33\24\1\377\15\13\0\376\0\0\0\217\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]\0\0\0\3772\40\1\377\240h\3\377\310\216" + "\3\377\333\265\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\277\2" + "\377\324\256\2\377kJ\2\377\246t\3\377yY\2\377\20\13\0\3773!\1\377\201_\2" + "\377\276\223\3\377\326\254\2\377\272\234\2\377\333\266\3\377\274\233\2\377" + "\314\237\3\377\231r\2\377A,\1\377\4\3\0\325\10\5\0""8\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0c@d\0\377\0\1\0\377\2\1\0\377A*\1\377\230d\3\377" + "\315\232\3\377\334\270\2\377\337\276\2\377\332\264\2\377fE\2\377\260s\4\377" + "@+\1\377\37\24\1\377\235p\3\377\331\262\2\377\337\276\2\377\341\301\2\377" + "\351\323\1\377\362\342\14\377\374\362\30\377\373\360\26\377\366\350\21\377" + "|~\6\377^\225\12\377o\260\13\377s\253\5\372Bh\12X\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\34$8\0\366Lt\0\3774T\0\377\1\1\0\377\0\0\0\377+\34\1\377{" + "R\2\377\306\223\3\377\235p\3\377~R\3\377@*\1\377\7\14\1\377Zt\6\377d\225" + "\6\377s\240\6\377\214\210\5\377\337\276\2\377\350\321\1\377\361\336\16\377" + "\374\361\30\377\374\361\30\377\374\362\30\377Qs\14\377v\273\11\377\206\315" + "\2\377\224\336\1\377Y\214\13\353B+\1\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0J3M\0\323m\252\0\377\221\336\0\377/M\0\377\21\33\0\377\0\0\0\377\14\10" + "\0\3771\40\1\3776#\1\377\6\4\0\377Z\220\12\377x\275\11\377\201\310\4\377" + "w\273\4\377Fu\13\377\320\261\2\377\337\276\2\377\343\305\5\377\353\325\7" + "\377\366\350\21\377\374\362\30\377\255\254\21\377O~\7\377^\234\1\377J\203" + "\1\377'C\6\377\0\0\0\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0B\5" + "\10\0\371Mu\0\371e\237\0\377\236\362\0\377@h\0\377Fk\0\377\32*\0\377\12\20" + "\0\377L1\2\377N}\13\377q\263\0\377n\257\0\377J\203\1\377Yc\4\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\343\306\1\377\365\346\20\377\374\362\30" + "\377\374\362\30\377\315\272\21\377\216Y)\377\224Y%\3771\36\3\374\0\0\0\20" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0\231\0\0\0~\0\0\0$\0\0\0v\3\4\0\366" + "(=\0\350S\202\0\376\211\320\0\377\216\336\0\377Y\221\0\377jE\2\377\234\210" + "\3\377Ti\3\377Ib\2\377s`\21\377\327\246\22\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\345\313\1\377\372\356\25\377\370\353\23\377\357\334\10\377" + "\350\271\23\377\356tS\377\271>W\3776\16\37\255\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\237\0\0\0K\0\0\0\37\0\0\0\266\0\0\0a\0\0\0\27\0\0\0v\0\0\0\357" + "\0\0\0\255>^\0\335<\\\0\365\35\23\1\370\267\203\3\377\343\227'\377\371X{" + "\377\370[w\377\351\230/\377\337\276\2\377\337\276\2\377\332\275\1\377\347" + "\320\1\377\323\220\25\377\304\251\2\377\340\301\2\377\325\252\3\377|W\2\377" + "\12\6\0\302\0\0\0\265\0\0\0$\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\311\0\0\0\2\0" + "\0\0\313\0\0\0-\0\0\0/\0\0\0\312\0\0\0a\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0""1\25\15\0\332nE\6\377\271}\10\377\316\234\3\377\324\247\3\377\327" + "\256\2\377\331\262\2\377\322\254\2\377\2653.\377\353\0Y\377\263U\31\377\205" + "]\2\377-\35\1\364\0\0\0\320\0\0\0""9\0\0\0""2\0\0\0\231\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0G\0\0\0)\0\0\0\260\0\0\0\20\0\0\0\340\0\0\0.\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0[\4\2\0\261(\32\1\355C+\1\377" + "R5\2\377T7\2\377O4\2\377H\26\21\377\231\0?\363\11\2\3\277\0\0\0r\0\0\0\23" + "\0\0\0T\0\0\0N\0\0\0\0\0\0\0\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21" + "\0\0\0N\0\0\0_\0\0\0\245\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\0\0&\0\0\0*\0\0\0#\0" + "\0\0\23\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0\12\0\0\0\0\0\0\0R" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\0\0\0c\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0", +}; + +static const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + uint8 pixel_data[128 * 128 * 4 + 1]; +} mednafen_playicon128 = { + 128, 128, 4, + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\31\0\0\0I\0\0\0r\0\0\0\223" + "\0\0\0\254\0\0\0\274\0\0\0\301\0\0\0\301\0\0\0\274\0\0\0\247\0\0\0\207\0" + "\0\0Y\0\0\0\36\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0@\0\0\0\224\0\0\0\332" + "\0\0\0\375\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0\310\0\0" + "\0_\0\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\4\0\0\0[\0\0\0\324\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\316\0\0\0)\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""5\0\0\0\312\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\373\0\0\0\316\0\0\0\222\0\0\0g\0\0\0K\0\0\0A\0\0\0A" + "\0\0\0S\0\0\0r\0\0\0\237\0\0\0\333\0\0\0\375\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\352\0\0\0,\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0" + "\0\0\202\0\0\0\372\0\0\0\377\0\0\0\377\0\0\0\335\0\0\0u\0\0\0\35\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1" + "\0\0\0(\0\0\0}\0\0\0\353\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\323\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\26\0\0\0\276\0\0\0\377\0\0\0\377\0\0\0\342\0\0\0" + "b\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\2\1\0\253A*\1\375\212Y\3\377\241" + "h\3\377\212Y\3\377?)\1\377\1\1\0\377\0\0\0\377\0\0\0_\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)\0\0\0\334\0\0\0\377\0" + "\0\0\374\0\0\0\223\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0G\2\1\0\355" + "rJ\2\377\277|\4\377\300}\4\377\310\217\3\377\316\232\3\377\310\220\3\377" + "pI\2\377\1\0\0\377\0\0\0\263\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0""5\0\0\0\352\0\0\0\377\0\0\0\353\0\0\0J\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0;\0\0\0\366L1\2\377\277|\4\377\326\250\13" + "\377\364\342\24\377\342\303\4\377\337\276\2\377\337\276\2\377\330\257\2\377" + "E/\1\377\0\0\0\343\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\2\0\0\0%\0\0\0Z\0\0\0~\0\0\0\227\0\0\0\243\0\0\0\246\0\0\0\233\0\0\0\214" + "\0\0\0s\0\0\0T\0\0\0-\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0""7\0\0\0\356\0\0\0\377\0\0\0\324\0\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\5\0\0\0\325\2\1\0\377\245k\3\377\277|\4\377\346\311\20" + "\377\374\362\30\377\347\314\10\377\355\327\14\377\361\337\20\377\350\317" + "\11\377\255\213\2\377\1\0\0\366\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0" + "\0\0r\0\0\0\326\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\362\0\0\0\305\0" + "\0\0\204\0\0\0""5\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0-\0\0\0\352\0\0\0\377\0\0\0\307\0\0\0\23\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0B\0\0\0\377\34\22\1\377" + "\276{\4\377\300~\4\377\340\300\4\377\350\316\11\377\363\343\21\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\344\313\12\377\20\14\0\361\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0)\0\0\0\327\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\345\0\0\0\326\0\0\0\322\0" + "\0\0\336\0\0\0\357\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\323\0\0" + "\0a\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\36\0\0\0" + "\342\0\0\0\377\0\0\0\305\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0p\0\0\0\377.\36\1\377\277|\4\377\303\205\4\377\337" + "\276\2\377\344\307\6\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\366\350\24\377\40\33\0\331\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\0\0\0\341" + "\0\0\0\377\0\0\0\377\10\5\0\377\7\5\0\377\0\0\0\377\0\0\0\271\0\0\0i\0\0" + "\0""2\0\0\0\14\0\0\0\3\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\6\0\0\0\37\0\0\0T\0" + "\0\0\232\0\0\0\347\0\0\0\377\0\0\0\377\0\0\0\327\0\0\0I\0\0\0\1\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\16\0\0\0\317\0\0\0\377\0\0\0\321\0\0\0\21\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0n\0\0\0\377!" + "\25\1\377\277|\4\377\302\202\4\377\337\276\2\377\347\314\10\377\374\362\30" + "\377\374\362\30\377\374\362\30\377\374\362\30\377\363\347\25\377\24\21\0" + "\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\211\0\0\0\3776#\1\377\225a\3\377\267w\4\377\266" + "v\4\377\216\\\3\377/\36\1\350\0\0\0i\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0W\0\0\0\315\0" + "\0\0\377\0\0\0\375\0\0\0\237\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\255\0\0\0\377" + "\0\0\0\343\0\0\0\36\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0>\0\0\0\377\5\3\0\377\256q\4\377\277|\4\377\331\261" + "\2\377\341\302\4\377\373\360\27\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\277\262\20\377\1\1\0\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\334G2\1\377\322\245" + "\3\377\335\273\2\377\335\272\2\377\333\263\10\377\322\240\12\377\272y\4\377" + "3!\1\377\0\0\0\256\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0W\0\0\0\342\0\0\0\377\0\0" + "\0\331\0\0\0-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0z\0\0\0\377\0\0\0\366\0\0\0""7\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\331" + "\0\0\0\377^=\2\377\277|\4\377\307\214\3\377\336\273\2\377\352\322\12\377" + "\373\360\27\377\374\362\30\377\364\344\24\377D8\3\376\0\0\0""6\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\12\7\0\375\312\251\4\377\355\327\15\377\357\334\16\377\346\312\7\377" + "\365\346\23\377\367\350\26\377\300~\4\377\242i\3\377\2\1\0\377\0\0\0\223" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0\242\0\0\0\376\0\0\0\360\0\0\0I\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0@\0\0\0\372\0" + "\0\0\376\0\0\0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0M\0\0\0\376\5\4\0\377\211Y\3" + "\377\277|\4\377\306\212\4\377\325\251\3\377\334\266\4\377\330\257\6\377m" + "O\2\377\1\0\0\314\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:0\1\377\365\346\23\377\374\362\30" + "\377\374\362\30\377\373\361\27\377\351\321\12\377\344\307\6\377\306\212\4" + "\377\277|\4\377\35\23\1\377\0\0\0\370\0\0\0\23\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\1\0\0\0f\0\0\0\370\0\0\0\370\0\0\0Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\23\0\0\0\341\0\0\0\377\0\0\0\245\0\0\0\1\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\177\0\0\0\376\4\3\0\377T7\2\377\230c\3\377\253o\4\377" + "\216\\\3\377>(\1\377\1\0\0\375\0\0\0C\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0OG\4\351\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\357\333\16\377\337" + "\276\2\377\310\217\3\377\277|\4\377$\27\1\377\0\0\0\377\0\0\0""2\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0C\0\0\0\361\0\0\0\373\0\0\0Z\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\250\0\0\0\377\0\0\0\337\0\0\0\20\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b\0\0\0\357\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\373\0\0\0n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\"\36\2\274\364\350\26\377\374\362\30\377\374\362\30\377\374\362\30\377\352" + "\322\13\377\335\273\2\377\302\201\4\377\264u\4\377\10\5\0\377\0\0\0\373\0" + "\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""7\0\0\0\356" + "\0\0\0\372\0\0\0Q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0U\0\0\0\376\0\0\0\375\0\0\0C\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\2\0\0\0\16\0\0\0+\0\0\0H\0\0\0c\0\0\0{\0\0\0\217\0\0\0\237" + "\0\0\0\254\0\0\0\266\0\0\0\275\0\0\0\302\0\0\0\302\0\0\0\267\0\0\0\261\0" + "\0\0\274\0\0\0\373\0\0\0\377\0\0\0\377\0\0\0\344\0\0\0d\0\0\0\17\0\0\0\2" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\201m\7\377\366\347\24\377\371\355\26\377" + "\357\332\16\377\337\275\2\377\313\224\3\377\277|\4\377Y:\2\377\0\0\0\377" + "\0\0\0\251\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0?\0\0\0\365\0\0\0\365\0\0\0""9\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\0\0\350\0\0\0\377\0\0\0" + "\232\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0" + "\0/\0\0\0`\0\0\0\217\0\0\0\273\0\0\0\341\0\0\0\372\23\21\0\377*&\0\377@9" + "\0\377SK\0\377`V\0\377ka\0\377od\0\377ym\0\377th\0\377nc\0\377f[\0\377XO" + "\0\377G@\0\3771,\0\377\30\25\0\377\1\1\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\373\0\0\0\341\0\0\0\267\0\0\0\206\0\0\0R\0\0\0\31\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\4\3\0\346pO\2\377" + "\307\224\3\377\314\227\3\377\303\204\4\377\267w\4\377^=\2\377\1\1\0\377\0" + "\0\0\331\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0S\0\0\0\373\0\0\0\350\0\0\0\40\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\236\0\0\0\377\0\0\0\347" + "\0\0\0\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\0\0\0D\0\0\0\203\0\0\0\277\2\2" + "\0\363\32\30\0\377F?\0\377qf\0\377\231\211\0\377\275\252\0\377\336\311\2" + "\377\353\327\5\377\356\333\7\377\360\335\11\377\361\337\12\377\362\341\14" + "\377\363\343\15\377\364\344\16\377\364\345\17\377\365\346\17\377\365\346" + "\17\377\363\344\16\377\360\336\11\377\352\325\3\377\350\321\0\377\347\320" + "\0\377\335\307\0\377\273\251\0\377\221\203\0\377bX\0\377.'\0\377\6\4\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\330\0\0\0\224\0\0\0L\0\0\0" + "\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\0\360\23\14\0\3779" + "%\1\3777#\1\377\17\12\0\377\0\0\0\376\0\0\0\264\0\0\0\30\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0|\0\0\0\377\0\0\0\312\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0>\0\0\0\374\0\0\0\377\0\0\0^\0\0\0\2\0\0\0&\0\0\0q\0\0" + "\0\273\3\3\0\363'#\0\377cY\0\377\232\213\0\377\316\271\0\377\351\324\4\377" + "\357\335\11\377\363\343\15\377\367\351\22\377\372\357\26\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\373\361\27\377\367\351\22\377\362\341\13\377\354\330\5\377" + "\351\322\1\377\347\316\0\377\341\302\1\377\331\262\1\377\322\244\2\377\313" + "\227\3\377\272\205\3\377\230i\3\377{S\2\377cB\2\377@)\1\377\12\7\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\361\0\0" + "\0\251\0\0\0O\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\0\0\0\214\0\0\0\300" + "\0\0\0\300\0\0\0\223\0\0\0=\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0" + "\263\0\0\0\377\0\0\0\230\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5" + "\0\0\0\316\0\0\0\377\0\0\0\345\0\0\0\205\0\0\0\323\13\12\0\376IA\0\377\216" + "\177\0\377\315\270\0\377\353\326\4\377\361\340\13\377\366\350\21\377\372" + "\357\26\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\371" + "\354\24\377\363\343\15\377\355\332\7\377\351\323\1\377\346\315\0\377\335" + "\272\1\377\322\244\2\377\311\220\3\377\274}\4\377\224`\3\377hC\2\377>(\1" + "\377\31\20\0\377\2\1\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\346\0\0\0\210\0\0\0\37\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\25\0\0\0\344\0\0\0\376\0\0\0T\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0h\0\0\0\377\0\0\0\377\13\12\0\377ME\0\377\235\216\0\377\335\307\0\377\352" + "\325\3\377\361\340\13\377\370\354\24\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\373\360\27\377\366\350\21\377\360\336\12\377\352" + "\325\3\377\350\321\0\377\342\304\1\377\326\253\2\377\312\223\3\377\277~\4" + "\377\241h\3\377kE\2\3777#\1\377\17\12\0\377\33\21\1\3777#\1\377P5\2\377f" + "F\2\377yT\2\377\207a\2\377\217g\2\377\226l\2\377\222h\2\377\213a\2\377~V" + "\2\377kG\2\377U7\2\3779%\1\377\31\20\0\377\3\2\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\243\0\0\0,\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0K\0\0\0\375\0\0\0\352\0\0\0\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0I\0\0\0\257\0\0\0\371\0" + "\0\0\377F?\0\377\330\303\0\377\351\322\1\377\356\334\10\377\366\350\21\377" + "\373\361\27\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\361\30\377" + "\366\351\21\377\357\335\10\377\351\323\1\377\350\320\0\377\341\302\1\377" + "\323\246\2\377\306\213\3\377\275{\4\377\223`\3\377W9\2\377/\37\1\377B+\1" + "\377pN\2\377\237v\2\377\304\227\3\377\326\254\2\377\334\270\2\377\340\301" + "\1\377\343\306\1\377\344\310\1\377\344\311\1\377\345\312\1\377\345\312\1" + "\377\344\311\1\377\344\311\1\377\343\307\1\377\341\302\1\377\334\270\2\377" + "\325\252\2\377\315\233\3\377\264\200\3\377\200U\3\377I0\1\377\17\12\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0\241\0\0\0\35\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\240\0\0\0\377\0\0\0\256\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0p\0\0\0\333\16\15\0\377\26\24\0\377\0\0" + "\0\377\5\4\0\377\307\266\4\377\363\343\15\377\372\357\26\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\371\356\25\377\362\341\14\377" + "\352\325\3\377\350\321\0\377\343\306\0\377\324\251\2\377\306\213\3\377\276" + "{\4\377\226b\3\377V8\2\377='\1\377cB\2\377\244y\2\377\321\244\2\377\336\273" + "\1\377\344\311\1\377\346\315\0\377\350\320\0\377\352\324\2\377\355\331\6" + "\377\357\335\11\377\362\341\13\377\363\343\15\377\364\344\16\377\364\344" + "\16\377\363\344\16\377\362\341\14\377\357\335\11\377\353\326\4\377\350\321" + "\0\377\350\321\0\377\350\321\0\377\347\317\0\377\345\313\1\377\340\301\1" + "\377\324\247\2\377\276\210\3\377[;\2\377\6\4\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\362\0\0\0v\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\0\0\353\0\0\0\376\0\0\0T\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\34\0\0\0\213\0\0\0\357\40\35\0\377\203" + "v\0\377\307\263\0\377\16\14\0\377\0\0\0\377_[\11\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\361\30\377\366\350\21\377\356\332" + "\7\377\350\321\0\377\346\315\0\377\331\262\1\377\311\221\3\377\277}\4\377" + "\245k\3\377a?\2\3775\"\1\377`?\2\377\253{\3\377\323\247\3\377\341\301\1\377" + "\345\314\0\377\350\322\1\377\355\332\6\377\362\342\14\377\367\351\22\377" + "\372\357\26\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\371\355\24\377\361\341\13\377\352\324\2\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\320\0\377\345\313\1\377\333" + "\265\2\377\250{\3\377*\33\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\313\0\0\0)\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0f\0\0\0\377\0\0\0\343\0\0\0\15\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!\0\0\0" + "\226\0\0\0\366*&\0\377\230\211\0\377\342\314\0\377\350\322\0\377pf\2\377" + "\0\0\0\377\6\6\1\377\331\320\25\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\373\360" + "\26\377\363\343\15\377\353\326\3\377\350\321\0\377\340\301\1\377\320\237" + "\2\377\302\202\4\377\270w\4\377{P\3\3773!\1\3770\37\1\377\204X\3\377\310" + "\225\3\377\333\266\2\377\343\310\1\377\347\317\0\377\354\330\5\377\364\345" + "\17\377\373\360\26\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\373\360\27\377\362\342" + "\14\377\351\322\1\377\350\321\0\377\350\321\0\377\350\321\0\377\347\317\0" + "\377\340\301\2\377\320\245\2\377\\>\2\377\2\1\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\361\0\0\0Z\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0\315\0\0\0\377\0\0\0\206\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\34\0\0\0\225\0\0\0" + "\370.*\0\377\237\220\0\377\347\320\0\377\350\321\0\377\355\331\6\377\346" + "\332\22\377\17\16\1\377\0\0\0\377]Y\11\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\371\356\25\377" + "\361\337\13\377\351\323\1\377\347\316\0\377\331\262\1\377\310\217\3\377\277" + "|\4\377\235f\3\377S6\2\377\16\11\0\377-\35\1\377\220_\3\377\315\231\3\377" + "\335\273\2\377\345\312\1\377\350\321\0\377\355\331\6\377\367\352\22\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\370\353\23\377\351\323\1\377\350\321\0\377\350" + "\321\0\377\350\321\0\377\346\315\0\377\337\277\2\377\331\261\2\377\206[\2" + "\377\12\7\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\203" + "\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0E\0\0\0\376" + "\0\0\0\365\0\0\0!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0" + "\207\0\0\0\364%!\0\377\232\213\0\377\345\317\0\377\350\321\0\377\353\326" + "\3\377\365\347\20\377\374\362\30\377\201|\14\377\0\0\0\377\3\2\0\377\323" + "\313\24\377\374\362\30\377\374\362\30\377\374\362\30\377\373\361\27\377\366" + "\351\21\377\357\334\10\377\351\322\1\377\343\307\0\377\323\245\2\377\303" + "\204\4\377\270x\4\377|P\3\377.\36\1\377\2\1\0\377\23\14\0\377}Q\3\377\310" + "\221\3\377\333\266\2\377\343\307\1\377\350\320\0\377\351\322\1\377\364\344" + "\16\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\361\340\13\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321" + "\0\377\343\306\1\377\337\276\2\377\327\256\2\377\230d\3\377\22\13\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\225\0\0\0\3\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\272\0\0\0\377\0\0\0\237" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0j\0\0\0\350\25\23\0\377\211{\0\377" + "\342\314\0\377\350\321\0\377\350\321\0\377\350\322\0\377\357\334\10\377\360" + "\336\12\377\351\330\12\377\27\26\2\377\0\0\0\377KE\3\377\363\343\15\377\362" + "\342\14\377\361\337\12\377\355\332\7\377\351\323\2\377\350\320\0\377\336" + "\275\1\377\315\232\3\377\300~\4\377\250m\3\377[;\2\377\22\14\0\377\0\0\0" + "\377\0\0\0\377;&\1\377\263y\3\377\325\252\3\377\337\277\2\377\346\314\0\377" + "\350\321\0\377\351\322\1\377\367\352\22\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\361\337\12\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\346\315\0\377\337" + "\276\2\377\337\276\2\377\315\232\3\377\235f\3\377\21\13\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\212\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0\0\377\0\0\0\372\0\0\0(\0\0\0\0\0\0\0" + "A\0\0\0\321\10\7\0\377ka\0\377\333\305\0\377\350\321\0\377\350\321\0\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\220" + "\202\0\377\0\0\0\377\1\1\0\377\261\237\0\377\345\313\0\377\342\305\1\377" + "\335\272\1\377\326\254\2\377\315\232\2\377\303\205\4\377\275{\4\377\216\\" + "\3\377<'\1\377\3\2\0\377\0\0\0\377\0\0\0\377\0\0\0\377V8\2\377\302\204\4" + "\377\335\271\2\377\337\276\2\377\345\314\0\377\350\321\0\377\350\321\0\377" + "\363\343\15\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\365\347\20\377\350\322\1\377\350\321\0\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\337\276\2\377\337" + "\276\2\377\334\271\2\377\300~\4\377\227b\3\377\11\6\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\272\0\0\0\377\0\0\0\256\0\0\0\244\1\1\0\375B<\0\377" + "\304\261\0\377\350\321\0\377\347\316\0\377\340\300\1\377\330\260\2\377\322" + "\243\2\377\315\231\3\377\312\222\3\377\310\216\3\377\305\213\3\377+\40\0" + "\377\0\0\0\377*\33\1\377\300\177\4\377\300~\4\377\277|\4\377\277|\4\377\277" + "|\4\377\261s\4\377qI\2\377\"\26\1\377\1\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377K0\1\377\276{\4\377\322\244\3\377\337\276\2\377\341\303\1\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\371\356\25\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\373\361\27\377\371\355\24\377\364\345\17\377\355\332\6\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350" + "\321\0\377\347\317\0\377\337\276\2\377\337\276\2\377\337\276\2\377\311\220" + "\3\377\277|\4\377|Q\2\377\1\1\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\364\0\0\0+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\0\376" + "\0\0\0\377\31\26\0\377\233\214\0\377\343\311\0\377\330\257\2\377\313\226" + "\3\377\302\201\4\377\272y\4\377\242i\3\377\213[\3\377yN\3\377kE\2\377`>\2" + "\377P4\2\377\1\0\0\377\0\0\0\3775\"\1\377kF\2\377rJ\2\377oH\2\377[;\2\377" + "4\"\1\377\10\5\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\16\11\0\377\264u\4\377\277|\4\377\326\254\3\377\337\276\2\377\342" + "\304\1\377\350\321\0\377\350\321\0\377\350\321\0\377\362\341\14\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\373\360\26\377\370\353\23\377\365\347\20\377\363\343\15\377\357\335" + "\11\377\354\327\4\377\351\322\1\377\350\321\0\377\350\321\0\377\350\321\0" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377" + "\350\321\0\377\342\305\1\377\337\276\2\377\337\276\2\377\337\276\2\377\317" + "\236\3\377\277|\4\377\277|\4\377H/\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\277\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"\0\0" + "\0\274\0\0\0\377\0\0\0\377aO\1\377\303\216\3\377\224a\3\377hC\2\377@*\1\377" + "\35\23\1\377\3\2\0\377\10\5\0\377\22\14\0\377\32\21\1\377\37\24\1\377'\31" + "\1\377\12\7\0\377\0\0\0\377\5\3\0\377\14\10\0\377\2\1\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\3770\37\1\377\277|\4\377\277|\4\377\315\230\3\377\337" + "\276\2\377\337\277\2\377\346\316\0\377\350\321\0\377\350\321\0\377\350\321" + "\0\377\353\326\3\377\361\337\12\377\365\347\20\377\372\357\26\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\372\357\26\377\365\347\20\377\361\340\13\377\355\331" + "\6\377\352\324\2\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\320\0\377\345" + "\313\1\377\341\302\1\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\322\243\3\377\277|\4\377\277|\4\377\260s\4\377\20\12\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0L\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0f\0\0" + "\0\361\35\23\1\377K0\1\377\0\0\0\377\7\5\0\377\33\22\0\3777%\1\377_D\1\377" + "\203b\2\377\244~\4\377\301\230\6\377\320\250\10\377\331\262\11\377\336\271" + "\12\377\337\274\13\377\330\264\12\377\21\15\0\377\0\0\0\377iU\3\377\313\233" + "\4\377\277\216\3\377\251y\3\377\213`\2\377kG\2\377I0\1\377%\30\1\377\6\4" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\16\11\0\377\255" + "p\4\377\277|\4\377\300}\4\377\326\254\2\377\337\276\2\377\340\300\2\377\345" + "\314\1\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321" + "\0\377\351\322\1\377\357\335\10\377\371\354\24\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\367\352\22\377\355\332\7\377\350\322\1\377\350\321" + "\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377" + "\350\321\0\377\350\321\0\377\347\320\0\377\346\315\0\377\344\311\1\377\342" + "\304\1\377\340\277\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\321\241\3\377\277|\4\377\277|\4\377\277" + "|\4\377gC\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\273" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\27\0\0\0\263\0\0\0\377\16\11\0\3771\40\1\377C4\1\377\26\23\1\377\0" + "\0\0\377\225\203\10\377\355\330\16\377\355\330\16\377\352\320\16\377\346" + "\311\15\377\342\301\13\377\337\273\12\377\335\267\11\377\333\265\10\377\335" + "\270\11\377\242\212\7\377\0\0\0\377\3\2\0\377\320\274\13\377\361\336\20\377" + "\363\342\21\377\365\345\22\377\362\341\21\377\354\324\15\377\341\300\11\377" + "\324\247\5\377\277\213\3\377\221b\3\377]=\2\377(\32\1\377\2\1\0\377\0\0\0" + "\377\0\0\0\377\36\23\1\377\204V\3\377\275z\4\377\300\177\4\377\323\246\3" + "\377\337\276\2\377\337\276\2\377\342\303\1\377\346\314\0\377\350\321\0\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\322\1\377\361" + "\340\13\377\373\361\27\377\364\345\17\377\350\321\0\377\350\321\0\377\350" + "\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321" + "\0\377\350\321\0\377\350\321\0\377\350\321\0\377\347\316\0\377\345\312\1" + "\377\343\306\1\377\341\302\1\377\340\300\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\314\227\3\377\277|\4" + "\377\277|\4\377\277|\4\377\261s\4\377\7\5\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\374\0\0\0\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0J\0\0\0\347\5\5\0\377HA\3\377\234\217\11\377\337\307" + "\14\377\346\310\16\377r\\\5\377\0\0\0\3778(\1\377\241l\3\377\220^\3\377\205" + "V\3\377{P\3\377sK\2\377oH\2\377oH\2\377oH\2\377rJ\2\3777$\1\377\0\0\0\377" + "&\31\1\377\242i\3\377\264y\3\377\305\212\3\377\314\226\3\377\325\250\6\377" + "\341\300\12\377\355\327\16\377\366\347\23\377\367\351\24\377\360\334\17\377" + "\340\276\11\377\317\235\4\377\260x\3\377pI\2\377.\36\1\377\3\2\0\377\0\0" + "\0\377\27\17\0\377gC\2\377\262t\4\377\312\223\3\377\333\267\2\377\337\276" + "\2\377\337\276\2\377\341\301\2\377\344\311\1\377\347\320\0\377\350\321\0" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\354\330\5\377\352\325\3\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350" + "\321\0\377\350\321\0\377\347\317\0\377\344\311\1\377\342\304\1\377\340\300" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\303\205\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\3777$\1" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0R\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\213\0\0\0\374\0\0\0\377-%\0\377" + "ua\3\377]G\2\377B,\1\377,\35\1\377\23\14\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\3\0\377\20\13\0\377" + "*\33\1\377J0\2\377mG\2\377\226c\3\377\276\205\3\377\320\237\5\377\340\276" + "\11\377\357\333\17\377\366\350\24\377\357\333\17\377\334\267\7\377\312\222" + "\3\377\244l\3\377[;\2\377\22\14\0\377\0\0\0\377\15\10\0\377_>\2\377\264w" + "\4\377\316\234\3\377\335\271\2\377\337\276\2\377\337\276\2\377\337\277\2" + "\377\342\305\1\377\346\315\0\377\350\321\0\377\350\321\0\377\350\321\0\377" + "\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350" + "\321\0\377\345\313\0\377\341\303\1\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\327\255\2\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277" + "|\4\377^=\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0v" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35\0\0\0\303\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\11\6\0\3772" + "\40\1\377gC\2\377\242m\3\377\313\225\3\377\334\267\7\377\356\330\16\377\361" + "\336\17\377\343\305\11\377\315\231\3\377\271z\4\377uL\2\377\35\23\1\377\0" + "\0\0\377\20\12\0\377mG\2\377\275~\4\377\316\233\3\377\335\272\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\342\304\1\377\347\316\0\377\350\321\0" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\350\321\0\377\347\317\0\377" + "\341\303\1\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\275\2\377\307\214\3\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377" + "\277|\4\377hD\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\204\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0C\0\0\0\350\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\3\0\377\11\6\0\377\14\10\0\377" + "\15\10\0\377\11\6\0\377\5\3\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\1\0\0\377\40\25\1\377eB\2\377\254t\3\377\316" + "\234\3\377\341\300\7\377\352\322\12\377\341\301\7\377\313\224\3\377\275{" + "\4\377yN\2\377\32\21\0\377\0\0\0\377#\26\1\377\223_\3\377\302\203\4\377\325" + "\251\3\377\337\276\2\377\337\276\2\377\337\276\2\377\337\277\2\377\344\311" + "\1\377\350\321\0\377\350\321\0\377\350\321\0\377\346\315\0\377\340\300\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\322\243\3\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377" + "\277|\4\377X9\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0q\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\3\0\0\0q\0\0\0\372\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\11\6\0\377+\34\1\377N2\2\377lF\2" + "\377\26\16\0\377.\36\1\377\253o\4\377\263t\4\377\267w\4\377\272y\4\377\272" + "y\4\377\267w\4\377\264u\4\377\\<\2\377\1\1\0\377vL\2\377qJ\2\377U7\2\377" + "5\"\1\377\22\14\0\377\1\1\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\5\3\0\377?)\1\377\225b\3" + "\377\310\220\3\377\330\260\3\377\342\303\4\377\330\260\3\377\304\207\4\377" + "\270w\4\377eB\2\377\11\6\0\377\3\2\0\377V8\2\377\271x\4\377\315\230\3\377" + "\336\274\2\377\337\276\2\377\337\276\2\377\337\276\2\377\343\306\1\377\350" + "\321\0\377\347\320\0\377\340\300\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\326\253\2\377\300~\4\377\277|\4\377" + "\277|\4\377\277|\4\377\277|\4\377\277|\4\377\274z\4\377\37\24\1\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0F\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\0\312\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\5\3\0\3772!\1\377" + "gC\2\377\230b\3\377\272y\4\377\277|\4\377\277|\4\377\277|\4\377\\<\2\377" + "/\36\1\377\300\177\4\377\302\203\4\377\304\206\4\377\305\211\4\377\305\211" + "\4\377\305\211\4\377\305\211\4\377Z>\2\377'\33\1\377\277~\4\377\277|\4\377" + "\277|\4\377\277|\4\377\276{\4\377\246l\3\377zO\3\377J0\2\377\27\17\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\1\0\0\3774\"\1\377\225a\3\377\307\214\3\377\326\254\2\377\336\274" + "\2\377\316\232\3\377\277}\4\377\247l\3\3777$\1\377\0\0\0\377%\30\1\377\242" + "i\3\377\307\213\3\377\334\270\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\343\306\1\377\343\307\1\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\322\244\3\377\300~\4\377\277|\4\377\277" + "|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377b?\2\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0!\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\0\0\0\241\0\0\0\375\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\4\2\0\3774\"\1\377xN\2\377\262s\4\377\277" + "|\4\377\277|\4\377\300\177\4\377\305\211\4\377\313\225\3\377\321\240\3\377" + "\325\252\3\377\267\227\2\377[N\1\377\336\275\2\377\337\275\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\200m\1\377" + "{i\1\377\336\275\2\377\335\271\2\377\331\261\2\377\324\250\3\377\317\235" + "\3\377\311\220\3\377\302\203\4\377\277|\4\377\275{\4\377\232d\3\377]=\2\377" + "\34\22\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\2\1\0\377C+\1\377\251n\3\377\307\215\3\377\331\261\2\377\326\253" + "\2\377\302\201\4\377\276{\4\377qI\2\377\10\5\0\377\15\10\0\377\207X\3\377" + "\303\205\4\377\332\264\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\277\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\334\270\2\377\312" + "\222\3\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4" + "\377\255q\4\377F-\1\377\1\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0j\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0wM\2\0" + "\7\5\0A\0\0\0\341\0\0\0\377\0\0\0\377\0\0\0\377\13\7\0\377\20\12\0\377Z:" + "\2\377\245k\3\377\277|\4\377\300~\4\377\307\214\3\377\320\237\3\377\330\257" + "\2\377\336\273\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\277\2" + "\377\337\300\2\377\330\274\1\377\342\305\1\377\343\306\1\377\343\307\1\377" + "\343\307\1\377\343\306\1\377\342\305\1\377\342\304\1\377\324\267\1\377\312" + "\255\1\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\275\2\377\332\263\2\377\321\241\3\377\307\214\3" + "\377\277}\4\377\275z\4\377\222_\3\377F-\1\377\7\4\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\13\7\0\377rJ\2\377\276|\4\377\314" + "\226\3\377\330\260\2\377\305\207\4\377\277|\4\377\231d\3\377\31\20\0\377" + "\4\2\0\377rJ\2\377\302\202\4\377\331\262\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\324\247\3\377\302\202\4\377" + "\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\270x\4\377hD\2\377" + "\15\11\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\234\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\270w\3\7," + "\34\1\213\2\2\0\374\0\0\0\377\0\0\0\377\0\0\0\377\1\0\0\3770\37\1\377J0\2" + "\377nG\2\377\234i\3\377\317\241\3\377\334\271\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\340\301\2\377\343\306\1\377\345\312\1\377\347\316\0" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\351\322\1\377\352\325\3\377" + "\353\327\4\377\355\330\5\377\355\330\6\377\355\330\6\377\353\327\4\377\352" + "\324\2\377\350\321\0\377\347\317\0\377\346\315\0\377\344\311\1\377\342\305" + "\1\377\341\302\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\333\266\2\377\317\236\3\377\303\204\4\377\277|\4\377\255" + "p\4\377]=\2\377\16\11\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\3778$\1\377\256q\4\377\302\202\4\377\322\242\3\377\307\214\3\377" + "\277|\4\377\256q\4\377)\33\1\377\1\1\0\377fB\2\377\302\201\4\377\331\262" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\331\262\2\377\310\216\3\377\277|\4" + "\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\272y\4\377tK\2\377\26\16" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\1\1\0\377\0\0\0\377\0\0\0\377\0\0\0\270\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Q4\1" + "\26""9%\1\301\5\7\1\377\32-\5\3771S\11\377@m\14\377H{\16\377K\200\17\377" + "Gy\16\377;e\13\377(D\10\377\16\26\2\377\37\32\0\377|i\1\377\330\271\2\377" + "\343\307\1\377\346\316\0\377\350\321\0\377\350\321\0\377\351\323\2\377\356" + "\332\7\377\362\342\14\377\366\350\21\377\371\355\25\377\373\361\27\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\361\30\377\371\355\24\377\354\330\5\377\350\321\0\377\350" + "\321\0\377\350\321\0\377\350\321\0\377\347\316\0\377\343\306\1\377\340\277" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\336\274\2" + "\377\323\244\3\377\303\205\4\377\277|\4\377\263t\4\377^=\2\377\13\7\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\26\16\0\377\225a\3\377" + "\277|\4\377\311\220\3\377\306\212\3\377\277|\4\377\265u\4\3770\37\1\377\1" + "\1\0\377oH\2\377\302\202\4\377\332\263\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\334\270\2\377\314\230\3\377\300}\4\377" + "\277|\4\377\277|\4\377\277|\4\377\277|\4\377\271x\4\377tK\2\377\31\21\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\12\20\0\377Nz\0\377\0\0\0\377\0\0\0\377\0\0\0\274\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0'\7\13\1\3501T\11\377Z\226\20\377|\303\13\377\222\334\6\377\235\351" + "\4\377\236\353\4\377\226\342\5\377\206\317\11\377m\261\16\377]\236\22\377" + "\\\234\22\377?k\14\377\14\24\2\377'#\0\377\307\263\0\377\352\324\2\377\361" + "\340\13\377\367\352\22\377\373\361\27\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\361\30\377\364\345\16\377\353" + "\325\3\377\350\321\0\377\350\321\0\377\350\321\0\377\346\314\0\377\342\304" + "\1\377\337\277\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\336\274\2\377" + "\320\237\3\377\300\177\4\377\277|\4\377\253o\4\377F.\1\377\1\1\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\10\5\0\377\177R\3\377\277|\4\377\302" + "\203\4\377\301\201\4\377\277|\4\377\263t\4\377$\27\1\377\3\2\0\377\206W\3" + "\377\303\205\4\377\334\270\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\336\273\2\377\317\236" + "\3\377\301\200\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\266v\4\377" + "kE\2\377\27\17\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\26$\0\377l\257\0\377\223\336\0\377" + "\1\1\0\377\0\0\0\377\0\0\0\251\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\31\1\12\33-\5\317S\215\20\377w\275" + "\14\377\247\366\2\377\255\375\0\377\226\341\5\377q\266\15\377k\257\17\377" + "t\272\15\377\207\320\11\377\242\360\3\377\233\347\4\377n\262\16\377]\236" + "\22\377U\221\21\377\22\37\4\377\40\35\1\377\353\341\26\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\367\352\22\377\353\327\4\377\350\321\0\377\350\321\0\377" + "\350\321\0\377\347\316\0\377\341\303\1\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\333\265\2\377\307\213\3\377\277|\4\377\277|\4\377~R\3\377\12\6\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\2\0\377pI\2\377\277|\4\377\277" + "|\4\377\277|\4\377\277|\4\377\247l\3\377\16\11\0\377\15\11\0\377\246l\3\377" + "\306\213\3\377\336\274\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\336\273\2\377\321\241\3\377\302\202\4\377\277|\4\377\277|\4\377\277" + "|\4\377\277|\4\377\255p\4\377^=\2\377\16\11\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377Eq\0\377\203\323\0\377\227\345\0\377\2\3\0\377\0\0\0\377\0" + "\0\0\203\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\277|\4\0>H\6\223X\226\21\377|\302\13\377\237\354\3\377\256\375\0" + "\377\257\377\0\377\257\377\0\377\241\357\3\377c\245\21\377^\237\22\377_\241" + "\21\377_\240\22\377v\274\14\377\237\355\3\377z\301\13\377]\236\22\377P\210" + "\17\377\3\5\1\377\202}\14\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\373\361\27\377\362\342\14\377" + "\351\323\1\377\350\321\0\377\351\323\0\377\372\365\0\377\375\373\0\377\351" + "\323\1\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\336\275\2\377\333\271\2\377" + "\315\231\3\377\277|\4\377\277|\4\377\233d\3\377\26\16\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\1\1\0\377oH\2\377\277|\4\377\277|\4\377\277|\4" + "\377\277|\4\377zO\2\377\0\0\0\3773!\1\377\276{\4\377\315\230\3\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\336\273\2\377\321\241\3\377\302\203\4\377\277|\4\377\277" + "|\4\377\277|\4\377\277|\4\377\236f\3\377K1\2\377\10\5\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\7\13\0\377\0\0\0\377\0\0\0\377%=\0\377\217\341\0\377\213\324" + "\0\377\0\0\0\377\0\0\0\377\0\0\0K\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\205W\3/Q\177\16\374j\256\17\377\212\324" + "\10\377\205\315\11\377\257\377\0\377\257\377\0\377\257\377\0\377\257\377" + "\0\377\215\327\7\377}\304\13\377\200\310\12\377}\305\13\377r\270\15\377c" + "\245\21\377\210\321\10\377l\257\17\377]\236\22\377\36""3\6\377EB\7\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374" + "\362\30\377\374\362\30\377\374\362\30\377\370\353\23\377\347\320\1\377\351" + "\322\1\377\377\377\0\377\377\377\0\377\365\353\1\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\336\276\2\377\267\234\2\377we\1\377G=\1\377(\"\0\377\27" + "\23\0\377\22\20\0\377\32\26\0\377)\33\1\377I/\1\377xN\2\377\233e\3\377\34" + "\22\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\1\0\377wM\2\377\277|" + "\4\377\277|\4\377\277|\4\377\275{\4\377%\30\1\377\0\0\0\377\203U\3\377\277" + "}\4\377\327\255\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\335\273\2\377\321\240\3\377\302\203\4\377\277|\4\377\277|\4\377\277" + "|\4\377\275{\4\377\210X\3\3775\"\1\377\2\2\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\3\5\0\377Bh\0\377\210\320\0\377\4\6\0\377\0\0\0\377\"7\0\377\234\361" + "\0\377f\233\0\377\0\0\0\377\0\0\0\363\0\0\0\13\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ZJ\4\240]\236\22\377z\300\13" + "\377]\235\21\377\204\313\4\377\257\377\0\377\257\377\0\377\257\377\0\377" + "\257\377\0\377\222\334\0\377w\274\2\377{\301\5\377\177\307\11\377\200\310" + "\12\377z\301\13\377^\240\22\377c\245\21\377]\236\22\377\":\7\377DA\6\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\352\322\12\377" + "\341\301\2\377\367\357\0\377\374\371\0\377\351\322\1\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\234\205\1\377/*\1\377\32,\5\3773W\12\377Ds\15\377S\212\15\377b\235" + "\14\377`\231\12\377R\204\12\377:a\12\377%?\7\377\17\31\3\377\11\6\0\377:" + "&\1\377\3\2\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\4\2\0\377\212Z" + "\3\377\277|\4\377\277|\4\377\277|\4\377qJ\2\377\0\0\0\377+\34\1\377\276|" + "\4\377\306\212\4\377\337\276\2\377\337\276\2\377\334\270\2\377\317\234\3" + "\377\301\201\4\377\277|\4\377\277|\4\377\277|\4\377\262s\4\377lF\2\377\35" + "\23\1\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\0\377&>\0\377i\254\0\377" + "\222\345\0\377\250\377\0\377\24\36\0\377\0\0\0\377*E\0\377\235\360\0\377" + ")>\0\377\0\0\0\377\0\0\0\236\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\273y\4\6@A\5\352^\237\22\377b\244\21\377P\214" + "\6\377]\233\0\377\254\373\0\377\257\377\0\377\257\377\0\377\255\374\0\377" + "\177\304\0\377u\270\0\377u\270\0\377v\271\1\377{\301\5\377\200\310\12\377" + "i\255\17\377]\236\22\377]\236\22\377\21\36\3\377wr\13\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\356\332\16\377\337\276\2\377" + "\337\276\2\377\340\277\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\332\272\2\377YK\1\377\33-\5\377Q\212" + "\20\377^\237\22\377x\277\14\377\235\351\4\377\255\375\0\377\254\374\1\377" + "\233\347\4\377\241\356\3\377\250\366\2\377\227\343\5\377x\275\14\377N\204" + "\16\377%>\7\377\3\4\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\16\11\0\377\243i\3\377\277|\4\377\277|\4\377\237h\3\377\0\0\0\377\2\1\0" + "\377\252n\3\377\277|\4\377\327\255\2\377\313\225\3\377\300\177\4\377\277" + "|\4\377\277|\4\377\276{\4\377\232d\3\377M2\2\377\12\7\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377S\207\0\377}\313\0\377}\314\0" + "\377\223\346\0\377\250\377\0\377\24\36\0\377\0\0\0\377\20\33\0\377\32(\0" + "\377\0\0\0\377\0\0\0\371\0\0\0*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""3!\1\35\20\26\2\377]\236\22\377\\\235\21" + "\377J\203\1\377I\202\0\377a\240\0\377\213\323\0\377\220\330\0\377\202\310" + "\0\377u\270\0\377u\270\0\377u\270\0\377u\270\0\377u\270\0\377{\301\6\377" + "l\260\17\377]\236\22\377Hz\16\377\4\4\0\377\323\313\24\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\370\353\23\377\367\352\22\377\374\362\30\377\374\362\30\377" + "\374\362\30\377\374\362\30\377\374\362\30\377\352\322\12\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377dU\1\377\23!\4\377Y\230\21\377a\242" + "\21\377\220\333\7\377\236\353\4\377\257\377\0\377\257\377\0\377\257\377\0" + "\377\200\310\12\377]\236\22\377b\243\21\377w\275\14\377\232\347\4\377\241" + "\357\3\377r\267\15\377N\204\17\377\24#\4\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377$\27\1\377\267w\4\377\277|\4\377\264u\4\377\5\3\0\377" + "\0\0\0\377\215\\\3\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\266v\4" + "\377vL\2\377+\34\1\377\1\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\4\6\0\377\0\0\0\377\0\0\0\377U\213\0\377}\314\0\377}\314\0\377\236" + "\363\0\377\244\370\0\377\12\20\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\212\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0O\0\0\0\377O\207\17\377\\\234\21\377I\202\0\377" + "I\202\0\377I\202\0\377I\202\0\377M\206\0\377r\264\0\377u\270\0\377u\270\0" + "\377u\270\0\377u\270\0\377u\270\0\377z\300\6\377b\244\21\377X\226\21\377" + "\20\33\3\377d`\11\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\356\333" + "\7\377\355\331\6\377\373\361\27\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\366\347\23\377\340\300\3\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\305\250\2\377\4\3\0\377Hz\16\377^\237\22\377\200\310\12\377f\251\20" + "\377\217\331\7\377\257\377\0\377\257\377\0\377\257\377\0\377\235\352\4\377" + "]\236\22\377]\236\22\377^\237\22\377]\236\22\377u\272\15\377\244\362\2\377" + "\204\314\11\377[\232\21\377\37""5\6\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377O3\2\377\277|\4\377\270w\4\377\12\6\0\377\0\0\0\377\231c" + "\3\377\277|\4\377\275{\4\377\222_\3\377K1\1\377\12\7\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\0\377\40""4\0\377l\250\0\377\241\365" + "\0\377Eh\0\377\0\0\0\377Q\205\0\377}\314\0\377\211\333\0\377\250\377\0\377" + "\211\317\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\275\0\0\0\7" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0y\0\0\0\377&@\7\377]\235\22\377K\205\2\377I\202\0\377I\202" + "\0\377I\202\0\377I\202\0\377T\217\0\377p\262\0\377u\270\0\377u\270\0\377" + "u\270\0\377t\267\2\377g\252\17\377W\224\21\377\30(\5\377$#\3\377\355\344" + "\27\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\372\357\26\377\350\322\0\377\350\321" + "\0\377\354\327\5\377\363\343\17\377\364\343\22\377\355\330\15\377\341\301" + "\3\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\216y\1\377\11" + "\17\2\377\\\234\22\377b\244\21\377_\240\22\377]\236\22\377\203\313\12\377" + "\257\377\0\377\257\377\0\377\257\377\0\377\231\345\5\377v\274\14\377}\305" + "\13\377~\306\12\377{\302\13\377q\266\15\377h\253\17\377\231\345\5\377\202" + "\312\12\377Y\227\21\377\12\22\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\1\1\0\377\212Z\3\377\264u\4\377\5\4\0\377!\26\1\377\222^\3\377[;\2\377\33" + "\21\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\5\0" + "\377*D\0\377b\237\0\377~\315\0\377\244\373\0\377\250\377\0\377\245\372\0" + "\377!3\0\377W\215\0\377\202\322\0\377\244\372\0\377\250\377\0\377Jp\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\267\0\0\0\16\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\221" + "\0\0\0\377\1\2\0\377@l\14\377T\221\12\377I\202\0\377I\202\0\377I\202\0\377" + "I\202\0\377I\202\0\377K\204\0\377V\222\0\377Z\227\0\377Z\227\3\377]\235\20" + "\377Hz\16\377\16\30\3\377\31\30\2\377\323\313\24\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\365\347\20\377\350\321\0\377\350\321\0\377\350\321" + "\0\377\342\304\1\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\207s\1\377\13\23\2\377]\236\22" + "\377]\236\22\377W\225\14\377P\214\6\377P\213\3\377\207\316\0\377\244\362" + "\0\377\235\351\0\377{\277\1\377w\273\2\377y\275\3\377{\301\5\377~\305\10" + "\377\200\310\12\377~\305\13\377g\252\20\377\224\337\6\377i\254\17\377/I\10" + "\377\13\7\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\26\16\0\377b?\2\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\3771O\0\377}\314\0\377}\314\0\377\206\327" + "\0\377\250\377\0\377\250\377\0\377\250\377\0\377Cf\0\377k\256\0\377\241\366" + "\0\377\250\377\0\377\211\317\0\377\5\10\0\377\0\0\0\322\0\0\0\237\0\0\0f" + "\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\225\0\0\0\377\0\0\0\377\3\5\0\377" + "3X\12\377P\213\10\377I\203\0\377I\202\0\377I\202\0\377I\202\0\377I\202\0" + "\377K\205\2\377S\217\11\377Hz\15\377\37""4\6\377\1\2\0\377*(\4\377\325\315" + "\24\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\362\342" + "\14\377\350\321\0\377\350\321\0\377\347\320\0\377\337\277\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\254\222\1\377\2\4\0\377T\216\20\377V\224\14\377I\202\0\377I\202" + "\0\377I\202\0\377I\202\0\377R\215\0\377u\270\0\377u\270\0\377u\270\0\377" + "u\270\0\377u\270\0\377u\270\0\377x\274\2\377~\305\10\377z\301\13\377`\241" + "\21\377q\266\16\3775Y\12\377O3\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\1\2\0\377!5\0\377h\236\0\377Nw\0\377\0\0\0\377#:\0\377}\314\0\377" + "}\314\0\377\215\337\0\377\250\377\0\377\250\377\0\377\250\376\0\3770J\0\377" + "\217\341\0\377\250\377\0\377\177\300\0\377\21\31\0\377\0\0\0\357\0\0\0'\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\205\0\0\0\377\0\0\0" + "\377P4\2\3772\40\1\377\14\24\2\377%@\5\3772X\3\3777b\3\3777`\4\3772V\6\377" + "%?\7\377\15\27\3\377\0\1\0\377\14\13\1\377wr\13\377\361\347\27\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\361\340" + "\13\377\350\321\0\377\350\321\0\377\346\314\0\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\334\273\2\377\33\27\0\377/P\11\377V\225\14\377I\202\0\377I\202" + "\0\377I\202\0\377I\202\0\377[\230\0\377u\270\0\377u\270\0\377u\270\0\377" + "u\270\0\377u\270\0\377u\270\0\377u\270\0\377v\271\1\377~\306\10\377_\240" + "\22\377]\236\22\3772T\12\377\203U\3\377\25\16\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\20\32" + "\0\377\215\377\377B\225\377\377B\225\377\377B\225\377\377B\225\377" + "\377B\225\377\377B\225\377\377B\225\377\377C\223\377\370fn\377\353\301\21" + "\377\350\321\0\377\350\321\0\377\350\321\0\377\356\334\10\377\371\355\24" + "\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362\30\377\374\362" + "\30\377\374\362\30\377\374\362\30\377\374\362\30\377\357\334\10\377\350\321" + "\0\377\350\321\0\377\341\302\1\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\311\254\2\377@6\0\377\0\1\0\377\24" + "#\4\377:d\10\377L\205\5\377J\204\1\377I\202\0\377I\202\0\377J\203\1\377M" + "\210\4\377S\217\13\377\2" + "\377\273z\4\377\277|\4\377\311\221\3\377\333\265\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\261\227" + "\1\377\264\235\1\377\344\312\1\377\347\317\0\377\350\321\0\377\302\256\0" + "\377\224~\3\377\332\305\0\377\350\321\0\377\350\321\0\377\350\321\0\377\350" + "\321\0\377\350\321\0\377\334\276\1\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\342\264\16\377" + "\360zR\377\375J\213\377\377B\225\377\377B\225\377\377B\225\377\377B\225\377" + "\377B\225\377\377B\225\377\377B\225\377\374N\207\377\351\230/\377\337\276" + "\2\377\336\274\2\377\317\236\3\377\300~\4\377\277|\4\377\267w\4\377.\36\1" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\3\0\377$7\0\3772L\0\377'<" + "\0\377\20\30\0\377\0\0\0\377\0\0\0\377\0\0\0\350\0\0\0\254\0\0\0\365\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\373\0\0\0\260\0\0\0" + "A\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\14\0\0\0" + "\207\0\0\0\371\0\0\0\377\0\0\0\377\0\0\0\341\0\0\0""2\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0\340\0\0\0\377\0\0\0\377\0\0\0\264\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""5\0\0\0\373\0\0\0\377" + "\0\0\0\371\0\0\0""3\0\0\0\0\0\0\0\0\0\0\0&\0\0\0\330\0\0\0\377\0\0\0\377" + "\0\0\0\377+\34\1\377\235f\3\377\277|\4\377\300~\4\377\315\230\3\377\333\266" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377sb\1\377\202o\1\377\241\211\1\377~I\17\377\273\4B\377\360\0V\377\224" + "A\33\377\345\316\0\377\350\321\0\377\350\321\0\377\350\321\0\377\345\316" + "\0\377\235\215\0\377\341\303\1\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\341" + "\270\12\377\353\2217\377\365if\377\375J\213\377\377B\225\377\377B\225\377" + "\377B\225\377\377B\225\377\377B\225\377\376D\222\377\330\225\27\377\303\204" + "\4\377\277|\4\377\277|\4\377\256q\4\377-\35\1\377\0\0\0\377\0\0\0\377\0\0" + "\0\372\0\0\0\356\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\372\0\0\0" + "\350\0\0\0\267\0\0\0e\0\0\0\15\0\0\0\0\0\0\0\25\0\0\0k\0\0\0\307\0\0\0\374" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\301\0\0\0?\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0:\0\0\0\344\0\0\0" + "\377\0\0\0\377\0\0\0\357\0\0\0;\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0a\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0""3\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\266\0\0\0\377\0\0\0\377\0\0\0\224\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\23\0\0\0\301\0\0\0\377\0\0\0\377\0\0\0\377\5\3\0\377U" + "7\2\377\262s\4\377\277|\4\377\300~\4\377\312\223\3\377\327\255\2\377\337" + "\275\2\377\337\276\2\377\337\276\2\377\333\272\2\377y\16&\377\326\0M\377" + "\372\0Z\377\377\0\\\377\377\0\\\377\350\0T\377~M\16\377\324\265\2\377\340" + "\301\2\377\336\300\1\377|l\0\377\307\253\1\377\340\300\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\340\272\6" + "\377\345\245\37\377\353\216;\377\360|O\377\354f[\377\345ZZ\377\333cB\377" + "\301{\7\377\277|\4\377\277|\4\377\220]\3\377\30\17\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\376\0\0\0m\0\0\0\12\0\0\0-\0\0\0""3\0\0\0""3\0\0\0&\0\0\0\25\0" + "\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0%\0\0" + "\0y\0\0\0\321\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0\247" + "\0\0\0\31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!\0\0\0\341" + "\0\0\0\377\0\0\0\377\0\0\0\354\0\0\0&\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\10\0\0\0\345\0\0\0\377\0\0\0\377\0\0\0\215\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0(\0\0\0\376\0\0\0\377\0\0\0\372\0\0\0\34\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\260\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0" + "\0\377\15\11\0\377a?\2\377\262s\4\377\277|\4\377\277|\4\377\302\203\4\377" + "\315\230\3\377\326\254\2\377\336\273\2\377k-\24\377\377\0\\\377\377\0\\\377" + "\377\0\\\377\377\0\\\377\377\0\\\377\365\0X\377\250\13""8\377\2170\40\377" + "V;\6\377\302\245\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377" + "\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\335\271\2\377\325" + "\252\3\377\314\230\3\377\303\204\4\377\277|\4\377\277|\4\377\277|\4\377\277" + "|\4\377\252n\4\377J0\1\377\1\1\0\377\0\0\0\377\0\0\0\377\0\0\0\370\0\0\0" + "d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0.\0\0\0\221\0\0\0\361\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\353\0\0\0" + "P\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0.\0\0\0\363\0\0\0" + "\377\0\0\0\377\0\0\0\315\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\213" + "\0\0\0\377\0\0\0\377\0\0\0\313\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\200" + "\0\0\0\377\0\0\0\377\0\0\0\260\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\1\0\0\0\354\0\0\0\377\0\0\0\377\0\0\0\300\0\0\0\376\0\0\0\377\0\0\0" + "\377\0\0\0\377\14\10\0\377U7\2\377\244j\3\377\277|\4\377\277|\4\377\277|" + "\4\377\300\177\4\377[9\4\377\357\0V\377\377\0\\\377\366\0Z\377\351\0X\377" + "\344\0X\377\347\0X\377\361\0Z\377\341\0Q\377\203i\4\377\337\276\2\377\337" + "\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276" + "\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2\377\337\276\2" + "\377\337\276\2\377\336\275\2\377\334\270\2\377\327\256\2\377\321\242\3\377" + "\313\225\3\377\305\210\4\377\300~\4\377\277|\4\377\277|\4\377\277|\4\377" + "\277|\4\377\277|\4\377\245k\3\377R5\2\377\11\6\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\343\0\0\0@\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\0\246\0\0" + "\0\376\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0\177\0\0\0\2\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0s\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0q\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""7\0\0\0\377\0\0\0\377\0\0\0\361\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\307\0\0\0\377\0\0\0\377\0\0\0Z\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\0\376\0\0\0\377\0\0\0\340\0\0\0" + "\3\0\0\0E\0\0\0\312\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\3\2\0\3774\"" + "\1\377yN\2\377\263t\4\377\277|\4\377{P\2\377\267\0C\377\334\0V\377\316\0" + "T\377\316\0T\377\316\0T\377\316\0T\377\316\0T\377h\5'\377\273\216\3\377\322" + "\243\3\377\324\247\3\377\324\250\3\377\325\252\3\377\325\252\3\377\324\250" + "\3\377\324\247\3\377\322\244\3\377\320\240\3\377\316\233\3\377\314\226\3" + "\377\310\217\3\377\305\210\4\377\301\201\4\377\277|\4\377\277|\4\377\277" + "|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\265v\4\377" + "{P\2\3775\"\1\377\3\2\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0" + "\242\0\0\0\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\\\0\0" + "\0\365\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\223\0\0\0\2\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\7\0\0\0\335\0\0\0\377\0\0\0\377\0\0\0\345\0\0\0\7\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\347\0\0\0\377\0\0\0\377\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\12\0\0\0\362\0\0\0\377\0\0\0\370\0\0\0\25\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""7\0\0\0\377\0\0\0\377\0\0\0\244\0\0\0" + "\0\0\0\0\0\0\0\0\1\0\0\0J\0\0\0\301\0\0\0\376\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\5\3\0\3774\"\1\377Y:\2\377c\0(\377\316\0T\377\316\0T\377\316\0" + "T\377\316\0T\377\316\0T\377\271\0K\377e;\6\377\277|\4\377\277|\4\377\277" + "|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377" + "\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4" + "\377\277|\4\377\277|\4\377\277|\4\377\274z\4\377\241h\3\377pH\2\3778$\1\377" + "\6\4\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0\276\0" + "\0\0:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0""9\0\0\0\356\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\206\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0p\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "J\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\301\0\0\0\377\0\0\0\355\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\40\0\0\0\377\0\0\0\377\0\0\0\313\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0\0\0\377\0\0\0\377\0\0\0k\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0""6\0\0\0\241\0\0\0\365\0\0\0\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\35\0\14\377\313\0S\377\316\0T\377\316" + "\0T\377\316\0T\377\315\0T\377Z\12\36\377\236g\3\377\264u\4\377\271x\4\377" + "\274z\4\377\275{\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4\377\277|\4" + "\377\277|\4\377\277|\4\377\276{\4\377\273z\4\377\267w\4\377\250m\4\377\222" + "_\3\377xN\2\377Y:\2\3777$\1\377\22\13\0\377\1\1\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\367\0\0\0\247\0\0\0;\0\0\0\1\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0D\0\0\0\371\0\0\0\377\0\0\0\377\0\0\0\376\0\0\0R\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\0\0\0\370\0\0\0\377\0\0\0\377\0\0\0\213\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\303\0\0\0\377\0\0\0\233\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0""9\0\0\0\377\0\0\0\377\0\0\0\217\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0G\0\0\0\377\0\0\0\377\0\0\0""8\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\0\0\0e\0\0\0\272" + "\0\0\0\371\0\0\0\377\0\0\0\377\0\0\0\377y\0""1\377\316\0T\377\316\0T\377" + "\316\0T\377{\0""2\377\1\0\0\377\0\0\0\377\0\0\0\377\11\6\0\377\17\12\0\377" + "\24\15\0\377\31\20\1\377\40\25\1\377\"\26\1\377\"\26\1\377\"\26\1\377\"\26" + "\1\377\36\23\1\377\27\17\0\377\16\11\0\377\3\2\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" + "\0\0\374\0\0\0\277\0\0\0k\0\0\0\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0~\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\347\0\0\0\23\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\267\0\0\0\377\0\0\0\377\0\0\0\265\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'\0\0\0W\0\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0A\0\0\0\377\0\0\0\377\0\0\0X\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0-\0\0\0\377\0\0\0\377\0\0\0""2\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0R\0" + "\0\0\224\0\0\0\316\4\0\2\366X\0$\377\207\0""7\377N\0\40\377\2\0\1\377\0\0" + "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0" + "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\374\0" + "\0\0\335\0\0\0\243\0\0\0^\0\0\0\27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\331\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\207\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0g\0\0\0\377\0\0" + "\0\377\0\0\0\310\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""6\0\0\0\377\0\0\0\377\0\0\0:\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0\342\0\0\0\377\0\0\0""2" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\0\0\0""1\0\0\0\\\0\0\0" + "\177\0\0\0\236\0\0\0\270\0\0\0\317\0\0\0\342\0\0\0\361\0\0\0\370\0\0\0\371" + "\0\0\0\373\0\0\0\375\0\0\0\375\0\0\0\377\0\0\0\377\0\0\0\375\0\0\0\375\0" + "\0\0\372\0\0\0\370\0\0\0\353\0\0\0\325\0\0\0\271\0\0\0\231\0\0\0s\0\0\0H" + "\0\0\0\33\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]\0\0\0\377\0\0\0\377" + "\0\0\0\377\0\0\0\354\0\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0*\0\0\0\377\0" + "\0\0\377\0\0\0\303\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\0\0\0\370\0\0\0\377\0\0\0?\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""0\0\0\0i\0\0\0\3\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\6\0\0\0\16\0\0\0\24\0\0\0\33" + "\0\0\0\36\0\0\0$\0\0\0$\0\0\0\36\0\0\0\32\0\0\0\21\0\0\0\6\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\10\0\0\0\345\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0N\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0""0\0\0\0\377\0\0\0\377\0\0\0\221\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\222\0\0\0\350\0\0\0\36\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\214\0\0\0\377" + "\0\0\0\377\0\0\0\377\0\0\0\214\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\0\0\0\305" + "\0\0\0\300\0\0\0\33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\6\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0""5\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\265\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0\342\0\0\0\377\0\0\0\377" + "\0\0\0\317\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\235\0\0\0\377\0\0\0\377\0\0\0\320\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\215\0\0\0\377\0\0\0\377\0\0\0\261\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\225\0\0\0\377\0\0\0\376" + "\0\0\0[\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"\0" + "\0\0\213\0\0\0`\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", +}; + diff --git a/Mednafen/mednafen/drivers/input-config.cpp b/Mednafen/mednafen/drivers/input-config.cpp new file mode 100644 index 0000000000..42902fb23c --- /dev/null +++ b/Mednafen/mednafen/drivers/input-config.cpp @@ -0,0 +1,268 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include + +#include "input.h" +#include "input-config.h" +#include "video.h" +#include "Joystick.h" + +extern JoystickManager *joy_manager; + +int32 DTestMouseAxis(ButtConfig &bc, const char* KeyState, const uint32* MouseData, const bool axis_hint) // UNDOCUMENTED INCOMPLETE FUN +{ + if(bc.ButtType == BUTTC_JOYSTICK) // HAXY + { + int32 ret = 0; + ButtConfig tmp_bc = bc; + + tmp_bc.ButtonNum ^= 0x4000; + + ret = joy_manager->TestAnalogButton(bc); + ret -= joy_manager->TestAnalogButton(tmp_bc); + ret += 32768; + + ret = Video_PtoV_J(ret, axis_hint, (bool)(tmp_bc.ButtonNum & (1 << 18))); + + return(ret); + } + else if(bc.ButtType == BUTTC_MOUSE) + { + if(bc.DeviceNum == 0) + { + if(bc.ButtonNum & 0x8000) + return(MouseData[bc.ButtonNum & 1]); + else + return(0); + } + else + return(0); + } + else // UNSUPPORTED + return(0); +} + +static bool DTestButtonMouse(const ButtConfig &bc, const uint32 *MouseData) +{ + if(bc.ButtonNum & 0x8000) + { + if(bc.ButtonNum&1) // Y + { + if(bc.ButtonNum & 0x4000) + { + if(MouseData[1] < 128) + return(true); + } + else + { + if(MouseData[1] >= 128) + return(true); + } + } + else // X + { + if(bc.ButtonNum & 0x4000) + { + if(MouseData[0] < 128) + return(true); + } + else + { + if(MouseData[0] >= 128) + return(true); + } + } + } + else + { + if(MouseData[2] & (1U << bc.ButtonNum)) + return(true); + } + return(false); +} + +int DTestButton(std::vector &bc, const char *KeyState, const uint32 *MouseData, bool analog) +{ + const int maxv = analog ? 32767 : 1; + int32 ret = 0; // Will obviously break if 10s of thousands of physical buttons are assigned to one emulated analog button. ;) + + for(unsigned int x = 0; x < bc.size(); x++) + { + if(bc[x].ButtType == BUTTC_KEYBOARD) + { + if(KeyState[bc[x].ButtonNum]) + ret += maxv; + } + else if(bc[x].ButtType == BUTTC_JOYSTICK) + { + if(analog) + ret += joy_manager->TestAnalogButton(bc[x]); + else if(joy_manager->TestButton(bc[x])) + ret += maxv; + } + else if(bc[x].ButtType == BUTTC_MOUSE) + { + if(DTestButtonMouse(bc[x], MouseData)) + ret += maxv; + } + } + + if(ret > maxv) + ret = maxv; + + return(ret); +} + +int DTestButton(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool analog) +{ + std::vector neobc; + neobc.push_back(bc); + + return(DTestButton(neobc, KeyState, MouseData, analog)); +} + + +#define ICSS_ALT 1 +#define ICSS_SHIFT 2 +#define ICSS_CTRL 4 + +/* Used for command keys */ +int DTestButtonCombo(std::vector &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode) +{ + unsigned int x; + unsigned int ss = 0; + unsigned match_count = 0; + + if(KeyState[MKK(LALT)] || KeyState[MKK(RALT)]) ss |= ICSS_ALT; + if(KeyState[MKK(LSHIFT)] || KeyState[MKK(RSHIFT)]) ss |= ICSS_SHIFT; + if(KeyState[MKK(LCTRL)] || KeyState[MKK(RCTRL)]) ss |= ICSS_CTRL; + + for(x = 0; x < bc.size(); x++) + { + if(bc[x].ButtType == BUTTC_KEYBOARD) + { + uint32 b = bc[x].ButtonNum; + + if(KeyState[b & 0xFFFF] && ((b >> 24) == ss)) + match_count++; + } + else if(bc[x].ButtType == BUTTC_JOYSTICK) + { + if(joy_manager->TestButton(bc[x])) + match_count++; + } + else if(bc[x].ButtType == BUTTC_MOUSE) + { + if(DTestButtonMouse(bc[x], MouseData)) + match_count++; + } + } + + if(match_count > 0) + { + if(!AND_Mode || match_count == bc.size()) + return(1); + } + + return(0); +} + +int DTestButtonCombo(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode) +{ + std::vector neobc; + neobc.push_back(bc); + + return(DTestButtonCombo(neobc, KeyState, MouseData, AND_Mode)); +} + + +static ButtConfig efbc; +static int volatile efbcdone; +static int volatile efck; + +static int LastMouseX; +static int LastMouseY; + +static int EventFilter(const SDL_Event *event) +{ + if(efbcdone) + return(1); + + switch(event->type) + { + case SDL_KEYDOWN: if(!efck || (event->key.keysym.sym != MKK(LALT) && event->key.keysym.sym != MKK(RALT) && + event->key.keysym.sym != MKK(LSHIFT) && event->key.keysym.sym != MKK(RSHIFT) && + event->key.keysym.sym != MKK(LCTRL) && event->key.keysym.sym != MKK(RCTRL))) + { + efbc.ButtType = BUTTC_KEYBOARD; + efbc.DeviceNum = 0; + efbc.ButtonNum = event->key.keysym.sym; + + if(0 == event->key.keysym.sym) + printf("*** NULL KEYSYM! ***\n"); + + //printf("%u\n", event->key.keysym.sym); + + if(efck) + efbc.ButtonNum |= ((event->key.keysym.mod & KMOD_ALT) ? (ICSS_ALT<<24):0) | ((event->key.keysym.mod & KMOD_SHIFT) ? (ICSS_SHIFT<<24):0) | ((event->key.keysym.mod & KMOD_CTRL) ? (ICSS_CTRL<<24):0); + efbcdone = 1; + return(1); + } + break; + + case SDL_MOUSEBUTTONDOWN: efbc.ButtType = BUTTC_MOUSE; + efbc.DeviceNum = 0; + efbc.ButtonNum = event->button.button - SDL_BUTTON_LEFT; + efbcdone = 1; + return(1); + + } + + return(1); +} + + +int DTryButtonBegin(ButtConfig *bc, int commandkey) +{ + memcpy(&efbc, bc, sizeof(ButtConfig)); + efck = commandkey; + efbcdone = 0; + + //SDL_MDFN_ShowCursor(1); + SDL_GetMouseState(&LastMouseX, &LastMouseY); + + MainSetEventHook(EventFilter); + //SDL_SetEventFilter(EventFilter); + return(1); +} + +int DTryButton(void) +{ + return(efbcdone); +} + +int DTryButtonEnd(ButtConfig *bc) +{ + MainSetEventHook(EventFilter); + memcpy(bc, &efbc, sizeof(ButtConfig)); + + return(1); +} + diff --git a/Mednafen/mednafen/drivers/input-config.h b/Mednafen/mednafen/drivers/input-config.h new file mode 100644 index 0000000000..e2aac4e28c --- /dev/null +++ b/Mednafen/mednafen/drivers/input-config.h @@ -0,0 +1,16 @@ +#ifndef __MDFN_DRIVERS_INPUT_CONFIG_H +#define __MDFN_DRIVERS_INPUT_CONFIG_H + +int DTestButton(std::vector &bc, const char *KeyState, const uint32* MouseData, bool analog = false); +int DTestButton(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool analog = false); + +int DTestButtonCombo(std::vector &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode = false); +int DTestButtonCombo(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode = false); + +int32 DTestMouseAxis(ButtConfig &bc, const char* KeyState, const uint32* MouseData, const bool axis_hint); + +int DTryButtonBegin(ButtConfig *bc, int commandkey); +int DTryButton(void); +int DTryButtonEnd(ButtConfig *bc); + +#endif diff --git a/Mednafen/mednafen/drivers/input-default-buttons.h b/Mednafen/mednafen/drivers/input-default-buttons.h new file mode 100644 index 0000000000..32cb7b81c0 --- /dev/null +++ b/Mednafen/mednafen/drivers/input-default-buttons.h @@ -0,0 +1,652 @@ +// This file should only be included *ONCE* from drivers/input.cpp!!! + + +#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +static const ButtConfig NESGamePadConfig[4][8]={ + /* Gamepad 1 */ + { + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(w),MK(s), + MK(a), MK(d) + }, + + /* Gamepad 2 */ + GPZ(), + + /* Gamepad 3 */ + GPZ(), + + /* Gamepad 4 */ + GPZ() +}; +#undef GPZ + +static const ButtConfig GBPadConfig[8] = +{ + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(d),MK(a), + MK(w), MK(s) +}; + +static const ButtConfig GBAPadConfig[10] = +{ + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(d),MK(a), + MK(w), MK(s), MK(KP6), MK(KP5) +}; + +#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +static const ButtConfig PCFXPadConfig[2][15]= +{ + /* Gamepad 1 */ + { + MK(KP3), MK(KP2), MK(KP1), MK(KP4), MK(KP5), MK(KP6), MK(TAB), MK(RETURN), + MK(w), MK(d), MK(s), MK(a), + MK(KP8), MK(KP9), + }, + + /* Gamepad 2 */ + GPZ(), +}; +#undef GPZ + +#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +static const ButtConfig PCEPadConfig[5][13]={ + /* Gamepad 1 */ + { + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(w), MK(d), MK(s), MK(a), + + // Extra 4 buttons on 6-button pad + MK(KP1), MK(KP4), MK(KP5), MK(KP6), + + // ..and special 2/6 mode select + MK(m), + }, + + /* Gamepad 2 */ + GPZ(), + + /* Gamepad 3 */ + GPZ(), + + /* Gamepad 4 */ + GPZ(), + + /* Gamepad 5 */ + GPZ() +}; +#undef GPZ + +static const ButtConfig LynxPadConfig[9] = +{ + // A, B, Option 2, Option 1, Left, Right, Up, Down, Pause + MK(KP3), MK(KP2), MK(KP1), MK(KP7), MK(a),MK(d), + MK(w), MK(s), MK(RETURN) +}; + +static const ButtConfig NGPPadConfig[7 + 2] = +{ + // Up, down, left, right, a(inner), b(outer), option + MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(RETURN), MK(KP5), MK(KP6) +}; + +static const ButtConfig WSwanPadConfig[12] = +{ + // Up, right, down, left, + // up-y, right-y, down-y, left-y, + // start, a(outer), b(inner), option + MK(w), MK(d), MK(s), MK(a), + MK(UP), MK(RIGHT), MK(DOWN), MK(LEFT), + MK(RETURN), MK(KP3), MK(KP2), MK(RETURN) +}; + + +static const ButtConfig PowerPadConfig[12] = +{ + MK(o),MK(p),MK(LEFTBRACKET),MK(RIGHTBRACKET), + MK(k),MK(l),MK(SEMICOLON),MK(QUOTE), + MK(m),MK(COMMA),MK(PERIOD),MK(SLASH) +}; + +static const ButtConfig fkbmap[0x48]= +{ + MK(F1),MK(F2),MK(F3),MK(F4),MK(F5),MK(F6),MK(F7),MK(F8), + MK(1),MK(2),MK(3),MK(4),MK(5),MK(6),MK(7),MK(8),MK(9),MK(0),MK(MINUS),MK(EQUALS),MK(BACKSLASH),MK(BACKSPACE), + MK(ESCAPE),MK(q),MK(w),MK(e),MK(r),MK(t),MK(y),MK(u),MK(i),MK(o),MK(p),MK(BACKQUOTE),MK(LEFTBRACKET),MK(RETURN), + MK(LCTRL),MK(a),MK(s),MK(d),MK(f),MK(g),MK(h),MK(j),MK(k),MK(l),MK(SEMICOLON),MK(QUOTE),MK(RIGHTBRACKET),MK(INSERT), + MK(LSHIFT),MK(z),MK(x),MK(c),MK(v),MK(b),MK(n),MK(m),MK(COMMA),MK(PERIOD),MK(SLASH),MK(RALT),MK(RSHIFT),MK(LALT),MK(SPACE), + MK(DELETE),MK(END),MK(PAGEDOWN),MK(UP),MK(LEFT),MK(RIGHT),MK(DOWN) +}; + +static const ButtConfig HyperShotButtons[4]= +{ + MK(q),MK(w),MK(e),MK(r) +}; + +static const ButtConfig MahjongButtons[21]= +{ + MK(q),MK(w),MK(e),MK(r),MK(t), + MK(a),MK(s),MK(d),MK(f),MK(g),MK(h),MK(j),MK(k),MK(l), + MK(z),MK(x),MK(c),MK(v),MK(b),MK(n),MK(m) +}; + +static const ButtConfig PartyTapButtons[6]= +{ + MK(q),MK(w),MK(e),MK(r),MK(t),MK(y) +}; + +static const ButtConfig FTrainerButtons[12]= +{ + MK(o),MK(p),MK(LEFTBRACKET), + MK(RIGHTBRACKET),MK(k),MK(l),MK(SEMICOLON), + MK(QUOTE), + MK(m),MK(COMMA),MK(PERIOD),MK(SLASH) +}; + +static ButtConfig OekaKidsConfig[3] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + { BUTTC_MOUSE, 0, 0x8001, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, +}; + +static ButtConfig ArkanoidConfig[2] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, +}; + +static ButtConfig ShadowConfig[4] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + { BUTTC_MOUSE, 0, 0x8001, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + + +static ButtConfig NESZapperConfig[4] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + { BUTTC_MOUSE, 0, 0x8001, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + +static ButtConfig PCEMouseConfig[4] = +{ + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 0, 0 }, + MK(TAB), + MK(RETURN) +}; + +static ButtConfig PCFXMouseConfig[2] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + +static const ButtConfig SMSPadConfig[2][12]= +{ + /* Gamepad 1 */ + { + MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(RETURN) + }, + + /* Gamepad 2 */ + {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +}; + +static const ButtConfig GGPadConfig[12]= +{ + MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(RETURN) +}; + +static const ButtConfig TsushinKBConfig[0x80]= +{ + // 0 + MK(KP0), + MK(KP1), + MK(KP2), + MK(KP3), + MK(KP4), + MK(KP5), + MK(KP6), + +// 1 + MK(KP8), + MK(KP9), + MK(KP_MULTIPLY), // Keypad Multiply + MK(KP_PLUS), // Keypad Plus + MK(KP_EQUALS), // Keypad Equals + MK(UNKNOWN), // KP_COMMA // Keypad Comma + MK(KP_PERIOD), // Keypad Period + +// 2 + MK(BACKQUOTE), // @ + MK(a), + MK(b), + MK(c), + MK(d), + MK(e), + MK(f), + +// 3 + MK(h), + MK(i), + MK(j), + MK(k), + MK(l), + MK(m), + MK(n), + +// 4 + MK(p), + MK(q), + MK(r), + MK(s), + MK(t), + MK(u), + MK(v), + +// 5 + MK(x), + MK(y), + MK(z), + MK(LEFTBRACKET), // Left bracket + MK(PLUS), // Yen + MK(RIGHTBRACKET), // Right bracket + MK(EQUALS), // Caret + +// 6 + MK(0), + MK(1), + MK(2), + MK(3), + MK(4), + MK(5), + MK(6), + +// 7 + MK(8), + MK(9), + MK(QUOTE), // Colon + MK(SEMICOLON), // Semicolon + MK(COMMA), // Comma + MK(PERIOD), // Period + MK(SLASH), // Slash + +// 8 + MK(HOME), // HOME CLEAR + MK(UP), + MK(RIGHT), + //MK(UNKNOWN), + MK(UNKNOWN), // GRPH + MK(LSUPER), // カナ + //MK(UNKNOWN), + +// 9 + MK(BREAK), // STOP + MK(F1), + MK(F2), + MK(F3), + MK(F4), + MK(F5), + MK(SPACE), + + // A + MK(TAB), + MK(DOWN), + MK(LEFT), + MK(END), // HELP + MK(PRINT), // COPY + MK(KP_MINUS), + MK(KP_DIVIDE), + +// B + MK(PAGEDOWN), // ROLL DOWN + MK(PAGEUP), // ROLL UP + //MK(UNKNOWN), + //MK(UNKNOWN), + MK(o), + MK(UNKNOWN), // TODO: Underscore + MK(g), + +// C + MK(F6), + MK(F7), + MK(F8), + MK(F9), + MK(F10), + MK(BACKSPACE), + MK(INSERT), + +// D + MK(RALT), // 変換 + MK(LALT), // 決定 + MK(RSUPER), // PC + MK(RCTRL), // 変換 + MK(LCTRL), // CTRL + MK(KP7), + MK(w), + +// E + MK(RETURN), + MK(KP_ENTER), + MK(LSHIFT), + MK(RSHIFT), + MK(CAPSLOCK), + MK(DELETE), + MK(ESCAPE), + +// F + //MK(UNKNOWN), + //MK(UNKNOWN), + //MK(UNKNOWN), + //MK(UNKNOWN), + //MK(UNKNOWN), + MK(MINUS), // Minus + MK(7), // 7 +}; + + +static const ButtConfig MMPlayInputConfig[] = +{ + MK(p), + MK(LEFT), + MK(RIGHT), + MK(DOWN), + MK(UP), +}; + +static const ButtConfig CDPlayInputConfig[] = +{ + MK(SPACE), + MK(RETURN), + MK(RIGHT), + MK(LEFT), + MK(UP), + MK(DOWN), + MK(PAGEUP), + MK(PAGEDOWN), +}; + + +static const ButtConfig MDPad3Config[2][8] = +{ + { MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(KP1), MK(RETURN) }, + { MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ() }, +}; + +static const ButtConfig MDPad6Config[2][12] = +{ + { MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(KP1), MK(RETURN), MK(KP6), MK(KP5), MK(KP4), MK(m) }, + { MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ() }, +}; + +static ButtConfig MDMegaMouseConfig[4] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 1, 0 }, + MK(RETURN), +}; + + +static const ButtConfig SNESPadConfig[12] = +{ + MK(KP2), + MK(KP4), + MK(TAB), + MK(RETURN), + MK(w), + MK(s), + MK(a), + MK(d), + MK(KP6), + MK(KP8), + MK(KP7), + MK(KP9), +}; + + +static ButtConfig SNESMouseConfig[2] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + +static ButtConfig SNESSuperScopeConfig[7] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + { BUTTC_MOUSE, 0, 0x8001, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, // Trigger + MK(SPACE), // Away trigger + { BUTTC_MOUSE, 0, 1, 0 }, // Pause + MK(END), // Turbo + { BUTTC_MOUSE, 0, 2, 0 }, // Cursor +}; + +static const ButtConfig PSXPadConfig[14] = +{ + MK(TAB), + MK(RETURN), + MK(w), + MK(d), + MK(s), + MK(a), + + MK(KP7), + MK(KP9), + MK(KP1), + MK(KP3), + + MK(KP8), + MK(KP6), + MK(KP2), + MK(KP4), +}; + +static const ButtConfig PSXDancePadConfig[10] = +{ + MK(KP_DIVIDE), + MK(KP_MULTIPLY), + MK(KP8), + MK(KP6), + MK(KP2), + MK(KP4), + + MK(KP1), + MK(KP9), + MK(KP7), + MK(KP3), +}; + +static ButtConfig PSXMouseConfig[2] = +{ + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 0, 0 }, +}; + +static ButtConfig PSXGunConConfig[6] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + { BUTTC_MOUSE, 0, 0x8001, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 1, 0 }, + MK(SPACE) +}; + +static ButtConfig PSXJustifierConfig[6] = +{ + { BUTTC_MOUSE, 0, 0x8000, 0 }, + { BUTTC_MOUSE, 0, 0x8001, 0 }, + + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 1, 0 }, + MK(SPACE) +}; + +#if 0 +static ButtConfig VBPadConfig[14] = +{ + + + MK(I), // RPad, Up + MK(L), // RPad, Right + + MK(F), // LPad, Right + MK(S), // LPad, Left + MK(D), // LPad, Down + MK(E), // LPad, Up +}; +#endif + +typedef struct +{ + const char *base_name; + const ButtConfig *bc; + int num; +} DefaultSettingsMeow; + +static DefaultSettingsMeow defset[] = +{ + { "nes.input.port1.gamepad", NESGamePadConfig[0], sizeof(NESGamePadConfig[0]) / sizeof(ButtConfig) }, + { "nes.input.port2.gamepad", NESGamePadConfig[1], sizeof(NESGamePadConfig[1]) / sizeof(ButtConfig) }, + { "nes.input.port3.gamepad", NESGamePadConfig[2], sizeof(NESGamePadConfig[2]) / sizeof(ButtConfig) }, + { "nes.input.port4.gamepad", NESGamePadConfig[3], sizeof(NESGamePadConfig[3]) / sizeof(ButtConfig) }, + + { "nes.input.port1.powerpada", PowerPadConfig, sizeof(PowerPadConfig) / sizeof(ButtConfig) }, + { "nes.input.port2.powerpada", PowerPadConfig, sizeof(PowerPadConfig) / sizeof(ButtConfig) }, + { "nes.input.port1.powerpadb", PowerPadConfig, sizeof(PowerPadConfig) / sizeof(ButtConfig) }, + { "nes.input.port2.powerpadb", PowerPadConfig, sizeof(PowerPadConfig) / sizeof(ButtConfig) }, + + { "nes.input.port1.zapper", NESZapperConfig, sizeof(NESZapperConfig) / sizeof(ButtConfig) }, + { "nes.input.port2.zapper", NESZapperConfig, sizeof(NESZapperConfig) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.fkb", fkbmap, sizeof(fkbmap) / sizeof(ButtConfig) }, + { "nes.input.fcexp.mahjong", MahjongButtons, sizeof(MahjongButtons) / sizeof(ButtConfig) }, + { "nes.input.fcexp.ftrainera", FTrainerButtons, sizeof(FTrainerButtons) / sizeof(ButtConfig) }, + { "nes.input.fcexp.ftrainerb", FTrainerButtons, sizeof(FTrainerButtons) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.hypershot", HyperShotButtons, sizeof(HyperShotButtons) / sizeof(ButtConfig) }, + { "nes.input.fcexp.partytap", PartyTapButtons, sizeof(PartyTapButtons) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.oekakids", OekaKidsConfig, sizeof(OekaKidsConfig) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.shadow", ShadowConfig, sizeof(ShadowConfig) / sizeof(ButtConfig) }, + + { "nes.input.port1.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.port2.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.port3.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.port4.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.fcexp.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "lynx.input.builtin.gamepad", LynxPadConfig, sizeof(LynxPadConfig) / sizeof(ButtConfig) }, + { "gb.input.builtin.gamepad", GBPadConfig, sizeof(GBPadConfig) / sizeof(ButtConfig) }, + { "gba.input.builtin.gamepad", GBAPadConfig, sizeof(GBAPadConfig) / sizeof(ButtConfig) }, + { "ngp.input.builtin.gamepad", NGPPadConfig, sizeof(NGPPadConfig) / sizeof(ButtConfig) }, + { "wswan.input.builtin.gamepad", WSwanPadConfig, sizeof(WSwanPadConfig) / sizeof(ButtConfig) }, + + { "pce.input.port1.gamepad", PCEPadConfig[0], sizeof(PCEPadConfig[0]) / sizeof(ButtConfig) }, + { "pce.input.port2.gamepad", PCEPadConfig[1], sizeof(PCEPadConfig[1]) / sizeof(ButtConfig) }, + { "pce.input.port3.gamepad", PCEPadConfig[2], sizeof(PCEPadConfig[2]) / sizeof(ButtConfig) }, + { "pce.input.port4.gamepad", PCEPadConfig[3], sizeof(PCEPadConfig[3]) / sizeof(ButtConfig) }, + { "pce.input.port5.gamepad", PCEPadConfig[4], sizeof(PCEPadConfig[4]) / sizeof(ButtConfig) }, + + { "pce.input.port1.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port2.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port3.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port4.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port5.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + + { "pce.input.port1.tsushinkb", TsushinKBConfig, sizeof(TsushinKBConfig) / sizeof(ButtConfig) }, + + { "pcfx.input.port1.gamepad", PCFXPadConfig[0], sizeof(PCFXPadConfig[0]) / sizeof(ButtConfig) }, + { "pcfx.input.port2.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port3.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port4.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port5.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port6.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port7.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port8.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + + + { "pcfx.input.port1.mouse", PCFXMouseConfig, sizeof(PCFXMouseConfig) / sizeof(ButtConfig) }, + { "pcfx.input.port2.mouse", PCFXMouseConfig, sizeof(PCFXMouseConfig) / sizeof(ButtConfig) }, + + { "sms.input.port1.gamepad", SMSPadConfig[0], sizeof(SMSPadConfig[0]) / sizeof(ButtConfig) }, + { "sms.input.port1.gamepad", SMSPadConfig[0], sizeof(SMSPadConfig[0]) / sizeof(ButtConfig) }, + { "gg.input.builtin.gamepad", GGPadConfig, sizeof(GGPadConfig) / sizeof(ButtConfig) }, + + + { "md.input.port1.gamepad", MDPad3Config[0], sizeof(MDPad3Config[0]) / sizeof(ButtConfig) }, + { "md.input.port2.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port3.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port4.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port5.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port6.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port7.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port8.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + + { "md.input.port1.gamepad6", MDPad6Config[0], sizeof(MDPad6Config[0]) / sizeof(ButtConfig) }, + { "md.input.port2.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + { "md.input.port3.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + { "md.input.port4.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + { "md.input.port5.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + { "md.input.port6.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + { "md.input.port7.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + { "md.input.port8.gamepad6", MDPad6Config[1], sizeof(MDPad6Config[1]) / sizeof(ButtConfig) }, + + { "md.input.port1.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port2.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port3.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port4.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port5.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port6.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port7.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + { "md.input.port8.megamouse", MDMegaMouseConfig, sizeof(MDMegaMouseConfig) / sizeof(ButtConfig) }, + + + { "snes.input.port1.gamepad", SNESPadConfig, sizeof(SNESPadConfig) / sizeof(ButtConfig) }, + { "snes.input.port1.mouse", SNESMouseConfig, sizeof(SNESMouseConfig) / sizeof(ButtConfig) }, + { "snes.input.port2.mouse", SNESMouseConfig, sizeof(SNESMouseConfig) / sizeof(ButtConfig) }, + { "snes.input.port2.superscope", SNESSuperScopeConfig, sizeof(SNESSuperScopeConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.gamepad", PSXPadConfig, sizeof(PSXPadConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.dancepad", PSXDancePadConfig, sizeof(PSXDancePadConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port2.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port3.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port4.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port5.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port6.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port7.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port8.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port2.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port3.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port4.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port5.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port6.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port7.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port8.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.justifier", PSXJustifierConfig, sizeof(PSXJustifierConfig) / sizeof(ButtConfig) }, + { "psx.input.port2.justifier", PSXJustifierConfig, sizeof(PSXJustifierConfig) / sizeof(ButtConfig) }, + + //{ "vb.input.builtin.gamepad", VBPadConfig, sizeof(VBPadConfig) / sizeof(VBPadConfig) }, + + { "mmplay.input.builtin.controller", MMPlayInputConfig, sizeof(MMPlayInputConfig) / sizeof(ButtConfig) }, + { "cdplay.input.builtin.controller", CDPlayInputConfig, sizeof(CDPlayInputConfig) / sizeof(ButtConfig) }, + +}; + diff --git a/Mednafen/mednafen/drivers/input.cpp b/Mednafen/mednafen/drivers/input.cpp new file mode 100644 index 0000000000..33fedc6f7c --- /dev/null +++ b/Mednafen/mednafen/drivers/input.cpp @@ -0,0 +1,1925 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include +#include +#include +#include + +#include "input.h" +#include "input-config.h" +#include "sound.h" +#include "video.h" +#include "Joystick.h" +#include "netplay.h" +#include "cheat.h" +#include "fps.h" +#include "debugger.h" +#include "help.h" +#include "rmdui.h" + +#include + +extern JoystickManager *joy_manager; + +bool RewindState = true; +bool DNeedRewind = false; + +static uint32 MouseData[3]; +static double MouseDataRel[2]; + +static unsigned int autofirefreq; +static unsigned int ckdelay; + +static bool fftoggle_setting; +static bool sftoggle_setting; + +int ConfigDevice(int arg); +static void ConfigDeviceBegin(void); + +static void subcon_begin(std::vector &bc); +static int subcon(const char *text, std::vector &bc, int commandkey); + +static void ResyncGameInputSettings(unsigned port); + +static char keys[MKK_COUNT]; +static char keys_untouched[MKK_COUNT]; + +static std::string BCToString(const ButtConfig &bc) +{ + std::string string = ""; + char tmp[256]; + + if(bc.ButtType == BUTTC_KEYBOARD) + { + trio_snprintf(tmp, 256, "keyboard %d", bc.ButtonNum & 0xFFFF); + + string = string + std::string(tmp); + + if(bc.ButtonNum & (4 << 24)) + string = string + "+ctrl"; + if(bc.ButtonNum & (1 << 24)) + string = string + "+alt"; + if(bc.ButtonNum & (2 << 24)) + string = string + "+shift"; + } + else if(bc.ButtType == BUTTC_JOYSTICK) + { + trio_snprintf(tmp, 256, "joystick %016llx %08x", (unsigned long long)bc.DeviceID, bc.ButtonNum); + + string = string + std::string(tmp); + } + else if(bc.ButtType == BUTTC_MOUSE) + { + trio_snprintf(tmp, 256, "mouse %016llx %08x", (unsigned long long)bc.DeviceID, bc.ButtonNum); + + string = string + std::string(tmp); + } + return(string); +} + +static std::string BCsToString(const ButtConfig *bc, unsigned int n) +{ + std::string ret = ""; + + for(unsigned int x = 0; x < n; x++) + { + if(bc[x].ButtType) + { + if(x) ret += "~"; + ret += BCToString(bc[x]); + } + } + + return(ret); +} + +static std::string BCsToString(const std::vector &bc, const bool AND_Mode = false) +{ + std::string ret = ""; + + if(AND_Mode) + ret += "/&&\\ "; + + for(unsigned int x = 0; x < bc.size(); x++) + { + if(x) ret += "~"; + ret += BCToString(bc[x]); + } + + return(ret); +} + + +static bool StringToBC(const char *string, std::vector &bc) +{ + bool AND_Mode = false; + char device_name[64]; + char extra[256]; + ButtConfig tmp_bc; + + while(*string && *string <= 0x20) string++; + + if(!strncmp(string, "/&&\\", 4)) + { + AND_Mode = true; + string += 4; + } + + while(*string && *string <= 0x20) string++; + + do + { + if(trio_sscanf(string, "%63s %255[^~]", device_name, extra) == 2) + { + if(!strcasecmp(device_name, "keyboard")) + { + uint32 bnum = atoi(extra); + + if(strstr(extra, "+shift")) + bnum |= 2 << 24; + if(strstr(extra, "+alt")) + bnum |= 1 << 24; + if(strstr(extra, "+ctrl")) + bnum |= 4 << 24; + + tmp_bc.ButtType = BUTTC_KEYBOARD; + tmp_bc.DeviceNum = 0; + tmp_bc.ButtonNum = bnum; + tmp_bc.DeviceID = 0; + + bc.push_back(tmp_bc); + } + else if(!strcasecmp(device_name, "joystick")) + { + tmp_bc.ButtType = BUTTC_JOYSTICK; + tmp_bc.DeviceNum = 0; + tmp_bc.ButtonNum = 0; + tmp_bc.DeviceID = 0; + + trio_sscanf(extra, "%016llx %08x", &tmp_bc.DeviceID, &tmp_bc.ButtonNum); + + tmp_bc.DeviceNum = joy_manager->GetIndexByUniqueID(tmp_bc.DeviceID); + bc.push_back(tmp_bc); + } + else if(!strcasecmp(device_name, "mouse")) + { + tmp_bc.ButtType = BUTTC_MOUSE; + tmp_bc.DeviceNum = 0; + tmp_bc.ButtonNum = 0; + tmp_bc.DeviceID = 0; + + if(trio_sscanf(extra, "%016llx %08x", &tmp_bc.DeviceID, &tmp_bc.ButtonNum) < 2) + trio_sscanf(extra, "%d", &tmp_bc.ButtonNum); + + bc.push_back(tmp_bc); + } + } + string = strchr(string, '~'); + if(string) string++; + } while(string); + + return(AND_Mode); +} + +static char *CleanSettingName(char *string) +{ + size_t x = 0; + + while(string[x]) + { + if(string[x] == ' ') + string[x] = '_'; + else if(string[x] >= 'A' && string[x] <= 'Z') + string[x] = 'a' + string[x] - 'A'; + x++; + } + return string; +} + +struct ButtonInfoCache +{ + char* SettingName = NULL; + char* CPName = NULL; + const InputDeviceInputInfoStruct* IDII = NULL; + + std::vector BC; + int BCPrettyPrio = 0; + + unsigned Flags = 0; + uint16 BitOffsets[4] = { 0, 0, 0, 0 }; // [rotated] + uint16 ExclusionBitOffset = 0xFFFF; + InputDeviceInputType Type = IDIT_BUTTON; + bool Rapid = false; + + uint8 SwitchNumPos = 0; + uint8 SwitchLastPos = 0; + uint8 SwitchBitSize = 0; + bool SwitchLastPress = false; +}; + +struct StatusInfoCache +{ + const InputDeviceInputInfoStruct* IDII = NULL; + uint32 BitOffset = 0; + + uint32 StatusNumStates = 0; + uint32 StatusLastState = 0; + uint32 StatusBitSize = 0; +}; + +struct RumbleInfoCache +{ + const InputDeviceInputInfoStruct* IDII = NULL; + uint32 BitOffset = 0; + uint32 AssocBICIndex = 0; +}; + +struct PortInfoCache +{ + unsigned int CurrentDeviceIndex = 0; // index into [SOMETHING HERE] + uint8 *Data = NULL; + const InputDeviceInfoStruct* Device = NULL; + + std::vector BIC; + std::vector SIC; + std::vector RIC; + + float AxisScale = 0; +}; + +static PortInfoCache PIDC[16]; + +static void KillPortInfo(unsigned int port) +{ + PIDC[port].Data = NULL; + PIDC[port].Device = NULL; + + for(unsigned int x = 0; x < PIDC[port].BIC.size(); x++) + { + free(PIDC[port].BIC[x].CPName); + free(PIDC[port].BIC[x].SettingName); + } + + PIDC[port].BIC.clear(); + PIDC[port].SIC.clear(); + PIDC[port].RIC.clear(); +} + +static void BuildPortInfo(MDFNGI *gi, const unsigned int port) +{ + const InputDeviceInfoStruct *zedevice = NULL; + char *port_device_name; + unsigned int device; + + PIDC[port].AxisScale = 1.0; + + if(gi->PortInfo[port].DeviceInfo.size() > 1) + { + if(CurGame->DesiredInput.size() > port && CurGame->DesiredInput[port]) + { + port_device_name = strdup(CurGame->DesiredInput[port]); + } + else + { + char tmp_setting_name[512]; + trio_snprintf(tmp_setting_name, 512, "%s.input.%s", gi->shortname, gi->PortInfo[port].ShortName); + port_device_name = strdup(MDFN_GetSettingS(tmp_setting_name).c_str()); + } + } + else + { + port_device_name = strdup(gi->PortInfo[port].DeviceInfo[0].ShortName); + } + + for(device = 0; device < gi->PortInfo[port].DeviceInfo.size(); device++) + { + if(!strcasecmp(gi->PortInfo[port].DeviceInfo[device].ShortName, port_device_name)) + { + zedevice = &gi->PortInfo[port].DeviceInfo[device]; + break; + } + } + free(port_device_name); port_device_name = NULL; + + PIDC[port].CurrentDeviceIndex = device; + + assert(zedevice); + + PIDC[port].Device = zedevice; + + // Figure out how much data should be allocated for each port + bool analog_axis_scale_grabbed = false; + + for(auto const& idii : zedevice->IDII) + { + // Handle dummy/padding button entries(the setting name will be NULL in such cases) + if(idii.SettingName == NULL) + continue; + + if(idii.Type == IDIT_BUTTON_ANALOG && (idii.Flags & IDIT_BUTTON_ANALOG_FLAG_SQLR) && !analog_axis_scale_grabbed) + { + char tmpsn[512]; + + trio_snprintf(tmpsn, sizeof(tmpsn), "%s.input.%s.%s.axis_scale", gi->shortname, gi->PortInfo[port].ShortName, zedevice->ShortName); + PIDC[port].AxisScale = MDFN_GetSettingF(tmpsn); + analog_axis_scale_grabbed = true; + } + + if(idii.Type == IDIT_BUTTON || idii.Type == IDIT_BUTTON_CAN_RAPID + || idii.Type == IDIT_BUTTON_ANALOG || idii.Type == IDIT_X_AXIS || idii.Type == IDIT_Y_AXIS + || idii.Type == IDIT_SWITCH) + { + for(unsigned r = 0; r < ((idii.Type == IDIT_BUTTON_CAN_RAPID) ? 2 : 1); r++) + { + ButtonInfoCache bic; + + bic.IDII = &idii; + bic.SettingName = trio_aprintf("%s.input.%s.%s.%s%s", gi->shortname, gi->PortInfo[port].ShortName, zedevice->ShortName, (r ? "rapid_" : ""), idii.SettingName); + CleanSettingName(bic.SettingName); + StringToBC(MDFN_GetSettingS(bic.SettingName).c_str(), bic.BC); + + for(unsigned o = 0; o < 4; o++) + { + bic.BitOffsets[o] = idii.BitOffset; + } + + if(idii.Type == IDIT_SWITCH) + { + bic.SwitchNumPos = idii.SwitchNumPos; + bic.SwitchLastPos = 0; + bic.SwitchBitSize = idii.BitSize; + bic.SwitchLastPress = false; + } + else + { + bic.Rapid = r; + } + + bic.Type = ((idii.Type == IDIT_BUTTON_CAN_RAPID) ? IDIT_BUTTON : idii.Type); + bic.Flags = idii.Flags; + + bic.CPName = trio_aprintf(_("%s%s%s"), (r ? _("Rapid ") : ""), idii.Name, (bic.Type == IDIT_SWITCH) ? _(" Select") : ""); + + bic.BCPrettyPrio = idii.ConfigOrder; + PIDC[port].BIC.push_back(bic); + } + } + else if(idii.Type == IDIT_STATUS) + { + StatusInfoCache sic; + + sic.IDII = &idii; + sic.StatusLastState = 0; + + sic.StatusNumStates = idii.StatusNumStates; + sic.StatusBitSize = idii.BitSize; + sic.BitOffset = idii.BitOffset; + + PIDC[port].SIC.push_back(sic); + } + else if(idii.Type == IDIT_RUMBLE) + { + RumbleInfoCache ric; + ric.IDII = &idii; + ric.BitOffset = idii.BitOffset; + ric.AssocBICIndex = PIDC[port].BIC.size() - 1; + PIDC[port].RIC.push_back(ric); + } + } + + for(unsigned int x = 0; x < PIDC[port].BIC.size(); x++) + { + int this_prio = PIDC[port].BIC[x].BCPrettyPrio; + + if(this_prio >= 0) + { + bool FooFound = FALSE; + + // First, see if any duplicate priorities come after this one! or something + for(unsigned int i = x + 1; i < PIDC[port].BIC.size(); i++) + { + if(PIDC[port].BIC[i].BCPrettyPrio == this_prio) + { + FooFound = TRUE; + break; + } + } + + // Now adjust all priorities >= this_prio except for 'x' by +1 + if(FooFound) + { + for(unsigned int i = 0; i < PIDC[port].BIC.size(); i++) + { + if(i != x && PIDC[port].BIC[i].BCPrettyPrio >= this_prio) + PIDC[port].BIC[i].BCPrettyPrio++; + } + } + + } + } + + // + // Now, search for exclusion buttons and rotated inputs. + // + for(auto& bic : PIDC[port].BIC) + { + if(bic.IDII->ExcludeName) + { + for(auto const& sub_bic : PIDC[port].BIC) + { + if(!strcasecmp(bic.IDII->ExcludeName, sub_bic.IDII->SettingName)) + { + bic.ExclusionBitOffset = sub_bic.BitOffsets[0]; + break; + } + } + } + + if(bic.IDII->RotateName[0]) + { + for(auto const& sub_bic : PIDC[port].BIC) + { + for(int rodir = 0; rodir < 3; rodir++) + { + if(!strcasecmp(bic.IDII->RotateName[rodir], sub_bic.IDII->SettingName)) + { + bic.BitOffsets[1 + rodir] = sub_bic.BitOffsets[0]; + // No break for you! + } + } + } + } + } + + PIDC[port].Data = MDFNI_SetInput(port, device); +} + +static void IncSelectedDevice(unsigned int port) +{ + if(MDFNDnetplay) + { + MDFN_DispMessage(_("Cannot change input device during netplay.")); + } + else if(RewindState) + { + MDFN_DispMessage(_("Cannot change input device while state rewinding is active.")); + } + else if(CurGame->PortInfo[port].DeviceInfo.size() > 1) + { + char tmp_setting_name[512]; + + if(CurGame->DesiredInput.size() > port) + CurGame->DesiredInput[port] = NULL; + + trio_snprintf(tmp_setting_name, 512, "%s.input.%s", CurGame->shortname, CurGame->PortInfo[port].ShortName); + + PIDC[port].CurrentDeviceIndex = (PIDC[port].CurrentDeviceIndex + 1) % CurGame->PortInfo[port].DeviceInfo.size(); + + const char *devname = CurGame->PortInfo[port].DeviceInfo[PIDC[port].CurrentDeviceIndex].ShortName; + + KillPortInfo(port); + MDFNI_SetSetting(tmp_setting_name, devname); + BuildPortInfo(CurGame, port); + + MDFN_DispMessage(_("%s selected on port %d"), CurGame->PortInfo[port].DeviceInfo[PIDC[port].CurrentDeviceIndex].FullName, port + 1); + } +} + +#define MK(x) { BUTTC_KEYBOARD, 0, MKK(x) } + +#define MK_CK(x) { { BUTTC_KEYBOARD, 0, MKK(x) }, { 0, 0, 0 } } +#define MK_CK2(x,y) { { BUTTC_KEYBOARD, 0, MKK(x) }, { BUTTC_KEYBOARD, 0, MKK(y) } } + +#define MK_CK_SHIFT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (2<<24) }, { 0, 0, 0 } } +#define MK_CK_ALT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (1<<24) }, { 0, 0, 0 } } +#define MK_CK_ALT_SHIFT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (3<<24) }, { 0, 0, 0 } } +#define MK_CK_CTRL(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (4 << 24) }, { 0, 0, 0 } } +#define MK_CK_CTRL_SHIFT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (6 << 24) }, { 0, 0, 0 } } + +#define MKZ() {0, 0, 0} + +enum CommandKey +{ + _CK_FIRST = 0, + CK_SAVE_STATE = 0, + CK_LOAD_STATE, + CK_SAVE_MOVIE, + CK_LOAD_MOVIE, + CK_STATE_REWIND_TOGGLE, + CK_0,CK_1,CK_2,CK_3,CK_4,CK_5,CK_6,CK_7,CK_8,CK_9, + CK_M0,CK_M1,CK_M2,CK_M3,CK_M4,CK_M5,CK_M6,CK_M7,CK_M8,CK_M9, + CK_TL1, CK_TL2, CK_TL3, CK_TL4, CK_TL5, CK_TL6, CK_TL7, CK_TL8, CK_TL9, + CK_TAKE_SNAPSHOT, + CK_TAKE_SCALED_SNAPSHOT, + CK_TOGGLE_FS, + CK_FAST_FORWARD, + CK_SLOW_FORWARD, + + CK_INSERT_COIN, + CK_TOGGLE_DIPVIEW, + CK_SELECT_DISK, + CK_INSERTEJECT_DISK, + CK_ACTIVATE_BARCODE, + + CK_TOGGLE_GRAB_INPUT, + CK_TOGGLE_CDISABLE, + CK_INPUT_CONFIG1, + CK_INPUT_CONFIG2, + CK_INPUT_CONFIG3, + CK_INPUT_CONFIG4, + CK_INPUT_CONFIG5, + CK_INPUT_CONFIG6, + CK_INPUT_CONFIG7, + CK_INPUT_CONFIG8, + CK_INPUT_CONFIGC, + CK_INPUT_CONFIGC_AM, + CK_INPUT_CONFIG_ABD, + + CK_RESET, + CK_POWER, + CK_EXIT, + CK_STATE_REWIND, + CK_ROTATESCREEN, + CK_TOGGLENETVIEW, + CK_ADVANCE_FRAME, + CK_RUN_NORMAL, + CK_TOGGLECHEATVIEW, + CK_TOGGLE_CHEAT_ACTIVE, + CK_TOGGLE_FPS_VIEW, + CK_TOGGLE_DEBUGGER, + CK_STATE_SLOT_DEC, + CK_STATE_SLOT_INC, + CK_TOGGLE_HELP, + CK_DEVICE_SELECT1, + CK_DEVICE_SELECT2, + CK_DEVICE_SELECT3, + CK_DEVICE_SELECT4, + CK_DEVICE_SELECT5, + CK_DEVICE_SELECT6, + CK_DEVICE_SELECT7, + CK_DEVICE_SELECT8, + + _CK_COUNT +}; + +struct COKE +{ + ButtConfig bc[2]; + const char *text; + bool BypassKeyZeroing; + bool SkipCKDelay; + const char *description; +}; + +static const COKE CKeys[_CK_COUNT] = +{ + { MK_CK(F5), "save_state", false, 1, gettext_noop("Save state") }, + { MK_CK(F7), "load_state", false, 0, gettext_noop("Load state") }, + { MK_CK_SHIFT(F5), "save_movie", false, 1, gettext_noop("Save movie") }, + { MK_CK_SHIFT(F7), "load_movie", false, 0, gettext_noop("Load movie") }, + { MK_CK_ALT(s), "toggle_state_rewind", false, 1, gettext_noop("Toggle state rewind functionality") }, + + { MK_CK(0), "0", false, 1, gettext_noop("Save state 0 select")}, + { MK_CK(1), "1", false, 1, gettext_noop("Save state 1 select")}, + { MK_CK(2), "2", false, 1, gettext_noop("Save state 2 select")}, + { MK_CK(3), "3", false, 1, gettext_noop("Save state 3 select")}, + { MK_CK(4), "4", false, 1, gettext_noop("Save state 4 select")}, + { MK_CK(5), "5", false, 1, gettext_noop("Save state 5 select")}, + { MK_CK(6), "6", false, 1, gettext_noop("Save state 6 select")}, + { MK_CK(7), "7", false, 1, gettext_noop("Save state 7 select")}, + { MK_CK(8), "8", false, 1, gettext_noop("Save state 8 select")}, + { MK_CK(9), "9", false, 1, gettext_noop("Save state 9 select")}, + + { MK_CK_SHIFT(0), "m0", false, 1, gettext_noop("Movie 0 select") }, + { MK_CK_SHIFT(1), "m1", false, 1, gettext_noop("Movie 1 select") }, + { MK_CK_SHIFT(2), "m2", false, 1, gettext_noop("Movie 2 select") }, + { MK_CK_SHIFT(3), "m3", false, 1, gettext_noop("Movie 3 select") }, + { MK_CK_SHIFT(4), "m4", false, 1, gettext_noop("Movie 4 select") }, + { MK_CK_SHIFT(5), "m5", false, 1, gettext_noop("Movie 5 select") }, + { MK_CK_SHIFT(6), "m6", false, 1, gettext_noop("Movie 6 select") }, + { MK_CK_SHIFT(7), "m7", false, 1, gettext_noop("Movie 7 select") }, + { MK_CK_SHIFT(8), "m8", false, 1, gettext_noop("Movie 8 select") }, + { MK_CK_SHIFT(9), "m9", false, 1, gettext_noop("Movie 9 select") }, + + { MK_CK_CTRL(1), "tl1", false, 1, gettext_noop("Toggle graphics layer 1") }, + { MK_CK_CTRL(2), "tl2", false, 1, gettext_noop("Toggle graphics layer 2") }, + { MK_CK_CTRL(3), "tl3", false, 1, gettext_noop("Toggle graphics layer 3") }, + { MK_CK_CTRL(4), "tl4", false, 1, gettext_noop("Toggle graphics layer 4") }, + { MK_CK_CTRL(5), "tl5", false, 1, gettext_noop("Toggle graphics layer 5") }, + { MK_CK_CTRL(6), "tl6", false, 1, gettext_noop("Toggle graphics layer 6") }, + { MK_CK_CTRL(7), "tl7", false, 1, gettext_noop("Toggle graphics layer 7") }, + { MK_CK_CTRL(8), "tl8", false, 1, gettext_noop("Toggle graphics layer 8") }, + { MK_CK_CTRL(9), "tl9", false, 1, gettext_noop("Toggle graphics layer 9") }, + + { MK_CK(F9), "take_snapshot", false, 1, gettext_noop("Take screen snapshot") }, + { MK_CK_SHIFT(F9), "take_scaled_snapshot", false, 1, gettext_noop("Take scaled(and filtered) screen snapshot") }, + + { MK_CK_ALT(RETURN), "toggle_fs", false, 1, gettext_noop("Toggle fullscreen mode") }, + { MK_CK(BACKQUOTE), "fast_forward", false, 1, gettext_noop("Fast-forward") }, + { MK_CK(BACKSLASH), "slow_forward", false, 1, gettext_noop("Slow-forward") }, + + { MK_CK(F8), "insert_coin", false, 1, gettext_noop("Insert coin") }, + { MK_CK(F6), "toggle_dipview", false, 1, gettext_noop("Toggle DIP switch view") }, + { MK_CK(F6), "select_disk", false, 1, gettext_noop("Select disk/disc") }, + { MK_CK(F8), "insert_eject_disk", false, 0, gettext_noop("Insert/Eject disk/disc") }, + { MK_CK(F8), "activate_barcode", false, 1, gettext_noop("Activate barcode(for Famicom)") }, + { MK_CK(SCROLLOCK), "toggle_grab_input", false, 1, gettext_noop("Grab input") }, + { MK_CK_SHIFT(SCROLLOCK), "toggle_cidisable", false, 1, gettext_noop("Grab input and disable commands") }, + { MK_CK_ALT_SHIFT(1), "input_config1", false, 0, gettext_noop("Configure buttons on virtual port 1") }, + { MK_CK_ALT_SHIFT(2), "input_config2", false, 0, gettext_noop("Configure buttons on virtual port 2") }, + { MK_CK_ALT_SHIFT(3), "input_config3", false, 0, gettext_noop("Configure buttons on virtual port 3") }, + { MK_CK_ALT_SHIFT(4), "input_config4", false, 0, gettext_noop("Configure buttons on virtual port 4") }, + { MK_CK_ALT_SHIFT(5), "input_config5", false, 0, gettext_noop("Configure buttons on virtual port 5") }, + { MK_CK_ALT_SHIFT(6), "input_config6", false, 0, gettext_noop("Configure buttons on virtual port 6") }, + { MK_CK_ALT_SHIFT(7), "input_config7", false, 0, gettext_noop("Configure buttons on virtual port 7") }, + { MK_CK_ALT_SHIFT(8), "input_config8", false, 0, gettext_noop("Configure buttons on virtual port 8") }, + { MK_CK(F2), "input_configc", false, 0, gettext_noop("Configure command key") }, + { MK_CK_SHIFT(F2), "input_configc_am", false, 0, gettext_noop("Configure command key, for all-pressed-to-trigger mode") }, + + { MK_CK(F3), "input_config_abd", false, 0, gettext_noop("Detect analog buttons on physical joysticks/gamepads(for use with the input configuration process).") }, + + { MK_CK(F10), "reset", false, 0, gettext_noop("Reset") }, + { MK_CK(F11), "power", false, 0, gettext_noop("Power toggle") }, + { MK_CK2(F12, ESCAPE), "exit", true, 0, gettext_noop("Exit") }, + { MK_CK(BACKSPACE), "state_rewind", false, 1, gettext_noop("Rewind") }, + { MK_CK_ALT(o), "rotate_screen", false, 1, gettext_noop("Rotate screen") }, + + { MK_CK(t), "togglenetview", false, 1, gettext_noop("Toggle netplay console")}, + { MK_CK_ALT(a), "advance_frame", false, 1, gettext_noop("Advance frame") }, + { MK_CK_ALT(r), "run_normal", false, 1, gettext_noop("Return to normal mode after advancing frames") }, + { MK_CK_ALT(c), "togglecheatview", true, 1, gettext_noop("Toggle cheat console") }, + { MK_CK_ALT(t), "togglecheatactive", false, 1, gettext_noop("Enable/Disable cheats") }, + { MK_CK_SHIFT(F1), "toggle_fps_view", false, 1, gettext_noop("Toggle frames-per-second display") }, + { MK_CK_ALT(d), "toggle_debugger", true, 1, gettext_noop("Toggle debugger") }, + { MK_CK(MINUS), "state_slot_dec", false, 1, gettext_noop("Decrease selected save state slot by 1") }, + { MK_CK(EQUALS), "state_slot_inc", false, 1, gettext_noop("Increase selected save state slot by 1") }, + { MK_CK(F1), "toggle_help", true, 1, gettext_noop("Toggle help screen") }, + { MK_CK_CTRL_SHIFT(1), "device_select1", false, 1, gettext_noop("Select virtual device on virtual input port 1") }, + { MK_CK_CTRL_SHIFT(2), "device_select2", false, 1, gettext_noop("Select virtual device on virtual input port 2") }, + { MK_CK_CTRL_SHIFT(3), "device_select3", false, 1, gettext_noop("Select virtual device on virtual input port 3") }, + { MK_CK_CTRL_SHIFT(4), "device_select4", false, 1, gettext_noop("Select virtual device on virtual input port 4") }, + { MK_CK_CTRL_SHIFT(5), "device_select5", false, 1, gettext_noop("Select virtual device on virtual input port 5") }, + { MK_CK_CTRL_SHIFT(6), "device_select6", false, 1, gettext_noop("Select virtual device on virtual input port 6") }, + { MK_CK_CTRL_SHIFT(7), "device_select7", false, 1, gettext_noop("Select virtual device on virtual input port 7") }, + { MK_CK_CTRL_SHIFT(8), "device_select8", false, 1, gettext_noop("Select virtual device on virtual input port 8") }, +}; + +static const char *CKeysSettingName[_CK_COUNT]; + +struct CKeyConfig +{ + bool AND_Mode; + std::vector bc; +}; + +static CKeyConfig CKeysConfig[_CK_COUNT]; +static uint32 CKeysPressTime[_CK_COUNT]; +static bool CKeysActive[_CK_COUNT]; +static bool CKeysTrigger[_CK_COUNT]; +static uint32 CurTicks = 0; // Optimization, SDL_GetTicks() might be slow on some platforms? + +static void CK_Init(void) +{ + ckdelay = MDFN_GetSettingUI("ckdelay"); + + for(CommandKey i = _CK_FIRST; i < _CK_COUNT; i = (CommandKey)((unsigned)i + 1)) + { + CKeysPressTime[i] = 0xFFFFFFFF; + CKeysActive[i] = true; // To prevent triggering when a button/key is held from before startup. + CKeysTrigger[i] = false; + } +} + +static void CK_PostRemapUpdate(CommandKey which) +{ + CKeysActive[which] = DTestButtonCombo(CKeysConfig[which].bc, (CKeys[which].BypassKeyZeroing ? keys_untouched : keys), MouseData, CKeysConfig[which].AND_Mode); + CKeysTrigger[which] = false; + CKeysPressTime[which] = 0xFFFFFFFF; +} + +static void CK_UpdateState(bool skipckd_tc) +{ + for(CommandKey i = _CK_FIRST; i < _CK_COUNT; i = (CommandKey)((unsigned)i + 1)) + { + const bool prev_state = CKeysActive[i]; + const bool cur_state = DTestButtonCombo(CKeysConfig[i].bc, (CKeys[i].BypassKeyZeroing ? keys_untouched : keys), MouseData, CKeysConfig[i].AND_Mode); + unsigned tmp_ckdelay = ckdelay; + + if(CKeys[i].SkipCKDelay || skipckd_tc) + tmp_ckdelay = 0; + + if(cur_state) + { + if(!prev_state) + CKeysPressTime[i] = CurTicks; + } + else + CKeysPressTime[i] = 0xFFFFFFFF; + + CKeysTrigger[i] = false; + + if(CurTicks >= ((uint64)CKeysPressTime[i] + tmp_ckdelay)) + { + CKeysTrigger[i] = true; + CKeysPressTime[i] = 0xFFFFFFFF; + } + + CKeysActive[i] = cur_state; + } +} + +static INLINE bool CK_Check(CommandKey which) +{ + return CKeysTrigger[which]; +} + +static INLINE bool CK_CheckActive(CommandKey which) +{ + return CKeysActive[which]; +} + +int NoWaiting = 0; + +static bool ViewDIPSwitches = false; +static int cidisabled=0; + +static bool inff = 0; +static bool insf = 0; + +typedef enum +{ + none, + Port1, + Port2, + Port3, + Port4, + Port5, + Port6, + Port7, + Port8, + Command, + CommandAM +} ICType; + +static ICType IConfig = none; +static int ICLatch; +static uint32 ICDeadDelay = 0; + +static struct __MouseState +{ + int x, y; + int xrel_accum; + int yrel_accum; + + uint32 button; + uint32 button_realstate; + uint32 button_prevsent; +} MouseState = { 0, 0, 0, 0, 0, 0, 0 }; + +//#include "InputConfigurator.inc" +//static InputConfigurator *IConfigurator = NULL; +static int (*EventHook)(const SDL_Event *event) = NULL; +void MainSetEventHook(int (*eh)(const SDL_Event *event)) +{ + EventHook = eh; +} + +void Input_Event(const SDL_Event *event) +{ + switch(event->type) + { + case SDL_MOUSEBUTTONDOWN: + if(event->button.state == SDL_PRESSED) + { + MouseState.button |= 1 << (event->button.button - 1); + MouseState.button_realstate |= 1 << (event->button.button - 1); + } + break; + + case SDL_MOUSEBUTTONUP: + if(event->button.state == SDL_RELEASED) + { + MouseState.button_realstate &= ~(1 << (event->button.button - 1)); + } + break; + + case SDL_MOUSEMOTION: + MouseState.x = event->motion.x; + MouseState.y = event->motion.y; + MouseState.xrel_accum += event->motion.xrel; + MouseState.yrel_accum += event->motion.yrel; + break; + } + + if(EventHook) + EventHook(event); +} + +/* + The mouse button handling convolutedness is to make sure that extremely quick mouse button press and release + still register as pressed for 1 emulated frame, and without otherwise increasing the lag of a mouse button release(which + is what the button_prevsent is for). +*/ +static void UpdatePhysicalDeviceState(void) +{ + const bool clearify_mdr = true; + int mouse_x = MouseState.x, mouse_y = MouseState.y; + + //printf("%08x -- %08x %08x\n", MouseState.button & (MouseState.button_realstate | ~MouseState.button_prevsent), MouseState.button, MouseState.button_realstate); + + Video_PtoV(mouse_x, mouse_y, (int32*)&MouseData[0], (int32*)&MouseData[1]); + MouseData[2] = MouseState.button & (MouseState.button_realstate | ~MouseState.button_prevsent); + + if(clearify_mdr) + { + MouseState.button_prevsent = MouseData[2]; + MouseState.button &= MouseState.button_realstate; + MouseDataRel[0] -= (int32)MouseDataRel[0]; //floor(MouseDataRel[0]); + MouseDataRel[1] -= (int32)MouseDataRel[1]; //floor(MouseDataRel[1]); + } + + MouseDataRel[0] += CurGame->mouse_sensitivity * MouseState.xrel_accum; + MouseDataRel[1] += CurGame->mouse_sensitivity * MouseState.yrel_accum; + + // + // + // + MouseState.xrel_accum = 0; + MouseState.yrel_accum = 0; + // + // + // + + + memcpy(keys_untouched, SDL_GetKeyState(0), MKK_COUNT); + memcpy(keys, keys_untouched, MKK_COUNT); + + if(MDFNDHaveFocus || MDFN_GetSettingB("input.joystick.global_focus")) + joy_manager->UpdateJoysticks(); + + CurTicks = SDL_GetTicks(); +} + +static void RedoFFSF(void) +{ + if(inff) + RefreshThrottleFPS(MDFN_GetSettingF("ffspeed")); + else if(insf) + RefreshThrottleFPS(MDFN_GetSettingF("sfspeed")); + else + RefreshThrottleFPS(1); +} + + +static void ToggleLayer(int which) +{ + static uint64 le_mask = ~0ULL; // FIXME/TODO: Init to ~0ULL on game load. + + if(CurGame && CurGame->LayerNames) + { + const char *goodies = CurGame->LayerNames; + int x = 0; + + while(x != which) + { + while(*goodies) + goodies++; + goodies++; + if(!*goodies) return; // ack, this layer doesn't exist. + x++; + } + + le_mask ^= (1ULL << which); + MDFNI_SetLayerEnableMask(le_mask); + + if(le_mask & (1ULL << which)) + MDFN_DispMessage(_("%s enabled."), _(goodies)); + else + MDFN_DispMessage(_("%s disabled."), _(goodies)); + } +} + + +// TODO: Remove this in the future when digit-string input devices are better abstracted. +static uint8 BarcodeWorldData[1 + 13]; + +static void DoKeyStateZeroing(void) +{ + if(IConfig == none && !(cidisabled & 0x1)) + { + if(Netplay_IsTextInput() || CheatIF_Active()) + { + memset(keys, 0, sizeof(keys)); // This effectively disables keyboard input, but still + // allows physical joystick input when in the chat mode. + } + + if(Debugger_IsActive()) + { + memset(keys, 0, sizeof(keys)); + + keys[SDLK_F1] = keys_untouched[SDLK_F1]; + keys[SDLK_F2] = keys_untouched[SDLK_F2]; + keys[SDLK_F3] = keys_untouched[SDLK_F3]; + keys[SDLK_F4] = keys_untouched[SDLK_F4]; + keys[SDLK_F5] = keys_untouched[SDLK_F5]; + keys[SDLK_F6] = keys_untouched[SDLK_F6]; + keys[SDLK_F7] = keys_untouched[SDLK_F7]; + keys[SDLK_F8] = keys_untouched[SDLK_F8]; + keys[SDLK_F9] = keys_untouched[SDLK_F9]; + keys[SDLK_F10] = keys_untouched[SDLK_F10]; + keys[SDLK_F11] = keys_untouched[SDLK_F11]; + keys[SDLK_F12] = keys_untouched[SDLK_F12]; + keys[SDLK_F13] = keys_untouched[SDLK_F13]; + keys[SDLK_F14] = keys_untouched[SDLK_F14]; + keys[SDLK_F15] = keys_untouched[SDLK_F15]; + } + } +} + +static void CheckCommandKeys(void) +{ + CK_UpdateState((IConfig == Command || IConfig == CommandAM) && ICLatch == -1); + + for(unsigned i = 0; i < 8; i++) + { + if(IConfig == Port1 + i) + { + if(CK_Check((CommandKey)(CK_INPUT_CONFIG1 + i))) + { + CK_PostRemapUpdate((CommandKey)(CK_INPUT_CONFIG1 + i)); // Kind of abusing that function if going by its name, but meh. + + ResyncGameInputSettings(i); + IConfig = none; + + MDFNI_DispMessage(_("Configuration interrupted.")); + } + else if(ConfigDevice(i)) + { + ResyncGameInputSettings(i); + ICDeadDelay = CurTicks + 300; + IConfig = none; + } + break; + } + } + + if(IConfig == Command || IConfig == CommandAM) + { + if(ICLatch != -1) + { + if(subcon(CKeys[ICLatch].text, CKeysConfig[ICLatch].bc, 1)) + { + MDFNI_DispMessage(_("Configuration finished.")); + + MDFNI_SetSetting(CKeysSettingName[ICLatch], BCsToString(CKeysConfig[ICLatch].bc, CKeysConfig[ICLatch].AND_Mode)); + ICDeadDelay = CurTicks + 300; + IConfig = none; + + // Prevent accidentally triggering the command + CK_PostRemapUpdate((CommandKey)ICLatch); + } + } + else + { + MDFNI_DispMessage(_("Press command key to remap now%s..."), (IConfig == CommandAM) ? _("(AND Mode)") : ""); + + for(CommandKey x = _CK_FIRST; x < _CK_COUNT; x = (CommandKey)((unsigned)x + 1)) + { + if(CK_Check((CommandKey)x)) + { + ICLatch = x; + CKeysConfig[ICLatch].AND_Mode = (IConfig == CommandAM); + subcon_begin(CKeysConfig[ICLatch].bc); + break; + } + } + } + } + + { + bool cid_changed = false; + + if(CK_Check(CK_TOGGLE_GRAB_INPUT)) + { + cidisabled = (cidisabled == 0x2) ? 0 : 0x2; + cid_changed = true; + } + + if(CK_Check(CK_TOGGLE_CDISABLE)) + { + cidisabled = (cidisabled == 0x3) ? 0 : 0x3; + cid_changed = true; + } + + if(cid_changed) + { + SDL_Event evt; + evt.user.type = SDL_USEREVENT; + evt.user.code = CEVT_SET_GRAB_INPUT; + evt.user.data1 = malloc(1); + + *(uint8 *)evt.user.data1 = cidisabled & 0x2; + SDL_PushEvent(&evt); + + MDFNI_DispMessage(_("Input grabbing: %s, Command key processing: %s"), (cidisabled & 0x02) ? _("On") : _("Off"), !(cidisabled & 0x01) ? _("On") : _("Off")); + } + } + + if(cidisabled & 0x1) + return; + + if(IConfig != none) + return; + + if(!CheatIF_Active() && !MDFNDnetplay) + { + if(CK_Check(CK_TOGGLE_DEBUGGER)) + { + Debugger_GT_Toggle(); + } + } + + if(!Debugger_IsActive() && !MDFNDnetplay) + { + if(CK_Check(CK_TOGGLECHEATVIEW)) + { + CheatIF_GT_Show(!CheatIF_Active()); + } + } + + if(CK_Check(CK_EXIT)) + { + SendCEvent(CEVT_WANT_EXIT, NULL, NULL); + } + + if(CK_Check(CK_TOGGLE_HELP)) + Help_Toggle(); + + if(!CheatIF_Active() && !Debugger_IsActive()) + { + if(CK_Check(CK_TOGGLENETVIEW)) + { + Netplay_ToggleTextView(); + } + } + + if(CK_Check(CK_TOGGLE_CHEAT_ACTIVE)) + { + bool isactive = MDFN_GetSettingB("cheats"); + + isactive = !isactive; + + MDFNI_SetSettingB("cheats", isactive); + + if(isactive) + MDFNI_DispMessage(_("Application of cheats enabled.")); + else + MDFNI_DispMessage(_("Application of cheats disabled.")); + } + + if(CK_Check(CK_TOGGLE_FPS_VIEW)) + FPS_ToggleView(); + + if(CK_Check(CK_TOGGLE_FS)) + { + GT_ToggleFS(); + } + + if(!CurGame) + return; + + if(!MDFNDnetplay) + { + bool ck_af = CK_Check(CK_ADVANCE_FRAME); + bool ck_rn = CK_Check(CK_RUN_NORMAL); + bool iifa = IsInFrameAdvance(); + + // + // Change the order of processing based on being in frame advance mode to allow for the derivation of single-key (un)pause functionality. + // + + if(ck_af & iifa) + DoFrameAdvance(); + + if(ck_rn) + DoRunNormal(); + + if(ck_af & !iifa) + DoFrameAdvance(); + } + + if(!Debugger_IsActive()) // We don't want to start button configuration when the debugger is active! + { + for(int i = 0; i < 8; i++) + { + if(CK_Check((CommandKey)(CK_INPUT_CONFIG1 + i))) + { + if(!PIDC[i].BIC.size()) + { + MDFN_DispMessage(_("No buttons to configure for input port %u!"), i + 1); + } + else + { + //SetJoyReadMode(0); + ConfigDeviceBegin(); + IConfig = (ICType)(Port1 + i); + } + } + } + + if(CK_Check(CK_INPUT_CONFIGC)) + { + //SetJoyReadMode(0); + ConfigDeviceBegin(); + ICLatch = -1; + IConfig = Command; + } + + if(CK_Check(CK_INPUT_CONFIGC_AM)) + { + //SetJoyReadMode(0); + ConfigDeviceBegin(); + ICLatch = -1; + IConfig = CommandAM; + } + + if(CK_Check(CK_INPUT_CONFIG_ABD)) + { + MDFN_DispMessage("%u joystick/gamepad analog button(s) detected.", joy_manager->DetectAnalogButtonsForChangeCheck()); + } + } + + if(CK_Check(CK_ROTATESCREEN)) + { + if(CurGame->rotated == MDFN_ROTATE0) + CurGame->rotated = MDFN_ROTATE90; + else if(CurGame->rotated == MDFN_ROTATE90) + CurGame->rotated = MDFN_ROTATE270; + else if(CurGame->rotated == MDFN_ROTATE270) + CurGame->rotated = MDFN_ROTATE0; + + GT_ReinitVideo(); + } + + if(CK_CheckActive(CK_STATE_REWIND)) + DNeedRewind = true; + else + DNeedRewind = false; + + if(CK_Check(CK_STATE_REWIND_TOGGLE)) + { + RewindState = !RewindState; + MDFNI_EnableStateRewind(RewindState); + + MDFNI_DispMessage(RewindState ? _("State rewinding functionality enabled.") : _("State rewinding functionality disabled.")); + } + + { + bool previous_ff = inff; + bool previous_sf = insf; + + if(fftoggle_setting) + inff ^= CK_Check(CK_FAST_FORWARD); + else + inff = CK_CheckActive(CK_FAST_FORWARD); + + if(sftoggle_setting) + insf ^= CK_Check(CK_SLOW_FORWARD); + else + insf = CK_CheckActive(CK_SLOW_FORWARD); + + if(previous_ff != inff || previous_sf != insf) + RedoFFSF(); + } + + if(CurGame->RMD->Drives.size()) + { + if(CK_Check(CK_SELECT_DISK)) + { + RMDUI_Select(); + } + if(CK_Check(CK_INSERTEJECT_DISK)) + { + RMDUI_Toggle_InsertEject(); + } + } + + if(CurGame->GameType != GMT_PLAYER) + { + for(int i = 0; i < 8; i++) + { + if(CK_Check((CommandKey)(CK_DEVICE_SELECT1 + i))) + IncSelectedDevice(i); + } + } + + if(CK_Check(CK_TAKE_SNAPSHOT)) + pending_snapshot = 1; + + if(CK_Check(CK_TAKE_SCALED_SNAPSHOT)) + pending_ssnapshot = 1; + + if(CK_Check(CK_SAVE_STATE)) + pending_save_state = 1; + + if(CK_Check(CK_SAVE_MOVIE)) + pending_save_movie = 1; + + if(CK_Check(CK_LOAD_STATE)) + { + MDFNI_LoadState(NULL, NULL); + Debugger_GT_SyncDisToPC(); + } + + if(CK_Check(CK_LOAD_MOVIE)) + { + MDFNI_LoadMovie(NULL); + Debugger_GT_SyncDisToPC(); + } + + if(CK_Check(CK_TL1)) + ToggleLayer(0); + if(CK_Check(CK_TL2)) + ToggleLayer(1); + if(CK_Check(CK_TL3)) + ToggleLayer(2); + if(CK_Check(CK_TL4)) + ToggleLayer(3); + if(CK_Check(CK_TL5)) + ToggleLayer(4); + if(CK_Check(CK_TL6)) + ToggleLayer(5); + if(CK_Check(CK_TL7)) + ToggleLayer(6); + if(CK_Check(CK_TL8)) + ToggleLayer(7); + if(CK_Check(CK_TL9)) + ToggleLayer(8); + + if(CK_Check(CK_STATE_SLOT_INC)) + { + MDFNI_SelectState(666 + 1); + } + + if(CK_Check(CK_STATE_SLOT_DEC)) + { + MDFNI_SelectState(666 - 1); + } + + if(CK_Check(CK_RESET)) + { + MDFNI_Reset(); + Debugger_GT_ForceStepIfStepping(); + } + + if(CK_Check(CK_POWER)) + { + MDFNI_Power(); + Debugger_GT_ForceStepIfStepping(); + } + + if(CurGame->GameType == GMT_ARCADE) + { + if(CK_Check(CK_INSERT_COIN)) + MDFNI_InsertCoin(); + + if(CK_Check(CK_TOGGLE_DIPVIEW)) + { + ViewDIPSwitches = !ViewDIPSwitches; + MDFNI_ToggleDIPView(); + } + + if(!ViewDIPSwitches) + goto DIPSless; + + if(CK_Check(CK_1)) MDFNI_ToggleDIP(0); + if(CK_Check(CK_2)) MDFNI_ToggleDIP(1); + if(CK_Check(CK_3)) MDFNI_ToggleDIP(2); + if(CK_Check(CK_4)) MDFNI_ToggleDIP(3); + if(CK_Check(CK_5)) MDFNI_ToggleDIP(4); + if(CK_Check(CK_6)) MDFNI_ToggleDIP(5); + if(CK_Check(CK_7)) MDFNI_ToggleDIP(6); + if(CK_Check(CK_8)) MDFNI_ToggleDIP(7); + } + else + { + #ifdef WANT_NES_EMU + static uint8 bbuf[32]; + static int bbuft; + static int barcoder = 0; + + if(!strcmp(CurGame->shortname, "nes") && (!strcmp(PIDC[4].Device->ShortName, "bworld") || (CurGame->cspecial && !strcasecmp(CurGame->cspecial, "datach")))) + { + if(CK_Check(CK_ACTIVATE_BARCODE)) + { + barcoder ^= 1; + if(!barcoder) + { + if(!strcmp(PIDC[4].Device->ShortName, "bworld")) + { + BarcodeWorldData[0] = 1; + memset(BarcodeWorldData + 1, 0, 13); + + strncpy((char *)BarcodeWorldData + 1, (char *)bbuf, 13); + } + else + MDFNI_DatachSet(bbuf); + MDFNI_DispMessage(_("Barcode Entered")); + } + else { bbuft = 0; MDFNI_DispMessage(_("Enter Barcode"));} + } + } + else + barcoder = 0; + + #define SSM(x) { if(bbuft < 13) {bbuf[bbuft++] = '0' + x; bbuf[bbuft] = 0;} MDFNI_DispMessage(_("Barcode: %s"),bbuf); } + + DIPSless: + + if(barcoder) + { + for(unsigned i = 0; i < 10; i++) + if(CK_Check((CommandKey)(CK_0 + i))) + SSM(i); + } + else + #else + DIPSless: ; + #endif + { + for(unsigned i = 0; i < 10; i++) + { + if(CK_Check((CommandKey)(CK_0 + i))) + MDFNI_SelectState(i); + + if(CK_Check((CommandKey)(CK_M0 + i))) + MDFNI_SelectMovie(i); + } + } + #undef SSM + } +} + +void MDFND_UpdateInput(bool VirtualDevicesOnly, bool UpdateRapidFire) +{ + static unsigned int rapid=0; + + UpdatePhysicalDeviceState(); + + DoKeyStateZeroing(); // Call before CheckCommandKeys() + + // + // CheckCommandKeys(), specifically MDFNI_LoadState(), should be called *before* we update the emulated device input data, as that data is + // stored/restored from save states(related: ALT+A frame advance, switch state). + // + if(!VirtualDevicesOnly) + CheckCommandKeys(); + + if(UpdateRapidFire) + rapid = (rapid + 1) % (autofirefreq + 1); + + bool RotateInput = false; + bool RotateInputSettingFetched = false; + + // Do stuff here + for(unsigned int x = 0; x < CurGame->PortInfo.size(); x++) + { + if(!PIDC[x].Data) + continue; + + // + // Handle rumble(FIXME: Do we want rumble to work in frame advance mode too?) + // + for(auto const& ric : PIDC[x].RIC) + { + const uint16 rumble_data = MDFN_de16lsb(PIDC[x].Data + ric.BitOffset / 8); + const uint8 weak = (rumble_data >> 0) & 0xFF; + const uint8 strong = (rumble_data >> 8) & 0xFF; + + joy_manager->SetRumble(PIDC[x].BIC[ric.AssocBICIndex].BC, weak, strong); + //printf("Rumble: %04x --- Weak: %02x, Strong: %02x\n", rumble_data, weak, strong); + } + + if(IConfig != none) + continue; + + if(ICDeadDelay > CurTicks) + continue; + else + ICDeadDelay = 0; + + // + // Handle configurable inputs/buttons. + // + for(auto& bic : PIDC[x].BIC) + { + if(!RotateInputSettingFetched) + { + if(bic.BitOffsets[CurGame->rotated] != bic.BitOffsets[0]) + { + char tmp_setting_name[512]; + + trio_snprintf(tmp_setting_name, 512, "%s.rotateinput", CurGame->shortname); + RotateInput = MDFN_GetSettingB(tmp_setting_name); + RotateInputSettingFetched = true; + } + } + // + // + // + uint8* tptr = PIDC[x].Data; + const uint32 bo = bic.BitOffsets[RotateInput ? CurGame->rotated : 0]; + uint8* const btptr = &tptr[bo >> 3]; + + + // + // Mice axes aren't buttons! Oh well... + // + if(bic.Type == IDIT_X_AXIS || bic.Type == IDIT_Y_AXIS) + { + float tv = 0; + + if(bic.BC.size() > 0) + tv = DTestMouseAxis(bic.BC[0], keys, MouseData, (bic.Type == IDIT_Y_AXIS)); + + if(bic.Type == IDIT_Y_AXIS) + tv = floor(0.5 + (tv * (1.0 / 65536) * CurGame->mouse_scale_y) + CurGame->mouse_offs_y); + else + tv = floor(0.5 + (tv * (1.0 / 65536) * CurGame->mouse_scale_x) + CurGame->mouse_offs_x); + + MDFN_en16lsb(btptr, (int16)std::max(-32768, std::min(tv, 32767))); + } + else if(bic.Type == IDIT_BUTTON_ANALOG) // Analog button + { + uint32 intv; + + intv = DTestButton(bic.BC, keys, MouseData, true); + + if(bic.Flags & IDIT_BUTTON_ANALOG_FLAG_SQLR) + intv = std::min((unsigned)floor(0.5 + intv * PIDC[x].AxisScale), 32767); + + MDFN_en16lsb(btptr, intv); + } + else if(bic.Type == IDIT_SWITCH) + { + const bool nps = DTestButton(bic.BC, keys, MouseData); + uint8 cv = BitsExtract(tptr, bo, bic.SwitchBitSize); + + if(MDFN_UNLIKELY(!bic.SwitchLastPress && nps)) + { + cv = (cv + 1) % bic.SwitchNumPos; + BitsIntract(tptr, bo, bic.SwitchBitSize, cv); + } + + if(MDFN_UNLIKELY(cv >= bic.SwitchNumPos)) // Can also be triggered intentionally by a bad save state/netplay. + fprintf(stderr, "[BUG] cv(%u) >= bic.SwitchNumPos(%u)\n", cv, bic.SwitchNumPos); + else if(MDFN_UNLIKELY(cv != bic.SwitchLastPos)) + { + MDFN_DispMessage(_("%s %u: %s: %s selected."), PIDC[x].Device->FullName, x + 1, bic.IDII->Name, bic.IDII->SwitchPosName[cv]); + bic.SwitchLastPos = cv; + } + + bic.SwitchLastPress = nps; + } + else + { + if(!bic.Rapid) + *btptr &= ~(1 << (bo & 7)); + + if(DTestButton(bic.BC, keys, MouseData)) // boolean button + { + if(!bic.Rapid || rapid >= (autofirefreq + 1) / 2) + *btptr |= 1 << (bo & 7); + } + } + } + + // + // Handle button exclusion! + // + for(auto& bic : PIDC[x].BIC) + { + if(bic.ExclusionBitOffset != 0xFFFF) + { + const uint32 bo[2] = { bic.BitOffsets[0], bic.ExclusionBitOffset }; + const uint32 bob[2] = { bo[0] >> 3, bo[1] >> 3 }; + const uint32 bom[2] = { 1U << (bo[0] & 0x7), 1U << (bo[1] & 0x7) }; + uint8 *tptr = PIDC[x].Data; + + if((tptr[bob[0]] & bom[0]) && (tptr[bob[1]] & bom[1])) + { + tptr[bob[0]] &= ~bom[0]; + tptr[bob[1]] &= ~bom[1]; + } + } + } + + // + // Handle status indicators. + // + for(auto& sic : PIDC[x].SIC) + { + const uint32 bo = sic.BitOffset; + const uint8* tptr = PIDC[x].Data; + uint32 cv = 0; + + for(unsigned b = 0; b < sic.StatusBitSize; b++) + cv |= ((tptr[(bo + b) >> 3] >> ((bo + b) & 7)) & 1) << b; + + if(MDFN_UNLIKELY(cv >= sic.StatusNumStates)) + fprintf(stderr, "[BUG] cv(%u) >= sic.StatusNumStates(%u)\n", cv,sic.StatusNumStates); + else if(MDFN_UNLIKELY(cv != sic.StatusLastState)) + { + MDFN_DispMessage(_("%s %u: %s: %s"), PIDC[x].Device->FullName, x + 1, sic.IDII->Name, sic.IDII->StatusStates[cv].Name); + sic.StatusLastState = cv; + } + } + + // + // Now, axis and misc data... + // + for(size_t tmi = 0; tmi < PIDC[x].Device->IDII.size(); tmi++) + { + switch(PIDC[x].Device->IDII[tmi].Type) + { + default: break; + + case IDIT_BYTE_SPECIAL: + assert(tmi < 13 + 1); + PIDC[x].Data[tmi] = BarcodeWorldData[tmi]; + break; + + case IDIT_X_AXIS_REL: + case IDIT_Y_AXIS_REL: + MDFN_en32lsb((PIDC[x].Data + PIDC[x].Device->IDII[tmi].BitOffset / 8), (uint32)((PIDC[x].Device->IDII[tmi].Type == IDIT_Y_AXIS_REL) ? MouseDataRel[1] : MouseDataRel[0])); + break; + } + } + } + + memset(BarcodeWorldData, 0, sizeof(BarcodeWorldData)); +} + +void InitGameInput(MDFNGI *gi) +{ + autofirefreq = MDFN_GetSettingUI("autofirefreq"); + fftoggle_setting = MDFN_GetSettingB("fftoggle"); + sftoggle_setting = MDFN_GetSettingB("sftoggle"); + + CK_Init(); + + //SetJoyReadMode(1); // Disable joystick event handling, and allow manual state updates. + + for(size_t p = 0; p < gi->PortInfo.size(); p++) + BuildPortInfo(gi, p); +} + +// Update setting strings with butt configs. +static void ResyncGameInputSettings(unsigned port) +{ + for(unsigned int x = 0; x < PIDC[port].BIC.size(); x++) + MDFNI_SetSetting(PIDC[port].BIC[x].SettingName, BCsToString(PIDC[port].BIC[x].BC)); +} + + +static ButtConfig subcon_bc; +static int subcon_tb; +static int subcon_wc; + +static void subcon_begin(std::vector &bc) +{ + bc.clear(); + + memset(&subcon_bc, 0, sizeof(subcon_bc)); + subcon_tb = -1; + subcon_wc = 0; +} + +/* Configures an individual virtual button. */ +static int subcon(const char *text, std::vector &bc, int commandkey) +{ + while(1) + { + MDFNI_DispMessage("%s (%d)", text, subcon_wc + 1); + + if(subcon_tb != subcon_wc) + { + joy_manager->Reset_BC_ChangeCheck(); + DTryButtonBegin(&subcon_bc, commandkey); + subcon_tb = subcon_wc; + } + + if(DTryButton()) + { + DTryButtonEnd(&subcon_bc); + } + else if(joy_manager->Do_BC_ChangeCheck(&subcon_bc)) + { + + } + else + return(0); + + if(subcon_wc && !memcmp(&subcon_bc, &bc[subcon_wc - 1], sizeof(ButtConfig))) + break; + + bc.push_back(subcon_bc); + subcon_wc++; + } + + //puts("DONE"); + return(1); +} + +static int cd_x; +static int cd_lx = -1; +static void ConfigDeviceBegin(void) +{ + cd_x = 0; + cd_lx = -1; +} + +int ConfigDevice(int arg) +{ + char buf[512]; + + //for(int i = 0; i < PIDC[arg].Buttons.size(); i++) + // printf("%d\n", PIDC[arg].BCPrettyPrio[i]); + //exit(1); + + for(;cd_x < (int)PIDC[arg].BIC.size(); cd_x++) + { + int snooty = -1; + + for(unsigned int i = 0; i < PIDC[arg].BIC.size(); i++) + if(PIDC[arg].BIC[i].BCPrettyPrio == cd_x) + snooty = i; + + if(snooty < 0) + continue; + + // For Lynx, GB, GBA, NGP, WonderSwan(especially wonderswan!) + if(CurGame->PortInfo.size() == 1 && CurGame->PortInfo[0].DeviceInfo.size() == 1) + trio_snprintf(buf, 512, "%s", PIDC[arg].BIC[snooty].CPName); + else + trio_snprintf(buf, 512, "%s %d: %s", PIDC[arg].Device->FullName, arg + 1, PIDC[arg].BIC[snooty].CPName); + + if(cd_x != cd_lx) + { + cd_lx = cd_x; + subcon_begin(PIDC[arg].BIC[snooty].BC); + } + if(!subcon(buf, PIDC[arg].BIC[snooty].BC, 0)) + return(0); + } + + MDFNI_DispMessage(_("Configuration finished.")); + + return(1); +} + +#include "input-default-buttons.h" +struct cstrcomp +{ + bool operator()(const char * const &a, const char * const &b) const + { + return(strcmp(a, b) < 0); + } +}; + +static std::map DefaultButtonSettingsMap; +static std::vector PendingGarbage; + +static void MakeSettingsForDevice(std::vector &settings, const MDFNGI *system, const int w, const InputDeviceInfoStruct *info) +{ + const ButtConfig *def_bc = NULL; + char setting_def_search[512]; + + trio_snprintf(setting_def_search, 512, "%s.input.%s.%s", system->shortname, system->PortInfo[w].ShortName, info->ShortName); + CleanSettingName(setting_def_search); + + { + std::map::iterator fit = DefaultButtonSettingsMap.find(setting_def_search); + if(fit != DefaultButtonSettingsMap.end()) + def_bc = fit->second->bc; + } + + //for(unsigned int d = 0; d < sizeof(defset) / sizeof(DefaultSettingsMeow); d++) + //{ + // if(!strcasecmp(setting_def_search, defset[d].base_name)) + // { + // def_bc = defset[d].bc; + // break; + // } + //} + + int butti = 0; + bool analog_scale_made = false; + for(size_t x = 0; x < info->IDII.size(); x++) + { + if(info->IDII[x].Type != IDIT_BUTTON && info->IDII[x].Type != IDIT_BUTTON_CAN_RAPID && info->IDII[x].Type != IDIT_BUTTON_ANALOG && + info->IDII[x].Type != IDIT_X_AXIS && info->IDII[x].Type != IDIT_Y_AXIS && + info->IDII[x].Type != IDIT_SWITCH) + continue; + + if(NULL == info->IDII[x].SettingName) + continue; + + MDFNSetting tmp_setting; + + const char *default_value = ""; + + if(def_bc) + PendingGarbage.push_back((void *)(default_value = strdup(BCToString(def_bc[butti]).c_str()) )); + + memset(&tmp_setting, 0, sizeof(tmp_setting)); + + PendingGarbage.push_back((void *)(tmp_setting.name = CleanSettingName(trio_aprintf("%s.input.%s.%s.%s", system->shortname, system->PortInfo[w].ShortName, info->ShortName, info->IDII[x].SettingName)) )); + PendingGarbage.push_back((void *)(tmp_setting.description = trio_aprintf("%s, %s, %s: %s", system->shortname, system->PortInfo[w].FullName, info->FullName, info->IDII[x].Name) )); + tmp_setting.type = MDFNST_STRING; + tmp_setting.default_value = default_value; + + tmp_setting.flags = MDFNSF_SUPPRESS_DOC | MDFNSF_CAT_INPUT_MAPPING; + tmp_setting.description_extra = NULL; + + //printf("Maketset: %s %s\n", tmp_setting.name, tmp_setting.default_value); + + settings.push_back(tmp_setting); + + // Now make a rapid butt-on-stick-on-watermelon + if(info->IDII[x].Type == IDIT_BUTTON_CAN_RAPID) + { + memset(&tmp_setting, 0, sizeof(tmp_setting)); + + PendingGarbage.push_back((void *)( tmp_setting.name = CleanSettingName(trio_aprintf("%s.input.%s.%s.rapid_%s", system->shortname, system->PortInfo[w].ShortName, info->ShortName, info->IDII[x].SettingName)) )); + PendingGarbage.push_back((void *)( tmp_setting.description = trio_aprintf("%s, %s, %s: Rapid %s", system->shortname, system->PortInfo[w].FullName, info->FullName, info->IDII[x].Name) )); + tmp_setting.type = MDFNST_STRING; + + tmp_setting.default_value = ""; + + tmp_setting.flags = MDFNSF_SUPPRESS_DOC | MDFNSF_CAT_INPUT_MAPPING; + tmp_setting.description_extra = NULL; + + settings.push_back(tmp_setting); + } + else if(info->IDII[x].Type == IDIT_BUTTON_ANALOG) + { + if((info->IDII[x].Flags & IDIT_BUTTON_ANALOG_FLAG_SQLR) && !analog_scale_made) + { + memset(&tmp_setting, 0, sizeof(tmp_setting)); + + PendingGarbage.push_back((void *)( tmp_setting.name = CleanSettingName(trio_aprintf("%s.input.%s.%s.axis_scale", system->shortname, system->PortInfo[w].ShortName, info->ShortName)) )); + PendingGarbage.push_back((void *)( tmp_setting.description = trio_aprintf("Analog axis scale coefficient for %s on %s.", info->FullName, system->PortInfo[w].FullName) )); + tmp_setting.description_extra = NULL; + + tmp_setting.type = MDFNST_FLOAT; + tmp_setting.default_value = "1.00"; + tmp_setting.minimum = "1.00"; + tmp_setting.maximum = "1.50"; + + settings.push_back(tmp_setting); + analog_scale_made = true; + } + } + butti++; + } +} + + +static void MakeSettingsForPort(std::vector &settings, const MDFNGI *system, const int w, const InputPortInfoStruct *info) +{ +#if 1 + if(info->DeviceInfo.size() > 1) + { + MDFNSetting tmp_setting; + MDFNSetting_EnumList *EnumList; + + memset(&tmp_setting, 0, sizeof(MDFNSetting)); + + EnumList = (MDFNSetting_EnumList *)calloc(sizeof(MDFNSetting_EnumList), info->DeviceInfo.size() + 1); + + for(unsigned device = 0; device < info->DeviceInfo.size(); device++) + { + const InputDeviceInfoStruct *dinfo = &info->DeviceInfo[device]; + + EnumList[device].string = strdup(dinfo->ShortName); + EnumList[device].number = device; + EnumList[device].description = strdup(info->DeviceInfo[device].FullName); + EnumList[device].description_extra = info->DeviceInfo[device].Description ? strdup(info->DeviceInfo[device].Description) : NULL; + + PendingGarbage.push_back((void *)EnumList[device].string); + PendingGarbage.push_back((void *)EnumList[device].description); + } + + PendingGarbage.push_back(EnumList); + + tmp_setting.name = trio_aprintf("%s.input.%s", system->shortname, info->ShortName); + PendingGarbage.push_back((void *)tmp_setting.name); + + tmp_setting.description = trio_aprintf("Input device for %s", info->FullName); + PendingGarbage.push_back((void *)tmp_setting.description); + + tmp_setting.type = MDFNST_ENUM; + tmp_setting.default_value = info->DefaultDevice; + + assert(info->DefaultDevice); + + tmp_setting.flags = MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE; + tmp_setting.description_extra = NULL; + tmp_setting.enum_list = EnumList; + + settings.push_back(tmp_setting); + } +#endif + + for(unsigned device = 0; device < info->DeviceInfo.size(); device++) + { + MakeSettingsForDevice(settings, system, w, &info->DeviceInfo[device]); + } +} + +// Called on emulator startup +void MakeInputSettings(std::vector &settings) +{ + // Construct default button group map + for(unsigned int d = 0; d < sizeof(defset) / sizeof(DefaultSettingsMeow); d++) + DefaultButtonSettingsMap[defset[d].base_name] = &defset[d]; + + // First, build system settings + for(unsigned int x = 0; x < MDFNSystems.size(); x++) + { + assert(MDFNSystems[x]->PortInfo.size() <= 16); + + for(unsigned port = 0; port < MDFNSystems[x]->PortInfo.size(); port++) + MakeSettingsForPort(settings, MDFNSystems[x], port, &MDFNSystems[x]->PortInfo[port]); + } + DefaultButtonSettingsMap.clear(); + + // Now build command key settings + for(int x = 0; x < _CK_COUNT; x++) + { + MDFNSetting tmp_setting; + + memset(&tmp_setting, 0, sizeof(MDFNSetting)); + + CKeysSettingName[x] = trio_aprintf("command.%s", CKeys[x].text); + tmp_setting.name = CKeysSettingName[x]; + PendingGarbage.push_back((void *)( CKeysSettingName[x] )); + + tmp_setting.description = CKeys[x].description; + tmp_setting.type = MDFNST_STRING; + + tmp_setting.flags = MDFNSF_SUPPRESS_DOC | MDFNSF_CAT_INPUT_MAPPING; + tmp_setting.description_extra = NULL; + + PendingGarbage.push_back((void *)( tmp_setting.default_value = strdup(BCsToString(CKeys[x].bc, 2).c_str()) )); + settings.push_back(tmp_setting); + } +} + +void KillGameInput(void) +{ + for(size_t p = 0; p < CurGame->PortInfo.size(); p++) + KillPortInfo(p); +} + +bool InitCommandInput(MDFNGI* gi) +{ + // Load the command key mappings from settings + for(int x = 0; x < _CK_COUNT; x++) + { + CKeysConfig[x].AND_Mode = StringToBC(MDFN_GetSettingS(CKeysSettingName[x]).c_str(), CKeysConfig[x].bc); + } + return(1); +} + +void KillCommandInput(void) +{ + +} + +void KillInputSettings(void) +{ + for(unsigned int x = 0; x < PendingGarbage.size(); x++) + free(PendingGarbage[x]); + + PendingGarbage.clear(); +} + diff --git a/Mednafen/mednafen/drivers/input.h b/Mednafen/mednafen/drivers/input.h new file mode 100644 index 0000000000..72886b025a --- /dev/null +++ b/Mednafen/mednafen/drivers/input.h @@ -0,0 +1,39 @@ +#ifndef _MDFN_DRIVERS_INPUT_H +#define _MDFN_DRIVERS_INPUT_H + +typedef struct { + uint8 ButtType; + uint8 DeviceNum; + uint32 ButtonNum; + uint64 DeviceID; +} ButtConfig; + +#define BUTTC_NONE 0x00 +#define BUTTC_KEYBOARD 0x01 +#define BUTTC_JOYSTICK 0x02 +#define BUTTC_MOUSE 0x03 + +#define MKK(k) SDLK_##k +#define MKK_COUNT (SDLK_LAST+1) + +void Input_Event(const SDL_Event *event); +void MainSetEventHook(int (*eh)(const SDL_Event *event)); // TODO: factor out eventually. + +// Called after a game is loaded. +void InitGameInput(MDFNGI *GI); + +// Called when a game is closed. +void KillGameInput(void); + +void MDFND_UpdateInput(bool VirtualDevicesOnly = false, bool UpdateRapidFire = true); + +void MakeInputSettings(std::vector &settings); +void KillInputSettings(void); // Called after MDFNI_Kill() is called + +extern bool DNeedRewind; // Only read/write in game thread(or before creating game thread). +extern bool RewindState; // " " " " + +bool InitCommandInput(MDFNGI* gi); +void KillCommandInput(void); + +#endif diff --git a/Mednafen/mednafen/drivers/logdebugger.cpp b/Mednafen/mednafen/drivers/logdebugger.cpp new file mode 100644 index 0000000000..b7c84b333c --- /dev/null +++ b/Mednafen/mednafen/drivers/logdebugger.cpp @@ -0,0 +1,287 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: horizontal scrolling + +#include "main.h" +#include "logdebugger.h" +#include "debugger.h" +#include "prompt.h" + +#include +#include +#include +#include + +typedef struct +{ + char *type; + char *text; +} LogEntry; + +class LogInstance +{ + public: + + LogInstance() + { + entries.clear(); + LogScroll = 0; + HScroll = 0; + MaxWidth = 0; + } + + ~LogInstance() + { + + } + + std::vector entries; + uint32 LogScroll; + uint32 HScroll; + uint32 MaxWidth; +}; + +static bool IsActive = FALSE; +static bool LoggingActive = FALSE; + +//static std::vector DeathLog; + +static std::map NeoDeathLog; + +static LogInstance *WhichLog = NULL; + +// Called from the game thread. +static void TheLogger(const char *type, const char *text) +{ + LogEntry nle; + + nle.type = strdup(type); + nle.text = strdup(text); + + NeoDeathLog["All"].entries.push_back(nle); + NeoDeathLog[std::string(type)].entries.push_back(nle); + + if((WhichLog->entries.size() - WhichLog->LogScroll) == 33) + WhichLog->LogScroll++; +} + + +// Call this function from the game thread. +void LogDebugger_SetActive(bool newia) +{ + if(CurGame->Debugger) + { + + + IsActive = newia; + if(newia) + { + if(!WhichLog) + { + WhichLog = &NeoDeathLog["All"]; + } + } + else + { + //InEditMode = FALSE; + //LowNib = FALSE; + } + + } +} + +#define MK_COLOR_A(r,g,b,a) ( pf_cache.MakeColor(r, g, b, a) ) + +// Call this function from the game thread +void LogDebugger_Draw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *screen_rect) +{ + if(!IsActive) return; + + + + const MDFN_PixelFormat pf_cache = surface->format; + uint32 * pixels = surface->pixels; + uint32 pitch32 = surface->pitchinpix; + char logmessage[256]; + + trio_snprintf(logmessage, 256, "%s (%d messages)", LoggingActive ? "Logging Enabled" : "Logging Disabled", (int)WhichLog->entries.size()); + DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, logmessage, MK_COLOR_A(0x20, 0xFF, 0x20, 0xFF), 1, MDFN_FONT_6x13_12x13); + pixels += 13 * pitch32; + + std::map::iterator dl_iter; + uint32 *groups_line = pixels; + + for(dl_iter = NeoDeathLog.begin(); dl_iter != NeoDeathLog.end(); dl_iter++) + { + uint32 group_color = MK_COLOR_A(0x80, 0x80, 0x80, 0xFF); + char group_string[256]; + + trio_snprintf(group_string, 256, "%s(%d)", dl_iter->first.c_str(), (int)dl_iter->second.entries.size()); + + if(&dl_iter->second == WhichLog) + group_color = MK_COLOR_A(0xFF, 0x80, 0x80, 0xFF); + + groups_line += 6 + DrawTextTrans(groups_line, surface->pitchinpix << 2, rect->w, group_string, group_color, 0, MDFN_FONT_6x13_12x13); + +// printf("%s\n", dl_iter->first.c_str()); + } + + //DrawTextTrans(pixels, surface->pitch, rect->w, logmessage, MK_COLOR_A(0x20, 0xFF, 0x20, 0xFF), 1, MDFN_FONT_6x13_12x13); + pixels += 13 * pitch32; + + + for(uint32 i = WhichLog->LogScroll; i < (WhichLog->LogScroll + 32) && i < WhichLog->entries.size(); i++) + { + uint32 typelen; + static const uint32 lifecolors[4] = { MK_COLOR_A(0xe0, 0xd0, 0xd0, 0xFF), MK_COLOR_A(0xd0, 0xe0, 0xd0, 0xFF), + MK_COLOR_A(0xd0, 0xd0, 0xEF, 0xFF), MK_COLOR_A(0xd4, 0xd4, 0xd4, 0xFF) + }; + char tmpbuf[64]; + + trio_snprintf(tmpbuf, 64, "%d", i); + typelen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, tmpbuf, MK_COLOR_A(0x80, 0x80, 0xD0, 0xFF), FALSE, MDFN_FONT_5x7); + typelen += 1; + + typelen += DrawTextTrans(pixels + typelen, surface->pitchinpix << 2, rect->w - typelen, WhichLog->entries[i].type, MK_COLOR_A(0xFF, 0x40, 0x40, 0xFF), FALSE, MDFN_FONT_6x13_12x13); + typelen += 5; + DrawTextTrans(pixels + typelen, surface->pitchinpix << 2, rect->w - typelen, WhichLog->entries[i].text, lifecolors[i & 3], FALSE, MDFN_FONT_6x13_12x13); + pixels += pitch32 * 13; + } + +} + +static void ChangePos(int64 delta) +{ + int64 NewScroll = (int64)WhichLog->LogScroll + delta; + + if(NewScroll > ((int64)WhichLog->entries.size() - 32)) + { + NewScroll = (int64)WhichLog->entries.size() - 32; + } + + if(NewScroll < 0) + { + NewScroll = 0; + } + + WhichLog->LogScroll = NewScroll; +} + +// Warning: Will only work with +1/-1 deltas for now +static void LogGroupSelect(int delta) +{ + std::map::iterator dl_iter; + std::vector acorn_eaters; + int which = 0; + int newt; + + for(dl_iter = NeoDeathLog.begin(); dl_iter != NeoDeathLog.end(); dl_iter++) + { + if(WhichLog == &dl_iter->second) + which = acorn_eaters.size(); + + acorn_eaters.push_back(&dl_iter->second); + } + + newt = which + delta; + + if(newt < 0) + { + newt += acorn_eaters.size(); + } + else + newt %= acorn_eaters.size(); + + WhichLog = acorn_eaters[newt]; + +} + + +// Call this from the game thread +int LogDebugger_Event(const SDL_Event *event) +{ + switch(event->type) + { + case SDL_KEYDOWN: + switch(event->key.keysym.sym) + { + default: break; + + case SDLK_MINUS: Debugger_GT_ModOpacity(-8); + break; + case SDLK_EQUALS: Debugger_GT_ModOpacity(8); + break; + + + case SDLK_HOME: + WhichLog->LogScroll = 0; + + break; + + case SDLK_END: + ChangePos(1 << 30); + + break; + + case SDLK_LEFT: + case SDLK_COMMA: + LogGroupSelect(-1); + + break; + case SDLK_RIGHT: + case SDLK_PERIOD: + LogGroupSelect(1); + + break; + + case SDLK_UP: + ChangePos(-1); + + break; + + case SDLK_DOWN: + ChangePos(1); + + break; + + case SDLK_PAGEUP: + ChangePos(-32); + + break; + + case SDLK_PAGEDOWN: + ChangePos(32); + + break; + + case SDLK_t: + + LoggingActive = !LoggingActive; + if(CurGame->Debugger->SetLogFunc) + CurGame->Debugger->SetLogFunc(LoggingActive ? TheLogger : NULL); + + break; + + + } + break; + + } + return(1); +} + diff --git a/Mednafen/mednafen/drivers/logdebugger.h b/Mednafen/mednafen/drivers/logdebugger.h new file mode 100644 index 0000000000..f2236b54c8 --- /dev/null +++ b/Mednafen/mednafen/drivers/logdebugger.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_DRIVERS_LOGDEBUGGER_H +#define __MDFN_DRIVERS_LOGDEBUGGER_H + +void LogDebugger_Draw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *screen_rect); +int LogDebugger_Event(const SDL_Event *event); +void LogDebugger_SetActive(bool newia); + +#endif + diff --git a/Mednafen/mednafen/drivers/main.cpp b/Mednafen/mednafen/drivers/main.cpp new file mode 100644 index 0000000000..36b54087e8 --- /dev/null +++ b/Mednafen/mednafen/drivers/main.cpp @@ -0,0 +1,2116 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#ifdef WIN32 +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_GETPWUID +#include +#endif + +#ifdef HAVE_ICONV +#include +#endif + +#include + +#include "input.h" +#include "Joystick.h" +#include "video.h" +#include "opengl.h" +#include "shader.h" +#include "sound.h" +#include "netplay.h" +#include "cheat.h" +#include "fps.h" +#include "debugger.h" +#include "help.h" +#include "video-state.h" +#include "remote.h" +#include "ers.h" +#include "rmdui.h" +#include +#include + +JoystickManager *joy_manager = NULL; +bool MDFNDHaveFocus; +static bool RemoteOn = FALSE; +bool pending_save_state, pending_snapshot, pending_ssnapshot, pending_save_movie; +static uint32 volatile MainThreadID = 0; +static bool ffnosound; + +static MDFNSetting_EnumList SDriver_List[] = +{ + { "default", -1, "Default", gettext_noop("Selects the default sound driver.") }, + + { "alsa", -1, "ALSA", gettext_noop("The default for Linux(if available).") }, + { "oss", -1, "Open Sound System", gettext_noop("The default for non-Linux UN*X/POSIX/BSD systems, or anywhere ALSA is unavailable. If the ALSA driver gives you problems, you can try using this one instead.\n\nIf you are using OSSv4 or newer, you should edit \"/usr/lib/oss/conf/osscore.conf\", uncomment the max_intrate= line, and change the value from 100(default) to 1000(or higher if you know what you're doing), and restart OSS. Otherwise, performance will be poor, and the sound buffer size in Mednafen will be orders of magnitude larger than specified.\n\nIf the sound buffer size is still excessively larger than what is specified via the \"sound.buffer_time\" setting, you can try setting \"sound.period_time\" to 2666, and as a last resort, 5333, to work around a design flaw/limitation/choice in the OSS API and OSS implementation.") }, + + { "wasapish", -1, "WASAPI(Shared Mode)", gettext_noop("The default when it's available(running on Microsoft Windows Vista and newer).") }, + + { "dsound", -1, "DirectSound", gettext_noop("The default for Microsoft Windows XP and older.") }, + + { "wasapi", -1, "WASAPI(Exclusive Mode)", gettext_noop("Experimental exclusive-mode WASAPI driver, usable on Windows Vista and newer. Use it for lower-latency sound. May not work properly on all sound cards.") }, + + { "sdl", -1, "Simple Directmedia Layer", gettext_noop("This driver is not recommended, but it serves as a backup driver if the others aren't available. Its performance is generally sub-par, requiring higher latency or faster CPUs/SMP for glitch-free playback, except where the OS provides a sound callback API itself, such as with Mac OS X and BeOS.") }, + + { "jack", -1, "JACK", gettext_noop("The latency reported during startup is for the local sound buffer only and does not include server-side latency. Please note that video card drivers(in the kernel or X), and hardware-accelerated OpenGL, may interfere with jackd's ability to effectively run with realtime response.") }, + + { NULL, 0 }, +}; + + +static std::vector NeoDriverSettings; +static MDFNSetting DriverSettings[] = +{ + { "input.joystick.global_focus", MDFNSF_NOFLAGS, gettext_noop("Update physical joystick(s) internal state in Mednafen even when Mednafen lacks OS focus."), NULL, MDFNST_BOOL, "1" }, + { "input.joystick.axis_threshold", MDFNSF_NOFLAGS, gettext_noop("Analog axis binary press detection threshold."), gettext_noop("Threshold for detecting a digital-like \"button\" press on analog axis, in percent."), MDFNST_FLOAT, "75", "0", "100" }, + { "input.autofirefreq", MDFNSF_NOFLAGS, gettext_noop("Auto-fire frequency."), gettext_noop("Auto-fire frequency = GameSystemFrameRateHz / (value + 1)"), MDFNST_UINT, "3", "0", "1000" }, + { "input.ckdelay", MDFNSF_NOFLAGS, gettext_noop("Dangerous key action delay."), gettext_noop("The length of time, in milliseconds, that a button/key corresponding to a \"dangerous\" command like power, reset, exit, etc. must be pressed before the command is executed."), MDFNST_UINT, "0", "0", "99999" }, + + { "netplay.host", MDFNSF_NOFLAGS, gettext_noop("Server hostname."), NULL, MDFNST_STRING, "netplay.fobby.net" }, + { "netplay.port", MDFNSF_NOFLAGS, gettext_noop("Server port."), NULL, MDFNST_UINT, "4046", "1", "65535" }, + { "netplay.smallfont", MDFNSF_NOFLAGS, gettext_noop("Use small(tiny!) font for netplay chat console."), NULL, MDFNST_BOOL, "0" }, + + { "video.frameskip", MDFNSF_NOFLAGS, gettext_noop("Enable frameskip during emulation rendering."), + gettext_noop("Disable for rendering code performance testing."), MDFNST_BOOL, "1" }, + + { "video.blit_timesync", MDFNSF_NOFLAGS, gettext_noop("Enable time synchronization(waiting) for frame blitting."), + gettext_noop("Disable to reduce latency, at the cost of potentially increased video \"juddering\", with the maximum reduction in latency being about 1 video frame's time.\nWill work best with emulated systems that are not very computationally expensive to emulate, combined with running on a relatively fast CPU."), + MDFNST_BOOL, "1" }, + + { "ffspeed", MDFNSF_NOFLAGS, gettext_noop("Fast-forwarding speed multiplier."), NULL, MDFNST_FLOAT, "4", "1", "15" }, + { "fftoggle", MDFNSF_NOFLAGS, gettext_noop("Treat the fast-forward button as a toggle."), NULL, MDFNST_BOOL, "0" }, + { "ffnosound", MDFNSF_NOFLAGS, gettext_noop("Silence sound output when fast-forwarding."), NULL, MDFNST_BOOL, "0" }, + + { "sfspeed", MDFNSF_NOFLAGS, gettext_noop("SLOW-forwarding speed multiplier."), NULL, MDFNST_FLOAT, "0.75", "0.25", "1" }, + { "sftoggle", MDFNSF_NOFLAGS, gettext_noop("Treat the SLOW-forward button as a toggle."), NULL, MDFNST_BOOL, "0" }, + + { "nothrottle", MDFNSF_NOFLAGS, gettext_noop("Disable speed throttling when sound is disabled."), NULL, MDFNST_BOOL, "0"}, + { "autosave", MDFNSF_NOFLAGS, gettext_noop("Automatic load/save state on game load/save."), gettext_noop("Automatically save and load save states when a game is closed or loaded, respectively."), MDFNST_BOOL, "0"}, + { "sound.driver", MDFNSF_NOFLAGS, gettext_noop("Select sound driver."), gettext_noop("The following choices are possible, sorted by preference, high to low, when \"default\" driver is used, but dependent on being compiled in."), MDFNST_ENUM, "default", NULL, NULL, NULL, NULL, SDriver_List }, + { "sound.device", MDFNSF_NOFLAGS, gettext_noop("Select sound output device."), gettext_noop("When using ALSA sound output under Linux, the \"sound.device\" setting \"default\" is Mednafen's default, IE \"hw:0\", not ALSA's \"default\". If you want to use ALSA's \"default\", use \"sexyal-literal-default\"."), MDFNST_STRING, "default", NULL, NULL }, + { "sound.volume", MDFNSF_NOFLAGS, gettext_noop("Sound volume level, in percent."), gettext_noop("Setting this volume control higher than the default of \"100\" may severely distort the sound."), MDFNST_UINT, "100", "0", "150" }, + { "sound", MDFNSF_NOFLAGS, gettext_noop("Enable sound output."), NULL, MDFNST_BOOL, "1" }, + { "sound.period_time", MDFNSF_NOFLAGS, gettext_noop("Desired period size in microseconds(μs)."), gettext_noop("Currently only affects OSS, ALSA, WASAPI(exclusive mode), and SDL output. A value of 0 defers to the default in the driver code in SexyAL.\n\nNote: This is not the \"sound buffer size\" setting, that would be \"sound.buffer_time\"."), MDFNST_UINT, "0", "0", "100000" }, + { "sound.buffer_time", MDFNSF_NOFLAGS, gettext_noop("Desired buffer size in milliseconds(ms)."), gettext_noop("The default value of 0 enables automatic buffer size selection."), MDFNST_UINT, "0", "0", "1000" }, + { "sound.rate", MDFNSF_NOFLAGS, gettext_noop("Specifies the sound playback rate, in sound frames per second(\"Hz\")."), NULL, MDFNST_UINT, "48000", "22050", "192000"}, + + #ifdef WANT_DEBUGGER + { "debugger.autostepmode", MDFNSF_NOFLAGS, gettext_noop("Automatically go into the debugger's step mode after a game is loaded."), NULL, MDFNST_BOOL, "0" }, + #endif + + { "osd.message_display_time", MDFNSF_NOFLAGS, gettext_noop("Length of time, in milliseconds, to display internal status and error messages"), gettext_noop("Time lengths less than 100ms are recommended against unless you understand you may miss important non-fatal error messages, and that the input configuration process may become unusable."), MDFNST_UINT, "2500", "0", "15000" }, + { "osd.state_display_time", MDFNSF_NOFLAGS, gettext_noop("Length of time, in milliseconds, to display the save state or the movie selector after selecting a state or movie."), NULL, MDFNST_UINT, "2000", "0", "15000" }, + { "osd.alpha_blend", MDFNSF_NOFLAGS, gettext_noop("Enable alpha blending for OSD elements."), NULL, MDFNST_BOOL, "1" }, + + { "srwautoenable", MDFNSF_SUPPRESS_DOC, gettext_noop("DO NOT USE UNLESS YOU'RE A SPACE GOAT"/*"Automatically enable state rewinding functionality on game load."*/), gettext_noop("Use this setting with caution, as save state rewinding can have widely variable memory and CPU usage requirements among different games and different emulated systems."), MDFNST_BOOL, "0" }, +}; + +void BuildSystemSetting(MDFNSetting *setting, const char *system_name, const char *name, const char *description, const char *description_extra, MDFNSettingType type, + const char *default_value, const char *minimum, const char *maximum, + bool (*validate_func)(const char *name, const char *value), void (*ChangeNotification)(const char *name), + const MDFNSetting_EnumList *enum_list) +{ + char setting_name[256]; + + memset(setting, 0, sizeof(MDFNSetting)); + + trio_snprintf(setting_name, 256, "%s.%s", system_name, name); + + setting->name = strdup(setting_name); + setting->flags = MDFNSF_COMMON_TEMPLATE; + setting->description = description; + setting->description_extra = description_extra; + setting->type = type; + setting->default_value = default_value; + setting->minimum = minimum; + setting->maximum = maximum; + setting->validate_func = validate_func; + setting->ChangeNotification = ChangeNotification; + setting->enum_list = enum_list; +} + +// TODO: Actual enum values +static const MDFNSetting_EnumList DisFontSize_List[] = +{ + { "xsmall", -1, gettext_noop("4x5") }, + { "small", -1, gettext_noop("5x7") }, + { "medium", -1, gettext_noop("6x13") }, + { "large", -1, gettext_noop("9x18") }, + { NULL, 0 }, +}; + + +void MakeDebugSettings(std::vector &settings) +{ + #ifdef WANT_DEBUGGER + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + const DebuggerInfoStruct *dbg = MDFNSystems[i]->Debugger; + MDFNSetting setting; + const char *sysname = MDFNSystems[i]->shortname; + + if(!dbg) + continue; + + BuildSystemSetting(&setting, sysname, "debugger.disfontsize", gettext_noop("Disassembly font size."), gettext_noop("Note: Setting the font size to larger than the default may cause text overlap in the debugger."), MDFNST_ENUM, "small", NULL, NULL, NULL, NULL, DisFontSize_List); + settings.push_back(setting); + + BuildSystemSetting(&setting, sysname, "debugger.memcharenc", gettext_noop("Character encoding for the debugger's memory editor."), NULL, MDFNST_STRING, dbg->DefaultCharEnc); + settings.push_back(setting); + } + #endif +} + +static MDFN_Thread* GameThread; +static MDFN_Surface *VTBuffer[2] = { NULL, NULL }; +static int32 *VTLineWidths[2] = { NULL, NULL }; + +static int volatile VTSSnapshot = 0; +static int volatile VTBackBuffer = 0; +static MDFN_Mutex *VTMutex = NULL, *EVMutex = NULL; +static MDFN_Mutex *StdoutMutex = NULL; + +static MDFN_Sem* VTWakeupSem; +static MDFN_Surface * volatile VTReady; +static int32 * volatile VTLWReady; +static MDFN_Rect * volatile VTDRReady; +static int volatile VTInterlaceField; +static MDFN_Rect VTDisplayRects[2]; +static bool sc_blit_timesync; + +static char *soundrecfn=0; /* File name of sound recording. */ + +static char *qtrecfn = NULL; + +static char *DrBaseDirectory; + +MDFNGI *CurGame=NULL; + +void MDFND_PrintError(const char *s) +{ + if(RemoteOn) + Remote_SendErrorMessage(s); + else + { + if(StdoutMutex) + MDFND_LockMutex(StdoutMutex); + + puts(s); + fflush(stdout); + +#if 0 + #ifdef WIN32 + MessageBox(0, s, "Mednafen Error", MB_ICONERROR | MB_OK | MB_SETFOREGROUND | MB_TOPMOST); + #endif +#endif + + if(StdoutMutex) + MDFND_UnlockMutex(StdoutMutex); + } +} + +void MDFND_Message(const char *s) +{ + if(RemoteOn) + Remote_SendStatusMessage(s); + else + { + if(StdoutMutex) + MDFND_LockMutex(StdoutMutex); + + fputs(s,stdout); + fflush(stdout); + + if(StdoutMutex) + MDFND_UnlockMutex(StdoutMutex); + } +} + +static void CreateDirs(void) +{ + static const char *subs[] = { "mcs", "mcm", "snaps", "palettes", "sav", "cheats", "firmware", "pgconfig" }; + + try + { + MDFN_mkdir_T(DrBaseDirectory); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != EEXIST) + throw; + } + + for(auto const& s : subs) + { + std::string tdir = std::string(DrBaseDirectory) + std::string(PSS) + std::string(s); + + try + { + MDFN_mkdir_T(tdir.c_str()); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != EEXIST) + throw; + } + } +} + +#if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + +static const char *SiginfoString = NULL; +static bool volatile SignalSafeExitWanted = false; +typedef struct +{ + int number; + const char *name; + const char *message; + const char *translated; // Needed since gettext() can potentially deadlock when used in a signal handler. + const bool SafeTryExit; +} SignalInfo; + +static SignalInfo SignalDefs[] = +{ + #ifdef SIGINT + { SIGINT, "SIGINT", gettext_noop("How DARE you interrupt me!\n"), NULL, TRUE }, + #endif + + #ifdef SIGTERM + { SIGTERM, "SIGTERM", gettext_noop("MUST TERMINATE ALL HUMANS\n"), NULL, TRUE }, + #endif + + #ifdef SIGHUP + { SIGHUP, "SIGHUP", gettext_noop("Reach out and hang-up on someone.\n"), NULL, FALSE }, + #endif + + #ifdef SIGSEGV + { SIGSEGV, "SIGSEGV", gettext_noop("Iyeeeeeeeee!!! A segmentation fault has occurred. Have a fluffy day.\n"), NULL, FALSE }, + #endif + + #ifdef SIGPIPE + { SIGPIPE, "SIGPIPE", gettext_noop("The pipe has broken! Better watch out for floods...\n"), NULL, FALSE }, + #endif + + #if defined(SIGBUS) && SIGBUS != SIGSEGV + /* SIGBUS can == SIGSEGV on some platforms */ + { SIGBUS, "SIGBUS", gettext_noop("I told you to be nice to the driver.\n"), NULL, FALSE }, + #endif + + #ifdef SIGFPE + { SIGFPE, "SIGFPE", gettext_noop("Those darn floating points. Ne'er know when they'll bite!\n"), NULL, FALSE }, + #endif + + #ifdef SIGALRM + { SIGALRM, "SIGALRM", gettext_noop("Don't throw your clock at the meowing cats!\n"), NULL, TRUE }, + #endif + + #ifdef SIGABRT + { SIGABRT, "SIGABRT", gettext_noop("Abort, Retry, Ignore, Fail?\n"), NULL, FALSE }, + #endif + + #ifdef SIGUSR1 + { SIGUSR1, "SIGUSR1", gettext_noop("Killing your processes is not nice.\n"), NULL, TRUE }, + #endif + + #ifdef SIGUSR2 + { SIGUSR2, "SIGUSR2", gettext_noop("Killing your processes is not nice.\n"), NULL, TRUE }, + #endif +}; + +static volatile int SignalSTDOUT; + +static void SetSignals(void (*t)(int)) +{ + SignalSTDOUT = fileno(stdout); + + SiginfoString = _("\nSignal has been caught and dealt with: "); + for(unsigned int x = 0; x < sizeof(SignalDefs) / sizeof(SignalInfo); x++) + { + if(!SignalDefs[x].translated) + SignalDefs[x].translated = _(SignalDefs[x].message); + + #ifdef HAVE_SIGACTION + struct sigaction act; + + memset(&act, 0, sizeof(struct sigaction)); + + act.sa_handler = t; + act.sa_flags = SA_RESTART; + + sigaction(SignalDefs[x].number, &act, NULL); + #else + signal(SignalDefs[x].number, t); + #endif + } +} + +static void SignalPutString(const char *string) +{ + size_t count = 0; + + while(string[count]) { count++; } + + write(SignalSTDOUT, string, count); +} + +static void CloseStuff(int signum) +{ + const int save_errno = errno; + const char *name = "unknown"; + const char *translated = NULL; + bool safetryexit = false; + + for(unsigned int x = 0; x < sizeof(SignalDefs) / sizeof(SignalInfo); x++) + { + if(SignalDefs[x].number == signum) + { + name = SignalDefs[x].name; + translated = SignalDefs[x].translated; + safetryexit = SignalDefs[x].SafeTryExit; + break; + } + } + + SignalPutString(SiginfoString); + SignalPutString(name); + SignalPutString("\n"); + SignalPutString(translated); + + if(safetryexit) + { + SignalSafeExitWanted = safetryexit; + errno = save_errno; + return; + } + + _exit(1); +} +#endif + +// +// +// +#include +#include +static void Stream64Test(const char* path) +{ + try + { + { + FileStream fp(path, FileStream::MODE_WRITE_SAFE); + + assert(fp.tell() == 0); + assert(fp.size() == 0); + fp.put_BE(0xDEADBEEF); + assert(fp.tell() == 4); + assert(fp.size() == 4); + + fp.seek((uint64)8192 * 1024 * 1024, SEEK_SET); + fp.put_BE(0xCAFEBABE); + assert(fp.tell() == (uint64)8192 * 1024 * 1024 + 4); + assert(fp.size() == (uint64)8192 * 1024 * 1024 + 4); + + fp.put_BE(0xAAAAAAAA); + assert(fp.tell() == (uint64)8192 * 1024 * 1024 + 8); + assert(fp.size() == (uint64)8192 * 1024 * 1024 + 8); + + fp.truncate((uint64)8192 * 1024 * 1024 + 4); + assert(fp.size() == (uint64)8192 * 1024 * 1024 + 4); + + fp.seek(-((uint64)8192 * 1024 * 1024 + 8), SEEK_CUR); + assert(fp.tell() == 0); + fp.seek((uint64)-4, SEEK_END); + assert(fp.tell() == (uint64)8192 * 1024 * 1024); + } + + { + FileStream fp(path, FileStream::MODE_READ); + uint32 tmp; + + assert(fp.size() == (uint64)8192 * 1024 * 1024 + 4); + tmp = fp.get_LE(); + assert(tmp == 0xEFBEADDE); + fp.seek((uint64)8192 * 1024 * 1024 - 4, SEEK_CUR); + tmp = fp.get_LE(); + assert(tmp == 0xBEBAFECA); + } + + { + GZFileStream fp(path, GZFileStream::MODE::READ); + uint32 tmp; + + tmp = fp.get_LE(); + assert(tmp == 0xEFBEADDE); + fp.seek((uint64)8192 * 1024 * 1024 - 4, SEEK_CUR); + tmp = fp.get_LE(); + assert(tmp == 0xBEBAFECA); + assert(fp.tell() == (uint64)8192 * 1024 * 1024 + 4); + } + } + catch(std::exception& e) + { + printf("%s\n", e.what()); + abort(); + } +} +// +// +// +#include +static void CDTest(const char* path) +{ + try + { + CDIF* cds[2]; + CDUtility::TOC toc[2]; + + cds[0] = CDIF_Open(path, false); + cds[1] = CDIF_Open(path, true); + + for(unsigned i = 0; i < 2; i++) + cds[0]->ReadTOC(&toc[i]); + + assert(!memcmp(&toc[0], &toc[1], sizeof(CDUtility::TOC))); + + srand(0xDEADBEEF); + + for(int32 lba = -150; lba < (int32)toc[0].tracks[100].lba + 5*60*75; lba++) + { + uint8 secbuf[2][2352 + 96]; + uint8 pwobuf[2][96]; + + for(unsigned i = 0; i < 2; i++) + { + for(unsigned sbj = 0; sbj < 2352 + 96; sbj++) + secbuf[i][sbj] = rand() >> 8; + + for(unsigned sbj = 0; sbj < 96; sbj++) + pwobuf[i][sbj] = rand() >> 8; + + cds[i]->ReadRawSector(secbuf[i], lba); + cds[i]->ReadRawSectorPWOnly(pwobuf[i], lba, true); + + for(unsigned p = 0; p < 96; p++) + assert(secbuf[i][2352 + p] == pwobuf[i][p]); + } + assert(!memcmp(secbuf[0], secbuf[1], 2352 + 96)); + assert(!memcmp(pwobuf[0], pwobuf[1], 96)); + + uint8 subq[12]; + CDUtility::subq_deinterleave(pwobuf[0], subq); + if(CDUtility::subq_check_checksum(subq)) + { + /*if(lba == 0 || lba == 1) + { + for(unsigned i = 0; i < 12; i++) + printf("0x%02x ", subq[i]); + printf("\n"); + }*/ + } + else + printf("SubQ checksum error at lba=%d\n", lba); + } + } + catch(std::exception& e) + { + printf("%s\n", e.what()); + abort(); + } + + printf("CDTest Done.\n"); +} +// +// +// +static ARGPSTRUCT *MDFN_Internal_Args = NULL; + +static int HokeyPokeyFallDown(const char *name, const char *value) +{ + if(!MDFNI_SetSetting(name, value)) + return(0); + return(1); +} + +static void DeleteInternalArgs(void) +{ + if(!MDFN_Internal_Args) return; + ARGPSTRUCT *argptr = MDFN_Internal_Args; + + do + { + free((void*)argptr->name); + argptr++; + } while(argptr->name || argptr->var || argptr->subs); + free(MDFN_Internal_Args); + MDFN_Internal_Args = NULL; +} + +static void MakeMednafenArgsStruct(void) +{ + const std::multimap *settings; + std::multimap ::const_iterator sit; + + settings = MDFNI_GetSettings(); + + MDFN_Internal_Args = (ARGPSTRUCT *)malloc(sizeof(ARGPSTRUCT) * (1 + settings->size())); + + unsigned int x = 0; + + for(sit = settings->begin(); sit != settings->end(); sit++) + { + MDFN_Internal_Args[x].name = strdup(sit->second.name); + MDFN_Internal_Args[x].description = sit->second.desc->description ? _(sit->second.desc->description) : NULL; + MDFN_Internal_Args[x].var = NULL; + MDFN_Internal_Args[x].subs = (void *)HokeyPokeyFallDown; + MDFN_Internal_Args[x].substype = SUBSTYPE_FUNCTION; + x++; + } + MDFN_Internal_Args[x].name = NULL; + MDFN_Internal_Args[x].var = NULL; + MDFN_Internal_Args[x].subs = NULL; +} + +static int netconnect = 0; +static char* loadcd = NULL; // Deprecated + +static char * force_module_arg = NULL; +static int DoArgs(int argc, char *argv[], char **filename) +{ + int ShowCLHelp = 0; + + char *dsfn = NULL; + char *dmfn = NULL; + char *dummy_remote = NULL; + char *stream64testpath = NULL; + char *cdtestpath = NULL; + + ARGPSTRUCT MDFNArgs[] = + { + { "help", _("Show help!"), &ShowCLHelp, 0, 0 }, + { "remote", _("Enable remote mode with the specified stdout key(EXPERIMENTAL AND INCOMPLETE)."), 0, &dummy_remote, SUBSTYPE_STRING_ALLOC }, + + // -loadcd is deprecated and only still supported because it's been around for yeaaaars. + { "loadcd", NULL/*_("Load and boot a CD for the specified system.")*/, 0, &loadcd, SUBSTYPE_STRING_ALLOC }, + + { "force_module", _("Force usage of specified emulation module."), 0, &force_module_arg, SUBSTYPE_STRING_ALLOC }, + + { "soundrecord", _("Record sound output to the specified filename in the MS WAV format."), 0,&soundrecfn, SUBSTYPE_STRING_ALLOC }, + { "qtrecord", _("Record video and audio output to the specified filename in the QuickTime format."), 0, &qtrecfn, SUBSTYPE_STRING_ALLOC }, // TODOC: Video recording done without filtering applied. + + { "dump_settings_def", _("Dump settings definition data to specified file."), 0, &dsfn, SUBSTYPE_STRING_ALLOC }, + { "dump_modules_def", _("Dump modules definition data to specified file."), 0, &dmfn, SUBSTYPE_STRING_ALLOC }, + + { 0, NULL, (int *)MDFN_Internal_Args, 0, 0}, + + { "connect", _("Connect to the remote server and start network play."), &netconnect, 0, 0 }, + + // Testing functionality for FileStream and GZFileStream largefile support(mostly intended for testing the Windows builds) + { "stream64test", NULL, 0, &stream64testpath, SUBSTYPE_STRING_ALLOC }, + + { "cdtest", NULL, 0, &cdtestpath, SUBSTYPE_STRING_ALLOC }, + + { 0, 0, 0, 0 } + }; + + const char *usage_string = _("Usage: %s [OPTION]... [FILE]\n"); + if(argc <= 1) + { + printf(_("No command-line arguments specified.\n\n")); + printf(usage_string, argv[0]); + printf(_("\tPlease refer to the documentation for option parameters and usage.\n\n")); + return(0); + } + else + { + if(!ParseArguments(argc - 1, &argv[1], MDFNArgs, filename)) + return(0); + + if(dummy_remote) + { + free(dummy_remote); + dummy_remote = NULL; + } + + if(ShowCLHelp) + { + printf(usage_string, argv[0]); + ShowArgumentsHelp(MDFNArgs, false); + printf("\n"); + printf(_("Each setting(listed in the documentation) can also be passed as an argument by prefixing the name with a hyphen,\nand specifying the value to change the setting to as the next argument.\n\n")); + printf(_("For example:\n\t%s -pce.stretch aspect -pce.pixshader autoipsharper \"Hyper Bonk Soldier.pce\"\n\n"), argv[0]); + printf(_("Settings specified in this manner are automatically saved to the configuration file, hence they\ndo not need to be passed to future invocations of the Mednafen executable.\n")); + printf("\n"); + return(0); + } + + if(stream64testpath) + { + Stream64Test(stream64testpath); + free(stream64testpath); + stream64testpath = NULL; + } + + if(cdtestpath) + { + CDTest(cdtestpath); + free(cdtestpath); + cdtestpath = NULL; + } + + if(dsfn) + MDFNI_DumpSettingsDef(dsfn); + + if(dmfn) + MDFNI_DumpModulesDef(dmfn); + + if(dsfn || dmfn) + return(0); + + if(*filename == NULL) + { + MDFN_PrintError(_("No game filename specified!")); + return(0); + } + } + return(1); +} + +static int volatile NeedVideoChange = 0; +int GameLoop(void *arg); +int volatile GameThreadRun = 0; +bool MDFND_Update(MDFN_Surface *surface, MDFN_Rect *rect, int32 *lw, int InterlaceField, int16 *Buffer, int Count); + +bool sound_active; // true if sound is enabled and initialized + + +static EmuRealSyncher ers; + +static int LoadGame(const char *force_module, const char *path) +{ + MDFNGI *tmp; + + CloseGame(); + + pending_save_state = 0; + pending_save_movie = 0; + pending_snapshot = 0; + pending_ssnapshot = 0; + + if(loadcd) // Deprecated + { + if(!(tmp = MDFNI_LoadCD(loadcd ? loadcd : force_module, path))) + return(0); + } + else + { + if(!(tmp=MDFNI_LoadGame(force_module, path))) + return 0; + } + + CurGame = tmp; + InitGameInput(tmp); + InitCommandInput(tmp); + RMDUI_Init(tmp); + + RefreshThrottleFPS(1); + + MDFND_LockMutex(VTMutex); + NeedVideoChange = -1; + MDFND_UnlockMutex(VTMutex); + + if(MDFND_ThreadID() != MainThreadID) + { + MDFND_PostSem(VTWakeupSem); + while(NeedVideoChange) + { + SDL_Delay(2); + } + } + sound_active = 0; + + sc_blit_timesync = MDFN_GetSettingB("video.blit_timesync"); + + if(MDFN_GetSettingB("sound")) + sound_active = Sound_Init(tmp); + + if(MDFN_GetSettingB("autosave")) + MDFNI_LoadState(NULL, "mca"); + + if(netconnect) + MDFND_NetworkConnect(); + + ers.SetEmuClock(CurGame->MasterClock >> 32); + + Debugger_Init(); + + if(qtrecfn) + { + // MDFNI_StartAVRecord() needs to be called after MDFNI_Load(Game/CD) + if(!MDFNI_StartAVRecord(qtrecfn, Sound_GetRate())) + { + free(qtrecfn); + qtrecfn = NULL; + + return(0); + } + } + + if(soundrecfn) + { + if(!MDFNI_StartWAVRecord(soundrecfn, Sound_GetRate())) + { + free(soundrecfn); + soundrecfn = NULL; + + return(0); + } + } + + ffnosound = MDFN_GetSettingB("ffnosound"); + RewindState = MDFN_GetSettingB("srwautoenable"); + if(RewindState) + { + MDFN_DispMessage(_("State rewinding functionality enabled.")); + MDFNI_EnableStateRewind(RewindState); + } + + // + // Game thread creation should come lastish. + // + GameThreadRun = 1; + GameThread = MDFND_CreateThread(GameLoop, NULL); + + return 1; +} + +/* Closes a game and frees memory. */ +int CloseGame(void) +{ + if(!CurGame) return(0); + + GameThreadRun = 0; + + MDFND_WaitThread(GameThread, NULL); + + if(qtrecfn) // Needs to be before MDFNI_Closegame() for now + MDFNI_StopAVRecord(); + + if(soundrecfn) + MDFNI_StopWAVRecord(); + + if(MDFN_GetSettingB("autosave")) + MDFNI_SaveState(NULL, "mca", NULL, NULL, NULL); + + MDFND_NetworkClose(); + + Debugger_Kill(); + + MDFNI_CloseGame(); + + RMDUI_Kill(); + KillCommandInput(); + KillGameInput(); + Sound_Kill(); + + CurGame = NULL; + + return(1); +} + +static void GameThread_HandleEvents(void); +static int volatile NeedExitNow = 0; // Set 'true' in various places, including signal handler. +double CurGameSpeed = 1; + +void MainRequestExit(void) +{ + NeedExitNow = 1; +} + +bool MainExitPending(void) // Called from netplay code, so we can break out of blocking loops after receiving a signal. +{ + return (bool)NeedExitNow; +} + +static bool InFrameAdvance = 0; +static bool NeedFrameAdvance = 0; + +bool IsInFrameAdvance(void) +{ + return InFrameAdvance; +} + +void DoRunNormal(void) +{ + NeedFrameAdvance = 0; + InFrameAdvance = 0; +} + +void DoFrameAdvance(void) +{ + NeedFrameAdvance |= InFrameAdvance; + InFrameAdvance = 1; +} + +static int GameLoopPaused = 0; + +void DebuggerFudge(void) +{ + MDFND_Update((MDFN_Surface *)VTBuffer[VTBackBuffer ^ 1], (MDFN_Rect*)&VTDisplayRects[VTBackBuffer ^ 1], (int32*)VTLineWidths[VTBackBuffer ^ 1], VTInterlaceField, NULL, 0); + + if(sound_active) + Sound_WriteSilence(10); + else + SDL_Delay(10); +} + +int64 Time64(void) +{ + static bool cgt_fail_warning = 0; + + #if HAVE_CLOCK_GETTIME && ( _POSIX_MONOTONIC_CLOCK > 0 || defined(CLOCK_MONOTONIC)) + struct timespec tp; + + if(clock_gettime(CLOCK_MONOTONIC, &tp) == -1) + { + if(!cgt_fail_warning) + fprintf(stderr, "clock_gettime() failed: %s\n", strerror(errno)); + cgt_fail_warning = 1; + } + else + return((int64)tp.tv_sec * 1000000 + tp.tv_nsec / 1000); + + #else + #warning "clock_gettime() with CLOCK_MONOTONIC not available" + #endif + + + #if HAVE_GETTIMEOFDAY + // Warning: gettimeofday() is not guaranteed to be monotonic!! + struct timeval tv; + + if(gettimeofday(&tv, NULL) == -1) + { + fprintf(stderr, "gettimeofday() error"); + return(0); + } + + return((int64)tv.tv_sec * 1000000 + tv.tv_usec); + #else + #warning "gettimeofday() not available!!!" + #endif + + // Yeaaah, this isn't going to work so well. + return((int64)time(NULL) * 1000000); +} + +int GameLoop(void *arg) +{ + while(GameThreadRun) + { + int16 *sound; + int32 ssize; + int fskip; + + /* If we requested a new video mode, wait until it's set before calling the emulation code again. + */ + while(NeedVideoChange) + { + if(!GameThreadRun) return(1); // Might happen if video initialization failed + SDL_Delay(2); + } + do + { + if(InFrameAdvance && !NeedFrameAdvance) + { + SDL_Delay(10); + } + } while(InFrameAdvance && !NeedFrameAdvance); + + + if(Sound_NeedReInit()) + GT_ReinitSound(); + + if(MDFNDnetplay && !(NoWaiting & 0x2)) // TODO: Hacky, clean up. + ers.SetETtoRT(); + + fskip = ers.NeedFrameSkip(); + + if(!MDFN_GetSettingB("video.frameskip")) + fskip = 0; + + if(pending_ssnapshot || pending_snapshot || pending_save_state || pending_save_movie || NeedFrameAdvance) + fskip = 0; + + NeedFrameAdvance = 0; + + if(NoWaiting) + fskip = 1; + + VTLineWidths[VTBackBuffer][0] = ~0; + + int ThisBackBuffer = VTBackBuffer; + + // + // + // + EmulateSpecStruct espec; + + memset(&espec, 0, sizeof(EmulateSpecStruct)); + + espec.surface = (MDFN_Surface *)VTBuffer[VTBackBuffer]; + espec.LineWidths = (int32 *)VTLineWidths[VTBackBuffer]; + espec.skip = fskip; + espec.soundmultiplier = CurGameSpeed; + espec.NeedRewind = DNeedRewind; + + espec.SoundRate = Sound_GetRate(); + espec.SoundBuf = Sound_GetEmuModBuffer(&espec.SoundBufMaxSize); + espec.SoundVolume = (double)MDFN_GetSettingUI("sound.volume") / 100; + + MDFNI_Emulate(&espec); + + ers.AddEmuTime((espec.MasterCycles - espec.MasterCyclesALMS) / CurGameSpeed); + + + VTDisplayRects[VTBackBuffer] = espec.DisplayRect; + + sound = espec.SoundBuf + (espec.SoundBufSizeALMS * CurGame->soundchan); + ssize = espec.SoundBufSize - espec.SoundBufSizeALMS; + // + // + // + + FPS_IncVirtual(); + if(!fskip) + FPS_IncDrawn(); + + + do + { + VTBackBuffer = ThisBackBuffer; + + if(fskip && GameLoopPaused) + { + // If this frame was skipped, and the game loop is paused(IE cheat interface is active), just blit the previous "successful" frame so the cheat + // interface actually gets drawn. + // + // Needless to say, do not do "VTBackBuffer ^= 1;" here. + // + // Possible problems with this kludgery: + // Will fail spectacularly if there is no previous successful frame. BOOOOOOM. (But there always should be, especially since we initialize some + // of the video buffer and rect structures during startup) + // + MDFND_Update((MDFN_Surface *)VTBuffer[VTBackBuffer ^ 1], (MDFN_Rect*)&VTDisplayRects[VTBackBuffer ^ 1], (int32*)VTLineWidths[VTBackBuffer ^ 1], VTInterlaceField, sound, ssize); + } + else + { + if(MDFND_Update(fskip ? NULL : (MDFN_Surface *)VTBuffer[VTBackBuffer], (MDFN_Rect*)&VTDisplayRects[VTBackBuffer], (int32*)VTLineWidths[VTBackBuffer], espec.InterlaceOn ? espec.InterlaceField : -1, sound, ssize)) + VTBackBuffer ^= 1; + } + + FPS_UpdateCalc(); + + if((InFrameAdvance && !NeedFrameAdvance) || GameLoopPaused) + { + if(ssize) + for(int x = 0; x < CurGame->soundchan * ssize; x++) + sound[x] = 0; + } + } while(((InFrameAdvance && !NeedFrameAdvance) || GameLoopPaused) && GameThreadRun); + } + return(1); +} + +char *GetBaseDirectory(void) +{ + char *ol; + char *ret; + + ol = getenv("MEDNAFEN_HOME"); + if(ol != NULL && ol[0] != 0) + { + ret = strdup(ol); + return(ret); + } + + ol = getenv("HOME"); + + if(ol) + { + ret=(char *)malloc(strlen(ol)+1+strlen(PSS ".mednafen")); + strcpy(ret,ol); + strcat(ret,PSS ".mednafen"); + return(ret); + } + + #if defined(HAVE_GETUID) && defined(HAVE_GETPWUID) + { + struct passwd *psw; + + psw = getpwuid(getuid()); + + if(psw != NULL && psw->pw_dir[0] != 0 && strcmp(psw->pw_dir, "/dev/null")) + { + ret = (char *)malloc(strlen(psw->pw_dir) + 1 + strlen(PSS ".mednafen")); + strcpy(ret, psw->pw_dir); + strcat(ret, PSS ".mednafen"); + return(ret); + } + } + #endif + + #ifdef WIN32 + { + char *sa; + + ret=(char *)malloc(MAX_PATH+1); + GetModuleFileName(NULL,ret,MAX_PATH+1); + + sa=strrchr(ret,'\\'); + if(sa) + *sa = 0; + return(ret); + } + #endif + + ret = (char *)malloc(1); + ret[0] = 0; + return(ret); +} + +static const int gtevents_size = 2048; // Must be a power of 2. +static volatile SDL_Event gtevents[gtevents_size]; +static volatile int gte_read = 0; +static volatile int gte_write = 0; + +/* This function may also be called by the main thread if a game is not loaded. */ +static void GameThread_HandleEvents(void) +{ + SDL_Event gtevents_temp[gtevents_size]; + unsigned int numevents = 0; + + MDFND_LockMutex(EVMutex); + while(gte_read != gte_write) + { + memcpy(>events_temp[numevents], (void *)>events[gte_read], sizeof(SDL_Event)); + + numevents++; + gte_read = (gte_read + 1) & (gtevents_size - 1); + } + MDFND_UnlockMutex(EVMutex); + + for(unsigned int i = 0; i < numevents; i++) + { + SDL_Event *event = >events_temp[i]; + + switch(event->type) + { + case SDL_USEREVENT: + switch(event->user.code) + { + case CEVT_SET_INPUT_FOCUS: + MDFNDHaveFocus = (bool)((char*)event->user.data1 - (char*)0); + //printf("%u\n", MDFNDHaveFocus); + break; + } + break; + } + + Input_Event(event); + + if(Debugger_IsActive()) + Debugger_GT_Event(event); + + NetplayEventHook_GT(event); + } +} + +void PauseGameLoop(bool p) +{ + GameLoopPaused = p; +} + + +void SendCEvent(unsigned int code, void *data1, void *data2) +{ + SDL_Event evt; + evt.user.type = SDL_USEREVENT; + evt.user.code = code; + evt.user.data1 = data1; + evt.user.data2 = data2; + SDL_PushEvent(&evt); +} + +void SendCEvent_to_GT(unsigned int code, void *data1, void *data2) +{ + SDL_Event evt; + evt.user.type = SDL_USEREVENT; + evt.user.code = code; + evt.user.data1 = data1; + evt.user.data2 = data2; + + MDFND_LockMutex(EVMutex); + memcpy((void *)>events[gte_write], &evt, sizeof(SDL_Event)); + gte_write = (gte_write + 1) & (gtevents_size - 1); + MDFND_UnlockMutex(EVMutex); +} + +void SDL_MDFN_ShowCursor(int toggle) +{ + int *toog = (int *)malloc(sizeof(int)); + *toog = toggle; + + SDL_Event evt; + evt.user.type = SDL_USEREVENT; + evt.user.code = CEVT_SHOWCURSOR; + evt.user.data1 = toog; + SDL_PushEvent(&evt); + +} + +void GT_ToggleFS(void) +{ + MDFND_LockMutex(VTMutex); + NeedVideoChange = 1; + MDFND_UnlockMutex(VTMutex); + + if(MDFND_ThreadID() != MainThreadID) + { + MDFND_PostSem(VTWakeupSem); + while(NeedVideoChange) + { + SDL_Delay(2); + } + } +} + +bool GT_ReinitVideo(void) +{ + MDFND_LockMutex(VTMutex); + NeedVideoChange = -1; + MDFND_UnlockMutex(VTMutex); + + if(MDFND_ThreadID() != MainThreadID) + { + MDFND_PostSem(VTWakeupSem); + while(NeedVideoChange) + { + SDL_Delay(2); + } + } + + return(true); // FIXME! +} + +bool GT_ReinitSound(void) +{ + bool ret = true; + + Sound_Kill(); + sound_active = 0; + + if(MDFN_GetSettingB("sound")) + { + sound_active = Sound_Init(CurGame); + if(!sound_active) + ret = false; + } + + return(ret); +} + +static bool krepeat = 0; +void PumpWrap(void) +{ + SDL_Event event; + SDL_Event gtevents_temp[gtevents_size]; + int numevents = 0; + + bool NITI; + + NITI = Netplay_IsTextInput(); + + if(Debugger_IsActive() || NITI || CheatIF_Active() || Help_IsActive()) + { + if(!krepeat) + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + krepeat = 1; + } + else + { + if(krepeat) + SDL_EnableKeyRepeat(0, 0); + krepeat = 0; + } + + #if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + if(SignalSafeExitWanted) + NeedExitNow = true; + #endif + + while(SDL_PollEvent(&event)) + { + if(CheatIF_Active()) + CheatIF_MT_EventHook(&event); + + NetplayEventHook(&event); + + /* Handle the event, and THEN hand it over to the GUI. Order is important due to global variable mayhem(CEVT_TOGGLEFS. */ + switch(event.type) + { + case SDL_ACTIVEEVENT: + if(event.active.state & SDL_APPINPUTFOCUS) + { + SendCEvent_to_GT(CEVT_SET_INPUT_FOCUS, (char*)0 + (bool)event.active.gain, NULL); + } + break; + + case SDL_SYSWMEVENT: break; + //case SDL_VIDEORESIZE: //if(VideoResize(event.resize.w, event.resize.h)) + // NeedVideoChange = -1; + // break; + + case SDL_VIDEOEXPOSE: break; + case SDL_QUIT: NeedExitNow = 1;break; + case SDL_USEREVENT: + switch(event.user.code) + { + case CEVT_SET_STATE_STATUS: MT_SetStateStatus((StateStatusStruct *)event.user.data1); break; + case CEVT_SET_MOVIE_STATUS: MT_SetMovieStatus((StateStatusStruct *)event.user.data1); break; + case CEVT_WANT_EXIT: + if(!Netplay_TryTextExit()) + { + SDL_Event evt; + evt.quit.type = SDL_QUIT; + SDL_PushEvent(&evt); + } + break; + case CEVT_SET_GRAB_INPUT: + SDL_WM_GrabInput(*(uint8 *)event.user.data1 ? SDL_GRAB_ON : SDL_GRAB_OFF); + free(event.user.data1); + break; + //case CEVT_TOGGLEFS: NeedVideoChange = 1; break; + //case CEVT_VIDEOSYNC: NeedVideoChange = -1; break; + case CEVT_SHOWCURSOR: SDL_ShowCursor(*(int *)event.user.data1); free(event.user.data1); break; + case CEVT_DISP_MESSAGE: VideoShowMessage((char*)event.user.data1); break; + default: + if(numevents < gtevents_size) + { + memcpy(>events_temp[numevents], &event, sizeof(SDL_Event)); + numevents++; + } + break; + } + break; + default: + if(numevents < gtevents_size) + { + memcpy(>events_temp[numevents], &event, sizeof(SDL_Event)); + numevents++; + } + break; + } + } + + if(numevents > 0) + { + MDFND_LockMutex(EVMutex); + for(int i = 0; i < numevents; i++) + { + memcpy((void *)>events[gte_write], >events_temp[i], sizeof(SDL_Event)); + gte_write = (gte_write + 1) & (gtevents_size - 1); + } + MDFND_UnlockMutex(EVMutex); + } + + if(!CurGame) + GameThread_HandleEvents(); +} + +void RefreshThrottleFPS(double multiplier) +{ + CurGameSpeed = multiplier; +} + +void PrintCompilerVersion(void) +{ + #if defined(__GNUC__) + MDFN_printf(_("Compiled with gcc %s\n"), __VERSION__); + #endif + + #ifdef HAVE___MINGW_GET_CRT_INFO + MDFN_printf(_("Running with %s\n"), __mingw_get_crt_info()); + #endif +} + +#if 0 +#include // To make sure we pick up c++config.h if it's there +void PrintGLIBCXXInfo(void) +{ + #if defined(__GLIBCXX__) + MDFN_printf(_("Compiled with GNU libstdc++ %lu\n"), (unsigned long)__GLIBCXX__); + { + MDFN_AutoIndent aind(1); + const char* sjljresp; + #if defined(_GLIBCXX_SJLJ_EXCEPTIONS) + sjljresp = _("Yes"); + #else + sjljresp = _("No"); + #endif + MDFN_printf(_("Using SJLJ Exceptions: %s\n"), sjljresp); + } + #endif +} +#endif + +void PrintSDLVersion(void) +{ + const SDL_version *sver = SDL_Linked_Version(); + + MDFN_printf(_("Compiled against SDL %u.%u.%u, running with SDL %u.%u.%u\n"), SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL, sver->major, sver->minor, sver->patch); +} + +#ifdef HAVE_LIBSNDFILE + #include +#endif + +void PrintLIBSNDFILEVersion(void) +{ + #ifdef HAVE_LIBSNDFILE + MDFN_printf(_("Running with %s\n"), sf_version_string()); + #endif +} + +#include +void PrintZLIBVersion(void) +{ + #ifdef ZLIB_VERSION + MDFN_printf(_("Compiled against zlib %s, running with zlib %s(flags=0x%08lx)\n"), ZLIB_VERSION, zlibVersion(), (unsigned long)zlibCompileFlags()); + #endif +} + +void PrintLIBICONVVersion(void) +{ + #ifdef _LIBICONV_VERSION + MDFN_printf(_("Compiled against libiconv %u.%u, running with libiconv %u.%u\n"), _LIBICONV_VERSION & 0xFF, _LIBICONV_VERSION >> 8, + _libiconv_version & 0xFF, _libiconv_version >> 8); + #endif +} + +//#include + +#if 0//#ifdef WIN32 +char *GetFileDialog(void) +{ + OPENFILENAME ofn; + char returned_fn[2048]; + std::string filter; + bool first_extension = true; + + filter = std::string("Recognized files"); + filter.push_back(0); + + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + if(MDFNSystems[i]->FileExtensions) + { + const FileExtensionSpecStruct *fesc = MDFNSystems[i]->FileExtensions; + + while(fesc->extension && fesc->description) + { + if(!first_extension) + filter.push_back(';'); + + filter.push_back('*'); + filter += std::string(fesc->extension); + + first_extension = false; + fesc++; + } + } + } + + filter.push_back(0); + filter.push_back(0); + + //fwrite(filter.data(), 1, filter.size(), stdout); + + memset(&ofn, 0, sizeof(ofn)); + + ofn.lStructSize = sizeof(ofn); + ofn.lpstrTitle = "Mednafen Open File"; + ofn.lpstrFilter = filter.data(); + + ofn.nMaxFile = sizeof(returned_fn); + ofn.lpstrFile = returned_fn; + + ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; + + if(GetOpenFileName(&ofn)) + return(strdup(returned_fn)); + + return(NULL); +} +#endif + +#if 0 +static MDFN_Mutex* milk_mutex = NULL; +static MDFN_Cond* milk_cond = NULL; +static volatile unsigned cow_milk = 0; +static volatile unsigned farmer_milk = 0; +static volatile unsigned calf_milk = 0; +static volatile unsigned am3000_milk = 0; + +static int CowEntry(void*) +{ + uint32 start_time = SDL_GetTicks(); + + for(unsigned i = 0; i < 1000 * 1000; i++) + { + MDFND_LockMutex(milk_mutex); + cow_milk++; + + MDFND_SignalCond(milk_cond); + MDFND_UnlockMutex(milk_mutex); + + while(cow_milk != 0); + } + + while(cow_milk != 0); + + return(SDL_GetTicks() - start_time); +} + +static int FarmerEntry(void*) +{ + MDFND_LockMutex(milk_mutex); + while(1) + { + MDFND_WaitCond(milk_cond, milk_mutex); + + farmer_milk += cow_milk; + cow_milk = 0; + } + MDFND_UnlockMutex(milk_mutex); + return(0); +} + +static int CalfEntry(void*) +{ + MDFND_LockMutex(milk_mutex); + while(1) + { + MDFND_WaitCond(milk_cond, milk_mutex); + + calf_milk += cow_milk; + cow_milk = 0; + } + MDFND_UnlockMutex(milk_mutex); + return(0); +} + +static int AutoMilker3000Entry(void*) +{ + MDFND_LockMutex(milk_mutex); + while(1) + { + MDFND_WaitCond(milk_cond, milk_mutex); + + am3000_milk += cow_milk; + cow_milk = 0; + } + MDFND_UnlockMutex(milk_mutex); + return(0); +} + +static void ThreadTest(void) +{ + MDFN_Thread *cow_thread, *farmer_thread, *calf_thread, *am3000_thread; + int rec; + + milk_mutex = MDFND_CreateMutex(); + milk_cond = MDFND_CreateCond(); + + //farmer_thread = MDFND_CreateThread(FarmerEntry, NULL); + //calf_thread = MDFND_CreateThread(CalfEntry, NULL); + //am3000_thread = MDFND_CreateThread(AutoMilker3000Entry, NULL); + + cow_thread = MDFND_CreateThread(CowEntry, NULL); + MDFND_WaitThread(cow_thread, &rec); + + printf("%8u %8u %8u --- %8u, time=%u\n", farmer_milk, calf_milk, am3000_milk, farmer_milk + calf_milk + am3000_milk, rec); + + exit(0); +} + +#endif + +static bool HandleVideoChange(void) +{ + if(NeedVideoChange == -1) + { + try + { + Video_Init(CurGame); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + return(false); + } + } + else + { + bool original_fs_setting = MDFN_GetSettingB("video.fs"); + + try + { + MDFNI_SetSettingB("video.fs", !original_fs_setting); + Video_Init(CurGame); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + + try + { + MDFNI_SetSettingB("video.fs", original_fs_setting); + Video_Init(CurGame); + } + catch(std::exception &ne) + { + MDFND_PrintError(ne.what()); + return(false); + } + } + } + + return(true); +} + + +int main(int argc, char *argv[]) +{ + //ThreadTest(); + +#if 0 + // Special helper mode. (TODO) + if(argc == 3 && !strcmp(argv[1], "-joy_config_helper")) + { + int fd = atoi(argv[2]); + int64 ltime = MDFND_GetTime(); + + if(SDL_Init(0)) + { + fprintf(stderr, "Could not initialize SDL: %s\n", SDL_GetError()); + return(-1); + } + SDL_JoystickEventState(SDL_IGNORE); + + joy_manager = new JoystickManager(); + joy_manager->SetAnalogThreshold(0.75); + + for(;;) + { + char command[256]; + if(0) + { + if(!strcasecmp(command, "reset")) + joy_manager->Reset_BC_ChangeCheck(); + else if(!strcasecmp(command, "detect_analog_buttons")) + joy_manager->DetectAnalogButtonsForChangeCheck(); + else if(!strcasecmp(command, "exit")) + break; + } + + + while((MDFND_GetTime() - ltime) < 15) + MDFND_Sleep(1); + ltime += 15; + } + + delete joy_manager; + joy_manager = NULL; + return(0); + } +#endif + std::vector ExternalSystems; + char *needie = NULL; + + MDFNDHaveFocus = false; + + DrBaseDirectory=GetBaseDirectory(); + + #ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + + #ifdef WIN32 + bindtextdomain(PACKAGE, DrBaseDirectory); + #else + bindtextdomain(PACKAGE, LOCALEDIR); + #endif + + bind_textdomain_codeset(PACKAGE, "UTF-8"); + textdomain(PACKAGE); + #endif + + if(argc >= 3 && (!strcasecmp(argv[1], "-remote") || !strcasecmp(argv[1], "--remote"))) + { + RemoteOn = TRUE; + InitSTDIOInterface(argv[2]); + } + + MDFNI_printf(_("Starting Mednafen %s\n"), MEDNAFEN_VERSION); + MDFN_indent(1); + + MDFN_printf(_("Build information:\n")); + MDFN_indent(2); + PrintCompilerVersion(); + //PrintGLIBCXXInfo(); + PrintZLIBVersion(); + PrintLIBICONVVersion(); + PrintSDLVersion(); + PrintLIBSNDFILEVersion(); + MDFN_indent(-2); + + MDFN_printf(_("Base directory: %s\n"), DrBaseDirectory); + + if(SDL_Init(SDL_INIT_VIDEO)) /* SDL_INIT_VIDEO Needed for (joystick config) event processing? */ + { + fprintf(stderr, "Could not initialize SDL: %s\n", SDL_GetError()); + MDFNI_Kill(); + return(-1); + } + SDL_JoystickEventState(SDL_IGNORE); + + if(!(StdoutMutex = MDFND_CreateMutex())) + { + MDFN_PrintError(_("Could not create mutex: %s\n"), SDL_GetError()); + MDFNI_Kill(); + return(-1); + } + + MainThreadID = MDFND_ThreadID(); + + // Look for external emulation modules here. + + if(!MDFNI_InitializeModules(ExternalSystems)) + return(-1); + + for(unsigned int x = 0; x < sizeof(DriverSettings) / sizeof(MDFNSetting); x++) + NeoDriverSettings.push_back(DriverSettings[x]); + + MakeDebugSettings(NeoDriverSettings); + Video_MakeSettings(NeoDriverSettings); + MakeInputSettings(NeoDriverSettings); + + if(!MDFNI_Initialize(DrBaseDirectory, NeoDriverSettings)) + return(-1); + + SDL_EnableUNICODE(1); + + #if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + SetSignals(CloseStuff); + #endif + + try + { + CreateDirs(); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Error creating directories: %s\n"), e.what()); + MDFNI_Kill(); + return(-1); + } + + MakeMednafenArgsStruct(); + + #if 0 //def WIN32 + if(argc > 1 || !(needie = GetFileDialog())) + #endif + if(!DoArgs(argc,argv, &needie)) + { + MDFNI_Kill(); + DeleteInternalArgs(); + KillInputSettings(); + return(-1); + } + + /* Now the fun begins! */ + /* Run the video and event pumping in the main thread, and create a + secondary thread to run the game in(and do sound output, since we use + separate sound code which should be thread safe(?)). + */ + int ret = 0; + + //Video_Init(NULL); + + VTMutex = MDFND_CreateMutex(); + EVMutex = MDFND_CreateMutex(); + + VTWakeupSem = MDFND_CreateSem(); + + joy_manager = new JoystickManager(); + joy_manager->SetAnalogThreshold(MDFN_GetSettingF("analogthreshold") / 100); + +#if 0 +for(int zgi = 1; zgi < argc; zgi++)// start game load test loop +{ + needie = argv[zgi]; +#endif + + VTReady = NULL; + VTDRReady = NULL; + VTLWReady = NULL; + + NeedVideoChange = -1; + + NeedExitNow = 0; + + #if 0 + { + long start_ticks = SDL_GetTicks(); + + for(int i = 0; i < 65536; i++) + MDFN_GetSettingB("gg.forcemono"); + + printf("%ld\n", SDL_GetTicks() - start_ticks); + } + #endif + + if(LoadGame(force_module_arg, needie)) + { + uint32 pitch32 = CurGame->fb_width; + //uint32 pitch32 = round_up_pow2(CurGame->fb_width); + MDFN_PixelFormat nf(MDFN_COLORSPACE_RGB, 0, 8, 16, 24); + + VTBuffer[0] = new MDFN_Surface(NULL, CurGame->fb_width, CurGame->fb_height, pitch32, nf); + VTBuffer[1] = new MDFN_Surface(NULL, CurGame->fb_width, CurGame->fb_height, pitch32, nf); + VTLineWidths[0] = (int32 *)calloc(CurGame->fb_height, sizeof(int32)); + VTLineWidths[1] = (int32 *)calloc(CurGame->fb_height, sizeof(int32)); + + for(int i = 0; i < 2; i++) + { + ((MDFN_Surface *)VTBuffer[i])->Fill(0, 0, 0, 0); + + // + // Debugger step mode, and cheat interface, rely on the previous backbuffer being valid in certain situations. Initialize some stuff here so that + // reliance will still work even immediately after startup. + VTDisplayRects[i].w = std::min(16, VTBuffer[i]->w); + VTDisplayRects[i].h = std::min(16, VTBuffer[i]->h); + VTLineWidths[i][0] = ~0; + } + + NeedVideoChange = -1; + FPS_Init(); + } + else + { + ret = -1; + NeedExitNow = 1; + } + + while(MDFN_LIKELY(!NeedExitNow)) + { + bool DidVideoChange = false; + + MDFND_LockMutex(VTMutex); /* Lock mutex */ + + if(MDFN_UNLIKELY(NeedVideoChange)) + { + Video_Kill(); + + if(!HandleVideoChange()) + { + ret = -1; + NeedExitNow = 1; + NeedVideoChange = 0; + MDFND_UnlockMutex(VTMutex); /* Unlock mutex */ + break; + } + + DidVideoChange = true; + NeedVideoChange = 0; + } + + if(VTReady) + { + //static int last_time; + //int curtime; + + BlitScreen(VTReady, VTDRReady, VTLWReady, VTInterlaceField, VTSSnapshot); + + //curtime = SDL_GetTicks(); + //printf("%d\n", curtime - last_time); + //last_time = curtime; + + VTReady = NULL; // Set to NULL after we're done blitting everything(including on-screen display stuff), and NOT just the emulated system's video surface. + } + + PumpWrap(); + if(DidVideoChange) // Do it after PumpWrap() in case there are stale SDL_ActiveEvent in the SDL event queue. + SendCEvent_to_GT(CEVT_SET_INPUT_FOCUS, (char*)0 + (bool)(SDL_GetAppState() & SDL_APPINPUTFOCUS), NULL); + + MDFND_UnlockMutex(VTMutex); /* Unlock mutex */ + + MDFND_WaitSemTimeout(VTWakeupSem, 1); + } + + CloseGame(); + + for(int x = 0; x < 2; x++) + { + if(VTBuffer[x]) + { + delete VTBuffer[x]; + VTBuffer[x] = NULL; + } + + if(VTLineWidths[x]) + { + free(VTLineWidths[x]); + VTLineWidths[x] = NULL; + } + } +#if 0 +} // end game load test loop +#endif + + MDFND_DestroySem(VTWakeupSem); + + MDFND_DestroyMutex(VTMutex); + MDFND_DestroyMutex(EVMutex); + + #if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + SetSignals(SIG_IGN); + #endif + + MDFNI_Kill(); + + delete joy_manager; + joy_manager = NULL; + + Video_Kill(); + + SDL_Quit(); + + DeleteInternalArgs(); + KillInputSettings(); + + return(ret); +} + + + +static uint32 last_btime = 0; +static void UpdateSoundSync(int16 *Buffer, int Count) +{ + if(Count) + { + if(ffnosound && CurGameSpeed != 1) + { + for(int x = 0; x < Count * CurGame->soundchan; x++) + Buffer[x] = 0; + } + int32 max = Sound_CanWrite(); + if(Count > max) + { + if(NoWaiting) + { + //printf("NW C to M; count=%d, max=%d\n", Count, max); + Count = max; + } + } + if(Count >= (max * 0.95)) + { + ers.SetETtoRT(); + } + + Sound_Write(Buffer, Count); + + //printf("%u\n", Sound_CanWrite()); + + // + // Cheap code to fix sound buffer underruns due to accumulation of time error during netplay. + // + if(MDFNDnetplay) + { + int cw = Sound_CanWrite(); + + if(cw >= Count * 1.00) + { + int16 zbuf[128 * 2]; // *2 for stereo case. + + //printf("SNOO: %d %d\n", cw, Count); + memset(zbuf, 0, sizeof(zbuf)); + + while(cw > 0) + { + Sound_Write(zbuf, std::min(128, cw)); + cw -= 128; + } + ers.SetETtoRT(); + } + } + } + else + { + bool nothrottle = MDFN_GetSettingB("nothrottle"); + + if(!NoWaiting && !nothrottle && GameThreadRun && !MDFNDnetplay) + ers.Sync(); + } +} + +void MDFND_MidSync(const EmulateSpecStruct *espec) +{ + ers.AddEmuTime((espec->MasterCycles - espec->MasterCyclesALMS) / CurGameSpeed, false); + + UpdateSoundSync(espec->SoundBuf + (espec->SoundBufSizeALMS * CurGame->soundchan), espec->SoundBufSize - espec->SoundBufSizeALMS); + + // TODO(once we can ensure it's safe): GameThread_HandleEvents(); + MDFND_UpdateInput(true, false); +} + +static bool PassBlit(MDFN_Surface *surface, MDFN_Rect *rect, int32 *lw, int InterlaceField) +{ + bool ret = false; + + /* If it's been >= 100ms since the last blit, assume that the blit + thread is being time-slice starved, and let it run. This is especially necessary + for fast-forwarding to respond well(since keyboard updates are + handled in the main thread) on slower systems or when using a higher fast-forwarding speed ratio. + */ + if(surface) + { + if((last_btime + 100) < SDL_GetTicks() || pending_ssnapshot) + { + //puts("Eep"); + while(VTReady && GameThreadRun) SDL_Delay(1); + } + + if(!VTReady) + { + Debugger_GTR_PassBlit(); // Call before the VTReady = surface + + VTSSnapshot = pending_ssnapshot; + VTInterlaceField = InterlaceField; + VTLWReady = lw; + VTDRReady = rect; + VTReady = surface; + ret = true; + + pending_ssnapshot = 0; + last_btime = SDL_GetTicks(); + FPS_IncBlitted(); + + MDFND_PostSem(VTWakeupSem); + } + } + + return(ret); +} + + +// +// Called from game thread. +// +bool MDFND_Update(MDFN_Surface *surface, MDFN_Rect *rect, int32 *lw, int InterlaceField, int16 *Buffer, int Count) +{ + bool ret = false; + + if(surface) + Debugger_GT_Draw(); + + if(false == sc_blit_timesync) + { + //puts("ABBYNORMAL"); + ret |= PassBlit(surface, rect, lw, InterlaceField); + } + + UpdateSoundSync(Buffer, Count); + + GameThread_HandleEvents(); + MDFND_UpdateInput(); + + if(RemoteOn) + CheckForSTDIOMessages(); // Note: This function may change settings, and disable sound. + + if(surface) + { + if(pending_snapshot) + MDFNI_SaveSnapshot(surface, rect, lw); + + if(pending_save_state) + MDFNI_SaveState(NULL, NULL, surface, rect, lw); + + if(pending_save_movie) + MDFNI_SaveMovie(NULL, surface, rect, lw); + + pending_save_movie = pending_snapshot = pending_save_state = 0; + } + + if(true == sc_blit_timesync) + { + //puts("NORMAL"); + ret |= PassBlit(surface, rect, lw, InterlaceField); + } + + return(ret); +} + +void MDFND_DispMessage(char* text) +{ + SendCEvent(CEVT_DISP_MESSAGE, text, NULL); +} + +void MDFND_SetStateStatus(StateStatusStruct *status) noexcept +{ + SendCEvent(CEVT_SET_STATE_STATUS, status, NULL); +} + +void MDFND_SetMovieStatus(StateStatusStruct *status) noexcept +{ + SendCEvent(CEVT_SET_MOVIE_STATUS, status, NULL); +} + +uint32 MDFND_GetTime(void) +{ + return(SDL_GetTicks()); +} + +void MDFND_Sleep(uint32 ms) +{ + SDL_Delay(ms); +} diff --git a/Mednafen/mednafen/drivers/main.h b/Mednafen/mednafen/drivers/main.h new file mode 100644 index 0000000000..2e7ed782c7 --- /dev/null +++ b/Mednafen/mednafen/drivers/main.h @@ -0,0 +1,75 @@ +#ifndef _DRIVERS_MAIN_H +#define _DRIVERS_MAIN_H + +#include +#include +#include +#include "config.h" +#include "args.h" + +#include +#include + +#include + +#define CEVT_TOGGLEGUI 1 +#define CEVT_TOGGLEFS 2 +#define CEVT_VIDEOSYNC 5 +#define CEVT_SHOWCURSOR 0x0c +#define CEVT_CHEATTOGGLEVIEW 0x10 + + +#define CEVT_DISP_MESSAGE 0x11 + +#define CEVT_SET_GRAB_INPUT 0x20 + +#define CEVT_SET_STATE_STATUS 0x40 +#define CEVT_SET_MOVIE_STATUS 0x41 + +#define CEVT_WANT_EXIT 0x80 // Emulator exit or GUI exit or bust! + + +#define CEVT_NP_DISPLAY_TEXT 0x101 +#define CEVT_NP_TOGGLE_TT 0x103 +#define CEVT_NP_LINE 0x180 +#define CEVT_NP_LINE_RESPONSE 0x181 + +#define CEVT_SET_INPUT_FOCUS 0x1000 // Main thread to game thread. + +void SendCEvent(unsigned int code, void *data1, void *data2); + +void PauseGameLoop(bool p); + +void SDL_MDFN_ShowCursor(int toggle); + +extern int NoWaiting; +extern bool MDFNDHaveFocus; + +extern MDFNGI *CurGame; +int CloseGame(void); + +void RefreshThrottleFPS(double); +void PumpWrap(void); +void MainRequestExit(void); +bool MainExitPending(void); + +extern bool pending_save_state, pending_ssnapshot, pending_snapshot, pending_save_movie; + +void DoRunNormal(void); +void DoFrameAdvance(void); +bool IsInFrameAdvance(void); + +void DebuggerFudge(void); + +extern volatile int GameThreadRun; + +void GT_ToggleFS(void); +bool GT_ReinitVideo(void); +bool GT_ReinitSound(void); + + +void BuildSystemSetting(MDFNSetting *setting, const char *system_name, const char *name, const char *description, const char *description_extra, MDFNSettingType type, + const char *default_value, const char *minimum = NULL, const char *maximum = NULL, + bool (*validate_func)(const char *name, const char *value) = NULL, void (*ChangeNotification)(const char *name) = NULL, + const MDFNSetting_EnumList *enum_list = NULL); +#endif diff --git a/Mednafen/mednafen/drivers/memdebugger.cpp b/Mednafen/mednafen/drivers/memdebugger.cpp new file mode 100644 index 0000000000..ea7360158f --- /dev/null +++ b/Mednafen/mednafen/drivers/memdebugger.cpp @@ -0,0 +1,1062 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "memdebugger.h" +#include "debugger.h" +#include "prompt.h" +#include + +#include +#include +#include + +bool MemDebugger::ICV_Init(const char *newcode) +{ + if((size_t)ict != (size_t)-1) + { + iconv_close(ict); + ict = (iconv_t)-1; + } + + if((size_t)ict_to_utf8 != (size_t)-1) + { + iconv_close(ict_to_utf8); + ict_to_utf8 = (iconv_t)-1; + } + + if((size_t)ict_utf16_to_game != (size_t)-1) + { + iconv_close(ict_utf16_to_game); + ict_utf16_to_game = (iconv_t)-1; + } + + ict = iconv_open(newcode, "UTF-8"); + if((size_t)ict == (size_t)-1) + { + error_string = trio_aprintf("iconv_open() error: %m"); + error_time = SDL_GetTicks(); + return(0); + } + + ict_to_utf8 = iconv_open("UTF-8", newcode); + if((size_t)ict_to_utf8 == (size_t)-1) + { + error_string = trio_aprintf("iconv_open() error: %m"); + error_time = SDL_GetTicks(); + return(0); + } + + ict_utf16_to_game = iconv_open(newcode, "UTF-16"); + if((size_t)ict_utf16_to_game == (size_t)-1) + { + error_string = trio_aprintf("iconv_open() error: %m"); + error_time = SDL_GetTicks(); + return(0); + } + + GameCode = std::string(newcode); + return(1); +} + +class MemDebuggerPrompt : public HappyPrompt +{ + public: + + MemDebuggerPrompt(MemDebugger* memdbg_in, const std::string &ptext, const std::string &zestring) : HappyPrompt(ptext, zestring), memdbg(memdbg_in) + { + + } + ~MemDebuggerPrompt() + { + + } + + private: + + void TheEnd(const std::string &pstring); + + MemDebugger* memdbg; +}; + +void MemDebuggerPrompt::TheEnd(const std::string &pstring) +{ + memdbg->PromptFinish(pstring); +} + + +bool MemDebugger::DoBSSearch(uint32 byte_count, uint8 *thebytes) +{ + const uint64 zemod = SizeCache[CurASpace]; + const uint32 start_a = ASpacePos[CurASpace] % zemod; + uint32 a = start_a; + bool found = FALSE; + uint8 *bbuffer = (uint8 *)calloc(1, byte_count); + + + do + { + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), a, byte_count, bbuffer); + if(!memcmp(bbuffer, thebytes, byte_count)) + { + ASpacePos[CurASpace] = a; + found = TRUE; + break; + } + a = (a + 1) % zemod; + } while(a != start_a); + + + free(bbuffer); + return(found); +} + +bool MemDebugger::DoRSearch(uint32 byte_count, uint8 *the_bytes) +{ + const uint64 zemod = SizeCache[CurASpace]; + const uint32 start_a = (ASpacePos[CurASpace] - 1) % zemod; + uint32 a = start_a; + bool found = FALSE; + uint8 *bbuffer = (uint8 *)calloc(1, byte_count); + + + do + { + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), a, byte_count + 1, bbuffer); + bool match = TRUE; + + for(uint32 i = 1; i <= byte_count; i++) + { + if(((bbuffer[i] - bbuffer[i - 1]) & 0xFF) != the_bytes[i - 1]) + { + match = FALSE; + break; + } + } + if(match) + { + found = TRUE; + ASpacePos[CurASpace] = (a + 1) % zemod; + break; + } + a = (a + 1) % zemod; + } while(a != start_a); + + free(bbuffer); + + return(found); +} + +uint8 *MemDebugger::TextToBS(const char *text, size_t *TheCount) +{ + size_t byte_count; + uint8 *thebytes = NULL; + size_t text_len = strlen(text); + size_t nib_count; + + thebytes = (uint8 *)calloc(1, text_len / 2); + + nib_count = 0; + for(size_t x = 0; x < text_len; x++) + { + int c = tolower(text[x]); + if(c >= '0' && c <= '9') + c -= '0'; + else if(c >= 'a' && c <= 'f') + { + c = c - 'a' + 0xa; + } + else if(c == ' ') + { + continue; + } + else + { + error_string = trio_aprintf("Invalid character '%c' in bytestring.", c); + error_time = SDL_GetTicks(); + InPrompt = None; + free(thebytes); + return(NULL); + } + thebytes[nib_count >> 1] |= c << ((nib_count & 1) ? 0 : 4); + nib_count++; + } + + if(nib_count & 1) + { + error_string = trio_aprintf("Invalid number of characters in bytestring."); + error_time = SDL_GetTicks(); + InPrompt = None; + free(thebytes); + return(NULL);; + } + + byte_count = nib_count >> 1; + *TheCount = byte_count; + return(thebytes); +} + +void MemDebugger::PromptFinish(const std::string &pstring) +{ + if(error_string) + { + free(error_string); + error_string = NULL; + } + if(InPrompt == Goto || InPrompt == GotoDD) + { + unsigned long long NewAddie; + + if(trio_sscanf(pstring.c_str(), "%llx", &NewAddie) == 1) + { + ASpacePos[CurASpace] = NewAddie; + LowNib = FALSE; + if(InPrompt == GotoDD) + GoGoPowerDD[CurASpace] = NewAddie; + } + } + else if(InPrompt == SetCharset) + { + if(ICV_Init(pstring.c_str())) + { + + MDFNI_SetSetting(std::string(CurGame->shortname) + "." + std::string("debugger.memcharenc"), pstring); + + } + } + else if(InPrompt == DumpMem) + { + uint32 A1, A2, tmpsize; + char fname[256]; + bool acceptable = FALSE; + + + if(trio_sscanf(pstring.c_str(), "%08x %08x %255[^\r\n]", &A1, &A2, fname) == 3) + acceptable = TRUE; + else if(trio_sscanf(pstring.c_str(), "%08x +%08x %255[^\r\n]", &A1, &tmpsize, fname) == 3) + { + acceptable = TRUE; + A2 = A1 + tmpsize - 1; + } + + if(acceptable) + { + + try + { + FileStream fp(fname, FileStream::MODE_WRITE); + uint8 write_buffer[256]; + uint64 a = A1; + + //printf("%08x %08x\n", A1, A2); + + while(a <= A2) + { + size_t to_write; + to_write = A2 - a + 1; + if(to_write > 256) to_write = 256; + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), a, to_write, write_buffer); + + fp.write(write_buffer, to_write); + a += to_write; + } + } + catch(std::exception &e) + { + error_string = trio_aprintf("%s", e.what()); + error_time = SDL_GetTicks(); + } + + } + else + { + error_string = trio_aprintf("Invalid memory dump specification."); + error_time = SDL_GetTicks(); + } + } + else if(InPrompt == LoadMem) + { + uint32 A1, A2, tmpsize; + char fname[256]; + bool acceptable = FALSE; + + if(trio_sscanf(pstring.c_str(), "%08x %08x %255[^\r\n]", &A1, &A2, fname) == 3) + acceptable = TRUE; + else if(trio_sscanf(pstring.c_str(), "%08x +%08x %255[^\r\n]", &A1, &tmpsize, fname) == 3) + { + acceptable = TRUE; + A2 = A1 + tmpsize - 1; + } + + if(acceptable) + { + + + try + { + FileStream fp(fname, FileStream::MODE_READ); + uint8 read_buffer[256]; + uint64 a = A1; + + while(a <= A2) + { + size_t to_read; + size_t read_len; + + to_read = A2 - a + 1; + if(to_read > 256) to_read = 256; + + read_len = fp.read(read_buffer, to_read, false); + + if(read_len > 0) + ASpace->PutAddressSpaceBytes(ASpace->name.c_str(), a, read_len, 1, TRUE, read_buffer); + + a += read_len; + + if(read_len != to_read) + { + error_string = trio_aprintf("Warning: unexpected EOF(short by %08llx byte(s))", (unsigned long long)(A2 - a + 1)); + error_time = SDL_GetTicks(); + break; + } + } + } + catch(std::exception &e) + { + error_string = trio_aprintf("%s", e.what()); + error_time = SDL_GetTicks(); + } + + } + else + { + error_string = trio_aprintf("Invalid memory load specification."); + error_time = SDL_GetTicks(); + } + } + else if(InPrompt == TextSearch) + { + uint8 *thebytes; + uint32 bcount; + + TS_String = pstring; + + char *inbuf, *outbuf; + char *utf8_string; + size_t ibl, obl, obl_start; + size_t result; + + utf8_string = strdup(pstring.c_str()); + + ibl = strlen(utf8_string); + obl_start = obl = (ibl + 1) * 8; // Hehe, ugly maximum estimation! + thebytes = (uint8 *)calloc(1, obl_start); + + inbuf = utf8_string; + outbuf = (char*)thebytes; + + result = iconv(ict, (ICONV_CONST char **)&inbuf, &ibl, &outbuf, &obl); + + if(result == (size_t)-1) + { + error_string = trio_aprintf("iconv() error: %m"); + error_time = SDL_GetTicks(); + InPrompt = None; + free(utf8_string); + free(thebytes); + return; + } + bcount = obl_start - obl; + free(utf8_string); + + if(!DoBSSearch(bcount, thebytes)) + { + error_string = trio_aprintf("String not found."); + error_time = SDL_GetTicks(); + InPrompt = None; + } + free(thebytes); + } + else if(InPrompt == ByteStringSearch) + { + size_t byte_count; + uint8 *the_bytes; + BSS_String = pstring; + + if(!(the_bytes = TextToBS(pstring.c_str(), &byte_count))) + return; + + if(!DoBSSearch(byte_count, the_bytes)) + { + free(the_bytes); + error_string = trio_aprintf("Bytestring \"%s\" not found.", pstring.c_str()); + error_time = SDL_GetTicks(); + InPrompt = None; + return; + } + free(the_bytes); + } + else if(InPrompt == RelSearch) + { + size_t byte_count; + uint8 *the_bytes; + RS_String = pstring; + + if(!(the_bytes = TextToBS(pstring.c_str(), &byte_count))) + return; + + if(!DoRSearch(byte_count, the_bytes)) + { + free(the_bytes); + error_string = trio_aprintf("Bytestring \"%s\" not found.", pstring.c_str()); + error_time = SDL_GetTicks(); + InPrompt = None; + return; + } + free(the_bytes); + } + InPrompt = None; +} + +// Call this function from the game thread. +void MemDebugger::SetActive(bool newia) +{ + if(CurGame->Debugger) + { + IsActive = newia; + if(!newia) + { + InEditMode = FALSE; + LowNib = FALSE; + } + } +} + +#define MK_COLOR_A(r,g,b,a) (pf_cache.MakeColor(r, g, b, a)) + +// Call this function from the game thread +void MemDebugger::Draw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *screen_rect) +{ + if(!IsActive) return; + + const MDFN_PixelFormat pf_cache = surface->format; + uint32 *pixels = surface->pixels; + uint32 pitch32 = surface->pitchinpix; + const uint64 zemod = SizeCache[CurASpace]; + + + + DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, ASpace->long_name.c_str(), MK_COLOR_A(0x20, 0xFF, 0x20, 0xFF), 1, 1); + pixels += 10 * pitch32; + + uint32 A; + uint32 Ameow; // A meow for a cat + + if(ASpacePos[CurASpace] < 128) + A = (SizeCache[CurASpace] - 128 + ASpacePos[CurASpace]) % SizeCache[CurASpace]; + else + A = ASpacePos[CurASpace] - 128; + + Ameow = A &~ 0xF; + + int numrows = zemod / 16; + + if(numrows > 16) + numrows = 16; + else if(numrows < 4) + numrows = 4; + + for(int y = 0; y < numrows; y++) + { + uint8 byte_buffer[16]; + char abuf[32]; + + Ameow %= zemod; + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), Ameow, 16, byte_buffer); + + if(zemod <= (1 << 16)) + trio_snprintf(abuf, 32, "%04X:", Ameow); + else if(zemod <= (1 << 24)) + trio_snprintf(abuf, 32, "%06X:", Ameow); + else + trio_snprintf(abuf, 32, "%08X:", Ameow); + + uint32 alen; + uint32 addr_color = MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF); + + if(Ameow == (ASpacePos[CurASpace] & ~0xF)) + addr_color = MK_COLOR_A(0x80, 0xB0, 0xFF, 0xFF); + + alen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, abuf, addr_color, 0, 1); + alen += 3; + + for(int x = 0; x < 16; x++) + { + uint32 bcolor = MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF); + uint32 acolor = MK_COLOR_A(0xA0, 0xA0, 0xA0, 0xFF); + + char quickbuf[16]; + uint32 test_match_pos; + char ascii_str[2]; + + ascii_str[1] = 0; + ascii_str[0] = byte_buffer[x]; + + if((uint8)ascii_str[0] < 0x20 || (uint8)ascii_str[0] >= 128) + ascii_str[0] = '.'; + + trio_snprintf(quickbuf, 16, "%02X", byte_buffer[x]); + + test_match_pos = ASpacePos[CurASpace] % zemod; + + if(Ameow == test_match_pos) + { + if(InEditMode) + if(SDL_GetTicks() & 0x80) + { + int pix_offset = alen; + + if(InTextArea) + pix_offset += 16 * 12 + x * 5; + else + pix_offset += (LowNib ? 5 : 0) + x * 12; + + DrawTextTrans(pixels + pix_offset, surface->pitchinpix << 2, rect->w, "▉", MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + } + if(InTextArea) + { + acolor = MK_COLOR_A(0xFF, 0x00, 0x00, 0xFF); + bcolor = MK_COLOR_A(0xFF, 0x80, 0x80, 0xFF); + } + else + { + acolor = MK_COLOR_A(0xFF, 0x80, 0x80, 0xFF); + bcolor = MK_COLOR_A(0xFF, 0x00, 0x00, 0xFF); + } + } + + // hex display + DrawTextTrans(pixels + alen + x * 12, surface->pitchinpix << 2, rect->w, quickbuf, bcolor, 0, 1); + + // ASCII display + DrawTextTrans(pixels + alen + 16 * 12 + x * 5, surface->pitchinpix << 2, rect->w, ascii_str, acolor, 0, 1); + Ameow++; + } + pixels += 9 * pitch32; + } + + { + char cpstr[32]; + uint32 curpos = ASpacePos[CurASpace]; + uint8 zebytes[4]; + uint32 tmpval; + + curpos %= zemod; + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), curpos, 4, zebytes); + + pixels += 8 + 5 * pitch32; + + if(zemod <= (1 << 16)) + trio_snprintf(cpstr, 32, "%04X", curpos); + else if(zemod <= (1 << 24)) + trio_snprintf(cpstr, 32, "%06X", curpos); + else + trio_snprintf(cpstr, 32, "%08X", curpos); + + uint32 cpplen; + uint32 cplen; + + cpplen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, "Cursor position: ", MK_COLOR_A(0xa0, 0xa0, 0xFF, 0xFF), 0, 1); + cplen = DrawTextTrans(pixels + cpplen, surface->pitchinpix << 2, rect->w, cpstr , MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + if(GoGoPowerDD[CurASpace]) + { + char ggddstr[32]; + + if(zemod <= (1 << 16)) + trio_snprintf(ggddstr, 32, "%04llX", (unsigned long long)(curpos - GoGoPowerDD[CurASpace])); + else if(zemod <= (1 << 24)) + trio_snprintf(ggddstr, 32, "%06llX", (unsigned long long)(curpos - GoGoPowerDD[CurASpace])); + else + trio_snprintf(ggddstr, 32, "%08llX", (unsigned long long)(curpos - GoGoPowerDD[CurASpace])); + + DrawTextTrans(pixels + cpplen + cplen + 8, surface->pitchinpix << 2, rect->w, ggddstr, MK_COLOR_A(0xFF, 0x80, 0x80, 0xFF), 0, 1); + } + pixels += 5 + 10 * pitch32; + + tmpval = zebytes[0]; + trio_snprintf(cpstr, 32, "%02x(%u, %d)", tmpval, (uint8)tmpval, (int8)tmpval); + cpplen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, "1-byte value: ", MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, 1); + DrawTextTrans(pixels + cpplen, surface->pitchinpix << 2, rect->w, cpstr , MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + + pixels += 10 * pitch32; + + + if(ASpace->IsWave && SizeCache[CurASpace] <= 128 && ASpace->WaveBits <= 6) + { + const int32 wf_size = SizeCache[CurASpace]; + uint8 waveform[wf_size]; + const int32 pcm_max = (1 << ASpace->WaveBits) - 1; + + DrawTextTrans(pixels - 5, surface->pitchinpix << 2, rect->w, "Full waveform:", MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, 1); + pixels += 9 * pitch32; + + // BLECK, FIXME to not be so crazy. + { + uint32 tx, ty; + + tx = (pixels - surface->pixels) % surface->pitchinpix; + ty = (pixels - surface->pixels) / surface->pitchinpix; + + MDFN_DrawFillRect(surface, tx, ty, 2 + wf_size * 2 + 2, 2 + (pcm_max + 1) + 2, MK_COLOR_A(0xA0,0xA0,0xA0,0xFF), MK_COLOR_A(0,0,0,0xFF)); + } + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), 0, wf_size, waveform); + + for(int i = 0; i < wf_size; i++) + { + int32 delta; + int32 current; + int32 previous; + + current = waveform[i]; + previous = waveform[(i + wf_size - 1) % wf_size]; + + delta = current - previous; + + for(int y = previous; y != current; y += delta / abs(delta)) + pixels[2 + i * 2 + 0 + (2 + (pcm_max - y)) * surface->pitchinpix] = MK_COLOR_A(0x00,0xA0,0x00,0xFF); + + pixels[2 + i * 2 + 0 + (2 + (pcm_max - current)) * surface->pitchinpix] = MK_COLOR_A(0x00,0xA0,0x00,0xFF); + pixels[2 + i * 2 + 1 + (2 + (pcm_max - current)) * surface->pitchinpix] = MK_COLOR_A(0x00,0xA0,0x00,0xFF); + } + } + else + { + tmpval = zebytes[0] | (zebytes[1] << 8); + trio_snprintf(cpstr, 32, "%04x(%u, %d)", tmpval, (uint16)tmpval, (int16)tmpval); + cpplen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, "2-byte value(LSB): ", MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, 1); + DrawTextTrans(pixels + cpplen, surface->pitchinpix << 2, rect->w, cpstr , MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + + pixels += 10 * pitch32; + tmpval = zebytes[0] | (zebytes[1] << 8) | (zebytes[2] << 16) | (zebytes[3] << 24); + trio_snprintf(cpstr, 32, "%08x(%u, %d)", tmpval, (uint32)tmpval, (int32)tmpval); + cpplen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, "4-byte value(LSB): ", MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, 1); + DrawTextTrans(pixels + cpplen, surface->pitchinpix << 2, rect->w, cpstr , MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + + pixels += 10 * pitch32; + tmpval = zebytes[1] | (zebytes[0] << 8); + trio_snprintf(cpstr, 32, "%04x(%u, %d)", tmpval, (uint16)tmpval, (int16)tmpval); + cpplen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, "2-byte value(MSB): ", MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, 1); + DrawTextTrans(pixels + cpplen, surface->pitchinpix << 2, rect->w, cpstr , MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + + pixels += 10 * pitch32; + tmpval = zebytes[3] | (zebytes[2] << 8) | (zebytes[1] << 16) | (zebytes[0] << 24); + trio_snprintf(cpstr, 32, "%08x(%u, %d)", tmpval, (uint32)tmpval, (int32)tmpval); + cpplen = DrawTextTrans(pixels, surface->pitchinpix << 2, rect->w, "4-byte value(MSB): ", MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, 1); + DrawTextTrans(pixels + cpplen, surface->pitchinpix << 2, rect->w, cpstr , MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, 1); + + trio_snprintf(cpstr, 32, "%s text: ", GameCode.c_str()); + cpplen = DrawTextTrans(pixels + 10 * pitch32, surface->pitchinpix << 2, rect->w, cpstr, MK_COLOR_A(0xA0, 0xA0, 0xFF, 0xFF), 0, MDFN_FONT_5x7); + + { + char rawbuf[64]; + char textbuf[256]; + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), curpos, 64, (uint8*)rawbuf); + + size_t ibl, obl, obl_start; + char *inbuf, *outbuf; + ibl = 64; + obl_start = obl = 255; // Hehe, ugly maximum estimation! + inbuf = rawbuf; + outbuf = textbuf; + + iconv(ict_to_utf8, (ICONV_CONST char **)&inbuf, &ibl, &outbuf, &obl); + textbuf[obl_start - obl] = 0; + + DrawTextTrans(pixels + 8 * pitch32 + cpplen, surface->pitchinpix << 2, rect->w - cpplen - 13, textbuf, MK_COLOR_A(0xFF, 0xFF, 0xFF, 0xFF), 0, MDFN_FONT_9x18_18x18); + } + + } + + } + + + if(InPrompt) + myprompt->Draw(surface, rect); + else if(myprompt) + { + delete myprompt; + myprompt = NULL; + } + + if(error_string) + { + if(SDL_GetTicks() >= (error_time + 4000)) + { + free(error_string); + error_string = NULL; + } + else + { + DrawTextTrans((uint32*)surface->pixels + (rect->h - 7) * pitch32, surface->pitchinpix << 2, rect->w, error_string, MK_COLOR_A(0xFF, 0x00, 0x00, 0xFF), 1, 1); + } + } +} + +void MemDebugger::ChangePos(int64 delta) +{ + int64 prevpos = ASpacePos[CurASpace]; + int64 newpos; + + newpos = prevpos + delta; + + while(newpos < 0) + newpos += SizeCache[CurASpace]; + + newpos %= SizeCache[CurASpace]; + ASpacePos[CurASpace] = newpos; + + LowNib = FALSE; +} + +void MemDebugger::DoCrazy(void) +{ + uint32 start = ASpacePos[CurASpace]; + uint32 A = ASpacePos[CurASpace]; + + for(;;) + { + uint8 zebyte; + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), A, 1, &zebyte); + + // Simple control codes + if(zebyte < 0x20) + { + switch(zebyte) + { + default: printf("UNKNOWN GAHGAHGAH: %02x\n", zebyte); + return; + + case 0x00: goto GetOut; // Crazy escape + case 0x05: goto GetOut; // Pause+close text box + + // Print numbers, 3 arguments + case 0x06: + case 0x07: + case 0x08: A += 3; break; + + // Transfer control, 4 arguments + case 0x12: A += 4; break; + + case 0x0C: break; // Clear text box + case 0x0D: break; // New line + case 0x0F: goto GetOut; // Pause+close text box + + case 0x10: break; // Prompt for button to continue + case 0x11: goto GetOut; // Binary selection magic + case 0x14: A += 1; break; // Set draw speed, 1 argument + case 0x17: A += 1; break; // Delay, 1 argument + } + } + else if(zebyte <= 0x7F) // ASCII + { + + } + else if(zebyte < 0xEB) // 2-byte SJIS + { + A += 1; + } + else + { + printf("UNKNOWN GAHGAHGAH: %02x\n", zebyte); + return; + } + A++; + } + + GetOut: + + ASpacePos[CurASpace] = A; + printf("%08x\n", A); + FILE *fp = fopen("markers.txt", "ab"); + fprintf(fp, "%08x %08x\n", start, ASpacePos[CurASpace]); + fclose(fp); + + +} + +// Call this from the game thread +int MemDebugger::Event(const SDL_Event *event) +{ + if(!InPrompt && myprompt) + { + delete myprompt; + myprompt = NULL; + } + unsigned int keysym = event->key.keysym.sym; + + switch(event->type) + { + case SDL_KEYDOWN: + if(event->key.keysym.mod & KMOD_ALT) + break; + + if(InPrompt) + { + myprompt->Event(event); + } + else if(InEditMode && InTextArea && keysym != SDLK_TAB && keysym != SDLK_INSERT && keysym != SDLK_UP && keysym != SDLK_DOWN && keysym != SDLK_LEFT + && keysym != SDLK_RIGHT && (event->key.keysym.unicode >= 0x20)) + { + uint8 to_write[16]; + int to_write_len; + + size_t ibl, obl, obl_start; + char *inbuf, *outbuf; + + ibl = 2; + obl_start = obl = 16; + + inbuf = (char *)&event->key.keysym.unicode; + outbuf = (char*)to_write; + + size_t result = iconv(ict_utf16_to_game, (ICONV_CONST char **)&inbuf, &ibl, &outbuf, &obl); + if(result != (size_t)-1) + { + to_write_len = obl_start - obl; + + + ASpace->PutAddressSpaceBytes(ASpace->name.c_str(), ASpacePos[CurASpace], to_write_len, 1, TRUE, to_write); + + + LowNib = 0; + ChangePos(to_write_len); + } + } + else if(InEditMode && ((event->key.keysym.sym >= SDLK_0 && event->key.keysym.sym <= SDLK_9) || + (event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_f))) + { + uint8 tc = 0; + uint8 meowbyte = 0; + + if(event->key.keysym.sym >= SDLK_0 && event->key.keysym.sym <= SDLK_9) + tc = 0x0 + event->key.keysym.sym - SDLK_0; + else if(event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_f) + tc = 0xA + event->key.keysym.sym - SDLK_a; + + + ASpace->GetAddressSpaceBytes(ASpace->name.c_str(), ASpacePos[CurASpace], 1, &meowbyte); + meowbyte &= 0xF << ((LowNib) * 4); + meowbyte |= tc << ((!LowNib) * 4); + ASpace->PutAddressSpaceBytes(ASpace->name.c_str(), ASpacePos[CurASpace], 1, 1, TRUE, &meowbyte); + + + LowNib = !LowNib; + if(!LowNib) + ChangePos(1); + } + else switch(event->key.keysym.sym) + { + default: break; + + case SDLK_MINUS: Debugger_GT_ModOpacity(-8); + break; + case SDLK_EQUALS: Debugger_GT_ModOpacity(8); + break; + + case SDLK_TAB: + InTextArea = !InTextArea; + LowNib = FALSE; + break; + + case SDLK_d: + InPrompt = DumpMem; + myprompt = new MemDebuggerPrompt(this, "Dump Memory(start end filename)", ""); + break; + case SDLK_l: + InPrompt = LoadMem; + myprompt = new MemDebuggerPrompt(this, "Load Memory(start end filename)", ""); + break; + case SDLK_s: + if(SizeCache[CurASpace] > (1 << 24)) + { + error_string = trio_aprintf("Address space is too large to search!"); + error_time = SDL_GetTicks(); + } + else + { + InPrompt = ByteStringSearch; + myprompt = new MemDebuggerPrompt(this, "Byte String Search", BSS_String); + } + break; + case SDLK_r: + if(SizeCache[CurASpace] > (1 << 24)) + { + error_string = trio_aprintf("Address space is too large to search!"); + error_time = SDL_GetTicks(); + } + else + { + InPrompt = RelSearch; + myprompt = new MemDebuggerPrompt(this, "Byte String Relative/Delta Search", RS_String); + } + break; + + case SDLK_c: + InPrompt = SetCharset; + myprompt = new MemDebuggerPrompt(this, "Charset", GameCode); + break; + + case SDLK_t: + if(ASpace->TotalBits > 24) + { + error_string = trio_aprintf("Address space is too large to search!"); + error_time = SDL_GetTicks(); + } + else + { + InPrompt = TextSearch; + myprompt = new MemDebuggerPrompt(this, "Text Search", TS_String); + } + break; + + case SDLK_RETURN: + case SDLK_g: + if(event->key.keysym.mod & KMOD_SHIFT) + { + InPrompt = GotoDD; + myprompt = new MemDebuggerPrompt(this, "Goto Address(DD)", ""); + } + else + { + InPrompt = Goto; + myprompt = new MemDebuggerPrompt(this, "Goto Address", ""); + } + break; + + case SDLK_INSERT: + InEditMode = !InEditMode; + LowNib = FALSE; + break; + + case SDLK_END: ASpacePos[CurASpace] = (SizeCache[CurASpace] - 128) % SizeCache[CurASpace]; + LowNib = FALSE; + break; + + case SDLK_HOME: ASpacePos[CurASpace] = 0; + LowNib = FALSE; + break; + + + case SDLK_PAGEUP: ChangePos(-16 * 16); break; + case SDLK_PAGEDOWN: ChangePos(16 * 16); break; + case SDLK_UP: ChangePos(-16); break; + case SDLK_DOWN: ChangePos(16); break; + case SDLK_LEFT: ChangePos(-1); break; + case SDLK_RIGHT: ChangePos(1); break; + + case SDLK_COMMA: + if(CurASpace) + CurASpace--; + else + CurASpace = AddressSpaces->size() - 1; + + ASpace = &(*AddressSpaces)[CurASpace]; + + LowNib = FALSE; + break; + case SDLK_PERIOD: + CurASpace = (CurASpace + 1) % AddressSpaces->size(); + ASpace = &(*AddressSpaces)[CurASpace]; + + LowNib = FALSE; + break; + + case SDLK_b: DoCrazy(); + break; + } + break; + } + return(1); +} + + +// Called after a game is loaded. +MemDebugger::MemDebugger() : AddressSpaces(NULL), ASpace(NULL), IsActive(false), CurASpace(0), + LowNib(false), InEditMode(false), InTextArea(false), error_string(NULL), error_time(0), + ict((iconv_t)-1), ict_to_utf8((iconv_t)-1), ict_utf16_to_game((iconv_t)-1), InPrompt(None), myprompt(NULL) +{ + if(CurGame->Debugger) + { + AddressSpaces = CurGame->Debugger->AddressSpaces; + + CurASpace = 0; + ASpace = &(*AddressSpaces)[CurASpace]; + + size_t num = AddressSpaces->size(); + + ASpacePos.resize(num); + SizeCache.resize(num); + GoGoPowerDD.resize(num); + + for(size_t i = 0; i < num; i++) + { + uint64 tmpsize; + + tmpsize = (*AddressSpaces)[i].NP2Size; + + if(!tmpsize) + tmpsize = (uint64)1 << (*AddressSpaces)[i].TotalBits; + + SizeCache[i] = tmpsize; + } + + ICV_Init( MDFN_GetSettingS(std::string(CurGame->shortname) + "." + std::string("debugger.memcharenc")).c_str() ); + } +} + +MemDebugger::~MemDebugger() +{ + if(ict != (iconv_t)-1) + { + iconv_close(ict); + ict = (iconv_t)-1; + } + + if(ict_to_utf8 != (iconv_t)-1) + { + iconv_close(ict_to_utf8); + ict_to_utf8 = (iconv_t)-1; + } + + if(ict_utf16_to_game != (iconv_t)-1) + { + iconv_close(ict_utf16_to_game); + ict_utf16_to_game = (iconv_t)-1; + } + + if(error_string) + { + free(error_string); + error_string = NULL; + } +} diff --git a/Mednafen/mednafen/drivers/memdebugger.h b/Mednafen/mednafen/drivers/memdebugger.h new file mode 100644 index 0000000000..36d69d560f --- /dev/null +++ b/Mednafen/mednafen/drivers/memdebugger.h @@ -0,0 +1,79 @@ +#ifndef __MDFN_DRIVERS_MEMDEBUGGER_H +#define __MDFN_DRIVERS_MEMDEBUGGER_H + +#include +#include +#include + +class MemDebuggerPrompt; + +class MemDebugger +{ + public: + + MemDebugger(); + ~MemDebugger(); + + void Draw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *screen_rect); + int Event(const SDL_Event *event); + void SetActive(bool newia); + + private: + + bool ICV_Init(const char *newcode); + void ChangePos(int64 delta); + void DoCrazy(void); + + uint8* TextToBS(const char *text, size_t *TheCount); + void PromptFinish(const std::string &pstring); + bool DoBSSearch(uint32 byte_count, uint8 *thebytes); + bool DoRSearch(uint32 byte_count, uint8 *the_bytes); + + + // Local cache variable set after game load to reduce dereferences and make the code nicer. + // (the game structure's debugger info struct doesn't change during emulation, so this is safe) + const std::vector *AddressSpaces; + const AddressSpaceType *ASpace; // Current address space + + bool IsActive; + std::vector ASpacePos; + std::vector SizeCache; + std::vector GoGoPowerDD; + + int CurASpace; // Current address space number + + bool LowNib; + bool InEditMode; + bool InTextArea; // Right side text vs left side numbers, selected via TAB + + std::string BSS_String, RS_String, TS_String; + char *error_string; + uint32 error_time; + + typedef enum + { + None = 0, + Goto, + GotoDD, + ByteStringSearch, + RelSearch, + TextSearch, + DumpMem, + LoadMem, + SetCharset, + } PromptType; + + iconv_t ict; + iconv_t ict_to_utf8; + iconv_t ict_utf16_to_game; + + std::string GameCode; + + PromptType InPrompt; + + MemDebuggerPrompt *myprompt; + + friend class MemDebuggerPrompt; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/netplay.cpp b/Mednafen/mednafen/drivers/netplay.cpp new file mode 100644 index 0000000000..5b4d2ee256 --- /dev/null +++ b/Mednafen/mednafen/drivers/netplay.cpp @@ -0,0 +1,352 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// FIXME: Minor memory leaks may occur on errors(strdup'd, malloc'd, and new'd memory used in inter-thread messages) + +#ifdef HAVE_CONFIG_H +#include +#endif +#include "main.h" +#include + +#include +#include +#include "netplay.h" +#include "console.h" + +#include + +#include "NetClient.h" + +#ifdef HAVE_POSIX_SOCKETS +#include "NetClient_POSIX.h" +#endif + +#ifdef WIN32 +#include "NetClient_WS2.h" +#endif + +static NetClient *Connection = NULL; + + +class NetplayConsole : public MDFNConsole +{ + public: + NetplayConsole(void); + + private: + virtual bool TextHook(const std::string &text) override; +}; + +static NetplayConsole NetConsole; +static const int PopupTime = 3750; + +static int volatile inputable = 0; +static int volatile viewable = 0; +static int64 LastTextTime = -1; + +int MDFNDnetplay = 0; // Only write/read this global variable in the game thread. + +NetplayConsole::NetplayConsole(void) +{ + +} + +// Called from main thread +bool NetplayConsole::TextHook(const std::string &text) +{ + LastTextTime = SDL_GetTicks(); + + SendCEvent(CEVT_NP_LINE, strdup(text.c_str()), NULL); + + return(1); +} + +// Call from game thread +static void PrintNetStatus(const char *s) +{ + MDFND_NetplayText(s, FALSE); +} + +// Call from game thread +static void PrintNetError(const char *format, ...) +{ + char *temp; + + va_list ap; + + va_start(ap, format); + + temp = trio_vaprintf(format, ap); + MDFND_NetplayText(temp, FALSE); + free(temp); + + va_end(ap); +} + +// Called from game thread +int MDFND_NetworkConnect(void) +{ + std::string remote_host = MDFN_GetSettingS("netplay.host"); + unsigned int remote_port = MDFN_GetSettingUI("netplay.port"); + + if(Connection) + { + MDFND_NetworkClose(); + } + + try + { + #ifdef HAVE_POSIX_SOCKETS + Connection = new NetClient_POSIX(); + #elif defined(WIN32) + Connection = new NetClient_WS2(); + #else + throw MDFN_Error(0, _("Networking system API support not compiled in.")); + #endif + Connection->Connect(remote_host.c_str(), remote_port); + } + catch(std::exception &e) + { + PrintNetError("%s", e.what()); + return(0); + } + + PrintNetStatus(_("*** Sending initialization data to server.")); + + MDFNDnetplay = 1; + if(!MDFNI_NetplayStart()) + { + MDFNDnetplay = 0; + return(0); + } + PrintNetStatus(_("*** Connection established.")); + + return(1); +} + +// Called from game thread +void MDFND_SendData(const void *data, uint32 len) +{ + do + { + int32 sent = Connection->Send(data, len); + assert(sent >= 0); + + data = (uint8*)data + sent; + len -= sent; + + if(len) + { + if(MainExitPending()) + throw MDFN_Error(0, _("Mednafen exit pending.")); + + Connection->CanSend(50000); + } + } while(len); +} + +void MDFND_RecvData(void *data, uint32 len) +{ + NoWaiting &= ~2; + + do + { + int32 received = Connection->Receive(data, len); + assert(received >= 0); + + data = (uint8*)data + received; + len -= received; + + if(len) + { + if(MainExitPending()) + throw MDFN_Error(0, _("Mednafen exit pending.")); + + Connection->CanReceive(50000); + } + } while(len); + + if(Connection->CanReceive()) + NoWaiting |= 2; +} + +// Called from the game thread +void MDFND_NetworkClose(void) +{ + NoWaiting &= ~2; + + if(Connection) + { + delete Connection; + Connection = NULL; + } + + if(MDFNDnetplay) + { + MDFNI_NetplayStop(); + MDFNDnetplay = 0; + PrintNetStatus(_("*** Disconnected")); + } +} + +// Called from the game thread +void MDFND_NetplayText(const char* text, bool NetEcho) +{ + char *tot = strdup(text); + char *tmp; + + tmp = tot; + + while(*tmp) + { + if((uint8)*tmp < 0x20) + *tmp = ' '; + tmp++; + } + + SendCEvent(CEVT_NP_DISPLAY_TEXT, tot, (void*)NetEcho); +} + +// Called from the game thread +void Netplay_ToggleTextView(void) +{ + SendCEvent(CEVT_NP_TOGGLE_TT, NULL, NULL); +} + +// Called from main thread +int Netplay_GetTextView(void) +{ + return(viewable); +} + +// Called from main thread and game thread +bool Netplay_IsTextInput(void) +{ + return(inputable); +} + +// Called from the main thread +bool Netplay_TryTextExit(void) +{ + if(viewable || inputable) + { + viewable = FALSE; + inputable = FALSE; + LastTextTime = -1; + return(TRUE); + } + else if(LastTextTime > 0 && (int64)SDL_GetTicks() < (LastTextTime + PopupTime + 500)) // Allow some extra time if a user tries to escape away an auto popup box but misses + { + return(TRUE); + } + else + { + return(FALSE); + } +} + +// Called from main thread +void DrawNetplayTextBuffer(MDFN_Surface *surface, const MDFN_Rect *src_rect) +{ + if(!viewable) + { + return; + } + if(!inputable) + { + if((int64)SDL_GetTicks() >= (LastTextTime + PopupTime)) + { + viewable = 0; + return; + } + } + NetConsole.ShowPrompt(inputable); + NetConsole.Draw(surface, src_rect); +} + +// Called from main thread +int NetplayEventHook(const SDL_Event *event) +{ + if(event->type == SDL_USEREVENT) + switch(event->user.code) + { + case CEVT_NP_LINE_RESPONSE: + { + inputable = (event->user.data1 != NULL); + if(event->user.data2 != NULL) + { + viewable = true; + LastTextTime = SDL_GetTicks(); + } + } + break; + + case CEVT_NP_TOGGLE_TT: + NetConsole.SetFont(MDFN_GetSettingB("netplay.smallfont") ? MDFN_FONT_5x7 : MDFN_FONT_9x18_18x18); // FIXME: Setting manager mutex needed example! + if(viewable && !inputable) + { + inputable = TRUE; + } + else + { + viewable = !viewable; + inputable = viewable; + } + break; + + case CEVT_NP_DISPLAY_TEXT: + NetConsole.WriteLine((char*)event->user.data1); + free(event->user.data1); + + if(!(bool)event->user.data2) + { + viewable = 1; + LastTextTime = SDL_GetTicks(); + } + break; + } + + if(!inputable) + return(1); + + return(NetConsole.Event(event)); +} + +// Called from game thread +int NetplayEventHook_GT(const SDL_Event *event) +{ + if(event->type == SDL_USEREVENT) + { + switch(event->user.code) + { + case CEVT_NP_LINE: + { + bool inputable_tmp = false, viewable_tmp = false; + + MDFNI_NetplayLine((const char*)event->user.data1, inputable_tmp, viewable_tmp); + free(event->user.data1); + + SendCEvent(CEVT_NP_LINE_RESPONSE, (void*)inputable_tmp, (void*)viewable_tmp); + } + break; + } + } + return(1); +} + + diff --git a/Mednafen/mednafen/drivers/netplay.h b/Mednafen/mednafen/drivers/netplay.h new file mode 100644 index 0000000000..f30e46b7f9 --- /dev/null +++ b/Mednafen/mednafen/drivers/netplay.h @@ -0,0 +1,13 @@ +int MDFND_NetworkConnect(void); +void DrawNetplayTextBuffer(MDFN_Surface *surface, const MDFN_Rect *src_rect); +void NetplayText_InMainThread(uint8 *text, bool NetEcho); + +int NetplayEventHook(const SDL_Event *event); +int NetplayEventHook_GT(const SDL_Event *event); + +void Netplay_ToggleTextView(void); +int Netplay_GetTextView(void); +bool Netplay_IsTextInput(void); +bool Netplay_TryTextExit(void); + +extern int MDFNDnetplay; diff --git a/Mednafen/mednafen/drivers/nnx.cpp b/Mednafen/mednafen/drivers/nnx.cpp new file mode 100644 index 0000000000..b77f3d44e4 --- /dev/null +++ b/Mednafen/mednafen/drivers/nnx.cpp @@ -0,0 +1,206 @@ +/* Nearest-neighbor simple scalers */ +// FIXME: non-32bpp scaling not working yet. + +#include "main.h" +#include "nnx.h" + +template +static void t_nnx(int factor, MDFN_Surface *src, MDFN_Rect *src_rect, MDFN_Surface *dest, MDFN_Rect *dest_rect) +{ + T *source_pixies = src->pixels + src_rect->y * src->pitchinpix; + source_pixies += src_rect->x; + int source_pitch = src->pitchinpix; + int source_pitch_diff = source_pitch - src_rect->w; + + T *dest_pixies = dest->pixels + dest_rect->y * dest->pitchinpix; + dest_pixies += dest_rect->x; + int dest_pitch = dest->pitchinpix; + int dest_pitch_diff = dest_pitch - dest_rect->w + dest_pitch * (factor - 1); + + int max_x = src_rect->w; + + switch(factor) + { + case 2: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + dest_pixies[0] = dest_pixies[1] = dest_pixies[dest_pitch] = dest_pixies[dest_pitch + 1] = *source_pixies; + source_pixies++; + dest_pixies += 2; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + case 3: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + dest_pixies[0] = dest_pixies[1] = dest_pixies[2] = + dest_pixies[dest_pitch] = dest_pixies[dest_pitch + 1] = dest_pixies[dest_pitch + 2] = + dest_pixies[dest_pitch << 1] = dest_pixies[(dest_pitch << 1) + 1] = dest_pixies[(dest_pitch << 1) + 2] = *source_pixies; + source_pixies++; + dest_pixies += 3; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + case 4: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + dest_pixies[0] = dest_pixies[1] = dest_pixies[2] = dest_pixies[3] = + dest_pixies[dest_pitch] = dest_pixies[dest_pitch + 1] = dest_pixies[dest_pitch + 2] = dest_pixies[dest_pitch + 3] = + dest_pixies[dest_pitch << 1] = dest_pixies[(dest_pitch << 1) + 1] = dest_pixies[(dest_pitch << 1) + 2] = dest_pixies[(dest_pitch << 1) + 3] = + dest_pixies[(dest_pitch << 1) + dest_pitch] = dest_pixies[(dest_pitch << 1) + dest_pitch + 1] = dest_pixies[(dest_pitch << 1) + dest_pitch + 2] = dest_pixies[(dest_pitch << 1) + dest_pitch + 3] = *source_pixies; + source_pixies++; + dest_pixies += 4; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + case 5: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + // Line 0 + dest_pixies[0] = dest_pixies[1] = dest_pixies[2] = dest_pixies[3] = dest_pixies[4] = + + // Line 1 + dest_pixies[dest_pitch] = dest_pixies[dest_pitch + 1] = dest_pixies[dest_pitch + 2] = dest_pixies[dest_pitch + 3] = dest_pixies[dest_pitch + 4] = + + // Line 2 + dest_pixies[dest_pitch << 1] = dest_pixies[(dest_pitch << 1) + 1] = dest_pixies[(dest_pitch << 1) + 2] = dest_pixies[(dest_pitch << 1) + 3] = dest_pixies[(dest_pitch << 1) + 4] = + + // Line 3 + dest_pixies[(dest_pitch << 1) + dest_pitch] = dest_pixies[(dest_pitch << 1) + dest_pitch + 1] = dest_pixies[(dest_pitch << 1) + dest_pitch + 2] = dest_pixies[(dest_pitch << 1) + dest_pitch + 3] = dest_pixies[(dest_pitch << 1) + dest_pitch + 4] = *source_pixies; + + // Line 4 + dest_pixies[(dest_pitch << 2)] = dest_pixies[(dest_pitch << 2) + 1] = dest_pixies[(dest_pitch << 2) + 2] = dest_pixies[(dest_pitch << 2) + 3] = dest_pixies[(dest_pitch << 2) + 4] = *source_pixies; + + source_pixies++; + dest_pixies += 5; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + } +} + +template +static void t_nnyx(int factor, MDFN_Surface *src, MDFN_Rect *src_rect, MDFN_Surface *dest, MDFN_Rect *dest_rect) +{ + T *source_pixies = src->pixels + src_rect->y * src->pitchinpix; + source_pixies += src_rect->x; + int source_pitch = src->pitchinpix; + int source_pitch_diff = source_pitch - src_rect->w; + + T *dest_pixies = dest->pixels + dest_rect->y * dest->pitchinpix; + dest_pixies += dest_rect->x; + int dest_pitch = dest->pitchinpix; + int dest_pitch_diff = dest_pitch - dest_rect->w + dest_pitch * (factor - 1); + + int max_x = src_rect->w; + + switch(factor) + { + case 2: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + dest_pixies[0] = dest_pixies[dest_pitch] = *source_pixies; + source_pixies++; + dest_pixies ++; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + case 3: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + dest_pixies[0] = + dest_pixies[dest_pitch] = + dest_pixies[dest_pitch << 1] = *source_pixies; + source_pixies++; + dest_pixies ++; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + case 4: + for(int y = src_rect->h; y; y--) + { + for(int x = max_x; x; x--) + { + dest_pixies[0] = + dest_pixies[dest_pitch] = + dest_pixies[dest_pitch << 1] = + dest_pixies[(dest_pitch << 1) + dest_pitch] = *source_pixies; + source_pixies++; + dest_pixies ++; + } + dest_pixies += dest_pitch_diff; + source_pixies += source_pitch_diff; + } + break; + + } +} + +void nnx(int factor, MDFN_Surface *src, MDFN_Rect *src_rect, MDFN_Surface *dest, MDFN_Rect *dest_rect) +{ + switch(src->format.bpp) + { +#if 0 + case 8: + t_nnx(factor, src, src_rect, dest, dest_rect); + break; + + case 16: + t_nnx(factor, src, src_rect, dest, dest_rect); + break; +#endif + case 32: + t_nnx(factor, src, src_rect, dest, dest_rect); + break; + } +} + +void nnyx(int factor, MDFN_Surface *src, MDFN_Rect *src_rect, MDFN_Surface *dest, MDFN_Rect *dest_rect) +{ + switch(src->format.bpp) + { +#if 0 + case 8: + t_nnyx(factor, src, src_rect, dest, dest_rect); + break; + + case 16: + t_nnyx(factor, src, src_rect, dest, dest_rect); + break; +#endif + case 32: + t_nnyx(factor, src, src_rect, dest, dest_rect); + break; + } +} + diff --git a/Mednafen/mednafen/drivers/nnx.h b/Mednafen/mednafen/drivers/nnx.h new file mode 100644 index 0000000000..96060809f0 --- /dev/null +++ b/Mednafen/mednafen/drivers/nnx.h @@ -0,0 +1,7 @@ +#ifndef __MDFN_DRIVERS_NNX_H +#define __MDFN_DRIVERS_NNX_H + +void nnx(int factor, MDFN_Surface *src, MDFN_Rect *src_rect, MDFN_Surface *dest, MDFN_Rect *dest_rect); +void nnyx(int factor, MDFN_Surface *src, MDFN_Rect *src_rect, MDFN_Surface *dest, MDFN_Rect *dest_rect); + +#endif diff --git a/Mednafen/mednafen/drivers/nongl.cpp b/Mednafen/mednafen/drivers/nongl.cpp new file mode 100644 index 0000000000..33ffe29641 --- /dev/null +++ b/Mednafen/mednafen/drivers/nongl.cpp @@ -0,0 +1,468 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "video.h" +#include "nongl.h" +#include "nnx.h" + +#include +#include +#include + +// +// Source rectangle sanity checking(more strict than dest rectangle sanity checking). */ +// +// true if it's ok, false if it's "bad" and we shouldn't blit. +static INLINE bool CheckSourceRect(const MDFN_Surface *src_surface, const MDFN_Rect *src_rect) +{ + if((src_rect->w <= 0) || (src_rect->h <= 0)) + return(false); + + if((src_rect->x < 0) || (src_rect->y < 0)) + return(false); + + if(((int64)src_rect->x + src_rect->w) > src_surface->w) + return(false); + + if(((int64)src_rect->y + src_rect->h) > src_surface->h) + return(false); + + return(true); +} + +// +// Dest rectangle sanity checking. +// +static INLINE bool CheckDestRect(const MDFN_Surface *dest_surface, const MDFN_Rect *dest_rect) +{ + if((dest_rect->w <= 0) || (dest_rect->h <= 0)) + return(false); + + if(dest_rect->x >= dest_surface->w) + return(false); + + if(dest_rect->y >= dest_surface->h) + return(false); + + if(((int64)dest_rect->x + dest_rect->w) <= 0) + return(false); + + if(((int64)dest_rect->y + dest_rect->h) <= 0) + return(false); + + return(true); +} + +// +// true if blitting needs to be done with some sort of clipping, false if not. +// +static INLINE bool CheckDRNeedsClipping(const MDFN_Surface *dest_surface, const MDFN_Rect *dest_rect) +{ + if(dest_rect->x < 0 || dest_rect->y < 0) + return(true); + + if(((int64)dest_rect->x + dest_rect->w) > dest_surface->w) + return(true); + + if(((int64)dest_rect->y + dest_rect->h) > dest_surface->h) + return(true); + + return(false); +} + +#define SFTBLT_SETUP(T) \ + /* dr_* should only be used in the actual blitting functions for ratio calculations. */ \ + const int32 sr_w = src_rect->w; \ + const int32 sr_h = src_rect->h; \ + const int32 dr_w = dest_rect->w; \ + const int32 dr_h = dest_rect->h; \ + const int32 iter_w = std::min(std::max(0, dest_surface->w - std::max(0, dest_rect->x)), std::max(0, dr_w + std::min(0, dest_rect->x))); \ + const int32 iter_h = std::min(std::max(0, dest_surface->h - std::max(0, dest_rect->y)), std::max(0, dr_h + std::min(0, dest_rect->y))); \ + const uint32 src_pitchinpix = src_surface->pitchinpix; \ + const uint32 dest_pitchinpix = dest_surface->pitchinpix; \ + const int32 dest_pixels_fudge_x = -std::min(0, dest_rect->x); \ + const int32 dest_pixels_fudge_y = -std::min(0, dest_rect->y); \ + const T* src_pixels = src_surface->pixels + src_rect->x + (src_rect->y * src_pitchinpix); \ + T* dest_pixels = dest_surface->pixels + std::max(0, dest_rect->x) + (std::max(0, dest_rect->y) * dest_pitchinpix); + + +// const int32 src_pixels_fudge_x = (int64)(-std::min(0, dest_rect->x)) * sr_w / dr_w; +// const int32 src_pixels_fudge_y = (int64)(-std::min(0, dest_rect->y)) * sr_h / dr_h; +// const T* src_pixels = src_surface->pixels + src_rect->x + src_pixels_fudge_x + ((src_rect->y + src_pixels_fudge_y) * src_pitchinpix); + +// Write pixel source-alpha-eval +template +static INLINE void WPSAE(T &back_pix_ref, const T fore_pix) +{ + if(sizeof(T) == 4 && alpha_shift < 31) + { + const T back_pix = back_pix_ref; + const uint32 alpha = (((fore_pix >> alpha_shift) & 0xFF) * 129) >> 7; //65921) >> 16; + const uint32 alpha_negoo = 256 - alpha; + T new_pix; + + new_pix = 0; + new_pix |= ((((back_pix & 0xFF00FF) * alpha_negoo) + ((fore_pix & 0xFF00FF) * alpha)) >> 8) & 0x00FF00FF; + new_pix |= (((((back_pix >> 8) & 0xFF00FF) * alpha_negoo) + (((fore_pix >> 8) & 0xFF00FF) * alpha))) & 0xFF00FF00; + back_pix_ref = new_pix; + } + else + back_pix_ref = fore_pix; +} + +template +static void BlitStraight(const MDFN_Surface *src_surface, const MDFN_Rect *src_rect, MDFN_Surface *dest_surface, const MDFN_Rect *dest_rect) +{ + SFTBLT_SETUP(T); + + (void)sr_w; + (void)sr_h; + + //puts("Straight"); + + src_pixels += dest_pixels_fudge_x + (dest_pixels_fudge_y * src_pitchinpix); + + for(int32 y = 0; y < iter_h; y++) + { + if(alpha_shift >= 0) + { + for(int32 x = 0; x < iter_w; x++) + { + WPSAE(dest_pixels[x], src_pixels[x]); + } + } + else + memcpy(dest_pixels, src_pixels, iter_w * sizeof(T)); + + src_pixels += src_pitchinpix; + dest_pixels += dest_pitchinpix; + } +} + +template +static void BlitIScale(const MDFN_Surface *src_surface, const MDFN_Rect &sr, MDFN_Surface *dest_surface, const MDFN_Rect &dr, int xscale, int yscale) +{ + //puts("IScale"); + const uint32 src_pitchinpix = src_surface->pitchinpix; + int32 dpitch_diff; + + T *src_row, *dest_row; + + src_row = src_surface->pixels + src_surface->pitchinpix * sr.y + sr.x; + dest_row = dest_surface->pixels + dest_surface->pitchinpix * dr.y + dr.x; + + dpitch_diff = dest_surface->pitchinpix - (sr.w * xscale); + + //printf("%f %f, %d %d\n", dw_to_sw_ratio, dh_to_sh_ratio, xscale, yscale); + + for(int y = sr.h; y; y--) + { + for(int ys = yscale; ys; ys--) + { + uint32 *src_pixels = src_row; + + for(int x = sr.w; x; x--) + { + uint32 tmp_pixel = *src_pixels; + + for(int xs = xscale; xs; xs--) + WPSAE(*dest_row++, tmp_pixel); + + src_pixels++; + } + dest_row += dpitch_diff; + } + src_row += src_pitchinpix; + } +} + +template +static void BlitSScale(const MDFN_Surface *src_surface, const MDFN_Rect *src_rect, MDFN_Surface *dest_surface, const MDFN_Rect *dest_rect, const MDFN_Rect *original_src_rect, int scanlines = 0, unsigned rotation = 0, int InterlaceField = -1) +{ + SFTBLT_SETUP(T); + + //puts("SScale"); +// printf("%d %d\n", iter_w, iter_h); + + static const unsigned fract_bits = 18; // 2**(32 - 18) == 16384 + + uint32 src_x, src_y; + uint32 src_x_inc, src_y_inc; + + // Extra vars for scanlines + const int32 o_sr_h = original_src_rect->h; + uint32 sl_mult; + uint32 sl; + uint32 sl_inc; + uint32 sl_init; // For scanlines+rotation!! + + // Extra vars for rotation. + uint32 src_x_init; + uint32 src_y_init; + + if(rotation_on) + { + if(rotation == MDFN_ROTATE90) + { + src_x_inc = ((sr_h << fract_bits) + dr_w - 1) / dr_w; + src_y_inc = -((sr_w << fract_bits) + dr_h - 1) / dr_h; + } + else //if(rotated == MDFN_ROTATE270) + { + src_x_inc = -((sr_h << fract_bits) + dr_w - 1) / dr_w; + src_y_inc = ((sr_w << fract_bits) + dr_h - 1) / dr_h; + } + + // + // + // + if((((int64)abs((int32)src_x_inc) * (iter_w + dest_pixels_fudge_x - 1)) >> fract_bits) >= sr_h) + { + printf("Rot %u Prec-round BUG X\n", rotation); + if((int32)src_x_inc < 0) + src_x_inc++; + else + src_x_inc--; + } + + if((((int64)abs((int32)src_y_inc) * (iter_h + dest_pixels_fudge_y - 1)) >> fract_bits) >= sr_w) + { + printf("Rot %u Prec-round BUG Y\n", rotation); + if((int32)src_y_inc < 0) + src_y_inc++; + else + src_y_inc--; + } + // + // + // + + if(rotation == MDFN_ROTATE90) + { + src_x_init = dest_pixels_fudge_x * src_x_inc; + src_y_init = (iter_h + dest_pixels_fudge_y - 1) * -src_y_inc; + } + else //if(rotated == MDFN_ROTATE270) + { + src_x_init = (iter_w + dest_pixels_fudge_x - 1) * -src_x_inc; + src_y_init = dest_pixels_fudge_y * src_y_inc; + //printf("%d %08x\n", dest_pixels_fudge_x, dest_pixels_fudge_y * src_y_inc); + } + } + else + { + src_x_inc = ((sr_w << fract_bits) + dr_w - 1) / dr_w; + src_y_inc = ((sr_h << fract_bits) + dr_h - 1) / dr_h; + + if((((int64)src_x_inc * (iter_w + dest_pixels_fudge_x - 1)) >> fract_bits) >= sr_w) + { + puts("Prec-round BUG X"); + src_x_inc--; + } + + if((((int64)src_y_inc * (iter_h + dest_pixels_fudge_y - 1)) >> fract_bits) >= sr_h) + { + puts("Prec-round BUG Y"); + src_y_inc--; + } + + src_pixels += ((int64)dest_pixels_fudge_x * src_x_inc) >> fract_bits; + src_pixels += (((int64)dest_pixels_fudge_y * src_y_inc) >> fract_bits) * src_pitchinpix; + } + +#if 0 + printf("%lld, %lld\n", ((long long)src_y + src_y_inc * (dr.h - 1)) >> fract_bits, ((long long)src_y + src_y_inc * (dr.h - (dr.h / sr.h) - 1)) >> fract_bits); +#endif + + if(scanlines_on) + { + unsigned o_sr_h_ps = 0; + int sl_init_offs = 0; + + sl_mult = 256 - 256 * abs(scanlines) / 100; + + if(scanlines < 0 && InterlaceField >= 0) + { + o_sr_h_ps = 1; + sl_init_offs = InterlaceField; + } + + if(rotation_on) + { + if(rotation == MDFN_ROTATE90) + { + sl_inc = (((o_sr_h >> o_sr_h_ps) << fract_bits) + dr_w - 1) / dr_w * 2; + sl_init = (sl_init_offs * (dr_w / o_sr_h) + dest_pixels_fudge_x) * sl_inc; + } + else + { + sl_inc = -(((o_sr_h >> o_sr_h_ps) << fract_bits) + dr_w - 1) / dr_w * 2; + sl_init = (sl_init_offs * (dr_w / o_sr_h) + iter_w + dest_pixels_fudge_x - 1) * -sl_inc; + } + } + else + { + sl_inc = (((o_sr_h >> o_sr_h_ps) << fract_bits) + dr_h - 1) / dr_h * 2; + sl_init = (sl_init_offs * (dr_h / o_sr_h)) * sl_inc; + } + + if(!rotation_on) + sl = sl_init; + //printf("%08x, %d\n", sl_init, sl_init >> fract_bits); + } + + if(rotation_on) + src_y = src_y_init; + else + src_y = 0; + + for(int y = 0; y < iter_h; y++) + { + T *dest_row_ptr = dest_pixels + (y * dest_pitchinpix); + const T *src_row_ptr; + const T *src_col_ptr; + + if(rotation_on) + { + src_x = src_x_init; + src_col_ptr = src_pixels + (src_y >> fract_bits); + if(scanlines_on) + sl = sl_init; + } + else + { + src_x = 0; + src_row_ptr = src_pixels + (src_y >> fract_bits) * src_pitchinpix; + } + + if(scanlines_on && (rotation_on || (sl & (1U << fract_bits)))) + { + for(int x = 0; x < iter_w; x++) + { + T pixel = rotation_on ? src_col_ptr[(src_x >> fract_bits) * src_pitchinpix] : src_row_ptr[(src_x >> fract_bits)]; + + if(!rotation_on || (sl & (1U << fract_bits))) + pixel = ((((pixel & 0xFF00FF) * sl_mult) >> 8) & 0x00FF00FF) | ((((pixel >> 8) & 0xFF00FF) * sl_mult) & 0xFF00FF00); + + WPSAE(dest_row_ptr[x], pixel); + src_x += src_x_inc; + if(rotation_on) + sl += sl_inc; + } + } + else + { + for(int x = 0; x < iter_w; x++) + { + T pixel = rotation_on ? src_col_ptr[(src_x >> fract_bits) * src_pitchinpix] : src_row_ptr[(src_x >> fract_bits)]; + + WPSAE(dest_row_ptr[x], pixel); + src_x += src_x_inc; + } + } + + src_y += src_y_inc; + if(scanlines_on && !rotation_on) + sl += sl_inc; + } +} + +void MDFN_StretchBlitSurface(MDFN_Surface *src_surface, const MDFN_Rect *src_rect, MDFN_Surface *dest_surface, const MDFN_Rect *dest_rect, bool source_alpha, int scanlines, const MDFN_Rect *original_src_rect, int rotated, int InterlaceField) +{ + if(!CheckSourceRect(src_surface, src_rect)) + return; + + if(!CheckDestRect(dest_surface, dest_rect)) + return; + + const bool NeedClipping = CheckDRNeedsClipping(dest_surface, dest_rect); + + + if(original_src_rect == NULL) + original_src_rect = src_rect; + + MDFN_Rect sr, dr, o_sr; + + sr = *src_rect; + o_sr = *original_src_rect; + dr = *dest_rect; + + //printf("%d:%d, %d:%d, %d:%d\n", sr.x, sr.w, sr.y, sr.h, src_surface->w, src_surface->h); + + if(rotated != MDFN_ROTATE0) + { + if(scanlines) + BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect, scanlines, rotated, InterlaceField); + else + BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect, 0, rotated); + + return; + } + + if(sr.w == dr.w && sr.h == dr.h && (!scanlines || (sr.w == o_sr.w && sr.h == o_sr.h))) + { + switch(source_alpha ? (int)src_surface->format.Ashift : -1) + { + case -1: BlitStraight(src_surface, &sr, dest_surface, &dr); break; + case 0: BlitStraight(src_surface, &sr, dest_surface, &dr); break; + case 8: BlitStraight(src_surface, &sr, dest_surface, &dr); break; + case 16: BlitStraight(src_surface, &sr, dest_surface, &dr); break; + case 24: BlitStraight(src_surface, &sr, dest_surface, &dr); break; + } + //BlitStraight(src_surface, &sr, dest_surface, &dr); + //SDL_BlitSurface(src_surface, &sr, dest_surface, &dr); + return; + } + + //printf("%d\n", dr.x); + + double dw_to_sw_ratio = (double)dr.w / sr.w; + double dh_to_sh_ratio = (double)dr.h / sr.h; + + if(!scanlines && !NeedClipping && floor(dw_to_sw_ratio) == dw_to_sw_ratio && floor(dh_to_sh_ratio) == dh_to_sh_ratio) + { + switch(source_alpha ? (int)src_surface->format.Ashift : -1) + { + case -1: if((dw_to_sw_ratio == dh_to_sh_ratio) && dw_to_sw_ratio <= 5) + nnx(dw_to_sw_ratio, src_surface, &sr, dest_surface, &dr); + else + BlitIScale(src_surface, sr, dest_surface, dr, dw_to_sw_ratio, dh_to_sh_ratio); + break; + + case 0: BlitIScale(src_surface, sr, dest_surface, dr, dw_to_sw_ratio, dh_to_sh_ratio); break; + case 8: BlitIScale(src_surface, sr, dest_surface, dr, dw_to_sw_ratio, dh_to_sh_ratio); break; + case 16: BlitIScale(src_surface, sr, dest_surface, dr, dw_to_sw_ratio, dh_to_sh_ratio); break; + case 24: BlitIScale(src_surface, sr, dest_surface, dr, dw_to_sw_ratio, dh_to_sh_ratio); break; + } + } + else + { + if(scanlines) + { + BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect, scanlines, 0, InterlaceField); + } + else switch(source_alpha ? (int)src_surface->format.Ashift : -1) + { + case -1: BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect); break; + case 0: BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect); break; + case 8: BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect); break; + case 16: BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect); break; + case 24: BlitSScale(src_surface, src_rect, dest_surface, dest_rect, original_src_rect); break; + } + } +} diff --git a/Mednafen/mednafen/drivers/nongl.h b/Mednafen/mednafen/drivers/nongl.h new file mode 100644 index 0000000000..0ad28a08f5 --- /dev/null +++ b/Mednafen/mednafen/drivers/nongl.h @@ -0,0 +1,8 @@ +#ifndef __MDFN_DRIVERS_NONGL_H +#define __MDFN_DRIVERS_NONGL_H + +// This function DOES NOT handle format conversions; IE the src_surface and dest_surface should be in the same color formats. +// Also, clipping is...sketchy. Just don't pass negative coordinates in the rects, and it should be ok. +void MDFN_StretchBlitSurface(MDFN_Surface *src_surface, const MDFN_Rect *src_rect, MDFN_Surface *dest_surface, const MDFN_Rect *dest_rect, bool source_alpha = false, int scanlines = 0, const MDFN_Rect *original_src_rect = NULL, int rotated = MDFN_ROTATE0, int InterlaceField = -1); + +#endif diff --git a/Mednafen/mednafen/drivers/opengl.cpp b/Mednafen/mednafen/drivers/opengl.cpp new file mode 100644 index 0000000000..379e0098ed --- /dev/null +++ b/Mednafen/mednafen/drivers/opengl.cpp @@ -0,0 +1,924 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include +#include +#include +#include + +#include "video.h" +#include "opengl.h" +#include "shader.h" + +void OpenGL_Blitter::ReadPixels(MDFN_Surface *surface, const MDFN_Rect *rect) +{ + p_glPixelStorei(GL_UNPACK_ROW_LENGTH, surface->pitchinpix); + p_glReadPixels(rect->x, gl_screen_h - rect->h - rect->y, rect->w, rect->h, PixelFormat, PixelType, surface->pixels); + + for(int y = 0; y < surface->h / 2; y++) + { + uint32 tmp_buffer[surface->w]; + + memcpy(tmp_buffer, &surface->pixels[y * surface->pitchinpix], surface->pitchinpix * sizeof(uint32)); + memcpy(&surface->pixels[y * surface->pitchinpix], &surface->pixels[(surface->h - 1 - y) * surface->pitchinpix], surface->pitchinpix * sizeof(uint32)); + memcpy(&surface->pixels[(surface->h - 1 - y) * surface->pitchinpix], tmp_buffer, surface->pitchinpix * sizeof(uint32)); + } +} + + +void OpenGL_Blitter::BlitRaw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *dest_rect, const bool source_alpha) +{ + unsigned int tmpwidth; + unsigned int tmpheight; + + if(SupportNPOT) + { + tmpwidth = rect->w; + tmpheight = rect->h; + } + else + { + tmpwidth = round_up_pow2(rect->w); + tmpheight = round_up_pow2(rect->h); + } + + if(tmpwidth > MaxTextureSize || tmpheight > MaxTextureSize) + { + MDFN_Rect neo_rect; + MDFN_Rect neo_dest_rect; + + for(int32 xseg = 0; xseg < rect->w; xseg += MaxTextureSize) + { + for(int32 yseg = 0; yseg < rect->h; yseg += MaxTextureSize) + { + neo_rect.x = rect->x + xseg; + neo_rect.w = rect->w - xseg; + + if(neo_rect.w > MaxTextureSize) + neo_rect.w = MaxTextureSize; + + neo_rect.y = rect->y + yseg; + neo_rect.h = rect->h - yseg; + + if(neo_rect.h > MaxTextureSize) + neo_rect.h = MaxTextureSize; + + neo_dest_rect.x = dest_rect->x + xseg * dest_rect->w / rect->w; + neo_dest_rect.y = dest_rect->y + yseg * dest_rect->h / rect->h; + neo_dest_rect.w = neo_rect.w * dest_rect->w / rect->w; + neo_dest_rect.h = neo_rect.h * dest_rect->h / rect->h; + BlitRaw(surface, &neo_rect, &neo_dest_rect, source_alpha); + } + } + } + else + { + // Don't move the source_alpha stuff out of this else { }, otherwise it will break the recursion necessary to work around maximum texture size limits. + if(source_alpha) + { + p_glEnable(GL_BLEND); + p_glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + p_glBindTexture(GL_TEXTURE_2D, textures[3]); + p_glPixelStorei(GL_UNPACK_ROW_LENGTH, surface->pitchinpix); + + p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tmpwidth, tmpheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + p_glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rect->w, rect->h, PixelFormat, PixelType, surface->pixels + rect->x + rect->y * surface->pitchinpix); + + p_glBegin(GL_QUADS); + + p_glTexCoord2f(0.0f, 1.0f * rect->h / tmpheight); // Bottom left of our picture. + p_glVertex2f(dest_rect->x, dest_rect->y + dest_rect->h); + + p_glTexCoord2f((float)rect->w / tmpwidth, 1.0f * rect->h / tmpheight); // Bottom right of our picture. + p_glVertex2f(dest_rect->x + dest_rect->w, dest_rect->y + dest_rect->h); + + p_glTexCoord2f((float)rect->w / tmpwidth, 0.0f); // Top right of our picture. + p_glVertex2f(dest_rect->x + dest_rect->w, dest_rect->y); + + p_glTexCoord2f(0.0f, 0.0f); // Top left of our picture. + p_glVertex2f(dest_rect->x, dest_rect->y); + + p_glEnd(); + + if(source_alpha) + { + p_glDisable(GL_BLEND); + } + } +} + +static INLINE void MakeSourceCoords(const MDFN_Rect *src_rect, float sc[4][2], const int32 tmpwidth, const int32 tmpheight) +{ + // Upper left + sc[0][0] = (float)src_rect->x / tmpwidth; // X + sc[0][1] = (float)src_rect->y / tmpheight; // Y + + // Upper right + sc[1][0] = (float)(src_rect->x + src_rect->w) / tmpwidth; // X + sc[1][1] = (float)(src_rect->y) / tmpheight; // Y + + // Lower right + sc[2][0] = (float)(src_rect->x + src_rect->w) / tmpwidth; // X + sc[2][1] = (float)(src_rect->y + src_rect->h) / tmpheight; // Y + + // Lower left + sc[3][0] = (float)src_rect->x / tmpwidth; // X + sc[3][1] = (float)(src_rect->y + src_rect->h) / tmpheight; // Y +} + +static INLINE void MakeDestCoords(const MDFN_Rect *dest_rect, int dest_coords[4][2], const unsigned rotated) +{ + signed dco = 0; + + if(rotated == MDFN_ROTATE90) + dco = 1; + else if(rotated == MDFN_ROTATE270) + dco = 3; + else if(rotated == MDFN_ROTATE180) + dco = 2; + + // Upper left + dest_coords[dco][0] = dest_rect->x; + dest_coords[dco][1] = dest_rect->y; + dco = (dco + 1) & 3; + + // Upper Right + dest_coords[dco][0] = dest_rect->x + dest_rect->w; + dest_coords[dco][1] = dest_rect->y; + dco = (dco + 1) & 3; + + // Lower right + dest_coords[dco][0] = dest_rect->x + dest_rect->w; + dest_coords[dco][1] = dest_rect->y + dest_rect->h; + dco = (dco + 1) & 3; + + // Lower left + dest_coords[dco][0] = dest_rect->x; + dest_coords[dco][1] = dest_rect->y + dest_rect->h; + dco = (dco + 1) & 3; + + //printf("%f:%f %f:%f %f:%f %f:%f\n", dest_coords[0][0], dest_coords[0][1], dest_coords[1][0], dest_coords[1][1], dest_coords[2][0], + // dest_coords[2][1], dest_coords[3][0], dest_coords[3][1]); +} + +//#define MDFN_TRIANGLE_STRIP_TEST + +#ifdef MDFN_TRIANGLE_STRIP_TEST +INLINE void OpenGL_Blitter::DrawQuad(float src_coords[4][2], int dest_coords[4][2]) +{ + puts("TRIANGLESSSS"); +#if 0 + // Lower left + p_glTexCoord2f(src_coords[3][0], src_coords[3][1]); + p_glVertex2f(dest_coords[3][0], dest_coords[3][1]); + + // Upper left + p_glTexCoord2f(src_coords[0][0], src_coords[0][1]); + p_glVertex2f(dest_coords[0][0], dest_coords[0][1]); + + // Lower right + p_glTexCoord2f(src_coords[2][0], src_coords[2][1]); + p_glVertex2f(dest_coords[2][0], dest_coords[2][1]); + +#endif + + // Upper right + p_glTexCoord2f(src_coords[1][0], src_coords[1][1]); + p_glVertex2f(dest_coords[1][0], dest_coords[1][1]); + + // Upper left + p_glTexCoord2f(src_coords[0][0], src_coords[0][1]); + p_glVertex2f(dest_coords[0][0], dest_coords[0][1]); + + // Lower right + p_glTexCoord2f(src_coords[2][0], src_coords[2][1]); + p_glVertex2f(dest_coords[2][0], dest_coords[2][1]); + + // Lower left + p_glTexCoord2f(src_coords[3][0], src_coords[3][1]); + p_glVertex2f(dest_coords[3][0], dest_coords[3][1]); +} +#else +INLINE void OpenGL_Blitter::DrawQuad(float src_coords[4][2], int dest_coords[4][2]) +{ + // Lower left + p_glTexCoord2f(src_coords[3][0], src_coords[3][1]); + p_glVertex2f(dest_coords[3][0], dest_coords[3][1]); + + // Lower right + p_glTexCoord2f(src_coords[2][0], src_coords[2][1]); + p_glVertex2f(dest_coords[2][0], dest_coords[2][1]); + + // Upper right + p_glTexCoord2f(src_coords[1][0], src_coords[1][1]); + p_glVertex2f(dest_coords[1][0], dest_coords[1][1]); + + // Upper left + p_glTexCoord2f(src_coords[0][0], src_coords[0][1]); + p_glVertex2f(dest_coords[0][0], dest_coords[0][1]); +} +#endif + +void OpenGL_Blitter::DrawLinearIP(const unsigned UsingIP, const unsigned rotated, const MDFN_Rect *tex_src_rect, const MDFN_Rect *dest_rect, const uint32 tmpwidth, const uint32 tmpheight) +{ + MDFN_Rect tmp_sr = *tex_src_rect; + MDFN_Rect tmp_dr = *dest_rect; + float tmp_sc[4][2]; + int tmp_dc[4][2]; + + int32 start_pos; + int32 bound_pos; + bool rotate_side = (rotated == MDFN_ROTATE90 || rotated == MDFN_ROTATE270); + bool reversi; + bool dr_y; + bool sr_y; + + if((UsingIP == VIDEOIP_LINEAR_Y) ^ rotate_side) + { + start_pos = dest_rect->x; + bound_pos = dest_rect->x + dest_rect->w; + dr_y = false; + sr_y = rotate_side; + } + else + { + start_pos = dest_rect->y; + bound_pos = dest_rect->y + dest_rect->h; + dr_y = true; + sr_y = !rotate_side; + } + + //printf("Start: %4d, Bound: %4d sr_y=%d, reversi=%d\n", start_pos, bound_pos, sr_y, reversi); + + reversi = (rotated == MDFN_ROTATE270 && UsingIP == VIDEOIP_LINEAR_X) || (rotated == MDFN_ROTATE90 && UsingIP == VIDEOIP_LINEAR_Y); + + for(int i = start_pos; i < bound_pos; i++) + { + int sr_goon = i - start_pos; + + if(dr_y) + { + tmp_dr.y = i; + tmp_dr.h = 1; + } + else + { + tmp_dr.x = i; + tmp_dr.w = 1; + } + + if(reversi) + sr_goon = (bound_pos - start_pos) - 1 - sr_goon; + + if(sr_y) + { + tmp_sr.y = sr_goon * tex_src_rect->h / (rotate_side ? dest_rect->w : dest_rect->h); + tmp_sr.h = 1; + } + else + { + tmp_sr.x = sr_goon * tex_src_rect->w / (rotate_side ? dest_rect->h : dest_rect->w); + tmp_sr.w = 1; + } + + MakeSourceCoords(&tmp_sr, tmp_sc, tmpwidth, tmpheight); + MakeDestCoords(&tmp_dr, tmp_dc, rotated); + + DrawQuad(tmp_sc, tmp_dc); + } +} + +void OpenGL_Blitter::Blit(MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, const MDFN_Rect *original_src_rect, int InterlaceField, int UsingIP, int rotated) +{ + MDFN_Rect tex_src_rect = *src_rect; + float src_coords[4][2]; + int dest_coords[4][2]; + unsigned int tmpwidth; + unsigned int tmpheight; + uint32 *src_pixies; + + if(shader) + { + if(shader->ShaderNeedsBTIP()) + UsingIP = VIDEOIP_BILINEAR; + else + UsingIP = VIDEOIP_OFF; + } + + if(src_rect->w == 0 || src_rect->h == 0 || dest_rect->w == 0 || dest_rect->h == 0 || original_src_rect->w == 0 || original_src_rect->h == 0) + { + printf("[BUG] OpenGL blitting nothing? --- %d:%d %d:%d %d:%d\n", src_rect->w, src_rect->h, dest_rect->w, dest_rect->h, original_src_rect->w, original_src_rect->h); + return; + } + + + src_pixies = src_surface->pixels + tex_src_rect.x + tex_src_rect.y * src_surface->pitchinpix; + tex_src_rect.x = 0; + tex_src_rect.y = 0; + + MakeDestCoords(dest_rect, dest_coords, rotated); + + p_glBindTexture(GL_TEXTURE_2D, textures[0]); + p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, UsingIP ? GL_LINEAR : GL_NEAREST); + p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, UsingIP ? GL_LINEAR : GL_NEAREST); + + if(SupportNPOT) + { + tmpwidth = src_rect->w; + tmpheight = src_rect->h; + + if(tmpwidth != last_w || tmpheight != last_h) + { + p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tmpwidth, tmpheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + last_w = tmpwidth; + last_h = tmpheight; + } + } + else + { + bool ImageSizeChange = FALSE; + + tmpwidth = round_up_pow2(src_rect->w); + tmpheight = round_up_pow2(src_rect->h); + + // If the required GL texture size has changed, resize the texture! :b + if(tmpwidth != round_up_pow2(last_w) || tmpheight != round_up_pow2(last_h)) + { + p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tmpwidth, tmpheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + ImageSizeChange = TRUE; + } + + // If the dimensions of our image stored in the texture have changed... + if(src_rect->w != last_w || src_rect->h != last_h) + ImageSizeChange = TRUE; + + // Only clean up if we're using pixel shaders and/or bilinear interpolation + if(ImageSizeChange && (shader || UsingIP)) + { + uint32 neo_dbs = DummyBlackSize; + + if(src_rect->w != tmpwidth && neo_dbs < src_rect->h) + neo_dbs = src_rect->h; + + if(src_rect->h != tmpheight && neo_dbs < src_rect->w) + neo_dbs = src_rect->w; + + if(neo_dbs != DummyBlackSize) + { + //printf("Realloc: %d\n", neo_dbs); + if(DummyBlack) + MDFN_free(DummyBlack); + + if((DummyBlack = (uint32 *)MDFN_calloc(neo_dbs, sizeof(uint32), _("OpenGL dummy black texture data")))) + DummyBlackSize = neo_dbs; + else + DummyBlackSize = 0; + } + + //printf("Cleanup: %d %d, %d %d\n", src_rect->w, src_rect->h, tmpwidth, tmpheight); + + if(DummyBlack) // If memory allocation failed for some reason, don't clean the texture. :( + { + if(src_rect->w < tmpwidth) + { + //puts("X"); + p_glPixelStorei(GL_UNPACK_ROW_LENGTH, 1); + p_glTexSubImage2D(GL_TEXTURE_2D, 0, src_rect->w, 0, 1, src_rect->h, GL_RGBA, GL_UNSIGNED_BYTE, DummyBlack); + } + if(src_rect->h < tmpheight) + { + //puts("Y"); + p_glPixelStorei(GL_UNPACK_ROW_LENGTH, src_rect->w); + p_glTexSubImage2D(GL_TEXTURE_2D, 0, 0, src_rect->h, src_rect->w, 1, GL_RGBA, GL_UNSIGNED_BYTE, DummyBlack); + } + } // end if(DummyBlack) + + } + + last_w = src_rect->w; + last_h = src_rect->h; + } + + MakeSourceCoords(&tex_src_rect, src_coords, tmpwidth, tmpheight); + + if(shader) + shader->ShaderBegin(gl_screen_w, gl_screen_h, src_rect, dest_rect, tmpwidth, tmpheight, round((double)tmpwidth * original_src_rect->w / src_rect->w), round((double)tmpheight * original_src_rect->h / src_rect->h), rotated); + + p_glPixelStorei(GL_UNPACK_ROW_LENGTH, src_surface->pitchinpix); + + p_glTexSubImage2D(GL_TEXTURE_2D, 0, tex_src_rect.x, tex_src_rect.y, tex_src_rect.w, tex_src_rect.h, PixelFormat, PixelType, src_pixies); + + // + // Draw texture + // +#ifdef MDFN_TRIANGLE_STRIP_TEST + p_glBegin(GL_TRIANGLE_STRIP); +#else + p_glBegin(GL_QUADS); +#endif + + if(UsingIP == VIDEOIP_LINEAR_X || UsingIP == VIDEOIP_LINEAR_Y) // Linear interpolation, on one axis + { + DrawLinearIP(UsingIP, rotated, &tex_src_rect, dest_rect, tmpwidth, tmpheight); + } + else // Regular bilinear or no interpolation. + { + DrawQuad(src_coords, dest_coords); + } + + p_glEnd(); + + if(shader) + shader->ShaderEnd(); + + if(using_scanlines) + { + float yif_offset = 0; + int yh_shift = 0; + + if(using_scanlines < 0 && InterlaceField >= 0) + { + yif_offset = (float)InterlaceField / 512; + yh_shift = 1; + } + + + p_glEnable(GL_BLEND); + + p_glBindTexture(GL_TEXTURE_2D, textures[1]); + p_glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA); + + p_glBegin(GL_QUADS); + + p_glTexCoord2f(0.0f, yif_offset + (original_src_rect->h >> yh_shift) / 256.0f); // Bottom left of our picture. + p_glVertex2f((signed)dest_coords[3][0], (signed)dest_coords[3][1]); + + p_glTexCoord2f(1.0f, yif_offset + (original_src_rect->h >> yh_shift) / 256.0f); // Bottom right of our picture. + p_glVertex2f((signed)dest_coords[2][0], (signed)dest_coords[2][1]); + + p_glTexCoord2f(1.0f, yif_offset); // Top right of our picture. + p_glVertex2f((signed)dest_coords[1][0], (signed)dest_coords[1][1]); + + p_glTexCoord2f(0.0f, yif_offset); // Top left of our picture. + p_glVertex2f((signed)dest_coords[0][0], (signed)dest_coords[0][1]); + + p_glEnd(); + p_glDisable(GL_BLEND); + } + + //if(1) + //{ + // p_glAccum(GL_MULT, 0.99); + // p_glAccum(GL_ACCUM, 1 - 0.99); + // p_glAccum(GL_RETURN, 1.0); + //} +} + + +#if 0 +void OpenGL_Blitter::HardSync(uint64 timeout) +{ + GLsync s; + + if(SupportARBSync) + { + if((s = p_glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) != NULL) + { + p_glBegin(GL_POINTS); + p_glVertex2f(0.0, 0.0); + p_glEnd(); + + uint32 before = MDFND_GetTime(); + + p_glClientWaitSync(s, 0, timeout); //50ULL * 1000 * 1000); // 50 milliseconds. + + printf("Waited: %u\n", MDFND_GetTime() - before); + + p_glDeleteSync(s); + } + } +} +#endif + +void OpenGL_Blitter::Cleanup(void) +{ + if(textures[0]) + p_glDeleteTextures(4, &textures[0]); + + textures[0] = textures[1] = textures[2] = textures[3] = 0; + + if(rgb_mask) + { + p_glDeleteTextures(1, &rgb_mask); + rgb_mask = 0; + } + + if(DummyBlack) + { + MDFN_free(DummyBlack); + DummyBlack = NULL; + } + DummyBlackSize = 0; + + if(shader) + { + delete shader; + shader = NULL; + } +} + +OpenGL_Blitter::~OpenGL_Blitter() +{ + Cleanup(); +} + +static bool CheckExtension(const char *extensions, const char *testval) +{ + const char *extparse = extensions; + const size_t testval_len = strlen(testval); + + while((extparse = strstr(extparse, testval))) + { + if(extparse == extensions || *(extparse - 1) == ' ') + { + if(extparse[testval_len] == ' ' || extparse[testval_len] == 0) + { + return(TRUE); + } + } + extparse += testval_len; + } + return(FALSE); +} + +static bool CheckAlternateFormat(const uint32 version_h) +{ + if(version_h >= 0x0102) // >= 1.2 + { + #if defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) || defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) + return(true); + #endif + } + return(false); +} + +/* Rectangle, left, right(not inclusive), top, bottom(not inclusive). */ +OpenGL_Blitter::OpenGL_Blitter(int scanlines, ShaderType pixshader, const int screen_w, const int screen_h, int *rs, int *gs, int *bs, int *as) : gl_screen_w(screen_w), gl_screen_h(screen_h) +{ + try + { + const char *extensions; + const char *vendor; + const char *renderer; + const char *version; + uint32 version_h; + + MaxTextureSize = 0; + SupportNPOT = false; + SupportARBSync = false; + PixelFormat = 0; + PixelType = 0; + + for(unsigned i = 0; i < 4; i++) + textures[i] = 0; + + rgb_mask = 0; + + using_scanlines = 0; + last_w = 0; + last_h = 0; + + OSDLastWidth = 0; + OSDLastHeight = 0; + + shader = NULL; + + DummyBlack = NULL; + DummyBlackSize = 0; + + + #define LFG(x) if(!(p_##x = (x##_Func) SDL_GL_GetProcAddress(#x))) { throw MDFN_Error(0, _("Error getting proc address for: %s\n"), #x); } + #define LFGN(x) p_##x = (x##_Func) SDL_GL_GetProcAddress(#x) + + LFG(glGetError); + LFG(glBindTexture); + LFGN(glColorTableEXT); + LFG(glTexImage2D); + LFG(glBegin); + LFG(glVertex2f); + LFG(glTexCoord2f); + LFG(glEnd); + LFG(glEnable); + LFG(glBlendFunc); + LFG(glGetString); + LFG(glViewport); + LFG(glGenTextures); + LFG(glDeleteTextures); + LFG(glTexParameteri); + LFG(glClearColor); + LFG(glLoadIdentity); + LFG(glClear); + LFG(glMatrixMode); + LFG(glDisable); + LFG(glPixelStorei); + LFG(glTexSubImage2D); + LFG(glFinish); + LFG(glOrtho); + LFG(glPixelTransferf); + LFG(glColorMask); + LFG(glTexEnvf); + LFG(glGetIntegerv); + LFG(glTexGend); + LFG(glRasterPos2i); + LFG(glDrawPixels); + LFG(glPixelZoom); + LFG(glAccum); + LFG(glClearAccum); + LFG(glGetTexLevelParameteriv); + LFG(glPushMatrix); + LFG(glPopMatrix); + LFG(glRotated); + LFG(glScalef); + LFG(glReadPixels); + + vendor = (const char *)p_glGetString(GL_VENDOR); + renderer = (const char *)p_glGetString(GL_RENDERER); + version = (const char *)p_glGetString(GL_VERSION); + + { + int major = 0, minor = 0; + trio_sscanf(version, "%d.%d", &major, &minor); + if(minor < 0) minor = 0; + if(minor > 255) minor = 255; + + version_h = (major << 8) | minor; + //printf("%08x\n", version_h); + } + + MDFN_printf(_("OpenGL Implementation: %s %s %s\n"), vendor, renderer, version); + + extensions = (const char*)p_glGetString(GL_EXTENSIONS); + + MDFN_printf(_("Checking extensions:\n")); + MDFN_indent(1); + + SupportNPOT = FALSE; + SupportARBSync = false; + + if(CheckExtension(extensions, "GL_ARB_texture_non_power_of_two")) + { + MDFN_printf(_("GL_ARB_texture_non_power_of_two found.\n")); + SupportNPOT = TRUE; + } + + if(CheckExtension(extensions, "GL_ARB_sync")) + { + MDFN_printf(_("GL_ARB_sync found.\n")); + LFG(glFenceSync); + LFG(glIsSync); + LFG(glDeleteSync); + LFG(glClientWaitSync); + LFG(glWaitSync); + LFG(glGetInteger64v); + LFG(glGetSynciv); + SupportARBSync = true; + } + + MDFN_indent(-1); + + // x,y specify LOWER left corner of the viewport. + p_glViewport(0, 0, gl_screen_w, gl_screen_h); + + p_glGenTextures(4, &textures[0]); + p_glGenTextures(1, &rgb_mask); + using_scanlines = 0; + + shader = NULL; + + if(pixshader != SHADER_NONE) + { + LFG(glCreateShaderObjectARB); + LFG(glShaderSourceARB); + LFG(glCompileShaderARB); + LFG(glCreateProgramObjectARB); + LFG(glAttachObjectARB); + LFG(glLinkProgramARB); + LFG(glUseProgramObjectARB); + LFG(glUniform1fARB); + LFG(glUniform2fARB); + LFG(glUniform3fARB); + LFG(glUniform1iARB); + LFG(glUniform2iARB); + LFG(glUniform3iARB); + LFG(glUniformMatrix2fvARB); + LFG(glActiveTextureARB); + LFG(glGetInfoLogARB); + LFG(glGetUniformLocationARB); + LFG(glDeleteObjectARB); + LFG(glDetachObjectARB); + + LFG(glGetObjectParameterivARB); + + shader = new OpenGL_Blitter_Shader(this, pixshader); + SupportNPOT = 0; // Our pixel shaders don't work right with NPOT textures(for them to do so would probably necessitate rewriting them to use texelFetch) + p_glActiveTextureARB(GL_TEXTURE0_ARB); + } + + // printf here because pixel shader code will set SupportNPOT to 0 + + if(SupportNPOT) + MDFN_printf(_("Using non-power-of-2 sized textures.\n")); + else + MDFN_printf(_("Using power-of-2 sized textures.\n")); + + if(scanlines) + { + int slcount; + + using_scanlines = scanlines; + + p_glBindTexture(GL_TEXTURE_2D, textures[1]); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); + + uint8 *buf=(uint8*)malloc(64 * (256 * 2) * 4); + + slcount = 0; + for(int y=0;y<(256 * 2);y++) + { + for(int x=0;x<64;x++) + { + int sl_alpha; + + if(slcount) + sl_alpha = 0xFF - (0xFF * abs(scanlines) / 100); + else + sl_alpha = 0xFF; + + buf[y*64*4+x*4]=0; + buf[y*64*4+x*4+1]=0; + buf[y*64*4+x*4+2]=0; + buf[y*64*4+x*4+3] = sl_alpha; + //buf[y*256+x]=(y&1)?0x00:0xFF; + } + slcount ^= 1; + } + p_glPixelStorei(GL_UNPACK_ROW_LENGTH, 64); + p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 64, 256 * 2, 0, GL_RGBA,GL_UNSIGNED_BYTE,buf); + free(buf); + } + p_glBindTexture(GL_TEXTURE_2D, textures[3]); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); + + + p_glBindTexture(GL_TEXTURE_2D, textures[0]); + + p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + //p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 0x812F); + //p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 0x812F); + + p_glBindTexture(GL_TEXTURE_2D, textures[2]); + + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); + p_glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); + + p_glEnable(GL_TEXTURE_2D); + p_glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Background color to black. + p_glMatrixMode(GL_MODELVIEW); + + p_glLoadIdentity(); + p_glFinish(); + + p_glDisable(GL_TEXTURE_1D); + p_glDisable(GL_FOG); + p_glDisable(GL_LIGHTING); + p_glDisable(GL_LOGIC_OP); + p_glDisable(GL_DITHER); + p_glDisable(GL_COLOR_MATERIAL); + p_glDisable(GL_NORMALIZE); + p_glDisable(GL_SCISSOR_TEST); + p_glDisable(GL_STENCIL_TEST); + p_glDisable(GL_ALPHA_TEST); + p_glDisable(GL_DEPTH_TEST); + + p_glPixelTransferf(GL_RED_BIAS, 0); + p_glPixelTransferf(GL_GREEN_BIAS, 0); + p_glPixelTransferf(GL_BLUE_BIAS, 0); + p_glPixelTransferf(GL_ALPHA_BIAS, 0); + + p_glPixelTransferf(GL_RED_SCALE, 1); + p_glPixelTransferf(GL_GREEN_SCALE, 1); + p_glPixelTransferf(GL_BLUE_SCALE, 1); + p_glPixelTransferf(GL_ALPHA_SCALE, 1); + + p_glPixelTransferf(GL_MAP_COLOR, GL_FALSE); + + p_glOrtho(0, gl_screen_w, gl_screen_h, 0, -1.0, 1.0); + + last_w = 0; + last_h = 0; + + OSDLastWidth = OSDLastHeight = 0; + + + MDFN_printf(_("Checking maximum texture size...\n")); + MDFN_indent(1); + p_glBindTexture(GL_TEXTURE_2D, textures[0]); + // Assume maximum texture width is the same as maximum texture height to greatly simplify things + MaxTextureSize = 32768; + + while(MaxTextureSize) + { + GLint width_test = 0; + + p_glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGBA, MaxTextureSize, MaxTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + p_glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width_test); + + if((unsigned int)width_test == MaxTextureSize) + break; + + MaxTextureSize >>= 1; + } + MDFN_printf(_("Apparently it is at least: %d x %d\n"), MaxTextureSize, MaxTextureSize); + + if(MaxTextureSize < 256) + { + MDFN_printf(_("Warning: Maximum texture size is reported as being less than 256, but we can't handle that.\n")); + MaxTextureSize = 256; + } + + DummyBlack = NULL; + DummyBlackSize = 0; + + MDFN_indent(-1); + + if(!CheckAlternateFormat(version_h)) + { + #ifdef LSB_FIRST + *rs = 0; + *gs = 8; + *bs = 16; + *as = 24; + #else + *rs = 24; + *gs = 16; + *bs = 8; + *as = 0; + #endif + PixelFormat = GL_RGBA; + PixelType = GL_UNSIGNED_BYTE; + MDFN_printf(_("Using GL_RGBA, GL_UNSIGNED_BYTE for texture source data.\n")); + } + else + { + *as = 24; + *rs = 16; + *gs = 8; + *bs = 0; + PixelFormat = GL_BGRA; + PixelType = GL_UNSIGNED_INT_8_8_8_8_REV; + MDFN_printf(_("Using GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV for texture source data.\n")); + } + } + catch(...) + { + Cleanup(); + throw; + } +} + +void OpenGL_Blitter::ClearBackBuffer(void) +{ + //if(1) + //{ + // p_glClearAccum(0.0, 0.0, 0.0, 1.0); + // p_glClear(GL_COLOR_BUFFER_BIT | GL_ACCUM_BUFFER_BIT); + //} + //else + //{ + p_glClear(GL_COLOR_BUFFER_BIT); + //} +} + diff --git a/Mednafen/mednafen/drivers/opengl.h b/Mednafen/mednafen/drivers/opengl.h new file mode 100644 index 0000000000..188bcfcfc8 --- /dev/null +++ b/Mednafen/mednafen/drivers/opengl.h @@ -0,0 +1,258 @@ +#ifndef __DRIVERS_OPENGL_H +#define __DRIVERS_OPENGL_H + +//#define GL_GLEXT_LEGACY +//#ifdef HAVE_APPLE_OPENGL_FRAMEWORK +//#include +//#include +//#include +//#else +//#include +//#include +//#include +//#endif + +#include + + +#ifndef GLAPIENTRY + #ifdef APIENTRY + #define GLAPIENTRY APIENTRY + #else + #define GLAPIENTRY + #endif +#endif + +typedef GLenum GLAPIENTRY (*glGetError_Func)(void); + +typedef void GLAPIENTRY (*glBindTexture_Func)(GLenum target,GLuint texture); +typedef void GLAPIENTRY (*glColorTableEXT_Func)(GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *table); +typedef void GLAPIENTRY (*glTexImage2D_Func)(GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels); +typedef void GLAPIENTRY (*glBegin_Func)(GLenum mode); +typedef void GLAPIENTRY (*glVertex2f_Func)(GLfloat x, GLfloat y); +typedef void GLAPIENTRY (*glTexCoord2f_Func)(GLfloat s, GLfloat t); +typedef void GLAPIENTRY (*glEnd_Func)(void); +typedef void GLAPIENTRY (*glEnable_Func)(GLenum cap); +typedef void GLAPIENTRY (*glBlendFunc_Func)(GLenum sfactor, GLenum dfactor); +typedef const GLubyte* GLAPIENTRY (*glGetString_Func)(GLenum name); +typedef void GLAPIENTRY (*glViewport_Func)(GLint x, GLint y,GLsizei width, + GLsizei height); +typedef void GLAPIENTRY (*glGenTextures_Func)(GLsizei n, GLuint *textures); +typedef void GLAPIENTRY (*glDeleteTextures_Func)(GLsizei n, + const GLuint *textures); +typedef void GLAPIENTRY (*glTexParameteri_Func)(GLenum target, GLenum pname, + GLint param); +typedef void GLAPIENTRY (*glClearColor_Func)(GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha); +typedef void GLAPIENTRY (*glLoadIdentity_Func)(void); +typedef void GLAPIENTRY (*glClear_Func)(GLbitfield mask); +typedef void GLAPIENTRY (*glMatrixMode_Func)(GLenum mode); +typedef void GLAPIENTRY (*glDisable_Func)(GLenum cap); + +typedef void GLAPIENTRY (*glPixelStorei_Func)(GLenum pname, GLint param); +typedef void GLAPIENTRY (*glTexSubImage2D_Func)(GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels); +typedef void GLAPIENTRY (*glFinish_Func)(void); +typedef void GLAPIENTRY (*glOrtho_Func)(GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val); +typedef void GLAPIENTRY (*glPixelTransferf_Func)(GLenum pname, GLfloat param); +typedef void GLAPIENTRY (*glColorMask_Func)(GLboolean, GLboolean, GLboolean, GLboolean); +typedef void GLAPIENTRY (*glTexEnvf_Func)(GLenum, GLenum, GLfloat); +typedef void GLAPIENTRY (*glGetIntegerv_Func)(GLenum, GLint *); +typedef void GLAPIENTRY (*glTexGend_Func)(GLenum, GLenum, GLdouble); +typedef void GLAPIENTRY (*glRasterPos2i_Func)(GLint x, GLint y); +typedef void GLAPIENTRY (*glDrawPixels_Func)(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +typedef void GLAPIENTRY (*glPixelZoom_Func)(GLfloat, GLfloat); +typedef void GLAPIENTRY (*glGetTexLevelParameteriv_Func)(GLenum target, GLint level, GLenum pname, GLint *params); +typedef void GLAPIENTRY (*glAccum_Func)(GLenum, GLfloat); +typedef void GLAPIENTRY (*glClearAccum_Func)(GLfloat, GLfloat, GLfloat, GLfloat); +typedef void GLAPIENTRY (*glPushMatrix_Func)(void); +typedef void GLAPIENTRY (*glPopMatrix_Func)(void); +typedef void GLAPIENTRY (*glRotated_Func)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void GLAPIENTRY (*glScalef_Func)(GLfloat x, GLfloat y, GLfloat z); +typedef void GLAPIENTRY (*glReadPixels_Func)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *data); + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +typedef int64_t GLint64; +typedef uint64_t GLuint64; +typedef struct __GLsync *GLsync; + +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D + +#endif + +typedef GLsync GLAPIENTRY (*glFenceSync_Func)(GLenum condition, GLbitfield flags); +typedef GLboolean GLAPIENTRY (*glIsSync_Func)(GLsync sync); +typedef void GLAPIENTRY (*glDeleteSync_Func)(GLsync sync); + +typedef GLenum GLAPIENTRY (*glClientWaitSync_Func)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void GLAPIENTRY (*glWaitSync_Func)(GLsync sync, GLbitfield flags, GLuint64 timeout); + +typedef void GLAPIENTRY (*glGetInteger64v_Func)(GLenum pname, GLint64 *params); +typedef void GLAPIENTRY (*glGetSynciv_Func)(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values); + +typedef GLhandleARB GLAPIENTRY (*glCreateShaderObjectARB_Func)(GLenum); +typedef void GLAPIENTRY (*glShaderSourceARB_Func)(GLhandleARB, GLsizei, const GLcharARB* *, const GLint *); +typedef void GLAPIENTRY (*glCompileShaderARB_Func)(GLhandleARB); +typedef GLhandleARB GLAPIENTRY (*glCreateProgramObjectARB_Func)(void); +typedef void GLAPIENTRY (*glAttachObjectARB_Func)(GLhandleARB, GLhandleARB); +typedef void GLAPIENTRY (*glLinkProgramARB_Func)(GLhandleARB); +typedef void GLAPIENTRY (*glUseProgramObjectARB_Func)(GLhandleARB); +typedef void GLAPIENTRY (*glUniform1fARB_Func)(GLint, GLfloat); +typedef void GLAPIENTRY (*glUniform2fARB_Func)(GLint, GLfloat, GLfloat); +typedef void GLAPIENTRY (*glUniform3fARB_Func)(GLint, GLfloat, GLfloat, GLfloat); +typedef void GLAPIENTRY (*glUniform1iARB_Func)(GLint, GLint); +typedef void GLAPIENTRY (*glUniform2iARB_Func)(GLint, GLint, GLint); +typedef void GLAPIENTRY (*glUniform3iARB_Func)(GLint, GLint, GLint, GLint); +typedef void GLAPIENTRY (*glUniformMatrix2fvARB_Func)(GLint, GLsizei, GLboolean, const GLfloat*); +typedef void GLAPIENTRY (*glActiveTextureARB_Func)(GLenum); +typedef void GLAPIENTRY (*glGetInfoLogARB_Func)(GLhandleARB, GLsizei, GLsizei *, GLcharARB *); +typedef GLint GLAPIENTRY (*glGetUniformLocationARB_Func)(GLhandleARB, const GLcharARB *); +typedef void GLAPIENTRY (*glDeleteObjectARB_Func)(GLhandleARB); +typedef void GLAPIENTRY (*glDetachObjectARB_Func)(GLhandleARB, GLhandleARB); + +typedef void GLAPIENTRY (*glGetObjectParameterivARB_Func)(GLhandleARB, GLenum, GLint *); + + +#include "shader.h" + +class OpenGL_Blitter +{ + public: + + OpenGL_Blitter(int scanlines, ShaderType pixshader, const int screen_w, const int screen_h, int *rs, int *gs, int *bs, int *as); + ~OpenGL_Blitter(); + + void BlitRaw(MDFN_Surface *surface, const MDFN_Rect *rect, const MDFN_Rect *dest_rect, const bool source_alpha); + void Blit(MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, const MDFN_Rect *original_src_rect, int InterlaceField, int UsingIP, int rotated); + void ClearBackBuffer(void); + + //void HardSync(uint64 timeout); + + void ReadPixels(MDFN_Surface *surface, const MDFN_Rect *rect); + + private: + + void Cleanup(void); + void DrawQuad(float src_coords[4][2], int dest_coords[4][2]); + void DrawLinearIP(const unsigned UsingIP, const unsigned rotated, const MDFN_Rect *tex_src_rect, const MDFN_Rect *dest_rect, const uint32 tmpwidth, const uint32 tmpheight); + + glGetError_Func p_glGetError; + glBindTexture_Func p_glBindTexture; + glColorTableEXT_Func p_glColorTableEXT; + glTexImage2D_Func p_glTexImage2D; + glBegin_Func p_glBegin; + glVertex2f_Func p_glVertex2f; + glTexCoord2f_Func p_glTexCoord2f; + glEnd_Func p_glEnd; + glEnable_Func p_glEnable; + glBlendFunc_Func p_glBlendFunc; + glGetString_Func p_glGetString; + glViewport_Func p_glViewport; + glGenTextures_Func p_glGenTextures; + glDeleteTextures_Func p_glDeleteTextures; + glTexParameteri_Func p_glTexParameteri; + glClearColor_Func p_glClearColor; + glLoadIdentity_Func p_glLoadIdentity; + glClear_Func p_glClear; + glMatrixMode_Func p_glMatrixMode; + glDisable_Func p_glDisable; + glPixelStorei_Func p_glPixelStorei; + glTexSubImage2D_Func p_glTexSubImage2D; + glFinish_Func p_glFinish; + glOrtho_Func p_glOrtho; + glPixelTransferf_Func p_glPixelTransferf; + glColorMask_Func p_glColorMask; + glTexEnvf_Func p_glTexEnvf; + glGetIntegerv_Func p_glGetIntegerv; + glTexGend_Func p_glTexGend; + glDrawPixels_Func p_glDrawPixels; + glRasterPos2i_Func p_glRasterPos2i; + glPixelZoom_Func p_glPixelZoom; + glGetTexLevelParameteriv_Func p_glGetTexLevelParameteriv; + glAccum_Func p_glAccum; + glClearAccum_Func p_glClearAccum; + glPushMatrix_Func p_glPushMatrix; + glPopMatrix_Func p_glPopMatrix; + glRotated_Func p_glRotated; + glScalef_Func p_glScalef; + glReadPixels_Func p_glReadPixels; + + glFenceSync_Func p_glFenceSync; + glIsSync_Func p_glIsSync; + glDeleteSync_Func p_glDeleteSync; + glClientWaitSync_Func p_glClientWaitSync; + glWaitSync_Func p_glWaitSync; + glGetInteger64v_Func p_glGetInteger64v; + glGetSynciv_Func p_glGetSynciv; + + glCreateShaderObjectARB_Func p_glCreateShaderObjectARB; + glShaderSourceARB_Func p_glShaderSourceARB; + glCompileShaderARB_Func p_glCompileShaderARB; + glCreateProgramObjectARB_Func p_glCreateProgramObjectARB; + glAttachObjectARB_Func p_glAttachObjectARB; + glLinkProgramARB_Func p_glLinkProgramARB; + glUseProgramObjectARB_Func p_glUseProgramObjectARB; + glUniform1fARB_Func p_glUniform1fARB; + glUniform2fARB_Func p_glUniform2fARB; + glUniform3fARB_Func p_glUniform3fARB; + glUniform1iARB_Func p_glUniform1iARB; + glUniform2iARB_Func p_glUniform2iARB; + glUniform3iARB_Func p_glUniform3iARB; + glUniformMatrix2fvARB_Func p_glUniformMatrix2fvARB; + glActiveTextureARB_Func p_glActiveTextureARB; + glGetInfoLogARB_Func p_glGetInfoLogARB; + glGetUniformLocationARB_Func p_glGetUniformLocationARB; + glDeleteObjectARB_Func p_glDeleteObjectARB; + glDetachObjectARB_Func p_glDetachObjectARB; + glGetObjectParameterivARB_Func p_glGetObjectParameterivARB; + + uint32 MaxTextureSize; // Maximum power-of-2 texture width/height(we assume they're the same, and if they're not, this is set to the lower value of the two) + bool SupportNPOT; // True if the OpenGL implementation supports non-power-of-2-sized textures + bool SupportARBSync; + GLenum PixelFormat; // For glTexSubImage2D() + GLenum PixelType; // For glTexSubImage2D() + + const int gl_screen_w, gl_screen_h; + GLuint textures[4]; // emulated fb, scanlines, osd, raw(netplay) + GLuint rgb_mask; // TODO: RGB mask texture for LCD RGB triad simulation + + int using_scanlines; // Don't change to bool. + unsigned int last_w, last_h; + + uint32 OSDLastWidth, OSDLastHeight; + + OpenGL_Blitter_Shader *shader; + + uint32 *DummyBlack; // Black/Zeroed image data for cleaning textures + uint32 DummyBlackSize; + + friend class OpenGL_Blitter_Shader; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/overlay.cpp b/Mednafen/mednafen/drivers/overlay.cpp new file mode 100644 index 0000000000..207926f1a6 --- /dev/null +++ b/Mednafen/mednafen/drivers/overlay.cpp @@ -0,0 +1,304 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "main.h" +#include "video.h" +#include "overlay.h" +#include "nnx.h" +#include + +static SDL_Overlay *ov = NULL; + + +void OV_Blit(MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *original_src_rect, + const SDL_Rect *dest_rect, SDL_Surface *dest_surface, int softscale, int scanlines, int rotated) +{ + const uint32 spitch32 = src_surface->pitchinpix; + SDL_Rect drect = *dest_rect; + uint16 *dpixels; + uint32 dpitch16; + int32 need_w, need_h; + + if(softscale < 1) + softscale = 1; + + if(!rotated) + { + need_w = src_rect->w; + need_h = src_rect->h; + } + else + { + need_w = src_rect->h; + need_h = src_rect->w; + } + + need_w *= softscale; + need_h *= softscale; + + need_w = (need_w + 1) & ~1; + + if(!ov || ov->w != need_w || ov->h != need_h) + { + if(ov) + { + SDL_FreeYUVOverlay(ov); + ov = NULL; + } + if(!(ov = SDL_CreateYUVOverlay(need_w, need_h, SDL_YUY2_OVERLAY, dest_surface))) + { + puts("Overlay creation failure"); + return; + } + printf("Overlay Created: %d %d %d\n", ov->hw_overlay, ov->w, ov->h); + } + + if(SDL_LockYUVOverlay(ov) != 0) + { + puts("Lock failure"); + return; + } + dpixels = (uint16 *)ov->pixels[0]; + + assert(!(ov->pitches[0] & 1)); + + dpitch16 = ov->pitches[0] >> 1; + + if(rotated == MDFN_ROTATE90) + { + uint16 *drow = &dpixels[(need_h - 1) * dpitch16]; + + for(int y = 0; y < src_rect->w; y++) + { + uint32 *scol = src_surface->pixels + (src_rect->y * src_surface->pitchinpix) + src_rect->x + y; + + for(int x = 0; x < src_rect->h; x += 2) + { + unsigned int cb, cr; + + cb = ((scol[0] & 0x00FF00) + (scol[spitch32] & 0x00FF00)) >> 9; + cr = ((scol[0] & 0xFF0000) + (scol[spitch32] & 0xFF0000)) >> 17; + + drow[x + 0] = (scol[0] & 0xFF) | (cb << 8); + drow[x + 1] = (scol[spitch32] & 0xFF) | (cr << 8); + + scol += spitch32 * 2; + } + drow -= dpitch16; + } + } + else if(rotated == MDFN_ROTATE270) + { + uint16 *drow = &dpixels[0]; + + for(int y = 0; y < src_rect->w; y++) + { + uint32 *scol = src_surface->pixels + (src_rect->y * src_surface->pitchinpix) + src_rect->x + y; + + scol += spitch32 * (need_w - 1); + + for(int x = 0; x < src_rect->h; x += 2) + { + unsigned int cb, cr; + + cb = ((scol[0] & 0x00FF00) + (scol[-(int)spitch32] & 0x00FF00)) >> 9; + cr = ((scol[0] & 0xFF0000) + (scol[-(int)spitch32] & 0xFF0000)) >> 17; + + drow[x + 0] = (scol[0] & 0xFF) | (cb << 8); + drow[x + 1] = (scol[-(int)spitch32] & 0xFF) | (cr << 8); + + scol -= spitch32 * 2; + } + drow += dpitch16; + } + } + else // Plain copy + { + //uint32 dest_pitch_diff = dpitch16 - (((src_rect->w + 1) & ~1) * softscale) + dpitch16 * (softscale - 1); + uint32 dest_pitch_diff = dpitch16 - (src_rect->w * softscale) + dpitch16 * (softscale - 1); + uint32 src_pitch_diff = src_surface->pitchinpix; + uint16 *drow = dpixels; + uint32 *srow = src_surface->pixels + (src_rect->y * src_surface->pitchinpix) + src_rect->x; + + // Dest pointer is always incremented by 2. + dest_pitch_diff &= ~1; + + if(softscale == 2) + { + for(int y = 0; y < src_rect->h; y++) + { + for(int x = 0; x < src_rect->w; x++) + { + const unsigned int cb = (srow[x] & 0x00FF00) >> 8; + const unsigned int cr = (srow[x] & 0xFF0000) >> 16; + const unsigned int tmp0 = (srow[x] & 0xFF) | (cb << 8); + const unsigned int tmp1 = (srow[x] & 0xFF) | (cr << 8); + + drow[0] = tmp0; + drow[1] = tmp1; + drow[dpitch16 + 0] = tmp0; + drow[dpitch16 + 1] = tmp1; + + drow += 2; + } + srow += src_pitch_diff; + drow += dest_pitch_diff; + } + } + else if(softscale == 3) + { + unsigned int weasel_cb = 0, weasel_cr = 0; + + for(int y = 0; y < src_rect->h; y++) + { + for(int x = 0; x < src_rect->w; x++) + { + const unsigned int cb = (srow[x] & 0x00FF00); + const unsigned int cr = (srow[x] & 0xFF0000) >> 8; + const unsigned int y_c = srow[x] & 0xFF; + unsigned int tmp0, tmp1, tmp2; + + tmp0 = y_c; + tmp1 = y_c; + tmp2 = y_c; + + if(x & 1) + { + tmp0 |= weasel_cr; + tmp1 |= cb; + tmp2 |= cr; + } + else + { + const unsigned int cb_next = (srow[x + 1] & 0x00FF00); + const unsigned int cr_next = (srow[x + 1] & 0xFF0000) >> 8; + + weasel_cb = ((cb + cb_next) >> 1) & 0xFF00; + weasel_cr = ((cr + cr_next) >> 1) & 0xFF00; + + tmp0 |= cb; + tmp1 |= cr; + tmp2 |= weasel_cb; + } + + drow[0] = tmp0; + drow[1] = tmp1; + drow[2] = tmp2; + + drow[dpitch16 + 0] = tmp0; + drow[dpitch16 + 1] = tmp1; + drow[dpitch16 + 2] = tmp2; + + drow[(dpitch16 << 1) + 0] = tmp0; + drow[(dpitch16 << 1) + 1] = tmp1; + drow[(dpitch16 << 1) + 2] = tmp2; + + drow += 3; + } + srow += src_pitch_diff; + drow += dest_pitch_diff; + } + } + else if(softscale == 4) + { + for(int y = 0; y < src_rect->h; y++) + { + for(int x = 0; x < src_rect->w; x++) + { + const unsigned int cb = (srow[x] & 0x00FF00) >> 8; + const unsigned int cr = (srow[x] & 0xFF0000) >> 16; + const unsigned int tmp0 = (srow[x] & 0xFF) | (cb << 8); + const unsigned int tmp1 = (srow[x] & 0xFF) | (cr << 8); + + + drow[0] = tmp0; + drow[1] = tmp1; + drow[2] = tmp0; + drow[3] = tmp1; + drow[dpitch16 + 0] = tmp0; + drow[dpitch16 + 1] = tmp1; + drow[dpitch16 + 2] = tmp0; + drow[dpitch16 + 3] = tmp1; + drow[(dpitch16 << 1) + 0] = tmp0; + drow[(dpitch16 << 1) + 1] = tmp1; + drow[(dpitch16 << 1) + 2] = tmp0; + drow[(dpitch16 << 1) + 3] = tmp1; + drow[(dpitch16 << 1) + dpitch16 + 0] = tmp0; + drow[(dpitch16 << 1) + dpitch16 + 1] = tmp1; + drow[(dpitch16 << 1) + dpitch16 + 2] = tmp0; + drow[(dpitch16 << 1) + dpitch16 + 3] = tmp1; + + drow += 4; + } + srow += src_pitch_diff; + drow += dest_pitch_diff; + } + } + else + { + //static bool room = 0; + //room ^= 1; //rand() & 1; + //printf("%d %d %d %d\n", src_rect->w, dpitch16, src_pitch_diff, dest_pitch_diff); + + for(int y = 0; y < src_rect->h; y++) + { + uint32 lastpixcow = srow[0]; //0x808000; + + for(int x = 0; x < src_rect->w; x += 2) + { + //unsigned int cb = ((srow[x + 0] & 0x00FF00) + (srow[x + 1] & 0x00FF00)) >> 9; + //unsigned int cr = ((srow[x + 0] & 0xFF0000) + (srow[x + 1] & 0xFF0000)) >> 17; + //if(room) + //{ + // cb = ((srow[x - 1] & 0x00FF00) + (srow[x + 0] & 0x00FF00)) >> 9; + // cr = ((srow[x - 1] & 0xFF0000) + (srow[x + 0] & 0xFF0000)) >> 17; + //} + // cb = (((srow[x + 0] >> 8) & 0xFF)*2 + ((srow[x + 1] >> 8) & 0xFF) + ((srow[x - 1] >> 8) & 0xFF) ) / 4; + // cr = (((srow[x + 0] >> 16) & 0xFF)*2 + ((srow[x + 1] >> 16) & 0xFF) + ((srow[x - 1] >> 16) & 0xFF) ) / 4; + unsigned int cb = ((lastpixcow & 0x00FF00) + ((srow[x + 0] & 0x00FF00) << 1) + (srow[x + 1] & 0x00FF00)) >> 10; + unsigned int cr = ((lastpixcow & 0xFF0000) + ((srow[x + 0] & 0xFF0000) << 1) + (srow[x + 1] & 0xFF0000)) >> 18; + + + drow[0] = (srow[x + 0] & 0xFF) | (cb << 8); + drow[1] = (srow[x + 1] & 0xFF) | (cr << 8); + + lastpixcow = srow[x + 1]; + + drow += 2; + } + srow += src_pitch_diff; + drow += dest_pitch_diff; + } + } // End else to softscale + } + SDL_UnlockYUVOverlay(ov); + + if(SDL_DisplayYUVOverlay(ov, &drect) != 0) + { + puts("Blit error"); + } +} + +void OV_Kill(void) +{ + if(ov) + { + SDL_FreeYUVOverlay(ov); + ov = NULL; + } +} diff --git a/Mednafen/mednafen/drivers/overlay.h b/Mednafen/mednafen/drivers/overlay.h new file mode 100644 index 0000000000..7c5f53d0ad --- /dev/null +++ b/Mednafen/mednafen/drivers/overlay.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_DRIVERS_OVERLAY_H +#define __MDFN_DRIVERS_OVERLAY_H + +void OV_Blit(MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *original_src_rect, + const SDL_Rect *dest_rect, SDL_Surface *dest_surface, int softscale, int scanlines, int rotated); + +void OV_Kill(void); + +#endif diff --git a/Mednafen/mednafen/drivers/prompt.cpp b/Mednafen/mednafen/drivers/prompt.cpp new file mode 100644 index 0000000000..afde4e6071 --- /dev/null +++ b/Mednafen/mednafen/drivers/prompt.cpp @@ -0,0 +1,209 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include +#include "prompt.h" +#include + +HappyPrompt::HappyPrompt(void) +{ + PromptText = ""; + kb_buffer.clear(); + kb_cursor_pos = 0; +} + +HappyPrompt::HappyPrompt(const std::string &ptext, const std::string &zestring) +{ + PromptText = ""; + kb_buffer.clear(); + kb_cursor_pos = 0; + SetText(ptext); + SetKBB(zestring); +} + +HappyPrompt::~HappyPrompt() +{ + +} + +void HappyPrompt::TheEnd(const std::string &pstring) +{ + + +} + +void HappyPrompt::SetText(const std::string &ptext) +{ + PromptText = ptext; +} + +void HappyPrompt::SetKBB(const std::string &zestring) +{ + UTF8 *utf8_buffer = (UTF8*)strdup(zestring.c_str()); + UTF32 *utf32_buffer; + const UTF8 *sourceStart = utf8_buffer, *sourceEnd = utf8_buffer + zestring.size(); + UTF32 *targetStart, *targetEnd; + + utf32_buffer = (UTF32 *)calloc(1, zestring.size() * 4); + targetStart = utf32_buffer; + targetEnd = utf32_buffer + zestring.size() * 4; + + + if(ConvertUTF8toUTF32(&sourceStart, sourceEnd, &targetStart, targetEnd,lenientConversion) == conversionOK) + { + size_t meow_count = targetStart - utf32_buffer; + + for(unsigned int x = 0; x < meow_count; x++) + { + kb_buffer.push_back(utf32_buffer[x]); + kb_cursor_pos++; + } + } + + free(utf32_buffer); +} + +#define MK_COLOR_A(r,g,b,a) (surface->MakeColor(r, g, b, a)) + +void HappyPrompt::Draw(MDFN_Surface *surface, const MDFN_Rect *rect) +{ + std::vector PromptAnswer; + std::vector PromptAnswerOffsets; + std::vector PromptAnswerWidths; + uint32 offset_accum = 0; + + PromptAnswerOffsets.clear(); + PromptAnswerWidths.clear(); + + for(unsigned int i = 0; i < kb_buffer.size(); i++) + { + uint32 gw; + UTF32 tmp_str[2]; + + PromptAnswer.push_back(kb_buffer[i]); + PromptAnswerOffsets.push_back(offset_accum); + + tmp_str[0] = kb_buffer[i]; + tmp_str[1] = 0; + + gw = GetTextPixLength(tmp_str, MDFN_FONT_6x13_12x13); + + offset_accum += gw; + PromptAnswerWidths.push_back(gw); + } + PromptAnswer.push_back(0); + PromptAnswerOffsets.push_back(offset_accum); + +/* +****************************** +* PC * +* F00F * +****************************** +*/ + uint32 *pixels = surface->pixels; + uint32 pitch32 = surface->pitchinpix; + + pixels += ((rect->h / 2) - (4 * 13 / 2)) * pitch32; + pixels += ((rect->w / 2) - (6 * 39 / 2)); + + for(unsigned int y = 0; y < 4 * 13; y++) + { + uint32 *row = pixels + y * pitch32; + for(unsigned int x = 0; x < 39 * 6; x++) + row[x] = MK_COLOR_A(0x00, 0x00, 0x00, 0xFF); + } + + DrawTextTrans(pixels, surface->pitchinpix << 2, 39 * 6, "╭────────────────────────────────────╮", MK_COLOR_A(0xFF,0xFF,0xFF,0xFF), 0, MDFN_FONT_6x13_12x13); + DrawTextTrans(pixels + 13 * 1 * pitch32, surface->pitchinpix << 2, 39 * 6, "│ │", MK_COLOR_A(0xFF,0xFF,0xFF,0xFF), 0, MDFN_FONT_6x13_12x13); + DrawTextTrans(pixels + 13 * 2 * pitch32, surface->pitchinpix << 2, 39 * 6, "│ │", MK_COLOR_A(0xFF,0xFF,0xFF,0xFF), 0, MDFN_FONT_6x13_12x13); + DrawTextTrans(pixels + 13 * 3 * pitch32, surface->pitchinpix << 2, 39 * 6, "╰────────────────────────────────────╯", MK_COLOR_A(0xFF,0xFF,0xFF,0xFF), 0, MDFN_FONT_6x13_12x13); + + DrawTextTrans(pixels + 13 * 1 * pitch32 + 2 * 6, surface->pitchinpix << 2, (39 - 4) * 6, PromptText.c_str(), MK_COLOR_A(0xFF, 0x00, 0xFF, 0xFF), 0, MDFN_FONT_6x13_12x13); + DrawTextTrans(pixels + (13 * 2 + 2) * pitch32 + 2 * 6, surface->pitchinpix << 2, (39 - 4) * 6, &PromptAnswer[0], MK_COLOR_A(0x00, 0xFF, 0x00, 0xFF), 0, MDFN_FONT_6x13_12x13); + + if(SDL_GetTicks() & 0x80) + { + uint32 xpos; + + xpos = PromptAnswerOffsets[kb_cursor_pos]; + if(xpos < ((39 - 4) * 6)) + { + const char *blinky_thingy = "▉"; + if(PromptAnswerWidths.size() > kb_cursor_pos && PromptAnswerWidths[kb_cursor_pos] == 12) + blinky_thingy = "▉▉"; + DrawTextTrans(pixels + (13 * 2 + 2) * pitch32 + 2 * 6 + xpos, surface->pitchinpix << 2, 9, blinky_thingy, MK_COLOR_A(0x00, 0xFF, 0x00, 0xFF), 0, MDFN_FONT_6x13_12x13); + } + } +} + +void HappyPrompt::Event(const SDL_Event *event) +{ + if(event->type == SDL_KEYDOWN) + { + switch(event->key.keysym.sym) + { + case SDLK_HOME: + kb_cursor_pos = 0; + break; + case SDLK_END: + kb_cursor_pos = kb_buffer.size(); + break; + case SDLK_LEFT: + if(kb_cursor_pos) + kb_cursor_pos--; + break; + case SDLK_RIGHT: + if(kb_cursor_pos < kb_buffer.size()) + kb_cursor_pos++; + break; + case SDLK_RETURN: + { + std::string concat_str; + + for(unsigned int i = 0; i < kb_buffer.size(); i++) + concat_str += kb_buffer[i]; + + TheEnd(concat_str); + kb_buffer.clear(); + kb_cursor_pos = 0; + } + break; + + case SDLK_BACKSPACE: + if(kb_buffer.size() && kb_cursor_pos) + { + kb_buffer.erase(kb_buffer.begin() + kb_cursor_pos - 1, kb_buffer.begin() + kb_cursor_pos); + kb_cursor_pos--; + } + break; + case SDLK_DELETE: + if(kb_buffer.size() && kb_cursor_pos < kb_buffer.size()) + { + kb_buffer.erase(kb_buffer.begin() + kb_cursor_pos, kb_buffer.begin() + kb_cursor_pos + 1); + } + break; + default: + if(event->key.keysym.unicode) + { + kb_buffer.insert(kb_buffer.begin() + kb_cursor_pos, event->key.keysym.unicode); + kb_cursor_pos++; + } + break; + } + } +} diff --git a/Mednafen/mednafen/drivers/prompt.h b/Mednafen/mednafen/drivers/prompt.h new file mode 100644 index 0000000000..4e6695780e --- /dev/null +++ b/Mednafen/mednafen/drivers/prompt.h @@ -0,0 +1,30 @@ +#ifndef __MDFN_DRIVERS_PROMPT_H +#define __MDFN_DRIVERS_PROMPT_H + +class HappyPrompt +{ + public: + HappyPrompt(const std::string &ptext, const std::string &zestring); + HappyPrompt(); + + virtual ~HappyPrompt(); + + void Draw(MDFN_Surface *surface, const MDFN_Rect *rect); + void Event(const SDL_Event *event); + void Init(const std::string &ptext, const std::string &zestring); + void SetText(const std::string &ptext); + void SetKBB(const std::string &zestring); + + virtual void TheEnd(const std::string &pstring); + + + protected: + std::string PromptText; + + private: + + std::vector kb_buffer; + unsigned int kb_cursor_pos; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/remote.cpp b/Mednafen/mednafen/drivers/remote.cpp new file mode 100644 index 0000000000..c4fd7fa516 --- /dev/null +++ b/Mednafen/mednafen/drivers/remote.cpp @@ -0,0 +1,290 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include + +#if defined(HAVE_FCNTL) && defined(HAVE_FCNTL_H) +#include +#include +#include +#include + +// Code for the stdio emulator interface. +static char *OutputKey = NULL; +static char *InputBuffer = NULL; +static int64 InputBufferLen = 0; +static int64 InputBufferOffset = 0; + +// This kludge gives me nightmares. +//static bool CaptureErrorMessages = FALSE; +static std::string CapturedError; + +static void Remote_SendCommand(const char *command, int nargs, ...) +{ + va_list ap; + va_start(ap, nargs); + + printf("%s%s ", OutputKey, command); + + for(int i = 0; i < nargs; i++) + { + char *escaped_string = escape_string(va_arg(ap, char *)); + + fputc('"', stdout); + fputs(escaped_string, stdout); + fputc('"', stdout); + fputc(' ', stdout); + + free(escaped_string); + } + printf("\n"); + va_end(ap); +} + +static void ParseSTDIOCommand(char *buf) +{ + char *arguments[8]; + int which_argument = 0; + size_t blen = strlen(buf); + bool InQuote = 0; + char *InBegin = NULL; + char last_char = 0; + + memset(arguments, 0, sizeof(arguments)); + + for(size_t x = 0; x <= blen; x++) + { + if((buf[x] == ' ' || buf[x] == 0) && last_char != '\\' && !InQuote && InBegin) + { + buf[x] = 0; + + unescape_string(InBegin); + arguments[which_argument] = InBegin; + which_argument++; + if(which_argument == 8) + { + break; + } + InBegin = NULL; + } + else if(buf[x] != ' ' && buf[x] != '\t' && buf[x] != '"' && last_char != '\\' && !InQuote && !InBegin) + { + InBegin = &buf[x]; + } + else if(buf[x] == '"' && last_char != '\\') + { + if(InBegin) + { + buf[x] = 0; + unescape_string(InBegin); + arguments[which_argument] = InBegin; + which_argument++; + if(which_argument == 8) + { + break; + } + InQuote = 0; + InBegin = NULL; + } + else + { + InQuote = TRUE; + InBegin = &buf[x + 1]; + } + } + last_char = buf[x]; + } + + int numargs = which_argument; // numargs count includes the command. Misleading, yes! + bool success = 0; + bool suppress_success = 0; + + if(numargs) + { + if(!strcasecmp(arguments[0], "exit")) + { + MainRequestExit(); + suppress_success = TRUE; + } + else if(!strcasecmp(arguments[0], "nop")) + { + success = true; + } + else if(!strcasecmp(arguments[0], "sync_video")) + { + success = GT_ReinitVideo(); + } + else if(!strcasecmp(arguments[0], "sync_sound")) + { + success = GT_ReinitSound(); + } + else if(!strcasecmp(arguments[0], "get_setting")) + { + if(numargs == 2) + { + std::string sval; + + sval = MDFN_GetSettingS(arguments[1]); + success = TRUE; + + Remote_SendCommand("return", 2, "success", sval.c_str()); + return; + } + else + puts("Invalid number of arguments"); + } + else if(!strcasecmp(arguments[0], "set_setting")) + { + if(numargs == 3) + { + success = MDFNI_SetSetting(arguments[1], arguments[2]); + } + else + puts("Invalid number of arguments"); + } + else if(!strcasecmp(arguments[0], "get_known_fileexts")) + { + uint32 count = 0; + char count_string[64]; + + // TODO: Move to core + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + const FileExtensionSpecStruct *FileExtensions = MDFNSystems[i]->FileExtensions; + if(FileExtensions) + while(FileExtensions->extension) + { + count++; + FileExtensions++; + } + } + trio_snprintf(count_string, 64, "%u", count); + Remote_SendCommand("result_count", 1, count_string); + + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + const FileExtensionSpecStruct *FileExtensions = MDFNSystems[i]->FileExtensions; + if(FileExtensions) + while(FileExtensions->extension) + { + Remote_SendCommand("result", 3, MDFNSystems[i]->shortname, FileExtensions->extension, FileExtensions->description); + FileExtensions++; + } + } + success = TRUE; + } + else + { + puts("Unknown command!"); + } + } + + if(!suppress_success) + { + if(success) + { + Remote_SendCommand("return", 1, "success"); + } + else + { + Remote_SendCommand("return", 1, "failure"); + } + } + //printf("%s %s %s %s %s %s\n", arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); +} + +// Called from the main thread. +void CheckForSTDIOMessages(void) +{ + char inval; + + while(read(fileno(stdin), &inval, 1) == 1) + { + if(InputBufferOffset == InputBufferLen) + { + InputBufferLen += 256; + InputBuffer = (char*)realloc(InputBuffer, InputBufferLen); + } + + if(inval == '\n') + { + InputBuffer[InputBufferOffset] = 0; + + for(int64 x = 0; x < InputBufferOffset; x++) + if(InputBuffer[x] == '\r') + InputBuffer[x] = 0; + + ParseSTDIOCommand(InputBuffer); + InputBufferOffset = 0; + } + else + InputBuffer[InputBufferOffset++] = inval; + + } +} + +bool InitSTDIOInterface(const char *key) +{ + if(fcntl(fileno(stdin), F_SETFL, O_NONBLOCK | O_RDONLY)) + { + puts("fcntl error"); + return(0); + } + + InputBuffer = NULL; + InputBufferLen = 0; + InputBufferOffset = 0; + OutputKey = strdup(key); + + return(TRUE); +} + +void Remote_SendStatusMessage(const char *message) +{ + Remote_SendCommand("status_message", 1, message); +} + +void Remote_SendErrorMessage(const char *message) +{ + Remote_SendCommand("error_message", 1, message); +} + + +#else + +void CheckForSTDIOMessages(void) +{ + +} + +bool InitSTDIOInterface(const char *key) +{ + return(0); +} + +void Remote_SendStatusMessage(const char *message) +{ + +} + +void Remote_SendErrorMessage(const char *message) +{ + +} + +#endif diff --git a/Mednafen/mednafen/drivers/remote.h b/Mednafen/mednafen/drivers/remote.h new file mode 100644 index 0000000000..c2a92a81fd --- /dev/null +++ b/Mednafen/mednafen/drivers/remote.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_DRIVERS_REMOTE_H +#define __MDFN_DRIVERS_REMOTE_H + +// Call all of these from the game(emulation) thread(or main thread if we haven't split off yet). + +void CheckForSTDIOMessages(void); +bool InitSTDIOInterface(const char *key); +void Remote_SendStatusMessage(const char *message); +void Remote_SendErrorMessage(const char *message); + +#endif diff --git a/Mednafen/mednafen/drivers/rmdui.cpp b/Mednafen/mednafen/drivers/rmdui.cpp new file mode 100644 index 0000000000..d32dcc6eb8 --- /dev/null +++ b/Mednafen/mednafen/drivers/rmdui.cpp @@ -0,0 +1,205 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "rmdui.h" + +#include + +static bool DiskEjected; +static unsigned DiskSelected; + +struct DiskSelectType +{ + std::string text; + + uint32 drive_idx; + uint32 state_idx; + uint32 media_idx; + uint32 orientation_idx; +}; + +static DiskSelectType DiskEjectOption; +static std::vector DiskSelectOptions; +static bool SupressDiskChangeNotifDisplay; + +void RMDUI_Init(MDFNGI* gi) +{ + const RMD_Layout* rmd = gi->RMD; + char textbuf[256]; + bool deo_set = false; + + DiskSelectOptions.clear(); + + DiskEjected = true; + DiskSelected = 0; + + for(unsigned d = 0; d < rmd->Drives.size() && d < 1; d++) + { + const RMD_Drive* rd = &rmd->Drives[d]; + + for(unsigned s = 0; s < rd->PossibleStates.size(); s++) + { + const RMD_State* rs = &rd->PossibleStates[s]; + + if(!rs->MediaPresent || !rs->MediaUsable) + { + trio_snprintf(textbuf, sizeof(textbuf), "%s: %s", rd->Name.c_str(), rs->Name.c_str()); + + if(rs->MediaCanChange && !deo_set) + { + DiskEjectOption = { textbuf, d, s, 0, 0 }; + deo_set = true; + } + else + DiskSelectOptions.push_back(DiskSelectType({textbuf, d, s, 0, 0})); + } + else //if(rs->MediaPresent && rs->MediaUsable) + { + for(unsigned m = 0; m < rmd->Media.size(); m++) + { + if(m == 0) + { + DiskEjected = false; + DiskSelected = DiskSelectOptions.size(); + } + + for(unsigned o = 0; o < rmd->Media[m].Orientations.size() || o == 0; o++) + { + if(rmd->Media[m].Orientations.size()) + trio_snprintf(textbuf, sizeof(textbuf), "%s: %s (%s, %s)", rd->Name.c_str(), rs->Name.c_str(), rmd->Media[m].Name.c_str(), rmd->Media[m].Orientations[o].c_str()); + else + trio_snprintf(textbuf, sizeof(textbuf), "%s: %s (%s)", rd->Name.c_str(), rs->Name.c_str(), rmd->Media[m].Name.c_str()); + + DiskSelectOptions.push_back(DiskSelectType({textbuf, d, s, m, o})); + } + } + } + } + } + + SupressDiskChangeNotifDisplay = true; + if(rmd->Drives.size()) + { + if(DiskEjected) + MDFNI_SetMedia(DiskEjectOption.drive_idx, DiskEjectOption.state_idx, DiskEjectOption.media_idx, DiskEjectOption.orientation_idx); + else + { + DiskSelectType* dta = &DiskSelectOptions[DiskSelected]; + MDFNI_SetMedia(dta->drive_idx, dta->state_idx, dta->media_idx, dta->orientation_idx); + } + } + SupressDiskChangeNotifDisplay = false; +} + +void RMDUI_Kill(void) +{ + + +} + +void MDFND_MediaSetNotification(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + const RMD_Layout* rmd = CurGame->RMD; + const RMD_Drive* rd = &rmd->Drives[drive_idx]; + const RMD_State* rs = &rd->PossibleStates[state_idx]; + DiskSelectType* dta = NULL; + + if(drive_idx == DiskEjectOption.drive_idx && state_idx == DiskEjectOption.state_idx) + { + DiskEjected = true; + dta = &DiskEjectOption; + } + else + { + for(unsigned i = 0; i < DiskSelectOptions.size(); i++) + { + if(drive_idx != DiskSelectOptions[i].drive_idx) + continue; + + if(state_idx != DiskSelectOptions[i].state_idx) + continue; + + if(rs->MediaUsable && rs->MediaPresent) + { + if(media_idx != DiskSelectOptions[i].media_idx) + continue; + + if(rmd->Media[media_idx].Orientations.size()) + { + if(orientation_idx != DiskSelectOptions[i].orientation_idx) + continue; + } + } + + DiskEjected = false; + DiskSelected = i; + dta = &DiskSelectOptions[i]; + break; + } + } + + if(dta) + { + if(!SupressDiskChangeNotifDisplay) + MDFN_DispMessage("%s", dta->text.c_str()); + } + else + fprintf(stderr, "MDFND_MediaSetNotification() error"); +} + +void RMDUI_Toggle_InsertEject(void) +{ + if(!CurGame->RMD->Drives.size()) + return; + + DiskSelectType* dta = &DiskEjectOption; + + if(DiskEjected) + dta = &DiskSelectOptions[DiskSelected]; + + MDFNI_SetMedia(dta->drive_idx, dta->state_idx, dta->media_idx, dta->orientation_idx); +} + +void RMDUI_Select(void) +{ + if(!DiskEjected) + return; + + if(!DiskSelectOptions.size()) + return; + + DiskSelected = (DiskSelected + 1) % DiskSelectOptions.size(); + + { + const DiskSelectType* dta = &DiskSelectOptions[DiskSelected]; + const RMD_State* rs = &CurGame->RMD->Drives[dta->drive_idx].PossibleStates[dta->state_idx]; + + if(rs->MediaPresent && rs->MediaUsable) + { + if(CurGame->RMD->Media[dta->media_idx].Orientations.size()) + MDFN_DispMessage(_("%s, %s selected."), CurGame->RMD->Media[dta->media_idx].Name.c_str(), CurGame->RMD->Media[dta->media_idx].Orientations[dta->orientation_idx].c_str()); + else + MDFN_DispMessage(_("%s selected."), CurGame->RMD->Media[dta->media_idx].Name.c_str()); + } + else + { + MDFN_DispMessage(_("Absence selected.")); + } + } +} + diff --git a/Mednafen/mednafen/drivers/rmdui.h b/Mednafen/mednafen/drivers/rmdui.h new file mode 100644 index 0000000000..e470068e76 --- /dev/null +++ b/Mednafen/mednafen/drivers/rmdui.h @@ -0,0 +1,5 @@ + +void RMDUI_Init(MDFNGI* gi); +void RMDUI_Kill(void); +void RMDUI_Toggle_InsertEject(void); +void RMDUI_Select(void); diff --git a/Mednafen/mednafen/drivers/scale2x.c b/Mednafen/mednafen/drivers/scale2x.c new file mode 100644 index 0000000000..ceba36aa9a --- /dev/null +++ b/Mednafen/mednafen/drivers/scale2x.c @@ -0,0 +1,923 @@ +/* + * This file is part of the Scale2x project. + * + * Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * This file contains a C and MMX implementation of the Scale2x effect. + * + * You can find an high level description of the effect at : + * + * http://scale2x.sourceforge.net/ + * + * Alternatively at the previous license terms, you are allowed to use this + * code in your program with these conditions: + * - the program is not used in commercial activities. + * - the whole source code of the program is released with the binary. + * - derivative works of the program are allowed. + */ + +#include "scale2x.h" + +#include + +/***************************************************************************/ +/* Scale2x C implementation */ + +static inline void scale2x_8_def_single(scale2x_uint8* __restrict__ dst, const scale2x_uint8* __restrict__ src0, const scale2x_uint8* __restrict__ src1, const scale2x_uint8* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + if (src1[1] == src0[0] && src2[0] != src0[0]) + dst[1] = src0[0]; + else + dst[1] = src1[0]; + ++src0; + ++src1; + ++src2; + dst += 2; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = src1[-1] == src0[0] ? src0[0] : src1[0]; + dst[1] = src1[1] == src0[0] ? src0[0] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 2; + --count; + } + + /* last pixel */ + if (src1[-1] == src0[0] && src2[0] != src0[0]) + dst[0] = src0[0]; + else + dst[0] = src1[0]; + dst[1] = src1[0]; +} + +static inline void scale2x_16_def_single(scale2x_uint16* __restrict__ dst, const scale2x_uint16* __restrict__ src0, const scale2x_uint16* __restrict__ src1, const scale2x_uint16* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + if (src1[1] == src0[0] && src2[0] != src0[0]) + dst[1] = src0[0]; + else + dst[1] = src1[0]; + ++src0; + ++src1; + ++src2; + dst += 2; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = src1[-1] == src0[0] ? src0[0] : src1[0]; + dst[1] = src1[1] == src0[0] ? src0[0] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 2; + --count; + } + + /* last pixel */ + if (src1[-1] == src0[0] && src2[0] != src0[0]) + dst[0] = src0[0]; + else + dst[0] = src1[0]; + dst[1] = src1[0]; +} + +static inline void scale2x_32_def_single(scale2x_uint32* __restrict__ dst, const scale2x_uint32* __restrict__ src0, const scale2x_uint32* __restrict__ src1, const scale2x_uint32* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + if (src1[1] == src0[0] && src2[0] != src0[0]) + dst[1] = src0[0]; + else + dst[1] = src1[0]; + ++src0; + ++src1; + ++src2; + dst += 2; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = src1[-1] == src0[0] ? src0[0] : src1[0]; + dst[1] = src1[1] == src0[0] ? src0[0] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 2; + --count; + } + + /* last pixel */ + if (src1[-1] == src0[0] && src2[0] != src0[0]) + dst[0] = src0[0]; + else + dst[0] = src1[0]; + dst[1] = src1[0]; +} + +/** + * Scale by a factor of 2 a row of pixels of 8 bits. + * The function is implemented in C. + * The pixels over the left and right borders are assumed of the same color of + * the pixels on the border. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. + * It must be at least 2. + * \param dst0 First destination row, double length in pixels. + * \param dst1 Second destination row, double length in pixels. + */ +void scale2x_8_def(scale2x_uint8* dst0, scale2x_uint8* dst1, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count) +{ + assert(count >= 2); + + scale2x_8_def_single(dst0, src0, src1, src2, count); + scale2x_8_def_single(dst1, src2, src1, src0, count); +} + +/** + * Scale by a factor of 2 a row of pixels of 16 bits. + * This function operates like scale2x_8_def() but for 16 bits pixels. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. + * It must be at least 2. + * \param dst0 First destination row, double length in pixels. + * \param dst1 Second destination row, double length in pixels. + */ +void scale2x_16_def(scale2x_uint16* dst0, scale2x_uint16* dst1, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count) +{ + assert(count >= 2); + + scale2x_16_def_single(dst0, src0, src1, src2, count); + scale2x_16_def_single(dst1, src2, src1, src0, count); +} + +/** + * Scale by a factor of 2 a row of pixels of 32 bits. + * This function operates like scale2x_8_def() but for 32 bits pixels. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. + * It must be at least 2. + * \param dst0 First destination row, double length in pixels. + * \param dst1 Second destination row, double length in pixels. + */ +void scale2x_32_def(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count) +{ + assert(count >= 2); + + scale2x_32_def_single(dst0, src0, src1, src2, count); + scale2x_32_def_single(dst1, src2, src1, src0, count); +} + +/***************************************************************************/ +/* Scale2x MMX implementation */ + +#if defined(__GNUC__) && defined(__i386__) + +/* + * Apply the Scale2x effect at a single row. + * This function must be called only by the other scale2x functions. + * + * Considering the pixel map : + * + * ABC (src0) + * DEF (src1) + * GHI (src2) + * + * this functions compute 2 new pixels in substitution of the source pixel E + * like this map : + * + * ab (dst) + * + * with these variables : + * + * ¤t -> E + * ¤t_left -> D + * ¤t_right -> F + * ¤t_upper -> B + * ¤t_lower -> H + * + * %0 -> current_upper + * %1 -> current + * %2 -> current_lower + * %3 -> dst + * %4 -> counter + * + * %mm0 -> *current_left + * %mm1 -> *current_next + * %mm2 -> tmp0 + * %mm3 -> tmp1 + * %mm4 -> tmp2 + * %mm5 -> tmp3 + * %mm6 -> *current_upper + * %mm7 -> *current + */ +static inline void scale2x_8_mmx_single(scale2x_uint8* dst, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count) +{ + assert(count >= 16); + assert(count % 8 == 0); + + /* always do the first and last run */ + count -= 2*8; + + __asm__ __volatile__( +/* first run */ + /* set the current, current_pre, current_next registers */ + "movq 0(%1), %%mm0\n" + "movq 0(%1), %%mm7\n" + "movq 8(%1), %%mm1\n" + "psllq $56, %%mm0\n" + "psllq $56, %%mm1\n" + "psrlq $56, %%mm0\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $8, %%mm2\n" + "psrlq $8, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqb %%mm6, %%mm2\n" + "pcmpeqb %%mm6, %%mm4\n" + "pcmpeqb (%2), %%mm3\n" + "pcmpeqb (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqb %%mm1, %%mm2\n" + "pcmpeqb %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpcklbw %%mm4, %%mm2\n" + "punpckhbw %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + /* next */ + "addl $8, %0\n" + "addl $8, %1\n" + "addl $8, %2\n" + "addl $16, %3\n" + +/* central runs */ + "shrl $3, %4\n" + "jz 1f\n" + + "0:\n" + + /* set the current, current_pre, current_next registers */ + "movq -8(%1), %%mm0\n" + "movq (%1), %%mm7\n" + "movq 8(%1), %%mm1\n" + "psrlq $56, %%mm0\n" + "psllq $56, %%mm1\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $8, %%mm2\n" + "psrlq $8, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqb %%mm6, %%mm2\n" + "pcmpeqb %%mm6, %%mm4\n" + "pcmpeqb (%2), %%mm3\n" + "pcmpeqb (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqb %%mm1, %%mm2\n" + "pcmpeqb %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpcklbw %%mm4, %%mm2\n" + "punpckhbw %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + /* next */ + "addl $8, %0\n" + "addl $8, %1\n" + "addl $8, %2\n" + "addl $16, %3\n" + + "decl %4\n" + "jnz 0b\n" + "1:\n" + +/* final run */ + /* set the current, current_pre, current_next registers */ + "movq (%1), %%mm1\n" + "movq (%1), %%mm7\n" + "movq -8(%1), %%mm0\n" + "psrlq $56, %%mm1\n" + "psrlq $56, %%mm0\n" + "psllq $56, %%mm1\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $8, %%mm2\n" + "psrlq $8, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqb %%mm6, %%mm2\n" + "pcmpeqb %%mm6, %%mm4\n" + "pcmpeqb (%2), %%mm3\n" + "pcmpeqb (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqb %%mm1, %%mm2\n" + "pcmpeqb %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpcklbw %%mm4, %%mm2\n" + "punpckhbw %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + : "+r" (src0), "+r" (src1), "+r" (src2), "+r" (dst), "+r" (count) + : + : "cc" + ); +} + +static inline void scale2x_16_mmx_single(scale2x_uint16* dst, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count) +{ + assert(count >= 8); + assert(count % 4 == 0); + + /* always do the first and last run */ + count -= 2*4; + + __asm__ __volatile__( +/* first run */ + /* set the current, current_pre, current_next registers */ + "movq 0(%1), %%mm0\n" + "movq 0(%1), %%mm7\n" + "movq 8(%1), %%mm1\n" + "psllq $48, %%mm0\n" + "psllq $48, %%mm1\n" + "psrlq $48, %%mm0\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $16, %%mm2\n" + "psrlq $16, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqw %%mm6, %%mm2\n" + "pcmpeqw %%mm6, %%mm4\n" + "pcmpeqw (%2), %%mm3\n" + "pcmpeqw (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqw %%mm1, %%mm2\n" + "pcmpeqw %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpcklwd %%mm4, %%mm2\n" + "punpckhwd %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + /* next */ + "addl $8, %0\n" + "addl $8, %1\n" + "addl $8, %2\n" + "addl $16, %3\n" + +/* central runs */ + "shrl $2, %4\n" + "jz 1f\n" + + "0:\n" + + /* set the current, current_pre, current_next registers */ + "movq -8(%1), %%mm0\n" + "movq (%1), %%mm7\n" + "movq 8(%1), %%mm1\n" + "psrlq $48, %%mm0\n" + "psllq $48, %%mm1\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $16, %%mm2\n" + "psrlq $16, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqw %%mm6, %%mm2\n" + "pcmpeqw %%mm6, %%mm4\n" + "pcmpeqw (%2), %%mm3\n" + "pcmpeqw (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqw %%mm1, %%mm2\n" + "pcmpeqw %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpcklwd %%mm4, %%mm2\n" + "punpckhwd %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + /* next */ + "addl $8, %0\n" + "addl $8, %1\n" + "addl $8, %2\n" + "addl $16, %3\n" + + "decl %4\n" + "jnz 0b\n" + "1:\n" + +/* final run */ + /* set the current, current_pre, current_next registers */ + "movq (%1), %%mm1\n" + "movq (%1), %%mm7\n" + "movq -8(%1), %%mm0\n" + "psrlq $48, %%mm1\n" + "psrlq $48, %%mm0\n" + "psllq $48, %%mm1\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $16, %%mm2\n" + "psrlq $16, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqw %%mm6, %%mm2\n" + "pcmpeqw %%mm6, %%mm4\n" + "pcmpeqw (%2), %%mm3\n" + "pcmpeqw (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqw %%mm1, %%mm2\n" + "pcmpeqw %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpcklwd %%mm4, %%mm2\n" + "punpckhwd %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + : "+r" (src0), "+r" (src1), "+r" (src2), "+r" (dst), "+r" (count) + : + : "cc" + ); +} + +static inline void scale2x_32_mmx_single(scale2x_uint32* dst, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count) +{ + assert(count >= 4); + assert(count % 2 == 0); + + /* always do the first and last run */ + count -= 2*2; + + __asm__ __volatile__( +/* first run */ + /* set the current, current_pre, current_next registers */ + "movq 0(%1), %%mm0\n" + "movq 0(%1), %%mm7\n" + "movq 8(%1), %%mm1\n" + "psllq $32, %%mm0\n" + "psllq $32, %%mm1\n" + "psrlq $32, %%mm0\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $32, %%mm2\n" + "psrlq $32, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqd %%mm6, %%mm2\n" + "pcmpeqd %%mm6, %%mm4\n" + "pcmpeqd (%2), %%mm3\n" + "pcmpeqd (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqd %%mm1, %%mm2\n" + "pcmpeqd %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpckldq %%mm4, %%mm2\n" + "punpckhdq %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + /* next */ + "addl $8, %0\n" + "addl $8, %1\n" + "addl $8, %2\n" + "addl $16, %3\n" + +/* central runs */ + "shrl $1, %4\n" + "jz 1f\n" + + "0:\n" + + /* set the current, current_pre, current_next registers */ + "movq -8(%1), %%mm0\n" + "movq (%1), %%mm7\n" + "movq 8(%1), %%mm1\n" + "psrlq $32, %%mm0\n" + "psllq $32, %%mm1\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $32, %%mm2\n" + "psrlq $32, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqd %%mm6, %%mm2\n" + "pcmpeqd %%mm6, %%mm4\n" + "pcmpeqd (%2), %%mm3\n" + "pcmpeqd (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqd %%mm1, %%mm2\n" + "pcmpeqd %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpckldq %%mm4, %%mm2\n" + "punpckhdq %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + /* next */ + "addl $8, %0\n" + "addl $8, %1\n" + "addl $8, %2\n" + "addl $16, %3\n" + + "decl %4\n" + "jnz 0b\n" + "1:\n" + +/* final run */ + /* set the current, current_pre, current_next registers */ + "movq (%1), %%mm1\n" + "movq (%1), %%mm7\n" + "movq -8(%1), %%mm0\n" + "psrlq $32, %%mm1\n" + "psrlq $32, %%mm0\n" + "psllq $32, %%mm1\n" + "movq %%mm7, %%mm2\n" + "movq %%mm7, %%mm3\n" + "psllq $32, %%mm2\n" + "psrlq $32, %%mm3\n" + "por %%mm2, %%mm0\n" + "por %%mm3, %%mm1\n" + + /* current_upper */ + "movq (%0), %%mm6\n" + + /* compute the upper-left pixel for dst on %%mm2 */ + /* compute the upper-right pixel for dst on %%mm4 */ + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "movq %%mm0, %%mm3\n" + "movq %%mm1, %%mm5\n" + "pcmpeqd %%mm6, %%mm2\n" + "pcmpeqd %%mm6, %%mm4\n" + "pcmpeqd (%2), %%mm3\n" + "pcmpeqd (%2), %%mm5\n" + "pandn %%mm2, %%mm3\n" + "pandn %%mm4, %%mm5\n" + "movq %%mm0, %%mm2\n" + "movq %%mm1, %%mm4\n" + "pcmpeqd %%mm1, %%mm2\n" + "pcmpeqd %%mm0, %%mm4\n" + "pandn %%mm3, %%mm2\n" + "pandn %%mm5, %%mm4\n" + "movq %%mm2, %%mm3\n" + "movq %%mm4, %%mm5\n" + "pand %%mm6, %%mm2\n" + "pand %%mm6, %%mm4\n" + "pandn %%mm7, %%mm3\n" + "pandn %%mm7, %%mm5\n" + "por %%mm3, %%mm2\n" + "por %%mm5, %%mm4\n" + + /* set *dst */ + "movq %%mm2, %%mm3\n" + "punpckldq %%mm4, %%mm2\n" + "punpckhdq %%mm4, %%mm3\n" + "movq %%mm2, (%3)\n" + "movq %%mm3, 8(%3)\n" + + : "+r" (src0), "+r" (src1), "+r" (src2), "+r" (dst), "+r" (count) + : + : "cc" + ); +} + +/** + * Scale by a factor of 2 a row of pixels of 8 bits. + * This is a very fast MMX implementation. + * The implementation uses a combination of cmp/and/not operations to + * completly remove the need of conditional jumps. This trick give the + * major speed improvement. + * Also, using the 8 bytes MMX registers more than one pixel are computed + * at the same time. + * Before calling this function you must ensure that the currenct CPU supports + * the MMX instruction set. After calling it you must be sure to call the EMMS + * instruction before any floating-point operation. + * The pixels over the left and right borders are assumed of the same color of + * the pixels on the border. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. It must + * be at least 16 and a multiple of 8. + * \param dst0 First destination row, double length in pixels. + * \param dst1 Second destination row, double length in pixels. + */ +void scale2x_8_mmx(scale2x_uint8* dst0, scale2x_uint8* dst1, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count) +{ + if (count % 8 != 0 || count < 16) { + scale2x_8_def(dst0, dst1, src0, src1, src2, count); + } else { + assert(count >= 16); + assert(count % 8 == 0); + + scale2x_8_mmx_single(dst0, src0, src1, src2, count); + scale2x_8_mmx_single(dst1, src2, src1, src0, count); + } +} + +/** + * Scale by a factor of 2 a row of pixels of 16 bits. + * This function operates like scale2x_8_mmx() but for 16 bits pixels. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. It must + * be at least 8 and a multiple of 4. + * \param dst0 First destination row, double length in pixels. + * \param dst1 Second destination row, double length in pixels. + */ +void scale2x_16_mmx(scale2x_uint16* dst0, scale2x_uint16* dst1, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count) +{ + if (count % 4 != 0 || count < 8) { + scale2x_16_def(dst0, dst1, src0, src1, src2, count); + } else { + assert(count >= 8); + assert(count % 4 == 0); + + scale2x_16_mmx_single(dst0, src0, src1, src2, count); + scale2x_16_mmx_single(dst1, src2, src1, src0, count); + } +} + +/** + * Scale by a factor of 2 a row of pixels of 32 bits. + * This function operates like scale2x_8_mmx() but for 32 bits pixels. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. It must + * be at least 4 and a multiple of 2. + * \param dst0 First destination row, double length in pixels. + * \param dst1 Second destination row, double length in pixels. + */ +void scale2x_32_mmx(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count) +{ + if (count % 2 != 0 || count < 4) { + scale2x_32_def(dst0, dst1, src0, src1, src2, count); + } else { + assert(count >= 4); + assert(count % 2 == 0); + + scale2x_32_mmx_single(dst0, src0, src1, src2, count); + scale2x_32_mmx_single(dst1, src2, src1, src0, count); + } +} + +#endif + diff --git a/Mednafen/mednafen/drivers/scale2x.h b/Mednafen/mednafen/drivers/scale2x.h new file mode 100644 index 0000000000..54bfac5b8f --- /dev/null +++ b/Mednafen/mednafen/drivers/scale2x.h @@ -0,0 +1,52 @@ +/* + * This file is part of the Scale2x project. + * + * Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __SCALE2X_H +#define __SCALE2X_H + +typedef unsigned char scale2x_uint8; +typedef unsigned short scale2x_uint16; +typedef unsigned scale2x_uint32; + +void scale2x_8_def(scale2x_uint8* dst0, scale2x_uint8* dst1, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count); +void scale2x_16_def(scale2x_uint16* dst0, scale2x_uint16* dst1, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count); +void scale2x_32_def(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count); + +#if defined(__GNUC__) && defined(__i386__) + +void scale2x_8_mmx(scale2x_uint8* dst0, scale2x_uint8* dst1, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count); +void scale2x_16_mmx(scale2x_uint16* dst0, scale2x_uint16* dst1, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count); +void scale2x_32_mmx(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count); + +/** + * End the use of the MMX instructions. + * This function must be called before using any floating-point operations. + */ +static inline void scale2x_mmx_emms(void) +{ + __asm__ __volatile__ ( + "emms" + ); +} + +#endif + +#endif + diff --git a/Mednafen/mednafen/drivers/scale3x.c b/Mednafen/mednafen/drivers/scale3x.c new file mode 100644 index 0000000000..a704fb18fe --- /dev/null +++ b/Mednafen/mednafen/drivers/scale3x.c @@ -0,0 +1,382 @@ +/* + * This file is part of the Scale2x project. + * + * Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * This file contains a C and MMX implementation of the Scale2x effect. + * + * You can find an high level description of the effect at : + * + * http://scale2x.sourceforge.net/ + * + * Alternatively at the previous license terms, you are allowed to use this + * code in your program with these conditions: + * - the program is not used in commercial activities. + * - the whole source code of the program is released with the binary. + * - derivative works of the program are allowed. + */ + +#include "scale3x.h" + +#include + +/***************************************************************************/ +/* Scale3x C implementation */ + +static inline void scale3x_8_def_border(scale3x_uint8* __restrict__ dst, const scale3x_uint8* __restrict__ src0, const scale3x_uint8* __restrict__ src1, const scale3x_uint8* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + dst[1] = src1[0]; + if (src1[1] == src0[0] && src2[0] != src0[0]) + dst[2] = src0[0]; + else + dst[2] = src1[0]; + ++src0; + ++src1; + ++src2; + dst += 3; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = src1[-1] == src0[0] ? src1[-1] : src1[0]; + dst[1] = (src1[-1] == src0[0] && src1[0] != src0[1]) || (src1[1] == src0[0] && src1[0] != src0[-1]) ? src0[0] : src1[0]; + dst[2] = src1[1] == src0[0] ? src1[1] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 3; + --count; + } + + /* last pixel */ + if (src1[-1] == src0[0] && src2[0] != src0[0]) + dst[0] = src0[0]; + else + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; +} + +static inline void scale3x_8_def_center(scale3x_uint8* __restrict__ dst, const scale3x_uint8* __restrict__ src0, const scale3x_uint8* __restrict__ src1, const scale3x_uint8* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + dst[1] = src1[0]; + if (src0[0] != src2[0]) { + dst[2] = (src1[1] == src0[0] && src1[0] != src2[1]) || (src1[1] == src2[0] && src1[0] != src0[1]) ? src1[1] : src1[0]; + } else { + dst[2] = src1[0]; + } + ++src0; + ++src1; + ++src2; + dst += 3; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = (src1[-1] == src0[0] && src1[0] != src2[-1]) || (src1[-1] == src2[0] && src1[0] != src0[-1]) ? src1[-1] : src1[0]; + dst[1] = src1[0]; + dst[2] = (src1[1] == src0[0] && src1[0] != src2[1]) || (src1[1] == src2[0] && src1[0] != src0[1]) ? src1[1] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 3; + --count; + } + + /* last pixel */ + if (src0[0] != src2[0]) { + dst[0] = (src1[-1] == src0[0] && src1[0] != src2[-1]) || (src1[-1] == src2[0] && src1[0] != src0[-1]) ? src1[-1] : src1[0]; + } else { + dst[0] = src1[0]; + } + dst[1] = src1[0]; + dst[2] = src1[0]; +} + +static inline void scale3x_16_def_border(scale3x_uint16* __restrict__ dst, const scale3x_uint16* __restrict__ src0, const scale3x_uint16* __restrict__ src1, const scale3x_uint16* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + dst[1] = src1[0]; + if (src1[1] == src0[0] && src2[0] != src0[0]) + dst[2] = src0[0]; + else + dst[2] = src1[0]; + ++src0; + ++src1; + ++src2; + dst += 3; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = src1[-1] == src0[0] ? src1[-1] : src1[0]; + dst[1] = (src1[-1] == src0[0] && src1[0] != src0[1]) || (src1[1] == src0[0] && src1[0] != src0[-1]) ? src0[0] : src1[0]; + dst[2] = src1[1] == src0[0] ? src1[1] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 3; + --count; + } + + /* last pixel */ + if (src1[-1] == src0[0] && src2[0] != src0[0]) + dst[0] = src0[0]; + else + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; +} + +static inline void scale3x_16_def_center(scale3x_uint16* __restrict__ dst, const scale3x_uint16* __restrict__ src0, const scale3x_uint16* __restrict__ src1, const scale3x_uint16* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + dst[1] = src1[0]; + if (src0[0] != src2[0]) { + dst[2] = (src1[1] == src0[0] && src1[0] != src2[1]) || (src1[1] == src2[0] && src1[0] != src0[1]) ? src1[1] : src1[0]; + } else { + dst[2] = src1[0]; + } + ++src0; + ++src1; + ++src2; + dst += 3; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = (src1[-1] == src0[0] && src1[0] != src2[-1]) || (src1[-1] == src2[0] && src1[0] != src0[-1]) ? src1[-1] : src1[0]; + dst[1] = src1[0]; + dst[2] = (src1[1] == src0[0] && src1[0] != src2[1]) || (src1[1] == src2[0] && src1[0] != src0[1]) ? src1[1] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 3; + --count; + } + + /* last pixel */ + if (src0[0] != src2[0]) { + dst[0] = (src1[-1] == src0[0] && src1[0] != src2[-1]) || (src1[-1] == src2[0] && src1[0] != src0[-1]) ? src1[-1] : src1[0]; + } else { + dst[0] = src1[0]; + } + dst[1] = src1[0]; + dst[2] = src1[0]; +} + +static inline void scale3x_32_def_border(scale3x_uint32* __restrict__ dst, const scale3x_uint32* __restrict__ src0, const scale3x_uint32* __restrict__ src1, const scale3x_uint32* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + dst[1] = src1[0]; + if (src1[1] == src0[0] && src2[0] != src0[0]) + dst[2] = src0[0]; + else + dst[2] = src1[0]; + ++src0; + ++src1; + ++src2; + dst += 3; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = src1[-1] == src0[0] ? src1[-1] : src1[0]; + dst[1] = (src1[-1] == src0[0] && src1[0] != src0[1]) || (src1[1] == src0[0] && src1[0] != src0[-1]) ? src0[0] : src1[0]; + dst[2] = src1[1] == src0[0] ? src1[1] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 3; + --count; + } + + /* last pixel */ + if (src1[-1] == src0[0] && src2[0] != src0[0]) + dst[0] = src0[0]; + else + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; +} + +static inline void scale3x_32_def_center(scale3x_uint32* __restrict__ dst, const scale3x_uint32* __restrict__ src0, const scale3x_uint32* __restrict__ src1, const scale3x_uint32* __restrict__ src2, unsigned count) +{ + assert(count >= 2); + + /* first pixel */ + dst[0] = src1[0]; + dst[1] = src1[0]; + if (src0[0] != src2[0]) { + dst[2] = (src1[1] == src0[0] && src1[0] != src2[1]) || (src1[1] == src2[0] && src1[0] != src0[1]) ? src1[1] : src1[0]; + } else { + dst[2] = src1[0]; + } + ++src0; + ++src1; + ++src2; + dst += 3; + + /* central pixels */ + count -= 2; + while (count) { + if (src0[0] != src2[0] && src1[-1] != src1[1]) { + dst[0] = (src1[-1] == src0[0] && src1[0] != src2[-1]) || (src1[-1] == src2[0] && src1[0] != src0[-1]) ? src1[-1] : src1[0]; + dst[1] = src1[0]; + dst[2] = (src1[1] == src0[0] && src1[0] != src2[1]) || (src1[1] == src2[0] && src1[0] != src0[1]) ? src1[1] : src1[0]; + } else { + dst[0] = src1[0]; + dst[1] = src1[0]; + dst[2] = src1[0]; + } + + ++src0; + ++src1; + ++src2; + dst += 3; + --count; + } + + /* last pixel */ + if (src0[0] != src2[0]) { + dst[0] = (src1[-1] == src0[0] && src1[0] != src2[-1]) || (src1[-1] == src2[0] && src1[0] != src0[-1]) ? src1[-1] : src1[0]; + } else { + dst[0] = src1[0]; + } + dst[1] = src1[0]; + dst[2] = src1[0]; +} + +/** + * Scale by a factor of 3 a row of pixels of 8 bits. + * The function is implemented in C. + * The pixels over the left and right borders are assumed of the same color of + * the pixels on the border. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. + * It must be at least 2. + * \param dst0 First destination row, triple length in pixels. + * \param dst1 Second destination row, triple length in pixels. + * \param dst2 Third destination row, triple length in pixels. + */ +void scale3x_8_def(scale3x_uint8* dst0, scale3x_uint8* dst1, scale3x_uint8* dst2, const scale3x_uint8* src0, const scale3x_uint8* src1, const scale3x_uint8* src2, unsigned count) +{ + assert(count >= 2); + + scale3x_8_def_border(dst0, src0, src1, src2, count); + scale3x_8_def_center(dst1, src0, src1, src2, count); + scale3x_8_def_border(dst2, src2, src1, src0, count); +} + +/** + * Scale by a factor of 3 a row of pixels of 16 bits. + * This function operates like scale3x_8_def() but for 16 bits pixels. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. + * It must be at least 2. + * \param dst0 First destination row, triple length in pixels. + * \param dst1 Second destination row, triple length in pixels. + * \param dst2 Third destination row, triple length in pixels. + */ +void scale3x_16_def(scale3x_uint16* dst0, scale3x_uint16* dst1, scale3x_uint16* dst2, const scale3x_uint16* src0, const scale3x_uint16* src1, const scale3x_uint16* src2, unsigned count) +{ + assert(count >= 2); + + scale3x_16_def_border(dst0, src0, src1, src2, count); + scale3x_16_def_center(dst1, src0, src1, src2, count); + scale3x_16_def_border(dst2, src2, src1, src0, count); +} + +/** + * Scale by a factor of 3 a row of pixels of 32 bits. + * This function operates like scale3x_8_def() but for 32 bits pixels. + * \param src0 Pointer at the first pixel of the previous row. + * \param src1 Pointer at the first pixel of the current row. + * \param src2 Pointer at the first pixel of the next row. + * \param count Length in pixels of the src0, src1 and src2 rows. + * It must be at least 2. + * \param dst0 First destination row, triple length in pixels. + * \param dst1 Second destination row, triple length in pixels. + * \param dst2 Third destination row, triple length in pixels. + */ +void scale3x_32_def(scale3x_uint32* dst0, scale3x_uint32* dst1, scale3x_uint32* dst2, const scale3x_uint32* src0, const scale3x_uint32* src1, const scale3x_uint32* src2, unsigned count) +{ + assert(count >= 2); + + scale3x_32_def_border(dst0, src0, src1, src2, count); + scale3x_32_def_center(dst1, src0, src1, src2, count); + scale3x_32_def_border(dst2, src2, src1, src0, count); +} + diff --git a/Mednafen/mednafen/drivers/scale3x.h b/Mednafen/mednafen/drivers/scale3x.h new file mode 100644 index 0000000000..14655d00fa --- /dev/null +++ b/Mednafen/mednafen/drivers/scale3x.h @@ -0,0 +1,33 @@ +/* + * This file is part of the Scale2x project. + * + * Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __SCALE3X_H +#define __SCALE3X_H + +typedef unsigned char scale3x_uint8; +typedef unsigned short scale3x_uint16; +typedef unsigned scale3x_uint32; + +void scale3x_8_def(scale3x_uint8* dst0, scale3x_uint8* dst1, scale3x_uint8* dst2, const scale3x_uint8* src0, const scale3x_uint8* src1, const scale3x_uint8* src2, unsigned count); +void scale3x_16_def(scale3x_uint16* dst0, scale3x_uint16* dst1, scale3x_uint16* dst2, const scale3x_uint16* src0, const scale3x_uint16* src1, const scale3x_uint16* src2, unsigned count); +void scale3x_32_def(scale3x_uint32* dst0, scale3x_uint32* dst1, scale3x_uint32* dst2, const scale3x_uint32* src0, const scale3x_uint32* src1, const scale3x_uint32* src2, unsigned count); + +#endif + diff --git a/Mednafen/mednafen/drivers/scalebit.c b/Mednafen/mednafen/drivers/scalebit.c new file mode 100644 index 0000000000..4f0677200a --- /dev/null +++ b/Mednafen/mednafen/drivers/scalebit.c @@ -0,0 +1,385 @@ +/* + * This file is part of the Scale2x project. + * + * Copyright (C) 2003 Andrea Mazzoleni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * This file contains an example implementation of the Scale effect + * applyed to a generic bitmap. + * + * You can find an high level description of the effect at : + * + * http://scale2x.sourceforge.net/ + * + * Alternatively at the previous license terms, you are allowed to use this + * code in your program with these conditions: + * - the program is not used in commercial activities. + * - the whole source code of the program is released with the binary. + * - derivative works of the program are allowed. + */ + +#if HAVE_CONFIG_H +#include +#endif + +#include "scale2x.h" +#include "scale3x.h" + +#if HAVE_ALLOCA_H +#include +#endif + +#include +#include + +/** + * Apply the Scale2x effect on a group of rows. Used internally. + */ +static inline void stage_scale2x(void* dst0, void* dst1, const void* src0, const void* src1, const void* src2, unsigned pixel, unsigned pixel_per_row) +{ + switch (pixel) { +#if defined(__GNUC__) && defined(__i386__) + case 1 : scale2x_8_mmx(dst0, dst1, src0, src1, src2, pixel_per_row); break; + case 2 : scale2x_16_mmx(dst0, dst1, src0, src1, src2, pixel_per_row); break; + case 4 : scale2x_32_mmx(dst0, dst1, src0, src1, src2, pixel_per_row); break; +#else + case 1 : scale2x_8_def(dst0, dst1, src0, src1, src2, pixel_per_row); break; + case 2 : scale2x_16_def(dst0, dst1, src0, src1, src2, pixel_per_row); break; + case 4 : scale2x_32_def(dst0, dst1, src0, src1, src2, pixel_per_row); break; +#endif + } +} + +/** + * Apply the Scale3x effect on a group of rows. Used internally. + */ +static inline void stage_scale3x(void* dst0, void* dst1, void* dst2, const void* src0, const void* src1, const void* src2, unsigned pixel, unsigned pixel_per_row) +{ + switch (pixel) { + case 1 : scale3x_8_def(dst0, dst1, dst2, src0, src1, src2, pixel_per_row); break; + case 2 : scale3x_16_def(dst0, dst1, dst2, src0, src1, src2, pixel_per_row); break; + case 4 : scale3x_32_def(dst0, dst1, dst2, src0, src1, src2, pixel_per_row); break; + } +} + +/** + * Apply the Scale4x effect on a group of rows. Used internally. + */ +static inline void stage_scale4x(void* dst0, void* dst1, void* dst2, void* dst3, const void* src0, const void* src1, const void* src2, const void* src3, unsigned pixel, unsigned pixel_per_row) +{ + stage_scale2x(dst0, dst1, src0, src1, src2, pixel, 2 * pixel_per_row); + stage_scale2x(dst2, dst3, src1, src2, src3, pixel, 2 * pixel_per_row); +} + +#define SCDST(i) (dst+(i)*dst_slice) +#define SCSRC(i) (src+(i)*src_slice) +#define SCMID(i) (mid[(i)]) + +/** + * Apply the Scale2x effect on a bitmap. + * The destination bitmap is filled with the scaled version of the source bitmap. + * The source bitmap isn't modified. + * The destination bitmap must be manually allocated before calling the function, + * note that the resulting size is exactly 2x2 times the size of the source bitmap. + * \param void_dst Pointer at the first pixel of the destination bitmap. + * \param dst_slice Size in bytes of a destination bitmap row. + * \param void_src Pointer at the first pixel of the source bitmap. + * \param src_slice Size in bytes of a source bitmap row. + * \param pixel Bytes per pixel of the source and destination bitmap. + * \param width Horizontal size in pixels of the source bitmap. + * \param height Vertical size in pixels of the source bitmap. + */ +static void scale2x(void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height) +{ + unsigned char* dst = (unsigned char*)void_dst; + const unsigned char* src = (unsigned char*)void_src; + unsigned count; + + assert(height >= 2); + + count = height; + + stage_scale2x(SCDST(0), SCDST(1), SCSRC(0), SCSRC(0), SCSRC(1), pixel, width); + + dst = SCDST(2); + + count -= 2; + while (count) { + stage_scale2x(SCDST(0), SCDST(1), SCSRC(0), SCSRC(1), SCSRC(2), pixel, width); + + dst = SCDST(2); + src = SCSRC(1); + + --count; + } + + stage_scale2x(SCDST(0), SCDST(1), SCSRC(1-1), SCSRC(2-1), SCSRC(2-1), pixel, width); + +#if defined(__GNUC__) && defined(__i386__) + scale2x_mmx_emms(); +#endif +} + +/** + * Apply the Scale32x effect on a bitmap. + * The destination bitmap is filled with the scaled version of the source bitmap. + * The source bitmap isn't modified. + * The destination bitmap must be manually allocated before calling the function, + * note that the resulting size is exactly 3x3 times the size of the source bitmap. + * \param void_dst Pointer at the first pixel of the destination bitmap. + * \param dst_slice Size in bytes of a destination bitmap row. + * \param void_src Pointer at the first pixel of the source bitmap. + * \param src_slice Size in bytes of a source bitmap row. + * \param pixel Bytes per pixel of the source and destination bitmap. + * \param width Horizontal size in pixels of the source bitmap. + * \param height Vertical size in pixels of the source bitmap. + */ +static void scale3x(void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height) +{ + unsigned char* dst = (unsigned char*)void_dst; + const unsigned char* src = (unsigned char*)void_src; + unsigned count; + + assert(height >= 2); + + count = height; + + stage_scale3x(SCDST(0), SCDST(1), SCDST(2), SCSRC(0), SCSRC(0), SCSRC(1), pixel, width); + + dst = SCDST(3); + + count -= 2; + while (count) { + stage_scale3x(SCDST(0), SCDST(1), SCDST(2), SCSRC(0), SCSRC(1), SCSRC(2), pixel, width); + + dst = SCDST(3); + src = SCSRC(1); + + --count; + } + + stage_scale3x(SCDST(0), SCDST(1), SCDST(2), SCSRC(1-1), SCSRC(2-1), SCSRC(2-1), pixel, width); +} + +/** + * Apply the Scale4x effect on a bitmap. + * The destination bitmap is filled with the scaled version of the source bitmap. + * The source bitmap isn't modified. + * The destination bitmap must be manually allocated before calling the function, + * note that the resulting size is exactly 4x4 times the size of the source bitmap. + * \note This function requires also a small buffer bitmap used internally to store + * intermediate results. This bitmap must have at least an horizontal size in bytes of 2*width*pixel, + * and a vertical size of 6 rows. The memory of this buffer must not be allocated + * in video memory because it's also read and not only written. Generally + * a heap (malloc) or a stack (alloca) buffer is the best choices. + * \param void_dst Pointer at the first pixel of the destination bitmap. + * \param dst_slice Size in bytes of a destination bitmap row. + * \param void_mid Pointer at the first pixel of the buffer bitmap. + * \param mid_slice Size in bytes of a buffer bitmap row. + * \param void_src Pointer at the first pixel of the source bitmap. + * \param src_slice Size in bytes of a source bitmap row. + * \param pixel Bytes per pixel of the source and destination bitmap. + * \param width Horizontal size in pixels of the source bitmap. + * \param height Vertical size in pixels of the source bitmap. + */ +static void scale4x_buf(void* void_dst, unsigned dst_slice, void* void_mid, unsigned mid_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height) +{ + unsigned char* dst = (unsigned char*)void_dst; + const unsigned char* src = (unsigned char*)void_src; + unsigned count; + unsigned char* mid[6]; + + assert(height >= 4); + + count = height; + + /* set the 6 buffer pointers */ + mid[0] = (unsigned char*)void_mid; + mid[1] = mid[0] + mid_slice; + mid[2] = mid[1] + mid_slice; + mid[3] = mid[2] + mid_slice; + mid[4] = mid[3] + mid_slice; + mid[5] = mid[4] + mid_slice; + + stage_scale2x(SCMID(-2+6), SCMID(-1+6), SCSRC(0), SCSRC(0), SCSRC(1), pixel, width); + stage_scale2x(SCMID(0), SCMID(1), SCSRC(0), SCSRC(1), SCSRC(2), pixel, width); + stage_scale2x(SCMID(2), SCMID(3), SCSRC(1), SCSRC(2), SCSRC(3), pixel, width); + stage_scale4x(SCDST(0), SCDST(1), SCDST(2), SCDST(3), SCMID(-2+6), SCMID(-2+6), SCMID(-1+6), SCMID(0), pixel, width); + + dst = SCDST(4); + + stage_scale4x(SCDST(0), SCDST(1), SCDST(2), SCDST(3), SCMID(-1+6), SCMID(0), SCMID(1), SCMID(2), pixel, width); + + dst = SCDST(4); + + count -= 4; + while (count) { + unsigned char* tmp; + + stage_scale2x(SCMID(4), SCMID(5), SCSRC(2), SCSRC(3), SCSRC(4), pixel, width); + stage_scale4x(SCDST(0), SCDST(1), SCDST(2), SCDST(3), SCMID(1), SCMID(2), SCMID(3), SCMID(4), pixel, width); + + dst = SCDST(4); + src = SCSRC(1); + + tmp = SCMID(0); /* shift by 2 position */ + SCMID(0) = SCMID(2); + SCMID(2) = SCMID(4); + SCMID(4) = tmp; + tmp = SCMID(1); + SCMID(1) = SCMID(3); + SCMID(3) = SCMID(5); + SCMID(5) = tmp; + + --count; + } + + stage_scale2x(SCMID(4), SCMID(5), SCSRC(2), SCSRC(3), SCSRC(3), pixel, width); + stage_scale4x(SCDST(0), SCDST(1), SCDST(2), SCDST(3), SCMID(1), SCMID(2), SCMID(3), SCMID(4), pixel, width); + + dst = SCDST(4); + + stage_scale4x(SCDST(0), SCDST(1), SCDST(2), SCDST(3), SCMID(3), SCMID(4), SCMID(5), SCMID(5), pixel, width); + +#if defined(__GNUC__) && defined(__i386__) + scale2x_mmx_emms(); +#endif +} + +/** + * Apply the Scale4x effect on a bitmap. + * The destination bitmap is filled with the scaled version of the source bitmap. + * The source bitmap isn't modified. + * The destination bitmap must be manually allocated before calling the function, + * note that the resulting size is exactly 4x4 times the size of the source bitmap. + * \note This function operates like ::scale4x_buf() but the intermediate buffer is + * automatically allocated in the stack. + * \param void_dst Pointer at the first pixel of the destination bitmap. + * \param dst_slice Size in bytes of a destination bitmap row. + * \param void_src Pointer at the first pixel of the source bitmap. + * \param src_slice Size in bytes of a source bitmap row. + * \param pixel Bytes per pixel of the source and destination bitmap. + * \param width Horizontal size in pixels of the source bitmap. + * \param height Vertical size in pixels of the source bitmap. + */ +static void scale4x(void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height) +{ + unsigned mid_slice; + void* mid; + + mid_slice = 2 * pixel * width; /* required space for 1 row buffer */ + + mid_slice = (mid_slice + 0x7) & ~0x7; /* align to 8 bytes */ + +#if HAVE_ALLOCA + mid = alloca(6 * mid_slice); /* allocate space for 6 row buffers */ + + assert(mid != 0); /* alloca should never fails */ +#else + mid = malloc(6 * mid_slice); /* allocate space for 6 row buffers */ + + if (!mid) + return; +#endif + + scale4x_buf(void_dst, dst_slice, mid, mid_slice, void_src, src_slice, pixel, width, height); + +#if !HAVE_ALLOCA + free(mid); +#endif +} + +/** + * Check if the scale implementation is applicable at the given arguments. + * \param scale Scale factor. 2, 3 or 4. + * \param pixel Bytes per pixel of the source and destination bitmap. + * \param width Horizontal size in pixels of the source bitmap. + * \param height Vertical size in pixels of the source bitmap. + * \return + * - -1 on precondition violated. + * - 0 on success. + */ +int scale_precondition(unsigned scale, unsigned pixel, unsigned width, unsigned height) +{ + if (scale != 2 && scale != 3 && scale != 4) + return -1; + + if (pixel != 1 && pixel != 2 && pixel != 4) + return -1; + + switch (scale) { + case 2 : + case 3 : + if (height < 2) + return -1; + break; + case 4 : + if (height < 4) + return -1; + break; + } + +#if defined(__GNUC__) && defined(__i386__) + switch (scale) { + case 2 : + case 4 : + if (width < (16 / pixel)) + return -1; + if (width % (8 / pixel) != 0) + return -1; + break; + case 3 : + if (width < 2) + return -1; + break; + } +#else + if (width < 2) + return -1; +#endif + + return 0; +} + +/** + * Apply the Scale effect on a bitmap. + * This function is simply a common interface for ::scale2x(), ::scale3x() and ::scale4x(). + * \param scale Scale factor. 2, 3 or 4. + * \param void_dst Pointer at the first pixel of the destination bitmap. + * \param dst_slice Size in bytes of a destination bitmap row. + * \param void_src Pointer at the first pixel of the source bitmap. + * \param src_slice Size in bytes of a source bitmap row. + * \param pixel Bytes per pixel of the source and destination bitmap. + * \param width Horizontal size in pixels of the source bitmap. + * \param height Vertical size in pixels of the source bitmap. + */ +void scale(unsigned scale_factor, void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height) +{ + switch (scale_factor) { + case 2 : + scale2x(void_dst, dst_slice, void_src, src_slice, pixel, width, height); + break; + case 3 : + scale3x(void_dst, dst_slice, void_src, src_slice, pixel, width, height); + break; + case 4 : + scale4x(void_dst, dst_slice, void_src, src_slice, pixel, width, height); + break; + } +} + diff --git a/Mednafen/mednafen/drivers/scalebit.h b/Mednafen/mednafen/drivers/scalebit.h new file mode 100644 index 0000000000..806bc8d0ac --- /dev/null +++ b/Mednafen/mednafen/drivers/scalebit.h @@ -0,0 +1,51 @@ +/* + * This file is part of the Scale2x project. + * + * Copyright (C) 2003 Andrea Mazzoleni + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * This file contains an example implementation of the Scale effect + * applyed to a generic bitmap. + * + * You can find an high level description of the effect at : + * + * http://scale2x.sourceforge.net/ + * + * Alternatively at the previous license terms, you are allowed to use this + * code in your program with these conditions: + * - the program is not used in commercial activities. + * - the whole source code of the program is released with the binary. + * - derivative works of the program are allowed. + */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifndef __SCALEBIT_H +#define __SCALEBIT_H + +int scale_precondition(unsigned scale, unsigned pixel, unsigned width, unsigned height); +void scale(unsigned scale, void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height); + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/drivers/shader.cpp b/Mednafen/mednafen/drivers/shader.cpp new file mode 100644 index 0000000000..05f3d59463 --- /dev/null +++ b/Mednafen/mednafen/drivers/shader.cpp @@ -0,0 +1,374 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Scale2x GLslang shader - ported by Pete Bernert + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "opengl.h" +#include "shader.h" + +#include +#include +#include +#include +#include + +#define MDFN_GL_TRY(x, ...) { x; GLenum errcode = oblt->p_glGetError(); if(errcode != GL_NO_ERROR) { __VA_ARGS__; throw(MDFN_Error(0, _("OpenGL Error: %d\n"), (int)(long long)errcode)); /* FIXME: Throw an error string and not an arcane number. */ } } + +static const char *vertexProg = "void main(void)\n{\ngl_Position = ftransform();\ngl_TexCoord[0] = gl_MultiTexCoord0;\n}"; + +static std::string MakeProgIpolate(unsigned ipolate_axis) // X & 1, Y & 2, sharp & 4 +{ + std::string ret; + + ret = std::string("\n\ + uniform sampler2D Tex0;\n\ + uniform vec2 TexSize;\n\ + uniform vec2 TexSizeInverse;\n\ + uniform float XSharp;\n\ + uniform float YSharp;\n\ + void main(void)\n\ + {\n\ + vec2 texelIndex = vec2(gl_TexCoord[0]) * TexSize - float(0.5);\n\ + "); + + if(ipolate_axis & 3) + { + ret += std::string("vec2 texelInt = floor(texelIndex);\n"); + ret += std::string("vec2 texelFract = texelIndex - texelInt - float(0.5);\n"); + + switch(ipolate_axis & 3) + { + case 1: + if(ipolate_axis & 4) + ret += std::string("texelFract.s = clamp(texelFract.s * XSharp, -0.5, 0.5) + float(0.5);\n"); + ret += std::string("texelFract.t = floor(texelFract.t + float(1.0));\n"); + break; + + case 2: + ret += std::string("texelFract.s = floor(texelFract.s + float(1.0));\n"); + + if(ipolate_axis & 4) + ret += std::string("texelFract.t = clamp(texelFract.t * YSharp, -0.5, 0.5) + float(0.5);\n"); + break; + + case 3: + if(ipolate_axis & 4) + { + ret += std::string("texelFract.s = clamp(texelFract.s * XSharp, -0.5, 0.5) + float(0.5);\n"); + ret += std::string("texelFract.t = clamp(texelFract.t * YSharp, -0.5, 0.5) + float(0.5);\n"); + } + break; + } + ret += std::string("texelIndex = texelFract + texelInt;\n"); + } + else + ret += std::string("texelIndex = floor(texelIndex + float(0.5));\n"); + + ret += std::string("texelIndex += float(0.5);\n"); + ret += std::string("texelIndex *= TexSizeInverse;\n"); + ret += std::string("gl_FragColor = vec4( texture2D(Tex0, texelIndex));\n"); + + ret += std::string("}"); + + return ret; +} + +static const char *fragScale2X = +"uniform vec2 TexSize;\n\ +uniform vec2 TexSizeInverse;\n\ +uniform sampler2D Tex0;\n\ +void main()\n\ +{\n\ + vec4 colD,colF,colB,colH,col,tmp;\n\ + vec2 sel;\n\ + vec4 chewx = vec4(TexSizeInverse.x, 0, 0, 0);\n\ + vec4 chewy = vec4(0, TexSizeInverse.y, 0, 0);\n\ + vec4 MeowCoord = gl_TexCoord[0];\n\ + col = texture2DProj(Tex0, MeowCoord); \n\ + colD = texture2DProj(Tex0, MeowCoord - chewx); \n\ + colF = texture2DProj(Tex0, MeowCoord + chewx); \n\ + colB = texture2DProj(Tex0, MeowCoord - chewy); \n\ + colH = texture2DProj(Tex0, MeowCoord + chewy); \n\ + sel=fract(gl_TexCoord[0].xy * TexSize.xy); \n\ + if(sel.y>=0.5) {tmp=colB;colB=colH;colH=tmp;} \n\ + if(sel.x>=0.5) {tmp=colF;colF=colD;colD=tmp;} \n\ + if(colB == colD && colB != colF && colD!=colH) \n\ + col=colD;\n\ + gl_FragColor = col;\n\ +}"; + +#include "shader_sabr.inc" + +void OpenGL_Blitter_Shader::SLP(GLhandleARB moe) +{ + char buf[1000]; + GLsizei buflen = 0; + + oblt->p_glGetInfoLogARB(moe, 999, &buflen, buf); + buf[buflen] = 0; + + if(buflen) + { + throw MDFN_Error(0, "Shader compilation error:\n%s\n", buf); + } +} + +void OpenGL_Blitter_Shader::CompileShader(CompiledShader &s, const char *vertex_prog, const char *frag_prog) +{ + int opi; + + oblt->p_glEnable(GL_FRAGMENT_PROGRAM_ARB); + + MDFN_GL_TRY(s.v = oblt->p_glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); + s.v_valid = true; + + MDFN_GL_TRY(s.f = oblt->p_glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); + s.f_valid = true; + + MDFN_GL_TRY(oblt->p_glShaderSourceARB(s.v, 1, &vertex_prog, NULL), SLP(s.v)); + MDFN_GL_TRY(oblt->p_glShaderSourceARB(s.f, 1, &frag_prog, NULL), SLP(s.f)); + + MDFN_GL_TRY(oblt->p_glCompileShaderARB(s.v), SLP(s.v)); + MDFN_GL_TRY(oblt->p_glGetObjectParameterivARB(s.v, GL_OBJECT_COMPILE_STATUS_ARB, &opi)); + if(GL_FALSE == opi) + { + SLP(s.v); + } + + MDFN_GL_TRY(oblt->p_glCompileShaderARB(s.f), SLP(s.f)); + MDFN_GL_TRY(oblt->p_glGetObjectParameterivARB(s.f, GL_OBJECT_COMPILE_STATUS_ARB, &opi)); + if(GL_FALSE == opi) + { + SLP(s.f); + } + + MDFN_GL_TRY(s.p = oblt->p_glCreateProgramObjectARB(), SLP(s.p)); + s.p_valid = true; + + MDFN_GL_TRY(oblt->p_glAttachObjectARB(s.p, s.v)); + MDFN_GL_TRY(oblt->p_glAttachObjectARB(s.p, s.f)); + + MDFN_GL_TRY(oblt->p_glLinkProgramARB(s.p), SLP(s.p)); + + MDFN_GL_TRY(oblt->p_glDisable(GL_FRAGMENT_PROGRAM_ARB)); +} + +void OpenGL_Blitter_Shader::Cleanup(void) +{ + oblt->p_glUseProgramObjectARB(0); + + for(unsigned i = 0; i < CSP_COUNT; i++) + { + if(CSP[i].p_valid) + { + if(CSP[i].f_valid) + oblt->p_glDetachObjectARB(CSP[i].p, CSP[i].f); + if(CSP[i].v_valid) + oblt->p_glDetachObjectARB(CSP[i].p, CSP[i].v); + } + if(CSP[i].f_valid) + oblt->p_glDeleteObjectARB(CSP[i].f); + if(CSP[i].v_valid) + oblt->p_glDeleteObjectARB(CSP[i].v); + if(CSP[i].p_valid) + oblt->p_glDeleteObjectARB(CSP[i].p); + + CSP[i].f_valid = CSP[i].v_valid = CSP[i].p_valid = false; + } + + oblt->p_glDisable(GL_FRAGMENT_PROGRAM_ARB); +} + +OpenGL_Blitter_Shader::OpenGL_Blitter_Shader(OpenGL_Blitter *in_oblt, ShaderType shader_type) : oblt(in_oblt) +{ + OurType = shader_type; + + memset(&CSP, 0, sizeof(CSP)); + + try + { + switch(OurType) + { + case SHADER_SCALE2X: + CompileShader(CSP[0], vertexProg, fragScale2X); + break; + + case SHADER_SABR: + CompileShader(CSP[0], vertSABR, fragSABR); + break; + + default: + for(unsigned i = 0; i < 8; i++) + { + CompileShader(CSP[i], vertexProg, MakeProgIpolate(i).c_str()); + } + break; + } + } + catch(...) + { + Cleanup(); + throw; + } +} + +bool OpenGL_Blitter_Shader::ShaderNeedsBTIP(void) +{ + if(OurType != SHADER_SCALE2X && OurType != SHADER_SABR) + return(true); + + return(false); +} + +void OpenGL_Blitter_Shader::ShaderBegin(const int gl_screen_w, const int gl_screen_h, const MDFN_Rect *rect, const MDFN_Rect *dest_rect, int tw, int th, int orig_tw, int orig_th, unsigned rotated) +{ + oblt->p_glEnable(GL_FRAGMENT_PROGRAM_ARB); + + //printf("%d:%d, %d:%d\n", tw, th, orig_tw, orig_th); + //printf("%f\n", (double)dest_rect->w / rect->w); + //printf("%f\n", (double)dest_rect->h / rect->h); + if(OurType == SHADER_SCALE2X) + { + oblt->p_glUseProgramObjectARB(CSP[0].p); + + oblt->p_glUniform1iARB(oblt->p_glGetUniformLocationARB(CSP[0].p, "Tex0"), 0); + oblt->p_glUniform2fARB(oblt->p_glGetUniformLocationARB(CSP[0].p, "TexSize"), tw, th); + oblt->p_glUniform2fARB(oblt->p_glGetUniformLocationARB(CSP[0].p, "TexSizeInverse"), (float)1 / tw, (float) 1 / th); + } + else if(OurType == SHADER_SABR) + { + oblt->p_glUseProgramObjectARB(CSP[0].p); + + oblt->p_glUniform1iARB(oblt->p_glGetUniformLocationARB(CSP[0].p, "rubyTexture"), 0); + oblt->p_glUniform2fARB(oblt->p_glGetUniformLocationARB(CSP[0].p, "rubyTextureSize"), tw, th); + } + else + { + unsigned csi; + float sharpness = 2.0; + float xsh; + float ysh; + unsigned ip_x; + unsigned ip_y; + double drw_div_rw; + double drh_div_rh; + + if(rotated == MDFN_ROTATE90 || rotated == MDFN_ROTATE270) + { + drw_div_rw = (double)dest_rect->h / rect->w; + drh_div_rh = (double)dest_rect->w / rect->h; + } + else + { + drw_div_rw = (double)dest_rect->w / rect->w; + drh_div_rh = (double)dest_rect->h / rect->h; + } + + ip_x = 1; + ip_y = 1; + + if(OurType == SHADER_AUTOIP) + { + xsh = 1; + ysh = 1; + } + else + { + xsh = drw_div_rw / sharpness; + ysh = drh_div_rh / sharpness; + } + + if(OurType == SHADER_IPXNOTY || OurType == SHADER_IPXNOTYSHARPER) + { + if(OurType == SHADER_IPXNOTY) + { + xsh = 0; + } + ysh = 0; + ip_x = 1; + ip_y = 0; + } + else if(OurType == SHADER_IPYNOTX || OurType == SHADER_IPYNOTXSHARPER) + { + if(OurType == SHADER_IPYNOTX) + { + ysh = 0; + } + xsh = 0; + ip_x = 0; + ip_y = 1; + } + else if(OurType == SHADER_IPSHARPER) + { + ip_x = true; + ip_y = true; + } + else + { + // Scaling X by an integer? + if(floor(drw_div_rw) == drw_div_rw) + { + xsh = 0; + ip_x = 0; + } + + // Scaling Y by an integer? + if(floor(drh_div_rh) == drh_div_rh) + { + ysh = 0; + ip_y = 0; + } + } + + if(xsh < 1) + xsh = 1; + + if(ysh < 1) + ysh = 1; + + csi = (ip_y << 1) | ip_x; + if(xsh > 1 && ip_x) + csi |= 4; + if(ysh > 1 && ip_y) + csi |= 4; + + oblt->p_glUseProgramObjectARB(CSP[csi].p); + +// printf("%d:%d, %d\n", ip_x, ip_y, csi); + + oblt->p_glUniform1iARB(oblt->p_glGetUniformLocationARB(CSP[csi].p, "Tex0"), 0); + oblt->p_glUniform2fARB(oblt->p_glGetUniformLocationARB(CSP[csi].p, "TexSize"), tw, th); + oblt->p_glUniform2fARB(oblt->p_glGetUniformLocationARB(CSP[csi].p, "TexSizeInverse"), (float)1 / tw, (float) 1 / th); + + oblt->p_glUniform1fARB(oblt->p_glGetUniformLocationARB(CSP[csi].p, "XSharp"), xsh); + oblt->p_glUniform1fARB(oblt->p_glGetUniformLocationARB(CSP[csi].p, "YSharp"), ysh); + } +} + +void OpenGL_Blitter_Shader::ShaderEnd(void) +{ + oblt->p_glUseProgramObjectARB(0); + oblt->p_glDisable(GL_FRAGMENT_PROGRAM_ARB); +} + +OpenGL_Blitter_Shader::~OpenGL_Blitter_Shader() +{ + Cleanup(); +} + diff --git a/Mednafen/mednafen/drivers/shader.h b/Mednafen/mednafen/drivers/shader.h new file mode 100644 index 0000000000..f78374787c --- /dev/null +++ b/Mednafen/mednafen/drivers/shader.h @@ -0,0 +1,49 @@ +#ifndef __DRIVERS_SHADER_H +#define __DRIVERS_SHADER_H + +enum ShaderType +{ + SHADER_NONE = 0, + SHADER_SCALE2X, + SHADER_SABR, + SHADER_AUTOIP, + SHADER_AUTOIPSHARPER, + SHADER_IPSHARPER, + SHADER_IPXNOTY, + SHADER_IPXNOTYSHARPER, + SHADER_IPYNOTX, + SHADER_IPYNOTXSHARPER, +}; + +class OpenGL_Blitter; +class OpenGL_Blitter_Shader +{ + public: + + OpenGL_Blitter_Shader(OpenGL_Blitter *in_oblt, ShaderType pixshader); + ~OpenGL_Blitter_Shader(); + + void ShaderBegin(const int gl_screen_w, const int gl_screen_h, const MDFN_Rect *rect, const MDFN_Rect *dest_rect, int tw, int th, int orig_tw, int orig_th, unsigned rotated); + void ShaderEnd(void); + bool ShaderNeedsBTIP(void); + + private: + + struct CompiledShader + { + GLhandleARB v, f, p; + bool v_valid, f_valid, p_valid; + }; + + enum { CSP_COUNT = 8 }; + + void Cleanup(void); + void SLP(GLhandleARB moe); + void CompileShader(CompiledShader &s, const char *vertex_prog, const char *frag_prog); + + ShaderType OurType; + CompiledShader CSP[CSP_COUNT]; + OpenGL_Blitter* const oblt; +}; + +#endif diff --git a/Mednafen/mednafen/drivers/shader_sabr.inc b/Mednafen/mednafen/drivers/shader_sabr.inc new file mode 100644 index 0000000000..08e22aa926 --- /dev/null +++ b/Mednafen/mednafen/drivers/shader_sabr.inc @@ -0,0 +1,298 @@ +// perl -p -i -e "s/\r\n/\\\n\\\\\n/g" test +/* + + + + + \n\ +\n\ +*/ diff --git a/Mednafen/mednafen/drivers/sound.cpp b/Mednafen/mednafen/drivers/sound.cpp new file mode 100644 index 0000000000..cba23cf538 --- /dev/null +++ b/Mednafen/mednafen/drivers/sound.cpp @@ -0,0 +1,360 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include +#include +#include + +#include "sound.h" + +#include + +static SexyAL *Interface = NULL; +static SexyAL_device *Output = NULL; +static SexyAL_format format; +static SexyAL_buffering buffering; + +static int16 *EmuModBuffer = NULL; +static int32 EmuModBufferSize = 0; // In frames. + +static double SoundRate = 0; +static bool NeedReInit = false; + +bool Sound_NeedReInit(void) +{ + return NeedReInit; +} + +double Sound_GetRate(void) +{ + return(SoundRate); +} + +uint32 Sound_CanWrite(void) +{ + if(!Output) + return(0); + + return(Output->CanWrite(Output)); +} + +void Sound_Write(int16 *Buffer, int Count) +{ + if(!Output) + return; + + if(!Output->Write(Output, Buffer, Count)) + { + // + // TODO; We need to take assert()'s out of the wasapi and wasapish code before we can safely enable this + // + //NeedReInit = true; + //printf("Output->Write failure? %d\n", Count); + } +} + +void Sound_WriteSilence(int ms) +{ + unsigned int frames = (uint64)format.rate * ms / 1000; + int16 SBuffer[frames * format.channels]; + + memset(SBuffer, 0, sizeof(SBuffer)); + Output->Write(Output, SBuffer, frames); +} + +#if 0 +static bool RunSexyALTest(SexyAL *interface, SexyAL_buffering *buffering, const char *device, int driver_type) +{ + static const int to_format[9] = + { + SEXYAL_FMT_PCMU8, + SEXYAL_FMT_PCMS8, + SEXYAL_FMT_PCMU16, + SEXYAL_FMT_PCMS16, + + SEXYAL_FMT_PCMU24, + SEXYAL_FMT_PCMS24, + SEXYAL_FMT_PCMU32, + SEXYAL_FMT_PCMS32, + + SEXYAL_FMT_PCMFLOAT + }; + + static const char *to_format_name[9] = + { + "8-bit unsigned", + "8-bit signed", + "16-bit unsigned", + "16-bit signed", + "24-bit unsigned", + "24-bit signed", + "32-bit unsigned", + "32-bit signed", + "float" + }; + + // TODO: byte order format conversion. + // TODO: source format. + const int rate = 48000; + const int numframes = (rate / 2 + 1) &~ 1; + + for(int src_channels = 1; src_channels <= 2; src_channels++) + { + for(int dest_channels = 1; dest_channels <= 2; dest_channels++) + { + //for(int src_format = 0; src_format < 9; src_format++) + int src_format = 3; + { + for(int dest_format = 0; dest_format < 9; dest_format++) + { + printf("Source Format: %s, Source Channels: %d --- Dest Format: %s, Dest Channels: %d\n\n", to_format_name[src_format], src_channels, to_format_name[dest_format], dest_channels); + + memset(&format,0,sizeof(format)); + + Interface = (SexyAL *)SexyAL_Init(0); + DriverTypes = Interface->EnumerateTypes(Interface); + + format.sampformat = to_format[dest_format]; + format.channels = dest_channels; + format.revbyteorder = 0; + format.rate = rate; + + buffering->buffer_size = 0; + buffering->period_size = 0; + buffering->latency = 0; + buffering->bt_gran = 0; + + if(!(Output=Interface->Open(Interface, device, &format, buffering, driver_type))) + { + MDFND_PrintError(_("Error opening a sound device.")); + Interface->Destroy(Interface); + Interface=0; + return(0); + } + + if(format.sampformat != to_format[dest_format]) + printf("Warning: Could not set desired device format.\n"); + + if(format.channels != dest_channels) + printf("Warning: Could not set desired device channel count.\n"); + + if(format.rate != rate) + printf("Warning: Could not set desired device rate.\n"); + + format.sampformat = to_format[src_format]; + format.channels = src_channels; + format.revbyteorder = 0; + format.rate = rate; + + Output->SetConvert(Output, &format); + + if(to_format[src_format] == SEXYAL_FMT_PCMS16) + { + int16 samples[numframes * src_channels]; + + for(int i = 0; i < numframes; i++) + { + int16 sval = 4095 * sin((double)i * 440 * M_PI * 2 / rate); + + for(int ch = 0; ch < src_channels; ch++) + samples[i * src_channels + ch] = sval; + } + // Write half in one go, the rest in small chunks. + if(!Output->Write(Output, samples, numframes / 2)) + printf("Write count error 0\n"); + + for(int i = numframes / 2; i < numframes; i += 100) + { + int32 towrite = numframes - i; + + if(towrite > 100) + towrite = 100; + + if(!Output->Write(Output, samples + i * src_channels, towrite)) + printf("Write count error 1\n"); + } + } + Output->Close(Output); + Interface->Destroy(Interface); + sleep(1); + } + } + } + } +} +#endif + +bool Sound_Init(MDFNGI *gi) +{ + SexyAL_DriverInfo CurDriver; + + NeedReInit = false; + SoundRate = 0; + + memset(&format, 0, sizeof(format)); + memset(&buffering, 0, sizeof(buffering)); + + Interface = new SexyAL(); + + format.sampformat = SEXYAL_FMT_PCMS16; + + assert(gi->soundchan); + format.channels = gi->soundchan; + + format.revbyteorder = 0; + format.noninterleaved = false; + format.rate = MDFN_GetSettingUI("sound.rate"); + + buffering.ms = MDFN_GetSettingUI("sound.buffer_time"); + + if(!buffering.ms) + { + buffering.overhead_kludge = true; + buffering.ms = 7 + floor(0.5 + 1.5 * 1000.0 / gi->fps * (256 * 65536)); + } + else + buffering.overhead_kludge = false; + + buffering.period_us = MDFN_GetSettingUI("sound.period_time"); + + std::string zedevice = MDFN_GetSettingS("sound.device"); + std::string zedriver = MDFN_GetSettingS("sound.driver"); + + MDFNI_printf(_("\nInitializing sound...\n")); + MDFN_indent(1); + + if(!Interface->FindDriver(&CurDriver, zedriver.c_str())) + { + std::vector DriverTypes = Interface->GetDriverList(); + + MDFN_printf(_("\nUnknown sound driver \"%s\". Compiled-in sound drivers:\n"), zedriver.c_str()); + + MDFN_indent(2); + for(unsigned x = 0; x < DriverTypes.size(); x++) + { + MDFN_printf("%s\n", DriverTypes[x].short_name); + } + MDFN_indent(-2); + MDFN_printf("\n"); + + delete Interface; + Interface = NULL; + + MDFN_indent(-1); + return(FALSE); + } + + if(!strcasecmp(zedevice.c_str(), "default")) + MDFNI_printf(_("Using \"%s\" audio driver with SexyAL's default device selection."), CurDriver.name); + else + MDFNI_printf(_("Using \"%s\" audio driver with device \"%s\":"), CurDriver.name, zedevice.c_str()); + MDFN_indent(1); + + //RunSexyALTest(Interface, &buffering, zedevice.c_str(), CurDriver.type); + //exit(1); + if(!(Output=Interface->Open(zedevice.c_str(), &format, &buffering, CurDriver.type))) + { + MDFND_PrintError(_("Error opening a sound device.")); + + delete Interface; + Interface = NULL; + MDFN_indent(-2); + return(FALSE); + } + + if(format.rate < 22050 || format.rate > 192000) + { + MDFND_PrintError(_("Set rate is out of range [22050-192000]")); + Sound_Kill(); + MDFN_indent(-2); + return(FALSE); + } + MDFNI_printf(_("\nBits: %u%s\nRate: %u\nChannels: %u%s\nByte order: CPU %s\nBuffer size: %u sample frames(%f ms)\n"), (format.sampformat>>4)*8, (format.sampformat == SEXYAL_FMT_PCMFLOAT) ? _(" (floating-point)") : "",format.rate,format.channels,format.noninterleaved ? _(" (non-interleaved) ") : "", format.revbyteorder?"Reversed":"Native", buffering.buffer_size, (double)buffering.buffer_size * 1000 / format.rate); + MDFNI_printf(_("Latency: %u sample frames(%f ms)\n"), buffering.latency, (double)buffering.latency * 1000 / format.rate); + + if(buffering.period_size) + { + //int64_t pt_test_result = ((int64_t)buffering.period_size * (1000 * 1000) / format.rate); + int64_t bt_test_result = ((int64_t)(buffering.bt_gran ? buffering.bt_gran : buffering.period_size) * (1000 * 1000) / format.rate); + MDFNI_printf(_("Period size: %u sample frames(%f ms)\n"), buffering.period_size, (double)buffering.period_size * 1000 / format.rate); + + if(bt_test_result > 5333) + { + MDFN_indent(1); + + if(!buffering.bt_gran) + MDFN_printf(_("Warning: Period time is too large(it should be <= ~5.333ms). Video will appear very jerky.\n")); + else + MDFN_printf(_("Warning: Buffer update timing granularity is too large(%f; it should be <= ~5.333ms). Video will appear very jerky.\n"), (double)buffering.bt_gran * 1000 / format.rate); + MDFN_indent(-1); + } + } + + format.sampformat = SEXYAL_FMT_PCMS16; + format.channels = gi->soundchan?gi->soundchan:1; + format.revbyteorder = 0; + format.noninterleaved = false; + //format.rate=gi->soundrate?gi->soundrate:soundrate; + + Output->SetConvert(Output, &format); + + EmuModBufferSize = (500 * format.rate + 999) / 1000; + EmuModBuffer = (int16 *)calloc(sizeof(int16) * format.channels, EmuModBufferSize); + + SoundRate = format.rate; + MDFN_indent(-2); + + return(1); +} + +bool Sound_Kill(void) +{ + SoundRate = 0; + + if(EmuModBuffer) + { + free(EmuModBuffer); + EmuModBuffer = NULL; + + EmuModBufferSize = 0; + } + + if(Output) + Output->Close(Output); + + if(Interface) + { + delete Interface; + Interface = NULL; + } + + if(!Output) + return(FALSE); + + Output = NULL; + + return(TRUE); +} + + +int16 *Sound_GetEmuModBuffer(int32 *max_size_bytes) +{ + *max_size_bytes = EmuModBufferSize; + + return(EmuModBuffer); +} diff --git a/Mednafen/mednafen/drivers/sound.h b/Mednafen/mednafen/drivers/sound.h new file mode 100644 index 0000000000..cc4b77f306 --- /dev/null +++ b/Mednafen/mednafen/drivers/sound.h @@ -0,0 +1,17 @@ +#ifndef __MDFN_DRIVERS_SOUND_H +#define __MDFN_DRIVERS_SOUND_H + +bool Sound_NeedReInit(void); + +bool Sound_Init(MDFNGI *gi); +void Sound_Write(int16 *Buffer, int Count); +void Sound_WriteSilence(int ms); +bool Sound_Kill(void); + +uint32 Sound_CanWrite(void); + +int16 *Sound_GetEmuModBuffer(int32 *max_size); + +double Sound_GetRate(void); + +#endif diff --git a/Mednafen/mednafen/drivers/thread_sdl.cpp b/Mednafen/mednafen/drivers/thread_sdl.cpp new file mode 100644 index 0000000000..de4920a899 --- /dev/null +++ b/Mednafen/mednafen/drivers/thread_sdl.cpp @@ -0,0 +1,113 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data) +{ + return (MDFN_Thread*)SDL_CreateThread(fn, data); +} + +void MDFND_WaitThread(MDFN_Thread *thread, int *status) +{ + SDL_WaitThread((SDL_Thread*)thread, status); +} + +MDFN_Mutex *MDFND_CreateMutex(void) +{ + return (MDFN_Mutex*)SDL_CreateMutex(); +} + +void MDFND_DestroyMutex(MDFN_Mutex *mutex) +{ + SDL_DestroyMutex((SDL_mutex*)mutex); +} + +int MDFND_LockMutex(MDFN_Mutex *mutex) +{ + return SDL_mutexP((SDL_mutex*)mutex); +} + +int MDFND_UnlockMutex(MDFN_Mutex *mutex) +{ + return SDL_mutexV((SDL_mutex*)mutex); +} + +MDFN_Cond* MDFND_CreateCond(void) +{ + return (MDFN_Cond*)SDL_CreateCond(); +} + +void MDFND_DestroyCond(MDFN_Cond* cond) +{ + SDL_DestroyCond((SDL_cond*)cond); +} + +int MDFND_SignalCond(MDFN_Cond* cond) +{ + return SDL_CondSignal((SDL_cond*)cond); +} + +int MDFND_WaitCond(MDFN_Cond* cond, MDFN_Mutex* mutex) +{ + return SDL_CondWait((SDL_cond*)cond, (SDL_mutex*)mutex); +} + +int MDFND_WaitCondTimeout(MDFN_Cond* cond, MDFN_Mutex* mutex, unsigned ms) +{ + int ret = SDL_CondWaitTimeout((SDL_cond*)cond, (SDL_mutex*)mutex, ms); + + if(ret == SDL_MUTEX_TIMEDOUT) + return(MDFND_COND_TIMEDOUT); + else + return(ret); +} + +MDFN_Sem* MDFND_CreateSem(void) +{ + return (MDFN_Sem*)SDL_CreateSemaphore(0); +} + +void MDFND_DestroySem(MDFN_Sem* sem) +{ + SDL_DestroySemaphore((SDL_sem*)sem); +} + +int MDFND_PostSem(MDFN_Sem* sem) +{ + return SDL_SemPost((SDL_sem*)sem); +} + +int MDFND_WaitSem(MDFN_Sem* sem) +{ + return SDL_SemWait((SDL_sem*)sem); +} + +int MDFND_WaitSemTimeout(MDFN_Sem* sem, unsigned ms) +{ + int ret = SDL_SemWaitTimeout((SDL_sem*)sem, ms); + + if(ret == SDL_MUTEX_TIMEDOUT) + return(MDFND_SEM_TIMEDOUT); + else + return(ret); +} + +uint32 MDFND_ThreadID(void) +{ + return SDL_ThreadID(); +} diff --git a/Mednafen/mednafen/drivers/thread_win32.cpp b/Mednafen/mednafen/drivers/thread_win32.cpp new file mode 100644 index 0000000000..be7aa29d48 --- /dev/null +++ b/Mednafen/mednafen/drivers/thread_win32.cpp @@ -0,0 +1,411 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Condition variables here are implemented in a half-assed manner(thin wrapper around Win32 events). + This implementation is prone to large numbers of spurious wakeups, and is not easily extended to allow for correctly waking up all waiting threads. + We don't need that feature right now, and by the time we need it, maybe we can just use Vista+ condition variables and forget about XP ;). + + ...but at least the code is simple and should be much faster than SDL 1.2's condition variables for our purposes. +*/ + +#include "main.h" + +#include +#include +#include +#include + +#if 0 +typedef struct +{ + union + { + void* something; + unsigned char lalala[64]; + }; +} NAKED_CONDITION_VARIABLE; + +static int use_cv = -1; +static HMODULE kdh = NULL; +static void WINAPI (*p_InitializeConditionVariable)(NAKED_CONDITION_VARIABLE*) = NULL; +static BOOL WINAPI (*p_SleepConditionVariableCS)(NAKED_CONDITION_VARIABLE*, PCRITICAL_SECTION, DWORD) = NULL; +static void WINAPI (*p_WakeConditionVariable)(NAKED_CONDITION_VARIABLE*) = NULL; + +template +static bool GetPAW(HMODULE dll_handle, T& pf, const char *name) +{ + pf = (T)GetProcAddress(dll_handle, name); + return(pf != NULL); +} + +static void InitCVStuff(void) +{ + kdh = LoadLibrary("Kernel32.dll"); + + GetPAW(kdh, p_InitializeConditionVariable, "InitializeConditionVariable"); + GetPAW(kdh, p_SleepConditionVariableCS, "SleepConditionVariableCS"); + GetPAW(kdh, p_WakeConditionVariable, "WakeConditionVariable"); + + use_cv = (p_InitializeConditionVariable && p_SleepConditionVariableCS && p_WakeConditionVariable); + + fprintf(stderr, "use_cv=%d\n", use_cv); +} +#endif + +struct MDFN_Thread +{ + HANDLE thr; + int (*fn)(void *); + void* data; +}; + +struct MDFN_Cond +{ +#if 0 + union + { + HANDLE evt; + NAKED_CONDITION_VARIABLE cv; + }; +#endif + HANDLE evt; +}; + +struct MDFN_Sem +{ + HANDLE sem; +}; + +struct MDFN_Mutex +{ + CRITICAL_SECTION cs; +}; + +static void TestStackAlign(void) NO_INLINE; +static void TestStackAlign(void) +{ + alignas(16) char test_array[17]; + unsigned volatile memloc = ((unsigned long long)&test_array[0]); + assert((memloc & 0xF) == 0); + + //unsigned char memloc = ((unsigned long long)&test_array[0]) & 0xFF; + + //assert(((((memloc * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL) >> 36) == 0); + + //printf("%02x\n", memloc); + //trio_snprintf(test_array, sizeof(test_array), "%02x", memloc); + //assert(test_array[1] == '0'); +} + +static DWORD WINAPI ThreadPivot(LPVOID data) __attribute__((force_align_arg_pointer)); +static DWORD WINAPI ThreadPivot(LPVOID data) +{ + TestStackAlign(); + + MDFN_Thread* t = (MDFN_Thread*)data; + + return t->fn(t->data); +} + +MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data) +{ + MDFN_Thread* ret = NULL; + +#if 0 + if(use_cv < 0) + InitCVStuff(); +#endif + + if(!(ret = (MDFN_Thread*)calloc(1, sizeof(MDFN_Thread)))) + { + return(NULL); + } + + ret->fn = fn; + ret->data = data; + + if(!(ret->thr = CreateThread(NULL, 0, ThreadPivot, ret, 0, NULL))) + { + free(ret); + return(NULL); + } + + return(ret); +} + +void MDFND_WaitThread(MDFN_Thread *thread, int *status) +{ + DWORD exc = -1; + + WaitForSingleObject(thread->thr, INFINITE); + GetExitCodeThread(thread->thr, &exc); + if(status != NULL) + *status = exc; + + CloseHandle(thread->thr); + + free(thread); +} + +uint32 MDFND_ThreadID(void) +{ + return GetCurrentThreadId(); +} + +// +// +// + +MDFN_Mutex *MDFND_CreateMutex(void) +{ + MDFN_Mutex* ret; + + if(!(ret = (MDFN_Mutex*)calloc(1, sizeof(MDFN_Mutex)))) + { + fprintf(stderr, "Error allocating memory for critical section."); + return(NULL); + } + + InitializeCriticalSection(&ret->cs); + + return ret; +} + +void MDFND_DestroyMutex(MDFN_Mutex *mutex) +{ + DeleteCriticalSection(&mutex->cs); + free(mutex); +} + +int MDFND_LockMutex(MDFN_Mutex *mutex) +{ + EnterCriticalSection(&mutex->cs); + return(0); +} + +int MDFND_UnlockMutex(MDFN_Mutex *mutex) +{ + LeaveCriticalSection(&mutex->cs); + return(0); +} + +// +// +// + +MDFN_Cond* MDFND_CreateCond(void) +{ +#if 0 + if(use_cv < 0) + InitCVStuff(); +#endif + + MDFN_Cond* ret; + + if(!(ret = (MDFN_Cond*)calloc(1, sizeof(MDFN_Cond)))) + { + return(NULL); + } + +#if 0 + if(use_cv) + { + memset(ret->cv.lalala, 0xAA, 64); + p_InitializeConditionVariable(&ret->cv); + for(int i = 0; i < 64; i++) + { + printf("%2d: %02x\n", i, ret->cv.lalala[i]); + } + } + else +#endif + { + if(!(ret->evt = CreateEvent(NULL, FALSE, FALSE, NULL))) + { + free(ret); + return(NULL); + } + } + + return(ret); +} + +void MDFND_DestroyCond(MDFN_Cond* cond) +{ +#if 0 + if(use_cv) + { + + } + else +#endif + { + CloseHandle(cond->evt); + } + free(cond); +} + +int MDFND_SignalCond(MDFN_Cond* cond) +{ +#if 0 + if(use_cv) + { + p_WakeConditionVariable(&cond->cv); + return(0); + } + else +#endif + { + return(SetEvent(cond->evt) ? 0 : -1); + } +} + +int MDFND_WaitCond(MDFN_Cond* cond, MDFN_Mutex* mutex) +{ +#if 0 + if(use_cv) + { + if(p_SleepConditionVariableCS(&cond->cv, &mutex->cs, INFINITE) == 0) + { + fprintf(stderr, "SleepConditionVariableCS() failed.\n"); + return(-1); + } + + return(0); + } + else +#endif + { + LeaveCriticalSection(&mutex->cs); + + WaitForSingleObject(cond->evt, INFINITE); + + EnterCriticalSection(&mutex->cs); + + return(0); + } +} + +int MDFND_WaitCondTimeout(MDFN_Cond* cond, MDFN_Mutex* mutex, unsigned ms) +{ + int ret = 0; + +#if 0 + if(use_cv) + { + if(p_SleepConditionVariableCS(&cond->cv, &mutex->cs, ms) == 0) + { + fprintf(stderr, "SleepConditionVariableCS() failed.\n"); + ret = -1; + } + } + else +#endif + { + ResetEvent(cond->evt); // Reset before unlocking mutex. + LeaveCriticalSection(&mutex->cs); + + switch(WaitForSingleObject(cond->evt, ms)) + { + case WAIT_OBJECT_0: + ret = 0; + break; + + case WAIT_TIMEOUT: + ret = MDFND_COND_TIMEDOUT; + break; + + default: + ret = -1; + break; + } + + EnterCriticalSection(&mutex->cs); + } + + return(ret); +} + +// +// +// + +MDFN_Sem* MDFND_CreateSem(void) +{ + MDFN_Sem* ret; + + if(!(ret = (MDFN_Sem*)calloc(1, sizeof(MDFN_Sem)))) + { + fprintf(stderr, "Error allocating memory for semaphore."); + return(NULL); + } + + if(!(ret->sem = CreateSemaphore(NULL, 0, INT_MAX, NULL))) + { + fprintf(stderr, "CreateSemaphore() failed.\n"); + free(ret); + return(NULL); + } + + return(ret); +} + +void MDFND_DestroySem(MDFN_Sem* sem) +{ + CloseHandle(sem->sem); + sem->sem = NULL; + free(sem); +} + +int MDFND_PostSem(MDFN_Sem* sem) +{ + if(ReleaseSemaphore(sem->sem, 1, NULL) != 0) + return(0); + else + return(-1); +} + +int MDFND_WaitSem(MDFN_Sem* sem) +{ + if(WaitForSingleObject(sem->sem, INFINITE) == WAIT_OBJECT_0) + return(0); + else + return(-1); +} + +int MDFND_WaitSemTimeout(MDFN_Sem* sem, unsigned ms) +{ + int ret = 0; + + switch(WaitForSingleObject(sem->sem, ms)) + { + case WAIT_OBJECT_0: + ret = 0; + break; + + case WAIT_TIMEOUT: + ret = MDFND_SEM_TIMEDOUT; + break; + + default: + ret = -1; + break; + } + return(ret); +} + diff --git a/Mednafen/mednafen/drivers/video-state.cpp b/Mednafen/mednafen/drivers/video-state.cpp new file mode 100644 index 0000000000..504aa62cdd --- /dev/null +++ b/Mednafen/mednafen/drivers/video-state.cpp @@ -0,0 +1,222 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// Code for drawing save states and mooovies +// all functions should be called from the main thread +#include "main.h" +#include "video.h" +#include +#include + +#define MK_COLOR_A(tmp_surface, r,g,b,a) (tmp_surface->MakeColor(r, g, b, a)) + +static MDFN_Surface *PreviewSurface = NULL, *TextSurface = NULL; +static MDFN_Rect PreviewRect, TextRect; + +static StateStatusStruct *StateStatus; +static uint32 StateShow; +static bool IsMovie; + +void DrawStateMovieRow(MDFN_Surface *surface, int *nstatus, int cur, int recently_saved, const char *text) +{ + uint32 *XBuf = surface->pixels; + uint32 pitch32 = surface->pitchinpix; + + MDFN_DrawFillRect(surface, 0, 0, 230, 40, surface->MakeColor(0x00, 0x00, 0x00, 170)); + + // nstatus + for(int i = 1; i < 11; i++) + { + char stringie[2]; + uint32 bordercol; + uint32 rect_bg_color = MK_COLOR_A(surface, 0x00, 0x00, 0x00, 0xFF); + + if(cur == (i % 10)) + bordercol = MK_COLOR_A(surface, 0x60, 0x20, 0xb0, 0xFF); + else + bordercol = MK_COLOR_A(surface, 0, 0, 0, 0xFF); + + stringie[0] = '0' + (i % 10); + stringie[1] = 0; + + if(nstatus[i % 10]) + { + rect_bg_color = MK_COLOR_A(surface, 0x00, 0x38, 0x28, 0xFF); + + if(recently_saved == (i % 10)) + rect_bg_color = MK_COLOR_A(surface, 0x48, 0x00, 0x34, 0xFF); + } + + MDFN_DrawFillRect(surface, (i - 1) * 23, 0, 23, 18 + 1, bordercol, rect_bg_color); + + DrawTextTransShadow(XBuf + (i - 1) * 23 + 7, pitch32 << 2, 230, stringie, MK_COLOR_A(surface, 0xE0, 0xFF, 0xE0, 0xFF), MK_COLOR_A(surface, 0x00, 0x00, 0x00, 0xFF), FALSE); + } + DrawTextTransShadow(XBuf + 20 * pitch32, pitch32 << 2, 230, text, MK_COLOR_A(surface, 0xE0, 0xFF, 0xE0, 0xFF), MK_COLOR_A(surface, 0x00, 0x00, 0x00, 0xFF), TRUE); +} + + +bool SaveStatesActive(void) +{ + return(StateStatus); +} + +static void SSCleanup(void) +{ + if(PreviewSurface) + { + delete PreviewSurface; + PreviewSurface = NULL; + } + + if(TextSurface) + { + delete TextSurface; + TextSurface = NULL; + } + + if(StateStatus) + { + if(StateStatus->gfx) + free(StateStatus->gfx); + free(StateStatus); + StateStatus = NULL; + } +} + +void DrawSaveStates(SDL_Surface *screen, double exs, double eys, int rs, int gs, int bs, int as) +{ + if(StateShow < MDFND_GetTime()) + { + SSCleanup(); + } + + if(StateStatus) + { + if(!PreviewSurface) + { + PreviewSurface = new MDFN_Surface(NULL, StateStatus->w + 2, StateStatus->h + 2, StateStatus->w + 2, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, rs, gs, bs, as)); + + if(!PreviewSurface) + { + printf("Iyee: %d %d\n", StateStatus->w, StateStatus->h); + return; + } + + PreviewRect.x = PreviewRect.y = 0; + PreviewRect.w = StateStatus->w + 2; + PreviewRect.h = StateStatus->h + 2; + + MDFN_DrawFillRect(PreviewSurface, 0, 0, StateStatus->w + 2, StateStatus->h + 2, MK_COLOR_A(PreviewSurface, 0x00, 0x00, 0x9F, 0xFF), MK_COLOR_A(PreviewSurface, 0x00, 0x00, 0x00, 0x80)); + + uint32 *psp = PreviewSurface->pixels; + + psp += PreviewSurface->pitchinpix; + psp++; + + if(StateStatus->gfx) + { + for(uint32 y = 0; y < StateStatus->h; y++) + { + uint8 *src_row = StateStatus->gfx + y * StateStatus->w * 3; + + for(uint32 x = 0; x < StateStatus->w; x++) + { + psp[x] = MK_COLOR_A(PreviewSurface, src_row[0], src_row[1], src_row[2], 0xFF); + src_row += 3; + } + psp += PreviewSurface->pitchinpix; + } + } + + if(!TextSurface) + { + TextSurface = new MDFN_Surface(NULL, 230, 40, 230, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, rs, gs, bs, as)); + + TextRect.x = TextRect.y = 0; + TextRect.w = 230; + TextRect.h = 40; + } + + if(IsMovie) + { + char text[256]; + + if(StateStatus->current_movie > 0) + trio_snprintf(text, 256, _("-recording movie %d-"), StateStatus->current_movie-1); + else if (StateStatus->current_movie < 0) + trio_snprintf(text, 256, _("-playing movie %d-"),-1 - StateStatus->current_movie); + else + trio_snprintf(text, 256, _("-select movie-")); + + DrawStateMovieRow(TextSurface, StateStatus->status, StateStatus->current, StateStatus->recently_saved, text); + } + else + DrawStateMovieRow(TextSurface, StateStatus->status, StateStatus->current, StateStatus->recently_saved, _("-select state-")); + } + } // end if(StateStatus) + + if(PreviewSurface) + { + MDFN_Rect tdrect, drect; + + int meow = ((screen->w / CurGame->nominal_width) + 1) / 2; + if(!meow) meow = 1; + + tdrect.w = TextRect.w * meow; + tdrect.h = TextRect.h * meow; + tdrect.x = (screen->w - tdrect.w) / 2; + tdrect.y = screen->h - tdrect.h; + + BlitRaw(TextSurface, &TextRect, &tdrect); + + drect.w = PreviewRect.w * meow; + drect.h = PreviewRect.h * meow; + drect.x = (screen->w - drect.w) / 2; + drect.y = screen->h - drect.h - tdrect.h - 4; + + BlitRaw(PreviewSurface, &PreviewRect, &drect); + + } + +} + +void MT_SetStateStatus(StateStatusStruct *status) +{ + SSCleanup(); + + IsMovie = FALSE; + StateStatus = status; + + if(status) + StateShow = MDFND_GetTime() + MDFN_GetSettingUI("osd.state_display_time"); + else + StateShow = 0; +} + +void MT_SetMovieStatus(StateStatusStruct *status) +{ + SSCleanup(); + + IsMovie = TRUE; + StateStatus = status; + + if(status) + StateShow = MDFND_GetTime() + MDFN_GetSettingUI("osd.state_display_time"); + else + StateShow = 0; +} + diff --git a/Mednafen/mednafen/drivers/video-state.h b/Mednafen/mednafen/drivers/video-state.h new file mode 100644 index 0000000000..660e66e77c --- /dev/null +++ b/Mednafen/mednafen/drivers/video-state.h @@ -0,0 +1,10 @@ +#ifndef __MDFN_DRIVERS_VIDEO_STATE_H +#define __MDFN_DRIVERS_VIDEO_STATE_H + +void DrawSaveStates(SDL_Surface *screen, double, double, int, int, int, int); +bool SaveStatesActive(void); + +void MT_SetStateStatus(StateStatusStruct *status); +void MT_SetMovieStatus(StateStatusStruct *status); + +#endif diff --git a/Mednafen/mednafen/drivers/video.cpp b/Mednafen/mednafen/drivers/video.cpp new file mode 100644 index 0000000000..b41fc9e43f --- /dev/null +++ b/Mednafen/mednafen/drivers/video.cpp @@ -0,0 +1,1771 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#ifdef WIN32 +#include +#endif + +#include +#include +#include +#include +#include + +#include "video.h" +#include "opengl.h" +#include "shader.h" +#include "nongl.h" +#include "overlay.h" + +#include "icon.h" +#include "netplay.h" +#include "cheat.h" + +#include "nnx.h" +#include "debugger.h" +#include "fps.h" +#include "help.h" +#include "video-state.h" + +#ifdef WANT_FANCY_SCALERS +#include "scalebit.h" +#include "hqxx-common.h" +#include "2xSaI.h" +#endif + +class SDL_to_MDFN_Surface_Wrapper : public MDFN_Surface +{ + public: + INLINE SDL_to_MDFN_Surface_Wrapper(SDL_Surface *sdl_surface) : ss(sdl_surface) + { + // Locking should be first thing. + if(SDL_MUSTLOCK(ss)) + SDL_LockSurface(ss); + + format.bpp = ss->format->BitsPerPixel; + format.colorspace = MDFN_COLORSPACE_RGB; + format.Rshift = ss->format->Rshift; + format.Gshift = ss->format->Gshift; + format.Bshift = ss->format->Bshift; + format.Ashift = ss->format->Ashift; + + format.Rprec = 8 - ss->format->Rloss; + format.Gprec = 8 - ss->format->Gloss; + format.Bprec = 8 - ss->format->Bloss; + format.Aprec = 8 - ss->format->Aloss; + + pixels_is_external = true; + + pixels16 = NULL; + pixels = NULL; + + if(ss->format->BitsPerPixel == 16) + { + pixels16 = (uint16*)ss->pixels; + pitchinpix = ss->pitch >> 1; + } + else + { + pixels = (uint32*)ss->pixels; + pitchinpix = ss->pitch >> 2; + } + + format = MDFN_PixelFormat(MDFN_COLORSPACE_RGB, sdl_surface->format->Rshift, sdl_surface->format->Gshift, sdl_surface->format->Bshift, sdl_surface->format->Ashift); + + w = ss->w; + h = ss->h; + } + + INLINE ~SDL_to_MDFN_Surface_Wrapper() + { + if(SDL_MUSTLOCK(ss)) + SDL_UnlockSurface(ss); + ss = NULL; + } + private: + SDL_Surface *ss; +}; + +enum +{ + VDRIVER_OPENGL = 0, + VDRIVER_SOFTSDL = 1, + VDRIVER_OVERLAY = 2 +}; + +#define NTVB_HQ2X 1 +#define NTVB_HQ3X 2 +#define NTVB_HQ4X 3 + +#define NTVB_SCALE2X 4 +#define NTVB_SCALE3X 5 +#define NTVB_SCALE4X 6 + +#define NTVB_NN2X 7 +#define NTVB_NN3X 8 +#define NTVB_NN4X 9 + +#define NTVB_NNY2X 10 +#define NTVB_NNY3X 11 +#define NTVB_NNY4X 12 + +#define NTVB_2XSAI 13 +#define NTVB_SUPER2XSAI 14 +#define NTVB_SUPEREAGLE 15 + +//#define NTVB_SCANLINES 16 + +static MDFNSetting_EnumList VDriver_List[] = +{ + // Legacy: + { "0", VDRIVER_OPENGL }, + { "1", VDRIVER_SOFTSDL }, + + + { "opengl", VDRIVER_OPENGL, "OpenGL + SDL", gettext_noop("This output method is preferred, as all features are available with it.") }, + { "sdl", VDRIVER_SOFTSDL, "SDL Surface", gettext_noop("Slower with lower-quality scaling than OpenGL, but if you don't have hardware-accelerated OpenGL rendering, it will be faster than software OpenGL rendering. Bilinear interpolation not available. Pixel shaders do not work with this output method, of course.") }, + { "overlay", VDRIVER_OVERLAY, "SDL Overlay", gettext_noop("As fast as OpenGL, perhaps faster in some situations, *if* it's hardware-accelerated. Scanline effects are not available. hq2x, hq3x, hq4x are not available. The OSD may be missing or glitchy. PSX emulation will not display properly. Bilinear interpolation can't be turned off. Harsh chroma subsampling blurring in some picture types. If you use this output method, it is strongly recommended to use a special scaler with it, such as nn2x.") }, + + { NULL, 0 }, +}; + +static MDFNSetting GlobalVideoSettings[] = +{ + { "video.driver", MDFNSF_NOFLAGS, gettext_noop("Video output method/driver."), NULL, MDFNST_ENUM, "opengl", NULL, NULL, NULL, NULL, VDriver_List }, + + { "video.fs", MDFNSF_NOFLAGS, gettext_noop("Enable fullscreen mode."), NULL, MDFNST_BOOL, "0", }, + { "video.glvsync", MDFNSF_NOFLAGS, gettext_noop("Attempt to synchronize OpenGL page flips to vertical retrace period."), + gettext_noop("Note: Additionally, if the environment variable \"__GL_SYNC_TO_VBLANK\" does not exist, then it will be created and set to the value specified for this setting. This has the effect of forcibly enabling or disabling vblank synchronization when running under Linux with NVidia's drivers."), + MDFNST_BOOL, "1" }, + + { "video.disable_composition", MDFNSF_NOFLAGS, gettext_noop("Attempt to disable desktop composition."), gettext_noop("Currently, this setting only has an effect on Windows Vista and Windows 7(and probably the equivalent server versions as well)."), MDFNST_BOOL, "1" }, +}; + +static const MDFNSetting_EnumList StretchMode_List[] = +{ + { "0", 0, gettext_noop("Disabled") }, + { "off", 0 }, + + { "1", 1 }, + { "full", 1, gettext_noop("Full"), gettext_noop("Full-screen stretch, disregarding aspect ratio.") }, + + { "2", 2 }, + { "aspect", 2, gettext_noop("Aspect Preserve"), gettext_noop("Full-screen stretch as far as the aspect ratio(in this sense, the equivalent xscalefs == yscalefs) can be maintained.") }, + + { "aspect_int", 3, gettext_noop("Aspect Preserve + Integer Scale"), gettext_noop("Full-screen stretch, same as \"aspect\" except that the equivalent xscalefs and yscalefs are rounded down to the nearest integer.") }, + { "aspect_mult2", 4, gettext_noop("Aspect Preserve + Integer Multiple-of-2 Scale"), gettext_noop("Full-screen stretch, same as \"aspect_int\", but rounds down to the nearest multiple of 2.") }, + + { NULL, 0 }, +}; + +static const MDFNSetting_EnumList VideoIP_List[] = +{ + { "0", VIDEOIP_OFF, gettext_noop("Disabled") }, + + { "1", VIDEOIP_BILINEAR, gettext_noop("Bilinear") }, + + // Disabled until a fix can be made for rotation. + { "x", VIDEOIP_LINEAR_X, gettext_noop("Linear (X)"), gettext_noop("Interpolation only on the X axis.") }, + { "y", VIDEOIP_LINEAR_Y, gettext_noop("Linear (Y)"), gettext_noop("Interpolation only on the Y axis.") }, + + { NULL, 0 }, +}; + +static MDFNSetting_EnumList Special_List[] = +{ + { "0", -1 }, + { "none", -1, "None/Disabled" }, + +#ifdef WANT_FANCY_SCALERS + { "hq2x", -1, "hq2x" }, + { "hq3x", -1, "hq3x" }, + { "hq4x", -1, "hq4x" }, + { "scale2x",-1, "scale2x" }, + { "scale3x",-1, "scale3x" }, + { "scale4x",-1, "scale4x" }, + + { "2xsai", -1, "2xSaI" }, + { "super2xsai", -1, "Super 2xSaI" }, + { "supereagle", -1, "Super Eagle" }, +#endif + + { "nn2x", -1, "Nearest-neighbor 2x" }, + { "nn3x", -1, "Nearest-neighbor 3x" }, + { "nn4x", -1, "Nearest-neighbor 4x" }, + { "nny2x", -1, "Nearest-neighbor 2x, y axis only" }, + { "nny3x", -1, "Nearest-neighbor 3x, y axis only" }, + { "nny4x", -1, "Nearest-neighbor 4x, y axis only" }, +// { "scanlines", -1, "Scanlines" }, + + { NULL, 0 }, +}; + +static MDFNSetting_EnumList Pixshader_List[] = +{ + { "none", SHADER_NONE, "None/Disabled" }, + { "autoip", SHADER_AUTOIP, "Auto Interpolation", gettext_noop("Will automatically interpolate on each axis if the corresponding effective scaling factor is not an integer.") }, + { "autoipsharper", SHADER_AUTOIPSHARPER, "Sharper Auto Interpolation", gettext_noop("Same as \"autoip\", but when interpolation is done, it is done in a manner that will reduce blurriness if possible.") }, + { "scale2x", SHADER_SCALE2X, "Scale2x" }, + { "sabr", SHADER_SABR, "SABR v3.0", gettext_noop("GPU-intensive.") }, + { "ipsharper", SHADER_IPSHARPER, "Sharper bilinear interpolation." }, + { "ipxnoty", SHADER_IPXNOTY, "Linear interpolation on X axis only." }, + { "ipynotx", SHADER_IPYNOTX, "Linear interpolation on Y axis only." }, + { "ipxnotysharper", SHADER_IPXNOTYSHARPER, "Sharper version of \"ipxnoty\"." }, + { "ipynotxsharper", SHADER_IPYNOTXSHARPER, "Sharper version of \"ipynotx\"." }, + + { NULL, 0 }, +}; + +void Video_MakeSettings(std::vector &settings) +{ + static const char *CSD_xres = gettext_noop("Full-screen horizontal resolution."); + static const char *CSD_yres = gettext_noop("Full-screen vertical resolution."); + static const char *CSDE_xres = gettext_noop("A value of \"0\" will cause the desktop horizontal resolution to be used."); + static const char *CSDE_yres = gettext_noop("A value of \"0\" will cause the desktop vertical resolution to be used."); + + static const char *CSD_xscale = gettext_noop("Scaling factor for the X axis in windowed mode."); + static const char *CSD_yscale = gettext_noop("Scaling factor for the Y axis in windowed mode."); + + static const char *CSD_xscalefs = gettext_noop("Scaling factor for the X axis in fullscreen mode."); + static const char *CSD_yscalefs = gettext_noop("Scaling factor for the Y axis in fullscreen mode."); + static const char *CSDE_xyscalefs = gettext_noop("For this settings to have any effect, the \".stretch\" setting must be set to \"0\"."); + + static const char *CSD_scanlines = gettext_noop("Enable scanlines with specified opacity."); + static const char *CSDE_scanlines = gettext_noop("Opacity is specified in %; IE a value of \"100\" will give entirely black scanlines.\n\nNegative values are the same as positive values for non-interlaced video, but for interlaced video will cause the scanlines to be overlaid over the previous field's lines(only if the video.deinterlacer setting is set to \"weave\", the default)."); + + static const char *CSD_stretch = gettext_noop("Stretch to fill screen."); + static const char *CSD_videoip = gettext_noop("Enable (bi)linear interpolation."); + + static const char *CSD_special = gettext_noop("Enable specified special video scaler."); + static const char *CSDE_special = gettext_noop("The destination rectangle is NOT altered by this setting, so if you have xscale and yscale set to \"2\", and try to use a 3x scaling filter like hq3x, the image is not going to look that great. The nearest-neighbor scalers are intended for use with bilinear interpolation enabled, at high resolutions(such as 1280x1024; nn2x(or nny2x) + bilinear interpolation + fullscreen stretching at this resolution looks quite nice)."); + + static const char *CSD_pixshader = gettext_noop("Enable specified OpenGL pixel shader."); + static const char *CSDE_pixshader = gettext_noop("Obviously, this will only work with the OpenGL \"video.driver\" setting, and only on cards and OpenGL implementations that support pixel shaders, otherwise you will get a black screen, or Mednafen may display an error message when starting up. Bilinear interpolation is disabled with pixel shaders, and any interpolation, if present, will be noted in the description of each pixel shader."); + + for(unsigned int i = 0; i < MDFNSystems.size() + 1; i++) + { + int nominal_width; + int nominal_height; + bool multires; + const char *sysname; + char default_value[256]; + MDFNSetting setting; + const int default_xres = 0, default_yres = 0; + const double default_scalefs = 1.0; + double default_scale; + + if(i == MDFNSystems.size()) + { + nominal_width = 384; + nominal_height = 240; + multires = FALSE; + sysname = "player"; + } + else + { + nominal_width = MDFNSystems[i]->nominal_width; + nominal_height = MDFNSystems[i]->nominal_height; + multires = MDFNSystems[i]->multires; + sysname = (const char *)MDFNSystems[i]->shortname; + } + + if(multires) + default_scale = ceil(1024 / nominal_width); + else + default_scale = ceil(768 / nominal_width); + + if(default_scale * nominal_width > 1024) + default_scale--; + + if(!default_scale) + default_scale = 1; + + trio_snprintf(default_value, 256, "%d", default_xres); + BuildSystemSetting(&setting, sysname, "xres", CSD_xres, CSDE_xres, MDFNST_UINT, strdup(default_value), "0", "65536"); + settings.push_back(setting); + + trio_snprintf(default_value, 256, "%d", default_yres); + BuildSystemSetting(&setting, sysname, "yres", CSD_yres, CSDE_yres, MDFNST_UINT, strdup(default_value), "0", "65536"); + settings.push_back(setting); + + trio_snprintf(default_value, 256, "%f", default_scale); + BuildSystemSetting(&setting, sysname, "xscale", CSD_xscale, NULL, MDFNST_FLOAT, strdup(default_value), "0.01", "256"); + settings.push_back(setting); + BuildSystemSetting(&setting, sysname, "yscale", CSD_yscale, NULL, MDFNST_FLOAT, strdup(default_value), "0.01", "256"); + settings.push_back(setting); + + trio_snprintf(default_value, 256, "%f", default_scalefs); + BuildSystemSetting(&setting, sysname, "xscalefs", CSD_xscalefs, CSDE_xyscalefs, MDFNST_FLOAT, strdup(default_value), "0.01", "256"); + settings.push_back(setting); + BuildSystemSetting(&setting, sysname, "yscalefs", CSD_yscalefs, CSDE_xyscalefs, MDFNST_FLOAT, strdup(default_value), "0.01", "256"); + settings.push_back(setting); + + BuildSystemSetting(&setting, sysname, "scanlines", CSD_scanlines, CSDE_scanlines, MDFNST_INT, "0", "-100", "100"); + settings.push_back(setting); + + BuildSystemSetting(&setting, sysname, "stretch", CSD_stretch, NULL, MDFNST_ENUM, "aspect_mult2", NULL, NULL, NULL, NULL, StretchMode_List); + settings.push_back(setting); + + BuildSystemSetting(&setting, sysname, "videoip", CSD_videoip, NULL, MDFNST_ENUM, multires ? "1" : "0", NULL, NULL, NULL, NULL, VideoIP_List); + settings.push_back(setting); + + BuildSystemSetting(&setting, sysname, "special", CSD_special, CSDE_special, MDFNST_ENUM, "none", NULL, NULL, NULL, NULL, Special_List); + settings.push_back(setting); + + BuildSystemSetting(&setting, sysname, "pixshader", CSD_pixshader, CSDE_pixshader, MDFNST_ENUM, "none", NULL, NULL, NULL, NULL, Pixshader_List); + settings.push_back(setting); + } + + for(unsigned i = 0; i < sizeof(GlobalVideoSettings) / sizeof(GlobalVideoSettings[0]); i++) + settings.push_back(GlobalVideoSettings[i]); +} + + +typedef struct +{ + int xres; + int yres; + double xscale, xscalefs; + double yscale, yscalefs; + int videoip; + int stretch; + int special; + int scanlines; + ShaderType pixshader; +} CommonVS; + +static CommonVS _video; +static int _fullscreen; + +static bool osd_alpha_blend; +static unsigned int vdriver = VDRIVER_OPENGL; + +typedef struct +{ + const char *name; + int id; + int xscale; + int yscale; +} ScalerDefinition; + +static ScalerDefinition Scalers[] = +{ + {"hq2x", NTVB_HQ2X, 2, 2 }, + {"hq3x", NTVB_HQ3X, 3, 3 }, + {"hq4x", NTVB_HQ4X, 4, 4 }, + + {"scale2x", NTVB_SCALE2X, 2, 2 }, + {"scale3x", NTVB_SCALE3X, 3, 3 }, + {"scale4x", NTVB_SCALE4X, 4, 4 }, + + {"nn2x", NTVB_NN2X, 2, 2 }, + {"nn3x", NTVB_NN3X, 3, 3 }, + {"nn4x", NTVB_NN4X, 4, 4 }, + + {"nny2x", NTVB_NNY2X, 1, 2 }, + {"nny3x", NTVB_NNY3X, 1, 3 }, + {"nny4x", NTVB_NNY4X, 1, 4 }, + + {"2xsai", NTVB_2XSAI, 2, 2 }, + {"super2xsai", NTVB_SUPER2XSAI, 2, 2 }, + {"supereagle", NTVB_SUPEREAGLE, 2, 2 }, + + //{ "scanlines", NTVB_SCANLINES, 1, 2 }, + { 0 } +}; + +static MDFNGI *VideoGI; + +static bool sdlhaveogl = false; + +static int best_xres = 0, best_yres = 0; + +static int cur_xres, cur_yres, cur_flags; + +static ScalerDefinition *CurrentScaler = NULL; + +static SDL_Surface *screen = NULL; +static OpenGL_Blitter *ogl_blitter = NULL; +static SDL_Surface *IconSurface=NULL; + +static MDFN_Rect screen_dest_rect; + +static MDFN_Surface *NetSurface = NULL; +static MDFN_Rect NetRect; + +static MDFN_Surface *CheatSurface = NULL; + +static MDFN_Surface *HelpSurface = NULL; +static MDFN_Rect HelpRect; + +static MDFN_Surface *SMSurface = NULL; +static MDFN_Rect SMRect; +static MDFN_Rect SMDRect; + +static int curbpp; + +static double exs,eys; +static int evideoip; + +static int NeedClear = 0; +static uint32 LastBBClearTime = 0; + +static MDFN_PixelFormat pf_overlay, pf_normal; + +static void MarkNeedBBClear(void) +{ + NeedClear = 15; +} + +static void ClearBackBuffer(void) +{ + //printf("WOO: %u\n", MDFND_GetTime()); + if(ogl_blitter) + { + ogl_blitter->ClearBackBuffer(); + } + else + { + // Don't use SDL_FillRect() on hardware surfaces, it's borked(causes a long wait) with DirectX. + // ...on second thought, memset() is likely borked on PPC with hardware surface memory due to use of "dcbz" on uncachable memory. :( + // + // We'll do an icky #ifdef kludge instead for now. +#ifdef WIN32 + if(screen->flags & SDL_HWSURFACE) + { + if(SDL_MUSTLOCK(screen)) + SDL_LockSurface(screen); + memset(screen->pixels, 0, screen->pitch * screen->h); + if(SDL_MUSTLOCK(screen)) + SDL_UnlockSurface(screen); + } + else +#endif + { + SDL_FillRect(screen, NULL, 0); + } + } +} + +void Video_Kill(void) +{ + /* + if(IconSurface) + { + SDL_FreeSurface(IconSurface); + IconSurface = NULL; + } + */ + + if(SMSurface) + { + delete SMSurface; + SMSurface = NULL; + } + + if(CheatSurface) + { + delete CheatSurface; + CheatSurface = NULL; + } + + if(HelpSurface) + { + delete HelpSurface; + HelpSurface = NULL; + } + + if(NetSurface) + { + delete NetSurface; + NetSurface = NULL; + } + + if(ogl_blitter) + { + delete ogl_blitter; + ogl_blitter = NULL; + } + + if(vdriver == VDRIVER_OVERLAY) + OV_Kill(); + + screen = NULL; + VideoGI = NULL; + cur_xres = 0; + cur_yres = 0; + cur_flags = 0; +} + +static void GenerateDestRect(void) +{ + if(_video.stretch && _fullscreen) + { + int nom_width, nom_height; + + if(VideoGI->rotated) + { + nom_width = VideoGI->nominal_height; + nom_height = VideoGI->nominal_width; + } + else + { + nom_width = VideoGI->nominal_width; + nom_height = VideoGI->nominal_height; + } + + if (_video.stretch == 2 || _video.stretch == 3 || _video.stretch == 4) // Aspect-preserve stretch + { + exs = (double)cur_xres / nom_width; + eys = (double)cur_yres / nom_height; + + if(_video.stretch == 3 || _video.stretch == 4) // Round down to nearest int. + { + double floor_exs = floor(exs); + double floor_eys = floor(eys); + + if(!floor_exs || !floor_eys) + { + MDFN_printf(_("WARNING: Resolution is too low for stretch mode selected. Falling back to \"aspect\" mode.\n")); + } + else + { + exs = floor_exs; + eys = floor_eys; + + if(_video.stretch == 4) // Round down to nearest multiple of 2. + { + int even_exs = (int)exs & ~1; + int even_eys = (int)eys & ~1; + + if(!even_exs || !even_eys) + { + MDFN_printf(_("WARNING: Resolution is too low for stretch mode selected. Falling back to \"aspect_int\" mode.\n")); + } + else + { + exs = even_exs; + eys = even_eys; + } + } + } + } + + // Check if we are constrained horizontally or vertically + if (exs > eys) + { + // Too tall for screen, fill vertically + exs = eys; + } + else + { + // Too wide for screen, fill horizontally + eys = exs; + } + + //printf("%f %f\n", exs, eys); + + screen_dest_rect.w = (int)(exs*nom_width + 0.5); // +0.5 for rounding + screen_dest_rect.h = (int)(eys*nom_height + 0.5); // +0.5 for rounding + + // Centering: + int nx = (int)((cur_xres - screen_dest_rect.w) / 2); + if(nx < 0) nx = 0; + screen_dest_rect.x = nx; + + int ny = (int)((cur_yres - screen_dest_rect.h) / 2); + if(ny < 0) ny = 0; + screen_dest_rect.y = ny; + } + else // Full-stretch + { + screen_dest_rect.x = 0; + screen_dest_rect.w = cur_xres; + + screen_dest_rect.y = 0; + screen_dest_rect.h = cur_yres; + + exs = (double)cur_xres / nom_width; + eys = (double)cur_yres / nom_height; + } + } + else + { + if(VideoGI->rotated) + { + int32 ny = (int)((cur_yres - VideoGI->nominal_width * exs) / 2); + int32 nx = (int)((cur_xres - VideoGI->nominal_height * eys) / 2); + + //if(ny < 0) ny = 0; + //if(nx < 0) nx = 0; + + screen_dest_rect.x = _fullscreen ? nx : 0; + screen_dest_rect.y = _fullscreen ? ny : 0; + screen_dest_rect.w = (Uint16)(VideoGI->nominal_height * eys); + screen_dest_rect.h = (Uint16)(VideoGI->nominal_width * exs); + } + else + { + int nx = (int)((cur_xres - VideoGI->nominal_width * exs) / 2); + int ny = (int)((cur_yres - VideoGI->nominal_height * eys) / 2); + + // Don't check to see if the coordinates go off screen here, offscreen coordinates are valid(though weird that the user would want them...) + // in OpenGL mode, and are clipped to valid coordinates in SDL blit mode code. + //if(nx < 0) + // nx = 0; + //if(ny < 0) + // ny = 0; + + screen_dest_rect.x = _fullscreen ? nx : 0; + screen_dest_rect.y = _fullscreen ? ny : 0; + + //printf("%.64f %d, %f, %d\n", exs, VideoGI->nominal_width, exs * VideoGI->nominal_width, (int)(exs * VideoGI->nominal_width)); + // FIXME, stupid floating point + screen_dest_rect.w = (Uint16)(VideoGI->nominal_width * exs + 0.000000001); + screen_dest_rect.h = (Uint16)(VideoGI->nominal_height * eys + 0.000000001); + } + } + + + //screen_dest_rect.y = 0; + //screen_dest_rect.x = 0; + + // Quick and dirty kludge for VB's "hli" and "vli" 3D modes. + screen_dest_rect.x &= ~1; + screen_dest_rect.y &= ~1; + //printf("%d %d\n", screen_dest_rect.x & 1, screen_dest_rect.y & 1); +} + +// Argh, lots of thread safety and crashy problems with this, need to re-engineer code elsewhere. +#if 0 +int VideoResize(int nw, int nh) +{ + double xs, ys; + char buf[256]; + + if(VideoGI && !_fullscreen) + { + std::string sn = std::string(VideoGI->shortname); + + xs = (double)nw / VideoGI->nominal_width; + ys = (double)nh / VideoGI->nominal_height; + + trio_snprintf(buf, 256, "%.30f", xs); +// MDFNI_SetSetting(sn + "." + std::string("xscale"), buf); + + trio_snprintf(buf, 256, "%.30f", ys); +// MDFNI_SetSetting(sn + "." + std::string("yscale"), buf); + + printf("%s, %d %d, %f %f\n", std::string(sn + "." + std::string("xscale")).c_str(), nw, nh, xs, ys); + return(1); + } + + return(0); +} +#endif + +static int GetSpecialScalerID(const std::string &special_string) +{ + int ret = -1; + + if(special_string == "" || !strcasecmp(special_string.c_str(), "none") || special_string == "0") + ret = 0; + else + { + ScalerDefinition *scaler = Scalers; + + while(scaler->name) + { + char tmpstr[16]; + + sprintf(tmpstr, "%d", scaler->id); + + if(!strcasecmp(scaler->name, special_string.c_str()) || tmpstr == special_string) + { + ret = scaler->id; + break; + } + scaler++; + } + } + return(ret); +} + +static bool weset_glstvb = false; +static uint32 real_rs, real_gs, real_bs, real_as; + +void Video_Init(MDFNGI *gi) +{ + const SDL_VideoInfo *vinf; + int flags = 0; //SDL_RESIZABLE; + int desbpp; + + VideoGI = gi; + + MDFNI_printf(_("Initializing video...\n")); + MDFN_AutoIndent aindv(1); + + + #ifdef WIN32 + if(MDFN_GetSettingB("video.disable_composition")) + { + static bool dwm_already_try_disable = false; + + if(!dwm_already_try_disable) + { + HMODULE dwmdll; + + dwm_already_try_disable = true; + + if((dwmdll = LoadLibrary("Dwmapi.dll")) != NULL) + { + HRESULT WINAPI (*p_DwmEnableComposition)(UINT) = (HRESULT WINAPI (*)(UINT))GetProcAddress(dwmdll, "DwmEnableComposition"); + + if(p_DwmEnableComposition != NULL) + { + p_DwmEnableComposition(0); + } + } + } + } + #endif + + if(!IconSurface) + { + #ifdef WIN32 + #ifdef LSB_FIRST + IconSurface=SDL_CreateRGBSurfaceFrom((void *)mednafen_playicon.pixel_data,32,32,32,32*4,0xFF,0xFF00,0xFF0000,0xFF000000); + #else + IconSurface=SDL_CreateRGBSurfaceFrom((void *)mednafen_playicon.pixel_data,32,32,32,32*4,0xFF000000,0xFF0000,0xFF00,0xFF); + #endif + #else + #ifdef LSB_FIRST + IconSurface=SDL_CreateRGBSurfaceFrom((void *)mednafen_playicon128.pixel_data,128,128,32,128*4,0xFF,0xFF00,0xFF0000,0xFF000000); + #else + IconSurface=SDL_CreateRGBSurfaceFrom((void *)mednafen_playicon128.pixel_data,128,128,32,128*4,0xFF000000,0xFF0000,0xFF00,0xFF); + #endif + #endif + + SDL_WM_SetIcon(IconSurface, 0); + } + + if(!getenv("__GL_SYNC_TO_VBLANK") || weset_glstvb) + { + if(MDFN_GetSettingB("video.glvsync")) + { + #if HAVE_PUTENV + static char gl_pe_string[] = "__GL_SYNC_TO_VBLANK=1"; + putenv(gl_pe_string); + #elif HAVE_SETENV + setenv("__GL_SYNC_TO_VBLANK", "1", 1); + #endif + } + else + { + #if HAVE_PUTENV + static char gl_pe_string[] = "__GL_SYNC_TO_VBLANK=0"; + putenv(gl_pe_string); + #elif HAVE_SETENV + setenv("__GL_SYNC_TO_VBLANK", "0", 1); + #endif + } + weset_glstvb = true; + } + + osd_alpha_blend = MDFN_GetSettingB("osd.alpha_blend"); + + std::string snp = std::string(gi->shortname) + "."; + + if(gi->GameType == GMT_PLAYER) + snp = "player."; + + std::string special_string = MDFN_GetSettingS(snp + std::string("special")); + + _fullscreen = MDFN_GetSettingB("video.fs"); + _video.xres = MDFN_GetSettingUI(snp + "xres"); + _video.yres = MDFN_GetSettingUI(snp + "yres"); + _video.xscale = MDFN_GetSettingF(snp + "xscale"); + _video.yscale = MDFN_GetSettingF(snp + "yscale"); + _video.xscalefs = MDFN_GetSettingF(snp + "xscalefs"); + _video.yscalefs = MDFN_GetSettingF(snp + "yscalefs"); + _video.videoip = MDFN_GetSettingI(snp + "videoip"); + _video.stretch = MDFN_GetSettingUI(snp + "stretch"); + _video.scanlines = MDFN_GetSettingI(snp + "scanlines"); + + _video.special = GetSpecialScalerID(special_string); + + _video.pixshader = (ShaderType)MDFN_GetSettingI(snp + "pixshader"); + + CurrentScaler = _video.special ? &Scalers[_video.special - 1] : NULL; + + vinf=SDL_GetVideoInfo(); + + if(!best_xres) + { + best_xres = vinf->current_w; + best_yres = vinf->current_h; + + if(!best_xres || !best_yres) + { + best_xres = 640; + best_yres = 480; + } + } + + + if(vinf->hw_available) + flags |= SDL_HWSURFACE | SDL_DOUBLEBUF; + + if(_fullscreen) + flags |= SDL_FULLSCREEN; + + vdriver = MDFN_GetSettingI("video.driver"); + + if(vdriver == VDRIVER_OPENGL) + { + if(!sdlhaveogl) + { + // SDL_GL_LoadLibrary returns 0 on success, -1 on failure + if(SDL_GL_LoadLibrary(NULL) == 0) + sdlhaveogl = true; + else + sdlhaveogl = false; + } + + if(!sdlhaveogl) + { + MDFN_PrintError(_("Could not load OpenGL library, disabling OpenGL usage!")); + vdriver = VDRIVER_SOFTSDL; + } + } + + if(vdriver == VDRIVER_OPENGL) + { + flags |= SDL_OPENGL; + + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1 ); + + #if SDL_VERSION_ATLEAST(1, 2, 10) + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, MDFN_GetSettingB("video.glvsync")); + #endif + } + else if(vdriver == VDRIVER_SOFTSDL) + { + + } + else if(vdriver == VDRIVER_OVERLAY) + { + + } + + exs = _fullscreen ? _video.xscalefs : _video.xscale; + eys = _fullscreen ? _video.yscalefs : _video.yscale; + evideoip = _video.videoip; + + desbpp = 32; + + if(!_video.stretch || !_fullscreen) + { + if(exs > 50) + { + MDFND_PrintError(_("Eep! Effective X scale setting is way too high. Correcting.")); + exs = 50; + } + + if(eys > 50) + { + MDFND_PrintError(_("Eep! Effective Y scale setting is way too high. Correcting.")); + eys = 50; + } + } + + if(_fullscreen) + { + if(!screen || cur_xres != _video.xres || cur_yres != _video.yres || cur_flags != flags || curbpp != desbpp) + { + if(!(screen = SDL_SetVideoMode(_video.xres ? _video.xres : best_xres, _video.yres ? _video.yres : best_yres, desbpp, flags))) + { + throw MDFN_Error(0, "%s", SDL_GetError()); + } + } + } + else + { + GenerateDestRect(); + if(!screen || cur_xres != screen_dest_rect.w || cur_yres != screen_dest_rect.h || cur_flags != flags || curbpp != desbpp) + { + if(!(screen = SDL_SetVideoMode(screen_dest_rect.w, screen_dest_rect.h, desbpp, flags))) + { + throw MDFN_Error(0, "%s", SDL_GetError()); + } + } + } + + cur_xres = screen->w; + cur_yres = screen->h; + cur_flags = flags; + curbpp = screen->format->BitsPerPixel; + + // Kludgey, we need to clean this up(vdriver vs cur_flags and whatnot). + if(vdriver != VDRIVER_OVERLAY) + vdriver = (cur_flags & SDL_OPENGL) ? VDRIVER_OPENGL : VDRIVER_SOFTSDL; + + GenerateDestRect(); + + MDFN_printf(_("Video Driver: %s\n"), (cur_flags & SDL_OPENGL) ? _("OpenGL") : (vdriver == VDRIVER_OVERLAY ? _("Overlay") :_("Software SDL") ) ); + + MDFN_printf(_("Video Mode: %d x %d x %d bpp\n"),screen->w,screen->h,screen->format->BitsPerPixel); + if(curbpp != 16 && curbpp != 24 && curbpp != 32) + { + unsigned cbpp_copy = curbpp; + + Video_Kill(); + + throw MDFN_Error(0, _("Sorry, %dbpp modes are not supported by Mednafen. Supported bit depths are 16bpp, 24bpp, and 32bpp.\n"), cbpp_copy); + } + + //MDFN_printf(_("OpenGL: %s\n"), (cur_flags & SDL_OPENGL) ? _("Yes") : _("No")); + + if(cur_flags & SDL_OPENGL) + { + MDFN_AutoIndent aindps; + MDFN_printf(_("Pixel shader: %s\n"), MDFN_GetSettingS(snp + "pixshader").c_str()); + } + + MDFN_printf(_("Fullscreen: %s\n"), _fullscreen ? _("Yes") : _("No")); + MDFN_printf(_("Special Scaler: %s\n"), _video.special ? Scalers[_video.special - 1].name : _("None")); + + if(!_video.scanlines) + MDFN_printf(_("Scanlines: Off\n")); + else + MDFN_printf(_("Scanlines: %d%% opacity%s\n"), abs(_video.scanlines), (_video.scanlines < 0) ? _(" (with interlace field obscure)") : ""); + + MDFN_printf(_("Destination Rectangle: X=%d, Y=%d, W=%d, H=%d\n"), screen_dest_rect.x, screen_dest_rect.y, screen_dest_rect.w, screen_dest_rect.h); + if(screen_dest_rect.x < 0 || screen_dest_rect.y < 0 || (screen_dest_rect.x + screen_dest_rect.w) > screen->w || (screen_dest_rect.y + screen_dest_rect.h) > screen->h) + { + MDFN_AutoIndent ainddr; + MDFN_printf(_("Warning: Destination rectangle exceeds screen dimensions. This is ok if you really do want the clipping...\n")); + } + if(gi && gi->name) + SDL_WM_SetCaption(gi->name, gi->name); + else + SDL_WM_SetCaption("Mednafen", "Mednafen"); + + int rs, gs, bs, as; + + if(cur_flags & SDL_OPENGL) + { + try + { + ogl_blitter = new OpenGL_Blitter(_video.scanlines, _video.pixshader, screen->w, screen->h, &rs, &gs, &bs, &as); + } + catch(std::exception &e) + { + Video_Kill(); + throw; + } + } + else + { + rs = screen->format->Rshift; + gs = screen->format->Gshift; + bs = screen->format->Bshift; + + as = 0; + while(as == rs || as == gs || as == bs) // Find unused 8-bits to use as our alpha channel + as += 8; + } + + //printf("%d %d %d %d\n", rs, gs, bs, as); + + SDL_ShowCursor(0); + + real_rs = rs; + real_gs = gs; + real_bs = bs; + real_as = as; + + /* HQXX only supports this pixel format, sadly, and other pixel formats + can't be easily supported without rewriting the filters. + We do conversion to the real screen format in the blitting function. + */ + if(CurrentScaler) { +#ifdef WANT_FANCY_SCALERS + if(CurrentScaler->id == NTVB_HQ2X || CurrentScaler->id == NTVB_HQ3X || CurrentScaler->id == NTVB_HQ4X) + { + rs = 16; + gs = 8; + bs = 0; + as = 24; + } + else if(CurrentScaler->id == NTVB_2XSAI || CurrentScaler->id == NTVB_SUPER2XSAI || CurrentScaler->id == NTVB_SUPEREAGLE) + { + Init_2xSaI(screen->format->BitsPerPixel, 555); // systemColorDepth, BitFormat + } +#endif + } + + NetSurface = new MDFN_Surface(NULL, screen->w, 18 * 5, screen->w, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, real_rs, real_gs, real_bs, real_as)); + + NetRect.w = screen->w; + NetRect.h = 18 * 5; + NetRect.x = 0; + NetRect.y = 0; + + + { + int xmu = std::max(1, screen->w / 402); + int ymu = std::max(1, screen->h / 288); + + SMRect.h = 18 + 2; + SMRect.x = 0; + SMRect.y = 0; + SMRect.w = screen->w; + + SMDRect.w = SMRect.w * xmu; + SMDRect.h = SMRect.h * ymu; + SMDRect.x = (screen->w - SMDRect.w) / 2; + SMDRect.y = screen->h - SMDRect.h; + + if(SMDRect.x < 0) + { + SMRect.w += SMDRect.x * 2 / xmu; + SMDRect.w = SMRect.w * xmu; + SMDRect.x = 0; + } + SMSurface = new MDFN_Surface(NULL, SMRect.w, SMRect.h, SMRect.w, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, real_rs, real_gs, real_bs, real_as)); + } + + //MDFNI_SetPixelFormat(rs, gs, bs, as); + memset(&pf_normal, 0, sizeof(pf_normal)); + memset(&pf_overlay, 0, sizeof(pf_overlay)); + + pf_normal.bpp = 32; + pf_normal.colorspace = MDFN_COLORSPACE_RGB; + pf_normal.Rshift = rs; + pf_normal.Gshift = gs; + pf_normal.Bshift = bs; + pf_normal.Ashift = as; + + if(vdriver == VDRIVER_OVERLAY) + { + pf_overlay.bpp = 32; + pf_overlay.colorspace = MDFN_COLORSPACE_YCbCr; + pf_overlay.Yshift = 0; + pf_overlay.Ushift = 8; + pf_overlay.Vshift = 16; + pf_overlay.Ashift = 24; + } + + //SetPixelFormatHax((vdriver == VDRIVER_OVERLAY) ? pf_overlay : pf_normal); //rs, gs, bs, as); + + for(int i = 0; i < 2; i++) + { + ClearBackBuffer(); + + if(cur_flags & SDL_OPENGL) + { + SDL_GL_SwapBuffers(); + //ogl_blitter->HardSync(); + } + else + SDL_Flip(screen); + } + + MarkNeedBBClear(); +} + +static uint32 howlong = 0; +static char *CurrentMessage = NULL; + +void VideoShowMessage(char *text) +{ + if(text) + howlong = MDFND_GetTime() + MDFN_GetSettingUI("osd.message_display_time"); + else + howlong = 0; + + if(CurrentMessage) + { + free(CurrentMessage); + CurrentMessage = NULL; + } + + CurrentMessage = text; +} + +void BlitRaw(MDFN_Surface *src, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, int source_alpha) +{ + if(ogl_blitter) + ogl_blitter->BlitRaw(src, src_rect, dest_rect, (source_alpha != 0) && osd_alpha_blend); + else + { + SDL_to_MDFN_Surface_Wrapper m_surface(screen); + + //MDFN_SrcAlphaBlitSurface(src, src_rect, &m_surface, dest_rect); + MDFN_StretchBlitSurface(src, src_rect, &m_surface, dest_rect, (source_alpha > 0) && osd_alpha_blend); + } + + bool cond1 = (dest_rect->x < screen_dest_rect.x || (dest_rect->x + dest_rect->w) > (screen_dest_rect.x + screen_dest_rect.w)); + bool cond2 = (dest_rect->y < screen_dest_rect.y || (dest_rect->y + dest_rect->h) > (screen_dest_rect.y + screen_dest_rect.h)); + + if(cond1 || cond2) + MarkNeedBBClear(); +} + +static bool IsInternalMessageActive(void) +{ + return(MDFND_GetTime() < howlong); +} + +static bool BlitInternalMessage(void) +{ + if(MDFND_GetTime() >= howlong) + { + if(CurrentMessage) + { + free(CurrentMessage); + CurrentMessage = NULL; + } + return(0); + } + + if(CurrentMessage) + { + SMSurface->Fill(0x00, 0x00, 0x00, 0xC0); + + DrawTextTransShadow(SMSurface->pixels + (1 * SMSurface->pitch32), SMSurface->pitch32 << 2, SMRect.w, CurrentMessage, + SMSurface->MakeColor(0xFF, 0xFF, 0xFF, 0xFF), SMSurface->MakeColor(0x00, 0x00, 0x00, 0xFF), TRUE); + free(CurrentMessage); + CurrentMessage = NULL; + } + + BlitRaw(SMSurface, &SMRect, &SMDRect); + return(1); +} + +static bool OverlayOK; // Set to TRUE when vdriver == "overlay", and it's safe to use an overlay format + // "Safe" is equal to OSD being off, and not using a special scaler that + // requires an RGB pixel format(HQnx) + // Otherwise, set to FALSE. + // (Set in the BlitScreen function before any calls to SubBlit()) + +static void SubBlit(MDFN_Surface *source_surface, const MDFN_Rect &src_rect, const MDFN_Rect &dest_rect, const int InterlaceField) +{ + MDFN_Surface *eff_source_surface = source_surface; + MDFN_Rect eff_src_rect = src_rect; + int overlay_softscale = 0; + + if(!(src_rect.w > 0 && src_rect.w <= 32767) || !(src_rect.h > 0 && src_rect.h <= 32767)) + { + //fprintf(stderr, "BUG: Source rect out of range; w=%d, h=%d\n", src_rect.w, src_rect.h); + return; + } +//#if 0 +// assert(src_rect.w > 0 && src_rect.w <= 32767); +// assert(src_rect.h > 0 && src_rect.h <= 32767); +//#endif + + assert(dest_rect.w > 0); + assert(dest_rect.h > 0); + + if(OverlayOK && CurrentScaler && !CurGame->rotated) + { + if(CurrentScaler->id == NTVB_NN2X || CurrentScaler->id == NTVB_NN3X || CurrentScaler->id == NTVB_NN4X) + overlay_softscale = CurrentScaler->id - NTVB_NN2X + 2; + } + + if(CurrentScaler && !overlay_softscale) + { + MDFN_Rect boohoo_rect({0, 0, eff_src_rect.w * CurrentScaler->xscale, eff_src_rect.h * CurrentScaler->yscale}); + MDFN_Surface bah_surface(NULL, boohoo_rect.w, boohoo_rect.h, boohoo_rect.w, eff_source_surface->format, false); + uint8* screen_pixies = (uint8 *)bah_surface.pixels; + uint32 screen_pitch = bah_surface.pitch32 << 2; + + if(CurrentScaler->id == NTVB_SCALE4X || CurrentScaler->id == NTVB_SCALE3X || CurrentScaler->id == NTVB_SCALE2X) + { +#ifdef WANT_FANCY_SCALERS + // + // scale2x and scale3x apparently can't handle source heights less than 2. + // scale4x, it's less than 4 + // + // None can handle source widths less than 2. + // + if(eff_src_rect.w < 2 || eff_src_rect.h < 2 || (CurrentScaler->id == NTVB_SCALE4X && eff_src_rect.h < 4)) + { + nnx(CurrentScaler->id - NTVB_SCALE2X + 2, eff_source_surface, &eff_src_rect, &bah_surface, &boohoo_rect); + } + else + { + uint8 *source_pixies = (uint8 *)eff_source_surface->pixels + eff_src_rect.x * sizeof(uint32) + eff_src_rect.y * eff_source_surface->pitchinpix * sizeof(uint32); + scale((CurrentScaler->id == NTVB_SCALE2X)?2:(CurrentScaler->id == NTVB_SCALE4X)?4:3, screen_pixies, screen_pitch, source_pixies, eff_source_surface->pitchinpix * sizeof(uint32), sizeof(uint32), eff_src_rect.w, eff_src_rect.h); + } +#endif + } + else if(CurrentScaler->id == NTVB_NN2X || CurrentScaler->id == NTVB_NN3X || CurrentScaler->id == NTVB_NN4X) + { + nnx(CurrentScaler->id - NTVB_NN2X + 2, eff_source_surface, &eff_src_rect, &bah_surface, &boohoo_rect); + } + else if(CurrentScaler->id == NTVB_NNY2X || CurrentScaler->id == NTVB_NNY3X || CurrentScaler->id == NTVB_NNY4X) + { + nnyx(CurrentScaler->id - NTVB_NNY2X + 2, eff_source_surface, &eff_src_rect, &bah_surface, &boohoo_rect); + } +#if 0 + else if(CurrentScaler->id == NTVB_SCANLINES) + { + for(int y = 0; y < eff_src_rect.h; y++) + { + memcpy(&bah_surface->pixels[(boohoo_rect.y + y * 2) * bah_surface->pitchinpix + boohoo_rect.x], + &eff_source_surface->pixels[(eff_src_rect.y + y) * eff_source_surface->pitchinpix + eff_src_rect.x], + sizeof(uint32) * eff_src_rect.w); + uint32 *line_a = &eff_source_surface->pixels[(eff_src_rect.y + y) * eff_source_surface->pitchinpix + eff_src_rect.x]; + uint32 *line_b = (y == (eff_src_rect.h - 1)) ? line_a : (line_a + eff_source_surface->pitchinpix); + uint32 *tline = &bah_surface->pixels[(boohoo_rect.y + y * 2 + 1) * bah_surface->pitchinpix + boohoo_rect.x]; + + for(int x = 0; x < eff_src_rect.w; x++) + { + uint32 a = line_a[x]; + uint32 b = line_b[x]; + + tline[x] = (((((uint64)a + b) - ((a ^ b) & 0x01010101))) >> 3) & 0x3F3F3F3F; + } + } + } +#endif +#ifdef WANT_FANCY_SCALERS + else + { + uint8 *source_pixies = (uint8 *)(eff_source_surface->pixels + eff_src_rect.x + eff_src_rect.y * eff_source_surface->pitchinpix); + + if(CurrentScaler->id == NTVB_HQ2X) + hq2x_32(source_pixies, screen_pixies, eff_src_rect.w, eff_src_rect.h, eff_source_surface->pitchinpix * sizeof(uint32), screen_pitch); + else if(CurrentScaler->id == NTVB_HQ3X) + hq3x_32(source_pixies, screen_pixies, eff_src_rect.w, eff_src_rect.h, eff_source_surface->pitchinpix * sizeof(uint32), screen_pitch); + else if(CurrentScaler->id == NTVB_HQ4X) + hq4x_32(source_pixies, screen_pixies, eff_src_rect.w, eff_src_rect.h, eff_source_surface->pitchinpix * sizeof(uint32), screen_pitch); + else if(CurrentScaler->id == NTVB_2XSAI || CurrentScaler->id == NTVB_SUPER2XSAI || CurrentScaler->id == NTVB_SUPEREAGLE) + { + MDFN_Surface saisrc(NULL, eff_src_rect.w + 4, eff_src_rect.h + 4, eff_src_rect.w + 4, eff_source_surface->format); + + for(int y = 0; y < 2; y++) + { + memcpy(saisrc.pixels + (y * saisrc.pitchinpix) + 2, (uint32 *)source_pixies, eff_src_rect.w * sizeof(uint32)); + memcpy(saisrc.pixels + ((2 + y + eff_src_rect.h) * saisrc.pitchinpix) + 2, (uint32 *)source_pixies + (eff_src_rect.h - 1) * eff_source_surface->pitchinpix, eff_src_rect.w * sizeof(uint32)); + } + + for(int y = 0; y < eff_src_rect.h; y++) + { + memcpy(saisrc.pixels + ((2 + y) * saisrc.pitchinpix) + 2, (uint32*)source_pixies + y * eff_source_surface->pitchinpix, eff_src_rect.w * sizeof(uint32)); + memcpy(saisrc.pixels + ((2 + y) * saisrc.pitchinpix) + (2 + eff_src_rect.w), + saisrc.pixels + ((2 + y) * saisrc.pitchinpix) + (2 + eff_src_rect.w - 1), sizeof(uint32)); + } + + { + uint8 *saipix = (uint8 *)(saisrc.pixels + 2 * saisrc.pitchinpix + 2); + uint32 saipitch = saisrc.pitchinpix << 2; + + if(CurrentScaler->id == NTVB_2XSAI) + _2xSaI32(saipix, saipitch, screen_pixies, screen_pitch, eff_src_rect.w, eff_src_rect.h); + else if(CurrentScaler->id == NTVB_SUPER2XSAI) + Super2xSaI32(saipix, saipitch, screen_pixies, screen_pitch, eff_src_rect.w, eff_src_rect.h); + else if(CurrentScaler->id == NTVB_SUPEREAGLE) + SuperEagle32(saipix, saipitch, screen_pixies, screen_pitch, eff_src_rect.w, eff_src_rect.h); + } + } + + if(bah_surface.format.Rshift != real_rs || bah_surface.format.Gshift != real_gs || bah_surface.format.Bshift != real_bs) + { + uint32 *lineptr = bah_surface.pixels; + + unsigned int srs = bah_surface.format.Rshift; + unsigned int sgs = bah_surface.format.Gshift; + unsigned int sbs = bah_surface.format.Bshift; + unsigned int drs = real_rs; + unsigned int dgs = real_gs; + unsigned int dbs = real_bs; + + for(int y = 0; y < boohoo_rect.h; y++) + { + for(int x = 0; x < boohoo_rect.w; x++) + { + uint32 pixel = lineptr[x]; + lineptr[x] = (((pixel >> srs) & 0xFF) << drs) | (((pixel >> sgs) & 0xFF) << dgs) | (((pixel >> sbs) & 0xFF) << dbs); + } + lineptr += bah_surface.pitchinpix; + } + } + } +#endif + + if(ogl_blitter) + ogl_blitter->Blit(&bah_surface, &boohoo_rect, &dest_rect, &eff_src_rect, InterlaceField, evideoip, CurGame->rotated); + else + { + if(OverlayOK) + { + SDL_Rect tr; + + tr.x = dest_rect.x; + tr.y = dest_rect.y; + tr.w = dest_rect.w; + tr.h = dest_rect.h; + + OV_Blit(&bah_surface, &boohoo_rect, &eff_src_rect, &tr, screen, 0, _video.scanlines, CurGame->rotated); + } + else + { + SDL_to_MDFN_Surface_Wrapper m_surface(screen); + + MDFN_StretchBlitSurface(&bah_surface, &boohoo_rect, &m_surface, &dest_rect, false, _video.scanlines, &eff_src_rect, CurGame->rotated, InterlaceField); + } + } + } + else // No special scaler: + { + if(ogl_blitter) + ogl_blitter->Blit(eff_source_surface, &eff_src_rect, &dest_rect, &eff_src_rect, InterlaceField, evideoip, CurGame->rotated); + else + { + if(OverlayOK) + { + SDL_Rect tr; + + tr.x = dest_rect.x; + tr.y = dest_rect.y; + tr.w = dest_rect.w; + tr.h = dest_rect.h; + + OV_Blit(eff_source_surface, &eff_src_rect, &eff_src_rect, &tr, screen, overlay_softscale, _video.scanlines, CurGame->rotated); + } + else + { + SDL_to_MDFN_Surface_Wrapper m_surface(screen); + + MDFN_StretchBlitSurface(eff_source_surface, &eff_src_rect, &m_surface, &dest_rect, false, _video.scanlines, &eff_src_rect, CurGame->rotated, InterlaceField); + } + } + } +} + +void BlitScreen(MDFN_Surface *msurface, const MDFN_Rect *DisplayRect, const int32 *LineWidths, const int InterlaceField, const bool take_ssnapshot) +{ + MDFN_Rect src_rect; + const MDFN_PixelFormat *pf_needed = &pf_normal; + + if(!screen) return; + + // + // Reduce CPU usage when minimized, and prevent OpenGL memory quasi-leaks on Windows(though I have the feeling there's a + // cleaner less-racey way to prevent that memory leak problem). + // + if(!(SDL_GetAppState() & SDL_APPACTIVE)) + return; + + if(NeedClear) + { + uint32 ct = MDFND_GetTime(); + + if((ct - LastBBClearTime) >= 30) + { + LastBBClearTime = ct; + NeedClear--; + } + + ClearBackBuffer(); + } + + OverlayOK = false; + if(vdriver == VDRIVER_OVERLAY) + { + bool osd_active = Help_IsActive() || SaveStatesActive() || CheatIF_Active() || Netplay_GetTextView() || + IsInternalMessageActive() || Debugger_IsActive(); + + OverlayOK = (vdriver == VDRIVER_OVERLAY) && !take_ssnapshot && !osd_active && (!CurrentScaler || (CurrentScaler->id != NTVB_HQ2X && CurrentScaler->id != NTVB_HQ3X && + CurrentScaler->id != NTVB_HQ4X)); + + if(OverlayOK && LineWidths[0] != ~0) + { + const int32 first_width = LineWidths[DisplayRect->y]; + + for(int suby = DisplayRect->y; suby < DisplayRect->y + DisplayRect->h; suby++) + { + if(LineWidths[suby] != first_width) + { + //puts("Skippidy"); + OverlayOK = FALSE; + break; + } + } + } + + if(OverlayOK) + pf_needed = &pf_overlay; + } // end if(vdriver == VDRIVER_OVERLAY) + + msurface->SetFormat(*pf_needed, TRUE); + + src_rect.x = DisplayRect->x; + src_rect.w = DisplayRect->w; + src_rect.y = DisplayRect->y; + src_rect.h = DisplayRect->h; + + // This drawing to the game's video surface can cause visual glitches, but better than killing performance which kind of + // defeats the purpose of the FPS display. + if(OverlayOK) + { + int fps_w, fps_h; + + if(FPS_IsActive(&fps_w, &fps_h)) + { + int fps_xpos = DisplayRect->x; + int fps_ypos = DisplayRect->y; + int x_bound = DisplayRect->x + DisplayRect->w; + int y_bound = DisplayRect->y + DisplayRect->h; + + if(LineWidths[0] != ~0) + { + x_bound = DisplayRect->x + LineWidths[DisplayRect->y]; + } + + if((fps_xpos + fps_w) > x_bound || (fps_ypos + fps_h) > y_bound) + { + puts("FPS draw error"); + } + else + { + FPS_Draw(msurface, fps_xpos, DisplayRect->y); + } + + } + } + + if(LineWidths[0] == ~0) // Skip multi line widths code? + { + SubBlit(msurface, src_rect, screen_dest_rect, InterlaceField); + } + else + { + int y; + int last_y = src_rect.y; + int last_width = LineWidths[src_rect.y]; + + MDFN_Rect sub_src_rect; + MDFN_Rect sub_dest_rect; + + for(y = src_rect.y; y < (src_rect.y + src_rect.h + 1); y++) + { + if(y == (src_rect.y + src_rect.h) || LineWidths[y] != last_width) + { + sub_src_rect.x = src_rect.x; + sub_src_rect.w = last_width; + sub_src_rect.y = last_y; + sub_src_rect.h = y - last_y; + + if(CurGame->rotated == MDFN_ROTATE90) + { + sub_dest_rect.x = screen_dest_rect.x + (last_y - src_rect.y) * screen_dest_rect.w / src_rect.h; + sub_dest_rect.y = screen_dest_rect.y; + + sub_dest_rect.w = sub_src_rect.h * screen_dest_rect.w / src_rect.h; + sub_dest_rect.h = screen_dest_rect.h; + //printf("sdr.x=%f, sdr.w=%f\n", (double)screen_dest_rect.x + (double)(last_y - src_rect.y) * screen_dest_rect.w / src_rect.h, (double)sub_src_rect.h * screen_dest_rect.w / src_rect.h); + } + else if(CurGame->rotated == MDFN_ROTATE270) + { + sub_dest_rect.x = screen_dest_rect.x + (src_rect.h - (y - src_rect.y)) * screen_dest_rect.w / src_rect.h; + sub_dest_rect.y = screen_dest_rect.y; + + sub_dest_rect.w = sub_src_rect.h * screen_dest_rect.w / src_rect.h; + sub_dest_rect.h = screen_dest_rect.h; + } + else + { + sub_dest_rect.x = screen_dest_rect.x; + sub_dest_rect.w = screen_dest_rect.w; + sub_dest_rect.y = screen_dest_rect.y + (last_y - src_rect.y) * screen_dest_rect.h / src_rect.h; + sub_dest_rect.h = sub_src_rect.h * screen_dest_rect.h / src_rect.h; + } + + if(!sub_dest_rect.h) // May occur with small yscale values in certain cases, so prevent triggering an assert() + sub_dest_rect.h = 1; + + // Blit here! + SubBlit(msurface, sub_src_rect, sub_dest_rect, InterlaceField); + + last_y = y; + + if(y != (src_rect.y + src_rect.h)) + { + last_width = LineWidths[y]; + } + + } + } + } + + if(take_ssnapshot) + { + try + { + MDFN_Surface *ib = NULL; + MDFN_Rect sr; + MDFN_Rect tr; + + sr = screen_dest_rect; + if(sr.x < 0) { sr.w += sr.x; sr.x = 0; } + if(sr.y < 0) { sr.h += sr.y; sr.y = 0; } + if(sr.w < 0) sr.w = 0; + if(sr.h < 0) sr.h = 0; + if(sr.w > screen->w) sr.w = screen->w; + if(sr.h > screen->h) sr.h = screen->h; + + ib = new MDFN_Surface(NULL, sr.w, sr.h, sr.w, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, real_rs, real_gs, real_bs, real_as)); + + if(ogl_blitter) + ogl_blitter->ReadPixels(ib, &sr); + else + { + if(SDL_MUSTLOCK(screen)) + SDL_LockSurface(screen); + + for(int y = 0; y < sr.h; y++) + { + for(int x = 0; x < sr.w; x++) + { + ib->pixels[y * ib->pitchinpix + x] = ((uint32*)((uint8*)screen->pixels + (sr.y + y) * screen->pitch))[sr.x + x]; + } + } + + if(SDL_MUSTLOCK(screen)) + SDL_UnlockSurface(screen); + } + + + tr.x = tr.y = 0; + tr.w = ib->w; + tr.h = ib->h; + MDFNI_SaveSnapshot(ib, &tr, NULL); + } + catch(std::exception &e) + { + MDFN_DispMessage("%s", e.what()); + } + } + + + Debugger_MT_DrawToScreen(MDFN_PixelFormat(MDFN_COLORSPACE_RGB, real_rs, real_gs, real_bs, real_as), screen->w, screen->h); + +#if 0 + if(CKGUI_IsActive()) + { + if(!CKGUISurface) + { + CKGUIRect.w = screen->w; + CKGUIRect.h = screen->h; + + CKGUISurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, CKGUIRect.w, CKGUIRect.h, 32, 0xFF << real_rs, 0xFF << real_gs, 0xFF << real_bs, 0xFF << real_as); + SDL_SetColorKey(CKGUISurface, SDL_SRCCOLORKEY, 0); + SDL_SetAlpha(CKGUISurface, SDL_SRCALPHA, 0); + } + MDFN_Rect zederect = CKGUIRect; + CKGUI_Draw(CKGUISurface, &CKGUIRect); + BlitRaw(CKGUISurface, &CKGUIRect, &zederect); + } + else if(CKGUISurface) + { + SDL_FreeSurface(CKGUISurface); + CKGUISurface = NULL; + } +#endif + + if(Help_IsActive()) + { + if(!HelpSurface) + { + HelpRect.w = std::min(512, screen->w); + HelpRect.h = std::min(408, screen->h); + + HelpSurface = new MDFN_Surface(NULL, 512, 408, 512, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, real_rs, real_gs, real_bs, real_as)); + Help_Draw(HelpSurface, &HelpRect); + } + + MDFN_Rect zederect; + int32 sfx = screen->w / HelpRect.w; + int32 sfy = screen->h / HelpRect.h; + + if(sfy > sfx) + sfy = sfx + 1; + + if(sfx > sfy) + sfx = sfy + 1; + + zederect.w = HelpRect.w * sfx; + zederect.h = HelpRect.h * sfy; + + zederect.x = (screen->w - zederect.w) / 2; + zederect.y = (screen->h - zederect.h) / 2; + + BlitRaw(HelpSurface, &HelpRect, &zederect, 0); + } + else if(HelpSurface) + { + delete HelpSurface; + HelpSurface = NULL; + } + + DrawSaveStates(screen, exs, eys, real_rs, real_gs, real_bs, real_as); + + if(CheatIF_Active()) + { + MDFN_Rect CheatRect; + unsigned crs = 0; + + memset(&CheatRect, 0, sizeof(CheatRect)); + + CheatRect.x = 0; + CheatRect.y = 0; + CheatRect.w = screen->w; + CheatRect.h = screen->h; + + while((CheatRect.h >> crs) >= 1024 && (CheatRect.w >> crs) >= 1024) + crs++; + + CheatRect.w >>= crs; + CheatRect.h >>= crs; + + if(!CheatSurface || CheatSurface->w < CheatRect.w || CheatSurface->h < CheatRect.h) + { + if(CheatSurface) + { + delete CheatSurface; + CheatSurface = NULL; + } + + CheatSurface = new MDFN_Surface(NULL, CheatRect.w, CheatRect.h, CheatRect.w, MDFN_PixelFormat(MDFN_COLORSPACE_RGB, real_rs, real_gs, real_bs, real_as)); + } + + MDFN_Rect zederect; + + zederect.x = 0; + zederect.y = 0; + zederect.w = CheatRect.w << crs; + zederect.h = CheatRect.h << crs; + + CheatIF_MT_Draw(CheatSurface, &CheatRect); + BlitRaw(CheatSurface, &CheatRect, &zederect); + } + else if(CheatSurface) + { + delete CheatSurface; + CheatSurface = NULL; + } + + if(Netplay_GetTextView()) + { + DrawNetplayTextBuffer(NetSurface, &NetRect); + + { + MDFN_Rect zederect; + + zederect.x = 0; + zederect.y = screen->h - NetRect.h; + zederect.w = NetRect.w; + zederect.h = NetRect.h; + + BlitRaw(NetSurface, &NetRect, &zederect); + } + } + + BlitInternalMessage(); + + if(!OverlayOK) + { + unsigned fps_offsx = 0, fps_offsy = 0; + + // When using soft-SDL, position the FPS display so we won't incur a potentially large(on older/slower hardware) penalty due + // to a requisite backbuffer clear(we could avoid this with some sort of dirty-rects system so only parts of the backbuffer are cleared, + // but that gets awfully complicated and prone to bugs when dealing with double/triple-buffered video...). + // + // std::max so we don't position it offscreen if the user has selected xscalefs or yscalefs values that are too large. + if(!(cur_flags & SDL_OPENGL)) + { + fps_offsx = std::max(screen_dest_rect.x, 0); + fps_offsy = std::max(screen_dest_rect.y, 0); + } + FPS_DrawToScreen(screen, real_rs, real_gs, real_bs, real_as, fps_offsx, fps_offsy); + } + + if(!(cur_flags & SDL_OPENGL)) + { + if(!OverlayOK) + SDL_Flip(screen); + } + else + { + PumpWrap(); + SDL_GL_SwapBuffers(); + //ogl_blitter->HardSync(); + } +} + +void Video_PtoV(const int in_x, const int in_y, int32 *out_x, int32 *out_y) +{ + assert(VideoGI); + if(VideoGI->rotated) + { + double tmp_x, tmp_y; + + // Swap X and Y + tmp_x = ((double)(in_y - screen_dest_rect.y) / eys); + tmp_y = ((double)(in_x - screen_dest_rect.x) / exs); + + // Correct position(and movement) + if(VideoGI->rotated == MDFN_ROTATE90) + tmp_x = VideoGI->nominal_width - 1 - tmp_x; + else if(VideoGI->rotated == MDFN_ROTATE270) + tmp_y = VideoGI->nominal_height - 1 - tmp_y; + + *out_x = (int32)round(65536 * tmp_x); + *out_y = (int32)round(65536 * tmp_y); + } + else + { + *out_x = (int32)round(65536 * (double)(in_x - screen_dest_rect.x) / exs); + *out_y = (int32)round(65536 * (double)(in_y - screen_dest_rect.y) / eys); + } +} + +int32 Video_PtoV_J(const int32 inv, const bool axis, const bool scr_scale) +{ + assert(VideoGI); + if(!scr_scale) + { + return((inv - 32768) * std::max(VideoGI->nominal_width, VideoGI->nominal_height) + (32768 * (axis ? VideoGI->nominal_height : VideoGI->nominal_width))); + } + else + { + int32 prescale = (axis ? screen->h : screen->w); + int32 offs = -(axis ? screen_dest_rect.y : screen_dest_rect.x); + double postscale = 65536.0 / (axis ? eys : exs); + + //printf("%.64f\n", floor(0.5 + ((((((int64)inv * prescale) + 0x8000) >> 16) + offs) * postscale)) / 65536.0); + + return (int32)floor(0.5 + ((((((int64)inv * prescale) + 0x8000) >> 16) + offs) * postscale)); + } +} diff --git a/Mednafen/mednafen/drivers/video.h b/Mednafen/mednafen/drivers/video.h new file mode 100644 index 0000000000..7b11a99d55 --- /dev/null +++ b/Mednafen/mednafen/drivers/video.h @@ -0,0 +1,49 @@ +#ifndef __MDFN_DRIVERS_VIDEO_H +#define __MDFN_DRIVERS_VIDEO_H + +enum +{ + VIDEOIP_OFF = 0, // Off should always be 0 here. + VIDEOIP_BILINEAR, + VIDEOIP_LINEAR_X, + VIDEOIP_LINEAR_Y +}; + +void Video_PtoV(const int in_x, const int in_y, int32 *out_x, int32 *out_y); +int32 Video_PtoV_J(const int32 inv, const bool axis, const bool scr_scale); + +void BlitScreen(MDFN_Surface *, const MDFN_Rect *DisplayRect, const int32 *LineWidths, const int InterlaceField, const bool take_ssnapshot); + +int VideoResize(int nw, int nh); + +void VideoShowMessage(char *text); + +// source_alpha = 0 (disabled) +// = 1 (enabled) +// = -1 (enabled only if it will be hardware-accelerated, IE via OpenGL) +void BlitRaw(MDFN_Surface *src, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, int source_alpha = 1); + +// +void Video_MakeSettings(std::vector &settings); + +// Called from the main thread +void Video_Init(MDFNGI *gi); + +// Called from the main thread +void Video_Kill(void); + +#if 0 +// Called from the game thread +void Video_GetInternalBB(uint32 **XBuf, MDFN_Rect **LineWidths); + +// Called from the game thread +void Video_SetInternalBBReady(const MDFN_Rect &DisplayRect); + +// Called from the main thread. +bool Video_ScreenBlitReady(void); + +// Called from the main thread. +void Video_BlitToScreen(void); +#endif + +#endif diff --git a/Mednafen/mednafen/drivers/win-manifest.xml b/Mednafen/mednafen/drivers/win-manifest.xml new file mode 100644 index 0000000000..156aace4fe --- /dev/null +++ b/Mednafen/mednafen/drivers/win-manifest.xml @@ -0,0 +1,8 @@ + + + + + true/pm + + + diff --git a/Mednafen/mednafen/drivers/win-resource.rc b/Mednafen/mednafen/drivers/win-resource.rc new file mode 100644 index 0000000000..4457ad700f --- /dev/null +++ b/Mednafen/mednafen/drivers/win-resource.rc @@ -0,0 +1,3 @@ +#include "winuser.h" + +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "win-manifest.xml" diff --git a/Mednafen/mednafen/drivers_dos/Joystick.cpp b/Mednafen/mednafen/drivers_dos/Joystick.cpp new file mode 120000 index 0000000000..013f870102 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Joystick.cpp @@ -0,0 +1 @@ +../drivers/Joystick.cpp \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/Joystick.h b/Mednafen/mednafen/drivers_dos/Joystick.h new file mode 120000 index 0000000000..54ff162725 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Joystick.h @@ -0,0 +1 @@ +../drivers/Joystick.h \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/Joystick_DOS_Standard.cpp b/Mednafen/mednafen/drivers_dos/Joystick_DOS_Standard.cpp new file mode 100644 index 0000000000..3678ed78d6 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Joystick_DOS_Standard.cpp @@ -0,0 +1,142 @@ +// UNFINISHED + +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" +#include "input.h" +#include "Joystick.h" +#include "Joystick_DOS_Standard.h" + +#ifdef DOS + #include +#else + // For Linux testing - Don't try this at home, kids. + #include +#endif + +class Joystick_DOS_Standard : public Joystick +{ + public: + + Joystick_DOS_Standard(unsigned port_arg); + ~Joystick_DOS_Standard(); + + static bool Detect(unsigned port); + + void UpdateInternal(void); + + private: + int port; + int jsdev_fd; + int evdev_fd; +}; + +Joystick_DOS_Standard::Joystick_DOS_Standard(unsigned port_arg) +{ + port = port_arg; + #ifndef DOS + ioperm(port, TRUE); + #endif + + num_axes = 4; + num_buttons = 4; + num_rel_axes = 0; + + id = port; +} + +Joystick_DOS_Standard::~Joystick_DOS_Standard() +{ + +} + +bool Joystick_DOS_Standard::Detect(unsigned port) +{ + + +} + +void Joystick_DOS_Standard::UpdateInternal(void) +{ + uint32 start_time; + uint64 end_time[4] = { 0, 0, 0, 0 }; + uint8 buttons; + uint8 axes; + + buttons = inb(port) & 0xF0; + outb(0, port); + start_time = _rdtsc(); + + do + { + uint64 curtime = _rdtsc(); + axes = inb(port) & 0x0F; + end_time[0] |= end_time + } while(axes); +} + +class JoystickDriver_DOS_Standard : public JoystickDriver +{ + public: + + JoystickDriver_DOS_Standard(); + virtual ~JoystickDriver_DOS_Standard(); + + virtual unsigned NumJoysticks(); // Cached internally on JoystickDriver instantiation. + virtual Joystick *GetJoystick(unsigned index); + virtual void UpdateJoysticks(void); + + private: + std::vector joys; +}; + +JoystickDriver_DOS_Standard::JoystickDriver_DOS_Standard() +{ + +} + +JoystickDriver_DOS_Standard::~JoystickDriver_DOS_Standard() +{ + for(unsigned int n = 0; n < joys.size(); n++) + { + delete joys[n]; + } +} + +unsigned JoystickDriver_DOS_Standard::NumJoysticks(void) +{ + return joys.size(); +} + +Joystick *JoystickDriver_DOS_Standard::GetJoystick(unsigned index) +{ + return joys[index]; +} + +void JoystickDriver_DOS_Standard::UpdateJoysticks(void) +{ + for(unsigned int n = 0; n < joys.size(); n++) + { + joys[n]->UpdateInternal(); + } +} + +JoystickDriver *JoystickDriver_DOS_Standard_New(void) +{ + return new JoystickDriver_DOS_Standard(); +} diff --git a/Mednafen/mednafen/drivers_dos/Joystick_DOS_Standard.h b/Mednafen/mednafen/drivers_dos/Joystick_DOS_Standard.h new file mode 100644 index 0000000000..e62d693518 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Joystick_DOS_Standard.h @@ -0,0 +1,5 @@ +#ifndef __MDFN_DRIVERS_JOYSTICK_DOS_STANDARD_H +#define __MDFN_DRIVERS_JOYSTICK_DOS_STANDARD_H + + +#endif diff --git a/Mednafen/mednafen/drivers_dos/Makefile.am b/Mednafen/mednafen/drivers_dos/Makefile.am new file mode 100644 index 0000000000..86b8225d62 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Makefile.am @@ -0,0 +1,16 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @SDL_CFLAGS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfndos.a + +libmdfndos_a_SOURCES = main.cpp sound.cpp ers.cpp args.cpp +# input.cpp input-config.cpp +#libmdfndos_a_SOURCES += fps.cpp video-state.cpp + +libmdfndos_a_SOURCES += video.cpp + +libmdfndos_a_SOURCES += nongl.cpp nnx.cpp + +libmdfndos_a_SOURCES += Joystick.cpp +#Joystick_DOS_Standard.cpp diff --git a/Mednafen/mednafen/drivers_dos/Makefile.in b/Mednafen/mednafen/drivers_dos/Makefile.in new file mode 100644 index 0000000000..c72944cb59 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Makefile.in @@ -0,0 +1,689 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/drivers_dos +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfndos_a_AR = $(AR) $(ARFLAGS) +libmdfndos_a_LIBADD = +am_libmdfndos_a_OBJECTS = main.$(OBJEXT) sound.$(OBJEXT) ers.$(OBJEXT) \ + args.$(OBJEXT) video.$(OBJEXT) nongl.$(OBJEXT) nnx.$(OBJEXT) \ + Joystick.$(OBJEXT) +libmdfndos_a_OBJECTS = $(am_libmdfndos_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfndos_a_SOURCES) +DIST_SOURCES = $(libmdfndos_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @SDL_CFLAGS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfndos.a +# input.cpp input-config.cpp +#libmdfndos_a_SOURCES += fps.cpp video-state.cpp +libmdfndos_a_SOURCES = main.cpp sound.cpp ers.cpp args.cpp video.cpp \ + nongl.cpp nnx.cpp Joystick.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/drivers_dos/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/drivers_dos/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libmdfndos.a: $(libmdfndos_a_OBJECTS) $(libmdfndos_a_DEPENDENCIES) $(EXTRA_libmdfndos_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfndos.a + $(AM_V_AR)$(libmdfndos_a_AR) libmdfndos.a $(libmdfndos_a_OBJECTS) $(libmdfndos_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfndos.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Joystick.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/args.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ers.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nnx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nongl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/video.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +#Joystick_DOS_Standard.cpp + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/drivers_dos/Sound.h b/Mednafen/mednafen/drivers_dos/Sound.h new file mode 120000 index 0000000000..e82d3d59f9 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Sound.h @@ -0,0 +1 @@ +../drivers/sound.h \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/Video.h b/Mednafen/mednafen/drivers_dos/Video.h new file mode 100644 index 0000000000..056688d8e9 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Video.h @@ -0,0 +1,48 @@ +#ifndef __MDFN_DRIVERS_VIDEO_H +#define __MDFN_DRIVERS_VIDEO_H + +bool Video_Init(MDFNGI*); +bool Video_Kill(void); +void Video_Blit(EmulateSpecStruct* es); +void Video_GetSurface(MDFN_Surface** ps, MDFN_Rect **plw); + +class VideoDriver +{ + public: + + VideoDriver(); + virtual ~VideoDriver() = 0; + + struct ModeParams + { + unsigned w; // In and Out + unsigned h; // In and Out + MDFN_PixelFormat format; // format.bpp In, all Out + double refresh_rate; // In and Out + bool fullscreen; // In and Out + bool double_buffered; // In and Out + double pixel_aspect_ratio; // In and Out + }; + + virtual void SetMode(ModeParams* mode) = 0; + + virtual void BlitSurface(const MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, bool source_alpha = false, unsigned ip = 0, int scanlines = 0, const MDFN_Rect *original_src_rect = NULL, int rotated = MDFN_ROTATE0) = 0; + + virtual void Flip(void) = 0; + + // Ideas for DOS and realtime fbdev: +#if 0 + void WaitVSync(void); + bool TestVSync(void); + bool TestVSyncSLC(void); // Test if vsync start happened since last call. + + uint32 GetPixClockGranularity(void); + uint32 GetPixClock(void); + void SetPixClock(uint32 val); +#endif + + // static global setting and per-module setting defs here? +}; + + +#endif diff --git a/Mednafen/mednafen/drivers_dos/Video_VGA.cpp b/Mednafen/mednafen/drivers_dos/Video_VGA.cpp new file mode 100644 index 0000000000..c4b18ba5d9 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Video_VGA.cpp @@ -0,0 +1,135 @@ +#include "main.h" +#include "video.h" +#include "Video_VGA.h" + + +VideoDriver_VGA::VideoDriver_VGA() +{ + SaveRestoreState(false); +} + +VideoDriver_VGA::~VideoDriver_VGA() +{ + SaveRestoreState(true); +} + +static uint32 GrabStateSize(void) +{ + // + // Grab state size. + // + _go32_dpmi_registers r; + + memset(&r, 0, sizeof(r)); + + r.h.ah = 0x1C; + r.h.al = 0x00; + r.x.cx = 0x07; + + if(_go32_dpmi_simulate_int(0x10, &r) != 0) + abort(); + + return(r.x.bx * 64); +} + +void VideoDriver_VGA::SaveRestoreState(bool restore) +{ + uint32 size; + _go32_dpmi_seginfo bbuf; + _go32_dpmi_registers r; + + memset(&bbuf, 0, sizeof(bbuf)); + memset(&r, 0, sizeof(r)); + + size = GrabStateSize(); + saved_state.resize(size); + + bbuf.size = (size + 15) / 16; + if(_go32_dpmi_allocate_dos_memory(&bbuf) != 0) + abort(); + + r.h.ah = 0x1C; + if(restore) + r.h.al = 0x02; + else + r.h.al = 0x01; + r.x.cx = 0x07; + + r.x.es = bbuf.rm_segment; + r.x.bx = 0; + + if(restore) + _dosmemputb(&saved_state[0], saved_state.size(), bbuf.rm_segment << 4); + + if(_go32_dpmi_simulate_int(0x10, &r) != 0) + abort(); + + if(!restore) + _dosmemgetb(bbuf.rm_segment << 4, saved_state.size(), &saved_state[0]); + + _go32_dpmi_free_dos_memory(&bbuf); +} + +void VideoDriver_VGA::SetMode(ModeParams* mode) +{ + _go32_dpmi_registers r; + memset(&r, 0, sizeof(r)); + + r.h.ah = 0x00; + r.h.al = 0x13; + + _go32_dpmi_simulate_int(0x10, &r); + + /* + vertical total + vertical display end + + vertical retrace start + vertical retrace end + vertical blank start + vertical blank end + + + horizontal total + horizontal display end + horizontal blank start + horizontal blank end + horizontal retrace start + horizontal retrace end + + horizontal_rate = pixel_rate / horizontal_total; + vertical_rate = pixel_rate / (vertical_total * horizontal_total); + + */ + + mode->w = 320; + mode->h = 200; + mode->pixel_aspect_ratio = 1.0; + + mode->fullscreen = true; + mode->double_buffered = false; + + mode->format.bpp = 8; + mode->format.colorspace = MDFN_COLORSPACE_RGB; + + mode->format.Rshift = 0; + mode->format.Gshift = 0; + mode->format.Bshift = 0; + mode->format.Ashift = 16; + + mode->format.Rprec = 6; + mode->format.Gprec = 6; + mode->format.Bprec = 6; + mode->format.Aprec = 0; +} + +void VideoDriver_VGA::BlitSurface(const MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, bool source_alpha, unsigned ip, int scanlines, const MDFN_Rect *original_src_rect, int rotated) +{ + +} + +void VideoDriver_VGA::Flip(void) +{ + +} + diff --git a/Mednafen/mednafen/drivers_dos/Video_VGA.h b/Mednafen/mednafen/drivers_dos/Video_VGA.h new file mode 100644 index 0000000000..caec4bc4a8 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/Video_VGA.h @@ -0,0 +1,24 @@ +#ifndef __MDFN_DRIVERS_VIDEO_VGA_H +#define __MDFN_DRIVERS_VIDEO_VGA_H + +#include + +class VideoDriver_VGA : public VideoDriver +{ + public: + + VideoDriver_VGA(); + ~VideoDriver_VGA(); + + void SetMode(ModeParams* mode); + void BlitSurface(const MDFN_Surface *src_surface, const MDFN_Rect *src_rect, const MDFN_Rect *dest_rect, bool source_alpha = false, unsigned ip = 0, int scanlines = 0, const MDFN_Rect *original_src_rect = NULL, int rotated = MDFN_ROTATE0); + void Flip(void); + + private: + + void SaveRestoreState(bool restore); + + std::vector saved_state; +}; + +#endif diff --git a/Mednafen/mednafen/drivers_dos/args.cpp b/Mednafen/mednafen/drivers_dos/args.cpp new file mode 120000 index 0000000000..a9487693b3 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/args.cpp @@ -0,0 +1 @@ +../drivers/args.cpp \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/args.h b/Mednafen/mednafen/drivers_dos/args.h new file mode 120000 index 0000000000..79aee3a57c --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/args.h @@ -0,0 +1 @@ +../drivers/args.h \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/ers.cpp b/Mednafen/mednafen/drivers_dos/ers.cpp new file mode 120000 index 0000000000..8e2ea1b9a7 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/ers.cpp @@ -0,0 +1 @@ +../drivers/ers.cpp \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/ers.h b/Mednafen/mednafen/drivers_dos/ers.h new file mode 120000 index 0000000000..d00f8b170d --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/ers.h @@ -0,0 +1 @@ +../drivers/ers.h \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/input-config.cpp b/Mednafen/mednafen/drivers_dos/input-config.cpp new file mode 100644 index 0000000000..effc18b487 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/input-config.cpp @@ -0,0 +1,235 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include + +#include "input.h" +#include "input-config.h" +#include "video.h" +#include "Joystick.h" + +extern JoystickManager *joy_manager; + +static bool DTestButtonMouse(const ButtConfig &bc, const uint32 *MouseData) +{ + if(bc.ButtonNum & 0x8000) + { + if(bc.ButtonNum&1) // Y + { + if(bc.ButtonNum & 0x4000) + { + if(MouseData[1] < 128) + return(true); + } + else + { + if(MouseData[1] >= 128) + return(true); + } + } + else // X + { + if(bc.ButtonNum & 0x4000) + { + if(MouseData[0] < 128) + return(true); + } + else + { + if(MouseData[0] >= 128) + return(true); + } + } + } + else + { + if(MouseData[2] & (1 << SDL_BUTTON(bc.ButtonNum))) + return(true); + } + return(false); +} + +int DTestButton(std::vector &bc, const char *KeyState, const uint32 *MouseData, bool analog) +{ + const int maxv = analog ? 32767 : 1; + int32 ret = 0; // Will obviously break if 10s of thousands of physical buttons are assigned to one emulated analog button. ;) + + for(unsigned int x = 0; x < bc.size(); x++) + { + if(bc[x].ButtType == BUTTC_KEYBOARD) + { + if(KeyState[bc[x].ButtonNum]) + ret += maxv; + } + else if(bc[x].ButtType == BUTTC_JOYSTICK) + { + if(analog) + ret += joy_manager->TestAnalogButton(bc[x]); + else if(joy_manager->TestButton(bc[x])) + ret += maxv; + } + else if(bc[x].ButtType == BUTTC_MOUSE) + { + if(DTestButtonMouse(bc[x], MouseData)) + ret += maxv; + } + } + + if(ret > maxv) + ret = maxv; + + return(ret); +} + +int DTestButton(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool analog) +{ + std::vector neobc; + neobc.push_back(bc); + + return(DTestButton(neobc, KeyState, MouseData, analog)); +} + + +#define ICSS_ALT 1 +#define ICSS_SHIFT 2 +#define ICSS_CTRL 4 + +/* Used for command keys */ +int DTestButtonCombo(std::vector &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode) +{ + unsigned int x; + unsigned int ss = 0; + unsigned match_count = 0; + + if(KeyState[MKK(LALT)] || KeyState[MKK(RALT)]) ss |= ICSS_ALT; + if(KeyState[MKK(LSHIFT)] || KeyState[MKK(RSHIFT)]) ss |= ICSS_SHIFT; + if(KeyState[MKK(LCTRL)] || KeyState[MKK(RCTRL)]) ss |= ICSS_CTRL; + + for(x = 0; x < bc.size(); x++) + { + if(bc[x].ButtType == BUTTC_KEYBOARD) + { + uint32 b = bc[x].ButtonNum; + + if(KeyState[b & 0xFFFF] && ((b >> 24) == ss)) + match_count++; + } + else if(bc[x].ButtType == BUTTC_JOYSTICK) + { + if(joy_manager->TestButton(bc[x])) + match_count++; + } + else if(bc[x].ButtType == BUTTC_MOUSE) + { + if(DTestButtonMouse(bc[x], MouseData)) + match_count++; + } + } + + if(match_count > 0) + { + if(!AND_Mode || match_count == bc.size()) + return(1); + } + + return(0); +} + +int DTestButtonCombo(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode) +{ + std::vector neobc; + neobc.push_back(bc); + + return(DTestButtonCombo(neobc, KeyState, MouseData, AND_Mode)); +} + + +static ButtConfig efbc; +static int volatile efbcdone; +static int volatile efck; + +static int LastMouseX; +static int LastMouseY; + +static int EventFilter(const SDL_Event *event) +{ + if(efbcdone) + return(1); + + switch(event->type) + { + case SDL_KEYDOWN: if(!efck || (event->key.keysym.sym != MKK(LALT) && event->key.keysym.sym != MKK(RALT) && + event->key.keysym.sym != MKK(LSHIFT) && event->key.keysym.sym != MKK(RSHIFT) && + event->key.keysym.sym != MKK(LCTRL) && event->key.keysym.sym != MKK(RCTRL))) + { + efbc.ButtType = BUTTC_KEYBOARD; + efbc.DeviceNum = 0; + efbc.ButtonNum = event->key.keysym.sym; + + if(0 == event->key.keysym.sym) + printf("*** NULL KEYSYM! ***\n"); + + //printf("%u\n", event->key.keysym.sym); + + if(efck) + efbc.ButtonNum |= ((event->key.keysym.mod & KMOD_ALT) ? (ICSS_ALT<<24):0) | ((event->key.keysym.mod & KMOD_SHIFT) ? (ICSS_SHIFT<<24):0) | ((event->key.keysym.mod & KMOD_CTRL) ? (ICSS_CTRL<<24):0); + efbcdone = 1; + return(1); + } + break; + + case SDL_MOUSEBUTTONDOWN: efbc.ButtType = BUTTC_MOUSE; + efbc.DeviceNum = 0; + efbc.ButtonNum = event->button.button - SDL_BUTTON_LEFT; + efbcdone = 1; + return(1); + + } + + return(1); +} + + +int DTryButtonBegin(ButtConfig *bc, int commandkey) +{ + memcpy(&efbc, bc, sizeof(ButtConfig)); + efck = commandkey; + efbcdone = 0; + + //SDL_MDFN_ShowCursor(1); + SDL_GetMouseState(&LastMouseX, &LastMouseY); + + MainSetEventHook(EventFilter); + //SDL_SetEventFilter(EventFilter); + return(1); +} + +int DTryButton(void) +{ + return(efbcdone); +} + +int DTryButtonEnd(ButtConfig *bc) +{ + MainSetEventHook(EventFilter); + memcpy(bc, &efbc, sizeof(ButtConfig)); + + return(1); +} + diff --git a/Mednafen/mednafen/drivers_dos/input-config.h b/Mednafen/mednafen/drivers_dos/input-config.h new file mode 100644 index 0000000000..36aac0c417 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/input-config.h @@ -0,0 +1,14 @@ +#ifndef __MDFN_DRIVERS_INPUT_CONFIG_H +#define __MDFN_DRIVERS_INPUT_CONFIG_H + +int DTestButton(std::vector &bc, const char *KeyState, const uint32* MouseData, bool analog = false); +int DTestButton(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool analog = false); + +int DTestButtonCombo(std::vector &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode = false); +int DTestButtonCombo(ButtConfig &bc, const char *KeyState, const uint32 *MouseData, bool AND_Mode = false); + +int DTryButtonBegin(ButtConfig *bc, int commandkey); +int DTryButton(void); +int DTryButtonEnd(ButtConfig *bc); + +#endif diff --git a/Mednafen/mednafen/drivers_dos/input-default-buttons.h b/Mednafen/mednafen/drivers_dos/input-default-buttons.h new file mode 100644 index 0000000000..4134c04db5 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/input-default-buttons.h @@ -0,0 +1,612 @@ +// This file should only be included *ONCE* from drivers/input.cpp!!! + + +#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +static const ButtConfig NESGamePadConfig[4][8]={ + /* Gamepad 1 */ + { + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(w),MK(s), + MK(a), MK(d) + }, + + /* Gamepad 2 */ + GPZ(), + + /* Gamepad 3 */ + GPZ(), + + /* Gamepad 4 */ + GPZ() +}; +#undef GPZ + +static const ButtConfig GBPadConfig[8] = +{ + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(d),MK(a), + MK(w), MK(s) +}; + +static const ButtConfig GBAPadConfig[10] = +{ + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(d),MK(a), + MK(w), MK(s), MK(KP6), MK(KP5) +}; + +#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +static const ButtConfig PCFXPadConfig[2][15]= +{ + /* Gamepad 1 */ + { + MK(KP3), MK(KP2), MK(KP1), MK(KP4), MK(KP5), MK(KP6), MK(TAB), MK(RETURN), + MK(w), MK(d), MK(s), MK(a), + MK(KP8), MK(KP9), + }, + + /* Gamepad 2 */ + GPZ(), +}; +#undef GPZ + +#define GPZ() {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +static const ButtConfig PCEPadConfig[5][13]={ + /* Gamepad 1 */ + { + MK(KP3), MK(KP2), MK(TAB), MK(RETURN), MK(w), MK(d), MK(s), MK(a), + + // Extra 4 buttons on 6-button pad + MK(KP1), MK(KP4), MK(KP5), MK(KP6), + + // ..and special 2/6 mode select + MK(m), + }, + + /* Gamepad 2 */ + GPZ(), + + /* Gamepad 3 */ + GPZ(), + + /* Gamepad 4 */ + GPZ(), + + /* Gamepad 5 */ + GPZ() +}; +#undef GPZ + +static const ButtConfig LynxPadConfig[9] = +{ + // A, B, Option 2, Option 1, Left, Right, Up, Down, Pause + MK(KP3), MK(KP2), MK(KP1), MK(KP7), MK(a),MK(d), + MK(w), MK(s), MK(RETURN) +}; + +static const ButtConfig NGPPadConfig[7 + 2] = +{ + // Up, down, left, right, a(inner), b(outer), option + MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(RETURN), MK(KP5), MK(KP6) +}; + +static const ButtConfig WSwanPadConfig[12] = +{ + // Up, right, down, left, + // up-y, right-y, down-y, left-y, + // start, a(outer), b(inner), option + MK(w), MK(d), MK(s), MK(a), + MK(UP), MK(RIGHT), MK(DOWN), MK(LEFT), + MK(RETURN), MK(KP3), MK(KP2), MK(RETURN) +}; + + +static const ButtConfig powerpadsc[2][12]={ + { + MK(o),MK(p),MK(LEFTBRACKET),MK(RIGHTBRACKET), + MK(k),MK(l),MK(SEMICOLON),MK(QUOTE), + MK(m),MK(COMMA),MK(PERIOD),MK(SLASH) + }, + { + MK(o),MK(p),MK(LEFTBRACKET),MK(RIGHTBRACKET), + MK(k),MK(l),MK(SEMICOLON),MK(QUOTE), + MK(m),MK(COMMA),MK(PERIOD),MK(SLASH) + } + }; + +static const ButtConfig fkbmap[0x48]= +{ + MK(F1),MK(F2),MK(F3),MK(F4),MK(F5),MK(F6),MK(F7),MK(F8), + MK(1),MK(2),MK(3),MK(4),MK(5),MK(6),MK(7),MK(8),MK(9),MK(0),MK(MINUS),MK(EQUALS),MK(BACKSLASH),MK(BACKSPACE), + MK(ESCAPE),MK(q),MK(w),MK(e),MK(r),MK(t),MK(y),MK(u),MK(i),MK(o),MK(p),MK(BACKQUOTE),MK(LEFTBRACKET),MK(RETURN), + MK(LCTRL),MK(a),MK(s),MK(d),MK(f),MK(g),MK(h),MK(j),MK(k),MK(l),MK(SEMICOLON),MK(QUOTE),MK(RIGHTBRACKET),MK(INSERT), + MK(LSHIFT),MK(z),MK(x),MK(c),MK(v),MK(b),MK(n),MK(m),MK(COMMA),MK(PERIOD),MK(SLASH),MK(RALT),MK(RSHIFT),MK(LALT),MK(SPACE), + MK(DELETE),MK(END),MK(PAGEDOWN),MK(UP),MK(LEFT),MK(RIGHT),MK(DOWN) +}; + +static const ButtConfig HyperShotButtons[4]= +{ + MK(q),MK(w),MK(e),MK(r) +}; + +static const ButtConfig MahjongButtons[21]= +{ + MK(q),MK(w),MK(e),MK(r),MK(t), + MK(a),MK(s),MK(d),MK(f),MK(g),MK(h),MK(j),MK(k),MK(l), + MK(z),MK(x),MK(c),MK(v),MK(b),MK(n),MK(m) +}; + +static const ButtConfig PartyTapButtons[6]= +{ + MK(q),MK(w),MK(e),MK(r),MK(t),MK(y) +}; + +static const ButtConfig FTrainerButtons[12]= +{ + MK(o),MK(p),MK(LEFTBRACKET), + MK(RIGHTBRACKET),MK(k),MK(l),MK(SEMICOLON), + MK(QUOTE), + MK(m),MK(COMMA),MK(PERIOD),MK(SLASH) +}; + +static ButtConfig OekaKidsConfig[1] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, +}; + +static ButtConfig ArkanoidConfig[1] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, +}; + +static ButtConfig NESZapperConfig[2] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + +static ButtConfig PCEMouseConfig[4] = +{ + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 0, 0 }, + MK(TAB), + MK(RETURN) +}; + +static ButtConfig PCFXMouseConfig[2] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + +static const ButtConfig SMSPadConfig[2][12]= +{ + /* Gamepad 1 */ + { + MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(RETURN) + }, + + /* Gamepad 2 */ + {MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ()} +}; + +static const ButtConfig GGPadConfig[12]= +{ + MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(RETURN) +}; + +static const ButtConfig TsushinKBConfig[0x80]= +{ + // 0 + MK(KP0), + MK(KP1), + MK(KP2), + MK(KP3), + MK(KP4), + MK(KP5), + MK(KP6), + +// 1 + MK(KP8), + MK(KP9), + MK(KP_MULTIPLY), // Keypad Multiply + MK(KP_PLUS), // Keypad Plus + MK(KP_EQUALS), // Keypad Equals + MK(UNKNOWN), // KP_COMMA // Keypad Comma + MK(KP_PERIOD), // Keypad Period + +// 2 + MK(BACKQUOTE), // @ + MK(a), + MK(b), + MK(c), + MK(d), + MK(e), + MK(f), + +// 3 + MK(h), + MK(i), + MK(j), + MK(k), + MK(l), + MK(m), + MK(n), + +// 4 + MK(p), + MK(q), + MK(r), + MK(s), + MK(t), + MK(u), + MK(v), + +// 5 + MK(x), + MK(y), + MK(z), + MK(LEFTBRACKET), // Left bracket + MK(PLUS), // Yen + MK(RIGHTBRACKET), // Right bracket + MK(EQUALS), // Caret + +// 6 + MK(0), + MK(1), + MK(2), + MK(3), + MK(4), + MK(5), + MK(6), + +// 7 + MK(8), + MK(9), + MK(QUOTE), // Colon + MK(SEMICOLON), // Semicolon + MK(COMMA), // Comma + MK(PERIOD), // Period + MK(SLASH), // Slash + +// 8 + MK(HOME), // HOME CLEAR + MK(UP), + MK(RIGHT), + //MK(UNKNOWN), + MK(UNKNOWN), // GRPH + MK(LSUPER), // カナ + //MK(UNKNOWN), + +// 9 + MK(BREAK), // STOP + MK(F1), + MK(F2), + MK(F3), + MK(F4), + MK(F5), + MK(SPACE), + + // A + MK(TAB), + MK(DOWN), + MK(LEFT), + MK(END), // HELP + MK(PRINT), // COPY + MK(KP_MINUS), + MK(KP_DIVIDE), + +// B + MK(PAGEDOWN), // ROLL DOWN + MK(PAGEUP), // ROLL UP + //MK(UNKNOWN), + //MK(UNKNOWN), + MK(o), + MK(UNKNOWN), // TODO: Underscore + MK(g), + +// C + MK(F6), + MK(F7), + MK(F8), + MK(F9), + MK(F10), + MK(BACKSPACE), + MK(INSERT), + +// D + MK(RALT), // 変換 + MK(LALT), // 決定 + MK(RSUPER), // PC + MK(RCTRL), // 変換 + MK(LCTRL), // CTRL + MK(KP7), + MK(w), + +// E + MK(RETURN), + MK(KP_ENTER), + MK(LSHIFT), + MK(RSHIFT), + MK(CAPSLOCK), + MK(DELETE), + MK(ESCAPE), + +// F + //MK(UNKNOWN), + //MK(UNKNOWN), + //MK(UNKNOWN), + //MK(UNKNOWN), + //MK(UNKNOWN), + MK(MINUS), // Minus + MK(7), // 7 +}; + + +static const ButtConfig MMPlayInputConfig[] = +{ + MK(p), + MK(LEFT), + MK(RIGHT), + MK(DOWN), + MK(UP), +}; + +static const ButtConfig CDPlayInputConfig[] = +{ + MK(SPACE), + MK(RETURN), + MK(RIGHT), + MK(LEFT), + MK(UP), + MK(DOWN), + MK(PAGEUP), + MK(PAGEDOWN), +}; + + +static const ButtConfig MDPad3Config[2][8] = +{ + { MK(w), MK(s), MK(a), MK(d), MK(KP2), MK(KP3), MK(KP1), MK(RETURN) }, + { MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ(), MKZ() }, + +}; + +static const ButtConfig SNESPadConfig[12] = +{ + MK(KP2), + MK(KP4), + MK(TAB), + MK(RETURN), + MK(w), + MK(s), + MK(a), + MK(d), + MK(KP6), + MK(KP8), + MK(KP7), + MK(KP9), +}; + + +static ButtConfig SNESMouseConfig[2] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, +}; + + +/* + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + + { "l2", "L2 (rear left shoulder)", 11, IDIT_BUTTON, NULL }, + { "r2", "R2 (rear right shoulder)", 13, IDIT_BUTTON, NULL }, + { "l1", "L1 (front left shoulder)", 10, IDIT_BUTTON, NULL }, + { "r1", "R1 (front right shoulder)", 12, IDIT_BUTTON, NULL }, + + { "triangle", "△ (upper)", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "circle", "○ (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "cross", "x (lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "square", "□ (left)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, +*/ +static const ButtConfig PSXPadConfig[14] = +{ + MK(TAB), + MK(RETURN), + MK(w), + MK(d), + MK(s), + MK(a), + + MK(KP7), + MK(KP9), + MK(KP1), + MK(KP3), + + MK(KP8), + MK(KP6), + MK(KP2), + MK(KP4), +}; + +static const ButtConfig PSXDancePadConfig[10] = +{ + MK(KP_DIVIDE), + MK(KP_MULTIPLY), + MK(KP8), + MK(KP6), + MK(KP2), + MK(KP4), + + MK(KP1), + MK(KP9), + MK(KP7), + MK(KP3), +}; + +static ButtConfig PSXMouseConfig[2] = +{ + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 0, 0 }, +}; + +static ButtConfig PSXGunConConfig[4] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 1, 0 }, + MK(SPACE) +}; + +static ButtConfig PSXJustifierConfig[4] = +{ + { BUTTC_MOUSE, 0, 0, 0 }, + { BUTTC_MOUSE, 0, 2, 0 }, + { BUTTC_MOUSE, 0, 1, 0 }, + MK(SPACE) +}; + +#if 0 +static ButtConfig VBPadConfig[14] = +{ + + + MK(I), // RPad, Up + MK(L), // RPad, Right + + MK(F), // LPad, Right + MK(S), // LPad, Left + MK(D), // LPad, Down + MK(E), // LPad, Up +}; +#endif + +typedef struct +{ + const char *base_name; + const ButtConfig *bc; + int num; +} DefaultSettingsMeow; + +static DefaultSettingsMeow defset[] = +{ + { "nes.input.port1.gamepad", NESGamePadConfig[0], sizeof(NESGamePadConfig[0]) / sizeof(ButtConfig) }, + { "nes.input.port2.gamepad", NESGamePadConfig[1], sizeof(NESGamePadConfig[1]) / sizeof(ButtConfig) }, + { "nes.input.port3.gamepad", NESGamePadConfig[2], sizeof(NESGamePadConfig[2]) / sizeof(ButtConfig) }, + { "nes.input.port4.gamepad", NESGamePadConfig[3], sizeof(NESGamePadConfig[3]) / sizeof(ButtConfig) }, + + + { "nes.input.port1.powerpada", powerpadsc[0], sizeof(powerpadsc[0]) / sizeof(ButtConfig) }, + { "nes.input.port2.powerpada", powerpadsc[1], sizeof(powerpadsc[1]) / sizeof(ButtConfig) }, + { "nes.input.port3.powerpadb", powerpadsc[0], sizeof(powerpadsc[0]) / sizeof(ButtConfig) }, + { "nes.input.port4.powerpadb", powerpadsc[1], sizeof(powerpadsc[1]) / sizeof(ButtConfig) }, + + { "nes.input.port1.zapper", NESZapperConfig, sizeof(NESZapperConfig) / sizeof(ButtConfig) }, + { "nes.input.port2.zapper", NESZapperConfig, sizeof(NESZapperConfig) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.fkb", fkbmap, sizeof(fkbmap) / sizeof(ButtConfig) }, + { "nes.input.fcexp.mahjong", MahjongButtons, sizeof(MahjongButtons) / sizeof(ButtConfig) }, + { "nes.input.fcexp.ftrainera", FTrainerButtons, sizeof(FTrainerButtons) / sizeof(ButtConfig) }, + { "nes.input.fcexp.ftrainerb", FTrainerButtons, sizeof(FTrainerButtons) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.hypershot", HyperShotButtons, sizeof(HyperShotButtons) / sizeof(ButtConfig) }, + { "nes.input.fcexp.partytap", PartyTapButtons, sizeof(PartyTapButtons) / sizeof(ButtConfig) }, + + { "nes.input.fcexp.oekakids", OekaKidsConfig, sizeof(OekaKidsConfig) / sizeof(ButtConfig) }, + + { "nes.input.port1.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.port2.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.port3.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.port4.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "nes.input.fcexp.arkanoid", ArkanoidConfig, sizeof(ArkanoidConfig) / sizeof(ArkanoidConfig) }, + { "lynx.input.builtin.gamepad", LynxPadConfig, sizeof(LynxPadConfig) / sizeof(ButtConfig) }, + { "gb.input.builtin.gamepad", GBPadConfig, sizeof(GBPadConfig) / sizeof(ButtConfig) }, + { "gba.input.builtin.gamepad", GBAPadConfig, sizeof(GBAPadConfig) / sizeof(ButtConfig) }, + { "ngp.input.builtin.gamepad", NGPPadConfig, sizeof(NGPPadConfig) / sizeof(ButtConfig) }, + { "wswan.input.builtin.gamepad", WSwanPadConfig, sizeof(WSwanPadConfig) / sizeof(ButtConfig) }, + + { "pce.input.port1.gamepad", PCEPadConfig[0], sizeof(PCEPadConfig[0]) / sizeof(ButtConfig) }, + { "pce.input.port2.gamepad", PCEPadConfig[1], sizeof(PCEPadConfig[1]) / sizeof(ButtConfig) }, + { "pce.input.port3.gamepad", PCEPadConfig[2], sizeof(PCEPadConfig[2]) / sizeof(ButtConfig) }, + { "pce.input.port4.gamepad", PCEPadConfig[3], sizeof(PCEPadConfig[3]) / sizeof(ButtConfig) }, + { "pce.input.port5.gamepad", PCEPadConfig[4], sizeof(PCEPadConfig[4]) / sizeof(ButtConfig) }, + + { "pce.input.port1.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port2.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port3.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port4.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + { "pce.input.port5.mouse", PCEMouseConfig, sizeof(PCEMouseConfig) / sizeof(ButtConfig) }, + + { "pce.input.port1.tsushinkb", TsushinKBConfig, sizeof(TsushinKBConfig) / sizeof(ButtConfig) }, + + { "pcfx.input.port1.gamepad", PCFXPadConfig[0], sizeof(PCFXPadConfig[0]) / sizeof(ButtConfig) }, + { "pcfx.input.port2.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port3.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port4.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port5.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port6.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port7.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + { "pcfx.input.port8.gamepad", PCFXPadConfig[1], sizeof(PCFXPadConfig[1]) / sizeof(ButtConfig) }, + + + { "pcfx.input.port1.mouse", PCFXMouseConfig, sizeof(PCFXMouseConfig) / sizeof(ButtConfig) }, + { "pcfx.input.port2.mouse", PCFXMouseConfig, sizeof(PCFXMouseConfig) / sizeof(ButtConfig) }, + + { "sms.input.port1.gamepad", SMSPadConfig[0], sizeof(SMSPadConfig[0]) / sizeof(ButtConfig) }, + { "sms.input.port1.gamepad", SMSPadConfig[0], sizeof(SMSPadConfig[0]) / sizeof(ButtConfig) }, + { "gg.input.builtin.gamepad", GGPadConfig, sizeof(GGPadConfig) / sizeof(ButtConfig) }, + + + { "md.input.port1.gamepad", MDPad3Config[0], sizeof(MDPad3Config[0]) / sizeof(ButtConfig) }, + { "md.input.port2.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port3.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port4.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port5.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port6.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port7.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + { "md.input.port8.gamepad", MDPad3Config[1], sizeof(MDPad3Config[1]) / sizeof(ButtConfig) }, + + { "snes.input.port1.gamepad", SNESPadConfig, sizeof(SNESPadConfig) / sizeof(ButtConfig) }, + { "snes.input.port1.mouse", SNESMouseConfig, sizeof(SNESMouseConfig) / sizeof(ButtConfig) }, + { "snes.input.port2.mouse", SNESMouseConfig, sizeof(SNESMouseConfig) / sizeof(ButtConfig) }, + + { "snes_perf.input.port1.gamepad", SNESPadConfig, sizeof(SNESPadConfig) / sizeof(ButtConfig) }, + { "snes_perf.input.port1.mouse", SNESMouseConfig, sizeof(SNESMouseConfig) / sizeof(ButtConfig) }, + { "snes_perf.input.port2.mouse", SNESMouseConfig, sizeof(SNESMouseConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.gamepad", PSXPadConfig, sizeof(PSXPadConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.dancepad", PSXDancePadConfig, sizeof(PSXDancePadConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port2.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port3.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port4.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port5.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port6.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port7.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + { "psx.input.port8.mouse", PSXMouseConfig, sizeof(PSXMouseConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port2.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port3.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port4.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port5.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port6.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port7.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + { "psx.input.port8.guncon", PSXGunConConfig, sizeof(PSXGunConConfig) / sizeof(ButtConfig) }, + + { "psx.input.port1.justifier", PSXJustifierConfig, sizeof(PSXJustifierConfig) / sizeof(ButtConfig) }, + { "psx.input.port2.justifier", PSXJustifierConfig, sizeof(PSXJustifierConfig) / sizeof(ButtConfig) }, + + //{ "vb.input.builtin.gamepad", VBPadConfig, sizeof(VBPadConfig) / sizeof(VBPadConfig) }, + + { "mmplay.input.builtin.controller", MMPlayInputConfig, sizeof(MMPlayInputConfig) / sizeof(ButtConfig) }, + { "cdplay.input.builtin.controller", CDPlayInputConfig, sizeof(CDPlayInputConfig) / sizeof(ButtConfig) }, + +}; + diff --git a/Mednafen/mednafen/drivers_dos/input.cpp b/Mednafen/mednafen/drivers_dos/input.cpp new file mode 100644 index 0000000000..554adf6254 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/input.cpp @@ -0,0 +1,1805 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include +#include +#include +#include + +#include "input.h" +#include "input-config.h" +#include "sound.h" +#include "video.h" +#include "Joystick.h" +#include "fps.h" +#include "help.h" + +#include + + +extern JoystickManager *joy_manager; + +static bool RewindState = false; +static uint32 MouseData[3]; +static double MouseDataRel[2]; + +static unsigned int autofirefreq; +static unsigned int ckdelay; + +static bool fftoggle_setting; +static bool sftoggle_setting; + +int ConfigDevice(int arg); +static void ConfigDeviceBegin(void); + +static void subcon_begin(std::vector &bc); +static int subcon(const char *text, std::vector &bc, int commandkey); + +static void ResyncGameInputSettings(unsigned port); + +static char keys[MKK_COUNT]; + +bool DNeedRewind = FALSE; + +static std::string BCToString(const ButtConfig &bc) +{ + std::string string = ""; + char tmp[256]; + + if(bc.ButtType == BUTTC_KEYBOARD) + { + trio_snprintf(tmp, 256, "keyboard %d", bc.ButtonNum & 0xFFFF); + + string = string + std::string(tmp); + + if(bc.ButtonNum & (4 << 24)) + string = string + "+ctrl"; + if(bc.ButtonNum & (1 << 24)) + string = string + "+alt"; + if(bc.ButtonNum & (2 << 24)) + string = string + "+shift"; + } + else if(bc.ButtType == BUTTC_JOYSTICK) + { + trio_snprintf(tmp, 256, "joystick %016llx %08x", bc.DeviceID, bc.ButtonNum); + + string = string + std::string(tmp); + } + else if(bc.ButtType == BUTTC_MOUSE) + { + trio_snprintf(tmp, 256, "mouse %d", bc.ButtonNum); + + string = string + std::string(tmp); + } + return(string); +} + +static std::string BCsToString(const ButtConfig *bc, unsigned int n) +{ + std::string ret = ""; + + for(unsigned int x = 0; x < n; x++) + { + if(bc[x].ButtType) + { + if(x) ret += "~"; + ret += BCToString(bc[x]); + } + } + + return(ret); +} + +static std::string BCsToString(const std::vector &bc, const bool AND_Mode = false) +{ + std::string ret = ""; + + if(AND_Mode) + ret += "/&&\\ "; + + for(unsigned int x = 0; x < bc.size(); x++) + { + if(x) ret += "~"; + ret += BCToString(bc[x]); + } + + return(ret); +} + + +static bool StringToBC(const char *string, std::vector &bc) +{ + bool AND_Mode = false; + char device_name[64]; + char extra[256]; + ButtConfig tmp_bc; + + while(*string && *string <= 0x20) string++; + + if(!strncmp(string, "/&&\\", 4)) + { + AND_Mode = true; + string += 4; + } + + while(*string && *string <= 0x20) string++; + + do + { + if(trio_sscanf(string, "%63s %255[^~]", device_name, extra) == 2) + { + if(!strcasecmp(device_name, "keyboard")) + { + uint32 bnum = atoi(extra); + + if(strstr(extra, "+shift")) + bnum |= 2 << 24; + if(strstr(extra, "+alt")) + bnum |= 1 << 24; + if(strstr(extra, "+ctrl")) + bnum |= 4 << 24; + + tmp_bc.ButtType = BUTTC_KEYBOARD; + tmp_bc.DeviceNum = 0; + tmp_bc.ButtonNum = bnum; + tmp_bc.DeviceID = 0; + + bc.push_back(tmp_bc); + } + else if(!strcasecmp(device_name, "joystick")) + { + tmp_bc.ButtType = BUTTC_JOYSTICK; + tmp_bc.DeviceNum = 0; + tmp_bc.ButtonNum = 0; + tmp_bc.DeviceID = 0; + + trio_sscanf(extra, "%016llx %08x", &tmp_bc.DeviceID, &tmp_bc.ButtonNum); + + tmp_bc.DeviceNum = joy_manager->GetIndexByUniqueID(tmp_bc.DeviceID); + bc.push_back(tmp_bc); + } + else if(!strcasecmp(device_name, "mouse")) + { + tmp_bc.ButtType = BUTTC_MOUSE; + tmp_bc.DeviceNum = 0; + tmp_bc.ButtonNum = 0; + tmp_bc.DeviceID = 0; + + trio_sscanf(extra, "%d", &tmp_bc.ButtonNum); + bc.push_back(tmp_bc); + } + } + string = strchr(string, '~'); + if(string) string++; + } while(string); + + return(AND_Mode); +} + +static char *CleanSettingName(char *string) +{ + size_t x = 0; + + while(string[x]) + { + if(string[x] == ' ') + string[x] = '_'; + else if(string[x] >= 'A' && string[x] <= 'Z') + string[x] = 'a' + string[x] - 'A'; + x++; + } + return string; +} + + +// We have a hardcoded limit of 16 ports here for simplicity. +static unsigned int NumPorts; + +//static std::vector PortPossibleDevices[MDFN_EMULATED_SYSTEM_COUNT][16]; +//typedef std::vector[16] +// An unpacked list of possible devices for each port. + +typedef std::vector SnugglyWuggly; +static std::map PortPossibleDevices; + +static unsigned int PortCurrentDeviceIndex[16]; // index into PortPossibleDevices +static void *PortData[16]; +static uint32 PortDataSize[16]; // In bytes, not bits! + +static const InputDeviceInfoStruct *PortDevice[16]; +static std::vectorPortButtons[16]; + +static std::vector > PortButtConfig[16]; +static std::vector PortButtConfigOffsets[16]; +static std::vector PortButtConfigPrettyPrio[16]; + +static std::vector PortBitOffsets[16]; // within PortData, mask with 0x80000000 for rapid buttons +static std::vector PortButtBitOffsets[16]; +static std::vector PortButtIsAnalog[16]; + +typedef struct +{ + uint32 rotate[3]; +} RotateOffsets_t; + +static std::vector PortButtRotateOffsets[16]; + + +static std::vector PortButtExclusionBitOffsets[16]; // 0xFFFFFFFF represents none +static std::vector PortButtSettingNames[16]; + +static void KillPortInfo(unsigned int port) +{ + if(PortData[port]) + free(PortData[port]); + PortData[port] = NULL; + PortDataSize[port] = 0; + PortDevice[port] = NULL; + + for(unsigned int x = 0; x < PortButtons[port].size(); x++) + free(PortButtons[port][x]); + + PortButtons[port].clear(); + PortButtConfig[port].clear(); + PortButtConfigOffsets[port].clear(); + PortButtConfigPrettyPrio[port].clear(); + + PortBitOffsets[port].clear(); + PortButtBitOffsets[port].clear(); + PortButtRotateOffsets[port].clear(); + PortButtExclusionBitOffsets[port].clear(); + PortButtIsAnalog[port].clear(); + + for(unsigned int x = 0; x < PortButtSettingNames[port].size(); x++) + free(PortButtSettingNames[port][x]); + + PortButtSettingNames[port].clear(); +} + +static void KillPortsInfo(void) // Murder it!! +{ + for(unsigned int port = 0; port < NumPorts; port++) + KillPortInfo(port); + + NumPorts = 0; +} + + +static void BuildPortInfo(MDFNGI *gi, const unsigned int port) +{ + const RotateOffsets_t NullRotate = { { ~0U, ~0U, ~0U } }; + const InputDeviceInfoStruct *zedevice = NULL; + char *port_device_name; + unsigned int device; + + + if(PortPossibleDevices[gi->shortname][port].size() > 1) + { + if(CurGame->DesiredInput.size() > port && CurGame->DesiredInput[port]) + { + port_device_name = strdup(CurGame->DesiredInput[port]); + } + else + { + char tmp_setting_name[512]; + trio_snprintf(tmp_setting_name, 512, "%s.input.%s", gi->shortname, gi->InputInfo->Types[port].ShortName); + port_device_name = strdup(MDFN_GetSettingS(tmp_setting_name).c_str()); + } + } + else + { + port_device_name = strdup(PortPossibleDevices[gi->shortname][port][0]->ShortName); + } + + for(device = 0; device < PortPossibleDevices[gi->shortname][port].size(); device++) + { + //printf("Port: %d, Dev: %d, Meow: %s\n", port, device, PortPossibleDevices[gi->shortname][port][device]->ShortName); + if(!strcasecmp(PortPossibleDevices[gi->shortname][port][device]->ShortName, port_device_name)) + { + zedevice = PortPossibleDevices[gi->shortname][port][device]; + break; + } + } + free(port_device_name); port_device_name = NULL; + + PortCurrentDeviceIndex[port] = device; + + assert(zedevice); + + PortDevice[port] = zedevice; + + // Figure out how much data should be allocated for each port + int bit_offset = 0; + int buttconfig_offset = 0; + + if(!zedevice->PortExpanderDeviceInfo) + for(int x = 0; x < zedevice->NumInputs; x++) + { + // Handle dummy/padding button entries(the setting name will be NULL in such cases) + if(NULL == zedevice->IDII[x].SettingName) + { + //printf("%s Dummy: %s, %u\n", zedevice->FullName, zedevice->IDII[x].Name, zedevice->IDII[x].Type); + switch(zedevice->IDII[x].Type) + { + default: bit_offset = ((bit_offset + 31) &~ 31) + 32; + break; + + case IDIT_BUTTON: + case IDIT_BUTTON_CAN_RAPID: bit_offset += 1; + break; + + case IDIT_BYTE_SPECIAL: bit_offset += 8; + break; + } + continue; + } // End of handling dummy/padding entries + + + if(zedevice->IDII[x].Type == IDIT_BUTTON || zedevice->IDII[x].Type == IDIT_BUTTON_CAN_RAPID + || zedevice->IDII[x].Type == IDIT_BUTTON_ANALOG) + { + if(zedevice->IDII[x].Type == IDIT_BUTTON_ANALOG) + bit_offset = (bit_offset + 31) &~ 31; // Align to a 32-bit boundary + + std::vector buttc; + char buttsn[512]; + + trio_snprintf(buttsn, 512, "%s.input.%s.%s.%s", gi->shortname, gi->InputInfo->Types[port].ShortName, zedevice->ShortName, zedevice->IDII[x].SettingName); + CleanSettingName(buttsn); + + //printf("Buttsn: %s, %s\n", buttsn, MDFN_GetSettingS(buttsn).c_str()); + PortButtSettingNames[port].push_back(strdup(buttsn)); + StringToBC(MDFN_GetSettingS(buttsn).c_str(), buttc); + + PortButtConfig[port].push_back(buttc); + PortBitOffsets[port].push_back(bit_offset); + PortButtBitOffsets[port].push_back(bit_offset); + PortButtIsAnalog[port].push_back(zedevice->IDII[x].Type == IDIT_BUTTON_ANALOG); + + PortButtons[port].push_back(strdup(zedevice->IDII[x].Name)); + PortButtConfigOffsets[port].push_back(buttconfig_offset); + + PortButtConfigPrettyPrio[port].push_back(zedevice->IDII[x].ConfigOrder); + buttconfig_offset++; + + if(zedevice->IDII[x].Type == IDIT_BUTTON_CAN_RAPID) + { + buttc.clear(); + + trio_snprintf(buttsn, 512, "%s.input.%s.%s.rapid_%s", gi->shortname, gi->InputInfo->Types[port].ShortName, zedevice->ShortName, zedevice->IDII[x].SettingName); + CleanSettingName(buttsn); + PortButtSettingNames[port].push_back(strdup(buttsn)); + StringToBC(MDFN_GetSettingS(buttsn).c_str(), buttc); + + PortButtConfig[port].push_back(buttc); + //WRONG: PortBitOffsets[port].push_back(bit_offset | 0x80000000); + PortButtBitOffsets[port].push_back(bit_offset | 0x80000000); + PortButtIsAnalog[port].push_back(false); + + PortButtons[port].push_back(trio_aprintf("Rapid %s", zedevice->IDII[x].Name)); + PortButtConfigOffsets[port].push_back(buttconfig_offset); + + PortButtConfigPrettyPrio[port].push_back(zedevice->IDII[x].ConfigOrder); + buttconfig_offset++; + } + + if(zedevice->IDII[x].Type == IDIT_BUTTON_ANALOG) + { + bit_offset += 32; + } + else + { + bit_offset += 1; + } + } + else if(zedevice->IDII[x].Type == IDIT_BYTE_SPECIAL) + { + PortBitOffsets[port].push_back(bit_offset); + bit_offset += 8; + } + else // axis and misc, uint32! + { + bit_offset = (bit_offset + 31) &~ 31; // Align it to a 32-bit boundary + + PortBitOffsets[port].push_back(bit_offset); + bit_offset += 32; + } + } + //printf("Love: %d %d %d %s\n", port, bit_offset, zedevice->NumInputs, zedevice->ShortName); + + for(unsigned int x = 0; x < PortButtConfigPrettyPrio[port].size(); x++) + { + int this_prio = PortButtConfigPrettyPrio[port][x]; + + if(this_prio >= 0) + { + bool FooFound = FALSE; + + // First, see if any duplicate priorities come after this one! or something + for(unsigned int i = x + 1; i < PortButtConfigPrettyPrio[port].size(); i++) + if(PortButtConfigPrettyPrio[port][i] == this_prio) + { + FooFound = TRUE; + break; + } + + // Now adjust all priorities >= this_prio except for 'x' by +1 + if(FooFound) + { + for(unsigned int i = 0; i < PortButtConfigPrettyPrio[port].size(); i++) + if(i != x && PortButtConfigPrettyPrio[port][i] >= this_prio) + PortButtConfigPrettyPrio[port][i]++; + } + + } + } + + PortDataSize[port] = (bit_offset + 7) / 8; + + if(!PortDataSize[port]) + PortData[port] = NULL; + else + { + PortData[port] = malloc(PortDataSize[port]); + memset(PortData[port], 0, PortDataSize[port]); + } + + // Now, search for exclusion buttons and rotated inputs. + if(!zedevice->PortExpanderDeviceInfo) + { + for(int x = 0; x < zedevice->NumInputs; x++) + { + if(NULL == zedevice->IDII[x].SettingName) + continue; + + if(zedevice->IDII[x].Type == IDIT_BUTTON || zedevice->IDII[x].Type == IDIT_BUTTON_CAN_RAPID || zedevice->IDII[x].Type == IDIT_BUTTON_ANALOG) + { + if(zedevice->IDII[x].ExcludeName) + { + int bo = 0xFFFFFFFF; + + for(unsigned int sub_x = 0; sub_x < PortButtSettingNames[port].size(); sub_x++) + { + if(!strcasecmp(zedevice->IDII[x].ExcludeName, strrchr(PortButtSettingNames[port][sub_x], '.') + 1 )) + bo = PortButtBitOffsets[port][sub_x]; + } + //printf("%s %s %d\n", zedevice->IDII[x].SettingName, zedevice->IDII[x].ExcludeName, bo); + PortButtExclusionBitOffsets[port].push_back(bo); + } + else + PortButtExclusionBitOffsets[port].push_back(0xFFFFFFFF); + + if(zedevice->IDII[x].RotateName[0]) + { + RotateOffsets_t RotoCat = NullRotate; + + for(int rodir = 0; rodir < 3; rodir++) + { + for(unsigned int sub_x = 0; sub_x < PortButtSettingNames[port].size(); sub_x++) + { + if(!strcasecmp(zedevice->IDII[x].RotateName[rodir], strrchr(PortButtSettingNames[port][sub_x], '.') + 1 )) + { + RotoCat.rotate[rodir] = PortButtBitOffsets[port][sub_x]; + break; + } + } + //printf("%s %s %d\n", zedevice->IDII[x].SettingName, zedevice->IDII[x].ExcludeName, bo); + } + PortButtRotateOffsets[port].push_back(RotoCat); + } + else + PortButtRotateOffsets[port].push_back(NullRotate); + + if(zedevice->IDII[x].Type == IDIT_BUTTON_CAN_RAPID) // FIXME in the future, but I doubt we'll ever have rapid-fire directional buttons! + { + PortButtExclusionBitOffsets[port].push_back(0xFFFFFFFF); + PortButtRotateOffsets[port].push_back(NullRotate); + } + } + } + } // End search for exclusion buttons and rotated inputs. + + assert(PortButtExclusionBitOffsets[port].size() == PortButtBitOffsets[port].size()); + assert(PortButtRotateOffsets[port].size() == PortButtBitOffsets[port].size()); + assert(PortButtBitOffsets[port].size() == PortButtIsAnalog[port].size()); + + MDFNI_SetInput(port, zedevice->ShortName, PortData[port], PortDataSize[port]); +} + +static void BuildPortsInfo(MDFNGI *gi) +{ + NumPorts = 0; + while(PortPossibleDevices[gi->shortname][NumPorts].size()) + { + BuildPortInfo(gi, NumPorts); + NumPorts++; + } +} + +static void IncSelectedDevice(unsigned int port) +{ + if(RewindState) + { + MDFN_DispMessage(_("Cannot change input device while state rewinding is active.")); + } + else if(PortPossibleDevices[CurGame->shortname][port].size() > 1) + { + char tmp_setting_name[512]; + + if(CurGame->DesiredInput.size() > port) + CurGame->DesiredInput[port] = NULL; + + trio_snprintf(tmp_setting_name, 512, "%s.input.%s", CurGame->shortname, CurGame->InputInfo->Types[port].ShortName); + + PortCurrentDeviceIndex[port] = (PortCurrentDeviceIndex[port] + 1) % PortPossibleDevices[CurGame->shortname][port].size(); + + const char *devname = PortPossibleDevices[CurGame->shortname][port][PortCurrentDeviceIndex[port]]->ShortName; + + KillPortInfo(port); + MDFNI_SetSetting(tmp_setting_name, devname); + BuildPortInfo(CurGame, port); + + MDFN_DispMessage(_("%s selected on port %d"), PortPossibleDevices[CurGame->shortname][port][PortCurrentDeviceIndex[port]]->FullName, port + 1); + } +} + +#define MK(x) { BUTTC_KEYBOARD, 0, MKK(x) } + +#define MK_CK(x) { { BUTTC_KEYBOARD, 0, MKK(x) }, { 0, 0, 0 } } +#define MK_CK2(x,y) { { BUTTC_KEYBOARD, 0, MKK(x) }, { BUTTC_KEYBOARD, 0, MKK(y) } } + +#define MK_CK_SHIFT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (2<<24) }, { 0, 0, 0 } } +#define MK_CK_ALT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (1<<24) }, { 0, 0, 0 } } +#define MK_CK_ALT_SHIFT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (3<<24) }, { 0, 0, 0 } } +#define MK_CK_CTRL(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (4 << 24) }, { 0, 0, 0 } } +#define MK_CK_CTRL_SHIFT(x) { { BUTTC_KEYBOARD, 0, MKK(x) | (6 << 24) }, { 0, 0, 0 } } + +#define MKZ() {0, 0, 0} + +typedef enum { + _CK_FIRST = 0, + CK_SAVE_STATE = 0, + CK_LOAD_STATE, + CK_SAVE_MOVIE, + CK_LOAD_MOVIE, + CK_STATE_REWIND_TOGGLE, + CK_0,CK_1,CK_2,CK_3,CK_4,CK_5,CK_6,CK_7,CK_8,CK_9, + CK_M0,CK_M1,CK_M2,CK_M3,CK_M4,CK_M5,CK_M6,CK_M7,CK_M8,CK_M9, + CK_TL1, CK_TL2, CK_TL3, CK_TL4, CK_TL5, CK_TL6, CK_TL7, CK_TL8, CK_TL9, + CK_TAKE_SNAPSHOT, + CK_FAST_FORWARD, + CK_SLOW_FORWARD, + + CK_INSERT_COIN, + CK_TOGGLE_DIPVIEW, + CK_SELECT_DISK, + CK_INSERTEJECT_DISK, + CK_ACTIVATE_BARCODE, + + CK_TOGGLE_CDISABLE, + CK_INPUT_CONFIG1, + CK_INPUT_CONFIG2, + CK_INPUT_CONFIG3, + CK_INPUT_CONFIG4, + CK_INPUT_CONFIG5, + CK_INPUT_CONFIG6, + CK_INPUT_CONFIG7, + CK_INPUT_CONFIG8, + CK_INPUT_CONFIGC, + CK_INPUT_CONFIGC_AM, + CK_INPUT_CONFIG_ABD, + + CK_RESET, + CK_POWER, + CK_EXIT, + CK_STATE_REWIND, + CK_ROTATESCREEN, + CK_ADVANCE_FRAME, + CK_RUN_NORMAL, + CK_TOGGLE_FPS_VIEW, + CK_STATE_SLOT_DEC, + CK_STATE_SLOT_INC, + CK_TOGGLE_HELP, + CK_DEVICE_SELECT1, + CK_DEVICE_SELECT2, + CK_DEVICE_SELECT3, + CK_DEVICE_SELECT4, + CK_DEVICE_SELECT5, + CK_DEVICE_SELECT6, + CK_DEVICE_SELECT7, + CK_DEVICE_SELECT8, + + _CK_COUNT +} CommandKey; + +typedef struct __COKE +{ + ButtConfig bc[2]; + const char *text; + unsigned int system; + bool SkipCKDelay; + const char *description; +} COKE; + +static const COKE CKeys[_CK_COUNT] = +{ + { MK_CK(F5), "save_state", ~0U, 1, gettext_noop("Save state") }, + { MK_CK(F7), "load_state", ~0U, 0, gettext_noop("Load state") }, + { MK_CK_SHIFT(F5), "save_movie", ~0U, 1, gettext_noop("Save movie") }, + { MK_CK_SHIFT(F7), "load_movie", ~0U, 0, gettext_noop("Load movie") }, + { MK_CK_ALT(s), "toggle_state_rewind", ~0U, 1, gettext_noop("Toggle state rewind functionality") }, + + { MK_CK(0), "0", ~0U, 1, gettext_noop("Save state 0 select")}, + { MK_CK(1), "1", ~0U, 1, gettext_noop("Save state 1 select")}, + { MK_CK(2), "2", ~0U, 1, gettext_noop("Save state 2 select")}, + { MK_CK(3), "3", ~0U, 1, gettext_noop("Save state 3 select")}, + { MK_CK(4), "4", ~0U, 1, gettext_noop("Save state 4 select")}, + { MK_CK(5), "5", ~0U, 1, gettext_noop("Save state 5 select")}, + { MK_CK(6), "6", ~0U, 1, gettext_noop("Save state 6 select")}, + { MK_CK(7), "7", ~0U, 1, gettext_noop("Save state 7 select")}, + { MK_CK(8), "8", ~0U, 1, gettext_noop("Save state 8 select")}, + { MK_CK(9), "9", ~0U, 1, gettext_noop("Save state 9 select")}, + + { MK_CK_SHIFT(0), "m0", ~0U, 1, gettext_noop("Movie 0 select") }, + { MK_CK_SHIFT(1), "m1", ~0U, 1, gettext_noop("Movie 1 select") }, + { MK_CK_SHIFT(2), "m2", ~0U, 1, gettext_noop("Movie 2 select") }, + { MK_CK_SHIFT(3), "m3", ~0U, 1, gettext_noop("Movie 3 select") }, + { MK_CK_SHIFT(4), "m4", ~0U, 1, gettext_noop("Movie 4 select") }, + { MK_CK_SHIFT(5), "m5", ~0U, 1, gettext_noop("Movie 5 select") }, + { MK_CK_SHIFT(6), "m6", ~0U, 1, gettext_noop("Movie 6 select") }, + { MK_CK_SHIFT(7), "m7", ~0U, 1, gettext_noop("Movie 7 select") }, + { MK_CK_SHIFT(8), "m8", ~0U, 1, gettext_noop("Movie 8 select") }, + { MK_CK_SHIFT(9), "m9", ~0U, 1, gettext_noop("Movie 9 select") }, + + { MK_CK_CTRL(1), "tl1", ~0U, 1, gettext_noop("Toggle graphics layer 1") }, + { MK_CK_CTRL(2), "tl2", ~0U, 1, gettext_noop("Toggle graphics layer 2") }, + { MK_CK_CTRL(3), "tl3", ~0U, 1, gettext_noop("Toggle graphics layer 3") }, + { MK_CK_CTRL(4), "tl4", ~0U, 1, gettext_noop("Toggle graphics layer 4") }, + { MK_CK_CTRL(5), "tl5", ~0U, 1, gettext_noop("Toggle graphics layer 5") }, + { MK_CK_CTRL(6), "tl6", ~0U, 1, gettext_noop("Toggle graphics layer 6") }, + { MK_CK_CTRL(7), "tl7", ~0U, 1, gettext_noop("Toggle graphics layer 7") }, + { MK_CK_CTRL(8), "tl8", ~0U, 1, gettext_noop("Toggle graphics layer 8") }, + { MK_CK_CTRL(9), "tl9", ~0U, 1, gettext_noop("Toggle graphics layer 9") }, + + { MK_CK(F9), "take_snapshot", ~0U, 1, gettext_noop("Take screen snapshot") }, + + { MK_CK_ALT(RETURN), "toggle_fs", ~0U, 1, gettext_noop("Toggle fullscreen mode") }, + { MK_CK(BACKQUOTE), "fast_forward", ~0U, 1, gettext_noop("Fast-forward") }, + { MK_CK(BACKSLASH), "slow_forward", ~0U, 1, gettext_noop("Slow-forward") }, + + { MK_CK(F8), "insert_coin", ~0U, 1, gettext_noop("Insert coin") }, + { MK_CK(F6), "toggle_dipview", ~0U, 1, gettext_noop("Toggle DIP switch view") }, + { MK_CK(F6), "select_disk", ~0U, 1, gettext_noop("Select disk/disc") }, + { MK_CK(F8), "insert_eject_disk", ~0U, 0, gettext_noop("Insert/Eject disk/disc") }, + { MK_CK(F8), "activate_barcode", ~0U, 1, gettext_noop("Activate barcode(for Famicom)") }, + { MK_CK_SHIFT(SCROLLOCK), "toggle_cidisable", ~0U, 1, gettext_noop("Grab input and disable commands") }, + { MK_CK_ALT_SHIFT(1), "input_config1", ~0U, 0, gettext_noop("Configure buttons on virtual port 1") }, + { MK_CK_ALT_SHIFT(2), "input_config2", ~0U, 0, gettext_noop("Configure buttons on virtual port 2") }, + { MK_CK_ALT_SHIFT(3), "input_config3", ~0U, 0, gettext_noop("Configure buttons on virtual port 3") }, + { MK_CK_ALT_SHIFT(4), "input_config4", ~0U, 0, gettext_noop("Configure buttons on virtual port 4") }, + { MK_CK_ALT_SHIFT(5), "input_config5", ~0U, 0, gettext_noop("Configure buttons on virtual port 5") }, + { MK_CK_ALT_SHIFT(6), "input_config6", ~0U, 0, gettext_noop("Configure buttons on virtual port 6") }, + { MK_CK_ALT_SHIFT(7), "input_config7", ~0U, 0, gettext_noop("Configure buttons on virtual port 7") }, + { MK_CK_ALT_SHIFT(8), "input_config8", ~0U, 0, gettext_noop("Configure buttons on virtual port 8") }, + { MK_CK(F2), "input_configc", ~0U, 0, gettext_noop("Configure command key") }, + { MK_CK_SHIFT(F2), "input_configc_am", ~0U, 0, gettext_noop("Configure command key, for all-pressed-to-trigger mode") }, + + { MK_CK(F3), "input_config_abd", ~0U, 0, gettext_noop("Detect analog buttons on physical joysticks/gamepads(for use with the input configuration process).") }, + + { MK_CK(F10), "reset", ~0U, 0, gettext_noop("Reset") }, + { MK_CK(F11), "power", ~0U, 0, gettext_noop("Power toggle") }, + { MK_CK2(F12, ESCAPE), "exit", ~0U, 0, gettext_noop("Exit") }, + { MK_CK(BACKSPACE), "state_rewind", ~0U, 1, gettext_noop("Rewind") }, + { MK_CK_ALT(o), "rotate_screen", ~0U, 1, gettext_noop("Rotate screen") }, + + { MK_CK_ALT(a), "advance_frame", ~0U, 1, gettext_noop("Advance frame") }, + { MK_CK_ALT(r), "run_normal", ~0U, 1, gettext_noop("Return to normal mode after advancing frames") }, + { MK_CK_SHIFT(F1), "toggle_fps_view", ~0U, 1, gettext_noop("Toggle frames-per-second display") }, + { MK_CK(MINUS), "state_slot_dec", ~0U, 1, gettext_noop("Decrease selected save state slot by 1") }, + { MK_CK(EQUALS), "state_slot_inc", ~0U, 1, gettext_noop("Increase selected save state slot by 1") }, + { MK_CK(F1), "toggle_help", ~0U, 1, gettext_noop("Toggle help screen") }, + { MK_CK_CTRL_SHIFT(1), "device_select1", ~0U, 1, gettext_noop("Select virtual device on virtual input port 1") }, + { MK_CK_CTRL_SHIFT(2), "device_select2", ~0U, 1, gettext_noop("Select virtual device on virtual input port 2") }, + { MK_CK_CTRL_SHIFT(3), "device_select3", ~0U, 1, gettext_noop("Select virtual device on virtual input port 3") }, + { MK_CK_CTRL_SHIFT(4), "device_select4", ~0U, 1, gettext_noop("Select virtual device on virtual input port 4") }, + { MK_CK_CTRL_SHIFT(5), "device_select5", ~0U, 1, gettext_noop("Select virtual device on virtual input port 5") }, + { MK_CK_CTRL_SHIFT(6), "device_select6", ~0U, 1, gettext_noop("Select virtual device on virtual input port 6") }, + { MK_CK_CTRL_SHIFT(7), "device_select7", ~0U, 1, gettext_noop("Select virtual device on virtual input port 7") }, + { MK_CK_CTRL_SHIFT(8), "device_select8", ~0U, 1, gettext_noop("Select virtual device on virtual input port 8") }, +}; + +static const char *CKeysSettingName[_CK_COUNT]; + +struct CKeyConfig +{ + bool AND_Mode; + std::vector bc; +}; + +static CKeyConfig CKeysConfig[_CK_COUNT]; +static int CKeysLastState[_CK_COUNT]; +static uint32 CKeysPressTime[_CK_COUNT]; +static uint32 CurTicks = 0; // Optimization. + +static int CK_Check(CommandKey which) +{ + int last = CKeysLastState[which]; + int tmp_ckdelay = ckdelay; + + if(CKeys[which].SkipCKDelay) + tmp_ckdelay = 0; + + if((CKeysLastState[which] = DTestButtonCombo(CKeysConfig[which].bc, keys, MouseData, CKeysConfig[which].AND_Mode))) + { + if(!last) + CKeysPressTime[which] = CurTicks; + } + else + CKeysPressTime[which] = 0xFFFFFFFF; + + if(CurTicks >= ((int64)CKeysPressTime[which] + tmp_ckdelay)) + { + CKeysPressTime[which] = 0xFFFFFFFF; + return(1); + } + return(0); +} + +static int CK_CheckActive(CommandKey which) +{ + return(DTestButtonCombo(CKeysConfig[which].bc, keys, MouseData, CKeysConfig[which].AND_Mode)); +} + +static bool ViewDIPSwitches = false; + +#define KEY(__a) keys[MKK(__a)] + +static int cidisabled=0; + +static bool inff = 0; +static bool insf = 0; + +typedef enum +{ + none, + Port1, + Port2, + Port3, + Port4, + Port5, + Port6, + Port7, + Port8, + Command, + CommandAM +} ICType; + +static ICType IConfig = none; +static int ICLatch; +static uint32 ICDeadDelay = 0; + +#if 0 +static struct __MouseState +{ + int x, y; + int xrel_accum; + int yrel_accum; + + uint32 button; + uint32 button_realstate; + uint32 button_prevsent; +} MouseState = { 0, 0, 0, 0, 0, 0, 0 }; + +static int (*EventHook)(const SDL_Event *event) = NULL; +void MainSetEventHook(int (*eh)(const SDL_Event *event)) +{ + EventHook = eh; +} + +void Input_Event(const SDL_Event *event) +{ + switch(event->type) + { + case SDL_MOUSEBUTTONDOWN: + if(event->button.state == SDL_PRESSED) + { + MouseState.button |= 1 << (event->button.button - 1); + MouseState.button_realstate |= 1 << (event->button.button - 1); + } + break; + + case SDL_MOUSEBUTTONUP: + if(event->button.state == SDL_RELEASED) + { + MouseState.button_realstate &= ~(1 << (event->button.button - 1)); + } + break; + + case SDL_MOUSEMOTION: + MouseState.x = event->motion.x; + MouseState.y = event->motion.y; + MouseState.xrel_accum += event->motion.xrel; + MouseState.yrel_accum += event->motion.yrel; + break; + } + + if(EventHook) + EventHook(event); +} +#endif + +/* + The mouse button handling convolutedness is to make sure that extremely quick mouse button press and release + still register as pressed for 1 emulated frame, and without otherwise increasing the lag of a mouse button release(which + is what the button_prevsent is for). +*/ +static void UpdatePhysicalDeviceState(void) +{ + const bool clearify_mdr = true; + int mouse_x = MouseState.x, mouse_y = MouseState.y; + + //printf("%08x -- %08x %08x\n", MouseState.button & (MouseState.button_realstate | ~MouseState.button_prevsent), MouseState.button, MouseState.button_realstate); + + PtoV(mouse_x, mouse_y, (int32*)&MouseData[0], (int32*)&MouseData[1]); + MouseData[2] = MouseState.button & (MouseState.button_realstate | ~MouseState.button_prevsent); + + if(clearify_mdr) + { + MouseState.button_prevsent = MouseData[2]; + MouseState.button &= MouseState.button_realstate; + MouseDataRel[0] -= (int32)MouseDataRel[0]; //floor(MouseDataRel[0]); + MouseDataRel[1] -= (int32)MouseDataRel[1]; //floor(MouseDataRel[1]); + } + + MouseDataRel[0] += CurGame->mouse_sensitivity * MouseState.xrel_accum; + MouseDataRel[1] += CurGame->mouse_sensitivity * MouseState.yrel_accum; + + // + // + // + MouseState.xrel_accum = 0; + MouseState.yrel_accum = 0; + // + // + // + + + memcpy(keys, SDL_GetKeyState(0), MKK_COUNT); + + joy_manager->UpdateJoysticks(); + + CurTicks = MDFND_GetTime(); +} + +static void RedoFFSF(void) +{ + if(inff) + RefreshThrottleFPS(MDFN_GetSettingF("ffspeed")); + else if(insf) + RefreshThrottleFPS(MDFN_GetSettingF("sfspeed")); + else + RefreshThrottleFPS(1); +} + + +static void ToggleLayer(int which) +{ + static uint64 le_mask = ~0ULL; // FIXME/TODO: Init to ~0ULL on game load. + + if(CurGame && CurGame->LayerNames) + { + const char *goodies = CurGame->LayerNames; + int x = 0; + + while(x != which) + { + while(*goodies) + goodies++; + goodies++; + if(!*goodies) return; // ack, this layer doesn't exist. + x++; + } + + le_mask ^= (1ULL << which); + MDFNI_SetLayerEnableMask(le_mask); + + if(le_mask & (1ULL << which)) + MDFN_DispMessage(_("%s enabled."), _(goodies)); + else + MDFN_DispMessage(_("%s disabled."), _(goodies)); + } +} + + +// TODO: Remove this in the future when digit-string input devices are better abstracted. +static uint8 BarcodeWorldData[1 + 13]; + +static void CheckCommandKeys(void) +{ + if(IConfig == none && !(cidisabled & 0x1)) + { + if(CK_Check(CK_TOGGLE_HELP)) + Help_Toggle(); + + if(!(cidisabled & 1)) + { + if(CK_Check(CK_EXIT)) + { + SendCEvent(CEVT_WANT_EXIT, NULL, NULL); + } + } + } + + for(int i = 0; i < 8; i++) + { + if(IConfig == Port1 + i) + { + if(CK_Check((CommandKey)(CK_INPUT_CONFIG1 + i))) + { + ResyncGameInputSettings(i); + IConfig = none; + //SetJoyReadMode(1); + MDFNI_DispMessage(_("Configuration interrupted.")); + } + else if(ConfigDevice(i)) + { + ResyncGameInputSettings(i); + ICDeadDelay = CurTicks + 300; + IConfig = none; + //SetJoyReadMode(1); + } + break; + } + } + + if(IConfig == Command || IConfig == CommandAM) + { + if(ICLatch != -1) + { + if(subcon(CKeys[ICLatch].text, CKeysConfig[ICLatch].bc, 1)) + { + MDFNI_DispMessage(_("Configuration finished.")); + + MDFNI_SetSetting(CKeysSettingName[ICLatch], BCsToString(CKeysConfig[ICLatch].bc, CKeysConfig[ICLatch].AND_Mode).c_str()); + ICDeadDelay = CurTicks + 300; + IConfig = none; + //SetJoyReadMode(1); + CKeysLastState[ICLatch] = 1; // We don't want to accidentally trigger the command. :b + return; + } + } + else + { + int x; + MDFNI_DispMessage(_("Press command key to remap now%s..."), (IConfig == CommandAM) ? _("(AND Mode)") : ""); + for(x = (int)_CK_FIRST; x < (int)_CK_COUNT; x++) + if(CK_Check((CommandKey)x)) + { + ICLatch = x; + CKeysConfig[ICLatch].AND_Mode = (IConfig == CommandAM); + subcon_begin(CKeysConfig[ICLatch].bc); + break; + } + } + } + + if(CK_Check(CK_TOGGLE_CDISABLE)) + { + cidisabled = cidisabled ? 0 : 0x3; + + if(cidisabled) + MDFNI_DispMessage(_("Command processing disabled.")); + else + MDFNI_DispMessage(_("Command processing enabled.")); + } + + if(cidisabled & 0x1) return; + + if(IConfig != none) + return; + + if(CK_Check(CK_TOGGLE_FPS_VIEW)) + FPS_ToggleView(); + + if(!CurGame) + return; + + if(CK_Check(CK_ADVANCE_FRAME)) + DoFrameAdvance(); + + if(CK_Check(CK_RUN_NORMAL)) + DoRunNormal(); + + { + for(int i = 0; i < 8; i++) + { + if(CK_Check((CommandKey)(CK_INPUT_CONFIG1 + i))) + { + if(!PortButtConfig[i].size()) + { + MDFN_DispMessage(_("No buttons to configure for input port %u!"), i + 1); + } + else + { + //SetJoyReadMode(0); + ConfigDeviceBegin(); + IConfig = (ICType)(Port1 + i); + } + } + } + + if(CK_Check(CK_INPUT_CONFIGC)) + { + //SetJoyReadMode(0); + ConfigDeviceBegin(); + ICLatch = -1; + IConfig = Command; + } + + if(CK_Check(CK_INPUT_CONFIGC_AM)) + { + //SetJoyReadMode(0); + ConfigDeviceBegin(); + ICLatch = -1; + IConfig = CommandAM; + } + + if(CK_Check(CK_INPUT_CONFIG_ABD)) + { + MDFN_DispMessage("%u joystick/gamepad analog button(s) detected.", joy_manager->DetectAnalogButtonsForChangeCheck()); + } + } + + if(CK_Check(CK_ROTATESCREEN)) + { + if(CurGame->rotated == MDFN_ROTATE0) + CurGame->rotated = MDFN_ROTATE90; + else if(CurGame->rotated == MDFN_ROTATE90) + CurGame->rotated = MDFN_ROTATE270; + else if(CurGame->rotated == MDFN_ROTATE270) + CurGame->rotated = MDFN_ROTATE0; + + GT_ReinitVideo(); + } + + if(CK_CheckActive(CK_STATE_REWIND)) + DNeedRewind = TRUE; + else + DNeedRewind = FALSE; + + if(CK_Check(CK_STATE_REWIND_TOGGLE)) + { + RewindState = !RewindState; + MDFNI_EnableStateRewind(RewindState); + + MDFNI_DispMessage(RewindState ? _("State rewinding functionality enabled.") : _("State rewinding functionality disabled.")); + } + + { + bool previous_ff = inff; + bool previous_sf = insf; + + if(fftoggle_setting) + inff ^= CK_Check(CK_FAST_FORWARD); + else + inff = CK_CheckActive(CK_FAST_FORWARD); + + if(sftoggle_setting) + insf ^= CK_Check(CK_SLOW_FORWARD); + else + insf = CK_CheckActive(CK_SLOW_FORWARD); + + if(previous_ff != inff || previous_sf != insf) + RedoFFSF(); + } + + if(CurGame->GameType == GMT_DISK || CurGame->GameType == GMT_CDROM) + { + if(CK_Check(CK_SELECT_DISK)) + { + MDFNI_DiskSelect(); + } + if(CK_Check(CK_INSERTEJECT_DISK)) + { + MDFNI_DiskInsert(); + } + } + + if(CurGame->GameType != GMT_PLAYER) + { + for(int i = 0; i < 8; i++) + { + if(CK_Check((CommandKey)(CK_DEVICE_SELECT1 + i))) + IncSelectedDevice(i); + } + } + + if(CK_Check(CK_TAKE_SNAPSHOT)) + pending_snapshot = 1; + +// if(CurGame->GameType != GMT_PLAYER) + { + if(CK_Check(CK_SAVE_STATE)) + pending_save_state = 1; + + if(CK_Check(CK_SAVE_MOVIE)) + pending_save_movie = 1; + + if(CK_Check(CK_LOAD_STATE)) + { + MDFNI_LoadState(NULL, NULL); + } + + if(CK_Check(CK_LOAD_MOVIE)) + { + MDFNI_LoadMovie(NULL); + } + + if(CK_Check(CK_TL1)) + ToggleLayer(0); + if(CK_Check(CK_TL2)) + ToggleLayer(1); + if(CK_Check(CK_TL3)) + ToggleLayer(2); + if(CK_Check(CK_TL4)) + ToggleLayer(3); + if(CK_Check(CK_TL5)) + ToggleLayer(4); + if(CK_Check(CK_TL6)) + ToggleLayer(5); + if(CK_Check(CK_TL7)) + ToggleLayer(6); + if(CK_Check(CK_TL8)) + ToggleLayer(7); + if(CK_Check(CK_TL9)) + ToggleLayer(8); + + if(CK_Check(CK_STATE_SLOT_INC)) + { + MDFNI_SelectState(666 + 1); + } + + if(CK_Check(CK_STATE_SLOT_DEC)) + { + MDFNI_SelectState(666 - 1); + } + } + + if(CK_Check(CK_RESET)) + { + MDFNI_Reset(); + } + + if(CK_Check(CK_POWER)) + { + MDFNI_Power(); + } + + if(CurGame->GameType == GMT_ARCADE) + { + if(CK_Check(CK_INSERT_COIN)) + MDFNI_InsertCoin(); + + if(CK_Check(CK_TOGGLE_DIPVIEW)) + { + ViewDIPSwitches = !ViewDIPSwitches; + MDFNI_ToggleDIPView(); + } + + if(!ViewDIPSwitches) + goto DIPSless; + + if(CK_Check(CK_1)) MDFNI_ToggleDIP(0); + if(CK_Check(CK_2)) MDFNI_ToggleDIP(1); + if(CK_Check(CK_3)) MDFNI_ToggleDIP(2); + if(CK_Check(CK_4)) MDFNI_ToggleDIP(3); + if(CK_Check(CK_5)) MDFNI_ToggleDIP(4); + if(CK_Check(CK_6)) MDFNI_ToggleDIP(5); + if(CK_Check(CK_7)) MDFNI_ToggleDIP(6); + if(CK_Check(CK_8)) MDFNI_ToggleDIP(7); + } + else + { + #ifdef WANT_NES_EMU + static uint8 bbuf[32]; + static int bbuft; + static int barcoder = 0; + + if(!strcmp(CurGame->shortname, "nes") && (!strcmp(PortDevice[4]->ShortName, "bworld") || (CurGame->cspecial && !strcasecmp(CurGame->cspecial, "datach")))) + { + if(CK_Check(CK_ACTIVATE_BARCODE)) + { + barcoder ^= 1; + if(!barcoder) + { + if(!strcmp(PortDevice[4]->ShortName, "bworld")) + { + BarcodeWorldData[0] = 1; + memset(BarcodeWorldData + 1, 0, 13); + + strncpy((char *)BarcodeWorldData + 1, (char *)bbuf, 13); + } + else + MDFNI_DatachSet(bbuf); + MDFNI_DispMessage(_("Barcode Entered")); + } + else { bbuft = 0; MDFNI_DispMessage(_("Enter Barcode"));} + } + } + else + barcoder = 0; + + #define SSM(x) { if(bbuft < 13) {bbuf[bbuft++] = '0' + x; bbuf[bbuft] = 0;} MDFNI_DispMessage(_("Barcode: %s"),bbuf); } + + DIPSless: + + if(barcoder) + { + if(CK_Check(CK_0)) SSM(0); + if(CK_Check(CK_1)) SSM(1); + if(CK_Check(CK_2)) SSM(2); + if(CK_Check(CK_3)) SSM(3); + if(CK_Check(CK_4)) SSM(4); + if(CK_Check(CK_5)) SSM(5); + if(CK_Check(CK_6)) SSM(6); + if(CK_Check(CK_7)) SSM(7); + if(CK_Check(CK_8)) SSM(8); + if(CK_Check(CK_9)) SSM(9); + } + else + #else + DIPSless: ; + #endif + { + //if(CurGame->GameType != GMT_PLAYER) + { + if(CK_Check(CK_0)) MDFNI_SelectState(0); + if(CK_Check(CK_1)) MDFNI_SelectState(1); + if(CK_Check(CK_2)) MDFNI_SelectState(2); + if(CK_Check(CK_3)) MDFNI_SelectState(3); + if(CK_Check(CK_4)) MDFNI_SelectState(4); + if(CK_Check(CK_5)) MDFNI_SelectState(5); + if(CK_Check(CK_6)) MDFNI_SelectState(6); + if(CK_Check(CK_7)) MDFNI_SelectState(7); + if(CK_Check(CK_8)) MDFNI_SelectState(8); + if(CK_Check(CK_9)) MDFNI_SelectState(9); + + if(CK_Check(CK_M0)) MDFNI_SelectMovie(0); + if(CK_Check(CK_M1)) MDFNI_SelectMovie(1); + if(CK_Check(CK_M2)) MDFNI_SelectMovie(2); + if(CK_Check(CK_M3)) MDFNI_SelectMovie(3); + if(CK_Check(CK_M4)) MDFNI_SelectMovie(4); + if(CK_Check(CK_M5)) MDFNI_SelectMovie(5); + if(CK_Check(CK_M6)) MDFNI_SelectMovie(6); + if(CK_Check(CK_M7)) MDFNI_SelectMovie(7); + if(CK_Check(CK_M8)) MDFNI_SelectMovie(8); + if(CK_Check(CK_M9)) MDFNI_SelectMovie(9); + } + } + #undef SSM + } +} + +void MDFND_UpdateInput(bool VirtualDevicesOnly, bool UpdateRapidFire) +{ + static unsigned int rapid=0; + + UpdatePhysicalDeviceState(); + + // + // Check command keys/buttons. CheckCommandKeys() may modify(such as memset to 0) the state of the "keys" array + // under certain circumstances. + // + if(VirtualDevicesOnly) + DoKeyStateZeroing(); // Normally called from CheckCommandKeys(), but since we're not calling CheckCommandKeys() here... + else + CheckCommandKeys(); + + if(UpdateRapidFire) + rapid = (rapid + 1) % (autofirefreq + 1); + + int RotateInput = -1; + + // Do stuff here + for(unsigned int x = 0; x < NumPorts; x++) + { + if(!PortData[x]) + continue; + + // Handle rumbles before we wipe the port data(FIXME: Do we want rumble to work in frame advance mode too?)! + for(int tmi = 0; tmi < PortDevice[x]->NumInputs; tmi++) + { + switch(PortDevice[x]->IDII[tmi].Type) + { + default: + break; + + case IDIT_RUMBLE: + { + uint32 rumble_data = MDFN_de32lsb(((uint8 *)PortData[x] + PortBitOffsets[x][tmi] / 8)); + uint8 weak = (rumble_data >> 0) & 0xFF; + uint8 strong = (rumble_data >> 8) & 0xFF; + + joy_manager->SetRumble(PortButtConfig[x][PortButtConfig[x].size() - 1], weak, strong); + + //printf("Weak: %02x, Strong: %02x\n", weak, strong); + } + break; + } + } + + memset(PortData[x], 0, PortDataSize[x]); + + if(IConfig != none) + continue; + + if(ICDeadDelay > CurTicks) + continue; + else + ICDeadDelay = 0; + + // First, handle buttons + for(unsigned int butt = 0; butt < PortButtConfig[x].size(); butt++) + { + if(CurGame->rotated && PortButtRotateOffsets[x][butt].rotate[CurGame->rotated - 1] != 0xFFFFFFFF) + { + if(RotateInput < 0) + { + char tmp_setting_name[512]; + + trio_snprintf(tmp_setting_name, 512, "%s.rotateinput", CurGame->shortname); + RotateInput = MDFN_GetSettingB(tmp_setting_name); + } + } + + // + // Analog button + // + if(PortButtIsAnalog[x][butt]) + { + uint8 *tptr = (uint8 *)PortData[x]; + uint32 bo = PortButtBitOffsets[x][butt]; + uint32 tv; + + if(CurGame->rotated && PortButtRotateOffsets[x][butt].rotate[CurGame->rotated - 1] != 0xFFFFFFFF) + { + if(RotateInput) + bo = PortButtRotateOffsets[x][butt].rotate[CurGame->rotated - 1]; + } + + tv = std::min(MDFN_de32lsb(&tptr[(bo & 0x7FFFFFFF) / 8]) + DTestButton(PortButtConfig[x][butt], keys, MouseData, true), 32767); + + MDFN_en32lsb(&tptr[(bo & 0x7FFFFFFF) / 8], tv); + } + else if(DTestButton(PortButtConfig[x][butt], keys, MouseData)) // boolean button + { + uint8 *tptr = (uint8 *)PortData[x]; + uint32 bo = PortButtBitOffsets[x][butt]; + + if(CurGame->rotated && PortButtRotateOffsets[x][butt].rotate[CurGame->rotated - 1] != 0xFFFFFFFF) + { + if(RotateInput) + bo = PortButtRotateOffsets[x][butt].rotate[CurGame->rotated - 1]; + } + if(!(bo & 0x80000000) || rapid >= (autofirefreq + 1) / 2) + tptr[(bo & 0x7FFFFFFF) / 8] |= 1 << (bo & 7); + } + } + + // Handle button exclusion! + for(unsigned int butt = 0; butt < PortButtConfig[x].size(); butt++) + { + uint32 bo[2]; + uint8 *tptr = (uint8 *)PortData[x]; + + bo[0] = PortButtBitOffsets[x][butt]; + bo[1] = PortButtExclusionBitOffsets[x][butt]; + + if(bo[1] != 0xFFFFFFFF) + { + //printf("%08x %08x\n", bo[0], bo[1]); + if( (tptr[(bo[0] & 0x7FFFFFFF) / 8] & (1 << (bo[0] & 7))) && (tptr[(bo[1] & 0x7FFFFFFF) / 8] & (1 << (bo[1] & 7))) ) + { + tptr[(bo[0] & 0x7FFFFFFF) / 8] &= ~(1 << (bo[0] & 7)); + tptr[(bo[1] & 0x7FFFFFFF) / 8] &= ~(1 << (bo[1] & 7)); + } + } + } + + // Now, axis and misc data... + for(int tmi = 0; tmi < PortDevice[x]->NumInputs; tmi++) + { + switch(PortDevice[x]->IDII[tmi].Type) + { + default: break; + + case IDIT_BYTE_SPECIAL: + assert(tmi < 13 + 1); + ((uint8 *)PortData[x])[tmi] = BarcodeWorldData[tmi]; + break; + + case IDIT_X_AXIS_REL: + case IDIT_Y_AXIS_REL: + MDFN_en32lsb(((uint8 *)PortData[x] + PortBitOffsets[x][tmi] / 8), (uint32)((PortDevice[x]->IDII[tmi].Type == IDIT_Y_AXIS_REL) ? MouseDataRel[1] : MouseDataRel[0])); + break; + case IDIT_X_AXIS: + case IDIT_Y_AXIS: + { + MDFN_en32lsb(((uint8 *)PortData[x] + PortBitOffsets[x][tmi] / 8), (uint32)((PortDevice[x]->IDII[tmi].Type == IDIT_Y_AXIS) ? MouseData[1] : MouseData[0])); + } + break; + } + } + } + + memset(BarcodeWorldData, 0, sizeof(BarcodeWorldData)); +} + +void InitGameInput(MDFNGI *gi) +{ + autofirefreq = MDFN_GetSettingUI("autofirefreq"); + fftoggle_setting = MDFN_GetSettingB("fftoggle"); + sftoggle_setting = MDFN_GetSettingB("sftoggle"); + + ckdelay = MDFN_GetSettingUI("ckdelay"); + + memset(CKeysPressTime, 0xff, sizeof(CKeysPressTime)); + memset(CKeysLastState, 0, sizeof(CKeysLastState)); + + //SetJoyReadMode(1); // Disable joystick event handling, and allow manual state updates. + + BuildPortsInfo(gi); +} + +// Update setting strings with butt configs. +static void ResyncGameInputSettings(unsigned port) +{ + for(unsigned int x = 0; x < PortButtSettingNames[port].size(); x++) + MDFNI_SetSetting(PortButtSettingNames[port][x], BCsToString( PortButtConfig[port][x] ).c_str()); +} + + +static ButtConfig subcon_bc; +static int subcon_tb; +static int subcon_wc; + +static void subcon_begin(std::vector &bc) +{ + bc.clear(); + + memset(&subcon_bc, 0, sizeof(subcon_bc)); + subcon_tb = -1; + subcon_wc = 0; +} + +/* Configures an individual virtual button. */ +static int subcon(const char *text, std::vector &bc, int commandkey) +{ + while(1) + { + MDFNI_DispMessage("%s (%d)", text, subcon_wc + 1); + + if(subcon_tb != subcon_wc) + { + joy_manager->Reset_BC_ChangeCheck(); + DTryButtonBegin(&subcon_bc, commandkey); + subcon_tb = subcon_wc; + } + + if(DTryButton()) + { + DTryButtonEnd(&subcon_bc); + } + else if(joy_manager->Do_BC_ChangeCheck(&subcon_bc)) + { + + } + else + return(0); + + if(subcon_wc && !memcmp(&subcon_bc, &bc[subcon_wc - 1], sizeof(ButtConfig))) + break; + + bc.push_back(subcon_bc); + subcon_wc++; + } + + //puts("DONE"); + return(1); +} + +static int cd_x; +static int cd_lx = -1; +static void ConfigDeviceBegin(void) +{ + cd_x = 0; + cd_lx = -1; +} + +int ConfigDevice(int arg) +{ + char buf[512]; + + //for(int i = 0; i < PortButtons[arg].size(); i++) + // printf("%d\n", PortButtConfigPrettyPrio[arg][i]); + //exit(1); + + for(;cd_x < (int)PortButtons[arg].size(); cd_x++) + { + int snooty = 0; + + for(unsigned int i = 0; i < PortButtons[arg].size(); i++) + if(PortButtConfigPrettyPrio[arg][i] == cd_x) + snooty = i; + + // For Lynx, GB, GBA, NGP, WonderSwan(especially wonderswan!) + //if(!strcasecmp(PortDevice[arg]->ShortName, "builtin")) // && !arg) + if(NumPorts == 1 && PortPossibleDevices[CurGame->shortname][0].size() == 1) + trio_snprintf(buf, 512, "%s", PortButtons[arg][snooty]); + else + trio_snprintf(buf, 512, "%s %d: %s", PortDevice[arg]->FullName, arg + 1, PortButtons[arg][snooty]); + + if(cd_x != cd_lx) + { + cd_lx = cd_x; + subcon_begin(PortButtConfig[arg][snooty]); + } + if(!subcon(buf, PortButtConfig[arg][snooty], 0)) + return(0); + } + + MDFNI_DispMessage(_("Configuration finished.")); + + return(1); +} + +#include "input-default-buttons.h" +struct cstrcomp +{ + bool operator()(const char * const &a, const char * const &b) const + { + return(strcmp(a, b) < 0); + } +}; + +static std::map DefaultButtonSettingsMap; +static std::vector PendingGarbage; + +static void MakeSettingsForDevice(std::vector &settings, const MDFNGI *system, const int w, const InputDeviceInfoStruct *info) +{ + const ButtConfig *def_bc = NULL; + char setting_def_search[512]; + + PortPossibleDevices[system->shortname][w].push_back(info); + + trio_snprintf(setting_def_search, 512, "%s.input.%s.%s", system->shortname, system->InputInfo->Types[w].ShortName, info->ShortName); + CleanSettingName(setting_def_search); + + { + std::map::iterator fit = DefaultButtonSettingsMap.find(setting_def_search); + if(fit != DefaultButtonSettingsMap.end()) + def_bc = fit->second->bc; + } + + //for(unsigned int d = 0; d < sizeof(defset) / sizeof(DefaultSettingsMeow); d++) + //{ + // if(!strcasecmp(setting_def_search, defset[d].base_name)) + // { + // def_bc = defset[d].bc; + // break; + // } + //} + + int butti = 0; + + for(int x = 0; x < info->NumInputs; x++) + { + if(info->IDII[x].Type != IDIT_BUTTON && info->IDII[x].Type != IDIT_BUTTON_CAN_RAPID && info->IDII[x].Type != IDIT_BUTTON_ANALOG) + continue; + + if(NULL == info->IDII[x].SettingName) + continue; + + MDFNSetting tmp_setting; + + const char *default_value = ""; + + if(def_bc) + PendingGarbage.push_back((void *)(default_value = strdup(BCToString(def_bc[butti]).c_str()) )); + + //printf("Maketset: %s %s\n", setting_name, default_value); + + memset(&tmp_setting, 0, sizeof(tmp_setting)); + + PendingGarbage.push_back((void *)(tmp_setting.name = CleanSettingName(trio_aprintf("%s.input.%s.%s.%s", system->shortname, system->InputInfo->Types[w].ShortName, info->ShortName, info->IDII[x].SettingName)) )); + PendingGarbage.push_back((void *)(tmp_setting.description = trio_aprintf("%s, %s, %s: %s", system->shortname, system->InputInfo->Types[w].FullName, info->FullName, info->IDII[x].Name) )); + tmp_setting.type = MDFNST_STRING; + tmp_setting.default_value = default_value; + + tmp_setting.flags = MDFNSF_SUPPRESS_DOC; + tmp_setting.description_extra = NULL; + + settings.push_back(tmp_setting); + + // Now make a rapid butt-on-stick-on-watermelon + if(info->IDII[x].Type == IDIT_BUTTON_CAN_RAPID) + { + memset(&tmp_setting, 0, sizeof(tmp_setting)); + + PendingGarbage.push_back((void *)( tmp_setting.name = CleanSettingName(trio_aprintf("%s.input.%s.%s.rapid_%s", system->shortname, system->InputInfo->Types[w].ShortName, info->ShortName, info->IDII[x].SettingName)) )); + PendingGarbage.push_back((void *)( tmp_setting.description = trio_aprintf("%s, %s, %s: Rapid %s", system->shortname, system->InputInfo->Types[w].FullName, info->FullName, info->IDII[x].Name) )); + tmp_setting.type = MDFNST_STRING; + + tmp_setting.default_value = ""; + + tmp_setting.flags = MDFNSF_SUPPRESS_DOC; + tmp_setting.description_extra = NULL; + + settings.push_back(tmp_setting); + } + butti++; + } +} + + +static void MakeSettingsForPort(std::vector &settings, const MDFNGI *system, const int w, const InputPortInfoStruct *info) +{ +#if 1 + if(info->NumTypes > 1) + { + MDFNSetting tmp_setting; + MDFNSetting_EnumList *EnumList; + + memset(&tmp_setting, 0, sizeof(MDFNSetting)); + + EnumList = (MDFNSetting_EnumList *)calloc(sizeof(MDFNSetting_EnumList), info->NumTypes + 1); + + for(int device = 0; device < info->NumTypes; device++) + { + const InputDeviceInfoStruct *dinfo = &info->DeviceInfo[device]; + + EnumList[device].string = strdup(dinfo->ShortName); + EnumList[device].number = device; + EnumList[device].description = strdup(info->DeviceInfo[device].FullName); + EnumList[device].description_extra = info->DeviceInfo[device].Description ? strdup(info->DeviceInfo[device].Description) : NULL; + + PendingGarbage.push_back((void *)EnumList[device].string); + PendingGarbage.push_back((void *)EnumList[device].description); + } + + PendingGarbage.push_back(EnumList); + + tmp_setting.name = trio_aprintf("%s.input.%s", system->shortname, info->ShortName); + PendingGarbage.push_back((void *)tmp_setting.name); + + tmp_setting.description = trio_aprintf("Input device for %s", info->FullName); + PendingGarbage.push_back((void *)tmp_setting.description); + + tmp_setting.type = MDFNST_ENUM; + tmp_setting.default_value = info->DefaultDevice; + + assert(info->DefaultDevice); + + tmp_setting.flags = MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE; + tmp_setting.description_extra = NULL; + tmp_setting.enum_list = EnumList; + + settings.push_back(tmp_setting); + } +#endif + + for(int device = 0; device < info->NumTypes; device++) + { + const InputDeviceInfoStruct *dinfo = &info->DeviceInfo[device]; + + if(dinfo->PortExpanderDeviceInfo) + { + fprintf(stderr, "PortExpanderDeviceInfo support is incomplete."); + abort(); + + const InputPortInfoStruct *sub_ports = (const InputPortInfoStruct *)dinfo->PortExpanderDeviceInfo; + const int sub_port_count = dinfo->NumInputs; + + PortPossibleDevices[system->shortname][w].push_back(&info->DeviceInfo[device]); + + for(int sub_port = 0; sub_port < sub_port_count; sub_port++) + { + MakeSettingsForPort(settings, system, w + sub_port, &sub_ports[sub_port]); + } + //for(int sub_device = 0; sub_device < dinfo->PortExp + } + else + { + MakeSettingsForDevice(settings, system, w, &info->DeviceInfo[device]); + } + } +} + +// Called on emulator startup +void MakeInputSettings(std::vector &settings) +{ + // Construct default button group map + for(unsigned int d = 0; d < sizeof(defset) / sizeof(DefaultSettingsMeow); d++) + DefaultButtonSettingsMap[defset[d].base_name] = &defset[d]; + + // First, build system settings + for(unsigned int x = 0; x < MDFNSystems.size(); x++) + { + if(MDFNSystems[x]->InputInfo) + { + PortPossibleDevices[MDFNSystems[x]->shortname] = new SnugglyWuggly[16]; + + assert(MDFNSystems[x]->InputInfo->InputPorts <= 16); + + for(int port = 0; port < MDFNSystems[x]->InputInfo->InputPorts; port++) + MakeSettingsForPort(settings, MDFNSystems[x], port, &MDFNSystems[x]->InputInfo->Types[port]); + } + } + DefaultButtonSettingsMap.clear(); + + // Now build command key settings + for(int x = 0; x < _CK_COUNT; x++) + { + MDFNSetting tmp_setting; + + memset(&tmp_setting, 0, sizeof(MDFNSetting)); + + CKeysSettingName[x] = trio_aprintf("command.%s", CKeys[x].text); + tmp_setting.name = CKeysSettingName[x]; + PendingGarbage.push_back((void *)( CKeysSettingName[x] )); + + tmp_setting.description = CKeys[x].description; + tmp_setting.type = MDFNST_STRING; + + tmp_setting.flags = MDFNSF_SUPPRESS_DOC; + tmp_setting.description_extra = NULL; + + PendingGarbage.push_back((void *)( tmp_setting.default_value = strdup(BCsToString(CKeys[x].bc, 2).c_str()) )); + settings.push_back(tmp_setting); + } +} + +void KillGameInput(void) +{ + KillPortsInfo(); +} + +bool InitCommandInput(MDFNGI* gi) +{ + // Load the command key mappings from settings + for(int x = 0; x < _CK_COUNT; x++) + { + CKeysConfig[x].AND_Mode = StringToBC(MDFN_GetSettingS(CKeysSettingName[x]).c_str(), CKeysConfig[x].bc); + } + return(1); +} + +void KillCommandInput(void) +{ + +} + +void KillInputSettings(void) +{ + for(unsigned int x = 0; x < PendingGarbage.size(); x++) + free(PendingGarbage[x]); + + PendingGarbage.clear(); +} + diff --git a/Mednafen/mednafen/drivers_dos/input.h b/Mednafen/mednafen/drivers_dos/input.h new file mode 100644 index 0000000000..348b514e9b --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/input.h @@ -0,0 +1,35 @@ +#ifndef _MDFN_DRIVERS_INPUT_H +#define _MDFN_DRIVERS_INPUT_H + +typedef struct { + uint8 ButtType; + uint8 DeviceNum; + uint32 ButtonNum; + uint64 DeviceID; +} ButtConfig; + +#define BUTTC_NONE 0x00 +#define BUTTC_KEYBOARD 0x01 +#define BUTTC_JOYSTICK 0x02 +#define BUTTC_MOUSE 0x03 + +#define MKK(k) MDFNK_##k +#define MKK_COUNT (MDFNK_LAST+1) + +// Called after a game is loaded. +void InitGameInput(MDFNGI *GI); + +// Called when a game is closed. +void KillGameInput(void); + +void MDFND_UpdateInput(bool VirtualDevicesOnly = false, bool UpdateRapidFire = true); + +void MakeInputSettings(std::vector &settings); +void KillInputSettings(void); // Called after MDFNI_Kill() is called + +extern bool DNeedRewind; // Only read/write in game thread. + +bool InitCommandInput(MDFNGI* gi); +void KillCommandInput(void); + +#endif diff --git a/Mednafen/mednafen/drivers_dos/main.cpp b/Mednafen/mednafen/drivers_dos/main.cpp new file mode 100644 index 0000000000..cb02f85902 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/main.cpp @@ -0,0 +1,859 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "main.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "input.h" +#include "Joystick.h" +#include "video.h" +#include "sound.h" +//#include "fps.h" +//#include "video-state.h" +#include "ers.h" +#include + +JoystickManager *joy_manager = NULL; +bool pending_save_state, pending_snapshot, pending_save_movie; +static bool ffnosound; + +static MDFNSetting_EnumList VDriver_List[] = +{ + { "vga", 0/*VDRIVER_VGA*/, "VGA", gettext_noop("8-bit VGA.") }, + + //{ "vbe3", VDRIVER_SOFTSDL, "VBE 3.0", gettext_noop("VESA BIOS Extensions 3.0") }, + + { NULL, 0 }, +}; + +static MDFNSetting_EnumList SDriver_List[] = +{ + { "default", -1, "Default", gettext_noop("Default sound driver.") }, + + { "es1370", -1, "ES1370", gettext_noop("Ensoniq ES1370. Used on the \"AudioPCI\", and some other PCI \"Sound Blaster\"-branded cards.") }, + { "es1371", -1, "ES1371", gettext_noop("Ensoniq ES1371/ES1373/CT5880. Used on the \"AudioPCI 97\", and many other PCI \"Sound Blaster\" and \"Vibra\"-branded cards.") }, + + { "cmi8738", -1, "CMI8738", gettext_noop("C-Media CMI-8738.") }, + + { "sb", -1, "Sound Blaster", gettext_noop("ISA Sound Blaster cards; Sound Blaster 2.0, Pro, 16, AWE32, AWE64, etc.") }, + + { NULL, 0 }, +}; + +static std::vector NeoDriverSettings; +static MDFNSetting DriverSettings[] = +{ + { "input.joystick.axis_threshold", MDFNSF_NOFLAGS, gettext_noop("Analog axis binary press detection threshold."), gettext_noop("Threshold for detecting a digital-like \"button\" press on analog axis, in percent."), MDFNST_FLOAT, "75", "0", "100" }, + { "input.autofirefreq", MDFNSF_NOFLAGS, gettext_noop("Auto-fire frequency."), gettext_noop("Auto-fire frequency = GameSystemFrameRateHz / (value + 1)"), MDFNST_UINT, "3", "0", "1000" }, + { "input.ckdelay", MDFNSF_NOFLAGS, gettext_noop("Dangerous key action delay."), gettext_noop("The length of time, in milliseconds, that a button/key corresponding to a \"dangerous\" command like power, reset, exit, etc. must be pressed before the command is executed."), MDFNST_UINT, "0", "0", "99999" }, + + { "video.driver", MDFNSF_NOFLAGS, gettext_noop("Video output method/driver."), NULL, MDFNST_ENUM, "vga", NULL, NULL, NULL,NULL, VDriver_List }, + + { "video.frameskip", MDFNSF_NOFLAGS, gettext_noop("Enable frameskip during emulation rendering."), + gettext_noop("Disable for rendering code performance testing."), MDFNST_BOOL, "1" }, + + { "ffspeed", MDFNSF_NOFLAGS, gettext_noop("Fast-forwarding speed multiplier."), NULL, MDFNST_FLOAT, "4", "1", "15" }, + { "fftoggle", MDFNSF_NOFLAGS, gettext_noop("Treat the fast-forward button as a toggle."), NULL, MDFNST_BOOL, "0" }, + { "ffnosound", MDFNSF_NOFLAGS, gettext_noop("Silence sound output when fast-forwarding."), NULL, MDFNST_BOOL, "0" }, + + { "sfspeed", MDFNSF_NOFLAGS, gettext_noop("SLOW-forwarding speed multiplier."), NULL, MDFNST_FLOAT, "0.75", "0.25", "1" }, + { "sftoggle", MDFNSF_NOFLAGS, gettext_noop("Treat the SLOW-forward button as a toggle."), NULL, MDFNST_BOOL, "0" }, + + { "nothrottle", MDFNSF_NOFLAGS, gettext_noop("Disable speed throttling when sound is disabled."), NULL, MDFNST_BOOL, "0"}, + { "autosave", MDFNSF_NOFLAGS, gettext_noop("Automatic load/save state on game load/save."), gettext_noop("Automatically save and load save states when a game is closed or loaded, respectively."), MDFNST_BOOL, "0"}, + { "sound.driver", MDFNSF_NOFLAGS, gettext_noop("Select sound driver."), gettext_noop("The following choices are possible, sorted by preference, high to low, when \"default\" driver is used, but dependent on being compiled in."), MDFNST_ENUM, "default", NULL, NULL, NULL, NULL, SDriver_List }, + { "sound.device", MDFNSF_NOFLAGS, gettext_noop("Select sound output device."), gettext_noop("When using ALSA sound output under Linux, the \"sound.device\" setting \"default\" is Mednafen's default, IE \"hw:0\", not ALSA's \"default\". If you want to use ALSA's \"default\", use \"sexyal-literal-default\"."), MDFNST_STRING, "default", NULL, NULL }, + { "sound.volume", MDFNSF_NOFLAGS, gettext_noop("Sound volume level, in percent."), gettext_noop("Setting this volume control higher than the default of \"100\" may severely distort the sound."), MDFNST_UINT, "100", "0", "150" }, + { "sound", MDFNSF_NOFLAGS, gettext_noop("Enable sound output."), NULL, MDFNST_BOOL, "1" }, + { "sound.period_time", MDFNSF_NOFLAGS, gettext_noop("Desired period size in microseconds."), gettext_noop("Currently only affects OSS, ALSA, WASAPI, and SDL output. A value of 0 defers to the default in the driver code in SexyAL.\n\nNote: This is not the \"sound buffer size\" setting, that would be \"sound.buffer_time\"."), MDFNST_UINT, "0", "0", "100000" }, + { "sound.buffer_time", MDFNSF_NOFLAGS, gettext_noop("Desired total buffer size in milliseconds."), NULL, MDFNST_UINT, "32", "1", "1000" }, + { "sound.rate", MDFNSF_NOFLAGS, gettext_noop("Specifies the sound playback rate, in sound frames per second(\"Hz\")."), NULL, MDFNST_UINT, "48000", "22050", "192000"}, + + { "osd.state_display_time", MDFNSF_NOFLAGS, gettext_noop("The length of time, in milliseconds, to display the save state or the movie selector after selecting a state or movie."), NULL, MDFNST_UINT, "2000", "0", "15000" }, + { "osd.alpha_blend", MDFNSF_NOFLAGS, gettext_noop("Enable alpha blending for OSD elements."), NULL, MDFNST_BOOL, "1" }, +}; + +static char *DrBaseDirectory; + +MDFNGI *CurGame=NULL; + +void MDFND_PrintError(const char *s) +{ + puts(s); + fflush(stdout); +} + +void MDFND_Message(const char *s) +{ + fputs(s,stdout); + fflush(stdout); +} + +// CreateDirs should make sure errno is intact after calling mkdir() if it fails. +static bool CreateDirs(void) +{ + const char *subs[7] = { "mcs", "mcm", "snaps", "palettes", "sav", "cheats", "firmware" }; + char *tdir; + + if(MDFN_mkdir(DrBaseDirectory, S_IRWXU) == -1 && errno != EEXIST) + { + return(FALSE); + } + + for(unsigned int x = 0; x < sizeof(subs) / sizeof(const char *); x++) + { + tdir = trio_aprintf("%s" PSS "%s",DrBaseDirectory,subs[x]); + if(MDFN_mkdir(tdir, S_IRWXU) == -1 && errno != EEXIST) + { + free(tdir); + return(FALSE); + } + free(tdir); + } + + return(TRUE); +} + +#if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + +static const char *SiginfoString = NULL; +static bool volatile SignalSafeExitWanted = false; +typedef struct +{ + int number; + const char *name; + const char *message; + const char *translated; // Needed since gettext() can potentially deadlock when used in a signal handler. + const bool SafeTryExit; +} SignalInfo; + +static SignalInfo SignalDefs[] = +{ + #ifdef SIGINT + { SIGINT, "SIGINT", gettext_noop("How DARE you interrupt me!\n"), NULL, TRUE }, + #endif + + #ifdef SIGTERM + { SIGTERM, "SIGTERM", gettext_noop("MUST TERMINATE ALL HUMANS\n"), NULL, TRUE }, + #endif + + #ifdef SIGHUP + { SIGHUP, "SIGHUP", gettext_noop("Reach out and hang-up on someone.\n"), NULL, FALSE }, + #endif + + #ifdef SIGSEGV + { SIGSEGV, "SIGSEGV", gettext_noop("Iyeeeeeeeee!!! A segmentation fault has occurred. Have a fluffy day.\n"), NULL, FALSE }, + #endif + + #ifdef SIGPIPE + { SIGPIPE, "SIGPIPE", gettext_noop("The pipe has broken! Better watch out for floods...\n"), NULL, FALSE }, + #endif + + #if defined(SIGBUS) && SIGBUS != SIGSEGV + /* SIGBUS can == SIGSEGV on some platforms */ + { SIGBUS, "SIGBUS", gettext_noop("I told you to be nice to the driver.\n"), NULL, FALSE }, + #endif + + #ifdef SIGFPE + { SIGFPE, "SIGFPE", gettext_noop("Those darn floating points. Ne'er know when they'll bite!\n"), NULL, FALSE }, + #endif + + #ifdef SIGALRM + { SIGALRM, "SIGALRM", gettext_noop("Don't throw your clock at the meowing cats!\n"), NULL, TRUE }, + #endif + + #ifdef SIGABRT + { SIGABRT, "SIGABRT", gettext_noop("Abort, Retry, Ignore, Fail?\n"), NULL, FALSE }, + #endif + + #ifdef SIGUSR1 + { SIGUSR1, "SIGUSR1", gettext_noop("Killing your processes is not nice.\n"), NULL, TRUE }, + #endif + + #ifdef SIGUSR2 + { SIGUSR2, "SIGUSR2", gettext_noop("Killing your processes is not nice.\n"), NULL, TRUE }, + #endif +}; + +static volatile int SignalSTDOUT; + +static void SetSignals(void (*t)(int)) +{ + SignalSTDOUT = fileno(stdout); + + SiginfoString = _("\nSignal has been caught and dealt with: "); + for(unsigned int x = 0; x < sizeof(SignalDefs) / sizeof(SignalInfo); x++) + { + if(!SignalDefs[x].translated) + SignalDefs[x].translated = _(SignalDefs[x].message); + + #ifdef HAVE_SIGACTION + struct sigaction act; + + memset(&act, 0, sizeof(struct sigaction)); + + act.sa_handler = t; + act.sa_flags = 0; + #ifdef SA_RESTART + act.sa_flags |= SA_RESTART; + #endif + + sigaction(SignalDefs[x].number, &act, NULL); + #else + signal(SignalDefs[x].number, t); + #endif + } +} + +static void SignalPutString(const char *string) +{ + size_t count = 0; + + while(string[count]) { count++; } + + write(SignalSTDOUT, string, count); +} + +static void CloseStuff(int signum) +{ + const int save_errno = errno; + const char *name = "unknown"; + const char *translated = NULL; + bool safetryexit = false; + + for(unsigned int x = 0; x < sizeof(SignalDefs) / sizeof(SignalInfo); x++) + { + if(SignalDefs[x].number == signum) + { + name = SignalDefs[x].name; + translated = SignalDefs[x].translated; + safetryexit = SignalDefs[x].SafeTryExit; + break; + } + } + + SignalPutString(SiginfoString); + SignalPutString(name); + SignalPutString("\n"); + SignalPutString(translated); + + if(safetryexit) + { + SignalSafeExitWanted = safetryexit; + errno = save_errno; + return; + } + + _exit(1); +} +#endif + +static ARGPSTRUCT *MDFN_Internal_Args = NULL; + +static int HokeyPokeyFallDown(const char *name, const char *value) +{ + if(!MDFNI_SetSetting(name, value)) + return(0); + return(1); +} + +static void DeleteInternalArgs(void) +{ + if(!MDFN_Internal_Args) return; + ARGPSTRUCT *argptr = MDFN_Internal_Args; + + do + { + free((void*)argptr->name); + argptr++; + } while(argptr->name || argptr->var || argptr->subs); + free(MDFN_Internal_Args); + MDFN_Internal_Args = NULL; +} + +static void MakeMednafenArgsStruct(void) +{ + const std::multimap *settings; + std::multimap ::const_iterator sit; + + settings = MDFNI_GetSettings(); + + MDFN_Internal_Args = (ARGPSTRUCT *)malloc(sizeof(ARGPSTRUCT) * (1 + settings->size())); + + unsigned int x = 0; + + for(sit = settings->begin(); sit != settings->end(); sit++) + { + MDFN_Internal_Args[x].name = strdup(sit->second.name); + MDFN_Internal_Args[x].description = _(sit->second.desc->description); + MDFN_Internal_Args[x].var = NULL; + MDFN_Internal_Args[x].subs = (void *)HokeyPokeyFallDown; + MDFN_Internal_Args[x].substype = SUBSTYPE_FUNCTION; + x++; + } + MDFN_Internal_Args[x].name = NULL; + MDFN_Internal_Args[x].var = NULL; + MDFN_Internal_Args[x].subs = NULL; +} + +static char* loadcd = NULL; // Deprecated +static int physcd = 0; + +static char * force_module_arg = NULL; +static int DoArgs(int argc, char *argv[], char **filename) +{ + int ShowCLHelp = 0; + + char *dsfn = NULL; + char *dmfn = NULL; + + ARGPSTRUCT MDFNArgs[] = + { + { "help", _("Show help!"), &ShowCLHelp, 0, 0 }, + + // -loadcd is deprecated and only still supported because it's been around for yeaaaars. + { "loadcd", NULL/*_("Load and boot a CD for the specified system.")*/, 0, &loadcd, SUBSTYPE_STRING_ALLOC }, + + { "physcd", _("Load and boot from a physical CD, treating [FILE] as the optional device name."), &physcd, 0, 0 }, + + { "force_module", _("Force usage of specified emulation module."), 0, &force_module_arg, SUBSTYPE_STRING_ALLOC }, + + { "dump_settings_def", _("Dump settings definition data to specified file."), 0, &dsfn, SUBSTYPE_STRING_ALLOC }, + { "dump_modules_def", _("Dump modules definition data to specified file."), 0, &dmfn, SUBSTYPE_STRING_ALLOC }, + + { 0, NULL, (int *)MDFN_Internal_Args, 0, 0}, + + { 0, 0, 0, 0 } + }; + + const char *usage_string = _("Usage: %s [OPTION]... [FILE]\n"); + if(argc <= 1) + { + printf(_("No command-line arguments specified.\n\n")); + printf(usage_string, argv[0]); + printf(_("\tPlease refer to the documentation for option parameters and usage.\n\n")); + return(0); + } + else + { + if(!ParseArguments(argc - 1, &argv[1], MDFNArgs, filename)) + return(0); + + if(ShowCLHelp) + { + printf(usage_string, argv[0]); + ShowArgumentsHelp(MDFNArgs, false); + printf("\n"); + printf(_("Each setting(listed in the documentation) can also be passed as an argument by prefixing the name with a hyphen,\nand specifying the value to change the setting to as the next argument.\n\n")); + printf(_("For example:\n\t%s -pce.stretch aspect -pce.pixshader autoipsharper \"Hyper Bonk Soldier.pce\"\n\n"), argv[0]); + printf(_("Settings specified in this manner are automatically saved to the configuration file, hence they\ndo not need to be passed to future invocations of the Mednafen executable.\n")); + printf("\n"); + return(0); + } + + if(dsfn) + MDFNI_DumpSettingsDef(dsfn); + + if(dmfn) + MDFNI_DumpModulesDef(dmfn); + + if(dsfn || dmfn) + return(0); + + if(*filename == NULL && loadcd == NULL && physcd == 0) + { + MDFN_PrintError(_("No game filename specified!")); + return(0); + } + } + return(1); +} + +bool MDFND_Update(MDFN_Surface *surface, MDFN_Rect *rect, MDFN_Rect *lw, int16 *Buffer, int Count); + +bool sound_active; // true if sound is enabled and initialized + + +static EmuRealSyncher ers; + +static int LoadGame(const char *force_module, const char *path) +{ + MDFNGI *tmp; + + CloseGame(); + + pending_save_state = 0; + pending_save_movie = 0; + pending_snapshot = 0; + + if(physcd) + { + if(!(tmp = MDFNI_LoadCD(force_module, path, true))) + return(0); + } + else if(loadcd) // Deprecated + { + const char *system = loadcd; + bool is_physical = false; + + if(!system) + system = force_module; + + if(path == NULL) + is_physical = true; + else + { + int sr; + //int se; + struct stat sb; + + sr = stat(path, &sb); + //se = errno; + + if(!sr && !S_ISREG(sb.st_mode)) + //if(sr || !S_ISREG(sb.st_mode)) + is_physical = true; + } + + if(!(tmp = MDFNI_LoadCD(system, path, is_physical))) + return(0); + } + else + { + if(!(tmp=MDFNI_LoadGame(force_module, path))) + return 0; + } + CurGame = tmp; + //InitGameInput(tmp); + //InitCommandInput(tmp); + + RefreshThrottleFPS(1); + + if(MDFN_GetSettingB("autosave")) + MDFNI_LoadState(NULL, "mcq"); + + ers.SetEmuClock(CurGame->MasterClock >> 32); + + ffnosound = MDFN_GetSettingB("ffnosound"); + + return 1; +} + +/* Closes a game and frees memory. */ +int CloseGame(void) +{ + if(!CurGame) + return(0); + + if(MDFN_GetSettingB("autosave")) + MDFNI_SaveState(NULL, "mcq", NULL, NULL, NULL); + + MDFNI_CloseGame(); + + //KillCommandInput(); + //KillGameInput(); + + CurGame = NULL; + + return(1); +} + +static int NeedExitNow = 0; +double CurGameSpeed = 1; + +void MainRequestExit(void) +{ + NeedExitNow = 1; +} + +static void UpdateSoundSync(int16 *Buffer, int Count) +{ + if(Count) + { + if(ffnosound && CurGameSpeed != 1) + { + for(int x = 0; x < Count * CurGame->soundchan; x++) + Buffer[x] = 0; + } + int32 max = GetWriteSound(); + + if(Count >= (max * 0.95)) + { + ers.SetETtoRT(); + } + + WriteSound(Buffer, Count); + } + else + { + bool nothrottle = MDFN_GetSettingB("nothrottle"); + + if(!nothrottle) + ers.Sync(); + } +} + +void MDFND_MidSync(const EmulateSpecStruct *espec) +{ + ers.AddEmuTime((espec->MasterCycles - espec->MasterCyclesALMS) / CurGameSpeed, false); + + UpdateSoundSync(espec->SoundBuf + (espec->SoundBufSizeALMS * CurGame->soundchan), espec->SoundBufSize - espec->SoundBufSizeALMS); + + //MDFND_UpdateInput(true, false); +} + +static void MainLoop(void) +{ + while(!NeedExitNow && !SignalSafeExitWanted) + { + EmulateSpecStruct espec; + int fskip; + + memset(&espec, 0, sizeof(EmulateSpecStruct)); + + fskip = ers.NeedFrameSkip(); + + if(!MDFN_GetSettingB("video.frameskip")) + fskip = 0; + + if(pending_snapshot || pending_save_state || pending_save_movie) + fskip = 0; + + Video_GetSurface(&espec.surface, &espec.LineWidths); + espec.LineWidths[0].w = ~0; + espec.skip = fskip; + espec.soundmultiplier = CurGameSpeed; + espec.NeedRewind = false; //DNeedRewind; + + espec.SoundRate = GetSoundRate(); + espec.SoundBuf = GetEmuModSoundBuffer(&espec.SoundBufMaxSize); + espec.SoundVolume = (double)MDFN_GetSettingUI("sound.volume") / 100; + + MDFNI_Emulate(&espec); + + ers.AddEmuTime((espec.MasterCycles - espec.MasterCyclesALMS) / CurGameSpeed); + + //FPS_IncVirtual(); + //if(!fskip) + // FPS_IncDrawn(); + + UpdateSoundSync(espec.SoundBuf + (espec.SoundBufSizeALMS * CurGame->soundchan), espec.SoundBufSize - espec.SoundBufSizeALMS); + + //MDFND_UpdateInput(); + + if(!fskip) + { + if(pending_snapshot) + MDFNI_SaveSnapshot(espec.surface, &espec.DisplayRect, espec.LineWidths); + + if(pending_save_state) + MDFNI_SaveState(NULL, NULL, espec.surface, &espec.DisplayRect, espec.LineWidths); + + if(pending_save_movie) + MDFNI_SaveMovie(NULL, espec.surface, &espec.DisplayRect, espec.LineWidths); + + pending_save_movie = pending_snapshot = pending_save_state = 0; + + Video_Blit(&espec); + } + } +} + +char* GetBaseDirectory(const char* argv0) +{ + char *ol; + char *ret; + + ol = getenv("MEDNAFEN_HOME"); + if(ol != NULL && ol[0] != 0) + { + ret = strdup(ol); + return(ret); + } + + ol = getenv("HOME"); + + if(ol) + { + ret=(char *)malloc(strlen(ol)+1+strlen(PSS ".mednafen")); + strcpy(ret,ol); + strcat(ret, PSS ".mednafen"); + return(ret); + } + + #ifdef WIN32 + { + char *sa; + + ret=(char *)malloc(MAX_PATH+1); + GetModuleFileName(NULL,ret,MAX_PATH+1); + + sa=strrchr(ret,'\\'); + if(sa) + *sa = 0; + return(ret); + } + #endif + + #ifdef DOS + { + char* s1,* s2; + + s1 = strrchr(argv0, '/'); + s2 = strrchr(argv0, '\\'); + + if(s1 < s2) + s1 = s2; + + if(s1 != NULL) + { + ret = (char*)malloc(s1 - argv0 + 1); + memcpy(ret, argv0, s1 - argv0); + ret[s1 - argv0] = 0; + return(ret); + } + } + #endif + + ret = (char *)malloc(1); + ret[0] = 0; + return(ret); +} + +void RefreshThrottleFPS(double multiplier) +{ + CurGameSpeed = multiplier; +} + +void PrintCompilerVersion(void) +{ + #if defined(__GNUC__) + MDFN_printf(_("Compiled with gcc %s\n"), __VERSION__); + #endif +} + +#ifdef HAVE_LIBSNDFILE + #include +#endif + +void PrintLIBSNDFILEVersion(void) +{ + #ifdef HAVE_LIBSNDFILE + MDFN_printf(_("Running with %s\n"), sf_version_string()); + #endif +} + +void PrintZLIBVersion(void) +{ + #ifdef ZLIB_VERSION + MDFN_printf(_("Compiled against zlib %s, running with zlib %s\n"), ZLIB_VERSION, zlibVersion()); + #endif +} + +int main(int argc, char *argv[]) +{ + std::vector ExternalSystems; + char *needie = NULL; + + DrBaseDirectory = GetBaseDirectory(argv[0]); + + #ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + + bindtextdomain(PACKAGE, DrBaseDirectory); + + bind_textdomain_codeset(PACKAGE, "UTF-8"); + textdomain(PACKAGE); + #endif + + MDFNI_printf(_("Starting Mednafen %s\n"), MEDNAFEN_VERSION); + MDFN_indent(1); + + MDFN_printf(_("Build information:\n")); + MDFN_indent(2); + PrintCompilerVersion(); + PrintZLIBVersion(); + PrintLIBSNDFILEVersion(); + MDFN_indent(-2); + + MDFN_printf(_("Base directory: %s\n"), DrBaseDirectory); + + if(!MDFNI_InitializeModules(ExternalSystems)) + return(-1); + + for(unsigned int x = 0; x < sizeof(DriverSettings) / sizeof(MDFNSetting); x++) + NeoDriverSettings.push_back(DriverSettings[x]); + + //MakeInputSettings(NeoDriverSettings); + + if(!MDFNI_Initialize(DrBaseDirectory, NeoDriverSettings)) + return(-1); + + #if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + SetSignals(CloseStuff); + #endif + + if(!CreateDirs()) + { + ErrnoHolder ene(errno); // TODO: Maybe we should have CreateDirs() return this instead? + + MDFN_PrintError(_("Error creating directories: %s\n"), ene.StrError()); + MDFNI_Kill(); + return(-1); + } + + MakeMednafenArgsStruct(); + + if(!DoArgs(argc, argv, &needie)) + { + MDFNI_Kill(); + DeleteInternalArgs(); + //KillInputSettings(); + return(-1); + } + + if(LoadGame(force_module_arg, needie)) + { + sound_active = false; + if(MDFN_GetSettingB("sound")) + sound_active = InitSound(CurGame); + + // Initialize joysticks after sound, so PCI sound card init code can enable joystick ports(maybe?). + joy_manager = new JoystickManager(); + joy_manager->SetAnalogThreshold(MDFN_GetSettingF("analogthreshold") / 100); + + // Initialize video after everything else has been initialized. + Video_Init(CurGame); + + MainLoop(); + + Video_Kill(); + + // DESTROY NOM NOM joysticks before sound. + delete joy_manager; + joy_manager = NULL; + + KillSound(); + CloseGame(); + } + + + #if defined(HAVE_SIGNAL) || defined(HAVE_SIGACTION) + SetSignals(SIG_IGN); + #endif + + MDFNI_Kill(); + + DeleteInternalArgs(); + //KillInputSettings(); + + return(0); +} + + + +void MDFND_DispMessage(UTF8 *text) +{ + +} + +void MDFND_SetStateStatus(StateStatusStruct *status) +{ + +} + +void MDFND_SetMovieStatus(StateStatusStruct *status) +{ + +} + +uint32 MDFND_GetTime(void) +{ + //return(SDL_GetTicks()); + return(0); +} + +void MDFND_Sleep(uint32 ms) +{ + //SDL_Delay(ms); +} + +MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data) +{ + return(NULL); +} + +void MDFND_WaitThread(MDFN_Thread *thread, int *status) +{ + +} + +MDFN_Mutex *MDFND_CreateMutex(void) +{ + return(NULL); +} + +void MDFND_DestroyMutex(MDFN_Mutex *mutex) +{ + +} + +int MDFND_LockMutex(MDFN_Mutex *mutex) +{ + return(false); +} + +int MDFND_UnlockMutex(MDFN_Mutex *mutex) +{ + return(false); +} + + +int MDFND_NetworkConnect(void) +{ + return(0); +} + +void MDFND_NetworkClose(void) +{ + +} + +void MDFND_SendData(const void *data, uint32 len) +{ + +} + +void MDFND_RecvData(void *data, uint32 len) +{ + +} + +void MDFND_NetplayText(const uint8 *text, bool NetEcho) +{ + +} diff --git a/Mednafen/mednafen/drivers_dos/main.h b/Mednafen/mednafen/drivers_dos/main.h new file mode 100644 index 0000000000..2a35711733 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/main.h @@ -0,0 +1,30 @@ +#ifndef __MDFN_DRIVERS_DOS_MAIN_H +#define __MDFN_DRIVERS_DOS_MAIN_H + +#include "../driver.h" +#include "../mednafen.h" +#include "../settings.h" +#include "config.h" +#include "args.h" + +#include +#include +#include +#include +#include + +#include "../gettext.h" + +#ifndef _ +#define _(String) gettext(String) +#endif + +extern MDFNGI *CurGame; +int CloseGame(void); + +void RefreshThrottleFPS(double); +void MainRequestExit(void); + +extern bool pending_save_state, pending_snapshot, pending_save_movie; + +#endif diff --git a/Mednafen/mednafen/drivers_dos/nnx.cpp b/Mednafen/mednafen/drivers_dos/nnx.cpp new file mode 120000 index 0000000000..34ff9c1ca1 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/nnx.cpp @@ -0,0 +1 @@ +../drivers/nnx.cpp \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/nnx.h b/Mednafen/mednafen/drivers_dos/nnx.h new file mode 120000 index 0000000000..e8608c8141 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/nnx.h @@ -0,0 +1 @@ +../drivers/nnx.h \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/nongl.cpp b/Mednafen/mednafen/drivers_dos/nongl.cpp new file mode 120000 index 0000000000..1ae307552b --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/nongl.cpp @@ -0,0 +1 @@ +../drivers/nongl.cpp \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/nongl.h b/Mednafen/mednafen/drivers_dos/nongl.h new file mode 120000 index 0000000000..7215d33ae5 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/nongl.h @@ -0,0 +1 @@ +../drivers/nongl.h \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/sound.cpp b/Mednafen/mednafen/drivers_dos/sound.cpp new file mode 120000 index 0000000000..1996ef83e3 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/sound.cpp @@ -0,0 +1 @@ +../drivers/sound.cpp \ No newline at end of file diff --git a/Mednafen/mednafen/drivers_dos/video.cpp b/Mednafen/mednafen/drivers_dos/video.cpp new file mode 100644 index 0000000000..08969493f2 --- /dev/null +++ b/Mednafen/mednafen/drivers_dos/video.cpp @@ -0,0 +1,123 @@ +#include "main.h" +#include "video.h" + +static MDFN_Surface* VideoBuffer = NULL; +static MDFN_Rect* VideoLineWidths = NULL; +static VideoDriver* VDriver = NULL; +static MDFN_Rect DestRect; + + + +bool Video_Init(MDFNGI* CurGame) +{ + const double min_vsync_bp_time = 550.0 / (1000 * 1000); + const double hsync_time_fract = 0.08; + const int vsync_length = 3; + const int hcel_gran = 8; + const int min_hporch = hcel_gran; + const int min_vporch = 1; + + double par = ((double)CurGame->nominal_width / CurGame->lcm_width) / ((double)CurGame->nominal_height / CurGame->lcm_height); + double vrate = (double)CurGame->fps / (65536 * 256); + double pixclock; + int h_total; + int v_sync; + int v_bp; + int v_total; + int xres = 0; + int yres = 0; + + xres = CurGame->lcm_width; + yres = CurGame->lcm_height; + + while(xres < 256) + { + xres *= 2; + par /= 2; + } + + { + int new_xres; + + new_xres = (xres + hcel_gran - 1); + new_xres -= new_xres % hcel_gran; + + par *= (double)xres / new_xres; + xres = new_xres; + } + + while(yres < 480) + { + yres *= 2; + par *= 2; + } + + for(int vtotal = yres + 5; vtotal < yres + (yres / 2); vtotal++) + { + for(int htotal = xres; htotal < xres + (xres / 2); htotal++) + { + double hrate = vtotal * vrate; + double pixclock = htotal * vtotal * vrate; + // + int vfp = 0; + int vsync = 3; + int vbp = std::max(0, ceil(0.000550 * hrate) - vsync); + int vblank = vfp + vsync + vbp; + // + int hfp = 8; + int hsync = ceil(0.08 * htotal); + int hblank = floor(0.5 + htotal * std::max(0.20, (0.30 - 3000.0 / hrate))); + int hbp = hblank - hfp - hsync; + + if((hblank + xres) > htotal || hbp < 0) + continue; + + if((vblank + yres) > vtotal) + continue; + } + } + + VideoBuffer = new MDFN_Surface(NULL, CurGame->fb_width, CurGame->fb_height, CurGame->fb_width, mp.format); + VideoLineWidths = (MDFN_Rect*)calloc(CurGame->fb_height, sizeof(MDFN_Rect)); + + return(true); +} + +bool Video_Kill(void) +{ + if(VideoBuffer) + { + delete VideoBuffer; + VideoBuffer = NULL; + } + + if(VideoLineWidths) + { + delete VideoLineWidths; + VideoLineWidths = NULL; + } + + if(VDriver) + { + delete VDriver; + VDriver = NULL; + } + + return(true); +} + +void Video_GetSurface(MDFN_Surface** ps, MDFN_Rect **plw) +{ + *ps = VideoBuffer; + *plw = VideoLineWidths; +} + + +void Video_Blit(EmulateSpecStruct* es) +{ + if(VDriver) + { + VDriver->BlitSurface(VideoBuffer, &es->DisplayRect, &DestRect); + } +} + diff --git a/Mednafen/mednafen/endian.cpp b/Mednafen/mednafen/endian.cpp new file mode 100644 index 0000000000..0cf963ba66 --- /dev/null +++ b/Mednafen/mednafen/endian.cpp @@ -0,0 +1,150 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include "endian.h" + +void Endian_A16_Swap(void *src, uint32 nelements) +{ + uint32 i; + uint8 *nsrc = (uint8 *)src; + + for(i = 0; i < nelements; i++) + { + uint8 tmp = nsrc[i * 2]; + + nsrc[i * 2] = nsrc[i * 2 + 1]; + nsrc[i * 2 + 1] = tmp; + } +} + +void Endian_A32_Swap(void *src, uint32 nelements) +{ + uint32 i; + uint8 *nsrc = (uint8 *)src; + + for(i = 0; i < nelements; i++) + { + uint8 tmp1 = nsrc[i * 4]; + uint8 tmp2 = nsrc[i * 4 + 1]; + + nsrc[i * 4] = nsrc[i * 4 + 3]; + nsrc[i * 4 + 1] = nsrc[i * 4 + 2]; + + nsrc[i * 4 + 2] = tmp2; + nsrc[i * 4 + 3] = tmp1; + } +} + +void Endian_A64_Swap(void *src, uint32 nelements) +{ + uint32 i; + uint8 *nsrc = (uint8 *)src; + + for(i = 0; i < nelements; i++) + { + uint8 *base = &nsrc[i * 8]; + + for(int z = 0; z < 4; z++) + { + uint8 tmp = base[z]; + + base[z] = base[7 - z]; + base[7 - z] = tmp; + } + } +} + +void Endian_A16_NE_LE(void *src, uint32 nelements) +{ + #ifdef MSB_FIRST + Endian_A16_Swap(src, nelements); + #endif +} + +void Endian_A32_NE_LE(void *src, uint32 nelements) +{ + #ifdef MSB_FIRST + Endian_A32_Swap(src, nelements); + #endif +} + +void Endian_A64_NE_LE(void *src, uint32 nelements) +{ + #ifdef MSB_FIRST + Endian_A64_Swap(src, nelements); + #endif +} + +// +// +// +void Endian_A16_NE_BE(void *src, uint32 nelements) +{ + #ifdef LSB_FIRST + Endian_A16_Swap(src, nelements); + #endif +} + +void Endian_A32_NE_BE(void *src, uint32 nelements) +{ + #ifdef LSB_FIRST + Endian_A32_Swap(src, nelements); + #endif +} + +void Endian_A64_NE_BE(void *src, uint32 nelements) +{ + #ifdef LSB_FIRST + Endian_A64_Swap(src, nelements); + #endif +} + +static void FlipByteOrder(uint8 *src, uint32 count) +{ + uint8 *start=src; + uint8 *end=src+count-1; + + if((count&1) || !count) return; /* This shouldn't happen. */ + + count >>= 1; + + while(count--) + { + uint8 tmp; + + tmp=*end; + *end=*start; + *start=tmp; + end--; + start++; + } +} + +void Endian_V_NE_LE(void *src, uint32 bytesize) +{ + #ifdef MSB_FIRST + FlipByteOrder((uint8 *)src, bytesize); + #endif +} + +void Endian_V_NE_BE(void *src, uint32 bytesize) +{ + #ifdef LSB_FIRST + FlipByteOrder((uint8 *)src, bytesize); + #endif +} diff --git a/Mednafen/mednafen/endian.h b/Mednafen/mednafen/endian.h new file mode 100644 index 0000000000..5694ffbb4c --- /dev/null +++ b/Mednafen/mednafen/endian.h @@ -0,0 +1,293 @@ +#ifndef __MDFN_ENDIAN_H +#define __MDFN_ENDIAN_H + +static INLINE uint32 BitsExtract(const uint8* ptr, const size_t bit_offset, const size_t bit_count) +{ + uint32 ret = 0; + + for(size_t x = 0; x < bit_count; x++) + { + size_t co = bit_offset + x; + bool b = (ptr[co >> 3] >> (co & 7)) & 1; + + ret |= (uint64)b << x; + } + + return ret; +} + +static INLINE void BitsIntract(uint8* ptr, const size_t bit_offset, const size_t bit_count, uint32 value) +{ + for(size_t x = 0; x < bit_count; x++) + { + size_t co = bit_offset + x; + bool b = (value >> x) & 1; + uint8 tmp = ptr[co >> 3]; + + tmp &= ~(1 << (co & 7)); + tmp |= b << (co & 7); + + ptr[co >> 3] = tmp; + } +} + +/* + Regarding safety of calling MDFN_*sb on dynamically-allocated memory with new uint8[], see C++ standard 3.7.3.1(i.e. it should be + safe provided the offsets into the memory are aligned/multiples of the MDFN_*sb access type). malloc()'d and calloc()'d + memory should be safe as well. + + Statically-allocated arrays/memory should be unioned with a big POD type or C++11 "alignas"'d. (May need to audit code to ensure + this is being done). +*/ + +void Endian_A16_Swap(void *src, uint32 nelements); +void Endian_A32_Swap(void *src, uint32 nelements); +void Endian_A64_Swap(void *src, uint32 nelements); + +void Endian_A16_NE_LE(void *src, uint32 nelements); +void Endian_A32_NE_LE(void *src, uint32 nelements); +void Endian_A64_NE_LE(void *src, uint32 nelements); + +void Endian_A16_NE_BE(void *src, uint32 nelements); +void Endian_A32_NE_BE(void *src, uint32 nelements); +void Endian_A64_NE_BE(void *src, uint32 nelements); + +void Endian_V_NE_LE(void *src, uint32 bytesize); +void Endian_V_NE_BE(void *src, uint32 bytesize); + +static INLINE uint16 MDFN_bswap16(uint16 v) +{ + return (v << 8) | (v >> 8); +} + +static INLINE uint32 MDFN_bswap32(uint32 v) +{ + return (v << 24) | ((v & 0xFF00) << 8) | ((v >> 8) & 0xFF00) | (v >> 24); +} + +static INLINE uint64 MDFN_bswap64(uint64 v) +{ + return (v << 56) | (v >> 56) | ((v & 0xFF00) << 40) | ((v >> 40) & 0xFF00) | ((uint64)MDFN_bswap32(v >> 16) << 16); +} + +#ifdef LSB_FIRST + #define MDFN_ENDIANH_IS_BIGENDIAN 0 +#else + #define MDFN_ENDIANH_IS_BIGENDIAN 1 +#endif + +// +// X endian. +// +template +static INLINE T MDFN_deXsb(const void* ptr) +{ + T tmp; + + memcpy(&tmp, MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), sizeof(T)); + + if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN) + { + static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins."); + + if(sizeof(T) == 8) + return MDFN_bswap64(tmp); + else if(sizeof(T) == 4) + return MDFN_bswap32(tmp); + else if(sizeof(T) == 2) + return MDFN_bswap16(tmp); + } + + return tmp; +} + +// +// Native endian. +// +template +static INLINE T MDFN_densb(const void* ptr) +{ + return MDFN_deXsb<-1, T, aligned>(ptr); +} + +// +// Little endian. +// +template +static INLINE T MDFN_delsb(const void* ptr) +{ + return MDFN_deXsb<0, T, aligned>(ptr); +} + +template +static INLINE uint16 MDFN_de16lsb(const void* ptr) +{ + return MDFN_delsb(ptr); +} + +static INLINE uint32 MDFN_de24lsb(const void* ptr) +{ + const uint8* morp = (const uint8*)ptr; + return(morp[0]|(morp[1]<<8)|(morp[2]<<16)); +} + +template +static INLINE uint32 MDFN_de32lsb(const void* ptr) +{ + return MDFN_delsb(ptr); +} + +template +static INLINE uint64 MDFN_de64lsb(const void* ptr) +{ + return MDFN_delsb(ptr); +} + +// +// Big endian. +// +template +static INLINE T MDFN_demsb(const void* ptr) +{ + return MDFN_deXsb<1, T, aligned>(ptr); +} + +template +static INLINE uint16 MDFN_de16msb(const void* ptr) +{ + return MDFN_demsb(ptr); +} + +static INLINE uint32 MDFN_de24msb(const void* ptr) +{ + const uint8* morp = (const uint8*)ptr; + return((morp[2]<<0)|(morp[1]<<8)|(morp[0]<<16)); +} + +template +static INLINE uint32 MDFN_de32msb(const void* ptr) +{ + return MDFN_demsb(ptr); +} + +template +static INLINE uint64 MDFN_de64msb(const void* ptr) +{ + return MDFN_demsb(ptr); +} + +// +// +// +// +// +// +// +// + +// +// X endian. +// +template +static INLINE void MDFN_enXsb(void* ptr, T value) +{ + T tmp = value; + + if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN) + { + static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins."); + + if(sizeof(T) == 8) + tmp = MDFN_bswap64(value); + else if(sizeof(T) == 4) + tmp = MDFN_bswap32(value); + else if(sizeof(T) == 2) + tmp = MDFN_bswap16(value); + } + + memcpy(MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), &tmp, sizeof(T)); +} + +// +// Native endian. +// +template +static INLINE void MDFN_ennsb(void* ptr, T value) +{ + MDFN_enXsb<-1, T, aligned>(ptr, value); +} + +// +// Little endian. +// +template +static INLINE void MDFN_enlsb(void* ptr, T value) +{ + MDFN_enXsb<0, T, aligned>(ptr, value); +} + +template +static INLINE void MDFN_en16lsb(void* ptr, uint16 value) +{ + MDFN_enlsb(ptr, value); +} + +static INLINE void MDFN_en24lsb(void* ptr, uint32 value) +{ + uint8* morp = (uint8*)ptr; + + morp[0] = value; + morp[1] = value >> 8; + morp[2] = value >> 16; +} + +template +static INLINE void MDFN_en32lsb(void* ptr, uint32 value) +{ + MDFN_enlsb(ptr, value); +} + +template +static INLINE void MDFN_en64lsb(void* ptr, uint64 value) +{ + MDFN_enlsb(ptr, value); +} + + +// +// Big endian. +// +template +static INLINE void MDFN_enmsb(void* ptr, T value) +{ + MDFN_enXsb<1, T, aligned>(ptr, value); +} + +template +static INLINE void MDFN_en16msb(void* ptr, uint16 value) +{ + MDFN_enmsb(ptr, value); +} + +static INLINE void MDFN_en24msb(void* ptr, uint32 value) +{ + uint8* morp = (uint8*)ptr; + + morp[0] = value; + morp[1] = value >> 8; + morp[2] = value >> 16; +} + +template +static INLINE void MDFN_en32msb(void* ptr, uint32 value) +{ + MDFN_enmsb(ptr, value); +} + +template +static INLINE void MDFN_en64msb(void* ptr, uint64 value) +{ + MDFN_enmsb(ptr, value); +} + +#endif diff --git a/Mednafen/mednafen/error.cpp b/Mednafen/mednafen/error.cpp new file mode 100644 index 0000000000..6bf5057c31 --- /dev/null +++ b/Mednafen/mednafen/error.cpp @@ -0,0 +1,136 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include "error.h" +#include +#include +#include + +MDFN_Error::MDFN_Error() noexcept +{ + abort(); +} + +MDFN_Error::MDFN_Error(int errno_code_new, const char *format, ...) noexcept +{ + errno_code = errno_code_new; + + va_list ap; + va_start(ap, format); + error_message = trio_vaprintf(format, ap); + va_end(ap); +} + + +MDFN_Error::MDFN_Error(const ErrnoHolder &enh) +{ + errno_code = enh.Errno(); + + error_message = trio_aprintf("%s", enh.StrError()); +} + + +MDFN_Error::~MDFN_Error() noexcept +{ + if(error_message) + { + free(error_message); + error_message = NULL; + } +} + +MDFN_Error::MDFN_Error(const MDFN_Error &ze_error) noexcept +{ + if(ze_error.error_message) + error_message = strdup(ze_error.error_message); + else + error_message = NULL; + + errno_code = ze_error.errno_code; +} + +MDFN_Error& MDFN_Error::operator=(const MDFN_Error &ze_error) noexcept +{ + char *new_error_message = ze_error.error_message ? strdup(ze_error.error_message) : NULL; + int new_errno_code = ze_error.errno_code; + + if(error_message) + free(error_message); + + error_message = new_error_message; + errno_code = new_errno_code; + + return(*this); +} + + +const char * MDFN_Error::what(void) const noexcept +{ + if(!error_message) + return("Error allocating memory for the error message!"); + + return(error_message); +} + +int MDFN_Error::GetErrno(void) const noexcept +{ + return(errno_code); +} + +static const char *srr_wrap(int ret, const char *local_strerror) +{ + if(ret == -1) + return("ERROR IN strerror_r()!!!"); + + return(local_strerror); +} + +static const char *srr_wrap(const char *ret, const char *local_strerror) +{ + if(ret == NULL) + return("ERROR IN strerror_r()!!!"); + + return(ret); +} + +void ErrnoHolder::SetErrno(int the_errno) +{ + local_errno = the_errno; + + if(the_errno == 0) + local_strerror[0] = 0; + else + { + #ifdef HAVE_STRERROR_R + const char *retv; + + retv = srr_wrap(strerror_r(the_errno, local_strerror, 256), local_strerror); + + if(retv != local_strerror) + strncpy(local_strerror, retv, 255); + + #else // No strerror_r :( + + strncpy(local_strerror, strerror(the_errno), 255); + + #endif + + local_strerror[255] = 0; + } +} + diff --git a/Mednafen/mednafen/error.h b/Mednafen/mednafen/error.h new file mode 100644 index 0000000000..a05259a815 --- /dev/null +++ b/Mednafen/mednafen/error.h @@ -0,0 +1,75 @@ +#ifndef __MDFN_ERROR_H +#define __MDFN_ERROR_H + +#include +#include +#include + +#ifdef __cplusplus + +class ErrnoHolder; +class MDFN_Error : public std::exception +{ + public: + + MDFN_Error() noexcept; + + MDFN_Error(int errno_code_new, const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 3, 4); + MDFN_Error(const ErrnoHolder &enh); + + ~MDFN_Error() noexcept; + + MDFN_Error(const MDFN_Error &ze_error) noexcept; + MDFN_Error & operator=(const MDFN_Error &ze_error) noexcept; + + virtual const char *what(void) const noexcept; + int GetErrno(void) const noexcept; + + private: + + int errno_code; + char *error_message; +}; + +class ErrnoHolder +{ + public: + + ErrnoHolder() + { + //SetErrno(0); + local_errno = 0; + local_strerror[0] = 0; + } + + ErrnoHolder(int the_errno) + { + SetErrno(the_errno); + } + + inline int Errno(void) const + { + return(local_errno); + } + + const char *StrError(void) const + { + return(local_strerror); + } + + void operator=(int the_errno) + { + SetErrno(the_errno); + } + + private: + + void SetErrno(int the_errno); + + int local_errno; + char local_strerror[256]; +}; + +#endif + +#endif diff --git a/Mednafen/mednafen/file.cpp b/Mednafen/mednafen/file.cpp new file mode 100644 index 0000000000..63cef5f586 --- /dev/null +++ b/Mednafen/mednafen/file.cpp @@ -0,0 +1,371 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "compress/unzip.h" + +#include "file.h" +#include "general.h" + +static const uint64 MaxROMImageSize = (int64)1 << 26; // 2 ^ 26 = 64MiB + +static const char *unzErrorString(int error_code) +{ + if(error_code == UNZ_OK) + return("ZIP OK"); + else if(error_code == UNZ_END_OF_LIST_OF_FILE) + return("ZIP End of file list"); + else if(error_code == UNZ_EOF) + return("ZIP EOF"); + else if(error_code == UNZ_PARAMERROR) + return("ZIP Parameter error"); + else if(error_code == UNZ_BADZIPFILE) + return("ZIP file bad"); + else if(error_code == UNZ_INTERNALERROR) + return("ZIP Internal error"); + else if(error_code == UNZ_CRCERROR) + return("ZIP CRC error"); + else if(error_code == UNZ_ERRNO) + return(strerror(errno)); + else + return("ZIP Unknown"); +} + +void MDFNFILE::ApplyIPS(Stream *ips) +{ + // + // If the stream is not a MemoryStream, turn it into one. + // + //if(!(str->attributes() & Stream::ATTRIBUTE_WRITEABLE)) + if(dynamic_cast(str.get()) == nullptr) + { + str.reset(new MemoryStream(str.release(), MaxROMImageSize)); + } + + { + MDFN_AutoIndent aind(1); + uint32 count; + + count = IPSPatcher::Apply(ips, str.get()); + + MDFN_printf(_("IPS EOF: Did %u patches\n\n"), count); + + if(ips->tell() < ips->size()) + { + MDFN_AutoIndent aindw(1); + + MDFN_printf(_("Warning: trailing unused data in IPS file.\n")); + } + } +} + +MDFNFILE::MDFNFILE(const char *path, const FileExtensionSpecStruct *known_ext, const char *purpose) : ext((const char * const &)f_ext), fbase((const char * const &)f_fbase) +{ + f_ext = NULL; + f_fbase = NULL; + + Open(path, known_ext, purpose); +} + +MDFNFILE::~MDFNFILE() +{ + Close(); +} + + +void MDFNFILE::Open(const char *path, const FileExtensionSpecStruct *known_ext, const char *purpose) +{ + unzFile tz = NULL; + + try + { + // + // Try opening it as a zip file first + // + if((tz = unzOpen(path))) + { + char tempu[1024]; + int errcode; + + if((errcode = unzGoToFirstFile(tz)) != UNZ_OK) + { + throw MDFN_Error(0, _("Could not seek to first file in ZIP archive: %s"), unzErrorString(errcode)); + } + + if(known_ext) + { + bool FileFound = FALSE; + while(!FileFound) + { + size_t tempu_strlen; + const FileExtensionSpecStruct *ext_search = known_ext; + + if((errcode = unzGetCurrentFileInfo(tz, 0, tempu, 1024, 0, 0, 0, 0)) != UNZ_OK) + { + throw MDFN_Error(0, _("Could not get file information in ZIP archive: %s"), unzErrorString(errcode)); + } + + tempu[1023] = 0; + tempu_strlen = strlen(tempu); + + while(ext_search->extension && !FileFound) + { + size_t ttmeow = strlen(ext_search->extension); + if(tempu_strlen >= ttmeow) + { + if(!strcasecmp(tempu + tempu_strlen - ttmeow, ext_search->extension)) + FileFound = TRUE; + } + ext_search++; + } + + if(FileFound) + break; + + if((errcode = unzGoToNextFile(tz)) != UNZ_OK) + { + if(errcode != UNZ_END_OF_LIST_OF_FILE) + { + throw MDFN_Error(0, _("Error seeking to next file in ZIP archive: %s"), unzErrorString(errcode)); + } + + if((errcode = unzGoToFirstFile(tz)) != UNZ_OK) + { + throw MDFN_Error(0, _("Could not seek to first file in ZIP archive: %s"), unzErrorString(errcode)); + } + break; + } + } // end to while(!FileFound) + } // end to if(ext) + + if((errcode = unzOpenCurrentFile(tz)) != UNZ_OK) + { + throw MDFN_Error(0, _("Could not open file in ZIP archive: %s"), unzErrorString(errcode)); + } + + { + unz_file_info ufo; + unzGetCurrentFileInfo((unzFile)tz, &ufo, 0, 0, 0, 0, 0, 0); + + if(ufo.uncompressed_size > MaxROMImageSize) + throw MDFN_Error(0, _("ROM image is too large; maximum size allowed is %llu bytes."), (unsigned long long)MaxROMImageSize); + + str.reset(new MemoryStream(ufo.uncompressed_size, true)); + + unzReadCurrentFile((unzFile)tz, str->map(), str->size()); + } + + { + char *ld = strrchr(tempu, '.'); + + f_ext = strdup(ld ? ld + 1 : ""); + f_fbase = strdup(tempu); + if(ld) + f_fbase[ld - tempu] = 0; + } + } + else // If it's not a zip file, handle it as...another type of file! + { + std::unique_ptr tfp(new FileStream(path, FileStream::MODE_READ)); + + const char *path_fnp = GetFNComponent(path); + + uint8 gzmagic[3] = { 0 }; + + if(tfp->read(gzmagic, 3, false) != 3 || gzmagic[0] != 0x1F || gzmagic[1] != 0x8b || gzmagic[2] != 0x08) + { + tfp->seek(0, SEEK_SET); + + if(tfp->size() > MaxROMImageSize) + throw MDFN_Error(0, _("ROM image is too large; maximum size allowed is %llu bytes."), (unsigned long long)MaxROMImageSize); + + str = std::move(tfp); + + { + const char *ld = strrchr(path_fnp, '.'); + f_ext = strdup(ld ? ld + 1 : ""); + f_fbase = strdup(path_fnp); + if(ld) + f_fbase[ld - path_fnp] = 0; + } + } + else /* Probably gzip */ + { + delete tfp.release(); + + str.reset(new MemoryStream(new GZFileStream(path, GZFileStream::MODE::READ), MaxROMImageSize)); + + char *tmp_path = strdup(path_fnp); + char *ld = strrchr(tmp_path, '.'); + + if(ld && ld > tmp_path) + { + char *last_ld = ld; + *ld = 0; + ld = strrchr(tmp_path, '.'); + if(!ld) { ld = last_ld; } + else *ld = 0; + } + f_ext = strdup(ld ? ld + 1 : ""); + f_fbase = tmp_path; + } // End gzip handling + } // End normal and gzip file handling else to zip + } + catch(...) + { + if(tz != NULL) + { + unzCloseCurrentFile(tz); + unzClose(tz); + } + + Close(); + throw; + } + + if(tz != NULL) + { + unzCloseCurrentFile(tz); + unzClose(tz); + } +} + +void MDFNFILE::Close(void) throw() +{ + if(f_ext) + { + free(f_ext); + f_ext = NULL; + } + + if(f_fbase) + { + free(f_fbase); + f_fbase = NULL; + } + + if(str.get()) + { + delete str.release(); + } +} + +static INLINE void MDFN_DumpToFileReal(const std::string& path, const std::vector &pearpairs) +{ + FileStream fp(path, FileStream::MODE_WRITE_INPLACE); + + for(unsigned int i = 0; i < pearpairs.size(); i++) + { + fp.write(pearpairs[i].GetData(), pearpairs[i].GetLength()); + } + + fp.truncate(fp.tell()); + fp.close(); +} + +bool MDFN_DumpToFile(const std::string& path, const std::vector &pearpairs, bool throw_on_error) +{ + try + { + MDFN_DumpToFileReal(path, pearpairs); + } + catch(std::exception &e) + { + if(throw_on_error) + throw; + else + { + MDFN_PrintError("%s", e.what()); + return(false); + } + } + return(true); +} + +bool MDFN_DumpToFile(const std::string& path, const void *data, uint64 length, bool throw_on_error) +{ + std::vector tmp_pairs; + + tmp_pairs.push_back(PtrLengthPair(data, length)); + + return MDFN_DumpToFile(path, tmp_pairs, throw_on_error); +} + + +std::unique_ptr MDFN_AmbigGZOpenHelper(const std::string& path, std::vector good_sizes) +{ + std::unique_ptr fp(new FileStream(path, FileStream::MODE_READ)); + + if(fp->size() >= 18) + { + uint8 head[10]; + + fp->read(head, sizeof(head)); + + if(head[0] == 0x1F && head[1] == 0x8B && head[2] == 0x08) + { + uint8 footer[8]; + uint32 fs; + + fp->seek(-8, SEEK_END); + fp->read(footer, sizeof(footer)); + fs = MDFN_de32lsb(&footer[4]); + + for(auto const s : good_sizes) + { + if(s == fs) + { + fp.reset(nullptr); + fp.reset(new GZFileStream(path, GZFileStream::MODE::READ)); + return fp; + } + } + } + fp->rewind(); + } + + return fp; +} + +void MDFN_mkdir_T(const char* path) +{ + #ifdef HAVE_MKDIR + #if MKDIR_TAKES_ONE_ARG + ::mkdir(path); + #else + ::mkdir(path, S_IRWXU); + #endif + #elif HAVE__MKDIR + ::_mkdir(path.c_str()); + #else + #error "mkdir() missing?!" + #endif +} + diff --git a/Mednafen/mednafen/file.h b/Mednafen/mednafen/file.h new file mode 100644 index 0000000000..b127b4b83d --- /dev/null +++ b/Mednafen/mednafen/file.h @@ -0,0 +1,106 @@ +#ifndef __MDFN_FILE_H +#define __MDFN_FILE_H + +#include +#include + +#include +#include + +class MDFNFILE +{ + public: + + MDFNFILE(const char *path, const FileExtensionSpecStruct *known_ext, const char *purpose = NULL); + ~MDFNFILE(); + + void ApplyIPS(Stream *); + void Close(void) throw(); + + const char * const &ext; + const char * const &fbase; + + inline uint64 size(void) + { + return str->size(); + } + + INLINE void seek(int64 offset, int whence = SEEK_SET) + { + str->seek(offset, whence); + } + + INLINE uint64 read(void* ptr, uint64 count, bool error_on_eos = true) + { + return str->read(ptr, count, error_on_eos); + } + + INLINE uint64 tell(void) + { + return str->tell(); + } + + INLINE void rewind(void) + { + str->rewind(); + } + + INLINE Stream* stream(void) + { + return str.get(); + } + + private: + + char *f_ext; + char *f_fbase; + + std::unique_ptr str; + + void Open(const char *path, const FileExtensionSpecStruct *known_ext, const char *purpose = NULL); +}; + +class PtrLengthPair +{ + public: + + inline PtrLengthPair(const void *new_data, const uint64 new_length) + { + data = new_data; + length = new_length; + } + + ~PtrLengthPair() + { + + } + + INLINE const void *GetData(void) const + { + return(data); + } + + INLINE uint64 GetLength(void) const + { + return(length); + } + + private: + const void *data; + uint64 length; +}; + +// These functions should be used for data like non-volatile backup memory. +bool MDFN_DumpToFile(const std::string& path, const void *data, const uint64 length, bool throw_on_error = false); +bool MDFN_DumpToFile(const std::string& path, const std::vector &pearpairs, bool throw_on_error = false); + +// +// Helper function to open a file in read mode, so we can stop gzip-compressing our save-game files and not have to worry so much about games +// that might write the gzip magic to the beginning of the save game memory area causing a problem. +// +std::unique_ptr MDFN_AmbigGZOpenHelper(const std::string& path, std::vector good_sizes); + +void MDFN_mkdir_T(const char* path); + + +#endif diff --git a/Mednafen/mednafen/gb/Makefile.am b/Mednafen/mednafen/gb/Makefile.am new file mode 100644 index 0000000000..f2886927ca --- /dev/null +++ b/Mednafen/mednafen/gb/Makefile.am @@ -0,0 +1,8 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libgb.a +gb_SOURCES = gb.cpp gfx.cpp gbGlobals.cpp memory.cpp sound.cpp z80.cpp + +libgb_a_SOURCES = $(gb_SOURCES) diff --git a/Mednafen/mednafen/gb/Makefile.in b/Mednafen/mednafen/gb/Makefile.in new file mode 100644 index 0000000000..3d9475cf1b --- /dev/null +++ b/Mednafen/mednafen/gb/Makefile.in @@ -0,0 +1,684 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/gb +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libgb_a_AR = $(AR) $(ARFLAGS) +libgb_a_LIBADD = +am__objects_1 = gb.$(OBJEXT) gfx.$(OBJEXT) gbGlobals.$(OBJEXT) \ + memory.$(OBJEXT) sound.$(OBJEXT) z80.$(OBJEXT) +am_libgb_a_OBJECTS = $(am__objects_1) +libgb_a_OBJECTS = $(am_libgb_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libgb_a_SOURCES) +DIST_SOURCES = $(libgb_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libgb.a +gb_SOURCES = gb.cpp gfx.cpp gbGlobals.cpp memory.cpp sound.cpp z80.cpp +libgb_a_SOURCES = $(gb_SOURCES) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gb/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/gb/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libgb.a: $(libgb_a_OBJECTS) $(libgb_a_DEPENDENCIES) $(EXTRA_libgb_a_DEPENDENCIES) + $(AM_V_at)-rm -f libgb.a + $(AM_V_AR)$(libgb_a_AR) libgb.a $(libgb_a_OBJECTS) $(libgb_a_LIBADD) + $(AM_V_at)$(RANLIB) libgb.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gbGlobals.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/z80.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/gb/gb.cpp b/Mednafen/mednafen/gb/gb.cpp new file mode 100644 index 0000000000..48fc08de44 --- /dev/null +++ b/Mednafen/mednafen/gb/gb.cpp @@ -0,0 +1,3054 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include "gb.h" +#include "gbGlobals.h" +#include "memory.h" +#include "sound.h" +#include "z80.h" + +namespace MDFN_IEN_GB +{ + +static void Cleanup(void) MDFN_COLD; + +static uint32 *gbColorFilter = NULL; +static uint32 gbMonoColorMap[12 + 1]; // Mono color map(+1 = LCD off color)! + +static void LoadROM(MDFNFILE *fp); +static int32 SoundTS = 0; +//extern uint16 gbLineMix[160]; +extern union __gblmt +{ + uint16 cgb[160]; + uint8 dmg[160]; + uint32 dmg_32[40]; +} gbLineMix; + +// mappers +void (*mapper)(uint16,uint8) = NULL; +void (*mapperRAM)(uint16,uint8) = NULL; +uint8 (*mapperReadRAM)(uint16) = NULL; + +static uint8 HRAM[0x80]; +uint8 gbOAM[0xA0]; + +// 0xff00 +static uint8 register_P1 = 0; + +// 0xff01 +static uint8 register_SB = 0; +// 0xff02 +uint8 register_SC = 0; +// 0xff04 +uint8 register_DIV = 0; +// 0xff05 +static uint8 register_TIMA = 0; +// 0xff06 +static uint8 register_TMA = 0; +// 0xff07 +static uint8 register_TAC = 0; +// 0xff0f +uint8 register_IF = 0; +// 0xff40 +uint8 register_LCDC = 0; +// 0xff41 +static uint8 register_STAT = 0; +// 0xff42 +uint8 register_SCY = 0; +// 0xff43 +uint8 register_SCX = 0; +// 0xff44 +uint8 register_LY = 0; +// 0xff45 +uint8 register_LYC = 0; +// 0xff46 +uint8 register_DMA = 0; +// 0xff4a +uint8 register_WY = 0; +// 0xff4b +uint8 register_WX = 0; +// 0xff4d +uint8 register_KEY1 = 0; +// 0xff4f +uint8 register_VBK = 0; +// 0xff51 +static uint8 register_HDMA1 = 0; +// 0xff52 +static uint8 register_HDMA2 = 0; +// 0xff53 +static uint8 register_HDMA3 = 0; +// 0xff54 +static uint8 register_HDMA4 = 0; +// 0xff55 +static uint8 register_HDMA5 = 0; + +// 0xff56 +static uint8 register_RP = 0; + +// 0xff68 +static uint8 register_BCPS = 0; +// 0xff69 +static uint8 register_BCPD = 0; +// 0xff6a +static uint8 register_OCPS = 0; +// 0xff6b +static uint8 register_OCPD = 0; + +// 0xff6c +static uint8 register_FF6C = 0; +// 0xff72 +static uint8 register_FF72 = 0; +// 0xff73 +static uint8 register_FF73 = 0; +// 0xff74 +static uint8 register_FF74 = 0; +// 0xff75 +static uint8 register_FF75 = 0; + +// 0xff70 +static uint8 register_SVBK = 0; +// 0xffff +uint8 register_IE = 0; + +// ticks definition +static int GBDIV_CLOCK_TICKS = 64; +static int GBLCD_MODE_0_CLOCK_TICKS = 51; +static int GBLCD_MODE_1_CLOCK_TICKS = 1140; +static int GBLCD_MODE_2_CLOCK_TICKS = 20; +static int GBLCD_MODE_3_CLOCK_TICKS = 43; +static int GBLY_INCREMENT_CLOCK_TICKS = 114; +static int GBTIMER_MODE_0_CLOCK_TICKS = 256; +static int GBTIMER_MODE_1_CLOCK_TICKS = 4; +static int GBTIMER_MODE_2_CLOCK_TICKS = 16; +static int GBTIMER_MODE_3_CLOCK_TICKS = 64; +static int GBSERIAL_CLOCK_TICKS = 128; +static int GBSYNCHRONIZE_CLOCK_TICKS = 52920; + +// state variables +static int32 snooze; +static int32 PadInterruptDelay; + +// serial +static int gbSerialOn; +static int gbSerialTicks; +static int gbSerialBits; +// timer +static int gbTimerOn; +static int gbTimerTicks; +static int gbTimerClockTicks; +static int gbTimerMode; + + +enum +{ + GBLCDM_HBLANK = 0, + GBLCDM_VBLANK = 1, + GBLCDM_OAM = 2, + GBLCDM_OAM_VRAM = 3, +}; + +// lcd +int gbLcdMode = GBLCDM_OAM; +int gbLcdTicks = GBLCD_MODE_2_CLOCK_TICKS; +int gbLcdLYIncrementTicks = 0; +// div +int gbDivTicks = GBDIV_CLOCK_TICKS; +// cgb +int gbWramBank = 1; +int gbHdmaSource = 0x0000; +int gbHdmaDestination = 0x8000; +int gbHdmaBytes = 0x0000; +int gbHdmaOn = 0; +int gbSpeed = 0; + +// timing +int gbSynchronizeTicks = GBSYNCHRONIZE_CLOCK_TICKS; + +// emulator features +int gbBattery = 0; + +static uint8 gbJoymask; + +static const int gbRomSizes[] = { 0x00008000, // 32K + 0x00010000, // 64K + 0x00020000, // 128K + 0x00040000, // 256K + 0x00080000, // 512K + 0x00100000, // 1024K + 0x00200000, // 2048K + 0x00400000, // 4096K + 0x00800000 // 8192K +}; + +static const int gbRomSizesMasks[] = { 0x00007fff, + 0x0000ffff, + 0x0001ffff, + 0x0003ffff, + 0x0007ffff, + 0x000fffff, + 0x001fffff, + 0x003fffff, + 0x007fffff +}; + +static const int gbRamSizes[6] = { 0x00000000, // 0K + 0x00000800, // 2K + 0x00002000, // 8K + 0x00008000, // 32K + 0x00020000, // 128K + 0x00010000 // 64K +}; + +static const int gbRamSizesMasks[6] = { 0x00000000, + 0x000007ff, + 0x00001fff, + 0x00007fff, + 0x0001ffff, + 0x0000ffff +}; + +static MDFN_PaletteEntry PalTest[256]; + +static bool MatchExists(MDFN_PaletteEntry *pt, unsigned n, const MDFN_PaletteEntry& pe) +{ + for(unsigned x = 0; x < n; x++) + { + if(pt[x].r == pe.r && pt[x].g == pe.g && pt[x].b == pe.b) + return(true); + } + return(false); +} + +class MDFN_PaletteMapper8 +{ + public: + + MDFN_PaletteMapper8(MDFN_PaletteEntry *pal); + + uint8 FindClose(const MDFN_PaletteEntry& pe); + + private: + + int rcl[256]; + int gcl[256]; + int bcl[256]; + int ccp_to_ccl[256]; +}; + +MDFN_PaletteMapper8::MDFN_PaletteMapper8(MDFN_PaletteEntry *pal) +{ + for(unsigned i = 0; i < 256; i++) + { + ccp_to_ccl[i] = 65536U * pow((double)i / 255, 2.2 / 1.0); + } + + for(unsigned i = 0; i < 256; i++) + { + rcl[i] = ccp_to_ccl[pal[i].r]; + gcl[i] = ccp_to_ccl[pal[i].g]; + bcl[i] = ccp_to_ccl[pal[i].b]; + } +} + +uint8 MDFN_PaletteMapper8::FindClose(const MDFN_PaletteEntry& pe) +{ + int rl, gl, bl; + int closest = -1; + int closest_cs = 0x7FFFFFFF; + + rl = ccp_to_ccl[pe.r]; + gl = ccp_to_ccl[pe.g]; + bl = ccp_to_ccl[pe.b]; + + for(unsigned x = 0; x < 256; x++) + { + int cs; + + cs = abs(rcl[x] - rl) * 2126 + abs(gcl[x] - gl) * 7152 + abs(bcl[x] - bl) * 722; + if(cs < closest_cs) + { + closest_cs = cs; + closest = x; + } + } + + return(closest); +} + + +static void SetPixelFormat(const MDFN_PixelFormat &format, bool cgb_mode, const uint8* CustomColorMap, const uint32 CustomColorMapNE) MDFN_COLD; +static void SetPixelFormat(const MDFN_PixelFormat &format, bool cgb_mode, const uint8* CustomColorMap, const uint32 CustomColorMapNE) +{ + if(cgb_mode) + { + if(format.bpp == 8) + { + unsigned pti = 0; + + memset(PalTest, 0, sizeof(PalTest)); + + for(int i = 0; i < 8; i++) + { + PalTest[pti++] = format.MakePColor(i * 36, i * 36, i * 36); + + if(i) + { + PalTest[pti++] = format.MakePColor(i * 36, 0, 0); + PalTest[pti++] = format.MakePColor(0, i * 36, 0); + PalTest[pti++] = format.MakePColor(0, 0, i * 36); + PalTest[pti++] = format.MakePColor(i * 36, i * 36, 0); + PalTest[pti++] = format.MakePColor(i * 36, 0, i * 36); + PalTest[pti++] = format.MakePColor(0, i * 36, i * 36); + } + } + + for(int r = 0; r < 8; r++) + { + for(int g = 0; g < 8; g++) + { + for(int b = 0; b < 8; b++) + { + if(MatchExists(PalTest, 256, format.MakePColor(r * 36, g * 36, b * 36))) + continue; + + if(g == 6 && b == 6 && r == 5) + goto SkipStuff; + + if(g == 6 && b == 3 && r == 5) + goto SkipStuff; + + if(g == 4 && b == 5 && r == 3) + goto SkipStuff; + + if(!(b & 1)) + continue; + + if(g == (r + 1)) + continue; + + //if(g == 7 && r >= 4 && b < 4) + // continue; + + if(g == (r + 3) && b >= 5) + continue; + + SkipStuff:; + + PalTest[pti++] = format.MakePColor(r * 36, g * 36, b * 36); + + if(pti == 256) goto EndThingy; + } + } + } + EndThingy:; + //printf("ZOOMBA: %u\n", pti); + //exit(1); + } + + MDFN_PaletteMapper8 pm8(PalTest); + + for(int r = 0; r < 32; r++) + { + for(int g = 0; g < 32; g++) + { + for(int b = 0; b < 32; b++) + { + int nr = r * 226 + g * 29 + b * 0; + int ng = r * 29 + g * 197 + b * 29; + int nb = r * 30 + g * 73 + b * 152; + + nr /= 31; + ng /= 31; + nb /= 31; + + if(CustomColorMap) + { + nr = CustomColorMap[((b << 10) | (g << 5) | r) * 3 + 0]; + ng = CustomColorMap[((b << 10) | (g << 5) | r) * 3 + 1]; + nb = CustomColorMap[((b << 10) | (g << 5) | r) * 3 + 2]; + } + + if(format.bpp == 8) + gbColorFilter[(b << 10) | (g << 5) | r] = pm8.FindClose(format.MakePColor(nr, ng, nb)); + else + gbColorFilter[(b << 10) | (g << 5) | r] = format.MakeColor(nr, ng, nb); + } + } + } + } + else + { + for(int i = 0; i < 12; i++) + { + int r, g, b; + + r = (3 - (i & 3)) * 48 + 32; + g = (3 - (i & 3)) * 48 + 32; + b = (3 - (i & 3)) * 48 + 32; + + if(CustomColorMap) + { + unsigned ci = i; + + if(CustomColorMapNE == 4) + ci %= 4; + else if(CustomColorMapNE == 8) + ci = (ci & 0x7) | ((ci & 0x8) >> 1); + + r = CustomColorMap[ci * 3 + 0]; + g = CustomColorMap[ci * 3 + 1]; + b = CustomColorMap[ci * 3 + 2]; + } + + gbMonoColorMap[i] = format.MakeColor(r, g, b); + PalTest[i] = format.MakePColor(r, g, b); + } + + gbMonoColorMap[12] = gbMonoColorMap[0]; + PalTest[12] = PalTest[0]; + } +} + +#if 0 + if(num_read == 4 * 3) + { + for(unsigned i = 4 * 3; i < 12 * 3; i++) + { + (*ptr)[i] = (*ptr)[i % (4 * 3)]; + } + } + else if(num_read == 8 * 3) + { + for(unsigned i = 8 * 3; i < 12 * 3; i++) + (*ptr)[i] = (*ptr)[(4 * 3) + (i % (4 * 3))]; + } +#endif + +static void gbCopyMemory(uint16 d, uint16 s, int count) +{ + while(count) + { + gbWriteMemory(d, gbReadMemory(s)); + s++; + d++; + count--; + } +} + +static void gbDoHdma() +{ + gbCopyMemory(gbHdmaDestination, + gbHdmaSource, + 0x10); + + gbHdmaDestination += 0x10; + gbHdmaSource += 0x10; + + register_HDMA2 += 0x10; + if(register_HDMA2 == 0x00) + register_HDMA1++; + + register_HDMA4 += 0x10; + if(register_HDMA4 == 0x00) + register_HDMA3++; + + gbHdmaBytes -= 0x10; + register_HDMA5--; + if(register_HDMA5 == 0xff) + gbHdmaOn = 0; +} + +// fix for Harley and Lego Racers +static void gbCompareLYToLYC() +{ + if(register_LY == register_LYC) + { + // mark that we have a match + register_STAT |= 4; + + // check if we need an interrupt + if(register_STAT & 0x40) + register_IF |= 2; + } + else // no match + register_STAT &= 0xfb; +} + +static void ClockTIMA(void) +{ + register_TIMA++; + + if(register_TIMA == 0) + { + // timer overflow! + + // reload timer modulo + register_TIMA = register_TMA; + + // flag interrupt + register_IF |= 4; + } +} + +void gbWriteMemory(uint16 address, uint8 value) +{ + if(address < 0x8000) { + if(mapper) + (*mapper)(address, value); + return; + } + + if(address < 0xa000) { + gbMemoryMap[address>>12][address&0x0fff] = value; + return; + } + + if(address < 0xc000) + { + if(mapper) + (*mapperRAM)(address, value); + return; + } + + if(address < 0xfe00) { + unsigned int page = (address >> 12); + if(page >= 0xE) page -= 2; + gbMemoryMap[page][address & 0x0fff] = value; + return; + } + + if(address < 0xff00) { + if(address < 0xFEA0) + gbOAM[address & 0xFF] = value; + return; + } + //printf("Write: %04x %02x, %d\n", address, value, register_LY); + switch(address & 0x00ff) + { + case 0x00: + register_P1 = ((register_P1 & 0xcf) | (value & 0x30)); + return; + + case 0x01: { + register_SB = value; + return; + } + + // serial control + case 0x02: { + gbSerialOn = (value & 0x80); + register_SC = value; + if(gbSerialOn) { + gbSerialTicks = GBSERIAL_CLOCK_TICKS; +#ifdef LINK_EMULATION + if(linkConnected) { + if(value & 1) { + linkSendByte(0x100|register_SB); + Sleep(5); + } + } +#endif + } + + gbSerialBits = 0; + return; + } + + // DIV register resets on any write + case 0x04: { + register_DIV = 0; + gbDivTicks = GBDIV_CLOCK_TICKS; + // Another weird timer 'bug' : + // Writing to DIV register resets the internal timer, + // and can also increase TIMA/trigger an interrupt + // in some cases... + //if (gbTimerOn && !(gbInternalTimer & (gbTimerClockTicks>>1))) + //{ + // ClockTIMA(); + //} + return; + } + case 0x05: + register_TIMA = value; + return; + + case 0x06: + register_TMA = value; + return; + + // TIMER control + case 0x07: { + register_TAC = value; + gbTimerOn = (value & 4); + gbTimerMode = value & 3; + // register_TIMA = register_TMA; + switch(gbTimerMode) { + case 0: + gbTimerClockTicks = gbTimerTicks = GBTIMER_MODE_0_CLOCK_TICKS; + break; + case 1: + gbTimerClockTicks = gbTimerTicks = GBTIMER_MODE_1_CLOCK_TICKS; + break; + case 2: + gbTimerClockTicks = gbTimerTicks = GBTIMER_MODE_2_CLOCK_TICKS; + break; + case 3: + gbTimerClockTicks = gbTimerTicks = GBTIMER_MODE_3_CLOCK_TICKS; + break; + } + return; + } + + case 0x0f: + { + register_IF = value; + return; + } + + + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: + case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: + { + SOUND_Write(SoundTS, address, value); + return; + } + case 0x40: { + int lcdChange = (register_LCDC & 0x80) ^ (value & 0x80); + + if(lcdChange) { + if(value & 0x80) { + gbLcdTicks = GBLCD_MODE_1_CLOCK_TICKS; + gbLcdMode = GBLCDM_HBLANK; + register_STAT &= 0xfc; + register_LY = 0x00; + } else { + gbLcdTicks = 0; + gbLcdMode = GBLCDM_HBLANK; + register_STAT &= 0xfc; + register_LY = 0x00; + } + // compareLYToLYC(); + } + // don't draw the window if it was not enabled and not being drawn before + if(!(register_LCDC & 0x20) && (value & 0x20) && gbWindowLine == -1 && + register_LY > register_WY) + gbWindowLine = 144; + + register_LCDC = value; + + return; + } + + // STAT + case 0x41: { + //register_STAT = (register_STAT & 0x87) | + // (value & 0x7c); + register_STAT = (value & 0xf8) | (register_STAT & 0x07); // fix ? + // GB bug from Devrs FAQ + if(!gbCgbMode && (register_LCDC & 0x80) && gbLcdMode < 2) + register_IF |= 2; + return; + } + + // SCY + case 0x42: { + register_SCY = value; + return; + } + + // SCX + case 0x43: { + register_SCX = value; + return; + } + + // LY + case 0x44: { + // read only + return; + } + + // LYC + case 0x45: { + register_LYC = value; + if((register_LCDC & 0x80)) { + gbCompareLYToLYC(); + } + return; + } + + // DMA! + case 0x46: { + int source = value * 0x0100; + + gbCopyMemory(0xfe00, + source, + 0xa0); + register_DMA = value; + return; + } + + // BGP + case 0x47: { + gbBgp[0] = value & 0x03; + gbBgp[1] = (value & 0x0c)>>2; + gbBgp[2] = (value & 0x30)>>4; + gbBgp[3] = (value & 0xc0)>>6; + return; + } + + // OBP0 + case 0x48: { + gbObp0[0] = 4 | (value & 0x03); + gbObp0[1] = 4 | ((value & 0x0c)>>2); + gbObp0[2] = 4 | ((value & 0x30)>>4); + gbObp0[3] = 4 | ((value & 0xc0)>>6); + return; + } + + // OBP1 + case 0x49: { + gbObp1[0] = 8 | (value & 0x03); + gbObp1[1] = 8 | ((value & 0x0c)>>2); + gbObp1[2] = 8 | ((value & 0x30)>>4); + gbObp1[3] = 8 | ((value & 0xc0)>>6); + return; + } + + case 0x4a: + register_WY = value; + return; + + case 0x4b: + register_WX = value; + return; + + // KEY1 + case 0x4d: { + if(gbCgbMode) { + register_KEY1 = (register_KEY1 & 0x80) | (value & 1); + return; + } + } + break; + + // VBK + case 0x4f: { + if(gbCgbMode) { + value = value & 1; + + unsigned vramAddress = value * 0x2000; + gbMemoryMap[0x08] = &gbVram[vramAddress]; + gbMemoryMap[0x09] = &gbVram[vramAddress + 0x1000]; + + register_VBK = value; + } + return; + } + break; + + // HDMA1 + case 0x51: { + if(gbCgbMode) { + if(value > 0x7f && value < 0xa0) + value = 0; + + gbHdmaSource = (value << 8) | (register_HDMA2 & 0xf0); + + register_HDMA1 = value; + return; + } + } + break; + + // HDMA2 + case 0x52: { + if(gbCgbMode) { + value = value & 0xf0; + + gbHdmaSource = (register_HDMA1 << 8) | (value); + + register_HDMA2 = value; + return; + } + } + break; + + // HDMA3 + case 0x53: { + if(gbCgbMode) { + value = value & 0x1f; + gbHdmaDestination = (value << 8) | (register_HDMA4 & 0xf0); + gbHdmaDestination += 0x8000; + register_HDMA3 = value; + return; + } + } + break; + + // HDMA4 + case 0x54: { + if(gbCgbMode) { + value = value & 0xf0; + gbHdmaDestination = ((register_HDMA3 & 0x1f) << 8) | value; + gbHdmaDestination += 0x8000; + register_HDMA4 = value; + return; + } + } + break; + + // HDMA5 + case 0x55: { + if(gbCgbMode) { + gbHdmaBytes = 16 + (value & 0x7f) * 16; + if(gbHdmaOn) { + if(value & 0x80) { + register_HDMA5 = (value & 0x7f); + } else { + register_HDMA5 = 0xff; + gbHdmaOn = 0; + } + } else { + if(value & 0x80) { + gbHdmaOn = 1; + register_HDMA5 = value & 0x7f; + if(gbLcdMode == GBLCDM_HBLANK) + gbDoHdma(); + } else { + // we need to take the time it takes to complete the transfer into + // account... according to GB DEV FAQs, the setup time is the same + // for single and double speed, but the actual transfer takes the + // same time + //if(gbSpeed) + // gbDmaTicks = 231 + 16 * (value & 0x7f); + //else + // gbDmaTicks = 231 + 8 * (value & 0x7f); + gbDmaTicks = 231; + gbCopyMemory(gbHdmaDestination, + gbHdmaSource, + gbHdmaBytes); + gbHdmaDestination += gbHdmaBytes; + gbHdmaSource += gbHdmaBytes; + + register_HDMA3 = ((gbHdmaDestination - 0x8000) >> 8) & 0x1f; + register_HDMA4 = gbHdmaDestination & 0xf0; + register_HDMA1 = (gbHdmaSource >> 8) & 0xff; + register_HDMA2 = gbHdmaSource & 0xf0; + } + } + return; + } + } + break; + + + case 0x56: + register_RP = value & 0xC1; + break; + + // BCPS + case 0x68: { + if(gbCgbMode) { + int paletteIndex = (value & 0x3f) >> 1; + int paletteHiLo = (value & 0x01); + + register_BCPS = value; + register_BCPD = (paletteHiLo ? + (gbPalette[paletteIndex] >> 8) : + (gbPalette[paletteIndex] & 0x00ff)); + return; + } + } + break; + + // BCPD + case 0x69: { + if(gbCgbMode) { + int v = register_BCPS; + int paletteIndex = (v & 0x3f) >> 1; + int paletteHiLo = (v & 0x01); + register_BCPD = value; + gbPalette[paletteIndex] = (paletteHiLo ? + ((value << 8) | (gbPalette[paletteIndex] & 0xff)) : + ((gbPalette[paletteIndex] & 0xff00) | (value))) & 0x7fff; + + if(register_BCPS & 0x80) { + int index = ((register_BCPS & 0x3f) + 1) & 0x3f; + + register_BCPS = (register_BCPS & 0x80) | index; + + register_BCPD = (index & 1 ? + (gbPalette[index>>1] >> 8) : + (gbPalette[index>>1] & 0x00ff)); + + } + return; + } + } + break; + + // OCPS + case 0x6a: { + if(gbCgbMode) { + int paletteIndex = (value & 0x3f) >> 1; + int paletteHiLo = (value & 0x01); + + paletteIndex += 32; + + register_OCPS = value; + register_OCPD = (paletteHiLo ? + (gbPalette[paletteIndex] >> 8) : + (gbPalette[paletteIndex] & 0x00ff)); + return; + } + } + break; + + // OCPD + case 0x6b: { + if(gbCgbMode) { + int v = register_OCPS; + int paletteIndex = (v & 0x3f) >> 1; + int paletteHiLo = (v & 0x01); + + paletteIndex += 32; + + register_OCPD = value; + gbPalette[paletteIndex] = (paletteHiLo ? + ((value << 8) | (gbPalette[paletteIndex] & 0xff)) : + ((gbPalette[paletteIndex] & 0xff00) | (value))) & 0x7fff; + if(register_OCPS & 0x80) { + int index = ((register_OCPS & 0x3f) + 1) & 0x3f; + + register_OCPS = (register_OCPS & 0x80) | index; + + register_OCPD = (index & 1 ? + (gbPalette[(index>>1) + 32] >> 8) : + (gbPalette[(index>>1) + 32] & 0x00ff)); + + } + return; + } + } + break; + + case 0x6c: + register_FF6C = value & 1; + break; + + // SVBK + case 0x70: { + if(gbCgbMode) { + value = value & 7; + + int bank = value; + if(value == 0) + bank = 1; + + if(bank == gbWramBank) + return; + + int wramAddress = bank * 0x1000; + gbMemoryMap[0x0d] = &gbWram[wramAddress]; + + MDFNMP_AddRAM(0x1000, 0xD000, &gbWram[wramAddress]); + + gbWramBank = bank; + register_SVBK = value; + return; + } + } + break; + + case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: + case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: + case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: + case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf: + case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: + case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: + case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: + case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: + case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: + case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: + case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: + HRAM[address & 0x7F] = value; + return; + + case 0xff: + register_IE = value; + return; + } + + //printf("%04x\n", address); + //gbMemory[address - 0x8000] = value; +} + +uint8 gbReadMemory(uint16 address) +{ + uint8 retval = 0xFF; + + if(address < 0xa000) + retval = gbMemoryMap[address>>12][address&0x0fff]; + else if(address < 0xc000) + { + if(mapperReadRAM) + retval = mapperReadRAM(address); + else if(mapper && gbMemoryMap[address >> 12]) + { + //printf("%04x %d\n", address, gbRamSizeMask); + retval = gbMemoryMap[address >> 12][address & 0x0fff & gbRamSizeMask]; + } + } + else if(address < 0xfe00) + { + unsigned int page = (address >> 12); + if(page >= 0xE) page -= 2; + retval = gbMemoryMap[page][address & 0x0fff]; + } + else if(address < 0xfea0) + retval = gbOAM[address & 0xFF]; + else if(address >= 0xff00) + { + switch(address & 0x00ff) + { + case 0x00: + { + int b = register_P1; + + if((b & 0x30) == 0x20) { + b &= 0xf0; + + b |= ((gbJoymask >> 4) & 0xF) ^ 0xF; + + register_P1 = b; + } else if((b & 0x30) == 0x10) { + b &= 0xf0; + + b |= ((gbJoymask >> 0) & 0xF) ^ 0xF; + + register_P1 = b; + } else { + register_P1 = 0xff; + } + } + retval = register_P1; + break; + case 0x01: + retval = register_SB; + break; + case 0x02: + retval = register_SC; + break; + case 0x04: + retval = register_DIV; + break; + case 0x05: + retval = register_TIMA; + break; + case 0x06: + retval = register_TMA; + break; + case 0x07: + retval = 0xf8 | register_TAC; + break; + case 0x0f: + retval = 0xe0 | register_IF; + break; + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: + case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f: + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3a: case 0x3b: case 0x3c: case 0x3d: case 0x3e: case 0x3f: + retval = SOUND_Read(SoundTS, address); + break; + case 0x40: + retval = register_LCDC; + break; + case 0x41: + retval = 0x80 | register_STAT; + break; + case 0x42: + retval = register_SCY; + break; + case 0x43: + retval = register_SCX; + break; + case 0x44: + retval = register_LY; + break; + case 0x45: + retval = register_LYC; + break; + case 0x46: + retval = register_DMA; + break; + case 0x47: + retval = gbBgp[0] | (gbBgp[1] << 2) | (gbBgp[2] << 4) | (gbBgp[3] << 6); + break; + case 0x48: + retval = (gbObp0[0] & 3) | ((gbObp0[1] & 3) << 2) | ((gbObp0[2] & 3) << 4) | ((gbObp0[3] & 3) << 6); + break; + case 0x49: + retval = (gbObp1[0] & 3) | ((gbObp1[1] & 3) << 2) | ((gbObp1[2] & 3) << 4) | ((gbObp1[3] & 3) << 6); + break; + case 0x4a: + retval = register_WY; + break; + case 0x4b: + retval = register_WX; + break; + case 0x4d: + retval = register_KEY1; + break; + case 0x4f: + retval = 0xfe | register_VBK; + break; + case 0x51: + retval = register_HDMA1; + break; + case 0x52: + retval = register_HDMA2; + break; + case 0x53: + retval = register_HDMA3; + break; + case 0x54: + retval = register_HDMA4; + break; + case 0x55: + retval = register_HDMA5; + break; + case 0x56: + retval = register_RP; + break; + case 0x68: + retval = register_BCPS; + break; + case 0x69: + retval = register_BCPD; + break; + case 0x6a: + retval = register_OCPS; + break; + case 0x6b: + retval = register_OCPD; + break; + case 0x6c: + retval = (register_FF6C & 1) | 0xFE; + break; + case 0x70: + retval = (0xf8 | register_SVBK); + break; + case 0x72: + retval = gbCgbMode ? register_FF72 : 0xFF; + break; + case 0x73: + retval = gbCgbMode ? register_FF73 : 0xFF; + break; + case 0x74: + retval = gbCgbMode ? register_FF74 : 0xFF; + break; + case 0x75: + retval = gbCgbMode ? ((register_FF75 &~0x8F) | 0x8F) : 0xFF; + break; + case 0x76: + retval = gbCgbMode ? 0x00 : 0xFF; + break; + case 0x77: + retval = gbCgbMode ? 0x00 : 0xFF; + break; + + case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: + case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: + case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: + case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf: + case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7: + case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: + case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: + case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: + case 0xd8: case 0xd9: case 0xda: case 0xdb: case 0xdc: case 0xdd: case 0xde: case 0xdf: + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: + case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef: + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: + case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: + retval = HRAM[address & 0x7F]; + break; + case 0xff: + retval = register_IE; + break; + } + } + + if(SubCheatsOn) + { + std::vector::iterator chit; + + for(chit = SubCheats[address & 0x7].begin(); chit != SubCheats[address & 0x7].end(); chit++) + { + if(address == chit->addr) + { + //printf("%02x %02x %02x\n", retval, chit->value, chit->compare); + if(chit->compare == -1 || chit->compare == retval) + { + retval = chit->value; + } + } + } + } + + return(retval); + //printf("Unknown read: %04x\n", address); + //return(0xFF); + //return gbMemoryMap[address>>12][address & 0x0fff]; +} + +void gbSpeedSwitch() +{ + if(gbSpeed == 0) { + gbSpeed = 1; + GBLCD_MODE_0_CLOCK_TICKS = 51 * 2; //127; //51 * 2; + GBLCD_MODE_1_CLOCK_TICKS = 1140 * 2; + GBLCD_MODE_2_CLOCK_TICKS = 20 * 2; //52; //20 * 2; + GBLCD_MODE_3_CLOCK_TICKS = 43 * 2; //99; //43 * 2; + GBDIV_CLOCK_TICKS = 64 * 2; + GBLY_INCREMENT_CLOCK_TICKS = 114 * 2; + GBTIMER_MODE_0_CLOCK_TICKS = 256; //256*2; + GBTIMER_MODE_1_CLOCK_TICKS = 4; //4*2; + GBTIMER_MODE_2_CLOCK_TICKS = 16; //16*2; + GBTIMER_MODE_3_CLOCK_TICKS = 64; //64*2; + GBSERIAL_CLOCK_TICKS = 128 * 2; + gbDivTicks *= 2; + gbLcdTicks *= 2; + gbLcdLYIncrementTicks *= 2; + // timerTicks *= 2; + // timerClockTicks *= 2; + gbSerialTicks *= 2; + // synchronizeTicks *= 2; + // SYNCHRONIZE_CLOCK_TICKS *= 2; + } else { + gbSpeed = 0; + GBLCD_MODE_0_CLOCK_TICKS = 51; + GBLCD_MODE_1_CLOCK_TICKS = 1140; + GBLCD_MODE_2_CLOCK_TICKS = 20; + GBLCD_MODE_3_CLOCK_TICKS = 43; + GBDIV_CLOCK_TICKS = 64; + GBLY_INCREMENT_CLOCK_TICKS = 114; + GBTIMER_MODE_0_CLOCK_TICKS = 256; + GBTIMER_MODE_1_CLOCK_TICKS = 4; + GBTIMER_MODE_2_CLOCK_TICKS = 16; + GBTIMER_MODE_3_CLOCK_TICKS = 64; + GBSERIAL_CLOCK_TICKS = 128; + gbDivTicks /= 2; + gbLcdTicks /= 2; + gbLcdLYIncrementTicks /= 2; + // timerTicks /= 2; + // timerClockTicks /= 2; + gbSerialTicks /= 2; + // synchronizeTicks /= 2; + // SYNCHRONIZE_CLOCK_TICKS /= 2; + } +} + +void gbReset() +{ + GBZ80_Reset(); + + register_DIV = 0; + register_TIMA = 0; + register_TMA = 0; + register_TAC = 0; + register_IF = 1; + register_LCDC = 0x91; + register_STAT = 0; + register_SCY = 0; + register_SCX = 0; + register_LY = 0; + register_LYC = 0; + register_DMA = 0; + register_WY = 0; + register_WX = 0; + register_VBK = 0; + register_HDMA1 = 0; + register_HDMA2 = 0; + register_HDMA3 = 0; + register_HDMA4 = 0; + register_HDMA5 = 0; + register_SVBK = 0; + register_IE = 0; + + if(gbCgbMode) + { + register_HDMA5 = 0xff; + register_BCPS = 0xc0; + register_OCPS = 0xc0; + } + else + { + for(int i = 0; i < 8; i++) + { + int fun = 3 - (i & 3); + fun *= 6; + fun += 4; + gbPalette[i] = fun | (fun << 5) | (fun << 10); + } + } + + if(gbSpeed) { + gbSpeedSwitch(); + register_KEY1 = 0; + } + + gbDivTicks = GBDIV_CLOCK_TICKS; + gbLcdMode = GBLCDM_OAM; + gbLcdTicks = GBLCD_MODE_2_CLOCK_TICKS; + gbLcdLYIncrementTicks = 0; + gbTimerTicks = 0; + gbTimerClockTicks = 0; + gbSerialTicks = 0; + gbSerialBits = 0; + gbSerialOn = 0; + gbWindowLine = -1; + gbTimerOn = 0; + gbTimerMode = 0; + // gbSynchronizeTicks = GBSYNCHRONIZE_CLOCK_TICKS; + gbSpeed = 0; + gbJoymask = 0; + + if(gbCgbMode) { + gbSpeed = 0; + gbHdmaOn = 0; + gbHdmaSource = 0x0000; + gbHdmaDestination = 0x8000; + gbWramBank = 1; + register_LY = 0x90; + gbLcdMode = GBLCDM_VBLANK; + for(int i = 0; i < 64; i++) + gbPalette[i] = 0x7fff; + } + + for(int i = 0; i < 4; i++) + { + gbBgp[i] = i; + gbObp0[i] = 4 | i; + gbObp1[i] = 8 | i; + } + + memset(&gbDataMBC1,0, sizeof(gbDataMBC1)); + gbDataMBC1.mapperROMBank = 1; + + gbDataMBC2.mapperRAMEnable = 0; + gbDataMBC2.mapperROMBank = 1; + + memset(&gbDataMBC3,0, 6 * sizeof(int)); + gbDataMBC3.mapperROMBank = 1; + + memset(&gbDataMBC5, 0, sizeof(gbDataMBC5)); + gbDataMBC5.mapperROMBank = 1; + + memset(&gbDataHuC1, 0, sizeof(gbDataHuC1)); + gbDataHuC1.mapperROMBank = 1; + + memset(&gbDataHuC3, 0, sizeof(gbDataHuC3)); + gbDataHuC3.mapperROMBank = 1; + + gbMemoryMap[0x00] = &gbRom[0x0000]; + gbMemoryMap[0x01] = &gbRom[0x1000]; + gbMemoryMap[0x02] = &gbRom[0x2000]; + gbMemoryMap[0x03] = &gbRom[0x3000]; + gbMemoryMap[0x04] = &gbRom[0x4000]; + gbMemoryMap[0x05] = &gbRom[0x5000]; + gbMemoryMap[0x06] = &gbRom[0x6000]; + gbMemoryMap[0x07] = &gbRom[0x7000]; + gbMemoryMap[0x08] = &gbVram[0x0000]; + gbMemoryMap[0x09] = &gbVram[0x1000]; + gbMemoryMap[0x0a] = NULL; + gbMemoryMap[0x0b] = NULL; + gbMemoryMap[0x0c] = &gbWram[0x0000]; + gbMemoryMap[0x0d] = &gbWram[0x1000]; + gbMemoryMap[0x0e] = NULL; + gbMemoryMap[0x0f] = NULL; + + if(gbRam) + { + gbMemoryMap[0x0a] = &gbRam[0x0000]; + + if(gbRamSize > 0x1000) + gbMemoryMap[0x0b] = &gbRam[0x1000]; + else + gbMemoryMap[0x0b] = gbMemoryMap[0x0a]; + } + + SOUND_Reset(); + + // BIOS simulate + SOUND_Write(0, 0xFF26, 0x80); + SOUND_Write(0, 0xFF11, 0x80); + SOUND_Write(0, 0xFF12, 0xF3); + SOUND_Write(0, 0xFF25, 0xF3); + SOUND_Write(0, 0xFF24, 0x77); +} + +static void gbPower(void) +{ + snooze = 0; + PadInterruptDelay = 0; + + if(gbCgbMode) + { + memset(gbWram,0,0x8000); + memset(gbVram, 0, 0x4000); + } + else + { + memset(gbWram, 0x00, 0x2000); + memset(gbVram, 0x00, 0x2000); + } + memset(gbOAM, 0x00, 0xA0); + memset(HRAM, 0x00, 0x80); + + if(gbRam && !gbBattery) + memset(gbRam, 0xFF, gbRamSize); + + gbReset(); +} + +static void gbWriteSaveMBC1(const std::string& path) +{ + MDFN_DumpToFile(path, gbRam, gbRamSize, true); +} + +static void gbWriteSaveMBC2(const std::string& path) +{ + MDFN_DumpToFile(path, gbRam, 256 * 2, true); +} + +static void gbWriteSaveMBC3(const std::string& path, bool extendedSave) +{ + std::vector EvilRams; + uint8 time_buffer[10 * 4 + 8]; // 10 uint32, 1 uint64 + + EvilRams.push_back(PtrLengthPair(gbRam, gbRamSize)); + + if(extendedSave) + { + MDFN_en32lsb(time_buffer + 0, gbDataMBC3.mapperSeconds); + MDFN_en32lsb(time_buffer + 4, gbDataMBC3.mapperMinutes); + MDFN_en32lsb(time_buffer + 8, gbDataMBC3.mapperHours); + MDFN_en32lsb(time_buffer + 12, gbDataMBC3.mapperDays); + MDFN_en32lsb(time_buffer + 16, gbDataMBC3.mapperControl); + MDFN_en32lsb(time_buffer + 20, gbDataMBC3.mapperLSeconds); + MDFN_en32lsb(time_buffer + 24, gbDataMBC3.mapperLMinutes); + MDFN_en32lsb(time_buffer + 28, gbDataMBC3.mapperLHours); + MDFN_en32lsb(time_buffer + 32, gbDataMBC3.mapperLDays); + MDFN_en32lsb(time_buffer + 36, gbDataMBC3.mapperLControl); + MDFN_en64lsb(time_buffer + 40, gbDataMBC3.mapperLastTime); + + EvilRams.push_back(PtrLengthPair(time_buffer, sizeof(time_buffer))); + } + + MDFN_DumpToFile(path, EvilRams, true); +} + +static void gbWriteSaveMBC5(const std::string& path) +{ + MDFN_DumpToFile(path, gbRam, gbRamSize, true); +} + +static void gbWriteSaveMBC7(const std::string& path) +{ + MDFN_DumpToFile(path, gbRam, 256, true); +} + +static void gbReadSaveMBC1(const std::string& path) +{ + std::unique_ptr file = MDFN_AmbigGZOpenHelper(path, std::vector({ (unsigned)gbRamSize })); + + file->read(gbRam, gbRamSize); +} + +static void gbReadSaveMBC2(const std::string& path) +{ + std::unique_ptr file = MDFN_AmbigGZOpenHelper(path, std::vector({ 256 * 2 })); + + file->read(gbRam, 256 * 2); +} + +static void gbReadSaveMBC3(const std::string& path) +{ + uint8 time_buffer[10 * 4 + 8]; // 10 uint32, 1 uint64 + std::unique_ptr file = MDFN_AmbigGZOpenHelper(path, std::vector({ (unsigned)gbRamSize, (unsigned)gbRamSize + sizeof(time_buffer) })); + + file->read(gbRam, gbRamSize); + + if(file->read(&time_buffer[0], 1, false) == 1) + { + file->read(&time_buffer[1], sizeof(time_buffer) - 1); + + gbDataMBC3.mapperSeconds = MDFN_de32lsb(time_buffer + 0); + gbDataMBC3.mapperMinutes = MDFN_de32lsb(time_buffer + 4); + gbDataMBC3.mapperHours = MDFN_de32lsb(time_buffer + 8); + gbDataMBC3.mapperDays = MDFN_de32lsb(time_buffer + 12); + gbDataMBC3.mapperControl = MDFN_de32lsb(time_buffer + 16); + gbDataMBC3.mapperLSeconds = MDFN_de32lsb(time_buffer + 20); + gbDataMBC3.mapperLMinutes = MDFN_de32lsb(time_buffer + 24); + gbDataMBC3.mapperLHours = MDFN_de32lsb(time_buffer + 28); + gbDataMBC3.mapperLDays = MDFN_de32lsb(time_buffer + 32); + gbDataMBC3.mapperLControl = MDFN_de32lsb(time_buffer + 36); + gbDataMBC3.mapperLastTime = MDFN_de64lsb(time_buffer + 40); + } +} + +static void gbReadSaveMBC5(const std::string& path) +{ + std::unique_ptr file = MDFN_AmbigGZOpenHelper(path, std::vector({ (unsigned)gbRamSize })); + + file->read(gbRam, gbRamSize); +} + +static void gbReadSaveMBC7(const std::string& path) +{ + std::unique_ptr file = MDFN_AmbigGZOpenHelper(path, std::vector({ 256 })); + + file->read(gbRam, 256); +} + +static void gbWriteBatteryFile(const std::string& path, bool extendedSave) +{ + if(gbBattery) + { + int type = gbRom[0x147]; + + switch(type) + { + case 0x03: + gbWriteSaveMBC1(path); + break; + case 0x06: + gbWriteSaveMBC2(path); + break; + case 0x0f: + case 0x10: + case 0x13: + gbWriteSaveMBC3(path, extendedSave); + break; + case 0x1b: + case 0x1e: + gbWriteSaveMBC5(path); + break; + case 0x22: + gbWriteSaveMBC7(path); + break; + case 0xff: + gbWriteSaveMBC1(path); + break; + } + } +} + +static void gbReadBatteryFile(const std::string& path) +{ + if(gbBattery) + { + int type = gbRom[0x147]; + + switch(type) + { + case 0x03: + gbReadSaveMBC1(path); + break; + + case 0x06: + gbReadSaveMBC2(path); + break; + + case 0x0f: + case 0x10: + case 0x13: + // + // Initialize time data before loading from save file, in case save file doesn't exist(or doesn't contain the time data) and throws an exception. + // + { + time_t tmp; + + time(&tmp); + gbDataMBC3.mapperLastTime = tmp; + struct tm *lt; + lt = localtime(&tmp); + gbDataMBC3.mapperSeconds = lt->tm_sec; + gbDataMBC3.mapperMinutes = lt->tm_min; + gbDataMBC3.mapperHours = lt->tm_hour; + gbDataMBC3.mapperDays = lt->tm_yday & 255; + gbDataMBC3.mapperControl = (gbDataMBC3.mapperControl & 0xfe) | + (lt->tm_yday > 255 ? 1: 0); + } + gbReadSaveMBC3(path); + break; + + case 0x1b: + case 0x1e: + gbReadSaveMBC5(path); + break; + + case 0x22: + gbReadSaveMBC7(path); + break; + + case 0xff: + gbReadSaveMBC1(path); + break; + } + } +} + +static SFORMAT Joy_StateRegs[] = +{ + SFVAR(gbJoymask), + SFEND +}; + +static SFORMAT MBC1_StateRegs[] = +{ + SFVARN(gbDataMBC1.mapperRAMEnable, "RAME"), + SFVARN(gbDataMBC1.mapperROMBank, "ROMB"), + SFVARN(gbDataMBC1.mapperRAMBank,"RAMB"), + SFVARN(gbDataMBC1.mapperMemoryModel, "MEMM"), + SFEND +}; + +static SFORMAT MBC2_StateRegs[] = +{ + SFVARN(gbDataMBC2.mapperRAMEnable, "RAME"), + SFVARN(gbDataMBC2.mapperROMBank, "ROMB"), + SFEND +}; + +static SFORMAT MBC3_StateRegs[] = +{ + SFVARN(gbDataMBC3.mapperRAMEnable, "RAME"), + SFVARN(gbDataMBC3.mapperROMBank, "ROMB"), + SFVARN(gbDataMBC3.mapperRAMBank, "RAMB"), + SFVARN(gbDataMBC3.mapperClockLatch, "CLKL"), + SFVARN(gbDataMBC3.mapperClockRegister, "CLKR"), + SFVARN(gbDataMBC3.mapperSeconds, "SEC"), + SFVARN(gbDataMBC3.mapperHours, "HOUR"), + SFVARN(gbDataMBC3.mapperDays, "DAY"), + SFVARN(gbDataMBC3.mapperControl, "CTRL"), + + SFVARN(gbDataMBC3.mapperLSeconds, "LSEC"), + SFVARN(gbDataMBC3.mapperLHours, "LHUR"), + SFVARN(gbDataMBC3.mapperLDays, "LDAY"), + SFVARN(gbDataMBC3.mapperLControl, "LCTR"), + SFVARN(gbDataMBC3.mapperLastTime, "LTIM"), + SFEND +}; + +static SFORMAT MBC5_StateRegs[] = +{ + SFVAR(gbDataMBC5.mapperRAMEnable), + SFVAR(gbDataMBC5.mapperROMBank), + SFVAR(gbDataMBC5.mapperRAMBank), + SFVAR(gbDataMBC5.mapperROMHighAddress), + SFVAR(gbDataMBC5.isRumbleCartridge), + SFEND +}; + +static SFORMAT MBC7_StateRegs[] = +{ + SFVARN(gbDataMBC7.mapperROMBank, "ROMB"), + SFVARN(gbDataMBC7.cs, "CS"), + SFVARN(gbDataMBC7.sk, "SK"), + SFVARN(gbDataMBC7.state, "STTE"), + SFVARN(gbDataMBC7.buffer, "BUF"), + SFVARN(gbDataMBC7.idle, "IDLE"), + SFVARN(gbDataMBC7.count, "CONT"), + SFVARN(gbDataMBC7.code, "CODE"), + SFVARN(gbDataMBC7.address, "ADDR"), + SFVARN(gbDataMBC7.writeEnable, "WRE"), + SFVARN(gbDataMBC7.value, "VALU"), + + SFVARN(gbDataMBC7.curtiltx, "TILTX"), + SFVARN(gbDataMBC7.curtilty, "TILTY"), + + SFEND +}; + +static SFORMAT HuC1_StateRegs[] = +{ + SFVARN(gbDataHuC1.mapperRAMEnable, "RAME"), + SFVARN(gbDataHuC1.mapperROMBank, "ROMB"), + SFVARN(gbDataHuC1.mapperRAMBank, "RAMB"), + SFVARN(gbDataHuC1.mapperMemoryModel, "MEMM"), + SFVARN(gbDataHuC1.mapperROMHighAddress, "ROMH"), + SFEND +}; + +static SFORMAT HuC3_StateRegs[] = +{ + SFVARN(gbDataHuC3.mapperRAMEnable, "RAME"), + SFVARN(gbDataHuC3.mapperROMBank, "ROMB"), + SFVARN(gbDataHuC3.mapperRAMBank, "RAMB"), + SFVARN(gbDataHuC3.mapperAddress, "ADDR"), + SFVARN(gbDataHuC3.mapperRAMFlag, "RAMF"), + SFVARN(gbDataHuC3.mapperRAMValue, "RAMV"), + SFVARN(gbDataHuC3.mapperRegister1, "REG1"), + SFVARN(gbDataHuC3.mapperRegister2, "REG2"), + SFVARN(gbDataHuC3.mapperRegister3, "REG3"), + SFVARN(gbDataHuC3.mapperRegister4, "REG4"), + SFVARN(gbDataHuC3.mapperRegister5, "REG5"), + SFVARN(gbDataHuC3.mapperRegister6, "REG6"), + SFVARN(gbDataHuC3.mapperRegister7, "REG7"), + SFVARN(gbDataHuC3.mapperRegister8, "REG8"), + + SFEND +}; + + +static SFORMAT gbSaveGameStruct[] = +{ + SFVAR(GBLCD_MODE_0_CLOCK_TICKS), + SFVAR(GBLCD_MODE_1_CLOCK_TICKS), + SFVAR(GBLCD_MODE_2_CLOCK_TICKS), + SFVAR(GBLCD_MODE_3_CLOCK_TICKS), + SFVAR(GBDIV_CLOCK_TICKS), + SFVAR(GBLY_INCREMENT_CLOCK_TICKS), + SFVAR(GBTIMER_MODE_0_CLOCK_TICKS), + SFVAR(GBTIMER_MODE_1_CLOCK_TICKS), + SFVAR(GBTIMER_MODE_2_CLOCK_TICKS), + SFVAR(GBTIMER_MODE_3_CLOCK_TICKS), + SFVAR(GBSERIAL_CLOCK_TICKS), + SFVAR(GBSYNCHRONIZE_CLOCK_TICKS), + + SFVAR(snooze), + SFVAR(PadInterruptDelay), + + SFVAR(gbDivTicks), + SFVAR(gbLcdMode), + SFVAR(gbLcdTicks), + SFVAR(gbLcdLYIncrementTicks), + SFVAR(gbTimerTicks), + SFVAR(gbTimerClockTicks), + SFVAR(gbSerialTicks), + SFVAR(gbSerialBits), + SFVAR(gbSynchronizeTicks), + SFVAR(gbTimerOn), + SFVAR(gbTimerMode), + SFVAR(gbSerialOn), + SFVAR(gbWindowLine), + //SFVAR(gbCgbMode), + SFVAR(gbWramBank), + SFVAR(gbHdmaSource), + SFVAR(gbHdmaDestination), + SFVAR(gbHdmaBytes), + SFVAR(gbHdmaOn), + SFVAR(gbSpeed), + SFVAR(gbDmaTicks), + SFVAR(register_P1), + SFVAR(register_SB), + SFVAR(register_SC), + SFVAR(register_DIV), + SFVAR(register_TIMA), + SFVAR(register_TMA), + SFVAR(register_TAC), + SFVAR(register_IF), + SFVAR(register_LCDC), + SFVAR(register_STAT), + SFVAR(register_SCY), + SFVAR(register_SCX), + SFVAR(register_LY), + SFVAR(register_LYC), + SFVAR(register_DMA), + SFVAR(register_WY), + SFVAR(register_WX), + SFVAR(register_VBK), + SFVAR(register_HDMA1), + SFVAR(register_HDMA2), + SFVAR(register_HDMA3), + SFVAR(register_HDMA4), + SFVAR(register_HDMA5), + SFVAR(register_RP), + SFVAR(register_FF6C), + SFVAR(register_SVBK), + SFVAR(register_FF72), + SFVAR(register_FF73), + SFVAR(register_FF74), + SFVAR(register_FF75), + SFVAR(register_IE), + SFARRAYN(gbBgp, 4, "BGP"), + SFARRAYN(gbObp0, 4, "OBP0"), + SFARRAYN(gbObp1, 4, "OBP1"), + SFEND +}; + +static void CloseGame(void) MDFN_COLD; +static void CloseGame(void) +{ + try + { + gbWriteBatteryFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), true); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + + Cleanup(); +} + +static void StateRest(int version) +{ + register_SVBK &= 7; + register_VBK &= 1; + + for(unsigned i = 0; i < 4; i++) + { + gbBgp[i] = gbBgp[i] & 0x3; + gbObp0[i] = (gbObp0[i] & 0x3) | 4; + gbObp1[i] = (gbObp1[i] & 0x3) | 8; + } + + gbMemoryMap[0x00] = &gbRom[0x0000]; + gbMemoryMap[0x01] = &gbRom[0x1000]; + gbMemoryMap[0x02] = &gbRom[0x2000]; + gbMemoryMap[0x03] = &gbRom[0x3000]; + gbMemoryMap[0x04] = &gbRom[0x4000]; + gbMemoryMap[0x05] = &gbRom[0x5000]; + gbMemoryMap[0x06] = &gbRom[0x6000]; + gbMemoryMap[0x07] = &gbRom[0x7000]; + gbMemoryMap[0x08] = &gbVram[0x0000]; + gbMemoryMap[0x09] = &gbVram[0x1000]; + gbMemoryMap[0x0a] = NULL; + gbMemoryMap[0x0b] = NULL; + gbMemoryMap[0x0c] = &gbWram[0x0000]; + gbMemoryMap[0x0d] = &gbWram[0x1000]; + gbMemoryMap[0x0e] = NULL; + gbMemoryMap[0x0f] = NULL; + + if(gbRam) + { + gbMemoryMap[0x0a] = &gbRam[0x0000]; + + if(gbRamSize > 0x1000) + gbMemoryMap[0x0b] = &gbRam[0x1000]; + else + gbMemoryMap[0x0b] = gbMemoryMap[0x0a]; + } + + int type = gbRom[0x147]; + + switch(type) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + // MBC 1 + memoryUpdateMapMBC1(); + break; + case 0x05: + case 0x06: + // MBC2 + memoryUpdateMapMBC2(); + break; + case 0x0f: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + // MBC 3 + memoryUpdateMapMBC3(); + break; + case 0x19: + case 0x1a: + case 0x1b: + // MBC5 + memoryUpdateMapMBC5(); + break; + case 0x1c: + case 0x1d: + case 0x1e: + // MBC 5 Rumble + memoryUpdateMapMBC5(); + break; + case 0x22: + // MBC 7 + memoryUpdateMapMBC7(); + break; + case 0xfe: + // HuC3 + memoryUpdateMapHuC3(); + break; + case 0xff: + // HuC1 + memoryUpdateMapHuC1(); + break; + } + + if(gbCgbMode) + { + int value = register_SVBK; + if(value == 0) + value = 1; + + gbMemoryMap[0x08] = &gbVram[register_VBK * 0x2000]; + gbMemoryMap[0x09] = &gbVram[register_VBK * 0x2000 + 0x1000]; + gbMemoryMap[0x0d] = &gbWram[value * 0x1000]; + + gbWramBank = value; + } + +} + +uint32 gblayerSettings; + +static const char *GetGBRAMSizeString(uint8 t) +{ + const char *type = _("Unknown"); + + switch(t) + { + case 0: + type = _("None"); + break; + case 1: + type = "2K"; + break; + case 2: + type = "8K"; + break; + case 3: + type = "32K"; + break; + case 4: + type = "128K"; + break; + case 5: + type = "64K"; + break; + } + + return(type); +} + + +static const char *GetGBTypeString(uint8 t) +{ + const char *type = _("Unknown"); + + switch(t) + { + case 0x00: + type = "ROM"; + break; + case 0x01: + type = "ROM+MBC1"; + break; + case 0x02: + type = "ROM+MBC1+RAM"; + break; + case 0x03: + type = "ROM+MBC1+RAM+BATT"; + break; + case 0x05: + type = "ROM+MBC2"; + break; + case 0x06: + type = "ROM+MBC2+BATT"; + break; + case 0x0f: + type = "ROM+MBC3+TIMER+BATT"; + break; + case 0x10: + type = "ROM+MBC3+TIMER+RAM+BATT"; + break; + case 0x11: + type = "ROM+MBC3"; + break; + case 0x12: + type = "ROM+MBC3+RAM"; + break; + case 0x13: + type = "ROM+MBC3+RAM+BATT"; + break; + case 0x19: + type = "ROM+MBC5"; + break; + case 0x1a: + type = "ROM+MBC5+RAM"; + break; + case 0x1b: + type = "ROM+MBC5+RAM+BATT"; + break; + case 0x1c: + type = "ROM+MBC5+RUMBLE"; + break; + case 0x1d: + type = "ROM+MBC5+RUMBLE+RAM"; + break; + case 0x1e: + type = "ROM+MBC5+RUMBLE+RAM+BATT"; + break; + case 0x22: + type = "ROM+MBC7+BATT"; + break; + case 0xfe: + type = "ROM+HuC-3"; + break; + case 0xff: + type = "ROM+HuC-1"; + break; + } + + return(type); +} + +static bool TestMagic(MDFNFILE *fp) +{ + static const uint8 GBMagic[8] = { 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B }; + uint8 data[0x200]; + + if(fp->read(data, 0x200, false) != 0x200 || memcmp(data + 0x104, GBMagic, 8)) + return false; + + return true; +} + +static void Cleanup(void) +{ + SOUND_Kill(); + + if(gbRam != NULL) + { + delete[] gbRam; + gbRam = NULL; + } + + if(gbRom != NULL) + { + delete[] gbRom; + gbRom = NULL; + } + + if(gbVram != NULL) + { + delete[] gbVram; + gbVram = NULL; + } + + if(gbWram != NULL) + { + delete[] gbWram; + gbWram = NULL; + } + + if(gbColorFilter) + { + delete[] gbColorFilter; + gbColorFilter = NULL; + } +} + +static void Load(MDFNFILE *fp) MDFN_COLD; +static void Load(MDFNFILE *fp) +{ + try + { + gbColorFilter = new uint32[32768]; + + gbEmulatorType = MDFN_GetSettingI("gb.system_type"); + + MDFNMP_Init(128, (65536 + 32768) / 128); // + 32768 for GBC WRAM for supported GameShark cheats with RAM page numbers + + SOUND_Init(); + + LoadROM(fp); + + md5_context md5; + md5.starts(); + md5.update(gbRom, gbRomSize); + md5.finish(MDFNGameInfo->MD5); + + MDFNGameInfo->GameSetMD5Valid = FALSE; + + MDFN_printf(_("ROM: %dKiB\n"), (gbRomSize + 1023) / 1024); + MDFN_printf(_("ROM CRC32: 0x%08x\n"), (unsigned int)crc32(0, gbRom, gbRomSize)); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + MDFN_printf(_("Type: 0x%02x(%s)\n"), gbRom[0x147], GetGBTypeString(gbRom[0x147])); + MDFN_printf(_("RAM Size: 0x%02x(%s)\n"), gbRom[0x149], GetGBRAMSizeString(gbRom[0x149])); + MDFN_printf(_("Version: 0x%02x\n"), gbRom[0x14C]); + + // + // + // + + try + { + gbReadBatteryFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav")); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + gblayerSettings = 0xFF; + + + MDFNGameInfo->CPInfoActiveBF = 1 << (bool)gbCgbMode; + } + catch(std::exception &e) + { + Cleanup(); + throw; + } +} + +static void LoadROM(MDFNFILE* fp) +{ + uint8 header[0x200]; + + fp->read(header, 0x200); + + if(header[0x148] > 8) + throw MDFN_Error(0, _("Unsupported ROM size specified in GB header.")); + + gbRomSize = gbRomSizes[header[0x148]]; + gbRomSizeMask = gbRomSizesMasks[header[0x148]]; + + gbRom = new uint8[gbRomSize]; + memset(gbRom, 0xFF, gbRomSize); + memcpy(gbRom, header, std::min(0x200, gbRomSize)); + + if(gbRomSize > 0x200) // && in_rom_size > 0x200) + fp->read(gbRom + 0x200, gbRomSize - 0x200); // std::min(in_rom_size, gbRomSize) - 0x200); + + if(header[0x149] > 5) + throw MDFN_Error(0, _("Unsupported RAM size specified in GB header.")); + + gbRamSize = gbRamSizes[header[0x149]]; + gbRamSizeMask = gbRamSizesMasks[header[0x149]]; + + int type = header[0x147]; + + mapperReadRAM = NULL; + + switch(type) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + // MBC 1 + mapper = mapperMBC1ROM; + mapperRAM = mapperMBC1RAM; + break; + case 0x05: + case 0x06: + // MBC2 + mapper = mapperMBC2ROM; + mapperRAM = mapperMBC2RAM; + gbRamSize = 0x200; + gbRamSizeMask = 0x1ff; + break; + case 0x0f: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + // MBC 3 + mapper = mapperMBC3ROM; + mapperRAM = mapperMBC3RAM; + mapperReadRAM = mapperMBC3ReadRAM; + break; + case 0x19: + case 0x1a: + case 0x1b: + // MBC5 + mapper = mapperMBC5ROM; + mapperRAM = mapperMBC5RAM; + break; + case 0x1c: + case 0x1d: + case 0x1e: + // MBC 5 Rumble + mapper = mapperMBC5ROM; + mapperRAM = mapperMBC5RAM; + break; + case 0x22: + // MBC 7 + mapper = mapperMBC7ROM; + mapperRAM = mapperMBC7RAM; + mapperReadRAM = mapperMBC7ReadRAM; + gbRamSize = 0x200; + gbRamSizeMask = 0x1ff; + break; + case 0xfe: + // HuC3 + mapper = mapperHuC3ROM; + mapperRAM = mapperHuC3RAM; + mapperReadRAM = mapperHuC3ReadRAM; + break; + case 0xff: + // HuC1 + mapper = mapperHuC1ROM; + mapperRAM = mapperHuC1RAM; + break; + default: + throw MDFN_Error(0, _("Unsupported mapper type specified in GB header.")); + } + + switch(type) { + case 0x03: + case 0x06: + case 0x0f: + case 0x10: + case 0x13: + case 0x1b: + case 0x1d: + case 0x1e: + case 0x22: + case 0xff: + gbBattery = 1; + break; + } + + if(gbRamSize) { + gbRam = new uint8[gbRamSize]; + memset(gbRam, 0xFF, gbRamSize); + } + + // CGB bit + if(header[0x143] & 0x80) + { + if(gbEmulatorType == 0 || + gbEmulatorType == 1 || + gbEmulatorType == 4 || + gbEmulatorType == 5) { + gbCgbMode = 1; + memset(gbPalette,0, 2*128); + } else { + gbCgbMode = 0; + } + } + else + gbCgbMode = 0; + + if(gbCgbMode) + { + gbWram = new uint8[0x8000]; + memset(gbWram, 0, 0x8000); + MDFNMP_AddRAM(0x8000, 0x10000, gbWram); + + gbVram = new uint8[0x4000]; + memset(gbVram, 0, 0x4000); + } + else + { + gbWram = new uint8[0x2000]; + memset(gbWram,0,0x2000); + + for(unsigned x = 0; x < 32768; x += 8192) + MDFNMP_AddRAM(0x2000, 0x10000 | x, &gbWram[0]); + + gbVram = new uint8[0x2000]; + memset(gbVram, 0, 0x2000); + } + + MDFNMP_AddRAM(0x80, 0xFF80, HRAM); + MDFNMP_AddRAM(0x2000, 0xC000, gbWram); + + if(gbRam) + MDFNMP_AddRAM(gbRamSize > 8192 ? 8192 : gbRamSize, 0xA000, gbRam); + + switch(type) { + case 0x1c: + case 0x1d: + case 0x1e: + gbDataMBC5.isRumbleCartridge = 1; + } + + gbPower(); +} + + +template +static void CopyLineSurface(MDFN_Surface *surface) +{ + T *dest = surface->pix() + register_LY * surface->pitchinpix; + + if(gbCgbMode) + { + for(int x = 0; x < 160;) + { + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + *dest++ = gbColorFilter[gbLineMix.cgb[x++]]; + } + } + else // to if(gbCgbMode) + { + if(sizeof(T) == 1) + { + for(int x = 0; x < 160; x++) + dest[x] = gbLineMix.dmg[x]; + } + else + { + for(int x = 0; x < 160; x++) + dest[x] = gbMonoColorMap[gbLineMix.dmg[x]]; + } + } +} + +template +static void FillLineSurface(MDFN_Surface *surface, int y) +{ + T* dest = surface->pix() + y * surface->pitchinpix; + uint32 fill_color = gbCgbMode ? gbColorFilter[gbPalette[0]] : ((sizeof(T) == 1) ? 12 : gbMonoColorMap[12]); + + for(int x = 0; x < 160; x++) + dest[x] = fill_color; +} + +static uint8 *paddie, *tilt_paddie; + +static void MDFNGB_SetInput(unsigned port, const char *type, uint8 *ptr) +{ + if(port) + tilt_paddie = (uint8*)ptr; + else + paddie = (uint8*)ptr; +} + +static void Emulate(EmulateSpecStruct *espec) +{ + bool linedrawn[144]; + +#if 0 + { + static bool firstcat = true; + MDFN_PixelFormat nf; + + nf.bpp = 8; + nf.colorspace = MDFN_COLORSPACE_RGB; + nf.Rshift = 0; + nf.Gshift = 0; + nf.Bshift = 0; + nf.Ashift = 8; + + nf.Rprec = 6; + nf.Gprec = 6; + nf.Bprec = 6; + nf.Aprec = 0; + + espec->surface->SetFormat(nf, false); + espec->VideoFormatChanged = firstcat; + firstcat = false; + } +#endif + + if(espec->VideoFormatChanged) + SetPixelFormat(espec->surface->format, gbCgbMode, espec->CustomPalette, espec->CustomPaletteNumEntries); + + if(espec->SoundFormatChanged) + MDFNGB_SetSoundRate(espec->SoundRate); + + + + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.w = 160; + espec->DisplayRect.h = 144; + + memset(linedrawn, 0, sizeof(linedrawn)); + + if(!espec->skip && espec->surface->palette) + memcpy(espec->surface->palette, PalTest, sizeof(PalTest)); + + if(gbRom[0x147] == 0x22) + { + gbDataMBC7.curtiltx = 2048 + ((int32)MDFN_de16lsb(&tilt_paddie[0x4]) - (int32)MDFN_de16lsb(&tilt_paddie[0x6])) / 200; + gbDataMBC7.curtilty = 2048 + ((int32)MDFN_de16lsb(&tilt_paddie[0x0]) - (int32)MDFN_de16lsb(&tilt_paddie[0x2])) / 200; + } + + if(*paddie != gbJoymask) + { + PadInterruptDelay = 20; + } + + MDFNMP_ApplyPeriodicCheats(); + int clockTicks = 0; + int doret = 0; + + while(!doret && SoundTS < 72000) + { + if(gbDmaTicks) + { + clockTicks = 4; + gbDmaTicks -= 4; + if(gbDmaTicks < 0) { clockTicks += gbDmaTicks; gbDmaTicks = 0; } + } + else + clockTicks = GBZ80_RunOp(); + + SoundTS += clockTicks << (2 - gbSpeed); + + gbDivTicks -= clockTicks; + while(gbDivTicks <= 0) + { + register_DIV++; + gbDivTicks += GBDIV_CLOCK_TICKS; + } + + if(PadInterruptDelay > 0) + { + PadInterruptDelay -= clockTicks; + if(PadInterruptDelay <= 0) + { + gbJoymask = *paddie; + register_IF |= 0x10; + } + } + + if(snooze > 0) + { + snooze -= clockTicks; + if(snooze <= 0) + { + register_IF |= 1; // V-Blank interrupt + if(register_STAT & 0x10) + register_IF |= 2; + } + } + + + if(register_LCDC & 0x80) + { + // LCD stuff + gbLcdTicks -= clockTicks; + if(gbLcdMode == GBLCDM_VBLANK) + { + // during V-BLANK,we need to increment LY at the same rate! + gbLcdLYIncrementTicks -= clockTicks; + while(gbLcdLYIncrementTicks <= 0) + { + gbLcdLYIncrementTicks += GBLY_INCREMENT_CLOCK_TICKS; + + if(register_LY < 153) + { + register_LY++; + gbCompareLYToLYC(); + + if(register_LY >= 153) + gbLcdLYIncrementTicks = 6; + } + else + { + register_LY = 0x00; + // reset the window line + gbWindowLine = -1; + gbLcdLYIncrementTicks = GBLY_INCREMENT_CLOCK_TICKS * 2; + gbCompareLYToLYC(); + } + } + } + + // our counter is off, see what we need to do + while(gbLcdTicks <= 0) + { + switch(gbLcdMode) + { + case GBLCDM_HBLANK: + // H-Blank + register_LY++; + gbCompareLYToLYC(); + + // check if we reached the V-Blank period + if(register_LY == 144) + { + doret = 1; + // Yes, V-Blank + // set the LY increment counter + gbLcdLYIncrementTicks = gbLcdTicks + GBLY_INCREMENT_CLOCK_TICKS; + gbLcdTicks += GBLCD_MODE_1_CLOCK_TICKS; + gbLcdMode = 1; + + if(register_LCDC & 0x80) + { + snooze = 6; + //register_IF |= 1; // V-Blank interrupt + //if(register_STAT & 0x10) + // register_IF |= 2; + } + } else { + // go the the OAM being accessed mode + gbLcdTicks += GBLCD_MODE_2_CLOCK_TICKS; + gbLcdMode = 2; + + // only one LCD interrupt per line. may need to generalize... + if(!(register_STAT & 0x40) || + (register_LY != register_LYC)) { + if((register_STAT & 0x28) == 0x20) + register_IF |= 2; + } + } + break; + + case GBLCDM_VBLANK: + // V-Blank + // next mode is OAM being accessed mode + gbLcdTicks += GBLCD_MODE_2_CLOCK_TICKS; + gbLcdMode = GBLCDM_OAM; + if(!(register_STAT & 0x40) || + (register_LY != register_LYC)) { + if((register_STAT & 0x28) == 0x20) + register_IF |= 2; + } + break; + + case GBLCDM_OAM: + // OAM being accessed mode + + // next mode is OAM and VRAM in use + gbLcdTicks += GBLCD_MODE_3_CLOCK_TICKS; + gbLcdMode = GBLCDM_OAM_VRAM; + break; + + case GBLCDM_OAM_VRAM: + // OAM and VRAM in use + // next mode is H-Blank + if(register_LY < 144) + { + linedrawn[register_LY] = 1; + gbRenderLine(); + + switch(espec->surface->format.bpp) + { + case 8: + CopyLineSurface(espec->surface); + break; + + case 16: + CopyLineSurface(espec->surface); + break; + + case 32: + CopyLineSurface(espec->surface); + break; + } + MDFN_MidLineUpdate(espec, register_LY); + } + gbLcdMode = GBLCDM_HBLANK; + // only one LCD interrupt per line. may need to generalize... + if(!(register_STAT & 0x40) || (register_LY != register_LYC)) + { + if(register_STAT & 0x08) + register_IF |= 2; + } + if(gbHdmaOn) + { + gbDoHdma(); + //gbDmaTicks += GBLCD_MODE_0_CLOCK_TICKS - 4; + } + + gbLcdTicks += GBLCD_MODE_0_CLOCK_TICKS; + break; + } + // mark the correct lcd mode on STAT register + register_STAT = (register_STAT & 0xfc) | gbLcdMode; + } + } + + // serial emulation + if(gbSerialOn) { +#ifdef LINK_EMULATION + if(linkConnected) { + gbSerialTicks -= clockTicks; + + while(gbSerialTicks <= 0) { + // increment number of shifted bits + gbSerialBits++; + linkProc(); + if(gbSerialOn && (register_SC & 1)) { + if(gbSerialBits == 8) { + gbSerialBits = 0; + register_SB = 0xff; + register_SC &= 0x7f; + gbSerialOn = 0; + register_IF |= 8; + gbSerialTicks = 0; + } + } + gbSerialTicks += GBSERIAL_CLOCK_TICKS; + } + } else { +#endif + if(register_SC & 1) { + gbSerialTicks -= clockTicks; + + // overflow + while(gbSerialTicks <= 0) { + // shift serial byte to right and put a 1 bit in its place + // register_SB = 0x80 | (register_SB>>1); + // increment number of shifted bits + gbSerialBits++; + if(gbSerialBits == 8) { + // end of transmission + if(gbSerialFunction) // external device + register_SB = gbSerialFunction(register_SB); + else + register_SB = 0xff; + gbSerialTicks = 0; + register_SC &= 0x7f; + gbSerialOn = 0; + register_IF |= 8; + gbSerialBits = 0; + } else + gbSerialTicks += GBSERIAL_CLOCK_TICKS; + } + } +#ifdef LINK_EMULATION + } +#endif + } + + // timer emulation + if(gbTimerOn) { + gbTimerTicks -= clockTicks; + while(gbTimerTicks <= 0) { + ClockTIMA(); + gbTimerTicks += gbTimerClockTicks; + } + } + } + + //printf("%d %d\n", register_LY, SoundTS); + for(int y = 0; y < 144; y++) + { + if(!linedrawn[y]) + { + switch(espec->surface->format.bpp) + { + case 8: + FillLineSurface(espec->surface, y); + break; + + case 16: + FillLineSurface(espec->surface, y); + break; + + case 32: + FillLineSurface(espec->surface, y); + break; + } + MDFN_MidLineUpdate(espec, y); + } + } + + espec->MasterCycles = SoundTS; + + espec->SoundBufSize = SOUND_Flush(SoundTS, espec->SoundBuf, espec->SoundBufMaxSize); + SoundTS = 0; +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT RAMDesc[] = + { + SFARRAYN(gbOAM, 0xA0, "OAM"), + SFARRAYN(HRAM, 0x80, "HRAM"), + SFARRAYN(gbRam, gbRamSize, "RAM"), + SFARRAYN(gbVram, gbCgbMode ? 0x4000 : 0x2000, "VRAM"), + SFARRAYN(gbWram, gbCgbMode ? 0x8000 : 0x2000, "WRAM"), + SFARRAY16(gbPalette, (gbCgbMode ? 128 : 0)), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, gbSaveGameStruct, "MAIN"); + MDFNSS_StateAction(sm, load, data_only, Joy_StateRegs, "JOY"); + MDFNSS_StateAction(sm, load, data_only, MBC1_StateRegs, "MBC1"); + MDFNSS_StateAction(sm, load, data_only, MBC2_StateRegs, "MBC2"); + MDFNSS_StateAction(sm, load, data_only, MBC3_StateRegs, "MBC3"); + MDFNSS_StateAction(sm, load, data_only, MBC5_StateRegs, "MBC5"); + MDFNSS_StateAction(sm, load, data_only, MBC7_StateRegs, "MBC7"); + MDFNSS_StateAction(sm, load, data_only, HuC1_StateRegs, "HuC1"); + MDFNSS_StateAction(sm, load, data_only, HuC3_StateRegs, "HuC3"); + MDFNSS_StateAction(sm, load, data_only, RAMDesc, "RAM"); + + GBZ80_StateAction(sm, load, data_only); + + if(load) + StateRest(load); + + SOUND_StateAction(sm, load, data_only); +} + +static void SetLayerEnableMask(uint64 mask) +{ + gblayerSettings = mask; +} + +static void DoSimpleCommand(int cmd) +{ + if(cmd == MDFN_MSC_POWER || cmd == MDFN_MSC_RESET) + { + gbPower(); + } +} + +static const MDFNSetting_EnumList SystemType_List[] = +{ + { "auto", 0, gettext_noop("Auto"), gettext_noop("Automatic detection based on headers.") }, + { "dmg", 3, gettext_noop("DMG"), gettext_noop("Original GameBoy Monochrome.") }, + { "cgb", 1, gettext_noop("CGB"), gettext_noop("GameBoy Color.\n\nThis option is not fully implemented in regards to handling of DMG games.") }, + { "agb", 4, gettext_noop("AGB"), gettext_noop("GameBoy Advance.\n\nThis option is not fully implemented in regards to handling of DMG games.") }, + { NULL, 0 }, +}; + +static MDFNSetting GBSettings[] = +{ + { "gb.system_type", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulated GB type."), NULL, MDFNST_ENUM, "auto", NULL, NULL, NULL, NULL, SystemType_List }, + { NULL } +}; + +static const IDIISG IDII = +{ + { "a", "A", /*VIRTB_1,*/ 7, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "b", "B", /*VIRTB_0,*/ 6, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "select", "SELECT", /*VIRTB_SELECT,*/ 4, IDIT_BUTTON, NULL }, + + { "start", "START", /*VIRTB_START,*/ 5, IDIT_BUTTON, NULL }, + + { "right", "RIGHT →", /*VIRTB_DP0_R,*/ 3, IDIT_BUTTON, "left" }, + + { "left", "LEFT ←", /*VIRTB_DP0_L,*/ 2, IDIT_BUTTON, "right" }, + + { "up", "UP ↑", /*VIRTB_DP0_U,*/ 0, IDIT_BUTTON, "down" }, + + { "down", "DOWN ↓", /*VIRTB_DP0_D,*/ 1, IDIT_BUTTON, "up" }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + IDII, + } +}; + +static const IDIISG Tilt_IDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON_ANALOG }, + { "down", "DOWN ↓", 1, IDIT_BUTTON_ANALOG }, + { "left", "LEFT ←", 2, IDIT_BUTTON_ANALOG }, + { "right", "RIGHT →", 3, IDIT_BUTTON_ANALOG }, +}; + + +static const std::vector Tilt_InputDeviceInfo = +{ + { + "tilt", + "Tilt", + NULL, + Tilt_IDII, + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo, "gamepad" }, + { "tilt", "Tilt", Tilt_InputDeviceInfo, "tilt" } +}; + +static uint8 CharToNibble(char thechar) +{ + const char lut[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + thechar = toupper(thechar); + + for(int x = 0; x < 16; x++) + if(lut[x] == thechar) + return(x); + + return(0xFF); +} + +static bool DecodeGG(const std::string& cheat_string, MemoryPatch* patch) +{ + char str[10]; + unsigned len; + + memset(str, 0, sizeof(str)); + + switch(cheat_string.size()) + { + default: + throw(MDFN_Error(0, _("Game Genie code is of an incorrect length."))); + break; + + case 6: + case 9: + strcpy(str, cheat_string.c_str()); + break; + + case 11: + if(cheat_string[7] != '-' && cheat_string[7] != '_' && cheat_string[7] != ' ') + throw(MDFN_Error(0, _("Game Genie code is malformed."))); + + str[6] = cheat_string[8]; + str[7] = cheat_string[9]; + str[8] = cheat_string[10]; + + case 7: + if(cheat_string[3] != '-' && cheat_string[3] != '_' && cheat_string[3] != ' ') + throw(MDFN_Error(0, _("Game Genie code is malformed."))); + + str[0] = cheat_string[0]; + str[1] = cheat_string[1]; + str[2] = cheat_string[2]; + + str[3] = cheat_string[4]; + str[4] = cheat_string[5]; + str[5] = cheat_string[6]; + break; + } + + len = strlen(str); + + for(unsigned x = 0; x < len; x++) + { + if(CharToNibble(str[x]) == 0xFF) + { + if(str[x] & 0x80) + throw MDFN_Error(0, _("Invalid character in Game Genie code.")); + else + throw MDFN_Error(0, _("Invalid character in Game Genie code: %c"), str[x]); + } + } + + uint32 tmp_address; + uint8 tmp_value; + uint8 tmp_compare = 0; + + tmp_address = (CharToNibble(str[5]) << 12) | (CharToNibble(str[2]) << 8) | (CharToNibble(str[3]) << 4) | (CharToNibble(str[4]) << 0); + tmp_address ^= 0xF000; + tmp_value = (CharToNibble(str[0]) << 4) | (CharToNibble(str[1]) << 0); + + if(len == 9) + { + tmp_compare = (CharToNibble(str[6]) << 4) | (CharToNibble(str[8]) << 0); + tmp_compare = (tmp_compare >> 2) | ((tmp_compare << 6) & 0xC0); + tmp_compare ^= 0xBA; + } + + patch->addr = tmp_address; + patch->val = tmp_value; + + if(len == 9) + { + patch->compare = tmp_compare; + patch->type = 'C'; + } + else + { + patch->compare = 0; + patch->type = 'S'; + } + + patch->length = 1; + + return(false); +} + +static bool DecodeGS(const std::string& cheat_string, MemoryPatch* patch) +{ + if(cheat_string.size() != 8) + throw MDFN_Error(0, _("GameShark code is of an incorrect length.")); + + for(unsigned x = 0; x < 8; x++) + { + if(CharToNibble(cheat_string[x]) == 0xFF) + { + if(cheat_string[x] & 0x80) + throw MDFN_Error(0, _("Invalid character in GameShark code.")); + else + throw MDFN_Error(0, _("Invalid character in GameShark code: %c"), cheat_string[x]); + } + } + uint8 bank = 0; + uint16 la = 0; + + + bank = (CharToNibble(cheat_string[0]) << 4) | (CharToNibble(cheat_string[1]) << 0); + for(unsigned x = 0; x < 4; x++) + la |= CharToNibble(cheat_string[4 + x]) << ((x ^ 1) * 4); + + if(la >= 0xD000 && la <= 0xDFFF) + patch->addr = 0x10000 | ((bank & 0x7) << 12) | (la & 0xFFF); + else + patch->addr = la; + + patch->val = (CharToNibble(cheat_string[2]) << 4) | (CharToNibble(cheat_string[3]) << 0); + + patch->compare = 0; + patch->type = 'R'; + patch->length = 1; + + return(false); +} + + +static CheatFormatStruct CheatFormats[] = +{ + { "Game Genie", gettext_noop("Genies will eat your goats."), DecodeGG }, + { "GameShark", gettext_noop("Sharks in your soup."), DecodeGS }, +}; + +static CheatFormatInfoStruct CheatFormatInfo = +{ + 2, + CheatFormats +}; + +static void InstallReadPatch(uint32 address, uint8 value, int compare) +{ + +} + +static void RemoveReadPatches(void) +{ + +} + + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".gb", gettext_noop("GameBoy ROM Image") }, + { ".gbc", gettext_noop("GameBoy Color ROM Image") }, + { ".cgb", gettext_noop("GameBoy Color ROM Image") }, + { NULL, NULL } +}; + +static const CustomPalette_Spec CPInfo[] = +{ + { gettext_noop("GameBoy(mono) palette"), NULL, { 4, 8, 12, 0 } }, + { gettext_noop("GameBoy Color 15-bit RGB"), "gbc", { 32768, 0 } }, + { NULL, NULL } +}; + +} + +using namespace MDFN_IEN_GB; + +MDFNGI EmulatedGB = +{ + "gb", + "GameBoy (Color)", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + SetLayerEnableMask, + "Background\0Sprites\0Window\0", + + NULL, + NULL, + + CPInfo, + 0, + + InstallReadPatch, + RemoveReadPatches, + NULL, + &CheatFormatInfo, + false, + StateAction, + Emulate, + NULL, + MDFNGB_SetInput, + NULL, + DoSimpleCommand, + GBSettings, + MDFN_MASTERCLOCK_FIXED(4194304), + (uint32)((double)4194304 / 70224 * 65536 * 256), + FALSE, // Multires possible? + + 160, // lcm_width + 144, // lcm_height + NULL, // Dummy + + 160, // Nominal width + 144, // Nominal height + + 160, // Framebuffer width + 144, // Framebuffer height + + 2, // Number of output sound channels +}; diff --git a/Mednafen/mednafen/gb/gb.h b/Mednafen/mednafen/gb/gb.h new file mode 100644 index 0000000000..1bb8bafbe0 --- /dev/null +++ b/Mednafen/mednafen/gb/gb.h @@ -0,0 +1,58 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_GB_GB_H +#define VBA_GB_GB_H + +namespace MDFN_IEN_GB +{ + +#define C_FLAG 0x10 +#define H_FLAG 0x20 +#define N_FLAG 0x40 +#define Z_FLAG 0x80 + +typedef union { + struct { +#ifndef LSB_FIRST + uint8 B1, B0; +#else + uint8 B0,B1; +#endif + } B; + uint16 W; +} gbRegister; + +extern uint8 gbOAM[0xA0]; +extern uint8 register_IF, register_IE, register_KEY1; + +extern void gbReset(); +extern void gbCleanUp(); +extern void gbSgbRenderBorder(); + +extern struct EmulatedSystem GBSystem; + + +void gbWriteMemory(uint16 address, uint8 value); +uint8 gbReadMemory(uint16 address); +void gbSpeedSwitch(); + +} + +#endif diff --git a/Mednafen/mednafen/gb/gbCodes.h b/Mednafen/mednafen/gb/gbCodes.h new file mode 100644 index 0000000000..1d3e5f3988 --- /dev/null +++ b/Mednafen/mednafen/gb/gbCodes.h @@ -0,0 +1,1388 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + default: + case 0x00: + // NOP + break; + case 0x01: + // LD BC, NNNN + BC.B.B0=gbReadMemory(PC.W++); + BC.B.B1=gbReadMemory(PC.W++); + break; + case 0x02: + // LD (BC),A + gbWriteMemory(BC.W,AF.B.B1); + break; + case 0x03: + // INC BC + BC.W++; + break; + case 0x04: + // INC B + BC.B.B1++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]| (BC.B.B1&0x0F? 0:H_FLAG); + break; + case 0x05: + // DEC B + BC.B.B1--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]| + ((BC.B.B1&0x0F)==0x0F? H_FLAG:0); + break; + case 0x06: + // LD B, NN + BC.B.B1=gbReadMemory(PC.W++); + break; + case 0x07: + // RLCA + tempValue=AF.B.B1&0x80? C_FLAG:0; + AF.B.B1=(AF.B.B1<<1)|(AF.B.B1>>7); + AF.B.B0=tempValue; + break; + case 0x08: + // LD (NNNN), SP + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(tempRegister.W++,SP.B.B0); + gbWriteMemory(tempRegister.W,SP.B.B1); + break; + case 0x09: + // ADD HL,BC + tempRegister.W=(HL.W+BC.W)&0xFFFF; + AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^BC.W^tempRegister.W)&0x1000? H_FLAG:0)| + (((long)HL.W+(long)BC.W)&0x10000? C_FLAG:0); + HL.W=tempRegister.W; + break; + case 0x0a: + // LD A,(BC) + AF.B.B1=gbReadMemory(BC.W); + break; + case 0x0b: + // DEC BC + BC.W--; + break; + case 0x0c: + // INC C + BC.B.B0++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]| (BC.B.B0&0x0F? 0:H_FLAG); + break; + case 0x0d: + // DEC C + BC.B.B0--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]| + ((BC.B.B0&0x0F)==0x0F? H_FLAG:0); + break; + case 0x0e: + // LD C, NN + BC.B.B0=gbReadMemory(PC.W++); + break; + case 0x0f: + // RRCA + tempValue=AF.B.B1&0x01; + AF.B.B1=(AF.B.B1>>1)|(tempValue? 0x80:0); + AF.B.B0=(tempValue<<4); + break; + case 0x10: + // STOP + opcode = gbReadMemory(PC.W++); + if(gbCgbMode) { + if(register_KEY1 & 1) { + gbSpeedSwitch(); + + if(gbSpeed == 0) + register_KEY1 = 0x00; + else + register_KEY1 = 0x80; + } + } + break; + case 0x11: + // LD DE, NNNN + DE.B.B0=gbReadMemory(PC.W++); + DE.B.B1=gbReadMemory(PC.W++); + break; + case 0x12: + // LD (DE),A + gbWriteMemory(DE.W,AF.B.B1); + break; + case 0x13: + // INC DE + DE.W++; + break; + case 0x14: + // INC D + DE.B.B1++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]| (DE.B.B1&0x0F? 0:H_FLAG); + break; + case 0x15: + // DEC D + DE.B.B1--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]| + ((DE.B.B1&0x0F)==0x0F? H_FLAG:0); + break; + case 0x16: + // LD D,NN + DE.B.B1=gbReadMemory(PC.W++); + break; + case 0x17: + // RLA + tempValue=AF.B.B1&0x80? C_FLAG:0; + AF.B.B1=(AF.B.B1<<1)|((AF.B.B0&C_FLAG)>>4); + AF.B.B0=tempValue; + break; + case 0x18: + // JR NN + PC.W+=(int8)gbReadMemory(PC.W)+1; + break; + case 0x19: + // ADD HL,DE + tempRegister.W=(HL.W+DE.W)&0xFFFF; + AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^DE.W^tempRegister.W)&0x1000? H_FLAG:0)| + (((long)HL.W+(long)DE.W)&0x10000? C_FLAG:0); + HL.W=tempRegister.W; + break; + case 0x1a: + // LD A,(DE) + AF.B.B1=gbReadMemory(DE.W); + break; + case 0x1b: + // DEC DE + DE.W--; + break; + case 0x1c: + // INC E + DE.B.B0++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]| (DE.B.B0&0x0F? 0:H_FLAG); + break; + case 0x1d: + // DEC E + DE.B.B0--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]| + ((DE.B.B0&0x0F)==0x0F? H_FLAG:0); + break; + case 0x1e: + // LD E,NN + DE.B.B0=gbReadMemory(PC.W++); + break; + case 0x1f: + // RRA + tempValue=AF.B.B1&0x01; + AF.B.B1=(AF.B.B1>>1)|(AF.B.B0&C_FLAG? 0x80:0); + AF.B.B0=(tempValue<<4); + break; + case 0x20: + // JR NZ,NN + if(AF.B.B0&Z_FLAG) + PC.W++; + else { + PC.W+=(int8)gbReadMemory(PC.W)+1; + clockTicks++; + } + break; + case 0x21: + // LD HL,NNNN + HL.B.B0=gbReadMemory(PC.W++); + HL.B.B1=gbReadMemory(PC.W++); + break; + case 0x22: + // LDI (HL),A + gbWriteMemory(HL.W++,AF.B.B1); + break; + case 0x23: + // INC HL + HL.W++; + break; + case 0x24: + // INC H + HL.B.B1++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]| (HL.B.B1&0x0F? 0:H_FLAG); + break; + case 0x25: + // DEC H + HL.B.B1--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]| + ((HL.B.B1&0x0F)==0x0F? H_FLAG:0); + break; + case 0x26: + // LD H,NN + HL.B.B1=gbReadMemory(PC.W++); + break; + case 0x27: + // DAA + tempRegister.W=AF.B.B1; + tempRegister.W|=(AF.B.B0&(C_FLAG|H_FLAG|N_FLAG))<<4; + AF.W=DAATable[tempRegister.W]; + break; + case 0x28: + // JR Z,NN + if(AF.B.B0&Z_FLAG) { + PC.W+=(int8)gbReadMemory(PC.W)+1; + clockTicks++; + } else + PC.W++; + break; + case 0x29: + // ADD HL,HL + tempRegister.W=(HL.W+HL.W)&0xFFFF; AF.B.B0= (AF.B.B0 & Z_FLAG)| + ((HL.W^HL.W^tempRegister.W)&0x1000? H_FLAG:0)| + (((long)HL.W+(long)HL.W)&0x10000? C_FLAG:0); + HL.W=tempRegister.W; + break; + case 0x2a: + // LDI A,(HL) + AF.B.B1 = gbReadMemory(HL.W++); + break; + case 0x2b: + // DEC HL + HL.W--; + break; + case 0x2c: + // INC L + HL.B.B0++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]| (HL.B.B0&0x0F? 0:H_FLAG); + break; + case 0x2d: + // DEC L + HL.B.B0--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]| + ((HL.B.B0&0x0F)==0x0F? H_FLAG:0); + break; + case 0x2e: + // LD L,NN + HL.B.B0=gbReadMemory(PC.W++); + break; + case 0x2f: + // CPL + AF.B.B1 ^= 255; + AF.B.B0|=N_FLAG|H_FLAG; + break; + case 0x30: + // JR NC,NN + if(AF.B.B0&C_FLAG) + PC.W++; + else { + PC.W+=(int8)gbReadMemory(PC.W)+1; + clockTicks++; + } + break; + case 0x31: + // LD SP,NNNN + SP.B.B0=gbReadMemory(PC.W++); + SP.B.B1=gbReadMemory(PC.W++); + break; + case 0x32: + // LDD (HL),A + gbWriteMemory(HL.W--,AF.B.B1); + break; + case 0x33: + // INC SP + SP.W++; + break; + case 0x34: + // INC (HL) + tempValue=gbReadMemory(HL.W)+1; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[tempValue]| (tempValue&0x0F? 0:H_FLAG); + gbWriteMemory(HL.W,tempValue); + break; + case 0x35: + // DEC (HL) + tempValue=gbReadMemory(HL.W)-1; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[tempValue]| + ((tempValue&0x0F)==0x0F? H_FLAG:0);gbWriteMemory(HL.W,tempValue); + break; + case 0x36: + // LD (HL),NN + gbWriteMemory(HL.W,gbReadMemory(PC.W++)); + break; + case 0x37: + // SCF + AF.B.B0 = (AF.B.B0 & Z_FLAG) | C_FLAG; + break; +case 0x38: + // JR C,NN + if(AF.B.B0&C_FLAG) { + PC.W+=(int8)gbReadMemory(PC.W)+1; + clockTicks ++; + } else + PC.W++; + break; + case 0x39: + // ADD HL,SP + tempRegister.W=(HL.W+SP.W)&0xFFFF; + AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^SP.W^tempRegister.W)&0x1000? H_FLAG:0)| + (((long)HL.W+(long)SP.W)&0x10000? C_FLAG:0); + HL.W=tempRegister.W; + break; + case 0x3a: + // LDD A,(HL) + AF.B.B1 = gbReadMemory(HL.W--); + break; + case 0x3b: + // DEC SP + SP.W--; + break; + case 0x3c: + // INC A + AF.B.B1++; + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]| (AF.B.B1&0x0F? 0:H_FLAG); + break; + case 0x3d: + // DEC A + AF.B.B1--; + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]| + ((AF.B.B1&0x0F)==0x0F? H_FLAG:0); + break; + case 0x3e: + // LD A,NN + AF.B.B1=gbReadMemory(PC.W++); + break; + case 0x3f: + // CCF + AF.B.B0^=C_FLAG;AF.B.B0&=~(N_FLAG|H_FLAG); + break; + case 0x40: + // LD B,B + BC.B.B1=BC.B.B1; + break; + case 0x41: + // LD B,C + BC.B.B1=BC.B.B0; + break; + case 0x42: + // LD B,D + BC.B.B1=DE.B.B1; + break; + case 0x43: + // LD B,E + BC.B.B1=DE.B.B0; + break; + case 0x44: + // LD B,H + BC.B.B1=HL.B.B1; + break; + case 0x45: + // LD B,L + BC.B.B1=HL.B.B0; + break; + case 0x46: + // LD B,(HL) + BC.B.B1=gbReadMemory(HL.W); + break; + case 0x47: + // LD B,A + BC.B.B1=AF.B.B1; + break; + case 0x48: + // LD C,B + BC.B.B0=BC.B.B1; + break; + case 0x49: + // LD C,C + BC.B.B0=BC.B.B0; + break; + case 0x4a: + // LD C,D + BC.B.B0=DE.B.B1; + break; + case 0x4b: + // LD C,E + BC.B.B0=DE.B.B0; + break; + case 0x4c: + // LD C,H + BC.B.B0=HL.B.B1; + break; + case 0x4d: + // LD C,L + BC.B.B0=HL.B.B0; + break; + case 0x4e: + // LD C,(HL) + BC.B.B0=gbReadMemory(HL.W); + break; + case 0x4f: + // LD C,A + BC.B.B0=AF.B.B1; + break; + case 0x50: + // LD D,B + DE.B.B1=BC.B.B1; + break; + case 0x51: + // LD D,C + DE.B.B1=BC.B.B0; + break; + case 0x52: + // LD D,D + DE.B.B1=DE.B.B1; + break; + case 0x53: + // LD D,E + DE.B.B1=DE.B.B0; + break; + case 0x54: + // LD D,H + DE.B.B1=HL.B.B1; + break; + case 0x55: + // LD D,L + DE.B.B1=HL.B.B0; + break; + case 0x56: + // LD D,(HL) + DE.B.B1=gbReadMemory(HL.W); + break; + case 0x57: + // LD D,A + DE.B.B1=AF.B.B1; + break; + case 0x58: + // LD E,B + DE.B.B0=BC.B.B1; + break; + case 0x59: + // LD E,C + DE.B.B0=BC.B.B0; + break; + case 0x5a: + // LD E,D + DE.B.B0=DE.B.B1; + break; + case 0x5b: + // LD E,E + DE.B.B0=DE.B.B0; + break; + case 0x5c: + // LD E,H + DE.B.B0=HL.B.B1; + break; + case 0x5d: + // LD E,L + DE.B.B0=HL.B.B0; + break; + case 0x5e: + // LD E,(HL) + DE.B.B0=gbReadMemory(HL.W); + break; + case 0x5f: + // LD E,A + DE.B.B0=AF.B.B1; + break; + case 0x60: + // LD H,B + HL.B.B1=BC.B.B1; + break; + case 0x61: + // LD H,C + HL.B.B1=BC.B.B0; + break; + case 0x62: + // LD H,D + HL.B.B1=DE.B.B1; + break; + case 0x63: + // LD H,E + HL.B.B1=DE.B.B0; + break; + case 0x64: + // LD H,H + HL.B.B1=HL.B.B1; + break; + case 0x65: + // LD H,L + HL.B.B1=HL.B.B0; + break; + case 0x66: + // LD H,(HL) + HL.B.B1=gbReadMemory(HL.W); + break; + case 0x67: + // LD H,A + HL.B.B1=AF.B.B1; + break; + case 0x68: + // LD L,B + HL.B.B0=BC.B.B1; + break; + case 0x69: + // LD L,C + HL.B.B0=BC.B.B0; + break; + case 0x6a: + // LD L,D + HL.B.B0=DE.B.B1; + break; + case 0x6b: + // LD L,E + HL.B.B0=DE.B.B0; + break; + case 0x6c: + // LD L,H + HL.B.B0=HL.B.B1; + break; + case 0x6d: + // LD L,L + HL.B.B0=HL.B.B0; + break; + case 0x6e: + // LD L,(HL) + HL.B.B0=gbReadMemory(HL.W); + break; + case 0x6f: + // LD L,A + HL.B.B0=AF.B.B1; + break; + case 0x70: + // LD (HL),B + gbWriteMemory(HL.W,BC.B.B1); + break; + case 0x71: + // LD (HL),C + gbWriteMemory(HL.W,BC.B.B0); + break; + case 0x72: + // LD (HL),D + gbWriteMemory(HL.W,DE.B.B1); + break; + case 0x73: + // LD (HL),E + gbWriteMemory(HL.W,DE.B.B0); + break; + case 0x74: + // LD (HL),H + gbWriteMemory(HL.W,HL.B.B1); + break; + case 0x75: + // LD (HL),L + gbWriteMemory(HL.W,HL.B.B0); + break; + case 0x76: + // HALT + if(IFF) + { + InHALT = TRUE; + } + else + { + InHALT = TRUE; + if(!gbCgbMode) + RepeatNextByte = TRUE; + } + break; + case 0x77: + // LD (HL),A + gbWriteMemory(HL.W,AF.B.B1); + break; + case 0x78: + // LD A,B + AF.B.B1=BC.B.B1; + break; + case 0x79: + // LD A,C + AF.B.B1=BC.B.B0; + break; + case 0x7a: + // LD A,D + AF.B.B1=DE.B.B1; + break; + case 0x7b: + // LD A,E + AF.B.B1=DE.B.B0; + break; + case 0x7c: + // LD A,H + AF.B.B1=HL.B.B1; + break; + case 0x7d: + // LD A,L + AF.B.B1=HL.B.B0; + break; + case 0x7e: + // LD A,(HL) + AF.B.B1=gbReadMemory(HL.W); + break; + case 0x7f: + // LD A,A + AF.B.B1=AF.B.B1; + break; + case 0x80: + // ADD B + tempRegister.W=AF.B.B1+BC.B.B1; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x81: + // ADD C + tempRegister.W=AF.B.B1+BC.B.B0; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x82: + // ADD D + tempRegister.W=AF.B.B1+DE.B.B1; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x83: + // ADD E + tempRegister.W=AF.B.B1+DE.B.B0; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x84: + // ADD H + tempRegister.W=AF.B.B1+HL.B.B1; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x85: + // ADD L + tempRegister.W=AF.B.B1+HL.B.B0; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x86: + // ADD (HL) + tempValue=gbReadMemory(HL.W); + tempRegister.W=AF.B.B1+tempValue; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x87: + // ADD A + tempRegister.W=AF.B.B1+AF.B.B1; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x88: + // ADC B: + tempRegister.W=AF.B.B1+BC.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x89: + // ADC C + tempRegister.W=AF.B.B1+BC.B.B0+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x8a: + // ADC D + tempRegister.W=AF.B.B1+DE.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x8b: + // ADC E + tempRegister.W=AF.B.B1+DE.B.B0+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x8c: + // ADC H + tempRegister.W=AF.B.B1+HL.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); AF.B.B1=tempRegister.B.B0; + break; + case 0x8d: + // ADC L + tempRegister.W=AF.B.B1+HL.B.B0+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x8e: + // ADC (HL) + tempValue=gbReadMemory(HL.W); + tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x8f: + // ADC A + tempRegister.W=AF.B.B1+AF.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x90: + // SUB B + tempRegister.W=AF.B.B1-BC.B.B1; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x91: + // SUB C + tempRegister.W=AF.B.B1-BC.B.B0; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x92: + // SUB D + tempRegister.W=AF.B.B1-DE.B.B1; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x93: + // SUB E + tempRegister.W=AF.B.B1-DE.B.B0; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x94: + // SUB H + tempRegister.W=AF.B.B1-HL.B.B1; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x95: + // SUB L + tempRegister.W=AF.B.B1-HL.B.B0; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x96: + // SUB (HL) + tempValue=gbReadMemory(HL.W); + tempRegister.W=AF.B.B1-tempValue; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x97: + // SUB A + AF.B.B1=0; + AF.B.B0=N_FLAG|Z_FLAG; + break; + case 0x98: + // SBC B + tempRegister.W=AF.B.B1-BC.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x99: + // SBC C + tempRegister.W=AF.B.B1-BC.B.B0-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x9a: + // SBC D + tempRegister.W=AF.B.B1-DE.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x9b: + // SBC E + tempRegister.W=AF.B.B1-DE.B.B0-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x9c: + // SBC H + tempRegister.W=AF.B.B1-HL.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x9d: + // SBC L + tempRegister.W=AF.B.B1-HL.B.B0-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x9e: + // SBC (HL) + tempValue=gbReadMemory(HL.W); + tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0x9f: + // SBC A + tempRegister.W=AF.B.B1-AF.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0xa0: + // AND B + AF.B.B1&=BC.B.B1; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa1: + // AND C + AF.B.B1&=BC.B.B0; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa2: + // AND_D + AF.B.B1&=DE.B.B1; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa3: + // AND E + AF.B.B1&=DE.B.B0; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa4: + // AND H + AF.B.B1&=HL.B.B1; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa5: + // AND L + AF.B.B1&=HL.B.B0; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa6: + // AND (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B1&=tempValue; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa7: + // AND A + AF.B.B1&=AF.B.B1; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xa8: + // XOR B + AF.B.B1^=BC.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xa9: + // XOR C + AF.B.B1^=BC.B.B0; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xaa: + // XOR D + AF.B.B1^=DE.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xab: + // XOR E + AF.B.B1^=DE.B.B0; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xac: + // XOR H + AF.B.B1^=HL.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xad: + // XOR L + AF.B.B1^=HL.B.B0; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xae: + // XOR (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B1^=tempValue; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xaf: + // XOR A + AF.B.B1=0; + AF.B.B0=Z_FLAG; + break; + case 0xb0: + // OR B + AF.B.B1|=BC.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb1: + // OR C + AF.B.B1|=BC.B.B0; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb2: + // OR D + AF.B.B1|=DE.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb3: + // OR E + AF.B.B1|=DE.B.B0; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb4: + // OR H + AF.B.B1|=HL.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb5: + // OR L + AF.B.B1|=HL.B.B0; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb6: + // OR (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B1|=tempValue; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb7: + // OR A + AF.B.B1|=AF.B.B1; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xb8: + // CP B: + tempRegister.W=AF.B.B1-BC.B.B1; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xb9: + // CP C + tempRegister.W=AF.B.B1-BC.B.B0; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xba: + // CP D + tempRegister.W=AF.B.B1-DE.B.B1; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xbb: + // CP E + tempRegister.W=AF.B.B1-DE.B.B0; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xbc: + // CP H + tempRegister.W=AF.B.B1-HL.B.B1; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xbd: + // CP L + tempRegister.W=AF.B.B1-HL.B.B0; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xbe: + // CP (HL) + tempValue=gbReadMemory(HL.W); + tempRegister.W=AF.B.B1-tempValue; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xbf: + // CP A + AF.B.B0=N_FLAG|Z_FLAG; + break; + case 0xc0: + // RET NZ + if(!(AF.B.B0&Z_FLAG)) { + PC.B.B0=gbReadMemory(SP.W++); + PC.B.B1=gbReadMemory(SP.W++); + clockTicks += 3; + } + break; + case 0xc1: + // POP BC + BC.B.B0=gbReadMemory(SP.W++); + BC.B.B1=gbReadMemory(SP.W++); + break; + case 0xc2: + // JP NZ,NNNN + if(AF.B.B0&Z_FLAG) + PC.W+=2; + else { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W); + PC.W=tempRegister.W; + clockTicks++; + } + break; + case 0xc3: + // JP NNNN + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W); + PC.W=tempRegister.W; + break; + case 0xc4: + // CALL NZ,NNNN + if(AF.B.B0&Z_FLAG) + PC.W+=2; + else { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=tempRegister.W; + clockTicks += 3; + } + break; + case 0xc5: + // PUSH BC + gbWriteMemory(--SP.W,BC.B.B1); + gbWriteMemory(--SP.W,BC.B.B0); + break; + case 0xc6: + // ADD NN + tempValue=gbReadMemory(PC.W++); + tempRegister.W=AF.B.B1+tempValue; + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0xc7: + // RST 00 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0000; + break; + case 0xc8: + // RET Z + if(AF.B.B0&Z_FLAG) { + PC.B.B0=gbReadMemory(SP.W++); + PC.B.B1=gbReadMemory(SP.W++); + clockTicks += 3; + } + break; + case 0xc9: + // RET + PC.B.B0=gbReadMemory(SP.W++); + PC.B.B1=gbReadMemory(SP.W++); + break; + case 0xca: + // JP Z,NNNN + if(AF.B.B0&Z_FLAG) { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W); + PC.W=tempRegister.W; + clockTicks++; + } else + PC.W+=2; + break; + // CB done outside + case 0xcc: + // CALL Z,NNNN + if(AF.B.B0&Z_FLAG) { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=tempRegister.W; + clockTicks += 3; + } else + PC.W+=2; + break; + case 0xcd: + // CALL NNNN + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=tempRegister.W; + break; + case 0xce: + // ADC NN + tempValue=gbReadMemory(PC.W++); + tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0xcf: + // RST 08 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0008; + break; + case 0xd0: + // RET NC + if(!(AF.B.B0&C_FLAG)) { + PC.B.B0=gbReadMemory(SP.W++); + PC.B.B1=gbReadMemory(SP.W++); + clockTicks += 3; + } + break; + case 0xd1: + // POP DE + DE.B.B0=gbReadMemory(SP.W++); + DE.B.B1=gbReadMemory(SP.W++); + break; + case 0xd2: + // JP NC,NNNN + if(AF.B.B0&C_FLAG) + PC.W+=2; + else { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W); + PC.W=tempRegister.W; + clockTicks++; + } + break; + // D3 illegal + case 0xd4: + // CALL NC,NNNN + if(AF.B.B0&C_FLAG) + PC.W+=2; + else { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=tempRegister.W; + clockTicks += 3; + } + break; + case 0xd5: + // PUSH DE + gbWriteMemory(--SP.W,DE.B.B1); + gbWriteMemory(--SP.W,DE.B.B0); + break; + case 0xd6: + // SUB NN + tempValue=gbReadMemory(PC.W++); + tempRegister.W=AF.B.B1-tempValue; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0xd7: + // RST 10 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0010; + break; + case 0xd8: + // RET C + if(AF.B.B0&C_FLAG) { + PC.B.B0=gbReadMemory(SP.W++); + PC.B.B1=gbReadMemory(SP.W++); + clockTicks += 3; + } + break; + case 0xd9: + // RETI + PC.B.B0=gbReadMemory(SP.W++); + PC.B.B1=gbReadMemory(SP.W++); + IFF = TRUE; + break; + case 0xda: + // JP C,NNNN + if(AF.B.B0&C_FLAG) { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W); + PC.W=tempRegister.W; + clockTicks++; + } else + PC.W+=2; + break; + // DB illegal + case 0xdc: + // CALL C,NNNN + if(AF.B.B0&C_FLAG) { + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=tempRegister.W; + clockTicks += 3; + } else + PC.W+=2; + break; + // DD illegal + case 0xde: + // SBC NN + tempValue=gbReadMemory(PC.W++); + tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + AF.B.B1=tempRegister.B.B0; + break; + case 0xdf: + // RST 18 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0018; + break; + case 0xe0: + // LD (FF00+NN),A + gbWriteMemory(0xff00 + gbReadMemory(PC.W++),AF.B.B1); + break; + case 0xe1: + // POP HL + HL.B.B0=gbReadMemory(SP.W++); + HL.B.B1=gbReadMemory(SP.W++); + break; + case 0xe2: + // LD (FF00+C),A + gbWriteMemory(0xff00 + BC.B.B0,AF.B.B1); + break; + // E3 illegal + // E4 illegal + case 0xe5: + // PUSH HL + gbWriteMemory(--SP.W,HL.B.B1); + gbWriteMemory(--SP.W,HL.B.B0); + break; + case 0xe6: + // AND NN + tempValue=gbReadMemory(PC.W++); + AF.B.B1&=tempValue; + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; + break; + case 0xe7: + // RST 20 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0020; + break; + case 0xe8: + // ADD SP,NN + offset = (int8)gbReadMemory(PC.W++); + tempRegister.W = SP.W + offset; + AF.B.B0 = ((SP.W^offset^tempRegister.W)&0x100? C_FLAG : 0) | + ((SP.W^offset^tempRegister.W)& 0x10? H_FLAG : 0); + SP.W = tempRegister.W; + break; + + case 0xe9: + // LD PC,HL + PC.W=HL.W; + break; + case 0xea: + // LD (NNNN),A + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + gbWriteMemory(tempRegister.W,AF.B.B1); + break; + // EB illegal + // EC illegal + // ED illegal + case 0xee: + // XOR NN + tempValue=gbReadMemory(PC.W++); + AF.B.B1^=tempValue; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xef: + // RST 28 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0028; + break; + case 0xf0: + // LD A,(FF00+NN) + AF.B.B1 = gbReadMemory(0xff00+gbReadMemory(PC.W++)); + break; + case 0xf1: + // POP AF + AF.B.B0=gbReadMemory(SP.W++)&0xF0; + AF.B.B1=gbReadMemory(SP.W++); + break; + case 0xf2: + // LD A,(FF00+C) + AF.B.B1 = gbReadMemory(0xff00+BC.B.B0); + break; + + case 0xf3: // DI + IFF = FALSE; + EI_Delayed = FALSE; + break; + + // F4 illegal + case 0xf5: + // PUSH AF + gbWriteMemory(--SP.W,AF.B.B1); + gbWriteMemory(--SP.W,AF.B.B0); + break; + case 0xf6: + // OR NN + tempValue=gbReadMemory(PC.W++); + AF.B.B1|=tempValue; + AF.B.B0=ZeroTable[AF.B.B1]; + break; + case 0xf7: + // RST 30 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0030; + break; + case 0xf8: + // LD HL,SP+NN + offset = (int8)gbReadMemory(PC.W++); + tempRegister.W = SP.W + offset; + AF.B.B0 = ((SP.W^offset^tempRegister.W)&0x100? C_FLAG : 0) | + ((SP.W^offset^tempRegister.W)& 0x10? H_FLAG : 0); + HL.W = tempRegister.W; + break; + case 0xf9: + // LD SP,HL + SP.W=HL.W; + break; + case 0xfa: + // LD A,(NNNN) + tempRegister.B.B0=gbReadMemory(PC.W++); + tempRegister.B.B1=gbReadMemory(PC.W++); + AF.B.B1=gbReadMemory(tempRegister.W); + break; + + case 0xfb: + EI_Delayed = TRUE; + break; + + // FC illegal + // FD illegal + case 0xfe: + // CP NN + tempValue=gbReadMemory(PC.W++); + tempRegister.W=AF.B.B1-tempValue; + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); + break; + case 0xff: + // RST 38 + gbWriteMemory(--SP.W,PC.B.B1); + gbWriteMemory(--SP.W,PC.B.B0); + PC.W=0x0038; + break; diff --git a/Mednafen/mednafen/gb/gbCodesCB.h b/Mednafen/mednafen/gb/gbCodesCB.h new file mode 100644 index 0000000000..d8ced48824 --- /dev/null +++ b/Mednafen/mednafen/gb/gbCodesCB.h @@ -0,0 +1,1284 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + default: + case 0x00: + // RLC B + AF.B.B0 = (BC.B.B1 & 0x80)?C_FLAG:0; + BC.B.B1 = (BC.B.B1<<1) | (BC.B.B1>>7); + AF.B.B0 |= ZeroTable[BC.B.B1]; + break; + case 0x01: + // RLC C + AF.B.B0 = (BC.B.B0 & 0x80)?C_FLAG:0; + BC.B.B0 = (BC.B.B0<<1) | (BC.B.B0>>7); + AF.B.B0 |= ZeroTable[BC.B.B0]; + break; + case 0x02: + // RLC D + AF.B.B0 = (DE.B.B1 & 0x80)?C_FLAG:0; + DE.B.B1 = (DE.B.B1<<1) | (DE.B.B1>>7); + AF.B.B0 |= ZeroTable[DE.B.B1]; + break; + case 0x03: + // RLC E + AF.B.B0 = (DE.B.B0 & 0x80)?C_FLAG:0; + DE.B.B0 = (DE.B.B0<<1) | (DE.B.B0>>7); + AF.B.B0 |= ZeroTable[DE.B.B0]; + break; + case 0x04: + // RLC H + AF.B.B0 = (HL.B.B1 & 0x80)?C_FLAG:0; + HL.B.B1 = (HL.B.B1<<1) | (HL.B.B1>>7); + AF.B.B0 |= ZeroTable[HL.B.B1]; + break; + case 0x05: + // RLC L + AF.B.B0 = (HL.B.B0 & 0x80)?C_FLAG:0; + HL.B.B0 = (HL.B.B0<<1) | (HL.B.B0>>7); + AF.B.B0 |= ZeroTable[HL.B.B0]; + break; + case 0x06: + // RLC (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0 = (tempValue & 0x80)?C_FLAG:0; + tempValue = (tempValue<<1) | (tempValue>>7); + AF.B.B0 |= ZeroTable[tempValue]; + gbWriteMemory(HL.W,tempValue); + break; + case 0x07: + // RLC A + AF.B.B0 = (AF.B.B1 & 0x80)?C_FLAG:0; + AF.B.B1 = (AF.B.B1<<1) | (AF.B.B1>>7); + AF.B.B0 |= ZeroTable[AF.B.B1]; + break; + case 0x08: + // RRC B + AF.B.B0=(BC.B.B1&0x01 ? C_FLAG : 0); + BC.B.B1=(BC.B.B1>>1)|(BC.B.B1<<7); + AF.B.B0|=ZeroTable[BC.B.B1]; + break; + case 0x09: + // RRC C + AF.B.B0=(BC.B.B0&0x01 ? C_FLAG : 0); + BC.B.B0=(BC.B.B0>>1)|(BC.B.B0<<7); + AF.B.B0|=ZeroTable[BC.B.B0]; + break; + case 0x0a: + // RRC D + AF.B.B0=(DE.B.B1&0x01 ? C_FLAG : 0); + DE.B.B1=(DE.B.B1>>1)|(DE.B.B1<<7); + AF.B.B0|=ZeroTable[DE.B.B1]; + break; + case 0x0b: + // RRC E + AF.B.B0=(DE.B.B0&0x01 ? C_FLAG : 0); + DE.B.B0=(DE.B.B0>>1)|(DE.B.B0<<7); + AF.B.B0|=ZeroTable[DE.B.B0]; + break; + case 0x0c: + // RRC H + AF.B.B0=(HL.B.B1&0x01 ? C_FLAG : 0); + HL.B.B1=(HL.B.B1>>1)|(HL.B.B1<<7); + AF.B.B0|=ZeroTable[HL.B.B1]; + break; + case 0x0d: + // RRC L + AF.B.B0=(HL.B.B0&0x01 ? C_FLAG : 0); + HL.B.B0=(HL.B.B0>>1)|(HL.B.B0<<7); + AF.B.B0|=ZeroTable[HL.B.B0]; + break; + case 0x0e: + // RRC (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(tempValue&0x01 ? C_FLAG : 0); + tempValue=(tempValue>>1)|(tempValue<<7); + AF.B.B0|=ZeroTable[tempValue]; + gbWriteMemory(HL.W,tempValue); + break; + case 0x0f: + // RRC A + AF.B.B0=(AF.B.B1&0x01 ? C_FLAG : 0); + AF.B.B1=(AF.B.B1>>1)|(AF.B.B1<<7); + AF.B.B0|=ZeroTable[AF.B.B1]; + break; + case 0x10: + // RL B + if(BC.B.B1&0x80) { + BC.B.B1=(BC.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[BC.B.B1]|C_FLAG; + } else { + BC.B.B1=(BC.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[BC.B.B1]; + } + break; + case 0x11: + // RL C + if(BC.B.B0&0x80) { + BC.B.B0=(BC.B.B0<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[BC.B.B0]|C_FLAG; + } else { + BC.B.B0=(BC.B.B0<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[BC.B.B0]; + } + break; + case 0x12: + // RL D + if(DE.B.B1&0x80) { + DE.B.B1=(DE.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[DE.B.B1]|C_FLAG; + } else { + DE.B.B1=(DE.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[DE.B.B1]; + } + break; + case 0x13: + // RL E + if(DE.B.B0&0x80) { + DE.B.B0=(DE.B.B0<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[DE.B.B0]|C_FLAG; + } else { + DE.B.B0=(DE.B.B0<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[DE.B.B0]; + } + break; + case 0x14: + // RL H + if(HL.B.B1&0x80) { + HL.B.B1=(HL.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[HL.B.B1]|C_FLAG; + } else { + HL.B.B1=(HL.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[HL.B.B1]; + } + break; + case 0x15: + // RL L + if(HL.B.B0&0x80) { + HL.B.B0=(HL.B.B0<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[HL.B.B0]|C_FLAG; + } else { + HL.B.B0=(HL.B.B0<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[HL.B.B0]; + } + break; + case 0x16: + // RL (HL) + tempValue=gbReadMemory(HL.W); + if(tempValue&0x80) { + tempValue=(tempValue<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[tempValue]|C_FLAG; + } else { + tempValue=(tempValue<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[tempValue]; + } + gbWriteMemory(HL.W,tempValue); + break; + case 0x17: + // RL A + if(AF.B.B1&0x80) { + AF.B.B1=(AF.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[AF.B.B1]|C_FLAG; + } else { + AF.B.B1=(AF.B.B1<<1)|(AF.B.B0&C_FLAG ? 1 : 0); + AF.B.B0=ZeroTable[AF.B.B1]; + } + break; + case 0x18: + // RR B + if(BC.B.B1&0x01) { + BC.B.B1=(BC.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[BC.B.B1]|C_FLAG; + } else { + BC.B.B1=(BC.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[BC.B.B1]; + } + break; + case 0x19: + // RR C + if(BC.B.B0&0x01) { + BC.B.B0=(BC.B.B0>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[BC.B.B0]|C_FLAG; + } else { + BC.B.B0=(BC.B.B0>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[BC.B.B0]; + } + break; + case 0x1a: + // RR D + if(DE.B.B1&0x01) { + DE.B.B1=(DE.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[DE.B.B1]|C_FLAG; + } else { + DE.B.B1=(DE.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[DE.B.B1]; + } + break; + case 0x1b: + // RR E + if(DE.B.B0&0x01) { + DE.B.B0=(DE.B.B0>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[DE.B.B0]|C_FLAG; + } else { + DE.B.B0=(DE.B.B0>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[DE.B.B0]; + } + break; + case 0x1c: + // RR H + if(HL.B.B1&0x01) { + HL.B.B1=(HL.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[HL.B.B1]|C_FLAG; + } else { + HL.B.B1=(HL.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[HL.B.B1]; + } + break; + case 0x1d: + // RR L + if(HL.B.B0&0x01) { + HL.B.B0=(HL.B.B0>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[HL.B.B0]|C_FLAG; + } else { + HL.B.B0=(HL.B.B0>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[HL.B.B0]; + } + break; + case 0x1e: + // RR (HL) + tempValue=gbReadMemory(HL.W); + if(tempValue&0x01) { + tempValue=(tempValue>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[tempValue]|C_FLAG; + } else { + tempValue=(tempValue>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[tempValue]; + } + gbWriteMemory(HL.W,tempValue); + break; + case 0x1f: + // RR A + if(AF.B.B1&0x01) { + AF.B.B1=(AF.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[AF.B.B1]|C_FLAG; + } else { + AF.B.B1=(AF.B.B1>>1)|(AF.B.B0 & C_FLAG ? 0x80:0); + AF.B.B0=ZeroTable[AF.B.B1]; + } + break; + case 0x20: + // SLA B + AF.B.B0=(BC.B.B1&0x80?C_FLAG : 0); + BC.B.B1<<=1; + AF.B.B0|=ZeroTable[BC.B.B1]; + break; + case 0x21: + // SLA C + AF.B.B0=(BC.B.B0&0x80?C_FLAG : 0); + BC.B.B0<<=1; + AF.B.B0|=ZeroTable[BC.B.B0]; + break; + case 0x22: + // SLA D + AF.B.B0=(DE.B.B1&0x80?C_FLAG : 0); + DE.B.B1<<=1; + AF.B.B0|=ZeroTable[DE.B.B1]; + break; + case 0x23: + // SLA E + AF.B.B0=(DE.B.B0&0x80?C_FLAG : 0); + DE.B.B0<<=1; + AF.B.B0|=ZeroTable[DE.B.B0]; + break; + case 0x24: + // SLA H + AF.B.B0=(HL.B.B1&0x80?C_FLAG : 0); + HL.B.B1<<=1; + AF.B.B0|=ZeroTable[HL.B.B1]; + break; + case 0x25: + // SLA L + AF.B.B0=(HL.B.B0&0x80?C_FLAG : 0); + HL.B.B0<<=1; + AF.B.B0|=ZeroTable[HL.B.B0]; + break; + case 0x26: + // SLA (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(tempValue&0x80?C_FLAG : 0); + tempValue<<=1; + AF.B.B0|=ZeroTable[tempValue]; + gbWriteMemory(HL.W,tempValue); + break; + case 0x27: + // SLA A + AF.B.B0=(AF.B.B1&0x80?C_FLAG : 0); + AF.B.B1<<=1; + AF.B.B0|=ZeroTable[AF.B.B1]; + break; + case 0x28: + // SRA B + AF.B.B0=(BC.B.B1&0x01 ? C_FLAG: 0); + BC.B.B1=(BC.B.B1>>1)|(BC.B.B1&0x80); + AF.B.B0|=ZeroTable[BC.B.B1]; + break; + case 0x29: + // SRA C + AF.B.B0=(BC.B.B0&0x01 ? C_FLAG: 0); + BC.B.B0=(BC.B.B0>>1)|(BC.B.B0&0x80); + AF.B.B0|=ZeroTable[BC.B.B0]; + break; + case 0x2a: + // SRA D + AF.B.B0=(DE.B.B1&0x01 ? C_FLAG: 0); + DE.B.B1=(DE.B.B1>>1)|(DE.B.B1&0x80); + AF.B.B0|=ZeroTable[DE.B.B1]; + break; + case 0x2b: + // SRA E + AF.B.B0=(DE.B.B0&0x01 ? C_FLAG: 0); + DE.B.B0=(DE.B.B0>>1)|(DE.B.B0&0x80); + AF.B.B0|=ZeroTable[DE.B.B0]; + break; + case 0x2c: + // SRA H + AF.B.B0=(HL.B.B1&0x01 ? C_FLAG: 0); + HL.B.B1=(HL.B.B1>>1)|(HL.B.B1&0x80); + AF.B.B0|=ZeroTable[HL.B.B1]; + break; + case 0x2d: + // SRA L + AF.B.B0=(HL.B.B0&0x01 ? C_FLAG: 0); + HL.B.B0=(HL.B.B0>>1)|(HL.B.B0&0x80); + AF.B.B0|=ZeroTable[HL.B.B0]; + break; + case 0x2e: + // SRA (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(tempValue&0x01 ? C_FLAG: 0); + tempValue=(tempValue>>1)|(tempValue&0x80); + AF.B.B0|=ZeroTable[tempValue]; + gbWriteMemory(HL.W,tempValue); + break; + case 0x2f: + // SRA A + AF.B.B0=(AF.B.B1&0x01 ? C_FLAG: 0); + AF.B.B1=(AF.B.B1>>1)|(AF.B.B1&0x80); + AF.B.B0|=ZeroTable[AF.B.B1]; + break; + case 0x30: + // SWAP B + BC.B.B1 = (BC.B.B1&0xf0)>>4 | (BC.B.B1&0x0f)<<4; + AF.B.B0 = ZeroTable[BC.B.B1]; + break; + case 0x31: + // SWAP C + BC.B.B0 = (BC.B.B0&0xf0)>>4 | (BC.B.B0&0x0f)<<4; + AF.B.B0 = ZeroTable[BC.B.B0]; + break; + case 0x32: + // SWAP D + DE.B.B1 = (DE.B.B1&0xf0)>>4 | (DE.B.B1&0x0f)<<4; + AF.B.B0 = ZeroTable[DE.B.B1]; + break; + case 0x33: + // SWAP E + DE.B.B0 = (DE.B.B0&0xf0)>>4 | (DE.B.B0&0x0f)<<4; + AF.B.B0 = ZeroTable[DE.B.B0]; + break; + case 0x34: + // SWAP H + HL.B.B1 = (HL.B.B1&0xf0)>>4 | (HL.B.B1&0x0f)<<4; + AF.B.B0 = ZeroTable[HL.B.B1]; + break; + case 0x35: + // SWAP L + HL.B.B0 = (HL.B.B0&0xf0)>>4 | (HL.B.B0&0x0f)<<4; + AF.B.B0 = ZeroTable[HL.B.B0]; + break; + case 0x36: + // SWAP (HL) + tempValue=gbReadMemory(HL.W); + tempValue = (tempValue&0xf0)>>4 | (tempValue&0x0f)<<4; + AF.B.B0 = ZeroTable[tempValue]; + gbWriteMemory(HL.W,tempValue); + break; + case 0x37: + // SWAP A + AF.B.B1 = (AF.B.B1&0xf0)>>4 | (AF.B.B1&0x0f)<<4; + AF.B.B0 = ZeroTable[AF.B.B1]; + break; + case 0x38: + // SRL B + AF.B.B0=(BC.B.B1&0x01)?C_FLAG:0; + BC.B.B1>>=1; + AF.B.B0|=ZeroTable[BC.B.B1]; + break; + case 0x39: + // SRL C + AF.B.B0=(BC.B.B0&0x01)?C_FLAG:0; + BC.B.B0>>=1; + AF.B.B0|=ZeroTable[BC.B.B0]; + break; + case 0x3a: + // SRL D + AF.B.B0=(DE.B.B1&0x01)?C_FLAG:0; + DE.B.B1>>=1; + AF.B.B0|=ZeroTable[DE.B.B1]; + break; + case 0x3b: + // SRL E + AF.B.B0=(DE.B.B0&0x01)?C_FLAG:0; + DE.B.B0>>=1; + AF.B.B0|=ZeroTable[DE.B.B0]; + break; + case 0x3c: + // SRL H + AF.B.B0=(HL.B.B1&0x01)?C_FLAG:0; + HL.B.B1>>=1; + AF.B.B0|=ZeroTable[HL.B.B1]; + break; + case 0x3d: + // SRL L + AF.B.B0=(HL.B.B0&0x01)?C_FLAG:0; + HL.B.B0>>=1; + AF.B.B0|=ZeroTable[HL.B.B0]; + break; + case 0x3e: + // SRL (HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(tempValue&0x01)?C_FLAG:0; + tempValue>>=1; + AF.B.B0|=ZeroTable[tempValue]; + gbWriteMemory(HL.W,tempValue); + break; + case 0x3f: + // SRL A + AF.B.B0=(AF.B.B1&0x01)?C_FLAG:0; + AF.B.B1>>=1; + AF.B.B0|=ZeroTable[AF.B.B1]; + break; + case 0x40: + // BIT 0,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<0)? 0:Z_FLAG); + break; + case 0x41: + // BIT 0,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<0)? 0:Z_FLAG); + break; + case 0x42: + // BIT 0,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<0)? 0:Z_FLAG); + break; + case 0x43: + // BIT 0,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<0)? 0:Z_FLAG); + break; + case 0x44: + // BIT 0,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<0)? 0:Z_FLAG); + break; + case 0x45: + // BIT 0,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<0)? 0:Z_FLAG); + break; + case 0x46: + // BIT 0,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<0)? 0:Z_FLAG); + break; + case 0x47: + // BIT 0,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<0)? 0:Z_FLAG); + break; + case 0x48: + // BIT 1,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<1)? 0:Z_FLAG); + break; + case 0x49: + // BIT 1,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<1)? 0:Z_FLAG); + break; + case 0x4a: + // BIT 1,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<1)? 0:Z_FLAG); + break; + case 0x4b: + // BIT 1,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<1)? 0:Z_FLAG); + break; + case 0x4c: + // BIT 1,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<1)? 0:Z_FLAG); + break; + case 0x4d: + // BIT 1,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<1)? 0:Z_FLAG); + break; + case 0x4e: + // BIT 1,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<1)? 0:Z_FLAG); + break; + case 0x4f: + // BIT 1,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<1)? 0:Z_FLAG); + break; + case 0x50: + // BIT 2,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<2)? 0:Z_FLAG); + break; + case 0x51: + // BIT 2,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<2)? 0:Z_FLAG); + break; + case 0x52: + // BIT 2,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<2)? 0:Z_FLAG); + break; + case 0x53: + // BIT 2,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<2)? 0:Z_FLAG); + break; + case 0x54: + // BIT 2,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<2)? 0:Z_FLAG); + break; + case 0x55: + // BIT 2,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<2)? 0:Z_FLAG); + break; + case 0x56: + // BIT 2,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<2)? 0:Z_FLAG); + break; + case 0x57: + // BIT 2,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<2)? 0:Z_FLAG); + break; + case 0x58: + // BIT 3,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<3)? 0:Z_FLAG); + break; + case 0x59: + // BIT 3,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<3)? 0:Z_FLAG); + break; + case 0x5a: + // BIT 3,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<3)? 0:Z_FLAG); + break; + case 0x5b: + // BIT 3,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<3)? 0:Z_FLAG); + break; + case 0x5c: + // BIT 3,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<3)? 0:Z_FLAG); + break; + case 0x5d: + // BIT 3,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<3)? 0:Z_FLAG); + break; + case 0x5e: + // BIT 3,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<3)? 0:Z_FLAG); + break; + case 0x5f: + // BIT 3,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<3)? 0:Z_FLAG); + break; + case 0x60: + // BIT 4,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<4)? 0:Z_FLAG); + break; + case 0x61: + // BIT 4,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<4)? 0:Z_FLAG); + break; + case 0x62: + // BIT 4,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<4)? 0:Z_FLAG); + break; + case 0x63: + // BIT 4,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<4)? 0:Z_FLAG); + break; + case 0x64: + // BIT 4,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<4)? 0:Z_FLAG); + break; + case 0x65: + // BIT 4,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<4)? 0:Z_FLAG); + break; + case 0x66: + // BIT 4,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<4)? 0:Z_FLAG); + break; + case 0x67: + // BIT 4,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<4)? 0:Z_FLAG); + break; + case 0x68: + // BIT 5,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<5)? 0:Z_FLAG); + break; + case 0x69: + // BIT 5,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<5)? 0:Z_FLAG); + break; + case 0x6a: + // BIT 5,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<5)? 0:Z_FLAG); + break; + case 0x6b: + // BIT 5,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<5)? 0:Z_FLAG); + break; + case 0x6c: + // BIT 5,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<5)? 0:Z_FLAG); + break; + case 0x6d: + // BIT 5,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<5)? 0:Z_FLAG); + break; + case 0x6e: + // BIT 5,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<5)? 0:Z_FLAG); + break; + case 0x6f: + // BIT 5,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<5)? 0:Z_FLAG); + break; + case 0x70: + // BIT 6,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<6)? 0:Z_FLAG); + break; + case 0x71: + // BIT 6,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<6)? 0:Z_FLAG); + break; + case 0x72: + // BIT 6,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<6)? 0:Z_FLAG); + break; + case 0x73: + // BIT 6,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<6)? 0:Z_FLAG); + break; + case 0x74: + // BIT 6,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<6)? 0:Z_FLAG); + break; + case 0x75: + // BIT 6,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<6)? 0:Z_FLAG); + break; + case 0x76: + // BIT 6,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<6)? 0:Z_FLAG); + break; + case 0x77: + // BIT 6,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<6)? 0:Z_FLAG); + break; + case 0x78: + // BIT 7,B + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B1&(1<<7)? 0:Z_FLAG); + break; + case 0x79: + // BIT 7,C + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(BC.B.B0&(1<<7)? 0:Z_FLAG); + break; + case 0x7a: + // BIT 7,D + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B1&(1<<7)? 0:Z_FLAG); + break; + case 0x7b: + // BIT 7,E + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(DE.B.B0&(1<<7)? 0:Z_FLAG); + break; + case 0x7c: + // BIT 7,H + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B1&(1<<7)? 0:Z_FLAG); + break; + case 0x7d: + // BIT 7,L + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(HL.B.B0&(1<<7)? 0:Z_FLAG); + break; + case 0x7e: + // BIT 7,(HL) + tempValue=gbReadMemory(HL.W); + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(tempValue&(1<<7)? 0:Z_FLAG); + break; + case 0x7f: + // BIT 7,A + AF.B.B0=(AF.B.B0&C_FLAG)|H_FLAG|(AF.B.B1&(1<<7)? 0:Z_FLAG); + break; + case 0x80: + // RES 0,B + BC.B.B1&=~(1<<0); + break; + case 0x81: + // RES 0,C + BC.B.B0&=~(1<<0); + break; + case 0x82: + // RES 0,D + DE.B.B1&=~(1<<0); + break; + case 0x83: + // RES 0,E + DE.B.B0&=~(1<<0); + break; + case 0x84: + // RES 0,H + HL.B.B1&=~(1<<0); + break; + case 0x85: + // RES 0,L + HL.B.B0&=~(1<<0); + break; + case 0x86: + // RES 0,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<0); + gbWriteMemory(HL.W,tempValue); + break; + case 0x87: + // RES 0,A + AF.B.B1&=~(1<<0); + break; + case 0x88: + // RES 1,B + BC.B.B1&=~(1<<1); + break; + case 0x89: + // RES 1,C + BC.B.B0&=~(1<<1); + break; + case 0x8a: + // RES 1,D + DE.B.B1&=~(1<<1); + break; + case 0x8b: + // RES 1,E + DE.B.B0&=~(1<<1); + break; + case 0x8c: + // RES 1,H + HL.B.B1&=~(1<<1); + break; + case 0x8d: + // RES 1,L + HL.B.B0&=~(1<<1); + break; + case 0x8e: + // RES 1,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<1); + gbWriteMemory(HL.W,tempValue); + break; + case 0x8f: + // RES 1,A + AF.B.B1&=~(1<<1); + break; + case 0x90: + // RES 2,B + BC.B.B1&=~(1<<2); + break; + case 0x91: + // RES 2,C + BC.B.B0&=~(1<<2); + break; + case 0x92: + // RES 2,D + DE.B.B1&=~(1<<2); + break; + case 0x93: + // RES 2,E + DE.B.B0&=~(1<<2); + break; + case 0x94: + // RES 2,H + HL.B.B1&=~(1<<2); + break; + case 0x95: + // RES 2,L + HL.B.B0&=~(1<<2); + break; + case 0x96: + // RES 2,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<2); + gbWriteMemory(HL.W,tempValue); + break; + case 0x97: + // RES 2,A + AF.B.B1&=~(1<<2); + break; + case 0x98: + // RES 3,B + BC.B.B1&=~(1<<3); + break; + case 0x99: + // RES 3,C + BC.B.B0&=~(1<<3); + break; + case 0x9a: + // RES 3,D + DE.B.B1&=~(1<<3); + break; + case 0x9b: + // RES 3,E + DE.B.B0&=~(1<<3); + break; + case 0x9c: + // RES 3,H + HL.B.B1&=~(1<<3); + break; + case 0x9d: + // RES 3,L + HL.B.B0&=~(1<<3); + break; + case 0x9e: + // RES 3,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<3); + gbWriteMemory(HL.W,tempValue); + break; + case 0x9f: + // RES 3,A + AF.B.B1&=~(1<<3); + break; + case 0xa0: + // RES 4,B + BC.B.B1&=~(1<<4); + break; + case 0xa1: + // RES 4,C + BC.B.B0&=~(1<<4); + break; + case 0xa2: + // RES 4,D + DE.B.B1&=~(1<<4); + break; + case 0xa3: + // RES 4,E + DE.B.B0&=~(1<<4); + break; + case 0xa4: + // RES 4,H + HL.B.B1&=~(1<<4); + break; + case 0xa5: + // RES 4,L + HL.B.B0&=~(1<<4); + break; + case 0xa6: + // RES 4,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<4); + gbWriteMemory(HL.W,tempValue); + break; + case 0xa7: + // RES 4,A + AF.B.B1&=~(1<<4); + break; + case 0xa8: + // RES 5,B + BC.B.B1&=~(1<<5); + break; + case 0xa9: + // RES 5,C + BC.B.B0&=~(1<<5); + break; + case 0xaa: + // RES 5,D + DE.B.B1&=~(1<<5); + break; + case 0xab: + // RES 5,E + DE.B.B0&=~(1<<5); + break; + case 0xac: + // RES 5,H + HL.B.B1&=~(1<<5); + break; + case 0xad: + // RES 5,L + HL.B.B0&=~(1<<5); + break; + case 0xae: + // RES 5,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<5); + gbWriteMemory(HL.W,tempValue); + break; + case 0xaf: + // RES 5,A + AF.B.B1&=~(1<<5); + break; + case 0xb0: + // RES 6,B + BC.B.B1&=~(1<<6); + break; + case 0xb1: + // RES 6,C + BC.B.B0&=~(1<<6); + break; + case 0xb2: + // RES 6,D + DE.B.B1&=~(1<<6); + break; + case 0xb3: + // RES 6,E + DE.B.B0&=~(1<<6); + break; + case 0xb4: + // RES 6,H + HL.B.B1&=~(1<<6); + break; + case 0xb5: + // RES 6,L + HL.B.B0&=~(1<<6); + break; + case 0xb6: + // RES 6,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<6); + gbWriteMemory(HL.W,tempValue); + break; + case 0xb7: + // RES 6,A + AF.B.B1&=~(1<<6); + break; + case 0xb8: + // RES 7,B + BC.B.B1&=~(1<<7); + break; + case 0xb9: + // RES 7,C + BC.B.B0&=~(1<<7); + break; + case 0xba: + // RES 7,D + DE.B.B1&=~(1<<7); + break; + case 0xbb: + // RES 7,E + DE.B.B0&=~(1<<7); + break; + case 0xbc: + // RES 7,H + HL.B.B1&=~(1<<7); + break; + case 0xbd: + // RES 7,L + HL.B.B0&=~(1<<7); + break; + case 0xbe: + // RES 7,(HL) + tempValue=gbReadMemory(HL.W); + tempValue&=~(1<<7); + gbWriteMemory(HL.W,tempValue); + break; + case 0xbf: + // RES 7,A + AF.B.B1&=~(1<<7); + break; + case 0xc0: + // SET 0,B + BC.B.B1|=1<<0; + break; + case 0xc1: + // SET 0,C + BC.B.B0|=1<<0; + break; + case 0xc2: + // SET 0,D + DE.B.B1|=1<<0; + break; + case 0xc3: + // SET 0,E + DE.B.B0|=1<<0; + break; + case 0xc4: + // SET 0,H + HL.B.B1|=1<<0; + break; + case 0xc5: + // SET 0,L + HL.B.B0|=1<<0; + break; + case 0xc6: + // SET 0,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<0; + gbWriteMemory(HL.W,tempValue); + break; + case 0xc7: + // SET 0,A + AF.B.B1|=1<<0; + break; + case 0xc8: + // SET 1,B + BC.B.B1|=1<<1; + break; + case 0xc9: + // SET 1,C + BC.B.B0|=1<<1; + break; + case 0xca: + // SET 1,D + DE.B.B1|=1<<1; + break; + case 0xcb: + // SET 1,E + DE.B.B0|=1<<1; + break; + case 0xcc: + // SET 1,H + HL.B.B1|=1<<1; + break; + case 0xcd: + // SET 1,L + HL.B.B0|=1<<1; + break; + case 0xce: + // SET 1,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<1; + gbWriteMemory(HL.W,tempValue); + break; + case 0xcf: + // SET 1,A + AF.B.B1|=1<<1; + break; + case 0xd0: + // SET 2,B + BC.B.B1|=1<<2; + break; + case 0xd1: + // SET 2,C + BC.B.B0|=1<<2; + break; + case 0xd2: + // SET 2,D + DE.B.B1|=1<<2; + break; + case 0xd3: + // SET 2,E + DE.B.B0|=1<<2; + break; + case 0xd4: + // SET 2,H + HL.B.B1|=1<<2; + break; + case 0xd5: + // SET 2,L + HL.B.B0|=1<<2; + break; + case 0xd6: + // SET 2,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<2; + gbWriteMemory(HL.W,tempValue); + break; + case 0xd7: + // SET 2,A + AF.B.B1|=1<<2; + break; + case 0xd8: + // SET 3,B + BC.B.B1|=1<<3; + break; + case 0xd9: + // SET 3,C + BC.B.B0|=1<<3; + break; + case 0xda: + // SET 3,D + DE.B.B1|=1<<3; + break; + case 0xdb: + // SET 3,E + DE.B.B0|=1<<3; + break; + case 0xdc: + // SET 3,H + HL.B.B1|=1<<3; + break; + case 0xdd: + // SET 3,L + HL.B.B0|=1<<3; + break; + case 0xde: + // SET 3,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<3; + gbWriteMemory(HL.W,tempValue); + break; + case 0xdf: + // SET 3,A + AF.B.B1|=1<<3; + break; + case 0xe0: + // SET 4,B + BC.B.B1|=1<<4; + break; + case 0xe1: + // SET 4,C + BC.B.B0|=1<<4; + break; + case 0xe2: + // SET 4,D + DE.B.B1|=1<<4; + break; + case 0xe3: + // SET 4,E + DE.B.B0|=1<<4; + break; + case 0xe4: + // SET 4,H + HL.B.B1|=1<<4; + break; + case 0xe5: + // SET 4,L + HL.B.B0|=1<<4; + break; + case 0xe6: + // SET 4,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<4; + gbWriteMemory(HL.W,tempValue); + break; + case 0xe7: + // SET 4,A + AF.B.B1|=1<<4; + break; + case 0xe8: + // SET 5,B + BC.B.B1|=1<<5; + break; + case 0xe9: + // SET 5,C + BC.B.B0|=1<<5; + break; + case 0xea: + // SET 5,D + DE.B.B1|=1<<5; + break; + case 0xeb: + // SET 5,E + DE.B.B0|=1<<5; + break; + case 0xec: + // SET 5,H + HL.B.B1|=1<<5; + break; + case 0xed: + // SET 5,L + HL.B.B0|=1<<5; + break; + case 0xee: + // SET 5,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<5; + gbWriteMemory(HL.W,tempValue); + break; + case 0xef: + // SET 5,A + AF.B.B1|=1<<5; + break; + case 0xf0: + // SET 6,B + BC.B.B1|=1<<6; + break; + case 0xf1: + // SET 6,C + BC.B.B0|=1<<6; + break; + case 0xf2: + // SET 6,D + DE.B.B1|=1<<6; + break; + case 0xf3: + // SET 6,E + DE.B.B0|=1<<6; + break; + case 0xf4: + // SET 6,H + HL.B.B1|=1<<6; + break; + case 0xf5: + // SET 6,L + HL.B.B0|=1<<6; + break; + case 0xf6: + // SET 6,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<6; + gbWriteMemory(HL.W,tempValue); + break; + case 0xf7: + // SET 6,A + AF.B.B1|=1<<6; + break; + case 0xf8: + // SET 7,B + BC.B.B1|=1<<7; + break; + case 0xf9: + // SET 7,C + BC.B.B0|=1<<7; + break; + case 0xfa: + // SET 7,D + DE.B.B1|=1<<7; + break; + case 0xfb: + // SET 7,E + DE.B.B0|=1<<7; + break; + case 0xfc: + // SET 7,H + HL.B.B1|=1<<7; + break; + case 0xfd: + // SET 7,L + HL.B.B0|=1<<7; + break; + case 0xfe: + // SET 7,(HL) + tempValue=gbReadMemory(HL.W); + tempValue|=1<<7; + gbWriteMemory(HL.W,tempValue); + break; + case 0xff: + // SET 7,A + AF.B.B1|=1<<7; + break; diff --git a/Mednafen/mednafen/gb/gbGlobals.cpp b/Mednafen/mednafen/gb/gbGlobals.cpp new file mode 100644 index 0000000000..37392b0018 --- /dev/null +++ b/Mednafen/mednafen/gb/gbGlobals.cpp @@ -0,0 +1,51 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include + +namespace MDFN_IEN_GB +{ + +uint8 *gbMemoryMap[16]; + +int gbRomSizeMask = 0; +int gbRomSize = 0; +int gbRamSizeMask = 0; +int gbRamSize = 0; + +uint8 *gbVram = NULL; +uint8 *gbRom = NULL; +uint8 *gbRam = NULL; +uint8 *gbWram = NULL; + +uint16 gbPalette[128]; +uint8 gbBgp[4]; +uint8 gbObp0[4]; +uint8 gbObp1[4]; + +int gbWindowLine = -1; + +int gbCgbMode = 0; + +int gbPaletteOption = 0; +int gbEmulatorType = 0; +int gbDmaTicks = 0; + +uint8 (*gbSerialFunction)(uint8) = NULL; + +} diff --git a/Mednafen/mednafen/gb/gbGlobals.h b/Mednafen/mednafen/gb/gbGlobals.h new file mode 100644 index 0000000000..a9d8e0e381 --- /dev/null +++ b/Mednafen/mednafen/gb/gbGlobals.h @@ -0,0 +1,64 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +namespace MDFN_IEN_GB +{ + +extern int gbRomSizeMask; +extern int gbRomSize; +extern int gbRamSize; +extern int gbRamSizeMask; + +extern uint8 *gbRom; +extern uint8 *gbRam; +extern uint8 *gbVram; +extern uint8 *gbWram; + +extern uint8 *gbMemoryMap[16]; + +extern int gbFrameSkip; +extern int gbPaletteOption; +extern int gbEmulatorType; +extern int gbCgbMode; +extern int gbSgbMode; +extern int gbWindowLine; +extern int gbSpeed; +extern uint8 gbBgp[4]; +extern uint8 gbObp0[4]; +extern uint8 gbObp1[4]; +extern uint16 gbPalette[128]; + +extern uint8 register_LCDC; +extern uint8 register_LY; +extern uint8 register_SCY; +extern uint8 register_SCX; +extern uint8 register_WY; +extern uint8 register_WX; +extern uint8 register_VBK; + +extern int emulating; + +extern int gbDmaTicks; + +void gbRenderLine(void); + +extern uint32 gblayerSettings; +extern uint8 (*gbSerialFunction)(uint8); + +} diff --git a/Mednafen/mednafen/gb/gfx.cpp b/Mednafen/mednafen/gb/gfx.cpp new file mode 100644 index 0000000000..13fe4c0bb4 --- /dev/null +++ b/Mednafen/mednafen/gb/gfx.cpp @@ -0,0 +1,504 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include + +#include "gbGlobals.h" +#include "gb.h" + +namespace MDFN_IEN_GB +{ + +static const uint8 gbInvertTab[256] = +{ + 0x00,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0, + 0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0, + 0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8, + 0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8, + 0x04,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4, + 0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4, + 0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec, + 0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc, + 0x02,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2, + 0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2, + 0x0a,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea, + 0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa, + 0x06,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6, + 0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6, + 0x0e,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee, + 0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe, + 0x01,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1, + 0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1, + 0x09,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9, + 0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9, + 0x05,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5, + 0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5, + 0x0d,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed, + 0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd, + 0x03,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3, + 0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3, + 0x0b,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb, + 0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb, + 0x07,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7, + 0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7, + 0x0f,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef, + 0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff +}; + +union __gblmt +{ + uint16 cgb[160]; + uint8 dmg[160]; + uint32 dmg_32[40]; +} gbLineMix; + +static uint16 gbLineBuffer[160]; + +template +static INLINE void DrawBG(void) +{ + uint8 * bank0; + uint8 * bank1; + + if(cgb_mode) { + bank0 = &gbVram[0x0000]; + bank1 = &gbVram[0x2000]; + } else { + bank0 = &gbVram[0x0000]; + bank1 = NULL; + } + + int tile_map = 0x1800; + if((register_LCDC & 8) != 0) + tile_map = 0x1c00; + + int tile_pattern = 0x0800; + + if((register_LCDC & 16) != 0) + tile_pattern = 0x0000; + + int x = 0; + int y = register_LY; + + if(y >= 144) + return; + + int sx = register_SCX; + int sy = register_SCY; + + sy+=y; + + sy &= 255; + + int tx = sx >> 3; + int ty = sy >> 3; + + int bx = 1 << (7 - (sx & 7)); + int by = sy & 7; + + int tile_map_line_y = tile_map + ty * 32; + + int tile_map_address = tile_map_line_y + tx; + + uint8 attrs = 0; + if(bank1 != NULL) + attrs = bank1[tile_map_address]; + + uint8 tile = bank0[tile_map_address]; + + tile_map_address++; + + if((register_LCDC & 16) == 0) { + if(tile < 128) tile += 128; + else tile -= 128; + } + + int tile_pattern_address = tile_pattern + tile * 16 + by*2; + + if(register_LCDC & 0x80) + { + if((register_LCDC & 0x01 || cgb_mode) && (gblayerSettings & 0x01)) + { + while(x < 160) { + uint8 tile_a = 0; + uint8 tile_b = 0; + + if(attrs & 0x40) { + tile_pattern_address = tile_pattern + tile * 16 + (7-by)*2; + } + + if(attrs & 0x08) { + tile_a = bank1[tile_pattern_address++]; + tile_b = bank1[tile_pattern_address]; + } else { + tile_a = bank0[tile_pattern_address++]; + tile_b = bank0[tile_pattern_address]; + } + + if(attrs & 0x20) { + tile_a = gbInvertTab[tile_a]; + tile_b = gbInvertTab[tile_b]; + } + + while(bx > 0) { + uint8 c = (tile_a & bx) ? 1 : 0; + c += ((tile_b & bx) ? 2 : 0); + + gbLineBuffer[x] = c; // mark the gbLineBuffer color + + if(attrs & 0x80) + gbLineBuffer[x] |= 0x300; + + if(cgb_mode) + { + c = c + (attrs & 7)*4; + gbLineMix.cgb[x] = gbPalette[c]; + } + else + { + gbLineMix.dmg[x] = gbBgp[c]; + } + + x++; + if(x >= 160) + break; + bx >>= 1; + } + tx++; + if(tx == 32) + tx = 0; + bx = 128; + + if(bank1) + attrs = bank1[tile_map_line_y + tx]; + + tile = bank0[tile_map_line_y + tx]; + + if((register_LCDC & 16) == 0) { + if(tile < 128) tile += 128; + else tile -= 128; + } + tile_pattern_address = tile_pattern + tile * 16 + by * 2; + } + } + else + { + int fill_color = cgb_mode ? gbPalette[0] : 0; + + for(int i = 0; i < 160; i++) + { + if(cgb_mode) + gbLineMix.cgb[i] = fill_color; + else + gbLineMix.dmg[i] = fill_color; + + gbLineBuffer[i] = 0; + } + } + + // do the window display + if((register_LCDC & 0x20) && (gblayerSettings & 0x02)) { + int wy = register_WY; + + if(y >= wy) { + int wx = register_WX; + wx -= 7; + + if( wx <= 159 && gbWindowLine <= 143) { + + tile_map = 0x1800; + + if((register_LCDC & 0x40) != 0) + tile_map = 0x1c00; + + if(gbWindowLine == -1) { + gbWindowLine = 0; + } + + tx = 0; + ty = gbWindowLine >> 3; + + bx = 128; + by = gbWindowLine & 7; + + if(wx < 0) { + bx >>= (-wx); + wx = 0; + } + + tile_map_line_y = tile_map + ty * 32; + + tile_map_address = tile_map_line_y + tx; + + x = wx; + + tile = bank0[tile_map_address]; + + attrs = 0; + + if(bank1) + attrs = bank1[tile_map_address]; + tile_map_address++; + + if((register_LCDC & 16) == 0) { + if(tile < 128) tile += 128; + else tile -= 128; + } + + tile_pattern_address = tile_pattern + tile * 16 + by*2; + + while(x < 160) { + uint8 tile_a = 0; + uint8 tile_b = 0; + + if(attrs & 0x40) { + tile_pattern_address = tile_pattern + tile * 16 + (7-by)*2; + } + + if(attrs & 0x08) { + tile_a = bank1[tile_pattern_address++]; + tile_b = bank1[tile_pattern_address]; + } else { + tile_a = bank0[tile_pattern_address++]; + tile_b = bank0[tile_pattern_address]; + } + + if(attrs & 0x20) { + tile_a = gbInvertTab[tile_a]; + tile_b = gbInvertTab[tile_b]; + } + + while(bx > 0) { + uint8 c = (tile_a & bx) != 0 ? 1 : 0; + c += ((tile_b & bx) != 0 ? 2 : 0); + + if(attrs & 0x80) + gbLineBuffer[x] = 0x300 + c; + else + gbLineBuffer[x] = 0x100 + c; + + if(cgb_mode) + { + c = c + (attrs & 7) * 4; + gbLineMix.cgb[x] = gbPalette[c]; + } + else + { + gbLineMix.dmg[x] = gbBgp[c]; + } + + x++; + if(x >= 160) + break; + bx >>= 1; + } + tx++; + if(tx == 32) + tx = 0; + bx = 128; + tile = bank0[tile_map_line_y + tx]; + if(bank1) + attrs = bank1[tile_map_line_y + tx]; + + if((register_LCDC & 16) == 0) { + if(tile < 128) tile += 128; + else tile -= 128; + } + tile_pattern_address = tile_pattern + tile * 16 + by * 2; + } + gbWindowLine++; + } + } + } + } + else + { + const uint8 fill_color = cgb_mode ? gbPalette[0] : 12; + + for(int i = 0; i < 160; i++) + { + if(cgb_mode) + gbLineMix.cgb[i] = fill_color; + else + gbLineMix.dmg[i] = fill_color; + + gbLineBuffer[i] = 0; + } + } +} + +template +static INLINE void DrawSpriteTile(int tile, int x,int y,int t, int flags, + int size,int spriteNumber) +{ + uint8 * bank0; + uint8 * bank1; + if(cgb_mode) { + if(register_VBK & 1) { + bank0 = &gbVram[0x0000]; + bank1 = &gbVram[0x2000]; + } else { + bank0 = &gbVram[0x0000]; + bank1 = &gbVram[0x2000]; + } + } else { + bank0 = &gbVram[0x0000]; + bank1 = NULL; + } + + int init = 0x0000; + + uint8 *pal = gbObp0; + + int flipx = (flags & 0x20); + int flipy = (flags & 0x40); + + if((flags & 0x10)) + pal = gbObp1; + + if(flipy) { + t = (size ? 15 : 7) - t; + } + + int prio = flags & 0x80; + + int address = init + tile * 16 + 2*t; + int a = 0; + int b = 0; + + if(cgb_mode && flags & 0x08) { + a = bank1[address++]; + b = bank1[address++]; + } else { + a = bank0[address++]; + b = bank0[address++]; + } + + for(int xx = 0; xx < 8; xx++) { + uint8 mask = 1 << (7-xx); + uint8 c = 0; + if( (a & mask)) + c++; + if( (b & mask)) + c+=2; + + if(c==0) continue; + + int xxx = xx+x; + if(flipx) + xxx = (7-xx+x); + + if(xxx < 0 || xxx > 159) + continue; + + uint16 color = gbLineBuffer[xxx]; + + if(prio) { + if(color < 0x200 && ((color & 0xFF) != 0)) + continue; + } + if(color >= 0x300 && color != 0x300) + continue; + else if(color >= 0x200 && color < 0x300) { + int sprite = color & 0xff; + + int spriteX = gbOAM[4 * sprite + 1] - 8; + + if(spriteX == x) { + if(sprite < spriteNumber) + continue; + } else { + if(cgb_mode) { + if(sprite < spriteNumber) + continue; + } else { + if(spriteX < x+8) + continue; + } + } + } + + + gbLineBuffer[xxx] = 0x200 + spriteNumber; + + // make sure that sprites will work even in CGB mode + if(cgb_mode) + { + c = c + (flags & 0x07)*4 + 32; + gbLineMix.cgb[xxx] = gbPalette[c]; + } + else + { + gbLineMix.dmg[xxx] = pal[c]; + } + } +} + +template +static void DrawSprites(void) +{ + int x = 0; + int y = 0; + int count = 0; + int size = (register_LCDC & 4) >> 2; + + if(!(register_LCDC & 0x80)) + return; + + if((register_LCDC & 2) && (gblayerSettings & 0x04)) { + int yc = register_LY; + + int address = 0; + for(int i = 0; i < 40; i++) { + y = gbOAM[address++]; + x = gbOAM[address++]; + int tile = gbOAM[address++] &~ size; + int flags = gbOAM[address++]; + + if(x > 0 && y > 0 && x < 168 && y < 160) { + // check if sprite intersects current line + int t = yc - y + 16; + + if((unsigned)t < (8U << size)) { + DrawSpriteTile(tile, x-8, yc, t, flags, size, i); + count++; + } + } + // sprite limit reached! + if(count >= 10) + break; + } + } +} + + +void gbRenderLine(void) +{ + if(gbCgbMode) + { + DrawBG(); + DrawSprites(); + } + else + { + DrawBG(); + DrawSprites(); + } +} + +} diff --git a/Mednafen/mednafen/gb/memory.cpp b/Mednafen/mednafen/gb/memory.cpp new file mode 100644 index 0000000000..e3adceaa3e --- /dev/null +++ b/Mednafen/mednafen/gb/memory.cpp @@ -0,0 +1,817 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include +#include +#include "gbGlobals.h" +#include "memory.h" + +namespace MDFN_IEN_GB +{ + +mapperMBC1 gbDataMBC1 = { + 0, // RAM enable + 1, // ROM bank + 0, // RAM bank or high address + 0, // memory model +}; + +static void SetROMMap(uint32 tmpAddress) +{ + tmpAddress &= gbRomSizeMask; + gbMemoryMap[0x04] = &gbRom[tmpAddress + 0x0000]; + gbMemoryMap[0x05] = &gbRom[tmpAddress + 0x1000]; + gbMemoryMap[0x06] = &gbRom[tmpAddress + 0x2000]; + gbMemoryMap[0x07] = &gbRom[tmpAddress + 0x3000]; +} + +static void SetRAM8K(uint8 bank) +{ + if(gbRamSize) + { + gbMemoryMap[0x0a] = &gbRam[((bank << 13) + 0x0000) & gbRamSizeMask]; + gbMemoryMap[0x0b] = &gbRam[((bank << 13) + 0x1000) & gbRamSizeMask]; + MDFNMP_AddRAM((gbRamSize > 8192) ? 8192 : gbRamSize, 0xA000, &gbRam[(bank << 13) & gbRamSizeMask]); + } +} + +void memoryUpdateMapMBC1() +{ + int tmpAddress = gbDataMBC1.mapperROMBank << 14; + + // check current model + if(gbDataMBC1.mapperMemoryModel == 0) { + // model is 16/8, so we have a high address in use + tmpAddress |= gbDataMBC1.mapperRAMBank << 19; + } + + SetROMMap(tmpAddress); + + if(gbDataMBC1.mapperMemoryModel == 1) + SetRAM8K(gbDataMBC1.mapperRAMBank); + else + SetRAM8K(0); + +} + +// MBC1 ROM write registers +void mapperMBC1ROM(uint16 address, uint8 value) +{ + switch(address & 0x6000) + { + case 0x0000: // RAM enable register + gbDataMBC1.mapperRAMEnable = ( ( value & 0x0a) == 0x0a ? 1 : 0); + break; + + case 0x2000: // ROM bank select + // value = value & 0x1f; + if((value & 0x1f) == 0) + value++; + + gbDataMBC1.mapperROMBank = value; + memoryUpdateMapMBC1(); + break; + + case 0x4000: // RAM bank select + gbDataMBC1.mapperRAMBank = value & 0x03; + memoryUpdateMapMBC1(); + break; + + case 0x6000: // memory model select + gbDataMBC1.mapperMemoryModel = value & 1; + memoryUpdateMapMBC1(); + break; + } +} + +// MBC1 RAM write +void mapperMBC1RAM(uint16 address, uint8 value) +{ + if(gbDataMBC1.mapperRAMEnable) { + if(gbRamSize) { + gbMemoryMap[address >> 12][address & 0x0fff & gbRamSizeMask] = value; + } + } +} + +mapperMBC2 gbDataMBC2 = { + 0, // RAM enable + 1 // ROM bank +}; + +// MBC2 ROM write registers +void mapperMBC2ROM(uint16 address, uint8 value) +{ + switch(address & 0x6000) { + case 0x0000: // RAM enable + if(!(address & 0x0100)) { + gbDataMBC2.mapperRAMEnable = (value & 0x0f) == 0x0a; + } + break; + case 0x2000: // ROM bank select + if(address & 0x0100) { + value &= 0x0f; + + if(value == 0) + value = 1; + if(gbDataMBC2.mapperROMBank != value) { + gbDataMBC2.mapperROMBank = value; + SetROMMap(value << 14); + } + } + break; + } +} + +// MBC2 RAM write +void mapperMBC2RAM(uint16 address, uint8 value) +{ + if(gbDataMBC2.mapperRAMEnable) { + if(gbRamSize && address < 0xa200) { + gbMemoryMap[address >> 12][address & 0x0fff & gbRamSizeMask] = value; + } + } +} + +void memoryUpdateMapMBC2() +{ + SetROMMap(gbDataMBC2.mapperROMBank << 14); +} + +mapperMBC3 gbDataMBC3 = { + 0, // RAM enable + 1, // ROM bank + 0, // RAM bank + 0, // timer clock latch + 0, // timer clock register + 0, // timer seconds + 0, // timer minutes + 0, // timer hours + 0, // timer days + 0, // timer control + 0, // timer latched seconds + 0, // timer latched minutes + 0, // timer latched hours + 0, // timer latched days + 0, // timer latched control + ~0ULL // last time +}; + +void memoryUpdateMBC3Clock() +{ + time_t now = time(NULL); + time_t diff = now - gbDataMBC3.mapperLastTime; + if(diff > 0) { + // update the clock according to the last update time + gbDataMBC3.mapperSeconds += diff % 60; + if(gbDataMBC3.mapperSeconds > 59) { + gbDataMBC3.mapperSeconds -= 60; + gbDataMBC3.mapperMinutes++; + } + + diff /= 60; + + gbDataMBC3.mapperMinutes += diff % 60; + if(gbDataMBC3.mapperMinutes > 60) { + gbDataMBC3.mapperMinutes -= 60; + gbDataMBC3.mapperHours++; + } + + diff /= 60; + + gbDataMBC3.mapperHours += diff % 24; + if(gbDataMBC3.mapperHours > 24) { + gbDataMBC3.mapperHours -= 24; + gbDataMBC3.mapperDays++; + } + diff /= 24; + + gbDataMBC3.mapperDays += diff; + if(gbDataMBC3.mapperDays > 255) { + if(gbDataMBC3.mapperDays > 511) { + gbDataMBC3.mapperDays %= 512; + gbDataMBC3.mapperControl |= 0x80; + } + gbDataMBC3.mapperControl = (gbDataMBC3.mapperControl & 0xfe) | + (gbDataMBC3.mapperDays>255 ? 1 : 0); + } + } + gbDataMBC3.mapperLastTime = now; +} + +// MBC3 ROM write registers +void mapperMBC3ROM(uint16 address, uint8 value) +{ + switch(address & 0x6000) + { + case 0x0000: // RAM enable register + gbDataMBC3.mapperRAMEnable = ( ( value & 0x0a) == 0x0a ? 1 : 0); + break; + case 0x2000: // ROM bank select + value = value & 0x7f; + if(value == 0) + value = 1; + if(value == gbDataMBC3.mapperROMBank) + break; + + SetROMMap(value << 14); + gbDataMBC3.mapperROMBank = value; + break; + + case 0x4000: // RAM bank select + if(value < 8) { + if(value == gbDataMBC3.mapperRAMBank) + break; + + SetRAM8K(value); + gbDataMBC3.mapperRAMBank = value; + } else { + if(gbDataMBC3.mapperRAMEnable) { + gbDataMBC3.mapperRAMBank = -1; + + gbDataMBC3.mapperClockRegister = value; + } + } + break; + case 0x6000: // clock latch + if(gbDataMBC3.mapperClockLatch == 0 && value == 1) { + memoryUpdateMBC3Clock(); + gbDataMBC3.mapperLSeconds = gbDataMBC3.mapperSeconds; + gbDataMBC3.mapperLMinutes = gbDataMBC3.mapperMinutes; + gbDataMBC3.mapperLHours = gbDataMBC3.mapperHours; + gbDataMBC3.mapperLDays = gbDataMBC3.mapperDays; + gbDataMBC3.mapperLControl = gbDataMBC3.mapperControl; + } + if(value == 0x00 || value == 0x01) + gbDataMBC3.mapperClockLatch = value; + break; + } +} + +// MBC3 RAM write +void mapperMBC3RAM(uint16 address, uint8 value) +{ + if(gbDataMBC3.mapperRAMEnable) { + if(gbDataMBC3.mapperRAMBank != -1) { + if(gbRamSize) { + gbMemoryMap[address>>12][address & 0x0fff & gbRamSizeMask] = value; + } + } else { + time_t tmp; + time(&tmp); + + gbDataMBC3.mapperLastTime = tmp; + switch(gbDataMBC3.mapperClockRegister) { + case 0x08: + gbDataMBC3.mapperSeconds = value; + break; + case 0x09: + gbDataMBC3.mapperMinutes = value; + break; + case 0x0a: + gbDataMBC3.mapperHours = value; + break; + case 0x0b: + gbDataMBC3.mapperDays = value; + break; + case 0x0c: + if(gbDataMBC3.mapperControl & 0x80) + gbDataMBC3.mapperControl = 0x80 | value; + else + gbDataMBC3.mapperControl = value; + break; + } + } + } +} + +// MBC3 read RAM +uint8 mapperMBC3ReadRAM(uint16 address) +{ + if(gbDataMBC3.mapperRAMEnable) { + if(gbDataMBC3.mapperRAMBank != -1) { + return gbMemoryMap[address>>12][address & 0x0fff]; + } + + switch(gbDataMBC3.mapperClockRegister) { + case 0x08: + return gbDataMBC3.mapperLSeconds; + break; + case 0x09: + return gbDataMBC3.mapperLMinutes; + break; + case 0x0a: + return gbDataMBC3.mapperLHours; + break; + case 0x0b: + return gbDataMBC3.mapperLDays; + break; + case 0x0c: + return gbDataMBC3.mapperLControl; + } + } + return 0; +} + +void memoryUpdateMapMBC3() +{ + SetROMMap(gbDataMBC3.mapperROMBank << 14); + + if(gbDataMBC3.mapperRAMBank >= 0 && gbRamSize) + { + SetRAM8K(gbDataMBC3.mapperRAMBank); + } +} + +mapperMBC5 gbDataMBC5 = { + 0, // RAM enable + 1, // ROM bank + 0, // RAM bank + 0, // ROM high address + 0 // is rumble cartridge? +}; + +// MBC5 ROM write registers +void mapperMBC5ROM(uint16 address, uint8 value) +{ + switch(address & 0x6000) + { + + case 0x0000: // RAM enable register + gbDataMBC5.mapperRAMEnable = ( ( value & 0x0a) == 0x0a ? 1 : 0); + break; + + case 0x2000: // ROM bank select + if(address < 0x3000) { + value = value & 0xff; + if(value == gbDataMBC5.mapperROMBank) + break; + + gbDataMBC5.mapperROMBank = value; + SetROMMap((value << 14) | (gbDataMBC5.mapperROMHighAddress << 22)); + } else { + value = value & 1; + if(value == gbDataMBC5.mapperROMHighAddress) + break; + + gbDataMBC5.mapperROMHighAddress = value; + SetROMMap((gbDataMBC5.mapperROMBank << 14) | (value << 22)); + } + break; + + case 0x4000: // RAM bank select + if(gbDataMBC5.isRumbleCartridge) + value &= 0x07; + else + value &= 0x0f; + if(value == gbDataMBC5.mapperRAMBank) + break; + + gbDataMBC5.mapperRAMBank = value; + SetRAM8K(value); + break; + } +} + +// MBC5 RAM write +void mapperMBC5RAM(uint16 address, uint8 value) +{ + if(gbDataMBC5.mapperRAMEnable) { + if(gbRamSize) { + gbMemoryMap[address >> 12][address & 0x0fff & gbRamSizeMask] = value; + } + } +} + +void memoryUpdateMapMBC5() +{ + SetROMMap((gbDataMBC5.mapperROMBank << 14) | (gbDataMBC5.mapperROMHighAddress << 22)); + SetRAM8K(gbDataMBC5.mapperRAMBank); +} + +mapperMBC7 gbDataMBC7 = { + 1, // ROM bank + 0, // chip select + 0, // ?? + 0, // mapper state + 0, // buffer for receiving serial data + 0, // idle state + 0, // count of bits received + 0, // command received + 0, // address received + 0, // write enable + 0, // value to return on ram +}; + +// MBC7 ROM write registers +void mapperMBC7ROM(uint16 address, uint8 value) +{ + switch(address & 0x6000) { + + case 0x0000: + break; + + case 0x2000: // ROM bank select + value = value & 0x7f; + if(value == 0) + value = 1; + + if(value == gbDataMBC7.mapperROMBank) + break; + + gbDataMBC7.mapperROMBank = value; + SetROMMap(value << 14); + break; + + case 0x4000: // ? + break; + } +} + +// MBC7 read RAM +uint8 mapperMBC7ReadRAM(uint16 address) +{ + switch(address & 0xa0f0) { + case 0xa000: + case 0xa010: + case 0xa060: + case 0xa070: + return 0; + + case 0xa020: + // sensor X low byte + return((gbDataMBC7.curtiltx >> 0) & 0xFF); + + case 0xa030: + // sensor X high byte + return((gbDataMBC7.curtiltx >> 8) & 0xFF); + + case 0xa040: + // sensor Y low byte + return((gbDataMBC7.curtilty >> 0) & 0xFF); + + case 0xa050: + // sensor Y high byte + return((gbDataMBC7.curtilty >> 8) & 0xFF); + + case 0xa080: + return gbDataMBC7.value; + } + return 0xff; +} + +// MBC7 RAM write +void mapperMBC7RAM(uint16 address, uint8 value) +{ + if(address == 0xa080) { + // special processing needed + int oldCs = gbDataMBC7.cs,oldSk=gbDataMBC7.sk; + + gbDataMBC7.cs=value>>7; + gbDataMBC7.sk=(value>>6)&1; + + if(!oldCs && gbDataMBC7.cs) { + if(gbDataMBC7.state==5) { + if(gbDataMBC7.writeEnable) { + gbRam[gbDataMBC7.address*2]=gbDataMBC7.buffer>>8; + gbRam[gbDataMBC7.address*2+1]=gbDataMBC7.buffer&0xff; + } + gbDataMBC7.state=0; + gbDataMBC7.value=1; + } else { + gbDataMBC7.idle=true; + gbDataMBC7.state=0; + } + } + + if(!oldSk && gbDataMBC7.sk) { + if(gbDataMBC7.idle) { + if(value & 0x02) { + gbDataMBC7.idle=false; + gbDataMBC7.count=0; + gbDataMBC7.state=1; + } + } else { + switch(gbDataMBC7.state) { + case 1: + // receiving command + gbDataMBC7.buffer <<= 1; + gbDataMBC7.buffer |= (value & 0x02)?1:0; + gbDataMBC7.count++; + if(gbDataMBC7.count==2) { + // finished receiving command + gbDataMBC7.state=2; + gbDataMBC7.count=0; + gbDataMBC7.code=gbDataMBC7.buffer & 3; + } + break; + case 2: + // receive address + gbDataMBC7.buffer <<= 1; + gbDataMBC7.buffer |= (value&0x02)?1:0; + gbDataMBC7.count++; + if(gbDataMBC7.count==8) { + // finish receiving + gbDataMBC7.state=3; + gbDataMBC7.count=0; + gbDataMBC7.address=gbDataMBC7.buffer&0xff; + if(gbDataMBC7.code==0) { + if((gbDataMBC7.address>>6)==0) { + gbDataMBC7.writeEnable=0; + gbDataMBC7.state=0; + } else if((gbDataMBC7.address>>6) == 3) { + gbDataMBC7.writeEnable=1; + gbDataMBC7.state=0; + } + } + } + break; + case 3: + gbDataMBC7.buffer <<= 1; + gbDataMBC7.buffer |= (value&0x02)?1:0; + gbDataMBC7.count++; + + switch(gbDataMBC7.code) { + case 0: + if(gbDataMBC7.count==16) { + if((gbDataMBC7.address>>6)==0) { + gbDataMBC7.writeEnable = 0; + gbDataMBC7.state=0; + } else if((gbDataMBC7.address>>6)==1) { + if (gbDataMBC7.writeEnable) { + for(int i=0;i<256;i++) { + gbRam[i*2] = gbDataMBC7.buffer >> 8; + gbRam[i*2+1] = gbDataMBC7.buffer & 0xff; + } + } + gbDataMBC7.state=5; + } else if((gbDataMBC7.address>>6) == 2) { + if (gbDataMBC7.writeEnable) { + for(int i=0;i<256;i++) + *((uint16 *)&gbRam[i*2]) = 0xffff; + } + gbDataMBC7.state=5; + } else if((gbDataMBC7.address>>6)==3) { + gbDataMBC7.writeEnable = 1; + gbDataMBC7.state=0; + } + gbDataMBC7.count=0; + } + break; + case 1: + if(gbDataMBC7.count==16) { + gbDataMBC7.count=0; + gbDataMBC7.state=5; + gbDataMBC7.value=0; + } + break; + case 2: + if(gbDataMBC7.count==1) { + gbDataMBC7.state=4; + gbDataMBC7.count=0; + gbDataMBC7.buffer = (gbRam[gbDataMBC7.address*2]<<8)| + (gbRam[gbDataMBC7.address*2+1]); + } + break; + case 3: + if(gbDataMBC7.count==16) { + gbDataMBC7.count=0; + gbDataMBC7.state=5; + gbDataMBC7.value=0; + gbDataMBC7.buffer=0xffff; + } + break; + } + break; + } + } + } + + if (oldSk && !gbDataMBC7.sk) { + if (gbDataMBC7.state==4) { + gbDataMBC7.value = (gbDataMBC7.buffer & 0x8000)?1:0; + gbDataMBC7.buffer <<= 1; + gbDataMBC7.count++; + if (gbDataMBC7.count==16) { + gbDataMBC7.count=0; + gbDataMBC7.state=0; + } + } + } + } +} + +void memoryUpdateMapMBC7() +{ + SetROMMap(gbDataMBC7.mapperROMBank << 14); +} + +mapperHuC1 gbDataHuC1 = { + 0, // RAM enable + 1, // ROM bank + 0, // RAM bank + 0, // memory model + 0, // ROM high address +}; + +// HuC1 ROM write registers +void mapperHuC1ROM(uint16 address, uint8 value) +{ + int tmpAddress = 0; + + switch(address & 0x6000) { + case 0x0000: // RAM enable register + gbDataHuC1.mapperRAMEnable = ( ( value & 0x0a) == 0x0a ? 1 : 0); + break; + + case 0x2000: // ROM bank select + value = value & 0x3f; + if(value == 0) + value = 1; + if(value == gbDataHuC1.mapperROMBank) + break; + + SetROMMap(value << 14); + gbDataHuC1.mapperROMBank = value; + break; + + case 0x4000: // RAM bank select + if(gbDataHuC1.mapperMemoryModel == 1) { + // 4/32 model, RAM bank switching provided + value = value & 0x03; + if(value == gbDataHuC1.mapperRAMBank) + break; + + SetRAM8K(value); + gbDataHuC1.mapperRAMBank = value; + } else { + // 16/8, set the high address + gbDataHuC1.mapperROMHighAddress = value & 0x03; + tmpAddress = gbDataHuC1.mapperROMBank << 14; + tmpAddress |= (gbDataHuC1.mapperROMHighAddress) << 19; + SetROMMap(tmpAddress); + } + break; + + case 0x6000: // memory model select + gbDataHuC1.mapperMemoryModel = value & 1; + break; + } +} + +// HuC1 RAM write +void mapperHuC1RAM(uint16 address, uint8 value) +{ + if(gbDataHuC1.mapperRAMEnable) { + if(gbRamSize) { + gbMemoryMap[address >> 12][address & 0x0fff] = value; + } + } +} + +void memoryUpdateMapHuC1() +{ + SetROMMap(gbDataHuC1.mapperROMBank << 14); + SetRAM8K(gbDataHuC1.mapperRAMBank); +} + +mapperHuC3 gbDataHuC3 = { + 0, // RAM enable + 1, // ROM bank + 0, // RAM bank + 0, // RAM flag + 0 // RAM read value +}; + + +// HuC3 ROM write registers +void mapperHuC3ROM(uint16 address, uint8 value) +{ + switch(address & 0x6000) { + case 0x0000: // RAM enable register + gbDataHuC3.mapperRAMEnable = ( value == 0x0a ? 1 : 0); + gbDataHuC3.mapperRAMFlag = value; + if(gbDataHuC3.mapperRAMFlag != 0x0a) + gbDataHuC3.mapperRAMBank = -1; + break; + + case 0x2000: // ROM bank select + value = value & 0x7f; + if(value == 0) + value = 1; + if(value == gbDataHuC3.mapperROMBank) + break; + + gbDataHuC3.mapperROMBank = value; + SetROMMap(value << 14); + break; + + case 0x4000: // RAM bank select + value = value & 0x03; + if(value == gbDataHuC3.mapperRAMBank) + break; + + gbDataHuC3.mapperRAMBank = value; + SetRAM8K(value); + break; + + case 0x6000: // nothing to do! + break; + } +} + +// HuC3 read RAM +uint8 mapperHuC3ReadRAM(uint16 address) +{ + if(gbDataHuC3.mapperRAMFlag > 0x0b && + gbDataHuC3.mapperRAMFlag < 0x0e) { + if(gbDataHuC3.mapperRAMFlag != 0x0c) + return 1; + return gbDataHuC3.mapperRAMValue; + } else + return gbMemoryMap[address >> 12][address & 0x0fff]; +} + +// HuC3 RAM write +void mapperHuC3RAM(uint16 address, uint8 value) +{ + int *p; + + if(gbDataHuC3.mapperRAMFlag < 0x0b || + gbDataHuC3.mapperRAMFlag > 0x0e) { + if(gbDataHuC3.mapperRAMEnable) { + if(gbRamSize) { + gbMemoryMap[address >> 12][address & 0x0fff] = value; + } + } + } else { + if(gbDataHuC3.mapperRAMFlag == 0x0b) { + if(value == 0x62) { + gbDataHuC3.mapperRAMValue = 1; + } else { + switch(value & 0xf0) { + case 0x10: + p = &gbDataHuC3.mapperRegister2; + gbDataHuC3.mapperRAMValue = *(p+gbDataHuC3.mapperRegister1++); + if(gbDataHuC3.mapperRegister1 > 6) + gbDataHuC3.mapperRegister1 = 0; + break; + case 0x30: + p = &gbDataHuC3.mapperRegister2; + *(p+gbDataHuC3.mapperRegister1++) = value & 0x0f; + if(gbDataHuC3.mapperRegister1 > 6) + gbDataHuC3.mapperRegister1 = 0; + gbDataHuC3.mapperAddress = + (gbDataHuC3.mapperRegister6 << 24) | + (gbDataHuC3.mapperRegister5 << 16) | + (gbDataHuC3.mapperRegister4 << 8) | + (gbDataHuC3.mapperRegister3 << 4) | + (gbDataHuC3.mapperRegister2); + break; + case 0x40: + gbDataHuC3.mapperRegister1 = (gbDataHuC3.mapperRegister1 & 0xf0) | + (value & 0x0f); + gbDataHuC3.mapperRegister2 = (gbDataHuC3.mapperAddress & 0x0f); + gbDataHuC3.mapperRegister3 = ((gbDataHuC3.mapperAddress>>4)&0x0f); + gbDataHuC3.mapperRegister4 = ((gbDataHuC3.mapperAddress>>8)&0x0f); + gbDataHuC3.mapperRegister5 = ((gbDataHuC3.mapperAddress>>16)&0x0f); + gbDataHuC3.mapperRegister6 = ((gbDataHuC3.mapperAddress>>24)&0x0f); + gbDataHuC3.mapperRegister7 = 0; + gbDataHuC3.mapperRegister8 = 0; + gbDataHuC3.mapperRAMValue = 0; + break; + case 0x50: + gbDataHuC3.mapperRegister1 = (gbDataHuC3.mapperRegister1 & 0x0f) | + ((value << 4)&0x0f); + break; + default: + gbDataHuC3.mapperRAMValue = 1; + break; + } + } + } + } +} + +void memoryUpdateMapHuC3() +{ + SetROMMap(gbDataHuC3.mapperROMBank << 14); + SetRAM8K(gbDataHuC3.mapperRAMBank); +} + +} diff --git a/Mednafen/mednafen/gb/memory.h b/Mednafen/mednafen/gb/memory.h new file mode 100644 index 0000000000..a21f25a24f --- /dev/null +++ b/Mednafen/mednafen/gb/memory.h @@ -0,0 +1,144 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include + +namespace MDFN_IEN_GB +{ + +struct mapperMBC1 { + int mapperRAMEnable; + int mapperROMBank; + int mapperRAMBank; + int mapperMemoryModel; +}; + +struct mapperMBC2 { + int mapperRAMEnable; + int mapperROMBank; +}; + +struct mapperMBC3 { + int mapperRAMEnable; + int mapperROMBank; + int mapperRAMBank; + int mapperClockLatch; + int mapperClockRegister; + int mapperSeconds; + int mapperMinutes; + int mapperHours; + int mapperDays; + int mapperControl; + int mapperLSeconds; + int mapperLMinutes; + int mapperLHours; + int mapperLDays; + int mapperLControl; + uint64 mapperLastTime; +}; + +struct mapperMBC5 { + int mapperRAMEnable; + int mapperROMBank; + int mapperRAMBank; + int mapperROMHighAddress; + int isRumbleCartridge; +}; + +struct mapperMBC7 { + int mapperROMBank; + int cs; + int sk; + int state; + int buffer; + int idle; + int count; + int code; + uint8 address; + int writeEnable; + int value; + int curtiltx; + int curtilty; +}; + +struct mapperHuC1 { + int mapperRAMEnable; + int mapperROMBank; + int mapperRAMBank; + int mapperMemoryModel; + int mapperROMHighAddress; +}; + +struct mapperHuC3 { + int mapperRAMEnable; + int mapperROMBank; + int mapperRAMBank; + int mapperAddress; + int mapperRAMFlag; + int mapperRAMValue; + int mapperRegister1; + int mapperRegister2; + int mapperRegister3; + int mapperRegister4; + int mapperRegister5; + int mapperRegister6; + int mapperRegister7; + int mapperRegister8; +}; + +extern mapperMBC1 gbDataMBC1; +extern mapperMBC2 gbDataMBC2; +extern mapperMBC3 gbDataMBC3; +extern mapperMBC5 gbDataMBC5; +extern mapperMBC7 gbDataMBC7; + +extern mapperHuC1 gbDataHuC1; +extern mapperHuC3 gbDataHuC3; + +void mapperMBC1ROM(uint16,uint8); +void mapperMBC1RAM(uint16,uint8); +void mapperMBC2ROM(uint16,uint8); +void mapperMBC2RAM(uint16,uint8); +void mapperMBC3ROM(uint16,uint8); +void mapperMBC3RAM(uint16,uint8); +uint8 mapperMBC3ReadRAM(uint16); +void mapperMBC5ROM(uint16,uint8); +void mapperMBC5RAM(uint16,uint8); +void mapperMBC7ROM(uint16,uint8); +void mapperMBC7RAM(uint16,uint8); +uint8 mapperMBC7ReadRAM(uint16); +void mapperHuC1ROM(uint16,uint8); +void mapperHuC1RAM(uint16,uint8); +void mapperHuC3ROM(uint16,uint8); +void mapperHuC3RAM(uint16,uint8); +uint8 mapperHuC3ReadRAM(uint16); + +//extern void (*mapper)(uint16,uint8); +//extern void (*mapperRAM)(uint16,uint8); +//extern uint8 (*mapperReadRAM)(uint16); + +extern void memoryUpdateMapMBC1(); +extern void memoryUpdateMapMBC2(); +extern void memoryUpdateMapMBC3(); +extern void memoryUpdateMapMBC5(); +extern void memoryUpdateMapMBC7(); +extern void memoryUpdateMapHuC1(); +extern void memoryUpdateMapHuC3(); + +} diff --git a/Mednafen/mednafen/gb/sound.cpp b/Mednafen/mednafen/gb/sound.cpp new file mode 100644 index 0000000000..1c04635a00 --- /dev/null +++ b/Mednafen/mednafen/gb/sound.cpp @@ -0,0 +1,160 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include + +#include "gb.h" +#include "gbGlobals.h" +#include "sound.h" + +namespace MDFN_IEN_GB +{ + +static Gb_Apu gb_apu; +static Stereo_Buffer *gb_buf = NULL; + +void SOUND_Reset(void) +{ + Gb_Apu::mode_t gbmode = Gb_Apu::mode_cgb; + + if(gbEmulatorType == 4) + gbmode = Gb_Apu::mode_agb; + else if(gbEmulatorType == 3) + gbmode = Gb_Apu::mode_dmg; + else if(gbEmulatorType == 1) + gbmode = Gb_Apu::mode_cgb; + else if(gbEmulatorType == 0) + { + if(gbCgbMode) + gbmode = Gb_Apu::mode_cgb; + else + gbmode = Gb_Apu::mode_dmg; + } + + //printf("%d -- %d\n", (int)gbmode, (int)Gb_Apu::mode_cgb); + gb_apu.reset(gbmode); +} + +uint32 SOUND_Read(int ts, uint32 addr) +{ + uint32 ret; + + ret = gb_apu.read_register(ts*GB_APU_OVERCLOCK, addr); + + return(ret); +} + +void SOUND_Write(int ts, uint32 addr, uint8 val) +{ + //if(addr == 0xFF26) + // printf("%04x %02x\n", addr, val); + gb_apu.write_register(ts * GB_APU_OVERCLOCK, addr, val); +} + +static bool RedoBuffer(uint32 rate) +{ + if(gb_buf) + { + delete gb_buf; + gb_buf = NULL; + } + + gb_apu.set_output(NULL, NULL, NULL); + + if(rate) + { + gb_buf = new Stereo_Buffer(); + + gb_buf->set_sample_rate(rate, 40); + gb_buf->clock_rate((long)(4194304 * GB_APU_OVERCLOCK * 1)); + + gb_apu.set_output(gb_buf->center(), gb_buf->left(), gb_buf->right()); + } + + return(TRUE); +} + +bool MDFNGB_SetSoundRate(uint32 rate) +{ + RedoBuffer(rate); + + return(TRUE); +} + +void SOUND_StateAction(StateMem *sm, int load, int data_only) +{ + gb_apu_state_t gb_state; + + //if(!load) // always save state, in case there is none to load + { + gb_apu.save_state(&gb_state); + } + + SFORMAT StateRegs[] = + { + SFARRAYN((uint8*)&gb_state, sizeof(gb_state), "apu_state"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "APU"); + + if(load) + { + // TODO: set hardware mode to mode_dmg, mode_cgb, or mode_agb + // (latter if you're running classic GB game on Game Boy Advance) + gb_apu.reset(); + gb_apu.load_state(gb_state); + } +} + +void SOUND_Init(void) +{ + gb_apu.volume(0.5); + + RedoBuffer(0); +} + +void SOUND_Kill(void) +{ + if(gb_buf != NULL) + { + delete gb_buf; + gb_buf = NULL; + } +} + +int32 SOUND_Flush(int ts, int16 *SoundBuf, const int32 MaxSoundFrames) +{ + int32 SoundFrames = 0; + + gb_apu.end_frame(ts * GB_APU_OVERCLOCK); + + if(SoundBuf && gb_buf) + { + gb_buf->end_frame(ts * GB_APU_OVERCLOCK); + SoundFrames = gb_buf->read_samples(SoundBuf, MaxSoundFrames * 2) / 2; + } + else if(gb_buf) + exit(1); + + return(SoundFrames); +} + +} diff --git a/Mednafen/mednafen/gb/sound.h b/Mednafen/mednafen/gb/sound.h new file mode 100644 index 0000000000..7f78a29aea --- /dev/null +++ b/Mednafen/mednafen/gb/sound.h @@ -0,0 +1,21 @@ +#ifndef __MDFN_GB_SOUND_H +#define __MDFN_GB_SOUND_H + +namespace MDFN_IEN_GB +{ + +uint32 SOUND_Read(int ts, uint32_t addr); +void SOUND_Write(int ts, uint32 addr, uint8 val); + +int32 SOUND_Flush(int ts, int16 *SoundBuf, const int32 MaxSoundFrames); +void SOUND_Init(void) MDFN_COLD; +void SOUND_Kill(void) MDFN_COLD; +void SOUND_Reset(void) MDFN_COLD; +void SOUND_StateAction(StateMem *sm, int load, int data_only); + +bool MDFNGB_SetSoundRate(uint32 rate); + +} + +#endif + diff --git a/Mednafen/mednafen/gb/z80.cpp b/Mednafen/mednafen/gb/z80.cpp new file mode 100644 index 0000000000..13f680a5e0 --- /dev/null +++ b/Mednafen/mednafen/gb/z80.cpp @@ -0,0 +1,480 @@ +#include +#include + +#include "gb.h" +#include "z80.h" +#include "gbGlobals.h" +#include "memory.h" + +namespace MDFN_IEN_GB +{ + +// GameBoy Z80-clone emulation + +static const uint16 DAATable[] = { + 0x0080,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700, + 0x0800,0x0900,0x1000,0x1100,0x1200,0x1300,0x1400,0x1500, + 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700, + 0x1800,0x1900,0x2000,0x2100,0x2200,0x2300,0x2400,0x2500, + 0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, + 0x2800,0x2900,0x3000,0x3100,0x3200,0x3300,0x3400,0x3500, + 0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700, + 0x3800,0x3900,0x4000,0x4100,0x4200,0x4300,0x4400,0x4500, + 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700, + 0x4800,0x4900,0x5000,0x5100,0x5200,0x5300,0x5400,0x5500, + 0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700, + 0x5800,0x5900,0x6000,0x6100,0x6200,0x6300,0x6400,0x6500, + 0x6000,0x6100,0x6200,0x6300,0x6400,0x6500,0x6600,0x6700, + 0x6800,0x6900,0x7000,0x7100,0x7200,0x7300,0x7400,0x7500, + 0x7000,0x7100,0x7200,0x7300,0x7400,0x7500,0x7600,0x7700, + 0x7800,0x7900,0x8000,0x8100,0x8200,0x8300,0x8400,0x8500, + 0x8000,0x8100,0x8200,0x8300,0x8400,0x8500,0x8600,0x8700, + 0x8800,0x8900,0x9000,0x9100,0x9200,0x9300,0x9400,0x9500, + 0x9000,0x9100,0x9200,0x9300,0x9400,0x9500,0x9600,0x9700, + 0x9800,0x9900,0x0090,0x0110,0x0210,0x0310,0x0410,0x0510, + 0x0090,0x0110,0x0210,0x0310,0x0410,0x0510,0x0610,0x0710, + 0x0810,0x0910,0x1010,0x1110,0x1210,0x1310,0x1410,0x1510, + 0x1010,0x1110,0x1210,0x1310,0x1410,0x1510,0x1610,0x1710, + 0x1810,0x1910,0x2010,0x2110,0x2210,0x2310,0x2410,0x2510, + 0x2010,0x2110,0x2210,0x2310,0x2410,0x2510,0x2610,0x2710, + 0x2810,0x2910,0x3010,0x3110,0x3210,0x3310,0x3410,0x3510, + 0x3010,0x3110,0x3210,0x3310,0x3410,0x3510,0x3610,0x3710, + 0x3810,0x3910,0x4010,0x4110,0x4210,0x4310,0x4410,0x4510, + 0x4010,0x4110,0x4210,0x4310,0x4410,0x4510,0x4610,0x4710, + 0x4810,0x4910,0x5010,0x5110,0x5210,0x5310,0x5410,0x5510, + 0x5010,0x5110,0x5210,0x5310,0x5410,0x5510,0x5610,0x5710, + 0x5810,0x5910,0x6010,0x6110,0x6210,0x6310,0x6410,0x6510, + 0x6010,0x6110,0x6210,0x6310,0x6410,0x6510,0x6610,0x6710, + 0x6810,0x6910,0x7010,0x7110,0x7210,0x7310,0x7410,0x7510, + 0x7010,0x7110,0x7210,0x7310,0x7410,0x7510,0x7610,0x7710, + 0x7810,0x7910,0x8010,0x8110,0x8210,0x8310,0x8410,0x8510, + 0x8010,0x8110,0x8210,0x8310,0x8410,0x8510,0x8610,0x8710, + 0x8810,0x8910,0x9010,0x9110,0x9210,0x9310,0x9410,0x9510, + 0x9010,0x9110,0x9210,0x9310,0x9410,0x9510,0x9610,0x9710, + 0x9810,0x9910,0xA010,0xA110,0xA210,0xA310,0xA410,0xA510, + 0xA010,0xA110,0xA210,0xA310,0xA410,0xA510,0xA610,0xA710, + 0xA810,0xA910,0xB010,0xB110,0xB210,0xB310,0xB410,0xB510, + 0xB010,0xB110,0xB210,0xB310,0xB410,0xB510,0xB610,0xB710, + 0xB810,0xB910,0xC010,0xC110,0xC210,0xC310,0xC410,0xC510, + 0xC010,0xC110,0xC210,0xC310,0xC410,0xC510,0xC610,0xC710, + 0xC810,0xC910,0xD010,0xD110,0xD210,0xD310,0xD410,0xD510, + 0xD010,0xD110,0xD210,0xD310,0xD410,0xD510,0xD610,0xD710, + 0xD810,0xD910,0xE010,0xE110,0xE210,0xE310,0xE410,0xE510, + 0xE010,0xE110,0xE210,0xE310,0xE410,0xE510,0xE610,0xE710, + 0xE810,0xE910,0xF010,0xF110,0xF210,0xF310,0xF410,0xF510, + 0xF010,0xF110,0xF210,0xF310,0xF410,0xF510,0xF610,0xF710, + 0xF810,0xF910,0x0090,0x0110,0x0210,0x0310,0x0410,0x0510, + 0x0090,0x0110,0x0210,0x0310,0x0410,0x0510,0x0610,0x0710, + 0x0810,0x0910,0x1010,0x1110,0x1210,0x1310,0x1410,0x1510, + 0x1010,0x1110,0x1210,0x1310,0x1410,0x1510,0x1610,0x1710, + 0x1810,0x1910,0x2010,0x2110,0x2210,0x2310,0x2410,0x2510, + 0x2010,0x2110,0x2210,0x2310,0x2410,0x2510,0x2610,0x2710, + 0x2810,0x2910,0x3010,0x3110,0x3210,0x3310,0x3410,0x3510, + 0x3010,0x3110,0x3210,0x3310,0x3410,0x3510,0x3610,0x3710, + 0x3810,0x3910,0x4010,0x4110,0x4210,0x4310,0x4410,0x4510, + 0x4010,0x4110,0x4210,0x4310,0x4410,0x4510,0x4610,0x4710, + 0x4810,0x4910,0x5010,0x5110,0x5210,0x5310,0x5410,0x5510, + 0x5010,0x5110,0x5210,0x5310,0x5410,0x5510,0x5610,0x5710, + 0x5810,0x5910,0x6010,0x6110,0x6210,0x6310,0x6410,0x6510, + 0x0600,0x0700,0x0800,0x0900,0x0A00,0x0B00,0x0C00,0x0D00, + 0x0E00,0x0F00,0x1000,0x1100,0x1200,0x1300,0x1400,0x1500, + 0x1600,0x1700,0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00, + 0x1E00,0x1F00,0x2000,0x2100,0x2200,0x2300,0x2400,0x2500, + 0x2600,0x2700,0x2800,0x2900,0x2A00,0x2B00,0x2C00,0x2D00, + 0x2E00,0x2F00,0x3000,0x3100,0x3200,0x3300,0x3400,0x3500, + 0x3600,0x3700,0x3800,0x3900,0x3A00,0x3B00,0x3C00,0x3D00, + 0x3E00,0x3F00,0x4000,0x4100,0x4200,0x4300,0x4400,0x4500, + 0x4600,0x4700,0x4800,0x4900,0x4A00,0x4B00,0x4C00,0x4D00, + 0x4E00,0x4F00,0x5000,0x5100,0x5200,0x5300,0x5400,0x5500, + 0x5600,0x5700,0x5800,0x5900,0x5A00,0x5B00,0x5C00,0x5D00, + 0x5E00,0x5F00,0x6000,0x6100,0x6200,0x6300,0x6400,0x6500, + 0x6600,0x6700,0x6800,0x6900,0x6A00,0x6B00,0x6C00,0x6D00, + 0x6E00,0x6F00,0x7000,0x7100,0x7200,0x7300,0x7400,0x7500, + 0x7600,0x7700,0x7800,0x7900,0x7A00,0x7B00,0x7C00,0x7D00, + 0x7E00,0x7F00,0x8000,0x8100,0x8200,0x8300,0x8400,0x8500, + 0x8600,0x8700,0x8800,0x8900,0x8A00,0x8B00,0x8C00,0x8D00, + 0x8E00,0x8F00,0x9000,0x9100,0x9200,0x9300,0x9400,0x9500, + 0x9600,0x9700,0x9800,0x9900,0x9A00,0x9B00,0x9C00,0x9D00, + 0x9E00,0x9F00,0x0090,0x0110,0x0210,0x0310,0x0410,0x0510, + 0x0610,0x0710,0x0810,0x0910,0x0A10,0x0B10,0x0C10,0x0D10, + 0x0E10,0x0F10,0x1010,0x1110,0x1210,0x1310,0x1410,0x1510, + 0x1610,0x1710,0x1810,0x1910,0x1A10,0x1B10,0x1C10,0x1D10, + 0x1E10,0x1F10,0x2010,0x2110,0x2210,0x2310,0x2410,0x2510, + 0x2610,0x2710,0x2810,0x2910,0x2A10,0x2B10,0x2C10,0x2D10, + 0x2E10,0x2F10,0x3010,0x3110,0x3210,0x3310,0x3410,0x3510, + 0x3610,0x3710,0x3810,0x3910,0x3A10,0x3B10,0x3C10,0x3D10, + 0x3E10,0x3F10,0x4010,0x4110,0x4210,0x4310,0x4410,0x4510, + 0x4610,0x4710,0x4810,0x4910,0x4A10,0x4B10,0x4C10,0x4D10, + 0x4E10,0x4F10,0x5010,0x5110,0x5210,0x5310,0x5410,0x5510, + 0x5610,0x5710,0x5810,0x5910,0x5A10,0x5B10,0x5C10,0x5D10, + 0x5E10,0x5F10,0x6010,0x6110,0x6210,0x6310,0x6410,0x6510, + 0x6610,0x6710,0x6810,0x6910,0x6A10,0x6B10,0x6C10,0x6D10, + 0x6E10,0x6F10,0x7010,0x7110,0x7210,0x7310,0x7410,0x7510, + 0x7610,0x7710,0x7810,0x7910,0x7A10,0x7B10,0x7C10,0x7D10, + 0x7E10,0x7F10,0x8010,0x8110,0x8210,0x8310,0x8410,0x8510, + 0x8610,0x8710,0x8810,0x8910,0x8A10,0x8B10,0x8C10,0x8D10, + 0x8E10,0x8F10,0x9010,0x9110,0x9210,0x9310,0x9410,0x9510, + 0x9610,0x9710,0x9810,0x9910,0x9A10,0x9B10,0x9C10,0x9D10, + 0x9E10,0x9F10,0xA010,0xA110,0xA210,0xA310,0xA410,0xA510, + 0xA610,0xA710,0xA810,0xA910,0xAA10,0xAB10,0xAC10,0xAD10, + 0xAE10,0xAF10,0xB010,0xB110,0xB210,0xB310,0xB410,0xB510, + 0xB610,0xB710,0xB810,0xB910,0xBA10,0xBB10,0xBC10,0xBD10, + 0xBE10,0xBF10,0xC010,0xC110,0xC210,0xC310,0xC410,0xC510, + 0xC610,0xC710,0xC810,0xC910,0xCA10,0xCB10,0xCC10,0xCD10, + 0xCE10,0xCF10,0xD010,0xD110,0xD210,0xD310,0xD410,0xD510, + 0xD610,0xD710,0xD810,0xD910,0xDA10,0xDB10,0xDC10,0xDD10, + 0xDE10,0xDF10,0xE010,0xE110,0xE210,0xE310,0xE410,0xE510, + 0xE610,0xE710,0xE810,0xE910,0xEA10,0xEB10,0xEC10,0xED10, + 0xEE10,0xEF10,0xF010,0xF110,0xF210,0xF310,0xF410,0xF510, + 0xF610,0xF710,0xF810,0xF910,0xFA10,0xFB10,0xFC10,0xFD10, + 0xFE10,0xFF10,0x0090,0x0110,0x0210,0x0310,0x0410,0x0510, + 0x0610,0x0710,0x0810,0x0910,0x0A10,0x0B10,0x0C10,0x0D10, + 0x0E10,0x0F10,0x1010,0x1110,0x1210,0x1310,0x1410,0x1510, + 0x1610,0x1710,0x1810,0x1910,0x1A10,0x1B10,0x1C10,0x1D10, + 0x1E10,0x1F10,0x2010,0x2110,0x2210,0x2310,0x2410,0x2510, + 0x2610,0x2710,0x2810,0x2910,0x2A10,0x2B10,0x2C10,0x2D10, + 0x2E10,0x2F10,0x3010,0x3110,0x3210,0x3310,0x3410,0x3510, + 0x3610,0x3710,0x3810,0x3910,0x3A10,0x3B10,0x3C10,0x3D10, + 0x3E10,0x3F10,0x4010,0x4110,0x4210,0x4310,0x4410,0x4510, + 0x4610,0x4710,0x4810,0x4910,0x4A10,0x4B10,0x4C10,0x4D10, + 0x4E10,0x4F10,0x5010,0x5110,0x5210,0x5310,0x5410,0x5510, + 0x5610,0x5710,0x5810,0x5910,0x5A10,0x5B10,0x5C10,0x5D10, + 0x5E10,0x5F10,0x6010,0x6110,0x6210,0x6310,0x6410,0x6510, + 0x00C0,0x0140,0x0240,0x0340,0x0440,0x0540,0x0640,0x0740, + 0x0840,0x0940,0x0A40,0x0B40,0x0C40,0x0D40,0x0E40,0x0F40, + 0x1040,0x1140,0x1240,0x1340,0x1440,0x1540,0x1640,0x1740, + 0x1840,0x1940,0x1A40,0x1B40,0x1C40,0x1D40,0x1E40,0x1F40, + 0x2040,0x2140,0x2240,0x2340,0x2440,0x2540,0x2640,0x2740, + 0x2840,0x2940,0x2A40,0x2B40,0x2C40,0x2D40,0x2E40,0x2F40, + 0x3040,0x3140,0x3240,0x3340,0x3440,0x3540,0x3640,0x3740, + 0x3840,0x3940,0x3A40,0x3B40,0x3C40,0x3D40,0x3E40,0x3F40, + 0x4040,0x4140,0x4240,0x4340,0x4440,0x4540,0x4640,0x4740, + 0x4840,0x4940,0x4A40,0x4B40,0x4C40,0x4D40,0x4E40,0x4F40, + 0x5040,0x5140,0x5240,0x5340,0x5440,0x5540,0x5640,0x5740, + 0x5840,0x5940,0x5A40,0x5B40,0x5C40,0x5D40,0x5E40,0x5F40, + 0x6040,0x6140,0x6240,0x6340,0x6440,0x6540,0x6640,0x6740, + 0x6840,0x6940,0x6A40,0x6B40,0x6C40,0x6D40,0x6E40,0x6F40, + 0x7040,0x7140,0x7240,0x7340,0x7440,0x7540,0x7640,0x7740, + 0x7840,0x7940,0x7A40,0x7B40,0x7C40,0x7D40,0x7E40,0x7F40, + 0x8040,0x8140,0x8240,0x8340,0x8440,0x8540,0x8640,0x8740, + 0x8840,0x8940,0x8A40,0x8B40,0x8C40,0x8D40,0x8E40,0x8F40, + 0x9040,0x9140,0x9240,0x9340,0x9440,0x9540,0x9640,0x9740, + 0x9840,0x9940,0x9A40,0x9B40,0x9C40,0x9D40,0x9E40,0x9F40, + 0xA040,0xA140,0xA240,0xA340,0xA440,0xA540,0xA640,0xA740, + 0xA840,0xA940,0xAA40,0xAB40,0xAC40,0xAD40,0xAE40,0xAF40, + 0xB040,0xB140,0xB240,0xB340,0xB440,0xB540,0xB640,0xB740, + 0xB840,0xB940,0xBA40,0xBB40,0xBC40,0xBD40,0xBE40,0xBF40, + 0xC040,0xC140,0xC240,0xC340,0xC440,0xC540,0xC640,0xC740, + 0xC840,0xC940,0xCA40,0xCB40,0xCC40,0xCD40,0xCE40,0xCF40, + 0xD040,0xD140,0xD240,0xD340,0xD440,0xD540,0xD640,0xD740, + 0xD840,0xD940,0xDA40,0xDB40,0xDC40,0xDD40,0xDE40,0xDF40, + 0xE040,0xE140,0xE240,0xE340,0xE440,0xE540,0xE640,0xE740, + 0xE840,0xE940,0xEA40,0xEB40,0xEC40,0xED40,0xEE40,0xEF40, + 0xF040,0xF140,0xF240,0xF340,0xF440,0xF540,0xF640,0xF740, + 0xF840,0xF940,0xFA40,0xFB40,0xFC40,0xFD40,0xFE40,0xFF40, + 0xA050,0xA150,0xA250,0xA350,0xA450,0xA550,0xA650,0xA750, + 0xA850,0xA950,0xAA50,0xAB50,0xAC50,0xAD50,0xAE50,0xAF50, + 0xB050,0xB150,0xB250,0xB350,0xB450,0xB550,0xB650,0xB750, + 0xB850,0xB950,0xBA50,0xBB50,0xBC50,0xBD50,0xBE50,0xBF50, + 0xC050,0xC150,0xC250,0xC350,0xC450,0xC550,0xC650,0xC750, + 0xC850,0xC950,0xCA50,0xCB50,0xCC50,0xCD50,0xCE50,0xCF50, + 0xD050,0xD150,0xD250,0xD350,0xD450,0xD550,0xD650,0xD750, + 0xD850,0xD950,0xDA50,0xDB50,0xDC50,0xDD50,0xDE50,0xDF50, + 0xE050,0xE150,0xE250,0xE350,0xE450,0xE550,0xE650,0xE750, + 0xE850,0xE950,0xEA50,0xEB50,0xEC50,0xED50,0xEE50,0xEF50, + 0xF050,0xF150,0xF250,0xF350,0xF450,0xF550,0xF650,0xF750, + 0xF850,0xF950,0xFA50,0xFB50,0xFC50,0xFD50,0xFE50,0xFF50, + 0x00D0,0x0150,0x0250,0x0350,0x0450,0x0550,0x0650,0x0750, + 0x0850,0x0950,0x0A50,0x0B50,0x0C50,0x0D50,0x0E50,0x0F50, + 0x1050,0x1150,0x1250,0x1350,0x1450,0x1550,0x1650,0x1750, + 0x1850,0x1950,0x1A50,0x1B50,0x1C50,0x1D50,0x1E50,0x1F50, + 0x2050,0x2150,0x2250,0x2350,0x2450,0x2550,0x2650,0x2750, + 0x2850,0x2950,0x2A50,0x2B50,0x2C50,0x2D50,0x2E50,0x2F50, + 0x3050,0x3150,0x3250,0x3350,0x3450,0x3550,0x3650,0x3750, + 0x3850,0x3950,0x3A50,0x3B50,0x3C50,0x3D50,0x3E50,0x3F50, + 0x4050,0x4150,0x4250,0x4350,0x4450,0x4550,0x4650,0x4750, + 0x4850,0x4950,0x4A50,0x4B50,0x4C50,0x4D50,0x4E50,0x4F50, + 0x5050,0x5150,0x5250,0x5350,0x5450,0x5550,0x5650,0x5750, + 0x5850,0x5950,0x5A50,0x5B50,0x5C50,0x5D50,0x5E50,0x5F50, + 0x6050,0x6150,0x6250,0x6350,0x6450,0x6550,0x6650,0x6750, + 0x6850,0x6950,0x6A50,0x6B50,0x6C50,0x6D50,0x6E50,0x6F50, + 0x7050,0x7150,0x7250,0x7350,0x7450,0x7550,0x7650,0x7750, + 0x7850,0x7950,0x7A50,0x7B50,0x7C50,0x7D50,0x7E50,0x7F50, + 0x8050,0x8150,0x8250,0x8350,0x8450,0x8550,0x8650,0x8750, + 0x8850,0x8950,0x8A50,0x8B50,0x8C50,0x8D50,0x8E50,0x8F50, + 0x9050,0x9150,0x9250,0x9350,0x9450,0x9550,0x9650,0x9750, + 0x9850,0x9950,0x9A50,0x9B50,0x9C50,0x9D50,0x9E50,0x9F50, + 0xFA40,0xFB40,0xFC40,0xFD40,0xFE40,0xFF40,0x00C0,0x0140, + 0x0240,0x0340,0x0440,0x0540,0x0640,0x0740,0x0840,0x0940, + 0x0A40,0x0B40,0x0C40,0x0D40,0x0E40,0x0F40,0x1040,0x1140, + 0x1240,0x1340,0x1440,0x1540,0x1640,0x1740,0x1840,0x1940, + 0x1A40,0x1B40,0x1C40,0x1D40,0x1E40,0x1F40,0x2040,0x2140, + 0x2240,0x2340,0x2440,0x2540,0x2640,0x2740,0x2840,0x2940, + 0x2A40,0x2B40,0x2C40,0x2D40,0x2E40,0x2F40,0x3040,0x3140, + 0x3240,0x3340,0x3440,0x3540,0x3640,0x3740,0x3840,0x3940, + 0x3A40,0x3B40,0x3C40,0x3D40,0x3E40,0x3F40,0x4040,0x4140, + 0x4240,0x4340,0x4440,0x4540,0x4640,0x4740,0x4840,0x4940, + 0x4A40,0x4B40,0x4C40,0x4D40,0x4E40,0x4F40,0x5040,0x5140, + 0x5240,0x5340,0x5440,0x5540,0x5640,0x5740,0x5840,0x5940, + 0x5A40,0x5B40,0x5C40,0x5D40,0x5E40,0x5F40,0x6040,0x6140, + 0x6240,0x6340,0x6440,0x6540,0x6640,0x6740,0x6840,0x6940, + 0x6A40,0x6B40,0x6C40,0x6D40,0x6E40,0x6F40,0x7040,0x7140, + 0x7240,0x7340,0x7440,0x7540,0x7640,0x7740,0x7840,0x7940, + 0x7A40,0x7B40,0x7C40,0x7D40,0x7E40,0x7F40,0x8040,0x8140, + 0x8240,0x8340,0x8440,0x8540,0x8640,0x8740,0x8840,0x8940, + 0x8A40,0x8B40,0x8C40,0x8D40,0x8E40,0x8F40,0x9040,0x9140, + 0x9240,0x9340,0x9440,0x9540,0x9640,0x9740,0x9840,0x9940, + 0x9A40,0x9B40,0x9C40,0x9D40,0x9E40,0x9F40,0xA040,0xA140, + 0xA240,0xA340,0xA440,0xA540,0xA640,0xA740,0xA840,0xA940, + 0xAA40,0xAB40,0xAC40,0xAD40,0xAE40,0xAF40,0xB040,0xB140, + 0xB240,0xB340,0xB440,0xB540,0xB640,0xB740,0xB840,0xB940, + 0xBA40,0xBB40,0xBC40,0xBD40,0xBE40,0xBF40,0xC040,0xC140, + 0xC240,0xC340,0xC440,0xC540,0xC640,0xC740,0xC840,0xC940, + 0xCA40,0xCB40,0xCC40,0xCD40,0xCE40,0xCF40,0xD040,0xD140, + 0xD240,0xD340,0xD440,0xD540,0xD640,0xD740,0xD840,0xD940, + 0xDA40,0xDB40,0xDC40,0xDD40,0xDE40,0xDF40,0xE040,0xE140, + 0xE240,0xE340,0xE440,0xE540,0xE640,0xE740,0xE840,0xE940, + 0xEA40,0xEB40,0xEC40,0xED40,0xEE40,0xEF40,0xF040,0xF140, + 0xF240,0xF340,0xF440,0xF540,0xF640,0xF740,0xF840,0xF940, + 0x9A50,0x9B50,0x9C50,0x9D50,0x9E50,0x9F50,0xA050,0xA150, + 0xA250,0xA350,0xA450,0xA550,0xA650,0xA750,0xA850,0xA950, + 0xAA50,0xAB50,0xAC50,0xAD50,0xAE50,0xAF50,0xB050,0xB150, + 0xB250,0xB350,0xB450,0xB550,0xB650,0xB750,0xB850,0xB950, + 0xBA50,0xBB50,0xBC50,0xBD50,0xBE50,0xBF50,0xC050,0xC150, + 0xC250,0xC350,0xC450,0xC550,0xC650,0xC750,0xC850,0xC950, + 0xCA50,0xCB50,0xCC50,0xCD50,0xCE50,0xCF50,0xD050,0xD150, + 0xD250,0xD350,0xD450,0xD550,0xD650,0xD750,0xD850,0xD950, + 0xDA50,0xDB50,0xDC50,0xDD50,0xDE50,0xDF50,0xE050,0xE150, + 0xE250,0xE350,0xE450,0xE550,0xE650,0xE750,0xE850,0xE950, + 0xEA50,0xEB50,0xEC50,0xED50,0xEE50,0xEF50,0xF050,0xF150, + 0xF250,0xF350,0xF450,0xF550,0xF650,0xF750,0xF850,0xF950, + 0xFA50,0xFB50,0xFC50,0xFD50,0xFE50,0xFF50,0x00D0,0x0150, + 0x0250,0x0350,0x0450,0x0550,0x0650,0x0750,0x0850,0x0950, + 0x0A50,0x0B50,0x0C50,0x0D50,0x0E50,0x0F50,0x1050,0x1150, + 0x1250,0x1350,0x1450,0x1550,0x1650,0x1750,0x1850,0x1950, + 0x1A50,0x1B50,0x1C50,0x1D50,0x1E50,0x1F50,0x2050,0x2150, + 0x2250,0x2350,0x2450,0x2550,0x2650,0x2750,0x2850,0x2950, + 0x2A50,0x2B50,0x2C50,0x2D50,0x2E50,0x2F50,0x3050,0x3150, + 0x3250,0x3350,0x3450,0x3550,0x3650,0x3750,0x3850,0x3950, + 0x3A50,0x3B50,0x3C50,0x3D50,0x3E50,0x3F50,0x4050,0x4150, + 0x4250,0x4350,0x4450,0x4550,0x4650,0x4750,0x4850,0x4950, + 0x4A50,0x4B50,0x4C50,0x4D50,0x4E50,0x4F50,0x5050,0x5150, + 0x5250,0x5350,0x5450,0x5550,0x5650,0x5750,0x5850,0x5950, + 0x5A50,0x5B50,0x5C50,0x5D50,0x5E50,0x5F50,0x6050,0x6150, + 0x6250,0x6350,0x6450,0x6550,0x6650,0x6750,0x6850,0x6950, + 0x6A50,0x6B50,0x6C50,0x6D50,0x6E50,0x6F50,0x7050,0x7150, + 0x7250,0x7350,0x7450,0x7550,0x7650,0x7750,0x7850,0x7950, + 0x7A50,0x7B50,0x7C50,0x7D50,0x7E50,0x7F50,0x8050,0x8150, + 0x8250,0x8350,0x8450,0x8550,0x8650,0x8750,0x8850,0x8950, + 0x8A50,0x8B50,0x8C50,0x8D50,0x8E50,0x8F50,0x9050,0x9150, + 0x9250,0x9350,0x9450,0x9550,0x9650,0x9750,0x9850,0x9950, +}; + +static const int gbCycles[] = { +// 0 1 2 3 4 5 6 7 8 9 a b c d e f + 1, 3, 2, 2, 1, 1, 2, 1, 5, 2, 2, 2, 1, 1, 2, 1, // 0 + 1, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, // 1 + 2, 3, 2, 2, 1, 1, 2, 1, 2, 2, 2, 2, 1, 1, 2, 1, // 2 + 2, 3, 2, 2, 3, 3, 3, 1, 2, 2, 2, 2, 1, 1, 2, 1, // 3 + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // 4 + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // 5 + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // 6 + 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, // 7 + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // 8 + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // 9 + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // a + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, // b + 2, 3, 3, 4, 3, 4, 2, 4, 2, 4, 3, 2, 3, 6, 2, 4, // c + 2, 3, 3, 0, 3, 4, 2, 4, 2, 4, 3, 0, 3, 0, 2, 4, // d + 3, 3, 2, 0, 0, 4, 2, 4, 4, 1, 4, 0, 0, 0, 2, 4, // e + 3, 3, 2, 1, 0, 4, 2, 4, 3, 2, 4, 1, 0, 0, 2, 4 // f +}; + +static const int gbCyclesCB[] = { +// 0 1 2 3 4 5 6 7 8 9 a b c d e f + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // 0 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // 1 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // 2 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // 3 + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, // 4 + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, // 5 + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, // 6 + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, // 7 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // 8 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // 9 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // a + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // b + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // c + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // d + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, // e + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2 // f +}; + +static const uint8 ZeroTable[256] = { + 0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0 +}; + + + +// registers +static gbRegister PC; +static gbRegister SP; +static gbRegister AF; +static gbRegister BC; +static gbRegister DE; +static gbRegister HL; +static uint8 IFF; +static bool InHALT; +static bool RepeatNextByte; +static bool EI_Delayed; + +void GBZ80_Interrupt(int which) +{ + IFF = FALSE; + EI_Delayed = FALSE; + + register_IF &= ~(1 << which); + + gbWriteMemory(--SP.W, PC.B.B1); + gbWriteMemory(--SP.W, PC.B.B0); + PC.W = 0x40 + (which << 3); +} + +void GBZ80_Reset(void) +{ + SP.W = 0xfffe; + AF.W = 0x01b0; + BC.W = 0x0013; + DE.W = 0x00d8; + HL.W = 0x014d; + PC.W = 0x0100; + IFF = FALSE; + + EI_Delayed = FALSE; + RepeatNextByte = FALSE; + InHALT = FALSE; + + if(gbCgbMode) + { + AF.W = 0x11b0; + BC.W = 0x0000; + DE.W = 0xff56; + HL.W = 0x000d; + if(gbEmulatorType == 4) + BC.B.B1 |= 0x01; + } +} + +// Returns the number of cycles this instruction took +int GBZ80_RunOp(void) +{ + int clockTicks; + uint8 opcode; + gbRegister tempRegister; + uint8 tempValue; + int8 offset; + + + // HALT will be exited even when interrupts are disabled by IFF + if(register_IF & register_IE) + InHALT = FALSE; + + if(IFF) + { + if(register_IF & register_IE & 0x01) + GBZ80_Interrupt(0); + else if(register_IF & register_IE & 0x02) + GBZ80_Interrupt(1); + else if(register_IF & register_IE & 0x04) + GBZ80_Interrupt(2); + else if(register_IF & register_IE & 0x08) + GBZ80_Interrupt(3); + else if(register_IF & register_IE & 0x10) + GBZ80_Interrupt(4); + } + + if(EI_Delayed) + { + IFF = TRUE; + EI_Delayed = FALSE; + } + + if(InHALT) + return(4); + + opcode = gbReadMemory(PC.W++); + + if(RepeatNextByte) + { + RepeatNextByte = FALSE; + PC.W--; + } + + clockTicks = gbCycles[opcode]; + + switch(opcode) + { + case 0xCB: + // extended opcode + opcode = gbReadMemory(PC.W++); + clockTicks = gbCyclesCB[opcode]; + switch(opcode) + { + #include "gbCodesCB.h" + } + break; + + #include "gbCodes.h" + } + + return(clockTicks); +} + +void GBZ80_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PC.W), + SFVAR(SP.W), + SFVAR(AF.W), + SFVAR(BC.W), + SFVAR(DE.W), + SFVAR(HL.W), + SFVAR(IFF), + SFVAR(InHALT), + SFVAR(RepeatNextByte), + SFVAR(EI_Delayed), + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CPU"); + + if(load) + { + + } +} + +} diff --git a/Mednafen/mednafen/gb/z80.h b/Mednafen/mednafen/gb/z80.h new file mode 100644 index 0000000000..eb1e0b0eb5 --- /dev/null +++ b/Mednafen/mednafen/gb/z80.h @@ -0,0 +1,13 @@ +#ifndef __GB_Z80_H +#define __GB_Z80_H + +namespace MDFN_IEN_GB +{ + +int GBZ80_RunOp(void); +void GBZ80_Reset(void); +void GBZ80_Interrupt(int which); +void GBZ80_StateAction(StateMem *sm, int load, int data_only); + +} +#endif diff --git a/Mednafen/mednafen/gba/GBA.cpp b/Mednafen/mednafen/gba/GBA.cpp new file mode 100644 index 0000000000..ccc13f21d1 --- /dev/null +++ b/Mednafen/mednafen/gba/GBA.cpp @@ -0,0 +1,3392 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "GBAinline.h" +#include "Globals.h" +#include "Gfx.h" +#include "eeprom.h" +#include "flash.h" +#include "Sound.h" +#include "sram.h" +#include "bios.h" +#include "Port.h" + +#include "arm.h" +#include "thumb.h" + +#include +#include +#include +#include + +namespace MDFN_IEN_GBA +{ + +class GSFLoader : public PSFLoader +{ + public: + + GSFLoader(Stream *fp) MDFN_COLD; + virtual ~GSFLoader() override MDFN_COLD; + + virtual void HandleEXE(Stream* fp, bool ignore_pcsp = false) override MDFN_COLD; + + PSFTags tags; +}; + +static GSFLoader *gsf_loader = NULL; + +static void CPUInit(const std::string &bios_fn) MDFN_COLD; +static void CPUReset(void) MDFN_COLD; +static void CPUUpdateRender(void); + +#define UPDATE_REG(address, value)\ + {\ + WRITE16LE(((uint16 *)&ioMem[address]),value);\ + }\ + + +RTC *GBA_RTC = NULL; + +int SWITicks = 0; +int IRQTicks = 0; + +int layerEnableDelay = 0; +bool busPrefetch = false; +bool busPrefetchEnable = false; +uint32 busPrefetchCount = 0; +int cpuDmaTicksToUpdate = 0; +int cpuDmaCount = 0; +bool cpuDmaHack = false; +uint32 cpuDmaLast = 0; +int dummyAddress = 0; + +bool cpuBreakLoop = false; +int cpuNextEvent = 0; + +static bool intState = false; +static bool stopState = false; +static bool holdState = false; +static int holdType = 0; + +static bool FlashSizeSet; // Set to TRUE if explicitly set by the user +bool cpuSramEnabled; +bool cpuFlashEnabled; +bool cpuEEPROMEnabled; +bool cpuEEPROMSensorEnabled; + +uint32 cpuPrefetch[2]; + +int cpuTotalTicks = 0; +static int lcdTicks; +uint8 timerOnOffDelay = 0; + +GBATimer timers[4]; + +uint32 dmaSource[4] = {0}; +uint32 dmaDest[4] = {0}; +void (*renderLine)() = mode0RenderLine; +bool fxOn = false; +bool windowOn = false; + +static const int TIMER_TICKS[4] = +{ + 0, + 6, + 8, + 10 +}; + +const uint32 objTilesAddress [3] = {0x010000, 0x014000, 0x014000}; +const uint8 gamepakRamWaitState[4] = { 4, 3, 2, 8 }; +const uint8 gamepakWaitState[4] = { 4, 3, 2, 8 }; +const uint8 gamepakWaitState0[2] = { 2, 1 }; +const uint8 gamepakWaitState1[2] = { 4, 1 }; +const uint8 gamepakWaitState2[2] = { 8, 1 }; +const bool isInRom [16]= + { false, false, false, false, false, false, false, false, + true, true, true, true, true, true, false, false }; + +uint8 memoryWait[16] = + { 0, 0, 2, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0 }; +uint8 memoryWait32[16] = + { 0, 0, 5, 0, 0, 1, 1, 0, 7, 7, 9, 9, 13, 13, 4, 0 }; +uint8 memoryWaitSeq[16] = + { 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 4, 4, 8, 8, 4, 0 }; +uint8 memoryWaitSeq32[16] = + { 0, 0, 5, 0, 0, 1, 1, 0, 5, 5, 9, 9, 17, 17, 4, 0 }; + +// The videoMemoryWait constants are used to add some waitstates +// if the opcode access video memory data outside of vblank/hblank +// It seems to happen on only one ticks for each pixel. +// Not used for now (too problematic with current code). +//const uint8 videoMemoryWait[16] = +// {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + + +uint8 biosProtected[4]; + +static const uint32 myROM[] = +{ + #include "myrom.h" +}; + +union SysCM +{ + uint32 v32[65536]; + uint16 v16[65536]; +}; +static SysCM* systemColorMap = NULL; +static const int romSize = 0x2000000; + +static INLINE int CPUUpdateTicks() +{ + int cpuLoopTicks = lcdTicks; + + if(timers[0].On && (timers[0].Ticks < cpuLoopTicks)) { + cpuLoopTicks = timers[0].Ticks; + } + if(timers[1].On && !(timers[1].CNT & 4) && (timers[1].Ticks < cpuLoopTicks)) { + cpuLoopTicks = timers[1].Ticks; + } + if(timers[2].On && !(timers[2].CNT & 4) && (timers[2].Ticks < cpuLoopTicks)) { + cpuLoopTicks = timers[2].Ticks; + } + if(timers[3].On && !(timers[3].CNT & 4) && (timers[3].Ticks < cpuLoopTicks)) { + cpuLoopTicks = timers[3].Ticks; + } + + if (SWITicks) { + if (SWITicks < cpuLoopTicks) + cpuLoopTicks = SWITicks; + } + + if (IRQTicks) { + if (IRQTicks < cpuLoopTicks) + cpuLoopTicks = IRQTicks; + } + return cpuLoopTicks; +} + +void CPUUpdateWindow0() +{ + int x00 = WIN0H>>8; + int x01 = WIN0H & 255; + + if(x00 <= x01) { + for(int i = 0; i < 240; i++) { + gfxInWin0[i] = (i >= x00 && i < x01); + } + } else { + for(int i = 0; i < 240; i++) { + gfxInWin0[i] = (i >= x00 || i < x01); + } + } +} + +void CPUUpdateWindow1() +{ + int x00 = WIN1H>>8; + int x01 = WIN1H & 255; + + if(x00 <= x01) { + for(int i = 0; i < 240; i++) { + gfxInWin1[i] = (i >= x00 && i < x01); + } + } else { + for(int i = 0; i < 240; i++) { + gfxInWin1[i] = (i >= x00 || i < x01); + } + } +} + +#define CLEAR_ARRAY(a) \ + {\ + uint32 *array = (a);\ + for(int i = 0; i < 240; i++) {\ + *array++ = 0x80000000;\ + }\ + }\ + +void CPUUpdateRenderBuffers(bool force) +{ + if(!(layerEnable & 0x0100) || force) { + CLEAR_ARRAY(line0); + } + if(!(layerEnable & 0x0200) || force) { + CLEAR_ARRAY(line1); + } + if(!(layerEnable & 0x0400) || force) { + CLEAR_ARRAY(line2); + } + if(!(layerEnable & 0x0800) || force) { + CLEAR_ARRAY(line3); + } +} + +static uint16 padbufblah; +static SFORMAT Joy_StateRegs[] = +{ + SFVAR( padbufblah), + SFEND +}; + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + // Type-cast to uint32* so the macro will work(they really are 32-bit elements, just wrapped up in a union) + SFARRAY32N((uint32 *)reg, sizeof(reg) / sizeof(reg_pair), "reg"), + + SFVAR(busPrefetch), + SFVAR(busPrefetchEnable), + SFVAR(busPrefetchCount), + SFVAR(cpuDmaHack), + SFVAR(cpuDmaLast), + SFVAR(cpuDmaTicksToUpdate), + SFVAR(cpuDmaCount), + SFVAR(stopState), + SFVAR(intState), + SFVAR(DISPCNT), + SFVAR(DISPSTAT), + SFVAR(VCOUNT), + SFVAR(BG0CNT), + SFVAR(BG1CNT), + SFVAR(BG2CNT), + SFVAR(BG3CNT), + + + SFARRAY16(BGHOFS, 4), + SFARRAY16(BGVOFS, 4), + + SFVAR(BG2PA), + SFVAR(BG2PB), + SFVAR(BG2PC), + SFVAR(BG2PD), + SFVAR(BG2X_L), + SFVAR(BG2X_H), + SFVAR(BG2Y_L), + SFVAR(BG2Y_H), + + SFVAR(BG3PA), + SFVAR(BG3PB), + SFVAR(BG3PC), + SFVAR(BG3PD), + SFVAR(BG3X_L), + SFVAR(BG3X_H), + SFVAR(BG3Y_L), + SFVAR(BG3Y_H), + SFVAR(WIN0H), + SFVAR(WIN1H), + SFVAR(WIN0V), + SFVAR(WIN1V), + SFVAR(WININ), + SFVAR(WINOUT), + SFVAR(MOSAIC), + SFVAR(BLDMOD), + SFVAR(COLEV), + SFVAR(COLY), + + SFARRAY16(DMSAD_L, 4), + SFARRAY16(DMSAD_H, 4), + SFARRAY16(DMDAD_L, 4), + SFARRAY16(DMDAD_H, 4), + SFARRAY16(DMCNT_L, 4), + SFARRAY16(DMCNT_H, 4), + + SFVAR(timers[0].D), + SFVAR(timers[0].CNT), + SFVAR(timers[1].D), + SFVAR(timers[1].CNT), + SFVAR(timers[2].D), + SFVAR(timers[2].CNT), + SFVAR(timers[3].D), + SFVAR(timers[3].CNT), + + SFVAR(P1), + SFVAR(IE), + SFVAR(IF), + SFVAR(IME), + + SFVAR(holdState), + SFVAR(holdType), + SFVAR(lcdTicks), + + SFVAR(timers[0].On), + SFVAR(timers[0].Ticks), + SFVAR(timers[0].Reload), + SFVAR(timers[0].ClockReload), + + SFVAR(timers[1].On), + SFVAR(timers[1].Ticks), + SFVAR(timers[1].Reload), + SFVAR(timers[1].ClockReload), + + SFVAR(timers[2].On), + SFVAR(timers[2].Ticks), + SFVAR(timers[2].Reload), + SFVAR(timers[2].ClockReload), + + SFVAR(timers[3].On), + SFVAR(timers[3].Ticks), + SFVAR(timers[3].Reload), + SFVAR(timers[3].ClockReload), + + SFARRAY32(dmaSource, 4), + SFARRAY32(dmaDest, 4), + + SFVAR(fxOn), + SFVAR(windowOn), + + SFVAR(N_FLAG), + SFVAR(C_FLAG), + SFVAR(Z_FLAG), + SFVAR(V_FLAG), + SFVAR(armState), + SFVAR(armIrqEnable), + SFVAR(armNextPC), + SFVAR(armMode), + + SFVAR(cpuSramEnabled), + SFVAR(cpuFlashEnabled), + SFVAR(cpuEEPROMEnabled), + SFVAR(cpuEEPROMSensorEnabled), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + SFORMAT RAMState[] = + { + SFARRAY(internalRAM, 0x8000), + SFARRAY(paletteRAM, 0x400), + SFARRAY(workRAM, 0x40000), + SFARRAY(vram, 0x20000), + SFARRAY(oam, 0x400), + SFARRAY(ioMem, 0x400), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, RAMState, "RAM"); + + if(cpuEEPROMEnabled) + EEPROM_StateAction(sm, load, data_only); + + Flash_StateAction(sm, load, data_only); + + if(GBA_RTC) + GBA_RTC->StateAction(sm, load, data_only); + + MDFNSS_StateAction(sm, load, data_only, Joy_StateRegs, "JOY"); + MDFNGBASOUND_StateAction(sm, load, data_only); + + if(load) + { + // set pointers! + layerEnable = layerSettings & DISPCNT; + + CPUUpdateRender(); + CPUUpdateRenderBuffers(true); + CPUUpdateWindow0(); + CPUUpdateWindow1(); + + if(armState) { + ARM_PREFETCH; + } else { + THUMB_PREFETCH; + } + CPUUpdateRegister(0x204, CPUReadHalfWordQuick(0x4000204)); + } +} + +static bool CPUWriteBatteryFile(const std::string& path) MDFN_COLD; +static bool CPUWriteBatteryFile(const std::string& path) +{ + if(cpuSramEnabled || cpuFlashEnabled) + { + if(cpuSramEnabled) + { + if(!MDFN_DumpToFile(path, flashSaveMemory, 0x10000)) + return(0); + } + else if(cpuFlashEnabled) + { + if(!MDFN_DumpToFile(path, flashSaveMemory, flashSize)) + return(0); + } + return(TRUE); + } + return(FALSE); +} + +static void CPUReadBatteryFile(const std::string& path) MDFN_COLD; +static void CPUReadBatteryFile(const std::string& path) +{ + try + { + std::unique_ptr fp = MDFN_AmbigGZOpenHelper(path, std::vector({ 0x10000, 0x20000 })); + uint64 size = fp->size(); + + if(size == 0x20000) + { + fp->read(flashSaveMemory, 0x20000); + if(!FlashSizeSet) + { + flashSetSize(0x20000); + FlashSizeSet = TRUE; + } + } + else if(size == 0x10000) + { + fp->read(flashSaveMemory, 0x10000); + if(!FlashSizeSet) + { + flashSetSize(0x10000); + FlashSizeSet = TRUE; + } + } + else + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu or %llu bytes."), + path.c_str(), (unsigned long long)size, (unsigned long long)0x10000, (unsigned long long)0x20000); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } +} + +static void CPUCleanUp(void) MDFN_COLD; +static void CPUCleanUp(void) +{ + if(rom) + { + delete[] rom; + rom = NULL; + } + + if(vram) + { + delete[] vram; + vram = NULL; + } + + if(paletteRAM) + { + delete[] paletteRAM; + paletteRAM = NULL; + } + + if(internalRAM) + { + delete[] internalRAM; + internalRAM = NULL; + } + + if(workRAM) + { + delete[] workRAM; + workRAM = NULL; + } + + if(bios) + { + delete[] bios; + bios = NULL; + } + + if(oam) + { + delete[] oam; + oam = NULL; + } + + if(ioMem) + { + delete[] ioMem; + ioMem = NULL; + } + + if(systemColorMap) + { + delete systemColorMap; + systemColorMap = NULL; + } + + MDFNGBASOUND_Kill(); + + Flash_Kill(); + + if(GBA_RTC) + { + delete GBA_RTC; + GBA_RTC = NULL; + } +} + +static void CloseGame(void) MDFN_COLD; +static void CloseGame(void) +{ + if(!gsf_loader) + { + EEPROM_SaveFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "eep")); + CPUWriteBatteryFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav")); + } + + // Call CPUCleanUp() to deallocate memory AFTER the backup memory is saved. + CPUCleanUp(); + + if(gsf_loader) + { + delete gsf_loader; + gsf_loader = NULL; + } +} + +GSFLoader::GSFLoader(Stream *fp) +{ + tags = Load(0x22, 1024 * 1024 * 32 + 12, fp); +} + +GSFLoader::~GSFLoader() +{ + +} + +void GSFLoader::HandleEXE(Stream* fp, bool ignore_pcsp) +{ + uint32 entry_point, gsf_offset, copy_size; + uint8 raw_header[12]; + + fp->read(raw_header, sizeof(raw_header)); + entry_point = MDFN_de32lsb(raw_header + 0); + gsf_offset = MDFN_de32lsb(raw_header + 4); + copy_size = MDFN_de32lsb(raw_header + 8); + + (void)entry_point; + //printf("0x%08x\n", entry_point); + + if(gsf_offset >= 0x8000000 && gsf_offset < (0x8000000 + 0x2000000)) // ROM region + { + if((gsf_offset + copy_size - 0x8000000) > 0x2000000) + throw(MDFN_Error(0, "GSF program section offset+size exceeds region bounds.")); + else + fp->read(rom + gsf_offset - 0x8000000, copy_size); + } + else if(gsf_offset >= 0x2000000 && gsf_offset < (0x2000000 + 0x40000)) // Multiboot/RAM region + { + if((gsf_offset + copy_size - 0x2000000) > 0x40000) + throw(MDFN_Error(0, "GSF program section offset+size exceeds region bounds.")); + else + fp->read(workRAM + gsf_offset - 0x2000000, copy_size); + } + else + throw(MDFN_Error(0, "GSF program section offset specifies an unknown/unsupported region.")); +} + +static void RedoColorMap(const MDFN_PixelFormat &format, const uint8* CustomColorMap) MDFN_COLD; +static void RedoColorMap(const MDFN_PixelFormat &format, const uint8* CustomColorMap) +{ + for(int x = 0; x < 65536; x++) + { + int r, g, b; + + if(CustomColorMap) + { + r = CustomColorMap[(x & 0x7FFF) * 3 + 0]; + g = CustomColorMap[(x & 0x7FFF) * 3 + 1]; + b = CustomColorMap[(x & 0x7FFF) * 3 + 2]; + } + else + { + r = (x & 0x1F); + g = ((x & 0x3E0) >> 5); + b = ((x & 0x7C00) >> 10); + + if(format.bpp == 16) + { + r = (r * 255 + 15) / 31; + g = (g * 255 + 15) / 31; + b = (b * 255 + 15) / 31; + } + else + { + r = (r << 3); // | (r >> 2); + g = (g << 3); // | (g >> 2); + b = (b << 3); // | (b >> 2); + } + } + + if(format.bpp == 32) + systemColorMap->v32[x] = format.MakeColor(r, g, b); + else + systemColorMap->v16[x] = format.MakeColor(r, g, b); + } + + #if 0 + for(unsigned i = 0; i < 32; i++) + { + printf("%u %u\n", i, format.MakeColor(0, 0, (i * 255 + 15) / 31)); + } + #endif +} + +static bool TestMagic(MDFNFILE *fp) MDFN_COLD; +static bool TestMagic(MDFNFILE *fp) +{ + if(!strcasecmp(fp->ext, "gba") || !strcasecmp(fp->ext, "agb")) + return true; + + if(PSFLoader::TestMagic(0x22, fp->stream())) + return true; + + fp->rewind(); + + uint8 data[192]; + + if(!strcasecmp(fp->ext, "bin") && fp->read(data, 192, false) == 192) + { + if((data[0xb2] == 0x96 && data[0xb3] == 0x00) || (data[0] == 0x2E && data[3] == 0xEA)) + return true; + } + + return false; +} + +static void Load(MDFNFILE *fp) MDFN_COLD; +static void Load(MDFNFILE *fp) +{ + try + { + layerSettings = 0xFF00; + + rom = new uint8[0x2000000]; + memset(rom, 0xFF, 0x2000000); + + workRAM = new uint8[0x40000]; + memset(workRAM, 0x00, 0x40000); + + if(PSFLoader::TestMagic(0x22, fp->stream())) + { + gsf_loader = new GSFLoader(fp->stream()); + + std::vector SongNames; + + SongNames.push_back(gsf_loader->tags.GetTag("title")); + + Player_Init(1, gsf_loader->tags.GetTag("game"), gsf_loader->tags.GetTag("artist"), gsf_loader->tags.GetTag("copyright"), SongNames); + } + else + { + uint64 size; + uint8 *whereToLoad; + + if(cpuIsMultiBoot) + { + whereToLoad = workRAM; + size = fp->read(whereToLoad, 0x40000, false); + } + else + { + whereToLoad = rom; + size = fp->read(whereToLoad, 0x2000000, false); + } + + md5_context md5; + md5.starts(); + md5.update(whereToLoad, size); + md5.finish(MDFNGameInfo->MD5); + + MDFN_printf(_("ROM: %dKiB\n"), (unsigned)((size + 1023) / 1024)); + MDFN_printf(_("ROM CRC32: 0x%08x\n"), (unsigned int)crc32(0, whereToLoad, size)); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + uint16 *temp = (uint16 *)(rom+((size+1)&~1)); + int i; + + for(i = (size+1)&~1; i < 0x2000000; i+=2) + { + WRITE16LE(temp, (i >> 1) & 0xFFFF); + temp++; + } + } + + bios = new uint8[0x4000]; + internalRAM = new uint8[0x8000]; + paletteRAM = new uint8[0x400]; + vram = new uint8[0x20000]; + oam = new uint8[0x400]; + ioMem = new uint8[0x400]; + systemColorMap = new SysCM; + + CPUUpdateRenderBuffers(true); + + MDFNGameInfo->GameSetMD5Valid = FALSE; + + MDFNGBASOUND_Init(); + + if(!gsf_loader) + { + MDFNMP_Init(0x8000, (1 << 28) / 0x8000); + + MDFNMP_AddRAM(0x40000, 0x2 << 24, workRAM); + MDFNMP_AddRAM(0x08000, 0x3 << 24, internalRAM); + } + + CPUInit(gsf_loader ? std::string("") : MDFN_GetSettingS("gba.bios")); + CPUReset(); + + Flash_Init(); + EEPROM_Init(); + + if(!gsf_loader) + { + if(cpuSramEnabled || cpuFlashEnabled) + CPUReadBatteryFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav")); + + if(cpuEEPROMEnabled) + EEPROM_LoadFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "eep")); + } + } + catch(std::exception &e) + { + CPUCleanUp(); + throw; + } +} + +void doMirroring (bool b) +{ + uint32 mirroredRomSize = (((romSize)>>20) & 0x3F)<<20; + uint32 mirroredRomAddress = romSize; + if ((mirroredRomSize <=0x800000) && (b)) + { + mirroredRomAddress = mirroredRomSize; + if (mirroredRomSize==0) + mirroredRomSize=0x100000; + while (mirroredRomAddress<0x01000000) + { + memcpy ((uint16 *)(rom+mirroredRomAddress), (uint16 *)(rom), mirroredRomSize); + mirroredRomAddress+=mirroredRomSize; + } + } +} + +static void CPUUpdateRender(void) +{ + switch(DISPCNT & 7) { + case 0: + if((!fxOn && !windowOn && !(layerEnable & 0x8000)) || + cpuDisableSfx) + renderLine = mode0RenderLine; + else if(fxOn && !windowOn && !(layerEnable & 0x8000)) + renderLine = mode0RenderLineNoWindow; + else + renderLine = mode0RenderLineAll; + break; + case 1: + if((!fxOn && !windowOn && !(layerEnable & 0x8000)) || + cpuDisableSfx) + renderLine = mode1RenderLine; + else if(fxOn && !windowOn && !(layerEnable & 0x8000)) + renderLine = mode1RenderLineNoWindow; + else + renderLine = mode1RenderLineAll; + break; + case 2: + if((!fxOn && !windowOn && !(layerEnable & 0x8000)) || + cpuDisableSfx) + renderLine = mode2RenderLine; + else if(fxOn && !windowOn && !(layerEnable & 0x8000)) + renderLine = mode2RenderLineNoWindow; + else + renderLine = mode2RenderLineAll; + break; + case 3: + if((!fxOn && !windowOn && !(layerEnable & 0x8000)) || + cpuDisableSfx) + renderLine = mode3RenderLine; + else if(fxOn && !windowOn && !(layerEnable & 0x8000)) + renderLine = mode3RenderLineNoWindow; + else + renderLine = mode3RenderLineAll; + break; + case 4: + if((!fxOn && !windowOn && !(layerEnable & 0x8000)) || + cpuDisableSfx) + renderLine = mode4RenderLine; + else if(fxOn && !windowOn && !(layerEnable & 0x8000)) + renderLine = mode4RenderLineNoWindow; + else + renderLine = mode4RenderLineAll; + break; + case 5: + if((!fxOn && !windowOn && !(layerEnable & 0x8000)) || + cpuDisableSfx) + renderLine = mode5RenderLine; + else if(fxOn && !windowOn && !(layerEnable & 0x8000)) + renderLine = mode5RenderLineNoWindow; + else + renderLine = mode5RenderLineAll; + default: + break; + } +} + +void CPUUpdateCPSR() +{ + uint32 CPSR = reg[16].I & 0x40; + if(N_FLAG) + CPSR |= 0x80000000; + if(Z_FLAG) + CPSR |= 0x40000000; + if(C_FLAG) + CPSR |= 0x20000000; + if(V_FLAG) + CPSR |= 0x10000000; + if(!armState) + CPSR |= 0x00000020; + if(!armIrqEnable) + CPSR |= 0x80; + CPSR |= (armMode & 0x1F); + reg[16].I = CPSR; +} + +void CPUUpdateFlags(bool breakLoop) +{ + uint32 CPSR = reg[16].I; + + N_FLAG = (CPSR & 0x80000000) ? true: false; + Z_FLAG = (CPSR & 0x40000000) ? true: false; + C_FLAG = (CPSR & 0x20000000) ? true: false; + V_FLAG = (CPSR & 0x10000000) ? true: false; + armState = (CPSR & 0x20) ? false : true; + armIrqEnable = (CPSR & 0x80) ? false : true; + if(breakLoop) { + if (armIrqEnable && (IF & IE) && (IME & 1)) + cpuNextEvent = cpuTotalTicks; + } +} + +void CPUUpdateFlags() +{ + CPUUpdateFlags(true); +} + +#ifndef LSB_FIRST +static void CPUSwap(volatile uint32 *a, volatile uint32 *b) +{ + volatile uint32 c = *b; + *b = *a; + *a = c; +} +#else +static void CPUSwap(uint32 *a, uint32 *b) +{ + uint32 c = *b; + *b = *a; + *a = c; +} +#endif + +void CPUSwitchMode(int mode, bool saveState, bool breakLoop) +{ + // if(armMode == mode) + // return; + + CPUUpdateCPSR(); + + switch(armMode) { + case 0x10: + case 0x1F: + reg[R13_USR].I = reg[13].I; + reg[R14_USR].I = reg[14].I; + reg[17].I = reg[16].I; + break; + case 0x11: + CPUSwap(®[R8_FIQ].I, ®[8].I); + CPUSwap(®[R9_FIQ].I, ®[9].I); + CPUSwap(®[R10_FIQ].I, ®[10].I); + CPUSwap(®[R11_FIQ].I, ®[11].I); + CPUSwap(®[R12_FIQ].I, ®[12].I); + reg[R13_FIQ].I = reg[13].I; + reg[R14_FIQ].I = reg[14].I; + reg[SPSR_FIQ].I = reg[17].I; + break; + case 0x12: + reg[R13_IRQ].I = reg[13].I; + reg[R14_IRQ].I = reg[14].I; + reg[SPSR_IRQ].I = reg[17].I; + break; + case 0x13: + reg[R13_SVC].I = reg[13].I; + reg[R14_SVC].I = reg[14].I; + reg[SPSR_SVC].I = reg[17].I; + break; + case 0x17: + reg[R13_ABT].I = reg[13].I; + reg[R14_ABT].I = reg[14].I; + reg[SPSR_ABT].I = reg[17].I; + break; + case 0x1b: + reg[R13_UND].I = reg[13].I; + reg[R14_UND].I = reg[14].I; + reg[SPSR_UND].I = reg[17].I; + break; + } + + uint32 CPSR = reg[16].I; + uint32 SPSR = reg[17].I; + + switch(mode) { + case 0x10: + case 0x1F: + reg[13].I = reg[R13_USR].I; + reg[14].I = reg[R14_USR].I; + reg[16].I = SPSR; + break; + case 0x11: + CPUSwap(®[8].I, ®[R8_FIQ].I); + CPUSwap(®[9].I, ®[R9_FIQ].I); + CPUSwap(®[10].I, ®[R10_FIQ].I); + CPUSwap(®[11].I, ®[R11_FIQ].I); + CPUSwap(®[12].I, ®[R12_FIQ].I); + reg[13].I = reg[R13_FIQ].I; + reg[14].I = reg[R14_FIQ].I; + if(saveState) + reg[17].I = CPSR; + else + reg[17].I = reg[SPSR_FIQ].I; + break; + case 0x12: + reg[13].I = reg[R13_IRQ].I; + reg[14].I = reg[R14_IRQ].I; + reg[16].I = SPSR; + if(saveState) + reg[17].I = CPSR; + else + reg[17].I = reg[SPSR_IRQ].I; + break; + case 0x13: + reg[13].I = reg[R13_SVC].I; + reg[14].I = reg[R14_SVC].I; + reg[16].I = SPSR; + if(saveState) + reg[17].I = CPSR; + else + reg[17].I = reg[SPSR_SVC].I; + break; + case 0x17: + reg[13].I = reg[R13_ABT].I; + reg[14].I = reg[R14_ABT].I; + reg[16].I = SPSR; + if(saveState) + reg[17].I = CPSR; + else + reg[17].I = reg[SPSR_ABT].I; + break; + case 0x1b: + reg[13].I = reg[R13_UND].I; + reg[14].I = reg[R14_UND].I; + reg[16].I = SPSR; + if(saveState) + reg[17].I = CPSR; + else + reg[17].I = reg[SPSR_UND].I; + break; + default: + //systemMessage(MSG_UNSUPPORTED_ARM_MODE, N_("Unsupported ARM mode %02x"), mode); + break; + } + armMode = mode; + CPUUpdateFlags(breakLoop); + CPUUpdateCPSR(); +} + +void CPUSwitchMode(int mode, bool saveState) +{ + CPUSwitchMode(mode, saveState, true); +} + +void CPUUndefinedException() +{ + uint32 PC = reg[15].I; + bool savedArmState = armState; + CPUSwitchMode(0x1b, true, false); + reg[14].I = PC - (savedArmState ? 4 : 2); + reg[15].I = 0x04; + armState = true; + armIrqEnable = false; + armNextPC = 0x04; + ARM_PREFETCH; + reg[15].I += 4; +} + +void CPUSoftwareInterrupt() +{ + uint32 PC = reg[15].I; + bool savedArmState = armState; + CPUSwitchMode(0x13, true, false); + reg[14].I = PC - (savedArmState ? 4 : 2); + reg[15].I = 0x08; + armState = true; + armIrqEnable = false; + armNextPC = 0x08; + ARM_PREFETCH; + reg[15].I += 4; +} + +void CPUSoftwareInterrupt(int comment) +{ + static bool disableMessage = false; + if(armState) comment >>= 16; + if(comment == 0xfa) { + return; + } + if(useBios) { + CPUSoftwareInterrupt(); + return; + } + // This would be correct, but it causes problems if uncommented + // else { + // biosProtected = 0xe3a02004; + // } + + switch(comment) { + case 0x00: + BIOS_SoftReset(); + ARM_PREFETCH; + break; + case 0x01: + BIOS_RegisterRamReset(); + break; + case 0x02: + holdState = true; + holdType = -1; + cpuNextEvent = cpuTotalTicks; + break; + case 0x03: + holdState = true; + holdType = -1; + stopState = true; + cpuNextEvent = cpuTotalTicks; + break; + case 0x04: + CPUSoftwareInterrupt(); + break; + case 0x05: + CPUSoftwareInterrupt(); + break; + case 0x06: + CPUSoftwareInterrupt(); + break; + case 0x07: + CPUSoftwareInterrupt(); + break; + case 0x08: + BIOS_Sqrt(); + break; + case 0x09: + BIOS_ArcTan(); + break; + case 0x0A: + BIOS_ArcTan2(); + break; + case 0x0B: + { + int len = (reg[2].I & 0x1FFFFF) >>1; + if (!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + len) & 0xe000000) == 0)) + { + if ((reg[2].I >> 24) & 1) + { + if ((reg[2].I >> 26) & 1) + SWITicks = (7 + memoryWait32[(reg[1].I>>24) & 0xF]) * (len>>1); + else + SWITicks = (8 + memoryWait[(reg[1].I>>24) & 0xF]) * (len); + } + else + { + if ((reg[2].I >> 26) & 1) + SWITicks = (10 + memoryWait32[(reg[0].I>>24) & 0xF] + + memoryWait32[(reg[1].I>>24) & 0xF]) * (len>>1); + else + SWITicks = (11 + memoryWait[(reg[0].I>>24) & 0xF] + + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + } + } + BIOS_CpuSet(); + break; + case 0x0C: + { + int len = (reg[2].I & 0x1FFFFF) >>5; + if (!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + len) & 0xe000000) == 0)) + { + if ((reg[2].I >> 24) & 1) + SWITicks = (6 + memoryWait32[(reg[1].I>>24) & 0xF] + + 7 * (memoryWaitSeq32[(reg[1].I>>24) & 0xF] + 1)) * len; + else + SWITicks = (9 + memoryWait32[(reg[0].I>>24) & 0xF] + + memoryWait32[(reg[1].I>>24) & 0xF] + + 7 * (memoryWaitSeq32[(reg[0].I>>24) & 0xF] + + memoryWaitSeq32[(reg[1].I>>24) & 0xF] + 2)) * len; + } + } + BIOS_CpuFastSet(); + break; + case 0x0E: + BIOS_BgAffineSet(); + break; + case 0x0F: + BIOS_ObjAffineSet(); + break; + case 0x10: + { + int len = CPUReadHalfWord(reg[2].I); + if (!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + len) & 0xe000000) == 0)) + SWITicks = (32 + memoryWait[(reg[0].I>>24) & 0xF]) * len; + } + BIOS_BitUnPack(); + break; + case 0x11: + { + uint32 len = CPUReadMemory(reg[0].I) >> 8; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (9 + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_LZ77UnCompWram(); + break; + case 0x12: + { + uint32 len = CPUReadMemory(reg[0].I) >> 8; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (19 + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_LZ77UnCompVram(); + break; + case 0x13: + { + uint32 len = CPUReadMemory(reg[0].I) >> 8; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (29 + (memoryWait[(reg[0].I>>24) & 0xF]<<1)) * len; + } + BIOS_HuffUnComp(); + break; + case 0x14: + { + uint32 len = CPUReadMemory(reg[0].I) >> 8; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (11 + memoryWait[(reg[0].I>>24) & 0xF] + + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_RLUnCompWram(); + break; + case 0x15: + { + uint32 len = CPUReadMemory(reg[0].I) >> 9; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (34 + (memoryWait[(reg[0].I>>24) & 0xF] << 1) + + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_RLUnCompVram(); + break; + case 0x16: + { + uint32 len = CPUReadMemory(reg[0].I) >> 8; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (13 + memoryWait[(reg[0].I>>24) & 0xF] + + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_Diff8bitUnFilterWram(); + break; + case 0x17: + { + uint32 len = CPUReadMemory(reg[0].I) >> 9; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (39 + (memoryWait[(reg[0].I>>24) & 0xF]<<1) + + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_Diff8bitUnFilterVram(); + break; + case 0x18: + { + uint32 len = CPUReadMemory(reg[0].I) >> 9; + if(!(((reg[0].I & 0xe000000) == 0) || + ((reg[0].I + (len & 0x1fffff)) & 0xe000000) == 0)) + SWITicks = (13 + memoryWait[(reg[0].I>>24) & 0xF] + + memoryWait[(reg[1].I>>24) & 0xF]) * len; + } + BIOS_Diff16bitUnFilter(); + break; + case 0x19: + //if(reg[0].I) + // systemSoundPause(); + //else + // systemSoundResume(); + break; + case 0x1F: + BIOS_MidiKey2Freq(); + break; + case 0x2A: + BIOS_SndDriverJmpTableCopy(); + // let it go, because we don't really emulate this function + default: + if(!disableMessage) { + MDFN_PrintError(_("Unsupported BIOS function %02x called from %08x. A BIOS file is needed in order to get correct behaviour."), + comment, + armMode ? armNextPC - 4: armNextPC - 2); + disableMessage = true; + } + break; + } +} + +void CPUCompareVCOUNT() +{ + if(VCOUNT == (DISPSTAT >> 8)) { + DISPSTAT |= 4; + UPDATE_REG(0x04, DISPSTAT); + + if(DISPSTAT & 0x20) { + IF |= 4; + UPDATE_REG(0x202, IF); + } + } else { + DISPSTAT &= 0xFFFB; + UPDATE_REG(0x4, DISPSTAT); + } + if (layerEnableDelay>0) + { + layerEnableDelay--; + if (layerEnableDelay==1) + layerEnable = layerSettings & DISPCNT; + } + +} + +#define doDMA(s, d, _si, _di, _c, _transfer32) \ +{ \ + uint32 si = _si; \ + uint32 di = _di; \ + uint32 c = _c; \ + int sm = s >> 24; \ + int dm = d >> 24; \ + int sw = 0; \ + int dw = 0; \ + int sc = c; \ + cpuDmaCount = c; \ + if (sm>15) \ + sm=15; \ + if (dm>15) \ + dm=15; \ + if(_transfer32) { \ + s &= 0xFFFFFFFC; \ + if(s < 0x02000000 && (reg[15].I >> 24)) { \ + while(c != 0) { \ + CPUWriteMemory(d, 0); \ + d += di; \ + c--; \ + } \ + } else { \ + while(c != 0) { \ + cpuDmaLast = CPUReadMemory(s); \ + CPUWriteMemory(d, cpuDmaLast); \ + d += di; \ + s += si; \ + c--; \ + } \ + } \ + } else { \ + s &= 0xFFFFFFFE; \ + si = (int)si >> 1; \ + di = (int)di >> 1; \ + if(s < 0x02000000 && (reg[15].I >> 24)) { \ + while(c != 0) { \ + CPUWriteHalfWord(d, 0); \ + d += di; \ + c--; \ + } \ + } else { \ + while(c != 0) { \ + cpuDmaLast = CPUReadHalfWord(s); \ + CPUWriteHalfWord(d, cpuDmaLast); \ + cpuDmaLast |= (cpuDmaLast<<16); \ + d += di; \ + s += si; \ + c--; \ + } \ + } \ + } \ + cpuDmaCount = 0; \ + int totalTicks = 0; \ + if(_transfer32) { \ + sw =1+memoryWaitSeq32[sm & 15]; \ + dw =1+memoryWaitSeq32[dm & 15]; \ + totalTicks = (sw+dw)*(sc-1) + 6 + memoryWait32[sm & 15] + \ + memoryWaitSeq32[dm & 15]; \ + } \ + else \ + { \ + sw = 1+memoryWaitSeq[sm & 15]; \ + dw = 1+memoryWaitSeq[dm & 15]; \ + totalTicks = (sw+dw)*(sc-1) + 6 + memoryWait[sm & 15] + \ + memoryWaitSeq[dm & 15]; \ + } \ + cpuDmaTicksToUpdate += totalTicks; \ +} + +void CPUCheckDMA(int reason, int dmamask) +{ + // DMA 0 + if((DMCNT_H[0] & 0x8000) && (dmamask & 1)) { + if(((DMCNT_H[0] >> 12) & 3) == reason) { + uint32 sourceIncrement = 4; + uint32 destIncrement = 4; + switch((DMCNT_H[0] >> 7) & 3) { + case 0: + break; + case 1: + sourceIncrement = (uint32)-4; + break; + case 2: + sourceIncrement = 0; + break; + } + switch((DMCNT_H[0] >> 5) & 3) { + case 0: + break; + case 1: + destIncrement = (uint32)-4; + break; + case 2: + destIncrement = 0; + break; + } + doDMA(dmaSource[0], dmaDest[0], sourceIncrement, destIncrement, + DMCNT_L[0] ? DMCNT_L[0] : 0x4000, + DMCNT_H[0] & 0x0400); + cpuDmaHack = true; + + if(DMCNT_H[0] & 0x4000) { + IF |= 0x0100; + UPDATE_REG(0x202, IF); + cpuNextEvent = cpuTotalTicks; + } + + if(((DMCNT_H[0] >> 5) & 3) == 3) { + dmaDest[0] = DMDAD_L[0] | (DMDAD_H[0] << 16); + } + + if(!(DMCNT_H[0] & 0x0200) || (reason == 0)) { + DMCNT_H[0] &= 0x7FFF; + UPDATE_REG(0xBA, DMCNT_H[0]); + } + } + } + + // DMA 1 + if((DMCNT_H[1] & 0x8000) && (dmamask & 2)) { + if(((DMCNT_H[1] >> 12) & 3) == reason) { + uint32 sourceIncrement = 4; + uint32 destIncrement = 4; + switch((DMCNT_H[1] >> 7) & 3) { + case 0: + break; + case 1: + sourceIncrement = (uint32)-4; + break; + case 2: + sourceIncrement = 0; + break; + } + switch((DMCNT_H[1] >> 5) & 3) { + case 0: + break; + case 1: + destIncrement = (uint32)-4; + break; + case 2: + destIncrement = 0; + break; + } + if(reason == 3) { + doDMA(dmaSource[1], dmaDest[1], sourceIncrement, 0, 4, + 0x0400); + } else { + doDMA(dmaSource[1], dmaDest[1], sourceIncrement, destIncrement, + DMCNT_L[1] ? DMCNT_L[1] : 0x4000, + DMCNT_H[1] & 0x0400); + } + cpuDmaHack = true; + + if(DMCNT_H[1] & 0x4000) { + IF |= 0x0200; + UPDATE_REG(0x202, IF); + cpuNextEvent = cpuTotalTicks; + } + + if(((DMCNT_H[1] >> 5) & 3) == 3) { + dmaDest[1] = DMDAD_L[1] | (DMDAD_H[1] << 16); + } + + if(!(DMCNT_H[1] & 0x0200) || (reason == 0)) { + DMCNT_H[1] &= 0x7FFF; + UPDATE_REG(0xC6, DMCNT_H[1]); + } + } + } + + // DMA 2 + if((DMCNT_H[2] & 0x8000) && (dmamask & 4)) { + if(((DMCNT_H[2] >> 12) & 3) == reason) { + uint32 sourceIncrement = 4; + uint32 destIncrement = 4; + switch((DMCNT_H[2] >> 7) & 3) { + case 0: + break; + case 1: + sourceIncrement = (uint32)-4; + break; + case 2: + sourceIncrement = 0; + break; + } + switch((DMCNT_H[2] >> 5) & 3) { + case 0: + break; + case 1: + destIncrement = (uint32)-4; + break; + case 2: + destIncrement = 0; + break; + } + if(reason == 3) { + doDMA(dmaSource[2], dmaDest[2], sourceIncrement, 0, 4, + 0x0400); + } else { + doDMA(dmaSource[2], dmaDest[2], sourceIncrement, destIncrement, + DMCNT_L[2] ? DMCNT_L[2] : 0x4000, + DMCNT_H[2] & 0x0400); + } + cpuDmaHack = true; + + if(DMCNT_H[2] & 0x4000) { + IF |= 0x0400; + UPDATE_REG(0x202, IF); + cpuNextEvent = cpuTotalTicks; + } + + if(((DMCNT_H[2] >> 5) & 3) == 3) { + dmaDest[2] = DMDAD_L[2] | (DMDAD_H[2] << 16); + } + + if(!(DMCNT_H[2] & 0x0200) || (reason == 0)) { + DMCNT_H[2] &= 0x7FFF; + UPDATE_REG(0xD2, DMCNT_H[2]); + } + } + } + + // DMA 3 + if((DMCNT_H[3] & 0x8000) && (dmamask & 8)) { + if(((DMCNT_H[3] >> 12) & 3) == reason) { + uint32 sourceIncrement = 4; + uint32 destIncrement = 4; + switch((DMCNT_H[3] >> 7) & 3) { + case 0: + break; + case 1: + sourceIncrement = (uint32)-4; + break; + case 2: + sourceIncrement = 0; + break; + } + switch((DMCNT_H[3] >> 5) & 3) { + case 0: + break; + case 1: + destIncrement = (uint32)-4; + break; + case 2: + destIncrement = 0; + break; + } + doDMA(dmaSource[3], dmaDest[3], sourceIncrement, destIncrement, + DMCNT_L[3] ? DMCNT_L[3] : 0x10000, + DMCNT_H[3] & 0x0400); + if(DMCNT_H[3] & 0x4000) { + IF |= 0x0800; + UPDATE_REG(0x202, IF); + cpuNextEvent = cpuTotalTicks; + } + + if(((DMCNT_H[3] >> 5) & 3) == 3) { + dmaDest[3] = DMDAD_L[3] | (DMDAD_H[3] << 16); + } + + if(!(DMCNT_H[3] & 0x0200) || (reason == 0)) { + DMCNT_H[3] &= 0x7FFF; + UPDATE_REG(0xDE, DMCNT_H[3]); + } + } + } +} + +void CPUUpdateRegister(uint32 address, uint16 value) +{ + switch(address) + { + case 0x00: + { + if ((value & 7) >5) + DISPCNT = (value &7); + bool change = ((DISPCNT ^ value) & 0x80) ? true : false; + bool changeBG = ((DISPCNT ^ value) & 0x0F00) ? true : false; + uint16 changeBGon = (((~DISPCNT) & value) & 0x0F00); + DISPCNT = (value & 0xFFF7); + UPDATE_REG(0x00, DISPCNT); + + if (changeBGon) + { + layerEnableDelay=4; + layerEnable = layerSettings & value & (~changeBGon); + } + else + layerEnable = layerSettings & value; + // CPUUpdateTicks(); + + windowOn = (layerEnable & 0x6000) ? true : false; + if(change && !((value & 0x80))) { + if(!(DISPSTAT & 1)) { + lcdTicks = 1008; + // VCOUNT = 0; + // UPDATE_REG(0x06, VCOUNT); + DISPSTAT &= 0xFFFC; + UPDATE_REG(0x04, DISPSTAT); + CPUCompareVCOUNT(); + } + // (*renderLine)(); + } + CPUUpdateRender(); + // we only care about changes in BG0-BG3 + if(changeBG) + CPUUpdateRenderBuffers(false); + } + break; + case 0x04: + DISPSTAT = (value & 0xFF38) | (DISPSTAT & 7); + UPDATE_REG(0x04, DISPSTAT); + break; + case 0x06: + // not writable + break; + case 0x08: + BG0CNT = (value & 0xDFCF); + UPDATE_REG(0x08, BG0CNT); + break; + case 0x0A: + BG1CNT = (value & 0xDFCF); + UPDATE_REG(0x0A, BG1CNT); + break; + case 0x0C: + BG2CNT = (value & 0xFFCF); + UPDATE_REG(0x0C, BG2CNT); + break; + case 0x0E: + BG3CNT = (value & 0xFFCF); + UPDATE_REG(0x0E, BG3CNT); + break; + case 0x10: + BGHOFS[0] = value & 511; + UPDATE_REG(0x10, BGHOFS[0]); + break; + case 0x12: + BGVOFS[0] = value & 511; + UPDATE_REG(0x12, BGVOFS[0]); + break; + case 0x14: + BGHOFS[1] = value & 511; + UPDATE_REG(0x14, BGHOFS[1]); + break; + case 0x16: + BGVOFS[1] = value & 511; + UPDATE_REG(0x16, BGVOFS[1]); + break; + case 0x18: + BGHOFS[2] = value & 511; + UPDATE_REG(0x18, BGHOFS[2]); + break; + case 0x1A: + BGVOFS[2] = value & 511; + UPDATE_REG(0x1A, BGVOFS[2]); + break; + case 0x1C: + BGHOFS[3] = value & 511; + UPDATE_REG(0x1C, BGHOFS[3]); + break; + case 0x1E: + BGVOFS[3] = value & 511; + UPDATE_REG(0x1E, BGVOFS[3]); + break; + case 0x20: + BG2PA = value; + UPDATE_REG(0x20, BG2PA); + break; + case 0x22: + BG2PB = value; + UPDATE_REG(0x22, BG2PB); + break; + case 0x24: + BG2PC = value; + UPDATE_REG(0x24, BG2PC); + break; + case 0x26: + BG2PD = value; + UPDATE_REG(0x26, BG2PD); + break; + case 0x28: + BG2X_L = value; + UPDATE_REG(0x28, BG2X_L); + gfxBG2Changed |= 1; + break; + case 0x2A: + BG2X_H = (value & 0xFFF); + UPDATE_REG(0x2A, BG2X_H); + gfxBG2Changed |= 1; + break; + case 0x2C: + BG2Y_L = value; + UPDATE_REG(0x2C, BG2Y_L); + gfxBG2Changed |= 2; + break; + case 0x2E: + BG2Y_H = value & 0xFFF; + UPDATE_REG(0x2E, BG2Y_H); + gfxBG2Changed |= 2; + break; + case 0x30: + BG3PA = value; + UPDATE_REG(0x30, BG3PA); + break; + case 0x32: + BG3PB = value; + UPDATE_REG(0x32, BG3PB); + break; + case 0x34: + BG3PC = value; + UPDATE_REG(0x34, BG3PC); + break; + case 0x36: + BG3PD = value; + UPDATE_REG(0x36, BG3PD); + break; + case 0x38: + BG3X_L = value; + UPDATE_REG(0x38, BG3X_L); + gfxBG3Changed |= 1; + break; + case 0x3A: + BG3X_H = value & 0xFFF; + UPDATE_REG(0x3A, BG3X_H); + gfxBG3Changed |= 1; + break; + case 0x3C: + BG3Y_L = value; + UPDATE_REG(0x3C, BG3Y_L); + gfxBG3Changed |= 2; + break; + case 0x3E: + BG3Y_H = value & 0xFFF; + UPDATE_REG(0x3E, BG3Y_H); + gfxBG3Changed |= 2; + break; + case 0x40: + WIN0H = value; + UPDATE_REG(0x40, WIN0H); + CPUUpdateWindow0(); + break; + case 0x42: + WIN1H = value; + UPDATE_REG(0x42, WIN1H); + CPUUpdateWindow1(); + break; + case 0x44: + WIN0V = value; + UPDATE_REG(0x44, WIN0V); + break; + case 0x46: + WIN1V = value; + UPDATE_REG(0x46, WIN1V); + break; + case 0x48: + WININ = value & 0x3F3F; + UPDATE_REG(0x48, WININ); + break; + case 0x4A: + WINOUT = value & 0x3F3F; + UPDATE_REG(0x4A, WINOUT); + break; + case 0x4C: + MOSAIC = value; + UPDATE_REG(0x4C, MOSAIC); + break; + case 0x50: + BLDMOD = value & 0x3FFF; + UPDATE_REG(0x50, BLDMOD); + fxOn = ((BLDMOD>>6)&3) != 0; + CPUUpdateRender(); + break; + case 0x52: + COLEV = value & 0x1F1F; + UPDATE_REG(0x52, COLEV); + break; + case 0x54: + COLY = value & 0x1F; + UPDATE_REG(0x54, COLY); + break; + case 0x60: + case 0x62: + case 0x64: + case 0x68: + case 0x6c: + case 0x70: + case 0x72: + case 0x74: + case 0x78: + case 0x7c: + case 0x80: + case 0x84: + soundEvent(address&0xFF, (uint8)(value & 0xFF)); + soundEvent((address&0xFF)+1, (uint8)(value>>8)); + break; + case 0x82: + case 0x88: + case 0xa0: + case 0xa2: + case 0xa4: + case 0xa6: + case 0x90: + case 0x92: + case 0x94: + case 0x96: + case 0x98: + case 0x9a: + case 0x9c: + case 0x9e: + soundEvent(address&0xFF, value); + break; + case 0xB0: + DMSAD_L[0] = value; + UPDATE_REG(0xB0, DMSAD_L[0]); + break; + case 0xB2: + DMSAD_H[0] = value & 0x07FF; + UPDATE_REG(0xB2, DMSAD_H[0]); + break; + case 0xB4: + DMDAD_L[0] = value; + UPDATE_REG(0xB4, DMDAD_L[0]); + break; + case 0xB6: + DMDAD_H[0] = value & 0x07FF; + UPDATE_REG(0xB6, DMDAD_H[0]); + break; + case 0xB8: + DMCNT_L[0] = value & 0x3FFF; + UPDATE_REG(0xB8, 0); + break; + case 0xBA: + { + bool start = ((DMCNT_H[0] ^ value) & 0x8000) ? true : false; + value &= 0xF7E0; + + DMCNT_H[0] = value; + UPDATE_REG(0xBA, DMCNT_H[0]); + + if(start && (value & 0x8000)) { + dmaSource[0] = DMSAD_L[0] | (DMSAD_H[0] << 16); + dmaDest[0] = DMDAD_L[0] | (DMDAD_H[0] << 16); + CPUCheckDMA(0, 1); + } + } + break; + case 0xBC: + DMSAD_L[1] = value; + UPDATE_REG(0xBC, DMSAD_L[1]); + break; + case 0xBE: + DMSAD_H[1] = value & 0x0FFF; + UPDATE_REG(0xBE, DMSAD_H[1]); + break; + case 0xC0: + DMDAD_L[1] = value; + UPDATE_REG(0xC0, DMDAD_L[1]); + break; + case 0xC2: + DMDAD_H[1] = value & 0x07FF; + UPDATE_REG(0xC2, DMDAD_H[1]); + break; + case 0xC4: + DMCNT_L[1] = value & 0x3FFF; + UPDATE_REG(0xC4, 0); + break; + case 0xC6: + { + bool start = ((DMCNT_H[1] ^ value) & 0x8000) ? true : false; + value &= 0xF7E0; + + DMCNT_H[1] = value; + UPDATE_REG(0xC6, DMCNT_H[1]); + + if(start && (value & 0x8000)) { + dmaSource[1] = DMSAD_L[1] | (DMSAD_H[1] << 16); + dmaDest[1] = DMDAD_L[1] | (DMDAD_H[1] << 16); + CPUCheckDMA(0, 2); + } + } + break; + case 0xC8: + DMSAD_L[2] = value; + UPDATE_REG(0xC8, DMSAD_L[2]); + break; + case 0xCA: + DMSAD_H[2] = value & 0x0FFF; + UPDATE_REG(0xCA, DMSAD_H[2]); + break; + case 0xCC: + DMDAD_L[2] = value; + UPDATE_REG(0xCC, DMDAD_L[2]); + break; + case 0xCE: + DMDAD_H[2] = value & 0x07FF; + UPDATE_REG(0xCE, DMDAD_H[2]); + break; + case 0xD0: + DMCNT_L[2] = value & 0x3FFF; + UPDATE_REG(0xD0, 0); + break; + case 0xD2: + { + bool start = ((DMCNT_H[2] ^ value) & 0x8000) ? true : false; + + value &= 0xF7E0; + + DMCNT_H[2] = value; + UPDATE_REG(0xD2, DMCNT_H[2]); + + if(start && (value & 0x8000)) { + dmaSource[2] = DMSAD_L[2] | (DMSAD_H[2] << 16); + dmaDest[2] = DMDAD_L[2] | (DMDAD_H[2] << 16); + + CPUCheckDMA(0, 4); + } + } + break; + case 0xD4: + DMSAD_L[3] = value; + UPDATE_REG(0xD4, DMSAD_L[3]); + break; + case 0xD6: + DMSAD_H[3] = value & 0x0FFF; + UPDATE_REG(0xD6, DMSAD_H[3]); + break; + case 0xD8: + DMDAD_L[3] = value; + UPDATE_REG(0xD8, DMDAD_L[3]); + break; + case 0xDA: + DMDAD_H[3] = value & 0x0FFF; + UPDATE_REG(0xDA, DMDAD_H[3]); + break; + case 0xDC: + DMCNT_L[3] = value; + UPDATE_REG(0xDC, 0); + break; + case 0xDE: + { + bool start = ((DMCNT_H[3] ^ value) & 0x8000) ? true : false; + + value &= 0xFFE0; + + DMCNT_H[3] = value; + UPDATE_REG(0xDE, DMCNT_H[3]); + + if(start && (value & 0x8000)) { + dmaSource[3] = DMSAD_L[3] | (DMSAD_H[3] << 16); + dmaDest[3] = DMDAD_L[3] | (DMDAD_H[3] << 16); + CPUCheckDMA(0,8); + } + } + break; + case 0x100: + timers[0].Reload = value; + break; + case 0x102: + timers[0].Value = value; + timerOnOffDelay|=1; + cpuNextEvent = cpuTotalTicks; + break; + case 0x104: + timers[1].Reload = value; + break; + case 0x106: + timers[1].Value = value; + timerOnOffDelay|=2; + cpuNextEvent = cpuTotalTicks; + break; + case 0x108: + timers[2].Reload = value; + break; + case 0x10A: + timers[2].Value = value; + timerOnOffDelay|=4; + cpuNextEvent = cpuTotalTicks; + break; + case 0x10C: + timers[3].Reload = value; + break; + case 0x10E: + timers[3].Value = value; + timerOnOffDelay|=8; + cpuNextEvent = cpuTotalTicks; + break; + case 0x128: + if(value & 0x80) { + value &= 0xff7f; + if(value & 1 && (value & 0x4000)) { + UPDATE_REG(0x12a, 0xFF); + IF |= 0x80; + UPDATE_REG(0x202, IF); + value &= 0x7f7f; + } + } + UPDATE_REG(0x128, value); + break; + case 0x130: + P1 |= (value & 0x3FF); + UPDATE_REG(0x130, P1); + break; + case 0x132: + UPDATE_REG(0x132, value & 0xC3FF); + break; + case 0x200: + IE = value & 0x3FFF; + UPDATE_REG(0x200, IE); + if ((IME & 1) && (IF & IE) && armIrqEnable) + cpuNextEvent = cpuTotalTicks; + break; + case 0x202: + IF ^= (value & IF); + UPDATE_REG(0x202, IF); + break; + case 0x204: + { + memoryWait[0x0e] = memoryWaitSeq[0x0e] = gamepakRamWaitState[value & 3]; + + memoryWait[0x08] = memoryWait[0x09] = gamepakWaitState[(value >> 2) & 3]; + memoryWaitSeq[0x08] = memoryWaitSeq[0x09] = + gamepakWaitState0[(value >> 4) & 1]; + + memoryWait[0x0a] = memoryWait[0x0b] = gamepakWaitState[(value >> 5) & 3]; + memoryWaitSeq[0x0a] = memoryWaitSeq[0x0b] = + gamepakWaitState1[(value >> 7) & 1]; + + memoryWait[0x0c] = memoryWait[0x0d] = gamepakWaitState[(value >> 8) & 3]; + memoryWaitSeq[0x0c] = memoryWaitSeq[0x0d] = + gamepakWaitState2[(value >> 10) & 1]; + + for(int i = 8; i < 15; i++) { + memoryWait32[i] = memoryWait[i] + memoryWaitSeq[i] + 1; + memoryWaitSeq32[i] = memoryWaitSeq[i]*2 + 1; + } + + if((value & 0x4000) == 0x4000) { + busPrefetchEnable = true; + busPrefetch = false; + busPrefetchCount = 0; + } else { + busPrefetchEnable = false; + busPrefetch = false; + busPrefetchCount = 0; + } + UPDATE_REG(0x204, value & 0x7FFF); + + } + break; + case 0x208: + IME = value & 1; + UPDATE_REG(0x208, IME); + if ((IME & 1) && (IF & IE) && armIrqEnable) + cpuNextEvent = cpuTotalTicks; + break; + case 0x300: + if(value != 0) + value &= 0xFFFE; + UPDATE_REG(0x300, value); + break; + default: + UPDATE_REG(address&0x3FE, value); + break; + } +} + +void applyTimer () +{ + if (timerOnOffDelay & 1) + { + timers[0].ClockReload = TIMER_TICKS[timers[0].Value & 3]; + if(!timers[0].On && (timers[0].Value & 0x80)) { + // reload the counter + timers[0].D = timers[0].Reload; + timers[0].Ticks = (0x10000 - timers[0].D) << timers[0].ClockReload; + UPDATE_REG(0x100, timers[0].D); + } + timers[0].On = timers[0].Value & 0x80 ? true : false; + timers[0].CNT = timers[0].Value & 0xC7; + UPDATE_REG(0x102, timers[0].CNT); + // CPUUpdateTicks(); + } + if (timerOnOffDelay & 2) + { + timers[1].ClockReload = TIMER_TICKS[timers[1].Value & 3]; + if(!timers[1].On && (timers[1].Value & 0x80)) { + // reload the counter + timers[1].D = timers[1].Reload; + timers[1].Ticks = (0x10000 - timers[1].D) << timers[1].ClockReload; + UPDATE_REG(0x104, timers[1].D); + } + timers[1].On = timers[1].Value & 0x80 ? true : false; + timers[1].CNT = timers[1].Value & 0xC7; + UPDATE_REG(0x106, timers[1].CNT); + } + if (timerOnOffDelay & 4) + { + timers[2].ClockReload = TIMER_TICKS[timers[2].Value & 3]; + if(!timers[2].On && (timers[2].Value & 0x80)) { + // reload the counter + timers[2].D = timers[2].Reload; + timers[2].Ticks = (0x10000 - timers[2].D) << timers[2].ClockReload; + UPDATE_REG(0x108, timers[2].D); + } + timers[2].On = timers[2].Value & 0x80 ? true : false; + timers[2].CNT = timers[2].Value & 0xC7; + UPDATE_REG(0x10A, timers[2].CNT); + } + if (timerOnOffDelay & 8) + { + timers[3].ClockReload = TIMER_TICKS[timers[3].Value & 3]; + if(!timers[3].On && (timers[3].Value & 0x80)) { + // reload the counter + timers[3].D = timers[3].Reload; + timers[3].Ticks = (0x10000 - timers[3].D) << timers[3].ClockReload; + UPDATE_REG(0x10C, timers[3].D); + } + timers[3].On = timers[3].Value & 0x80 ? true : false; + timers[3].CNT = timers[3].Value & 0xC7; + UPDATE_REG(0x10E, timers[3].CNT); + } + cpuNextEvent = CPUUpdateTicks(); + timerOnOffDelay = 0; +} + +static void FLASH_SRAM_Write(uint32 A, uint32 V) +{ +// printf("%08x %08x\n", A, V); + + if(cpuFlashEnabled && cpuSramEnabled) + { + if((A & 0xFFFF) == 0x5555 && (V & 0xFF) == 0xAA) + cpuSramEnabled = FALSE; + else if((A & 0xFFFF) != 0x2AAA) + cpuFlashEnabled = FALSE; + + if(!cpuFlashEnabled || !cpuSramEnabled) + printf("%s emulation disabled by write to: %08x %08x\n", cpuSramEnabled ? "FLASH" : "SRAM", A, V); + } + + if(cpuSramEnabled) + sramWrite(A, V); + + if(cpuFlashEnabled) + flashWrite(A, V); +} + +void CPUWriteMemory(uint32 address, uint32 value) +{ + switch(address >> 24) + { + case 0x02: + WRITE32LE(((uint32 *)&workRAM[address & 0x3FFFC]), value); + break; \ + case 0x03: \ + WRITE32LE(((uint32 *)&internalRAM[address & 0x7ffC]), value); \ + break; \ + case 0x04: \ + if(address < 0x4000400) { \ + CPUUpdateRegister((address & 0x3FC), value & 0xFFFF); \ + CPUUpdateRegister((address & 0x3FC) + 2, (value >> 16)); \ + } \ + break; \ + case 0x05: \ + WRITE32LE(((uint32 *)&paletteRAM[address & 0x3FC]), value); \ + break; \ + case 0x06: \ + address = (address & 0x1fffc); + if (((DISPCNT & 7) >2) && ((address & 0x1C000) == 0x18000)) + return; + if ((address & 0x18000) == 0x18000) + address &= 0x17fff; + WRITE32LE(((uint32 *)&vram[address]), value); + break; \ + + case 0x07: + WRITE32LE(((uint32 *)&oam[address & 0x3fc]), value); + break; + + case 0x0D: + if(cpuEEPROMEnabled) + { + eepromWrite(address, value); + break; + } + break; + + case 0x0E: + FLASH_SRAM_Write(address, value); + break; + + default: break; + } +} + +void CPUWriteHalfWord(uint32 address, uint16 value) +{ + switch(address >> 24) + { + case 2: + WRITE16LE(((uint16 *)&workRAM[address & 0x3FFFE]),value); + break; + case 3: + WRITE16LE(((uint16 *)&internalRAM[address & 0x7ffe]), value); + break; + case 4: + if(address < 0x4000400) + CPUUpdateRegister(address & 0x3fe, value); + else goto unwritable; + break; + case 5: + WRITE16LE(((uint16 *)&paletteRAM[address & 0x3fe]), value); + break; + case 6: + address = (address & 0x1fffe); + if (((DISPCNT & 7) >2) && ((address & 0x1C000) == 0x18000)) + return; + if ((address & 0x18000) == 0x18000) + address &= 0x17fff; + WRITE16LE(((uint16 *)&vram[address]), value); + break; + case 7: + WRITE16LE(((uint16 *)&oam[address & 0x3fe]), value); + break; + case 8: + case 9: + if(GBA_RTC && (address == 0x80000c4 || address == 0x80000c6 || address == 0x80000c8)) + GBA_RTC->Write(address, value); + else + goto unwritable; + break; + case 13: + if(cpuEEPROMEnabled) + { + eepromWrite(address, (uint8)value); + break; + } + goto unwritable; + + case 0x0E: + FLASH_SRAM_Write(address, value); + break; + + default: + unwritable: + break; + } +} + +void CPUWriteByte(uint32 address, uint8 b) +{ + switch(address >> 24) + { + case 2: + workRAM[address & 0x3FFFF] = b; + break; + + case 3: + internalRAM[address & 0x7fff] = b; + break; + + case 4: + if(address < 0x4000400) + { + switch(address & 0x3FF) + { + case 0x301: + if(b == 0x80) + stopState = true; + holdState = 1; + holdType = -1; + cpuNextEvent = cpuTotalTicks; + break; + + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x68: + case 0x69: + case 0x6c: + case 0x6d: + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x78: + case 0x79: + case 0x7c: + case 0x7d: + case 0x80: + case 0x81: + case 0x84: + case 0x85: + case 0x90: + case 0x91: + case 0x92: + case 0x93: + case 0x94: + case 0x95: + case 0x96: + case 0x97: + case 0x98: + case 0x99: + case 0x9a: + case 0x9b: + case 0x9c: + case 0x9d: + case 0x9e: + case 0x9f: + soundEvent(address&0xFF, b); + break; + default: + if(address & 1) + CPUUpdateRegister(address & 0x3fe, + ((READ16LE(((uint16 *)&ioMem[address & 0x3fe]))) + & 0x00FF) | + b<<8); + else + CPUUpdateRegister(address & 0x3fe, + ((READ16LE(((uint16 *)&ioMem[address & 0x3fe])) & 0xFF00) | b)); + } + break; + } else goto unwritable; + break; + case 5: + // no need to switch + *((uint16 *)&paletteRAM[address & 0x3FE]) = (b << 8) | b; + break; + case 6: + address = (address & 0x1fffe); + if (((DISPCNT & 7) >2) && ((address & 0x1C000) == 0x18000)) + return; + if ((address & 0x18000) == 0x18000) + address &= 0x17fff; + // no need to switch + // byte writes to OBJ VRAM are ignored + if ((address) < objTilesAddress[((DISPCNT&7)+1)>>2]) + *((uint16 *)&vram[address]) = (b << 8) | b; + break; + case 7: + // no need to switch + // byte writes to OAM are ignored + // *((uint16 *)&oam[address & 0x3FE]) = (b << 8) | b; + break; + + case 0xD: + if(cpuEEPROMEnabled) { + eepromWrite(address, b); + break; + } + goto unwritable; + + case 0xE: + FLASH_SRAM_Write(address, b); + break; + + // default + default: + unwritable: + break; + } +} + +uint8 cpuBitsSet[256]; +uint8 cpuLowestBitSet[256]; + +static void CPUInit(const std::string &bios_fn) +{ + FlashSizeSet = FALSE; + + cpuSramEnabled = true; + cpuFlashEnabled = true; + cpuEEPROMEnabled = true; + cpuEEPROMSensorEnabled = true; + + try + { + FileStream memfp(MDFN_MakeFName(MDFNMKF_SAV, 0, "type"), FileStream::MODE_READ); + std::string linebuffer; + + // + // + // + + cpuSramEnabled = FALSE; + cpuFlashEnabled = FALSE; + cpuEEPROMEnabled = FALSE; + cpuEEPROMSensorEnabled = FALSE; + + linebuffer.reserve(256); + + while(memfp.get_line(linebuffer) >= 0) + { + char args[2][256]; + int acount = trio_sscanf(linebuffer.c_str(), "%255s %255s", args[0], args[1]); + + if(acount < 1) + continue; + + //MDFN_printf(_("Backup memory type override: %s %s\n"), args[0], (acount > 1) ? args[1] : ""); + + if(!strcasecmp(args[0], "sram")) + { + cpuSramEnabled = TRUE; + } + else if(!strcasecmp(args[0], "flash")) + { + cpuFlashEnabled = TRUE; + if(acount == 2) + { + int size_temp = atoi(args[1]); + + if(size_temp == 0x10000 || size_temp == 0x20000) + { + flashSetSize(size_temp); + FlashSizeSet = TRUE; + } + else if(size_temp == 64 || size_temp == 128) + { + flashSetSize(size_temp * 1024); + FlashSizeSet = TRUE; + } + else + puts("Flash size error"); + } + } + else if(!strcasecmp(args[0], "eeprom")) + cpuEEPROMEnabled = TRUE; + else if(!strcasecmp(args[0], "sensor")) + cpuEEPROMSensorEnabled = TRUE; + else if(!strcasecmp(args[0], "rtc")) + GBA_RTC = new RTC(); + } + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + + useBios = false; + + if(bios_fn != "" && bios_fn != "0" && bios_fn != "none") + { + static const FileExtensionSpecStruct KnownBIOSExtensions[] = + { + { ".gba", gettext_noop("GameBoy Advance ROM Image") }, + { ".agb", gettext_noop("GameBoy Advance ROM Image") }, + { ".bin", gettext_noop("GameBoy Advance ROM Image") }, + { ".bios", gettext_noop("BIOS Image") }, + { NULL, NULL } + }; + MDFNFILE bios_fp(MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, bios_fn.c_str()).c_str(), KnownBIOSExtensions, _("GBA BIOS")); + + if(bios_fp.size() != 0x4000) + throw MDFN_Error(0, _("Invalid BIOS file size")); + + bios_fp.read(bios, 0x4000); + useBios = true; + } + + if(!useBios) + { + memcpy(bios, myROM, sizeof(myROM)); + Endian_A32_NE_LE(bios, sizeof(myROM) / 4); + } + + int i = 0; + + biosProtected[0] = 0x00; + biosProtected[1] = 0xf0; + biosProtected[2] = 0x29; + biosProtected[3] = 0xe1; + + for(i = 0; i < 256; i++) { + int count = 0; + int j; + for(j = 0; j < 8; j++) + if(i & (1 << j)) + count++; + cpuBitsSet[i] = count; + + for(j = 0; j < 8; j++) + if(i & (1 << j)) + break; + cpuLowestBitSet[i] = j; + } + + for(i = 0; i < 0x400; i++) + ioReadable[i] = true; + for(i = 0x10; i < 0x48; i++) + ioReadable[i] = false; + for(i = 0x4c; i < 0x50; i++) + ioReadable[i] = false; + for(i = 0x54; i < 0x60; i++) + ioReadable[i] = false; + for(i = 0x8c; i < 0x90; i++) + ioReadable[i] = false; + for(i = 0xa0; i < 0xb8; i++) + ioReadable[i] = false; + for(i = 0xbc; i < 0xc4; i++) + ioReadable[i] = false; + for(i = 0xc8; i < 0xd0; i++) + ioReadable[i] = false; + for(i = 0xd4; i < 0xdc; i++) + ioReadable[i] = false; + for(i = 0xe0; i < 0x100; i++) + ioReadable[i] = false; + for(i = 0x110; i < 0x120; i++) + ioReadable[i] = false; + for(i = 0x12c; i < 0x130; i++) + ioReadable[i] = false; + for(i = 0x138; i < 0x140; i++) + ioReadable[i] = false; + for(i = 0x144; i < 0x150; i++) + ioReadable[i] = false; + for(i = 0x15c; i < 0x200; i++) + ioReadable[i] = false; + for(i = 0x20c; i < 0x300; i++) + ioReadable[i] = false; + for(i = 0x304; i < 0x400; i++) + ioReadable[i] = false; + + if(romSize < 0x1fe2000) { + *((uint16 *)&rom[0x1fe209c]) = 0xdffa; // SWI 0xFA + *((uint16 *)&rom[0x1fe209e]) = 0x4770; // BX LR + } else { + + } +} + +static void CPUReset(void) MDFN_COLD; +static void CPUReset(void) +{ + if(GBA_RTC) + GBA_RTC->Reset(); + + // clean registers + memset(®[0], 0, sizeof(reg)); + // clean OAM + memset(oam, 0, 0x400); + // clean palette + memset(paletteRAM, 0, 0x400); + // clean vram + memset(vram, 0, 0x20000); + // clean io memory + memset(ioMem, 0, 0x400); + // + memset(internalRAM, 0, 0x8000); + + if(!gsf_loader) + { + memset(workRAM, 0x00, 0x40000); + } + + DISPCNT = 0x0080; + DISPSTAT = 0x0000; + VCOUNT = (useBios && !skipBios) ? 0 :0x007E; + BG0CNT = 0x0000; + BG1CNT = 0x0000; + BG2CNT = 0x0000; + BG3CNT = 0x0000; + + for(int i = 0; i < 4; i++) + { + BGHOFS[i] = 0; + BGVOFS[i] = 0; + } + + BG2PA = 0x0100; + BG2PB = 0x0000; + BG2PC = 0x0000; + BG2PD = 0x0100; + BG2X_L = 0x0000; + BG2X_H = 0x0000; + BG2Y_L = 0x0000; + BG2Y_H = 0x0000; + BG3PA = 0x0100; + BG3PB = 0x0000; + BG3PC = 0x0000; + BG3PD = 0x0100; + BG3X_L = 0x0000; + BG3X_H = 0x0000; + BG3Y_L = 0x0000; + BG3Y_H = 0x0000; + WIN0H = 0x0000; + WIN1H = 0x0000; + WIN0V = 0x0000; + WIN1V = 0x0000; + WININ = 0x0000; + WINOUT = 0x0000; + MOSAIC = 0x0000; + BLDMOD = 0x0000; + COLEV = 0x0000; + COLY = 0x0000; + + for(int i = 0; i < 4; i++) + DMSAD_L[i] = DMSAD_H[i] = 0; + + for(int i = 0; i < 4; i++) + { + timers[i].D = 0; + timers[i].CNT = 0; + } + + P1 = 0x03FF; + IE = 0x0000; + IF = 0x0000; + IME = 0x0000; + + armMode = 0x1F; + + if(cpuIsMultiBoot) { + reg[13].I = 0x03007F00; + reg[15].I = 0x02000000; + reg[16].I = 0x00000000; + reg[R13_IRQ].I = 0x03007FA0; + reg[R13_SVC].I = 0x03007FE0; + armIrqEnable = true; + } else { + if(useBios && !skipBios) { + reg[15].I = 0x00000000; + armMode = 0x13; + armIrqEnable = false; + } else { + reg[13].I = 0x03007F00; + reg[15].I = 0x08000000; + reg[16].I = 0x00000000; + reg[R13_IRQ].I = 0x03007FA0; + reg[R13_SVC].I = 0x03007FE0; + armIrqEnable = true; + } + } + armState = true; + C_FLAG = false; + V_FLAG = false; + N_FLAG = false; + Z_FLAG = false; + + UPDATE_REG(0x00, DISPCNT); + UPDATE_REG(0x06, VCOUNT); + UPDATE_REG(0x20, BG2PA); + UPDATE_REG(0x26, BG2PD); + UPDATE_REG(0x30, BG3PA); + UPDATE_REG(0x36, BG3PD); + UPDATE_REG(0x130, P1); + UPDATE_REG(0x88, 0x200); + + // disable FIQ + reg[16].I |= 0x40; + + CPUUpdateCPSR(); + + armNextPC = reg[15].I; + reg[15].I += 4; + + // reset internal state + holdState = false; + holdType = 0; + + biosProtected[0] = 0x00; + biosProtected[1] = 0xf0; + biosProtected[2] = 0x29; + biosProtected[3] = 0xe1; + + lcdTicks = (useBios && !skipBios) ? 1008 : 208; + + for(int i = 0; i < 4; i++) + { + timers[i].On = false; + timers[i].Ticks = 0; + timers[i].Reload = 0; + timers[i].ClockReload = 0; + } + + dmaSource[0] = 0; + dmaDest[0] = 0; + dmaSource[1] = 0; + dmaDest[1] = 0; + dmaSource[2] = 0; + dmaDest[2] = 0; + dmaSource[3] = 0; + dmaDest[3] = 0; + + renderLine = mode0RenderLine; + fxOn = false; + windowOn = false; + saveType = 0; + layerEnable = DISPCNT & layerSettings; + + CPUUpdateRenderBuffers(true); + + for(int i = 0; i < 256; i++) { + map[i].address = (uint8 *)&dummyAddress; + map[i].mask = 0; + } + + map[0].address = bios; + map[0].mask = 0x3FFF; + map[2].address = workRAM; + map[2].mask = 0x3FFFF; + map[3].address = internalRAM; + map[3].mask = 0x7FFF; + map[4].address = ioMem; + map[4].mask = 0x3FF; + map[5].address = paletteRAM; + map[5].mask = 0x3FF; + map[6].address = vram; + map[6].mask = 0x1FFFF; + map[7].address = oam; + map[7].mask = 0x3FF; + map[8].address = rom; + map[8].mask = 0x1FFFFFF; + map[9].address = rom; + map[9].mask = 0x1FFFFFF; + map[10].address = rom; + map[10].mask = 0x1FFFFFF; + map[12].address = rom; + map[12].mask = 0x1FFFFFF; + map[14].address = flashSaveMemory; + map[14].mask = 0xFFFF; + + EEPROM_Reset(); + Flash_Reset(); + + soundReset(); + + CPUUpdateWindow0(); + CPUUpdateWindow1(); + + // make sure registers are correctly initialized if not using BIOS + if(!useBios) { + if(cpuIsMultiBoot) + BIOS_RegisterRamReset(0xfe); + else + BIOS_RegisterRamReset(0xff); + } else { + if(cpuIsMultiBoot) + BIOS_RegisterRamReset(0xfe); + } + + ARM_PREFETCH; + + cpuDmaHack = false; + + SWITicks = 0; +} + +void CPUInterrupt() +{ + uint32 PC = reg[15].I; + bool savedState = armState; + CPUSwitchMode(0x12, true, false); + reg[14].I = PC; + if(!savedState) + reg[14].I += 2; + reg[15].I = 0x18; + armState = true; + armIrqEnable = false; + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + + // if(!holdState) + biosProtected[0] = 0x02; + biosProtected[1] = 0xc0; + biosProtected[2] = 0x5e; + biosProtected[3] = 0xe5; +} + +uint32 soundTS = 0; +static uint8 *padq; + +static void SetInput(unsigned port, const char *type, uint8 *ptr) MDFN_COLD; +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + padq = (uint8*)ptr; +} + +int32 MDFNGBA_GetTimerPeriod(int which) +{ + int32 ret = ((0x10000 - timers[which].Reload) << timers[which].ClockReload); +// printf("%d, %08x\n", ret, timers[which].Reload); + return(ret); +} + +static int frameready; +static int HelloSkipper; + +static void CPULoop(EmulateSpecStruct* espec, int ticks) +{ + MDFN_Surface* surface = espec->surface; + int clockTicks; + int timerOverflow = 0; + // variable used by the CPU core + cpuTotalTicks = 0; + cpuBreakLoop = false; + cpuNextEvent = CPUUpdateTicks(); + if(cpuNextEvent > ticks) + cpuNextEvent = ticks; + + + for(;;) { + if(!holdState && !SWITicks) { + if(armState) { + clockTicks = RunARM(); + } else { + clockTicks = RunTHUMB(); + } + } else + clockTicks = CPUUpdateTicks(); + + cpuTotalTicks += clockTicks; + + if(cpuTotalTicks >= cpuNextEvent) { + int remainingTicks = cpuTotalTicks - cpuNextEvent; + + if (SWITicks) + { + SWITicks-=clockTicks; + if (SWITicks<0) + SWITicks = 0; + } + + clockTicks = cpuNextEvent; + cpuTotalTicks = 0; + cpuDmaHack = false; + + updateLoop: + + if (IRQTicks) + { + IRQTicks -= clockTicks; + if (IRQTicks<0) + IRQTicks = 0; + } + soundTS += clockTicks; + lcdTicks -= clockTicks; + + + if(lcdTicks <= 0) { + if(DISPSTAT & 1) { // V-BLANK + // if in V-Blank mode, keep computing... + if(DISPSTAT & 2) { + lcdTicks += 1008; + VCOUNT++; + UPDATE_REG(0x06, VCOUNT); + DISPSTAT &= 0xFFFD; + UPDATE_REG(0x04, DISPSTAT); + CPUCompareVCOUNT(); + } else { + lcdTicks += 224; + DISPSTAT |= 2; + UPDATE_REG(0x04, DISPSTAT); + if(DISPSTAT & 16) { + IF |= 2; + UPDATE_REG(0x202, IF); + } + } + + if(VCOUNT >= 228) { //Reaching last line + DISPSTAT &= 0xFFFC; + UPDATE_REG(0x04, DISPSTAT); + VCOUNT = 0; + UPDATE_REG(0x06, VCOUNT); + CPUCompareVCOUNT(); + } + } else { + if(DISPSTAT & 2) { + // if in H-Blank, leave it and move to drawing mode + VCOUNT++; + UPDATE_REG(0x06, VCOUNT); + + lcdTicks += 1008; + DISPSTAT &= 0xFFFD; + if(VCOUNT == 160) + { + //ticks = 0; + //puts("VBlank"); + uint32 joy = padbufblah; + P1 = 0x03FF ^ (joy & 0x3FF); + //if(cpuEEPROMSensorEnabled) + //systemUpdateMotionSensor(); + UPDATE_REG(0x130, P1); + uint16 P1CNT = READ16LE(((uint16 *)&ioMem[0x132])); + // this seems wrong, but there are cases where the game + // can enter the stop state without requesting an IRQ from + // the joypad. + if((P1CNT & 0x4000) || stopState) { + uint16 p1 = (0x3FF ^ P1) & 0x3FF; + if(P1CNT & 0x8000) { + if(p1 == (P1CNT & 0x3FF)) { + IF |= 0x1000; + UPDATE_REG(0x202, IF); + } + } else { + if(p1 & P1CNT) { + IF |= 0x1000; + UPDATE_REG(0x202, IF); + } + } + } + + + DISPSTAT |= 1; + DISPSTAT &= 0xFFFD; + UPDATE_REG(0x04, DISPSTAT); + if(DISPSTAT & 0x0008) { + IF |= 1; + UPDATE_REG(0x202, IF); + } + CPUCheckDMA(1, 0x0f); + } + + UPDATE_REG(0x04, DISPSTAT); + CPUCompareVCOUNT(); + + } else { + if(!HelloSkipper) + { + //printf("RL: %d\n", VCOUNT); + const uint32 *src = lineMix; + + (*renderLine)(); + + if(surface->format.bpp == 32) + { + const uint32* cm = systemColorMap->v32; + uint32 *dest = surface->pixels + VCOUNT * surface->pitch32; + + for(int x = 120; x; x--) + { + *dest = cm[*src & 0xFFFF]; + dest++; + src++; + *dest = cm[*src & 0xFFFF]; + dest++; + src++; + } + } + else + { + const uint16* cm = systemColorMap->v16; + uint16* dest = surface->pixels16 + VCOUNT * surface->pitchinpix; + + for(int x = 0; x < 240; x += 2) + { + dest[x + 0] = cm[(uint16)src[x + 0]]; + dest[x + 1] = cm[(uint16)src[x + 1]]; + } + } + MDFN_MidLineUpdate(espec, VCOUNT); + } + // entering H-Blank + DISPSTAT |= 2; + UPDATE_REG(0x04, DISPSTAT); + lcdTicks += 224; + CPUCheckDMA(2, 0x0f); + if(DISPSTAT & 16) { + IF |= 2; + UPDATE_REG(0x202, IF); + } + if(VCOUNT == 159) + { + frameready = 1; + cpuBreakLoop = 1; + } + } + } + } + + if(!stopState) { + if(timers[0].On) { + timers[0].Ticks -= clockTicks; + if(timers[0].Ticks <= 0) { + timers[0].Ticks += (0x10000 - timers[0].Reload) << timers[0].ClockReload; + timerOverflow |= 1; + soundTimerOverflow(0); + if(timers[0].CNT & 0x40) { + IF |= 0x08; + UPDATE_REG(0x202, IF); + } + } + timers[0].D = 0xFFFF - (timers[0].Ticks >> timers[0].ClockReload); + UPDATE_REG(0x100, timers[0].D); + } + + if(timers[1].On) { + if(timers[1].CNT & 4) { + if(timerOverflow & 1) { + timers[1].D++; + if(timers[1].D == 0) { + timers[1].D += timers[1].Reload; + timerOverflow |= 2; + soundTimerOverflow(1); + if(timers[1].CNT & 0x40) { + IF |= 0x10; + UPDATE_REG(0x202, IF); + } + } + UPDATE_REG(0x104, timers[1].D); + } + } else { + timers[1].Ticks -= clockTicks; + if(timers[1].Ticks <= 0) { + timers[1].Ticks += (0x10000 - timers[1].Reload) << timers[1].ClockReload; + timerOverflow |= 2; + soundTimerOverflow(1); + if(timers[1].CNT & 0x40) { + IF |= 0x10; + UPDATE_REG(0x202, IF); + } + } + timers[1].D = 0xFFFF - (timers[1].Ticks >> timers[1].ClockReload); + UPDATE_REG(0x104, timers[1].D); + } + } + + if(timers[2].On) { + if(timers[2].CNT & 4) { + if(timerOverflow & 2) { + timers[2].D++; + if(timers[2].D == 0) { + timers[2].D += timers[2].Reload; + timerOverflow |= 4; + if(timers[2].CNT & 0x40) { + IF |= 0x20; + UPDATE_REG(0x202, IF); + } + } + UPDATE_REG(0x108, timers[2].D); + } + } else { + timers[2].Ticks -= clockTicks; + if(timers[2].Ticks <= 0) { + timers[2].Ticks += (0x10000 - timers[2].Reload) << timers[2].ClockReload; + timerOverflow |= 4; + if(timers[2].CNT & 0x40) { + IF |= 0x20; + UPDATE_REG(0x202, IF); + } + } + timers[2].D = 0xFFFF - (timers[2].Ticks >> timers[2].ClockReload); + UPDATE_REG(0x108, timers[2].D); + } + } + + if(timers[3].On) { + if(timers[3].CNT & 4) { + if(timerOverflow & 4) { + timers[3].D++; + if(timers[3].D == 0) { + timers[3].D += timers[3].Reload; + if(timers[3].CNT & 0x40) { + IF |= 0x40; + UPDATE_REG(0x202, IF); + } + } + UPDATE_REG(0x10C, timers[3].D); + } + } else { + timers[3].Ticks -= clockTicks; + if(timers[3].Ticks <= 0) { + timers[3].Ticks += (0x10000 - timers[3].Reload) << timers[3].ClockReload; + if(timers[3].CNT & 0x40) { + IF |= 0x40; + UPDATE_REG(0x202, IF); + } + } + timers[3].D = 0xFFFF - (timers[3].Ticks >> timers[3].ClockReload); + UPDATE_REG(0x10C, timers[3].D); + } + } + } + + timerOverflow = 0; + + ticks -= clockTicks; + + cpuNextEvent = CPUUpdateTicks(); + + if(cpuDmaTicksToUpdate > 0) { + if(cpuDmaTicksToUpdate > cpuNextEvent) + clockTicks = cpuNextEvent; + else + clockTicks = cpuDmaTicksToUpdate; + cpuDmaTicksToUpdate -= clockTicks; + if(cpuDmaTicksToUpdate < 0) + cpuDmaTicksToUpdate = 0; + cpuDmaHack = true; + goto updateLoop; + } + + if(IF && (IME & 1) && armIrqEnable) { + int res = IF & IE; + if(stopState) + res &= 0x3080; + if(res) { + if (intState) + { + if (!IRQTicks) + { + CPUInterrupt(); + intState = false; + holdState = false; + stopState = false; + holdType = 0; + } + } + else + { + if (!holdState) + { + intState = true; + IRQTicks=7; + if (cpuNextEvent> IRQTicks) + cpuNextEvent = IRQTicks; + } + else + { + CPUInterrupt(); + holdState = false; + stopState = false; + holdType = 0; + } + } + + // Stops the SWI Ticks emulation if an IRQ is executed + //(to avoid problems with nested IRQ/SWI) + if (SWITicks) + SWITicks = 0; + } + } + + if(remainingTicks > 0) { + if(remainingTicks > cpuNextEvent) + clockTicks = cpuNextEvent; + else + clockTicks = remainingTicks; + remainingTicks -= clockTicks; + if(remainingTicks < 0) + remainingTicks = 0; + goto updateLoop; + } + + if (timerOnOffDelay) + applyTimer(); + + if(cpuNextEvent > ticks) + cpuNextEvent = ticks; + + if(ticks <= 0 || cpuBreakLoop) + break; + + } + } +} + +static void Emulate(EmulateSpecStruct *espec) +{ + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.w = 240; + espec->DisplayRect.h = 160; + +#if 0 + { + static bool firstcat = true; + MDFN_PixelFormat nf; + + nf.bpp = 16; + nf.colorspace = MDFN_COLORSPACE_RGB; + nf.Rshift = 11; + nf.Gshift = 5; + nf.Bshift = 0; + nf.Ashift = 16; + + nf.Rprec = 5; + nf.Gprec = 5; + nf.Bprec = 5; + nf.Aprec = 8; + + espec->surface->SetFormat(nf, false); + espec->VideoFormatChanged = firstcat; + firstcat = false; + } +#endif + + if(espec->VideoFormatChanged) + RedoColorMap(espec->surface->format, espec->CustomPalette); + + if(espec->SoundFormatChanged) + MDFNGBA_SetSoundRate(espec->SoundRate); + + #if 0 + int cursong = workRAM[0x2020c96- (0x2 << 24)]; + static int last_song = 0; + + if(cursong != last_song) + { + if(last_song == 250) + { + MDFNI_EndWaveRecord(); + exit(1); + } + else + { + char wavepath[256]; + if(last_song != 0) + MDFNI_EndWaveRecord(); + trio_snprintf(wavepath, 256, "/meow/mother3-%d.wav", cursong); + MDFNI_BeginWaveRecord(FSettings.SndRate, 2, wavepath); + } + last_song = cursong; + } + #endif + + padbufblah = padq[0] | (padq[1] << 8); + + frameready = 0; + + HelloSkipper = espec->skip; + + if(gsf_loader) + HelloSkipper = 1; + + if(!gsf_loader) + MDFNMP_ApplyPeriodicCheats(); + + while(!frameready && (soundTS < 300000)) + CPULoop(espec, 300000); + + if(GBA_RTC) + GBA_RTC->AddTime(soundTS); + + espec->MasterCycles = soundTS; + + espec->SoundBufSize = MDFNGBASOUND_Flush(espec->SoundBuf, espec->SoundBufMaxSize); + + if(gsf_loader) + Player_Draw(espec->surface, &espec->DisplayRect, 0, espec->SoundBuf, espec->SoundBufSize); +} + +static void SetLayerEnableMask(uint64 mask) +{ + layerSettings = mask << 8; + layerEnable = layerSettings & DISPCNT; + + CPUUpdateRender(); + CPUUpdateRenderBuffers(true); + CPUUpdateWindow0(); + CPUUpdateWindow1(); +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: + case MDFN_MSC_RESET: CPUReset(); break; + } +} + +static MDFNSetting GBASettings[] = +{ + { "gba.bios", MDFNSF_EMU_STATE, gettext_noop("Path to optional GBA BIOS ROM image."), NULL, MDFNST_STRING, "" }, + { NULL } +}; + +static const IDIISG IDII = +{ + { "a", "A", /*VIRTB_1,*/ 7, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "b", "B", /*VIRTB_0,*/ 6, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "select", "SELECT", /*VIRTB_SELECT,*/ 4, IDIT_BUTTON, NULL }, + + { "start", "START", /*VIRTB_START,*/ 5, IDIT_BUTTON, NULL }, + + { "right", "RIGHT →", /*VIRTB_DP0_R,*/ 3, IDIT_BUTTON, "left" }, + + { "left", "LEFT ←", /*VIRTB_DP0_L,*/ 2, IDIT_BUTTON, "right" }, + + { "up", "UP ↑", /*VIRTB_DP0_U,*/ 0, IDIT_BUTTON, "down" }, + + { "down", "DOWN ↓", /*VIRTB_DP0_D,*/ 1, IDIT_BUTTON, "up" }, + + { "shoulder_r", "SHOULDER R", /*VIRTB_SHLDR_L,*/ 9, IDIT_BUTTON, NULL }, + + { "shoulder_l", "SHOULDER L", /*VIRTB_SHLDR_R,*/ 8, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + IDII, + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo, "gamepad" } +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".gsf", gettext_noop("GSF Rip") }, + { ".minigsf", gettext_noop("MiniGSF Rip") }, + { ".gba", gettext_noop("GameBoy Advance ROM Image") }, + { ".agb", gettext_noop("GameBoy Advance ROM Image") }, + { ".bin", gettext_noop("GameBoy Advance ROM Image") }, + { NULL, NULL } +}; + +static const CustomPalette_Spec CPInfo[] = +{ + { gettext_noop("GBA 15-bit RGB"), NULL, { 32768, 0 } }, + + { NULL, NULL } +}; + +} + +using namespace MDFN_IEN_GBA; + +MDFNGI EmulatedGBA = +{ + "gba", + "GameBoy Advance", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + SetLayerEnableMask, + "BG0\0BG1\0BG2\0BG3\0OBJ\0WIN 0\0WIN 1\0OBJ WIN\0", + + NULL, + NULL, + + CPInfo, + 1 << 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + GBASettings, + MDFN_MASTERCLOCK_FIXED(16777216), + (uint32)((double)4194304 / 70224 * 65536 * 256), + + false, // Multires possible? + + 240, // lcm_width + 160, // lcm_height + NULL, // Dummy + + 240, // Nominal width + 160, // Nominal height + + 240, // Framebuffer width + 160, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/gba/GBA.h b/Mednafen/mednafen/gba/GBA.h new file mode 100644 index 0000000000..19ffd1f224 --- /dev/null +++ b/Mednafen/mednafen/gba/GBA.h @@ -0,0 +1,156 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_GBA_H +#define VBA_GBA_H + +#include +#include + +namespace MDFN_IEN_GBA +{ + +typedef struct { + uint8 *address; + uint32 mask; +} memoryMap; + +typedef union { + struct { +#ifdef MSB_FIRST + uint8 B3; + uint8 B2; + uint8 B1; + uint8 B0; +#else + uint8 B0; + uint8 B1; + uint8 B2; + uint8 B3; +#endif + } B; + struct { +#ifdef MSB_FIRST + uint16 W1; + uint16 W0; +#else + uint16 W0; + uint16 W1; +#endif + } W; +#ifdef MSB_FIRST + volatile uint32 I; +#else + uint32 I; +#endif +} reg_pair; + +#ifndef NO_GBA_MAP +extern memoryMap map[256]; +#endif + +extern bool busPrefetch; +extern bool busPrefetchEnable; +extern uint32 busPrefetchCount; +extern uint32 cpuPrefetch[2]; + + +extern uint8 memoryWait[16]; +extern uint8 memoryWait32[16]; +extern uint8 memoryWaitSeq[16]; +extern uint8 memoryWaitSeq32[16]; + +extern reg_pair reg[45]; +extern uint8 biosProtected[4]; + +extern uint32 N_FLAG; +extern bool Z_FLAG; +extern bool C_FLAG; +extern bool V_FLAG; +extern bool armIrqEnable; +extern bool armState; +extern int armMode; +extern void (*cpuSaveGameFunc)(uint32,uint8); + +extern void doMirroring(bool); +extern void CPUUpdateRegister(uint32, uint16); +extern void applyTimer (); + +void CPUWriteMemory(uint32 address, uint32 value); +void CPUWriteHalfWord(uint32, uint16); +void CPUWriteByte(uint32, uint8); + +extern void CPUCheckDMA(int,int); + +extern void CPUSwitchMode(int mode, bool saveState, bool breakLoop); +extern void CPUSwitchMode(int mode, bool saveState); +extern void CPUUndefinedException(); +extern void CPUSoftwareInterrupt(); +extern void CPUSoftwareInterrupt(int comment); +extern void CPUCompareVCOUNT(); +extern void CPUUpdateCPSR(); +extern void CPUUpdateFlags(bool breakLoop); +extern void CPUUpdateFlags(); + + +extern uint8 cpuBitsSet[256]; +extern uint8 cpuLowestBitSet[256]; + +extern struct EmulatedSystem GBASystem; + +int32 MDFNGBA_GetTimerPeriod(int which); + + +#define R13_IRQ 18 +#define R14_IRQ 19 +#define SPSR_IRQ 20 +#define R13_USR 26 +#define R14_USR 27 +#define R13_SVC 28 +#define R14_SVC 29 +#define SPSR_SVC 30 +#define R13_ABT 31 +#define R14_ABT 32 +#define SPSR_ABT 33 +#define R13_UND 34 +#define R14_UND 35 +#define SPSR_UND 36 +#define R8_FIQ 37 +#define R9_FIQ 38 +#define R10_FIQ 39 +#define R11_FIQ 40 +#define R12_FIQ 41 +#define R13_FIQ 42 +#define R14_FIQ 43 +#define SPSR_FIQ 44 +} + +#include "Globals.h" +#include "eeprom.h" +#include "flash.h" +#include "RTC.h" + +namespace MDFN_IEN_GBA +{ + +extern RTC *GBA_RTC; + +} + +#endif //VBA_GBA_H diff --git a/Mednafen/mednafen/gba/GBAinline.cpp b/Mednafen/mednafen/gba/GBAinline.cpp new file mode 100644 index 0000000000..8e27224a8d --- /dev/null +++ b/Mednafen/mednafen/gba/GBAinline.cpp @@ -0,0 +1,285 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Port.h" +#include "RTC.h" +#include "GBAinline.h" + +namespace MDFN_IEN_GBA +{ + +uint32 CPUReadMemory(uint32 address) +{ + uint32 value; + + switch(address >> 24) + { + case 0: + if(reg[15].I >> 24) + { + if(address < 0x4000) + { + value = READ32LE(((uint32 *)&biosProtected)); + } + else goto unreadable; + } + else + value = READ32LE(((uint32 *)&bios[address & 0x3FFC])); + break; + case 2: + value = READ32LE(((uint32 *)&workRAM[address & 0x3FFFC])); + break; + case 3: + value = READ32LE(((uint32 *)&internalRAM[address & 0x7ffC])); + break; + case 4: + if((address < 0x4000400) && ioReadable[address & 0x3fc]) { + if(ioReadable[(address & 0x3fc) + 2]) + value = READ32LE(((uint32 *)&ioMem[address & 0x3fC])); + else + value = READ16LE(((uint16 *)&ioMem[address & 0x3fc])); + } else goto unreadable; + break; + case 5: + value = READ32LE(((uint32 *)&paletteRAM[address & 0x3fC])); + break; + case 6: + address = (address & 0x1fffc); + if (((DISPCNT & 7) >2) && ((address & 0x1C000) == 0x18000)) + { + value = 0; + break; + } + if ((address & 0x18000) == 0x18000) + address &= 0x17fff; + value = READ32LE(((uint32 *)&vram[address])); + break; + case 7: + value = READ32LE(((uint32 *)&oam[address & 0x3FC])); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + value = READ32LE(((uint32 *)&rom[address&0x1FFFFFC])); + break; + case 13: + if(cpuEEPROMEnabled) + // no need to swap this + return eepromRead(address); + goto unreadable; + case 14: + if(cpuFlashEnabled | cpuSramEnabled) + // no need to swap this + return flashRead(address); + // default + + default: + unreadable: + if(cpuDmaHack) { + value = cpuDmaLast; + } else { + if(armState) { + value = CPUReadMemoryQuick(reg[15].I); + } else { + value = CPUReadHalfWordQuick(reg[15].I) | + CPUReadHalfWordQuick(reg[15].I) << 16; + } + } + } + + if(address & 3) { + int shift = (address & 3) << 3; + value = (value >> shift) | (value << (32 - shift)); + } + return value; +} + +uint32 CPUReadHalfWord(uint32 address) +{ + uint32 value; + + switch(address >> 24) { + case 0: + if (reg[15].I >> 24) { + if(address < 0x4000) { + value = READ16LE(((uint16 *)&biosProtected[address&2])); + } else goto unreadable; + } else + value = READ16LE(((uint16 *)&bios[address & 0x3FFE])); + break; + case 2: + value = READ16LE(((uint16 *)&workRAM[address & 0x3FFFE])); + break; + case 3: + value = READ16LE(((uint16 *)&internalRAM[address & 0x7ffe])); + break; + case 4: + if((address < 0x4000400) && ioReadable[address & 0x3fe]) + { + value = READ16LE(((uint16 *)&ioMem[address & 0x3fe])); + if (((address & 0x3fe)>0xFF) && ((address & 0x3fe)<0x10E)) + { + if (((address & 0x3fe) == 0x100) && timers[0].On) + value = 0xFFFF - ((timers[0].Ticks-cpuTotalTicks) >> timers[0].ClockReload); + else + if (((address & 0x3fe) == 0x104) && timers[1].On && !(timers[1].CNT & 4)) + value = 0xFFFF - ((timers[1].Ticks-cpuTotalTicks) >> timers[1].ClockReload); + else + if (((address & 0x3fe) == 0x108) && timers[2].On && !(timers[2].CNT & 4)) + value = 0xFFFF - ((timers[2].Ticks-cpuTotalTicks) >> timers[2].ClockReload); + else + if (((address & 0x3fe) == 0x10C) && timers[3].On && !(timers[3].CNT & 4)) + value = 0xFFFF - ((timers[3].Ticks-cpuTotalTicks) >> timers[3].ClockReload); + } + } + else goto unreadable; + break; + case 5: + value = READ16LE(((uint16 *)&paletteRAM[address & 0x3fe])); + break; + case 6: + address = (address & 0x1fffe); + if (((DISPCNT & 7) >2) && ((address & 0x1C000) == 0x18000)) + { + value = 0; + break; + } + if ((address & 0x18000) == 0x18000) + address &= 0x17fff; + value = READ16LE(((uint16 *)&vram[address])); + break; + case 7: + value = READ16LE(((uint16 *)&oam[address & 0x3fe])); + break; + case 8: + case 9: + case 10: + case 11: + case 12: + if(GBA_RTC && (address == 0x80000c4 || address == 0x80000c6 || address == 0x80000c8)) + value = GBA_RTC->Read(address); + else + value = READ16LE(((uint16 *)&rom[address & 0x1FFFFFE])); + break; + case 13: + if(cpuEEPROMEnabled) + // no need to swap this + return eepromRead(address); + goto unreadable; + case 14: + if(cpuFlashEnabled | cpuSramEnabled) + // no need to swap this + return flashRead(address); + // default + default: + unreadable: + if(cpuDmaHack) { + value = cpuDmaLast & 0xFFFF; + } else { + if(armState) { + value = CPUReadHalfWordQuick(reg[15].I + (address & 2)); + } else { + value = CPUReadHalfWordQuick(reg[15].I); + } + } + break; + } + + if(address & 1) { + value = (value >> 8) | (value << 24); + } + + return value; +} + +uint8 CPUReadByte(uint32 address) +{ + switch(address >> 24) { + case 0: + if (reg[15].I >> 24) { + if(address < 0x4000) { + return biosProtected[address & 3]; + } else goto unreadable; + } + return bios[address & 0x3FFF]; + case 2: + return workRAM[address & 0x3FFFF]; + case 3: + return internalRAM[address & 0x7fff]; + case 4: + if((address < 0x4000400) && ioReadable[address & 0x3ff]) + return ioMem[address & 0x3ff]; + else goto unreadable; + case 5: + return paletteRAM[address & 0x3ff]; + case 6: + address = (address & 0x1ffff); + if (((DISPCNT & 7) >2) && ((address & 0x1C000) == 0x18000)) + return 0; + if ((address & 0x18000) == 0x18000) + address &= 0x17fff; + return vram[address]; + case 7: + return oam[address & 0x3ff]; + case 8: + case 9: + case 10: + case 11: + case 12: + return rom[address & 0x1FFFFFF]; + case 13: + if(cpuEEPROMEnabled) + return eepromRead(address); + goto unreadable; + case 14: + if(cpuSramEnabled | cpuFlashEnabled) + return flashRead(address); + if(cpuEEPROMSensorEnabled) { + switch(address & 0x00008f00) { + case 0x8200: + //return systemGetSensorX() & 255; + case 0x8300: + //return (systemGetSensorX() >> 8)|0x80; + case 0x8400: + //return systemGetSensorY() & 255; + case 0x8500: + //return systemGetSensorY() >> 8; + return(0); + } + } + // default + default: + unreadable: + if(cpuDmaHack) { + return cpuDmaLast & 0xFF; + } else { + if(armState) { + return CPUReadByteQuick(reg[15].I+(address & 3)); + } else { + return CPUReadByteQuick(reg[15].I+(address & 1)); + } + } + break; + } +} + +} diff --git a/Mednafen/mednafen/gba/GBAinline.h b/Mednafen/mednafen/gba/GBAinline.h new file mode 100644 index 0000000000..64a885462c --- /dev/null +++ b/Mednafen/mednafen/gba/GBAinline.h @@ -0,0 +1,293 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_GBAinline_H +#define VBA_GBAinline_H + +#include "Port.h" +#include "RTC.h" +#include "sram.h" + +namespace MDFN_IEN_GBA +{ + +#ifdef INCED_FROM_ARM_CPP +#define EXCLUDE_ARM_FROM_INLINE +#else +#define EXCLUDE_ARM_FROM_INLINE INLINE +#endif + +extern bool cpuSramEnabled; +extern bool cpuFlashEnabled; +extern bool cpuEEPROMEnabled; +extern bool cpuEEPROMSensorEnabled; +extern bool cpuDmaHack; +extern uint32 cpuDmaLast; + +typedef struct +{ + uint16 Value; + bool On; + int32 Ticks; + int32 Reload; + int32 ClockReload; + uint16 D; + uint16 CNT; +} GBATimer; + +extern GBATimer timers[4]; + +extern int cpuTotalTicks; + +#define ARM_PREFETCH \ + {\ + cpuPrefetch[0] = CPUReadMemoryQuick(armNextPC);\ + cpuPrefetch[1] = CPUReadMemoryQuick(armNextPC+4);\ + } + +#define THUMB_PREFETCH \ + {\ + cpuPrefetch[0] = CPUReadHalfWordQuick(armNextPC);\ + cpuPrefetch[1] = CPUReadHalfWordQuick(armNextPC+2);\ + } + +#define ARM_PREFETCH_NEXT \ + cpuPrefetch[1] = CPUReadMemoryQuick(armNextPC+4); + +#define THUMB_PREFETCH_NEXT\ + cpuPrefetch[1] = CPUReadHalfWordQuick(armNextPC+2); + +#define CPUReadByteQuick(addr) \ + map[(addr)>>24].address[(addr) & map[(addr)>>24].mask] + +#define CPUReadHalfWordQuick(addr) \ + READ16LE(((uint16*)&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask])) + +#define CPUReadMemoryQuick(addr) \ + READ32LE(((uint32*)&map[(addr)>>24].address[(addr) & map[(addr)>>24].mask])) + +uint32 CPUReadMemory(uint32 address); + +uint32 CPUReadHalfWord(uint32 address); + +static INLINE uint16 CPUReadHalfWordSigned(uint32 address) +{ + uint16 value = CPUReadHalfWord(address); + if((address & 1)) + value = (int8)value; + return value; +} + +uint8 CPUReadByte(uint32 address); + +// Waitstates when accessing data +static EXCLUDE_ARM_FROM_INLINE int dataTicksAccesint16(uint32 address) // DATA 8/16bits NON SEQ +{ + int addr = (address>>24)&15; + int value = memoryWait[addr]; + + if (addr>=0x08) + { + busPrefetchCount=0; + busPrefetch=false; + } + else if (busPrefetch) + { + int waitState = value; + if (waitState>0) + waitState--; + waitState++; + busPrefetchCount = (busPrefetchCount<>(8-waitState)); + } + + return value; +} + +static EXCLUDE_ARM_FROM_INLINE int dataTicksAccesint32(uint32 address) // DATA 32bits NON SEQ +{ + int addr = (address>>24)&15; + int value = memoryWait32[addr]; + + if (addr>=0x08) + { + busPrefetchCount=0; + busPrefetch=false; + } + else if (busPrefetch) + { + int waitState = value; + if (waitState>0) + waitState--; + waitState++; + busPrefetchCount = (busPrefetchCount<>(8-waitState)); + } + + return value; +} + +static EXCLUDE_ARM_FROM_INLINE int dataTicksAccessSeq32(uint32 address)// DATA 32bits SEQ +{ + int addr = (address>>24)&15; + int value = memoryWaitSeq32[addr]; + + if (addr>=0x08) + { + busPrefetchCount=0; + busPrefetch=false; + } + else if (busPrefetch) + { + int waitState = value; + if (waitState>0) + waitState--; + waitState++; + busPrefetchCount = (busPrefetchCount<>(8-waitState)); + } + + return value; +} + +// Waitstates when executing opcode +static EXCLUDE_ARM_FROM_INLINE int codeTicksAccesint16(uint32 address) // THUMB NON SEQ +{ + int addr = (address>>24)&15; + + if ((addr>=0x08) && (addr<=0x0D)) + { + if ((busPrefetchCount&0x3) == 3) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + return 0; + } + else + if (busPrefetchCount&0x1) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + return memoryWaitSeq[addr]-1; + } + else + { + busPrefetchCount=0; + return memoryWait[addr]; + } + } + else + { + busPrefetchCount = 0; + return memoryWait[addr]; + } +} + +static EXCLUDE_ARM_FROM_INLINE int codeTicksAccesint32(uint32 address) // ARM NON SEQ +{ + int addr = (address>>24)&15; + + if ((addr>=0x08) && (addr<=0x0D)) + { + if (busPrefetchCount&0x1) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + if (busPrefetchCount&0x1) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + return 0; + } + else + { + busPrefetchCount = 0; + return memoryWaitSeq[addr]; + } + + } + else + { + busPrefetchCount = 0; + return memoryWait32[addr]; + } + } + else + { + busPrefetchCount = 0; + return memoryWait32[addr]; + } +} + +static EXCLUDE_ARM_FROM_INLINE int codeTicksAccessSeq16(uint32 address) // THUMB SEQ +{ + int addr = (address>>24)&15; + + if ((addr>=0x08) && (addr<=0x0D)) + { + if (busPrefetchCount&0x1) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + return 0; + } + else + if (busPrefetchCount>0xFF) + { + busPrefetchCount=0; + return memoryWait[addr]; + } + else + return memoryWaitSeq[addr]; + } + else + { + busPrefetchCount = 0; + return memoryWaitSeq[addr]; + } +} + +static EXCLUDE_ARM_FROM_INLINE int codeTicksAccessSeq32(uint32 address) // ARM SEQ +{ + int addr = (address>>24)&15; + + if ((addr>=0x08) && (addr<=0x0D)) + { + if (busPrefetchCount&0x1) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + if (busPrefetchCount&0x1) + { + busPrefetchCount=((busPrefetchCount&0xFF)>>1) | (busPrefetchCount&0xFFFFFF00); + return 0; + } + else + return memoryWaitSeq[addr]; + + } + else + if (busPrefetchCount>0xFF) + { + busPrefetchCount=0; + return memoryWait32[addr]; + } + else + return memoryWaitSeq32[addr]; + } + else + { + return memoryWaitSeq32[addr]; + } +} + +} + +#endif //VBA_GBAinline_H diff --git a/Mednafen/mednafen/gba/Gfx.cpp b/Mednafen/mednafen/gba/Gfx.cpp new file mode 100644 index 0000000000..ff6d14e1d7 --- /dev/null +++ b/Mednafen/mednafen/gba/Gfx.cpp @@ -0,0 +1,1409 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include + +#include "Gfx.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +int all_coeff[32] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 +}; + +uint32 AlphaClampLUT[64] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, + 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F +}; + + +alignas(16) uint32 line0[512]; +alignas(16) uint32 line1[512]; +alignas(16) uint32 line2[512]; +alignas(16) uint32 line3[512]; +alignas(16) uint32 lineOBJ[512]; +alignas(16) uint32 lineOBJWin[512]; +alignas(16) uint32 lineMix[512]; + +bool gfxInWin0[512]; +bool gfxInWin1[512]; + +int gfxBG2Changed = 0; +int gfxBG3Changed = 0; + +int gfxBG2X = 0; +int gfxBG2Y = 0; +int gfxBG2LastX = 0; +int gfxBG2LastY = 0; +int gfxBG3X = 0; +int gfxBG3Y = 0; +int gfxBG3LastX = 0; +int gfxBG3LastY = 0; +int gfxLastVCOUNT = 0; + +void gfxDrawTextScreen(uint16 control, uint16 hofs, uint16 vofs, + uint32 *line) +{ + uint16 *palette = (uint16 *)paletteRAM; + uint8 *charBase = &vram[((control >> 2) & 0x03) * 0x4000]; + uint16 *screenBase = (uint16 *)&vram[((control >> 8) & 0x1f) * 0x800]; + uint32 prio = ((control & 3)<<25) + 0x1000000; + int sizeX = 256; + int sizeY = 256; + switch((control >> 14) & 3) { + case 0: + break; + case 1: + sizeX = 512; + break; + case 2: + sizeY = 512; + break; + case 3: + sizeX = 512; + sizeY = 512; + break; + } + + int maskX = sizeX-1; + int maskY = sizeY-1; + + bool mosaicOn = (control & 0x40) ? true : false; + + int xxx = hofs & maskX; + int yyy = (vofs + VCOUNT) & maskY; + int mosaicX = (MOSAIC & 0x000F)+1; + int mosaicY = ((MOSAIC & 0x00F0)>>4)+1; + + if(mosaicOn) { + if((VCOUNT % mosaicY) != 0) { + mosaicY = (VCOUNT / mosaicY) * mosaicY; + yyy = (vofs + mosaicY) & maskY; + } + } + + if(yyy > 255 && sizeY > 256) { + yyy &= 255; + screenBase += 0x400; + if(sizeX > 256) + screenBase += 0x400; + } + + int yshift = ((yyy>>3)<<5); + if((control) & 0x80) + { + uint16 *screenSource = screenBase + 0x400 * (xxx>>8) + ((xxx & 255)>>3) + yshift; + for(int x = 0; x < 240; x++) { + uint16 data = READ16LE(screenSource); + + int tile = data & 0x3FF; + int tileX = (xxx & 7); + int tileY = yyy & 7; + + if(data & 0x0400) + tileX = 7 - tileX; + if(data & 0x0800) + tileY = 7 - tileY; + + uint8 color = charBase[tile * 64 + tileY * 8 + tileX]; + + line[x] = color ? (READ16LE(&palette[color]) | prio): 0x80000000; + + if(data & 0x0400) { + if(tileX == 0) + screenSource++; + } else if(tileX == 7) + screenSource++; + xxx++; + if(xxx == 256) { + if(sizeX > 256) + screenSource = screenBase + 0x400 + yshift; + else { + screenSource = screenBase + yshift; + xxx = 0; + } + } else if(xxx >= sizeX) { + xxx = 0; + screenSource = screenBase + yshift; + } + } + } + else + { + uint16 *screenSource = screenBase + 0x400*(xxx>>8)+((xxx&255)>>3) + yshift; + uint16 data = READ16LE(screenSource); + int tile = data & 0x3FF; + int pal = (READ16LE(screenSource)>>8) & 0xF0; + int tileXmatch = (data & 0x0400) ? 0 : 7; + + for(int x = 0; x < 240; x++) + { + int tileX = (xxx & 7); + int tileY = yyy & 7; + + if(data & 0x0400) + tileX = 7 - tileX; + if(data & 0x0800) + tileY = 7 - tileY; + + uint8 color = charBase[(tile<<5) + (tileY<<2) + (tileX>>1)]; + + if(tileX & 1) { + color = (color >> 4); + } else { + color &= 0x0F; + } + + line[x] = color ? (READ16LE(&palette[pal + color])|prio): 0x80000000; + + if(tileX == tileXmatch) + { + screenSource++; + data = READ16LE(screenSource); + tile = data & 0x3FF; + pal = (READ16LE(screenSource)>>8) & 0xF0; + tileXmatch = (data & 0x0400) ? 0 : 7; + } + xxx++; + if(xxx == 256) + { + if(sizeX > 256) + screenSource = screenBase + 0x400 + yshift; + else + { + screenSource = screenBase + yshift; + xxx = 0; + } + data = READ16LE(screenSource); + tile = data & 0x3FF; + pal = (READ16LE(screenSource)>>8) & 0xF0; + tileXmatch = (data & 0x0400) ? 0 : 7; + } + else if(xxx >= sizeX) + { + xxx = 0; + screenSource = screenBase + yshift; + data = READ16LE(screenSource); + tile = data & 0x3FF; + pal = (READ16LE(screenSource)>>8) & 0xF0; + tileXmatch = (data & 0x0400) ? 0 : 7; + } + } + } + if(mosaicOn) + { + if(mosaicX > 1) + { + int m = 1; + for(int i = 0; i < 239; i++) + { + line[i+1] = line[i]; + m++; + if(m == mosaicX) + { + m = 1; + i++; + } + } + } + } +} + +void gfxDrawRotScreen(uint16 control, + uint16 x_l, uint16 x_h, + uint16 y_l, uint16 y_h, + uint16 pa, uint16 pb, + uint16 pc, uint16 pd, + int& currentX, int& currentY, + int changed, + uint32 *line) +{ + uint16 *palette = (uint16 *)paletteRAM; + uint8 *charBase = &vram[((control >> 2) & 0x03) * 0x4000]; + uint8 *screenBase = (uint8 *)&vram[((control >> 8) & 0x1f) * 0x800]; + int prio = ((control & 3) << 25) + 0x1000000; + + int sizeX = 128; + int sizeY = 128; + switch((control >> 14) & 3) { + case 0: + break; + case 1: + sizeX = sizeY = 256; + break; + case 2: + sizeX = sizeY = 512; + break; + case 3: + sizeX = sizeY = 1024; + break; + } + + int dx = pa & 0x7FFF; + if(pa & 0x8000) + dx |= 0xFFFF8000; + int dmx = pb & 0x7FFF; + if(pb & 0x8000) + dmx |= 0xFFFF8000; + int dy = pc & 0x7FFF; + if(pc & 0x8000) + dy |= 0xFFFF8000; + int dmy = pd & 0x7FFF; + if(pd & 0x8000) + dmy |= 0xFFFF8000; + + if(VCOUNT == 0) + changed = 3; + + if(changed & 1) { + currentX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + currentX |= 0xF8000000; + } else { + currentX += dmx; + } + + if(changed & 2) { + currentY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + currentY |= 0xF8000000; + } else { + currentY += dmy; + } + + int realX = currentX; + int realY = currentY; + + if(control & 0x40) { + int mosaicY = ((MOSAIC & 0xF0)>>4) + 1; + int y = (VCOUNT % mosaicY); + realX -= y*dmx; + realY -= y*dmy; + } + + int xxx = (realX >> 8); + int yyy = (realY >> 8); + + if(control & 0x2000) { + xxx %= sizeX; + yyy %= sizeY; + if(xxx < 0) + xxx += sizeX; + if(yyy < 0) + yyy += sizeY; + } + + if(control & 0x80) { + for(int x = 0; x < 240; x++) { + if(xxx < 0 || + yyy < 0 || + xxx >= sizeX || + yyy >= sizeY) { + line[x] = 0x80000000; + } else { + int tile = screenBase[(xxx>>3) + (yyy>>3)*(sizeX>>3)]; + + int tileX = (xxx & 7); + int tileY = yyy & 7; + + uint8 color = charBase[(tile<<6) + (tileY<<3) + tileX]; + + line[x] = color ? (READ16LE(&palette[color])|prio): 0x80000000; + } + realX += dx; + realY += dy; + + xxx = (realX >> 8); + yyy = (realY >> 8); + + if(control & 0x2000) { + xxx %= sizeX; + yyy %= sizeY; + if(xxx < 0) + xxx += sizeX; + if(yyy < 0) + yyy += sizeY; + } + } + } else { + for(int x = 0; x < 240; x++) { + if(xxx < 0 || + yyy < 0 || + xxx >= sizeX || + yyy >= sizeY) { + line[x] = 0x80000000; + } else { + int tile = screenBase[(xxx>>3) + (yyy>>3)*(sizeX>>3)]; + + int tileX = (xxx & 7); + int tileY = yyy & 7; + + uint8 color = charBase[(tile<<6) + (tileY<<3) + tileX]; + + line[x] = color ? (READ16LE(&palette[color])|prio): 0x80000000; + } + realX += dx; + realY += dy; + + xxx = (realX >> 8); + yyy = (realY >> 8); + + if(control & 0x2000) { + xxx %= sizeX; + yyy %= sizeY; + if(xxx < 0) + xxx += sizeX; + if(yyy < 0) + yyy += sizeY; + } + } + } + + if(control & 0x40) { + int mosaicX = (MOSAIC & 0xF) + 1; + if(mosaicX > 1) { + int m = 1; + for(int i = 0; i < 239; i++) { + line[i+1] = line[i]; + m++; + if(m == mosaicX) { + m = 1; + i++; + } + } + } + } +} + +void gfxDrawRotScreen16Bit(uint16 control, + uint16 x_l, uint16 x_h, + uint16 y_l, uint16 y_h, + uint16 pa, uint16 pb, + uint16 pc, uint16 pd, + int& currentX, int& currentY, + int changed, + uint32 *line) +{ + uint16 *screenBase = (uint16 *)&vram[0]; + int prio = ((control & 3) << 25) + 0x1000000; + int sizeX = 240; + int sizeY = 160; + + int startX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + startX |= 0xF8000000; + int startY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + startY |= 0xF8000000; + + int dx = pa & 0x7FFF; + if(pa & 0x8000) + dx |= 0xFFFF8000; + int dmx = pb & 0x7FFF; + if(pb & 0x8000) + dmx |= 0xFFFF8000; + int dy = pc & 0x7FFF; + if(pc & 0x8000) + dy |= 0xFFFF8000; + int dmy = pd & 0x7FFF; + if(pd & 0x8000) + dmy |= 0xFFFF8000; + + if(VCOUNT == 0) + changed = 3; + + if(changed & 1) { + currentX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + currentX |= 0xF8000000; + } else + currentX += dmx; + + if(changed & 2) { + currentY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + currentY |= 0xF8000000; + } else { + currentY += dmy; + } + + int realX = currentX; + int realY = currentY; + + if(control & 0x40) { + int mosaicY = ((MOSAIC & 0xF0)>>4) + 1; + int y = (VCOUNT % mosaicY); + realX -= y*dmx; + realY -= y*dmy; + } + + int xxx = (realX >> 8); + int yyy = (realY >> 8); + + for(int x = 0; x < 240; x++) { + if(xxx < 0 || + yyy < 0 || + xxx >= sizeX || + yyy >= sizeY) { + line[x] = 0x80000000; + } else { + line[x] = (READ16LE(&screenBase[yyy * sizeX + xxx]) | prio); + } + realX += dx; + realY += dy; + + xxx = (realX >> 8); + yyy = (realY >> 8); + } + + if(control & 0x40) { + int mosaicX = (MOSAIC & 0xF) + 1; + if(mosaicX > 1) { + int m = 1; + for(int i = 0; i < 239; i++) { + line[i+1] = line[i]; + m++; + if(m == mosaicX) { + m = 1; + i++; + } + } + } + } +} + +void gfxDrawRotScreen256(uint16 control, + uint16 x_l, uint16 x_h, + uint16 y_l, uint16 y_h, + uint16 pa, uint16 pb, + uint16 pc, uint16 pd, + int ¤tX, int& currentY, + int changed, + uint32 *line) +{ + uint16 *palette = (uint16 *)paletteRAM; + uint8 *screenBase = (DISPCNT & 0x0010) ? &vram[0xA000] : &vram[0x0000]; + int prio = ((control & 3) << 25) + 0x1000000; + int sizeX = 240; + int sizeY = 160; + + int startX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + startX |= 0xF8000000; + int startY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + startY |= 0xF8000000; + + int dx = pa & 0x7FFF; + if(pa & 0x8000) + dx |= 0xFFFF8000; + int dmx = pb & 0x7FFF; + if(pb & 0x8000) + dmx |= 0xFFFF8000; + int dy = pc & 0x7FFF; + if(pc & 0x8000) + dy |= 0xFFFF8000; + int dmy = pd & 0x7FFF; + if(pd & 0x8000) + dmy |= 0xFFFF8000; + + if(VCOUNT == 0) + changed = 3; + + if(changed & 1) { + currentX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + currentX |= 0xF8000000; + } else { + currentX += dmx; + } + + if(changed & 2) { + currentY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + currentY |= 0xF8000000; + } else { + currentY += dmy; + } + + int realX = currentX; + int realY = currentY; + + if(control & 0x40) { + int mosaicY = ((MOSAIC & 0xF0)>>4) + 1; + int y = (VCOUNT / mosaicY) * mosaicY; + realX = startX + y*dmx; + realY = startY + y*dmy; + } + + int xxx = (realX >> 8); + int yyy = (realY >> 8); + + for(int x = 0; x < 240; x++) { + if(xxx < 0 || + yyy < 0 || + xxx >= sizeX || + yyy >= sizeY) { + line[x] = 0x80000000; + } else { + uint8 color = screenBase[yyy * 240 + xxx]; + + line[x] = color ? (READ16LE(&palette[color])|prio): 0x80000000; + } + realX += dx; + realY += dy; + + xxx = (realX >> 8); + yyy = (realY >> 8); + } + + if(control & 0x40) { + int mosaicX = (MOSAIC & 0xF) + 1; + if(mosaicX > 1) { + int m = 1; + for(int i = 0; i < 239; i++) { + line[i+1] = line[i]; + m++; + if(m == mosaicX) { + m = 1; + i++; + } + } + } + } +} + +void gfxDrawRotScreen16Bit160(uint16 control, + uint16 x_l, uint16 x_h, + uint16 y_l, uint16 y_h, + uint16 pa, uint16 pb, + uint16 pc, uint16 pd, + int& currentX, int& currentY, + int changed, + uint32 *line) +{ + uint16 *screenBase = (DISPCNT & 0x0010) ? (uint16 *)&vram[0xa000] : + (uint16 *)&vram[0]; + int prio = ((control & 3) << 25) + 0x1000000; + int sizeX = 160; + int sizeY = 128; + + int startX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + startX |= 0xF8000000; + int startY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + startY |= 0xF8000000; + + int dx = pa & 0x7FFF; + if(pa & 0x8000) + dx |= 0xFFFF8000; + int dmx = pb & 0x7FFF; + if(pb & 0x8000) + dmx |= 0xFFFF8000; + int dy = pc & 0x7FFF; + if(pc & 0x8000) + dy |= 0xFFFF8000; + int dmy = pd & 0x7FFF; + if(pd & 0x8000) + dmy |= 0xFFFF8000; + + if(VCOUNT == 0) + changed = 3; + + if(changed & 1) { + currentX = (x_l) | ((x_h & 0x07FF)<<16); + if(x_h & 0x0800) + currentX |= 0xF8000000; + } else { + currentX += dmx; + } + + if(changed & 2) { + currentY = (y_l) | ((y_h & 0x07FF)<<16); + if(y_h & 0x0800) + currentY |= 0xF8000000; + } else { + currentY += dmy; + } + + int realX = currentX; + int realY = currentY; + + if(control & 0x40) { + int mosaicY = ((MOSAIC & 0xF0)>>4) + 1; + int y = (VCOUNT / mosaicY) * mosaicY; + realX = startX + y*dmx; + realY = startY + y*dmy; + } + + int xxx = (realX >> 8); + int yyy = (realY >> 8); + + for(int x = 0; x < 240; x++) { + if(xxx < 0 || + yyy < 0 || + xxx >= sizeX || + yyy >= sizeY) { + line[x] = 0x80000000; + } else { + line[x] = (READ16LE(&screenBase[yyy * sizeX + xxx]) | prio); + } + realX += dx; + realY += dy; + + xxx = (realX >> 8); + yyy = (realY >> 8); + } + + if(control & 0x40) { + int mosaicX = (MOSAIC & 0xF) + 1; + if(mosaicX > 1) { + int m = 1; + for(int i = 0; i < 239; i++) { + line[i+1] = line[i]; + m++; + if(m == mosaicX) { + m = 1; + i++; + } + } + } + } +} + +void gfxDrawSprites(void) +{ + int m=0; + gfxClearArray(lineOBJ); + if(layerEnable & 0x1000) { + uint16 *sprites = (uint16 *)oam; + uint16 *spritePalette = &((uint16 *)paletteRAM)[256]; + int mosaicY = ((MOSAIC & 0xF000)>>12) + 1; + int mosaicX = ((MOSAIC & 0xF00)>>8) + 1; + + for(int i = 0; i < 128 ; i++) { + + uint16 a0 = READ16LE(sprites++); + uint16 a1 = READ16LE(sprites++); + uint16 a2 = READ16LE(sprites++); + sprites++; + + // ignore OBJ-WIN + if((a0 & 0x0c00) == 0x0800) + continue; + + int sizeY = 8; + int sizeX = 8; + + switch(((a0 >>12) & 0x0c)|(a1>>14)) { + case 0: + break; + case 1: + sizeX = sizeY = 16; + break; + case 2: + sizeX = sizeY = 32; + break; + case 3: + sizeX = sizeY = 64; + break; + case 4: + sizeX = 16; + break; + case 5: + sizeX = 32; + break; + case 6: + sizeX = 32; + sizeY = 16; + break; + case 7: + sizeX = 64; + sizeY = 32; + break; + case 8: + sizeY = 16; + break; + case 9: + sizeY = 32; + break; + case 10: + sizeX = 16; + sizeY = 32; + break; + case 11: + sizeX = 32; + sizeY = 64; + break; + default: + continue; + } + +#ifdef SPRITE_DEBUG + int maskX = sizeX-1; + int maskY = sizeY-1; +#endif + + int sy = (a0 & 255); + + if(sy > 160) + sy -= 256; + + if(a0 & 0x0100) { + int fieldX = sizeX; + int fieldY = sizeY; + if(a0 & 0x0200) { + fieldX <<= 1; + fieldY <<= 1; + } + + int t = VCOUNT - sy; + if((t >= 0) && (t < fieldY)) { + int sx = (a1 & 0x1FF); + if((sx < 240) || (((sx + fieldX) & 511) < 240)) { + // int t2 = t - (fieldY >> 1); + int rot = (a1 >> 9) & 0x1F; + uint16 *OAM = (uint16 *)oam; + int dx = READ16LE(&OAM[3 + (rot << 4)]); + if(dx & 0x8000) + dx |= 0xFFFF8000; + int dmx = READ16LE(&OAM[7 + (rot << 4)]); + if(dmx & 0x8000) + dmx |= 0xFFFF8000; + int dy = READ16LE(&OAM[11 + (rot << 4)]); + if(dy & 0x8000) + dy |= 0xFFFF8000; + int dmy = READ16LE(&OAM[15 + (rot << 4)]); + if(dmy & 0x8000) + dmy |= 0xFFFF8000; + + if(a0 & 0x1000) { + t -= (t % mosaicY); + } + + int realX = ((sizeX) << 7) - (fieldX >> 1)*dx - (fieldY>>1)*dmx + + t * dmx; + int realY = ((sizeY) << 7) - (fieldX >> 1)*dy - (fieldY>>1)*dmy + + t * dmy; + + uint32 prio = (((a2 >> 10) & 3) << 25) | ((a0 & 0x0c00)<<6); + + if(a0 & 0x2000) { + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + int inc = 32; + if(DISPCNT & 0x40) + inc = sizeX >> 2; + else + c &= 0x3FE; + for(int x = 0; x < fieldX; x++) { + int xxx = realX >> 8; + int yyy = realY >> 8; + + if(xxx < 0 || xxx >= sizeX || + yyy < 0 || yyy >= sizeY || + sx >= 240); + else { + uint32 color = vram[0x10000 + ((((c + (yyy>>3) * inc)<<5) + + ((yyy & 7)<<3) + ((xxx >> 3)<<6) + + (xxx & 7))&0x7FFF)]; + if ((color==0) && (((prio >> 25)&3) < + ((lineOBJ[sx]>>25)&3))) { + lineOBJ[sx] = (lineOBJ[sx] & 0xF9FFFFFF) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } else if((color) && (prio < (lineOBJ[sx]&0xFF000000))) { + lineOBJ[sx] = READ16LE(&spritePalette[color]) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } + + if (a0 & 0x1000) { + m++; + if (m==mosaicX) + m=0; + } +#ifdef SPRITE_DEBUG + if(t == 0 || t == maskY || x == 0 || x == maskX) + lineOBJ[sx] = 0x001F; +#endif + } + sx = (sx+1)&511;; + realX += dx; + realY += dy; + } + } else { + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + + int inc = 32; + if(DISPCNT & 0x40) + inc = sizeX >> 3; + int palette = (a2 >> 8) & 0xF0; + for(int x = 0; x < fieldX; x++) { + int xxx = realX >> 8; + int yyy = realY >> 8; + if(xxx < 0 || xxx >= sizeX || + yyy < 0 || yyy >= sizeY || + sx >= 240); + else { + uint32 color = vram[0x10000 + ((((c + (yyy>>3) * inc)<<5) + + ((yyy & 7)<<2) + ((xxx >> 3)<<5) + + ((xxx & 7)>>1))&0x7FFF)]; + if(xxx & 1) + color >>= 4; + else + color &= 0x0F; + + if ((color==0) && (((prio >> 25)&3) < + ((lineOBJ[sx]>>25)&3))) { + lineOBJ[sx] = (lineOBJ[sx] & 0xF9FFFFFF) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } else if((color) && (prio < (lineOBJ[sx]&0xFF000000))) { + lineOBJ[sx] = READ16LE(&spritePalette[palette+color]) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } + } + if((a0 & 0x1000) && m) { + m++; + if (m==mosaicX) + m=0; + } + +#ifdef SPRITE_DEBUG + if(t == 0 || t == maskY || x == 0 || x == maskX) + lineOBJ[sx] = 0x001F; +#endif + sx = (sx+1)&511;; + realX += dx; + realY += dy; + + } + } + } + } + } else { + int t = VCOUNT - sy; + if((t >= 0) && (t < sizeY)) { + int sx = (a1 & 0x1FF); + if(((sx < 240)||(((sx+sizeX)&511)<240)) && !(a0 & 0x0200)) { + if(a0 & 0x2000) { + if(a1 & 0x2000) + t = sizeY - t - 1; + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + + int inc = 32; + if(DISPCNT & 0x40) { + inc = sizeX >> 2; + } else { + c &= 0x3FE; + } + int xxx = 0; + if(a1 & 0x1000) + xxx = sizeX-1; + + if(a0 & 0x1000) { + t -= (t % mosaicY); + } + + int address = 0x10000 + ((((c+ (t>>3) * inc) << 5) + + ((t & 7) << 3) + ((xxx>>3)<<6) + (xxx & 7)) & 0x7FFF); + + if(a1 & 0x1000) + xxx = 7; + uint32 prio = (((a2 >> 10) & 3) << 25) | ((a0 & 0x0c00)<<6); + + for(int xx = 0; xx < sizeX; xx++) { + if(sx < 240) { + uint8 color = vram[address]; + if ((color==0) && (((prio >> 25)&3) < + ((lineOBJ[sx]>>25)&3))) { + lineOBJ[sx] = (lineOBJ[sx] & 0xF9FFFFFF) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } else if((color) && (prio < (lineOBJ[sx]&0xFF000000))) { + lineOBJ[sx] = READ16LE(&spritePalette[color]) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } + + if (a0 & 0x1000) { + m++; + if (m==mosaicX) + m=0; + } + +#ifdef SPRITE_DEBUG + if(t == 0 || t == maskY || xx == 0 || xx == maskX) + lineOBJ[sx] = 0x001F; +#endif + } + + sx = (sx+1) & 511; + if(a1 & 0x1000) { + xxx--; + address--; + if(xxx == -1) { + address -= 56; + xxx = 7; + } + if(address < 0x10000) + address += 0x8000; + } else { + xxx++; + address++; + if(xxx == 8) { + address += 56; + xxx = 0; + } + if(address > 0x17fff) + address -= 0x8000; + } + } + } else { + if(a1 & 0x2000) + t = sizeY - t - 1; + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + + int inc = 32; + if(DISPCNT & 0x40) { + inc = sizeX >> 3; + } + int xxx = 0; + if(a1 & 0x1000) + xxx = sizeX - 1; + + if(a0 & 0x1000) { + t -= (t % mosaicY); + } + + int address = 0x10000 + ((((c + (t>>3) * inc)<<5) + + ((t & 7)<<2) + ((xxx>>3)<<5) + ((xxx & 7) >> 1))&0x7FFF); + uint32 prio = (((a2 >> 10) & 3) << 25) | ((a0 & 0x0c00)<<6); + int palette = (a2 >> 8) & 0xF0; + if(a1 & 0x1000) { + xxx = 7; + for(int xx = sizeX - 1; xx >= 0; xx--) { + if(sx < 240) { + uint8 color = vram[address]; + if(xx & 1) { + color = (color >> 4); + } else + color &= 0x0F; + + if ((color==0) && (((prio >> 25)&3) < + ((lineOBJ[sx]>>25)&3))) { + lineOBJ[sx] = (lineOBJ[sx] & 0xF9FFFFFF) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } else if((color) && (prio < (lineOBJ[sx]&0xFF000000))) { + lineOBJ[sx] = READ16LE(&spritePalette[palette + color]) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } + } + if (a0 & 0x1000) { + m++; + if (m==mosaicX) + m=0; + } +#ifdef SPRITE_DEBUG + if(t == 0 || t == maskY || xx == 0 || xx == maskX) + lineOBJ[sx] = 0x001F; +#endif + sx = (sx+1) & 511; + xxx--; + if(!(xx & 1)) + address--; + if(xxx == -1) { + xxx = 7; + address -= 28; + } + if(address < 0x10000) + address += 0x8000; + } + } else { + for(int xx = 0; xx < sizeX; xx++) { + if(sx < 240) { + uint8 color = vram[address]; + if(xx & 1) { + color = (color >> 4); + } else + color &= 0x0F; + + if ((color==0) && (((prio >> 25)&3) < + ((lineOBJ[sx]>>25)&3))) { + lineOBJ[sx] = (lineOBJ[sx] & 0xF9FFFFFF) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + } else if((color) && (prio < (lineOBJ[sx]&0xFF000000))) { + lineOBJ[sx] = READ16LE(&spritePalette[palette + color]) | prio; + if((a0 & 0x1000) && m) + lineOBJ[sx]=(lineOBJ[sx-1] & 0xF9FFFFFF) | prio; + + } + } + if (a0 & 0x1000) { + m++; + if (m==mosaicX) + m=0; + } +#ifdef SPRITE_DEBUG + if(t == 0 || t == maskY || xx == 0 || xx == maskX) + lineOBJ[sx] = 0x001F; +#endif + sx = (sx+1) & 511; + xxx++; + if(xx & 1) + address++; + if(xxx == 8) { + address += 28; + xxx = 0; + } + if(address > 0x17fff) + address -= 0x8000; + } + } + } + } + } + } + } + } +} + +void gfxDrawOBJWin(void) +{ + gfxClearArray(lineOBJWin); + if(layerEnable & 0x8000) { + uint16 *sprites = (uint16 *)oam; + // uint16 *spritePalette = &((uint16 *)paletteRAM)[256]; + for(int i = 0; i < 128 ; i++) { + uint16 a0 = READ16LE(sprites++); + uint16 a1 = READ16LE(sprites++); + uint16 a2 = READ16LE(sprites++); + sprites++; + + // ignore non OBJ-WIN + if((a0 & 0x0c00) != 0x0800) + continue; + + int sizeY = 8; + int sizeX = 8; + + switch(((a0 >>12) & 0x0c)|(a1>>14)) { + case 0: + break; + case 1: + sizeX = sizeY = 16; + break; + case 2: + sizeX = sizeY = 32; + break; + case 3: + sizeX = sizeY = 64; + break; + case 4: + sizeX = 16; + break; + case 5: + sizeX = 32; + break; + case 6: + sizeX = 32; + sizeY = 16; + break; + case 7: + sizeX = 64; + sizeY = 32; + break; + case 8: + sizeY = 16; + break; + case 9: + sizeY = 32; + break; + case 10: + sizeX = 16; + sizeY = 32; + break; + case 11: + sizeX = 32; + sizeY = 64; + break; + default: + continue; + } + + int sy = (a0 & 255); + + if(sy > 160) + sy -= 256; + + if(a0 & 0x0100) { + int fieldX = sizeX; + int fieldY = sizeY; + if(a0 & 0x0200) { + fieldX <<= 1; + fieldY <<= 1; + } + + int t = VCOUNT - sy; + if((t >= 0) && (t < fieldY)) { + int sx = (a1 & 0x1FF); + if((sx < 240) || (((sx + fieldX) & 511) < 240)) { + // int t2 = t - (fieldY >> 1); + int rot = (a1 >> 9) & 0x1F; + uint16 *OAM = (uint16 *)oam; + int dx = READ16LE(&OAM[3 + (rot << 4)]); + if(dx & 0x8000) + dx |= 0xFFFF8000; + int dmx = READ16LE(&OAM[7 + (rot << 4)]); + if(dmx & 0x8000) + dmx |= 0xFFFF8000; + int dy = READ16LE(&OAM[11 + (rot << 4)]); + if(dy & 0x8000) + dy |= 0xFFFF8000; + int dmy = READ16LE(&OAM[15 + (rot << 4)]); + if(dmy & 0x8000) + dmy |= 0xFFFF8000; + + int realX = ((sizeX) << 7) - (fieldX >> 1)*dx - (fieldY>>1)*dmx + + t * dmx; + int realY = ((sizeY) << 7) - (fieldX >> 1)*dy - (fieldY>>1)*dmy + + t * dmy; + + // uint32 prio = (((a2 >> 10) & 3) << 25) | ((a0 & 0x0c00)<<6); + + if(a0 & 0x2000) { + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + int inc = 32; + if(DISPCNT & 0x40) + inc = sizeX >> 2; + else + c &= 0x3FE; + for(int x = 0; x < fieldX; x++) { + int xxx = realX >> 8; + int yyy = realY >> 8; + + if(xxx < 0 || xxx >= sizeX || + yyy < 0 || yyy >= sizeY || + sx >= 240) { + } else { + uint32 color = vram[0x10000 + ((((c + (yyy>>3) * inc)<<5) + + ((yyy & 7)<<3) + ((xxx >> 3)<<6) + + (xxx & 7))&0x7fff)]; + if(color) { + lineOBJWin[sx] = 1; + } + } + sx = (sx+1)&511;; + realX += dx; + realY += dy; + } + } else { + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + + int inc = 32; + if(DISPCNT & 0x40) + inc = sizeX >> 3; + // int palette = (a2 >> 8) & 0xF0; + for(int x = 0; x < fieldX; x++) { + int xxx = realX >> 8; + int yyy = realY >> 8; + + // if(x == 0 || x == (sizeX-1) || + // t == 0 || t == (sizeY-1)) { + // lineOBJ[sx] = 0x001F | prio; + // } else { + if(xxx < 0 || xxx >= sizeX || + yyy < 0 || yyy >= sizeY || + sx >= 240){ + } else { + uint32 color = vram[0x10000 + ((((c + (yyy>>3) * inc)<<5) + + ((yyy & 7)<<2) + ((xxx >> 3)<<5) + + ((xxx & 7)>>1))&0x7fff)]; + if(xxx & 1) + color >>= 4; + else + color &= 0x0F; + + if(color) { + lineOBJWin[sx] = 1; + } + } + // } + sx = (sx+1)&511;; + realX += dx; + realY += dy; + } + } + } + } + } else { + int t = VCOUNT - sy; + if((t >= 0) && (t < sizeY)) { + int sx = (a1 & 0x1FF); + if(((sx < 240)||(((sx+sizeX)&511)<240)) && !(a0 & 0x0200)) { + if(a0 & 0x2000) { + if(a1 & 0x2000) + t = sizeY - t - 1; + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + + int inc = 32; + if(DISPCNT & 0x40) { + inc = sizeX >> 2; + } else { + c &= 0x3FE; + } + int xxx = 0; + if(a1 & 0x1000) + xxx = sizeX-1; + int address = 0x10000 + ((((c+ (t>>3) * inc) << 5) + + ((t & 7) << 3) + ((xxx>>3)<<6) + (xxx & 7))&0x7fff); + if(a1 & 0x1000) + xxx = 7; + // uint32 prio = (((a2 >> 10) & 3) << 25) | ((a0 & 0x0c00)<<6); + for(int xx = 0; xx < sizeX; xx++) { + if(sx < 240) { + uint8 color = vram[address]; + if(color) { + lineOBJWin[sx] = 1; + } + } + + sx = (sx+1) & 511; + if(a1 & 0x1000) { + xxx--; + address--; + if(xxx == -1) { + address -= 56; + xxx = 7; + } + if(address < 0x10000) + address += 0x8000; + } else { + xxx++; + address++; + if(xxx == 8) { + address += 56; + xxx = 0; + } + if(address > 0x17fff) + address -= 0x8000; + } + } + } else { + if(a1 & 0x2000) + t = sizeY - t - 1; + int c = (a2 & 0x3FF); + if((DISPCNT & 7) > 2 && (c < 512)) + continue; + + int inc = 32; + if(DISPCNT & 0x40) { + inc = sizeX >> 3; + } + int xxx = 0; + if(a1 & 0x1000) + xxx = sizeX - 1; + int address = 0x10000 + ((((c + (t>>3) * inc)<<5) + + ((t & 7)<<2) + ((xxx>>3)<<5) + ((xxx & 7) >> 1))&0x7fff); + // uint32 prio = (((a2 >> 10) & 3) << 25) | ((a0 & 0x0c00)<<6); + // int palette = (a2 >> 8) & 0xF0; + if(a1 & 0x1000) { + xxx = 7; + for(int xx = sizeX - 1; xx >= 0; xx--) { + if(sx < 240) { + uint8 color = vram[address]; + if(xx & 1) { + color = (color >> 4); + } else + color &= 0x0F; + + if(color) { + lineOBJWin[sx] = 1; + } + } + sx = (sx+1) & 511; + xxx--; + if(!(xx & 1)) + address--; + if(xxx == -1) { + xxx = 7; + address -= 28; + } + if(address < 0x10000) + address += 0x8000; + } + } else { + for(int xx = 0; xx < sizeX; xx++) { + if(sx < 240) { + uint8 color = vram[address]; + if(xx & 1) { + color = (color >> 4); + } else + color &= 0x0F; + + if(color) { + lineOBJWin[sx] = 1; + } + } + sx = (sx+1) & 511; + xxx++; + if(xx & 1) + address++; + if(xxx == 8) { + address += 28; + xxx = 0; + } + if(address > 0x17fff) + address -= 0x8000; + } + } + } + } + } + } + } + } +} + +} diff --git a/Mednafen/mednafen/gba/Gfx.h b/Mednafen/mednafen/gba/Gfx.h new file mode 100644 index 0000000000..14454858a2 --- /dev/null +++ b/Mednafen/mednafen/gba/Gfx.h @@ -0,0 +1,85 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_GFX_H +#define VBA_GFX_H + +#include "GBA.h" +#include "Gfx.h" +#include "Globals.h" + +#include "Port.h" + +namespace MDFN_IEN_GBA +{ + +//#define SPRITE_DEBUG + +void mode0RenderLine(); +void mode0RenderLineNoWindow(); +void mode0RenderLineAll(); + +void mode1RenderLine(); +void mode1RenderLineNoWindow(); +void mode1RenderLineAll(); + +void mode2RenderLine(); +void mode2RenderLineNoWindow(); +void mode2RenderLineAll(); + +void mode3RenderLine(); +void mode3RenderLineNoWindow(); +void mode3RenderLineAll(); + +void mode4RenderLine(); +void mode4RenderLineNoWindow(); +void mode4RenderLineAll(); + +void mode5RenderLine(); +void mode5RenderLineNoWindow(); +void mode5RenderLineAll(); + +extern int all_coeff[32]; +extern uint32 AlphaClampLUT[64]; +alignas(16) extern uint32 line0[512]; +alignas(16) extern uint32 line1[512]; +alignas(16) extern uint32 line2[512]; +alignas(16) extern uint32 line3[512]; +alignas(16) extern uint32 lineOBJ[512]; +alignas(16) extern uint32 lineOBJWin[512]; +alignas(16) extern uint32 lineMix[512]; +extern bool gfxInWin0[512]; +extern bool gfxInWin1[512]; + +extern int gfxBG2Changed; +extern int gfxBG3Changed; + +extern int gfxBG2X; +extern int gfxBG2Y; +extern int gfxBG2LastX; +extern int gfxBG2LastY; +extern int gfxBG3X; +extern int gfxBG3Y; +extern int gfxBG3LastX; +extern int gfxBG3LastY; +extern int gfxLastVCOUNT; + +} + +#endif // VBA_GFX_H diff --git a/Mednafen/mednafen/gba/Globals.cpp b/Mednafen/mednafen/gba/Globals.cpp new file mode 100644 index 0000000000..94bba84b9b --- /dev/null +++ b/Mednafen/mednafen/gba/Globals.cpp @@ -0,0 +1,109 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" + +namespace MDFN_IEN_GBA +{ + +reg_pair reg[45]; +memoryMap map[256]; +bool ioReadable[0x400]; + +uint32 N_FLAG = 0; +bool C_FLAG = 0; +bool Z_FLAG = 0; +bool V_FLAG = 0; + +bool armState = true; +bool armIrqEnable = true; +uint32 armNextPC = 0x00000000; +int armMode = 0x1f; +uint32 stop = 0x08000568; +int saveType = 0; +bool useBios = false; +bool skipBios = false; +int frameSkip = 1; +bool speedup = false; +bool synchronize = true; +bool cpuDisableSfx = false; +bool cpuIsMultiBoot = false; +bool parseDebug = true; +int layerSettings = 0xff00; +int layerEnable = 0xff00; + +uint8 *bios = NULL; +uint8 *rom = NULL; +uint8 *internalRAM = NULL; +uint8 *workRAM = NULL; +uint8 *paletteRAM = NULL; +uint8 *vram = NULL; +uint8 *oam = NULL; +uint8 *ioMem = NULL; + +uint16 DISPCNT = 0x0080; +uint16 DISPSTAT = 0x0000; +uint16 VCOUNT = 0x0000; +uint16 BG0CNT = 0x0000; +uint16 BG1CNT = 0x0000; +uint16 BG2CNT = 0x0000; +uint16 BG3CNT = 0x0000; + +uint16 BGHOFS[4]; +uint16 BGVOFS[4]; + +uint16 BG2PA = 0x0100; +uint16 BG2PB = 0x0000; +uint16 BG2PC = 0x0000; +uint16 BG2PD = 0x0100; +uint16 BG2X_L = 0x0000; +uint16 BG2X_H = 0x0000; +uint16 BG2Y_L = 0x0000; +uint16 BG2Y_H = 0x0000; +uint16 BG3PA = 0x0100; +uint16 BG3PB = 0x0000; +uint16 BG3PC = 0x0000; +uint16 BG3PD = 0x0100; +uint16 BG3X_L = 0x0000; +uint16 BG3X_H = 0x0000; +uint16 BG3Y_L = 0x0000; +uint16 BG3Y_H = 0x0000; +uint16 WIN0H = 0x0000; +uint16 WIN1H = 0x0000; +uint16 WIN0V = 0x0000; +uint16 WIN1V = 0x0000; +uint16 WININ = 0x0000; +uint16 WINOUT = 0x0000; +uint16 MOSAIC = 0x0000; +uint16 BLDMOD = 0x0000; +uint16 COLEV = 0x0000; +uint16 COLY = 0x0000; + +uint16 DMSAD_L[4] = {0}; +uint16 DMSAD_H[4] = {0}; +uint16 DMDAD_L[4] = {0}; +uint16 DMDAD_H[4] = {0}; +uint16 DMCNT_L[4] = {0}; +uint16 DMCNT_H[4] = {0}; + +uint16 P1 = 0xFFFF; +uint16 IE = 0x0000; +uint16 IF = 0x0000; +uint16 IME = 0x0000; + +} diff --git a/Mednafen/mednafen/gba/Globals.h b/Mednafen/mednafen/gba/Globals.h new file mode 100644 index 0000000000..a6ffd29d23 --- /dev/null +++ b/Mednafen/mednafen/gba/Globals.h @@ -0,0 +1,131 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_GLOBALS_H +#define VBA_GLOBALS_H + +namespace MDFN_IEN_GBA +{ + +#define VERBOSE_SWI 1 +#define VERBOSE_UNALIGNED_MEMORY 2 +#define VERBOSE_ILLEGAL_WRITE 4 +#define VERBOSE_ILLEGAL_READ 8 +#define VERBOSE_DMA0 16 +#define VERBOSE_DMA1 32 +#define VERBOSE_DMA2 64 +#define VERBOSE_DMA3 128 +#define VERBOSE_UNDEFINED 256 +#define VERBOSE_AGBPRINT 512 + +extern reg_pair reg[45]; +extern bool ioReadable[0x400]; + +extern uint32 N_FLAG; +extern bool C_FLAG; +extern bool Z_FLAG; +extern bool V_FLAG; + +extern bool armState; +extern bool armIrqEnable; +extern uint32 armNextPC; +extern int armMode; +extern uint32 stop; +extern int saveType; +extern bool useBios; +extern bool skipBios; +extern int frameSkip; +extern bool speedup; +extern bool synchronize; +extern bool cpuDisableSfx; +extern bool cpuIsMultiBoot; +extern bool parseDebug; +extern int layerSettings; +extern int layerEnable; + +extern uint8 *bios; +extern uint8 *rom; +extern uint8 *internalRAM; +extern uint8 *workRAM; +extern uint8 *paletteRAM; +extern uint8 *vram; +extern uint8 *oam; +extern uint8 *ioMem; + +extern uint16 DISPCNT; +extern uint16 DISPSTAT; +extern uint16 VCOUNT; +extern uint16 BG0CNT; +extern uint16 BG1CNT; +extern uint16 BG2CNT; +extern uint16 BG3CNT; + +extern uint16 BGHOFS[4]; +extern uint16 BGVOFS[4]; + +extern uint16 BG2PA; +extern uint16 BG2PB; +extern uint16 BG2PC; +extern uint16 BG2PD; +extern uint16 BG2X_L; +extern uint16 BG2X_H; +extern uint16 BG2Y_L; +extern uint16 BG2Y_H; +extern uint16 BG3PA; +extern uint16 BG3PB; +extern uint16 BG3PC; +extern uint16 BG3PD; +extern uint16 BG3X_L; +extern uint16 BG3X_H; +extern uint16 BG3Y_L; +extern uint16 BG3Y_H; +extern uint16 WIN0H; +extern uint16 WIN1H; +extern uint16 WIN0V; +extern uint16 WIN1V; +extern uint16 WININ; +extern uint16 WINOUT; +extern uint16 MOSAIC; +extern uint16 BLDMOD; +extern uint16 COLEV; +extern uint16 COLY; + +extern uint16 DMSAD_L[4]; +extern uint16 DMSAD_H[4]; +extern uint16 DMDAD_L[4]; +extern uint16 DMDAD_H[4]; +extern uint16 DMCNT_L[4]; +extern uint16 DMCNT_H[4]; + +extern uint16 TM0D; +extern uint16 TM0CNT; +extern uint16 TM1D; +extern uint16 TM1CNT; +extern uint16 TM2D; +extern uint16 TM2CNT; +extern uint16 TM3D; +extern uint16 TM3CNT; +extern uint16 P1; +extern uint16 IE; +extern uint16 IF; +extern uint16 IME; + +} + +#endif // VBA_GLOBALS_H diff --git a/Mednafen/mednafen/gba/Makefile.am b/Mednafen/mednafen/gba/Makefile.am new file mode 100644 index 0000000000..97d009d2da --- /dev/null +++ b/Mednafen/mednafen/gba/Makefile.am @@ -0,0 +1,6 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libgba.a +libgba_a_SOURCES = GBAinline.cpp arm.cpp thumb.cpp bios.cpp eeprom.cpp flash.cpp GBA.cpp Gfx.cpp Globals.cpp Mode0.cpp Mode1.cpp Mode2.cpp Mode3.cpp Mode4.cpp Mode5.cpp RTC.cpp Sound.cpp sram.cpp diff --git a/Mednafen/mednafen/gba/Makefile.in b/Mednafen/mednafen/gba/Makefile.in new file mode 100644 index 0000000000..7a0332baae --- /dev/null +++ b/Mednafen/mednafen/gba/Makefile.in @@ -0,0 +1,698 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/gba +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libgba_a_AR = $(AR) $(ARFLAGS) +libgba_a_LIBADD = +am_libgba_a_OBJECTS = GBAinline.$(OBJEXT) arm.$(OBJEXT) \ + thumb.$(OBJEXT) bios.$(OBJEXT) eeprom.$(OBJEXT) \ + flash.$(OBJEXT) GBA.$(OBJEXT) Gfx.$(OBJEXT) Globals.$(OBJEXT) \ + Mode0.$(OBJEXT) Mode1.$(OBJEXT) Mode2.$(OBJEXT) \ + Mode3.$(OBJEXT) Mode4.$(OBJEXT) Mode5.$(OBJEXT) RTC.$(OBJEXT) \ + Sound.$(OBJEXT) sram.$(OBJEXT) +libgba_a_OBJECTS = $(am_libgba_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libgba_a_SOURCES) +DIST_SOURCES = $(libgba_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libgba.a +libgba_a_SOURCES = GBAinline.cpp arm.cpp thumb.cpp bios.cpp eeprom.cpp flash.cpp GBA.cpp Gfx.cpp Globals.cpp Mode0.cpp Mode1.cpp Mode2.cpp Mode3.cpp Mode4.cpp Mode5.cpp RTC.cpp Sound.cpp sram.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/gba/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/gba/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libgba.a: $(libgba_a_OBJECTS) $(libgba_a_DEPENDENCIES) $(EXTRA_libgba_a_DEPENDENCIES) + $(AM_V_at)-rm -f libgba.a + $(AM_V_AR)$(libgba_a_AR) libgba.a $(libgba_a_OBJECTS) $(libgba_a_LIBADD) + $(AM_V_at)$(RANLIB) libgba.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GBA.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GBAinline.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Gfx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Globals.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mode0.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mode1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mode2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mode3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mode4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Mode5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RTC.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bios.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eeprom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sram.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/thumb.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/gba/Mode0.cpp b/Mednafen/mednafen/gba/Mode0.cpp new file mode 100644 index 0000000000..c9a08c22ff --- /dev/null +++ b/Mednafen/mednafen/gba/Mode0.cpp @@ -0,0 +1,558 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "Gfx.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +void mode0RenderLine() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + return; + } + + if(layerEnable & 0x0100) { + gfxDrawTextScreen(BG0CNT, BGHOFS[0], BGVOFS[0], line0); + } + + if(layerEnable & 0x0200) { + gfxDrawTextScreen(BG1CNT, BGHOFS[1], BGVOFS[1], line1); + } + + if(layerEnable & 0x0400) { + gfxDrawTextScreen(BG2CNT, BGHOFS[2], BGVOFS[2], line2); + } + + if(layerEnable & 0x0800) { + gfxDrawTextScreen(BG3CNT, BGHOFS[3], BGVOFS[3], line3); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + if(line0[x] < color) { + color = line0[x]; + top = 0x01; + } + + if(line1[x] < (color & 0xFF000000)) { + color = line1[x]; + top = 0x02; + } + + if(line2[x] < (color & 0xFF000000)) { + color = line2[x]; + top = 0x04; + } + + if(line3[x] < (color & 0xFF000000)) { + color = line3[x]; + top = 0x08; + } + + if(lineOBJ[x] < (color & 0xFF000000)) { + color = lineOBJ[x]; + top = 0x10; + } + + if((top & 0x10) && (color & 0x00010000)) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line0[x] < (back & 0xFF000000)) { + back = line0[x]; + top2 = 0x01; + } + + if(line1[x] < (back & 0xFF000000)) { + back = line1[x]; + top2 = 0x02; + } + + if(line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(line3[x] < (back & 0xFF000000)) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } +} + +void mode0RenderLineNoWindow() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + return; + } + + if(layerEnable & 0x0100) { + gfxDrawTextScreen(BG0CNT, BGHOFS[0], BGVOFS[0], line0); + } + + if(layerEnable & 0x0200) { + gfxDrawTextScreen(BG1CNT, BGHOFS[1], BGVOFS[1], line1); + } + + if(layerEnable & 0x0400) { + gfxDrawTextScreen(BG2CNT, BGHOFS[2], BGVOFS[2], line2); + } + + if(layerEnable & 0x0800) { + gfxDrawTextScreen(BG3CNT, BGHOFS[3], BGVOFS[3], line3); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + int effect = (BLDMOD >> 6) & 3; + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + if(line0[x] < color) { + color = line0[x]; + top = 0x01; + } + + if(line1[x] < (color & 0xFF000000)) { + color = line1[x]; + top = 0x02; + } + + if(line2[x] < (color & 0xFF000000)) { + color = line2[x]; + top = 0x04; + } + + if(line3[x] < (color & 0xFF000000)) { + color = line3[x]; + top = 0x08; + } + + if(lineOBJ[x] < (color & 0xFF000000)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(!(color & 0x00010000)) { + switch(effect) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + if(line0[x] < back) { + if(top != 0x01) { + back = line0[x]; + top2 = 0x01; + } + } + + if(line1[x] < (back & 0xFF000000)) { + if(top != 0x02) { + back = line1[x]; + top2 = 0x02; + } + } + + if(line2[x] < (back & 0xFF000000)) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if(line3[x] < (back & 0xFF000000)) { + if(top != 0x08) { + back = line3[x]; + top2 = 0x08; + } + } + + if(lineOBJ[x] < (back & 0xFF000000)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line0[x] < back) { + back = line0[x]; + top2 = 0x01; + } + + if(line1[x] < (back & 0xFF000000)) { + back = line1[x]; + top2 = 0x02; + } + + if(line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(line3[x] < (back & 0xFF000000)) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } +} + +void mode0RenderLineAll() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + return; + } + + bool inWindow0 = false; + bool inWindow1 = false; + + if(layerEnable & 0x2000) { + uint8 v0 = WIN0V >> 8; + uint8 v1 = WIN0V & 255; + inWindow0 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow0 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow0 |= (VCOUNT >= v0 || VCOUNT < v1); + } + if(layerEnable & 0x4000) { + uint8 v0 = WIN1V >> 8; + uint8 v1 = WIN1V & 255; + inWindow1 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow1 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow1 |= (VCOUNT >= v0 || VCOUNT < v1); + } + + if((layerEnable & 0x0100)) { + gfxDrawTextScreen(BG0CNT, BGHOFS[0], BGVOFS[0], line0); + } + + if((layerEnable & 0x0200)) { + gfxDrawTextScreen(BG1CNT, BGHOFS[1], BGVOFS[1], line1); + } + + if((layerEnable & 0x0400)) { + gfxDrawTextScreen(BG2CNT, BGHOFS[2], BGVOFS[2], line2); + } + + if((layerEnable & 0x0800)) { + gfxDrawTextScreen(BG3CNT, BGHOFS[3], BGVOFS[3], line3); + } + + gfxDrawSprites(); + gfxDrawOBJWin(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + uint8 inWin0Mask = WININ & 0xFF; + uint8 inWin1Mask = WININ >> 8; + uint8 outMask = WINOUT & 0xFF; + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + uint8 mask = outMask; + + if(!(lineOBJWin[x] & 0x80000000)) { + mask = WINOUT >> 8; + } + + if(inWindow1) { + if(gfxInWin1[x]) + mask = inWin1Mask; + } + + if(inWindow0) { + if(gfxInWin0[x]) { + mask = inWin0Mask; + } + } + + if((mask & 1) && (line0[x] < color)) { + color = line0[x]; + top = 0x01; + } + + if((mask & 2) && (line1[x] < (color & 0xFF000000))) { + color = line1[x]; + top = 0x02; + } + + if((mask & 4) && (line2[x] < (color & 0xFF000000))) { + color = line2[x]; + top = 0x04; + } + + if((mask & 8) && (line3[x] < (color & 0xFF000000))) { + color = line3[x]; + top = 0x08; + } + + if((mask & 16) && (lineOBJ[x] < (color & 0xFF000000))) { + color = lineOBJ[x]; + top = 0x10; + } + + // special FX on in the window + if(mask & 32) { + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + if((mask & 1) && line0[x] < (back & 0xFF000000)) { + if(top != 0x01) { + back = line0[x]; + top2 = 0x01; + } + } + + if((mask & 2) && line1[x] < (back & 0xFF000000)) { + if(top != 0x02) { + back = line1[x]; + top2 = 0x02; + } + } + + if((mask & 4) && line2[x] < (back & 0xFF000000)) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((mask & 8) && line3[x] < (back & 0xFF000000)) { + if(top != 0x08) { + back = line3[x]; + top2 = 0x08; + } + } + + if((mask & 16) && lineOBJ[x] < (back & 0xFF000000)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 1) && (line0[x] < (back & 0xFF000000))) { + back = line0[x]; + top2 = 0x01; + } + + if((mask & 2) && (line1[x] < (back & 0xFF000000))) { + back = line1[x]; + top2 = 0x02; + } + + if((mask & 4) && (line2[x] < (back & 0xFF000000))) { + back = line2[x]; + top2 = 0x04; + } + + if((mask & 8) && (line3[x] < (back & 0xFF000000))) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + } else if(color & 0x00010000) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 1) && (line0[x] < (back & 0xFF000000))) { + back = line0[x]; + top2 = 0x01; + } + + if((mask & 2) && (line1[x] < (back & 0xFF000000))) { + back = line1[x]; + top2 = 0x02; + } + + if((mask & 4) && (line2[x] < (back & 0xFF000000))) { + back = line2[x]; + top2 = 0x04; + } + + if((mask & 8) && (line3[x] < (back & 0xFF000000))) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } +} + +} diff --git a/Mednafen/mednafen/gba/Mode1.cpp b/Mednafen/mednafen/gba/Mode1.cpp new file mode 100644 index 0000000000..0d1943896a --- /dev/null +++ b/Mednafen/mednafen/gba/Mode1.cpp @@ -0,0 +1,519 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "Gfx.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +void mode1RenderLine() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x0100) { + gfxDrawTextScreen(BG0CNT, BGHOFS[0], BGVOFS[0], line0); + } + + if(layerEnable & 0x0200) { + gfxDrawTextScreen(BG1CNT, BGHOFS[1], BGVOFS[1], line1); + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + gfxDrawRotScreen(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, line2); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + if(line0[x] < color) { + color = line0[x]; + top = 0x01; + } + + if(line1[x] < (color & 0xFF000000)) { + color = line1[x]; + top = 0x02; + } + + if(line2[x] < (color & 0xFF000000)) { + color = line2[x]; + top = 0x04; + } + + if(lineOBJ[x] < (color & 0xFF000000)) { + color = lineOBJ[x]; + top = 0x10; + } + + if((top & 0x10) && (color & 0x00010000)) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line0[x] < (back & 0xFF000000)) { + back = line0[x]; + top2 = 0x01; + } + + if(line1[x] < (back & 0xFF000000)) { + back = line1[x]; + top2 = 0x02; + } + + if(line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode1RenderLineNoWindow() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x0100) { + gfxDrawTextScreen(BG0CNT, BGHOFS[0], BGVOFS[0], line0); + } + + + if(layerEnable & 0x0200) { + gfxDrawTextScreen(BG1CNT, BGHOFS[1], BGVOFS[1], line1); + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + gfxDrawRotScreen(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, line2); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + if(line0[x] < color) { + color = line0[x]; + top = 0x01; + } + + if(line1[x] < (color & 0xFF000000)) { + color = line1[x]; + top = 0x02; + } + + if(line2[x] < (color & 0xFF000000)) { + color = line2[x]; + top = 0x04; + } + + if(lineOBJ[x] < (color & 0xFF000000)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + if(line0[x] < (back & 0xFF000000)) { + if(top != 0x01) { + back = line0[x]; + top2 = 0x01; + } + } + + if(line1[x] < (back & 0xFF000000)) { + if(top != 0x02) { + back = line1[x]; + top2 = 0x02; + } + } + + if(line2[x] < (back & 0xFF000000)) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if(lineOBJ[x] < (back & 0xFF000000)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line0[x] < (back & 0xFF000000)) { + back = line0[x]; + top2 = 0x01; + } + + if(line1[x] < (back & 0xFF000000)) { + back = line1[x]; + top2 = 0x02; + } + + if(line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode1RenderLineAll() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + bool inWindow0 = false; + bool inWindow1 = false; + + if(layerEnable & 0x2000) { + uint8 v0 = WIN0V >> 8; + uint8 v1 = WIN0V & 255; + inWindow0 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow0 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow0 |= (VCOUNT >= v0 || VCOUNT < v1); + } + if(layerEnable & 0x4000) { + uint8 v0 = WIN1V >> 8; + uint8 v1 = WIN1V & 255; + inWindow1 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow1 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow1 |= (VCOUNT >= v0 || VCOUNT < v1); + } + + if(layerEnable & 0x0100) { + gfxDrawTextScreen(BG0CNT, BGHOFS[0], BGVOFS[0], line0); + } + + if(layerEnable & 0x0200) { + gfxDrawTextScreen(BG1CNT, BGHOFS[1], BGVOFS[1], line1); + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + gfxDrawRotScreen(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, line2); + } + + gfxDrawSprites(); + gfxDrawOBJWin(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + uint8 inWin0Mask = WININ & 0xFF; + uint8 inWin1Mask = WININ >> 8; + uint8 outMask = WINOUT & 0xFF; + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + uint8 mask = outMask; + + if(!(lineOBJWin[x] & 0x80000000)) { + mask = WINOUT >> 8; + } + + if(inWindow1) { + if(gfxInWin1[x]) + mask = inWin1Mask; + } + + if(inWindow0) { + if(gfxInWin0[x]) { + mask = inWin0Mask; + } + } + + if(line0[x] < color && (mask & 1)) { + color = line0[x]; + top = 0x01; + } + + if(line1[x] < (color & 0xFF000000) && (mask & 2)) { + color = line1[x]; + top = 0x02; + } + + if(line2[x] < (color & 0xFF000000) && (mask & 4)) { + color = line2[x]; + top = 0x04; + } + + if(lineOBJ[x] < (color & 0xFF000000) && (mask & 16)) { + color = lineOBJ[x]; + top = 0x10; + } + + // special FX on the window + if(mask & 32) { + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + if((mask & 1) && line0[x] < (back & 0xFF000000)) { + if(top != 0x01) { + back = line0[x]; + top2 = 0x01; + } + } + + if((mask & 2) && line1[x] < (back & 0xFF000000)) { + if(top != 0x02) { + back = line1[x]; + top2 = 0x02; + } + } + + if((mask & 4) && line2[x] < (back & 0xFF000000)) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((mask & 16) && lineOBJ[x] < (back & 0xFF000000)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 1) && line0[x] < (back & 0xFF000000)) { + back = line0[x]; + top2 = 0x01; + } + + if((mask & 2) && line1[x] < (back & 0xFF000000)) { + back = line1[x]; + top2 = 0x02; + } + + if((mask & 4) && line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + } else if(color & 0x00010000) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 1) && line0[x] < (back & 0xFF000000)) { + back = line0[x]; + top2 = 0x01; + } + + if((mask & 2) && line1[x] < (back & 0xFF000000)) { + back = line1[x]; + top2 = 0x02; + } + + if((mask & 4) && line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +} diff --git a/Mednafen/mednafen/gba/Mode2.cpp b/Mednafen/mednafen/gba/Mode2.cpp new file mode 100644 index 0000000000..3a6e7cbf74 --- /dev/null +++ b/Mednafen/mednafen/gba/Mode2.cpp @@ -0,0 +1,484 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "Gfx.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +void mode2RenderLine() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, gfxBG2X, gfxBG2Y, + changed, line2); + } + + if(layerEnable & 0x0800) { + int changed = gfxBG3Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen(BG3CNT, BG3X_L, BG3X_H, BG3Y_L, BG3Y_H, + BG3PA, BG3PB, BG3PC, BG3PD, gfxBG3X, gfxBG3Y, + changed, line3); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + + if(line2[x] < (color & 0xFF000000)) { + color = line2[x]; + top = 0x04; + } + + if(line3[x] < (color & 0xFF000000)) { + color = line3[x]; + top = 0x08; + } + + if(lineOBJ[x] < (color & 0xFF000000)) { + color = lineOBJ[x]; + top = 0x10; + } + + if((top & 0x10) && (color & 0x00010000)) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(line3[x] < (back & 0xFF000000)) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxBG3Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode2RenderLineNoWindow() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, gfxBG2X, gfxBG2Y, + changed, line2); + } + + if(layerEnable & 0x0800) { + int changed = gfxBG3Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen(BG3CNT, BG3X_L, BG3X_H, BG3Y_L, BG3Y_H, + BG3PA, BG3PB, BG3PC, BG3PD, gfxBG3X, gfxBG3Y, + changed, line3); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + + if(line2[x] < (color & 0xFF000000)) { + color = line2[x]; + top = 0x04; + } + + if(line3[x] < (color & 0xFF000000)) { + color = line3[x]; + top = 0x08; + } + + if(lineOBJ[x] < (color & 0xFF000000)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line2[x] < (back & 0xFF000000)) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if(line3[x] < (back & 0xFF000000)) { + if(top != 0x08) { + back = line3[x]; + top2 = 0x08; + } + } + + if(lineOBJ[x] < (back & 0xFF000000)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line2[x] < (back & 0xFF000000)) { + back = line2[x]; + top2 = 0x04; + } + + if(line3[x] < (back & 0xFF000000)) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxBG3Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode2RenderLineAll() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + bool inWindow0 = false; + bool inWindow1 = false; + + if(layerEnable & 0x2000) { + uint8 v0 = WIN0V >> 8; + uint8 v1 = WIN0V & 255; + inWindow0 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow0 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow0 |= (VCOUNT >= v0 || VCOUNT < v1); + } + if(layerEnable & 0x4000) { + uint8 v0 = WIN1V >> 8; + uint8 v1 = WIN1V & 255; + inWindow1 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow1 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow1 |= (VCOUNT >= v0 || VCOUNT < v1); + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, gfxBG2X, gfxBG2Y, + changed, line2); + } + + if(layerEnable & 0x0800) { + int changed = gfxBG3Changed; + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen(BG3CNT, BG3X_L, BG3X_H, BG3Y_L, BG3Y_H, + BG3PA, BG3PB, BG3PC, BG3PD, gfxBG3X, gfxBG3Y, + changed, line3); + } + + gfxDrawSprites(); + gfxDrawOBJWin(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + uint8 inWin0Mask = WININ & 0xFF; + uint8 inWin1Mask = WININ >> 8; + uint8 outMask = WINOUT & 0xFF; + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + uint8 mask = outMask; + + if(!(lineOBJWin[x] & 0x80000000)) { + mask = WINOUT >> 8; + } + + if(inWindow1) { + if(gfxInWin1[x]) + mask = inWin1Mask; + } + + if(inWindow0) { + if(gfxInWin0[x]) { + mask = inWin0Mask; + } + } + + if(line2[x] < color && (mask & 4)) { + color = line2[x]; + top = 0x04; + } + + if(line3[x] < (color & 0xFF000000) && (mask & 8)) { + color = line3[x]; + top = 0x08; + } + + if(lineOBJ[x] < (color & 0xFF000000) && (mask & 16)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(mask & 32) { + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((mask & 8) && line3[x] < (back & 0xFF000000)) { + if(top != 0x08) { + back = line3[x]; + top2 = 0x08; + } + } + + if((mask & 16) && lineOBJ[x] < (back & 0xFF000000)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if((mask & 8) && line3[x] < (back & 0xFF000000)) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + } else if(color & 0x00010000) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if((mask & 8) && line3[x] < (back & 0xFF000000)) { + back = line3[x]; + top2 = 0x08; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxBG3Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +} diff --git a/Mednafen/mednafen/gba/Mode3.cpp b/Mednafen/mednafen/gba/Mode3.cpp new file mode 100644 index 0000000000..ff29aa093a --- /dev/null +++ b/Mednafen/mednafen/gba/Mode3.cpp @@ -0,0 +1,411 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "Gfx.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +void mode3RenderLine() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen16Bit(BG2CNT, BG2X_L, BG2X_H, + BG2Y_L, BG2Y_H, BG2PA, BG2PB, + BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + + uint32 background = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = background; + uint8 top = 0x20; + + if(line2[x] < color) { + color = line2[x]; + top = 0x04; + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24)) { + color = lineOBJ[x]; + top = 0x10; + } + + if((top & 0x10) && (color & 0x00010000)) { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if(line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode3RenderLineNoWindow() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen16Bit(BG2CNT, BG2X_L, BG2X_H, + BG2Y_L, BG2Y_H, BG2PA, BG2PB, + BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + + uint32 background = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = background; + uint8 top = 0x20; + + if(line2[x] < color) { + color = line2[x]; + top = 0x04; + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = background; + uint8 top2 = 0x20; + + if(line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(back >> 24)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if(line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode3RenderLineAll() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x80) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + bool inWindow0 = false; + bool inWindow1 = false; + + if(layerEnable & 0x2000) { + uint8 v0 = WIN0V >> 8; + uint8 v1 = WIN0V & 255; + inWindow0 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow0 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow0 |= (VCOUNT >= v0 || VCOUNT < v1); + } + if(layerEnable & 0x4000) { + uint8 v0 = WIN1V >> 8; + uint8 v1 = WIN1V & 255; + inWindow1 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow1 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow1 |= (VCOUNT >= v0 || VCOUNT < v1); + } + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen16Bit(BG2CNT, BG2X_L, BG2X_H, + BG2Y_L, BG2Y_H, BG2PA, BG2PB, + BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + gfxDrawOBJWin(); + + uint8 inWin0Mask = WININ & 0xFF; + uint8 inWin1Mask = WININ >> 8; + uint8 outMask = WINOUT & 0xFF; + + uint32 background = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = background; + uint8 top = 0x20; + uint8 mask = outMask; + + if(!(lineOBJWin[x] & 0x80000000)) { + mask = WINOUT >> 8; + } + + if(inWindow1) { + if(gfxInWin1[x]) + mask = inWin1Mask; + } + + if(inWindow0) { + if(gfxInWin0[x]) { + mask = inWin0Mask; + } + } + + if((mask & 4) && (line2[x] < color)) { + color = line2[x]; + top = 0x04; + } + + if((mask & 16) && ((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24))) { + color = lineOBJ[x]; + top = 0x10; + } + + if(mask & 32) { + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = background; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((mask & 16) && (uint8)(lineOBJ[x]>>24) < (uint8)(back >> 24)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + } else if(color & 0x00010000) { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +} diff --git a/Mednafen/mednafen/gba/Mode4.cpp b/Mednafen/mednafen/gba/Mode4.cpp new file mode 100644 index 0000000000..705175f8d8 --- /dev/null +++ b/Mednafen/mednafen/gba/Mode4.cpp @@ -0,0 +1,407 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Gfx.h" +#include "Globals.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +void mode4RenderLine() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x0080) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + gfxDrawRotScreen256(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + if(line2[x] < color) { + color = line2[x]; + top = 0x04; + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(color >> 24)) { + color = lineOBJ[x]; + top = 0x10; + } + + if((top & 0x10) && (color & 0x00010000)) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode4RenderLineNoWindow() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x0080) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + if(layerEnable & 0x400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen256(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + + if(line2[x] < color) { + color = line2[x]; + top = 0x04; + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(color >> 24)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(back >> 24)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if(line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode4RenderLineAll() +{ + uint16 *palette = (uint16 *)paletteRAM; + + if(DISPCNT & 0x0080) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + bool inWindow0 = false; + bool inWindow1 = false; + + if(layerEnable & 0x2000) { + uint8 v0 = WIN0V >> 8; + uint8 v1 = WIN0V & 255; + inWindow0 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow0 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow0 |= (VCOUNT >= v0 || VCOUNT < v1); + } + if(layerEnable & 0x4000) { + uint8 v0 = WIN1V >> 8; + uint8 v1 = WIN1V & 255; + inWindow1 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow1 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow1 |= (VCOUNT >= v0 || VCOUNT < v1); + } + + if(layerEnable & 0x400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen256(BG2CNT, BG2X_L, BG2X_H, BG2Y_L, BG2Y_H, + BG2PA, BG2PB, BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + gfxDrawOBJWin(); + + uint32 backdrop = (READ16LE(&palette[0]) | 0x30000000); + + uint8 inWin0Mask = WININ & 0xFF; + uint8 inWin1Mask = WININ >> 8; + uint8 outMask = WINOUT & 0xFF; + + for(int x = 0; x < 240; x++) { + uint32 color = backdrop; + uint8 top = 0x20; + uint8 mask = outMask; + + if(!(lineOBJWin[x] & 0x80000000)) { + mask = WINOUT >> 8; + } + + if(inWindow1) { + if(gfxInWin1[x]) + mask = inWin1Mask; + } + + if(inWindow0) { + if(gfxInWin0[x]) { + mask = inWin0Mask; + } + } + + if((mask & 4) && (line2[x] < color)) { + color = line2[x]; + top = 0x04; + } + + if((mask & 16) && ((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24))) { + color = lineOBJ[x]; + top = 0x10; + } + + if(mask & 32) { + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((mask & 16) && (uint8)(lineOBJ[x]>>24) < (uint8)(back >> 24)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + } else if(color & 0x00010000) { + // semi-transparent OBJ + uint32 back = backdrop; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +} diff --git a/Mednafen/mednafen/gba/Mode5.cpp b/Mednafen/mednafen/gba/Mode5.cpp new file mode 100644 index 0000000000..da4acdc112 --- /dev/null +++ b/Mednafen/mednafen/gba/Mode5.cpp @@ -0,0 +1,411 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "Gfx.h" +#include "gfx-draw.h" + +namespace MDFN_IEN_GBA +{ + +void mode5RenderLine() +{ + if(DISPCNT & 0x0080) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + uint16 *palette = (uint16 *)paletteRAM; + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen16Bit160(BG2CNT, BG2X_L, BG2X_H, + BG2Y_L, BG2Y_H, BG2PA, BG2PB, + BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + + uint32 background = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = background; + uint8 top = 0x20; + + if(line2[x] < color) { + color = line2[x]; + top = 0x04; + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24)) { + color = lineOBJ[x]; + top = 0x10; + } + + if((top & 0x10) && (color & 0x00010000)) { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if(line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode5RenderLineNoWindow() +{ + if(DISPCNT & 0x0080) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + uint16 *palette = (uint16 *)paletteRAM; + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen16Bit160(BG2CNT, BG2X_L, BG2X_H, + BG2Y_L, BG2Y_H, BG2PA, BG2PB, + BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + + uint32 background = ( READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = background; + uint8 top = 0x20; + + if(line2[x] < color) { + color = line2[x]; + top = 0x04; + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24)) { + color = lineOBJ[x]; + top = 0x10; + } + + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = background; + uint8 top2 = 0x20; + + if(line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((uint8)(lineOBJ[x]>>24) < (uint8)(back >> 24)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if(line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +void mode5RenderLineAll() +{ + if(DISPCNT & 0x0080) { + for(int x = 0; x < 240; x++) { + lineMix[x] = 0x7fff; + } + gfxLastVCOUNT = VCOUNT; + return; + } + + uint16 *palette = (uint16 *)paletteRAM; + + if(layerEnable & 0x0400) { + int changed = gfxBG2Changed; + + if(gfxLastVCOUNT > VCOUNT) + changed = 3; + + gfxDrawRotScreen16Bit160(BG2CNT, BG2X_L, BG2X_H, + BG2Y_L, BG2Y_H, BG2PA, BG2PB, + BG2PC, BG2PD, + gfxBG2X, gfxBG2Y, changed, + line2); + } + + gfxDrawSprites(); + gfxDrawOBJWin(); + + bool inWindow0 = false; + bool inWindow1 = false; + + if(layerEnable & 0x2000) { + uint8 v0 = WIN0V >> 8; + uint8 v1 = WIN0V & 255; + inWindow0 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow0 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow0 |= (VCOUNT >= v0 || VCOUNT < v1); + } + if(layerEnable & 0x4000) { + uint8 v0 = WIN1V >> 8; + uint8 v1 = WIN1V & 255; + inWindow1 = ((v0 == v1) && (v0 >= 0xe8)); + if(v1 >= v0) + inWindow1 |= (VCOUNT >= v0 && VCOUNT < v1); + else + inWindow1 |= (VCOUNT >= v0 || VCOUNT < v1); + } + + uint8 inWin0Mask = WININ & 0xFF; + uint8 inWin1Mask = WININ >> 8; + uint8 outMask = WINOUT & 0xFF; + + uint32 background = (READ16LE(&palette[0]) | 0x30000000); + + for(int x = 0; x < 240; x++) { + uint32 color = background; + uint8 top = 0x20; + uint8 mask = outMask; + + if(!(lineOBJWin[x] & 0x80000000)) { + mask = WINOUT >> 8; + } + + if(inWindow1) { + if(gfxInWin1[x]) + mask = inWin1Mask; + } + + if(inWindow0) { + if(gfxInWin0[x]) { + mask = inWin0Mask; + } + } + + if((mask & 4) && (line2[x] < color)) { + color = line2[x]; + top = 0x04; + } + + if((mask & 16) && ((uint8)(lineOBJ[x]>>24) < (uint8)(color >>24))) { + color = lineOBJ[x]; + top = 0x10; + } + + if(mask & 32) { + if(!(color & 0x00010000)) { + switch((BLDMOD >> 6) & 3) { + case 0: + break; + case 1: + { + if(top & BLDMOD) { + uint32 back = background; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + if(top != 0x04) { + back = line2[x]; + top2 = 0x04; + } + } + + if((mask & 16) && (uint8)(lineOBJ[x]>>24) < (uint8)(back >> 24)) { + if(top != 0x10) { + back = lineOBJ[x]; + top2 = 0x10; + } + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + + } + } + break; + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } else { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + } else if(color & 0x00010000) { + // semi-transparent OBJ + uint32 back = background; + uint8 top2 = 0x20; + + if((mask & 4) && line2[x] < back) { + back = line2[x]; + top2 = 0x04; + } + + if(top2 & (BLDMOD>>8)) + color = gfxAlphaBlend(color, back, + all_coeff[COLEV & 0x1F], + all_coeff[(COLEV >> 8) & 0x1F]); + else { + switch((BLDMOD >> 6) & 3) { + case 2: + if(BLDMOD & top) + color = gfxIncreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + case 3: + if(BLDMOD & top) + color = gfxDecreaseBrightness(color, all_coeff[COLY & 0x1F]); + break; + } + } + } + + lineMix[x] = color; + } + gfxBG2Changed = 0; + gfxLastVCOUNT = VCOUNT; +} + +} diff --git a/Mednafen/mednafen/gba/Port.h b/Mednafen/mednafen/gba/Port.h new file mode 100644 index 0000000000..a06199cc58 --- /dev/null +++ b/Mednafen/mednafen/gba/Port.h @@ -0,0 +1,29 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_PORT_H +#define VBA_PORT_H + +#define READ16LE(base) MDFN_de16lsb(base) +#define READ32LE(base) MDFN_de32lsb(base) + +#define WRITE16LE(x,v) MDFN_en16lsb(x,v) +#define WRITE32LE(x,v) MDFN_en32lsb(x,v) + +#endif diff --git a/Mednafen/mednafen/gba/RTC.cpp b/Mednafen/mednafen/gba/RTC.cpp new file mode 100644 index 0000000000..d2b960d3b7 --- /dev/null +++ b/Mednafen/mednafen/gba/RTC.cpp @@ -0,0 +1,228 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include +#include "GBA.h" +#include "Globals.h" +#include "Port.h" + +#include + +namespace MDFN_IEN_GBA +{ + +RTC::RTC() +{ + InitTime(); + Reset(); +} + +RTC::~RTC() +{ + +} + +void RTC::InitTime(void) +{ + time_t long_time; + + time( &long_time ); /* Get time as long integer. */ + + curtime = (int64)long_time * 16777216; +} + +void RTC::AddTime(int32 amount) +{ + curtime += amount; +} + +uint16 RTC::Read(uint32 address) +{ + if(address == 0x80000c8) + return byte2; + else if(address == 0x80000c6) + return byte1; + else if(address == 0x80000c4) + return byte0; + + abort(); +} + +static uint8 toBCD(uint8 value) +{ + value = value % 100; + int l = value % 10; + int h = value / 10; + return h * 16 + l; +} + +void RTC::Write(uint32 address, uint16 value) +{ + if(address == 0x80000c8) { + byte2 = (uint8)value; // enable ? + } else if(address == 0x80000c6) { + byte1 = (uint8)value; // read/write + } else if(address == 0x80000c4) { + if(byte2 & 1) { + if(state == IDLE && byte0 == 1 && value == 5) { + state = COMMAND; + bits = 0; + command = 0; + } else if(!(byte0 & 1) && (value & 1)) { // bit transfer + byte0 = (uint8)value; + switch(state) { + case COMMAND: + command |= ((value & 2) >> 1) << (7-bits); + bits++; + if(bits == 8) { + bits = 0; + switch(command) { + case 0x60: + // not sure what this command does but it doesn't take parameters + // maybe it is a reset or stop + state = IDLE; + bits = 0; + break; + case 0x62: + // this sets the control state but not sure what those values are + state = READDATA; + dataLen = 1; + break; + case 0x63: + dataLen = 1; + data[0] = 0x40; + state = DATA; + break; + case 0x64: + break; + case 0x65: + { + struct tm *newtime; + time_t long_time; + + long_time = curtime / 16777216; + newtime = localtime( &long_time ); /* Convert to local time. */ + + dataLen = 7; + data[0] = toBCD(newtime->tm_year); + data[1] = toBCD(newtime->tm_mon+1); + data[2] = toBCD(newtime->tm_mday); + data[3] = toBCD(newtime->tm_wday); + data[4] = toBCD(newtime->tm_hour); + data[5] = toBCD(newtime->tm_min); + data[6] = toBCD(newtime->tm_sec); + state = DATA; + } + break; + case 0x67: + { + struct tm *newtime; + time_t long_time; + + long_time = curtime / 16777216; + newtime = localtime( &long_time ); /* Convert to local time. */ + + dataLen = 3; + data[0] = toBCD(newtime->tm_hour); + data[1] = toBCD(newtime->tm_min); + data[2] = toBCD(newtime->tm_sec); + state = DATA; + } + break; + default: + //systemMessage(0, N_("Unknown RTC command %02x"), command); + state = IDLE; + break; + } + } + break; + case DATA: + if(byte1 & 2) { + } else { + byte0 = (byte0 & ~2) | + ((data[bits >> 3] >> + (bits & 7)) & 1)*2; + bits++; + if(bits == 8*dataLen) { + bits = 0; + state = IDLE; + } + } + break; + case READDATA: + if(!(byte1 & 2)) { + } else { + data[bits >> 3] = + (data[bits >> 3] >> 1) | + ((value << 6) & 128); + bits++; + if(bits == 8*dataLen) { + bits = 0; + state = IDLE; + } + } + break; + default: + break; + } + } else + byte0 = (uint8)value; + } + } +} + +void RTC::Reset(void) +{ + byte0 = 0; + byte1 = 0; + byte2 = 0; + command = 0; + dataLen = 0; + bits = 0; + state = IDLE; + + memset(data, 0, sizeof(data)); +} + +int RTC::StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(byte0), + SFVAR(byte1), + SFVAR(byte2), + SFVAR(command), + SFVAR(dataLen), + SFVAR(bits), + SFVAR(state), + SFARRAY(data, 12), + SFEND + }; + + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "RTC"); + + if(load) + { + + } + + return(ret); +} + +} diff --git a/Mednafen/mednafen/gba/RTC.h b/Mednafen/mednafen/gba/RTC.h new file mode 100644 index 0000000000..d5ead21ca9 --- /dev/null +++ b/Mednafen/mednafen/gba/RTC.h @@ -0,0 +1,62 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_RTC_H +#define VBA_RTC_H + +namespace MDFN_IEN_GBA +{ + +class RTC +{ + public: + + RTC(); + ~RTC(); + + void InitTime(void); + + uint16 Read(uint32 address); + void Write(uint32 address, uint16 value); + void Reset(void); + + void AddTime(int32 amount); + + int StateAction(StateMem *sm, int load, int data_only); + + private: + + enum RTCSTATE { IDLE, COMMAND, DATA, READDATA }; + + uint8 byte0; + uint8 byte1; + uint8 byte2; + uint8 command; + int dataLen; + int bits; + RTCSTATE state; + uint8 data[12]; + + int64 curtime; // GBA CPU cycles since the Epoch, in local time. + +}; + +} + +#endif diff --git a/Mednafen/mednafen/gba/Sound.cpp b/Mednafen/mednafen/gba/Sound.cpp new file mode 100644 index 0000000000..526ca27d67 --- /dev/null +++ b/Mednafen/mednafen/gba/Sound.cpp @@ -0,0 +1,455 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "Sound.h" +#include "Port.h" + +#include + +#include +#include + +#include + +namespace MDFN_IEN_GBA +{ + +typedef Blip_Synth Synth; + +static Synth synth; + +static Gb_Apu gba_apu; +static Stereo_Buffer gba_buf; + +extern uint32 soundTS; + +static int lleft = 0, lright = 0; + +int soundControl = 0; + +typedef struct +{ + int32 FifoIndex; + int32 FifoCount; + int32 FifoWriteIndex; + bool Enabled; + int32 Timer; + uint8 Fifo[32]; + uint8 Value; +} GBADigiSound; + +GBADigiSound DSChans[2]; // Digital sound channels, not Nintendo DS :b + +#define soundDSFifoAIndex DSChans[0].FifoIndex +#define soundDSFifoACount DSChans[0].FifoCount +#define soundDSFifoAWriteIndex DSChans[0].FifoWriteIndex +#define soundDSAEnabled DSChans[0].Enabled +#define soundDSATimer DSChans[0].Timer +#define soundDSFifoA DSChans[0].Fifo +#define soundDSAValue DSChans[0].Value + +#define soundDSFifoBIndex DSChans[1].FifoIndex +#define soundDSFifoBCount DSChans[1].FifoCount +#define soundDSFifoBWriteIndex DSChans[1].FifoWriteIndex +#define soundDSBEnabled DSChans[1].Enabled +#define soundDSBTimer DSChans[1].Timer +#define soundDSFifoB DSChans[1].Fifo +#define soundDSBValue DSChans[1].Value + +int MDFNGBASOUND_StateAction(StateMem *sm, int load, int data_only) +{ + gb_apu_state_t apu_state; + + //if(!load) // always save state, in case there is none to load + gba_apu.save_state( &apu_state ); + + SFORMAT StateRegs[] = + { + SFVAR(soundControl), + SFVAR(soundDSFifoAIndex), + SFVAR(soundDSFifoACount), + SFVAR(soundDSFifoAWriteIndex), + SFVAR(soundDSAEnabled), + SFVAR(soundDSATimer), + SFARRAYN(soundDSFifoA, sizeof(soundDSFifoA), "soundDSFifoA"), + SFVAR(soundDSAValue), + SFVAR(soundDSFifoBIndex), + SFVAR(soundDSFifoBCount), + SFVAR(soundDSFifoBWriteIndex), + SFVAR(soundDSBEnabled), + SFVAR(soundDSBTimer), + SFARRAYN(soundDSFifoB, sizeof(soundDSFifoB), "soundDSFifoB"), + SFVAR(soundDSBValue), + + SFARRAYN((uint8*)&apu_state, sizeof(apu_state), "apu_state"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "SND"); + if(ret && load) + { + gba_apu.reset( gba_apu.mode_agb, true ); + (void) gba_apu.load_state( apu_state ); // TODO: warn if this returns error + } + return(ret); +} + +uint8 soundRead(uint32 address) +{ + if(address == 0x80) + return(gba_apu.read_register(soundTS, 0xff24)); + else if(address == 0x81) + return(gba_apu.read_register(soundTS, 0xff25)); + else if(address == 0x84) + return(gba_apu.read_register(soundTS, 0xff26)); + else if(address >= 0x90 && address <= 0x9f) + { + return(gba_apu.read_register(soundTS, address - 0x90 + 0xff30)); + } + return(ioMem[address]); +} + +void soundEvent(uint32 address, uint8 data) +{ + uint32 origa = address; + address &= 0xFF; + + if(address == 0x60) + address = 0xff10; + else if(address == 0x62) + address = 0xff11; + else if(address == 0x63) + address = 0xff12; + else if(address == 0x64) + address = 0xff13; + else if(address == 0x65) + address = 0xff14; + + else if(address == 0x68) + address = 0xff16; + else if(address == 0x69) + address = 0xff17; + else if(address == 0x6c) + address = 0xff18; + else if(address == 0x6d) + address = 0xff19; + + else if(address == 0x70) + address = 0xff1a; + else if(address == 0x72) + address = 0xff1b; + else if(address == 0x73) + address = 0xff1c; + else if(address == 0x74) + address = 0xff1d; + else if(address == 0x75) + address = 0xff1e; + + else if(address == 0x78) + address = 0xff20; + else if(address == 0x79) + address = 0xff21; + else if(address == 0x7c) + address = 0xff22; + else if(address == 0x7d) + address = 0xff23; + + else if(address == 0x80) + address = 0xff24; + else if(address == 0x81) + address = 0xff25; + else if(address == 0x84) + address = 0xff26; + else if(address >= 0x90 && address <= 0x9f) + { + address += 0xff30 - 0x90; + } + else + { + ioMem[origa] = data; + return; + } + ioMem[origa] = data; + + gba_apu.write_register(soundTS, address, data); +} + +void soundEvent(uint32 address, uint16 data) +{ + switch(address) { + case SGCNT0_H: + data &= 0xFF0F; + soundControl = data & 0x770F;; + if(data & 0x0800) { + soundDSFifoAWriteIndex = 0; + soundDSFifoAIndex = 0; + soundDSFifoACount = 0; + soundDSAValue = 0; + memset(soundDSFifoA, 0, 32); + } + soundDSAEnabled = (data & 0x0300) ? true : false; + soundDSATimer = (data & 0x0400) ? 1 : 0; + if(data & 0x8000) { + soundDSFifoBWriteIndex = 0; + soundDSFifoBIndex = 0; + soundDSFifoBCount = 0; + soundDSBValue = 0; + memset(soundDSFifoB, 0, 32); + } + soundDSBEnabled = (data & 0x3000) ? true : false; + soundDSBTimer = (data & 0x4000) ? 1 : 0; + WRITE16LE(((uint16 *)&ioMem[address]), data); + break; + case FIFOA_L: + case FIFOA_H: + soundDSFifoA[soundDSFifoAWriteIndex++] = data & 0xFF; + soundDSFifoA[soundDSFifoAWriteIndex++] = data >> 8; + soundDSFifoACount += 2; + soundDSFifoAWriteIndex &= 31; + WRITE16LE(((uint16 *)&ioMem[address]), data); + break; + case FIFOB_L: + case FIFOB_H: + soundDSFifoB[soundDSFifoBWriteIndex++] = data & 0xFF; + soundDSFifoB[soundDSFifoBWriteIndex++] = data >> 8; + soundDSFifoBCount += 2; + soundDSFifoBWriteIndex &= 31; + WRITE16LE(((uint16 *)&ioMem[address]), data); + break; + case 0x88: + data &= 0xC3FF; + WRITE16LE(((uint16 *)&ioMem[address]), data); + break; + case 0x90: + case 0x92: + case 0x94: + case 0x96: + case 0x98: + case 0x9a: + case 0x9c: + case 0x9e: + //printf("Yay: %04x: %04x\n", 0xFF30 + (address & 0xF), data); + gba_apu.write_register(soundTS, 0xFF30 + (address & 0xF), data & 0xFF); + gba_apu.write_register(soundTS, 0xFF30 + (address & 0xF) + 1, data >> 8); + //*((uint16 *)&sound3WaveRam[(sound3Bank*0x10)^0x10+(address&14)]) = data; + //WRITE16LE(((uint16 *)&ioMem[address]), data); + break; + } +} + +#ifndef max +#define max(a,b) (a)<(b)?(b):(a) +#endif + +static inline void soundMix(int &left, int &right) +{ + int res = 0; + int dsaRatio = ioMem[0x82] & 4; + int dsbRatio = ioMem[0x82] & 8; + + if(soundControl & 0x0200) + { + if(!dsaRatio) + { + res = (int8)soundDSAValue >> 1; + } + else + res = (int8)soundDSAValue; + } + + if(soundControl & 0x2000) + { + if(!dsbRatio) + { + res += (int8)soundDSBValue >> 1; + } + else + res += (int8)soundDSBValue; + } + + left = res; + + res = 0; + + if(soundControl & 0x0100) + { + if(!dsaRatio) + res = (int8)soundDSAValue >> 1; + else + res = (int8)soundDSAValue; + } + + if(soundControl & 0x1000) + { + if(!dsbRatio) + res += (int8)soundDSAValue >> 1; + else + res += (int8)soundDSBValue; + } + right = res; +} + +int meow = 0; + +static inline void soundLick(void) +{ + int left, right; + + left = right = 0; + + soundMix(left, right); + + if(left != lleft) + synth.offset_inline(soundTS, left - lleft, gba_buf.left()); + + if(right != lright) + synth.offset_inline(soundTS, right - lright, gba_buf.right()); + + lleft = left; + lright = right; +} + +static void DSTimer(int which, int dmamask) +{ + if(DSChans[which].Enabled) + { + if(DSChans[which].FifoCount <= 16) + { + CPUCheckDMA(3, dmamask); + } + + if(DSChans[which].FifoCount > 16) + { + DSChans[which].Value = (DSChans[which].Fifo[DSChans[which].FifoIndex]); + DSChans[which].FifoIndex = (DSChans[which].FifoIndex + 1) & 0x1F; + DSChans[which].FifoCount--; + } + } + else + { + DSChans[which].Value = 0; + } +} + +void soundTimerOverflow(int timer) +{ + bool NeedLick = FALSE; + + if(soundDSAEnabled && (soundDSATimer == timer)) + { + DSTimer(0, 2); + NeedLick = TRUE; + } + + if(soundDSBEnabled && (soundDSBTimer == timer)) + { + DSTimer(1, 4); + NeedLick = TRUE; + } + + if(NeedLick) + soundLick(); +} + +int32 MDFNGBASOUND_Flush(int16 *SoundBuf, const int32 MaxSoundFrames) +{ + const int ratio = ioMem[0x82] & 3; + static const int rat_table[4] = { 2, 1, 0, 2 }; + int32 FrameCount = 0; + + gba_apu.volume(0.333 * (double)(4 >> rat_table[ratio]) / 4); + + gba_apu.end_frame(soundTS); + + gba_buf.end_frame(soundTS); + + if(SoundBuf) + FrameCount = gba_buf.read_samples(SoundBuf, MaxSoundFrames * 2) / 2; + else + gba_buf.clear(); + + soundTS = 0; + + +#if 0 + if(SoundBuf) + { + unsigned long long crf = (unsigned long long)gba_buf.left()->clock_rate_factor(gba_buf.left()->clock_rate()); + double real_rate = (double)crf * gba_buf.left()->clock_rate() / (1ULL << BLIP_BUFFER_ACCURACY); + + printf("%f\n", real_rate); + } +#endif + + return(FrameCount); +} + +void MDFNGBASOUND_Init(void) +{ + MDFNGBA_SetSoundRate(0); + + gba_buf.clock_rate((long)(4194304 * 4)); + + gba_apu.set_output(gba_buf.center(), gba_buf.left(), gba_buf.right()); + + gba_apu.reset( gba_apu.mode_agb, true ); + + gba_apu.volume(0.333); + synth.volume(0.666); + + gba_buf.bass_freq(20); +} + +void MDFNGBASOUND_Kill(void) +{ + //gba_apu.set_output(NULL, NULL, NULL); + gba_buf.clear(); +} + + +void soundReset() +{ + for(int ch = 0; ch < 2; ch++) + { + DSChans[ch].FifoIndex = 0; + DSChans[ch].FifoCount = 0; + DSChans[ch].FifoWriteIndex = 0; + DSChans[ch].Enabled = false; + DSChans[ch].Timer = 0; + memset(DSChans[ch].Fifo, 0, 32); + DSChans[ch].Value = 0; + } + + for(int addr = 0x90; addr < 0xA0;) + { + ioMem[addr++] = 0x00; + ioMem[addr++] = 0xff; + } + + gba_apu.reset( gba_apu.mode_agb, true ); +} + +bool MDFNGBA_SetSoundRate(uint32 rate) +{ + gba_buf.set_sample_rate(rate?rate:44100, 60); + return(TRUE); +} + +} diff --git a/Mednafen/mednafen/gba/Sound.h b/Mednafen/mednafen/gba/Sound.h new file mode 100644 index 0000000000..bce1072dc7 --- /dev/null +++ b/Mednafen/mednafen/gba/Sound.h @@ -0,0 +1,69 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_SOUND_H +#define VBA_SOUND_H + +namespace MDFN_IEN_GBA +{ + +#define NR10 0x60 +#define NR11 0x62 +#define NR12 0x63 +#define NR13 0x64 +#define NR14 0x65 +#define NR21 0x68 +#define NR22 0x69 +#define NR23 0x6c +#define NR24 0x6d +#define NR30 0x70 +#define NR31 0x72 +#define NR32 0x73 +#define NR33 0x74 +#define NR34 0x75 +#define NR41 0x78 +#define NR42 0x79 +#define NR43 0x7c +#define NR44 0x7d +#define NR50 0x80 +#define NR51 0x81 +#define NR52 0x84 +#define SGCNT0_H 0x82 +#define FIFOA_L 0xa0 +#define FIFOA_H 0xa2 +#define FIFOB_L 0xa4 +#define FIFOB_H 0xa6 + +extern void soundReset(); +extern void soundEvent(uint32, uint8); +extern void soundEvent(uint32, uint16); +extern void soundTimerOverflow(int); + +int32 MDFNGBASOUND_Flush(int16 *SoundBuf, const int32 MaxSoundFrames); +void MDFNGBASOUND_Init(void) MDFN_COLD; +void MDFNGBASOUND_Kill(void) MDFN_COLD; + +uint8 soundRead(uint32 address); + +bool MDFNGBA_SetSoundRate(uint32 rate); +int MDFNGBASOUND_StateAction(StateMem *sm, int load, int data_only); + +} + +#endif // VBA_SOUND_H diff --git a/Mednafen/mednafen/gba/arm.cpp b/Mednafen/mednafen/gba/arm.cpp new file mode 100644 index 0000000000..a3d5426783 --- /dev/null +++ b/Mednafen/mednafen/gba/arm.cpp @@ -0,0 +1,7946 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#define INCED_FROM_ARM_CPP + +#include "GBA.h" +#include "GBAinline.h" +#include "Globals.h" + +namespace MDFN_IEN_GBA +{ + +unsigned int RunARM(void) +{ + unsigned int clockTicks; + +#define OP_AND \ + reg[dest].I = reg[(opcode>>16)&15].I & value; + +#define OP_ANDS \ + reg[dest].I = reg[(opcode>>16)&15].I & value;\ + \ + N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\ + Z_FLAG = (reg[dest].I) ? false : true;\ + C_FLAG = C_OUT; + +#define OP_EOR \ + reg[dest].I = reg[(opcode>>16)&15].I ^ value; + +#define OP_EORS \ + reg[dest].I = reg[(opcode>>16)&15].I ^ value;\ + \ + N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\ + Z_FLAG = (reg[dest].I) ? false : true;\ + C_FLAG = C_OUT; + +#define NEG(i) ((i) >> 31) +#define POS(i) ((~(i)) >> 31) +#define ADDCARRY(a, b, c) \ + C_FLAG = ((NEG(a) & NEG(b)) |\ + (NEG(a) & POS(c)) |\ + (NEG(b) & POS(c))) ? true : false; +#define ADDOVERFLOW(a, b, c) \ + V_FLAG = ((NEG(a) & NEG(b) & POS(c)) |\ + (POS(a) & POS(b) & NEG(c))) ? true : false; +#define SUBCARRY(a, b, c) \ + C_FLAG = ((NEG(a) & POS(b)) |\ + (NEG(a) & POS(c)) |\ + (POS(b) & POS(c))) ? true : false; +#define SUBOVERFLOW(a, b, c)\ + V_FLAG = ((NEG(a) & POS(b) & POS(c)) |\ + (POS(a) & NEG(b) & NEG(c))) ? true : false; +#define OP_SUB \ + {\ + reg[dest].I = reg[base].I - value;\ + } +#define OP_SUBS \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define OP_RSB \ + {\ + reg[dest].I = value - reg[base].I;\ + } +#define OP_RSBS \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = rhs - lhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(rhs, lhs, res);\ + SUBOVERFLOW(rhs, lhs, res);\ + } +#define OP_ADD \ + {\ + reg[dest].I = reg[base].I + value;\ + } +#define OP_ADDS \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define OP_ADC \ + {\ + reg[dest].I = reg[base].I + value + (uint32)C_FLAG;\ + } +#define OP_ADCS \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs + (uint32)C_FLAG;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define OP_SBC \ + {\ + reg[dest].I = reg[base].I - value - !((uint32)C_FLAG);\ + } +#define OP_SBCS \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs - !((uint32)C_FLAG);\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define OP_RSC \ + {\ + reg[dest].I = value - reg[base].I - !((uint32)C_FLAG);\ + } +#define OP_RSCS \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = rhs - lhs - !((uint32)C_FLAG);\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(rhs, lhs, res);\ + SUBOVERFLOW(rhs, lhs, res);\ + } +#define OP_CMP \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define OP_CMN \ + {\ + uint32 lhs = reg[base].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } + +#define LOGICAL_LSL_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + C_OUT = (v >> (32 - shift)) & 1 ? true : false;\ + value = v << shift;\ + } +#define LOGICAL_LSR_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + C_OUT = (v >> (shift - 1)) & 1 ? true : false;\ + value = v >> shift;\ + } +#define LOGICAL_ASR_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + C_OUT = ((int32)v >> (int)(shift - 1)) & 1 ? true : false;\ + value = (int32)v >> (int)shift;\ + } +#define LOGICAL_ROR_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + C_OUT = (v >> (shift - 1)) & 1 ? true : false;\ + value = ((v << (32 - shift)) |\ + (v >> shift));\ + } +#define LOGICAL_RRX_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + shift = (int)C_FLAG;\ + C_OUT = (v & 1) ? true : false;\ + value = ((v >> 1) |\ + (shift << 31));\ + } +#define LOGICAL_ROR_IMM \ + {\ + uint32 v = opcode & 0xff;\ + C_OUT = (v >> (shift - 1)) & 1 ? true : false;\ + value = ((v << (32 - shift)) |\ + (v >> shift));\ + } +#define ARITHMETIC_LSL_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + value = v << shift;\ + } +#define ARITHMETIC_LSR_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + value = v >> shift;\ + } +#define ARITHMETIC_ASR_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + value = (int32)v >> (int)shift;\ + } +#define ARITHMETIC_ROR_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + value = ((v << (32 - shift)) |\ + (v >> shift));\ + } +#define ARITHMETIC_RRX_REG \ + {\ + uint32 v = reg[opcode & 0x0f].I;\ + shift = (int)C_FLAG;\ + value = ((v >> 1) |\ + (shift << 31));\ + } +#define ARITHMETIC_ROR_IMM \ + {\ + uint32 v = opcode & 0xff;\ + value = ((v << ((32 - shift) & 0x1F)) |\ + (v >> shift));\ + } +#define ROR_IMM_MSR \ + {\ + uint32 v = opcode & 0xff;\ + value = ((v << (32 - shift)) |\ + (v >> shift));\ + } +#define ROR_VALUE \ + {\ + value = ((value << (32 - shift)) |\ + (value >> shift));\ + } +#define RCR_VALUE \ + {\ + shift = (int)C_FLAG;\ + value = ((value >> 1) |\ + (shift << 31));\ + } + +#define OP_TST \ + uint32 res = reg[base].I & value;\ + N_FLAG = (res & 0x80000000) ? true : false;\ + Z_FLAG = (res) ? false : true;\ + C_FLAG = C_OUT; + +#define OP_TEQ \ + uint32 res = reg[base].I ^ value;\ + N_FLAG = (res & 0x80000000) ? true : false;\ + Z_FLAG = (res) ? false : true;\ + C_FLAG = C_OUT; + +#define OP_ORR \ + reg[dest].I = reg[base].I | value; + +#define OP_ORRS \ + reg[dest].I = reg[base].I | value;\ + N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\ + Z_FLAG = (reg[dest].I) ? false : true;\ + C_FLAG = C_OUT; + +#define OP_MOV \ + reg[dest].I = value; + +#define OP_MOVS \ + reg[dest].I = value;\ + N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\ + Z_FLAG = (reg[dest].I) ? false : true;\ + C_FLAG = C_OUT; + +#define OP_BIC \ + reg[dest].I = reg[base].I & (~value); + +#define OP_BICS \ + reg[dest].I = reg[base].I & (~value);\ + N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\ + Z_FLAG = (reg[dest].I) ? false : true;\ + C_FLAG = C_OUT; + +#define OP_MVN \ + reg[dest].I = ~value; + +#define OP_MVNS \ + reg[dest].I = ~value; \ + N_FLAG = (reg[dest].I & 0x80000000) ? true : false;\ + Z_FLAG = (reg[dest].I) ? false : true;\ + C_FLAG = C_OUT; + +#define CASE_16(BASE) \ + case BASE:\ + case BASE+1:\ + case BASE+2:\ + case BASE+3:\ + case BASE+4:\ + case BASE+5:\ + case BASE+6:\ + case BASE+7:\ + case BASE+8:\ + case BASE+9:\ + case BASE+10:\ + case BASE+11:\ + case BASE+12:\ + case BASE+13:\ + case BASE+14:\ + case BASE+15: + +#define CASE_256(BASE) \ + CASE_16(BASE)\ + CASE_16(BASE+0x10)\ + CASE_16(BASE+0x20)\ + CASE_16(BASE+0x30)\ + CASE_16(BASE+0x40)\ + CASE_16(BASE+0x50)\ + CASE_16(BASE+0x60)\ + CASE_16(BASE+0x70)\ + CASE_16(BASE+0x80)\ + CASE_16(BASE+0x90)\ + CASE_16(BASE+0xa0)\ + CASE_16(BASE+0xb0)\ + CASE_16(BASE+0xc0)\ + CASE_16(BASE+0xd0)\ + CASE_16(BASE+0xe0)\ + CASE_16(BASE+0xf0) + +#define LOGICAL_DATA_OPCODE(OPCODE, OPCODE2, BASE) \ + case BASE: \ + case BASE+8:\ + {\ + /* OP Rd,Rb,Rm LSL # */ \ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + \ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_LSL_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+2:\ + case BASE+10:\ + {\ + /* OP Rd,Rb,Rm LSR # */ \ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_LSR_REG\ + } else {\ + value = 0;\ + C_OUT = (reg[opcode & 0x0F].I & 0x80000000) ? true : false;\ + }\ + \ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+4:\ + case BASE+12:\ + {\ + /* OP Rd,Rb,Rm ASR # */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_ASR_REG\ + } else {\ + if(reg[opcode & 0x0F].I & 0x80000000){\ + value = 0xFFFFFFFF;\ + C_OUT = true;\ + } else {\ + value = 0;\ + C_OUT = false;\ + } \ + }\ + \ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+6:\ + case BASE+14:\ + {\ + /* OP Rd,Rb,Rm ROR # */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_ROR_REG\ + } else {\ + LOGICAL_RRX_REG\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+1:\ + {\ + /* OP Rd,Rb,Rm LSL Rs */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + if(shift == 32) {\ + value = 0;\ + C_OUT = (reg[opcode & 0x0F].I & 1 ? true : false);\ + } else if(shift < 32) {\ + LOGICAL_LSL_REG\ + } else {\ + value = 0;\ + C_OUT = false;\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+3:\ + {\ + /* OP Rd,Rb,Rm LSR Rs */ \ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + if(shift == 32) {\ + value = 0;\ + C_OUT = (reg[opcode & 0x0F].I & 0x80000000 ? true : false);\ + } else if(shift < 32) {\ + LOGICAL_LSR_REG\ + } else {\ + value = 0;\ + C_OUT = false;\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+5:\ + {\ + /* OP Rd,Rb,Rm ASR Rs */ \ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift < 32) {\ + if(shift) {\ + LOGICAL_ASR_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + } else {\ + if(reg[opcode & 0x0F].I & 0x80000000){\ + value = 0xFFFFFFFF;\ + C_OUT = true;\ + } else {\ + value = 0;\ + C_OUT = false;\ + }\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+7:\ + {\ + /* OP Rd,Rb,Rm ROR Rs */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + shift &= 0x1f;\ + if(shift) {\ + LOGICAL_ROR_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + C_OUT = (value & 0x80000000 ? true : false);\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + C_OUT = (value & 0x80000000 ? true : false);\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+0x200:\ + case BASE+0x201:\ + case BASE+0x202:\ + case BASE+0x203:\ + case BASE+0x204:\ + case BASE+0x205:\ + case BASE+0x206:\ + case BASE+0x207:\ + case BASE+0x208:\ + case BASE+0x209:\ + case BASE+0x20a:\ + case BASE+0x20b:\ + case BASE+0x20c:\ + case BASE+0x20d:\ + case BASE+0x20e:\ + case BASE+0x20f:\ + {\ + int shift = (opcode & 0xF00) >> 7;\ + int base = (opcode >> 16) & 0x0F;\ + int dest = (opcode >> 12) & 0x0F;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_ROR_IMM\ + } else {\ + value = opcode & 0xff;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break; + +#define LOGICAL_DATA_OPCODE_WITHOUT_base(OPCODE, OPCODE2, BASE) \ + case BASE: \ + case BASE+8:\ + {\ + /* OP Rd,Rb,Rm LSL # */ \ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + \ + if(shift) {\ + LOGICAL_LSL_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+2:\ + case BASE+10:\ + {\ + /* OP Rd,Rb,Rm LSR # */ \ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_LSR_REG\ + } else {\ + value = 0;\ + C_OUT = (reg[opcode & 0x0F].I & 0x80000000) ? true : false;\ + }\ + \ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+4:\ + case BASE+12:\ + {\ + /* OP Rd,Rb,Rm ASR # */\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_ASR_REG\ + } else {\ + if(reg[opcode & 0x0F].I & 0x80000000){\ + value = 0xFFFFFFFF;\ + C_OUT = true;\ + } else {\ + value = 0;\ + C_OUT = false;\ + } \ + }\ + \ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+6:\ + case BASE+14:\ + {\ + /* OP Rd,Rb,Rm ROR # */\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_ROR_REG\ + } else {\ + LOGICAL_RRX_REG\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+1:\ + {\ + /* OP Rd,Rb,Rm LSL Rs */\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + if(shift == 32) {\ + value = 0;\ + C_OUT = (reg[opcode & 0x0F].I & 1 ? true : false);\ + } else if(shift < 32) {\ + LOGICAL_LSL_REG\ + } else {\ + value = 0;\ + C_OUT = false;\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+3:\ + {\ + /* OP Rd,Rb,Rm LSR Rs */ \ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + if(shift == 32) {\ + value = 0;\ + C_OUT = (reg[opcode & 0x0F].I & 0x80000000 ? true : false);\ + } else if(shift < 32) {\ + LOGICAL_LSR_REG\ + } else {\ + value = 0;\ + C_OUT = false;\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+5:\ + {\ + /* OP Rd,Rb,Rm ASR Rs */ \ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift < 32) {\ + if(shift) {\ + LOGICAL_ASR_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + } else {\ + if(reg[opcode & 0x0F].I & 0x80000000){\ + value = 0xFFFFFFFF;\ + C_OUT = true;\ + } else {\ + value = 0;\ + C_OUT = false;\ + }\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+7:\ + {\ + /* OP Rd,Rb,Rm ROR Rs */\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + shift &= 0x1f;\ + if(shift) {\ + LOGICAL_ROR_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + C_OUT = (value & 0x80000000 ? true : false);\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + C_OUT = (value & 0x80000000 ? true : false);\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+0x200:\ + case BASE+0x201:\ + case BASE+0x202:\ + case BASE+0x203:\ + case BASE+0x204:\ + case BASE+0x205:\ + case BASE+0x206:\ + case BASE+0x207:\ + case BASE+0x208:\ + case BASE+0x209:\ + case BASE+0x20a:\ + case BASE+0x20b:\ + case BASE+0x20c:\ + case BASE+0x20d:\ + case BASE+0x20e:\ + case BASE+0x20f:\ + {\ + int shift = (opcode & 0xF00) >> 7;\ + int dest = (opcode >> 12) & 0x0F;\ + bool C_OUT MDFN_NOWARN_UNUSED = C_FLAG;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + LOGICAL_ROR_IMM\ + } else {\ + value = opcode & 0xff;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break; + +#define ARITHMETIC_DATA_OPCODE(OPCODE, OPCODE2, BASE) \ + case BASE:\ + case BASE+8:\ + {\ + /* OP Rd,Rb,Rm LSL # */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + ARITHMETIC_LSL_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+2:\ + case BASE+10:\ + {\ + /* OP Rd,Rb,Rm LSR # */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + ARITHMETIC_LSR_REG\ + } else {\ + value = 0;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+4:\ + case BASE+12:\ + {\ + /* OP Rd,Rb,Rm ASR # */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + ARITHMETIC_ASR_REG\ + } else {\ + if(reg[opcode & 0x0F].I & 0x80000000){\ + value = 0xFFFFFFFF;\ + } else value = 0;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+6:\ + case BASE+14:\ + {\ + /* OP Rd,Rb,Rm ROR # */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = (opcode >> 7) & 0x1F;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + ARITHMETIC_ROR_REG\ + } else {\ + ARITHMETIC_RRX_REG\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+1:\ + {\ + /* OP Rd,Rb,Rm LSL Rs */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + if(shift == 32) {\ + value = 0;\ + } else if(shift < 32) {\ + ARITHMETIC_LSL_REG\ + } else value = 0;\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+3:\ + {\ + /* OP Rd,Rb,Rm LSR Rs */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + if(shift == 32) {\ + value = 0;\ + } else if(shift < 32) {\ + ARITHMETIC_LSR_REG\ + } else value = 0;\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+5:\ + {\ + /* OP Rd,Rb,Rm ASR Rs */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift < 32) {\ + if(shift) {\ + ARITHMETIC_ASR_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + } else {\ + if(reg[opcode & 0x0F].I & 0x80000000){\ + value = 0xFFFFFFFF;\ + } else value = 0;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+7:\ + {\ + /* OP Rd,Rb,Rm ROR Rs */\ + int base = (opcode >> 16) & 0x0F;\ + int shift = reg[(opcode >> 8)&15].B.B0;\ + int dest = (opcode>>12) & 15;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + if(shift) {\ + shift &= 0x1f;\ + if(shift) {\ + ARITHMETIC_ROR_REG\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + } else {\ + value = reg[opcode & 0x0F].I;\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break;\ + case BASE+0x200:\ + case BASE+0x201:\ + case BASE+0x202:\ + case BASE+0x203:\ + case BASE+0x204:\ + case BASE+0x205:\ + case BASE+0x206:\ + case BASE+0x207:\ + case BASE+0x208:\ + case BASE+0x209:\ + case BASE+0x20a:\ + case BASE+0x20b:\ + case BASE+0x20c:\ + case BASE+0x20d:\ + case BASE+0x20e:\ + case BASE+0x20f:\ + {\ + int shift = (opcode & 0xF00) >> 7;\ + int base = (opcode >> 16) & 0x0F;\ + int dest = (opcode >> 12) & 0x0F;\ + uint32 value;\ + if ((dest == 15)||((opcode & 0x02000010)==0x10))\ + {\ + clockTicks = 1+codeTicksAccesint32(armNextPC);\ + if ((opcode & 0x02000010)==0x10)\ + clockTicks++;\ + }\ + {\ + ARITHMETIC_ROR_IMM\ + }\ + if(dest == 15) {\ + clockTicks+=2+codeTicksAccessSeq32(armNextPC)+codeTicksAccessSeq32(armNextPC);\ + OPCODE2\ + /* todo */\ + if(opcode & 0x00100000) {\ + CPUSwitchMode(reg[17].I & 0x1f, false);\ + }\ + if(armState) {\ + reg[15].I &= 0xFFFFFFFC;\ + armNextPC = reg[15].I;\ + reg[15].I += 4;\ + ARM_PREFETCH;\ + } else {\ + reg[15].I &= 0xFFFFFFFE;\ + armNextPC = reg[15].I;\ + reg[15].I += 2;\ + THUMB_PREFETCH;\ + }\ + } else {\ + OPCODE \ + }\ + }\ + break; + + uint32 opcode = cpuPrefetch[0]; + cpuPrefetch[0] = cpuPrefetch[1]; + + busPrefetch = false; + if (busPrefetchCount & 0xFFFFFE00) + busPrefetchCount = 0x100 | (busPrefetchCount & 0xFF); + + + clockTicks = 0;//codeTicksAccessSeq32(armNextPC)+1; + int oldArmNextPC = armNextPC; + +#ifndef FINAL_VERSION + if(armNextPC == stop) { + armNextPC++; + } +#endif + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH_NEXT; + + int cond = opcode >> 28; + // suggested optimization for frequent cases + bool cond_res; + if(cond == 0x0e) { + cond_res = true; + } else { + switch(cond) { + case 0x00: // EQ + cond_res = Z_FLAG; + break; + case 0x01: // NE + cond_res = !Z_FLAG; + break; + case 0x02: // CS + cond_res = C_FLAG; + break; + case 0x03: // CC + cond_res = !C_FLAG; + break; + case 0x04: // MI + cond_res = N_FLAG; + break; + case 0x05: // PL + cond_res = !N_FLAG; + break; + case 0x06: // VS + cond_res = V_FLAG; + break; + case 0x07: // VC + cond_res = !V_FLAG; + break; + case 0x08: // HI + cond_res = C_FLAG && !Z_FLAG; + break; + case 0x09: // LS + cond_res = !C_FLAG || Z_FLAG; + break; + case 0x0A: // GE + cond_res = N_FLAG == V_FLAG; + break; + case 0x0B: // LT + cond_res = N_FLAG != V_FLAG; + break; + case 0x0C: // GT + cond_res = !Z_FLAG &&(N_FLAG == V_FLAG); + break; + case 0x0D: // LE + cond_res = Z_FLAG || (N_FLAG != V_FLAG); + break; + case 0x0E: + cond_res = true; + break; + case 0x0F: + default: + // ??? + cond_res = false; + break; + } + } + +if(cond_res) { + switch(((opcode>>16)&0xFF0) | ((opcode>>4)&0x0F)) { + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_AND, OP_AND, 0x000); + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_ANDS, OP_AND, 0x010); + case 0x009: + { + // MUL Rd, Rm, Rs + int dest = (opcode >> 16) & 0x0F; + int mult = (opcode & 0x0F); + clockTicks = 1; + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + reg[dest].I = reg[mult].I * rs; + if(((int32)rs)<0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + + } + break; + case 0x019: + { + // MULS Rd, Rm, Rs + int dest = (opcode >> 16) & 0x0F; + int mult = (opcode & 0x0F); + clockTicks = 1; + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + reg[dest].I = reg[mult].I * rs; + N_FLAG = (reg[dest].I & 0x80000000) ? true : false; + Z_FLAG = (reg[dest].I) ? false : true; + if(((int32)rs)<0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + case 0x00b: + case 0x02b: + { + // STRH Rd, [Rn], -Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + address -= offset; + reg[base].I = address; + } + break; + case 0x04b: + case 0x06b: + { + // STRH Rd, [Rn], #-offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + address -= offset; + reg[base].I = address; + } + break; + case 0x08b: + case 0x0ab: + { + // STRH Rd, [Rn], Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + address += offset; + reg[base].I = address; + } + break; + case 0x0cb: + case 0x0eb: + { + // STRH Rd, [Rn], #offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + address += offset; + reg[base].I = address; + } + break; + case 0x10b: + { + // STRH Rd, [Rn, -Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + } + break; + case 0x12b: + { + // STRH Rd, [Rn, -Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + reg[base].I = address; + } + break; + case 0x14b: + { + // STRH Rd, [Rn, -#offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + } + break; + case 0x16b: + { + // STRH Rd, [Rn, -#offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + reg[base].I = address; + } + break; + case 0x18b: + { + // STRH Rd, [Rn, Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + } + break; + case 0x1ab: + { + // STRH Rd, [Rn, Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + reg[base].I = address; + } + break; + case 0x1cb: + { + // STRH Rd, [Rn, #offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + } + break; + case 0x1eb: + { + // STRH Rd, [Rn, #offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + CPUWriteHalfWord(address, reg[dest].W.W0); + reg[base].I = address; + } + break; + case 0x01b: + case 0x03b: + { + // LDRH Rd, [Rn], -Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) { + address -= offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x05b: + case 0x07b: + { + // LDRH Rd, [Rn], #-offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) { + address -= offset; + reg[base].I = address; + } + clockTicks=0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x09b: + case 0x0bb: + { + // LDRH Rd, [Rn], Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) { + address += offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x0db: + case 0x0fb: + { + // LDRH Rd, [Rn], #offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) { + address += offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x11b: + { + // LDRH Rd, [Rn, -Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + reg[dest].I = CPUReadHalfWord(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x13b: + { + // LDRH Rd, [Rn, -Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x15b: + { + // LDRH Rd, [Rn, -#offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = CPUReadHalfWord(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x17b: + { + // LDRH Rd, [Rn, -#offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x19b: + { + // LDRH Rd, [Rn, Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + reg[dest].I = CPUReadHalfWord(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1bb: + { + // LDRH Rd, [Rn, Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1db: + { + // LDRH Rd, [Rn, #offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = CPUReadHalfWord(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1fb: + { + // LDRH Rd, [Rn, #offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = CPUReadHalfWord(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x01d: + case 0x03d: + { + // LDRSB Rd, [Rn], -Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) { + address -= offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x05d: + case 0x07d: + { + // LDRSB Rd, [Rn], #-offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) { + address -= offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x09d: + case 0x0bd: + { + // LDRSB Rd, [Rn], Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) { + address += offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x0dd: + case 0x0fd: + { + // LDRSB Rd, [Rn], #offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) { + address += offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x11d: + { + // LDRSB Rd, [Rn, -Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + reg[dest].I = (int8)CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x13d: + { + // LDRSB Rd, [Rn, -Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x15d: + { + // LDRSB Rd, [Rn, -#offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int8)CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x17d: + { + // LDRSB Rd, [Rn, -#offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x19d: + { + // LDRSB Rd, [Rn, Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + reg[dest].I = (int8)CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1bd: + { + // LDRSB Rd, [Rn, Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1dd: + { + // LDRSB Rd, [Rn, #offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int8)CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1fd: + { + // LDRSB Rd, [Rn, #offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int8)CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x01f: + case 0x03f: + { + // LDRSH Rd, [Rn], -Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) { + address -= offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x05f: + case 0x07f: + { + // LDRSH Rd, [Rn], #-offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) { + address -= offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x09f: + case 0x0bf: + { + // LDRSH Rd, [Rn], Rm + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = reg[opcode & 0x0F].I; + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) { + address += offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x0df: + case 0x0ff: + { + // LDRSH Rd, [Rn], #offset + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I; + int offset = (opcode & 0x0F) | ((opcode >> 4) & 0xF0); + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) { + address += offset; + reg[base].I = address; + } + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x11f: + { + // LDRSH Rd, [Rn, -Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x13f: + { + // LDRSH Rd, [Rn, -Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - reg[opcode & 0x0F].I; + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x15f: + { + // LDRSH Rd, [Rn, -#offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x17f: + { + // LDRSH Rd, [Rn, -#offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I - ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x19f: + { + // LDRSH Rd, [Rn, Rm] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1bf: + { + // LDRSH Rd, [Rn, Rm]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + reg[opcode & 0x0F].I; + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1df: + { + // LDRSH Rd, [Rn, #offset] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x1ff: + { + // LDRSH Rd, [Rn, #offset]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode >> 16) & 0x0F; + int dest = (opcode >> 12) & 0x0F; + uint32 address = reg[base].I + ((opcode & 0x0F)|((opcode>>4)&0xF0)); + reg[dest].I = (int16)CPUReadHalfWordSigned(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_EOR, OP_EOR, 0x020); + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_EORS, OP_EOR, 0x030); + case 0x029: + { + // MLA Rd, Rm, Rs, Rn + clockTicks = 2; + int dest = (opcode >> 16) & 0x0F; + int mult = (opcode & 0x0F); + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + reg[dest].I = reg[mult].I * rs + reg[(opcode>>12)&0x0f].I; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + case 0x039: + { + // MLAS Rd, Rm, Rs, Rn + clockTicks = 2; + int dest = (opcode >> 16) & 0x0F; + int mult = (opcode & 0x0F); + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + reg[dest].I = reg[mult].I * rs + reg[(opcode>>12)&0x0f].I; + N_FLAG = (reg[dest].I & 0x80000000) ? true : false; + Z_FLAG = (reg[dest].I) ? false : true; + if(((int32)rs)<0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + ARITHMETIC_DATA_OPCODE(OP_SUB, OP_SUB, 0x040); + ARITHMETIC_DATA_OPCODE(OP_SUBS, OP_SUB, 0x050); + ARITHMETIC_DATA_OPCODE(OP_RSB, OP_RSB, 0x060); + ARITHMETIC_DATA_OPCODE(OP_RSBS, OP_RSB, 0x070); + ARITHMETIC_DATA_OPCODE(OP_ADD, OP_ADD, 0x080); + ARITHMETIC_DATA_OPCODE(OP_ADDS, OP_ADD, 0x090); + case 0x089: + { + // UMULL RdLo, RdHi, Rn, Rs + clockTicks = 2; + uint32 umult = reg[(opcode & 0x0F)].I; + uint32 usource = reg[(opcode >> 8) & 0x0F].I; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint64 uTemp = ((uint64)umult)*((uint64)usource); + reg[destLo].I = (uint32)uTemp; + reg[destHi].I = (uint32)(uTemp >> 32); + if ((usource & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((usource & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((usource & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + case 0x099: + { + // UMULLS RdLo, RdHi, Rn, Rs + clockTicks = 2; + uint32 umult = reg[(opcode & 0x0F)].I; + uint32 usource = reg[(opcode >> 8) & 0x0F].I; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint64 uTemp = ((uint64)umult)*((uint64)usource); + reg[destLo].I = (uint32)uTemp; + reg[destHi].I = (uint32)(uTemp >> 32); + Z_FLAG = (uTemp) ? false : true; + N_FLAG = (reg[destHi].I & 0x80000000) ? true : false; + if ((usource & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((usource & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((usource & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + ARITHMETIC_DATA_OPCODE(OP_ADC, OP_ADC, 0x0a0); + ARITHMETIC_DATA_OPCODE(OP_ADCS, OP_ADC, 0x0b0); + case 0x0a9: + { + // UMLAL RdLo, RdHi, Rn, Rs + clockTicks = 3; + uint32 umult = reg[(opcode & 0x0F)].I; + uint32 usource = reg[(opcode >> 8) & 0x0F].I; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint64 uTemp = (uint64)reg[destHi].I; + uTemp <<= 32; + uTemp |= (uint64)reg[destLo].I; + uTemp += ((uint64)umult)*((uint64)usource); + reg[destLo].I = (uint32)uTemp; + reg[destHi].I = (uint32)(uTemp >> 32); + if ((usource & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((usource & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((usource & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + case 0x0b9: + { + // UMLALS RdLo, RdHi, Rn, Rs + clockTicks = 3; + uint32 umult = reg[(opcode & 0x0F)].I; + uint32 usource = reg[(opcode >> 8) & 0x0F].I; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint64 uTemp = (uint64)reg[destHi].I; + uTemp <<= 32; + uTemp |= (uint64)reg[destLo].I; + uTemp += ((uint64)umult)*((uint64)usource); + reg[destLo].I = (uint32)uTemp; + reg[destHi].I = (uint32)(uTemp >> 32); + Z_FLAG = (uTemp) ? false : true; + N_FLAG = (reg[destHi].I & 0x80000000) ? true : false; + if ((usource & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((usource & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((usource & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + ARITHMETIC_DATA_OPCODE(OP_SBC, OP_SBC, 0x0c0); + ARITHMETIC_DATA_OPCODE(OP_SBCS, OP_SBC, 0x0d0); + case 0x0c9: + { + // SMULL RdLo, RdHi, Rm, Rs + clockTicks = 2; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + int64 m = (int32)reg[(opcode & 0x0F)].I; + int64 s = (int32)rs; + int64 sTemp = m*s; + reg[destLo].I = (uint32)sTemp; + reg[destHi].I = (uint32)(sTemp >> 32); + if(((int32)rs) < 0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + case 0x0d9: + { + // SMULLS RdLo, RdHi, Rm, Rs + clockTicks = 2; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + int64 m = (int32)reg[(opcode & 0x0F)].I; + int64 s = (int32)rs; + int64 sTemp = m*s; + reg[destLo].I = (uint32)sTemp; + reg[destHi].I = (uint32)(sTemp >> 32); + Z_FLAG = (sTemp) ? false : true; + N_FLAG = (sTemp < 0) ? true : false; + if(((int32)rs) < 0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + clockTicks += codeTicksAccesint32(armNextPC) + 1; + } + break; + ARITHMETIC_DATA_OPCODE(OP_RSC, OP_RSC, 0x0e0); + ARITHMETIC_DATA_OPCODE(OP_RSCS, OP_RSC, 0x0f0); + case 0x0e9: + { + // SMLAL RdLo, RdHi, Rm, Rs + clockTicks = codeTicksAccesint32(armNextPC) + 4; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + int64 m = (int32)reg[(opcode & 0x0F)].I; + int64 s = (int32)rs; + int64 sTemp = (uint64)reg[destHi].I; + sTemp <<= 32; + sTemp |= (uint64)reg[destLo].I; + sTemp += m*s; + reg[destLo].I = (uint32)sTemp; + reg[destHi].I = (uint32)(sTemp >> 32); + if(((int32)rs) < 0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + } + break; + case 0x0f9: + { + // SMLALS RdLo, RdHi, Rm, Rs + clockTicks = codeTicksAccesint32(armNextPC) + 4; + int destLo = (opcode >> 12) & 0x0F; + int destHi = (opcode >> 16) & 0x0F; + uint32 rs = reg[(opcode >> 8) & 0x0F].I; + int64 m = (int32)reg[(opcode & 0x0F)].I; + int64 s = (int32)rs; + int64 sTemp = (uint64)reg[destHi].I; + sTemp <<= 32; + sTemp |= (uint64)reg[destLo].I; + sTemp += m*s; + reg[destLo].I = (uint32)sTemp; + reg[destHi].I = (uint32)(sTemp >> 32); + Z_FLAG = (sTemp) ? false : true; + N_FLAG = (sTemp < 0) ? true : false; + if(((int32)rs) < 0) + rs = ~rs; + if((rs & 0xFFFFFF00) == 0) + clockTicks += 0; + else if((rs & 0xFFFF0000) == 0) + clockTicks += 1; + else if((rs & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + if (busPrefetchCount==0) + busPrefetchCount = (busPrefetchCount<>(8-clockTicks)); + } + break; + LOGICAL_DATA_OPCODE(OP_TST, OP_TST, 0x110); + case 0x100: + // MRS Rd, CPSR + // TODO: check if right instruction.... + CPUUpdateCPSR(); + reg[(opcode >> 12) & 0x0F].I = reg[16].I; + break; + case 0x109: + { + // SWP Rd, Rm, [Rn] + uint32 address = reg[(opcode >> 16) & 15].I; + uint32 temp = CPUReadMemory(address); + CPUWriteMemory(address, reg[opcode&15].I); + reg[(opcode >> 12) & 15].I = temp; + clockTicks = 4 + dataTicksAccesint32(address) + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + LOGICAL_DATA_OPCODE(OP_TEQ, OP_TEQ, 0x130); + case 0x120: + { + // MSR CPSR_fields, Rm + CPUUpdateCPSR(); + uint32 value = reg[opcode & 15].I; + uint32 newValue = reg[16].I; + if(armMode > 0x10) { + if(opcode & 0x00010000) + newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF); + if(opcode & 0x00020000) + newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00); + if(opcode & 0x00040000) + newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000); + } + if(opcode & 0x00080000) + newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000); + newValue |= 0x10; + CPUSwitchMode(newValue & 0x1f, false); + reg[16].I = newValue; + CPUUpdateFlags(); + if(!armState) { // this should not be allowed, but it seems to work + THUMB_PREFETCH; + reg[15].I = armNextPC + 2; + } + } + break; + case 0x121: + { + // BX Rm + // TODO: check if right instruction... + int base = opcode & 0x0F; + busPrefetchCount=0; + armState = reg[base].I & 1 ? false : true; + if(armState) { + reg[15].I = reg[base].I & 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks = codeTicksAccessSeq32(armNextPC) + + codeTicksAccessSeq32(armNextPC) + codeTicksAccesint32(armNextPC) + 3; + } else { + reg[15].I = reg[base].I & 0xFFFFFFFE; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + clockTicks = codeTicksAccessSeq16(armNextPC) + + codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC) + 3; + } + } + break; + ARITHMETIC_DATA_OPCODE(OP_CMP, OP_CMP, 0x150); + case 0x140: + // MRS Rd, SPSR + // TODO: check if right instruction... + reg[(opcode >> 12) & 0x0F].I = reg[17].I; + break; + case 0x149: + { + // SWPB Rd, Rm, [Rn] + uint32 address = reg[(opcode >> 16) & 15].I; + uint32 temp = CPUReadByte(address); + CPUWriteByte(address, reg[opcode&15].B.B0); + reg[(opcode>>12)&15].I = temp; + clockTicks = 4 + dataTicksAccesint32(address) + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + ARITHMETIC_DATA_OPCODE(OP_CMN, OP_CMN, 0x170); + case 0x160: + { + // MSR SPSR_fields, Rm + uint32 value = reg[opcode & 15].I; + if(armMode > 0x10 && armMode < 0x1f) { + if(opcode & 0x00010000) + reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF); + if(opcode & 0x00020000) + reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00); + if(opcode & 0x00040000) + reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000); + if(opcode & 0x00080000) + reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000); + } + } + break; + LOGICAL_DATA_OPCODE (OP_ORR, OP_ORR, 0x180); + LOGICAL_DATA_OPCODE (OP_ORRS, OP_ORR, 0x190); + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_MOV, OP_MOV, 0x1a0); + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_MOVS, OP_MOV, 0x1b0); + LOGICAL_DATA_OPCODE (OP_BIC, OP_BIC, 0x1c0); + LOGICAL_DATA_OPCODE (OP_BICS, OP_BIC, 0x1d0); + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_MVN, OP_MVN, 0x1e0); + LOGICAL_DATA_OPCODE_WITHOUT_base(OP_MVNS, OP_MVN, 0x1f0); +#ifdef BKPT_SUPPORT + case 0x127: + case 0x7ff: // for GDB support + extern void (*dbgSignal)(int,int); + reg[15].I -= 4; + armNextPC -= 4; + dbgSignal(5, (opcode & 0x0f)|((opcode>>4) & 0xfff0)); + return; +#endif + case 0x320: + case 0x321: + case 0x322: + case 0x323: + case 0x324: + case 0x325: + case 0x326: + case 0x327: + case 0x328: + case 0x329: + case 0x32a: + case 0x32b: + case 0x32c: + case 0x32d: + case 0x32e: + case 0x32f: + { + // MSR CPSR_fields, # + CPUUpdateCPSR(); + uint32 value = opcode & 0xFF; + int shift = (opcode & 0xF00) >> 7; + if(shift) { + ROR_IMM_MSR; + } + uint32 newValue = reg[16].I; + if(armMode > 0x10) { + if(opcode & 0x00010000) + newValue = (newValue & 0xFFFFFF00) | (value & 0x000000FF); + if(opcode & 0x00020000) + newValue = (newValue & 0xFFFF00FF) | (value & 0x0000FF00); + if(opcode & 0x00040000) + newValue = (newValue & 0xFF00FFFF) | (value & 0x00FF0000); + } + if(opcode & 0x00080000) + newValue = (newValue & 0x00FFFFFF) | (value & 0xFF000000); + + newValue |= 0x10; + + CPUSwitchMode(newValue & 0x1f, false); + reg[16].I = newValue; + CPUUpdateFlags(); + if(!armState) { // this should not be allowed, but it seems to work + THUMB_PREFETCH; + reg[15].I = armNextPC + 2; + } + } + break; + case 0x360: + case 0x361: + case 0x362: + case 0x363: + case 0x364: + case 0x365: + case 0x366: + case 0x367: + case 0x368: + case 0x369: + case 0x36a: + case 0x36b: + case 0x36c: + case 0x36d: + case 0x36e: + case 0x36f: + { + // MSR SPSR_fields, # + if(armMode > 0x10 && armMode < 0x1f) { + uint32 value = opcode & 0xFF; + int shift = (opcode & 0xF00) >> 7; + if(shift) { + ROR_IMM_MSR; + } + if(opcode & 0x00010000) + reg[17].I = (reg[17].I & 0xFFFFFF00) | (value & 0x000000FF); + if(opcode & 0x00020000) + reg[17].I = (reg[17].I & 0xFFFF00FF) | (value & 0x0000FF00); + if(opcode & 0x00040000) + reg[17].I = (reg[17].I & 0xFF00FFFF) | (value & 0x00FF0000); + if(opcode & 0x00080000) + reg[17].I = (reg[17].I & 0x00FFFFFF) | (value & 0xFF000000); + } + } + break; + CASE_16(0x400) + // T versions shouldn't be different on GBA + CASE_16(0x420) + { + // STR Rd, [Rn], -# + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x480) + // T versions shouldn't be different on GBA + CASE_16(0x4a0) + { + // STR Rd, [Rn], # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x500) + { + // STR Rd, [Rn, -#] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x520) + { + // STR Rd, [Rn, -#]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x580) + { + // STR Rd, [Rn, #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x5a0) + { + // STR Rd, [Rn, #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x410) + { + // LDR Rd, [Rn], -# + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I -= offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x430) + { + // LDRT Rd, [Rn], -# + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I -= offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x490) + { + // LDR Rd, [Rn], # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I += offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x4b0) + { + // LDRT Rd, [Rn], # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I += offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x510) + { + // LDR Rd, [Rn, -#] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x530) + { + // LDR Rd, [Rn, -#]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x590) + { + // LDR Rd, [Rn, #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x5b0) + { + // LDR Rd, [Rn, #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x440) + // T versions shouldn't be different on GBA + CASE_16(0x460) + { + // STRB Rd, [Rn], -# + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x4c0) + // T versions shouldn't be different on GBA + CASE_16(0x4e0) + { + // STRB Rd, [Rn], # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x540) + { + // STRB Rd, [Rn, -#] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x560) + { + // STRB Rd, [Rn, -#]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x5c0) + { + // STRB Rd, [Rn, #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x5e0) + { + // STRB Rd, [Rn, #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x450) + // T versions shouldn't be different + CASE_16(0x470) + { + // LDRB Rd, [Rn], -# + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I -= offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x4d0) + CASE_16(0x4f0) // T versions should not be different + { + // LDRB Rd, [Rn], # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I += offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x550) + { + // LDRB Rd, [Rn, -#] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x570) + { + // LDRB Rd, [Rn, -#]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x5d0) + { + // LDRB Rd, [Rn, #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x5f0) + { + // LDRB Rd, [Rn, #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = opcode & 0xFFF; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x600: + case 0x608: + // T versions are the same + case 0x620: + case 0x628: + { + // STR Rd, [Rn], -Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x602: + case 0x60a: + // T versions are the same + case 0x622: + case 0x62a: + { + // STR Rd, [Rn], -Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x604: + case 0x60c: + // T versions are the same + case 0x624: + case 0x62c: + { + // STR Rd, [Rn], -Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x606: + case 0x60e: + // T versions are the same + case 0x626: + case 0x62e: + { + // STR Rd, [Rn], -Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address - value; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x680: + case 0x688: + // T versions are the same + case 0x6a0: + case 0x6a8: + { + // STR Rd, [Rn], Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x682: + case 0x68a: + // T versions are the same + case 0x6a2: + case 0x6aa: + { + // STR Rd, [Rn], Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x684: + case 0x68c: + // T versions are the same + case 0x6a4: + case 0x6ac: + { + // STR Rd, [Rn], Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x686: + case 0x68e: + // T versions are the same + case 0x6a6: + case 0x6ae: + { + // STR Rd, [Rn], Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteMemory(address, reg[dest].I); + reg[base].I = address + value; + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x700: + case 0x708: + { + // STR Rd, [Rn, -Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x702: + case 0x70a: + { + // STR Rd, [Rn, -Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x704: + case 0x70c: + { + // STR Rd, [Rn, -Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x706: + case 0x70e: + { + // STR Rd, [Rn, -Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x720: + case 0x728: + { + // STR Rd, [Rn, -Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x722: + case 0x72a: + { + // STR Rd, [Rn, -Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x724: + case 0x72c: + { + // STR Rd, [Rn, -Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x726: + case 0x72e: + { + // STR Rd, [Rn, -Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x780: + case 0x788: + { + // STR Rd, [Rn, Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x782: + case 0x78a: + { + // STR Rd, [Rn, Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x784: + case 0x78c: + { + // STR Rd, [Rn, Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x786: + case 0x78e: + { + // STR Rd, [Rn, Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7a0: + case 0x7a8: + { + // STR Rd, [Rn, Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7a2: + case 0x7aa: + { + // STR Rd, [Rn, Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7a4: + case 0x7ac: + { + // STR Rd, [Rn, Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7a6: + case 0x7ae: + { + // STR Rd, [Rn, Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + reg[base].I = address; + CPUWriteMemory(address, reg[dest].I); + clockTicks = 2 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x610: + case 0x618: + // T versions are the same + case 0x630: + case 0x638: + { + // LDR Rd, [Rn], -Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address - offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x612: + case 0x61a: + // T versions are the same + case 0x632: + case 0x63a: + { + // LDR Rd, [Rn], -Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address - offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x614: + case 0x61c: + // T versions are the same + case 0x634: + case 0x63c: + { + // LDR Rd, [Rn], -Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address - offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x616: + case 0x61e: + // T versions are the same + case 0x636: + case 0x63e: + { + // LDR Rd, [Rn], -Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address - value; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x690: + case 0x698: + // T versions are the same + case 0x6b0: + case 0x6b8: + { + // LDR Rd, [Rn], Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address + offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x692: + case 0x69a: + // T versions are the same + case 0x6b2: + case 0x6ba: + { + // LDR Rd, [Rn], Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address + offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x694: + case 0x69c: + // T versions are the same + case 0x6b4: + case 0x6bc: + { + // LDR Rd, [Rn], Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address + offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x696: + case 0x69e: + // T versions are the same + case 0x6b6: + case 0x6be: + { + // LDR Rd, [Rn], Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address + value; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x710: + case 0x718: + { + // LDR Rd, [Rn, -Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x712: + case 0x71a: + { + // LDR Rd, [Rn, -Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x714: + case 0x71c: + { + // LDR Rd, [Rn, -Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x716: + case 0x71e: + { + // LDR Rd, [Rn, -Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x730: + case 0x738: + { + // LDR Rd, [Rn, -Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x732: + case 0x73a: + { + // LDR Rd, [Rn, -Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x734: + case 0x73c: + { + // LDR Rd, [Rn, -Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x736: + case 0x73e: + { + // LDR Rd, [Rn, -Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x790: + case 0x798: + { + // LDR Rd, [Rn, Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x792: + case 0x79a: + { + // LDR Rd, [Rn, Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x794: + case 0x79c: + { + // LDR Rd, [Rn, Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x796: + case 0x79e: + { + // LDR Rd, [Rn, Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + reg[dest].I = CPUReadMemory(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7b0: + case 0x7b8: + { + // LDR Rd, [Rn, Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7b2: + case 0x7ba: + { + // LDR Rd, [Rn, Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7b4: + case 0x7bc: + { + // LDR Rd, [Rn, Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7b6: + case 0x7be: + { + // LDR Rd, [Rn, Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + reg[dest].I = CPUReadMemory(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint32(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x640: + case 0x648: + // T versions are the same + case 0x660: + case 0x668: + { + // STRB Rd, [Rn], -Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x642: + case 0x64a: + // T versions are the same + case 0x662: + case 0x66a: + { + // STRB Rd, [Rn], -Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x644: + case 0x64c: + // T versions are the same + case 0x664: + case 0x66c: + { + // STRB Rd, [Rn], -Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address - offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x646: + case 0x64e: + // T versions are the same + case 0x666: + case 0x66e: + { + // STRB Rd, [Rn], -Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address - value; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6c0: + case 0x6c8: + // T versions are the same + case 0x6e0: + case 0x6e8: + { + // STRB Rd, [Rn], Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6c2: + case 0x6ca: + // T versions are the same + case 0x6e2: + case 0x6ea: + { + // STRB Rd, [Rn], Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6c4: + case 0x6cc: + // T versions are the same + case 0x6e4: + case 0x6ec: + { + // STRB Rd, [Rn], Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address + offset; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6c6: + case 0x6ce: + // T versions are the same + case 0x6e6: + case 0x6ee: + { + // STRB Rd, [Rn], Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + CPUWriteByte(address, reg[dest].B.B0); + reg[base].I = address + value; + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x740: + case 0x748: + { + // STRB Rd, [Rn, -Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x742: + case 0x74a: + { + // STRB Rd, [Rn, -Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x744: + case 0x74c: + { + // STRB Rd, [Rn, -Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x746: + case 0x74e: + { + // STRB Rd, [Rn, -Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x760: + case 0x768: + { + // STRB Rd, [Rn, -Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x762: + case 0x76a: + { + // STRB Rd, [Rn, -Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x764: + case 0x76c: + { + // STRB Rd, [Rn, -Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x766: + case 0x76e: + { + // STRB Rd, [Rn, -Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7c0: + case 0x7c8: + { + // STRB Rd, [Rn, Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7c2: + case 0x7ca: + { + // STRB Rd, [Rn, Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7c4: + case 0x7cc: + { + // STRB Rd, [Rn, Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7c6: + case 0x7ce: + { + // STRB Rd, [Rn, Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7e0: + case 0x7e8: + { + // STRB Rd, [Rn, Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7e2: + case 0x7ea: + { + // STRB Rd, [Rn, Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7e4: + case 0x7ec: + { + // STRB Rd, [Rn, Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7e6: + case 0x7ee: + { + // STRB Rd, [Rn, Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + reg[base].I = address; + CPUWriteByte(address, reg[dest].B.B0); + clockTicks = 2 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x650: + case 0x658: + // T versions are the same + case 0x670: + case 0x678: + { + // LDRB Rd, [Rn], -Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address - offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x652: + case 0x65a: + // T versions are the same + case 0x672: + case 0x67a: + { + // LDRB Rd, [Rn], -Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address - offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x654: + case 0x65c: + // T versions are the same + case 0x674: + case 0x67c: + { + // LDRB Rd, [Rn], -Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address - offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x656: + case 0x65e: + // T versions are the same + case 0x676: + case 0x67e: + { + // LDRB Rd, [Rn], -Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address - value; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6d0: + case 0x6d8: + // T versions are the same + case 0x6f0: + case 0x6f8: + { + // LDRB Rd, [Rn], Rm, LSL # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address + offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6d2: + case 0x6da: + // T versions are the same + case 0x6f2: + case 0x6fa: + { + // LDRB Rd, [Rn], Rm, LSR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address + offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6d4: + case 0x6dc: + // T versions are the same + case 0x6f4: + case 0x6fc: + { + // LDRB Rd, [Rn], Rm, ASR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address + offset; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x6d6: + case 0x6de: + // T versions are the same + case 0x6f6: + case 0x6fe: + { + // LDRB Rd, [Rn], Rm, ROR # + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address + value; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x750: + case 0x758: + { + // LDRB Rd, [Rn, -Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x752: + case 0x75a: + { + // LDRB Rd, [Rn, -Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x754: + case 0x75c: + { + // LDRB Rd, [Rn, -Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x756: + case 0x75e: + { + // LDRB Rd, [Rn, -Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x770: + case 0x778: + { + // LDRB Rd, [Rn, -Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x772: + case 0x77a: + { + // LDRB Rd, [Rn, -Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x774: + case 0x77c: + { + // LDRB Rd, [Rn, -Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x776: + case 0x77e: + { + // LDRB Rd, [Rn, -Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I - value; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7d0: + case 0x7d8: + { + // LDRB Rd, [Rn, Rm, LSL #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7d2: + case 0x7da: + { + // LDRB Rd, [Rn, Rm, LSR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7d4: + case 0x7dc: + { + // LDRB Rd, [Rn, Rm, ASR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7d6: + case 0x7de: + { + // LDRB Rd, [Rn, Rm, ROR #] + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + reg[dest].I = CPUReadByte(address); + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7f0: + case 0x7f8: + { + // LDRB Rd, [Rn, Rm, LSL #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int offset = reg[opcode & 15].I << ((opcode>>7)& 31); + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7f2: + case 0x7fa: + { + // LDRB Rd, [Rn, Rm, LSR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset = shift ? reg[opcode & 15].I >> shift : 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7f4: + case 0x7fc: + { + // LDRB Rd, [Rn, Rm, ASR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + int offset; + if(shift) + offset = (int)((int32)reg[opcode & 15].I >> shift); + else if(reg[opcode & 15].I & 0x80000000) + offset = 0xFFFFFFFF; + else + offset = 0; + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + offset; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; + case 0x7f6: + case 0x7fe: + { + // LDRB Rd, [Rn, Rm, ROR #]! + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int shift = (opcode >> 7) & 31; + uint32 value = reg[opcode & 15].I; + if(shift) { + ROR_VALUE; + } else { + RCR_VALUE; + } + int dest = (opcode >> 12) & 15; + int base = (opcode >> 16) & 15; + uint32 address = reg[base].I + value; + reg[dest].I = CPUReadByte(address); + if(dest != base) + reg[base].I = address; + clockTicks = 0; + if(dest == 15) { + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks += 2 + dataTicksAccessSeq32(address) + dataTicksAccessSeq32(address); + } + clockTicks += 3 + dataTicksAccesint16(address) + + codeTicksAccesint32(armNextPC); + } + break; +#define STMW_REG(val,num) \ + if(opcode & (val)) {\ + CPUWriteMemory(address, reg[(num)].I);\ + if(!offset) {\ + reg[base].I = temp;\ + clockTicks += 1 + dataTicksAccesint32(address);\ + offset = 1;\ + } else {\ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + }\ + address += 4;\ + } +#define STM_REG(val,num) \ + if(opcode & (val)) {\ + CPUWriteMemory(address, reg[(num)].I);\ + if(!offset) {\ + clockTicks += 1 + dataTicksAccesint32(address);\ + offset = 1;\ + } else {\ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + }\ + address += 4;\ + } + + CASE_16(0x800) + { + // STMDA Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp + 4) & 0xFFFFFFFC; + int offset = 0; + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + STM_REG(8192, 13); + STM_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x820) + { + // STMDA Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp+4) & 0xFFFFFFFC; + int offset = 0; + + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + STMW_REG(8192, 13); + STMW_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + reg[base].I = temp; + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x840) + { + // STMDA Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp+4) & 0xFFFFFFFC; + int offset = 0; + + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + + if(armMode == 0x11) { + STM_REG(256, R8_FIQ); + STM_REG(512, R9_FIQ); + STM_REG(1024, R10_FIQ); + STM_REG(2048, R11_FIQ); + STM_REG(4096, R12_FIQ); + } else { + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + STM_REG(8192, R13_USR); + STM_REG(16384, R14_USR); + } else { + STM_REG(8192, 13); + STM_REG(16384, 14); + } + + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x860) + { + // STMDA Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp+4) & 0xFFFFFFFC; + int offset = 0; + + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + + if(armMode == 0x11) { + STMW_REG(256, R8_FIQ); + STMW_REG(512, R9_FIQ); + STMW_REG(1024, R10_FIQ); + STMW_REG(2048, R11_FIQ); + STMW_REG(4096, R12_FIQ); + } else { + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + STMW_REG(8192, R13_USR); + STMW_REG(16384, R14_USR); + } else { + STMW_REG(8192, 13); + STMW_REG(16384, 14); + } + + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + reg[base].I = temp; + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + + CASE_16(0x880) + { + // STMIA Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = reg[base].I & 0xFFFFFFFC; + int offset = 0; + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + STM_REG(8192, 13); + STM_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x8a0) + { + // STMIA Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = reg[base].I & 0xFFFFFFFC; + int offset = 0; + uint32 temp = reg[base].I + 4*(cpuBitsSet[opcode & 0xFF] + + cpuBitsSet[(opcode >> 8) & 255]); + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + STMW_REG(8192, 13); + STMW_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) { + reg[base].I = temp; + clockTicks += 1 + dataTicksAccesint32(address); + } else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x8c0) + { + // STMIA Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = reg[base].I & 0xFFFFFFFC; + int offset = 0; + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + if(armMode == 0x11) { + STM_REG(256, R8_FIQ); + STM_REG(512, R9_FIQ); + STM_REG(1024, R10_FIQ); + STM_REG(2048, R11_FIQ); + STM_REG(4096, R12_FIQ); + } else { + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + } + if(armMode != 0x10 && armMode != 0x1f) { + STM_REG(8192, R13_USR); + STM_REG(16384, R14_USR); + } else { + STM_REG(8192, 13); + STM_REG(16384, 14); + } + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x8e0) + { + // STMIA Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = reg[base].I & 0xFFFFFFFC; + int offset = 0; + uint32 temp = reg[base].I + 4*(cpuBitsSet[opcode & 0xFF] + + cpuBitsSet[(opcode >> 8) & 255]); + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + if(armMode == 0x11) { + STMW_REG(256, R8_FIQ); + STMW_REG(512, R9_FIQ); + STMW_REG(1024, R10_FIQ); + STMW_REG(2048, R11_FIQ); + STMW_REG(4096, R12_FIQ); + } else { + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + } + if(armMode != 0x10 && armMode != 0x1f) { + STMW_REG(8192, R13_USR); + STMW_REG(16384, R14_USR); + } else { + STMW_REG(8192, 13); + STMW_REG(16384, 14); + } + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) { + reg[base].I = temp; + clockTicks += 1 + dataTicksAccesint32(address); + } else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + + CASE_16(0x900) + { + // STMDB Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + int offset = 0; + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + STM_REG(8192, 13); + STM_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x920) + { + // STMDB Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + int offset = 0; + + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + STMW_REG(8192, 13); + STMW_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + reg[base].I = temp; + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x940) + { + // STMDB Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + int offset = 0; + + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + + if(armMode == 0x11) { + STM_REG(256, R8_FIQ); + STM_REG(512, R9_FIQ); + STM_REG(1024, R10_FIQ); + STM_REG(2048, R11_FIQ); + STM_REG(4096, R12_FIQ); + } else { + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + STM_REG(8192, R13_USR); + STM_REG(16384, R14_USR); + } else { + STM_REG(8192, 13); + STM_REG(16384, 14); + } + + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x960) + { + // STMDB Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + int offset = 0; + + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + + if(armMode == 0x11) { + STMW_REG(256, R8_FIQ); + STMW_REG(512, R9_FIQ); + STMW_REG(1024, R10_FIQ); + STMW_REG(2048, R11_FIQ); + STMW_REG(4096, R12_FIQ); + } else { + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + STMW_REG(8192, R13_USR); + STMW_REG(16384, R14_USR); + } else { + STMW_REG(8192, 13); + STMW_REG(16384, 14); + } + + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + reg[base].I = temp; + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + + CASE_16(0x980) + { + // STMIB Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + int offset = 0; + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + STM_REG(8192, 13); + STM_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x9a0) + { + // STMIB Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + int offset = 0; + uint32 temp = reg[base].I + 4*(cpuBitsSet[opcode & 0xFF] + + cpuBitsSet[(opcode >> 8) & 255]); + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + STMW_REG(8192, 13); + STMW_REG(16384, 14); + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) { + reg[base].I = temp; + clockTicks += 1 + dataTicksAccesint32(address); + } else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x9c0) + { + // STMIB Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + int offset = 0; + STM_REG(1, 0); + STM_REG(2, 1); + STM_REG(4, 2); + STM_REG(8, 3); + STM_REG(16, 4); + STM_REG(32, 5); + STM_REG(64, 6); + STM_REG(128, 7); + if(armMode == 0x11) { + STM_REG(256, R8_FIQ); + STM_REG(512, R9_FIQ); + STM_REG(1024, R10_FIQ); + STM_REG(2048, R11_FIQ); + STM_REG(4096, R12_FIQ); + } else { + STM_REG(256, 8); + STM_REG(512, 9); + STM_REG(1024, 10); + STM_REG(2048, 11); + STM_REG(4096, 12); + } + if(armMode != 0x10 && armMode != 0x1f) { + STM_REG(8192, R13_USR); + STM_REG(16384, R14_USR); + } else { + STM_REG(8192, 13); + STM_REG(16384, 14); + } + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x9e0) + { + // STMIB Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + int offset = 0; + uint32 temp = reg[base].I + 4*(cpuBitsSet[opcode & 0xFF] + + cpuBitsSet[(opcode >> 8) & 255]); + STMW_REG(1, 0); + STMW_REG(2, 1); + STMW_REG(4, 2); + STMW_REG(8, 3); + STMW_REG(16, 4); + STMW_REG(32, 5); + STMW_REG(64, 6); + STMW_REG(128, 7); + if(armMode == 0x11) { + STMW_REG(256, R8_FIQ); + STMW_REG(512, R9_FIQ); + STMW_REG(1024, R10_FIQ); + STMW_REG(2048, R11_FIQ); + STMW_REG(4096, R12_FIQ); + } else { + STMW_REG(256, 8); + STMW_REG(512, 9); + STMW_REG(1024, 10); + STMW_REG(2048, 11); + STMW_REG(4096, 12); + } + if(armMode != 0x10 && armMode != 0x1f) { + STMW_REG(8192, R13_USR); + STMW_REG(16384, R14_USR); + } else { + STMW_REG(8192, 13); + STMW_REG(16384, 14); + } + if(opcode & 32768) { + CPUWriteMemory(address, reg[15].I+4); + if(!offset) { + reg[base].I = temp; + clockTicks += 1 + dataTicksAccesint32(address); + } else + clockTicks += 1 + dataTicksAccessSeq32(address); + } + clockTicks += 1 + codeTicksAccesint32(armNextPC); + } + break; + +#define LDM_REG(val,num) \ + if(opcode & (val)) {\ + reg[(num)].I = CPUReadMemory(address);\ + if(offset)\ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + else {\ + clockTicks += 1 + dataTicksAccesint32(address);\ + offset = 1;\ + }\ + address += 4;\ + } + + CASE_16(0x810) + { + // LDMDA Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp + 4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x830) + { + // LDMDA Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp + 4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + if(!(opcode & (1 << base))) + reg[base].I = temp; + } + break; + CASE_16(0x850) + { + // LDMDA Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp + 4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x870) + { + // LDMDA Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (temp + 4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + if(!(opcode & (1 << base))) + reg[base].I = temp; + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + + if(!(opcode & (1 << base))) + reg[base].I = temp; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + + CASE_16(0x890) + { + // LDMIA Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = reg[base].I & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x8b0) + { + // LDMIA Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I + + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = reg[base].I & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + if(!(opcode & (1 << base))) + reg[base].I = temp; + } + break; + CASE_16(0x8d0) + { + // LDMIA Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = reg[base].I & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x8f0) + { + // LDMIA Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I + + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = reg[base].I & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + if(!(opcode & (1 << base))) + reg[base].I = temp; + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + + if(!(opcode & (1 << base))) + reg[base].I = temp; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + + CASE_16(0x910) + { + // LDMDB Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x930) + { + // LDMDB Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + if(!(opcode & (1 << base))) + reg[base].I = temp; + } + break; + CASE_16(0x950) + { + // LDMDB Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x970) + { + // LDMDB Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I - + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = temp & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + if(!(opcode & (1 << base))) + reg[base].I = temp; + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + + if(!(opcode & (1 << base))) + reg[base].I = temp; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + + CASE_16(0x990) + { + // LDMIB Rn, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x9b0) + { + // LDMIB Rn!, {Rlist} + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I + + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + if(opcode & 32768) { + reg[15].I = CPUReadMemory(address); + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + dataTicksAccessSeq32(address); + + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + if(!(opcode & (1 << base))) + reg[base].I = temp; + } + break; + CASE_16(0x9d0) + { + // LDMIB Rn, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_16(0x9f0) + { + // LDMIB Rn!, {Rlist}^ + if (busPrefetchCount==0) + busPrefetch = busPrefetchEnable; + int base = (opcode & 0x000F0000) >> 16; + uint32 temp = reg[base].I + + 4 * (cpuBitsSet[opcode & 255] + cpuBitsSet[(opcode >> 8) & 255]); + uint32 address = (reg[base].I+4) & 0xFFFFFFFC; + clockTicks = 0; + int offset = 0; + if(opcode & 0x8000) { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + LDM_REG(8192, 13); + LDM_REG(16384, 14); + + reg[15].I = CPUReadMemory(address); + + if(!(opcode & (1 << base))) + reg[base].I = temp; + + CPUSwitchMode(reg[17].I & 0x1f, false); + if(armState) { + armNextPC = reg[15].I & 0xFFFFFFFC; + reg[15].I = armNextPC + 4; + ARM_PREFETCH; + } else { + armNextPC = reg[15].I & 0xFFFFFFFE; + reg[15].I = armNextPC + 2; + THUMB_PREFETCH; + } + } else { + LDM_REG(1, 0); + LDM_REG(2, 1); + LDM_REG(4, 2); + LDM_REG(8, 3); + LDM_REG(16, 4); + LDM_REG(32, 5); + LDM_REG(64, 6); + LDM_REG(128, 7); + + if(armMode == 0x11) { + LDM_REG(256, R8_FIQ); + LDM_REG(512, R9_FIQ); + LDM_REG(1024, R10_FIQ); + LDM_REG(2048, R11_FIQ); + LDM_REG(4096, R12_FIQ); + } else { + LDM_REG(256, 8); + LDM_REG(512, 9); + LDM_REG(1024, 10); + LDM_REG(2048, 11); + LDM_REG(4096, 12); + } + + if(armMode != 0x10 && armMode != 0x1f) { + LDM_REG(8192, R13_USR); + LDM_REG(16384, R14_USR); + } else { + LDM_REG(8192, 13); + LDM_REG(16384, 14); + } + + if(!(opcode & (1 << base))) + reg[base].I = temp; + if (!offset) + clockTicks += 1 + dataTicksAccesint32(address); + else + clockTicks += 1 + dataTicksAccessSeq32(address); + clockTicks += 1 + codeTicksAccessSeq32(armNextPC); + } + clockTicks += 2 + codeTicksAccesint32(armNextPC); + } + break; + CASE_256(0xa00) + { + // B + const uint32 offset = ((int32)((opcode & 0x00FFFFFF) << 8)) >> 6; + + reg[15].I += offset; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks = codeTicksAccessSeq32(armNextPC) + 1; + clockTicks += 2 + codeTicksAccesint32(armNextPC) + + codeTicksAccessSeq32(armNextPC); + busPrefetchCount=0; + } + break; + CASE_256(0xb00) + { + // BL + const uint32 offset = ((int32)((opcode & 0x00FFFFFF) << 8)) >> 6; + + reg[14].I = reg[15].I - 4; + reg[15].I += offset; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + clockTicks = codeTicksAccessSeq32(armNextPC) + 1; + clockTicks += 2 + codeTicksAccesint32(armNextPC) + + codeTicksAccessSeq32(armNextPC); + busPrefetchCount=0; + } + break; + CASE_256(0xf00) + // SWI + clockTicks = codeTicksAccessSeq32(armNextPC) + 1; + clockTicks += 2 + codeTicksAccesint32(armNextPC) + + codeTicksAccessSeq32(armNextPC); + busPrefetchCount=0; + CPUSoftwareInterrupt(opcode & 0x00FFFFFF); + + break; +#ifdef GP_SUPPORT + case 0xe11: + case 0xe13: + case 0xe15: + case 0xe17: + case 0xe19: + case 0xe1b: + case 0xe1d: + case 0xe1f: + // MRC + break; + case 0xe01: + case 0xe03: + case 0xe05: + case 0xe07: + case 0xe09: + case 0xe0b: + case 0xe0d: + case 0xe0f: + // MRC + break; +#endif + default: + CPUUndefinedException(); + break; + // END + } +} + + if (clockTicks == 0) + clockTicks = codeTicksAccessSeq32(oldArmNextPC) + 1; + + return(clockTicks); +} + +} diff --git a/Mednafen/mednafen/gba/arm.h b/Mednafen/mednafen/gba/arm.h new file mode 100644 index 0000000000..da762d811a --- /dev/null +++ b/Mednafen/mednafen/gba/arm.h @@ -0,0 +1,6 @@ +namespace MDFN_IEN_GBA +{ + +unsigned int RunARM(void); + +} diff --git a/Mednafen/mednafen/gba/bios.cpp b/Mednafen/mednafen/gba/bios.cpp new file mode 100644 index 0000000000..7a425bd63d --- /dev/null +++ b/Mednafen/mednafen/gba/bios.cpp @@ -0,0 +1,1164 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "bios.h" +#include "GBAinline.h" +#include "Globals.h" + +#include + +namespace MDFN_IEN_GBA +{ + +static const int16 sineTable[256] = { + (int16)0x0000, (int16)0x0192, (int16)0x0323, (int16)0x04B5, (int16)0x0645, (int16)0x07D5, (int16)0x0964, (int16)0x0AF1, + (int16)0x0C7C, (int16)0x0E05, (int16)0x0F8C, (int16)0x1111, (int16)0x1294, (int16)0x1413, (int16)0x158F, (int16)0x1708, + (int16)0x187D, (int16)0x19EF, (int16)0x1B5D, (int16)0x1CC6, (int16)0x1E2B, (int16)0x1F8B, (int16)0x20E7, (int16)0x223D, + (int16)0x238E, (int16)0x24DA, (int16)0x261F, (int16)0x275F, (int16)0x2899, (int16)0x29CD, (int16)0x2AFA, (int16)0x2C21, + (int16)0x2D41, (int16)0x2E5A, (int16)0x2F6B, (int16)0x3076, (int16)0x3179, (int16)0x3274, (int16)0x3367, (int16)0x3453, + (int16)0x3536, (int16)0x3612, (int16)0x36E5, (int16)0x37AF, (int16)0x3871, (int16)0x392A, (int16)0x39DA, (int16)0x3A82, + (int16)0x3B20, (int16)0x3BB6, (int16)0x3C42, (int16)0x3CC5, (int16)0x3D3E, (int16)0x3DAE, (int16)0x3E14, (int16)0x3E71, + (int16)0x3EC5, (int16)0x3F0E, (int16)0x3F4E, (int16)0x3F84, (int16)0x3FB1, (int16)0x3FD3, (int16)0x3FEC, (int16)0x3FFB, + (int16)0x4000, (int16)0x3FFB, (int16)0x3FEC, (int16)0x3FD3, (int16)0x3FB1, (int16)0x3F84, (int16)0x3F4E, (int16)0x3F0E, + (int16)0x3EC5, (int16)0x3E71, (int16)0x3E14, (int16)0x3DAE, (int16)0x3D3E, (int16)0x3CC5, (int16)0x3C42, (int16)0x3BB6, + (int16)0x3B20, (int16)0x3A82, (int16)0x39DA, (int16)0x392A, (int16)0x3871, (int16)0x37AF, (int16)0x36E5, (int16)0x3612, + (int16)0x3536, (int16)0x3453, (int16)0x3367, (int16)0x3274, (int16)0x3179, (int16)0x3076, (int16)0x2F6B, (int16)0x2E5A, + (int16)0x2D41, (int16)0x2C21, (int16)0x2AFA, (int16)0x29CD, (int16)0x2899, (int16)0x275F, (int16)0x261F, (int16)0x24DA, + (int16)0x238E, (int16)0x223D, (int16)0x20E7, (int16)0x1F8B, (int16)0x1E2B, (int16)0x1CC6, (int16)0x1B5D, (int16)0x19EF, + (int16)0x187D, (int16)0x1708, (int16)0x158F, (int16)0x1413, (int16)0x1294, (int16)0x1111, (int16)0x0F8C, (int16)0x0E05, + (int16)0x0C7C, (int16)0x0AF1, (int16)0x0964, (int16)0x07D5, (int16)0x0645, (int16)0x04B5, (int16)0x0323, (int16)0x0192, + (int16)0x0000, (int16)0xFE6E, (int16)0xFCDD, (int16)0xFB4B, (int16)0xF9BB, (int16)0xF82B, (int16)0xF69C, (int16)0xF50F, + (int16)0xF384, (int16)0xF1FB, (int16)0xF074, (int16)0xEEEF, (int16)0xED6C, (int16)0xEBED, (int16)0xEA71, (int16)0xE8F8, + (int16)0xE783, (int16)0xE611, (int16)0xE4A3, (int16)0xE33A, (int16)0xE1D5, (int16)0xE075, (int16)0xDF19, (int16)0xDDC3, + (int16)0xDC72, (int16)0xDB26, (int16)0xD9E1, (int16)0xD8A1, (int16)0xD767, (int16)0xD633, (int16)0xD506, (int16)0xD3DF, + (int16)0xD2BF, (int16)0xD1A6, (int16)0xD095, (int16)0xCF8A, (int16)0xCE87, (int16)0xCD8C, (int16)0xCC99, (int16)0xCBAD, + (int16)0xCACA, (int16)0xC9EE, (int16)0xC91B, (int16)0xC851, (int16)0xC78F, (int16)0xC6D6, (int16)0xC626, (int16)0xC57E, + (int16)0xC4E0, (int16)0xC44A, (int16)0xC3BE, (int16)0xC33B, (int16)0xC2C2, (int16)0xC252, (int16)0xC1EC, (int16)0xC18F, + (int16)0xC13B, (int16)0xC0F2, (int16)0xC0B2, (int16)0xC07C, (int16)0xC04F, (int16)0xC02D, (int16)0xC014, (int16)0xC005, + (int16)0xC000, (int16)0xC005, (int16)0xC014, (int16)0xC02D, (int16)0xC04F, (int16)0xC07C, (int16)0xC0B2, (int16)0xC0F2, + (int16)0xC13B, (int16)0xC18F, (int16)0xC1EC, (int16)0xC252, (int16)0xC2C2, (int16)0xC33B, (int16)0xC3BE, (int16)0xC44A, + (int16)0xC4E0, (int16)0xC57E, (int16)0xC626, (int16)0xC6D6, (int16)0xC78F, (int16)0xC851, (int16)0xC91B, (int16)0xC9EE, + (int16)0xCACA, (int16)0xCBAD, (int16)0xCC99, (int16)0xCD8C, (int16)0xCE87, (int16)0xCF8A, (int16)0xD095, (int16)0xD1A6, + (int16)0xD2BF, (int16)0xD3DF, (int16)0xD506, (int16)0xD633, (int16)0xD767, (int16)0xD8A1, (int16)0xD9E1, (int16)0xDB26, + (int16)0xDC72, (int16)0xDDC3, (int16)0xDF19, (int16)0xE075, (int16)0xE1D5, (int16)0xE33A, (int16)0xE4A3, (int16)0xE611, + (int16)0xE783, (int16)0xE8F8, (int16)0xEA71, (int16)0xEBED, (int16)0xED6C, (int16)0xEEEF, (int16)0xF074, (int16)0xF1FB, + (int16)0xF384, (int16)0xF50F, (int16)0xF69C, (int16)0xF82B, (int16)0xF9BB, (int16)0xFB4B, (int16)0xFCDD, (int16)0xFE6E +}; + +void BIOS_ArcTan() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("ArcTan: %08x (VCOUNT=%2d)\n", + reg[0].I, + VCOUNT); + } +#endif + + int32 a = -(((int32)(reg[0].I*reg[0].I)) >> 14); + int32 b = ((0xA9 * a) >> 14) + 0x390; + b = ((b * a) >> 14) + 0x91C; + b = ((b * a) >> 14) + 0xFB6; + b = ((b * a) >> 14) + 0x16AA; + b = ((b * a) >> 14) + 0x2081; + b = ((b * a) >> 14) + 0x3651; + b = ((b * a) >> 14) + 0xA2F9; + a = ((int32)reg[0].I * b) >> 16; + reg[0].I = a; + +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("ArcTan: return=%08x\n", + reg[0].I); + } +#endif +} + +void BIOS_ArcTan2() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("ArcTan2: %08x,%08x (VCOUNT=%2d)\n", + reg[0].I, + reg[1].I, + VCOUNT); + } +#endif + + int32 x = reg[0].I; + int32 y = reg[1].I; + uint32 res = 0; + if (y == 0) { + res = ((x>>16) & 0x8000); + } else { + if (x == 0) { + res = ((y>>16) & 0x8000) + 0x4000; + } else { + if ((abs(x) > abs(y)) || ((abs(x) == abs(y)) && (!((x<0) && (y<0))))) { + reg[1].I = x; + reg[0].I = y << 14; + BIOS_Div(); + BIOS_ArcTan(); + if (x < 0) + res = 0x8000 + reg[0].I; + else + res = (((y>>16) & 0x8000)<<1) + reg[0].I; + } else { + reg[0].I = x << 14; + BIOS_Div(); + BIOS_ArcTan(); + res = (0x4000 + ((y>>16) & 0x8000)) - reg[0].I; + } + } + } + reg[0].I = res; + +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("ArcTan2: return=%08x\n", + reg[0].I); + } +#endif +} + +void BIOS_BitUnPack() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("BitUnPack: %08x,%08x,%08x (VCOUNT=%2d)\n", + reg[0].I, + reg[1].I, + reg[2].I, + VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + uint32 header = reg[2].I; + + int len = CPUReadHalfWord(header); + // check address + if(((source & 0xe000000) == 0) || ((source + len) & 0xe000000) == 0) + return; + int bits = CPUReadByte(header+2); + int revbits = 8 - bits; + // uint32 value = 0; + uint32 base = CPUReadMemory(header+4); + bool addBase = (base & 0x80000000) ? true : false; + base &= 0x7fffffff; + int dataSize = CPUReadByte(header+3); + + int data = 0; + int bitwritecount = 0; + while(1) { + len -= 1; + if(len < 0) + break; + int mask = 0xff >> revbits; + uint8 b = CPUReadByte(source); + source++; + int bitcount = 0; + while(1) { + if(bitcount >= 8) + break; + uint32 d = b & mask; + uint32 temp = d >> bitcount; + if(d || addBase) { + temp += base; + } + data |= temp << bitwritecount; + bitwritecount += dataSize; + if(bitwritecount >= 32) { + CPUWriteMemory(dest, data); + dest += 4; + data = 0; + bitwritecount = 0; + } + mask <<= bits; + bitcount += bits; + } + } +} + +void BIOS_BgAffineSet() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("BgAffineSet: %08x,%08x,%08x (VCOUNT=%2d)\n", + reg[0].I, + reg[1].I, + reg[2].I, + VCOUNT); + } +#endif + + uint32 src = reg[0].I; + uint32 dest = reg[1].I; + int num = reg[2].I; + + for(int i = 0; i < num; i++) { + int32 cx = CPUReadMemory(src); + src+=4; + int32 cy = CPUReadMemory(src); + src+=4; + int16 dispx = CPUReadHalfWord(src); + src+=2; + int16 dispy = CPUReadHalfWord(src); + src+=2; + int16 rx = CPUReadHalfWord(src); + src+=2; + int16 ry = CPUReadHalfWord(src); + src+=2; + uint16 theta = CPUReadHalfWord(src)>>8; + src+=4; // keep structure alignment + int32 a = sineTable[(theta+0x40)&255]; + int32 b = sineTable[theta]; + + int16 dx = (rx * a)>>14; + int16 dmx = (rx * b)>>14; + int16 dy = (ry * b)>>14; + int16 dmy = (ry * a)>>14; + + CPUWriteHalfWord(dest, dx); + dest += 2; + CPUWriteHalfWord(dest, -dmx); + dest += 2; + CPUWriteHalfWord(dest, dy); + dest += 2; + CPUWriteHalfWord(dest, dmy); + dest += 2; + + int32 startx = cx - dx * dispx + dmx * dispy; + int32 starty = cy - dy * dispx - dmy * dispy; + + CPUWriteMemory(dest, startx); + dest += 4; + CPUWriteMemory(dest, starty); + dest += 4; + } +} + +void BIOS_CpuSet() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("CpuSet: 0x%08x,0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, reg[1].I, + reg[2].I, VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + uint32 cnt = reg[2].I; + + if(((source & 0xe000000) == 0) || + ((source + (((cnt << 11)>>9) & 0x1fffff)) & 0xe000000) == 0) + return; + + int count = cnt & 0x1FFFFF; + + // 32-bit ? + if((cnt >> 26) & 1) { + // needed for 32-bit mode! + source &= 0xFFFFFFFC; + dest &= 0xFFFFFFFC; + // fill ? + if((cnt >> 24) & 1) { + uint32 value = (source>0x0EFFFFFF ? 0x1CAD1CAD : CPUReadMemory(source)); + while(count) { + CPUWriteMemory(dest, value); + dest += 4; + count--; + } + } else { + // copy + while(count) { + CPUWriteMemory(dest, (source>0x0EFFFFFF ? 0x1CAD1CAD : CPUReadMemory(source))); + source += 4; + dest += 4; + count--; + } + } + } else { + // 16-bit fill? + if((cnt >> 24) & 1) { + uint16 value = (source>0x0EFFFFFF ? 0x1CAD : CPUReadHalfWord(source)); + while(count) { + CPUWriteHalfWord(dest, value); + dest += 2; + count--; + } + } else { + // copy + while(count) { + CPUWriteHalfWord(dest, (source>0x0EFFFFFF ? 0x1CAD : CPUReadHalfWord(source))); + source += 2; + dest += 2; + count--; + } + } + } +} + +void BIOS_CpuFastSet() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("CpuFastSet: 0x%08x,0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, reg[1].I, + reg[2].I, VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + uint32 cnt = reg[2].I; + + if(((source & 0xe000000) == 0) || + ((source + (((cnt << 11)>>9) & 0x1fffff)) & 0xe000000) == 0) + return; + + // needed for 32-bit mode! + source &= 0xFFFFFFFC; + dest &= 0xFFFFFFFC; + + int count = cnt & 0x1FFFFF; + + // fill? + if((cnt >> 24) & 1) { + while(count > 0) { + // BIOS always transfers 32 bytes at a time + uint32 value = (source>0x0EFFFFFF ? 0xBAFFFFFB : CPUReadMemory(source)); + for(int i = 0; i < 8; i++) { + CPUWriteMemory(dest, value); + dest += 4; + } + count -= 8; + } + } else { + // copy + while(count > 0) { + // BIOS always transfers 32 bytes at a time + for(int i = 0; i < 8; i++) { + CPUWriteMemory(dest, (source>0x0EFFFFFF ? 0xBAFFFFFB :CPUReadMemory(source))); + source += 4; + dest += 4; + } + count -= 8; + } + } +} + +void BIOS_Diff8bitUnFilterWram() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Diff8bitUnFilterWram: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, + reg[1].I, VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source); + source += 4; + + if(((source & 0xe000000) == 0) || + (((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0)) + return; + + int len = header >> 8; + + uint8 data = CPUReadByte(source++); + CPUWriteByte(dest++, data); + len--; + + while(len > 0) { + uint8 diff = CPUReadByte(source++); + data += diff; + CPUWriteByte(dest++, data); + len--; + } +} + +void BIOS_Diff8bitUnFilterVram() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Diff8bitUnFilterVram: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, + reg[1].I, VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + int len = header >> 8; + + uint8 data = CPUReadByte(source++); + uint16 writeData = data; + int shift = 8; + int bytes = 1; + + while(len >= 2) { + uint8 diff = CPUReadByte(source++); + data += diff; + writeData |= (data << shift); + bytes++; + shift += 8; + if(bytes == 2) { + CPUWriteHalfWord(dest, writeData); + dest += 2; + len -= 2; + bytes = 0; + writeData = 0; + shift = 0; + } + } +} + +void BIOS_Diff16bitUnFilter() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Diff16bitUnFilter: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, + reg[1].I, VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + int len = header >> 8; + + uint16 data = CPUReadHalfWord(source); + source += 2; + CPUWriteHalfWord(dest, data); + dest += 2; + len -= 2; + + while(len >= 2) { + uint16 diff = CPUReadHalfWord(source); + source += 2; + data += diff; + CPUWriteHalfWord(dest, data); + dest += 2; + len -= 2; + } +} + +void BIOS_Div() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Div: 0x%08x,0x%08x (VCOUNT=%d)\n", + reg[0].I, + reg[1].I, + VCOUNT); + } +#endif + + int number = reg[0].I; + int denom = reg[1].I; + + if(denom != 0) { + reg[0].I = number / denom; + reg[1].I = number % denom; + int32 temp = (int32)reg[0].I; + reg[3].I = temp < 0 ? (uint32)-temp : (uint32)temp; + } +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Div: return=0x%08x,0x%08x,0x%08x\n", + reg[0].I, + reg[1].I, + reg[3].I); + } +#endif +} + +void BIOS_DivARM() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("DivARM: 0x%08x, (VCOUNT=%d)\n", + reg[0].I, + VCOUNT); + } +#endif + + uint32 temp = reg[0].I; + reg[0].I = reg[1].I; + reg[1].I = temp; + BIOS_Div(); +} + +void BIOS_HuffUnComp() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("HuffUnComp: 0x%08x,0x%08x (VCOUNT=%d)\n", + reg[0].I, + reg[1].I, + VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + uint8 treeSize = CPUReadByte(source++); + + uint32 treeStart = source; + + source += ((treeSize+1)<<1)-1; // minus because we already skipped one byte + + int len = header >> 8; + + uint32 mask = 0x80000000; + uint32 data = CPUReadMemory(source); + source += 4; + + int pos = 0; + uint8 rootNode = CPUReadByte(treeStart); + uint8 currentNode = rootNode; + bool writeData = false; + int byteShift = 0; + int byteCount = 0; + uint32 writeValue = 0; + + if((header & 0x0F) == 8) { + while(len > 0) { + // take left + if(pos == 0) + pos++; + else + pos += (((currentNode & 0x3F)+1)<<1); + + if(data & mask) { + // right + if(currentNode & 0x40) + writeData = true; + currentNode = CPUReadByte(treeStart+pos+1); + } else { + // left + if(currentNode & 0x80) + writeData = true; + currentNode = CPUReadByte(treeStart+pos); + } + + if(writeData) { + writeValue |= (currentNode << byteShift); + byteCount++; + byteShift += 8; + + pos = 0; + currentNode = rootNode; + writeData = false; + + if(byteCount == 4) { + byteCount = 0; + byteShift = 0; + CPUWriteMemory(dest, writeValue); + writeValue = 0; + dest += 4; + len -= 4; + } + } + mask >>= 1; + if(mask == 0) { + mask = 0x80000000; + data = CPUReadMemory(source); + source += 4; + } + } + } else { + int halfLen = 0; + int value = 0; + while(len > 0) { + // take left + if(pos == 0) + pos++; + else + pos += (((currentNode & 0x3F)+1)<<1); + + if((data & mask)) { + // right + if(currentNode & 0x40) + writeData = true; + currentNode = CPUReadByte(treeStart+pos+1); + } else { + // left + if(currentNode & 0x80) + writeData = true; + currentNode = CPUReadByte(treeStart+pos); + } + + if(writeData) { + if(halfLen == 0) + value |= currentNode; + else + value |= (currentNode<<4); + + halfLen += 4; + if(halfLen == 8) { + writeValue |= (value << byteShift); + byteCount++; + byteShift += 8; + + halfLen = 0; + value = 0; + + if(byteCount == 4) { + byteCount = 0; + byteShift = 0; + CPUWriteMemory(dest, writeValue); + dest += 4; + writeValue = 0; + len -= 4; + } + } + pos = 0; + currentNode = rootNode; + writeData = false; + } + mask >>= 1; + if(mask == 0) { + mask = 0x80000000; + data = CPUReadMemory(source); + source += 4; + } + } + } +} + +void BIOS_LZ77UnCompVram() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("LZ77UnCompVram: 0x%08x,0x%08x (VCOUNT=%d)\n", + reg[0].I, + reg[1].I, + VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + int byteCount = 0; + int byteShift = 0; + uint32 writeValue = 0; + + int len = header >> 8; + + while(len > 0) { + uint8 d = CPUReadByte(source++); + + if(d) { + for(int i = 0; i < 8; i++) { + if(d & 0x80) { + uint16 data = CPUReadByte(source++) << 8; + data |= CPUReadByte(source++); + int length = (data >> 12) + 3; + int offset = (data & 0x0FFF); + uint32 windowOffset = dest + byteCount - offset - 1; + + for(int j = 0; j < length; j++) { + writeValue |= (CPUReadByte(windowOffset++) << byteShift); + byteShift += 8; + byteCount++; + + if(byteCount == 2) { + CPUWriteHalfWord(dest, writeValue); + dest += 2; + byteCount = 0; + byteShift = 0; + writeValue = 0; + } + len--; + if(len == 0) + return; + } + } else { + writeValue |= (CPUReadByte(source++) << byteShift); + byteShift += 8; + byteCount++; + if(byteCount == 2) { + CPUWriteHalfWord(dest, writeValue); + dest += 2; + byteCount = 0; + byteShift = 0; + writeValue = 0; + } + len--; + if(len == 0) + return; + } + d <<= 1; + } + } else { + for(int i = 0; i < 8; i++) { + writeValue |= (CPUReadByte(source++) << byteShift); + byteShift += 8; + byteCount++; + if(byteCount == 2) { + CPUWriteHalfWord(dest, writeValue); + dest += 2; + byteShift = 0; + byteCount = 0; + writeValue = 0; + } + len--; + if(len == 0) + return; + } + } + } +} + +void BIOS_LZ77UnCompWram() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("LZ77UnCompWram: 0x%08x,0x%08x (VCOUNT=%d)\n", reg[0].I, reg[1].I, + VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + int len = header >> 8; + + while(len > 0) { + uint8 d = CPUReadByte(source++); + + if(d) { + for(int i = 0; i < 8; i++) { + if(d & 0x80) { + uint16 data = CPUReadByte(source++) << 8; + data |= CPUReadByte(source++); + int length = (data >> 12) + 3; + int offset = (data & 0x0FFF); + uint32 windowOffset = dest - offset - 1; + for(int j = 0; j < length; j++) { + CPUWriteByte(dest++, CPUReadByte(windowOffset++)); + len--; + if(len == 0) + return; + } + } else { + CPUWriteByte(dest++, CPUReadByte(source++)); + len--; + if(len == 0) + return; + } + d <<= 1; + } + } else { + for(int i = 0; i < 8; i++) { + CPUWriteByte(dest++, CPUReadByte(source++)); + len--; + if(len == 0) + return; + } + } + } +} + +void BIOS_ObjAffineSet() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("ObjAffineSet: 0x%08x,0x%08x,0x%08x,0x%08x (VCOUNT=%d)\n", + reg[0].I, + reg[1].I, + reg[2].I, + reg[3].I, + VCOUNT); + } +#endif + + uint32 src = reg[0].I; + uint32 dest = reg[1].I; + int num = reg[2].I; + int offset = reg[3].I; + + for(int i = 0; i < num; i++) { + int16 rx = CPUReadHalfWord(src); + src+=2; + int16 ry = CPUReadHalfWord(src); + src+=2; + uint16 theta = CPUReadHalfWord(src)>>8; + src+=4; // keep structure alignment + + int32 a = (int32)sineTable[(theta+0x40)&255]; + int32 b = (int32)sineTable[theta]; + + int16 dx = ((int32)rx * a)>>14; + int16 dmx = ((int32)rx * b)>>14; + int16 dy = ((int32)ry * b)>>14; + int16 dmy = ((int32)ry * a)>>14; + + CPUWriteHalfWord(dest, dx); + dest += offset; + CPUWriteHalfWord(dest, -dmx); + dest += offset; + CPUWriteHalfWord(dest, dy); + dest += offset; + CPUWriteHalfWord(dest, dmy); + dest += offset; + } +} + +void BIOS_RegisterRamReset(uint32 flags) +{ + // no need to trace here. this is only called directly from GBA.cpp + // to emulate bios initialization + + CPUUpdateRegister(0x0, 0x80); + + if(flags) { + if(flags & 0x01) { + // clear work RAM + memset(workRAM, 0, 0x40000); + } + if(flags & 0x02) { + // clear internal RAM + memset(internalRAM, 0, 0x7e00); // don't clear 0x7e00-0x7fff + } + if(flags & 0x04) { + // clear palette RAM + memset(paletteRAM, 0, 0x400); + } + if(flags & 0x08) { + // clear VRAM + memset(vram, 0, 0x18000); + } + if(flags & 0x10) { + // clean OAM + memset(oam, 0, 0x400); + } + + if(flags & 0x80) { + int i; + for(i = 0; i < 0x10; i++) + CPUUpdateRegister(0x200+i*2, 0); + + for(i = 0; i < 0xF; i++) + CPUUpdateRegister(0x4+i*2, 0); + + for(i = 0; i < 0x20; i++) + CPUUpdateRegister(0x20+i*2, 0); + + for(i = 0; i < 0x18; i++) + CPUUpdateRegister(0xb0+i*2, 0); + + CPUUpdateRegister(0x130, 0); + CPUUpdateRegister(0x20, 0x100); + CPUUpdateRegister(0x30, 0x100); + CPUUpdateRegister(0x26, 0x100); + CPUUpdateRegister(0x36, 0x100); + } + + if(flags & 0x20) { + int i; + for(i = 0; i < 8; i++) + CPUUpdateRegister(0x110+i*2, 0); + CPUUpdateRegister(0x134, 0x8000); + for(i = 0; i < 7; i++) + CPUUpdateRegister(0x140+i*2, 0); + } + + if(flags & 0x40) { + int i; + CPUWriteByte(0x4000084, 0); + CPUWriteByte(0x4000084, 0x80); + CPUWriteMemory(0x4000080, 0x880e0000); + CPUUpdateRegister(0x88, CPUReadHalfWord(0x4000088)&0x3ff); + CPUWriteByte(0x4000070, 0x70); + for(i = 0; i < 8; i++) + CPUUpdateRegister(0x90+i*2, 0); + CPUWriteByte(0x4000070, 0); + for(i = 0; i < 8; i++) + CPUUpdateRegister(0x90+i*2, 0); + CPUWriteByte(0x4000084, 0); + } + } +} + +void BIOS_RegisterRamReset() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("RegisterRamReset: 0x%08x (VCOUNT=%d)\n", + reg[0].I, + VCOUNT); + } +#endif + + BIOS_RegisterRamReset(reg[0].I); +} + +void BIOS_RLUnCompVram() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("RLUnCompVram: 0x%08x,0x%08x (VCOUNT=%d)\n", + reg[0].I, + reg[1].I, + VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source & 0xFFFFFFFC); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + int len = header >> 8; + int byteCount = 0; + int byteShift = 0; + uint32 writeValue = 0; + + while(len > 0) { + uint8 d = CPUReadByte(source++); + int l = d & 0x7F; + if(d & 0x80) { + uint8 data = CPUReadByte(source++); + l += 3; + for(int i = 0;i < l; i++) { + writeValue |= (data << byteShift); + byteShift += 8; + byteCount++; + + if(byteCount == 2) { + CPUWriteHalfWord(dest, writeValue); + dest += 2; + byteCount = 0; + byteShift = 0; + writeValue = 0; + } + len--; + if(len == 0) + return; + } + } else { + l++; + for(int i = 0; i < l; i++) { + writeValue |= (CPUReadByte(source++) << byteShift); + byteShift += 8; + byteCount++; + if(byteCount == 2) { + CPUWriteHalfWord(dest, writeValue); + dest += 2; + byteCount = 0; + byteShift = 0; + writeValue = 0; + } + len--; + if(len == 0) + return; + } + } + } +} + +void BIOS_RLUnCompWram() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("RLUnCompWram: 0x%08x,0x%08x (VCOUNT=%d)\n", + reg[0].I, + reg[1].I, + VCOUNT); + } +#endif + + uint32 source = reg[0].I; + uint32 dest = reg[1].I; + + uint32 header = CPUReadMemory(source & 0xFFFFFFFC); + source += 4; + + if(((source & 0xe000000) == 0) || + ((source + ((header >> 8) & 0x1fffff)) & 0xe000000) == 0) + return; + + int len = header >> 8; + + while(len > 0) { + uint8 d = CPUReadByte(source++); + int l = d & 0x7F; + if(d & 0x80) { + uint8 data = CPUReadByte(source++); + l += 3; + for(int i = 0;i < l; i++) { + CPUWriteByte(dest++, data); + len--; + if(len == 0) + return; + } + } else { + l++; + for(int i = 0; i < l; i++) { + CPUWriteByte(dest++, CPUReadByte(source++)); + len--; + if(len == 0) + return; + } + } + } +} + +void BIOS_SoftReset() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("SoftReset: (VCOUNT=%d)\n", VCOUNT); + } +#endif + + armState = true; + armMode = 0x1F; + armIrqEnable = false; + C_FLAG = V_FLAG = Z_FLAG = false; + N_FLAG = 0; + + reg[13].I = 0x03007F00; + reg[14].I = 0x00000000; + reg[16].I = 0x00000000; + reg[R13_IRQ].I = 0x03007FA0; + reg[R14_IRQ].I = 0x00000000; + reg[SPSR_IRQ].I = 0x00000000; + reg[R13_SVC].I = 0x03007FE0; + reg[R14_SVC].I = 0x00000000; + reg[SPSR_SVC].I = 0x00000000; + uint8 b = internalRAM[0x7ffa]; + + memset(&internalRAM[0x7e00], 0, 0x200); + + if(b) { + armNextPC = 0x02000000; + reg[15].I = 0x02000004; + } else { + armNextPC = 0x08000000; + reg[15].I = 0x08000004; + } +} + +void BIOS_Sqrt() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Sqrt: %08x (VCOUNT=%2d)\n", + reg[0].I, + VCOUNT); + } +#endif + reg[0].I = (uint32)sqrt((double)reg[0].I); +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("Sqrt: return=%08x\n", + reg[0].I); + } +#endif +} + +void BIOS_MidiKey2Freq() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("MidiKey2Freq: WaveData=%08x mk=%08x fp=%08x\n", + reg[0].I, + reg[1].I, + reg[2].I); + } +#endif + int freq = CPUReadMemory(reg[0].I+4); + double tmp; + tmp = ((double)(180 - reg[1].I)) - ((double)reg[2].I / 256.f); + tmp = pow((double)2.f, tmp / 12.f); + reg[0].I = (int)((double)freq / tmp); + +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("MidiKey2Freq: return %08x\n", + reg[0].I); + } +#endif +} + +void BIOS_SndDriverJmpTableCopy() +{ +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_SWI) { + log("SndDriverJmpTableCopy: dest=%08x\n", + reg[0].I); + } +#endif + for(int i = 0; i < 0x24; i++) { + CPUWriteMemory(reg[0].I, 0x9c); + reg[0].I += 4; + } +} + +} diff --git a/Mednafen/mednafen/gba/bios.h b/Mednafen/mednafen/gba/bios.h new file mode 100644 index 0000000000..2c0d9fe303 --- /dev/null +++ b/Mednafen/mednafen/gba/bios.h @@ -0,0 +1,52 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_BIOS_H +#define VBA_BIOS_H + +namespace MDFN_IEN_GBA +{ + +extern void BIOS_ArcTan(); +extern void BIOS_ArcTan2(); +extern void BIOS_BitUnPack(); +extern void BIOS_BgAffineSet(); +extern void BIOS_CpuSet(); +extern void BIOS_CpuFastSet(); +extern void BIOS_Diff8bitUnFilterWram(); +extern void BIOS_Diff8bitUnFilterVram(); +extern void BIOS_Diff16bitUnFilter(); +extern void BIOS_Div(); +extern void BIOS_DivARM(); +extern void BIOS_HuffUnComp(); +extern void BIOS_LZ77UnCompVram(); +extern void BIOS_LZ77UnCompWram(); +extern void BIOS_ObjAffineSet(); +extern void BIOS_RegisterRamReset(); +extern void BIOS_RegisterRamReset(uint32); +extern void BIOS_RLUnCompVram(); +extern void BIOS_RLUnCompWram(); +extern void BIOS_SoftReset(); +extern void BIOS_Sqrt(); +extern void BIOS_MidiKey2Freq(); +extern void BIOS_SndDriverJmpTableCopy(); + +} + +#endif // VBA_BIOS_H diff --git a/Mednafen/mednafen/gba/eeprom.cpp b/Mednafen/mednafen/gba/eeprom.cpp new file mode 100644 index 0000000000..0a4fcb75ad --- /dev/null +++ b/Mednafen/mednafen/gba/eeprom.cpp @@ -0,0 +1,250 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "eeprom.h" + +#include + + +#define EEPROM_IDLE 0 +#define EEPROM_READADDRESS 1 +#define EEPROM_READDATA 2 +#define EEPROM_READDATA2 3 +#define EEPROM_WRITEDATA 4 + +namespace MDFN_IEN_GBA +{ + +extern int cpuDmaCount; + +static int eepromMode = EEPROM_IDLE; +static int eepromByte = 0; +static int eepromBits = 0; +static int eepromAddress = 0; +static uint8 eepromData[0x2000]; +static uint8 eepromBuffer[16]; +static int eepromSize = 512; + +static bool eepromInUse = false; + +int EEPROM_StateAction(StateMem *sm, int load, int data_only) +{ + const bool prev_eepromInUse = eepromInUse; + const int prev_eepromSize = eepromSize; + + SFORMAT eepromSaveData[] = + { + SFVAR(eepromMode), + SFVAR(eepromByte), + SFVAR(eepromBits), + SFVAR(eepromAddress), + SFVAR(eepromInUse), + SFVAR(eepromSize), + SFARRAYN(eepromData, 0x2000, "eepromData"), + SFARRAYN(eepromBuffer, 16, "eepromBuffer"), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, eepromSaveData, "EEPR"); + + if(load) + { + if(eepromSize != 512 && eepromSize != 0x2000) + eepromSize = 0x2000; + + if(prev_eepromSize > eepromSize) + eepromSize = prev_eepromSize; + + eepromInUse |= prev_eepromInUse; + + //printf("InUse: %d\n", eepromInUse); + } + + return(ret); +} + +bool EEPROM_SaveFile(const std::string& path) +{ + if(eepromInUse) + { + if(!MDFN_DumpToFile(path, eepromData, eepromSize)) + return(0); + } + + return(1); +} + +void EEPROM_LoadFile(const std::string& path) +{ + try + { + FileStream fp(path, FileStream::MODE_READ); + int64 size; + + size = fp.size(); + + if(size != 512 && size != 0x2000) + throw MDFN_Error(0, _("EEPROM file \"%s\" is an invalid size."), path.c_str()); + + fp.read(eepromData, size); + + eepromSize = size; + eepromInUse = true; + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } +} + +void EEPROM_Init(void) +{ + memset(eepromData, 0xFF, sizeof(eepromData)); + memset(eepromBuffer, 0, sizeof(eepromBuffer)); + eepromMode = EEPROM_IDLE; + eepromByte = 0; + eepromBits = 0; + eepromAddress = 0; + eepromInUse = false; + eepromSize = 512; +} + +void EEPROM_Reset(void) +{ + eepromMode = EEPROM_IDLE; + eepromByte = 0; + eepromBits = 0; + eepromAddress = 0; +} + +int eepromRead(uint32 /* address */) +{ + switch(eepromMode) { + case EEPROM_IDLE: + case EEPROM_READADDRESS: + case EEPROM_WRITEDATA: + return 1; + case EEPROM_READDATA: + { + eepromBits++; + if(eepromBits == 4) { + eepromMode = EEPROM_READDATA2; + eepromBits = 0; + eepromByte = 0; + } + return 0; + } + case EEPROM_READDATA2: + { + int data = 0; + int address = eepromAddress << 3; + int mask = 1 << (7 - (eepromBits & 7)); + data = (eepromData[(address + eepromByte) & 0x1FFF] & mask) ? 1 : 0; + eepromBits++; + if((eepromBits & 7) == 0) + eepromByte++; + if(eepromBits == 0x40) + eepromMode = EEPROM_IDLE; + return data; + } + default: + return 0; + } + return 1; +} + +void eepromWrite(uint32 /* address */, uint8 value) +{ + if(cpuDmaCount == 0) + return; + int bit = value & 1; + switch(eepromMode) { + case EEPROM_IDLE: + eepromByte = 0; + eepromBits = 1; + eepromBuffer[eepromByte & 0xF] = bit; + eepromMode = EEPROM_READADDRESS; + break; + case EEPROM_READADDRESS: + eepromBuffer[eepromByte & 0xF] <<= 1; + eepromBuffer[eepromByte & 0xF] |= bit; + eepromBits++; + if((eepromBits & 7) == 0) { + eepromByte++; + } + if(cpuDmaCount == 0x11 || cpuDmaCount == 0x51) { + if(eepromBits == 0x11) { + eepromSize = 0x2000; + eepromAddress = ((eepromBuffer[0] & 0x3F) << 8) | + ((eepromBuffer[1] & 0xFF)); + if(!(eepromBuffer[0] & 0x40)) { + eepromBuffer[0] = bit; + eepromBits = 1; + eepromByte = 0; + eepromMode = EEPROM_WRITEDATA; + } else { + eepromMode = EEPROM_READDATA; + eepromByte = 0; + eepromBits = 0; + } + } + } else { + if(eepromBits == 9) { + eepromAddress = (eepromBuffer[0] & 0x3F); + if(!(eepromBuffer[0] & 0x40)) { + eepromBuffer[0] = bit; + eepromBits = 1; + eepromByte = 0; + eepromMode = EEPROM_WRITEDATA; + } else { + eepromMode = EEPROM_READDATA; + eepromByte = 0; + eepromBits = 0; + } + } + } + break; + case EEPROM_READDATA: + case EEPROM_READDATA2: + // should we reset here? + eepromMode = EEPROM_IDLE; + break; + case EEPROM_WRITEDATA: + eepromBuffer[eepromByte & 0xF] <<= 1; + eepromBuffer[eepromByte & 0xF] |= bit; + eepromBits++; + if((eepromBits & 7) == 0) { + eepromByte++; + } + if(eepromBits == 0x40) { + eepromInUse = true; + // write data; + for(int i = 0; i < 8; i++) { + eepromData[((eepromAddress << 3) + i) & 0x1FFF] = eepromBuffer[i]; + } + } else if(eepromBits == 0x41) { + eepromMode = EEPROM_IDLE; + eepromByte = 0; + eepromBits = 0; + } + break; + } +} + +} diff --git a/Mednafen/mednafen/gba/eeprom.h b/Mednafen/mednafen/gba/eeprom.h new file mode 100644 index 0000000000..a87b100777 --- /dev/null +++ b/Mednafen/mednafen/gba/eeprom.h @@ -0,0 +1,37 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_EEPROM_H +#define VBA_EEPROM_H + +namespace MDFN_IEN_GBA +{ + +void EEPROM_Init(void) MDFN_COLD; +void EEPROM_Reset(void) MDFN_COLD; +int EEPROM_StateAction(StateMem *sm, int load, int data_only) MDFN_COLD; +bool EEPROM_SaveFile(const std::string& path) MDFN_COLD; +void EEPROM_LoadFile(const std::string& path) MDFN_COLD; + + +int eepromRead(uint32 address); +void eepromWrite(uint32 address, uint8 value); +} + +#endif // VBA_EEPROM_H diff --git a/Mednafen/mednafen/gba/flash.cpp b/Mednafen/mednafen/gba/flash.cpp new file mode 100644 index 0000000000..38860fc437 --- /dev/null +++ b/Mednafen/mednafen/gba/flash.cpp @@ -0,0 +1,232 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "flash.h" +#include "sram.h" + +namespace MDFN_IEN_GBA +{ + +#define FLASH_READ_ARRAY 0 +#define FLASH_CMD_1 1 +#define FLASH_CMD_2 2 +#define FLASH_AUTOSELECT 3 +#define FLASH_CMD_3 4 +#define FLASH_CMD_4 5 +#define FLASH_CMD_5 6 +#define FLASH_ERASE_COMPLETE 7 +#define FLASH_PROGRAM 8 +#define FLASH_SETBANK 9 + +uint8 *flashSaveMemory = NULL; +static int flashState = FLASH_READ_ARRAY; +static int flashReadState = FLASH_READ_ARRAY; +uint32 flashSize = 0x10000; +static int flashDeviceID = 0x1b; +static int flashManufacturerID = 0x32; +static int flashBank = 0; + +int Flash_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT flashSaveData[] = + { + SFVAR(flashState), + SFVAR(flashReadState), + SFVAR(flashSize), + SFVAR(flashBank), + SFARRAYN(flashSaveMemory, 0x20000, "flashSaveMemory"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, flashSaveData, "FLSH"); + + if(load) + { + flashBank &= 1; + + if(flashSize > 0x20000) + flashSize = 0x20000; + } + + return(ret); +}; + +void Flash_Init(void) +{ + flashSaveMemory = new uint8[0x20000]; + memset(flashSaveMemory, 0x00, 0x20000); +} + +void Flash_Kill(void) +{ + if(flashSaveMemory) + { + delete[] flashSaveMemory; + flashSaveMemory = NULL; + } +} + +void Flash_Reset(void) +{ + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + flashBank = 0; +} + +void flashSetSize(int size) +{ + //printf("Setting flash size to %d\n", size); + flashSize = size; + if(size == 0x10000) { + flashDeviceID = 0x1b; + flashManufacturerID = 0x32; + } else { + flashDeviceID = 0x13; //0x09; + flashManufacturerID = 0x62; //0xc2; + } +} + +uint8 flashRead(uint32 address) +{ + // log("Reading %08x from %08x\n", address, reg[15].I); + // log("Current read state is %d\n", flashReadState); + address &= 0xFFFF; + + //printf("Read: %04x\n", address); + switch(flashReadState) { + case FLASH_READ_ARRAY: + return flashSaveMemory[(flashBank << 16) + address]; + case FLASH_AUTOSELECT: + switch(address & 0xFF) { + case 0: + // manufacturer ID + return flashManufacturerID; + case 1: + // device ID + return flashDeviceID; + } + break; + case FLASH_ERASE_COMPLETE: + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + return 0xFF; + }; + return 0; +} + +void flashWrite(uint32 address, uint8 byte) +{ + + //printf("Writing %02x at %08x\n", byte, address); + // log("Current state is %d\n", flashState); + address &= 0xFFFF; + switch(flashState) { + case FLASH_READ_ARRAY: + if(address == 0x5555 && byte == 0xAA) + flashState = FLASH_CMD_1; + break; + case FLASH_CMD_1: + if(address == 0x2AAA && byte == 0x55) + flashState = FLASH_CMD_2; + else + flashState = FLASH_READ_ARRAY; + break; + case FLASH_CMD_2: + if(address == 0x5555) { + if(byte == 0x90) { + flashState = FLASH_AUTOSELECT; + flashReadState = FLASH_AUTOSELECT; + } else if(byte == 0x80) { + flashState = FLASH_CMD_3; + } else if(byte == 0xF0) { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } else if(byte == 0xA0) { + flashState = FLASH_PROGRAM; + } else if(byte == 0xB0 && flashSize == 0x20000) { + flashState = FLASH_SETBANK; + } else { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } + } else { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } + break; + case FLASH_CMD_3: + if(address == 0x5555 && byte == 0xAA) { + flashState = FLASH_CMD_4; + } else { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } + break; + case FLASH_CMD_4: + if(address == 0x2AAA && byte == 0x55) { + flashState = FLASH_CMD_5; + } else { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } + break; + case FLASH_CMD_5: + if(byte == 0x30) { + // SECTOR ERASE + memset(&flashSaveMemory[(flashBank << 16) + (address & 0xF000)], + 0x00, + 0x1000); + flashReadState = FLASH_ERASE_COMPLETE; + } else if(byte == 0x10) { + // CHIP ERASE + memset(flashSaveMemory, 0, flashSize); + flashReadState = FLASH_ERASE_COMPLETE; + } else { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } + break; + case FLASH_AUTOSELECT: + if(byte == 0xF0) { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } else if(address == 0x5555 && byte == 0xAA) + flashState = FLASH_CMD_1; + else { + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + } + break; + case FLASH_PROGRAM: + flashSaveMemory[(flashBank<<16)+address] = byte; + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + break; + case FLASH_SETBANK: + if(address == 0) { + flashBank = (byte & 1); + } + flashState = FLASH_READ_ARRAY; + flashReadState = FLASH_READ_ARRAY; + break; + } +} + +} diff --git a/Mednafen/mednafen/gba/flash.h b/Mednafen/mednafen/gba/flash.h new file mode 100644 index 0000000000..16d256c27a --- /dev/null +++ b/Mednafen/mednafen/gba/flash.h @@ -0,0 +1,43 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_FLASH_H +#define VBA_FLASH_H + +namespace MDFN_IEN_GBA +{ + +void Flash_Init(void) MDFN_COLD; +void Flash_Kill(void) MDFN_COLD; +void Flash_Reset(void) MDFN_COLD; + +extern void flashSaveGame(gzFile gzFile) MDFN_COLD; +extern void flashReadGame(gzFile gzFile, int version) MDFN_COLD; +extern uint8 flashRead(uint32 address); +extern void flashWrite(uint32 address, uint8 byte); +extern uint8 *flashSaveMemory; +extern void flashSetSize(int size); + +extern uint32 flashSize; + +int Flash_StateAction(StateMem *sm, int load, int data_only); + +} + +#endif // VBA_FLASH_H diff --git a/Mednafen/mednafen/gba/gfx-draw.h b/Mednafen/mednafen/gba/gfx-draw.h new file mode 100644 index 0000000000..06d4c6f766 --- /dev/null +++ b/Mednafen/mednafen/gba/gfx-draw.h @@ -0,0 +1,233 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_GFX_DRAW_H +#define VBA_GFX_DRAW_H + +#include "Gfx.h" + +namespace MDFN_IEN_GBA +{ + +//#define SPRITE_DEBUG + +void gfxDrawTextScreen(uint16, uint16, uint16, uint32 *); +void gfxDrawRotScreen(uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + int&, int&, + int, + uint32*); +void gfxDrawRotScreen16Bit(uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + int&, int&, + int, + uint32*); +void gfxDrawRotScreen256(uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + int&, int&, + int, + uint32*); +void gfxDrawRotScreen16Bit160(uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + uint16, uint16, + int&, int&, + int, + uint32*); +void gfxDrawSprites(void); + +void gfxDrawOBJWin(void); + + + +//void gfxIncreaseBrightness(uint32 *line, int coeff); +//void gfxDecreaseBrightness(uint32 *line, int coeff); +//void gfxAlphaBlend(uint32 *ta, uint32 *tb, int ca, int cb); + +extern uint32 AlphaClampLUT[64]; +alignas(16) extern uint32 line0[512]; +alignas(16) extern uint32 line1[512]; +alignas(16) extern uint32 line2[512]; +alignas(16) extern uint32 line3[512]; +alignas(16) extern uint32 lineOBJ[512]; +alignas(16) extern uint32 lineOBJWin[512]; +alignas(16) extern uint32 lineMix[512]; +extern bool gfxInWin0[512]; +extern bool gfxInWin1[512]; + +extern int gfxBG2Changed; +extern int gfxBG3Changed; + +extern int gfxBG2X; +extern int gfxBG2Y; +extern int gfxBG2LastX; +extern int gfxBG2LastY; +extern int gfxBG3X; +extern int gfxBG3Y; +extern int gfxBG3LastX; +extern int gfxBG3LastY; +extern int gfxLastVCOUNT; + +static INLINE void gfxClearArray(uint32 *array) +{ + MDFN_FastU32MemsetM8(array, 0x80000000, 240); + // for(int i = 0; i < 240; i++) { + // *array++ = 0x80000000; + // } +} + +// Max coefficient is 16, so... +static INLINE uint32 gfxIncreaseBrightness(uint32 color, int coeff) +{ + int r = (color & 0x1F); + int g = ((color >> 5) & 0x1F); + int b = ((color >> 10) & 0x1F); + + r = r + (((31 - r) * coeff) >> 4); + g = g + (((31 - g) * coeff) >> 4); + b = b + (((31 - b) * coeff) >> 4); + //if(r > 31) + // r = 31; + //if(g > 31) + // g = 31; + //if(b > 31) + // b = 31; + color = (color & 0xFFFF0000) | (b << 10) | (g << 5) | r; + return color; +} + +static INLINE void gfxIncreaseBrightness(uint32 *line, int coeff) +{ + for(int x = 0; x < 240; x++) { + uint32 color = *line; + int r = (color & 0x1F); + int g = ((color >> 5) & 0x1F); + int b = ((color >> 10) & 0x1F); + + r = r + (((31 - r) * coeff) >> 4); + g = g + (((31 - g) * coeff) >> 4); + b = b + (((31 - b) * coeff) >> 4); + //if(r > 31) + // r = 31; + //if(g > 31) + // g = 31; + //if(b > 31) + // b = 31; + *line++ = (color & 0xFFFF0000) | (b << 10) | (g << 5) | r; + } +} + +static INLINE uint32 gfxDecreaseBrightness(uint32 color, int coeff) +{ + int r = (color & 0x1F); + int g = ((color >> 5) & 0x1F); + int b = ((color >> 10) & 0x1F); + + r = r - ((r * coeff) >> 4); + g = g - ((g * coeff) >> 4); + b = b - ((b * coeff) >> 4); + //if(r < 0) + // r = 0; + //if(g < 0) + // g = 0; + //if(b < 0) + // b = 0; + color = (color & 0xFFFF0000) | (b << 10) | (g << 5) | r; + + return color; +} + +static INLINE void gfxDecreaseBrightness(uint32 *line, int coeff) +{ + for(int x = 0; x < 240; x++) { + uint32 color = *line; + int r = (color & 0x1F); + int g = ((color >> 5) & 0x1F); + int b = ((color >> 10) & 0x1F); + + r = r - ((r * coeff) >> 4); + g = g - ((g * coeff) >> 4); + b = b - ((b * coeff) >> 4); + //if(r < 0) + // r = 0; + //if(g < 0) + // g = 0; + //if(b < 0) + // b = 0; + *line++ = (color & 0xFFFF0000) | (b << 10) | (g << 5) | r; + } +} + +static INLINE uint32 gfxAlphaBlend(uint32 color, uint32 color2, int ca, int cb) +{ + if(color < 0x80000000) { + int r = (color & 0x1F); + int g = ((color >> 5) & 0x1F); + int b = ((color >> 10) & 0x1F); + int r0 = (color2 & 0x1F); + int g0 = ((color2 >> 5) & 0x1F); + int b0 = ((color2 >> 10) & 0x1F); + + r = AlphaClampLUT[((r * ca) >> 4) + ((r0 * cb) >> 4)]; + g = AlphaClampLUT[((g * ca) >> 4) + ((g0 * cb) >> 4)]; + b = AlphaClampLUT[((b * ca) >> 4) + ((b0 * cb) >> 4)]; + + return (color & 0xFFFF0000) | (b << 10) | (g << 5) | r; + } + return color; +} + +static INLINE void gfxAlphaBlend(uint32 *ta, uint32 *tb, int ca, int cb) +{ + for(int x = 0; x < 240; x++) { + uint32 color = *ta; + if(color < 0x80000000) { + int r = (color & 0x1F); + int g = ((color >> 5) & 0x1F); + int b = ((color >> 10) & 0x1F); + uint32 color2 = (*tb++); + int r0 = (color2 & 0x1F); + int g0 = ((color2 >> 5) & 0x1F); + int b0 = ((color2 >> 10) & 0x1F); + + r = AlphaClampLUT[((r * ca) >> 4) + ((r0 * cb) >> 4)]; + g = AlphaClampLUT[((g * ca) >> 4) + ((g0 * cb) >> 4)]; + b = AlphaClampLUT[((b * ca) >> 4) + ((b0 * cb) >> 4)]; + + *ta++ = (color & 0xFFFF0000) | (b << 10) | (g << 5) | r; + } else { + ta++; + tb++; + } + } +} + +} + +#endif // VBA_GFX_DRAW_H diff --git a/Mednafen/mednafen/gba/myrom.h b/Mednafen/mednafen/gba/myrom.h new file mode 100644 index 0000000000..28b51cecb8 --- /dev/null +++ b/Mednafen/mednafen/gba/myrom.h @@ -0,0 +1,174 @@ +0xEA000006, +0xEA000093, +0xEA000006, +0x00000000, +0x00000000, +0x00000000, +0xEA000088, +0x00000000, +0xE3A00302, +0xE1A0F000, +0xE92D5800, +0xE55EC002, +0xE28FB03C, +0xE79BC10C, +0xE14FB000, +0xE92D0800, +0xE20BB080, +0xE38BB01F, +0xE129F00B, +0xE92D4004, +0xE1A0E00F, +0xE12FFF1C, +0xE8BD4004, +0xE3A0C0D3, +0xE129F00C, +0xE8BD0800, +0xE169F00B, +0xE8BD5800, +0xE1B0F00E, +0x0000009C, +0x0000009C, +0x0000009C, +0x0000009C, +0x000001F8, +0x000001F0, +0x000000AC, +0x000000A0, +0x000000FC, +0x00000168, +0xE12FFF1E, +0xE1A03000, +0xE1A00001, +0xE1A01003, +0xE2113102, +0x42611000, +0xE033C040, +0x22600000, +0xE1B02001, +0xE15200A0, +0x91A02082, +0x3AFFFFFC, +0xE1500002, +0xE0A33003, +0x20400002, +0xE1320001, +0x11A020A2, +0x1AFFFFF9, +0xE1A01000, +0xE1A00003, +0xE1B0C08C, +0x22600000, +0x42611000, +0xE12FFF1E, +0xE92D0010, +0xE1A0C000, +0xE3A01001, +0xE1500001, +0x81A000A0, +0x81A01081, +0x8AFFFFFB, +0xE1A0000C, +0xE1A04001, +0xE3A03000, +0xE1A02001, +0xE15200A0, +0x91A02082, +0x3AFFFFFC, +0xE1500002, +0xE0A33003, +0x20400002, +0xE1320001, +0x11A020A2, +0x1AFFFFF9, +0xE0811003, +0xE1B010A1, +0xE1510004, +0x3AFFFFEE, +0xE1A00004, +0xE8BD0010, +0xE12FFF1E, +0xE0010090, +0xE1A01741, +0xE2611000, +0xE3A030A9, +0xE0030391, +0xE1A03743, +0xE2833E39, +0xE0030391, +0xE1A03743, +0xE2833C09, +0xE283301C, +0xE0030391, +0xE1A03743, +0xE2833C0F, +0xE28330B6, +0xE0030391, +0xE1A03743, +0xE2833C16, +0xE28330AA, +0xE0030391, +0xE1A03743, +0xE2833A02, +0xE2833081, +0xE0030391, +0xE1A03743, +0xE2833C36, +0xE2833051, +0xE0030391, +0xE1A03743, +0xE2833CA2, +0xE28330F9, +0xE0000093, +0xE1A00840, +0xE12FFF1E, +0xE3A00001, +0xE3A01001, +0xE92D4010, +0xE3A03000, +0xE3A04001, +0xE3500000, +0x1B000004, +0xE5CC3301, +0xEB000002, +0x0AFFFFFC, +0xE8BD4010, +0xE12FFF1E, +0xE3A0C301, +0xE5CC3208, +0xE15C20B8, +0xE0110002, +0x10222000, +0x114C20B8, +0xE5CC4208, +0xE12FFF1E, +0xE92D500F, +0xE3A00301, +0xE1A0E00F, +0xE510F004, +0xE8BD500F, +0xE25EF004, +0xE59FD044, +0xE92D5000, +0xE14FC000, +0xE10FE000, +0xE92D5000, +0xE3A0C302, +0xE5DCE09C, +0xE35E00A5, +0x1A000004, +0x05DCE0B4, +0x021EE080, +0xE28FE004, +0x159FF018, +0x059FF018, +0xE59FD018, +0xE8BD5000, +0xE169F00C, +0xE8BD5000, +0xE25EF004, +0x03007FF0, +0x09FE2000, +0x09FFC000, +0x03007FE0 + diff --git a/Mednafen/mednafen/gba/sram.cpp b/Mednafen/mednafen/gba/sram.cpp new file mode 100644 index 0000000000..20d1adf045 --- /dev/null +++ b/Mednafen/mednafen/gba/sram.cpp @@ -0,0 +1,37 @@ +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "Globals.h" +#include "flash.h" +#include "sram.h" + +namespace MDFN_IEN_GBA +{ + +uint8 sramRead(uint32 address) +{ + return flashSaveMemory[address & 0xFFFF]; +} + +void sramWrite(uint32 address, uint8 byte) +{ + flashSaveMemory[address & 0xFFFF] = byte; +} + +} diff --git a/Mednafen/mednafen/gba/sram.h b/Mednafen/mednafen/gba/sram.h new file mode 100644 index 0000000000..b4d9dfcafd --- /dev/null +++ b/Mednafen/mednafen/gba/sram.h @@ -0,0 +1,31 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2004 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef VBA_SRAM_H +#define VBA_SRAM_H + +namespace MDFN_IEN_GBA +{ + +extern uint8 sramRead(uint32 address); +extern void sramWrite(uint32 address, uint8 byte); + +} + +#endif // VBA_SRAM_H diff --git a/Mednafen/mednafen/gba/thumb.cpp b/Mednafen/mednafen/gba/thumb.cpp new file mode 100644 index 0000000000..7d2352fa1c --- /dev/null +++ b/Mednafen/mednafen/gba/thumb.cpp @@ -0,0 +1,2115 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 1999-2003 Forgotten +// Copyright (C) 2005 Forgotten and the VBA development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "GBA.h" +#include "GBAinline.h" +#include "Globals.h" + +namespace MDFN_IEN_GBA +{ + +unsigned int RunTHUMB(void) +{ +#define NEG(i) ((i) >> 31) +#define POS(i) ((~(i)) >> 31) +#define ADDCARRY(a, b, c) \ + C_FLAG = ((NEG(a) & NEG(b)) |\ + (NEG(a) & POS(c)) |\ + (NEG(b) & POS(c))) ? true : false; +#define ADDOVERFLOW(a, b, c) \ + V_FLAG = ((NEG(a) & NEG(b) & POS(c)) |\ + (POS(a) & POS(b) & NEG(c))) ? true : false; +#define SUBCARRY(a, b, c) \ + C_FLAG = ((NEG(a) & POS(b)) |\ + (NEG(a) & POS(c)) |\ + (POS(b) & POS(c))) ? true : false; +#define SUBOVERFLOW(a, b, c)\ + V_FLAG = ((NEG(a) & POS(b) & POS(c)) |\ + (POS(a) & NEG(b) & NEG(c))) ? true : false; +#define ADD_RD_RS_RN \ + {\ + uint32 lhs = reg[source].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define ADD_RD_RS_O3 \ + {\ + uint32 lhs = reg[source].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define ADD_RN_O8(d) \ + {\ + uint32 lhs = reg[(d)].I;\ + uint32 rhs = (opcode & 255);\ + uint32 res = lhs + rhs;\ + reg[(d)].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define CMN_RD_RS \ + {\ + uint32 lhs = reg[dest].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define ADC_RD_RS \ + {\ + uint32 lhs = reg[dest].I;\ + uint32 rhs = value;\ + uint32 res = lhs + rhs + (uint32)C_FLAG;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + ADDCARRY(lhs, rhs, res);\ + ADDOVERFLOW(lhs, rhs, res);\ + } +#define SUB_RD_RS_RN \ + {\ + uint32 lhs = reg[source].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define SUB_RD_RS_O3 \ + {\ + uint32 lhs = reg[source].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define SUB_RN_O8(d) \ + {\ + uint32 lhs = reg[(d)].I;\ + uint32 rhs = (opcode & 255);\ + uint32 res = lhs - rhs;\ + reg[(d)].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define CMP_RN_O8(d) \ + {\ + uint32 lhs = reg[(d)].I;\ + uint32 rhs = (opcode & 255);\ + uint32 res = lhs - rhs;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define SBC_RD_RS \ + {\ + uint32 lhs = reg[dest].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs - !((uint32)C_FLAG);\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } +#define LSL_RD_RM_I5 \ + {\ + C_FLAG = (reg[source].I >> (32 - shift)) & 1 ? true : false;\ + value = reg[source].I << shift;\ + } +#define LSL_RD_RS \ + {\ + C_FLAG = (reg[dest].I >> (32 - value)) & 1 ? true : false;\ + value = reg[dest].I << value;\ + } +#define LSR_RD_RM_I5 \ + {\ + C_FLAG = (reg[source].I >> (shift - 1)) & 1 ? true : false;\ + value = reg[source].I >> shift;\ + } +#define LSR_RD_RS \ + {\ + C_FLAG = (reg[dest].I >> (value - 1)) & 1 ? true : false;\ + value = reg[dest].I >> value;\ + } +#define ASR_RD_RM_I5 \ + {\ + C_FLAG = ((int32)reg[source].I >> (int)(shift - 1)) & 1 ? true : false;\ + value = (int32)reg[source].I >> (int)shift;\ + } +#define ASR_RD_RS \ + {\ + C_FLAG = ((int32)reg[dest].I >> (int)(value - 1)) & 1 ? true : false;\ + value = (int32)reg[dest].I >> (int)value;\ + } +#define ROR_RD_RS \ + {\ + C_FLAG = (reg[dest].I >> (value - 1)) & 1 ? true : false;\ + value = ((reg[dest].I << (32 - value)) |\ + (reg[dest].I >> value));\ + } +#define NEG_RD_RS \ + {\ + uint32 lhs = reg[source].I;\ + uint32 rhs = 0;\ + uint32 res = rhs - lhs;\ + reg[dest].I = res;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(rhs, lhs, res);\ + SUBOVERFLOW(rhs, lhs, res);\ + } +#define CMP_RD_RS \ + {\ + uint32 lhs = reg[dest].I;\ + uint32 rhs = value;\ + uint32 res = lhs - rhs;\ + Z_FLAG = (res == 0) ? true : false;\ + N_FLAG = NEG(res) ? true : false;\ + SUBCARRY(lhs, rhs, res);\ + SUBOVERFLOW(lhs, rhs, res);\ + } + +uint32 opcode = cpuPrefetch[0]; +cpuPrefetch[0] = cpuPrefetch[1]; + +busPrefetch = false; + if (busPrefetchCount<0) + busPrefetchCount=0; + if (busPrefetchCount>16) + busPrefetchCount=8; + +unsigned int clockTicks = codeTicksAccessSeq16(armNextPC)+1; + +armNextPC = reg[15].I; +reg[15].I += 2; +THUMB_PREFETCH_NEXT; + +switch(opcode >> 8) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + { + // LSL Rd, Rm, #Imm 5 + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + int shift = (opcode >> 6) & 0x1f; + uint32 value; + + if(shift) { + LSL_RD_RM_I5; + } else { + value = reg[source].I; + } + reg[dest].I = value; + // C_FLAG set above + N_FLAG = (value & 0x80000000 ? true : false); + Z_FLAG = (value ? false : true); + } + break; + case 0x08: + case 0x09: + case 0x0a: + case 0x0b: + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: + { + // LSR Rd, Rm, #Imm 5 + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + int shift = (opcode >> 6) & 0x1f; + uint32 value; + + if(shift) { + LSR_RD_RM_I5; + } else { + C_FLAG = reg[source].I & 0x80000000 ? true : false; + value = 0; + } + reg[dest].I = value; + // C_FLAG set above + N_FLAG = (value & 0x80000000 ? true : false); + Z_FLAG = (value ? false : true); + } + break; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + { + // ASR Rd, Rm, #Imm 5 + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + int shift = (opcode >> 6) & 0x1f; + uint32 value; + + if(shift) { + ASR_RD_RM_I5; + } else { + if(reg[source].I & 0x80000000) { + value = 0xFFFFFFFF; + C_FLAG = true; + } else { + value = 0; + C_FLAG = false; + } + } + reg[dest].I = value; + // C_FLAG set above + N_FLAG = (value & 0x80000000 ? true : false); + Z_FLAG = (value ? false :true); + } + break; + case 0x18: + case 0x19: + { + // ADD Rd, Rs, Rn + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + uint32 value = reg[(opcode>>6)& 0x07].I; + ADD_RD_RS_RN; + } + break; + case 0x1a: + case 0x1b: + { + // SUB Rd, Rs, Rn + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + uint32 value = reg[(opcode>>6)& 0x07].I; + SUB_RD_RS_RN; + } + break; + case 0x1c: + case 0x1d: + { + // ADD Rd, Rs, #Offset3 + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + uint32 value = (opcode >> 6) & 7; + ADD_RD_RS_O3; + } + break; + case 0x1e: + case 0x1f: + { + // SUB Rd, Rs, #Offset3 + int dest = opcode & 0x07; + int source = (opcode >> 3) & 0x07; + uint32 value = (opcode >> 6) & 7; + SUB_RD_RS_O3; + } + break; + case 0x20: + // MOV R0, #Offset8 + reg[0].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[0].I ? false : true); + break; + case 0x21: + // MOV R1, #Offset8 + reg[1].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[1].I ? false : true); + break; + case 0x22: + // MOV R2, #Offset8 + reg[2].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[2].I ? false : true); + break; + case 0x23: + // MOV R3, #Offset8 + reg[3].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[3].I ? false : true); + break; + case 0x24: + // MOV R4, #Offset8 + reg[4].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[4].I ? false : true); + break; + case 0x25: + // MOV R5, #Offset8 + reg[5].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[5].I ? false : true); + break; + case 0x26: + // MOV R6, #Offset8 + reg[6].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[6].I ? false : true); + break; + case 0x27: + // MOV R7, #Offset8 + reg[7].I = opcode & 255; + N_FLAG = false; + Z_FLAG = (reg[7].I ? false : true); + break; + case 0x28: + // CMP R0, #Offset8 + CMP_RN_O8(0); + break; + case 0x29: + // CMP R1, #Offset8 + CMP_RN_O8(1); + break; + case 0x2a: + // CMP R2, #Offset8 + CMP_RN_O8(2); + break; + case 0x2b: + // CMP R3, #Offset8 + CMP_RN_O8(3); + break; + case 0x2c: + // CMP R4, #Offset8 + CMP_RN_O8(4); + break; + case 0x2d: + // CMP R5, #Offset8 + CMP_RN_O8(5); + break; + case 0x2e: + // CMP R6, #Offset8 + CMP_RN_O8(6); + break; + case 0x2f: + // CMP R7, #Offset8 + CMP_RN_O8(7); + break; + case 0x30: + // ADD R0,#Offset8 + ADD_RN_O8(0); + break; + case 0x31: + // ADD R1,#Offset8 + ADD_RN_O8(1); + break; + case 0x32: + // ADD R2,#Offset8 + ADD_RN_O8(2); + break; + case 0x33: + // ADD R3,#Offset8 + ADD_RN_O8(3); + break; + case 0x34: + // ADD R4,#Offset8 + ADD_RN_O8(4); + break; + case 0x35: + // ADD R5,#Offset8 + ADD_RN_O8(5); + break; + case 0x36: + // ADD R6,#Offset8 + ADD_RN_O8(6); + break; + case 0x37: + // ADD R7,#Offset8 + ADD_RN_O8(7); + break; + case 0x38: + // SUB R0,#Offset8 + SUB_RN_O8(0); + break; + case 0x39: + // SUB R1,#Offset8 + SUB_RN_O8(1); + break; + case 0x3a: + // SUB R2,#Offset8 + SUB_RN_O8(2); + break; + case 0x3b: + // SUB R3,#Offset8 + SUB_RN_O8(3); + break; + case 0x3c: + // SUB R4,#Offset8 + SUB_RN_O8(4); + break; + case 0x3d: + // SUB R5,#Offset8 + SUB_RN_O8(5); + break; + case 0x3e: + // SUB R6,#Offset8 + SUB_RN_O8(6); + break; + case 0x3f: + // SUB R7,#Offset8 + SUB_RN_O8(7); + break; + case 0x40: + switch((opcode >> 6) & 3) { + case 0x00: + { + // AND Rd, Rs + int dest = opcode & 7; + reg[dest].I &= reg[(opcode >> 3)&7].I; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + Z_FLAG = reg[dest].I ? false : true; +#ifdef BKPT_SUPPORT +#define THUMB_CONSOLE_OUTPUT(a,b) \ + if((opcode == 0x4000) && (reg[0].I == 0xC0DED00D)) {\ + extern void (*dbgOutput)(char *, uint32);\ + dbgOutput((a), (b));\ + } +#else +#define THUMB_CONSOLE_OUTPUT(a,b) +#endif + THUMB_CONSOLE_OUTPUT(NULL, reg[2].I); + } + break; + case 0x01: + // EOR Rd, Rs + { + int dest = opcode & 7; + reg[dest].I ^= reg[(opcode >> 3)&7].I; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + Z_FLAG = reg[dest].I ? false : true; + } + break; + case 0x02: + // LSL Rd, Rs + { + int dest = opcode & 7; + uint32 value = reg[(opcode >> 3)&7].B.B0; + if(value) { + if(value == 32) { + value = 0; + C_FLAG = (reg[dest].I & 1 ? true : false); + } else if(value < 32) { + LSL_RD_RS; + } else { + value = 0; + C_FLAG = false; + } + reg[dest].I = value; + } + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + Z_FLAG = reg[dest].I ? false : true; + clockTicks = codeTicksAccesint16(armNextPC)+2; + } + break; + case 0x03: + { + // LSR Rd, Rs + int dest = opcode & 7; + uint32 value = reg[(opcode >> 3)&7].B.B0; + if(value) { + if(value == 32) { + value = 0; + C_FLAG = (reg[dest].I & 0x80000000 ? true : false); + } else if(value < 32) { + LSR_RD_RS; + } else { + value = 0; + C_FLAG = false; + } + reg[dest].I = value; + } + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + Z_FLAG = reg[dest].I ? false : true; + clockTicks = codeTicksAccesint16(armNextPC)+2; + } + break; + } + break; + case 0x41: + switch((opcode >> 6) & 3) { + case 0x00: + { + // ASR Rd, Rs + int dest = opcode & 7; + uint32 value = reg[(opcode >> 3)&7].B.B0; + // ASR + if(value) { + if(value < 32) { + ASR_RD_RS; + reg[dest].I = value; + } else { + if(reg[dest].I & 0x80000000){ + reg[dest].I = 0xFFFFFFFF; + C_FLAG = true; + } else { + reg[dest].I = 0x00000000; + C_FLAG = false; + } + } + } + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + Z_FLAG = reg[dest].I ? false : true; + clockTicks = codeTicksAccesint16(armNextPC)+2; + } + break; + case 0x01: + { + // ADC Rd, Rs + int dest = opcode & 0x07; + uint32 value = reg[(opcode >> 3)&7].I; + // ADC + ADC_RD_RS; + } + break; + case 0x02: + { + // SBC Rd, Rs + int dest = opcode & 0x07; + uint32 value = reg[(opcode >> 3)&7].I; + + // SBC + SBC_RD_RS; + } + break; + case 0x03: + // ROR Rd, Rs + { + int dest = opcode & 7; + uint32 value = reg[(opcode >> 3)&7].B.B0; + + if(value) { + value = value & 0x1f; + if(value == 0) { + C_FLAG = (reg[dest].I & 0x80000000 ? true : false); + } else { + ROR_RD_RS; + reg[dest].I = value; + } + } + clockTicks = codeTicksAccesint16(armNextPC)+2; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + Z_FLAG = reg[dest].I ? false : true; + } + break; + } + break; + case 0x42: + switch((opcode >> 6) & 3) { + case 0x00: + { + // TST Rd, Rs + uint32 value = reg[opcode & 7].I & reg[(opcode >> 3) & 7].I; + N_FLAG = value & 0x80000000 ? true : false; + Z_FLAG = value ? false : true; + } + break; + case 0x01: + { + // NEG Rd, Rs + int dest = opcode & 7; + int source = (opcode >> 3) & 7; + NEG_RD_RS; + } + break; + case 0x02: + { + // CMP Rd, Rs + int dest = opcode & 7; + uint32 value = reg[(opcode >> 3)&7].I; + CMP_RD_RS; + } + break; + case 0x03: + { + // CMN Rd, Rs + int dest = opcode & 7; + uint32 value = reg[(opcode >> 3)&7].I; + // CMN + CMN_RD_RS; + } + break; + } + break; + case 0x43: + switch((opcode >> 6) & 3) { + case 0x00: + { + // ORR Rd, Rs + int dest = opcode & 7; + reg[dest].I |= reg[(opcode >> 3) & 7].I; + Z_FLAG = reg[dest].I ? false : true; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + } + break; + case 0x01: + { + // MUL Rd, Rs + clockTicks = codeTicksAccesint16(armNextPC)+2; + int dest = opcode & 7; + uint32 rm = reg[dest].I; + reg[dest].I = reg[(opcode >> 3) & 7].I * rm; + if (((int32)rm) < 0) + rm = ~rm; + if ((rm & 0xFFFFFF00) == 0) + clockTicks += 0; + else if ((rm & 0xFFFF0000) == 0) + clockTicks += 1; + else if ((rm & 0xFF000000) == 0) + clockTicks += 2; + else + clockTicks += 3; + busPrefetchCount += clockTicks - codeTicksAccesint16(armNextPC) -1; + Z_FLAG = reg[dest].I ? false : true; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + } + break; + case 0x02: + { + // BIC Rd, Rs + int dest = opcode & 7; + reg[dest].I &= (~reg[(opcode >> 3) & 7].I); + Z_FLAG = reg[dest].I ? false : true; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + } + break; + case 0x03: + { + // MVN Rd, Rs + int dest = opcode & 7; + reg[dest].I = ~reg[(opcode >> 3) & 7].I; + Z_FLAG = reg[dest].I ? false : true; + N_FLAG = reg[dest].I & 0x80000000 ? true : false; + } + break; + } + break; + case 0x44: + { + int dest = opcode & 7; + int base = (opcode >> 3) & 7; + switch((opcode >> 6)& 3) { + default: + goto unknown_thumb; + case 1: + // ADD Rd, Hs + reg[dest].I += reg[base+8].I; + break; + case 2: + // ADD Hd, Rs + reg[dest+8].I += reg[base].I; + if(dest == 7) { + reg[15].I &= 0xFFFFFFFE; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + clockTicks += clockTicks+codeTicksAccesint16(armNextPC)+1; + } + break; + case 3: + // ADD Hd, Hs + reg[dest+8].I += reg[base+8].I; + if(dest == 7) { + reg[15].I &= 0xFFFFFFFE; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + clockTicks += clockTicks+codeTicksAccesint16(armNextPC)+1; + } + break; + } + } + break; + case 0x45: + { + int dest = opcode & 7; + int base = (opcode >> 3) & 7; + uint32 value; + switch((opcode >> 6) & 3) { + case 0: + // CMP Rd, Hs + value = reg[base].I; + CMP_RD_RS; + break; + case 1: + // CMP Rd, Hs + value = reg[base+8].I; + CMP_RD_RS; + break; + case 2: + // CMP Hd, Rs + value = reg[base].I; + dest += 8; + CMP_RD_RS; + break; + case 3: + // CMP Hd, Hs + value = reg[base+8].I; + dest += 8; + CMP_RD_RS; + break; + } + } + break; + case 0x46: + { + int dest = opcode & 7; + int base = (opcode >> 3) & 7; + switch((opcode >> 6) & 3) { + case 0: + // this form should not be used... + // MOV Rd, Rs + reg[dest].I = reg[base].I; + break; + case 1: + // MOV Rd, Hs + reg[dest].I = reg[base+8].I; + break; + case 2: + // MOV Hd, Rs + reg[dest+8].I = reg[base].I; + if(dest == 7) { + reg[15].I &= 0xFFFFFFFE; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + clockTicks += clockTicks+codeTicksAccesint16(armNextPC)+1; + } + break; + case 3: + // MOV Hd, Hs + reg[dest+8].I = reg[base+8].I; + if(dest == 7) { + reg[15].I &= 0xFFFFFFFE; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + clockTicks += clockTicks+codeTicksAccesint16(armNextPC)+1; + } + break; + } + } + break; + case 0x47: + { + int base = (opcode >> 3) & 7; + switch((opcode >>6) & 3) { + case 0: + // BX Rs + reg[15].I = (reg[base].I) & 0xFFFFFFFE; + if(reg[base].I & 1) { + armState = false; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + } else { + armState = true; + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + } + busPrefetchCount=0; + clockTicks += clockTicks+codeTicksAccesint16(armNextPC)+1; + break; + case 1: + // BX Hs + reg[15].I = (reg[8+base].I) & 0xFFFFFFFE; + if(reg[8+base].I & 1) { + armState = false; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + } else { + armState = true; + reg[15].I &= 0xFFFFFFFC; + armNextPC = reg[15].I; + reg[15].I += 4; + ARM_PREFETCH; + } + busPrefetchCount=0; + clockTicks += clockTicks+codeTicksAccesint16(armNextPC)+1; + break; + default: + goto unknown_thumb; + } + } + break; + case 0x48: + // LDR R0,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[0].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x49: + // LDR R1,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[1].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x4a: + // LDR R2,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[2].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x4b: + // LDR R3,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[3].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x4c: + // LDR R4,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[4].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x4d: + // LDR R5,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[5].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x4e: + // LDR R6,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[6].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x4f: + // LDR R7,[PC, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = (reg[15].I & 0xFFFFFFFC) + ((opcode & 0xFF) << 2); + reg[7].I = CPUReadMemoryQuick(address); + busPrefetchCount=0; + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x50: + case 0x51: + // STR Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + CPUWriteMemory(address, + reg[opcode & 7].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address) +2; + } + break; + case 0x52: + case 0x53: + // STRH Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + CPUWriteHalfWord(address, + reg[opcode&7].W.W0); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint16(address) +2; + } + break; + case 0x54: + case 0x55: + // STRB Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode >>6)&7].I; + CPUWriteByte(address, + reg[opcode & 7].B.B0); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint16(address) +2; + } + break; + case 0x56: + case 0x57: + // LDSB Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + reg[opcode&7].I = (int8)CPUReadByte(address); + clockTicks = 3 + dataTicksAccesint16(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x58: + case 0x59: + // LDR Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + reg[opcode&7].I = CPUReadMemory(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x5a: + case 0x5b: + // LDRH Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + reg[opcode&7].I = CPUReadHalfWord(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x5c: + case 0x5d: + // LDRB Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + reg[opcode&7].I = CPUReadByte(address); + clockTicks = 3 + dataTicksAccesint16(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x5e: + case 0x5f: + // LDSH Rd, [Rs, Rn] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + reg[(opcode>>6)&7].I; + reg[opcode&7].I = (int16)CPUReadHalfWordSigned(address); + clockTicks = 3 + dataTicksAccesint16(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: + // STR Rd, [Rs, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + (((opcode>>6)&31)<<2); + CPUWriteMemory(address, + reg[opcode&7].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x68: + case 0x69: + case 0x6a: + case 0x6b: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: + // LDR Rd, [Rs, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + (((opcode>>6)&31)<<2); + reg[opcode&7].I = CPUReadMemory(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: + // STRB Rd, [Rs, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + (((opcode>>6)&31)); + CPUWriteByte(address, + reg[opcode&7].B.B0); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint16(address)+2; + } + break; + case 0x78: + case 0x79: + case 0x7a: + case 0x7b: + case 0x7c: + case 0x7d: + case 0x7e: + case 0x7f: + // LDRB Rd, [Rs, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + (((opcode>>6)&31)); + reg[opcode&7].I = CPUReadByte(address); + clockTicks = 3 + dataTicksAccesint16(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x80: + case 0x81: + case 0x82: + case 0x83: + case 0x84: + case 0x85: + case 0x86: + case 0x87: + // STRH Rd, [Rs, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + (((opcode>>6)&31)<<1); + CPUWriteHalfWord(address, + reg[opcode&7].W.W0); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint16(address)+2; + } + break; + case 0x88: + case 0x89: + case 0x8a: + case 0x8b: + case 0x8c: + case 0x8d: + case 0x8e: + case 0x8f: + // LDRH Rd, [Rs, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[(opcode>>3)&7].I + (((opcode>>6)&31)<<1); + reg[opcode&7].I = CPUReadHalfWord(address); + clockTicks = 3 + dataTicksAccesint16(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x90: + // STR R0, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[0].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x91: + // STR R1, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[1].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x92: + // STR R2, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[2].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x93: + // STR R3, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[3].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x94: + // STR R4, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[4].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x95: + // STR R5, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[5].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x96: + // STR R6, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[6].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x97: + // STR R7, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + CPUWriteMemory(address, reg[7].I); + clockTicks = codeTicksAccesint16(armNextPC) + + dataTicksAccesint32(address)+2; + } + break; + case 0x98: + // LDR R0, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[0].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x99: + // LDR R1, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[1].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x9a: + // LDR R2, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[2].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x9b: + // LDR R3, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[3].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x9c: + // LDR R4, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[4].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x9d: + // LDR R5, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[5].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x9e: + // LDR R6, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[6].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0x9f: + // LDR R7, [SP, #Imm] + { + busPrefetch = busPrefetchEnable; + uint32 address = reg[13].I + ((opcode&255)<<2); + reg[7].I = CPUReadMemoryQuick(address); + clockTicks = 3 + dataTicksAccesint32(address) + + codeTicksAccesint16(armNextPC); + } + break; + case 0xa0: + // ADD R0, PC, Imm + reg[0].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa1: + // ADD R1, PC, Imm + reg[1].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa2: + // ADD R2, PC, Imm + reg[2].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa3: + // ADD R3, PC, Imm + reg[3].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa4: + // ADD R4, PC, Imm + reg[4].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa5: + // ADD R5, PC, Imm + reg[5].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa6: + // ADD R6, PC, Imm + reg[6].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa7: + // ADD R7, PC, Imm + reg[7].I = (reg[15].I & 0xFFFFFFFC) + ((opcode&255)<<2); + break; + case 0xa8: + // ADD R0, SP, Imm + reg[0].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xa9: + // ADD R1, SP, Imm + reg[1].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xaa: + // ADD R2, SP, Imm + reg[2].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xab: + // ADD R3, SP, Imm + reg[3].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xac: + // ADD R4, SP, Imm + reg[4].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xad: + // ADD R5, SP, Imm + reg[5].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xae: + // ADD R6, SP, Imm + reg[6].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xaf: + // ADD R7, SP, Imm + reg[7].I = reg[13].I + ((opcode&255)<<2); + break; + case 0xb0: + { + // ADD SP, Imm + int offset = (opcode & 127) << 2; + if(opcode & 0x80) + offset = -offset; + reg[13].I += offset; + } + break; +#define PUSH_REG(val, r) \ + if(opcode & (val)) {\ + CPUWriteMemory(address, reg[(r)].I);\ + if(offset)\ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + else\ + clockTicks += 1 + dataTicksAccesint32(address);\ + offset = 1;\ + address += 4;\ + } + case 0xb4: + // PUSH {Rlist} + { + busPrefetch = busPrefetchEnable; + int offset = 0; + uint32 temp = reg[13].I - 4 * cpuBitsSet[opcode & 0xff]; + uint32 address = temp & 0xFFFFFFFC; + clockTicks = codeTicksAccesint16(armNextPC)+1; + PUSH_REG(1, 0); + PUSH_REG(2, 1); + PUSH_REG(4, 2); + PUSH_REG(8, 3); + PUSH_REG(16, 4); + PUSH_REG(32, 5); + PUSH_REG(64, 6); + PUSH_REG(128, 7); + reg[13].I = temp; + } + break; + case 0xb5: + // PUSH {Rlist, LR} + { + busPrefetch = busPrefetchEnable; + int offset = 0; + uint32 temp = reg[13].I - 4 - 4 * cpuBitsSet[opcode & 0xff]; + uint32 address = temp & 0xFFFFFFFC; + clockTicks = codeTicksAccesint16(armNextPC)+1; + PUSH_REG(1, 0); + PUSH_REG(2, 1); + PUSH_REG(4, 2); + PUSH_REG(8, 3); + PUSH_REG(16, 4); + PUSH_REG(32, 5); + PUSH_REG(64, 6); + PUSH_REG(128, 7); + PUSH_REG(256, 14); + reg[13].I = temp; + } + break; +#define POP_REG(val, r) \ + if(opcode & (val)) {\ + reg[(r)].I = CPUReadMemory(address);\ + if(offset)\ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + else\ + clockTicks += 1 + dataTicksAccesint32(address);\ + offset = 1;\ + address += 4;\ + } + case 0xbc: + // POP {Rlist} + { + busPrefetch = busPrefetchEnable; + int offset = 0; + uint32 address = reg[13].I & 0xFFFFFFFC; + uint32 temp = reg[13].I + 4*cpuBitsSet[opcode & 0xFF]; + clockTicks = 0; + POP_REG(1, 0); + POP_REG(2, 1); + POP_REG(4, 2); + POP_REG(8, 3); + POP_REG(16, 4); + POP_REG(32, 5); + POP_REG(64, 6); + POP_REG(128, 7); + reg[13].I = temp; + clockTicks += codeTicksAccesint16(armNextPC)+2; + } + break; + case 0xbd: + // POP {Rlist, PC} + { + busPrefetch = busPrefetchEnable; + int offset = 0; + uint32 address = reg[13].I & 0xFFFFFFFC; + uint32 temp = reg[13].I + 4 + 4*cpuBitsSet[opcode & 0xFF]; + clockTicks = 0; + POP_REG(1, 0); + POP_REG(2, 1); + POP_REG(4, 2); + POP_REG(8, 3); + POP_REG(16, 4); + POP_REG(32, 5); + POP_REG(64, 6); + POP_REG(128, 7); + reg[15].I = (CPUReadMemory(address) & 0xFFFFFFFE); + if(offset) + clockTicks += 1 + dataTicksAccessSeq32(address); + else + clockTicks += 1 + dataTicksAccesint32(address); + armNextPC = reg[15].I; + reg[15].I += 2; + reg[13].I = temp; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks += 2*(codeTicksAccesint16(armNextPC))+3; + } + break; +#define THUMB_STM_REG(val,r,b) \ + if(opcode & (val)) {\ + CPUWriteMemory(address, reg[(r)].I);\ + if(!offset) {\ + reg[(b)].I = temp;\ + clockTicks += 1 + dataTicksAccesint32(address);\ + } else \ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + offset = 1;\ + address += 4;\ + } + case 0xc0: + { + // STM R0!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[0].I & 0xFFFFFFFC; + uint32 temp = reg[0].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 0); + THUMB_STM_REG(2, 1, 0); + THUMB_STM_REG(4, 2, 0); + THUMB_STM_REG(8, 3, 0); + THUMB_STM_REG(16, 4, 0); + THUMB_STM_REG(32, 5, 0); + THUMB_STM_REG(64, 6, 0); + THUMB_STM_REG(128, 7, 0); + } + break; + case 0xc1: + { + // STM R1!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[1].I & 0xFFFFFFFC; + uint32 temp = reg[1].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 1); + THUMB_STM_REG(2, 1, 1); + THUMB_STM_REG(4, 2, 1); + THUMB_STM_REG(8, 3, 1); + THUMB_STM_REG(16, 4, 1); + THUMB_STM_REG(32, 5, 1); + THUMB_STM_REG(64, 6, 1); + THUMB_STM_REG(128, 7, 1); + } + break; + case 0xc2: + { + // STM R2!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[2].I & 0xFFFFFFFC; + uint32 temp = reg[2].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 2); + THUMB_STM_REG(2, 1, 2); + THUMB_STM_REG(4, 2, 2); + THUMB_STM_REG(8, 3, 2); + THUMB_STM_REG(16, 4, 2); + THUMB_STM_REG(32, 5, 2); + THUMB_STM_REG(64, 6, 2); + THUMB_STM_REG(128, 7, 2); + } + break; + case 0xc3: + { + // STM R3!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[3].I & 0xFFFFFFFC; + uint32 temp = reg[3].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 3); + THUMB_STM_REG(2, 1, 3); + THUMB_STM_REG(4, 2, 3); + THUMB_STM_REG(8, 3, 3); + THUMB_STM_REG(16, 4, 3); + THUMB_STM_REG(32, 5, 3); + THUMB_STM_REG(64, 6, 3); + THUMB_STM_REG(128, 7, 3); + } + break; + case 0xc4: + { + // STM R4!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[4].I & 0xFFFFFFFC; + uint32 temp = reg[4].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 4); + THUMB_STM_REG(2, 1, 4); + THUMB_STM_REG(4, 2, 4); + THUMB_STM_REG(8, 3, 4); + THUMB_STM_REG(16, 4, 4); + THUMB_STM_REG(32, 5, 4); + THUMB_STM_REG(64, 6, 4); + THUMB_STM_REG(128, 7, 4); + } + break; + case 0xc5: + { + // STM R5!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[5].I & 0xFFFFFFFC; + uint32 temp = reg[5].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 5); + THUMB_STM_REG(2, 1, 5); + THUMB_STM_REG(4, 2, 5); + THUMB_STM_REG(8, 3, 5); + THUMB_STM_REG(16, 4, 5); + THUMB_STM_REG(32, 5, 5); + THUMB_STM_REG(64, 6, 5); + THUMB_STM_REG(128, 7, 5); + } + break; + case 0xc6: + { + // STM R6!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[6].I & 0xFFFFFFFC; + uint32 temp = reg[6].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 6); + THUMB_STM_REG(2, 1, 6); + THUMB_STM_REG(4, 2, 6); + THUMB_STM_REG(8, 3, 6); + THUMB_STM_REG(16, 4, 6); + THUMB_STM_REG(32, 5, 6); + THUMB_STM_REG(64, 6, 6); + THUMB_STM_REG(128, 7, 6); + } + break; + case 0xc7: + { + // STM R7!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[7].I & 0xFFFFFFFC; + uint32 temp = reg[7].I + 4*cpuBitsSet[opcode & 0xff]; + int offset = 0; + clockTicks = codeTicksAccesint16(armNextPC)+1; + // store + THUMB_STM_REG(1, 0, 7); + THUMB_STM_REG(2, 1, 7); + THUMB_STM_REG(4, 2, 7); + THUMB_STM_REG(8, 3, 7); + THUMB_STM_REG(16, 4, 7); + THUMB_STM_REG(32, 5, 7); + THUMB_STM_REG(64, 6, 7); + THUMB_STM_REG(128, 7, 7); + } + break; +#define THUMB_LDM_REG(val,r) \ + if(opcode & (val)) {\ + reg[(r)].I = CPUReadMemory(address);\ + if(offset)\ + clockTicks += 1 + dataTicksAccessSeq32(address);\ + else \ + clockTicks += 1 + dataTicksAccesint32(address);\ + offset = 1;\ + address += 4;\ + } + case 0xc8: + { + // LDM R0!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[0].I & 0xFFFFFFFC; + uint32 temp = reg[0].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 1)) + reg[0].I = temp; + } + break; + case 0xc9: + { + // LDM R1!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[1].I & 0xFFFFFFFC; + uint32 temp = reg[1].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 2)) + reg[1].I = temp; + } + break; + case 0xca: + { + // LDM R2!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[2].I & 0xFFFFFFFC; + uint32 temp = reg[2].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 4)) + reg[2].I = temp; + } + break; + case 0xcb: + { + // LDM R3!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[3].I & 0xFFFFFFFC; + uint32 temp = reg[3].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 8)) + reg[3].I = temp; + } + break; + case 0xcc: + { + // LDM R4!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[4].I & 0xFFFFFFFC; + uint32 temp = reg[4].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 16)) + reg[4].I = temp; + } + break; + case 0xcd: + { + // LDM R5!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[5].I & 0xFFFFFFFC; + uint32 temp = reg[5].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 32)) + reg[5].I = temp; + } + break; + case 0xce: + { + // LDM R6!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[6].I & 0xFFFFFFFC; + uint32 temp = reg[6].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 64)) + reg[6].I = temp; + } + break; + case 0xcf: + { + // LDM R7!, {Rlist} + busPrefetch = busPrefetchEnable; + uint32 address = reg[7].I & 0xFFFFFFFC; + uint32 temp = reg[7].I + 4*cpuBitsSet[opcode & 0xFF]; + int offset = 0; + clockTicks = 0; + // load + THUMB_LDM_REG(1, 0); + THUMB_LDM_REG(2, 1); + THUMB_LDM_REG(4, 2); + THUMB_LDM_REG(8, 3); + THUMB_LDM_REG(16, 4); + THUMB_LDM_REG(32, 5); + THUMB_LDM_REG(64, 6); + THUMB_LDM_REG(128, 7); + clockTicks += codeTicksAccesint16(armNextPC)+2; + if(!(opcode & 128)) + reg[7].I = temp; + } + break; + case 0xd0: + // BEQ offset + if(Z_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd1: + // BNE offset + if(!Z_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd2: + // BCS offset + if(C_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd3: + // BCC offset + if(!C_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd4: + // BMI offset + if(N_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd5: + // BPL offset + if(!N_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd6: + // BVS offset + if(V_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd7: + // BVC offset + if(!V_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd8: + // BHI offset + if(C_FLAG && !Z_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xd9: + // BLS offset + if(!C_FLAG || Z_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xda: + // BGE offset + if(N_FLAG == V_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xdb: + // BLT offset + if(N_FLAG != V_FLAG) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xdc: + // BGT offset + if(!Z_FLAG && (N_FLAG == V_FLAG)) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xdd: + // BLE offset + if(Z_FLAG || (N_FLAG != V_FLAG)) { + reg[15].I += (uint32)((int8)(opcode & 0xFF)) << 1; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; + case 0xdf: + { + // SWI #comment + uint32 address = 0; + busPrefetchCount=0; + clockTicks = 2*codeTicksAccessSeq16(address) + codeTicksAccesint16(address)+3; + CPUSoftwareInterrupt(opcode & 0xFF); + break; + } + case 0xe0: + case 0xe1: + case 0xe2: + case 0xe3: + case 0xe4: + case 0xe5: + case 0xe6: + case 0xe7: + { + // B offset + int offset = (opcode & 0x3FF) << 1; + if(opcode & 0x0400) + offset |= 0xFFFFF800; + reg[15].I += offset; + armNextPC = reg[15].I; + reg[15].I += 2; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks += clockTicks + codeTicksAccesint16(armNextPC)+1; + } + break; + case 0xf0: + case 0xf1: + case 0xf2: + case 0xf3: + { + // BLL #offset + int offset = (opcode & 0x7FF); + reg[14].I = reg[15].I + (offset << 12); + } + break; + case 0xf4: + case 0xf5: + case 0xf6: + case 0xf7: + { + // BLL #offset + int offset = (opcode & 0x7FF); + reg[14].I = reg[15].I + ((offset << 12) | 0xFF800000); + } + break; + case 0xf8: + case 0xf9: + case 0xfa: + case 0xfb: + case 0xfc: + case 0xfd: + case 0xfe: + case 0xff: + { + // BLH #offset + int offset = (opcode & 0x7FF); + uint32 temp = reg[15].I-2; + reg[15].I = (reg[14].I + (offset<<1))&0xFFFFFFFE; + armNextPC = reg[15].I; + reg[15].I += 2; + reg[14].I = temp|1; + THUMB_PREFETCH; + busPrefetchCount=0; + clockTicks += 2*codeTicksAccessSeq16(armNextPC) + codeTicksAccesint16(armNextPC)+3; + } + break; +#ifdef BKPT_SUPPORT + case 0xbe: + // BKPT #comment + extern void (*dbgSignal)(int,int); + reg[15].I -= 2; + armNextPC -= 2; + dbgSignal(5, opcode & 255); + return; +#endif + case 0xb1: + case 0xb2: + case 0xb3: + case 0xb6: + case 0xb7: + case 0xb8: + case 0xb9: + case 0xba: + case 0xbb: +#ifndef BKPT_SUPPORT + case 0xbe: +#endif + case 0xbf: + case 0xde: + default: + unknown_thumb: +#ifdef DEV_VERSION + if(systemVerbose & VERBOSE_UNDEFINED) + log("Undefined THUMB instruction %04x at %08x\n", opcode, armNextPC-2); +#endif + CPUUndefinedException(); + break; +} + return(clockTicks); +} + +} diff --git a/Mednafen/mednafen/gba/thumb.h b/Mednafen/mednafen/gba/thumb.h new file mode 100644 index 0000000000..3dede69e6b --- /dev/null +++ b/Mednafen/mednafen/gba/thumb.h @@ -0,0 +1,6 @@ +namespace MDFN_IEN_GBA +{ + +unsigned int RunTHUMB(void); + +} diff --git a/Mednafen/mednafen/general.cpp b/Mednafen/mednafen/general.cpp new file mode 100644 index 0000000000..ecfd5eef8d --- /dev/null +++ b/Mednafen/mednafen/general.cpp @@ -0,0 +1,569 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "general.h" +#include "state.h" + +#include + +using namespace std; + +static string BaseDirectory; +static string FileBase; +static string FileExt; /* Includes the . character, as in ".nes" */ +static string FileBaseDirectory; + +void MDFN_SetBaseDirectory(const std::string& dir) +{ + BaseDirectory = string(dir); +} + +std::string MDFN_GetBaseDirectory(void) +{ + return BaseDirectory; +} + +// Really dumb, maybe we should use boost? +static bool IsAbsolutePath(const char *path) +{ + #if PSS_STYLE==4 + if(path[0] == ':') + #elif PSS_STYLE==1 + if(path[0] == '/') + #else + if(path[0] == '\\' + #if PSS_STYLE!=3 + || path[0] == '/' + #endif + ) + #endif + { + return(TRUE); + } + + #if defined(WIN32) || defined(DOS) + if((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z')) + { + if(path[1] == ':') + { + return(TRUE); + } + } + #endif + + return(FALSE); +} + +static bool IsAbsolutePath(const std::string &path) +{ + return(IsAbsolutePath(path.c_str())); +} + +bool MDFN_IsFIROPSafe(const std::string &path) +{ + // + // First, check for any 8-bit characters, and print a warning about portability. + // + for(size_t x = 0; x < path.size(); x++) + { + if(path[x] & 0x80) + { + MDFN_printf(_("WARNING: Referenced path \"%s\" contains at least one 8-bit non-ASCII character; this may cause portability issues.\n"), path.c_str()); + break; + } + } + + // We could make this more OS-specific, but it shouldn't hurt to try to weed out usage of characters that are path + // separators in one OS but not in another, and we'd also run more of a risk of missing a special path separator case + // in some OS. + if(!MDFN_GetSettingB("filesys.untrusted_fip_check")) + return(true); + + if(path.find('\0') != string::npos) + return(false); + + if(path.find(':') != string::npos) + return(false); + + if(path.find('\\') != string::npos) + return(false); + + if(path.find('/') != string::npos) + return(false); + +#if defined(DOS) || defined(WIN32) + // + // http://support.microsoft.com/kb/74496 + // + { + static const char* dev_names[] = + { + "CON", "PRN", "AUX", "CLOCK$", "NUL", "COM1", "COM2", "COM3", "COM4", "LPT1", "LPT2", "LPT3", NULL + }; + + for(const char** ls = dev_names; *ls != NULL; ls++) + { + if(!strcasecmp(*ls, path.c_str())) + return(false); + } + } +#endif + + return(true); +} + +void MDFN_GetFilePathComponents(const std::string &file_path, std::string *dir_path_out, std::string *file_base_out, std::string *file_ext_out) +{ + size_t final_ds; // in file_path + string file_name; + size_t fn_final_dot; // in local var file_name + // Temporary output: + string dir_path, file_base, file_ext; + +#if PSS_STYLE==4 + final_ds = file_path.find_last_of(':'); +#elif PSS_STYLE==1 + final_ds = file_path.find_last_of('/'); +#else + final_ds = file_path.find_last_of('\\'); + + #if PSS_STYLE!=3 + { + size_t alt_final_ds = file_path.find_last_of('/'); + + if(final_ds == string::npos || (alt_final_ds != string::npos && alt_final_ds > final_ds)) + final_ds = alt_final_ds; + } + #endif +#endif + + if(final_ds == string::npos) + { + dir_path = string("."); + file_name = file_path; + } + else + { + dir_path = file_path.substr(0, final_ds); + file_name = file_path.substr(final_ds + 1); + } + + fn_final_dot = file_name.find_last_of('.'); + + if(fn_final_dot != string::npos) + { + file_base = file_name.substr(0, fn_final_dot); + file_ext = file_name.substr(fn_final_dot); + } + else + { + file_base = file_name; + file_ext = string(""); + } + + if(dir_path_out) + *dir_path_out = dir_path; + + if(file_base_out) + *file_base_out = file_base; + + if(file_ext_out) + *file_ext_out = file_ext; +} + +std::string MDFN_EvalFIP(const std::string &dir_path, const std::string &rel_path, bool skip_safety_check) +{ + if(!skip_safety_check && !MDFN_IsFIROPSafe(rel_path)) + throw MDFN_Error(0, _("Referenced path \"%s\" is potentially unsafe. See \"filesys.untrusted_fip_check\" setting.\n"), rel_path.c_str()); + + if(IsAbsolutePath(rel_path.c_str())) + return(rel_path); + else + { + return(dir_path + std::string(PSS) + rel_path); + } +} + + +typedef std::map FSMap; + +static std::string EvalPathFS(const std::string &fstring, /*const (won't work because entry created if char doesn't exist) */ FSMap &fmap) +{ + std::string ret = ""; + const char *str = fstring.c_str(); + bool in_spec = false; + + while(*str) + { + int c = *str; + + if(!in_spec && c == '%') + in_spec = true; + else if(in_spec == true) + { + if(c == '%') + ret = ret + std::string("%"); + else + ret = ret + fmap[(char)c]; + in_spec = false; + } + else + { + char ct[2]; + ct[0] = c; + ct[1] = 0; + ret += std::string(ct); + } + + str++; + } + + return(ret); +} + +#if 0 +static void CreateMissingDirs(const char *path) +{ + const char *s = path; + bool first_psep = true; + char last_char = 0; + const char char_test1 = '/', char_test2 = '/'; + + + while(*s) + { + if(*s == char_test1 || *s == char_test2) + { + if(last_char != *s) //char_test1 && last_char != char_test2) + { + if(!first_psep) + { + char tmpbuf[(s - path) + 1]; + tmpbuf[s - path] = 0; + strncpy(tmpbuf, path, s - path); + + puts(tmpbuf); + //MDFN_mkdir(tmpbuf, S_IRWXU); + } + } + + first_psep = false; + } + last_char = *s; + s++; + } +} +#endif + +std::string MDFN_MakeFName(MakeFName_Type type, int id1, const char *cd1) +{ + char tmp_path[4096]; + char numtmp[64]; + struct stat tmpstat; + string eff_dir; + FSMap fmap; + + fmap['b'] = BaseDirectory; + fmap['z'] = std::string(PSS); + + if(MDFNGameInfo) + { + fmap['d'] = FileBaseDirectory; + fmap['f'] = FileBase; + fmap['F'] = FileBase; // If game is a CD, and the CD is recognized as being part of a multi-CD set, then this + // will be replaced with MDFNGameInfo->shortname + + fmap['m'] = md5_context::asciistr(MDFNGameInfo->MD5, 0); // MD5 hash of the currently loaded game ONLY. + + fmap['M'] = ""; // One with this empty, if file not found, then fill with MD5 hash of the currently loaded game, + // or the MD5 gameset hash for certain CD games, followed by a period and go with that result. + // Note: The MD5-less result is skipped if the CD is part of a recognized multi-CD set. + fmap['e'] = FileExt; + fmap['s'] = MDFNGameInfo->shortname; + + fmap['p'] = ""; + + + fmap['x'] = ""; // Default extension(without period) + fmap['X'] = ""; // A merging of x and p + + if(MDFNGameInfo->GameSetMD5Valid) + { + fmap['M'] = md5_context::asciistr(MDFNGameInfo->GameSetMD5, 0) + std::string("."); + fmap['F'] = MDFNGameInfo->shortname; + } + } + + + + + //printf("%s\n", EvalPathFS(std::string("%f.%m.sav"), fmap).c_str()); + + switch(type) + { + default: tmp_path[0] = 0; + break; + + case MDFNMKF_MOVIE: + case MDFNMKF_STATE: + case MDFNMKF_SAV: + { + std::string dir, fstring, fpath; + + if(type == MDFNMKF_MOVIE) + { + dir = MDFN_GetSettingS("filesys.path_movie"); + fstring = MDFN_GetSettingS("filesys.fname_movie"); + fmap['x'] = "mcm"; + } + else if(type == MDFNMKF_STATE) + { + dir = MDFN_GetSettingS("filesys.path_state"); + fstring = MDFN_GetSettingS("filesys.fname_state"); + fmap['x'] = (cd1 ? cd1 : "mcs"); + } + else if(type == MDFNMKF_SAV) + { + dir = MDFN_GetSettingS("filesys.path_sav"); + fstring = MDFN_GetSettingS("filesys.fname_sav"); + fmap['x'] = std::string(cd1); + } + + fmap['X'] = fmap['x']; + + if(type != MDFNMKF_SAV && !cd1) + { + trio_snprintf(numtmp, sizeof(numtmp), "%d", id1); + fmap['p'] = std::string(numtmp); + } + + if(fmap['X'].size() > 1 && fmap['p'].size()) + fmap['X'] = fmap['X'].erase(fmap['X'].size() - 1) + fmap['p']; + + for(int i = 0; i < 2; i++) + { + fpath = EvalPathFS(fstring, fmap); + + if(!IsAbsolutePath(fpath)) + { + if(!IsAbsolutePath(dir)) + dir = BaseDirectory + std::string(PSS) + dir; + + fpath = dir + std::string(PSS) + fpath; + } + + if(stat(fpath.c_str(), &tmpstat) == -1) + fmap['M'] = md5_context::asciistr(MDFNGameInfo->MD5, 0) + std::string("."); + else + break; + } + + return(fpath); + } + + case MDFNMKF_SNAP_DAT: + case MDFNMKF_SNAP: + { + std::string dir = MDFN_GetSettingS("filesys.path_snap"); + std::string fstring = MDFN_GetSettingS("filesys.fname_snap"); + std::string fpath; + + trio_snprintf(numtmp, sizeof(numtmp), "%04u", id1); + + fmap['p'] = std::string(numtmp); + + if(cd1) + fmap['x'] = std::string(cd1); + + if(type == MDFNMKF_SNAP_DAT) + { + fmap['p'] = std::string("counter"); + fmap['x'] = std::string("txt"); + } + fpath = EvalPathFS(fstring, fmap); + if(!IsAbsolutePath(fpath)) + { + if(!IsAbsolutePath(dir)) + dir = BaseDirectory + std::string(PSS) + dir; + + fpath = dir + std::string(PSS) + fpath; + } + return(fpath); + } + break; + + case MDFNMKF_CHEAT_TMP: + case MDFNMKF_CHEAT: + { + std::string overpath = MDFN_GetSettingS("filesys.path_cheat"); + + if(IsAbsolutePath(overpath)) + trio_snprintf(tmp_path, 4096, "%s" PSS "%s.%scht",overpath.c_str(), MDFNGameInfo->shortname, (type == MDFNMKF_CHEAT_TMP) ? "tmp" : ""); + else + trio_snprintf(tmp_path, 4096, "%s" PSS "%s" PSS "%s.%scht", BaseDirectory.c_str(), overpath.c_str(), MDFNGameInfo->shortname, (type == MDFNMKF_CHEAT_TMP) ? "tmp" : ""); + } + break; + + case MDFNMKF_AUX: if(IsAbsolutePath(cd1)) + trio_snprintf(tmp_path, 4096, "%s", (char *)cd1); + else + trio_snprintf(tmp_path, 4096, "%s" PSS "%s", FileBaseDirectory.c_str(), (char *)cd1); + break; + + case MDFNMKF_IPS: trio_snprintf(tmp_path, 4096, "%s" PSS "%s%s.ips", FileBaseDirectory.c_str(), FileBase.c_str(), FileExt.c_str()); + break; + + case MDFNMKF_FIRMWARE: + { + std::string overpath = MDFN_GetSettingS("filesys.path_firmware"); + + if(IsAbsolutePath(cd1)) + { + trio_snprintf(tmp_path, 4096, "%s", cd1); + } + else + { + if(IsAbsolutePath(overpath)) + trio_snprintf(tmp_path, 4096, "%s" PSS "%s",overpath.c_str(), cd1); + else + { + trio_snprintf(tmp_path, 4096, "%s" PSS "%s" PSS "%s", BaseDirectory.c_str(), overpath.c_str(), cd1); + + // For backwards-compatibility with < 0.9.0 + if(stat(tmp_path,&tmpstat) == -1) + trio_snprintf(tmp_path, 4096, "%s" PSS "%s", BaseDirectory.c_str(), cd1); + } + } + } + break; + + case MDFNMKF_PALETTE: + { + std::string overpath = MDFN_GetSettingS("filesys.path_palette"); + + if(IsAbsolutePath(overpath)) + eff_dir = overpath; + else + eff_dir = std::string(BaseDirectory) + std::string(PSS) + overpath; + + trio_snprintf(tmp_path, 4096, "%s" PSS "%s.pal", eff_dir.c_str(), FileBase.c_str()); + + if(stat(tmp_path,&tmpstat) == -1 && errno == ENOENT) + { + trio_snprintf(tmp_path, 4096, "%s" PSS "%s.%s.pal", eff_dir.c_str(), FileBase.c_str(), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + if(stat(tmp_path, &tmpstat) == -1 && errno == ENOENT) + trio_snprintf(tmp_path, 4096, "%s" PSS "%s.pal", eff_dir.c_str(), cd1 ? cd1 : MDFNGameInfo->shortname); + } + } + break; + + case MDFNMKF_PGCONFIG: + { + std::string overpath = MDFN_GetSettingS("filesys.path_pgconfig"); + + if(IsAbsolutePath(overpath)) + eff_dir = overpath; + else + eff_dir = std::string(BaseDirectory) + std::string(PSS) + overpath; + + trio_snprintf(tmp_path, 4096, "%s" PSS "%s.%s.cfg", eff_dir.c_str(), FileBase.c_str(), MDFNGameInfo->shortname); + } + break; + + } + return(tmp_path); +} + +const char * GetFNComponent(const char *str) +{ + const char *tp1; + + #if PSS_STYLE==4 + tp1=((char *)strrchr(str,':')); + #elif PSS_STYLE==1 + tp1=((char *)strrchr(str,'/')); + #else + tp1=((char *)strrchr(str,'\\')); + #if PSS_STYLE!=3 + { + const char *tp3; + tp3=((char *)strrchr(str,'/')); + if(tp1tp1)) + { + FileBase.resize(tp3 - tp1); + memcpy(&FileBase[0], tp1, tp3 - tp1); + FileExt = string(tp3); + } + else + { + FileBase = string(tp1); + FileExt = ""; + } +} + diff --git a/Mednafen/mednafen/general.h b/Mednafen/mednafen/general.h new file mode 100644 index 0000000000..829f894ccc --- /dev/null +++ b/Mednafen/mednafen/general.h @@ -0,0 +1,53 @@ +#ifndef _GENERAL_H +#define _GENERAL_H + +#include + +#if 0 +class FilePathMaker +{ + + + void SetBaseDirectory(const char* path); + std::string GetBaseDirectory(void); + + void BuildPath(unsigned type, int id1, const char* cd1); + + static void GetFileBase( + +}; +#endif + +void MDFN_SetBaseDirectory(const std::string& dir); +std::string MDFN_GetBaseDirectory(void); + +void GetFileBase(const char *f); + +// File-inclusion for-read-only path, for PSF and CUE/TOC sheet usage. +bool MDFN_IsFIROPSafe(const std::string &path); + +std::string MDFN_MakeFName(int type, int id1, const char *cd1); + +typedef enum +{ + MDFNMKF_STATE = 0, + MDFNMKF_SNAP, + MDFNMKF_SAV, + MDFNMKF_CHEAT, + MDFNMKF_PALETTE, + MDFNMKF_IPS, + MDFNMKF_MOVIE, + MDFNMKF_AUX, + MDFNMKF_SNAP_DAT, + MDFNMKF_CHEAT_TMP, + MDFNMKF_FIRMWARE, + MDFNMKF_PGCONFIG +} MakeFName_Type; + +std::string MDFN_MakeFName(MakeFName_Type type, int id1, const char *cd1); +INLINE std::string MDFN_MakeFName(MakeFName_Type type, int id1, const std::string& cd1) { return MDFN_MakeFName(type, id1, cd1.c_str()); } +const char * GetFNComponent(const char *str); + +void MDFN_GetFilePathComponents(const std::string &file_path, std::string *dir_path_out, std::string *file_base_out = NULL, std::string *file_ext_out = NULL); +std::string MDFN_EvalFIP(const std::string &dir_path, const std::string &rel_path, bool skip_safety_check = false); +#endif diff --git a/Mednafen/mednafen/gettext.h b/Mednafen/mednafen/gettext.h new file mode 100644 index 0000000000..b896fc6624 --- /dev/null +++ b/Mednafen/mednafen/gettext.h @@ -0,0 +1,79 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/Mednafen/mednafen/git.cpp b/Mednafen/mednafen/git.cpp new file mode 100644 index 0000000000..5f104dfe50 --- /dev/null +++ b/Mednafen/mednafen/git.cpp @@ -0,0 +1,102 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include + +const IDIISG IDII_Empty; + +IDIISG::IDIISG() +{ + InputByteSize = 0; +} + +IDIISG::IDIISG(std::initializer_list l) : std::vector(l) +{ + size_t bit_offset = 0; + + for(auto& idii : *this) + { + size_t bit_size = 0; + size_t bit_align = 1; + + switch(idii.Type) + { + default: + abort(); + break; + + case IDIT_BUTTON: + case IDIT_BUTTON_CAN_RAPID: + bit_size = 1; + break; + + case IDIT_SWITCH: + bit_size = ceil(log2(idii.SwitchNumPos)); + break; + + case IDIT_STATUS: + bit_size = ceil(log2(idii.StatusNumStates)); + break; + + case IDIT_X_AXIS: + case IDIT_Y_AXIS: + bit_size = 16; + bit_align = 8; + break; + + case IDIT_X_AXIS_REL: + case IDIT_Y_AXIS_REL: + bit_size = 32; + bit_align = 8; + break; + + case IDIT_BYTE_SPECIAL: + bit_size = 8; + bit_align = 8; + break; + + case IDIT_BUTTON_ANALOG: + bit_size = 16; + bit_align = 8; + break; + + case IDIT_RUMBLE: + bit_size = 16; + bit_align = 8; + break; + + } + + bit_offset = (bit_offset + (bit_align - 1)) &~ (bit_align - 1); + + // printf("%s, %zu(%zu)\n", idii.SettingName, bit_offset, bit_offset / 8); + + idii.BitSize = bit_size; + idii.BitOffset = bit_offset; + + assert(idii.BitSize == bit_size); + assert(idii.BitOffset == bit_offset); + + bit_offset += bit_size; + } + + InputByteSize = (bit_offset + 7) / 8; +} + + diff --git a/Mednafen/mednafen/git.h b/Mednafen/mednafen/git.h new file mode 100644 index 0000000000..a50efd0fb1 --- /dev/null +++ b/Mednafen/mednafen/git.h @@ -0,0 +1,563 @@ +#ifndef __MDFN_GIT_H +#define __MDFN_GIT_H + +#include + +#include "video.h" + +typedef struct +{ + const char *extension; // Example ".nes" + const char *description; // Example "iNES Format ROM Image" +} FileExtensionSpecStruct; + +#include "file.h" + +enum +{ + MDFN_ROTATE0 = 0, + MDFN_ROTATE90, + MDFN_ROTATE180, + MDFN_ROTATE270 +}; + +typedef enum +{ + VIDSYS_NONE, // Can be used internally in system emulation code, but it is an error condition to let it continue to be + // after the Load() or LoadCD() function returns! + VIDSYS_PAL, + VIDSYS_PAL_M, // Same timing as NTSC, but uses PAL-style colour encoding + VIDSYS_NTSC, + VIDSYS_SECAM +} VideoSystems; + +typedef enum +{ + GMT_NONE = 0, + GMT_ARCADE, // VS Unisystem, PC-10... + GMT_PLAYER // Music player(NSF, HES, GSF) +} GameMediumTypes; + +#include "state.h" +#include "settings-common.h" + +#ifdef WANT_DEBUGGER +// #ifdef WANT_DEBUGGER +// typedef struct DebuggerInfoStruct; +// #else +#include "debug.h" + +#endif + +enum InputDeviceInputType : uint8 +{ + IDIT_BUTTON, // 1-bit + IDIT_BUTTON_CAN_RAPID, // 1-bit + + IDIT_SWITCH, // ceil(log2(n))-bit + // Current switch position(default 0). + // Persistent, and bidirectional communication(can be modified driver side, and Mednafen core and emulation module side) + + IDIT_STATUS, // ceil(log2(n))-bit + // emulation module->driver communication + + IDIT_X_AXIS, // (mouse) 16-bits, signed - in-screen/window range: [0.0, nominal_width) + IDIT_Y_AXIS, // (mouse) 16-bits, signed - in-screen/window range: [0.0, nominal_height) + + IDIT_X_AXIS_REL, // (mouse) 32-bits, signed + IDIT_Y_AXIS_REL, // (mouse) 32-bits, signed + + IDIT_BYTE_SPECIAL, + + IDIT_BUTTON_ANALOG, // 16-bits, 0 - 32767 + + IDIT_RUMBLE, // 16-bits, lower 8 bits are weak rumble(0-255), next 8 bits are strong rumble(0-255), 0=no rumble, 255=max rumble. Somewhat subjective, too... + // It's a rather special case of game module->driver code communication. +}; + + +#define IDIT_BUTTON_ANALOG_FLAG_SQLR 0x00000001 // Denotes analog data that may need to be scaled to ensure a more squareish logical range(for emulated + // analog sticks). +struct IDIIS_StatusState +{ + const char* ShortName; + const char* Name; + int32 Color; // (msb)0RGB(lsb), -1 for unused. +}; + +struct InputDeviceInputInfoStruct +{ + const char *SettingName; // No spaces, shouldbe all a-z0-9 and _. Definitely no ~! + const char *Name; + int ConfigOrder; // Configuration order during in-game config process, -1 for no config. + InputDeviceInputType Type; + const char *ExcludeName; // SettingName of a button that can't be pressed at the same time as this button + // due to physical limitations. + + const char *RotateName[3]; // 90, 180, 270 + uint8 Flags; + uint8 BitSize; + uint16 BitOffset; + + union + { + struct + { + const char** SwitchPosName; // + uint32 SwitchNumPos; + }; + + struct + { + const IDIIS_StatusState* StatusStates; + uint32 StatusNumStates; + }; + }; +}; + +struct IDIISG : public std::vector +{ + IDIISG(); + IDIISG(std::initializer_list l); + uint32 InputByteSize; +}; + +extern const IDIISG IDII_Empty; + +#if 0 +template +struct IDIIS_Button : public InputDeviceInputInfoStruct +{ + IDIIS_Button(const char* sname, const char* name, int co, const char* en = NULL, + const char* Rotate90Name = NULL, const char* Rotate180Name = NULL, const char* Rotate270Name = NULL) + { + SettingName = sname; + Name = name; + ConfigOrder = co; + Type = (CanRapid ? IDIT_BUTTON_CAN_RAPID : IDIT_BUTTON); + + ExcludeName = en; + RotateName[0] = Rotate90Name; + RotateName[1] = Rotate180Name; + RotateName[2] = Rotate270Name; + } +}; +#endif + +struct IDIIS_Switch : public InputDeviceInputInfoStruct +{ + IDIIS_Switch(const char* sname, const char* name, int co, const char** spn, const uint32 spn_num) + { + SettingName = sname; + Name = name; + ConfigOrder = co; + Type = IDIT_SWITCH; + + ExcludeName = NULL; + RotateName[0] = RotateName[1] = RotateName[2] = NULL; + Flags = 0; + SwitchPosName = spn; + SwitchNumPos = spn_num; + } +}; + +struct IDIIS_Status : public InputDeviceInputInfoStruct +{ + IDIIS_Status(const char* sname, const char* name, const IDIIS_StatusState* ss, const uint32 ss_num) + { + SettingName = sname; + Name = name; + ConfigOrder = -1; + Type = IDIT_STATUS; + + ExcludeName = NULL; + RotateName[0] = RotateName[1] = RotateName[2] = NULL; + Flags = 0; + StatusStates = ss; + StatusNumStates = ss_num; + } +}; + +struct InputDeviceInfoStruct +{ + const char *ShortName; + const char *FullName; + const char *Description; + + const IDIISG& IDII; +}; + +struct InputPortInfoStruct +{ + const char *ShortName; + const char *FullName; + const std::vector &DeviceInfo; + const char *DefaultDevice; // Default device for this port. +}; + +struct MemoryPatch; + +struct CheatFormatStruct +{ + const char *FullName; //"Game Genie", "GameShark", "Pro Action Catplay", etc. + const char *Description; // Whatever? + + bool (*DecodeCheat)(const std::string& cheat_string, MemoryPatch* patch); // *patch should be left as initialized by MemoryPatch::MemoryPatch(), unless this is the + // second(or third or whatever) part of a multipart cheat. + // + // Will throw an std::exception(or derivative) on format error. + // + // Will return true if this is part of a multipart cheat. +}; + +struct CheatFormatInfoStruct +{ + unsigned NumFormats; + + CheatFormatStruct *Formats; +}; + +// Miscellaneous system/simple commands(power, reset, dip switch toggles, coin insert, etc.) +// (for DoSimpleCommand() ) +enum +{ + MDFN_MSC_RESET = 0x01, + MDFN_MSC_POWER = 0x02, + + MDFN_MSC_INSERT_COIN = 0x07, + + // If we ever support arcade systems, we'll abstract DIP switches differently...maybe. + MDFN_MSC_TOGGLE_DIP0 = 0x10, + MDFN_MSC_TOGGLE_DIP1, + MDFN_MSC_TOGGLE_DIP2, + MDFN_MSC_TOGGLE_DIP3, + MDFN_MSC_TOGGLE_DIP4, + MDFN_MSC_TOGGLE_DIP5, + MDFN_MSC_TOGGLE_DIP6, + MDFN_MSC_TOGGLE_DIP7, + MDFN_MSC_TOGGLE_DIP8, + MDFN_MSC_TOGGLE_DIP9, + MDFN_MSC_TOGGLE_DIP10, + MDFN_MSC_TOGGLE_DIP11, + MDFN_MSC_TOGGLE_DIP12, + MDFN_MSC_TOGGLE_DIP13, + MDFN_MSC_TOGGLE_DIP14, + MDFN_MSC_TOGGLE_DIP15, + + MDFN_MSC__LAST = 0x3F // WARNING: Increasing(or having the enum'd value of a command greater than this :b) this will necessitate a change to the netplay protocol. +}; + +typedef struct +{ + // Pitch(32-bit) must be equal to width and >= the "fb_width" specified in the MDFNGI struct for the emulated system. + // Height must be >= to the "fb_height" specified in the MDFNGI struct for the emulated system. + // The framebuffer pointed to by surface->pixels is written to by the system emulation code. + MDFN_Surface *surface; + + // Will be set to TRUE if the video pixel format has changed since the last call to Emulate(), FALSE otherwise. + // Will be set to TRUE on the first call to the Emulate() function/method + bool VideoFormatChanged; + + // Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size + // of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure + // is ignored while drawing the image. + MDFN_Rect DisplayRect; + + // Pointer to an array of int32, number of elements = fb_height, set by the driver code. Individual elements written + // to by system emulation code. If the emulated system doesn't support multiple screen widths per frame, or if you handle + // such a situation by outputting at a constant width-per-frame that is the least-common-multiple of the screen widths, then + // you can ignore this. If you do wish to use this, you must set all elements every frame. + int32 *LineWidths; + + // Pointer to an array of uint8, 3 * CustomPaletteEntries. + // CustomPalette must be NULL and CustomPaletteEntries mujst be 0 if no custom palette is specified/available; + // otherwise, CustomPalette must be non-NULL and CustomPaletteEntries must be equal to a non-zero "num_entries" member of a CustomPalette_Spec + // entry of MDFNGI::CPInfo. + // + // Set and used internally, driver-side code needn't concern itself with this. + // + uint8 *CustomPalette; + uint32 CustomPaletteNumEntries; + + // TODO + bool *IsFMV; + + // Set(optionally) by emulation code. If InterlaceOn is true, then assume field height is 1/2 DisplayRect.h, and + // only every other line in surface (with the start line defined by InterlacedField) has valid data + // (it's up to internal Mednafen code to deinterlace it). + bool InterlaceOn; + bool InterlaceField; + + // Skip rendering this frame if true. Set by the driver code. + int skip; + + // + // If sound is disabled, the driver code must set SoundRate to false, SoundBuf to NULL, SoundBufMaxSize to 0. + + // Will be set to TRUE if the sound format(only rate for now, at least) has changed since the last call to Emulate(), FALSE otherwise. + // Will be set to TRUE on the first call to the Emulate() function/method + bool SoundFormatChanged; + + // Sound rate. Set by driver side. + double SoundRate; + + // Pointer to sound buffer, set by the driver code, that the emulation code should render sound to. + // Guaranteed to be at least 500ms in length, but emulation code really shouldn't exceed 40ms or so. Additionally, if emulation code + // generates >= 100ms, + // DEPRECATED: Emulation code may set this pointer to a sound buffer internal to the emulation module. + int16 *SoundBuf; + + // Maximum size of the sound buffer, in frames. Set by the driver code. + int32 SoundBufMaxSize; + + // Number of frames currently in internal sound buffer. Set by the system emulation code, to be read by the driver code. + int32 SoundBufSize; + int32 SoundBufSizeALMS; // SoundBufSize value at last MidSync(), 0 + // if mid sync isn't implemented for the emulation module in use. + + // Number of cycles that this frame consumed, using MDFNGI::MasterClock as a time base. + // Set by emulation code. + int64 MasterCycles; + int64 MasterCyclesALMS; // MasterCycles value at last MidSync(), 0 + // if mid sync isn't implemented for the emulation module in use. + + // Current sound volume(0.000...<=volume<=1.000...). If, after calling Emulate(), it is still != 1, Mednafen will handle it internally. + // Emulation modules can handle volume themselves if they like, for speed reasons. If they do, afterwards, they should set its value to 1. + double SoundVolume; + + // Current sound speed multiplier. Set by the driver code. If, after calling Emulate(), it is still != 1, Mednafen will handle it internally + // by resampling the audio. This means that emulation modules can handle(and set the value to 1 after handling it) it if they want to get the most + // performance possible. HOWEVER, emulation modules must make sure the value is in a range(with minimum and maximum) that their code can handle + // before they try to handle it. + double soundmultiplier; + + // True if we want to rewind one frame. Set by the driver code. + bool NeedRewind; + + // Sound reversal during state rewinding is normally done in mednafen.cpp, but + // individual system emulation code can also do it if this is set, and clear it after it's done. + // (Also, the driver code shouldn't touch this variable) + bool NeedSoundReverse; + +} EmulateSpecStruct; + +typedef enum +{ + MODPRIO_INTERNAL_EXTRA_LOW = 0, // For "cdplay" module, mostly. + + MODPRIO_INTERNAL_LOW = 10, + MODPRIO_EXTERNAL_LOW = 20, + MODPRIO_INTERNAL_HIGH = 30, + MODPRIO_EXTERNAL_HIGH = 40 +} ModPrio; + +class CDIF; + +struct RMD_Media +{ + std::string Name; + unsigned MediaType; // Index into RMD_Layout::MediaTypes + std::vector Orientations; // The vector may be empty. +}; + +struct RMD_MediaType +{ + std::string Name; +}; + +struct RMD_State +{ + std::string Name; + + bool MediaPresent; + bool MediaUsable; // Usually the same as MediaPresent. + bool MediaCanChange; +}; + +struct RMD_Drive +{ + std::string Name; + + std::vector PossibleStates; // Ideally, only one state will have MediaPresent == true. + std::vector CompatibleMedia; // Indexes into RMD_Layout::MediaTypes + unsigned MediaMtoPDelay; // Recommended minimum delay, in milliseconds, between a MediaPresent == false state and a MediaPresent == true state; to be enforced + // by the media changing user interface. +}; + +struct RMD_Layout +{ + std::vector Drives; + std::vector MediaTypes; + std::vector Media; +}; + +struct CustomPalette_Spec +{ + const char* description; + const char* name_override; + + unsigned valid_entry_count[32]; // 0-terminated +}; + +typedef struct +{ + /* Private functions to Mednafen. Do not call directly + from the driver code, or else bad things shall happen. Maybe. Probably not, but don't + do it(yet)! + */ + // Short system name, lowercase a-z, 0-9, and _ are the only allowable characters! + const char *shortname; + + // Full system name. Preferably English letters, but can be UTF8 + const char *fullname; + + // Pointer to an array of FileExtensionSpecStruct, with the last entry being { NULL, NULL } to terminate the list. + // This list is used to make best-guess choices, when calling the TestMagic*() functions would be unreasonable, such + // as when scanning a ZIP archive for a file to load. The list may also be used in the future for GUI file open windows. + const FileExtensionSpecStruct *FileExtensions; + + ModPrio ModulePriority; + + #ifdef WANT_DEBUGGER + DebuggerInfoStruct *Debugger; + #else + void *Debugger; + #endif + const std::vector &PortInfo; + + // + // throws exception on fatal error. + // + // fp's stream position is guaranteed to be 0 when this function is called. + // + void (*Load)(MDFNFILE *fp); + + // + // Return true if the file is a recognized type, false if not. + // + // fp's stream position is guaranteed to be 0 when this function is called. + // + bool (*TestMagic)(MDFNFILE *fp); + + // + // (*CDInterfaces).size() is guaranteed to be >= 1. + void (*LoadCD)(std::vector *CDInterfaces); + bool (*TestMagicCD)(std::vector *CDInterfaces); + + // + // CloseGame() must only be called after a matching Load() or LoadCD() completes successfully. Calling it before Load*(), or after Load*() throws an exception or + // returns error status, may cause undesirable effects such as nonvolatile memory save game file corruption. + // + void (*CloseGame)(void); + + void (*SetLayerEnableMask)(uint64 mask); // Video + const char *LayerNames; + + void (*SetChanEnableMask)(uint64 mask); // Audio(TODO, placeholder) + const char *ChanNames; + + const CustomPalette_Spec* CPInfo; // Terminated by a { NULL, NULL } entry. Effective maximum of 64 possible custom palettes(due to CPInfoActiveBF). + uint64 CPInfoActiveBF; // 1 = 0, 2 = 1, 4 = 2, 8 = 3, etc. (to allow for future expansion for systems that might need + // multiple custom palette files, without having to go back and restructure this data). + + // + // InstallReadPatch and RemoveReadPatches should be non-NULL(even if only pointing to dummy functions) if the emulator module supports + // read-substitution and read-substitution-with-compare style(IE Game Genie-style) cheats. + // + // See also "SubCheats" global stuff in mempatcher.h. + // + void (*InstallReadPatch)(uint32 address, uint8 value, int compare); // Compare is >= 0 when utilized. + void (*RemoveReadPatches)(void); + uint8 (*MemRead)(uint32 addr); + + CheatFormatInfoStruct *CheatFormatInfo; + + bool SaveStateAltersState; // true for bsnes and some libco-style emulators, false otherwise. + + // Main save state routine, called by the save state code in state.cpp. + // When saving, load is set to 0. When loading, load is set to the version field of the save state being loaded. + // + // data_only is true when the save state data is temporary, such as being saved into memory for state rewinding. + // + // IMPORTANT: Game module save state code should avoid dynamically allocating memory and doing other things that can throw exceptions, unless + // it's done in a manner that ensures that the variable sanitizing code will run after the call to MDFNSS_StateAction(). + // + void (*StateAction)(StateMem *sm, const unsigned load, const bool data_only); + + void (*Emulate)(EmulateSpecStruct *espec); + void (*TransformInput)(void); // Called before Emulate, and within MDFN_MidSync(), to implement stuff like setting-controlled PC Engine SEL+RUN button exclusion in a way + // that won't cause desyncs with movies and netplay. + + void (*SetInput)(unsigned port, const char *type, uint8* data); + bool (*SetMedia)(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx); + + void (*DoSimpleCommand)(int cmd); + + const MDFNSetting *Settings; + + // Time base for EmulateSpecStruct::MasterCycles + // MasterClock must be >= MDFN_MASTERCLOCK_FIXED(1.0) + // All or part of the fractional component may be ignored in some timekeeping operations in the emulator to prevent integer overflow, + // so it is unwise to have a fractional component when the integral component is very small(less than say, 10000). + #define MDFN_MASTERCLOCK_FIXED(n) ((int64)((double)(n) * (1LL << 32))) + int64 MasterClock; + + // Nominal frames per second * 65536 * 256, truncated. + // May be deprecated in the future due to many systems having slight frame rate programmability. + uint32 fps; + + // multires is a hint that, if set, indicates that the system has fairly programmable video modes(particularly, the ability + // to display multiple horizontal resolutions, such as the PCE, PC-FX, or Genesis). In practice, it will cause the driver + // code to set the linear interpolation on by default. + // + // lcm_width and lcm_height are the least common multiples of all possible + // resolutions in the frame buffer as specified by DisplayRect/LineWidths(Ex for PCE: widths of 256, 341.333333, 512, + // lcm = 1024) + // + // nominal_width and nominal_height specify the resolution that Mednafen should display + // the framebuffer image in at 1x scaling, scaled from the dimensions of DisplayRect, and optionally the LineWidths array + // passed through espec to the Emulate() function. + // + bool multires; + + int lcm_width; + int lcm_height; + + void *dummy_separator; // + + int nominal_width; + int nominal_height; + + int fb_width; // Width of the framebuffer(not necessarily width of the image). MDFN_Surface width should be >= this. + int fb_height; // Height of the framebuffer passed to the Emulate() function(not necessarily height of the image) + + int soundchan; // Number of output sound channels. Only values of 1 and 2 are currently supported. + + + int rotated; + + char* name; /* Game name, UTF-8 encoding */ + uint8 MD5[16]; + uint8 GameSetMD5[16]; /* A unique ID for the game set this CD belongs to, only used in PC-FX emulation. */ + bool GameSetMD5Valid; /* True if GameSetMD5 is valid. */ + + VideoSystems VideoSystem; + GameMediumTypes GameType; // Deprecated. + + RMD_Layout* RMD; + + const char *cspecial; /* Special cart expansion: DIP switches, barcode reader, etc. */ + + std::vectorDesiredInput; // Desired input device for the input ports, NULL for don't care + + // For mouse relative motion. + double mouse_sensitivity; + + + // + // For absolute coordinates(IDIT_X_AXIS and IDIT_Y_AXIS), usually mapped to a mouse(hence the naming). + // + float mouse_scale_x, mouse_scale_y; + float mouse_offs_x, mouse_offs_y; +} MDFNGI; +#endif diff --git a/Mednafen/mednafen/hash/Makefile.am.inc b/Mednafen/mednafen/hash/Makefile.am.inc new file mode 100644 index 0000000000..e3f920da99 --- /dev/null +++ b/Mednafen/mednafen/hash/Makefile.am.inc @@ -0,0 +1 @@ +mednafen_SOURCES += hash/md5.cpp hash/sha1.cpp hash/sha256.cpp diff --git a/Mednafen/mednafen/hash/md5.cpp b/Mednafen/mednafen/hash/md5.cpp new file mode 100644 index 0000000000..8776b30e39 --- /dev/null +++ b/Mednafen/mednafen/hash/md5.cpp @@ -0,0 +1,260 @@ +/* + * RFC 1321 compliant MD5 implementation, + * by Christophe Devine ; + * this program is licensed under the GPL. + */ +/* Converted to C++ for use in Mednafen */ + +#include +#include +#include "md5.h" + +#define GET_UINT32(n,b,i) \ +{ \ + (n) = ( (uint32) (b)[(i) + 3] << 24 ) \ + | ( (uint32) (b)[(i) + 2] << 16 ) \ + | ( (uint32) (b)[(i) + 1] << 8 ) \ + | ( (uint32) (b)[(i) ] ); \ +} + +#define PUT_UINT32(n,b,i) \ +{ \ + (b)[(i) ] = (uint8) ( (n) ); \ + (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \ + (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \ + (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \ +} + +md5_context::md5_context(void) +{ + + +} + +md5_context::~md5_context(void) +{ + +} + +void md5_context::starts(void) +{ + total[0] = 0; + total[1] = 0; + state[0] = 0x67452301; + state[1] = 0xEFCDAB89; + state[2] = 0x98BADCFE; + state[3] = 0x10325476; +} + +void md5_context::process(const uint8 data[64]) +{ + uint32 A, B, C, D, X[16]; + + GET_UINT32( X[0], data, 0 ); + GET_UINT32( X[1], data, 4 ); + GET_UINT32( X[2], data, 8 ); + GET_UINT32( X[3], data, 12 ); + GET_UINT32( X[4], data, 16 ); + GET_UINT32( X[5], data, 20 ); + GET_UINT32( X[6], data, 24 ); + GET_UINT32( X[7], data, 28 ); + GET_UINT32( X[8], data, 32 ); + GET_UINT32( X[9], data, 36 ); + GET_UINT32( X[10], data, 40 ); + GET_UINT32( X[11], data, 44 ); + GET_UINT32( X[12], data, 48 ); + GET_UINT32( X[13], data, 52 ); + GET_UINT32( X[14], data, 56 ); + GET_UINT32( X[15], data, 60 ); + +#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) + +#define P(a,b,c,d,k,s,t) \ +{ \ + a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ +} + + A = state[0]; + B = state[1]; + C = state[2]; + D = state[3]; + +#define F(x,y,z) (z ^ (x & (y ^ z))) + + P( A, B, C, D, 0, 7, 0xD76AA478 ); + P( D, A, B, C, 1, 12, 0xE8C7B756 ); + P( C, D, A, B, 2, 17, 0x242070DB ); + P( B, C, D, A, 3, 22, 0xC1BDCEEE ); + P( A, B, C, D, 4, 7, 0xF57C0FAF ); + P( D, A, B, C, 5, 12, 0x4787C62A ); + P( C, D, A, B, 6, 17, 0xA8304613 ); + P( B, C, D, A, 7, 22, 0xFD469501 ); + P( A, B, C, D, 8, 7, 0x698098D8 ); + P( D, A, B, C, 9, 12, 0x8B44F7AF ); + P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); + P( B, C, D, A, 11, 22, 0x895CD7BE ); + P( A, B, C, D, 12, 7, 0x6B901122 ); + P( D, A, B, C, 13, 12, 0xFD987193 ); + P( C, D, A, B, 14, 17, 0xA679438E ); + P( B, C, D, A, 15, 22, 0x49B40821 ); + +#undef F + +#define F(x,y,z) (y ^ (z & (x ^ y))) + + P( A, B, C, D, 1, 5, 0xF61E2562 ); + P( D, A, B, C, 6, 9, 0xC040B340 ); + P( C, D, A, B, 11, 14, 0x265E5A51 ); + P( B, C, D, A, 0, 20, 0xE9B6C7AA ); + P( A, B, C, D, 5, 5, 0xD62F105D ); + P( D, A, B, C, 10, 9, 0x02441453 ); + P( C, D, A, B, 15, 14, 0xD8A1E681 ); + P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); + P( A, B, C, D, 9, 5, 0x21E1CDE6 ); + P( D, A, B, C, 14, 9, 0xC33707D6 ); + P( C, D, A, B, 3, 14, 0xF4D50D87 ); + P( B, C, D, A, 8, 20, 0x455A14ED ); + P( A, B, C, D, 13, 5, 0xA9E3E905 ); + P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); + P( C, D, A, B, 7, 14, 0x676F02D9 ); + P( B, C, D, A, 12, 20, 0x8D2A4C8A ); + +#undef F + +#define F(x,y,z) (x ^ y ^ z) + + P( A, B, C, D, 5, 4, 0xFFFA3942 ); + P( D, A, B, C, 8, 11, 0x8771F681 ); + P( C, D, A, B, 11, 16, 0x6D9D6122 ); + P( B, C, D, A, 14, 23, 0xFDE5380C ); + P( A, B, C, D, 1, 4, 0xA4BEEA44 ); + P( D, A, B, C, 4, 11, 0x4BDECFA9 ); + P( C, D, A, B, 7, 16, 0xF6BB4B60 ); + P( B, C, D, A, 10, 23, 0xBEBFBC70 ); + P( A, B, C, D, 13, 4, 0x289B7EC6 ); + P( D, A, B, C, 0, 11, 0xEAA127FA ); + P( C, D, A, B, 3, 16, 0xD4EF3085 ); + P( B, C, D, A, 6, 23, 0x04881D05 ); + P( A, B, C, D, 9, 4, 0xD9D4D039 ); + P( D, A, B, C, 12, 11, 0xE6DB99E5 ); + P( C, D, A, B, 15, 16, 0x1FA27CF8 ); + P( B, C, D, A, 2, 23, 0xC4AC5665 ); + +#undef F + +#define F(x,y,z) (y ^ (x | ~z)) + + P( A, B, C, D, 0, 6, 0xF4292244 ); + P( D, A, B, C, 7, 10, 0x432AFF97 ); + P( C, D, A, B, 14, 15, 0xAB9423A7 ); + P( B, C, D, A, 5, 21, 0xFC93A039 ); + P( A, B, C, D, 12, 6, 0x655B59C3 ); + P( D, A, B, C, 3, 10, 0x8F0CCC92 ); + P( C, D, A, B, 10, 15, 0xFFEFF47D ); + P( B, C, D, A, 1, 21, 0x85845DD1 ); + P( A, B, C, D, 8, 6, 0x6FA87E4F ); + P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); + P( C, D, A, B, 6, 15, 0xA3014314 ); + P( B, C, D, A, 13, 21, 0x4E0811A1 ); + P( A, B, C, D, 4, 6, 0xF7537E82 ); + P( D, A, B, C, 11, 10, 0xBD3AF235 ); + P( C, D, A, B, 2, 15, 0x2AD7D2BB ); + P( B, C, D, A, 9, 21, 0xEB86D391 ); + +#undef F + + state[0] += A; + state[1] += B; + state[2] += C; + state[3] += D; +} + +void md5_context::update(const uint8 *input, uint32 length ) +{ + uint32 left, fill; + + if( ! length ) return; + + left = ( total[0] >> 3 ) & 0x3F; + fill = 64 - left; + + total[0] += length << 3; + total[1] += length >> 29; + + total[0] &= 0xFFFFFFFF; + total[1] += total[0] < ( length << 3 ); + + if( left && length >= fill ) + { + memcpy( (void *) (buffer + left), (void *) input, fill ); + process(buffer ); + length -= fill; + input += fill; + left = 0; + } + + while( length >= 64 ) + { + process(input ); + length -= 64; + input += 64; + } + + if( length ) + { + memcpy( (void *) (buffer + left), (void *) input, length ); + } +} + +static const uint8 md5_padding[64] = +{ + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void md5_context::finish(uint8 digest[16] ) +{ + uint32 last, padn; + uint8 msglen[8]; + + PUT_UINT32( total[0], msglen, 0 ); + PUT_UINT32( total[1], msglen, 4 ); + + last = ( total[0] >> 3 ) & 0x3F; + padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); + + update( md5_padding, padn ); + update( msglen, 8 ); + + PUT_UINT32( state[0], digest, 0 ); + PUT_UINT32( state[1], digest, 4 ); + PUT_UINT32( state[2], digest, 8 ); + PUT_UINT32( state[3], digest, 12 ); +} + + +/* Uses a static buffer, so beware of how it's used. */ +//static +std::string md5_context::asciistr(const uint8 digest[16], bool borked_order) +{ + static char str[33]; + static char trans[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; + int x; + + for(x=0;x<16;x++) + { + if(borked_order) + { + str[x*2]=trans[digest[x]&0x0F]; + str[x*2+1]=trans[digest[x]>>4]; + } + else + { + str[x*2+1]=trans[digest[x]&0x0F]; + str[x*2]=trans[digest[x]>>4]; + } + } + return(std::string(str)); +} diff --git a/Mednafen/mednafen/hash/md5.h b/Mednafen/mednafen/hash/md5.h new file mode 100644 index 0000000000..2dd0337249 --- /dev/null +++ b/Mednafen/mednafen/hash/md5.h @@ -0,0 +1,41 @@ +#ifndef _MD5_H +#define _MD5_H + +#include + +class md5_context +{ + public: + md5_context(void); + ~md5_context(void); + + static std::string asciistr(const uint8 digest[16], bool borked_order); + std::string asciistr(void); + void starts(void); + void update(const uint8 *input, uint32 length); + inline void update_u32_as_lsb(const uint32 input) + { + uint8 buf[4]; + + buf[0] = input >> 0; + buf[1] = input >> 8; + buf[2] = input >> 16; + buf[3] = input >> 24; + + update(buf, 4); + } + + inline void update_string(const char *string) + { + update((const uint8 *)string, strlen(string)); + } + void finish(uint8 digest[16]); + + private: + void process(const uint8 data[64]); + uint32 total[2]; + uint32 state[4]; + uint8 buffer[64]; +}; + +#endif /* md5.h */ diff --git a/Mednafen/mednafen/hash/sha1.cpp b/Mednafen/mednafen/hash/sha1.cpp new file mode 100644 index 0000000000..223192d8ab --- /dev/null +++ b/Mednafen/mednafen/hash/sha1.cpp @@ -0,0 +1,173 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include "sha1.h" + +#include +#include + +template +static INLINE uint32 rotl(uint32 val) +{ + return (val << n) | (val >> (32 - n)); +} + +#if 0 +static INLINE uint32 ch(const uint32 x, const uint32 y, const uint32 z) +{ + return (x & y) ^ ((~x) & z); +} + +static INLINE uint32 par(const uint32 x, const uint32 y, const uint32 z) +{ + return x ^ y ^ z; +} + +static INLINE uint32 maj(const uint32 x, const uint32 y, const uint32 z) +{ + return (x & y) ^ (x & z) ^ (y & z); +} +#endif + +template +static INLINE uint32 f(uint32 x, uint32 y, uint32 z) +{ + switch(bt) + { + case 0: + return (x & y) ^ ((~x) & z); + + case 1: + return x ^ y ^ z; + + case 2: + return (x & y) ^ (x & z) ^ (y & z); + + case 3: + return x ^ y ^ z; + } +} + +template +static INLINE void block_sub(uint32 v[5], uint32 w[80]) +{ + static const uint32 K[4] = { 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 }; + uint32* bw = &w[bt * 20]; + const uint32 Kt = K[bt]; + + for(unsigned st = 0; st < 20; st++) + { + uint32 T = rotl<5>(v[0]) + f(v[1], v[2], v[3]) + v[4] + Kt + bw[st]; + + v[4] = v[3]; + v[3] = v[2]; + v[2] = rotl<30>(v[1]); + v[1] = v[0]; + v[0] = T; + } +} + +static INLINE void block(uint32 h[5], void* blk_data) +{ + alignas(16) uint32 w[80]; + uint32 v[5]; + + for(unsigned t = 0; t < 16; t++) + w[t] = MDFN_de32msb((uint8*)blk_data + (t << 2)); + + for(unsigned t = 16; t < 80; t++) + w[t] = rotl<1>(w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]); + + memcpy(v, h, sizeof(v)); + + block_sub<0>(v, w); + block_sub<1>(v, w); + block_sub<2>(v, w); + block_sub<3>(v, w); + + for(unsigned i = 0; i < 5; i++) + h[i] += v[i]; +} + +sha1_digest sha1(const void* data, const uint64 len) +{ + sha1_digest ret; + uint32 h[5] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 }; + uint8* p = (uint8*)data; + uint64 dc = len; + + while(dc >= 64) + { + block(h, p); + + p += 64; + dc -= 64; + } + + { + alignas(16) uint8 tmp[128]; + + memcpy(tmp, p, dc); + memset(tmp + dc, 0, 128 - dc); + tmp[dc] |= 0x80; + + dc = ((dc + 8) &~ 63) + 56; + + MDFN_en64msb(&tmp[dc], len * 8); + + block(h, tmp); + if(dc >= 64) + block(h, tmp + 64); + } + + for(unsigned i = 0; i < 5; i++) + MDFN_en32msb(&ret[i * 4], h[i]); + + //printf("%08x %08x %08x %08x %08x\n", h[0], h[1], h[2], h[3], h[4]); + + return ret; +} + +#include +void sha1_test(void) +{ + char tv[256]; + + for(unsigned i = 0; i < 256; i++) + tv[i] = i * 3; + + static const sha1_digest expected[6] = + { + "e119a863bce69ad1b6ca1a51e94994531d122088"_sha1, + "fd62c272e1f0f24b92a0ec8360519cd64d6ab986"_sha1, + "010b0113d06cffb80f2beb657ef39682e5e7de79"_sha1, + "adf8998c4791fc378fa6d8b23666934522546778"_sha1, + "787680a25bf74f34c22b2c37d7d5bae2feceb20c"_sha1, + "079b9ef0684bd9a600b9a23caa4297d064ce076e"_sha1 + }; + + assert(sha1(tv, 55) == expected[0]); + assert(sha1(tv, 56) == expected[1]); + assert(sha1(tv, 57) == expected[2]); + assert(sha1(tv, 63) == expected[3]); + assert(sha1(tv, 64) == expected[4]); + assert(sha1(tv, 65) == expected[5]); +} + diff --git a/Mednafen/mednafen/hash/sha1.h b/Mednafen/mednafen/hash/sha1.h new file mode 100644 index 0000000000..a1d80a9584 --- /dev/null +++ b/Mednafen/mednafen/hash/sha1.h @@ -0,0 +1,57 @@ +#ifndef __MDFN_SHA1_H +#define __MDFN_SHA1_H + +#include +#include + +typedef std::array sha1_digest; + +#if 0 +class sha1_context +{ + public: + sha1_context(); + + void update(const void* data, const uint64 len); + + sha1_digest finish(void); + + private: +}; + +static INLINE sha1_digest sha1(const void* data, const uint64 len) +{ + sha1_context ctx; + + ctx.update(data, len); + + return ctx.finish(); +} +#endif + +void sha1_test(void); +sha1_digest sha1(const void* data, const uint64 len); + +static INLINE constexpr uint8 sha1_cton(char c) +{ + return ((c >= 'A' && c <= 'F') ? c - 'A' + 0xa : ((c >= 'a' && c <= 'f') ? c - 'a' + 0xa : c - '0')); +}; + +static INLINE constexpr uint8 sha1_cton2(char c, char d) +{ + return (sha1_cton(c) << 4) | (sha1_cton(d) << 0); +}; + +static INLINE constexpr sha1_digest operator "" _sha1(const char *s, std::size_t sz) +{ + //static_assert(sz == 41, "Malformed SHA-1 string."); + return /*(sz == 41 ? (void)0 : abort()),*/ sha1_digest({{ sha1_cton2(s[0], s[1]), sha1_cton2(s[2], s[3]), sha1_cton2(s[4], s[5]), sha1_cton2(s[6], s[7]), + sha1_cton2(s[8], s[9]), sha1_cton2(s[10], s[11]), sha1_cton2(s[12], s[13]), sha1_cton2(s[14], s[15]), + sha1_cton2(s[16], s[17]), sha1_cton2(s[18], s[19]), sha1_cton2(s[20], s[21]), sha1_cton2(s[22], s[23]), + sha1_cton2(s[24], s[25]), sha1_cton2(s[26], s[27]), sha1_cton2(s[28], s[29]), sha1_cton2(s[30], s[31]), + sha1_cton2(s[32], s[33]), sha1_cton2(s[34], s[35]), sha1_cton2(s[36], s[37]), sha1_cton2(s[38], s[39]) + }}); +} + + +#endif diff --git a/Mednafen/mednafen/hash/sha256.cpp b/Mednafen/mednafen/hash/sha256.cpp new file mode 100644 index 0000000000..b30561b2f7 --- /dev/null +++ b/Mednafen/mednafen/hash/sha256.cpp @@ -0,0 +1,183 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include + +#include "sha256.h" + +#include +#include + +static const uint32 K[64] = +{ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +template +static INLINE uint32 rotr(const uint32 val) +{ + return (val >> n) | (val << (32 - n)); +} + +static INLINE uint32 ch(const uint32 x, const uint32 y, const uint32 z) +{ + return (x & y) ^ ((~x) & z); +} + +static INLINE uint32 maj(const uint32 x, const uint32 y, const uint32 z) +{ + return (x & y) ^ (x & z) ^ (y & z); +} + +static INLINE uint32 bs0(const uint32 x) +{ + return rotr<2>(x) ^ rotr<13>(x) ^ rotr<22>(x); +} + +static INLINE uint32 bs1(const uint32 x) +{ + return rotr<6>(x) ^ rotr<11>(x) ^ rotr<25>(x); +} + +static INLINE uint32 ls0(const uint32 x) +{ + return rotr<7>(x) ^ rotr<18>(x) ^ (x >> 3); +} + +static INLINE uint32 ls1(const uint32 x) +{ + return rotr<17>(x) ^ rotr<19>(x) ^ (x >> 10); +} + +static INLINE void block(std::array &h, void* blk_data) +{ + alignas(16) uint32 w[64]; + alignas(16) auto v = h; + + for(unsigned t = 0; t < 16; t++) + w[t] = MDFN_de32msb((uint8*)blk_data + (t << 2)); + + for(unsigned t = 16; t < 64; t++) + w[t] = ls1(w[t - 2]) + w[t - 7] + ls0(w[t - 15]) + w[t - 16]; + + for(unsigned t = 0; t < 64; t++) + { + uint32 T1 = v[7] + bs1(v[4]) + ch(v[4], v[5], v[6]) + K[t] + w[t]; + uint32 T2 = bs0(v[0]) + maj(v[0], v[1], v[2]); + + v[7] = v[6]; + v[6] = v[5]; + v[5] = v[4]; + v[4] = v[3] + T1; + v[3] = v[2]; + v[2] = v[1]; + v[1] = v[0]; + v[0] = T1 + T2; + } + + for(unsigned i = 0; i < h.size(); i++) + h[i] += v[i]; +} + +sha256_digest sha256(const void* data, const uint64 len) +{ + sha256_digest ret; + alignas(16) std::array h({{ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }}); + uint8* p = (uint8*)data; + uint64 dc = len; + + while(MDFN_LIKELY(dc >= 64)) + { + block(h, p); + + p += 64; + dc -= 64; + } + + { + alignas(16) uint8 tmp[128]; + + memcpy(tmp, p, dc); + memset(tmp + dc, 0, 128 - dc); + tmp[dc] |= 0x80; + + dc = ((dc + 8) &~ 63) + 56; + + MDFN_en64msb(&tmp[dc], len * 8); + + block(h, tmp); + if(dc >= 64) + block(h, tmp + 64); + } + + for(unsigned i = 0; i < 8; i++) + MDFN_en32msb(&ret[i * 4], h[i]); + + //printf("%08x %08x %08x %08x %08x %08x %08x %08x\n", h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]); + + return ret; +} + +//sha256_digest goomba = "dccac470d07efd7f989c1f9a5045bc2cfe446622dbb50d4ad7f53996e574cd29"_sha256; +#include +void sha256_test(void) +{ + char tv[256]; + + for(unsigned i = 0; i < 256; i++) + tv[i] = i * 3; + +#if 0 + void *bmt = malloc(1024 * 1024 * 512); + + memset(bmt, 0, 1024 * 1024 * 512); + + uint32 st = MDFND_GetTime(); + + sha256(bmt, 1024 * 1024 * 512); + printf("%f\n", (double)1024 * 1024 * 512 * 1000 / (MDFND_GetTime() - st) / 1000 / 1000); + + abort(); +#endif + + static const sha256_digest expected[6] = + { + "16f868c5d6f278b54eacc307c56c0cd6ece81bb3784a531f0d6d75d4200c6fe6"_sha256, + "4ccac470d07efd7f989c1f9a5045bc2cfe446622dbb50d4ad7f53996e574cd29"_sha256, + "a9d56e4e0d999c82ac86ce58b6b711e95e40eaddceb3bbc2ee0dc213236d7056"_sha256, + "ab14676d2f0ce3b7cec24dfcab775b124f2c95dd42bea4fe6a7c7158f4c1788e"_sha256, + "1a0e0ecf84382961a85aa8629e98aefcfeffdcf0fd74a6dd49d55d9706477ab2"_sha256, + "fd833d1be324b92272bc7c17a0ee9cad152cae24c622082f912e4552afe6bdbd"_sha256 + }; + + assert(sha256(tv, 55) == expected[0]); + assert(sha256(tv, 56) == expected[1]); + assert(sha256(tv, 57) == expected[2]); + assert(sha256(tv, 63) == expected[3]); + assert(sha256(tv, 64) == expected[4]); + assert(sha256(tv, 65) == expected[5]); + +} + diff --git a/Mednafen/mednafen/hash/sha256.h b/Mednafen/mednafen/hash/sha256.h new file mode 100644 index 0000000000..a6fbe14420 --- /dev/null +++ b/Mednafen/mednafen/hash/sha256.h @@ -0,0 +1,36 @@ +#ifndef __MDFN_SHA256_H +#define __MDFN_SHA256_H + +#include + +typedef std::array sha256_digest; + +void sha256_test(void); +sha256_digest sha256(const void* data, const uint64 len); + +static INLINE constexpr uint8 sha256_cton(char c) +{ + return ((c >= 'A' && c <= 'F') ? c - 'A' + 0xa : ((c >= 'a' && c <= 'f') ? c - 'a' + 0xa : c - '0')); +}; + +static INLINE constexpr uint8 sha256_cton2(char c, char d) +{ + return (sha256_cton(c) << 4) | (sha256_cton(d) << 0); +}; + +static INLINE constexpr sha256_digest operator "" _sha256(const char *s, std::size_t sz) +{ + //static_assert(sz == 65, "Malformed SHA-256 string."); + return /*(sz == 65 ? (void)0 : abort()),*/ sha256_digest({{ sha256_cton2(s[0], s[1]), sha256_cton2(s[2], s[3]), sha256_cton2(s[4], s[5]), sha256_cton2(s[6], s[7]), + sha256_cton2(s[8], s[9]), sha256_cton2(s[10], s[11]), sha256_cton2(s[12], s[13]), sha256_cton2(s[14], s[15]), + sha256_cton2(s[16], s[17]), sha256_cton2(s[18], s[19]), sha256_cton2(s[20], s[21]), sha256_cton2(s[22], s[23]), + sha256_cton2(s[24], s[25]), sha256_cton2(s[26], s[27]), sha256_cton2(s[28], s[29]), sha256_cton2(s[30], s[31]), + sha256_cton2(s[32], s[33]), sha256_cton2(s[34], s[35]), sha256_cton2(s[36], s[37]), sha256_cton2(s[38], s[39]), + sha256_cton2(s[40], s[41]), sha256_cton2(s[42], s[43]), sha256_cton2(s[44], s[45]), sha256_cton2(s[46], s[47]), + sha256_cton2(s[48], s[49]), sha256_cton2(s[50], s[51]), sha256_cton2(s[52], s[53]), sha256_cton2(s[54], s[55]), + sha256_cton2(s[56], s[57]), sha256_cton2(s[58], s[59]), sha256_cton2(s[60], s[61]), sha256_cton2(s[62], s[63]), } + }); +} + + +#endif diff --git a/Mednafen/mednafen/hw_cpu/Makefile.am b/Mednafen/mednafen/hw_cpu/Makefile.am new file mode 100644 index 0000000000..85413b9c1f --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/Makefile.am @@ -0,0 +1,38 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnhwcpu.a + +libmdfnhwcpu_a_SOURCES = + +if NEED_68K_EMU +if !CROSS_COMPILING +noinst_PROGRAMS = gen68k$(EXEEXT) +gen68k_SOURCES = c68k/gen68k.cpp +gen68k_CFLAGS = -DC68K_GEN +gen68k_LDFLAGS = -DC68K_GEN +gen68k_LDADD = @LIBINTL@ @LIBICONV@ +nodist_pkgdata_DATA = c68k/c68k_op0.inc +c68k/c68k_op0.inc: gen68k$(EXEEXT) + cd c68k && ../gen68k$(EXEEXT) +endif + +libmdfnhwcpu_a_SOURCES += c68k/c68kexec.cpp c68k/c68k.cpp +endif + +if NEED_Z80_EMU +libmdfnhwcpu_a_SOURCES += z80-fuse/z80.cpp z80-fuse/z80_ops.cpp +endif + +if NEED_V810_EMU +libmdfnhwcpu_a_SOURCES += v810/v810_cpu.cpp v810/v810_cpuD.cpp v810/v810_fp_ops.cpp +endif + +if NEED_HUC6280_EMU +libmdfnhwcpu_a_SOURCES += huc6280/huc6280.cpp + +if WANT_DEBUGGER +libmdfnhwcpu_a_SOURCES += huc6280/dis6280.cpp +endif +endif diff --git a/Mednafen/mednafen/hw_cpu/Makefile.in b/Mednafen/mednafen/hw_cpu/Makefile.in new file mode 100644 index 0000000000..fe501232ec --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/Makefile.in @@ -0,0 +1,849 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@NEED_68K_EMU_TRUE@am__append_1 = c68k/c68kexec.cpp c68k/c68k.cpp +@NEED_Z80_EMU_TRUE@am__append_2 = z80-fuse/z80.cpp z80-fuse/z80_ops.cpp +@NEED_V810_EMU_TRUE@am__append_3 = v810/v810_cpu.cpp v810/v810_cpuD.cpp v810/v810_fp_ops.cpp +@NEED_HUC6280_EMU_TRUE@am__append_4 = huc6280/huc6280.cpp +@NEED_HUC6280_EMU_TRUE@@WANT_DEBUGGER_TRUE@am__append_5 = huc6280/dis6280.cpp +subdir = src/hw_cpu +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnhwcpu_a_AR = $(AR) $(ARFLAGS) +libmdfnhwcpu_a_LIBADD = +am__libmdfnhwcpu_a_SOURCES_DIST = c68k/c68kexec.cpp c68k/c68k.cpp \ + z80-fuse/z80.cpp z80-fuse/z80_ops.cpp v810/v810_cpu.cpp \ + v810/v810_cpuD.cpp v810/v810_fp_ops.cpp huc6280/huc6280.cpp \ + huc6280/dis6280.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@NEED_68K_EMU_TRUE@am__objects_1 = c68k/c68kexec.$(OBJEXT) \ +@NEED_68K_EMU_TRUE@ c68k/c68k.$(OBJEXT) +@NEED_Z80_EMU_TRUE@am__objects_2 = z80-fuse/z80.$(OBJEXT) \ +@NEED_Z80_EMU_TRUE@ z80-fuse/z80_ops.$(OBJEXT) +@NEED_V810_EMU_TRUE@am__objects_3 = v810/v810_cpu.$(OBJEXT) \ +@NEED_V810_EMU_TRUE@ v810/v810_cpuD.$(OBJEXT) \ +@NEED_V810_EMU_TRUE@ v810/v810_fp_ops.$(OBJEXT) +@NEED_HUC6280_EMU_TRUE@am__objects_4 = huc6280/huc6280.$(OBJEXT) +@NEED_HUC6280_EMU_TRUE@@WANT_DEBUGGER_TRUE@am__objects_5 = huc6280/dis6280.$(OBJEXT) +am_libmdfnhwcpu_a_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) +libmdfnhwcpu_a_OBJECTS = $(am_libmdfnhwcpu_a_OBJECTS) +PROGRAMS = $(noinst_PROGRAMS) +am__gen68k_SOURCES_DIST = c68k/gen68k.cpp +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@am_gen68k_OBJECTS = c68k/gen68k.$(OBJEXT) +gen68k_OBJECTS = $(am_gen68k_OBJECTS) +gen68k_DEPENDENCIES = +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +gen68k_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(gen68k_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfnhwcpu_a_SOURCES) $(gen68k_SOURCES) +DIST_SOURCES = $(am__libmdfnhwcpu_a_SOURCES_DIST) \ + $(am__gen68k_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(pkgdatadir)" +DATA = $(nodist_pkgdata_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnhwcpu.a +libmdfnhwcpu_a_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@noinst_PROGRAMS = gen68k$(EXEEXT) +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@gen68k_SOURCES = c68k/gen68k.cpp +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@gen68k_CFLAGS = -DC68K_GEN +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@gen68k_LDFLAGS = -DC68K_GEN +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@gen68k_LDADD = @LIBINTL@ @LIBICONV@ +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@nodist_pkgdata_DATA = c68k/c68k_op0.inc +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/hw_cpu/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/hw_cpu/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +c68k/$(am__dirstamp): + @$(MKDIR_P) c68k + @: > c68k/$(am__dirstamp) +c68k/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) c68k/$(DEPDIR) + @: > c68k/$(DEPDIR)/$(am__dirstamp) +c68k/c68kexec.$(OBJEXT): c68k/$(am__dirstamp) \ + c68k/$(DEPDIR)/$(am__dirstamp) +c68k/c68k.$(OBJEXT): c68k/$(am__dirstamp) \ + c68k/$(DEPDIR)/$(am__dirstamp) +z80-fuse/$(am__dirstamp): + @$(MKDIR_P) z80-fuse + @: > z80-fuse/$(am__dirstamp) +z80-fuse/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) z80-fuse/$(DEPDIR) + @: > z80-fuse/$(DEPDIR)/$(am__dirstamp) +z80-fuse/z80.$(OBJEXT): z80-fuse/$(am__dirstamp) \ + z80-fuse/$(DEPDIR)/$(am__dirstamp) +z80-fuse/z80_ops.$(OBJEXT): z80-fuse/$(am__dirstamp) \ + z80-fuse/$(DEPDIR)/$(am__dirstamp) +v810/$(am__dirstamp): + @$(MKDIR_P) v810 + @: > v810/$(am__dirstamp) +v810/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) v810/$(DEPDIR) + @: > v810/$(DEPDIR)/$(am__dirstamp) +v810/v810_cpu.$(OBJEXT): v810/$(am__dirstamp) \ + v810/$(DEPDIR)/$(am__dirstamp) +v810/v810_cpuD.$(OBJEXT): v810/$(am__dirstamp) \ + v810/$(DEPDIR)/$(am__dirstamp) +v810/v810_fp_ops.$(OBJEXT): v810/$(am__dirstamp) \ + v810/$(DEPDIR)/$(am__dirstamp) +huc6280/$(am__dirstamp): + @$(MKDIR_P) huc6280 + @: > huc6280/$(am__dirstamp) +huc6280/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) huc6280/$(DEPDIR) + @: > huc6280/$(DEPDIR)/$(am__dirstamp) +huc6280/huc6280.$(OBJEXT): huc6280/$(am__dirstamp) \ + huc6280/$(DEPDIR)/$(am__dirstamp) +huc6280/dis6280.$(OBJEXT): huc6280/$(am__dirstamp) \ + huc6280/$(DEPDIR)/$(am__dirstamp) + +libmdfnhwcpu.a: $(libmdfnhwcpu_a_OBJECTS) $(libmdfnhwcpu_a_DEPENDENCIES) $(EXTRA_libmdfnhwcpu_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnhwcpu.a + $(AM_V_AR)$(libmdfnhwcpu_a_AR) libmdfnhwcpu.a $(libmdfnhwcpu_a_OBJECTS) $(libmdfnhwcpu_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnhwcpu.a + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +c68k/gen68k.$(OBJEXT): c68k/$(am__dirstamp) \ + c68k/$(DEPDIR)/$(am__dirstamp) + +gen68k$(EXEEXT): $(gen68k_OBJECTS) $(gen68k_DEPENDENCIES) $(EXTRA_gen68k_DEPENDENCIES) + @rm -f gen68k$(EXEEXT) + $(AM_V_CXXLD)$(gen68k_LINK) $(gen68k_OBJECTS) $(gen68k_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f c68k/*.$(OBJEXT) + -rm -f huc6280/*.$(OBJEXT) + -rm -f v810/*.$(OBJEXT) + -rm -f z80-fuse/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@c68k/$(DEPDIR)/c68k.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@c68k/$(DEPDIR)/c68kexec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@c68k/$(DEPDIR)/gen68k.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@huc6280/$(DEPDIR)/dis6280.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@huc6280/$(DEPDIR)/huc6280.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@v810/$(DEPDIR)/v810_cpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@v810/$(DEPDIR)/v810_cpuD.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@v810/$(DEPDIR)/v810_fp_ops.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@z80-fuse/$(DEPDIR)/z80.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@z80-fuse/$(DEPDIR)/z80_ops.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-nodist_pkgdataDATA: $(nodist_pkgdata_DATA) + @$(NORMAL_INSTALL) + @list='$(nodist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ + done + +uninstall-nodist_pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(nodist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(DATA) +installdirs: + for dir in "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f c68k/$(DEPDIR)/$(am__dirstamp) + -rm -f c68k/$(am__dirstamp) + -rm -f huc6280/$(DEPDIR)/$(am__dirstamp) + -rm -f huc6280/$(am__dirstamp) + -rm -f v810/$(DEPDIR)/$(am__dirstamp) + -rm -f v810/$(am__dirstamp) + -rm -f z80-fuse/$(DEPDIR)/$(am__dirstamp) + -rm -f z80-fuse/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf c68k/$(DEPDIR) huc6280/$(DEPDIR) v810/$(DEPDIR) z80-fuse/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-nodist_pkgdataDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf c68k/$(DEPDIR) huc6280/$(DEPDIR) v810/$(DEPDIR) z80-fuse/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-nodist_pkgdataDATA + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man \ + install-nodist_pkgdataDATA install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am \ + uninstall-nodist_pkgdataDATA + +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@c68k/c68k_op0.inc: gen68k$(EXEEXT) +@CROSS_COMPILING_FALSE@@NEED_68K_EMU_TRUE@ cd c68k && ../gen68k$(EXEEXT) + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k.cpp b/Mednafen/mednafen/hw_cpu/c68k/c68k.cpp new file mode 100644 index 0000000000..cbb000b5cd --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k.cpp @@ -0,0 +1,310 @@ +/* Copyright 2003-2004 Stephane Dallongeville + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/********************************************************************************* + * + * C68K (68000 CPU emulator) version 0.80 + * Compiled with Dev-C++ + * Copyright 2003-2004 Stephane Dallongeville + * + ********************************************************************************/ + +/* Modified heavily for usage in Mednafen: + + Made opcode fetches go through the external memory read function. + Added A-line and F-line emulation. + Added packed save state code. + Gutted the timing code. + Scrapped the goto table code. + Redid the C/X flag calculation on some 32-bit instructions. + + Other stuff I can't remember. + + If you want a more-or-less original version of C68k(which, in its original state, can be quite fast), + check out Yabause's code(though I think my A-line and F-line emulation improvements are in that tree now too). +*/ + +#include "c68k.h" + +// shared global variable +////////////////////////// + +c68k_struc C68K; + +// include macro file +////////////////////// + +#include "c68kmac.inc" + +// prototype +///////////// + +u8 C68K_FASTCALL C68k_Read8_Dummy(const u32 adr); +u16 C68K_FASTCALL C68k_Read16_Dummy(const u32 adr); +void C68K_FASTCALL C68k_Write8_Dummy(const u32 adr, u8 data); +void C68K_FASTCALL C68k_Write16_Dummy(const u32 adr, u16 data); + +static u32 C68k_Read_Long(c68k_struc *cpu, u32 adr); + +s32 C68K_FASTCALL C68k_Interrupt_Ack_Dummy(s32 level); +void C68K_FASTCALL C68k_Reset_Dummy(void); + +// core main functions +/////////////////////// + +void C68k_Init(c68k_struc *cpu, C68K_INT_CALLBACK *int_cb) +{ + memset(cpu, 0, sizeof(c68k_struc)); + + C68k_Set_ReadB(cpu, C68k_Read8_Dummy); + C68k_Set_ReadW(cpu, C68k_Read16_Dummy); + + C68k_Set_WriteB(cpu, C68k_Write8_Dummy); + C68k_Set_WriteW(cpu, C68k_Write16_Dummy); + + C68k_Set_TAS_Hack(cpu, 0); + + if (int_cb) cpu->Interrupt_CallBack = int_cb; + else cpu->Interrupt_CallBack = C68k_Interrupt_Ack_Dummy; + cpu->Reset_CallBack = C68k_Reset_Dummy; +} + +s32 C68K_FASTCALL C68k_Reset(c68k_struc *cpu) +{ + //memset(cpu, 0, (u32)(&(cpu->dirty1)) - (u32)(&(cpu->D[0]))); + memset(cpu, 0, ((u8 *)&(cpu->dirty1)) - ((u8 *)&(cpu->D[0]))); + + cpu->flag_I = 7; + cpu->flag_S = C68K_SR_S; + + cpu->A[7] = C68k_Read_Long(cpu, 0); + C68k_Set_PC(cpu, C68k_Read_Long(cpu, 4)); + + return cpu->Status; +} + +void C68k_Set_TAS_Hack(c68k_struc *cpu, int value) +{ + cpu->TAS_Hack = value ? 1 : 0; +} + +///////////////////////////////// + +void C68K_FASTCALL C68k_Set_IRQ(c68k_struc *cpu, s32 level) +{ + cpu->IRQLine = level; + //cpu->Status &= ~(C68K_HALTED | C68K_WAITING); +} + +// Read / Write dummy functions +//////////////////////////////// + +u8 C68K_FASTCALL C68k_Read8_Dummy(const u32 adr) +{ + return 0; +} + +u16 C68K_FASTCALL C68k_Read16_Dummy(const u32 adr) +{ + return 0; +} + +void C68K_FASTCALL C68k_Write8_Dummy(const u32 adr, u8 data) +{ + +} + +void C68K_FASTCALL C68k_Write16_Dummy(const u32 adr, u16 data) +{ + +} + +s32 C68K_FASTCALL C68k_Interrupt_Ack_Dummy(s32 level) +{ + // return vector + return (C68K_INTERRUPT_AUTOVECTOR_EX + level); +} + +void C68K_FASTCALL C68k_Reset_Dummy(void) +{ + +} + +// setting core functions +////////////////////////// + +void C68k_Set_ReadB(c68k_struc *cpu, C68K_READ8 *Func) +{ + cpu->Read_Byte = Func; +} + +void C68k_Set_ReadW(c68k_struc *cpu, C68K_READ16 *Func) +{ + cpu->Read_Word = Func; +} + +void C68k_Set_WriteB(c68k_struc *cpu, C68K_WRITE8 *Func) +{ + cpu->Write_Byte = Func; +} + +void C68k_Set_WriteW(c68k_struc *cpu, C68K_WRITE16 *Func) +{ + cpu->Write_Word = Func; +} + +// externals main functions +//////////////////////////// + +u32 C68k_Get_DReg(c68k_struc *cpu, u32 num) +{ + return cpu->D[num]; +} + +u32 C68k_Get_AReg(c68k_struc *cpu, u32 num) +{ + return cpu->A[num]; +} + +u32 C68k_Get_PC(c68k_struc *cpu) +{ + return (cpu->PC); +} + +u32 C68k_Get_SR(c68k_struc *cpu) +{ + c68k_struc *CPU = cpu; + return GET_SR; +} + +u32 C68k_Get_USP(c68k_struc *cpu) +{ + if (cpu->flag_S) return cpu->USP; + else return cpu->A[7]; +} + +u32 C68k_Get_MSP(c68k_struc *cpu) +{ + if (cpu->flag_S) return cpu->A[7]; + else return cpu->USP; +} + +void C68k_Set_DReg(c68k_struc *cpu, u32 num, u32 val) +{ + cpu->D[num] = val; +} + +void C68k_Set_AReg(c68k_struc *cpu, u32 num, u32 val) +{ + cpu->A[num] = val; +} + +void C68k_Set_PC(c68k_struc *cpu, u32 val) +{ + cpu->PC = val; +} + +void C68k_Set_SR(c68k_struc *cpu, u32 val) +{ + c68k_struc *CPU = cpu; + SET_SR(val); +} + +void C68k_Set_USP(c68k_struc *cpu, u32 val) +{ + if (cpu->flag_S) cpu->USP = val; + else cpu->A[7] = val; +} + +void C68k_Set_MSP(c68k_struc *cpu, u32 val) +{ + if (cpu->flag_S) cpu->A[7] = val; + else cpu->USP = val; +} + +#define PACK_U32(val) { u32 temp = (val); buffer[index++] = temp; buffer[index++] = temp >> 8; buffer[index++] = temp >> 16; buffer[index++] = temp >> 24; } +#define UNPACK_U32(target) { if(index >= length) goto BadBad; target = buffer[index] | (buffer[index + 1] << 8) | (buffer[index + 2] << 16) | (buffer[index + 3] << 24); index += 4; } + +void C68k_Save_State(c68k_struc *cpu, u8 *buffer) +{ + int index = 0; + int length = C68k_State_Max_Len; + int i; + + PACK_U32(0); //0xDEADBEEF); + + for(i = 0; i < 16; i++) + { + PACK_U32(cpu->DA[i]); + } + PACK_U32(cpu->flag_C); + PACK_U32(cpu->flag_V); + PACK_U32(cpu->flag_notZ); + PACK_U32(cpu->flag_N); + PACK_U32(cpu->flag_X); + PACK_U32(cpu->flag_I); + PACK_U32(cpu->flag_S); + + PACK_U32(cpu->USP); + PACK_U32(cpu->PC); + PACK_U32(cpu->Status); + PACK_U32(cpu->IRQLine); + + PACK_U32(0xDEADBEEF); + + //printf("Save: %d\n", index); +} + +void C68k_Load_State(c68k_struc *cpu, const u8 *buffer) +{ + int index = 0; + int length = C68k_State_Max_Len; + int version; + int i; + u32 footer_check; + + UNPACK_U32(version); + + for(i = 0; i < 16; i++) + { + UNPACK_U32(cpu->DA[i]); + } + UNPACK_U32(cpu->flag_C); + UNPACK_U32(cpu->flag_V); + UNPACK_U32(cpu->flag_notZ); + UNPACK_U32(cpu->flag_N); + UNPACK_U32(cpu->flag_X); + UNPACK_U32(cpu->flag_I); + UNPACK_U32(cpu->flag_S); + + UNPACK_U32(cpu->USP); + UNPACK_U32(cpu->PC); + UNPACK_U32(cpu->Status); + UNPACK_U32(cpu->IRQLine); + UNPACK_U32(footer_check); + + //printf("%08x\n", footer_check); + //printf("Load: %d\n", index); + + return; + BadBad: + puts("Very bad"); + + return; +} diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k.h b/Mednafen/mednafen/hw_cpu/c68k/c68k.h new file mode 100644 index 0000000000..dd183dda3e --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k.h @@ -0,0 +1,209 @@ +/* Copyright 2003-2004 Stephane Dallongeville + Copyright 2004 Theo Berkau + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/********************************************************************************* + * C68K.H : + * + * C68K include file + * + ********************************************************************************/ + +#ifndef _C68K_H_ +#define _C68K_H_ + +#include +#include + +#define C68K_FASTCALL + +typedef int64 s64; +typedef uint64 u64; + +typedef int32 s32; +typedef uint32 u32; + +typedef int16 s16; +typedef uint16 u16; + +typedef int8 s8; +typedef uint8 u8; + +// setting +/////////// + +#ifdef MSB_FIRST + #define BYTE_OFF 3 + #define WORD_OFF 1 +#else + #define BYTE_OFF 0 + #define WORD_OFF 0 +#endif + +// 68K core types definitions +////////////////////////////// + +#define C68K_ADR_BITS 24 + +#define C68K_SR_C_SFT 8 +#define C68K_SR_V_SFT 7 +#define C68K_SR_Z_SFT 0 +#define C68K_SR_N_SFT 7 +#define C68K_SR_X_SFT 8 + +#define C68K_SR_S_SFT 13 + +#define C68K_SR_C (1 << C68K_SR_C_SFT) +#define C68K_SR_V (1 << C68K_SR_V_SFT) +#define C68K_SR_Z 0 +#define C68K_SR_N (1 << C68K_SR_N_SFT) +#define C68K_SR_X (1 << C68K_SR_X_SFT) + +#define C68K_SR_S (1 << C68K_SR_S_SFT) + +#define C68K_CCR_MASK 0x1F +#define C68K_SR_MASK (0x2700 | C68K_CCR_MASK) + +// exception defines taken from musashi core +#define C68K_RESET_EX 1 +#define C68K_BUS_ERROR_EX 2 +#define C68K_ADDRESS_ERROR_EX 3 +#define C68K_ILLEGAL_INSTRUCTION_EX 4 +#define C68K_ZERO_DIVIDE_EX 5 +#define C68K_CHK_EX 6 +#define C68K_TRAPV_EX 7 +#define C68K_PRIVILEGE_VIOLATION_EX 8 +#define C68K_TRACE_EX 9 +#define C68K_1010_EX 10 +#define C68K_1111_EX 11 +#define C68K_FORMAT_ERROR_EX 14 +#define C68K_UNINITIALIZED_INTERRUPT_EX 15 +#define C68K_SPURIOUS_INTERRUPT_EX 24 +#define C68K_INTERRUPT_AUTOVECTOR_EX 24 +#define C68K_TRAP_BASE_EX 32 + +#define C68K_INT_ACK_AUTOVECTOR -1 + +#define C68K_HALTED 0x02 +#define C68K_WAITING 0x04 +#define C68K_DISABLE 0x10 +#define C68K_FAULTED 0x40 + +typedef u8 C68K_FASTCALL C68K_READ8(const u32 adr); +typedef u16 C68K_FASTCALL C68K_READ16(const u32 adr); + +typedef void C68K_FASTCALL C68K_WRITE8(const u32 adr, u8 data); +typedef void C68K_FASTCALL C68K_WRITE16(const u32 adr, u16 data); + +typedef s32 C68K_FASTCALL C68K_INT_CALLBACK(s32 level); +typedef void C68K_FASTCALL C68K_RESET_CALLBACK(void); + +typedef struct +{ + union + { + struct + { + u32 D[8]; // 32 bytes aligned + u32 A[8]; // 16 bytes aligned + }; + u32 DA[16]; + }; + + u32 flag_C; // 32 bytes aligned + u32 flag_V; + u32 flag_notZ; + u32 flag_N; + + u32 flag_X; // 16 bytes aligned + u32 flag_I; + u32 flag_S; + + u32 USP; + + u32 PC; // 32 bytes aligned + u32 Status; + s32 IRQLine; + + s32 timestamp; + + u32 dirty1; + + C68K_READ8 *Read_Byte; // 32 bytes aligned + C68K_READ16 *Read_Word; + + C68K_WRITE8 *Write_Byte; + C68K_WRITE16 *Write_Word; + + C68K_INT_CALLBACK *Interrupt_CallBack; // 16 bytes aligned + C68K_RESET_CALLBACK *Reset_CallBack; + + int TAS_Hack; + +} c68k_struc; + + +// 68K core var declaration +//////////////////////////// + +extern c68k_struc C68K; + + +// 68K core function declaration +///////////////////////////////// + +void C68k_Init(c68k_struc *cpu, C68K_INT_CALLBACK *int_cb); +void C68k_Set_TAS_Hack(c68k_struc *cpu, int value); + +s32 C68K_FASTCALL C68k_Reset(c68k_struc *cpu); + +void C68K_FASTCALL C68k_Exec(c68k_struc *cpu); + +void C68K_FASTCALL C68k_Set_IRQ(c68k_struc *cpu, s32 level); + +void C68k_Set_ReadB(c68k_struc *cpu, C68K_READ8 *Func); +void C68k_Set_ReadW(c68k_struc *cpu, C68K_READ16 *Func); +void C68k_Set_WriteB(c68k_struc *cpu, C68K_WRITE8 *Func); +void C68k_Set_WriteW(c68k_struc *cpu, C68K_WRITE16 *Func); + +u32 C68k_Get_DReg(c68k_struc *cpu, u32 num); +u32 C68k_Get_AReg(c68k_struc *cpu, u32 num); +u32 C68k_Get_PC(c68k_struc *cpu); +u32 C68k_Get_SR(c68k_struc *cpu); +u32 C68k_Get_USP(c68k_struc *cpu); +u32 C68k_Get_MSP(c68k_struc *cpu); + +void C68k_Set_DReg(c68k_struc *cpu, u32 num, u32 val); +void C68k_Set_AReg(c68k_struc *cpu, u32 num, u32 val); +void C68k_Set_PC(c68k_struc *cpu, u32 val); +void C68k_Set_SR(c68k_struc *cpu, u32 val); +void C68k_Set_USP(c68k_struc *cpu, u32 val); +void C68k_Set_MSP(c68k_struc *cpu, u32 val); + +static inline void C68k_Copy_State(const c68k_struc *source, c68k_struc *dest) +{ + memcpy(&dest->D[0], &source->D[0], (&(source->dirty1)) - (&(source->D[0]))); +} + +static const unsigned C68k_State_Max_Len = 512; +void C68k_Save_State(c68k_struc *cpu, u8 *buffer); +void C68k_Load_State(c68k_struc *cpu, const u8 *buffer); + +#endif // _C68K_H_ + diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_ini.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_ini.inc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op0.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op0.inc new file mode 100644 index 0000000000..9ecaefb00b --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op0.inc @@ -0,0 +1,8329 @@ +case 0x0001: +case 0x0002: +case 0x0003: +case 0x0004: +case 0x0005: +case 0x0006: +case 0x0007: + +// ORI +case 0x0000: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0011: +case 0x0012: +case 0x0013: +case 0x0014: +case 0x0015: +case 0x0016: +case 0x0017: + +// ORI +case 0x0010: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0019: +case 0x001A: +case 0x001B: +case 0x001C: +case 0x001D: +case 0x001E: + +// ORI +case 0x0018: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0021: +case 0x0022: +case 0x0023: +case 0x0024: +case 0x0025: +case 0x0026: + +// ORI +case 0x0020: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0029: +case 0x002A: +case 0x002B: +case 0x002C: +case 0x002D: +case 0x002E: +case 0x002F: + +// ORI +case 0x0028: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0031: +case 0x0032: +case 0x0033: +case 0x0034: +case 0x0035: +case 0x0036: +case 0x0037: + +// ORI +case 0x0030: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ORI +case 0x0038: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ORI +case 0x0039: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ORI +case 0x001F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ORI +case 0x0027: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0041: +case 0x0042: +case 0x0043: +case 0x0044: +case 0x0045: +case 0x0046: +case 0x0047: + +// ORI +case 0x0040: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0051: +case 0x0052: +case 0x0053: +case 0x0054: +case 0x0055: +case 0x0056: +case 0x0057: + +// ORI +case 0x0050: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0059: +case 0x005A: +case 0x005B: +case 0x005C: +case 0x005D: +case 0x005E: + +// ORI +case 0x0058: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0061: +case 0x0062: +case 0x0063: +case 0x0064: +case 0x0065: +case 0x0066: + +// ORI +case 0x0060: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0069: +case 0x006A: +case 0x006B: +case 0x006C: +case 0x006D: +case 0x006E: +case 0x006F: + +// ORI +case 0x0068: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0071: +case 0x0072: +case 0x0073: +case 0x0074: +case 0x0075: +case 0x0076: +case 0x0077: + +// ORI +case 0x0070: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ORI +case 0x0078: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ORI +case 0x0079: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ORI +case 0x005F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ORI +case 0x0067: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0081: +case 0x0082: +case 0x0083: +case 0x0084: +case 0x0085: +case 0x0086: +case 0x0087: + +// ORI +case 0x0080: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x0091: +case 0x0092: +case 0x0093: +case 0x0094: +case 0x0095: +case 0x0096: +case 0x0097: + +// ORI +case 0x0090: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0099: +case 0x009A: +case 0x009B: +case 0x009C: +case 0x009D: +case 0x009E: + +// ORI +case 0x0098: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x00A1: +case 0x00A2: +case 0x00A3: +case 0x00A4: +case 0x00A5: +case 0x00A6: + +// ORI +case 0x00A0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x00A9: +case 0x00AA: +case 0x00AB: +case 0x00AC: +case 0x00AD: +case 0x00AE: +case 0x00AF: + +// ORI +case 0x00A8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x00B1: +case 0x00B2: +case 0x00B3: +case 0x00B4: +case 0x00B5: +case 0x00B6: +case 0x00B7: + +// ORI +case 0x00B0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ORI +case 0x00B8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ORI +case 0x00B9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ORI +case 0x009F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ORI +case 0x00A7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ORICCR +case 0x003C: +{ + u32 res; + res = FETCH_BYTE & C68K_CCR_MASK; + PC += 2; + res |= GET_CCR; + SET_CCR(res) +} +RET(20) + +// ORISR +case 0x007C: +{ + u32 res; + if (CPU->flag_S) + { + res = FETCH_WORD & C68K_SR_MASK; + PC += 2; + res |= GET_SR; + SET_SR(res) + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 20; +goto C68k_Exec_End; +case 0x0201: +case 0x0202: +case 0x0203: +case 0x0204: +case 0x0205: +case 0x0206: +case 0x0207: + +// ANDI +case 0x0200: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0211: +case 0x0212: +case 0x0213: +case 0x0214: +case 0x0215: +case 0x0216: +case 0x0217: + +// ANDI +case 0x0210: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0219: +case 0x021A: +case 0x021B: +case 0x021C: +case 0x021D: +case 0x021E: + +// ANDI +case 0x0218: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0221: +case 0x0222: +case 0x0223: +case 0x0224: +case 0x0225: +case 0x0226: + +// ANDI +case 0x0220: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0229: +case 0x022A: +case 0x022B: +case 0x022C: +case 0x022D: +case 0x022E: +case 0x022F: + +// ANDI +case 0x0228: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0231: +case 0x0232: +case 0x0233: +case 0x0234: +case 0x0235: +case 0x0236: +case 0x0237: + +// ANDI +case 0x0230: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ANDI +case 0x0238: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ANDI +case 0x0239: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ANDI +case 0x021F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ANDI +case 0x0227: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0241: +case 0x0242: +case 0x0243: +case 0x0244: +case 0x0245: +case 0x0246: +case 0x0247: + +// ANDI +case 0x0240: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0251: +case 0x0252: +case 0x0253: +case 0x0254: +case 0x0255: +case 0x0256: +case 0x0257: + +// ANDI +case 0x0250: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0259: +case 0x025A: +case 0x025B: +case 0x025C: +case 0x025D: +case 0x025E: + +// ANDI +case 0x0258: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0261: +case 0x0262: +case 0x0263: +case 0x0264: +case 0x0265: +case 0x0266: + +// ANDI +case 0x0260: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0269: +case 0x026A: +case 0x026B: +case 0x026C: +case 0x026D: +case 0x026E: +case 0x026F: + +// ANDI +case 0x0268: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0271: +case 0x0272: +case 0x0273: +case 0x0274: +case 0x0275: +case 0x0276: +case 0x0277: + +// ANDI +case 0x0270: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ANDI +case 0x0278: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ANDI +case 0x0279: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ANDI +case 0x025F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ANDI +case 0x0267: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0281: +case 0x0282: +case 0x0283: +case 0x0284: +case 0x0285: +case 0x0286: +case 0x0287: + +// ANDI +case 0x0280: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x0291: +case 0x0292: +case 0x0293: +case 0x0294: +case 0x0295: +case 0x0296: +case 0x0297: + +// ANDI +case 0x0290: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0299: +case 0x029A: +case 0x029B: +case 0x029C: +case 0x029D: +case 0x029E: + +// ANDI +case 0x0298: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x02A1: +case 0x02A2: +case 0x02A3: +case 0x02A4: +case 0x02A5: +case 0x02A6: + +// ANDI +case 0x02A0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x02A9: +case 0x02AA: +case 0x02AB: +case 0x02AC: +case 0x02AD: +case 0x02AE: +case 0x02AF: + +// ANDI +case 0x02A8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x02B1: +case 0x02B2: +case 0x02B3: +case 0x02B4: +case 0x02B5: +case 0x02B6: +case 0x02B7: + +// ANDI +case 0x02B0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ANDI +case 0x02B8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ANDI +case 0x02B9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ANDI +case 0x029F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ANDI +case 0x02A7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ANDICCR +case 0x023C: +{ + u32 res; + res = FETCH_BYTE & C68K_CCR_MASK; + PC += 2; + res &= GET_CCR; + SET_CCR(res) +} +RET(20) + +// ANDISR +case 0x027C: +{ + u32 res; + if (CPU->flag_S) + { + res = FETCH_WORD & C68K_SR_MASK; + PC += 2; + res &= GET_SR; + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 20; +goto C68k_Exec_End; +case 0x0A01: +case 0x0A02: +case 0x0A03: +case 0x0A04: +case 0x0A05: +case 0x0A06: +case 0x0A07: + +// EORI +case 0x0A00: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0A11: +case 0x0A12: +case 0x0A13: +case 0x0A14: +case 0x0A15: +case 0x0A16: +case 0x0A17: + +// EORI +case 0x0A10: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0A19: +case 0x0A1A: +case 0x0A1B: +case 0x0A1C: +case 0x0A1D: +case 0x0A1E: + +// EORI +case 0x0A18: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0A21: +case 0x0A22: +case 0x0A23: +case 0x0A24: +case 0x0A25: +case 0x0A26: + +// EORI +case 0x0A20: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0A29: +case 0x0A2A: +case 0x0A2B: +case 0x0A2C: +case 0x0A2D: +case 0x0A2E: +case 0x0A2F: + +// EORI +case 0x0A28: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0A31: +case 0x0A32: +case 0x0A33: +case 0x0A34: +case 0x0A35: +case 0x0A36: +case 0x0A37: + +// EORI +case 0x0A30: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// EORI +case 0x0A38: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// EORI +case 0x0A39: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// EORI +case 0x0A1F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// EORI +case 0x0A27: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0A41: +case 0x0A42: +case 0x0A43: +case 0x0A44: +case 0x0A45: +case 0x0A46: +case 0x0A47: + +// EORI +case 0x0A40: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0A51: +case 0x0A52: +case 0x0A53: +case 0x0A54: +case 0x0A55: +case 0x0A56: +case 0x0A57: + +// EORI +case 0x0A50: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0A59: +case 0x0A5A: +case 0x0A5B: +case 0x0A5C: +case 0x0A5D: +case 0x0A5E: + +// EORI +case 0x0A58: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0A61: +case 0x0A62: +case 0x0A63: +case 0x0A64: +case 0x0A65: +case 0x0A66: + +// EORI +case 0x0A60: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0A69: +case 0x0A6A: +case 0x0A6B: +case 0x0A6C: +case 0x0A6D: +case 0x0A6E: +case 0x0A6F: + +// EORI +case 0x0A68: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0A71: +case 0x0A72: +case 0x0A73: +case 0x0A74: +case 0x0A75: +case 0x0A76: +case 0x0A77: + +// EORI +case 0x0A70: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// EORI +case 0x0A78: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// EORI +case 0x0A79: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// EORI +case 0x0A5F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// EORI +case 0x0A67: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0A81: +case 0x0A82: +case 0x0A83: +case 0x0A84: +case 0x0A85: +case 0x0A86: +case 0x0A87: + +// EORI +case 0x0A80: +{ + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x0A91: +case 0x0A92: +case 0x0A93: +case 0x0A94: +case 0x0A95: +case 0x0A96: +case 0x0A97: + +// EORI +case 0x0A90: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0A99: +case 0x0A9A: +case 0x0A9B: +case 0x0A9C: +case 0x0A9D: +case 0x0A9E: + +// EORI +case 0x0A98: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0AA1: +case 0x0AA2: +case 0x0AA3: +case 0x0AA4: +case 0x0AA5: +case 0x0AA6: + +// EORI +case 0x0AA0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0AA9: +case 0x0AAA: +case 0x0AAB: +case 0x0AAC: +case 0x0AAD: +case 0x0AAE: +case 0x0AAF: + +// EORI +case 0x0AA8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0AB1: +case 0x0AB2: +case 0x0AB3: +case 0x0AB4: +case 0x0AB5: +case 0x0AB6: +case 0x0AB7: + +// EORI +case 0x0AB0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// EORI +case 0x0AB8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// EORI +case 0x0AB9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// EORI +case 0x0A9F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// EORI +case 0x0AA7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// EORICCR +case 0x0A3C: +{ + u32 res; + res = FETCH_BYTE & C68K_CCR_MASK; + PC += 2; + res ^= GET_CCR; + SET_CCR(res) +} +RET(20) + +// EORISR +case 0x0A7C: +{ + u32 res; + if (CPU->flag_S) + { + res = FETCH_WORD & C68K_SR_MASK; + PC += 2; + res ^= GET_SR; + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 20; +goto C68k_Exec_End; +case 0x0401: +case 0x0402: +case 0x0403: +case 0x0404: +case 0x0405: +case 0x0406: +case 0x0407: + +// SUBI +case 0x0400: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + dst = (u8)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0411: +case 0x0412: +case 0x0413: +case 0x0414: +case 0x0415: +case 0x0416: +case 0x0417: + +// SUBI +case 0x0410: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0419: +case 0x041A: +case 0x041B: +case 0x041C: +case 0x041D: +case 0x041E: + +// SUBI +case 0x0418: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0421: +case 0x0422: +case 0x0423: +case 0x0424: +case 0x0425: +case 0x0426: + +// SUBI +case 0x0420: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0429: +case 0x042A: +case 0x042B: +case 0x042C: +case 0x042D: +case 0x042E: +case 0x042F: + +// SUBI +case 0x0428: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0431: +case 0x0432: +case 0x0433: +case 0x0434: +case 0x0435: +case 0x0436: +case 0x0437: + +// SUBI +case 0x0430: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// SUBI +case 0x0438: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// SUBI +case 0x0439: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// SUBI +case 0x041F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// SUBI +case 0x0427: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0441: +case 0x0442: +case 0x0443: +case 0x0444: +case 0x0445: +case 0x0446: +case 0x0447: + +// SUBI +case 0x0440: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + dst = (u16)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0451: +case 0x0452: +case 0x0453: +case 0x0454: +case 0x0455: +case 0x0456: +case 0x0457: + +// SUBI +case 0x0450: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0459: +case 0x045A: +case 0x045B: +case 0x045C: +case 0x045D: +case 0x045E: + +// SUBI +case 0x0458: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0461: +case 0x0462: +case 0x0463: +case 0x0464: +case 0x0465: +case 0x0466: + +// SUBI +case 0x0460: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0469: +case 0x046A: +case 0x046B: +case 0x046C: +case 0x046D: +case 0x046E: +case 0x046F: + +// SUBI +case 0x0468: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0471: +case 0x0472: +case 0x0473: +case 0x0474: +case 0x0475: +case 0x0476: +case 0x0477: + +// SUBI +case 0x0470: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// SUBI +case 0x0478: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// SUBI +case 0x0479: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// SUBI +case 0x045F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// SUBI +case 0x0467: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0481: +case 0x0482: +case 0x0483: +case 0x0484: +case 0x0485: +case 0x0486: +case 0x0487: + +// SUBI +case 0x0480: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + dst = (u32)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x0491: +case 0x0492: +case 0x0493: +case 0x0494: +case 0x0495: +case 0x0496: +case 0x0497: + +// SUBI +case 0x0490: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0499: +case 0x049A: +case 0x049B: +case 0x049C: +case 0x049D: +case 0x049E: + +// SUBI +case 0x0498: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x04A1: +case 0x04A2: +case 0x04A3: +case 0x04A4: +case 0x04A5: +case 0x04A6: + +// SUBI +case 0x04A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x04A9: +case 0x04AA: +case 0x04AB: +case 0x04AC: +case 0x04AD: +case 0x04AE: +case 0x04AF: + +// SUBI +case 0x04A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x04B1: +case 0x04B2: +case 0x04B3: +case 0x04B4: +case 0x04B5: +case 0x04B6: +case 0x04B7: + +// SUBI +case 0x04B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// SUBI +case 0x04B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// SUBI +case 0x04B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// SUBI +case 0x049F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// SUBI +case 0x04A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0601: +case 0x0602: +case 0x0603: +case 0x0604: +case 0x0605: +case 0x0606: +case 0x0607: + +// ADDI +case 0x0600: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + dst = (u8)CPU->D[(Opcode >> 0) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0611: +case 0x0612: +case 0x0613: +case 0x0614: +case 0x0615: +case 0x0616: +case 0x0617: + +// ADDI +case 0x0610: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0619: +case 0x061A: +case 0x061B: +case 0x061C: +case 0x061D: +case 0x061E: + +// ADDI +case 0x0618: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0621: +case 0x0622: +case 0x0623: +case 0x0624: +case 0x0625: +case 0x0626: + +// ADDI +case 0x0620: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0629: +case 0x062A: +case 0x062B: +case 0x062C: +case 0x062D: +case 0x062E: +case 0x062F: + +// ADDI +case 0x0628: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0631: +case 0x0632: +case 0x0633: +case 0x0634: +case 0x0635: +case 0x0636: +case 0x0637: + +// ADDI +case 0x0630: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ADDI +case 0x0638: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ADDI +case 0x0639: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ADDI +case 0x061F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// ADDI +case 0x0627: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x0641: +case 0x0642: +case 0x0643: +case 0x0644: +case 0x0645: +case 0x0646: +case 0x0647: + +// ADDI +case 0x0640: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + dst = (u16)CPU->D[(Opcode >> 0) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(0) +case 0x0651: +case 0x0652: +case 0x0653: +case 0x0654: +case 0x0655: +case 0x0656: +case 0x0657: + +// ADDI +case 0x0650: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0659: +case 0x065A: +case 0x065B: +case 0x065C: +case 0x065D: +case 0x065E: + +// ADDI +case 0x0658: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0661: +case 0x0662: +case 0x0663: +case 0x0664: +case 0x0665: +case 0x0666: + +// ADDI +case 0x0660: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0669: +case 0x066A: +case 0x066B: +case 0x066C: +case 0x066D: +case 0x066E: +case 0x066F: + +// ADDI +case 0x0668: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0671: +case 0x0672: +case 0x0673: +case 0x0674: +case 0x0675: +case 0x0676: +case 0x0677: + +// ADDI +case 0x0670: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ADDI +case 0x0678: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ADDI +case 0x0679: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ADDI +case 0x065F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// ADDI +case 0x0667: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x0681: +case 0x0682: +case 0x0683: +case 0x0684: +case 0x0685: +case 0x0686: +case 0x0687: + +// ADDI +case 0x0680: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + dst = (u32)CPU->D[(Opcode >> 0) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x0691: +case 0x0692: +case 0x0693: +case 0x0694: +case 0x0695: +case 0x0696: +case 0x0697: + +// ADDI +case 0x0690: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0699: +case 0x069A: +case 0x069B: +case 0x069C: +case 0x069D: +case 0x069E: + +// ADDI +case 0x0698: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x06A1: +case 0x06A2: +case 0x06A3: +case 0x06A4: +case 0x06A5: +case 0x06A6: + +// ADDI +case 0x06A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x06A9: +case 0x06AA: +case 0x06AB: +case 0x06AC: +case 0x06AD: +case 0x06AE: +case 0x06AF: + +// ADDI +case 0x06A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x06B1: +case 0x06B2: +case 0x06B3: +case 0x06B4: +case 0x06B5: +case 0x06B6: +case 0x06B7: + +// ADDI +case 0x06B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ADDI +case 0x06B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ADDI +case 0x06B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ADDI +case 0x069F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// ADDI +case 0x06A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x0C01: +case 0x0C02: +case 0x0C03: +case 0x0C04: +case 0x0C05: +case 0x0C06: +case 0x0C07: + +// CMPI +case 0x0C00: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + dst = (u8)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) +case 0x0C11: +case 0x0C12: +case 0x0C13: +case 0x0C14: +case 0x0C15: +case 0x0C16: +case 0x0C17: + +// CMPI +case 0x0C10: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) +case 0x0C19: +case 0x0C1A: +case 0x0C1B: +case 0x0C1C: +case 0x0C1D: +case 0x0C1E: + +// CMPI +case 0x0C18: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) +case 0x0C21: +case 0x0C22: +case 0x0C23: +case 0x0C24: +case 0x0C25: +case 0x0C26: + +// CMPI +case 0x0C20: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) +case 0x0C29: +case 0x0C2A: +case 0x0C2B: +case 0x0C2C: +case 0x0C2D: +case 0x0C2E: +case 0x0C2F: + +// CMPI +case 0x0C28: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) +case 0x0C31: +case 0x0C32: +case 0x0C33: +case 0x0C34: +case 0x0C35: +case 0x0C36: +case 0x0C37: + +// CMPI +case 0x0C30: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) + +// CMPI +case 0x0C38: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) + +// CMPI +case 0x0C39: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) + +// CMPI +case 0x0C1F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) + +// CMPI +case 0x0C27: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_BYTE; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(0) +case 0x0C41: +case 0x0C42: +case 0x0C43: +case 0x0C44: +case 0x0C45: +case 0x0C46: +case 0x0C47: + +// CMPI +case 0x0C40: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + dst = (u16)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) +case 0x0C51: +case 0x0C52: +case 0x0C53: +case 0x0C54: +case 0x0C55: +case 0x0C56: +case 0x0C57: + +// CMPI +case 0x0C50: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) +case 0x0C59: +case 0x0C5A: +case 0x0C5B: +case 0x0C5C: +case 0x0C5D: +case 0x0C5E: + +// CMPI +case 0x0C58: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) +case 0x0C61: +case 0x0C62: +case 0x0C63: +case 0x0C64: +case 0x0C65: +case 0x0C66: + +// CMPI +case 0x0C60: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) +case 0x0C69: +case 0x0C6A: +case 0x0C6B: +case 0x0C6C: +case 0x0C6D: +case 0x0C6E: +case 0x0C6F: + +// CMPI +case 0x0C68: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) +case 0x0C71: +case 0x0C72: +case 0x0C73: +case 0x0C74: +case 0x0C75: +case 0x0C76: +case 0x0C77: + +// CMPI +case 0x0C70: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) + +// CMPI +case 0x0C78: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) + +// CMPI +case 0x0C79: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) + +// CMPI +case 0x0C5F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) + +// CMPI +case 0x0C67: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_WORD; + PC += 2; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(0) +case 0x0C81: +case 0x0C82: +case 0x0C83: +case 0x0C84: +case 0x0C85: +case 0x0C86: +case 0x0C87: + +// CMPI +case 0x0C80: +{ + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + dst = (u32)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0x0C91: +case 0x0C92: +case 0x0C93: +case 0x0C94: +case 0x0C95: +case 0x0C96: +case 0x0C97: + +// CMPI +case 0x0C90: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x0C99: +case 0x0C9A: +case 0x0C9B: +case 0x0C9C: +case 0x0C9D: +case 0x0C9E: + +// CMPI +case 0x0C98: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x0CA1: +case 0x0CA2: +case 0x0CA3: +case 0x0CA4: +case 0x0CA5: +case 0x0CA6: + +// CMPI +case 0x0CA0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x0CA9: +case 0x0CAA: +case 0x0CAB: +case 0x0CAC: +case 0x0CAD: +case 0x0CAE: +case 0x0CAF: + +// CMPI +case 0x0CA8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x0CB1: +case 0x0CB2: +case 0x0CB3: +case 0x0CB4: +case 0x0CB5: +case 0x0CB6: +case 0x0CB7: + +// CMPI +case 0x0CB0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) + +// CMPI +case 0x0CB8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) + +// CMPI +case 0x0CB9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) + +// CMPI +case 0x0C9F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) + +// CMPI +case 0x0CA7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + timestamp += 8; + src = FETCH_LONG; + PC += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x0801: +case 0x0802: +case 0x0803: +case 0x0804: +case 0x0805: +case 0x0806: +case 0x0807: + +// BTSTn +case 0x0800: +{ + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; +} +RET(6) +case 0x0811: +case 0x0812: +case 0x0813: +case 0x0814: +case 0x0815: +case 0x0816: +case 0x0817: + +// BTSTn +case 0x0810: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0819: +case 0x081A: +case 0x081B: +case 0x081C: +case 0x081D: +case 0x081E: + +// BTSTn +case 0x0818: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0821: +case 0x0822: +case 0x0823: +case 0x0824: +case 0x0825: +case 0x0826: + +// BTSTn +case 0x0820: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0829: +case 0x082A: +case 0x082B: +case 0x082C: +case 0x082D: +case 0x082E: +case 0x082F: + +// BTSTn +case 0x0828: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0831: +case 0x0832: +case 0x0833: +case 0x0834: +case 0x0835: +case 0x0836: +case 0x0837: + +// BTSTn +case 0x0830: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) + +// BTSTn +case 0x0838: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) + +// BTSTn +case 0x0839: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) + +// BTSTn +case 0x083A: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) + +// BTSTn +case 0x083B: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = PC; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) + +// BTSTn +case 0x081F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) + +// BTSTn +case 0x0827: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0841: +case 0x0842: +case 0x0843: +case 0x0844: +case 0x0845: +case 0x0846: +case 0x0847: + +// BCHGn +case 0x0840: +{ + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; + res ^= src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x0851: +case 0x0852: +case 0x0853: +case 0x0854: +case 0x0855: +case 0x0856: +case 0x0857: + +// BCHGn +case 0x0850: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0859: +case 0x085A: +case 0x085B: +case 0x085C: +case 0x085D: +case 0x085E: + +// BCHGn +case 0x0858: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0861: +case 0x0862: +case 0x0863: +case 0x0864: +case 0x0865: +case 0x0866: + +// BCHGn +case 0x0860: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0869: +case 0x086A: +case 0x086B: +case 0x086C: +case 0x086D: +case 0x086E: +case 0x086F: + +// BCHGn +case 0x0868: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0871: +case 0x0872: +case 0x0873: +case 0x0874: +case 0x0875: +case 0x0876: +case 0x0877: + +// BCHGn +case 0x0870: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCHGn +case 0x0878: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCHGn +case 0x0879: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCHGn +case 0x085F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCHGn +case 0x0867: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0881: +case 0x0882: +case 0x0883: +case 0x0884: +case 0x0885: +case 0x0886: +case 0x0887: + +// BCLRn +case 0x0880: +{ + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; + res &= ~src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(10) +case 0x0891: +case 0x0892: +case 0x0893: +case 0x0894: +case 0x0895: +case 0x0896: +case 0x0897: + +// BCLRn +case 0x0890: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0899: +case 0x089A: +case 0x089B: +case 0x089C: +case 0x089D: +case 0x089E: + +// BCLRn +case 0x0898: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08A1: +case 0x08A2: +case 0x08A3: +case 0x08A4: +case 0x08A5: +case 0x08A6: + +// BCLRn +case 0x08A0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08A9: +case 0x08AA: +case 0x08AB: +case 0x08AC: +case 0x08AD: +case 0x08AE: +case 0x08AF: + +// BCLRn +case 0x08A8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08B1: +case 0x08B2: +case 0x08B3: +case 0x08B4: +case 0x08B5: +case 0x08B6: +case 0x08B7: + +// BCLRn +case 0x08B0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCLRn +case 0x08B8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCLRn +case 0x08B9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCLRn +case 0x089F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BCLRn +case 0x08A7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08C1: +case 0x08C2: +case 0x08C3: +case 0x08C4: +case 0x08C5: +case 0x08C6: +case 0x08C7: + +// BSETn +case 0x08C0: +{ + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; + res |= src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x08D1: +case 0x08D2: +case 0x08D3: +case 0x08D4: +case 0x08D5: +case 0x08D6: +case 0x08D7: + +// BSETn +case 0x08D0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08D9: +case 0x08DA: +case 0x08DB: +case 0x08DC: +case 0x08DD: +case 0x08DE: + +// BSETn +case 0x08D8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08E1: +case 0x08E2: +case 0x08E3: +case 0x08E4: +case 0x08E5: +case 0x08E6: + +// BSETn +case 0x08E0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08E9: +case 0x08EA: +case 0x08EB: +case 0x08EC: +case 0x08ED: +case 0x08EE: +case 0x08EF: + +// BSETn +case 0x08E8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x08F1: +case 0x08F2: +case 0x08F3: +case 0x08F4: +case 0x08F5: +case 0x08F6: +case 0x08F7: + +// BSETn +case 0x08F0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BSETn +case 0x08F8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BSETn +case 0x08F9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BSETn +case 0x08DF: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) + +// BSETn +case 0x08E7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = FETCH_BYTE; + PC += 2; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0300: +case 0x0500: +case 0x0700: +case 0x0900: +case 0x0B00: +case 0x0D00: +case 0x0F00: +case 0x0101: +case 0x0301: +case 0x0501: +case 0x0701: +case 0x0901: +case 0x0B01: +case 0x0D01: +case 0x0F01: +case 0x0102: +case 0x0302: +case 0x0502: +case 0x0702: +case 0x0902: +case 0x0B02: +case 0x0D02: +case 0x0F02: +case 0x0103: +case 0x0303: +case 0x0503: +case 0x0703: +case 0x0903: +case 0x0B03: +case 0x0D03: +case 0x0F03: +case 0x0104: +case 0x0304: +case 0x0504: +case 0x0704: +case 0x0904: +case 0x0B04: +case 0x0D04: +case 0x0F04: +case 0x0105: +case 0x0305: +case 0x0505: +case 0x0705: +case 0x0905: +case 0x0B05: +case 0x0D05: +case 0x0F05: +case 0x0106: +case 0x0306: +case 0x0506: +case 0x0706: +case 0x0906: +case 0x0B06: +case 0x0D06: +case 0x0F06: +case 0x0107: +case 0x0307: +case 0x0507: +case 0x0707: +case 0x0907: +case 0x0B07: +case 0x0D07: +case 0x0F07: + +// BTST +case 0x0100: +{ + u32 res; + u32 src; + timestamp += 4; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; +} +RET(2) +case 0x0310: +case 0x0510: +case 0x0710: +case 0x0910: +case 0x0B10: +case 0x0D10: +case 0x0F10: +case 0x0111: +case 0x0311: +case 0x0511: +case 0x0711: +case 0x0911: +case 0x0B11: +case 0x0D11: +case 0x0F11: +case 0x0112: +case 0x0312: +case 0x0512: +case 0x0712: +case 0x0912: +case 0x0B12: +case 0x0D12: +case 0x0F12: +case 0x0113: +case 0x0313: +case 0x0513: +case 0x0713: +case 0x0913: +case 0x0B13: +case 0x0D13: +case 0x0F13: +case 0x0114: +case 0x0314: +case 0x0514: +case 0x0714: +case 0x0914: +case 0x0B14: +case 0x0D14: +case 0x0F14: +case 0x0115: +case 0x0315: +case 0x0515: +case 0x0715: +case 0x0915: +case 0x0B15: +case 0x0D15: +case 0x0F15: +case 0x0116: +case 0x0316: +case 0x0516: +case 0x0716: +case 0x0916: +case 0x0B16: +case 0x0D16: +case 0x0F16: +case 0x0117: +case 0x0317: +case 0x0517: +case 0x0717: +case 0x0917: +case 0x0B17: +case 0x0D17: +case 0x0F17: + +// BTST +case 0x0110: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0318: +case 0x0518: +case 0x0718: +case 0x0918: +case 0x0B18: +case 0x0D18: +case 0x0F18: +case 0x0119: +case 0x0319: +case 0x0519: +case 0x0719: +case 0x0919: +case 0x0B19: +case 0x0D19: +case 0x0F19: +case 0x011A: +case 0x031A: +case 0x051A: +case 0x071A: +case 0x091A: +case 0x0B1A: +case 0x0D1A: +case 0x0F1A: +case 0x011B: +case 0x031B: +case 0x051B: +case 0x071B: +case 0x091B: +case 0x0B1B: +case 0x0D1B: +case 0x0F1B: +case 0x011C: +case 0x031C: +case 0x051C: +case 0x071C: +case 0x091C: +case 0x0B1C: +case 0x0D1C: +case 0x0F1C: +case 0x011D: +case 0x031D: +case 0x051D: +case 0x071D: +case 0x091D: +case 0x0B1D: +case 0x0D1D: +case 0x0F1D: +case 0x011E: +case 0x031E: +case 0x051E: +case 0x071E: +case 0x091E: +case 0x0B1E: +case 0x0D1E: +case 0x0F1E: + +// BTST +case 0x0118: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0320: +case 0x0520: +case 0x0720: +case 0x0920: +case 0x0B20: +case 0x0D20: +case 0x0F20: +case 0x0121: +case 0x0321: +case 0x0521: +case 0x0721: +case 0x0921: +case 0x0B21: +case 0x0D21: +case 0x0F21: +case 0x0122: +case 0x0322: +case 0x0522: +case 0x0722: +case 0x0922: +case 0x0B22: +case 0x0D22: +case 0x0F22: +case 0x0123: +case 0x0323: +case 0x0523: +case 0x0723: +case 0x0923: +case 0x0B23: +case 0x0D23: +case 0x0F23: +case 0x0124: +case 0x0324: +case 0x0524: +case 0x0724: +case 0x0924: +case 0x0B24: +case 0x0D24: +case 0x0F24: +case 0x0125: +case 0x0325: +case 0x0525: +case 0x0725: +case 0x0925: +case 0x0B25: +case 0x0D25: +case 0x0F25: +case 0x0126: +case 0x0326: +case 0x0526: +case 0x0726: +case 0x0926: +case 0x0B26: +case 0x0D26: +case 0x0F26: + +// BTST +case 0x0120: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0328: +case 0x0528: +case 0x0728: +case 0x0928: +case 0x0B28: +case 0x0D28: +case 0x0F28: +case 0x0129: +case 0x0329: +case 0x0529: +case 0x0729: +case 0x0929: +case 0x0B29: +case 0x0D29: +case 0x0F29: +case 0x012A: +case 0x032A: +case 0x052A: +case 0x072A: +case 0x092A: +case 0x0B2A: +case 0x0D2A: +case 0x0F2A: +case 0x012B: +case 0x032B: +case 0x052B: +case 0x072B: +case 0x092B: +case 0x0B2B: +case 0x0D2B: +case 0x0F2B: +case 0x012C: +case 0x032C: +case 0x052C: +case 0x072C: +case 0x092C: +case 0x0B2C: +case 0x0D2C: +case 0x0F2C: +case 0x012D: +case 0x032D: +case 0x052D: +case 0x072D: +case 0x092D: +case 0x0B2D: +case 0x0D2D: +case 0x0F2D: +case 0x012E: +case 0x032E: +case 0x052E: +case 0x072E: +case 0x092E: +case 0x0B2E: +case 0x0D2E: +case 0x0F2E: +case 0x012F: +case 0x032F: +case 0x052F: +case 0x072F: +case 0x092F: +case 0x0B2F: +case 0x0D2F: +case 0x0F2F: + +// BTST +case 0x0128: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0330: +case 0x0530: +case 0x0730: +case 0x0930: +case 0x0B30: +case 0x0D30: +case 0x0F30: +case 0x0131: +case 0x0331: +case 0x0531: +case 0x0731: +case 0x0931: +case 0x0B31: +case 0x0D31: +case 0x0F31: +case 0x0132: +case 0x0332: +case 0x0532: +case 0x0732: +case 0x0932: +case 0x0B32: +case 0x0D32: +case 0x0F32: +case 0x0133: +case 0x0333: +case 0x0533: +case 0x0733: +case 0x0933: +case 0x0B33: +case 0x0D33: +case 0x0F33: +case 0x0134: +case 0x0334: +case 0x0534: +case 0x0734: +case 0x0934: +case 0x0B34: +case 0x0D34: +case 0x0F34: +case 0x0135: +case 0x0335: +case 0x0535: +case 0x0735: +case 0x0935: +case 0x0B35: +case 0x0D35: +case 0x0F35: +case 0x0136: +case 0x0336: +case 0x0536: +case 0x0736: +case 0x0936: +case 0x0B36: +case 0x0D36: +case 0x0F36: +case 0x0137: +case 0x0337: +case 0x0537: +case 0x0737: +case 0x0937: +case 0x0B37: +case 0x0D37: +case 0x0F37: + +// BTST +case 0x0130: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0338: +case 0x0538: +case 0x0738: +case 0x0938: +case 0x0B38: +case 0x0D38: +case 0x0F38: + +// BTST +case 0x0138: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0339: +case 0x0539: +case 0x0739: +case 0x0939: +case 0x0B39: +case 0x0D39: +case 0x0F39: + +// BTST +case 0x0139: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x033A: +case 0x053A: +case 0x073A: +case 0x093A: +case 0x0B3A: +case 0x0D3A: +case 0x0F3A: + +// BTST +case 0x013A: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x033B: +case 0x053B: +case 0x073B: +case 0x093B: +case 0x0B3B: +case 0x0D3B: +case 0x0F3B: + +// BTST +case 0x013B: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x033C: +case 0x053C: +case 0x073C: +case 0x093C: +case 0x0B3C: +case 0x0D3C: +case 0x0F3C: + +// BTST +case 0x013C: +{ + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + res = FETCH_BYTE; + PC += 2; + CPU->flag_notZ = res & src; +} +RET(4) +case 0x031F: +case 0x051F: +case 0x071F: +case 0x091F: +case 0x0B1F: +case 0x0D1F: +case 0x0F1F: + +// BTST +case 0x011F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0327: +case 0x0527: +case 0x0727: +case 0x0927: +case 0x0B27: +case 0x0D27: +case 0x0F27: + +// BTST +case 0x0127: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; +} +RET(0) +case 0x0340: +case 0x0540: +case 0x0740: +case 0x0940: +case 0x0B40: +case 0x0D40: +case 0x0F40: +case 0x0141: +case 0x0341: +case 0x0541: +case 0x0741: +case 0x0941: +case 0x0B41: +case 0x0D41: +case 0x0F41: +case 0x0142: +case 0x0342: +case 0x0542: +case 0x0742: +case 0x0942: +case 0x0B42: +case 0x0D42: +case 0x0F42: +case 0x0143: +case 0x0343: +case 0x0543: +case 0x0743: +case 0x0943: +case 0x0B43: +case 0x0D43: +case 0x0F43: +case 0x0144: +case 0x0344: +case 0x0544: +case 0x0744: +case 0x0944: +case 0x0B44: +case 0x0D44: +case 0x0F44: +case 0x0145: +case 0x0345: +case 0x0545: +case 0x0745: +case 0x0945: +case 0x0B45: +case 0x0D45: +case 0x0F45: +case 0x0146: +case 0x0346: +case 0x0546: +case 0x0746: +case 0x0946: +case 0x0B46: +case 0x0D46: +case 0x0F46: +case 0x0147: +case 0x0347: +case 0x0547: +case 0x0747: +case 0x0947: +case 0x0B47: +case 0x0D47: +case 0x0F47: + +// BCHG +case 0x0140: +{ + u32 res; + u32 src; + timestamp += 4; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; + res ^= src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x0350: +case 0x0550: +case 0x0750: +case 0x0950: +case 0x0B50: +case 0x0D50: +case 0x0F50: +case 0x0151: +case 0x0351: +case 0x0551: +case 0x0751: +case 0x0951: +case 0x0B51: +case 0x0D51: +case 0x0F51: +case 0x0152: +case 0x0352: +case 0x0552: +case 0x0752: +case 0x0952: +case 0x0B52: +case 0x0D52: +case 0x0F52: +case 0x0153: +case 0x0353: +case 0x0553: +case 0x0753: +case 0x0953: +case 0x0B53: +case 0x0D53: +case 0x0F53: +case 0x0154: +case 0x0354: +case 0x0554: +case 0x0754: +case 0x0954: +case 0x0B54: +case 0x0D54: +case 0x0F54: +case 0x0155: +case 0x0355: +case 0x0555: +case 0x0755: +case 0x0955: +case 0x0B55: +case 0x0D55: +case 0x0F55: +case 0x0156: +case 0x0356: +case 0x0556: +case 0x0756: +case 0x0956: +case 0x0B56: +case 0x0D56: +case 0x0F56: +case 0x0157: +case 0x0357: +case 0x0557: +case 0x0757: +case 0x0957: +case 0x0B57: +case 0x0D57: +case 0x0F57: + +// BCHG +case 0x0150: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0358: +case 0x0558: +case 0x0758: +case 0x0958: +case 0x0B58: +case 0x0D58: +case 0x0F58: +case 0x0159: +case 0x0359: +case 0x0559: +case 0x0759: +case 0x0959: +case 0x0B59: +case 0x0D59: +case 0x0F59: +case 0x015A: +case 0x035A: +case 0x055A: +case 0x075A: +case 0x095A: +case 0x0B5A: +case 0x0D5A: +case 0x0F5A: +case 0x015B: +case 0x035B: +case 0x055B: +case 0x075B: +case 0x095B: +case 0x0B5B: +case 0x0D5B: +case 0x0F5B: +case 0x015C: +case 0x035C: +case 0x055C: +case 0x075C: +case 0x095C: +case 0x0B5C: +case 0x0D5C: +case 0x0F5C: +case 0x015D: +case 0x035D: +case 0x055D: +case 0x075D: +case 0x095D: +case 0x0B5D: +case 0x0D5D: +case 0x0F5D: +case 0x015E: +case 0x035E: +case 0x055E: +case 0x075E: +case 0x095E: +case 0x0B5E: +case 0x0D5E: +case 0x0F5E: + +// BCHG +case 0x0158: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0360: +case 0x0560: +case 0x0760: +case 0x0960: +case 0x0B60: +case 0x0D60: +case 0x0F60: +case 0x0161: +case 0x0361: +case 0x0561: +case 0x0761: +case 0x0961: +case 0x0B61: +case 0x0D61: +case 0x0F61: +case 0x0162: +case 0x0362: +case 0x0562: +case 0x0762: +case 0x0962: +case 0x0B62: +case 0x0D62: +case 0x0F62: +case 0x0163: +case 0x0363: +case 0x0563: +case 0x0763: +case 0x0963: +case 0x0B63: +case 0x0D63: +case 0x0F63: +case 0x0164: +case 0x0364: +case 0x0564: +case 0x0764: +case 0x0964: +case 0x0B64: +case 0x0D64: +case 0x0F64: +case 0x0165: +case 0x0365: +case 0x0565: +case 0x0765: +case 0x0965: +case 0x0B65: +case 0x0D65: +case 0x0F65: +case 0x0166: +case 0x0366: +case 0x0566: +case 0x0766: +case 0x0966: +case 0x0B66: +case 0x0D66: +case 0x0F66: + +// BCHG +case 0x0160: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0368: +case 0x0568: +case 0x0768: +case 0x0968: +case 0x0B68: +case 0x0D68: +case 0x0F68: +case 0x0169: +case 0x0369: +case 0x0569: +case 0x0769: +case 0x0969: +case 0x0B69: +case 0x0D69: +case 0x0F69: +case 0x016A: +case 0x036A: +case 0x056A: +case 0x076A: +case 0x096A: +case 0x0B6A: +case 0x0D6A: +case 0x0F6A: +case 0x016B: +case 0x036B: +case 0x056B: +case 0x076B: +case 0x096B: +case 0x0B6B: +case 0x0D6B: +case 0x0F6B: +case 0x016C: +case 0x036C: +case 0x056C: +case 0x076C: +case 0x096C: +case 0x0B6C: +case 0x0D6C: +case 0x0F6C: +case 0x016D: +case 0x036D: +case 0x056D: +case 0x076D: +case 0x096D: +case 0x0B6D: +case 0x0D6D: +case 0x0F6D: +case 0x016E: +case 0x036E: +case 0x056E: +case 0x076E: +case 0x096E: +case 0x0B6E: +case 0x0D6E: +case 0x0F6E: +case 0x016F: +case 0x036F: +case 0x056F: +case 0x076F: +case 0x096F: +case 0x0B6F: +case 0x0D6F: +case 0x0F6F: + +// BCHG +case 0x0168: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0370: +case 0x0570: +case 0x0770: +case 0x0970: +case 0x0B70: +case 0x0D70: +case 0x0F70: +case 0x0171: +case 0x0371: +case 0x0571: +case 0x0771: +case 0x0971: +case 0x0B71: +case 0x0D71: +case 0x0F71: +case 0x0172: +case 0x0372: +case 0x0572: +case 0x0772: +case 0x0972: +case 0x0B72: +case 0x0D72: +case 0x0F72: +case 0x0173: +case 0x0373: +case 0x0573: +case 0x0773: +case 0x0973: +case 0x0B73: +case 0x0D73: +case 0x0F73: +case 0x0174: +case 0x0374: +case 0x0574: +case 0x0774: +case 0x0974: +case 0x0B74: +case 0x0D74: +case 0x0F74: +case 0x0175: +case 0x0375: +case 0x0575: +case 0x0775: +case 0x0975: +case 0x0B75: +case 0x0D75: +case 0x0F75: +case 0x0176: +case 0x0376: +case 0x0576: +case 0x0776: +case 0x0976: +case 0x0B76: +case 0x0D76: +case 0x0F76: +case 0x0177: +case 0x0377: +case 0x0577: +case 0x0777: +case 0x0977: +case 0x0B77: +case 0x0D77: +case 0x0F77: + +// BCHG +case 0x0170: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0378: +case 0x0578: +case 0x0778: +case 0x0978: +case 0x0B78: +case 0x0D78: +case 0x0F78: + +// BCHG +case 0x0178: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0379: +case 0x0579: +case 0x0779: +case 0x0979: +case 0x0B79: +case 0x0D79: +case 0x0F79: + +// BCHG +case 0x0179: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x035F: +case 0x055F: +case 0x075F: +case 0x095F: +case 0x0B5F: +case 0x0D5F: +case 0x0F5F: + +// BCHG +case 0x015F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0367: +case 0x0567: +case 0x0767: +case 0x0967: +case 0x0B67: +case 0x0D67: +case 0x0F67: + +// BCHG +case 0x0167: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res ^= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0380: +case 0x0580: +case 0x0780: +case 0x0980: +case 0x0B80: +case 0x0D80: +case 0x0F80: +case 0x0181: +case 0x0381: +case 0x0581: +case 0x0781: +case 0x0981: +case 0x0B81: +case 0x0D81: +case 0x0F81: +case 0x0182: +case 0x0382: +case 0x0582: +case 0x0782: +case 0x0982: +case 0x0B82: +case 0x0D82: +case 0x0F82: +case 0x0183: +case 0x0383: +case 0x0583: +case 0x0783: +case 0x0983: +case 0x0B83: +case 0x0D83: +case 0x0F83: +case 0x0184: +case 0x0384: +case 0x0584: +case 0x0784: +case 0x0984: +case 0x0B84: +case 0x0D84: +case 0x0F84: +case 0x0185: +case 0x0385: +case 0x0585: +case 0x0785: +case 0x0985: +case 0x0B85: +case 0x0D85: +case 0x0F85: +case 0x0186: +case 0x0386: +case 0x0586: +case 0x0786: +case 0x0986: +case 0x0B86: +case 0x0D86: +case 0x0F86: +case 0x0187: +case 0x0387: +case 0x0587: +case 0x0787: +case 0x0987: +case 0x0B87: +case 0x0D87: +case 0x0F87: + +// BCLR +case 0x0180: +{ + u32 res; + u32 src; + timestamp += 4; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; + res &= ~src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0x0390: +case 0x0590: +case 0x0790: +case 0x0990: +case 0x0B90: +case 0x0D90: +case 0x0F90: +case 0x0191: +case 0x0391: +case 0x0591: +case 0x0791: +case 0x0991: +case 0x0B91: +case 0x0D91: +case 0x0F91: +case 0x0192: +case 0x0392: +case 0x0592: +case 0x0792: +case 0x0992: +case 0x0B92: +case 0x0D92: +case 0x0F92: +case 0x0193: +case 0x0393: +case 0x0593: +case 0x0793: +case 0x0993: +case 0x0B93: +case 0x0D93: +case 0x0F93: +case 0x0194: +case 0x0394: +case 0x0594: +case 0x0794: +case 0x0994: +case 0x0B94: +case 0x0D94: +case 0x0F94: +case 0x0195: +case 0x0395: +case 0x0595: +case 0x0795: +case 0x0995: +case 0x0B95: +case 0x0D95: +case 0x0F95: +case 0x0196: +case 0x0396: +case 0x0596: +case 0x0796: +case 0x0996: +case 0x0B96: +case 0x0D96: +case 0x0F96: +case 0x0197: +case 0x0397: +case 0x0597: +case 0x0797: +case 0x0997: +case 0x0B97: +case 0x0D97: +case 0x0F97: + +// BCLR +case 0x0190: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0398: +case 0x0598: +case 0x0798: +case 0x0998: +case 0x0B98: +case 0x0D98: +case 0x0F98: +case 0x0199: +case 0x0399: +case 0x0599: +case 0x0799: +case 0x0999: +case 0x0B99: +case 0x0D99: +case 0x0F99: +case 0x019A: +case 0x039A: +case 0x059A: +case 0x079A: +case 0x099A: +case 0x0B9A: +case 0x0D9A: +case 0x0F9A: +case 0x019B: +case 0x039B: +case 0x059B: +case 0x079B: +case 0x099B: +case 0x0B9B: +case 0x0D9B: +case 0x0F9B: +case 0x019C: +case 0x039C: +case 0x059C: +case 0x079C: +case 0x099C: +case 0x0B9C: +case 0x0D9C: +case 0x0F9C: +case 0x019D: +case 0x039D: +case 0x059D: +case 0x079D: +case 0x099D: +case 0x0B9D: +case 0x0D9D: +case 0x0F9D: +case 0x019E: +case 0x039E: +case 0x059E: +case 0x079E: +case 0x099E: +case 0x0B9E: +case 0x0D9E: +case 0x0F9E: + +// BCLR +case 0x0198: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03A0: +case 0x05A0: +case 0x07A0: +case 0x09A0: +case 0x0BA0: +case 0x0DA0: +case 0x0FA0: +case 0x01A1: +case 0x03A1: +case 0x05A1: +case 0x07A1: +case 0x09A1: +case 0x0BA1: +case 0x0DA1: +case 0x0FA1: +case 0x01A2: +case 0x03A2: +case 0x05A2: +case 0x07A2: +case 0x09A2: +case 0x0BA2: +case 0x0DA2: +case 0x0FA2: +case 0x01A3: +case 0x03A3: +case 0x05A3: +case 0x07A3: +case 0x09A3: +case 0x0BA3: +case 0x0DA3: +case 0x0FA3: +case 0x01A4: +case 0x03A4: +case 0x05A4: +case 0x07A4: +case 0x09A4: +case 0x0BA4: +case 0x0DA4: +case 0x0FA4: +case 0x01A5: +case 0x03A5: +case 0x05A5: +case 0x07A5: +case 0x09A5: +case 0x0BA5: +case 0x0DA5: +case 0x0FA5: +case 0x01A6: +case 0x03A6: +case 0x05A6: +case 0x07A6: +case 0x09A6: +case 0x0BA6: +case 0x0DA6: +case 0x0FA6: + +// BCLR +case 0x01A0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03A8: +case 0x05A8: +case 0x07A8: +case 0x09A8: +case 0x0BA8: +case 0x0DA8: +case 0x0FA8: +case 0x01A9: +case 0x03A9: +case 0x05A9: +case 0x07A9: +case 0x09A9: +case 0x0BA9: +case 0x0DA9: +case 0x0FA9: +case 0x01AA: +case 0x03AA: +case 0x05AA: +case 0x07AA: +case 0x09AA: +case 0x0BAA: +case 0x0DAA: +case 0x0FAA: +case 0x01AB: +case 0x03AB: +case 0x05AB: +case 0x07AB: +case 0x09AB: +case 0x0BAB: +case 0x0DAB: +case 0x0FAB: +case 0x01AC: +case 0x03AC: +case 0x05AC: +case 0x07AC: +case 0x09AC: +case 0x0BAC: +case 0x0DAC: +case 0x0FAC: +case 0x01AD: +case 0x03AD: +case 0x05AD: +case 0x07AD: +case 0x09AD: +case 0x0BAD: +case 0x0DAD: +case 0x0FAD: +case 0x01AE: +case 0x03AE: +case 0x05AE: +case 0x07AE: +case 0x09AE: +case 0x0BAE: +case 0x0DAE: +case 0x0FAE: +case 0x01AF: +case 0x03AF: +case 0x05AF: +case 0x07AF: +case 0x09AF: +case 0x0BAF: +case 0x0DAF: +case 0x0FAF: + +// BCLR +case 0x01A8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03B0: +case 0x05B0: +case 0x07B0: +case 0x09B0: +case 0x0BB0: +case 0x0DB0: +case 0x0FB0: +case 0x01B1: +case 0x03B1: +case 0x05B1: +case 0x07B1: +case 0x09B1: +case 0x0BB1: +case 0x0DB1: +case 0x0FB1: +case 0x01B2: +case 0x03B2: +case 0x05B2: +case 0x07B2: +case 0x09B2: +case 0x0BB2: +case 0x0DB2: +case 0x0FB2: +case 0x01B3: +case 0x03B3: +case 0x05B3: +case 0x07B3: +case 0x09B3: +case 0x0BB3: +case 0x0DB3: +case 0x0FB3: +case 0x01B4: +case 0x03B4: +case 0x05B4: +case 0x07B4: +case 0x09B4: +case 0x0BB4: +case 0x0DB4: +case 0x0FB4: +case 0x01B5: +case 0x03B5: +case 0x05B5: +case 0x07B5: +case 0x09B5: +case 0x0BB5: +case 0x0DB5: +case 0x0FB5: +case 0x01B6: +case 0x03B6: +case 0x05B6: +case 0x07B6: +case 0x09B6: +case 0x0BB6: +case 0x0DB6: +case 0x0FB6: +case 0x01B7: +case 0x03B7: +case 0x05B7: +case 0x07B7: +case 0x09B7: +case 0x0BB7: +case 0x0DB7: +case 0x0FB7: + +// BCLR +case 0x01B0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03B8: +case 0x05B8: +case 0x07B8: +case 0x09B8: +case 0x0BB8: +case 0x0DB8: +case 0x0FB8: + +// BCLR +case 0x01B8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03B9: +case 0x05B9: +case 0x07B9: +case 0x09B9: +case 0x0BB9: +case 0x0DB9: +case 0x0FB9: + +// BCLR +case 0x01B9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x039F: +case 0x059F: +case 0x079F: +case 0x099F: +case 0x0B9F: +case 0x0D9F: +case 0x0F9F: + +// BCLR +case 0x019F: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03A7: +case 0x05A7: +case 0x07A7: +case 0x09A7: +case 0x0BA7: +case 0x0DA7: +case 0x0FA7: + +// BCLR +case 0x01A7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res &= ~src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03C0: +case 0x05C0: +case 0x07C0: +case 0x09C0: +case 0x0BC0: +case 0x0DC0: +case 0x0FC0: +case 0x01C1: +case 0x03C1: +case 0x05C1: +case 0x07C1: +case 0x09C1: +case 0x0BC1: +case 0x0DC1: +case 0x0FC1: +case 0x01C2: +case 0x03C2: +case 0x05C2: +case 0x07C2: +case 0x09C2: +case 0x0BC2: +case 0x0DC2: +case 0x0FC2: +case 0x01C3: +case 0x03C3: +case 0x05C3: +case 0x07C3: +case 0x09C3: +case 0x0BC3: +case 0x0DC3: +case 0x0FC3: +case 0x01C4: +case 0x03C4: +case 0x05C4: +case 0x07C4: +case 0x09C4: +case 0x0BC4: +case 0x0DC4: +case 0x0FC4: +case 0x01C5: +case 0x03C5: +case 0x05C5: +case 0x07C5: +case 0x09C5: +case 0x0BC5: +case 0x0DC5: +case 0x0FC5: +case 0x01C6: +case 0x03C6: +case 0x05C6: +case 0x07C6: +case 0x09C6: +case 0x0BC6: +case 0x0DC6: +case 0x0FC6: +case 0x01C7: +case 0x03C7: +case 0x05C7: +case 0x07C7: +case 0x09C7: +case 0x0BC7: +case 0x0DC7: +case 0x0FC7: + +// BSET +case 0x01C0: +{ + u32 res; + u32 src; + timestamp += 4; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 31); + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_notZ = res & src; + res |= src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x03D0: +case 0x05D0: +case 0x07D0: +case 0x09D0: +case 0x0BD0: +case 0x0DD0: +case 0x0FD0: +case 0x01D1: +case 0x03D1: +case 0x05D1: +case 0x07D1: +case 0x09D1: +case 0x0BD1: +case 0x0DD1: +case 0x0FD1: +case 0x01D2: +case 0x03D2: +case 0x05D2: +case 0x07D2: +case 0x09D2: +case 0x0BD2: +case 0x0DD2: +case 0x0FD2: +case 0x01D3: +case 0x03D3: +case 0x05D3: +case 0x07D3: +case 0x09D3: +case 0x0BD3: +case 0x0DD3: +case 0x0FD3: +case 0x01D4: +case 0x03D4: +case 0x05D4: +case 0x07D4: +case 0x09D4: +case 0x0BD4: +case 0x0DD4: +case 0x0FD4: +case 0x01D5: +case 0x03D5: +case 0x05D5: +case 0x07D5: +case 0x09D5: +case 0x0BD5: +case 0x0DD5: +case 0x0FD5: +case 0x01D6: +case 0x03D6: +case 0x05D6: +case 0x07D6: +case 0x09D6: +case 0x0BD6: +case 0x0DD6: +case 0x0FD6: +case 0x01D7: +case 0x03D7: +case 0x05D7: +case 0x07D7: +case 0x09D7: +case 0x0BD7: +case 0x0DD7: +case 0x0FD7: + +// BSET +case 0x01D0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03D8: +case 0x05D8: +case 0x07D8: +case 0x09D8: +case 0x0BD8: +case 0x0DD8: +case 0x0FD8: +case 0x01D9: +case 0x03D9: +case 0x05D9: +case 0x07D9: +case 0x09D9: +case 0x0BD9: +case 0x0DD9: +case 0x0FD9: +case 0x01DA: +case 0x03DA: +case 0x05DA: +case 0x07DA: +case 0x09DA: +case 0x0BDA: +case 0x0DDA: +case 0x0FDA: +case 0x01DB: +case 0x03DB: +case 0x05DB: +case 0x07DB: +case 0x09DB: +case 0x0BDB: +case 0x0DDB: +case 0x0FDB: +case 0x01DC: +case 0x03DC: +case 0x05DC: +case 0x07DC: +case 0x09DC: +case 0x0BDC: +case 0x0DDC: +case 0x0FDC: +case 0x01DD: +case 0x03DD: +case 0x05DD: +case 0x07DD: +case 0x09DD: +case 0x0BDD: +case 0x0DDD: +case 0x0FDD: +case 0x01DE: +case 0x03DE: +case 0x05DE: +case 0x07DE: +case 0x09DE: +case 0x0BDE: +case 0x0DDE: +case 0x0FDE: + +// BSET +case 0x01D8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03E0: +case 0x05E0: +case 0x07E0: +case 0x09E0: +case 0x0BE0: +case 0x0DE0: +case 0x0FE0: +case 0x01E1: +case 0x03E1: +case 0x05E1: +case 0x07E1: +case 0x09E1: +case 0x0BE1: +case 0x0DE1: +case 0x0FE1: +case 0x01E2: +case 0x03E2: +case 0x05E2: +case 0x07E2: +case 0x09E2: +case 0x0BE2: +case 0x0DE2: +case 0x0FE2: +case 0x01E3: +case 0x03E3: +case 0x05E3: +case 0x07E3: +case 0x09E3: +case 0x0BE3: +case 0x0DE3: +case 0x0FE3: +case 0x01E4: +case 0x03E4: +case 0x05E4: +case 0x07E4: +case 0x09E4: +case 0x0BE4: +case 0x0DE4: +case 0x0FE4: +case 0x01E5: +case 0x03E5: +case 0x05E5: +case 0x07E5: +case 0x09E5: +case 0x0BE5: +case 0x0DE5: +case 0x0FE5: +case 0x01E6: +case 0x03E6: +case 0x05E6: +case 0x07E6: +case 0x09E6: +case 0x0BE6: +case 0x0DE6: +case 0x0FE6: + +// BSET +case 0x01E0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03E8: +case 0x05E8: +case 0x07E8: +case 0x09E8: +case 0x0BE8: +case 0x0DE8: +case 0x0FE8: +case 0x01E9: +case 0x03E9: +case 0x05E9: +case 0x07E9: +case 0x09E9: +case 0x0BE9: +case 0x0DE9: +case 0x0FE9: +case 0x01EA: +case 0x03EA: +case 0x05EA: +case 0x07EA: +case 0x09EA: +case 0x0BEA: +case 0x0DEA: +case 0x0FEA: +case 0x01EB: +case 0x03EB: +case 0x05EB: +case 0x07EB: +case 0x09EB: +case 0x0BEB: +case 0x0DEB: +case 0x0FEB: +case 0x01EC: +case 0x03EC: +case 0x05EC: +case 0x07EC: +case 0x09EC: +case 0x0BEC: +case 0x0DEC: +case 0x0FEC: +case 0x01ED: +case 0x03ED: +case 0x05ED: +case 0x07ED: +case 0x09ED: +case 0x0BED: +case 0x0DED: +case 0x0FED: +case 0x01EE: +case 0x03EE: +case 0x05EE: +case 0x07EE: +case 0x09EE: +case 0x0BEE: +case 0x0DEE: +case 0x0FEE: +case 0x01EF: +case 0x03EF: +case 0x05EF: +case 0x07EF: +case 0x09EF: +case 0x0BEF: +case 0x0DEF: +case 0x0FEF: + +// BSET +case 0x01E8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03F0: +case 0x05F0: +case 0x07F0: +case 0x09F0: +case 0x0BF0: +case 0x0DF0: +case 0x0FF0: +case 0x01F1: +case 0x03F1: +case 0x05F1: +case 0x07F1: +case 0x09F1: +case 0x0BF1: +case 0x0DF1: +case 0x0FF1: +case 0x01F2: +case 0x03F2: +case 0x05F2: +case 0x07F2: +case 0x09F2: +case 0x0BF2: +case 0x0DF2: +case 0x0FF2: +case 0x01F3: +case 0x03F3: +case 0x05F3: +case 0x07F3: +case 0x09F3: +case 0x0BF3: +case 0x0DF3: +case 0x0FF3: +case 0x01F4: +case 0x03F4: +case 0x05F4: +case 0x07F4: +case 0x09F4: +case 0x0BF4: +case 0x0DF4: +case 0x0FF4: +case 0x01F5: +case 0x03F5: +case 0x05F5: +case 0x07F5: +case 0x09F5: +case 0x0BF5: +case 0x0DF5: +case 0x0FF5: +case 0x01F6: +case 0x03F6: +case 0x05F6: +case 0x07F6: +case 0x09F6: +case 0x0BF6: +case 0x0DF6: +case 0x0FF6: +case 0x01F7: +case 0x03F7: +case 0x05F7: +case 0x07F7: +case 0x09F7: +case 0x0BF7: +case 0x0DF7: +case 0x0FF7: + +// BSET +case 0x01F0: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03F8: +case 0x05F8: +case 0x07F8: +case 0x09F8: +case 0x0BF8: +case 0x0DF8: +case 0x0FF8: + +// BSET +case 0x01F8: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03F9: +case 0x05F9: +case 0x07F9: +case 0x09F9: +case 0x0BF9: +case 0x0DF9: +case 0x0FF9: + +// BSET +case 0x01F9: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03DF: +case 0x05DF: +case 0x07DF: +case 0x09DF: +case 0x0BDF: +case 0x0DDF: +case 0x0FDF: + +// BSET +case 0x01DF: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x03E7: +case 0x05E7: +case 0x07E7: +case 0x09E7: +case 0x0BE7: +case 0x0DE7: +case 0x0FE7: + +// BSET +case 0x01E7: +{ + u32 adr; + u32 res; + u32 src; + timestamp += 4; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + src = 1 << (src & 7); + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_notZ = res & src; + res |= src; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x0308: +case 0x0508: +case 0x0708: +case 0x0908: +case 0x0B08: +case 0x0D08: +case 0x0F08: +case 0x0109: +case 0x0309: +case 0x0509: +case 0x0709: +case 0x0909: +case 0x0B09: +case 0x0D09: +case 0x0F09: +case 0x010A: +case 0x030A: +case 0x050A: +case 0x070A: +case 0x090A: +case 0x0B0A: +case 0x0D0A: +case 0x0F0A: +case 0x010B: +case 0x030B: +case 0x050B: +case 0x070B: +case 0x090B: +case 0x0B0B: +case 0x0D0B: +case 0x0F0B: +case 0x010C: +case 0x030C: +case 0x050C: +case 0x070C: +case 0x090C: +case 0x0B0C: +case 0x0D0C: +case 0x0F0C: +case 0x010D: +case 0x030D: +case 0x050D: +case 0x070D: +case 0x090D: +case 0x0B0D: +case 0x0D0D: +case 0x0F0D: +case 0x010E: +case 0x030E: +case 0x050E: +case 0x070E: +case 0x090E: +case 0x0B0E: +case 0x0D0E: +case 0x0F0E: +case 0x010F: +case 0x030F: +case 0x050F: +case 0x070F: +case 0x090F: +case 0x0B0F: +case 0x0D0F: +case 0x0F0F: + +// MOVEPWaD +case 0x0108: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr + 0, res) + READ_BYTE_F(adr + 2, src) + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], (res << 8) | src); +} +RET(16) +case 0x0348: +case 0x0548: +case 0x0748: +case 0x0948: +case 0x0B48: +case 0x0D48: +case 0x0F48: +case 0x0149: +case 0x0349: +case 0x0549: +case 0x0749: +case 0x0949: +case 0x0B49: +case 0x0D49: +case 0x0F49: +case 0x014A: +case 0x034A: +case 0x054A: +case 0x074A: +case 0x094A: +case 0x0B4A: +case 0x0D4A: +case 0x0F4A: +case 0x014B: +case 0x034B: +case 0x054B: +case 0x074B: +case 0x094B: +case 0x0B4B: +case 0x0D4B: +case 0x0F4B: +case 0x014C: +case 0x034C: +case 0x054C: +case 0x074C: +case 0x094C: +case 0x0B4C: +case 0x0D4C: +case 0x0F4C: +case 0x014D: +case 0x034D: +case 0x054D: +case 0x074D: +case 0x094D: +case 0x0B4D: +case 0x0D4D: +case 0x0F4D: +case 0x014E: +case 0x034E: +case 0x054E: +case 0x074E: +case 0x094E: +case 0x0B4E: +case 0x0D4E: +case 0x0F4E: +case 0x014F: +case 0x034F: +case 0x054F: +case 0x074F: +case 0x094F: +case 0x0B4F: +case 0x0D4F: +case 0x0F4F: + +// MOVEPLaD +case 0x0148: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res <<= 24; + adr += 2; + READ_BYTE_F(adr, src) + res |= src << 16; + adr += 2; + READ_BYTE_F(adr, src) + res |= src << 8; + adr += 2; + READ_BYTE_F(adr, src) + CPU->D[(Opcode >> 9) & 7] = res | src; +} +RET(24) +case 0x0388: +case 0x0588: +case 0x0788: +case 0x0988: +case 0x0B88: +case 0x0D88: +case 0x0F88: +case 0x0189: +case 0x0389: +case 0x0589: +case 0x0789: +case 0x0989: +case 0x0B89: +case 0x0D89: +case 0x0F89: +case 0x018A: +case 0x038A: +case 0x058A: +case 0x078A: +case 0x098A: +case 0x0B8A: +case 0x0D8A: +case 0x0F8A: +case 0x018B: +case 0x038B: +case 0x058B: +case 0x078B: +case 0x098B: +case 0x0B8B: +case 0x0D8B: +case 0x0F8B: +case 0x018C: +case 0x038C: +case 0x058C: +case 0x078C: +case 0x098C: +case 0x0B8C: +case 0x0D8C: +case 0x0F8C: +case 0x018D: +case 0x038D: +case 0x058D: +case 0x078D: +case 0x098D: +case 0x0B8D: +case 0x0D8D: +case 0x0F8D: +case 0x018E: +case 0x038E: +case 0x058E: +case 0x078E: +case 0x098E: +case 0x0B8E: +case 0x0D8E: +case 0x0F8E: +case 0x018F: +case 0x038F: +case 0x058F: +case 0x078F: +case 0x098F: +case 0x0B8F: +case 0x0D8F: +case 0x0F8F: + +// MOVEPWDa +case 0x0188: +{ + u32 adr; + u32 res; + res = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr + 0, res >> 8) + WRITE_BYTE_F(adr + 2, res >> 0) +} +RET(16) +case 0x03C8: +case 0x05C8: +case 0x07C8: +case 0x09C8: +case 0x0BC8: +case 0x0DC8: +case 0x0FC8: +case 0x01C9: +case 0x03C9: +case 0x05C9: +case 0x07C9: +case 0x09C9: +case 0x0BC9: +case 0x0DC9: +case 0x0FC9: +case 0x01CA: +case 0x03CA: +case 0x05CA: +case 0x07CA: +case 0x09CA: +case 0x0BCA: +case 0x0DCA: +case 0x0FCA: +case 0x01CB: +case 0x03CB: +case 0x05CB: +case 0x07CB: +case 0x09CB: +case 0x0BCB: +case 0x0DCB: +case 0x0FCB: +case 0x01CC: +case 0x03CC: +case 0x05CC: +case 0x07CC: +case 0x09CC: +case 0x0BCC: +case 0x0DCC: +case 0x0FCC: +case 0x01CD: +case 0x03CD: +case 0x05CD: +case 0x07CD: +case 0x09CD: +case 0x0BCD: +case 0x0DCD: +case 0x0FCD: +case 0x01CE: +case 0x03CE: +case 0x05CE: +case 0x07CE: +case 0x09CE: +case 0x0BCE: +case 0x0DCE: +case 0x0FCE: +case 0x01CF: +case 0x03CF: +case 0x05CF: +case 0x07CF: +case 0x09CF: +case 0x0BCF: +case 0x0DCF: +case 0x0FCF: + +// MOVEPLDa +case 0x01C8: +{ + u32 adr; + u32 res; + res = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res >> 24) + adr += 2; + WRITE_BYTE_F(adr, res >> 16) + adr += 2; + WRITE_BYTE_F(adr, res >> 8) + adr += 2; + WRITE_BYTE_F(adr, res >> 0) +} +RET(24) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op1.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op1.inc new file mode 100644 index 0000000000..14f0ce6fc1 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op1.inc @@ -0,0 +1,5626 @@ +case 0x1200: +case 0x1400: +case 0x1600: +case 0x1800: +case 0x1A00: +case 0x1C00: +case 0x1E00: +case 0x1001: +case 0x1201: +case 0x1401: +case 0x1601: +case 0x1801: +case 0x1A01: +case 0x1C01: +case 0x1E01: +case 0x1002: +case 0x1202: +case 0x1402: +case 0x1602: +case 0x1802: +case 0x1A02: +case 0x1C02: +case 0x1E02: +case 0x1003: +case 0x1203: +case 0x1403: +case 0x1603: +case 0x1803: +case 0x1A03: +case 0x1C03: +case 0x1E03: +case 0x1004: +case 0x1204: +case 0x1404: +case 0x1604: +case 0x1804: +case 0x1A04: +case 0x1C04: +case 0x1E04: +case 0x1005: +case 0x1205: +case 0x1405: +case 0x1605: +case 0x1805: +case 0x1A05: +case 0x1C05: +case 0x1E05: +case 0x1006: +case 0x1206: +case 0x1406: +case 0x1606: +case 0x1806: +case 0x1A06: +case 0x1C06: +case 0x1E06: +case 0x1007: +case 0x1207: +case 0x1407: +case 0x1607: +case 0x1807: +case 0x1A07: +case 0x1C07: +case 0x1E07: + +// MOVEB +case 0x1000: +{ + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x1280: +case 0x1480: +case 0x1680: +case 0x1880: +case 0x1A80: +case 0x1C80: +case 0x1E80: +case 0x1081: +case 0x1281: +case 0x1481: +case 0x1681: +case 0x1881: +case 0x1A81: +case 0x1C81: +case 0x1E81: +case 0x1082: +case 0x1282: +case 0x1482: +case 0x1682: +case 0x1882: +case 0x1A82: +case 0x1C82: +case 0x1E82: +case 0x1083: +case 0x1283: +case 0x1483: +case 0x1683: +case 0x1883: +case 0x1A83: +case 0x1C83: +case 0x1E83: +case 0x1084: +case 0x1284: +case 0x1484: +case 0x1684: +case 0x1884: +case 0x1A84: +case 0x1C84: +case 0x1E84: +case 0x1085: +case 0x1285: +case 0x1485: +case 0x1685: +case 0x1885: +case 0x1A85: +case 0x1C85: +case 0x1E85: +case 0x1086: +case 0x1286: +case 0x1486: +case 0x1686: +case 0x1886: +case 0x1A86: +case 0x1C86: +case 0x1E86: +case 0x1087: +case 0x1287: +case 0x1487: +case 0x1687: +case 0x1887: +case 0x1A87: +case 0x1C87: +case 0x1E87: + +// MOVEB +case 0x1080: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12C0: +case 0x14C0: +case 0x16C0: +case 0x18C0: +case 0x1AC0: +case 0x1CC0: +case 0x10C1: +case 0x12C1: +case 0x14C1: +case 0x16C1: +case 0x18C1: +case 0x1AC1: +case 0x1CC1: +case 0x10C2: +case 0x12C2: +case 0x14C2: +case 0x16C2: +case 0x18C2: +case 0x1AC2: +case 0x1CC2: +case 0x10C3: +case 0x12C3: +case 0x14C3: +case 0x16C3: +case 0x18C3: +case 0x1AC3: +case 0x1CC3: +case 0x10C4: +case 0x12C4: +case 0x14C4: +case 0x16C4: +case 0x18C4: +case 0x1AC4: +case 0x1CC4: +case 0x10C5: +case 0x12C5: +case 0x14C5: +case 0x16C5: +case 0x18C5: +case 0x1AC5: +case 0x1CC5: +case 0x10C6: +case 0x12C6: +case 0x14C6: +case 0x16C6: +case 0x18C6: +case 0x1AC6: +case 0x1CC6: +case 0x10C7: +case 0x12C7: +case 0x14C7: +case 0x16C7: +case 0x18C7: +case 0x1AC7: +case 0x1CC7: + +// MOVEB +case 0x10C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1300: +case 0x1500: +case 0x1700: +case 0x1900: +case 0x1B00: +case 0x1D00: +case 0x1101: +case 0x1301: +case 0x1501: +case 0x1701: +case 0x1901: +case 0x1B01: +case 0x1D01: +case 0x1102: +case 0x1302: +case 0x1502: +case 0x1702: +case 0x1902: +case 0x1B02: +case 0x1D02: +case 0x1103: +case 0x1303: +case 0x1503: +case 0x1703: +case 0x1903: +case 0x1B03: +case 0x1D03: +case 0x1104: +case 0x1304: +case 0x1504: +case 0x1704: +case 0x1904: +case 0x1B04: +case 0x1D04: +case 0x1105: +case 0x1305: +case 0x1505: +case 0x1705: +case 0x1905: +case 0x1B05: +case 0x1D05: +case 0x1106: +case 0x1306: +case 0x1506: +case 0x1706: +case 0x1906: +case 0x1B06: +case 0x1D06: +case 0x1107: +case 0x1307: +case 0x1507: +case 0x1707: +case 0x1907: +case 0x1B07: +case 0x1D07: + +// MOVEB +case 0x1100: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1340: +case 0x1540: +case 0x1740: +case 0x1940: +case 0x1B40: +case 0x1D40: +case 0x1F40: +case 0x1141: +case 0x1341: +case 0x1541: +case 0x1741: +case 0x1941: +case 0x1B41: +case 0x1D41: +case 0x1F41: +case 0x1142: +case 0x1342: +case 0x1542: +case 0x1742: +case 0x1942: +case 0x1B42: +case 0x1D42: +case 0x1F42: +case 0x1143: +case 0x1343: +case 0x1543: +case 0x1743: +case 0x1943: +case 0x1B43: +case 0x1D43: +case 0x1F43: +case 0x1144: +case 0x1344: +case 0x1544: +case 0x1744: +case 0x1944: +case 0x1B44: +case 0x1D44: +case 0x1F44: +case 0x1145: +case 0x1345: +case 0x1545: +case 0x1745: +case 0x1945: +case 0x1B45: +case 0x1D45: +case 0x1F45: +case 0x1146: +case 0x1346: +case 0x1546: +case 0x1746: +case 0x1946: +case 0x1B46: +case 0x1D46: +case 0x1F46: +case 0x1147: +case 0x1347: +case 0x1547: +case 0x1747: +case 0x1947: +case 0x1B47: +case 0x1D47: +case 0x1F47: + +// MOVEB +case 0x1140: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1380: +case 0x1580: +case 0x1780: +case 0x1980: +case 0x1B80: +case 0x1D80: +case 0x1F80: +case 0x1181: +case 0x1381: +case 0x1581: +case 0x1781: +case 0x1981: +case 0x1B81: +case 0x1D81: +case 0x1F81: +case 0x1182: +case 0x1382: +case 0x1582: +case 0x1782: +case 0x1982: +case 0x1B82: +case 0x1D82: +case 0x1F82: +case 0x1183: +case 0x1383: +case 0x1583: +case 0x1783: +case 0x1983: +case 0x1B83: +case 0x1D83: +case 0x1F83: +case 0x1184: +case 0x1384: +case 0x1584: +case 0x1784: +case 0x1984: +case 0x1B84: +case 0x1D84: +case 0x1F84: +case 0x1185: +case 0x1385: +case 0x1585: +case 0x1785: +case 0x1985: +case 0x1B85: +case 0x1D85: +case 0x1F85: +case 0x1186: +case 0x1386: +case 0x1586: +case 0x1786: +case 0x1986: +case 0x1B86: +case 0x1D86: +case 0x1F86: +case 0x1187: +case 0x1387: +case 0x1587: +case 0x1787: +case 0x1987: +case 0x1B87: +case 0x1D87: +case 0x1F87: + +// MOVEB +case 0x1180: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11C1: +case 0x11C2: +case 0x11C3: +case 0x11C4: +case 0x11C5: +case 0x11C6: +case 0x11C7: + +// MOVEB +case 0x11C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13C1: +case 0x13C2: +case 0x13C3: +case 0x13C4: +case 0x13C5: +case 0x13C6: +case 0x13C7: + +// MOVEB +case 0x13C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1EC1: +case 0x1EC2: +case 0x1EC3: +case 0x1EC4: +case 0x1EC5: +case 0x1EC6: +case 0x1EC7: + +// MOVEB +case 0x1EC0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F01: +case 0x1F02: +case 0x1F03: +case 0x1F04: +case 0x1F05: +case 0x1F06: +case 0x1F07: + +// MOVEB +case 0x1F00: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1208: +case 0x1408: +case 0x1608: +case 0x1808: +case 0x1A08: +case 0x1C08: +case 0x1E08: +case 0x1009: +case 0x1209: +case 0x1409: +case 0x1609: +case 0x1809: +case 0x1A09: +case 0x1C09: +case 0x1E09: +case 0x100A: +case 0x120A: +case 0x140A: +case 0x160A: +case 0x180A: +case 0x1A0A: +case 0x1C0A: +case 0x1E0A: +case 0x100B: +case 0x120B: +case 0x140B: +case 0x160B: +case 0x180B: +case 0x1A0B: +case 0x1C0B: +case 0x1E0B: +case 0x100C: +case 0x120C: +case 0x140C: +case 0x160C: +case 0x180C: +case 0x1A0C: +case 0x1C0C: +case 0x1E0C: +case 0x100D: +case 0x120D: +case 0x140D: +case 0x160D: +case 0x180D: +case 0x1A0D: +case 0x1C0D: +case 0x1E0D: +case 0x100E: +case 0x120E: +case 0x140E: +case 0x160E: +case 0x180E: +case 0x1A0E: +case 0x1C0E: +case 0x1E0E: +case 0x100F: +case 0x120F: +case 0x140F: +case 0x160F: +case 0x180F: +case 0x1A0F: +case 0x1C0F: +case 0x1E0F: + +// MOVEB +case 0x1008: +{ + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x1288: +case 0x1488: +case 0x1688: +case 0x1888: +case 0x1A88: +case 0x1C88: +case 0x1E88: +case 0x1089: +case 0x1289: +case 0x1489: +case 0x1689: +case 0x1889: +case 0x1A89: +case 0x1C89: +case 0x1E89: +case 0x108A: +case 0x128A: +case 0x148A: +case 0x168A: +case 0x188A: +case 0x1A8A: +case 0x1C8A: +case 0x1E8A: +case 0x108B: +case 0x128B: +case 0x148B: +case 0x168B: +case 0x188B: +case 0x1A8B: +case 0x1C8B: +case 0x1E8B: +case 0x108C: +case 0x128C: +case 0x148C: +case 0x168C: +case 0x188C: +case 0x1A8C: +case 0x1C8C: +case 0x1E8C: +case 0x108D: +case 0x128D: +case 0x148D: +case 0x168D: +case 0x188D: +case 0x1A8D: +case 0x1C8D: +case 0x1E8D: +case 0x108E: +case 0x128E: +case 0x148E: +case 0x168E: +case 0x188E: +case 0x1A8E: +case 0x1C8E: +case 0x1E8E: +case 0x108F: +case 0x128F: +case 0x148F: +case 0x168F: +case 0x188F: +case 0x1A8F: +case 0x1C8F: +case 0x1E8F: + +// MOVEB +case 0x1088: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12C8: +case 0x14C8: +case 0x16C8: +case 0x18C8: +case 0x1AC8: +case 0x1CC8: +case 0x10C9: +case 0x12C9: +case 0x14C9: +case 0x16C9: +case 0x18C9: +case 0x1AC9: +case 0x1CC9: +case 0x10CA: +case 0x12CA: +case 0x14CA: +case 0x16CA: +case 0x18CA: +case 0x1ACA: +case 0x1CCA: +case 0x10CB: +case 0x12CB: +case 0x14CB: +case 0x16CB: +case 0x18CB: +case 0x1ACB: +case 0x1CCB: +case 0x10CC: +case 0x12CC: +case 0x14CC: +case 0x16CC: +case 0x18CC: +case 0x1ACC: +case 0x1CCC: +case 0x10CD: +case 0x12CD: +case 0x14CD: +case 0x16CD: +case 0x18CD: +case 0x1ACD: +case 0x1CCD: +case 0x10CE: +case 0x12CE: +case 0x14CE: +case 0x16CE: +case 0x18CE: +case 0x1ACE: +case 0x1CCE: +case 0x10CF: +case 0x12CF: +case 0x14CF: +case 0x16CF: +case 0x18CF: +case 0x1ACF: +case 0x1CCF: + +// MOVEB +case 0x10C8: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1308: +case 0x1508: +case 0x1708: +case 0x1908: +case 0x1B08: +case 0x1D08: +case 0x1109: +case 0x1309: +case 0x1509: +case 0x1709: +case 0x1909: +case 0x1B09: +case 0x1D09: +case 0x110A: +case 0x130A: +case 0x150A: +case 0x170A: +case 0x190A: +case 0x1B0A: +case 0x1D0A: +case 0x110B: +case 0x130B: +case 0x150B: +case 0x170B: +case 0x190B: +case 0x1B0B: +case 0x1D0B: +case 0x110C: +case 0x130C: +case 0x150C: +case 0x170C: +case 0x190C: +case 0x1B0C: +case 0x1D0C: +case 0x110D: +case 0x130D: +case 0x150D: +case 0x170D: +case 0x190D: +case 0x1B0D: +case 0x1D0D: +case 0x110E: +case 0x130E: +case 0x150E: +case 0x170E: +case 0x190E: +case 0x1B0E: +case 0x1D0E: +case 0x110F: +case 0x130F: +case 0x150F: +case 0x170F: +case 0x190F: +case 0x1B0F: +case 0x1D0F: + +// MOVEB +case 0x1108: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1348: +case 0x1548: +case 0x1748: +case 0x1948: +case 0x1B48: +case 0x1D48: +case 0x1F48: +case 0x1149: +case 0x1349: +case 0x1549: +case 0x1749: +case 0x1949: +case 0x1B49: +case 0x1D49: +case 0x1F49: +case 0x114A: +case 0x134A: +case 0x154A: +case 0x174A: +case 0x194A: +case 0x1B4A: +case 0x1D4A: +case 0x1F4A: +case 0x114B: +case 0x134B: +case 0x154B: +case 0x174B: +case 0x194B: +case 0x1B4B: +case 0x1D4B: +case 0x1F4B: +case 0x114C: +case 0x134C: +case 0x154C: +case 0x174C: +case 0x194C: +case 0x1B4C: +case 0x1D4C: +case 0x1F4C: +case 0x114D: +case 0x134D: +case 0x154D: +case 0x174D: +case 0x194D: +case 0x1B4D: +case 0x1D4D: +case 0x1F4D: +case 0x114E: +case 0x134E: +case 0x154E: +case 0x174E: +case 0x194E: +case 0x1B4E: +case 0x1D4E: +case 0x1F4E: +case 0x114F: +case 0x134F: +case 0x154F: +case 0x174F: +case 0x194F: +case 0x1B4F: +case 0x1D4F: +case 0x1F4F: + +// MOVEB +case 0x1148: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1388: +case 0x1588: +case 0x1788: +case 0x1988: +case 0x1B88: +case 0x1D88: +case 0x1F88: +case 0x1189: +case 0x1389: +case 0x1589: +case 0x1789: +case 0x1989: +case 0x1B89: +case 0x1D89: +case 0x1F89: +case 0x118A: +case 0x138A: +case 0x158A: +case 0x178A: +case 0x198A: +case 0x1B8A: +case 0x1D8A: +case 0x1F8A: +case 0x118B: +case 0x138B: +case 0x158B: +case 0x178B: +case 0x198B: +case 0x1B8B: +case 0x1D8B: +case 0x1F8B: +case 0x118C: +case 0x138C: +case 0x158C: +case 0x178C: +case 0x198C: +case 0x1B8C: +case 0x1D8C: +case 0x1F8C: +case 0x118D: +case 0x138D: +case 0x158D: +case 0x178D: +case 0x198D: +case 0x1B8D: +case 0x1D8D: +case 0x1F8D: +case 0x118E: +case 0x138E: +case 0x158E: +case 0x178E: +case 0x198E: +case 0x1B8E: +case 0x1D8E: +case 0x1F8E: +case 0x118F: +case 0x138F: +case 0x158F: +case 0x178F: +case 0x198F: +case 0x1B8F: +case 0x1D8F: +case 0x1F8F: + +// MOVEB +case 0x1188: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11C9: +case 0x11CA: +case 0x11CB: +case 0x11CC: +case 0x11CD: +case 0x11CE: +case 0x11CF: + +// MOVEB +case 0x11C8: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13C9: +case 0x13CA: +case 0x13CB: +case 0x13CC: +case 0x13CD: +case 0x13CE: +case 0x13CF: + +// MOVEB +case 0x13C8: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1EC9: +case 0x1ECA: +case 0x1ECB: +case 0x1ECC: +case 0x1ECD: +case 0x1ECE: +case 0x1ECF: + +// MOVEB +case 0x1EC8: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F09: +case 0x1F0A: +case 0x1F0B: +case 0x1F0C: +case 0x1F0D: +case 0x1F0E: +case 0x1F0F: + +// MOVEB +case 0x1F08: +{ + u32 adr; + u32 res; + timestamp += 4; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1210: +case 0x1410: +case 0x1610: +case 0x1810: +case 0x1A10: +case 0x1C10: +case 0x1E10: +case 0x1011: +case 0x1211: +case 0x1411: +case 0x1611: +case 0x1811: +case 0x1A11: +case 0x1C11: +case 0x1E11: +case 0x1012: +case 0x1212: +case 0x1412: +case 0x1612: +case 0x1812: +case 0x1A12: +case 0x1C12: +case 0x1E12: +case 0x1013: +case 0x1213: +case 0x1413: +case 0x1613: +case 0x1813: +case 0x1A13: +case 0x1C13: +case 0x1E13: +case 0x1014: +case 0x1214: +case 0x1414: +case 0x1614: +case 0x1814: +case 0x1A14: +case 0x1C14: +case 0x1E14: +case 0x1015: +case 0x1215: +case 0x1415: +case 0x1615: +case 0x1815: +case 0x1A15: +case 0x1C15: +case 0x1E15: +case 0x1016: +case 0x1216: +case 0x1416: +case 0x1616: +case 0x1816: +case 0x1A16: +case 0x1C16: +case 0x1E16: +case 0x1017: +case 0x1217: +case 0x1417: +case 0x1617: +case 0x1817: +case 0x1A17: +case 0x1C17: +case 0x1E17: + +// MOVEB +case 0x1010: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x1290: +case 0x1490: +case 0x1690: +case 0x1890: +case 0x1A90: +case 0x1C90: +case 0x1E90: +case 0x1091: +case 0x1291: +case 0x1491: +case 0x1691: +case 0x1891: +case 0x1A91: +case 0x1C91: +case 0x1E91: +case 0x1092: +case 0x1292: +case 0x1492: +case 0x1692: +case 0x1892: +case 0x1A92: +case 0x1C92: +case 0x1E92: +case 0x1093: +case 0x1293: +case 0x1493: +case 0x1693: +case 0x1893: +case 0x1A93: +case 0x1C93: +case 0x1E93: +case 0x1094: +case 0x1294: +case 0x1494: +case 0x1694: +case 0x1894: +case 0x1A94: +case 0x1C94: +case 0x1E94: +case 0x1095: +case 0x1295: +case 0x1495: +case 0x1695: +case 0x1895: +case 0x1A95: +case 0x1C95: +case 0x1E95: +case 0x1096: +case 0x1296: +case 0x1496: +case 0x1696: +case 0x1896: +case 0x1A96: +case 0x1C96: +case 0x1E96: +case 0x1097: +case 0x1297: +case 0x1497: +case 0x1697: +case 0x1897: +case 0x1A97: +case 0x1C97: +case 0x1E97: + +// MOVEB +case 0x1090: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12D0: +case 0x14D0: +case 0x16D0: +case 0x18D0: +case 0x1AD0: +case 0x1CD0: +case 0x10D1: +case 0x12D1: +case 0x14D1: +case 0x16D1: +case 0x18D1: +case 0x1AD1: +case 0x1CD1: +case 0x10D2: +case 0x12D2: +case 0x14D2: +case 0x16D2: +case 0x18D2: +case 0x1AD2: +case 0x1CD2: +case 0x10D3: +case 0x12D3: +case 0x14D3: +case 0x16D3: +case 0x18D3: +case 0x1AD3: +case 0x1CD3: +case 0x10D4: +case 0x12D4: +case 0x14D4: +case 0x16D4: +case 0x18D4: +case 0x1AD4: +case 0x1CD4: +case 0x10D5: +case 0x12D5: +case 0x14D5: +case 0x16D5: +case 0x18D5: +case 0x1AD5: +case 0x1CD5: +case 0x10D6: +case 0x12D6: +case 0x14D6: +case 0x16D6: +case 0x18D6: +case 0x1AD6: +case 0x1CD6: +case 0x10D7: +case 0x12D7: +case 0x14D7: +case 0x16D7: +case 0x18D7: +case 0x1AD7: +case 0x1CD7: + +// MOVEB +case 0x10D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1310: +case 0x1510: +case 0x1710: +case 0x1910: +case 0x1B10: +case 0x1D10: +case 0x1111: +case 0x1311: +case 0x1511: +case 0x1711: +case 0x1911: +case 0x1B11: +case 0x1D11: +case 0x1112: +case 0x1312: +case 0x1512: +case 0x1712: +case 0x1912: +case 0x1B12: +case 0x1D12: +case 0x1113: +case 0x1313: +case 0x1513: +case 0x1713: +case 0x1913: +case 0x1B13: +case 0x1D13: +case 0x1114: +case 0x1314: +case 0x1514: +case 0x1714: +case 0x1914: +case 0x1B14: +case 0x1D14: +case 0x1115: +case 0x1315: +case 0x1515: +case 0x1715: +case 0x1915: +case 0x1B15: +case 0x1D15: +case 0x1116: +case 0x1316: +case 0x1516: +case 0x1716: +case 0x1916: +case 0x1B16: +case 0x1D16: +case 0x1117: +case 0x1317: +case 0x1517: +case 0x1717: +case 0x1917: +case 0x1B17: +case 0x1D17: + +// MOVEB +case 0x1110: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1350: +case 0x1550: +case 0x1750: +case 0x1950: +case 0x1B50: +case 0x1D50: +case 0x1F50: +case 0x1151: +case 0x1351: +case 0x1551: +case 0x1751: +case 0x1951: +case 0x1B51: +case 0x1D51: +case 0x1F51: +case 0x1152: +case 0x1352: +case 0x1552: +case 0x1752: +case 0x1952: +case 0x1B52: +case 0x1D52: +case 0x1F52: +case 0x1153: +case 0x1353: +case 0x1553: +case 0x1753: +case 0x1953: +case 0x1B53: +case 0x1D53: +case 0x1F53: +case 0x1154: +case 0x1354: +case 0x1554: +case 0x1754: +case 0x1954: +case 0x1B54: +case 0x1D54: +case 0x1F54: +case 0x1155: +case 0x1355: +case 0x1555: +case 0x1755: +case 0x1955: +case 0x1B55: +case 0x1D55: +case 0x1F55: +case 0x1156: +case 0x1356: +case 0x1556: +case 0x1756: +case 0x1956: +case 0x1B56: +case 0x1D56: +case 0x1F56: +case 0x1157: +case 0x1357: +case 0x1557: +case 0x1757: +case 0x1957: +case 0x1B57: +case 0x1D57: +case 0x1F57: + +// MOVEB +case 0x1150: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1390: +case 0x1590: +case 0x1790: +case 0x1990: +case 0x1B90: +case 0x1D90: +case 0x1F90: +case 0x1191: +case 0x1391: +case 0x1591: +case 0x1791: +case 0x1991: +case 0x1B91: +case 0x1D91: +case 0x1F91: +case 0x1192: +case 0x1392: +case 0x1592: +case 0x1792: +case 0x1992: +case 0x1B92: +case 0x1D92: +case 0x1F92: +case 0x1193: +case 0x1393: +case 0x1593: +case 0x1793: +case 0x1993: +case 0x1B93: +case 0x1D93: +case 0x1F93: +case 0x1194: +case 0x1394: +case 0x1594: +case 0x1794: +case 0x1994: +case 0x1B94: +case 0x1D94: +case 0x1F94: +case 0x1195: +case 0x1395: +case 0x1595: +case 0x1795: +case 0x1995: +case 0x1B95: +case 0x1D95: +case 0x1F95: +case 0x1196: +case 0x1396: +case 0x1596: +case 0x1796: +case 0x1996: +case 0x1B96: +case 0x1D96: +case 0x1F96: +case 0x1197: +case 0x1397: +case 0x1597: +case 0x1797: +case 0x1997: +case 0x1B97: +case 0x1D97: +case 0x1F97: + +// MOVEB +case 0x1190: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11D1: +case 0x11D2: +case 0x11D3: +case 0x11D4: +case 0x11D5: +case 0x11D6: +case 0x11D7: + +// MOVEB +case 0x11D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13D1: +case 0x13D2: +case 0x13D3: +case 0x13D4: +case 0x13D5: +case 0x13D6: +case 0x13D7: + +// MOVEB +case 0x13D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1ED1: +case 0x1ED2: +case 0x1ED3: +case 0x1ED4: +case 0x1ED5: +case 0x1ED6: +case 0x1ED7: + +// MOVEB +case 0x1ED0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F11: +case 0x1F12: +case 0x1F13: +case 0x1F14: +case 0x1F15: +case 0x1F16: +case 0x1F17: + +// MOVEB +case 0x1F10: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1218: +case 0x1418: +case 0x1618: +case 0x1818: +case 0x1A18: +case 0x1C18: +case 0x1E18: +case 0x1019: +case 0x1219: +case 0x1419: +case 0x1619: +case 0x1819: +case 0x1A19: +case 0x1C19: +case 0x1E19: +case 0x101A: +case 0x121A: +case 0x141A: +case 0x161A: +case 0x181A: +case 0x1A1A: +case 0x1C1A: +case 0x1E1A: +case 0x101B: +case 0x121B: +case 0x141B: +case 0x161B: +case 0x181B: +case 0x1A1B: +case 0x1C1B: +case 0x1E1B: +case 0x101C: +case 0x121C: +case 0x141C: +case 0x161C: +case 0x181C: +case 0x1A1C: +case 0x1C1C: +case 0x1E1C: +case 0x101D: +case 0x121D: +case 0x141D: +case 0x161D: +case 0x181D: +case 0x1A1D: +case 0x1C1D: +case 0x1E1D: +case 0x101E: +case 0x121E: +case 0x141E: +case 0x161E: +case 0x181E: +case 0x1A1E: +case 0x1C1E: +case 0x1E1E: + +// MOVEB +case 0x1018: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x1298: +case 0x1498: +case 0x1698: +case 0x1898: +case 0x1A98: +case 0x1C98: +case 0x1E98: +case 0x1099: +case 0x1299: +case 0x1499: +case 0x1699: +case 0x1899: +case 0x1A99: +case 0x1C99: +case 0x1E99: +case 0x109A: +case 0x129A: +case 0x149A: +case 0x169A: +case 0x189A: +case 0x1A9A: +case 0x1C9A: +case 0x1E9A: +case 0x109B: +case 0x129B: +case 0x149B: +case 0x169B: +case 0x189B: +case 0x1A9B: +case 0x1C9B: +case 0x1E9B: +case 0x109C: +case 0x129C: +case 0x149C: +case 0x169C: +case 0x189C: +case 0x1A9C: +case 0x1C9C: +case 0x1E9C: +case 0x109D: +case 0x129D: +case 0x149D: +case 0x169D: +case 0x189D: +case 0x1A9D: +case 0x1C9D: +case 0x1E9D: +case 0x109E: +case 0x129E: +case 0x149E: +case 0x169E: +case 0x189E: +case 0x1A9E: +case 0x1C9E: +case 0x1E9E: + +// MOVEB +case 0x1098: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12D8: +case 0x14D8: +case 0x16D8: +case 0x18D8: +case 0x1AD8: +case 0x1CD8: +case 0x10D9: +case 0x12D9: +case 0x14D9: +case 0x16D9: +case 0x18D9: +case 0x1AD9: +case 0x1CD9: +case 0x10DA: +case 0x12DA: +case 0x14DA: +case 0x16DA: +case 0x18DA: +case 0x1ADA: +case 0x1CDA: +case 0x10DB: +case 0x12DB: +case 0x14DB: +case 0x16DB: +case 0x18DB: +case 0x1ADB: +case 0x1CDB: +case 0x10DC: +case 0x12DC: +case 0x14DC: +case 0x16DC: +case 0x18DC: +case 0x1ADC: +case 0x1CDC: +case 0x10DD: +case 0x12DD: +case 0x14DD: +case 0x16DD: +case 0x18DD: +case 0x1ADD: +case 0x1CDD: +case 0x10DE: +case 0x12DE: +case 0x14DE: +case 0x16DE: +case 0x18DE: +case 0x1ADE: +case 0x1CDE: + +// MOVEB +case 0x10D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1318: +case 0x1518: +case 0x1718: +case 0x1918: +case 0x1B18: +case 0x1D18: +case 0x1119: +case 0x1319: +case 0x1519: +case 0x1719: +case 0x1919: +case 0x1B19: +case 0x1D19: +case 0x111A: +case 0x131A: +case 0x151A: +case 0x171A: +case 0x191A: +case 0x1B1A: +case 0x1D1A: +case 0x111B: +case 0x131B: +case 0x151B: +case 0x171B: +case 0x191B: +case 0x1B1B: +case 0x1D1B: +case 0x111C: +case 0x131C: +case 0x151C: +case 0x171C: +case 0x191C: +case 0x1B1C: +case 0x1D1C: +case 0x111D: +case 0x131D: +case 0x151D: +case 0x171D: +case 0x191D: +case 0x1B1D: +case 0x1D1D: +case 0x111E: +case 0x131E: +case 0x151E: +case 0x171E: +case 0x191E: +case 0x1B1E: +case 0x1D1E: + +// MOVEB +case 0x1118: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1358: +case 0x1558: +case 0x1758: +case 0x1958: +case 0x1B58: +case 0x1D58: +case 0x1F58: +case 0x1159: +case 0x1359: +case 0x1559: +case 0x1759: +case 0x1959: +case 0x1B59: +case 0x1D59: +case 0x1F59: +case 0x115A: +case 0x135A: +case 0x155A: +case 0x175A: +case 0x195A: +case 0x1B5A: +case 0x1D5A: +case 0x1F5A: +case 0x115B: +case 0x135B: +case 0x155B: +case 0x175B: +case 0x195B: +case 0x1B5B: +case 0x1D5B: +case 0x1F5B: +case 0x115C: +case 0x135C: +case 0x155C: +case 0x175C: +case 0x195C: +case 0x1B5C: +case 0x1D5C: +case 0x1F5C: +case 0x115D: +case 0x135D: +case 0x155D: +case 0x175D: +case 0x195D: +case 0x1B5D: +case 0x1D5D: +case 0x1F5D: +case 0x115E: +case 0x135E: +case 0x155E: +case 0x175E: +case 0x195E: +case 0x1B5E: +case 0x1D5E: +case 0x1F5E: + +// MOVEB +case 0x1158: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1398: +case 0x1598: +case 0x1798: +case 0x1998: +case 0x1B98: +case 0x1D98: +case 0x1F98: +case 0x1199: +case 0x1399: +case 0x1599: +case 0x1799: +case 0x1999: +case 0x1B99: +case 0x1D99: +case 0x1F99: +case 0x119A: +case 0x139A: +case 0x159A: +case 0x179A: +case 0x199A: +case 0x1B9A: +case 0x1D9A: +case 0x1F9A: +case 0x119B: +case 0x139B: +case 0x159B: +case 0x179B: +case 0x199B: +case 0x1B9B: +case 0x1D9B: +case 0x1F9B: +case 0x119C: +case 0x139C: +case 0x159C: +case 0x179C: +case 0x199C: +case 0x1B9C: +case 0x1D9C: +case 0x1F9C: +case 0x119D: +case 0x139D: +case 0x159D: +case 0x179D: +case 0x199D: +case 0x1B9D: +case 0x1D9D: +case 0x1F9D: +case 0x119E: +case 0x139E: +case 0x159E: +case 0x179E: +case 0x199E: +case 0x1B9E: +case 0x1D9E: +case 0x1F9E: + +// MOVEB +case 0x1198: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11D9: +case 0x11DA: +case 0x11DB: +case 0x11DC: +case 0x11DD: +case 0x11DE: + +// MOVEB +case 0x11D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13D9: +case 0x13DA: +case 0x13DB: +case 0x13DC: +case 0x13DD: +case 0x13DE: + +// MOVEB +case 0x13D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1ED9: +case 0x1EDA: +case 0x1EDB: +case 0x1EDC: +case 0x1EDD: +case 0x1EDE: + +// MOVEB +case 0x1ED8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F19: +case 0x1F1A: +case 0x1F1B: +case 0x1F1C: +case 0x1F1D: +case 0x1F1E: + +// MOVEB +case 0x1F18: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1220: +case 0x1420: +case 0x1620: +case 0x1820: +case 0x1A20: +case 0x1C20: +case 0x1E20: +case 0x1021: +case 0x1221: +case 0x1421: +case 0x1621: +case 0x1821: +case 0x1A21: +case 0x1C21: +case 0x1E21: +case 0x1022: +case 0x1222: +case 0x1422: +case 0x1622: +case 0x1822: +case 0x1A22: +case 0x1C22: +case 0x1E22: +case 0x1023: +case 0x1223: +case 0x1423: +case 0x1623: +case 0x1823: +case 0x1A23: +case 0x1C23: +case 0x1E23: +case 0x1024: +case 0x1224: +case 0x1424: +case 0x1624: +case 0x1824: +case 0x1A24: +case 0x1C24: +case 0x1E24: +case 0x1025: +case 0x1225: +case 0x1425: +case 0x1625: +case 0x1825: +case 0x1A25: +case 0x1C25: +case 0x1E25: +case 0x1026: +case 0x1226: +case 0x1426: +case 0x1626: +case 0x1826: +case 0x1A26: +case 0x1C26: +case 0x1E26: + +// MOVEB +case 0x1020: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12A0: +case 0x14A0: +case 0x16A0: +case 0x18A0: +case 0x1AA0: +case 0x1CA0: +case 0x1EA0: +case 0x10A1: +case 0x12A1: +case 0x14A1: +case 0x16A1: +case 0x18A1: +case 0x1AA1: +case 0x1CA1: +case 0x1EA1: +case 0x10A2: +case 0x12A2: +case 0x14A2: +case 0x16A2: +case 0x18A2: +case 0x1AA2: +case 0x1CA2: +case 0x1EA2: +case 0x10A3: +case 0x12A3: +case 0x14A3: +case 0x16A3: +case 0x18A3: +case 0x1AA3: +case 0x1CA3: +case 0x1EA3: +case 0x10A4: +case 0x12A4: +case 0x14A4: +case 0x16A4: +case 0x18A4: +case 0x1AA4: +case 0x1CA4: +case 0x1EA4: +case 0x10A5: +case 0x12A5: +case 0x14A5: +case 0x16A5: +case 0x18A5: +case 0x1AA5: +case 0x1CA5: +case 0x1EA5: +case 0x10A6: +case 0x12A6: +case 0x14A6: +case 0x16A6: +case 0x18A6: +case 0x1AA6: +case 0x1CA6: +case 0x1EA6: + +// MOVEB +case 0x10A0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12E0: +case 0x14E0: +case 0x16E0: +case 0x18E0: +case 0x1AE0: +case 0x1CE0: +case 0x10E1: +case 0x12E1: +case 0x14E1: +case 0x16E1: +case 0x18E1: +case 0x1AE1: +case 0x1CE1: +case 0x10E2: +case 0x12E2: +case 0x14E2: +case 0x16E2: +case 0x18E2: +case 0x1AE2: +case 0x1CE2: +case 0x10E3: +case 0x12E3: +case 0x14E3: +case 0x16E3: +case 0x18E3: +case 0x1AE3: +case 0x1CE3: +case 0x10E4: +case 0x12E4: +case 0x14E4: +case 0x16E4: +case 0x18E4: +case 0x1AE4: +case 0x1CE4: +case 0x10E5: +case 0x12E5: +case 0x14E5: +case 0x16E5: +case 0x18E5: +case 0x1AE5: +case 0x1CE5: +case 0x10E6: +case 0x12E6: +case 0x14E6: +case 0x16E6: +case 0x18E6: +case 0x1AE6: +case 0x1CE6: + +// MOVEB +case 0x10E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1320: +case 0x1520: +case 0x1720: +case 0x1920: +case 0x1B20: +case 0x1D20: +case 0x1121: +case 0x1321: +case 0x1521: +case 0x1721: +case 0x1921: +case 0x1B21: +case 0x1D21: +case 0x1122: +case 0x1322: +case 0x1522: +case 0x1722: +case 0x1922: +case 0x1B22: +case 0x1D22: +case 0x1123: +case 0x1323: +case 0x1523: +case 0x1723: +case 0x1923: +case 0x1B23: +case 0x1D23: +case 0x1124: +case 0x1324: +case 0x1524: +case 0x1724: +case 0x1924: +case 0x1B24: +case 0x1D24: +case 0x1125: +case 0x1325: +case 0x1525: +case 0x1725: +case 0x1925: +case 0x1B25: +case 0x1D25: +case 0x1126: +case 0x1326: +case 0x1526: +case 0x1726: +case 0x1926: +case 0x1B26: +case 0x1D26: + +// MOVEB +case 0x1120: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1360: +case 0x1560: +case 0x1760: +case 0x1960: +case 0x1B60: +case 0x1D60: +case 0x1F60: +case 0x1161: +case 0x1361: +case 0x1561: +case 0x1761: +case 0x1961: +case 0x1B61: +case 0x1D61: +case 0x1F61: +case 0x1162: +case 0x1362: +case 0x1562: +case 0x1762: +case 0x1962: +case 0x1B62: +case 0x1D62: +case 0x1F62: +case 0x1163: +case 0x1363: +case 0x1563: +case 0x1763: +case 0x1963: +case 0x1B63: +case 0x1D63: +case 0x1F63: +case 0x1164: +case 0x1364: +case 0x1564: +case 0x1764: +case 0x1964: +case 0x1B64: +case 0x1D64: +case 0x1F64: +case 0x1165: +case 0x1365: +case 0x1565: +case 0x1765: +case 0x1965: +case 0x1B65: +case 0x1D65: +case 0x1F65: +case 0x1166: +case 0x1366: +case 0x1566: +case 0x1766: +case 0x1966: +case 0x1B66: +case 0x1D66: +case 0x1F66: + +// MOVEB +case 0x1160: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13A0: +case 0x15A0: +case 0x17A0: +case 0x19A0: +case 0x1BA0: +case 0x1DA0: +case 0x1FA0: +case 0x11A1: +case 0x13A1: +case 0x15A1: +case 0x17A1: +case 0x19A1: +case 0x1BA1: +case 0x1DA1: +case 0x1FA1: +case 0x11A2: +case 0x13A2: +case 0x15A2: +case 0x17A2: +case 0x19A2: +case 0x1BA2: +case 0x1DA2: +case 0x1FA2: +case 0x11A3: +case 0x13A3: +case 0x15A3: +case 0x17A3: +case 0x19A3: +case 0x1BA3: +case 0x1DA3: +case 0x1FA3: +case 0x11A4: +case 0x13A4: +case 0x15A4: +case 0x17A4: +case 0x19A4: +case 0x1BA4: +case 0x1DA4: +case 0x1FA4: +case 0x11A5: +case 0x13A5: +case 0x15A5: +case 0x17A5: +case 0x19A5: +case 0x1BA5: +case 0x1DA5: +case 0x1FA5: +case 0x11A6: +case 0x13A6: +case 0x15A6: +case 0x17A6: +case 0x19A6: +case 0x1BA6: +case 0x1DA6: +case 0x1FA6: + +// MOVEB +case 0x11A0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11E1: +case 0x11E2: +case 0x11E3: +case 0x11E4: +case 0x11E5: +case 0x11E6: + +// MOVEB +case 0x11E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13E1: +case 0x13E2: +case 0x13E3: +case 0x13E4: +case 0x13E5: +case 0x13E6: + +// MOVEB +case 0x13E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1EE1: +case 0x1EE2: +case 0x1EE3: +case 0x1EE4: +case 0x1EE5: +case 0x1EE6: + +// MOVEB +case 0x1EE0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F21: +case 0x1F22: +case 0x1F23: +case 0x1F24: +case 0x1F25: +case 0x1F26: + +// MOVEB +case 0x1F20: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1228: +case 0x1428: +case 0x1628: +case 0x1828: +case 0x1A28: +case 0x1C28: +case 0x1E28: +case 0x1029: +case 0x1229: +case 0x1429: +case 0x1629: +case 0x1829: +case 0x1A29: +case 0x1C29: +case 0x1E29: +case 0x102A: +case 0x122A: +case 0x142A: +case 0x162A: +case 0x182A: +case 0x1A2A: +case 0x1C2A: +case 0x1E2A: +case 0x102B: +case 0x122B: +case 0x142B: +case 0x162B: +case 0x182B: +case 0x1A2B: +case 0x1C2B: +case 0x1E2B: +case 0x102C: +case 0x122C: +case 0x142C: +case 0x162C: +case 0x182C: +case 0x1A2C: +case 0x1C2C: +case 0x1E2C: +case 0x102D: +case 0x122D: +case 0x142D: +case 0x162D: +case 0x182D: +case 0x1A2D: +case 0x1C2D: +case 0x1E2D: +case 0x102E: +case 0x122E: +case 0x142E: +case 0x162E: +case 0x182E: +case 0x1A2E: +case 0x1C2E: +case 0x1E2E: +case 0x102F: +case 0x122F: +case 0x142F: +case 0x162F: +case 0x182F: +case 0x1A2F: +case 0x1C2F: +case 0x1E2F: + +// MOVEB +case 0x1028: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12A8: +case 0x14A8: +case 0x16A8: +case 0x18A8: +case 0x1AA8: +case 0x1CA8: +case 0x1EA8: +case 0x10A9: +case 0x12A9: +case 0x14A9: +case 0x16A9: +case 0x18A9: +case 0x1AA9: +case 0x1CA9: +case 0x1EA9: +case 0x10AA: +case 0x12AA: +case 0x14AA: +case 0x16AA: +case 0x18AA: +case 0x1AAA: +case 0x1CAA: +case 0x1EAA: +case 0x10AB: +case 0x12AB: +case 0x14AB: +case 0x16AB: +case 0x18AB: +case 0x1AAB: +case 0x1CAB: +case 0x1EAB: +case 0x10AC: +case 0x12AC: +case 0x14AC: +case 0x16AC: +case 0x18AC: +case 0x1AAC: +case 0x1CAC: +case 0x1EAC: +case 0x10AD: +case 0x12AD: +case 0x14AD: +case 0x16AD: +case 0x18AD: +case 0x1AAD: +case 0x1CAD: +case 0x1EAD: +case 0x10AE: +case 0x12AE: +case 0x14AE: +case 0x16AE: +case 0x18AE: +case 0x1AAE: +case 0x1CAE: +case 0x1EAE: +case 0x10AF: +case 0x12AF: +case 0x14AF: +case 0x16AF: +case 0x18AF: +case 0x1AAF: +case 0x1CAF: +case 0x1EAF: + +// MOVEB +case 0x10A8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12E8: +case 0x14E8: +case 0x16E8: +case 0x18E8: +case 0x1AE8: +case 0x1CE8: +case 0x10E9: +case 0x12E9: +case 0x14E9: +case 0x16E9: +case 0x18E9: +case 0x1AE9: +case 0x1CE9: +case 0x10EA: +case 0x12EA: +case 0x14EA: +case 0x16EA: +case 0x18EA: +case 0x1AEA: +case 0x1CEA: +case 0x10EB: +case 0x12EB: +case 0x14EB: +case 0x16EB: +case 0x18EB: +case 0x1AEB: +case 0x1CEB: +case 0x10EC: +case 0x12EC: +case 0x14EC: +case 0x16EC: +case 0x18EC: +case 0x1AEC: +case 0x1CEC: +case 0x10ED: +case 0x12ED: +case 0x14ED: +case 0x16ED: +case 0x18ED: +case 0x1AED: +case 0x1CED: +case 0x10EE: +case 0x12EE: +case 0x14EE: +case 0x16EE: +case 0x18EE: +case 0x1AEE: +case 0x1CEE: +case 0x10EF: +case 0x12EF: +case 0x14EF: +case 0x16EF: +case 0x18EF: +case 0x1AEF: +case 0x1CEF: + +// MOVEB +case 0x10E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1328: +case 0x1528: +case 0x1728: +case 0x1928: +case 0x1B28: +case 0x1D28: +case 0x1129: +case 0x1329: +case 0x1529: +case 0x1729: +case 0x1929: +case 0x1B29: +case 0x1D29: +case 0x112A: +case 0x132A: +case 0x152A: +case 0x172A: +case 0x192A: +case 0x1B2A: +case 0x1D2A: +case 0x112B: +case 0x132B: +case 0x152B: +case 0x172B: +case 0x192B: +case 0x1B2B: +case 0x1D2B: +case 0x112C: +case 0x132C: +case 0x152C: +case 0x172C: +case 0x192C: +case 0x1B2C: +case 0x1D2C: +case 0x112D: +case 0x132D: +case 0x152D: +case 0x172D: +case 0x192D: +case 0x1B2D: +case 0x1D2D: +case 0x112E: +case 0x132E: +case 0x152E: +case 0x172E: +case 0x192E: +case 0x1B2E: +case 0x1D2E: +case 0x112F: +case 0x132F: +case 0x152F: +case 0x172F: +case 0x192F: +case 0x1B2F: +case 0x1D2F: + +// MOVEB +case 0x1128: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1368: +case 0x1568: +case 0x1768: +case 0x1968: +case 0x1B68: +case 0x1D68: +case 0x1F68: +case 0x1169: +case 0x1369: +case 0x1569: +case 0x1769: +case 0x1969: +case 0x1B69: +case 0x1D69: +case 0x1F69: +case 0x116A: +case 0x136A: +case 0x156A: +case 0x176A: +case 0x196A: +case 0x1B6A: +case 0x1D6A: +case 0x1F6A: +case 0x116B: +case 0x136B: +case 0x156B: +case 0x176B: +case 0x196B: +case 0x1B6B: +case 0x1D6B: +case 0x1F6B: +case 0x116C: +case 0x136C: +case 0x156C: +case 0x176C: +case 0x196C: +case 0x1B6C: +case 0x1D6C: +case 0x1F6C: +case 0x116D: +case 0x136D: +case 0x156D: +case 0x176D: +case 0x196D: +case 0x1B6D: +case 0x1D6D: +case 0x1F6D: +case 0x116E: +case 0x136E: +case 0x156E: +case 0x176E: +case 0x196E: +case 0x1B6E: +case 0x1D6E: +case 0x1F6E: +case 0x116F: +case 0x136F: +case 0x156F: +case 0x176F: +case 0x196F: +case 0x1B6F: +case 0x1D6F: +case 0x1F6F: + +// MOVEB +case 0x1168: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13A8: +case 0x15A8: +case 0x17A8: +case 0x19A8: +case 0x1BA8: +case 0x1DA8: +case 0x1FA8: +case 0x11A9: +case 0x13A9: +case 0x15A9: +case 0x17A9: +case 0x19A9: +case 0x1BA9: +case 0x1DA9: +case 0x1FA9: +case 0x11AA: +case 0x13AA: +case 0x15AA: +case 0x17AA: +case 0x19AA: +case 0x1BAA: +case 0x1DAA: +case 0x1FAA: +case 0x11AB: +case 0x13AB: +case 0x15AB: +case 0x17AB: +case 0x19AB: +case 0x1BAB: +case 0x1DAB: +case 0x1FAB: +case 0x11AC: +case 0x13AC: +case 0x15AC: +case 0x17AC: +case 0x19AC: +case 0x1BAC: +case 0x1DAC: +case 0x1FAC: +case 0x11AD: +case 0x13AD: +case 0x15AD: +case 0x17AD: +case 0x19AD: +case 0x1BAD: +case 0x1DAD: +case 0x1FAD: +case 0x11AE: +case 0x13AE: +case 0x15AE: +case 0x17AE: +case 0x19AE: +case 0x1BAE: +case 0x1DAE: +case 0x1FAE: +case 0x11AF: +case 0x13AF: +case 0x15AF: +case 0x17AF: +case 0x19AF: +case 0x1BAF: +case 0x1DAF: +case 0x1FAF: + +// MOVEB +case 0x11A8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11E9: +case 0x11EA: +case 0x11EB: +case 0x11EC: +case 0x11ED: +case 0x11EE: +case 0x11EF: + +// MOVEB +case 0x11E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13E9: +case 0x13EA: +case 0x13EB: +case 0x13EC: +case 0x13ED: +case 0x13EE: +case 0x13EF: + +// MOVEB +case 0x13E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1EE9: +case 0x1EEA: +case 0x1EEB: +case 0x1EEC: +case 0x1EED: +case 0x1EEE: +case 0x1EEF: + +// MOVEB +case 0x1EE8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F29: +case 0x1F2A: +case 0x1F2B: +case 0x1F2C: +case 0x1F2D: +case 0x1F2E: +case 0x1F2F: + +// MOVEB +case 0x1F28: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1230: +case 0x1430: +case 0x1630: +case 0x1830: +case 0x1A30: +case 0x1C30: +case 0x1E30: +case 0x1031: +case 0x1231: +case 0x1431: +case 0x1631: +case 0x1831: +case 0x1A31: +case 0x1C31: +case 0x1E31: +case 0x1032: +case 0x1232: +case 0x1432: +case 0x1632: +case 0x1832: +case 0x1A32: +case 0x1C32: +case 0x1E32: +case 0x1033: +case 0x1233: +case 0x1433: +case 0x1633: +case 0x1833: +case 0x1A33: +case 0x1C33: +case 0x1E33: +case 0x1034: +case 0x1234: +case 0x1434: +case 0x1634: +case 0x1834: +case 0x1A34: +case 0x1C34: +case 0x1E34: +case 0x1035: +case 0x1235: +case 0x1435: +case 0x1635: +case 0x1835: +case 0x1A35: +case 0x1C35: +case 0x1E35: +case 0x1036: +case 0x1236: +case 0x1436: +case 0x1636: +case 0x1836: +case 0x1A36: +case 0x1C36: +case 0x1E36: +case 0x1037: +case 0x1237: +case 0x1437: +case 0x1637: +case 0x1837: +case 0x1A37: +case 0x1C37: +case 0x1E37: + +// MOVEB +case 0x1030: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12B0: +case 0x14B0: +case 0x16B0: +case 0x18B0: +case 0x1AB0: +case 0x1CB0: +case 0x1EB0: +case 0x10B1: +case 0x12B1: +case 0x14B1: +case 0x16B1: +case 0x18B1: +case 0x1AB1: +case 0x1CB1: +case 0x1EB1: +case 0x10B2: +case 0x12B2: +case 0x14B2: +case 0x16B2: +case 0x18B2: +case 0x1AB2: +case 0x1CB2: +case 0x1EB2: +case 0x10B3: +case 0x12B3: +case 0x14B3: +case 0x16B3: +case 0x18B3: +case 0x1AB3: +case 0x1CB3: +case 0x1EB3: +case 0x10B4: +case 0x12B4: +case 0x14B4: +case 0x16B4: +case 0x18B4: +case 0x1AB4: +case 0x1CB4: +case 0x1EB4: +case 0x10B5: +case 0x12B5: +case 0x14B5: +case 0x16B5: +case 0x18B5: +case 0x1AB5: +case 0x1CB5: +case 0x1EB5: +case 0x10B6: +case 0x12B6: +case 0x14B6: +case 0x16B6: +case 0x18B6: +case 0x1AB6: +case 0x1CB6: +case 0x1EB6: +case 0x10B7: +case 0x12B7: +case 0x14B7: +case 0x16B7: +case 0x18B7: +case 0x1AB7: +case 0x1CB7: +case 0x1EB7: + +// MOVEB +case 0x10B0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12F0: +case 0x14F0: +case 0x16F0: +case 0x18F0: +case 0x1AF0: +case 0x1CF0: +case 0x10F1: +case 0x12F1: +case 0x14F1: +case 0x16F1: +case 0x18F1: +case 0x1AF1: +case 0x1CF1: +case 0x10F2: +case 0x12F2: +case 0x14F2: +case 0x16F2: +case 0x18F2: +case 0x1AF2: +case 0x1CF2: +case 0x10F3: +case 0x12F3: +case 0x14F3: +case 0x16F3: +case 0x18F3: +case 0x1AF3: +case 0x1CF3: +case 0x10F4: +case 0x12F4: +case 0x14F4: +case 0x16F4: +case 0x18F4: +case 0x1AF4: +case 0x1CF4: +case 0x10F5: +case 0x12F5: +case 0x14F5: +case 0x16F5: +case 0x18F5: +case 0x1AF5: +case 0x1CF5: +case 0x10F6: +case 0x12F6: +case 0x14F6: +case 0x16F6: +case 0x18F6: +case 0x1AF6: +case 0x1CF6: +case 0x10F7: +case 0x12F7: +case 0x14F7: +case 0x16F7: +case 0x18F7: +case 0x1AF7: +case 0x1CF7: + +// MOVEB +case 0x10F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1330: +case 0x1530: +case 0x1730: +case 0x1930: +case 0x1B30: +case 0x1D30: +case 0x1131: +case 0x1331: +case 0x1531: +case 0x1731: +case 0x1931: +case 0x1B31: +case 0x1D31: +case 0x1132: +case 0x1332: +case 0x1532: +case 0x1732: +case 0x1932: +case 0x1B32: +case 0x1D32: +case 0x1133: +case 0x1333: +case 0x1533: +case 0x1733: +case 0x1933: +case 0x1B33: +case 0x1D33: +case 0x1134: +case 0x1334: +case 0x1534: +case 0x1734: +case 0x1934: +case 0x1B34: +case 0x1D34: +case 0x1135: +case 0x1335: +case 0x1535: +case 0x1735: +case 0x1935: +case 0x1B35: +case 0x1D35: +case 0x1136: +case 0x1336: +case 0x1536: +case 0x1736: +case 0x1936: +case 0x1B36: +case 0x1D36: +case 0x1137: +case 0x1337: +case 0x1537: +case 0x1737: +case 0x1937: +case 0x1B37: +case 0x1D37: + +// MOVEB +case 0x1130: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1370: +case 0x1570: +case 0x1770: +case 0x1970: +case 0x1B70: +case 0x1D70: +case 0x1F70: +case 0x1171: +case 0x1371: +case 0x1571: +case 0x1771: +case 0x1971: +case 0x1B71: +case 0x1D71: +case 0x1F71: +case 0x1172: +case 0x1372: +case 0x1572: +case 0x1772: +case 0x1972: +case 0x1B72: +case 0x1D72: +case 0x1F72: +case 0x1173: +case 0x1373: +case 0x1573: +case 0x1773: +case 0x1973: +case 0x1B73: +case 0x1D73: +case 0x1F73: +case 0x1174: +case 0x1374: +case 0x1574: +case 0x1774: +case 0x1974: +case 0x1B74: +case 0x1D74: +case 0x1F74: +case 0x1175: +case 0x1375: +case 0x1575: +case 0x1775: +case 0x1975: +case 0x1B75: +case 0x1D75: +case 0x1F75: +case 0x1176: +case 0x1376: +case 0x1576: +case 0x1776: +case 0x1976: +case 0x1B76: +case 0x1D76: +case 0x1F76: +case 0x1177: +case 0x1377: +case 0x1577: +case 0x1777: +case 0x1977: +case 0x1B77: +case 0x1D77: +case 0x1F77: + +// MOVEB +case 0x1170: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13B0: +case 0x15B0: +case 0x17B0: +case 0x19B0: +case 0x1BB0: +case 0x1DB0: +case 0x1FB0: +case 0x11B1: +case 0x13B1: +case 0x15B1: +case 0x17B1: +case 0x19B1: +case 0x1BB1: +case 0x1DB1: +case 0x1FB1: +case 0x11B2: +case 0x13B2: +case 0x15B2: +case 0x17B2: +case 0x19B2: +case 0x1BB2: +case 0x1DB2: +case 0x1FB2: +case 0x11B3: +case 0x13B3: +case 0x15B3: +case 0x17B3: +case 0x19B3: +case 0x1BB3: +case 0x1DB3: +case 0x1FB3: +case 0x11B4: +case 0x13B4: +case 0x15B4: +case 0x17B4: +case 0x19B4: +case 0x1BB4: +case 0x1DB4: +case 0x1FB4: +case 0x11B5: +case 0x13B5: +case 0x15B5: +case 0x17B5: +case 0x19B5: +case 0x1BB5: +case 0x1DB5: +case 0x1FB5: +case 0x11B6: +case 0x13B6: +case 0x15B6: +case 0x17B6: +case 0x19B6: +case 0x1BB6: +case 0x1DB6: +case 0x1FB6: +case 0x11B7: +case 0x13B7: +case 0x15B7: +case 0x17B7: +case 0x19B7: +case 0x1BB7: +case 0x1DB7: +case 0x1FB7: + +// MOVEB +case 0x11B0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x11F1: +case 0x11F2: +case 0x11F3: +case 0x11F4: +case 0x11F5: +case 0x11F6: +case 0x11F7: + +// MOVEB +case 0x11F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13F1: +case 0x13F2: +case 0x13F3: +case 0x13F4: +case 0x13F5: +case 0x13F6: +case 0x13F7: + +// MOVEB +case 0x13F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1EF1: +case 0x1EF2: +case 0x1EF3: +case 0x1EF4: +case 0x1EF5: +case 0x1EF6: +case 0x1EF7: + +// MOVEB +case 0x1EF0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1F31: +case 0x1F32: +case 0x1F33: +case 0x1F34: +case 0x1F35: +case 0x1F36: +case 0x1F37: + +// MOVEB +case 0x1F30: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1238: +case 0x1438: +case 0x1638: +case 0x1838: +case 0x1A38: +case 0x1C38: +case 0x1E38: + +// MOVEB +case 0x1038: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12B8: +case 0x14B8: +case 0x16B8: +case 0x18B8: +case 0x1AB8: +case 0x1CB8: +case 0x1EB8: + +// MOVEB +case 0x10B8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12F8: +case 0x14F8: +case 0x16F8: +case 0x18F8: +case 0x1AF8: +case 0x1CF8: + +// MOVEB +case 0x10F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1338: +case 0x1538: +case 0x1738: +case 0x1938: +case 0x1B38: +case 0x1D38: + +// MOVEB +case 0x1138: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1378: +case 0x1578: +case 0x1778: +case 0x1978: +case 0x1B78: +case 0x1D78: +case 0x1F78: + +// MOVEB +case 0x1178: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13B8: +case 0x15B8: +case 0x17B8: +case 0x19B8: +case 0x1BB8: +case 0x1DB8: +case 0x1FB8: + +// MOVEB +case 0x11B8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EF8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F38: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1239: +case 0x1439: +case 0x1639: +case 0x1839: +case 0x1A39: +case 0x1C39: +case 0x1E39: + +// MOVEB +case 0x1039: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12B9: +case 0x14B9: +case 0x16B9: +case 0x18B9: +case 0x1AB9: +case 0x1CB9: +case 0x1EB9: + +// MOVEB +case 0x10B9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12F9: +case 0x14F9: +case 0x16F9: +case 0x18F9: +case 0x1AF9: +case 0x1CF9: + +// MOVEB +case 0x10F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1339: +case 0x1539: +case 0x1739: +case 0x1939: +case 0x1B39: +case 0x1D39: + +// MOVEB +case 0x1139: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1379: +case 0x1579: +case 0x1779: +case 0x1979: +case 0x1B79: +case 0x1D79: +case 0x1F79: + +// MOVEB +case 0x1179: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13B9: +case 0x15B9: +case 0x17B9: +case 0x19B9: +case 0x1BB9: +case 0x1DB9: +case 0x1FB9: + +// MOVEB +case 0x11B9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EF9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F39: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x123A: +case 0x143A: +case 0x163A: +case 0x183A: +case 0x1A3A: +case 0x1C3A: +case 0x1E3A: + +// MOVEB +case 0x103A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12BA: +case 0x14BA: +case 0x16BA: +case 0x18BA: +case 0x1ABA: +case 0x1CBA: +case 0x1EBA: + +// MOVEB +case 0x10BA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12FA: +case 0x14FA: +case 0x16FA: +case 0x18FA: +case 0x1AFA: +case 0x1CFA: + +// MOVEB +case 0x10FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x133A: +case 0x153A: +case 0x173A: +case 0x193A: +case 0x1B3A: +case 0x1D3A: + +// MOVEB +case 0x113A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x137A: +case 0x157A: +case 0x177A: +case 0x197A: +case 0x1B7A: +case 0x1D7A: +case 0x1F7A: + +// MOVEB +case 0x117A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13BA: +case 0x15BA: +case 0x17BA: +case 0x19BA: +case 0x1BBA: +case 0x1DBA: +case 0x1FBA: + +// MOVEB +case 0x11BA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EFA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F3A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x123B: +case 0x143B: +case 0x163B: +case 0x183B: +case 0x1A3B: +case 0x1C3B: +case 0x1E3B: + +// MOVEB +case 0x103B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12BB: +case 0x14BB: +case 0x16BB: +case 0x18BB: +case 0x1ABB: +case 0x1CBB: +case 0x1EBB: + +// MOVEB +case 0x10BB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12FB: +case 0x14FB: +case 0x16FB: +case 0x18FB: +case 0x1AFB: +case 0x1CFB: + +// MOVEB +case 0x10FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x133B: +case 0x153B: +case 0x173B: +case 0x193B: +case 0x1B3B: +case 0x1D3B: + +// MOVEB +case 0x113B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x137B: +case 0x157B: +case 0x177B: +case 0x197B: +case 0x1B7B: +case 0x1D7B: +case 0x1F7B: + +// MOVEB +case 0x117B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13BB: +case 0x15BB: +case 0x17BB: +case 0x19BB: +case 0x1BBB: +case 0x1DBB: +case 0x1FBB: + +// MOVEB +case 0x11BB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EFB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F3B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x123C: +case 0x143C: +case 0x163C: +case 0x183C: +case 0x1A3C: +case 0x1C3C: +case 0x1E3C: + +// MOVEB +case 0x103C: +{ + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x12BC: +case 0x14BC: +case 0x16BC: +case 0x18BC: +case 0x1ABC: +case 0x1CBC: +case 0x1EBC: + +// MOVEB +case 0x10BC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12FC: +case 0x14FC: +case 0x16FC: +case 0x18FC: +case 0x1AFC: +case 0x1CFC: + +// MOVEB +case 0x10FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x133C: +case 0x153C: +case 0x173C: +case 0x193C: +case 0x1B3C: +case 0x1D3C: + +// MOVEB +case 0x113C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x137C: +case 0x157C: +case 0x177C: +case 0x197C: +case 0x1B7C: +case 0x1D7C: +case 0x1F7C: + +// MOVEB +case 0x117C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13BC: +case 0x15BC: +case 0x17BC: +case 0x19BC: +case 0x1BBC: +case 0x1DBC: +case 0x1FBC: + +// MOVEB +case 0x11BC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 10; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EFC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F3C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_BYTE; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x121F: +case 0x141F: +case 0x161F: +case 0x181F: +case 0x1A1F: +case 0x1C1F: +case 0x1E1F: + +// MOVEB +case 0x101F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x129F: +case 0x149F: +case 0x169F: +case 0x189F: +case 0x1A9F: +case 0x1C9F: +case 0x1E9F: + +// MOVEB +case 0x109F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12DF: +case 0x14DF: +case 0x16DF: +case 0x18DF: +case 0x1ADF: +case 0x1CDF: + +// MOVEB +case 0x10DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x131F: +case 0x151F: +case 0x171F: +case 0x191F: +case 0x1B1F: +case 0x1D1F: + +// MOVEB +case 0x111F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x135F: +case 0x155F: +case 0x175F: +case 0x195F: +case 0x1B5F: +case 0x1D5F: +case 0x1F5F: + +// MOVEB +case 0x115F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x139F: +case 0x159F: +case 0x179F: +case 0x199F: +case 0x1B9F: +case 0x1D9F: +case 0x1F9F: + +// MOVEB +case 0x119F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EDF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F1F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1227: +case 0x1427: +case 0x1627: +case 0x1827: +case 0x1A27: +case 0x1C27: +case 0x1E27: + +// MOVEB +case 0x1027: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x12A7: +case 0x14A7: +case 0x16A7: +case 0x18A7: +case 0x1AA7: +case 0x1CA7: +case 0x1EA7: + +// MOVEB +case 0x10A7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x12E7: +case 0x14E7: +case 0x16E7: +case 0x18E7: +case 0x1AE7: +case 0x1CE7: + +// MOVEB +case 0x10E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1327: +case 0x1527: +case 0x1727: +case 0x1927: +case 0x1B27: +case 0x1D27: + +// MOVEB +case 0x1127: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x1367: +case 0x1567: +case 0x1767: +case 0x1967: +case 0x1B67: +case 0x1D67: +case 0x1F67: + +// MOVEB +case 0x1167: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x13A7: +case 0x15A7: +case 0x17A7: +case 0x19A7: +case 0x1BA7: +case 0x1DA7: +case 0x1FA7: + +// MOVEB +case 0x11A7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x11E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x13E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1EE7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_BYat_F(adr, res) +} +RET(0) + +// MOVEB +case 0x1F27: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_BYat_F(adr, res) +} +RET(0) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op2.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op2.inc new file mode 100644 index 0000000000..d67c6a3685 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op2.inc @@ -0,0 +1,6247 @@ +case 0x2200: +case 0x2400: +case 0x2600: +case 0x2800: +case 0x2A00: +case 0x2C00: +case 0x2E00: +case 0x2001: +case 0x2201: +case 0x2401: +case 0x2601: +case 0x2801: +case 0x2A01: +case 0x2C01: +case 0x2E01: +case 0x2002: +case 0x2202: +case 0x2402: +case 0x2602: +case 0x2802: +case 0x2A02: +case 0x2C02: +case 0x2E02: +case 0x2003: +case 0x2203: +case 0x2403: +case 0x2603: +case 0x2803: +case 0x2A03: +case 0x2C03: +case 0x2E03: +case 0x2004: +case 0x2204: +case 0x2404: +case 0x2604: +case 0x2804: +case 0x2A04: +case 0x2C04: +case 0x2E04: +case 0x2005: +case 0x2205: +case 0x2405: +case 0x2605: +case 0x2805: +case 0x2A05: +case 0x2C05: +case 0x2E05: +case 0x2006: +case 0x2206: +case 0x2406: +case 0x2606: +case 0x2806: +case 0x2A06: +case 0x2C06: +case 0x2E06: +case 0x2007: +case 0x2207: +case 0x2407: +case 0x2607: +case 0x2807: +case 0x2A07: +case 0x2C07: +case 0x2E07: + +// MOVEL +case 0x2000: +{ + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x2280: +case 0x2480: +case 0x2680: +case 0x2880: +case 0x2A80: +case 0x2C80: +case 0x2E80: +case 0x2081: +case 0x2281: +case 0x2481: +case 0x2681: +case 0x2881: +case 0x2A81: +case 0x2C81: +case 0x2E81: +case 0x2082: +case 0x2282: +case 0x2482: +case 0x2682: +case 0x2882: +case 0x2A82: +case 0x2C82: +case 0x2E82: +case 0x2083: +case 0x2283: +case 0x2483: +case 0x2683: +case 0x2883: +case 0x2A83: +case 0x2C83: +case 0x2E83: +case 0x2084: +case 0x2284: +case 0x2484: +case 0x2684: +case 0x2884: +case 0x2A84: +case 0x2C84: +case 0x2E84: +case 0x2085: +case 0x2285: +case 0x2485: +case 0x2685: +case 0x2885: +case 0x2A85: +case 0x2C85: +case 0x2E85: +case 0x2086: +case 0x2286: +case 0x2486: +case 0x2686: +case 0x2886: +case 0x2A86: +case 0x2C86: +case 0x2E86: +case 0x2087: +case 0x2287: +case 0x2487: +case 0x2687: +case 0x2887: +case 0x2A87: +case 0x2C87: +case 0x2E87: + +// MOVEL +case 0x2080: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22C0: +case 0x24C0: +case 0x26C0: +case 0x28C0: +case 0x2AC0: +case 0x2CC0: +case 0x20C1: +case 0x22C1: +case 0x24C1: +case 0x26C1: +case 0x28C1: +case 0x2AC1: +case 0x2CC1: +case 0x20C2: +case 0x22C2: +case 0x24C2: +case 0x26C2: +case 0x28C2: +case 0x2AC2: +case 0x2CC2: +case 0x20C3: +case 0x22C3: +case 0x24C3: +case 0x26C3: +case 0x28C3: +case 0x2AC3: +case 0x2CC3: +case 0x20C4: +case 0x22C4: +case 0x24C4: +case 0x26C4: +case 0x28C4: +case 0x2AC4: +case 0x2CC4: +case 0x20C5: +case 0x22C5: +case 0x24C5: +case 0x26C5: +case 0x28C5: +case 0x2AC5: +case 0x2CC5: +case 0x20C6: +case 0x22C6: +case 0x24C6: +case 0x26C6: +case 0x28C6: +case 0x2AC6: +case 0x2CC6: +case 0x20C7: +case 0x22C7: +case 0x24C7: +case 0x26C7: +case 0x28C7: +case 0x2AC7: +case 0x2CC7: + +// MOVEL +case 0x20C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2300: +case 0x2500: +case 0x2700: +case 0x2900: +case 0x2B00: +case 0x2D00: +case 0x2101: +case 0x2301: +case 0x2501: +case 0x2701: +case 0x2901: +case 0x2B01: +case 0x2D01: +case 0x2102: +case 0x2302: +case 0x2502: +case 0x2702: +case 0x2902: +case 0x2B02: +case 0x2D02: +case 0x2103: +case 0x2303: +case 0x2503: +case 0x2703: +case 0x2903: +case 0x2B03: +case 0x2D03: +case 0x2104: +case 0x2304: +case 0x2504: +case 0x2704: +case 0x2904: +case 0x2B04: +case 0x2D04: +case 0x2105: +case 0x2305: +case 0x2505: +case 0x2705: +case 0x2905: +case 0x2B05: +case 0x2D05: +case 0x2106: +case 0x2306: +case 0x2506: +case 0x2706: +case 0x2906: +case 0x2B06: +case 0x2D06: +case 0x2107: +case 0x2307: +case 0x2507: +case 0x2707: +case 0x2907: +case 0x2B07: +case 0x2D07: + +// MOVEL +case 0x2100: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2340: +case 0x2540: +case 0x2740: +case 0x2940: +case 0x2B40: +case 0x2D40: +case 0x2F40: +case 0x2141: +case 0x2341: +case 0x2541: +case 0x2741: +case 0x2941: +case 0x2B41: +case 0x2D41: +case 0x2F41: +case 0x2142: +case 0x2342: +case 0x2542: +case 0x2742: +case 0x2942: +case 0x2B42: +case 0x2D42: +case 0x2F42: +case 0x2143: +case 0x2343: +case 0x2543: +case 0x2743: +case 0x2943: +case 0x2B43: +case 0x2D43: +case 0x2F43: +case 0x2144: +case 0x2344: +case 0x2544: +case 0x2744: +case 0x2944: +case 0x2B44: +case 0x2D44: +case 0x2F44: +case 0x2145: +case 0x2345: +case 0x2545: +case 0x2745: +case 0x2945: +case 0x2B45: +case 0x2D45: +case 0x2F45: +case 0x2146: +case 0x2346: +case 0x2546: +case 0x2746: +case 0x2946: +case 0x2B46: +case 0x2D46: +case 0x2F46: +case 0x2147: +case 0x2347: +case 0x2547: +case 0x2747: +case 0x2947: +case 0x2B47: +case 0x2D47: +case 0x2F47: + +// MOVEL +case 0x2140: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2380: +case 0x2580: +case 0x2780: +case 0x2980: +case 0x2B80: +case 0x2D80: +case 0x2F80: +case 0x2181: +case 0x2381: +case 0x2581: +case 0x2781: +case 0x2981: +case 0x2B81: +case 0x2D81: +case 0x2F81: +case 0x2182: +case 0x2382: +case 0x2582: +case 0x2782: +case 0x2982: +case 0x2B82: +case 0x2D82: +case 0x2F82: +case 0x2183: +case 0x2383: +case 0x2583: +case 0x2783: +case 0x2983: +case 0x2B83: +case 0x2D83: +case 0x2F83: +case 0x2184: +case 0x2384: +case 0x2584: +case 0x2784: +case 0x2984: +case 0x2B84: +case 0x2D84: +case 0x2F84: +case 0x2185: +case 0x2385: +case 0x2585: +case 0x2785: +case 0x2985: +case 0x2B85: +case 0x2D85: +case 0x2F85: +case 0x2186: +case 0x2386: +case 0x2586: +case 0x2786: +case 0x2986: +case 0x2B86: +case 0x2D86: +case 0x2F86: +case 0x2187: +case 0x2387: +case 0x2587: +case 0x2787: +case 0x2987: +case 0x2B87: +case 0x2D87: +case 0x2F87: + +// MOVEL +case 0x2180: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21C1: +case 0x21C2: +case 0x21C3: +case 0x21C4: +case 0x21C5: +case 0x21C6: +case 0x21C7: + +// MOVEL +case 0x21C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23C1: +case 0x23C2: +case 0x23C3: +case 0x23C4: +case 0x23C5: +case 0x23C6: +case 0x23C7: + +// MOVEL +case 0x23C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2EC1: +case 0x2EC2: +case 0x2EC3: +case 0x2EC4: +case 0x2EC5: +case 0x2EC6: +case 0x2EC7: + +// MOVEL +case 0x2EC0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F01: +case 0x2F02: +case 0x2F03: +case 0x2F04: +case 0x2F05: +case 0x2F06: +case 0x2F07: + +// MOVEL +case 0x2F00: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2208: +case 0x2408: +case 0x2608: +case 0x2808: +case 0x2A08: +case 0x2C08: +case 0x2E08: +case 0x2009: +case 0x2209: +case 0x2409: +case 0x2609: +case 0x2809: +case 0x2A09: +case 0x2C09: +case 0x2E09: +case 0x200A: +case 0x220A: +case 0x240A: +case 0x260A: +case 0x280A: +case 0x2A0A: +case 0x2C0A: +case 0x2E0A: +case 0x200B: +case 0x220B: +case 0x240B: +case 0x260B: +case 0x280B: +case 0x2A0B: +case 0x2C0B: +case 0x2E0B: +case 0x200C: +case 0x220C: +case 0x240C: +case 0x260C: +case 0x280C: +case 0x2A0C: +case 0x2C0C: +case 0x2E0C: +case 0x200D: +case 0x220D: +case 0x240D: +case 0x260D: +case 0x280D: +case 0x2A0D: +case 0x2C0D: +case 0x2E0D: +case 0x200E: +case 0x220E: +case 0x240E: +case 0x260E: +case 0x280E: +case 0x2A0E: +case 0x2C0E: +case 0x2E0E: +case 0x200F: +case 0x220F: +case 0x240F: +case 0x260F: +case 0x280F: +case 0x2A0F: +case 0x2C0F: +case 0x2E0F: + +// MOVEL +case 0x2008: +{ + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x2288: +case 0x2488: +case 0x2688: +case 0x2888: +case 0x2A88: +case 0x2C88: +case 0x2E88: +case 0x2089: +case 0x2289: +case 0x2489: +case 0x2689: +case 0x2889: +case 0x2A89: +case 0x2C89: +case 0x2E89: +case 0x208A: +case 0x228A: +case 0x248A: +case 0x268A: +case 0x288A: +case 0x2A8A: +case 0x2C8A: +case 0x2E8A: +case 0x208B: +case 0x228B: +case 0x248B: +case 0x268B: +case 0x288B: +case 0x2A8B: +case 0x2C8B: +case 0x2E8B: +case 0x208C: +case 0x228C: +case 0x248C: +case 0x268C: +case 0x288C: +case 0x2A8C: +case 0x2C8C: +case 0x2E8C: +case 0x208D: +case 0x228D: +case 0x248D: +case 0x268D: +case 0x288D: +case 0x2A8D: +case 0x2C8D: +case 0x2E8D: +case 0x208E: +case 0x228E: +case 0x248E: +case 0x268E: +case 0x288E: +case 0x2A8E: +case 0x2C8E: +case 0x2E8E: +case 0x208F: +case 0x228F: +case 0x248F: +case 0x268F: +case 0x288F: +case 0x2A8F: +case 0x2C8F: +case 0x2E8F: + +// MOVEL +case 0x2088: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22C8: +case 0x24C8: +case 0x26C8: +case 0x28C8: +case 0x2AC8: +case 0x2CC8: +case 0x20C9: +case 0x22C9: +case 0x24C9: +case 0x26C9: +case 0x28C9: +case 0x2AC9: +case 0x2CC9: +case 0x20CA: +case 0x22CA: +case 0x24CA: +case 0x26CA: +case 0x28CA: +case 0x2ACA: +case 0x2CCA: +case 0x20CB: +case 0x22CB: +case 0x24CB: +case 0x26CB: +case 0x28CB: +case 0x2ACB: +case 0x2CCB: +case 0x20CC: +case 0x22CC: +case 0x24CC: +case 0x26CC: +case 0x28CC: +case 0x2ACC: +case 0x2CCC: +case 0x20CD: +case 0x22CD: +case 0x24CD: +case 0x26CD: +case 0x28CD: +case 0x2ACD: +case 0x2CCD: +case 0x20CE: +case 0x22CE: +case 0x24CE: +case 0x26CE: +case 0x28CE: +case 0x2ACE: +case 0x2CCE: +case 0x20CF: +case 0x22CF: +case 0x24CF: +case 0x26CF: +case 0x28CF: +case 0x2ACF: +case 0x2CCF: + +// MOVEL +case 0x20C8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2308: +case 0x2508: +case 0x2708: +case 0x2908: +case 0x2B08: +case 0x2D08: +case 0x2109: +case 0x2309: +case 0x2509: +case 0x2709: +case 0x2909: +case 0x2B09: +case 0x2D09: +case 0x210A: +case 0x230A: +case 0x250A: +case 0x270A: +case 0x290A: +case 0x2B0A: +case 0x2D0A: +case 0x210B: +case 0x230B: +case 0x250B: +case 0x270B: +case 0x290B: +case 0x2B0B: +case 0x2D0B: +case 0x210C: +case 0x230C: +case 0x250C: +case 0x270C: +case 0x290C: +case 0x2B0C: +case 0x2D0C: +case 0x210D: +case 0x230D: +case 0x250D: +case 0x270D: +case 0x290D: +case 0x2B0D: +case 0x2D0D: +case 0x210E: +case 0x230E: +case 0x250E: +case 0x270E: +case 0x290E: +case 0x2B0E: +case 0x2D0E: +case 0x210F: +case 0x230F: +case 0x250F: +case 0x270F: +case 0x290F: +case 0x2B0F: +case 0x2D0F: + +// MOVEL +case 0x2108: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2348: +case 0x2548: +case 0x2748: +case 0x2948: +case 0x2B48: +case 0x2D48: +case 0x2F48: +case 0x2149: +case 0x2349: +case 0x2549: +case 0x2749: +case 0x2949: +case 0x2B49: +case 0x2D49: +case 0x2F49: +case 0x214A: +case 0x234A: +case 0x254A: +case 0x274A: +case 0x294A: +case 0x2B4A: +case 0x2D4A: +case 0x2F4A: +case 0x214B: +case 0x234B: +case 0x254B: +case 0x274B: +case 0x294B: +case 0x2B4B: +case 0x2D4B: +case 0x2F4B: +case 0x214C: +case 0x234C: +case 0x254C: +case 0x274C: +case 0x294C: +case 0x2B4C: +case 0x2D4C: +case 0x2F4C: +case 0x214D: +case 0x234D: +case 0x254D: +case 0x274D: +case 0x294D: +case 0x2B4D: +case 0x2D4D: +case 0x2F4D: +case 0x214E: +case 0x234E: +case 0x254E: +case 0x274E: +case 0x294E: +case 0x2B4E: +case 0x2D4E: +case 0x2F4E: +case 0x214F: +case 0x234F: +case 0x254F: +case 0x274F: +case 0x294F: +case 0x2B4F: +case 0x2D4F: +case 0x2F4F: + +// MOVEL +case 0x2148: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2388: +case 0x2588: +case 0x2788: +case 0x2988: +case 0x2B88: +case 0x2D88: +case 0x2F88: +case 0x2189: +case 0x2389: +case 0x2589: +case 0x2789: +case 0x2989: +case 0x2B89: +case 0x2D89: +case 0x2F89: +case 0x218A: +case 0x238A: +case 0x258A: +case 0x278A: +case 0x298A: +case 0x2B8A: +case 0x2D8A: +case 0x2F8A: +case 0x218B: +case 0x238B: +case 0x258B: +case 0x278B: +case 0x298B: +case 0x2B8B: +case 0x2D8B: +case 0x2F8B: +case 0x218C: +case 0x238C: +case 0x258C: +case 0x278C: +case 0x298C: +case 0x2B8C: +case 0x2D8C: +case 0x2F8C: +case 0x218D: +case 0x238D: +case 0x258D: +case 0x278D: +case 0x298D: +case 0x2B8D: +case 0x2D8D: +case 0x2F8D: +case 0x218E: +case 0x238E: +case 0x258E: +case 0x278E: +case 0x298E: +case 0x2B8E: +case 0x2D8E: +case 0x2F8E: +case 0x218F: +case 0x238F: +case 0x258F: +case 0x278F: +case 0x298F: +case 0x2B8F: +case 0x2D8F: +case 0x2F8F: + +// MOVEL +case 0x2188: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21C9: +case 0x21CA: +case 0x21CB: +case 0x21CC: +case 0x21CD: +case 0x21CE: +case 0x21CF: + +// MOVEL +case 0x21C8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23C9: +case 0x23CA: +case 0x23CB: +case 0x23CC: +case 0x23CD: +case 0x23CE: +case 0x23CF: + +// MOVEL +case 0x23C8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2EC9: +case 0x2ECA: +case 0x2ECB: +case 0x2ECC: +case 0x2ECD: +case 0x2ECE: +case 0x2ECF: + +// MOVEL +case 0x2EC8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F09: +case 0x2F0A: +case 0x2F0B: +case 0x2F0C: +case 0x2F0D: +case 0x2F0E: +case 0x2F0F: + +// MOVEL +case 0x2F08: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2210: +case 0x2410: +case 0x2610: +case 0x2810: +case 0x2A10: +case 0x2C10: +case 0x2E10: +case 0x2011: +case 0x2211: +case 0x2411: +case 0x2611: +case 0x2811: +case 0x2A11: +case 0x2C11: +case 0x2E11: +case 0x2012: +case 0x2212: +case 0x2412: +case 0x2612: +case 0x2812: +case 0x2A12: +case 0x2C12: +case 0x2E12: +case 0x2013: +case 0x2213: +case 0x2413: +case 0x2613: +case 0x2813: +case 0x2A13: +case 0x2C13: +case 0x2E13: +case 0x2014: +case 0x2214: +case 0x2414: +case 0x2614: +case 0x2814: +case 0x2A14: +case 0x2C14: +case 0x2E14: +case 0x2015: +case 0x2215: +case 0x2415: +case 0x2615: +case 0x2815: +case 0x2A15: +case 0x2C15: +case 0x2E15: +case 0x2016: +case 0x2216: +case 0x2416: +case 0x2616: +case 0x2816: +case 0x2A16: +case 0x2C16: +case 0x2E16: +case 0x2017: +case 0x2217: +case 0x2417: +case 0x2617: +case 0x2817: +case 0x2A17: +case 0x2C17: +case 0x2E17: + +// MOVEL +case 0x2010: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x2290: +case 0x2490: +case 0x2690: +case 0x2890: +case 0x2A90: +case 0x2C90: +case 0x2E90: +case 0x2091: +case 0x2291: +case 0x2491: +case 0x2691: +case 0x2891: +case 0x2A91: +case 0x2C91: +case 0x2E91: +case 0x2092: +case 0x2292: +case 0x2492: +case 0x2692: +case 0x2892: +case 0x2A92: +case 0x2C92: +case 0x2E92: +case 0x2093: +case 0x2293: +case 0x2493: +case 0x2693: +case 0x2893: +case 0x2A93: +case 0x2C93: +case 0x2E93: +case 0x2094: +case 0x2294: +case 0x2494: +case 0x2694: +case 0x2894: +case 0x2A94: +case 0x2C94: +case 0x2E94: +case 0x2095: +case 0x2295: +case 0x2495: +case 0x2695: +case 0x2895: +case 0x2A95: +case 0x2C95: +case 0x2E95: +case 0x2096: +case 0x2296: +case 0x2496: +case 0x2696: +case 0x2896: +case 0x2A96: +case 0x2C96: +case 0x2E96: +case 0x2097: +case 0x2297: +case 0x2497: +case 0x2697: +case 0x2897: +case 0x2A97: +case 0x2C97: +case 0x2E97: + +// MOVEL +case 0x2090: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22D0: +case 0x24D0: +case 0x26D0: +case 0x28D0: +case 0x2AD0: +case 0x2CD0: +case 0x20D1: +case 0x22D1: +case 0x24D1: +case 0x26D1: +case 0x28D1: +case 0x2AD1: +case 0x2CD1: +case 0x20D2: +case 0x22D2: +case 0x24D2: +case 0x26D2: +case 0x28D2: +case 0x2AD2: +case 0x2CD2: +case 0x20D3: +case 0x22D3: +case 0x24D3: +case 0x26D3: +case 0x28D3: +case 0x2AD3: +case 0x2CD3: +case 0x20D4: +case 0x22D4: +case 0x24D4: +case 0x26D4: +case 0x28D4: +case 0x2AD4: +case 0x2CD4: +case 0x20D5: +case 0x22D5: +case 0x24D5: +case 0x26D5: +case 0x28D5: +case 0x2AD5: +case 0x2CD5: +case 0x20D6: +case 0x22D6: +case 0x24D6: +case 0x26D6: +case 0x28D6: +case 0x2AD6: +case 0x2CD6: +case 0x20D7: +case 0x22D7: +case 0x24D7: +case 0x26D7: +case 0x28D7: +case 0x2AD7: +case 0x2CD7: + +// MOVEL +case 0x20D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2310: +case 0x2510: +case 0x2710: +case 0x2910: +case 0x2B10: +case 0x2D10: +case 0x2111: +case 0x2311: +case 0x2511: +case 0x2711: +case 0x2911: +case 0x2B11: +case 0x2D11: +case 0x2112: +case 0x2312: +case 0x2512: +case 0x2712: +case 0x2912: +case 0x2B12: +case 0x2D12: +case 0x2113: +case 0x2313: +case 0x2513: +case 0x2713: +case 0x2913: +case 0x2B13: +case 0x2D13: +case 0x2114: +case 0x2314: +case 0x2514: +case 0x2714: +case 0x2914: +case 0x2B14: +case 0x2D14: +case 0x2115: +case 0x2315: +case 0x2515: +case 0x2715: +case 0x2915: +case 0x2B15: +case 0x2D15: +case 0x2116: +case 0x2316: +case 0x2516: +case 0x2716: +case 0x2916: +case 0x2B16: +case 0x2D16: +case 0x2117: +case 0x2317: +case 0x2517: +case 0x2717: +case 0x2917: +case 0x2B17: +case 0x2D17: + +// MOVEL +case 0x2110: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2350: +case 0x2550: +case 0x2750: +case 0x2950: +case 0x2B50: +case 0x2D50: +case 0x2F50: +case 0x2151: +case 0x2351: +case 0x2551: +case 0x2751: +case 0x2951: +case 0x2B51: +case 0x2D51: +case 0x2F51: +case 0x2152: +case 0x2352: +case 0x2552: +case 0x2752: +case 0x2952: +case 0x2B52: +case 0x2D52: +case 0x2F52: +case 0x2153: +case 0x2353: +case 0x2553: +case 0x2753: +case 0x2953: +case 0x2B53: +case 0x2D53: +case 0x2F53: +case 0x2154: +case 0x2354: +case 0x2554: +case 0x2754: +case 0x2954: +case 0x2B54: +case 0x2D54: +case 0x2F54: +case 0x2155: +case 0x2355: +case 0x2555: +case 0x2755: +case 0x2955: +case 0x2B55: +case 0x2D55: +case 0x2F55: +case 0x2156: +case 0x2356: +case 0x2556: +case 0x2756: +case 0x2956: +case 0x2B56: +case 0x2D56: +case 0x2F56: +case 0x2157: +case 0x2357: +case 0x2557: +case 0x2757: +case 0x2957: +case 0x2B57: +case 0x2D57: +case 0x2F57: + +// MOVEL +case 0x2150: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2390: +case 0x2590: +case 0x2790: +case 0x2990: +case 0x2B90: +case 0x2D90: +case 0x2F90: +case 0x2191: +case 0x2391: +case 0x2591: +case 0x2791: +case 0x2991: +case 0x2B91: +case 0x2D91: +case 0x2F91: +case 0x2192: +case 0x2392: +case 0x2592: +case 0x2792: +case 0x2992: +case 0x2B92: +case 0x2D92: +case 0x2F92: +case 0x2193: +case 0x2393: +case 0x2593: +case 0x2793: +case 0x2993: +case 0x2B93: +case 0x2D93: +case 0x2F93: +case 0x2194: +case 0x2394: +case 0x2594: +case 0x2794: +case 0x2994: +case 0x2B94: +case 0x2D94: +case 0x2F94: +case 0x2195: +case 0x2395: +case 0x2595: +case 0x2795: +case 0x2995: +case 0x2B95: +case 0x2D95: +case 0x2F95: +case 0x2196: +case 0x2396: +case 0x2596: +case 0x2796: +case 0x2996: +case 0x2B96: +case 0x2D96: +case 0x2F96: +case 0x2197: +case 0x2397: +case 0x2597: +case 0x2797: +case 0x2997: +case 0x2B97: +case 0x2D97: +case 0x2F97: + +// MOVEL +case 0x2190: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21D1: +case 0x21D2: +case 0x21D3: +case 0x21D4: +case 0x21D5: +case 0x21D6: +case 0x21D7: + +// MOVEL +case 0x21D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23D1: +case 0x23D2: +case 0x23D3: +case 0x23D4: +case 0x23D5: +case 0x23D6: +case 0x23D7: + +// MOVEL +case 0x23D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2ED1: +case 0x2ED2: +case 0x2ED3: +case 0x2ED4: +case 0x2ED5: +case 0x2ED6: +case 0x2ED7: + +// MOVEL +case 0x2ED0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F11: +case 0x2F12: +case 0x2F13: +case 0x2F14: +case 0x2F15: +case 0x2F16: +case 0x2F17: + +// MOVEL +case 0x2F10: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2218: +case 0x2418: +case 0x2618: +case 0x2818: +case 0x2A18: +case 0x2C18: +case 0x2E18: +case 0x2019: +case 0x2219: +case 0x2419: +case 0x2619: +case 0x2819: +case 0x2A19: +case 0x2C19: +case 0x2E19: +case 0x201A: +case 0x221A: +case 0x241A: +case 0x261A: +case 0x281A: +case 0x2A1A: +case 0x2C1A: +case 0x2E1A: +case 0x201B: +case 0x221B: +case 0x241B: +case 0x261B: +case 0x281B: +case 0x2A1B: +case 0x2C1B: +case 0x2E1B: +case 0x201C: +case 0x221C: +case 0x241C: +case 0x261C: +case 0x281C: +case 0x2A1C: +case 0x2C1C: +case 0x2E1C: +case 0x201D: +case 0x221D: +case 0x241D: +case 0x261D: +case 0x281D: +case 0x2A1D: +case 0x2C1D: +case 0x2E1D: +case 0x201E: +case 0x221E: +case 0x241E: +case 0x261E: +case 0x281E: +case 0x2A1E: +case 0x2C1E: +case 0x2E1E: + +// MOVEL +case 0x2018: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x2298: +case 0x2498: +case 0x2698: +case 0x2898: +case 0x2A98: +case 0x2C98: +case 0x2E98: +case 0x2099: +case 0x2299: +case 0x2499: +case 0x2699: +case 0x2899: +case 0x2A99: +case 0x2C99: +case 0x2E99: +case 0x209A: +case 0x229A: +case 0x249A: +case 0x269A: +case 0x289A: +case 0x2A9A: +case 0x2C9A: +case 0x2E9A: +case 0x209B: +case 0x229B: +case 0x249B: +case 0x269B: +case 0x289B: +case 0x2A9B: +case 0x2C9B: +case 0x2E9B: +case 0x209C: +case 0x229C: +case 0x249C: +case 0x269C: +case 0x289C: +case 0x2A9C: +case 0x2C9C: +case 0x2E9C: +case 0x209D: +case 0x229D: +case 0x249D: +case 0x269D: +case 0x289D: +case 0x2A9D: +case 0x2C9D: +case 0x2E9D: +case 0x209E: +case 0x229E: +case 0x249E: +case 0x269E: +case 0x289E: +case 0x2A9E: +case 0x2C9E: +case 0x2E9E: + +// MOVEL +case 0x2098: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22D8: +case 0x24D8: +case 0x26D8: +case 0x28D8: +case 0x2AD8: +case 0x2CD8: +case 0x20D9: +case 0x22D9: +case 0x24D9: +case 0x26D9: +case 0x28D9: +case 0x2AD9: +case 0x2CD9: +case 0x20DA: +case 0x22DA: +case 0x24DA: +case 0x26DA: +case 0x28DA: +case 0x2ADA: +case 0x2CDA: +case 0x20DB: +case 0x22DB: +case 0x24DB: +case 0x26DB: +case 0x28DB: +case 0x2ADB: +case 0x2CDB: +case 0x20DC: +case 0x22DC: +case 0x24DC: +case 0x26DC: +case 0x28DC: +case 0x2ADC: +case 0x2CDC: +case 0x20DD: +case 0x22DD: +case 0x24DD: +case 0x26DD: +case 0x28DD: +case 0x2ADD: +case 0x2CDD: +case 0x20DE: +case 0x22DE: +case 0x24DE: +case 0x26DE: +case 0x28DE: +case 0x2ADE: +case 0x2CDE: + +// MOVEL +case 0x20D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2318: +case 0x2518: +case 0x2718: +case 0x2918: +case 0x2B18: +case 0x2D18: +case 0x2119: +case 0x2319: +case 0x2519: +case 0x2719: +case 0x2919: +case 0x2B19: +case 0x2D19: +case 0x211A: +case 0x231A: +case 0x251A: +case 0x271A: +case 0x291A: +case 0x2B1A: +case 0x2D1A: +case 0x211B: +case 0x231B: +case 0x251B: +case 0x271B: +case 0x291B: +case 0x2B1B: +case 0x2D1B: +case 0x211C: +case 0x231C: +case 0x251C: +case 0x271C: +case 0x291C: +case 0x2B1C: +case 0x2D1C: +case 0x211D: +case 0x231D: +case 0x251D: +case 0x271D: +case 0x291D: +case 0x2B1D: +case 0x2D1D: +case 0x211E: +case 0x231E: +case 0x251E: +case 0x271E: +case 0x291E: +case 0x2B1E: +case 0x2D1E: + +// MOVEL +case 0x2118: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2358: +case 0x2558: +case 0x2758: +case 0x2958: +case 0x2B58: +case 0x2D58: +case 0x2F58: +case 0x2159: +case 0x2359: +case 0x2559: +case 0x2759: +case 0x2959: +case 0x2B59: +case 0x2D59: +case 0x2F59: +case 0x215A: +case 0x235A: +case 0x255A: +case 0x275A: +case 0x295A: +case 0x2B5A: +case 0x2D5A: +case 0x2F5A: +case 0x215B: +case 0x235B: +case 0x255B: +case 0x275B: +case 0x295B: +case 0x2B5B: +case 0x2D5B: +case 0x2F5B: +case 0x215C: +case 0x235C: +case 0x255C: +case 0x275C: +case 0x295C: +case 0x2B5C: +case 0x2D5C: +case 0x2F5C: +case 0x215D: +case 0x235D: +case 0x255D: +case 0x275D: +case 0x295D: +case 0x2B5D: +case 0x2D5D: +case 0x2F5D: +case 0x215E: +case 0x235E: +case 0x255E: +case 0x275E: +case 0x295E: +case 0x2B5E: +case 0x2D5E: +case 0x2F5E: + +// MOVEL +case 0x2158: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2398: +case 0x2598: +case 0x2798: +case 0x2998: +case 0x2B98: +case 0x2D98: +case 0x2F98: +case 0x2199: +case 0x2399: +case 0x2599: +case 0x2799: +case 0x2999: +case 0x2B99: +case 0x2D99: +case 0x2F99: +case 0x219A: +case 0x239A: +case 0x259A: +case 0x279A: +case 0x299A: +case 0x2B9A: +case 0x2D9A: +case 0x2F9A: +case 0x219B: +case 0x239B: +case 0x259B: +case 0x279B: +case 0x299B: +case 0x2B9B: +case 0x2D9B: +case 0x2F9B: +case 0x219C: +case 0x239C: +case 0x259C: +case 0x279C: +case 0x299C: +case 0x2B9C: +case 0x2D9C: +case 0x2F9C: +case 0x219D: +case 0x239D: +case 0x259D: +case 0x279D: +case 0x299D: +case 0x2B9D: +case 0x2D9D: +case 0x2F9D: +case 0x219E: +case 0x239E: +case 0x259E: +case 0x279E: +case 0x299E: +case 0x2B9E: +case 0x2D9E: +case 0x2F9E: + +// MOVEL +case 0x2198: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21D9: +case 0x21DA: +case 0x21DB: +case 0x21DC: +case 0x21DD: +case 0x21DE: + +// MOVEL +case 0x21D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23D9: +case 0x23DA: +case 0x23DB: +case 0x23DC: +case 0x23DD: +case 0x23DE: + +// MOVEL +case 0x23D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2ED9: +case 0x2EDA: +case 0x2EDB: +case 0x2EDC: +case 0x2EDD: +case 0x2EDE: + +// MOVEL +case 0x2ED8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F19: +case 0x2F1A: +case 0x2F1B: +case 0x2F1C: +case 0x2F1D: +case 0x2F1E: + +// MOVEL +case 0x2F18: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2220: +case 0x2420: +case 0x2620: +case 0x2820: +case 0x2A20: +case 0x2C20: +case 0x2E20: +case 0x2021: +case 0x2221: +case 0x2421: +case 0x2621: +case 0x2821: +case 0x2A21: +case 0x2C21: +case 0x2E21: +case 0x2022: +case 0x2222: +case 0x2422: +case 0x2622: +case 0x2822: +case 0x2A22: +case 0x2C22: +case 0x2E22: +case 0x2023: +case 0x2223: +case 0x2423: +case 0x2623: +case 0x2823: +case 0x2A23: +case 0x2C23: +case 0x2E23: +case 0x2024: +case 0x2224: +case 0x2424: +case 0x2624: +case 0x2824: +case 0x2A24: +case 0x2C24: +case 0x2E24: +case 0x2025: +case 0x2225: +case 0x2425: +case 0x2625: +case 0x2825: +case 0x2A25: +case 0x2C25: +case 0x2E25: +case 0x2026: +case 0x2226: +case 0x2426: +case 0x2626: +case 0x2826: +case 0x2A26: +case 0x2C26: +case 0x2E26: + +// MOVEL +case 0x2020: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22A0: +case 0x24A0: +case 0x26A0: +case 0x28A0: +case 0x2AA0: +case 0x2CA0: +case 0x2EA0: +case 0x20A1: +case 0x22A1: +case 0x24A1: +case 0x26A1: +case 0x28A1: +case 0x2AA1: +case 0x2CA1: +case 0x2EA1: +case 0x20A2: +case 0x22A2: +case 0x24A2: +case 0x26A2: +case 0x28A2: +case 0x2AA2: +case 0x2CA2: +case 0x2EA2: +case 0x20A3: +case 0x22A3: +case 0x24A3: +case 0x26A3: +case 0x28A3: +case 0x2AA3: +case 0x2CA3: +case 0x2EA3: +case 0x20A4: +case 0x22A4: +case 0x24A4: +case 0x26A4: +case 0x28A4: +case 0x2AA4: +case 0x2CA4: +case 0x2EA4: +case 0x20A5: +case 0x22A5: +case 0x24A5: +case 0x26A5: +case 0x28A5: +case 0x2AA5: +case 0x2CA5: +case 0x2EA5: +case 0x20A6: +case 0x22A6: +case 0x24A6: +case 0x26A6: +case 0x28A6: +case 0x2AA6: +case 0x2CA6: +case 0x2EA6: + +// MOVEL +case 0x20A0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22E0: +case 0x24E0: +case 0x26E0: +case 0x28E0: +case 0x2AE0: +case 0x2CE0: +case 0x20E1: +case 0x22E1: +case 0x24E1: +case 0x26E1: +case 0x28E1: +case 0x2AE1: +case 0x2CE1: +case 0x20E2: +case 0x22E2: +case 0x24E2: +case 0x26E2: +case 0x28E2: +case 0x2AE2: +case 0x2CE2: +case 0x20E3: +case 0x22E3: +case 0x24E3: +case 0x26E3: +case 0x28E3: +case 0x2AE3: +case 0x2CE3: +case 0x20E4: +case 0x22E4: +case 0x24E4: +case 0x26E4: +case 0x28E4: +case 0x2AE4: +case 0x2CE4: +case 0x20E5: +case 0x22E5: +case 0x24E5: +case 0x26E5: +case 0x28E5: +case 0x2AE5: +case 0x2CE5: +case 0x20E6: +case 0x22E6: +case 0x24E6: +case 0x26E6: +case 0x28E6: +case 0x2AE6: +case 0x2CE6: + +// MOVEL +case 0x20E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2320: +case 0x2520: +case 0x2720: +case 0x2920: +case 0x2B20: +case 0x2D20: +case 0x2121: +case 0x2321: +case 0x2521: +case 0x2721: +case 0x2921: +case 0x2B21: +case 0x2D21: +case 0x2122: +case 0x2322: +case 0x2522: +case 0x2722: +case 0x2922: +case 0x2B22: +case 0x2D22: +case 0x2123: +case 0x2323: +case 0x2523: +case 0x2723: +case 0x2923: +case 0x2B23: +case 0x2D23: +case 0x2124: +case 0x2324: +case 0x2524: +case 0x2724: +case 0x2924: +case 0x2B24: +case 0x2D24: +case 0x2125: +case 0x2325: +case 0x2525: +case 0x2725: +case 0x2925: +case 0x2B25: +case 0x2D25: +case 0x2126: +case 0x2326: +case 0x2526: +case 0x2726: +case 0x2926: +case 0x2B26: +case 0x2D26: + +// MOVEL +case 0x2120: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2360: +case 0x2560: +case 0x2760: +case 0x2960: +case 0x2B60: +case 0x2D60: +case 0x2F60: +case 0x2161: +case 0x2361: +case 0x2561: +case 0x2761: +case 0x2961: +case 0x2B61: +case 0x2D61: +case 0x2F61: +case 0x2162: +case 0x2362: +case 0x2562: +case 0x2762: +case 0x2962: +case 0x2B62: +case 0x2D62: +case 0x2F62: +case 0x2163: +case 0x2363: +case 0x2563: +case 0x2763: +case 0x2963: +case 0x2B63: +case 0x2D63: +case 0x2F63: +case 0x2164: +case 0x2364: +case 0x2564: +case 0x2764: +case 0x2964: +case 0x2B64: +case 0x2D64: +case 0x2F64: +case 0x2165: +case 0x2365: +case 0x2565: +case 0x2765: +case 0x2965: +case 0x2B65: +case 0x2D65: +case 0x2F65: +case 0x2166: +case 0x2366: +case 0x2566: +case 0x2766: +case 0x2966: +case 0x2B66: +case 0x2D66: +case 0x2F66: + +// MOVEL +case 0x2160: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23A0: +case 0x25A0: +case 0x27A0: +case 0x29A0: +case 0x2BA0: +case 0x2DA0: +case 0x2FA0: +case 0x21A1: +case 0x23A1: +case 0x25A1: +case 0x27A1: +case 0x29A1: +case 0x2BA1: +case 0x2DA1: +case 0x2FA1: +case 0x21A2: +case 0x23A2: +case 0x25A2: +case 0x27A2: +case 0x29A2: +case 0x2BA2: +case 0x2DA2: +case 0x2FA2: +case 0x21A3: +case 0x23A3: +case 0x25A3: +case 0x27A3: +case 0x29A3: +case 0x2BA3: +case 0x2DA3: +case 0x2FA3: +case 0x21A4: +case 0x23A4: +case 0x25A4: +case 0x27A4: +case 0x29A4: +case 0x2BA4: +case 0x2DA4: +case 0x2FA4: +case 0x21A5: +case 0x23A5: +case 0x25A5: +case 0x27A5: +case 0x29A5: +case 0x2BA5: +case 0x2DA5: +case 0x2FA5: +case 0x21A6: +case 0x23A6: +case 0x25A6: +case 0x27A6: +case 0x29A6: +case 0x2BA6: +case 0x2DA6: +case 0x2FA6: + +// MOVEL +case 0x21A0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21E1: +case 0x21E2: +case 0x21E3: +case 0x21E4: +case 0x21E5: +case 0x21E6: + +// MOVEL +case 0x21E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23E1: +case 0x23E2: +case 0x23E3: +case 0x23E4: +case 0x23E5: +case 0x23E6: + +// MOVEL +case 0x23E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2EE1: +case 0x2EE2: +case 0x2EE3: +case 0x2EE4: +case 0x2EE5: +case 0x2EE6: + +// MOVEL +case 0x2EE0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F21: +case 0x2F22: +case 0x2F23: +case 0x2F24: +case 0x2F25: +case 0x2F26: + +// MOVEL +case 0x2F20: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2228: +case 0x2428: +case 0x2628: +case 0x2828: +case 0x2A28: +case 0x2C28: +case 0x2E28: +case 0x2029: +case 0x2229: +case 0x2429: +case 0x2629: +case 0x2829: +case 0x2A29: +case 0x2C29: +case 0x2E29: +case 0x202A: +case 0x222A: +case 0x242A: +case 0x262A: +case 0x282A: +case 0x2A2A: +case 0x2C2A: +case 0x2E2A: +case 0x202B: +case 0x222B: +case 0x242B: +case 0x262B: +case 0x282B: +case 0x2A2B: +case 0x2C2B: +case 0x2E2B: +case 0x202C: +case 0x222C: +case 0x242C: +case 0x262C: +case 0x282C: +case 0x2A2C: +case 0x2C2C: +case 0x2E2C: +case 0x202D: +case 0x222D: +case 0x242D: +case 0x262D: +case 0x282D: +case 0x2A2D: +case 0x2C2D: +case 0x2E2D: +case 0x202E: +case 0x222E: +case 0x242E: +case 0x262E: +case 0x282E: +case 0x2A2E: +case 0x2C2E: +case 0x2E2E: +case 0x202F: +case 0x222F: +case 0x242F: +case 0x262F: +case 0x282F: +case 0x2A2F: +case 0x2C2F: +case 0x2E2F: + +// MOVEL +case 0x2028: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22A8: +case 0x24A8: +case 0x26A8: +case 0x28A8: +case 0x2AA8: +case 0x2CA8: +case 0x2EA8: +case 0x20A9: +case 0x22A9: +case 0x24A9: +case 0x26A9: +case 0x28A9: +case 0x2AA9: +case 0x2CA9: +case 0x2EA9: +case 0x20AA: +case 0x22AA: +case 0x24AA: +case 0x26AA: +case 0x28AA: +case 0x2AAA: +case 0x2CAA: +case 0x2EAA: +case 0x20AB: +case 0x22AB: +case 0x24AB: +case 0x26AB: +case 0x28AB: +case 0x2AAB: +case 0x2CAB: +case 0x2EAB: +case 0x20AC: +case 0x22AC: +case 0x24AC: +case 0x26AC: +case 0x28AC: +case 0x2AAC: +case 0x2CAC: +case 0x2EAC: +case 0x20AD: +case 0x22AD: +case 0x24AD: +case 0x26AD: +case 0x28AD: +case 0x2AAD: +case 0x2CAD: +case 0x2EAD: +case 0x20AE: +case 0x22AE: +case 0x24AE: +case 0x26AE: +case 0x28AE: +case 0x2AAE: +case 0x2CAE: +case 0x2EAE: +case 0x20AF: +case 0x22AF: +case 0x24AF: +case 0x26AF: +case 0x28AF: +case 0x2AAF: +case 0x2CAF: +case 0x2EAF: + +// MOVEL +case 0x20A8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22E8: +case 0x24E8: +case 0x26E8: +case 0x28E8: +case 0x2AE8: +case 0x2CE8: +case 0x20E9: +case 0x22E9: +case 0x24E9: +case 0x26E9: +case 0x28E9: +case 0x2AE9: +case 0x2CE9: +case 0x20EA: +case 0x22EA: +case 0x24EA: +case 0x26EA: +case 0x28EA: +case 0x2AEA: +case 0x2CEA: +case 0x20EB: +case 0x22EB: +case 0x24EB: +case 0x26EB: +case 0x28EB: +case 0x2AEB: +case 0x2CEB: +case 0x20EC: +case 0x22EC: +case 0x24EC: +case 0x26EC: +case 0x28EC: +case 0x2AEC: +case 0x2CEC: +case 0x20ED: +case 0x22ED: +case 0x24ED: +case 0x26ED: +case 0x28ED: +case 0x2AED: +case 0x2CED: +case 0x20EE: +case 0x22EE: +case 0x24EE: +case 0x26EE: +case 0x28EE: +case 0x2AEE: +case 0x2CEE: +case 0x20EF: +case 0x22EF: +case 0x24EF: +case 0x26EF: +case 0x28EF: +case 0x2AEF: +case 0x2CEF: + +// MOVEL +case 0x20E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2328: +case 0x2528: +case 0x2728: +case 0x2928: +case 0x2B28: +case 0x2D28: +case 0x2129: +case 0x2329: +case 0x2529: +case 0x2729: +case 0x2929: +case 0x2B29: +case 0x2D29: +case 0x212A: +case 0x232A: +case 0x252A: +case 0x272A: +case 0x292A: +case 0x2B2A: +case 0x2D2A: +case 0x212B: +case 0x232B: +case 0x252B: +case 0x272B: +case 0x292B: +case 0x2B2B: +case 0x2D2B: +case 0x212C: +case 0x232C: +case 0x252C: +case 0x272C: +case 0x292C: +case 0x2B2C: +case 0x2D2C: +case 0x212D: +case 0x232D: +case 0x252D: +case 0x272D: +case 0x292D: +case 0x2B2D: +case 0x2D2D: +case 0x212E: +case 0x232E: +case 0x252E: +case 0x272E: +case 0x292E: +case 0x2B2E: +case 0x2D2E: +case 0x212F: +case 0x232F: +case 0x252F: +case 0x272F: +case 0x292F: +case 0x2B2F: +case 0x2D2F: + +// MOVEL +case 0x2128: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2368: +case 0x2568: +case 0x2768: +case 0x2968: +case 0x2B68: +case 0x2D68: +case 0x2F68: +case 0x2169: +case 0x2369: +case 0x2569: +case 0x2769: +case 0x2969: +case 0x2B69: +case 0x2D69: +case 0x2F69: +case 0x216A: +case 0x236A: +case 0x256A: +case 0x276A: +case 0x296A: +case 0x2B6A: +case 0x2D6A: +case 0x2F6A: +case 0x216B: +case 0x236B: +case 0x256B: +case 0x276B: +case 0x296B: +case 0x2B6B: +case 0x2D6B: +case 0x2F6B: +case 0x216C: +case 0x236C: +case 0x256C: +case 0x276C: +case 0x296C: +case 0x2B6C: +case 0x2D6C: +case 0x2F6C: +case 0x216D: +case 0x236D: +case 0x256D: +case 0x276D: +case 0x296D: +case 0x2B6D: +case 0x2D6D: +case 0x2F6D: +case 0x216E: +case 0x236E: +case 0x256E: +case 0x276E: +case 0x296E: +case 0x2B6E: +case 0x2D6E: +case 0x2F6E: +case 0x216F: +case 0x236F: +case 0x256F: +case 0x276F: +case 0x296F: +case 0x2B6F: +case 0x2D6F: +case 0x2F6F: + +// MOVEL +case 0x2168: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23A8: +case 0x25A8: +case 0x27A8: +case 0x29A8: +case 0x2BA8: +case 0x2DA8: +case 0x2FA8: +case 0x21A9: +case 0x23A9: +case 0x25A9: +case 0x27A9: +case 0x29A9: +case 0x2BA9: +case 0x2DA9: +case 0x2FA9: +case 0x21AA: +case 0x23AA: +case 0x25AA: +case 0x27AA: +case 0x29AA: +case 0x2BAA: +case 0x2DAA: +case 0x2FAA: +case 0x21AB: +case 0x23AB: +case 0x25AB: +case 0x27AB: +case 0x29AB: +case 0x2BAB: +case 0x2DAB: +case 0x2FAB: +case 0x21AC: +case 0x23AC: +case 0x25AC: +case 0x27AC: +case 0x29AC: +case 0x2BAC: +case 0x2DAC: +case 0x2FAC: +case 0x21AD: +case 0x23AD: +case 0x25AD: +case 0x27AD: +case 0x29AD: +case 0x2BAD: +case 0x2DAD: +case 0x2FAD: +case 0x21AE: +case 0x23AE: +case 0x25AE: +case 0x27AE: +case 0x29AE: +case 0x2BAE: +case 0x2DAE: +case 0x2FAE: +case 0x21AF: +case 0x23AF: +case 0x25AF: +case 0x27AF: +case 0x29AF: +case 0x2BAF: +case 0x2DAF: +case 0x2FAF: + +// MOVEL +case 0x21A8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21E9: +case 0x21EA: +case 0x21EB: +case 0x21EC: +case 0x21ED: +case 0x21EE: +case 0x21EF: + +// MOVEL +case 0x21E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23E9: +case 0x23EA: +case 0x23EB: +case 0x23EC: +case 0x23ED: +case 0x23EE: +case 0x23EF: + +// MOVEL +case 0x23E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2EE9: +case 0x2EEA: +case 0x2EEB: +case 0x2EEC: +case 0x2EED: +case 0x2EEE: +case 0x2EEF: + +// MOVEL +case 0x2EE8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F29: +case 0x2F2A: +case 0x2F2B: +case 0x2F2C: +case 0x2F2D: +case 0x2F2E: +case 0x2F2F: + +// MOVEL +case 0x2F28: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2230: +case 0x2430: +case 0x2630: +case 0x2830: +case 0x2A30: +case 0x2C30: +case 0x2E30: +case 0x2031: +case 0x2231: +case 0x2431: +case 0x2631: +case 0x2831: +case 0x2A31: +case 0x2C31: +case 0x2E31: +case 0x2032: +case 0x2232: +case 0x2432: +case 0x2632: +case 0x2832: +case 0x2A32: +case 0x2C32: +case 0x2E32: +case 0x2033: +case 0x2233: +case 0x2433: +case 0x2633: +case 0x2833: +case 0x2A33: +case 0x2C33: +case 0x2E33: +case 0x2034: +case 0x2234: +case 0x2434: +case 0x2634: +case 0x2834: +case 0x2A34: +case 0x2C34: +case 0x2E34: +case 0x2035: +case 0x2235: +case 0x2435: +case 0x2635: +case 0x2835: +case 0x2A35: +case 0x2C35: +case 0x2E35: +case 0x2036: +case 0x2236: +case 0x2436: +case 0x2636: +case 0x2836: +case 0x2A36: +case 0x2C36: +case 0x2E36: +case 0x2037: +case 0x2237: +case 0x2437: +case 0x2637: +case 0x2837: +case 0x2A37: +case 0x2C37: +case 0x2E37: + +// MOVEL +case 0x2030: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22B0: +case 0x24B0: +case 0x26B0: +case 0x28B0: +case 0x2AB0: +case 0x2CB0: +case 0x2EB0: +case 0x20B1: +case 0x22B1: +case 0x24B1: +case 0x26B1: +case 0x28B1: +case 0x2AB1: +case 0x2CB1: +case 0x2EB1: +case 0x20B2: +case 0x22B2: +case 0x24B2: +case 0x26B2: +case 0x28B2: +case 0x2AB2: +case 0x2CB2: +case 0x2EB2: +case 0x20B3: +case 0x22B3: +case 0x24B3: +case 0x26B3: +case 0x28B3: +case 0x2AB3: +case 0x2CB3: +case 0x2EB3: +case 0x20B4: +case 0x22B4: +case 0x24B4: +case 0x26B4: +case 0x28B4: +case 0x2AB4: +case 0x2CB4: +case 0x2EB4: +case 0x20B5: +case 0x22B5: +case 0x24B5: +case 0x26B5: +case 0x28B5: +case 0x2AB5: +case 0x2CB5: +case 0x2EB5: +case 0x20B6: +case 0x22B6: +case 0x24B6: +case 0x26B6: +case 0x28B6: +case 0x2AB6: +case 0x2CB6: +case 0x2EB6: +case 0x20B7: +case 0x22B7: +case 0x24B7: +case 0x26B7: +case 0x28B7: +case 0x2AB7: +case 0x2CB7: +case 0x2EB7: + +// MOVEL +case 0x20B0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22F0: +case 0x24F0: +case 0x26F0: +case 0x28F0: +case 0x2AF0: +case 0x2CF0: +case 0x20F1: +case 0x22F1: +case 0x24F1: +case 0x26F1: +case 0x28F1: +case 0x2AF1: +case 0x2CF1: +case 0x20F2: +case 0x22F2: +case 0x24F2: +case 0x26F2: +case 0x28F2: +case 0x2AF2: +case 0x2CF2: +case 0x20F3: +case 0x22F3: +case 0x24F3: +case 0x26F3: +case 0x28F3: +case 0x2AF3: +case 0x2CF3: +case 0x20F4: +case 0x22F4: +case 0x24F4: +case 0x26F4: +case 0x28F4: +case 0x2AF4: +case 0x2CF4: +case 0x20F5: +case 0x22F5: +case 0x24F5: +case 0x26F5: +case 0x28F5: +case 0x2AF5: +case 0x2CF5: +case 0x20F6: +case 0x22F6: +case 0x24F6: +case 0x26F6: +case 0x28F6: +case 0x2AF6: +case 0x2CF6: +case 0x20F7: +case 0x22F7: +case 0x24F7: +case 0x26F7: +case 0x28F7: +case 0x2AF7: +case 0x2CF7: + +// MOVEL +case 0x20F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2330: +case 0x2530: +case 0x2730: +case 0x2930: +case 0x2B30: +case 0x2D30: +case 0x2131: +case 0x2331: +case 0x2531: +case 0x2731: +case 0x2931: +case 0x2B31: +case 0x2D31: +case 0x2132: +case 0x2332: +case 0x2532: +case 0x2732: +case 0x2932: +case 0x2B32: +case 0x2D32: +case 0x2133: +case 0x2333: +case 0x2533: +case 0x2733: +case 0x2933: +case 0x2B33: +case 0x2D33: +case 0x2134: +case 0x2334: +case 0x2534: +case 0x2734: +case 0x2934: +case 0x2B34: +case 0x2D34: +case 0x2135: +case 0x2335: +case 0x2535: +case 0x2735: +case 0x2935: +case 0x2B35: +case 0x2D35: +case 0x2136: +case 0x2336: +case 0x2536: +case 0x2736: +case 0x2936: +case 0x2B36: +case 0x2D36: +case 0x2137: +case 0x2337: +case 0x2537: +case 0x2737: +case 0x2937: +case 0x2B37: +case 0x2D37: + +// MOVEL +case 0x2130: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2370: +case 0x2570: +case 0x2770: +case 0x2970: +case 0x2B70: +case 0x2D70: +case 0x2F70: +case 0x2171: +case 0x2371: +case 0x2571: +case 0x2771: +case 0x2971: +case 0x2B71: +case 0x2D71: +case 0x2F71: +case 0x2172: +case 0x2372: +case 0x2572: +case 0x2772: +case 0x2972: +case 0x2B72: +case 0x2D72: +case 0x2F72: +case 0x2173: +case 0x2373: +case 0x2573: +case 0x2773: +case 0x2973: +case 0x2B73: +case 0x2D73: +case 0x2F73: +case 0x2174: +case 0x2374: +case 0x2574: +case 0x2774: +case 0x2974: +case 0x2B74: +case 0x2D74: +case 0x2F74: +case 0x2175: +case 0x2375: +case 0x2575: +case 0x2775: +case 0x2975: +case 0x2B75: +case 0x2D75: +case 0x2F75: +case 0x2176: +case 0x2376: +case 0x2576: +case 0x2776: +case 0x2976: +case 0x2B76: +case 0x2D76: +case 0x2F76: +case 0x2177: +case 0x2377: +case 0x2577: +case 0x2777: +case 0x2977: +case 0x2B77: +case 0x2D77: +case 0x2F77: + +// MOVEL +case 0x2170: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23B0: +case 0x25B0: +case 0x27B0: +case 0x29B0: +case 0x2BB0: +case 0x2DB0: +case 0x2FB0: +case 0x21B1: +case 0x23B1: +case 0x25B1: +case 0x27B1: +case 0x29B1: +case 0x2BB1: +case 0x2DB1: +case 0x2FB1: +case 0x21B2: +case 0x23B2: +case 0x25B2: +case 0x27B2: +case 0x29B2: +case 0x2BB2: +case 0x2DB2: +case 0x2FB2: +case 0x21B3: +case 0x23B3: +case 0x25B3: +case 0x27B3: +case 0x29B3: +case 0x2BB3: +case 0x2DB3: +case 0x2FB3: +case 0x21B4: +case 0x23B4: +case 0x25B4: +case 0x27B4: +case 0x29B4: +case 0x2BB4: +case 0x2DB4: +case 0x2FB4: +case 0x21B5: +case 0x23B5: +case 0x25B5: +case 0x27B5: +case 0x29B5: +case 0x2BB5: +case 0x2DB5: +case 0x2FB5: +case 0x21B6: +case 0x23B6: +case 0x25B6: +case 0x27B6: +case 0x29B6: +case 0x2BB6: +case 0x2DB6: +case 0x2FB6: +case 0x21B7: +case 0x23B7: +case 0x25B7: +case 0x27B7: +case 0x29B7: +case 0x2BB7: +case 0x2DB7: +case 0x2FB7: + +// MOVEL +case 0x21B0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x21F1: +case 0x21F2: +case 0x21F3: +case 0x21F4: +case 0x21F5: +case 0x21F6: +case 0x21F7: + +// MOVEL +case 0x21F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23F1: +case 0x23F2: +case 0x23F3: +case 0x23F4: +case 0x23F5: +case 0x23F6: +case 0x23F7: + +// MOVEL +case 0x23F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2EF1: +case 0x2EF2: +case 0x2EF3: +case 0x2EF4: +case 0x2EF5: +case 0x2EF6: +case 0x2EF7: + +// MOVEL +case 0x2EF0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2F31: +case 0x2F32: +case 0x2F33: +case 0x2F34: +case 0x2F35: +case 0x2F36: +case 0x2F37: + +// MOVEL +case 0x2F30: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2238: +case 0x2438: +case 0x2638: +case 0x2838: +case 0x2A38: +case 0x2C38: +case 0x2E38: + +// MOVEL +case 0x2038: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22B8: +case 0x24B8: +case 0x26B8: +case 0x28B8: +case 0x2AB8: +case 0x2CB8: +case 0x2EB8: + +// MOVEL +case 0x20B8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22F8: +case 0x24F8: +case 0x26F8: +case 0x28F8: +case 0x2AF8: +case 0x2CF8: + +// MOVEL +case 0x20F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2338: +case 0x2538: +case 0x2738: +case 0x2938: +case 0x2B38: +case 0x2D38: + +// MOVEL +case 0x2138: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2378: +case 0x2578: +case 0x2778: +case 0x2978: +case 0x2B78: +case 0x2D78: +case 0x2F78: + +// MOVEL +case 0x2178: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23B8: +case 0x25B8: +case 0x27B8: +case 0x29B8: +case 0x2BB8: +case 0x2DB8: +case 0x2FB8: + +// MOVEL +case 0x21B8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EF8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F38: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2239: +case 0x2439: +case 0x2639: +case 0x2839: +case 0x2A39: +case 0x2C39: +case 0x2E39: + +// MOVEL +case 0x2039: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22B9: +case 0x24B9: +case 0x26B9: +case 0x28B9: +case 0x2AB9: +case 0x2CB9: +case 0x2EB9: + +// MOVEL +case 0x20B9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22F9: +case 0x24F9: +case 0x26F9: +case 0x28F9: +case 0x2AF9: +case 0x2CF9: + +// MOVEL +case 0x20F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2339: +case 0x2539: +case 0x2739: +case 0x2939: +case 0x2B39: +case 0x2D39: + +// MOVEL +case 0x2139: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2379: +case 0x2579: +case 0x2779: +case 0x2979: +case 0x2B79: +case 0x2D79: +case 0x2F79: + +// MOVEL +case 0x2179: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23B9: +case 0x25B9: +case 0x27B9: +case 0x29B9: +case 0x2BB9: +case 0x2DB9: +case 0x2FB9: + +// MOVEL +case 0x21B9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EF9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F39: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x223A: +case 0x243A: +case 0x263A: +case 0x283A: +case 0x2A3A: +case 0x2C3A: +case 0x2E3A: + +// MOVEL +case 0x203A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22BA: +case 0x24BA: +case 0x26BA: +case 0x28BA: +case 0x2ABA: +case 0x2CBA: +case 0x2EBA: + +// MOVEL +case 0x20BA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22FA: +case 0x24FA: +case 0x26FA: +case 0x28FA: +case 0x2AFA: +case 0x2CFA: + +// MOVEL +case 0x20FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x233A: +case 0x253A: +case 0x273A: +case 0x293A: +case 0x2B3A: +case 0x2D3A: + +// MOVEL +case 0x213A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x237A: +case 0x257A: +case 0x277A: +case 0x297A: +case 0x2B7A: +case 0x2D7A: +case 0x2F7A: + +// MOVEL +case 0x217A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23BA: +case 0x25BA: +case 0x27BA: +case 0x29BA: +case 0x2BBA: +case 0x2DBA: +case 0x2FBA: + +// MOVEL +case 0x21BA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EFA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F3A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x223B: +case 0x243B: +case 0x263B: +case 0x283B: +case 0x2A3B: +case 0x2C3B: +case 0x2E3B: + +// MOVEL +case 0x203B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22BB: +case 0x24BB: +case 0x26BB: +case 0x28BB: +case 0x2ABB: +case 0x2CBB: +case 0x2EBB: + +// MOVEL +case 0x20BB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22FB: +case 0x24FB: +case 0x26FB: +case 0x28FB: +case 0x2AFB: +case 0x2CFB: + +// MOVEL +case 0x20FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x233B: +case 0x253B: +case 0x273B: +case 0x293B: +case 0x2B3B: +case 0x2D3B: + +// MOVEL +case 0x213B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x237B: +case 0x257B: +case 0x277B: +case 0x297B: +case 0x2B7B: +case 0x2D7B: +case 0x2F7B: + +// MOVEL +case 0x217B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23BB: +case 0x25BB: +case 0x27BB: +case 0x29BB: +case 0x2BBB: +case 0x2DBB: +case 0x2FBB: + +// MOVEL +case 0x21BB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EFB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F3B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x223C: +case 0x243C: +case 0x263C: +case 0x283C: +case 0x2A3C: +case 0x2C3C: +case 0x2E3C: + +// MOVEL +case 0x203C: +{ + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0x22BC: +case 0x24BC: +case 0x26BC: +case 0x28BC: +case 0x2ABC: +case 0x2CBC: +case 0x2EBC: + +// MOVEL +case 0x20BC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22FC: +case 0x24FC: +case 0x26FC: +case 0x28FC: +case 0x2AFC: +case 0x2CFC: + +// MOVEL +case 0x20FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x233C: +case 0x253C: +case 0x273C: +case 0x293C: +case 0x2B3C: +case 0x2D3C: + +// MOVEL +case 0x213C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 8; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x237C: +case 0x257C: +case 0x277C: +case 0x297C: +case 0x2B7C: +case 0x2D7C: +case 0x2F7C: + +// MOVEL +case 0x217C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23BC: +case 0x25BC: +case 0x27BC: +case 0x29BC: +case 0x2BBC: +case 0x2DBC: +case 0x2FBC: + +// MOVEL +case 0x21BC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 14; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EFC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F3C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_LONG; + PC += 4; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 8; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x221F: +case 0x241F: +case 0x261F: +case 0x281F: +case 0x2A1F: +case 0x2C1F: +case 0x2E1F: + +// MOVEL +case 0x201F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x229F: +case 0x249F: +case 0x269F: +case 0x289F: +case 0x2A9F: +case 0x2C9F: +case 0x2E9F: + +// MOVEL +case 0x209F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22DF: +case 0x24DF: +case 0x26DF: +case 0x28DF: +case 0x2ADF: +case 0x2CDF: + +// MOVEL +case 0x20DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x231F: +case 0x251F: +case 0x271F: +case 0x291F: +case 0x2B1F: +case 0x2D1F: + +// MOVEL +case 0x211F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x235F: +case 0x255F: +case 0x275F: +case 0x295F: +case 0x2B5F: +case 0x2D5F: +case 0x2F5F: + +// MOVEL +case 0x215F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x239F: +case 0x259F: +case 0x279F: +case 0x299F: +case 0x2B9F: +case 0x2D9F: +case 0x2F9F: + +// MOVEL +case 0x219F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EDF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F1F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2227: +case 0x2427: +case 0x2627: +case 0x2827: +case 0x2A27: +case 0x2C27: +case 0x2E27: + +// MOVEL +case 0x2027: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x22A7: +case 0x24A7: +case 0x26A7: +case 0x28A7: +case 0x2AA7: +case 0x2CA7: +case 0x2EA7: + +// MOVEL +case 0x20A7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x22E7: +case 0x24E7: +case 0x26E7: +case 0x28E7: +case 0x2AE7: +case 0x2CE7: + +// MOVEL +case 0x20E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x2327: +case 0x2527: +case 0x2727: +case 0x2927: +case 0x2B27: +case 0x2D27: + +// MOVEL +case 0x2127: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2367: +case 0x2567: +case 0x2767: +case 0x2967: +case 0x2B67: +case 0x2D67: +case 0x2F67: + +// MOVEL +case 0x2167: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x23A7: +case 0x25A7: +case 0x27A7: +case 0x29A7: +case 0x2BA7: +case 0x2DA7: +case 0x2FA7: + +// MOVEL +case 0x21A7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x21E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x23E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2EE7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7]; + CPU->A[7] += 4; + WRITE_LOat_F(adr, res) +} +RET(0) + +// MOVEL +case 0x2F27: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + WRITE_LOat_DEC_F(adr, res) +} +RET(0) +case 0x2240: +case 0x2440: +case 0x2640: +case 0x2840: +case 0x2A40: +case 0x2C40: +case 0x2E40: +case 0x2041: +case 0x2241: +case 0x2441: +case 0x2641: +case 0x2841: +case 0x2A41: +case 0x2C41: +case 0x2E41: +case 0x2042: +case 0x2242: +case 0x2442: +case 0x2642: +case 0x2842: +case 0x2A42: +case 0x2C42: +case 0x2E42: +case 0x2043: +case 0x2243: +case 0x2443: +case 0x2643: +case 0x2843: +case 0x2A43: +case 0x2C43: +case 0x2E43: +case 0x2044: +case 0x2244: +case 0x2444: +case 0x2644: +case 0x2844: +case 0x2A44: +case 0x2C44: +case 0x2E44: +case 0x2045: +case 0x2245: +case 0x2445: +case 0x2645: +case 0x2845: +case 0x2A45: +case 0x2C45: +case 0x2E45: +case 0x2046: +case 0x2246: +case 0x2446: +case 0x2646: +case 0x2846: +case 0x2A46: +case 0x2C46: +case 0x2E46: +case 0x2047: +case 0x2247: +case 0x2447: +case 0x2647: +case 0x2847: +case 0x2A47: +case 0x2C47: +case 0x2E47: + +// MOVEAL +case 0x2040: +{ + u32 res; + res = (s32)(s32)CPU->D[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2248: +case 0x2448: +case 0x2648: +case 0x2848: +case 0x2A48: +case 0x2C48: +case 0x2E48: +case 0x2049: +case 0x2249: +case 0x2449: +case 0x2649: +case 0x2849: +case 0x2A49: +case 0x2C49: +case 0x2E49: +case 0x204A: +case 0x224A: +case 0x244A: +case 0x264A: +case 0x284A: +case 0x2A4A: +case 0x2C4A: +case 0x2E4A: +case 0x204B: +case 0x224B: +case 0x244B: +case 0x264B: +case 0x284B: +case 0x2A4B: +case 0x2C4B: +case 0x2E4B: +case 0x204C: +case 0x224C: +case 0x244C: +case 0x264C: +case 0x284C: +case 0x2A4C: +case 0x2C4C: +case 0x2E4C: +case 0x204D: +case 0x224D: +case 0x244D: +case 0x264D: +case 0x284D: +case 0x2A4D: +case 0x2C4D: +case 0x2E4D: +case 0x204E: +case 0x224E: +case 0x244E: +case 0x264E: +case 0x284E: +case 0x2A4E: +case 0x2C4E: +case 0x2E4E: +case 0x204F: +case 0x224F: +case 0x244F: +case 0x264F: +case 0x284F: +case 0x2A4F: +case 0x2C4F: +case 0x2E4F: + +// MOVEAL +case 0x2048: +{ + u32 res; + res = (s32)(s32)CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2250: +case 0x2450: +case 0x2650: +case 0x2850: +case 0x2A50: +case 0x2C50: +case 0x2E50: +case 0x2051: +case 0x2251: +case 0x2451: +case 0x2651: +case 0x2851: +case 0x2A51: +case 0x2C51: +case 0x2E51: +case 0x2052: +case 0x2252: +case 0x2452: +case 0x2652: +case 0x2852: +case 0x2A52: +case 0x2C52: +case 0x2E52: +case 0x2053: +case 0x2253: +case 0x2453: +case 0x2653: +case 0x2853: +case 0x2A53: +case 0x2C53: +case 0x2E53: +case 0x2054: +case 0x2254: +case 0x2454: +case 0x2654: +case 0x2854: +case 0x2A54: +case 0x2C54: +case 0x2E54: +case 0x2055: +case 0x2255: +case 0x2455: +case 0x2655: +case 0x2855: +case 0x2A55: +case 0x2C55: +case 0x2E55: +case 0x2056: +case 0x2256: +case 0x2456: +case 0x2656: +case 0x2856: +case 0x2A56: +case 0x2C56: +case 0x2E56: +case 0x2057: +case 0x2257: +case 0x2457: +case 0x2657: +case 0x2857: +case 0x2A57: +case 0x2C57: +case 0x2E57: + +// MOVEAL +case 0x2050: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2258: +case 0x2458: +case 0x2658: +case 0x2858: +case 0x2A58: +case 0x2C58: +case 0x2E58: +case 0x2059: +case 0x2259: +case 0x2459: +case 0x2659: +case 0x2859: +case 0x2A59: +case 0x2C59: +case 0x2E59: +case 0x205A: +case 0x225A: +case 0x245A: +case 0x265A: +case 0x285A: +case 0x2A5A: +case 0x2C5A: +case 0x2E5A: +case 0x205B: +case 0x225B: +case 0x245B: +case 0x265B: +case 0x285B: +case 0x2A5B: +case 0x2C5B: +case 0x2E5B: +case 0x205C: +case 0x225C: +case 0x245C: +case 0x265C: +case 0x285C: +case 0x2A5C: +case 0x2C5C: +case 0x2E5C: +case 0x205D: +case 0x225D: +case 0x245D: +case 0x265D: +case 0x285D: +case 0x2A5D: +case 0x2C5D: +case 0x2E5D: +case 0x205E: +case 0x225E: +case 0x245E: +case 0x265E: +case 0x285E: +case 0x2A5E: +case 0x2C5E: +case 0x2E5E: + +// MOVEAL +case 0x2058: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2260: +case 0x2460: +case 0x2660: +case 0x2860: +case 0x2A60: +case 0x2C60: +case 0x2E60: +case 0x2061: +case 0x2261: +case 0x2461: +case 0x2661: +case 0x2861: +case 0x2A61: +case 0x2C61: +case 0x2E61: +case 0x2062: +case 0x2262: +case 0x2462: +case 0x2662: +case 0x2862: +case 0x2A62: +case 0x2C62: +case 0x2E62: +case 0x2063: +case 0x2263: +case 0x2463: +case 0x2663: +case 0x2863: +case 0x2A63: +case 0x2C63: +case 0x2E63: +case 0x2064: +case 0x2264: +case 0x2464: +case 0x2664: +case 0x2864: +case 0x2A64: +case 0x2C64: +case 0x2E64: +case 0x2065: +case 0x2265: +case 0x2465: +case 0x2665: +case 0x2865: +case 0x2A65: +case 0x2C65: +case 0x2E65: +case 0x2066: +case 0x2266: +case 0x2466: +case 0x2666: +case 0x2866: +case 0x2A66: +case 0x2C66: +case 0x2E66: + +// MOVEAL +case 0x2060: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2268: +case 0x2468: +case 0x2668: +case 0x2868: +case 0x2A68: +case 0x2C68: +case 0x2E68: +case 0x2069: +case 0x2269: +case 0x2469: +case 0x2669: +case 0x2869: +case 0x2A69: +case 0x2C69: +case 0x2E69: +case 0x206A: +case 0x226A: +case 0x246A: +case 0x266A: +case 0x286A: +case 0x2A6A: +case 0x2C6A: +case 0x2E6A: +case 0x206B: +case 0x226B: +case 0x246B: +case 0x266B: +case 0x286B: +case 0x2A6B: +case 0x2C6B: +case 0x2E6B: +case 0x206C: +case 0x226C: +case 0x246C: +case 0x266C: +case 0x286C: +case 0x2A6C: +case 0x2C6C: +case 0x2E6C: +case 0x206D: +case 0x226D: +case 0x246D: +case 0x266D: +case 0x286D: +case 0x2A6D: +case 0x2C6D: +case 0x2E6D: +case 0x206E: +case 0x226E: +case 0x246E: +case 0x266E: +case 0x286E: +case 0x2A6E: +case 0x2C6E: +case 0x2E6E: +case 0x206F: +case 0x226F: +case 0x246F: +case 0x266F: +case 0x286F: +case 0x2A6F: +case 0x2C6F: +case 0x2E6F: + +// MOVEAL +case 0x2068: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2270: +case 0x2470: +case 0x2670: +case 0x2870: +case 0x2A70: +case 0x2C70: +case 0x2E70: +case 0x2071: +case 0x2271: +case 0x2471: +case 0x2671: +case 0x2871: +case 0x2A71: +case 0x2C71: +case 0x2E71: +case 0x2072: +case 0x2272: +case 0x2472: +case 0x2672: +case 0x2872: +case 0x2A72: +case 0x2C72: +case 0x2E72: +case 0x2073: +case 0x2273: +case 0x2473: +case 0x2673: +case 0x2873: +case 0x2A73: +case 0x2C73: +case 0x2E73: +case 0x2074: +case 0x2274: +case 0x2474: +case 0x2674: +case 0x2874: +case 0x2A74: +case 0x2C74: +case 0x2E74: +case 0x2075: +case 0x2275: +case 0x2475: +case 0x2675: +case 0x2875: +case 0x2A75: +case 0x2C75: +case 0x2E75: +case 0x2076: +case 0x2276: +case 0x2476: +case 0x2676: +case 0x2876: +case 0x2A76: +case 0x2C76: +case 0x2E76: +case 0x2077: +case 0x2277: +case 0x2477: +case 0x2677: +case 0x2877: +case 0x2A77: +case 0x2C77: +case 0x2E77: + +// MOVEAL +case 0x2070: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2278: +case 0x2478: +case 0x2678: +case 0x2878: +case 0x2A78: +case 0x2C78: +case 0x2E78: + +// MOVEAL +case 0x2078: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2279: +case 0x2479: +case 0x2679: +case 0x2879: +case 0x2A79: +case 0x2C79: +case 0x2E79: + +// MOVEAL +case 0x2079: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x227A: +case 0x247A: +case 0x267A: +case 0x287A: +case 0x2A7A: +case 0x2C7A: +case 0x2E7A: + +// MOVEAL +case 0x207A: +{ + u32 adr; + u32 res; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x227B: +case 0x247B: +case 0x267B: +case 0x287B: +case 0x2A7B: +case 0x2C7B: +case 0x2E7B: + +// MOVEAL +case 0x207B: +{ + u32 adr; + u32 res; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x227C: +case 0x247C: +case 0x267C: +case 0x287C: +case 0x2A7C: +case 0x2C7C: +case 0x2E7C: + +// MOVEAL +case 0x207C: +{ + u32 res; + res = (s32)(s32)FETCH_LONG; + PC += 4; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(12) +case 0x225F: +case 0x245F: +case 0x265F: +case 0x285F: +case 0x2A5F: +case 0x2C5F: +case 0x2E5F: + +// MOVEAL +case 0x205F: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 4; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x2267: +case 0x2467: +case 0x2667: +case 0x2867: +case 0x2A67: +case 0x2C67: +case 0x2E67: + +// MOVEAL +case 0x2067: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READSX_LOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op3.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op3.inc new file mode 100644 index 0000000000..5f0ad41f0b --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op3.inc @@ -0,0 +1,6247 @@ +case 0x3200: +case 0x3400: +case 0x3600: +case 0x3800: +case 0x3A00: +case 0x3C00: +case 0x3E00: +case 0x3001: +case 0x3201: +case 0x3401: +case 0x3601: +case 0x3801: +case 0x3A01: +case 0x3C01: +case 0x3E01: +case 0x3002: +case 0x3202: +case 0x3402: +case 0x3602: +case 0x3802: +case 0x3A02: +case 0x3C02: +case 0x3E02: +case 0x3003: +case 0x3203: +case 0x3403: +case 0x3603: +case 0x3803: +case 0x3A03: +case 0x3C03: +case 0x3E03: +case 0x3004: +case 0x3204: +case 0x3404: +case 0x3604: +case 0x3804: +case 0x3A04: +case 0x3C04: +case 0x3E04: +case 0x3005: +case 0x3205: +case 0x3405: +case 0x3605: +case 0x3805: +case 0x3A05: +case 0x3C05: +case 0x3E05: +case 0x3006: +case 0x3206: +case 0x3406: +case 0x3606: +case 0x3806: +case 0x3A06: +case 0x3C06: +case 0x3E06: +case 0x3007: +case 0x3207: +case 0x3407: +case 0x3607: +case 0x3807: +case 0x3A07: +case 0x3C07: +case 0x3E07: + +// MOVEW +case 0x3000: +{ + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x3280: +case 0x3480: +case 0x3680: +case 0x3880: +case 0x3A80: +case 0x3C80: +case 0x3E80: +case 0x3081: +case 0x3281: +case 0x3481: +case 0x3681: +case 0x3881: +case 0x3A81: +case 0x3C81: +case 0x3E81: +case 0x3082: +case 0x3282: +case 0x3482: +case 0x3682: +case 0x3882: +case 0x3A82: +case 0x3C82: +case 0x3E82: +case 0x3083: +case 0x3283: +case 0x3483: +case 0x3683: +case 0x3883: +case 0x3A83: +case 0x3C83: +case 0x3E83: +case 0x3084: +case 0x3284: +case 0x3484: +case 0x3684: +case 0x3884: +case 0x3A84: +case 0x3C84: +case 0x3E84: +case 0x3085: +case 0x3285: +case 0x3485: +case 0x3685: +case 0x3885: +case 0x3A85: +case 0x3C85: +case 0x3E85: +case 0x3086: +case 0x3286: +case 0x3486: +case 0x3686: +case 0x3886: +case 0x3A86: +case 0x3C86: +case 0x3E86: +case 0x3087: +case 0x3287: +case 0x3487: +case 0x3687: +case 0x3887: +case 0x3A87: +case 0x3C87: +case 0x3E87: + +// MOVEW +case 0x3080: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32C0: +case 0x34C0: +case 0x36C0: +case 0x38C0: +case 0x3AC0: +case 0x3CC0: +case 0x30C1: +case 0x32C1: +case 0x34C1: +case 0x36C1: +case 0x38C1: +case 0x3AC1: +case 0x3CC1: +case 0x30C2: +case 0x32C2: +case 0x34C2: +case 0x36C2: +case 0x38C2: +case 0x3AC2: +case 0x3CC2: +case 0x30C3: +case 0x32C3: +case 0x34C3: +case 0x36C3: +case 0x38C3: +case 0x3AC3: +case 0x3CC3: +case 0x30C4: +case 0x32C4: +case 0x34C4: +case 0x36C4: +case 0x38C4: +case 0x3AC4: +case 0x3CC4: +case 0x30C5: +case 0x32C5: +case 0x34C5: +case 0x36C5: +case 0x38C5: +case 0x3AC5: +case 0x3CC5: +case 0x30C6: +case 0x32C6: +case 0x34C6: +case 0x36C6: +case 0x38C6: +case 0x3AC6: +case 0x3CC6: +case 0x30C7: +case 0x32C7: +case 0x34C7: +case 0x36C7: +case 0x38C7: +case 0x3AC7: +case 0x3CC7: + +// MOVEW +case 0x30C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3300: +case 0x3500: +case 0x3700: +case 0x3900: +case 0x3B00: +case 0x3D00: +case 0x3101: +case 0x3301: +case 0x3501: +case 0x3701: +case 0x3901: +case 0x3B01: +case 0x3D01: +case 0x3102: +case 0x3302: +case 0x3502: +case 0x3702: +case 0x3902: +case 0x3B02: +case 0x3D02: +case 0x3103: +case 0x3303: +case 0x3503: +case 0x3703: +case 0x3903: +case 0x3B03: +case 0x3D03: +case 0x3104: +case 0x3304: +case 0x3504: +case 0x3704: +case 0x3904: +case 0x3B04: +case 0x3D04: +case 0x3105: +case 0x3305: +case 0x3505: +case 0x3705: +case 0x3905: +case 0x3B05: +case 0x3D05: +case 0x3106: +case 0x3306: +case 0x3506: +case 0x3706: +case 0x3906: +case 0x3B06: +case 0x3D06: +case 0x3107: +case 0x3307: +case 0x3507: +case 0x3707: +case 0x3907: +case 0x3B07: +case 0x3D07: + +// MOVEW +case 0x3100: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3340: +case 0x3540: +case 0x3740: +case 0x3940: +case 0x3B40: +case 0x3D40: +case 0x3F40: +case 0x3141: +case 0x3341: +case 0x3541: +case 0x3741: +case 0x3941: +case 0x3B41: +case 0x3D41: +case 0x3F41: +case 0x3142: +case 0x3342: +case 0x3542: +case 0x3742: +case 0x3942: +case 0x3B42: +case 0x3D42: +case 0x3F42: +case 0x3143: +case 0x3343: +case 0x3543: +case 0x3743: +case 0x3943: +case 0x3B43: +case 0x3D43: +case 0x3F43: +case 0x3144: +case 0x3344: +case 0x3544: +case 0x3744: +case 0x3944: +case 0x3B44: +case 0x3D44: +case 0x3F44: +case 0x3145: +case 0x3345: +case 0x3545: +case 0x3745: +case 0x3945: +case 0x3B45: +case 0x3D45: +case 0x3F45: +case 0x3146: +case 0x3346: +case 0x3546: +case 0x3746: +case 0x3946: +case 0x3B46: +case 0x3D46: +case 0x3F46: +case 0x3147: +case 0x3347: +case 0x3547: +case 0x3747: +case 0x3947: +case 0x3B47: +case 0x3D47: +case 0x3F47: + +// MOVEW +case 0x3140: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3380: +case 0x3580: +case 0x3780: +case 0x3980: +case 0x3B80: +case 0x3D80: +case 0x3F80: +case 0x3181: +case 0x3381: +case 0x3581: +case 0x3781: +case 0x3981: +case 0x3B81: +case 0x3D81: +case 0x3F81: +case 0x3182: +case 0x3382: +case 0x3582: +case 0x3782: +case 0x3982: +case 0x3B82: +case 0x3D82: +case 0x3F82: +case 0x3183: +case 0x3383: +case 0x3583: +case 0x3783: +case 0x3983: +case 0x3B83: +case 0x3D83: +case 0x3F83: +case 0x3184: +case 0x3384: +case 0x3584: +case 0x3784: +case 0x3984: +case 0x3B84: +case 0x3D84: +case 0x3F84: +case 0x3185: +case 0x3385: +case 0x3585: +case 0x3785: +case 0x3985: +case 0x3B85: +case 0x3D85: +case 0x3F85: +case 0x3186: +case 0x3386: +case 0x3586: +case 0x3786: +case 0x3986: +case 0x3B86: +case 0x3D86: +case 0x3F86: +case 0x3187: +case 0x3387: +case 0x3587: +case 0x3787: +case 0x3987: +case 0x3B87: +case 0x3D87: +case 0x3F87: + +// MOVEW +case 0x3180: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31C1: +case 0x31C2: +case 0x31C3: +case 0x31C4: +case 0x31C5: +case 0x31C6: +case 0x31C7: + +// MOVEW +case 0x31C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33C1: +case 0x33C2: +case 0x33C3: +case 0x33C4: +case 0x33C5: +case 0x33C6: +case 0x33C7: + +// MOVEW +case 0x33C0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3EC1: +case 0x3EC2: +case 0x3EC3: +case 0x3EC4: +case 0x3EC5: +case 0x3EC6: +case 0x3EC7: + +// MOVEW +case 0x3EC0: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F01: +case 0x3F02: +case 0x3F03: +case 0x3F04: +case 0x3F05: +case 0x3F06: +case 0x3F07: + +// MOVEW +case 0x3F00: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3208: +case 0x3408: +case 0x3608: +case 0x3808: +case 0x3A08: +case 0x3C08: +case 0x3E08: +case 0x3009: +case 0x3209: +case 0x3409: +case 0x3609: +case 0x3809: +case 0x3A09: +case 0x3C09: +case 0x3E09: +case 0x300A: +case 0x320A: +case 0x340A: +case 0x360A: +case 0x380A: +case 0x3A0A: +case 0x3C0A: +case 0x3E0A: +case 0x300B: +case 0x320B: +case 0x340B: +case 0x360B: +case 0x380B: +case 0x3A0B: +case 0x3C0B: +case 0x3E0B: +case 0x300C: +case 0x320C: +case 0x340C: +case 0x360C: +case 0x380C: +case 0x3A0C: +case 0x3C0C: +case 0x3E0C: +case 0x300D: +case 0x320D: +case 0x340D: +case 0x360D: +case 0x380D: +case 0x3A0D: +case 0x3C0D: +case 0x3E0D: +case 0x300E: +case 0x320E: +case 0x340E: +case 0x360E: +case 0x380E: +case 0x3A0E: +case 0x3C0E: +case 0x3E0E: +case 0x300F: +case 0x320F: +case 0x340F: +case 0x360F: +case 0x380F: +case 0x3A0F: +case 0x3C0F: +case 0x3E0F: + +// MOVEW +case 0x3008: +{ + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x3288: +case 0x3488: +case 0x3688: +case 0x3888: +case 0x3A88: +case 0x3C88: +case 0x3E88: +case 0x3089: +case 0x3289: +case 0x3489: +case 0x3689: +case 0x3889: +case 0x3A89: +case 0x3C89: +case 0x3E89: +case 0x308A: +case 0x328A: +case 0x348A: +case 0x368A: +case 0x388A: +case 0x3A8A: +case 0x3C8A: +case 0x3E8A: +case 0x308B: +case 0x328B: +case 0x348B: +case 0x368B: +case 0x388B: +case 0x3A8B: +case 0x3C8B: +case 0x3E8B: +case 0x308C: +case 0x328C: +case 0x348C: +case 0x368C: +case 0x388C: +case 0x3A8C: +case 0x3C8C: +case 0x3E8C: +case 0x308D: +case 0x328D: +case 0x348D: +case 0x368D: +case 0x388D: +case 0x3A8D: +case 0x3C8D: +case 0x3E8D: +case 0x308E: +case 0x328E: +case 0x348E: +case 0x368E: +case 0x388E: +case 0x3A8E: +case 0x3C8E: +case 0x3E8E: +case 0x308F: +case 0x328F: +case 0x348F: +case 0x368F: +case 0x388F: +case 0x3A8F: +case 0x3C8F: +case 0x3E8F: + +// MOVEW +case 0x3088: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32C8: +case 0x34C8: +case 0x36C8: +case 0x38C8: +case 0x3AC8: +case 0x3CC8: +case 0x30C9: +case 0x32C9: +case 0x34C9: +case 0x36C9: +case 0x38C9: +case 0x3AC9: +case 0x3CC9: +case 0x30CA: +case 0x32CA: +case 0x34CA: +case 0x36CA: +case 0x38CA: +case 0x3ACA: +case 0x3CCA: +case 0x30CB: +case 0x32CB: +case 0x34CB: +case 0x36CB: +case 0x38CB: +case 0x3ACB: +case 0x3CCB: +case 0x30CC: +case 0x32CC: +case 0x34CC: +case 0x36CC: +case 0x38CC: +case 0x3ACC: +case 0x3CCC: +case 0x30CD: +case 0x32CD: +case 0x34CD: +case 0x36CD: +case 0x38CD: +case 0x3ACD: +case 0x3CCD: +case 0x30CE: +case 0x32CE: +case 0x34CE: +case 0x36CE: +case 0x38CE: +case 0x3ACE: +case 0x3CCE: +case 0x30CF: +case 0x32CF: +case 0x34CF: +case 0x36CF: +case 0x38CF: +case 0x3ACF: +case 0x3CCF: + +// MOVEW +case 0x30C8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3308: +case 0x3508: +case 0x3708: +case 0x3908: +case 0x3B08: +case 0x3D08: +case 0x3109: +case 0x3309: +case 0x3509: +case 0x3709: +case 0x3909: +case 0x3B09: +case 0x3D09: +case 0x310A: +case 0x330A: +case 0x350A: +case 0x370A: +case 0x390A: +case 0x3B0A: +case 0x3D0A: +case 0x310B: +case 0x330B: +case 0x350B: +case 0x370B: +case 0x390B: +case 0x3B0B: +case 0x3D0B: +case 0x310C: +case 0x330C: +case 0x350C: +case 0x370C: +case 0x390C: +case 0x3B0C: +case 0x3D0C: +case 0x310D: +case 0x330D: +case 0x350D: +case 0x370D: +case 0x390D: +case 0x3B0D: +case 0x3D0D: +case 0x310E: +case 0x330E: +case 0x350E: +case 0x370E: +case 0x390E: +case 0x3B0E: +case 0x3D0E: +case 0x310F: +case 0x330F: +case 0x350F: +case 0x370F: +case 0x390F: +case 0x3B0F: +case 0x3D0F: + +// MOVEW +case 0x3108: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3348: +case 0x3548: +case 0x3748: +case 0x3948: +case 0x3B48: +case 0x3D48: +case 0x3F48: +case 0x3149: +case 0x3349: +case 0x3549: +case 0x3749: +case 0x3949: +case 0x3B49: +case 0x3D49: +case 0x3F49: +case 0x314A: +case 0x334A: +case 0x354A: +case 0x374A: +case 0x394A: +case 0x3B4A: +case 0x3D4A: +case 0x3F4A: +case 0x314B: +case 0x334B: +case 0x354B: +case 0x374B: +case 0x394B: +case 0x3B4B: +case 0x3D4B: +case 0x3F4B: +case 0x314C: +case 0x334C: +case 0x354C: +case 0x374C: +case 0x394C: +case 0x3B4C: +case 0x3D4C: +case 0x3F4C: +case 0x314D: +case 0x334D: +case 0x354D: +case 0x374D: +case 0x394D: +case 0x3B4D: +case 0x3D4D: +case 0x3F4D: +case 0x314E: +case 0x334E: +case 0x354E: +case 0x374E: +case 0x394E: +case 0x3B4E: +case 0x3D4E: +case 0x3F4E: +case 0x314F: +case 0x334F: +case 0x354F: +case 0x374F: +case 0x394F: +case 0x3B4F: +case 0x3D4F: +case 0x3F4F: + +// MOVEW +case 0x3148: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3388: +case 0x3588: +case 0x3788: +case 0x3988: +case 0x3B88: +case 0x3D88: +case 0x3F88: +case 0x3189: +case 0x3389: +case 0x3589: +case 0x3789: +case 0x3989: +case 0x3B89: +case 0x3D89: +case 0x3F89: +case 0x318A: +case 0x338A: +case 0x358A: +case 0x378A: +case 0x398A: +case 0x3B8A: +case 0x3D8A: +case 0x3F8A: +case 0x318B: +case 0x338B: +case 0x358B: +case 0x378B: +case 0x398B: +case 0x3B8B: +case 0x3D8B: +case 0x3F8B: +case 0x318C: +case 0x338C: +case 0x358C: +case 0x378C: +case 0x398C: +case 0x3B8C: +case 0x3D8C: +case 0x3F8C: +case 0x318D: +case 0x338D: +case 0x358D: +case 0x378D: +case 0x398D: +case 0x3B8D: +case 0x3D8D: +case 0x3F8D: +case 0x318E: +case 0x338E: +case 0x358E: +case 0x378E: +case 0x398E: +case 0x3B8E: +case 0x3D8E: +case 0x3F8E: +case 0x318F: +case 0x338F: +case 0x358F: +case 0x378F: +case 0x398F: +case 0x3B8F: +case 0x3D8F: +case 0x3F8F: + +// MOVEW +case 0x3188: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31C9: +case 0x31CA: +case 0x31CB: +case 0x31CC: +case 0x31CD: +case 0x31CE: +case 0x31CF: + +// MOVEW +case 0x31C8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33C9: +case 0x33CA: +case 0x33CB: +case 0x33CC: +case 0x33CD: +case 0x33CE: +case 0x33CF: + +// MOVEW +case 0x33C8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3EC9: +case 0x3ECA: +case 0x3ECB: +case 0x3ECC: +case 0x3ECD: +case 0x3ECE: +case 0x3ECF: + +// MOVEW +case 0x3EC8: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F09: +case 0x3F0A: +case 0x3F0B: +case 0x3F0C: +case 0x3F0D: +case 0x3F0E: +case 0x3F0F: + +// MOVEW +case 0x3F08: +{ + u32 adr; + u32 res; + timestamp += 4; + res = (u16)CPU->A[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3210: +case 0x3410: +case 0x3610: +case 0x3810: +case 0x3A10: +case 0x3C10: +case 0x3E10: +case 0x3011: +case 0x3211: +case 0x3411: +case 0x3611: +case 0x3811: +case 0x3A11: +case 0x3C11: +case 0x3E11: +case 0x3012: +case 0x3212: +case 0x3412: +case 0x3612: +case 0x3812: +case 0x3A12: +case 0x3C12: +case 0x3E12: +case 0x3013: +case 0x3213: +case 0x3413: +case 0x3613: +case 0x3813: +case 0x3A13: +case 0x3C13: +case 0x3E13: +case 0x3014: +case 0x3214: +case 0x3414: +case 0x3614: +case 0x3814: +case 0x3A14: +case 0x3C14: +case 0x3E14: +case 0x3015: +case 0x3215: +case 0x3415: +case 0x3615: +case 0x3815: +case 0x3A15: +case 0x3C15: +case 0x3E15: +case 0x3016: +case 0x3216: +case 0x3416: +case 0x3616: +case 0x3816: +case 0x3A16: +case 0x3C16: +case 0x3E16: +case 0x3017: +case 0x3217: +case 0x3417: +case 0x3617: +case 0x3817: +case 0x3A17: +case 0x3C17: +case 0x3E17: + +// MOVEW +case 0x3010: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x3290: +case 0x3490: +case 0x3690: +case 0x3890: +case 0x3A90: +case 0x3C90: +case 0x3E90: +case 0x3091: +case 0x3291: +case 0x3491: +case 0x3691: +case 0x3891: +case 0x3A91: +case 0x3C91: +case 0x3E91: +case 0x3092: +case 0x3292: +case 0x3492: +case 0x3692: +case 0x3892: +case 0x3A92: +case 0x3C92: +case 0x3E92: +case 0x3093: +case 0x3293: +case 0x3493: +case 0x3693: +case 0x3893: +case 0x3A93: +case 0x3C93: +case 0x3E93: +case 0x3094: +case 0x3294: +case 0x3494: +case 0x3694: +case 0x3894: +case 0x3A94: +case 0x3C94: +case 0x3E94: +case 0x3095: +case 0x3295: +case 0x3495: +case 0x3695: +case 0x3895: +case 0x3A95: +case 0x3C95: +case 0x3E95: +case 0x3096: +case 0x3296: +case 0x3496: +case 0x3696: +case 0x3896: +case 0x3A96: +case 0x3C96: +case 0x3E96: +case 0x3097: +case 0x3297: +case 0x3497: +case 0x3697: +case 0x3897: +case 0x3A97: +case 0x3C97: +case 0x3E97: + +// MOVEW +case 0x3090: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32D0: +case 0x34D0: +case 0x36D0: +case 0x38D0: +case 0x3AD0: +case 0x3CD0: +case 0x30D1: +case 0x32D1: +case 0x34D1: +case 0x36D1: +case 0x38D1: +case 0x3AD1: +case 0x3CD1: +case 0x30D2: +case 0x32D2: +case 0x34D2: +case 0x36D2: +case 0x38D2: +case 0x3AD2: +case 0x3CD2: +case 0x30D3: +case 0x32D3: +case 0x34D3: +case 0x36D3: +case 0x38D3: +case 0x3AD3: +case 0x3CD3: +case 0x30D4: +case 0x32D4: +case 0x34D4: +case 0x36D4: +case 0x38D4: +case 0x3AD4: +case 0x3CD4: +case 0x30D5: +case 0x32D5: +case 0x34D5: +case 0x36D5: +case 0x38D5: +case 0x3AD5: +case 0x3CD5: +case 0x30D6: +case 0x32D6: +case 0x34D6: +case 0x36D6: +case 0x38D6: +case 0x3AD6: +case 0x3CD6: +case 0x30D7: +case 0x32D7: +case 0x34D7: +case 0x36D7: +case 0x38D7: +case 0x3AD7: +case 0x3CD7: + +// MOVEW +case 0x30D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3310: +case 0x3510: +case 0x3710: +case 0x3910: +case 0x3B10: +case 0x3D10: +case 0x3111: +case 0x3311: +case 0x3511: +case 0x3711: +case 0x3911: +case 0x3B11: +case 0x3D11: +case 0x3112: +case 0x3312: +case 0x3512: +case 0x3712: +case 0x3912: +case 0x3B12: +case 0x3D12: +case 0x3113: +case 0x3313: +case 0x3513: +case 0x3713: +case 0x3913: +case 0x3B13: +case 0x3D13: +case 0x3114: +case 0x3314: +case 0x3514: +case 0x3714: +case 0x3914: +case 0x3B14: +case 0x3D14: +case 0x3115: +case 0x3315: +case 0x3515: +case 0x3715: +case 0x3915: +case 0x3B15: +case 0x3D15: +case 0x3116: +case 0x3316: +case 0x3516: +case 0x3716: +case 0x3916: +case 0x3B16: +case 0x3D16: +case 0x3117: +case 0x3317: +case 0x3517: +case 0x3717: +case 0x3917: +case 0x3B17: +case 0x3D17: + +// MOVEW +case 0x3110: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3350: +case 0x3550: +case 0x3750: +case 0x3950: +case 0x3B50: +case 0x3D50: +case 0x3F50: +case 0x3151: +case 0x3351: +case 0x3551: +case 0x3751: +case 0x3951: +case 0x3B51: +case 0x3D51: +case 0x3F51: +case 0x3152: +case 0x3352: +case 0x3552: +case 0x3752: +case 0x3952: +case 0x3B52: +case 0x3D52: +case 0x3F52: +case 0x3153: +case 0x3353: +case 0x3553: +case 0x3753: +case 0x3953: +case 0x3B53: +case 0x3D53: +case 0x3F53: +case 0x3154: +case 0x3354: +case 0x3554: +case 0x3754: +case 0x3954: +case 0x3B54: +case 0x3D54: +case 0x3F54: +case 0x3155: +case 0x3355: +case 0x3555: +case 0x3755: +case 0x3955: +case 0x3B55: +case 0x3D55: +case 0x3F55: +case 0x3156: +case 0x3356: +case 0x3556: +case 0x3756: +case 0x3956: +case 0x3B56: +case 0x3D56: +case 0x3F56: +case 0x3157: +case 0x3357: +case 0x3557: +case 0x3757: +case 0x3957: +case 0x3B57: +case 0x3D57: +case 0x3F57: + +// MOVEW +case 0x3150: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3390: +case 0x3590: +case 0x3790: +case 0x3990: +case 0x3B90: +case 0x3D90: +case 0x3F90: +case 0x3191: +case 0x3391: +case 0x3591: +case 0x3791: +case 0x3991: +case 0x3B91: +case 0x3D91: +case 0x3F91: +case 0x3192: +case 0x3392: +case 0x3592: +case 0x3792: +case 0x3992: +case 0x3B92: +case 0x3D92: +case 0x3F92: +case 0x3193: +case 0x3393: +case 0x3593: +case 0x3793: +case 0x3993: +case 0x3B93: +case 0x3D93: +case 0x3F93: +case 0x3194: +case 0x3394: +case 0x3594: +case 0x3794: +case 0x3994: +case 0x3B94: +case 0x3D94: +case 0x3F94: +case 0x3195: +case 0x3395: +case 0x3595: +case 0x3795: +case 0x3995: +case 0x3B95: +case 0x3D95: +case 0x3F95: +case 0x3196: +case 0x3396: +case 0x3596: +case 0x3796: +case 0x3996: +case 0x3B96: +case 0x3D96: +case 0x3F96: +case 0x3197: +case 0x3397: +case 0x3597: +case 0x3797: +case 0x3997: +case 0x3B97: +case 0x3D97: +case 0x3F97: + +// MOVEW +case 0x3190: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31D1: +case 0x31D2: +case 0x31D3: +case 0x31D4: +case 0x31D5: +case 0x31D6: +case 0x31D7: + +// MOVEW +case 0x31D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33D1: +case 0x33D2: +case 0x33D3: +case 0x33D4: +case 0x33D5: +case 0x33D6: +case 0x33D7: + +// MOVEW +case 0x33D0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3ED1: +case 0x3ED2: +case 0x3ED3: +case 0x3ED4: +case 0x3ED5: +case 0x3ED6: +case 0x3ED7: + +// MOVEW +case 0x3ED0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F11: +case 0x3F12: +case 0x3F13: +case 0x3F14: +case 0x3F15: +case 0x3F16: +case 0x3F17: + +// MOVEW +case 0x3F10: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3218: +case 0x3418: +case 0x3618: +case 0x3818: +case 0x3A18: +case 0x3C18: +case 0x3E18: +case 0x3019: +case 0x3219: +case 0x3419: +case 0x3619: +case 0x3819: +case 0x3A19: +case 0x3C19: +case 0x3E19: +case 0x301A: +case 0x321A: +case 0x341A: +case 0x361A: +case 0x381A: +case 0x3A1A: +case 0x3C1A: +case 0x3E1A: +case 0x301B: +case 0x321B: +case 0x341B: +case 0x361B: +case 0x381B: +case 0x3A1B: +case 0x3C1B: +case 0x3E1B: +case 0x301C: +case 0x321C: +case 0x341C: +case 0x361C: +case 0x381C: +case 0x3A1C: +case 0x3C1C: +case 0x3E1C: +case 0x301D: +case 0x321D: +case 0x341D: +case 0x361D: +case 0x381D: +case 0x3A1D: +case 0x3C1D: +case 0x3E1D: +case 0x301E: +case 0x321E: +case 0x341E: +case 0x361E: +case 0x381E: +case 0x3A1E: +case 0x3C1E: +case 0x3E1E: + +// MOVEW +case 0x3018: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x3298: +case 0x3498: +case 0x3698: +case 0x3898: +case 0x3A98: +case 0x3C98: +case 0x3E98: +case 0x3099: +case 0x3299: +case 0x3499: +case 0x3699: +case 0x3899: +case 0x3A99: +case 0x3C99: +case 0x3E99: +case 0x309A: +case 0x329A: +case 0x349A: +case 0x369A: +case 0x389A: +case 0x3A9A: +case 0x3C9A: +case 0x3E9A: +case 0x309B: +case 0x329B: +case 0x349B: +case 0x369B: +case 0x389B: +case 0x3A9B: +case 0x3C9B: +case 0x3E9B: +case 0x309C: +case 0x329C: +case 0x349C: +case 0x369C: +case 0x389C: +case 0x3A9C: +case 0x3C9C: +case 0x3E9C: +case 0x309D: +case 0x329D: +case 0x349D: +case 0x369D: +case 0x389D: +case 0x3A9D: +case 0x3C9D: +case 0x3E9D: +case 0x309E: +case 0x329E: +case 0x349E: +case 0x369E: +case 0x389E: +case 0x3A9E: +case 0x3C9E: +case 0x3E9E: + +// MOVEW +case 0x3098: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32D8: +case 0x34D8: +case 0x36D8: +case 0x38D8: +case 0x3AD8: +case 0x3CD8: +case 0x30D9: +case 0x32D9: +case 0x34D9: +case 0x36D9: +case 0x38D9: +case 0x3AD9: +case 0x3CD9: +case 0x30DA: +case 0x32DA: +case 0x34DA: +case 0x36DA: +case 0x38DA: +case 0x3ADA: +case 0x3CDA: +case 0x30DB: +case 0x32DB: +case 0x34DB: +case 0x36DB: +case 0x38DB: +case 0x3ADB: +case 0x3CDB: +case 0x30DC: +case 0x32DC: +case 0x34DC: +case 0x36DC: +case 0x38DC: +case 0x3ADC: +case 0x3CDC: +case 0x30DD: +case 0x32DD: +case 0x34DD: +case 0x36DD: +case 0x38DD: +case 0x3ADD: +case 0x3CDD: +case 0x30DE: +case 0x32DE: +case 0x34DE: +case 0x36DE: +case 0x38DE: +case 0x3ADE: +case 0x3CDE: + +// MOVEW +case 0x30D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3318: +case 0x3518: +case 0x3718: +case 0x3918: +case 0x3B18: +case 0x3D18: +case 0x3119: +case 0x3319: +case 0x3519: +case 0x3719: +case 0x3919: +case 0x3B19: +case 0x3D19: +case 0x311A: +case 0x331A: +case 0x351A: +case 0x371A: +case 0x391A: +case 0x3B1A: +case 0x3D1A: +case 0x311B: +case 0x331B: +case 0x351B: +case 0x371B: +case 0x391B: +case 0x3B1B: +case 0x3D1B: +case 0x311C: +case 0x331C: +case 0x351C: +case 0x371C: +case 0x391C: +case 0x3B1C: +case 0x3D1C: +case 0x311D: +case 0x331D: +case 0x351D: +case 0x371D: +case 0x391D: +case 0x3B1D: +case 0x3D1D: +case 0x311E: +case 0x331E: +case 0x351E: +case 0x371E: +case 0x391E: +case 0x3B1E: +case 0x3D1E: + +// MOVEW +case 0x3118: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3358: +case 0x3558: +case 0x3758: +case 0x3958: +case 0x3B58: +case 0x3D58: +case 0x3F58: +case 0x3159: +case 0x3359: +case 0x3559: +case 0x3759: +case 0x3959: +case 0x3B59: +case 0x3D59: +case 0x3F59: +case 0x315A: +case 0x335A: +case 0x355A: +case 0x375A: +case 0x395A: +case 0x3B5A: +case 0x3D5A: +case 0x3F5A: +case 0x315B: +case 0x335B: +case 0x355B: +case 0x375B: +case 0x395B: +case 0x3B5B: +case 0x3D5B: +case 0x3F5B: +case 0x315C: +case 0x335C: +case 0x355C: +case 0x375C: +case 0x395C: +case 0x3B5C: +case 0x3D5C: +case 0x3F5C: +case 0x315D: +case 0x335D: +case 0x355D: +case 0x375D: +case 0x395D: +case 0x3B5D: +case 0x3D5D: +case 0x3F5D: +case 0x315E: +case 0x335E: +case 0x355E: +case 0x375E: +case 0x395E: +case 0x3B5E: +case 0x3D5E: +case 0x3F5E: + +// MOVEW +case 0x3158: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3398: +case 0x3598: +case 0x3798: +case 0x3998: +case 0x3B98: +case 0x3D98: +case 0x3F98: +case 0x3199: +case 0x3399: +case 0x3599: +case 0x3799: +case 0x3999: +case 0x3B99: +case 0x3D99: +case 0x3F99: +case 0x319A: +case 0x339A: +case 0x359A: +case 0x379A: +case 0x399A: +case 0x3B9A: +case 0x3D9A: +case 0x3F9A: +case 0x319B: +case 0x339B: +case 0x359B: +case 0x379B: +case 0x399B: +case 0x3B9B: +case 0x3D9B: +case 0x3F9B: +case 0x319C: +case 0x339C: +case 0x359C: +case 0x379C: +case 0x399C: +case 0x3B9C: +case 0x3D9C: +case 0x3F9C: +case 0x319D: +case 0x339D: +case 0x359D: +case 0x379D: +case 0x399D: +case 0x3B9D: +case 0x3D9D: +case 0x3F9D: +case 0x319E: +case 0x339E: +case 0x359E: +case 0x379E: +case 0x399E: +case 0x3B9E: +case 0x3D9E: +case 0x3F9E: + +// MOVEW +case 0x3198: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31D9: +case 0x31DA: +case 0x31DB: +case 0x31DC: +case 0x31DD: +case 0x31DE: + +// MOVEW +case 0x31D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33D9: +case 0x33DA: +case 0x33DB: +case 0x33DC: +case 0x33DD: +case 0x33DE: + +// MOVEW +case 0x33D8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3ED9: +case 0x3EDA: +case 0x3EDB: +case 0x3EDC: +case 0x3EDD: +case 0x3EDE: + +// MOVEW +case 0x3ED8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F19: +case 0x3F1A: +case 0x3F1B: +case 0x3F1C: +case 0x3F1D: +case 0x3F1E: + +// MOVEW +case 0x3F18: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3220: +case 0x3420: +case 0x3620: +case 0x3820: +case 0x3A20: +case 0x3C20: +case 0x3E20: +case 0x3021: +case 0x3221: +case 0x3421: +case 0x3621: +case 0x3821: +case 0x3A21: +case 0x3C21: +case 0x3E21: +case 0x3022: +case 0x3222: +case 0x3422: +case 0x3622: +case 0x3822: +case 0x3A22: +case 0x3C22: +case 0x3E22: +case 0x3023: +case 0x3223: +case 0x3423: +case 0x3623: +case 0x3823: +case 0x3A23: +case 0x3C23: +case 0x3E23: +case 0x3024: +case 0x3224: +case 0x3424: +case 0x3624: +case 0x3824: +case 0x3A24: +case 0x3C24: +case 0x3E24: +case 0x3025: +case 0x3225: +case 0x3425: +case 0x3625: +case 0x3825: +case 0x3A25: +case 0x3C25: +case 0x3E25: +case 0x3026: +case 0x3226: +case 0x3426: +case 0x3626: +case 0x3826: +case 0x3A26: +case 0x3C26: +case 0x3E26: + +// MOVEW +case 0x3020: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32A0: +case 0x34A0: +case 0x36A0: +case 0x38A0: +case 0x3AA0: +case 0x3CA0: +case 0x3EA0: +case 0x30A1: +case 0x32A1: +case 0x34A1: +case 0x36A1: +case 0x38A1: +case 0x3AA1: +case 0x3CA1: +case 0x3EA1: +case 0x30A2: +case 0x32A2: +case 0x34A2: +case 0x36A2: +case 0x38A2: +case 0x3AA2: +case 0x3CA2: +case 0x3EA2: +case 0x30A3: +case 0x32A3: +case 0x34A3: +case 0x36A3: +case 0x38A3: +case 0x3AA3: +case 0x3CA3: +case 0x3EA3: +case 0x30A4: +case 0x32A4: +case 0x34A4: +case 0x36A4: +case 0x38A4: +case 0x3AA4: +case 0x3CA4: +case 0x3EA4: +case 0x30A5: +case 0x32A5: +case 0x34A5: +case 0x36A5: +case 0x38A5: +case 0x3AA5: +case 0x3CA5: +case 0x3EA5: +case 0x30A6: +case 0x32A6: +case 0x34A6: +case 0x36A6: +case 0x38A6: +case 0x3AA6: +case 0x3CA6: +case 0x3EA6: + +// MOVEW +case 0x30A0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32E0: +case 0x34E0: +case 0x36E0: +case 0x38E0: +case 0x3AE0: +case 0x3CE0: +case 0x30E1: +case 0x32E1: +case 0x34E1: +case 0x36E1: +case 0x38E1: +case 0x3AE1: +case 0x3CE1: +case 0x30E2: +case 0x32E2: +case 0x34E2: +case 0x36E2: +case 0x38E2: +case 0x3AE2: +case 0x3CE2: +case 0x30E3: +case 0x32E3: +case 0x34E3: +case 0x36E3: +case 0x38E3: +case 0x3AE3: +case 0x3CE3: +case 0x30E4: +case 0x32E4: +case 0x34E4: +case 0x36E4: +case 0x38E4: +case 0x3AE4: +case 0x3CE4: +case 0x30E5: +case 0x32E5: +case 0x34E5: +case 0x36E5: +case 0x38E5: +case 0x3AE5: +case 0x3CE5: +case 0x30E6: +case 0x32E6: +case 0x34E6: +case 0x36E6: +case 0x38E6: +case 0x3AE6: +case 0x3CE6: + +// MOVEW +case 0x30E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3320: +case 0x3520: +case 0x3720: +case 0x3920: +case 0x3B20: +case 0x3D20: +case 0x3121: +case 0x3321: +case 0x3521: +case 0x3721: +case 0x3921: +case 0x3B21: +case 0x3D21: +case 0x3122: +case 0x3322: +case 0x3522: +case 0x3722: +case 0x3922: +case 0x3B22: +case 0x3D22: +case 0x3123: +case 0x3323: +case 0x3523: +case 0x3723: +case 0x3923: +case 0x3B23: +case 0x3D23: +case 0x3124: +case 0x3324: +case 0x3524: +case 0x3724: +case 0x3924: +case 0x3B24: +case 0x3D24: +case 0x3125: +case 0x3325: +case 0x3525: +case 0x3725: +case 0x3925: +case 0x3B25: +case 0x3D25: +case 0x3126: +case 0x3326: +case 0x3526: +case 0x3726: +case 0x3926: +case 0x3B26: +case 0x3D26: + +// MOVEW +case 0x3120: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3360: +case 0x3560: +case 0x3760: +case 0x3960: +case 0x3B60: +case 0x3D60: +case 0x3F60: +case 0x3161: +case 0x3361: +case 0x3561: +case 0x3761: +case 0x3961: +case 0x3B61: +case 0x3D61: +case 0x3F61: +case 0x3162: +case 0x3362: +case 0x3562: +case 0x3762: +case 0x3962: +case 0x3B62: +case 0x3D62: +case 0x3F62: +case 0x3163: +case 0x3363: +case 0x3563: +case 0x3763: +case 0x3963: +case 0x3B63: +case 0x3D63: +case 0x3F63: +case 0x3164: +case 0x3364: +case 0x3564: +case 0x3764: +case 0x3964: +case 0x3B64: +case 0x3D64: +case 0x3F64: +case 0x3165: +case 0x3365: +case 0x3565: +case 0x3765: +case 0x3965: +case 0x3B65: +case 0x3D65: +case 0x3F65: +case 0x3166: +case 0x3366: +case 0x3566: +case 0x3766: +case 0x3966: +case 0x3B66: +case 0x3D66: +case 0x3F66: + +// MOVEW +case 0x3160: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33A0: +case 0x35A0: +case 0x37A0: +case 0x39A0: +case 0x3BA0: +case 0x3DA0: +case 0x3FA0: +case 0x31A1: +case 0x33A1: +case 0x35A1: +case 0x37A1: +case 0x39A1: +case 0x3BA1: +case 0x3DA1: +case 0x3FA1: +case 0x31A2: +case 0x33A2: +case 0x35A2: +case 0x37A2: +case 0x39A2: +case 0x3BA2: +case 0x3DA2: +case 0x3FA2: +case 0x31A3: +case 0x33A3: +case 0x35A3: +case 0x37A3: +case 0x39A3: +case 0x3BA3: +case 0x3DA3: +case 0x3FA3: +case 0x31A4: +case 0x33A4: +case 0x35A4: +case 0x37A4: +case 0x39A4: +case 0x3BA4: +case 0x3DA4: +case 0x3FA4: +case 0x31A5: +case 0x33A5: +case 0x35A5: +case 0x37A5: +case 0x39A5: +case 0x3BA5: +case 0x3DA5: +case 0x3FA5: +case 0x31A6: +case 0x33A6: +case 0x35A6: +case 0x37A6: +case 0x39A6: +case 0x3BA6: +case 0x3DA6: +case 0x3FA6: + +// MOVEW +case 0x31A0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31E1: +case 0x31E2: +case 0x31E3: +case 0x31E4: +case 0x31E5: +case 0x31E6: + +// MOVEW +case 0x31E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33E1: +case 0x33E2: +case 0x33E3: +case 0x33E4: +case 0x33E5: +case 0x33E6: + +// MOVEW +case 0x33E0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3EE1: +case 0x3EE2: +case 0x3EE3: +case 0x3EE4: +case 0x3EE5: +case 0x3EE6: + +// MOVEW +case 0x3EE0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F21: +case 0x3F22: +case 0x3F23: +case 0x3F24: +case 0x3F25: +case 0x3F26: + +// MOVEW +case 0x3F20: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3228: +case 0x3428: +case 0x3628: +case 0x3828: +case 0x3A28: +case 0x3C28: +case 0x3E28: +case 0x3029: +case 0x3229: +case 0x3429: +case 0x3629: +case 0x3829: +case 0x3A29: +case 0x3C29: +case 0x3E29: +case 0x302A: +case 0x322A: +case 0x342A: +case 0x362A: +case 0x382A: +case 0x3A2A: +case 0x3C2A: +case 0x3E2A: +case 0x302B: +case 0x322B: +case 0x342B: +case 0x362B: +case 0x382B: +case 0x3A2B: +case 0x3C2B: +case 0x3E2B: +case 0x302C: +case 0x322C: +case 0x342C: +case 0x362C: +case 0x382C: +case 0x3A2C: +case 0x3C2C: +case 0x3E2C: +case 0x302D: +case 0x322D: +case 0x342D: +case 0x362D: +case 0x382D: +case 0x3A2D: +case 0x3C2D: +case 0x3E2D: +case 0x302E: +case 0x322E: +case 0x342E: +case 0x362E: +case 0x382E: +case 0x3A2E: +case 0x3C2E: +case 0x3E2E: +case 0x302F: +case 0x322F: +case 0x342F: +case 0x362F: +case 0x382F: +case 0x3A2F: +case 0x3C2F: +case 0x3E2F: + +// MOVEW +case 0x3028: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32A8: +case 0x34A8: +case 0x36A8: +case 0x38A8: +case 0x3AA8: +case 0x3CA8: +case 0x3EA8: +case 0x30A9: +case 0x32A9: +case 0x34A9: +case 0x36A9: +case 0x38A9: +case 0x3AA9: +case 0x3CA9: +case 0x3EA9: +case 0x30AA: +case 0x32AA: +case 0x34AA: +case 0x36AA: +case 0x38AA: +case 0x3AAA: +case 0x3CAA: +case 0x3EAA: +case 0x30AB: +case 0x32AB: +case 0x34AB: +case 0x36AB: +case 0x38AB: +case 0x3AAB: +case 0x3CAB: +case 0x3EAB: +case 0x30AC: +case 0x32AC: +case 0x34AC: +case 0x36AC: +case 0x38AC: +case 0x3AAC: +case 0x3CAC: +case 0x3EAC: +case 0x30AD: +case 0x32AD: +case 0x34AD: +case 0x36AD: +case 0x38AD: +case 0x3AAD: +case 0x3CAD: +case 0x3EAD: +case 0x30AE: +case 0x32AE: +case 0x34AE: +case 0x36AE: +case 0x38AE: +case 0x3AAE: +case 0x3CAE: +case 0x3EAE: +case 0x30AF: +case 0x32AF: +case 0x34AF: +case 0x36AF: +case 0x38AF: +case 0x3AAF: +case 0x3CAF: +case 0x3EAF: + +// MOVEW +case 0x30A8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32E8: +case 0x34E8: +case 0x36E8: +case 0x38E8: +case 0x3AE8: +case 0x3CE8: +case 0x30E9: +case 0x32E9: +case 0x34E9: +case 0x36E9: +case 0x38E9: +case 0x3AE9: +case 0x3CE9: +case 0x30EA: +case 0x32EA: +case 0x34EA: +case 0x36EA: +case 0x38EA: +case 0x3AEA: +case 0x3CEA: +case 0x30EB: +case 0x32EB: +case 0x34EB: +case 0x36EB: +case 0x38EB: +case 0x3AEB: +case 0x3CEB: +case 0x30EC: +case 0x32EC: +case 0x34EC: +case 0x36EC: +case 0x38EC: +case 0x3AEC: +case 0x3CEC: +case 0x30ED: +case 0x32ED: +case 0x34ED: +case 0x36ED: +case 0x38ED: +case 0x3AED: +case 0x3CED: +case 0x30EE: +case 0x32EE: +case 0x34EE: +case 0x36EE: +case 0x38EE: +case 0x3AEE: +case 0x3CEE: +case 0x30EF: +case 0x32EF: +case 0x34EF: +case 0x36EF: +case 0x38EF: +case 0x3AEF: +case 0x3CEF: + +// MOVEW +case 0x30E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3328: +case 0x3528: +case 0x3728: +case 0x3928: +case 0x3B28: +case 0x3D28: +case 0x3129: +case 0x3329: +case 0x3529: +case 0x3729: +case 0x3929: +case 0x3B29: +case 0x3D29: +case 0x312A: +case 0x332A: +case 0x352A: +case 0x372A: +case 0x392A: +case 0x3B2A: +case 0x3D2A: +case 0x312B: +case 0x332B: +case 0x352B: +case 0x372B: +case 0x392B: +case 0x3B2B: +case 0x3D2B: +case 0x312C: +case 0x332C: +case 0x352C: +case 0x372C: +case 0x392C: +case 0x3B2C: +case 0x3D2C: +case 0x312D: +case 0x332D: +case 0x352D: +case 0x372D: +case 0x392D: +case 0x3B2D: +case 0x3D2D: +case 0x312E: +case 0x332E: +case 0x352E: +case 0x372E: +case 0x392E: +case 0x3B2E: +case 0x3D2E: +case 0x312F: +case 0x332F: +case 0x352F: +case 0x372F: +case 0x392F: +case 0x3B2F: +case 0x3D2F: + +// MOVEW +case 0x3128: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3368: +case 0x3568: +case 0x3768: +case 0x3968: +case 0x3B68: +case 0x3D68: +case 0x3F68: +case 0x3169: +case 0x3369: +case 0x3569: +case 0x3769: +case 0x3969: +case 0x3B69: +case 0x3D69: +case 0x3F69: +case 0x316A: +case 0x336A: +case 0x356A: +case 0x376A: +case 0x396A: +case 0x3B6A: +case 0x3D6A: +case 0x3F6A: +case 0x316B: +case 0x336B: +case 0x356B: +case 0x376B: +case 0x396B: +case 0x3B6B: +case 0x3D6B: +case 0x3F6B: +case 0x316C: +case 0x336C: +case 0x356C: +case 0x376C: +case 0x396C: +case 0x3B6C: +case 0x3D6C: +case 0x3F6C: +case 0x316D: +case 0x336D: +case 0x356D: +case 0x376D: +case 0x396D: +case 0x3B6D: +case 0x3D6D: +case 0x3F6D: +case 0x316E: +case 0x336E: +case 0x356E: +case 0x376E: +case 0x396E: +case 0x3B6E: +case 0x3D6E: +case 0x3F6E: +case 0x316F: +case 0x336F: +case 0x356F: +case 0x376F: +case 0x396F: +case 0x3B6F: +case 0x3D6F: +case 0x3F6F: + +// MOVEW +case 0x3168: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33A8: +case 0x35A8: +case 0x37A8: +case 0x39A8: +case 0x3BA8: +case 0x3DA8: +case 0x3FA8: +case 0x31A9: +case 0x33A9: +case 0x35A9: +case 0x37A9: +case 0x39A9: +case 0x3BA9: +case 0x3DA9: +case 0x3FA9: +case 0x31AA: +case 0x33AA: +case 0x35AA: +case 0x37AA: +case 0x39AA: +case 0x3BAA: +case 0x3DAA: +case 0x3FAA: +case 0x31AB: +case 0x33AB: +case 0x35AB: +case 0x37AB: +case 0x39AB: +case 0x3BAB: +case 0x3DAB: +case 0x3FAB: +case 0x31AC: +case 0x33AC: +case 0x35AC: +case 0x37AC: +case 0x39AC: +case 0x3BAC: +case 0x3DAC: +case 0x3FAC: +case 0x31AD: +case 0x33AD: +case 0x35AD: +case 0x37AD: +case 0x39AD: +case 0x3BAD: +case 0x3DAD: +case 0x3FAD: +case 0x31AE: +case 0x33AE: +case 0x35AE: +case 0x37AE: +case 0x39AE: +case 0x3BAE: +case 0x3DAE: +case 0x3FAE: +case 0x31AF: +case 0x33AF: +case 0x35AF: +case 0x37AF: +case 0x39AF: +case 0x3BAF: +case 0x3DAF: +case 0x3FAF: + +// MOVEW +case 0x31A8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31E9: +case 0x31EA: +case 0x31EB: +case 0x31EC: +case 0x31ED: +case 0x31EE: +case 0x31EF: + +// MOVEW +case 0x31E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33E9: +case 0x33EA: +case 0x33EB: +case 0x33EC: +case 0x33ED: +case 0x33EE: +case 0x33EF: + +// MOVEW +case 0x33E8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3EE9: +case 0x3EEA: +case 0x3EEB: +case 0x3EEC: +case 0x3EED: +case 0x3EEE: +case 0x3EEF: + +// MOVEW +case 0x3EE8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F29: +case 0x3F2A: +case 0x3F2B: +case 0x3F2C: +case 0x3F2D: +case 0x3F2E: +case 0x3F2F: + +// MOVEW +case 0x3F28: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3230: +case 0x3430: +case 0x3630: +case 0x3830: +case 0x3A30: +case 0x3C30: +case 0x3E30: +case 0x3031: +case 0x3231: +case 0x3431: +case 0x3631: +case 0x3831: +case 0x3A31: +case 0x3C31: +case 0x3E31: +case 0x3032: +case 0x3232: +case 0x3432: +case 0x3632: +case 0x3832: +case 0x3A32: +case 0x3C32: +case 0x3E32: +case 0x3033: +case 0x3233: +case 0x3433: +case 0x3633: +case 0x3833: +case 0x3A33: +case 0x3C33: +case 0x3E33: +case 0x3034: +case 0x3234: +case 0x3434: +case 0x3634: +case 0x3834: +case 0x3A34: +case 0x3C34: +case 0x3E34: +case 0x3035: +case 0x3235: +case 0x3435: +case 0x3635: +case 0x3835: +case 0x3A35: +case 0x3C35: +case 0x3E35: +case 0x3036: +case 0x3236: +case 0x3436: +case 0x3636: +case 0x3836: +case 0x3A36: +case 0x3C36: +case 0x3E36: +case 0x3037: +case 0x3237: +case 0x3437: +case 0x3637: +case 0x3837: +case 0x3A37: +case 0x3C37: +case 0x3E37: + +// MOVEW +case 0x3030: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32B0: +case 0x34B0: +case 0x36B0: +case 0x38B0: +case 0x3AB0: +case 0x3CB0: +case 0x3EB0: +case 0x30B1: +case 0x32B1: +case 0x34B1: +case 0x36B1: +case 0x38B1: +case 0x3AB1: +case 0x3CB1: +case 0x3EB1: +case 0x30B2: +case 0x32B2: +case 0x34B2: +case 0x36B2: +case 0x38B2: +case 0x3AB2: +case 0x3CB2: +case 0x3EB2: +case 0x30B3: +case 0x32B3: +case 0x34B3: +case 0x36B3: +case 0x38B3: +case 0x3AB3: +case 0x3CB3: +case 0x3EB3: +case 0x30B4: +case 0x32B4: +case 0x34B4: +case 0x36B4: +case 0x38B4: +case 0x3AB4: +case 0x3CB4: +case 0x3EB4: +case 0x30B5: +case 0x32B5: +case 0x34B5: +case 0x36B5: +case 0x38B5: +case 0x3AB5: +case 0x3CB5: +case 0x3EB5: +case 0x30B6: +case 0x32B6: +case 0x34B6: +case 0x36B6: +case 0x38B6: +case 0x3AB6: +case 0x3CB6: +case 0x3EB6: +case 0x30B7: +case 0x32B7: +case 0x34B7: +case 0x36B7: +case 0x38B7: +case 0x3AB7: +case 0x3CB7: +case 0x3EB7: + +// MOVEW +case 0x30B0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32F0: +case 0x34F0: +case 0x36F0: +case 0x38F0: +case 0x3AF0: +case 0x3CF0: +case 0x30F1: +case 0x32F1: +case 0x34F1: +case 0x36F1: +case 0x38F1: +case 0x3AF1: +case 0x3CF1: +case 0x30F2: +case 0x32F2: +case 0x34F2: +case 0x36F2: +case 0x38F2: +case 0x3AF2: +case 0x3CF2: +case 0x30F3: +case 0x32F3: +case 0x34F3: +case 0x36F3: +case 0x38F3: +case 0x3AF3: +case 0x3CF3: +case 0x30F4: +case 0x32F4: +case 0x34F4: +case 0x36F4: +case 0x38F4: +case 0x3AF4: +case 0x3CF4: +case 0x30F5: +case 0x32F5: +case 0x34F5: +case 0x36F5: +case 0x38F5: +case 0x3AF5: +case 0x3CF5: +case 0x30F6: +case 0x32F6: +case 0x34F6: +case 0x36F6: +case 0x38F6: +case 0x3AF6: +case 0x3CF6: +case 0x30F7: +case 0x32F7: +case 0x34F7: +case 0x36F7: +case 0x38F7: +case 0x3AF7: +case 0x3CF7: + +// MOVEW +case 0x30F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3330: +case 0x3530: +case 0x3730: +case 0x3930: +case 0x3B30: +case 0x3D30: +case 0x3131: +case 0x3331: +case 0x3531: +case 0x3731: +case 0x3931: +case 0x3B31: +case 0x3D31: +case 0x3132: +case 0x3332: +case 0x3532: +case 0x3732: +case 0x3932: +case 0x3B32: +case 0x3D32: +case 0x3133: +case 0x3333: +case 0x3533: +case 0x3733: +case 0x3933: +case 0x3B33: +case 0x3D33: +case 0x3134: +case 0x3334: +case 0x3534: +case 0x3734: +case 0x3934: +case 0x3B34: +case 0x3D34: +case 0x3135: +case 0x3335: +case 0x3535: +case 0x3735: +case 0x3935: +case 0x3B35: +case 0x3D35: +case 0x3136: +case 0x3336: +case 0x3536: +case 0x3736: +case 0x3936: +case 0x3B36: +case 0x3D36: +case 0x3137: +case 0x3337: +case 0x3537: +case 0x3737: +case 0x3937: +case 0x3B37: +case 0x3D37: + +// MOVEW +case 0x3130: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3370: +case 0x3570: +case 0x3770: +case 0x3970: +case 0x3B70: +case 0x3D70: +case 0x3F70: +case 0x3171: +case 0x3371: +case 0x3571: +case 0x3771: +case 0x3971: +case 0x3B71: +case 0x3D71: +case 0x3F71: +case 0x3172: +case 0x3372: +case 0x3572: +case 0x3772: +case 0x3972: +case 0x3B72: +case 0x3D72: +case 0x3F72: +case 0x3173: +case 0x3373: +case 0x3573: +case 0x3773: +case 0x3973: +case 0x3B73: +case 0x3D73: +case 0x3F73: +case 0x3174: +case 0x3374: +case 0x3574: +case 0x3774: +case 0x3974: +case 0x3B74: +case 0x3D74: +case 0x3F74: +case 0x3175: +case 0x3375: +case 0x3575: +case 0x3775: +case 0x3975: +case 0x3B75: +case 0x3D75: +case 0x3F75: +case 0x3176: +case 0x3376: +case 0x3576: +case 0x3776: +case 0x3976: +case 0x3B76: +case 0x3D76: +case 0x3F76: +case 0x3177: +case 0x3377: +case 0x3577: +case 0x3777: +case 0x3977: +case 0x3B77: +case 0x3D77: +case 0x3F77: + +// MOVEW +case 0x3170: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33B0: +case 0x35B0: +case 0x37B0: +case 0x39B0: +case 0x3BB0: +case 0x3DB0: +case 0x3FB0: +case 0x31B1: +case 0x33B1: +case 0x35B1: +case 0x37B1: +case 0x39B1: +case 0x3BB1: +case 0x3DB1: +case 0x3FB1: +case 0x31B2: +case 0x33B2: +case 0x35B2: +case 0x37B2: +case 0x39B2: +case 0x3BB2: +case 0x3DB2: +case 0x3FB2: +case 0x31B3: +case 0x33B3: +case 0x35B3: +case 0x37B3: +case 0x39B3: +case 0x3BB3: +case 0x3DB3: +case 0x3FB3: +case 0x31B4: +case 0x33B4: +case 0x35B4: +case 0x37B4: +case 0x39B4: +case 0x3BB4: +case 0x3DB4: +case 0x3FB4: +case 0x31B5: +case 0x33B5: +case 0x35B5: +case 0x37B5: +case 0x39B5: +case 0x3BB5: +case 0x3DB5: +case 0x3FB5: +case 0x31B6: +case 0x33B6: +case 0x35B6: +case 0x37B6: +case 0x39B6: +case 0x3BB6: +case 0x3DB6: +case 0x3FB6: +case 0x31B7: +case 0x33B7: +case 0x35B7: +case 0x37B7: +case 0x39B7: +case 0x3BB7: +case 0x3DB7: +case 0x3FB7: + +// MOVEW +case 0x31B0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x31F1: +case 0x31F2: +case 0x31F3: +case 0x31F4: +case 0x31F5: +case 0x31F6: +case 0x31F7: + +// MOVEW +case 0x31F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33F1: +case 0x33F2: +case 0x33F3: +case 0x33F4: +case 0x33F5: +case 0x33F6: +case 0x33F7: + +// MOVEW +case 0x33F0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3EF1: +case 0x3EF2: +case 0x3EF3: +case 0x3EF4: +case 0x3EF5: +case 0x3EF6: +case 0x3EF7: + +// MOVEW +case 0x3EF0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3F31: +case 0x3F32: +case 0x3F33: +case 0x3F34: +case 0x3F35: +case 0x3F36: +case 0x3F37: + +// MOVEW +case 0x3F30: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3238: +case 0x3438: +case 0x3638: +case 0x3838: +case 0x3A38: +case 0x3C38: +case 0x3E38: + +// MOVEW +case 0x3038: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32B8: +case 0x34B8: +case 0x36B8: +case 0x38B8: +case 0x3AB8: +case 0x3CB8: +case 0x3EB8: + +// MOVEW +case 0x30B8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32F8: +case 0x34F8: +case 0x36F8: +case 0x38F8: +case 0x3AF8: +case 0x3CF8: + +// MOVEW +case 0x30F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3338: +case 0x3538: +case 0x3738: +case 0x3938: +case 0x3B38: +case 0x3D38: + +// MOVEW +case 0x3138: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3378: +case 0x3578: +case 0x3778: +case 0x3978: +case 0x3B78: +case 0x3D78: +case 0x3F78: + +// MOVEW +case 0x3178: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33B8: +case 0x35B8: +case 0x37B8: +case 0x39B8: +case 0x3BB8: +case 0x3DB8: +case 0x3FB8: + +// MOVEW +case 0x31B8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33F8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EF8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F38: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3239: +case 0x3439: +case 0x3639: +case 0x3839: +case 0x3A39: +case 0x3C39: +case 0x3E39: + +// MOVEW +case 0x3039: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32B9: +case 0x34B9: +case 0x36B9: +case 0x38B9: +case 0x3AB9: +case 0x3CB9: +case 0x3EB9: + +// MOVEW +case 0x30B9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32F9: +case 0x34F9: +case 0x36F9: +case 0x38F9: +case 0x3AF9: +case 0x3CF9: + +// MOVEW +case 0x30F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3339: +case 0x3539: +case 0x3739: +case 0x3939: +case 0x3B39: +case 0x3D39: + +// MOVEW +case 0x3139: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3379: +case 0x3579: +case 0x3779: +case 0x3979: +case 0x3B79: +case 0x3D79: +case 0x3F79: + +// MOVEW +case 0x3179: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33B9: +case 0x35B9: +case 0x37B9: +case 0x39B9: +case 0x3BB9: +case 0x3DB9: +case 0x3FB9: + +// MOVEW +case 0x31B9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33F9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EF9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F39: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x323A: +case 0x343A: +case 0x363A: +case 0x383A: +case 0x3A3A: +case 0x3C3A: +case 0x3E3A: + +// MOVEW +case 0x303A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32BA: +case 0x34BA: +case 0x36BA: +case 0x38BA: +case 0x3ABA: +case 0x3CBA: +case 0x3EBA: + +// MOVEW +case 0x30BA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32FA: +case 0x34FA: +case 0x36FA: +case 0x38FA: +case 0x3AFA: +case 0x3CFA: + +// MOVEW +case 0x30FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x333A: +case 0x353A: +case 0x373A: +case 0x393A: +case 0x3B3A: +case 0x3D3A: + +// MOVEW +case 0x313A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x337A: +case 0x357A: +case 0x377A: +case 0x397A: +case 0x3B7A: +case 0x3D7A: +case 0x3F7A: + +// MOVEW +case 0x317A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33BA: +case 0x35BA: +case 0x37BA: +case 0x39BA: +case 0x3BBA: +case 0x3DBA: +case 0x3FBA: + +// MOVEW +case 0x31BA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33FA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EFA: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F3A: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x323B: +case 0x343B: +case 0x363B: +case 0x383B: +case 0x3A3B: +case 0x3C3B: +case 0x3E3B: + +// MOVEW +case 0x303B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32BB: +case 0x34BB: +case 0x36BB: +case 0x38BB: +case 0x3ABB: +case 0x3CBB: +case 0x3EBB: + +// MOVEW +case 0x30BB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32FB: +case 0x34FB: +case 0x36FB: +case 0x38FB: +case 0x3AFB: +case 0x3CFB: + +// MOVEW +case 0x30FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x333B: +case 0x353B: +case 0x373B: +case 0x393B: +case 0x3B3B: +case 0x3D3B: + +// MOVEW +case 0x313B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x337B: +case 0x357B: +case 0x377B: +case 0x397B: +case 0x3B7B: +case 0x3D7B: +case 0x3F7B: + +// MOVEW +case 0x317B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33BB: +case 0x35BB: +case 0x37BB: +case 0x39BB: +case 0x3BBB: +case 0x3DBB: +case 0x3FBB: + +// MOVEW +case 0x31BB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33FB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EFB: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F3B: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x323C: +case 0x343C: +case 0x363C: +case 0x383C: +case 0x3A3C: +case 0x3C3C: +case 0x3E3C: + +// MOVEW +case 0x303C: +{ + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x32BC: +case 0x34BC: +case 0x36BC: +case 0x38BC: +case 0x3ABC: +case 0x3CBC: +case 0x3EBC: + +// MOVEW +case 0x30BC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32FC: +case 0x34FC: +case 0x36FC: +case 0x38FC: +case 0x3AFC: +case 0x3CFC: + +// MOVEW +case 0x30FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x333C: +case 0x353C: +case 0x373C: +case 0x393C: +case 0x3B3C: +case 0x3D3C: + +// MOVEW +case 0x313C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x337C: +case 0x357C: +case 0x377C: +case 0x397C: +case 0x3B7C: +case 0x3D7C: +case 0x3F7C: + +// MOVEW +case 0x317C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33BC: +case 0x35BC: +case 0x37BC: +case 0x39BC: +case 0x3BBC: +case 0x3DBC: +case 0x3FBC: + +// MOVEW +case 0x31BC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 10; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33FC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EFC: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F3C: +{ + u32 adr; + u32 res; + timestamp += 4; + res = FETCH_WORD; + PC += 2; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x321F: +case 0x341F: +case 0x361F: +case 0x381F: +case 0x3A1F: +case 0x3C1F: +case 0x3E1F: + +// MOVEW +case 0x301F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x329F: +case 0x349F: +case 0x369F: +case 0x389F: +case 0x3A9F: +case 0x3C9F: +case 0x3E9F: + +// MOVEW +case 0x309F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32DF: +case 0x34DF: +case 0x36DF: +case 0x38DF: +case 0x3ADF: +case 0x3CDF: + +// MOVEW +case 0x30DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x331F: +case 0x351F: +case 0x371F: +case 0x391F: +case 0x3B1F: +case 0x3D1F: + +// MOVEW +case 0x311F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x335F: +case 0x355F: +case 0x375F: +case 0x395F: +case 0x3B5F: +case 0x3D5F: +case 0x3F5F: + +// MOVEW +case 0x315F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x339F: +case 0x359F: +case 0x379F: +case 0x399F: +case 0x3B9F: +case 0x3D9F: +case 0x3F9F: + +// MOVEW +case 0x319F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33DF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EDF: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F1F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3227: +case 0x3427: +case 0x3627: +case 0x3827: +case 0x3A27: +case 0x3C27: +case 0x3E27: + +// MOVEW +case 0x3027: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(0) +case 0x32A7: +case 0x34A7: +case 0x36A7: +case 0x38A7: +case 0x3AA7: +case 0x3CA7: +case 0x3EA7: + +// MOVEW +case 0x30A7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x32E7: +case 0x34E7: +case 0x36E7: +case 0x38E7: +case 0x3AE7: +case 0x3CE7: + +// MOVEW +case 0x30E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3327: +case 0x3527: +case 0x3727: +case 0x3927: +case 0x3B27: +case 0x3D27: + +// MOVEW +case 0x3127: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3367: +case 0x3567: +case 0x3767: +case 0x3967: +case 0x3B67: +case 0x3D67: +case 0x3F67: + +// MOVEW +case 0x3167: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x33A7: +case 0x35A7: +case 0x37A7: +case 0x39A7: +case 0x3BA7: +case 0x3DA7: +case 0x3FA7: + +// MOVEW +case 0x31A7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[(Opcode >> 9) & 7]; + DECODE_EXT_WORD + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x31E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x33E7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3EE7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7]; + CPU->A[7] += 2; + WRITE_WOat_F(adr, res) +} +RET(0) + +// MOVEW +case 0x3F27: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x3240: +case 0x3440: +case 0x3640: +case 0x3840: +case 0x3A40: +case 0x3C40: +case 0x3E40: +case 0x3041: +case 0x3241: +case 0x3441: +case 0x3641: +case 0x3841: +case 0x3A41: +case 0x3C41: +case 0x3E41: +case 0x3042: +case 0x3242: +case 0x3442: +case 0x3642: +case 0x3842: +case 0x3A42: +case 0x3C42: +case 0x3E42: +case 0x3043: +case 0x3243: +case 0x3443: +case 0x3643: +case 0x3843: +case 0x3A43: +case 0x3C43: +case 0x3E43: +case 0x3044: +case 0x3244: +case 0x3444: +case 0x3644: +case 0x3844: +case 0x3A44: +case 0x3C44: +case 0x3E44: +case 0x3045: +case 0x3245: +case 0x3445: +case 0x3645: +case 0x3845: +case 0x3A45: +case 0x3C45: +case 0x3E45: +case 0x3046: +case 0x3246: +case 0x3446: +case 0x3646: +case 0x3846: +case 0x3A46: +case 0x3C46: +case 0x3E46: +case 0x3047: +case 0x3247: +case 0x3447: +case 0x3647: +case 0x3847: +case 0x3A47: +case 0x3C47: +case 0x3E47: + +// MOVEAW +case 0x3040: +{ + u32 res; + res = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3248: +case 0x3448: +case 0x3648: +case 0x3848: +case 0x3A48: +case 0x3C48: +case 0x3E48: +case 0x3049: +case 0x3249: +case 0x3449: +case 0x3649: +case 0x3849: +case 0x3A49: +case 0x3C49: +case 0x3E49: +case 0x304A: +case 0x324A: +case 0x344A: +case 0x364A: +case 0x384A: +case 0x3A4A: +case 0x3C4A: +case 0x3E4A: +case 0x304B: +case 0x324B: +case 0x344B: +case 0x364B: +case 0x384B: +case 0x3A4B: +case 0x3C4B: +case 0x3E4B: +case 0x304C: +case 0x324C: +case 0x344C: +case 0x364C: +case 0x384C: +case 0x3A4C: +case 0x3C4C: +case 0x3E4C: +case 0x304D: +case 0x324D: +case 0x344D: +case 0x364D: +case 0x384D: +case 0x3A4D: +case 0x3C4D: +case 0x3E4D: +case 0x304E: +case 0x324E: +case 0x344E: +case 0x364E: +case 0x384E: +case 0x3A4E: +case 0x3C4E: +case 0x3E4E: +case 0x304F: +case 0x324F: +case 0x344F: +case 0x364F: +case 0x384F: +case 0x3A4F: +case 0x3C4F: +case 0x3E4F: + +// MOVEAW +case 0x3048: +{ + u32 res; + res = (s32)(s16)CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3250: +case 0x3450: +case 0x3650: +case 0x3850: +case 0x3A50: +case 0x3C50: +case 0x3E50: +case 0x3051: +case 0x3251: +case 0x3451: +case 0x3651: +case 0x3851: +case 0x3A51: +case 0x3C51: +case 0x3E51: +case 0x3052: +case 0x3252: +case 0x3452: +case 0x3652: +case 0x3852: +case 0x3A52: +case 0x3C52: +case 0x3E52: +case 0x3053: +case 0x3253: +case 0x3453: +case 0x3653: +case 0x3853: +case 0x3A53: +case 0x3C53: +case 0x3E53: +case 0x3054: +case 0x3254: +case 0x3454: +case 0x3654: +case 0x3854: +case 0x3A54: +case 0x3C54: +case 0x3E54: +case 0x3055: +case 0x3255: +case 0x3455: +case 0x3655: +case 0x3855: +case 0x3A55: +case 0x3C55: +case 0x3E55: +case 0x3056: +case 0x3256: +case 0x3456: +case 0x3656: +case 0x3856: +case 0x3A56: +case 0x3C56: +case 0x3E56: +case 0x3057: +case 0x3257: +case 0x3457: +case 0x3657: +case 0x3857: +case 0x3A57: +case 0x3C57: +case 0x3E57: + +// MOVEAW +case 0x3050: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3258: +case 0x3458: +case 0x3658: +case 0x3858: +case 0x3A58: +case 0x3C58: +case 0x3E58: +case 0x3059: +case 0x3259: +case 0x3459: +case 0x3659: +case 0x3859: +case 0x3A59: +case 0x3C59: +case 0x3E59: +case 0x305A: +case 0x325A: +case 0x345A: +case 0x365A: +case 0x385A: +case 0x3A5A: +case 0x3C5A: +case 0x3E5A: +case 0x305B: +case 0x325B: +case 0x345B: +case 0x365B: +case 0x385B: +case 0x3A5B: +case 0x3C5B: +case 0x3E5B: +case 0x305C: +case 0x325C: +case 0x345C: +case 0x365C: +case 0x385C: +case 0x3A5C: +case 0x3C5C: +case 0x3E5C: +case 0x305D: +case 0x325D: +case 0x345D: +case 0x365D: +case 0x385D: +case 0x3A5D: +case 0x3C5D: +case 0x3E5D: +case 0x305E: +case 0x325E: +case 0x345E: +case 0x365E: +case 0x385E: +case 0x3A5E: +case 0x3C5E: +case 0x3E5E: + +// MOVEAW +case 0x3058: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3260: +case 0x3460: +case 0x3660: +case 0x3860: +case 0x3A60: +case 0x3C60: +case 0x3E60: +case 0x3061: +case 0x3261: +case 0x3461: +case 0x3661: +case 0x3861: +case 0x3A61: +case 0x3C61: +case 0x3E61: +case 0x3062: +case 0x3262: +case 0x3462: +case 0x3662: +case 0x3862: +case 0x3A62: +case 0x3C62: +case 0x3E62: +case 0x3063: +case 0x3263: +case 0x3463: +case 0x3663: +case 0x3863: +case 0x3A63: +case 0x3C63: +case 0x3E63: +case 0x3064: +case 0x3264: +case 0x3464: +case 0x3664: +case 0x3864: +case 0x3A64: +case 0x3C64: +case 0x3E64: +case 0x3065: +case 0x3265: +case 0x3465: +case 0x3665: +case 0x3865: +case 0x3A65: +case 0x3C65: +case 0x3E65: +case 0x3066: +case 0x3266: +case 0x3466: +case 0x3666: +case 0x3866: +case 0x3A66: +case 0x3C66: +case 0x3E66: + +// MOVEAW +case 0x3060: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3268: +case 0x3468: +case 0x3668: +case 0x3868: +case 0x3A68: +case 0x3C68: +case 0x3E68: +case 0x3069: +case 0x3269: +case 0x3469: +case 0x3669: +case 0x3869: +case 0x3A69: +case 0x3C69: +case 0x3E69: +case 0x306A: +case 0x326A: +case 0x346A: +case 0x366A: +case 0x386A: +case 0x3A6A: +case 0x3C6A: +case 0x3E6A: +case 0x306B: +case 0x326B: +case 0x346B: +case 0x366B: +case 0x386B: +case 0x3A6B: +case 0x3C6B: +case 0x3E6B: +case 0x306C: +case 0x326C: +case 0x346C: +case 0x366C: +case 0x386C: +case 0x3A6C: +case 0x3C6C: +case 0x3E6C: +case 0x306D: +case 0x326D: +case 0x346D: +case 0x366D: +case 0x386D: +case 0x3A6D: +case 0x3C6D: +case 0x3E6D: +case 0x306E: +case 0x326E: +case 0x346E: +case 0x366E: +case 0x386E: +case 0x3A6E: +case 0x3C6E: +case 0x3E6E: +case 0x306F: +case 0x326F: +case 0x346F: +case 0x366F: +case 0x386F: +case 0x3A6F: +case 0x3C6F: +case 0x3E6F: + +// MOVEAW +case 0x3068: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3270: +case 0x3470: +case 0x3670: +case 0x3870: +case 0x3A70: +case 0x3C70: +case 0x3E70: +case 0x3071: +case 0x3271: +case 0x3471: +case 0x3671: +case 0x3871: +case 0x3A71: +case 0x3C71: +case 0x3E71: +case 0x3072: +case 0x3272: +case 0x3472: +case 0x3672: +case 0x3872: +case 0x3A72: +case 0x3C72: +case 0x3E72: +case 0x3073: +case 0x3273: +case 0x3473: +case 0x3673: +case 0x3873: +case 0x3A73: +case 0x3C73: +case 0x3E73: +case 0x3074: +case 0x3274: +case 0x3474: +case 0x3674: +case 0x3874: +case 0x3A74: +case 0x3C74: +case 0x3E74: +case 0x3075: +case 0x3275: +case 0x3475: +case 0x3675: +case 0x3875: +case 0x3A75: +case 0x3C75: +case 0x3E75: +case 0x3076: +case 0x3276: +case 0x3476: +case 0x3676: +case 0x3876: +case 0x3A76: +case 0x3C76: +case 0x3E76: +case 0x3077: +case 0x3277: +case 0x3477: +case 0x3677: +case 0x3877: +case 0x3A77: +case 0x3C77: +case 0x3E77: + +// MOVEAW +case 0x3070: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3278: +case 0x3478: +case 0x3678: +case 0x3878: +case 0x3A78: +case 0x3C78: +case 0x3E78: + +// MOVEAW +case 0x3078: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3279: +case 0x3479: +case 0x3679: +case 0x3879: +case 0x3A79: +case 0x3C79: +case 0x3E79: + +// MOVEAW +case 0x3079: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x327A: +case 0x347A: +case 0x367A: +case 0x387A: +case 0x3A7A: +case 0x3C7A: +case 0x3E7A: + +// MOVEAW +case 0x307A: +{ + u32 adr; + u32 res; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x327B: +case 0x347B: +case 0x367B: +case 0x387B: +case 0x3A7B: +case 0x3C7B: +case 0x3E7B: + +// MOVEAW +case 0x307B: +{ + u32 adr; + u32 res; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x327C: +case 0x347C: +case 0x367C: +case 0x387C: +case 0x3A7C: +case 0x3C7C: +case 0x3E7C: + +// MOVEAW +case 0x307C: +{ + u32 res; + res = (s32)(s16)FETCH_WORD; + PC += 2; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0x325F: +case 0x345F: +case 0x365F: +case 0x385F: +case 0x3A5F: +case 0x3C5F: +case 0x3E5F: + +// MOVEAW +case 0x305F: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x3267: +case 0x3467: +case 0x3667: +case 0x3867: +case 0x3A67: +case 0x3C67: +case 0x3E67: + +// MOVEAW +case 0x3067: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READSX_WOat_F(adr, res) + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op4.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op4.inc new file mode 100644 index 0000000000..a0e7f1cbea --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op4.inc @@ -0,0 +1,7077 @@ +case 0x4001: +case 0x4002: +case 0x4003: +case 0x4004: +case 0x4005: +case 0x4006: +case 0x4007: + +// NEGX +case 0x4000: +{ + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4011: +case 0x4012: +case 0x4013: +case 0x4014: +case 0x4015: +case 0x4016: +case 0x4017: + +// NEGX +case 0x4010: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4019: +case 0x401A: +case 0x401B: +case 0x401C: +case 0x401D: +case 0x401E: + +// NEGX +case 0x4018: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 8; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4021: +case 0x4022: +case 0x4023: +case 0x4024: +case 0x4025: +case 0x4026: + +// NEGX +case 0x4020: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4029: +case 0x402A: +case 0x402B: +case 0x402C: +case 0x402D: +case 0x402E: +case 0x402F: + +// NEGX +case 0x4028: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4031: +case 0x4032: +case 0x4033: +case 0x4034: +case 0x4035: +case 0x4036: +case 0x4037: + +// NEGX +case 0x4030: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEGX +case 0x4038: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEGX +case 0x4039: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEGX +case 0x401F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 8; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEGX +case 0x4027: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 10; + READ_BYat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4041: +case 0x4042: +case 0x4043: +case 0x4044: +case 0x4045: +case 0x4046: +case 0x4047: + +// NEGX +case 0x4040: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4051: +case 0x4052: +case 0x4053: +case 0x4054: +case 0x4055: +case 0x4056: +case 0x4057: + +// NEGX +case 0x4050: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4059: +case 0x405A: +case 0x405B: +case 0x405C: +case 0x405D: +case 0x405E: + +// NEGX +case 0x4058: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 8; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4061: +case 0x4062: +case 0x4063: +case 0x4064: +case 0x4065: +case 0x4066: + +// NEGX +case 0x4060: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4069: +case 0x406A: +case 0x406B: +case 0x406C: +case 0x406D: +case 0x406E: +case 0x406F: + +// NEGX +case 0x4068: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4071: +case 0x4072: +case 0x4073: +case 0x4074: +case 0x4075: +case 0x4076: +case 0x4077: + +// NEGX +case 0x4070: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEGX +case 0x4078: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEGX +case 0x4079: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEGX +case 0x405F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 8; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEGX +case 0x4067: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 10; + READ_WOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4081: +case 0x4082: +case 0x4083: +case 0x4084: +case 0x4085: +case 0x4086: +case 0x4087: + +// NEGX +case 0x4080: +{ + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0x4091: +case 0x4092: +case 0x4093: +case 0x4094: +case 0x4095: +case 0x4096: +case 0x4097: + +// NEGX +case 0x4090: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x4099: +case 0x409A: +case 0x409B: +case 0x409C: +case 0x409D: +case 0x409E: + +// NEGX +case 0x4098: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x40A1: +case 0x40A2: +case 0x40A3: +case 0x40A4: +case 0x40A5: +case 0x40A6: + +// NEGX +case 0x40A0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x40A9: +case 0x40AA: +case 0x40AB: +case 0x40AC: +case 0x40AD: +case 0x40AE: +case 0x40AF: + +// NEGX +case 0x40A8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x40B1: +case 0x40B2: +case 0x40B3: +case 0x40B4: +case 0x40B5: +case 0x40B6: +case 0x40B7: + +// NEGX +case 0x40B0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEGX +case 0x40B8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEGX +case 0x40B9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEGX +case 0x409F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEGX +case 0x40A7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, src) + res = -src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x4201: +case 0x4202: +case 0x4203: +case 0x4204: +case 0x4205: +case 0x4206: +case 0x4207: + +// CLR +case 0x4200: +{ + u32 res; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4211: +case 0x4212: +case 0x4213: +case 0x4214: +case 0x4215: +case 0x4216: +case 0x4217: + +// CLR +case 0x4210: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x4219: +case 0x421A: +case 0x421B: +case 0x421C: +case 0x421D: +case 0x421E: + +// CLR +case 0x4218: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x4221: +case 0x4222: +case 0x4223: +case 0x4224: +case 0x4225: +case 0x4226: + +// CLR +case 0x4220: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 10; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x4229: +case 0x422A: +case 0x422B: +case 0x422C: +case 0x422D: +case 0x422E: +case 0x422F: + +// CLR +case 0x4228: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x4231: +case 0x4232: +case 0x4233: +case 0x4234: +case 0x4235: +case 0x4236: +case 0x4237: + +// CLR +case 0x4230: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 14; + WRITE_BYat_F(adr, res) +} +RET(0) + +// CLR +case 0x4238: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_BYat_F(adr, res) +} +RET(0) + +// CLR +case 0x4239: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 16; + WRITE_BYat_F(adr, res) +} +RET(0) + +// CLR +case 0x421F: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 8; + WRITE_BYat_F(adr, res) +} +RET(0) + +// CLR +case 0x4227: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 10; + WRITE_BYat_F(adr, res) +} +RET(0) +case 0x4241: +case 0x4242: +case 0x4243: +case 0x4244: +case 0x4245: +case 0x4246: +case 0x4247: + +// CLR +case 0x4240: +{ + u32 res; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4251: +case 0x4252: +case 0x4253: +case 0x4254: +case 0x4255: +case 0x4256: +case 0x4257: + +// CLR +case 0x4250: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x4259: +case 0x425A: +case 0x425B: +case 0x425C: +case 0x425D: +case 0x425E: + +// CLR +case 0x4258: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x4261: +case 0x4262: +case 0x4263: +case 0x4264: +case 0x4265: +case 0x4266: + +// CLR +case 0x4260: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 10; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x4269: +case 0x426A: +case 0x426B: +case 0x426C: +case 0x426D: +case 0x426E: +case 0x426F: + +// CLR +case 0x4268: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x4271: +case 0x4272: +case 0x4273: +case 0x4274: +case 0x4275: +case 0x4276: +case 0x4277: + +// CLR +case 0x4270: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 14; + WRITE_WOat_F(adr, res) +} +RET(0) + +// CLR +case 0x4278: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_WOat_F(adr, res) +} +RET(0) + +// CLR +case 0x4279: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 16; + WRITE_WOat_F(adr, res) +} +RET(0) + +// CLR +case 0x425F: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(0) + +// CLR +case 0x4267: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 10; + WRITE_WOat_F(adr, res) +} +RET(0) +case 0x4281: +case 0x4282: +case 0x4283: +case 0x4284: +case 0x4285: +case 0x4286: +case 0x4287: + +// CLR +case 0x4280: +{ + u32 res; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0x4291: +case 0x4292: +case 0x4293: +case 0x4294: +case 0x4295: +case 0x4296: +case 0x4297: + +// CLR +case 0x4290: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x4299: +case 0x429A: +case 0x429B: +case 0x429C: +case 0x429D: +case 0x429E: + +// CLR +case 0x4298: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x42A1: +case 0x42A2: +case 0x42A3: +case 0x42A4: +case 0x42A5: +case 0x42A6: + +// CLR +case 0x42A0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 14; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x42A9: +case 0x42AA: +case 0x42AB: +case 0x42AC: +case 0x42AD: +case 0x42AE: +case 0x42AF: + +// CLR +case 0x42A8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 16; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x42B1: +case 0x42B2: +case 0x42B3: +case 0x42B4: +case 0x42B5: +case 0x42B6: +case 0x42B7: + +// CLR +case 0x42B0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 18; + WRITE_LOat_F(adr, res) +} +RET(0) + +// CLR +case 0x42B8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 16; + WRITE_LOat_F(adr, res) +} +RET(0) + +// CLR +case 0x42B9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 20; + WRITE_LOat_F(adr, res) +} +RET(0) + +// CLR +case 0x429F: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 4; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 12; + WRITE_LOat_F(adr, res) +} +RET(0) + +// CLR +case 0x42A7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + res = 0; + CPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0; + timestamp += 14; + WRITE_LOat_F(adr, res) +} +RET(0) +case 0x4401: +case 0x4402: +case 0x4403: +case 0x4404: +case 0x4405: +case 0x4406: +case 0x4407: + +// NEG +case 0x4400: +{ + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4411: +case 0x4412: +case 0x4413: +case 0x4414: +case 0x4415: +case 0x4416: +case 0x4417: + +// NEG +case 0x4410: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4419: +case 0x441A: +case 0x441B: +case 0x441C: +case 0x441D: +case 0x441E: + +// NEG +case 0x4418: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 8; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4421: +case 0x4422: +case 0x4423: +case 0x4424: +case 0x4425: +case 0x4426: + +// NEG +case 0x4420: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4429: +case 0x442A: +case 0x442B: +case 0x442C: +case 0x442D: +case 0x442E: +case 0x442F: + +// NEG +case 0x4428: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4431: +case 0x4432: +case 0x4433: +case 0x4434: +case 0x4435: +case 0x4436: +case 0x4437: + +// NEG +case 0x4430: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEG +case 0x4438: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEG +case 0x4439: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEG +case 0x441F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 8; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NEG +case 0x4427: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 10; + READ_BYat_F(adr, src) + res = -src; + CPU->flag_V = res & src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4441: +case 0x4442: +case 0x4443: +case 0x4444: +case 0x4445: +case 0x4446: +case 0x4447: + +// NEG +case 0x4440: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4451: +case 0x4452: +case 0x4453: +case 0x4454: +case 0x4455: +case 0x4456: +case 0x4457: + +// NEG +case 0x4450: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4459: +case 0x445A: +case 0x445B: +case 0x445C: +case 0x445D: +case 0x445E: + +// NEG +case 0x4458: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 8; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4461: +case 0x4462: +case 0x4463: +case 0x4464: +case 0x4465: +case 0x4466: + +// NEG +case 0x4460: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4469: +case 0x446A: +case 0x446B: +case 0x446C: +case 0x446D: +case 0x446E: +case 0x446F: + +// NEG +case 0x4468: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4471: +case 0x4472: +case 0x4473: +case 0x4474: +case 0x4475: +case 0x4476: +case 0x4477: + +// NEG +case 0x4470: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEG +case 0x4478: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEG +case 0x4479: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEG +case 0x445F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 8; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NEG +case 0x4467: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 10; + READ_WOat_F(adr, src) + res = -src; + CPU->flag_V = (res & src) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4481: +case 0x4482: +case 0x4483: +case 0x4484: +case 0x4485: +case 0x4486: +case 0x4487: + +// NEG +case 0x4480: +{ + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0x4491: +case 0x4492: +case 0x4493: +case 0x4494: +case 0x4495: +case 0x4496: +case 0x4497: + +// NEG +case 0x4490: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x4499: +case 0x449A: +case 0x449B: +case 0x449C: +case 0x449D: +case 0x449E: + +// NEG +case 0x4498: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x44A1: +case 0x44A2: +case 0x44A3: +case 0x44A4: +case 0x44A5: +case 0x44A6: + +// NEG +case 0x44A0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x44A9: +case 0x44AA: +case 0x44AB: +case 0x44AC: +case 0x44AD: +case 0x44AE: +case 0x44AF: + +// NEG +case 0x44A8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x44B1: +case 0x44B2: +case 0x44B3: +case 0x44B4: +case 0x44B5: +case 0x44B6: +case 0x44B7: + +// NEG +case 0x44B0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEG +case 0x44B8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEG +case 0x44B9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEG +case 0x449F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NEG +case 0x44A7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, src) + res = -src; + CPU->flag_notZ = res; + CPU->flag_V = (res & src) >> 24; + CPU->flag_X = CPU->flag_C = (src | res) >> 23; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x4601: +case 0x4602: +case 0x4603: +case 0x4604: +case 0x4605: +case 0x4606: +case 0x4607: + +// NOT +case 0x4600: +{ + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4611: +case 0x4612: +case 0x4613: +case 0x4614: +case 0x4615: +case 0x4616: +case 0x4617: + +// NOT +case 0x4610: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4619: +case 0x461A: +case 0x461B: +case 0x461C: +case 0x461D: +case 0x461E: + +// NOT +case 0x4618: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 8; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4621: +case 0x4622: +case 0x4623: +case 0x4624: +case 0x4625: +case 0x4626: + +// NOT +case 0x4620: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4629: +case 0x462A: +case 0x462B: +case 0x462C: +case 0x462D: +case 0x462E: +case 0x462F: + +// NOT +case 0x4628: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4631: +case 0x4632: +case 0x4633: +case 0x4634: +case 0x4635: +case 0x4636: +case 0x4637: + +// NOT +case 0x4630: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NOT +case 0x4638: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NOT +case 0x4639: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NOT +case 0x461F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 8; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) + +// NOT +case 0x4627: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 10; + READ_BYat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_N = res; + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(0) +case 0x4641: +case 0x4642: +case 0x4643: +case 0x4644: +case 0x4645: +case 0x4646: +case 0x4647: + +// NOT +case 0x4640: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4651: +case 0x4652: +case 0x4653: +case 0x4654: +case 0x4655: +case 0x4656: +case 0x4657: + +// NOT +case 0x4650: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4659: +case 0x465A: +case 0x465B: +case 0x465C: +case 0x465D: +case 0x465E: + +// NOT +case 0x4658: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 8; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4661: +case 0x4662: +case 0x4663: +case 0x4664: +case 0x4665: +case 0x4666: + +// NOT +case 0x4660: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4669: +case 0x466A: +case 0x466B: +case 0x466C: +case 0x466D: +case 0x466E: +case 0x466F: + +// NOT +case 0x4668: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4671: +case 0x4672: +case 0x4673: +case 0x4674: +case 0x4675: +case 0x4676: +case 0x4677: + +// NOT +case 0x4670: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NOT +case 0x4678: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NOT +case 0x4679: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NOT +case 0x465F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 8; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) + +// NOT +case 0x4667: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 10; + READ_WOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res & 0xFFFF; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(0) +case 0x4681: +case 0x4682: +case 0x4683: +case 0x4684: +case 0x4685: +case 0x4686: +case 0x4687: + +// NOT +case 0x4680: +{ + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0x4691: +case 0x4692: +case 0x4693: +case 0x4694: +case 0x4695: +case 0x4696: +case 0x4697: + +// NOT +case 0x4690: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 12; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x4699: +case 0x469A: +case 0x469B: +case 0x469C: +case 0x469D: +case 0x469E: + +// NOT +case 0x4698: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x46A1: +case 0x46A2: +case 0x46A3: +case 0x46A4: +case 0x46A5: +case 0x46A6: + +// NOT +case 0x46A0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 14; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x46A9: +case 0x46AA: +case 0x46AB: +case 0x46AC: +case 0x46AD: +case 0x46AE: +case 0x46AF: + +// NOT +case 0x46A8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x46B1: +case 0x46B2: +case 0x46B3: +case 0x46B4: +case 0x46B5: +case 0x46B6: +case 0x46B7: + +// NOT +case 0x46B0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 18; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NOT +case 0x46B8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 16; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NOT +case 0x46B9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 20; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NOT +case 0x469F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) + +// NOT +case 0x46A7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 14; + READ_LOat_F(adr, src) + res = ~src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(0) +case 0x40C1: +case 0x40C2: +case 0x40C3: +case 0x40C4: +case 0x40C5: +case 0x40C6: +case 0x40C7: + +// MOVESRa +case 0x40C0: +{ + u32 res; + res = GET_SR; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0x40D1: +case 0x40D2: +case 0x40D3: +case 0x40D4: +case 0x40D5: +case 0x40D6: +case 0x40D7: + +// MOVESRa +case 0x40D0: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 2; + WRITE_WOat_F(adr, res) +} +RET(6) +case 0x40D9: +case 0x40DA: +case 0x40DB: +case 0x40DC: +case 0x40DD: +case 0x40DE: + +// MOVESRa +case 0x40D8: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 2; + WRITE_WOat_F(adr, res) +} +RET(6) +case 0x40E1: +case 0x40E2: +case 0x40E3: +case 0x40E4: +case 0x40E5: +case 0x40E6: + +// MOVESRa +case 0x40E0: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(6) +case 0x40E9: +case 0x40EA: +case 0x40EB: +case 0x40EC: +case 0x40ED: +case 0x40EE: +case 0x40EF: + +// MOVESRa +case 0x40E8: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(6) +case 0x40F1: +case 0x40F2: +case 0x40F3: +case 0x40F4: +case 0x40F5: +case 0x40F6: +case 0x40F7: + +// MOVESRa +case 0x40F0: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 8; + WRITE_WOat_F(adr, res) +} +RET(6) + +// MOVESRa +case 0x40F8: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + WRITE_WOat_F(adr, res) +} +RET(6) + +// MOVESRa +case 0x40F9: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 10; + WRITE_WOat_F(adr, res) +} +RET(6) + +// MOVESRa +case 0x40DF: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 2; + WRITE_WOat_F(adr, res) +} +RET(6) + +// MOVESRa +case 0x40E7: +{ + u32 adr; + u32 res; + res = GET_SR; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 4; + WRITE_WOat_F(adr, res) +} +RET(6) +case 0x44C1: +case 0x44C2: +case 0x44C3: +case 0x44C4: +case 0x44C5: +case 0x44C6: +case 0x44C7: + +// MOVEaCCR +case 0x44C0: +{ + u32 res; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + SET_CCR(res) +} +RET(12) +case 0x44D1: +case 0x44D2: +case 0x44D3: +case 0x44D4: +case 0x44D5: +case 0x44D6: +case 0x44D7: + +// MOVEaCCR +case 0x44D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) +case 0x44D9: +case 0x44DA: +case 0x44DB: +case 0x44DC: +case 0x44DD: +case 0x44DE: + +// MOVEaCCR +case 0x44D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) +case 0x44E1: +case 0x44E2: +case 0x44E3: +case 0x44E4: +case 0x44E5: +case 0x44E6: + +// MOVEaCCR +case 0x44E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) +case 0x44E9: +case 0x44EA: +case 0x44EB: +case 0x44EC: +case 0x44ED: +case 0x44EE: +case 0x44EF: + +// MOVEaCCR +case 0x44E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) +case 0x44F1: +case 0x44F2: +case 0x44F3: +case 0x44F4: +case 0x44F5: +case 0x44F6: +case 0x44F7: + +// MOVEaCCR +case 0x44F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) + +// MOVEaCCR +case 0x44F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) + +// MOVEaCCR +case 0x44F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) + +// MOVEaCCR +case 0x44FA: +{ + u32 adr; + u32 res; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) + +// MOVEaCCR +case 0x44FB: +{ + u32 adr; + u32 res; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) + +// MOVEaCCR +case 0x44FC: +{ + u32 res; + res = FETCH_WORD; + PC += 2; + SET_CCR(res) +} +RET(16) + +// MOVEaCCR +case 0x44DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) + +// MOVEaCCR +case 0x44E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + SET_CCR(res) +} +RET(12) +case 0x46C1: +case 0x46C2: +case 0x46C3: +case 0x46C4: +case 0x46C5: +case 0x46C6: +case 0x46C7: + +// MOVEaSR +case 0x46C0: +{ + u32 res; + if (CPU->flag_S) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; +case 0x46D1: +case 0x46D2: +case 0x46D3: +case 0x46D4: +case 0x46D5: +case 0x46D6: +case 0x46D7: + +// MOVEaSR +case 0x46D0: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; +case 0x46D9: +case 0x46DA: +case 0x46DB: +case 0x46DC: +case 0x46DD: +case 0x46DE: + +// MOVEaSR +case 0x46D8: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; +case 0x46E1: +case 0x46E2: +case 0x46E3: +case 0x46E4: +case 0x46E5: +case 0x46E6: + +// MOVEaSR +case 0x46E0: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; +case 0x46E9: +case 0x46EA: +case 0x46EB: +case 0x46EC: +case 0x46ED: +case 0x46EE: +case 0x46EF: + +// MOVEaSR +case 0x46E8: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; +case 0x46F1: +case 0x46F2: +case 0x46F3: +case 0x46F4: +case 0x46F5: +case 0x46F6: +case 0x46F7: + +// MOVEaSR +case 0x46F0: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46F8: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46F9: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46FA: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46FB: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46FC: +{ + u32 res; + if (CPU->flag_S) + { + res = FETCH_WORD; + PC += 2; + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 16; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46DF: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; + +// MOVEaSR +case 0x46E7: +{ + u32 adr; + u32 res; + if (CPU->flag_S) + { + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + } + else + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +timestamp += 12; +goto C68k_Exec_End; +case 0x4801: +case 0x4802: +case 0x4803: +case 0x4804: +case 0x4805: +case 0x4806: +case 0x4807: + +// NBCD +case 0x4800: +{ + u32 res; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) +case 0x4811: +case 0x4812: +case 0x4813: +case 0x4814: +case 0x4815: +case 0x4816: +case 0x4817: + +// NBCD +case 0x4810: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 2; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) +case 0x4819: +case 0x481A: +case 0x481B: +case 0x481C: +case 0x481D: +case 0x481E: + +// NBCD +case 0x4818: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 2; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) +case 0x4821: +case 0x4822: +case 0x4823: +case 0x4824: +case 0x4825: +case 0x4826: + +// NBCD +case 0x4820: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 4; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) +case 0x4829: +case 0x482A: +case 0x482B: +case 0x482C: +case 0x482D: +case 0x482E: +case 0x482F: + +// NBCD +case 0x4828: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) +case 0x4831: +case 0x4832: +case 0x4833: +case 0x4834: +case 0x4835: +case 0x4836: +case 0x4837: + +// NBCD +case 0x4830: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 8; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) + +// NBCD +case 0x4838: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) + +// NBCD +case 0x4839: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 10; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) + +// NBCD +case 0x481F: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 2; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) + +// NBCD +case 0x4827: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 4; + READ_BYat_F(adr, res) + res = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + + if (res != 0x9a) + { + if ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10; + res &= 0xFF; + WRITE_BYTE_F(adr, res) + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = res; +} +RET(6) +case 0x4851: +case 0x4852: +case 0x4853: +case 0x4854: +case 0x4855: +case 0x4856: +case 0x4857: + +// PEA +case 0x4850: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7]; + PUSH_32_F(adr) +} +RET(12) +case 0x4869: +case 0x486A: +case 0x486B: +case 0x486C: +case 0x486D: +case 0x486E: +case 0x486F: + +// PEA +case 0x4868: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + PUSH_32_F(adr) +} +RET(16) +case 0x4871: +case 0x4872: +case 0x4873: +case 0x4874: +case 0x4875: +case 0x4876: +case 0x4877: + +// PEA +case 0x4870: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + PUSH_32_F(adr) +} +RET(20) + +// PEA +case 0x4878: +{ + u32 adr; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + PUSH_32_F(adr) +} +RET(16) + +// PEA +case 0x4879: +{ + u32 adr; + adr = (s32)FETCH_LONG; + PC += 4; + PUSH_32_F(adr) +} +RET(20) + +// PEA +case 0x487A: +{ + u32 adr; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + PUSH_32_F(adr) +} +RET(16) + +// PEA +case 0x487B: +{ + u32 adr; + adr = PC; + DECODE_EXT_WORD + PUSH_32_F(adr) +} +RET(20) +case 0x4841: +case 0x4842: +case 0x4843: +case 0x4844: +case 0x4845: +case 0x4846: +case 0x4847: + +// SWAP +case 0x4840: +{ + u32 res; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + res = (res >> 16) | (res << 16); + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4891: +case 0x4892: +case 0x4893: +case 0x4894: +case 0x4895: +case 0x4896: +case 0x4897: + +// MOVEMRa +case 0x4890: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 0; + do + { + if (res & 1) + { + WRITE_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(12) +case 0x48A1: +case 0x48A2: +case 0x48A3: +case 0x48A4: +case 0x48A5: +case 0x48A6: + +// MOVEMRa +case 0x48A0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 15; + do + { + if (res & 1) + { + adr -= 2; + WRITE_WOat_F(adr, CPU->DA[src]) + } + src --; + } while (res >>= 1); + CPU->A[(Opcode >> 0) & 7] = adr; +} +RET(8) +case 0x48A9: +case 0x48AA: +case 0x48AB: +case 0x48AC: +case 0x48AD: +case 0x48AE: +case 0x48AF: + +// MOVEMRa +case 0x48A8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + WRITE_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(20) +case 0x48B1: +case 0x48B2: +case 0x48B3: +case 0x48B4: +case 0x48B5: +case 0x48B6: +case 0x48B7: + +// MOVEMRa +case 0x48B0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + src = 0; + do + { + if (res & 1) + { + WRITE_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(24) + +// MOVEMRa +case 0x48B8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + WRITE_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(20) + +// MOVEMRa +case 0x48B9: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + src = 0; + do + { + if (res & 1) + { + WRITE_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(28) + +// MOVEMRa +case 0x48A7: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + src = 15; + do + { + if (res & 1) + { + adr -= 2; + WRITE_WOat_F(adr, CPU->DA[src]) + } + src --; + } while (res >>= 1); + CPU->A[7] = adr; +} +RET(8) +case 0x48D1: +case 0x48D2: +case 0x48D3: +case 0x48D4: +case 0x48D5: +case 0x48D6: +case 0x48D7: + +// MOVEMRa +case 0x48D0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 0; + do + { + if (res & 1) + { + WRITE_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(16) +case 0x48E1: +case 0x48E2: +case 0x48E3: +case 0x48E4: +case 0x48E5: +case 0x48E6: + +// MOVEMRa +case 0x48E0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 15; + do + { + if (res & 1) + { + adr -= 4; + WRITE_LOat_DEC_F(adr, CPU->DA[src]) + } + src --; + } while (res >>= 1); + CPU->A[(Opcode >> 0) & 7] = adr; +} +RET(8) +case 0x48E9: +case 0x48EA: +case 0x48EB: +case 0x48EC: +case 0x48ED: +case 0x48EE: +case 0x48EF: + +// MOVEMRa +case 0x48E8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + WRITE_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(24) +case 0x48F1: +case 0x48F2: +case 0x48F3: +case 0x48F4: +case 0x48F5: +case 0x48F6: +case 0x48F7: + +// MOVEMRa +case 0x48F0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + src = 0; + do + { + if (res & 1) + { + WRITE_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(28) + +// MOVEMRa +case 0x48F8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + WRITE_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(24) + +// MOVEMRa +case 0x48F9: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + src = 0; + do + { + if (res & 1) + { + WRITE_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(32) + +// MOVEMRa +case 0x48E7: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + src = 15; + do + { + if (res & 1) + { + adr -= 4; + WRITE_LOat_DEC_F(adr, CPU->DA[src]) + } + src --; + } while (res >>= 1); + CPU->A[7] = adr; +} +RET(8) +case 0x4881: +case 0x4882: +case 0x4883: +case 0x4884: +case 0x4885: +case 0x4886: +case 0x4887: + +// EXT +case 0x4880: +{ + u32 res; + res = (s32)(s8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x48C1: +case 0x48C2: +case 0x48C3: +case 0x48C4: +case 0x48C5: +case 0x48C6: +case 0x48C7: + +// EXT +case 0x48C0: +{ + u32 res; + res = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4A01: +case 0x4A02: +case 0x4A03: +case 0x4A04: +case 0x4A05: +case 0x4A06: +case 0x4A07: + +// TST +case 0x4A00: +{ + u32 res; + timestamp += 4; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) +case 0x4A11: +case 0x4A12: +case 0x4A13: +case 0x4A14: +case 0x4A15: +case 0x4A16: +case 0x4A17: + +// TST +case 0x4A10: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) +case 0x4A19: +case 0x4A1A: +case 0x4A1B: +case 0x4A1C: +case 0x4A1D: +case 0x4A1E: + +// TST +case 0x4A18: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) +case 0x4A21: +case 0x4A22: +case 0x4A23: +case 0x4A24: +case 0x4A25: +case 0x4A26: + +// TST +case 0x4A20: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) +case 0x4A29: +case 0x4A2A: +case 0x4A2B: +case 0x4A2C: +case 0x4A2D: +case 0x4A2E: +case 0x4A2F: + +// TST +case 0x4A28: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) +case 0x4A31: +case 0x4A32: +case 0x4A33: +case 0x4A34: +case 0x4A35: +case 0x4A36: +case 0x4A37: + +// TST +case 0x4A30: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) + +// TST +case 0x4A38: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) + +// TST +case 0x4A39: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) + +// TST +case 0x4A1F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) + +// TST +case 0x4A27: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +} +RET(0) +case 0x4A41: +case 0x4A42: +case 0x4A43: +case 0x4A44: +case 0x4A45: +case 0x4A46: +case 0x4A47: + +// TST +case 0x4A40: +{ + u32 res; + timestamp += 4; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) +case 0x4A51: +case 0x4A52: +case 0x4A53: +case 0x4A54: +case 0x4A55: +case 0x4A56: +case 0x4A57: + +// TST +case 0x4A50: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) +case 0x4A59: +case 0x4A5A: +case 0x4A5B: +case 0x4A5C: +case 0x4A5D: +case 0x4A5E: + +// TST +case 0x4A58: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) +case 0x4A61: +case 0x4A62: +case 0x4A63: +case 0x4A64: +case 0x4A65: +case 0x4A66: + +// TST +case 0x4A60: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) +case 0x4A69: +case 0x4A6A: +case 0x4A6B: +case 0x4A6C: +case 0x4A6D: +case 0x4A6E: +case 0x4A6F: + +// TST +case 0x4A68: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) +case 0x4A71: +case 0x4A72: +case 0x4A73: +case 0x4A74: +case 0x4A75: +case 0x4A76: +case 0x4A77: + +// TST +case 0x4A70: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) + +// TST +case 0x4A78: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) + +// TST +case 0x4A79: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) + +// TST +case 0x4A5F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) + +// TST +case 0x4A67: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; +} +RET(0) +case 0x4A81: +case 0x4A82: +case 0x4A83: +case 0x4A84: +case 0x4A85: +case 0x4A86: +case 0x4A87: + +// TST +case 0x4A80: +{ + u32 res; + timestamp += 4; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x4A91: +case 0x4A92: +case 0x4A93: +case 0x4A94: +case 0x4A95: +case 0x4A96: +case 0x4A97: + +// TST +case 0x4A90: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x4A99: +case 0x4A9A: +case 0x4A9B: +case 0x4A9C: +case 0x4A9D: +case 0x4A9E: + +// TST +case 0x4A98: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x4AA1: +case 0x4AA2: +case 0x4AA3: +case 0x4AA4: +case 0x4AA5: +case 0x4AA6: + +// TST +case 0x4AA0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x4AA9: +case 0x4AAA: +case 0x4AAB: +case 0x4AAC: +case 0x4AAD: +case 0x4AAE: +case 0x4AAF: + +// TST +case 0x4AA8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x4AB1: +case 0x4AB2: +case 0x4AB3: +case 0x4AB4: +case 0x4AB5: +case 0x4AB6: +case 0x4AB7: + +// TST +case 0x4AB0: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) + +// TST +case 0x4AB8: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) + +// TST +case 0x4AB9: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) + +// TST +case 0x4A9F: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) + +// TST +case 0x4AA7: +{ + u32 adr; + u32 res; + timestamp += 4; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; +} +RET(0) +case 0x4AC1: +case 0x4AC2: +case 0x4AC3: +case 0x4AC4: +case 0x4AC5: +case 0x4AC6: +case 0x4AC7: + +// TAS +case 0x4AC0: +{ + u32 res; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + res |= 0x80; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x4AD1: +case 0x4AD2: +case 0x4AD3: +case 0x4AD4: +case 0x4AD5: +case 0x4AD6: +case 0x4AD7: + +// TAS +case 0x4AD0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) +case 0x4AD9: +case 0x4ADA: +case 0x4ADB: +case 0x4ADC: +case 0x4ADD: +case 0x4ADE: + +// TAS +case 0x4AD8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) +case 0x4AE1: +case 0x4AE2: +case 0x4AE3: +case 0x4AE4: +case 0x4AE5: +case 0x4AE6: + +// TAS +case 0x4AE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) +case 0x4AE9: +case 0x4AEA: +case 0x4AEB: +case 0x4AEC: +case 0x4AED: +case 0x4AEE: +case 0x4AEF: + +// TAS +case 0x4AE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) +case 0x4AF1: +case 0x4AF2: +case 0x4AF3: +case 0x4AF4: +case 0x4AF5: +case 0x4AF6: +case 0x4AF7: + +// TAS +case 0x4AF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) + +// TAS +case 0x4AF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) + +// TAS +case 0x4AF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) + +// TAS +case 0x4ADF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) + +// TAS +case 0x4AE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; +if(!CPU->TAS_Hack) +{ + res |= 0x80; + WRITE_BYTE_F(adr, res) +} +} +RET(4) +default: + +// ILLEGAL +case 0x4AFC: +{ + u32 res; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ILLEGAL_INSTRUCTION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) +} +RET(4) +case 0x4C91: +case 0x4C92: +case 0x4C93: +case 0x4C94: +case 0x4C95: +case 0x4C96: +case 0x4C97: + +// MOVEMaR +case 0x4C90: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(16) +case 0x4C99: +case 0x4C9A: +case 0x4C9B: +case 0x4C9C: +case 0x4C9D: +case 0x4C9E: + +// MOVEMaR +case 0x4C98: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); + CPU->A[(Opcode >> 0) & 7] = adr; +} +RET(12) +case 0x4CA9: +case 0x4CAA: +case 0x4CAB: +case 0x4CAC: +case 0x4CAD: +case 0x4CAE: +case 0x4CAF: + +// MOVEMaR +case 0x4CA8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(24) +case 0x4CB1: +case 0x4CB2: +case 0x4CB3: +case 0x4CB4: +case 0x4CB5: +case 0x4CB6: +case 0x4CB7: + +// MOVEMaR +case 0x4CB0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(28) + +// MOVEMaR +case 0x4CB8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(24) + +// MOVEMaR +case 0x4CB9: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(32) + +// MOVEMaR +case 0x4CBA: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(24) + +// MOVEMaR +case 0x4CBB: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = PC; + DECODE_EXT_WORD + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); +} +RET(28) + +// MOVEMaR +case 0x4C9F: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + src = 0; + do + { + if (res & 1) + { + READSX_WOat_F(adr, CPU->DA[src]) + adr += 2; + } + src ++; + } while (res >>= 1); + CPU->A[7] = adr; +} +RET(12) +case 0x4CD1: +case 0x4CD2: +case 0x4CD3: +case 0x4CD4: +case 0x4CD5: +case 0x4CD6: +case 0x4CD7: + +// MOVEMaR +case 0x4CD0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(20) +case 0x4CD9: +case 0x4CDA: +case 0x4CDB: +case 0x4CDC: +case 0x4CDD: +case 0x4CDE: + +// MOVEMaR +case 0x4CD8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); + CPU->A[(Opcode >> 0) & 7] = adr; +} +RET(12) +case 0x4CE9: +case 0x4CEA: +case 0x4CEB: +case 0x4CEC: +case 0x4CED: +case 0x4CEE: +case 0x4CEF: + +// MOVEMaR +case 0x4CE8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(28) +case 0x4CF1: +case 0x4CF2: +case 0x4CF3: +case 0x4CF4: +case 0x4CF5: +case 0x4CF6: +case 0x4CF7: + +// MOVEMaR +case 0x4CF0: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(32) + +// MOVEMaR +case 0x4CF8: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(28) + +// MOVEMaR +case 0x4CF9: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = (s32)FETCH_LONG; + PC += 4; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(36) + +// MOVEMaR +case 0x4CFA: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(28) + +// MOVEMaR +case 0x4CFB: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = PC; + DECODE_EXT_WORD + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); +} +RET(32) + +// MOVEMaR +case 0x4CDF: +{ + u32 adr; + u32 res; + u32 src; + res = FETCH_WORD; + PC += 2; + adr = CPU->A[7]; + src = 0; + do + { + if (res & 1) + { + READ_LOat_F(adr, CPU->DA[src]) + adr += 4; + } + src ++; + } while (res >>= 1); + CPU->A[7] = adr; +} +RET(12) +case 0x4E41: +case 0x4E42: +case 0x4E43: +case 0x4E44: +case 0x4E45: +case 0x4E46: +case 0x4E47: +case 0x4E48: +case 0x4E49: +case 0x4E4A: +case 0x4E4B: +case 0x4E4C: +case 0x4E4D: +case 0x4E4E: +case 0x4E4F: + +// TRAP +case 0x4E40: +{ + u32 res; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_TRAP_BASE_EX + (Opcode & 0xF); + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) +} +RET(4) +case 0x4E51: +case 0x4E52: +case 0x4E53: +case 0x4E54: +case 0x4E55: +case 0x4E56: + +// LINK +case 0x4E50: +{ + u32 res; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + PUSH_32_F(res) + res = CPU->A[7]; + CPU->A[(Opcode >> 0) & 7] = res; + CPU->A[7] += (s32)(s16)FETCH_WORD; + PC += 2; +} +RET(16) + +// LINKA7 +case 0x4E57: +{ + CPU->A[7] -= 4; + WRITE_LONG_DEC_F(CPU->A[7], CPU->A[7]) + CPU->A[7] += (s32)(s16)FETCH_WORD; + PC += 2; +} +RET(16) +case 0x4E59: +case 0x4E5A: +case 0x4E5B: +case 0x4E5C: +case 0x4E5D: +case 0x4E5E: + +// ULNK +case 0x4E58: +{ + u32 res; + u32 src; + src = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->A[7] = src + 4; + READ_LONG_F(src, res) + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(12) + +// ULNKA7 +case 0x4E5F: +{ + READ_LONG_F(CPU->A[7], CPU->A[7]) +} +RET(12) +case 0x4E61: +case 0x4E62: +case 0x4E63: +case 0x4E64: +case 0x4E65: +case 0x4E66: +case 0x4E67: + +// MOVEAUSP +case 0x4E60: +{ + u32 res; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(4) + } + res = (u32)CPU->A[(Opcode >> 0) & 7]; + CPU->USP = res; +} +RET(4) +case 0x4E69: +case 0x4E6A: +case 0x4E6B: +case 0x4E6C: +case 0x4E6D: +case 0x4E6E: +case 0x4E6F: + +// MOVEUSPA +case 0x4E68: +{ + u32 res; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(4) + } + res = CPU->USP; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(4) + +// RESET +case 0x4E70: +{ + u32 res; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(4) + } + CPU->Reset_CallBack(); +} +RET(132) + +// NOP +case 0x4E71: +{ +} +RET(4) + +// STOP +case 0x4E72: +{ + u32 res; + if (!CPU->flag_S) + { + PC += 2; + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(4) + } + res = FETCH_WORD & C68K_SR_MASK; + PC += 2; + SET_SR(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } + CPU->Status |= C68K_HALTED; +} +timestamp += 4; +goto C68k_Exec_End; + +// RTE +case 0x4E73: +{ + u32 res; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + res = C68K_PRIVILEGE_VIOLATION_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(4) + } + POP_16_F(res) + SET_SR(res) + POP_32_F(res) + SET_PC(res) + if (!CPU->flag_S) + { + res = CPU->A[7]; + CPU->A[7] = CPU->USP; + CPU->USP = res; + } +} +timestamp += 20; +goto C68k_Exec_End; + +// RTS +case 0x4E75: +{ + u32 res; + POP_32_F(res) + SET_PC(res) +} +RET(16) + +// TRAPV +case 0x4E76: +{ + u32 res; + if (CPU->flag_V & 0x80) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_TRAPV_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(4) + +// RTR +case 0x4E77: +{ + u32 res; + POP_16_F(res) + SET_CCR(res) + POP_32_F(res) + SET_PC(res) +} +RET(20) +case 0x4E91: +case 0x4E92: +case 0x4E93: +case 0x4E94: +case 0x4E95: +case 0x4E96: +case 0x4E97: + +// JSR +case 0x4E90: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7]; + PUSH_32_F(PC) + SET_PC(adr) +} +RET(16) +case 0x4EA9: +case 0x4EAA: +case 0x4EAB: +case 0x4EAC: +case 0x4EAD: +case 0x4EAE: +case 0x4EAF: + +// JSR +case 0x4EA8: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + PUSH_32_F(PC) + SET_PC(adr) +} +RET(18) +case 0x4EB1: +case 0x4EB2: +case 0x4EB3: +case 0x4EB4: +case 0x4EB5: +case 0x4EB6: +case 0x4EB7: + +// JSR +case 0x4EB0: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + PUSH_32_F(PC) + SET_PC(adr) +} +RET(22) + +// JSR +case 0x4EB8: +{ + u32 adr; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + PUSH_32_F(PC) + SET_PC(adr) +} +RET(18) + +// JSR +case 0x4EB9: +{ + u32 adr; + adr = (s32)FETCH_LONG; + PC += 4; + PUSH_32_F(PC) + SET_PC(adr) +} +RET(20) + +// JSR +case 0x4EBA: +{ + u32 adr; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + PUSH_32_F(PC) + SET_PC(adr) +} +RET(18) + +// JSR +case 0x4EBB: +{ + u32 adr; + adr = PC; + DECODE_EXT_WORD + PUSH_32_F(PC) + SET_PC(adr) +} +RET(22) +case 0x4ED1: +case 0x4ED2: +case 0x4ED3: +case 0x4ED4: +case 0x4ED5: +case 0x4ED6: +case 0x4ED7: + +// JMP +case 0x4ED0: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7]; + SET_PC(adr) +} +RET(8) +case 0x4EE9: +case 0x4EEA: +case 0x4EEB: +case 0x4EEC: +case 0x4EED: +case 0x4EEE: +case 0x4EEF: + +// JMP +case 0x4EE8: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + SET_PC(adr) +} +RET(10) +case 0x4EF1: +case 0x4EF2: +case 0x4EF3: +case 0x4EF4: +case 0x4EF5: +case 0x4EF6: +case 0x4EF7: + +// JMP +case 0x4EF0: +{ + u32 adr; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + SET_PC(adr) +} +RET(14) + +// JMP +case 0x4EF8: +{ + u32 adr; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + SET_PC(adr) +} +RET(10) + +// JMP +case 0x4EF9: +{ + u32 adr; + adr = (s32)FETCH_LONG; + PC += 4; + SET_PC(adr) +} +RET(12) + +// JMP +case 0x4EFA: +{ + u32 adr; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + SET_PC(adr) +} +RET(10) + +// JMP +case 0x4EFB: +{ + u32 adr; + adr = PC; + DECODE_EXT_WORD + SET_PC(adr) +} +RET(14) +case 0x4380: +case 0x4580: +case 0x4780: +case 0x4980: +case 0x4B80: +case 0x4D80: +case 0x4F80: +case 0x4181: +case 0x4381: +case 0x4581: +case 0x4781: +case 0x4981: +case 0x4B81: +case 0x4D81: +case 0x4F81: +case 0x4182: +case 0x4382: +case 0x4582: +case 0x4782: +case 0x4982: +case 0x4B82: +case 0x4D82: +case 0x4F82: +case 0x4183: +case 0x4383: +case 0x4583: +case 0x4783: +case 0x4983: +case 0x4B83: +case 0x4D83: +case 0x4F83: +case 0x4184: +case 0x4384: +case 0x4584: +case 0x4784: +case 0x4984: +case 0x4B84: +case 0x4D84: +case 0x4F84: +case 0x4185: +case 0x4385: +case 0x4585: +case 0x4785: +case 0x4985: +case 0x4B85: +case 0x4D85: +case 0x4F85: +case 0x4186: +case 0x4386: +case 0x4586: +case 0x4786: +case 0x4986: +case 0x4B86: +case 0x4D86: +case 0x4F86: +case 0x4187: +case 0x4387: +case 0x4587: +case 0x4787: +case 0x4987: +case 0x4B87: +case 0x4D87: +case 0x4F87: + +// CHK +case 0x4180: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x4390: +case 0x4590: +case 0x4790: +case 0x4990: +case 0x4B90: +case 0x4D90: +case 0x4F90: +case 0x4191: +case 0x4391: +case 0x4591: +case 0x4791: +case 0x4991: +case 0x4B91: +case 0x4D91: +case 0x4F91: +case 0x4192: +case 0x4392: +case 0x4592: +case 0x4792: +case 0x4992: +case 0x4B92: +case 0x4D92: +case 0x4F92: +case 0x4193: +case 0x4393: +case 0x4593: +case 0x4793: +case 0x4993: +case 0x4B93: +case 0x4D93: +case 0x4F93: +case 0x4194: +case 0x4394: +case 0x4594: +case 0x4794: +case 0x4994: +case 0x4B94: +case 0x4D94: +case 0x4F94: +case 0x4195: +case 0x4395: +case 0x4595: +case 0x4795: +case 0x4995: +case 0x4B95: +case 0x4D95: +case 0x4F95: +case 0x4196: +case 0x4396: +case 0x4596: +case 0x4796: +case 0x4996: +case 0x4B96: +case 0x4D96: +case 0x4F96: +case 0x4197: +case 0x4397: +case 0x4597: +case 0x4797: +case 0x4997: +case 0x4B97: +case 0x4D97: +case 0x4F97: + +// CHK +case 0x4190: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x4398: +case 0x4598: +case 0x4798: +case 0x4998: +case 0x4B98: +case 0x4D98: +case 0x4F98: +case 0x4199: +case 0x4399: +case 0x4599: +case 0x4799: +case 0x4999: +case 0x4B99: +case 0x4D99: +case 0x4F99: +case 0x419A: +case 0x439A: +case 0x459A: +case 0x479A: +case 0x499A: +case 0x4B9A: +case 0x4D9A: +case 0x4F9A: +case 0x419B: +case 0x439B: +case 0x459B: +case 0x479B: +case 0x499B: +case 0x4B9B: +case 0x4D9B: +case 0x4F9B: +case 0x419C: +case 0x439C: +case 0x459C: +case 0x479C: +case 0x499C: +case 0x4B9C: +case 0x4D9C: +case 0x4F9C: +case 0x419D: +case 0x439D: +case 0x459D: +case 0x479D: +case 0x499D: +case 0x4B9D: +case 0x4D9D: +case 0x4F9D: +case 0x419E: +case 0x439E: +case 0x459E: +case 0x479E: +case 0x499E: +case 0x4B9E: +case 0x4D9E: +case 0x4F9E: + +// CHK +case 0x4198: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43A0: +case 0x45A0: +case 0x47A0: +case 0x49A0: +case 0x4BA0: +case 0x4DA0: +case 0x4FA0: +case 0x41A1: +case 0x43A1: +case 0x45A1: +case 0x47A1: +case 0x49A1: +case 0x4BA1: +case 0x4DA1: +case 0x4FA1: +case 0x41A2: +case 0x43A2: +case 0x45A2: +case 0x47A2: +case 0x49A2: +case 0x4BA2: +case 0x4DA2: +case 0x4FA2: +case 0x41A3: +case 0x43A3: +case 0x45A3: +case 0x47A3: +case 0x49A3: +case 0x4BA3: +case 0x4DA3: +case 0x4FA3: +case 0x41A4: +case 0x43A4: +case 0x45A4: +case 0x47A4: +case 0x49A4: +case 0x4BA4: +case 0x4DA4: +case 0x4FA4: +case 0x41A5: +case 0x43A5: +case 0x45A5: +case 0x47A5: +case 0x49A5: +case 0x4BA5: +case 0x4DA5: +case 0x4FA5: +case 0x41A6: +case 0x43A6: +case 0x45A6: +case 0x47A6: +case 0x49A6: +case 0x4BA6: +case 0x4DA6: +case 0x4FA6: + +// CHK +case 0x41A0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43A8: +case 0x45A8: +case 0x47A8: +case 0x49A8: +case 0x4BA8: +case 0x4DA8: +case 0x4FA8: +case 0x41A9: +case 0x43A9: +case 0x45A9: +case 0x47A9: +case 0x49A9: +case 0x4BA9: +case 0x4DA9: +case 0x4FA9: +case 0x41AA: +case 0x43AA: +case 0x45AA: +case 0x47AA: +case 0x49AA: +case 0x4BAA: +case 0x4DAA: +case 0x4FAA: +case 0x41AB: +case 0x43AB: +case 0x45AB: +case 0x47AB: +case 0x49AB: +case 0x4BAB: +case 0x4DAB: +case 0x4FAB: +case 0x41AC: +case 0x43AC: +case 0x45AC: +case 0x47AC: +case 0x49AC: +case 0x4BAC: +case 0x4DAC: +case 0x4FAC: +case 0x41AD: +case 0x43AD: +case 0x45AD: +case 0x47AD: +case 0x49AD: +case 0x4BAD: +case 0x4DAD: +case 0x4FAD: +case 0x41AE: +case 0x43AE: +case 0x45AE: +case 0x47AE: +case 0x49AE: +case 0x4BAE: +case 0x4DAE: +case 0x4FAE: +case 0x41AF: +case 0x43AF: +case 0x45AF: +case 0x47AF: +case 0x49AF: +case 0x4BAF: +case 0x4DAF: +case 0x4FAF: + +// CHK +case 0x41A8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43B0: +case 0x45B0: +case 0x47B0: +case 0x49B0: +case 0x4BB0: +case 0x4DB0: +case 0x4FB0: +case 0x41B1: +case 0x43B1: +case 0x45B1: +case 0x47B1: +case 0x49B1: +case 0x4BB1: +case 0x4DB1: +case 0x4FB1: +case 0x41B2: +case 0x43B2: +case 0x45B2: +case 0x47B2: +case 0x49B2: +case 0x4BB2: +case 0x4DB2: +case 0x4FB2: +case 0x41B3: +case 0x43B3: +case 0x45B3: +case 0x47B3: +case 0x49B3: +case 0x4BB3: +case 0x4DB3: +case 0x4FB3: +case 0x41B4: +case 0x43B4: +case 0x45B4: +case 0x47B4: +case 0x49B4: +case 0x4BB4: +case 0x4DB4: +case 0x4FB4: +case 0x41B5: +case 0x43B5: +case 0x45B5: +case 0x47B5: +case 0x49B5: +case 0x4BB5: +case 0x4DB5: +case 0x4FB5: +case 0x41B6: +case 0x43B6: +case 0x45B6: +case 0x47B6: +case 0x49B6: +case 0x4BB6: +case 0x4DB6: +case 0x4FB6: +case 0x41B7: +case 0x43B7: +case 0x45B7: +case 0x47B7: +case 0x49B7: +case 0x4BB7: +case 0x4DB7: +case 0x4FB7: + +// CHK +case 0x41B0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43B8: +case 0x45B8: +case 0x47B8: +case 0x49B8: +case 0x4BB8: +case 0x4DB8: +case 0x4FB8: + +// CHK +case 0x41B8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43B9: +case 0x45B9: +case 0x47B9: +case 0x49B9: +case 0x4BB9: +case 0x4DB9: +case 0x4FB9: + +// CHK +case 0x41B9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43BA: +case 0x45BA: +case 0x47BA: +case 0x49BA: +case 0x4BBA: +case 0x4DBA: +case 0x4FBA: + +// CHK +case 0x41BA: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43BB: +case 0x45BB: +case 0x47BB: +case 0x49BB: +case 0x4BBB: +case 0x4DBB: +case 0x4FBB: + +// CHK +case 0x41BB: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43BC: +case 0x45BC: +case 0x47BC: +case 0x49BC: +case 0x4BBC: +case 0x4DBC: +case 0x4FBC: + +// CHK +case 0x41BC: +{ + u32 res; + u32 src; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(14) +case 0x439F: +case 0x459F: +case 0x479F: +case 0x499F: +case 0x4B9F: +case 0x4D9F: +case 0x4F9F: + +// CHK +case 0x419F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43A7: +case 0x45A7: +case 0x47A7: +case 0x49A7: +case 0x4BA7: +case 0x4DA7: +case 0x4FA7: + +// CHK +case 0x41A7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + if (((s32)res < 0) || (res > src)) + { + CPU->flag_N = res >> 8; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_CHK_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + } +} +RET(10) +case 0x43D0: +case 0x45D0: +case 0x47D0: +case 0x49D0: +case 0x4BD0: +case 0x4DD0: +case 0x4FD0: +case 0x41D1: +case 0x43D1: +case 0x45D1: +case 0x47D1: +case 0x49D1: +case 0x4BD1: +case 0x4DD1: +case 0x4FD1: +case 0x41D2: +case 0x43D2: +case 0x45D2: +case 0x47D2: +case 0x49D2: +case 0x4BD2: +case 0x4DD2: +case 0x4FD2: +case 0x41D3: +case 0x43D3: +case 0x45D3: +case 0x47D3: +case 0x49D3: +case 0x4BD3: +case 0x4DD3: +case 0x4FD3: +case 0x41D4: +case 0x43D4: +case 0x45D4: +case 0x47D4: +case 0x49D4: +case 0x4BD4: +case 0x4DD4: +case 0x4FD4: +case 0x41D5: +case 0x43D5: +case 0x45D5: +case 0x47D5: +case 0x49D5: +case 0x4BD5: +case 0x4DD5: +case 0x4FD5: +case 0x41D6: +case 0x43D6: +case 0x45D6: +case 0x47D6: +case 0x49D6: +case 0x4BD6: +case 0x4DD6: +case 0x4FD6: +case 0x41D7: +case 0x43D7: +case 0x45D7: +case 0x47D7: +case 0x49D7: +case 0x4BD7: +case 0x4DD7: +case 0x4FD7: + +// LEA +case 0x41D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(4) +case 0x43E8: +case 0x45E8: +case 0x47E8: +case 0x49E8: +case 0x4BE8: +case 0x4DE8: +case 0x4FE8: +case 0x41E9: +case 0x43E9: +case 0x45E9: +case 0x47E9: +case 0x49E9: +case 0x4BE9: +case 0x4DE9: +case 0x4FE9: +case 0x41EA: +case 0x43EA: +case 0x45EA: +case 0x47EA: +case 0x49EA: +case 0x4BEA: +case 0x4DEA: +case 0x4FEA: +case 0x41EB: +case 0x43EB: +case 0x45EB: +case 0x47EB: +case 0x49EB: +case 0x4BEB: +case 0x4DEB: +case 0x4FEB: +case 0x41EC: +case 0x43EC: +case 0x45EC: +case 0x47EC: +case 0x49EC: +case 0x4BEC: +case 0x4DEC: +case 0x4FEC: +case 0x41ED: +case 0x43ED: +case 0x45ED: +case 0x47ED: +case 0x49ED: +case 0x4BED: +case 0x4DED: +case 0x4FED: +case 0x41EE: +case 0x43EE: +case 0x45EE: +case 0x47EE: +case 0x49EE: +case 0x4BEE: +case 0x4DEE: +case 0x4FEE: +case 0x41EF: +case 0x43EF: +case 0x45EF: +case 0x47EF: +case 0x49EF: +case 0x4BEF: +case 0x4DEF: +case 0x4FEF: + +// LEA +case 0x41E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0x43F0: +case 0x45F0: +case 0x47F0: +case 0x49F0: +case 0x4BF0: +case 0x4DF0: +case 0x4FF0: +case 0x41F1: +case 0x43F1: +case 0x45F1: +case 0x47F1: +case 0x49F1: +case 0x4BF1: +case 0x4DF1: +case 0x4FF1: +case 0x41F2: +case 0x43F2: +case 0x45F2: +case 0x47F2: +case 0x49F2: +case 0x4BF2: +case 0x4DF2: +case 0x4FF2: +case 0x41F3: +case 0x43F3: +case 0x45F3: +case 0x47F3: +case 0x49F3: +case 0x4BF3: +case 0x4DF3: +case 0x4FF3: +case 0x41F4: +case 0x43F4: +case 0x45F4: +case 0x47F4: +case 0x49F4: +case 0x4BF4: +case 0x4DF4: +case 0x4FF4: +case 0x41F5: +case 0x43F5: +case 0x45F5: +case 0x47F5: +case 0x49F5: +case 0x4BF5: +case 0x4DF5: +case 0x4FF5: +case 0x41F6: +case 0x43F6: +case 0x45F6: +case 0x47F6: +case 0x49F6: +case 0x4BF6: +case 0x4DF6: +case 0x4FF6: +case 0x41F7: +case 0x43F7: +case 0x45F7: +case 0x47F7: +case 0x49F7: +case 0x4BF7: +case 0x4DF7: +case 0x4FF7: + +// LEA +case 0x41F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(12) +case 0x43F8: +case 0x45F8: +case 0x47F8: +case 0x49F8: +case 0x4BF8: +case 0x4DF8: +case 0x4FF8: + +// LEA +case 0x41F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0x43F9: +case 0x45F9: +case 0x47F9: +case 0x49F9: +case 0x4BF9: +case 0x4DF9: +case 0x4FF9: + +// LEA +case 0x41F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(12) +case 0x43FA: +case 0x45FA: +case 0x47FA: +case 0x49FA: +case 0x4BFA: +case 0x4DFA: +case 0x4FFA: + +// LEA +case 0x41FA: +{ + u32 adr; + u32 res; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0x43FB: +case 0x45FB: +case 0x47FB: +case 0x49FB: +case 0x4BFB: +case 0x4DFB: +case 0x4FFB: + +// LEA +case 0x41FB: +{ + u32 adr; + u32 res; + adr = PC; + DECODE_EXT_WORD + res = adr; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(12) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op5.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op5.inc new file mode 100644 index 0000000000..1cc92d0e56 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op5.inc @@ -0,0 +1,7800 @@ +case 0x50C1: +case 0x50C2: +case 0x50C3: +case 0x50C4: +case 0x50C5: +case 0x50C6: +case 0x50C7: + +// STCC +case 0x50C0: +{ + u32 res; + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) +} +case 0x51C1: +case 0x51C2: +case 0x51C3: +case 0x51C4: +case 0x51C5: +case 0x51C6: +case 0x51C7: + +// STCC +case 0x51C0: +{ + u32 res; + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x52C1: +case 0x52C2: +case 0x52C3: +case 0x52C4: +case 0x52C5: +case 0x52C6: +case 0x52C7: + +// STCC +case 0x52C0: +{ + u32 res; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x53C1: +case 0x53C2: +case 0x53C3: +case 0x53C4: +case 0x53C5: +case 0x53C6: +case 0x53C7: + +// STCC +case 0x53C0: +{ + u32 res; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x54C1: +case 0x54C2: +case 0x54C3: +case 0x54C4: +case 0x54C5: +case 0x54C6: +case 0x54C7: + +// STCC +case 0x54C0: +{ + u32 res; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x55C1: +case 0x55C2: +case 0x55C3: +case 0x55C4: +case 0x55C5: +case 0x55C6: +case 0x55C7: + +// STCC +case 0x55C0: +{ + u32 res; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x56C1: +case 0x56C2: +case 0x56C3: +case 0x56C4: +case 0x56C5: +case 0x56C6: +case 0x56C7: + +// STCC +case 0x56C0: +{ + u32 res; + if (CPU->flag_notZ) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x57C1: +case 0x57C2: +case 0x57C3: +case 0x57C4: +case 0x57C5: +case 0x57C6: +case 0x57C7: + +// STCC +case 0x57C0: +{ + u32 res; + if (!CPU->flag_notZ) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x58C1: +case 0x58C2: +case 0x58C3: +case 0x58C4: +case 0x58C5: +case 0x58C6: +case 0x58C7: + +// STCC +case 0x58C0: +{ + u32 res; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x59C1: +case 0x59C2: +case 0x59C3: +case 0x59C4: +case 0x59C5: +case 0x59C6: +case 0x59C7: + +// STCC +case 0x59C0: +{ + u32 res; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x5AC1: +case 0x5AC2: +case 0x5AC3: +case 0x5AC4: +case 0x5AC5: +case 0x5AC6: +case 0x5AC7: + +// STCC +case 0x5AC0: +{ + u32 res; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x5BC1: +case 0x5BC2: +case 0x5BC3: +case 0x5BC4: +case 0x5BC5: +case 0x5BC6: +case 0x5BC7: + +// STCC +case 0x5BC0: +{ + u32 res; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x5CC1: +case 0x5CC2: +case 0x5CC3: +case 0x5CC4: +case 0x5CC5: +case 0x5CC6: +case 0x5CC7: + +// STCC +case 0x5CC0: +{ + u32 res; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x5DC1: +case 0x5DC2: +case 0x5DC3: +case 0x5DC4: +case 0x5DC5: +case 0x5DC6: +case 0x5DC7: + +// STCC +case 0x5DC0: +{ + u32 res; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x5EC1: +case 0x5EC2: +case 0x5EC3: +case 0x5EC4: +case 0x5EC5: +case 0x5EC6: +case 0x5EC7: + +// STCC +case 0x5EC0: +{ + u32 res; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x5FC1: +case 0x5FC2: +case 0x5FC3: +case 0x5FC4: +case 0x5FC5: +case 0x5FC6: +case 0x5FC7: + +// STCC +case 0x5FC0: +{ + u32 res; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(4) +} +case 0x50D1: +case 0x50D2: +case 0x50D3: +case 0x50D4: +case 0x50D5: +case 0x50D6: +case 0x50D7: + +// STCC +case 0x50D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x51D1: +case 0x51D2: +case 0x51D3: +case 0x51D4: +case 0x51D5: +case 0x51D6: +case 0x51D7: + +// STCC +case 0x51D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + res = 0; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x52D1: +case 0x52D2: +case 0x52D3: +case 0x52D4: +case 0x52D5: +case 0x52D6: +case 0x52D7: + +// STCC +case 0x52D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x53D1: +case 0x53D2: +case 0x53D3: +case 0x53D4: +case 0x53D5: +case 0x53D6: +case 0x53D7: + +// STCC +case 0x53D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x54D1: +case 0x54D2: +case 0x54D3: +case 0x54D4: +case 0x54D5: +case 0x54D6: +case 0x54D7: + +// STCC +case 0x54D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x55D1: +case 0x55D2: +case 0x55D3: +case 0x55D4: +case 0x55D5: +case 0x55D6: +case 0x55D7: + +// STCC +case 0x55D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x56D1: +case 0x56D2: +case 0x56D3: +case 0x56D4: +case 0x56D5: +case 0x56D6: +case 0x56D7: + +// STCC +case 0x56D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x57D1: +case 0x57D2: +case 0x57D3: +case 0x57D4: +case 0x57D5: +case 0x57D6: +case 0x57D7: + +// STCC +case 0x57D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x58D1: +case 0x58D2: +case 0x58D3: +case 0x58D4: +case 0x58D5: +case 0x58D6: +case 0x58D7: + +// STCC +case 0x58D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x59D1: +case 0x59D2: +case 0x59D3: +case 0x59D4: +case 0x59D5: +case 0x59D6: +case 0x59D7: + +// STCC +case 0x59D0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5AD1: +case 0x5AD2: +case 0x5AD3: +case 0x5AD4: +case 0x5AD5: +case 0x5AD6: +case 0x5AD7: + +// STCC +case 0x5AD0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5BD1: +case 0x5BD2: +case 0x5BD3: +case 0x5BD4: +case 0x5BD5: +case 0x5BD6: +case 0x5BD7: + +// STCC +case 0x5BD0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5CD1: +case 0x5CD2: +case 0x5CD3: +case 0x5CD4: +case 0x5CD5: +case 0x5CD6: +case 0x5CD7: + +// STCC +case 0x5CD0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5DD1: +case 0x5DD2: +case 0x5DD3: +case 0x5DD4: +case 0x5DD5: +case 0x5DD6: +case 0x5DD7: + +// STCC +case 0x5DD0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5ED1: +case 0x5ED2: +case 0x5ED3: +case 0x5ED4: +case 0x5ED5: +case 0x5ED6: +case 0x5ED7: + +// STCC +case 0x5ED0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5FD1: +case 0x5FD2: +case 0x5FD3: +case 0x5FD4: +case 0x5FD5: +case 0x5FD6: +case 0x5FD7: + +// STCC +case 0x5FD0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x50D9: +case 0x50DA: +case 0x50DB: +case 0x50DC: +case 0x50DD: +case 0x50DE: + +// STCC +case 0x50D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x51D9: +case 0x51DA: +case 0x51DB: +case 0x51DC: +case 0x51DD: +case 0x51DE: + +// STCC +case 0x51D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + res = 0; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x52D9: +case 0x52DA: +case 0x52DB: +case 0x52DC: +case 0x52DD: +case 0x52DE: + +// STCC +case 0x52D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x53D9: +case 0x53DA: +case 0x53DB: +case 0x53DC: +case 0x53DD: +case 0x53DE: + +// STCC +case 0x53D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x54D9: +case 0x54DA: +case 0x54DB: +case 0x54DC: +case 0x54DD: +case 0x54DE: + +// STCC +case 0x54D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x55D9: +case 0x55DA: +case 0x55DB: +case 0x55DC: +case 0x55DD: +case 0x55DE: + +// STCC +case 0x55D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x56D9: +case 0x56DA: +case 0x56DB: +case 0x56DC: +case 0x56DD: +case 0x56DE: + +// STCC +case 0x56D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x57D9: +case 0x57DA: +case 0x57DB: +case 0x57DC: +case 0x57DD: +case 0x57DE: + +// STCC +case 0x57D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x58D9: +case 0x58DA: +case 0x58DB: +case 0x58DC: +case 0x58DD: +case 0x58DE: + +// STCC +case 0x58D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x59D9: +case 0x59DA: +case 0x59DB: +case 0x59DC: +case 0x59DD: +case 0x59DE: + +// STCC +case 0x59D8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5AD9: +case 0x5ADA: +case 0x5ADB: +case 0x5ADC: +case 0x5ADD: +case 0x5ADE: + +// STCC +case 0x5AD8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5BD9: +case 0x5BDA: +case 0x5BDB: +case 0x5BDC: +case 0x5BDD: +case 0x5BDE: + +// STCC +case 0x5BD8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5CD9: +case 0x5CDA: +case 0x5CDB: +case 0x5CDC: +case 0x5CDD: +case 0x5CDE: + +// STCC +case 0x5CD8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5DD9: +case 0x5DDA: +case 0x5DDB: +case 0x5DDC: +case 0x5DDD: +case 0x5DDE: + +// STCC +case 0x5DD8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5ED9: +case 0x5EDA: +case 0x5EDB: +case 0x5EDC: +case 0x5EDD: +case 0x5EDE: + +// STCC +case 0x5ED8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5FD9: +case 0x5FDA: +case 0x5FDB: +case 0x5FDC: +case 0x5FDD: +case 0x5FDE: + +// STCC +case 0x5FD8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x50E1: +case 0x50E2: +case 0x50E3: +case 0x50E4: +case 0x50E5: +case 0x50E6: + +// STCC +case 0x50E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x51E1: +case 0x51E2: +case 0x51E3: +case 0x51E4: +case 0x51E5: +case 0x51E6: + +// STCC +case 0x51E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + res = 0; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x52E1: +case 0x52E2: +case 0x52E3: +case 0x52E4: +case 0x52E5: +case 0x52E6: + +// STCC +case 0x52E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x53E1: +case 0x53E2: +case 0x53E3: +case 0x53E4: +case 0x53E5: +case 0x53E6: + +// STCC +case 0x53E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x54E1: +case 0x54E2: +case 0x54E3: +case 0x54E4: +case 0x54E5: +case 0x54E6: + +// STCC +case 0x54E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x55E1: +case 0x55E2: +case 0x55E3: +case 0x55E4: +case 0x55E5: +case 0x55E6: + +// STCC +case 0x55E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x56E1: +case 0x56E2: +case 0x56E3: +case 0x56E4: +case 0x56E5: +case 0x56E6: + +// STCC +case 0x56E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x57E1: +case 0x57E2: +case 0x57E3: +case 0x57E4: +case 0x57E5: +case 0x57E6: + +// STCC +case 0x57E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x58E1: +case 0x58E2: +case 0x58E3: +case 0x58E4: +case 0x58E5: +case 0x58E6: + +// STCC +case 0x58E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x59E1: +case 0x59E2: +case 0x59E3: +case 0x59E4: +case 0x59E5: +case 0x59E6: + +// STCC +case 0x59E0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5AE1: +case 0x5AE2: +case 0x5AE3: +case 0x5AE4: +case 0x5AE5: +case 0x5AE6: + +// STCC +case 0x5AE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5BE1: +case 0x5BE2: +case 0x5BE3: +case 0x5BE4: +case 0x5BE5: +case 0x5BE6: + +// STCC +case 0x5BE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5CE1: +case 0x5CE2: +case 0x5CE3: +case 0x5CE4: +case 0x5CE5: +case 0x5CE6: + +// STCC +case 0x5CE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5DE1: +case 0x5DE2: +case 0x5DE3: +case 0x5DE4: +case 0x5DE5: +case 0x5DE6: + +// STCC +case 0x5DE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5EE1: +case 0x5EE2: +case 0x5EE3: +case 0x5EE4: +case 0x5EE5: +case 0x5EE6: + +// STCC +case 0x5EE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5FE1: +case 0x5FE2: +case 0x5FE3: +case 0x5FE4: +case 0x5FE5: +case 0x5FE6: + +// STCC +case 0x5FE0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x50E9: +case 0x50EA: +case 0x50EB: +case 0x50EC: +case 0x50ED: +case 0x50EE: +case 0x50EF: + +// STCC +case 0x50E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x51E9: +case 0x51EA: +case 0x51EB: +case 0x51EC: +case 0x51ED: +case 0x51EE: +case 0x51EF: + +// STCC +case 0x51E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x52E9: +case 0x52EA: +case 0x52EB: +case 0x52EC: +case 0x52ED: +case 0x52EE: +case 0x52EF: + +// STCC +case 0x52E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x53E9: +case 0x53EA: +case 0x53EB: +case 0x53EC: +case 0x53ED: +case 0x53EE: +case 0x53EF: + +// STCC +case 0x53E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x54E9: +case 0x54EA: +case 0x54EB: +case 0x54EC: +case 0x54ED: +case 0x54EE: +case 0x54EF: + +// STCC +case 0x54E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x55E9: +case 0x55EA: +case 0x55EB: +case 0x55EC: +case 0x55ED: +case 0x55EE: +case 0x55EF: + +// STCC +case 0x55E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x56E9: +case 0x56EA: +case 0x56EB: +case 0x56EC: +case 0x56ED: +case 0x56EE: +case 0x56EF: + +// STCC +case 0x56E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x57E9: +case 0x57EA: +case 0x57EB: +case 0x57EC: +case 0x57ED: +case 0x57EE: +case 0x57EF: + +// STCC +case 0x57E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x58E9: +case 0x58EA: +case 0x58EB: +case 0x58EC: +case 0x58ED: +case 0x58EE: +case 0x58EF: + +// STCC +case 0x58E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x59E9: +case 0x59EA: +case 0x59EB: +case 0x59EC: +case 0x59ED: +case 0x59EE: +case 0x59EF: + +// STCC +case 0x59E8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5AE9: +case 0x5AEA: +case 0x5AEB: +case 0x5AEC: +case 0x5AED: +case 0x5AEE: +case 0x5AEF: + +// STCC +case 0x5AE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5BE9: +case 0x5BEA: +case 0x5BEB: +case 0x5BEC: +case 0x5BED: +case 0x5BEE: +case 0x5BEF: + +// STCC +case 0x5BE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5CE9: +case 0x5CEA: +case 0x5CEB: +case 0x5CEC: +case 0x5CED: +case 0x5CEE: +case 0x5CEF: + +// STCC +case 0x5CE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5DE9: +case 0x5DEA: +case 0x5DEB: +case 0x5DEC: +case 0x5DED: +case 0x5DEE: +case 0x5DEF: + +// STCC +case 0x5DE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5EE9: +case 0x5EEA: +case 0x5EEB: +case 0x5EEC: +case 0x5EED: +case 0x5EEE: +case 0x5EEF: + +// STCC +case 0x5EE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5FE9: +case 0x5FEA: +case 0x5FEB: +case 0x5FEC: +case 0x5FED: +case 0x5FEE: +case 0x5FEF: + +// STCC +case 0x5FE8: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x50F1: +case 0x50F2: +case 0x50F3: +case 0x50F4: +case 0x50F5: +case 0x50F6: +case 0x50F7: + +// STCC +case 0x50F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x51F1: +case 0x51F2: +case 0x51F3: +case 0x51F4: +case 0x51F5: +case 0x51F6: +case 0x51F7: + +// STCC +case 0x51F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + res = 0; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) +} +case 0x52F1: +case 0x52F2: +case 0x52F3: +case 0x52F4: +case 0x52F5: +case 0x52F6: +case 0x52F7: + +// STCC +case 0x52F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x53F1: +case 0x53F2: +case 0x53F3: +case 0x53F4: +case 0x53F5: +case 0x53F6: +case 0x53F7: + +// STCC +case 0x53F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x54F1: +case 0x54F2: +case 0x54F3: +case 0x54F4: +case 0x54F5: +case 0x54F6: +case 0x54F7: + +// STCC +case 0x54F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x55F1: +case 0x55F2: +case 0x55F3: +case 0x55F4: +case 0x55F5: +case 0x55F6: +case 0x55F7: + +// STCC +case 0x55F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x56F1: +case 0x56F2: +case 0x56F3: +case 0x56F4: +case 0x56F5: +case 0x56F6: +case 0x56F7: + +// STCC +case 0x56F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x57F1: +case 0x57F2: +case 0x57F3: +case 0x57F4: +case 0x57F5: +case 0x57F6: +case 0x57F7: + +// STCC +case 0x57F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x58F1: +case 0x58F2: +case 0x58F3: +case 0x58F4: +case 0x58F5: +case 0x58F6: +case 0x58F7: + +// STCC +case 0x58F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x59F1: +case 0x59F2: +case 0x59F3: +case 0x59F4: +case 0x59F5: +case 0x59F6: +case 0x59F7: + +// STCC +case 0x59F0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5AF1: +case 0x5AF2: +case 0x5AF3: +case 0x5AF4: +case 0x5AF5: +case 0x5AF6: +case 0x5AF7: + +// STCC +case 0x5AF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5BF1: +case 0x5BF2: +case 0x5BF3: +case 0x5BF4: +case 0x5BF5: +case 0x5BF6: +case 0x5BF7: + +// STCC +case 0x5BF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5CF1: +case 0x5CF2: +case 0x5CF3: +case 0x5CF4: +case 0x5CF5: +case 0x5CF6: +case 0x5CF7: + +// STCC +case 0x5CF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5DF1: +case 0x5DF2: +case 0x5DF3: +case 0x5DF4: +case 0x5DF5: +case 0x5DF6: +case 0x5DF7: + +// STCC +case 0x5DF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5EF1: +case 0x5EF2: +case 0x5EF3: +case 0x5EF4: +case 0x5EF5: +case 0x5EF6: +case 0x5EF7: + +// STCC +case 0x5EF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x5FF1: +case 0x5FF2: +case 0x5FF3: +case 0x5FF4: +case 0x5FF5: +case 0x5FF6: +case 0x5FF7: + +// STCC +case 0x5FF0: +{ + u32 adr; + u32 res; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 10; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x50F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x51F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + res = 0; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x52F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x53F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x54F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x55F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x56F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x57F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x58F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x59F8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5AF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5BF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5CF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5DF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5EF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5FF8: +{ + u32 adr; + u32 res; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 8; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x50F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x51F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + res = 0; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x52F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x53F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x54F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x55F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x56F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x57F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x58F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x59F9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5AF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5BF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5CF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5DF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5EF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5FF9: +{ + u32 adr; + u32 res; + adr = (s32)FETCH_LONG; + PC += 4; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 12; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x50DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x51DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + res = 0; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x52DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x53DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x54DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x55DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x56DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x57DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x58DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x59DF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5ADF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5BDF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5CDF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5DDF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5EDF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5FDF: +{ + u32 adr; + u32 res; + adr = CPU->A[7]; + CPU->A[7] += 2; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 4; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x50E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x51E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + res = 0; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) +} + +// STCC +case 0x52E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x53E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x54E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (!(CPU->flag_C & 0x100)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x55E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (CPU->flag_C & 0x100) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x56E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (CPU->flag_notZ) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x57E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (!CPU->flag_notZ) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x58E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (!(CPU->flag_V & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x59E7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (CPU->flag_V & 0x80) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5AE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (!(CPU->flag_N & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5BE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (CPU->flag_N & 0x80) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5CE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5DE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5EE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} + +// STCC +case 0x5FE7: +{ + u32 adr; + u32 res; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = 0xFF; + timestamp += 6; + WRITE_BYat_F(adr, res) + RET(4) + } + res = 0; + WRITE_BYTE_F(adr, res) + RET(4) +} +case 0x50C9: +case 0x50CA: +case 0x50CB: +case 0x50CC: +case 0x50CD: +case 0x50CE: +case 0x50CF: + +// DBCC +case 0x50C8: +{ + PC += 2; +} +RET(12) +case 0x51C9: +case 0x51CA: +case 0x51CB: +case 0x51CC: +case 0x51CD: +case 0x51CE: +case 0x51CF: + +// DBCC +case 0x51C8: +{ + u32 res; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(14) +case 0x52C9: +case 0x52CA: +case 0x52CB: +case 0x52CC: +case 0x52CD: +case 0x52CE: +case 0x52CF: + +// DBCC +case 0x52C8: +{ + u32 res; + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x53C9: +case 0x53CA: +case 0x53CB: +case 0x53CC: +case 0x53CD: +case 0x53CE: +case 0x53CF: + +// DBCC +case 0x53C8: +{ + u32 res; + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x54C9: +case 0x54CA: +case 0x54CB: +case 0x54CC: +case 0x54CD: +case 0x54CE: +case 0x54CF: + +// DBCC +case 0x54C8: +{ + u32 res; + if (CPU->flag_C & 0x100) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x55C9: +case 0x55CA: +case 0x55CB: +case 0x55CC: +case 0x55CD: +case 0x55CE: +case 0x55CF: + +// DBCC +case 0x55C8: +{ + u32 res; + if (!(CPU->flag_C & 0x100)) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x56C9: +case 0x56CA: +case 0x56CB: +case 0x56CC: +case 0x56CD: +case 0x56CE: +case 0x56CF: + +// DBCC +case 0x56C8: +{ + u32 res; + if (!CPU->flag_notZ) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x57C9: +case 0x57CA: +case 0x57CB: +case 0x57CC: +case 0x57CD: +case 0x57CE: +case 0x57CF: + +// DBCC +case 0x57C8: +{ + u32 res; + if (CPU->flag_notZ) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x58C9: +case 0x58CA: +case 0x58CB: +case 0x58CC: +case 0x58CD: +case 0x58CE: +case 0x58CF: + +// DBCC +case 0x58C8: +{ + u32 res; + if (CPU->flag_V & 0x80) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x59C9: +case 0x59CA: +case 0x59CB: +case 0x59CC: +case 0x59CD: +case 0x59CE: +case 0x59CF: + +// DBCC +case 0x59C8: +{ + u32 res; + if (!(CPU->flag_V & 0x80)) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5AC9: +case 0x5ACA: +case 0x5ACB: +case 0x5ACC: +case 0x5ACD: +case 0x5ACE: +case 0x5ACF: + +// DBCC +case 0x5AC8: +{ + u32 res; + if (CPU->flag_N & 0x80) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5BC9: +case 0x5BCA: +case 0x5BCB: +case 0x5BCC: +case 0x5BCD: +case 0x5BCE: +case 0x5BCF: + +// DBCC +case 0x5BC8: +{ + u32 res; + if (!(CPU->flag_N & 0x80)) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5CC9: +case 0x5CCA: +case 0x5CCB: +case 0x5CCC: +case 0x5CCD: +case 0x5CCE: +case 0x5CCF: + +// DBCC +case 0x5CC8: +{ + u32 res; + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5DC9: +case 0x5DCA: +case 0x5DCB: +case 0x5DCC: +case 0x5DCD: +case 0x5DCE: +case 0x5DCF: + +// DBCC +case 0x5DC8: +{ + u32 res; + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5EC9: +case 0x5ECA: +case 0x5ECB: +case 0x5ECC: +case 0x5ECD: +case 0x5ECE: +case 0x5ECF: + +// DBCC +case 0x5EC8: +{ + u32 res; + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5FC9: +case 0x5FCA: +case 0x5FCB: +case 0x5FCC: +case 0x5FCD: +case 0x5FCE: +case 0x5FCF: + +// DBCC +case 0x5FC8: +{ + u32 res; + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res--; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + if ((s32)res != -1) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + } + else + { + PC += 2; + RET(12) + } + PC += 2; +} +RET(14) +case 0x5200: +case 0x5400: +case 0x5600: +case 0x5800: +case 0x5A00: +case 0x5C00: +case 0x5E00: +case 0x5001: +case 0x5201: +case 0x5401: +case 0x5601: +case 0x5801: +case 0x5A01: +case 0x5C01: +case 0x5E01: +case 0x5002: +case 0x5202: +case 0x5402: +case 0x5602: +case 0x5802: +case 0x5A02: +case 0x5C02: +case 0x5E02: +case 0x5003: +case 0x5203: +case 0x5403: +case 0x5603: +case 0x5803: +case 0x5A03: +case 0x5C03: +case 0x5E03: +case 0x5004: +case 0x5204: +case 0x5404: +case 0x5604: +case 0x5804: +case 0x5A04: +case 0x5C04: +case 0x5E04: +case 0x5005: +case 0x5205: +case 0x5405: +case 0x5605: +case 0x5805: +case 0x5A05: +case 0x5C05: +case 0x5E05: +case 0x5006: +case 0x5206: +case 0x5406: +case 0x5606: +case 0x5806: +case 0x5A06: +case 0x5C06: +case 0x5E06: +case 0x5007: +case 0x5207: +case 0x5407: +case 0x5607: +case 0x5807: +case 0x5A07: +case 0x5C07: +case 0x5E07: + +// ADDQ +case 0x5000: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u8)CPU->D[(Opcode >> 0) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x5210: +case 0x5410: +case 0x5610: +case 0x5810: +case 0x5A10: +case 0x5C10: +case 0x5E10: +case 0x5011: +case 0x5211: +case 0x5411: +case 0x5611: +case 0x5811: +case 0x5A11: +case 0x5C11: +case 0x5E11: +case 0x5012: +case 0x5212: +case 0x5412: +case 0x5612: +case 0x5812: +case 0x5A12: +case 0x5C12: +case 0x5E12: +case 0x5013: +case 0x5213: +case 0x5413: +case 0x5613: +case 0x5813: +case 0x5A13: +case 0x5C13: +case 0x5E13: +case 0x5014: +case 0x5214: +case 0x5414: +case 0x5614: +case 0x5814: +case 0x5A14: +case 0x5C14: +case 0x5E14: +case 0x5015: +case 0x5215: +case 0x5415: +case 0x5615: +case 0x5815: +case 0x5A15: +case 0x5C15: +case 0x5E15: +case 0x5016: +case 0x5216: +case 0x5416: +case 0x5616: +case 0x5816: +case 0x5A16: +case 0x5C16: +case 0x5E16: +case 0x5017: +case 0x5217: +case 0x5417: +case 0x5617: +case 0x5817: +case 0x5A17: +case 0x5C17: +case 0x5E17: + +// ADDQ +case 0x5010: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5218: +case 0x5418: +case 0x5618: +case 0x5818: +case 0x5A18: +case 0x5C18: +case 0x5E18: +case 0x5019: +case 0x5219: +case 0x5419: +case 0x5619: +case 0x5819: +case 0x5A19: +case 0x5C19: +case 0x5E19: +case 0x501A: +case 0x521A: +case 0x541A: +case 0x561A: +case 0x581A: +case 0x5A1A: +case 0x5C1A: +case 0x5E1A: +case 0x501B: +case 0x521B: +case 0x541B: +case 0x561B: +case 0x581B: +case 0x5A1B: +case 0x5C1B: +case 0x5E1B: +case 0x501C: +case 0x521C: +case 0x541C: +case 0x561C: +case 0x581C: +case 0x5A1C: +case 0x5C1C: +case 0x5E1C: +case 0x501D: +case 0x521D: +case 0x541D: +case 0x561D: +case 0x581D: +case 0x5A1D: +case 0x5C1D: +case 0x5E1D: +case 0x501E: +case 0x521E: +case 0x541E: +case 0x561E: +case 0x581E: +case 0x5A1E: +case 0x5C1E: +case 0x5E1E: + +// ADDQ +case 0x5018: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5220: +case 0x5420: +case 0x5620: +case 0x5820: +case 0x5A20: +case 0x5C20: +case 0x5E20: +case 0x5021: +case 0x5221: +case 0x5421: +case 0x5621: +case 0x5821: +case 0x5A21: +case 0x5C21: +case 0x5E21: +case 0x5022: +case 0x5222: +case 0x5422: +case 0x5622: +case 0x5822: +case 0x5A22: +case 0x5C22: +case 0x5E22: +case 0x5023: +case 0x5223: +case 0x5423: +case 0x5623: +case 0x5823: +case 0x5A23: +case 0x5C23: +case 0x5E23: +case 0x5024: +case 0x5224: +case 0x5424: +case 0x5624: +case 0x5824: +case 0x5A24: +case 0x5C24: +case 0x5E24: +case 0x5025: +case 0x5225: +case 0x5425: +case 0x5625: +case 0x5825: +case 0x5A25: +case 0x5C25: +case 0x5E25: +case 0x5026: +case 0x5226: +case 0x5426: +case 0x5626: +case 0x5826: +case 0x5A26: +case 0x5C26: +case 0x5E26: + +// ADDQ +case 0x5020: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5228: +case 0x5428: +case 0x5628: +case 0x5828: +case 0x5A28: +case 0x5C28: +case 0x5E28: +case 0x5029: +case 0x5229: +case 0x5429: +case 0x5629: +case 0x5829: +case 0x5A29: +case 0x5C29: +case 0x5E29: +case 0x502A: +case 0x522A: +case 0x542A: +case 0x562A: +case 0x582A: +case 0x5A2A: +case 0x5C2A: +case 0x5E2A: +case 0x502B: +case 0x522B: +case 0x542B: +case 0x562B: +case 0x582B: +case 0x5A2B: +case 0x5C2B: +case 0x5E2B: +case 0x502C: +case 0x522C: +case 0x542C: +case 0x562C: +case 0x582C: +case 0x5A2C: +case 0x5C2C: +case 0x5E2C: +case 0x502D: +case 0x522D: +case 0x542D: +case 0x562D: +case 0x582D: +case 0x5A2D: +case 0x5C2D: +case 0x5E2D: +case 0x502E: +case 0x522E: +case 0x542E: +case 0x562E: +case 0x582E: +case 0x5A2E: +case 0x5C2E: +case 0x5E2E: +case 0x502F: +case 0x522F: +case 0x542F: +case 0x562F: +case 0x582F: +case 0x5A2F: +case 0x5C2F: +case 0x5E2F: + +// ADDQ +case 0x5028: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5230: +case 0x5430: +case 0x5630: +case 0x5830: +case 0x5A30: +case 0x5C30: +case 0x5E30: +case 0x5031: +case 0x5231: +case 0x5431: +case 0x5631: +case 0x5831: +case 0x5A31: +case 0x5C31: +case 0x5E31: +case 0x5032: +case 0x5232: +case 0x5432: +case 0x5632: +case 0x5832: +case 0x5A32: +case 0x5C32: +case 0x5E32: +case 0x5033: +case 0x5233: +case 0x5433: +case 0x5633: +case 0x5833: +case 0x5A33: +case 0x5C33: +case 0x5E33: +case 0x5034: +case 0x5234: +case 0x5434: +case 0x5634: +case 0x5834: +case 0x5A34: +case 0x5C34: +case 0x5E34: +case 0x5035: +case 0x5235: +case 0x5435: +case 0x5635: +case 0x5835: +case 0x5A35: +case 0x5C35: +case 0x5E35: +case 0x5036: +case 0x5236: +case 0x5436: +case 0x5636: +case 0x5836: +case 0x5A36: +case 0x5C36: +case 0x5E36: +case 0x5037: +case 0x5237: +case 0x5437: +case 0x5637: +case 0x5837: +case 0x5A37: +case 0x5C37: +case 0x5E37: + +// ADDQ +case 0x5030: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5238: +case 0x5438: +case 0x5638: +case 0x5838: +case 0x5A38: +case 0x5C38: +case 0x5E38: + +// ADDQ +case 0x5038: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5239: +case 0x5439: +case 0x5639: +case 0x5839: +case 0x5A39: +case 0x5C39: +case 0x5E39: + +// ADDQ +case 0x5039: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x521F: +case 0x541F: +case 0x561F: +case 0x581F: +case 0x5A1F: +case 0x5C1F: +case 0x5E1F: + +// ADDQ +case 0x501F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5227: +case 0x5427: +case 0x5627: +case 0x5827: +case 0x5A27: +case 0x5C27: +case 0x5E27: + +// ADDQ +case 0x5027: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5240: +case 0x5440: +case 0x5640: +case 0x5840: +case 0x5A40: +case 0x5C40: +case 0x5E40: +case 0x5041: +case 0x5241: +case 0x5441: +case 0x5641: +case 0x5841: +case 0x5A41: +case 0x5C41: +case 0x5E41: +case 0x5042: +case 0x5242: +case 0x5442: +case 0x5642: +case 0x5842: +case 0x5A42: +case 0x5C42: +case 0x5E42: +case 0x5043: +case 0x5243: +case 0x5443: +case 0x5643: +case 0x5843: +case 0x5A43: +case 0x5C43: +case 0x5E43: +case 0x5044: +case 0x5244: +case 0x5444: +case 0x5644: +case 0x5844: +case 0x5A44: +case 0x5C44: +case 0x5E44: +case 0x5045: +case 0x5245: +case 0x5445: +case 0x5645: +case 0x5845: +case 0x5A45: +case 0x5C45: +case 0x5E45: +case 0x5046: +case 0x5246: +case 0x5446: +case 0x5646: +case 0x5846: +case 0x5A46: +case 0x5C46: +case 0x5E46: +case 0x5047: +case 0x5247: +case 0x5447: +case 0x5647: +case 0x5847: +case 0x5A47: +case 0x5C47: +case 0x5E47: + +// ADDQ +case 0x5040: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u16)CPU->D[(Opcode >> 0) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x5248: +case 0x5448: +case 0x5648: +case 0x5848: +case 0x5A48: +case 0x5C48: +case 0x5E48: +case 0x5049: +case 0x5249: +case 0x5449: +case 0x5649: +case 0x5849: +case 0x5A49: +case 0x5C49: +case 0x5E49: +case 0x504A: +case 0x524A: +case 0x544A: +case 0x564A: +case 0x584A: +case 0x5A4A: +case 0x5C4A: +case 0x5E4A: +case 0x504B: +case 0x524B: +case 0x544B: +case 0x564B: +case 0x584B: +case 0x5A4B: +case 0x5C4B: +case 0x5E4B: +case 0x504C: +case 0x524C: +case 0x544C: +case 0x564C: +case 0x584C: +case 0x5A4C: +case 0x5C4C: +case 0x5E4C: +case 0x504D: +case 0x524D: +case 0x544D: +case 0x564D: +case 0x584D: +case 0x5A4D: +case 0x5C4D: +case 0x5E4D: +case 0x504E: +case 0x524E: +case 0x544E: +case 0x564E: +case 0x584E: +case 0x5A4E: +case 0x5C4E: +case 0x5E4E: +case 0x504F: +case 0x524F: +case 0x544F: +case 0x564F: +case 0x584F: +case 0x5A4F: +case 0x5C4F: +case 0x5E4F: + +// ADDQ +case 0x5048: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u32)CPU->A[(Opcode >> 0) & 7]; + res = dst + src; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(8) +case 0x5250: +case 0x5450: +case 0x5650: +case 0x5850: +case 0x5A50: +case 0x5C50: +case 0x5E50: +case 0x5051: +case 0x5251: +case 0x5451: +case 0x5651: +case 0x5851: +case 0x5A51: +case 0x5C51: +case 0x5E51: +case 0x5052: +case 0x5252: +case 0x5452: +case 0x5652: +case 0x5852: +case 0x5A52: +case 0x5C52: +case 0x5E52: +case 0x5053: +case 0x5253: +case 0x5453: +case 0x5653: +case 0x5853: +case 0x5A53: +case 0x5C53: +case 0x5E53: +case 0x5054: +case 0x5254: +case 0x5454: +case 0x5654: +case 0x5854: +case 0x5A54: +case 0x5C54: +case 0x5E54: +case 0x5055: +case 0x5255: +case 0x5455: +case 0x5655: +case 0x5855: +case 0x5A55: +case 0x5C55: +case 0x5E55: +case 0x5056: +case 0x5256: +case 0x5456: +case 0x5656: +case 0x5856: +case 0x5A56: +case 0x5C56: +case 0x5E56: +case 0x5057: +case 0x5257: +case 0x5457: +case 0x5657: +case 0x5857: +case 0x5A57: +case 0x5C57: +case 0x5E57: + +// ADDQ +case 0x5050: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5258: +case 0x5458: +case 0x5658: +case 0x5858: +case 0x5A58: +case 0x5C58: +case 0x5E58: +case 0x5059: +case 0x5259: +case 0x5459: +case 0x5659: +case 0x5859: +case 0x5A59: +case 0x5C59: +case 0x5E59: +case 0x505A: +case 0x525A: +case 0x545A: +case 0x565A: +case 0x585A: +case 0x5A5A: +case 0x5C5A: +case 0x5E5A: +case 0x505B: +case 0x525B: +case 0x545B: +case 0x565B: +case 0x585B: +case 0x5A5B: +case 0x5C5B: +case 0x5E5B: +case 0x505C: +case 0x525C: +case 0x545C: +case 0x565C: +case 0x585C: +case 0x5A5C: +case 0x5C5C: +case 0x5E5C: +case 0x505D: +case 0x525D: +case 0x545D: +case 0x565D: +case 0x585D: +case 0x5A5D: +case 0x5C5D: +case 0x5E5D: +case 0x505E: +case 0x525E: +case 0x545E: +case 0x565E: +case 0x585E: +case 0x5A5E: +case 0x5C5E: +case 0x5E5E: + +// ADDQ +case 0x5058: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5260: +case 0x5460: +case 0x5660: +case 0x5860: +case 0x5A60: +case 0x5C60: +case 0x5E60: +case 0x5061: +case 0x5261: +case 0x5461: +case 0x5661: +case 0x5861: +case 0x5A61: +case 0x5C61: +case 0x5E61: +case 0x5062: +case 0x5262: +case 0x5462: +case 0x5662: +case 0x5862: +case 0x5A62: +case 0x5C62: +case 0x5E62: +case 0x5063: +case 0x5263: +case 0x5463: +case 0x5663: +case 0x5863: +case 0x5A63: +case 0x5C63: +case 0x5E63: +case 0x5064: +case 0x5264: +case 0x5464: +case 0x5664: +case 0x5864: +case 0x5A64: +case 0x5C64: +case 0x5E64: +case 0x5065: +case 0x5265: +case 0x5465: +case 0x5665: +case 0x5865: +case 0x5A65: +case 0x5C65: +case 0x5E65: +case 0x5066: +case 0x5266: +case 0x5466: +case 0x5666: +case 0x5866: +case 0x5A66: +case 0x5C66: +case 0x5E66: + +// ADDQ +case 0x5060: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5268: +case 0x5468: +case 0x5668: +case 0x5868: +case 0x5A68: +case 0x5C68: +case 0x5E68: +case 0x5069: +case 0x5269: +case 0x5469: +case 0x5669: +case 0x5869: +case 0x5A69: +case 0x5C69: +case 0x5E69: +case 0x506A: +case 0x526A: +case 0x546A: +case 0x566A: +case 0x586A: +case 0x5A6A: +case 0x5C6A: +case 0x5E6A: +case 0x506B: +case 0x526B: +case 0x546B: +case 0x566B: +case 0x586B: +case 0x5A6B: +case 0x5C6B: +case 0x5E6B: +case 0x506C: +case 0x526C: +case 0x546C: +case 0x566C: +case 0x586C: +case 0x5A6C: +case 0x5C6C: +case 0x5E6C: +case 0x506D: +case 0x526D: +case 0x546D: +case 0x566D: +case 0x586D: +case 0x5A6D: +case 0x5C6D: +case 0x5E6D: +case 0x506E: +case 0x526E: +case 0x546E: +case 0x566E: +case 0x586E: +case 0x5A6E: +case 0x5C6E: +case 0x5E6E: +case 0x506F: +case 0x526F: +case 0x546F: +case 0x566F: +case 0x586F: +case 0x5A6F: +case 0x5C6F: +case 0x5E6F: + +// ADDQ +case 0x5068: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5270: +case 0x5470: +case 0x5670: +case 0x5870: +case 0x5A70: +case 0x5C70: +case 0x5E70: +case 0x5071: +case 0x5271: +case 0x5471: +case 0x5671: +case 0x5871: +case 0x5A71: +case 0x5C71: +case 0x5E71: +case 0x5072: +case 0x5272: +case 0x5472: +case 0x5672: +case 0x5872: +case 0x5A72: +case 0x5C72: +case 0x5E72: +case 0x5073: +case 0x5273: +case 0x5473: +case 0x5673: +case 0x5873: +case 0x5A73: +case 0x5C73: +case 0x5E73: +case 0x5074: +case 0x5274: +case 0x5474: +case 0x5674: +case 0x5874: +case 0x5A74: +case 0x5C74: +case 0x5E74: +case 0x5075: +case 0x5275: +case 0x5475: +case 0x5675: +case 0x5875: +case 0x5A75: +case 0x5C75: +case 0x5E75: +case 0x5076: +case 0x5276: +case 0x5476: +case 0x5676: +case 0x5876: +case 0x5A76: +case 0x5C76: +case 0x5E76: +case 0x5077: +case 0x5277: +case 0x5477: +case 0x5677: +case 0x5877: +case 0x5A77: +case 0x5C77: +case 0x5E77: + +// ADDQ +case 0x5070: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5278: +case 0x5478: +case 0x5678: +case 0x5878: +case 0x5A78: +case 0x5C78: +case 0x5E78: + +// ADDQ +case 0x5078: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5279: +case 0x5479: +case 0x5679: +case 0x5879: +case 0x5A79: +case 0x5C79: +case 0x5E79: + +// ADDQ +case 0x5079: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x525F: +case 0x545F: +case 0x565F: +case 0x585F: +case 0x5A5F: +case 0x5C5F: +case 0x5E5F: + +// ADDQ +case 0x505F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5267: +case 0x5467: +case 0x5667: +case 0x5867: +case 0x5A67: +case 0x5C67: +case 0x5E67: + +// ADDQ +case 0x5067: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5280: +case 0x5480: +case 0x5680: +case 0x5880: +case 0x5A80: +case 0x5C80: +case 0x5E80: +case 0x5081: +case 0x5281: +case 0x5481: +case 0x5681: +case 0x5881: +case 0x5A81: +case 0x5C81: +case 0x5E81: +case 0x5082: +case 0x5282: +case 0x5482: +case 0x5682: +case 0x5882: +case 0x5A82: +case 0x5C82: +case 0x5E82: +case 0x5083: +case 0x5283: +case 0x5483: +case 0x5683: +case 0x5883: +case 0x5A83: +case 0x5C83: +case 0x5E83: +case 0x5084: +case 0x5284: +case 0x5484: +case 0x5684: +case 0x5884: +case 0x5A84: +case 0x5C84: +case 0x5E84: +case 0x5085: +case 0x5285: +case 0x5485: +case 0x5685: +case 0x5885: +case 0x5A85: +case 0x5C85: +case 0x5E85: +case 0x5086: +case 0x5286: +case 0x5486: +case 0x5686: +case 0x5886: +case 0x5A86: +case 0x5C86: +case 0x5E86: +case 0x5087: +case 0x5287: +case 0x5487: +case 0x5687: +case 0x5887: +case 0x5A87: +case 0x5C87: +case 0x5E87: + +// ADDQ +case 0x5080: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u32)CPU->D[(Opcode >> 0) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x5288: +case 0x5488: +case 0x5688: +case 0x5888: +case 0x5A88: +case 0x5C88: +case 0x5E88: +case 0x5089: +case 0x5289: +case 0x5489: +case 0x5689: +case 0x5889: +case 0x5A89: +case 0x5C89: +case 0x5E89: +case 0x508A: +case 0x528A: +case 0x548A: +case 0x568A: +case 0x588A: +case 0x5A8A: +case 0x5C8A: +case 0x5E8A: +case 0x508B: +case 0x528B: +case 0x548B: +case 0x568B: +case 0x588B: +case 0x5A8B: +case 0x5C8B: +case 0x5E8B: +case 0x508C: +case 0x528C: +case 0x548C: +case 0x568C: +case 0x588C: +case 0x5A8C: +case 0x5C8C: +case 0x5E8C: +case 0x508D: +case 0x528D: +case 0x548D: +case 0x568D: +case 0x588D: +case 0x5A8D: +case 0x5C8D: +case 0x5E8D: +case 0x508E: +case 0x528E: +case 0x548E: +case 0x568E: +case 0x588E: +case 0x5A8E: +case 0x5C8E: +case 0x5E8E: +case 0x508F: +case 0x528F: +case 0x548F: +case 0x568F: +case 0x588F: +case 0x5A8F: +case 0x5C8F: +case 0x5E8F: + +// ADDQ +case 0x5088: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u32)CPU->A[(Opcode >> 0) & 7]; + res = dst + src; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(8) +case 0x5290: +case 0x5490: +case 0x5690: +case 0x5890: +case 0x5A90: +case 0x5C90: +case 0x5E90: +case 0x5091: +case 0x5291: +case 0x5491: +case 0x5691: +case 0x5891: +case 0x5A91: +case 0x5C91: +case 0x5E91: +case 0x5092: +case 0x5292: +case 0x5492: +case 0x5692: +case 0x5892: +case 0x5A92: +case 0x5C92: +case 0x5E92: +case 0x5093: +case 0x5293: +case 0x5493: +case 0x5693: +case 0x5893: +case 0x5A93: +case 0x5C93: +case 0x5E93: +case 0x5094: +case 0x5294: +case 0x5494: +case 0x5694: +case 0x5894: +case 0x5A94: +case 0x5C94: +case 0x5E94: +case 0x5095: +case 0x5295: +case 0x5495: +case 0x5695: +case 0x5895: +case 0x5A95: +case 0x5C95: +case 0x5E95: +case 0x5096: +case 0x5296: +case 0x5496: +case 0x5696: +case 0x5896: +case 0x5A96: +case 0x5C96: +case 0x5E96: +case 0x5097: +case 0x5297: +case 0x5497: +case 0x5697: +case 0x5897: +case 0x5A97: +case 0x5C97: +case 0x5E97: + +// ADDQ +case 0x5090: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x5298: +case 0x5498: +case 0x5698: +case 0x5898: +case 0x5A98: +case 0x5C98: +case 0x5E98: +case 0x5099: +case 0x5299: +case 0x5499: +case 0x5699: +case 0x5899: +case 0x5A99: +case 0x5C99: +case 0x5E99: +case 0x509A: +case 0x529A: +case 0x549A: +case 0x569A: +case 0x589A: +case 0x5A9A: +case 0x5C9A: +case 0x5E9A: +case 0x509B: +case 0x529B: +case 0x549B: +case 0x569B: +case 0x589B: +case 0x5A9B: +case 0x5C9B: +case 0x5E9B: +case 0x509C: +case 0x529C: +case 0x549C: +case 0x569C: +case 0x589C: +case 0x5A9C: +case 0x5C9C: +case 0x5E9C: +case 0x509D: +case 0x529D: +case 0x549D: +case 0x569D: +case 0x589D: +case 0x5A9D: +case 0x5C9D: +case 0x5E9D: +case 0x509E: +case 0x529E: +case 0x549E: +case 0x569E: +case 0x589E: +case 0x5A9E: +case 0x5C9E: +case 0x5E9E: + +// ADDQ +case 0x5098: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x52A0: +case 0x54A0: +case 0x56A0: +case 0x58A0: +case 0x5AA0: +case 0x5CA0: +case 0x5EA0: +case 0x50A1: +case 0x52A1: +case 0x54A1: +case 0x56A1: +case 0x58A1: +case 0x5AA1: +case 0x5CA1: +case 0x5EA1: +case 0x50A2: +case 0x52A2: +case 0x54A2: +case 0x56A2: +case 0x58A2: +case 0x5AA2: +case 0x5CA2: +case 0x5EA2: +case 0x50A3: +case 0x52A3: +case 0x54A3: +case 0x56A3: +case 0x58A3: +case 0x5AA3: +case 0x5CA3: +case 0x5EA3: +case 0x50A4: +case 0x52A4: +case 0x54A4: +case 0x56A4: +case 0x58A4: +case 0x5AA4: +case 0x5CA4: +case 0x5EA4: +case 0x50A5: +case 0x52A5: +case 0x54A5: +case 0x56A5: +case 0x58A5: +case 0x5AA5: +case 0x5CA5: +case 0x5EA5: +case 0x50A6: +case 0x52A6: +case 0x54A6: +case 0x56A6: +case 0x58A6: +case 0x5AA6: +case 0x5CA6: +case 0x5EA6: + +// ADDQ +case 0x50A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x52A8: +case 0x54A8: +case 0x56A8: +case 0x58A8: +case 0x5AA8: +case 0x5CA8: +case 0x5EA8: +case 0x50A9: +case 0x52A9: +case 0x54A9: +case 0x56A9: +case 0x58A9: +case 0x5AA9: +case 0x5CA9: +case 0x5EA9: +case 0x50AA: +case 0x52AA: +case 0x54AA: +case 0x56AA: +case 0x58AA: +case 0x5AAA: +case 0x5CAA: +case 0x5EAA: +case 0x50AB: +case 0x52AB: +case 0x54AB: +case 0x56AB: +case 0x58AB: +case 0x5AAB: +case 0x5CAB: +case 0x5EAB: +case 0x50AC: +case 0x52AC: +case 0x54AC: +case 0x56AC: +case 0x58AC: +case 0x5AAC: +case 0x5CAC: +case 0x5EAC: +case 0x50AD: +case 0x52AD: +case 0x54AD: +case 0x56AD: +case 0x58AD: +case 0x5AAD: +case 0x5CAD: +case 0x5EAD: +case 0x50AE: +case 0x52AE: +case 0x54AE: +case 0x56AE: +case 0x58AE: +case 0x5AAE: +case 0x5CAE: +case 0x5EAE: +case 0x50AF: +case 0x52AF: +case 0x54AF: +case 0x56AF: +case 0x58AF: +case 0x5AAF: +case 0x5CAF: +case 0x5EAF: + +// ADDQ +case 0x50A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x52B0: +case 0x54B0: +case 0x56B0: +case 0x58B0: +case 0x5AB0: +case 0x5CB0: +case 0x5EB0: +case 0x50B1: +case 0x52B1: +case 0x54B1: +case 0x56B1: +case 0x58B1: +case 0x5AB1: +case 0x5CB1: +case 0x5EB1: +case 0x50B2: +case 0x52B2: +case 0x54B2: +case 0x56B2: +case 0x58B2: +case 0x5AB2: +case 0x5CB2: +case 0x5EB2: +case 0x50B3: +case 0x52B3: +case 0x54B3: +case 0x56B3: +case 0x58B3: +case 0x5AB3: +case 0x5CB3: +case 0x5EB3: +case 0x50B4: +case 0x52B4: +case 0x54B4: +case 0x56B4: +case 0x58B4: +case 0x5AB4: +case 0x5CB4: +case 0x5EB4: +case 0x50B5: +case 0x52B5: +case 0x54B5: +case 0x56B5: +case 0x58B5: +case 0x5AB5: +case 0x5CB5: +case 0x5EB5: +case 0x50B6: +case 0x52B6: +case 0x54B6: +case 0x56B6: +case 0x58B6: +case 0x5AB6: +case 0x5CB6: +case 0x5EB6: +case 0x50B7: +case 0x52B7: +case 0x54B7: +case 0x56B7: +case 0x58B7: +case 0x5AB7: +case 0x5CB7: +case 0x5EB7: + +// ADDQ +case 0x50B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x52B8: +case 0x54B8: +case 0x56B8: +case 0x58B8: +case 0x5AB8: +case 0x5CB8: +case 0x5EB8: + +// ADDQ +case 0x50B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x52B9: +case 0x54B9: +case 0x56B9: +case 0x58B9: +case 0x5AB9: +case 0x5CB9: +case 0x5EB9: + +// ADDQ +case 0x50B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x529F: +case 0x549F: +case 0x569F: +case 0x589F: +case 0x5A9F: +case 0x5C9F: +case 0x5E9F: + +// ADDQ +case 0x509F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x52A7: +case 0x54A7: +case 0x56A7: +case 0x58A7: +case 0x5AA7: +case 0x5CA7: +case 0x5EA7: + +// ADDQ +case 0x50A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x5300: +case 0x5500: +case 0x5700: +case 0x5900: +case 0x5B00: +case 0x5D00: +case 0x5F00: +case 0x5101: +case 0x5301: +case 0x5501: +case 0x5701: +case 0x5901: +case 0x5B01: +case 0x5D01: +case 0x5F01: +case 0x5102: +case 0x5302: +case 0x5502: +case 0x5702: +case 0x5902: +case 0x5B02: +case 0x5D02: +case 0x5F02: +case 0x5103: +case 0x5303: +case 0x5503: +case 0x5703: +case 0x5903: +case 0x5B03: +case 0x5D03: +case 0x5F03: +case 0x5104: +case 0x5304: +case 0x5504: +case 0x5704: +case 0x5904: +case 0x5B04: +case 0x5D04: +case 0x5F04: +case 0x5105: +case 0x5305: +case 0x5505: +case 0x5705: +case 0x5905: +case 0x5B05: +case 0x5D05: +case 0x5F05: +case 0x5106: +case 0x5306: +case 0x5506: +case 0x5706: +case 0x5906: +case 0x5B06: +case 0x5D06: +case 0x5F06: +case 0x5107: +case 0x5307: +case 0x5507: +case 0x5707: +case 0x5907: +case 0x5B07: +case 0x5D07: +case 0x5F07: + +// SUBQ +case 0x5100: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u8)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x5310: +case 0x5510: +case 0x5710: +case 0x5910: +case 0x5B10: +case 0x5D10: +case 0x5F10: +case 0x5111: +case 0x5311: +case 0x5511: +case 0x5711: +case 0x5911: +case 0x5B11: +case 0x5D11: +case 0x5F11: +case 0x5112: +case 0x5312: +case 0x5512: +case 0x5712: +case 0x5912: +case 0x5B12: +case 0x5D12: +case 0x5F12: +case 0x5113: +case 0x5313: +case 0x5513: +case 0x5713: +case 0x5913: +case 0x5B13: +case 0x5D13: +case 0x5F13: +case 0x5114: +case 0x5314: +case 0x5514: +case 0x5714: +case 0x5914: +case 0x5B14: +case 0x5D14: +case 0x5F14: +case 0x5115: +case 0x5315: +case 0x5515: +case 0x5715: +case 0x5915: +case 0x5B15: +case 0x5D15: +case 0x5F15: +case 0x5116: +case 0x5316: +case 0x5516: +case 0x5716: +case 0x5916: +case 0x5B16: +case 0x5D16: +case 0x5F16: +case 0x5117: +case 0x5317: +case 0x5517: +case 0x5717: +case 0x5917: +case 0x5B17: +case 0x5D17: +case 0x5F17: + +// SUBQ +case 0x5110: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5318: +case 0x5518: +case 0x5718: +case 0x5918: +case 0x5B18: +case 0x5D18: +case 0x5F18: +case 0x5119: +case 0x5319: +case 0x5519: +case 0x5719: +case 0x5919: +case 0x5B19: +case 0x5D19: +case 0x5F19: +case 0x511A: +case 0x531A: +case 0x551A: +case 0x571A: +case 0x591A: +case 0x5B1A: +case 0x5D1A: +case 0x5F1A: +case 0x511B: +case 0x531B: +case 0x551B: +case 0x571B: +case 0x591B: +case 0x5B1B: +case 0x5D1B: +case 0x5F1B: +case 0x511C: +case 0x531C: +case 0x551C: +case 0x571C: +case 0x591C: +case 0x5B1C: +case 0x5D1C: +case 0x5F1C: +case 0x511D: +case 0x531D: +case 0x551D: +case 0x571D: +case 0x591D: +case 0x5B1D: +case 0x5D1D: +case 0x5F1D: +case 0x511E: +case 0x531E: +case 0x551E: +case 0x571E: +case 0x591E: +case 0x5B1E: +case 0x5D1E: +case 0x5F1E: + +// SUBQ +case 0x5118: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5320: +case 0x5520: +case 0x5720: +case 0x5920: +case 0x5B20: +case 0x5D20: +case 0x5F20: +case 0x5121: +case 0x5321: +case 0x5521: +case 0x5721: +case 0x5921: +case 0x5B21: +case 0x5D21: +case 0x5F21: +case 0x5122: +case 0x5322: +case 0x5522: +case 0x5722: +case 0x5922: +case 0x5B22: +case 0x5D22: +case 0x5F22: +case 0x5123: +case 0x5323: +case 0x5523: +case 0x5723: +case 0x5923: +case 0x5B23: +case 0x5D23: +case 0x5F23: +case 0x5124: +case 0x5324: +case 0x5524: +case 0x5724: +case 0x5924: +case 0x5B24: +case 0x5D24: +case 0x5F24: +case 0x5125: +case 0x5325: +case 0x5525: +case 0x5725: +case 0x5925: +case 0x5B25: +case 0x5D25: +case 0x5F25: +case 0x5126: +case 0x5326: +case 0x5526: +case 0x5726: +case 0x5926: +case 0x5B26: +case 0x5D26: +case 0x5F26: + +// SUBQ +case 0x5120: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5328: +case 0x5528: +case 0x5728: +case 0x5928: +case 0x5B28: +case 0x5D28: +case 0x5F28: +case 0x5129: +case 0x5329: +case 0x5529: +case 0x5729: +case 0x5929: +case 0x5B29: +case 0x5D29: +case 0x5F29: +case 0x512A: +case 0x532A: +case 0x552A: +case 0x572A: +case 0x592A: +case 0x5B2A: +case 0x5D2A: +case 0x5F2A: +case 0x512B: +case 0x532B: +case 0x552B: +case 0x572B: +case 0x592B: +case 0x5B2B: +case 0x5D2B: +case 0x5F2B: +case 0x512C: +case 0x532C: +case 0x552C: +case 0x572C: +case 0x592C: +case 0x5B2C: +case 0x5D2C: +case 0x5F2C: +case 0x512D: +case 0x532D: +case 0x552D: +case 0x572D: +case 0x592D: +case 0x5B2D: +case 0x5D2D: +case 0x5F2D: +case 0x512E: +case 0x532E: +case 0x552E: +case 0x572E: +case 0x592E: +case 0x5B2E: +case 0x5D2E: +case 0x5F2E: +case 0x512F: +case 0x532F: +case 0x552F: +case 0x572F: +case 0x592F: +case 0x5B2F: +case 0x5D2F: +case 0x5F2F: + +// SUBQ +case 0x5128: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5330: +case 0x5530: +case 0x5730: +case 0x5930: +case 0x5B30: +case 0x5D30: +case 0x5F30: +case 0x5131: +case 0x5331: +case 0x5531: +case 0x5731: +case 0x5931: +case 0x5B31: +case 0x5D31: +case 0x5F31: +case 0x5132: +case 0x5332: +case 0x5532: +case 0x5732: +case 0x5932: +case 0x5B32: +case 0x5D32: +case 0x5F32: +case 0x5133: +case 0x5333: +case 0x5533: +case 0x5733: +case 0x5933: +case 0x5B33: +case 0x5D33: +case 0x5F33: +case 0x5134: +case 0x5334: +case 0x5534: +case 0x5734: +case 0x5934: +case 0x5B34: +case 0x5D34: +case 0x5F34: +case 0x5135: +case 0x5335: +case 0x5535: +case 0x5735: +case 0x5935: +case 0x5B35: +case 0x5D35: +case 0x5F35: +case 0x5136: +case 0x5336: +case 0x5536: +case 0x5736: +case 0x5936: +case 0x5B36: +case 0x5D36: +case 0x5F36: +case 0x5137: +case 0x5337: +case 0x5537: +case 0x5737: +case 0x5937: +case 0x5B37: +case 0x5D37: +case 0x5F37: + +// SUBQ +case 0x5130: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5338: +case 0x5538: +case 0x5738: +case 0x5938: +case 0x5B38: +case 0x5D38: +case 0x5F38: + +// SUBQ +case 0x5138: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5339: +case 0x5539: +case 0x5739: +case 0x5939: +case 0x5B39: +case 0x5D39: +case 0x5F39: + +// SUBQ +case 0x5139: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x531F: +case 0x551F: +case 0x571F: +case 0x591F: +case 0x5B1F: +case 0x5D1F: +case 0x5F1F: + +// SUBQ +case 0x511F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5327: +case 0x5527: +case 0x5727: +case 0x5927: +case 0x5B27: +case 0x5D27: +case 0x5F27: + +// SUBQ +case 0x5127: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(4) +case 0x5340: +case 0x5540: +case 0x5740: +case 0x5940: +case 0x5B40: +case 0x5D40: +case 0x5F40: +case 0x5141: +case 0x5341: +case 0x5541: +case 0x5741: +case 0x5941: +case 0x5B41: +case 0x5D41: +case 0x5F41: +case 0x5142: +case 0x5342: +case 0x5542: +case 0x5742: +case 0x5942: +case 0x5B42: +case 0x5D42: +case 0x5F42: +case 0x5143: +case 0x5343: +case 0x5543: +case 0x5743: +case 0x5943: +case 0x5B43: +case 0x5D43: +case 0x5F43: +case 0x5144: +case 0x5344: +case 0x5544: +case 0x5744: +case 0x5944: +case 0x5B44: +case 0x5D44: +case 0x5F44: +case 0x5145: +case 0x5345: +case 0x5545: +case 0x5745: +case 0x5945: +case 0x5B45: +case 0x5D45: +case 0x5F45: +case 0x5146: +case 0x5346: +case 0x5546: +case 0x5746: +case 0x5946: +case 0x5B46: +case 0x5D46: +case 0x5F46: +case 0x5147: +case 0x5347: +case 0x5547: +case 0x5747: +case 0x5947: +case 0x5B47: +case 0x5D47: +case 0x5F47: + +// SUBQ +case 0x5140: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u16)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0x5348: +case 0x5548: +case 0x5748: +case 0x5948: +case 0x5B48: +case 0x5D48: +case 0x5F48: +case 0x5149: +case 0x5349: +case 0x5549: +case 0x5749: +case 0x5949: +case 0x5B49: +case 0x5D49: +case 0x5F49: +case 0x514A: +case 0x534A: +case 0x554A: +case 0x574A: +case 0x594A: +case 0x5B4A: +case 0x5D4A: +case 0x5F4A: +case 0x514B: +case 0x534B: +case 0x554B: +case 0x574B: +case 0x594B: +case 0x5B4B: +case 0x5D4B: +case 0x5F4B: +case 0x514C: +case 0x534C: +case 0x554C: +case 0x574C: +case 0x594C: +case 0x5B4C: +case 0x5D4C: +case 0x5F4C: +case 0x514D: +case 0x534D: +case 0x554D: +case 0x574D: +case 0x594D: +case 0x5B4D: +case 0x5D4D: +case 0x5F4D: +case 0x514E: +case 0x534E: +case 0x554E: +case 0x574E: +case 0x594E: +case 0x5B4E: +case 0x5D4E: +case 0x5F4E: +case 0x514F: +case 0x534F: +case 0x554F: +case 0x574F: +case 0x594F: +case 0x5B4F: +case 0x5D4F: +case 0x5F4F: + +// SUBQ +case 0x5148: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u32)CPU->A[(Opcode >> 0) & 7]; + res = dst - src; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(8) +case 0x5350: +case 0x5550: +case 0x5750: +case 0x5950: +case 0x5B50: +case 0x5D50: +case 0x5F50: +case 0x5151: +case 0x5351: +case 0x5551: +case 0x5751: +case 0x5951: +case 0x5B51: +case 0x5D51: +case 0x5F51: +case 0x5152: +case 0x5352: +case 0x5552: +case 0x5752: +case 0x5952: +case 0x5B52: +case 0x5D52: +case 0x5F52: +case 0x5153: +case 0x5353: +case 0x5553: +case 0x5753: +case 0x5953: +case 0x5B53: +case 0x5D53: +case 0x5F53: +case 0x5154: +case 0x5354: +case 0x5554: +case 0x5754: +case 0x5954: +case 0x5B54: +case 0x5D54: +case 0x5F54: +case 0x5155: +case 0x5355: +case 0x5555: +case 0x5755: +case 0x5955: +case 0x5B55: +case 0x5D55: +case 0x5F55: +case 0x5156: +case 0x5356: +case 0x5556: +case 0x5756: +case 0x5956: +case 0x5B56: +case 0x5D56: +case 0x5F56: +case 0x5157: +case 0x5357: +case 0x5557: +case 0x5757: +case 0x5957: +case 0x5B57: +case 0x5D57: +case 0x5F57: + +// SUBQ +case 0x5150: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5358: +case 0x5558: +case 0x5758: +case 0x5958: +case 0x5B58: +case 0x5D58: +case 0x5F58: +case 0x5159: +case 0x5359: +case 0x5559: +case 0x5759: +case 0x5959: +case 0x5B59: +case 0x5D59: +case 0x5F59: +case 0x515A: +case 0x535A: +case 0x555A: +case 0x575A: +case 0x595A: +case 0x5B5A: +case 0x5D5A: +case 0x5F5A: +case 0x515B: +case 0x535B: +case 0x555B: +case 0x575B: +case 0x595B: +case 0x5B5B: +case 0x5D5B: +case 0x5F5B: +case 0x515C: +case 0x535C: +case 0x555C: +case 0x575C: +case 0x595C: +case 0x5B5C: +case 0x5D5C: +case 0x5F5C: +case 0x515D: +case 0x535D: +case 0x555D: +case 0x575D: +case 0x595D: +case 0x5B5D: +case 0x5D5D: +case 0x5F5D: +case 0x515E: +case 0x535E: +case 0x555E: +case 0x575E: +case 0x595E: +case 0x5B5E: +case 0x5D5E: +case 0x5F5E: + +// SUBQ +case 0x5158: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5360: +case 0x5560: +case 0x5760: +case 0x5960: +case 0x5B60: +case 0x5D60: +case 0x5F60: +case 0x5161: +case 0x5361: +case 0x5561: +case 0x5761: +case 0x5961: +case 0x5B61: +case 0x5D61: +case 0x5F61: +case 0x5162: +case 0x5362: +case 0x5562: +case 0x5762: +case 0x5962: +case 0x5B62: +case 0x5D62: +case 0x5F62: +case 0x5163: +case 0x5363: +case 0x5563: +case 0x5763: +case 0x5963: +case 0x5B63: +case 0x5D63: +case 0x5F63: +case 0x5164: +case 0x5364: +case 0x5564: +case 0x5764: +case 0x5964: +case 0x5B64: +case 0x5D64: +case 0x5F64: +case 0x5165: +case 0x5365: +case 0x5565: +case 0x5765: +case 0x5965: +case 0x5B65: +case 0x5D65: +case 0x5F65: +case 0x5166: +case 0x5366: +case 0x5566: +case 0x5766: +case 0x5966: +case 0x5B66: +case 0x5D66: +case 0x5F66: + +// SUBQ +case 0x5160: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5368: +case 0x5568: +case 0x5768: +case 0x5968: +case 0x5B68: +case 0x5D68: +case 0x5F68: +case 0x5169: +case 0x5369: +case 0x5569: +case 0x5769: +case 0x5969: +case 0x5B69: +case 0x5D69: +case 0x5F69: +case 0x516A: +case 0x536A: +case 0x556A: +case 0x576A: +case 0x596A: +case 0x5B6A: +case 0x5D6A: +case 0x5F6A: +case 0x516B: +case 0x536B: +case 0x556B: +case 0x576B: +case 0x596B: +case 0x5B6B: +case 0x5D6B: +case 0x5F6B: +case 0x516C: +case 0x536C: +case 0x556C: +case 0x576C: +case 0x596C: +case 0x5B6C: +case 0x5D6C: +case 0x5F6C: +case 0x516D: +case 0x536D: +case 0x556D: +case 0x576D: +case 0x596D: +case 0x5B6D: +case 0x5D6D: +case 0x5F6D: +case 0x516E: +case 0x536E: +case 0x556E: +case 0x576E: +case 0x596E: +case 0x5B6E: +case 0x5D6E: +case 0x5F6E: +case 0x516F: +case 0x536F: +case 0x556F: +case 0x576F: +case 0x596F: +case 0x5B6F: +case 0x5D6F: +case 0x5F6F: + +// SUBQ +case 0x5168: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5370: +case 0x5570: +case 0x5770: +case 0x5970: +case 0x5B70: +case 0x5D70: +case 0x5F70: +case 0x5171: +case 0x5371: +case 0x5571: +case 0x5771: +case 0x5971: +case 0x5B71: +case 0x5D71: +case 0x5F71: +case 0x5172: +case 0x5372: +case 0x5572: +case 0x5772: +case 0x5972: +case 0x5B72: +case 0x5D72: +case 0x5F72: +case 0x5173: +case 0x5373: +case 0x5573: +case 0x5773: +case 0x5973: +case 0x5B73: +case 0x5D73: +case 0x5F73: +case 0x5174: +case 0x5374: +case 0x5574: +case 0x5774: +case 0x5974: +case 0x5B74: +case 0x5D74: +case 0x5F74: +case 0x5175: +case 0x5375: +case 0x5575: +case 0x5775: +case 0x5975: +case 0x5B75: +case 0x5D75: +case 0x5F75: +case 0x5176: +case 0x5376: +case 0x5576: +case 0x5776: +case 0x5976: +case 0x5B76: +case 0x5D76: +case 0x5F76: +case 0x5177: +case 0x5377: +case 0x5577: +case 0x5777: +case 0x5977: +case 0x5B77: +case 0x5D77: +case 0x5F77: + +// SUBQ +case 0x5170: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5378: +case 0x5578: +case 0x5778: +case 0x5978: +case 0x5B78: +case 0x5D78: +case 0x5F78: + +// SUBQ +case 0x5178: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5379: +case 0x5579: +case 0x5779: +case 0x5979: +case 0x5B79: +case 0x5D79: +case 0x5F79: + +// SUBQ +case 0x5179: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x535F: +case 0x555F: +case 0x575F: +case 0x595F: +case 0x5B5F: +case 0x5D5F: +case 0x5F5F: + +// SUBQ +case 0x515F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5367: +case 0x5567: +case 0x5767: +case 0x5967: +case 0x5B67: +case 0x5D67: +case 0x5F67: + +// SUBQ +case 0x5167: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(4) +case 0x5380: +case 0x5580: +case 0x5780: +case 0x5980: +case 0x5B80: +case 0x5D80: +case 0x5F80: +case 0x5181: +case 0x5381: +case 0x5581: +case 0x5781: +case 0x5981: +case 0x5B81: +case 0x5D81: +case 0x5F81: +case 0x5182: +case 0x5382: +case 0x5582: +case 0x5782: +case 0x5982: +case 0x5B82: +case 0x5D82: +case 0x5F82: +case 0x5183: +case 0x5383: +case 0x5583: +case 0x5783: +case 0x5983: +case 0x5B83: +case 0x5D83: +case 0x5F83: +case 0x5184: +case 0x5384: +case 0x5584: +case 0x5784: +case 0x5984: +case 0x5B84: +case 0x5D84: +case 0x5F84: +case 0x5185: +case 0x5385: +case 0x5585: +case 0x5785: +case 0x5985: +case 0x5B85: +case 0x5D85: +case 0x5F85: +case 0x5186: +case 0x5386: +case 0x5586: +case 0x5786: +case 0x5986: +case 0x5B86: +case 0x5D86: +case 0x5F86: +case 0x5187: +case 0x5387: +case 0x5587: +case 0x5787: +case 0x5987: +case 0x5B87: +case 0x5D87: +case 0x5F87: + +// SUBQ +case 0x5180: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u32)CPU->D[(Opcode >> 0) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0x5388: +case 0x5588: +case 0x5788: +case 0x5988: +case 0x5B88: +case 0x5D88: +case 0x5F88: +case 0x5189: +case 0x5389: +case 0x5589: +case 0x5789: +case 0x5989: +case 0x5B89: +case 0x5D89: +case 0x5F89: +case 0x518A: +case 0x538A: +case 0x558A: +case 0x578A: +case 0x598A: +case 0x5B8A: +case 0x5D8A: +case 0x5F8A: +case 0x518B: +case 0x538B: +case 0x558B: +case 0x578B: +case 0x598B: +case 0x5B8B: +case 0x5D8B: +case 0x5F8B: +case 0x518C: +case 0x538C: +case 0x558C: +case 0x578C: +case 0x598C: +case 0x5B8C: +case 0x5D8C: +case 0x5F8C: +case 0x518D: +case 0x538D: +case 0x558D: +case 0x578D: +case 0x598D: +case 0x5B8D: +case 0x5D8D: +case 0x5F8D: +case 0x518E: +case 0x538E: +case 0x558E: +case 0x578E: +case 0x598E: +case 0x5B8E: +case 0x5D8E: +case 0x5F8E: +case 0x518F: +case 0x538F: +case 0x558F: +case 0x578F: +case 0x598F: +case 0x5B8F: +case 0x5D8F: +case 0x5F8F: + +// SUBQ +case 0x5188: +{ + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + dst = (u32)CPU->A[(Opcode >> 0) & 7]; + res = dst - src; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(8) +case 0x5390: +case 0x5590: +case 0x5790: +case 0x5990: +case 0x5B90: +case 0x5D90: +case 0x5F90: +case 0x5191: +case 0x5391: +case 0x5591: +case 0x5791: +case 0x5991: +case 0x5B91: +case 0x5D91: +case 0x5F91: +case 0x5192: +case 0x5392: +case 0x5592: +case 0x5792: +case 0x5992: +case 0x5B92: +case 0x5D92: +case 0x5F92: +case 0x5193: +case 0x5393: +case 0x5593: +case 0x5793: +case 0x5993: +case 0x5B93: +case 0x5D93: +case 0x5F93: +case 0x5194: +case 0x5394: +case 0x5594: +case 0x5794: +case 0x5994: +case 0x5B94: +case 0x5D94: +case 0x5F94: +case 0x5195: +case 0x5395: +case 0x5595: +case 0x5795: +case 0x5995: +case 0x5B95: +case 0x5D95: +case 0x5F95: +case 0x5196: +case 0x5396: +case 0x5596: +case 0x5796: +case 0x5996: +case 0x5B96: +case 0x5D96: +case 0x5F96: +case 0x5197: +case 0x5397: +case 0x5597: +case 0x5797: +case 0x5997: +case 0x5B97: +case 0x5D97: +case 0x5F97: + +// SUBQ +case 0x5190: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x5398: +case 0x5598: +case 0x5798: +case 0x5998: +case 0x5B98: +case 0x5D98: +case 0x5F98: +case 0x5199: +case 0x5399: +case 0x5599: +case 0x5799: +case 0x5999: +case 0x5B99: +case 0x5D99: +case 0x5F99: +case 0x519A: +case 0x539A: +case 0x559A: +case 0x579A: +case 0x599A: +case 0x5B9A: +case 0x5D9A: +case 0x5F9A: +case 0x519B: +case 0x539B: +case 0x559B: +case 0x579B: +case 0x599B: +case 0x5B9B: +case 0x5D9B: +case 0x5F9B: +case 0x519C: +case 0x539C: +case 0x559C: +case 0x579C: +case 0x599C: +case 0x5B9C: +case 0x5D9C: +case 0x5F9C: +case 0x519D: +case 0x539D: +case 0x559D: +case 0x579D: +case 0x599D: +case 0x5B9D: +case 0x5D9D: +case 0x5F9D: +case 0x519E: +case 0x539E: +case 0x559E: +case 0x579E: +case 0x599E: +case 0x5B9E: +case 0x5D9E: +case 0x5F9E: + +// SUBQ +case 0x5198: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x53A0: +case 0x55A0: +case 0x57A0: +case 0x59A0: +case 0x5BA0: +case 0x5DA0: +case 0x5FA0: +case 0x51A1: +case 0x53A1: +case 0x55A1: +case 0x57A1: +case 0x59A1: +case 0x5BA1: +case 0x5DA1: +case 0x5FA1: +case 0x51A2: +case 0x53A2: +case 0x55A2: +case 0x57A2: +case 0x59A2: +case 0x5BA2: +case 0x5DA2: +case 0x5FA2: +case 0x51A3: +case 0x53A3: +case 0x55A3: +case 0x57A3: +case 0x59A3: +case 0x5BA3: +case 0x5DA3: +case 0x5FA3: +case 0x51A4: +case 0x53A4: +case 0x55A4: +case 0x57A4: +case 0x59A4: +case 0x5BA4: +case 0x5DA4: +case 0x5FA4: +case 0x51A5: +case 0x53A5: +case 0x55A5: +case 0x57A5: +case 0x59A5: +case 0x5BA5: +case 0x5DA5: +case 0x5FA5: +case 0x51A6: +case 0x53A6: +case 0x55A6: +case 0x57A6: +case 0x59A6: +case 0x5BA6: +case 0x5DA6: +case 0x5FA6: + +// SUBQ +case 0x51A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x53A8: +case 0x55A8: +case 0x57A8: +case 0x59A8: +case 0x5BA8: +case 0x5DA8: +case 0x5FA8: +case 0x51A9: +case 0x53A9: +case 0x55A9: +case 0x57A9: +case 0x59A9: +case 0x5BA9: +case 0x5DA9: +case 0x5FA9: +case 0x51AA: +case 0x53AA: +case 0x55AA: +case 0x57AA: +case 0x59AA: +case 0x5BAA: +case 0x5DAA: +case 0x5FAA: +case 0x51AB: +case 0x53AB: +case 0x55AB: +case 0x57AB: +case 0x59AB: +case 0x5BAB: +case 0x5DAB: +case 0x5FAB: +case 0x51AC: +case 0x53AC: +case 0x55AC: +case 0x57AC: +case 0x59AC: +case 0x5BAC: +case 0x5DAC: +case 0x5FAC: +case 0x51AD: +case 0x53AD: +case 0x55AD: +case 0x57AD: +case 0x59AD: +case 0x5BAD: +case 0x5DAD: +case 0x5FAD: +case 0x51AE: +case 0x53AE: +case 0x55AE: +case 0x57AE: +case 0x59AE: +case 0x5BAE: +case 0x5DAE: +case 0x5FAE: +case 0x51AF: +case 0x53AF: +case 0x55AF: +case 0x57AF: +case 0x59AF: +case 0x5BAF: +case 0x5DAF: +case 0x5FAF: + +// SUBQ +case 0x51A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x53B0: +case 0x55B0: +case 0x57B0: +case 0x59B0: +case 0x5BB0: +case 0x5DB0: +case 0x5FB0: +case 0x51B1: +case 0x53B1: +case 0x55B1: +case 0x57B1: +case 0x59B1: +case 0x5BB1: +case 0x5DB1: +case 0x5FB1: +case 0x51B2: +case 0x53B2: +case 0x55B2: +case 0x57B2: +case 0x59B2: +case 0x5BB2: +case 0x5DB2: +case 0x5FB2: +case 0x51B3: +case 0x53B3: +case 0x55B3: +case 0x57B3: +case 0x59B3: +case 0x5BB3: +case 0x5DB3: +case 0x5FB3: +case 0x51B4: +case 0x53B4: +case 0x55B4: +case 0x57B4: +case 0x59B4: +case 0x5BB4: +case 0x5DB4: +case 0x5FB4: +case 0x51B5: +case 0x53B5: +case 0x55B5: +case 0x57B5: +case 0x59B5: +case 0x5BB5: +case 0x5DB5: +case 0x5FB5: +case 0x51B6: +case 0x53B6: +case 0x55B6: +case 0x57B6: +case 0x59B6: +case 0x5BB6: +case 0x5DB6: +case 0x5FB6: +case 0x51B7: +case 0x53B7: +case 0x55B7: +case 0x57B7: +case 0x59B7: +case 0x5BB7: +case 0x5DB7: +case 0x5FB7: + +// SUBQ +case 0x51B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 14; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x53B8: +case 0x55B8: +case 0x57B8: +case 0x59B8: +case 0x5BB8: +case 0x5DB8: +case 0x5FB8: + +// SUBQ +case 0x51B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x53B9: +case 0x55B9: +case 0x57B9: +case 0x59B9: +case 0x5BB9: +case 0x5DB9: +case 0x5FB9: + +// SUBQ +case 0x51B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 16; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x539F: +case 0x559F: +case 0x579F: +case 0x599F: +case 0x5B9F: +case 0x5D9F: +case 0x5F9F: + +// SUBQ +case 0x519F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) +case 0x53A7: +case 0x55A7: +case 0x57A7: +case 0x59A7: +case 0x5BA7: +case 0x5DA7: +case 0x5FA7: + +// SUBQ +case 0x51A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (((Opcode >> 9) - 1) & 7) + 1; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(4) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op6.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op6.inc new file mode 100644 index 0000000000..d9cc9cda78 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op6.inc @@ -0,0 +1,4434 @@ +case 0x6202: +case 0x6203: +case 0x6204: +case 0x6205: +case 0x6206: +case 0x6207: +case 0x6208: +case 0x6209: +case 0x620A: +case 0x620B: +case 0x620C: +case 0x620D: +case 0x620E: +case 0x620F: +case 0x6210: +case 0x6211: +case 0x6212: +case 0x6213: +case 0x6214: +case 0x6215: +case 0x6216: +case 0x6217: +case 0x6218: +case 0x6219: +case 0x621A: +case 0x621B: +case 0x621C: +case 0x621D: +case 0x621E: +case 0x621F: +case 0x6220: +case 0x6221: +case 0x6222: +case 0x6223: +case 0x6224: +case 0x6225: +case 0x6226: +case 0x6227: +case 0x6228: +case 0x6229: +case 0x622A: +case 0x622B: +case 0x622C: +case 0x622D: +case 0x622E: +case 0x622F: +case 0x6230: +case 0x6231: +case 0x6232: +case 0x6233: +case 0x6234: +case 0x6235: +case 0x6236: +case 0x6237: +case 0x6238: +case 0x6239: +case 0x623A: +case 0x623B: +case 0x623C: +case 0x623D: +case 0x623E: +case 0x623F: +case 0x6240: +case 0x6241: +case 0x6242: +case 0x6243: +case 0x6244: +case 0x6245: +case 0x6246: +case 0x6247: +case 0x6248: +case 0x6249: +case 0x624A: +case 0x624B: +case 0x624C: +case 0x624D: +case 0x624E: +case 0x624F: +case 0x6250: +case 0x6251: +case 0x6252: +case 0x6253: +case 0x6254: +case 0x6255: +case 0x6256: +case 0x6257: +case 0x6258: +case 0x6259: +case 0x625A: +case 0x625B: +case 0x625C: +case 0x625D: +case 0x625E: +case 0x625F: +case 0x6260: +case 0x6261: +case 0x6262: +case 0x6263: +case 0x6264: +case 0x6265: +case 0x6266: +case 0x6267: +case 0x6268: +case 0x6269: +case 0x626A: +case 0x626B: +case 0x626C: +case 0x626D: +case 0x626E: +case 0x626F: +case 0x6270: +case 0x6271: +case 0x6272: +case 0x6273: +case 0x6274: +case 0x6275: +case 0x6276: +case 0x6277: +case 0x6278: +case 0x6279: +case 0x627A: +case 0x627B: +case 0x627C: +case 0x627D: +case 0x627E: +case 0x627F: +case 0x6280: +case 0x6281: +case 0x6282: +case 0x6283: +case 0x6284: +case 0x6285: +case 0x6286: +case 0x6287: +case 0x6288: +case 0x6289: +case 0x628A: +case 0x628B: +case 0x628C: +case 0x628D: +case 0x628E: +case 0x628F: +case 0x6290: +case 0x6291: +case 0x6292: +case 0x6293: +case 0x6294: +case 0x6295: +case 0x6296: +case 0x6297: +case 0x6298: +case 0x6299: +case 0x629A: +case 0x629B: +case 0x629C: +case 0x629D: +case 0x629E: +case 0x629F: +case 0x62A0: +case 0x62A1: +case 0x62A2: +case 0x62A3: +case 0x62A4: +case 0x62A5: +case 0x62A6: +case 0x62A7: +case 0x62A8: +case 0x62A9: +case 0x62AA: +case 0x62AB: +case 0x62AC: +case 0x62AD: +case 0x62AE: +case 0x62AF: +case 0x62B0: +case 0x62B1: +case 0x62B2: +case 0x62B3: +case 0x62B4: +case 0x62B5: +case 0x62B6: +case 0x62B7: +case 0x62B8: +case 0x62B9: +case 0x62BA: +case 0x62BB: +case 0x62BC: +case 0x62BD: +case 0x62BE: +case 0x62BF: +case 0x62C0: +case 0x62C1: +case 0x62C2: +case 0x62C3: +case 0x62C4: +case 0x62C5: +case 0x62C6: +case 0x62C7: +case 0x62C8: +case 0x62C9: +case 0x62CA: +case 0x62CB: +case 0x62CC: +case 0x62CD: +case 0x62CE: +case 0x62CF: +case 0x62D0: +case 0x62D1: +case 0x62D2: +case 0x62D3: +case 0x62D4: +case 0x62D5: +case 0x62D6: +case 0x62D7: +case 0x62D8: +case 0x62D9: +case 0x62DA: +case 0x62DB: +case 0x62DC: +case 0x62DD: +case 0x62DE: +case 0x62DF: +case 0x62E0: +case 0x62E1: +case 0x62E2: +case 0x62E3: +case 0x62E4: +case 0x62E5: +case 0x62E6: +case 0x62E7: +case 0x62E8: +case 0x62E9: +case 0x62EA: +case 0x62EB: +case 0x62EC: +case 0x62ED: +case 0x62EE: +case 0x62EF: +case 0x62F0: +case 0x62F1: +case 0x62F2: +case 0x62F3: +case 0x62F4: +case 0x62F5: +case 0x62F6: +case 0x62F7: +case 0x62F8: +case 0x62F9: +case 0x62FA: +case 0x62FB: +case 0x62FC: +case 0x62FD: +case 0x62FE: +case 0x62FF: + +// BCC +case 0x6201: +{ + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6302: +case 0x6303: +case 0x6304: +case 0x6305: +case 0x6306: +case 0x6307: +case 0x6308: +case 0x6309: +case 0x630A: +case 0x630B: +case 0x630C: +case 0x630D: +case 0x630E: +case 0x630F: +case 0x6310: +case 0x6311: +case 0x6312: +case 0x6313: +case 0x6314: +case 0x6315: +case 0x6316: +case 0x6317: +case 0x6318: +case 0x6319: +case 0x631A: +case 0x631B: +case 0x631C: +case 0x631D: +case 0x631E: +case 0x631F: +case 0x6320: +case 0x6321: +case 0x6322: +case 0x6323: +case 0x6324: +case 0x6325: +case 0x6326: +case 0x6327: +case 0x6328: +case 0x6329: +case 0x632A: +case 0x632B: +case 0x632C: +case 0x632D: +case 0x632E: +case 0x632F: +case 0x6330: +case 0x6331: +case 0x6332: +case 0x6333: +case 0x6334: +case 0x6335: +case 0x6336: +case 0x6337: +case 0x6338: +case 0x6339: +case 0x633A: +case 0x633B: +case 0x633C: +case 0x633D: +case 0x633E: +case 0x633F: +case 0x6340: +case 0x6341: +case 0x6342: +case 0x6343: +case 0x6344: +case 0x6345: +case 0x6346: +case 0x6347: +case 0x6348: +case 0x6349: +case 0x634A: +case 0x634B: +case 0x634C: +case 0x634D: +case 0x634E: +case 0x634F: +case 0x6350: +case 0x6351: +case 0x6352: +case 0x6353: +case 0x6354: +case 0x6355: +case 0x6356: +case 0x6357: +case 0x6358: +case 0x6359: +case 0x635A: +case 0x635B: +case 0x635C: +case 0x635D: +case 0x635E: +case 0x635F: +case 0x6360: +case 0x6361: +case 0x6362: +case 0x6363: +case 0x6364: +case 0x6365: +case 0x6366: +case 0x6367: +case 0x6368: +case 0x6369: +case 0x636A: +case 0x636B: +case 0x636C: +case 0x636D: +case 0x636E: +case 0x636F: +case 0x6370: +case 0x6371: +case 0x6372: +case 0x6373: +case 0x6374: +case 0x6375: +case 0x6376: +case 0x6377: +case 0x6378: +case 0x6379: +case 0x637A: +case 0x637B: +case 0x637C: +case 0x637D: +case 0x637E: +case 0x637F: +case 0x6380: +case 0x6381: +case 0x6382: +case 0x6383: +case 0x6384: +case 0x6385: +case 0x6386: +case 0x6387: +case 0x6388: +case 0x6389: +case 0x638A: +case 0x638B: +case 0x638C: +case 0x638D: +case 0x638E: +case 0x638F: +case 0x6390: +case 0x6391: +case 0x6392: +case 0x6393: +case 0x6394: +case 0x6395: +case 0x6396: +case 0x6397: +case 0x6398: +case 0x6399: +case 0x639A: +case 0x639B: +case 0x639C: +case 0x639D: +case 0x639E: +case 0x639F: +case 0x63A0: +case 0x63A1: +case 0x63A2: +case 0x63A3: +case 0x63A4: +case 0x63A5: +case 0x63A6: +case 0x63A7: +case 0x63A8: +case 0x63A9: +case 0x63AA: +case 0x63AB: +case 0x63AC: +case 0x63AD: +case 0x63AE: +case 0x63AF: +case 0x63B0: +case 0x63B1: +case 0x63B2: +case 0x63B3: +case 0x63B4: +case 0x63B5: +case 0x63B6: +case 0x63B7: +case 0x63B8: +case 0x63B9: +case 0x63BA: +case 0x63BB: +case 0x63BC: +case 0x63BD: +case 0x63BE: +case 0x63BF: +case 0x63C0: +case 0x63C1: +case 0x63C2: +case 0x63C3: +case 0x63C4: +case 0x63C5: +case 0x63C6: +case 0x63C7: +case 0x63C8: +case 0x63C9: +case 0x63CA: +case 0x63CB: +case 0x63CC: +case 0x63CD: +case 0x63CE: +case 0x63CF: +case 0x63D0: +case 0x63D1: +case 0x63D2: +case 0x63D3: +case 0x63D4: +case 0x63D5: +case 0x63D6: +case 0x63D7: +case 0x63D8: +case 0x63D9: +case 0x63DA: +case 0x63DB: +case 0x63DC: +case 0x63DD: +case 0x63DE: +case 0x63DF: +case 0x63E0: +case 0x63E1: +case 0x63E2: +case 0x63E3: +case 0x63E4: +case 0x63E5: +case 0x63E6: +case 0x63E7: +case 0x63E8: +case 0x63E9: +case 0x63EA: +case 0x63EB: +case 0x63EC: +case 0x63ED: +case 0x63EE: +case 0x63EF: +case 0x63F0: +case 0x63F1: +case 0x63F2: +case 0x63F3: +case 0x63F4: +case 0x63F5: +case 0x63F6: +case 0x63F7: +case 0x63F8: +case 0x63F9: +case 0x63FA: +case 0x63FB: +case 0x63FC: +case 0x63FD: +case 0x63FE: +case 0x63FF: + +// BCC +case 0x6301: +{ + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6402: +case 0x6403: +case 0x6404: +case 0x6405: +case 0x6406: +case 0x6407: +case 0x6408: +case 0x6409: +case 0x640A: +case 0x640B: +case 0x640C: +case 0x640D: +case 0x640E: +case 0x640F: +case 0x6410: +case 0x6411: +case 0x6412: +case 0x6413: +case 0x6414: +case 0x6415: +case 0x6416: +case 0x6417: +case 0x6418: +case 0x6419: +case 0x641A: +case 0x641B: +case 0x641C: +case 0x641D: +case 0x641E: +case 0x641F: +case 0x6420: +case 0x6421: +case 0x6422: +case 0x6423: +case 0x6424: +case 0x6425: +case 0x6426: +case 0x6427: +case 0x6428: +case 0x6429: +case 0x642A: +case 0x642B: +case 0x642C: +case 0x642D: +case 0x642E: +case 0x642F: +case 0x6430: +case 0x6431: +case 0x6432: +case 0x6433: +case 0x6434: +case 0x6435: +case 0x6436: +case 0x6437: +case 0x6438: +case 0x6439: +case 0x643A: +case 0x643B: +case 0x643C: +case 0x643D: +case 0x643E: +case 0x643F: +case 0x6440: +case 0x6441: +case 0x6442: +case 0x6443: +case 0x6444: +case 0x6445: +case 0x6446: +case 0x6447: +case 0x6448: +case 0x6449: +case 0x644A: +case 0x644B: +case 0x644C: +case 0x644D: +case 0x644E: +case 0x644F: +case 0x6450: +case 0x6451: +case 0x6452: +case 0x6453: +case 0x6454: +case 0x6455: +case 0x6456: +case 0x6457: +case 0x6458: +case 0x6459: +case 0x645A: +case 0x645B: +case 0x645C: +case 0x645D: +case 0x645E: +case 0x645F: +case 0x6460: +case 0x6461: +case 0x6462: +case 0x6463: +case 0x6464: +case 0x6465: +case 0x6466: +case 0x6467: +case 0x6468: +case 0x6469: +case 0x646A: +case 0x646B: +case 0x646C: +case 0x646D: +case 0x646E: +case 0x646F: +case 0x6470: +case 0x6471: +case 0x6472: +case 0x6473: +case 0x6474: +case 0x6475: +case 0x6476: +case 0x6477: +case 0x6478: +case 0x6479: +case 0x647A: +case 0x647B: +case 0x647C: +case 0x647D: +case 0x647E: +case 0x647F: +case 0x6480: +case 0x6481: +case 0x6482: +case 0x6483: +case 0x6484: +case 0x6485: +case 0x6486: +case 0x6487: +case 0x6488: +case 0x6489: +case 0x648A: +case 0x648B: +case 0x648C: +case 0x648D: +case 0x648E: +case 0x648F: +case 0x6490: +case 0x6491: +case 0x6492: +case 0x6493: +case 0x6494: +case 0x6495: +case 0x6496: +case 0x6497: +case 0x6498: +case 0x6499: +case 0x649A: +case 0x649B: +case 0x649C: +case 0x649D: +case 0x649E: +case 0x649F: +case 0x64A0: +case 0x64A1: +case 0x64A2: +case 0x64A3: +case 0x64A4: +case 0x64A5: +case 0x64A6: +case 0x64A7: +case 0x64A8: +case 0x64A9: +case 0x64AA: +case 0x64AB: +case 0x64AC: +case 0x64AD: +case 0x64AE: +case 0x64AF: +case 0x64B0: +case 0x64B1: +case 0x64B2: +case 0x64B3: +case 0x64B4: +case 0x64B5: +case 0x64B6: +case 0x64B7: +case 0x64B8: +case 0x64B9: +case 0x64BA: +case 0x64BB: +case 0x64BC: +case 0x64BD: +case 0x64BE: +case 0x64BF: +case 0x64C0: +case 0x64C1: +case 0x64C2: +case 0x64C3: +case 0x64C4: +case 0x64C5: +case 0x64C6: +case 0x64C7: +case 0x64C8: +case 0x64C9: +case 0x64CA: +case 0x64CB: +case 0x64CC: +case 0x64CD: +case 0x64CE: +case 0x64CF: +case 0x64D0: +case 0x64D1: +case 0x64D2: +case 0x64D3: +case 0x64D4: +case 0x64D5: +case 0x64D6: +case 0x64D7: +case 0x64D8: +case 0x64D9: +case 0x64DA: +case 0x64DB: +case 0x64DC: +case 0x64DD: +case 0x64DE: +case 0x64DF: +case 0x64E0: +case 0x64E1: +case 0x64E2: +case 0x64E3: +case 0x64E4: +case 0x64E5: +case 0x64E6: +case 0x64E7: +case 0x64E8: +case 0x64E9: +case 0x64EA: +case 0x64EB: +case 0x64EC: +case 0x64ED: +case 0x64EE: +case 0x64EF: +case 0x64F0: +case 0x64F1: +case 0x64F2: +case 0x64F3: +case 0x64F4: +case 0x64F5: +case 0x64F6: +case 0x64F7: +case 0x64F8: +case 0x64F9: +case 0x64FA: +case 0x64FB: +case 0x64FC: +case 0x64FD: +case 0x64FE: +case 0x64FF: + +// BCC +case 0x6401: +{ + if (!(CPU->flag_C & 0x100)) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6502: +case 0x6503: +case 0x6504: +case 0x6505: +case 0x6506: +case 0x6507: +case 0x6508: +case 0x6509: +case 0x650A: +case 0x650B: +case 0x650C: +case 0x650D: +case 0x650E: +case 0x650F: +case 0x6510: +case 0x6511: +case 0x6512: +case 0x6513: +case 0x6514: +case 0x6515: +case 0x6516: +case 0x6517: +case 0x6518: +case 0x6519: +case 0x651A: +case 0x651B: +case 0x651C: +case 0x651D: +case 0x651E: +case 0x651F: +case 0x6520: +case 0x6521: +case 0x6522: +case 0x6523: +case 0x6524: +case 0x6525: +case 0x6526: +case 0x6527: +case 0x6528: +case 0x6529: +case 0x652A: +case 0x652B: +case 0x652C: +case 0x652D: +case 0x652E: +case 0x652F: +case 0x6530: +case 0x6531: +case 0x6532: +case 0x6533: +case 0x6534: +case 0x6535: +case 0x6536: +case 0x6537: +case 0x6538: +case 0x6539: +case 0x653A: +case 0x653B: +case 0x653C: +case 0x653D: +case 0x653E: +case 0x653F: +case 0x6540: +case 0x6541: +case 0x6542: +case 0x6543: +case 0x6544: +case 0x6545: +case 0x6546: +case 0x6547: +case 0x6548: +case 0x6549: +case 0x654A: +case 0x654B: +case 0x654C: +case 0x654D: +case 0x654E: +case 0x654F: +case 0x6550: +case 0x6551: +case 0x6552: +case 0x6553: +case 0x6554: +case 0x6555: +case 0x6556: +case 0x6557: +case 0x6558: +case 0x6559: +case 0x655A: +case 0x655B: +case 0x655C: +case 0x655D: +case 0x655E: +case 0x655F: +case 0x6560: +case 0x6561: +case 0x6562: +case 0x6563: +case 0x6564: +case 0x6565: +case 0x6566: +case 0x6567: +case 0x6568: +case 0x6569: +case 0x656A: +case 0x656B: +case 0x656C: +case 0x656D: +case 0x656E: +case 0x656F: +case 0x6570: +case 0x6571: +case 0x6572: +case 0x6573: +case 0x6574: +case 0x6575: +case 0x6576: +case 0x6577: +case 0x6578: +case 0x6579: +case 0x657A: +case 0x657B: +case 0x657C: +case 0x657D: +case 0x657E: +case 0x657F: +case 0x6580: +case 0x6581: +case 0x6582: +case 0x6583: +case 0x6584: +case 0x6585: +case 0x6586: +case 0x6587: +case 0x6588: +case 0x6589: +case 0x658A: +case 0x658B: +case 0x658C: +case 0x658D: +case 0x658E: +case 0x658F: +case 0x6590: +case 0x6591: +case 0x6592: +case 0x6593: +case 0x6594: +case 0x6595: +case 0x6596: +case 0x6597: +case 0x6598: +case 0x6599: +case 0x659A: +case 0x659B: +case 0x659C: +case 0x659D: +case 0x659E: +case 0x659F: +case 0x65A0: +case 0x65A1: +case 0x65A2: +case 0x65A3: +case 0x65A4: +case 0x65A5: +case 0x65A6: +case 0x65A7: +case 0x65A8: +case 0x65A9: +case 0x65AA: +case 0x65AB: +case 0x65AC: +case 0x65AD: +case 0x65AE: +case 0x65AF: +case 0x65B0: +case 0x65B1: +case 0x65B2: +case 0x65B3: +case 0x65B4: +case 0x65B5: +case 0x65B6: +case 0x65B7: +case 0x65B8: +case 0x65B9: +case 0x65BA: +case 0x65BB: +case 0x65BC: +case 0x65BD: +case 0x65BE: +case 0x65BF: +case 0x65C0: +case 0x65C1: +case 0x65C2: +case 0x65C3: +case 0x65C4: +case 0x65C5: +case 0x65C6: +case 0x65C7: +case 0x65C8: +case 0x65C9: +case 0x65CA: +case 0x65CB: +case 0x65CC: +case 0x65CD: +case 0x65CE: +case 0x65CF: +case 0x65D0: +case 0x65D1: +case 0x65D2: +case 0x65D3: +case 0x65D4: +case 0x65D5: +case 0x65D6: +case 0x65D7: +case 0x65D8: +case 0x65D9: +case 0x65DA: +case 0x65DB: +case 0x65DC: +case 0x65DD: +case 0x65DE: +case 0x65DF: +case 0x65E0: +case 0x65E1: +case 0x65E2: +case 0x65E3: +case 0x65E4: +case 0x65E5: +case 0x65E6: +case 0x65E7: +case 0x65E8: +case 0x65E9: +case 0x65EA: +case 0x65EB: +case 0x65EC: +case 0x65ED: +case 0x65EE: +case 0x65EF: +case 0x65F0: +case 0x65F1: +case 0x65F2: +case 0x65F3: +case 0x65F4: +case 0x65F5: +case 0x65F6: +case 0x65F7: +case 0x65F8: +case 0x65F9: +case 0x65FA: +case 0x65FB: +case 0x65FC: +case 0x65FD: +case 0x65FE: +case 0x65FF: + +// BCC +case 0x6501: +{ + if (CPU->flag_C & 0x100) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6602: +case 0x6603: +case 0x6604: +case 0x6605: +case 0x6606: +case 0x6607: +case 0x6608: +case 0x6609: +case 0x660A: +case 0x660B: +case 0x660C: +case 0x660D: +case 0x660E: +case 0x660F: +case 0x6610: +case 0x6611: +case 0x6612: +case 0x6613: +case 0x6614: +case 0x6615: +case 0x6616: +case 0x6617: +case 0x6618: +case 0x6619: +case 0x661A: +case 0x661B: +case 0x661C: +case 0x661D: +case 0x661E: +case 0x661F: +case 0x6620: +case 0x6621: +case 0x6622: +case 0x6623: +case 0x6624: +case 0x6625: +case 0x6626: +case 0x6627: +case 0x6628: +case 0x6629: +case 0x662A: +case 0x662B: +case 0x662C: +case 0x662D: +case 0x662E: +case 0x662F: +case 0x6630: +case 0x6631: +case 0x6632: +case 0x6633: +case 0x6634: +case 0x6635: +case 0x6636: +case 0x6637: +case 0x6638: +case 0x6639: +case 0x663A: +case 0x663B: +case 0x663C: +case 0x663D: +case 0x663E: +case 0x663F: +case 0x6640: +case 0x6641: +case 0x6642: +case 0x6643: +case 0x6644: +case 0x6645: +case 0x6646: +case 0x6647: +case 0x6648: +case 0x6649: +case 0x664A: +case 0x664B: +case 0x664C: +case 0x664D: +case 0x664E: +case 0x664F: +case 0x6650: +case 0x6651: +case 0x6652: +case 0x6653: +case 0x6654: +case 0x6655: +case 0x6656: +case 0x6657: +case 0x6658: +case 0x6659: +case 0x665A: +case 0x665B: +case 0x665C: +case 0x665D: +case 0x665E: +case 0x665F: +case 0x6660: +case 0x6661: +case 0x6662: +case 0x6663: +case 0x6664: +case 0x6665: +case 0x6666: +case 0x6667: +case 0x6668: +case 0x6669: +case 0x666A: +case 0x666B: +case 0x666C: +case 0x666D: +case 0x666E: +case 0x666F: +case 0x6670: +case 0x6671: +case 0x6672: +case 0x6673: +case 0x6674: +case 0x6675: +case 0x6676: +case 0x6677: +case 0x6678: +case 0x6679: +case 0x667A: +case 0x667B: +case 0x667C: +case 0x667D: +case 0x667E: +case 0x667F: +case 0x6680: +case 0x6681: +case 0x6682: +case 0x6683: +case 0x6684: +case 0x6685: +case 0x6686: +case 0x6687: +case 0x6688: +case 0x6689: +case 0x668A: +case 0x668B: +case 0x668C: +case 0x668D: +case 0x668E: +case 0x668F: +case 0x6690: +case 0x6691: +case 0x6692: +case 0x6693: +case 0x6694: +case 0x6695: +case 0x6696: +case 0x6697: +case 0x6698: +case 0x6699: +case 0x669A: +case 0x669B: +case 0x669C: +case 0x669D: +case 0x669E: +case 0x669F: +case 0x66A0: +case 0x66A1: +case 0x66A2: +case 0x66A3: +case 0x66A4: +case 0x66A5: +case 0x66A6: +case 0x66A7: +case 0x66A8: +case 0x66A9: +case 0x66AA: +case 0x66AB: +case 0x66AC: +case 0x66AD: +case 0x66AE: +case 0x66AF: +case 0x66B0: +case 0x66B1: +case 0x66B2: +case 0x66B3: +case 0x66B4: +case 0x66B5: +case 0x66B6: +case 0x66B7: +case 0x66B8: +case 0x66B9: +case 0x66BA: +case 0x66BB: +case 0x66BC: +case 0x66BD: +case 0x66BE: +case 0x66BF: +case 0x66C0: +case 0x66C1: +case 0x66C2: +case 0x66C3: +case 0x66C4: +case 0x66C5: +case 0x66C6: +case 0x66C7: +case 0x66C8: +case 0x66C9: +case 0x66CA: +case 0x66CB: +case 0x66CC: +case 0x66CD: +case 0x66CE: +case 0x66CF: +case 0x66D0: +case 0x66D1: +case 0x66D2: +case 0x66D3: +case 0x66D4: +case 0x66D5: +case 0x66D6: +case 0x66D7: +case 0x66D8: +case 0x66D9: +case 0x66DA: +case 0x66DB: +case 0x66DC: +case 0x66DD: +case 0x66DE: +case 0x66DF: +case 0x66E0: +case 0x66E1: +case 0x66E2: +case 0x66E3: +case 0x66E4: +case 0x66E5: +case 0x66E6: +case 0x66E7: +case 0x66E8: +case 0x66E9: +case 0x66EA: +case 0x66EB: +case 0x66EC: +case 0x66ED: +case 0x66EE: +case 0x66EF: +case 0x66F0: +case 0x66F1: +case 0x66F2: +case 0x66F3: +case 0x66F4: +case 0x66F5: +case 0x66F6: +case 0x66F7: +case 0x66F8: +case 0x66F9: +case 0x66FA: +case 0x66FB: +case 0x66FC: +case 0x66FD: +case 0x66FE: +case 0x66FF: + +// BCC +case 0x6601: +{ + if (CPU->flag_notZ) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6702: +case 0x6703: +case 0x6704: +case 0x6705: +case 0x6706: +case 0x6707: +case 0x6708: +case 0x6709: +case 0x670A: +case 0x670B: +case 0x670C: +case 0x670D: +case 0x670E: +case 0x670F: +case 0x6710: +case 0x6711: +case 0x6712: +case 0x6713: +case 0x6714: +case 0x6715: +case 0x6716: +case 0x6717: +case 0x6718: +case 0x6719: +case 0x671A: +case 0x671B: +case 0x671C: +case 0x671D: +case 0x671E: +case 0x671F: +case 0x6720: +case 0x6721: +case 0x6722: +case 0x6723: +case 0x6724: +case 0x6725: +case 0x6726: +case 0x6727: +case 0x6728: +case 0x6729: +case 0x672A: +case 0x672B: +case 0x672C: +case 0x672D: +case 0x672E: +case 0x672F: +case 0x6730: +case 0x6731: +case 0x6732: +case 0x6733: +case 0x6734: +case 0x6735: +case 0x6736: +case 0x6737: +case 0x6738: +case 0x6739: +case 0x673A: +case 0x673B: +case 0x673C: +case 0x673D: +case 0x673E: +case 0x673F: +case 0x6740: +case 0x6741: +case 0x6742: +case 0x6743: +case 0x6744: +case 0x6745: +case 0x6746: +case 0x6747: +case 0x6748: +case 0x6749: +case 0x674A: +case 0x674B: +case 0x674C: +case 0x674D: +case 0x674E: +case 0x674F: +case 0x6750: +case 0x6751: +case 0x6752: +case 0x6753: +case 0x6754: +case 0x6755: +case 0x6756: +case 0x6757: +case 0x6758: +case 0x6759: +case 0x675A: +case 0x675B: +case 0x675C: +case 0x675D: +case 0x675E: +case 0x675F: +case 0x6760: +case 0x6761: +case 0x6762: +case 0x6763: +case 0x6764: +case 0x6765: +case 0x6766: +case 0x6767: +case 0x6768: +case 0x6769: +case 0x676A: +case 0x676B: +case 0x676C: +case 0x676D: +case 0x676E: +case 0x676F: +case 0x6770: +case 0x6771: +case 0x6772: +case 0x6773: +case 0x6774: +case 0x6775: +case 0x6776: +case 0x6777: +case 0x6778: +case 0x6779: +case 0x677A: +case 0x677B: +case 0x677C: +case 0x677D: +case 0x677E: +case 0x677F: +case 0x6780: +case 0x6781: +case 0x6782: +case 0x6783: +case 0x6784: +case 0x6785: +case 0x6786: +case 0x6787: +case 0x6788: +case 0x6789: +case 0x678A: +case 0x678B: +case 0x678C: +case 0x678D: +case 0x678E: +case 0x678F: +case 0x6790: +case 0x6791: +case 0x6792: +case 0x6793: +case 0x6794: +case 0x6795: +case 0x6796: +case 0x6797: +case 0x6798: +case 0x6799: +case 0x679A: +case 0x679B: +case 0x679C: +case 0x679D: +case 0x679E: +case 0x679F: +case 0x67A0: +case 0x67A1: +case 0x67A2: +case 0x67A3: +case 0x67A4: +case 0x67A5: +case 0x67A6: +case 0x67A7: +case 0x67A8: +case 0x67A9: +case 0x67AA: +case 0x67AB: +case 0x67AC: +case 0x67AD: +case 0x67AE: +case 0x67AF: +case 0x67B0: +case 0x67B1: +case 0x67B2: +case 0x67B3: +case 0x67B4: +case 0x67B5: +case 0x67B6: +case 0x67B7: +case 0x67B8: +case 0x67B9: +case 0x67BA: +case 0x67BB: +case 0x67BC: +case 0x67BD: +case 0x67BE: +case 0x67BF: +case 0x67C0: +case 0x67C1: +case 0x67C2: +case 0x67C3: +case 0x67C4: +case 0x67C5: +case 0x67C6: +case 0x67C7: +case 0x67C8: +case 0x67C9: +case 0x67CA: +case 0x67CB: +case 0x67CC: +case 0x67CD: +case 0x67CE: +case 0x67CF: +case 0x67D0: +case 0x67D1: +case 0x67D2: +case 0x67D3: +case 0x67D4: +case 0x67D5: +case 0x67D6: +case 0x67D7: +case 0x67D8: +case 0x67D9: +case 0x67DA: +case 0x67DB: +case 0x67DC: +case 0x67DD: +case 0x67DE: +case 0x67DF: +case 0x67E0: +case 0x67E1: +case 0x67E2: +case 0x67E3: +case 0x67E4: +case 0x67E5: +case 0x67E6: +case 0x67E7: +case 0x67E8: +case 0x67E9: +case 0x67EA: +case 0x67EB: +case 0x67EC: +case 0x67ED: +case 0x67EE: +case 0x67EF: +case 0x67F0: +case 0x67F1: +case 0x67F2: +case 0x67F3: +case 0x67F4: +case 0x67F5: +case 0x67F6: +case 0x67F7: +case 0x67F8: +case 0x67F9: +case 0x67FA: +case 0x67FB: +case 0x67FC: +case 0x67FD: +case 0x67FE: +case 0x67FF: + +// BCC +case 0x6701: +{ + if (!CPU->flag_notZ) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6802: +case 0x6803: +case 0x6804: +case 0x6805: +case 0x6806: +case 0x6807: +case 0x6808: +case 0x6809: +case 0x680A: +case 0x680B: +case 0x680C: +case 0x680D: +case 0x680E: +case 0x680F: +case 0x6810: +case 0x6811: +case 0x6812: +case 0x6813: +case 0x6814: +case 0x6815: +case 0x6816: +case 0x6817: +case 0x6818: +case 0x6819: +case 0x681A: +case 0x681B: +case 0x681C: +case 0x681D: +case 0x681E: +case 0x681F: +case 0x6820: +case 0x6821: +case 0x6822: +case 0x6823: +case 0x6824: +case 0x6825: +case 0x6826: +case 0x6827: +case 0x6828: +case 0x6829: +case 0x682A: +case 0x682B: +case 0x682C: +case 0x682D: +case 0x682E: +case 0x682F: +case 0x6830: +case 0x6831: +case 0x6832: +case 0x6833: +case 0x6834: +case 0x6835: +case 0x6836: +case 0x6837: +case 0x6838: +case 0x6839: +case 0x683A: +case 0x683B: +case 0x683C: +case 0x683D: +case 0x683E: +case 0x683F: +case 0x6840: +case 0x6841: +case 0x6842: +case 0x6843: +case 0x6844: +case 0x6845: +case 0x6846: +case 0x6847: +case 0x6848: +case 0x6849: +case 0x684A: +case 0x684B: +case 0x684C: +case 0x684D: +case 0x684E: +case 0x684F: +case 0x6850: +case 0x6851: +case 0x6852: +case 0x6853: +case 0x6854: +case 0x6855: +case 0x6856: +case 0x6857: +case 0x6858: +case 0x6859: +case 0x685A: +case 0x685B: +case 0x685C: +case 0x685D: +case 0x685E: +case 0x685F: +case 0x6860: +case 0x6861: +case 0x6862: +case 0x6863: +case 0x6864: +case 0x6865: +case 0x6866: +case 0x6867: +case 0x6868: +case 0x6869: +case 0x686A: +case 0x686B: +case 0x686C: +case 0x686D: +case 0x686E: +case 0x686F: +case 0x6870: +case 0x6871: +case 0x6872: +case 0x6873: +case 0x6874: +case 0x6875: +case 0x6876: +case 0x6877: +case 0x6878: +case 0x6879: +case 0x687A: +case 0x687B: +case 0x687C: +case 0x687D: +case 0x687E: +case 0x687F: +case 0x6880: +case 0x6881: +case 0x6882: +case 0x6883: +case 0x6884: +case 0x6885: +case 0x6886: +case 0x6887: +case 0x6888: +case 0x6889: +case 0x688A: +case 0x688B: +case 0x688C: +case 0x688D: +case 0x688E: +case 0x688F: +case 0x6890: +case 0x6891: +case 0x6892: +case 0x6893: +case 0x6894: +case 0x6895: +case 0x6896: +case 0x6897: +case 0x6898: +case 0x6899: +case 0x689A: +case 0x689B: +case 0x689C: +case 0x689D: +case 0x689E: +case 0x689F: +case 0x68A0: +case 0x68A1: +case 0x68A2: +case 0x68A3: +case 0x68A4: +case 0x68A5: +case 0x68A6: +case 0x68A7: +case 0x68A8: +case 0x68A9: +case 0x68AA: +case 0x68AB: +case 0x68AC: +case 0x68AD: +case 0x68AE: +case 0x68AF: +case 0x68B0: +case 0x68B1: +case 0x68B2: +case 0x68B3: +case 0x68B4: +case 0x68B5: +case 0x68B6: +case 0x68B7: +case 0x68B8: +case 0x68B9: +case 0x68BA: +case 0x68BB: +case 0x68BC: +case 0x68BD: +case 0x68BE: +case 0x68BF: +case 0x68C0: +case 0x68C1: +case 0x68C2: +case 0x68C3: +case 0x68C4: +case 0x68C5: +case 0x68C6: +case 0x68C7: +case 0x68C8: +case 0x68C9: +case 0x68CA: +case 0x68CB: +case 0x68CC: +case 0x68CD: +case 0x68CE: +case 0x68CF: +case 0x68D0: +case 0x68D1: +case 0x68D2: +case 0x68D3: +case 0x68D4: +case 0x68D5: +case 0x68D6: +case 0x68D7: +case 0x68D8: +case 0x68D9: +case 0x68DA: +case 0x68DB: +case 0x68DC: +case 0x68DD: +case 0x68DE: +case 0x68DF: +case 0x68E0: +case 0x68E1: +case 0x68E2: +case 0x68E3: +case 0x68E4: +case 0x68E5: +case 0x68E6: +case 0x68E7: +case 0x68E8: +case 0x68E9: +case 0x68EA: +case 0x68EB: +case 0x68EC: +case 0x68ED: +case 0x68EE: +case 0x68EF: +case 0x68F0: +case 0x68F1: +case 0x68F2: +case 0x68F3: +case 0x68F4: +case 0x68F5: +case 0x68F6: +case 0x68F7: +case 0x68F8: +case 0x68F9: +case 0x68FA: +case 0x68FB: +case 0x68FC: +case 0x68FD: +case 0x68FE: +case 0x68FF: + +// BCC +case 0x6801: +{ + if (!(CPU->flag_V & 0x80)) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6902: +case 0x6903: +case 0x6904: +case 0x6905: +case 0x6906: +case 0x6907: +case 0x6908: +case 0x6909: +case 0x690A: +case 0x690B: +case 0x690C: +case 0x690D: +case 0x690E: +case 0x690F: +case 0x6910: +case 0x6911: +case 0x6912: +case 0x6913: +case 0x6914: +case 0x6915: +case 0x6916: +case 0x6917: +case 0x6918: +case 0x6919: +case 0x691A: +case 0x691B: +case 0x691C: +case 0x691D: +case 0x691E: +case 0x691F: +case 0x6920: +case 0x6921: +case 0x6922: +case 0x6923: +case 0x6924: +case 0x6925: +case 0x6926: +case 0x6927: +case 0x6928: +case 0x6929: +case 0x692A: +case 0x692B: +case 0x692C: +case 0x692D: +case 0x692E: +case 0x692F: +case 0x6930: +case 0x6931: +case 0x6932: +case 0x6933: +case 0x6934: +case 0x6935: +case 0x6936: +case 0x6937: +case 0x6938: +case 0x6939: +case 0x693A: +case 0x693B: +case 0x693C: +case 0x693D: +case 0x693E: +case 0x693F: +case 0x6940: +case 0x6941: +case 0x6942: +case 0x6943: +case 0x6944: +case 0x6945: +case 0x6946: +case 0x6947: +case 0x6948: +case 0x6949: +case 0x694A: +case 0x694B: +case 0x694C: +case 0x694D: +case 0x694E: +case 0x694F: +case 0x6950: +case 0x6951: +case 0x6952: +case 0x6953: +case 0x6954: +case 0x6955: +case 0x6956: +case 0x6957: +case 0x6958: +case 0x6959: +case 0x695A: +case 0x695B: +case 0x695C: +case 0x695D: +case 0x695E: +case 0x695F: +case 0x6960: +case 0x6961: +case 0x6962: +case 0x6963: +case 0x6964: +case 0x6965: +case 0x6966: +case 0x6967: +case 0x6968: +case 0x6969: +case 0x696A: +case 0x696B: +case 0x696C: +case 0x696D: +case 0x696E: +case 0x696F: +case 0x6970: +case 0x6971: +case 0x6972: +case 0x6973: +case 0x6974: +case 0x6975: +case 0x6976: +case 0x6977: +case 0x6978: +case 0x6979: +case 0x697A: +case 0x697B: +case 0x697C: +case 0x697D: +case 0x697E: +case 0x697F: +case 0x6980: +case 0x6981: +case 0x6982: +case 0x6983: +case 0x6984: +case 0x6985: +case 0x6986: +case 0x6987: +case 0x6988: +case 0x6989: +case 0x698A: +case 0x698B: +case 0x698C: +case 0x698D: +case 0x698E: +case 0x698F: +case 0x6990: +case 0x6991: +case 0x6992: +case 0x6993: +case 0x6994: +case 0x6995: +case 0x6996: +case 0x6997: +case 0x6998: +case 0x6999: +case 0x699A: +case 0x699B: +case 0x699C: +case 0x699D: +case 0x699E: +case 0x699F: +case 0x69A0: +case 0x69A1: +case 0x69A2: +case 0x69A3: +case 0x69A4: +case 0x69A5: +case 0x69A6: +case 0x69A7: +case 0x69A8: +case 0x69A9: +case 0x69AA: +case 0x69AB: +case 0x69AC: +case 0x69AD: +case 0x69AE: +case 0x69AF: +case 0x69B0: +case 0x69B1: +case 0x69B2: +case 0x69B3: +case 0x69B4: +case 0x69B5: +case 0x69B6: +case 0x69B7: +case 0x69B8: +case 0x69B9: +case 0x69BA: +case 0x69BB: +case 0x69BC: +case 0x69BD: +case 0x69BE: +case 0x69BF: +case 0x69C0: +case 0x69C1: +case 0x69C2: +case 0x69C3: +case 0x69C4: +case 0x69C5: +case 0x69C6: +case 0x69C7: +case 0x69C8: +case 0x69C9: +case 0x69CA: +case 0x69CB: +case 0x69CC: +case 0x69CD: +case 0x69CE: +case 0x69CF: +case 0x69D0: +case 0x69D1: +case 0x69D2: +case 0x69D3: +case 0x69D4: +case 0x69D5: +case 0x69D6: +case 0x69D7: +case 0x69D8: +case 0x69D9: +case 0x69DA: +case 0x69DB: +case 0x69DC: +case 0x69DD: +case 0x69DE: +case 0x69DF: +case 0x69E0: +case 0x69E1: +case 0x69E2: +case 0x69E3: +case 0x69E4: +case 0x69E5: +case 0x69E6: +case 0x69E7: +case 0x69E8: +case 0x69E9: +case 0x69EA: +case 0x69EB: +case 0x69EC: +case 0x69ED: +case 0x69EE: +case 0x69EF: +case 0x69F0: +case 0x69F1: +case 0x69F2: +case 0x69F3: +case 0x69F4: +case 0x69F5: +case 0x69F6: +case 0x69F7: +case 0x69F8: +case 0x69F9: +case 0x69FA: +case 0x69FB: +case 0x69FC: +case 0x69FD: +case 0x69FE: +case 0x69FF: + +// BCC +case 0x6901: +{ + if (CPU->flag_V & 0x80) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6A02: +case 0x6A03: +case 0x6A04: +case 0x6A05: +case 0x6A06: +case 0x6A07: +case 0x6A08: +case 0x6A09: +case 0x6A0A: +case 0x6A0B: +case 0x6A0C: +case 0x6A0D: +case 0x6A0E: +case 0x6A0F: +case 0x6A10: +case 0x6A11: +case 0x6A12: +case 0x6A13: +case 0x6A14: +case 0x6A15: +case 0x6A16: +case 0x6A17: +case 0x6A18: +case 0x6A19: +case 0x6A1A: +case 0x6A1B: +case 0x6A1C: +case 0x6A1D: +case 0x6A1E: +case 0x6A1F: +case 0x6A20: +case 0x6A21: +case 0x6A22: +case 0x6A23: +case 0x6A24: +case 0x6A25: +case 0x6A26: +case 0x6A27: +case 0x6A28: +case 0x6A29: +case 0x6A2A: +case 0x6A2B: +case 0x6A2C: +case 0x6A2D: +case 0x6A2E: +case 0x6A2F: +case 0x6A30: +case 0x6A31: +case 0x6A32: +case 0x6A33: +case 0x6A34: +case 0x6A35: +case 0x6A36: +case 0x6A37: +case 0x6A38: +case 0x6A39: +case 0x6A3A: +case 0x6A3B: +case 0x6A3C: +case 0x6A3D: +case 0x6A3E: +case 0x6A3F: +case 0x6A40: +case 0x6A41: +case 0x6A42: +case 0x6A43: +case 0x6A44: +case 0x6A45: +case 0x6A46: +case 0x6A47: +case 0x6A48: +case 0x6A49: +case 0x6A4A: +case 0x6A4B: +case 0x6A4C: +case 0x6A4D: +case 0x6A4E: +case 0x6A4F: +case 0x6A50: +case 0x6A51: +case 0x6A52: +case 0x6A53: +case 0x6A54: +case 0x6A55: +case 0x6A56: +case 0x6A57: +case 0x6A58: +case 0x6A59: +case 0x6A5A: +case 0x6A5B: +case 0x6A5C: +case 0x6A5D: +case 0x6A5E: +case 0x6A5F: +case 0x6A60: +case 0x6A61: +case 0x6A62: +case 0x6A63: +case 0x6A64: +case 0x6A65: +case 0x6A66: +case 0x6A67: +case 0x6A68: +case 0x6A69: +case 0x6A6A: +case 0x6A6B: +case 0x6A6C: +case 0x6A6D: +case 0x6A6E: +case 0x6A6F: +case 0x6A70: +case 0x6A71: +case 0x6A72: +case 0x6A73: +case 0x6A74: +case 0x6A75: +case 0x6A76: +case 0x6A77: +case 0x6A78: +case 0x6A79: +case 0x6A7A: +case 0x6A7B: +case 0x6A7C: +case 0x6A7D: +case 0x6A7E: +case 0x6A7F: +case 0x6A80: +case 0x6A81: +case 0x6A82: +case 0x6A83: +case 0x6A84: +case 0x6A85: +case 0x6A86: +case 0x6A87: +case 0x6A88: +case 0x6A89: +case 0x6A8A: +case 0x6A8B: +case 0x6A8C: +case 0x6A8D: +case 0x6A8E: +case 0x6A8F: +case 0x6A90: +case 0x6A91: +case 0x6A92: +case 0x6A93: +case 0x6A94: +case 0x6A95: +case 0x6A96: +case 0x6A97: +case 0x6A98: +case 0x6A99: +case 0x6A9A: +case 0x6A9B: +case 0x6A9C: +case 0x6A9D: +case 0x6A9E: +case 0x6A9F: +case 0x6AA0: +case 0x6AA1: +case 0x6AA2: +case 0x6AA3: +case 0x6AA4: +case 0x6AA5: +case 0x6AA6: +case 0x6AA7: +case 0x6AA8: +case 0x6AA9: +case 0x6AAA: +case 0x6AAB: +case 0x6AAC: +case 0x6AAD: +case 0x6AAE: +case 0x6AAF: +case 0x6AB0: +case 0x6AB1: +case 0x6AB2: +case 0x6AB3: +case 0x6AB4: +case 0x6AB5: +case 0x6AB6: +case 0x6AB7: +case 0x6AB8: +case 0x6AB9: +case 0x6ABA: +case 0x6ABB: +case 0x6ABC: +case 0x6ABD: +case 0x6ABE: +case 0x6ABF: +case 0x6AC0: +case 0x6AC1: +case 0x6AC2: +case 0x6AC3: +case 0x6AC4: +case 0x6AC5: +case 0x6AC6: +case 0x6AC7: +case 0x6AC8: +case 0x6AC9: +case 0x6ACA: +case 0x6ACB: +case 0x6ACC: +case 0x6ACD: +case 0x6ACE: +case 0x6ACF: +case 0x6AD0: +case 0x6AD1: +case 0x6AD2: +case 0x6AD3: +case 0x6AD4: +case 0x6AD5: +case 0x6AD6: +case 0x6AD7: +case 0x6AD8: +case 0x6AD9: +case 0x6ADA: +case 0x6ADB: +case 0x6ADC: +case 0x6ADD: +case 0x6ADE: +case 0x6ADF: +case 0x6AE0: +case 0x6AE1: +case 0x6AE2: +case 0x6AE3: +case 0x6AE4: +case 0x6AE5: +case 0x6AE6: +case 0x6AE7: +case 0x6AE8: +case 0x6AE9: +case 0x6AEA: +case 0x6AEB: +case 0x6AEC: +case 0x6AED: +case 0x6AEE: +case 0x6AEF: +case 0x6AF0: +case 0x6AF1: +case 0x6AF2: +case 0x6AF3: +case 0x6AF4: +case 0x6AF5: +case 0x6AF6: +case 0x6AF7: +case 0x6AF8: +case 0x6AF9: +case 0x6AFA: +case 0x6AFB: +case 0x6AFC: +case 0x6AFD: +case 0x6AFE: +case 0x6AFF: + +// BCC +case 0x6A01: +{ + if (!(CPU->flag_N & 0x80)) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6B02: +case 0x6B03: +case 0x6B04: +case 0x6B05: +case 0x6B06: +case 0x6B07: +case 0x6B08: +case 0x6B09: +case 0x6B0A: +case 0x6B0B: +case 0x6B0C: +case 0x6B0D: +case 0x6B0E: +case 0x6B0F: +case 0x6B10: +case 0x6B11: +case 0x6B12: +case 0x6B13: +case 0x6B14: +case 0x6B15: +case 0x6B16: +case 0x6B17: +case 0x6B18: +case 0x6B19: +case 0x6B1A: +case 0x6B1B: +case 0x6B1C: +case 0x6B1D: +case 0x6B1E: +case 0x6B1F: +case 0x6B20: +case 0x6B21: +case 0x6B22: +case 0x6B23: +case 0x6B24: +case 0x6B25: +case 0x6B26: +case 0x6B27: +case 0x6B28: +case 0x6B29: +case 0x6B2A: +case 0x6B2B: +case 0x6B2C: +case 0x6B2D: +case 0x6B2E: +case 0x6B2F: +case 0x6B30: +case 0x6B31: +case 0x6B32: +case 0x6B33: +case 0x6B34: +case 0x6B35: +case 0x6B36: +case 0x6B37: +case 0x6B38: +case 0x6B39: +case 0x6B3A: +case 0x6B3B: +case 0x6B3C: +case 0x6B3D: +case 0x6B3E: +case 0x6B3F: +case 0x6B40: +case 0x6B41: +case 0x6B42: +case 0x6B43: +case 0x6B44: +case 0x6B45: +case 0x6B46: +case 0x6B47: +case 0x6B48: +case 0x6B49: +case 0x6B4A: +case 0x6B4B: +case 0x6B4C: +case 0x6B4D: +case 0x6B4E: +case 0x6B4F: +case 0x6B50: +case 0x6B51: +case 0x6B52: +case 0x6B53: +case 0x6B54: +case 0x6B55: +case 0x6B56: +case 0x6B57: +case 0x6B58: +case 0x6B59: +case 0x6B5A: +case 0x6B5B: +case 0x6B5C: +case 0x6B5D: +case 0x6B5E: +case 0x6B5F: +case 0x6B60: +case 0x6B61: +case 0x6B62: +case 0x6B63: +case 0x6B64: +case 0x6B65: +case 0x6B66: +case 0x6B67: +case 0x6B68: +case 0x6B69: +case 0x6B6A: +case 0x6B6B: +case 0x6B6C: +case 0x6B6D: +case 0x6B6E: +case 0x6B6F: +case 0x6B70: +case 0x6B71: +case 0x6B72: +case 0x6B73: +case 0x6B74: +case 0x6B75: +case 0x6B76: +case 0x6B77: +case 0x6B78: +case 0x6B79: +case 0x6B7A: +case 0x6B7B: +case 0x6B7C: +case 0x6B7D: +case 0x6B7E: +case 0x6B7F: +case 0x6B80: +case 0x6B81: +case 0x6B82: +case 0x6B83: +case 0x6B84: +case 0x6B85: +case 0x6B86: +case 0x6B87: +case 0x6B88: +case 0x6B89: +case 0x6B8A: +case 0x6B8B: +case 0x6B8C: +case 0x6B8D: +case 0x6B8E: +case 0x6B8F: +case 0x6B90: +case 0x6B91: +case 0x6B92: +case 0x6B93: +case 0x6B94: +case 0x6B95: +case 0x6B96: +case 0x6B97: +case 0x6B98: +case 0x6B99: +case 0x6B9A: +case 0x6B9B: +case 0x6B9C: +case 0x6B9D: +case 0x6B9E: +case 0x6B9F: +case 0x6BA0: +case 0x6BA1: +case 0x6BA2: +case 0x6BA3: +case 0x6BA4: +case 0x6BA5: +case 0x6BA6: +case 0x6BA7: +case 0x6BA8: +case 0x6BA9: +case 0x6BAA: +case 0x6BAB: +case 0x6BAC: +case 0x6BAD: +case 0x6BAE: +case 0x6BAF: +case 0x6BB0: +case 0x6BB1: +case 0x6BB2: +case 0x6BB3: +case 0x6BB4: +case 0x6BB5: +case 0x6BB6: +case 0x6BB7: +case 0x6BB8: +case 0x6BB9: +case 0x6BBA: +case 0x6BBB: +case 0x6BBC: +case 0x6BBD: +case 0x6BBE: +case 0x6BBF: +case 0x6BC0: +case 0x6BC1: +case 0x6BC2: +case 0x6BC3: +case 0x6BC4: +case 0x6BC5: +case 0x6BC6: +case 0x6BC7: +case 0x6BC8: +case 0x6BC9: +case 0x6BCA: +case 0x6BCB: +case 0x6BCC: +case 0x6BCD: +case 0x6BCE: +case 0x6BCF: +case 0x6BD0: +case 0x6BD1: +case 0x6BD2: +case 0x6BD3: +case 0x6BD4: +case 0x6BD5: +case 0x6BD6: +case 0x6BD7: +case 0x6BD8: +case 0x6BD9: +case 0x6BDA: +case 0x6BDB: +case 0x6BDC: +case 0x6BDD: +case 0x6BDE: +case 0x6BDF: +case 0x6BE0: +case 0x6BE1: +case 0x6BE2: +case 0x6BE3: +case 0x6BE4: +case 0x6BE5: +case 0x6BE6: +case 0x6BE7: +case 0x6BE8: +case 0x6BE9: +case 0x6BEA: +case 0x6BEB: +case 0x6BEC: +case 0x6BED: +case 0x6BEE: +case 0x6BEF: +case 0x6BF0: +case 0x6BF1: +case 0x6BF2: +case 0x6BF3: +case 0x6BF4: +case 0x6BF5: +case 0x6BF6: +case 0x6BF7: +case 0x6BF8: +case 0x6BF9: +case 0x6BFA: +case 0x6BFB: +case 0x6BFC: +case 0x6BFD: +case 0x6BFE: +case 0x6BFF: + +// BCC +case 0x6B01: +{ + if (CPU->flag_N & 0x80) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6C02: +case 0x6C03: +case 0x6C04: +case 0x6C05: +case 0x6C06: +case 0x6C07: +case 0x6C08: +case 0x6C09: +case 0x6C0A: +case 0x6C0B: +case 0x6C0C: +case 0x6C0D: +case 0x6C0E: +case 0x6C0F: +case 0x6C10: +case 0x6C11: +case 0x6C12: +case 0x6C13: +case 0x6C14: +case 0x6C15: +case 0x6C16: +case 0x6C17: +case 0x6C18: +case 0x6C19: +case 0x6C1A: +case 0x6C1B: +case 0x6C1C: +case 0x6C1D: +case 0x6C1E: +case 0x6C1F: +case 0x6C20: +case 0x6C21: +case 0x6C22: +case 0x6C23: +case 0x6C24: +case 0x6C25: +case 0x6C26: +case 0x6C27: +case 0x6C28: +case 0x6C29: +case 0x6C2A: +case 0x6C2B: +case 0x6C2C: +case 0x6C2D: +case 0x6C2E: +case 0x6C2F: +case 0x6C30: +case 0x6C31: +case 0x6C32: +case 0x6C33: +case 0x6C34: +case 0x6C35: +case 0x6C36: +case 0x6C37: +case 0x6C38: +case 0x6C39: +case 0x6C3A: +case 0x6C3B: +case 0x6C3C: +case 0x6C3D: +case 0x6C3E: +case 0x6C3F: +case 0x6C40: +case 0x6C41: +case 0x6C42: +case 0x6C43: +case 0x6C44: +case 0x6C45: +case 0x6C46: +case 0x6C47: +case 0x6C48: +case 0x6C49: +case 0x6C4A: +case 0x6C4B: +case 0x6C4C: +case 0x6C4D: +case 0x6C4E: +case 0x6C4F: +case 0x6C50: +case 0x6C51: +case 0x6C52: +case 0x6C53: +case 0x6C54: +case 0x6C55: +case 0x6C56: +case 0x6C57: +case 0x6C58: +case 0x6C59: +case 0x6C5A: +case 0x6C5B: +case 0x6C5C: +case 0x6C5D: +case 0x6C5E: +case 0x6C5F: +case 0x6C60: +case 0x6C61: +case 0x6C62: +case 0x6C63: +case 0x6C64: +case 0x6C65: +case 0x6C66: +case 0x6C67: +case 0x6C68: +case 0x6C69: +case 0x6C6A: +case 0x6C6B: +case 0x6C6C: +case 0x6C6D: +case 0x6C6E: +case 0x6C6F: +case 0x6C70: +case 0x6C71: +case 0x6C72: +case 0x6C73: +case 0x6C74: +case 0x6C75: +case 0x6C76: +case 0x6C77: +case 0x6C78: +case 0x6C79: +case 0x6C7A: +case 0x6C7B: +case 0x6C7C: +case 0x6C7D: +case 0x6C7E: +case 0x6C7F: +case 0x6C80: +case 0x6C81: +case 0x6C82: +case 0x6C83: +case 0x6C84: +case 0x6C85: +case 0x6C86: +case 0x6C87: +case 0x6C88: +case 0x6C89: +case 0x6C8A: +case 0x6C8B: +case 0x6C8C: +case 0x6C8D: +case 0x6C8E: +case 0x6C8F: +case 0x6C90: +case 0x6C91: +case 0x6C92: +case 0x6C93: +case 0x6C94: +case 0x6C95: +case 0x6C96: +case 0x6C97: +case 0x6C98: +case 0x6C99: +case 0x6C9A: +case 0x6C9B: +case 0x6C9C: +case 0x6C9D: +case 0x6C9E: +case 0x6C9F: +case 0x6CA0: +case 0x6CA1: +case 0x6CA2: +case 0x6CA3: +case 0x6CA4: +case 0x6CA5: +case 0x6CA6: +case 0x6CA7: +case 0x6CA8: +case 0x6CA9: +case 0x6CAA: +case 0x6CAB: +case 0x6CAC: +case 0x6CAD: +case 0x6CAE: +case 0x6CAF: +case 0x6CB0: +case 0x6CB1: +case 0x6CB2: +case 0x6CB3: +case 0x6CB4: +case 0x6CB5: +case 0x6CB6: +case 0x6CB7: +case 0x6CB8: +case 0x6CB9: +case 0x6CBA: +case 0x6CBB: +case 0x6CBC: +case 0x6CBD: +case 0x6CBE: +case 0x6CBF: +case 0x6CC0: +case 0x6CC1: +case 0x6CC2: +case 0x6CC3: +case 0x6CC4: +case 0x6CC5: +case 0x6CC6: +case 0x6CC7: +case 0x6CC8: +case 0x6CC9: +case 0x6CCA: +case 0x6CCB: +case 0x6CCC: +case 0x6CCD: +case 0x6CCE: +case 0x6CCF: +case 0x6CD0: +case 0x6CD1: +case 0x6CD2: +case 0x6CD3: +case 0x6CD4: +case 0x6CD5: +case 0x6CD6: +case 0x6CD7: +case 0x6CD8: +case 0x6CD9: +case 0x6CDA: +case 0x6CDB: +case 0x6CDC: +case 0x6CDD: +case 0x6CDE: +case 0x6CDF: +case 0x6CE0: +case 0x6CE1: +case 0x6CE2: +case 0x6CE3: +case 0x6CE4: +case 0x6CE5: +case 0x6CE6: +case 0x6CE7: +case 0x6CE8: +case 0x6CE9: +case 0x6CEA: +case 0x6CEB: +case 0x6CEC: +case 0x6CED: +case 0x6CEE: +case 0x6CEF: +case 0x6CF0: +case 0x6CF1: +case 0x6CF2: +case 0x6CF3: +case 0x6CF4: +case 0x6CF5: +case 0x6CF6: +case 0x6CF7: +case 0x6CF8: +case 0x6CF9: +case 0x6CFA: +case 0x6CFB: +case 0x6CFC: +case 0x6CFD: +case 0x6CFE: +case 0x6CFF: + +// BCC +case 0x6C01: +{ + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6D02: +case 0x6D03: +case 0x6D04: +case 0x6D05: +case 0x6D06: +case 0x6D07: +case 0x6D08: +case 0x6D09: +case 0x6D0A: +case 0x6D0B: +case 0x6D0C: +case 0x6D0D: +case 0x6D0E: +case 0x6D0F: +case 0x6D10: +case 0x6D11: +case 0x6D12: +case 0x6D13: +case 0x6D14: +case 0x6D15: +case 0x6D16: +case 0x6D17: +case 0x6D18: +case 0x6D19: +case 0x6D1A: +case 0x6D1B: +case 0x6D1C: +case 0x6D1D: +case 0x6D1E: +case 0x6D1F: +case 0x6D20: +case 0x6D21: +case 0x6D22: +case 0x6D23: +case 0x6D24: +case 0x6D25: +case 0x6D26: +case 0x6D27: +case 0x6D28: +case 0x6D29: +case 0x6D2A: +case 0x6D2B: +case 0x6D2C: +case 0x6D2D: +case 0x6D2E: +case 0x6D2F: +case 0x6D30: +case 0x6D31: +case 0x6D32: +case 0x6D33: +case 0x6D34: +case 0x6D35: +case 0x6D36: +case 0x6D37: +case 0x6D38: +case 0x6D39: +case 0x6D3A: +case 0x6D3B: +case 0x6D3C: +case 0x6D3D: +case 0x6D3E: +case 0x6D3F: +case 0x6D40: +case 0x6D41: +case 0x6D42: +case 0x6D43: +case 0x6D44: +case 0x6D45: +case 0x6D46: +case 0x6D47: +case 0x6D48: +case 0x6D49: +case 0x6D4A: +case 0x6D4B: +case 0x6D4C: +case 0x6D4D: +case 0x6D4E: +case 0x6D4F: +case 0x6D50: +case 0x6D51: +case 0x6D52: +case 0x6D53: +case 0x6D54: +case 0x6D55: +case 0x6D56: +case 0x6D57: +case 0x6D58: +case 0x6D59: +case 0x6D5A: +case 0x6D5B: +case 0x6D5C: +case 0x6D5D: +case 0x6D5E: +case 0x6D5F: +case 0x6D60: +case 0x6D61: +case 0x6D62: +case 0x6D63: +case 0x6D64: +case 0x6D65: +case 0x6D66: +case 0x6D67: +case 0x6D68: +case 0x6D69: +case 0x6D6A: +case 0x6D6B: +case 0x6D6C: +case 0x6D6D: +case 0x6D6E: +case 0x6D6F: +case 0x6D70: +case 0x6D71: +case 0x6D72: +case 0x6D73: +case 0x6D74: +case 0x6D75: +case 0x6D76: +case 0x6D77: +case 0x6D78: +case 0x6D79: +case 0x6D7A: +case 0x6D7B: +case 0x6D7C: +case 0x6D7D: +case 0x6D7E: +case 0x6D7F: +case 0x6D80: +case 0x6D81: +case 0x6D82: +case 0x6D83: +case 0x6D84: +case 0x6D85: +case 0x6D86: +case 0x6D87: +case 0x6D88: +case 0x6D89: +case 0x6D8A: +case 0x6D8B: +case 0x6D8C: +case 0x6D8D: +case 0x6D8E: +case 0x6D8F: +case 0x6D90: +case 0x6D91: +case 0x6D92: +case 0x6D93: +case 0x6D94: +case 0x6D95: +case 0x6D96: +case 0x6D97: +case 0x6D98: +case 0x6D99: +case 0x6D9A: +case 0x6D9B: +case 0x6D9C: +case 0x6D9D: +case 0x6D9E: +case 0x6D9F: +case 0x6DA0: +case 0x6DA1: +case 0x6DA2: +case 0x6DA3: +case 0x6DA4: +case 0x6DA5: +case 0x6DA6: +case 0x6DA7: +case 0x6DA8: +case 0x6DA9: +case 0x6DAA: +case 0x6DAB: +case 0x6DAC: +case 0x6DAD: +case 0x6DAE: +case 0x6DAF: +case 0x6DB0: +case 0x6DB1: +case 0x6DB2: +case 0x6DB3: +case 0x6DB4: +case 0x6DB5: +case 0x6DB6: +case 0x6DB7: +case 0x6DB8: +case 0x6DB9: +case 0x6DBA: +case 0x6DBB: +case 0x6DBC: +case 0x6DBD: +case 0x6DBE: +case 0x6DBF: +case 0x6DC0: +case 0x6DC1: +case 0x6DC2: +case 0x6DC3: +case 0x6DC4: +case 0x6DC5: +case 0x6DC6: +case 0x6DC7: +case 0x6DC8: +case 0x6DC9: +case 0x6DCA: +case 0x6DCB: +case 0x6DCC: +case 0x6DCD: +case 0x6DCE: +case 0x6DCF: +case 0x6DD0: +case 0x6DD1: +case 0x6DD2: +case 0x6DD3: +case 0x6DD4: +case 0x6DD5: +case 0x6DD6: +case 0x6DD7: +case 0x6DD8: +case 0x6DD9: +case 0x6DDA: +case 0x6DDB: +case 0x6DDC: +case 0x6DDD: +case 0x6DDE: +case 0x6DDF: +case 0x6DE0: +case 0x6DE1: +case 0x6DE2: +case 0x6DE3: +case 0x6DE4: +case 0x6DE5: +case 0x6DE6: +case 0x6DE7: +case 0x6DE8: +case 0x6DE9: +case 0x6DEA: +case 0x6DEB: +case 0x6DEC: +case 0x6DED: +case 0x6DEE: +case 0x6DEF: +case 0x6DF0: +case 0x6DF1: +case 0x6DF2: +case 0x6DF3: +case 0x6DF4: +case 0x6DF5: +case 0x6DF6: +case 0x6DF7: +case 0x6DF8: +case 0x6DF9: +case 0x6DFA: +case 0x6DFB: +case 0x6DFC: +case 0x6DFD: +case 0x6DFE: +case 0x6DFF: + +// BCC +case 0x6D01: +{ + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6E02: +case 0x6E03: +case 0x6E04: +case 0x6E05: +case 0x6E06: +case 0x6E07: +case 0x6E08: +case 0x6E09: +case 0x6E0A: +case 0x6E0B: +case 0x6E0C: +case 0x6E0D: +case 0x6E0E: +case 0x6E0F: +case 0x6E10: +case 0x6E11: +case 0x6E12: +case 0x6E13: +case 0x6E14: +case 0x6E15: +case 0x6E16: +case 0x6E17: +case 0x6E18: +case 0x6E19: +case 0x6E1A: +case 0x6E1B: +case 0x6E1C: +case 0x6E1D: +case 0x6E1E: +case 0x6E1F: +case 0x6E20: +case 0x6E21: +case 0x6E22: +case 0x6E23: +case 0x6E24: +case 0x6E25: +case 0x6E26: +case 0x6E27: +case 0x6E28: +case 0x6E29: +case 0x6E2A: +case 0x6E2B: +case 0x6E2C: +case 0x6E2D: +case 0x6E2E: +case 0x6E2F: +case 0x6E30: +case 0x6E31: +case 0x6E32: +case 0x6E33: +case 0x6E34: +case 0x6E35: +case 0x6E36: +case 0x6E37: +case 0x6E38: +case 0x6E39: +case 0x6E3A: +case 0x6E3B: +case 0x6E3C: +case 0x6E3D: +case 0x6E3E: +case 0x6E3F: +case 0x6E40: +case 0x6E41: +case 0x6E42: +case 0x6E43: +case 0x6E44: +case 0x6E45: +case 0x6E46: +case 0x6E47: +case 0x6E48: +case 0x6E49: +case 0x6E4A: +case 0x6E4B: +case 0x6E4C: +case 0x6E4D: +case 0x6E4E: +case 0x6E4F: +case 0x6E50: +case 0x6E51: +case 0x6E52: +case 0x6E53: +case 0x6E54: +case 0x6E55: +case 0x6E56: +case 0x6E57: +case 0x6E58: +case 0x6E59: +case 0x6E5A: +case 0x6E5B: +case 0x6E5C: +case 0x6E5D: +case 0x6E5E: +case 0x6E5F: +case 0x6E60: +case 0x6E61: +case 0x6E62: +case 0x6E63: +case 0x6E64: +case 0x6E65: +case 0x6E66: +case 0x6E67: +case 0x6E68: +case 0x6E69: +case 0x6E6A: +case 0x6E6B: +case 0x6E6C: +case 0x6E6D: +case 0x6E6E: +case 0x6E6F: +case 0x6E70: +case 0x6E71: +case 0x6E72: +case 0x6E73: +case 0x6E74: +case 0x6E75: +case 0x6E76: +case 0x6E77: +case 0x6E78: +case 0x6E79: +case 0x6E7A: +case 0x6E7B: +case 0x6E7C: +case 0x6E7D: +case 0x6E7E: +case 0x6E7F: +case 0x6E80: +case 0x6E81: +case 0x6E82: +case 0x6E83: +case 0x6E84: +case 0x6E85: +case 0x6E86: +case 0x6E87: +case 0x6E88: +case 0x6E89: +case 0x6E8A: +case 0x6E8B: +case 0x6E8C: +case 0x6E8D: +case 0x6E8E: +case 0x6E8F: +case 0x6E90: +case 0x6E91: +case 0x6E92: +case 0x6E93: +case 0x6E94: +case 0x6E95: +case 0x6E96: +case 0x6E97: +case 0x6E98: +case 0x6E99: +case 0x6E9A: +case 0x6E9B: +case 0x6E9C: +case 0x6E9D: +case 0x6E9E: +case 0x6E9F: +case 0x6EA0: +case 0x6EA1: +case 0x6EA2: +case 0x6EA3: +case 0x6EA4: +case 0x6EA5: +case 0x6EA6: +case 0x6EA7: +case 0x6EA8: +case 0x6EA9: +case 0x6EAA: +case 0x6EAB: +case 0x6EAC: +case 0x6EAD: +case 0x6EAE: +case 0x6EAF: +case 0x6EB0: +case 0x6EB1: +case 0x6EB2: +case 0x6EB3: +case 0x6EB4: +case 0x6EB5: +case 0x6EB6: +case 0x6EB7: +case 0x6EB8: +case 0x6EB9: +case 0x6EBA: +case 0x6EBB: +case 0x6EBC: +case 0x6EBD: +case 0x6EBE: +case 0x6EBF: +case 0x6EC0: +case 0x6EC1: +case 0x6EC2: +case 0x6EC3: +case 0x6EC4: +case 0x6EC5: +case 0x6EC6: +case 0x6EC7: +case 0x6EC8: +case 0x6EC9: +case 0x6ECA: +case 0x6ECB: +case 0x6ECC: +case 0x6ECD: +case 0x6ECE: +case 0x6ECF: +case 0x6ED0: +case 0x6ED1: +case 0x6ED2: +case 0x6ED3: +case 0x6ED4: +case 0x6ED5: +case 0x6ED6: +case 0x6ED7: +case 0x6ED8: +case 0x6ED9: +case 0x6EDA: +case 0x6EDB: +case 0x6EDC: +case 0x6EDD: +case 0x6EDE: +case 0x6EDF: +case 0x6EE0: +case 0x6EE1: +case 0x6EE2: +case 0x6EE3: +case 0x6EE4: +case 0x6EE5: +case 0x6EE6: +case 0x6EE7: +case 0x6EE8: +case 0x6EE9: +case 0x6EEA: +case 0x6EEB: +case 0x6EEC: +case 0x6EED: +case 0x6EEE: +case 0x6EEF: +case 0x6EF0: +case 0x6EF1: +case 0x6EF2: +case 0x6EF3: +case 0x6EF4: +case 0x6EF5: +case 0x6EF6: +case 0x6EF7: +case 0x6EF8: +case 0x6EF9: +case 0x6EFA: +case 0x6EFB: +case 0x6EFC: +case 0x6EFD: +case 0x6EFE: +case 0x6EFF: + +// BCC +case 0x6E01: +{ + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) +case 0x6F02: +case 0x6F03: +case 0x6F04: +case 0x6F05: +case 0x6F06: +case 0x6F07: +case 0x6F08: +case 0x6F09: +case 0x6F0A: +case 0x6F0B: +case 0x6F0C: +case 0x6F0D: +case 0x6F0E: +case 0x6F0F: +case 0x6F10: +case 0x6F11: +case 0x6F12: +case 0x6F13: +case 0x6F14: +case 0x6F15: +case 0x6F16: +case 0x6F17: +case 0x6F18: +case 0x6F19: +case 0x6F1A: +case 0x6F1B: +case 0x6F1C: +case 0x6F1D: +case 0x6F1E: +case 0x6F1F: +case 0x6F20: +case 0x6F21: +case 0x6F22: +case 0x6F23: +case 0x6F24: +case 0x6F25: +case 0x6F26: +case 0x6F27: +case 0x6F28: +case 0x6F29: +case 0x6F2A: +case 0x6F2B: +case 0x6F2C: +case 0x6F2D: +case 0x6F2E: +case 0x6F2F: +case 0x6F30: +case 0x6F31: +case 0x6F32: +case 0x6F33: +case 0x6F34: +case 0x6F35: +case 0x6F36: +case 0x6F37: +case 0x6F38: +case 0x6F39: +case 0x6F3A: +case 0x6F3B: +case 0x6F3C: +case 0x6F3D: +case 0x6F3E: +case 0x6F3F: +case 0x6F40: +case 0x6F41: +case 0x6F42: +case 0x6F43: +case 0x6F44: +case 0x6F45: +case 0x6F46: +case 0x6F47: +case 0x6F48: +case 0x6F49: +case 0x6F4A: +case 0x6F4B: +case 0x6F4C: +case 0x6F4D: +case 0x6F4E: +case 0x6F4F: +case 0x6F50: +case 0x6F51: +case 0x6F52: +case 0x6F53: +case 0x6F54: +case 0x6F55: +case 0x6F56: +case 0x6F57: +case 0x6F58: +case 0x6F59: +case 0x6F5A: +case 0x6F5B: +case 0x6F5C: +case 0x6F5D: +case 0x6F5E: +case 0x6F5F: +case 0x6F60: +case 0x6F61: +case 0x6F62: +case 0x6F63: +case 0x6F64: +case 0x6F65: +case 0x6F66: +case 0x6F67: +case 0x6F68: +case 0x6F69: +case 0x6F6A: +case 0x6F6B: +case 0x6F6C: +case 0x6F6D: +case 0x6F6E: +case 0x6F6F: +case 0x6F70: +case 0x6F71: +case 0x6F72: +case 0x6F73: +case 0x6F74: +case 0x6F75: +case 0x6F76: +case 0x6F77: +case 0x6F78: +case 0x6F79: +case 0x6F7A: +case 0x6F7B: +case 0x6F7C: +case 0x6F7D: +case 0x6F7E: +case 0x6F7F: +case 0x6F80: +case 0x6F81: +case 0x6F82: +case 0x6F83: +case 0x6F84: +case 0x6F85: +case 0x6F86: +case 0x6F87: +case 0x6F88: +case 0x6F89: +case 0x6F8A: +case 0x6F8B: +case 0x6F8C: +case 0x6F8D: +case 0x6F8E: +case 0x6F8F: +case 0x6F90: +case 0x6F91: +case 0x6F92: +case 0x6F93: +case 0x6F94: +case 0x6F95: +case 0x6F96: +case 0x6F97: +case 0x6F98: +case 0x6F99: +case 0x6F9A: +case 0x6F9B: +case 0x6F9C: +case 0x6F9D: +case 0x6F9E: +case 0x6F9F: +case 0x6FA0: +case 0x6FA1: +case 0x6FA2: +case 0x6FA3: +case 0x6FA4: +case 0x6FA5: +case 0x6FA6: +case 0x6FA7: +case 0x6FA8: +case 0x6FA9: +case 0x6FAA: +case 0x6FAB: +case 0x6FAC: +case 0x6FAD: +case 0x6FAE: +case 0x6FAF: +case 0x6FB0: +case 0x6FB1: +case 0x6FB2: +case 0x6FB3: +case 0x6FB4: +case 0x6FB5: +case 0x6FB6: +case 0x6FB7: +case 0x6FB8: +case 0x6FB9: +case 0x6FBA: +case 0x6FBB: +case 0x6FBC: +case 0x6FBD: +case 0x6FBE: +case 0x6FBF: +case 0x6FC0: +case 0x6FC1: +case 0x6FC2: +case 0x6FC3: +case 0x6FC4: +case 0x6FC5: +case 0x6FC6: +case 0x6FC7: +case 0x6FC8: +case 0x6FC9: +case 0x6FCA: +case 0x6FCB: +case 0x6FCC: +case 0x6FCD: +case 0x6FCE: +case 0x6FCF: +case 0x6FD0: +case 0x6FD1: +case 0x6FD2: +case 0x6FD3: +case 0x6FD4: +case 0x6FD5: +case 0x6FD6: +case 0x6FD7: +case 0x6FD8: +case 0x6FD9: +case 0x6FDA: +case 0x6FDB: +case 0x6FDC: +case 0x6FDD: +case 0x6FDE: +case 0x6FDF: +case 0x6FE0: +case 0x6FE1: +case 0x6FE2: +case 0x6FE3: +case 0x6FE4: +case 0x6FE5: +case 0x6FE6: +case 0x6FE7: +case 0x6FE8: +case 0x6FE9: +case 0x6FEA: +case 0x6FEB: +case 0x6FEC: +case 0x6FED: +case 0x6FEE: +case 0x6FEF: +case 0x6FF0: +case 0x6FF1: +case 0x6FF2: +case 0x6FF3: +case 0x6FF4: +case 0x6FF5: +case 0x6FF6: +case 0x6FF7: +case 0x6FF8: +case 0x6FF9: +case 0x6FFA: +case 0x6FFB: +case 0x6FFC: +case 0x6FFD: +case 0x6FFE: +case 0x6FFF: + +// BCC +case 0x6F01: +{ + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + PC += (s32)(s8)Opcode; + timestamp += 2; + } +} +RET(8) + +// BCC16 +case 0x6200: +{ + if (CPU->flag_notZ && (!(CPU->flag_C & 0x100))) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6300: +{ + if ((!CPU->flag_notZ) || (CPU->flag_C & 0x100)) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6400: +{ + if (!(CPU->flag_C & 0x100)) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6500: +{ + if (CPU->flag_C & 0x100) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6600: +{ + if (CPU->flag_notZ) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6700: +{ + if (!CPU->flag_notZ) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6800: +{ + if (!(CPU->flag_V & 0x80)) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6900: +{ + if (CPU->flag_V & 0x80) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6A00: +{ + if (!(CPU->flag_N & 0x80)) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6B00: +{ + if (CPU->flag_N & 0x80) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6C00: +{ + if (!((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6D00: +{ + if ((CPU->flag_N ^ CPU->flag_V) & 0x80) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6E00: +{ + if (CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80))) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) + +// BCC16 +case 0x6F00: +{ + if ((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80)) + { + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); + RET(10) + } + PC += 2; +} +RET(12) +case 0x6002: +case 0x6003: +case 0x6004: +case 0x6005: +case 0x6006: +case 0x6007: +case 0x6008: +case 0x6009: +case 0x600A: +case 0x600B: +case 0x600C: +case 0x600D: +case 0x600E: +case 0x600F: +case 0x6010: +case 0x6011: +case 0x6012: +case 0x6013: +case 0x6014: +case 0x6015: +case 0x6016: +case 0x6017: +case 0x6018: +case 0x6019: +case 0x601A: +case 0x601B: +case 0x601C: +case 0x601D: +case 0x601E: +case 0x601F: +case 0x6020: +case 0x6021: +case 0x6022: +case 0x6023: +case 0x6024: +case 0x6025: +case 0x6026: +case 0x6027: +case 0x6028: +case 0x6029: +case 0x602A: +case 0x602B: +case 0x602C: +case 0x602D: +case 0x602E: +case 0x602F: +case 0x6030: +case 0x6031: +case 0x6032: +case 0x6033: +case 0x6034: +case 0x6035: +case 0x6036: +case 0x6037: +case 0x6038: +case 0x6039: +case 0x603A: +case 0x603B: +case 0x603C: +case 0x603D: +case 0x603E: +case 0x603F: +case 0x6040: +case 0x6041: +case 0x6042: +case 0x6043: +case 0x6044: +case 0x6045: +case 0x6046: +case 0x6047: +case 0x6048: +case 0x6049: +case 0x604A: +case 0x604B: +case 0x604C: +case 0x604D: +case 0x604E: +case 0x604F: +case 0x6050: +case 0x6051: +case 0x6052: +case 0x6053: +case 0x6054: +case 0x6055: +case 0x6056: +case 0x6057: +case 0x6058: +case 0x6059: +case 0x605A: +case 0x605B: +case 0x605C: +case 0x605D: +case 0x605E: +case 0x605F: +case 0x6060: +case 0x6061: +case 0x6062: +case 0x6063: +case 0x6064: +case 0x6065: +case 0x6066: +case 0x6067: +case 0x6068: +case 0x6069: +case 0x606A: +case 0x606B: +case 0x606C: +case 0x606D: +case 0x606E: +case 0x606F: +case 0x6070: +case 0x6071: +case 0x6072: +case 0x6073: +case 0x6074: +case 0x6075: +case 0x6076: +case 0x6077: +case 0x6078: +case 0x6079: +case 0x607A: +case 0x607B: +case 0x607C: +case 0x607D: +case 0x607E: +case 0x607F: +case 0x6080: +case 0x6081: +case 0x6082: +case 0x6083: +case 0x6084: +case 0x6085: +case 0x6086: +case 0x6087: +case 0x6088: +case 0x6089: +case 0x608A: +case 0x608B: +case 0x608C: +case 0x608D: +case 0x608E: +case 0x608F: +case 0x6090: +case 0x6091: +case 0x6092: +case 0x6093: +case 0x6094: +case 0x6095: +case 0x6096: +case 0x6097: +case 0x6098: +case 0x6099: +case 0x609A: +case 0x609B: +case 0x609C: +case 0x609D: +case 0x609E: +case 0x609F: +case 0x60A0: +case 0x60A1: +case 0x60A2: +case 0x60A3: +case 0x60A4: +case 0x60A5: +case 0x60A6: +case 0x60A7: +case 0x60A8: +case 0x60A9: +case 0x60AA: +case 0x60AB: +case 0x60AC: +case 0x60AD: +case 0x60AE: +case 0x60AF: +case 0x60B0: +case 0x60B1: +case 0x60B2: +case 0x60B3: +case 0x60B4: +case 0x60B5: +case 0x60B6: +case 0x60B7: +case 0x60B8: +case 0x60B9: +case 0x60BA: +case 0x60BB: +case 0x60BC: +case 0x60BD: +case 0x60BE: +case 0x60BF: +case 0x60C0: +case 0x60C1: +case 0x60C2: +case 0x60C3: +case 0x60C4: +case 0x60C5: +case 0x60C6: +case 0x60C7: +case 0x60C8: +case 0x60C9: +case 0x60CA: +case 0x60CB: +case 0x60CC: +case 0x60CD: +case 0x60CE: +case 0x60CF: +case 0x60D0: +case 0x60D1: +case 0x60D2: +case 0x60D3: +case 0x60D4: +case 0x60D5: +case 0x60D6: +case 0x60D7: +case 0x60D8: +case 0x60D9: +case 0x60DA: +case 0x60DB: +case 0x60DC: +case 0x60DD: +case 0x60DE: +case 0x60DF: +case 0x60E0: +case 0x60E1: +case 0x60E2: +case 0x60E3: +case 0x60E4: +case 0x60E5: +case 0x60E6: +case 0x60E7: +case 0x60E8: +case 0x60E9: +case 0x60EA: +case 0x60EB: +case 0x60EC: +case 0x60ED: +case 0x60EE: +case 0x60EF: +case 0x60F0: +case 0x60F1: +case 0x60F2: +case 0x60F3: +case 0x60F4: +case 0x60F5: +case 0x60F6: +case 0x60F7: +case 0x60F8: +case 0x60F9: +case 0x60FA: +case 0x60FB: +case 0x60FC: +case 0x60FD: +case 0x60FE: +case 0x60FF: + +// BRA +case 0x6001: +{ + PC += (s32)(s8)Opcode; +} +RET(10) + +// BRA16 +case 0x6000: +{ + PC += (s32)(s16)FETCH_WORD; + SET_PC(PC); +} +RET(10) +case 0x6102: +case 0x6103: +case 0x6104: +case 0x6105: +case 0x6106: +case 0x6107: +case 0x6108: +case 0x6109: +case 0x610A: +case 0x610B: +case 0x610C: +case 0x610D: +case 0x610E: +case 0x610F: +case 0x6110: +case 0x6111: +case 0x6112: +case 0x6113: +case 0x6114: +case 0x6115: +case 0x6116: +case 0x6117: +case 0x6118: +case 0x6119: +case 0x611A: +case 0x611B: +case 0x611C: +case 0x611D: +case 0x611E: +case 0x611F: +case 0x6120: +case 0x6121: +case 0x6122: +case 0x6123: +case 0x6124: +case 0x6125: +case 0x6126: +case 0x6127: +case 0x6128: +case 0x6129: +case 0x612A: +case 0x612B: +case 0x612C: +case 0x612D: +case 0x612E: +case 0x612F: +case 0x6130: +case 0x6131: +case 0x6132: +case 0x6133: +case 0x6134: +case 0x6135: +case 0x6136: +case 0x6137: +case 0x6138: +case 0x6139: +case 0x613A: +case 0x613B: +case 0x613C: +case 0x613D: +case 0x613E: +case 0x613F: +case 0x6140: +case 0x6141: +case 0x6142: +case 0x6143: +case 0x6144: +case 0x6145: +case 0x6146: +case 0x6147: +case 0x6148: +case 0x6149: +case 0x614A: +case 0x614B: +case 0x614C: +case 0x614D: +case 0x614E: +case 0x614F: +case 0x6150: +case 0x6151: +case 0x6152: +case 0x6153: +case 0x6154: +case 0x6155: +case 0x6156: +case 0x6157: +case 0x6158: +case 0x6159: +case 0x615A: +case 0x615B: +case 0x615C: +case 0x615D: +case 0x615E: +case 0x615F: +case 0x6160: +case 0x6161: +case 0x6162: +case 0x6163: +case 0x6164: +case 0x6165: +case 0x6166: +case 0x6167: +case 0x6168: +case 0x6169: +case 0x616A: +case 0x616B: +case 0x616C: +case 0x616D: +case 0x616E: +case 0x616F: +case 0x6170: +case 0x6171: +case 0x6172: +case 0x6173: +case 0x6174: +case 0x6175: +case 0x6176: +case 0x6177: +case 0x6178: +case 0x6179: +case 0x617A: +case 0x617B: +case 0x617C: +case 0x617D: +case 0x617E: +case 0x617F: +case 0x6180: +case 0x6181: +case 0x6182: +case 0x6183: +case 0x6184: +case 0x6185: +case 0x6186: +case 0x6187: +case 0x6188: +case 0x6189: +case 0x618A: +case 0x618B: +case 0x618C: +case 0x618D: +case 0x618E: +case 0x618F: +case 0x6190: +case 0x6191: +case 0x6192: +case 0x6193: +case 0x6194: +case 0x6195: +case 0x6196: +case 0x6197: +case 0x6198: +case 0x6199: +case 0x619A: +case 0x619B: +case 0x619C: +case 0x619D: +case 0x619E: +case 0x619F: +case 0x61A0: +case 0x61A1: +case 0x61A2: +case 0x61A3: +case 0x61A4: +case 0x61A5: +case 0x61A6: +case 0x61A7: +case 0x61A8: +case 0x61A9: +case 0x61AA: +case 0x61AB: +case 0x61AC: +case 0x61AD: +case 0x61AE: +case 0x61AF: +case 0x61B0: +case 0x61B1: +case 0x61B2: +case 0x61B3: +case 0x61B4: +case 0x61B5: +case 0x61B6: +case 0x61B7: +case 0x61B8: +case 0x61B9: +case 0x61BA: +case 0x61BB: +case 0x61BC: +case 0x61BD: +case 0x61BE: +case 0x61BF: +case 0x61C0: +case 0x61C1: +case 0x61C2: +case 0x61C3: +case 0x61C4: +case 0x61C5: +case 0x61C6: +case 0x61C7: +case 0x61C8: +case 0x61C9: +case 0x61CA: +case 0x61CB: +case 0x61CC: +case 0x61CD: +case 0x61CE: +case 0x61CF: +case 0x61D0: +case 0x61D1: +case 0x61D2: +case 0x61D3: +case 0x61D4: +case 0x61D5: +case 0x61D6: +case 0x61D7: +case 0x61D8: +case 0x61D9: +case 0x61DA: +case 0x61DB: +case 0x61DC: +case 0x61DD: +case 0x61DE: +case 0x61DF: +case 0x61E0: +case 0x61E1: +case 0x61E2: +case 0x61E3: +case 0x61E4: +case 0x61E5: +case 0x61E6: +case 0x61E7: +case 0x61E8: +case 0x61E9: +case 0x61EA: +case 0x61EB: +case 0x61EC: +case 0x61ED: +case 0x61EE: +case 0x61EF: +case 0x61F0: +case 0x61F1: +case 0x61F2: +case 0x61F3: +case 0x61F4: +case 0x61F5: +case 0x61F6: +case 0x61F7: +case 0x61F8: +case 0x61F9: +case 0x61FA: +case 0x61FB: +case 0x61FC: +case 0x61FD: +case 0x61FE: +case 0x61FF: + +// BSR +case 0x6101: +{ + PUSH_32_F(PC) + PC += (s32)(s8)Opcode; +} +RET(18) + +// BSR16 +case 0x6100: +{ + u32 res; + res = (s32)(s16)FETCH_WORD; + PUSH_32_F(PC + 2) + PC += (s32) res; + SET_PC(PC); +} +RET(18) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op7.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op7.inc new file mode 100644 index 0000000000..e572f6288f --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op7.inc @@ -0,0 +1,2058 @@ +case 0x7001: +case 0x7002: +case 0x7003: +case 0x7004: +case 0x7005: +case 0x7006: +case 0x7007: +case 0x7008: +case 0x7009: +case 0x700A: +case 0x700B: +case 0x700C: +case 0x700D: +case 0x700E: +case 0x700F: +case 0x7010: +case 0x7011: +case 0x7012: +case 0x7013: +case 0x7014: +case 0x7015: +case 0x7016: +case 0x7017: +case 0x7018: +case 0x7019: +case 0x701A: +case 0x701B: +case 0x701C: +case 0x701D: +case 0x701E: +case 0x701F: +case 0x7020: +case 0x7021: +case 0x7022: +case 0x7023: +case 0x7024: +case 0x7025: +case 0x7026: +case 0x7027: +case 0x7028: +case 0x7029: +case 0x702A: +case 0x702B: +case 0x702C: +case 0x702D: +case 0x702E: +case 0x702F: +case 0x7030: +case 0x7031: +case 0x7032: +case 0x7033: +case 0x7034: +case 0x7035: +case 0x7036: +case 0x7037: +case 0x7038: +case 0x7039: +case 0x703A: +case 0x703B: +case 0x703C: +case 0x703D: +case 0x703E: +case 0x703F: +case 0x7040: +case 0x7041: +case 0x7042: +case 0x7043: +case 0x7044: +case 0x7045: +case 0x7046: +case 0x7047: +case 0x7048: +case 0x7049: +case 0x704A: +case 0x704B: +case 0x704C: +case 0x704D: +case 0x704E: +case 0x704F: +case 0x7050: +case 0x7051: +case 0x7052: +case 0x7053: +case 0x7054: +case 0x7055: +case 0x7056: +case 0x7057: +case 0x7058: +case 0x7059: +case 0x705A: +case 0x705B: +case 0x705C: +case 0x705D: +case 0x705E: +case 0x705F: +case 0x7060: +case 0x7061: +case 0x7062: +case 0x7063: +case 0x7064: +case 0x7065: +case 0x7066: +case 0x7067: +case 0x7068: +case 0x7069: +case 0x706A: +case 0x706B: +case 0x706C: +case 0x706D: +case 0x706E: +case 0x706F: +case 0x7070: +case 0x7071: +case 0x7072: +case 0x7073: +case 0x7074: +case 0x7075: +case 0x7076: +case 0x7077: +case 0x7078: +case 0x7079: +case 0x707A: +case 0x707B: +case 0x707C: +case 0x707D: +case 0x707E: +case 0x707F: +case 0x7080: +case 0x7081: +case 0x7082: +case 0x7083: +case 0x7084: +case 0x7085: +case 0x7086: +case 0x7087: +case 0x7088: +case 0x7089: +case 0x708A: +case 0x708B: +case 0x708C: +case 0x708D: +case 0x708E: +case 0x708F: +case 0x7090: +case 0x7091: +case 0x7092: +case 0x7093: +case 0x7094: +case 0x7095: +case 0x7096: +case 0x7097: +case 0x7098: +case 0x7099: +case 0x709A: +case 0x709B: +case 0x709C: +case 0x709D: +case 0x709E: +case 0x709F: +case 0x70A0: +case 0x70A1: +case 0x70A2: +case 0x70A3: +case 0x70A4: +case 0x70A5: +case 0x70A6: +case 0x70A7: +case 0x70A8: +case 0x70A9: +case 0x70AA: +case 0x70AB: +case 0x70AC: +case 0x70AD: +case 0x70AE: +case 0x70AF: +case 0x70B0: +case 0x70B1: +case 0x70B2: +case 0x70B3: +case 0x70B4: +case 0x70B5: +case 0x70B6: +case 0x70B7: +case 0x70B8: +case 0x70B9: +case 0x70BA: +case 0x70BB: +case 0x70BC: +case 0x70BD: +case 0x70BE: +case 0x70BF: +case 0x70C0: +case 0x70C1: +case 0x70C2: +case 0x70C3: +case 0x70C4: +case 0x70C5: +case 0x70C6: +case 0x70C7: +case 0x70C8: +case 0x70C9: +case 0x70CA: +case 0x70CB: +case 0x70CC: +case 0x70CD: +case 0x70CE: +case 0x70CF: +case 0x70D0: +case 0x70D1: +case 0x70D2: +case 0x70D3: +case 0x70D4: +case 0x70D5: +case 0x70D6: +case 0x70D7: +case 0x70D8: +case 0x70D9: +case 0x70DA: +case 0x70DB: +case 0x70DC: +case 0x70DD: +case 0x70DE: +case 0x70DF: +case 0x70E0: +case 0x70E1: +case 0x70E2: +case 0x70E3: +case 0x70E4: +case 0x70E5: +case 0x70E6: +case 0x70E7: +case 0x70E8: +case 0x70E9: +case 0x70EA: +case 0x70EB: +case 0x70EC: +case 0x70ED: +case 0x70EE: +case 0x70EF: +case 0x70F0: +case 0x70F1: +case 0x70F2: +case 0x70F3: +case 0x70F4: +case 0x70F5: +case 0x70F6: +case 0x70F7: +case 0x70F8: +case 0x70F9: +case 0x70FA: +case 0x70FB: +case 0x70FC: +case 0x70FD: +case 0x70FE: +case 0x70FF: +case 0x7200: +case 0x7201: +case 0x7202: +case 0x7203: +case 0x7204: +case 0x7205: +case 0x7206: +case 0x7207: +case 0x7208: +case 0x7209: +case 0x720A: +case 0x720B: +case 0x720C: +case 0x720D: +case 0x720E: +case 0x720F: +case 0x7210: +case 0x7211: +case 0x7212: +case 0x7213: +case 0x7214: +case 0x7215: +case 0x7216: +case 0x7217: +case 0x7218: +case 0x7219: +case 0x721A: +case 0x721B: +case 0x721C: +case 0x721D: +case 0x721E: +case 0x721F: +case 0x7220: +case 0x7221: +case 0x7222: +case 0x7223: +case 0x7224: +case 0x7225: +case 0x7226: +case 0x7227: +case 0x7228: +case 0x7229: +case 0x722A: +case 0x722B: +case 0x722C: +case 0x722D: +case 0x722E: +case 0x722F: +case 0x7230: +case 0x7231: +case 0x7232: +case 0x7233: +case 0x7234: +case 0x7235: +case 0x7236: +case 0x7237: +case 0x7238: +case 0x7239: +case 0x723A: +case 0x723B: +case 0x723C: +case 0x723D: +case 0x723E: +case 0x723F: +case 0x7240: +case 0x7241: +case 0x7242: +case 0x7243: +case 0x7244: +case 0x7245: +case 0x7246: +case 0x7247: +case 0x7248: +case 0x7249: +case 0x724A: +case 0x724B: +case 0x724C: +case 0x724D: +case 0x724E: +case 0x724F: +case 0x7250: +case 0x7251: +case 0x7252: +case 0x7253: +case 0x7254: +case 0x7255: +case 0x7256: +case 0x7257: +case 0x7258: +case 0x7259: +case 0x725A: +case 0x725B: +case 0x725C: +case 0x725D: +case 0x725E: +case 0x725F: +case 0x7260: +case 0x7261: +case 0x7262: +case 0x7263: +case 0x7264: +case 0x7265: +case 0x7266: +case 0x7267: +case 0x7268: +case 0x7269: +case 0x726A: +case 0x726B: +case 0x726C: +case 0x726D: +case 0x726E: +case 0x726F: +case 0x7270: +case 0x7271: +case 0x7272: +case 0x7273: +case 0x7274: +case 0x7275: +case 0x7276: +case 0x7277: +case 0x7278: +case 0x7279: +case 0x727A: +case 0x727B: +case 0x727C: +case 0x727D: +case 0x727E: +case 0x727F: +case 0x7280: +case 0x7281: +case 0x7282: +case 0x7283: +case 0x7284: +case 0x7285: +case 0x7286: +case 0x7287: +case 0x7288: +case 0x7289: +case 0x728A: +case 0x728B: +case 0x728C: +case 0x728D: +case 0x728E: +case 0x728F: +case 0x7290: +case 0x7291: +case 0x7292: +case 0x7293: +case 0x7294: +case 0x7295: +case 0x7296: +case 0x7297: +case 0x7298: +case 0x7299: +case 0x729A: +case 0x729B: +case 0x729C: +case 0x729D: +case 0x729E: +case 0x729F: +case 0x72A0: +case 0x72A1: +case 0x72A2: +case 0x72A3: +case 0x72A4: +case 0x72A5: +case 0x72A6: +case 0x72A7: +case 0x72A8: +case 0x72A9: +case 0x72AA: +case 0x72AB: +case 0x72AC: +case 0x72AD: +case 0x72AE: +case 0x72AF: +case 0x72B0: +case 0x72B1: +case 0x72B2: +case 0x72B3: +case 0x72B4: +case 0x72B5: +case 0x72B6: +case 0x72B7: +case 0x72B8: +case 0x72B9: +case 0x72BA: +case 0x72BB: +case 0x72BC: +case 0x72BD: +case 0x72BE: +case 0x72BF: +case 0x72C0: +case 0x72C1: +case 0x72C2: +case 0x72C3: +case 0x72C4: +case 0x72C5: +case 0x72C6: +case 0x72C7: +case 0x72C8: +case 0x72C9: +case 0x72CA: +case 0x72CB: +case 0x72CC: +case 0x72CD: +case 0x72CE: +case 0x72CF: +case 0x72D0: +case 0x72D1: +case 0x72D2: +case 0x72D3: +case 0x72D4: +case 0x72D5: +case 0x72D6: +case 0x72D7: +case 0x72D8: +case 0x72D9: +case 0x72DA: +case 0x72DB: +case 0x72DC: +case 0x72DD: +case 0x72DE: +case 0x72DF: +case 0x72E0: +case 0x72E1: +case 0x72E2: +case 0x72E3: +case 0x72E4: +case 0x72E5: +case 0x72E6: +case 0x72E7: +case 0x72E8: +case 0x72E9: +case 0x72EA: +case 0x72EB: +case 0x72EC: +case 0x72ED: +case 0x72EE: +case 0x72EF: +case 0x72F0: +case 0x72F1: +case 0x72F2: +case 0x72F3: +case 0x72F4: +case 0x72F5: +case 0x72F6: +case 0x72F7: +case 0x72F8: +case 0x72F9: +case 0x72FA: +case 0x72FB: +case 0x72FC: +case 0x72FD: +case 0x72FE: +case 0x72FF: +case 0x7400: +case 0x7401: +case 0x7402: +case 0x7403: +case 0x7404: +case 0x7405: +case 0x7406: +case 0x7407: +case 0x7408: +case 0x7409: +case 0x740A: +case 0x740B: +case 0x740C: +case 0x740D: +case 0x740E: +case 0x740F: +case 0x7410: +case 0x7411: +case 0x7412: +case 0x7413: +case 0x7414: +case 0x7415: +case 0x7416: +case 0x7417: +case 0x7418: +case 0x7419: +case 0x741A: +case 0x741B: +case 0x741C: +case 0x741D: +case 0x741E: +case 0x741F: +case 0x7420: +case 0x7421: +case 0x7422: +case 0x7423: +case 0x7424: +case 0x7425: +case 0x7426: +case 0x7427: +case 0x7428: +case 0x7429: +case 0x742A: +case 0x742B: +case 0x742C: +case 0x742D: +case 0x742E: +case 0x742F: +case 0x7430: +case 0x7431: +case 0x7432: +case 0x7433: +case 0x7434: +case 0x7435: +case 0x7436: +case 0x7437: +case 0x7438: +case 0x7439: +case 0x743A: +case 0x743B: +case 0x743C: +case 0x743D: +case 0x743E: +case 0x743F: +case 0x7440: +case 0x7441: +case 0x7442: +case 0x7443: +case 0x7444: +case 0x7445: +case 0x7446: +case 0x7447: +case 0x7448: +case 0x7449: +case 0x744A: +case 0x744B: +case 0x744C: +case 0x744D: +case 0x744E: +case 0x744F: +case 0x7450: +case 0x7451: +case 0x7452: +case 0x7453: +case 0x7454: +case 0x7455: +case 0x7456: +case 0x7457: +case 0x7458: +case 0x7459: +case 0x745A: +case 0x745B: +case 0x745C: +case 0x745D: +case 0x745E: +case 0x745F: +case 0x7460: +case 0x7461: +case 0x7462: +case 0x7463: +case 0x7464: +case 0x7465: +case 0x7466: +case 0x7467: +case 0x7468: +case 0x7469: +case 0x746A: +case 0x746B: +case 0x746C: +case 0x746D: +case 0x746E: +case 0x746F: +case 0x7470: +case 0x7471: +case 0x7472: +case 0x7473: +case 0x7474: +case 0x7475: +case 0x7476: +case 0x7477: +case 0x7478: +case 0x7479: +case 0x747A: +case 0x747B: +case 0x747C: +case 0x747D: +case 0x747E: +case 0x747F: +case 0x7480: +case 0x7481: +case 0x7482: +case 0x7483: +case 0x7484: +case 0x7485: +case 0x7486: +case 0x7487: +case 0x7488: +case 0x7489: +case 0x748A: +case 0x748B: +case 0x748C: +case 0x748D: +case 0x748E: +case 0x748F: +case 0x7490: +case 0x7491: +case 0x7492: +case 0x7493: +case 0x7494: +case 0x7495: +case 0x7496: +case 0x7497: +case 0x7498: +case 0x7499: +case 0x749A: +case 0x749B: +case 0x749C: +case 0x749D: +case 0x749E: +case 0x749F: +case 0x74A0: +case 0x74A1: +case 0x74A2: +case 0x74A3: +case 0x74A4: +case 0x74A5: +case 0x74A6: +case 0x74A7: +case 0x74A8: +case 0x74A9: +case 0x74AA: +case 0x74AB: +case 0x74AC: +case 0x74AD: +case 0x74AE: +case 0x74AF: +case 0x74B0: +case 0x74B1: +case 0x74B2: +case 0x74B3: +case 0x74B4: +case 0x74B5: +case 0x74B6: +case 0x74B7: +case 0x74B8: +case 0x74B9: +case 0x74BA: +case 0x74BB: +case 0x74BC: +case 0x74BD: +case 0x74BE: +case 0x74BF: +case 0x74C0: +case 0x74C1: +case 0x74C2: +case 0x74C3: +case 0x74C4: +case 0x74C5: +case 0x74C6: +case 0x74C7: +case 0x74C8: +case 0x74C9: +case 0x74CA: +case 0x74CB: +case 0x74CC: +case 0x74CD: +case 0x74CE: +case 0x74CF: +case 0x74D0: +case 0x74D1: +case 0x74D2: +case 0x74D3: +case 0x74D4: +case 0x74D5: +case 0x74D6: +case 0x74D7: +case 0x74D8: +case 0x74D9: +case 0x74DA: +case 0x74DB: +case 0x74DC: +case 0x74DD: +case 0x74DE: +case 0x74DF: +case 0x74E0: +case 0x74E1: +case 0x74E2: +case 0x74E3: +case 0x74E4: +case 0x74E5: +case 0x74E6: +case 0x74E7: +case 0x74E8: +case 0x74E9: +case 0x74EA: +case 0x74EB: +case 0x74EC: +case 0x74ED: +case 0x74EE: +case 0x74EF: +case 0x74F0: +case 0x74F1: +case 0x74F2: +case 0x74F3: +case 0x74F4: +case 0x74F5: +case 0x74F6: +case 0x74F7: +case 0x74F8: +case 0x74F9: +case 0x74FA: +case 0x74FB: +case 0x74FC: +case 0x74FD: +case 0x74FE: +case 0x74FF: +case 0x7600: +case 0x7601: +case 0x7602: +case 0x7603: +case 0x7604: +case 0x7605: +case 0x7606: +case 0x7607: +case 0x7608: +case 0x7609: +case 0x760A: +case 0x760B: +case 0x760C: +case 0x760D: +case 0x760E: +case 0x760F: +case 0x7610: +case 0x7611: +case 0x7612: +case 0x7613: +case 0x7614: +case 0x7615: +case 0x7616: +case 0x7617: +case 0x7618: +case 0x7619: +case 0x761A: +case 0x761B: +case 0x761C: +case 0x761D: +case 0x761E: +case 0x761F: +case 0x7620: +case 0x7621: +case 0x7622: +case 0x7623: +case 0x7624: +case 0x7625: +case 0x7626: +case 0x7627: +case 0x7628: +case 0x7629: +case 0x762A: +case 0x762B: +case 0x762C: +case 0x762D: +case 0x762E: +case 0x762F: +case 0x7630: +case 0x7631: +case 0x7632: +case 0x7633: +case 0x7634: +case 0x7635: +case 0x7636: +case 0x7637: +case 0x7638: +case 0x7639: +case 0x763A: +case 0x763B: +case 0x763C: +case 0x763D: +case 0x763E: +case 0x763F: +case 0x7640: +case 0x7641: +case 0x7642: +case 0x7643: +case 0x7644: +case 0x7645: +case 0x7646: +case 0x7647: +case 0x7648: +case 0x7649: +case 0x764A: +case 0x764B: +case 0x764C: +case 0x764D: +case 0x764E: +case 0x764F: +case 0x7650: +case 0x7651: +case 0x7652: +case 0x7653: +case 0x7654: +case 0x7655: +case 0x7656: +case 0x7657: +case 0x7658: +case 0x7659: +case 0x765A: +case 0x765B: +case 0x765C: +case 0x765D: +case 0x765E: +case 0x765F: +case 0x7660: +case 0x7661: +case 0x7662: +case 0x7663: +case 0x7664: +case 0x7665: +case 0x7666: +case 0x7667: +case 0x7668: +case 0x7669: +case 0x766A: +case 0x766B: +case 0x766C: +case 0x766D: +case 0x766E: +case 0x766F: +case 0x7670: +case 0x7671: +case 0x7672: +case 0x7673: +case 0x7674: +case 0x7675: +case 0x7676: +case 0x7677: +case 0x7678: +case 0x7679: +case 0x767A: +case 0x767B: +case 0x767C: +case 0x767D: +case 0x767E: +case 0x767F: +case 0x7680: +case 0x7681: +case 0x7682: +case 0x7683: +case 0x7684: +case 0x7685: +case 0x7686: +case 0x7687: +case 0x7688: +case 0x7689: +case 0x768A: +case 0x768B: +case 0x768C: +case 0x768D: +case 0x768E: +case 0x768F: +case 0x7690: +case 0x7691: +case 0x7692: +case 0x7693: +case 0x7694: +case 0x7695: +case 0x7696: +case 0x7697: +case 0x7698: +case 0x7699: +case 0x769A: +case 0x769B: +case 0x769C: +case 0x769D: +case 0x769E: +case 0x769F: +case 0x76A0: +case 0x76A1: +case 0x76A2: +case 0x76A3: +case 0x76A4: +case 0x76A5: +case 0x76A6: +case 0x76A7: +case 0x76A8: +case 0x76A9: +case 0x76AA: +case 0x76AB: +case 0x76AC: +case 0x76AD: +case 0x76AE: +case 0x76AF: +case 0x76B0: +case 0x76B1: +case 0x76B2: +case 0x76B3: +case 0x76B4: +case 0x76B5: +case 0x76B6: +case 0x76B7: +case 0x76B8: +case 0x76B9: +case 0x76BA: +case 0x76BB: +case 0x76BC: +case 0x76BD: +case 0x76BE: +case 0x76BF: +case 0x76C0: +case 0x76C1: +case 0x76C2: +case 0x76C3: +case 0x76C4: +case 0x76C5: +case 0x76C6: +case 0x76C7: +case 0x76C8: +case 0x76C9: +case 0x76CA: +case 0x76CB: +case 0x76CC: +case 0x76CD: +case 0x76CE: +case 0x76CF: +case 0x76D0: +case 0x76D1: +case 0x76D2: +case 0x76D3: +case 0x76D4: +case 0x76D5: +case 0x76D6: +case 0x76D7: +case 0x76D8: +case 0x76D9: +case 0x76DA: +case 0x76DB: +case 0x76DC: +case 0x76DD: +case 0x76DE: +case 0x76DF: +case 0x76E0: +case 0x76E1: +case 0x76E2: +case 0x76E3: +case 0x76E4: +case 0x76E5: +case 0x76E6: +case 0x76E7: +case 0x76E8: +case 0x76E9: +case 0x76EA: +case 0x76EB: +case 0x76EC: +case 0x76ED: +case 0x76EE: +case 0x76EF: +case 0x76F0: +case 0x76F1: +case 0x76F2: +case 0x76F3: +case 0x76F4: +case 0x76F5: +case 0x76F6: +case 0x76F7: +case 0x76F8: +case 0x76F9: +case 0x76FA: +case 0x76FB: +case 0x76FC: +case 0x76FD: +case 0x76FE: +case 0x76FF: +case 0x7800: +case 0x7801: +case 0x7802: +case 0x7803: +case 0x7804: +case 0x7805: +case 0x7806: +case 0x7807: +case 0x7808: +case 0x7809: +case 0x780A: +case 0x780B: +case 0x780C: +case 0x780D: +case 0x780E: +case 0x780F: +case 0x7810: +case 0x7811: +case 0x7812: +case 0x7813: +case 0x7814: +case 0x7815: +case 0x7816: +case 0x7817: +case 0x7818: +case 0x7819: +case 0x781A: +case 0x781B: +case 0x781C: +case 0x781D: +case 0x781E: +case 0x781F: +case 0x7820: +case 0x7821: +case 0x7822: +case 0x7823: +case 0x7824: +case 0x7825: +case 0x7826: +case 0x7827: +case 0x7828: +case 0x7829: +case 0x782A: +case 0x782B: +case 0x782C: +case 0x782D: +case 0x782E: +case 0x782F: +case 0x7830: +case 0x7831: +case 0x7832: +case 0x7833: +case 0x7834: +case 0x7835: +case 0x7836: +case 0x7837: +case 0x7838: +case 0x7839: +case 0x783A: +case 0x783B: +case 0x783C: +case 0x783D: +case 0x783E: +case 0x783F: +case 0x7840: +case 0x7841: +case 0x7842: +case 0x7843: +case 0x7844: +case 0x7845: +case 0x7846: +case 0x7847: +case 0x7848: +case 0x7849: +case 0x784A: +case 0x784B: +case 0x784C: +case 0x784D: +case 0x784E: +case 0x784F: +case 0x7850: +case 0x7851: +case 0x7852: +case 0x7853: +case 0x7854: +case 0x7855: +case 0x7856: +case 0x7857: +case 0x7858: +case 0x7859: +case 0x785A: +case 0x785B: +case 0x785C: +case 0x785D: +case 0x785E: +case 0x785F: +case 0x7860: +case 0x7861: +case 0x7862: +case 0x7863: +case 0x7864: +case 0x7865: +case 0x7866: +case 0x7867: +case 0x7868: +case 0x7869: +case 0x786A: +case 0x786B: +case 0x786C: +case 0x786D: +case 0x786E: +case 0x786F: +case 0x7870: +case 0x7871: +case 0x7872: +case 0x7873: +case 0x7874: +case 0x7875: +case 0x7876: +case 0x7877: +case 0x7878: +case 0x7879: +case 0x787A: +case 0x787B: +case 0x787C: +case 0x787D: +case 0x787E: +case 0x787F: +case 0x7880: +case 0x7881: +case 0x7882: +case 0x7883: +case 0x7884: +case 0x7885: +case 0x7886: +case 0x7887: +case 0x7888: +case 0x7889: +case 0x788A: +case 0x788B: +case 0x788C: +case 0x788D: +case 0x788E: +case 0x788F: +case 0x7890: +case 0x7891: +case 0x7892: +case 0x7893: +case 0x7894: +case 0x7895: +case 0x7896: +case 0x7897: +case 0x7898: +case 0x7899: +case 0x789A: +case 0x789B: +case 0x789C: +case 0x789D: +case 0x789E: +case 0x789F: +case 0x78A0: +case 0x78A1: +case 0x78A2: +case 0x78A3: +case 0x78A4: +case 0x78A5: +case 0x78A6: +case 0x78A7: +case 0x78A8: +case 0x78A9: +case 0x78AA: +case 0x78AB: +case 0x78AC: +case 0x78AD: +case 0x78AE: +case 0x78AF: +case 0x78B0: +case 0x78B1: +case 0x78B2: +case 0x78B3: +case 0x78B4: +case 0x78B5: +case 0x78B6: +case 0x78B7: +case 0x78B8: +case 0x78B9: +case 0x78BA: +case 0x78BB: +case 0x78BC: +case 0x78BD: +case 0x78BE: +case 0x78BF: +case 0x78C0: +case 0x78C1: +case 0x78C2: +case 0x78C3: +case 0x78C4: +case 0x78C5: +case 0x78C6: +case 0x78C7: +case 0x78C8: +case 0x78C9: +case 0x78CA: +case 0x78CB: +case 0x78CC: +case 0x78CD: +case 0x78CE: +case 0x78CF: +case 0x78D0: +case 0x78D1: +case 0x78D2: +case 0x78D3: +case 0x78D4: +case 0x78D5: +case 0x78D6: +case 0x78D7: +case 0x78D8: +case 0x78D9: +case 0x78DA: +case 0x78DB: +case 0x78DC: +case 0x78DD: +case 0x78DE: +case 0x78DF: +case 0x78E0: +case 0x78E1: +case 0x78E2: +case 0x78E3: +case 0x78E4: +case 0x78E5: +case 0x78E6: +case 0x78E7: +case 0x78E8: +case 0x78E9: +case 0x78EA: +case 0x78EB: +case 0x78EC: +case 0x78ED: +case 0x78EE: +case 0x78EF: +case 0x78F0: +case 0x78F1: +case 0x78F2: +case 0x78F3: +case 0x78F4: +case 0x78F5: +case 0x78F6: +case 0x78F7: +case 0x78F8: +case 0x78F9: +case 0x78FA: +case 0x78FB: +case 0x78FC: +case 0x78FD: +case 0x78FE: +case 0x78FF: +case 0x7A00: +case 0x7A01: +case 0x7A02: +case 0x7A03: +case 0x7A04: +case 0x7A05: +case 0x7A06: +case 0x7A07: +case 0x7A08: +case 0x7A09: +case 0x7A0A: +case 0x7A0B: +case 0x7A0C: +case 0x7A0D: +case 0x7A0E: +case 0x7A0F: +case 0x7A10: +case 0x7A11: +case 0x7A12: +case 0x7A13: +case 0x7A14: +case 0x7A15: +case 0x7A16: +case 0x7A17: +case 0x7A18: +case 0x7A19: +case 0x7A1A: +case 0x7A1B: +case 0x7A1C: +case 0x7A1D: +case 0x7A1E: +case 0x7A1F: +case 0x7A20: +case 0x7A21: +case 0x7A22: +case 0x7A23: +case 0x7A24: +case 0x7A25: +case 0x7A26: +case 0x7A27: +case 0x7A28: +case 0x7A29: +case 0x7A2A: +case 0x7A2B: +case 0x7A2C: +case 0x7A2D: +case 0x7A2E: +case 0x7A2F: +case 0x7A30: +case 0x7A31: +case 0x7A32: +case 0x7A33: +case 0x7A34: +case 0x7A35: +case 0x7A36: +case 0x7A37: +case 0x7A38: +case 0x7A39: +case 0x7A3A: +case 0x7A3B: +case 0x7A3C: +case 0x7A3D: +case 0x7A3E: +case 0x7A3F: +case 0x7A40: +case 0x7A41: +case 0x7A42: +case 0x7A43: +case 0x7A44: +case 0x7A45: +case 0x7A46: +case 0x7A47: +case 0x7A48: +case 0x7A49: +case 0x7A4A: +case 0x7A4B: +case 0x7A4C: +case 0x7A4D: +case 0x7A4E: +case 0x7A4F: +case 0x7A50: +case 0x7A51: +case 0x7A52: +case 0x7A53: +case 0x7A54: +case 0x7A55: +case 0x7A56: +case 0x7A57: +case 0x7A58: +case 0x7A59: +case 0x7A5A: +case 0x7A5B: +case 0x7A5C: +case 0x7A5D: +case 0x7A5E: +case 0x7A5F: +case 0x7A60: +case 0x7A61: +case 0x7A62: +case 0x7A63: +case 0x7A64: +case 0x7A65: +case 0x7A66: +case 0x7A67: +case 0x7A68: +case 0x7A69: +case 0x7A6A: +case 0x7A6B: +case 0x7A6C: +case 0x7A6D: +case 0x7A6E: +case 0x7A6F: +case 0x7A70: +case 0x7A71: +case 0x7A72: +case 0x7A73: +case 0x7A74: +case 0x7A75: +case 0x7A76: +case 0x7A77: +case 0x7A78: +case 0x7A79: +case 0x7A7A: +case 0x7A7B: +case 0x7A7C: +case 0x7A7D: +case 0x7A7E: +case 0x7A7F: +case 0x7A80: +case 0x7A81: +case 0x7A82: +case 0x7A83: +case 0x7A84: +case 0x7A85: +case 0x7A86: +case 0x7A87: +case 0x7A88: +case 0x7A89: +case 0x7A8A: +case 0x7A8B: +case 0x7A8C: +case 0x7A8D: +case 0x7A8E: +case 0x7A8F: +case 0x7A90: +case 0x7A91: +case 0x7A92: +case 0x7A93: +case 0x7A94: +case 0x7A95: +case 0x7A96: +case 0x7A97: +case 0x7A98: +case 0x7A99: +case 0x7A9A: +case 0x7A9B: +case 0x7A9C: +case 0x7A9D: +case 0x7A9E: +case 0x7A9F: +case 0x7AA0: +case 0x7AA1: +case 0x7AA2: +case 0x7AA3: +case 0x7AA4: +case 0x7AA5: +case 0x7AA6: +case 0x7AA7: +case 0x7AA8: +case 0x7AA9: +case 0x7AAA: +case 0x7AAB: +case 0x7AAC: +case 0x7AAD: +case 0x7AAE: +case 0x7AAF: +case 0x7AB0: +case 0x7AB1: +case 0x7AB2: +case 0x7AB3: +case 0x7AB4: +case 0x7AB5: +case 0x7AB6: +case 0x7AB7: +case 0x7AB8: +case 0x7AB9: +case 0x7ABA: +case 0x7ABB: +case 0x7ABC: +case 0x7ABD: +case 0x7ABE: +case 0x7ABF: +case 0x7AC0: +case 0x7AC1: +case 0x7AC2: +case 0x7AC3: +case 0x7AC4: +case 0x7AC5: +case 0x7AC6: +case 0x7AC7: +case 0x7AC8: +case 0x7AC9: +case 0x7ACA: +case 0x7ACB: +case 0x7ACC: +case 0x7ACD: +case 0x7ACE: +case 0x7ACF: +case 0x7AD0: +case 0x7AD1: +case 0x7AD2: +case 0x7AD3: +case 0x7AD4: +case 0x7AD5: +case 0x7AD6: +case 0x7AD7: +case 0x7AD8: +case 0x7AD9: +case 0x7ADA: +case 0x7ADB: +case 0x7ADC: +case 0x7ADD: +case 0x7ADE: +case 0x7ADF: +case 0x7AE0: +case 0x7AE1: +case 0x7AE2: +case 0x7AE3: +case 0x7AE4: +case 0x7AE5: +case 0x7AE6: +case 0x7AE7: +case 0x7AE8: +case 0x7AE9: +case 0x7AEA: +case 0x7AEB: +case 0x7AEC: +case 0x7AED: +case 0x7AEE: +case 0x7AEF: +case 0x7AF0: +case 0x7AF1: +case 0x7AF2: +case 0x7AF3: +case 0x7AF4: +case 0x7AF5: +case 0x7AF6: +case 0x7AF7: +case 0x7AF8: +case 0x7AF9: +case 0x7AFA: +case 0x7AFB: +case 0x7AFC: +case 0x7AFD: +case 0x7AFE: +case 0x7AFF: +case 0x7C00: +case 0x7C01: +case 0x7C02: +case 0x7C03: +case 0x7C04: +case 0x7C05: +case 0x7C06: +case 0x7C07: +case 0x7C08: +case 0x7C09: +case 0x7C0A: +case 0x7C0B: +case 0x7C0C: +case 0x7C0D: +case 0x7C0E: +case 0x7C0F: +case 0x7C10: +case 0x7C11: +case 0x7C12: +case 0x7C13: +case 0x7C14: +case 0x7C15: +case 0x7C16: +case 0x7C17: +case 0x7C18: +case 0x7C19: +case 0x7C1A: +case 0x7C1B: +case 0x7C1C: +case 0x7C1D: +case 0x7C1E: +case 0x7C1F: +case 0x7C20: +case 0x7C21: +case 0x7C22: +case 0x7C23: +case 0x7C24: +case 0x7C25: +case 0x7C26: +case 0x7C27: +case 0x7C28: +case 0x7C29: +case 0x7C2A: +case 0x7C2B: +case 0x7C2C: +case 0x7C2D: +case 0x7C2E: +case 0x7C2F: +case 0x7C30: +case 0x7C31: +case 0x7C32: +case 0x7C33: +case 0x7C34: +case 0x7C35: +case 0x7C36: +case 0x7C37: +case 0x7C38: +case 0x7C39: +case 0x7C3A: +case 0x7C3B: +case 0x7C3C: +case 0x7C3D: +case 0x7C3E: +case 0x7C3F: +case 0x7C40: +case 0x7C41: +case 0x7C42: +case 0x7C43: +case 0x7C44: +case 0x7C45: +case 0x7C46: +case 0x7C47: +case 0x7C48: +case 0x7C49: +case 0x7C4A: +case 0x7C4B: +case 0x7C4C: +case 0x7C4D: +case 0x7C4E: +case 0x7C4F: +case 0x7C50: +case 0x7C51: +case 0x7C52: +case 0x7C53: +case 0x7C54: +case 0x7C55: +case 0x7C56: +case 0x7C57: +case 0x7C58: +case 0x7C59: +case 0x7C5A: +case 0x7C5B: +case 0x7C5C: +case 0x7C5D: +case 0x7C5E: +case 0x7C5F: +case 0x7C60: +case 0x7C61: +case 0x7C62: +case 0x7C63: +case 0x7C64: +case 0x7C65: +case 0x7C66: +case 0x7C67: +case 0x7C68: +case 0x7C69: +case 0x7C6A: +case 0x7C6B: +case 0x7C6C: +case 0x7C6D: +case 0x7C6E: +case 0x7C6F: +case 0x7C70: +case 0x7C71: +case 0x7C72: +case 0x7C73: +case 0x7C74: +case 0x7C75: +case 0x7C76: +case 0x7C77: +case 0x7C78: +case 0x7C79: +case 0x7C7A: +case 0x7C7B: +case 0x7C7C: +case 0x7C7D: +case 0x7C7E: +case 0x7C7F: +case 0x7C80: +case 0x7C81: +case 0x7C82: +case 0x7C83: +case 0x7C84: +case 0x7C85: +case 0x7C86: +case 0x7C87: +case 0x7C88: +case 0x7C89: +case 0x7C8A: +case 0x7C8B: +case 0x7C8C: +case 0x7C8D: +case 0x7C8E: +case 0x7C8F: +case 0x7C90: +case 0x7C91: +case 0x7C92: +case 0x7C93: +case 0x7C94: +case 0x7C95: +case 0x7C96: +case 0x7C97: +case 0x7C98: +case 0x7C99: +case 0x7C9A: +case 0x7C9B: +case 0x7C9C: +case 0x7C9D: +case 0x7C9E: +case 0x7C9F: +case 0x7CA0: +case 0x7CA1: +case 0x7CA2: +case 0x7CA3: +case 0x7CA4: +case 0x7CA5: +case 0x7CA6: +case 0x7CA7: +case 0x7CA8: +case 0x7CA9: +case 0x7CAA: +case 0x7CAB: +case 0x7CAC: +case 0x7CAD: +case 0x7CAE: +case 0x7CAF: +case 0x7CB0: +case 0x7CB1: +case 0x7CB2: +case 0x7CB3: +case 0x7CB4: +case 0x7CB5: +case 0x7CB6: +case 0x7CB7: +case 0x7CB8: +case 0x7CB9: +case 0x7CBA: +case 0x7CBB: +case 0x7CBC: +case 0x7CBD: +case 0x7CBE: +case 0x7CBF: +case 0x7CC0: +case 0x7CC1: +case 0x7CC2: +case 0x7CC3: +case 0x7CC4: +case 0x7CC5: +case 0x7CC6: +case 0x7CC7: +case 0x7CC8: +case 0x7CC9: +case 0x7CCA: +case 0x7CCB: +case 0x7CCC: +case 0x7CCD: +case 0x7CCE: +case 0x7CCF: +case 0x7CD0: +case 0x7CD1: +case 0x7CD2: +case 0x7CD3: +case 0x7CD4: +case 0x7CD5: +case 0x7CD6: +case 0x7CD7: +case 0x7CD8: +case 0x7CD9: +case 0x7CDA: +case 0x7CDB: +case 0x7CDC: +case 0x7CDD: +case 0x7CDE: +case 0x7CDF: +case 0x7CE0: +case 0x7CE1: +case 0x7CE2: +case 0x7CE3: +case 0x7CE4: +case 0x7CE5: +case 0x7CE6: +case 0x7CE7: +case 0x7CE8: +case 0x7CE9: +case 0x7CEA: +case 0x7CEB: +case 0x7CEC: +case 0x7CED: +case 0x7CEE: +case 0x7CEF: +case 0x7CF0: +case 0x7CF1: +case 0x7CF2: +case 0x7CF3: +case 0x7CF4: +case 0x7CF5: +case 0x7CF6: +case 0x7CF7: +case 0x7CF8: +case 0x7CF9: +case 0x7CFA: +case 0x7CFB: +case 0x7CFC: +case 0x7CFD: +case 0x7CFE: +case 0x7CFF: +case 0x7E00: +case 0x7E01: +case 0x7E02: +case 0x7E03: +case 0x7E04: +case 0x7E05: +case 0x7E06: +case 0x7E07: +case 0x7E08: +case 0x7E09: +case 0x7E0A: +case 0x7E0B: +case 0x7E0C: +case 0x7E0D: +case 0x7E0E: +case 0x7E0F: +case 0x7E10: +case 0x7E11: +case 0x7E12: +case 0x7E13: +case 0x7E14: +case 0x7E15: +case 0x7E16: +case 0x7E17: +case 0x7E18: +case 0x7E19: +case 0x7E1A: +case 0x7E1B: +case 0x7E1C: +case 0x7E1D: +case 0x7E1E: +case 0x7E1F: +case 0x7E20: +case 0x7E21: +case 0x7E22: +case 0x7E23: +case 0x7E24: +case 0x7E25: +case 0x7E26: +case 0x7E27: +case 0x7E28: +case 0x7E29: +case 0x7E2A: +case 0x7E2B: +case 0x7E2C: +case 0x7E2D: +case 0x7E2E: +case 0x7E2F: +case 0x7E30: +case 0x7E31: +case 0x7E32: +case 0x7E33: +case 0x7E34: +case 0x7E35: +case 0x7E36: +case 0x7E37: +case 0x7E38: +case 0x7E39: +case 0x7E3A: +case 0x7E3B: +case 0x7E3C: +case 0x7E3D: +case 0x7E3E: +case 0x7E3F: +case 0x7E40: +case 0x7E41: +case 0x7E42: +case 0x7E43: +case 0x7E44: +case 0x7E45: +case 0x7E46: +case 0x7E47: +case 0x7E48: +case 0x7E49: +case 0x7E4A: +case 0x7E4B: +case 0x7E4C: +case 0x7E4D: +case 0x7E4E: +case 0x7E4F: +case 0x7E50: +case 0x7E51: +case 0x7E52: +case 0x7E53: +case 0x7E54: +case 0x7E55: +case 0x7E56: +case 0x7E57: +case 0x7E58: +case 0x7E59: +case 0x7E5A: +case 0x7E5B: +case 0x7E5C: +case 0x7E5D: +case 0x7E5E: +case 0x7E5F: +case 0x7E60: +case 0x7E61: +case 0x7E62: +case 0x7E63: +case 0x7E64: +case 0x7E65: +case 0x7E66: +case 0x7E67: +case 0x7E68: +case 0x7E69: +case 0x7E6A: +case 0x7E6B: +case 0x7E6C: +case 0x7E6D: +case 0x7E6E: +case 0x7E6F: +case 0x7E70: +case 0x7E71: +case 0x7E72: +case 0x7E73: +case 0x7E74: +case 0x7E75: +case 0x7E76: +case 0x7E77: +case 0x7E78: +case 0x7E79: +case 0x7E7A: +case 0x7E7B: +case 0x7E7C: +case 0x7E7D: +case 0x7E7E: +case 0x7E7F: +case 0x7E80: +case 0x7E81: +case 0x7E82: +case 0x7E83: +case 0x7E84: +case 0x7E85: +case 0x7E86: +case 0x7E87: +case 0x7E88: +case 0x7E89: +case 0x7E8A: +case 0x7E8B: +case 0x7E8C: +case 0x7E8D: +case 0x7E8E: +case 0x7E8F: +case 0x7E90: +case 0x7E91: +case 0x7E92: +case 0x7E93: +case 0x7E94: +case 0x7E95: +case 0x7E96: +case 0x7E97: +case 0x7E98: +case 0x7E99: +case 0x7E9A: +case 0x7E9B: +case 0x7E9C: +case 0x7E9D: +case 0x7E9E: +case 0x7E9F: +case 0x7EA0: +case 0x7EA1: +case 0x7EA2: +case 0x7EA3: +case 0x7EA4: +case 0x7EA5: +case 0x7EA6: +case 0x7EA7: +case 0x7EA8: +case 0x7EA9: +case 0x7EAA: +case 0x7EAB: +case 0x7EAC: +case 0x7EAD: +case 0x7EAE: +case 0x7EAF: +case 0x7EB0: +case 0x7EB1: +case 0x7EB2: +case 0x7EB3: +case 0x7EB4: +case 0x7EB5: +case 0x7EB6: +case 0x7EB7: +case 0x7EB8: +case 0x7EB9: +case 0x7EBA: +case 0x7EBB: +case 0x7EBC: +case 0x7EBD: +case 0x7EBE: +case 0x7EBF: +case 0x7EC0: +case 0x7EC1: +case 0x7EC2: +case 0x7EC3: +case 0x7EC4: +case 0x7EC5: +case 0x7EC6: +case 0x7EC7: +case 0x7EC8: +case 0x7EC9: +case 0x7ECA: +case 0x7ECB: +case 0x7ECC: +case 0x7ECD: +case 0x7ECE: +case 0x7ECF: +case 0x7ED0: +case 0x7ED1: +case 0x7ED2: +case 0x7ED3: +case 0x7ED4: +case 0x7ED5: +case 0x7ED6: +case 0x7ED7: +case 0x7ED8: +case 0x7ED9: +case 0x7EDA: +case 0x7EDB: +case 0x7EDC: +case 0x7EDD: +case 0x7EDE: +case 0x7EDF: +case 0x7EE0: +case 0x7EE1: +case 0x7EE2: +case 0x7EE3: +case 0x7EE4: +case 0x7EE5: +case 0x7EE6: +case 0x7EE7: +case 0x7EE8: +case 0x7EE9: +case 0x7EEA: +case 0x7EEB: +case 0x7EEC: +case 0x7EED: +case 0x7EEE: +case 0x7EEF: +case 0x7EF0: +case 0x7EF1: +case 0x7EF2: +case 0x7EF3: +case 0x7EF4: +case 0x7EF5: +case 0x7EF6: +case 0x7EF7: +case 0x7EF8: +case 0x7EF9: +case 0x7EFA: +case 0x7EFB: +case 0x7EFC: +case 0x7EFD: +case 0x7EFE: +case 0x7EFF: + +// MOVEQ +case 0x7000: +{ + u32 res; + res = (s32)(s8)Opcode; + CPU->flag_C = CPU->flag_V = 0; + CPU->flag_N = CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op8.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op8.inc new file mode 100644 index 0000000000..0dc1fac2e8 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op8.inc @@ -0,0 +1,5965 @@ +case 0x8200: +case 0x8400: +case 0x8600: +case 0x8800: +case 0x8A00: +case 0x8C00: +case 0x8E00: +case 0x8001: +case 0x8201: +case 0x8401: +case 0x8601: +case 0x8801: +case 0x8A01: +case 0x8C01: +case 0x8E01: +case 0x8002: +case 0x8202: +case 0x8402: +case 0x8602: +case 0x8802: +case 0x8A02: +case 0x8C02: +case 0x8E02: +case 0x8003: +case 0x8203: +case 0x8403: +case 0x8603: +case 0x8803: +case 0x8A03: +case 0x8C03: +case 0x8E03: +case 0x8004: +case 0x8204: +case 0x8404: +case 0x8604: +case 0x8804: +case 0x8A04: +case 0x8C04: +case 0x8E04: +case 0x8005: +case 0x8205: +case 0x8405: +case 0x8605: +case 0x8805: +case 0x8A05: +case 0x8C05: +case 0x8E05: +case 0x8006: +case 0x8206: +case 0x8406: +case 0x8606: +case 0x8806: +case 0x8A06: +case 0x8C06: +case 0x8E06: +case 0x8007: +case 0x8207: +case 0x8407: +case 0x8607: +case 0x8807: +case 0x8A07: +case 0x8C07: +case 0x8E07: + +// ORaD +case 0x8000: +{ + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8210: +case 0x8410: +case 0x8610: +case 0x8810: +case 0x8A10: +case 0x8C10: +case 0x8E10: +case 0x8011: +case 0x8211: +case 0x8411: +case 0x8611: +case 0x8811: +case 0x8A11: +case 0x8C11: +case 0x8E11: +case 0x8012: +case 0x8212: +case 0x8412: +case 0x8612: +case 0x8812: +case 0x8A12: +case 0x8C12: +case 0x8E12: +case 0x8013: +case 0x8213: +case 0x8413: +case 0x8613: +case 0x8813: +case 0x8A13: +case 0x8C13: +case 0x8E13: +case 0x8014: +case 0x8214: +case 0x8414: +case 0x8614: +case 0x8814: +case 0x8A14: +case 0x8C14: +case 0x8E14: +case 0x8015: +case 0x8215: +case 0x8415: +case 0x8615: +case 0x8815: +case 0x8A15: +case 0x8C15: +case 0x8E15: +case 0x8016: +case 0x8216: +case 0x8416: +case 0x8616: +case 0x8816: +case 0x8A16: +case 0x8C16: +case 0x8E16: +case 0x8017: +case 0x8217: +case 0x8417: +case 0x8617: +case 0x8817: +case 0x8A17: +case 0x8C17: +case 0x8E17: + +// ORaD +case 0x8010: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8218: +case 0x8418: +case 0x8618: +case 0x8818: +case 0x8A18: +case 0x8C18: +case 0x8E18: +case 0x8019: +case 0x8219: +case 0x8419: +case 0x8619: +case 0x8819: +case 0x8A19: +case 0x8C19: +case 0x8E19: +case 0x801A: +case 0x821A: +case 0x841A: +case 0x861A: +case 0x881A: +case 0x8A1A: +case 0x8C1A: +case 0x8E1A: +case 0x801B: +case 0x821B: +case 0x841B: +case 0x861B: +case 0x881B: +case 0x8A1B: +case 0x8C1B: +case 0x8E1B: +case 0x801C: +case 0x821C: +case 0x841C: +case 0x861C: +case 0x881C: +case 0x8A1C: +case 0x8C1C: +case 0x8E1C: +case 0x801D: +case 0x821D: +case 0x841D: +case 0x861D: +case 0x881D: +case 0x8A1D: +case 0x8C1D: +case 0x8E1D: +case 0x801E: +case 0x821E: +case 0x841E: +case 0x861E: +case 0x881E: +case 0x8A1E: +case 0x8C1E: +case 0x8E1E: + +// ORaD +case 0x8018: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8220: +case 0x8420: +case 0x8620: +case 0x8820: +case 0x8A20: +case 0x8C20: +case 0x8E20: +case 0x8021: +case 0x8221: +case 0x8421: +case 0x8621: +case 0x8821: +case 0x8A21: +case 0x8C21: +case 0x8E21: +case 0x8022: +case 0x8222: +case 0x8422: +case 0x8622: +case 0x8822: +case 0x8A22: +case 0x8C22: +case 0x8E22: +case 0x8023: +case 0x8223: +case 0x8423: +case 0x8623: +case 0x8823: +case 0x8A23: +case 0x8C23: +case 0x8E23: +case 0x8024: +case 0x8224: +case 0x8424: +case 0x8624: +case 0x8824: +case 0x8A24: +case 0x8C24: +case 0x8E24: +case 0x8025: +case 0x8225: +case 0x8425: +case 0x8625: +case 0x8825: +case 0x8A25: +case 0x8C25: +case 0x8E25: +case 0x8026: +case 0x8226: +case 0x8426: +case 0x8626: +case 0x8826: +case 0x8A26: +case 0x8C26: +case 0x8E26: + +// ORaD +case 0x8020: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8228: +case 0x8428: +case 0x8628: +case 0x8828: +case 0x8A28: +case 0x8C28: +case 0x8E28: +case 0x8029: +case 0x8229: +case 0x8429: +case 0x8629: +case 0x8829: +case 0x8A29: +case 0x8C29: +case 0x8E29: +case 0x802A: +case 0x822A: +case 0x842A: +case 0x862A: +case 0x882A: +case 0x8A2A: +case 0x8C2A: +case 0x8E2A: +case 0x802B: +case 0x822B: +case 0x842B: +case 0x862B: +case 0x882B: +case 0x8A2B: +case 0x8C2B: +case 0x8E2B: +case 0x802C: +case 0x822C: +case 0x842C: +case 0x862C: +case 0x882C: +case 0x8A2C: +case 0x8C2C: +case 0x8E2C: +case 0x802D: +case 0x822D: +case 0x842D: +case 0x862D: +case 0x882D: +case 0x8A2D: +case 0x8C2D: +case 0x8E2D: +case 0x802E: +case 0x822E: +case 0x842E: +case 0x862E: +case 0x882E: +case 0x8A2E: +case 0x8C2E: +case 0x8E2E: +case 0x802F: +case 0x822F: +case 0x842F: +case 0x862F: +case 0x882F: +case 0x8A2F: +case 0x8C2F: +case 0x8E2F: + +// ORaD +case 0x8028: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8230: +case 0x8430: +case 0x8630: +case 0x8830: +case 0x8A30: +case 0x8C30: +case 0x8E30: +case 0x8031: +case 0x8231: +case 0x8431: +case 0x8631: +case 0x8831: +case 0x8A31: +case 0x8C31: +case 0x8E31: +case 0x8032: +case 0x8232: +case 0x8432: +case 0x8632: +case 0x8832: +case 0x8A32: +case 0x8C32: +case 0x8E32: +case 0x8033: +case 0x8233: +case 0x8433: +case 0x8633: +case 0x8833: +case 0x8A33: +case 0x8C33: +case 0x8E33: +case 0x8034: +case 0x8234: +case 0x8434: +case 0x8634: +case 0x8834: +case 0x8A34: +case 0x8C34: +case 0x8E34: +case 0x8035: +case 0x8235: +case 0x8435: +case 0x8635: +case 0x8835: +case 0x8A35: +case 0x8C35: +case 0x8E35: +case 0x8036: +case 0x8236: +case 0x8436: +case 0x8636: +case 0x8836: +case 0x8A36: +case 0x8C36: +case 0x8E36: +case 0x8037: +case 0x8237: +case 0x8437: +case 0x8637: +case 0x8837: +case 0x8A37: +case 0x8C37: +case 0x8E37: + +// ORaD +case 0x8030: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8238: +case 0x8438: +case 0x8638: +case 0x8838: +case 0x8A38: +case 0x8C38: +case 0x8E38: + +// ORaD +case 0x8038: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8239: +case 0x8439: +case 0x8639: +case 0x8839: +case 0x8A39: +case 0x8C39: +case 0x8E39: + +// ORaD +case 0x8039: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x823A: +case 0x843A: +case 0x863A: +case 0x883A: +case 0x8A3A: +case 0x8C3A: +case 0x8E3A: + +// ORaD +case 0x803A: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x823B: +case 0x843B: +case 0x863B: +case 0x883B: +case 0x8A3B: +case 0x8C3B: +case 0x8E3B: + +// ORaD +case 0x803B: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x823C: +case 0x843C: +case 0x863C: +case 0x883C: +case 0x8A3C: +case 0x8C3C: +case 0x8E3C: + +// ORaD +case 0x803C: +{ + u32 res; + u32 src; + src = FETCH_BYTE; + PC += 2; + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0x821F: +case 0x841F: +case 0x861F: +case 0x881F: +case 0x8A1F: +case 0x8C1F: +case 0x8E1F: + +// ORaD +case 0x801F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8227: +case 0x8427: +case 0x8627: +case 0x8827: +case 0x8A27: +case 0x8C27: +case 0x8E27: + +// ORaD +case 0x8027: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8240: +case 0x8440: +case 0x8640: +case 0x8840: +case 0x8A40: +case 0x8C40: +case 0x8E40: +case 0x8041: +case 0x8241: +case 0x8441: +case 0x8641: +case 0x8841: +case 0x8A41: +case 0x8C41: +case 0x8E41: +case 0x8042: +case 0x8242: +case 0x8442: +case 0x8642: +case 0x8842: +case 0x8A42: +case 0x8C42: +case 0x8E42: +case 0x8043: +case 0x8243: +case 0x8443: +case 0x8643: +case 0x8843: +case 0x8A43: +case 0x8C43: +case 0x8E43: +case 0x8044: +case 0x8244: +case 0x8444: +case 0x8644: +case 0x8844: +case 0x8A44: +case 0x8C44: +case 0x8E44: +case 0x8045: +case 0x8245: +case 0x8445: +case 0x8645: +case 0x8845: +case 0x8A45: +case 0x8C45: +case 0x8E45: +case 0x8046: +case 0x8246: +case 0x8446: +case 0x8646: +case 0x8846: +case 0x8A46: +case 0x8C46: +case 0x8E46: +case 0x8047: +case 0x8247: +case 0x8447: +case 0x8647: +case 0x8847: +case 0x8A47: +case 0x8C47: +case 0x8E47: + +// ORaD +case 0x8040: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8250: +case 0x8450: +case 0x8650: +case 0x8850: +case 0x8A50: +case 0x8C50: +case 0x8E50: +case 0x8051: +case 0x8251: +case 0x8451: +case 0x8651: +case 0x8851: +case 0x8A51: +case 0x8C51: +case 0x8E51: +case 0x8052: +case 0x8252: +case 0x8452: +case 0x8652: +case 0x8852: +case 0x8A52: +case 0x8C52: +case 0x8E52: +case 0x8053: +case 0x8253: +case 0x8453: +case 0x8653: +case 0x8853: +case 0x8A53: +case 0x8C53: +case 0x8E53: +case 0x8054: +case 0x8254: +case 0x8454: +case 0x8654: +case 0x8854: +case 0x8A54: +case 0x8C54: +case 0x8E54: +case 0x8055: +case 0x8255: +case 0x8455: +case 0x8655: +case 0x8855: +case 0x8A55: +case 0x8C55: +case 0x8E55: +case 0x8056: +case 0x8256: +case 0x8456: +case 0x8656: +case 0x8856: +case 0x8A56: +case 0x8C56: +case 0x8E56: +case 0x8057: +case 0x8257: +case 0x8457: +case 0x8657: +case 0x8857: +case 0x8A57: +case 0x8C57: +case 0x8E57: + +// ORaD +case 0x8050: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8258: +case 0x8458: +case 0x8658: +case 0x8858: +case 0x8A58: +case 0x8C58: +case 0x8E58: +case 0x8059: +case 0x8259: +case 0x8459: +case 0x8659: +case 0x8859: +case 0x8A59: +case 0x8C59: +case 0x8E59: +case 0x805A: +case 0x825A: +case 0x845A: +case 0x865A: +case 0x885A: +case 0x8A5A: +case 0x8C5A: +case 0x8E5A: +case 0x805B: +case 0x825B: +case 0x845B: +case 0x865B: +case 0x885B: +case 0x8A5B: +case 0x8C5B: +case 0x8E5B: +case 0x805C: +case 0x825C: +case 0x845C: +case 0x865C: +case 0x885C: +case 0x8A5C: +case 0x8C5C: +case 0x8E5C: +case 0x805D: +case 0x825D: +case 0x845D: +case 0x865D: +case 0x885D: +case 0x8A5D: +case 0x8C5D: +case 0x8E5D: +case 0x805E: +case 0x825E: +case 0x845E: +case 0x865E: +case 0x885E: +case 0x8A5E: +case 0x8C5E: +case 0x8E5E: + +// ORaD +case 0x8058: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8260: +case 0x8460: +case 0x8660: +case 0x8860: +case 0x8A60: +case 0x8C60: +case 0x8E60: +case 0x8061: +case 0x8261: +case 0x8461: +case 0x8661: +case 0x8861: +case 0x8A61: +case 0x8C61: +case 0x8E61: +case 0x8062: +case 0x8262: +case 0x8462: +case 0x8662: +case 0x8862: +case 0x8A62: +case 0x8C62: +case 0x8E62: +case 0x8063: +case 0x8263: +case 0x8463: +case 0x8663: +case 0x8863: +case 0x8A63: +case 0x8C63: +case 0x8E63: +case 0x8064: +case 0x8264: +case 0x8464: +case 0x8664: +case 0x8864: +case 0x8A64: +case 0x8C64: +case 0x8E64: +case 0x8065: +case 0x8265: +case 0x8465: +case 0x8665: +case 0x8865: +case 0x8A65: +case 0x8C65: +case 0x8E65: +case 0x8066: +case 0x8266: +case 0x8466: +case 0x8666: +case 0x8866: +case 0x8A66: +case 0x8C66: +case 0x8E66: + +// ORaD +case 0x8060: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8268: +case 0x8468: +case 0x8668: +case 0x8868: +case 0x8A68: +case 0x8C68: +case 0x8E68: +case 0x8069: +case 0x8269: +case 0x8469: +case 0x8669: +case 0x8869: +case 0x8A69: +case 0x8C69: +case 0x8E69: +case 0x806A: +case 0x826A: +case 0x846A: +case 0x866A: +case 0x886A: +case 0x8A6A: +case 0x8C6A: +case 0x8E6A: +case 0x806B: +case 0x826B: +case 0x846B: +case 0x866B: +case 0x886B: +case 0x8A6B: +case 0x8C6B: +case 0x8E6B: +case 0x806C: +case 0x826C: +case 0x846C: +case 0x866C: +case 0x886C: +case 0x8A6C: +case 0x8C6C: +case 0x8E6C: +case 0x806D: +case 0x826D: +case 0x846D: +case 0x866D: +case 0x886D: +case 0x8A6D: +case 0x8C6D: +case 0x8E6D: +case 0x806E: +case 0x826E: +case 0x846E: +case 0x866E: +case 0x886E: +case 0x8A6E: +case 0x8C6E: +case 0x8E6E: +case 0x806F: +case 0x826F: +case 0x846F: +case 0x866F: +case 0x886F: +case 0x8A6F: +case 0x8C6F: +case 0x8E6F: + +// ORaD +case 0x8068: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8270: +case 0x8470: +case 0x8670: +case 0x8870: +case 0x8A70: +case 0x8C70: +case 0x8E70: +case 0x8071: +case 0x8271: +case 0x8471: +case 0x8671: +case 0x8871: +case 0x8A71: +case 0x8C71: +case 0x8E71: +case 0x8072: +case 0x8272: +case 0x8472: +case 0x8672: +case 0x8872: +case 0x8A72: +case 0x8C72: +case 0x8E72: +case 0x8073: +case 0x8273: +case 0x8473: +case 0x8673: +case 0x8873: +case 0x8A73: +case 0x8C73: +case 0x8E73: +case 0x8074: +case 0x8274: +case 0x8474: +case 0x8674: +case 0x8874: +case 0x8A74: +case 0x8C74: +case 0x8E74: +case 0x8075: +case 0x8275: +case 0x8475: +case 0x8675: +case 0x8875: +case 0x8A75: +case 0x8C75: +case 0x8E75: +case 0x8076: +case 0x8276: +case 0x8476: +case 0x8676: +case 0x8876: +case 0x8A76: +case 0x8C76: +case 0x8E76: +case 0x8077: +case 0x8277: +case 0x8477: +case 0x8677: +case 0x8877: +case 0x8A77: +case 0x8C77: +case 0x8E77: + +// ORaD +case 0x8070: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8278: +case 0x8478: +case 0x8678: +case 0x8878: +case 0x8A78: +case 0x8C78: +case 0x8E78: + +// ORaD +case 0x8078: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8279: +case 0x8479: +case 0x8679: +case 0x8879: +case 0x8A79: +case 0x8C79: +case 0x8E79: + +// ORaD +case 0x8079: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x827A: +case 0x847A: +case 0x867A: +case 0x887A: +case 0x8A7A: +case 0x8C7A: +case 0x8E7A: + +// ORaD +case 0x807A: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x827B: +case 0x847B: +case 0x867B: +case 0x887B: +case 0x8A7B: +case 0x8C7B: +case 0x8E7B: + +// ORaD +case 0x807B: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x827C: +case 0x847C: +case 0x867C: +case 0x887C: +case 0x8A7C: +case 0x8C7C: +case 0x8E7C: + +// ORaD +case 0x807C: +{ + u32 res; + u32 src; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0x825F: +case 0x845F: +case 0x865F: +case 0x885F: +case 0x8A5F: +case 0x8C5F: +case 0x8E5F: + +// ORaD +case 0x805F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8267: +case 0x8467: +case 0x8667: +case 0x8867: +case 0x8A67: +case 0x8C67: +case 0x8E67: + +// ORaD +case 0x8067: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8280: +case 0x8480: +case 0x8680: +case 0x8880: +case 0x8A80: +case 0x8C80: +case 0x8E80: +case 0x8081: +case 0x8281: +case 0x8481: +case 0x8681: +case 0x8881: +case 0x8A81: +case 0x8C81: +case 0x8E81: +case 0x8082: +case 0x8282: +case 0x8482: +case 0x8682: +case 0x8882: +case 0x8A82: +case 0x8C82: +case 0x8E82: +case 0x8083: +case 0x8283: +case 0x8483: +case 0x8683: +case 0x8883: +case 0x8A83: +case 0x8C83: +case 0x8E83: +case 0x8084: +case 0x8284: +case 0x8484: +case 0x8684: +case 0x8884: +case 0x8A84: +case 0x8C84: +case 0x8E84: +case 0x8085: +case 0x8285: +case 0x8485: +case 0x8685: +case 0x8885: +case 0x8A85: +case 0x8C85: +case 0x8E85: +case 0x8086: +case 0x8286: +case 0x8486: +case 0x8686: +case 0x8886: +case 0x8A86: +case 0x8C86: +case 0x8E86: +case 0x8087: +case 0x8287: +case 0x8487: +case 0x8687: +case 0x8887: +case 0x8A87: +case 0x8C87: +case 0x8E87: + +// ORaD +case 0x8080: +{ + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0x8290: +case 0x8490: +case 0x8690: +case 0x8890: +case 0x8A90: +case 0x8C90: +case 0x8E90: +case 0x8091: +case 0x8291: +case 0x8491: +case 0x8691: +case 0x8891: +case 0x8A91: +case 0x8C91: +case 0x8E91: +case 0x8092: +case 0x8292: +case 0x8492: +case 0x8692: +case 0x8892: +case 0x8A92: +case 0x8C92: +case 0x8E92: +case 0x8093: +case 0x8293: +case 0x8493: +case 0x8693: +case 0x8893: +case 0x8A93: +case 0x8C93: +case 0x8E93: +case 0x8094: +case 0x8294: +case 0x8494: +case 0x8694: +case 0x8894: +case 0x8A94: +case 0x8C94: +case 0x8E94: +case 0x8095: +case 0x8295: +case 0x8495: +case 0x8695: +case 0x8895: +case 0x8A95: +case 0x8C95: +case 0x8E95: +case 0x8096: +case 0x8296: +case 0x8496: +case 0x8696: +case 0x8896: +case 0x8A96: +case 0x8C96: +case 0x8E96: +case 0x8097: +case 0x8297: +case 0x8497: +case 0x8697: +case 0x8897: +case 0x8A97: +case 0x8C97: +case 0x8E97: + +// ORaD +case 0x8090: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8298: +case 0x8498: +case 0x8698: +case 0x8898: +case 0x8A98: +case 0x8C98: +case 0x8E98: +case 0x8099: +case 0x8299: +case 0x8499: +case 0x8699: +case 0x8899: +case 0x8A99: +case 0x8C99: +case 0x8E99: +case 0x809A: +case 0x829A: +case 0x849A: +case 0x869A: +case 0x889A: +case 0x8A9A: +case 0x8C9A: +case 0x8E9A: +case 0x809B: +case 0x829B: +case 0x849B: +case 0x869B: +case 0x889B: +case 0x8A9B: +case 0x8C9B: +case 0x8E9B: +case 0x809C: +case 0x829C: +case 0x849C: +case 0x869C: +case 0x889C: +case 0x8A9C: +case 0x8C9C: +case 0x8E9C: +case 0x809D: +case 0x829D: +case 0x849D: +case 0x869D: +case 0x889D: +case 0x8A9D: +case 0x8C9D: +case 0x8E9D: +case 0x809E: +case 0x829E: +case 0x849E: +case 0x869E: +case 0x889E: +case 0x8A9E: +case 0x8C9E: +case 0x8E9E: + +// ORaD +case 0x8098: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82A0: +case 0x84A0: +case 0x86A0: +case 0x88A0: +case 0x8AA0: +case 0x8CA0: +case 0x8EA0: +case 0x80A1: +case 0x82A1: +case 0x84A1: +case 0x86A1: +case 0x88A1: +case 0x8AA1: +case 0x8CA1: +case 0x8EA1: +case 0x80A2: +case 0x82A2: +case 0x84A2: +case 0x86A2: +case 0x88A2: +case 0x8AA2: +case 0x8CA2: +case 0x8EA2: +case 0x80A3: +case 0x82A3: +case 0x84A3: +case 0x86A3: +case 0x88A3: +case 0x8AA3: +case 0x8CA3: +case 0x8EA3: +case 0x80A4: +case 0x82A4: +case 0x84A4: +case 0x86A4: +case 0x88A4: +case 0x8AA4: +case 0x8CA4: +case 0x8EA4: +case 0x80A5: +case 0x82A5: +case 0x84A5: +case 0x86A5: +case 0x88A5: +case 0x8AA5: +case 0x8CA5: +case 0x8EA5: +case 0x80A6: +case 0x82A6: +case 0x84A6: +case 0x86A6: +case 0x88A6: +case 0x8AA6: +case 0x8CA6: +case 0x8EA6: + +// ORaD +case 0x80A0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82A8: +case 0x84A8: +case 0x86A8: +case 0x88A8: +case 0x8AA8: +case 0x8CA8: +case 0x8EA8: +case 0x80A9: +case 0x82A9: +case 0x84A9: +case 0x86A9: +case 0x88A9: +case 0x8AA9: +case 0x8CA9: +case 0x8EA9: +case 0x80AA: +case 0x82AA: +case 0x84AA: +case 0x86AA: +case 0x88AA: +case 0x8AAA: +case 0x8CAA: +case 0x8EAA: +case 0x80AB: +case 0x82AB: +case 0x84AB: +case 0x86AB: +case 0x88AB: +case 0x8AAB: +case 0x8CAB: +case 0x8EAB: +case 0x80AC: +case 0x82AC: +case 0x84AC: +case 0x86AC: +case 0x88AC: +case 0x8AAC: +case 0x8CAC: +case 0x8EAC: +case 0x80AD: +case 0x82AD: +case 0x84AD: +case 0x86AD: +case 0x88AD: +case 0x8AAD: +case 0x8CAD: +case 0x8EAD: +case 0x80AE: +case 0x82AE: +case 0x84AE: +case 0x86AE: +case 0x88AE: +case 0x8AAE: +case 0x8CAE: +case 0x8EAE: +case 0x80AF: +case 0x82AF: +case 0x84AF: +case 0x86AF: +case 0x88AF: +case 0x8AAF: +case 0x8CAF: +case 0x8EAF: + +// ORaD +case 0x80A8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82B0: +case 0x84B0: +case 0x86B0: +case 0x88B0: +case 0x8AB0: +case 0x8CB0: +case 0x8EB0: +case 0x80B1: +case 0x82B1: +case 0x84B1: +case 0x86B1: +case 0x88B1: +case 0x8AB1: +case 0x8CB1: +case 0x8EB1: +case 0x80B2: +case 0x82B2: +case 0x84B2: +case 0x86B2: +case 0x88B2: +case 0x8AB2: +case 0x8CB2: +case 0x8EB2: +case 0x80B3: +case 0x82B3: +case 0x84B3: +case 0x86B3: +case 0x88B3: +case 0x8AB3: +case 0x8CB3: +case 0x8EB3: +case 0x80B4: +case 0x82B4: +case 0x84B4: +case 0x86B4: +case 0x88B4: +case 0x8AB4: +case 0x8CB4: +case 0x8EB4: +case 0x80B5: +case 0x82B5: +case 0x84B5: +case 0x86B5: +case 0x88B5: +case 0x8AB5: +case 0x8CB5: +case 0x8EB5: +case 0x80B6: +case 0x82B6: +case 0x84B6: +case 0x86B6: +case 0x88B6: +case 0x8AB6: +case 0x8CB6: +case 0x8EB6: +case 0x80B7: +case 0x82B7: +case 0x84B7: +case 0x86B7: +case 0x88B7: +case 0x8AB7: +case 0x8CB7: +case 0x8EB7: + +// ORaD +case 0x80B0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82B8: +case 0x84B8: +case 0x86B8: +case 0x88B8: +case 0x8AB8: +case 0x8CB8: +case 0x8EB8: + +// ORaD +case 0x80B8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82B9: +case 0x84B9: +case 0x86B9: +case 0x88B9: +case 0x8AB9: +case 0x8CB9: +case 0x8EB9: + +// ORaD +case 0x80B9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82BA: +case 0x84BA: +case 0x86BA: +case 0x88BA: +case 0x8ABA: +case 0x8CBA: +case 0x8EBA: + +// ORaD +case 0x80BA: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82BB: +case 0x84BB: +case 0x86BB: +case 0x88BB: +case 0x8ABB: +case 0x8CBB: +case 0x8EBB: + +// ORaD +case 0x80BB: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82BC: +case 0x84BC: +case 0x86BC: +case 0x88BC: +case 0x8ABC: +case 0x8CBC: +case 0x8EBC: + +// ORaD +case 0x80BC: +{ + u32 res; + u32 src; + src = FETCH_LONG; + PC += 4; + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(14) +case 0x829F: +case 0x849F: +case 0x869F: +case 0x889F: +case 0x8A9F: +case 0x8C9F: +case 0x8E9F: + +// ORaD +case 0x809F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x82A7: +case 0x84A7: +case 0x86A7: +case 0x88A7: +case 0x8AA7: +case 0x8CA7: +case 0x8EA7: + +// ORaD +case 0x80A7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x8310: +case 0x8510: +case 0x8710: +case 0x8910: +case 0x8B10: +case 0x8D10: +case 0x8F10: +case 0x8111: +case 0x8311: +case 0x8511: +case 0x8711: +case 0x8911: +case 0x8B11: +case 0x8D11: +case 0x8F11: +case 0x8112: +case 0x8312: +case 0x8512: +case 0x8712: +case 0x8912: +case 0x8B12: +case 0x8D12: +case 0x8F12: +case 0x8113: +case 0x8313: +case 0x8513: +case 0x8713: +case 0x8913: +case 0x8B13: +case 0x8D13: +case 0x8F13: +case 0x8114: +case 0x8314: +case 0x8514: +case 0x8714: +case 0x8914: +case 0x8B14: +case 0x8D14: +case 0x8F14: +case 0x8115: +case 0x8315: +case 0x8515: +case 0x8715: +case 0x8915: +case 0x8B15: +case 0x8D15: +case 0x8F15: +case 0x8116: +case 0x8316: +case 0x8516: +case 0x8716: +case 0x8916: +case 0x8B16: +case 0x8D16: +case 0x8F16: +case 0x8117: +case 0x8317: +case 0x8517: +case 0x8717: +case 0x8917: +case 0x8B17: +case 0x8D17: +case 0x8F17: + +// ORDa +case 0x8110: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8318: +case 0x8518: +case 0x8718: +case 0x8918: +case 0x8B18: +case 0x8D18: +case 0x8F18: +case 0x8119: +case 0x8319: +case 0x8519: +case 0x8719: +case 0x8919: +case 0x8B19: +case 0x8D19: +case 0x8F19: +case 0x811A: +case 0x831A: +case 0x851A: +case 0x871A: +case 0x891A: +case 0x8B1A: +case 0x8D1A: +case 0x8F1A: +case 0x811B: +case 0x831B: +case 0x851B: +case 0x871B: +case 0x891B: +case 0x8B1B: +case 0x8D1B: +case 0x8F1B: +case 0x811C: +case 0x831C: +case 0x851C: +case 0x871C: +case 0x891C: +case 0x8B1C: +case 0x8D1C: +case 0x8F1C: +case 0x811D: +case 0x831D: +case 0x851D: +case 0x871D: +case 0x891D: +case 0x8B1D: +case 0x8D1D: +case 0x8F1D: +case 0x811E: +case 0x831E: +case 0x851E: +case 0x871E: +case 0x891E: +case 0x8B1E: +case 0x8D1E: +case 0x8F1E: + +// ORDa +case 0x8118: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8320: +case 0x8520: +case 0x8720: +case 0x8920: +case 0x8B20: +case 0x8D20: +case 0x8F20: +case 0x8121: +case 0x8321: +case 0x8521: +case 0x8721: +case 0x8921: +case 0x8B21: +case 0x8D21: +case 0x8F21: +case 0x8122: +case 0x8322: +case 0x8522: +case 0x8722: +case 0x8922: +case 0x8B22: +case 0x8D22: +case 0x8F22: +case 0x8123: +case 0x8323: +case 0x8523: +case 0x8723: +case 0x8923: +case 0x8B23: +case 0x8D23: +case 0x8F23: +case 0x8124: +case 0x8324: +case 0x8524: +case 0x8724: +case 0x8924: +case 0x8B24: +case 0x8D24: +case 0x8F24: +case 0x8125: +case 0x8325: +case 0x8525: +case 0x8725: +case 0x8925: +case 0x8B25: +case 0x8D25: +case 0x8F25: +case 0x8126: +case 0x8326: +case 0x8526: +case 0x8726: +case 0x8926: +case 0x8B26: +case 0x8D26: +case 0x8F26: + +// ORDa +case 0x8120: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8328: +case 0x8528: +case 0x8728: +case 0x8928: +case 0x8B28: +case 0x8D28: +case 0x8F28: +case 0x8129: +case 0x8329: +case 0x8529: +case 0x8729: +case 0x8929: +case 0x8B29: +case 0x8D29: +case 0x8F29: +case 0x812A: +case 0x832A: +case 0x852A: +case 0x872A: +case 0x892A: +case 0x8B2A: +case 0x8D2A: +case 0x8F2A: +case 0x812B: +case 0x832B: +case 0x852B: +case 0x872B: +case 0x892B: +case 0x8B2B: +case 0x8D2B: +case 0x8F2B: +case 0x812C: +case 0x832C: +case 0x852C: +case 0x872C: +case 0x892C: +case 0x8B2C: +case 0x8D2C: +case 0x8F2C: +case 0x812D: +case 0x832D: +case 0x852D: +case 0x872D: +case 0x892D: +case 0x8B2D: +case 0x8D2D: +case 0x8F2D: +case 0x812E: +case 0x832E: +case 0x852E: +case 0x872E: +case 0x892E: +case 0x8B2E: +case 0x8D2E: +case 0x8F2E: +case 0x812F: +case 0x832F: +case 0x852F: +case 0x872F: +case 0x892F: +case 0x8B2F: +case 0x8D2F: +case 0x8F2F: + +// ORDa +case 0x8128: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8330: +case 0x8530: +case 0x8730: +case 0x8930: +case 0x8B30: +case 0x8D30: +case 0x8F30: +case 0x8131: +case 0x8331: +case 0x8531: +case 0x8731: +case 0x8931: +case 0x8B31: +case 0x8D31: +case 0x8F31: +case 0x8132: +case 0x8332: +case 0x8532: +case 0x8732: +case 0x8932: +case 0x8B32: +case 0x8D32: +case 0x8F32: +case 0x8133: +case 0x8333: +case 0x8533: +case 0x8733: +case 0x8933: +case 0x8B33: +case 0x8D33: +case 0x8F33: +case 0x8134: +case 0x8334: +case 0x8534: +case 0x8734: +case 0x8934: +case 0x8B34: +case 0x8D34: +case 0x8F34: +case 0x8135: +case 0x8335: +case 0x8535: +case 0x8735: +case 0x8935: +case 0x8B35: +case 0x8D35: +case 0x8F35: +case 0x8136: +case 0x8336: +case 0x8536: +case 0x8736: +case 0x8936: +case 0x8B36: +case 0x8D36: +case 0x8F36: +case 0x8137: +case 0x8337: +case 0x8537: +case 0x8737: +case 0x8937: +case 0x8B37: +case 0x8D37: +case 0x8F37: + +// ORDa +case 0x8130: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8338: +case 0x8538: +case 0x8738: +case 0x8938: +case 0x8B38: +case 0x8D38: +case 0x8F38: + +// ORDa +case 0x8138: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8339: +case 0x8539: +case 0x8739: +case 0x8939: +case 0x8B39: +case 0x8D39: +case 0x8F39: + +// ORDa +case 0x8139: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x831F: +case 0x851F: +case 0x871F: +case 0x891F: +case 0x8B1F: +case 0x8D1F: +case 0x8F1F: + +// ORDa +case 0x811F: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8327: +case 0x8527: +case 0x8727: +case 0x8927: +case 0x8B27: +case 0x8D27: +case 0x8F27: + +// ORDa +case 0x8127: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x8350: +case 0x8550: +case 0x8750: +case 0x8950: +case 0x8B50: +case 0x8D50: +case 0x8F50: +case 0x8151: +case 0x8351: +case 0x8551: +case 0x8751: +case 0x8951: +case 0x8B51: +case 0x8D51: +case 0x8F51: +case 0x8152: +case 0x8352: +case 0x8552: +case 0x8752: +case 0x8952: +case 0x8B52: +case 0x8D52: +case 0x8F52: +case 0x8153: +case 0x8353: +case 0x8553: +case 0x8753: +case 0x8953: +case 0x8B53: +case 0x8D53: +case 0x8F53: +case 0x8154: +case 0x8354: +case 0x8554: +case 0x8754: +case 0x8954: +case 0x8B54: +case 0x8D54: +case 0x8F54: +case 0x8155: +case 0x8355: +case 0x8555: +case 0x8755: +case 0x8955: +case 0x8B55: +case 0x8D55: +case 0x8F55: +case 0x8156: +case 0x8356: +case 0x8556: +case 0x8756: +case 0x8956: +case 0x8B56: +case 0x8D56: +case 0x8F56: +case 0x8157: +case 0x8357: +case 0x8557: +case 0x8757: +case 0x8957: +case 0x8B57: +case 0x8D57: +case 0x8F57: + +// ORDa +case 0x8150: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8358: +case 0x8558: +case 0x8758: +case 0x8958: +case 0x8B58: +case 0x8D58: +case 0x8F58: +case 0x8159: +case 0x8359: +case 0x8559: +case 0x8759: +case 0x8959: +case 0x8B59: +case 0x8D59: +case 0x8F59: +case 0x815A: +case 0x835A: +case 0x855A: +case 0x875A: +case 0x895A: +case 0x8B5A: +case 0x8D5A: +case 0x8F5A: +case 0x815B: +case 0x835B: +case 0x855B: +case 0x875B: +case 0x895B: +case 0x8B5B: +case 0x8D5B: +case 0x8F5B: +case 0x815C: +case 0x835C: +case 0x855C: +case 0x875C: +case 0x895C: +case 0x8B5C: +case 0x8D5C: +case 0x8F5C: +case 0x815D: +case 0x835D: +case 0x855D: +case 0x875D: +case 0x895D: +case 0x8B5D: +case 0x8D5D: +case 0x8F5D: +case 0x815E: +case 0x835E: +case 0x855E: +case 0x875E: +case 0x895E: +case 0x8B5E: +case 0x8D5E: +case 0x8F5E: + +// ORDa +case 0x8158: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8360: +case 0x8560: +case 0x8760: +case 0x8960: +case 0x8B60: +case 0x8D60: +case 0x8F60: +case 0x8161: +case 0x8361: +case 0x8561: +case 0x8761: +case 0x8961: +case 0x8B61: +case 0x8D61: +case 0x8F61: +case 0x8162: +case 0x8362: +case 0x8562: +case 0x8762: +case 0x8962: +case 0x8B62: +case 0x8D62: +case 0x8F62: +case 0x8163: +case 0x8363: +case 0x8563: +case 0x8763: +case 0x8963: +case 0x8B63: +case 0x8D63: +case 0x8F63: +case 0x8164: +case 0x8364: +case 0x8564: +case 0x8764: +case 0x8964: +case 0x8B64: +case 0x8D64: +case 0x8F64: +case 0x8165: +case 0x8365: +case 0x8565: +case 0x8765: +case 0x8965: +case 0x8B65: +case 0x8D65: +case 0x8F65: +case 0x8166: +case 0x8366: +case 0x8566: +case 0x8766: +case 0x8966: +case 0x8B66: +case 0x8D66: +case 0x8F66: + +// ORDa +case 0x8160: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8368: +case 0x8568: +case 0x8768: +case 0x8968: +case 0x8B68: +case 0x8D68: +case 0x8F68: +case 0x8169: +case 0x8369: +case 0x8569: +case 0x8769: +case 0x8969: +case 0x8B69: +case 0x8D69: +case 0x8F69: +case 0x816A: +case 0x836A: +case 0x856A: +case 0x876A: +case 0x896A: +case 0x8B6A: +case 0x8D6A: +case 0x8F6A: +case 0x816B: +case 0x836B: +case 0x856B: +case 0x876B: +case 0x896B: +case 0x8B6B: +case 0x8D6B: +case 0x8F6B: +case 0x816C: +case 0x836C: +case 0x856C: +case 0x876C: +case 0x896C: +case 0x8B6C: +case 0x8D6C: +case 0x8F6C: +case 0x816D: +case 0x836D: +case 0x856D: +case 0x876D: +case 0x896D: +case 0x8B6D: +case 0x8D6D: +case 0x8F6D: +case 0x816E: +case 0x836E: +case 0x856E: +case 0x876E: +case 0x896E: +case 0x8B6E: +case 0x8D6E: +case 0x8F6E: +case 0x816F: +case 0x836F: +case 0x856F: +case 0x876F: +case 0x896F: +case 0x8B6F: +case 0x8D6F: +case 0x8F6F: + +// ORDa +case 0x8168: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8370: +case 0x8570: +case 0x8770: +case 0x8970: +case 0x8B70: +case 0x8D70: +case 0x8F70: +case 0x8171: +case 0x8371: +case 0x8571: +case 0x8771: +case 0x8971: +case 0x8B71: +case 0x8D71: +case 0x8F71: +case 0x8172: +case 0x8372: +case 0x8572: +case 0x8772: +case 0x8972: +case 0x8B72: +case 0x8D72: +case 0x8F72: +case 0x8173: +case 0x8373: +case 0x8573: +case 0x8773: +case 0x8973: +case 0x8B73: +case 0x8D73: +case 0x8F73: +case 0x8174: +case 0x8374: +case 0x8574: +case 0x8774: +case 0x8974: +case 0x8B74: +case 0x8D74: +case 0x8F74: +case 0x8175: +case 0x8375: +case 0x8575: +case 0x8775: +case 0x8975: +case 0x8B75: +case 0x8D75: +case 0x8F75: +case 0x8176: +case 0x8376: +case 0x8576: +case 0x8776: +case 0x8976: +case 0x8B76: +case 0x8D76: +case 0x8F76: +case 0x8177: +case 0x8377: +case 0x8577: +case 0x8777: +case 0x8977: +case 0x8B77: +case 0x8D77: +case 0x8F77: + +// ORDa +case 0x8170: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8378: +case 0x8578: +case 0x8778: +case 0x8978: +case 0x8B78: +case 0x8D78: +case 0x8F78: + +// ORDa +case 0x8178: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8379: +case 0x8579: +case 0x8779: +case 0x8979: +case 0x8B79: +case 0x8D79: +case 0x8F79: + +// ORDa +case 0x8179: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x835F: +case 0x855F: +case 0x875F: +case 0x895F: +case 0x8B5F: +case 0x8D5F: +case 0x8F5F: + +// ORDa +case 0x815F: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8367: +case 0x8567: +case 0x8767: +case 0x8967: +case 0x8B67: +case 0x8D67: +case 0x8F67: + +// ORDa +case 0x8167: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x8390: +case 0x8590: +case 0x8790: +case 0x8990: +case 0x8B90: +case 0x8D90: +case 0x8F90: +case 0x8191: +case 0x8391: +case 0x8591: +case 0x8791: +case 0x8991: +case 0x8B91: +case 0x8D91: +case 0x8F91: +case 0x8192: +case 0x8392: +case 0x8592: +case 0x8792: +case 0x8992: +case 0x8B92: +case 0x8D92: +case 0x8F92: +case 0x8193: +case 0x8393: +case 0x8593: +case 0x8793: +case 0x8993: +case 0x8B93: +case 0x8D93: +case 0x8F93: +case 0x8194: +case 0x8394: +case 0x8594: +case 0x8794: +case 0x8994: +case 0x8B94: +case 0x8D94: +case 0x8F94: +case 0x8195: +case 0x8395: +case 0x8595: +case 0x8795: +case 0x8995: +case 0x8B95: +case 0x8D95: +case 0x8F95: +case 0x8196: +case 0x8396: +case 0x8596: +case 0x8796: +case 0x8996: +case 0x8B96: +case 0x8D96: +case 0x8F96: +case 0x8197: +case 0x8397: +case 0x8597: +case 0x8797: +case 0x8997: +case 0x8B97: +case 0x8D97: +case 0x8F97: + +// ORDa +case 0x8190: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x8398: +case 0x8598: +case 0x8798: +case 0x8998: +case 0x8B98: +case 0x8D98: +case 0x8F98: +case 0x8199: +case 0x8399: +case 0x8599: +case 0x8799: +case 0x8999: +case 0x8B99: +case 0x8D99: +case 0x8F99: +case 0x819A: +case 0x839A: +case 0x859A: +case 0x879A: +case 0x899A: +case 0x8B9A: +case 0x8D9A: +case 0x8F9A: +case 0x819B: +case 0x839B: +case 0x859B: +case 0x879B: +case 0x899B: +case 0x8B9B: +case 0x8D9B: +case 0x8F9B: +case 0x819C: +case 0x839C: +case 0x859C: +case 0x879C: +case 0x899C: +case 0x8B9C: +case 0x8D9C: +case 0x8F9C: +case 0x819D: +case 0x839D: +case 0x859D: +case 0x879D: +case 0x899D: +case 0x8B9D: +case 0x8D9D: +case 0x8F9D: +case 0x819E: +case 0x839E: +case 0x859E: +case 0x879E: +case 0x899E: +case 0x8B9E: +case 0x8D9E: +case 0x8F9E: + +// ORDa +case 0x8198: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x83A0: +case 0x85A0: +case 0x87A0: +case 0x89A0: +case 0x8BA0: +case 0x8DA0: +case 0x8FA0: +case 0x81A1: +case 0x83A1: +case 0x85A1: +case 0x87A1: +case 0x89A1: +case 0x8BA1: +case 0x8DA1: +case 0x8FA1: +case 0x81A2: +case 0x83A2: +case 0x85A2: +case 0x87A2: +case 0x89A2: +case 0x8BA2: +case 0x8DA2: +case 0x8FA2: +case 0x81A3: +case 0x83A3: +case 0x85A3: +case 0x87A3: +case 0x89A3: +case 0x8BA3: +case 0x8DA3: +case 0x8FA3: +case 0x81A4: +case 0x83A4: +case 0x85A4: +case 0x87A4: +case 0x89A4: +case 0x8BA4: +case 0x8DA4: +case 0x8FA4: +case 0x81A5: +case 0x83A5: +case 0x85A5: +case 0x87A5: +case 0x89A5: +case 0x8BA5: +case 0x8DA5: +case 0x8FA5: +case 0x81A6: +case 0x83A6: +case 0x85A6: +case 0x87A6: +case 0x89A6: +case 0x8BA6: +case 0x8DA6: +case 0x8FA6: + +// ORDa +case 0x81A0: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x83A8: +case 0x85A8: +case 0x87A8: +case 0x89A8: +case 0x8BA8: +case 0x8DA8: +case 0x8FA8: +case 0x81A9: +case 0x83A9: +case 0x85A9: +case 0x87A9: +case 0x89A9: +case 0x8BA9: +case 0x8DA9: +case 0x8FA9: +case 0x81AA: +case 0x83AA: +case 0x85AA: +case 0x87AA: +case 0x89AA: +case 0x8BAA: +case 0x8DAA: +case 0x8FAA: +case 0x81AB: +case 0x83AB: +case 0x85AB: +case 0x87AB: +case 0x89AB: +case 0x8BAB: +case 0x8DAB: +case 0x8FAB: +case 0x81AC: +case 0x83AC: +case 0x85AC: +case 0x87AC: +case 0x89AC: +case 0x8BAC: +case 0x8DAC: +case 0x8FAC: +case 0x81AD: +case 0x83AD: +case 0x85AD: +case 0x87AD: +case 0x89AD: +case 0x8BAD: +case 0x8DAD: +case 0x8FAD: +case 0x81AE: +case 0x83AE: +case 0x85AE: +case 0x87AE: +case 0x89AE: +case 0x8BAE: +case 0x8DAE: +case 0x8FAE: +case 0x81AF: +case 0x83AF: +case 0x85AF: +case 0x87AF: +case 0x89AF: +case 0x8BAF: +case 0x8DAF: +case 0x8FAF: + +// ORDa +case 0x81A8: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x83B0: +case 0x85B0: +case 0x87B0: +case 0x89B0: +case 0x8BB0: +case 0x8DB0: +case 0x8FB0: +case 0x81B1: +case 0x83B1: +case 0x85B1: +case 0x87B1: +case 0x89B1: +case 0x8BB1: +case 0x8DB1: +case 0x8FB1: +case 0x81B2: +case 0x83B2: +case 0x85B2: +case 0x87B2: +case 0x89B2: +case 0x8BB2: +case 0x8DB2: +case 0x8FB2: +case 0x81B3: +case 0x83B3: +case 0x85B3: +case 0x87B3: +case 0x89B3: +case 0x8BB3: +case 0x8DB3: +case 0x8FB3: +case 0x81B4: +case 0x83B4: +case 0x85B4: +case 0x87B4: +case 0x89B4: +case 0x8BB4: +case 0x8DB4: +case 0x8FB4: +case 0x81B5: +case 0x83B5: +case 0x85B5: +case 0x87B5: +case 0x89B5: +case 0x8BB5: +case 0x8DB5: +case 0x8FB5: +case 0x81B6: +case 0x83B6: +case 0x85B6: +case 0x87B6: +case 0x89B6: +case 0x8BB6: +case 0x8DB6: +case 0x8FB6: +case 0x81B7: +case 0x83B7: +case 0x85B7: +case 0x87B7: +case 0x89B7: +case 0x8BB7: +case 0x8DB7: +case 0x8FB7: + +// ORDa +case 0x81B0: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x83B8: +case 0x85B8: +case 0x87B8: +case 0x89B8: +case 0x8BB8: +case 0x8DB8: +case 0x8FB8: + +// ORDa +case 0x81B8: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x83B9: +case 0x85B9: +case 0x87B9: +case 0x89B9: +case 0x8BB9: +case 0x8DB9: +case 0x8FB9: + +// ORDa +case 0x81B9: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x839F: +case 0x859F: +case 0x879F: +case 0x899F: +case 0x8B9F: +case 0x8D9F: +case 0x8F9F: + +// ORDa +case 0x819F: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x83A7: +case 0x85A7: +case 0x87A7: +case 0x89A7: +case 0x8BA7: +case 0x8DA7: +case 0x8FA7: + +// ORDa +case 0x81A7: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, res) + res |= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x8300: +case 0x8500: +case 0x8700: +case 0x8900: +case 0x8B00: +case 0x8D00: +case 0x8F00: +case 0x8101: +case 0x8301: +case 0x8501: +case 0x8701: +case 0x8901: +case 0x8B01: +case 0x8D01: +case 0x8F01: +case 0x8102: +case 0x8302: +case 0x8502: +case 0x8702: +case 0x8902: +case 0x8B02: +case 0x8D02: +case 0x8F02: +case 0x8103: +case 0x8303: +case 0x8503: +case 0x8703: +case 0x8903: +case 0x8B03: +case 0x8D03: +case 0x8F03: +case 0x8104: +case 0x8304: +case 0x8504: +case 0x8704: +case 0x8904: +case 0x8B04: +case 0x8D04: +case 0x8F04: +case 0x8105: +case 0x8305: +case 0x8505: +case 0x8705: +case 0x8905: +case 0x8B05: +case 0x8D05: +case 0x8F05: +case 0x8106: +case 0x8306: +case 0x8506: +case 0x8706: +case 0x8906: +case 0x8B06: +case 0x8D06: +case 0x8F06: +case 0x8107: +case 0x8307: +case 0x8507: +case 0x8707: +case 0x8907: +case 0x8B07: +case 0x8D07: +case 0x8F07: + +// SBCD +case 0x8100: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = (dst & 0xF) - (src & 0xF) - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res -= 6; + res += (dst & 0xF0) - (src & 0xF0); + if (res > 0x99) + { + res += 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0x8308: +case 0x8508: +case 0x8708: +case 0x8908: +case 0x8B08: +case 0x8D08: +case 0x8109: +case 0x8309: +case 0x8509: +case 0x8709: +case 0x8909: +case 0x8B09: +case 0x8D09: +case 0x810A: +case 0x830A: +case 0x850A: +case 0x870A: +case 0x890A: +case 0x8B0A: +case 0x8D0A: +case 0x810B: +case 0x830B: +case 0x850B: +case 0x870B: +case 0x890B: +case 0x8B0B: +case 0x8D0B: +case 0x810C: +case 0x830C: +case 0x850C: +case 0x870C: +case 0x890C: +case 0x8B0C: +case 0x8D0C: +case 0x810D: +case 0x830D: +case 0x850D: +case 0x870D: +case 0x890D: +case 0x8B0D: +case 0x8D0D: +case 0x810E: +case 0x830E: +case 0x850E: +case 0x870E: +case 0x890E: +case 0x8B0E: +case 0x8D0E: + +// SBCDM +case 0x8108: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) - (src & 0xF) - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res -= 6; + res += (dst & 0xF0) - (src & 0xF0); + if (res > 0x99) + { + res += 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0x830F: +case 0x850F: +case 0x870F: +case 0x890F: +case 0x8B0F: +case 0x8D0F: + +// SBCD7M +case 0x810F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) - (src & 0xF) - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res -= 6; + res += (dst & 0xF0) - (src & 0xF0); + if (res > 0x99) + { + res += 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0x8F09: +case 0x8F0A: +case 0x8F0B: +case 0x8F0C: +case 0x8F0D: +case 0x8F0E: + +// SBCDM7 +case 0x8F08: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) - (src & 0xF) - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res -= 6; + res += (dst & 0xF0) - (src & 0xF0); + if (res > 0x99) + { + res += 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) + +// SBCD7M7 +case 0x8F0F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) - (src & 0xF) - ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res -= 6; + res += (dst & 0xF0) - (src & 0xF0); + if (res > 0x99) + { + res += 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0x82C0: +case 0x84C0: +case 0x86C0: +case 0x88C0: +case 0x8AC0: +case 0x8CC0: +case 0x8EC0: +case 0x80C1: +case 0x82C1: +case 0x84C1: +case 0x86C1: +case 0x88C1: +case 0x8AC1: +case 0x8CC1: +case 0x8EC1: +case 0x80C2: +case 0x82C2: +case 0x84C2: +case 0x86C2: +case 0x88C2: +case 0x8AC2: +case 0x8CC2: +case 0x8EC2: +case 0x80C3: +case 0x82C3: +case 0x84C3: +case 0x86C3: +case 0x88C3: +case 0x8AC3: +case 0x8CC3: +case 0x8EC3: +case 0x80C4: +case 0x82C4: +case 0x84C4: +case 0x86C4: +case 0x88C4: +case 0x8AC4: +case 0x8CC4: +case 0x8EC4: +case 0x80C5: +case 0x82C5: +case 0x84C5: +case 0x86C5: +case 0x88C5: +case 0x8AC5: +case 0x8CC5: +case 0x8EC5: +case 0x80C6: +case 0x82C6: +case 0x84C6: +case 0x86C6: +case 0x88C6: +case 0x8AC6: +case 0x8CC6: +case 0x8EC6: +case 0x80C7: +case 0x82C7: +case 0x84C7: +case 0x86C7: +case 0x88C7: +case 0x8AC7: +case 0x8CC7: +case 0x8EC7: + +// DIVU +case 0x80C0: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82D0: +case 0x84D0: +case 0x86D0: +case 0x88D0: +case 0x8AD0: +case 0x8CD0: +case 0x8ED0: +case 0x80D1: +case 0x82D1: +case 0x84D1: +case 0x86D1: +case 0x88D1: +case 0x8AD1: +case 0x8CD1: +case 0x8ED1: +case 0x80D2: +case 0x82D2: +case 0x84D2: +case 0x86D2: +case 0x88D2: +case 0x8AD2: +case 0x8CD2: +case 0x8ED2: +case 0x80D3: +case 0x82D3: +case 0x84D3: +case 0x86D3: +case 0x88D3: +case 0x8AD3: +case 0x8CD3: +case 0x8ED3: +case 0x80D4: +case 0x82D4: +case 0x84D4: +case 0x86D4: +case 0x88D4: +case 0x8AD4: +case 0x8CD4: +case 0x8ED4: +case 0x80D5: +case 0x82D5: +case 0x84D5: +case 0x86D5: +case 0x88D5: +case 0x8AD5: +case 0x8CD5: +case 0x8ED5: +case 0x80D6: +case 0x82D6: +case 0x84D6: +case 0x86D6: +case 0x88D6: +case 0x8AD6: +case 0x8CD6: +case 0x8ED6: +case 0x80D7: +case 0x82D7: +case 0x84D7: +case 0x86D7: +case 0x88D7: +case 0x8AD7: +case 0x8CD7: +case 0x8ED7: + +// DIVU +case 0x80D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82D8: +case 0x84D8: +case 0x86D8: +case 0x88D8: +case 0x8AD8: +case 0x8CD8: +case 0x8ED8: +case 0x80D9: +case 0x82D9: +case 0x84D9: +case 0x86D9: +case 0x88D9: +case 0x8AD9: +case 0x8CD9: +case 0x8ED9: +case 0x80DA: +case 0x82DA: +case 0x84DA: +case 0x86DA: +case 0x88DA: +case 0x8ADA: +case 0x8CDA: +case 0x8EDA: +case 0x80DB: +case 0x82DB: +case 0x84DB: +case 0x86DB: +case 0x88DB: +case 0x8ADB: +case 0x8CDB: +case 0x8EDB: +case 0x80DC: +case 0x82DC: +case 0x84DC: +case 0x86DC: +case 0x88DC: +case 0x8ADC: +case 0x8CDC: +case 0x8EDC: +case 0x80DD: +case 0x82DD: +case 0x84DD: +case 0x86DD: +case 0x88DD: +case 0x8ADD: +case 0x8CDD: +case 0x8EDD: +case 0x80DE: +case 0x82DE: +case 0x84DE: +case 0x86DE: +case 0x88DE: +case 0x8ADE: +case 0x8CDE: +case 0x8EDE: + +// DIVU +case 0x80D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82E0: +case 0x84E0: +case 0x86E0: +case 0x88E0: +case 0x8AE0: +case 0x8CE0: +case 0x8EE0: +case 0x80E1: +case 0x82E1: +case 0x84E1: +case 0x86E1: +case 0x88E1: +case 0x8AE1: +case 0x8CE1: +case 0x8EE1: +case 0x80E2: +case 0x82E2: +case 0x84E2: +case 0x86E2: +case 0x88E2: +case 0x8AE2: +case 0x8CE2: +case 0x8EE2: +case 0x80E3: +case 0x82E3: +case 0x84E3: +case 0x86E3: +case 0x88E3: +case 0x8AE3: +case 0x8CE3: +case 0x8EE3: +case 0x80E4: +case 0x82E4: +case 0x84E4: +case 0x86E4: +case 0x88E4: +case 0x8AE4: +case 0x8CE4: +case 0x8EE4: +case 0x80E5: +case 0x82E5: +case 0x84E5: +case 0x86E5: +case 0x88E5: +case 0x8AE5: +case 0x8CE5: +case 0x8EE5: +case 0x80E6: +case 0x82E6: +case 0x84E6: +case 0x86E6: +case 0x88E6: +case 0x8AE6: +case 0x8CE6: +case 0x8EE6: + +// DIVU +case 0x80E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82E8: +case 0x84E8: +case 0x86E8: +case 0x88E8: +case 0x8AE8: +case 0x8CE8: +case 0x8EE8: +case 0x80E9: +case 0x82E9: +case 0x84E9: +case 0x86E9: +case 0x88E9: +case 0x8AE9: +case 0x8CE9: +case 0x8EE9: +case 0x80EA: +case 0x82EA: +case 0x84EA: +case 0x86EA: +case 0x88EA: +case 0x8AEA: +case 0x8CEA: +case 0x8EEA: +case 0x80EB: +case 0x82EB: +case 0x84EB: +case 0x86EB: +case 0x88EB: +case 0x8AEB: +case 0x8CEB: +case 0x8EEB: +case 0x80EC: +case 0x82EC: +case 0x84EC: +case 0x86EC: +case 0x88EC: +case 0x8AEC: +case 0x8CEC: +case 0x8EEC: +case 0x80ED: +case 0x82ED: +case 0x84ED: +case 0x86ED: +case 0x88ED: +case 0x8AED: +case 0x8CED: +case 0x8EED: +case 0x80EE: +case 0x82EE: +case 0x84EE: +case 0x86EE: +case 0x88EE: +case 0x8AEE: +case 0x8CEE: +case 0x8EEE: +case 0x80EF: +case 0x82EF: +case 0x84EF: +case 0x86EF: +case 0x88EF: +case 0x8AEF: +case 0x8CEF: +case 0x8EEF: + +// DIVU +case 0x80E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82F0: +case 0x84F0: +case 0x86F0: +case 0x88F0: +case 0x8AF0: +case 0x8CF0: +case 0x8EF0: +case 0x80F1: +case 0x82F1: +case 0x84F1: +case 0x86F1: +case 0x88F1: +case 0x8AF1: +case 0x8CF1: +case 0x8EF1: +case 0x80F2: +case 0x82F2: +case 0x84F2: +case 0x86F2: +case 0x88F2: +case 0x8AF2: +case 0x8CF2: +case 0x8EF2: +case 0x80F3: +case 0x82F3: +case 0x84F3: +case 0x86F3: +case 0x88F3: +case 0x8AF3: +case 0x8CF3: +case 0x8EF3: +case 0x80F4: +case 0x82F4: +case 0x84F4: +case 0x86F4: +case 0x88F4: +case 0x8AF4: +case 0x8CF4: +case 0x8EF4: +case 0x80F5: +case 0x82F5: +case 0x84F5: +case 0x86F5: +case 0x88F5: +case 0x8AF5: +case 0x8CF5: +case 0x8EF5: +case 0x80F6: +case 0x82F6: +case 0x84F6: +case 0x86F6: +case 0x88F6: +case 0x8AF6: +case 0x8CF6: +case 0x8EF6: +case 0x80F7: +case 0x82F7: +case 0x84F7: +case 0x86F7: +case 0x88F7: +case 0x8AF7: +case 0x8CF7: +case 0x8EF7: + +// DIVU +case 0x80F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82F8: +case 0x84F8: +case 0x86F8: +case 0x88F8: +case 0x8AF8: +case 0x8CF8: +case 0x8EF8: + +// DIVU +case 0x80F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82F9: +case 0x84F9: +case 0x86F9: +case 0x88F9: +case 0x8AF9: +case 0x8CF9: +case 0x8EF9: + +// DIVU +case 0x80F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82FA: +case 0x84FA: +case 0x86FA: +case 0x88FA: +case 0x8AFA: +case 0x8CFA: +case 0x8EFA: + +// DIVU +case 0x80FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82FB: +case 0x84FB: +case 0x86FB: +case 0x88FB: +case 0x8AFB: +case 0x8CFB: +case 0x8EFB: + +// DIVU +case 0x80FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82FC: +case 0x84FC: +case 0x86FC: +case 0x88FC: +case 0x8AFC: +case 0x8CFC: +case 0x8EFC: + +// DIVU +case 0x80FC: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_WORD; + PC += 2; + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(14) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(74) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(94) +case 0x82DF: +case 0x84DF: +case 0x86DF: +case 0x88DF: +case 0x8ADF: +case 0x8CDF: +case 0x8EDF: + +// DIVU +case 0x80DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x82E7: +case 0x84E7: +case 0x86E7: +case 0x88E7: +case 0x8AE7: +case 0x8CE7: +case 0x8EE7: + +// DIVU +case 0x80E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + { + u32 q, r; + + q = dst / src; + r = dst % src; + + if (q & 0xFFFF0000) + { + CPU->flag_V = C68K_SR_V; + RET(70) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(90) +case 0x83C0: +case 0x85C0: +case 0x87C0: +case 0x89C0: +case 0x8BC0: +case 0x8DC0: +case 0x8FC0: +case 0x81C1: +case 0x83C1: +case 0x85C1: +case 0x87C1: +case 0x89C1: +case 0x8BC1: +case 0x8DC1: +case 0x8FC1: +case 0x81C2: +case 0x83C2: +case 0x85C2: +case 0x87C2: +case 0x89C2: +case 0x8BC2: +case 0x8DC2: +case 0x8FC2: +case 0x81C3: +case 0x83C3: +case 0x85C3: +case 0x87C3: +case 0x89C3: +case 0x8BC3: +case 0x8DC3: +case 0x8FC3: +case 0x81C4: +case 0x83C4: +case 0x85C4: +case 0x87C4: +case 0x89C4: +case 0x8BC4: +case 0x8DC4: +case 0x8FC4: +case 0x81C5: +case 0x83C5: +case 0x85C5: +case 0x87C5: +case 0x89C5: +case 0x8BC5: +case 0x8DC5: +case 0x8FC5: +case 0x81C6: +case 0x83C6: +case 0x85C6: +case 0x87C6: +case 0x89C6: +case 0x8BC6: +case 0x8DC6: +case 0x8FC6: +case 0x81C7: +case 0x83C7: +case 0x85C7: +case 0x87C7: +case 0x89C7: +case 0x8BC7: +case 0x8DC7: +case 0x8FC7: + +// DIVS +case 0x81C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83D0: +case 0x85D0: +case 0x87D0: +case 0x89D0: +case 0x8BD0: +case 0x8DD0: +case 0x8FD0: +case 0x81D1: +case 0x83D1: +case 0x85D1: +case 0x87D1: +case 0x89D1: +case 0x8BD1: +case 0x8DD1: +case 0x8FD1: +case 0x81D2: +case 0x83D2: +case 0x85D2: +case 0x87D2: +case 0x89D2: +case 0x8BD2: +case 0x8DD2: +case 0x8FD2: +case 0x81D3: +case 0x83D3: +case 0x85D3: +case 0x87D3: +case 0x89D3: +case 0x8BD3: +case 0x8DD3: +case 0x8FD3: +case 0x81D4: +case 0x83D4: +case 0x85D4: +case 0x87D4: +case 0x89D4: +case 0x8BD4: +case 0x8DD4: +case 0x8FD4: +case 0x81D5: +case 0x83D5: +case 0x85D5: +case 0x87D5: +case 0x89D5: +case 0x8BD5: +case 0x8DD5: +case 0x8FD5: +case 0x81D6: +case 0x83D6: +case 0x85D6: +case 0x87D6: +case 0x89D6: +case 0x8BD6: +case 0x8DD6: +case 0x8FD6: +case 0x81D7: +case 0x83D7: +case 0x85D7: +case 0x87D7: +case 0x89D7: +case 0x8BD7: +case 0x8DD7: +case 0x8FD7: + +// DIVS +case 0x81D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83D8: +case 0x85D8: +case 0x87D8: +case 0x89D8: +case 0x8BD8: +case 0x8DD8: +case 0x8FD8: +case 0x81D9: +case 0x83D9: +case 0x85D9: +case 0x87D9: +case 0x89D9: +case 0x8BD9: +case 0x8DD9: +case 0x8FD9: +case 0x81DA: +case 0x83DA: +case 0x85DA: +case 0x87DA: +case 0x89DA: +case 0x8BDA: +case 0x8DDA: +case 0x8FDA: +case 0x81DB: +case 0x83DB: +case 0x85DB: +case 0x87DB: +case 0x89DB: +case 0x8BDB: +case 0x8DDB: +case 0x8FDB: +case 0x81DC: +case 0x83DC: +case 0x85DC: +case 0x87DC: +case 0x89DC: +case 0x8BDC: +case 0x8DDC: +case 0x8FDC: +case 0x81DD: +case 0x83DD: +case 0x85DD: +case 0x87DD: +case 0x89DD: +case 0x8BDD: +case 0x8DDD: +case 0x8FDD: +case 0x81DE: +case 0x83DE: +case 0x85DE: +case 0x87DE: +case 0x89DE: +case 0x8BDE: +case 0x8DDE: +case 0x8FDE: + +// DIVS +case 0x81D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83E0: +case 0x85E0: +case 0x87E0: +case 0x89E0: +case 0x8BE0: +case 0x8DE0: +case 0x8FE0: +case 0x81E1: +case 0x83E1: +case 0x85E1: +case 0x87E1: +case 0x89E1: +case 0x8BE1: +case 0x8DE1: +case 0x8FE1: +case 0x81E2: +case 0x83E2: +case 0x85E2: +case 0x87E2: +case 0x89E2: +case 0x8BE2: +case 0x8DE2: +case 0x8FE2: +case 0x81E3: +case 0x83E3: +case 0x85E3: +case 0x87E3: +case 0x89E3: +case 0x8BE3: +case 0x8DE3: +case 0x8FE3: +case 0x81E4: +case 0x83E4: +case 0x85E4: +case 0x87E4: +case 0x89E4: +case 0x8BE4: +case 0x8DE4: +case 0x8FE4: +case 0x81E5: +case 0x83E5: +case 0x85E5: +case 0x87E5: +case 0x89E5: +case 0x8BE5: +case 0x8DE5: +case 0x8FE5: +case 0x81E6: +case 0x83E6: +case 0x85E6: +case 0x87E6: +case 0x89E6: +case 0x8BE6: +case 0x8DE6: +case 0x8FE6: + +// DIVS +case 0x81E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83E8: +case 0x85E8: +case 0x87E8: +case 0x89E8: +case 0x8BE8: +case 0x8DE8: +case 0x8FE8: +case 0x81E9: +case 0x83E9: +case 0x85E9: +case 0x87E9: +case 0x89E9: +case 0x8BE9: +case 0x8DE9: +case 0x8FE9: +case 0x81EA: +case 0x83EA: +case 0x85EA: +case 0x87EA: +case 0x89EA: +case 0x8BEA: +case 0x8DEA: +case 0x8FEA: +case 0x81EB: +case 0x83EB: +case 0x85EB: +case 0x87EB: +case 0x89EB: +case 0x8BEB: +case 0x8DEB: +case 0x8FEB: +case 0x81EC: +case 0x83EC: +case 0x85EC: +case 0x87EC: +case 0x89EC: +case 0x8BEC: +case 0x8DEC: +case 0x8FEC: +case 0x81ED: +case 0x83ED: +case 0x85ED: +case 0x87ED: +case 0x89ED: +case 0x8BED: +case 0x8DED: +case 0x8FED: +case 0x81EE: +case 0x83EE: +case 0x85EE: +case 0x87EE: +case 0x89EE: +case 0x8BEE: +case 0x8DEE: +case 0x8FEE: +case 0x81EF: +case 0x83EF: +case 0x85EF: +case 0x87EF: +case 0x89EF: +case 0x8BEF: +case 0x8DEF: +case 0x8FEF: + +// DIVS +case 0x81E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83F0: +case 0x85F0: +case 0x87F0: +case 0x89F0: +case 0x8BF0: +case 0x8DF0: +case 0x8FF0: +case 0x81F1: +case 0x83F1: +case 0x85F1: +case 0x87F1: +case 0x89F1: +case 0x8BF1: +case 0x8DF1: +case 0x8FF1: +case 0x81F2: +case 0x83F2: +case 0x85F2: +case 0x87F2: +case 0x89F2: +case 0x8BF2: +case 0x8DF2: +case 0x8FF2: +case 0x81F3: +case 0x83F3: +case 0x85F3: +case 0x87F3: +case 0x89F3: +case 0x8BF3: +case 0x8DF3: +case 0x8FF3: +case 0x81F4: +case 0x83F4: +case 0x85F4: +case 0x87F4: +case 0x89F4: +case 0x8BF4: +case 0x8DF4: +case 0x8FF4: +case 0x81F5: +case 0x83F5: +case 0x85F5: +case 0x87F5: +case 0x89F5: +case 0x8BF5: +case 0x8DF5: +case 0x8FF5: +case 0x81F6: +case 0x83F6: +case 0x85F6: +case 0x87F6: +case 0x89F6: +case 0x8BF6: +case 0x8DF6: +case 0x8FF6: +case 0x81F7: +case 0x83F7: +case 0x85F7: +case 0x87F7: +case 0x89F7: +case 0x8BF7: +case 0x8DF7: +case 0x8FF7: + +// DIVS +case 0x81F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83F8: +case 0x85F8: +case 0x87F8: +case 0x89F8: +case 0x8BF8: +case 0x8DF8: +case 0x8FF8: + +// DIVS +case 0x81F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83F9: +case 0x85F9: +case 0x87F9: +case 0x89F9: +case 0x8BF9: +case 0x8DF9: +case 0x8FF9: + +// DIVS +case 0x81F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83FA: +case 0x85FA: +case 0x87FA: +case 0x89FA: +case 0x8BFA: +case 0x8DFA: +case 0x8FFA: + +// DIVS +case 0x81FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83FB: +case 0x85FB: +case 0x87FB: +case 0x89FB: +case 0x8BFB: +case 0x8DFB: +case 0x8FFB: + +// DIVS +case 0x81FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83FC: +case 0x85FC: +case 0x87FC: +case 0x89FC: +case 0x8BFC: +case 0x8DFC: +case 0x8FFC: + +// DIVS +case 0x81FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)FETCH_WORD; + PC += 2; + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(14) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(54) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(84) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(112) +case 0x83DF: +case 0x85DF: +case 0x87DF: +case 0x89DF: +case 0x8BDF: +case 0x8DDF: +case 0x8FDF: + +// DIVS +case 0x81DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) +case 0x83E7: +case 0x85E7: +case 0x87E7: +case 0x89E7: +case 0x8BE7: +case 0x8DE7: +case 0x8FE7: + +// DIVS +case 0x81E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READSX_WOat_F(adr, src) + if (src == 0) + { + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_ZERO_DIVIDE_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) + RET(10) + } + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + if ((dst == 0x80000000) && (src == (u32)-1)) + { + CPU->flag_notZ = CPU->flag_N = 0; + CPU->flag_V = CPU->flag_C = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + RET(50) + } + { + s32 q, r; + + q = (s32)dst / (s32)src; + r = (s32)dst % (s32)src; + + if ((q > 0x7FFF) || (q < -0x8000)) + { + CPU->flag_V = C68K_SR_V; + RET(80) + } + q &= 0x0000FFFF; + CPU->flag_notZ = q; + CPU->flag_N = q >> 8; + CPU->flag_V = CPU->flag_C = 0; + res = q | (r << 16); + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + } +} +RET(108) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_op9.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_op9.inc new file mode 100644 index 0000000000..cee1c0308f --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_op9.inc @@ -0,0 +1,5855 @@ +case 0x9200: +case 0x9400: +case 0x9600: +case 0x9800: +case 0x9A00: +case 0x9C00: +case 0x9E00: +case 0x9001: +case 0x9201: +case 0x9401: +case 0x9601: +case 0x9801: +case 0x9A01: +case 0x9C01: +case 0x9E01: +case 0x9002: +case 0x9202: +case 0x9402: +case 0x9602: +case 0x9802: +case 0x9A02: +case 0x9C02: +case 0x9E02: +case 0x9003: +case 0x9203: +case 0x9403: +case 0x9603: +case 0x9803: +case 0x9A03: +case 0x9C03: +case 0x9E03: +case 0x9004: +case 0x9204: +case 0x9404: +case 0x9604: +case 0x9804: +case 0x9A04: +case 0x9C04: +case 0x9E04: +case 0x9005: +case 0x9205: +case 0x9405: +case 0x9605: +case 0x9805: +case 0x9A05: +case 0x9C05: +case 0x9E05: +case 0x9006: +case 0x9206: +case 0x9406: +case 0x9606: +case 0x9806: +case 0x9A06: +case 0x9C06: +case 0x9E06: +case 0x9007: +case 0x9207: +case 0x9407: +case 0x9607: +case 0x9807: +case 0x9A07: +case 0x9C07: +case 0x9E07: + +// SUBaD +case 0x9000: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9208: +case 0x9408: +case 0x9608: +case 0x9808: +case 0x9A08: +case 0x9C08: +case 0x9E08: +case 0x9009: +case 0x9209: +case 0x9409: +case 0x9609: +case 0x9809: +case 0x9A09: +case 0x9C09: +case 0x9E09: +case 0x900A: +case 0x920A: +case 0x940A: +case 0x960A: +case 0x980A: +case 0x9A0A: +case 0x9C0A: +case 0x9E0A: +case 0x900B: +case 0x920B: +case 0x940B: +case 0x960B: +case 0x980B: +case 0x9A0B: +case 0x9C0B: +case 0x9E0B: +case 0x900C: +case 0x920C: +case 0x940C: +case 0x960C: +case 0x980C: +case 0x9A0C: +case 0x9C0C: +case 0x9E0C: +case 0x900D: +case 0x920D: +case 0x940D: +case 0x960D: +case 0x980D: +case 0x9A0D: +case 0x9C0D: +case 0x9E0D: +case 0x900E: +case 0x920E: +case 0x940E: +case 0x960E: +case 0x980E: +case 0x9A0E: +case 0x9C0E: +case 0x9E0E: +case 0x900F: +case 0x920F: +case 0x940F: +case 0x960F: +case 0x980F: +case 0x9A0F: +case 0x9C0F: +case 0x9E0F: + +// SUBaD +case 0x9008: +{ + u32 res; + u32 dst; + u32 src; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9210: +case 0x9410: +case 0x9610: +case 0x9810: +case 0x9A10: +case 0x9C10: +case 0x9E10: +case 0x9011: +case 0x9211: +case 0x9411: +case 0x9611: +case 0x9811: +case 0x9A11: +case 0x9C11: +case 0x9E11: +case 0x9012: +case 0x9212: +case 0x9412: +case 0x9612: +case 0x9812: +case 0x9A12: +case 0x9C12: +case 0x9E12: +case 0x9013: +case 0x9213: +case 0x9413: +case 0x9613: +case 0x9813: +case 0x9A13: +case 0x9C13: +case 0x9E13: +case 0x9014: +case 0x9214: +case 0x9414: +case 0x9614: +case 0x9814: +case 0x9A14: +case 0x9C14: +case 0x9E14: +case 0x9015: +case 0x9215: +case 0x9415: +case 0x9615: +case 0x9815: +case 0x9A15: +case 0x9C15: +case 0x9E15: +case 0x9016: +case 0x9216: +case 0x9416: +case 0x9616: +case 0x9816: +case 0x9A16: +case 0x9C16: +case 0x9E16: +case 0x9017: +case 0x9217: +case 0x9417: +case 0x9617: +case 0x9817: +case 0x9A17: +case 0x9C17: +case 0x9E17: + +// SUBaD +case 0x9010: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9218: +case 0x9418: +case 0x9618: +case 0x9818: +case 0x9A18: +case 0x9C18: +case 0x9E18: +case 0x9019: +case 0x9219: +case 0x9419: +case 0x9619: +case 0x9819: +case 0x9A19: +case 0x9C19: +case 0x9E19: +case 0x901A: +case 0x921A: +case 0x941A: +case 0x961A: +case 0x981A: +case 0x9A1A: +case 0x9C1A: +case 0x9E1A: +case 0x901B: +case 0x921B: +case 0x941B: +case 0x961B: +case 0x981B: +case 0x9A1B: +case 0x9C1B: +case 0x9E1B: +case 0x901C: +case 0x921C: +case 0x941C: +case 0x961C: +case 0x981C: +case 0x9A1C: +case 0x9C1C: +case 0x9E1C: +case 0x901D: +case 0x921D: +case 0x941D: +case 0x961D: +case 0x981D: +case 0x9A1D: +case 0x9C1D: +case 0x9E1D: +case 0x901E: +case 0x921E: +case 0x941E: +case 0x961E: +case 0x981E: +case 0x9A1E: +case 0x9C1E: +case 0x9E1E: + +// SUBaD +case 0x9018: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9220: +case 0x9420: +case 0x9620: +case 0x9820: +case 0x9A20: +case 0x9C20: +case 0x9E20: +case 0x9021: +case 0x9221: +case 0x9421: +case 0x9621: +case 0x9821: +case 0x9A21: +case 0x9C21: +case 0x9E21: +case 0x9022: +case 0x9222: +case 0x9422: +case 0x9622: +case 0x9822: +case 0x9A22: +case 0x9C22: +case 0x9E22: +case 0x9023: +case 0x9223: +case 0x9423: +case 0x9623: +case 0x9823: +case 0x9A23: +case 0x9C23: +case 0x9E23: +case 0x9024: +case 0x9224: +case 0x9424: +case 0x9624: +case 0x9824: +case 0x9A24: +case 0x9C24: +case 0x9E24: +case 0x9025: +case 0x9225: +case 0x9425: +case 0x9625: +case 0x9825: +case 0x9A25: +case 0x9C25: +case 0x9E25: +case 0x9026: +case 0x9226: +case 0x9426: +case 0x9626: +case 0x9826: +case 0x9A26: +case 0x9C26: +case 0x9E26: + +// SUBaD +case 0x9020: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9228: +case 0x9428: +case 0x9628: +case 0x9828: +case 0x9A28: +case 0x9C28: +case 0x9E28: +case 0x9029: +case 0x9229: +case 0x9429: +case 0x9629: +case 0x9829: +case 0x9A29: +case 0x9C29: +case 0x9E29: +case 0x902A: +case 0x922A: +case 0x942A: +case 0x962A: +case 0x982A: +case 0x9A2A: +case 0x9C2A: +case 0x9E2A: +case 0x902B: +case 0x922B: +case 0x942B: +case 0x962B: +case 0x982B: +case 0x9A2B: +case 0x9C2B: +case 0x9E2B: +case 0x902C: +case 0x922C: +case 0x942C: +case 0x962C: +case 0x982C: +case 0x9A2C: +case 0x9C2C: +case 0x9E2C: +case 0x902D: +case 0x922D: +case 0x942D: +case 0x962D: +case 0x982D: +case 0x9A2D: +case 0x9C2D: +case 0x9E2D: +case 0x902E: +case 0x922E: +case 0x942E: +case 0x962E: +case 0x982E: +case 0x9A2E: +case 0x9C2E: +case 0x9E2E: +case 0x902F: +case 0x922F: +case 0x942F: +case 0x962F: +case 0x982F: +case 0x9A2F: +case 0x9C2F: +case 0x9E2F: + +// SUBaD +case 0x9028: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9230: +case 0x9430: +case 0x9630: +case 0x9830: +case 0x9A30: +case 0x9C30: +case 0x9E30: +case 0x9031: +case 0x9231: +case 0x9431: +case 0x9631: +case 0x9831: +case 0x9A31: +case 0x9C31: +case 0x9E31: +case 0x9032: +case 0x9232: +case 0x9432: +case 0x9632: +case 0x9832: +case 0x9A32: +case 0x9C32: +case 0x9E32: +case 0x9033: +case 0x9233: +case 0x9433: +case 0x9633: +case 0x9833: +case 0x9A33: +case 0x9C33: +case 0x9E33: +case 0x9034: +case 0x9234: +case 0x9434: +case 0x9634: +case 0x9834: +case 0x9A34: +case 0x9C34: +case 0x9E34: +case 0x9035: +case 0x9235: +case 0x9435: +case 0x9635: +case 0x9835: +case 0x9A35: +case 0x9C35: +case 0x9E35: +case 0x9036: +case 0x9236: +case 0x9436: +case 0x9636: +case 0x9836: +case 0x9A36: +case 0x9C36: +case 0x9E36: +case 0x9037: +case 0x9237: +case 0x9437: +case 0x9637: +case 0x9837: +case 0x9A37: +case 0x9C37: +case 0x9E37: + +// SUBaD +case 0x9030: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9238: +case 0x9438: +case 0x9638: +case 0x9838: +case 0x9A38: +case 0x9C38: +case 0x9E38: + +// SUBaD +case 0x9038: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9239: +case 0x9439: +case 0x9639: +case 0x9839: +case 0x9A39: +case 0x9C39: +case 0x9E39: + +// SUBaD +case 0x9039: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x923A: +case 0x943A: +case 0x963A: +case 0x983A: +case 0x9A3A: +case 0x9C3A: +case 0x9E3A: + +// SUBaD +case 0x903A: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x923B: +case 0x943B: +case 0x963B: +case 0x983B: +case 0x9A3B: +case 0x9C3B: +case 0x9E3B: + +// SUBaD +case 0x903B: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x923C: +case 0x943C: +case 0x963C: +case 0x983C: +case 0x9A3C: +case 0x9C3C: +case 0x9E3C: + +// SUBaD +case 0x903C: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_BYTE; + PC += 2; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0x921F: +case 0x941F: +case 0x961F: +case 0x981F: +case 0x9A1F: +case 0x9C1F: +case 0x9E1F: + +// SUBaD +case 0x901F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9227: +case 0x9427: +case 0x9627: +case 0x9827: +case 0x9A27: +case 0x9C27: +case 0x9E27: + +// SUBaD +case 0x9027: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9240: +case 0x9440: +case 0x9640: +case 0x9840: +case 0x9A40: +case 0x9C40: +case 0x9E40: +case 0x9041: +case 0x9241: +case 0x9441: +case 0x9641: +case 0x9841: +case 0x9A41: +case 0x9C41: +case 0x9E41: +case 0x9042: +case 0x9242: +case 0x9442: +case 0x9642: +case 0x9842: +case 0x9A42: +case 0x9C42: +case 0x9E42: +case 0x9043: +case 0x9243: +case 0x9443: +case 0x9643: +case 0x9843: +case 0x9A43: +case 0x9C43: +case 0x9E43: +case 0x9044: +case 0x9244: +case 0x9444: +case 0x9644: +case 0x9844: +case 0x9A44: +case 0x9C44: +case 0x9E44: +case 0x9045: +case 0x9245: +case 0x9445: +case 0x9645: +case 0x9845: +case 0x9A45: +case 0x9C45: +case 0x9E45: +case 0x9046: +case 0x9246: +case 0x9446: +case 0x9646: +case 0x9846: +case 0x9A46: +case 0x9C46: +case 0x9E46: +case 0x9047: +case 0x9247: +case 0x9447: +case 0x9647: +case 0x9847: +case 0x9A47: +case 0x9C47: +case 0x9E47: + +// SUBaD +case 0x9040: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9248: +case 0x9448: +case 0x9648: +case 0x9848: +case 0x9A48: +case 0x9C48: +case 0x9E48: +case 0x9049: +case 0x9249: +case 0x9449: +case 0x9649: +case 0x9849: +case 0x9A49: +case 0x9C49: +case 0x9E49: +case 0x904A: +case 0x924A: +case 0x944A: +case 0x964A: +case 0x984A: +case 0x9A4A: +case 0x9C4A: +case 0x9E4A: +case 0x904B: +case 0x924B: +case 0x944B: +case 0x964B: +case 0x984B: +case 0x9A4B: +case 0x9C4B: +case 0x9E4B: +case 0x904C: +case 0x924C: +case 0x944C: +case 0x964C: +case 0x984C: +case 0x9A4C: +case 0x9C4C: +case 0x9E4C: +case 0x904D: +case 0x924D: +case 0x944D: +case 0x964D: +case 0x984D: +case 0x9A4D: +case 0x9C4D: +case 0x9E4D: +case 0x904E: +case 0x924E: +case 0x944E: +case 0x964E: +case 0x984E: +case 0x9A4E: +case 0x9C4E: +case 0x9E4E: +case 0x904F: +case 0x924F: +case 0x944F: +case 0x964F: +case 0x984F: +case 0x9A4F: +case 0x9C4F: +case 0x9E4F: + +// SUBaD +case 0x9048: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->A[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9250: +case 0x9450: +case 0x9650: +case 0x9850: +case 0x9A50: +case 0x9C50: +case 0x9E50: +case 0x9051: +case 0x9251: +case 0x9451: +case 0x9651: +case 0x9851: +case 0x9A51: +case 0x9C51: +case 0x9E51: +case 0x9052: +case 0x9252: +case 0x9452: +case 0x9652: +case 0x9852: +case 0x9A52: +case 0x9C52: +case 0x9E52: +case 0x9053: +case 0x9253: +case 0x9453: +case 0x9653: +case 0x9853: +case 0x9A53: +case 0x9C53: +case 0x9E53: +case 0x9054: +case 0x9254: +case 0x9454: +case 0x9654: +case 0x9854: +case 0x9A54: +case 0x9C54: +case 0x9E54: +case 0x9055: +case 0x9255: +case 0x9455: +case 0x9655: +case 0x9855: +case 0x9A55: +case 0x9C55: +case 0x9E55: +case 0x9056: +case 0x9256: +case 0x9456: +case 0x9656: +case 0x9856: +case 0x9A56: +case 0x9C56: +case 0x9E56: +case 0x9057: +case 0x9257: +case 0x9457: +case 0x9657: +case 0x9857: +case 0x9A57: +case 0x9C57: +case 0x9E57: + +// SUBaD +case 0x9050: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9258: +case 0x9458: +case 0x9658: +case 0x9858: +case 0x9A58: +case 0x9C58: +case 0x9E58: +case 0x9059: +case 0x9259: +case 0x9459: +case 0x9659: +case 0x9859: +case 0x9A59: +case 0x9C59: +case 0x9E59: +case 0x905A: +case 0x925A: +case 0x945A: +case 0x965A: +case 0x985A: +case 0x9A5A: +case 0x9C5A: +case 0x9E5A: +case 0x905B: +case 0x925B: +case 0x945B: +case 0x965B: +case 0x985B: +case 0x9A5B: +case 0x9C5B: +case 0x9E5B: +case 0x905C: +case 0x925C: +case 0x945C: +case 0x965C: +case 0x985C: +case 0x9A5C: +case 0x9C5C: +case 0x9E5C: +case 0x905D: +case 0x925D: +case 0x945D: +case 0x965D: +case 0x985D: +case 0x9A5D: +case 0x9C5D: +case 0x9E5D: +case 0x905E: +case 0x925E: +case 0x945E: +case 0x965E: +case 0x985E: +case 0x9A5E: +case 0x9C5E: +case 0x9E5E: + +// SUBaD +case 0x9058: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9260: +case 0x9460: +case 0x9660: +case 0x9860: +case 0x9A60: +case 0x9C60: +case 0x9E60: +case 0x9061: +case 0x9261: +case 0x9461: +case 0x9661: +case 0x9861: +case 0x9A61: +case 0x9C61: +case 0x9E61: +case 0x9062: +case 0x9262: +case 0x9462: +case 0x9662: +case 0x9862: +case 0x9A62: +case 0x9C62: +case 0x9E62: +case 0x9063: +case 0x9263: +case 0x9463: +case 0x9663: +case 0x9863: +case 0x9A63: +case 0x9C63: +case 0x9E63: +case 0x9064: +case 0x9264: +case 0x9464: +case 0x9664: +case 0x9864: +case 0x9A64: +case 0x9C64: +case 0x9E64: +case 0x9065: +case 0x9265: +case 0x9465: +case 0x9665: +case 0x9865: +case 0x9A65: +case 0x9C65: +case 0x9E65: +case 0x9066: +case 0x9266: +case 0x9466: +case 0x9666: +case 0x9866: +case 0x9A66: +case 0x9C66: +case 0x9E66: + +// SUBaD +case 0x9060: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9268: +case 0x9468: +case 0x9668: +case 0x9868: +case 0x9A68: +case 0x9C68: +case 0x9E68: +case 0x9069: +case 0x9269: +case 0x9469: +case 0x9669: +case 0x9869: +case 0x9A69: +case 0x9C69: +case 0x9E69: +case 0x906A: +case 0x926A: +case 0x946A: +case 0x966A: +case 0x986A: +case 0x9A6A: +case 0x9C6A: +case 0x9E6A: +case 0x906B: +case 0x926B: +case 0x946B: +case 0x966B: +case 0x986B: +case 0x9A6B: +case 0x9C6B: +case 0x9E6B: +case 0x906C: +case 0x926C: +case 0x946C: +case 0x966C: +case 0x986C: +case 0x9A6C: +case 0x9C6C: +case 0x9E6C: +case 0x906D: +case 0x926D: +case 0x946D: +case 0x966D: +case 0x986D: +case 0x9A6D: +case 0x9C6D: +case 0x9E6D: +case 0x906E: +case 0x926E: +case 0x946E: +case 0x966E: +case 0x986E: +case 0x9A6E: +case 0x9C6E: +case 0x9E6E: +case 0x906F: +case 0x926F: +case 0x946F: +case 0x966F: +case 0x986F: +case 0x9A6F: +case 0x9C6F: +case 0x9E6F: + +// SUBaD +case 0x9068: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9270: +case 0x9470: +case 0x9670: +case 0x9870: +case 0x9A70: +case 0x9C70: +case 0x9E70: +case 0x9071: +case 0x9271: +case 0x9471: +case 0x9671: +case 0x9871: +case 0x9A71: +case 0x9C71: +case 0x9E71: +case 0x9072: +case 0x9272: +case 0x9472: +case 0x9672: +case 0x9872: +case 0x9A72: +case 0x9C72: +case 0x9E72: +case 0x9073: +case 0x9273: +case 0x9473: +case 0x9673: +case 0x9873: +case 0x9A73: +case 0x9C73: +case 0x9E73: +case 0x9074: +case 0x9274: +case 0x9474: +case 0x9674: +case 0x9874: +case 0x9A74: +case 0x9C74: +case 0x9E74: +case 0x9075: +case 0x9275: +case 0x9475: +case 0x9675: +case 0x9875: +case 0x9A75: +case 0x9C75: +case 0x9E75: +case 0x9076: +case 0x9276: +case 0x9476: +case 0x9676: +case 0x9876: +case 0x9A76: +case 0x9C76: +case 0x9E76: +case 0x9077: +case 0x9277: +case 0x9477: +case 0x9677: +case 0x9877: +case 0x9A77: +case 0x9C77: +case 0x9E77: + +// SUBaD +case 0x9070: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9278: +case 0x9478: +case 0x9678: +case 0x9878: +case 0x9A78: +case 0x9C78: +case 0x9E78: + +// SUBaD +case 0x9078: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9279: +case 0x9479: +case 0x9679: +case 0x9879: +case 0x9A79: +case 0x9C79: +case 0x9E79: + +// SUBaD +case 0x9079: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x927A: +case 0x947A: +case 0x967A: +case 0x987A: +case 0x9A7A: +case 0x9C7A: +case 0x9E7A: + +// SUBaD +case 0x907A: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x927B: +case 0x947B: +case 0x967B: +case 0x987B: +case 0x9A7B: +case 0x9C7B: +case 0x9E7B: + +// SUBaD +case 0x907B: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x927C: +case 0x947C: +case 0x967C: +case 0x987C: +case 0x9A7C: +case 0x9C7C: +case 0x9E7C: + +// SUBaD +case 0x907C: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_WORD; + PC += 2; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0x925F: +case 0x945F: +case 0x965F: +case 0x985F: +case 0x9A5F: +case 0x9C5F: +case 0x9E5F: + +// SUBaD +case 0x905F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9267: +case 0x9467: +case 0x9667: +case 0x9867: +case 0x9A67: +case 0x9C67: +case 0x9E67: + +// SUBaD +case 0x9067: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9280: +case 0x9480: +case 0x9680: +case 0x9880: +case 0x9A80: +case 0x9C80: +case 0x9E80: +case 0x9081: +case 0x9281: +case 0x9481: +case 0x9681: +case 0x9881: +case 0x9A81: +case 0x9C81: +case 0x9E81: +case 0x9082: +case 0x9282: +case 0x9482: +case 0x9682: +case 0x9882: +case 0x9A82: +case 0x9C82: +case 0x9E82: +case 0x9083: +case 0x9283: +case 0x9483: +case 0x9683: +case 0x9883: +case 0x9A83: +case 0x9C83: +case 0x9E83: +case 0x9084: +case 0x9284: +case 0x9484: +case 0x9684: +case 0x9884: +case 0x9A84: +case 0x9C84: +case 0x9E84: +case 0x9085: +case 0x9285: +case 0x9485: +case 0x9685: +case 0x9885: +case 0x9A85: +case 0x9C85: +case 0x9E85: +case 0x9086: +case 0x9286: +case 0x9486: +case 0x9686: +case 0x9886: +case 0x9A86: +case 0x9C86: +case 0x9E86: +case 0x9087: +case 0x9287: +case 0x9487: +case 0x9687: +case 0x9887: +case 0x9A87: +case 0x9C87: +case 0x9E87: + +// SUBaD +case 0x9080: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0x9288: +case 0x9488: +case 0x9688: +case 0x9888: +case 0x9A88: +case 0x9C88: +case 0x9E88: +case 0x9089: +case 0x9289: +case 0x9489: +case 0x9689: +case 0x9889: +case 0x9A89: +case 0x9C89: +case 0x9E89: +case 0x908A: +case 0x928A: +case 0x948A: +case 0x968A: +case 0x988A: +case 0x9A8A: +case 0x9C8A: +case 0x9E8A: +case 0x908B: +case 0x928B: +case 0x948B: +case 0x968B: +case 0x988B: +case 0x9A8B: +case 0x9C8B: +case 0x9E8B: +case 0x908C: +case 0x928C: +case 0x948C: +case 0x968C: +case 0x988C: +case 0x9A8C: +case 0x9C8C: +case 0x9E8C: +case 0x908D: +case 0x928D: +case 0x948D: +case 0x968D: +case 0x988D: +case 0x9A8D: +case 0x9C8D: +case 0x9E8D: +case 0x908E: +case 0x928E: +case 0x948E: +case 0x968E: +case 0x988E: +case 0x9A8E: +case 0x9C8E: +case 0x9E8E: +case 0x908F: +case 0x928F: +case 0x948F: +case 0x968F: +case 0x988F: +case 0x9A8F: +case 0x9C8F: +case 0x9E8F: + +// SUBaD +case 0x9088: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0x9290: +case 0x9490: +case 0x9690: +case 0x9890: +case 0x9A90: +case 0x9C90: +case 0x9E90: +case 0x9091: +case 0x9291: +case 0x9491: +case 0x9691: +case 0x9891: +case 0x9A91: +case 0x9C91: +case 0x9E91: +case 0x9092: +case 0x9292: +case 0x9492: +case 0x9692: +case 0x9892: +case 0x9A92: +case 0x9C92: +case 0x9E92: +case 0x9093: +case 0x9293: +case 0x9493: +case 0x9693: +case 0x9893: +case 0x9A93: +case 0x9C93: +case 0x9E93: +case 0x9094: +case 0x9294: +case 0x9494: +case 0x9694: +case 0x9894: +case 0x9A94: +case 0x9C94: +case 0x9E94: +case 0x9095: +case 0x9295: +case 0x9495: +case 0x9695: +case 0x9895: +case 0x9A95: +case 0x9C95: +case 0x9E95: +case 0x9096: +case 0x9296: +case 0x9496: +case 0x9696: +case 0x9896: +case 0x9A96: +case 0x9C96: +case 0x9E96: +case 0x9097: +case 0x9297: +case 0x9497: +case 0x9697: +case 0x9897: +case 0x9A97: +case 0x9C97: +case 0x9E97: + +// SUBaD +case 0x9090: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9298: +case 0x9498: +case 0x9698: +case 0x9898: +case 0x9A98: +case 0x9C98: +case 0x9E98: +case 0x9099: +case 0x9299: +case 0x9499: +case 0x9699: +case 0x9899: +case 0x9A99: +case 0x9C99: +case 0x9E99: +case 0x909A: +case 0x929A: +case 0x949A: +case 0x969A: +case 0x989A: +case 0x9A9A: +case 0x9C9A: +case 0x9E9A: +case 0x909B: +case 0x929B: +case 0x949B: +case 0x969B: +case 0x989B: +case 0x9A9B: +case 0x9C9B: +case 0x9E9B: +case 0x909C: +case 0x929C: +case 0x949C: +case 0x969C: +case 0x989C: +case 0x9A9C: +case 0x9C9C: +case 0x9E9C: +case 0x909D: +case 0x929D: +case 0x949D: +case 0x969D: +case 0x989D: +case 0x9A9D: +case 0x9C9D: +case 0x9E9D: +case 0x909E: +case 0x929E: +case 0x949E: +case 0x969E: +case 0x989E: +case 0x9A9E: +case 0x9C9E: +case 0x9E9E: + +// SUBaD +case 0x9098: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92A0: +case 0x94A0: +case 0x96A0: +case 0x98A0: +case 0x9AA0: +case 0x9CA0: +case 0x9EA0: +case 0x90A1: +case 0x92A1: +case 0x94A1: +case 0x96A1: +case 0x98A1: +case 0x9AA1: +case 0x9CA1: +case 0x9EA1: +case 0x90A2: +case 0x92A2: +case 0x94A2: +case 0x96A2: +case 0x98A2: +case 0x9AA2: +case 0x9CA2: +case 0x9EA2: +case 0x90A3: +case 0x92A3: +case 0x94A3: +case 0x96A3: +case 0x98A3: +case 0x9AA3: +case 0x9CA3: +case 0x9EA3: +case 0x90A4: +case 0x92A4: +case 0x94A4: +case 0x96A4: +case 0x98A4: +case 0x9AA4: +case 0x9CA4: +case 0x9EA4: +case 0x90A5: +case 0x92A5: +case 0x94A5: +case 0x96A5: +case 0x98A5: +case 0x9AA5: +case 0x9CA5: +case 0x9EA5: +case 0x90A6: +case 0x92A6: +case 0x94A6: +case 0x96A6: +case 0x98A6: +case 0x9AA6: +case 0x9CA6: +case 0x9EA6: + +// SUBaD +case 0x90A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92A8: +case 0x94A8: +case 0x96A8: +case 0x98A8: +case 0x9AA8: +case 0x9CA8: +case 0x9EA8: +case 0x90A9: +case 0x92A9: +case 0x94A9: +case 0x96A9: +case 0x98A9: +case 0x9AA9: +case 0x9CA9: +case 0x9EA9: +case 0x90AA: +case 0x92AA: +case 0x94AA: +case 0x96AA: +case 0x98AA: +case 0x9AAA: +case 0x9CAA: +case 0x9EAA: +case 0x90AB: +case 0x92AB: +case 0x94AB: +case 0x96AB: +case 0x98AB: +case 0x9AAB: +case 0x9CAB: +case 0x9EAB: +case 0x90AC: +case 0x92AC: +case 0x94AC: +case 0x96AC: +case 0x98AC: +case 0x9AAC: +case 0x9CAC: +case 0x9EAC: +case 0x90AD: +case 0x92AD: +case 0x94AD: +case 0x96AD: +case 0x98AD: +case 0x9AAD: +case 0x9CAD: +case 0x9EAD: +case 0x90AE: +case 0x92AE: +case 0x94AE: +case 0x96AE: +case 0x98AE: +case 0x9AAE: +case 0x9CAE: +case 0x9EAE: +case 0x90AF: +case 0x92AF: +case 0x94AF: +case 0x96AF: +case 0x98AF: +case 0x9AAF: +case 0x9CAF: +case 0x9EAF: + +// SUBaD +case 0x90A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92B0: +case 0x94B0: +case 0x96B0: +case 0x98B0: +case 0x9AB0: +case 0x9CB0: +case 0x9EB0: +case 0x90B1: +case 0x92B1: +case 0x94B1: +case 0x96B1: +case 0x98B1: +case 0x9AB1: +case 0x9CB1: +case 0x9EB1: +case 0x90B2: +case 0x92B2: +case 0x94B2: +case 0x96B2: +case 0x98B2: +case 0x9AB2: +case 0x9CB2: +case 0x9EB2: +case 0x90B3: +case 0x92B3: +case 0x94B3: +case 0x96B3: +case 0x98B3: +case 0x9AB3: +case 0x9CB3: +case 0x9EB3: +case 0x90B4: +case 0x92B4: +case 0x94B4: +case 0x96B4: +case 0x98B4: +case 0x9AB4: +case 0x9CB4: +case 0x9EB4: +case 0x90B5: +case 0x92B5: +case 0x94B5: +case 0x96B5: +case 0x98B5: +case 0x9AB5: +case 0x9CB5: +case 0x9EB5: +case 0x90B6: +case 0x92B6: +case 0x94B6: +case 0x96B6: +case 0x98B6: +case 0x9AB6: +case 0x9CB6: +case 0x9EB6: +case 0x90B7: +case 0x92B7: +case 0x94B7: +case 0x96B7: +case 0x98B7: +case 0x9AB7: +case 0x9CB7: +case 0x9EB7: + +// SUBaD +case 0x90B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92B8: +case 0x94B8: +case 0x96B8: +case 0x98B8: +case 0x9AB8: +case 0x9CB8: +case 0x9EB8: + +// SUBaD +case 0x90B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92B9: +case 0x94B9: +case 0x96B9: +case 0x98B9: +case 0x9AB9: +case 0x9CB9: +case 0x9EB9: + +// SUBaD +case 0x90B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92BA: +case 0x94BA: +case 0x96BA: +case 0x98BA: +case 0x9ABA: +case 0x9CBA: +case 0x9EBA: + +// SUBaD +case 0x90BA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92BB: +case 0x94BB: +case 0x96BB: +case 0x98BB: +case 0x9ABB: +case 0x9CBB: +case 0x9EBB: + +// SUBaD +case 0x90BB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92BC: +case 0x94BC: +case 0x96BC: +case 0x98BC: +case 0x9ABC: +case 0x9CBC: +case 0x9EBC: + +// SUBaD +case 0x90BC: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_LONG; + PC += 4; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(14) +case 0x929F: +case 0x949F: +case 0x969F: +case 0x989F: +case 0x9A9F: +case 0x9C9F: +case 0x9E9F: + +// SUBaD +case 0x909F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x92A7: +case 0x94A7: +case 0x96A7: +case 0x98A7: +case 0x9AA7: +case 0x9CA7: +case 0x9EA7: + +// SUBaD +case 0x90A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9310: +case 0x9510: +case 0x9710: +case 0x9910: +case 0x9B10: +case 0x9D10: +case 0x9F10: +case 0x9111: +case 0x9311: +case 0x9511: +case 0x9711: +case 0x9911: +case 0x9B11: +case 0x9D11: +case 0x9F11: +case 0x9112: +case 0x9312: +case 0x9512: +case 0x9712: +case 0x9912: +case 0x9B12: +case 0x9D12: +case 0x9F12: +case 0x9113: +case 0x9313: +case 0x9513: +case 0x9713: +case 0x9913: +case 0x9B13: +case 0x9D13: +case 0x9F13: +case 0x9114: +case 0x9314: +case 0x9514: +case 0x9714: +case 0x9914: +case 0x9B14: +case 0x9D14: +case 0x9F14: +case 0x9115: +case 0x9315: +case 0x9515: +case 0x9715: +case 0x9915: +case 0x9B15: +case 0x9D15: +case 0x9F15: +case 0x9116: +case 0x9316: +case 0x9516: +case 0x9716: +case 0x9916: +case 0x9B16: +case 0x9D16: +case 0x9F16: +case 0x9117: +case 0x9317: +case 0x9517: +case 0x9717: +case 0x9917: +case 0x9B17: +case 0x9D17: +case 0x9F17: + +// SUBDa +case 0x9110: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9318: +case 0x9518: +case 0x9718: +case 0x9918: +case 0x9B18: +case 0x9D18: +case 0x9F18: +case 0x9119: +case 0x9319: +case 0x9519: +case 0x9719: +case 0x9919: +case 0x9B19: +case 0x9D19: +case 0x9F19: +case 0x911A: +case 0x931A: +case 0x951A: +case 0x971A: +case 0x991A: +case 0x9B1A: +case 0x9D1A: +case 0x9F1A: +case 0x911B: +case 0x931B: +case 0x951B: +case 0x971B: +case 0x991B: +case 0x9B1B: +case 0x9D1B: +case 0x9F1B: +case 0x911C: +case 0x931C: +case 0x951C: +case 0x971C: +case 0x991C: +case 0x9B1C: +case 0x9D1C: +case 0x9F1C: +case 0x911D: +case 0x931D: +case 0x951D: +case 0x971D: +case 0x991D: +case 0x9B1D: +case 0x9D1D: +case 0x9F1D: +case 0x911E: +case 0x931E: +case 0x951E: +case 0x971E: +case 0x991E: +case 0x9B1E: +case 0x9D1E: +case 0x9F1E: + +// SUBDa +case 0x9118: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9320: +case 0x9520: +case 0x9720: +case 0x9920: +case 0x9B20: +case 0x9D20: +case 0x9F20: +case 0x9121: +case 0x9321: +case 0x9521: +case 0x9721: +case 0x9921: +case 0x9B21: +case 0x9D21: +case 0x9F21: +case 0x9122: +case 0x9322: +case 0x9522: +case 0x9722: +case 0x9922: +case 0x9B22: +case 0x9D22: +case 0x9F22: +case 0x9123: +case 0x9323: +case 0x9523: +case 0x9723: +case 0x9923: +case 0x9B23: +case 0x9D23: +case 0x9F23: +case 0x9124: +case 0x9324: +case 0x9524: +case 0x9724: +case 0x9924: +case 0x9B24: +case 0x9D24: +case 0x9F24: +case 0x9125: +case 0x9325: +case 0x9525: +case 0x9725: +case 0x9925: +case 0x9B25: +case 0x9D25: +case 0x9F25: +case 0x9126: +case 0x9326: +case 0x9526: +case 0x9726: +case 0x9926: +case 0x9B26: +case 0x9D26: +case 0x9F26: + +// SUBDa +case 0x9120: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9328: +case 0x9528: +case 0x9728: +case 0x9928: +case 0x9B28: +case 0x9D28: +case 0x9F28: +case 0x9129: +case 0x9329: +case 0x9529: +case 0x9729: +case 0x9929: +case 0x9B29: +case 0x9D29: +case 0x9F29: +case 0x912A: +case 0x932A: +case 0x952A: +case 0x972A: +case 0x992A: +case 0x9B2A: +case 0x9D2A: +case 0x9F2A: +case 0x912B: +case 0x932B: +case 0x952B: +case 0x972B: +case 0x992B: +case 0x9B2B: +case 0x9D2B: +case 0x9F2B: +case 0x912C: +case 0x932C: +case 0x952C: +case 0x972C: +case 0x992C: +case 0x9B2C: +case 0x9D2C: +case 0x9F2C: +case 0x912D: +case 0x932D: +case 0x952D: +case 0x972D: +case 0x992D: +case 0x9B2D: +case 0x9D2D: +case 0x9F2D: +case 0x912E: +case 0x932E: +case 0x952E: +case 0x972E: +case 0x992E: +case 0x9B2E: +case 0x9D2E: +case 0x9F2E: +case 0x912F: +case 0x932F: +case 0x952F: +case 0x972F: +case 0x992F: +case 0x9B2F: +case 0x9D2F: +case 0x9F2F: + +// SUBDa +case 0x9128: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9330: +case 0x9530: +case 0x9730: +case 0x9930: +case 0x9B30: +case 0x9D30: +case 0x9F30: +case 0x9131: +case 0x9331: +case 0x9531: +case 0x9731: +case 0x9931: +case 0x9B31: +case 0x9D31: +case 0x9F31: +case 0x9132: +case 0x9332: +case 0x9532: +case 0x9732: +case 0x9932: +case 0x9B32: +case 0x9D32: +case 0x9F32: +case 0x9133: +case 0x9333: +case 0x9533: +case 0x9733: +case 0x9933: +case 0x9B33: +case 0x9D33: +case 0x9F33: +case 0x9134: +case 0x9334: +case 0x9534: +case 0x9734: +case 0x9934: +case 0x9B34: +case 0x9D34: +case 0x9F34: +case 0x9135: +case 0x9335: +case 0x9535: +case 0x9735: +case 0x9935: +case 0x9B35: +case 0x9D35: +case 0x9F35: +case 0x9136: +case 0x9336: +case 0x9536: +case 0x9736: +case 0x9936: +case 0x9B36: +case 0x9D36: +case 0x9F36: +case 0x9137: +case 0x9337: +case 0x9537: +case 0x9737: +case 0x9937: +case 0x9B37: +case 0x9D37: +case 0x9F37: + +// SUBDa +case 0x9130: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9338: +case 0x9538: +case 0x9738: +case 0x9938: +case 0x9B38: +case 0x9D38: +case 0x9F38: + +// SUBDa +case 0x9138: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9339: +case 0x9539: +case 0x9739: +case 0x9939: +case 0x9B39: +case 0x9D39: +case 0x9F39: + +// SUBDa +case 0x9139: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x931F: +case 0x951F: +case 0x971F: +case 0x991F: +case 0x9B1F: +case 0x9D1F: +case 0x9F1F: + +// SUBDa +case 0x911F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9327: +case 0x9527: +case 0x9727: +case 0x9927: +case 0x9B27: +case 0x9D27: +case 0x9F27: + +// SUBDa +case 0x9127: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0x9350: +case 0x9550: +case 0x9750: +case 0x9950: +case 0x9B50: +case 0x9D50: +case 0x9F50: +case 0x9151: +case 0x9351: +case 0x9551: +case 0x9751: +case 0x9951: +case 0x9B51: +case 0x9D51: +case 0x9F51: +case 0x9152: +case 0x9352: +case 0x9552: +case 0x9752: +case 0x9952: +case 0x9B52: +case 0x9D52: +case 0x9F52: +case 0x9153: +case 0x9353: +case 0x9553: +case 0x9753: +case 0x9953: +case 0x9B53: +case 0x9D53: +case 0x9F53: +case 0x9154: +case 0x9354: +case 0x9554: +case 0x9754: +case 0x9954: +case 0x9B54: +case 0x9D54: +case 0x9F54: +case 0x9155: +case 0x9355: +case 0x9555: +case 0x9755: +case 0x9955: +case 0x9B55: +case 0x9D55: +case 0x9F55: +case 0x9156: +case 0x9356: +case 0x9556: +case 0x9756: +case 0x9956: +case 0x9B56: +case 0x9D56: +case 0x9F56: +case 0x9157: +case 0x9357: +case 0x9557: +case 0x9757: +case 0x9957: +case 0x9B57: +case 0x9D57: +case 0x9F57: + +// SUBDa +case 0x9150: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9358: +case 0x9558: +case 0x9758: +case 0x9958: +case 0x9B58: +case 0x9D58: +case 0x9F58: +case 0x9159: +case 0x9359: +case 0x9559: +case 0x9759: +case 0x9959: +case 0x9B59: +case 0x9D59: +case 0x9F59: +case 0x915A: +case 0x935A: +case 0x955A: +case 0x975A: +case 0x995A: +case 0x9B5A: +case 0x9D5A: +case 0x9F5A: +case 0x915B: +case 0x935B: +case 0x955B: +case 0x975B: +case 0x995B: +case 0x9B5B: +case 0x9D5B: +case 0x9F5B: +case 0x915C: +case 0x935C: +case 0x955C: +case 0x975C: +case 0x995C: +case 0x9B5C: +case 0x9D5C: +case 0x9F5C: +case 0x915D: +case 0x935D: +case 0x955D: +case 0x975D: +case 0x995D: +case 0x9B5D: +case 0x9D5D: +case 0x9F5D: +case 0x915E: +case 0x935E: +case 0x955E: +case 0x975E: +case 0x995E: +case 0x9B5E: +case 0x9D5E: +case 0x9F5E: + +// SUBDa +case 0x9158: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9360: +case 0x9560: +case 0x9760: +case 0x9960: +case 0x9B60: +case 0x9D60: +case 0x9F60: +case 0x9161: +case 0x9361: +case 0x9561: +case 0x9761: +case 0x9961: +case 0x9B61: +case 0x9D61: +case 0x9F61: +case 0x9162: +case 0x9362: +case 0x9562: +case 0x9762: +case 0x9962: +case 0x9B62: +case 0x9D62: +case 0x9F62: +case 0x9163: +case 0x9363: +case 0x9563: +case 0x9763: +case 0x9963: +case 0x9B63: +case 0x9D63: +case 0x9F63: +case 0x9164: +case 0x9364: +case 0x9564: +case 0x9764: +case 0x9964: +case 0x9B64: +case 0x9D64: +case 0x9F64: +case 0x9165: +case 0x9365: +case 0x9565: +case 0x9765: +case 0x9965: +case 0x9B65: +case 0x9D65: +case 0x9F65: +case 0x9166: +case 0x9366: +case 0x9566: +case 0x9766: +case 0x9966: +case 0x9B66: +case 0x9D66: +case 0x9F66: + +// SUBDa +case 0x9160: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9368: +case 0x9568: +case 0x9768: +case 0x9968: +case 0x9B68: +case 0x9D68: +case 0x9F68: +case 0x9169: +case 0x9369: +case 0x9569: +case 0x9769: +case 0x9969: +case 0x9B69: +case 0x9D69: +case 0x9F69: +case 0x916A: +case 0x936A: +case 0x956A: +case 0x976A: +case 0x996A: +case 0x9B6A: +case 0x9D6A: +case 0x9F6A: +case 0x916B: +case 0x936B: +case 0x956B: +case 0x976B: +case 0x996B: +case 0x9B6B: +case 0x9D6B: +case 0x9F6B: +case 0x916C: +case 0x936C: +case 0x956C: +case 0x976C: +case 0x996C: +case 0x9B6C: +case 0x9D6C: +case 0x9F6C: +case 0x916D: +case 0x936D: +case 0x956D: +case 0x976D: +case 0x996D: +case 0x9B6D: +case 0x9D6D: +case 0x9F6D: +case 0x916E: +case 0x936E: +case 0x956E: +case 0x976E: +case 0x996E: +case 0x9B6E: +case 0x9D6E: +case 0x9F6E: +case 0x916F: +case 0x936F: +case 0x956F: +case 0x976F: +case 0x996F: +case 0x9B6F: +case 0x9D6F: +case 0x9F6F: + +// SUBDa +case 0x9168: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9370: +case 0x9570: +case 0x9770: +case 0x9970: +case 0x9B70: +case 0x9D70: +case 0x9F70: +case 0x9171: +case 0x9371: +case 0x9571: +case 0x9771: +case 0x9971: +case 0x9B71: +case 0x9D71: +case 0x9F71: +case 0x9172: +case 0x9372: +case 0x9572: +case 0x9772: +case 0x9972: +case 0x9B72: +case 0x9D72: +case 0x9F72: +case 0x9173: +case 0x9373: +case 0x9573: +case 0x9773: +case 0x9973: +case 0x9B73: +case 0x9D73: +case 0x9F73: +case 0x9174: +case 0x9374: +case 0x9574: +case 0x9774: +case 0x9974: +case 0x9B74: +case 0x9D74: +case 0x9F74: +case 0x9175: +case 0x9375: +case 0x9575: +case 0x9775: +case 0x9975: +case 0x9B75: +case 0x9D75: +case 0x9F75: +case 0x9176: +case 0x9376: +case 0x9576: +case 0x9776: +case 0x9976: +case 0x9B76: +case 0x9D76: +case 0x9F76: +case 0x9177: +case 0x9377: +case 0x9577: +case 0x9777: +case 0x9977: +case 0x9B77: +case 0x9D77: +case 0x9F77: + +// SUBDa +case 0x9170: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9378: +case 0x9578: +case 0x9778: +case 0x9978: +case 0x9B78: +case 0x9D78: +case 0x9F78: + +// SUBDa +case 0x9178: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9379: +case 0x9579: +case 0x9779: +case 0x9979: +case 0x9B79: +case 0x9D79: +case 0x9F79: + +// SUBDa +case 0x9179: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x935F: +case 0x955F: +case 0x975F: +case 0x995F: +case 0x9B5F: +case 0x9D5F: +case 0x9F5F: + +// SUBDa +case 0x915F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9367: +case 0x9567: +case 0x9767: +case 0x9967: +case 0x9B67: +case 0x9D67: +case 0x9F67: + +// SUBDa +case 0x9167: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0x9390: +case 0x9590: +case 0x9790: +case 0x9990: +case 0x9B90: +case 0x9D90: +case 0x9F90: +case 0x9191: +case 0x9391: +case 0x9591: +case 0x9791: +case 0x9991: +case 0x9B91: +case 0x9D91: +case 0x9F91: +case 0x9192: +case 0x9392: +case 0x9592: +case 0x9792: +case 0x9992: +case 0x9B92: +case 0x9D92: +case 0x9F92: +case 0x9193: +case 0x9393: +case 0x9593: +case 0x9793: +case 0x9993: +case 0x9B93: +case 0x9D93: +case 0x9F93: +case 0x9194: +case 0x9394: +case 0x9594: +case 0x9794: +case 0x9994: +case 0x9B94: +case 0x9D94: +case 0x9F94: +case 0x9195: +case 0x9395: +case 0x9595: +case 0x9795: +case 0x9995: +case 0x9B95: +case 0x9D95: +case 0x9F95: +case 0x9196: +case 0x9396: +case 0x9596: +case 0x9796: +case 0x9996: +case 0x9B96: +case 0x9D96: +case 0x9F96: +case 0x9197: +case 0x9397: +case 0x9597: +case 0x9797: +case 0x9997: +case 0x9B97: +case 0x9D97: +case 0x9F97: + +// SUBDa +case 0x9190: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x9398: +case 0x9598: +case 0x9798: +case 0x9998: +case 0x9B98: +case 0x9D98: +case 0x9F98: +case 0x9199: +case 0x9399: +case 0x9599: +case 0x9799: +case 0x9999: +case 0x9B99: +case 0x9D99: +case 0x9F99: +case 0x919A: +case 0x939A: +case 0x959A: +case 0x979A: +case 0x999A: +case 0x9B9A: +case 0x9D9A: +case 0x9F9A: +case 0x919B: +case 0x939B: +case 0x959B: +case 0x979B: +case 0x999B: +case 0x9B9B: +case 0x9D9B: +case 0x9F9B: +case 0x919C: +case 0x939C: +case 0x959C: +case 0x979C: +case 0x999C: +case 0x9B9C: +case 0x9D9C: +case 0x9F9C: +case 0x919D: +case 0x939D: +case 0x959D: +case 0x979D: +case 0x999D: +case 0x9B9D: +case 0x9D9D: +case 0x9F9D: +case 0x919E: +case 0x939E: +case 0x959E: +case 0x979E: +case 0x999E: +case 0x9B9E: +case 0x9D9E: +case 0x9F9E: + +// SUBDa +case 0x9198: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x93A0: +case 0x95A0: +case 0x97A0: +case 0x99A0: +case 0x9BA0: +case 0x9DA0: +case 0x9FA0: +case 0x91A1: +case 0x93A1: +case 0x95A1: +case 0x97A1: +case 0x99A1: +case 0x9BA1: +case 0x9DA1: +case 0x9FA1: +case 0x91A2: +case 0x93A2: +case 0x95A2: +case 0x97A2: +case 0x99A2: +case 0x9BA2: +case 0x9DA2: +case 0x9FA2: +case 0x91A3: +case 0x93A3: +case 0x95A3: +case 0x97A3: +case 0x99A3: +case 0x9BA3: +case 0x9DA3: +case 0x9FA3: +case 0x91A4: +case 0x93A4: +case 0x95A4: +case 0x97A4: +case 0x99A4: +case 0x9BA4: +case 0x9DA4: +case 0x9FA4: +case 0x91A5: +case 0x93A5: +case 0x95A5: +case 0x97A5: +case 0x99A5: +case 0x9BA5: +case 0x9DA5: +case 0x9FA5: +case 0x91A6: +case 0x93A6: +case 0x95A6: +case 0x97A6: +case 0x99A6: +case 0x9BA6: +case 0x9DA6: +case 0x9FA6: + +// SUBDa +case 0x91A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x93A8: +case 0x95A8: +case 0x97A8: +case 0x99A8: +case 0x9BA8: +case 0x9DA8: +case 0x9FA8: +case 0x91A9: +case 0x93A9: +case 0x95A9: +case 0x97A9: +case 0x99A9: +case 0x9BA9: +case 0x9DA9: +case 0x9FA9: +case 0x91AA: +case 0x93AA: +case 0x95AA: +case 0x97AA: +case 0x99AA: +case 0x9BAA: +case 0x9DAA: +case 0x9FAA: +case 0x91AB: +case 0x93AB: +case 0x95AB: +case 0x97AB: +case 0x99AB: +case 0x9BAB: +case 0x9DAB: +case 0x9FAB: +case 0x91AC: +case 0x93AC: +case 0x95AC: +case 0x97AC: +case 0x99AC: +case 0x9BAC: +case 0x9DAC: +case 0x9FAC: +case 0x91AD: +case 0x93AD: +case 0x95AD: +case 0x97AD: +case 0x99AD: +case 0x9BAD: +case 0x9DAD: +case 0x9FAD: +case 0x91AE: +case 0x93AE: +case 0x95AE: +case 0x97AE: +case 0x99AE: +case 0x9BAE: +case 0x9DAE: +case 0x9FAE: +case 0x91AF: +case 0x93AF: +case 0x95AF: +case 0x97AF: +case 0x99AF: +case 0x9BAF: +case 0x9DAF: +case 0x9FAF: + +// SUBDa +case 0x91A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x93B0: +case 0x95B0: +case 0x97B0: +case 0x99B0: +case 0x9BB0: +case 0x9DB0: +case 0x9FB0: +case 0x91B1: +case 0x93B1: +case 0x95B1: +case 0x97B1: +case 0x99B1: +case 0x9BB1: +case 0x9DB1: +case 0x9FB1: +case 0x91B2: +case 0x93B2: +case 0x95B2: +case 0x97B2: +case 0x99B2: +case 0x9BB2: +case 0x9DB2: +case 0x9FB2: +case 0x91B3: +case 0x93B3: +case 0x95B3: +case 0x97B3: +case 0x99B3: +case 0x9BB3: +case 0x9DB3: +case 0x9FB3: +case 0x91B4: +case 0x93B4: +case 0x95B4: +case 0x97B4: +case 0x99B4: +case 0x9BB4: +case 0x9DB4: +case 0x9FB4: +case 0x91B5: +case 0x93B5: +case 0x95B5: +case 0x97B5: +case 0x99B5: +case 0x9BB5: +case 0x9DB5: +case 0x9FB5: +case 0x91B6: +case 0x93B6: +case 0x95B6: +case 0x97B6: +case 0x99B6: +case 0x9BB6: +case 0x9DB6: +case 0x9FB6: +case 0x91B7: +case 0x93B7: +case 0x95B7: +case 0x97B7: +case 0x99B7: +case 0x9BB7: +case 0x9DB7: +case 0x9FB7: + +// SUBDa +case 0x91B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x93B8: +case 0x95B8: +case 0x97B8: +case 0x99B8: +case 0x9BB8: +case 0x9DB8: +case 0x9FB8: + +// SUBDa +case 0x91B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x93B9: +case 0x95B9: +case 0x97B9: +case 0x99B9: +case 0x9BB9: +case 0x9DB9: +case 0x9FB9: + +// SUBDa +case 0x91B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x939F: +case 0x959F: +case 0x979F: +case 0x999F: +case 0x9B9F: +case 0x9D9F: +case 0x9F9F: + +// SUBDa +case 0x919F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x93A7: +case 0x95A7: +case 0x97A7: +case 0x99A7: +case 0x9BA7: +case 0x9DA7: +case 0x9FA7: + +// SUBDa +case 0x91A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0x9300: +case 0x9500: +case 0x9700: +case 0x9900: +case 0x9B00: +case 0x9D00: +case 0x9F00: +case 0x9101: +case 0x9301: +case 0x9501: +case 0x9701: +case 0x9901: +case 0x9B01: +case 0x9D01: +case 0x9F01: +case 0x9102: +case 0x9302: +case 0x9502: +case 0x9702: +case 0x9902: +case 0x9B02: +case 0x9D02: +case 0x9F02: +case 0x9103: +case 0x9303: +case 0x9503: +case 0x9703: +case 0x9903: +case 0x9B03: +case 0x9D03: +case 0x9F03: +case 0x9104: +case 0x9304: +case 0x9504: +case 0x9704: +case 0x9904: +case 0x9B04: +case 0x9D04: +case 0x9F04: +case 0x9105: +case 0x9305: +case 0x9505: +case 0x9705: +case 0x9905: +case 0x9B05: +case 0x9D05: +case 0x9F05: +case 0x9106: +case 0x9306: +case 0x9506: +case 0x9706: +case 0x9906: +case 0x9B06: +case 0x9D06: +case 0x9F06: +case 0x9107: +case 0x9307: +case 0x9507: +case 0x9707: +case 0x9907: +case 0x9B07: +case 0x9D07: +case 0x9F07: + +// SUBX +case 0x9100: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ |= res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9340: +case 0x9540: +case 0x9740: +case 0x9940: +case 0x9B40: +case 0x9D40: +case 0x9F40: +case 0x9141: +case 0x9341: +case 0x9541: +case 0x9741: +case 0x9941: +case 0x9B41: +case 0x9D41: +case 0x9F41: +case 0x9142: +case 0x9342: +case 0x9542: +case 0x9742: +case 0x9942: +case 0x9B42: +case 0x9D42: +case 0x9F42: +case 0x9143: +case 0x9343: +case 0x9543: +case 0x9743: +case 0x9943: +case 0x9B43: +case 0x9D43: +case 0x9F43: +case 0x9144: +case 0x9344: +case 0x9544: +case 0x9744: +case 0x9944: +case 0x9B44: +case 0x9D44: +case 0x9F44: +case 0x9145: +case 0x9345: +case 0x9545: +case 0x9745: +case 0x9945: +case 0x9B45: +case 0x9D45: +case 0x9F45: +case 0x9146: +case 0x9346: +case 0x9546: +case 0x9746: +case 0x9946: +case 0x9B46: +case 0x9D46: +case 0x9F46: +case 0x9147: +case 0x9347: +case 0x9547: +case 0x9747: +case 0x9947: +case 0x9B47: +case 0x9D47: +case 0x9F47: + +// SUBX +case 0x9140: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0x9380: +case 0x9580: +case 0x9780: +case 0x9980: +case 0x9B80: +case 0x9D80: +case 0x9F80: +case 0x9181: +case 0x9381: +case 0x9581: +case 0x9781: +case 0x9981: +case 0x9B81: +case 0x9D81: +case 0x9F81: +case 0x9182: +case 0x9382: +case 0x9582: +case 0x9782: +case 0x9982: +case 0x9B82: +case 0x9D82: +case 0x9F82: +case 0x9183: +case 0x9383: +case 0x9583: +case 0x9783: +case 0x9983: +case 0x9B83: +case 0x9D83: +case 0x9F83: +case 0x9184: +case 0x9384: +case 0x9584: +case 0x9784: +case 0x9984: +case 0x9B84: +case 0x9D84: +case 0x9F84: +case 0x9185: +case 0x9385: +case 0x9585: +case 0x9785: +case 0x9985: +case 0x9B85: +case 0x9D85: +case 0x9F85: +case 0x9186: +case 0x9386: +case 0x9586: +case 0x9786: +case 0x9986: +case 0x9B86: +case 0x9D86: +case 0x9F86: +case 0x9187: +case 0x9387: +case 0x9587: +case 0x9787: +case 0x9987: +case 0x9B87: +case 0x9D87: +case 0x9F87: + +// SUBX +case 0x9180: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0x9308: +case 0x9508: +case 0x9708: +case 0x9908: +case 0x9B08: +case 0x9D08: +case 0x9109: +case 0x9309: +case 0x9509: +case 0x9709: +case 0x9909: +case 0x9B09: +case 0x9D09: +case 0x910A: +case 0x930A: +case 0x950A: +case 0x970A: +case 0x990A: +case 0x9B0A: +case 0x9D0A: +case 0x910B: +case 0x930B: +case 0x950B: +case 0x970B: +case 0x990B: +case 0x9B0B: +case 0x9D0B: +case 0x910C: +case 0x930C: +case 0x950C: +case 0x970C: +case 0x990C: +case 0x9B0C: +case 0x9D0C: +case 0x910D: +case 0x930D: +case 0x950D: +case 0x970D: +case 0x990D: +case 0x9B0D: +case 0x9D0D: +case 0x910E: +case 0x930E: +case 0x950E: +case 0x970E: +case 0x990E: +case 0x9B0E: +case 0x9D0E: + +// SUBXM +case 0x9108: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0x9348: +case 0x9548: +case 0x9748: +case 0x9948: +case 0x9B48: +case 0x9D48: +case 0x9149: +case 0x9349: +case 0x9549: +case 0x9749: +case 0x9949: +case 0x9B49: +case 0x9D49: +case 0x914A: +case 0x934A: +case 0x954A: +case 0x974A: +case 0x994A: +case 0x9B4A: +case 0x9D4A: +case 0x914B: +case 0x934B: +case 0x954B: +case 0x974B: +case 0x994B: +case 0x9B4B: +case 0x9D4B: +case 0x914C: +case 0x934C: +case 0x954C: +case 0x974C: +case 0x994C: +case 0x9B4C: +case 0x9D4C: +case 0x914D: +case 0x934D: +case 0x954D: +case 0x974D: +case 0x994D: +case 0x9B4D: +case 0x9D4D: +case 0x914E: +case 0x934E: +case 0x954E: +case 0x974E: +case 0x994E: +case 0x9B4E: +case 0x9D4E: + +// SUBXM +case 0x9148: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) +case 0x9388: +case 0x9588: +case 0x9788: +case 0x9988: +case 0x9B88: +case 0x9D88: +case 0x9189: +case 0x9389: +case 0x9589: +case 0x9789: +case 0x9989: +case 0x9B89: +case 0x9D89: +case 0x918A: +case 0x938A: +case 0x958A: +case 0x978A: +case 0x998A: +case 0x9B8A: +case 0x9D8A: +case 0x918B: +case 0x938B: +case 0x958B: +case 0x978B: +case 0x998B: +case 0x9B8B: +case 0x9D8B: +case 0x918C: +case 0x938C: +case 0x958C: +case 0x978C: +case 0x998C: +case 0x9B8C: +case 0x9D8C: +case 0x918D: +case 0x938D: +case 0x958D: +case 0x978D: +case 0x998D: +case 0x9B8D: +case 0x9D8D: +case 0x918E: +case 0x938E: +case 0x958E: +case 0x978E: +case 0x998E: +case 0x9B8E: +case 0x9D8E: + +// SUBXM +case 0x9188: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) +case 0x930F: +case 0x950F: +case 0x970F: +case 0x990F: +case 0x9B0F: +case 0x9D0F: + +// SUBX7M +case 0x910F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0x934F: +case 0x954F: +case 0x974F: +case 0x994F: +case 0x9B4F: +case 0x9D4F: + +// SUBX7M +case 0x914F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) +case 0x938F: +case 0x958F: +case 0x978F: +case 0x998F: +case 0x9B8F: +case 0x9D8F: + +// SUBX7M +case 0x918F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) +case 0x9F09: +case 0x9F0A: +case 0x9F0B: +case 0x9F0C: +case 0x9F0D: +case 0x9F0E: + +// SUBXM7 +case 0x9F08: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0x9F49: +case 0x9F4A: +case 0x9F4B: +case 0x9F4C: +case 0x9F4D: +case 0x9F4E: + +// SUBXM7 +case 0x9F48: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) +case 0x9F89: +case 0x9F8A: +case 0x9F8B: +case 0x9F8C: +case 0x9F8D: +case 0x9F8E: + +// SUBXM7 +case 0x9F88: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) + +// SUBX7M7 +case 0x9F0F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) + +// SUBX7M7 +case 0x9F4F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) + +// SUBX7M7 +case 0x9F8F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst - src - ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) +case 0x92C0: +case 0x94C0: +case 0x96C0: +case 0x98C0: +case 0x9AC0: +case 0x9CC0: +case 0x9EC0: +case 0x90C1: +case 0x92C1: +case 0x94C1: +case 0x96C1: +case 0x98C1: +case 0x9AC1: +case 0x9CC1: +case 0x9EC1: +case 0x90C2: +case 0x92C2: +case 0x94C2: +case 0x96C2: +case 0x98C2: +case 0x9AC2: +case 0x9CC2: +case 0x9EC2: +case 0x90C3: +case 0x92C3: +case 0x94C3: +case 0x96C3: +case 0x98C3: +case 0x9AC3: +case 0x9CC3: +case 0x9EC3: +case 0x90C4: +case 0x92C4: +case 0x94C4: +case 0x96C4: +case 0x98C4: +case 0x9AC4: +case 0x9CC4: +case 0x9EC4: +case 0x90C5: +case 0x92C5: +case 0x94C5: +case 0x96C5: +case 0x98C5: +case 0x9AC5: +case 0x9CC5: +case 0x9EC5: +case 0x90C6: +case 0x92C6: +case 0x94C6: +case 0x96C6: +case 0x98C6: +case 0x9AC6: +case 0x9CC6: +case 0x9EC6: +case 0x90C7: +case 0x92C7: +case 0x94C7: +case 0x96C7: +case 0x98C7: +case 0x9AC7: +case 0x9CC7: +case 0x9EC7: + +// SUBA +case 0x90C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0x92C8: +case 0x94C8: +case 0x96C8: +case 0x98C8: +case 0x9AC8: +case 0x9CC8: +case 0x9EC8: +case 0x90C9: +case 0x92C9: +case 0x94C9: +case 0x96C9: +case 0x98C9: +case 0x9AC9: +case 0x9CC9: +case 0x9EC9: +case 0x90CA: +case 0x92CA: +case 0x94CA: +case 0x96CA: +case 0x98CA: +case 0x9ACA: +case 0x9CCA: +case 0x9ECA: +case 0x90CB: +case 0x92CB: +case 0x94CB: +case 0x96CB: +case 0x98CB: +case 0x9ACB: +case 0x9CCB: +case 0x9ECB: +case 0x90CC: +case 0x92CC: +case 0x94CC: +case 0x96CC: +case 0x98CC: +case 0x9ACC: +case 0x9CCC: +case 0x9ECC: +case 0x90CD: +case 0x92CD: +case 0x94CD: +case 0x96CD: +case 0x98CD: +case 0x9ACD: +case 0x9CCD: +case 0x9ECD: +case 0x90CE: +case 0x92CE: +case 0x94CE: +case 0x96CE: +case 0x98CE: +case 0x9ACE: +case 0x9CCE: +case 0x9ECE: +case 0x90CF: +case 0x92CF: +case 0x94CF: +case 0x96CF: +case 0x98CF: +case 0x9ACF: +case 0x9CCF: +case 0x9ECF: + +// SUBA +case 0x90C8: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0x92D0: +case 0x94D0: +case 0x96D0: +case 0x98D0: +case 0x9AD0: +case 0x9CD0: +case 0x9ED0: +case 0x90D1: +case 0x92D1: +case 0x94D1: +case 0x96D1: +case 0x98D1: +case 0x9AD1: +case 0x9CD1: +case 0x9ED1: +case 0x90D2: +case 0x92D2: +case 0x94D2: +case 0x96D2: +case 0x98D2: +case 0x9AD2: +case 0x9CD2: +case 0x9ED2: +case 0x90D3: +case 0x92D3: +case 0x94D3: +case 0x96D3: +case 0x98D3: +case 0x9AD3: +case 0x9CD3: +case 0x9ED3: +case 0x90D4: +case 0x92D4: +case 0x94D4: +case 0x96D4: +case 0x98D4: +case 0x9AD4: +case 0x9CD4: +case 0x9ED4: +case 0x90D5: +case 0x92D5: +case 0x94D5: +case 0x96D5: +case 0x98D5: +case 0x9AD5: +case 0x9CD5: +case 0x9ED5: +case 0x90D6: +case 0x92D6: +case 0x94D6: +case 0x96D6: +case 0x98D6: +case 0x9AD6: +case 0x9CD6: +case 0x9ED6: +case 0x90D7: +case 0x92D7: +case 0x94D7: +case 0x96D7: +case 0x98D7: +case 0x9AD7: +case 0x9CD7: +case 0x9ED7: + +// SUBA +case 0x90D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92D8: +case 0x94D8: +case 0x96D8: +case 0x98D8: +case 0x9AD8: +case 0x9CD8: +case 0x9ED8: +case 0x90D9: +case 0x92D9: +case 0x94D9: +case 0x96D9: +case 0x98D9: +case 0x9AD9: +case 0x9CD9: +case 0x9ED9: +case 0x90DA: +case 0x92DA: +case 0x94DA: +case 0x96DA: +case 0x98DA: +case 0x9ADA: +case 0x9CDA: +case 0x9EDA: +case 0x90DB: +case 0x92DB: +case 0x94DB: +case 0x96DB: +case 0x98DB: +case 0x9ADB: +case 0x9CDB: +case 0x9EDB: +case 0x90DC: +case 0x92DC: +case 0x94DC: +case 0x96DC: +case 0x98DC: +case 0x9ADC: +case 0x9CDC: +case 0x9EDC: +case 0x90DD: +case 0x92DD: +case 0x94DD: +case 0x96DD: +case 0x98DD: +case 0x9ADD: +case 0x9CDD: +case 0x9EDD: +case 0x90DE: +case 0x92DE: +case 0x94DE: +case 0x96DE: +case 0x98DE: +case 0x9ADE: +case 0x9CDE: +case 0x9EDE: + +// SUBA +case 0x90D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92E0: +case 0x94E0: +case 0x96E0: +case 0x98E0: +case 0x9AE0: +case 0x9CE0: +case 0x9EE0: +case 0x90E1: +case 0x92E1: +case 0x94E1: +case 0x96E1: +case 0x98E1: +case 0x9AE1: +case 0x9CE1: +case 0x9EE1: +case 0x90E2: +case 0x92E2: +case 0x94E2: +case 0x96E2: +case 0x98E2: +case 0x9AE2: +case 0x9CE2: +case 0x9EE2: +case 0x90E3: +case 0x92E3: +case 0x94E3: +case 0x96E3: +case 0x98E3: +case 0x9AE3: +case 0x9CE3: +case 0x9EE3: +case 0x90E4: +case 0x92E4: +case 0x94E4: +case 0x96E4: +case 0x98E4: +case 0x9AE4: +case 0x9CE4: +case 0x9EE4: +case 0x90E5: +case 0x92E5: +case 0x94E5: +case 0x96E5: +case 0x98E5: +case 0x9AE5: +case 0x9CE5: +case 0x9EE5: +case 0x90E6: +case 0x92E6: +case 0x94E6: +case 0x96E6: +case 0x98E6: +case 0x9AE6: +case 0x9CE6: +case 0x9EE6: + +// SUBA +case 0x90E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92E8: +case 0x94E8: +case 0x96E8: +case 0x98E8: +case 0x9AE8: +case 0x9CE8: +case 0x9EE8: +case 0x90E9: +case 0x92E9: +case 0x94E9: +case 0x96E9: +case 0x98E9: +case 0x9AE9: +case 0x9CE9: +case 0x9EE9: +case 0x90EA: +case 0x92EA: +case 0x94EA: +case 0x96EA: +case 0x98EA: +case 0x9AEA: +case 0x9CEA: +case 0x9EEA: +case 0x90EB: +case 0x92EB: +case 0x94EB: +case 0x96EB: +case 0x98EB: +case 0x9AEB: +case 0x9CEB: +case 0x9EEB: +case 0x90EC: +case 0x92EC: +case 0x94EC: +case 0x96EC: +case 0x98EC: +case 0x9AEC: +case 0x9CEC: +case 0x9EEC: +case 0x90ED: +case 0x92ED: +case 0x94ED: +case 0x96ED: +case 0x98ED: +case 0x9AED: +case 0x9CED: +case 0x9EED: +case 0x90EE: +case 0x92EE: +case 0x94EE: +case 0x96EE: +case 0x98EE: +case 0x9AEE: +case 0x9CEE: +case 0x9EEE: +case 0x90EF: +case 0x92EF: +case 0x94EF: +case 0x96EF: +case 0x98EF: +case 0x9AEF: +case 0x9CEF: +case 0x9EEF: + +// SUBA +case 0x90E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92F0: +case 0x94F0: +case 0x96F0: +case 0x98F0: +case 0x9AF0: +case 0x9CF0: +case 0x9EF0: +case 0x90F1: +case 0x92F1: +case 0x94F1: +case 0x96F1: +case 0x98F1: +case 0x9AF1: +case 0x9CF1: +case 0x9EF1: +case 0x90F2: +case 0x92F2: +case 0x94F2: +case 0x96F2: +case 0x98F2: +case 0x9AF2: +case 0x9CF2: +case 0x9EF2: +case 0x90F3: +case 0x92F3: +case 0x94F3: +case 0x96F3: +case 0x98F3: +case 0x9AF3: +case 0x9CF3: +case 0x9EF3: +case 0x90F4: +case 0x92F4: +case 0x94F4: +case 0x96F4: +case 0x98F4: +case 0x9AF4: +case 0x9CF4: +case 0x9EF4: +case 0x90F5: +case 0x92F5: +case 0x94F5: +case 0x96F5: +case 0x98F5: +case 0x9AF5: +case 0x9CF5: +case 0x9EF5: +case 0x90F6: +case 0x92F6: +case 0x94F6: +case 0x96F6: +case 0x98F6: +case 0x9AF6: +case 0x9CF6: +case 0x9EF6: +case 0x90F7: +case 0x92F7: +case 0x94F7: +case 0x96F7: +case 0x98F7: +case 0x9AF7: +case 0x9CF7: +case 0x9EF7: + +// SUBA +case 0x90F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 8; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92F8: +case 0x94F8: +case 0x96F8: +case 0x98F8: +case 0x9AF8: +case 0x9CF8: +case 0x9EF8: + +// SUBA +case 0x90F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92F9: +case 0x94F9: +case 0x96F9: +case 0x98F9: +case 0x9AF9: +case 0x9CF9: +case 0x9EF9: + +// SUBA +case 0x90F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 10; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92FA: +case 0x94FA: +case 0x96FA: +case 0x98FA: +case 0x9AFA: +case 0x9CFA: +case 0x9EFA: + +// SUBA +case 0x90FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92FB: +case 0x94FB: +case 0x96FB: +case 0x98FB: +case 0x9AFB: +case 0x9CFB: +case 0x9EFB: + +// SUBA +case 0x90FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 8; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92FC: +case 0x94FC: +case 0x96FC: +case 0x98FC: +case 0x9AFC: +case 0x9CFC: +case 0x9EFC: + +// SUBA +case 0x90FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)FETCH_WORD; + PC += 2; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(12) +case 0x92DF: +case 0x94DF: +case 0x96DF: +case 0x98DF: +case 0x9ADF: +case 0x9CDF: +case 0x9EDF: + +// SUBA +case 0x90DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x92E7: +case 0x94E7: +case 0x96E7: +case 0x98E7: +case 0x9AE7: +case 0x9CE7: +case 0x9EE7: + +// SUBA +case 0x90E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93C0: +case 0x95C0: +case 0x97C0: +case 0x99C0: +case 0x9BC0: +case 0x9DC0: +case 0x9FC0: +case 0x91C1: +case 0x93C1: +case 0x95C1: +case 0x97C1: +case 0x99C1: +case 0x9BC1: +case 0x9DC1: +case 0x9FC1: +case 0x91C2: +case 0x93C2: +case 0x95C2: +case 0x97C2: +case 0x99C2: +case 0x9BC2: +case 0x9DC2: +case 0x9FC2: +case 0x91C3: +case 0x93C3: +case 0x95C3: +case 0x97C3: +case 0x99C3: +case 0x9BC3: +case 0x9DC3: +case 0x9FC3: +case 0x91C4: +case 0x93C4: +case 0x95C4: +case 0x97C4: +case 0x99C4: +case 0x9BC4: +case 0x9DC4: +case 0x9FC4: +case 0x91C5: +case 0x93C5: +case 0x95C5: +case 0x97C5: +case 0x99C5: +case 0x9BC5: +case 0x9DC5: +case 0x9FC5: +case 0x91C6: +case 0x93C6: +case 0x95C6: +case 0x97C6: +case 0x99C6: +case 0x9BC6: +case 0x9DC6: +case 0x9FC6: +case 0x91C7: +case 0x93C7: +case 0x95C7: +case 0x97C7: +case 0x99C7: +case 0x9BC7: +case 0x9DC7: +case 0x9FC7: + +// SUBA +case 0x91C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93C8: +case 0x95C8: +case 0x97C8: +case 0x99C8: +case 0x9BC8: +case 0x9DC8: +case 0x9FC8: +case 0x91C9: +case 0x93C9: +case 0x95C9: +case 0x97C9: +case 0x99C9: +case 0x9BC9: +case 0x9DC9: +case 0x9FC9: +case 0x91CA: +case 0x93CA: +case 0x95CA: +case 0x97CA: +case 0x99CA: +case 0x9BCA: +case 0x9DCA: +case 0x9FCA: +case 0x91CB: +case 0x93CB: +case 0x95CB: +case 0x97CB: +case 0x99CB: +case 0x9BCB: +case 0x9DCB: +case 0x9FCB: +case 0x91CC: +case 0x93CC: +case 0x95CC: +case 0x97CC: +case 0x99CC: +case 0x9BCC: +case 0x9DCC: +case 0x9FCC: +case 0x91CD: +case 0x93CD: +case 0x95CD: +case 0x97CD: +case 0x99CD: +case 0x9BCD: +case 0x9DCD: +case 0x9FCD: +case 0x91CE: +case 0x93CE: +case 0x95CE: +case 0x97CE: +case 0x99CE: +case 0x9BCE: +case 0x9DCE: +case 0x9FCE: +case 0x91CF: +case 0x93CF: +case 0x95CF: +case 0x97CF: +case 0x99CF: +case 0x9BCF: +case 0x9DCF: +case 0x9FCF: + +// SUBA +case 0x91C8: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93D0: +case 0x95D0: +case 0x97D0: +case 0x99D0: +case 0x9BD0: +case 0x9DD0: +case 0x9FD0: +case 0x91D1: +case 0x93D1: +case 0x95D1: +case 0x97D1: +case 0x99D1: +case 0x9BD1: +case 0x9DD1: +case 0x9FD1: +case 0x91D2: +case 0x93D2: +case 0x95D2: +case 0x97D2: +case 0x99D2: +case 0x9BD2: +case 0x9DD2: +case 0x9FD2: +case 0x91D3: +case 0x93D3: +case 0x95D3: +case 0x97D3: +case 0x99D3: +case 0x9BD3: +case 0x9DD3: +case 0x9FD3: +case 0x91D4: +case 0x93D4: +case 0x95D4: +case 0x97D4: +case 0x99D4: +case 0x9BD4: +case 0x9DD4: +case 0x9FD4: +case 0x91D5: +case 0x93D5: +case 0x95D5: +case 0x97D5: +case 0x99D5: +case 0x9BD5: +case 0x9DD5: +case 0x9FD5: +case 0x91D6: +case 0x93D6: +case 0x95D6: +case 0x97D6: +case 0x99D6: +case 0x9BD6: +case 0x9DD6: +case 0x9FD6: +case 0x91D7: +case 0x93D7: +case 0x95D7: +case 0x97D7: +case 0x99D7: +case 0x9BD7: +case 0x9DD7: +case 0x9FD7: + +// SUBA +case 0x91D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93D8: +case 0x95D8: +case 0x97D8: +case 0x99D8: +case 0x9BD8: +case 0x9DD8: +case 0x9FD8: +case 0x91D9: +case 0x93D9: +case 0x95D9: +case 0x97D9: +case 0x99D9: +case 0x9BD9: +case 0x9DD9: +case 0x9FD9: +case 0x91DA: +case 0x93DA: +case 0x95DA: +case 0x97DA: +case 0x99DA: +case 0x9BDA: +case 0x9DDA: +case 0x9FDA: +case 0x91DB: +case 0x93DB: +case 0x95DB: +case 0x97DB: +case 0x99DB: +case 0x9BDB: +case 0x9DDB: +case 0x9FDB: +case 0x91DC: +case 0x93DC: +case 0x95DC: +case 0x97DC: +case 0x99DC: +case 0x9BDC: +case 0x9DDC: +case 0x9FDC: +case 0x91DD: +case 0x93DD: +case 0x95DD: +case 0x97DD: +case 0x99DD: +case 0x9BDD: +case 0x9DDD: +case 0x9FDD: +case 0x91DE: +case 0x93DE: +case 0x95DE: +case 0x97DE: +case 0x99DE: +case 0x9BDE: +case 0x9DDE: +case 0x9FDE: + +// SUBA +case 0x91D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93E0: +case 0x95E0: +case 0x97E0: +case 0x99E0: +case 0x9BE0: +case 0x9DE0: +case 0x9FE0: +case 0x91E1: +case 0x93E1: +case 0x95E1: +case 0x97E1: +case 0x99E1: +case 0x9BE1: +case 0x9DE1: +case 0x9FE1: +case 0x91E2: +case 0x93E2: +case 0x95E2: +case 0x97E2: +case 0x99E2: +case 0x9BE2: +case 0x9DE2: +case 0x9FE2: +case 0x91E3: +case 0x93E3: +case 0x95E3: +case 0x97E3: +case 0x99E3: +case 0x9BE3: +case 0x9DE3: +case 0x9FE3: +case 0x91E4: +case 0x93E4: +case 0x95E4: +case 0x97E4: +case 0x99E4: +case 0x9BE4: +case 0x9DE4: +case 0x9FE4: +case 0x91E5: +case 0x93E5: +case 0x95E5: +case 0x97E5: +case 0x99E5: +case 0x9BE5: +case 0x9DE5: +case 0x9FE5: +case 0x91E6: +case 0x93E6: +case 0x95E6: +case 0x97E6: +case 0x99E6: +case 0x9BE6: +case 0x9DE6: +case 0x9FE6: + +// SUBA +case 0x91E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93E8: +case 0x95E8: +case 0x97E8: +case 0x99E8: +case 0x9BE8: +case 0x9DE8: +case 0x9FE8: +case 0x91E9: +case 0x93E9: +case 0x95E9: +case 0x97E9: +case 0x99E9: +case 0x9BE9: +case 0x9DE9: +case 0x9FE9: +case 0x91EA: +case 0x93EA: +case 0x95EA: +case 0x97EA: +case 0x99EA: +case 0x9BEA: +case 0x9DEA: +case 0x9FEA: +case 0x91EB: +case 0x93EB: +case 0x95EB: +case 0x97EB: +case 0x99EB: +case 0x9BEB: +case 0x9DEB: +case 0x9FEB: +case 0x91EC: +case 0x93EC: +case 0x95EC: +case 0x97EC: +case 0x99EC: +case 0x9BEC: +case 0x9DEC: +case 0x9FEC: +case 0x91ED: +case 0x93ED: +case 0x95ED: +case 0x97ED: +case 0x99ED: +case 0x9BED: +case 0x9DED: +case 0x9FED: +case 0x91EE: +case 0x93EE: +case 0x95EE: +case 0x97EE: +case 0x99EE: +case 0x9BEE: +case 0x9DEE: +case 0x9FEE: +case 0x91EF: +case 0x93EF: +case 0x95EF: +case 0x97EF: +case 0x99EF: +case 0x9BEF: +case 0x9DEF: +case 0x9FEF: + +// SUBA +case 0x91E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93F0: +case 0x95F0: +case 0x97F0: +case 0x99F0: +case 0x9BF0: +case 0x9DF0: +case 0x9FF0: +case 0x91F1: +case 0x93F1: +case 0x95F1: +case 0x97F1: +case 0x99F1: +case 0x9BF1: +case 0x9DF1: +case 0x9FF1: +case 0x91F2: +case 0x93F2: +case 0x95F2: +case 0x97F2: +case 0x99F2: +case 0x9BF2: +case 0x9DF2: +case 0x9FF2: +case 0x91F3: +case 0x93F3: +case 0x95F3: +case 0x97F3: +case 0x99F3: +case 0x9BF3: +case 0x9DF3: +case 0x9FF3: +case 0x91F4: +case 0x93F4: +case 0x95F4: +case 0x97F4: +case 0x99F4: +case 0x9BF4: +case 0x9DF4: +case 0x9FF4: +case 0x91F5: +case 0x93F5: +case 0x95F5: +case 0x97F5: +case 0x99F5: +case 0x9BF5: +case 0x9DF5: +case 0x9FF5: +case 0x91F6: +case 0x93F6: +case 0x95F6: +case 0x97F6: +case 0x99F6: +case 0x9BF6: +case 0x9DF6: +case 0x9FF6: +case 0x91F7: +case 0x93F7: +case 0x95F7: +case 0x97F7: +case 0x99F7: +case 0x9BF7: +case 0x9DF7: +case 0x9FF7: + +// SUBA +case 0x91F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 8; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93F8: +case 0x95F8: +case 0x97F8: +case 0x99F8: +case 0x9BF8: +case 0x9DF8: +case 0x9FF8: + +// SUBA +case 0x91F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93F9: +case 0x95F9: +case 0x97F9: +case 0x99F9: +case 0x9BF9: +case 0x9DF9: +case 0x9FF9: + +// SUBA +case 0x91F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 10; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93FA: +case 0x95FA: +case 0x97FA: +case 0x99FA: +case 0x9BFA: +case 0x9DFA: +case 0x9FFA: + +// SUBA +case 0x91FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93FB: +case 0x95FB: +case 0x97FB: +case 0x99FB: +case 0x9BFB: +case 0x9DFB: +case 0x9FFB: + +// SUBA +case 0x91FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 8; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93FC: +case 0x95FC: +case 0x97FC: +case 0x99FC: +case 0x9BFC: +case 0x9DFC: +case 0x9FFC: + +// SUBA +case 0x91FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)FETCH_LONG; + PC += 4; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(14) +case 0x93DF: +case 0x95DF: +case 0x97DF: +case 0x99DF: +case 0x9BDF: +case 0x9DDF: +case 0x9FDF: + +// SUBA +case 0x91DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0x93E7: +case 0x95E7: +case 0x97E7: +case 0x99E7: +case 0x9BE7: +case 0x9DE7: +case 0x9FE7: + +// SUBA +case 0x91E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_opA.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_opA.inc new file mode 100644 index 0000000000..bd52da2650 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_opA.inc @@ -0,0 +1,4116 @@ +case 0xA001: +case 0xA002: +case 0xA003: +case 0xA004: +case 0xA005: +case 0xA006: +case 0xA007: +case 0xA008: +case 0xA009: +case 0xA00A: +case 0xA00B: +case 0xA00C: +case 0xA00D: +case 0xA00E: +case 0xA00F: +case 0xA010: +case 0xA011: +case 0xA012: +case 0xA013: +case 0xA014: +case 0xA015: +case 0xA016: +case 0xA017: +case 0xA018: +case 0xA019: +case 0xA01A: +case 0xA01B: +case 0xA01C: +case 0xA01D: +case 0xA01E: +case 0xA01F: +case 0xA020: +case 0xA021: +case 0xA022: +case 0xA023: +case 0xA024: +case 0xA025: +case 0xA026: +case 0xA027: +case 0xA028: +case 0xA029: +case 0xA02A: +case 0xA02B: +case 0xA02C: +case 0xA02D: +case 0xA02E: +case 0xA02F: +case 0xA030: +case 0xA031: +case 0xA032: +case 0xA033: +case 0xA034: +case 0xA035: +case 0xA036: +case 0xA037: +case 0xA038: +case 0xA039: +case 0xA03A: +case 0xA03B: +case 0xA03C: +case 0xA03D: +case 0xA03E: +case 0xA03F: +case 0xA040: +case 0xA041: +case 0xA042: +case 0xA043: +case 0xA044: +case 0xA045: +case 0xA046: +case 0xA047: +case 0xA048: +case 0xA049: +case 0xA04A: +case 0xA04B: +case 0xA04C: +case 0xA04D: +case 0xA04E: +case 0xA04F: +case 0xA050: +case 0xA051: +case 0xA052: +case 0xA053: +case 0xA054: +case 0xA055: +case 0xA056: +case 0xA057: +case 0xA058: +case 0xA059: +case 0xA05A: +case 0xA05B: +case 0xA05C: +case 0xA05D: +case 0xA05E: +case 0xA05F: +case 0xA060: +case 0xA061: +case 0xA062: +case 0xA063: +case 0xA064: +case 0xA065: +case 0xA066: +case 0xA067: +case 0xA068: +case 0xA069: +case 0xA06A: +case 0xA06B: +case 0xA06C: +case 0xA06D: +case 0xA06E: +case 0xA06F: +case 0xA070: +case 0xA071: +case 0xA072: +case 0xA073: +case 0xA074: +case 0xA075: +case 0xA076: +case 0xA077: +case 0xA078: +case 0xA079: +case 0xA07A: +case 0xA07B: +case 0xA07C: +case 0xA07D: +case 0xA07E: +case 0xA07F: +case 0xA080: +case 0xA081: +case 0xA082: +case 0xA083: +case 0xA084: +case 0xA085: +case 0xA086: +case 0xA087: +case 0xA088: +case 0xA089: +case 0xA08A: +case 0xA08B: +case 0xA08C: +case 0xA08D: +case 0xA08E: +case 0xA08F: +case 0xA090: +case 0xA091: +case 0xA092: +case 0xA093: +case 0xA094: +case 0xA095: +case 0xA096: +case 0xA097: +case 0xA098: +case 0xA099: +case 0xA09A: +case 0xA09B: +case 0xA09C: +case 0xA09D: +case 0xA09E: +case 0xA09F: +case 0xA0A0: +case 0xA0A1: +case 0xA0A2: +case 0xA0A3: +case 0xA0A4: +case 0xA0A5: +case 0xA0A6: +case 0xA0A7: +case 0xA0A8: +case 0xA0A9: +case 0xA0AA: +case 0xA0AB: +case 0xA0AC: +case 0xA0AD: +case 0xA0AE: +case 0xA0AF: +case 0xA0B0: +case 0xA0B1: +case 0xA0B2: +case 0xA0B3: +case 0xA0B4: +case 0xA0B5: +case 0xA0B6: +case 0xA0B7: +case 0xA0B8: +case 0xA0B9: +case 0xA0BA: +case 0xA0BB: +case 0xA0BC: +case 0xA0BD: +case 0xA0BE: +case 0xA0BF: +case 0xA0C0: +case 0xA0C1: +case 0xA0C2: +case 0xA0C3: +case 0xA0C4: +case 0xA0C5: +case 0xA0C6: +case 0xA0C7: +case 0xA0C8: +case 0xA0C9: +case 0xA0CA: +case 0xA0CB: +case 0xA0CC: +case 0xA0CD: +case 0xA0CE: +case 0xA0CF: +case 0xA0D0: +case 0xA0D1: +case 0xA0D2: +case 0xA0D3: +case 0xA0D4: +case 0xA0D5: +case 0xA0D6: +case 0xA0D7: +case 0xA0D8: +case 0xA0D9: +case 0xA0DA: +case 0xA0DB: +case 0xA0DC: +case 0xA0DD: +case 0xA0DE: +case 0xA0DF: +case 0xA0E0: +case 0xA0E1: +case 0xA0E2: +case 0xA0E3: +case 0xA0E4: +case 0xA0E5: +case 0xA0E6: +case 0xA0E7: +case 0xA0E8: +case 0xA0E9: +case 0xA0EA: +case 0xA0EB: +case 0xA0EC: +case 0xA0ED: +case 0xA0EE: +case 0xA0EF: +case 0xA0F0: +case 0xA0F1: +case 0xA0F2: +case 0xA0F3: +case 0xA0F4: +case 0xA0F5: +case 0xA0F6: +case 0xA0F7: +case 0xA0F8: +case 0xA0F9: +case 0xA0FA: +case 0xA0FB: +case 0xA0FC: +case 0xA0FD: +case 0xA0FE: +case 0xA0FF: +case 0xA100: +case 0xA101: +case 0xA102: +case 0xA103: +case 0xA104: +case 0xA105: +case 0xA106: +case 0xA107: +case 0xA108: +case 0xA109: +case 0xA10A: +case 0xA10B: +case 0xA10C: +case 0xA10D: +case 0xA10E: +case 0xA10F: +case 0xA110: +case 0xA111: +case 0xA112: +case 0xA113: +case 0xA114: +case 0xA115: +case 0xA116: +case 0xA117: +case 0xA118: +case 0xA119: +case 0xA11A: +case 0xA11B: +case 0xA11C: +case 0xA11D: +case 0xA11E: +case 0xA11F: +case 0xA120: +case 0xA121: +case 0xA122: +case 0xA123: +case 0xA124: +case 0xA125: +case 0xA126: +case 0xA127: +case 0xA128: +case 0xA129: +case 0xA12A: +case 0xA12B: +case 0xA12C: +case 0xA12D: +case 0xA12E: +case 0xA12F: +case 0xA130: +case 0xA131: +case 0xA132: +case 0xA133: +case 0xA134: +case 0xA135: +case 0xA136: +case 0xA137: +case 0xA138: +case 0xA139: +case 0xA13A: +case 0xA13B: +case 0xA13C: +case 0xA13D: +case 0xA13E: +case 0xA13F: +case 0xA140: +case 0xA141: +case 0xA142: +case 0xA143: +case 0xA144: +case 0xA145: +case 0xA146: +case 0xA147: +case 0xA148: +case 0xA149: +case 0xA14A: +case 0xA14B: +case 0xA14C: +case 0xA14D: +case 0xA14E: +case 0xA14F: +case 0xA150: +case 0xA151: +case 0xA152: +case 0xA153: +case 0xA154: +case 0xA155: +case 0xA156: +case 0xA157: +case 0xA158: +case 0xA159: +case 0xA15A: +case 0xA15B: +case 0xA15C: +case 0xA15D: +case 0xA15E: +case 0xA15F: +case 0xA160: +case 0xA161: +case 0xA162: +case 0xA163: +case 0xA164: +case 0xA165: +case 0xA166: +case 0xA167: +case 0xA168: +case 0xA169: +case 0xA16A: +case 0xA16B: +case 0xA16C: +case 0xA16D: +case 0xA16E: +case 0xA16F: +case 0xA170: +case 0xA171: +case 0xA172: +case 0xA173: +case 0xA174: +case 0xA175: +case 0xA176: +case 0xA177: +case 0xA178: +case 0xA179: +case 0xA17A: +case 0xA17B: +case 0xA17C: +case 0xA17D: +case 0xA17E: +case 0xA17F: +case 0xA180: +case 0xA181: +case 0xA182: +case 0xA183: +case 0xA184: +case 0xA185: +case 0xA186: +case 0xA187: +case 0xA188: +case 0xA189: +case 0xA18A: +case 0xA18B: +case 0xA18C: +case 0xA18D: +case 0xA18E: +case 0xA18F: +case 0xA190: +case 0xA191: +case 0xA192: +case 0xA193: +case 0xA194: +case 0xA195: +case 0xA196: +case 0xA197: +case 0xA198: +case 0xA199: +case 0xA19A: +case 0xA19B: +case 0xA19C: +case 0xA19D: +case 0xA19E: +case 0xA19F: +case 0xA1A0: +case 0xA1A1: +case 0xA1A2: +case 0xA1A3: +case 0xA1A4: +case 0xA1A5: +case 0xA1A6: +case 0xA1A7: +case 0xA1A8: +case 0xA1A9: +case 0xA1AA: +case 0xA1AB: +case 0xA1AC: +case 0xA1AD: +case 0xA1AE: +case 0xA1AF: +case 0xA1B0: +case 0xA1B1: +case 0xA1B2: +case 0xA1B3: +case 0xA1B4: +case 0xA1B5: +case 0xA1B6: +case 0xA1B7: +case 0xA1B8: +case 0xA1B9: +case 0xA1BA: +case 0xA1BB: +case 0xA1BC: +case 0xA1BD: +case 0xA1BE: +case 0xA1BF: +case 0xA1C0: +case 0xA1C1: +case 0xA1C2: +case 0xA1C3: +case 0xA1C4: +case 0xA1C5: +case 0xA1C6: +case 0xA1C7: +case 0xA1C8: +case 0xA1C9: +case 0xA1CA: +case 0xA1CB: +case 0xA1CC: +case 0xA1CD: +case 0xA1CE: +case 0xA1CF: +case 0xA1D0: +case 0xA1D1: +case 0xA1D2: +case 0xA1D3: +case 0xA1D4: +case 0xA1D5: +case 0xA1D6: +case 0xA1D7: +case 0xA1D8: +case 0xA1D9: +case 0xA1DA: +case 0xA1DB: +case 0xA1DC: +case 0xA1DD: +case 0xA1DE: +case 0xA1DF: +case 0xA1E0: +case 0xA1E1: +case 0xA1E2: +case 0xA1E3: +case 0xA1E4: +case 0xA1E5: +case 0xA1E6: +case 0xA1E7: +case 0xA1E8: +case 0xA1E9: +case 0xA1EA: +case 0xA1EB: +case 0xA1EC: +case 0xA1ED: +case 0xA1EE: +case 0xA1EF: +case 0xA1F0: +case 0xA1F1: +case 0xA1F2: +case 0xA1F3: +case 0xA1F4: +case 0xA1F5: +case 0xA1F6: +case 0xA1F7: +case 0xA1F8: +case 0xA1F9: +case 0xA1FA: +case 0xA1FB: +case 0xA1FC: +case 0xA1FD: +case 0xA1FE: +case 0xA1FF: +case 0xA200: +case 0xA201: +case 0xA202: +case 0xA203: +case 0xA204: +case 0xA205: +case 0xA206: +case 0xA207: +case 0xA208: +case 0xA209: +case 0xA20A: +case 0xA20B: +case 0xA20C: +case 0xA20D: +case 0xA20E: +case 0xA20F: +case 0xA210: +case 0xA211: +case 0xA212: +case 0xA213: +case 0xA214: +case 0xA215: +case 0xA216: +case 0xA217: +case 0xA218: +case 0xA219: +case 0xA21A: +case 0xA21B: +case 0xA21C: +case 0xA21D: +case 0xA21E: +case 0xA21F: +case 0xA220: +case 0xA221: +case 0xA222: +case 0xA223: +case 0xA224: +case 0xA225: +case 0xA226: +case 0xA227: +case 0xA228: +case 0xA229: +case 0xA22A: +case 0xA22B: +case 0xA22C: +case 0xA22D: +case 0xA22E: +case 0xA22F: +case 0xA230: +case 0xA231: +case 0xA232: +case 0xA233: +case 0xA234: +case 0xA235: +case 0xA236: +case 0xA237: +case 0xA238: +case 0xA239: +case 0xA23A: +case 0xA23B: +case 0xA23C: +case 0xA23D: +case 0xA23E: +case 0xA23F: +case 0xA240: +case 0xA241: +case 0xA242: +case 0xA243: +case 0xA244: +case 0xA245: +case 0xA246: +case 0xA247: +case 0xA248: +case 0xA249: +case 0xA24A: +case 0xA24B: +case 0xA24C: +case 0xA24D: +case 0xA24E: +case 0xA24F: +case 0xA250: +case 0xA251: +case 0xA252: +case 0xA253: +case 0xA254: +case 0xA255: +case 0xA256: +case 0xA257: +case 0xA258: +case 0xA259: +case 0xA25A: +case 0xA25B: +case 0xA25C: +case 0xA25D: +case 0xA25E: +case 0xA25F: +case 0xA260: +case 0xA261: +case 0xA262: +case 0xA263: +case 0xA264: +case 0xA265: +case 0xA266: +case 0xA267: +case 0xA268: +case 0xA269: +case 0xA26A: +case 0xA26B: +case 0xA26C: +case 0xA26D: +case 0xA26E: +case 0xA26F: +case 0xA270: +case 0xA271: +case 0xA272: +case 0xA273: +case 0xA274: +case 0xA275: +case 0xA276: +case 0xA277: +case 0xA278: +case 0xA279: +case 0xA27A: +case 0xA27B: +case 0xA27C: +case 0xA27D: +case 0xA27E: +case 0xA27F: +case 0xA280: +case 0xA281: +case 0xA282: +case 0xA283: +case 0xA284: +case 0xA285: +case 0xA286: +case 0xA287: +case 0xA288: +case 0xA289: +case 0xA28A: +case 0xA28B: +case 0xA28C: +case 0xA28D: +case 0xA28E: +case 0xA28F: +case 0xA290: +case 0xA291: +case 0xA292: +case 0xA293: +case 0xA294: +case 0xA295: +case 0xA296: +case 0xA297: +case 0xA298: +case 0xA299: +case 0xA29A: +case 0xA29B: +case 0xA29C: +case 0xA29D: +case 0xA29E: +case 0xA29F: +case 0xA2A0: +case 0xA2A1: +case 0xA2A2: +case 0xA2A3: +case 0xA2A4: +case 0xA2A5: +case 0xA2A6: +case 0xA2A7: +case 0xA2A8: +case 0xA2A9: +case 0xA2AA: +case 0xA2AB: +case 0xA2AC: +case 0xA2AD: +case 0xA2AE: +case 0xA2AF: +case 0xA2B0: +case 0xA2B1: +case 0xA2B2: +case 0xA2B3: +case 0xA2B4: +case 0xA2B5: +case 0xA2B6: +case 0xA2B7: +case 0xA2B8: +case 0xA2B9: +case 0xA2BA: +case 0xA2BB: +case 0xA2BC: +case 0xA2BD: +case 0xA2BE: +case 0xA2BF: +case 0xA2C0: +case 0xA2C1: +case 0xA2C2: +case 0xA2C3: +case 0xA2C4: +case 0xA2C5: +case 0xA2C6: +case 0xA2C7: +case 0xA2C8: +case 0xA2C9: +case 0xA2CA: +case 0xA2CB: +case 0xA2CC: +case 0xA2CD: +case 0xA2CE: +case 0xA2CF: +case 0xA2D0: +case 0xA2D1: +case 0xA2D2: +case 0xA2D3: +case 0xA2D4: +case 0xA2D5: +case 0xA2D6: +case 0xA2D7: +case 0xA2D8: +case 0xA2D9: +case 0xA2DA: +case 0xA2DB: +case 0xA2DC: +case 0xA2DD: +case 0xA2DE: +case 0xA2DF: +case 0xA2E0: +case 0xA2E1: +case 0xA2E2: +case 0xA2E3: +case 0xA2E4: +case 0xA2E5: +case 0xA2E6: +case 0xA2E7: +case 0xA2E8: +case 0xA2E9: +case 0xA2EA: +case 0xA2EB: +case 0xA2EC: +case 0xA2ED: +case 0xA2EE: +case 0xA2EF: +case 0xA2F0: +case 0xA2F1: +case 0xA2F2: +case 0xA2F3: +case 0xA2F4: +case 0xA2F5: +case 0xA2F6: +case 0xA2F7: +case 0xA2F8: +case 0xA2F9: +case 0xA2FA: +case 0xA2FB: +case 0xA2FC: +case 0xA2FD: +case 0xA2FE: +case 0xA2FF: +case 0xA300: +case 0xA301: +case 0xA302: +case 0xA303: +case 0xA304: +case 0xA305: +case 0xA306: +case 0xA307: +case 0xA308: +case 0xA309: +case 0xA30A: +case 0xA30B: +case 0xA30C: +case 0xA30D: +case 0xA30E: +case 0xA30F: +case 0xA310: +case 0xA311: +case 0xA312: +case 0xA313: +case 0xA314: +case 0xA315: +case 0xA316: +case 0xA317: +case 0xA318: +case 0xA319: +case 0xA31A: +case 0xA31B: +case 0xA31C: +case 0xA31D: +case 0xA31E: +case 0xA31F: +case 0xA320: +case 0xA321: +case 0xA322: +case 0xA323: +case 0xA324: +case 0xA325: +case 0xA326: +case 0xA327: +case 0xA328: +case 0xA329: +case 0xA32A: +case 0xA32B: +case 0xA32C: +case 0xA32D: +case 0xA32E: +case 0xA32F: +case 0xA330: +case 0xA331: +case 0xA332: +case 0xA333: +case 0xA334: +case 0xA335: +case 0xA336: +case 0xA337: +case 0xA338: +case 0xA339: +case 0xA33A: +case 0xA33B: +case 0xA33C: +case 0xA33D: +case 0xA33E: +case 0xA33F: +case 0xA340: +case 0xA341: +case 0xA342: +case 0xA343: +case 0xA344: +case 0xA345: +case 0xA346: +case 0xA347: +case 0xA348: +case 0xA349: +case 0xA34A: +case 0xA34B: +case 0xA34C: +case 0xA34D: +case 0xA34E: +case 0xA34F: +case 0xA350: +case 0xA351: +case 0xA352: +case 0xA353: +case 0xA354: +case 0xA355: +case 0xA356: +case 0xA357: +case 0xA358: +case 0xA359: +case 0xA35A: +case 0xA35B: +case 0xA35C: +case 0xA35D: +case 0xA35E: +case 0xA35F: +case 0xA360: +case 0xA361: +case 0xA362: +case 0xA363: +case 0xA364: +case 0xA365: +case 0xA366: +case 0xA367: +case 0xA368: +case 0xA369: +case 0xA36A: +case 0xA36B: +case 0xA36C: +case 0xA36D: +case 0xA36E: +case 0xA36F: +case 0xA370: +case 0xA371: +case 0xA372: +case 0xA373: +case 0xA374: +case 0xA375: +case 0xA376: +case 0xA377: +case 0xA378: +case 0xA379: +case 0xA37A: +case 0xA37B: +case 0xA37C: +case 0xA37D: +case 0xA37E: +case 0xA37F: +case 0xA380: +case 0xA381: +case 0xA382: +case 0xA383: +case 0xA384: +case 0xA385: +case 0xA386: +case 0xA387: +case 0xA388: +case 0xA389: +case 0xA38A: +case 0xA38B: +case 0xA38C: +case 0xA38D: +case 0xA38E: +case 0xA38F: +case 0xA390: +case 0xA391: +case 0xA392: +case 0xA393: +case 0xA394: +case 0xA395: +case 0xA396: +case 0xA397: +case 0xA398: +case 0xA399: +case 0xA39A: +case 0xA39B: +case 0xA39C: +case 0xA39D: +case 0xA39E: +case 0xA39F: +case 0xA3A0: +case 0xA3A1: +case 0xA3A2: +case 0xA3A3: +case 0xA3A4: +case 0xA3A5: +case 0xA3A6: +case 0xA3A7: +case 0xA3A8: +case 0xA3A9: +case 0xA3AA: +case 0xA3AB: +case 0xA3AC: +case 0xA3AD: +case 0xA3AE: +case 0xA3AF: +case 0xA3B0: +case 0xA3B1: +case 0xA3B2: +case 0xA3B3: +case 0xA3B4: +case 0xA3B5: +case 0xA3B6: +case 0xA3B7: +case 0xA3B8: +case 0xA3B9: +case 0xA3BA: +case 0xA3BB: +case 0xA3BC: +case 0xA3BD: +case 0xA3BE: +case 0xA3BF: +case 0xA3C0: +case 0xA3C1: +case 0xA3C2: +case 0xA3C3: +case 0xA3C4: +case 0xA3C5: +case 0xA3C6: +case 0xA3C7: +case 0xA3C8: +case 0xA3C9: +case 0xA3CA: +case 0xA3CB: +case 0xA3CC: +case 0xA3CD: +case 0xA3CE: +case 0xA3CF: +case 0xA3D0: +case 0xA3D1: +case 0xA3D2: +case 0xA3D3: +case 0xA3D4: +case 0xA3D5: +case 0xA3D6: +case 0xA3D7: +case 0xA3D8: +case 0xA3D9: +case 0xA3DA: +case 0xA3DB: +case 0xA3DC: +case 0xA3DD: +case 0xA3DE: +case 0xA3DF: +case 0xA3E0: +case 0xA3E1: +case 0xA3E2: +case 0xA3E3: +case 0xA3E4: +case 0xA3E5: +case 0xA3E6: +case 0xA3E7: +case 0xA3E8: +case 0xA3E9: +case 0xA3EA: +case 0xA3EB: +case 0xA3EC: +case 0xA3ED: +case 0xA3EE: +case 0xA3EF: +case 0xA3F0: +case 0xA3F1: +case 0xA3F2: +case 0xA3F3: +case 0xA3F4: +case 0xA3F5: +case 0xA3F6: +case 0xA3F7: +case 0xA3F8: +case 0xA3F9: +case 0xA3FA: +case 0xA3FB: +case 0xA3FC: +case 0xA3FD: +case 0xA3FE: +case 0xA3FF: +case 0xA400: +case 0xA401: +case 0xA402: +case 0xA403: +case 0xA404: +case 0xA405: +case 0xA406: +case 0xA407: +case 0xA408: +case 0xA409: +case 0xA40A: +case 0xA40B: +case 0xA40C: +case 0xA40D: +case 0xA40E: +case 0xA40F: +case 0xA410: +case 0xA411: +case 0xA412: +case 0xA413: +case 0xA414: +case 0xA415: +case 0xA416: +case 0xA417: +case 0xA418: +case 0xA419: +case 0xA41A: +case 0xA41B: +case 0xA41C: +case 0xA41D: +case 0xA41E: +case 0xA41F: +case 0xA420: +case 0xA421: +case 0xA422: +case 0xA423: +case 0xA424: +case 0xA425: +case 0xA426: +case 0xA427: +case 0xA428: +case 0xA429: +case 0xA42A: +case 0xA42B: +case 0xA42C: +case 0xA42D: +case 0xA42E: +case 0xA42F: +case 0xA430: +case 0xA431: +case 0xA432: +case 0xA433: +case 0xA434: +case 0xA435: +case 0xA436: +case 0xA437: +case 0xA438: +case 0xA439: +case 0xA43A: +case 0xA43B: +case 0xA43C: +case 0xA43D: +case 0xA43E: +case 0xA43F: +case 0xA440: +case 0xA441: +case 0xA442: +case 0xA443: +case 0xA444: +case 0xA445: +case 0xA446: +case 0xA447: +case 0xA448: +case 0xA449: +case 0xA44A: +case 0xA44B: +case 0xA44C: +case 0xA44D: +case 0xA44E: +case 0xA44F: +case 0xA450: +case 0xA451: +case 0xA452: +case 0xA453: +case 0xA454: +case 0xA455: +case 0xA456: +case 0xA457: +case 0xA458: +case 0xA459: +case 0xA45A: +case 0xA45B: +case 0xA45C: +case 0xA45D: +case 0xA45E: +case 0xA45F: +case 0xA460: +case 0xA461: +case 0xA462: +case 0xA463: +case 0xA464: +case 0xA465: +case 0xA466: +case 0xA467: +case 0xA468: +case 0xA469: +case 0xA46A: +case 0xA46B: +case 0xA46C: +case 0xA46D: +case 0xA46E: +case 0xA46F: +case 0xA470: +case 0xA471: +case 0xA472: +case 0xA473: +case 0xA474: +case 0xA475: +case 0xA476: +case 0xA477: +case 0xA478: +case 0xA479: +case 0xA47A: +case 0xA47B: +case 0xA47C: +case 0xA47D: +case 0xA47E: +case 0xA47F: +case 0xA480: +case 0xA481: +case 0xA482: +case 0xA483: +case 0xA484: +case 0xA485: +case 0xA486: +case 0xA487: +case 0xA488: +case 0xA489: +case 0xA48A: +case 0xA48B: +case 0xA48C: +case 0xA48D: +case 0xA48E: +case 0xA48F: +case 0xA490: +case 0xA491: +case 0xA492: +case 0xA493: +case 0xA494: +case 0xA495: +case 0xA496: +case 0xA497: +case 0xA498: +case 0xA499: +case 0xA49A: +case 0xA49B: +case 0xA49C: +case 0xA49D: +case 0xA49E: +case 0xA49F: +case 0xA4A0: +case 0xA4A1: +case 0xA4A2: +case 0xA4A3: +case 0xA4A4: +case 0xA4A5: +case 0xA4A6: +case 0xA4A7: +case 0xA4A8: +case 0xA4A9: +case 0xA4AA: +case 0xA4AB: +case 0xA4AC: +case 0xA4AD: +case 0xA4AE: +case 0xA4AF: +case 0xA4B0: +case 0xA4B1: +case 0xA4B2: +case 0xA4B3: +case 0xA4B4: +case 0xA4B5: +case 0xA4B6: +case 0xA4B7: +case 0xA4B8: +case 0xA4B9: +case 0xA4BA: +case 0xA4BB: +case 0xA4BC: +case 0xA4BD: +case 0xA4BE: +case 0xA4BF: +case 0xA4C0: +case 0xA4C1: +case 0xA4C2: +case 0xA4C3: +case 0xA4C4: +case 0xA4C5: +case 0xA4C6: +case 0xA4C7: +case 0xA4C8: +case 0xA4C9: +case 0xA4CA: +case 0xA4CB: +case 0xA4CC: +case 0xA4CD: +case 0xA4CE: +case 0xA4CF: +case 0xA4D0: +case 0xA4D1: +case 0xA4D2: +case 0xA4D3: +case 0xA4D4: +case 0xA4D5: +case 0xA4D6: +case 0xA4D7: +case 0xA4D8: +case 0xA4D9: +case 0xA4DA: +case 0xA4DB: +case 0xA4DC: +case 0xA4DD: +case 0xA4DE: +case 0xA4DF: +case 0xA4E0: +case 0xA4E1: +case 0xA4E2: +case 0xA4E3: +case 0xA4E4: +case 0xA4E5: +case 0xA4E6: +case 0xA4E7: +case 0xA4E8: +case 0xA4E9: +case 0xA4EA: +case 0xA4EB: +case 0xA4EC: +case 0xA4ED: +case 0xA4EE: +case 0xA4EF: +case 0xA4F0: +case 0xA4F1: +case 0xA4F2: +case 0xA4F3: +case 0xA4F4: +case 0xA4F5: +case 0xA4F6: +case 0xA4F7: +case 0xA4F8: +case 0xA4F9: +case 0xA4FA: +case 0xA4FB: +case 0xA4FC: +case 0xA4FD: +case 0xA4FE: +case 0xA4FF: +case 0xA500: +case 0xA501: +case 0xA502: +case 0xA503: +case 0xA504: +case 0xA505: +case 0xA506: +case 0xA507: +case 0xA508: +case 0xA509: +case 0xA50A: +case 0xA50B: +case 0xA50C: +case 0xA50D: +case 0xA50E: +case 0xA50F: +case 0xA510: +case 0xA511: +case 0xA512: +case 0xA513: +case 0xA514: +case 0xA515: +case 0xA516: +case 0xA517: +case 0xA518: +case 0xA519: +case 0xA51A: +case 0xA51B: +case 0xA51C: +case 0xA51D: +case 0xA51E: +case 0xA51F: +case 0xA520: +case 0xA521: +case 0xA522: +case 0xA523: +case 0xA524: +case 0xA525: +case 0xA526: +case 0xA527: +case 0xA528: +case 0xA529: +case 0xA52A: +case 0xA52B: +case 0xA52C: +case 0xA52D: +case 0xA52E: +case 0xA52F: +case 0xA530: +case 0xA531: +case 0xA532: +case 0xA533: +case 0xA534: +case 0xA535: +case 0xA536: +case 0xA537: +case 0xA538: +case 0xA539: +case 0xA53A: +case 0xA53B: +case 0xA53C: +case 0xA53D: +case 0xA53E: +case 0xA53F: +case 0xA540: +case 0xA541: +case 0xA542: +case 0xA543: +case 0xA544: +case 0xA545: +case 0xA546: +case 0xA547: +case 0xA548: +case 0xA549: +case 0xA54A: +case 0xA54B: +case 0xA54C: +case 0xA54D: +case 0xA54E: +case 0xA54F: +case 0xA550: +case 0xA551: +case 0xA552: +case 0xA553: +case 0xA554: +case 0xA555: +case 0xA556: +case 0xA557: +case 0xA558: +case 0xA559: +case 0xA55A: +case 0xA55B: +case 0xA55C: +case 0xA55D: +case 0xA55E: +case 0xA55F: +case 0xA560: +case 0xA561: +case 0xA562: +case 0xA563: +case 0xA564: +case 0xA565: +case 0xA566: +case 0xA567: +case 0xA568: +case 0xA569: +case 0xA56A: +case 0xA56B: +case 0xA56C: +case 0xA56D: +case 0xA56E: +case 0xA56F: +case 0xA570: +case 0xA571: +case 0xA572: +case 0xA573: +case 0xA574: +case 0xA575: +case 0xA576: +case 0xA577: +case 0xA578: +case 0xA579: +case 0xA57A: +case 0xA57B: +case 0xA57C: +case 0xA57D: +case 0xA57E: +case 0xA57F: +case 0xA580: +case 0xA581: +case 0xA582: +case 0xA583: +case 0xA584: +case 0xA585: +case 0xA586: +case 0xA587: +case 0xA588: +case 0xA589: +case 0xA58A: +case 0xA58B: +case 0xA58C: +case 0xA58D: +case 0xA58E: +case 0xA58F: +case 0xA590: +case 0xA591: +case 0xA592: +case 0xA593: +case 0xA594: +case 0xA595: +case 0xA596: +case 0xA597: +case 0xA598: +case 0xA599: +case 0xA59A: +case 0xA59B: +case 0xA59C: +case 0xA59D: +case 0xA59E: +case 0xA59F: +case 0xA5A0: +case 0xA5A1: +case 0xA5A2: +case 0xA5A3: +case 0xA5A4: +case 0xA5A5: +case 0xA5A6: +case 0xA5A7: +case 0xA5A8: +case 0xA5A9: +case 0xA5AA: +case 0xA5AB: +case 0xA5AC: +case 0xA5AD: +case 0xA5AE: +case 0xA5AF: +case 0xA5B0: +case 0xA5B1: +case 0xA5B2: +case 0xA5B3: +case 0xA5B4: +case 0xA5B5: +case 0xA5B6: +case 0xA5B7: +case 0xA5B8: +case 0xA5B9: +case 0xA5BA: +case 0xA5BB: +case 0xA5BC: +case 0xA5BD: +case 0xA5BE: +case 0xA5BF: +case 0xA5C0: +case 0xA5C1: +case 0xA5C2: +case 0xA5C3: +case 0xA5C4: +case 0xA5C5: +case 0xA5C6: +case 0xA5C7: +case 0xA5C8: +case 0xA5C9: +case 0xA5CA: +case 0xA5CB: +case 0xA5CC: +case 0xA5CD: +case 0xA5CE: +case 0xA5CF: +case 0xA5D0: +case 0xA5D1: +case 0xA5D2: +case 0xA5D3: +case 0xA5D4: +case 0xA5D5: +case 0xA5D6: +case 0xA5D7: +case 0xA5D8: +case 0xA5D9: +case 0xA5DA: +case 0xA5DB: +case 0xA5DC: +case 0xA5DD: +case 0xA5DE: +case 0xA5DF: +case 0xA5E0: +case 0xA5E1: +case 0xA5E2: +case 0xA5E3: +case 0xA5E4: +case 0xA5E5: +case 0xA5E6: +case 0xA5E7: +case 0xA5E8: +case 0xA5E9: +case 0xA5EA: +case 0xA5EB: +case 0xA5EC: +case 0xA5ED: +case 0xA5EE: +case 0xA5EF: +case 0xA5F0: +case 0xA5F1: +case 0xA5F2: +case 0xA5F3: +case 0xA5F4: +case 0xA5F5: +case 0xA5F6: +case 0xA5F7: +case 0xA5F8: +case 0xA5F9: +case 0xA5FA: +case 0xA5FB: +case 0xA5FC: +case 0xA5FD: +case 0xA5FE: +case 0xA5FF: +case 0xA600: +case 0xA601: +case 0xA602: +case 0xA603: +case 0xA604: +case 0xA605: +case 0xA606: +case 0xA607: +case 0xA608: +case 0xA609: +case 0xA60A: +case 0xA60B: +case 0xA60C: +case 0xA60D: +case 0xA60E: +case 0xA60F: +case 0xA610: +case 0xA611: +case 0xA612: +case 0xA613: +case 0xA614: +case 0xA615: +case 0xA616: +case 0xA617: +case 0xA618: +case 0xA619: +case 0xA61A: +case 0xA61B: +case 0xA61C: +case 0xA61D: +case 0xA61E: +case 0xA61F: +case 0xA620: +case 0xA621: +case 0xA622: +case 0xA623: +case 0xA624: +case 0xA625: +case 0xA626: +case 0xA627: +case 0xA628: +case 0xA629: +case 0xA62A: +case 0xA62B: +case 0xA62C: +case 0xA62D: +case 0xA62E: +case 0xA62F: +case 0xA630: +case 0xA631: +case 0xA632: +case 0xA633: +case 0xA634: +case 0xA635: +case 0xA636: +case 0xA637: +case 0xA638: +case 0xA639: +case 0xA63A: +case 0xA63B: +case 0xA63C: +case 0xA63D: +case 0xA63E: +case 0xA63F: +case 0xA640: +case 0xA641: +case 0xA642: +case 0xA643: +case 0xA644: +case 0xA645: +case 0xA646: +case 0xA647: +case 0xA648: +case 0xA649: +case 0xA64A: +case 0xA64B: +case 0xA64C: +case 0xA64D: +case 0xA64E: +case 0xA64F: +case 0xA650: +case 0xA651: +case 0xA652: +case 0xA653: +case 0xA654: +case 0xA655: +case 0xA656: +case 0xA657: +case 0xA658: +case 0xA659: +case 0xA65A: +case 0xA65B: +case 0xA65C: +case 0xA65D: +case 0xA65E: +case 0xA65F: +case 0xA660: +case 0xA661: +case 0xA662: +case 0xA663: +case 0xA664: +case 0xA665: +case 0xA666: +case 0xA667: +case 0xA668: +case 0xA669: +case 0xA66A: +case 0xA66B: +case 0xA66C: +case 0xA66D: +case 0xA66E: +case 0xA66F: +case 0xA670: +case 0xA671: +case 0xA672: +case 0xA673: +case 0xA674: +case 0xA675: +case 0xA676: +case 0xA677: +case 0xA678: +case 0xA679: +case 0xA67A: +case 0xA67B: +case 0xA67C: +case 0xA67D: +case 0xA67E: +case 0xA67F: +case 0xA680: +case 0xA681: +case 0xA682: +case 0xA683: +case 0xA684: +case 0xA685: +case 0xA686: +case 0xA687: +case 0xA688: +case 0xA689: +case 0xA68A: +case 0xA68B: +case 0xA68C: +case 0xA68D: +case 0xA68E: +case 0xA68F: +case 0xA690: +case 0xA691: +case 0xA692: +case 0xA693: +case 0xA694: +case 0xA695: +case 0xA696: +case 0xA697: +case 0xA698: +case 0xA699: +case 0xA69A: +case 0xA69B: +case 0xA69C: +case 0xA69D: +case 0xA69E: +case 0xA69F: +case 0xA6A0: +case 0xA6A1: +case 0xA6A2: +case 0xA6A3: +case 0xA6A4: +case 0xA6A5: +case 0xA6A6: +case 0xA6A7: +case 0xA6A8: +case 0xA6A9: +case 0xA6AA: +case 0xA6AB: +case 0xA6AC: +case 0xA6AD: +case 0xA6AE: +case 0xA6AF: +case 0xA6B0: +case 0xA6B1: +case 0xA6B2: +case 0xA6B3: +case 0xA6B4: +case 0xA6B5: +case 0xA6B6: +case 0xA6B7: +case 0xA6B8: +case 0xA6B9: +case 0xA6BA: +case 0xA6BB: +case 0xA6BC: +case 0xA6BD: +case 0xA6BE: +case 0xA6BF: +case 0xA6C0: +case 0xA6C1: +case 0xA6C2: +case 0xA6C3: +case 0xA6C4: +case 0xA6C5: +case 0xA6C6: +case 0xA6C7: +case 0xA6C8: +case 0xA6C9: +case 0xA6CA: +case 0xA6CB: +case 0xA6CC: +case 0xA6CD: +case 0xA6CE: +case 0xA6CF: +case 0xA6D0: +case 0xA6D1: +case 0xA6D2: +case 0xA6D3: +case 0xA6D4: +case 0xA6D5: +case 0xA6D6: +case 0xA6D7: +case 0xA6D8: +case 0xA6D9: +case 0xA6DA: +case 0xA6DB: +case 0xA6DC: +case 0xA6DD: +case 0xA6DE: +case 0xA6DF: +case 0xA6E0: +case 0xA6E1: +case 0xA6E2: +case 0xA6E3: +case 0xA6E4: +case 0xA6E5: +case 0xA6E6: +case 0xA6E7: +case 0xA6E8: +case 0xA6E9: +case 0xA6EA: +case 0xA6EB: +case 0xA6EC: +case 0xA6ED: +case 0xA6EE: +case 0xA6EF: +case 0xA6F0: +case 0xA6F1: +case 0xA6F2: +case 0xA6F3: +case 0xA6F4: +case 0xA6F5: +case 0xA6F6: +case 0xA6F7: +case 0xA6F8: +case 0xA6F9: +case 0xA6FA: +case 0xA6FB: +case 0xA6FC: +case 0xA6FD: +case 0xA6FE: +case 0xA6FF: +case 0xA700: +case 0xA701: +case 0xA702: +case 0xA703: +case 0xA704: +case 0xA705: +case 0xA706: +case 0xA707: +case 0xA708: +case 0xA709: +case 0xA70A: +case 0xA70B: +case 0xA70C: +case 0xA70D: +case 0xA70E: +case 0xA70F: +case 0xA710: +case 0xA711: +case 0xA712: +case 0xA713: +case 0xA714: +case 0xA715: +case 0xA716: +case 0xA717: +case 0xA718: +case 0xA719: +case 0xA71A: +case 0xA71B: +case 0xA71C: +case 0xA71D: +case 0xA71E: +case 0xA71F: +case 0xA720: +case 0xA721: +case 0xA722: +case 0xA723: +case 0xA724: +case 0xA725: +case 0xA726: +case 0xA727: +case 0xA728: +case 0xA729: +case 0xA72A: +case 0xA72B: +case 0xA72C: +case 0xA72D: +case 0xA72E: +case 0xA72F: +case 0xA730: +case 0xA731: +case 0xA732: +case 0xA733: +case 0xA734: +case 0xA735: +case 0xA736: +case 0xA737: +case 0xA738: +case 0xA739: +case 0xA73A: +case 0xA73B: +case 0xA73C: +case 0xA73D: +case 0xA73E: +case 0xA73F: +case 0xA740: +case 0xA741: +case 0xA742: +case 0xA743: +case 0xA744: +case 0xA745: +case 0xA746: +case 0xA747: +case 0xA748: +case 0xA749: +case 0xA74A: +case 0xA74B: +case 0xA74C: +case 0xA74D: +case 0xA74E: +case 0xA74F: +case 0xA750: +case 0xA751: +case 0xA752: +case 0xA753: +case 0xA754: +case 0xA755: +case 0xA756: +case 0xA757: +case 0xA758: +case 0xA759: +case 0xA75A: +case 0xA75B: +case 0xA75C: +case 0xA75D: +case 0xA75E: +case 0xA75F: +case 0xA760: +case 0xA761: +case 0xA762: +case 0xA763: +case 0xA764: +case 0xA765: +case 0xA766: +case 0xA767: +case 0xA768: +case 0xA769: +case 0xA76A: +case 0xA76B: +case 0xA76C: +case 0xA76D: +case 0xA76E: +case 0xA76F: +case 0xA770: +case 0xA771: +case 0xA772: +case 0xA773: +case 0xA774: +case 0xA775: +case 0xA776: +case 0xA777: +case 0xA778: +case 0xA779: +case 0xA77A: +case 0xA77B: +case 0xA77C: +case 0xA77D: +case 0xA77E: +case 0xA77F: +case 0xA780: +case 0xA781: +case 0xA782: +case 0xA783: +case 0xA784: +case 0xA785: +case 0xA786: +case 0xA787: +case 0xA788: +case 0xA789: +case 0xA78A: +case 0xA78B: +case 0xA78C: +case 0xA78D: +case 0xA78E: +case 0xA78F: +case 0xA790: +case 0xA791: +case 0xA792: +case 0xA793: +case 0xA794: +case 0xA795: +case 0xA796: +case 0xA797: +case 0xA798: +case 0xA799: +case 0xA79A: +case 0xA79B: +case 0xA79C: +case 0xA79D: +case 0xA79E: +case 0xA79F: +case 0xA7A0: +case 0xA7A1: +case 0xA7A2: +case 0xA7A3: +case 0xA7A4: +case 0xA7A5: +case 0xA7A6: +case 0xA7A7: +case 0xA7A8: +case 0xA7A9: +case 0xA7AA: +case 0xA7AB: +case 0xA7AC: +case 0xA7AD: +case 0xA7AE: +case 0xA7AF: +case 0xA7B0: +case 0xA7B1: +case 0xA7B2: +case 0xA7B3: +case 0xA7B4: +case 0xA7B5: +case 0xA7B6: +case 0xA7B7: +case 0xA7B8: +case 0xA7B9: +case 0xA7BA: +case 0xA7BB: +case 0xA7BC: +case 0xA7BD: +case 0xA7BE: +case 0xA7BF: +case 0xA7C0: +case 0xA7C1: +case 0xA7C2: +case 0xA7C3: +case 0xA7C4: +case 0xA7C5: +case 0xA7C6: +case 0xA7C7: +case 0xA7C8: +case 0xA7C9: +case 0xA7CA: +case 0xA7CB: +case 0xA7CC: +case 0xA7CD: +case 0xA7CE: +case 0xA7CF: +case 0xA7D0: +case 0xA7D1: +case 0xA7D2: +case 0xA7D3: +case 0xA7D4: +case 0xA7D5: +case 0xA7D6: +case 0xA7D7: +case 0xA7D8: +case 0xA7D9: +case 0xA7DA: +case 0xA7DB: +case 0xA7DC: +case 0xA7DD: +case 0xA7DE: +case 0xA7DF: +case 0xA7E0: +case 0xA7E1: +case 0xA7E2: +case 0xA7E3: +case 0xA7E4: +case 0xA7E5: +case 0xA7E6: +case 0xA7E7: +case 0xA7E8: +case 0xA7E9: +case 0xA7EA: +case 0xA7EB: +case 0xA7EC: +case 0xA7ED: +case 0xA7EE: +case 0xA7EF: +case 0xA7F0: +case 0xA7F1: +case 0xA7F2: +case 0xA7F3: +case 0xA7F4: +case 0xA7F5: +case 0xA7F6: +case 0xA7F7: +case 0xA7F8: +case 0xA7F9: +case 0xA7FA: +case 0xA7FB: +case 0xA7FC: +case 0xA7FD: +case 0xA7FE: +case 0xA7FF: +case 0xA800: +case 0xA801: +case 0xA802: +case 0xA803: +case 0xA804: +case 0xA805: +case 0xA806: +case 0xA807: +case 0xA808: +case 0xA809: +case 0xA80A: +case 0xA80B: +case 0xA80C: +case 0xA80D: +case 0xA80E: +case 0xA80F: +case 0xA810: +case 0xA811: +case 0xA812: +case 0xA813: +case 0xA814: +case 0xA815: +case 0xA816: +case 0xA817: +case 0xA818: +case 0xA819: +case 0xA81A: +case 0xA81B: +case 0xA81C: +case 0xA81D: +case 0xA81E: +case 0xA81F: +case 0xA820: +case 0xA821: +case 0xA822: +case 0xA823: +case 0xA824: +case 0xA825: +case 0xA826: +case 0xA827: +case 0xA828: +case 0xA829: +case 0xA82A: +case 0xA82B: +case 0xA82C: +case 0xA82D: +case 0xA82E: +case 0xA82F: +case 0xA830: +case 0xA831: +case 0xA832: +case 0xA833: +case 0xA834: +case 0xA835: +case 0xA836: +case 0xA837: +case 0xA838: +case 0xA839: +case 0xA83A: +case 0xA83B: +case 0xA83C: +case 0xA83D: +case 0xA83E: +case 0xA83F: +case 0xA840: +case 0xA841: +case 0xA842: +case 0xA843: +case 0xA844: +case 0xA845: +case 0xA846: +case 0xA847: +case 0xA848: +case 0xA849: +case 0xA84A: +case 0xA84B: +case 0xA84C: +case 0xA84D: +case 0xA84E: +case 0xA84F: +case 0xA850: +case 0xA851: +case 0xA852: +case 0xA853: +case 0xA854: +case 0xA855: +case 0xA856: +case 0xA857: +case 0xA858: +case 0xA859: +case 0xA85A: +case 0xA85B: +case 0xA85C: +case 0xA85D: +case 0xA85E: +case 0xA85F: +case 0xA860: +case 0xA861: +case 0xA862: +case 0xA863: +case 0xA864: +case 0xA865: +case 0xA866: +case 0xA867: +case 0xA868: +case 0xA869: +case 0xA86A: +case 0xA86B: +case 0xA86C: +case 0xA86D: +case 0xA86E: +case 0xA86F: +case 0xA870: +case 0xA871: +case 0xA872: +case 0xA873: +case 0xA874: +case 0xA875: +case 0xA876: +case 0xA877: +case 0xA878: +case 0xA879: +case 0xA87A: +case 0xA87B: +case 0xA87C: +case 0xA87D: +case 0xA87E: +case 0xA87F: +case 0xA880: +case 0xA881: +case 0xA882: +case 0xA883: +case 0xA884: +case 0xA885: +case 0xA886: +case 0xA887: +case 0xA888: +case 0xA889: +case 0xA88A: +case 0xA88B: +case 0xA88C: +case 0xA88D: +case 0xA88E: +case 0xA88F: +case 0xA890: +case 0xA891: +case 0xA892: +case 0xA893: +case 0xA894: +case 0xA895: +case 0xA896: +case 0xA897: +case 0xA898: +case 0xA899: +case 0xA89A: +case 0xA89B: +case 0xA89C: +case 0xA89D: +case 0xA89E: +case 0xA89F: +case 0xA8A0: +case 0xA8A1: +case 0xA8A2: +case 0xA8A3: +case 0xA8A4: +case 0xA8A5: +case 0xA8A6: +case 0xA8A7: +case 0xA8A8: +case 0xA8A9: +case 0xA8AA: +case 0xA8AB: +case 0xA8AC: +case 0xA8AD: +case 0xA8AE: +case 0xA8AF: +case 0xA8B0: +case 0xA8B1: +case 0xA8B2: +case 0xA8B3: +case 0xA8B4: +case 0xA8B5: +case 0xA8B6: +case 0xA8B7: +case 0xA8B8: +case 0xA8B9: +case 0xA8BA: +case 0xA8BB: +case 0xA8BC: +case 0xA8BD: +case 0xA8BE: +case 0xA8BF: +case 0xA8C0: +case 0xA8C1: +case 0xA8C2: +case 0xA8C3: +case 0xA8C4: +case 0xA8C5: +case 0xA8C6: +case 0xA8C7: +case 0xA8C8: +case 0xA8C9: +case 0xA8CA: +case 0xA8CB: +case 0xA8CC: +case 0xA8CD: +case 0xA8CE: +case 0xA8CF: +case 0xA8D0: +case 0xA8D1: +case 0xA8D2: +case 0xA8D3: +case 0xA8D4: +case 0xA8D5: +case 0xA8D6: +case 0xA8D7: +case 0xA8D8: +case 0xA8D9: +case 0xA8DA: +case 0xA8DB: +case 0xA8DC: +case 0xA8DD: +case 0xA8DE: +case 0xA8DF: +case 0xA8E0: +case 0xA8E1: +case 0xA8E2: +case 0xA8E3: +case 0xA8E4: +case 0xA8E5: +case 0xA8E6: +case 0xA8E7: +case 0xA8E8: +case 0xA8E9: +case 0xA8EA: +case 0xA8EB: +case 0xA8EC: +case 0xA8ED: +case 0xA8EE: +case 0xA8EF: +case 0xA8F0: +case 0xA8F1: +case 0xA8F2: +case 0xA8F3: +case 0xA8F4: +case 0xA8F5: +case 0xA8F6: +case 0xA8F7: +case 0xA8F8: +case 0xA8F9: +case 0xA8FA: +case 0xA8FB: +case 0xA8FC: +case 0xA8FD: +case 0xA8FE: +case 0xA8FF: +case 0xA900: +case 0xA901: +case 0xA902: +case 0xA903: +case 0xA904: +case 0xA905: +case 0xA906: +case 0xA907: +case 0xA908: +case 0xA909: +case 0xA90A: +case 0xA90B: +case 0xA90C: +case 0xA90D: +case 0xA90E: +case 0xA90F: +case 0xA910: +case 0xA911: +case 0xA912: +case 0xA913: +case 0xA914: +case 0xA915: +case 0xA916: +case 0xA917: +case 0xA918: +case 0xA919: +case 0xA91A: +case 0xA91B: +case 0xA91C: +case 0xA91D: +case 0xA91E: +case 0xA91F: +case 0xA920: +case 0xA921: +case 0xA922: +case 0xA923: +case 0xA924: +case 0xA925: +case 0xA926: +case 0xA927: +case 0xA928: +case 0xA929: +case 0xA92A: +case 0xA92B: +case 0xA92C: +case 0xA92D: +case 0xA92E: +case 0xA92F: +case 0xA930: +case 0xA931: +case 0xA932: +case 0xA933: +case 0xA934: +case 0xA935: +case 0xA936: +case 0xA937: +case 0xA938: +case 0xA939: +case 0xA93A: +case 0xA93B: +case 0xA93C: +case 0xA93D: +case 0xA93E: +case 0xA93F: +case 0xA940: +case 0xA941: +case 0xA942: +case 0xA943: +case 0xA944: +case 0xA945: +case 0xA946: +case 0xA947: +case 0xA948: +case 0xA949: +case 0xA94A: +case 0xA94B: +case 0xA94C: +case 0xA94D: +case 0xA94E: +case 0xA94F: +case 0xA950: +case 0xA951: +case 0xA952: +case 0xA953: +case 0xA954: +case 0xA955: +case 0xA956: +case 0xA957: +case 0xA958: +case 0xA959: +case 0xA95A: +case 0xA95B: +case 0xA95C: +case 0xA95D: +case 0xA95E: +case 0xA95F: +case 0xA960: +case 0xA961: +case 0xA962: +case 0xA963: +case 0xA964: +case 0xA965: +case 0xA966: +case 0xA967: +case 0xA968: +case 0xA969: +case 0xA96A: +case 0xA96B: +case 0xA96C: +case 0xA96D: +case 0xA96E: +case 0xA96F: +case 0xA970: +case 0xA971: +case 0xA972: +case 0xA973: +case 0xA974: +case 0xA975: +case 0xA976: +case 0xA977: +case 0xA978: +case 0xA979: +case 0xA97A: +case 0xA97B: +case 0xA97C: +case 0xA97D: +case 0xA97E: +case 0xA97F: +case 0xA980: +case 0xA981: +case 0xA982: +case 0xA983: +case 0xA984: +case 0xA985: +case 0xA986: +case 0xA987: +case 0xA988: +case 0xA989: +case 0xA98A: +case 0xA98B: +case 0xA98C: +case 0xA98D: +case 0xA98E: +case 0xA98F: +case 0xA990: +case 0xA991: +case 0xA992: +case 0xA993: +case 0xA994: +case 0xA995: +case 0xA996: +case 0xA997: +case 0xA998: +case 0xA999: +case 0xA99A: +case 0xA99B: +case 0xA99C: +case 0xA99D: +case 0xA99E: +case 0xA99F: +case 0xA9A0: +case 0xA9A1: +case 0xA9A2: +case 0xA9A3: +case 0xA9A4: +case 0xA9A5: +case 0xA9A6: +case 0xA9A7: +case 0xA9A8: +case 0xA9A9: +case 0xA9AA: +case 0xA9AB: +case 0xA9AC: +case 0xA9AD: +case 0xA9AE: +case 0xA9AF: +case 0xA9B0: +case 0xA9B1: +case 0xA9B2: +case 0xA9B3: +case 0xA9B4: +case 0xA9B5: +case 0xA9B6: +case 0xA9B7: +case 0xA9B8: +case 0xA9B9: +case 0xA9BA: +case 0xA9BB: +case 0xA9BC: +case 0xA9BD: +case 0xA9BE: +case 0xA9BF: +case 0xA9C0: +case 0xA9C1: +case 0xA9C2: +case 0xA9C3: +case 0xA9C4: +case 0xA9C5: +case 0xA9C6: +case 0xA9C7: +case 0xA9C8: +case 0xA9C9: +case 0xA9CA: +case 0xA9CB: +case 0xA9CC: +case 0xA9CD: +case 0xA9CE: +case 0xA9CF: +case 0xA9D0: +case 0xA9D1: +case 0xA9D2: +case 0xA9D3: +case 0xA9D4: +case 0xA9D5: +case 0xA9D6: +case 0xA9D7: +case 0xA9D8: +case 0xA9D9: +case 0xA9DA: +case 0xA9DB: +case 0xA9DC: +case 0xA9DD: +case 0xA9DE: +case 0xA9DF: +case 0xA9E0: +case 0xA9E1: +case 0xA9E2: +case 0xA9E3: +case 0xA9E4: +case 0xA9E5: +case 0xA9E6: +case 0xA9E7: +case 0xA9E8: +case 0xA9E9: +case 0xA9EA: +case 0xA9EB: +case 0xA9EC: +case 0xA9ED: +case 0xA9EE: +case 0xA9EF: +case 0xA9F0: +case 0xA9F1: +case 0xA9F2: +case 0xA9F3: +case 0xA9F4: +case 0xA9F5: +case 0xA9F6: +case 0xA9F7: +case 0xA9F8: +case 0xA9F9: +case 0xA9FA: +case 0xA9FB: +case 0xA9FC: +case 0xA9FD: +case 0xA9FE: +case 0xA9FF: +case 0xAA00: +case 0xAA01: +case 0xAA02: +case 0xAA03: +case 0xAA04: +case 0xAA05: +case 0xAA06: +case 0xAA07: +case 0xAA08: +case 0xAA09: +case 0xAA0A: +case 0xAA0B: +case 0xAA0C: +case 0xAA0D: +case 0xAA0E: +case 0xAA0F: +case 0xAA10: +case 0xAA11: +case 0xAA12: +case 0xAA13: +case 0xAA14: +case 0xAA15: +case 0xAA16: +case 0xAA17: +case 0xAA18: +case 0xAA19: +case 0xAA1A: +case 0xAA1B: +case 0xAA1C: +case 0xAA1D: +case 0xAA1E: +case 0xAA1F: +case 0xAA20: +case 0xAA21: +case 0xAA22: +case 0xAA23: +case 0xAA24: +case 0xAA25: +case 0xAA26: +case 0xAA27: +case 0xAA28: +case 0xAA29: +case 0xAA2A: +case 0xAA2B: +case 0xAA2C: +case 0xAA2D: +case 0xAA2E: +case 0xAA2F: +case 0xAA30: +case 0xAA31: +case 0xAA32: +case 0xAA33: +case 0xAA34: +case 0xAA35: +case 0xAA36: +case 0xAA37: +case 0xAA38: +case 0xAA39: +case 0xAA3A: +case 0xAA3B: +case 0xAA3C: +case 0xAA3D: +case 0xAA3E: +case 0xAA3F: +case 0xAA40: +case 0xAA41: +case 0xAA42: +case 0xAA43: +case 0xAA44: +case 0xAA45: +case 0xAA46: +case 0xAA47: +case 0xAA48: +case 0xAA49: +case 0xAA4A: +case 0xAA4B: +case 0xAA4C: +case 0xAA4D: +case 0xAA4E: +case 0xAA4F: +case 0xAA50: +case 0xAA51: +case 0xAA52: +case 0xAA53: +case 0xAA54: +case 0xAA55: +case 0xAA56: +case 0xAA57: +case 0xAA58: +case 0xAA59: +case 0xAA5A: +case 0xAA5B: +case 0xAA5C: +case 0xAA5D: +case 0xAA5E: +case 0xAA5F: +case 0xAA60: +case 0xAA61: +case 0xAA62: +case 0xAA63: +case 0xAA64: +case 0xAA65: +case 0xAA66: +case 0xAA67: +case 0xAA68: +case 0xAA69: +case 0xAA6A: +case 0xAA6B: +case 0xAA6C: +case 0xAA6D: +case 0xAA6E: +case 0xAA6F: +case 0xAA70: +case 0xAA71: +case 0xAA72: +case 0xAA73: +case 0xAA74: +case 0xAA75: +case 0xAA76: +case 0xAA77: +case 0xAA78: +case 0xAA79: +case 0xAA7A: +case 0xAA7B: +case 0xAA7C: +case 0xAA7D: +case 0xAA7E: +case 0xAA7F: +case 0xAA80: +case 0xAA81: +case 0xAA82: +case 0xAA83: +case 0xAA84: +case 0xAA85: +case 0xAA86: +case 0xAA87: +case 0xAA88: +case 0xAA89: +case 0xAA8A: +case 0xAA8B: +case 0xAA8C: +case 0xAA8D: +case 0xAA8E: +case 0xAA8F: +case 0xAA90: +case 0xAA91: +case 0xAA92: +case 0xAA93: +case 0xAA94: +case 0xAA95: +case 0xAA96: +case 0xAA97: +case 0xAA98: +case 0xAA99: +case 0xAA9A: +case 0xAA9B: +case 0xAA9C: +case 0xAA9D: +case 0xAA9E: +case 0xAA9F: +case 0xAAA0: +case 0xAAA1: +case 0xAAA2: +case 0xAAA3: +case 0xAAA4: +case 0xAAA5: +case 0xAAA6: +case 0xAAA7: +case 0xAAA8: +case 0xAAA9: +case 0xAAAA: +case 0xAAAB: +case 0xAAAC: +case 0xAAAD: +case 0xAAAE: +case 0xAAAF: +case 0xAAB0: +case 0xAAB1: +case 0xAAB2: +case 0xAAB3: +case 0xAAB4: +case 0xAAB5: +case 0xAAB6: +case 0xAAB7: +case 0xAAB8: +case 0xAAB9: +case 0xAABA: +case 0xAABB: +case 0xAABC: +case 0xAABD: +case 0xAABE: +case 0xAABF: +case 0xAAC0: +case 0xAAC1: +case 0xAAC2: +case 0xAAC3: +case 0xAAC4: +case 0xAAC5: +case 0xAAC6: +case 0xAAC7: +case 0xAAC8: +case 0xAAC9: +case 0xAACA: +case 0xAACB: +case 0xAACC: +case 0xAACD: +case 0xAACE: +case 0xAACF: +case 0xAAD0: +case 0xAAD1: +case 0xAAD2: +case 0xAAD3: +case 0xAAD4: +case 0xAAD5: +case 0xAAD6: +case 0xAAD7: +case 0xAAD8: +case 0xAAD9: +case 0xAADA: +case 0xAADB: +case 0xAADC: +case 0xAADD: +case 0xAADE: +case 0xAADF: +case 0xAAE0: +case 0xAAE1: +case 0xAAE2: +case 0xAAE3: +case 0xAAE4: +case 0xAAE5: +case 0xAAE6: +case 0xAAE7: +case 0xAAE8: +case 0xAAE9: +case 0xAAEA: +case 0xAAEB: +case 0xAAEC: +case 0xAAED: +case 0xAAEE: +case 0xAAEF: +case 0xAAF0: +case 0xAAF1: +case 0xAAF2: +case 0xAAF3: +case 0xAAF4: +case 0xAAF5: +case 0xAAF6: +case 0xAAF7: +case 0xAAF8: +case 0xAAF9: +case 0xAAFA: +case 0xAAFB: +case 0xAAFC: +case 0xAAFD: +case 0xAAFE: +case 0xAAFF: +case 0xAB00: +case 0xAB01: +case 0xAB02: +case 0xAB03: +case 0xAB04: +case 0xAB05: +case 0xAB06: +case 0xAB07: +case 0xAB08: +case 0xAB09: +case 0xAB0A: +case 0xAB0B: +case 0xAB0C: +case 0xAB0D: +case 0xAB0E: +case 0xAB0F: +case 0xAB10: +case 0xAB11: +case 0xAB12: +case 0xAB13: +case 0xAB14: +case 0xAB15: +case 0xAB16: +case 0xAB17: +case 0xAB18: +case 0xAB19: +case 0xAB1A: +case 0xAB1B: +case 0xAB1C: +case 0xAB1D: +case 0xAB1E: +case 0xAB1F: +case 0xAB20: +case 0xAB21: +case 0xAB22: +case 0xAB23: +case 0xAB24: +case 0xAB25: +case 0xAB26: +case 0xAB27: +case 0xAB28: +case 0xAB29: +case 0xAB2A: +case 0xAB2B: +case 0xAB2C: +case 0xAB2D: +case 0xAB2E: +case 0xAB2F: +case 0xAB30: +case 0xAB31: +case 0xAB32: +case 0xAB33: +case 0xAB34: +case 0xAB35: +case 0xAB36: +case 0xAB37: +case 0xAB38: +case 0xAB39: +case 0xAB3A: +case 0xAB3B: +case 0xAB3C: +case 0xAB3D: +case 0xAB3E: +case 0xAB3F: +case 0xAB40: +case 0xAB41: +case 0xAB42: +case 0xAB43: +case 0xAB44: +case 0xAB45: +case 0xAB46: +case 0xAB47: +case 0xAB48: +case 0xAB49: +case 0xAB4A: +case 0xAB4B: +case 0xAB4C: +case 0xAB4D: +case 0xAB4E: +case 0xAB4F: +case 0xAB50: +case 0xAB51: +case 0xAB52: +case 0xAB53: +case 0xAB54: +case 0xAB55: +case 0xAB56: +case 0xAB57: +case 0xAB58: +case 0xAB59: +case 0xAB5A: +case 0xAB5B: +case 0xAB5C: +case 0xAB5D: +case 0xAB5E: +case 0xAB5F: +case 0xAB60: +case 0xAB61: +case 0xAB62: +case 0xAB63: +case 0xAB64: +case 0xAB65: +case 0xAB66: +case 0xAB67: +case 0xAB68: +case 0xAB69: +case 0xAB6A: +case 0xAB6B: +case 0xAB6C: +case 0xAB6D: +case 0xAB6E: +case 0xAB6F: +case 0xAB70: +case 0xAB71: +case 0xAB72: +case 0xAB73: +case 0xAB74: +case 0xAB75: +case 0xAB76: +case 0xAB77: +case 0xAB78: +case 0xAB79: +case 0xAB7A: +case 0xAB7B: +case 0xAB7C: +case 0xAB7D: +case 0xAB7E: +case 0xAB7F: +case 0xAB80: +case 0xAB81: +case 0xAB82: +case 0xAB83: +case 0xAB84: +case 0xAB85: +case 0xAB86: +case 0xAB87: +case 0xAB88: +case 0xAB89: +case 0xAB8A: +case 0xAB8B: +case 0xAB8C: +case 0xAB8D: +case 0xAB8E: +case 0xAB8F: +case 0xAB90: +case 0xAB91: +case 0xAB92: +case 0xAB93: +case 0xAB94: +case 0xAB95: +case 0xAB96: +case 0xAB97: +case 0xAB98: +case 0xAB99: +case 0xAB9A: +case 0xAB9B: +case 0xAB9C: +case 0xAB9D: +case 0xAB9E: +case 0xAB9F: +case 0xABA0: +case 0xABA1: +case 0xABA2: +case 0xABA3: +case 0xABA4: +case 0xABA5: +case 0xABA6: +case 0xABA7: +case 0xABA8: +case 0xABA9: +case 0xABAA: +case 0xABAB: +case 0xABAC: +case 0xABAD: +case 0xABAE: +case 0xABAF: +case 0xABB0: +case 0xABB1: +case 0xABB2: +case 0xABB3: +case 0xABB4: +case 0xABB5: +case 0xABB6: +case 0xABB7: +case 0xABB8: +case 0xABB9: +case 0xABBA: +case 0xABBB: +case 0xABBC: +case 0xABBD: +case 0xABBE: +case 0xABBF: +case 0xABC0: +case 0xABC1: +case 0xABC2: +case 0xABC3: +case 0xABC4: +case 0xABC5: +case 0xABC6: +case 0xABC7: +case 0xABC8: +case 0xABC9: +case 0xABCA: +case 0xABCB: +case 0xABCC: +case 0xABCD: +case 0xABCE: +case 0xABCF: +case 0xABD0: +case 0xABD1: +case 0xABD2: +case 0xABD3: +case 0xABD4: +case 0xABD5: +case 0xABD6: +case 0xABD7: +case 0xABD8: +case 0xABD9: +case 0xABDA: +case 0xABDB: +case 0xABDC: +case 0xABDD: +case 0xABDE: +case 0xABDF: +case 0xABE0: +case 0xABE1: +case 0xABE2: +case 0xABE3: +case 0xABE4: +case 0xABE5: +case 0xABE6: +case 0xABE7: +case 0xABE8: +case 0xABE9: +case 0xABEA: +case 0xABEB: +case 0xABEC: +case 0xABED: +case 0xABEE: +case 0xABEF: +case 0xABF0: +case 0xABF1: +case 0xABF2: +case 0xABF3: +case 0xABF4: +case 0xABF5: +case 0xABF6: +case 0xABF7: +case 0xABF8: +case 0xABF9: +case 0xABFA: +case 0xABFB: +case 0xABFC: +case 0xABFD: +case 0xABFE: +case 0xABFF: +case 0xAC00: +case 0xAC01: +case 0xAC02: +case 0xAC03: +case 0xAC04: +case 0xAC05: +case 0xAC06: +case 0xAC07: +case 0xAC08: +case 0xAC09: +case 0xAC0A: +case 0xAC0B: +case 0xAC0C: +case 0xAC0D: +case 0xAC0E: +case 0xAC0F: +case 0xAC10: +case 0xAC11: +case 0xAC12: +case 0xAC13: +case 0xAC14: +case 0xAC15: +case 0xAC16: +case 0xAC17: +case 0xAC18: +case 0xAC19: +case 0xAC1A: +case 0xAC1B: +case 0xAC1C: +case 0xAC1D: +case 0xAC1E: +case 0xAC1F: +case 0xAC20: +case 0xAC21: +case 0xAC22: +case 0xAC23: +case 0xAC24: +case 0xAC25: +case 0xAC26: +case 0xAC27: +case 0xAC28: +case 0xAC29: +case 0xAC2A: +case 0xAC2B: +case 0xAC2C: +case 0xAC2D: +case 0xAC2E: +case 0xAC2F: +case 0xAC30: +case 0xAC31: +case 0xAC32: +case 0xAC33: +case 0xAC34: +case 0xAC35: +case 0xAC36: +case 0xAC37: +case 0xAC38: +case 0xAC39: +case 0xAC3A: +case 0xAC3B: +case 0xAC3C: +case 0xAC3D: +case 0xAC3E: +case 0xAC3F: +case 0xAC40: +case 0xAC41: +case 0xAC42: +case 0xAC43: +case 0xAC44: +case 0xAC45: +case 0xAC46: +case 0xAC47: +case 0xAC48: +case 0xAC49: +case 0xAC4A: +case 0xAC4B: +case 0xAC4C: +case 0xAC4D: +case 0xAC4E: +case 0xAC4F: +case 0xAC50: +case 0xAC51: +case 0xAC52: +case 0xAC53: +case 0xAC54: +case 0xAC55: +case 0xAC56: +case 0xAC57: +case 0xAC58: +case 0xAC59: +case 0xAC5A: +case 0xAC5B: +case 0xAC5C: +case 0xAC5D: +case 0xAC5E: +case 0xAC5F: +case 0xAC60: +case 0xAC61: +case 0xAC62: +case 0xAC63: +case 0xAC64: +case 0xAC65: +case 0xAC66: +case 0xAC67: +case 0xAC68: +case 0xAC69: +case 0xAC6A: +case 0xAC6B: +case 0xAC6C: +case 0xAC6D: +case 0xAC6E: +case 0xAC6F: +case 0xAC70: +case 0xAC71: +case 0xAC72: +case 0xAC73: +case 0xAC74: +case 0xAC75: +case 0xAC76: +case 0xAC77: +case 0xAC78: +case 0xAC79: +case 0xAC7A: +case 0xAC7B: +case 0xAC7C: +case 0xAC7D: +case 0xAC7E: +case 0xAC7F: +case 0xAC80: +case 0xAC81: +case 0xAC82: +case 0xAC83: +case 0xAC84: +case 0xAC85: +case 0xAC86: +case 0xAC87: +case 0xAC88: +case 0xAC89: +case 0xAC8A: +case 0xAC8B: +case 0xAC8C: +case 0xAC8D: +case 0xAC8E: +case 0xAC8F: +case 0xAC90: +case 0xAC91: +case 0xAC92: +case 0xAC93: +case 0xAC94: +case 0xAC95: +case 0xAC96: +case 0xAC97: +case 0xAC98: +case 0xAC99: +case 0xAC9A: +case 0xAC9B: +case 0xAC9C: +case 0xAC9D: +case 0xAC9E: +case 0xAC9F: +case 0xACA0: +case 0xACA1: +case 0xACA2: +case 0xACA3: +case 0xACA4: +case 0xACA5: +case 0xACA6: +case 0xACA7: +case 0xACA8: +case 0xACA9: +case 0xACAA: +case 0xACAB: +case 0xACAC: +case 0xACAD: +case 0xACAE: +case 0xACAF: +case 0xACB0: +case 0xACB1: +case 0xACB2: +case 0xACB3: +case 0xACB4: +case 0xACB5: +case 0xACB6: +case 0xACB7: +case 0xACB8: +case 0xACB9: +case 0xACBA: +case 0xACBB: +case 0xACBC: +case 0xACBD: +case 0xACBE: +case 0xACBF: +case 0xACC0: +case 0xACC1: +case 0xACC2: +case 0xACC3: +case 0xACC4: +case 0xACC5: +case 0xACC6: +case 0xACC7: +case 0xACC8: +case 0xACC9: +case 0xACCA: +case 0xACCB: +case 0xACCC: +case 0xACCD: +case 0xACCE: +case 0xACCF: +case 0xACD0: +case 0xACD1: +case 0xACD2: +case 0xACD3: +case 0xACD4: +case 0xACD5: +case 0xACD6: +case 0xACD7: +case 0xACD8: +case 0xACD9: +case 0xACDA: +case 0xACDB: +case 0xACDC: +case 0xACDD: +case 0xACDE: +case 0xACDF: +case 0xACE0: +case 0xACE1: +case 0xACE2: +case 0xACE3: +case 0xACE4: +case 0xACE5: +case 0xACE6: +case 0xACE7: +case 0xACE8: +case 0xACE9: +case 0xACEA: +case 0xACEB: +case 0xACEC: +case 0xACED: +case 0xACEE: +case 0xACEF: +case 0xACF0: +case 0xACF1: +case 0xACF2: +case 0xACF3: +case 0xACF4: +case 0xACF5: +case 0xACF6: +case 0xACF7: +case 0xACF8: +case 0xACF9: +case 0xACFA: +case 0xACFB: +case 0xACFC: +case 0xACFD: +case 0xACFE: +case 0xACFF: +case 0xAD00: +case 0xAD01: +case 0xAD02: +case 0xAD03: +case 0xAD04: +case 0xAD05: +case 0xAD06: +case 0xAD07: +case 0xAD08: +case 0xAD09: +case 0xAD0A: +case 0xAD0B: +case 0xAD0C: +case 0xAD0D: +case 0xAD0E: +case 0xAD0F: +case 0xAD10: +case 0xAD11: +case 0xAD12: +case 0xAD13: +case 0xAD14: +case 0xAD15: +case 0xAD16: +case 0xAD17: +case 0xAD18: +case 0xAD19: +case 0xAD1A: +case 0xAD1B: +case 0xAD1C: +case 0xAD1D: +case 0xAD1E: +case 0xAD1F: +case 0xAD20: +case 0xAD21: +case 0xAD22: +case 0xAD23: +case 0xAD24: +case 0xAD25: +case 0xAD26: +case 0xAD27: +case 0xAD28: +case 0xAD29: +case 0xAD2A: +case 0xAD2B: +case 0xAD2C: +case 0xAD2D: +case 0xAD2E: +case 0xAD2F: +case 0xAD30: +case 0xAD31: +case 0xAD32: +case 0xAD33: +case 0xAD34: +case 0xAD35: +case 0xAD36: +case 0xAD37: +case 0xAD38: +case 0xAD39: +case 0xAD3A: +case 0xAD3B: +case 0xAD3C: +case 0xAD3D: +case 0xAD3E: +case 0xAD3F: +case 0xAD40: +case 0xAD41: +case 0xAD42: +case 0xAD43: +case 0xAD44: +case 0xAD45: +case 0xAD46: +case 0xAD47: +case 0xAD48: +case 0xAD49: +case 0xAD4A: +case 0xAD4B: +case 0xAD4C: +case 0xAD4D: +case 0xAD4E: +case 0xAD4F: +case 0xAD50: +case 0xAD51: +case 0xAD52: +case 0xAD53: +case 0xAD54: +case 0xAD55: +case 0xAD56: +case 0xAD57: +case 0xAD58: +case 0xAD59: +case 0xAD5A: +case 0xAD5B: +case 0xAD5C: +case 0xAD5D: +case 0xAD5E: +case 0xAD5F: +case 0xAD60: +case 0xAD61: +case 0xAD62: +case 0xAD63: +case 0xAD64: +case 0xAD65: +case 0xAD66: +case 0xAD67: +case 0xAD68: +case 0xAD69: +case 0xAD6A: +case 0xAD6B: +case 0xAD6C: +case 0xAD6D: +case 0xAD6E: +case 0xAD6F: +case 0xAD70: +case 0xAD71: +case 0xAD72: +case 0xAD73: +case 0xAD74: +case 0xAD75: +case 0xAD76: +case 0xAD77: +case 0xAD78: +case 0xAD79: +case 0xAD7A: +case 0xAD7B: +case 0xAD7C: +case 0xAD7D: +case 0xAD7E: +case 0xAD7F: +case 0xAD80: +case 0xAD81: +case 0xAD82: +case 0xAD83: +case 0xAD84: +case 0xAD85: +case 0xAD86: +case 0xAD87: +case 0xAD88: +case 0xAD89: +case 0xAD8A: +case 0xAD8B: +case 0xAD8C: +case 0xAD8D: +case 0xAD8E: +case 0xAD8F: +case 0xAD90: +case 0xAD91: +case 0xAD92: +case 0xAD93: +case 0xAD94: +case 0xAD95: +case 0xAD96: +case 0xAD97: +case 0xAD98: +case 0xAD99: +case 0xAD9A: +case 0xAD9B: +case 0xAD9C: +case 0xAD9D: +case 0xAD9E: +case 0xAD9F: +case 0xADA0: +case 0xADA1: +case 0xADA2: +case 0xADA3: +case 0xADA4: +case 0xADA5: +case 0xADA6: +case 0xADA7: +case 0xADA8: +case 0xADA9: +case 0xADAA: +case 0xADAB: +case 0xADAC: +case 0xADAD: +case 0xADAE: +case 0xADAF: +case 0xADB0: +case 0xADB1: +case 0xADB2: +case 0xADB3: +case 0xADB4: +case 0xADB5: +case 0xADB6: +case 0xADB7: +case 0xADB8: +case 0xADB9: +case 0xADBA: +case 0xADBB: +case 0xADBC: +case 0xADBD: +case 0xADBE: +case 0xADBF: +case 0xADC0: +case 0xADC1: +case 0xADC2: +case 0xADC3: +case 0xADC4: +case 0xADC5: +case 0xADC6: +case 0xADC7: +case 0xADC8: +case 0xADC9: +case 0xADCA: +case 0xADCB: +case 0xADCC: +case 0xADCD: +case 0xADCE: +case 0xADCF: +case 0xADD0: +case 0xADD1: +case 0xADD2: +case 0xADD3: +case 0xADD4: +case 0xADD5: +case 0xADD6: +case 0xADD7: +case 0xADD8: +case 0xADD9: +case 0xADDA: +case 0xADDB: +case 0xADDC: +case 0xADDD: +case 0xADDE: +case 0xADDF: +case 0xADE0: +case 0xADE1: +case 0xADE2: +case 0xADE3: +case 0xADE4: +case 0xADE5: +case 0xADE6: +case 0xADE7: +case 0xADE8: +case 0xADE9: +case 0xADEA: +case 0xADEB: +case 0xADEC: +case 0xADED: +case 0xADEE: +case 0xADEF: +case 0xADF0: +case 0xADF1: +case 0xADF2: +case 0xADF3: +case 0xADF4: +case 0xADF5: +case 0xADF6: +case 0xADF7: +case 0xADF8: +case 0xADF9: +case 0xADFA: +case 0xADFB: +case 0xADFC: +case 0xADFD: +case 0xADFE: +case 0xADFF: +case 0xAE00: +case 0xAE01: +case 0xAE02: +case 0xAE03: +case 0xAE04: +case 0xAE05: +case 0xAE06: +case 0xAE07: +case 0xAE08: +case 0xAE09: +case 0xAE0A: +case 0xAE0B: +case 0xAE0C: +case 0xAE0D: +case 0xAE0E: +case 0xAE0F: +case 0xAE10: +case 0xAE11: +case 0xAE12: +case 0xAE13: +case 0xAE14: +case 0xAE15: +case 0xAE16: +case 0xAE17: +case 0xAE18: +case 0xAE19: +case 0xAE1A: +case 0xAE1B: +case 0xAE1C: +case 0xAE1D: +case 0xAE1E: +case 0xAE1F: +case 0xAE20: +case 0xAE21: +case 0xAE22: +case 0xAE23: +case 0xAE24: +case 0xAE25: +case 0xAE26: +case 0xAE27: +case 0xAE28: +case 0xAE29: +case 0xAE2A: +case 0xAE2B: +case 0xAE2C: +case 0xAE2D: +case 0xAE2E: +case 0xAE2F: +case 0xAE30: +case 0xAE31: +case 0xAE32: +case 0xAE33: +case 0xAE34: +case 0xAE35: +case 0xAE36: +case 0xAE37: +case 0xAE38: +case 0xAE39: +case 0xAE3A: +case 0xAE3B: +case 0xAE3C: +case 0xAE3D: +case 0xAE3E: +case 0xAE3F: +case 0xAE40: +case 0xAE41: +case 0xAE42: +case 0xAE43: +case 0xAE44: +case 0xAE45: +case 0xAE46: +case 0xAE47: +case 0xAE48: +case 0xAE49: +case 0xAE4A: +case 0xAE4B: +case 0xAE4C: +case 0xAE4D: +case 0xAE4E: +case 0xAE4F: +case 0xAE50: +case 0xAE51: +case 0xAE52: +case 0xAE53: +case 0xAE54: +case 0xAE55: +case 0xAE56: +case 0xAE57: +case 0xAE58: +case 0xAE59: +case 0xAE5A: +case 0xAE5B: +case 0xAE5C: +case 0xAE5D: +case 0xAE5E: +case 0xAE5F: +case 0xAE60: +case 0xAE61: +case 0xAE62: +case 0xAE63: +case 0xAE64: +case 0xAE65: +case 0xAE66: +case 0xAE67: +case 0xAE68: +case 0xAE69: +case 0xAE6A: +case 0xAE6B: +case 0xAE6C: +case 0xAE6D: +case 0xAE6E: +case 0xAE6F: +case 0xAE70: +case 0xAE71: +case 0xAE72: +case 0xAE73: +case 0xAE74: +case 0xAE75: +case 0xAE76: +case 0xAE77: +case 0xAE78: +case 0xAE79: +case 0xAE7A: +case 0xAE7B: +case 0xAE7C: +case 0xAE7D: +case 0xAE7E: +case 0xAE7F: +case 0xAE80: +case 0xAE81: +case 0xAE82: +case 0xAE83: +case 0xAE84: +case 0xAE85: +case 0xAE86: +case 0xAE87: +case 0xAE88: +case 0xAE89: +case 0xAE8A: +case 0xAE8B: +case 0xAE8C: +case 0xAE8D: +case 0xAE8E: +case 0xAE8F: +case 0xAE90: +case 0xAE91: +case 0xAE92: +case 0xAE93: +case 0xAE94: +case 0xAE95: +case 0xAE96: +case 0xAE97: +case 0xAE98: +case 0xAE99: +case 0xAE9A: +case 0xAE9B: +case 0xAE9C: +case 0xAE9D: +case 0xAE9E: +case 0xAE9F: +case 0xAEA0: +case 0xAEA1: +case 0xAEA2: +case 0xAEA3: +case 0xAEA4: +case 0xAEA5: +case 0xAEA6: +case 0xAEA7: +case 0xAEA8: +case 0xAEA9: +case 0xAEAA: +case 0xAEAB: +case 0xAEAC: +case 0xAEAD: +case 0xAEAE: +case 0xAEAF: +case 0xAEB0: +case 0xAEB1: +case 0xAEB2: +case 0xAEB3: +case 0xAEB4: +case 0xAEB5: +case 0xAEB6: +case 0xAEB7: +case 0xAEB8: +case 0xAEB9: +case 0xAEBA: +case 0xAEBB: +case 0xAEBC: +case 0xAEBD: +case 0xAEBE: +case 0xAEBF: +case 0xAEC0: +case 0xAEC1: +case 0xAEC2: +case 0xAEC3: +case 0xAEC4: +case 0xAEC5: +case 0xAEC6: +case 0xAEC7: +case 0xAEC8: +case 0xAEC9: +case 0xAECA: +case 0xAECB: +case 0xAECC: +case 0xAECD: +case 0xAECE: +case 0xAECF: +case 0xAED0: +case 0xAED1: +case 0xAED2: +case 0xAED3: +case 0xAED4: +case 0xAED5: +case 0xAED6: +case 0xAED7: +case 0xAED8: +case 0xAED9: +case 0xAEDA: +case 0xAEDB: +case 0xAEDC: +case 0xAEDD: +case 0xAEDE: +case 0xAEDF: +case 0xAEE0: +case 0xAEE1: +case 0xAEE2: +case 0xAEE3: +case 0xAEE4: +case 0xAEE5: +case 0xAEE6: +case 0xAEE7: +case 0xAEE8: +case 0xAEE9: +case 0xAEEA: +case 0xAEEB: +case 0xAEEC: +case 0xAEED: +case 0xAEEE: +case 0xAEEF: +case 0xAEF0: +case 0xAEF1: +case 0xAEF2: +case 0xAEF3: +case 0xAEF4: +case 0xAEF5: +case 0xAEF6: +case 0xAEF7: +case 0xAEF8: +case 0xAEF9: +case 0xAEFA: +case 0xAEFB: +case 0xAEFC: +case 0xAEFD: +case 0xAEFE: +case 0xAEFF: +case 0xAF00: +case 0xAF01: +case 0xAF02: +case 0xAF03: +case 0xAF04: +case 0xAF05: +case 0xAF06: +case 0xAF07: +case 0xAF08: +case 0xAF09: +case 0xAF0A: +case 0xAF0B: +case 0xAF0C: +case 0xAF0D: +case 0xAF0E: +case 0xAF0F: +case 0xAF10: +case 0xAF11: +case 0xAF12: +case 0xAF13: +case 0xAF14: +case 0xAF15: +case 0xAF16: +case 0xAF17: +case 0xAF18: +case 0xAF19: +case 0xAF1A: +case 0xAF1B: +case 0xAF1C: +case 0xAF1D: +case 0xAF1E: +case 0xAF1F: +case 0xAF20: +case 0xAF21: +case 0xAF22: +case 0xAF23: +case 0xAF24: +case 0xAF25: +case 0xAF26: +case 0xAF27: +case 0xAF28: +case 0xAF29: +case 0xAF2A: +case 0xAF2B: +case 0xAF2C: +case 0xAF2D: +case 0xAF2E: +case 0xAF2F: +case 0xAF30: +case 0xAF31: +case 0xAF32: +case 0xAF33: +case 0xAF34: +case 0xAF35: +case 0xAF36: +case 0xAF37: +case 0xAF38: +case 0xAF39: +case 0xAF3A: +case 0xAF3B: +case 0xAF3C: +case 0xAF3D: +case 0xAF3E: +case 0xAF3F: +case 0xAF40: +case 0xAF41: +case 0xAF42: +case 0xAF43: +case 0xAF44: +case 0xAF45: +case 0xAF46: +case 0xAF47: +case 0xAF48: +case 0xAF49: +case 0xAF4A: +case 0xAF4B: +case 0xAF4C: +case 0xAF4D: +case 0xAF4E: +case 0xAF4F: +case 0xAF50: +case 0xAF51: +case 0xAF52: +case 0xAF53: +case 0xAF54: +case 0xAF55: +case 0xAF56: +case 0xAF57: +case 0xAF58: +case 0xAF59: +case 0xAF5A: +case 0xAF5B: +case 0xAF5C: +case 0xAF5D: +case 0xAF5E: +case 0xAF5F: +case 0xAF60: +case 0xAF61: +case 0xAF62: +case 0xAF63: +case 0xAF64: +case 0xAF65: +case 0xAF66: +case 0xAF67: +case 0xAF68: +case 0xAF69: +case 0xAF6A: +case 0xAF6B: +case 0xAF6C: +case 0xAF6D: +case 0xAF6E: +case 0xAF6F: +case 0xAF70: +case 0xAF71: +case 0xAF72: +case 0xAF73: +case 0xAF74: +case 0xAF75: +case 0xAF76: +case 0xAF77: +case 0xAF78: +case 0xAF79: +case 0xAF7A: +case 0xAF7B: +case 0xAF7C: +case 0xAF7D: +case 0xAF7E: +case 0xAF7F: +case 0xAF80: +case 0xAF81: +case 0xAF82: +case 0xAF83: +case 0xAF84: +case 0xAF85: +case 0xAF86: +case 0xAF87: +case 0xAF88: +case 0xAF89: +case 0xAF8A: +case 0xAF8B: +case 0xAF8C: +case 0xAF8D: +case 0xAF8E: +case 0xAF8F: +case 0xAF90: +case 0xAF91: +case 0xAF92: +case 0xAF93: +case 0xAF94: +case 0xAF95: +case 0xAF96: +case 0xAF97: +case 0xAF98: +case 0xAF99: +case 0xAF9A: +case 0xAF9B: +case 0xAF9C: +case 0xAF9D: +case 0xAF9E: +case 0xAF9F: +case 0xAFA0: +case 0xAFA1: +case 0xAFA2: +case 0xAFA3: +case 0xAFA4: +case 0xAFA5: +case 0xAFA6: +case 0xAFA7: +case 0xAFA8: +case 0xAFA9: +case 0xAFAA: +case 0xAFAB: +case 0xAFAC: +case 0xAFAD: +case 0xAFAE: +case 0xAFAF: +case 0xAFB0: +case 0xAFB1: +case 0xAFB2: +case 0xAFB3: +case 0xAFB4: +case 0xAFB5: +case 0xAFB6: +case 0xAFB7: +case 0xAFB8: +case 0xAFB9: +case 0xAFBA: +case 0xAFBB: +case 0xAFBC: +case 0xAFBD: +case 0xAFBE: +case 0xAFBF: +case 0xAFC0: +case 0xAFC1: +case 0xAFC2: +case 0xAFC3: +case 0xAFC4: +case 0xAFC5: +case 0xAFC6: +case 0xAFC7: +case 0xAFC8: +case 0xAFC9: +case 0xAFCA: +case 0xAFCB: +case 0xAFCC: +case 0xAFCD: +case 0xAFCE: +case 0xAFCF: +case 0xAFD0: +case 0xAFD1: +case 0xAFD2: +case 0xAFD3: +case 0xAFD4: +case 0xAFD5: +case 0xAFD6: +case 0xAFD7: +case 0xAFD8: +case 0xAFD9: +case 0xAFDA: +case 0xAFDB: +case 0xAFDC: +case 0xAFDD: +case 0xAFDE: +case 0xAFDF: +case 0xAFE0: +case 0xAFE1: +case 0xAFE2: +case 0xAFE3: +case 0xAFE4: +case 0xAFE5: +case 0xAFE6: +case 0xAFE7: +case 0xAFE8: +case 0xAFE9: +case 0xAFEA: +case 0xAFEB: +case 0xAFEC: +case 0xAFED: +case 0xAFEE: +case 0xAFEF: +case 0xAFF0: +case 0xAFF1: +case 0xAFF2: +case 0xAFF3: +case 0xAFF4: +case 0xAFF5: +case 0xAFF6: +case 0xAFF7: +case 0xAFF8: +case 0xAFF9: +case 0xAFFA: +case 0xAFFB: +case 0xAFFC: +case 0xAFFD: +case 0xAFFE: +case 0xAFFF: + +// 1010 +case 0xA000: +{ + u32 res; + PC -= 2; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_1010_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) +} +RET(4) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_opB.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_opB.inc new file mode 100644 index 0000000000..67798227a4 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_opB.inc @@ -0,0 +1,5845 @@ +case 0xB200: +case 0xB400: +case 0xB600: +case 0xB800: +case 0xBA00: +case 0xBC00: +case 0xBE00: +case 0xB001: +case 0xB201: +case 0xB401: +case 0xB601: +case 0xB801: +case 0xBA01: +case 0xBC01: +case 0xBE01: +case 0xB002: +case 0xB202: +case 0xB402: +case 0xB602: +case 0xB802: +case 0xBA02: +case 0xBC02: +case 0xBE02: +case 0xB003: +case 0xB203: +case 0xB403: +case 0xB603: +case 0xB803: +case 0xBA03: +case 0xBC03: +case 0xBE03: +case 0xB004: +case 0xB204: +case 0xB404: +case 0xB604: +case 0xB804: +case 0xBA04: +case 0xBC04: +case 0xBE04: +case 0xB005: +case 0xB205: +case 0xB405: +case 0xB605: +case 0xB805: +case 0xBA05: +case 0xBC05: +case 0xBE05: +case 0xB006: +case 0xB206: +case 0xB406: +case 0xB606: +case 0xB806: +case 0xBA06: +case 0xBC06: +case 0xBE06: +case 0xB007: +case 0xB207: +case 0xB407: +case 0xB607: +case 0xB807: +case 0xBA07: +case 0xBC07: +case 0xBE07: + +// CMP +case 0xB000: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB208: +case 0xB408: +case 0xB608: +case 0xB808: +case 0xBA08: +case 0xBC08: +case 0xBE08: +case 0xB009: +case 0xB209: +case 0xB409: +case 0xB609: +case 0xB809: +case 0xBA09: +case 0xBC09: +case 0xBE09: +case 0xB00A: +case 0xB20A: +case 0xB40A: +case 0xB60A: +case 0xB80A: +case 0xBA0A: +case 0xBC0A: +case 0xBE0A: +case 0xB00B: +case 0xB20B: +case 0xB40B: +case 0xB60B: +case 0xB80B: +case 0xBA0B: +case 0xBC0B: +case 0xBE0B: +case 0xB00C: +case 0xB20C: +case 0xB40C: +case 0xB60C: +case 0xB80C: +case 0xBA0C: +case 0xBC0C: +case 0xBE0C: +case 0xB00D: +case 0xB20D: +case 0xB40D: +case 0xB60D: +case 0xB80D: +case 0xBA0D: +case 0xBC0D: +case 0xBE0D: +case 0xB00E: +case 0xB20E: +case 0xB40E: +case 0xB60E: +case 0xB80E: +case 0xBA0E: +case 0xBC0E: +case 0xBE0E: +case 0xB00F: +case 0xB20F: +case 0xB40F: +case 0xB60F: +case 0xB80F: +case 0xBA0F: +case 0xBC0F: +case 0xBE0F: + +// CMP +case 0xB008: +{ + u32 res; + u32 dst; + u32 src; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB210: +case 0xB410: +case 0xB610: +case 0xB810: +case 0xBA10: +case 0xBC10: +case 0xBE10: +case 0xB011: +case 0xB211: +case 0xB411: +case 0xB611: +case 0xB811: +case 0xBA11: +case 0xBC11: +case 0xBE11: +case 0xB012: +case 0xB212: +case 0xB412: +case 0xB612: +case 0xB812: +case 0xBA12: +case 0xBC12: +case 0xBE12: +case 0xB013: +case 0xB213: +case 0xB413: +case 0xB613: +case 0xB813: +case 0xBA13: +case 0xBC13: +case 0xBE13: +case 0xB014: +case 0xB214: +case 0xB414: +case 0xB614: +case 0xB814: +case 0xBA14: +case 0xBC14: +case 0xBE14: +case 0xB015: +case 0xB215: +case 0xB415: +case 0xB615: +case 0xB815: +case 0xBA15: +case 0xBC15: +case 0xBE15: +case 0xB016: +case 0xB216: +case 0xB416: +case 0xB616: +case 0xB816: +case 0xBA16: +case 0xBC16: +case 0xBE16: +case 0xB017: +case 0xB217: +case 0xB417: +case 0xB617: +case 0xB817: +case 0xBA17: +case 0xBC17: +case 0xBE17: + +// CMP +case 0xB010: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB218: +case 0xB418: +case 0xB618: +case 0xB818: +case 0xBA18: +case 0xBC18: +case 0xBE18: +case 0xB019: +case 0xB219: +case 0xB419: +case 0xB619: +case 0xB819: +case 0xBA19: +case 0xBC19: +case 0xBE19: +case 0xB01A: +case 0xB21A: +case 0xB41A: +case 0xB61A: +case 0xB81A: +case 0xBA1A: +case 0xBC1A: +case 0xBE1A: +case 0xB01B: +case 0xB21B: +case 0xB41B: +case 0xB61B: +case 0xB81B: +case 0xBA1B: +case 0xBC1B: +case 0xBE1B: +case 0xB01C: +case 0xB21C: +case 0xB41C: +case 0xB61C: +case 0xB81C: +case 0xBA1C: +case 0xBC1C: +case 0xBE1C: +case 0xB01D: +case 0xB21D: +case 0xB41D: +case 0xB61D: +case 0xB81D: +case 0xBA1D: +case 0xBC1D: +case 0xBE1D: +case 0xB01E: +case 0xB21E: +case 0xB41E: +case 0xB61E: +case 0xB81E: +case 0xBA1E: +case 0xBC1E: +case 0xBE1E: + +// CMP +case 0xB018: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB220: +case 0xB420: +case 0xB620: +case 0xB820: +case 0xBA20: +case 0xBC20: +case 0xBE20: +case 0xB021: +case 0xB221: +case 0xB421: +case 0xB621: +case 0xB821: +case 0xBA21: +case 0xBC21: +case 0xBE21: +case 0xB022: +case 0xB222: +case 0xB422: +case 0xB622: +case 0xB822: +case 0xBA22: +case 0xBC22: +case 0xBE22: +case 0xB023: +case 0xB223: +case 0xB423: +case 0xB623: +case 0xB823: +case 0xBA23: +case 0xBC23: +case 0xBE23: +case 0xB024: +case 0xB224: +case 0xB424: +case 0xB624: +case 0xB824: +case 0xBA24: +case 0xBC24: +case 0xBE24: +case 0xB025: +case 0xB225: +case 0xB425: +case 0xB625: +case 0xB825: +case 0xBA25: +case 0xBC25: +case 0xBE25: +case 0xB026: +case 0xB226: +case 0xB426: +case 0xB626: +case 0xB826: +case 0xBA26: +case 0xBC26: +case 0xBE26: + +// CMP +case 0xB020: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB228: +case 0xB428: +case 0xB628: +case 0xB828: +case 0xBA28: +case 0xBC28: +case 0xBE28: +case 0xB029: +case 0xB229: +case 0xB429: +case 0xB629: +case 0xB829: +case 0xBA29: +case 0xBC29: +case 0xBE29: +case 0xB02A: +case 0xB22A: +case 0xB42A: +case 0xB62A: +case 0xB82A: +case 0xBA2A: +case 0xBC2A: +case 0xBE2A: +case 0xB02B: +case 0xB22B: +case 0xB42B: +case 0xB62B: +case 0xB82B: +case 0xBA2B: +case 0xBC2B: +case 0xBE2B: +case 0xB02C: +case 0xB22C: +case 0xB42C: +case 0xB62C: +case 0xB82C: +case 0xBA2C: +case 0xBC2C: +case 0xBE2C: +case 0xB02D: +case 0xB22D: +case 0xB42D: +case 0xB62D: +case 0xB82D: +case 0xBA2D: +case 0xBC2D: +case 0xBE2D: +case 0xB02E: +case 0xB22E: +case 0xB42E: +case 0xB62E: +case 0xB82E: +case 0xBA2E: +case 0xBC2E: +case 0xBE2E: +case 0xB02F: +case 0xB22F: +case 0xB42F: +case 0xB62F: +case 0xB82F: +case 0xBA2F: +case 0xBC2F: +case 0xBE2F: + +// CMP +case 0xB028: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB230: +case 0xB430: +case 0xB630: +case 0xB830: +case 0xBA30: +case 0xBC30: +case 0xBE30: +case 0xB031: +case 0xB231: +case 0xB431: +case 0xB631: +case 0xB831: +case 0xBA31: +case 0xBC31: +case 0xBE31: +case 0xB032: +case 0xB232: +case 0xB432: +case 0xB632: +case 0xB832: +case 0xBA32: +case 0xBC32: +case 0xBE32: +case 0xB033: +case 0xB233: +case 0xB433: +case 0xB633: +case 0xB833: +case 0xBA33: +case 0xBC33: +case 0xBE33: +case 0xB034: +case 0xB234: +case 0xB434: +case 0xB634: +case 0xB834: +case 0xBA34: +case 0xBC34: +case 0xBE34: +case 0xB035: +case 0xB235: +case 0xB435: +case 0xB635: +case 0xB835: +case 0xBA35: +case 0xBC35: +case 0xBE35: +case 0xB036: +case 0xB236: +case 0xB436: +case 0xB636: +case 0xB836: +case 0xBA36: +case 0xBC36: +case 0xBE36: +case 0xB037: +case 0xB237: +case 0xB437: +case 0xB637: +case 0xB837: +case 0xBA37: +case 0xBC37: +case 0xBE37: + +// CMP +case 0xB030: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB238: +case 0xB438: +case 0xB638: +case 0xB838: +case 0xBA38: +case 0xBC38: +case 0xBE38: + +// CMP +case 0xB038: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB239: +case 0xB439: +case 0xB639: +case 0xB839: +case 0xBA39: +case 0xBC39: +case 0xBE39: + +// CMP +case 0xB039: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB23A: +case 0xB43A: +case 0xB63A: +case 0xB83A: +case 0xBA3A: +case 0xBC3A: +case 0xBE3A: + +// CMP +case 0xB03A: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB23B: +case 0xB43B: +case 0xB63B: +case 0xB83B: +case 0xBA3B: +case 0xBC3B: +case 0xBE3B: + +// CMP +case 0xB03B: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB23C: +case 0xB43C: +case 0xB63C: +case 0xB83C: +case 0xBA3C: +case 0xBC3C: +case 0xBE3C: + +// CMP +case 0xB03C: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_BYTE; + PC += 2; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(8) +case 0xB21F: +case 0xB41F: +case 0xB61F: +case 0xB81F: +case 0xBA1F: +case 0xBC1F: +case 0xBE1F: + +// CMP +case 0xB01F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB227: +case 0xB427: +case 0xB627: +case 0xB827: +case 0xBA27: +case 0xBC27: +case 0xBE27: + +// CMP +case 0xB027: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB240: +case 0xB440: +case 0xB640: +case 0xB840: +case 0xBA40: +case 0xBC40: +case 0xBE40: +case 0xB041: +case 0xB241: +case 0xB441: +case 0xB641: +case 0xB841: +case 0xBA41: +case 0xBC41: +case 0xBE41: +case 0xB042: +case 0xB242: +case 0xB442: +case 0xB642: +case 0xB842: +case 0xBA42: +case 0xBC42: +case 0xBE42: +case 0xB043: +case 0xB243: +case 0xB443: +case 0xB643: +case 0xB843: +case 0xBA43: +case 0xBC43: +case 0xBE43: +case 0xB044: +case 0xB244: +case 0xB444: +case 0xB644: +case 0xB844: +case 0xBA44: +case 0xBC44: +case 0xBE44: +case 0xB045: +case 0xB245: +case 0xB445: +case 0xB645: +case 0xB845: +case 0xBA45: +case 0xBC45: +case 0xBE45: +case 0xB046: +case 0xB246: +case 0xB446: +case 0xB646: +case 0xB846: +case 0xBA46: +case 0xBC46: +case 0xBE46: +case 0xB047: +case 0xB247: +case 0xB447: +case 0xB647: +case 0xB847: +case 0xBA47: +case 0xBC47: +case 0xBE47: + +// CMP +case 0xB040: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB248: +case 0xB448: +case 0xB648: +case 0xB848: +case 0xBA48: +case 0xBC48: +case 0xBE48: +case 0xB049: +case 0xB249: +case 0xB449: +case 0xB649: +case 0xB849: +case 0xBA49: +case 0xBC49: +case 0xBE49: +case 0xB04A: +case 0xB24A: +case 0xB44A: +case 0xB64A: +case 0xB84A: +case 0xBA4A: +case 0xBC4A: +case 0xBE4A: +case 0xB04B: +case 0xB24B: +case 0xB44B: +case 0xB64B: +case 0xB84B: +case 0xBA4B: +case 0xBC4B: +case 0xBE4B: +case 0xB04C: +case 0xB24C: +case 0xB44C: +case 0xB64C: +case 0xB84C: +case 0xBA4C: +case 0xBC4C: +case 0xBE4C: +case 0xB04D: +case 0xB24D: +case 0xB44D: +case 0xB64D: +case 0xB84D: +case 0xBA4D: +case 0xBC4D: +case 0xBE4D: +case 0xB04E: +case 0xB24E: +case 0xB44E: +case 0xB64E: +case 0xB84E: +case 0xBA4E: +case 0xBC4E: +case 0xBE4E: +case 0xB04F: +case 0xB24F: +case 0xB44F: +case 0xB64F: +case 0xB84F: +case 0xBA4F: +case 0xBC4F: +case 0xBE4F: + +// CMP +case 0xB048: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->A[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB250: +case 0xB450: +case 0xB650: +case 0xB850: +case 0xBA50: +case 0xBC50: +case 0xBE50: +case 0xB051: +case 0xB251: +case 0xB451: +case 0xB651: +case 0xB851: +case 0xBA51: +case 0xBC51: +case 0xBE51: +case 0xB052: +case 0xB252: +case 0xB452: +case 0xB652: +case 0xB852: +case 0xBA52: +case 0xBC52: +case 0xBE52: +case 0xB053: +case 0xB253: +case 0xB453: +case 0xB653: +case 0xB853: +case 0xBA53: +case 0xBC53: +case 0xBE53: +case 0xB054: +case 0xB254: +case 0xB454: +case 0xB654: +case 0xB854: +case 0xBA54: +case 0xBC54: +case 0xBE54: +case 0xB055: +case 0xB255: +case 0xB455: +case 0xB655: +case 0xB855: +case 0xBA55: +case 0xBC55: +case 0xBE55: +case 0xB056: +case 0xB256: +case 0xB456: +case 0xB656: +case 0xB856: +case 0xBA56: +case 0xBC56: +case 0xBE56: +case 0xB057: +case 0xB257: +case 0xB457: +case 0xB657: +case 0xB857: +case 0xBA57: +case 0xBC57: +case 0xBE57: + +// CMP +case 0xB050: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB258: +case 0xB458: +case 0xB658: +case 0xB858: +case 0xBA58: +case 0xBC58: +case 0xBE58: +case 0xB059: +case 0xB259: +case 0xB459: +case 0xB659: +case 0xB859: +case 0xBA59: +case 0xBC59: +case 0xBE59: +case 0xB05A: +case 0xB25A: +case 0xB45A: +case 0xB65A: +case 0xB85A: +case 0xBA5A: +case 0xBC5A: +case 0xBE5A: +case 0xB05B: +case 0xB25B: +case 0xB45B: +case 0xB65B: +case 0xB85B: +case 0xBA5B: +case 0xBC5B: +case 0xBE5B: +case 0xB05C: +case 0xB25C: +case 0xB45C: +case 0xB65C: +case 0xB85C: +case 0xBA5C: +case 0xBC5C: +case 0xBE5C: +case 0xB05D: +case 0xB25D: +case 0xB45D: +case 0xB65D: +case 0xB85D: +case 0xBA5D: +case 0xBC5D: +case 0xBE5D: +case 0xB05E: +case 0xB25E: +case 0xB45E: +case 0xB65E: +case 0xB85E: +case 0xBA5E: +case 0xBC5E: +case 0xBE5E: + +// CMP +case 0xB058: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB260: +case 0xB460: +case 0xB660: +case 0xB860: +case 0xBA60: +case 0xBC60: +case 0xBE60: +case 0xB061: +case 0xB261: +case 0xB461: +case 0xB661: +case 0xB861: +case 0xBA61: +case 0xBC61: +case 0xBE61: +case 0xB062: +case 0xB262: +case 0xB462: +case 0xB662: +case 0xB862: +case 0xBA62: +case 0xBC62: +case 0xBE62: +case 0xB063: +case 0xB263: +case 0xB463: +case 0xB663: +case 0xB863: +case 0xBA63: +case 0xBC63: +case 0xBE63: +case 0xB064: +case 0xB264: +case 0xB464: +case 0xB664: +case 0xB864: +case 0xBA64: +case 0xBC64: +case 0xBE64: +case 0xB065: +case 0xB265: +case 0xB465: +case 0xB665: +case 0xB865: +case 0xBA65: +case 0xBC65: +case 0xBE65: +case 0xB066: +case 0xB266: +case 0xB466: +case 0xB666: +case 0xB866: +case 0xBA66: +case 0xBC66: +case 0xBE66: + +// CMP +case 0xB060: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB268: +case 0xB468: +case 0xB668: +case 0xB868: +case 0xBA68: +case 0xBC68: +case 0xBE68: +case 0xB069: +case 0xB269: +case 0xB469: +case 0xB669: +case 0xB869: +case 0xBA69: +case 0xBC69: +case 0xBE69: +case 0xB06A: +case 0xB26A: +case 0xB46A: +case 0xB66A: +case 0xB86A: +case 0xBA6A: +case 0xBC6A: +case 0xBE6A: +case 0xB06B: +case 0xB26B: +case 0xB46B: +case 0xB66B: +case 0xB86B: +case 0xBA6B: +case 0xBC6B: +case 0xBE6B: +case 0xB06C: +case 0xB26C: +case 0xB46C: +case 0xB66C: +case 0xB86C: +case 0xBA6C: +case 0xBC6C: +case 0xBE6C: +case 0xB06D: +case 0xB26D: +case 0xB46D: +case 0xB66D: +case 0xB86D: +case 0xBA6D: +case 0xBC6D: +case 0xBE6D: +case 0xB06E: +case 0xB26E: +case 0xB46E: +case 0xB66E: +case 0xB86E: +case 0xBA6E: +case 0xBC6E: +case 0xBE6E: +case 0xB06F: +case 0xB26F: +case 0xB46F: +case 0xB66F: +case 0xB86F: +case 0xBA6F: +case 0xBC6F: +case 0xBE6F: + +// CMP +case 0xB068: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB270: +case 0xB470: +case 0xB670: +case 0xB870: +case 0xBA70: +case 0xBC70: +case 0xBE70: +case 0xB071: +case 0xB271: +case 0xB471: +case 0xB671: +case 0xB871: +case 0xBA71: +case 0xBC71: +case 0xBE71: +case 0xB072: +case 0xB272: +case 0xB472: +case 0xB672: +case 0xB872: +case 0xBA72: +case 0xBC72: +case 0xBE72: +case 0xB073: +case 0xB273: +case 0xB473: +case 0xB673: +case 0xB873: +case 0xBA73: +case 0xBC73: +case 0xBE73: +case 0xB074: +case 0xB274: +case 0xB474: +case 0xB674: +case 0xB874: +case 0xBA74: +case 0xBC74: +case 0xBE74: +case 0xB075: +case 0xB275: +case 0xB475: +case 0xB675: +case 0xB875: +case 0xBA75: +case 0xBC75: +case 0xBE75: +case 0xB076: +case 0xB276: +case 0xB476: +case 0xB676: +case 0xB876: +case 0xBA76: +case 0xBC76: +case 0xBE76: +case 0xB077: +case 0xB277: +case 0xB477: +case 0xB677: +case 0xB877: +case 0xBA77: +case 0xBC77: +case 0xBE77: + +// CMP +case 0xB070: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB278: +case 0xB478: +case 0xB678: +case 0xB878: +case 0xBA78: +case 0xBC78: +case 0xBE78: + +// CMP +case 0xB078: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB279: +case 0xB479: +case 0xB679: +case 0xB879: +case 0xBA79: +case 0xBC79: +case 0xBE79: + +// CMP +case 0xB079: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB27A: +case 0xB47A: +case 0xB67A: +case 0xB87A: +case 0xBA7A: +case 0xBC7A: +case 0xBE7A: + +// CMP +case 0xB07A: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB27B: +case 0xB47B: +case 0xB67B: +case 0xB87B: +case 0xBA7B: +case 0xBC7B: +case 0xBE7B: + +// CMP +case 0xB07B: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB27C: +case 0xB47C: +case 0xB67C: +case 0xB87C: +case 0xBA7C: +case 0xBC7C: +case 0xBE7C: + +// CMP +case 0xB07C: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_WORD; + PC += 2; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(8) +case 0xB25F: +case 0xB45F: +case 0xB65F: +case 0xB85F: +case 0xBA5F: +case 0xBC5F: +case 0xBE5F: + +// CMP +case 0xB05F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB267: +case 0xB467: +case 0xB667: +case 0xB867: +case 0xBA67: +case 0xBC67: +case 0xBE67: + +// CMP +case 0xB067: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB280: +case 0xB480: +case 0xB680: +case 0xB880: +case 0xBA80: +case 0xBC80: +case 0xBE80: +case 0xB081: +case 0xB281: +case 0xB481: +case 0xB681: +case 0xB881: +case 0xBA81: +case 0xBC81: +case 0xBE81: +case 0xB082: +case 0xB282: +case 0xB482: +case 0xB682: +case 0xB882: +case 0xBA82: +case 0xBC82: +case 0xBE82: +case 0xB083: +case 0xB283: +case 0xB483: +case 0xB683: +case 0xB883: +case 0xBA83: +case 0xBC83: +case 0xBE83: +case 0xB084: +case 0xB284: +case 0xB484: +case 0xB684: +case 0xB884: +case 0xBA84: +case 0xBC84: +case 0xBE84: +case 0xB085: +case 0xB285: +case 0xB485: +case 0xB685: +case 0xB885: +case 0xBA85: +case 0xBC85: +case 0xBE85: +case 0xB086: +case 0xB286: +case 0xB486: +case 0xB686: +case 0xB886: +case 0xBA86: +case 0xBC86: +case 0xBE86: +case 0xB087: +case 0xB287: +case 0xB487: +case 0xB687: +case 0xB887: +case 0xBA87: +case 0xBC87: +case 0xBE87: + +// CMP +case 0xB080: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB288: +case 0xB488: +case 0xB688: +case 0xB888: +case 0xBA88: +case 0xBC88: +case 0xBE88: +case 0xB089: +case 0xB289: +case 0xB489: +case 0xB689: +case 0xB889: +case 0xBA89: +case 0xBC89: +case 0xBE89: +case 0xB08A: +case 0xB28A: +case 0xB48A: +case 0xB68A: +case 0xB88A: +case 0xBA8A: +case 0xBC8A: +case 0xBE8A: +case 0xB08B: +case 0xB28B: +case 0xB48B: +case 0xB68B: +case 0xB88B: +case 0xBA8B: +case 0xBC8B: +case 0xBE8B: +case 0xB08C: +case 0xB28C: +case 0xB48C: +case 0xB68C: +case 0xB88C: +case 0xBA8C: +case 0xBC8C: +case 0xBE8C: +case 0xB08D: +case 0xB28D: +case 0xB48D: +case 0xB68D: +case 0xB88D: +case 0xBA8D: +case 0xBC8D: +case 0xBE8D: +case 0xB08E: +case 0xB28E: +case 0xB48E: +case 0xB68E: +case 0xB88E: +case 0xBA8E: +case 0xBC8E: +case 0xBE8E: +case 0xB08F: +case 0xB28F: +case 0xB48F: +case 0xB68F: +case 0xB88F: +case 0xBA8F: +case 0xBC8F: +case 0xBE8F: + +// CMP +case 0xB088: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB290: +case 0xB490: +case 0xB690: +case 0xB890: +case 0xBA90: +case 0xBC90: +case 0xBE90: +case 0xB091: +case 0xB291: +case 0xB491: +case 0xB691: +case 0xB891: +case 0xBA91: +case 0xBC91: +case 0xBE91: +case 0xB092: +case 0xB292: +case 0xB492: +case 0xB692: +case 0xB892: +case 0xBA92: +case 0xBC92: +case 0xBE92: +case 0xB093: +case 0xB293: +case 0xB493: +case 0xB693: +case 0xB893: +case 0xBA93: +case 0xBC93: +case 0xBE93: +case 0xB094: +case 0xB294: +case 0xB494: +case 0xB694: +case 0xB894: +case 0xBA94: +case 0xBC94: +case 0xBE94: +case 0xB095: +case 0xB295: +case 0xB495: +case 0xB695: +case 0xB895: +case 0xBA95: +case 0xBC95: +case 0xBE95: +case 0xB096: +case 0xB296: +case 0xB496: +case 0xB696: +case 0xB896: +case 0xBA96: +case 0xBC96: +case 0xBE96: +case 0xB097: +case 0xB297: +case 0xB497: +case 0xB697: +case 0xB897: +case 0xBA97: +case 0xBC97: +case 0xBE97: + +// CMP +case 0xB090: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB298: +case 0xB498: +case 0xB698: +case 0xB898: +case 0xBA98: +case 0xBC98: +case 0xBE98: +case 0xB099: +case 0xB299: +case 0xB499: +case 0xB699: +case 0xB899: +case 0xBA99: +case 0xBC99: +case 0xBE99: +case 0xB09A: +case 0xB29A: +case 0xB49A: +case 0xB69A: +case 0xB89A: +case 0xBA9A: +case 0xBC9A: +case 0xBE9A: +case 0xB09B: +case 0xB29B: +case 0xB49B: +case 0xB69B: +case 0xB89B: +case 0xBA9B: +case 0xBC9B: +case 0xBE9B: +case 0xB09C: +case 0xB29C: +case 0xB49C: +case 0xB69C: +case 0xB89C: +case 0xBA9C: +case 0xBC9C: +case 0xBE9C: +case 0xB09D: +case 0xB29D: +case 0xB49D: +case 0xB69D: +case 0xB89D: +case 0xBA9D: +case 0xBC9D: +case 0xBE9D: +case 0xB09E: +case 0xB29E: +case 0xB49E: +case 0xB69E: +case 0xB89E: +case 0xBA9E: +case 0xBC9E: +case 0xBE9E: + +// CMP +case 0xB098: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2A0: +case 0xB4A0: +case 0xB6A0: +case 0xB8A0: +case 0xBAA0: +case 0xBCA0: +case 0xBEA0: +case 0xB0A1: +case 0xB2A1: +case 0xB4A1: +case 0xB6A1: +case 0xB8A1: +case 0xBAA1: +case 0xBCA1: +case 0xBEA1: +case 0xB0A2: +case 0xB2A2: +case 0xB4A2: +case 0xB6A2: +case 0xB8A2: +case 0xBAA2: +case 0xBCA2: +case 0xBEA2: +case 0xB0A3: +case 0xB2A3: +case 0xB4A3: +case 0xB6A3: +case 0xB8A3: +case 0xBAA3: +case 0xBCA3: +case 0xBEA3: +case 0xB0A4: +case 0xB2A4: +case 0xB4A4: +case 0xB6A4: +case 0xB8A4: +case 0xBAA4: +case 0xBCA4: +case 0xBEA4: +case 0xB0A5: +case 0xB2A5: +case 0xB4A5: +case 0xB6A5: +case 0xB8A5: +case 0xBAA5: +case 0xBCA5: +case 0xBEA5: +case 0xB0A6: +case 0xB2A6: +case 0xB4A6: +case 0xB6A6: +case 0xB8A6: +case 0xBAA6: +case 0xBCA6: +case 0xBEA6: + +// CMP +case 0xB0A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2A8: +case 0xB4A8: +case 0xB6A8: +case 0xB8A8: +case 0xBAA8: +case 0xBCA8: +case 0xBEA8: +case 0xB0A9: +case 0xB2A9: +case 0xB4A9: +case 0xB6A9: +case 0xB8A9: +case 0xBAA9: +case 0xBCA9: +case 0xBEA9: +case 0xB0AA: +case 0xB2AA: +case 0xB4AA: +case 0xB6AA: +case 0xB8AA: +case 0xBAAA: +case 0xBCAA: +case 0xBEAA: +case 0xB0AB: +case 0xB2AB: +case 0xB4AB: +case 0xB6AB: +case 0xB8AB: +case 0xBAAB: +case 0xBCAB: +case 0xBEAB: +case 0xB0AC: +case 0xB2AC: +case 0xB4AC: +case 0xB6AC: +case 0xB8AC: +case 0xBAAC: +case 0xBCAC: +case 0xBEAC: +case 0xB0AD: +case 0xB2AD: +case 0xB4AD: +case 0xB6AD: +case 0xB8AD: +case 0xBAAD: +case 0xBCAD: +case 0xBEAD: +case 0xB0AE: +case 0xB2AE: +case 0xB4AE: +case 0xB6AE: +case 0xB8AE: +case 0xBAAE: +case 0xBCAE: +case 0xBEAE: +case 0xB0AF: +case 0xB2AF: +case 0xB4AF: +case 0xB6AF: +case 0xB8AF: +case 0xBAAF: +case 0xBCAF: +case 0xBEAF: + +// CMP +case 0xB0A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2B0: +case 0xB4B0: +case 0xB6B0: +case 0xB8B0: +case 0xBAB0: +case 0xBCB0: +case 0xBEB0: +case 0xB0B1: +case 0xB2B1: +case 0xB4B1: +case 0xB6B1: +case 0xB8B1: +case 0xBAB1: +case 0xBCB1: +case 0xBEB1: +case 0xB0B2: +case 0xB2B2: +case 0xB4B2: +case 0xB6B2: +case 0xB8B2: +case 0xBAB2: +case 0xBCB2: +case 0xBEB2: +case 0xB0B3: +case 0xB2B3: +case 0xB4B3: +case 0xB6B3: +case 0xB8B3: +case 0xBAB3: +case 0xBCB3: +case 0xBEB3: +case 0xB0B4: +case 0xB2B4: +case 0xB4B4: +case 0xB6B4: +case 0xB8B4: +case 0xBAB4: +case 0xBCB4: +case 0xBEB4: +case 0xB0B5: +case 0xB2B5: +case 0xB4B5: +case 0xB6B5: +case 0xB8B5: +case 0xBAB5: +case 0xBCB5: +case 0xBEB5: +case 0xB0B6: +case 0xB2B6: +case 0xB4B6: +case 0xB6B6: +case 0xB8B6: +case 0xBAB6: +case 0xBCB6: +case 0xBEB6: +case 0xB0B7: +case 0xB2B7: +case 0xB4B7: +case 0xB6B7: +case 0xB8B7: +case 0xBAB7: +case 0xBCB7: +case 0xBEB7: + +// CMP +case 0xB0B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2B8: +case 0xB4B8: +case 0xB6B8: +case 0xB8B8: +case 0xBAB8: +case 0xBCB8: +case 0xBEB8: + +// CMP +case 0xB0B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2B9: +case 0xB4B9: +case 0xB6B9: +case 0xB8B9: +case 0xBAB9: +case 0xBCB9: +case 0xBEB9: + +// CMP +case 0xB0B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2BA: +case 0xB4BA: +case 0xB6BA: +case 0xB8BA: +case 0xBABA: +case 0xBCBA: +case 0xBEBA: + +// CMP +case 0xB0BA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2BB: +case 0xB4BB: +case 0xB6BB: +case 0xB8BB: +case 0xBABB: +case 0xBCBB: +case 0xBEBB: + +// CMP +case 0xB0BB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2BC: +case 0xB4BC: +case 0xB6BC: +case 0xB8BC: +case 0xBABC: +case 0xBCBC: +case 0xBEBC: + +// CMP +case 0xB0BC: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_LONG; + PC += 4; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(14) +case 0xB29F: +case 0xB49F: +case 0xB69F: +case 0xB89F: +case 0xBA9F: +case 0xBC9F: +case 0xBE9F: + +// CMP +case 0xB09F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB2A7: +case 0xB4A7: +case 0xB6A7: +case 0xB8A7: +case 0xBAA7: +case 0xBCA7: +case 0xBEA7: + +// CMP +case 0xB0A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB308: +case 0xB508: +case 0xB708: +case 0xB908: +case 0xBB08: +case 0xBD08: +case 0xB109: +case 0xB309: +case 0xB509: +case 0xB709: +case 0xB909: +case 0xBB09: +case 0xBD09: +case 0xB10A: +case 0xB30A: +case 0xB50A: +case 0xB70A: +case 0xB90A: +case 0xBB0A: +case 0xBD0A: +case 0xB10B: +case 0xB30B: +case 0xB50B: +case 0xB70B: +case 0xB90B: +case 0xBB0B: +case 0xBD0B: +case 0xB10C: +case 0xB30C: +case 0xB50C: +case 0xB70C: +case 0xB90C: +case 0xBB0C: +case 0xBD0C: +case 0xB10D: +case 0xB30D: +case 0xB50D: +case 0xB70D: +case 0xB90D: +case 0xBB0D: +case 0xBD0D: +case 0xB10E: +case 0xB30E: +case 0xB50E: +case 0xB70E: +case 0xB90E: +case 0xBB0E: +case 0xBD0E: + +// CMPM +case 0xB108: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB348: +case 0xB548: +case 0xB748: +case 0xB948: +case 0xBB48: +case 0xBD48: +case 0xB149: +case 0xB349: +case 0xB549: +case 0xB749: +case 0xB949: +case 0xBB49: +case 0xBD49: +case 0xB14A: +case 0xB34A: +case 0xB54A: +case 0xB74A: +case 0xB94A: +case 0xBB4A: +case 0xBD4A: +case 0xB14B: +case 0xB34B: +case 0xB54B: +case 0xB74B: +case 0xB94B: +case 0xBB4B: +case 0xBD4B: +case 0xB14C: +case 0xB34C: +case 0xB54C: +case 0xB74C: +case 0xB94C: +case 0xBB4C: +case 0xBD4C: +case 0xB14D: +case 0xB34D: +case 0xB54D: +case 0xB74D: +case 0xB94D: +case 0xBB4D: +case 0xBD4D: +case 0xB14E: +case 0xB34E: +case 0xB54E: +case 0xB74E: +case 0xB94E: +case 0xBB4E: +case 0xBD4E: + +// CMPM +case 0xB148: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB388: +case 0xB588: +case 0xB788: +case 0xB988: +case 0xBB88: +case 0xBD88: +case 0xB189: +case 0xB389: +case 0xB589: +case 0xB789: +case 0xB989: +case 0xBB89: +case 0xBD89: +case 0xB18A: +case 0xB38A: +case 0xB58A: +case 0xB78A: +case 0xB98A: +case 0xBB8A: +case 0xBD8A: +case 0xB18B: +case 0xB38B: +case 0xB58B: +case 0xB78B: +case 0xB98B: +case 0xBB8B: +case 0xBD8B: +case 0xB18C: +case 0xB38C: +case 0xB58C: +case 0xB78C: +case 0xB98C: +case 0xBB8C: +case 0xBD8C: +case 0xB18D: +case 0xB38D: +case 0xB58D: +case 0xB78D: +case 0xB98D: +case 0xBB8D: +case 0xBD8D: +case 0xB18E: +case 0xB38E: +case 0xB58E: +case 0xB78E: +case 0xB98E: +case 0xBB8E: +case 0xBD8E: + +// CMPM +case 0xB188: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB30F: +case 0xB50F: +case 0xB70F: +case 0xB90F: +case 0xBB0F: +case 0xBD0F: + +// CMP7M +case 0xB10F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 1; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xB34F: +case 0xB54F: +case 0xB74F: +case 0xB94F: +case 0xBB4F: +case 0xBD4F: + +// CMP7M +case 0xB14F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xB38F: +case 0xB58F: +case 0xB78F: +case 0xB98F: +case 0xBB8F: +case 0xBD8F: + +// CMP7M +case 0xB18F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xBF09: +case 0xBF0A: +case 0xBF0B: +case 0xBF0C: +case 0xBF0D: +case 0xBF0E: + +// CMPM7 +case 0xBF08: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) +case 0xBF49: +case 0xBF4A: +case 0xBF4B: +case 0xBF4C: +case 0xBF4D: +case 0xBF4E: + +// CMPM7 +case 0xBF48: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) +case 0xBF89: +case 0xBF8A: +case 0xBF8B: +case 0xBF8C: +case 0xBF8D: +case 0xBF8E: + +// CMPM7 +case 0xBF88: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READ_LOat_F(adr, src) + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) + +// CMP7M7 +case 0xBF0F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, dst) + res = dst - src; + CPU->flag_N = CPU->flag_C = res; + CPU->flag_V = (src ^ dst) & (res ^ dst); + CPU->flag_notZ = res & 0xFF; +} +RET(4) + +// CMP7M7 +case 0xBF4F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, dst) + res = dst - src; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8; + CPU->flag_N = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; +} +RET(4) + +// CMP7M7 +case 0xBF8F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, src) + adr = CPU->A[7]; + CPU->A[7] += 4; + READ_LOat_F(adr, dst) + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(4) +case 0xB300: +case 0xB500: +case 0xB700: +case 0xB900: +case 0xBB00: +case 0xBD00: +case 0xBF00: +case 0xB101: +case 0xB301: +case 0xB501: +case 0xB701: +case 0xB901: +case 0xBB01: +case 0xBD01: +case 0xBF01: +case 0xB102: +case 0xB302: +case 0xB502: +case 0xB702: +case 0xB902: +case 0xBB02: +case 0xBD02: +case 0xBF02: +case 0xB103: +case 0xB303: +case 0xB503: +case 0xB703: +case 0xB903: +case 0xBB03: +case 0xBD03: +case 0xBF03: +case 0xB104: +case 0xB304: +case 0xB504: +case 0xB704: +case 0xB904: +case 0xBB04: +case 0xBD04: +case 0xBF04: +case 0xB105: +case 0xB305: +case 0xB505: +case 0xB705: +case 0xB905: +case 0xBB05: +case 0xBD05: +case 0xBF05: +case 0xB106: +case 0xB306: +case 0xB506: +case 0xB706: +case 0xB906: +case 0xBB06: +case 0xBD06: +case 0xBF06: +case 0xB107: +case 0xB307: +case 0xB507: +case 0xB707: +case 0xB907: +case 0xBB07: +case 0xBD07: +case 0xBF07: + +// EORDa +case 0xB100: +{ + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + res = (u8)CPU->D[(Opcode >> 0) & 7]; + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0xB310: +case 0xB510: +case 0xB710: +case 0xB910: +case 0xBB10: +case 0xBD10: +case 0xBF10: +case 0xB111: +case 0xB311: +case 0xB511: +case 0xB711: +case 0xB911: +case 0xBB11: +case 0xBD11: +case 0xBF11: +case 0xB112: +case 0xB312: +case 0xB512: +case 0xB712: +case 0xB912: +case 0xBB12: +case 0xBD12: +case 0xBF12: +case 0xB113: +case 0xB313: +case 0xB513: +case 0xB713: +case 0xB913: +case 0xBB13: +case 0xBD13: +case 0xBF13: +case 0xB114: +case 0xB314: +case 0xB514: +case 0xB714: +case 0xB914: +case 0xBB14: +case 0xBD14: +case 0xBF14: +case 0xB115: +case 0xB315: +case 0xB515: +case 0xB715: +case 0xB915: +case 0xBB15: +case 0xBD15: +case 0xBF15: +case 0xB116: +case 0xB316: +case 0xB516: +case 0xB716: +case 0xB916: +case 0xBB16: +case 0xBD16: +case 0xBF16: +case 0xB117: +case 0xB317: +case 0xB517: +case 0xB717: +case 0xB917: +case 0xBB17: +case 0xBD17: +case 0xBF17: + +// EORDa +case 0xB110: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB318: +case 0xB518: +case 0xB718: +case 0xB918: +case 0xBB18: +case 0xBD18: +case 0xBF18: +case 0xB119: +case 0xB319: +case 0xB519: +case 0xB719: +case 0xB919: +case 0xBB19: +case 0xBD19: +case 0xBF19: +case 0xB11A: +case 0xB31A: +case 0xB51A: +case 0xB71A: +case 0xB91A: +case 0xBB1A: +case 0xBD1A: +case 0xBF1A: +case 0xB11B: +case 0xB31B: +case 0xB51B: +case 0xB71B: +case 0xB91B: +case 0xBB1B: +case 0xBD1B: +case 0xBF1B: +case 0xB11C: +case 0xB31C: +case 0xB51C: +case 0xB71C: +case 0xB91C: +case 0xBB1C: +case 0xBD1C: +case 0xBF1C: +case 0xB11D: +case 0xB31D: +case 0xB51D: +case 0xB71D: +case 0xB91D: +case 0xBB1D: +case 0xBD1D: +case 0xBF1D: +case 0xB11E: +case 0xB31E: +case 0xB51E: +case 0xB71E: +case 0xB91E: +case 0xBB1E: +case 0xBD1E: +case 0xBF1E: + +// EORDa +case 0xB118: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB320: +case 0xB520: +case 0xB720: +case 0xB920: +case 0xBB20: +case 0xBD20: +case 0xBF20: +case 0xB121: +case 0xB321: +case 0xB521: +case 0xB721: +case 0xB921: +case 0xBB21: +case 0xBD21: +case 0xBF21: +case 0xB122: +case 0xB322: +case 0xB522: +case 0xB722: +case 0xB922: +case 0xBB22: +case 0xBD22: +case 0xBF22: +case 0xB123: +case 0xB323: +case 0xB523: +case 0xB723: +case 0xB923: +case 0xBB23: +case 0xBD23: +case 0xBF23: +case 0xB124: +case 0xB324: +case 0xB524: +case 0xB724: +case 0xB924: +case 0xBB24: +case 0xBD24: +case 0xBF24: +case 0xB125: +case 0xB325: +case 0xB525: +case 0xB725: +case 0xB925: +case 0xBB25: +case 0xBD25: +case 0xBF25: +case 0xB126: +case 0xB326: +case 0xB526: +case 0xB726: +case 0xB926: +case 0xBB26: +case 0xBD26: +case 0xBF26: + +// EORDa +case 0xB120: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB328: +case 0xB528: +case 0xB728: +case 0xB928: +case 0xBB28: +case 0xBD28: +case 0xBF28: +case 0xB129: +case 0xB329: +case 0xB529: +case 0xB729: +case 0xB929: +case 0xBB29: +case 0xBD29: +case 0xBF29: +case 0xB12A: +case 0xB32A: +case 0xB52A: +case 0xB72A: +case 0xB92A: +case 0xBB2A: +case 0xBD2A: +case 0xBF2A: +case 0xB12B: +case 0xB32B: +case 0xB52B: +case 0xB72B: +case 0xB92B: +case 0xBB2B: +case 0xBD2B: +case 0xBF2B: +case 0xB12C: +case 0xB32C: +case 0xB52C: +case 0xB72C: +case 0xB92C: +case 0xBB2C: +case 0xBD2C: +case 0xBF2C: +case 0xB12D: +case 0xB32D: +case 0xB52D: +case 0xB72D: +case 0xB92D: +case 0xBB2D: +case 0xBD2D: +case 0xBF2D: +case 0xB12E: +case 0xB32E: +case 0xB52E: +case 0xB72E: +case 0xB92E: +case 0xBB2E: +case 0xBD2E: +case 0xBF2E: +case 0xB12F: +case 0xB32F: +case 0xB52F: +case 0xB72F: +case 0xB92F: +case 0xBB2F: +case 0xBD2F: +case 0xBF2F: + +// EORDa +case 0xB128: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB330: +case 0xB530: +case 0xB730: +case 0xB930: +case 0xBB30: +case 0xBD30: +case 0xBF30: +case 0xB131: +case 0xB331: +case 0xB531: +case 0xB731: +case 0xB931: +case 0xBB31: +case 0xBD31: +case 0xBF31: +case 0xB132: +case 0xB332: +case 0xB532: +case 0xB732: +case 0xB932: +case 0xBB32: +case 0xBD32: +case 0xBF32: +case 0xB133: +case 0xB333: +case 0xB533: +case 0xB733: +case 0xB933: +case 0xBB33: +case 0xBD33: +case 0xBF33: +case 0xB134: +case 0xB334: +case 0xB534: +case 0xB734: +case 0xB934: +case 0xBB34: +case 0xBD34: +case 0xBF34: +case 0xB135: +case 0xB335: +case 0xB535: +case 0xB735: +case 0xB935: +case 0xBB35: +case 0xBD35: +case 0xBF35: +case 0xB136: +case 0xB336: +case 0xB536: +case 0xB736: +case 0xB936: +case 0xBB36: +case 0xBD36: +case 0xBF36: +case 0xB137: +case 0xB337: +case 0xB537: +case 0xB737: +case 0xB937: +case 0xBB37: +case 0xBD37: +case 0xBF37: + +// EORDa +case 0xB130: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB338: +case 0xB538: +case 0xB738: +case 0xB938: +case 0xBB38: +case 0xBD38: +case 0xBF38: + +// EORDa +case 0xB138: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB339: +case 0xB539: +case 0xB739: +case 0xB939: +case 0xBB39: +case 0xBD39: +case 0xBF39: + +// EORDa +case 0xB139: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB31F: +case 0xB51F: +case 0xB71F: +case 0xB91F: +case 0xBB1F: +case 0xBD1F: +case 0xBF1F: + +// EORDa +case 0xB11F: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB327: +case 0xB527: +case 0xB727: +case 0xB927: +case 0xBB27: +case 0xBD27: +case 0xBF27: + +// EORDa +case 0xB127: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xB340: +case 0xB540: +case 0xB740: +case 0xB940: +case 0xBB40: +case 0xBD40: +case 0xBF40: +case 0xB141: +case 0xB341: +case 0xB541: +case 0xB741: +case 0xB941: +case 0xBB41: +case 0xBD41: +case 0xBF41: +case 0xB142: +case 0xB342: +case 0xB542: +case 0xB742: +case 0xB942: +case 0xBB42: +case 0xBD42: +case 0xBF42: +case 0xB143: +case 0xB343: +case 0xB543: +case 0xB743: +case 0xB943: +case 0xBB43: +case 0xBD43: +case 0xBF43: +case 0xB144: +case 0xB344: +case 0xB544: +case 0xB744: +case 0xB944: +case 0xBB44: +case 0xBD44: +case 0xBF44: +case 0xB145: +case 0xB345: +case 0xB545: +case 0xB745: +case 0xB945: +case 0xBB45: +case 0xBD45: +case 0xBF45: +case 0xB146: +case 0xB346: +case 0xB546: +case 0xB746: +case 0xB946: +case 0xBB46: +case 0xBD46: +case 0xBF46: +case 0xB147: +case 0xB347: +case 0xB547: +case 0xB747: +case 0xB947: +case 0xBB47: +case 0xBD47: +case 0xBF47: + +// EORDa +case 0xB140: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + res = (u16)CPU->D[(Opcode >> 0) & 7]; + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(4) +case 0xB350: +case 0xB550: +case 0xB750: +case 0xB950: +case 0xBB50: +case 0xBD50: +case 0xBF50: +case 0xB151: +case 0xB351: +case 0xB551: +case 0xB751: +case 0xB951: +case 0xBB51: +case 0xBD51: +case 0xBF51: +case 0xB152: +case 0xB352: +case 0xB552: +case 0xB752: +case 0xB952: +case 0xBB52: +case 0xBD52: +case 0xBF52: +case 0xB153: +case 0xB353: +case 0xB553: +case 0xB753: +case 0xB953: +case 0xBB53: +case 0xBD53: +case 0xBF53: +case 0xB154: +case 0xB354: +case 0xB554: +case 0xB754: +case 0xB954: +case 0xBB54: +case 0xBD54: +case 0xBF54: +case 0xB155: +case 0xB355: +case 0xB555: +case 0xB755: +case 0xB955: +case 0xBB55: +case 0xBD55: +case 0xBF55: +case 0xB156: +case 0xB356: +case 0xB556: +case 0xB756: +case 0xB956: +case 0xBB56: +case 0xBD56: +case 0xBF56: +case 0xB157: +case 0xB357: +case 0xB557: +case 0xB757: +case 0xB957: +case 0xBB57: +case 0xBD57: +case 0xBF57: + +// EORDa +case 0xB150: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB358: +case 0xB558: +case 0xB758: +case 0xB958: +case 0xBB58: +case 0xBD58: +case 0xBF58: +case 0xB159: +case 0xB359: +case 0xB559: +case 0xB759: +case 0xB959: +case 0xBB59: +case 0xBD59: +case 0xBF59: +case 0xB15A: +case 0xB35A: +case 0xB55A: +case 0xB75A: +case 0xB95A: +case 0xBB5A: +case 0xBD5A: +case 0xBF5A: +case 0xB15B: +case 0xB35B: +case 0xB55B: +case 0xB75B: +case 0xB95B: +case 0xBB5B: +case 0xBD5B: +case 0xBF5B: +case 0xB15C: +case 0xB35C: +case 0xB55C: +case 0xB75C: +case 0xB95C: +case 0xBB5C: +case 0xBD5C: +case 0xBF5C: +case 0xB15D: +case 0xB35D: +case 0xB55D: +case 0xB75D: +case 0xB95D: +case 0xBB5D: +case 0xBD5D: +case 0xBF5D: +case 0xB15E: +case 0xB35E: +case 0xB55E: +case 0xB75E: +case 0xB95E: +case 0xBB5E: +case 0xBD5E: +case 0xBF5E: + +// EORDa +case 0xB158: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB360: +case 0xB560: +case 0xB760: +case 0xB960: +case 0xBB60: +case 0xBD60: +case 0xBF60: +case 0xB161: +case 0xB361: +case 0xB561: +case 0xB761: +case 0xB961: +case 0xBB61: +case 0xBD61: +case 0xBF61: +case 0xB162: +case 0xB362: +case 0xB562: +case 0xB762: +case 0xB962: +case 0xBB62: +case 0xBD62: +case 0xBF62: +case 0xB163: +case 0xB363: +case 0xB563: +case 0xB763: +case 0xB963: +case 0xBB63: +case 0xBD63: +case 0xBF63: +case 0xB164: +case 0xB364: +case 0xB564: +case 0xB764: +case 0xB964: +case 0xBB64: +case 0xBD64: +case 0xBF64: +case 0xB165: +case 0xB365: +case 0xB565: +case 0xB765: +case 0xB965: +case 0xBB65: +case 0xBD65: +case 0xBF65: +case 0xB166: +case 0xB366: +case 0xB566: +case 0xB766: +case 0xB966: +case 0xBB66: +case 0xBD66: +case 0xBF66: + +// EORDa +case 0xB160: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB368: +case 0xB568: +case 0xB768: +case 0xB968: +case 0xBB68: +case 0xBD68: +case 0xBF68: +case 0xB169: +case 0xB369: +case 0xB569: +case 0xB769: +case 0xB969: +case 0xBB69: +case 0xBD69: +case 0xBF69: +case 0xB16A: +case 0xB36A: +case 0xB56A: +case 0xB76A: +case 0xB96A: +case 0xBB6A: +case 0xBD6A: +case 0xBF6A: +case 0xB16B: +case 0xB36B: +case 0xB56B: +case 0xB76B: +case 0xB96B: +case 0xBB6B: +case 0xBD6B: +case 0xBF6B: +case 0xB16C: +case 0xB36C: +case 0xB56C: +case 0xB76C: +case 0xB96C: +case 0xBB6C: +case 0xBD6C: +case 0xBF6C: +case 0xB16D: +case 0xB36D: +case 0xB56D: +case 0xB76D: +case 0xB96D: +case 0xBB6D: +case 0xBD6D: +case 0xBF6D: +case 0xB16E: +case 0xB36E: +case 0xB56E: +case 0xB76E: +case 0xB96E: +case 0xBB6E: +case 0xBD6E: +case 0xBF6E: +case 0xB16F: +case 0xB36F: +case 0xB56F: +case 0xB76F: +case 0xB96F: +case 0xBB6F: +case 0xBD6F: +case 0xBF6F: + +// EORDa +case 0xB168: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB370: +case 0xB570: +case 0xB770: +case 0xB970: +case 0xBB70: +case 0xBD70: +case 0xBF70: +case 0xB171: +case 0xB371: +case 0xB571: +case 0xB771: +case 0xB971: +case 0xBB71: +case 0xBD71: +case 0xBF71: +case 0xB172: +case 0xB372: +case 0xB572: +case 0xB772: +case 0xB972: +case 0xBB72: +case 0xBD72: +case 0xBF72: +case 0xB173: +case 0xB373: +case 0xB573: +case 0xB773: +case 0xB973: +case 0xBB73: +case 0xBD73: +case 0xBF73: +case 0xB174: +case 0xB374: +case 0xB574: +case 0xB774: +case 0xB974: +case 0xBB74: +case 0xBD74: +case 0xBF74: +case 0xB175: +case 0xB375: +case 0xB575: +case 0xB775: +case 0xB975: +case 0xBB75: +case 0xBD75: +case 0xBF75: +case 0xB176: +case 0xB376: +case 0xB576: +case 0xB776: +case 0xB976: +case 0xBB76: +case 0xBD76: +case 0xBF76: +case 0xB177: +case 0xB377: +case 0xB577: +case 0xB777: +case 0xB977: +case 0xBB77: +case 0xBD77: +case 0xBF77: + +// EORDa +case 0xB170: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB378: +case 0xB578: +case 0xB778: +case 0xB978: +case 0xBB78: +case 0xBD78: +case 0xBF78: + +// EORDa +case 0xB178: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB379: +case 0xB579: +case 0xB779: +case 0xB979: +case 0xBB79: +case 0xBD79: +case 0xBF79: + +// EORDa +case 0xB179: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB35F: +case 0xB55F: +case 0xB75F: +case 0xB95F: +case 0xBB5F: +case 0xBD5F: +case 0xBF5F: + +// EORDa +case 0xB15F: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB367: +case 0xB567: +case 0xB767: +case 0xB967: +case 0xBB67: +case 0xBD67: +case 0xBF67: + +// EORDa +case 0xB167: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xB380: +case 0xB580: +case 0xB780: +case 0xB980: +case 0xBB80: +case 0xBD80: +case 0xBF80: +case 0xB181: +case 0xB381: +case 0xB581: +case 0xB781: +case 0xB981: +case 0xBB81: +case 0xBD81: +case 0xBF81: +case 0xB182: +case 0xB382: +case 0xB582: +case 0xB782: +case 0xB982: +case 0xBB82: +case 0xBD82: +case 0xBF82: +case 0xB183: +case 0xB383: +case 0xB583: +case 0xB783: +case 0xB983: +case 0xBB83: +case 0xBD83: +case 0xBF83: +case 0xB184: +case 0xB384: +case 0xB584: +case 0xB784: +case 0xB984: +case 0xBB84: +case 0xBD84: +case 0xBF84: +case 0xB185: +case 0xB385: +case 0xB585: +case 0xB785: +case 0xB985: +case 0xBB85: +case 0xBD85: +case 0xBF85: +case 0xB186: +case 0xB386: +case 0xB586: +case 0xB786: +case 0xB986: +case 0xBB86: +case 0xBD86: +case 0xBF86: +case 0xB187: +case 0xB387: +case 0xB587: +case 0xB787: +case 0xB987: +case 0xBB87: +case 0xBD87: +case 0xBF87: + +// EORDa +case 0xB180: +{ + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xB390: +case 0xB590: +case 0xB790: +case 0xB990: +case 0xBB90: +case 0xBD90: +case 0xBF90: +case 0xB191: +case 0xB391: +case 0xB591: +case 0xB791: +case 0xB991: +case 0xBB91: +case 0xBD91: +case 0xBF91: +case 0xB192: +case 0xB392: +case 0xB592: +case 0xB792: +case 0xB992: +case 0xBB92: +case 0xBD92: +case 0xBF92: +case 0xB193: +case 0xB393: +case 0xB593: +case 0xB793: +case 0xB993: +case 0xBB93: +case 0xBD93: +case 0xBF93: +case 0xB194: +case 0xB394: +case 0xB594: +case 0xB794: +case 0xB994: +case 0xBB94: +case 0xBD94: +case 0xBF94: +case 0xB195: +case 0xB395: +case 0xB595: +case 0xB795: +case 0xB995: +case 0xBB95: +case 0xBD95: +case 0xBF95: +case 0xB196: +case 0xB396: +case 0xB596: +case 0xB796: +case 0xB996: +case 0xBB96: +case 0xBD96: +case 0xBF96: +case 0xB197: +case 0xB397: +case 0xB597: +case 0xB797: +case 0xB997: +case 0xBB97: +case 0xBD97: +case 0xBF97: + +// EORDa +case 0xB190: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB398: +case 0xB598: +case 0xB798: +case 0xB998: +case 0xBB98: +case 0xBD98: +case 0xBF98: +case 0xB199: +case 0xB399: +case 0xB599: +case 0xB799: +case 0xB999: +case 0xBB99: +case 0xBD99: +case 0xBF99: +case 0xB19A: +case 0xB39A: +case 0xB59A: +case 0xB79A: +case 0xB99A: +case 0xBB9A: +case 0xBD9A: +case 0xBF9A: +case 0xB19B: +case 0xB39B: +case 0xB59B: +case 0xB79B: +case 0xB99B: +case 0xBB9B: +case 0xBD9B: +case 0xBF9B: +case 0xB19C: +case 0xB39C: +case 0xB59C: +case 0xB79C: +case 0xB99C: +case 0xBB9C: +case 0xBD9C: +case 0xBF9C: +case 0xB19D: +case 0xB39D: +case 0xB59D: +case 0xB79D: +case 0xB99D: +case 0xBB9D: +case 0xBD9D: +case 0xBF9D: +case 0xB19E: +case 0xB39E: +case 0xB59E: +case 0xB79E: +case 0xB99E: +case 0xBB9E: +case 0xBD9E: +case 0xBF9E: + +// EORDa +case 0xB198: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB3A0: +case 0xB5A0: +case 0xB7A0: +case 0xB9A0: +case 0xBBA0: +case 0xBDA0: +case 0xBFA0: +case 0xB1A1: +case 0xB3A1: +case 0xB5A1: +case 0xB7A1: +case 0xB9A1: +case 0xBBA1: +case 0xBDA1: +case 0xBFA1: +case 0xB1A2: +case 0xB3A2: +case 0xB5A2: +case 0xB7A2: +case 0xB9A2: +case 0xBBA2: +case 0xBDA2: +case 0xBFA2: +case 0xB1A3: +case 0xB3A3: +case 0xB5A3: +case 0xB7A3: +case 0xB9A3: +case 0xBBA3: +case 0xBDA3: +case 0xBFA3: +case 0xB1A4: +case 0xB3A4: +case 0xB5A4: +case 0xB7A4: +case 0xB9A4: +case 0xBBA4: +case 0xBDA4: +case 0xBFA4: +case 0xB1A5: +case 0xB3A5: +case 0xB5A5: +case 0xB7A5: +case 0xB9A5: +case 0xBBA5: +case 0xBDA5: +case 0xBFA5: +case 0xB1A6: +case 0xB3A6: +case 0xB5A6: +case 0xB7A6: +case 0xB9A6: +case 0xBBA6: +case 0xBDA6: +case 0xBFA6: + +// EORDa +case 0xB1A0: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB3A8: +case 0xB5A8: +case 0xB7A8: +case 0xB9A8: +case 0xBBA8: +case 0xBDA8: +case 0xBFA8: +case 0xB1A9: +case 0xB3A9: +case 0xB5A9: +case 0xB7A9: +case 0xB9A9: +case 0xBBA9: +case 0xBDA9: +case 0xBFA9: +case 0xB1AA: +case 0xB3AA: +case 0xB5AA: +case 0xB7AA: +case 0xB9AA: +case 0xBBAA: +case 0xBDAA: +case 0xBFAA: +case 0xB1AB: +case 0xB3AB: +case 0xB5AB: +case 0xB7AB: +case 0xB9AB: +case 0xBBAB: +case 0xBDAB: +case 0xBFAB: +case 0xB1AC: +case 0xB3AC: +case 0xB5AC: +case 0xB7AC: +case 0xB9AC: +case 0xBBAC: +case 0xBDAC: +case 0xBFAC: +case 0xB1AD: +case 0xB3AD: +case 0xB5AD: +case 0xB7AD: +case 0xB9AD: +case 0xBBAD: +case 0xBDAD: +case 0xBFAD: +case 0xB1AE: +case 0xB3AE: +case 0xB5AE: +case 0xB7AE: +case 0xB9AE: +case 0xBBAE: +case 0xBDAE: +case 0xBFAE: +case 0xB1AF: +case 0xB3AF: +case 0xB5AF: +case 0xB7AF: +case 0xB9AF: +case 0xBBAF: +case 0xBDAF: +case 0xBFAF: + +// EORDa +case 0xB1A8: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB3B0: +case 0xB5B0: +case 0xB7B0: +case 0xB9B0: +case 0xBBB0: +case 0xBDB0: +case 0xBFB0: +case 0xB1B1: +case 0xB3B1: +case 0xB5B1: +case 0xB7B1: +case 0xB9B1: +case 0xBBB1: +case 0xBDB1: +case 0xBFB1: +case 0xB1B2: +case 0xB3B2: +case 0xB5B2: +case 0xB7B2: +case 0xB9B2: +case 0xBBB2: +case 0xBDB2: +case 0xBFB2: +case 0xB1B3: +case 0xB3B3: +case 0xB5B3: +case 0xB7B3: +case 0xB9B3: +case 0xBBB3: +case 0xBDB3: +case 0xBFB3: +case 0xB1B4: +case 0xB3B4: +case 0xB5B4: +case 0xB7B4: +case 0xB9B4: +case 0xBBB4: +case 0xBDB4: +case 0xBFB4: +case 0xB1B5: +case 0xB3B5: +case 0xB5B5: +case 0xB7B5: +case 0xB9B5: +case 0xBBB5: +case 0xBDB5: +case 0xBFB5: +case 0xB1B6: +case 0xB3B6: +case 0xB5B6: +case 0xB7B6: +case 0xB9B6: +case 0xBBB6: +case 0xBDB6: +case 0xBFB6: +case 0xB1B7: +case 0xB3B7: +case 0xB5B7: +case 0xB7B7: +case 0xB9B7: +case 0xBBB7: +case 0xBDB7: +case 0xBFB7: + +// EORDa +case 0xB1B0: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB3B8: +case 0xB5B8: +case 0xB7B8: +case 0xB9B8: +case 0xBBB8: +case 0xBDB8: +case 0xBFB8: + +// EORDa +case 0xB1B8: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB3B9: +case 0xB5B9: +case 0xB7B9: +case 0xB9B9: +case 0xBBB9: +case 0xBDB9: +case 0xBFB9: + +// EORDa +case 0xB1B9: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB39F: +case 0xB59F: +case 0xB79F: +case 0xB99F: +case 0xBB9F: +case 0xBD9F: +case 0xBF9F: + +// EORDa +case 0xB19F: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB3A7: +case 0xB5A7: +case 0xB7A7: +case 0xB9A7: +case 0xBBA7: +case 0xBDA7: +case 0xBFA7: + +// EORDa +case 0xB1A7: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, res) + res ^= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xB2C0: +case 0xB4C0: +case 0xB6C0: +case 0xB8C0: +case 0xBAC0: +case 0xBCC0: +case 0xBEC0: +case 0xB0C1: +case 0xB2C1: +case 0xB4C1: +case 0xB6C1: +case 0xB8C1: +case 0xBAC1: +case 0xBCC1: +case 0xBEC1: +case 0xB0C2: +case 0xB2C2: +case 0xB4C2: +case 0xB6C2: +case 0xB8C2: +case 0xBAC2: +case 0xBCC2: +case 0xBEC2: +case 0xB0C3: +case 0xB2C3: +case 0xB4C3: +case 0xB6C3: +case 0xB8C3: +case 0xBAC3: +case 0xBCC3: +case 0xBEC3: +case 0xB0C4: +case 0xB2C4: +case 0xB4C4: +case 0xB6C4: +case 0xB8C4: +case 0xBAC4: +case 0xBCC4: +case 0xBEC4: +case 0xB0C5: +case 0xB2C5: +case 0xB4C5: +case 0xB6C5: +case 0xB8C5: +case 0xBAC5: +case 0xBCC5: +case 0xBEC5: +case 0xB0C6: +case 0xB2C6: +case 0xB4C6: +case 0xB6C6: +case 0xB8C6: +case 0xBAC6: +case 0xBCC6: +case 0xBEC6: +case 0xB0C7: +case 0xB2C7: +case 0xB4C7: +case 0xB6C7: +case 0xB8C7: +case 0xBAC7: +case 0xBCC7: +case 0xBEC7: + +// CMPA +case 0xB0C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2C8: +case 0xB4C8: +case 0xB6C8: +case 0xB8C8: +case 0xBAC8: +case 0xBCC8: +case 0xBEC8: +case 0xB0C9: +case 0xB2C9: +case 0xB4C9: +case 0xB6C9: +case 0xB8C9: +case 0xBAC9: +case 0xBCC9: +case 0xBEC9: +case 0xB0CA: +case 0xB2CA: +case 0xB4CA: +case 0xB6CA: +case 0xB8CA: +case 0xBACA: +case 0xBCCA: +case 0xBECA: +case 0xB0CB: +case 0xB2CB: +case 0xB4CB: +case 0xB6CB: +case 0xB8CB: +case 0xBACB: +case 0xBCCB: +case 0xBECB: +case 0xB0CC: +case 0xB2CC: +case 0xB4CC: +case 0xB6CC: +case 0xB8CC: +case 0xBACC: +case 0xBCCC: +case 0xBECC: +case 0xB0CD: +case 0xB2CD: +case 0xB4CD: +case 0xB6CD: +case 0xB8CD: +case 0xBACD: +case 0xBCCD: +case 0xBECD: +case 0xB0CE: +case 0xB2CE: +case 0xB4CE: +case 0xB6CE: +case 0xB8CE: +case 0xBACE: +case 0xBCCE: +case 0xBECE: +case 0xB0CF: +case 0xB2CF: +case 0xB4CF: +case 0xB6CF: +case 0xB8CF: +case 0xBACF: +case 0xBCCF: +case 0xBECF: + +// CMPA +case 0xB0C8: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2D0: +case 0xB4D0: +case 0xB6D0: +case 0xB8D0: +case 0xBAD0: +case 0xBCD0: +case 0xBED0: +case 0xB0D1: +case 0xB2D1: +case 0xB4D1: +case 0xB6D1: +case 0xB8D1: +case 0xBAD1: +case 0xBCD1: +case 0xBED1: +case 0xB0D2: +case 0xB2D2: +case 0xB4D2: +case 0xB6D2: +case 0xB8D2: +case 0xBAD2: +case 0xBCD2: +case 0xBED2: +case 0xB0D3: +case 0xB2D3: +case 0xB4D3: +case 0xB6D3: +case 0xB8D3: +case 0xBAD3: +case 0xBCD3: +case 0xBED3: +case 0xB0D4: +case 0xB2D4: +case 0xB4D4: +case 0xB6D4: +case 0xB8D4: +case 0xBAD4: +case 0xBCD4: +case 0xBED4: +case 0xB0D5: +case 0xB2D5: +case 0xB4D5: +case 0xB6D5: +case 0xB8D5: +case 0xBAD5: +case 0xBCD5: +case 0xBED5: +case 0xB0D6: +case 0xB2D6: +case 0xB4D6: +case 0xB6D6: +case 0xB8D6: +case 0xBAD6: +case 0xBCD6: +case 0xBED6: +case 0xB0D7: +case 0xB2D7: +case 0xB4D7: +case 0xB6D7: +case 0xB8D7: +case 0xBAD7: +case 0xBCD7: +case 0xBED7: + +// CMPA +case 0xB0D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2D8: +case 0xB4D8: +case 0xB6D8: +case 0xB8D8: +case 0xBAD8: +case 0xBCD8: +case 0xBED8: +case 0xB0D9: +case 0xB2D9: +case 0xB4D9: +case 0xB6D9: +case 0xB8D9: +case 0xBAD9: +case 0xBCD9: +case 0xBED9: +case 0xB0DA: +case 0xB2DA: +case 0xB4DA: +case 0xB6DA: +case 0xB8DA: +case 0xBADA: +case 0xBCDA: +case 0xBEDA: +case 0xB0DB: +case 0xB2DB: +case 0xB4DB: +case 0xB6DB: +case 0xB8DB: +case 0xBADB: +case 0xBCDB: +case 0xBEDB: +case 0xB0DC: +case 0xB2DC: +case 0xB4DC: +case 0xB6DC: +case 0xB8DC: +case 0xBADC: +case 0xBCDC: +case 0xBEDC: +case 0xB0DD: +case 0xB2DD: +case 0xB4DD: +case 0xB6DD: +case 0xB8DD: +case 0xBADD: +case 0xBCDD: +case 0xBEDD: +case 0xB0DE: +case 0xB2DE: +case 0xB4DE: +case 0xB6DE: +case 0xB8DE: +case 0xBADE: +case 0xBCDE: +case 0xBEDE: + +// CMPA +case 0xB0D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2E0: +case 0xB4E0: +case 0xB6E0: +case 0xB8E0: +case 0xBAE0: +case 0xBCE0: +case 0xBEE0: +case 0xB0E1: +case 0xB2E1: +case 0xB4E1: +case 0xB6E1: +case 0xB8E1: +case 0xBAE1: +case 0xBCE1: +case 0xBEE1: +case 0xB0E2: +case 0xB2E2: +case 0xB4E2: +case 0xB6E2: +case 0xB8E2: +case 0xBAE2: +case 0xBCE2: +case 0xBEE2: +case 0xB0E3: +case 0xB2E3: +case 0xB4E3: +case 0xB6E3: +case 0xB8E3: +case 0xBAE3: +case 0xBCE3: +case 0xBEE3: +case 0xB0E4: +case 0xB2E4: +case 0xB4E4: +case 0xB6E4: +case 0xB8E4: +case 0xBAE4: +case 0xBCE4: +case 0xBEE4: +case 0xB0E5: +case 0xB2E5: +case 0xB4E5: +case 0xB6E5: +case 0xB8E5: +case 0xBAE5: +case 0xBCE5: +case 0xBEE5: +case 0xB0E6: +case 0xB2E6: +case 0xB4E6: +case 0xB6E6: +case 0xB8E6: +case 0xBAE6: +case 0xBCE6: +case 0xBEE6: + +// CMPA +case 0xB0E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2E8: +case 0xB4E8: +case 0xB6E8: +case 0xB8E8: +case 0xBAE8: +case 0xBCE8: +case 0xBEE8: +case 0xB0E9: +case 0xB2E9: +case 0xB4E9: +case 0xB6E9: +case 0xB8E9: +case 0xBAE9: +case 0xBCE9: +case 0xBEE9: +case 0xB0EA: +case 0xB2EA: +case 0xB4EA: +case 0xB6EA: +case 0xB8EA: +case 0xBAEA: +case 0xBCEA: +case 0xBEEA: +case 0xB0EB: +case 0xB2EB: +case 0xB4EB: +case 0xB6EB: +case 0xB8EB: +case 0xBAEB: +case 0xBCEB: +case 0xBEEB: +case 0xB0EC: +case 0xB2EC: +case 0xB4EC: +case 0xB6EC: +case 0xB8EC: +case 0xBAEC: +case 0xBCEC: +case 0xBEEC: +case 0xB0ED: +case 0xB2ED: +case 0xB4ED: +case 0xB6ED: +case 0xB8ED: +case 0xBAED: +case 0xBCED: +case 0xBEED: +case 0xB0EE: +case 0xB2EE: +case 0xB4EE: +case 0xB6EE: +case 0xB8EE: +case 0xBAEE: +case 0xBCEE: +case 0xBEEE: +case 0xB0EF: +case 0xB2EF: +case 0xB4EF: +case 0xB6EF: +case 0xB8EF: +case 0xBAEF: +case 0xBCEF: +case 0xBEEF: + +// CMPA +case 0xB0E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2F0: +case 0xB4F0: +case 0xB6F0: +case 0xB8F0: +case 0xBAF0: +case 0xBCF0: +case 0xBEF0: +case 0xB0F1: +case 0xB2F1: +case 0xB4F1: +case 0xB6F1: +case 0xB8F1: +case 0xBAF1: +case 0xBCF1: +case 0xBEF1: +case 0xB0F2: +case 0xB2F2: +case 0xB4F2: +case 0xB6F2: +case 0xB8F2: +case 0xBAF2: +case 0xBCF2: +case 0xBEF2: +case 0xB0F3: +case 0xB2F3: +case 0xB4F3: +case 0xB6F3: +case 0xB8F3: +case 0xBAF3: +case 0xBCF3: +case 0xBEF3: +case 0xB0F4: +case 0xB2F4: +case 0xB4F4: +case 0xB6F4: +case 0xB8F4: +case 0xBAF4: +case 0xBCF4: +case 0xBEF4: +case 0xB0F5: +case 0xB2F5: +case 0xB4F5: +case 0xB6F5: +case 0xB8F5: +case 0xBAF5: +case 0xBCF5: +case 0xBEF5: +case 0xB0F6: +case 0xB2F6: +case 0xB4F6: +case 0xB6F6: +case 0xB8F6: +case 0xBAF6: +case 0xBCF6: +case 0xBEF6: +case 0xB0F7: +case 0xB2F7: +case 0xB4F7: +case 0xB6F7: +case 0xB8F7: +case 0xBAF7: +case 0xBCF7: +case 0xBEF7: + +// CMPA +case 0xB0F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2F8: +case 0xB4F8: +case 0xB6F8: +case 0xB8F8: +case 0xBAF8: +case 0xBCF8: +case 0xBEF8: + +// CMPA +case 0xB0F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2F9: +case 0xB4F9: +case 0xB6F9: +case 0xB8F9: +case 0xBAF9: +case 0xBCF9: +case 0xBEF9: + +// CMPA +case 0xB0F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2FA: +case 0xB4FA: +case 0xB6FA: +case 0xB8FA: +case 0xBAFA: +case 0xBCFA: +case 0xBEFA: + +// CMPA +case 0xB0FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2FB: +case 0xB4FB: +case 0xB6FB: +case 0xB8FB: +case 0xBAFB: +case 0xBCFB: +case 0xBEFB: + +// CMPA +case 0xB0FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2FC: +case 0xB4FC: +case 0xB6FC: +case 0xB8FC: +case 0xBAFC: +case 0xBCFC: +case 0xBEFC: + +// CMPA +case 0xB0FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)FETCH_WORD; + PC += 2; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(10) +case 0xB2DF: +case 0xB4DF: +case 0xB6DF: +case 0xB8DF: +case 0xBADF: +case 0xBCDF: +case 0xBEDF: + +// CMPA +case 0xB0DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB2E7: +case 0xB4E7: +case 0xB6E7: +case 0xB8E7: +case 0xBAE7: +case 0xBCE7: +case 0xBEE7: + +// CMPA +case 0xB0E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3C0: +case 0xB5C0: +case 0xB7C0: +case 0xB9C0: +case 0xBBC0: +case 0xBDC0: +case 0xBFC0: +case 0xB1C1: +case 0xB3C1: +case 0xB5C1: +case 0xB7C1: +case 0xB9C1: +case 0xBBC1: +case 0xBDC1: +case 0xBFC1: +case 0xB1C2: +case 0xB3C2: +case 0xB5C2: +case 0xB7C2: +case 0xB9C2: +case 0xBBC2: +case 0xBDC2: +case 0xBFC2: +case 0xB1C3: +case 0xB3C3: +case 0xB5C3: +case 0xB7C3: +case 0xB9C3: +case 0xBBC3: +case 0xBDC3: +case 0xBFC3: +case 0xB1C4: +case 0xB3C4: +case 0xB5C4: +case 0xB7C4: +case 0xB9C4: +case 0xBBC4: +case 0xBDC4: +case 0xBFC4: +case 0xB1C5: +case 0xB3C5: +case 0xB5C5: +case 0xB7C5: +case 0xB9C5: +case 0xBBC5: +case 0xBDC5: +case 0xBFC5: +case 0xB1C6: +case 0xB3C6: +case 0xB5C6: +case 0xB7C6: +case 0xB9C6: +case 0xBBC6: +case 0xBDC6: +case 0xBFC6: +case 0xB1C7: +case 0xB3C7: +case 0xB5C7: +case 0xB7C7: +case 0xB9C7: +case 0xBBC7: +case 0xBDC7: +case 0xBFC7: + +// CMPA +case 0xB1C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3C8: +case 0xB5C8: +case 0xB7C8: +case 0xB9C8: +case 0xBBC8: +case 0xBDC8: +case 0xBFC8: +case 0xB1C9: +case 0xB3C9: +case 0xB5C9: +case 0xB7C9: +case 0xB9C9: +case 0xBBC9: +case 0xBDC9: +case 0xBFC9: +case 0xB1CA: +case 0xB3CA: +case 0xB5CA: +case 0xB7CA: +case 0xB9CA: +case 0xBBCA: +case 0xBDCA: +case 0xBFCA: +case 0xB1CB: +case 0xB3CB: +case 0xB5CB: +case 0xB7CB: +case 0xB9CB: +case 0xBBCB: +case 0xBDCB: +case 0xBFCB: +case 0xB1CC: +case 0xB3CC: +case 0xB5CC: +case 0xB7CC: +case 0xB9CC: +case 0xBBCC: +case 0xBDCC: +case 0xBFCC: +case 0xB1CD: +case 0xB3CD: +case 0xB5CD: +case 0xB7CD: +case 0xB9CD: +case 0xBBCD: +case 0xBDCD: +case 0xBFCD: +case 0xB1CE: +case 0xB3CE: +case 0xB5CE: +case 0xB7CE: +case 0xB9CE: +case 0xBBCE: +case 0xBDCE: +case 0xBFCE: +case 0xB1CF: +case 0xB3CF: +case 0xB5CF: +case 0xB7CF: +case 0xB9CF: +case 0xBBCF: +case 0xBDCF: +case 0xBFCF: + +// CMPA +case 0xB1C8: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3D0: +case 0xB5D0: +case 0xB7D0: +case 0xB9D0: +case 0xBBD0: +case 0xBDD0: +case 0xBFD0: +case 0xB1D1: +case 0xB3D1: +case 0xB5D1: +case 0xB7D1: +case 0xB9D1: +case 0xBBD1: +case 0xBDD1: +case 0xBFD1: +case 0xB1D2: +case 0xB3D2: +case 0xB5D2: +case 0xB7D2: +case 0xB9D2: +case 0xBBD2: +case 0xBDD2: +case 0xBFD2: +case 0xB1D3: +case 0xB3D3: +case 0xB5D3: +case 0xB7D3: +case 0xB9D3: +case 0xBBD3: +case 0xBDD3: +case 0xBFD3: +case 0xB1D4: +case 0xB3D4: +case 0xB5D4: +case 0xB7D4: +case 0xB9D4: +case 0xBBD4: +case 0xBDD4: +case 0xBFD4: +case 0xB1D5: +case 0xB3D5: +case 0xB5D5: +case 0xB7D5: +case 0xB9D5: +case 0xBBD5: +case 0xBDD5: +case 0xBFD5: +case 0xB1D6: +case 0xB3D6: +case 0xB5D6: +case 0xB7D6: +case 0xB9D6: +case 0xBBD6: +case 0xBDD6: +case 0xBFD6: +case 0xB1D7: +case 0xB3D7: +case 0xB5D7: +case 0xB7D7: +case 0xB9D7: +case 0xBBD7: +case 0xBDD7: +case 0xBFD7: + +// CMPA +case 0xB1D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3D8: +case 0xB5D8: +case 0xB7D8: +case 0xB9D8: +case 0xBBD8: +case 0xBDD8: +case 0xBFD8: +case 0xB1D9: +case 0xB3D9: +case 0xB5D9: +case 0xB7D9: +case 0xB9D9: +case 0xBBD9: +case 0xBDD9: +case 0xBFD9: +case 0xB1DA: +case 0xB3DA: +case 0xB5DA: +case 0xB7DA: +case 0xB9DA: +case 0xBBDA: +case 0xBDDA: +case 0xBFDA: +case 0xB1DB: +case 0xB3DB: +case 0xB5DB: +case 0xB7DB: +case 0xB9DB: +case 0xBBDB: +case 0xBDDB: +case 0xBFDB: +case 0xB1DC: +case 0xB3DC: +case 0xB5DC: +case 0xB7DC: +case 0xB9DC: +case 0xBBDC: +case 0xBDDC: +case 0xBFDC: +case 0xB1DD: +case 0xB3DD: +case 0xB5DD: +case 0xB7DD: +case 0xB9DD: +case 0xBBDD: +case 0xBDDD: +case 0xBFDD: +case 0xB1DE: +case 0xB3DE: +case 0xB5DE: +case 0xB7DE: +case 0xB9DE: +case 0xBBDE: +case 0xBDDE: +case 0xBFDE: + +// CMPA +case 0xB1D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3E0: +case 0xB5E0: +case 0xB7E0: +case 0xB9E0: +case 0xBBE0: +case 0xBDE0: +case 0xBFE0: +case 0xB1E1: +case 0xB3E1: +case 0xB5E1: +case 0xB7E1: +case 0xB9E1: +case 0xBBE1: +case 0xBDE1: +case 0xBFE1: +case 0xB1E2: +case 0xB3E2: +case 0xB5E2: +case 0xB7E2: +case 0xB9E2: +case 0xBBE2: +case 0xBDE2: +case 0xBFE2: +case 0xB1E3: +case 0xB3E3: +case 0xB5E3: +case 0xB7E3: +case 0xB9E3: +case 0xBBE3: +case 0xBDE3: +case 0xBFE3: +case 0xB1E4: +case 0xB3E4: +case 0xB5E4: +case 0xB7E4: +case 0xB9E4: +case 0xBBE4: +case 0xBDE4: +case 0xBFE4: +case 0xB1E5: +case 0xB3E5: +case 0xB5E5: +case 0xB7E5: +case 0xB9E5: +case 0xBBE5: +case 0xBDE5: +case 0xBFE5: +case 0xB1E6: +case 0xB3E6: +case 0xB5E6: +case 0xB7E6: +case 0xB9E6: +case 0xBBE6: +case 0xBDE6: +case 0xBFE6: + +// CMPA +case 0xB1E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3E8: +case 0xB5E8: +case 0xB7E8: +case 0xB9E8: +case 0xBBE8: +case 0xBDE8: +case 0xBFE8: +case 0xB1E9: +case 0xB3E9: +case 0xB5E9: +case 0xB7E9: +case 0xB9E9: +case 0xBBE9: +case 0xBDE9: +case 0xBFE9: +case 0xB1EA: +case 0xB3EA: +case 0xB5EA: +case 0xB7EA: +case 0xB9EA: +case 0xBBEA: +case 0xBDEA: +case 0xBFEA: +case 0xB1EB: +case 0xB3EB: +case 0xB5EB: +case 0xB7EB: +case 0xB9EB: +case 0xBBEB: +case 0xBDEB: +case 0xBFEB: +case 0xB1EC: +case 0xB3EC: +case 0xB5EC: +case 0xB7EC: +case 0xB9EC: +case 0xBBEC: +case 0xBDEC: +case 0xBFEC: +case 0xB1ED: +case 0xB3ED: +case 0xB5ED: +case 0xB7ED: +case 0xB9ED: +case 0xBBED: +case 0xBDED: +case 0xBFED: +case 0xB1EE: +case 0xB3EE: +case 0xB5EE: +case 0xB7EE: +case 0xB9EE: +case 0xBBEE: +case 0xBDEE: +case 0xBFEE: +case 0xB1EF: +case 0xB3EF: +case 0xB5EF: +case 0xB7EF: +case 0xB9EF: +case 0xBBEF: +case 0xBDEF: +case 0xBFEF: + +// CMPA +case 0xB1E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3F0: +case 0xB5F0: +case 0xB7F0: +case 0xB9F0: +case 0xBBF0: +case 0xBDF0: +case 0xBFF0: +case 0xB1F1: +case 0xB3F1: +case 0xB5F1: +case 0xB7F1: +case 0xB9F1: +case 0xBBF1: +case 0xBDF1: +case 0xBFF1: +case 0xB1F2: +case 0xB3F2: +case 0xB5F2: +case 0xB7F2: +case 0xB9F2: +case 0xBBF2: +case 0xBDF2: +case 0xBFF2: +case 0xB1F3: +case 0xB3F3: +case 0xB5F3: +case 0xB7F3: +case 0xB9F3: +case 0xBBF3: +case 0xBDF3: +case 0xBFF3: +case 0xB1F4: +case 0xB3F4: +case 0xB5F4: +case 0xB7F4: +case 0xB9F4: +case 0xBBF4: +case 0xBDF4: +case 0xBFF4: +case 0xB1F5: +case 0xB3F5: +case 0xB5F5: +case 0xB7F5: +case 0xB9F5: +case 0xBBF5: +case 0xBDF5: +case 0xBFF5: +case 0xB1F6: +case 0xB3F6: +case 0xB5F6: +case 0xB7F6: +case 0xB9F6: +case 0xBBF6: +case 0xBDF6: +case 0xBFF6: +case 0xB1F7: +case 0xB3F7: +case 0xB5F7: +case 0xB7F7: +case 0xB9F7: +case 0xBBF7: +case 0xBDF7: +case 0xBFF7: + +// CMPA +case 0xB1F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3F8: +case 0xB5F8: +case 0xB7F8: +case 0xB9F8: +case 0xBBF8: +case 0xBDF8: +case 0xBFF8: + +// CMPA +case 0xB1F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3F9: +case 0xB5F9: +case 0xB7F9: +case 0xB9F9: +case 0xBBF9: +case 0xBDF9: +case 0xBFF9: + +// CMPA +case 0xB1F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3FA: +case 0xB5FA: +case 0xB7FA: +case 0xB9FA: +case 0xBBFA: +case 0xBDFA: +case 0xBFFA: + +// CMPA +case 0xB1FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3FB: +case 0xB5FB: +case 0xB7FB: +case 0xB9FB: +case 0xBBFB: +case 0xBDFB: +case 0xBFFB: + +// CMPA +case 0xB1FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3FC: +case 0xB5FC: +case 0xB7FC: +case 0xB9FC: +case 0xBBFC: +case 0xBDFC: +case 0xBFFC: + +// CMPA +case 0xB1FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)FETCH_LONG; + PC += 4; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(14) +case 0xB3DF: +case 0xB5DF: +case 0xB7DF: +case 0xB9DF: +case 0xBBDF: +case 0xBDDF: +case 0xBFDF: + +// CMPA +case 0xB1DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) +case 0xB3E7: +case 0xB5E7: +case 0xB7E7: +case 0xB9E7: +case 0xBBE7: +case 0xBDE7: +case 0xBFE7: + +// CMPA +case 0xB1E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst - src; + CPU->flag_notZ = res; + CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23; + CPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24; + CPU->flag_N = res >> 24; +} +RET(6) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_opC.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_opC.inc new file mode 100644 index 0000000000..82d1c70d45 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_opC.inc @@ -0,0 +1,5283 @@ +case 0xC200: +case 0xC400: +case 0xC600: +case 0xC800: +case 0xCA00: +case 0xCC00: +case 0xCE00: +case 0xC001: +case 0xC201: +case 0xC401: +case 0xC601: +case 0xC801: +case 0xCA01: +case 0xCC01: +case 0xCE01: +case 0xC002: +case 0xC202: +case 0xC402: +case 0xC602: +case 0xC802: +case 0xCA02: +case 0xCC02: +case 0xCE02: +case 0xC003: +case 0xC203: +case 0xC403: +case 0xC603: +case 0xC803: +case 0xCA03: +case 0xCC03: +case 0xCE03: +case 0xC004: +case 0xC204: +case 0xC404: +case 0xC604: +case 0xC804: +case 0xCA04: +case 0xCC04: +case 0xCE04: +case 0xC005: +case 0xC205: +case 0xC405: +case 0xC605: +case 0xC805: +case 0xCA05: +case 0xCC05: +case 0xCE05: +case 0xC006: +case 0xC206: +case 0xC406: +case 0xC606: +case 0xC806: +case 0xCA06: +case 0xCC06: +case 0xCE06: +case 0xC007: +case 0xC207: +case 0xC407: +case 0xC607: +case 0xC807: +case 0xCA07: +case 0xCC07: +case 0xCE07: + +// ANDaD +case 0xC000: +{ + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC210: +case 0xC410: +case 0xC610: +case 0xC810: +case 0xCA10: +case 0xCC10: +case 0xCE10: +case 0xC011: +case 0xC211: +case 0xC411: +case 0xC611: +case 0xC811: +case 0xCA11: +case 0xCC11: +case 0xCE11: +case 0xC012: +case 0xC212: +case 0xC412: +case 0xC612: +case 0xC812: +case 0xCA12: +case 0xCC12: +case 0xCE12: +case 0xC013: +case 0xC213: +case 0xC413: +case 0xC613: +case 0xC813: +case 0xCA13: +case 0xCC13: +case 0xCE13: +case 0xC014: +case 0xC214: +case 0xC414: +case 0xC614: +case 0xC814: +case 0xCA14: +case 0xCC14: +case 0xCE14: +case 0xC015: +case 0xC215: +case 0xC415: +case 0xC615: +case 0xC815: +case 0xCA15: +case 0xCC15: +case 0xCE15: +case 0xC016: +case 0xC216: +case 0xC416: +case 0xC616: +case 0xC816: +case 0xCA16: +case 0xCC16: +case 0xCE16: +case 0xC017: +case 0xC217: +case 0xC417: +case 0xC617: +case 0xC817: +case 0xCA17: +case 0xCC17: +case 0xCE17: + +// ANDaD +case 0xC010: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC218: +case 0xC418: +case 0xC618: +case 0xC818: +case 0xCA18: +case 0xCC18: +case 0xCE18: +case 0xC019: +case 0xC219: +case 0xC419: +case 0xC619: +case 0xC819: +case 0xCA19: +case 0xCC19: +case 0xCE19: +case 0xC01A: +case 0xC21A: +case 0xC41A: +case 0xC61A: +case 0xC81A: +case 0xCA1A: +case 0xCC1A: +case 0xCE1A: +case 0xC01B: +case 0xC21B: +case 0xC41B: +case 0xC61B: +case 0xC81B: +case 0xCA1B: +case 0xCC1B: +case 0xCE1B: +case 0xC01C: +case 0xC21C: +case 0xC41C: +case 0xC61C: +case 0xC81C: +case 0xCA1C: +case 0xCC1C: +case 0xCE1C: +case 0xC01D: +case 0xC21D: +case 0xC41D: +case 0xC61D: +case 0xC81D: +case 0xCA1D: +case 0xCC1D: +case 0xCE1D: +case 0xC01E: +case 0xC21E: +case 0xC41E: +case 0xC61E: +case 0xC81E: +case 0xCA1E: +case 0xCC1E: +case 0xCE1E: + +// ANDaD +case 0xC018: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC220: +case 0xC420: +case 0xC620: +case 0xC820: +case 0xCA20: +case 0xCC20: +case 0xCE20: +case 0xC021: +case 0xC221: +case 0xC421: +case 0xC621: +case 0xC821: +case 0xCA21: +case 0xCC21: +case 0xCE21: +case 0xC022: +case 0xC222: +case 0xC422: +case 0xC622: +case 0xC822: +case 0xCA22: +case 0xCC22: +case 0xCE22: +case 0xC023: +case 0xC223: +case 0xC423: +case 0xC623: +case 0xC823: +case 0xCA23: +case 0xCC23: +case 0xCE23: +case 0xC024: +case 0xC224: +case 0xC424: +case 0xC624: +case 0xC824: +case 0xCA24: +case 0xCC24: +case 0xCE24: +case 0xC025: +case 0xC225: +case 0xC425: +case 0xC625: +case 0xC825: +case 0xCA25: +case 0xCC25: +case 0xCE25: +case 0xC026: +case 0xC226: +case 0xC426: +case 0xC626: +case 0xC826: +case 0xCA26: +case 0xCC26: +case 0xCE26: + +// ANDaD +case 0xC020: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC228: +case 0xC428: +case 0xC628: +case 0xC828: +case 0xCA28: +case 0xCC28: +case 0xCE28: +case 0xC029: +case 0xC229: +case 0xC429: +case 0xC629: +case 0xC829: +case 0xCA29: +case 0xCC29: +case 0xCE29: +case 0xC02A: +case 0xC22A: +case 0xC42A: +case 0xC62A: +case 0xC82A: +case 0xCA2A: +case 0xCC2A: +case 0xCE2A: +case 0xC02B: +case 0xC22B: +case 0xC42B: +case 0xC62B: +case 0xC82B: +case 0xCA2B: +case 0xCC2B: +case 0xCE2B: +case 0xC02C: +case 0xC22C: +case 0xC42C: +case 0xC62C: +case 0xC82C: +case 0xCA2C: +case 0xCC2C: +case 0xCE2C: +case 0xC02D: +case 0xC22D: +case 0xC42D: +case 0xC62D: +case 0xC82D: +case 0xCA2D: +case 0xCC2D: +case 0xCE2D: +case 0xC02E: +case 0xC22E: +case 0xC42E: +case 0xC62E: +case 0xC82E: +case 0xCA2E: +case 0xCC2E: +case 0xCE2E: +case 0xC02F: +case 0xC22F: +case 0xC42F: +case 0xC62F: +case 0xC82F: +case 0xCA2F: +case 0xCC2F: +case 0xCE2F: + +// ANDaD +case 0xC028: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC230: +case 0xC430: +case 0xC630: +case 0xC830: +case 0xCA30: +case 0xCC30: +case 0xCE30: +case 0xC031: +case 0xC231: +case 0xC431: +case 0xC631: +case 0xC831: +case 0xCA31: +case 0xCC31: +case 0xCE31: +case 0xC032: +case 0xC232: +case 0xC432: +case 0xC632: +case 0xC832: +case 0xCA32: +case 0xCC32: +case 0xCE32: +case 0xC033: +case 0xC233: +case 0xC433: +case 0xC633: +case 0xC833: +case 0xCA33: +case 0xCC33: +case 0xCE33: +case 0xC034: +case 0xC234: +case 0xC434: +case 0xC634: +case 0xC834: +case 0xCA34: +case 0xCC34: +case 0xCE34: +case 0xC035: +case 0xC235: +case 0xC435: +case 0xC635: +case 0xC835: +case 0xCA35: +case 0xCC35: +case 0xCE35: +case 0xC036: +case 0xC236: +case 0xC436: +case 0xC636: +case 0xC836: +case 0xCA36: +case 0xCC36: +case 0xCE36: +case 0xC037: +case 0xC237: +case 0xC437: +case 0xC637: +case 0xC837: +case 0xCA37: +case 0xCC37: +case 0xCE37: + +// ANDaD +case 0xC030: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC238: +case 0xC438: +case 0xC638: +case 0xC838: +case 0xCA38: +case 0xCC38: +case 0xCE38: + +// ANDaD +case 0xC038: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC239: +case 0xC439: +case 0xC639: +case 0xC839: +case 0xCA39: +case 0xCC39: +case 0xCE39: + +// ANDaD +case 0xC039: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC23A: +case 0xC43A: +case 0xC63A: +case 0xC83A: +case 0xCA3A: +case 0xCC3A: +case 0xCE3A: + +// ANDaD +case 0xC03A: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC23B: +case 0xC43B: +case 0xC63B: +case 0xC83B: +case 0xCA3B: +case 0xCC3B: +case 0xCE3B: + +// ANDaD +case 0xC03B: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC23C: +case 0xC43C: +case 0xC63C: +case 0xC83C: +case 0xCA3C: +case 0xCC3C: +case 0xCE3C: + +// ANDaD +case 0xC03C: +{ + u32 res; + u32 src; + src = FETCH_BYTE; + PC += 2; + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0xC21F: +case 0xC41F: +case 0xC61F: +case 0xC81F: +case 0xCA1F: +case 0xCC1F: +case 0xCE1F: + +// ANDaD +case 0xC01F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC227: +case 0xC427: +case 0xC627: +case 0xC827: +case 0xCA27: +case 0xCC27: +case 0xCE27: + +// ANDaD +case 0xC027: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + res = (u8)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC240: +case 0xC440: +case 0xC640: +case 0xC840: +case 0xCA40: +case 0xCC40: +case 0xCE40: +case 0xC041: +case 0xC241: +case 0xC441: +case 0xC641: +case 0xC841: +case 0xCA41: +case 0xCC41: +case 0xCE41: +case 0xC042: +case 0xC242: +case 0xC442: +case 0xC642: +case 0xC842: +case 0xCA42: +case 0xCC42: +case 0xCE42: +case 0xC043: +case 0xC243: +case 0xC443: +case 0xC643: +case 0xC843: +case 0xCA43: +case 0xCC43: +case 0xCE43: +case 0xC044: +case 0xC244: +case 0xC444: +case 0xC644: +case 0xC844: +case 0xCA44: +case 0xCC44: +case 0xCE44: +case 0xC045: +case 0xC245: +case 0xC445: +case 0xC645: +case 0xC845: +case 0xCA45: +case 0xCC45: +case 0xCE45: +case 0xC046: +case 0xC246: +case 0xC446: +case 0xC646: +case 0xC846: +case 0xCA46: +case 0xCC46: +case 0xCE46: +case 0xC047: +case 0xC247: +case 0xC447: +case 0xC647: +case 0xC847: +case 0xCA47: +case 0xCC47: +case 0xCE47: + +// ANDaD +case 0xC040: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC250: +case 0xC450: +case 0xC650: +case 0xC850: +case 0xCA50: +case 0xCC50: +case 0xCE50: +case 0xC051: +case 0xC251: +case 0xC451: +case 0xC651: +case 0xC851: +case 0xCA51: +case 0xCC51: +case 0xCE51: +case 0xC052: +case 0xC252: +case 0xC452: +case 0xC652: +case 0xC852: +case 0xCA52: +case 0xCC52: +case 0xCE52: +case 0xC053: +case 0xC253: +case 0xC453: +case 0xC653: +case 0xC853: +case 0xCA53: +case 0xCC53: +case 0xCE53: +case 0xC054: +case 0xC254: +case 0xC454: +case 0xC654: +case 0xC854: +case 0xCA54: +case 0xCC54: +case 0xCE54: +case 0xC055: +case 0xC255: +case 0xC455: +case 0xC655: +case 0xC855: +case 0xCA55: +case 0xCC55: +case 0xCE55: +case 0xC056: +case 0xC256: +case 0xC456: +case 0xC656: +case 0xC856: +case 0xCA56: +case 0xCC56: +case 0xCE56: +case 0xC057: +case 0xC257: +case 0xC457: +case 0xC657: +case 0xC857: +case 0xCA57: +case 0xCC57: +case 0xCE57: + +// ANDaD +case 0xC050: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC258: +case 0xC458: +case 0xC658: +case 0xC858: +case 0xCA58: +case 0xCC58: +case 0xCE58: +case 0xC059: +case 0xC259: +case 0xC459: +case 0xC659: +case 0xC859: +case 0xCA59: +case 0xCC59: +case 0xCE59: +case 0xC05A: +case 0xC25A: +case 0xC45A: +case 0xC65A: +case 0xC85A: +case 0xCA5A: +case 0xCC5A: +case 0xCE5A: +case 0xC05B: +case 0xC25B: +case 0xC45B: +case 0xC65B: +case 0xC85B: +case 0xCA5B: +case 0xCC5B: +case 0xCE5B: +case 0xC05C: +case 0xC25C: +case 0xC45C: +case 0xC65C: +case 0xC85C: +case 0xCA5C: +case 0xCC5C: +case 0xCE5C: +case 0xC05D: +case 0xC25D: +case 0xC45D: +case 0xC65D: +case 0xC85D: +case 0xCA5D: +case 0xCC5D: +case 0xCE5D: +case 0xC05E: +case 0xC25E: +case 0xC45E: +case 0xC65E: +case 0xC85E: +case 0xCA5E: +case 0xCC5E: +case 0xCE5E: + +// ANDaD +case 0xC058: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC260: +case 0xC460: +case 0xC660: +case 0xC860: +case 0xCA60: +case 0xCC60: +case 0xCE60: +case 0xC061: +case 0xC261: +case 0xC461: +case 0xC661: +case 0xC861: +case 0xCA61: +case 0xCC61: +case 0xCE61: +case 0xC062: +case 0xC262: +case 0xC462: +case 0xC662: +case 0xC862: +case 0xCA62: +case 0xCC62: +case 0xCE62: +case 0xC063: +case 0xC263: +case 0xC463: +case 0xC663: +case 0xC863: +case 0xCA63: +case 0xCC63: +case 0xCE63: +case 0xC064: +case 0xC264: +case 0xC464: +case 0xC664: +case 0xC864: +case 0xCA64: +case 0xCC64: +case 0xCE64: +case 0xC065: +case 0xC265: +case 0xC465: +case 0xC665: +case 0xC865: +case 0xCA65: +case 0xCC65: +case 0xCE65: +case 0xC066: +case 0xC266: +case 0xC466: +case 0xC666: +case 0xC866: +case 0xCA66: +case 0xCC66: +case 0xCE66: + +// ANDaD +case 0xC060: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC268: +case 0xC468: +case 0xC668: +case 0xC868: +case 0xCA68: +case 0xCC68: +case 0xCE68: +case 0xC069: +case 0xC269: +case 0xC469: +case 0xC669: +case 0xC869: +case 0xCA69: +case 0xCC69: +case 0xCE69: +case 0xC06A: +case 0xC26A: +case 0xC46A: +case 0xC66A: +case 0xC86A: +case 0xCA6A: +case 0xCC6A: +case 0xCE6A: +case 0xC06B: +case 0xC26B: +case 0xC46B: +case 0xC66B: +case 0xC86B: +case 0xCA6B: +case 0xCC6B: +case 0xCE6B: +case 0xC06C: +case 0xC26C: +case 0xC46C: +case 0xC66C: +case 0xC86C: +case 0xCA6C: +case 0xCC6C: +case 0xCE6C: +case 0xC06D: +case 0xC26D: +case 0xC46D: +case 0xC66D: +case 0xC86D: +case 0xCA6D: +case 0xCC6D: +case 0xCE6D: +case 0xC06E: +case 0xC26E: +case 0xC46E: +case 0xC66E: +case 0xC86E: +case 0xCA6E: +case 0xCC6E: +case 0xCE6E: +case 0xC06F: +case 0xC26F: +case 0xC46F: +case 0xC66F: +case 0xC86F: +case 0xCA6F: +case 0xCC6F: +case 0xCE6F: + +// ANDaD +case 0xC068: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC270: +case 0xC470: +case 0xC670: +case 0xC870: +case 0xCA70: +case 0xCC70: +case 0xCE70: +case 0xC071: +case 0xC271: +case 0xC471: +case 0xC671: +case 0xC871: +case 0xCA71: +case 0xCC71: +case 0xCE71: +case 0xC072: +case 0xC272: +case 0xC472: +case 0xC672: +case 0xC872: +case 0xCA72: +case 0xCC72: +case 0xCE72: +case 0xC073: +case 0xC273: +case 0xC473: +case 0xC673: +case 0xC873: +case 0xCA73: +case 0xCC73: +case 0xCE73: +case 0xC074: +case 0xC274: +case 0xC474: +case 0xC674: +case 0xC874: +case 0xCA74: +case 0xCC74: +case 0xCE74: +case 0xC075: +case 0xC275: +case 0xC475: +case 0xC675: +case 0xC875: +case 0xCA75: +case 0xCC75: +case 0xCE75: +case 0xC076: +case 0xC276: +case 0xC476: +case 0xC676: +case 0xC876: +case 0xCA76: +case 0xCC76: +case 0xCE76: +case 0xC077: +case 0xC277: +case 0xC477: +case 0xC677: +case 0xC877: +case 0xCA77: +case 0xCC77: +case 0xCE77: + +// ANDaD +case 0xC070: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC278: +case 0xC478: +case 0xC678: +case 0xC878: +case 0xCA78: +case 0xCC78: +case 0xCE78: + +// ANDaD +case 0xC078: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC279: +case 0xC479: +case 0xC679: +case 0xC879: +case 0xCA79: +case 0xCC79: +case 0xCE79: + +// ANDaD +case 0xC079: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC27A: +case 0xC47A: +case 0xC67A: +case 0xC87A: +case 0xCA7A: +case 0xCC7A: +case 0xCE7A: + +// ANDaD +case 0xC07A: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC27B: +case 0xC47B: +case 0xC67B: +case 0xC87B: +case 0xCA7B: +case 0xCC7B: +case 0xCE7B: + +// ANDaD +case 0xC07B: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC27C: +case 0xC47C: +case 0xC67C: +case 0xC87C: +case 0xCA7C: +case 0xCC7C: +case 0xCE7C: + +// ANDaD +case 0xC07C: +{ + u32 res; + u32 src; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0xC25F: +case 0xC45F: +case 0xC65F: +case 0xC85F: +case 0xCA5F: +case 0xCC5F: +case 0xCE5F: + +// ANDaD +case 0xC05F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC267: +case 0xC467: +case 0xC667: +case 0xC867: +case 0xCA67: +case 0xCC67: +case 0xCE67: + +// ANDaD +case 0xC067: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC280: +case 0xC480: +case 0xC680: +case 0xC880: +case 0xCA80: +case 0xCC80: +case 0xCE80: +case 0xC081: +case 0xC281: +case 0xC481: +case 0xC681: +case 0xC881: +case 0xCA81: +case 0xCC81: +case 0xCE81: +case 0xC082: +case 0xC282: +case 0xC482: +case 0xC682: +case 0xC882: +case 0xCA82: +case 0xCC82: +case 0xCE82: +case 0xC083: +case 0xC283: +case 0xC483: +case 0xC683: +case 0xC883: +case 0xCA83: +case 0xCC83: +case 0xCE83: +case 0xC084: +case 0xC284: +case 0xC484: +case 0xC684: +case 0xC884: +case 0xCA84: +case 0xCC84: +case 0xCE84: +case 0xC085: +case 0xC285: +case 0xC485: +case 0xC685: +case 0xC885: +case 0xCA85: +case 0xCC85: +case 0xCE85: +case 0xC086: +case 0xC286: +case 0xC486: +case 0xC686: +case 0xC886: +case 0xCA86: +case 0xCC86: +case 0xCE86: +case 0xC087: +case 0xC287: +case 0xC487: +case 0xC687: +case 0xC887: +case 0xCA87: +case 0xCC87: +case 0xCE87: + +// ANDaD +case 0xC080: +{ + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0xC290: +case 0xC490: +case 0xC690: +case 0xC890: +case 0xCA90: +case 0xCC90: +case 0xCE90: +case 0xC091: +case 0xC291: +case 0xC491: +case 0xC691: +case 0xC891: +case 0xCA91: +case 0xCC91: +case 0xCE91: +case 0xC092: +case 0xC292: +case 0xC492: +case 0xC692: +case 0xC892: +case 0xCA92: +case 0xCC92: +case 0xCE92: +case 0xC093: +case 0xC293: +case 0xC493: +case 0xC693: +case 0xC893: +case 0xCA93: +case 0xCC93: +case 0xCE93: +case 0xC094: +case 0xC294: +case 0xC494: +case 0xC694: +case 0xC894: +case 0xCA94: +case 0xCC94: +case 0xCE94: +case 0xC095: +case 0xC295: +case 0xC495: +case 0xC695: +case 0xC895: +case 0xCA95: +case 0xCC95: +case 0xCE95: +case 0xC096: +case 0xC296: +case 0xC496: +case 0xC696: +case 0xC896: +case 0xCA96: +case 0xCC96: +case 0xCE96: +case 0xC097: +case 0xC297: +case 0xC497: +case 0xC697: +case 0xC897: +case 0xCA97: +case 0xCC97: +case 0xCE97: + +// ANDaD +case 0xC090: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC298: +case 0xC498: +case 0xC698: +case 0xC898: +case 0xCA98: +case 0xCC98: +case 0xCE98: +case 0xC099: +case 0xC299: +case 0xC499: +case 0xC699: +case 0xC899: +case 0xCA99: +case 0xCC99: +case 0xCE99: +case 0xC09A: +case 0xC29A: +case 0xC49A: +case 0xC69A: +case 0xC89A: +case 0xCA9A: +case 0xCC9A: +case 0xCE9A: +case 0xC09B: +case 0xC29B: +case 0xC49B: +case 0xC69B: +case 0xC89B: +case 0xCA9B: +case 0xCC9B: +case 0xCE9B: +case 0xC09C: +case 0xC29C: +case 0xC49C: +case 0xC69C: +case 0xC89C: +case 0xCA9C: +case 0xCC9C: +case 0xCE9C: +case 0xC09D: +case 0xC29D: +case 0xC49D: +case 0xC69D: +case 0xC89D: +case 0xCA9D: +case 0xCC9D: +case 0xCE9D: +case 0xC09E: +case 0xC29E: +case 0xC49E: +case 0xC69E: +case 0xC89E: +case 0xCA9E: +case 0xCC9E: +case 0xCE9E: + +// ANDaD +case 0xC098: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2A0: +case 0xC4A0: +case 0xC6A0: +case 0xC8A0: +case 0xCAA0: +case 0xCCA0: +case 0xCEA0: +case 0xC0A1: +case 0xC2A1: +case 0xC4A1: +case 0xC6A1: +case 0xC8A1: +case 0xCAA1: +case 0xCCA1: +case 0xCEA1: +case 0xC0A2: +case 0xC2A2: +case 0xC4A2: +case 0xC6A2: +case 0xC8A2: +case 0xCAA2: +case 0xCCA2: +case 0xCEA2: +case 0xC0A3: +case 0xC2A3: +case 0xC4A3: +case 0xC6A3: +case 0xC8A3: +case 0xCAA3: +case 0xCCA3: +case 0xCEA3: +case 0xC0A4: +case 0xC2A4: +case 0xC4A4: +case 0xC6A4: +case 0xC8A4: +case 0xCAA4: +case 0xCCA4: +case 0xCEA4: +case 0xC0A5: +case 0xC2A5: +case 0xC4A5: +case 0xC6A5: +case 0xC8A5: +case 0xCAA5: +case 0xCCA5: +case 0xCEA5: +case 0xC0A6: +case 0xC2A6: +case 0xC4A6: +case 0xC6A6: +case 0xC8A6: +case 0xCAA6: +case 0xCCA6: +case 0xCEA6: + +// ANDaD +case 0xC0A0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2A8: +case 0xC4A8: +case 0xC6A8: +case 0xC8A8: +case 0xCAA8: +case 0xCCA8: +case 0xCEA8: +case 0xC0A9: +case 0xC2A9: +case 0xC4A9: +case 0xC6A9: +case 0xC8A9: +case 0xCAA9: +case 0xCCA9: +case 0xCEA9: +case 0xC0AA: +case 0xC2AA: +case 0xC4AA: +case 0xC6AA: +case 0xC8AA: +case 0xCAAA: +case 0xCCAA: +case 0xCEAA: +case 0xC0AB: +case 0xC2AB: +case 0xC4AB: +case 0xC6AB: +case 0xC8AB: +case 0xCAAB: +case 0xCCAB: +case 0xCEAB: +case 0xC0AC: +case 0xC2AC: +case 0xC4AC: +case 0xC6AC: +case 0xC8AC: +case 0xCAAC: +case 0xCCAC: +case 0xCEAC: +case 0xC0AD: +case 0xC2AD: +case 0xC4AD: +case 0xC6AD: +case 0xC8AD: +case 0xCAAD: +case 0xCCAD: +case 0xCEAD: +case 0xC0AE: +case 0xC2AE: +case 0xC4AE: +case 0xC6AE: +case 0xC8AE: +case 0xCAAE: +case 0xCCAE: +case 0xCEAE: +case 0xC0AF: +case 0xC2AF: +case 0xC4AF: +case 0xC6AF: +case 0xC8AF: +case 0xCAAF: +case 0xCCAF: +case 0xCEAF: + +// ANDaD +case 0xC0A8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2B0: +case 0xC4B0: +case 0xC6B0: +case 0xC8B0: +case 0xCAB0: +case 0xCCB0: +case 0xCEB0: +case 0xC0B1: +case 0xC2B1: +case 0xC4B1: +case 0xC6B1: +case 0xC8B1: +case 0xCAB1: +case 0xCCB1: +case 0xCEB1: +case 0xC0B2: +case 0xC2B2: +case 0xC4B2: +case 0xC6B2: +case 0xC8B2: +case 0xCAB2: +case 0xCCB2: +case 0xCEB2: +case 0xC0B3: +case 0xC2B3: +case 0xC4B3: +case 0xC6B3: +case 0xC8B3: +case 0xCAB3: +case 0xCCB3: +case 0xCEB3: +case 0xC0B4: +case 0xC2B4: +case 0xC4B4: +case 0xC6B4: +case 0xC8B4: +case 0xCAB4: +case 0xCCB4: +case 0xCEB4: +case 0xC0B5: +case 0xC2B5: +case 0xC4B5: +case 0xC6B5: +case 0xC8B5: +case 0xCAB5: +case 0xCCB5: +case 0xCEB5: +case 0xC0B6: +case 0xC2B6: +case 0xC4B6: +case 0xC6B6: +case 0xC8B6: +case 0xCAB6: +case 0xCCB6: +case 0xCEB6: +case 0xC0B7: +case 0xC2B7: +case 0xC4B7: +case 0xC6B7: +case 0xC8B7: +case 0xCAB7: +case 0xCCB7: +case 0xCEB7: + +// ANDaD +case 0xC0B0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2B8: +case 0xC4B8: +case 0xC6B8: +case 0xC8B8: +case 0xCAB8: +case 0xCCB8: +case 0xCEB8: + +// ANDaD +case 0xC0B8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2B9: +case 0xC4B9: +case 0xC6B9: +case 0xC8B9: +case 0xCAB9: +case 0xCCB9: +case 0xCEB9: + +// ANDaD +case 0xC0B9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2BA: +case 0xC4BA: +case 0xC6BA: +case 0xC8BA: +case 0xCABA: +case 0xCCBA: +case 0xCEBA: + +// ANDaD +case 0xC0BA: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2BB: +case 0xC4BB: +case 0xC6BB: +case 0xC8BB: +case 0xCABB: +case 0xCCBB: +case 0xCEBB: + +// ANDaD +case 0xC0BB: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2BC: +case 0xC4BC: +case 0xC6BC: +case 0xC8BC: +case 0xCABC: +case 0xCCBC: +case 0xCEBC: + +// ANDaD +case 0xC0BC: +{ + u32 res; + u32 src; + src = FETCH_LONG; + PC += 4; + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(14) +case 0xC29F: +case 0xC49F: +case 0xC69F: +case 0xC89F: +case 0xCA9F: +case 0xCC9F: +case 0xCE9F: + +// ANDaD +case 0xC09F: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC2A7: +case 0xC4A7: +case 0xC6A7: +case 0xC8A7: +case 0xCAA7: +case 0xCCA7: +case 0xCEA7: + +// ANDaD +case 0xC0A7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + res = (u32)CPU->D[(Opcode >> 9) & 7]; + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xC310: +case 0xC510: +case 0xC710: +case 0xC910: +case 0xCB10: +case 0xCD10: +case 0xCF10: +case 0xC111: +case 0xC311: +case 0xC511: +case 0xC711: +case 0xC911: +case 0xCB11: +case 0xCD11: +case 0xCF11: +case 0xC112: +case 0xC312: +case 0xC512: +case 0xC712: +case 0xC912: +case 0xCB12: +case 0xCD12: +case 0xCF12: +case 0xC113: +case 0xC313: +case 0xC513: +case 0xC713: +case 0xC913: +case 0xCB13: +case 0xCD13: +case 0xCF13: +case 0xC114: +case 0xC314: +case 0xC514: +case 0xC714: +case 0xC914: +case 0xCB14: +case 0xCD14: +case 0xCF14: +case 0xC115: +case 0xC315: +case 0xC515: +case 0xC715: +case 0xC915: +case 0xCB15: +case 0xCD15: +case 0xCF15: +case 0xC116: +case 0xC316: +case 0xC516: +case 0xC716: +case 0xC916: +case 0xCB16: +case 0xCD16: +case 0xCF16: +case 0xC117: +case 0xC317: +case 0xC517: +case 0xC717: +case 0xC917: +case 0xCB17: +case 0xCD17: +case 0xCF17: + +// ANDDa +case 0xC110: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC318: +case 0xC518: +case 0xC718: +case 0xC918: +case 0xCB18: +case 0xCD18: +case 0xCF18: +case 0xC119: +case 0xC319: +case 0xC519: +case 0xC719: +case 0xC919: +case 0xCB19: +case 0xCD19: +case 0xCF19: +case 0xC11A: +case 0xC31A: +case 0xC51A: +case 0xC71A: +case 0xC91A: +case 0xCB1A: +case 0xCD1A: +case 0xCF1A: +case 0xC11B: +case 0xC31B: +case 0xC51B: +case 0xC71B: +case 0xC91B: +case 0xCB1B: +case 0xCD1B: +case 0xCF1B: +case 0xC11C: +case 0xC31C: +case 0xC51C: +case 0xC71C: +case 0xC91C: +case 0xCB1C: +case 0xCD1C: +case 0xCF1C: +case 0xC11D: +case 0xC31D: +case 0xC51D: +case 0xC71D: +case 0xC91D: +case 0xCB1D: +case 0xCD1D: +case 0xCF1D: +case 0xC11E: +case 0xC31E: +case 0xC51E: +case 0xC71E: +case 0xC91E: +case 0xCB1E: +case 0xCD1E: +case 0xCF1E: + +// ANDDa +case 0xC118: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC320: +case 0xC520: +case 0xC720: +case 0xC920: +case 0xCB20: +case 0xCD20: +case 0xCF20: +case 0xC121: +case 0xC321: +case 0xC521: +case 0xC721: +case 0xC921: +case 0xCB21: +case 0xCD21: +case 0xCF21: +case 0xC122: +case 0xC322: +case 0xC522: +case 0xC722: +case 0xC922: +case 0xCB22: +case 0xCD22: +case 0xCF22: +case 0xC123: +case 0xC323: +case 0xC523: +case 0xC723: +case 0xC923: +case 0xCB23: +case 0xCD23: +case 0xCF23: +case 0xC124: +case 0xC324: +case 0xC524: +case 0xC724: +case 0xC924: +case 0xCB24: +case 0xCD24: +case 0xCF24: +case 0xC125: +case 0xC325: +case 0xC525: +case 0xC725: +case 0xC925: +case 0xCB25: +case 0xCD25: +case 0xCF25: +case 0xC126: +case 0xC326: +case 0xC526: +case 0xC726: +case 0xC926: +case 0xCB26: +case 0xCD26: +case 0xCF26: + +// ANDDa +case 0xC120: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC328: +case 0xC528: +case 0xC728: +case 0xC928: +case 0xCB28: +case 0xCD28: +case 0xCF28: +case 0xC129: +case 0xC329: +case 0xC529: +case 0xC729: +case 0xC929: +case 0xCB29: +case 0xCD29: +case 0xCF29: +case 0xC12A: +case 0xC32A: +case 0xC52A: +case 0xC72A: +case 0xC92A: +case 0xCB2A: +case 0xCD2A: +case 0xCF2A: +case 0xC12B: +case 0xC32B: +case 0xC52B: +case 0xC72B: +case 0xC92B: +case 0xCB2B: +case 0xCD2B: +case 0xCF2B: +case 0xC12C: +case 0xC32C: +case 0xC52C: +case 0xC72C: +case 0xC92C: +case 0xCB2C: +case 0xCD2C: +case 0xCF2C: +case 0xC12D: +case 0xC32D: +case 0xC52D: +case 0xC72D: +case 0xC92D: +case 0xCB2D: +case 0xCD2D: +case 0xCF2D: +case 0xC12E: +case 0xC32E: +case 0xC52E: +case 0xC72E: +case 0xC92E: +case 0xCB2E: +case 0xCD2E: +case 0xCF2E: +case 0xC12F: +case 0xC32F: +case 0xC52F: +case 0xC72F: +case 0xC92F: +case 0xCB2F: +case 0xCD2F: +case 0xCF2F: + +// ANDDa +case 0xC128: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC330: +case 0xC530: +case 0xC730: +case 0xC930: +case 0xCB30: +case 0xCD30: +case 0xCF30: +case 0xC131: +case 0xC331: +case 0xC531: +case 0xC731: +case 0xC931: +case 0xCB31: +case 0xCD31: +case 0xCF31: +case 0xC132: +case 0xC332: +case 0xC532: +case 0xC732: +case 0xC932: +case 0xCB32: +case 0xCD32: +case 0xCF32: +case 0xC133: +case 0xC333: +case 0xC533: +case 0xC733: +case 0xC933: +case 0xCB33: +case 0xCD33: +case 0xCF33: +case 0xC134: +case 0xC334: +case 0xC534: +case 0xC734: +case 0xC934: +case 0xCB34: +case 0xCD34: +case 0xCF34: +case 0xC135: +case 0xC335: +case 0xC535: +case 0xC735: +case 0xC935: +case 0xCB35: +case 0xCD35: +case 0xCF35: +case 0xC136: +case 0xC336: +case 0xC536: +case 0xC736: +case 0xC936: +case 0xCB36: +case 0xCD36: +case 0xCF36: +case 0xC137: +case 0xC337: +case 0xC537: +case 0xC737: +case 0xC937: +case 0xCB37: +case 0xCD37: +case 0xCF37: + +// ANDDa +case 0xC130: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC338: +case 0xC538: +case 0xC738: +case 0xC938: +case 0xCB38: +case 0xCD38: +case 0xCF38: + +// ANDDa +case 0xC138: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC339: +case 0xC539: +case 0xC739: +case 0xC939: +case 0xCB39: +case 0xCD39: +case 0xCF39: + +// ANDDa +case 0xC139: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC31F: +case 0xC51F: +case 0xC71F: +case 0xC91F: +case 0xCB1F: +case 0xCD1F: +case 0xCF1F: + +// ANDDa +case 0xC11F: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC327: +case 0xC527: +case 0xC727: +case 0xC927: +case 0xCB27: +case 0xCD27: +case 0xCF27: + +// ANDDa +case 0xC127: +{ + u32 adr; + u32 res; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xC350: +case 0xC550: +case 0xC750: +case 0xC950: +case 0xCB50: +case 0xCD50: +case 0xCF50: +case 0xC151: +case 0xC351: +case 0xC551: +case 0xC751: +case 0xC951: +case 0xCB51: +case 0xCD51: +case 0xCF51: +case 0xC152: +case 0xC352: +case 0xC552: +case 0xC752: +case 0xC952: +case 0xCB52: +case 0xCD52: +case 0xCF52: +case 0xC153: +case 0xC353: +case 0xC553: +case 0xC753: +case 0xC953: +case 0xCB53: +case 0xCD53: +case 0xCF53: +case 0xC154: +case 0xC354: +case 0xC554: +case 0xC754: +case 0xC954: +case 0xCB54: +case 0xCD54: +case 0xCF54: +case 0xC155: +case 0xC355: +case 0xC555: +case 0xC755: +case 0xC955: +case 0xCB55: +case 0xCD55: +case 0xCF55: +case 0xC156: +case 0xC356: +case 0xC556: +case 0xC756: +case 0xC956: +case 0xCB56: +case 0xCD56: +case 0xCF56: +case 0xC157: +case 0xC357: +case 0xC557: +case 0xC757: +case 0xC957: +case 0xCB57: +case 0xCD57: +case 0xCF57: + +// ANDDa +case 0xC150: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC358: +case 0xC558: +case 0xC758: +case 0xC958: +case 0xCB58: +case 0xCD58: +case 0xCF58: +case 0xC159: +case 0xC359: +case 0xC559: +case 0xC759: +case 0xC959: +case 0xCB59: +case 0xCD59: +case 0xCF59: +case 0xC15A: +case 0xC35A: +case 0xC55A: +case 0xC75A: +case 0xC95A: +case 0xCB5A: +case 0xCD5A: +case 0xCF5A: +case 0xC15B: +case 0xC35B: +case 0xC55B: +case 0xC75B: +case 0xC95B: +case 0xCB5B: +case 0xCD5B: +case 0xCF5B: +case 0xC15C: +case 0xC35C: +case 0xC55C: +case 0xC75C: +case 0xC95C: +case 0xCB5C: +case 0xCD5C: +case 0xCF5C: +case 0xC15D: +case 0xC35D: +case 0xC55D: +case 0xC75D: +case 0xC95D: +case 0xCB5D: +case 0xCD5D: +case 0xCF5D: +case 0xC15E: +case 0xC35E: +case 0xC55E: +case 0xC75E: +case 0xC95E: +case 0xCB5E: +case 0xCD5E: +case 0xCF5E: + +// ANDDa +case 0xC158: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC360: +case 0xC560: +case 0xC760: +case 0xC960: +case 0xCB60: +case 0xCD60: +case 0xCF60: +case 0xC161: +case 0xC361: +case 0xC561: +case 0xC761: +case 0xC961: +case 0xCB61: +case 0xCD61: +case 0xCF61: +case 0xC162: +case 0xC362: +case 0xC562: +case 0xC762: +case 0xC962: +case 0xCB62: +case 0xCD62: +case 0xCF62: +case 0xC163: +case 0xC363: +case 0xC563: +case 0xC763: +case 0xC963: +case 0xCB63: +case 0xCD63: +case 0xCF63: +case 0xC164: +case 0xC364: +case 0xC564: +case 0xC764: +case 0xC964: +case 0xCB64: +case 0xCD64: +case 0xCF64: +case 0xC165: +case 0xC365: +case 0xC565: +case 0xC765: +case 0xC965: +case 0xCB65: +case 0xCD65: +case 0xCF65: +case 0xC166: +case 0xC366: +case 0xC566: +case 0xC766: +case 0xC966: +case 0xCB66: +case 0xCD66: +case 0xCF66: + +// ANDDa +case 0xC160: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC368: +case 0xC568: +case 0xC768: +case 0xC968: +case 0xCB68: +case 0xCD68: +case 0xCF68: +case 0xC169: +case 0xC369: +case 0xC569: +case 0xC769: +case 0xC969: +case 0xCB69: +case 0xCD69: +case 0xCF69: +case 0xC16A: +case 0xC36A: +case 0xC56A: +case 0xC76A: +case 0xC96A: +case 0xCB6A: +case 0xCD6A: +case 0xCF6A: +case 0xC16B: +case 0xC36B: +case 0xC56B: +case 0xC76B: +case 0xC96B: +case 0xCB6B: +case 0xCD6B: +case 0xCF6B: +case 0xC16C: +case 0xC36C: +case 0xC56C: +case 0xC76C: +case 0xC96C: +case 0xCB6C: +case 0xCD6C: +case 0xCF6C: +case 0xC16D: +case 0xC36D: +case 0xC56D: +case 0xC76D: +case 0xC96D: +case 0xCB6D: +case 0xCD6D: +case 0xCF6D: +case 0xC16E: +case 0xC36E: +case 0xC56E: +case 0xC76E: +case 0xC96E: +case 0xCB6E: +case 0xCD6E: +case 0xCF6E: +case 0xC16F: +case 0xC36F: +case 0xC56F: +case 0xC76F: +case 0xC96F: +case 0xCB6F: +case 0xCD6F: +case 0xCF6F: + +// ANDDa +case 0xC168: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC370: +case 0xC570: +case 0xC770: +case 0xC970: +case 0xCB70: +case 0xCD70: +case 0xCF70: +case 0xC171: +case 0xC371: +case 0xC571: +case 0xC771: +case 0xC971: +case 0xCB71: +case 0xCD71: +case 0xCF71: +case 0xC172: +case 0xC372: +case 0xC572: +case 0xC772: +case 0xC972: +case 0xCB72: +case 0xCD72: +case 0xCF72: +case 0xC173: +case 0xC373: +case 0xC573: +case 0xC773: +case 0xC973: +case 0xCB73: +case 0xCD73: +case 0xCF73: +case 0xC174: +case 0xC374: +case 0xC574: +case 0xC774: +case 0xC974: +case 0xCB74: +case 0xCD74: +case 0xCF74: +case 0xC175: +case 0xC375: +case 0xC575: +case 0xC775: +case 0xC975: +case 0xCB75: +case 0xCD75: +case 0xCF75: +case 0xC176: +case 0xC376: +case 0xC576: +case 0xC776: +case 0xC976: +case 0xCB76: +case 0xCD76: +case 0xCF76: +case 0xC177: +case 0xC377: +case 0xC577: +case 0xC777: +case 0xC977: +case 0xCB77: +case 0xCD77: +case 0xCF77: + +// ANDDa +case 0xC170: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC378: +case 0xC578: +case 0xC778: +case 0xC978: +case 0xCB78: +case 0xCD78: +case 0xCF78: + +// ANDDa +case 0xC178: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC379: +case 0xC579: +case 0xC779: +case 0xC979: +case 0xCB79: +case 0xCD79: +case 0xCF79: + +// ANDDa +case 0xC179: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC35F: +case 0xC55F: +case 0xC75F: +case 0xC95F: +case 0xCB5F: +case 0xCD5F: +case 0xCF5F: + +// ANDDa +case 0xC15F: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC367: +case 0xC567: +case 0xC767: +case 0xC967: +case 0xCB67: +case 0xCD67: +case 0xCF67: + +// ANDDa +case 0xC167: +{ + u32 adr; + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 8; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xC390: +case 0xC590: +case 0xC790: +case 0xC990: +case 0xCB90: +case 0xCD90: +case 0xCF90: +case 0xC191: +case 0xC391: +case 0xC591: +case 0xC791: +case 0xC991: +case 0xCB91: +case 0xCD91: +case 0xCF91: +case 0xC192: +case 0xC392: +case 0xC592: +case 0xC792: +case 0xC992: +case 0xCB92: +case 0xCD92: +case 0xCF92: +case 0xC193: +case 0xC393: +case 0xC593: +case 0xC793: +case 0xC993: +case 0xCB93: +case 0xCD93: +case 0xCF93: +case 0xC194: +case 0xC394: +case 0xC594: +case 0xC794: +case 0xC994: +case 0xCB94: +case 0xCD94: +case 0xCF94: +case 0xC195: +case 0xC395: +case 0xC595: +case 0xC795: +case 0xC995: +case 0xCB95: +case 0xCD95: +case 0xCF95: +case 0xC196: +case 0xC396: +case 0xC596: +case 0xC796: +case 0xC996: +case 0xCB96: +case 0xCD96: +case 0xCF96: +case 0xC197: +case 0xC397: +case 0xC597: +case 0xC797: +case 0xC997: +case 0xCB97: +case 0xCD97: +case 0xCF97: + +// ANDDa +case 0xC190: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC398: +case 0xC598: +case 0xC798: +case 0xC998: +case 0xCB98: +case 0xCD98: +case 0xCF98: +case 0xC199: +case 0xC399: +case 0xC599: +case 0xC799: +case 0xC999: +case 0xCB99: +case 0xCD99: +case 0xCF99: +case 0xC19A: +case 0xC39A: +case 0xC59A: +case 0xC79A: +case 0xC99A: +case 0xCB9A: +case 0xCD9A: +case 0xCF9A: +case 0xC19B: +case 0xC39B: +case 0xC59B: +case 0xC79B: +case 0xC99B: +case 0xCB9B: +case 0xCD9B: +case 0xCF9B: +case 0xC19C: +case 0xC39C: +case 0xC59C: +case 0xC79C: +case 0xC99C: +case 0xCB9C: +case 0xCD9C: +case 0xCF9C: +case 0xC19D: +case 0xC39D: +case 0xC59D: +case 0xC79D: +case 0xC99D: +case 0xCB9D: +case 0xCD9D: +case 0xCF9D: +case 0xC19E: +case 0xC39E: +case 0xC59E: +case 0xC79E: +case 0xC99E: +case 0xCB9E: +case 0xCD9E: +case 0xCF9E: + +// ANDDa +case 0xC198: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC3A0: +case 0xC5A0: +case 0xC7A0: +case 0xC9A0: +case 0xCBA0: +case 0xCDA0: +case 0xCFA0: +case 0xC1A1: +case 0xC3A1: +case 0xC5A1: +case 0xC7A1: +case 0xC9A1: +case 0xCBA1: +case 0xCDA1: +case 0xCFA1: +case 0xC1A2: +case 0xC3A2: +case 0xC5A2: +case 0xC7A2: +case 0xC9A2: +case 0xCBA2: +case 0xCDA2: +case 0xCFA2: +case 0xC1A3: +case 0xC3A3: +case 0xC5A3: +case 0xC7A3: +case 0xC9A3: +case 0xCBA3: +case 0xCDA3: +case 0xCFA3: +case 0xC1A4: +case 0xC3A4: +case 0xC5A4: +case 0xC7A4: +case 0xC9A4: +case 0xCBA4: +case 0xCDA4: +case 0xCFA4: +case 0xC1A5: +case 0xC3A5: +case 0xC5A5: +case 0xC7A5: +case 0xC9A5: +case 0xCBA5: +case 0xCDA5: +case 0xCFA5: +case 0xC1A6: +case 0xC3A6: +case 0xC5A6: +case 0xC7A6: +case 0xC9A6: +case 0xCBA6: +case 0xCDA6: +case 0xCFA6: + +// ANDDa +case 0xC1A0: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC3A8: +case 0xC5A8: +case 0xC7A8: +case 0xC9A8: +case 0xCBA8: +case 0xCDA8: +case 0xCFA8: +case 0xC1A9: +case 0xC3A9: +case 0xC5A9: +case 0xC7A9: +case 0xC9A9: +case 0xCBA9: +case 0xCDA9: +case 0xCFA9: +case 0xC1AA: +case 0xC3AA: +case 0xC5AA: +case 0xC7AA: +case 0xC9AA: +case 0xCBAA: +case 0xCDAA: +case 0xCFAA: +case 0xC1AB: +case 0xC3AB: +case 0xC5AB: +case 0xC7AB: +case 0xC9AB: +case 0xCBAB: +case 0xCDAB: +case 0xCFAB: +case 0xC1AC: +case 0xC3AC: +case 0xC5AC: +case 0xC7AC: +case 0xC9AC: +case 0xCBAC: +case 0xCDAC: +case 0xCFAC: +case 0xC1AD: +case 0xC3AD: +case 0xC5AD: +case 0xC7AD: +case 0xC9AD: +case 0xCBAD: +case 0xCDAD: +case 0xCFAD: +case 0xC1AE: +case 0xC3AE: +case 0xC5AE: +case 0xC7AE: +case 0xC9AE: +case 0xCBAE: +case 0xCDAE: +case 0xCFAE: +case 0xC1AF: +case 0xC3AF: +case 0xC5AF: +case 0xC7AF: +case 0xC9AF: +case 0xCBAF: +case 0xCDAF: +case 0xCFAF: + +// ANDDa +case 0xC1A8: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC3B0: +case 0xC5B0: +case 0xC7B0: +case 0xC9B0: +case 0xCBB0: +case 0xCDB0: +case 0xCFB0: +case 0xC1B1: +case 0xC3B1: +case 0xC5B1: +case 0xC7B1: +case 0xC9B1: +case 0xCBB1: +case 0xCDB1: +case 0xCFB1: +case 0xC1B2: +case 0xC3B2: +case 0xC5B2: +case 0xC7B2: +case 0xC9B2: +case 0xCBB2: +case 0xCDB2: +case 0xCFB2: +case 0xC1B3: +case 0xC3B3: +case 0xC5B3: +case 0xC7B3: +case 0xC9B3: +case 0xCBB3: +case 0xCDB3: +case 0xCFB3: +case 0xC1B4: +case 0xC3B4: +case 0xC5B4: +case 0xC7B4: +case 0xC9B4: +case 0xCBB4: +case 0xCDB4: +case 0xCFB4: +case 0xC1B5: +case 0xC3B5: +case 0xC5B5: +case 0xC7B5: +case 0xC9B5: +case 0xCBB5: +case 0xCDB5: +case 0xCFB5: +case 0xC1B6: +case 0xC3B6: +case 0xC5B6: +case 0xC7B6: +case 0xC9B6: +case 0xCBB6: +case 0xCDB6: +case 0xCFB6: +case 0xC1B7: +case 0xC3B7: +case 0xC5B7: +case 0xC7B7: +case 0xC9B7: +case 0xCBB7: +case 0xCDB7: +case 0xCFB7: + +// ANDDa +case 0xC1B0: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC3B8: +case 0xC5B8: +case 0xC7B8: +case 0xC9B8: +case 0xCBB8: +case 0xCDB8: +case 0xCFB8: + +// ANDDa +case 0xC1B8: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC3B9: +case 0xC5B9: +case 0xC7B9: +case 0xC9B9: +case 0xCBB9: +case 0xCDB9: +case 0xCFB9: + +// ANDDa +case 0xC1B9: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC39F: +case 0xC59F: +case 0xC79F: +case 0xC99F: +case 0xCB9F: +case 0xCD9F: +case 0xCF9F: + +// ANDDa +case 0xC19F: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC3A7: +case 0xC5A7: +case 0xC7A7: +case 0xC9A7: +case 0xCBA7: +case 0xCDA7: +case 0xCFA7: + +// ANDDa +case 0xC1A7: +{ + u32 adr; + u32 res; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, res) + res &= src; + CPU->flag_C = 0; + CPU->flag_V = 0; + CPU->flag_notZ = res; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xC300: +case 0xC500: +case 0xC700: +case 0xC900: +case 0xCB00: +case 0xCD00: +case 0xCF00: +case 0xC101: +case 0xC301: +case 0xC501: +case 0xC701: +case 0xC901: +case 0xCB01: +case 0xCD01: +case 0xCF01: +case 0xC102: +case 0xC302: +case 0xC502: +case 0xC702: +case 0xC902: +case 0xCB02: +case 0xCD02: +case 0xCF02: +case 0xC103: +case 0xC303: +case 0xC503: +case 0xC703: +case 0xC903: +case 0xCB03: +case 0xCD03: +case 0xCF03: +case 0xC104: +case 0xC304: +case 0xC504: +case 0xC704: +case 0xC904: +case 0xCB04: +case 0xCD04: +case 0xCF04: +case 0xC105: +case 0xC305: +case 0xC505: +case 0xC705: +case 0xC905: +case 0xCB05: +case 0xCD05: +case 0xCF05: +case 0xC106: +case 0xC306: +case 0xC506: +case 0xC706: +case 0xC906: +case 0xCB06: +case 0xCD06: +case 0xCF06: +case 0xC107: +case 0xC307: +case 0xC507: +case 0xC707: +case 0xC907: +case 0xCB07: +case 0xCD07: +case 0xCF07: + +// ABCD +case 0xC100: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = (dst & 0xF) + (src & 0xF) + ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res += 6; + res += (dst & 0xF0) + (src & 0xF0); + if (res > 0x99) + { + res -= 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0xC308: +case 0xC508: +case 0xC708: +case 0xC908: +case 0xCB08: +case 0xCD08: +case 0xC109: +case 0xC309: +case 0xC509: +case 0xC709: +case 0xC909: +case 0xCB09: +case 0xCD09: +case 0xC10A: +case 0xC30A: +case 0xC50A: +case 0xC70A: +case 0xC90A: +case 0xCB0A: +case 0xCD0A: +case 0xC10B: +case 0xC30B: +case 0xC50B: +case 0xC70B: +case 0xC90B: +case 0xCB0B: +case 0xCD0B: +case 0xC10C: +case 0xC30C: +case 0xC50C: +case 0xC70C: +case 0xC90C: +case 0xCB0C: +case 0xCD0C: +case 0xC10D: +case 0xC30D: +case 0xC50D: +case 0xC70D: +case 0xC90D: +case 0xCB0D: +case 0xCD0D: +case 0xC10E: +case 0xC30E: +case 0xC50E: +case 0xC70E: +case 0xC90E: +case 0xCB0E: +case 0xCD0E: + +// ABCDM +case 0xC108: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) + (src & 0xF) + ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res += 6; + res += (dst & 0xF0) + (src & 0xF0); + if (res > 0x99) + { + res -= 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0xC30F: +case 0xC50F: +case 0xC70F: +case 0xC90F: +case 0xCB0F: +case 0xCD0F: + +// ABCD7M +case 0xC10F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) + (src & 0xF) + ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res += 6; + res += (dst & 0xF0) + (src & 0xF0); + if (res > 0x99) + { + res -= 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0xCF09: +case 0xCF0A: +case 0xCF0B: +case 0xCF0C: +case 0xCF0D: +case 0xCF0E: + +// ABCDM7 +case 0xCF08: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) + (src & 0xF) + ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res += 6; + res += (dst & 0xF0) + (src & 0xF0); + if (res > 0x99) + { + res -= 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) + +// ABCD7M7 +case 0xCF0F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = (dst & 0xF) + (src & 0xF) + ((CPU->flag_X >> C68K_SR_X_SFT) & 1); + if (res > 9) res += 6; + res += (dst & 0xF0) + (src & 0xF0); + if (res > 0x99) + { + res -= 0xA0; + CPU->flag_X = CPU->flag_C = C68K_SR_C; + } + else CPU->flag_X = CPU->flag_C = 0; + CPU->flag_notZ |= res & 0xFF; + CPU->flag_N = res; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0xC2C0: +case 0xC4C0: +case 0xC6C0: +case 0xC8C0: +case 0xCAC0: +case 0xCCC0: +case 0xCEC0: +case 0xC0C1: +case 0xC2C1: +case 0xC4C1: +case 0xC6C1: +case 0xC8C1: +case 0xCAC1: +case 0xCCC1: +case 0xCEC1: +case 0xC0C2: +case 0xC2C2: +case 0xC4C2: +case 0xC6C2: +case 0xC8C2: +case 0xCAC2: +case 0xCCC2: +case 0xCEC2: +case 0xC0C3: +case 0xC2C3: +case 0xC4C3: +case 0xC6C3: +case 0xC8C3: +case 0xCAC3: +case 0xCCC3: +case 0xCEC3: +case 0xC0C4: +case 0xC2C4: +case 0xC4C4: +case 0xC6C4: +case 0xC8C4: +case 0xCAC4: +case 0xCCC4: +case 0xCEC4: +case 0xC0C5: +case 0xC2C5: +case 0xC4C5: +case 0xC6C5: +case 0xC8C5: +case 0xCAC5: +case 0xCCC5: +case 0xCEC5: +case 0xC0C6: +case 0xC2C6: +case 0xC4C6: +case 0xC6C6: +case 0xC8C6: +case 0xCAC6: +case 0xCCC6: +case 0xCEC6: +case 0xC0C7: +case 0xC2C7: +case 0xC4C7: +case 0xC6C7: +case 0xC8C7: +case 0xCAC7: +case 0xCCC7: +case 0xCEC7: + +// MULU +case 0xC0C0: +{ + u32 res; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2D0: +case 0xC4D0: +case 0xC6D0: +case 0xC8D0: +case 0xCAD0: +case 0xCCD0: +case 0xCED0: +case 0xC0D1: +case 0xC2D1: +case 0xC4D1: +case 0xC6D1: +case 0xC8D1: +case 0xCAD1: +case 0xCCD1: +case 0xCED1: +case 0xC0D2: +case 0xC2D2: +case 0xC4D2: +case 0xC6D2: +case 0xC8D2: +case 0xCAD2: +case 0xCCD2: +case 0xCED2: +case 0xC0D3: +case 0xC2D3: +case 0xC4D3: +case 0xC6D3: +case 0xC8D3: +case 0xCAD3: +case 0xCCD3: +case 0xCED3: +case 0xC0D4: +case 0xC2D4: +case 0xC4D4: +case 0xC6D4: +case 0xC8D4: +case 0xCAD4: +case 0xCCD4: +case 0xCED4: +case 0xC0D5: +case 0xC2D5: +case 0xC4D5: +case 0xC6D5: +case 0xC8D5: +case 0xCAD5: +case 0xCCD5: +case 0xCED5: +case 0xC0D6: +case 0xC2D6: +case 0xC4D6: +case 0xC6D6: +case 0xC8D6: +case 0xCAD6: +case 0xCCD6: +case 0xCED6: +case 0xC0D7: +case 0xC2D7: +case 0xC4D7: +case 0xC6D7: +case 0xC8D7: +case 0xCAD7: +case 0xCCD7: +case 0xCED7: + +// MULU +case 0xC0D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2D8: +case 0xC4D8: +case 0xC6D8: +case 0xC8D8: +case 0xCAD8: +case 0xCCD8: +case 0xCED8: +case 0xC0D9: +case 0xC2D9: +case 0xC4D9: +case 0xC6D9: +case 0xC8D9: +case 0xCAD9: +case 0xCCD9: +case 0xCED9: +case 0xC0DA: +case 0xC2DA: +case 0xC4DA: +case 0xC6DA: +case 0xC8DA: +case 0xCADA: +case 0xCCDA: +case 0xCEDA: +case 0xC0DB: +case 0xC2DB: +case 0xC4DB: +case 0xC6DB: +case 0xC8DB: +case 0xCADB: +case 0xCCDB: +case 0xCEDB: +case 0xC0DC: +case 0xC2DC: +case 0xC4DC: +case 0xC6DC: +case 0xC8DC: +case 0xCADC: +case 0xCCDC: +case 0xCEDC: +case 0xC0DD: +case 0xC2DD: +case 0xC4DD: +case 0xC6DD: +case 0xC8DD: +case 0xCADD: +case 0xCCDD: +case 0xCEDD: +case 0xC0DE: +case 0xC2DE: +case 0xC4DE: +case 0xC6DE: +case 0xC8DE: +case 0xCADE: +case 0xCCDE: +case 0xCEDE: + +// MULU +case 0xC0D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2E0: +case 0xC4E0: +case 0xC6E0: +case 0xC8E0: +case 0xCAE0: +case 0xCCE0: +case 0xCEE0: +case 0xC0E1: +case 0xC2E1: +case 0xC4E1: +case 0xC6E1: +case 0xC8E1: +case 0xCAE1: +case 0xCCE1: +case 0xCEE1: +case 0xC0E2: +case 0xC2E2: +case 0xC4E2: +case 0xC6E2: +case 0xC8E2: +case 0xCAE2: +case 0xCCE2: +case 0xCEE2: +case 0xC0E3: +case 0xC2E3: +case 0xC4E3: +case 0xC6E3: +case 0xC8E3: +case 0xCAE3: +case 0xCCE3: +case 0xCEE3: +case 0xC0E4: +case 0xC2E4: +case 0xC4E4: +case 0xC6E4: +case 0xC8E4: +case 0xCAE4: +case 0xCCE4: +case 0xCEE4: +case 0xC0E5: +case 0xC2E5: +case 0xC4E5: +case 0xC6E5: +case 0xC8E5: +case 0xCAE5: +case 0xCCE5: +case 0xCEE5: +case 0xC0E6: +case 0xC2E6: +case 0xC4E6: +case 0xC6E6: +case 0xC8E6: +case 0xCAE6: +case 0xCCE6: +case 0xCEE6: + +// MULU +case 0xC0E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2E8: +case 0xC4E8: +case 0xC6E8: +case 0xC8E8: +case 0xCAE8: +case 0xCCE8: +case 0xCEE8: +case 0xC0E9: +case 0xC2E9: +case 0xC4E9: +case 0xC6E9: +case 0xC8E9: +case 0xCAE9: +case 0xCCE9: +case 0xCEE9: +case 0xC0EA: +case 0xC2EA: +case 0xC4EA: +case 0xC6EA: +case 0xC8EA: +case 0xCAEA: +case 0xCCEA: +case 0xCEEA: +case 0xC0EB: +case 0xC2EB: +case 0xC4EB: +case 0xC6EB: +case 0xC8EB: +case 0xCAEB: +case 0xCCEB: +case 0xCEEB: +case 0xC0EC: +case 0xC2EC: +case 0xC4EC: +case 0xC6EC: +case 0xC8EC: +case 0xCAEC: +case 0xCCEC: +case 0xCEEC: +case 0xC0ED: +case 0xC2ED: +case 0xC4ED: +case 0xC6ED: +case 0xC8ED: +case 0xCAED: +case 0xCCED: +case 0xCEED: +case 0xC0EE: +case 0xC2EE: +case 0xC4EE: +case 0xC6EE: +case 0xC8EE: +case 0xCAEE: +case 0xCCEE: +case 0xCEEE: +case 0xC0EF: +case 0xC2EF: +case 0xC4EF: +case 0xC6EF: +case 0xC8EF: +case 0xCAEF: +case 0xCCEF: +case 0xCEEF: + +// MULU +case 0xC0E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2F0: +case 0xC4F0: +case 0xC6F0: +case 0xC8F0: +case 0xCAF0: +case 0xCCF0: +case 0xCEF0: +case 0xC0F1: +case 0xC2F1: +case 0xC4F1: +case 0xC6F1: +case 0xC8F1: +case 0xCAF1: +case 0xCCF1: +case 0xCEF1: +case 0xC0F2: +case 0xC2F2: +case 0xC4F2: +case 0xC6F2: +case 0xC8F2: +case 0xCAF2: +case 0xCCF2: +case 0xCEF2: +case 0xC0F3: +case 0xC2F3: +case 0xC4F3: +case 0xC6F3: +case 0xC8F3: +case 0xCAF3: +case 0xCCF3: +case 0xCEF3: +case 0xC0F4: +case 0xC2F4: +case 0xC4F4: +case 0xC6F4: +case 0xC8F4: +case 0xCAF4: +case 0xCCF4: +case 0xCEF4: +case 0xC0F5: +case 0xC2F5: +case 0xC4F5: +case 0xC6F5: +case 0xC8F5: +case 0xCAF5: +case 0xCCF5: +case 0xCEF5: +case 0xC0F6: +case 0xC2F6: +case 0xC4F6: +case 0xC6F6: +case 0xC8F6: +case 0xCAF6: +case 0xCCF6: +case 0xCEF6: +case 0xC0F7: +case 0xC2F7: +case 0xC4F7: +case 0xC6F7: +case 0xC8F7: +case 0xCAF7: +case 0xCCF7: +case 0xCEF7: + +// MULU +case 0xC0F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2F8: +case 0xC4F8: +case 0xC6F8: +case 0xC8F8: +case 0xCAF8: +case 0xCCF8: +case 0xCEF8: + +// MULU +case 0xC0F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2F9: +case 0xC4F9: +case 0xC6F9: +case 0xC8F9: +case 0xCAF9: +case 0xCCF9: +case 0xCEF9: + +// MULU +case 0xC0F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2FA: +case 0xC4FA: +case 0xC6FA: +case 0xC8FA: +case 0xCAFA: +case 0xCCFA: +case 0xCEFA: + +// MULU +case 0xC0FA: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2FB: +case 0xC4FB: +case 0xC6FB: +case 0xC8FB: +case 0xCAFB: +case 0xCCFB: +case 0xCEFB: + +// MULU +case 0xC0FB: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2FC: +case 0xC4FC: +case 0xC6FC: +case 0xC8FC: +case 0xCAFC: +case 0xCCFC: +case 0xCEFC: + +// MULU +case 0xC0FC: +{ + u32 res; + u32 src; + src = FETCH_WORD; + PC += 2; + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(54) +case 0xC2DF: +case 0xC4DF: +case 0xC6DF: +case 0xC8DF: +case 0xCADF: +case 0xCCDF: +case 0xCEDF: + +// MULU +case 0xC0DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC2E7: +case 0xC4E7: +case 0xC6E7: +case 0xC8E7: +case 0xCAE7: +case 0xCCE7: +case 0xCEE7: + +// MULU +case 0xC0E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + res = (u16)CPU->D[(Opcode >> 9) & 7]; + res *= src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3C0: +case 0xC5C0: +case 0xC7C0: +case 0xC9C0: +case 0xCBC0: +case 0xCDC0: +case 0xCFC0: +case 0xC1C1: +case 0xC3C1: +case 0xC5C1: +case 0xC7C1: +case 0xC9C1: +case 0xCBC1: +case 0xCDC1: +case 0xCFC1: +case 0xC1C2: +case 0xC3C2: +case 0xC5C2: +case 0xC7C2: +case 0xC9C2: +case 0xCBC2: +case 0xCDC2: +case 0xCFC2: +case 0xC1C3: +case 0xC3C3: +case 0xC5C3: +case 0xC7C3: +case 0xC9C3: +case 0xCBC3: +case 0xCDC3: +case 0xCFC3: +case 0xC1C4: +case 0xC3C4: +case 0xC5C4: +case 0xC7C4: +case 0xC9C4: +case 0xCBC4: +case 0xCDC4: +case 0xCFC4: +case 0xC1C5: +case 0xC3C5: +case 0xC5C5: +case 0xC7C5: +case 0xC9C5: +case 0xCBC5: +case 0xCDC5: +case 0xCFC5: +case 0xC1C6: +case 0xC3C6: +case 0xC5C6: +case 0xC7C6: +case 0xC9C6: +case 0xCBC6: +case 0xCDC6: +case 0xCFC6: +case 0xC1C7: +case 0xC3C7: +case 0xC5C7: +case 0xC7C7: +case 0xC9C7: +case 0xCBC7: +case 0xCDC7: +case 0xCFC7: + +// MULS +case 0xC1C0: +{ + u32 res; + u32 src; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3D0: +case 0xC5D0: +case 0xC7D0: +case 0xC9D0: +case 0xCBD0: +case 0xCDD0: +case 0xCFD0: +case 0xC1D1: +case 0xC3D1: +case 0xC5D1: +case 0xC7D1: +case 0xC9D1: +case 0xCBD1: +case 0xCDD1: +case 0xCFD1: +case 0xC1D2: +case 0xC3D2: +case 0xC5D2: +case 0xC7D2: +case 0xC9D2: +case 0xCBD2: +case 0xCDD2: +case 0xCFD2: +case 0xC1D3: +case 0xC3D3: +case 0xC5D3: +case 0xC7D3: +case 0xC9D3: +case 0xCBD3: +case 0xCDD3: +case 0xCFD3: +case 0xC1D4: +case 0xC3D4: +case 0xC5D4: +case 0xC7D4: +case 0xC9D4: +case 0xCBD4: +case 0xCDD4: +case 0xCFD4: +case 0xC1D5: +case 0xC3D5: +case 0xC5D5: +case 0xC7D5: +case 0xC9D5: +case 0xCBD5: +case 0xCDD5: +case 0xCFD5: +case 0xC1D6: +case 0xC3D6: +case 0xC5D6: +case 0xC7D6: +case 0xC9D6: +case 0xCBD6: +case 0xCDD6: +case 0xCFD6: +case 0xC1D7: +case 0xC3D7: +case 0xC5D7: +case 0xC7D7: +case 0xC9D7: +case 0xCBD7: +case 0xCDD7: +case 0xCFD7: + +// MULS +case 0xC1D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3D8: +case 0xC5D8: +case 0xC7D8: +case 0xC9D8: +case 0xCBD8: +case 0xCDD8: +case 0xCFD8: +case 0xC1D9: +case 0xC3D9: +case 0xC5D9: +case 0xC7D9: +case 0xC9D9: +case 0xCBD9: +case 0xCDD9: +case 0xCFD9: +case 0xC1DA: +case 0xC3DA: +case 0xC5DA: +case 0xC7DA: +case 0xC9DA: +case 0xCBDA: +case 0xCDDA: +case 0xCFDA: +case 0xC1DB: +case 0xC3DB: +case 0xC5DB: +case 0xC7DB: +case 0xC9DB: +case 0xCBDB: +case 0xCDDB: +case 0xCFDB: +case 0xC1DC: +case 0xC3DC: +case 0xC5DC: +case 0xC7DC: +case 0xC9DC: +case 0xCBDC: +case 0xCDDC: +case 0xCFDC: +case 0xC1DD: +case 0xC3DD: +case 0xC5DD: +case 0xC7DD: +case 0xC9DD: +case 0xCBDD: +case 0xCDDD: +case 0xCFDD: +case 0xC1DE: +case 0xC3DE: +case 0xC5DE: +case 0xC7DE: +case 0xC9DE: +case 0xCBDE: +case 0xCDDE: +case 0xCFDE: + +// MULS +case 0xC1D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3E0: +case 0xC5E0: +case 0xC7E0: +case 0xC9E0: +case 0xCBE0: +case 0xCDE0: +case 0xCFE0: +case 0xC1E1: +case 0xC3E1: +case 0xC5E1: +case 0xC7E1: +case 0xC9E1: +case 0xCBE1: +case 0xCDE1: +case 0xCFE1: +case 0xC1E2: +case 0xC3E2: +case 0xC5E2: +case 0xC7E2: +case 0xC9E2: +case 0xCBE2: +case 0xCDE2: +case 0xCFE2: +case 0xC1E3: +case 0xC3E3: +case 0xC5E3: +case 0xC7E3: +case 0xC9E3: +case 0xCBE3: +case 0xCDE3: +case 0xCFE3: +case 0xC1E4: +case 0xC3E4: +case 0xC5E4: +case 0xC7E4: +case 0xC9E4: +case 0xCBE4: +case 0xCDE4: +case 0xCFE4: +case 0xC1E5: +case 0xC3E5: +case 0xC5E5: +case 0xC7E5: +case 0xC9E5: +case 0xCBE5: +case 0xCDE5: +case 0xCFE5: +case 0xC1E6: +case 0xC3E6: +case 0xC5E6: +case 0xC7E6: +case 0xC9E6: +case 0xCBE6: +case 0xCDE6: +case 0xCFE6: + +// MULS +case 0xC1E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3E8: +case 0xC5E8: +case 0xC7E8: +case 0xC9E8: +case 0xCBE8: +case 0xCDE8: +case 0xCFE8: +case 0xC1E9: +case 0xC3E9: +case 0xC5E9: +case 0xC7E9: +case 0xC9E9: +case 0xCBE9: +case 0xCDE9: +case 0xCFE9: +case 0xC1EA: +case 0xC3EA: +case 0xC5EA: +case 0xC7EA: +case 0xC9EA: +case 0xCBEA: +case 0xCDEA: +case 0xCFEA: +case 0xC1EB: +case 0xC3EB: +case 0xC5EB: +case 0xC7EB: +case 0xC9EB: +case 0xCBEB: +case 0xCDEB: +case 0xCFEB: +case 0xC1EC: +case 0xC3EC: +case 0xC5EC: +case 0xC7EC: +case 0xC9EC: +case 0xCBEC: +case 0xCDEC: +case 0xCFEC: +case 0xC1ED: +case 0xC3ED: +case 0xC5ED: +case 0xC7ED: +case 0xC9ED: +case 0xCBED: +case 0xCDED: +case 0xCFED: +case 0xC1EE: +case 0xC3EE: +case 0xC5EE: +case 0xC7EE: +case 0xC9EE: +case 0xCBEE: +case 0xCDEE: +case 0xCFEE: +case 0xC1EF: +case 0xC3EF: +case 0xC5EF: +case 0xC7EF: +case 0xC9EF: +case 0xCBEF: +case 0xCDEF: +case 0xCFEF: + +// MULS +case 0xC1E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3F0: +case 0xC5F0: +case 0xC7F0: +case 0xC9F0: +case 0xCBF0: +case 0xCDF0: +case 0xCFF0: +case 0xC1F1: +case 0xC3F1: +case 0xC5F1: +case 0xC7F1: +case 0xC9F1: +case 0xCBF1: +case 0xCDF1: +case 0xCFF1: +case 0xC1F2: +case 0xC3F2: +case 0xC5F2: +case 0xC7F2: +case 0xC9F2: +case 0xCBF2: +case 0xCDF2: +case 0xCFF2: +case 0xC1F3: +case 0xC3F3: +case 0xC5F3: +case 0xC7F3: +case 0xC9F3: +case 0xCBF3: +case 0xCDF3: +case 0xCFF3: +case 0xC1F4: +case 0xC3F4: +case 0xC5F4: +case 0xC7F4: +case 0xC9F4: +case 0xCBF4: +case 0xCDF4: +case 0xCFF4: +case 0xC1F5: +case 0xC3F5: +case 0xC5F5: +case 0xC7F5: +case 0xC9F5: +case 0xCBF5: +case 0xCDF5: +case 0xCFF5: +case 0xC1F6: +case 0xC3F6: +case 0xC5F6: +case 0xC7F6: +case 0xC9F6: +case 0xCBF6: +case 0xCDF6: +case 0xCFF6: +case 0xC1F7: +case 0xC3F7: +case 0xC5F7: +case 0xC7F7: +case 0xC9F7: +case 0xCBF7: +case 0xCDF7: +case 0xCFF7: + +// MULS +case 0xC1F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3F8: +case 0xC5F8: +case 0xC7F8: +case 0xC9F8: +case 0xCBF8: +case 0xCDF8: +case 0xCFF8: + +// MULS +case 0xC1F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3F9: +case 0xC5F9: +case 0xC7F9: +case 0xC9F9: +case 0xCBF9: +case 0xCDF9: +case 0xCFF9: + +// MULS +case 0xC1F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3FA: +case 0xC5FA: +case 0xC7FA: +case 0xC9FA: +case 0xCBFA: +case 0xCDFA: +case 0xCFFA: + +// MULS +case 0xC1FA: +{ + u32 adr; + u32 res; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3FB: +case 0xC5FB: +case 0xC7FB: +case 0xC9FB: +case 0xCBFB: +case 0xCDFB: +case 0xCFFB: + +// MULS +case 0xC1FB: +{ + u32 adr; + u32 res; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3FC: +case 0xC5FC: +case 0xC7FC: +case 0xC9FC: +case 0xCBFC: +case 0xCDFC: +case 0xCFFC: + +// MULS +case 0xC1FC: +{ + u32 res; + u32 src; + src = (s32)(s16)FETCH_WORD; + PC += 2; + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(54) +case 0xC3DF: +case 0xC5DF: +case 0xC7DF: +case 0xC9DF: +case 0xCBDF: +case 0xCDDF: +case 0xCFDF: + +// MULS +case 0xC1DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC3E7: +case 0xC5E7: +case 0xC7E7: +case 0xC9E7: +case 0xCBE7: +case 0xCDE7: +case 0xCFE7: + +// MULS +case 0xC1E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READSX_WOat_F(adr, src) + res = (s32)(s16)CPU->D[(Opcode >> 9) & 7]; + res *= (s32)src; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + CPU->flag_V = CPU->flag_C = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(50) +case 0xC340: +case 0xC540: +case 0xC740: +case 0xC940: +case 0xCB40: +case 0xCD40: +case 0xCF40: +case 0xC141: +case 0xC341: +case 0xC541: +case 0xC741: +case 0xC941: +case 0xCB41: +case 0xCD41: +case 0xCF41: +case 0xC142: +case 0xC342: +case 0xC542: +case 0xC742: +case 0xC942: +case 0xCB42: +case 0xCD42: +case 0xCF42: +case 0xC143: +case 0xC343: +case 0xC543: +case 0xC743: +case 0xC943: +case 0xCB43: +case 0xCD43: +case 0xCF43: +case 0xC144: +case 0xC344: +case 0xC544: +case 0xC744: +case 0xC944: +case 0xCB44: +case 0xCD44: +case 0xCF44: +case 0xC145: +case 0xC345: +case 0xC545: +case 0xC745: +case 0xC945: +case 0xCB45: +case 0xCD45: +case 0xCF45: +case 0xC146: +case 0xC346: +case 0xC546: +case 0xC746: +case 0xC946: +case 0xCB46: +case 0xCD46: +case 0xCF46: +case 0xC147: +case 0xC347: +case 0xC547: +case 0xC747: +case 0xC947: +case 0xCB47: +case 0xCD47: +case 0xCF47: + +// EXGDD +case 0xC140: +{ + u32 res; + u32 src; + res = (u32)CPU->D[(Opcode >> 0) & 7]; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + res = src; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xC348: +case 0xC548: +case 0xC748: +case 0xC948: +case 0xCB48: +case 0xCD48: +case 0xCF48: +case 0xC149: +case 0xC349: +case 0xC549: +case 0xC749: +case 0xC949: +case 0xCB49: +case 0xCD49: +case 0xCF49: +case 0xC14A: +case 0xC34A: +case 0xC54A: +case 0xC74A: +case 0xC94A: +case 0xCB4A: +case 0xCD4A: +case 0xCF4A: +case 0xC14B: +case 0xC34B: +case 0xC54B: +case 0xC74B: +case 0xC94B: +case 0xCB4B: +case 0xCD4B: +case 0xCF4B: +case 0xC14C: +case 0xC34C: +case 0xC54C: +case 0xC74C: +case 0xC94C: +case 0xCB4C: +case 0xCD4C: +case 0xCF4C: +case 0xC14D: +case 0xC34D: +case 0xC54D: +case 0xC74D: +case 0xC94D: +case 0xCB4D: +case 0xCD4D: +case 0xCF4D: +case 0xC14E: +case 0xC34E: +case 0xC54E: +case 0xC74E: +case 0xC94E: +case 0xCB4E: +case 0xCD4E: +case 0xCF4E: +case 0xC14F: +case 0xC34F: +case 0xC54F: +case 0xC74F: +case 0xC94F: +case 0xCB4F: +case 0xCD4F: +case 0xCF4F: + +// EXGAA +case 0xC148: +{ + u32 res; + u32 src; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + src = (u32)CPU->A[(Opcode >> 9) & 7]; + CPU->A[(Opcode >> 9) & 7] = res; + res = src; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(6) +case 0xC388: +case 0xC588: +case 0xC788: +case 0xC988: +case 0xCB88: +case 0xCD88: +case 0xCF88: +case 0xC189: +case 0xC389: +case 0xC589: +case 0xC789: +case 0xC989: +case 0xCB89: +case 0xCD89: +case 0xCF89: +case 0xC18A: +case 0xC38A: +case 0xC58A: +case 0xC78A: +case 0xC98A: +case 0xCB8A: +case 0xCD8A: +case 0xCF8A: +case 0xC18B: +case 0xC38B: +case 0xC58B: +case 0xC78B: +case 0xC98B: +case 0xCB8B: +case 0xCD8B: +case 0xCF8B: +case 0xC18C: +case 0xC38C: +case 0xC58C: +case 0xC78C: +case 0xC98C: +case 0xCB8C: +case 0xCD8C: +case 0xCF8C: +case 0xC18D: +case 0xC38D: +case 0xC58D: +case 0xC78D: +case 0xC98D: +case 0xCB8D: +case 0xCD8D: +case 0xCF8D: +case 0xC18E: +case 0xC38E: +case 0xC58E: +case 0xC78E: +case 0xC98E: +case 0xCB8E: +case 0xCD8E: +case 0xCF8E: +case 0xC18F: +case 0xC38F: +case 0xC58F: +case 0xC78F: +case 0xC98F: +case 0xCB8F: +case 0xCD8F: +case 0xCF8F: + +// EXGAD +case 0xC188: +{ + u32 res; + u32 src; + res = (u32)CPU->A[(Opcode >> 0) & 7]; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); + res = src; + CPU->A[(Opcode >> 0) & 7] = res; +} +RET(6) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_opD.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_opD.inc new file mode 100644 index 0000000000..10e172e8c5 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_opD.inc @@ -0,0 +1,5855 @@ +case 0xD200: +case 0xD400: +case 0xD600: +case 0xD800: +case 0xDA00: +case 0xDC00: +case 0xDE00: +case 0xD001: +case 0xD201: +case 0xD401: +case 0xD601: +case 0xD801: +case 0xDA01: +case 0xDC01: +case 0xDE01: +case 0xD002: +case 0xD202: +case 0xD402: +case 0xD602: +case 0xD802: +case 0xDA02: +case 0xDC02: +case 0xDE02: +case 0xD003: +case 0xD203: +case 0xD403: +case 0xD603: +case 0xD803: +case 0xDA03: +case 0xDC03: +case 0xDE03: +case 0xD004: +case 0xD204: +case 0xD404: +case 0xD604: +case 0xD804: +case 0xDA04: +case 0xDC04: +case 0xDE04: +case 0xD005: +case 0xD205: +case 0xD405: +case 0xD605: +case 0xD805: +case 0xDA05: +case 0xDC05: +case 0xDE05: +case 0xD006: +case 0xD206: +case 0xD406: +case 0xD606: +case 0xD806: +case 0xDA06: +case 0xDC06: +case 0xDE06: +case 0xD007: +case 0xD207: +case 0xD407: +case 0xD607: +case 0xD807: +case 0xDA07: +case 0xDC07: +case 0xDE07: + +// ADDaD +case 0xD000: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD208: +case 0xD408: +case 0xD608: +case 0xD808: +case 0xDA08: +case 0xDC08: +case 0xDE08: +case 0xD009: +case 0xD209: +case 0xD409: +case 0xD609: +case 0xD809: +case 0xDA09: +case 0xDC09: +case 0xDE09: +case 0xD00A: +case 0xD20A: +case 0xD40A: +case 0xD60A: +case 0xD80A: +case 0xDA0A: +case 0xDC0A: +case 0xDE0A: +case 0xD00B: +case 0xD20B: +case 0xD40B: +case 0xD60B: +case 0xD80B: +case 0xDA0B: +case 0xDC0B: +case 0xDE0B: +case 0xD00C: +case 0xD20C: +case 0xD40C: +case 0xD60C: +case 0xD80C: +case 0xDA0C: +case 0xDC0C: +case 0xDE0C: +case 0xD00D: +case 0xD20D: +case 0xD40D: +case 0xD60D: +case 0xD80D: +case 0xDA0D: +case 0xDC0D: +case 0xDE0D: +case 0xD00E: +case 0xD20E: +case 0xD40E: +case 0xD60E: +case 0xD80E: +case 0xDA0E: +case 0xDC0E: +case 0xDE0E: +case 0xD00F: +case 0xD20F: +case 0xD40F: +case 0xD60F: +case 0xD80F: +case 0xDA0F: +case 0xDC0F: +case 0xDE0F: + +// ADDaD +case 0xD008: +{ + u32 res; + u32 dst; + u32 src; + // can't read byte from Ax registers ! + CPU->Status |= C68K_FAULTED; + goto C68k_Exec_Really_End; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD210: +case 0xD410: +case 0xD610: +case 0xD810: +case 0xDA10: +case 0xDC10: +case 0xDE10: +case 0xD011: +case 0xD211: +case 0xD411: +case 0xD611: +case 0xD811: +case 0xDA11: +case 0xDC11: +case 0xDE11: +case 0xD012: +case 0xD212: +case 0xD412: +case 0xD612: +case 0xD812: +case 0xDA12: +case 0xDC12: +case 0xDE12: +case 0xD013: +case 0xD213: +case 0xD413: +case 0xD613: +case 0xD813: +case 0xDA13: +case 0xDC13: +case 0xDE13: +case 0xD014: +case 0xD214: +case 0xD414: +case 0xD614: +case 0xD814: +case 0xDA14: +case 0xDC14: +case 0xDE14: +case 0xD015: +case 0xD215: +case 0xD415: +case 0xD615: +case 0xD815: +case 0xDA15: +case 0xDC15: +case 0xDE15: +case 0xD016: +case 0xD216: +case 0xD416: +case 0xD616: +case 0xD816: +case 0xDA16: +case 0xDC16: +case 0xDE16: +case 0xD017: +case 0xD217: +case 0xD417: +case 0xD617: +case 0xD817: +case 0xDA17: +case 0xDC17: +case 0xDE17: + +// ADDaD +case 0xD010: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD218: +case 0xD418: +case 0xD618: +case 0xD818: +case 0xDA18: +case 0xDC18: +case 0xDE18: +case 0xD019: +case 0xD219: +case 0xD419: +case 0xD619: +case 0xD819: +case 0xDA19: +case 0xDC19: +case 0xDE19: +case 0xD01A: +case 0xD21A: +case 0xD41A: +case 0xD61A: +case 0xD81A: +case 0xDA1A: +case 0xDC1A: +case 0xDE1A: +case 0xD01B: +case 0xD21B: +case 0xD41B: +case 0xD61B: +case 0xD81B: +case 0xDA1B: +case 0xDC1B: +case 0xDE1B: +case 0xD01C: +case 0xD21C: +case 0xD41C: +case 0xD61C: +case 0xD81C: +case 0xDA1C: +case 0xDC1C: +case 0xDE1C: +case 0xD01D: +case 0xD21D: +case 0xD41D: +case 0xD61D: +case 0xD81D: +case 0xDA1D: +case 0xDC1D: +case 0xDE1D: +case 0xD01E: +case 0xD21E: +case 0xD41E: +case 0xD61E: +case 0xD81E: +case 0xDA1E: +case 0xDC1E: +case 0xDE1E: + +// ADDaD +case 0xD018: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD220: +case 0xD420: +case 0xD620: +case 0xD820: +case 0xDA20: +case 0xDC20: +case 0xDE20: +case 0xD021: +case 0xD221: +case 0xD421: +case 0xD621: +case 0xD821: +case 0xDA21: +case 0xDC21: +case 0xDE21: +case 0xD022: +case 0xD222: +case 0xD422: +case 0xD622: +case 0xD822: +case 0xDA22: +case 0xDC22: +case 0xDE22: +case 0xD023: +case 0xD223: +case 0xD423: +case 0xD623: +case 0xD823: +case 0xDA23: +case 0xDC23: +case 0xDE23: +case 0xD024: +case 0xD224: +case 0xD424: +case 0xD624: +case 0xD824: +case 0xDA24: +case 0xDC24: +case 0xDE24: +case 0xD025: +case 0xD225: +case 0xD425: +case 0xD625: +case 0xD825: +case 0xDA25: +case 0xDC25: +case 0xDE25: +case 0xD026: +case 0xD226: +case 0xD426: +case 0xD626: +case 0xD826: +case 0xDA26: +case 0xDC26: +case 0xDE26: + +// ADDaD +case 0xD020: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD228: +case 0xD428: +case 0xD628: +case 0xD828: +case 0xDA28: +case 0xDC28: +case 0xDE28: +case 0xD029: +case 0xD229: +case 0xD429: +case 0xD629: +case 0xD829: +case 0xDA29: +case 0xDC29: +case 0xDE29: +case 0xD02A: +case 0xD22A: +case 0xD42A: +case 0xD62A: +case 0xD82A: +case 0xDA2A: +case 0xDC2A: +case 0xDE2A: +case 0xD02B: +case 0xD22B: +case 0xD42B: +case 0xD62B: +case 0xD82B: +case 0xDA2B: +case 0xDC2B: +case 0xDE2B: +case 0xD02C: +case 0xD22C: +case 0xD42C: +case 0xD62C: +case 0xD82C: +case 0xDA2C: +case 0xDC2C: +case 0xDE2C: +case 0xD02D: +case 0xD22D: +case 0xD42D: +case 0xD62D: +case 0xD82D: +case 0xDA2D: +case 0xDC2D: +case 0xDE2D: +case 0xD02E: +case 0xD22E: +case 0xD42E: +case 0xD62E: +case 0xD82E: +case 0xDA2E: +case 0xDC2E: +case 0xDE2E: +case 0xD02F: +case 0xD22F: +case 0xD42F: +case 0xD62F: +case 0xD82F: +case 0xDA2F: +case 0xDC2F: +case 0xDE2F: + +// ADDaD +case 0xD028: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD230: +case 0xD430: +case 0xD630: +case 0xD830: +case 0xDA30: +case 0xDC30: +case 0xDE30: +case 0xD031: +case 0xD231: +case 0xD431: +case 0xD631: +case 0xD831: +case 0xDA31: +case 0xDC31: +case 0xDE31: +case 0xD032: +case 0xD232: +case 0xD432: +case 0xD632: +case 0xD832: +case 0xDA32: +case 0xDC32: +case 0xDE32: +case 0xD033: +case 0xD233: +case 0xD433: +case 0xD633: +case 0xD833: +case 0xDA33: +case 0xDC33: +case 0xDE33: +case 0xD034: +case 0xD234: +case 0xD434: +case 0xD634: +case 0xD834: +case 0xDA34: +case 0xDC34: +case 0xDE34: +case 0xD035: +case 0xD235: +case 0xD435: +case 0xD635: +case 0xD835: +case 0xDA35: +case 0xDC35: +case 0xDE35: +case 0xD036: +case 0xD236: +case 0xD436: +case 0xD636: +case 0xD836: +case 0xDA36: +case 0xDC36: +case 0xDE36: +case 0xD037: +case 0xD237: +case 0xD437: +case 0xD637: +case 0xD837: +case 0xDA37: +case 0xDC37: +case 0xDE37: + +// ADDaD +case 0xD030: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD238: +case 0xD438: +case 0xD638: +case 0xD838: +case 0xDA38: +case 0xDC38: +case 0xDE38: + +// ADDaD +case 0xD038: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD239: +case 0xD439: +case 0xD639: +case 0xD839: +case 0xDA39: +case 0xDC39: +case 0xDE39: + +// ADDaD +case 0xD039: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD23A: +case 0xD43A: +case 0xD63A: +case 0xD83A: +case 0xDA3A: +case 0xDC3A: +case 0xDE3A: + +// ADDaD +case 0xD03A: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD23B: +case 0xD43B: +case 0xD63B: +case 0xD83B: +case 0xDA3B: +case 0xDC3B: +case 0xDE3B: + +// ADDaD +case 0xD03B: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD23C: +case 0xD43C: +case 0xD63C: +case 0xD83C: +case 0xDA3C: +case 0xDC3C: +case 0xDE3C: + +// ADDaD +case 0xD03C: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_BYTE; + PC += 2; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0xD21F: +case 0xD41F: +case 0xD61F: +case 0xD81F: +case 0xDA1F: +case 0xDC1F: +case 0xDE1F: + +// ADDaD +case 0xD01F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD227: +case 0xD427: +case 0xD627: +case 0xD827: +case 0xDA27: +case 0xDC27: +case 0xDE27: + +// ADDaD +case 0xD027: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD240: +case 0xD440: +case 0xD640: +case 0xD840: +case 0xDA40: +case 0xDC40: +case 0xDE40: +case 0xD041: +case 0xD241: +case 0xD441: +case 0xD641: +case 0xD841: +case 0xDA41: +case 0xDC41: +case 0xDE41: +case 0xD042: +case 0xD242: +case 0xD442: +case 0xD642: +case 0xD842: +case 0xDA42: +case 0xDC42: +case 0xDE42: +case 0xD043: +case 0xD243: +case 0xD443: +case 0xD643: +case 0xD843: +case 0xDA43: +case 0xDC43: +case 0xDE43: +case 0xD044: +case 0xD244: +case 0xD444: +case 0xD644: +case 0xD844: +case 0xDA44: +case 0xDC44: +case 0xDE44: +case 0xD045: +case 0xD245: +case 0xD445: +case 0xD645: +case 0xD845: +case 0xDA45: +case 0xDC45: +case 0xDE45: +case 0xD046: +case 0xD246: +case 0xD446: +case 0xD646: +case 0xD846: +case 0xDA46: +case 0xDC46: +case 0xDE46: +case 0xD047: +case 0xD247: +case 0xD447: +case 0xD647: +case 0xD847: +case 0xDA47: +case 0xDC47: +case 0xDE47: + +// ADDaD +case 0xD040: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD248: +case 0xD448: +case 0xD648: +case 0xD848: +case 0xDA48: +case 0xDC48: +case 0xDE48: +case 0xD049: +case 0xD249: +case 0xD449: +case 0xD649: +case 0xD849: +case 0xDA49: +case 0xDC49: +case 0xDE49: +case 0xD04A: +case 0xD24A: +case 0xD44A: +case 0xD64A: +case 0xD84A: +case 0xDA4A: +case 0xDC4A: +case 0xDE4A: +case 0xD04B: +case 0xD24B: +case 0xD44B: +case 0xD64B: +case 0xD84B: +case 0xDA4B: +case 0xDC4B: +case 0xDE4B: +case 0xD04C: +case 0xD24C: +case 0xD44C: +case 0xD64C: +case 0xD84C: +case 0xDA4C: +case 0xDC4C: +case 0xDE4C: +case 0xD04D: +case 0xD24D: +case 0xD44D: +case 0xD64D: +case 0xD84D: +case 0xDA4D: +case 0xDC4D: +case 0xDE4D: +case 0xD04E: +case 0xD24E: +case 0xD44E: +case 0xD64E: +case 0xD84E: +case 0xDA4E: +case 0xDC4E: +case 0xDE4E: +case 0xD04F: +case 0xD24F: +case 0xD44F: +case 0xD64F: +case 0xD84F: +case 0xDA4F: +case 0xDC4F: +case 0xDE4F: + +// ADDaD +case 0xD048: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->A[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD250: +case 0xD450: +case 0xD650: +case 0xD850: +case 0xDA50: +case 0xDC50: +case 0xDE50: +case 0xD051: +case 0xD251: +case 0xD451: +case 0xD651: +case 0xD851: +case 0xDA51: +case 0xDC51: +case 0xDE51: +case 0xD052: +case 0xD252: +case 0xD452: +case 0xD652: +case 0xD852: +case 0xDA52: +case 0xDC52: +case 0xDE52: +case 0xD053: +case 0xD253: +case 0xD453: +case 0xD653: +case 0xD853: +case 0xDA53: +case 0xDC53: +case 0xDE53: +case 0xD054: +case 0xD254: +case 0xD454: +case 0xD654: +case 0xD854: +case 0xDA54: +case 0xDC54: +case 0xDE54: +case 0xD055: +case 0xD255: +case 0xD455: +case 0xD655: +case 0xD855: +case 0xDA55: +case 0xDC55: +case 0xDE55: +case 0xD056: +case 0xD256: +case 0xD456: +case 0xD656: +case 0xD856: +case 0xDA56: +case 0xDC56: +case 0xDE56: +case 0xD057: +case 0xD257: +case 0xD457: +case 0xD657: +case 0xD857: +case 0xDA57: +case 0xDC57: +case 0xDE57: + +// ADDaD +case 0xD050: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD258: +case 0xD458: +case 0xD658: +case 0xD858: +case 0xDA58: +case 0xDC58: +case 0xDE58: +case 0xD059: +case 0xD259: +case 0xD459: +case 0xD659: +case 0xD859: +case 0xDA59: +case 0xDC59: +case 0xDE59: +case 0xD05A: +case 0xD25A: +case 0xD45A: +case 0xD65A: +case 0xD85A: +case 0xDA5A: +case 0xDC5A: +case 0xDE5A: +case 0xD05B: +case 0xD25B: +case 0xD45B: +case 0xD65B: +case 0xD85B: +case 0xDA5B: +case 0xDC5B: +case 0xDE5B: +case 0xD05C: +case 0xD25C: +case 0xD45C: +case 0xD65C: +case 0xD85C: +case 0xDA5C: +case 0xDC5C: +case 0xDE5C: +case 0xD05D: +case 0xD25D: +case 0xD45D: +case 0xD65D: +case 0xD85D: +case 0xDA5D: +case 0xDC5D: +case 0xDE5D: +case 0xD05E: +case 0xD25E: +case 0xD45E: +case 0xD65E: +case 0xD85E: +case 0xDA5E: +case 0xDC5E: +case 0xDE5E: + +// ADDaD +case 0xD058: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD260: +case 0xD460: +case 0xD660: +case 0xD860: +case 0xDA60: +case 0xDC60: +case 0xDE60: +case 0xD061: +case 0xD261: +case 0xD461: +case 0xD661: +case 0xD861: +case 0xDA61: +case 0xDC61: +case 0xDE61: +case 0xD062: +case 0xD262: +case 0xD462: +case 0xD662: +case 0xD862: +case 0xDA62: +case 0xDC62: +case 0xDE62: +case 0xD063: +case 0xD263: +case 0xD463: +case 0xD663: +case 0xD863: +case 0xDA63: +case 0xDC63: +case 0xDE63: +case 0xD064: +case 0xD264: +case 0xD464: +case 0xD664: +case 0xD864: +case 0xDA64: +case 0xDC64: +case 0xDE64: +case 0xD065: +case 0xD265: +case 0xD465: +case 0xD665: +case 0xD865: +case 0xDA65: +case 0xDC65: +case 0xDE65: +case 0xD066: +case 0xD266: +case 0xD466: +case 0xD666: +case 0xD866: +case 0xDA66: +case 0xDC66: +case 0xDE66: + +// ADDaD +case 0xD060: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD268: +case 0xD468: +case 0xD668: +case 0xD868: +case 0xDA68: +case 0xDC68: +case 0xDE68: +case 0xD069: +case 0xD269: +case 0xD469: +case 0xD669: +case 0xD869: +case 0xDA69: +case 0xDC69: +case 0xDE69: +case 0xD06A: +case 0xD26A: +case 0xD46A: +case 0xD66A: +case 0xD86A: +case 0xDA6A: +case 0xDC6A: +case 0xDE6A: +case 0xD06B: +case 0xD26B: +case 0xD46B: +case 0xD66B: +case 0xD86B: +case 0xDA6B: +case 0xDC6B: +case 0xDE6B: +case 0xD06C: +case 0xD26C: +case 0xD46C: +case 0xD66C: +case 0xD86C: +case 0xDA6C: +case 0xDC6C: +case 0xDE6C: +case 0xD06D: +case 0xD26D: +case 0xD46D: +case 0xD66D: +case 0xD86D: +case 0xDA6D: +case 0xDC6D: +case 0xDE6D: +case 0xD06E: +case 0xD26E: +case 0xD46E: +case 0xD66E: +case 0xD86E: +case 0xDA6E: +case 0xDC6E: +case 0xDE6E: +case 0xD06F: +case 0xD26F: +case 0xD46F: +case 0xD66F: +case 0xD86F: +case 0xDA6F: +case 0xDC6F: +case 0xDE6F: + +// ADDaD +case 0xD068: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD270: +case 0xD470: +case 0xD670: +case 0xD870: +case 0xDA70: +case 0xDC70: +case 0xDE70: +case 0xD071: +case 0xD271: +case 0xD471: +case 0xD671: +case 0xD871: +case 0xDA71: +case 0xDC71: +case 0xDE71: +case 0xD072: +case 0xD272: +case 0xD472: +case 0xD672: +case 0xD872: +case 0xDA72: +case 0xDC72: +case 0xDE72: +case 0xD073: +case 0xD273: +case 0xD473: +case 0xD673: +case 0xD873: +case 0xDA73: +case 0xDC73: +case 0xDE73: +case 0xD074: +case 0xD274: +case 0xD474: +case 0xD674: +case 0xD874: +case 0xDA74: +case 0xDC74: +case 0xDE74: +case 0xD075: +case 0xD275: +case 0xD475: +case 0xD675: +case 0xD875: +case 0xDA75: +case 0xDC75: +case 0xDE75: +case 0xD076: +case 0xD276: +case 0xD476: +case 0xD676: +case 0xD876: +case 0xDA76: +case 0xDC76: +case 0xDE76: +case 0xD077: +case 0xD277: +case 0xD477: +case 0xD677: +case 0xD877: +case 0xDA77: +case 0xDC77: +case 0xDE77: + +// ADDaD +case 0xD070: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD278: +case 0xD478: +case 0xD678: +case 0xD878: +case 0xDA78: +case 0xDC78: +case 0xDE78: + +// ADDaD +case 0xD078: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD279: +case 0xD479: +case 0xD679: +case 0xD879: +case 0xDA79: +case 0xDC79: +case 0xDE79: + +// ADDaD +case 0xD079: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD27A: +case 0xD47A: +case 0xD67A: +case 0xD87A: +case 0xDA7A: +case 0xDC7A: +case 0xDE7A: + +// ADDaD +case 0xD07A: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD27B: +case 0xD47B: +case 0xD67B: +case 0xD87B: +case 0xDA7B: +case 0xDC7B: +case 0xDE7B: + +// ADDaD +case 0xD07B: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD27C: +case 0xD47C: +case 0xD67C: +case 0xD87C: +case 0xDA7C: +case 0xDC7C: +case 0xDE7C: + +// ADDaD +case 0xD07C: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_WORD; + PC += 2; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0xD25F: +case 0xD45F: +case 0xD65F: +case 0xD85F: +case 0xDA5F: +case 0xDC5F: +case 0xDE5F: + +// ADDaD +case 0xD05F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD267: +case 0xD467: +case 0xD667: +case 0xD867: +case 0xDA67: +case 0xDC67: +case 0xDE67: + +// ADDaD +case 0xD067: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD280: +case 0xD480: +case 0xD680: +case 0xD880: +case 0xDA80: +case 0xDC80: +case 0xDE80: +case 0xD081: +case 0xD281: +case 0xD481: +case 0xD681: +case 0xD881: +case 0xDA81: +case 0xDC81: +case 0xDE81: +case 0xD082: +case 0xD282: +case 0xD482: +case 0xD682: +case 0xD882: +case 0xDA82: +case 0xDC82: +case 0xDE82: +case 0xD083: +case 0xD283: +case 0xD483: +case 0xD683: +case 0xD883: +case 0xDA83: +case 0xDC83: +case 0xDE83: +case 0xD084: +case 0xD284: +case 0xD484: +case 0xD684: +case 0xD884: +case 0xDA84: +case 0xDC84: +case 0xDE84: +case 0xD085: +case 0xD285: +case 0xD485: +case 0xD685: +case 0xD885: +case 0xDA85: +case 0xDC85: +case 0xDE85: +case 0xD086: +case 0xD286: +case 0xD486: +case 0xD686: +case 0xD886: +case 0xDA86: +case 0xDC86: +case 0xDE86: +case 0xD087: +case 0xD287: +case 0xD487: +case 0xD687: +case 0xD887: +case 0xDA87: +case 0xDC87: +case 0xDE87: + +// ADDaD +case 0xD080: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0xD288: +case 0xD488: +case 0xD688: +case 0xD888: +case 0xDA88: +case 0xDC88: +case 0xDE88: +case 0xD089: +case 0xD289: +case 0xD489: +case 0xD689: +case 0xD889: +case 0xDA89: +case 0xDC89: +case 0xDE89: +case 0xD08A: +case 0xD28A: +case 0xD48A: +case 0xD68A: +case 0xD88A: +case 0xDA8A: +case 0xDC8A: +case 0xDE8A: +case 0xD08B: +case 0xD28B: +case 0xD48B: +case 0xD68B: +case 0xD88B: +case 0xDA8B: +case 0xDC8B: +case 0xDE8B: +case 0xD08C: +case 0xD28C: +case 0xD48C: +case 0xD68C: +case 0xD88C: +case 0xDA8C: +case 0xDC8C: +case 0xDE8C: +case 0xD08D: +case 0xD28D: +case 0xD48D: +case 0xD68D: +case 0xD88D: +case 0xDA8D: +case 0xDC8D: +case 0xDE8D: +case 0xD08E: +case 0xD28E: +case 0xD48E: +case 0xD68E: +case 0xD88E: +case 0xDA8E: +case 0xDC8E: +case 0xDE8E: +case 0xD08F: +case 0xD28F: +case 0xD48F: +case 0xD68F: +case 0xD88F: +case 0xDA8F: +case 0xDC8F: +case 0xDE8F: + +// ADDaD +case 0xD088: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(6) +case 0xD290: +case 0xD490: +case 0xD690: +case 0xD890: +case 0xDA90: +case 0xDC90: +case 0xDE90: +case 0xD091: +case 0xD291: +case 0xD491: +case 0xD691: +case 0xD891: +case 0xDA91: +case 0xDC91: +case 0xDE91: +case 0xD092: +case 0xD292: +case 0xD492: +case 0xD692: +case 0xD892: +case 0xDA92: +case 0xDC92: +case 0xDE92: +case 0xD093: +case 0xD293: +case 0xD493: +case 0xD693: +case 0xD893: +case 0xDA93: +case 0xDC93: +case 0xDE93: +case 0xD094: +case 0xD294: +case 0xD494: +case 0xD694: +case 0xD894: +case 0xDA94: +case 0xDC94: +case 0xDE94: +case 0xD095: +case 0xD295: +case 0xD495: +case 0xD695: +case 0xD895: +case 0xDA95: +case 0xDC95: +case 0xDE95: +case 0xD096: +case 0xD296: +case 0xD496: +case 0xD696: +case 0xD896: +case 0xDA96: +case 0xDC96: +case 0xDE96: +case 0xD097: +case 0xD297: +case 0xD497: +case 0xD697: +case 0xD897: +case 0xDA97: +case 0xDC97: +case 0xDE97: + +// ADDaD +case 0xD090: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD298: +case 0xD498: +case 0xD698: +case 0xD898: +case 0xDA98: +case 0xDC98: +case 0xDE98: +case 0xD099: +case 0xD299: +case 0xD499: +case 0xD699: +case 0xD899: +case 0xDA99: +case 0xDC99: +case 0xDE99: +case 0xD09A: +case 0xD29A: +case 0xD49A: +case 0xD69A: +case 0xD89A: +case 0xDA9A: +case 0xDC9A: +case 0xDE9A: +case 0xD09B: +case 0xD29B: +case 0xD49B: +case 0xD69B: +case 0xD89B: +case 0xDA9B: +case 0xDC9B: +case 0xDE9B: +case 0xD09C: +case 0xD29C: +case 0xD49C: +case 0xD69C: +case 0xD89C: +case 0xDA9C: +case 0xDC9C: +case 0xDE9C: +case 0xD09D: +case 0xD29D: +case 0xD49D: +case 0xD69D: +case 0xD89D: +case 0xDA9D: +case 0xDC9D: +case 0xDE9D: +case 0xD09E: +case 0xD29E: +case 0xD49E: +case 0xD69E: +case 0xD89E: +case 0xDA9E: +case 0xDC9E: +case 0xDE9E: + +// ADDaD +case 0xD098: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2A0: +case 0xD4A0: +case 0xD6A0: +case 0xD8A0: +case 0xDAA0: +case 0xDCA0: +case 0xDEA0: +case 0xD0A1: +case 0xD2A1: +case 0xD4A1: +case 0xD6A1: +case 0xD8A1: +case 0xDAA1: +case 0xDCA1: +case 0xDEA1: +case 0xD0A2: +case 0xD2A2: +case 0xD4A2: +case 0xD6A2: +case 0xD8A2: +case 0xDAA2: +case 0xDCA2: +case 0xDEA2: +case 0xD0A3: +case 0xD2A3: +case 0xD4A3: +case 0xD6A3: +case 0xD8A3: +case 0xDAA3: +case 0xDCA3: +case 0xDEA3: +case 0xD0A4: +case 0xD2A4: +case 0xD4A4: +case 0xD6A4: +case 0xD8A4: +case 0xDAA4: +case 0xDCA4: +case 0xDEA4: +case 0xD0A5: +case 0xD2A5: +case 0xD4A5: +case 0xD6A5: +case 0xD8A5: +case 0xDAA5: +case 0xDCA5: +case 0xDEA5: +case 0xD0A6: +case 0xD2A6: +case 0xD4A6: +case 0xD6A6: +case 0xD8A6: +case 0xDAA6: +case 0xDCA6: +case 0xDEA6: + +// ADDaD +case 0xD0A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2A8: +case 0xD4A8: +case 0xD6A8: +case 0xD8A8: +case 0xDAA8: +case 0xDCA8: +case 0xDEA8: +case 0xD0A9: +case 0xD2A9: +case 0xD4A9: +case 0xD6A9: +case 0xD8A9: +case 0xDAA9: +case 0xDCA9: +case 0xDEA9: +case 0xD0AA: +case 0xD2AA: +case 0xD4AA: +case 0xD6AA: +case 0xD8AA: +case 0xDAAA: +case 0xDCAA: +case 0xDEAA: +case 0xD0AB: +case 0xD2AB: +case 0xD4AB: +case 0xD6AB: +case 0xD8AB: +case 0xDAAB: +case 0xDCAB: +case 0xDEAB: +case 0xD0AC: +case 0xD2AC: +case 0xD4AC: +case 0xD6AC: +case 0xD8AC: +case 0xDAAC: +case 0xDCAC: +case 0xDEAC: +case 0xD0AD: +case 0xD2AD: +case 0xD4AD: +case 0xD6AD: +case 0xD8AD: +case 0xDAAD: +case 0xDCAD: +case 0xDEAD: +case 0xD0AE: +case 0xD2AE: +case 0xD4AE: +case 0xD6AE: +case 0xD8AE: +case 0xDAAE: +case 0xDCAE: +case 0xDEAE: +case 0xD0AF: +case 0xD2AF: +case 0xD4AF: +case 0xD6AF: +case 0xD8AF: +case 0xDAAF: +case 0xDCAF: +case 0xDEAF: + +// ADDaD +case 0xD0A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2B0: +case 0xD4B0: +case 0xD6B0: +case 0xD8B0: +case 0xDAB0: +case 0xDCB0: +case 0xDEB0: +case 0xD0B1: +case 0xD2B1: +case 0xD4B1: +case 0xD6B1: +case 0xD8B1: +case 0xDAB1: +case 0xDCB1: +case 0xDEB1: +case 0xD0B2: +case 0xD2B2: +case 0xD4B2: +case 0xD6B2: +case 0xD8B2: +case 0xDAB2: +case 0xDCB2: +case 0xDEB2: +case 0xD0B3: +case 0xD2B3: +case 0xD4B3: +case 0xD6B3: +case 0xD8B3: +case 0xDAB3: +case 0xDCB3: +case 0xDEB3: +case 0xD0B4: +case 0xD2B4: +case 0xD4B4: +case 0xD6B4: +case 0xD8B4: +case 0xDAB4: +case 0xDCB4: +case 0xDEB4: +case 0xD0B5: +case 0xD2B5: +case 0xD4B5: +case 0xD6B5: +case 0xD8B5: +case 0xDAB5: +case 0xDCB5: +case 0xDEB5: +case 0xD0B6: +case 0xD2B6: +case 0xD4B6: +case 0xD6B6: +case 0xD8B6: +case 0xDAB6: +case 0xDCB6: +case 0xDEB6: +case 0xD0B7: +case 0xD2B7: +case 0xD4B7: +case 0xD6B7: +case 0xD8B7: +case 0xDAB7: +case 0xDCB7: +case 0xDEB7: + +// ADDaD +case 0xD0B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2B8: +case 0xD4B8: +case 0xD6B8: +case 0xD8B8: +case 0xDAB8: +case 0xDCB8: +case 0xDEB8: + +// ADDaD +case 0xD0B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2B9: +case 0xD4B9: +case 0xD6B9: +case 0xD8B9: +case 0xDAB9: +case 0xDCB9: +case 0xDEB9: + +// ADDaD +case 0xD0B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2BA: +case 0xD4BA: +case 0xD6BA: +case 0xD8BA: +case 0xDABA: +case 0xDCBA: +case 0xDEBA: + +// ADDaD +case 0xD0BA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2BB: +case 0xD4BB: +case 0xD6BB: +case 0xD8BB: +case 0xDABB: +case 0xDCBB: +case 0xDEBB: + +// ADDaD +case 0xD0BB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2BC: +case 0xD4BC: +case 0xD6BC: +case 0xD8BC: +case 0xDABC: +case 0xDCBC: +case 0xDEBC: + +// ADDaD +case 0xD0BC: +{ + u32 res; + u32 dst; + u32 src; + src = FETCH_LONG; + PC += 4; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(14) +case 0xD29F: +case 0xD49F: +case 0xD69F: +case 0xD89F: +case 0xDA9F: +case 0xDC9F: +case 0xDE9F: + +// ADDaD +case 0xD09F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD2A7: +case 0xD4A7: +case 0xD6A7: +case 0xD8A7: +case 0xDAA7: +case 0xDCA7: +case 0xDEA7: + +// ADDaD +case 0xD0A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD310: +case 0xD510: +case 0xD710: +case 0xD910: +case 0xDB10: +case 0xDD10: +case 0xDF10: +case 0xD111: +case 0xD311: +case 0xD511: +case 0xD711: +case 0xD911: +case 0xDB11: +case 0xDD11: +case 0xDF11: +case 0xD112: +case 0xD312: +case 0xD512: +case 0xD712: +case 0xD912: +case 0xDB12: +case 0xDD12: +case 0xDF12: +case 0xD113: +case 0xD313: +case 0xD513: +case 0xD713: +case 0xD913: +case 0xDB13: +case 0xDD13: +case 0xDF13: +case 0xD114: +case 0xD314: +case 0xD514: +case 0xD714: +case 0xD914: +case 0xDB14: +case 0xDD14: +case 0xDF14: +case 0xD115: +case 0xD315: +case 0xD515: +case 0xD715: +case 0xD915: +case 0xDB15: +case 0xDD15: +case 0xDF15: +case 0xD116: +case 0xD316: +case 0xD516: +case 0xD716: +case 0xD916: +case 0xDB16: +case 0xDD16: +case 0xDF16: +case 0xD117: +case 0xD317: +case 0xD517: +case 0xD717: +case 0xD917: +case 0xDB17: +case 0xDD17: +case 0xDF17: + +// ADDDa +case 0xD110: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD318: +case 0xD518: +case 0xD718: +case 0xD918: +case 0xDB18: +case 0xDD18: +case 0xDF18: +case 0xD119: +case 0xD319: +case 0xD519: +case 0xD719: +case 0xD919: +case 0xDB19: +case 0xDD19: +case 0xDF19: +case 0xD11A: +case 0xD31A: +case 0xD51A: +case 0xD71A: +case 0xD91A: +case 0xDB1A: +case 0xDD1A: +case 0xDF1A: +case 0xD11B: +case 0xD31B: +case 0xD51B: +case 0xD71B: +case 0xD91B: +case 0xDB1B: +case 0xDD1B: +case 0xDF1B: +case 0xD11C: +case 0xD31C: +case 0xD51C: +case 0xD71C: +case 0xD91C: +case 0xDB1C: +case 0xDD1C: +case 0xDF1C: +case 0xD11D: +case 0xD31D: +case 0xD51D: +case 0xD71D: +case 0xD91D: +case 0xDB1D: +case 0xDD1D: +case 0xDF1D: +case 0xD11E: +case 0xD31E: +case 0xD51E: +case 0xD71E: +case 0xD91E: +case 0xDB1E: +case 0xDD1E: +case 0xDF1E: + +// ADDDa +case 0xD118: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 1; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD320: +case 0xD520: +case 0xD720: +case 0xD920: +case 0xDB20: +case 0xDD20: +case 0xDF20: +case 0xD121: +case 0xD321: +case 0xD521: +case 0xD721: +case 0xD921: +case 0xDB21: +case 0xDD21: +case 0xDF21: +case 0xD122: +case 0xD322: +case 0xD522: +case 0xD722: +case 0xD922: +case 0xDB22: +case 0xDD22: +case 0xDF22: +case 0xD123: +case 0xD323: +case 0xD523: +case 0xD723: +case 0xD923: +case 0xDB23: +case 0xDD23: +case 0xDF23: +case 0xD124: +case 0xD324: +case 0xD524: +case 0xD724: +case 0xD924: +case 0xDB24: +case 0xDD24: +case 0xDF24: +case 0xD125: +case 0xD325: +case 0xD525: +case 0xD725: +case 0xD925: +case 0xDB25: +case 0xDD25: +case 0xDF25: +case 0xD126: +case 0xD326: +case 0xD526: +case 0xD726: +case 0xD926: +case 0xDB26: +case 0xDD26: +case 0xDF26: + +// ADDDa +case 0xD120: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD328: +case 0xD528: +case 0xD728: +case 0xD928: +case 0xDB28: +case 0xDD28: +case 0xDF28: +case 0xD129: +case 0xD329: +case 0xD529: +case 0xD729: +case 0xD929: +case 0xDB29: +case 0xDD29: +case 0xDF29: +case 0xD12A: +case 0xD32A: +case 0xD52A: +case 0xD72A: +case 0xD92A: +case 0xDB2A: +case 0xDD2A: +case 0xDF2A: +case 0xD12B: +case 0xD32B: +case 0xD52B: +case 0xD72B: +case 0xD92B: +case 0xDB2B: +case 0xDD2B: +case 0xDF2B: +case 0xD12C: +case 0xD32C: +case 0xD52C: +case 0xD72C: +case 0xD92C: +case 0xDB2C: +case 0xDD2C: +case 0xDF2C: +case 0xD12D: +case 0xD32D: +case 0xD52D: +case 0xD72D: +case 0xD92D: +case 0xDB2D: +case 0xDD2D: +case 0xDF2D: +case 0xD12E: +case 0xD32E: +case 0xD52E: +case 0xD72E: +case 0xD92E: +case 0xDB2E: +case 0xDD2E: +case 0xDF2E: +case 0xD12F: +case 0xD32F: +case 0xD52F: +case 0xD72F: +case 0xD92F: +case 0xDB2F: +case 0xDD2F: +case 0xDF2F: + +// ADDDa +case 0xD128: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD330: +case 0xD530: +case 0xD730: +case 0xD930: +case 0xDB30: +case 0xDD30: +case 0xDF30: +case 0xD131: +case 0xD331: +case 0xD531: +case 0xD731: +case 0xD931: +case 0xDB31: +case 0xDD31: +case 0xDF31: +case 0xD132: +case 0xD332: +case 0xD532: +case 0xD732: +case 0xD932: +case 0xDB32: +case 0xDD32: +case 0xDF32: +case 0xD133: +case 0xD333: +case 0xD533: +case 0xD733: +case 0xD933: +case 0xDB33: +case 0xDD33: +case 0xDF33: +case 0xD134: +case 0xD334: +case 0xD534: +case 0xD734: +case 0xD934: +case 0xDB34: +case 0xDD34: +case 0xDF34: +case 0xD135: +case 0xD335: +case 0xD535: +case 0xD735: +case 0xD935: +case 0xDB35: +case 0xDD35: +case 0xDF35: +case 0xD136: +case 0xD336: +case 0xD536: +case 0xD736: +case 0xD936: +case 0xDB36: +case 0xDD36: +case 0xDF36: +case 0xD137: +case 0xD337: +case 0xD537: +case 0xD737: +case 0xD937: +case 0xDB37: +case 0xDD37: +case 0xDF37: + +// ADDDa +case 0xD130: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD338: +case 0xD538: +case 0xD738: +case 0xD938: +case 0xDB38: +case 0xDD38: +case 0xDF38: + +// ADDDa +case 0xD138: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD339: +case 0xD539: +case 0xD739: +case 0xD939: +case 0xDB39: +case 0xDD39: +case 0xDF39: + +// ADDDa +case 0xD139: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD31F: +case 0xD51F: +case 0xD71F: +case 0xD91F: +case 0xDB1F: +case 0xDD1F: +case 0xDF1F: + +// ADDDa +case 0xD11F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD327: +case 0xD527: +case 0xD727: +case 0xD927: +case 0xDB27: +case 0xDD27: +case 0xDF27: + +// ADDDa +case 0xD127: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst + src; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ = res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(8) +case 0xD350: +case 0xD550: +case 0xD750: +case 0xD950: +case 0xDB50: +case 0xDD50: +case 0xDF50: +case 0xD151: +case 0xD351: +case 0xD551: +case 0xD751: +case 0xD951: +case 0xDB51: +case 0xDD51: +case 0xDF51: +case 0xD152: +case 0xD352: +case 0xD552: +case 0xD752: +case 0xD952: +case 0xDB52: +case 0xDD52: +case 0xDF52: +case 0xD153: +case 0xD353: +case 0xD553: +case 0xD753: +case 0xD953: +case 0xDB53: +case 0xDD53: +case 0xDF53: +case 0xD154: +case 0xD354: +case 0xD554: +case 0xD754: +case 0xD954: +case 0xDB54: +case 0xDD54: +case 0xDF54: +case 0xD155: +case 0xD355: +case 0xD555: +case 0xD755: +case 0xD955: +case 0xDB55: +case 0xDD55: +case 0xDF55: +case 0xD156: +case 0xD356: +case 0xD556: +case 0xD756: +case 0xD956: +case 0xDB56: +case 0xDD56: +case 0xDF56: +case 0xD157: +case 0xD357: +case 0xD557: +case 0xD757: +case 0xD957: +case 0xDB57: +case 0xDD57: +case 0xDF57: + +// ADDDa +case 0xD150: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD358: +case 0xD558: +case 0xD758: +case 0xD958: +case 0xDB58: +case 0xDD58: +case 0xDF58: +case 0xD159: +case 0xD359: +case 0xD559: +case 0xD759: +case 0xD959: +case 0xDB59: +case 0xDD59: +case 0xDF59: +case 0xD15A: +case 0xD35A: +case 0xD55A: +case 0xD75A: +case 0xD95A: +case 0xDB5A: +case 0xDD5A: +case 0xDF5A: +case 0xD15B: +case 0xD35B: +case 0xD55B: +case 0xD75B: +case 0xD95B: +case 0xDB5B: +case 0xDD5B: +case 0xDF5B: +case 0xD15C: +case 0xD35C: +case 0xD55C: +case 0xD75C: +case 0xD95C: +case 0xDB5C: +case 0xDD5C: +case 0xDF5C: +case 0xD15D: +case 0xD35D: +case 0xD55D: +case 0xD75D: +case 0xD95D: +case 0xDB5D: +case 0xDD5D: +case 0xDF5D: +case 0xD15E: +case 0xD35E: +case 0xD55E: +case 0xD75E: +case 0xD95E: +case 0xDB5E: +case 0xDD5E: +case 0xDF5E: + +// ADDDa +case 0xD158: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD360: +case 0xD560: +case 0xD760: +case 0xD960: +case 0xDB60: +case 0xDD60: +case 0xDF60: +case 0xD161: +case 0xD361: +case 0xD561: +case 0xD761: +case 0xD961: +case 0xDB61: +case 0xDD61: +case 0xDF61: +case 0xD162: +case 0xD362: +case 0xD562: +case 0xD762: +case 0xD962: +case 0xDB62: +case 0xDD62: +case 0xDF62: +case 0xD163: +case 0xD363: +case 0xD563: +case 0xD763: +case 0xD963: +case 0xDB63: +case 0xDD63: +case 0xDF63: +case 0xD164: +case 0xD364: +case 0xD564: +case 0xD764: +case 0xD964: +case 0xDB64: +case 0xDD64: +case 0xDF64: +case 0xD165: +case 0xD365: +case 0xD565: +case 0xD765: +case 0xD965: +case 0xDB65: +case 0xDD65: +case 0xDF65: +case 0xD166: +case 0xD366: +case 0xD566: +case 0xD766: +case 0xD966: +case 0xDB66: +case 0xDD66: +case 0xDF66: + +// ADDDa +case 0xD160: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD368: +case 0xD568: +case 0xD768: +case 0xD968: +case 0xDB68: +case 0xDD68: +case 0xDF68: +case 0xD169: +case 0xD369: +case 0xD569: +case 0xD769: +case 0xD969: +case 0xDB69: +case 0xDD69: +case 0xDF69: +case 0xD16A: +case 0xD36A: +case 0xD56A: +case 0xD76A: +case 0xD96A: +case 0xDB6A: +case 0xDD6A: +case 0xDF6A: +case 0xD16B: +case 0xD36B: +case 0xD56B: +case 0xD76B: +case 0xD96B: +case 0xDB6B: +case 0xDD6B: +case 0xDF6B: +case 0xD16C: +case 0xD36C: +case 0xD56C: +case 0xD76C: +case 0xD96C: +case 0xDB6C: +case 0xDD6C: +case 0xDF6C: +case 0xD16D: +case 0xD36D: +case 0xD56D: +case 0xD76D: +case 0xD96D: +case 0xDB6D: +case 0xDD6D: +case 0xDF6D: +case 0xD16E: +case 0xD36E: +case 0xD56E: +case 0xD76E: +case 0xD96E: +case 0xDB6E: +case 0xDD6E: +case 0xDF6E: +case 0xD16F: +case 0xD36F: +case 0xD56F: +case 0xD76F: +case 0xD96F: +case 0xDB6F: +case 0xDD6F: +case 0xDF6F: + +// ADDDa +case 0xD168: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD370: +case 0xD570: +case 0xD770: +case 0xD970: +case 0xDB70: +case 0xDD70: +case 0xDF70: +case 0xD171: +case 0xD371: +case 0xD571: +case 0xD771: +case 0xD971: +case 0xDB71: +case 0xDD71: +case 0xDF71: +case 0xD172: +case 0xD372: +case 0xD572: +case 0xD772: +case 0xD972: +case 0xDB72: +case 0xDD72: +case 0xDF72: +case 0xD173: +case 0xD373: +case 0xD573: +case 0xD773: +case 0xD973: +case 0xDB73: +case 0xDD73: +case 0xDF73: +case 0xD174: +case 0xD374: +case 0xD574: +case 0xD774: +case 0xD974: +case 0xDB74: +case 0xDD74: +case 0xDF74: +case 0xD175: +case 0xD375: +case 0xD575: +case 0xD775: +case 0xD975: +case 0xDB75: +case 0xDD75: +case 0xDF75: +case 0xD176: +case 0xD376: +case 0xD576: +case 0xD776: +case 0xD976: +case 0xDB76: +case 0xDD76: +case 0xDF76: +case 0xD177: +case 0xD377: +case 0xD577: +case 0xD777: +case 0xD977: +case 0xDB77: +case 0xDD77: +case 0xDF77: + +// ADDDa +case 0xD170: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD378: +case 0xD578: +case 0xD778: +case 0xD978: +case 0xDB78: +case 0xDD78: +case 0xDF78: + +// ADDDa +case 0xD178: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD379: +case 0xD579: +case 0xD779: +case 0xD979: +case 0xDB79: +case 0xDD79: +case 0xDF79: + +// ADDDa +case 0xD179: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD35F: +case 0xD55F: +case 0xD75F: +case 0xD95F: +case 0xDB5F: +case 0xDD5F: +case 0xDF5F: + +// ADDDa +case 0xD15F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD367: +case 0xD567: +case 0xD767: +case 0xD967: +case 0xDB67: +case 0xDD67: +case 0xDF67: + +// ADDDa +case 0xD167: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst + src; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ = res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xD390: +case 0xD590: +case 0xD790: +case 0xD990: +case 0xDB90: +case 0xDD90: +case 0xDF90: +case 0xD191: +case 0xD391: +case 0xD591: +case 0xD791: +case 0xD991: +case 0xDB91: +case 0xDD91: +case 0xDF91: +case 0xD192: +case 0xD392: +case 0xD592: +case 0xD792: +case 0xD992: +case 0xDB92: +case 0xDD92: +case 0xDF92: +case 0xD193: +case 0xD393: +case 0xD593: +case 0xD793: +case 0xD993: +case 0xDB93: +case 0xDD93: +case 0xDF93: +case 0xD194: +case 0xD394: +case 0xD594: +case 0xD794: +case 0xD994: +case 0xDB94: +case 0xDD94: +case 0xDF94: +case 0xD195: +case 0xD395: +case 0xD595: +case 0xD795: +case 0xD995: +case 0xDB95: +case 0xDD95: +case 0xDF95: +case 0xD196: +case 0xD396: +case 0xD596: +case 0xD796: +case 0xD996: +case 0xDB96: +case 0xDD96: +case 0xDF96: +case 0xD197: +case 0xD397: +case 0xD597: +case 0xD797: +case 0xD997: +case 0xDB97: +case 0xDD97: +case 0xDF97: + +// ADDDa +case 0xD190: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD398: +case 0xD598: +case 0xD798: +case 0xD998: +case 0xDB98: +case 0xDD98: +case 0xDF98: +case 0xD199: +case 0xD399: +case 0xD599: +case 0xD799: +case 0xD999: +case 0xDB99: +case 0xDD99: +case 0xDF99: +case 0xD19A: +case 0xD39A: +case 0xD59A: +case 0xD79A: +case 0xD99A: +case 0xDB9A: +case 0xDD9A: +case 0xDF9A: +case 0xD19B: +case 0xD39B: +case 0xD59B: +case 0xD79B: +case 0xD99B: +case 0xDB9B: +case 0xDD9B: +case 0xDF9B: +case 0xD19C: +case 0xD39C: +case 0xD59C: +case 0xD79C: +case 0xD99C: +case 0xDB9C: +case 0xDD9C: +case 0xDF9C: +case 0xD19D: +case 0xD39D: +case 0xD59D: +case 0xD79D: +case 0xD99D: +case 0xDB9D: +case 0xDD9D: +case 0xDF9D: +case 0xD19E: +case 0xD39E: +case 0xD59E: +case 0xD79E: +case 0xD99E: +case 0xDB9E: +case 0xDD9E: +case 0xDF9E: + +// ADDDa +case 0xD198: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD3A0: +case 0xD5A0: +case 0xD7A0: +case 0xD9A0: +case 0xDBA0: +case 0xDDA0: +case 0xDFA0: +case 0xD1A1: +case 0xD3A1: +case 0xD5A1: +case 0xD7A1: +case 0xD9A1: +case 0xDBA1: +case 0xDDA1: +case 0xDFA1: +case 0xD1A2: +case 0xD3A2: +case 0xD5A2: +case 0xD7A2: +case 0xD9A2: +case 0xDBA2: +case 0xDDA2: +case 0xDFA2: +case 0xD1A3: +case 0xD3A3: +case 0xD5A3: +case 0xD7A3: +case 0xD9A3: +case 0xDBA3: +case 0xDDA3: +case 0xDFA3: +case 0xD1A4: +case 0xD3A4: +case 0xD5A4: +case 0xD7A4: +case 0xD9A4: +case 0xDBA4: +case 0xDDA4: +case 0xDFA4: +case 0xD1A5: +case 0xD3A5: +case 0xD5A5: +case 0xD7A5: +case 0xD9A5: +case 0xDBA5: +case 0xDDA5: +case 0xDFA5: +case 0xD1A6: +case 0xD3A6: +case 0xD5A6: +case 0xD7A6: +case 0xD9A6: +case 0xDBA6: +case 0xDDA6: +case 0xDFA6: + +// ADDDa +case 0xD1A0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD3A8: +case 0xD5A8: +case 0xD7A8: +case 0xD9A8: +case 0xDBA8: +case 0xDDA8: +case 0xDFA8: +case 0xD1A9: +case 0xD3A9: +case 0xD5A9: +case 0xD7A9: +case 0xD9A9: +case 0xDBA9: +case 0xDDA9: +case 0xDFA9: +case 0xD1AA: +case 0xD3AA: +case 0xD5AA: +case 0xD7AA: +case 0xD9AA: +case 0xDBAA: +case 0xDDAA: +case 0xDFAA: +case 0xD1AB: +case 0xD3AB: +case 0xD5AB: +case 0xD7AB: +case 0xD9AB: +case 0xDBAB: +case 0xDDAB: +case 0xDFAB: +case 0xD1AC: +case 0xD3AC: +case 0xD5AC: +case 0xD7AC: +case 0xD9AC: +case 0xDBAC: +case 0xDDAC: +case 0xDFAC: +case 0xD1AD: +case 0xD3AD: +case 0xD5AD: +case 0xD7AD: +case 0xD9AD: +case 0xDBAD: +case 0xDDAD: +case 0xDFAD: +case 0xD1AE: +case 0xD3AE: +case 0xD5AE: +case 0xD7AE: +case 0xD9AE: +case 0xDBAE: +case 0xDDAE: +case 0xDFAE: +case 0xD1AF: +case 0xD3AF: +case 0xD5AF: +case 0xD7AF: +case 0xD9AF: +case 0xDBAF: +case 0xDDAF: +case 0xDFAF: + +// ADDDa +case 0xD1A8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD3B0: +case 0xD5B0: +case 0xD7B0: +case 0xD9B0: +case 0xDBB0: +case 0xDDB0: +case 0xDFB0: +case 0xD1B1: +case 0xD3B1: +case 0xD5B1: +case 0xD7B1: +case 0xD9B1: +case 0xDBB1: +case 0xDDB1: +case 0xDFB1: +case 0xD1B2: +case 0xD3B2: +case 0xD5B2: +case 0xD7B2: +case 0xD9B2: +case 0xDBB2: +case 0xDDB2: +case 0xDFB2: +case 0xD1B3: +case 0xD3B3: +case 0xD5B3: +case 0xD7B3: +case 0xD9B3: +case 0xDBB3: +case 0xDDB3: +case 0xDFB3: +case 0xD1B4: +case 0xD3B4: +case 0xD5B4: +case 0xD7B4: +case 0xD9B4: +case 0xDBB4: +case 0xDDB4: +case 0xDFB4: +case 0xD1B5: +case 0xD3B5: +case 0xD5B5: +case 0xD7B5: +case 0xD9B5: +case 0xDBB5: +case 0xDDB5: +case 0xDFB5: +case 0xD1B6: +case 0xD3B6: +case 0xD5B6: +case 0xD7B6: +case 0xD9B6: +case 0xDBB6: +case 0xDDB6: +case 0xDFB6: +case 0xD1B7: +case 0xD3B7: +case 0xD5B7: +case 0xD7B7: +case 0xD9B7: +case 0xDBB7: +case 0xDDB7: +case 0xDFB7: + +// ADDDa +case 0xD1B0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 10; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD3B8: +case 0xD5B8: +case 0xD7B8: +case 0xD9B8: +case 0xDBB8: +case 0xDDB8: +case 0xDFB8: + +// ADDDa +case 0xD1B8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 8; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD3B9: +case 0xD5B9: +case 0xD7B9: +case 0xD9B9: +case 0xDBB9: +case 0xDDB9: +case 0xDFB9: + +// ADDDa +case 0xD1B9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 12; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD39F: +case 0xD59F: +case 0xD79F: +case 0xD99F: +case 0xDB9F: +case 0xDD9F: +case 0xDF9F: + +// ADDDa +case 0xD19F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 4; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD3A7: +case 0xD5A7: +case 0xD7A7: +case 0xD9A7: +case 0xDBA7: +case 0xDDA7: +case 0xDFA7: + +// ADDDa +case 0xD1A7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 9) & 7]; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, dst) + res = dst + src; + CPU->flag_notZ = res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(8) +case 0xD300: +case 0xD500: +case 0xD700: +case 0xD900: +case 0xDB00: +case 0xDD00: +case 0xDF00: +case 0xD101: +case 0xD301: +case 0xD501: +case 0xD701: +case 0xD901: +case 0xDB01: +case 0xDD01: +case 0xDF01: +case 0xD102: +case 0xD302: +case 0xD502: +case 0xD702: +case 0xD902: +case 0xDB02: +case 0xDD02: +case 0xDF02: +case 0xD103: +case 0xD303: +case 0xD503: +case 0xD703: +case 0xD903: +case 0xDB03: +case 0xDD03: +case 0xDF03: +case 0xD104: +case 0xD304: +case 0xD504: +case 0xD704: +case 0xD904: +case 0xDB04: +case 0xDD04: +case 0xDF04: +case 0xD105: +case 0xD305: +case 0xD505: +case 0xD705: +case 0xD905: +case 0xDB05: +case 0xDD05: +case 0xDF05: +case 0xD106: +case 0xD306: +case 0xD506: +case 0xD706: +case 0xD906: +case 0xDB06: +case 0xDD06: +case 0xDF06: +case 0xD107: +case 0xD307: +case 0xD507: +case 0xD707: +case 0xD907: +case 0xDB07: +case 0xDD07: +case 0xDF07: + +// ADDX +case 0xD100: +{ + u32 res; + u32 dst; + u32 src; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + dst = (u8)CPU->D[(Opcode >> 9) & 7]; + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ |= res & 0xFF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD340: +case 0xD540: +case 0xD740: +case 0xD940: +case 0xDB40: +case 0xDD40: +case 0xDF40: +case 0xD141: +case 0xD341: +case 0xD541: +case 0xD741: +case 0xD941: +case 0xDB41: +case 0xDD41: +case 0xDF41: +case 0xD142: +case 0xD342: +case 0xD542: +case 0xD742: +case 0xD942: +case 0xDB42: +case 0xDD42: +case 0xDF42: +case 0xD143: +case 0xD343: +case 0xD543: +case 0xD743: +case 0xD943: +case 0xDB43: +case 0xDD43: +case 0xDF43: +case 0xD144: +case 0xD344: +case 0xD544: +case 0xD744: +case 0xD944: +case 0xDB44: +case 0xDD44: +case 0xDF44: +case 0xD145: +case 0xD345: +case 0xD545: +case 0xD745: +case 0xD945: +case 0xDB45: +case 0xDD45: +case 0xDF45: +case 0xD146: +case 0xD346: +case 0xD546: +case 0xD746: +case 0xD946: +case 0xDB46: +case 0xDD46: +case 0xDF46: +case 0xD147: +case 0xD347: +case 0xD547: +case 0xD747: +case 0xD947: +case 0xDB47: +case 0xDD47: +case 0xDF47: + +// ADDX +case 0xD140: +{ + u32 res; + u32 dst; + u32 src; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + dst = (u16)CPU->D[(Opcode >> 9) & 7]; + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(4) +case 0xD380: +case 0xD580: +case 0xD780: +case 0xD980: +case 0xDB80: +case 0xDD80: +case 0xDF80: +case 0xD181: +case 0xD381: +case 0xD581: +case 0xD781: +case 0xD981: +case 0xDB81: +case 0xDD81: +case 0xDF81: +case 0xD182: +case 0xD382: +case 0xD582: +case 0xD782: +case 0xD982: +case 0xDB82: +case 0xDD82: +case 0xDF82: +case 0xD183: +case 0xD383: +case 0xD583: +case 0xD783: +case 0xD983: +case 0xDB83: +case 0xDD83: +case 0xDF83: +case 0xD184: +case 0xD384: +case 0xD584: +case 0xD784: +case 0xD984: +case 0xDB84: +case 0xDD84: +case 0xDF84: +case 0xD185: +case 0xD385: +case 0xD585: +case 0xD785: +case 0xD985: +case 0xDB85: +case 0xDD85: +case 0xDF85: +case 0xD186: +case 0xD386: +case 0xD586: +case 0xD786: +case 0xD986: +case 0xDB86: +case 0xDD86: +case 0xDF86: +case 0xD187: +case 0xD387: +case 0xD587: +case 0xD787: +case 0xD987: +case 0xDB87: +case 0xDD87: +case 0xDF87: + +// ADDX +case 0xD180: +{ + u32 res; + u32 dst; + u32 src; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->D[(Opcode >> 9) & 7]; + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 9) & 7], res); +} +RET(8) +case 0xD308: +case 0xD508: +case 0xD708: +case 0xD908: +case 0xDB08: +case 0xDD08: +case 0xD109: +case 0xD309: +case 0xD509: +case 0xD709: +case 0xD909: +case 0xDB09: +case 0xDD09: +case 0xD10A: +case 0xD30A: +case 0xD50A: +case 0xD70A: +case 0xD90A: +case 0xDB0A: +case 0xDD0A: +case 0xD10B: +case 0xD30B: +case 0xD50B: +case 0xD70B: +case 0xD90B: +case 0xDB0B: +case 0xDD0B: +case 0xD10C: +case 0xD30C: +case 0xD50C: +case 0xD70C: +case 0xD90C: +case 0xDB0C: +case 0xDD0C: +case 0xD10D: +case 0xD30D: +case 0xD50D: +case 0xD70D: +case 0xD90D: +case 0xDB0D: +case 0xDD0D: +case 0xD10E: +case 0xD30E: +case 0xD50E: +case 0xD70E: +case 0xD90E: +case 0xDB0E: +case 0xDD0E: + +// ADDXM +case 0xD108: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0xD348: +case 0xD548: +case 0xD748: +case 0xD948: +case 0xDB48: +case 0xDD48: +case 0xD149: +case 0xD349: +case 0xD549: +case 0xD749: +case 0xD949: +case 0xDB49: +case 0xDD49: +case 0xD14A: +case 0xD34A: +case 0xD54A: +case 0xD74A: +case 0xD94A: +case 0xDB4A: +case 0xDD4A: +case 0xD14B: +case 0xD34B: +case 0xD54B: +case 0xD74B: +case 0xD94B: +case 0xDB4B: +case 0xDD4B: +case 0xD14C: +case 0xD34C: +case 0xD54C: +case 0xD74C: +case 0xD94C: +case 0xDB4C: +case 0xDD4C: +case 0xD14D: +case 0xD34D: +case 0xD54D: +case 0xD74D: +case 0xD94D: +case 0xDB4D: +case 0xDD4D: +case 0xD14E: +case 0xD34E: +case 0xD54E: +case 0xD74E: +case 0xD94E: +case 0xDB4E: +case 0xDD4E: + +// ADDXM +case 0xD148: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) +case 0xD388: +case 0xD588: +case 0xD788: +case 0xD988: +case 0xDB88: +case 0xDD88: +case 0xD189: +case 0xD389: +case 0xD589: +case 0xD789: +case 0xD989: +case 0xDB89: +case 0xDD89: +case 0xD18A: +case 0xD38A: +case 0xD58A: +case 0xD78A: +case 0xD98A: +case 0xDB8A: +case 0xDD8A: +case 0xD18B: +case 0xD38B: +case 0xD58B: +case 0xD78B: +case 0xD98B: +case 0xDB8B: +case 0xDD8B: +case 0xD18C: +case 0xD38C: +case 0xD58C: +case 0xD78C: +case 0xD98C: +case 0xDB8C: +case 0xDD8C: +case 0xD18D: +case 0xD38D: +case 0xD58D: +case 0xD78D: +case 0xD98D: +case 0xDB8D: +case 0xDD8D: +case 0xD18E: +case 0xD38E: +case 0xD58E: +case 0xD78E: +case 0xD98E: +case 0xDB8E: +case 0xDD8E: + +// ADDXM +case 0xD188: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) +case 0xD30F: +case 0xD50F: +case 0xD70F: +case 0xD90F: +case 0xDB0F: +case 0xDD0F: + +// ADDX7M +case 0xD10F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 1; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0xD34F: +case 0xD54F: +case 0xD74F: +case 0xD94F: +case 0xDB4F: +case 0xDD4F: + +// ADDX7M +case 0xD14F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 2; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) +case 0xD38F: +case 0xD58F: +case 0xD78F: +case 0xD98F: +case 0xDB8F: +case 0xDD8F: + +// ADDX7M +case 0xD18F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[(Opcode >> 9) & 7] - 4; + CPU->A[(Opcode >> 9) & 7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) +case 0xDF09: +case 0xDF0A: +case 0xDF0B: +case 0xDF0C: +case 0xDF0D: +case 0xDF0E: + +// ADDXM7 +case 0xDF08: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 1; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) +case 0xDF49: +case 0xDF4A: +case 0xDF4B: +case 0xDF4C: +case 0xDF4D: +case 0xDF4E: + +// ADDXM7 +case 0xDF48: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) +case 0xDF89: +case 0xDF8A: +case 0xDF8B: +case 0xDF8C: +case 0xDF8D: +case 0xDF8E: + +// ADDXM7 +case 0xDF88: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) + +// ADDX7M7 +case 0xDF0F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_BYat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_N = CPU->flag_X = CPU->flag_C = res; + CPU->flag_V = (src ^ res) & (dst ^ res); + CPU->flag_notZ |= res & 0xFF; + WRITE_BYTE_F(adr, res) +} +RET(6) + +// ADDX7M7 +case 0xDF4F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8; + CPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_notZ |= res & 0xFFFF; + WRITE_WORD_F(adr, res) +} +RET(6) + +// ADDX7M7 +case 0xDF8F: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 6; + READ_LOat_F(adr, src) + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 2; + READ_LOat_F(adr, dst) + res = dst + src + ((CPU->flag_X >> 8) & 1); + CPU->flag_notZ |= res; + CPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23; + CPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24; + CPU->flag_N = res >> 24; + WRITE_LONG_F(adr, res) +} +RET(6) +case 0xD2C0: +case 0xD4C0: +case 0xD6C0: +case 0xD8C0: +case 0xDAC0: +case 0xDCC0: +case 0xDEC0: +case 0xD0C1: +case 0xD2C1: +case 0xD4C1: +case 0xD6C1: +case 0xD8C1: +case 0xDAC1: +case 0xDCC1: +case 0xDEC1: +case 0xD0C2: +case 0xD2C2: +case 0xD4C2: +case 0xD6C2: +case 0xD8C2: +case 0xDAC2: +case 0xDCC2: +case 0xDEC2: +case 0xD0C3: +case 0xD2C3: +case 0xD4C3: +case 0xD6C3: +case 0xD8C3: +case 0xDAC3: +case 0xDCC3: +case 0xDEC3: +case 0xD0C4: +case 0xD2C4: +case 0xD4C4: +case 0xD6C4: +case 0xD8C4: +case 0xDAC4: +case 0xDCC4: +case 0xDEC4: +case 0xD0C5: +case 0xD2C5: +case 0xD4C5: +case 0xD6C5: +case 0xD8C5: +case 0xDAC5: +case 0xDCC5: +case 0xDEC5: +case 0xD0C6: +case 0xD2C6: +case 0xD4C6: +case 0xD6C6: +case 0xD8C6: +case 0xDAC6: +case 0xDCC6: +case 0xDEC6: +case 0xD0C7: +case 0xD2C7: +case 0xD4C7: +case 0xD6C7: +case 0xD8C7: +case 0xDAC7: +case 0xDCC7: +case 0xDEC7: + +// ADDA +case 0xD0C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0xD2C8: +case 0xD4C8: +case 0xD6C8: +case 0xD8C8: +case 0xDAC8: +case 0xDCC8: +case 0xDEC8: +case 0xD0C9: +case 0xD2C9: +case 0xD4C9: +case 0xD6C9: +case 0xD8C9: +case 0xDAC9: +case 0xDCC9: +case 0xDEC9: +case 0xD0CA: +case 0xD2CA: +case 0xD4CA: +case 0xD6CA: +case 0xD8CA: +case 0xDACA: +case 0xDCCA: +case 0xDECA: +case 0xD0CB: +case 0xD2CB: +case 0xD4CB: +case 0xD6CB: +case 0xD8CB: +case 0xDACB: +case 0xDCCB: +case 0xDECB: +case 0xD0CC: +case 0xD2CC: +case 0xD4CC: +case 0xD6CC: +case 0xD8CC: +case 0xDACC: +case 0xDCCC: +case 0xDECC: +case 0xD0CD: +case 0xD2CD: +case 0xD4CD: +case 0xD6CD: +case 0xD8CD: +case 0xDACD: +case 0xDCCD: +case 0xDECD: +case 0xD0CE: +case 0xD2CE: +case 0xD4CE: +case 0xD6CE: +case 0xD8CE: +case 0xDACE: +case 0xDCCE: +case 0xDECE: +case 0xD0CF: +case 0xD2CF: +case 0xD4CF: +case 0xD6CF: +case 0xD8CF: +case 0xDACF: +case 0xDCCF: +case 0xDECF: + +// ADDA +case 0xD0C8: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(8) +case 0xD2D0: +case 0xD4D0: +case 0xD6D0: +case 0xD8D0: +case 0xDAD0: +case 0xDCD0: +case 0xDED0: +case 0xD0D1: +case 0xD2D1: +case 0xD4D1: +case 0xD6D1: +case 0xD8D1: +case 0xDAD1: +case 0xDCD1: +case 0xDED1: +case 0xD0D2: +case 0xD2D2: +case 0xD4D2: +case 0xD6D2: +case 0xD8D2: +case 0xDAD2: +case 0xDCD2: +case 0xDED2: +case 0xD0D3: +case 0xD2D3: +case 0xD4D3: +case 0xD6D3: +case 0xD8D3: +case 0xDAD3: +case 0xDCD3: +case 0xDED3: +case 0xD0D4: +case 0xD2D4: +case 0xD4D4: +case 0xD6D4: +case 0xD8D4: +case 0xDAD4: +case 0xDCD4: +case 0xDED4: +case 0xD0D5: +case 0xD2D5: +case 0xD4D5: +case 0xD6D5: +case 0xD8D5: +case 0xDAD5: +case 0xDCD5: +case 0xDED5: +case 0xD0D6: +case 0xD2D6: +case 0xD4D6: +case 0xD6D6: +case 0xD8D6: +case 0xDAD6: +case 0xDCD6: +case 0xDED6: +case 0xD0D7: +case 0xD2D7: +case 0xD4D7: +case 0xD6D7: +case 0xD8D7: +case 0xDAD7: +case 0xDCD7: +case 0xDED7: + +// ADDA +case 0xD0D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2D8: +case 0xD4D8: +case 0xD6D8: +case 0xD8D8: +case 0xDAD8: +case 0xDCD8: +case 0xDED8: +case 0xD0D9: +case 0xD2D9: +case 0xD4D9: +case 0xD6D9: +case 0xD8D9: +case 0xDAD9: +case 0xDCD9: +case 0xDED9: +case 0xD0DA: +case 0xD2DA: +case 0xD4DA: +case 0xD6DA: +case 0xD8DA: +case 0xDADA: +case 0xDCDA: +case 0xDEDA: +case 0xD0DB: +case 0xD2DB: +case 0xD4DB: +case 0xD6DB: +case 0xD8DB: +case 0xDADB: +case 0xDCDB: +case 0xDEDB: +case 0xD0DC: +case 0xD2DC: +case 0xD4DC: +case 0xD6DC: +case 0xD8DC: +case 0xDADC: +case 0xDCDC: +case 0xDEDC: +case 0xD0DD: +case 0xD2DD: +case 0xD4DD: +case 0xD6DD: +case 0xD8DD: +case 0xDADD: +case 0xDCDD: +case 0xDEDD: +case 0xD0DE: +case 0xD2DE: +case 0xD4DE: +case 0xD6DE: +case 0xD8DE: +case 0xDADE: +case 0xDCDE: +case 0xDEDE: + +// ADDA +case 0xD0D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2E0: +case 0xD4E0: +case 0xD6E0: +case 0xD8E0: +case 0xDAE0: +case 0xDCE0: +case 0xDEE0: +case 0xD0E1: +case 0xD2E1: +case 0xD4E1: +case 0xD6E1: +case 0xD8E1: +case 0xDAE1: +case 0xDCE1: +case 0xDEE1: +case 0xD0E2: +case 0xD2E2: +case 0xD4E2: +case 0xD6E2: +case 0xD8E2: +case 0xDAE2: +case 0xDCE2: +case 0xDEE2: +case 0xD0E3: +case 0xD2E3: +case 0xD4E3: +case 0xD6E3: +case 0xD8E3: +case 0xDAE3: +case 0xDCE3: +case 0xDEE3: +case 0xD0E4: +case 0xD2E4: +case 0xD4E4: +case 0xD6E4: +case 0xD8E4: +case 0xDAE4: +case 0xDCE4: +case 0xDEE4: +case 0xD0E5: +case 0xD2E5: +case 0xD4E5: +case 0xD6E5: +case 0xD8E5: +case 0xDAE5: +case 0xDCE5: +case 0xDEE5: +case 0xD0E6: +case 0xD2E6: +case 0xD4E6: +case 0xD6E6: +case 0xD8E6: +case 0xDAE6: +case 0xDCE6: +case 0xDEE6: + +// ADDA +case 0xD0E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2E8: +case 0xD4E8: +case 0xD6E8: +case 0xD8E8: +case 0xDAE8: +case 0xDCE8: +case 0xDEE8: +case 0xD0E9: +case 0xD2E9: +case 0xD4E9: +case 0xD6E9: +case 0xD8E9: +case 0xDAE9: +case 0xDCE9: +case 0xDEE9: +case 0xD0EA: +case 0xD2EA: +case 0xD4EA: +case 0xD6EA: +case 0xD8EA: +case 0xDAEA: +case 0xDCEA: +case 0xDEEA: +case 0xD0EB: +case 0xD2EB: +case 0xD4EB: +case 0xD6EB: +case 0xD8EB: +case 0xDAEB: +case 0xDCEB: +case 0xDEEB: +case 0xD0EC: +case 0xD2EC: +case 0xD4EC: +case 0xD6EC: +case 0xD8EC: +case 0xDAEC: +case 0xDCEC: +case 0xDEEC: +case 0xD0ED: +case 0xD2ED: +case 0xD4ED: +case 0xD6ED: +case 0xD8ED: +case 0xDAED: +case 0xDCED: +case 0xDEED: +case 0xD0EE: +case 0xD2EE: +case 0xD4EE: +case 0xD6EE: +case 0xD8EE: +case 0xDAEE: +case 0xDCEE: +case 0xDEEE: +case 0xD0EF: +case 0xD2EF: +case 0xD4EF: +case 0xD6EF: +case 0xD8EF: +case 0xDAEF: +case 0xDCEF: +case 0xDEEF: + +// ADDA +case 0xD0E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2F0: +case 0xD4F0: +case 0xD6F0: +case 0xD8F0: +case 0xDAF0: +case 0xDCF0: +case 0xDEF0: +case 0xD0F1: +case 0xD2F1: +case 0xD4F1: +case 0xD6F1: +case 0xD8F1: +case 0xDAF1: +case 0xDCF1: +case 0xDEF1: +case 0xD0F2: +case 0xD2F2: +case 0xD4F2: +case 0xD6F2: +case 0xD8F2: +case 0xDAF2: +case 0xDCF2: +case 0xDEF2: +case 0xD0F3: +case 0xD2F3: +case 0xD4F3: +case 0xD6F3: +case 0xD8F3: +case 0xDAF3: +case 0xDCF3: +case 0xDEF3: +case 0xD0F4: +case 0xD2F4: +case 0xD4F4: +case 0xD6F4: +case 0xD8F4: +case 0xDAF4: +case 0xDCF4: +case 0xDEF4: +case 0xD0F5: +case 0xD2F5: +case 0xD4F5: +case 0xD6F5: +case 0xD8F5: +case 0xDAF5: +case 0xDCF5: +case 0xDEF5: +case 0xD0F6: +case 0xD2F6: +case 0xD4F6: +case 0xD6F6: +case 0xD8F6: +case 0xDAF6: +case 0xDCF6: +case 0xDEF6: +case 0xD0F7: +case 0xD2F7: +case 0xD4F7: +case 0xD6F7: +case 0xD8F7: +case 0xDAF7: +case 0xDCF7: +case 0xDEF7: + +// ADDA +case 0xD0F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 8; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2F8: +case 0xD4F8: +case 0xD6F8: +case 0xD8F8: +case 0xDAF8: +case 0xDCF8: +case 0xDEF8: + +// ADDA +case 0xD0F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2F9: +case 0xD4F9: +case 0xD6F9: +case 0xD8F9: +case 0xDAF9: +case 0xDCF9: +case 0xDEF9: + +// ADDA +case 0xD0F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 10; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2FA: +case 0xD4FA: +case 0xD6FA: +case 0xD8FA: +case 0xDAFA: +case 0xDCFA: +case 0xDEFA: + +// ADDA +case 0xD0FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2FB: +case 0xD4FB: +case 0xD6FB: +case 0xD8FB: +case 0xDAFB: +case 0xDCFB: +case 0xDEFB: + +// ADDA +case 0xD0FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 8; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2FC: +case 0xD4FC: +case 0xD6FC: +case 0xD8FC: +case 0xDAFC: +case 0xDCFC: +case 0xDEFC: + +// ADDA +case 0xD0FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s16)FETCH_WORD; + PC += 2; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(12) +case 0xD2DF: +case 0xD4DF: +case 0xD6DF: +case 0xD8DF: +case 0xDADF: +case 0xDCDF: +case 0xDEDF: + +// ADDA +case 0xD0DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + timestamp += 2; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD2E7: +case 0xD4E7: +case 0xD6E7: +case 0xD8E7: +case 0xDAE7: +case 0xDCE7: +case 0xDEE7: + +// ADDA +case 0xD0E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 4; + READSX_WOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3C0: +case 0xD5C0: +case 0xD7C0: +case 0xD9C0: +case 0xDBC0: +case 0xDDC0: +case 0xDFC0: +case 0xD1C1: +case 0xD3C1: +case 0xD5C1: +case 0xD7C1: +case 0xD9C1: +case 0xDBC1: +case 0xDDC1: +case 0xDFC1: +case 0xD1C2: +case 0xD3C2: +case 0xD5C2: +case 0xD7C2: +case 0xD9C2: +case 0xDBC2: +case 0xDDC2: +case 0xDFC2: +case 0xD1C3: +case 0xD3C3: +case 0xD5C3: +case 0xD7C3: +case 0xD9C3: +case 0xDBC3: +case 0xDDC3: +case 0xDFC3: +case 0xD1C4: +case 0xD3C4: +case 0xD5C4: +case 0xD7C4: +case 0xD9C4: +case 0xDBC4: +case 0xDDC4: +case 0xDFC4: +case 0xD1C5: +case 0xD3C5: +case 0xD5C5: +case 0xD7C5: +case 0xD9C5: +case 0xDBC5: +case 0xDDC5: +case 0xDFC5: +case 0xD1C6: +case 0xD3C6: +case 0xD5C6: +case 0xD7C6: +case 0xD9C6: +case 0xDBC6: +case 0xDDC6: +case 0xDFC6: +case 0xD1C7: +case 0xD3C7: +case 0xD5C7: +case 0xD7C7: +case 0xD9C7: +case 0xDBC7: +case 0xDDC7: +case 0xDFC7: + +// ADDA +case 0xD1C0: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)CPU->D[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3C8: +case 0xD5C8: +case 0xD7C8: +case 0xD9C8: +case 0xDBC8: +case 0xDDC8: +case 0xDFC8: +case 0xD1C9: +case 0xD3C9: +case 0xD5C9: +case 0xD7C9: +case 0xD9C9: +case 0xDBC9: +case 0xDDC9: +case 0xDFC9: +case 0xD1CA: +case 0xD3CA: +case 0xD5CA: +case 0xD7CA: +case 0xD9CA: +case 0xDBCA: +case 0xDDCA: +case 0xDFCA: +case 0xD1CB: +case 0xD3CB: +case 0xD5CB: +case 0xD7CB: +case 0xD9CB: +case 0xDBCB: +case 0xDDCB: +case 0xDFCB: +case 0xD1CC: +case 0xD3CC: +case 0xD5CC: +case 0xD7CC: +case 0xD9CC: +case 0xDBCC: +case 0xDDCC: +case 0xDFCC: +case 0xD1CD: +case 0xD3CD: +case 0xD5CD: +case 0xD7CD: +case 0xD9CD: +case 0xDBCD: +case 0xDDCD: +case 0xDFCD: +case 0xD1CE: +case 0xD3CE: +case 0xD5CE: +case 0xD7CE: +case 0xD9CE: +case 0xDBCE: +case 0xDDCE: +case 0xDFCE: +case 0xD1CF: +case 0xD3CF: +case 0xD5CF: +case 0xD7CF: +case 0xD9CF: +case 0xDBCF: +case 0xDDCF: +case 0xDFCF: + +// ADDA +case 0xD1C8: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)CPU->A[(Opcode >> 0) & 7]; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3D0: +case 0xD5D0: +case 0xD7D0: +case 0xD9D0: +case 0xDBD0: +case 0xDDD0: +case 0xDFD0: +case 0xD1D1: +case 0xD3D1: +case 0xD5D1: +case 0xD7D1: +case 0xD9D1: +case 0xDBD1: +case 0xDDD1: +case 0xDFD1: +case 0xD1D2: +case 0xD3D2: +case 0xD5D2: +case 0xD7D2: +case 0xD9D2: +case 0xDBD2: +case 0xDDD2: +case 0xDFD2: +case 0xD1D3: +case 0xD3D3: +case 0xD5D3: +case 0xD7D3: +case 0xD9D3: +case 0xDBD3: +case 0xDDD3: +case 0xDFD3: +case 0xD1D4: +case 0xD3D4: +case 0xD5D4: +case 0xD7D4: +case 0xD9D4: +case 0xDBD4: +case 0xDDD4: +case 0xDFD4: +case 0xD1D5: +case 0xD3D5: +case 0xD5D5: +case 0xD7D5: +case 0xD9D5: +case 0xDBD5: +case 0xDDD5: +case 0xDFD5: +case 0xD1D6: +case 0xD3D6: +case 0xD5D6: +case 0xD7D6: +case 0xD9D6: +case 0xDBD6: +case 0xDDD6: +case 0xDFD6: +case 0xD1D7: +case 0xD3D7: +case 0xD5D7: +case 0xD7D7: +case 0xD9D7: +case 0xDBD7: +case 0xDDD7: +case 0xDFD7: + +// ADDA +case 0xD1D0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3D8: +case 0xD5D8: +case 0xD7D8: +case 0xD9D8: +case 0xDBD8: +case 0xDDD8: +case 0xDFD8: +case 0xD1D9: +case 0xD3D9: +case 0xD5D9: +case 0xD7D9: +case 0xD9D9: +case 0xDBD9: +case 0xDDD9: +case 0xDFD9: +case 0xD1DA: +case 0xD3DA: +case 0xD5DA: +case 0xD7DA: +case 0xD9DA: +case 0xDBDA: +case 0xDDDA: +case 0xDFDA: +case 0xD1DB: +case 0xD3DB: +case 0xD5DB: +case 0xD7DB: +case 0xD9DB: +case 0xDBDB: +case 0xDDDB: +case 0xDFDB: +case 0xD1DC: +case 0xD3DC: +case 0xD5DC: +case 0xD7DC: +case 0xD9DC: +case 0xDBDC: +case 0xDDDC: +case 0xDFDC: +case 0xD1DD: +case 0xD3DD: +case 0xD5DD: +case 0xD7DD: +case 0xD9DD: +case 0xDBDD: +case 0xDDDD: +case 0xDFDD: +case 0xD1DE: +case 0xD3DE: +case 0xD5DE: +case 0xD7DE: +case 0xD9DE: +case 0xDBDE: +case 0xDDDE: +case 0xDFDE: + +// ADDA +case 0xD1D8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 4; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3E0: +case 0xD5E0: +case 0xD7E0: +case 0xD9E0: +case 0xDBE0: +case 0xDDE0: +case 0xDFE0: +case 0xD1E1: +case 0xD3E1: +case 0xD5E1: +case 0xD7E1: +case 0xD9E1: +case 0xDBE1: +case 0xDDE1: +case 0xDFE1: +case 0xD1E2: +case 0xD3E2: +case 0xD5E2: +case 0xD7E2: +case 0xD9E2: +case 0xDBE2: +case 0xDDE2: +case 0xDFE2: +case 0xD1E3: +case 0xD3E3: +case 0xD5E3: +case 0xD7E3: +case 0xD9E3: +case 0xDBE3: +case 0xDDE3: +case 0xDFE3: +case 0xD1E4: +case 0xD3E4: +case 0xD5E4: +case 0xD7E4: +case 0xD9E4: +case 0xDBE4: +case 0xDDE4: +case 0xDFE4: +case 0xD1E5: +case 0xD3E5: +case 0xD5E5: +case 0xD7E5: +case 0xD9E5: +case 0xDBE5: +case 0xDDE5: +case 0xDFE5: +case 0xD1E6: +case 0xD3E6: +case 0xD5E6: +case 0xD7E6: +case 0xD9E6: +case 0xDBE6: +case 0xDDE6: +case 0xDFE6: + +// ADDA +case 0xD1E0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 4; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3E8: +case 0xD5E8: +case 0xD7E8: +case 0xD9E8: +case 0xDBE8: +case 0xDDE8: +case 0xDFE8: +case 0xD1E9: +case 0xD3E9: +case 0xD5E9: +case 0xD7E9: +case 0xD9E9: +case 0xDBE9: +case 0xDDE9: +case 0xDFE9: +case 0xD1EA: +case 0xD3EA: +case 0xD5EA: +case 0xD7EA: +case 0xD9EA: +case 0xDBEA: +case 0xDDEA: +case 0xDFEA: +case 0xD1EB: +case 0xD3EB: +case 0xD5EB: +case 0xD7EB: +case 0xD9EB: +case 0xDBEB: +case 0xDDEB: +case 0xDFEB: +case 0xD1EC: +case 0xD3EC: +case 0xD5EC: +case 0xD7EC: +case 0xD9EC: +case 0xDBEC: +case 0xDDEC: +case 0xDFEC: +case 0xD1ED: +case 0xD3ED: +case 0xD5ED: +case 0xD7ED: +case 0xD9ED: +case 0xDBED: +case 0xDDED: +case 0xDFED: +case 0xD1EE: +case 0xD3EE: +case 0xD5EE: +case 0xD7EE: +case 0xD9EE: +case 0xDBEE: +case 0xDDEE: +case 0xDFEE: +case 0xD1EF: +case 0xD3EF: +case 0xD5EF: +case 0xD7EF: +case 0xD9EF: +case 0xDBEF: +case 0xDDEF: +case 0xDFEF: + +// ADDA +case 0xD1E8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3F0: +case 0xD5F0: +case 0xD7F0: +case 0xD9F0: +case 0xDBF0: +case 0xDDF0: +case 0xDFF0: +case 0xD1F1: +case 0xD3F1: +case 0xD5F1: +case 0xD7F1: +case 0xD9F1: +case 0xDBF1: +case 0xDDF1: +case 0xDFF1: +case 0xD1F2: +case 0xD3F2: +case 0xD5F2: +case 0xD7F2: +case 0xD9F2: +case 0xDBF2: +case 0xDDF2: +case 0xDFF2: +case 0xD1F3: +case 0xD3F3: +case 0xD5F3: +case 0xD7F3: +case 0xD9F3: +case 0xDBF3: +case 0xDDF3: +case 0xDFF3: +case 0xD1F4: +case 0xD3F4: +case 0xD5F4: +case 0xD7F4: +case 0xD9F4: +case 0xDBF4: +case 0xDDF4: +case 0xDFF4: +case 0xD1F5: +case 0xD3F5: +case 0xD5F5: +case 0xD7F5: +case 0xD9F5: +case 0xDBF5: +case 0xDDF5: +case 0xDFF5: +case 0xD1F6: +case 0xD3F6: +case 0xD5F6: +case 0xD7F6: +case 0xD9F6: +case 0xDBF6: +case 0xDDF6: +case 0xDFF6: +case 0xD1F7: +case 0xD3F7: +case 0xD5F7: +case 0xD7F7: +case 0xD9F7: +case 0xDBF7: +case 0xDDF7: +case 0xDFF7: + +// ADDA +case 0xD1F0: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 8; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3F8: +case 0xD5F8: +case 0xD7F8: +case 0xD9F8: +case 0xDBF8: +case 0xDDF8: +case 0xDFF8: + +// ADDA +case 0xD1F8: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3F9: +case 0xD5F9: +case 0xD7F9: +case 0xD9F9: +case 0xDBF9: +case 0xDDF9: +case 0xDFF9: + +// ADDA +case 0xD1F9: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 10; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3FA: +case 0xD5FA: +case 0xD7FA: +case 0xD9FA: +case 0xDBFA: +case 0xDDFA: +case 0xDFFA: + +// ADDA +case 0xD1FA: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 6; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3FB: +case 0xD5FB: +case 0xD7FB: +case 0xD9FB: +case 0xDBFB: +case 0xDDFB: +case 0xDFFB: + +// ADDA +case 0xD1FB: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = PC; + DECODE_EXT_WORD + timestamp += 8; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3FC: +case 0xD5FC: +case 0xD7FC: +case 0xD9FC: +case 0xDBFC: +case 0xDDFC: +case 0xDFFC: + +// ADDA +case 0xD1FC: +{ + u32 res; + u32 dst; + u32 src; + src = (s32)(s32)FETCH_LONG; + PC += 4; + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(14) +case 0xD3DF: +case 0xD5DF: +case 0xD7DF: +case 0xD9DF: +case 0xDBDF: +case 0xDDDF: +case 0xDFDF: + +// ADDA +case 0xD1DF: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 4; + timestamp += 2; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) +case 0xD3E7: +case 0xD5E7: +case 0xD7E7: +case 0xD9E7: +case 0xDBE7: +case 0xDDE7: +case 0xDFE7: + +// ADDA +case 0xD1E7: +{ + u32 adr; + u32 res; + u32 dst; + u32 src; + adr = CPU->A[7] - 4; + CPU->A[7] = adr; + timestamp += 4; + READSX_LOat_F(adr, src) + dst = (u32)CPU->A[(Opcode >> 9) & 7]; + res = dst + src; + CPU->A[(Opcode >> 9) & 7] = res; +} +RET(6) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_opE.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_opE.inc new file mode 100644 index 0000000000..9955808d64 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_opE.inc @@ -0,0 +1,6034 @@ +case 0xE200: +case 0xE400: +case 0xE600: +case 0xE800: +case 0xEA00: +case 0xEC00: +case 0xEE00: +case 0xE001: +case 0xE201: +case 0xE401: +case 0xE601: +case 0xE801: +case 0xEA01: +case 0xEC01: +case 0xEE01: +case 0xE002: +case 0xE202: +case 0xE402: +case 0xE602: +case 0xE802: +case 0xEA02: +case 0xEC02: +case 0xEE02: +case 0xE003: +case 0xE203: +case 0xE403: +case 0xE603: +case 0xE803: +case 0xEA03: +case 0xEC03: +case 0xEE03: +case 0xE004: +case 0xE204: +case 0xE404: +case 0xE604: +case 0xE804: +case 0xEA04: +case 0xEC04: +case 0xEE04: +case 0xE005: +case 0xE205: +case 0xE405: +case 0xE605: +case 0xE805: +case 0xEA05: +case 0xEC05: +case 0xEE05: +case 0xE006: +case 0xE206: +case 0xE406: +case 0xE606: +case 0xE806: +case 0xEA06: +case 0xEC06: +case 0xEE06: +case 0xE007: +case 0xE207: +case 0xE407: +case 0xE607: +case 0xE807: +case 0xEA07: +case 0xEC07: +case 0xEE07: + +// ASRk +case 0xE000: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (s32)(s8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = ((s32)src) >> sft; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE240: +case 0xE440: +case 0xE640: +case 0xE840: +case 0xEA40: +case 0xEC40: +case 0xEE40: +case 0xE041: +case 0xE241: +case 0xE441: +case 0xE641: +case 0xE841: +case 0xEA41: +case 0xEC41: +case 0xEE41: +case 0xE042: +case 0xE242: +case 0xE442: +case 0xE642: +case 0xE842: +case 0xEA42: +case 0xEC42: +case 0xEE42: +case 0xE043: +case 0xE243: +case 0xE443: +case 0xE643: +case 0xE843: +case 0xEA43: +case 0xEC43: +case 0xEE43: +case 0xE044: +case 0xE244: +case 0xE444: +case 0xE644: +case 0xE844: +case 0xEA44: +case 0xEC44: +case 0xEE44: +case 0xE045: +case 0xE245: +case 0xE445: +case 0xE645: +case 0xE845: +case 0xEA45: +case 0xEC45: +case 0xEE45: +case 0xE046: +case 0xE246: +case 0xE446: +case 0xE646: +case 0xE846: +case 0xEA46: +case 0xEC46: +case 0xEE46: +case 0xE047: +case 0xE247: +case 0xE447: +case 0xE647: +case 0xE847: +case 0xEA47: +case 0xEC47: +case 0xEE47: + +// ASRk +case 0xE040: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = ((s32)src) >> sft; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE280: +case 0xE480: +case 0xE680: +case 0xE880: +case 0xEA80: +case 0xEC80: +case 0xEE80: +case 0xE081: +case 0xE281: +case 0xE481: +case 0xE681: +case 0xE881: +case 0xEA81: +case 0xEC81: +case 0xEE81: +case 0xE082: +case 0xE282: +case 0xE482: +case 0xE682: +case 0xE882: +case 0xEA82: +case 0xEC82: +case 0xEE82: +case 0xE083: +case 0xE283: +case 0xE483: +case 0xE683: +case 0xE883: +case 0xEA83: +case 0xEC83: +case 0xEE83: +case 0xE084: +case 0xE284: +case 0xE484: +case 0xE684: +case 0xE884: +case 0xEA84: +case 0xEC84: +case 0xEE84: +case 0xE085: +case 0xE285: +case 0xE485: +case 0xE685: +case 0xE885: +case 0xEA85: +case 0xEC85: +case 0xEE85: +case 0xE086: +case 0xE286: +case 0xE486: +case 0xE686: +case 0xE886: +case 0xEA86: +case 0xEC86: +case 0xEE86: +case 0xE087: +case 0xE287: +case 0xE487: +case 0xE687: +case 0xE887: +case 0xEA87: +case 0xEC87: +case 0xEE87: + +// ASRk +case 0xE080: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (s32)(s32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = ((s32)src) >> sft; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE208: +case 0xE408: +case 0xE608: +case 0xE808: +case 0xEA08: +case 0xEC08: +case 0xEE08: +case 0xE009: +case 0xE209: +case 0xE409: +case 0xE609: +case 0xE809: +case 0xEA09: +case 0xEC09: +case 0xEE09: +case 0xE00A: +case 0xE20A: +case 0xE40A: +case 0xE60A: +case 0xE80A: +case 0xEA0A: +case 0xEC0A: +case 0xEE0A: +case 0xE00B: +case 0xE20B: +case 0xE40B: +case 0xE60B: +case 0xE80B: +case 0xEA0B: +case 0xEC0B: +case 0xEE0B: +case 0xE00C: +case 0xE20C: +case 0xE40C: +case 0xE60C: +case 0xE80C: +case 0xEA0C: +case 0xEC0C: +case 0xEE0C: +case 0xE00D: +case 0xE20D: +case 0xE40D: +case 0xE60D: +case 0xE80D: +case 0xEA0D: +case 0xEC0D: +case 0xEE0D: +case 0xE00E: +case 0xE20E: +case 0xE40E: +case 0xE60E: +case 0xE80E: +case 0xEA0E: +case 0xEC0E: +case 0xEE0E: +case 0xE00F: +case 0xE20F: +case 0xE40F: +case 0xE60F: +case 0xE80F: +case 0xEA0F: +case 0xEC0F: +case 0xEE0F: + +// LSRk +case 0xE008: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = src >> sft; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE248: +case 0xE448: +case 0xE648: +case 0xE848: +case 0xEA48: +case 0xEC48: +case 0xEE48: +case 0xE049: +case 0xE249: +case 0xE449: +case 0xE649: +case 0xE849: +case 0xEA49: +case 0xEC49: +case 0xEE49: +case 0xE04A: +case 0xE24A: +case 0xE44A: +case 0xE64A: +case 0xE84A: +case 0xEA4A: +case 0xEC4A: +case 0xEE4A: +case 0xE04B: +case 0xE24B: +case 0xE44B: +case 0xE64B: +case 0xE84B: +case 0xEA4B: +case 0xEC4B: +case 0xEE4B: +case 0xE04C: +case 0xE24C: +case 0xE44C: +case 0xE64C: +case 0xE84C: +case 0xEA4C: +case 0xEC4C: +case 0xEE4C: +case 0xE04D: +case 0xE24D: +case 0xE44D: +case 0xE64D: +case 0xE84D: +case 0xEA4D: +case 0xEC4D: +case 0xEE4D: +case 0xE04E: +case 0xE24E: +case 0xE44E: +case 0xE64E: +case 0xE84E: +case 0xEA4E: +case 0xEC4E: +case 0xEE4E: +case 0xE04F: +case 0xE24F: +case 0xE44F: +case 0xE64F: +case 0xE84F: +case 0xEA4F: +case 0xEC4F: +case 0xEE4F: + +// LSRk +case 0xE048: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = src >> sft; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE288: +case 0xE488: +case 0xE688: +case 0xE888: +case 0xEA88: +case 0xEC88: +case 0xEE88: +case 0xE089: +case 0xE289: +case 0xE489: +case 0xE689: +case 0xE889: +case 0xEA89: +case 0xEC89: +case 0xEE89: +case 0xE08A: +case 0xE28A: +case 0xE48A: +case 0xE68A: +case 0xE88A: +case 0xEA8A: +case 0xEC8A: +case 0xEE8A: +case 0xE08B: +case 0xE28B: +case 0xE48B: +case 0xE68B: +case 0xE88B: +case 0xEA8B: +case 0xEC8B: +case 0xEE8B: +case 0xE08C: +case 0xE28C: +case 0xE48C: +case 0xE68C: +case 0xE88C: +case 0xEA8C: +case 0xEC8C: +case 0xEE8C: +case 0xE08D: +case 0xE28D: +case 0xE48D: +case 0xE68D: +case 0xE88D: +case 0xEA8D: +case 0xEC8D: +case 0xEE8D: +case 0xE08E: +case 0xE28E: +case 0xE48E: +case 0xE68E: +case 0xE88E: +case 0xEA8E: +case 0xEC8E: +case 0xEE8E: +case 0xE08F: +case 0xE28F: +case 0xE48F: +case 0xE68F: +case 0xE88F: +case 0xEA8F: +case 0xEC8F: +case 0xEE8F: + +// LSRk +case 0xE088: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = src >> sft; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE210: +case 0xE410: +case 0xE610: +case 0xE810: +case 0xEA10: +case 0xEC10: +case 0xEE10: +case 0xE011: +case 0xE211: +case 0xE411: +case 0xE611: +case 0xE811: +case 0xEA11: +case 0xEC11: +case 0xEE11: +case 0xE012: +case 0xE212: +case 0xE412: +case 0xE612: +case 0xE812: +case 0xEA12: +case 0xEC12: +case 0xEE12: +case 0xE013: +case 0xE213: +case 0xE413: +case 0xE613: +case 0xE813: +case 0xEA13: +case 0xEC13: +case 0xEE13: +case 0xE014: +case 0xE214: +case 0xE414: +case 0xE614: +case 0xE814: +case 0xEA14: +case 0xEC14: +case 0xEE14: +case 0xE015: +case 0xE215: +case 0xE415: +case 0xE615: +case 0xE815: +case 0xEA15: +case 0xEC15: +case 0xEE15: +case 0xE016: +case 0xE216: +case 0xE416: +case 0xE616: +case 0xE816: +case 0xEA16: +case 0xEC16: +case 0xEE16: +case 0xE017: +case 0xE217: +case 0xE417: +case 0xE617: +case 0xE817: +case 0xEA17: +case 0xEC17: +case 0xEE17: + +// ROXRk +case 0xE010: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + src |= (CPU->flag_X & C68K_SR_X) << 0; + res = (src >> sft) | (src << (9 - sft)); + CPU->flag_X = CPU->flag_C = res >> 0; + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE250: +case 0xE450: +case 0xE650: +case 0xE850: +case 0xEA50: +case 0xEC50: +case 0xEE50: +case 0xE051: +case 0xE251: +case 0xE451: +case 0xE651: +case 0xE851: +case 0xEA51: +case 0xEC51: +case 0xEE51: +case 0xE052: +case 0xE252: +case 0xE452: +case 0xE652: +case 0xE852: +case 0xEA52: +case 0xEC52: +case 0xEE52: +case 0xE053: +case 0xE253: +case 0xE453: +case 0xE653: +case 0xE853: +case 0xEA53: +case 0xEC53: +case 0xEE53: +case 0xE054: +case 0xE254: +case 0xE454: +case 0xE654: +case 0xE854: +case 0xEA54: +case 0xEC54: +case 0xEE54: +case 0xE055: +case 0xE255: +case 0xE455: +case 0xE655: +case 0xE855: +case 0xEA55: +case 0xEC55: +case 0xEE55: +case 0xE056: +case 0xE256: +case 0xE456: +case 0xE656: +case 0xE856: +case 0xEA56: +case 0xEC56: +case 0xEE56: +case 0xE057: +case 0xE257: +case 0xE457: +case 0xE657: +case 0xE857: +case 0xEA57: +case 0xEC57: +case 0xEE57: + +// ROXRk +case 0xE050: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + src |= (CPU->flag_X & C68K_SR_X) << 8; + res = (src >> sft) | (src << (17 - sft)); + CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE290: +case 0xE490: +case 0xE690: +case 0xE890: +case 0xEA90: +case 0xEC90: +case 0xEE90: +case 0xE091: +case 0xE291: +case 0xE491: +case 0xE691: +case 0xE891: +case 0xEA91: +case 0xEC91: +case 0xEE91: +case 0xE092: +case 0xE292: +case 0xE492: +case 0xE692: +case 0xE892: +case 0xEA92: +case 0xEC92: +case 0xEE92: +case 0xE093: +case 0xE293: +case 0xE493: +case 0xE693: +case 0xE893: +case 0xEA93: +case 0xEC93: +case 0xEE93: +case 0xE094: +case 0xE294: +case 0xE494: +case 0xE694: +case 0xE894: +case 0xEA94: +case 0xEC94: +case 0xEE94: +case 0xE095: +case 0xE295: +case 0xE495: +case 0xE695: +case 0xE895: +case 0xEA95: +case 0xEC95: +case 0xEE95: +case 0xE096: +case 0xE296: +case 0xE496: +case 0xE696: +case 0xE896: +case 0xEA96: +case 0xEC96: +case 0xEE96: +case 0xE097: +case 0xE297: +case 0xE497: +case 0xE697: +case 0xE897: +case 0xEA97: +case 0xEC97: +case 0xEE97: + +// ROXRk +case 0xE090: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + if (sft == 1) res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + 1))); + else res = (src >> sft) | (src << (33 - sft)) | ((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + sft))); + CPU->flag_X = CPU->flag_C; + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE218: +case 0xE418: +case 0xE618: +case 0xE818: +case 0xEA18: +case 0xEC18: +case 0xEE18: +case 0xE019: +case 0xE219: +case 0xE419: +case 0xE619: +case 0xE819: +case 0xEA19: +case 0xEC19: +case 0xEE19: +case 0xE01A: +case 0xE21A: +case 0xE41A: +case 0xE61A: +case 0xE81A: +case 0xEA1A: +case 0xEC1A: +case 0xEE1A: +case 0xE01B: +case 0xE21B: +case 0xE41B: +case 0xE61B: +case 0xE81B: +case 0xEA1B: +case 0xEC1B: +case 0xEE1B: +case 0xE01C: +case 0xE21C: +case 0xE41C: +case 0xE61C: +case 0xE81C: +case 0xEA1C: +case 0xEC1C: +case 0xEE1C: +case 0xE01D: +case 0xE21D: +case 0xE41D: +case 0xE61D: +case 0xE81D: +case 0xEA1D: +case 0xEC1D: +case 0xEE1D: +case 0xE01E: +case 0xE21E: +case 0xE41E: +case 0xE61E: +case 0xE81E: +case 0xEA1E: +case 0xEC1E: +case 0xEE1E: +case 0xE01F: +case 0xE21F: +case 0xE41F: +case 0xE61F: +case 0xE81F: +case 0xEA1F: +case 0xEC1F: +case 0xEE1F: + +// RORk +case 0xE018: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = (src >> sft) | (src << (8 - sft)); + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE258: +case 0xE458: +case 0xE658: +case 0xE858: +case 0xEA58: +case 0xEC58: +case 0xEE58: +case 0xE059: +case 0xE259: +case 0xE459: +case 0xE659: +case 0xE859: +case 0xEA59: +case 0xEC59: +case 0xEE59: +case 0xE05A: +case 0xE25A: +case 0xE45A: +case 0xE65A: +case 0xE85A: +case 0xEA5A: +case 0xEC5A: +case 0xEE5A: +case 0xE05B: +case 0xE25B: +case 0xE45B: +case 0xE65B: +case 0xE85B: +case 0xEA5B: +case 0xEC5B: +case 0xEE5B: +case 0xE05C: +case 0xE25C: +case 0xE45C: +case 0xE65C: +case 0xE85C: +case 0xEA5C: +case 0xEC5C: +case 0xEE5C: +case 0xE05D: +case 0xE25D: +case 0xE45D: +case 0xE65D: +case 0xE85D: +case 0xEA5D: +case 0xEC5D: +case 0xEE5D: +case 0xE05E: +case 0xE25E: +case 0xE45E: +case 0xE65E: +case 0xE85E: +case 0xEA5E: +case 0xEC5E: +case 0xEE5E: +case 0xE05F: +case 0xE25F: +case 0xE45F: +case 0xE65F: +case 0xE85F: +case 0xEA5F: +case 0xEC5F: +case 0xEE5F: + +// RORk +case 0xE058: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = (src >> sft) | (src << (16 - sft)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE298: +case 0xE498: +case 0xE698: +case 0xE898: +case 0xEA98: +case 0xEC98: +case 0xEE98: +case 0xE099: +case 0xE299: +case 0xE499: +case 0xE699: +case 0xE899: +case 0xEA99: +case 0xEC99: +case 0xEE99: +case 0xE09A: +case 0xE29A: +case 0xE49A: +case 0xE69A: +case 0xE89A: +case 0xEA9A: +case 0xEC9A: +case 0xEE9A: +case 0xE09B: +case 0xE29B: +case 0xE49B: +case 0xE69B: +case 0xE89B: +case 0xEA9B: +case 0xEC9B: +case 0xEE9B: +case 0xE09C: +case 0xE29C: +case 0xE49C: +case 0xE69C: +case 0xE89C: +case 0xEA9C: +case 0xEC9C: +case 0xEE9C: +case 0xE09D: +case 0xE29D: +case 0xE49D: +case 0xE69D: +case 0xE89D: +case 0xEA9D: +case 0xEC9D: +case 0xEE9D: +case 0xE09E: +case 0xE29E: +case 0xE49E: +case 0xE69E: +case 0xE89E: +case 0xEA9E: +case 0xEC9E: +case 0xEE9E: +case 0xE09F: +case 0xE29F: +case 0xE49F: +case 0xE69F: +case 0xE89F: +case 0xEA9F: +case 0xEC9F: +case 0xEE9F: + +// RORk +case 0xE098: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = (src >> sft) | (src << (32 - sft)); + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE300: +case 0xE500: +case 0xE700: +case 0xE900: +case 0xEB00: +case 0xED00: +case 0xEF00: +case 0xE101: +case 0xE301: +case 0xE501: +case 0xE701: +case 0xE901: +case 0xEB01: +case 0xED01: +case 0xEF01: +case 0xE102: +case 0xE302: +case 0xE502: +case 0xE702: +case 0xE902: +case 0xEB02: +case 0xED02: +case 0xEF02: +case 0xE103: +case 0xE303: +case 0xE503: +case 0xE703: +case 0xE903: +case 0xEB03: +case 0xED03: +case 0xEF03: +case 0xE104: +case 0xE304: +case 0xE504: +case 0xE704: +case 0xE904: +case 0xEB04: +case 0xED04: +case 0xEF04: +case 0xE105: +case 0xE305: +case 0xE505: +case 0xE705: +case 0xE905: +case 0xEB05: +case 0xED05: +case 0xEF05: +case 0xE106: +case 0xE306: +case 0xE506: +case 0xE706: +case 0xE906: +case 0xEB06: +case 0xED06: +case 0xEF06: +case 0xE107: +case 0xE307: +case 0xE507: +case 0xE707: +case 0xE907: +case 0xEB07: +case 0xED07: +case 0xEF07: + +// ASLk +case 0xE100: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft < 8) + { + CPU->flag_X = CPU->flag_C = src << (0 + sft); + res = src << sft; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_V = 0; + if ((sft > 7) && (src)) CPU->flag_V = C68K_SR_V; + else + { + u32 msk = (((s32)0x80000000) >> (sft + 24)) & 0x000000FF; + src &= msk; + if ((src) && (src != msk)) CPU->flag_V = C68K_SR_V; + } + RET(6) + } + + if (src) CPU->flag_V = C68K_SR_V; + else CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_N = 0; + CPU->flag_notZ = 0; +} +RET(6) +case 0xE340: +case 0xE540: +case 0xE740: +case 0xE940: +case 0xEB40: +case 0xED40: +case 0xEF40: +case 0xE141: +case 0xE341: +case 0xE541: +case 0xE741: +case 0xE941: +case 0xEB41: +case 0xED41: +case 0xEF41: +case 0xE142: +case 0xE342: +case 0xE542: +case 0xE742: +case 0xE942: +case 0xEB42: +case 0xED42: +case 0xEF42: +case 0xE143: +case 0xE343: +case 0xE543: +case 0xE743: +case 0xE943: +case 0xEB43: +case 0xED43: +case 0xEF43: +case 0xE144: +case 0xE344: +case 0xE544: +case 0xE744: +case 0xE944: +case 0xEB44: +case 0xED44: +case 0xEF44: +case 0xE145: +case 0xE345: +case 0xE545: +case 0xE745: +case 0xE945: +case 0xEB45: +case 0xED45: +case 0xEF45: +case 0xE146: +case 0xE346: +case 0xE546: +case 0xE746: +case 0xE946: +case 0xEB46: +case 0xED46: +case 0xEF46: +case 0xE147: +case 0xE347: +case 0xE547: +case 0xE747: +case 0xE947: +case 0xEB47: +case 0xED47: +case 0xEF47: + +// ASLk +case 0xE140: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_X = CPU->flag_C = src >> (8 - sft); + res = src << sft; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_V = 0; + { + u32 msk = (((s32)0x80000000) >> (sft + 16)) & 0x0000FFFF; + src &= msk; + if ((src) && (src != msk)) CPU->flag_V = C68K_SR_V; + } +} +RET(6) +case 0xE380: +case 0xE580: +case 0xE780: +case 0xE980: +case 0xEB80: +case 0xED80: +case 0xEF80: +case 0xE181: +case 0xE381: +case 0xE581: +case 0xE781: +case 0xE981: +case 0xEB81: +case 0xED81: +case 0xEF81: +case 0xE182: +case 0xE382: +case 0xE582: +case 0xE782: +case 0xE982: +case 0xEB82: +case 0xED82: +case 0xEF82: +case 0xE183: +case 0xE383: +case 0xE583: +case 0xE783: +case 0xE983: +case 0xEB83: +case 0xED83: +case 0xEF83: +case 0xE184: +case 0xE384: +case 0xE584: +case 0xE784: +case 0xE984: +case 0xEB84: +case 0xED84: +case 0xEF84: +case 0xE185: +case 0xE385: +case 0xE585: +case 0xE785: +case 0xE985: +case 0xEB85: +case 0xED85: +case 0xEF85: +case 0xE186: +case 0xE386: +case 0xE586: +case 0xE786: +case 0xE986: +case 0xEB86: +case 0xED86: +case 0xEF86: +case 0xE187: +case 0xE387: +case 0xE587: +case 0xE787: +case 0xE987: +case 0xEB87: +case 0xED87: +case 0xEF87: + +// ASLk +case 0xE180: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_X = CPU->flag_C = src >> (24 - sft); + res = src << sft; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res & 0xFFFFFFFF; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_V = 0; + { + u32 msk = (((s32)0x80000000) >> (sft + 0)) & 0xFFFFFFFF; + src &= msk; + if ((src) && (src != msk)) CPU->flag_V = C68K_SR_V; + } +} +RET(8) +case 0xE308: +case 0xE508: +case 0xE708: +case 0xE908: +case 0xEB08: +case 0xED08: +case 0xEF08: +case 0xE109: +case 0xE309: +case 0xE509: +case 0xE709: +case 0xE909: +case 0xEB09: +case 0xED09: +case 0xEF09: +case 0xE10A: +case 0xE30A: +case 0xE50A: +case 0xE70A: +case 0xE90A: +case 0xEB0A: +case 0xED0A: +case 0xEF0A: +case 0xE10B: +case 0xE30B: +case 0xE50B: +case 0xE70B: +case 0xE90B: +case 0xEB0B: +case 0xED0B: +case 0xEF0B: +case 0xE10C: +case 0xE30C: +case 0xE50C: +case 0xE70C: +case 0xE90C: +case 0xEB0C: +case 0xED0C: +case 0xEF0C: +case 0xE10D: +case 0xE30D: +case 0xE50D: +case 0xE70D: +case 0xE90D: +case 0xEB0D: +case 0xED0D: +case 0xEF0D: +case 0xE10E: +case 0xE30E: +case 0xE50E: +case 0xE70E: +case 0xE90E: +case 0xEB0E: +case 0xED0E: +case 0xEF0E: +case 0xE10F: +case 0xE30F: +case 0xE50F: +case 0xE70F: +case 0xE90F: +case 0xEB0F: +case 0xED0F: +case 0xEF0F: + +// LSLk +case 0xE108: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << (0 + sft); + res = src << sft; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE348: +case 0xE548: +case 0xE748: +case 0xE948: +case 0xEB48: +case 0xED48: +case 0xEF48: +case 0xE149: +case 0xE349: +case 0xE549: +case 0xE749: +case 0xE949: +case 0xEB49: +case 0xED49: +case 0xEF49: +case 0xE14A: +case 0xE34A: +case 0xE54A: +case 0xE74A: +case 0xE94A: +case 0xEB4A: +case 0xED4A: +case 0xEF4A: +case 0xE14B: +case 0xE34B: +case 0xE54B: +case 0xE74B: +case 0xE94B: +case 0xEB4B: +case 0xED4B: +case 0xEF4B: +case 0xE14C: +case 0xE34C: +case 0xE54C: +case 0xE74C: +case 0xE94C: +case 0xEB4C: +case 0xED4C: +case 0xEF4C: +case 0xE14D: +case 0xE34D: +case 0xE54D: +case 0xE74D: +case 0xE94D: +case 0xEB4D: +case 0xED4D: +case 0xEF4D: +case 0xE14E: +case 0xE34E: +case 0xE54E: +case 0xE74E: +case 0xE94E: +case 0xEB4E: +case 0xED4E: +case 0xEF4E: +case 0xE14F: +case 0xE34F: +case 0xE54F: +case 0xE74F: +case 0xE94F: +case 0xEB4F: +case 0xED4F: +case 0xEF4F: + +// LSLk +case 0xE148: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> (8 - sft); + res = src << sft; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE388: +case 0xE588: +case 0xE788: +case 0xE988: +case 0xEB88: +case 0xED88: +case 0xEF88: +case 0xE189: +case 0xE389: +case 0xE589: +case 0xE789: +case 0xE989: +case 0xEB89: +case 0xED89: +case 0xEF89: +case 0xE18A: +case 0xE38A: +case 0xE58A: +case 0xE78A: +case 0xE98A: +case 0xEB8A: +case 0xED8A: +case 0xEF8A: +case 0xE18B: +case 0xE38B: +case 0xE58B: +case 0xE78B: +case 0xE98B: +case 0xEB8B: +case 0xED8B: +case 0xEF8B: +case 0xE18C: +case 0xE38C: +case 0xE58C: +case 0xE78C: +case 0xE98C: +case 0xEB8C: +case 0xED8C: +case 0xEF8C: +case 0xE18D: +case 0xE38D: +case 0xE58D: +case 0xE78D: +case 0xE98D: +case 0xEB8D: +case 0xED8D: +case 0xEF8D: +case 0xE18E: +case 0xE38E: +case 0xE58E: +case 0xE78E: +case 0xE98E: +case 0xEB8E: +case 0xED8E: +case 0xEF8E: +case 0xE18F: +case 0xE38F: +case 0xE58F: +case 0xE78F: +case 0xE98F: +case 0xEB8F: +case 0xED8F: +case 0xEF8F: + +// LSLk +case 0xE188: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> (24 - sft); + res = src << sft; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res & 0xFFFFFFFF; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE310: +case 0xE510: +case 0xE710: +case 0xE910: +case 0xEB10: +case 0xED10: +case 0xEF10: +case 0xE111: +case 0xE311: +case 0xE511: +case 0xE711: +case 0xE911: +case 0xEB11: +case 0xED11: +case 0xEF11: +case 0xE112: +case 0xE312: +case 0xE512: +case 0xE712: +case 0xE912: +case 0xEB12: +case 0xED12: +case 0xEF12: +case 0xE113: +case 0xE313: +case 0xE513: +case 0xE713: +case 0xE913: +case 0xEB13: +case 0xED13: +case 0xEF13: +case 0xE114: +case 0xE314: +case 0xE514: +case 0xE714: +case 0xE914: +case 0xEB14: +case 0xED14: +case 0xEF14: +case 0xE115: +case 0xE315: +case 0xE515: +case 0xE715: +case 0xE915: +case 0xEB15: +case 0xED15: +case 0xEF15: +case 0xE116: +case 0xE316: +case 0xE516: +case 0xE716: +case 0xE916: +case 0xEB16: +case 0xED16: +case 0xEF16: +case 0xE117: +case 0xE317: +case 0xE517: +case 0xE717: +case 0xE917: +case 0xEB17: +case 0xED17: +case 0xEF17: + +// ROXLk +case 0xE110: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + src |= (CPU->flag_X & C68K_SR_X) << 0; + res = (src << sft) | (src >> (9 - sft)); + CPU->flag_X = CPU->flag_C = res >> 0; + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE350: +case 0xE550: +case 0xE750: +case 0xE950: +case 0xEB50: +case 0xED50: +case 0xEF50: +case 0xE151: +case 0xE351: +case 0xE551: +case 0xE751: +case 0xE951: +case 0xEB51: +case 0xED51: +case 0xEF51: +case 0xE152: +case 0xE352: +case 0xE552: +case 0xE752: +case 0xE952: +case 0xEB52: +case 0xED52: +case 0xEF52: +case 0xE153: +case 0xE353: +case 0xE553: +case 0xE753: +case 0xE953: +case 0xEB53: +case 0xED53: +case 0xEF53: +case 0xE154: +case 0xE354: +case 0xE554: +case 0xE754: +case 0xE954: +case 0xEB54: +case 0xED54: +case 0xEF54: +case 0xE155: +case 0xE355: +case 0xE555: +case 0xE755: +case 0xE955: +case 0xEB55: +case 0xED55: +case 0xEF55: +case 0xE156: +case 0xE356: +case 0xE556: +case 0xE756: +case 0xE956: +case 0xEB56: +case 0xED56: +case 0xEF56: +case 0xE157: +case 0xE357: +case 0xE557: +case 0xE757: +case 0xE957: +case 0xEB57: +case 0xED57: +case 0xEF57: + +// ROXLk +case 0xE150: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + src |= (CPU->flag_X & C68K_SR_X) << 8; + res = (src << sft) | (src >> (17 - sft)); + CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE390: +case 0xE590: +case 0xE790: +case 0xE990: +case 0xEB90: +case 0xED90: +case 0xEF90: +case 0xE191: +case 0xE391: +case 0xE591: +case 0xE791: +case 0xE991: +case 0xEB91: +case 0xED91: +case 0xEF91: +case 0xE192: +case 0xE392: +case 0xE592: +case 0xE792: +case 0xE992: +case 0xEB92: +case 0xED92: +case 0xEF92: +case 0xE193: +case 0xE393: +case 0xE593: +case 0xE793: +case 0xE993: +case 0xEB93: +case 0xED93: +case 0xEF93: +case 0xE194: +case 0xE394: +case 0xE594: +case 0xE794: +case 0xE994: +case 0xEB94: +case 0xED94: +case 0xEF94: +case 0xE195: +case 0xE395: +case 0xE595: +case 0xE795: +case 0xE995: +case 0xEB95: +case 0xED95: +case 0xEF95: +case 0xE196: +case 0xE396: +case 0xE596: +case 0xE796: +case 0xE996: +case 0xEB96: +case 0xED96: +case 0xEF96: +case 0xE197: +case 0xE397: +case 0xE597: +case 0xE797: +case 0xE997: +case 0xEB97: +case 0xED97: +case 0xEF97: + +// ROXLk +case 0xE190: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_C = src >> ((32 - C68K_SR_C_SFT) - sft); + if (sft == 1) res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> ((C68K_SR_X_SFT + 1) - 1)); + else res = (src << sft) | (src >> (33 - sft)) | ((CPU->flag_X & C68K_SR_X) >> ((C68K_SR_X_SFT + 1) - sft)); + CPU->flag_X = CPU->flag_C; + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE318: +case 0xE518: +case 0xE718: +case 0xE918: +case 0xEB18: +case 0xED18: +case 0xEF18: +case 0xE119: +case 0xE319: +case 0xE519: +case 0xE719: +case 0xE919: +case 0xEB19: +case 0xED19: +case 0xEF19: +case 0xE11A: +case 0xE31A: +case 0xE51A: +case 0xE71A: +case 0xE91A: +case 0xEB1A: +case 0xED1A: +case 0xEF1A: +case 0xE11B: +case 0xE31B: +case 0xE51B: +case 0xE71B: +case 0xE91B: +case 0xEB1B: +case 0xED1B: +case 0xEF1B: +case 0xE11C: +case 0xE31C: +case 0xE51C: +case 0xE71C: +case 0xE91C: +case 0xEB1C: +case 0xED1C: +case 0xEF1C: +case 0xE11D: +case 0xE31D: +case 0xE51D: +case 0xE71D: +case 0xE91D: +case 0xEB1D: +case 0xED1D: +case 0xEF1D: +case 0xE11E: +case 0xE31E: +case 0xE51E: +case 0xE71E: +case 0xE91E: +case 0xEB1E: +case 0xED1E: +case 0xEF1E: +case 0xE11F: +case 0xE31F: +case 0xE51F: +case 0xE71F: +case 0xE91F: +case 0xEB1F: +case 0xED1F: +case 0xEF1F: + +// ROLk +case 0xE118: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_C = src << (0 + sft); + res = (src << sft) | (src >> (8 - sft)); + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE358: +case 0xE558: +case 0xE758: +case 0xE958: +case 0xEB58: +case 0xED58: +case 0xEF58: +case 0xE159: +case 0xE359: +case 0xE559: +case 0xE759: +case 0xE959: +case 0xEB59: +case 0xED59: +case 0xEF59: +case 0xE15A: +case 0xE35A: +case 0xE55A: +case 0xE75A: +case 0xE95A: +case 0xEB5A: +case 0xED5A: +case 0xEF5A: +case 0xE15B: +case 0xE35B: +case 0xE55B: +case 0xE75B: +case 0xE95B: +case 0xEB5B: +case 0xED5B: +case 0xEF5B: +case 0xE15C: +case 0xE35C: +case 0xE55C: +case 0xE75C: +case 0xE95C: +case 0xEB5C: +case 0xED5C: +case 0xEF5C: +case 0xE15D: +case 0xE35D: +case 0xE55D: +case 0xE75D: +case 0xE95D: +case 0xEB5D: +case 0xED5D: +case 0xEF5D: +case 0xE15E: +case 0xE35E: +case 0xE55E: +case 0xE75E: +case 0xE95E: +case 0xEB5E: +case 0xED5E: +case 0xEF5E: +case 0xE15F: +case 0xE35F: +case 0xE55F: +case 0xE75F: +case 0xE95F: +case 0xEB5F: +case 0xED5F: +case 0xEF5F: + +// ROLk +case 0xE158: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_C = src >> (8 - sft); + res = (src << sft) | (src >> (16 - sft)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(6) +case 0xE398: +case 0xE598: +case 0xE798: +case 0xE998: +case 0xEB98: +case 0xED98: +case 0xEF98: +case 0xE199: +case 0xE399: +case 0xE599: +case 0xE799: +case 0xE999: +case 0xEB99: +case 0xED99: +case 0xEF99: +case 0xE19A: +case 0xE39A: +case 0xE59A: +case 0xE79A: +case 0xE99A: +case 0xEB9A: +case 0xED9A: +case 0xEF9A: +case 0xE19B: +case 0xE39B: +case 0xE59B: +case 0xE79B: +case 0xE99B: +case 0xEB9B: +case 0xED9B: +case 0xEF9B: +case 0xE19C: +case 0xE39C: +case 0xE59C: +case 0xE79C: +case 0xE99C: +case 0xEB9C: +case 0xED9C: +case 0xEF9C: +case 0xE19D: +case 0xE39D: +case 0xE59D: +case 0xE79D: +case 0xE99D: +case 0xEB9D: +case 0xED9D: +case 0xEF9D: +case 0xE19E: +case 0xE39E: +case 0xE59E: +case 0xE79E: +case 0xE99E: +case 0xEB9E: +case 0xED9E: +case 0xEF9E: +case 0xE19F: +case 0xE39F: +case 0xE59F: +case 0xE79F: +case 0xE99F: +case 0xEB9F: +case 0xED9F: +case 0xEF9F: + +// ROLk +case 0xE198: +{ + u32 res; + u32 src; + u32 sft; + + sft = (((Opcode >> 9) - 1) & 7) + 1; + timestamp += sft * 2; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + CPU->flag_V = 0; + CPU->flag_C = src >> (24 - sft); + res = (src << sft) | (src >> (32 - sft)); + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); +} +RET(8) +case 0xE220: +case 0xE420: +case 0xE620: +case 0xE820: +case 0xEA20: +case 0xEC20: +case 0xEE20: +case 0xE021: +case 0xE221: +case 0xE421: +case 0xE621: +case 0xE821: +case 0xEA21: +case 0xEC21: +case 0xEE21: +case 0xE022: +case 0xE222: +case 0xE422: +case 0xE622: +case 0xE822: +case 0xEA22: +case 0xEC22: +case 0xEE22: +case 0xE023: +case 0xE223: +case 0xE423: +case 0xE623: +case 0xE823: +case 0xEA23: +case 0xEC23: +case 0xEE23: +case 0xE024: +case 0xE224: +case 0xE424: +case 0xE624: +case 0xE824: +case 0xEA24: +case 0xEC24: +case 0xEE24: +case 0xE025: +case 0xE225: +case 0xE425: +case 0xE625: +case 0xE825: +case 0xEA25: +case 0xEC25: +case 0xEE25: +case 0xE026: +case 0xE226: +case 0xE426: +case 0xE626: +case 0xE826: +case 0xEA26: +case 0xEC26: +case 0xEE26: +case 0xE027: +case 0xE227: +case 0xE427: +case 0xE627: +case 0xE827: +case 0xEA27: +case 0xEC27: +case 0xEE27: + +// ASRD +case 0xE020: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (s32)(s8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 8) + { + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = ((s32)src) >> sft; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + if (src & (1 << 7)) + { + CPU->flag_N = C68K_SR_N; + CPU->flag_notZ = 1; + CPU->flag_V = 0; + CPU->flag_C = C68K_SR_C; + CPU->flag_X = C68K_SR_X; + res = 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_X = 0; + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE260: +case 0xE460: +case 0xE660: +case 0xE860: +case 0xEA60: +case 0xEC60: +case 0xEE60: +case 0xE061: +case 0xE261: +case 0xE461: +case 0xE661: +case 0xE861: +case 0xEA61: +case 0xEC61: +case 0xEE61: +case 0xE062: +case 0xE262: +case 0xE462: +case 0xE662: +case 0xE862: +case 0xEA62: +case 0xEC62: +case 0xEE62: +case 0xE063: +case 0xE263: +case 0xE463: +case 0xE663: +case 0xE863: +case 0xEA63: +case 0xEC63: +case 0xEE63: +case 0xE064: +case 0xE264: +case 0xE464: +case 0xE664: +case 0xE864: +case 0xEA64: +case 0xEC64: +case 0xEE64: +case 0xE065: +case 0xE265: +case 0xE465: +case 0xE665: +case 0xE865: +case 0xEA65: +case 0xEC65: +case 0xEE65: +case 0xE066: +case 0xE266: +case 0xE466: +case 0xE666: +case 0xE866: +case 0xEA66: +case 0xEC66: +case 0xEE66: +case 0xE067: +case 0xE267: +case 0xE467: +case 0xE667: +case 0xE867: +case 0xEA67: +case 0xEC67: +case 0xEE67: + +// ASRD +case 0xE060: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (s32)(s16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 16) + { + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = (src >> (sft - 1)) << C68K_SR_C_SFT; + res = ((s32)src) >> sft; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + if (src & (1 << 15)) + { + CPU->flag_N = C68K_SR_N; + CPU->flag_notZ = 1; + CPU->flag_V = 0; + CPU->flag_C = C68K_SR_C; + CPU->flag_X = C68K_SR_X; + res = 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_X = 0; + res = 0; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE2A0: +case 0xE4A0: +case 0xE6A0: +case 0xE8A0: +case 0xEAA0: +case 0xECA0: +case 0xEEA0: +case 0xE0A1: +case 0xE2A1: +case 0xE4A1: +case 0xE6A1: +case 0xE8A1: +case 0xEAA1: +case 0xECA1: +case 0xEEA1: +case 0xE0A2: +case 0xE2A2: +case 0xE4A2: +case 0xE6A2: +case 0xE8A2: +case 0xEAA2: +case 0xECA2: +case 0xEEA2: +case 0xE0A3: +case 0xE2A3: +case 0xE4A3: +case 0xE6A3: +case 0xE8A3: +case 0xEAA3: +case 0xECA3: +case 0xEEA3: +case 0xE0A4: +case 0xE2A4: +case 0xE4A4: +case 0xE6A4: +case 0xE8A4: +case 0xEAA4: +case 0xECA4: +case 0xEEA4: +case 0xE0A5: +case 0xE2A5: +case 0xE4A5: +case 0xE6A5: +case 0xE8A5: +case 0xEAA5: +case 0xECA5: +case 0xEEA5: +case 0xE0A6: +case 0xE2A6: +case 0xE4A6: +case 0xE6A6: +case 0xE8A6: +case 0xEAA6: +case 0xECA6: +case 0xEEA6: +case 0xE0A7: +case 0xE2A7: +case 0xE4A7: +case 0xE6A7: +case 0xE8A7: +case 0xEAA7: +case 0xECA7: +case 0xEEA7: + +// ASRD +case 0xE0A0: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (s32)(s32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 32) + { + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = (src >> (sft - 1)) << C68K_SR_C_SFT; + res = ((s32)src) >> sft; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + if (src & (1 << 31)) + { + CPU->flag_N = C68K_SR_N; + CPU->flag_notZ = 1; + CPU->flag_V = 0; + CPU->flag_C = C68K_SR_C; + CPU->flag_X = C68K_SR_X; + res = 0xFFFFFFFF; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_X = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE228: +case 0xE428: +case 0xE628: +case 0xE828: +case 0xEA28: +case 0xEC28: +case 0xEE28: +case 0xE029: +case 0xE229: +case 0xE429: +case 0xE629: +case 0xE829: +case 0xEA29: +case 0xEC29: +case 0xEE29: +case 0xE02A: +case 0xE22A: +case 0xE42A: +case 0xE62A: +case 0xE82A: +case 0xEA2A: +case 0xEC2A: +case 0xEE2A: +case 0xE02B: +case 0xE22B: +case 0xE42B: +case 0xE62B: +case 0xE82B: +case 0xEA2B: +case 0xEC2B: +case 0xEE2B: +case 0xE02C: +case 0xE22C: +case 0xE42C: +case 0xE62C: +case 0xE82C: +case 0xEA2C: +case 0xEC2C: +case 0xEE2C: +case 0xE02D: +case 0xE22D: +case 0xE42D: +case 0xE62D: +case 0xE82D: +case 0xEA2D: +case 0xEC2D: +case 0xEE2D: +case 0xE02E: +case 0xE22E: +case 0xE42E: +case 0xE62E: +case 0xE82E: +case 0xEA2E: +case 0xEC2E: +case 0xEE2E: +case 0xE02F: +case 0xE22F: +case 0xE42F: +case 0xE62F: +case 0xE82F: +case 0xEA2F: +case 0xEC2F: +case 0xEE2F: + +// LSRD +case 0xE028: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft <= 8) + { + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft); + res = src >> sft; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE268: +case 0xE468: +case 0xE668: +case 0xE868: +case 0xEA68: +case 0xEC68: +case 0xEE68: +case 0xE069: +case 0xE269: +case 0xE469: +case 0xE669: +case 0xE869: +case 0xEA69: +case 0xEC69: +case 0xEE69: +case 0xE06A: +case 0xE26A: +case 0xE46A: +case 0xE66A: +case 0xE86A: +case 0xEA6A: +case 0xEC6A: +case 0xEE6A: +case 0xE06B: +case 0xE26B: +case 0xE46B: +case 0xE66B: +case 0xE86B: +case 0xEA6B: +case 0xEC6B: +case 0xEE6B: +case 0xE06C: +case 0xE26C: +case 0xE46C: +case 0xE66C: +case 0xE86C: +case 0xEA6C: +case 0xEC6C: +case 0xEE6C: +case 0xE06D: +case 0xE26D: +case 0xE46D: +case 0xE66D: +case 0xE86D: +case 0xEA6D: +case 0xEC6D: +case 0xEE6D: +case 0xE06E: +case 0xE26E: +case 0xE46E: +case 0xE66E: +case 0xE86E: +case 0xEA6E: +case 0xEC6E: +case 0xEE6E: +case 0xE06F: +case 0xE26F: +case 0xE46F: +case 0xE66F: +case 0xE86F: +case 0xEA6F: +case 0xEC6F: +case 0xEE6F: + +// LSRD +case 0xE068: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft <= 16) + { + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = (src >> (sft - 1)) << C68K_SR_C_SFT; + res = src >> sft; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + res = 0; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE2A8: +case 0xE4A8: +case 0xE6A8: +case 0xE8A8: +case 0xEAA8: +case 0xECA8: +case 0xEEA8: +case 0xE0A9: +case 0xE2A9: +case 0xE4A9: +case 0xE6A9: +case 0xE8A9: +case 0xEAA9: +case 0xECA9: +case 0xEEA9: +case 0xE0AA: +case 0xE2AA: +case 0xE4AA: +case 0xE6AA: +case 0xE8AA: +case 0xEAAA: +case 0xECAA: +case 0xEEAA: +case 0xE0AB: +case 0xE2AB: +case 0xE4AB: +case 0xE6AB: +case 0xE8AB: +case 0xEAAB: +case 0xECAB: +case 0xEEAB: +case 0xE0AC: +case 0xE2AC: +case 0xE4AC: +case 0xE6AC: +case 0xE8AC: +case 0xEAAC: +case 0xECAC: +case 0xEEAC: +case 0xE0AD: +case 0xE2AD: +case 0xE4AD: +case 0xE6AD: +case 0xE8AD: +case 0xEAAD: +case 0xECAD: +case 0xEEAD: +case 0xE0AE: +case 0xE2AE: +case 0xE4AE: +case 0xE6AE: +case 0xE8AE: +case 0xEAAE: +case 0xECAE: +case 0xEEAE: +case 0xE0AF: +case 0xE2AF: +case 0xE4AF: +case 0xE6AF: +case 0xE8AF: +case 0xEAAF: +case 0xECAF: +case 0xEEAF: + +// LSRD +case 0xE0A8: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 32) + { + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = (src >> (sft - 1)) << C68K_SR_C_SFT; + res = src >> sft; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + if (sft == 32) CPU->flag_C = src >> (31 - C68K_SR_C_SFT); + else CPU->flag_C = 0; + CPU->flag_X = CPU->flag_C; + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE230: +case 0xE430: +case 0xE630: +case 0xE830: +case 0xEA30: +case 0xEC30: +case 0xEE30: +case 0xE031: +case 0xE231: +case 0xE431: +case 0xE631: +case 0xE831: +case 0xEA31: +case 0xEC31: +case 0xEE31: +case 0xE032: +case 0xE232: +case 0xE432: +case 0xE632: +case 0xE832: +case 0xEA32: +case 0xEC32: +case 0xEE32: +case 0xE033: +case 0xE233: +case 0xE433: +case 0xE633: +case 0xE833: +case 0xEA33: +case 0xEC33: +case 0xEE33: +case 0xE034: +case 0xE234: +case 0xE434: +case 0xE634: +case 0xE834: +case 0xEA34: +case 0xEC34: +case 0xEE34: +case 0xE035: +case 0xE235: +case 0xE435: +case 0xE635: +case 0xE835: +case 0xEA35: +case 0xEC35: +case 0xEE35: +case 0xE036: +case 0xE236: +case 0xE436: +case 0xE636: +case 0xE836: +case 0xEA36: +case 0xEC36: +case 0xEE36: +case 0xE037: +case 0xE237: +case 0xE437: +case 0xE637: +case 0xE837: +case 0xEA37: +case 0xEC37: +case 0xEE37: + +// ROXRD +case 0xE030: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft %= 9; + + src |= (CPU->flag_X & C68K_SR_X) << 0; + res = (src >> sft) | (src << (9 - sft)); + CPU->flag_X = CPU->flag_C = res >> 0; + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = CPU->flag_X; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE270: +case 0xE470: +case 0xE670: +case 0xE870: +case 0xEA70: +case 0xEC70: +case 0xEE70: +case 0xE071: +case 0xE271: +case 0xE471: +case 0xE671: +case 0xE871: +case 0xEA71: +case 0xEC71: +case 0xEE71: +case 0xE072: +case 0xE272: +case 0xE472: +case 0xE672: +case 0xE872: +case 0xEA72: +case 0xEC72: +case 0xEE72: +case 0xE073: +case 0xE273: +case 0xE473: +case 0xE673: +case 0xE873: +case 0xEA73: +case 0xEC73: +case 0xEE73: +case 0xE074: +case 0xE274: +case 0xE474: +case 0xE674: +case 0xE874: +case 0xEA74: +case 0xEC74: +case 0xEE74: +case 0xE075: +case 0xE275: +case 0xE475: +case 0xE675: +case 0xE875: +case 0xEA75: +case 0xEC75: +case 0xEE75: +case 0xE076: +case 0xE276: +case 0xE476: +case 0xE676: +case 0xE876: +case 0xEA76: +case 0xEC76: +case 0xEE76: +case 0xE077: +case 0xE277: +case 0xE477: +case 0xE677: +case 0xE877: +case 0xEA77: +case 0xEC77: +case 0xEE77: + +// ROXRD +case 0xE070: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft %= 17; + + src |= (CPU->flag_X & C68K_SR_X) << 8; + res = (src >> sft) | (src << (17 - sft)); + CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = CPU->flag_X; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE2B0: +case 0xE4B0: +case 0xE6B0: +case 0xE8B0: +case 0xEAB0: +case 0xECB0: +case 0xEEB0: +case 0xE0B1: +case 0xE2B1: +case 0xE4B1: +case 0xE6B1: +case 0xE8B1: +case 0xEAB1: +case 0xECB1: +case 0xEEB1: +case 0xE0B2: +case 0xE2B2: +case 0xE4B2: +case 0xE6B2: +case 0xE8B2: +case 0xEAB2: +case 0xECB2: +case 0xEEB2: +case 0xE0B3: +case 0xE2B3: +case 0xE4B3: +case 0xE6B3: +case 0xE8B3: +case 0xEAB3: +case 0xECB3: +case 0xEEB3: +case 0xE0B4: +case 0xE2B4: +case 0xE4B4: +case 0xE6B4: +case 0xE8B4: +case 0xEAB4: +case 0xECB4: +case 0xEEB4: +case 0xE0B5: +case 0xE2B5: +case 0xE4B5: +case 0xE6B5: +case 0xE8B5: +case 0xEAB5: +case 0xECB5: +case 0xEEB5: +case 0xE0B6: +case 0xE2B6: +case 0xE4B6: +case 0xE6B6: +case 0xE8B6: +case 0xEAB6: +case 0xECB6: +case 0xEEB6: +case 0xE0B7: +case 0xE2B7: +case 0xE4B7: +case 0xE6B7: +case 0xE8B7: +case 0xEAB7: +case 0xECB7: +case 0xEEB7: + +// ROXRD +case 0xE0B0: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft %= 33; + + if (sft != 0) + { + if (sft == 1) res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + 1))); + else res = (src >> sft) | (src << (33 - sft)) | (((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + 1))) >> (sft - 1)); + CPU->flag_X = (src >> (32 - sft)) << C68K_SR_X_SFT; + } + else res = src; + CPU->flag_C = CPU->flag_X; + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = CPU->flag_X; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE238: +case 0xE438: +case 0xE638: +case 0xE838: +case 0xEA38: +case 0xEC38: +case 0xEE38: +case 0xE039: +case 0xE239: +case 0xE439: +case 0xE639: +case 0xE839: +case 0xEA39: +case 0xEC39: +case 0xEE39: +case 0xE03A: +case 0xE23A: +case 0xE43A: +case 0xE63A: +case 0xE83A: +case 0xEA3A: +case 0xEC3A: +case 0xEE3A: +case 0xE03B: +case 0xE23B: +case 0xE43B: +case 0xE63B: +case 0xE83B: +case 0xEA3B: +case 0xEC3B: +case 0xEE3B: +case 0xE03C: +case 0xE23C: +case 0xE43C: +case 0xE63C: +case 0xE83C: +case 0xEA3C: +case 0xEC3C: +case 0xEE3C: +case 0xE03D: +case 0xE23D: +case 0xE43D: +case 0xE63D: +case 0xE83D: +case 0xEA3D: +case 0xEC3D: +case 0xEE3D: +case 0xE03E: +case 0xE23E: +case 0xE43E: +case 0xE63E: +case 0xE83E: +case 0xEA3E: +case 0xEC3E: +case 0xEE3E: +case 0xE03F: +case 0xE23F: +case 0xE43F: +case 0xE63F: +case 0xE83F: +case 0xEA3F: +case 0xEC3F: +case 0xEE3F: + +// RORD +case 0xE038: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft &= 0x07; + + CPU->flag_C = src << (C68K_SR_C_SFT - ((sft - 1) & 7)); + res = (src >> sft) | (src << (8 - sft)); + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE278: +case 0xE478: +case 0xE678: +case 0xE878: +case 0xEA78: +case 0xEC78: +case 0xEE78: +case 0xE079: +case 0xE279: +case 0xE479: +case 0xE679: +case 0xE879: +case 0xEA79: +case 0xEC79: +case 0xEE79: +case 0xE07A: +case 0xE27A: +case 0xE47A: +case 0xE67A: +case 0xE87A: +case 0xEA7A: +case 0xEC7A: +case 0xEE7A: +case 0xE07B: +case 0xE27B: +case 0xE47B: +case 0xE67B: +case 0xE87B: +case 0xEA7B: +case 0xEC7B: +case 0xEE7B: +case 0xE07C: +case 0xE27C: +case 0xE47C: +case 0xE67C: +case 0xE87C: +case 0xEA7C: +case 0xEC7C: +case 0xEE7C: +case 0xE07D: +case 0xE27D: +case 0xE47D: +case 0xE67D: +case 0xE87D: +case 0xEA7D: +case 0xEC7D: +case 0xEE7D: +case 0xE07E: +case 0xE27E: +case 0xE47E: +case 0xE67E: +case 0xE87E: +case 0xEA7E: +case 0xEC7E: +case 0xEE7E: +case 0xE07F: +case 0xE27F: +case 0xE47F: +case 0xE67F: +case 0xE87F: +case 0xEA7F: +case 0xEC7F: +case 0xEE7F: + +// RORD +case 0xE078: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft &= 0x0F; + + CPU->flag_C = (src >> ((sft - 1) & 15)) << C68K_SR_C_SFT; + res = (src >> sft) | (src << (16 - sft)); + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE2B8: +case 0xE4B8: +case 0xE6B8: +case 0xE8B8: +case 0xEAB8: +case 0xECB8: +case 0xEEB8: +case 0xE0B9: +case 0xE2B9: +case 0xE4B9: +case 0xE6B9: +case 0xE8B9: +case 0xEAB9: +case 0xECB9: +case 0xEEB9: +case 0xE0BA: +case 0xE2BA: +case 0xE4BA: +case 0xE6BA: +case 0xE8BA: +case 0xEABA: +case 0xECBA: +case 0xEEBA: +case 0xE0BB: +case 0xE2BB: +case 0xE4BB: +case 0xE6BB: +case 0xE8BB: +case 0xEABB: +case 0xECBB: +case 0xEEBB: +case 0xE0BC: +case 0xE2BC: +case 0xE4BC: +case 0xE6BC: +case 0xE8BC: +case 0xEABC: +case 0xECBC: +case 0xEEBC: +case 0xE0BD: +case 0xE2BD: +case 0xE4BD: +case 0xE6BD: +case 0xE8BD: +case 0xEABD: +case 0xECBD: +case 0xEEBD: +case 0xE0BE: +case 0xE2BE: +case 0xE4BE: +case 0xE6BE: +case 0xE8BE: +case 0xEABE: +case 0xECBE: +case 0xEEBE: +case 0xE0BF: +case 0xE2BF: +case 0xE4BF: +case 0xE6BF: +case 0xE8BF: +case 0xEABF: +case 0xECBF: +case 0xEEBF: + +// RORD +case 0xE0B8: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft &= 0x1F; + + CPU->flag_C = (src >> ((sft - 1) & 31)) << C68K_SR_C_SFT; + res = (src >> sft) | (src << (32 - sft)); + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE320: +case 0xE520: +case 0xE720: +case 0xE920: +case 0xEB20: +case 0xED20: +case 0xEF20: +case 0xE121: +case 0xE321: +case 0xE521: +case 0xE721: +case 0xE921: +case 0xEB21: +case 0xED21: +case 0xEF21: +case 0xE122: +case 0xE322: +case 0xE522: +case 0xE722: +case 0xE922: +case 0xEB22: +case 0xED22: +case 0xEF22: +case 0xE123: +case 0xE323: +case 0xE523: +case 0xE723: +case 0xE923: +case 0xEB23: +case 0xED23: +case 0xEF23: +case 0xE124: +case 0xE324: +case 0xE524: +case 0xE724: +case 0xE924: +case 0xEB24: +case 0xED24: +case 0xEF24: +case 0xE125: +case 0xE325: +case 0xE525: +case 0xE725: +case 0xE925: +case 0xEB25: +case 0xED25: +case 0xEF25: +case 0xE126: +case 0xE326: +case 0xE526: +case 0xE726: +case 0xE926: +case 0xEB26: +case 0xED26: +case 0xEF26: +case 0xE127: +case 0xE327: +case 0xE527: +case 0xE727: +case 0xE927: +case 0xEB27: +case 0xED27: +case 0xEF27: + +// ASLD +case 0xE120: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 8) + { + CPU->flag_X = CPU->flag_C = (src << sft) >> 0; + res = (src << sft) & 0x000000FF; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_V = 0; + { + u32 msk = (((s32)0x80000000) >> (sft + 24)) & 0x000000FF; + src &= msk; + if ((src) && (src != msk)) CPU->flag_V = C68K_SR_V; + } + RET(6) + } + + if (sft == 8) CPU->flag_C = src << C68K_SR_C_SFT; + else CPU->flag_C = 0; + CPU->flag_X = CPU->flag_C; + if (src) CPU->flag_V = C68K_SR_V; + else CPU->flag_V = 0; + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_N = 0; + CPU->flag_notZ = 0; + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE360: +case 0xE560: +case 0xE760: +case 0xE960: +case 0xEB60: +case 0xED60: +case 0xEF60: +case 0xE161: +case 0xE361: +case 0xE561: +case 0xE761: +case 0xE961: +case 0xEB61: +case 0xED61: +case 0xEF61: +case 0xE162: +case 0xE362: +case 0xE562: +case 0xE762: +case 0xE962: +case 0xEB62: +case 0xED62: +case 0xEF62: +case 0xE163: +case 0xE363: +case 0xE563: +case 0xE763: +case 0xE963: +case 0xEB63: +case 0xED63: +case 0xEF63: +case 0xE164: +case 0xE364: +case 0xE564: +case 0xE764: +case 0xE964: +case 0xEB64: +case 0xED64: +case 0xEF64: +case 0xE165: +case 0xE365: +case 0xE565: +case 0xE765: +case 0xE965: +case 0xEB65: +case 0xED65: +case 0xEF65: +case 0xE166: +case 0xE366: +case 0xE566: +case 0xE766: +case 0xE966: +case 0xEB66: +case 0xED66: +case 0xEF66: +case 0xE167: +case 0xE367: +case 0xE567: +case 0xE767: +case 0xE967: +case 0xEB67: +case 0xED67: +case 0xEF67: + +// ASLD +case 0xE160: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 16) + { + CPU->flag_X = CPU->flag_C = (src << sft) >> 8; + res = (src << sft) & 0x0000FFFF; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_V = 0; + { + u32 msk = (((s32)0x80000000) >> (sft + 16)) & 0x0000FFFF; + src &= msk; + if ((src) && (src != msk)) CPU->flag_V = C68K_SR_V; + } + RET(6) + } + + if (sft == 16) CPU->flag_C = src << C68K_SR_C_SFT; + else CPU->flag_C = 0; + CPU->flag_X = CPU->flag_C; + if (src) CPU->flag_V = C68K_SR_V; + else CPU->flag_V = 0; + res = 0; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_N = 0; + CPU->flag_notZ = 0; + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE3A0: +case 0xE5A0: +case 0xE7A0: +case 0xE9A0: +case 0xEBA0: +case 0xEDA0: +case 0xEFA0: +case 0xE1A1: +case 0xE3A1: +case 0xE5A1: +case 0xE7A1: +case 0xE9A1: +case 0xEBA1: +case 0xEDA1: +case 0xEFA1: +case 0xE1A2: +case 0xE3A2: +case 0xE5A2: +case 0xE7A2: +case 0xE9A2: +case 0xEBA2: +case 0xEDA2: +case 0xEFA2: +case 0xE1A3: +case 0xE3A3: +case 0xE5A3: +case 0xE7A3: +case 0xE9A3: +case 0xEBA3: +case 0xEDA3: +case 0xEFA3: +case 0xE1A4: +case 0xE3A4: +case 0xE5A4: +case 0xE7A4: +case 0xE9A4: +case 0xEBA4: +case 0xEDA4: +case 0xEFA4: +case 0xE1A5: +case 0xE3A5: +case 0xE5A5: +case 0xE7A5: +case 0xE9A5: +case 0xEBA5: +case 0xEDA5: +case 0xEFA5: +case 0xE1A6: +case 0xE3A6: +case 0xE5A6: +case 0xE7A6: +case 0xE9A6: +case 0xEBA6: +case 0xEDA6: +case 0xEFA6: +case 0xE1A7: +case 0xE3A7: +case 0xE5A7: +case 0xE7A7: +case 0xE9A7: +case 0xEBA7: +case 0xEDA7: +case 0xEFA7: + +// ASLD +case 0xE1A0: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 32) + { + CPU->flag_X = CPU->flag_C = (src >> (32 - sft)) << C68K_SR_C_SFT; + res = src << sft; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_V = 0; + { + u32 msk = (((s32)0x80000000) >> (sft + 0)) & 0xFFFFFFFF; + src &= msk; + if ((src) && (src != msk)) CPU->flag_V = C68K_SR_V; + } + RET(8) + } + + if (sft == 32) CPU->flag_C = src << C68K_SR_C_SFT; + else CPU->flag_C = 0; + CPU->flag_X = CPU->flag_C; + if (src) CPU->flag_V = C68K_SR_V; + else CPU->flag_V = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + CPU->flag_N = 0; + CPU->flag_notZ = 0; + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE328: +case 0xE528: +case 0xE728: +case 0xE928: +case 0xEB28: +case 0xED28: +case 0xEF28: +case 0xE129: +case 0xE329: +case 0xE529: +case 0xE729: +case 0xE929: +case 0xEB29: +case 0xED29: +case 0xEF29: +case 0xE12A: +case 0xE32A: +case 0xE52A: +case 0xE72A: +case 0xE92A: +case 0xEB2A: +case 0xED2A: +case 0xEF2A: +case 0xE12B: +case 0xE32B: +case 0xE52B: +case 0xE72B: +case 0xE92B: +case 0xEB2B: +case 0xED2B: +case 0xEF2B: +case 0xE12C: +case 0xE32C: +case 0xE52C: +case 0xE72C: +case 0xE92C: +case 0xEB2C: +case 0xED2C: +case 0xEF2C: +case 0xE12D: +case 0xE32D: +case 0xE52D: +case 0xE72D: +case 0xE92D: +case 0xEB2D: +case 0xED2D: +case 0xEF2D: +case 0xE12E: +case 0xE32E: +case 0xE52E: +case 0xE72E: +case 0xE92E: +case 0xEB2E: +case 0xED2E: +case 0xEF2E: +case 0xE12F: +case 0xE32F: +case 0xE52F: +case 0xE72F: +case 0xE92F: +case 0xEB2F: +case 0xED2F: +case 0xEF2F: + +// LSLD +case 0xE128: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft <= 8) + { + CPU->flag_X = CPU->flag_C = (src << sft) >> 0; + res = (src << sft) & 0x000000FF; + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + res = 0; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE368: +case 0xE568: +case 0xE768: +case 0xE968: +case 0xEB68: +case 0xED68: +case 0xEF68: +case 0xE169: +case 0xE369: +case 0xE569: +case 0xE769: +case 0xE969: +case 0xEB69: +case 0xED69: +case 0xEF69: +case 0xE16A: +case 0xE36A: +case 0xE56A: +case 0xE76A: +case 0xE96A: +case 0xEB6A: +case 0xED6A: +case 0xEF6A: +case 0xE16B: +case 0xE36B: +case 0xE56B: +case 0xE76B: +case 0xE96B: +case 0xEB6B: +case 0xED6B: +case 0xEF6B: +case 0xE16C: +case 0xE36C: +case 0xE56C: +case 0xE76C: +case 0xE96C: +case 0xEB6C: +case 0xED6C: +case 0xEF6C: +case 0xE16D: +case 0xE36D: +case 0xE56D: +case 0xE76D: +case 0xE96D: +case 0xEB6D: +case 0xED6D: +case 0xEF6D: +case 0xE16E: +case 0xE36E: +case 0xE56E: +case 0xE76E: +case 0xE96E: +case 0xEB6E: +case 0xED6E: +case 0xEF6E: +case 0xE16F: +case 0xE36F: +case 0xE56F: +case 0xE76F: +case 0xE96F: +case 0xEB6F: +case 0xED6F: +case 0xEF6F: + +// LSLD +case 0xE168: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft <= 16) + { + CPU->flag_X = CPU->flag_C = (src << sft) >> 8; + res = (src << sft) & 0x0000FFFF; + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_X = CPU->flag_C = 0; + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + res = 0; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE3A8: +case 0xE5A8: +case 0xE7A8: +case 0xE9A8: +case 0xEBA8: +case 0xEDA8: +case 0xEFA8: +case 0xE1A9: +case 0xE3A9: +case 0xE5A9: +case 0xE7A9: +case 0xE9A9: +case 0xEBA9: +case 0xEDA9: +case 0xEFA9: +case 0xE1AA: +case 0xE3AA: +case 0xE5AA: +case 0xE7AA: +case 0xE9AA: +case 0xEBAA: +case 0xEDAA: +case 0xEFAA: +case 0xE1AB: +case 0xE3AB: +case 0xE5AB: +case 0xE7AB: +case 0xE9AB: +case 0xEBAB: +case 0xEDAB: +case 0xEFAB: +case 0xE1AC: +case 0xE3AC: +case 0xE5AC: +case 0xE7AC: +case 0xE9AC: +case 0xEBAC: +case 0xEDAC: +case 0xEFAC: +case 0xE1AD: +case 0xE3AD: +case 0xE5AD: +case 0xE7AD: +case 0xE9AD: +case 0xEBAD: +case 0xEDAD: +case 0xEFAD: +case 0xE1AE: +case 0xE3AE: +case 0xE5AE: +case 0xE7AE: +case 0xE9AE: +case 0xEBAE: +case 0xEDAE: +case 0xEFAE: +case 0xE1AF: +case 0xE3AF: +case 0xE5AF: +case 0xE7AF: +case 0xE9AF: +case 0xEBAF: +case 0xEDAF: +case 0xEFAF: + +// LSLD +case 0xE1A8: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft < 32) + { + CPU->flag_X = CPU->flag_C = (src >> (32 - sft)) << C68K_SR_C_SFT; + res = src << sft; + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + if (sft == 32) CPU->flag_C = src << C68K_SR_C_SFT; + else CPU->flag_C = 0; + CPU->flag_X = CPU->flag_C; + CPU->flag_N = 0; + CPU->flag_notZ = 0; + CPU->flag_V = 0; + res = 0; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE330: +case 0xE530: +case 0xE730: +case 0xE930: +case 0xEB30: +case 0xED30: +case 0xEF30: +case 0xE131: +case 0xE331: +case 0xE531: +case 0xE731: +case 0xE931: +case 0xEB31: +case 0xED31: +case 0xEF31: +case 0xE132: +case 0xE332: +case 0xE532: +case 0xE732: +case 0xE932: +case 0xEB32: +case 0xED32: +case 0xEF32: +case 0xE133: +case 0xE333: +case 0xE533: +case 0xE733: +case 0xE933: +case 0xEB33: +case 0xED33: +case 0xEF33: +case 0xE134: +case 0xE334: +case 0xE534: +case 0xE734: +case 0xE934: +case 0xEB34: +case 0xED34: +case 0xEF34: +case 0xE135: +case 0xE335: +case 0xE535: +case 0xE735: +case 0xE935: +case 0xEB35: +case 0xED35: +case 0xEF35: +case 0xE136: +case 0xE336: +case 0xE536: +case 0xE736: +case 0xE936: +case 0xEB36: +case 0xED36: +case 0xEF36: +case 0xE137: +case 0xE337: +case 0xE537: +case 0xE737: +case 0xE937: +case 0xEB37: +case 0xED37: +case 0xEF37: + +// ROXLD +case 0xE130: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft %= 9; + + src |= (CPU->flag_X & C68K_SR_X) << 0; + res = (src << sft) | (src >> (9 - sft)); + CPU->flag_X = CPU->flag_C = res >> 0; + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res & 0x000000FF; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = CPU->flag_X; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE370: +case 0xE570: +case 0xE770: +case 0xE970: +case 0xEB70: +case 0xED70: +case 0xEF70: +case 0xE171: +case 0xE371: +case 0xE571: +case 0xE771: +case 0xE971: +case 0xEB71: +case 0xED71: +case 0xEF71: +case 0xE172: +case 0xE372: +case 0xE572: +case 0xE772: +case 0xE972: +case 0xEB72: +case 0xED72: +case 0xEF72: +case 0xE173: +case 0xE373: +case 0xE573: +case 0xE773: +case 0xE973: +case 0xEB73: +case 0xED73: +case 0xEF73: +case 0xE174: +case 0xE374: +case 0xE574: +case 0xE774: +case 0xE974: +case 0xEB74: +case 0xED74: +case 0xEF74: +case 0xE175: +case 0xE375: +case 0xE575: +case 0xE775: +case 0xE975: +case 0xEB75: +case 0xED75: +case 0xEF75: +case 0xE176: +case 0xE376: +case 0xE576: +case 0xE776: +case 0xE976: +case 0xEB76: +case 0xED76: +case 0xEF76: +case 0xE177: +case 0xE377: +case 0xE577: +case 0xE777: +case 0xE977: +case 0xEB77: +case 0xED77: +case 0xEF77: + +// ROXLD +case 0xE170: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft %= 17; + + src |= (CPU->flag_X & C68K_SR_X) << 8; + res = (src << sft) | (src >> (17 - sft)); + CPU->flag_X = CPU->flag_C = res >> 8; + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = CPU->flag_X; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE3B0: +case 0xE5B0: +case 0xE7B0: +case 0xE9B0: +case 0xEBB0: +case 0xEDB0: +case 0xEFB0: +case 0xE1B1: +case 0xE3B1: +case 0xE5B1: +case 0xE7B1: +case 0xE9B1: +case 0xEBB1: +case 0xEDB1: +case 0xEFB1: +case 0xE1B2: +case 0xE3B2: +case 0xE5B2: +case 0xE7B2: +case 0xE9B2: +case 0xEBB2: +case 0xEDB2: +case 0xEFB2: +case 0xE1B3: +case 0xE3B3: +case 0xE5B3: +case 0xE7B3: +case 0xE9B3: +case 0xEBB3: +case 0xEDB3: +case 0xEFB3: +case 0xE1B4: +case 0xE3B4: +case 0xE5B4: +case 0xE7B4: +case 0xE9B4: +case 0xEBB4: +case 0xEDB4: +case 0xEFB4: +case 0xE1B5: +case 0xE3B5: +case 0xE5B5: +case 0xE7B5: +case 0xE9B5: +case 0xEBB5: +case 0xEDB5: +case 0xEFB5: +case 0xE1B6: +case 0xE3B6: +case 0xE5B6: +case 0xE7B6: +case 0xE9B6: +case 0xEBB6: +case 0xEDB6: +case 0xEFB6: +case 0xE1B7: +case 0xE3B7: +case 0xE5B7: +case 0xE7B7: +case 0xE9B7: +case 0xEBB7: +case 0xEDB7: +case 0xEFB7: + +// ROXLD +case 0xE1B0: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + sft %= 33; + + if (sft != 0) + { + if (sft == 1) res = (src << 1) | ((CPU->flag_X >> ((C68K_SR_X_SFT + 1) - 1)) & 1); + else res = (src << sft) | (src >> (33 - sft)) | (((CPU->flag_X >> ((C68K_SR_X_SFT + 1) - 1)) & 1) << (sft - 1)); + CPU->flag_X = (src >> (32 - sft)) << C68K_SR_X_SFT; + } + else res = src; + CPU->flag_C = CPU->flag_X; + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = CPU->flag_X; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE338: +case 0xE538: +case 0xE738: +case 0xE938: +case 0xEB38: +case 0xED38: +case 0xEF38: +case 0xE139: +case 0xE339: +case 0xE539: +case 0xE739: +case 0xE939: +case 0xEB39: +case 0xED39: +case 0xEF39: +case 0xE13A: +case 0xE33A: +case 0xE53A: +case 0xE73A: +case 0xE93A: +case 0xEB3A: +case 0xED3A: +case 0xEF3A: +case 0xE13B: +case 0xE33B: +case 0xE53B: +case 0xE73B: +case 0xE93B: +case 0xEB3B: +case 0xED3B: +case 0xEF3B: +case 0xE13C: +case 0xE33C: +case 0xE53C: +case 0xE73C: +case 0xE93C: +case 0xEB3C: +case 0xED3C: +case 0xEF3C: +case 0xE13D: +case 0xE33D: +case 0xE53D: +case 0xE73D: +case 0xE93D: +case 0xEB3D: +case 0xED3D: +case 0xEF3D: +case 0xE13E: +case 0xE33E: +case 0xE53E: +case 0xE73E: +case 0xE93E: +case 0xEB3E: +case 0xED3E: +case 0xEF3E: +case 0xE13F: +case 0xE33F: +case 0xE53F: +case 0xE73F: +case 0xE93F: +case 0xEB3F: +case 0xED3F: +case 0xEF3F: + +// ROLD +case 0xE138: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u8)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft &= 0x07) + { + CPU->flag_C = (src << sft) >> 0; + res = ((src << sft) | (src >> (8 - sft))) & 0x000000FF; + CPU->flag_V = 0; + CPU->flag_N = res >> 0; + CPU->flag_notZ = res; + MDFN_ennsb(BYTE_OFF + (u8*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 0; + CPU->flag_notZ = src; +} +RET(6) +case 0xE378: +case 0xE578: +case 0xE778: +case 0xE978: +case 0xEB78: +case 0xED78: +case 0xEF78: +case 0xE179: +case 0xE379: +case 0xE579: +case 0xE779: +case 0xE979: +case 0xEB79: +case 0xED79: +case 0xEF79: +case 0xE17A: +case 0xE37A: +case 0xE57A: +case 0xE77A: +case 0xE97A: +case 0xEB7A: +case 0xED7A: +case 0xEF7A: +case 0xE17B: +case 0xE37B: +case 0xE57B: +case 0xE77B: +case 0xE97B: +case 0xEB7B: +case 0xED7B: +case 0xEF7B: +case 0xE17C: +case 0xE37C: +case 0xE57C: +case 0xE77C: +case 0xE97C: +case 0xEB7C: +case 0xED7C: +case 0xEF7C: +case 0xE17D: +case 0xE37D: +case 0xE57D: +case 0xE77D: +case 0xE97D: +case 0xEB7D: +case 0xED7D: +case 0xEF7D: +case 0xE17E: +case 0xE37E: +case 0xE57E: +case 0xE77E: +case 0xE97E: +case 0xEB7E: +case 0xED7E: +case 0xEF7E: +case 0xE17F: +case 0xE37F: +case 0xE57F: +case 0xE77F: +case 0xE97F: +case 0xEB7F: +case 0xED7F: +case 0xEF7F: + +// ROLD +case 0xE178: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u16)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft &= 0x0F) + { + CPU->flag_C = (src << sft) >> 8; + res = ((src << sft) | (src >> (16 - sft))) & 0x0000FFFF; + CPU->flag_V = 0; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + MDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> 0) & 7], res); + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; + RET(6) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 8; + CPU->flag_notZ = src; +} +RET(6) +case 0xE3B8: +case 0xE5B8: +case 0xE7B8: +case 0xE9B8: +case 0xEBB8: +case 0xEDB8: +case 0xEFB8: +case 0xE1B9: +case 0xE3B9: +case 0xE5B9: +case 0xE7B9: +case 0xE9B9: +case 0xEBB9: +case 0xEDB9: +case 0xEFB9: +case 0xE1BA: +case 0xE3BA: +case 0xE5BA: +case 0xE7BA: +case 0xE9BA: +case 0xEBBA: +case 0xEDBA: +case 0xEFBA: +case 0xE1BB: +case 0xE3BB: +case 0xE5BB: +case 0xE7BB: +case 0xE9BB: +case 0xEBBB: +case 0xEDBB: +case 0xEFBB: +case 0xE1BC: +case 0xE3BC: +case 0xE5BC: +case 0xE7BC: +case 0xE9BC: +case 0xEBBC: +case 0xEDBC: +case 0xEFBC: +case 0xE1BD: +case 0xE3BD: +case 0xE5BD: +case 0xE7BD: +case 0xE9BD: +case 0xEBBD: +case 0xEDBD: +case 0xEFBD: +case 0xE1BE: +case 0xE3BE: +case 0xE5BE: +case 0xE7BE: +case 0xE9BE: +case 0xEBBE: +case 0xEDBE: +case 0xEFBE: +case 0xE1BF: +case 0xE3BF: +case 0xE5BF: +case 0xE7BF: +case 0xE9BF: +case 0xEBBF: +case 0xEDBF: +case 0xEFBF: + +// ROLD +case 0xE1B8: +{ + u32 res; + u32 src; + u32 sft; + + sft = CPU->D[(Opcode >> 9) & 7] & 0x3F; + src = (u32)CPU->D[(Opcode >> 0) & 7]; + if (sft) + { + timestamp += sft * 2; + if (sft &= 0x1F) + { + CPU->flag_C = (src >> (32 - sft)) << C68K_SR_C_SFT; + res = (src << sft) | (src >> (32 - sft)); + CPU->flag_V = 0; + CPU->flag_N = res >> 24; + CPU->flag_notZ = res; + MDFN_ennsb((u32*)&CPU->D[(Opcode >> 0) & 7], res); + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; + RET(8) + } + + CPU->flag_V = 0; + CPU->flag_C = 0; + CPU->flag_N = src >> 24; + CPU->flag_notZ = src; +} +RET(8) +case 0xE0D1: +case 0xE0D2: +case 0xE0D3: +case 0xE0D4: +case 0xE0D5: +case 0xE0D6: +case 0xE0D7: + +// ASR +case 0xE0D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE0D9: +case 0xE0DA: +case 0xE0DB: +case 0xE0DC: +case 0xE0DD: +case 0xE0DE: + +// ASR +case 0xE0D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE0E1: +case 0xE0E2: +case 0xE0E3: +case 0xE0E4: +case 0xE0E5: +case 0xE0E6: + +// ASR +case 0xE0E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE0E9: +case 0xE0EA: +case 0xE0EB: +case 0xE0EC: +case 0xE0ED: +case 0xE0EE: +case 0xE0EF: + +// ASR +case 0xE0E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE0F1: +case 0xE0F2: +case 0xE0F3: +case 0xE0F4: +case 0xE0F5: +case 0xE0F6: +case 0xE0F7: + +// ASR +case 0xE0F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASR +case 0xE0F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASR +case 0xE0F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASR +case 0xE0DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASR +case 0xE0E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src & (1 << 15)); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE2D1: +case 0xE2D2: +case 0xE2D3: +case 0xE2D4: +case 0xE2D5: +case 0xE2D6: +case 0xE2D7: + +// LSR +case 0xE2D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE2D9: +case 0xE2DA: +case 0xE2DB: +case 0xE2DC: +case 0xE2DD: +case 0xE2DE: + +// LSR +case 0xE2D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE2E1: +case 0xE2E2: +case 0xE2E3: +case 0xE2E4: +case 0xE2E5: +case 0xE2E6: + +// LSR +case 0xE2E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE2E9: +case 0xE2EA: +case 0xE2EB: +case 0xE2EC: +case 0xE2ED: +case 0xE2EE: +case 0xE2EF: + +// LSR +case 0xE2E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE2F1: +case 0xE2F2: +case 0xE2F3: +case 0xE2F4: +case 0xE2F5: +case 0xE2F6: +case 0xE2F7: + +// LSR +case 0xE2F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSR +case 0xE2F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSR +case 0xE2F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSR +case 0xE2DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSR +case 0xE2E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_N = CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT; + res = src >> 1; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE4D1: +case 0xE4D2: +case 0xE4D3: +case 0xE4D4: +case 0xE4D5: +case 0xE4D6: +case 0xE4D7: + +// ROXR +case 0xE4D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE4D9: +case 0xE4DA: +case 0xE4DB: +case 0xE4DC: +case 0xE4DD: +case 0xE4DE: + +// ROXR +case 0xE4D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE4E1: +case 0xE4E2: +case 0xE4E3: +case 0xE4E4: +case 0xE4E5: +case 0xE4E6: + +// ROXR +case 0xE4E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE4E9: +case 0xE4EA: +case 0xE4EB: +case 0xE4EC: +case 0xE4ED: +case 0xE4EE: +case 0xE4EF: + +// ROXR +case 0xE4E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE4F1: +case 0xE4F2: +case 0xE4F3: +case 0xE4F4: +case 0xE4F5: +case 0xE4F6: +case 0xE4F7: + +// ROXR +case 0xE4F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXR +case 0xE4F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXR +case 0xE4F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXR +case 0xE4DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXR +case 0xE4E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << 7); + CPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE6D1: +case 0xE6D2: +case 0xE6D3: +case 0xE6D4: +case 0xE6D5: +case 0xE6D6: +case 0xE6D7: + +// ROR +case 0xE6D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE6D9: +case 0xE6DA: +case 0xE6DB: +case 0xE6DC: +case 0xE6DD: +case 0xE6DE: + +// ROR +case 0xE6D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE6E1: +case 0xE6E2: +case 0xE6E3: +case 0xE6E4: +case 0xE6E5: +case 0xE6E6: + +// ROR +case 0xE6E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE6E9: +case 0xE6EA: +case 0xE6EB: +case 0xE6EC: +case 0xE6ED: +case 0xE6EE: +case 0xE6EF: + +// ROR +case 0xE6E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE6F1: +case 0xE6F2: +case 0xE6F3: +case 0xE6F4: +case 0xE6F5: +case 0xE6F6: +case 0xE6F7: + +// ROR +case 0xE6F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROR +case 0xE6F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROR +case 0xE6F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROR +case 0xE6DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROR +case 0xE6E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src << C68K_SR_C_SFT; + res = (src >> 1) | (src << 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE1D1: +case 0xE1D2: +case 0xE1D3: +case 0xE1D4: +case 0xE1D5: +case 0xE1D6: +case 0xE1D7: + +// ASL +case 0xE1D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE1D9: +case 0xE1DA: +case 0xE1DB: +case 0xE1DC: +case 0xE1DD: +case 0xE1DE: + +// ASL +case 0xE1D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE1E1: +case 0xE1E2: +case 0xE1E3: +case 0xE1E4: +case 0xE1E5: +case 0xE1E6: + +// ASL +case 0xE1E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE1E9: +case 0xE1EA: +case 0xE1EB: +case 0xE1EC: +case 0xE1ED: +case 0xE1EE: +case 0xE1EF: + +// ASL +case 0xE1E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE1F1: +case 0xE1F2: +case 0xE1F3: +case 0xE1F4: +case 0xE1F5: +case 0xE1F6: +case 0xE1F7: + +// ASL +case 0xE1F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASL +case 0xE1F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASL +case 0xE1F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASL +case 0xE1DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ASL +case 0xE1E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_V = (src ^ res) >> 8; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE3D1: +case 0xE3D2: +case 0xE3D3: +case 0xE3D4: +case 0xE3D5: +case 0xE3D6: +case 0xE3D7: + +// LSL +case 0xE3D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE3D9: +case 0xE3DA: +case 0xE3DB: +case 0xE3DC: +case 0xE3DD: +case 0xE3DE: + +// LSL +case 0xE3D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE3E1: +case 0xE3E2: +case 0xE3E3: +case 0xE3E4: +case 0xE3E5: +case 0xE3E6: + +// LSL +case 0xE3E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE3E9: +case 0xE3EA: +case 0xE3EB: +case 0xE3EC: +case 0xE3ED: +case 0xE3EE: +case 0xE3EF: + +// LSL +case 0xE3E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE3F1: +case 0xE3F2: +case 0xE3F3: +case 0xE3F4: +case 0xE3F5: +case 0xE3F6: +case 0xE3F7: + +// LSL +case 0xE3F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSL +case 0xE3F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSL +case 0xE3F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSL +case 0xE3DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// LSL +case 0xE3E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_X = CPU->flag_C = src >> 7; + res = src << 1; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE5D1: +case 0xE5D2: +case 0xE5D3: +case 0xE5D4: +case 0xE5D5: +case 0xE5D6: +case 0xE5D7: + +// ROXL +case 0xE5D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE5D9: +case 0xE5DA: +case 0xE5DB: +case 0xE5DC: +case 0xE5DD: +case 0xE5DE: + +// ROXL +case 0xE5D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE5E1: +case 0xE5E2: +case 0xE5E3: +case 0xE5E4: +case 0xE5E5: +case 0xE5E6: + +// ROXL +case 0xE5E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE5E9: +case 0xE5EA: +case 0xE5EB: +case 0xE5EC: +case 0xE5ED: +case 0xE5EE: +case 0xE5EF: + +// ROXL +case 0xE5E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE5F1: +case 0xE5F2: +case 0xE5F3: +case 0xE5F4: +case 0xE5F5: +case 0xE5F6: +case 0xE5F7: + +// ROXL +case 0xE5F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXL +case 0xE5F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXL +case 0xE5F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXL +case 0xE5DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROXL +case 0xE5E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> 8); + CPU->flag_X = CPU->flag_C = src >> 7; + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE7D1: +case 0xE7D2: +case 0xE7D3: +case 0xE7D4: +case 0xE7D5: +case 0xE7D6: +case 0xE7D7: + +// ROL +case 0xE7D0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE7D9: +case 0xE7DA: +case 0xE7DB: +case 0xE7DC: +case 0xE7DD: +case 0xE7DE: + +// ROL +case 0xE7D8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + CPU->A[(Opcode >> 0) & 7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE7E1: +case 0xE7E2: +case 0xE7E3: +case 0xE7E4: +case 0xE7E5: +case 0xE7E6: + +// ROL +case 0xE7E0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] - 2; + CPU->A[(Opcode >> 0) & 7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE7E9: +case 0xE7EA: +case 0xE7EB: +case 0xE7EC: +case 0xE7ED: +case 0xE7EE: +case 0xE7EF: + +// ROL +case 0xE7E8: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7] + (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) +case 0xE7F1: +case 0xE7F2: +case 0xE7F3: +case 0xE7F4: +case 0xE7F5: +case 0xE7F6: +case 0xE7F7: + +// ROL +case 0xE7F0: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[(Opcode >> 0) & 7]; + DECODE_EXT_WORD + timestamp += 6; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROL +case 0xE7F8: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)(s16)FETCH_WORD; + PC += 2; + timestamp += 4; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROL +case 0xE7F9: +{ + u32 adr; + u32 res; + u32 src; + adr = (s32)FETCH_LONG; + PC += 4; + timestamp += 8; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROL +case 0xE7DF: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7]; + CPU->A[7] += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) + +// ROL +case 0xE7E7: +{ + u32 adr; + u32 res; + u32 src; + adr = CPU->A[7] - 2; + CPU->A[7] = adr; + timestamp += 2; + READ_WOat_F(adr, src) + CPU->flag_V = 0; + CPU->flag_C = src >> 7; + res = (src << 1) | (src >> 15); + CPU->flag_N = res >> 8; + CPU->flag_notZ = res & 0x0000FFFF; + WRITE_WORD_F(adr, res) +} +RET(8) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68k_opF.inc b/Mednafen/mednafen/hw_cpu/c68k/c68k_opF.inc new file mode 100644 index 0000000000..c6005cc330 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68k_opF.inc @@ -0,0 +1,4116 @@ +case 0xF001: +case 0xF002: +case 0xF003: +case 0xF004: +case 0xF005: +case 0xF006: +case 0xF007: +case 0xF008: +case 0xF009: +case 0xF00A: +case 0xF00B: +case 0xF00C: +case 0xF00D: +case 0xF00E: +case 0xF00F: +case 0xF010: +case 0xF011: +case 0xF012: +case 0xF013: +case 0xF014: +case 0xF015: +case 0xF016: +case 0xF017: +case 0xF018: +case 0xF019: +case 0xF01A: +case 0xF01B: +case 0xF01C: +case 0xF01D: +case 0xF01E: +case 0xF01F: +case 0xF020: +case 0xF021: +case 0xF022: +case 0xF023: +case 0xF024: +case 0xF025: +case 0xF026: +case 0xF027: +case 0xF028: +case 0xF029: +case 0xF02A: +case 0xF02B: +case 0xF02C: +case 0xF02D: +case 0xF02E: +case 0xF02F: +case 0xF030: +case 0xF031: +case 0xF032: +case 0xF033: +case 0xF034: +case 0xF035: +case 0xF036: +case 0xF037: +case 0xF038: +case 0xF039: +case 0xF03A: +case 0xF03B: +case 0xF03C: +case 0xF03D: +case 0xF03E: +case 0xF03F: +case 0xF040: +case 0xF041: +case 0xF042: +case 0xF043: +case 0xF044: +case 0xF045: +case 0xF046: +case 0xF047: +case 0xF048: +case 0xF049: +case 0xF04A: +case 0xF04B: +case 0xF04C: +case 0xF04D: +case 0xF04E: +case 0xF04F: +case 0xF050: +case 0xF051: +case 0xF052: +case 0xF053: +case 0xF054: +case 0xF055: +case 0xF056: +case 0xF057: +case 0xF058: +case 0xF059: +case 0xF05A: +case 0xF05B: +case 0xF05C: +case 0xF05D: +case 0xF05E: +case 0xF05F: +case 0xF060: +case 0xF061: +case 0xF062: +case 0xF063: +case 0xF064: +case 0xF065: +case 0xF066: +case 0xF067: +case 0xF068: +case 0xF069: +case 0xF06A: +case 0xF06B: +case 0xF06C: +case 0xF06D: +case 0xF06E: +case 0xF06F: +case 0xF070: +case 0xF071: +case 0xF072: +case 0xF073: +case 0xF074: +case 0xF075: +case 0xF076: +case 0xF077: +case 0xF078: +case 0xF079: +case 0xF07A: +case 0xF07B: +case 0xF07C: +case 0xF07D: +case 0xF07E: +case 0xF07F: +case 0xF080: +case 0xF081: +case 0xF082: +case 0xF083: +case 0xF084: +case 0xF085: +case 0xF086: +case 0xF087: +case 0xF088: +case 0xF089: +case 0xF08A: +case 0xF08B: +case 0xF08C: +case 0xF08D: +case 0xF08E: +case 0xF08F: +case 0xF090: +case 0xF091: +case 0xF092: +case 0xF093: +case 0xF094: +case 0xF095: +case 0xF096: +case 0xF097: +case 0xF098: +case 0xF099: +case 0xF09A: +case 0xF09B: +case 0xF09C: +case 0xF09D: +case 0xF09E: +case 0xF09F: +case 0xF0A0: +case 0xF0A1: +case 0xF0A2: +case 0xF0A3: +case 0xF0A4: +case 0xF0A5: +case 0xF0A6: +case 0xF0A7: +case 0xF0A8: +case 0xF0A9: +case 0xF0AA: +case 0xF0AB: +case 0xF0AC: +case 0xF0AD: +case 0xF0AE: +case 0xF0AF: +case 0xF0B0: +case 0xF0B1: +case 0xF0B2: +case 0xF0B3: +case 0xF0B4: +case 0xF0B5: +case 0xF0B6: +case 0xF0B7: +case 0xF0B8: +case 0xF0B9: +case 0xF0BA: +case 0xF0BB: +case 0xF0BC: +case 0xF0BD: +case 0xF0BE: +case 0xF0BF: +case 0xF0C0: +case 0xF0C1: +case 0xF0C2: +case 0xF0C3: +case 0xF0C4: +case 0xF0C5: +case 0xF0C6: +case 0xF0C7: +case 0xF0C8: +case 0xF0C9: +case 0xF0CA: +case 0xF0CB: +case 0xF0CC: +case 0xF0CD: +case 0xF0CE: +case 0xF0CF: +case 0xF0D0: +case 0xF0D1: +case 0xF0D2: +case 0xF0D3: +case 0xF0D4: +case 0xF0D5: +case 0xF0D6: +case 0xF0D7: +case 0xF0D8: +case 0xF0D9: +case 0xF0DA: +case 0xF0DB: +case 0xF0DC: +case 0xF0DD: +case 0xF0DE: +case 0xF0DF: +case 0xF0E0: +case 0xF0E1: +case 0xF0E2: +case 0xF0E3: +case 0xF0E4: +case 0xF0E5: +case 0xF0E6: +case 0xF0E7: +case 0xF0E8: +case 0xF0E9: +case 0xF0EA: +case 0xF0EB: +case 0xF0EC: +case 0xF0ED: +case 0xF0EE: +case 0xF0EF: +case 0xF0F0: +case 0xF0F1: +case 0xF0F2: +case 0xF0F3: +case 0xF0F4: +case 0xF0F5: +case 0xF0F6: +case 0xF0F7: +case 0xF0F8: +case 0xF0F9: +case 0xF0FA: +case 0xF0FB: +case 0xF0FC: +case 0xF0FD: +case 0xF0FE: +case 0xF0FF: +case 0xF100: +case 0xF101: +case 0xF102: +case 0xF103: +case 0xF104: +case 0xF105: +case 0xF106: +case 0xF107: +case 0xF108: +case 0xF109: +case 0xF10A: +case 0xF10B: +case 0xF10C: +case 0xF10D: +case 0xF10E: +case 0xF10F: +case 0xF110: +case 0xF111: +case 0xF112: +case 0xF113: +case 0xF114: +case 0xF115: +case 0xF116: +case 0xF117: +case 0xF118: +case 0xF119: +case 0xF11A: +case 0xF11B: +case 0xF11C: +case 0xF11D: +case 0xF11E: +case 0xF11F: +case 0xF120: +case 0xF121: +case 0xF122: +case 0xF123: +case 0xF124: +case 0xF125: +case 0xF126: +case 0xF127: +case 0xF128: +case 0xF129: +case 0xF12A: +case 0xF12B: +case 0xF12C: +case 0xF12D: +case 0xF12E: +case 0xF12F: +case 0xF130: +case 0xF131: +case 0xF132: +case 0xF133: +case 0xF134: +case 0xF135: +case 0xF136: +case 0xF137: +case 0xF138: +case 0xF139: +case 0xF13A: +case 0xF13B: +case 0xF13C: +case 0xF13D: +case 0xF13E: +case 0xF13F: +case 0xF140: +case 0xF141: +case 0xF142: +case 0xF143: +case 0xF144: +case 0xF145: +case 0xF146: +case 0xF147: +case 0xF148: +case 0xF149: +case 0xF14A: +case 0xF14B: +case 0xF14C: +case 0xF14D: +case 0xF14E: +case 0xF14F: +case 0xF150: +case 0xF151: +case 0xF152: +case 0xF153: +case 0xF154: +case 0xF155: +case 0xF156: +case 0xF157: +case 0xF158: +case 0xF159: +case 0xF15A: +case 0xF15B: +case 0xF15C: +case 0xF15D: +case 0xF15E: +case 0xF15F: +case 0xF160: +case 0xF161: +case 0xF162: +case 0xF163: +case 0xF164: +case 0xF165: +case 0xF166: +case 0xF167: +case 0xF168: +case 0xF169: +case 0xF16A: +case 0xF16B: +case 0xF16C: +case 0xF16D: +case 0xF16E: +case 0xF16F: +case 0xF170: +case 0xF171: +case 0xF172: +case 0xF173: +case 0xF174: +case 0xF175: +case 0xF176: +case 0xF177: +case 0xF178: +case 0xF179: +case 0xF17A: +case 0xF17B: +case 0xF17C: +case 0xF17D: +case 0xF17E: +case 0xF17F: +case 0xF180: +case 0xF181: +case 0xF182: +case 0xF183: +case 0xF184: +case 0xF185: +case 0xF186: +case 0xF187: +case 0xF188: +case 0xF189: +case 0xF18A: +case 0xF18B: +case 0xF18C: +case 0xF18D: +case 0xF18E: +case 0xF18F: +case 0xF190: +case 0xF191: +case 0xF192: +case 0xF193: +case 0xF194: +case 0xF195: +case 0xF196: +case 0xF197: +case 0xF198: +case 0xF199: +case 0xF19A: +case 0xF19B: +case 0xF19C: +case 0xF19D: +case 0xF19E: +case 0xF19F: +case 0xF1A0: +case 0xF1A1: +case 0xF1A2: +case 0xF1A3: +case 0xF1A4: +case 0xF1A5: +case 0xF1A6: +case 0xF1A7: +case 0xF1A8: +case 0xF1A9: +case 0xF1AA: +case 0xF1AB: +case 0xF1AC: +case 0xF1AD: +case 0xF1AE: +case 0xF1AF: +case 0xF1B0: +case 0xF1B1: +case 0xF1B2: +case 0xF1B3: +case 0xF1B4: +case 0xF1B5: +case 0xF1B6: +case 0xF1B7: +case 0xF1B8: +case 0xF1B9: +case 0xF1BA: +case 0xF1BB: +case 0xF1BC: +case 0xF1BD: +case 0xF1BE: +case 0xF1BF: +case 0xF1C0: +case 0xF1C1: +case 0xF1C2: +case 0xF1C3: +case 0xF1C4: +case 0xF1C5: +case 0xF1C6: +case 0xF1C7: +case 0xF1C8: +case 0xF1C9: +case 0xF1CA: +case 0xF1CB: +case 0xF1CC: +case 0xF1CD: +case 0xF1CE: +case 0xF1CF: +case 0xF1D0: +case 0xF1D1: +case 0xF1D2: +case 0xF1D3: +case 0xF1D4: +case 0xF1D5: +case 0xF1D6: +case 0xF1D7: +case 0xF1D8: +case 0xF1D9: +case 0xF1DA: +case 0xF1DB: +case 0xF1DC: +case 0xF1DD: +case 0xF1DE: +case 0xF1DF: +case 0xF1E0: +case 0xF1E1: +case 0xF1E2: +case 0xF1E3: +case 0xF1E4: +case 0xF1E5: +case 0xF1E6: +case 0xF1E7: +case 0xF1E8: +case 0xF1E9: +case 0xF1EA: +case 0xF1EB: +case 0xF1EC: +case 0xF1ED: +case 0xF1EE: +case 0xF1EF: +case 0xF1F0: +case 0xF1F1: +case 0xF1F2: +case 0xF1F3: +case 0xF1F4: +case 0xF1F5: +case 0xF1F6: +case 0xF1F7: +case 0xF1F8: +case 0xF1F9: +case 0xF1FA: +case 0xF1FB: +case 0xF1FC: +case 0xF1FD: +case 0xF1FE: +case 0xF1FF: +case 0xF200: +case 0xF201: +case 0xF202: +case 0xF203: +case 0xF204: +case 0xF205: +case 0xF206: +case 0xF207: +case 0xF208: +case 0xF209: +case 0xF20A: +case 0xF20B: +case 0xF20C: +case 0xF20D: +case 0xF20E: +case 0xF20F: +case 0xF210: +case 0xF211: +case 0xF212: +case 0xF213: +case 0xF214: +case 0xF215: +case 0xF216: +case 0xF217: +case 0xF218: +case 0xF219: +case 0xF21A: +case 0xF21B: +case 0xF21C: +case 0xF21D: +case 0xF21E: +case 0xF21F: +case 0xF220: +case 0xF221: +case 0xF222: +case 0xF223: +case 0xF224: +case 0xF225: +case 0xF226: +case 0xF227: +case 0xF228: +case 0xF229: +case 0xF22A: +case 0xF22B: +case 0xF22C: +case 0xF22D: +case 0xF22E: +case 0xF22F: +case 0xF230: +case 0xF231: +case 0xF232: +case 0xF233: +case 0xF234: +case 0xF235: +case 0xF236: +case 0xF237: +case 0xF238: +case 0xF239: +case 0xF23A: +case 0xF23B: +case 0xF23C: +case 0xF23D: +case 0xF23E: +case 0xF23F: +case 0xF240: +case 0xF241: +case 0xF242: +case 0xF243: +case 0xF244: +case 0xF245: +case 0xF246: +case 0xF247: +case 0xF248: +case 0xF249: +case 0xF24A: +case 0xF24B: +case 0xF24C: +case 0xF24D: +case 0xF24E: +case 0xF24F: +case 0xF250: +case 0xF251: +case 0xF252: +case 0xF253: +case 0xF254: +case 0xF255: +case 0xF256: +case 0xF257: +case 0xF258: +case 0xF259: +case 0xF25A: +case 0xF25B: +case 0xF25C: +case 0xF25D: +case 0xF25E: +case 0xF25F: +case 0xF260: +case 0xF261: +case 0xF262: +case 0xF263: +case 0xF264: +case 0xF265: +case 0xF266: +case 0xF267: +case 0xF268: +case 0xF269: +case 0xF26A: +case 0xF26B: +case 0xF26C: +case 0xF26D: +case 0xF26E: +case 0xF26F: +case 0xF270: +case 0xF271: +case 0xF272: +case 0xF273: +case 0xF274: +case 0xF275: +case 0xF276: +case 0xF277: +case 0xF278: +case 0xF279: +case 0xF27A: +case 0xF27B: +case 0xF27C: +case 0xF27D: +case 0xF27E: +case 0xF27F: +case 0xF280: +case 0xF281: +case 0xF282: +case 0xF283: +case 0xF284: +case 0xF285: +case 0xF286: +case 0xF287: +case 0xF288: +case 0xF289: +case 0xF28A: +case 0xF28B: +case 0xF28C: +case 0xF28D: +case 0xF28E: +case 0xF28F: +case 0xF290: +case 0xF291: +case 0xF292: +case 0xF293: +case 0xF294: +case 0xF295: +case 0xF296: +case 0xF297: +case 0xF298: +case 0xF299: +case 0xF29A: +case 0xF29B: +case 0xF29C: +case 0xF29D: +case 0xF29E: +case 0xF29F: +case 0xF2A0: +case 0xF2A1: +case 0xF2A2: +case 0xF2A3: +case 0xF2A4: +case 0xF2A5: +case 0xF2A6: +case 0xF2A7: +case 0xF2A8: +case 0xF2A9: +case 0xF2AA: +case 0xF2AB: +case 0xF2AC: +case 0xF2AD: +case 0xF2AE: +case 0xF2AF: +case 0xF2B0: +case 0xF2B1: +case 0xF2B2: +case 0xF2B3: +case 0xF2B4: +case 0xF2B5: +case 0xF2B6: +case 0xF2B7: +case 0xF2B8: +case 0xF2B9: +case 0xF2BA: +case 0xF2BB: +case 0xF2BC: +case 0xF2BD: +case 0xF2BE: +case 0xF2BF: +case 0xF2C0: +case 0xF2C1: +case 0xF2C2: +case 0xF2C3: +case 0xF2C4: +case 0xF2C5: +case 0xF2C6: +case 0xF2C7: +case 0xF2C8: +case 0xF2C9: +case 0xF2CA: +case 0xF2CB: +case 0xF2CC: +case 0xF2CD: +case 0xF2CE: +case 0xF2CF: +case 0xF2D0: +case 0xF2D1: +case 0xF2D2: +case 0xF2D3: +case 0xF2D4: +case 0xF2D5: +case 0xF2D6: +case 0xF2D7: +case 0xF2D8: +case 0xF2D9: +case 0xF2DA: +case 0xF2DB: +case 0xF2DC: +case 0xF2DD: +case 0xF2DE: +case 0xF2DF: +case 0xF2E0: +case 0xF2E1: +case 0xF2E2: +case 0xF2E3: +case 0xF2E4: +case 0xF2E5: +case 0xF2E6: +case 0xF2E7: +case 0xF2E8: +case 0xF2E9: +case 0xF2EA: +case 0xF2EB: +case 0xF2EC: +case 0xF2ED: +case 0xF2EE: +case 0xF2EF: +case 0xF2F0: +case 0xF2F1: +case 0xF2F2: +case 0xF2F3: +case 0xF2F4: +case 0xF2F5: +case 0xF2F6: +case 0xF2F7: +case 0xF2F8: +case 0xF2F9: +case 0xF2FA: +case 0xF2FB: +case 0xF2FC: +case 0xF2FD: +case 0xF2FE: +case 0xF2FF: +case 0xF300: +case 0xF301: +case 0xF302: +case 0xF303: +case 0xF304: +case 0xF305: +case 0xF306: +case 0xF307: +case 0xF308: +case 0xF309: +case 0xF30A: +case 0xF30B: +case 0xF30C: +case 0xF30D: +case 0xF30E: +case 0xF30F: +case 0xF310: +case 0xF311: +case 0xF312: +case 0xF313: +case 0xF314: +case 0xF315: +case 0xF316: +case 0xF317: +case 0xF318: +case 0xF319: +case 0xF31A: +case 0xF31B: +case 0xF31C: +case 0xF31D: +case 0xF31E: +case 0xF31F: +case 0xF320: +case 0xF321: +case 0xF322: +case 0xF323: +case 0xF324: +case 0xF325: +case 0xF326: +case 0xF327: +case 0xF328: +case 0xF329: +case 0xF32A: +case 0xF32B: +case 0xF32C: +case 0xF32D: +case 0xF32E: +case 0xF32F: +case 0xF330: +case 0xF331: +case 0xF332: +case 0xF333: +case 0xF334: +case 0xF335: +case 0xF336: +case 0xF337: +case 0xF338: +case 0xF339: +case 0xF33A: +case 0xF33B: +case 0xF33C: +case 0xF33D: +case 0xF33E: +case 0xF33F: +case 0xF340: +case 0xF341: +case 0xF342: +case 0xF343: +case 0xF344: +case 0xF345: +case 0xF346: +case 0xF347: +case 0xF348: +case 0xF349: +case 0xF34A: +case 0xF34B: +case 0xF34C: +case 0xF34D: +case 0xF34E: +case 0xF34F: +case 0xF350: +case 0xF351: +case 0xF352: +case 0xF353: +case 0xF354: +case 0xF355: +case 0xF356: +case 0xF357: +case 0xF358: +case 0xF359: +case 0xF35A: +case 0xF35B: +case 0xF35C: +case 0xF35D: +case 0xF35E: +case 0xF35F: +case 0xF360: +case 0xF361: +case 0xF362: +case 0xF363: +case 0xF364: +case 0xF365: +case 0xF366: +case 0xF367: +case 0xF368: +case 0xF369: +case 0xF36A: +case 0xF36B: +case 0xF36C: +case 0xF36D: +case 0xF36E: +case 0xF36F: +case 0xF370: +case 0xF371: +case 0xF372: +case 0xF373: +case 0xF374: +case 0xF375: +case 0xF376: +case 0xF377: +case 0xF378: +case 0xF379: +case 0xF37A: +case 0xF37B: +case 0xF37C: +case 0xF37D: +case 0xF37E: +case 0xF37F: +case 0xF380: +case 0xF381: +case 0xF382: +case 0xF383: +case 0xF384: +case 0xF385: +case 0xF386: +case 0xF387: +case 0xF388: +case 0xF389: +case 0xF38A: +case 0xF38B: +case 0xF38C: +case 0xF38D: +case 0xF38E: +case 0xF38F: +case 0xF390: +case 0xF391: +case 0xF392: +case 0xF393: +case 0xF394: +case 0xF395: +case 0xF396: +case 0xF397: +case 0xF398: +case 0xF399: +case 0xF39A: +case 0xF39B: +case 0xF39C: +case 0xF39D: +case 0xF39E: +case 0xF39F: +case 0xF3A0: +case 0xF3A1: +case 0xF3A2: +case 0xF3A3: +case 0xF3A4: +case 0xF3A5: +case 0xF3A6: +case 0xF3A7: +case 0xF3A8: +case 0xF3A9: +case 0xF3AA: +case 0xF3AB: +case 0xF3AC: +case 0xF3AD: +case 0xF3AE: +case 0xF3AF: +case 0xF3B0: +case 0xF3B1: +case 0xF3B2: +case 0xF3B3: +case 0xF3B4: +case 0xF3B5: +case 0xF3B6: +case 0xF3B7: +case 0xF3B8: +case 0xF3B9: +case 0xF3BA: +case 0xF3BB: +case 0xF3BC: +case 0xF3BD: +case 0xF3BE: +case 0xF3BF: +case 0xF3C0: +case 0xF3C1: +case 0xF3C2: +case 0xF3C3: +case 0xF3C4: +case 0xF3C5: +case 0xF3C6: +case 0xF3C7: +case 0xF3C8: +case 0xF3C9: +case 0xF3CA: +case 0xF3CB: +case 0xF3CC: +case 0xF3CD: +case 0xF3CE: +case 0xF3CF: +case 0xF3D0: +case 0xF3D1: +case 0xF3D2: +case 0xF3D3: +case 0xF3D4: +case 0xF3D5: +case 0xF3D6: +case 0xF3D7: +case 0xF3D8: +case 0xF3D9: +case 0xF3DA: +case 0xF3DB: +case 0xF3DC: +case 0xF3DD: +case 0xF3DE: +case 0xF3DF: +case 0xF3E0: +case 0xF3E1: +case 0xF3E2: +case 0xF3E3: +case 0xF3E4: +case 0xF3E5: +case 0xF3E6: +case 0xF3E7: +case 0xF3E8: +case 0xF3E9: +case 0xF3EA: +case 0xF3EB: +case 0xF3EC: +case 0xF3ED: +case 0xF3EE: +case 0xF3EF: +case 0xF3F0: +case 0xF3F1: +case 0xF3F2: +case 0xF3F3: +case 0xF3F4: +case 0xF3F5: +case 0xF3F6: +case 0xF3F7: +case 0xF3F8: +case 0xF3F9: +case 0xF3FA: +case 0xF3FB: +case 0xF3FC: +case 0xF3FD: +case 0xF3FE: +case 0xF3FF: +case 0xF400: +case 0xF401: +case 0xF402: +case 0xF403: +case 0xF404: +case 0xF405: +case 0xF406: +case 0xF407: +case 0xF408: +case 0xF409: +case 0xF40A: +case 0xF40B: +case 0xF40C: +case 0xF40D: +case 0xF40E: +case 0xF40F: +case 0xF410: +case 0xF411: +case 0xF412: +case 0xF413: +case 0xF414: +case 0xF415: +case 0xF416: +case 0xF417: +case 0xF418: +case 0xF419: +case 0xF41A: +case 0xF41B: +case 0xF41C: +case 0xF41D: +case 0xF41E: +case 0xF41F: +case 0xF420: +case 0xF421: +case 0xF422: +case 0xF423: +case 0xF424: +case 0xF425: +case 0xF426: +case 0xF427: +case 0xF428: +case 0xF429: +case 0xF42A: +case 0xF42B: +case 0xF42C: +case 0xF42D: +case 0xF42E: +case 0xF42F: +case 0xF430: +case 0xF431: +case 0xF432: +case 0xF433: +case 0xF434: +case 0xF435: +case 0xF436: +case 0xF437: +case 0xF438: +case 0xF439: +case 0xF43A: +case 0xF43B: +case 0xF43C: +case 0xF43D: +case 0xF43E: +case 0xF43F: +case 0xF440: +case 0xF441: +case 0xF442: +case 0xF443: +case 0xF444: +case 0xF445: +case 0xF446: +case 0xF447: +case 0xF448: +case 0xF449: +case 0xF44A: +case 0xF44B: +case 0xF44C: +case 0xF44D: +case 0xF44E: +case 0xF44F: +case 0xF450: +case 0xF451: +case 0xF452: +case 0xF453: +case 0xF454: +case 0xF455: +case 0xF456: +case 0xF457: +case 0xF458: +case 0xF459: +case 0xF45A: +case 0xF45B: +case 0xF45C: +case 0xF45D: +case 0xF45E: +case 0xF45F: +case 0xF460: +case 0xF461: +case 0xF462: +case 0xF463: +case 0xF464: +case 0xF465: +case 0xF466: +case 0xF467: +case 0xF468: +case 0xF469: +case 0xF46A: +case 0xF46B: +case 0xF46C: +case 0xF46D: +case 0xF46E: +case 0xF46F: +case 0xF470: +case 0xF471: +case 0xF472: +case 0xF473: +case 0xF474: +case 0xF475: +case 0xF476: +case 0xF477: +case 0xF478: +case 0xF479: +case 0xF47A: +case 0xF47B: +case 0xF47C: +case 0xF47D: +case 0xF47E: +case 0xF47F: +case 0xF480: +case 0xF481: +case 0xF482: +case 0xF483: +case 0xF484: +case 0xF485: +case 0xF486: +case 0xF487: +case 0xF488: +case 0xF489: +case 0xF48A: +case 0xF48B: +case 0xF48C: +case 0xF48D: +case 0xF48E: +case 0xF48F: +case 0xF490: +case 0xF491: +case 0xF492: +case 0xF493: +case 0xF494: +case 0xF495: +case 0xF496: +case 0xF497: +case 0xF498: +case 0xF499: +case 0xF49A: +case 0xF49B: +case 0xF49C: +case 0xF49D: +case 0xF49E: +case 0xF49F: +case 0xF4A0: +case 0xF4A1: +case 0xF4A2: +case 0xF4A3: +case 0xF4A4: +case 0xF4A5: +case 0xF4A6: +case 0xF4A7: +case 0xF4A8: +case 0xF4A9: +case 0xF4AA: +case 0xF4AB: +case 0xF4AC: +case 0xF4AD: +case 0xF4AE: +case 0xF4AF: +case 0xF4B0: +case 0xF4B1: +case 0xF4B2: +case 0xF4B3: +case 0xF4B4: +case 0xF4B5: +case 0xF4B6: +case 0xF4B7: +case 0xF4B8: +case 0xF4B9: +case 0xF4BA: +case 0xF4BB: +case 0xF4BC: +case 0xF4BD: +case 0xF4BE: +case 0xF4BF: +case 0xF4C0: +case 0xF4C1: +case 0xF4C2: +case 0xF4C3: +case 0xF4C4: +case 0xF4C5: +case 0xF4C6: +case 0xF4C7: +case 0xF4C8: +case 0xF4C9: +case 0xF4CA: +case 0xF4CB: +case 0xF4CC: +case 0xF4CD: +case 0xF4CE: +case 0xF4CF: +case 0xF4D0: +case 0xF4D1: +case 0xF4D2: +case 0xF4D3: +case 0xF4D4: +case 0xF4D5: +case 0xF4D6: +case 0xF4D7: +case 0xF4D8: +case 0xF4D9: +case 0xF4DA: +case 0xF4DB: +case 0xF4DC: +case 0xF4DD: +case 0xF4DE: +case 0xF4DF: +case 0xF4E0: +case 0xF4E1: +case 0xF4E2: +case 0xF4E3: +case 0xF4E4: +case 0xF4E5: +case 0xF4E6: +case 0xF4E7: +case 0xF4E8: +case 0xF4E9: +case 0xF4EA: +case 0xF4EB: +case 0xF4EC: +case 0xF4ED: +case 0xF4EE: +case 0xF4EF: +case 0xF4F0: +case 0xF4F1: +case 0xF4F2: +case 0xF4F3: +case 0xF4F4: +case 0xF4F5: +case 0xF4F6: +case 0xF4F7: +case 0xF4F8: +case 0xF4F9: +case 0xF4FA: +case 0xF4FB: +case 0xF4FC: +case 0xF4FD: +case 0xF4FE: +case 0xF4FF: +case 0xF500: +case 0xF501: +case 0xF502: +case 0xF503: +case 0xF504: +case 0xF505: +case 0xF506: +case 0xF507: +case 0xF508: +case 0xF509: +case 0xF50A: +case 0xF50B: +case 0xF50C: +case 0xF50D: +case 0xF50E: +case 0xF50F: +case 0xF510: +case 0xF511: +case 0xF512: +case 0xF513: +case 0xF514: +case 0xF515: +case 0xF516: +case 0xF517: +case 0xF518: +case 0xF519: +case 0xF51A: +case 0xF51B: +case 0xF51C: +case 0xF51D: +case 0xF51E: +case 0xF51F: +case 0xF520: +case 0xF521: +case 0xF522: +case 0xF523: +case 0xF524: +case 0xF525: +case 0xF526: +case 0xF527: +case 0xF528: +case 0xF529: +case 0xF52A: +case 0xF52B: +case 0xF52C: +case 0xF52D: +case 0xF52E: +case 0xF52F: +case 0xF530: +case 0xF531: +case 0xF532: +case 0xF533: +case 0xF534: +case 0xF535: +case 0xF536: +case 0xF537: +case 0xF538: +case 0xF539: +case 0xF53A: +case 0xF53B: +case 0xF53C: +case 0xF53D: +case 0xF53E: +case 0xF53F: +case 0xF540: +case 0xF541: +case 0xF542: +case 0xF543: +case 0xF544: +case 0xF545: +case 0xF546: +case 0xF547: +case 0xF548: +case 0xF549: +case 0xF54A: +case 0xF54B: +case 0xF54C: +case 0xF54D: +case 0xF54E: +case 0xF54F: +case 0xF550: +case 0xF551: +case 0xF552: +case 0xF553: +case 0xF554: +case 0xF555: +case 0xF556: +case 0xF557: +case 0xF558: +case 0xF559: +case 0xF55A: +case 0xF55B: +case 0xF55C: +case 0xF55D: +case 0xF55E: +case 0xF55F: +case 0xF560: +case 0xF561: +case 0xF562: +case 0xF563: +case 0xF564: +case 0xF565: +case 0xF566: +case 0xF567: +case 0xF568: +case 0xF569: +case 0xF56A: +case 0xF56B: +case 0xF56C: +case 0xF56D: +case 0xF56E: +case 0xF56F: +case 0xF570: +case 0xF571: +case 0xF572: +case 0xF573: +case 0xF574: +case 0xF575: +case 0xF576: +case 0xF577: +case 0xF578: +case 0xF579: +case 0xF57A: +case 0xF57B: +case 0xF57C: +case 0xF57D: +case 0xF57E: +case 0xF57F: +case 0xF580: +case 0xF581: +case 0xF582: +case 0xF583: +case 0xF584: +case 0xF585: +case 0xF586: +case 0xF587: +case 0xF588: +case 0xF589: +case 0xF58A: +case 0xF58B: +case 0xF58C: +case 0xF58D: +case 0xF58E: +case 0xF58F: +case 0xF590: +case 0xF591: +case 0xF592: +case 0xF593: +case 0xF594: +case 0xF595: +case 0xF596: +case 0xF597: +case 0xF598: +case 0xF599: +case 0xF59A: +case 0xF59B: +case 0xF59C: +case 0xF59D: +case 0xF59E: +case 0xF59F: +case 0xF5A0: +case 0xF5A1: +case 0xF5A2: +case 0xF5A3: +case 0xF5A4: +case 0xF5A5: +case 0xF5A6: +case 0xF5A7: +case 0xF5A8: +case 0xF5A9: +case 0xF5AA: +case 0xF5AB: +case 0xF5AC: +case 0xF5AD: +case 0xF5AE: +case 0xF5AF: +case 0xF5B0: +case 0xF5B1: +case 0xF5B2: +case 0xF5B3: +case 0xF5B4: +case 0xF5B5: +case 0xF5B6: +case 0xF5B7: +case 0xF5B8: +case 0xF5B9: +case 0xF5BA: +case 0xF5BB: +case 0xF5BC: +case 0xF5BD: +case 0xF5BE: +case 0xF5BF: +case 0xF5C0: +case 0xF5C1: +case 0xF5C2: +case 0xF5C3: +case 0xF5C4: +case 0xF5C5: +case 0xF5C6: +case 0xF5C7: +case 0xF5C8: +case 0xF5C9: +case 0xF5CA: +case 0xF5CB: +case 0xF5CC: +case 0xF5CD: +case 0xF5CE: +case 0xF5CF: +case 0xF5D0: +case 0xF5D1: +case 0xF5D2: +case 0xF5D3: +case 0xF5D4: +case 0xF5D5: +case 0xF5D6: +case 0xF5D7: +case 0xF5D8: +case 0xF5D9: +case 0xF5DA: +case 0xF5DB: +case 0xF5DC: +case 0xF5DD: +case 0xF5DE: +case 0xF5DF: +case 0xF5E0: +case 0xF5E1: +case 0xF5E2: +case 0xF5E3: +case 0xF5E4: +case 0xF5E5: +case 0xF5E6: +case 0xF5E7: +case 0xF5E8: +case 0xF5E9: +case 0xF5EA: +case 0xF5EB: +case 0xF5EC: +case 0xF5ED: +case 0xF5EE: +case 0xF5EF: +case 0xF5F0: +case 0xF5F1: +case 0xF5F2: +case 0xF5F3: +case 0xF5F4: +case 0xF5F5: +case 0xF5F6: +case 0xF5F7: +case 0xF5F8: +case 0xF5F9: +case 0xF5FA: +case 0xF5FB: +case 0xF5FC: +case 0xF5FD: +case 0xF5FE: +case 0xF5FF: +case 0xF600: +case 0xF601: +case 0xF602: +case 0xF603: +case 0xF604: +case 0xF605: +case 0xF606: +case 0xF607: +case 0xF608: +case 0xF609: +case 0xF60A: +case 0xF60B: +case 0xF60C: +case 0xF60D: +case 0xF60E: +case 0xF60F: +case 0xF610: +case 0xF611: +case 0xF612: +case 0xF613: +case 0xF614: +case 0xF615: +case 0xF616: +case 0xF617: +case 0xF618: +case 0xF619: +case 0xF61A: +case 0xF61B: +case 0xF61C: +case 0xF61D: +case 0xF61E: +case 0xF61F: +case 0xF620: +case 0xF621: +case 0xF622: +case 0xF623: +case 0xF624: +case 0xF625: +case 0xF626: +case 0xF627: +case 0xF628: +case 0xF629: +case 0xF62A: +case 0xF62B: +case 0xF62C: +case 0xF62D: +case 0xF62E: +case 0xF62F: +case 0xF630: +case 0xF631: +case 0xF632: +case 0xF633: +case 0xF634: +case 0xF635: +case 0xF636: +case 0xF637: +case 0xF638: +case 0xF639: +case 0xF63A: +case 0xF63B: +case 0xF63C: +case 0xF63D: +case 0xF63E: +case 0xF63F: +case 0xF640: +case 0xF641: +case 0xF642: +case 0xF643: +case 0xF644: +case 0xF645: +case 0xF646: +case 0xF647: +case 0xF648: +case 0xF649: +case 0xF64A: +case 0xF64B: +case 0xF64C: +case 0xF64D: +case 0xF64E: +case 0xF64F: +case 0xF650: +case 0xF651: +case 0xF652: +case 0xF653: +case 0xF654: +case 0xF655: +case 0xF656: +case 0xF657: +case 0xF658: +case 0xF659: +case 0xF65A: +case 0xF65B: +case 0xF65C: +case 0xF65D: +case 0xF65E: +case 0xF65F: +case 0xF660: +case 0xF661: +case 0xF662: +case 0xF663: +case 0xF664: +case 0xF665: +case 0xF666: +case 0xF667: +case 0xF668: +case 0xF669: +case 0xF66A: +case 0xF66B: +case 0xF66C: +case 0xF66D: +case 0xF66E: +case 0xF66F: +case 0xF670: +case 0xF671: +case 0xF672: +case 0xF673: +case 0xF674: +case 0xF675: +case 0xF676: +case 0xF677: +case 0xF678: +case 0xF679: +case 0xF67A: +case 0xF67B: +case 0xF67C: +case 0xF67D: +case 0xF67E: +case 0xF67F: +case 0xF680: +case 0xF681: +case 0xF682: +case 0xF683: +case 0xF684: +case 0xF685: +case 0xF686: +case 0xF687: +case 0xF688: +case 0xF689: +case 0xF68A: +case 0xF68B: +case 0xF68C: +case 0xF68D: +case 0xF68E: +case 0xF68F: +case 0xF690: +case 0xF691: +case 0xF692: +case 0xF693: +case 0xF694: +case 0xF695: +case 0xF696: +case 0xF697: +case 0xF698: +case 0xF699: +case 0xF69A: +case 0xF69B: +case 0xF69C: +case 0xF69D: +case 0xF69E: +case 0xF69F: +case 0xF6A0: +case 0xF6A1: +case 0xF6A2: +case 0xF6A3: +case 0xF6A4: +case 0xF6A5: +case 0xF6A6: +case 0xF6A7: +case 0xF6A8: +case 0xF6A9: +case 0xF6AA: +case 0xF6AB: +case 0xF6AC: +case 0xF6AD: +case 0xF6AE: +case 0xF6AF: +case 0xF6B0: +case 0xF6B1: +case 0xF6B2: +case 0xF6B3: +case 0xF6B4: +case 0xF6B5: +case 0xF6B6: +case 0xF6B7: +case 0xF6B8: +case 0xF6B9: +case 0xF6BA: +case 0xF6BB: +case 0xF6BC: +case 0xF6BD: +case 0xF6BE: +case 0xF6BF: +case 0xF6C0: +case 0xF6C1: +case 0xF6C2: +case 0xF6C3: +case 0xF6C4: +case 0xF6C5: +case 0xF6C6: +case 0xF6C7: +case 0xF6C8: +case 0xF6C9: +case 0xF6CA: +case 0xF6CB: +case 0xF6CC: +case 0xF6CD: +case 0xF6CE: +case 0xF6CF: +case 0xF6D0: +case 0xF6D1: +case 0xF6D2: +case 0xF6D3: +case 0xF6D4: +case 0xF6D5: +case 0xF6D6: +case 0xF6D7: +case 0xF6D8: +case 0xF6D9: +case 0xF6DA: +case 0xF6DB: +case 0xF6DC: +case 0xF6DD: +case 0xF6DE: +case 0xF6DF: +case 0xF6E0: +case 0xF6E1: +case 0xF6E2: +case 0xF6E3: +case 0xF6E4: +case 0xF6E5: +case 0xF6E6: +case 0xF6E7: +case 0xF6E8: +case 0xF6E9: +case 0xF6EA: +case 0xF6EB: +case 0xF6EC: +case 0xF6ED: +case 0xF6EE: +case 0xF6EF: +case 0xF6F0: +case 0xF6F1: +case 0xF6F2: +case 0xF6F3: +case 0xF6F4: +case 0xF6F5: +case 0xF6F6: +case 0xF6F7: +case 0xF6F8: +case 0xF6F9: +case 0xF6FA: +case 0xF6FB: +case 0xF6FC: +case 0xF6FD: +case 0xF6FE: +case 0xF6FF: +case 0xF700: +case 0xF701: +case 0xF702: +case 0xF703: +case 0xF704: +case 0xF705: +case 0xF706: +case 0xF707: +case 0xF708: +case 0xF709: +case 0xF70A: +case 0xF70B: +case 0xF70C: +case 0xF70D: +case 0xF70E: +case 0xF70F: +case 0xF710: +case 0xF711: +case 0xF712: +case 0xF713: +case 0xF714: +case 0xF715: +case 0xF716: +case 0xF717: +case 0xF718: +case 0xF719: +case 0xF71A: +case 0xF71B: +case 0xF71C: +case 0xF71D: +case 0xF71E: +case 0xF71F: +case 0xF720: +case 0xF721: +case 0xF722: +case 0xF723: +case 0xF724: +case 0xF725: +case 0xF726: +case 0xF727: +case 0xF728: +case 0xF729: +case 0xF72A: +case 0xF72B: +case 0xF72C: +case 0xF72D: +case 0xF72E: +case 0xF72F: +case 0xF730: +case 0xF731: +case 0xF732: +case 0xF733: +case 0xF734: +case 0xF735: +case 0xF736: +case 0xF737: +case 0xF738: +case 0xF739: +case 0xF73A: +case 0xF73B: +case 0xF73C: +case 0xF73D: +case 0xF73E: +case 0xF73F: +case 0xF740: +case 0xF741: +case 0xF742: +case 0xF743: +case 0xF744: +case 0xF745: +case 0xF746: +case 0xF747: +case 0xF748: +case 0xF749: +case 0xF74A: +case 0xF74B: +case 0xF74C: +case 0xF74D: +case 0xF74E: +case 0xF74F: +case 0xF750: +case 0xF751: +case 0xF752: +case 0xF753: +case 0xF754: +case 0xF755: +case 0xF756: +case 0xF757: +case 0xF758: +case 0xF759: +case 0xF75A: +case 0xF75B: +case 0xF75C: +case 0xF75D: +case 0xF75E: +case 0xF75F: +case 0xF760: +case 0xF761: +case 0xF762: +case 0xF763: +case 0xF764: +case 0xF765: +case 0xF766: +case 0xF767: +case 0xF768: +case 0xF769: +case 0xF76A: +case 0xF76B: +case 0xF76C: +case 0xF76D: +case 0xF76E: +case 0xF76F: +case 0xF770: +case 0xF771: +case 0xF772: +case 0xF773: +case 0xF774: +case 0xF775: +case 0xF776: +case 0xF777: +case 0xF778: +case 0xF779: +case 0xF77A: +case 0xF77B: +case 0xF77C: +case 0xF77D: +case 0xF77E: +case 0xF77F: +case 0xF780: +case 0xF781: +case 0xF782: +case 0xF783: +case 0xF784: +case 0xF785: +case 0xF786: +case 0xF787: +case 0xF788: +case 0xF789: +case 0xF78A: +case 0xF78B: +case 0xF78C: +case 0xF78D: +case 0xF78E: +case 0xF78F: +case 0xF790: +case 0xF791: +case 0xF792: +case 0xF793: +case 0xF794: +case 0xF795: +case 0xF796: +case 0xF797: +case 0xF798: +case 0xF799: +case 0xF79A: +case 0xF79B: +case 0xF79C: +case 0xF79D: +case 0xF79E: +case 0xF79F: +case 0xF7A0: +case 0xF7A1: +case 0xF7A2: +case 0xF7A3: +case 0xF7A4: +case 0xF7A5: +case 0xF7A6: +case 0xF7A7: +case 0xF7A8: +case 0xF7A9: +case 0xF7AA: +case 0xF7AB: +case 0xF7AC: +case 0xF7AD: +case 0xF7AE: +case 0xF7AF: +case 0xF7B0: +case 0xF7B1: +case 0xF7B2: +case 0xF7B3: +case 0xF7B4: +case 0xF7B5: +case 0xF7B6: +case 0xF7B7: +case 0xF7B8: +case 0xF7B9: +case 0xF7BA: +case 0xF7BB: +case 0xF7BC: +case 0xF7BD: +case 0xF7BE: +case 0xF7BF: +case 0xF7C0: +case 0xF7C1: +case 0xF7C2: +case 0xF7C3: +case 0xF7C4: +case 0xF7C5: +case 0xF7C6: +case 0xF7C7: +case 0xF7C8: +case 0xF7C9: +case 0xF7CA: +case 0xF7CB: +case 0xF7CC: +case 0xF7CD: +case 0xF7CE: +case 0xF7CF: +case 0xF7D0: +case 0xF7D1: +case 0xF7D2: +case 0xF7D3: +case 0xF7D4: +case 0xF7D5: +case 0xF7D6: +case 0xF7D7: +case 0xF7D8: +case 0xF7D9: +case 0xF7DA: +case 0xF7DB: +case 0xF7DC: +case 0xF7DD: +case 0xF7DE: +case 0xF7DF: +case 0xF7E0: +case 0xF7E1: +case 0xF7E2: +case 0xF7E3: +case 0xF7E4: +case 0xF7E5: +case 0xF7E6: +case 0xF7E7: +case 0xF7E8: +case 0xF7E9: +case 0xF7EA: +case 0xF7EB: +case 0xF7EC: +case 0xF7ED: +case 0xF7EE: +case 0xF7EF: +case 0xF7F0: +case 0xF7F1: +case 0xF7F2: +case 0xF7F3: +case 0xF7F4: +case 0xF7F5: +case 0xF7F6: +case 0xF7F7: +case 0xF7F8: +case 0xF7F9: +case 0xF7FA: +case 0xF7FB: +case 0xF7FC: +case 0xF7FD: +case 0xF7FE: +case 0xF7FF: +case 0xF800: +case 0xF801: +case 0xF802: +case 0xF803: +case 0xF804: +case 0xF805: +case 0xF806: +case 0xF807: +case 0xF808: +case 0xF809: +case 0xF80A: +case 0xF80B: +case 0xF80C: +case 0xF80D: +case 0xF80E: +case 0xF80F: +case 0xF810: +case 0xF811: +case 0xF812: +case 0xF813: +case 0xF814: +case 0xF815: +case 0xF816: +case 0xF817: +case 0xF818: +case 0xF819: +case 0xF81A: +case 0xF81B: +case 0xF81C: +case 0xF81D: +case 0xF81E: +case 0xF81F: +case 0xF820: +case 0xF821: +case 0xF822: +case 0xF823: +case 0xF824: +case 0xF825: +case 0xF826: +case 0xF827: +case 0xF828: +case 0xF829: +case 0xF82A: +case 0xF82B: +case 0xF82C: +case 0xF82D: +case 0xF82E: +case 0xF82F: +case 0xF830: +case 0xF831: +case 0xF832: +case 0xF833: +case 0xF834: +case 0xF835: +case 0xF836: +case 0xF837: +case 0xF838: +case 0xF839: +case 0xF83A: +case 0xF83B: +case 0xF83C: +case 0xF83D: +case 0xF83E: +case 0xF83F: +case 0xF840: +case 0xF841: +case 0xF842: +case 0xF843: +case 0xF844: +case 0xF845: +case 0xF846: +case 0xF847: +case 0xF848: +case 0xF849: +case 0xF84A: +case 0xF84B: +case 0xF84C: +case 0xF84D: +case 0xF84E: +case 0xF84F: +case 0xF850: +case 0xF851: +case 0xF852: +case 0xF853: +case 0xF854: +case 0xF855: +case 0xF856: +case 0xF857: +case 0xF858: +case 0xF859: +case 0xF85A: +case 0xF85B: +case 0xF85C: +case 0xF85D: +case 0xF85E: +case 0xF85F: +case 0xF860: +case 0xF861: +case 0xF862: +case 0xF863: +case 0xF864: +case 0xF865: +case 0xF866: +case 0xF867: +case 0xF868: +case 0xF869: +case 0xF86A: +case 0xF86B: +case 0xF86C: +case 0xF86D: +case 0xF86E: +case 0xF86F: +case 0xF870: +case 0xF871: +case 0xF872: +case 0xF873: +case 0xF874: +case 0xF875: +case 0xF876: +case 0xF877: +case 0xF878: +case 0xF879: +case 0xF87A: +case 0xF87B: +case 0xF87C: +case 0xF87D: +case 0xF87E: +case 0xF87F: +case 0xF880: +case 0xF881: +case 0xF882: +case 0xF883: +case 0xF884: +case 0xF885: +case 0xF886: +case 0xF887: +case 0xF888: +case 0xF889: +case 0xF88A: +case 0xF88B: +case 0xF88C: +case 0xF88D: +case 0xF88E: +case 0xF88F: +case 0xF890: +case 0xF891: +case 0xF892: +case 0xF893: +case 0xF894: +case 0xF895: +case 0xF896: +case 0xF897: +case 0xF898: +case 0xF899: +case 0xF89A: +case 0xF89B: +case 0xF89C: +case 0xF89D: +case 0xF89E: +case 0xF89F: +case 0xF8A0: +case 0xF8A1: +case 0xF8A2: +case 0xF8A3: +case 0xF8A4: +case 0xF8A5: +case 0xF8A6: +case 0xF8A7: +case 0xF8A8: +case 0xF8A9: +case 0xF8AA: +case 0xF8AB: +case 0xF8AC: +case 0xF8AD: +case 0xF8AE: +case 0xF8AF: +case 0xF8B0: +case 0xF8B1: +case 0xF8B2: +case 0xF8B3: +case 0xF8B4: +case 0xF8B5: +case 0xF8B6: +case 0xF8B7: +case 0xF8B8: +case 0xF8B9: +case 0xF8BA: +case 0xF8BB: +case 0xF8BC: +case 0xF8BD: +case 0xF8BE: +case 0xF8BF: +case 0xF8C0: +case 0xF8C1: +case 0xF8C2: +case 0xF8C3: +case 0xF8C4: +case 0xF8C5: +case 0xF8C6: +case 0xF8C7: +case 0xF8C8: +case 0xF8C9: +case 0xF8CA: +case 0xF8CB: +case 0xF8CC: +case 0xF8CD: +case 0xF8CE: +case 0xF8CF: +case 0xF8D0: +case 0xF8D1: +case 0xF8D2: +case 0xF8D3: +case 0xF8D4: +case 0xF8D5: +case 0xF8D6: +case 0xF8D7: +case 0xF8D8: +case 0xF8D9: +case 0xF8DA: +case 0xF8DB: +case 0xF8DC: +case 0xF8DD: +case 0xF8DE: +case 0xF8DF: +case 0xF8E0: +case 0xF8E1: +case 0xF8E2: +case 0xF8E3: +case 0xF8E4: +case 0xF8E5: +case 0xF8E6: +case 0xF8E7: +case 0xF8E8: +case 0xF8E9: +case 0xF8EA: +case 0xF8EB: +case 0xF8EC: +case 0xF8ED: +case 0xF8EE: +case 0xF8EF: +case 0xF8F0: +case 0xF8F1: +case 0xF8F2: +case 0xF8F3: +case 0xF8F4: +case 0xF8F5: +case 0xF8F6: +case 0xF8F7: +case 0xF8F8: +case 0xF8F9: +case 0xF8FA: +case 0xF8FB: +case 0xF8FC: +case 0xF8FD: +case 0xF8FE: +case 0xF8FF: +case 0xF900: +case 0xF901: +case 0xF902: +case 0xF903: +case 0xF904: +case 0xF905: +case 0xF906: +case 0xF907: +case 0xF908: +case 0xF909: +case 0xF90A: +case 0xF90B: +case 0xF90C: +case 0xF90D: +case 0xF90E: +case 0xF90F: +case 0xF910: +case 0xF911: +case 0xF912: +case 0xF913: +case 0xF914: +case 0xF915: +case 0xF916: +case 0xF917: +case 0xF918: +case 0xF919: +case 0xF91A: +case 0xF91B: +case 0xF91C: +case 0xF91D: +case 0xF91E: +case 0xF91F: +case 0xF920: +case 0xF921: +case 0xF922: +case 0xF923: +case 0xF924: +case 0xF925: +case 0xF926: +case 0xF927: +case 0xF928: +case 0xF929: +case 0xF92A: +case 0xF92B: +case 0xF92C: +case 0xF92D: +case 0xF92E: +case 0xF92F: +case 0xF930: +case 0xF931: +case 0xF932: +case 0xF933: +case 0xF934: +case 0xF935: +case 0xF936: +case 0xF937: +case 0xF938: +case 0xF939: +case 0xF93A: +case 0xF93B: +case 0xF93C: +case 0xF93D: +case 0xF93E: +case 0xF93F: +case 0xF940: +case 0xF941: +case 0xF942: +case 0xF943: +case 0xF944: +case 0xF945: +case 0xF946: +case 0xF947: +case 0xF948: +case 0xF949: +case 0xF94A: +case 0xF94B: +case 0xF94C: +case 0xF94D: +case 0xF94E: +case 0xF94F: +case 0xF950: +case 0xF951: +case 0xF952: +case 0xF953: +case 0xF954: +case 0xF955: +case 0xF956: +case 0xF957: +case 0xF958: +case 0xF959: +case 0xF95A: +case 0xF95B: +case 0xF95C: +case 0xF95D: +case 0xF95E: +case 0xF95F: +case 0xF960: +case 0xF961: +case 0xF962: +case 0xF963: +case 0xF964: +case 0xF965: +case 0xF966: +case 0xF967: +case 0xF968: +case 0xF969: +case 0xF96A: +case 0xF96B: +case 0xF96C: +case 0xF96D: +case 0xF96E: +case 0xF96F: +case 0xF970: +case 0xF971: +case 0xF972: +case 0xF973: +case 0xF974: +case 0xF975: +case 0xF976: +case 0xF977: +case 0xF978: +case 0xF979: +case 0xF97A: +case 0xF97B: +case 0xF97C: +case 0xF97D: +case 0xF97E: +case 0xF97F: +case 0xF980: +case 0xF981: +case 0xF982: +case 0xF983: +case 0xF984: +case 0xF985: +case 0xF986: +case 0xF987: +case 0xF988: +case 0xF989: +case 0xF98A: +case 0xF98B: +case 0xF98C: +case 0xF98D: +case 0xF98E: +case 0xF98F: +case 0xF990: +case 0xF991: +case 0xF992: +case 0xF993: +case 0xF994: +case 0xF995: +case 0xF996: +case 0xF997: +case 0xF998: +case 0xF999: +case 0xF99A: +case 0xF99B: +case 0xF99C: +case 0xF99D: +case 0xF99E: +case 0xF99F: +case 0xF9A0: +case 0xF9A1: +case 0xF9A2: +case 0xF9A3: +case 0xF9A4: +case 0xF9A5: +case 0xF9A6: +case 0xF9A7: +case 0xF9A8: +case 0xF9A9: +case 0xF9AA: +case 0xF9AB: +case 0xF9AC: +case 0xF9AD: +case 0xF9AE: +case 0xF9AF: +case 0xF9B0: +case 0xF9B1: +case 0xF9B2: +case 0xF9B3: +case 0xF9B4: +case 0xF9B5: +case 0xF9B6: +case 0xF9B7: +case 0xF9B8: +case 0xF9B9: +case 0xF9BA: +case 0xF9BB: +case 0xF9BC: +case 0xF9BD: +case 0xF9BE: +case 0xF9BF: +case 0xF9C0: +case 0xF9C1: +case 0xF9C2: +case 0xF9C3: +case 0xF9C4: +case 0xF9C5: +case 0xF9C6: +case 0xF9C7: +case 0xF9C8: +case 0xF9C9: +case 0xF9CA: +case 0xF9CB: +case 0xF9CC: +case 0xF9CD: +case 0xF9CE: +case 0xF9CF: +case 0xF9D0: +case 0xF9D1: +case 0xF9D2: +case 0xF9D3: +case 0xF9D4: +case 0xF9D5: +case 0xF9D6: +case 0xF9D7: +case 0xF9D8: +case 0xF9D9: +case 0xF9DA: +case 0xF9DB: +case 0xF9DC: +case 0xF9DD: +case 0xF9DE: +case 0xF9DF: +case 0xF9E0: +case 0xF9E1: +case 0xF9E2: +case 0xF9E3: +case 0xF9E4: +case 0xF9E5: +case 0xF9E6: +case 0xF9E7: +case 0xF9E8: +case 0xF9E9: +case 0xF9EA: +case 0xF9EB: +case 0xF9EC: +case 0xF9ED: +case 0xF9EE: +case 0xF9EF: +case 0xF9F0: +case 0xF9F1: +case 0xF9F2: +case 0xF9F3: +case 0xF9F4: +case 0xF9F5: +case 0xF9F6: +case 0xF9F7: +case 0xF9F8: +case 0xF9F9: +case 0xF9FA: +case 0xF9FB: +case 0xF9FC: +case 0xF9FD: +case 0xF9FE: +case 0xF9FF: +case 0xFA00: +case 0xFA01: +case 0xFA02: +case 0xFA03: +case 0xFA04: +case 0xFA05: +case 0xFA06: +case 0xFA07: +case 0xFA08: +case 0xFA09: +case 0xFA0A: +case 0xFA0B: +case 0xFA0C: +case 0xFA0D: +case 0xFA0E: +case 0xFA0F: +case 0xFA10: +case 0xFA11: +case 0xFA12: +case 0xFA13: +case 0xFA14: +case 0xFA15: +case 0xFA16: +case 0xFA17: +case 0xFA18: +case 0xFA19: +case 0xFA1A: +case 0xFA1B: +case 0xFA1C: +case 0xFA1D: +case 0xFA1E: +case 0xFA1F: +case 0xFA20: +case 0xFA21: +case 0xFA22: +case 0xFA23: +case 0xFA24: +case 0xFA25: +case 0xFA26: +case 0xFA27: +case 0xFA28: +case 0xFA29: +case 0xFA2A: +case 0xFA2B: +case 0xFA2C: +case 0xFA2D: +case 0xFA2E: +case 0xFA2F: +case 0xFA30: +case 0xFA31: +case 0xFA32: +case 0xFA33: +case 0xFA34: +case 0xFA35: +case 0xFA36: +case 0xFA37: +case 0xFA38: +case 0xFA39: +case 0xFA3A: +case 0xFA3B: +case 0xFA3C: +case 0xFA3D: +case 0xFA3E: +case 0xFA3F: +case 0xFA40: +case 0xFA41: +case 0xFA42: +case 0xFA43: +case 0xFA44: +case 0xFA45: +case 0xFA46: +case 0xFA47: +case 0xFA48: +case 0xFA49: +case 0xFA4A: +case 0xFA4B: +case 0xFA4C: +case 0xFA4D: +case 0xFA4E: +case 0xFA4F: +case 0xFA50: +case 0xFA51: +case 0xFA52: +case 0xFA53: +case 0xFA54: +case 0xFA55: +case 0xFA56: +case 0xFA57: +case 0xFA58: +case 0xFA59: +case 0xFA5A: +case 0xFA5B: +case 0xFA5C: +case 0xFA5D: +case 0xFA5E: +case 0xFA5F: +case 0xFA60: +case 0xFA61: +case 0xFA62: +case 0xFA63: +case 0xFA64: +case 0xFA65: +case 0xFA66: +case 0xFA67: +case 0xFA68: +case 0xFA69: +case 0xFA6A: +case 0xFA6B: +case 0xFA6C: +case 0xFA6D: +case 0xFA6E: +case 0xFA6F: +case 0xFA70: +case 0xFA71: +case 0xFA72: +case 0xFA73: +case 0xFA74: +case 0xFA75: +case 0xFA76: +case 0xFA77: +case 0xFA78: +case 0xFA79: +case 0xFA7A: +case 0xFA7B: +case 0xFA7C: +case 0xFA7D: +case 0xFA7E: +case 0xFA7F: +case 0xFA80: +case 0xFA81: +case 0xFA82: +case 0xFA83: +case 0xFA84: +case 0xFA85: +case 0xFA86: +case 0xFA87: +case 0xFA88: +case 0xFA89: +case 0xFA8A: +case 0xFA8B: +case 0xFA8C: +case 0xFA8D: +case 0xFA8E: +case 0xFA8F: +case 0xFA90: +case 0xFA91: +case 0xFA92: +case 0xFA93: +case 0xFA94: +case 0xFA95: +case 0xFA96: +case 0xFA97: +case 0xFA98: +case 0xFA99: +case 0xFA9A: +case 0xFA9B: +case 0xFA9C: +case 0xFA9D: +case 0xFA9E: +case 0xFA9F: +case 0xFAA0: +case 0xFAA1: +case 0xFAA2: +case 0xFAA3: +case 0xFAA4: +case 0xFAA5: +case 0xFAA6: +case 0xFAA7: +case 0xFAA8: +case 0xFAA9: +case 0xFAAA: +case 0xFAAB: +case 0xFAAC: +case 0xFAAD: +case 0xFAAE: +case 0xFAAF: +case 0xFAB0: +case 0xFAB1: +case 0xFAB2: +case 0xFAB3: +case 0xFAB4: +case 0xFAB5: +case 0xFAB6: +case 0xFAB7: +case 0xFAB8: +case 0xFAB9: +case 0xFABA: +case 0xFABB: +case 0xFABC: +case 0xFABD: +case 0xFABE: +case 0xFABF: +case 0xFAC0: +case 0xFAC1: +case 0xFAC2: +case 0xFAC3: +case 0xFAC4: +case 0xFAC5: +case 0xFAC6: +case 0xFAC7: +case 0xFAC8: +case 0xFAC9: +case 0xFACA: +case 0xFACB: +case 0xFACC: +case 0xFACD: +case 0xFACE: +case 0xFACF: +case 0xFAD0: +case 0xFAD1: +case 0xFAD2: +case 0xFAD3: +case 0xFAD4: +case 0xFAD5: +case 0xFAD6: +case 0xFAD7: +case 0xFAD8: +case 0xFAD9: +case 0xFADA: +case 0xFADB: +case 0xFADC: +case 0xFADD: +case 0xFADE: +case 0xFADF: +case 0xFAE0: +case 0xFAE1: +case 0xFAE2: +case 0xFAE3: +case 0xFAE4: +case 0xFAE5: +case 0xFAE6: +case 0xFAE7: +case 0xFAE8: +case 0xFAE9: +case 0xFAEA: +case 0xFAEB: +case 0xFAEC: +case 0xFAED: +case 0xFAEE: +case 0xFAEF: +case 0xFAF0: +case 0xFAF1: +case 0xFAF2: +case 0xFAF3: +case 0xFAF4: +case 0xFAF5: +case 0xFAF6: +case 0xFAF7: +case 0xFAF8: +case 0xFAF9: +case 0xFAFA: +case 0xFAFB: +case 0xFAFC: +case 0xFAFD: +case 0xFAFE: +case 0xFAFF: +case 0xFB00: +case 0xFB01: +case 0xFB02: +case 0xFB03: +case 0xFB04: +case 0xFB05: +case 0xFB06: +case 0xFB07: +case 0xFB08: +case 0xFB09: +case 0xFB0A: +case 0xFB0B: +case 0xFB0C: +case 0xFB0D: +case 0xFB0E: +case 0xFB0F: +case 0xFB10: +case 0xFB11: +case 0xFB12: +case 0xFB13: +case 0xFB14: +case 0xFB15: +case 0xFB16: +case 0xFB17: +case 0xFB18: +case 0xFB19: +case 0xFB1A: +case 0xFB1B: +case 0xFB1C: +case 0xFB1D: +case 0xFB1E: +case 0xFB1F: +case 0xFB20: +case 0xFB21: +case 0xFB22: +case 0xFB23: +case 0xFB24: +case 0xFB25: +case 0xFB26: +case 0xFB27: +case 0xFB28: +case 0xFB29: +case 0xFB2A: +case 0xFB2B: +case 0xFB2C: +case 0xFB2D: +case 0xFB2E: +case 0xFB2F: +case 0xFB30: +case 0xFB31: +case 0xFB32: +case 0xFB33: +case 0xFB34: +case 0xFB35: +case 0xFB36: +case 0xFB37: +case 0xFB38: +case 0xFB39: +case 0xFB3A: +case 0xFB3B: +case 0xFB3C: +case 0xFB3D: +case 0xFB3E: +case 0xFB3F: +case 0xFB40: +case 0xFB41: +case 0xFB42: +case 0xFB43: +case 0xFB44: +case 0xFB45: +case 0xFB46: +case 0xFB47: +case 0xFB48: +case 0xFB49: +case 0xFB4A: +case 0xFB4B: +case 0xFB4C: +case 0xFB4D: +case 0xFB4E: +case 0xFB4F: +case 0xFB50: +case 0xFB51: +case 0xFB52: +case 0xFB53: +case 0xFB54: +case 0xFB55: +case 0xFB56: +case 0xFB57: +case 0xFB58: +case 0xFB59: +case 0xFB5A: +case 0xFB5B: +case 0xFB5C: +case 0xFB5D: +case 0xFB5E: +case 0xFB5F: +case 0xFB60: +case 0xFB61: +case 0xFB62: +case 0xFB63: +case 0xFB64: +case 0xFB65: +case 0xFB66: +case 0xFB67: +case 0xFB68: +case 0xFB69: +case 0xFB6A: +case 0xFB6B: +case 0xFB6C: +case 0xFB6D: +case 0xFB6E: +case 0xFB6F: +case 0xFB70: +case 0xFB71: +case 0xFB72: +case 0xFB73: +case 0xFB74: +case 0xFB75: +case 0xFB76: +case 0xFB77: +case 0xFB78: +case 0xFB79: +case 0xFB7A: +case 0xFB7B: +case 0xFB7C: +case 0xFB7D: +case 0xFB7E: +case 0xFB7F: +case 0xFB80: +case 0xFB81: +case 0xFB82: +case 0xFB83: +case 0xFB84: +case 0xFB85: +case 0xFB86: +case 0xFB87: +case 0xFB88: +case 0xFB89: +case 0xFB8A: +case 0xFB8B: +case 0xFB8C: +case 0xFB8D: +case 0xFB8E: +case 0xFB8F: +case 0xFB90: +case 0xFB91: +case 0xFB92: +case 0xFB93: +case 0xFB94: +case 0xFB95: +case 0xFB96: +case 0xFB97: +case 0xFB98: +case 0xFB99: +case 0xFB9A: +case 0xFB9B: +case 0xFB9C: +case 0xFB9D: +case 0xFB9E: +case 0xFB9F: +case 0xFBA0: +case 0xFBA1: +case 0xFBA2: +case 0xFBA3: +case 0xFBA4: +case 0xFBA5: +case 0xFBA6: +case 0xFBA7: +case 0xFBA8: +case 0xFBA9: +case 0xFBAA: +case 0xFBAB: +case 0xFBAC: +case 0xFBAD: +case 0xFBAE: +case 0xFBAF: +case 0xFBB0: +case 0xFBB1: +case 0xFBB2: +case 0xFBB3: +case 0xFBB4: +case 0xFBB5: +case 0xFBB6: +case 0xFBB7: +case 0xFBB8: +case 0xFBB9: +case 0xFBBA: +case 0xFBBB: +case 0xFBBC: +case 0xFBBD: +case 0xFBBE: +case 0xFBBF: +case 0xFBC0: +case 0xFBC1: +case 0xFBC2: +case 0xFBC3: +case 0xFBC4: +case 0xFBC5: +case 0xFBC6: +case 0xFBC7: +case 0xFBC8: +case 0xFBC9: +case 0xFBCA: +case 0xFBCB: +case 0xFBCC: +case 0xFBCD: +case 0xFBCE: +case 0xFBCF: +case 0xFBD0: +case 0xFBD1: +case 0xFBD2: +case 0xFBD3: +case 0xFBD4: +case 0xFBD5: +case 0xFBD6: +case 0xFBD7: +case 0xFBD8: +case 0xFBD9: +case 0xFBDA: +case 0xFBDB: +case 0xFBDC: +case 0xFBDD: +case 0xFBDE: +case 0xFBDF: +case 0xFBE0: +case 0xFBE1: +case 0xFBE2: +case 0xFBE3: +case 0xFBE4: +case 0xFBE5: +case 0xFBE6: +case 0xFBE7: +case 0xFBE8: +case 0xFBE9: +case 0xFBEA: +case 0xFBEB: +case 0xFBEC: +case 0xFBED: +case 0xFBEE: +case 0xFBEF: +case 0xFBF0: +case 0xFBF1: +case 0xFBF2: +case 0xFBF3: +case 0xFBF4: +case 0xFBF5: +case 0xFBF6: +case 0xFBF7: +case 0xFBF8: +case 0xFBF9: +case 0xFBFA: +case 0xFBFB: +case 0xFBFC: +case 0xFBFD: +case 0xFBFE: +case 0xFBFF: +case 0xFC00: +case 0xFC01: +case 0xFC02: +case 0xFC03: +case 0xFC04: +case 0xFC05: +case 0xFC06: +case 0xFC07: +case 0xFC08: +case 0xFC09: +case 0xFC0A: +case 0xFC0B: +case 0xFC0C: +case 0xFC0D: +case 0xFC0E: +case 0xFC0F: +case 0xFC10: +case 0xFC11: +case 0xFC12: +case 0xFC13: +case 0xFC14: +case 0xFC15: +case 0xFC16: +case 0xFC17: +case 0xFC18: +case 0xFC19: +case 0xFC1A: +case 0xFC1B: +case 0xFC1C: +case 0xFC1D: +case 0xFC1E: +case 0xFC1F: +case 0xFC20: +case 0xFC21: +case 0xFC22: +case 0xFC23: +case 0xFC24: +case 0xFC25: +case 0xFC26: +case 0xFC27: +case 0xFC28: +case 0xFC29: +case 0xFC2A: +case 0xFC2B: +case 0xFC2C: +case 0xFC2D: +case 0xFC2E: +case 0xFC2F: +case 0xFC30: +case 0xFC31: +case 0xFC32: +case 0xFC33: +case 0xFC34: +case 0xFC35: +case 0xFC36: +case 0xFC37: +case 0xFC38: +case 0xFC39: +case 0xFC3A: +case 0xFC3B: +case 0xFC3C: +case 0xFC3D: +case 0xFC3E: +case 0xFC3F: +case 0xFC40: +case 0xFC41: +case 0xFC42: +case 0xFC43: +case 0xFC44: +case 0xFC45: +case 0xFC46: +case 0xFC47: +case 0xFC48: +case 0xFC49: +case 0xFC4A: +case 0xFC4B: +case 0xFC4C: +case 0xFC4D: +case 0xFC4E: +case 0xFC4F: +case 0xFC50: +case 0xFC51: +case 0xFC52: +case 0xFC53: +case 0xFC54: +case 0xFC55: +case 0xFC56: +case 0xFC57: +case 0xFC58: +case 0xFC59: +case 0xFC5A: +case 0xFC5B: +case 0xFC5C: +case 0xFC5D: +case 0xFC5E: +case 0xFC5F: +case 0xFC60: +case 0xFC61: +case 0xFC62: +case 0xFC63: +case 0xFC64: +case 0xFC65: +case 0xFC66: +case 0xFC67: +case 0xFC68: +case 0xFC69: +case 0xFC6A: +case 0xFC6B: +case 0xFC6C: +case 0xFC6D: +case 0xFC6E: +case 0xFC6F: +case 0xFC70: +case 0xFC71: +case 0xFC72: +case 0xFC73: +case 0xFC74: +case 0xFC75: +case 0xFC76: +case 0xFC77: +case 0xFC78: +case 0xFC79: +case 0xFC7A: +case 0xFC7B: +case 0xFC7C: +case 0xFC7D: +case 0xFC7E: +case 0xFC7F: +case 0xFC80: +case 0xFC81: +case 0xFC82: +case 0xFC83: +case 0xFC84: +case 0xFC85: +case 0xFC86: +case 0xFC87: +case 0xFC88: +case 0xFC89: +case 0xFC8A: +case 0xFC8B: +case 0xFC8C: +case 0xFC8D: +case 0xFC8E: +case 0xFC8F: +case 0xFC90: +case 0xFC91: +case 0xFC92: +case 0xFC93: +case 0xFC94: +case 0xFC95: +case 0xFC96: +case 0xFC97: +case 0xFC98: +case 0xFC99: +case 0xFC9A: +case 0xFC9B: +case 0xFC9C: +case 0xFC9D: +case 0xFC9E: +case 0xFC9F: +case 0xFCA0: +case 0xFCA1: +case 0xFCA2: +case 0xFCA3: +case 0xFCA4: +case 0xFCA5: +case 0xFCA6: +case 0xFCA7: +case 0xFCA8: +case 0xFCA9: +case 0xFCAA: +case 0xFCAB: +case 0xFCAC: +case 0xFCAD: +case 0xFCAE: +case 0xFCAF: +case 0xFCB0: +case 0xFCB1: +case 0xFCB2: +case 0xFCB3: +case 0xFCB4: +case 0xFCB5: +case 0xFCB6: +case 0xFCB7: +case 0xFCB8: +case 0xFCB9: +case 0xFCBA: +case 0xFCBB: +case 0xFCBC: +case 0xFCBD: +case 0xFCBE: +case 0xFCBF: +case 0xFCC0: +case 0xFCC1: +case 0xFCC2: +case 0xFCC3: +case 0xFCC4: +case 0xFCC5: +case 0xFCC6: +case 0xFCC7: +case 0xFCC8: +case 0xFCC9: +case 0xFCCA: +case 0xFCCB: +case 0xFCCC: +case 0xFCCD: +case 0xFCCE: +case 0xFCCF: +case 0xFCD0: +case 0xFCD1: +case 0xFCD2: +case 0xFCD3: +case 0xFCD4: +case 0xFCD5: +case 0xFCD6: +case 0xFCD7: +case 0xFCD8: +case 0xFCD9: +case 0xFCDA: +case 0xFCDB: +case 0xFCDC: +case 0xFCDD: +case 0xFCDE: +case 0xFCDF: +case 0xFCE0: +case 0xFCE1: +case 0xFCE2: +case 0xFCE3: +case 0xFCE4: +case 0xFCE5: +case 0xFCE6: +case 0xFCE7: +case 0xFCE8: +case 0xFCE9: +case 0xFCEA: +case 0xFCEB: +case 0xFCEC: +case 0xFCED: +case 0xFCEE: +case 0xFCEF: +case 0xFCF0: +case 0xFCF1: +case 0xFCF2: +case 0xFCF3: +case 0xFCF4: +case 0xFCF5: +case 0xFCF6: +case 0xFCF7: +case 0xFCF8: +case 0xFCF9: +case 0xFCFA: +case 0xFCFB: +case 0xFCFC: +case 0xFCFD: +case 0xFCFE: +case 0xFCFF: +case 0xFD00: +case 0xFD01: +case 0xFD02: +case 0xFD03: +case 0xFD04: +case 0xFD05: +case 0xFD06: +case 0xFD07: +case 0xFD08: +case 0xFD09: +case 0xFD0A: +case 0xFD0B: +case 0xFD0C: +case 0xFD0D: +case 0xFD0E: +case 0xFD0F: +case 0xFD10: +case 0xFD11: +case 0xFD12: +case 0xFD13: +case 0xFD14: +case 0xFD15: +case 0xFD16: +case 0xFD17: +case 0xFD18: +case 0xFD19: +case 0xFD1A: +case 0xFD1B: +case 0xFD1C: +case 0xFD1D: +case 0xFD1E: +case 0xFD1F: +case 0xFD20: +case 0xFD21: +case 0xFD22: +case 0xFD23: +case 0xFD24: +case 0xFD25: +case 0xFD26: +case 0xFD27: +case 0xFD28: +case 0xFD29: +case 0xFD2A: +case 0xFD2B: +case 0xFD2C: +case 0xFD2D: +case 0xFD2E: +case 0xFD2F: +case 0xFD30: +case 0xFD31: +case 0xFD32: +case 0xFD33: +case 0xFD34: +case 0xFD35: +case 0xFD36: +case 0xFD37: +case 0xFD38: +case 0xFD39: +case 0xFD3A: +case 0xFD3B: +case 0xFD3C: +case 0xFD3D: +case 0xFD3E: +case 0xFD3F: +case 0xFD40: +case 0xFD41: +case 0xFD42: +case 0xFD43: +case 0xFD44: +case 0xFD45: +case 0xFD46: +case 0xFD47: +case 0xFD48: +case 0xFD49: +case 0xFD4A: +case 0xFD4B: +case 0xFD4C: +case 0xFD4D: +case 0xFD4E: +case 0xFD4F: +case 0xFD50: +case 0xFD51: +case 0xFD52: +case 0xFD53: +case 0xFD54: +case 0xFD55: +case 0xFD56: +case 0xFD57: +case 0xFD58: +case 0xFD59: +case 0xFD5A: +case 0xFD5B: +case 0xFD5C: +case 0xFD5D: +case 0xFD5E: +case 0xFD5F: +case 0xFD60: +case 0xFD61: +case 0xFD62: +case 0xFD63: +case 0xFD64: +case 0xFD65: +case 0xFD66: +case 0xFD67: +case 0xFD68: +case 0xFD69: +case 0xFD6A: +case 0xFD6B: +case 0xFD6C: +case 0xFD6D: +case 0xFD6E: +case 0xFD6F: +case 0xFD70: +case 0xFD71: +case 0xFD72: +case 0xFD73: +case 0xFD74: +case 0xFD75: +case 0xFD76: +case 0xFD77: +case 0xFD78: +case 0xFD79: +case 0xFD7A: +case 0xFD7B: +case 0xFD7C: +case 0xFD7D: +case 0xFD7E: +case 0xFD7F: +case 0xFD80: +case 0xFD81: +case 0xFD82: +case 0xFD83: +case 0xFD84: +case 0xFD85: +case 0xFD86: +case 0xFD87: +case 0xFD88: +case 0xFD89: +case 0xFD8A: +case 0xFD8B: +case 0xFD8C: +case 0xFD8D: +case 0xFD8E: +case 0xFD8F: +case 0xFD90: +case 0xFD91: +case 0xFD92: +case 0xFD93: +case 0xFD94: +case 0xFD95: +case 0xFD96: +case 0xFD97: +case 0xFD98: +case 0xFD99: +case 0xFD9A: +case 0xFD9B: +case 0xFD9C: +case 0xFD9D: +case 0xFD9E: +case 0xFD9F: +case 0xFDA0: +case 0xFDA1: +case 0xFDA2: +case 0xFDA3: +case 0xFDA4: +case 0xFDA5: +case 0xFDA6: +case 0xFDA7: +case 0xFDA8: +case 0xFDA9: +case 0xFDAA: +case 0xFDAB: +case 0xFDAC: +case 0xFDAD: +case 0xFDAE: +case 0xFDAF: +case 0xFDB0: +case 0xFDB1: +case 0xFDB2: +case 0xFDB3: +case 0xFDB4: +case 0xFDB5: +case 0xFDB6: +case 0xFDB7: +case 0xFDB8: +case 0xFDB9: +case 0xFDBA: +case 0xFDBB: +case 0xFDBC: +case 0xFDBD: +case 0xFDBE: +case 0xFDBF: +case 0xFDC0: +case 0xFDC1: +case 0xFDC2: +case 0xFDC3: +case 0xFDC4: +case 0xFDC5: +case 0xFDC6: +case 0xFDC7: +case 0xFDC8: +case 0xFDC9: +case 0xFDCA: +case 0xFDCB: +case 0xFDCC: +case 0xFDCD: +case 0xFDCE: +case 0xFDCF: +case 0xFDD0: +case 0xFDD1: +case 0xFDD2: +case 0xFDD3: +case 0xFDD4: +case 0xFDD5: +case 0xFDD6: +case 0xFDD7: +case 0xFDD8: +case 0xFDD9: +case 0xFDDA: +case 0xFDDB: +case 0xFDDC: +case 0xFDDD: +case 0xFDDE: +case 0xFDDF: +case 0xFDE0: +case 0xFDE1: +case 0xFDE2: +case 0xFDE3: +case 0xFDE4: +case 0xFDE5: +case 0xFDE6: +case 0xFDE7: +case 0xFDE8: +case 0xFDE9: +case 0xFDEA: +case 0xFDEB: +case 0xFDEC: +case 0xFDED: +case 0xFDEE: +case 0xFDEF: +case 0xFDF0: +case 0xFDF1: +case 0xFDF2: +case 0xFDF3: +case 0xFDF4: +case 0xFDF5: +case 0xFDF6: +case 0xFDF7: +case 0xFDF8: +case 0xFDF9: +case 0xFDFA: +case 0xFDFB: +case 0xFDFC: +case 0xFDFD: +case 0xFDFE: +case 0xFDFF: +case 0xFE00: +case 0xFE01: +case 0xFE02: +case 0xFE03: +case 0xFE04: +case 0xFE05: +case 0xFE06: +case 0xFE07: +case 0xFE08: +case 0xFE09: +case 0xFE0A: +case 0xFE0B: +case 0xFE0C: +case 0xFE0D: +case 0xFE0E: +case 0xFE0F: +case 0xFE10: +case 0xFE11: +case 0xFE12: +case 0xFE13: +case 0xFE14: +case 0xFE15: +case 0xFE16: +case 0xFE17: +case 0xFE18: +case 0xFE19: +case 0xFE1A: +case 0xFE1B: +case 0xFE1C: +case 0xFE1D: +case 0xFE1E: +case 0xFE1F: +case 0xFE20: +case 0xFE21: +case 0xFE22: +case 0xFE23: +case 0xFE24: +case 0xFE25: +case 0xFE26: +case 0xFE27: +case 0xFE28: +case 0xFE29: +case 0xFE2A: +case 0xFE2B: +case 0xFE2C: +case 0xFE2D: +case 0xFE2E: +case 0xFE2F: +case 0xFE30: +case 0xFE31: +case 0xFE32: +case 0xFE33: +case 0xFE34: +case 0xFE35: +case 0xFE36: +case 0xFE37: +case 0xFE38: +case 0xFE39: +case 0xFE3A: +case 0xFE3B: +case 0xFE3C: +case 0xFE3D: +case 0xFE3E: +case 0xFE3F: +case 0xFE40: +case 0xFE41: +case 0xFE42: +case 0xFE43: +case 0xFE44: +case 0xFE45: +case 0xFE46: +case 0xFE47: +case 0xFE48: +case 0xFE49: +case 0xFE4A: +case 0xFE4B: +case 0xFE4C: +case 0xFE4D: +case 0xFE4E: +case 0xFE4F: +case 0xFE50: +case 0xFE51: +case 0xFE52: +case 0xFE53: +case 0xFE54: +case 0xFE55: +case 0xFE56: +case 0xFE57: +case 0xFE58: +case 0xFE59: +case 0xFE5A: +case 0xFE5B: +case 0xFE5C: +case 0xFE5D: +case 0xFE5E: +case 0xFE5F: +case 0xFE60: +case 0xFE61: +case 0xFE62: +case 0xFE63: +case 0xFE64: +case 0xFE65: +case 0xFE66: +case 0xFE67: +case 0xFE68: +case 0xFE69: +case 0xFE6A: +case 0xFE6B: +case 0xFE6C: +case 0xFE6D: +case 0xFE6E: +case 0xFE6F: +case 0xFE70: +case 0xFE71: +case 0xFE72: +case 0xFE73: +case 0xFE74: +case 0xFE75: +case 0xFE76: +case 0xFE77: +case 0xFE78: +case 0xFE79: +case 0xFE7A: +case 0xFE7B: +case 0xFE7C: +case 0xFE7D: +case 0xFE7E: +case 0xFE7F: +case 0xFE80: +case 0xFE81: +case 0xFE82: +case 0xFE83: +case 0xFE84: +case 0xFE85: +case 0xFE86: +case 0xFE87: +case 0xFE88: +case 0xFE89: +case 0xFE8A: +case 0xFE8B: +case 0xFE8C: +case 0xFE8D: +case 0xFE8E: +case 0xFE8F: +case 0xFE90: +case 0xFE91: +case 0xFE92: +case 0xFE93: +case 0xFE94: +case 0xFE95: +case 0xFE96: +case 0xFE97: +case 0xFE98: +case 0xFE99: +case 0xFE9A: +case 0xFE9B: +case 0xFE9C: +case 0xFE9D: +case 0xFE9E: +case 0xFE9F: +case 0xFEA0: +case 0xFEA1: +case 0xFEA2: +case 0xFEA3: +case 0xFEA4: +case 0xFEA5: +case 0xFEA6: +case 0xFEA7: +case 0xFEA8: +case 0xFEA9: +case 0xFEAA: +case 0xFEAB: +case 0xFEAC: +case 0xFEAD: +case 0xFEAE: +case 0xFEAF: +case 0xFEB0: +case 0xFEB1: +case 0xFEB2: +case 0xFEB3: +case 0xFEB4: +case 0xFEB5: +case 0xFEB6: +case 0xFEB7: +case 0xFEB8: +case 0xFEB9: +case 0xFEBA: +case 0xFEBB: +case 0xFEBC: +case 0xFEBD: +case 0xFEBE: +case 0xFEBF: +case 0xFEC0: +case 0xFEC1: +case 0xFEC2: +case 0xFEC3: +case 0xFEC4: +case 0xFEC5: +case 0xFEC6: +case 0xFEC7: +case 0xFEC8: +case 0xFEC9: +case 0xFECA: +case 0xFECB: +case 0xFECC: +case 0xFECD: +case 0xFECE: +case 0xFECF: +case 0xFED0: +case 0xFED1: +case 0xFED2: +case 0xFED3: +case 0xFED4: +case 0xFED5: +case 0xFED6: +case 0xFED7: +case 0xFED8: +case 0xFED9: +case 0xFEDA: +case 0xFEDB: +case 0xFEDC: +case 0xFEDD: +case 0xFEDE: +case 0xFEDF: +case 0xFEE0: +case 0xFEE1: +case 0xFEE2: +case 0xFEE3: +case 0xFEE4: +case 0xFEE5: +case 0xFEE6: +case 0xFEE7: +case 0xFEE8: +case 0xFEE9: +case 0xFEEA: +case 0xFEEB: +case 0xFEEC: +case 0xFEED: +case 0xFEEE: +case 0xFEEF: +case 0xFEF0: +case 0xFEF1: +case 0xFEF2: +case 0xFEF3: +case 0xFEF4: +case 0xFEF5: +case 0xFEF6: +case 0xFEF7: +case 0xFEF8: +case 0xFEF9: +case 0xFEFA: +case 0xFEFB: +case 0xFEFC: +case 0xFEFD: +case 0xFEFE: +case 0xFEFF: +case 0xFF00: +case 0xFF01: +case 0xFF02: +case 0xFF03: +case 0xFF04: +case 0xFF05: +case 0xFF06: +case 0xFF07: +case 0xFF08: +case 0xFF09: +case 0xFF0A: +case 0xFF0B: +case 0xFF0C: +case 0xFF0D: +case 0xFF0E: +case 0xFF0F: +case 0xFF10: +case 0xFF11: +case 0xFF12: +case 0xFF13: +case 0xFF14: +case 0xFF15: +case 0xFF16: +case 0xFF17: +case 0xFF18: +case 0xFF19: +case 0xFF1A: +case 0xFF1B: +case 0xFF1C: +case 0xFF1D: +case 0xFF1E: +case 0xFF1F: +case 0xFF20: +case 0xFF21: +case 0xFF22: +case 0xFF23: +case 0xFF24: +case 0xFF25: +case 0xFF26: +case 0xFF27: +case 0xFF28: +case 0xFF29: +case 0xFF2A: +case 0xFF2B: +case 0xFF2C: +case 0xFF2D: +case 0xFF2E: +case 0xFF2F: +case 0xFF30: +case 0xFF31: +case 0xFF32: +case 0xFF33: +case 0xFF34: +case 0xFF35: +case 0xFF36: +case 0xFF37: +case 0xFF38: +case 0xFF39: +case 0xFF3A: +case 0xFF3B: +case 0xFF3C: +case 0xFF3D: +case 0xFF3E: +case 0xFF3F: +case 0xFF40: +case 0xFF41: +case 0xFF42: +case 0xFF43: +case 0xFF44: +case 0xFF45: +case 0xFF46: +case 0xFF47: +case 0xFF48: +case 0xFF49: +case 0xFF4A: +case 0xFF4B: +case 0xFF4C: +case 0xFF4D: +case 0xFF4E: +case 0xFF4F: +case 0xFF50: +case 0xFF51: +case 0xFF52: +case 0xFF53: +case 0xFF54: +case 0xFF55: +case 0xFF56: +case 0xFF57: +case 0xFF58: +case 0xFF59: +case 0xFF5A: +case 0xFF5B: +case 0xFF5C: +case 0xFF5D: +case 0xFF5E: +case 0xFF5F: +case 0xFF60: +case 0xFF61: +case 0xFF62: +case 0xFF63: +case 0xFF64: +case 0xFF65: +case 0xFF66: +case 0xFF67: +case 0xFF68: +case 0xFF69: +case 0xFF6A: +case 0xFF6B: +case 0xFF6C: +case 0xFF6D: +case 0xFF6E: +case 0xFF6F: +case 0xFF70: +case 0xFF71: +case 0xFF72: +case 0xFF73: +case 0xFF74: +case 0xFF75: +case 0xFF76: +case 0xFF77: +case 0xFF78: +case 0xFF79: +case 0xFF7A: +case 0xFF7B: +case 0xFF7C: +case 0xFF7D: +case 0xFF7E: +case 0xFF7F: +case 0xFF80: +case 0xFF81: +case 0xFF82: +case 0xFF83: +case 0xFF84: +case 0xFF85: +case 0xFF86: +case 0xFF87: +case 0xFF88: +case 0xFF89: +case 0xFF8A: +case 0xFF8B: +case 0xFF8C: +case 0xFF8D: +case 0xFF8E: +case 0xFF8F: +case 0xFF90: +case 0xFF91: +case 0xFF92: +case 0xFF93: +case 0xFF94: +case 0xFF95: +case 0xFF96: +case 0xFF97: +case 0xFF98: +case 0xFF99: +case 0xFF9A: +case 0xFF9B: +case 0xFF9C: +case 0xFF9D: +case 0xFF9E: +case 0xFF9F: +case 0xFFA0: +case 0xFFA1: +case 0xFFA2: +case 0xFFA3: +case 0xFFA4: +case 0xFFA5: +case 0xFFA6: +case 0xFFA7: +case 0xFFA8: +case 0xFFA9: +case 0xFFAA: +case 0xFFAB: +case 0xFFAC: +case 0xFFAD: +case 0xFFAE: +case 0xFFAF: +case 0xFFB0: +case 0xFFB1: +case 0xFFB2: +case 0xFFB3: +case 0xFFB4: +case 0xFFB5: +case 0xFFB6: +case 0xFFB7: +case 0xFFB8: +case 0xFFB9: +case 0xFFBA: +case 0xFFBB: +case 0xFFBC: +case 0xFFBD: +case 0xFFBE: +case 0xFFBF: +case 0xFFC0: +case 0xFFC1: +case 0xFFC2: +case 0xFFC3: +case 0xFFC4: +case 0xFFC5: +case 0xFFC6: +case 0xFFC7: +case 0xFFC8: +case 0xFFC9: +case 0xFFCA: +case 0xFFCB: +case 0xFFCC: +case 0xFFCD: +case 0xFFCE: +case 0xFFCF: +case 0xFFD0: +case 0xFFD1: +case 0xFFD2: +case 0xFFD3: +case 0xFFD4: +case 0xFFD5: +case 0xFFD6: +case 0xFFD7: +case 0xFFD8: +case 0xFFD9: +case 0xFFDA: +case 0xFFDB: +case 0xFFDC: +case 0xFFDD: +case 0xFFDE: +case 0xFFDF: +case 0xFFE0: +case 0xFFE1: +case 0xFFE2: +case 0xFFE3: +case 0xFFE4: +case 0xFFE5: +case 0xFFE6: +case 0xFFE7: +case 0xFFE8: +case 0xFFE9: +case 0xFFEA: +case 0xFFEB: +case 0xFFEC: +case 0xFFED: +case 0xFFEE: +case 0xFFEF: +case 0xFFF0: +case 0xFFF1: +case 0xFFF2: +case 0xFFF3: +case 0xFFF4: +case 0xFFF5: +case 0xFFF6: +case 0xFFF7: +case 0xFFF8: +case 0xFFF9: +case 0xFFFA: +case 0xFFFB: +case 0xFFFC: +case 0xFFFD: +case 0xFFFE: +case 0xFFFF: + +// 1111 +case 0xF000: +{ + u32 res; + PC -= 2; + if (!CPU->flag_S) + { + res = CPU->USP; + CPU->USP = CPU->A[7]; + CPU->A[7] = res; + } + res = C68K_1111_EX; + timestamp += c68k_exception_cycle_table[res]; + PUSH_32_F(PC) + PUSH_16_F(GET_SR) + CPU->flag_S = C68K_SR_S; + READ_LONG_F(res * 4, PC) + SET_PC(PC) +} +RET(4) diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68kexec.cpp b/Mednafen/mednafen/hw_cpu/c68k/c68kexec.cpp new file mode 100644 index 0000000000..aea85dc95f --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68kexec.cpp @@ -0,0 +1,161 @@ +/* Copyright 2003-2004 Stephane Dallongeville + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "c68k.h" + +// exception cycle table (taken from musashi core) +static const s32 c68k_exception_cycle_table[256] = +{ + 4, // 0: Reset - Initial Stack Pointer + 4, // 1: Reset - Initial Program Counter + 50, // 2: Bus Error + 50, // 3: Address Error + 34, // 4: Illegal Instruction + 38, // 5: Divide by Zero + 40, // 6: CHK + 34, // 7: TRAPV + 34, // 8: Privilege Violation + 34, // 9: Trace + 4, // 10: + 4, // 11: + 4, // 12: RESERVED + 4, // 13: Coprocessor Protocol Violation + 4, // 14: Format Error + 44, // 15: Uninitialized Interrupt + 4, // 16: RESERVED + 4, // 17: RESERVED + 4, // 18: RESERVED + 4, // 19: RESERVED + 4, // 20: RESERVED + 4, // 21: RESERVED + 4, // 22: RESERVED + 4, // 23: RESERVED + 44, // 24: Spurious Interrupt + 44, // 25: Level 1 Interrupt Autovector + 44, // 26: Level 2 Interrupt Autovector + 44, // 27: Level 3 Interrupt Autovector + 44, // 28: Level 4 Interrupt Autovector + 44, // 29: Level 5 Interrupt Autovector + 44, // 30: Level 6 Interrupt Autovector + 44, // 31: Level 7 Interrupt Autovector + 34, // 32: TRAP #0 + 34, // 33: TRAP #1 + 34, // 34: TRAP #2 + 34, // 35: TRAP #3 + 34, // 36: TRAP #4 + 34, // 37: TRAP #5 + 34, // 38: TRAP #6 + 34, // 39: TRAP #7 + 34, // 40: TRAP #8 + 34, // 41: TRAP #9 + 34, // 42: TRAP #10 + 34, // 43: TRAP #11 + 34, // 44: TRAP #12 + 34, // 45: TRAP #13 + 34, // 46: TRAP #14 + 34, // 47: TRAP #15 + 4, // 48: FP Branch or Set on Unknown Condition + 4, // 49: FP Inexact Result + 4, // 50: FP Divide by Zero + 4, // 51: FP Underflow + 4, // 52: FP Operand Error + 4, // 53: FP Overflow + 4, // 54: FP Signaling NAN + 4, // 55: FP Unimplemented Data Type + 4, // 56: MMU Configuration Error + 4, // 57: MMU Illegal Operation Error + 4, // 58: MMU Access Level Violation Error + 4, // 59: RESERVED + 4, // 60: RESERVED + 4, // 61: RESERVED + 4, // 62: RESERVED + 4, // 63: RESERVED + // 64-255: User Defined + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4 +}; + +// include macro file +////////////////////// + +#include "c68kmac.inc" + +// main exec function +////////////////////// + +void C68K_FASTCALL C68k_Exec(c68k_struc *cpu) +{ + c68k_struc *CPU; + u32 PC; + u32 Opcode; + +#define timestamp cpu->timestamp + + CPU = cpu; + PC = CPU->PC; + + if (CPU->Status & (C68K_DISABLE | C68K_FAULTED)) + { + timestamp += 4; // Close enough >_> + return; + //return (CPU->Status | 0x80000000); + } + + CHECK_INT + + if (CPU->Status & (C68K_HALTED | C68K_WAITING)) + { + timestamp++; + return; + } + + Opcode = FETCH_WORD; + PC += 2; + + switch(Opcode) + { + #include "c68k_op0.inc" + #include "c68k_op1.inc" + #include "c68k_op2.inc" + #include "c68k_op3.inc" + #include "c68k_op4.inc" + #include "c68k_op5.inc" + #include "c68k_op6.inc" + #include "c68k_op7.inc" + #include "c68k_op8.inc" + #include "c68k_op9.inc" + #include "c68k_opA.inc" + #include "c68k_opB.inc" + #include "c68k_opC.inc" + #include "c68k_opD.inc" + #include "c68k_opE.inc" + #include "c68k_opF.inc" + } + +C68k_Exec_End: ; +C68k_Exec_Really_End: + CPU->PC = PC; + + return; +} + diff --git a/Mednafen/mednafen/hw_cpu/c68k/c68kmac.inc b/Mednafen/mednafen/hw_cpu/c68k/c68kmac.inc new file mode 100644 index 0000000000..bf3bd29b94 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/c68kmac.inc @@ -0,0 +1,265 @@ +/* Copyright 2003-2004 Stephane Dallongeville + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +// internals core macros +///////////////////////// + +#define LSL(A, C) ((A) << (C)) +#define LSR(A, C) ((A) >> (C)) + +#define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0) +#define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0) + +#define ROL_8(A, C) (LSL(A, C) | LSR(A, 8-(C))) +#define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C))) +#define ROL_16(A, C) (LSL(A, C) | LSR(A, 16-(C))) +#define ROL_17(A, C) (LSL(A, C) | LSR(A, 17-(C))) +#define ROL_32(A, C) (LSL_32(A, C) | LSR_32(A, 32-(C))) +#define ROL_33(A, C) (LSL_32(A, C) | LSR_32(A, 33-(C))) + +#define ROR_8(A, C) (LSR(A, C) | LSL(A, 8-(C))) +#define ROR_9(A, C) (LSR(A, C) | LSL(A, 9-(C))) +#define ROR_16(A, C) (LSR(A, C) | LSL(A, 16-(C))) +#define ROR_17(A, C) (LSR(A, C) | LSL(A, 17-(C))) +#define ROR_32(A, C) (LSR_32(A, C) | LSL_32(A, 32-(C))) +#define ROR_33(A, C) (LSR_32(A, C) | LSL_32(A, 33-(C))) + + +#define RET(A) \ + timestamp += (A); \ + goto C68k_Exec_End; + +#define SET_PC(A) PC = (A); + +#define READ_BYTE_F(A, D) \ + D = CPU->Read_Byte(A) & 0xFF; + +#define READ_WORD_F(A, D) \ + D = CPU->Read_Word(A) & 0xFFFF; + +#define READ_LONG_F(A, D) \ + D = CPU->Read_Word((A)) << 16; \ + D |= CPU->Read_Word((A) + 2) & 0xFFFF; + +#define READSX_BYTE_F(A, D) \ + D = (s32)(s8)CPU->Read_Byte(A); + +#define READSX_WORD_F(A, D) \ + D = (s32)(s16)CPU->Read_Word(A); + +#define READSX_LONG_F(A, D) \ + D = CPU->Read_Word((A)) << 16; \ + D |= CPU->Read_Word((A) + 2) & 0xFFFF; + +#define WRITE_BYTE_F(A, D) \ + CPU->Write_Byte(A, D); + +#define WRITE_WORD_F(A, D) \ + CPU->Write_Word(A, D); + +#define WRITE_LONG_F(A, D) \ + CPU->Write_Word((A), (D) >> 16); \ + CPU->Write_Word((A) + 2, (D) & 0xFFFF); + +#define WRITE_LONG_DEC_F(A, D) \ + CPU->Write_Word((A) + 2, (D) & 0xFFFF); \ + CPU->Write_Word((A), (D) >> 16); + +#define PUSH_16_F(D) \ + CPU->A[7] -= 2; \ + CPU->Write_Word(CPU->A[7], D); \ + +#define POP_16_F(D) \ + D = (u16)CPU->Read_Word(CPU->A[7]); \ + CPU->A[7] += 2; + +#define PUSH_32_F(D) \ + CPU->A[7] -= 4; \ + CPU->Write_Word(CPU->A[7] + 2, (D) & 0xFFFF); \ + CPU->Write_Word(CPU->A[7], (D) >> 16); + +#define POP_32_F(D) \ + D = CPU->Read_Word(CPU->A[7]) << 16; \ + D |= CPU->Read_Word(CPU->A[7] + 2) & 0xFFFF; \ + CPU->A[7] += 4; + +/* */ +/* New timing hacky stuff */ +/* */ + +#define READ_BYat_F(A, D) \ + timestamp += 2; \ + D = CPU->Read_Byte(A) & 0xFF; \ + timestamp += 2; + +#define READ_WOat_F(A, D) \ + timestamp += 2; \ + D = CPU->Read_Word(A) & 0xFFFF; \ + timestamp += 2; + +#define READ_LOat_F(A, D) \ + timestamp += 2; \ + D = CPU->Read_Word((A)) << 16; \ + timestamp += 2; \ + timestamp += 2; \ + D |= CPU->Read_Word((A) + 2) & 0xFFFF; \ + timestamp += 2; + +#define READSX_BYat_F(A, D) \ + timestamp += 2; \ + D = (s32)(s8)CPU->Read_Byte(A); \ + timestamp += 2; + +#define READSX_WOat_F(A, D) \ + timestamp += 2; \ + D = (s32)(s16)CPU->Read_Word(A); \ + timestamp += 2; + +#define READSX_LOat_F(A, D) \ + timestamp += 2; \ + D = CPU->Read_Word((A)) << 16; \ + timestamp += 2; \ + timestamp += 2; \ + D |= CPU->Read_Word((A) + 2) & 0xFFFF; \ + timestamp += 2; + +#define WRITE_BYat_F(A, D) \ + timestamp += 2; \ + CPU->Write_Byte(A, D); \ + timestamp += 2; + +#define WRITE_WOat_F(A, D) \ + timestamp += 2; \ + CPU->Write_Word(A, D); \ + timestamp += 2; \ + +#define WRITE_LOat_F(A, D) \ + timestamp += 2; \ + CPU->Write_Word((A), (D) >> 16); \ + timestamp += 2; \ + timestamp += 2; \ + CPU->Write_Word((A) + 2, (D) & 0xFFFF); \ + timestamp += 2; + +#define WRITE_LOat_DEC_F(A, D) \ + timestamp += 2; \ + CPU->Write_Word((A) + 2, (D) & 0xFFFF); \ + timestamp += 2; \ + timestamp += 2; \ + CPU->Write_Word((A), (D) >> 16); \ + timestamp += 2; + +/* */ +/* */ +/* */ + +static INLINE u32 C68k_Read_Long(c68k_struc *cpu, u32 adr) +{ + u32 ret; + + ret = cpu->Read_Word(adr) << 16; + ret |= cpu->Read_Word(adr + 2); + + return ret; +} + + +#define FETCH_BYTE ((u8)CPU->Read_Word(PC)) +#define FETCH_WORD CPU->Read_Word(PC) +#define FETCH_LONG C68k_Read_Long(CPU, PC) + +// FIXME? +#define DECODE_EXT_WORD \ +{ \ + u32 ext; \ + \ + ext = FETCH_WORD; \ + PC += 2; \ + \ + adr += (s32)((s8)(ext)); \ + if (ext & 0x0800) adr += (s32) CPU->DA[ext >> 12]; \ + else adr += (s32)((s16)(CPU->DA[ext >> 12])); \ +} + +#define GET_CCR \ + (((CPU->flag_C >> (C68K_SR_C_SFT - 0)) & 1) | \ + ((CPU->flag_V >> (C68K_SR_V_SFT - 1)) & 2) | \ + (((!CPU->flag_notZ) & 1) << 2) | \ + ((CPU->flag_N >> (C68K_SR_N_SFT - 3)) & 8) | \ + ((CPU->flag_X >> (C68K_SR_X_SFT - 4)) & 0x10)) + +#define GET_SR \ + ((CPU->flag_S << 0) | \ + (CPU->flag_I << 8) | \ + GET_CCR) + +#define SET_CCR(A) \ + CPU->flag_C = (A) << (C68K_SR_C_SFT - 0); \ + CPU->flag_V = (A) << (C68K_SR_V_SFT - 1); \ + CPU->flag_notZ = ~(A) & 4; \ + CPU->flag_N = (A) << (C68K_SR_N_SFT - 3); \ + CPU->flag_X = (A) << (C68K_SR_X_SFT - 4); + +#define SET_SR(A) \ + SET_CCR(A) \ + CPU->flag_I = ((A) >> 8) & 7; \ + CPU->flag_S = (A) & C68K_SR_S; + +#define CHECK_INT \ + { \ + s32 line, vect; \ + \ + line = CPU->IRQLine; \ + /*if(line) printf("Meow: %d, flag_I: %d\n", line, CPU->flag_I); */ \ + if ((line == 7) || (line > CPU->flag_I)) \ + { \ + cpu->Status &= ~(C68K_HALTED | C68K_WAITING); \ + \ + /* get vector */ \ + CPU->IRQLine = 0; \ + vect = CPU->Interrupt_CallBack(line); \ + if (vect == C68K_INT_ACK_AUTOVECTOR) \ + vect = C68K_INTERRUPT_AUTOVECTOR_EX + (line & 7); \ + \ + /* adjust CCnt */ \ + timestamp += c68k_exception_cycle_table[vect]; \ + \ + /* swap A7 and USP */ \ + if (!CPU->flag_S) \ + { \ + u32 tmpSP; \ + \ + tmpSP = CPU->USP; \ + CPU->USP = CPU->A[7]; \ + CPU->A[7] = tmpSP; \ + } \ + \ + /* push PC and SR */ \ + PUSH_32_F(PC) \ + PUSH_16_F(GET_SR) \ + \ + /* adjust SR */ \ + CPU->flag_S = C68K_SR_S; \ + CPU->flag_I = line; \ + \ + /* fetch new PC */ \ + READ_LONG_F(vect * 4, PC) \ + SET_PC(PC) \ + } \ + } diff --git a/Mednafen/mednafen/hw_cpu/c68k/gen68k.cpp b/Mednafen/mednafen/hw_cpu/c68k/gen68k.cpp new file mode 100644 index 0000000000..fc7722f2e1 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/gen68k.cpp @@ -0,0 +1,3744 @@ +/* Copyright 2003-2004 Stephane Dallongeville + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/********************************************************************************* + * GEN68K.C : + * + * C68K generator source file + * + ********************************************************************************/ + +#include "c68k.h" +#include "gen68k.h" +#include "gen68k.inc" + +// to do : +// need accurate cycles calculations in MUL and DIV instruction +// some bugs to fix + +// opcode generation function +////////////////////////////// + +static void GenLogicI(char op) +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + add_CCnt(8); + + if (current_ea != EA_DREG) current_cycle += 4; + switch (current_size) + { + case SIZE_BYTE: + wf_op("\tsrc = FETCH_BYTE;\n"); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_WORD: + wf_op("\tsrc = FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_LONG: + wf_op("\tsrc = FETCH_LONG;\n"); + wf_op("\tPC += 4;\n"); + current_cycle += 8; + break; + } + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // op + wf_op("\tres %c= src;\n", op); + // flag calculation + set_logic_flag(); + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(0); //8); +} + +static void GenLogicICCR(char op) +{ + // generate jump table & opcode declaration + start_all(GEN_RES); + + wf_op("\tres = FETCH_BYTE & C68K_CCR_MASK;\n"); + wf_op("\tPC += 2;\n"); + wf_op("\tres %c= GET_CCR;\n", op); + wf_op("\tSET_CCR(res)\n"); + + terminate_op(20); +} + +static void GenLogicISR(char op) +{ + // generate jump table & opcode declaration + start_all(GEN_RES); + + wf_op("\tif (CPU->flag_S)\n"); + wf_op("\t{\n"); + wf_op("\t\tres = FETCH_WORD & C68K_SR_MASK;\n"); + wf_op("\t\tPC += 2;\n"); + wf_op("\t\tres %c= GET_SR;\n", op); + wf_op("\t\tSET_SR(res)\n"); + if (op != '|') + { + wf_op("\t\tif (!CPU->flag_S)\n"); + wf_op("\t\t{\n"); + wf_op("\t\t\tres = CPU->A[7];\n"); + wf_op("\t\t\tCPU->A[7] = CPU->USP;\n"); + wf_op("\t\t\tCPU->USP = res;\n"); + wf_op("\t\t}\n"); + } + wf_op("\t}\n"); + wf_op("\telse\n"); + wf_op("\t{\n"); + gen_privilege_exception("\t\t"); + wf_op("\t}\n"); + + // check for interrupt + fterminate_op(20); +} + +static void GenORI() +{ + GenLogicI('|'); +} + +static void GenORICCR() +{ + GenLogicICCR('|'); +} + +static void GenORISR() +{ + GenLogicISR('|'); +} + +static void GenANDI() +{ + GenLogicI('&'); +} + +static void GenANDICCR() +{ + GenLogicICCR('&'); +} + +static void GenANDISR() +{ + GenLogicISR('&'); +} + +static void GenEORI() +{ + GenLogicI('^'); +} + +static void GenEORICCR() +{ + GenLogicICCR('^'); +} + +static void GenEORISR() +{ + GenLogicISR('^'); +} + +static void GenArithI(char op) +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC | GEN_DST); + else + start_all(GEN_ALL); + + add_CCnt(8); + + if ((op != ' ') && (current_ea != EA_DREG)) current_cycle += 4; + switch (current_size) + { + case SIZE_BYTE: + wf_op("\tsrc = FETCH_BYTE;\n"); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_WORD: + wf_op("\tsrc = FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_LONG: + wf_op("\tsrc = FETCH_LONG;\n"); + wf_op("\tPC += 4;\n"); + if (op == ' ') + { + if (current_ea == EA_DREG) current_cycle += 6; + else current_cycle += 4; + } else current_cycle += 8; + break; + } + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_dst(current_ea, current_op->reg_sft); + if (op == ' ') + { + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + } + else + { + // op + wf_op("\tres = dst %c src;\n", op); + // flag calculation + if (op == '+') set_add_flag(); + else set_sub_flag(); + // write + _ea_write(current_ea, current_op->reg_sft); + } + + terminate_op(0); //8); +} + +static void GenSUBI() +{ + GenArithI('-'); +} + +static void GenADDI() +{ + GenArithI('+'); +} + +static void GenCMPI() +{ + GenArithI(' '); +} + +static void GenBitsOp(char op, u32 dyn) +{ + // generate jump table & opcode declaration + if (dyn) current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + add_CCnt(4); + + if (current_ea == EA_DREG) + { + set_current_size(SIZE_LONG); + if ((op == 'c') || (op == ' ')) current_cycle += 2; + } + else set_current_size(SIZE_BYTE); + + // get shift value in src + if (dyn) + { + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_src(current_ea2, current_op->reg2_sft); + } + else + { + wf_op("\tsrc = FETCH_BYTE;\n"); + wf_op("\tPC += 2;\n"); + current_cycle += 4; + } + wf_op("\tsrc = 1 << (src & %d);\n", current_sft_mask); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // flag calculation + wf_op("\tCPU->flag_notZ = res & src;\n"); + // op + switch(op) + { + case 'c': + wf_op("\tres &= ~src;\n"); + break; + + case 'g': + wf_op("\tres ^= src;\n"); + break; + + case 's': + wf_op("\tres |= src;\n"); + break; + } + // write + if (op != ' ') + { + _ea_write(current_ea, current_op->reg_sft); + current_cycle += 4; + } + + terminate_op(0); //4); +} + +static void GenBTSTn() +{ + GenBitsOp(' ', 0); +} + +static void GenBCHGn() +{ + GenBitsOp('g', 0); +} + +static void GenBCLRn() +{ + GenBitsOp('c', 0); +} + +static void GenBSETn() +{ + GenBitsOp('s', 0); +} + +static void GenBTST() +{ + GenBitsOp(' ', 1); +} + +static void GenBCHG() +{ + GenBitsOp('g', 1); +} + +static void GenBCLR() +{ + GenBitsOp('c', 1); +} + +static void GenBSET() +{ + GenBitsOp('s', 1); +} + +static void GenMOVEPWaD() +{ + // generate jump table & opcode declaration + current_ea = EA_D16A; + current_ea2 = EA_DREG; + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + set_current_size(SIZE_BYTE); + _ea_calc(current_ea, current_op->reg_sft); + mem_op("\tREAD_BYTE_F(adr + 0, res)\n"); + mem_op("\tREAD_BYTE_F(adr + 2, src)\n"); + // write + wf_op("\tMDFN_ennsb(WORD_OFF + (u16*)&CPU->D[(Opcode >> %d) & 7], (res << 8) | src);\n", current_op->reg2_sft); + + terminate_op(16); +} + +static void GenMOVEPLaD() +{ + // generate jump table & opcode declaration + current_ea = EA_D16A; + current_ea2 = EA_DREG; + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + set_current_size(SIZE_BYTE); + _ea_calc(EA_D16A, current_op->reg_sft); + mem_op("\tREAD_BYTE_F(adr, res)\n"); + wf_op("\tres <<= 24;\n"); + wf_op("\tadr += 2;\n"); + mem_op("\tREAD_BYTE_F(adr, src)\n"); + wf_op("\tres |= src << 16;\n"); + wf_op("\tadr += 2;\n"); + mem_op("\tREAD_BYTE_F(adr, src)\n"); + wf_op("\tres |= src << 8;\n"); + wf_op("\tadr += 2;\n"); + mem_op("\tREAD_BYTE_F(adr, src)\n"); + // write + wf_op("\tCPU->D[(Opcode >> %d) & 7] = res | src;\n", current_op->reg2_sft); + + terminate_op(24); +} + +static void GenMOVEPWDa() +{ + // generate jump table & opcode declaration + current_ea = EA_D16A; + current_ea2 = EA_DREG; + start_all(GEN_ADR | GEN_RES); + + // read + set_current_size(SIZE_LONG); + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read(current_ea2, current_op->reg2_sft); + // write + set_current_size(SIZE_BYTE); + _ea_calc(current_ea, current_op->reg_sft); + mem_op("\tWRITE_BYTE_F(adr + 0, res >> 8)\n"); + mem_op("\tWRITE_BYTE_F(adr + 2, res >> 0)\n"); + + terminate_op(16); +} + +static void GenMOVEPLDa() +{ + // generate jump table & opcode declaration + current_ea = EA_D16A; + current_ea2 = EA_DREG; + start_all(GEN_ADR | GEN_RES); + + // read + set_current_size(SIZE_LONG); + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read(current_ea2, current_op->reg2_sft); + // write + set_current_size(SIZE_BYTE); + _ea_calc(current_ea, current_op->reg_sft); + mem_op("\tWRITE_BYTE_F(adr, res >> 24)\n"); + wf_op("\tadr += 2;\n"); + mem_op("\tWRITE_BYTE_F(adr, res >> 16)\n"); + wf_op("\tadr += 2;\n"); + mem_op("\tWRITE_BYTE_F(adr, res >> 8)\n"); + wf_op("\tadr += 2;\n"); + mem_op("\tWRITE_BYTE_F(adr, res >> 0)\n"); + + terminate_op(24); +} + +static void GenMOVE(u32 size) +{ + set_current_size(size); + + // generate jump table & opcode declaration + if (((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) && + ((current_ea2 == EA_AREG) || (current_ea2 == EA_DREG) || (current_ea2 == EA_IMM))) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + add_CCnt(4); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // flag calculation + set_logic_flag(); + if ((current_ea2 == EA_ADEC) || (current_ea2 == EA_ADEC7)) current_cycle -= 2; + // write + _ea_calc(current_ea2, current_op->reg2_sft); + + if ((current_ea2 == EA_ADEC) || (current_ea2 == EA_ADEC7)) + _ea_write_sarsie(current_ea2, current_op->reg2_sft, 1); + else + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(0); //4); +} + +static void GenMOVEB() +{ + GenMOVE(SIZE_BYTE); +} + +static void GenMOVEW() +{ + GenMOVE(SIZE_WORD); +} + +static void GenMOVEL() +{ + GenMOVE(SIZE_LONG); +} + +static void GenMOVEA(u32 size) +{ + set_current_size(size); + + // generate jump table & opcode declaration + current_ea2 = EA_AREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_sx(current_ea, current_op->reg_sft); + // write (dst = Ax) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(4); +} + +static void GenMOVEAW() +{ + GenMOVEA(SIZE_WORD); +} + +static void GenMOVEAL() +{ + GenMOVEA(SIZE_LONG); +} + +static void GenMOVEQ() +{ + u32 base = get_current_opcode_base(); + + // generate jump table + current_ea = EA_DREG; + gen_opjumptable_ext(base, 0x00, 0xFF, 1, base); + + // generate label & declarations + start_op(base, GEN_RES); + + // read + set_current_size(SIZE_BYTE); + wf_op("\tres = (s32)(s8)Opcode;\n"); + // fast flag calculation for moveQ + wf_op("\tCPU->flag_C = CPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_N = CPU->flag_notZ = res;\n"); + // write + set_current_size(SIZE_LONG); + _ea_calc(current_ea, current_op->reg_sft); + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(4); +} + +static void GenSingle(char op) +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) { + if (op == 'c') + start_all(GEN_RES); + else + start_all(GEN_RES | GEN_SRC); + } else { + if (op == 'c') + start_all(GEN_ADR | GEN_RES); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + } + + if (current_size == SIZE_LONG) current_cycle = 6; + else current_cycle= 4; + if (is_ea_memory(current_ea)) current_cycle *= 2; + + // read + _ea_calc(current_ea, current_op->reg_sft); + if (op != 'c') _ea_read_src(current_ea, current_op->reg_sft); + // op + switch (op) + { + case 'x': // negx + wf_op("\tres = -src - ((CPU->flag_X >> 8) & 1);\n"); + break; + + case 'g': // neg + wf_op("\tres = -src;\n"); + break; + + case 'n': // not + wf_op("\tres = ~src;\n"); + break; + + case 'c': // clr + wf_op("\tres = 0;\n"); + break; + } + // flag calculation + switch (op) + { + case 'x': // negx + set_negx_flag(); + break; + + case 'g': // neg + set_neg_flag(); + break; + + case 'n': // not + set_logicl_flag(); + break; + + case 'c': // clr + wf_op("\tCPU->flag_N = CPU->flag_notZ = CPU->flag_V = CPU->flag_C = 0;\n"); + break; + } + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(0); +} + +static void GenCLR() +{ + GenSingle('c'); +} + +static void GenNEGX() +{ + GenSingle('x'); +} + +static void GenNEG() +{ + GenSingle('g'); +} + +static void GenNOT() +{ + GenSingle('n'); +} + +static void GenMOVESRa() +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + // read + wf_op("\tres = GET_SR;\n"); + // write + set_current_size(SIZE_WORD); + if (is_ea_memory(current_ea)) current_cycle += 2; + _ea_calc(current_ea, current_op->reg_sft); + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenMOVEaSR() +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + wf_op("\tif (CPU->flag_S)\n"); + wf_op("\t{\n"); + // read + set_current_size(SIZE_WORD); + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + wf_op("\t\tSET_SR(res)\n"); + wf_op("\t\tif (!CPU->flag_S)\n"); + wf_op("\t\t{\n"); + wf_op("\t\t\tres = CPU->A[7];\n"); + wf_op("\t\t\tCPU->A[7] = CPU->USP;\n"); + wf_op("\t\t\tCPU->USP = res;\n"); + wf_op("\t\t}\n"); + wf_op("\t}\n"); + wf_op("\telse\n"); + wf_op("\t{\n"); + gen_privilege_exception("\t\t"); + wf_op("\t}\n"); + + // force terminaison to check for interrupt + fterminate_op(12); +} + +static void GenMOVEaCCR() +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + // read + set_current_size(SIZE_WORD); + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // write + wf_op("\tSET_CCR(res)\n"); + + terminate_op(12); +} + +static void GenMOVEAUSP() +{ + current_ea = EA_AREG; + + // generate jump table & opcode declaration + start_all(GEN_RES); + + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + gen_privilege_exception("\t\t"); + quick_terminate_op(4); + wf_op("\t}\n"); + + // read + set_current_size(SIZE_LONG); + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // write + wf_op("\tCPU->USP = res;\n"); + + terminate_op(4); +} + +static void GenMOVEUSPA() +{ + current_ea = EA_AREG; + + // generate jump table & opcode declaration + start_all(GEN_RES); + + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + gen_privilege_exception("\t\t"); + quick_terminate_op(4); + wf_op("\t}\n"); + + // read + wf_op("\tres = CPU->USP;\n"); + // write + set_current_size(SIZE_LONG); + _ea_calc(current_ea, current_op->reg_sft); + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(4); +} + +static void GenPEA() +{ + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(0); + else + start_all(GEN_ADR); + + _ea_calc_free(current_ea, current_op->reg_sft); + mem_op("\tPUSH_32_F(adr)\n"); + + terminate_op(lea_pea_cycle_table[current_ea] + 12); +} + +static void GenSWAP() +{ + current_ea = EA_DREG; + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + start_all(GEN_RES); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // op + wf_op("\tres = (res >> 16) | (res << 16);\n"); + // flag calculation + set_logic_flag(); + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(4); +} + +static void GenMOVEMaR() +{ + // generate jump table & opcode declaration + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // get register mask + wf_op("\tres = FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + // get adr + if (current_ea == EA_AINC) wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", current_op->reg_sft); + else if (current_ea == EA_AINC7) wf_op("\tadr = CPU->A[7];\n"); + else _ea_calc(current_ea, current_op->reg_sft); + wf_op("\tsrc = 0;\n"); + + wf_op("\tdo\n"); + wf_op("\t{\n"); + wf_op("\t\tif (res & 1)\n"); + wf_op("\t\t{\n"); + + if (current_size == SIZE_WORD) + { + wf_op("\t\t\tREADSX_WOat_F(adr, CPU->DA[src])\n"); + wf_op("\t\t\tadr += 2;\n"); + } + else + { + wf_op("\t\t\tREAD_LOat_F(adr, CPU->DA[src])\n"); + wf_op("\t\t\tadr += 4;\n"); + } + wf_op("\t\t}\n"); + wf_op("\t\tsrc ++;\n"); + wf_op("\t} while (res >>= 1);\n"); + + if (current_ea == EA_AINC) wf_op("\tCPU->A[(Opcode >> %d) & 7] = adr;\n", current_op->reg_sft); + else if (current_ea == EA_AINC7) wf_op("\tCPU->A[7] = adr;\n"); + + terminate_op(movem_cycle_table[current_ea] + 12); +} + +static void GenMOVEMRa() +{ + // generate jump table & opcode declaration + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // get register mask + wf_op("\tres = FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + // get adr + if (current_ea == EA_ADEC) wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", current_op->reg_sft); + else if (current_ea == EA_ADEC7) wf_op("\tadr = CPU->A[7];\n"); + else _ea_calc(current_ea, current_op->reg_sft); + if ((current_ea == EA_ADEC) || (current_ea == EA_ADEC7)) wf_op("\tsrc = 15;\n"); + else wf_op("\tsrc = 0;\n"); + + wf_op("\tdo\n"); + wf_op("\t{\n"); + wf_op("\t\tif (res & 1)\n"); + wf_op("\t\t{\n"); + + if (current_size == SIZE_WORD) + { + if ((current_ea == EA_ADEC) || (current_ea == EA_ADEC7)) wf_op("\t\t\tadr -= 2;\n"); + wf_op("\t\t\tWRITE_WOat_F(adr, CPU->DA[src])\n"); + if (!((current_ea == EA_ADEC) || (current_ea == EA_ADEC7))) wf_op("\t\t\tadr += 2;\n"); + } + else + { + if ((current_ea == EA_ADEC) || (current_ea == EA_ADEC7)) + { + wf_op("\t\t\tadr -= 4;\n"); + wf_op("\t\t\tWRITE_LOat_DEC_F(adr, CPU->DA[src])\n"); + } + else + { + wf_op("\t\t\tWRITE_LOat_F(adr, CPU->DA[src])\n"); + wf_op("\t\t\tadr += 4;\n"); + } + } + wf_op("\t\t}\n"); + if ((current_ea == EA_ADEC) || (current_ea == EA_ADEC7)) wf_op("\t\tsrc --;\n"); + else wf_op("\t\tsrc ++;\n"); + wf_op("\t} while (res >>= 1);\n"); + + if (current_ea == EA_ADEC) wf_op("\tCPU->A[(Opcode >> %d) & 7] = adr;\n", current_op->reg_sft); + else if (current_ea == EA_ADEC7) wf_op("\tCPU->A[7] = adr;\n"); + + terminate_op(movem_cycle_table[current_ea] + 8); +} + +static void GenEXT() +{ + current_ea = EA_DREG; + // generate jump table & opcode declaration + start_all(GEN_RES); + + // read + set_current_size(current_size - 1); + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_sx(current_ea, current_op->reg_sft); + // flag calculation + set_logic_flag(); + // write + set_current_size(current_size + 1); + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(4); +} + +static void GenTST() +{ + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + add_CCnt(4); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // flag calculation + set_logic_flag(); + + terminate_op(0); //4); +} + +static void GenTAS() +{ + set_current_size(SIZE_BYTE); + + if (is_ea_memory(current_ea)) current_cycle += 6; + + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // flag calculation + set_logic_flag(); + + if(current_ea >= EA_AIND) + { + wf_op("if(!CPU->TAS_Hack)\n{\n"); + } + + // flag calculation + wf_op("\tres |= 0x80;\n"); + // write + _ea_write(current_ea, current_op->reg_sft); + + if(current_ea >= EA_AIND) + { + wf_op("}\n"); + } + + terminate_op(4); +} + +static void GenTRAP() +{ + u32 base; + + base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable_ext(base, (0 << 0), (15 << 0), (1 << 0), base); + + // generate label & declarations + start_op(base, GEN_RES); + + gen_exception("\t", "C68K_TRAP_BASE_EX + (Opcode & 0xF)"); + + terminate_op(4); +} + +static void GenTRAPV() +{ + // generate label & declarations + start_all(GEN_RES); + + wf_op("\tif %s\n", get_cond_as_cond(COND_VS, 0)); + wf_op("\t{\n"); + gen_exception("\t\t", "C68K_TRAPV_EX"); + wf_op("\t}\n"); + + terminate_op(4); +} + +static void GenLINK() +{ + current_ea = EA_AREG; + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + start_all(GEN_RES); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // push + mem_op("\tPUSH_32_F(res)\n"); + wf_op("\tres = CPU->A[7];\n"); + // write + _ea_write(current_ea, current_op->reg_sft); + // update SP + wf_op("\tCPU->A[7] += (s32)(s16)FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + + terminate_op(16); +} + +static void GenLINKA7() +{ + current_ea = EA_AREG; + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + start_all(0); + + // push A7 + wf_op("\tCPU->A[7] -= 4;\n"); + mem_op("\tWRITE_LONG_DEC_F(CPU->A[7], CPU->A[7])\n"); + // update A7 + wf_op("\tCPU->A[7] += (s32)(s16)FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + + terminate_op(16); +} + +static void GenULNK() +{ + current_ea = EA_AREG; + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + start_all(GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // pop + wf_op("\tCPU->A[7] = src + 4;\n"); + mem_op("\tREAD_LONG_F(src, res)\n"); + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(12); +} + +static void GenULNKA7() +{ + current_ea = EA_AREG; + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + start_all(0); + + mem_op("\tREAD_LONG_F(CPU->A[7], CPU->A[7])\n"); + + terminate_op(12); +} + +static void GenRESET() +{ + // generate jump table & opcode declaration + start_all(GEN_RES); + + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + gen_privilege_exception("\t\t"); + quick_terminate_op(4); + wf_op("\t}\n"); + + // Reset callback function + mem_op("\tCPU->Reset_CallBack();\n"); + + terminate_op(132); +} + +static void GenLEA() +{ + current_ea2 = EA_AREG; + set_current_size(SIZE_LONG); + // generate jump table & opcode declaration + start_all(GEN_ADR | GEN_RES); + + _ea_calc_free(current_ea, current_op->reg_sft); + wf_op("\tres = adr;\n"); + current_cycle = lea_pea_cycle_table[current_ea]; + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(4); +} + +static void GenNOP() +{ + start_all(0); + terminate_op(4); +} + +static void Gen1010() +{ + u32 base; + + base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0FFF, 0x1, base); + + // generate label & declarations + start_op(base, GEN_RES); + + wf_op("\tPC -= 2;\n"); + gen_exception("\t", "C68K_1010_EX"); + + terminate_op(4); +} + +static void Gen1111() +{ + u32 base; + + base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0FFF, 0x1, base); + + // generate label & declarations + start_op(base, GEN_RES); + + wf_op("\tPC -= 2;\n"); + gen_exception("\t", "C68K_1111_EX"); + + terminate_op(4); +} + + + +static void GenILLEGAL() +{ + start_all(GEN_RES); + + gen_exception("\t\t", "C68K_ILLEGAL_INSTRUCTION_EX"); + + terminate_op(4); +} + +static void GenCHK() +{ + current_ea2 = EA_DREG; + set_current_size(SIZE_WORD); + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read Src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read Dx + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read(current_ea2, current_op->reg2_sft); + + wf_op("\tif (((s32)res < 0) || (res > src))\n"); + wf_op("\t{\n"); + wf_op("\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + gen_exception("\t\t", "C68K_CHK_EX"); + wf_op("\t}\n"); + + terminate_op(10); +} + +static void GenSTOP() +{ + // generate jump table & opcode declaration + start_all(GEN_RES); + + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + wf_op("\t\tPC += 2;\n"); + gen_privilege_exception("\t\t"); + quick_terminate_op(4); + wf_op("\t}\n"); + + // read & set SR + wf_op("\tres = FETCH_WORD & C68K_SR_MASK;\n"); + wf_op("\tPC += 2;\n"); + wf_op("\tSET_SR(res)\n"); + + // if S flag not set --> we swap stack pointer + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + wf_op("\t\tres = CPU->A[7];\n"); + wf_op("\t\tCPU->A[7] = CPU->USP;\n"); + wf_op("\t\tCPU->USP = res;\n"); + wf_op("\t}\n"); + + wf_op("\tCPU->Status |= C68K_HALTED;\n"); + //wf_op("\tCCnt = 0;\n"); + + // force end execution + fterminate_op(4); +} + +static void GenRTE() +{ + start_all(GEN_RES); + + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + gen_privilege_exception("\t\t"); + quick_terminate_op(4); + wf_op("\t}\n"); + + // restore SR and PC + mem_op("\tPOP_16_F(res)\n"); + wf_op("\tSET_SR(res)\n"); + mem_op("\tPOP_32_F(res)\n"); + wf_op("\tSET_PC(res)\n"); + + // if S flag not set --> we swap stack pointer + wf_op("\tif (!CPU->flag_S)\n"); + wf_op("\t{\n"); + wf_op("\t\tres = CPU->A[7];\n"); + wf_op("\t\tCPU->A[7] = CPU->USP;\n"); + wf_op("\t\tCPU->USP = res;\n"); + wf_op("\t}\n"); + + // check for interrupt + fterminate_op(20); +} + +static void GenRTS() +{ + start_all(GEN_RES); + + mem_op("\tPOP_32_F(res)\n"); + wf_op("\tSET_PC(res)\n"); + + terminate_op(16); +} + +static void GenRTR() +{ + start_all(GEN_RES); + + mem_op("\tPOP_16_F(res)\n"); + wf_op("\tSET_CCR(res)\n"); + mem_op("\tPOP_32_F(res)\n"); + wf_op("\tSET_PC(res)\n"); + + terminate_op(20); +} + +static void GenJSR() +{ + start_all(GEN_ADR); + + // get adr + _ea_calc_free(current_ea, current_op->reg_sft); + mem_op("\tPUSH_32_F(PC)\n"); + wf_op("\tSET_PC(adr)\n"); + + terminate_op(jmp_jsr_cycle_table[current_ea] + 12); +} + +static void GenJMP() +{ + start_all(GEN_ADR); + + // get adr + _ea_calc_free(current_ea, current_op->reg_sft); + wf_op("\tSET_PC(adr)\n"); + + terminate_op(jmp_jsr_cycle_table[current_ea] + 4); +} + +static void GenSTCC() +{ + u32 base, cond; + + base = get_current_opcode_base(); + + for(cond = 0; cond < 0x10; cond++) + { + // generate jump table + gen_opjumptable(base + (cond << 8)); + // generate label & declarations + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_op(base + (cond << 8), GEN_RES); + else + start_op(base + (cond << 8), GEN_ADR | GEN_RES); + + set_current_size(SIZE_BYTE); + + if (is_ea_memory(current_ea)) current_cycle += 4; + + // op + _ea_calc(current_ea, current_op->reg_sft); + if ((cond != COND_TR) && (cond != COND_FA)) + { + wf_op("\tif %s\n", get_cond_as_cond(cond, 0)); + wf_op("\t{\n"); + } + if (cond != COND_FA) + { + wf_op("\tres = 0xFF;\n"); + // write + _ea_write(current_ea, current_op->reg_sft); + if (!is_ea_memory(current_ea)) quick_terminate_op(6); + else quick_terminate_op(4); + } + if ((cond != COND_TR) && (cond != COND_FA)) + { + wf_op("\t}\n"); + } + if (cond != COND_TR) + { + wf_op("\tres = 0;\n"); + // write + _ea_write(current_ea, current_op->reg_sft); + quick_terminate_op(4); + } + + wf_op("}\n"); + } +} + +static void GenDBCC() +{ + u32 base, cond; + + base = get_current_opcode_base(); + + current_ea = EA_DREG; + set_current_size(SIZE_WORD); + + for(cond = 0; cond < 0x10; cond++) + { + // generate jump table + gen_opjumptable(base + (cond << 8)); + // generate label & declarations + start_op(base + (cond << 8), (cond != COND_TR) ? GEN_RES : 0); + + if (cond != COND_TR) + { + if (cond != COND_FA) + { + wf_op("\tif %s\n", get_cond_as_cond(cond, 1)); + wf_op("\t{\n"); + } + + // read Dx + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // dec Dx + wf_op("\tres--;\n"); + // write Dx + _ea_write(current_ea, current_op->reg_sft); + wf_op("\tif ((s32)res != -1)\n"); + wf_op("\t{\n"); + wf_op("\t\tPC += (s32)(s16)FETCH_WORD;\n"); + // rebase PC + wf_op("\t\tSET_PC(PC);\n"); + quick_terminate_op(10); + wf_op("\t}\n"); + + if (cond != COND_FA) + { + wf_op("\t}\n"); + wf_op("\telse\n"); + wf_op("\t{\n"); + wf_op("\t\tPC += 2;\n"); + quick_terminate_op(12); + wf_op("\t}\n"); + } + } + + wf_op("\tPC += 2;\n"); + + if (cond == COND_TR) terminate_op(12); + else terminate_op(14); + } +} + +static void GenBCC() +{ + u32 base, cond; + + base = get_current_opcode_base(); + + for(cond = 2; cond < 0x10; cond++) + { + // generate jump table + gen_opjumptable_ext(base + (cond << 8), 0x01, 0xFF, 1, base + (cond << 8) + 0x01); + // generate label & declarations + start_op(base + (cond << 8) + 0x01, 0); + + // op + wf_op("\tif %s\n", get_cond_as_cond(cond, 0)); + wf_op("\t{\n"); + wf_op("\t\tPC += (s32)(s8)Opcode;\n"); // no rebase needed for 8 bits deplacement + add_CCnt(2); + wf_op("\t}\n"); + + terminate_op(8); + } +} + +static void GenBCC16() +{ + u32 base, cond; + + base = get_current_opcode_base(); + + for(cond = 2; cond < 0x10; cond++) + { + // generate jump table + gen_opjumptable(base + (cond << 8)); + // generate label & declarations + start_op(base + (cond << 8), 0); + + // op + wf_op("\tif %s\n", get_cond_as_cond(cond, 0)); + wf_op("\t{\n"); + wf_op("\t\tPC += (s32)(s16)FETCH_WORD;\n"); + // rebase PC + wf_op("\t\tSET_PC(PC);\n"); + quick_terminate_op(10); + wf_op("\t}\n"); + + wf_op("\tPC += 2;\n"); + + terminate_op(12); + } +} + +static void GenBRA() +{ + u32 base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable_ext(base, 0x01, 0xFF, 1, base + 0x01); + // generate label & declarations + start_op(base + 0x01, 0); + + wf_op("\tPC += (s32)(s8)Opcode;\n"); // no rebase needed for 8 bits deplacement + + terminate_op(10); +} + +static void GenBRA16() +{ + u32 base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable(base + 0x00); + // generate label & declarations + start_op(base + 0x00, 0); + + wf_op("\tPC += (s32)(s16)FETCH_WORD;\n"); + // rebase PC + wf_op("\tSET_PC(PC);\n"); + + terminate_op(10); +} + +static void GenBSR() +{ + u32 base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable_ext(base, 0x01, 0xFF, 1, base + 0x01); + // generate label & declarations + start_op(base + 0x01, 0); + + mem_op("\tPUSH_32_F(PC)\n"); + wf_op("\tPC += (s32)(s8)Opcode;\n"); // no rebase needed for 8 bits deplacement + + terminate_op(18); +} + +static void GenBSR16() +{ + u32 base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable(base + 0x00); + // generate label & declarations + start_op(base + 0x00, GEN_RES); + + wf_op("\tres = (s32)(s16)FETCH_WORD;\n"); + mem_op("\tPUSH_32_F(PC + 2)\n"); + wf_op("\tPC += (s32) res;\n"); + wf_op("\tSET_PC(PC);\n"); + + terminate_op(18); +} + +static void GenArithQ(char op) +{ + u32 base; + + if ((current_ea == EA_AREG) && (current_size == SIZE_BYTE)) return; + + base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable_ext(base, (0 << 9), (7 << 9), (1 << 9), base); + + // generate label & declarations + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_op(base, GEN_DST | GEN_RES | GEN_SRC); + else + start_op(base, GEN_ALL); + + if (current_ea == EA_AREG) set_current_size(SIZE_LONG); + + if (is_ea_memory(current_ea)) current_cycle += 4; + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src + wf_op("\tsrc = (((Opcode >> 9) - 1) & 7) + 1;\n"); + // read dst + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_dst(current_ea, current_op->reg_sft); + // op + wf_op("\tres = dst %c src;\n", op); + // flag calculation + if (current_ea != EA_AREG) + { + if (op == '+') set_add_flag(); + else set_sub_flag(); + } + // write dst + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(4); +} + +static void GenADDQ() +{ + GenArithQ('+'); +} + +static void GenSUBQ() +{ + GenArithQ('-'); +} + +static void GenLogicaD(char op) +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) + { + if (!is_ea_memory(current_ea)) current_cycle += 2; + else current_cycle += 4; + } + + // read src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read(current_ea2, current_op->reg2_sft); + // op + wf_op("\tres %c= src;\n", op); + // flag calculation + set_logic_flag(); + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(4); +} + +static void GenLogicDa(char op) +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_src(current_ea2, current_op->reg2_sft); + // read dst + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // op + wf_op("\tres %c= src;\n", op); + // flag calculation + set_logic_flag(); + // write dst + _ea_write(current_ea, current_op->reg_sft); + + if (current_ea == EA_DREG) terminate_op(4); + else terminate_op(8); +} + +static void GenANDaD() +{ + GenLogicaD('&'); +} + +static void GenANDDa() +{ + GenLogicDa('&'); +} + +static void GenORaD() +{ + GenLogicaD('|'); +} + +static void GenORDa() +{ + GenLogicDa('|'); +} + +static void GenEORDa() +{ + GenLogicDa('^'); +} + +static void GenNBCD() +{ + set_current_size(SIZE_BYTE); + + // generate jump table & opcode declaration + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES); + else + start_all(GEN_ADR | GEN_RES); + + if (is_ea_memory(current_ea)) current_cycle += 2; + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + + // op + wf_op("\tres = 0x9a - res - ((CPU->flag_X >> C68K_SR_X_SFT) & 1);\n"); + wf_op("\n"); + wf_op("\tif (res != 0x9a)\n"); + wf_op("\t{\n"); + wf_op("\t\tif ((res & 0x0f) == 0xa) res = (res & 0xf0) + 0x10;\n"); + wf_op("\t\tres &= 0xFF;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + // flag calculation + wf_op("\t\tCPU->flag_notZ |= res;\n"); + wf_op("\t\tCPU->flag_X = CPU->flag_C = C68K_SR_C;\n"); + + wf_op("\t}\n"); + wf_op("\telse CPU->flag_X = CPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = res;\n"); + + terminate_op(6); +} + +static void GenBCD(char op) +{ + // op + wf_op("\tres = (dst & 0xF) %c (src & 0xF) %c ((CPU->flag_X >> C68K_SR_X_SFT) & 1);\n", op, op); + wf_op("\tif (res > 9) res %c= 6;\n", op); + wf_op("\tres += (dst & 0xF0) %c (src & 0xF0);\n", op, op); + + // flag calculation + wf_op("\tif (res > 0x99)\n"); + wf_op("\t{\n"); + switch (op) + { + case '+': + wf_op("\t\tres -= 0xA0;\n"); + break; + + case '-': + wf_op("\t\tres += 0xA0;\n"); + break; + } + wf_op("\t\tCPU->flag_X = CPU->flag_C = C68K_SR_C;\n"); + wf_op("\t}\n"); + wf_op("\telse CPU->flag_X = CPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFF;\n"); + wf_op("\tCPU->flag_N = res;\n"); +} + +static void GenxBCD(char op) +{ + set_current_size(SIZE_BYTE); + + // generate jump table & opcode declaration + current_ea = EA_DREG; + current_ea2 = EA_DREG; + start_all(GEN_DST | GEN_RES | GEN_SRC); + + // read src (Dx) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + + // op & flag calculation + GenBCD(op); + + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(6); +} + +static void GenxBCDM(char op) +{ + set_current_size(SIZE_BYTE); + + // generate jump table & opcode declaration + current_ea = EA_ADEC; + current_ea2 = EA_ADEC; + start_all(GEN_ALL); + + // read src (ADEC) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (ADEC) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + + // op & flag calculation + GenBCD(op); + + // write dst (ADEC) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(6); +} + +static void GenxBCD7M(char op) +{ + set_current_size(SIZE_BYTE); + + // generate jump table & opcode declaration + current_ea = EA_ADEC7; + current_ea2 = EA_ADEC; + start_all(GEN_ALL); + + // read src (ADEC7) + _ea_calc(current_ea, 0); + _ea_read_src(current_ea, 0); + // read dst (ADEC) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + + // op & flag calculation + GenBCD(op); + + // write dst (ADEC) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(6); +} + +static void GenxBCDM7(char op) +{ + set_current_size(SIZE_BYTE); + + // generate jump table & opcode declaration + current_ea = EA_ADEC; + current_ea2 = EA_ADEC7; + start_all(GEN_ALL); + + // read src (ADEC) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (ADEC7) + _ea_calc(current_ea2, 0); + _ea_read_dst(current_ea2, 0); + + // op & flag calculation + GenBCD(op); + + // write dst (ADEC7) + _ea_write(current_ea2, 0); + + terminate_op(6); +} + +static void GenxBCD7M7(char op) +{ + set_current_size(SIZE_BYTE); + + // generate jump table & opcode declaration + current_ea = EA_ADEC7; + current_ea2 = EA_ADEC7; + start_all(GEN_ALL); + + // read src (ADEC7) + _ea_calc(current_ea, 0); + _ea_read_src(current_ea, 0); + // read dst (ADEC7) + _ea_calc(current_ea2, 0); + _ea_read_dst(current_ea2, 0); + + // op & flag calculation + GenBCD(op); + + // write dst (ADEC7) + _ea_write(current_ea2, 0); + + terminate_op(6); +} + +static void GenABCD() +{ + GenxBCD('+'); +} + +static void GenABCDM() +{ + GenxBCDM('+'); +} + +static void GenABCD7M() +{ + GenxBCD7M('+'); +} + +static void GenABCDM7() +{ + GenxBCDM7('+'); +} + +static void GenABCD7M7() +{ + GenxBCD7M7('+'); +} + +static void GenSBCD() +{ + GenxBCD('-'); +} + +static void GenSBCDM() +{ + GenxBCDM('-'); +} + +static void GenSBCD7M() +{ + GenxBCD7M('-'); +} + +static void GenSBCDM7() +{ + GenxBCDM7('-'); +} + +static void GenSBCD7M7() +{ + GenxBCD7M7('-'); +} + +static void GenDIVU() +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_DST | GEN_RES | GEN_SRC); + else + start_all(GEN_ALL); + + set_current_size(SIZE_WORD); + + // read src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // division by zero + wf_op("\tif (src == 0)\n"); + wf_op("\t{\n"); + gen_exception("\t\t", "C68K_ZERO_DIVIDE_EX"); + quick_terminate_op(10); + wf_op("\t}\n"); + + set_current_size(SIZE_LONG); + + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + + wf_op("\t{\n"); + wf_op("\t\tu32 q, r;\n"); + wf_op("\n"); + wf_op("\t\tq = dst / src;\n"); + wf_op("\t\tr = dst %% src;\n"); + wf_op("\n"); + + wf_op("\t\tif (q & 0xFFFF0000)\n"); + wf_op("\t\t{\n"); + // overflow occured + wf_op("\t\t\tCPU->flag_V = C68K_SR_V;\n"); + quick_terminate_op(70); + wf_op("\t\t}\n"); + + // quotient size = word + set_current_size(SIZE_WORD); + + wf_op("\t\tq &= 0x%.8X;\n", current_bits_mask); + wf_op("\t\tCPU->flag_notZ = q;\n"); + wf_op("\t\tCPU->flag_N = q >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\tCPU->flag_V = CPU->flag_C = 0;\n"); + + wf_op("\t\tres = q | (r << 16);\n"); + + set_current_size(SIZE_LONG); + + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + wf_op("\t}\n"); + + // max cycle = 140 + terminate_op(140 - 50); +} + +static void GenDIVS() +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_DST | GEN_RES | GEN_SRC); + else + start_all(GEN_ALL); + + set_current_size(SIZE_WORD); + + // read src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src_sx(current_ea, current_op->reg_sft); + + // division by zero + wf_op("\tif (src == 0)\n"); + wf_op("\t{\n"); + gen_exception("\t\t", "C68K_ZERO_DIVIDE_EX"); + quick_terminate_op(10); + wf_op("\t}\n"); + + set_current_size(SIZE_LONG); + + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + + // division by zero + wf_op("\tif ((dst == 0x80000000) && (src == (u32)-1))\n"); + wf_op("\t{\n"); + wf_op("\t\tCPU->flag_notZ = CPU->flag_N = 0;\n"); + wf_op("\t\tCPU->flag_V = CPU->flag_C = 0;\n"); + wf_op("\t\tres = 0;\n"); + + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + + quick_terminate_op(50); + wf_op("\t}\n"); + + wf_op("\t{\n"); + wf_op("\t\ts32 q, r;\n"); + wf_op("\n"); + wf_op("\t\tq = (s32)dst / (s32)src;\n"); + wf_op("\t\tr = (s32)dst %% (s32)src;\n"); + wf_op("\n"); + + wf_op("\t\tif ((q > 0x7FFF) || (q < -0x8000))\n"); + wf_op("\t\t{\n"); + // overflow occured + wf_op("\t\t\tCPU->flag_V = C68K_SR_V;\n"); + quick_terminate_op(80); + wf_op("\t\t}\n"); + + // quotient size = word + set_current_size(SIZE_WORD); + + wf_op("\t\tq &= 0x%.8X;\n", current_bits_mask); + wf_op("\t\tCPU->flag_notZ = q;\n"); + wf_op("\t\tCPU->flag_N = q >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\tCPU->flag_V = CPU->flag_C = 0;\n"); + + wf_op("\t\tres = q | (r << 16);\n"); + + set_current_size(SIZE_LONG); + + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + wf_op("\t}\n"); + + // max cycle = 158 + terminate_op(158 - 50); +} + +static void GenMULU() +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + set_current_size(SIZE_WORD); + + // read src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read(current_ea2, current_op->reg2_sft); + + set_current_size(SIZE_LONG); + // op + wf_op("\tres *= src;\n"); + + // flag calculation + wf_op("\tCPU->flag_N = res >> 24;\n"); + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_V = CPU->flag_C = 0;\n"); + + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + + // min cycle = 38; max cycle = 70 + terminate_op(38 + (2 * 6)); +} + +static void GenMULS() +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_RES | GEN_SRC); + else + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + set_current_size(SIZE_WORD); + // read src signed + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src_sx(current_ea, current_op->reg_sft); + // read dst signed (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_sx(current_ea2, current_op->reg2_sft); + + set_current_size(SIZE_LONG); + // op + //wf_op("\t(s32)res *= (s32)src;\n"); + wf_op("\tres *= (s32)src;\n"); // antime fix + + // flag calculation + wf_op("\tCPU->flag_N = res >> 24;\n"); + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_V = CPU->flag_C = 0;\n"); + + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + + // min cycle = 38; max cycle = 70 + terminate_op(38 + (2 * 6)); +} + +static void GenArithaD(char op) +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_DST | GEN_RES | GEN_SRC); + else + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) + { + if (!is_ea_memory(current_ea)) current_cycle += 2; + else current_cycle += 4; + } + + // read src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + if (op == ' ') + { + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + } + else + { + // op + wf_op("\tres = dst %c src;\n", op); + // flag calculation + if (op == '+') set_add_flag(); + else set_sub_flag(); + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + } + + terminate_op(4); +} + +static void GenArithDa(char op) +{ + // generate jump table & opcode declaration + current_ea2 = EA_DREG; + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_src(current_ea2, current_op->reg2_sft); + // read dst + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_dst(current_ea, current_op->reg_sft); + // op + wf_op("\tres = dst %c src;\n", op); + // flag calculation + if (op == '+') set_add_flag(); + else set_sub_flag(); + // write dst + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenArithA(char op) +{ + // generate jump table & opcode declaration + current_ea2 = EA_AREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_DST | GEN_RES | GEN_SRC); + else + start_all(GEN_ALL); + + if ((op != ' ') && ((current_size == SIZE_WORD) || (is_ea_memory(current_ea)))) current_cycle += 2; + + // read src + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src_sx(current_ea, current_op->reg_sft); + // read dst (Ax) + set_current_size(SIZE_LONG); + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + // op + if (op == ' ') + { + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + } + else + { + // op + wf_op("\tres = dst %c src;\n", op); + // write dst (Ax) + _ea_write(current_ea2, current_op->reg2_sft); + } + + terminate_op(6); +} + +static void GenArithX(char op) +{ + // generate jump table & opcode declaration + current_ea = EA_DREG; + current_ea2 = EA_DREG; + if ((current_ea == EA_AREG) || (current_ea == EA_DREG) || (current_ea == EA_IMM)) + start_all(GEN_DST | GEN_RES | GEN_SRC); + else + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (Dx) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (Dx) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + // op + wf_op("\tres = dst %c src %c ((CPU->flag_X >> 8) & 1);\n", op, op); + // flag calculation + if (op == '+') set_addx_flag(); + else set_subx_flag(); + // write dst (Dx) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(4); +} + +static void GenArithXM(char op) +{ + // generate jump table & opcode declaration + current_ea = EA_ADEC; + current_ea2 = EA_ADEC; + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (ADEC) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (ADEC) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + // op + wf_op("\tres = dst %c src %c ((CPU->flag_X >> 8) & 1);\n", op, op); + // flag calculation + if (op == '+') set_addx_flag(); + else set_subx_flag(); + // write dst (ADEC) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(6); +} + +static void GenArithX7M(char op) +{ + // generate jump table & opcode declaration + current_ea = EA_ADEC7; + current_ea2 = EA_ADEC; + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (ADEC7) + _ea_calc(current_ea, 0); + _ea_read_src(current_ea, 0); + // read dst (ADEC) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + // op + wf_op("\tres = dst %c src %c ((CPU->flag_X >> 8) & 1);\n", op, op); + // flag calculation + if (op == '+') set_addx_flag(); + else set_subx_flag(); + // write dst (ADEC) + _ea_write(current_ea2, current_op->reg2_sft); + + terminate_op(6); +} + +static void GenArithXM7(char op) +{ + // generate jump table & opcode declaration + current_ea = EA_ADEC; + current_ea2 = EA_ADEC7; + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (ADEC) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (ADEC7) + _ea_calc(current_ea2, 0); + _ea_read_dst(current_ea2, 0); + // op + wf_op("\tres = dst %c src %c ((CPU->flag_X >> 8) & 1);\n", op, op); + // flag calculation + if (op == '+') set_addx_flag(); + else set_subx_flag(); + // write dst (ADEC7) + _ea_write(current_ea2, 0); + + terminate_op(6); +} + +static void GenArithX7M7(char op) +{ + // generate jump table & opcode declaration + current_ea = EA_ADEC7; + current_ea2 = EA_ADEC7; + start_all(GEN_ALL); + + if (current_size == SIZE_LONG) current_cycle += 4; + + // read src (ADEC7) + _ea_calc(current_ea, 0); + _ea_read_src(current_ea, 0); + // read dst (ADEC7) + _ea_calc(current_ea2, 0); + _ea_read_dst(current_ea2, 0); + // op + wf_op("\tres = dst %c src %c ((CPU->flag_X >> 8) & 1);\n", op, op); + // flag calculation + if (op == '+') set_addx_flag(); + else set_subx_flag(); + // write dst (ADEC7) + _ea_write(current_ea2, 0); + + terminate_op(6); +} + +static void GenADDaD() +{ + GenArithaD('+'); +} + +static void GenADDDa() +{ + GenArithDa('+'); +} + +static void GenADDA() +{ + GenArithA('+'); +} + +static void GenADDX() +{ + GenArithX('+'); +} + +static void GenADDXM() +{ + GenArithXM('+'); +} + +static void GenADDX7M() +{ + GenArithX7M('+'); +} + +static void GenADDXM7() +{ + GenArithXM7('+'); +} + +static void GenADDX7M7() +{ + GenArithX7M7('+'); +} + +static void GenSUBaD() +{ + GenArithaD('-'); +} + +static void GenSUBDa() +{ + GenArithDa('-'); +} + +static void GenSUBA() +{ + GenArithA('-'); +} + +static void GenSUBX() +{ + GenArithX('-'); +} + +static void GenSUBXM() +{ + GenArithXM('-'); +} + +static void GenSUBX7M() +{ + GenArithX7M('-'); +} + +static void GenSUBXM7() +{ + GenArithXM7('-'); +} + +static void GenSUBX7M7() +{ + GenArithX7M7('-'); +} + +static void GenCMP() +{ + GenArithaD(' '); +} + +static void GenCMPA() +{ + GenArithA(' '); +} + +static void GenCMPM() +{ + // generate jump table & opcode declaration + current_ea = EA_AINC; + current_ea2 = EA_AINC; + start_all(GEN_ALL); + + // read src (ADEC) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (ADEC) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + + terminate_op(4); + +} + +static void GenCMP7M() +{ + // generate jump table & opcode declaration + current_ea = EA_AINC7; + current_ea2 = EA_AINC; + start_all(GEN_ALL); + + // read src (ADEC) + _ea_calc(current_ea, 0); + _ea_read_src(current_ea, 0); + // read dst (ADEC) + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_dst(current_ea2, current_op->reg2_sft); + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + + terminate_op(4); + +} + +static void GenCMPM7() +{ + // generate jump table & opcode declaration + current_ea = EA_AINC; + current_ea2 = EA_AINC7; + start_all(GEN_ALL); + + // read src (ADEC) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + // read dst (ADEC) + _ea_calc(current_ea2, 0); + _ea_read_dst(current_ea2, 0); + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + + terminate_op(4); + +} + +static void GenCMP7M7() +{ + // generate jump table & opcode declaration + current_ea = EA_AINC7; + current_ea2 = EA_AINC7; + start_all(GEN_ALL); + + // read src (ADEC) + _ea_calc(current_ea, 0); + _ea_read_src(current_ea, 0); + // read dst (ADEC) + _ea_calc(current_ea2, 0); + _ea_read_dst(current_ea2, 0); + // op + wf_op("\tres = dst - src;\n"); + // flag calculation + set_cmp_flag(); + + terminate_op(4); + +} + +static void GenEXGDD() +{ + // generate jump table & opcode declaration + set_current_size(SIZE_LONG); + current_ea = EA_DREG; + current_ea2 = EA_DREG; + start_all(GEN_RES | GEN_SRC); + + // read R1 + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // read R2 + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_src(current_ea2, current_op->reg2_sft); + // write R1 + _ea_write(current_ea2, current_op->reg2_sft); + wf_op("\tres = src;\n"); + // write R2 + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenEXGAA() +{ + // generate jump table & opcode declaration + set_current_size(SIZE_LONG); + current_ea = EA_AREG; + current_ea2 = EA_AREG; + start_all(GEN_RES | GEN_SRC); + + // read R1 + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // read R2 + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_src(current_ea2, current_op->reg2_sft); + // write R1 + _ea_write(current_ea2, current_op->reg2_sft); + wf_op("\tres = src;\n"); + // write R2 + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenEXGAD() +{ + // generate jump table & opcode declaration + set_current_size(SIZE_LONG); + current_ea = EA_AREG; + current_ea2 = EA_DREG; + start_all(GEN_RES | GEN_SRC); + + // read R1 + _ea_calc(current_ea, current_op->reg_sft); + _ea_read(current_ea, current_op->reg_sft); + // read R2 + _ea_calc(current_ea2, current_op->reg2_sft); + _ea_read_src(current_ea2, current_op->reg2_sft); + // write R1 + _ea_write(current_ea2, current_op->reg2_sft); + wf_op("\tres = src;\n"); + // write R2 + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenASRk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read (sign extend) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src_sx(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft);\n"); + wf_op("\tres = ((s32)src) >> sft;\n"); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenLSRk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_N = CPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft);\n"); + wf_op("\tres = src >> sft;\n"); + wf_op("\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenROXRk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & C / X flags calculation + if (current_size != SIZE_LONG) + { + wf_op("\tsrc |= (CPU->flag_X & C68K_SR_X) << %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + wf_op("\tres = (src >> sft) | (src << (%d - sft));\n", current_sft_mask + 2); + wf_op("\tCPU->flag_X = CPU->flag_C = res >> %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + } + else + { + wf_op("\tCPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft);\n"); + wf_op("\tif (sft == 1) res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + 1)));\n"); + wf_op("\telse res = (src >> sft) | (src << (33 - sft)) | ((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + sft)));\n"); + wf_op("\tCPU->flag_X = CPU->flag_C;\n"); + } + + // V / N / Z flags calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\tCPU->flag_notZ = res;\n"); + else wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenRORk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft);\n"); + wf_op("\tres = (src >> sft) | (src << (%d - sft));\n", current_sft_mask + 1); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\tCPU->flag_notZ = res;\n"); + else wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenASLk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift < size op) ... only for BYTE here + if (current_size == SIZE_BYTE) + { + wf_op("\tif (sft < %d)\n", current_sft_mask + 1); + wf_op("\t{\n"); + } + + // op & flag X, C, N, Z calculation + if (((current_sft_mask + 1) - C68K_SR_C_SFT) < 8) + wf_op("\t\tCPU->flag_X = CPU->flag_C = src << (%d + sft);\n", current_sft_mask + 1 - C68K_SR_C_SFT); + else wf_op("\t\tCPU->flag_X = CPU->flag_C = src >> (%d - sft);\n", current_sft_mask + 1 - C68K_SR_C_SFT); + wf_op("\t\tres = src << sft;\n"); + wf_op("\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + // we do V flag calculation at end for a better register usage + wf_op("\t\tCPU->flag_V = 0;\n"); + if (current_size == SIZE_BYTE) + { + wf_op("\t\tif ((sft > %d) && (src)) CPU->flag_V = C68K_SR_V;\n", current_sft_mask); + wf_op("\t\telse\n"); + } + wf_op("\t\t{\n"); + wf_op("\t\t\tu32 msk = (((s32)0x80000000) >> (sft + %d)) & 0x%.8X;\n", 31 - current_sft_mask, current_bits_mask); + wf_op("\t\t\tsrc &= msk;\n"); + wf_op("\t\t\tif ((src) && (src != msk)) CPU->flag_V = C68K_SR_V;\n"); + wf_op("\t\t}\n"); + + if (current_size == SIZE_BYTE) + { + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of shift == size op (sft = 8 for byte operation) + wf_op("\tif (src) CPU->flag_V = C68K_SR_V;\n"); + wf_op("\telse CPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT;\n"); + + // write + wf_op("\tres = 0;\n"); + _ea_write(current_ea, current_op->reg_sft); + + // others flags + wf_op("\tCPU->flag_N = 0;\n"); + wf_op("\tCPU->flag_notZ = 0;\n"); + } + + terminate_op(6); +} + +static void GenLSLk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + if (((current_sft_mask + 1) - C68K_SR_C_SFT) < 8) + wf_op("\tCPU->flag_X = CPU->flag_C = src << (%d + sft);\n", current_sft_mask + 1 - C68K_SR_C_SFT); + else wf_op("\tCPU->flag_X = CPU->flag_C = src >> (%d - sft);\n", current_sft_mask + 1 - C68K_SR_C_SFT); + wf_op("\tres = src << sft;\n"); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenROXLk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & C / X flags calculation + if (current_size != SIZE_LONG) + { + wf_op("\tsrc |= (CPU->flag_X & C68K_SR_X) << %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + wf_op("\tres = (src << sft) | (src >> (%d - sft));\n", current_sft_mask + 2); + wf_op("\tCPU->flag_X = CPU->flag_C = res >> %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + } + else + { + wf_op("\tCPU->flag_C = src >> ((32 - C68K_SR_C_SFT) - sft);\n"); + wf_op("\tif (sft == 1) res = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> ((C68K_SR_X_SFT + 1) - 1));\n"); + wf_op("\telse res = (src << sft) | (src >> (33 - sft)) | ((CPU->flag_X & C68K_SR_X) >> ((C68K_SR_X_SFT + 1) - sft));\n"); + wf_op("\tCPU->flag_X = CPU->flag_C;\n"); + } + + // V / N / Z flags calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\tCPU->flag_notZ = res;\n"); + else wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenROLk() +{ + u32 base; + + current_ea = EA_DREG; // dst = Dx + + base = get_current_opcode_base(); + // generate jump table + gen_opjumptable_ext(base, 0x0000, 0x0E00, 0x0200, base); + // generate label & declarations + start_op(base, GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = (((Opcode >> 9) - 1) & 7) + 1;\n"); + adds_CCnt("sft * 2"); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + if (((current_sft_mask + 1) - C68K_SR_C_SFT) < 8) + wf_op("\tCPU->flag_C = src << (%d + sft);\n", current_sft_mask + 1 - C68K_SR_C_SFT); + else wf_op("\tCPU->flag_C = src >> (%d - sft);\n", current_sft_mask + 1 - C68K_SR_C_SFT); + wf_op("\tres = (src << sft) | (src >> (%d - sft));\n", current_sft_mask + 1); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\tCPU->flag_notZ = res;\n"); + else wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(6); +} + +static void GenASRD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read (sign extend) + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src_sx(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + // if (shift < size op) + wf_op("\t\tif (sft < %d)\n", current_sft_mask + 1); + wf_op("\t\t{\n"); + + // op & flag calculation + wf_op("\t\t\tCPU->flag_V = 0;\n"); + if (current_size == SIZE_BYTE) wf_op("\t\t\tCPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft);\n"); + else wf_op("\t\t\tCPU->flag_X = CPU->flag_C = (src >> (sft - 1)) << C68K_SR_C_SFT;\n"); + wf_op("\t\t\tres = ((s32)src) >> sft;\n", szcs); + wf_op("\t\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\t\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t\t}\n"); + wf_op("\n"); + + // special case of shift >= size op + + // if signed + wf_op("\t\tif (src & (1 << %d))\n", current_sft_mask); + wf_op("\t\t{\n"); + + // op & flag calculation + wf_op("\t\t\tCPU->flag_N = C68K_SR_N;\n"); + wf_op("\t\t\tCPU->flag_notZ = 1;\n"); + wf_op("\t\t\tCPU->flag_V = 0;\n"); + wf_op("\t\t\tCPU->flag_C = C68K_SR_C;\n"); + wf_op("\t\t\tCPU->flag_X = C68K_SR_X;\n"); + wf_op("\t\t\tres = 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t\t}\n"); + wf_op("\n"); + + // if not signed + wf_op("\t\tCPU->flag_N = 0;\n"); + wf_op("\t\tCPU->flag_notZ = 0;\n"); + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tCPU->flag_C = 0;\n"); + wf_op("\t\tCPU->flag_X = 0;\n"); + wf_op("\t\tres = 0;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenLSRD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + // if (shift <= size op) + if (current_size == SIZE_LONG) wf_op("\t\tif (sft < 32)\n"); + else wf_op("\t\tif (sft <= %d)\n", current_sft_mask + 1); + wf_op("\t\t{\n"); + + // op & flag calculation + wf_op("\t\t\tCPU->flag_N = CPU->flag_V = 0;\n"); + if (current_size == SIZE_BYTE) wf_op("\t\t\tCPU->flag_X = CPU->flag_C = src << ((C68K_SR_C_SFT + 1) - sft);\n"); + else wf_op("\t\t\tCPU->flag_X = CPU->flag_C = (src >> (sft - 1)) << C68K_SR_C_SFT;\n"); + wf_op("\t\t\tres = src >> sft;\n", szcs); + wf_op("\t\t\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t\t}\n"); + wf_op("\n"); + + // special case of shift > size op + if (current_size == SIZE_LONG) + { + wf_op("\t\tif (sft == 32) CPU->flag_C = src >> (31 - C68K_SR_C_SFT);\n"); + wf_op("\t\telse CPU->flag_C = 0;\n"); + wf_op("\t\tCPU->flag_X = CPU->flag_C;\n"); + } + else wf_op("\t\tCPU->flag_X = CPU->flag_C = 0;\n"); + wf_op("\t\tCPU->flag_N = 0;\n"); + wf_op("\t\tCPU->flag_notZ = 0;\n"); + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tres = 0;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenROXRD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + wf_op("\t\tsft %%= %d;\n", current_sft_mask + 2); + wf_op("\n"); + + // op & C / X flag calculation + if (current_size != SIZE_LONG) + { + wf_op("\t\tsrc |= (CPU->flag_X & C68K_SR_X) << %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + wf_op("\t\tres = (src >> sft) | (src << (%d - sft));\n", current_sft_mask + 2); + wf_op("\t\tCPU->flag_X = CPU->flag_C = res >> %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + } + else + { + wf_op("\t\tif (sft != 0)\n"); + wf_op("\t\t{\n"); + wf_op("\t\t\tif (sft == 1) res = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + 1)));\n"); + wf_op("\t\t\telse res = (src >> sft) | (src << (33 - sft)) | (((CPU->flag_X & C68K_SR_X) << (32 - (C68K_SR_X_SFT + 1))) >> (sft - 1));\n"); + wf_op("\t\t\tCPU->flag_X = (src >> (32 - sft)) << C68K_SR_X_SFT;\n"); + wf_op("\t\t}\n"); + wf_op("\t\telse res = src;\n"); + wf_op("\t\tCPU->flag_C = CPU->flag_X;\n"); + } + + // V / N / Z flag calculation + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\t\tCPU->flag_notZ = res;\n"); + else wf_op("\t\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = CPU->flag_X;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenRORD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + wf_op("\t\tsft &= 0x%.2X;\n", current_sft_mask); + wf_op("\t\t\n"); + + // op & flag calculation + if (current_size == SIZE_BYTE) + wf_op("\t\tCPU->flag_C = src << (C68K_SR_C_SFT - ((sft - 1) & 7));\n"); + else + wf_op("\t\tCPU->flag_C = (src >> ((sft - 1) & %d)) << C68K_SR_C_SFT;\n", current_sft_mask); + wf_op("\t\tres = (src >> sft) | (src << (%d - sft));\n", current_sft_mask + 1); + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\t\tCPU->flag_notZ = res;\n"); + else wf_op("\t\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenASLD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + // if (shift < size op) + wf_op("\t\tif (sft < %d)\n", current_sft_mask + 1); + wf_op("\t\t{\n"); + + // op & flag calculation + if (current_size != SIZE_LONG) + { + wf_op("\t\t\tCPU->flag_X = CPU->flag_C = (src << sft) >> %d;\n", (current_sft_mask + 1) - C68K_SR_C_SFT); + wf_op("\t\t\tres = (src << sft) & 0x%.8X;\n", current_bits_mask); + } + else + { + wf_op("\t\t\tCPU->flag_X = CPU->flag_C = (src >> (32 - sft)) << C68K_SR_C_SFT;\n"); + wf_op("\t\t\tres = src << sft;\n"); + } + wf_op("\t\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\t\tCPU->flag_notZ = res;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + // we do V flag calculation at end for a better register usage + wf_op("\t\t\tCPU->flag_V = 0;\n"); + wf_op("\t\t\t{\n"); + wf_op("\t\t\t\tu32 msk = (((s32)0x80000000) >> (sft + %d)) & 0x%.8X;\n", 31 - current_sft_mask, current_bits_mask); + wf_op("\t\t\t\tsrc &= msk;\n"); + wf_op("\t\t\t\tif ((src) && (src != msk)) CPU->flag_V = C68K_SR_V;\n"); + wf_op("\t\t\t}\n"); + + quick_terminate_op(6); + wf_op("\t\t}\n"); + wf_op("\n"); + + // special case of shift >= size op + { + unsigned bugfixo = 0; + + if(0xFF == current_bits_mask) bugfixo = 8; + else if(0xFFFF == current_bits_mask) bugfixo = 16; + else if(0xFFFFFFFF == current_bits_mask) bugfixo = 32; + + assert(bugfixo == 8 || bugfixo == 16 || bugfixo == 32); + + wf_op("\t\tif (sft == %d) CPU->flag_C = src << C68K_SR_C_SFT;\n", bugfixo); //current_bits_mask + 1); + } + wf_op("\t\telse CPU->flag_C = 0;\n"); + wf_op("\t\tCPU->flag_X = CPU->flag_C;\n"); + wf_op("\t\tif (src) CPU->flag_V = C68K_SR_V;\n"); + wf_op("\t\telse CPU->flag_V = 0;\n"); + + wf_op("\t\tres = 0;\n"); + // write + _ea_write(current_ea, current_op->reg_sft); + + // others flags + wf_op("\t\tCPU->flag_N = 0;\n"); + wf_op("\t\tCPU->flag_notZ = 0;\n"); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenLSLD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + // if (shift <= size op) + if (current_size == SIZE_LONG) wf_op("\t\tif (sft < 32)\n"); + else wf_op("\t\tif (sft <= %d)\n", current_sft_mask + 1); + wf_op("\t\t{\n"); + + // op & flag calculation + if (current_size != SIZE_LONG) + { + wf_op("\t\t\tCPU->flag_X = CPU->flag_C = (src << sft) >> %d;\n", (current_sft_mask + 1) - C68K_SR_C_SFT); + wf_op("\t\t\tres = (src << sft) & 0x%.8X;\n", current_bits_mask); + } + else + { + wf_op("\t\t\tCPU->flag_X = CPU->flag_C = (src >> (32 - sft)) << C68K_SR_C_SFT;\n"); + wf_op("\t\t\tres = src << sft;\n"); + } + wf_op("\t\t\tCPU->flag_V = 0;\n"); + wf_op("\t\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\t\tCPU->flag_notZ = res;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t\t}\n"); + wf_op("\n"); + + // special case of shift > size op + if (current_size == SIZE_LONG) + { + wf_op("\t\tif (sft == 32) CPU->flag_C = src << C68K_SR_C_SFT;\n"); + wf_op("\t\telse CPU->flag_C = 0;\n"); + wf_op("\t\tCPU->flag_X = CPU->flag_C;\n"); + } + else wf_op("\t\tCPU->flag_X = CPU->flag_C = 0;\n"); + wf_op("\t\tCPU->flag_N = 0;\n"); + wf_op("\t\tCPU->flag_notZ = 0;\n"); + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tres = 0;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenROXLD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + wf_op("\t\tsft %%= %d;\n", current_sft_mask + 2); + wf_op("\n"); + + // op & C/X flags calculation + if (current_size != SIZE_LONG) + { + wf_op("\t\tsrc |= (CPU->flag_X & C68K_SR_X) << %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + wf_op("\t\tres = (src << sft) | (src >> (%d - sft));\n", current_sft_mask + 2); + wf_op("\t\tCPU->flag_X = CPU->flag_C = res >> %d;\n", (current_sft_mask + 1) - C68K_SR_X_SFT); + } + else + { + wf_op("\t\tif (sft != 0)\n"); + wf_op("\t\t{\n"); + wf_op("\t\t\tif (sft == 1) res = (src << 1) | ((CPU->flag_X >> ((C68K_SR_X_SFT + 1) - 1)) & 1);\n"); + wf_op("\t\t\telse res = (src << sft) | (src >> (33 - sft)) | (((CPU->flag_X >> ((C68K_SR_X_SFT + 1) - 1)) & 1) << (sft - 1));\n"); + wf_op("\t\t\tCPU->flag_X = (src >> (32 - sft)) << C68K_SR_X_SFT;\n"); + wf_op("\t\t}\n"); + wf_op("\t\telse res = src;\n"); + wf_op("\t\tCPU->flag_C = CPU->flag_X;\n"); + } + + // V / N / Z flags calculation + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + if (current_size == SIZE_LONG) wf_op("\t\tCPU->flag_notZ = res;\n"); + else wf_op("\t\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = CPU->flag_X;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenROLD() +{ +// u32 base = get_current_opcode_base(); + + current_ea = EA_DREG; // dst = Dx + + start_all(GEN_RES | GEN_SRC); + + if (current_size == SIZE_LONG) current_cycle += 2; + + wf_op("\tu32 sft;\n"); + wf_op("\n"); + wf_op("\tsft = CPU->D[(Opcode >> %d) & 7] & 0x3F;\n", current_op->reg2_sft); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // if (shift != 0) + wf_op("\tif (sft)\n"); + wf_op("\t{\n"); + + adds_CCnt("sft * 2"); + + // if ((shift & size op) != 0) + wf_op("\t\tif (sft &= 0x%.2X)\n", current_sft_mask); + wf_op("\t\t{\n"); + + // op & flag calculation + if (current_size != SIZE_LONG) + { + wf_op("\t\t\tCPU->flag_C = (src << sft) >> %d;\n", (current_sft_mask + 1) - C68K_SR_C_SFT); + wf_op("\t\t\tres = ((src << sft) | (src >> (%d - sft))) & 0x%.8X;\n", current_sft_mask + 1, current_bits_mask); + } + else + { + wf_op("\t\t\tCPU->flag_C = (src >> (32 - sft)) << C68K_SR_C_SFT;\n"); + wf_op("\t\t\tres = (src << sft) | (src >> (%d - sft));\n", current_sft_mask + 1); + } + wf_op("\t\t\tCPU->flag_V = 0;\n"); + wf_op("\t\t\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\t\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + quick_terminate_op(6); + wf_op("\t\t}\n"); + wf_op("\n"); + + // special case of ((shift & size op) == 0) + wf_op("\t\tCPU->flag_V = 0;\n"); + wf_op("\t\tCPU->flag_C = src << C68K_SR_C_SFT;\n"); + wf_op("\t\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\t\tCPU->flag_notZ = src;\n"); + + quick_terminate_op(6); + wf_op("\t}\n"); + wf_op("\n"); + + // special case of (shift == 0) + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_N = src >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = src;\n"); + + terminate_op(6); +} + +static void GenASR() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT;\n"); + wf_op("\tres = (src >> 1) | (src & (1 << %d));\n", current_sft_mask); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenLSR() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_N = CPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = src << C68K_SR_C_SFT;\n"); + wf_op("\tres = src >> 1;\n"); + wf_op("\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenROXR() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tres = (src >> 1) | ((CPU->flag_X & C68K_SR_X) << %d);\n", current_sft_mask - C68K_SR_X_SFT); + wf_op("\tCPU->flag_C = CPU->flag_X = src << C68K_SR_C_SFT;\n"); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res;\n"); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenROR() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = src << C68K_SR_C_SFT;\n"); + wf_op("\tres = (src >> 1) | (src << %d);\n", current_sft_mask); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenASL() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_X = CPU->flag_C = src >> %d;\n", current_sft_mask - C68K_SR_C_SFT); + wf_op("\tres = src << 1;\n"); + wf_op("\tCPU->flag_V = (src ^ res) >> %d;\n", current_sft_mask - C68K_SR_V_SFT); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenLSL() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = src >> %d;\n", current_sft_mask - C68K_SR_C_SFT); + wf_op("\tres = src << 1;\n"); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenROXL() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tres = (src << 1) | ((CPU->flag_X & C68K_SR_X) >> %d);\n", C68K_SR_X_SFT); + wf_op("\tCPU->flag_X = CPU->flag_C = src >> %d;\n", current_sft_mask - C68K_SR_C_SFT); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +static void GenROL() +{ + set_current_size(SIZE_WORD); // dst = mem (word operation) + start_all(GEN_ADR | GEN_RES | GEN_SRC); + + // read + _ea_calc(current_ea, current_op->reg_sft); + _ea_read_src(current_ea, current_op->reg_sft); + + // op & flag calculation + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_C = src >> %d;\n", current_sft_mask - C68K_SR_C_SFT); + wf_op("\tres = (src << 1) | (src >> %d);\n", current_sft_mask); + wf_op("\tCPU->flag_N = res >> %d;\n", current_sft_mask - C68K_SR_N_SFT); + wf_op("\tCPU->flag_notZ = res & 0x%.8X;\n", current_bits_mask); + + // write + _ea_write(current_ea, current_op->reg_sft); + + terminate_op(8); +} + +// main function +///////////////// +int main(int argc, char *argv[]) +{ + u32 i; + u32 s; + u32 smax; + + // clear opcode files + for(i = 0; i < 0x10; i++) + { + char fn[16]; + + sprintf(fn, "c68k_op%.1X.inc", (int)i); + opcode_file = fopen(fn, "wt"); + if (opcode_file != NULL) + { + fclose(opcode_file); + opcode_file = NULL; + } + } + + // generate opcode files + for(i = 0; i < OP_INFO_TABLE_LEN; i++) + { + current_op = &(op_info_table[i]); + if (prepare_generate()) return 1; + + // s = size to start + current_size = 0; + smax = SIZE_LONG; + if (current_op->size_type == 0) smax = 0; + else if (current_op->size_type == 1) current_size = 1; + + for(s = current_size; s <= smax; s++) + { + if (current_op->eam_sft != -1) + { + for(current_ea = 0; current_ea <= EA_ADEC7; current_ea++) + { + if (!has_ea(current_ea)) continue; + current_eam = _ea_to_eamreg(current_ea) >> 3; + current_reg = _ea_to_eamreg(current_ea) & 7; + + if (op_info_table[i].eam2_sft != -1) + { + for(current_ea2 = 0; current_ea2 <= EA_ADEC7; current_ea2++) + { + if (!has_ea2(current_ea2)) continue; + current_eam2 = _ea_to_eamreg(current_ea2) >> 3; + current_reg2 = _ea_to_eamreg(current_ea2) & 7; + + set_current_size(s); + current_op->genfunc(); + } + } + else + { + current_reg2 = 0; + set_current_size(s); + current_op->genfunc(); + } + } + } + else + { + current_reg = 0; + set_current_size(s); + current_op->genfunc(); + } + } + } + + // close handle + if (opcode_file != NULL) fclose(opcode_file); + + return 0; +} + diff --git a/Mednafen/mednafen/hw_cpu/c68k/gen68k.h b/Mednafen/mednafen/hw_cpu/c68k/gen68k.h new file mode 100644 index 0000000000..3d4ee51bfb --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/gen68k.h @@ -0,0 +1,68 @@ +/* Copyright 2003-2004 Stephane Dallongeville + Copyright 2004 Theo Berkau + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/********************************************************************************* + * GEN68K.H : + * + * C68K generator include file + * + ********************************************************************************/ + +#ifndef _GEN68K_H_ +#define _GEN68K_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +// setting +/////////// + +// structure definition +//////////////////////// + +typedef struct { + u32 name; + u32 mask; + u32 match; +} c68k_ea_info_struc; + +typedef struct __c68k_op_info_struc { + s8 op_name[8 + 1]; + u16 op_base; + u16 op_mask; + s8 size_type; + s8 size_sft; + s8 eam_sft; + s8 reg_sft; + s8 eam2_sft; + s8 reg2_sft; + s8 ea_supported[12 + 1]; + s8 ea2_supported[12 + 1]; + void (*genfunc)(); +} c68k_op_info_struc; + + +#ifdef __cplusplus +} +#endif + +#endif // _GEN68K_H_ + diff --git a/Mednafen/mednafen/hw_cpu/c68k/gen68k.inc b/Mednafen/mednafen/hw_cpu/c68k/gen68k.inc new file mode 100644 index 0000000000..0e769bc0b1 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/c68k/gen68k.inc @@ -0,0 +1,1584 @@ +/* Copyright 2003-2004 Stephane Dallongeville + + This file is part of Yabause. + + Yabause is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Yabause is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Yabause; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include +#include + +#define EA_DREG 0 +#define EA_AREG 1 +#define EA_AIND 2 +#define EA_AINC 3 +#define EA_ADEC 4 +#define EA_D16A 5 +#define EA_D8AX 6 +#define EA_A16 7 +#define EA_A32 8 +#define EA_D16P 9 +#define EA_D8PX 10 +#define EA_IMM 11 +#define EA_AINC7 12 +#define EA_ADEC7 13 +#define EA_ILLEGAL 15 + +#define SIZE_BYTE 0 +#define SIZE_WORD 1 +#define SIZE_LONG 2 + +#define COND_TR 0 +#define COND_FA 1 +#define COND_HI 2 +#define COND_LS 3 +#define COND_CC 4 +#define COND_CS 5 +#define COND_NE 6 +#define COND_EQ 7 +#define COND_VC 8 +#define COND_VS 9 +#define COND_PL 10 +#define COND_MI 11 +#define COND_GE 12 +#define COND_LT 13 +#define COND_GT 14 +#define COND_LE 15 + +#define COND_NOT_TR COND_FA +#define COND_NOT_FA COND_TR +#define COND_NOT_HI COND_LS +#define COND_NOT_LS COND_HI +#define COND_NOT_CC COND_CS +#define COND_NOT_CS COND_CC +#define COND_NOT_NE COND_EQ +#define COND_NOT_EQ COND_NE +#define COND_NOT_VC COND_VS +#define COND_NOT_VS COND_VC +#define COND_NOT_PL COND_MI +#define COND_NOT_MI COND_PL +#define COND_NOT_GE COND_LT +#define COND_NOT_LT COND_GE +#define COND_NOT_GT COND_LE +#define COND_NOT_LE COND_GT + +#define OP_ILLEGAL 0x4AFC + +static void GenORI(); +static void GenORICCR(); +static void GenORISR(); +static void GenANDI(); +static void GenANDICCR(); +static void GenANDISR(); +static void GenEORI(); +static void GenEORICCR(); +static void GenEORISR(); +static void GenSUBI(); +static void GenADDI(); +static void GenCMPI(); +static void GenBTSTn(); +static void GenBCHGn(); +static void GenBCLRn(); +static void GenBSETn(); +static void GenBTST(); +static void GenBCHG(); +static void GenBCLR(); +static void GenBSET(); +static void GenMOVEPWaD(); +static void GenMOVEPLaD(); +static void GenMOVEPWDa(); +static void GenMOVEPLDa(); +static void GenMOVEB(); +static void GenMOVEL(); +static void GenMOVEW(); +static void GenMOVEAL(); +static void GenMOVEAW(); +static void GenNEGX(); +static void GenCLR(); +static void GenNEG(); +static void GenNOT(); +static void GenMOVESRa(); +static void GenMOVEaSR(); +static void GenMOVEaCCR(); +static void GenNBCD(); +static void GenPEA(); +static void GenSWAP(); +static void GenMOVEMaR(); +static void GenEXT(); +static void GenTST(); +static void GenTAS(); +static void GenILLEGAL(); +static void GenMOVEMRa(); +static void GenTRAP(); +static void GenLINK(); +static void GenLINKA7(); +static void GenULNK(); +static void GenULNKA7(); +static void GenMOVEAUSP(); +static void GenMOVEUSPA(); +static void GenRESET(); +static void GenNOP(); +static void GenSTOP(); +static void GenRTE(); +static void GenRTS(); +static void GenTRAPV(); +static void GenRTR(); +static void GenJSR(); +static void GenJMP(); +static void GenCHK(); +static void GenLEA(); +static void GenSTCC(); +static void GenDBCC(); +static void GenADDQ(); +static void GenSUBQ(); +static void GenBCC(); +static void GenBCC16(); +static void GenBRA(); +static void GenBRA16(); +static void GenBSR(); +static void GenBSR16(); +static void GenMOVEQ(); +static void GenORaD(); +static void GenORDa(); +static void GenSBCD(); +static void GenSBCDM(); +static void GenSBCD7M(); +static void GenSBCDM7(); +static void GenSBCD7M7(); +static void GenDIVU(); +static void GenDIVS(); +static void GenSUBaD(); +static void GenSUBDa(); +static void GenSUBX(); +static void GenSUBXM(); +static void GenSUBX7M(); +static void GenSUBXM7(); +static void GenSUBX7M7(); +static void GenSUBA(); +static void GenCMP(); +static void GenCMPM(); +static void GenCMP7M(); +static void GenCMPM7(); +static void GenCMP7M7(); +static void GenEORDa(); +static void GenCMPA(); +static void GenANDaD(); +static void GenANDDa(); +static void GenABCD(); +static void GenABCDM(); +static void GenABCD7M(); +static void GenABCDM7(); +static void GenABCD7M7(); +static void GenMULU(); +static void GenMULS(); +static void GenEXGDD(); +static void GenEXGAA(); +static void GenEXGAD(); +static void GenADDaD(); +static void GenADDDa(); +static void GenADDX(); +static void GenADDXM(); +static void GenADDX7M(); +static void GenADDXM7(); +static void GenADDX7M7(); +static void GenADDA(); +static void GenASRk(); +static void GenLSRk(); +static void GenROXRk(); +static void GenRORk(); +static void GenASLk(); +static void GenLSLk(); +static void GenROXLk(); +static void GenROLk(); +static void GenASRD(); +static void GenLSRD(); +static void GenROXRD(); +static void GenRORD(); +static void GenASLD(); +static void GenLSLD(); +static void GenROXLD(); +static void GenROLD(); +static void GenASR(); +static void GenLSR(); +static void GenROXR(); +static void GenROR(); +static void GenASL(); +static void GenLSL(); +static void GenROXL(); +static void GenROL(); + +static void Gen1010(); +static void Gen1111(); + +#define OP_INFO_TABLE_LEN (142 + 2) + +static c68k_op_info_struc op_info_table[OP_INFO_TABLE_LEN] = +{ // DAAAAddaaddi DAAAAddaaddi + // iid181318m iid181318m + // siz siz eam ear eam ear nne6A626Pm nne6A626Pm + + // opname opbase opmask typ sft 1 1 2 2 dccAX PX dccAX PX GenFunc + { "1010", 0xA000, 0xF000, 0, 0, -1, -1, -1, -1, "------------", "------------", Gen1010 }, + { "1111", 0xF000, 0xF000, 0, 0, -1, -1, -1, -1, "------------", "------------", Gen1111 }, + + { "ORI", 0x0000, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenORI }, + { "ORICCR", 0x003C, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenORICCR }, + { "ORISR", 0x007C, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenORISR }, + { "ANDI", 0x0200, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenANDI }, + { "ANDICCR", 0x023C, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenANDICCR }, + { "ANDISR", 0x027C, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenANDISR }, + { "EORI", 0x0A00, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenEORI }, + { "EORICCR", 0x0A3C, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenEORICCR }, + { "EORISR", 0x0A7C, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenEORISR }, + + { "SUBI", 0x0400, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenSUBI }, + { "ADDI", 0x0600, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenADDI }, + { "CMPI", 0x0C00, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenCMPI }, + + { "BTSTn", 0x0800, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooooo-", "------------", GenBTSTn }, + { "BCHGn", 0x0840, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenBCHGn }, + { "BCLRn", 0x0880, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenBCLRn }, + { "BSETn", 0x08C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenBSETn }, + + { "BTST", 0x0100, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-oooooooooo", "------------", GenBTST }, + { "BCHG", 0x0140, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-ooooooo---", "------------", GenBCHG }, + { "BCLR", 0x0180, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-ooooooo---", "------------", GenBCLR }, + { "BSET", 0x01C0, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-ooooooo---", "------------", GenBSET }, + + { "MOVEPWaD", 0x0108, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenMOVEPWaD }, + { "MOVEPLaD", 0x0148, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenMOVEPLaD }, + { "MOVEPWDa", 0x0188, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenMOVEPWDa }, + { "MOVEPLDa", 0x01C8, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenMOVEPLDa }, + + { "MOVEB", 0x1000, 0xF000, 0, 0, 3, 0, 6, 9, "oooooooooooo", "o-ooooooo---", GenMOVEB }, + { "MOVEL", 0x2000, 0xF000, 0, 0, 3, 0, 6, 9, "oooooooooooo", "o-ooooooo---", GenMOVEL }, + { "MOVEW", 0x3000, 0xF000, 0, 0, 3, 0, 6, 9, "oooooooooooo", "o-ooooooo---", GenMOVEW }, + { "MOVEAL", 0x2040, 0xF1C0, 0, 0, 3, 0, -1, 9, "oooooooooooo", "------------", GenMOVEAL }, + { "MOVEAW", 0x3040, 0xF1C0, 0, 0, 3, 0, -1, 9, "oooooooooooo", "------------", GenMOVEAW }, + + { "NEGX", 0x4000, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenNEGX }, + { "CLR", 0x4200, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenCLR }, + { "NEG", 0x4400, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenNEG }, + { "NOT", 0x4600, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenNOT }, + + { "MOVESRa", 0x40C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenMOVESRa }, + { "MOVEaCCR", 0x44C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-oooooooooo", "------------", GenMOVEaCCR }, + { "MOVEaSR", 0x46C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-oooooooooo", "------------", GenMOVEaSR }, + + { "NBCD", 0x4800, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenNBCD }, + { "PEA", 0x4840, 0xFFC0, 0, 0, 3, 0, -1, -1, "--o--oooooo-", "------------", GenPEA }, + { "SWAP", 0x4840, 0xFFF8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenSWAP }, + + { "MOVEMRa", 0x4880, 0xFF80, 1, 6, 3, 0, -1, -1, "--o-ooooo---", "------------", GenMOVEMRa }, + { "EXT", 0x4880, 0xFFB8, 1, 6, -1, 0, -1, -1, "------------", "------------", GenEXT }, + { "TST", 0x4A00, 0xFF00, 2, 6, 3, 0, -1, -1, "o-ooooooo---", "------------", GenTST }, + { "TAS", 0x4AC0, 0xFFC0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenTAS }, + { "ILLEGAL", 0x4AFC, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenILLEGAL }, + { "MOVEMaR", 0x4C80, 0xFF80, 1, 6, 3, 0, -1, -1, "--oo-oooooo-", "------------", GenMOVEMaR }, + + { "TRAP", 0x4E40, 0xFFF0, 0, 0, -1, -1, -1, -1, "------------", "------------", GenTRAP }, + { "LINK", 0x4E50, 0xFFF8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenLINK }, + { "LINKA7", 0x4E57, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenLINKA7 }, + { "ULNK", 0x4E58, 0xFFF8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenULNK }, + { "ULNKA7", 0x4E5F, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenULNKA7 }, + { "MOVEAUSP", 0x4E60, 0xFFF8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenMOVEAUSP }, + { "MOVEUSPA", 0x4E68, 0xFFF8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenMOVEUSPA }, + + { "RESET", 0x4E70, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenRESET }, + { "NOP", 0x4E71, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenNOP }, + { "STOP", 0x4E72, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenSTOP }, + { "RTE", 0x4E73, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenRTE }, + { "RTS", 0x4E75, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenRTS }, + { "TRAPV", 0x4E76, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenTRAPV }, + { "RTR", 0x4E77, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenRTR }, + + { "JSR", 0x4E80, 0xFFC0, 0, 0, 3, 0, -1, -1, "--o--oooooo-", "------------", GenJSR }, + { "JMP", 0x4EC0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--o--oooooo-", "------------", GenJMP }, + + { "CHK", 0x4180, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-oooooooooo", "------------", GenCHK }, + { "LEA", 0x41C0, 0xF1C0, 0, 0, 3, 0, -1, 9, "--o--oooooo-", "------------", GenLEA }, + + { "STCC", 0x50C0, 0xF0C0, 0, 0, 3, 0, -1, -1, "o-ooooooo---", "------------", GenSTCC }, + { "DBCC", 0x50C8, 0xF0F8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenDBCC }, + + { "ADDQ", 0x5000, 0xF100, 2, 6, 3, 0, -1, -1, "ooooooooo---", "------------", GenADDQ }, + { "SUBQ", 0x5100, 0xF100, 2, 6, 3, 0, -1, -1, "ooooooooo---", "------------", GenSUBQ }, + + { "BCC", 0x6000, 0xF000, 0, 0, -1, -1, -1, -1, "------------", "------------", GenBCC }, + { "BCC16", 0x6000, 0xF0FF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenBCC16 }, + { "BRA", 0x6000, 0xFF00, 0, 0, -1, -1, -1, -1, "------------", "------------", GenBRA }, + { "BRA16", 0x6000, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenBRA16 }, + { "BSR", 0x6100, 0xFF00, 0, 0, -1, -1, -1, -1, "------------", "------------", GenBSR }, + { "BSR16", 0x6100, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenBSR16 }, + + { "MOVEQ", 0x7000, 0xF100, 0, 0, -1, 9, -1, -1, "------------", "------------", GenMOVEQ }, + + { "ORaD", 0x8000, 0xF100, 2, 6, 3, 0, -1, 9, "o-oooooooooo", "------------", GenORaD }, + { "ORDa", 0x8100, 0xF100, 2, 6, 3, 0, -1, 9, "--ooooooo---", "------------", GenORDa }, + { "SBCD", 0x8100, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenSBCD }, + { "SBCDM", 0x8108, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenSBCDM }, + { "SBCD7M", 0x810F, 0xF1FF, 0, 0, -1, 0, -1, 9, "------------", "------------", GenSBCD7M }, + { "SBCDM7", 0x8F08, 0xFFF8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenSBCDM7 }, + { "SBCD7M7", 0x8F0F, 0xFFFF, 0, 0, -1, 0, -1, 9, "------------", "------------", GenSBCD7M7 }, + { "DIVU", 0x80C0, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-oooooooooo", "------------", GenDIVU }, + { "DIVS", 0x81C0, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-oooooooooo", "------------", GenDIVS }, + + { "SUBaD", 0x9000, 0xF100, 2, 6, 3, 0, -1, 9, "oooooooooooo", "------------", GenSUBaD }, + { "SUBDa", 0x9100, 0xF100, 2, 6, 3, 0, -1, 9, "--ooooooo---", "------------", GenSUBDa }, + { "SUBX", 0x9100, 0xF138, 2, 6, -1, 0, -1, 9, "------------", "------------", GenSUBX }, + { "SUBXM", 0x9108, 0xF138, 2, 6, -1, 0, -1, 9, "------------", "------------", GenSUBXM }, + { "SUBX7M", 0x910F, 0xF13F, 2, 6, -1, -1, -1, 9, "------------", "------------", GenSUBX7M }, + { "SUBXM7", 0x9F08, 0xFF38, 2, 6, -1, 0, -1, -1, "------------", "------------", GenSUBXM7 }, + { "SUBX7M7", 0x9F0F, 0xFF3F, 2, 6, -1, -1, -1, -1, "------------", "------------", GenSUBX7M7 }, + { "SUBA", 0x90C0, 0xF0C0, 1, 8, 3, 0, -1, 9, "oooooooooooo", "------------", GenSUBA }, + + { "CMP", 0xB000, 0xF100, 2, 6, 3, 0, -1, 9, "oooooooooooo", "------------", GenCMP }, + { "CMPM", 0xB108, 0xF138, 2, 6, -1, 0, -1, 9, "------------", "------------", GenCMPM }, + { "CMP7M", 0xB10F, 0xF13F, 2, 6, -1, -1, -1, 9, "------------", "------------", GenCMP7M }, + { "CMPM7", 0xBF08, 0xFF38, 2, 6, -1, 0, -1, -1, "------------", "------------", GenCMPM7 }, + { "CMP7M7", 0xBF0F, 0xFF3F, 2, 6, -1, -1, -1, -1, "------------", "------------", GenCMP7M7 }, + { "EORDa", 0xB100, 0xF100, 2, 6, 3, 0, -1, 9, "o-ooooooo---", "------------", GenEORDa }, + { "CMPA", 0xB0C0, 0xF0C0, 1, 8, 3, 0, -1, 9, "oooooooooooo", "------------", GenCMPA }, + + { "ANDaD", 0xC000, 0xF100, 2, 6, 3, 0, -1, 9, "o-oooooooooo", "------------", GenANDaD }, + { "ANDDa", 0xC100, 0xF100, 2, 6, 3, 0, -1, 9, "--ooooooo---", "------------", GenANDDa }, + { "ABCD", 0xC100, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenABCD }, + { "ABCDM", 0xC108, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenABCDM }, + { "ABCD7M", 0xC10F, 0xF1FF, 0, 0, -1, -1, -1, 9, "------------", "------------", GenABCD7M }, + { "ABCDM7", 0xCF08, 0xFFF8, 0, 0, -1, 0, -1, -1, "------------", "------------", GenABCDM7 }, + { "ABCD7M7", 0xCF0F, 0xFFFF, 0, 0, -1, -1, -1, -1, "------------", "------------", GenABCD7M7 }, + { "MULU", 0xC0C0, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-oooooooooo", "------------", GenMULU }, + { "MULS", 0xC1C0, 0xF1C0, 0, 0, 3, 0, -1, 9, "o-oooooooooo", "------------", GenMULS }, + { "EXGDD", 0xC140, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenEXGDD }, + { "EXGAA", 0xC148, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenEXGAA }, + { "EXGAD", 0xC188, 0xF1F8, 0, 0, -1, 0, -1, 9, "------------", "------------", GenEXGAD }, + + { "ADDaD", 0xD000, 0xF100, 2, 6, 3, 0, -1, 9, "oooooooooooo", "------------", GenADDaD }, + { "ADDDa", 0xD100, 0xF100, 2, 6, 3, 0, -1, 9, "--ooooooo---", "------------", GenADDDa }, + { "ADDX", 0xD100, 0xF138, 2, 6, -1, 0, -1, 9, "------------", "------------", GenADDX }, + { "ADDXM", 0xD108, 0xF138, 2, 6, -1, 0, -1, 9, "------------", "------------", GenADDXM }, + { "ADDX7M", 0xD10F, 0xF13F, 2, 6, -1, -1, -1, 9, "------------", "------------", GenADDX7M }, + { "ADDXM7", 0xDF08, 0xFF38, 2, 6, -1, 0, -1, -1, "------------", "------------", GenADDXM7 }, + { "ADDX7M7", 0xDF0F, 0xFF3F, 2, 6, -1, -1, -1, -1, "------------", "------------", GenADDX7M7 }, + { "ADDA", 0xD0C0, 0xF0C0, 1, 8, 3, 0, -1, 9, "oooooooooooo", "------------", GenADDA }, + + { "ASRk", 0xE000, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenASRk }, + { "LSRk", 0xE008, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenLSRk }, + { "ROXRk", 0xE010, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenROXRk }, + { "RORk", 0xE018, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenRORk }, + { "ASLk", 0xE100, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenASLk }, + { "LSLk", 0xE108, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenLSLk }, + { "ROXLk", 0xE110, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenROXLk }, + { "ROLk", 0xE118, 0xF138, 2, 6, -1, 0, -1, -1, "o-----------", "------------", GenROLk }, + + { "ASRD", 0xE020, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenASRD }, + { "LSRD", 0xE028, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenLSRD }, + { "ROXRD", 0xE030, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenROXRD }, + { "RORD", 0xE038, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenRORD }, + { "ASLD", 0xE120, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenASLD }, + { "LSLD", 0xE128, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenLSLD }, + { "ROXLD", 0xE130, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenROXLD }, + { "ROLD", 0xE138, 0xF138, 2, 6, -1, 0, -1, 9, "o-----------", "o-----------", GenROLD }, + + { "ASR", 0xE0C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenASR }, + { "LSR", 0xE2C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenLSR }, + { "ROXR", 0xE4C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenROXR }, + { "ROR", 0xE6C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenROR }, + { "ASL", 0xE1C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenASL }, + { "LSL", 0xE3C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenLSL }, + { "ROXL", 0xE5C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenROXL }, + { "ROL", 0xE7C0, 0xFFC0, 0, 0, 3, 0, -1, -1, "--ooooooo---", "------------", GenROL } +}; + +// files where code is generated +static FILE* opcode_file = NULL; + +// current generated instruction infos +static c68k_op_info_struc *current_op; +static u32 current_ea; +static u32 current_eam; +static u32 current_reg; +static u32 current_ea2; +static u32 current_eam2; +static u32 current_reg2; +static u32 current_size; +static u32 current_cycle; + +static char current_cond_char[128]; + +static char szc[20]; +static char szcs[20]; +static char szcf[20]; +static char szcsf[20]; + +static u32 current_bits_mask; +static u8 current_sft_mask; + +#define EA_DREG 0 +#define EA_AREG 1 +#define EA_AIND 2 +#define EA_AINC 3 +#define EA_ADEC 4 +#define EA_D16A 5 +#define EA_D8AX 6 +#define EA_A16 7 +#define EA_A32 8 +#define EA_D16P 9 +#define EA_D8PX 10 +#define EA_IMM 11 +#define EA_AINC7 12 +#define EA_ADEC7 13 +#define EA_ILLEGAL 15 + +static const u32 jmp_jsr_cycle_table[16] = +{ + 0, 0, + 4, + 0, + 0, + 6, + 10, + 6, + 8, + 6, + 10, + 0, 0, 0, 0 +}; + +static const u32 lea_pea_cycle_table[16] = +{ + 0, 0, + 0, + 0, + 0, + 4, + 8, + 4, + 8, + 4, + 8, + 0, 0, 0, 0 +}; + +static const u32 movem_cycle_table[16] = +{ + 0, 0, + 0, + 0, + 0, + 4, + 6, + 4, + 8, + 4, + 6, + 0, 0, 0, 0 +}; + +// general emitter function +//////////////////////////// + +static u32 prepare_generate() +{ + char filename[32]; + + sprintf(filename, "c68k_op%.1X.inc", (current_op->op_base >> 12) & 0xF); + if (opcode_file != NULL) + { + fclose(opcode_file); + opcode_file = NULL; + } + opcode_file = fopen(filename, "at"); + if (opcode_file == NULL) + { + printf("Can't open %s\n", filename); + return 1; + } + return 0; +} + +static void wf_op(const char* fmt, ...) +{ + va_list args; + + if (opcode_file == NULL) return; + + va_start(args, fmt); + vfprintf(opcode_file, fmt, args); + va_end(args); +} + +static void gen_jumptable(u32 base, u32 start1, u32 end1, u32 step1, u32 start2, u32 end2, u32 step2, u32 start3, u32 end3, u32 step3, u32 op) +{ + base &= 0xFFFF; + start1 &= 0xFFFF; + end1 &= 0xFFFF; + step1 &= 0xFFFF; + if (end1 < start1) end1 = start1; + start2 &= 0xFFFF; + end2 &= 0xFFFF; + step2 &= 0xFFFF; + if (end2 < start2) end2 = start2; + op &= 0xFFFF; + + u32 i, j, k; + + if (step1 == 0) step1 = 1; + if (step2 == 0) step2 = 1; + if (step3 == 0) step3 = 1; + + for(i = start1; i <= end1; i += step1) + for(j = start2; j <= end2; j += step2) + for(k = start3; k <= end3; k += step3) + { + u32 temp=(base + i + j + k); + + if(temp == 0x4AFC) + wf_op("default:\n"); + + if (temp != op && temp != 0x4E57 && temp != 0x4E5F) + wf_op("case 0x%.4X:\n", base + i + j + k); + } +} + +static void gen_opjumptable_ext(u32 base, u32 start3, u32 end3, u32 step3, u32 op) +{ + u32 start1, end1, step1, start2, end2, step2; + + start1 = end1 = step1 = 0; + start2 = end2 = step2 = 0; + + if ((current_op->reg_sft != -1) && (current_ea < 7)) + { + if ((current_ea == EA_AINC) || (current_ea == EA_ADEC)) end1 = 6 << current_op->reg_sft; + else end1 = 7 << current_op->reg_sft; + step1 = 1 << current_op->reg_sft; + } + if ((current_op->reg2_sft != -1) && (current_ea2 < 7)) + { + if ((current_ea2 == EA_AINC) || (current_ea2 == EA_ADEC)) end2 = 6 << current_op->reg2_sft; + else end2 = 7 << current_op->reg2_sft; + step2 = 1 << current_op->reg2_sft; + } + + if (start1 != end1) + { + if (start2 != end2) gen_jumptable(base, start1, end1, step1, start2, end2, step2, start3, end3, step3, op); + else gen_jumptable(base, start1, end1, step1, start3, end3, step3, start2, end2, step2, op); + } + else if (start2 != end2) gen_jumptable(base, start2, end2, step2, start3, end3, step3, start1, end1, step1, op); + else gen_jumptable(base, start3, end3, step3, start2, end2, step2, start1, end1, step1, op); +} + +static void gen_opjumptable(u32 op) +{ + gen_opjumptable_ext(op, 0, 0, 0, op); +} + +#define GEN_ADR 1 +#define GEN_RES 2 +#define GEN_SRC 4 +#define GEN_DST 8 +#define GEN_ALL 15 + +static void start_op(u32 op, int v) +{ + current_cycle = 0; + + wf_op("\n// %s\n", current_op->op_name); + wf_op("case 0x%.4X:\n", op & 0xFFFF); + wf_op("{\n"); + if (v & GEN_ADR) wf_op("\tu32 adr;\n"); + if (v & GEN_RES) wf_op("\tu32 res;\n"); + if (v & GEN_DST) wf_op("\tu32 dst;\n"); + if (v & GEN_SRC) wf_op("\tu32 src;\n"); +} + +static void add_CCnt(u32 cycle) +{ + wf_op("\ttimestamp += %d;\n", cycle); +} + +static void adds_CCnt(const char *str) +{ + wf_op("\ttimestamp += %s;\n", str); +} + +static void fterminate_op(u32 cycle) +{ + wf_op("}\n"); + wf_op("timestamp += %d;\n", current_cycle + cycle); + wf_op("goto C68k_Exec_End;\n"); +} + +static void quick_terminate_op(u32 cycle) +{ + wf_op("\tRET(%d)\n", current_cycle + cycle); +} + +static void terminate_op(u32 cycle) +{ + wf_op("}\n"); + wf_op("RET(%d)\n", current_cycle + cycle); +} +#include + +static void IO_CTHULHU(char *test_string) //int evil_babies) +{ + int numb = 0; + int evil_babies = 0; + char *rs; + + if((rs = strstr(test_string, "_BYTE_"))) + { + evil_babies = 4; + numb = 8; + } + else if((rs = strstr(test_string, "_WORD_"))) + { + evil_babies = 4; + numb = 16; + } + else if((rs = strstr(test_string, "_LONG_"))) + { + evil_babies = 8; + numb = 32; + } + + if(!evil_babies) + { + //printf("%d %s\n", evil_babies, test_string); + return; + } + + if(current_cycle < evil_babies) + { + //puts("Too many clowns!"); + return; + } + + // assert(current_cycle >= 4); + //wf_op("\tCCnt -= %d;\n", current_cycle - 2); + //current_cycle = 2; + + rs[3] = 'a'; + rs[4] = 't'; + //sprintf(&rs[1], "NT%02d", numb); + + current_cycle -= evil_babies; + if(current_cycle) + { + wf_op("\ttimestamp += %d;\n", current_cycle); + current_cycle = 0; + } +} + +static void mem_op(const char* fmt, ...) +{ + static char lovelykoala[262144]; + va_list args; + + if (opcode_file == NULL) return; + +// va_start(args, fmt); +// vfprintf(opcode_file, fmt, args); +// va_end(args); + + va_start(args, fmt); + //vsnprintf(lovelykoala, sizeof(lovelykoala), fmt, args); + vsprintf(lovelykoala, fmt, args); + va_end(args); + + IO_CTHULHU(lovelykoala); + fwrite(lovelykoala, strlen(lovelykoala), 1, opcode_file); +} + +// flag emitter function +///////////////////////// + +static void set_logic_flag() +{ + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_V = 0;\n"); + wf_op("\tCPU->flag_notZ = res;\n"); + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = res;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_N = res >> 8;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_logicl_flag() +{ + wf_op("\tCPU->flag_C = 0;\n"); + wf_op("\tCPU->flag_V = 0;\n"); + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = res;\n"); + wf_op("\tCPU->flag_notZ = res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_notZ = res & 0xFFFF;\n"); + wf_op("\tCPU->flag_N = res >> 8;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_add_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_V = (src ^ res) & (dst ^ res);\n"); + wf_op("\tCPU->flag_notZ = res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ = res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23;\n"); + wf_op("\tCPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_addx_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_V = (src ^ res) & (dst ^ res);\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = ((src ^ res) & (dst ^ res)) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ |= res;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = ((src & dst) | (~res & (src | dst))) >> 23;\n"); + wf_op("\tCPU->flag_V = ((src ^ res) & (dst ^ res)) >> 24;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_sub_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_V = (src ^ dst) & (res ^ dst);\n"); + wf_op("\tCPU->flag_notZ = res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ = res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23;\n"); + wf_op("\tCPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_subx_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_V = (src ^ dst) & (res ^ dst);\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ |= res;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23;\n"); + wf_op("\tCPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_cmp_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_N = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_V = (src ^ dst) & (res ^ dst);\n"); + wf_op("\tCPU->flag_notZ = res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ = res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_C = ((src & res) | (~dst & (src | res))) >> 23;\n"); + wf_op("\tCPU->flag_V = ((src ^ dst) & (res ^ dst)) >> 24;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_negx_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_V = res & src;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = (res & src) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ |= res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ |= res;\n"); + wf_op("\tCPU->flag_V = (res & src) >> 24;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = (src | res) >> 23;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +static void set_neg_flag() +{ + switch(current_size) + { + case SIZE_BYTE: + wf_op("\tCPU->flag_V = res & src;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res;\n"); + wf_op("\tCPU->flag_notZ = res & 0xFF;\n"); + break; + + case SIZE_WORD: + wf_op("\tCPU->flag_V = (res & src) >> 8;\n"); + wf_op("\tCPU->flag_N = CPU->flag_X = CPU->flag_C = res >> 8;\n"); + wf_op("\tCPU->flag_notZ = res & 0xFFFF;\n"); + break; + + case SIZE_LONG: + wf_op("\tCPU->flag_notZ = res;\n"); + wf_op("\tCPU->flag_V = (res & src) >> 24;\n"); + wf_op("\tCPU->flag_X = CPU->flag_C = (src | res) >> 23;\n"); + wf_op("\tCPU->flag_N = res >> 24;\n"); + break; + } +} + +char* get_cond_as_cond(u32 cond, u32 notvar) +{ + if (notvar) cond ^= 1; + + switch(cond) + { + case COND_TR: + sprintf(current_cond_char, "(1)"); + break; + + case COND_FA: + sprintf(current_cond_char, "(0)"); + break; + + case COND_HI: + sprintf(current_cond_char, "(CPU->flag_notZ && (!(CPU->flag_C & 0x100)))"); + break; + + case COND_LS: + sprintf(current_cond_char, "((!CPU->flag_notZ) || (CPU->flag_C & 0x100))"); + break; + + case COND_CC: + sprintf(current_cond_char, "(!(CPU->flag_C & 0x100))"); + break; + + case COND_CS: + sprintf(current_cond_char, "(CPU->flag_C & 0x100)"); + break; + + case COND_NE: + sprintf(current_cond_char, "(CPU->flag_notZ)"); + break; + + case COND_EQ: + sprintf(current_cond_char, "(!CPU->flag_notZ)"); + break; + + case COND_VC: + sprintf(current_cond_char, "(!(CPU->flag_V & 0x80))"); + break; + + case COND_VS: + sprintf(current_cond_char, "(CPU->flag_V & 0x80)"); + break; + + case COND_PL: + sprintf(current_cond_char, "(!(CPU->flag_N & 0x80))"); + break; + + case COND_MI: + sprintf(current_cond_char, "(CPU->flag_N & 0x80)"); + break; + + case COND_GE: + sprintf(current_cond_char, "(!((CPU->flag_N ^ CPU->flag_V) & 0x80))"); + break; + + case COND_LT: + sprintf(current_cond_char, "((CPU->flag_N ^ CPU->flag_V) & 0x80)"); + break; + + case COND_GT: + sprintf(current_cond_char, "(CPU->flag_notZ && (!((CPU->flag_N ^ CPU->flag_V) & 0x80)))"); + break; + + case COND_LE: + sprintf(current_cond_char, "((!CPU->flag_notZ) || ((CPU->flag_N ^ CPU->flag_V) & 0x80))"); + break; + } + + return current_cond_char; +} + +// effective address related function +////////////////////////////////////// + +static u32 has_ea(u32 ea) +{ + if (ea == EA_AINC7) return (current_op->ea_supported[EA_AINC] == 'o'); + if (ea == EA_ADEC7) return (current_op->ea_supported[EA_ADEC] == 'o'); + if (ea <= EA_IMM) return (current_op->ea_supported[ea] == 'o'); + return 0; +} + +static u32 has_ea2(u32 ea) +{ + if (ea == EA_AINC7) return (current_op->ea2_supported[EA_AINC] == 'o'); + if (ea == EA_ADEC7) return (current_op->ea2_supported[EA_ADEC] == 'o'); + if (ea <= EA_IMM) return (current_op->ea2_supported[ea] == 'o'); + return 0; +} + +static u32 _eamreg_to_ea(u32 eam, u32 reg) +{ + if ((eam > 7) || (reg > 7)) return EA_ILLEGAL; + if ((eam == 3) && (reg == 7)) return EA_AINC7; + if ((eam == 4) && (reg == 7)) return EA_ADEC7; + if (eam != 7) return eam; + if (reg < 5) return (eam + reg); + return EA_ILLEGAL; +} + +static u32 _ea_to_eamreg(u32 ea) +{ + if (ea < 7) return (ea << 3) | 0; + if (ea == EA_AINC7) return (EA_AINC << 3) | 7; + if (ea == EA_ADEC7) return (EA_ADEC << 3) | 7; + if (ea <= EA_IMM) return (7 << 3) | (ea - 7); + return (7 << 3) | 7; +} + +static u32 is_ea_memory(u32 ea) +{ + if ((ea > EA_AREG) && (ea != EA_IMM)) return 1; + else return 0; +} + +static void _ea_calc_free(u32 ea, u32 rsft) +{ + u32 step; + + step = 0; + switch (current_size) + { + case SIZE_BYTE: + if ((ea == EA_AINC7) || (ea == EA_ADEC7)) step = 2; + else step = 1; + break; + + case SIZE_WORD: + step = 2; + break; + + case SIZE_LONG: + step = 4; + break; + } + + switch (ea) + { + case EA_DREG: +// wf_op("\tadr = (u32)(&CPU->D[(Opcode >> %d) & 7]);\n", rsft); + break; + + case EA_AREG: +// wf_op("\tadr = (u32)(&CPU->A[(Opcode >> %d) & 7]);\n", rsft); + break; + + case EA_AIND: + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", rsft); + break; + + case EA_AINC: + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", rsft); + wf_op("\tCPU->A[(Opcode >> %d) & 7] += %d;\n", rsft, step); + break; + + case EA_AINC7: + wf_op("\tadr = CPU->A[7];\n"); + wf_op("\tCPU->A[7] += %d;\n", step); + break; + + case EA_ADEC: + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7] - %d;\n", rsft, step); + wf_op("\tCPU->A[(Opcode >> %d) & 7] = adr;\n", rsft); + break; + + case EA_ADEC7: + wf_op("\tadr = CPU->A[7] - %d;\n", step); + wf_op("\tCPU->A[7] = adr;\n"); + break; + + case EA_D16A: + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7] + (s32)(s16)FETCH_WORD;\n", rsft); + wf_op("\tPC += 2;\n"); + break; + + case EA_D8AX: + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", rsft); + wf_op("\tDECODE_EXT_WORD\n"); + break; + + case EA_A16: + wf_op("\tadr = (s32)(s16)FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + break; + + case EA_A32: + wf_op("\tadr = (s32)FETCH_LONG;\n"); + wf_op("\tPC += 4;\n"); + break; + + case EA_D16P: + wf_op("\tadr = PC + (s32)(s16)FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + break; + + case EA_D8PX: + wf_op("\tadr = PC;\n"); + wf_op("\tDECODE_EXT_WORD\n"); + break; + } +} + +static void _ea_calc(u32 ea, u32 rsft) +{ + u32 step; + u32 cycle_sft; + + step = 0; + cycle_sft = 0; + switch (current_size) + { + case SIZE_BYTE: + if ((ea == EA_AINC7) || (ea == EA_ADEC7)) step = 2; + else step = 1; + break; + + case SIZE_WORD: + step = 2; + break; + + case SIZE_LONG: + cycle_sft = 1; + step = 4; + break; + } + + switch (ea) + { + case EA_DREG: +// wf_op("\tadr = (u32)(&CPU->D[(Opcode >> %d) & 7]);\n", rsft); + break; + + case EA_AREG: +// wf_op("\tadr = (u32)(&CPU->A[(Opcode >> %d) & 7]);\n", rsft); + break; + + case EA_IMM: + current_cycle += (4 << cycle_sft) + 0; + break; + + case EA_AIND: + current_cycle += (4 << cycle_sft) + 0; + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", rsft); + break; + + case EA_AINC: + current_cycle += (4 << cycle_sft) + 0; + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", rsft); + wf_op("\tCPU->A[(Opcode >> %d) & 7] += %d;\n", rsft, step); + break; + + case EA_AINC7: + current_cycle += (4 << cycle_sft) + 0; + wf_op("\tadr = CPU->A[7];\n"); + wf_op("\tCPU->A[7] += %d;\n", step); + break; + + case EA_ADEC: + current_cycle += (4 << cycle_sft) + 2; + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7] - %d;\n", rsft, step); + wf_op("\tCPU->A[(Opcode >> %d) & 7] = adr;\n", rsft); + break; + + case EA_ADEC7: + current_cycle += (4 << cycle_sft) + 2; + wf_op("\tadr = CPU->A[7] - %d;\n", step); + wf_op("\tCPU->A[7] = adr;\n"); + break; + + case EA_D16A: + current_cycle += (4 << cycle_sft) + 4; + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7] + (s32)(s16)FETCH_WORD;\n", rsft); + wf_op("\tPC += 2;\n"); + break; + + case EA_D8AX: + current_cycle += (4 << cycle_sft) + 6; + wf_op("\tadr = CPU->A[(Opcode >> %d) & 7];\n", rsft); + wf_op("\tDECODE_EXT_WORD\n"); + break; + + case EA_A16: + current_cycle += (4 << cycle_sft) + 4; + wf_op("\tadr = (s32)(s16)FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + break; + + case EA_A32: + current_cycle += (4 << cycle_sft) + 8; + wf_op("\tadr = (s32)FETCH_LONG;\n"); + wf_op("\tPC += 4;\n"); + break; + + case EA_D16P: + current_cycle += (4 << cycle_sft) + 4; + wf_op("\tadr = PC + (s32)(s16)FETCH_WORD;\n"); + wf_op("\tPC += 2;\n"); + break; + + case EA_D8PX: + current_cycle += (4 << cycle_sft) + 6; + wf_op("\tadr = PC;\n"); + wf_op("\tDECODE_EXT_WORD\n"); + break; + } +} + +static void _ea_read_(u32 ea, u32 rsft, const char* dest) +{ + char sz[8]; + + switch (current_size) + { + case SIZE_BYTE: + strcpy(sz, "BYTE"); + break; + + case SIZE_WORD: + strcpy(sz, "WORD"); + break; + + case SIZE_LONG: + strcpy(sz, "LONG"); + break; + } + + switch (ea) + { + case EA_DREG: + wf_op("\t%s = (%s)CPU->D[(Opcode >> %d) & 7];\n", dest, szc, rsft); + break; + + case EA_AREG: + if (current_size == SIZE_BYTE) + { + wf_op("\t// can't read byte from Ax registers !\n"); + wf_op("\tCPU->Status |= C68K_FAULTED;\n"); + //wf_op("\tCCnt = 0;\n"); + wf_op("\tgoto C68k_Exec_Really_End;\n"); + } + else wf_op("\t%s = (%s)CPU->A[(Opcode >> %d) & 7];\n", dest, szc, rsft); + break; + + case EA_A32: + case EA_D8AX: + case EA_D8PX: + case EA_D16A: + case EA_D16P: + case EA_A16: + case EA_ADEC: + case EA_ADEC7: + case EA_AIND: + case EA_AINC: + case EA_AINC7: + mem_op("\tREAD_%s_F(adr, %s)\n", sz, dest); + break; + + case EA_IMM: + switch (current_size) + { + case SIZE_BYTE: + wf_op("\t%s = FETCH_BYTE;\n", dest); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_WORD: + wf_op("\t%s = FETCH_WORD;\n", dest); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_LONG: + wf_op("\t%s = FETCH_LONG;\n", dest); + wf_op("\tPC += 4;\n"); + break; + } + break; + } +} + +static void _ea_read(u32 ea, u32 rsft) +{ + _ea_read_(ea, rsft, "res"); +} + +static void _ea_read_src(u32 ea, u32 rsft) +{ + _ea_read_(ea, rsft, "src"); +} + +static void _ea_read_dst(u32 ea, u32 rsft) +{ + _ea_read_(ea, rsft, "dst"); +} + +static void _ea_read_sx_(u32 ea, u32 rsft, const char *dest) +{ + char sz[8]; + + switch (current_size) + { + case SIZE_BYTE: + strcpy(sz, "BYTE"); + break; + + case SIZE_WORD: + strcpy(sz, "WORD"); + break; + + case SIZE_LONG: + strcpy(sz, "LONG"); + break; + } + + switch (ea) + { + case EA_DREG: + wf_op("\t%s = (s32)(%s)CPU->D[(Opcode >> %d) & 7];\n", dest, szcs, rsft); + break; + + case EA_AREG: + if (current_size == SIZE_BYTE) + { + wf_op("\t// can't read byte from Ax registers !\n"); + wf_op("\tCPU->Status |= C68K_FAULTED;\n"); + //wf_op("\tCCnt = 0;\n"); + wf_op("\tgoto C68k_Exec_Really_End;\n"); + } + else wf_op("\t%s = (s32)(%s)CPU->A[(Opcode >> %d) & 7];\n", dest, szcs, rsft); + break; + + case EA_A32: + case EA_D8AX: + case EA_D8PX: + case EA_D16A: + case EA_D16P: + case EA_A16: + case EA_ADEC: + case EA_ADEC7: + case EA_AIND: + case EA_AINC: + case EA_AINC7: + mem_op("\tREADSX_%s_F(adr, %s)\n", sz, dest); + break; + + case EA_IMM: + switch (current_size) + { + case SIZE_BYTE: + wf_op("\t%s = (s32)(%s(PC)));\n", dest, szcsf); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_WORD: + wf_op("\t%s = (s32)(%s)FETCH_WORD;\n", dest, szcs); + wf_op("\tPC += 2;\n"); + break; + + case SIZE_LONG: + wf_op("\t%s = (s32)(%s)FETCH_LONG;\n", dest, szcs); + wf_op("\tPC += 4;\n"); + break; + } + break; + } +} + +static void _ea_read_sx(u32 ea, u32 rsft) +{ + _ea_read_sx_(ea, rsft, "res"); +} + +static void _ea_read_src_sx(u32 ea, u32 rsft) +{ + _ea_read_sx_(ea, rsft, "src"); +} + +static void _ea_write_sarsie(u32 ea, u32 rsft, int move_pd) +{ + char sz[8]; + + switch (current_size) + { + case SIZE_BYTE: + strcpy(sz, "BYTE"); + break; + + case SIZE_WORD: + strcpy(sz, "WORD"); + break; + + case SIZE_LONG: + strcpy(sz, "LONG"); + break; + } + + if(current_size == SIZE_LONG && move_pd && (ea == EA_ADEC || ea == EA_ADEC7)) + { + mem_op("\tWRITE_LONG_DEC_F(adr, res)\n"); + } + else switch (ea) + { + case EA_DREG: + wf_op("\tMDFN_ennsb<%s, true>(%s&CPU->D[(Opcode >> %d) & 7], res);\n", szc, szcf, rsft); + break; + + case EA_AREG: + // writes in Ax registers are always 32 bits sized + wf_op("\tCPU->A[(Opcode >> %d) & 7] = res;\n", rsft); + break; + + case EA_A32: + case EA_D8AX: + case EA_D8PX: + case EA_D16A: + case EA_D16P: + case EA_A16: + case EA_ADEC: + case EA_ADEC7: + case EA_AIND: + case EA_AINC: + case EA_AINC7: + mem_op("\tWRITE_%s_F(adr, res)\n", sz); + break; + } +} + +static void _ea_write(u32 ea, u32 rsft) +{ + _ea_write_sarsie(ea, rsft, 0); +} + +// misc function +///////////////// + +static u32 get_current_opcode_base() +{ + u32 base; + + base = current_op->op_base; + if (current_op->eam_sft != -1) base += (current_eam & 7) << current_op->eam_sft; + if (current_op->reg_sft != -1) base += (current_reg & 7) << current_op->reg_sft; + if (current_op->eam2_sft != -1) base += (current_eam2 & 7) << current_op->eam2_sft; + if (current_op->reg2_sft != -1) base += (current_reg2 & 7) << current_op->reg2_sft; + if (current_op->size_type == 1) base += (current_size - 1) << current_op->size_sft; + else if (current_op->size_type == 2) base += (current_size & 3) << current_op->size_sft; + + return base; +} + +static void start_all(int v) +{ + u32 base; + + base = get_current_opcode_base(); + + // generate jump table + gen_opjumptable(base); + + // generate label & declarations + start_op(base, v); +} + +static void set_current_size(u32 sz) +{ + current_size = sz; + switch(current_size) + { + case SIZE_BYTE: + current_bits_mask = 0xFF; + current_sft_mask = 7; + strcpy(szc, "u8"); + strcpy(szcf, "BYTE_OFF + (u8*)"); + strcpy(szcs, "s8"); + strcpy(szcsf, "*(BYTE_OFF + (s8*)"); + break; + + case SIZE_WORD: + current_bits_mask = 0xFFFF; + current_sft_mask = 15; + strcpy(szc, "u16"); + strcpy(szcf, "WORD_OFF + (u16*)"); + strcpy(szcs, "s16"); + strcpy(szcsf, "*(WORD_OFF + (s16*)"); + break; + + case SIZE_LONG: + current_bits_mask = 0xFFFFFFFF; + current_sft_mask = 31; + strcpy(szc, "u32"); + strcpy(szcf, "(u32*)"); + strcpy(szcs, "s32"); + strcpy(szcsf, "*((s32*)"); + break; + } +} + +// gen privilege exception (happen when S flag is not set) +static void gen_privilege_exception(const char *pre) +{ + // swap A7 and USP (because S not set) + wf_op("%sres = CPU->USP;\n", pre); + wf_op("%sCPU->USP = CPU->A[7];\n", pre); + wf_op("%sCPU->A[7] = res;\n", pre); + + // get vector & add cycle + wf_op("%sres = C68K_PRIVILEGE_VIOLATION_EX;\n", pre); + adds_CCnt("c68k_exception_cycle_table[res]"); + + // we will do some mem/io access + // do_pre_io(); + + // push PC and SR + mem_op("%sPUSH_32_F(PC)\n", pre); + mem_op("%sPUSH_16_F(GET_SR)\n", pre); + + // adjust SR + wf_op("%sCPU->flag_S = C68K_SR_S;\n", pre); + + // fetch new PC + mem_op("%sREAD_LONG_F(res * 4, PC)\n", pre); + wf_op("%sSET_PC(PC)\n", pre); +} + +static void gen_exception(const char *pre, const char* exception) +{ + // swap A7 and USP if needed + wf_op("%sif (!CPU->flag_S)\n", pre); + wf_op("%s{\n", pre); + wf_op("%s\tres = CPU->USP;\n", pre); + wf_op("%s\tCPU->USP = CPU->A[7];\n", pre); + wf_op("%s\tCPU->A[7] = res;\n", pre); + wf_op("%s}\n", pre); + + // get vector & add cycle + wf_op("%sres = %s;\n", pre, exception); + adds_CCnt("c68k_exception_cycle_table[res]"); + + // we will do some mem/io access + // do_pre_io(); + + // push PC and SR + mem_op("%sPUSH_32_F(PC)\n", pre); + mem_op("%sPUSH_16_F(GET_SR)\n", pre); + + // adjust SR + wf_op("%sCPU->flag_S = C68K_SR_S;\n", pre); + + // fetch new PC + mem_op("%sREAD_LONG_F(res * 4, PC)\n", pre); + wf_op("%sSET_PC(PC)\n", pre); +} + diff --git a/Mednafen/mednafen/hw_cpu/huc6280/dis6280.cpp b/Mednafen/mednafen/hw_cpu/huc6280/dis6280.cpp new file mode 100644 index 0000000000..befa8583ec --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/huc6280/dis6280.cpp @@ -0,0 +1,470 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "dis6280.h" + +Dis6280::Dis6280(void) +{ + +} + +Dis6280::~Dis6280() +{ + +} + +uint8 Dis6280::Read(uint16 A) +{ + return(0); +} + +uint8 Dis6280::GetX(void) +{ + return(0); +} + +uint8 Dis6280::GetY(void) +{ + return(0); +} + + +static const char *fstrings[20]= +{ + "#$%02X", // immediate + "$%04X", // RELATIVE(jump) + "$%02X", // Z + "$%02X,X", // Z,x + "$%02X,Y", // Z,y + "$%04X", //ABS + "$%04X,X", // ABS,x + "$%04X,Y", // ABS,y + "($%02X)", // IND + "($%02X,X)", // INX + "($%02X),Y", // INY + "", // IMP + + // Here come the really fubar(as far as 6502-goes) modes: + "$%04X, $%04X, $%04X", // BMT + "#$%02X, $%02X", // IMM ZP + "#$%02X, $%02X, X", // IMM ZP, X + "#$%02X, $%04X", // IMM ABS + "#$%02X, $%04X, X", // IMM ABS, X + "$%02X, $%04X", // ZP REL + + + "($%04X)", // JMP indirect + "($%04X, X)", // JMP indirect X +}; + +static const int flengths[20]={1,1,1,1,1,2,2,2,1,1,1,0, 6, 2, 2, 3, 3, 2, 2, 2}; + +#define IMD(x) ((0<<16)|x) +#define REL(x) ((1<<16)|x) +#define ZP(x) ((2<<16)|x) +#define ZPX(x) ((3<<16)|x) +#define ZPY(x) ((4<<16)|x) +#define ABS(x) ((5<<16)|x) +#define ABX(x) ((6<<16)|x) +#define ABY(x) ((7<<16)|x) +#define IND(x) ((8<<16)|x) +#define INX(x) ((9<<16)|x) +#define INY(x) ((10<<16)|x) +#define IMP(x) ((11<<16)|x) +#define BMT(x) ((12<<16)|x) +#define IMDZP(x) ((13 << 16)|x) +#define IMDZPX(x) ((14 << 16)|x) +#define IMDABS(x) ((15 << 16)|x) +#define IMDABX(x) ((16 << 16)|x) +#define ZPREL(x) ((17 << 16)|x) +#define JMPIND(x) ((18 << 16)|x) +#define JMPINDX(x) ((19 << 16)|x) + +typedef struct { + const char *name; + int type; /* 1 for read, 2 for write, 3 for r then write. */ + int32 modes[11]; +} OPS; + +#define NUMOPS 117 +static OPS optable[NUMOPS]= +{ + {"TST",1,{IMDZP(0x83),IMDZPX(0xA3),IMDABS(0x93),IMDABX(0xb3),-1}}, + + {"BRK",0,{IMP(0x00),-1}}, + {"RTI",0,{IMP(0x40),-1}}, + {"RTS",0,{IMP(0x60),-1}}, + + {"PHA",2,{IMP(0x48),-1}}, + {"PHP",2,{IMP(0x08),-1}}, + {"PHX",2,{IMP(0xDA),-1}}, + {"PHY",2,{IMP(0x5A),-1}}, + + {"PLA",1,{IMP(0x68),-1}}, + {"PLP",1,{IMP(0x28),-1}}, + {"PLX",1,{IMP(0xFA),-1}}, + {"PLY",1,{IMP(0x7A),-1}}, + + {"JMP",0,{ABS(0x4C),JMPIND(0x6C),JMPINDX(0x7C),-1}}, + {"JSR",0,{ABS(0x20),-1}}, + + {"SAX",0,{IMP(0x22),-1}}, + {"SAY",0,{IMP(0x42),-1}}, + {"SXY",0,{IMP(0x02),-1}}, + + {"TAX",0,{IMP(0xAA),-1}}, + {"TXA",0,{IMP(0x8A),-1}}, + {"TAY",0,{IMP(0xA8),-1}}, + {"TYA",0,{IMP(0x98),-1}}, + {"TSX",0,{IMP(0xBA),-1}}, + {"TXS",0,{IMP(0x9A),-1}}, + + {"TMA",0,{IMD(0x43),-1}}, + {"TAM",0,{IMD(0x53),-1}}, + + {"ST0",0,{IMD(0x03),-1}}, + {"ST1",0,{IMD(0x13),-1}}, + {"ST2",0,{IMD(0x23),-1}}, + + {"TII",3,{BMT(0x73),-1}}, + {"TDD",3,{BMT(0xC3),-1}}, + {"TIN",3,{BMT(0xD3),-1}}, + {"TIA",3,{BMT(0xE3),-1}}, + {"TAI",3,{BMT(0xF3),-1}}, + + {"DEX",0,{IMP(0xCA),-1}}, + {"DEY",0,{IMP(0x88),-1}}, + {"INX",0,{IMP(0xE8),-1}}, + {"INY",0,{IMP(0xC8),-1}}, + {"CLC",0,{IMP(0x18),-1}}, + {"CLD",0,{IMP(0xD8),-1}}, + {"CLI",0,{IMP(0x58),-1}}, + {"CLV",0,{IMP(0xB8),-1}}, + {"SEC",0,{IMP(0x38),-1}}, + {"SED",0,{IMP(0xF8),-1}}, + {"SEI",0,{IMP(0x78),-1}}, + {"NOP",0,{IMP(0xEA),-1}}, + {"SET",0,{IMP(0xF4),-1}}, + + + {"ASL",1,{IMP(0x0a),ZP(0x06),ZPX(0x16),ABS(0x0E),ABX(0x1E),-1}}, + + {"DEC",3,{IMP(0x3A), ZP(0xc6),ZPX(0xd6),ABS(0xcE),ABX(0xdE),-1}}, + + {"INC",3,{IMP(0x1A),ZP(0xe6),ZPX(0xf6),ABS(0xeE),ABX(0xfE),-1}}, + + {"LSR",3,{IMP(0x4a),ZP(0x46),ZPX(0x56),ABS(0x4E),ABX(0x5E),-1}}, + + {"ROL",3,{IMP(0x2a),ZP(0x26),ZPX(0x36),ABS(0x2E),ABX(0x3E),-1}}, + + {"ROR",3,{IMP(0x6a),ZP(0x66),ZPX(0x76),ABS(0x6E),ABX(0x7E),-1}}, + + {"ADC",1,{IMD(0x69),ZP(0x65),ZPX(0x75),ABS(0x6D),ABX(0x7d),ABY(0x79), + IND(0x72), INX(0x61),INY(0x71),-1}}, + + {"AND",1,{IMD(0x29),ZP(0x25),ZPX(0x35),ABS(0x2D),ABX(0x3d),ABY(0x39), + IND(0x32), INX(0x21),INY(0x31),-1}}, + + {"BIT",1,{IMD(0x89),ZP(0x24),ZPX(0x34),ABS(0x2c),ABX(0x3C),-1}}, + + {"CMP",1,{IMD(0xc9),ZP(0xc5),ZPX(0xd5),ABS(0xcD),ABX(0xdd),ABY(0xd9), + IND(0xD2), INX(0xc1),INY(0xd1),-1}}, + + {"CPX",1,{IMD(0xe0),ZP(0xe4),ABS(0xec),-1}}, + + {"CPY",1,{IMD(0xc0),ZP(0xc4),ABS(0xcc),-1}}, + + {"EOR",1,{IMD(0x49),ZP(0x45),ZPX(0x55),ABS(0x4D),ABX(0x5d),ABY(0x59), + IND(0x52), INX(0x41),INY(0x51),-1}}, + + {"LDA",1,{IMD(0xa9),ZP(0xa5),ZPX(0xb5),ABS(0xaD),ABX(0xbd),ABY(0xb9), + IND(0xb2), INX(0xa1),INY(0xb1),-1}}, + + {"LDX",1,{IMD(0xa2),ZP(0xa6),ZPY(0xB6),ABS(0xae),ABY(0xbe),-1}}, + + {"LDY",1,{IMD(0xa0),ZP(0xa4),ZPX(0xB4),ABS(0xac),ABX(0xbc),-1}}, + + {"ORA",1,{IMD(0x09),ZP(0x05),ZPX(0x15),ABS(0x0D),ABX(0x1d),ABY(0x19), + IND(0x12),INX(0x01),INY(0x11),-1}}, + + {"SBC",1,{IMD(0xe9),ZP(0xe5),ZPX(0xf5),ABS(0xeD),ABX(0xfd),ABY(0xf9), + IND(0xf2),INX(0xe1),INY(0xf1),-1}}, + + {"STA",2,{ZP(0x85),ZPX(0x95),ABS(0x8D),ABX(0x9d),ABY(0x99), + IND(0x92),INX(0x81),INY(0x91),-1}}, + + {"STX",2,{ZP(0x86),ZPY(0x96),ABS(0x8E),-1}}, + + {"STY",2,{ZP(0x84),ZPX(0x94),ABS(0x8C),-1}}, + + + {"STZ",2,{ZP(0x64),ZPX(0x74),ABS(0x9C),ABX(0x9E),-1}}, + + {"TRB",3,{ZP(0x14),ABS(0x1C),-1}}, + + {"TSB",3,{ZP(0x04),ABS(0x0c),-1}}, + + {"BBR0",1,{ZPREL(0x0F), -1}}, + {"BBR1",1,{ZPREL(0x1F), -1}}, + {"BBR2",1,{ZPREL(0x2F), -1}}, + {"BBR3",1,{ZPREL(0x3F), -1}}, + {"BBR4",1,{ZPREL(0x4F), -1}}, + {"BBR5",1,{ZPREL(0x5F), -1}}, + {"BBR6",1,{ZPREL(0x6F), -1}}, + {"BBR7",1,{ZPREL(0x7F), -1}}, + + {"BBS0",1,{ZPREL(0x8F), -1}}, + {"BBS1",1,{ZPREL(0x9F), -1}}, + {"BBS2",1,{ZPREL(0xAF), -1}}, + {"BBS3",1,{ZPREL(0xBF), -1}}, + {"BBS4",1,{ZPREL(0xCF), -1}}, + {"BBS5",1,{ZPREL(0xDF), -1}}, + {"BBS6",1,{ZPREL(0xEF), -1}}, + {"BBS7",1,{ZPREL(0xFF), -1}}, + + {"CLA",1,{IMP(0x62),-1}}, + {"CLX",1,{IMP(0x82),-1}}, + {"CLY",1,{IMP(0xC2),-1}}, + + {"CSL",1,{IMP(0x54),-1}}, + {"CSH",1,{IMP(0xD4),-1}}, + + {"RMB0",3,{ZP(0x07), -1}}, + {"RMB1",3,{ZP(0x17), -1}}, + {"RMB2",3,{ZP(0x27), -1}}, + {"RMB3",3,{ZP(0x37), -1}}, + {"RMB4",3,{ZP(0x47), -1}}, + {"RMB5",3,{ZP(0x57), -1}}, + {"RMB6",3,{ZP(0x67), -1}}, + {"RMB7",3,{ZP(0x77), -1}}, + + {"SMB0",3,{ZP(0x87), -1}}, + {"SMB1",3,{ZP(0x97), -1}}, + {"SMB2",3,{ZP(0xa7), -1}}, + {"SMB3",3,{ZP(0xb7), -1}}, + {"SMB4",3,{ZP(0xc7), -1}}, + {"SMB5",3,{ZP(0xd7), -1}}, + {"SMB6",3,{ZP(0xe7), -1}}, + {"SMB7",3,{ZP(0xf7), -1}}, + + {"BRA",1,{REL(0x80),-1}}, + + {"BSR",1,{REL(0x44),-1}}, + + {"BCC",1,{REL(0x90),-1}}, + + {"BCS",1,{REL(0xb0),-1}}, + + {"BEQ",1,{REL(0xf0),-1}}, + + {"BNE",1,{REL(0xd0),-1}}, + + {"BMI",1,{REL(0x30),-1}}, + + {"BPL",1,{REL(0x10),-1}}, + + {"BVC",1,{REL(0x50),-1}}, + + {"BVS",1,{REL(0x70),-1}}, + +}; + +void Dis6280::Disassemble(uint16 &a, uint16 SpecialA, char *stringo) +{ + uint8 buf; + uint64 arg; + int32 info; + int op_index; + int y; + + info=-1; + + buf=Read(a); + a++; + + for(op_index=0; op_index < NUMOPS; op_index++) + { + y=0; + while(optable[op_index].modes[y]>=0) + { + if((optable[op_index].modes[y]&0xFF)==buf) + { + info=optable[op_index].modes[y]; + goto endy; + } + y++; + } + } + + endy: + stringo[0] = 0; + if(info>=0) + { + int z=flengths[(info>>16)]; + bool borked = 0; + int pow = 0; + uint64 arg_orig; + + arg_orig = arg = 0; + + if(z) + { + for(pow = 0; pow < z; pow++) + { + if(a == SpecialA) + { + borked = 1; + break; + } + uint8 rb = Read(a); + arg |= (uint64)rb << (pow * 8); + a++; + } + arg_orig = arg; + if((info>>16)==1) /* Relative branch */ + arg = (a + (char)arg) & 0xFFFF; + + if(borked) + strcat(stringo, "--------"); + else + { + sprintf(stringo+strlen(stringo),"%s ",optable[op_index].name); + + if((info>>16) < 12 || (info >> 16) == 18 || (info >> 16) == 19) // ...or JMP indirect + sprintf(stringo+strlen(stringo), fstrings[info>>16], (unsigned int)arg); + + //"$04X, $04X, $04X", // BMT + //"#$02X, $%02X", // IMM ZP + //"#$02X, $%02X, X", // IMM ZP, X + //"#$02X, $%04X", // IMM ABS + //"#$02X, $%04X, X", // IMM ABS, X + //"$02X, #$%02X", // ZP REL + + //#define BMT(x) ((12<<16)|x) + //#define IMDZP(x) ((13 << 16)|x) + //#define IMDZPX(x) ((14 << 16)|x) + //#define IMDABS(x) ((15 << 16)|x) + //#define IMDABX(x) ((16 << 16)|x) + //#define ZPREL(x) ((17 << 16)|x) + + unsigned int tmp; + switch(info>>16) + { + case 12: + sprintf(stringo + strlen(stringo), fstrings[info >> 16], (unsigned int)(arg & 0xFFFF), (unsigned int)((arg >> 16) & 0xFFFF), + (unsigned int)((arg >> 32) & 0xFFFF)); + break; + case 16: + case 15: + case 14: + case 13: + sprintf(stringo + strlen(stringo), fstrings[info >> 16], (unsigned int)(arg & 0xFF), (unsigned int)((arg >> 8) & 0xFFFF)); + break; + case 17: + sprintf(stringo + strlen(stringo), fstrings[info >> 16], (unsigned int)(arg & 0xFF), (a + (char)((arg >> 8) & 0xFF)) & 0xFFFF); + sprintf(stringo + strlen(stringo), " @ $%04X = $%02X", (unsigned int)(arg & 0xFF) + 0x2000, Read((arg & 0xFF) + 0x2000)); + break; + case 2:tmp = arg + 0x2000; + if(optable[op_index].type&1) + { + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + } + break; + case 3:tmp=0x2000 + ((arg+GetX())&0xff); + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 4:tmp=0x2000 + ((arg+GetY())&0xff); + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 5:tmp=arg; + if(optable[op_index].type&1) + { + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + } + break; + case 6:tmp=(arg+GetX())&0xffff; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 7:tmp=(arg+GetY())&0xffff; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 8: // Indirect + tmp = (arg&0xFF); + tmp=Read(0x2000 + tmp) | (Read(0x2000 + ((tmp+1)&0xFF))<<8); + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 18: // JMP indirect + tmp=Read(arg)|(Read((arg+1)&0xffff)<<8); + sprintf(stringo+strlen(stringo)," $%04X",tmp); + break; + case 19: // JMP indirect, X + { + uint16 tmp_addr = arg + GetX(); + + tmp = Read(tmp_addr) | (Read((tmp_addr + 1) & 0xFFFF) << 8); + sprintf(stringo+strlen(stringo)," $%04X",tmp); + } + break; + case 9:tmp = ((arg+GetX())&0xFF); + tmp=Read(0x2000 + tmp) | (Read(0x2000 + ((tmp+1)&0xFF))<<8); + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + case 10: + tmp = Read(0x2000 + arg) | (Read(0x2000 + ((arg+1)&0xFF))<<8); + tmp=(tmp+GetY())&0xFFFF; + sprintf(stringo+strlen(stringo)," @ $%04X",tmp); + if(optable[op_index].type&1) + sprintf(stringo+strlen(stringo)," = $%02X",Read(tmp)); + break; + + } + } + } + else + { + strcat(stringo,optable[op_index].name); + } + + for(int x = strlen(stringo); x < 30; x++) + { + stringo[x] = ' '; + stringo[x + 1] = 0; + } + sprintf(stringo+strlen(stringo),";%02X ", buf); + + for(int x = 0; x < pow; x++) + sprintf(stringo + strlen(stringo), (pow > 4) ? "%02X" : "%02X ", (unsigned int)((arg_orig >> x * 8) & 0xFF)); + } + else + sprintf(stringo+strlen(stringo),".db $%02X ;%02X", buf, buf); + +} diff --git a/Mednafen/mednafen/hw_cpu/huc6280/dis6280.h b/Mednafen/mednafen/hw_cpu/huc6280/dis6280.h new file mode 100644 index 0000000000..691f407db4 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/huc6280/dis6280.h @@ -0,0 +1,14 @@ +class Dis6280 +{ + public: + Dis6280(void); + ~Dis6280(); + + virtual uint8 Read(uint16 A); + virtual uint8 GetX(void); + virtual uint8 GetY(void); + + void Disassemble(uint16 &a, uint16 SpecialA, char *); + + private: +}; diff --git a/Mednafen/mednafen/hw_cpu/huc6280/huc6280.cpp b/Mednafen/mednafen/hw_cpu/huc6280/huc6280.cpp new file mode 100644 index 0000000000..906418851f --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/huc6280/huc6280.cpp @@ -0,0 +1,786 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Major organizational differences compared to real HuC6280: + PSG emulation is in a completely separate file and class. + + Timer and IRQ read/write handlers are called externally from the main(external) PC Engine I/O page memory handler function, for + speed reasons. + + Bus cycle extension on VDC and VCE access is simulated/handled in the main(external) PC Engine I/O page memory handler function, for + speed reasons. + + Input port emulation is done externally. +*/ + +#include +#include "huc6280.h" + +#include + +#ifdef WANT_DEBUGGER + #include +#endif + +#define LASTCYCLE /*assert(((P & I_FLAG) ? 0 : (uint32)~0) == PIMaskCache);*/ IRQSample = (IRQlow & IRQMask) & PIMaskCache; IFlagSample = P & I_FLAG; ADDCYC(1); + +void HuC6280::StealCycle(void) +{ + ADDCYC(1); +} + +void HuC6280::StealCycles(const int count) +{ + ADDCYC(count); +} + +void HuC6280::StealMasterCycles(const int count) +{ + ADDCYC_MASTER(count); +} + +void HuC6280::FlushMPRCache(void) +{ + for(int x = 0; x < 9; x++) + SetMPR(x, MPR[x & 0x7]); +} + +INLINE void HuC6280::PUSH(const uint8 V) +{ + WrMem(0x2100 | S, V); + S--; +} + +INLINE uint8 HuC6280::POP(void) +{ + S++; + + return(RdMem(0x2100 | S)); +} + +static uint8 ZNTable[256]; +/* Some of these operations will only make sense if you know what the flag + constants are. */ + +INLINE void HuC6280::X_ZN(const uint8 zort) +{ + P &= ~(Z_FLAG|N_FLAG); + P |= ZNTable[zort]; +} + +INLINE void HuC6280::X_ZNT(const uint8 zort) +{ + P |= ZNTable[zort]; +} + +template +INLINE void HuC6280::JR(const bool cond, const bool BBRS) +{ + if(cond) + { + int32 disp; + disp=(int8)RdOp(PC); + PC++; + ADDCYC(3); + PC+=disp; + + if(DebugMode && ADDBT) + ADDBT(PC - disp - 2 - (BBRS ? 1 : 0), PC, 0); + } + else + { + ADDCYC(1); + PC++; + } + LASTCYCLE; +} + +template +INLINE void HuC6280::BBRi(const uint8 val, const unsigned int bitto) +{ + JR(!(val & (1 << bitto)), true); +} + +template +INLINE void HuC6280::BBSi(const uint8 val, const unsigned int bitto) +{ + JR(val & (1 << bitto), true); +} + +// Total cycles for ST0/ST1/ST2 is effectively 5(4 here, +1 stealcycle in the PC Engine memory handler logic) +#define ST0 { ADDCYC(3); LASTCYCLE; WrMemPhysical(0x80000000 | (0xFF * 8192 + 0), x); } +#define ST1 { ADDCYC(3); LASTCYCLE; WrMemPhysical(0x80000000 | (0xFF * 8192 + 2), x); } +#define ST2 { ADDCYC(3); LASTCYCLE; WrMemPhysical(0x80000000 | (0xFF * 8192 + 3), x); } + +#define LDA A=x;X_ZN(A) +#define LDX X=x;X_ZN(X) +#define LDY Y=x;X_ZN(Y) + + +#define IMP(op) op; break; + +#define SAX { uint8 tmp = X; X = A; A = tmp; ADDCYC(2); LASTCYCLE; } +#define SAY { uint8 tmp = Y; Y = A; A = tmp; ADDCYC(2); LASTCYCLE; } +#define SXY { uint8 tmp = X; X = Y; Y = tmp; ADDCYC(2); LASTCYCLE; } + +#define TAX { X = A; X_ZN(A); ADDCYC(1); LASTCYCLE; } +#define TXA { A = X; X_ZN(A); ADDCYC(1); LASTCYCLE; } +#define TAY { Y = A; X_ZN(A); ADDCYC(1); LASTCYCLE; } +#define TYA { A = Y; X_ZN(A); ADDCYC(1); LASTCYCLE; } +#define TSX { X = S; X_ZN(X); ADDCYC(1); LASTCYCLE; } +#define TXS { S = X; ADDCYC(1); LASTCYCLE; } + +#define DEX { X--; X_ZN(X); ADDCYC(1); LASTCYCLE; } +#define DEY { Y--; X_ZN(Y); ADDCYC(1); LASTCYCLE; } +#define INX { X++; X_ZN(X); ADDCYC(1); LASTCYCLE; } +#define INY { Y++; X_ZN(Y); ADDCYC(1); LASTCYCLE; } + + + +// Combined cycle total of TPREFIX and TPOSTFIX must be 3. +// WARNING: LASTCYCLE is called twice in instructions that make use TPREFIX/TPOSTFIX, so allow for that in the LASTCYCLE +// macro! +#define TPREFIX { uint8 Abackup = A; if(P & T_FLAG) { ADDCYC(1); A = RdMem(0x2000 + X); } +#define TPOSTFIX if(P & T_FLAG) { ADDCYC(1); WrMem(0x2000 + X, A); LASTCYCLE; A = Abackup; } } + +/* All of the freaky arithmetic operations. */ +#define AND TPREFIX; A&=x;X_ZN(A); TPOSTFIX; +#define BIT P &= ~(Z_FLAG|V_FLAG|N_FLAG); P|=ZNTable[x&A]&Z_FLAG; P|=x&(V_FLAG|N_FLAG); +#define EOR TPREFIX; A^=x;X_ZN(A); TPOSTFIX; +#define ORA TPREFIX; A|=x;X_ZN(A); TPOSTFIX; + + +// ADC and SBC in decimal mode take 1 extra CPU cycle...we'll add it by using "LASTCYCLE". So now that makes +// LASTCYCLE being called at most 3 times. Not very LASTy, is it!! +#define ADC TPREFIX; { \ + if(P & D_FLAG) \ + { \ + uint32 tmp; \ + tmp = (A & 0x0F) + (x & 0x0F) + (P & 1); \ + if(tmp >= 0x0A) \ + tmp += 0x06; \ + tmp += (A & 0xF0) + (x & 0xF0); \ + if(tmp >= 0xA0) \ + tmp += 0x60; \ + P &= ~(Z_FLAG | N_FLAG | C_FLAG); \ + if(tmp & 0xFF00) \ + P |= C_FLAG; \ + A = tmp; \ + X_ZNT(A); \ + LASTCYCLE; \ + } \ + else \ + { \ + uint32 l=A+x+(P&1); \ + P&=~(Z_FLAG|C_FLAG|N_FLAG|V_FLAG); \ + P|=((((A^x)&0x80)^0x80) & ((A^l)&0x80))>>1; \ + P|=(l>>8)&C_FLAG; \ + A=l; \ + X_ZNT(A); \ + } \ + } TPOSTFIX; + +#define SBC if(P & D_FLAG) \ + { \ + const uint8 m = (A & 0xF) - (x & 0xF) - ((P & 1) ^ 1); \ + const uint8 n = (A >> 4) - (x >> 4) - ((m >> 4) & 1); \ + uint8 res = (n << 4) | (m & 0xF); \ + P &= ~(Z_FLAG | N_FLAG | C_FLAG); \ + if(m & 0x10) \ + res -= 0x06; \ + if(n & 0x10) \ + res -= 0x60; \ + A = res; \ + P |= ((n >> 4) & 0x1) ^ 1; \ + X_ZNT(A); \ + LASTCYCLE; \ + } else { \ + uint32 l=A-x-((P&1)^1); \ + P&=~(Z_FLAG|C_FLAG|N_FLAG|V_FLAG); \ + P|=((A^l)&(A^x)&0x80)>>1; \ + P|=((l>>8)&C_FLAG)^C_FLAG; \ + A=l; \ + X_ZNT(A); \ + } + +#define CMPL(a1,a2) { \ + uint32 t=a1-a2; \ + X_ZN(t&0xFF); \ + P&=~C_FLAG; \ + P|=((t>>8)&C_FLAG)^C_FLAG; \ + } + +#define TAM for(int i = 0; i < 8; i ++) { \ + if(x & (1 << i)) \ + { \ + SetMPR(i, A); \ + } \ + } SetMPR(8, MPR[0]); \ + ADDCYC(4); \ + LASTCYCLE; + +#define TMA for(int i = 0; i < 8; i ++) { \ + if(x & (1 << i)) \ + A = MPR[i]; \ + } \ + ADDCYC(3); \ + LASTCYCLE; + +// Note: CSL/CSH's speed timing changes take effect for the last CPU cycle of CSL/CSH. Be cautious +// not to change the order here: +#define CSL { /*printf("CSL: %04x\n", PC);*/ ADDCYC(2); speed = 0; REDOSPEEDCACHE(); LASTCYCLE; } +#define CSH { /*printf("CSH: %04x\n", PC);*/ ADDCYC(2); speed = 1; REDOSPEEDCACHE(); LASTCYCLE; } + +#define RMB(bitto) x &= ~(1 << (bitto & 7)) +#define SMB(bitto) x |= 1 << (bitto & 7) + +#define TSB { P &= ~(Z_FLAG | V_FLAG | N_FLAG); P |= (x | A) ? 0 : Z_FLAG; P |= x & (N_FLAG | V_FLAG); x |= A; } +#define TRB { P &= ~(Z_FLAG | V_FLAG | N_FLAG); P |= (x & ~A) ? 0 : Z_FLAG; P |= x & (N_FLAG | V_FLAG); x &= ~A; } + +#define TST { P &= ~(Z_FLAG | V_FLAG | N_FLAG); P |= (x & zoomhack) ? 0: Z_FLAG; P |= x & (V_FLAG | N_FLAG); } + +#define CMP CMPL(A,x) +#define CPX CMPL(X,x) +#define CPY CMPL(Y,x) + +/* The following operations modify the byte being worked on. */ +#define DEC x--;X_ZN(x) +#define INC x++;X_ZN(x) + +#define ASL P&=~C_FLAG;P|=x>>7;x<<=1;X_ZN(x) +#define LSR P&=~(C_FLAG|N_FLAG|Z_FLAG);P|=x&1;x>>=1;X_ZNT(x) + +#define ROL { \ + uint8 l=x>>7; \ + x<<=1; \ + x|=P&C_FLAG; \ + P&=~(Z_FLAG|N_FLAG|C_FLAG); \ + P|=l; \ + X_ZNT(x); \ + } +#define ROR { \ + uint8 l=x&1; \ + x>>=1; \ + x|=(P&C_FLAG)<<7; \ + P&=~(Z_FLAG|N_FLAG|C_FLAG); \ + P|=l; \ + X_ZNT(x); \ + } + +/* Absolute */ +#define GetAB(target) \ +{ \ + target=RdOp(PC); \ + PC++; \ + target|=RdOp(PC)<<8; \ + PC++; \ +} + +/* Absolute Indexed(for reads) */ +#define GetABI(target, i) \ +{ \ + unsigned int tmp; \ + GetAB(tmp); \ + target=tmp; \ + target+=i; \ +} + +/* Zero Page */ +#define GetZP(target) \ +{ \ + target=0x2000 | RdOp(PC); \ + PC++; \ +} + +/* Zero Page Indexed */ +#define GetZPI(target,i) \ +{ \ + target=0x2000 | ((i+RdOp(PC)) & 0xFF); \ + PC++; \ +} + +/* Indirect */ +#define GetIND(target) \ +{ \ + uint8 tmp; \ + tmp=RdOp(PC); \ + PC++; \ + target=RdMem(0x2000 + tmp); \ + tmp++; \ + target|=RdMem(0x2000 + tmp)<<8; \ +} + + +/* Indexed Indirect */ +#define GetIX(target) \ +{ \ + uint8 tmp; \ + tmp=RdOp(PC); \ + PC++; \ + tmp+=X; \ + target=RdMem(0x2000 + tmp); \ + tmp++; \ + target|=RdMem(0x2000 + tmp) <<8; \ +} + +/* Indirect Indexed(for reads) */ +#define GetIY(target) \ +{ \ + unsigned int rt; \ + uint8 tmp; \ + tmp=RdOp(PC); \ + rt=RdMem(0x2000 + tmp); \ + tmp++; \ + rt|=RdMem(0x2000 + tmp)<<8; \ + target = (rt + Y); \ + PC++; \ +} + +/* Now come the macros to wrap up all of the above stuff addressing mode functions + and operation macros. Note that operation macros will always operate(redundant + redundant) on the variable "x". +*/ + +#define RMW_A(op) { uint8 x = A; op; A = x; ADDCYC(1); LASTCYCLE; break; } /* Meh... */ +#define RMW_AB(op) { unsigned int EA; uint8 x; GetAB(EA); ADDCYC(6); x=RdMem(EA); op; LASTCYCLE; WrMem(EA,x); break; } +#define RMW_ABI(reg,op) { unsigned int EA; uint8 x; GetABI(EA,reg); ADDCYC(6); x=RdMem(EA); op; LASTCYCLE; WrMem(EA,x); break; } +#define RMW_ABX(op) RMW_ABI(X,op) +#define RMW_ABY(op) RMW_ABI(Y,op) +#define RMW_ZP(op) { unsigned int EA; uint8 x; GetZP(EA); ADDCYC(5); x=RdMem(EA); op; LASTCYCLE; WrMem(EA,x); break; } +#define RMW_ZPX(op) { unsigned int EA; uint8 x; GetZPI(EA, X); ADDCYC(5); x=RdMem(EA); op; LASTCYCLE; WrMem(EA,x); break;} + +// For RMB/SMB... +#define RMW_ZP_B(op) { unsigned int EA; uint8 x; GetZP(EA); ADDCYC(5); x=RdMem(EA); ADDCYC(1); op; LASTCYCLE; WrMem(EA,x); break; } + + +// A LD_IM for complex immediate instructions that take care of cycle consumption in their operation(TAM, TMA, ST0, ST1, ST2) +#define LD_IM_COMPLEX(op) { uint8 x = RdOp(PC); PC++; op; break; } + +#define LD_IM(op) {uint8 x; x=RdOp(PC); PC++; ADDCYC(1); LASTCYCLE; op; break;} +#define LD_ZP(op) {unsigned int EA; uint8 x; GetZP(EA); ADDCYC(3); LASTCYCLE; x=RdMem(EA); op; break;} +#define LD_ZPX(op) {unsigned int EA; uint8 x; GetZPI(EA, X); ADDCYC(3); LASTCYCLE; x=RdMem(EA); op; break;} +#define LD_ZPY(op) {unsigned int EA; uint8 x; GetZPI(EA, Y); ADDCYC(3); LASTCYCLE; x=RdMem(EA); op; break;} +#define LD_AB(op) {unsigned int EA; uint8 x; GetAB(EA); ADDCYC(4); LASTCYCLE; x=RdMem(EA); op; break; } +#define LD_ABI(reg,op) {unsigned int EA; uint8 x; GetABI(EA,reg); ADDCYC(4); LASTCYCLE; x=RdMem(EA); op; break;} +#define LD_ABX(op) LD_ABI(X, op) +#define LD_ABY(op) LD_ABI(Y, op) + +#define LD_IND(op) {unsigned int EA; uint8 x; GetIND(EA); ADDCYC(6); LASTCYCLE; x=RdMem(EA); op; break;} +#define LD_IX(op) {unsigned int EA; uint8 x; GetIX(EA); ADDCYC(6); LASTCYCLE; x=RdMem(EA); op; break;} +#define LD_IY(op) {unsigned int EA; uint8 x; GetIY(EA); ADDCYC(6); LASTCYCLE; x=RdMem(EA); op; break;} + +// For the funky TST instruction +#define LD_IM_TST(op, lt) { uint8 lt = RdOp(PC); PC++; ADDCYC(3); op; } +#define LD_IM_ZP(op) LD_IM_TST(LD_ZP(TST), zoomhack); +#define LD_IM_ZPX(op) LD_IM_TST(LD_ZPX(TST), zoomhack); +#define LD_IM_AB(op) LD_IM_TST(LD_AB(TST), zoomhack); +#define LD_IM_ABX(op) LD_IM_TST(LD_ABX(TST), zoomhack); + + +#define BMT_PREFIX(pork) in_block_move = IBM_##pork; +#define BMT_LOOPCHECK(pork) if(!runrunrun) { TimerSync(); return; } continue_the_##pork: + +#define BMT_TDD BMT_PREFIX(TDD); do { ADDCYC(6); WrMem(bmt_dest, RdMem(bmt_src)); bmt_src--; bmt_dest--; BMT_LOOPCHECK(TDD); bmt_length--; } while(bmt_length); +#define BMT_TAI BMT_PREFIX(TAI); {bmt_alternate = 0; do { ADDCYC(6); WrMem(bmt_dest, RdMem(bmt_src + bmt_alternate)); bmt_dest++; bmt_alternate ^= 1; BMT_LOOPCHECK(TAI); bmt_length--; } while(bmt_length); } +#define BMT_TIA BMT_PREFIX(TIA); {bmt_alternate = 0; do { ADDCYC(6); WrMem(bmt_dest + bmt_alternate, RdMem(bmt_src)); bmt_src++; bmt_alternate ^= 1; BMT_LOOPCHECK(TIA); bmt_length--; } while(bmt_length); } +#define BMT_TII BMT_PREFIX(TII); do { ADDCYC(6); WrMem(bmt_dest, RdMem(bmt_src)); bmt_src++; bmt_dest++; BMT_LOOPCHECK(TII); bmt_length--; } while(bmt_length); +#define BMT_TIN BMT_PREFIX(TIN); do { ADDCYC(6); WrMem(bmt_dest, RdMem(bmt_src)); bmt_src++; BMT_LOOPCHECK(TIN); bmt_length--; } while(bmt_length); + +// Block memory transfer load +#define LD_BMT(op) { PUSH(Y); PUSH(A); PUSH(X); GetAB(bmt_src); GetAB(bmt_dest); GetAB(bmt_length); ADDCYC(14); op; in_block_move = 0; X = POP(); A = POP(); Y = POP(); ADDCYC(2); LASTCYCLE; break; } + +#define ST_ZP(r) {unsigned int EA; GetZP(EA); ADDCYC(3); LASTCYCLE; WrMem(EA, r); break;} +#define ST_ZPX(r) {unsigned int EA; GetZPI(EA,X); ADDCYC(3); LASTCYCLE; WrMem(EA, r); break;} +#define ST_ZPY(r) {unsigned int EA; GetZPI(EA,Y); ADDCYC(3); LASTCYCLE; WrMem(EA, r); break;} +#define ST_AB(r) {unsigned int EA; GetAB(EA); ADDCYC(4); LASTCYCLE; WrMem(EA, r); break;} +#define ST_ABI(reg,r) {unsigned int EA; GetABI(EA,reg); ADDCYC(4); LASTCYCLE; WrMem(EA,r); break; } +#define ST_ABX(r) ST_ABI(X, r) +#define ST_ABY(r) ST_ABI(Y, r) + +#define ST_IND(r) {unsigned int EA; GetIND(EA); ADDCYC(6); LASTCYCLE; WrMem(EA,r); break; } +#define ST_IX(r) {unsigned int EA; GetIX(EA); ADDCYC(6); LASTCYCLE; WrMem(EA,r); break; } +#define ST_IY(r) {unsigned int EA; GetIY(EA); ADDCYC(6); LASTCYCLE; WrMem(EA,r); break; } + +void HuC6280::Reset(void) +{ + timer_inreload = FALSE; + timer_div = 1024; + timer_load = 0; + timer_value = 0; + timer_status = 0; + in_block_move = 0; + + IRQSample = IQRESET; + IRQlow = IQRESET; +} + +HuC6280::HuC6280(const bool emulate_wai) : EmulateWAI(emulate_wai) +{ + timestamp = 0; + next_user_event = 0; + next_event = 0; + + timer_lastts = 0; + timer_inreload = 0; + timer_status = 0; + timer_value = 0; + timer_load = 0; + timer_div = 0; + + + in_block_move = 0; + isopread = 0; + + LastLogicalReadAddr = 0; + LastLogicalWriteAddr = 0; + + for(int x = 0; x < 256; x++) + { + if(!x) + ZNTable[x] = Z_FLAG; + else if (x&0x80) + ZNTable[x]=N_FLAG; + else + ZNTable[x]=0; + } + + SetCPUHook(NULL, NULL); +} + +HuC6280::~HuC6280() +{ + #if 0 + for(int op = 0; op < 256; op++) + { + printf("%02x: Nominal: %d, Real: ", op, CycTable[op]); + + for(int i = 0; i < 256; i++) + { + if(CycTimes[op][i]) + printf("%d, ", i); + } + + printf("\n"); + } + #endif +} + +void HuC6280::Power(void) +{ + IODataBuffer = 0xFF; + + IRQlow = 0; + + PC = 0; + A = 0; + X = 0; + Y = 0; + S = 0; + P = 0; + + REDOPIMCACHE(); + + for(int i = 0; i < 9; i++) + { + MPR[i] = 0; + FastPageR[i] = NULL; + } + Reset(); +} + +// TimerSync() doesn't call CalcNextEvent(), so we'll need to call it some time after TimerSync() (TimerSync() is +// used in HappySync(), TimerRead(), and TimerWrite(). +void HuC6280::TimerSync(void) +{ + int32 clocks = timestamp - timer_lastts; + + timer_div -= clocks; + + while(timer_div <= 0) + { + int32 reload_div = 1024 * 3; + + if(timer_inreload) + { + timer_value = timer_load; + reload_div = reload_div - 1; //1023; + timer_inreload = FALSE; + } + else + { + if(timer_status) + { + timer_value --; + if(timer_value < 0) + { + timer_inreload = TRUE; + reload_div = 1; + IRQBegin(IQTIMER); + } + } + } + timer_div += reload_div; + } + + timer_lastts = timestamp; +} + +void HuC6280::HappySync(void) +{ + TimerSync(); + + if(next_user_event <= 0) + next_user_event = EventHandler->Sync(timestamp); + + CalcNextEvent(); +} + +template +void HuC6280::RunSub(void) +{ + uint32 old_PC; + + if(in_block_move) + { + IBM_Dispatch: ; + switch(in_block_move) + { + default: exit(1); + case IBM_TIA: goto continue_the_TIA; + case IBM_TAI: goto continue_the_TAI; + case IBM_TDD: goto continue_the_TDD; + case IBM_TII: goto continue_the_TII; + case IBM_TIN: goto continue_the_TIN; + } + } + + do + { + #include "huc6280_step.inc" + } while(runrunrun > 0); +} + +void HuC6280::Run(bool StepMode) +{ + if(StepMode) + runrunrun = -1; // Needed so a BMT isn't interrupted. + else + runrunrun = 1; + + if(CPUHook || ADDBT) + RunSub(); + else + RunSub(); +} + +uint8 HuC6280::TimerRead(unsigned int address, bool peek) +{ + if(!peek) + { + TimerSync(); + CalcNextEvent(); + } + + return(timer_value | (IODataBuffer & 0x80)); +} + +void HuC6280::TimerWrite(unsigned int address, uint8 V) +{ + TimerSync(); + + switch(address & 1) + { + case 0: timer_load = (V & 0x7F); break; + case 1: if(V & 1) // Enable counter + { + if(timer_status == 0) + { + //if(timer_inreload) + // puts("Oops"); + timer_div = 1024 * 3; + timer_value = timer_load; + } + } + timer_status = V & 1; + break; + } + + CalcNextEvent(); +} + + +uint8 HuC6280::IRQStatusRead(unsigned int address, bool peek) +{ + if(!(address & 2)) + return(IODataBuffer); + + switch(address & 1) + { + case 0: + if(!peek) + IRQEnd(IQTIMER); + return(IRQMask ^ 0x7); + case 1: + { + int status = 0; + if(IRQlow & IQIRQ1) status |= 2; + if(IRQlow & IQIRQ2) status |= 1; + if(IRQlow & IQTIMER) status |= 4; + return(status | (IODataBuffer & ~(1 | 2 | 4))); + } + } + return(IODataBuffer); +} + +void HuC6280::IRQStatusWrite(unsigned int address, uint8 V) +{ + if(!(address & 2)) + return; + + switch(address & 1) + { + case 0: IRQMask = (V & 0x7) ^ 0x7; + break; + + case 1: IRQEnd(IQTIMER); + break; + } +} + +void HuC6280::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + uint16 tmp_PC = PC; + + SFORMAT StateRegs[]= + { + SFVAR(runrunrun), // For the benefit of save states while in step mode in the debugger. + + SFVARN(tmp_PC, "PC"), + SFVARN(A, "A"), + SFVARN(P, "P"), + SFVARN(IFlagSample, "IFlagSample"), + SFVARN(X, "X"), + SFVARN(Y, "Y"), + SFVARN(S, "S"), + + SFVARN(lastop, "lastop"), + + SFVARN(IRQSample, "IRQSample"), + SFVARN(IRQlow, "IRQlow"), + SFVARN(IRQMask, "IRQMask"), + SFARRAYN(MPR, 8, "MPR"), + SFVARN(speed, "speed"), + + SFVARN(timer_inreload, "timer_inreload"), + SFVARN(timer_status, "timer_status"), + SFVARN(timer_value, "timer_value"), + SFVARN(timer_load, "timer_load"), + SFVARN(timer_div, "timer_div"), + + SFVARN(in_block_move, "IBM"), + SFVARN(bmt_src, "IBM_SRC"), + SFVARN(bmt_dest, "IBM_DEST"), + SFVARN(bmt_length, "IBM_LENGTH"), + SFVARN(bmt_alternate, "IBM_ALTERNATE"), + + SFVARN(next_event, "next_event"), + SFVARN(next_user_event, "next_user_event"), + + SFVAR(IODataBuffer), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CPU"); + + if(load) + { + PC = tmp_PC; + + // Update MPR cache + FlushMPRCache(); + REDOSPEEDCACHE(); + REDOPIMCACHE(); + } +} + +void HuC6280::SetRegister(const unsigned int id, uint32 value) +{ + switch(id) + { + case GSREG_PC: + PC = value & 0xFFFF; + break; + + case GSREG_A: + A = value & 0xFF; + break; + + case GSREG_X: + X = value & 0xFF; + break; + + case GSREG_Y: + Y = value & 0xFF; + break; + + case GSREG_SP: + S = value & 0xFF; + break; + + case GSREG_P: + P = value & 0xFF; + REDOPIMCACHE(); + break; + + case GSREG_SPD: + speed = value & 0x01; + REDOSPEEDCACHE(); + break; + + case GSREG_MPR0: + case GSREG_MPR1: + case GSREG_MPR2: + case GSREG_MPR3: + case GSREG_MPR4: + case GSREG_MPR5: + case GSREG_MPR6: + case GSREG_MPR7: + MPR[id - GSREG_MPR0] = value & 0xFF; + FlushMPRCache(); + break; + + case GSREG_IRQM: + IRQMask = (value & 0x7) ^ 0x7; + break; + + case GSREG_TIMS: + timer_status = value & 0x1; + break; + + case GSREG_TIMV: + timer_value = value & 0x7F; + break; + + case GSREG_TIML: + timer_load = value & 0x7F; + break; + + case GSREG_TIMD: + timer_div = value & 1023; + break; + } +} diff --git a/Mednafen/mednafen/hw_cpu/huc6280/huc6280.h b/Mednafen/mednafen/hw_cpu/huc6280/huc6280.h new file mode 100644 index 0000000000..7a4632adf1 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/huc6280/huc6280.h @@ -0,0 +1,577 @@ +#ifndef __MDFN_HUC6280_H +#define __MDFN_HUC6280_H + +#include + +class HuC6280_Support +{ + public: + + INLINE HuC6280_Support(void) + { + + } + + INLINE ~HuC6280_Support() + { + + } + virtual int32 Sync(const int32 timestamp) = 0; +}; + +class HuC6280 +{ + public: + + typedef void (*writefunc)(uint32 A, uint8 V); + typedef uint8 (*readfunc)(uint32 A); + + + enum { N_FLAG = 0x80 }; + enum { V_FLAG = 0x40 }; + enum { T_FLAG = 0x20 }; + enum { B_FLAG = 0x10 }; + enum { D_FLAG = 0x08 }; + enum { I_FLAG = 0x04 }; + enum { Z_FLAG = 0x02 }; + enum { C_FLAG = 0x01 }; + + // If emulate_wai is true, then the "0xCB" opcode will be handled by waiting for the next high-level event, NOT + // for the IRQ line to be asserted as on a 65816. + // It's mainly a hack intended for less CPU-intensive HES playback. + HuC6280(const bool emulate_wai = false) MDFN_COLD; + ~HuC6280() MDFN_COLD; + + void Reset(void) MDFN_COLD; + void Power(void) MDFN_COLD; + + enum { IQIRQ1 = 0x002 }; + enum { IQIRQ2 = 0x001 }; + enum { IQTIMER = 0x004 }; + enum { IQRESET = 0x020 }; + + INLINE void IRQBegin(int w) + { + IRQlow |= w; + } + + INLINE void IRQEnd(int w) + { + IRQlow &= ~w; + } + + + void TimerSync(void); + + INLINE uint8 GetIODataBuffer(void) + { + return(IODataBuffer); + } + + INLINE void SetIODataBuffer(uint8 v) + { + IODataBuffer = v; + } + + uint8 TimerRead(unsigned int address, bool peek = FALSE); + void TimerWrite(unsigned int address, uint8 V); + + uint8 IRQStatusRead(unsigned int address, bool peek = FALSE); + void IRQStatusWrite(unsigned int address, uint8 V); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + template + void RunSub(void) NO_INLINE; + + void Run(bool StepMode = FALSE); + + INLINE void Exit(void) + { + runrunrun = 0; + } + + INLINE void SyncAndResetTimestamp(uint32 ts_base = 0) + { + TimerSync(); + + timer_lastts = ts_base; + timestamp = ts_base; + } + + INLINE bool InBlockMove(void) + { + return(in_block_move); + } + + void StealCycle(void); + void StealCycles(const int count); + void StealMasterCycles(const int count); + + void SetEvent(const int32 cycles) NO_INLINE + { + next_user_event = cycles; + CalcNextEvent(); + } + + INLINE void SetEventHandler(HuC6280_Support *new_EventHandler) + { + EventHandler = new_EventHandler; + } + + INLINE uint32 Timestamp(void) + { + return(timestamp); + } + + // + // Debugger support methods: + // + INLINE void SetCPUHook(bool (*new_CPUHook)(uint32), void (*new_ADDBT)(uint32, uint32, uint32)) + { + CPUHook = new_CPUHook; + ADDBT = new_ADDBT; + } + + INLINE void LoadShadow(const HuC6280 &state) + { + //EmulateWAI = state.EmulateWAI; + + PC = state.PC; + A = state.A; + X = state.X; + Y = state.Y; + S = state.S; + P = state.P; + + PIMaskCache = state.PIMaskCache; + + MPR[0] = state.MPR[0]; + MPR[1] = state.MPR[1]; + MPR[2] = state.MPR[2]; + MPR[3] = state.MPR[3]; + MPR[4] = state.MPR[4]; + MPR[5] = state.MPR[5]; + MPR[6] = state.MPR[6]; + MPR[7] = state.MPR[7]; + + for(int x = 0; x < 9; x++) + SetMPR(x, MPR[x & 0x7]); + + IRQlow = state.IRQlow; + IRQSample = state.IRQSample; + IFlagSample = state.IFlagSample; + + speed = state.speed; + speed_shift_cache = state.speed_shift_cache; + timestamp = state.timestamp; + + IRQMask = state.IRQMask; + + // + // + + timer_status = 0; + + next_user_event = 0x1FFFFFFF; + next_event = 0x1FFFFFFF; + + //IRQlow = 0; + //IRQSample = 0; + //IFlagSample = HuC6280::I_FLAG; + } + + enum + { + GSREG_PC = 0, + GSREG_A, + GSREG_X, + GSREG_Y, + GSREG_SP, + GSREG_P, + GSREG_MPR0, + GSREG_MPR1, + GSREG_MPR2, + GSREG_MPR3, + GSREG_MPR4, + GSREG_MPR5, + GSREG_MPR6, + GSREG_MPR7, + GSREG_SPD, + GSREG_IRQM, + GSREG_TIMS, + GSREG_TIMV, + GSREG_TIML, + GSREG_TIMD, + GSREG_STAMP + }; + + INLINE uint32 GetRegister(const unsigned int id, char *special = NULL, const uint32 special_len = 0) + { + uint32 value = 0xDEADBEEF; + + switch(id) + { + case GSREG_PC: + value = PC & 0xFFFF; + break; + + case GSREG_A: + value = A; + break; + + case GSREG_X: + value = X; + break; + + case GSREG_Y: + value = Y; + break; + + case GSREG_SP: + value = S; + break; + + case GSREG_P: + value = P; + if(special) + { + trio_snprintf(special, special_len, "N: %d, V: %d, T: %d, D: %d, I: %d, Z: %d, C: %d", (int)(bool)(value & N_FLAG), + (int)(bool)(value & V_FLAG), + (int)(bool)(value & T_FLAG), + (int)(bool)(value & D_FLAG), + (int)(bool)(value & I_FLAG), + (int)(bool)(value & Z_FLAG), + (int)(bool)(value & C_FLAG)); + } + break; + + case GSREG_SPD: + value = speed; + if(special) + { + trio_snprintf(special, special_len, "%s(%s)", speed ? "High" : "Low", speed ? "7.16MHz" : "1.79MHz"); + } + break; + + case GSREG_MPR0: + case GSREG_MPR1: + case GSREG_MPR2: + case GSREG_MPR3: + case GSREG_MPR4: + case GSREG_MPR5: + case GSREG_MPR6: + case GSREG_MPR7: + value = MPR[id - GSREG_MPR0]; + + if(special) + { + trio_snprintf(special, special_len, "0x%02X * 0x2000 = 0x%06X", value, (uint32)value * 0x2000); + } + break; + + case GSREG_IRQM: + value = IRQMask ^ 0x7; + + if(special) + { + trio_snprintf(special, special_len, "IRQ2: %s, IRQ1: %s, Timer: %s", (value & IQIRQ2) ? "Disabled" : "Enabled", + (value & IQIRQ1) ? "Disabled" : "Enabled", (value & IQTIMER) ? "Disabled" : "Enabled"); + } + break; + + case GSREG_TIMS: + value = timer_status; + + if(special) + { + trio_snprintf(special, special_len, "%s", (value & 1) ? "Enabled" : "Disabled"); + } + break; + + case GSREG_TIMV: + value = (uint8)timer_value; + break; + + case GSREG_TIML: + value = timer_load; + if(special) + { + uint32 meowval = (value + 1) * 1024; + trio_snprintf(special, special_len, "(%d + 1) * 1024 = %d; 7,159,090.90... Hz / %d = %f Hz", value, meowval, meowval, (double)7159090.909090909091 / meowval); + } + break; + + case GSREG_TIMD: + value = timer_div; + break; + + case GSREG_STAMP: + value = timestamp; + break; + } + return(value); + } + + //uint32 GetRegister(const unsigned int id, char *special = NULL, const uint32 special_len = 0); + void SetRegister(const unsigned int id, uint32 value); + + INLINE void PokePhysical(uint32 address, uint8 data, bool hl = FALSE) + { + address &= 0x1FFFFF; + + if(hl) + { + // FIXME: This is a very evil hack. + if(FastMap[address >> 13]) + FastMap[address >> 13][address] = data; + } + else + WriteMap[address >> 13](address, data); + } + + INLINE void PokeLogical(uint16 address, uint8 data, bool hl = FALSE) + { + uint8 wmpr = MPR[address >> 13]; + + PokePhysical((wmpr << 13) | (address & 0x1FFF), data, hl); + } + + INLINE uint8 PeekPhysical(uint32 address) + { + address &= 0x1FFFFF; + + return(ReadMap[address >> 13](address)); + } + + INLINE uint8 PeekLogical(uint16 address) + { + uint8 wmpr = MPR[address >> 13]; + + return(PeekPhysical((wmpr << 13) | (address & 0x1FFF))); + } + // + // End Debugger Support Methods + // + + INLINE void SetFastRead(unsigned int i, uint8 *ptr) + { + assert(i < 0x100); + + FastMap[i] = ptr ? (ptr - i * 8192) : NULL; + } + + INLINE readfunc GetReadHandler(unsigned int i) + { + assert(i < 0x100); + return(ReadMap[i]); + } + + + INLINE void SetReadHandler(unsigned int i, readfunc func) + { + assert(i < 0x100); + ReadMap[i] = func; + } + + INLINE void SetWriteHandler(unsigned int i, writefunc func) + { + assert(i < 0x100); + WriteMap[i] = func; + } + + // If external debugging code uses this function, then SetFastRead() must not be used with a pointer other than NULL for it to work + // properly. + INLINE uint32 GetLastLogicalReadAddr(void) + { + return(LastLogicalReadAddr); + } + + INLINE uint32 GetLastLogicalWriteAddr(void) + { + return(LastLogicalWriteAddr); + } + + private: + + void FlushMPRCache(void); + + INLINE void SetMPR(int i, int v) + { + MPR[i] = v; + FastPageR[i] = FastMap[v] ? (FastMap[v] + v * 8192) - i * 8192 : NULL; + } + + + // Logical + INLINE uint8 RdMem(unsigned int address) + { + if(FastPageR[address >> 13]) + return(FastPageR[address >> 13][address]); + + LastLogicalReadAddr = address; + + uint8 wmpr = MPR[address >> 13]; + return(ReadMap[wmpr]((wmpr << 13) | (address & 0x1FFF))); + } + + // Logical(warning: sets/clears isopread) + INLINE uint8 RdOp(unsigned int address) + { + if(FastPageR[address >> 13]) + return(FastPageR[address >> 13][address]); + + LastLogicalReadAddr = address; + + isopread = 1; + uint8 wmpr = MPR[address >> 13]; + uint8 ret = ReadMap[wmpr]((wmpr << 13) | (address & 0x1FFF)); + isopread = 0; + return(ret); + } + + // Logical + INLINE void WrMem(unsigned int address, uint8 V) + { + uint8 wmpr = MPR[address >> 13]; + + LastLogicalWriteAddr = address; + + WriteMap[wmpr]((wmpr << 13) | (address & 0x1FFF), V); + } + + // Used for ST0, ST1, ST2 + // Must not modify address(upper bit is abused for ST0/ST1/ST2 handling). + INLINE void WrMemPhysical(uint32 address, uint8 data) + { + WriteMap[(address >> 13) & 0xFF](address, data); + } + + INLINE void REDOPIMCACHE(void) + { + PIMaskCache = (P & I_FLAG) ? 0 : ~0; + } + + INLINE void REDOSPEEDCACHE(void) + { + speed_shift_cache = (speed ^ 1) << 1; + } + + INLINE void ADDCYC(int x) + { + int master = (x * 3) << speed_shift_cache; + + timestamp += master; + next_event -= master; + next_user_event -= master; + + if(next_event <= 0) + HappySync(); + } + + INLINE void ADDCYC_MASTER(int master) + { + timestamp += master; + next_event -= master; + next_user_event -= master; + + if(next_event <= 0) + HappySync(); + } + + + void HappySync(void); + + INLINE void CalcNextEvent(void) + { + next_event = timer_div; + + if(next_event > next_user_event) + next_event = next_user_event; + } + + void X_ZN(const uint8); + void X_ZNT(const uint8); + + void PUSH(const uint8 V); + uint8 POP(void); + + template + void JR(const bool cond, const bool BBRS = false); + + template + void BBRi(const uint8 val, const unsigned int bitto); + + template + void BBSi(const uint8 val, const unsigned int bitto); + + private: + int runrunrun; // Don't change to bool(main possibles values are -1, 0, 1). + + uint32 timestamp; + uint32 PC; // Program Counter(16-bit, but as a 32-bit variable for performance reasons) + uint8 A; // Accumulator + uint8 X; // X Index register + uint8 Y; // Y Indes register + uint8 S; // Stack Pointer + uint8 P; // Processor Flags/Status Register + uint32 PIMaskCache; // Will be = 0 if (P & I_FLAG) is set, ~0 if (P & I_FLAG) is clear. + uint8 MPR[9]; // 8, + 1 for PC overflow from $ffff to $10000 + + uint8 *FastPageR[9]; // Fast page read cache for each 8KiB in the 16-bit logical address space + // (Reloaded on corresponding MPR change) + + int32 next_event; // Next event, period. Timer, user, ALIENS ARE INVADING SAVE ME HELP + + int32 next_user_event; + + int32 timer_lastts; + + uint8 IRQMask; + + uint32 LastLogicalReadAddr; // Some helper variables for debugging code(external) + uint32 LastLogicalWriteAddr; // to know where the read/write occurred in the 16-bit logical space. + + uint8 lastop; + + uint32 IRQlow; /* Simulated IRQ pin held low(or is it high?). + And other junk hooked on for speed reasons.*/ + int32 IRQSample; + int32 IFlagSample; + + uint8 speed; + uint8 speed_shift_cache; + + bool timer_inreload; + uint8 timer_status; + int32 timer_value, timer_load; + int32 timer_div; + + uint8 IODataBuffer; + + enum + { + IBM_TIA = 1, + IBM_TAI = 2, + IBM_TDD = 3, + IBM_TII = 4, + IBM_TIN = 5 + }; + uint32 in_block_move; + uint16 bmt_src, bmt_dest, bmt_length; + uint32 bmt_alternate; + bool isopread; + + bool (*CPUHook)(uint32); + void (*ADDBT)(uint32, uint32, uint32); + + HuC6280_Support *EventHandler; + + uint8 *FastMap[0x100]; // Direct pointers to memory for mapped RAM and ROM for faster reads(biased to remove the need for an & operation). + readfunc ReadMap[0x100]; // Read handler pointers for each 8KiB in the 21-bit physical address space. + writefunc WriteMap[0x100]; // Write handler pointers for each 8KiB in the 21-bit physical address space. + + const bool EmulateWAI; // For speed hacks +}; + +#endif diff --git a/Mednafen/mednafen/hw_cpu/huc6280/huc6280_step.inc b/Mednafen/mednafen/hw_cpu/huc6280/huc6280_step.inc new file mode 100644 index 0000000000..317ab47175 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/huc6280/huc6280_step.inc @@ -0,0 +1,101 @@ + if(DebugMode) + old_PC = PC; + + if(DebugMode && CPUHook) + { + TimerSync(); + CalcNextEvent(); + if(CPUHook(PC)) + { + if(in_block_move) + goto IBM_Dispatch; + } + } + + if(IRQSample | IRQlow) + { + if(IRQSample & IQRESET) + { + speed = 0; + REDOSPEEDCACHE(); + + IRQMask = 7; + SetMPR(7, 0); + PC=RdMem(0xFFFE); + PC|=RdMem(0xFFFF)<<8; + P=I_FLAG; + REDOPIMCACHE(); + IRQSample &= ~IQRESET; + IRQlow &= ~IQRESET; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0xFFFE); + + continue; + } + else + { + uint32 tmpa = 0; + + if((IRQlow & IQTIMER & IRQMask) && !IFlagSample) //IRQSample & IQTIMER) + tmpa = 0xFFFA; + else if(IRQSample & IQIRQ1) + tmpa = 0xFFF8; + else if(IRQSample & IQIRQ2) + tmpa = 0xFFF6; + //else + // puts("DANGER WILL ROBINSON DANGER"); + + //printf("IRQ: %04x\n", tmpa); + + if(tmpa) + { + // Total: 8 cycles(7 ADDCYC(1), 1 LASTCYCLE) + + ADDCYC(1); // Cycle 1 + RdMem(PC); // Dummy read + + ADDCYC(1); // Cycle 2 + RdMem(PC + 1); // Dummy read + + ADDCYC(1); // Cycle 3 + PUSH(PC>>8); // Push PCH + + ADDCYC(1); // Cycle 4 + PUSH(PC); // Push PCL + + ADDCYC(1); // Cycle 5 + PUSH((P & ~B_FLAG)); // Push P + P |= I_FLAG; + REDOPIMCACHE(); + P &= ~(T_FLAG | D_FLAG); + + ADDCYC(1); // Cycle 6 + PC=RdMem(tmpa); // Fetch vector PCL + + ADDCYC(1); // Cycle 7 + PC|=RdMem(tmpa + 1) << 8; // Fect vector PCH + + LASTCYCLE; // Cycle 8(internal operation?) + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, tmpa); + + continue; + } + } + } + PC &= 0xFFFF; // Our cpu core can only handle PC going about 8192 bytes over, so make sure it never gets that far... + + lastop = RdOp(PC); + + PC++; + + switch(lastop) + { + #include "ops.inc" + } + + P &= ~T_FLAG; + skip_T_flag_clear:; // goto'd by the SET code + diff --git a/Mednafen/mednafen/hw_cpu/huc6280/ops.inc b/Mednafen/mednafen/hw_cpu/huc6280/ops.inc new file mode 100644 index 0000000000..c02310d6f5 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/huc6280/ops.inc @@ -0,0 +1,558 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +case 0x00: /* BRK */ + PC++; + P &= ~T_FLAG; + PUSH(PC >> 8); + PUSH(PC); + PUSH(P | B_FLAG); + + P |= I_FLAG; + REDOPIMCACHE(); + + P &= ~D_FLAG; + + PC = RdOp(0xFFF6); + PC |= RdOp(0xFFF7) << 8; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(7); + LASTCYCLE; + break; + +case 0x40: /* RTI */ + P = POP(); + REDOPIMCACHE(); + PC = POP(); + PC |= POP() << 8; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(6); + LASTCYCLE; + + goto skip_T_flag_clear; + + break; + +case 0x60: /* RTS */ + PC = POP(); + PC |= POP() << 8; + PC++; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(6); + LASTCYCLE; + break; + +case 0x48: /* PHA */ + ADDCYC(2); + LASTCYCLE; + PUSH(A); + break; + +case 0x08: /* PHP */ + ADDCYC(2); + LASTCYCLE; + P &= ~T_FLAG; + PUSH(P | B_FLAG); + break; + +case 0xDA: // PHX 65C02 + ADDCYC(2); + LASTCYCLE; + PUSH(X); + break; + +case 0x5A: // PHY 65C02 + ADDCYC(2); + LASTCYCLE; + PUSH(Y); + break; + +case 0x68: /* PLA */ + ADDCYC(3); + LASTCYCLE; + A = POP(); + X_ZN(A); + break; + +case 0xFA: // PLX 65C02 + ADDCYC(3); + LASTCYCLE; + X = POP(); + X_ZN(X); + break; + +case 0x7A: // PLY 65C02 + ADDCYC(3); + LASTCYCLE; + Y = POP(); + X_ZN(Y); + break; + +case 0x28: /* PLP */ + ADDCYC(3); + LASTCYCLE; + P = POP(); + REDOPIMCACHE(); + + goto skip_T_flag_clear; + + break; + +case 0x4C: /* JMP ABSOLUTE */ + { + uint16 ptmp = PC; + unsigned int npc; + + npc = RdOp(ptmp); + ptmp++; + npc |= RdOp(ptmp)<<8; + PC = npc; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(3); + LASTCYCLE; + } + break; + +case 0x6C: /* JMP Indirect */ + { + uint32 tmp; + GetAB(tmp); + PC = RdMem(tmp); + PC |= RdMem(tmp + 1) << 8; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(6); + LASTCYCLE; + } + break; + +case 0x7C: // JMP Indirect X - 65C02 + { + uint32 tmp; + GetAB(tmp); + tmp += X; + + PC = RdMem(tmp); + PC |= RdMem(tmp + 1) << 8; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(6); + LASTCYCLE; + } + break; + +case 0x20: /* JSR */ + { + uint8 npc; + npc=RdOp(PC); + PC++; + PUSH(PC >> 8); + PUSH(PC); + PC = RdOp(PC) << 8; + PC |= npc; + + if(DebugMode && ADDBT) + ADDBT(old_PC, PC, 0); + + ADDCYC(6); + LASTCYCLE; + } + break; + +case 0xAA: IMP(TAX); + +case 0x8A: IMP(TXA); + +case 0xA8: IMP(TAY); + +case 0x98: IMP(TYA); + +case 0xBA: IMP(TSX); + +case 0x9A: IMP(TXS); + +case 0xCA: IMP(DEX); + +case 0x88: IMP(DEY); + +case 0xE8: IMP(INX); + +case 0xC8: IMP(INY); + +case 0x54: IMP(CSL); +case 0xD4: IMP(CSH); + +#define OP_CLEARR(r) { ADDCYC(1); LASTCYCLE; r = 0; break; } + +case 0x62: OP_CLEARR(A); // CLA +case 0x82: OP_CLEARR(X); // CLX +case 0xC2: OP_CLEARR(Y); // CLY + +// The optional argument(s) will run at the end, immediately before the break. +#define OP_CLEARF(f, ...) { ADDCYC(1); LASTCYCLE; P &= ~f; __VA_ARGS__ break; } +#define OP_SETF(f, ...) { ADDCYC(1); LASTCYCLE; P |= f; __VA_ARGS__ break; } + +case 0x18: /* CLC */ + OP_CLEARF(C_FLAG); + +case 0xD8: /* CLD */ + OP_CLEARF(D_FLAG); + +case 0x58: /* CLI */ + OP_CLEARF(I_FLAG, REDOPIMCACHE();); + +case 0xB8: /* CLV */ + OP_CLEARF(V_FLAG); + +case 0x38: /* SEC */ + OP_SETF(C_FLAG); + +case 0xF8: /* SED */ + OP_SETF(D_FLAG); + +case 0x78: /* SEI */ + OP_SETF(I_FLAG, REDOPIMCACHE();); + +case 0xF4: /* SET */ + //puts("SET"); + ADDCYC(1); + LASTCYCLE; + P |= T_FLAG; + + goto skip_T_flag_clear; + + break; + + +case 0xEA: /* NOP */ + ADDCYC(1); + LASTCYCLE; + break; + +case 0x0A: RMW_A(ASL); +case 0x06: RMW_ZP(ASL); +case 0x16: RMW_ZPX(ASL); +case 0x0E: RMW_AB(ASL); +case 0x1E: RMW_ABX(ASL); + +case 0x3A: RMW_A(DEC); +case 0xC6: RMW_ZP(DEC); +case 0xD6: RMW_ZPX(DEC); +case 0xCE: RMW_AB(DEC); +case 0xDE: RMW_ABX(DEC); + +case 0x1A: RMW_A(INC); // 65C02 +case 0xE6: RMW_ZP(INC); +case 0xF6: RMW_ZPX(INC); +case 0xEE: RMW_AB(INC); +case 0xFE: RMW_ABX(INC); + +case 0x4A: RMW_A(LSR); +case 0x46: RMW_ZP(LSR); +case 0x56: RMW_ZPX(LSR); +case 0x4E: RMW_AB(LSR); +case 0x5E: RMW_ABX(LSR); + +case 0x2A: RMW_A(ROL); +case 0x26: RMW_ZP(ROL); +case 0x36: RMW_ZPX(ROL); +case 0x2E: RMW_AB(ROL); +case 0x3E: RMW_ABX(ROL); + +case 0x6A: RMW_A(ROR); +case 0x66: RMW_ZP(ROR); +case 0x76: RMW_ZPX(ROR); +case 0x6E: RMW_AB(ROR); +case 0x7E: RMW_ABX(ROR); + +case 0x69: LD_IM(ADC); +case 0x65: LD_ZP(ADC); +case 0x75: LD_ZPX(ADC); +case 0x6D: LD_AB(ADC); +case 0x7D: LD_ABX(ADC); +case 0x79: LD_ABY(ADC); +case 0x72: LD_IND(ADC); +case 0x61: LD_IX(ADC); +case 0x71: LD_IY(ADC); + +case 0x29: LD_IM(AND); +case 0x25: LD_ZP(AND); +case 0x35: LD_ZPX(AND); +case 0x2D: LD_AB(AND); +case 0x3D: LD_ABX(AND); +case 0x39: LD_ABY(AND); +case 0x32: LD_IND(AND); +case 0x21: LD_IX(AND); +case 0x31: LD_IY(AND); + +case 0x89: LD_IM(BIT); +case 0x24: LD_ZP(BIT); +case 0x34: LD_ZPX(BIT); +case 0x2C: LD_AB(BIT); +case 0x3C: LD_ABX(BIT); + +case 0xC9: LD_IM(CMP); +case 0xC5: LD_ZP(CMP); +case 0xD5: LD_ZPX(CMP); +case 0xCD: LD_AB(CMP); +case 0xDD: LD_ABX(CMP); +case 0xD9: LD_ABY(CMP); +case 0xD2: LD_IND(CMP); +case 0xC1: LD_IX(CMP); +case 0xD1: LD_IY(CMP); + +case 0xE0: LD_IM(CPX); +case 0xE4: LD_ZP(CPX); +case 0xEC: LD_AB(CPX); + +case 0xC0: LD_IM(CPY); +case 0xC4: LD_ZP(CPY); +case 0xCC: LD_AB(CPY); + +case 0x49: LD_IM(EOR); +case 0x45: LD_ZP(EOR); +case 0x55: LD_ZPX(EOR); +case 0x4D: LD_AB(EOR); +case 0x5D: LD_ABX(EOR); +case 0x59: LD_ABY(EOR); +case 0x52: LD_IND(EOR); +case 0x41: LD_IX(EOR); +case 0x51: LD_IY(EOR); + +case 0xA9: LD_IM(LDA); +case 0xA5: LD_ZP(LDA); +case 0xB5: LD_ZPX(LDA); +case 0xAD: LD_AB(LDA); +case 0xBD: LD_ABX(LDA); +case 0xB9: LD_ABY(LDA); +case 0xB2: LD_IND(LDA); +case 0xA1: LD_IX(LDA); +case 0xB1: LD_IY(LDA); + +case 0xA2: LD_IM(LDX); +case 0xA6: LD_ZP(LDX); +case 0xB6: LD_ZPY(LDX); +case 0xAE: LD_AB(LDX); +case 0xBE: LD_ABY(LDX); + +case 0xA0: LD_IM(LDY); +case 0xA4: LD_ZP(LDY); +case 0xB4: LD_ZPX(LDY); +case 0xAC: LD_AB(LDY); +case 0xBC: LD_ABX(LDY); + +case 0x09: LD_IM(ORA); +case 0x05: LD_ZP(ORA); +case 0x15: LD_ZPX(ORA); +case 0x0D: LD_AB(ORA); +case 0x1D: LD_ABX(ORA); +case 0x19: LD_ABY(ORA); +case 0x12: LD_IND(ORA); +case 0x01: LD_IX(ORA); +case 0x11: LD_IY(ORA); + +case 0xE9: LD_IM(SBC); +case 0xE5: LD_ZP(SBC); +case 0xF5: LD_ZPX(SBC); +case 0xED: LD_AB(SBC); +case 0xFD: LD_ABX(SBC); +case 0xF9: LD_ABY(SBC); +case 0xF2: LD_IND(SBC); +case 0xE1: LD_IX(SBC); +case 0xF1: LD_IY(SBC); + +case 0x85: ST_ZP(A); +case 0x95: ST_ZPX(A); +case 0x8D: ST_AB(A); +case 0x9D: ST_ABX(A); +case 0x99: ST_ABY(A); +case 0x92: ST_IND(A); +case 0x81: ST_IX(A); +case 0x91: ST_IY(A); + +case 0x86: ST_ZP(X); +case 0x96: ST_ZPY(X); +case 0x8E: ST_AB(X); + +case 0x84: ST_ZP(Y); +case 0x94: ST_ZPX(Y); +case 0x8C: ST_AB(Y); + +/* BBRi */ +case 0x0F: LD_ZP(BBRi(x, 0)); +case 0x1F: LD_ZP(BBRi(x, 1)); +case 0x2F: LD_ZP(BBRi(x, 2)); +case 0x3F: LD_ZP(BBRi(x, 3)); +case 0x4F: LD_ZP(BBRi(x, 4)); +case 0x5F: LD_ZP(BBRi(x, 5)); +case 0x6F: LD_ZP(BBRi(x, 6)); +case 0x7F: LD_ZP(BBRi(x, 7)); + +/* BBSi */ +case 0x8F: LD_ZP(BBSi(x, 0)); +case 0x9F: LD_ZP(BBSi(x, 1)); +case 0xAF: LD_ZP(BBSi(x, 2)); +case 0xBF: LD_ZP(BBSi(x, 3)); +case 0xCF: LD_ZP(BBSi(x, 4)); +case 0xDF: LD_ZP(BBSi(x, 5)); +case 0xEF: LD_ZP(BBSi(x, 6)); +case 0xFF: LD_ZP(BBSi(x, 7)); + +/* BRA */ +case 0x80: JR(1); break; + +/* BSR */ +case 0x44: + { + PUSH(PC >> 8); + PUSH(PC); + ADDCYC(4); + JR(1); + } + break; + +/* BCC */ +case 0x90: JR(!(P&C_FLAG)); break; + +/* BCS */ +case 0xB0: JR(P&C_FLAG); break; + +/* BEQ */ +case 0xF0: JR(P&Z_FLAG); break; + +/* BNE */ +case 0xD0: JR(!(P&Z_FLAG)); break; + +/* BMI */ +case 0x30: JR(P&N_FLAG); break; + +/* BPL */ +case 0x10: JR(!(P&N_FLAG)); break; + +/* BVC */ +case 0x50: JR(!(P&V_FLAG)); break; + +/* BVS */ +case 0x70: JR(P&V_FLAG); break; + + +// RMB 65SC02 +case 0x07: RMW_ZP_B(RMB(0)); +case 0x17: RMW_ZP_B(RMB(1)); +case 0x27: RMW_ZP_B(RMB(2)); +case 0x37: RMW_ZP_B(RMB(3)); +case 0x47: RMW_ZP_B(RMB(4)); +case 0x57: RMW_ZP_B(RMB(5)); +case 0x67: RMW_ZP_B(RMB(6)); +case 0x77: RMW_ZP_B(RMB(7)); + +// SMB 65SC02 +case 0x87: RMW_ZP_B(SMB(0)); +case 0x97: RMW_ZP_B(SMB(1)); +case 0xa7: RMW_ZP_B(SMB(2)); +case 0xb7: RMW_ZP_B(SMB(3)); +case 0xc7: RMW_ZP_B(SMB(4)); +case 0xd7: RMW_ZP_B(SMB(5)); +case 0xe7: RMW_ZP_B(SMB(6)); +case 0xf7: RMW_ZP_B(SMB(7)); + +// STZ 65C02 +case 0x64: ST_ZP(0); +case 0x74: ST_ZPX(0); +case 0x9C: ST_AB(0); +case 0x9E: ST_ABX(0); + +// TRB 65SC02 +case 0x14: RMW_ZP(TRB); +case 0x1C: RMW_AB(TRB); + +// TSB 65SC02 +case 0x04: RMW_ZP(TSB); +case 0x0C: RMW_AB(TSB); + +// TST +case 0x83: LD_IM_ZP(TST); +case 0xA3: LD_IM_ZPX(TST); +case 0x93: LD_IM_AB(TST); +case 0xB3: LD_IM_ABX(TST); + +case 0x02: IMP(SXY); +case 0x22: IMP(SAX); +case 0x42: IMP(SAY); + + + +case 0x73: // TII + LD_BMT(BMT_TII); + +case 0xC3: // TDD + LD_BMT(BMT_TDD); + +case 0xD3: // TIN + LD_BMT(BMT_TIN); + +case 0xE3: // TIA + LD_BMT(BMT_TIA); + +case 0xF3: // TAI + LD_BMT(BMT_TAI); + +case 0x43: // TMAi + LD_IM_COMPLEX(TMA); + +case 0x53: // TAMi + LD_IM_COMPLEX(TAM); + +case 0x03: // ST0 + LD_IM_COMPLEX(ST0); + +case 0x13: // ST1 + LD_IM_COMPLEX(ST1); + +case 0x23: // ST2 + LD_IM_COMPLEX(ST2); + + +case 0xCB: + if(EmulateWAI) + { + if(next_event > 1) + ADDCYC(next_event - 1); + LASTCYCLE; + break; + } +default: //MDFN_printf("Bad %02x at $%04x\n", lastop, PC); + ADDCYC(1); + LASTCYCLE; + break; + diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_cpu.cpp b/Mednafen/mednafen/hw_cpu/v810/v810_cpu.cpp new file mode 100644 index 0000000000..0d6ce6e80c --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_cpu.cpp @@ -0,0 +1,1546 @@ +/* V810 Emulator + * + * Copyright (C) 2006 David Tucker + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Alternatively, the V810 emulator code(and all V810 emulation header files) can be used/distributed under the following license(you can adopt either + license exclusively for your changes by removing one of these license headers, but it's STRONGLY preferable + to keep your changes dual-licensed as well): + +This Reality Boy emulator is copyright (C) David Tucker 1997-2008, all rights +reserved. You may use this code as long as you make no money from the use of +this code and you acknowledge the original author (Me). I reserve the right to +dictate who can use this code and how (Just so you don't do something stupid +with it). + Most Importantly, this code is swap ware. If you use It send along your new +program (with code) or some other interesting tidbits you wrote, that I might be +interested in. + This code is in beta, there are bugs! I am not responsible for any damage +done to your computer, reputation, ego, dog, or family life due to the use of +this code. All source is provided as is, I make no guaranties, and am not +responsible for anything you do with the code (legal or otherwise). + Virtual Boy is a trademark of Nintendo, and V810 is a trademark of NEC. I am +in no way affiliated with either party and all information contained hear was +found freely through public domain sources. +*/ + +////////////////////////////////////////////////////////// +// CPU routines + +#include +#include + +//#include "pcfx.h" +//#include "debug.h" + +#include +#include + +#include "v810_opt.h" +#include "v810_cpu.h" +#include "v810_cpuD.h" + +V810::V810() +{ + #ifdef WANT_DEBUGGER + CPUHook = NULL; + ADDBT = NULL; + #endif + + MemRead8 = NULL; + MemRead16 = NULL; + MemRead32 = NULL; + + IORead8 = NULL; + IORead16 = NULL; + IORead32 = NULL; + + MemWrite8 = NULL; + MemWrite16 = NULL; + MemWrite32 = NULL; + + IOWrite8 = NULL; + IOWrite16 = NULL; + IOWrite32 = NULL; + + memset(FastMap, 0, sizeof(FastMap)); + + memset(MemReadBus32, 0, sizeof(MemReadBus32)); + memset(MemWriteBus32, 0, sizeof(MemWriteBus32)); + + v810_timestamp = 0; + next_event_ts = 0x7FFFFFFF; +} + +V810::~V810() +{ + Kill(); +} + +INLINE void V810::RecalcIPendingCache(void) +{ + IPendingCache = 0; + + // Of course don't generate an interrupt if there's not one pending! + if(ilevel < 0) + return; + + // If CPU is halted because of a fatal exception, don't let an interrupt + // take us out of this halted status. + if(Halted == HALT_FATAL_EXCEPTION) + return; + + // If the NMI pending, exception pending, and/or interrupt disabled bit + // is set, don't accept any interrupts. + if(S_REG[PSW] & (PSW_NP | PSW_EP | PSW_ID)) + return; + + // If the interrupt level is lower than the interrupt enable level, don't + // accept it. + if(ilevel < (int)((S_REG[PSW] & PSW_IA) >> 16)) + return; + + IPendingCache = 0xFF; +} + + +// TODO: "An interrupt that occurs during restore/dump/clear operation is internally held and is accepted after the +// operation in progress is finished. The maskable interrupt is held internally only when the EP, NP, and ID flags +// of PSW are all 0." +// +// This behavior probably doesn't have any relevance on the PC-FX, unless we're sadistic +// and try to restore cache from an interrupt acknowledge register or dump it to a register +// controlling interrupt masks... I wanna be sadistic~ + +void V810::CacheClear(v810_timestamp_t ×tamp, uint32 start, uint32 count) +{ + //printf("Cache clear: %08x %08x\n", start, count); + for(uint32 i = 0; i < count && (i + start) < 128; i++) + memset(&Cache[i + start], 0, sizeof(V810_CacheEntry_t)); +} + +INLINE void V810::CacheOpMemStore(v810_timestamp_t ×tamp, uint32 A, uint32 V) +{ + if(MemWriteBus32[A >> 24]) + { + timestamp += 2; + MemWrite32(timestamp, A, V); + } + else + { + timestamp += 2; + MemWrite16(timestamp, A, V & 0xFFFF); + + timestamp += 2; + MemWrite16(timestamp, A | 2, V >> 16); + } +} + +INLINE uint32 V810::CacheOpMemLoad(v810_timestamp_t ×tamp, uint32 A) +{ + if(MemReadBus32[A >> 24]) + { + timestamp += 2; + return(MemRead32(timestamp, A)); + } + else + { + uint32 ret; + + timestamp += 2; + ret = MemRead16(timestamp, A); + + timestamp += 2; + ret |= MemRead16(timestamp, A | 2) << 16; + return(ret); + } +} + +void V810::CacheDump(v810_timestamp_t ×tamp, const uint32 SA) +{ + printf("Cache dump: %08x\n", SA); + + for(int i = 0; i < 128; i++) + { + CacheOpMemStore(timestamp, SA + i * 8 + 0, Cache[i].data[0]); + CacheOpMemStore(timestamp, SA + i * 8 + 4, Cache[i].data[1]); + } + + for(int i = 0; i < 128; i++) + { + uint32 icht = Cache[i].tag | ((int)Cache[i].data_valid[0] << 22) | ((int)Cache[i].data_valid[1] << 23); + + CacheOpMemStore(timestamp, SA + 1024 + i * 4, icht); + } + +} + +void V810::CacheRestore(v810_timestamp_t ×tamp, const uint32 SA) +{ + printf("Cache restore: %08x\n", SA); + + for(int i = 0; i < 128; i++) + { + Cache[i].data[0] = CacheOpMemLoad(timestamp, SA + i * 8 + 0); + Cache[i].data[1] = CacheOpMemLoad(timestamp, SA + i * 8 + 4); + } + + for(int i = 0; i < 128; i++) + { + uint32 icht; + + icht = CacheOpMemLoad(timestamp, SA + 1024 + i * 4); + + Cache[i].tag = icht & ((1 << 22) - 1); + Cache[i].data_valid[0] = (icht >> 22) & 1; + Cache[i].data_valid[1] = (icht >> 23) & 1; + } +} + + +INLINE uint32 V810::RDCACHE(v810_timestamp_t ×tamp, uint32 addr) +{ + const int CI = (addr >> 3) & 0x7F; + const int SBI = (addr & 4) >> 2; + + if(Cache[CI].tag == (addr >> 10)) + { + if(!Cache[CI].data_valid[SBI]) + { + timestamp += 2; // or higher? Penalty for cache miss seems to be higher than having cache disabled. + if(MemReadBus32[addr >> 24]) + Cache[CI].data[SBI] = MemRead32(timestamp, addr & ~0x3); + else + { + timestamp++; + + uint32 tmp; + + tmp = MemRead16(timestamp, addr & ~0x3); + tmp |= MemRead16(timestamp, (addr & ~0x3) | 0x2) << 16; + + Cache[CI].data[SBI] = tmp; + } + Cache[CI].data_valid[SBI] = TRUE; + } + } + else + { + Cache[CI].tag = addr >> 10; + + timestamp += 2; // or higher? Penalty for cache miss seems to be higher than having cache disabled. + if(MemReadBus32[addr >> 24]) + Cache[CI].data[SBI] = MemRead32(timestamp, addr & ~0x3); + else + { + timestamp++; + + uint32 tmp; + + tmp = MemRead16(timestamp, addr & ~0x3); + tmp |= MemRead16(timestamp, (addr & ~0x3) | 0x2) << 16; + + Cache[CI].data[SBI] = tmp; + } + //Cache[CI].data[SBI] = MemRead32(timestamp, addr & ~0x3); + Cache[CI].data_valid[SBI] = TRUE; + Cache[CI].data_valid[SBI ^ 1] = FALSE; + } + + //{ + // // Caution: This can mess up DRAM page change penalty timings + // uint32 dummy_timestamp = 0; + // if(Cache[CI].data[SBI] != mem_rword(addr & ~0x3, dummy_timestamp)) + // { + // printf("Cache/Real Memory Mismatch: %08x %08x/%08x\n", addr & ~0x3, Cache[CI].data[SBI], mem_rword(addr & ~0x3, dummy_timestamp)); + // } + //} + + return(Cache[CI].data[SBI]); +} + +INLINE uint16 V810::RDOP(v810_timestamp_t ×tamp, uint32 addr, uint32 meow) +{ + uint16 ret; + + if(S_REG[CHCW] & 0x2) + { + uint32 d32 = RDCACHE(timestamp, addr); + ret = d32 >> ((addr & 2) * 8); + } + else + { + timestamp += meow; //++; + ret = MemRead16(timestamp, addr); + } + return(ret); +} + +#define BRANCH_ALIGN_CHECK(x) { if((S_REG[CHCW] & 0x2) && (x & 0x2)) { ADDCLOCK(1); } } + +// Reinitialize the defaults in the CPU +void V810::Reset() +{ +#ifdef WANT_DEBUGGER + if(ADDBT) + ADDBT(GetPC(), 0xFFFFFFF0, 0xFFF0); +#endif + memset(&Cache, 0, sizeof(Cache)); + + memset(P_REG, 0, sizeof(P_REG)); + memset(S_REG, 0, sizeof(S_REG)); + memset(Cache, 0, sizeof(Cache)); + + P_REG[0] = 0x00000000; + SetPC(0xFFFFFFF0); + + S_REG[ECR] = 0x0000FFF0; + S_REG[PSW] = 0x00008000; + + if(VBMode) + S_REG[PIR] = 0x00005346; + else + S_REG[PIR] = 0x00008100; + + S_REG[TKCW] = 0x000000E0; + Halted = HALT_NONE; + ilevel = -1; + + lastop = 0; + + in_bstr = FALSE; + + RecalcIPendingCache(); +} + +bool V810::Init(V810_Emu_Mode mode, bool vb_mode) +{ + EmuMode = mode; + VBMode = vb_mode; + + in_bstr = FALSE; + in_bstr_to = 0; + + if(mode == V810_EMU_MODE_FAST) + { + memset(DummyRegion, 0, V810_FAST_MAP_PSIZE); + + for(unsigned int i = V810_FAST_MAP_PSIZE; i < V810_FAST_MAP_PSIZE + V810_FAST_MAP_TRAMPOLINE_SIZE; i += 2) + { + DummyRegion[i + 0] = 0; + DummyRegion[i + 1] = 0x36 << 2; + } + + for(uint64 A = 0; A < (1ULL << 32); A += V810_FAST_MAP_PSIZE) + FastMap[A / V810_FAST_MAP_PSIZE] = DummyRegion - A; + } + + return(TRUE); +} + +void V810::Kill(void) +{ + for(unsigned int i = 0; i < FastMapAllocList.size(); i++) + MDFN_free(FastMapAllocList[i]); + + FastMapAllocList.clear(); +} + +void V810::SetInt(int level) +{ + assert(level >= -1 && level <= 15); + + ilevel = level; + RecalcIPendingCache(); +} + +uint8 *V810::SetFastMap(uint32 addresses[], uint32 length, unsigned int num_addresses, const char *name) +{ + uint8 *ret = NULL; + + for(unsigned int i = 0; i < num_addresses; i++) + { + assert((addresses[i] & (V810_FAST_MAP_PSIZE - 1)) == 0); + } + assert((length & (V810_FAST_MAP_PSIZE - 1)) == 0); + + ret = (uint8 *)MDFN_malloc_T(length + V810_FAST_MAP_TRAMPOLINE_SIZE, name); + + for(unsigned int i = length; i < length + V810_FAST_MAP_TRAMPOLINE_SIZE; i += 2) + { + ret[i + 0] = 0; + ret[i + 1] = 0x36 << 2; + } + + for(unsigned int i = 0; i < num_addresses; i++) + { + for(uint64 addr = addresses[i]; addr != (uint64)addresses[i] + length; addr += V810_FAST_MAP_PSIZE) + { + //printf("%08x, %d, %s\n", addr, length, name); + + FastMap[addr / V810_FAST_MAP_PSIZE] = ret - addresses[i]; + } + } + + FastMapAllocList.push_back(ret); + + return(ret); +} + + +void V810::SetMemReadBus32(uint8 A, bool value) +{ + MemReadBus32[A] = value; +} + +void V810::SetMemWriteBus32(uint8 A, bool value) +{ + MemWriteBus32[A] = value; +} + +void V810::SetMemReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) +{ + MemRead8 = read8; + MemRead16 = read16; + MemRead32 = read32; +} + +void V810::SetMemWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) +{ + MemWrite8 = write8; + MemWrite16 = write16; + MemWrite32 = write32; +} + +void V810::SetIOReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) +{ + IORead8 = read8; + IORead16 = read16; + IORead32 = read32; +} + +void V810::SetIOWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) +{ + IOWrite8 = write8; + IOWrite16 = write16; + IOWrite32 = write32; +} + + +INLINE void V810::SetFlag(uint32 n, bool condition) +{ + S_REG[PSW] &= ~n; + + if(condition) + S_REG[PSW] |= n; +} + +INLINE void V810::SetSZ(uint32 value) +{ + SetFlag(PSW_Z, !value); + SetFlag(PSW_S, value & 0x80000000); +} + +#ifdef WANT_DEBUGGER +void V810::CheckBreakpoints(void (*callback)(int type, uint32 address, uint32 value, unsigned int len), uint16 MDFN_FASTCALL (*peek16)(const v810_timestamp_t, uint32), uint32 MDFN_FASTCALL (*peek32)(const v810_timestamp_t, uint32)) +{ + unsigned int opcode; + uint16 tmpop; + uint16 tmpop_high; + int32 ws_dummy = v810_timestamp; + uint32 tmp_PC = GetPC(); + + tmpop = peek16(ws_dummy, tmp_PC); + tmpop_high = peek16(ws_dummy, tmp_PC + 2); + + opcode = tmpop >> 10; + + // Uncomment this out later if necessary. + //if((tmpop & 0xE000) == 0x8000) // Special opcode format for + // opcode = (tmpop >> 9) & 0x7F; // type III instructions. + + switch(opcode) + { + case CAXI: break; + + default: break; + + case LD_B: callback(BPOINT_READ, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFF, 0, 1); break; + case LD_H: callback(BPOINT_READ, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFE, 0, 2); break; + case LD_W: callback(BPOINT_READ, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFC, 0, 4); break; + + case ST_B: callback(BPOINT_WRITE, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFF, P_REG[(tmpop >> 5) & 0x1F] & 0x00FF, 1); break; + case ST_H: callback(BPOINT_WRITE, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFE, P_REG[(tmpop >> 5) & 0x1F] & 0xFFFF, 2); break; + case ST_W: callback(BPOINT_WRITE, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFC, P_REG[(tmpop >> 5) & 0x1F], 4); break; + + case IN_B: callback(BPOINT_IO_READ, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFF, 0, 1); break; + case IN_H: callback(BPOINT_IO_READ, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFE, 0, 2); break; + case IN_W: callback(BPOINT_IO_READ, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFC, 0, 4); break; + + case OUT_B: callback(BPOINT_IO_WRITE, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFF, P_REG[(tmpop >> 5) & 0x1F] & 0xFF, 1); break; + case OUT_H: callback(BPOINT_IO_WRITE, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFE, P_REG[(tmpop >> 5) & 0x1F] & 0xFFFF, 2); break; + case OUT_W: callback(BPOINT_IO_WRITE, (sign_16(tmpop_high)+P_REG[tmpop & 0x1F])&0xFFFFFFFC, P_REG[(tmpop >> 5) & 0x1F], 4); break; + } + +} +#endif + +#define SetPREG(n, val) { P_REG[n] = val; } + +INLINE void V810::SetSREG(v810_timestamp_t ×tamp, unsigned int which, uint32 value) +{ + switch(which) + { + default: // Reserved + printf("LDSR to reserved system register: 0x%02x : 0x%08x\n", which, value); + break; + + case ECR: // Read-only + break; + + case PIR: // Read-only (obviously) + break; + + case TKCW: // Read-only + break; + + case EIPSW: + case FEPSW: + S_REG[which] = value & 0xFF3FF; + break; + + case PSW: + S_REG[which] = value & 0xFF3FF; + RecalcIPendingCache(); + break; + + case EIPC: + case FEPC: + S_REG[which] = value & 0xFFFFFFFE; + break; + + case ADDTRE: + S_REG[ADDTRE] = value & 0xFFFFFFFE; + printf("Address trap(unemulated): %08x\n", value); + break; + + case CHCW: + S_REG[CHCW] = value & 0x2; + + switch(value & 0x31) + { + default: printf("Undefined cache control bit combination: %08x\n", value); + break; + + case 0x00: break; + + case 0x01: CacheClear(timestamp, (value >> 20) & 0xFFF, (value >> 8) & 0xFFF); + break; + + case 0x10: CacheDump(timestamp, value & ~0xFF); + break; + + case 0x20: CacheRestore(timestamp, value & ~0xFF); + break; + } + break; + } +} + +INLINE uint32 V810::GetSREG(unsigned int which) +{ + uint32 ret; + + if(which != 24 && which != 25 && which >= 8) + { + printf("STSR from reserved system register: 0x%02x", which); + } + + ret = S_REG[which]; + + return(ret); +} + +#define RB_SETPC(new_pc_raw) \ + { \ + const uint32 new_pc = new_pc_raw; /* So RB_SETPC(RB_GETPC()) won't mess up */ \ + if(RB_AccurateMode) \ + PC = new_pc; \ + else \ + { \ + PC_ptr = &FastMap[(new_pc) >> V810_FAST_MAP_SHIFT][(new_pc)]; \ + PC_base = PC_ptr - (new_pc); \ + } \ + } + +#define RB_PCRELCHANGE(delta) { \ + if(RB_AccurateMode) \ + PC += (delta); \ + else \ + { \ + uint32 PC_tmp = RB_GETPC(); \ + PC_tmp += (delta); \ + RB_SETPC(PC_tmp); \ + } \ + } + +#define RB_INCPCBY2() { if(RB_AccurateMode) PC += 2; else PC_ptr += 2; } +#define RB_INCPCBY4() { if(RB_AccurateMode) PC += 4; else PC_ptr += 4; } + +#define RB_DECPCBY2() { if(RB_AccurateMode) PC -= 2; else PC_ptr -= 2; } +#define RB_DECPCBY4() { if(RB_AccurateMode) PC -= 4; else PC_ptr -= 4; } + + +// Define accurate mode defines +#define RB_GETPC() PC +#define RB_RDOP(PC_offset, ...) RDOP(timestamp, PC + PC_offset, ## __VA_ARGS__) + + +void V810::Run_Accurate(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) +{ + const bool RB_AccurateMode = true; + + #define RB_ADDBT(n,o,p) + #define RB_CPUHOOK(n) + + #include "v810_oploop.inc" + + #undef RB_CPUHOOK + #undef RB_ADDBT +} + +#ifdef WANT_DEBUGGER + +/* Make sure class member variable v810_timestamp is synchronized to our local copy, since we'll read it externally if a system + reset/power occurs when in step mode or similar. +*/ +#define RB_CPUHOOK_DBG(n) { if(CPUHook) { v810_timestamp = timestamp_rl; CPUHook(timestamp_rl, n); } } + +void V810::Run_Accurate_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) +{ + const bool RB_AccurateMode = true; + + #define RB_ADDBT(n,o,p) { if(ADDBT) ADDBT(n,o,p); } + /* Make sure class member variable v810_timestamp is synchronized to our local copy, since we'll read it externally if a system + reset/power occurs when in step mode or similar. + */ + #define RB_CPUHOOK(n) RB_CPUHOOK_DBG(n) + #define RB_DEBUGMODE + + #include "v810_oploop.inc" + + #undef RB_DEBUGMODE + #undef RB_CPUHOOK + #undef RB_ADDBT +} +#endif + +// +// Undefine accurate mode defines +// +#undef RB_GETPC +#undef RB_RDOP + + + +// +// Define fast mode defines +// +#define RB_GETPC() ((uint32)(PC_ptr - PC_base)) + +#define RB_RDOP(PC_offset, ...) MDFN_de16lsb(&PC_ptr[PC_offset]) + +void V810::Run_Fast(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) +{ + const bool RB_AccurateMode = false; + + #define RB_ADDBT(n,o,p) + #define RB_CPUHOOK(n) + + #include "v810_oploop.inc" + + #undef RB_CPUHOOK + #undef RB_ADDBT +} + +#ifdef WANT_DEBUGGER +void V810::Run_Fast_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) +{ + const bool RB_AccurateMode = false; + + #define RB_ADDBT(n,o,p) { if(ADDBT) ADDBT(n,o,p); } + #define RB_CPUHOOK(n) RB_CPUHOOK_DBG(n) + #define RB_DEBUGMODE + + #include "v810_oploop.inc" + + #undef RB_DEBUGMODE + #undef RB_CPUHOOK + #undef RB_ADDBT +} +#endif + +// +// Undefine fast mode defines +// +#undef RB_GETPC +#undef RB_RDOP + +v810_timestamp_t V810::Run(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) +{ + Running = true; + + #ifdef WANT_DEBUGGER + if(CPUHook || ADDBT) + { + if(EmuMode == V810_EMU_MODE_FAST) + Run_Fast_Debug(event_handler); + else + Run_Accurate_Debug(event_handler); + } + else + #endif + { + if(EmuMode == V810_EMU_MODE_FAST) + Run_Fast(event_handler); + else + Run_Accurate(event_handler); + } + return(v810_timestamp); +} + +void V810::Exit(void) +{ + Running = false; +} + +#ifdef WANT_DEBUGGER +void V810::SetCPUHook(void (*newhook)(const v810_timestamp_t timestamp, uint32 PC), void (*new_ADDBT)(uint32 old_PC, uint32 new_PC, uint32)) +{ + CPUHook = newhook; + ADDBT = new_ADDBT; +} +#endif + +uint32 V810::GetRegister(unsigned int which, char *special, const uint32 special_len) +{ + if(which >= GSREG_PR && which <= GSREG_PR + 31) + { + return GetPR(which - GSREG_PR); + } + else if(which >= GSREG_SR && which <= GSREG_SR + 31) + { + uint32 val = GetSREG(which - GSREG_SR); + + if(special && which == GSREG_SR + PSW) + { + trio_snprintf(special, special_len, "Z: %d, S: %d, OV: %d, CY: %d, ID: %d, AE: %d, EP: %d, NP: %d, IA: %2d", + (int)(bool)(val & PSW_Z), (int)(bool)(val & PSW_S), (int)(bool)(val & PSW_OV), (int)(bool)(val & PSW_CY), + (int)(bool)(val & PSW_ID), (int)(bool)(val & PSW_AE), (int)(bool)(val & PSW_EP), (int)(bool)(val & PSW_NP), + (val & PSW_IA) >> 16); + } + + return val; + } + else if(which == GSREG_PC) + { + return GetPC(); + } + else if(which == GSREG_TIMESTAMP) + { + return v810_timestamp; + } + + return 0xDEADBEEF; +} + +void V810::SetRegister(unsigned int which, uint32 value) +{ + if(which >= GSREG_PR && which <= GSREG_PR + 31) + { + if(which) + P_REG[which - GSREG_PR] = value; + } + else if(which >= GSREG_SR && which <= GSREG_SR + 31) + { + // SetSREG(timestamp, which - GSREG_SR, value); + } + else if(which == GSREG_PC) + { + SetPC(value & ~1); + } + else if(which == GSREG_TIMESTAMP) + { + //v810_timestamp = value; + } +} + +uint32 V810::GetPC(void) +{ + if(EmuMode == V810_EMU_MODE_ACCURATE) + return(PC); + else + { + return(PC_ptr - PC_base); + } +} + +void V810::SetPC(uint32 new_pc) +{ + if(EmuMode == V810_EMU_MODE_ACCURATE) + PC = new_pc; + else + { + PC_ptr = &FastMap[new_pc >> V810_FAST_MAP_SHIFT][new_pc]; + PC_base = PC_ptr - new_pc; + } +} + +#define BSTR_OP_MOV dst_cache &= ~(1 << dstoff); dst_cache |= ((src_cache >> srcoff) & 1) << dstoff; +#define BSTR_OP_NOT dst_cache &= ~(1 << dstoff); dst_cache |= (((src_cache >> srcoff) & 1) ^ 1) << dstoff; + +#define BSTR_OP_XOR dst_cache ^= ((src_cache >> srcoff) & 1) << dstoff; +#define BSTR_OP_OR dst_cache |= ((src_cache >> srcoff) & 1) << dstoff; +#define BSTR_OP_AND dst_cache &= ~((((src_cache >> srcoff) & 1) ^ 1) << dstoff); + +#define BSTR_OP_XORN dst_cache ^= (((src_cache >> srcoff) & 1) ^ 1) << dstoff; +#define BSTR_OP_ORN dst_cache |= (((src_cache >> srcoff) & 1) ^ 1) << dstoff; +#define BSTR_OP_ANDN dst_cache &= ~(((src_cache >> srcoff) & 1) << dstoff); + +INLINE uint32 V810::BSTR_RWORD(v810_timestamp_t ×tamp, uint32 A) +{ + if(MemReadBus32[A >> 24]) + { + timestamp += 2; + return(MemRead32(timestamp, A)); + } + else + { + uint32 ret; + + timestamp += 2; + ret = MemRead16(timestamp, A); + + timestamp += 2; + ret |= MemRead16(timestamp, A | 2) << 16; + return(ret); + } +} + +INLINE void V810::BSTR_WWORD(v810_timestamp_t ×tamp, uint32 A, uint32 V) +{ + if(MemWriteBus32[A >> 24]) + { + timestamp += 2; + MemWrite32(timestamp, A, V); + } + else + { + timestamp += 2; + MemWrite16(timestamp, A, V & 0xFFFF); + + timestamp += 2; + MemWrite16(timestamp, A | 2, V >> 16); + } +} + +#define DO_BSTR(op) { \ + while(len) \ + { \ + if(!have_src_cache) \ + { \ + have_src_cache = TRUE; \ + src_cache = BSTR_RWORD(timestamp, src); \ + } \ + \ + if(!have_dst_cache) \ + { \ + have_dst_cache = TRUE; \ + dst_cache = BSTR_RWORD(timestamp, dst); \ + } \ + \ + op; \ + srcoff = (srcoff + 1) & 0x1F; \ + dstoff = (dstoff + 1) & 0x1F; \ + len--; \ + \ + if(!srcoff) \ + { \ + src += 4; \ + have_src_cache = FALSE; \ + } \ + \ + if(!dstoff) \ + { \ + BSTR_WWORD(timestamp, dst, dst_cache); \ + dst += 4; \ + have_dst_cache = FALSE; \ + if(timestamp >= next_event_ts) \ + break; \ + } \ + } \ + if(have_dst_cache) \ + BSTR_WWORD(timestamp, dst, dst_cache); \ + } + +INLINE bool V810::Do_BSTR_Search(v810_timestamp_t ×tamp, const int inc_mul, unsigned int bit_test) +{ + uint32 srcoff = (P_REG[27] & 0x1F); + uint32 len = P_REG[28]; + uint32 bits_skipped = P_REG[29]; + uint32 src = (P_REG[30] & 0xFFFFFFFC); + bool found = false; + + #if 0 + // TODO: Better timing. + if(!in_bstr) // If we're just starting the execution of this instruction(kind of spaghetti-code), so FIXME if we change + // bstr handling in v810_oploop.inc + { + timestamp += 13 - 1; + } + #endif + + while(len) + { + if(!have_src_cache) + { + have_src_cache = TRUE; + timestamp++; + src_cache = BSTR_RWORD(timestamp, src); + } + + if(((src_cache >> srcoff) & 1) == bit_test) + { + found = true; + + /* Fix the bit offset and word address to "1 bit before" it was found */ + srcoff -= inc_mul * 1; + if(srcoff & 0x20) /* Handles 0x1F->0x20(0x00) and 0x00->0xFFFF... */ + { + src -= inc_mul * 4; + srcoff &= 0x1F; + } + break; + } + srcoff = (srcoff + inc_mul * 1) & 0x1F; + bits_skipped++; + len--; + + if(!srcoff) + { + have_src_cache = FALSE; + src += inc_mul * 4; + if(timestamp >= next_event_ts) + break; + } + } + + P_REG[27] = srcoff; + P_REG[28] = len; + P_REG[29] = bits_skipped; + P_REG[30] = src; + + + if(found) // Set Z flag to 0 if the bit was found + SetFlag(PSW_Z, 0); + else if(!len) // ...and if the search is over, and the bit was not found, set it to 1 + SetFlag(PSW_Z, 1); + + if(found) // Bit found, so don't continue the search. + return(false); + + return((bool)len); // Continue the search if any bits are left to search. +} + +bool V810::bstr_subop(v810_timestamp_t ×tamp, int sub_op, int arg1) +{ + if((sub_op >= 0x10) || (!(sub_op & 0x8) && sub_op >= 0x4)) + { + printf("%08x\tBSR Error: %04x\n", PC,sub_op); + + SetPC(GetPC() - 2); + Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); + + return(false); + } + +// printf("BSTR: %02x, %02x %02x; src: %08x, dst: %08x, len: %08x\n", sub_op, P_REG[27], P_REG[26], P_REG[30], P_REG[29], P_REG[28]); + + if(sub_op & 0x08) + { + uint32 dstoff = (P_REG[26] & 0x1F); + uint32 srcoff = (P_REG[27] & 0x1F); + uint32 len = P_REG[28]; + uint32 dst = (P_REG[29] & 0xFFFFFFFC); + uint32 src = (P_REG[30] & 0xFFFFFFFC); + +#if 0 + // Be careful not to cause 32-bit integer overflow, and careful about not shifting by 32. + // TODO: + + // Read src[0], src[4] into shifter. + // Read dest[0]. + DO_BSTR_PROLOGUE(); // if(len) { blah blah blah masking blah } + src_cache = BSTR_RWORD(timestamp, src); + + if((uint64)(srcoff + len) > 0x20) + src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; + + dst_cache = BSTR_RWORD(timestamp, dst); + + if(len) + { + uint32 dst_preserve_mask; + uint32 dst_change_mask; + + dst_preserve_mask = (1U << dstoff) - 1; + + if((uint64)(dstoff + len) < 0x20) + dst_preserve_mask |= ((1U << ((0x20 - (dstoff + len)) & 0x1F)) - 1) << (dstoff + len); + + dst_change_mask = ~dst_preserve_mask; + + src_cache = BSTR_RWORD(timestamp, src); + src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; + dst_cache = BSTR_RWORD(timestamp, dst); + + dst_cache = (dst_cache & dst_preserve_mask) | ((dst_cache OP_THINGY_HERE (src_cache >> srcoff)) & dst_change_mask); + BSTR_WWORD(timestamp, dst, dst_cache); + + if((uint64)(dstoff + len) < 0x20) + { + srcoff += len; + dstoff += len; + len = 0; + } + else + { + srcoff += (0x20 - dstoff); + dstoff = 0; + len -= (0x20 - dstoff); + dst += 4; + } + + if(srcoff >= 0x20) + { + srcoff &= 0x1F; + src += 4; + + if(len) + { + src_cache >>= 32; + src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; + } + } + } + + DO_BSTR_PRIMARY(); // while(len >= 32) (do allow interruption; interrupt and emulator-return - + // they must be handled differently!) + while(len >= 32) + { + dst_cache = BSTR_RWORD(timestamp, dst); + dst_cache = OP_THINGY_HERE(dst_cache, src_cache >> srcoff); + BSTR_WWORD(timestamp, dst, dst_cache); + len -= 32; + dst += 4; + src += 4; + src_cache >>= 32; + src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; + } + + DO_BSTR_EPILOGUE(); // if(len) { blah blah blah masking blah } + if(len) + { + uint32 dst_preserve_mask; + uint32 dst_change_mask; + + dst_preserve_mask = (1U << ((0x20 - len) & 0x1F) << len; + dst_change_mask = ~dst_preserve_mask; + + dst_cache = BSTR_RWORD(timestamp, dst); + dst_cache = OP_THINGY_HERE(dst_cache, src_cache >> srcoff); + BSTR_WWORD(timestamp, dst, dst_cache); + dstoff += len; + srcoff += len; + + if(srcoff >= 0x20) + { + srcoff &= 0x1F; + src += 4; + } + len = 0; + } +#endif + + switch(sub_op) + { + case ORBSU: DO_BSTR(BSTR_OP_OR); break; + + case ANDBSU: DO_BSTR(BSTR_OP_AND); break; + + case XORBSU: DO_BSTR(BSTR_OP_XOR); break; + + case MOVBSU: DO_BSTR(BSTR_OP_MOV); break; + + case ORNBSU: DO_BSTR(BSTR_OP_ORN); break; + + case ANDNBSU: DO_BSTR(BSTR_OP_ANDN); break; + + case XORNBSU: DO_BSTR(BSTR_OP_XORN); break; + + case NOTBSU: DO_BSTR(BSTR_OP_NOT); break; + } + + P_REG[26] = dstoff; + P_REG[27] = srcoff; + P_REG[28] = len; + P_REG[29] = dst; + P_REG[30] = src; + + return((bool)P_REG[28]); + } + else + { + printf("BSTR Search: %02x\n", sub_op); + return(Do_BSTR_Search(timestamp, ((sub_op & 1) ? -1 : 1), (sub_op & 0x2) >> 1)); + } + assert(0); + return(false); +} + +INLINE void V810::SetFPUOPNonFPUFlags(uint32 result) +{ + // Now, handle flag setting + SetFlag(PSW_OV, 0); + + if(!(result & 0x7FFFFFFF)) // Check to see if exponent and mantissa are 0 + { + // If Z flag is set, S and CY should be clear, even if it's negative 0(confirmed on real thing with subf.s, at least). + SetFlag(PSW_Z, 1); + SetFlag(PSW_S, 0); + SetFlag(PSW_CY, 0); + } + else + { + SetFlag(PSW_Z, 0); + SetFlag(PSW_S, result & 0x80000000); + SetFlag(PSW_CY, result & 0x80000000); + } + //printf("MEOW: %08x\n", S_REG[PSW] & (PSW_S | PSW_CY)); +} + +bool V810::FPU_DoesExceptionKillResult(void) +{ + const uint32 float_exception_flags = fpo.get_flags(); + + if(float_exception_flags & V810_FP_Ops::flag_reserved) + return(true); + + if(float_exception_flags & V810_FP_Ops::flag_invalid) + return(true); + + if(float_exception_flags & V810_FP_Ops::flag_divbyzero) + return(true); + + + // Return false here, so that the result of this calculation IS put in the output register. + // Wrap the exponent on overflow, rather than generating an infinity. The wrapping behavior is specified in IEE 754 AFAIK, + // and is useful in cases where you divide a huge number + // by another huge number, and fix the result afterwards based on the number of overflows that occurred. Probably requires some custom assembly code, + // though. And it's the kind of thing you'd see in an engineering or physics program, not in a perverted video game :b). + if(float_exception_flags & V810_FP_Ops::flag_overflow) + return(false); + + return(false); +} + +void V810::FPU_DoException(void) +{ + const uint32 float_exception_flags = fpo.get_flags(); + + if(float_exception_flags & V810_FP_Ops::flag_reserved) + { + S_REG[PSW] |= PSW_FRO; + + SetPC(GetPC() - 4); + Exception(FPU_HANDLER_ADDR, ECODE_FRO); + + return; + } + + if(float_exception_flags & V810_FP_Ops::flag_invalid) + { + S_REG[PSW] |= PSW_FIV; + + SetPC(GetPC() - 4); + Exception(FPU_HANDLER_ADDR, ECODE_FIV); + + return; + } + + if(float_exception_flags & V810_FP_Ops::flag_divbyzero) + { + S_REG[PSW] |= PSW_FZD; + + SetPC(GetPC() - 4); + Exception(FPU_HANDLER_ADDR, ECODE_FZD); + + return; + } + + if(float_exception_flags & V810_FP_Ops::flag_underflow) + { + S_REG[PSW] |= PSW_FUD; + } + + if(float_exception_flags & V810_FP_Ops::flag_inexact) + { + S_REG[PSW] |= PSW_FPR; + } + + // + // FPR can be set along with overflow, so put the overflow exception handling at the end here(for Exception() messes with PSW). + // + if(float_exception_flags & V810_FP_Ops::flag_overflow) + { + S_REG[PSW] |= PSW_FOV; + + SetPC(GetPC() - 4); + Exception(FPU_HANDLER_ADDR, ECODE_FOV); + } +} + +bool V810::IsSubnormal(uint32 fpval) +{ + if( ((fpval >> 23) & 0xFF) == 0 && (fpval & ((1 << 23) - 1)) ) + return(true); + + return(false); +} + +INLINE void V810::FPU_Math_Template(uint32 (V810_FP_Ops::*func)(uint32, uint32), uint32 arg1, uint32 arg2) +{ + uint32 result; + + fpo.clear_flags(); + result = (fpo.*func)(P_REG[arg1], P_REG[arg2]); + + if(!FPU_DoesExceptionKillResult()) + { + SetFPUOPNonFPUFlags(result); + SetPREG(arg1, result); + } + FPU_DoException(); +} + +void V810::fpu_subop(v810_timestamp_t ×tamp, int sub_op, int arg1, int arg2) +{ + //printf("FPU: %02x\n", sub_op); + if(VBMode) + { + switch(sub_op) + { + case XB: timestamp++; // Unknown + P_REG[arg1] = (P_REG[arg1] & 0xFFFF0000) | ((P_REG[arg1] & 0xFF) << 8) | ((P_REG[arg1] & 0xFF00) >> 8); + return; + + case XH: timestamp++; // Unknown + P_REG[arg1] = (P_REG[arg1] << 16) | (P_REG[arg1] >> 16); + return; + + // Does REV use arg1 or arg2 for the source register? + case REV: timestamp++; // Unknown + printf("Revvie bits\n"); + { + // Public-domain code snippet from: http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel + uint32 v = P_REG[arg2]; // 32-bit word to reverse bit order + + // swap odd and even bits + v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); + // swap consecutive pairs + v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); + // swap nibbles ... + v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); + // swap bytes + v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); + // swap 2-byte long pairs + v = ( v >> 16 ) | ( v << 16); + + P_REG[arg1] = v; + } + return; + + case MPYHW: timestamp += 9 - 1; // Unknown? + P_REG[arg1] = (int32)(int16)(P_REG[arg1] & 0xFFFF) * (int32)(int16)(P_REG[arg2] & 0xFFFF); + return; + } + } + + switch(sub_op) + { + // Virtual-Boy specific(probably!) + default: + { + SetPC(GetPC() - 4); + Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); + } + break; + + case CVT_WS: + timestamp += 5; + { + uint32 result; + + fpo.clear_flags(); + result = fpo.itof(P_REG[arg2]); + + if(!FPU_DoesExceptionKillResult()) + { + SetPREG(arg1, result); + SetFPUOPNonFPUFlags(result); + } + FPU_DoException(); + } + break; // End CVT.WS + + case CVT_SW: + timestamp += 8; + { + int32 result; + + fpo.clear_flags(); + result = fpo.ftoi(P_REG[arg2], false); + + if(!FPU_DoesExceptionKillResult()) + { + SetPREG(arg1, result); + SetFlag(PSW_OV, 0); + SetSZ(result); + } + FPU_DoException(); + } + break; // End CVT.SW + + case ADDF_S: timestamp += 8; + FPU_Math_Template(&V810_FP_Ops::add, arg1, arg2); + break; + + case SUBF_S: timestamp += 11; + FPU_Math_Template(&V810_FP_Ops::sub, arg1, arg2); + break; + + case CMPF_S: timestamp += 6; + // Don't handle this like subf.s because the flags + // have slightly different semantics(mostly regarding underflow/subnormal results) (confirmed on real V810). + fpo.clear_flags(); + { + int32 result; + + result = fpo.cmp(P_REG[arg1], P_REG[arg2]); + + if(!FPU_DoesExceptionKillResult()) + { + SetFPUOPNonFPUFlags(result); + } + FPU_DoException(); + } + break; + + case MULF_S: timestamp += 7; + FPU_Math_Template(&V810_FP_Ops::mul, arg1, arg2); + break; + + case DIVF_S: timestamp += 43; + FPU_Math_Template(&V810_FP_Ops::div, arg1, arg2); + break; + + case TRNC_SW: + timestamp += 7; + { + int32 result; + + fpo.clear_flags(); + result = fpo.ftoi(P_REG[arg2], true); + + if(!FPU_DoesExceptionKillResult()) + { + SetPREG(arg1, result); + SetFlag(PSW_OV, 0); + SetSZ(result); + } + FPU_DoException(); + } + break; // end TRNC.SW + } +} + +// Generate exception +void V810::Exception(uint32 handler, uint16 eCode) +{ + // Exception overhead is unknown. + +#ifdef WANT_DEBUGGER + if(ADDBT) + { + uint32 old_PC = GetPC(); + + if((eCode & 0xFFE0) == 0xFFA0) // Trap instruction(PC is pointing to next instruction at this point) + old_PC -= 2; + + ADDBT(old_PC, handler, eCode); + } +#endif + + printf("Exception: %08x %04x\n", handler, eCode); + + // Invalidate our bitstring state(forces the instruction to be re-read, and the r/w buffers reloaded). + in_bstr = FALSE; + have_src_cache = FALSE; + have_dst_cache = FALSE; + + if(S_REG[PSW] & PSW_NP) // Fatal exception + { + printf("Fatal exception; Code: %08x, ECR: %08x, PSW: %08x, PC: %08x\n", eCode, S_REG[ECR], S_REG[PSW], PC); + Halted = HALT_FATAL_EXCEPTION; + IPendingCache = 0; + return; + } + else if(S_REG[PSW] & PSW_EP) //Double Exception + { + S_REG[FEPC] = GetPC(); + S_REG[FEPSW] = S_REG[PSW]; + + S_REG[ECR] = (S_REG[ECR] & 0xFFFF) | (eCode << 16); + S_REG[PSW] |= PSW_NP; + S_REG[PSW] |= PSW_ID; + S_REG[PSW] &= ~PSW_AE; + + SetPC(0xFFFFFFD0); + IPendingCache = 0; + return; + } + else // Regular exception + { + S_REG[EIPC] = GetPC(); + S_REG[EIPSW] = S_REG[PSW]; + S_REG[ECR] = (S_REG[ECR] & 0xFFFF0000) | eCode; + S_REG[PSW] |= PSW_EP; + S_REG[PSW] |= PSW_ID; + S_REG[PSW] &= ~PSW_AE; + + SetPC(handler); + IPendingCache = 0; + return; + } +} + +void V810::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + PODFastVector cache_tag_temp; + PODFastVector cache_data_temp; + PODFastVector cache_data_valid_temp; + + uint32 PC_tmp = GetPC(); + + if(EmuMode == V810_EMU_MODE_ACCURATE) + { + cache_tag_temp.resize(128); + cache_data_temp.resize(128 * 2); + cache_data_valid_temp.resize(128 * 2); + + if(!load) + { + for(int i = 0; i < 128; i++) + { + cache_tag_temp[i] = Cache[i].tag; + + cache_data_temp[i * 2 + 0] = Cache[i].data[0]; + cache_data_temp[i * 2 + 1] = Cache[i].data[1]; + + cache_data_valid_temp[i * 2 + 0] = Cache[i].data_valid[0]; + cache_data_valid_temp[i * 2 + 1] = Cache[i].data_valid[1]; + } + } + else // If we're loading, go ahead and clear the cache temporaries, + // in case the save state was saved while in fast mode + // and the cache data isn't present and thus won't be loaded. + { + cache_tag_temp.fill(0); + cache_data_temp.fill(0); + cache_data_valid_temp.fill(false); + } + } + + int32 next_event_ts_delta = next_event_ts - v810_timestamp; + + SFORMAT StateRegs[] = + { + SFARRAY32(P_REG, 32), + SFARRAY32(S_REG, 32), + SFVARN(PC_tmp, "PC"), + SFVAR(Halted), + + SFVAR(lastop), + + SFARRAY32N(&cache_tag_temp[0], cache_tag_temp.size(), "cache_tag_temp"), + SFARRAY32N(&cache_data_temp[0], cache_data_temp.size(), "cache_data_temp"), + SFARRAYBN(&cache_data_valid_temp[0], cache_data_valid_temp.size(), "cache_data_valid_temp"), + + SFVAR(ilevel), // Perhaps remove in future? + SFVAR(next_event_ts_delta), + + // Bitstring stuff: + SFVAR(src_cache), + SFVAR(dst_cache), + SFVAR(have_src_cache), + SFVAR(have_dst_cache), + SFVAR(in_bstr), + SFVAR(in_bstr_to), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "V810"); + + if(load) + { + // std::max is sanity check for a corrupted save state to not crash emulation, + // std::min(0x7FF... is a sanity check and for the case where next_event_ts is set to an extremely large value to + // denote that it's not happening anytime soon, which could cause an overflow if our current timestamp is larger + // than what it was when the state was saved. + next_event_ts = std::max(v810_timestamp, std::min(0x7FFFFFFF, (int64)v810_timestamp + next_event_ts_delta)); + + RecalcIPendingCache(); + + SetPC(PC_tmp); + if(EmuMode == V810_EMU_MODE_ACCURATE) + { + for(int i = 0; i < 128; i++) + { + Cache[i].tag = cache_tag_temp[i]; + + Cache[i].data[0] = cache_data_temp[i * 2 + 0]; + Cache[i].data[1] = cache_data_temp[i * 2 + 1]; + + Cache[i].data_valid[0] = cache_data_valid_temp[i * 2 + 0]; + Cache[i].data_valid[1] = cache_data_valid_temp[i * 2 + 1]; + + //printf("%d %08x %08x %08x %d %d\n", i, Cache[i].tag << 10, Cache[i].data[0], Cache[i].data[1], Cache[i].data_valid[0], Cache[i].data_valid[1]); + } + } + } +} diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_cpu.h b/Mednafen/mednafen/hw_cpu/v810/v810_cpu.h new file mode 100644 index 0000000000..5e7ec29f6a --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_cpu.h @@ -0,0 +1,364 @@ +//////////////////////////////////////////////////////////////// +// Defines for the V810 CPU + +#ifndef V810_CPU_H_ +#define V810_CPU_H_ + +#include + +#include "v810_fp_ops.h" + +typedef int32 v810_timestamp_t; + +#define V810_FAST_MAP_SHIFT 16 +#define V810_FAST_MAP_PSIZE (1 << V810_FAST_MAP_SHIFT) +#define V810_FAST_MAP_TRAMPOLINE_SIZE 1024 + +// Exception codes +enum +{ + ECODE_TRAP_BASE = 0xFFA0, + ECODE_INVALID_OP = 0xFF90, + ECODE_ZERO_DIV = 0xFF80, // Integer divide by 0 + ECODE_FIV = 0xFF70, // Floating point invalid operation + ECODE_FZD = 0xFF68, // Floating point zero division + ECODE_FOV = 0xFF64, // Floating point overflow +//#define ECODE_FUD 0xFF62 // Floating point underflow(unused on V810) +//#define ECODE_FPR 0xFF61 // Floating point precision degradation(unused on V810) + ECODE_FRO = 0xFF60 // Floating point reserved operand +}; + +enum +{ + INVALID_OP_HANDLER_ADDR = 0xFFFFFF90, // Invalid opcode/instruction code! + ZERO_DIV_HANDLER_ADDR = 0xFFFFFF80, // Integer divide by 0 exception + FPU_HANDLER_ADDR = 0xFFFFFF60, // FPU exception + TRAP_HANDLER_BASE = 0xFFFFFFA0 // TRAP instruction +}; + +//System Register Defines (these are the only valid system registers!) +#define EIPC 0 //Exeption/Interupt PC +#define EIPSW 1 //Exeption/Interupt PSW + +#define FEPC 2 //Fatal Error PC +#define FEPSW 3 //Fatal Error PSW + +#define ECR 4 //Exception Cause Register +#define PSW 5 //Program Status Word +#define PIR 6 //Processor ID Register +#define TKCW 7 //Task Controll Word +#define CHCW 24 //Cashe Controll Word +#define ADDTRE 25 //ADDTRE + +//PSW Specifics +#define PSW_IA 0xF0000 // All Interupt bits... +#define PSW_I3 0x80000 +#define PSW_I2 0x40000 +#define PSW_I1 0x20000 +#define PSW_I0 0x10000 + +#define PSW_NP 0x08000 +#define PSW_EP 0x04000 + +#define PSW_AE 0x02000 + +#define PSW_ID 0x01000 + +#define PSW_FRO 0x00200 // Floating point reserved operand(set on denormal, NaN, or indefinite) +#define PSW_FIV 0x00100 // Floating point invalid operation(set when trying to convert a number too large to an (un)signed integer) + +#define PSW_FZD 0x00080 // Floating point divide by zero +#define PSW_FOV 0x00040 // Floating point overflow +#define PSW_FUD 0x00020 // Floating point underflow +#define PSW_FPR 0x00010 // Floating point precision degradation + +#define PSW_CY 0x00008 +#define PSW_OV 0x00004 +#define PSW_S 0x00002 +#define PSW_Z 0x00001 + +//condition codes +#define COND_V 0 +#define COND_C 1 +#define COND_Z 2 +#define COND_NH 3 +#define COND_S 4 +#define COND_T 5 +#define COND_LT 6 +#define COND_LE 7 +#define COND_NV 8 +#define COND_NC 9 +#define COND_NZ 10 +#define COND_H 11 +#define COND_NS 12 +#define COND_F 13 +#define COND_GE 14 +#define COND_GT 15 + +#define TESTCOND_V (S_REG[PSW]&PSW_OV) + +#define TESTCOND_L (S_REG[PSW]&PSW_CY) +#define TESTCOND_C TESTCOND_L + +#define TESTCOND_E (S_REG[PSW]&PSW_Z) +#define TESTCOND_Z TESTCOND_E + +#define TESTCOND_NH ( (S_REG[PSW]&PSW_Z) || (S_REG[PSW]&PSW_CY) ) +#define TESTCOND_N (S_REG[PSW]&PSW_S) +#define TESTCOND_S TESTCOND_N + +#define TESTCOND_LT ( (!!(S_REG[PSW]&PSW_S)) ^ (!!(S_REG[PSW]&PSW_OV)) ) +#define TESTCOND_LE ( ((!!(S_REG[PSW]&PSW_S)) ^ (!!(S_REG[PSW]&PSW_OV))) || (S_REG[PSW]&PSW_Z) ) +#define TESTCOND_NV (!(S_REG[PSW]&PSW_OV)) + +#define TESTCOND_NL (!(S_REG[PSW]&PSW_CY)) +#define TESTCOND_NC TESTCOND_NL + +#define TESTCOND_NE (!(S_REG[PSW]&PSW_Z)) +#define TESTCOND_NZ TESTCOND_NE + +#define TESTCOND_H ( !((S_REG[PSW]&PSW_Z) || (S_REG[PSW]&PSW_CY)) ) +#define TESTCOND_P (!(S_REG[PSW] & PSW_S)) +#define TESTCOND_NS TESTCOND_P + +#define TESTCOND_GE (!((!!(S_REG[PSW]&PSW_S))^(!!(S_REG[PSW]&PSW_OV)))) +#define TESTCOND_GT (! (((!!(S_REG[PSW]&PSW_S))^(!!(S_REG[PSW]&PSW_OV))) || (S_REG[PSW]&PSW_Z)) ) + +// Tag layout +// Bit 0-21: TAG31-TAG10 +// Bit 22-23: Validity bits(one for each 4-byte subblock) +// Bit 24-27: NECRV("Reserved") +// Bit 28-31: 0 + +typedef enum +{ + V810_EMU_MODE_FAST = 0, + V810_EMU_MODE_ACCURATE = 1, + _V810_EMU_MODE_COUNT +} V810_Emu_Mode; + +class V810 +{ + public: + + V810() MDFN_COLD; + ~V810() MDFN_COLD; + + // Pass TRUE for vb_mode if we're emulating a VB-specific enhanced V810 CPU core + bool Init(V810_Emu_Mode mode, bool vb_mode) MDFN_COLD; + void Kill(void) MDFN_COLD; + + void SetInt(int level); + + void SetMemWriteBus32(uint8 A, bool value) MDFN_COLD; + void SetMemReadBus32(uint8 A, bool value) MDFN_COLD; + + void SetMemReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) MDFN_COLD; + void SetMemWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) MDFN_COLD; + + void SetIOReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) MDFN_COLD; + void SetIOWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) MDFN_COLD; + + // Length specifies the number of bytes to map in, at each location specified by addresses[] (for mirroring) + uint8 *SetFastMap(uint32 addresses[], uint32 length, unsigned int num_addresses, const char *name) MDFN_COLD; + + INLINE void ResetTS(v810_timestamp_t new_base_timestamp) + { + assert(next_event_ts > v810_timestamp); + + next_event_ts -= (v810_timestamp - new_base_timestamp); + v810_timestamp = new_base_timestamp; + } + + INLINE void SetEventNT(const v810_timestamp_t timestamp) + { + next_event_ts = timestamp; + } + + INLINE v810_timestamp_t GetEventNT(void) + { + return(next_event_ts); + } + + v810_timestamp_t Run(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)); + void Exit(void); + + void Reset(void) MDFN_COLD; + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + #ifdef WANT_DEBUGGER + void CheckBreakpoints(void (*callback)(int type, uint32 address, uint32 value, unsigned int len), uint16 MDFN_FASTCALL (*peek16)(const v810_timestamp_t, uint32), uint32 MDFN_FASTCALL (*peek32)(const v810_timestamp_t, uint32)); + void SetCPUHook(void (*newhook)(const v810_timestamp_t timestamp, uint32 PC), void (*new_ADDBT)(uint32, uint32, uint32)); + #endif + + enum + { + GSREG_PR = 0, + GSREG_SR = 32, + GSREG_PC = 64, + GSREG_TIMESTAMP + }; + + uint32 GetRegister(unsigned int which, char *special, const uint32 special_len); + void SetRegister(unsigned int which, uint32 value); + + uint32 GetPC(void); + void SetPC(uint32); + + INLINE uint32 GetPR(unsigned int which) + { + return which ? P_REG[which] : 0; + } + + private: + + // Make sure P_REG[] is the first variable/array in this class, so non-zerfo offset encoding(at assembly level) isn't necessary to access it. + uint32 P_REG[32]; // Program registers pr0-pr31 + uint32 S_REG[32]; // System registers sr0-sr31 + uint32 PC; + uint8 *PC_ptr; + uint8 *PC_base; + + uint32 IPendingCache; + void RecalcIPendingCache(void); + + public: + v810_timestamp_t v810_timestamp; // Will never be less than 0. + + private: + v810_timestamp_t next_event_ts; + + enum + { + LASTOP_NORMAL = 0, + LASTOP_LOAD = 1, + LASTOP_STORE = 2, + LASTOP_IN = 3, + LASTOP_OUT = 4, + LASTOP_HEAVY_MATH = 5 + }; + + V810_Emu_Mode EmuMode; + bool VBMode; + + void Run_Fast(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; + void Run_Accurate(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; + + #ifdef WANT_DEBUGGER + void Run_Fast_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; + void Run_Accurate_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; + #endif + + uint8 MDFN_FASTCALL (*MemRead8)(v810_timestamp_t ×tamp, uint32 A); + uint16 MDFN_FASTCALL (*MemRead16)(v810_timestamp_t ×tamp, uint32 A); + uint32 MDFN_FASTCALL (*MemRead32)(v810_timestamp_t ×tamp, uint32 A); + + void MDFN_FASTCALL (*MemWrite8)(v810_timestamp_t ×tamp, uint32 A, uint8 V); + void MDFN_FASTCALL (*MemWrite16)(v810_timestamp_t ×tamp, uint32 A, uint16 V); + void MDFN_FASTCALL (*MemWrite32)(v810_timestamp_t ×tamp, uint32 A, uint32 V); + + uint8 MDFN_FASTCALL (*IORead8)(v810_timestamp_t ×tamp, uint32 A); + uint16 MDFN_FASTCALL (*IORead16)(v810_timestamp_t ×tamp, uint32 A); + uint32 MDFN_FASTCALL (*IORead32)(v810_timestamp_t ×tamp, uint32 A); + + void MDFN_FASTCALL (*IOWrite8)(v810_timestamp_t ×tamp, uint32 A, uint8 V); + void MDFN_FASTCALL (*IOWrite16)(v810_timestamp_t ×tamp, uint32 A, uint16 V); + void MDFN_FASTCALL (*IOWrite32)(v810_timestamp_t ×tamp, uint32 A, uint32 V); + + bool MemReadBus32[256]; // Corresponding to the upper 8 bits of the memory address map. + bool MemWriteBus32[256]; + + int32 lastop; // Set to -1 on FP/MUL/DIV, 0x100 on LD, 0x200 on ST, 0x400 on in, 0x800 on out, and the actual opcode * 2(or >= 0) on everything else. + + #define LASTOP_LD 0x100 + #define LASTOP_ST 0x200 + #define LASTOP_IN 0x400 + #define LASTOP_OUT 0x800 + + enum + { + HALT_NONE = 0, + HALT_HALT = 1, + HALT_FATAL_EXCEPTION = 2 + }; + + uint8 Halted; + + bool Running; + + int ilevel; + + bool in_bstr; + uint16 in_bstr_to; + + bool bstr_subop(v810_timestamp_t ×tamp, int sub_op, int arg1); + void fpu_subop(v810_timestamp_t ×tamp, int sub_op, int arg1, int arg2); + + void Exception(uint32 handler, uint16 eCode); + + // Caching-related: + typedef struct + { + uint32 tag; + uint32 data[2]; + bool data_valid[2]; + } V810_CacheEntry_t; + + V810_CacheEntry_t Cache[128]; + + // Bitstring variables. + uint32 src_cache; + uint32 dst_cache; + bool have_src_cache, have_dst_cache; + + uint8 *FastMap[(1ULL << 32) / V810_FAST_MAP_PSIZE]; + std::vector FastMapAllocList; + + + #ifdef WANT_DEBUGGER + void (*CPUHook)(const v810_timestamp_t timestamp, uint32 PC); + void (*ADDBT)(uint32 old_PC, uint32 new_PC, uint32); + #endif + + + // For CacheDump and CacheRestore + void CacheOpMemStore(v810_timestamp_t ×tamp, uint32 A, uint32 V); + uint32 CacheOpMemLoad(v810_timestamp_t ×tamp, uint32 A); + + void CacheClear(v810_timestamp_t ×tamp, uint32 start, uint32 count); + void CacheDump(v810_timestamp_t ×tamp, const uint32 SA); + void CacheRestore(v810_timestamp_t ×tamp, const uint32 SA); + + uint32 RDCACHE(v810_timestamp_t ×tamp, uint32 addr); + // + // End caching related + // + + uint16 RDOP(v810_timestamp_t ×tamp, uint32 addr, uint32 meow = 2); + void SetFlag(uint32 n, bool condition); + void SetSZ(uint32 value); + + void SetSREG(v810_timestamp_t ×tamp, unsigned int which, uint32 value); + uint32 GetSREG(unsigned int which); + + + bool IsSubnormal(uint32 fpval); + void FPU_Math_Template(uint32 (V810_FP_Ops::*func)(uint32, uint32), uint32 arg1, uint32 arg2); + void FPU_DoException(void); + bool CheckFPInputException(uint32 fpval); + bool FPU_DoesExceptionKillResult(void); + void SetFPUOPNonFPUFlags(uint32 result); + + + uint32 BSTR_RWORD(v810_timestamp_t ×tamp, uint32 A); + void BSTR_WWORD(v810_timestamp_t ×tamp, uint32 A, uint32 V); + bool Do_BSTR_Search(v810_timestamp_t ×tamp, const int inc_mul, unsigned int bit_test); + + V810_FP_Ops fpo; + + uint8 DummyRegion[V810_FAST_MAP_PSIZE + V810_FAST_MAP_TRAMPOLINE_SIZE]; +}; + +#endif + diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_cpuD.cpp b/Mednafen/mednafen/hw_cpu/v810/v810_cpuD.cpp new file mode 100644 index 0000000000..43807cf18e --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_cpuD.cpp @@ -0,0 +1,385 @@ +/* V810 Emulator + * + * Copyright (C) 2006 David Tucker + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +////////////////////////////////////////////////////////// +// CPU Debug routines + +//what do we realy need? +//#include +//#include +//#include +//#include + +#include +#include "v810_opt.h" +#include "v810_cpu.h" +#include "v810_cpuD.h" + + +//////////////////////////////////////////////////////////// +// Defines + +//Structure to store an element in our linked list +// used to dynamicaly dissasemble a rom +typedef struct dasms { + int offset; + uint32 PC; + uint32 jump; + struct dasms * nextElement; +} dasmS; + +typedef struct { + int addr_mode; // Addressing mode + const char * opname; // Opcode name (string) +} operation; + +static const operation optable[80] = { + { AM_I, "mov " }, // 0x00 + { AM_I, "add " }, // 0x01 + { AM_I, "sub " }, // 0x02 + { AM_I, "cmp " }, // 0x03 + { AM_I, "shl " }, // 0x04 + { AM_I, "shr " }, // 0x05 + { AM_I, "jmp " }, // 0x06 + { AM_I, "sar " }, // 0x07 + { AM_I, "mul " }, // 0x08 + { AM_I, "div " }, // 0x09 + { AM_I, "mulu " }, // 0x0A + { AM_I, "divu " }, // 0x0B + { AM_I, "or " }, // 0x0C + { AM_I, "and " }, // 0x0D + { AM_I, "xor " }, // 0x0E + { AM_I, "not " }, // 0x0F + + { AM_II, "mov " }, // 0x10 // Imediate + { AM_II, "add " }, // 0x11 + { AM_II, "setf " }, // 0x12 + { AM_II, "cmp " }, // 0x13 + { AM_II, "shl " }, // 0x14 + { AM_II, "shr " }, // 0x15 + {0x8000|AM_IX,"ei " }, // 0x16 // EI(VB only) + { AM_II, "sar " }, // 0x17 + { AM_II, "trap " }, // 0x18 + + { AM_IX, "reti " }, // 0x19 //BRKRETI + { AM_IX, "halt " }, // 0x1A //STBY + + {AM_UDEF, "??? " }, // 0x1B // Unknown + { AM_II, "ldsr " }, // 0x1C + { AM_II, "stsr " }, // 0x1D + {0x8000|AM_IX,"di " }, // 0x1E // DI(VB only) + {AM_BSTR, "BSTR " }, // 0x1F // Special Bit String Instructions + + {AM_UDEF, "??? " }, // 0x20 // Unknown // This is a fudg on our part + {AM_UDEF, "??? " }, // 0x21 // Unknown // We have 6 and 7 bit instructions + {AM_UDEF, "??? " }, // 0x22 // Unknown // this is filld in by the Conditional Branch Instructions + {AM_UDEF, "??? " }, // 0x23 // Unknown + {AM_UDEF, "??? " }, // 0x24 // Unknown + {AM_UDEF, "??? " }, // 0x25 // Unknown + {AM_UDEF, "??? " }, // 0x26 // Unknown + {AM_UDEF, "??? " }, // 0x27 // Unknown + + { AM_V, "movea" }, // 0x28 + { AM_V, "addi " }, // 0x29 + { AM_IV, "jr " }, // 0x2A + { AM_IV, "jal " }, // 0x2B + { AM_V, "ori " }, // 0x2C + { AM_V, "andi " }, // 0x2D + { AM_V, "xori " }, // 0x2E + { AM_V, "movhi" }, // 0x2F + + { AM_VIa, "ld.b " }, // 0x30 + { AM_VIa, "ld.h " }, // 0x31 + {AM_UDEF, "??? " }, // 0x32 // Unknown + { AM_VIa, "ld.w " }, // 0x33 + { AM_VIb, "st.b " }, // 0x34 + { AM_VIb, "st.h " }, // 0x35 + {AM_UDEF, "??? " }, // 0x36 // Unknown + { AM_VIb, "st.w " }, // 0x37 + { AM_VIa, "in.b " }, // 0x38 + { AM_VIa, "in.h " }, // 0x39 + { AM_VIa, "caxi " }, // 0x3A + { AM_VIa, "in.w " }, // 0x3B + { AM_VIb, "out.b" }, // 0x3C + { AM_VIb, "out.h" }, // 0x3D + { AM_FPP, "FPP " }, // 0x3E //Floating Point Instruction, Special Case + { AM_VIb, "out.w" }, // 0x3F + + { AM_III, "bv " }, // 0x40 + { AM_III, "bl " }, // 0x41 //BC 0x41 + { AM_III, "be " }, // 0x42 //BZ 0x42 + { AM_III, "bnh " }, // 0x43 + { AM_III, "bn " }, // 0x44 + { AM_III, "br " }, // 0x45 + { AM_III, "blt " }, // 0x46 + { AM_III, "ble " }, // 0x47 + { AM_III, "bnv " }, // 0x48 + { AM_III, "bnl " }, // 0x49 //BNC 0x49 + { AM_III, "bne " }, // 0x4A //BNZ 0x4A + { AM_III, "bh " }, // 0x4B + { AM_III, "bp " }, // 0x4C + { AM_III, "nop " }, // 0x4D + { AM_III, "bge " }, // 0x4E + { AM_III, "bgt " } // 0x4F +}; +// All instructions greater than 0x50 are undefined (this should not be posible of cource) + + +//Structure for holding the SubOpcodes, Same as above, without the InsType. +typedef struct { + const char * opname; // Opcode name (string) +} suboperation; + + +// Bit String Subopcodes +static const suboperation bssuboptable[16] = { + { "SCH0BSU" }, // 0x00 + { "SCH0BSD" }, // 0x01 + { "SCH1BSU" }, // 0x02 + { "SCH1BSD" }, // 0x03 + { "BError4" }, // 0x04 // Unknown + { "BError5" }, // 0x05 // Unknown + { "BError6" }, // 0x06 // Unknown + { "BError7" }, // 0x07 // Unknown + { "ORBSU " }, // 0x08 + { "ANDBSU " }, // 0x09 + { "XORBSU " }, // 0x0A + { "MOVBSU " }, // 0x0B + { "ORNBSU " }, // 0x0C + { "ANDNBSU" }, // 0x0D + { "XORNBSU" }, // 0x0E + { "NOTBSU " } // 0x0F +}; + +// Floating Point Subopcodes +static const suboperation fpsuboptable[16] = { + { "cmpf.s " }, // 0x00 + { "FError1" }, // 0x01 // Unknown + { "cvt.ws " }, // 0x02 + { "cvt.sw " }, // 0x03 + { "addf.s " }, // 0x04 + { "subf.s " }, // 0x05 + { "mulf.s " }, // 0x06 + { "divf.s " }, // 0x07 + + { "FError8" }, // 0x08 // Invalid + { "FError9" }, // 0x09 // Invalid + { "FErrorA" }, // 0x0A // Invalid + { "FErrorB" }, // 0x0B // Invalid + { "FErrorC" }, // 0x0C // Invalid + { "FErrorD" }, // 0x0D // Invalid + { "FErrorE" }, // 0x0E // Invalid + { "FErrorF" } // 0x0F // Invalid +}; + +static const suboperation fpsuboptable_vb[16] = { + { "cmpf.s " }, // 0x00 + { "FError1" }, // 0x01 // Unknown + { "cvt.ws " }, // 0x02 + { "cvt.sw " }, // 0x03 + { "addf.s " }, // 0x04 + { "subf.s " }, // 0x05 + { "mulf.s " }, // 0x06 + { "divf.s " }, // 0x07 + { "XB" }, // 0x08 // undocumented + { "XH" }, // 0x09 // undocumented //VFishing??? + { "REV" }, // 0x0A // undocumented + { "trnc.sw" }, // 0x0B + { "MPYHW" }, // 0x0C // undocumented + { "FErrorD" }, // 0x0D // Unknown + { "FErrorE" }, // 0x0E // Unknown + { "FErrorF" } // 0x0F // Unknown +}; + +static const char *pretty_preg_names[32] = +{ + "r0", "r1", "hsp", "sp", "gp", "tp", "r6", "r7", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", + "r24", "r25", "r26", "r27", "r28", "r29", "r30", "lp", +}; + +static const char *pretty_sreg_names[32] = +{ + "sr0(eipc)", "sr1(eipsw)", "sr2(fepc)", "sr3(fepsw)", "sr4(ecr)", "sr5(psw)", "sr6(pir)", "sr7(tkcw)", + "sr8(invalid)", "sr9(invalid)", "sr10(invalid)", "sr11(invalid)", "sr12(invalid)", "sr13(invalid)", + "sr14(invalid)", "sr15(invalid)", "sr16(invalid)", "sr17(invalid)", "sr18(invalid)", "sr19(invalid)", + "sr20(invalid)", "sr21(invalid)", "sr22(invalid)", "sr23(invalid)", + "sr24(chcw)", "sr25(adtre)", "sr26(invalid)", "sr27(invalid)", "sr28(invalid)", "sr29(invalid)", "sr30(invalid)", + "sr31(invalid)" +}; + +void v810_dis(uint32 &tPC, int num, char *buf, uint16 (*rhword)(uint32), bool vbmode) +{ + int lowB, highB, lowB2, highB2; // up to 4 bytes for instruction (either 16 or 32 bits) + int opcode, arg1, arg2, arg3; + int i = 0; + + buf[0] = 0; + + for(i = 0; i< num; i++) + { + const uint16 hw0 = rhword(tPC); + const uint16 hw1 = rhword(tPC + 2); + + lowB = hw0 & 0xFF; + highB = hw0 >> 8; + + lowB2 = hw1 & 0xFF; + highB2 = hw1 >> 8; + + opcode = highB >> 2; + if((highB & 0xE0) == 0x80) // Special opcode format for + opcode = (highB >> 1); // type III instructions. + + if((opcode > 0x4F) | (opcode < 0)) { + //Error Invalid opcode! + sprintf(&buf[strlen(buf)], "0x%04x", hw0); + tPC += 2; + } + + int am = optable[opcode].addr_mode; + + if((am & 0x8000) && !vbmode) + am = AM_UDEF; + + am &= ~0x8000; + + switch(am) { + case AM_I: // Do the same Ither way =) + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + if (opcode == JMP) { + sprintf(&buf[strlen(buf)],"%s [%s]", optable[opcode].opname, pretty_preg_names[arg2]); + } else { + sprintf(&buf[strlen(buf)],"%s %s, %s", optable[opcode].opname, pretty_preg_names[arg2], pretty_preg_names[arg1]); + } + tPC += 2; // 16 bit instruction + break; + case AM_II: + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + if(opcode == LDSR) { + sprintf(&buf[strlen(buf)],"%s %s, %s", optable[opcode].opname, pretty_preg_names[arg1], pretty_sreg_names[arg2]); + } else if(opcode == STSR) { + sprintf(&buf[strlen(buf)],"%s %s, %s", optable[opcode].opname, pretty_sreg_names[arg2], pretty_preg_names[arg1]); + } else if(opcode == ADD_I || opcode == CMP_I || opcode == MOV_I) { + sprintf(&buf[strlen(buf)],"%s %d, %s", optable[opcode].opname, sign_5(arg2), pretty_preg_names[arg1]); + } else { + sprintf(&buf[strlen(buf)],"%s %d, %s", optable[opcode].opname, arg2, pretty_preg_names[arg1]); + } + tPC += 2; // 16 bit instruction + break; + case AM_III: + arg1 = ((highB & 0x1) << 8) + (lowB & 0xFE); + if(opcode == NOP) + sprintf(&buf[strlen(buf)],"%s", optable[opcode].opname); + else + sprintf(&buf[strlen(buf)],"%s %08x", optable[opcode].opname, tPC + sign_9(arg1)); + tPC += 2; // 16 bit instruction + break; + case AM_IV: + arg1 = ((highB & 0x3) << 24) + (lowB << 16) + (highB2 << 8) + lowB2; + + sprintf(&buf[strlen(buf)],"%s %08x", optable[opcode].opname, tPC + sign_26(arg1)); + + tPC += 4; // 32 bit instruction + break; + case AM_V: + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + arg3 = (highB2 << 8) + lowB2; + + // TODO: What would be the best way to disassemble the MOVEA instruction? + //if(opcode == MOVEA) + // sprintf(&buf[strlen(buf)],"%s 0x%X, %s, %s", optable[opcode].opname, (uint32)(int32)(int16)(uint16)arg3, pretty_preg_names[arg2], pretty_preg_names[arg1] ); + //else + sprintf(&buf[strlen(buf)],"%s 0x%X, %s, %s", optable[opcode].opname, arg3, pretty_preg_names[arg2], pretty_preg_names[arg1] ); + tPC += 4; // 32 bit instruction + break; + case AM_VIa: // Mode6 form1 + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + arg3 = (highB2 << 8) + lowB2; + + if(!arg3) // Don't bother printing offset if it's 0 + sprintf(&buf[strlen(buf)],"%s [%s], %s", optable[opcode].opname, pretty_preg_names[arg2], pretty_preg_names[arg1]); + else if(sign_16(arg3) >= 0) // Make disassembly prettier if it's a positive offset + sprintf(&buf[strlen(buf)],"%s 0x%04x[%s], %s", optable[opcode].opname, sign_16(arg3), pretty_preg_names[arg2], pretty_preg_names[arg1]); + else + sprintf(&buf[strlen(buf)],"%s %d[%s], %s", optable[opcode].opname, sign_16(arg3), pretty_preg_names[arg2], pretty_preg_names[arg1]); + + tPC += 4; // 32 bit instruction + break; + case AM_VIb: // Mode6 form2 + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + arg3 = (highB2 << 8) + lowB2; // whats the order??? 2,3,1 or 1,3,2 + + if(!arg3) // Don't bother printing offset if it's 0 + sprintf(&buf[strlen(buf)],"%s %s, [%s]", optable[opcode].opname, pretty_preg_names[arg1], pretty_preg_names[arg2]); + else if(sign_16(arg3) >= 0) // Make disassembly prettier if it's a positive offset + sprintf(&buf[strlen(buf)],"%s %s, 0x%04x[%s]", optable[opcode].opname, pretty_preg_names[arg1], sign_16(arg3), pretty_preg_names[arg2]); + else + sprintf(&buf[strlen(buf)],"%s %s, %d[%s]", optable[opcode].opname, pretty_preg_names[arg1], sign_16(arg3), pretty_preg_names[arg2]); + tPC += 4; // 32 bit instruction + break; + case AM_VII: // Unhandled + sprintf(&buf[strlen(buf)],"0x%2x 0x%2x 0x%2x 0x%2x", lowB, highB, lowB2, highB2); + tPC +=4; // 32 bit instruction + break; + case AM_VIII: // Unhandled + sprintf(&buf[strlen(buf)],"0x%2x 0x%2x 0x%2x 0x%2x", lowB, highB, lowB2, highB2); + tPC += 4; // 32 bit instruction + break; + case AM_IX: + arg1 = (lowB & 0x1); // Mode ID, Ignore for now + sprintf(&buf[strlen(buf)],"%s", optable[opcode].opname); + tPC += 2; // 16 bit instruction + break; + case AM_BSTR: // Bit String Subopcodes + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + if(arg2 > 15) { + sprintf(&buf[strlen(buf)],"BError"); + } else { + //sprintf(&buf[strlen(buf)],"%s, $%d", bssuboptable[arg2].opname,arg1); + sprintf(&buf[strlen(buf)], "%s", bssuboptable[arg2].opname); + } + tPC += 2; // 16 bit instruction + break; + case AM_FPP: // Floating Point Subcode + arg1 = (lowB >> 5) + ((highB & 0x3) << 3); + arg2 = (lowB & 0x1F); + arg3 = (highB2 >> 2); + + if(arg3 > 15) { + sprintf(&buf[strlen(buf)],"(Invalid FPU: 0x%02x)", arg3); + } else { + sprintf(&buf[strlen(buf)],"%s %s, %s", (vbmode ? fpsuboptable_vb[arg3].opname : fpsuboptable[arg3].opname), pretty_preg_names[arg2], pretty_preg_names[arg1]); + } + tPC += 4; // 32 bit instruction + break; + case AM_UDEF: // Invalid opcode. + default: // Invalid opcode. + sprintf(&buf[strlen(buf)],"0x%04x", hw0); + tPC += 2; + } + } +} diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_cpuD.h b/Mednafen/mednafen/hw_cpu/v810/v810_cpuD.h new file mode 100644 index 0000000000..6169f418b8 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_cpuD.h @@ -0,0 +1,15 @@ +//////////////////////////////////////////////////////////////// +// Defines for the V810 CPU debug + +#ifndef V810_CPU_D_H_ +#define V810_CPU_D_H_ + +#include +#include +#include "v810_opt.h" + +// Dissasemble num lines of code starting at tPC (If tPC == -1 start at PC) +void v810_dis(uint32 &PC, int num, char *, uint16 (*rhword)(uint32), bool vbmode = false); + +#endif + diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_do_am.h b/Mednafen/mednafen/hw_cpu/v810/v810_do_am.h new file mode 100644 index 0000000000..9cc01568d3 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_do_am.h @@ -0,0 +1,72 @@ +#define DO_MOV_AM(); DO_AM_I(); +#define DO_ADD_AM(); DO_AM_I(); +#define DO_SUB_AM(); DO_AM_I(); +#define DO_CMP_AM(); DO_AM_I(); +#define DO_SHL_AM(); DO_AM_I(); +#define DO_SHR_AM(); DO_AM_I(); +#define DO_JMP_AM(); DO_AM_I(); +#define DO_SAR_AM(); DO_AM_I(); +#define DO_MUL_AM(); DO_AM_I(); +#define DO_DIV_AM(); DO_AM_I(); +#define DO_MULU_AM(); DO_AM_I(); +#define DO_DIVU_AM(); DO_AM_I(); +#define DO_OR_AM(); DO_AM_I(); +#define DO_AND_AM(); DO_AM_I(); +#define DO_XOR_AM(); DO_AM_I(); +#define DO_NOT_AM(); DO_AM_I(); +#define DO_MOV_I_AM(); DO_AM_II(); +#define DO_ADD_I_AM(); DO_AM_II(); +#define DO_SETF_AM(); DO_AM_II(); +#define DO_CMP_I_AM(); DO_AM_II(); +#define DO_SHL_I_AM(); DO_AM_II(); +#define DO_SHR_I_AM(); DO_AM_II(); +#define DO_EI_AM(); DO_AM_II(); +#define DO_SAR_I_AM(); DO_AM_II(); +#define DO_TRAP_AM(); DO_AM_II(); +#define DO_RETI_AM(); DO_AM_IX(); +#define DO_HALT_AM(); DO_AM_IX(); +#define DO_LDSR_AM(); DO_AM_II(); +#define DO_STSR_AM(); DO_AM_II(); +#define DO_DI_AM(); DO_AM_II(); +#define DO_BSTR_AM(); DO_AM_BSTR(); +#define DO_MOVEA_AM(); DO_AM_V(); +#define DO_ADDI_AM(); DO_AM_V(); +#define DO_JR_AM(); DO_AM_IV(); +#define DO_JAL_AM(); DO_AM_IV(); +#define DO_ORI_AM(); DO_AM_V(); +#define DO_ANDI_AM(); DO_AM_V(); +#define DO_XORI_AM(); DO_AM_V(); +#define DO_MOVHI_AM(); DO_AM_V(); +#define DO_LD_B_AM(); DO_AM_VIa(); +#define DO_LD_H_AM(); DO_AM_VIa(); +#define DO_LD_W_AM(); DO_AM_VIa(); +#define DO_ST_B_AM(); DO_AM_VIb(); +#define DO_ST_H_AM(); DO_AM_VIb(); +#define DO_ST_W_AM(); DO_AM_VIb(); +#define DO_IN_B_AM(); DO_AM_VIa(); +#define DO_IN_H_AM(); DO_AM_VIa(); +#define DO_CAXI_AM(); DO_AM_VIa(); +#define DO_IN_W_AM(); DO_AM_VIa(); +#define DO_OUT_B_AM(); DO_AM_VIb(); +#define DO_OUT_H_AM(); DO_AM_VIb(); +#define DO_FPP_AM(); DO_AM_FPP(); +#define DO_OUT_W_AM(); DO_AM_VIb(); +#define DO_BV_AM(); DO_AM_III(); +#define DO_BL_AM(); DO_AM_III(); +#define DO_BE_AM(); DO_AM_III(); +#define DO_BNH_AM(); DO_AM_III(); +#define DO_BN_AM(); DO_AM_III(); +#define DO_BR_AM(); DO_AM_III(); +#define DO_BLT_AM(); DO_AM_III(); +#define DO_BLE_AM(); DO_AM_III(); +#define DO_BNV_AM(); DO_AM_III(); +#define DO_BNL_AM(); DO_AM_III(); +#define DO_BNE_AM(); DO_AM_III(); +#define DO_BH_AM(); DO_AM_III(); +#define DO_BP_AM(); DO_AM_III(); +#define DO_NOP_AM(); DO_AM_III(); +#define DO_BGE_AM(); DO_AM_III(); +#define DO_BGT_AM(); DO_AM_III(); + + +#define DO_INVALID_AM(); DO_AM_UDEF(); diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_fp_ops.cpp b/Mednafen/mednafen/hw_cpu/v810/v810_fp_ops.cpp new file mode 100644 index 0000000000..c5fdb9bc61 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_fp_ops.cpp @@ -0,0 +1,450 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "v810_fp_ops.h" + +bool V810_FP_Ops::fp_is_zero(uint32 v) +{ + return((v & 0x7FFFFFFF) == 0); +} + +#if 0 +bool V810_FP_Ops::fp_is_nan(uint32 v) +{ + return((v & 0x7FFFFFFF) > (255 << 23)); +} + +bool V810_FP_Ops::fp_is_inf(uint32 v) +{ + return((v & 0x7FFFFFFF) == (255 << 23)); +} +#endif + +bool V810_FP_Ops::fp_is_inf_nan_sub(uint32 v) +{ + if((v & 0x7FFFFFFF) == 0) + return(false); + + switch((v >> 23) & 0xFF) + { + case 0x00: + case 0xff: + return(true); + } + return(false); +} + +unsigned V810_FP_Ops::clz64(uint64 v) +{ + unsigned ret = 0; + + if(!(v & 0xFFFFFFFFFFFFFFFFULL)) + return(64); + + if(!(v & 0xFFFFFFFF00000000ULL)) + { + v <<= 32; + ret += 32; + } + + if(!(v & 0xFFFF000000000000ULL)) + { + v <<= 16; + ret += 16; + } + + if(!(v & 0xFF00000000000000ULL)) + { + v <<= 8; + ret += 8; + } + + if(!(v & 0xF000000000000000ULL)) + { + v <<= 4; + ret += 4; + } + + if(!(v & 0xC000000000000000ULL)) + { + v <<= 2; + ret += 2; + } + + if(!(v & 0x8000000000000000ULL)) + { + v <<= 1; + ret += 1; + } + + return(ret); +} + +void V810_FP_Ops::fpim_decode(fpim* df, uint32 v) +{ + df->exp = ((v >> 23) & 0xFF) - 127; + df->f = (v & 0x7FFFFF) | ((v & 0x7FFFFFFF) ? 0x800000 : 0); + df->sign = v >> 31; +} + +void V810_FP_Ops::fpim_round(fpim* df) +{ + int vbc = 64 - clz64(df->f); + + if(vbc > 24) + { + const unsigned sa = vbc - 24; + + if(1) // round to nearest + { + uint64 old_f = df->f; + + df->f = (df->f + ((df->f >> sa) & 1) + ((1ULL << (sa - 1)) - 1)) & ~((1ULL << sa) - 1); + + if(df->f != old_f) + { + //printf("Inexact mr\n"); + exception_flags |= flag_inexact; + } + } + else + abort(); + } +} + +void V810_FP_Ops::fpim_round_int(fpim* df, bool truncate) +{ + if(df->exp < 23) + { + const unsigned sa = 23 - df->exp; + uint64 old_f = df->f; + + //if(sa >= 2) + // printf("RI: %lld, %d\n", df->f, sa); + + // round to nearest + if(sa > 24) + df->f = 0; + else + { + if(truncate) + df->f = df->f & ~((1ULL << sa) - 1); + else + df->f = (df->f + ((df->f >> sa) & 1) + ((1ULL << (sa - 1)) - 1)) & ~((1ULL << sa) - 1); + } + + if(df->f != old_f) + { + //printf("Inexact\n"); + exception_flags |= flag_inexact; + } + } +} + +uint32 V810_FP_Ops::fpim_encode(fpim* df) +{ + const int lzc = clz64(df->f); + int tmp_exp = df->exp - lzc; + uint64 tmp_walrus = df->f << (lzc & 0x3F); + int tmp_sign = df->sign; + + tmp_exp += 40; + tmp_walrus >>= 40; + + if(tmp_walrus == 0) + tmp_exp = -127; + else if(tmp_exp <= -127) + { + exception_flags |= flag_underflow | flag_inexact; + //printf("Subnormal: %lld. %d\n", tmp_walrus, tmp_exp); + if(1) + { + tmp_exp = -127; + tmp_walrus = 0; + } + else + { + tmp_walrus >>= -(tmp_exp + 126); + tmp_exp = -127; + } + } + else if(tmp_exp >= 128) + { + exception_flags |= flag_overflow; + //printf("Overflow!\n"); + + if(1) + tmp_exp -= 192; + else + { + tmp_exp = 128; + tmp_walrus = 0; + } + + } + return (tmp_sign << 31) | ((tmp_exp + 127) << 23) | (tmp_walrus & 0x7FFFFF); +} + +uint32 V810_FP_Ops::mul(uint32 a, uint32 b) +{ + fpim ins[2]; + fpim res; + + if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) + { + exception_flags |= flag_reserved; + return(~0U); + } + + fpim_decode(&ins[0], a); + fpim_decode(&ins[1], b); + + //printf("%08x %08x - %d %d %d - %d %d %d\n", a, b, a_exp, a_walrus, a_sign, b_exp, b_walrus, b_sign); + + res.exp = ins[0].exp + ins[1].exp - 23; + res.f = ins[0].f * ins[1].f; + res.sign = ins[0].sign ^ ins[1].sign; + + fpim_round(&res); + + return fpim_encode(&res); +} + +uint32 V810_FP_Ops::add(uint32 a, uint32 b) +{ + fpim ins[2]; + fpim res; + int64 ft[2]; + int64 tr; + int max_exp; + + if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) + { + exception_flags |= flag_reserved; + return(~0U); + } + + if(a == b && !(a & 0x7FFFFFFF)) + { + return(a & 0x80000000); + } + + fpim_decode(&ins[0], a); + fpim_decode(&ins[1], b); + + max_exp = std::max(ins[0].exp, ins[1].exp); + + //printf("%d:%08llx %d:%08llx\n", ins[0].exp, ins[0].f, ins[1].exp, ins[1].f); + + for(unsigned i = 0; i < 2; i++) + { + unsigned sd = (max_exp - ins[i].exp); + + ft[i] = ins[i].f << 24; + + if(sd >= 48) + { + if(ft[i] != 0) + ft[i] = 1; + } + else + { + int64 nft = ft[i] >> sd; + + if(ft[i] != (nft << sd)) + { + nft |= 1; + } + //{ + // puts("FPR"); + // } + + ft[i] = nft; + } + + if(ins[i].sign) + ft[i] = -ft[i]; + } + + //printf("SOON: %08llx %08llx\n", ft[0], ft[1]); + + tr = ft[0] + ft[1]; + if(tr < 0) + { + tr = -tr; + res.sign = true; + } + else + res.sign = false; + + res.f = tr; + res.exp = max_exp - 24; + + fpim_round(&res); + + return fpim_encode(&res); +} + +uint32 V810_FP_Ops::sub(uint32 a, uint32 b) +{ + return add(a, b ^ 0x80000000); +} + +uint32 V810_FP_Ops::div(uint32 a, uint32 b) +{ + fpim ins[2]; + fpim res; + uint64 mtmp; + + if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) + { + exception_flags |= flag_reserved; + return(~0U); + } + + if(fp_is_zero(a) && fp_is_zero(b)) + { + exception_flags |= flag_invalid; + return(~0U); + } + + fpim_decode(&ins[0], a); + fpim_decode(&ins[1], b); + + res.sign = ins[0].sign ^ ins[1].sign; + + if(ins[1].f == 0) + { + //puts("Divide by zero!"); + exception_flags |= flag_divbyzero; + return((res.sign << 31) | (255 << 23)); + } + else + { + res.exp = ins[0].exp - ins[1].exp - 2 - 1; // + 23 - 2; + res.f = ((ins[0].f << 24) / ins[1].f) << 2; + mtmp = ((ins[0].f << 24) % ins[1].f) << 1; + + //printf("%lld %lld\n", (ins[0].f << 23) % ins[1].f, ins[1].f); + + if(mtmp > ins[1].f) + res.f |= 3; + else if(mtmp == ins[1].f) + res.f |= 2; + else if(mtmp > 0) + res.f |= 1; + } + + fpim_round(&res); + + return fpim_encode(&res); +} + +int V810_FP_Ops::cmp(uint32 a, uint32 b) +{ + fpim ins[2]; + + if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) + { + exception_flags |= flag_reserved; + return(~0U); + } + + fpim_decode(&ins[0], a); + fpim_decode(&ins[1], b); + + if(ins[0].exp > ins[1].exp) + return(ins[0].sign ? -1 : 1); + + if(ins[0].exp < ins[1].exp) + return(ins[1].sign ? 1 : -1); + + if(ins[0].f > ins[1].f) + return(ins[0].sign ? -1 : 1); + + if(ins[0].f < ins[1].f) + return(ins[1].sign ? 1 : -1); + + if((ins[0].sign ^ ins[1].sign) && ins[0].f != 0) + return(ins[0].sign ? -1 : 1); + + return(0); +} + +uint32 V810_FP_Ops::itof(uint32 v) +{ + fpim res; + + res.sign = (bool)(v & 0x80000000); + res.exp = 23; + res.f = res.sign ? (0x80000000 - (v & 0x7FFFFFFF)) : (v & 0x7FFFFFFF); + + fpim_round(&res); + + return fpim_encode(&res); +} + + +uint32 V810_FP_Ops::ftoi(uint32 v, bool truncate) +{ + fpim ins; + int sa; + int ret; + + if(fp_is_inf_nan_sub(v)) + { + exception_flags |= flag_reserved; + return(~0U); + } + + fpim_decode(&ins, v); + fpim_round_int(&ins, truncate); + + sa = ins.exp - 23; + + if(sa < 0) + { + if(sa <= -32) + ret = 0; + else + ret = ins.f >> -sa; + } + else + { + if(sa >= 8) + { + if(sa == 8 && ins.f == 0x800000 && ins.sign) + return(0x80000000); + else + { + ret = ~0U; + exception_flags |= flag_invalid; + } + } + else + { + ret = ins.f << sa; + } + } + //printf("%d\n", sa); + + if(ins.sign) + ret = -ret; + + return(ret); +} + diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_fp_ops.h b/Mednafen/mednafen/hw_cpu/v810/v810_fp_ops.h new file mode 100644 index 0000000000..e603cc9734 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_fp_ops.h @@ -0,0 +1,73 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +class V810_FP_Ops +{ + public: + + uint32 mul(uint32 a, uint32 b); + uint32 div(uint32 a, uint32 b); + uint32 add(uint32 a, uint32 b); + uint32 sub(uint32 a, uint32 b); + int cmp(uint32 a, uint32 b); + + uint32 itof(uint32 v); + uint32 ftoi(uint32 v, bool truncate); + + enum + { + flag_invalid = 0x0001, + flag_divbyzero = 0x0002, + flag_overflow = 0x0004, + flag_underflow = 0x0008, + flag_inexact = 0x0010, + flag_reserved = 0x0020 + }; + + inline uint32 get_flags(void) + { + return exception_flags; + } + + inline void clear_flags(void) + { + exception_flags = 0; + } + + private: + + unsigned exception_flags; + + struct fpim + { + uint64 f; + int exp; + bool sign; + }; + + bool fp_is_zero(uint32 v); + bool fp_is_inf_nan_sub(uint32 v); + + unsigned clz64(uint64 v); + void fpim_decode(fpim* df, uint32 v); + void fpim_round(fpim* df); + void fpim_round_int(fpim* df, bool truncate = false); + uint32 fpim_encode(fpim* df); +}; + diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_oploop.inc b/Mednafen/mednafen/hw_cpu/v810/v810_oploop.inc new file mode 100644 index 0000000000..6b5015c744 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_oploop.inc @@ -0,0 +1,1130 @@ +/* V810 Emulator + * + * Copyright (C) 2006 David Tucker + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + + // Macro test taken from http://gcc.gnu.org/viewcvs/trunk/gcc/testsuite/gcc.dg/20020919-1.c?view=markup&pathrev=142696 + //#if defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2) + // register v810_timestamp_t timestamp_rl asm("15") = v810_timestamp; + //#elif defined(__x86_64__) + // register v810_timestamp_t timestamp_rl asm("r11") = v810_timestamp; + //#else + register v810_timestamp_t timestamp_rl = v810_timestamp; + //#endif + + uint32 opcode; + uint32 tmp2; + int val = 0; + + + #define ADDCLOCK(__n) { timestamp += __n; } + + #define CHECK_HALTED(); { if(Halted && timestamp < next_event_ts) { timestamp = next_event_ts; } } + + while(Running) + { + #ifdef RB_DEBUGMODE + uint32 old_PC = RB_GETPC(); + #endif + uint32 tmpop; + + assert(timestamp_rl <= next_event_ts); + + if(!IPendingCache) + { + if(Halted) + { + timestamp_rl = next_event_ts; + } + else if(in_bstr) + { + tmpop = in_bstr_to; + opcode = tmpop >> 9; + goto op_BSTR; + } + } + + while(timestamp_rl < next_event_ts) + { + #ifdef RB_DEBUGMODE + old_PC = RB_GETPC(); + #endif + + P_REG[0] = 0; //Zero the Zero Reg!!! + + RB_CPUHOOK(RB_GETPC()); + + { + //printf("%08x\n", RB_GETPC()); + { + v810_timestamp_t timestamp = timestamp_rl; + + tmpop = RB_RDOP(0, 0); + + timestamp_rl = timestamp; + } + + opcode = (tmpop >> 9) | IPendingCache; + + //printf("%02x\n", opcode >> 1); +#if HAVE_COMPUTED_GOTO + #define CGBEGIN static const void *const op_goto_table[256] = { + #define CGE(l) &&l, + #define CGEND }; goto *op_goto_table[opcode]; +#else + /* (uint8) cast for cheaper alternative to generated branch+compare bounds check instructions, but still more + expensive than computed goto which needs no masking nor bounds checking. + */ + #define CGBEGIN { enum { CGESB = 1 + __COUNTER__ }; switch((uint8)opcode) { + #define CGE(l) case __COUNTER__ - CGESB: goto l; + #define CGEND } } +#endif + + CGBEGIN + CGE(op_MOV) CGE(op_MOV) CGE(op_ADD) CGE(op_ADD) CGE(op_SUB) CGE(op_SUB) CGE(op_CMP) CGE(op_CMP) + CGE(op_SHL) CGE(op_SHL) CGE(op_SHR) CGE(op_SHR) CGE(op_JMP) CGE(op_JMP) CGE(op_SAR) CGE(op_SAR) + CGE(op_MUL) CGE(op_MUL) CGE(op_DIV) CGE(op_DIV) CGE(op_MULU) CGE(op_MULU) CGE(op_DIVU) CGE(op_DIVU) + CGE(op_OR) CGE(op_OR) CGE(op_AND) CGE(op_AND) CGE(op_XOR) CGE(op_XOR) CGE(op_NOT) CGE(op_NOT) + CGE(op_MOV_I) CGE(op_MOV_I) CGE(op_ADD_I) CGE(op_ADD_I) CGE(op_SETF) CGE(op_SETF) CGE(op_CMP_I) CGE(op_CMP_I) + CGE(op_SHL_I) CGE(op_SHL_I) CGE(op_SHR_I) CGE(op_SHR_I) CGE(op_EI) CGE(op_EI) CGE(op_SAR_I) CGE(op_SAR_I) + CGE(op_TRAP) CGE(op_TRAP) CGE(op_RETI) CGE(op_RETI) CGE(op_HALT) CGE(op_HALT) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_LDSR) CGE(op_LDSR) CGE(op_STSR) CGE(op_STSR) CGE(op_DI) CGE(op_DI) CGE(op_BSTR) CGE(op_BSTR) + CGE(op_BV) CGE(op_BL) CGE(op_BE) CGE(op_BNH) CGE(op_BN) CGE(op_BR) CGE(op_BLT) CGE(op_BLE) + CGE(op_BNV) CGE(op_BNL) CGE(op_BNE) CGE(op_BH) CGE(op_BP) CGE(op_NOP) CGE(op_BGE) CGE(op_BGT) + CGE(op_MOVEA) CGE(op_MOVEA) CGE(op_ADDI) CGE(op_ADDI) CGE(op_JR) CGE(op_JR) CGE(op_JAL) CGE(op_JAL) + CGE(op_ORI) CGE(op_ORI) CGE(op_ANDI) CGE(op_ANDI) CGE(op_XORI) CGE(op_XORI) CGE(op_MOVHI) CGE(op_MOVHI) + CGE(op_LD_B) CGE(op_LD_B) CGE(op_LD_H) CGE(op_LD_H) CGE(op_INVALID) CGE(op_INVALID) CGE(op_LD_W) CGE(op_LD_W) + CGE(op_ST_B) CGE(op_ST_B) CGE(op_ST_H) CGE(op_ST_H) CGE(op_INVALID) CGE(op_INVALID) CGE(op_ST_W) CGE(op_ST_W) + CGE(op_IN_B) CGE(op_IN_B) CGE(op_IN_H) CGE(op_IN_H) CGE(op_CAXI) CGE(op_CAXI) CGE(op_IN_W) CGE(op_IN_W) + CGE(op_OUT_B) CGE(op_OUT_B) CGE(op_OUT_H) CGE(op_OUT_H) CGE(op_FPP) CGE(op_FPP) CGE(op_OUT_W) CGE(op_OUT_W) + + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) + CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INT_HANDLER) + CGEND + + // Bit string subopcodes + #define DO_AM_BSTR() \ + const uint32 arg1 = (tmpop >> 5) & 0x1F; \ + const uint32 arg2 = (tmpop & 0x1F); \ + RB_INCPCBY2(); + + + #define DO_AM_FPP() \ + const uint32 arg1 = (tmpop >> 5) & 0x1F; \ + const uint32 arg2 = (tmpop & 0x1F); \ + const uint32 arg3 = ((RB_RDOP(2) >> 10)&0x3F); \ + RB_INCPCBY4(); + + + #define DO_AM_UDEF() \ + RB_INCPCBY2(); + + #define DO_AM_I() \ + const uint32 arg1 = tmpop & 0x1F; \ + const uint32 arg2 = (tmpop >> 5) & 0x1F; \ + RB_INCPCBY2(); + + #define DO_AM_II() DO_AM_I(); + + + #define DO_AM_IV() \ + const uint32 arg1 = ((tmpop & 0x000003FF) << 16) | RB_RDOP(2); \ + + + #define DO_AM_V() \ + const uint32 arg3 = (tmpop >> 5) & 0x1F; \ + const uint32 arg2 = tmpop & 0x1F; \ + const uint32 arg1 = RB_RDOP(2); \ + RB_INCPCBY4(); + + + #define DO_AM_VIa() \ + const uint32 arg1 = RB_RDOP(2); \ + const uint32 arg2 = tmpop & 0x1F; \ + const uint32 arg3 = (tmpop >> 5) & 0x1F; \ + RB_INCPCBY4(); \ + + + #define DO_AM_VIb() \ + const uint32 arg1 = (tmpop >> 5) & 0x1F; \ + const uint32 arg2 = RB_RDOP(2); \ + const uint32 arg3 = (tmpop & 0x1F); \ + RB_INCPCBY4(); \ + + #define DO_AM_IX() \ + const uint32 arg1 = (tmpop & 0x1); \ + RB_INCPCBY2(); \ + + #define DO_AM_III() \ + const uint32 arg1 = tmpop & 0x1FE; + + #include "v810_do_am.h" + + #define BEGIN_OP(meowtmpop) { op_##meowtmpop: v810_timestamp_t timestamp = timestamp_rl; DO_##meowtmpop ##_AM(); + #define END_OP() timestamp_rl = timestamp; goto OpFinished; } + #define END_OP_SKIPLO() timestamp_rl = timestamp; goto OpFinishedSkipLO; } + + BEGIN_OP(MOV); + ADDCLOCK(1); + SetPREG(arg2, P_REG[arg1]); + END_OP(); + + + BEGIN_OP(ADD); + ADDCLOCK(1); + uint32 temp = P_REG[arg2] + P_REG[arg1]; + + SetFlag(PSW_OV, ((P_REG[arg2]^(~P_REG[arg1]))&(P_REG[arg2]^temp))&0x80000000); + SetFlag(PSW_CY, temp < P_REG[arg2]); + + SetPREG(arg2, temp); + SetSZ(P_REG[arg2]); + END_OP(); + + + BEGIN_OP(SUB); + ADDCLOCK(1); + uint32 temp = P_REG[arg2] - P_REG[arg1]; + + SetFlag(PSW_OV, ((P_REG[arg2]^P_REG[arg1])&(P_REG[arg2]^temp))&0x80000000); + SetFlag(PSW_CY, temp > P_REG[arg2]); + + SetPREG(arg2, temp); + SetSZ(P_REG[arg2]); + END_OP(); + + + BEGIN_OP(CMP); + ADDCLOCK(1); + uint32 temp = P_REG[arg2] - P_REG[arg1]; + + SetSZ(temp); + SetFlag(PSW_OV, ((P_REG[arg2]^P_REG[arg1])&(P_REG[arg2]^temp))&0x80000000); + SetFlag(PSW_CY, temp > P_REG[arg2]); + END_OP(); + + + BEGIN_OP(SHL); + ADDCLOCK(1); + val = P_REG[arg1] & 0x1F; + + // set CY before we destroy the regisrer info.... + SetFlag(PSW_CY, (val != 0) && ((P_REG[arg2] >> (32 - val))&0x01) ); + SetFlag(PSW_OV, FALSE); + SetPREG(arg2, P_REG[arg2] << val); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(SHR); + ADDCLOCK(1); + val = P_REG[arg1] & 0x1F; + // set CY before we destroy the regisrer info.... + SetFlag(PSW_CY, (val) && ((P_REG[arg2] >> (val-1))&0x01)); + SetFlag(PSW_OV, FALSE); + SetPREG(arg2, P_REG[arg2] >> val); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(JMP); + + (void)arg2; // arg2 is unused. + + ADDCLOCK(3); + RB_SETPC((P_REG[arg1] & 0xFFFFFFFE)); + if(RB_AccurateMode) + { + BRANCH_ALIGN_CHECK(PC); + } + RB_ADDBT(old_PC, RB_GETPC(), 0); + END_OP(); + + BEGIN_OP(SAR); + ADDCLOCK(1); + val = P_REG[arg1] & 0x1F; + + SetFlag(PSW_CY, (val) && ((P_REG[arg2]>>(val-1))&0x01) ); + SetFlag(PSW_OV, FALSE); + + SetPREG(arg2, (uint32) ((int32)P_REG[arg2] >> val)); + + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(OR); + ADDCLOCK(1); + SetPREG(arg2, P_REG[arg1] | P_REG[arg2]); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(AND); + ADDCLOCK(1); + SetPREG(arg2, P_REG[arg1] & P_REG[arg2]); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(XOR); + ADDCLOCK(1); + SetPREG(arg2, P_REG[arg1] ^ P_REG[arg2]); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(NOT); + ADDCLOCK(1); + SetPREG(arg2, ~P_REG[arg1]); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(MOV_I); + ADDCLOCK(1); + SetPREG(arg2,sign_5(arg1)); + END_OP(); + + BEGIN_OP(ADD_I); + ADDCLOCK(1); + uint32 temp = P_REG[arg2] + sign_5(arg1); + + SetFlag(PSW_OV, ((P_REG[arg2]^(~sign_5(arg1)))&(P_REG[arg2]^temp))&0x80000000); + SetFlag(PSW_CY, (uint32)temp < P_REG[arg2]); + + SetPREG(arg2, (uint32)temp); + SetSZ(P_REG[arg2]); + END_OP(); + + + BEGIN_OP(SETF); + ADDCLOCK(1); + + P_REG[arg2] = 0; + + switch (arg1 & 0x0F) + { + case COND_V: + if (TESTCOND_V) P_REG[arg2] = 1; + break; + case COND_C: + if (TESTCOND_C) P_REG[arg2] = 1; + break; + case COND_Z: + if (TESTCOND_Z) P_REG[arg2] = 1; + break; + case COND_NH: + if (TESTCOND_NH) P_REG[arg2] = 1; + break; + case COND_S: + if (TESTCOND_S) P_REG[arg2] = 1; + break; + case COND_T: + P_REG[arg2] = 1; + break; + case COND_LT: + if (TESTCOND_LT) P_REG[arg2] = 1; + break; + case COND_LE: + if (TESTCOND_LE) P_REG[arg2] = 1; + break; + case COND_NV: + if (TESTCOND_NV) P_REG[arg2] = 1; + break; + case COND_NC: + if (TESTCOND_NC) P_REG[arg2] = 1; + break; + case COND_NZ: + if (TESTCOND_NZ) P_REG[arg2] = 1; + break; + case COND_H: + if (TESTCOND_H) P_REG[arg2] = 1; + break; + case COND_NS: + if (TESTCOND_NS) P_REG[arg2] = 1; + break; + case COND_F: + //always false! do nothing more + break; + case COND_GE: + if (TESTCOND_GE) P_REG[arg2] = 1; + break; + case COND_GT: + if (TESTCOND_GT) P_REG[arg2] = 1; + break; + } + END_OP(); + + BEGIN_OP(CMP_I); + ADDCLOCK(1); + uint32 temp = P_REG[arg2] - sign_5(arg1); + + SetSZ(temp); + SetFlag(PSW_OV, ((P_REG[arg2]^(sign_5(arg1)))&(P_REG[arg2]^temp))&0x80000000); + SetFlag(PSW_CY, temp > P_REG[arg2]); + END_OP(); + + BEGIN_OP(SHR_I); + ADDCLOCK(1); + SetFlag(PSW_CY, arg1 && ((P_REG[arg2] >> (arg1-1))&0x01) ); + // set CY before we destroy the regisrer info.... + SetPREG(arg2, P_REG[arg2] >> arg1); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(SHL_I); + ADDCLOCK(1); + SetFlag(PSW_CY, arg1 && ((P_REG[arg2] >> (32 - arg1))&0x01) ); + // set CY before we destroy the regisrer info.... + + SetPREG(arg2, P_REG[arg2] << arg1); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(SAR_I); + ADDCLOCK(1); + SetFlag(PSW_CY, arg1 && ((P_REG[arg2]>>(arg1-1))&0x01) ); + + SetPREG(arg2, (uint32) ((int32)P_REG[arg2] >> arg1)); + + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg2]); + END_OP(); + + BEGIN_OP(LDSR); // Loads a Sys Reg with the value in specified PR + ADDCLOCK(1); // ? + + SetSREG(timestamp, arg1 & 0x1F, P_REG[arg2 & 0x1F]); + END_OP(); + + BEGIN_OP(STSR); // Loads a PR with the value in specified Sys Reg + ADDCLOCK(1); // ? + P_REG[arg2 & 0x1F] = GetSREG(arg1 & 0x1F); + END_OP(); + + BEGIN_OP(EI); + (void)arg1; // arg1 is unused. + (void)arg2; // arg2 is unused. + + if(VBMode) + { + ADDCLOCK(1); + S_REG[PSW] = S_REG[PSW] &~ PSW_ID; + RecalcIPendingCache(); + } + else + { + ADDCLOCK(1); + RB_DECPCBY2(); + Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); + CHECK_HALTED(); + } + END_OP(); + + BEGIN_OP(DI); + (void)arg1; // arg1 is unused. + (void)arg2; // arg2 is unused. + + if(VBMode) + { + ADDCLOCK(1); + S_REG[PSW] |= PSW_ID; + IPendingCache = 0; + } + else + { + ADDCLOCK(1); + RB_DECPCBY2(); + Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); + CHECK_HALTED(); + } + END_OP(); + + + #define COND_BRANCH(cond) \ + if(cond) \ + { \ + ADDCLOCK(3); \ + RB_PCRELCHANGE(sign_9(arg1) & 0xFFFFFFFE); \ + if(RB_AccurateMode) \ + { \ + BRANCH_ALIGN_CHECK(PC); \ + } \ + RB_ADDBT(old_PC, RB_GETPC(), 0); \ + } \ + else \ + { \ + ADDCLOCK(1); \ + RB_INCPCBY2(); \ + } + + BEGIN_OP(BV); + COND_BRANCH(TESTCOND_V); + END_OP(); + + + BEGIN_OP(BL); + COND_BRANCH(TESTCOND_L); + END_OP(); + + BEGIN_OP(BE); + COND_BRANCH(TESTCOND_E); + END_OP(); + + BEGIN_OP(BNH); + COND_BRANCH(TESTCOND_NH); + END_OP(); + + BEGIN_OP(BN); + COND_BRANCH(TESTCOND_N); + END_OP(); + + BEGIN_OP(BR); + COND_BRANCH(TRUE); + END_OP(); + + BEGIN_OP(BLT); + COND_BRANCH(TESTCOND_LT); + END_OP(); + + BEGIN_OP(BLE); + COND_BRANCH(TESTCOND_LE); + END_OP(); + + BEGIN_OP(BNV); + COND_BRANCH(TESTCOND_NV); + END_OP(); + + BEGIN_OP(BNL); + COND_BRANCH(TESTCOND_NL); + END_OP(); + + BEGIN_OP(BNE); + COND_BRANCH(TESTCOND_NE); + END_OP(); + + BEGIN_OP(BH); + COND_BRANCH(TESTCOND_H); + END_OP(); + + BEGIN_OP(BP); + COND_BRANCH(TESTCOND_P); + END_OP(); + + BEGIN_OP(BGE); + COND_BRANCH(TESTCOND_GE); + END_OP(); + + BEGIN_OP(BGT); + COND_BRANCH(TESTCOND_GT); + END_OP(); + + BEGIN_OP(JR); + ADDCLOCK(3); + RB_PCRELCHANGE(sign_26(arg1) & 0xFFFFFFFE); + if(RB_AccurateMode) + { + BRANCH_ALIGN_CHECK(PC); + } + RB_ADDBT(old_PC, RB_GETPC(), 0); + END_OP(); + + BEGIN_OP(JAL); + ADDCLOCK(3); + P_REG[31] = RB_GETPC() + 4; + RB_PCRELCHANGE(sign_26(arg1) & 0xFFFFFFFE); + if(RB_AccurateMode) + { + BRANCH_ALIGN_CHECK(PC); + } + RB_ADDBT(old_PC, RB_GETPC(), 0); + END_OP(); + + BEGIN_OP(MOVEA); + ADDCLOCK(1); + SetPREG(arg3, P_REG[arg2] + sign_16(arg1)); + END_OP(); + + BEGIN_OP(ADDI); + ADDCLOCK(1); + uint32 temp = P_REG[arg2] + sign_16(arg1); + + SetFlag(PSW_OV, ((P_REG[arg2]^(~sign_16(arg1)))&(P_REG[arg2]^temp))&0x80000000); + SetFlag(PSW_CY, (uint32)temp < P_REG[arg2]); + + SetPREG(arg3, (uint32)temp); + SetSZ(P_REG[arg3]); + END_OP(); + + BEGIN_OP(ORI); + ADDCLOCK(1); + SetPREG(arg3, arg1 | P_REG[arg2]); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg3]); + END_OP(); + + BEGIN_OP(ANDI); + ADDCLOCK(1); + SetPREG(arg3, (arg1 & P_REG[arg2])); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg3]); + END_OP(); + + BEGIN_OP(XORI); + ADDCLOCK(1); + SetPREG(arg3, arg1 ^ P_REG[arg2]); + SetFlag(PSW_OV, FALSE); + SetSZ(P_REG[arg3]); + END_OP(); + + BEGIN_OP(MOVHI); + ADDCLOCK(1); + SetPREG(arg3, (arg1 << 16) + P_REG[arg2]); + END_OP(); + + // LD.B + BEGIN_OP(LD_B); + ADDCLOCK(1); + tmp2 = (sign_16(arg1)+P_REG[arg2])&0xFFFFFFFF; + + SetPREG(arg3, sign_8(MemRead8(timestamp, tmp2))); + + //should be 3 clocks when executed alone, 2 when precedes another LD, or 1 + //when precedes an instruction with many clocks (I'm guessing FP, MUL, DIV, etc) + if(lastop >= 0) + { + if(lastop == LASTOP_LD) + { + ADDCLOCK(1); + } + else + { + ADDCLOCK(2); + } + } + lastop = LASTOP_LD; + END_OP_SKIPLO(); + + // LD.H + BEGIN_OP(LD_H); + ADDCLOCK(1); + tmp2 = (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFE; + SetPREG(arg3, sign_16(MemRead16(timestamp, tmp2))); + + if(lastop >= 0) + { + if(lastop == LASTOP_LD) + { + ADDCLOCK(1); + } + else + { + ADDCLOCK(2); + } + } + lastop = LASTOP_LD; + END_OP_SKIPLO(); + + + // LD.W + BEGIN_OP(LD_W); + ADDCLOCK(1); + + tmp2 = (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFC; + + if(MemReadBus32[tmp2 >> 24]) + { + SetPREG(arg3, MemRead32(timestamp, tmp2)); + + if(lastop >= 0) + { + if(lastop == LASTOP_LD) + { + ADDCLOCK(1); + } + else + { + ADDCLOCK(2); + } + } + } + else + { + uint32 rv; + + rv = MemRead16(timestamp, tmp2); + rv |= MemRead16(timestamp, tmp2 | 2) << 16; + + SetPREG(arg3, rv); + + if(lastop >= 0) + { + if(lastop == LASTOP_LD) + { + ADDCLOCK(3); + } + else + { + ADDCLOCK(4); + } + } + } + lastop = LASTOP_LD; + END_OP_SKIPLO(); + + // ST.B + BEGIN_OP(ST_B); + ADDCLOCK(1); + MemWrite8(timestamp, sign_16(arg2)+P_REG[arg3], P_REG[arg1] & 0xFF); + + if(lastop == LASTOP_ST) + { + ADDCLOCK(1); + } + lastop = LASTOP_ST; + END_OP_SKIPLO(); + + // ST.H + BEGIN_OP(ST_H); + ADDCLOCK(1); + + MemWrite16(timestamp, (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFE, P_REG[arg1] & 0xFFFF); + + if(lastop == LASTOP_ST) + { + ADDCLOCK(1); + } + lastop = LASTOP_ST; + END_OP_SKIPLO(); + + // ST.W + BEGIN_OP(ST_W); + ADDCLOCK(1); + tmp2 = (sign_16(arg2)+P_REG[arg3]) & 0xFFFFFFFC; + + if(MemWriteBus32[tmp2 >> 24]) + { + MemWrite32(timestamp, tmp2, P_REG[arg1]); + + if(lastop == LASTOP_ST) + { + ADDCLOCK(1); + } + } + else + { + MemWrite16(timestamp, tmp2, P_REG[arg1] & 0xFFFF); + MemWrite16(timestamp, tmp2 | 2, P_REG[arg1] >> 16); + + if(lastop == LASTOP_ST) + { + ADDCLOCK(3); + } + } + lastop = LASTOP_ST; + END_OP_SKIPLO(); + + // IN.B + BEGIN_OP(IN_B); + { + ADDCLOCK(3); + SetPREG(arg3, IORead8(timestamp, sign_16(arg1)+P_REG[arg2])); + } + lastop = LASTOP_IN; + END_OP_SKIPLO(); + + + // IN.H + BEGIN_OP(IN_H); + { + ADDCLOCK(3); + SetPREG(arg3, IORead16(timestamp, (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFE)); + } + lastop = LASTOP_IN; + END_OP_SKIPLO(); + + + // IN.W + BEGIN_OP(IN_W); + if(IORead32) + { + ADDCLOCK(3); + SetPREG(arg3, IORead32(timestamp, (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFC)); + } + else + { + uint32 eff_addr = (sign_16(arg1) + P_REG[arg2]) & 0xFFFFFFFC; + uint32 rv; + + ADDCLOCK(5); + + rv = IORead16(timestamp, eff_addr); + rv |= IORead16(timestamp, eff_addr | 2) << 16; + + SetPREG(arg3, rv); + } + lastop = LASTOP_IN; + END_OP_SKIPLO(); + + + // OUT.B + BEGIN_OP(OUT_B); + ADDCLOCK(1); + IOWrite8(timestamp, sign_16(arg2)+P_REG[arg3],P_REG[arg1]&0xFF); + + if(lastop == LASTOP_OUT) + { + ADDCLOCK(1); + } + lastop = LASTOP_OUT; + END_OP_SKIPLO(); + + + // OUT.H + BEGIN_OP(OUT_H); + ADDCLOCK(1); + IOWrite16(timestamp, (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFE,P_REG[arg1]&0xFFFF); + + if(lastop == LASTOP_OUT) + { + ADDCLOCK(1); + } + lastop = LASTOP_OUT; + END_OP_SKIPLO(); + + + // OUT.W + BEGIN_OP(OUT_W); + ADDCLOCK(1); + + if(IOWrite32) + IOWrite32(timestamp, (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFC,P_REG[arg1]); + else + { + uint32 eff_addr = (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFC; + IOWrite16(timestamp, eff_addr, P_REG[arg1] & 0xFFFF); + IOWrite16(timestamp, eff_addr | 2, P_REG[arg1] >> 16); + } + + if(lastop == LASTOP_OUT) + { + if(IOWrite32) + { + ADDCLOCK(1); + } + else + { + ADDCLOCK(3); + } + } + lastop = LASTOP_OUT; + END_OP_SKIPLO(); + + BEGIN_OP(NOP); + (void)arg1; // arg1 is unused. + + ADDCLOCK(1); + RB_INCPCBY2(); + END_OP(); + + BEGIN_OP(RETI); + (void)arg1; // arg1 is unused. + + ADDCLOCK(10); + + //Return from Trap/Interupt + if(S_REG[PSW] & PSW_NP) { // Read the FE Reg + RB_SETPC(S_REG[FEPC] & 0xFFFFFFFE); + S_REG[PSW] = S_REG[FEPSW]; + } else { //Read the EI Reg Interupt + RB_SETPC(S_REG[EIPC] & 0xFFFFFFFE); + S_REG[PSW] = S_REG[EIPSW]; + } + RecalcIPendingCache(); + + RB_ADDBT(old_PC, RB_GETPC(), 0); + END_OP(); + + BEGIN_OP(MUL); + ADDCLOCK(13); + + uint64 temp = (int64)(int32)P_REG[arg1] * (int32)P_REG[arg2]; + + SetPREG(30, (uint32)(temp >> 32)); + SetPREG(arg2, temp); + SetSZ(P_REG[arg2]); + SetFlag(PSW_OV, temp != (uint64)(int64)(int32)(uint32)temp); + lastop = -1; + END_OP_SKIPLO(); + + BEGIN_OP(MULU); + ADDCLOCK(13); + uint64 temp = (uint64)P_REG[arg1] * (uint64)P_REG[arg2]; + + SetPREG(30, (uint32)(temp >> 32)); + SetPREG(arg2, (uint32)temp); + + SetSZ(P_REG[arg2]); + SetFlag(PSW_OV, temp != (uint32)temp); + lastop = -1; + END_OP_SKIPLO(); + + BEGIN_OP(DIVU); + ADDCLOCK(36); + if(P_REG[arg1] == 0) // Divide by zero! + { + RB_DECPCBY2(); + Exception(ZERO_DIV_HANDLER_ADDR, ECODE_ZERO_DIV); + CHECK_HALTED(); + } + else + { + // Careful here, since arg2 can be == 30 + uint32 quotient = (uint32)P_REG[arg2] / (uint32)P_REG[arg1]; + uint32 remainder = (uint32)P_REG[arg2] % (uint32)P_REG[arg1]; + + SetPREG(30, remainder); + SetPREG(arg2, quotient); + + SetFlag(PSW_OV, FALSE); + SetSZ(quotient); + } + lastop = -1; + END_OP_SKIPLO(); + + BEGIN_OP(DIV); + //if(P_REG[arg1] & P_REG[arg2] & 0x80000000) + //{ + // printf("Div: %08x %08x\n", P_REG[arg1], P_REG[arg2]); + //} + + ADDCLOCK(38); + if((uint32)P_REG[arg1] == 0) // Divide by zero! + { + RB_DECPCBY2(); + Exception(ZERO_DIV_HANDLER_ADDR, ECODE_ZERO_DIV); + CHECK_HALTED(); + } + else + { + if((P_REG[arg2]==0x80000000)&&(P_REG[arg1]==0xFFFFFFFF)) + { + SetFlag(PSW_OV, TRUE); + P_REG[30]=0; + SetPREG(arg2, 0x80000000); + SetSZ(P_REG[arg2]); + } + else + { + // Careful here, since arg2 can be == 30 + uint32 quotient = (int32)P_REG[arg2] / (int32)P_REG[arg1]; + uint32 remainder = (int32)P_REG[arg2] % (int32)P_REG[arg1]; + + SetPREG(30, remainder); + SetPREG(arg2, quotient); + + SetFlag(PSW_OV, FALSE); + SetSZ(quotient); + } + } + lastop = -1; + END_OP_SKIPLO(); + + BEGIN_OP(FPP); + ADDCLOCK(1); + fpu_subop(timestamp, arg3, arg1, arg2); + lastop = -1; + CHECK_HALTED(); + END_OP_SKIPLO(); + + BEGIN_OP(BSTR); + if(!in_bstr) + { + ADDCLOCK(1); + } + + if(bstr_subop(timestamp, arg2, arg1)) + { + RB_DECPCBY2(); + in_bstr = TRUE; + in_bstr_to = tmpop; + } + else + { + in_bstr = FALSE; + have_src_cache = have_dst_cache = FALSE; + } + END_OP(); + + BEGIN_OP(HALT); + (void)arg1; // arg1 is unused. + + ADDCLOCK(1); + Halted = HALT_HALT; + //printf("Untested opcode: HALT\n"); + END_OP(); + + BEGIN_OP(TRAP); + (void)arg2; // arg2 is unused. + + ADDCLOCK(15); + + Exception(TRAP_HANDLER_BASE + (arg1 & 0x10), ECODE_TRAP_BASE + (arg1 & 0x1F)); + CHECK_HALTED(); + END_OP(); + + BEGIN_OP(CAXI); + //printf("Untested opcode: caxi\n"); + + // Lock bus(N/A) + + ADDCLOCK(26); + + { + uint32 addr, tmp, compare_temp; + uint32 to_write; + + addr = sign_16(arg1) + P_REG[arg2]; + addr &= ~3; + + if(MemReadBus32[addr >> 24]) + tmp = MemRead32(timestamp, addr); + else + { + tmp = MemRead16(timestamp, addr); + tmp |= MemRead16(timestamp, addr | 2) << 16; + } + + compare_temp = P_REG[arg3] - tmp; + + SetSZ(compare_temp); + SetFlag(PSW_OV, ((P_REG[arg3]^tmp)&(P_REG[arg3]^compare_temp))&0x80000000); + SetFlag(PSW_CY, compare_temp > P_REG[arg3]); + + if(!compare_temp) // If they're equal... + to_write = P_REG[30]; + else + to_write = tmp; + + if(MemWriteBus32[addr >> 24]) + MemWrite32(timestamp, addr, to_write); + else + { + MemWrite16(timestamp, addr, to_write & 0xFFFF); + MemWrite16(timestamp, addr | 2, to_write >> 16); + } + P_REG[arg3] = tmp; + } + + // Unlock bus(N/A) + + END_OP(); + + + + op_INT_HANDLER: + { + int iNum = ilevel; + + S_REG[EIPC] = GetPC(); + S_REG[EIPSW] = S_REG[PSW]; + + SetPC(0xFFFFFE00 | (iNum << 4)); + + RB_ADDBT(old_PC, RB_GETPC(), 0xFE00 | (iNum << 4)); + + S_REG[ECR] = 0xFE00 | (iNum << 4); + + S_REG[PSW] |= PSW_EP; + S_REG[PSW] |= PSW_ID; + S_REG[PSW] &= ~PSW_AE; + + // Now, set need to set the interrupt enable level to he level that is being processed + 1, + // saturating at 15. + iNum++; + + if(iNum > 0x0F) + iNum = 0x0F; + + S_REG[PSW] &= ~PSW_IA; + S_REG[PSW] |= iNum << 16; + + // Accepting an interrupt takes us out of normal HALT status, of course! + Halted = HALT_NONE; + + // Invalidate our bitstring state(forces the instruction to be re-read, and the r/w buffers reloaded). + in_bstr = FALSE; + have_src_cache = FALSE; + have_dst_cache = FALSE; + + IPendingCache = 0; + + goto OpFinished; + } + + + BEGIN_OP(INVALID); + RB_DECPCBY2(); + if(!RB_AccurateMode) + { + RB_SETPC(RB_GETPC()); + if((uint32)(RB_RDOP(0, 0) >> 9) != opcode) + { + //printf("Trampoline: %08x %02x\n", RB_GETPC(), opcode >> 1); + } + else + { + ADDCLOCK(1); + Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); + CHECK_HALTED(); + } + } + else + { + ADDCLOCK(1); + Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); + CHECK_HALTED(); + } + END_OP(); + + } + + OpFinished: ; + lastop = opcode; + OpFinishedSkipLO: ; + } // end while(timestamp_rl < next_event_ts) + next_event_ts = event_handler(timestamp_rl); + //printf("Next: %d, Cur: %d\n", next_event_ts, timestamp); + } + +v810_timestamp = timestamp_rl; diff --git a/Mednafen/mednafen/hw_cpu/v810/v810_opt.h b/Mednafen/mednafen/hw_cpu/v810/v810_opt.h new file mode 100644 index 0000000000..585c50b269 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/v810/v810_opt.h @@ -0,0 +1,170 @@ +/////////////////////////////////////////////////////////////// +// File: v810_opt.h +// +// Description: Defines used in v810_dis.cpp +// + +#ifndef V810_OPT_H_ +#define V810_OPT_H_ + +#define sign_26(num) ((uint32)sign_x_to_s32(26, num)) +#define sign_16(num) ((uint32)(int16)(num)) +#define sign_14(num) ((uint32)sign_x_to_s32(14, num)) +#define sign_12(num) ((uint32)sign_x_to_s32(12, num)) +#define sign_9(num) ((uint32)sign_x_to_s32(9, num)) +#define sign_8(_value) ((uint32)(int8)(_value)) +#define sign_5(num) ((uint32)sign_x_to_s32(5, num)) + +/////////////////////////////////////////////////////////////////// +// Define Modes +#define AM_I 0x01 +#define AM_II 0x02 +#define AM_III 0x03 +#define AM_IV 0x04 +#define AM_V 0x05 +#define AM_VIa 0x06 // Mode6 form1 +#define AM_VIb 0x0A // Mode6 form2 +#define AM_VII 0x07 +#define AM_VIII 0x08 +#define AM_IX 0x09 +#define AM_BSTR 0x0B // Bit String Instructions +#define AM_FPP 0x0C // Floating Point Instructions +#define AM_UDEF 0x0D // Unknown/Undefined Instructions + +/////////////////////////////////////////////////////////////////// +// Table of Instructions Address Modes + +static const int addr_mode[80] = { + AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, + AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, + AM_II, AM_II, AM_II, AM_II, AM_II, AM_II, AM_II, AM_II, + AM_II, AM_IX, AM_IX, AM_UDEF, AM_II, AM_II, AM_II, AM_BSTR, + AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, + AM_V, AM_V, AM_IV, AM_IV, AM_V, AM_V, AM_V, AM_V, + AM_VIa, AM_VIa, AM_UDEF, AM_VIa, AM_VIb, AM_VIb, AM_UDEF, AM_VIb, + AM_VIa, AM_VIa, AM_VIa, AM_VIa, AM_VIb, AM_VIb, AM_FPP, AM_VIb, + AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, + AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III +}; +// All instructions greater than 0x50 are undefined (this should not be posible of cource) + + +/////////////////////////////////////////////////////////////////// +// Opcodes for V810 Instruction set +#define MOV 0x00 +#define ADD 0x01 +#define SUB 0x02 +#define CMP 0x03 +#define SHL 0x04 +#define SHR 0x05 +#define JMP 0x06 +#define SAR 0x07 +#define MUL 0x08 +#define DIV 0x09 +#define MULU 0x0A +#define DIVU 0x0B +#define OR 0x0C +#define AND 0x0D +#define XOR 0x0E +#define NOT 0x0F +#define MOV_I 0x10 +#define ADD_I 0x11 +#define SETF 0x12 +#define CMP_I 0x13 +#define SHL_I 0x14 +#define SHR_I 0x15 +#define EI 0x16 +#define SAR_I 0x17 +#define TRAP 0x18 +#define RETI 0x19 +#define HALT 0x1A + //0x1B +#define LDSR 0x1C +#define STSR 0x1D +#define DI 0x1E +#define BSTR 0x1F //Special Bit String Inst + //0x20 - 0x27 // Lost to Branch Instructions +#define MOVEA 0x28 +#define ADDI 0x29 +#define JR 0x2A +#define JAL 0x2B +#define ORI 0x2C +#define ANDI 0x2D +#define XORI 0x2E +#define MOVHI 0x2F +#define LD_B 0x30 +#define LD_H 0x31 + //0x32 +#define LD_W 0x33 +#define ST_B 0x34 +#define ST_H 0x35 + //0x36 +#define ST_W 0x37 +#define IN_B 0x38 +#define IN_H 0x39 +#define CAXI 0x3A +#define IN_W 0x3B +#define OUT_B 0x3C +#define OUT_H 0x3D +#define FPP 0x3E //Special Float Inst +#define OUT_W 0x3F + + +// Branch Instructions ( Extended opcode only for Branch command) +// Common instrcutions commented out + +#define BV 0x40 +#define BL 0x41 +#define BE 0x42 +#define BNH 0x43 +#define BN 0x44 +#define BR 0x45 +#define BLT 0x46 +#define BLE 0x47 +#define BNV 0x48 +#define BNL 0x49 +#define BNE 0x4A +#define BH 0x4B +#define BP 0x4C +#define NOP 0x4D +#define BGE 0x4E +#define BGT 0x4F + +//#define BC 0x41 +//#define BZ 0x42 +//#define BNC 0x49 +//#define BNZ 0x4A + +// Bit String Subopcodes +#define SCH0BSU 0x00 +#define SCH0BSD 0x01 +#define SCH1BSU 0x02 +#define SCH1BSD 0x03 + +#define ORBSU 0x08 +#define ANDBSU 0x09 +#define XORBSU 0x0A +#define MOVBSU 0x0B +#define ORNBSU 0x0C +#define ANDNBSU 0x0D +#define XORNBSU 0x0E +#define NOTBSU 0x0F + + +// Floating Point Subopcodes +#define CMPF_S 0x00 + +#define CVT_WS 0x02 +#define CVT_SW 0x03 +#define ADDF_S 0x04 +#define SUBF_S 0x05 +#define MULF_S 0x06 +#define DIVF_S 0x07 +#define XB 0x08 +#define XH 0x09 +#define REV 0x0A +#define TRNC_SW 0x0B +#define MPYHW 0x0C + +#endif //DEFINE_H + diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/opcodes_base.c b/Mednafen/mednafen/hw_cpu/z80-fuse/opcodes_base.c new file mode 100644 index 0000000000..f56121db70 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/opcodes_base.c @@ -0,0 +1,1123 @@ +/* opcodes_base.c: unshifted Z80 opcodes + Copyright (c) 1999-2003 Philip Kendall + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +/* NB: this file is autogenerated by 'z80.pl' from 'opcodes_base.dat', + and included in 'z80_ops.c' */ + + case 0x00: /* NOP */ + break; + case 0x01: /* LD BC,nnnn */ + C=Z80_RB_MACRO(PC++); + B=Z80_RB_MACRO(PC++); + break; + case 0x02: /* LD (BC),A */ + Z80_WB_MACRO(BC,A); + break; + case 0x03: /* INC BC */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + BC++; + break; + case 0x04: /* INC B */ + INC(B); + break; + case 0x05: /* DEC B */ + DEC(B); + break; + case 0x06: /* LD B,nn */ + B = Z80_RB_MACRO( PC++ ); + break; + case 0x07: /* RLCA */ + A = ( A << 1 ) | ( A >> 7 ); + F = ( F & ( FLAG_P | FLAG_Z | FLAG_S ) ) | + ( A & ( FLAG_C | FLAG_3 | FLAG_5 ) ); + break; + case 0x08: /* EX AF,AF' */ + { + uint16 wordtemp = AF; AF = AF_; AF_ = wordtemp; + } + break; + case 0x09: /* ADD HL,BC */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(HL,BC); + break; + case 0x0a: /* LD A,(BC) */ + A=Z80_RB_MACRO(BC); + break; + case 0x0b: /* DEC BC */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + BC--; + break; + case 0x0c: /* INC C */ + INC(C); + break; + case 0x0d: /* DEC C */ + DEC(C); + break; + case 0x0e: /* LD C,nn */ + C = Z80_RB_MACRO( PC++ ); + break; + case 0x0f: /* RRCA */ + F = ( F & ( FLAG_P | FLAG_Z | FLAG_S ) ) | ( A & FLAG_C ); + A = ( A >> 1) | ( A << 7 ); + F |= ( A & ( FLAG_3 | FLAG_5 ) ); + break; + case 0x10: /* DJNZ offset */ + contend_read_no_mreq( IR, 1 ); + B--; + if(B) { + JR(); + } else { + contend_read( PC, 3 ); + } + PC++; + break; + case 0x11: /* LD DE,nnnn */ + E=Z80_RB_MACRO(PC++); + D=Z80_RB_MACRO(PC++); + break; + case 0x12: /* LD (DE),A */ + Z80_WB_MACRO(DE,A); + break; + case 0x13: /* INC DE */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + DE++; + break; + case 0x14: /* INC D */ + INC(D); + break; + case 0x15: /* DEC D */ + DEC(D); + break; + case 0x16: /* LD D,nn */ + D = Z80_RB_MACRO( PC++ ); + break; + case 0x17: /* RLA */ + { + uint8 bytetemp = A; + A = ( A << 1 ) | ( F & FLAG_C ); + F = ( F & ( FLAG_P | FLAG_Z | FLAG_S ) ) | + ( A & ( FLAG_3 | FLAG_5 ) ) | ( bytetemp >> 7 ); + } + break; + case 0x18: /* JR offset */ + JR(); + PC++; + break; + case 0x19: /* ADD HL,DE */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(HL,DE); + break; + case 0x1a: /* LD A,(DE) */ + A=Z80_RB_MACRO(DE); + break; + case 0x1b: /* DEC DE */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + DE--; + break; + case 0x1c: /* INC E */ + INC(E); + break; + case 0x1d: /* DEC E */ + DEC(E); + break; + case 0x1e: /* LD E,nn */ + E = Z80_RB_MACRO( PC++ ); + break; + case 0x1f: /* RRA */ + { + uint8 bytetemp = A; + A = ( A >> 1 ) | ( F << 7 ); + F = ( F & ( FLAG_P | FLAG_Z | FLAG_S ) ) | + ( A & ( FLAG_3 | FLAG_5 ) ) | ( bytetemp & FLAG_C ) ; + } + break; + case 0x20: /* JR NZ,offset */ + if( ! ( F & FLAG_Z ) ) { + JR(); + } else { + contend_read( PC, 3 ); + } + PC++; + break; + case 0x21: /* LD HL,nnnn */ + L=Z80_RB_MACRO(PC++); + H=Z80_RB_MACRO(PC++); + break; + case 0x22: /* LD (nnnn),HL */ + LD16_NNRR(L,H); + break; + case 0x23: /* INC HL */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + HL++; + break; + case 0x24: /* INC H */ + INC(H); + break; + case 0x25: /* DEC H */ + DEC(H); + break; + case 0x26: /* LD H,nn */ + H = Z80_RB_MACRO( PC++ ); + break; + case 0x27: /* DAA */ + { + uint8 add = 0, carry = ( F & FLAG_C ); + if( ( F & FLAG_H ) || ( ( A & 0x0f ) > 9 ) ) add = 6; + if( carry || ( A > 0x99 ) ) add |= 0x60; + if( A > 0x99 ) carry = FLAG_C; + if( F & FLAG_N ) { + SUB(add); + } else { + ADD(add); + } + F = ( F & ~( FLAG_C | FLAG_P ) ) | carry | parity_table[A]; + } + break; + case 0x28: /* JR Z,offset */ + if( F & FLAG_Z ) { + JR(); + } else { + contend_read( PC, 3 ); + } + PC++; + break; + case 0x29: /* ADD HL,HL */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(HL,HL); + break; + case 0x2a: /* LD HL,(nnnn) */ + LD16_RRNN(L,H); + break; + case 0x2b: /* DEC HL */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + HL--; + break; + case 0x2c: /* INC L */ + INC(L); + break; + case 0x2d: /* DEC L */ + DEC(L); + break; + case 0x2e: /* LD L,nn */ + L = Z80_RB_MACRO( PC++ ); + break; + case 0x2f: /* CPL */ + A ^= 0xff; + F = ( F & ( FLAG_C | FLAG_P | FLAG_Z | FLAG_S ) ) | + ( A & ( FLAG_3 | FLAG_5 ) ) | ( FLAG_N | FLAG_H ); + break; + case 0x30: /* JR NC,offset */ + if( ! ( F & FLAG_C ) ) { + JR(); + } else { + contend_read( PC, 3 ); + } + PC++; + break; + case 0x31: /* LD SP,nnnn */ + SPL=Z80_RB_MACRO(PC++); + SPH=Z80_RB_MACRO(PC++); + break; + case 0x32: /* LD (nnnn),A */ + { + uint16 wordtemp = Z80_RB_MACRO( PC++ ); + wordtemp|=Z80_RB_MACRO(PC++) << 8; + Z80_WB_MACRO(wordtemp,A); + } + break; + case 0x33: /* INC SP */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SP++; + break; + case 0x34: /* INC (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + INC(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x35: /* DEC (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + DEC(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x36: /* LD (HL),nn */ + Z80_WB_MACRO(HL,Z80_RB_MACRO(PC++)); + break; + case 0x37: /* SCF */ + F = ( F & ( FLAG_P | FLAG_Z | FLAG_S ) ) | + ( A & ( FLAG_3 | FLAG_5 ) ) | + FLAG_C; + break; + case 0x38: /* JR C,offset */ + if( F & FLAG_C ) { + JR(); + } else { + contend_read( PC, 3 ); + } + PC++; + break; + case 0x39: /* ADD HL,SP */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(HL,SP); + break; + case 0x3a: /* LD A,(nnnn) */ + { + uint16 wordtemp; + wordtemp = Z80_RB_MACRO(PC++); + wordtemp|= ( Z80_RB_MACRO(PC++) << 8 ); + A=Z80_RB_MACRO(wordtemp); + } + break; + case 0x3b: /* DEC SP */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SP--; + break; + case 0x3c: /* INC A */ + INC(A); + break; + case 0x3d: /* DEC A */ + DEC(A); + break; + case 0x3e: /* LD A,nn */ + A = Z80_RB_MACRO( PC++ ); + break; + case 0x3f: /* CCF */ + F = ( F & ( FLAG_P | FLAG_Z | FLAG_S ) ) | + ( ( F & FLAG_C ) ? FLAG_H : FLAG_C ) | ( A & ( FLAG_3 | FLAG_5 ) ); + break; + case 0x40: /* LD B,B */ + break; + case 0x41: /* LD B,C */ + B=C; + break; + case 0x42: /* LD B,D */ + B=D; + break; + case 0x43: /* LD B,E */ + B=E; + break; + case 0x44: /* LD B,H */ + B=H; + break; + case 0x45: /* LD B,L */ + B=L; + break; + case 0x46: /* LD B,(HL) */ + B=Z80_RB_MACRO(HL); + break; + case 0x47: /* LD B,A */ + B=A; + break; + case 0x48: /* LD C,B */ + C=B; + break; + case 0x49: /* LD C,C */ + break; + case 0x4a: /* LD C,D */ + C=D; + break; + case 0x4b: /* LD C,E */ + C=E; + break; + case 0x4c: /* LD C,H */ + C=H; + break; + case 0x4d: /* LD C,L */ + C=L; + break; + case 0x4e: /* LD C,(HL) */ + C=Z80_RB_MACRO(HL); + break; + case 0x4f: /* LD C,A */ + C=A; + break; + case 0x50: /* LD D,B */ + D=B; + break; + case 0x51: /* LD D,C */ + D=C; + break; + case 0x52: /* LD D,D */ + break; + case 0x53: /* LD D,E */ + D=E; + break; + case 0x54: /* LD D,H */ + D=H; + break; + case 0x55: /* LD D,L */ + D=L; + break; + case 0x56: /* LD D,(HL) */ + D=Z80_RB_MACRO(HL); + break; + case 0x57: /* LD D,A */ + D=A; + break; + case 0x58: /* LD E,B */ + E=B; + break; + case 0x59: /* LD E,C */ + E=C; + break; + case 0x5a: /* LD E,D */ + E=D; + break; + case 0x5b: /* LD E,E */ + break; + case 0x5c: /* LD E,H */ + E=H; + break; + case 0x5d: /* LD E,L */ + E=L; + break; + case 0x5e: /* LD E,(HL) */ + E=Z80_RB_MACRO(HL); + break; + case 0x5f: /* LD E,A */ + E=A; + break; + case 0x60: /* LD H,B */ + H=B; + break; + case 0x61: /* LD H,C */ + H=C; + break; + case 0x62: /* LD H,D */ + H=D; + break; + case 0x63: /* LD H,E */ + H=E; + break; + case 0x64: /* LD H,H */ + break; + case 0x65: /* LD H,L */ + H=L; + break; + case 0x66: /* LD H,(HL) */ + H=Z80_RB_MACRO(HL); + break; + case 0x67: /* LD H,A */ + H=A; + break; + case 0x68: /* LD L,B */ + L=B; + break; + case 0x69: /* LD L,C */ + L=C; + break; + case 0x6a: /* LD L,D */ + L=D; + break; + case 0x6b: /* LD L,E */ + L=E; + break; + case 0x6c: /* LD L,H */ + L=H; + break; + case 0x6d: /* LD L,L */ + break; + case 0x6e: /* LD L,(HL) */ + L=Z80_RB_MACRO(HL); + break; + case 0x6f: /* LD L,A */ + L=A; + break; + case 0x70: /* LD (HL),B */ + Z80_WB_MACRO(HL,B); + break; + case 0x71: /* LD (HL),C */ + Z80_WB_MACRO(HL,C); + break; + case 0x72: /* LD (HL),D */ + Z80_WB_MACRO(HL,D); + break; + case 0x73: /* LD (HL),E */ + Z80_WB_MACRO(HL,E); + break; + case 0x74: /* LD (HL),H */ + Z80_WB_MACRO(HL,H); + break; + case 0x75: /* LD (HL),L */ + Z80_WB_MACRO(HL,L); + break; + case 0x76: /* HALT */ + z80.halted=1; + PC--; + break; + case 0x77: /* LD (HL),A */ + Z80_WB_MACRO(HL,A); + break; + case 0x78: /* LD A,B */ + A=B; + break; + case 0x79: /* LD A,C */ + A=C; + break; + case 0x7a: /* LD A,D */ + A=D; + break; + case 0x7b: /* LD A,E */ + A=E; + break; + case 0x7c: /* LD A,H */ + A=H; + break; + case 0x7d: /* LD A,L */ + A=L; + break; + case 0x7e: /* LD A,(HL) */ + A=Z80_RB_MACRO(HL); + break; + case 0x7f: /* LD A,A */ + break; + case 0x80: /* ADD A,B */ + ADD(B); + break; + case 0x81: /* ADD A,C */ + ADD(C); + break; + case 0x82: /* ADD A,D */ + ADD(D); + break; + case 0x83: /* ADD A,E */ + ADD(E); + break; + case 0x84: /* ADD A,H */ + ADD(H); + break; + case 0x85: /* ADD A,L */ + ADD(L); + break; + case 0x86: /* ADD A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + ADD(bytetemp); + } + break; + case 0x87: /* ADD A,A */ + ADD(A); + break; + case 0x88: /* ADC A,B */ + ADC(B); + break; + case 0x89: /* ADC A,C */ + ADC(C); + break; + case 0x8a: /* ADC A,D */ + ADC(D); + break; + case 0x8b: /* ADC A,E */ + ADC(E); + break; + case 0x8c: /* ADC A,H */ + ADC(H); + break; + case 0x8d: /* ADC A,L */ + ADC(L); + break; + case 0x8e: /* ADC A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + ADC(bytetemp); + } + break; + case 0x8f: /* ADC A,A */ + ADC(A); + break; + case 0x90: /* SUB A,B */ + SUB(B); + break; + case 0x91: /* SUB A,C */ + SUB(C); + break; + case 0x92: /* SUB A,D */ + SUB(D); + break; + case 0x93: /* SUB A,E */ + SUB(E); + break; + case 0x94: /* SUB A,H */ + SUB(H); + break; + case 0x95: /* SUB A,L */ + SUB(L); + break; + case 0x96: /* SUB A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + SUB(bytetemp); + } + break; + case 0x97: /* SUB A,A */ + SUB(A); + break; + case 0x98: /* SBC A,B */ + SBC(B); + break; + case 0x99: /* SBC A,C */ + SBC(C); + break; + case 0x9a: /* SBC A,D */ + SBC(D); + break; + case 0x9b: /* SBC A,E */ + SBC(E); + break; + case 0x9c: /* SBC A,H */ + SBC(H); + break; + case 0x9d: /* SBC A,L */ + SBC(L); + break; + case 0x9e: /* SBC A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + SBC(bytetemp); + } + break; + case 0x9f: /* SBC A,A */ + SBC(A); + break; + case 0xa0: /* AND A,B */ + AND(B); + break; + case 0xa1: /* AND A,C */ + AND(C); + break; + case 0xa2: /* AND A,D */ + AND(D); + break; + case 0xa3: /* AND A,E */ + AND(E); + break; + case 0xa4: /* AND A,H */ + AND(H); + break; + case 0xa5: /* AND A,L */ + AND(L); + break; + case 0xa6: /* AND A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + AND(bytetemp); + } + break; + case 0xa7: /* AND A,A */ + AND(A); + break; + case 0xa8: /* XOR A,B */ + XOR(B); + break; + case 0xa9: /* XOR A,C */ + XOR(C); + break; + case 0xaa: /* XOR A,D */ + XOR(D); + break; + case 0xab: /* XOR A,E */ + XOR(E); + break; + case 0xac: /* XOR A,H */ + XOR(H); + break; + case 0xad: /* XOR A,L */ + XOR(L); + break; + case 0xae: /* XOR A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + XOR(bytetemp); + } + break; + case 0xaf: /* XOR A,A */ + XOR(A); + break; + case 0xb0: /* OR A,B */ + OR(B); + break; + case 0xb1: /* OR A,C */ + OR(C); + break; + case 0xb2: /* OR A,D */ + OR(D); + break; + case 0xb3: /* OR A,E */ + OR(E); + break; + case 0xb4: /* OR A,H */ + OR(H); + break; + case 0xb5: /* OR A,L */ + OR(L); + break; + case 0xb6: /* OR A,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + OR(bytetemp); + } + break; + case 0xb7: /* OR A,A */ + OR(A); + break; + case 0xb8: /* CP B */ + CP(B); + break; + case 0xb9: /* CP C */ + CP(C); + break; + case 0xba: /* CP D */ + CP(D); + break; + case 0xbb: /* CP E */ + CP(E); + break; + case 0xbc: /* CP H */ + CP(H); + break; + case 0xbd: /* CP L */ + CP(L); + break; + case 0xbe: /* CP (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + CP(bytetemp); + } + break; + case 0xbf: /* CP A */ + CP(A); + break; + case 0xc0: /* RET NZ */ + contend_read_no_mreq( IR, 1 ); + if( ! ( F & FLAG_Z ) ) { RET(); } + break; + case 0xc1: /* POP BC */ + POP16(C,B); + break; + case 0xc2: /* JP NZ,nnnn */ + if( ! ( F & FLAG_Z ) ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xc3: /* JP nnnn */ + JP(); + break; + case 0xc4: /* CALL NZ,nnnn */ + if( ! ( F & FLAG_Z ) ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xc5: /* PUSH BC */ + contend_read_no_mreq( IR, 1 ); + PUSH16(C,B); + break; + case 0xc6: /* ADD A,nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + ADD(bytetemp); + } + break; + case 0xc7: /* RST 00 */ + contend_read_no_mreq( IR, 1 ); + RST(0x00); + break; + case 0xc8: /* RET Z */ + contend_read_no_mreq( IR, 1 ); + if( F & FLAG_Z ) { RET(); } + break; + case 0xc9: /* RET */ + RET(); + break; + case 0xca: /* JP Z,nnnn */ + if( F & FLAG_Z ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xcb: /* shift CB */ + { + uint8 opcode2; + opcode2 = Z80_RB_MACRO( PC ); + z80_tstates++; + PC++; + R++; + switch(opcode2) { +#include "z80_cb.c" + } + } + break; + case 0xcc: /* CALL Z,nnnn */ + if( F & FLAG_Z ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xcd: /* CALL nnnn */ + CALL(); + break; + case 0xce: /* ADC A,nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + ADC(bytetemp); + } + break; + case 0xcf: /* RST 8 */ + contend_read_no_mreq( IR, 1 ); + RST(0x08); + break; + case 0xd0: /* RET NC */ + contend_read_no_mreq( IR, 1 ); + if( ! ( F & FLAG_C ) ) { RET(); } + break; + case 0xd1: /* POP DE */ + POP16(E,D); + break; + case 0xd2: /* JP NC,nnnn */ + if( ! ( F & FLAG_C ) ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xd3: /* OUT (nn),A */ + { + uint16 outtemp; + outtemp = Z80_RB_MACRO( PC++ ) + ( A << 8 ); + Z80_WP_MACRO( outtemp, A ); + } + break; + case 0xd4: /* CALL NC,nnnn */ + if( ! ( F & FLAG_C ) ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xd5: /* PUSH DE */ + contend_read_no_mreq( IR, 1 ); + PUSH16(E,D); + break; + case 0xd6: /* SUB nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + SUB(bytetemp); + } + break; + case 0xd7: /* RST 10 */ + contend_read_no_mreq( IR, 1 ); + RST(0x10); + break; + case 0xd8: /* RET C */ + contend_read_no_mreq( IR, 1 ); + if( F & FLAG_C ) { RET(); } + break; + case 0xd9: /* EXX */ + { + uint16 wordtemp; + wordtemp = BC; BC = BC_; BC_ = wordtemp; + wordtemp = DE; DE = DE_; DE_ = wordtemp; + wordtemp = HL; HL = HL_; HL_ = wordtemp; + } + break; + case 0xda: /* JP C,nnnn */ + if( F & FLAG_C ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xdb: /* IN A,(nn) */ + { + uint16 intemp; + intemp = Z80_RB_MACRO( PC++ ) + ( A << 8 ); + A=Z80_RP_MACRO( intemp ); + } + break; + case 0xdc: /* CALL C,nnnn */ + if( F & FLAG_C ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xdd: /* shift DD */ + { + uint8 opcode2; + opcode2 = Z80_RB_MACRO( PC ); + z80_tstates++; + PC++; + R++; + switch(opcode2) { +#define REGISTER IX +#define REGISTERL IXL +#define REGISTERH IXH +#include "z80_ddfd.c" +#undef REGISTERH +#undef REGISTERL +#undef REGISTER + } + } + break; + case 0xde: /* SBC A,nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + SBC(bytetemp); + } + break; + case 0xdf: /* RST 18 */ + contend_read_no_mreq( IR, 1 ); + RST(0x18); + break; + case 0xe0: /* RET PO */ + contend_read_no_mreq( IR, 1 ); + if( ! ( F & FLAG_P ) ) { RET(); } + break; + case 0xe1: /* POP HL */ + POP16(L,H); + break; + case 0xe2: /* JP PO,nnnn */ + if( ! ( F & FLAG_P ) ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xe3: /* EX (SP),HL */ + { + uint8 bytetempl, bytetemph; + bytetempl = Z80_RB_MACRO( SP ); + bytetemph = Z80_RB_MACRO( SP + 1 ); contend_read_no_mreq( SP + 1, 1 ); + Z80_WB_MACRO( SP + 1, H ); + Z80_WB_MACRO( SP, L ); + contend_write_no_mreq( SP, 1 ); contend_write_no_mreq( SP, 1 ); + L=bytetempl; H=bytetemph; + } + break; + case 0xe4: /* CALL PO,nnnn */ + if( ! ( F & FLAG_P ) ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xe5: /* PUSH HL */ + contend_read_no_mreq( IR, 1 ); + PUSH16(L,H); + break; + case 0xe6: /* AND nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + AND(bytetemp); + } + break; + case 0xe7: /* RST 20 */ + contend_read_no_mreq( IR, 1 ); + RST(0x20); + break; + case 0xe8: /* RET PE */ + contend_read_no_mreq( IR, 1 ); + if( F & FLAG_P ) { RET(); } + break; + case 0xe9: /* JP HL */ + PC=HL; /* NB: NOT INDIRECT! */ + break; + case 0xea: /* JP PE,nnnn */ + if( F & FLAG_P ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xeb: /* EX DE,HL */ + { + uint16 wordtemp=DE; DE=HL; HL=wordtemp; + } + break; + case 0xec: /* CALL PE,nnnn */ + if( F & FLAG_P ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xed: /* shift ED */ + { + uint8 opcode2; + opcode2 = Z80_RB_MACRO( PC ); + z80_tstates++; + PC++; + R++; + switch(opcode2) { +#include "z80_ed.c" + } + } + break; + case 0xee: /* XOR A,nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + XOR(bytetemp); + } + break; + case 0xef: /* RST 28 */ + contend_read_no_mreq( IR, 1 ); + RST(0x28); + break; + case 0xf0: /* RET P */ + contend_read_no_mreq( IR, 1 ); + if( ! ( F & FLAG_S ) ) { RET(); } + break; + case 0xf1: /* POP AF */ + POP16(F,A); + break; + case 0xf2: /* JP P,nnnn */ + if( ! ( F & FLAG_S ) ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xf3: /* DI */ + IFF1=IFF2=0; + break; + case 0xf4: /* CALL P,nnnn */ + if( ! ( F & FLAG_S ) ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xf5: /* PUSH AF */ + contend_read_no_mreq( IR, 1 ); + PUSH16(F,A); + break; + case 0xf6: /* OR nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + OR(bytetemp); + } + break; + case 0xf7: /* RST 30 */ + contend_read_no_mreq( IR, 1 ); + RST(0x30); + break; + case 0xf8: /* RET M */ + contend_read_no_mreq( IR, 1 ); + if( F & FLAG_S ) { RET(); } + break; + case 0xf9: /* LD SP,HL */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SP = HL; + break; + case 0xfa: /* JP M,nnnn */ + if( F & FLAG_S ) { + JP(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xfb: /* EI */ + /* Interrupts are not accepted immediately after an EI, but are + accepted after the next instruction */ + IFF1 = IFF2 = 1; + z80.interrupts_enabled_at = z80_tstates; + //event_add( z80_tstates + 1, z80_interrupt_event ); + break; + case 0xfc: /* CALL M,nnnn */ + if( F & FLAG_S ) { + CALL(); + } else { + contend_read( PC, 3 ); contend_read( PC + 1, 3 ); PC += 2; + } + break; + case 0xfd: /* shift FD */ + { + uint8 opcode2; + opcode2 = Z80_RB_MACRO( PC ); + z80_tstates++; + PC++; + R++; + switch(opcode2) { +#define REGISTER IY +#define REGISTERL IYL +#define REGISTERH IYH +#include "z80_ddfd.c" +#undef REGISTERH +#undef REGISTERL +#undef REGISTER + } + } + break; + case 0xfe: /* CP nn */ + { + uint8 bytetemp = Z80_RB_MACRO( PC++ ); + CP(bytetemp); + } + break; + case 0xff: /* RST 38 */ + contend_read_no_mreq( IR, 1 ); + RST(0x38); + break; diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80.cpp b/Mednafen/mednafen/hw_cpu/z80-fuse/z80.cpp new file mode 100644 index 0000000000..b767bafa3a --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80.cpp @@ -0,0 +1,261 @@ +/* z80.c: z80 supplementary functions + Copyright (c) 1999-2003 Philip Kendall + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +#include "z80.h" +#include "z80_macros.h" + +void (*z80_writebyte)(uint16, uint8); +uint8 (*z80_readbyte)(uint16); +void (*z80_writeport)(uint16, uint8); +uint8 (*z80_readport)(uint16); + +/* Whether a half carry occurred or not can be determined by looking at + the 3rd bit of the two arguments and the result; these are hashed + into this table in the form r12, where r is the 3rd bit of the + result, 1 is the 3rd bit of the 1st argument and 2 is the + third bit of the 2nd argument; the tables differ for add and subtract + operations */ +const uint8 halfcarry_add_table[] = + { 0, FLAG_H, FLAG_H, FLAG_H, 0, 0, 0, FLAG_H }; +const uint8 halfcarry_sub_table[] = + { 0, 0, FLAG_H, 0, FLAG_H, 0, FLAG_H, FLAG_H }; + +/* Similarly, overflow can be determined by looking at the 7th bits; again + the hash into this table is r12 */ +const uint8 overflow_add_table[] = { 0, 0, 0, FLAG_V, FLAG_V, 0, 0, 0 }; +const uint8 overflow_sub_table[] = { 0, FLAG_V, 0, 0, 0, 0, FLAG_V, 0 }; + +/* Some more tables; initialised in z80_init_tables() */ + +uint8 sz53_table[0x100]; /* The S, Z, 5 and 3 bits of the index */ +uint8 parity_table[0x100]; /* The parity of the lookup value */ +uint8 sz53p_table[0x100]; /* OR the above two tables together */ + +/* This is what everything acts on! */ +processor z80; +uint64 z80_tstates; +uint64 last_z80_tstates; + +static void z80_init_tables(void); + +/* Set up the z80 emulation */ +void z80_init( void ) +{ + z80_init_tables(); +} + +/* Initalise the tables used to set flags */ +static void z80_init_tables(void) +{ + int i,j,k; + uint8 parity; + + for(i=0;i<0x100;i++) { + sz53_table[i]= i & ( FLAG_3 | FLAG_5 | FLAG_S ); + j=i; parity=0; + for(k=0;k<8;k++) { parity ^= j & 1; j >>=1; } + parity_table[i]= ( parity ? 0 : FLAG_P ); + sz53p_table[i] = sz53_table[i] | parity_table[i]; + } + + sz53_table[0] |= FLAG_Z; + sz53p_table[0] |= FLAG_Z; + +} + +/* Reset the z80 */ +void z80_reset( void ) +{ + AF =BC =DE =HL =0; + AF_=BC_=DE_=HL_=0; + IX=IY=0; + I=R=R7=0; + SP=PC=0; + IFF1=IFF2=IM=0; + z80.halted=0; + + z80.interrupts_enabled_at = -1; + z80_tstates = last_z80_tstates = 0; +} + +/* Process a z80 maskable interrupt */ +int z80_interrupt( void ) +{ + + if( IFF1 ) { + + /* If interrupts have just been enabled, don't accept the interrupt now, + but check after the next instruction has been executed */ + if( z80_tstates == z80.interrupts_enabled_at ) { + return 0; + } + + if( z80.halted ) { PC++; z80.halted = 0; } + + IFF1=IFF2=0; + + Z80_WB_MACRO( --SP, PCH ); Z80_WB_MACRO( --SP, PCL ); + + R++; + + switch(IM) { + case 0: PC = 0x0038; z80_tstates += 7; break; + case 1: PC = 0x0038; z80_tstates += 7; break; + case 2: + { + uint16 inttemp=(0x100*I)+0xff; + PCL = Z80_RB_MACRO(inttemp++); PCH = Z80_RB_MACRO(inttemp); + z80_tstates += 7; + break; + } + //default: + // ui_error( UI_ERROR_ERROR, "Unknown interrupt mode %d", IM ); + // fuse_abort(); + } + + return 1; /* Accepted an interrupt */ + + } else { + + return 0; /* Did not accept an interrupt */ + + } +} + +/* Process a z80 non-maskable interrupt */ +void z80_nmi( void ) +{ + if( z80.halted ) { PC++; z80.halted = 0; } + + IFF1 = 0; + + Z80_WB_MACRO( --SP, PCH ); Z80_WB_MACRO( --SP, PCL ); + + /* FIXME: how is R affected? */ + + /* FIXME: how does contention apply here? */ + z80_tstates += 11; PC = 0x0066; +} + +#if 0 +/* Routines for transferring the Z80 contents to and from snapshots */ +static void +z80_from_snapshot( libspectrum_snap *snap ) +{ + A = libspectrum_snap_a ( snap ); F = libspectrum_snap_f ( snap ); + A_ = libspectrum_snap_a_( snap ); F_ = libspectrum_snap_f_( snap ); + + BC = libspectrum_snap_bc ( snap ); DE = libspectrum_snap_de ( snap ); + HL = libspectrum_snap_hl ( snap ); BC_ = libspectrum_snap_bc_( snap ); + DE_ = libspectrum_snap_de_( snap ); HL_ = libspectrum_snap_hl_( snap ); + + IX = libspectrum_snap_ix( snap ); IY = libspectrum_snap_iy( snap ); + I = libspectrum_snap_i ( snap ); R = R7 = libspectrum_snap_r( snap ); + SP = libspectrum_snap_sp( snap ); PC = libspectrum_snap_pc( snap ); + + IFF1 = libspectrum_snap_iff1( snap ); IFF2 = libspectrum_snap_iff2( snap ); + IM = libspectrum_snap_im( snap ); + + z80.halted = libspectrum_snap_halted( snap ); + + z80.interrupts_enabled_at = + libspectrum_snap_last_instruction_ei( snap ) ? z80_tstates : -1; +} + +static void +z80_to_snapshot( libspectrum_snap *snap ) +{ + uint8 r_register; + + r_register = ( R7 & 0x80 ) | ( R & 0x7f ); + + libspectrum_snap_set_a ( snap, A ); libspectrum_snap_set_f ( snap, F ); + libspectrum_snap_set_a_ ( snap, A_ ); libspectrum_snap_set_f_ ( snap, F_ ); + + libspectrum_snap_set_bc ( snap, BC ); libspectrum_snap_set_de ( snap, DE ); + libspectrum_snap_set_hl ( snap, HL ); libspectrum_snap_set_bc_( snap, BC_ ); + libspectrum_snap_set_de_( snap, DE_ ); libspectrum_snap_set_hl_( snap, HL_ ); + + libspectrum_snap_set_ix ( snap, IX ); libspectrum_snap_set_iy ( snap, IY ); + libspectrum_snap_set_i ( snap, I ); + libspectrum_snap_set_r ( snap, r_register ); + libspectrum_snap_set_sp ( snap, SP ); libspectrum_snap_set_pc ( snap, PC ); + + libspectrum_snap_set_iff1( snap, IFF1 ); + libspectrum_snap_set_iff2( snap, IFF2 ); + libspectrum_snap_set_im( snap, IM ); + + libspectrum_snap_set_halted( snap, z80.halted ); + libspectrum_snap_set_last_instruction_ei( + snap, z80.interrupts_enabled_at == z80_tstates + ); +} +#endif + + + +void z80_state_action(StateMem *sm, const unsigned load, const bool data_only, const char *section_name) +{ + uint8 r_register; + + SFORMAT StateRegs[] = + { + SFVARN(z80.af.w, "AF"), + SFVARN(z80.bc.w, "BC"), + SFVARN(z80.de.w, "DE"), + SFVARN(z80.hl.w, "HL"), + SFVARN(z80.af_.w, "AF_"), + SFVARN(z80.bc_.w, "BC_"), + SFVARN(z80.de_.w, "DE_"), + SFVARN(z80.hl_.w, "HL_"), + SFVARN(z80.ix.w, "IX"), + SFVARN(z80.iy.w, "IY"), + SFVARN(z80.i, "I"), + SFVARN(z80.sp.w, "SP"), + SFVARN(z80.pc.w, "PC"), + SFVARN(z80.iff1, "IFF1"), + SFVARN(z80.iff2, "IFF2"), + SFVARN(z80.im, "IM"), + SFVARN(r_register, "R"), + + SFVARN(z80.interrupts_enabled_at, "interrupts_enabled_at"), + SFVARN(z80.halted, "halted"), + + SFVAR(z80_tstates), + SFVAR(last_z80_tstates), + + SFEND + }; + + if(!load) + r_register = (z80.r7 & 0x80) | (z80.r & 0x7f); + + MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + + if(load) + { + z80.r7 = r_register & 0x80; + z80.r = r_register & 0x7F; + } +} + diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80.h b/Mednafen/mednafen/hw_cpu/z80-fuse/z80.h new file mode 100644 index 0000000000..f5c7423640 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80.h @@ -0,0 +1,122 @@ +/* z80.h: z80 emulation core + Copyright (c) 1999-2003 Philip Kendall + + $Id: z80.h 4640 2012-01-21 13:26:35Z pak21 $ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +#ifndef FUSE_Z80_H +#define FUSE_Z80_H + +#include +#include + +/* Union allowing a register pair to be accessed as bytes or as a word */ +typedef union { +#ifdef MSB_FIRST + struct { uint8 h,l; } b; +#else + struct { uint8 l,h; } b; +#endif + uint16 w; +} regpair; + +/* What's stored in the main processor */ +typedef struct { + regpair af,bc,de,hl; + regpair af_,bc_,de_,hl_; + regpair ix,iy; + uint8 i; + uint16 r; /* The low seven bits of the R register. 16 bits long + so it can also act as an RZX instruction counter */ + uint8 r7; /* The high bit of the R register */ + regpair sp,pc; + uint8 iff1, iff2, im; + int halted; + + /* Interrupts were enabled at this time; do not accept any interrupts + until z80_tstates > this value */ + int32 interrupts_enabled_at; + +} processor; + +void z80_init( void ); +void z80_reset( void ); + +int z80_interrupt( void ); +void z80_nmi( void ); + +int z80_do_opcode(void); + +void z80_enable_interrupts( void ); + +extern processor z80; +inline uint16 z80_getpc(void) { return z80.pc.w; } +extern const uint8 halfcarry_add_table[]; +extern const uint8 halfcarry_sub_table[]; +extern const uint8 overflow_add_table[]; +extern const uint8 overflow_sub_table[]; +extern uint8 sz53_table[]; +extern uint8 sz53p_table[]; +extern uint8 parity_table[]; + +extern uint64 z80_tstates, last_z80_tstates; + +extern void (*z80_writebyte)(uint16, uint8); +extern uint8 (*z80_readbyte)(uint16); +extern void (*z80_writeport)(uint16, uint8); +extern uint8 (*z80_readport)(uint16); + +// Ok, I lied, not a macro! + +//Write mem +static INLINE void Z80_WB_MACRO(uint16 A, uint8 V) +{ + z80_tstates += 3; + z80_writebyte(A, V); +} + +// Write port +static INLINE void Z80_WP_MACRO(uint16 A, uint8 V) +{ + z80_tstates += 4; + z80_writeport(A, V); +} + +// Read mem +static INLINE uint8 Z80_RB_MACRO(uint16 A) +{ + z80_tstates += 3; + return(z80_readbyte(A)); +} + +// Read port +static INLINE uint8 Z80_RP_MACRO(uint16 A) +{ + z80_tstates += 4; + return(z80_readport(A)); +} + + +void z80_set_interrupt(int set); +void z80_state_action(StateMem *sm, const unsigned load, const bool data_only, const char *section_name); + +#endif /* #ifndef FUSE_Z80_H */ diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80_cb.c b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_cb.c new file mode 100644 index 0000000000..aba27af952 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_cb.c @@ -0,0 +1,930 @@ +/* z80_cb.c: Z80 CBxx opcodes + Copyright (c) 1999-2003 Philip Kendall + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +/* NB: this file is autogenerated by 'z80.pl' from 'opcodes_cb.dat', + and included in 'z80_ops.c' */ + + case 0x00: /* RLC B */ + RLC(B); + break; + case 0x01: /* RLC C */ + RLC(C); + break; + case 0x02: /* RLC D */ + RLC(D); + break; + case 0x03: /* RLC E */ + RLC(E); + break; + case 0x04: /* RLC H */ + RLC(H); + break; + case 0x05: /* RLC L */ + RLC(L); + break; + case 0x06: /* RLC (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + RLC(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x07: /* RLC A */ + RLC(A); + break; + case 0x08: /* RRC B */ + RRC(B); + break; + case 0x09: /* RRC C */ + RRC(C); + break; + case 0x0a: /* RRC D */ + RRC(D); + break; + case 0x0b: /* RRC E */ + RRC(E); + break; + case 0x0c: /* RRC H */ + RRC(H); + break; + case 0x0d: /* RRC L */ + RRC(L); + break; + case 0x0e: /* RRC (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + RRC(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x0f: /* RRC A */ + RRC(A); + break; + case 0x10: /* RL B */ + RL(B); + break; + case 0x11: /* RL C */ + RL(C); + break; + case 0x12: /* RL D */ + RL(D); + break; + case 0x13: /* RL E */ + RL(E); + break; + case 0x14: /* RL H */ + RL(H); + break; + case 0x15: /* RL L */ + RL(L); + break; + case 0x16: /* RL (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + RL(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x17: /* RL A */ + RL(A); + break; + case 0x18: /* RR B */ + RR(B); + break; + case 0x19: /* RR C */ + RR(C); + break; + case 0x1a: /* RR D */ + RR(D); + break; + case 0x1b: /* RR E */ + RR(E); + break; + case 0x1c: /* RR H */ + RR(H); + break; + case 0x1d: /* RR L */ + RR(L); + break; + case 0x1e: /* RR (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + RR(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x1f: /* RR A */ + RR(A); + break; + case 0x20: /* SLA B */ + SLA(B); + break; + case 0x21: /* SLA C */ + SLA(C); + break; + case 0x22: /* SLA D */ + SLA(D); + break; + case 0x23: /* SLA E */ + SLA(E); + break; + case 0x24: /* SLA H */ + SLA(H); + break; + case 0x25: /* SLA L */ + SLA(L); + break; + case 0x26: /* SLA (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + SLA(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x27: /* SLA A */ + SLA(A); + break; + case 0x28: /* SRA B */ + SRA(B); + break; + case 0x29: /* SRA C */ + SRA(C); + break; + case 0x2a: /* SRA D */ + SRA(D); + break; + case 0x2b: /* SRA E */ + SRA(E); + break; + case 0x2c: /* SRA H */ + SRA(H); + break; + case 0x2d: /* SRA L */ + SRA(L); + break; + case 0x2e: /* SRA (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + SRA(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x2f: /* SRA A */ + SRA(A); + break; + case 0x30: /* SLL B */ + SLL(B); + break; + case 0x31: /* SLL C */ + SLL(C); + break; + case 0x32: /* SLL D */ + SLL(D); + break; + case 0x33: /* SLL E */ + SLL(E); + break; + case 0x34: /* SLL H */ + SLL(H); + break; + case 0x35: /* SLL L */ + SLL(L); + break; + case 0x36: /* SLL (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + SLL(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x37: /* SLL A */ + SLL(A); + break; + case 0x38: /* SRL B */ + SRL(B); + break; + case 0x39: /* SRL C */ + SRL(C); + break; + case 0x3a: /* SRL D */ + SRL(D); + break; + case 0x3b: /* SRL E */ + SRL(E); + break; + case 0x3c: /* SRL H */ + SRL(H); + break; + case 0x3d: /* SRL L */ + SRL(L); + break; + case 0x3e: /* SRL (HL) */ + { + uint8 bytetemp = Z80_RB_MACRO(HL); + contend_read_no_mreq( HL, 1 ); + SRL(bytetemp); + Z80_WB_MACRO(HL,bytetemp); + } + break; + case 0x3f: /* SRL A */ + SRL(A); + break; + case 0x40: /* BIT 0,B */ + BIT( 0, B ); + break; + case 0x41: /* BIT 0,C */ + BIT( 0, C ); + break; + case 0x42: /* BIT 0,D */ + BIT( 0, D ); + break; + case 0x43: /* BIT 0,E */ + BIT( 0, E ); + break; + case 0x44: /* BIT 0,H */ + BIT( 0, H ); + break; + case 0x45: /* BIT 0,L */ + BIT( 0, L ); + break; + case 0x46: /* BIT 0,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 0, bytetemp ); + } + break; + case 0x47: /* BIT 0,A */ + BIT( 0, A ); + break; + case 0x48: /* BIT 1,B */ + BIT( 1, B ); + break; + case 0x49: /* BIT 1,C */ + BIT( 1, C ); + break; + case 0x4a: /* BIT 1,D */ + BIT( 1, D ); + break; + case 0x4b: /* BIT 1,E */ + BIT( 1, E ); + break; + case 0x4c: /* BIT 1,H */ + BIT( 1, H ); + break; + case 0x4d: /* BIT 1,L */ + BIT( 1, L ); + break; + case 0x4e: /* BIT 1,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 1, bytetemp ); + } + break; + case 0x4f: /* BIT 1,A */ + BIT( 1, A ); + break; + case 0x50: /* BIT 2,B */ + BIT( 2, B ); + break; + case 0x51: /* BIT 2,C */ + BIT( 2, C ); + break; + case 0x52: /* BIT 2,D */ + BIT( 2, D ); + break; + case 0x53: /* BIT 2,E */ + BIT( 2, E ); + break; + case 0x54: /* BIT 2,H */ + BIT( 2, H ); + break; + case 0x55: /* BIT 2,L */ + BIT( 2, L ); + break; + case 0x56: /* BIT 2,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 2, bytetemp ); + } + break; + case 0x57: /* BIT 2,A */ + BIT( 2, A ); + break; + case 0x58: /* BIT 3,B */ + BIT( 3, B ); + break; + case 0x59: /* BIT 3,C */ + BIT( 3, C ); + break; + case 0x5a: /* BIT 3,D */ + BIT( 3, D ); + break; + case 0x5b: /* BIT 3,E */ + BIT( 3, E ); + break; + case 0x5c: /* BIT 3,H */ + BIT( 3, H ); + break; + case 0x5d: /* BIT 3,L */ + BIT( 3, L ); + break; + case 0x5e: /* BIT 3,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 3, bytetemp ); + } + break; + case 0x5f: /* BIT 3,A */ + BIT( 3, A ); + break; + case 0x60: /* BIT 4,B */ + BIT( 4, B ); + break; + case 0x61: /* BIT 4,C */ + BIT( 4, C ); + break; + case 0x62: /* BIT 4,D */ + BIT( 4, D ); + break; + case 0x63: /* BIT 4,E */ + BIT( 4, E ); + break; + case 0x64: /* BIT 4,H */ + BIT( 4, H ); + break; + case 0x65: /* BIT 4,L */ + BIT( 4, L ); + break; + case 0x66: /* BIT 4,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 4, bytetemp ); + } + break; + case 0x67: /* BIT 4,A */ + BIT( 4, A ); + break; + case 0x68: /* BIT 5,B */ + BIT( 5, B ); + break; + case 0x69: /* BIT 5,C */ + BIT( 5, C ); + break; + case 0x6a: /* BIT 5,D */ + BIT( 5, D ); + break; + case 0x6b: /* BIT 5,E */ + BIT( 5, E ); + break; + case 0x6c: /* BIT 5,H */ + BIT( 5, H ); + break; + case 0x6d: /* BIT 5,L */ + BIT( 5, L ); + break; + case 0x6e: /* BIT 5,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 5, bytetemp ); + } + break; + case 0x6f: /* BIT 5,A */ + BIT( 5, A ); + break; + case 0x70: /* BIT 6,B */ + BIT( 6, B ); + break; + case 0x71: /* BIT 6,C */ + BIT( 6, C ); + break; + case 0x72: /* BIT 6,D */ + BIT( 6, D ); + break; + case 0x73: /* BIT 6,E */ + BIT( 6, E ); + break; + case 0x74: /* BIT 6,H */ + BIT( 6, H ); + break; + case 0x75: /* BIT 6,L */ + BIT( 6, L ); + break; + case 0x76: /* BIT 6,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 6, bytetemp ); + } + break; + case 0x77: /* BIT 6,A */ + BIT( 6, A ); + break; + case 0x78: /* BIT 7,B */ + BIT( 7, B ); + break; + case 0x79: /* BIT 7,C */ + BIT( 7, C ); + break; + case 0x7a: /* BIT 7,D */ + BIT( 7, D ); + break; + case 0x7b: /* BIT 7,E */ + BIT( 7, E ); + break; + case 0x7c: /* BIT 7,H */ + BIT( 7, H ); + break; + case 0x7d: /* BIT 7,L */ + BIT( 7, L ); + break; + case 0x7e: /* BIT 7,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + BIT( 7, bytetemp ); + } + break; + case 0x7f: /* BIT 7,A */ + BIT( 7, A ); + break; + case 0x80: /* RES 0,B */ + B &= 0xfe; + break; + case 0x81: /* RES 0,C */ + C &= 0xfe; + break; + case 0x82: /* RES 0,D */ + D &= 0xfe; + break; + case 0x83: /* RES 0,E */ + E &= 0xfe; + break; + case 0x84: /* RES 0,H */ + H &= 0xfe; + break; + case 0x85: /* RES 0,L */ + L &= 0xfe; + break; + case 0x86: /* RES 0,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xfe ); + } + break; + case 0x87: /* RES 0,A */ + A &= 0xfe; + break; + case 0x88: /* RES 1,B */ + B &= 0xfd; + break; + case 0x89: /* RES 1,C */ + C &= 0xfd; + break; + case 0x8a: /* RES 1,D */ + D &= 0xfd; + break; + case 0x8b: /* RES 1,E */ + E &= 0xfd; + break; + case 0x8c: /* RES 1,H */ + H &= 0xfd; + break; + case 0x8d: /* RES 1,L */ + L &= 0xfd; + break; + case 0x8e: /* RES 1,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xfd ); + } + break; + case 0x8f: /* RES 1,A */ + A &= 0xfd; + break; + case 0x90: /* RES 2,B */ + B &= 0xfb; + break; + case 0x91: /* RES 2,C */ + C &= 0xfb; + break; + case 0x92: /* RES 2,D */ + D &= 0xfb; + break; + case 0x93: /* RES 2,E */ + E &= 0xfb; + break; + case 0x94: /* RES 2,H */ + H &= 0xfb; + break; + case 0x95: /* RES 2,L */ + L &= 0xfb; + break; + case 0x96: /* RES 2,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xfb ); + } + break; + case 0x97: /* RES 2,A */ + A &= 0xfb; + break; + case 0x98: /* RES 3,B */ + B &= 0xf7; + break; + case 0x99: /* RES 3,C */ + C &= 0xf7; + break; + case 0x9a: /* RES 3,D */ + D &= 0xf7; + break; + case 0x9b: /* RES 3,E */ + E &= 0xf7; + break; + case 0x9c: /* RES 3,H */ + H &= 0xf7; + break; + case 0x9d: /* RES 3,L */ + L &= 0xf7; + break; + case 0x9e: /* RES 3,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xf7 ); + } + break; + case 0x9f: /* RES 3,A */ + A &= 0xf7; + break; + case 0xa0: /* RES 4,B */ + B &= 0xef; + break; + case 0xa1: /* RES 4,C */ + C &= 0xef; + break; + case 0xa2: /* RES 4,D */ + D &= 0xef; + break; + case 0xa3: /* RES 4,E */ + E &= 0xef; + break; + case 0xa4: /* RES 4,H */ + H &= 0xef; + break; + case 0xa5: /* RES 4,L */ + L &= 0xef; + break; + case 0xa6: /* RES 4,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xef ); + } + break; + case 0xa7: /* RES 4,A */ + A &= 0xef; + break; + case 0xa8: /* RES 5,B */ + B &= 0xdf; + break; + case 0xa9: /* RES 5,C */ + C &= 0xdf; + break; + case 0xaa: /* RES 5,D */ + D &= 0xdf; + break; + case 0xab: /* RES 5,E */ + E &= 0xdf; + break; + case 0xac: /* RES 5,H */ + H &= 0xdf; + break; + case 0xad: /* RES 5,L */ + L &= 0xdf; + break; + case 0xae: /* RES 5,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xdf ); + } + break; + case 0xaf: /* RES 5,A */ + A &= 0xdf; + break; + case 0xb0: /* RES 6,B */ + B &= 0xbf; + break; + case 0xb1: /* RES 6,C */ + C &= 0xbf; + break; + case 0xb2: /* RES 6,D */ + D &= 0xbf; + break; + case 0xb3: /* RES 6,E */ + E &= 0xbf; + break; + case 0xb4: /* RES 6,H */ + H &= 0xbf; + break; + case 0xb5: /* RES 6,L */ + L &= 0xbf; + break; + case 0xb6: /* RES 6,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0xbf ); + } + break; + case 0xb7: /* RES 6,A */ + A &= 0xbf; + break; + case 0xb8: /* RES 7,B */ + B &= 0x7f; + break; + case 0xb9: /* RES 7,C */ + C &= 0x7f; + break; + case 0xba: /* RES 7,D */ + D &= 0x7f; + break; + case 0xbb: /* RES 7,E */ + E &= 0x7f; + break; + case 0xbc: /* RES 7,H */ + H &= 0x7f; + break; + case 0xbd: /* RES 7,L */ + L &= 0x7f; + break; + case 0xbe: /* RES 7,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp & 0x7f ); + } + break; + case 0xbf: /* RES 7,A */ + A &= 0x7f; + break; + case 0xc0: /* SET 0,B */ + B |= 0x01; + break; + case 0xc1: /* SET 0,C */ + C |= 0x01; + break; + case 0xc2: /* SET 0,D */ + D |= 0x01; + break; + case 0xc3: /* SET 0,E */ + E |= 0x01; + break; + case 0xc4: /* SET 0,H */ + H |= 0x01; + break; + case 0xc5: /* SET 0,L */ + L |= 0x01; + break; + case 0xc6: /* SET 0,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x01 ); + } + break; + case 0xc7: /* SET 0,A */ + A |= 0x01; + break; + case 0xc8: /* SET 1,B */ + B |= 0x02; + break; + case 0xc9: /* SET 1,C */ + C |= 0x02; + break; + case 0xca: /* SET 1,D */ + D |= 0x02; + break; + case 0xcb: /* SET 1,E */ + E |= 0x02; + break; + case 0xcc: /* SET 1,H */ + H |= 0x02; + break; + case 0xcd: /* SET 1,L */ + L |= 0x02; + break; + case 0xce: /* SET 1,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x02 ); + } + break; + case 0xcf: /* SET 1,A */ + A |= 0x02; + break; + case 0xd0: /* SET 2,B */ + B |= 0x04; + break; + case 0xd1: /* SET 2,C */ + C |= 0x04; + break; + case 0xd2: /* SET 2,D */ + D |= 0x04; + break; + case 0xd3: /* SET 2,E */ + E |= 0x04; + break; + case 0xd4: /* SET 2,H */ + H |= 0x04; + break; + case 0xd5: /* SET 2,L */ + L |= 0x04; + break; + case 0xd6: /* SET 2,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x04 ); + } + break; + case 0xd7: /* SET 2,A */ + A |= 0x04; + break; + case 0xd8: /* SET 3,B */ + B |= 0x08; + break; + case 0xd9: /* SET 3,C */ + C |= 0x08; + break; + case 0xda: /* SET 3,D */ + D |= 0x08; + break; + case 0xdb: /* SET 3,E */ + E |= 0x08; + break; + case 0xdc: /* SET 3,H */ + H |= 0x08; + break; + case 0xdd: /* SET 3,L */ + L |= 0x08; + break; + case 0xde: /* SET 3,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x08 ); + } + break; + case 0xdf: /* SET 3,A */ + A |= 0x08; + break; + case 0xe0: /* SET 4,B */ + B |= 0x10; + break; + case 0xe1: /* SET 4,C */ + C |= 0x10; + break; + case 0xe2: /* SET 4,D */ + D |= 0x10; + break; + case 0xe3: /* SET 4,E */ + E |= 0x10; + break; + case 0xe4: /* SET 4,H */ + H |= 0x10; + break; + case 0xe5: /* SET 4,L */ + L |= 0x10; + break; + case 0xe6: /* SET 4,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x10 ); + } + break; + case 0xe7: /* SET 4,A */ + A |= 0x10; + break; + case 0xe8: /* SET 5,B */ + B |= 0x20; + break; + case 0xe9: /* SET 5,C */ + C |= 0x20; + break; + case 0xea: /* SET 5,D */ + D |= 0x20; + break; + case 0xeb: /* SET 5,E */ + E |= 0x20; + break; + case 0xec: /* SET 5,H */ + H |= 0x20; + break; + case 0xed: /* SET 5,L */ + L |= 0x20; + break; + case 0xee: /* SET 5,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x20 ); + } + break; + case 0xef: /* SET 5,A */ + A |= 0x20; + break; + case 0xf0: /* SET 6,B */ + B |= 0x40; + break; + case 0xf1: /* SET 6,C */ + C |= 0x40; + break; + case 0xf2: /* SET 6,D */ + D |= 0x40; + break; + case 0xf3: /* SET 6,E */ + E |= 0x40; + break; + case 0xf4: /* SET 6,H */ + H |= 0x40; + break; + case 0xf5: /* SET 6,L */ + L |= 0x40; + break; + case 0xf6: /* SET 6,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x40 ); + } + break; + case 0xf7: /* SET 6,A */ + A |= 0x40; + break; + case 0xf8: /* SET 7,B */ + B |= 0x80; + break; + case 0xf9: /* SET 7,C */ + C |= 0x80; + break; + case 0xfa: /* SET 7,D */ + D |= 0x80; + break; + case 0xfb: /* SET 7,E */ + E |= 0x80; + break; + case 0xfc: /* SET 7,H */ + H |= 0x80; + break; + case 0xfd: /* SET 7,L */ + L |= 0x80; + break; + case 0xfe: /* SET 7,(HL) */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO( HL, bytetemp | 0x80 ); + } + break; + case 0xff: /* SET 7,A */ + A |= 0x80; + break; diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ddfd.c b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ddfd.c new file mode 100644 index 0000000000..aff392f15d --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ddfd.c @@ -0,0 +1,534 @@ +/* z80_ddfd.c Z80 {DD,FD}xx opcodes + Copyright (c) 1999-2003 Philip Kendall + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +/* NB: this file is autogenerated by 'z80.pl' from 'opcodes_ddfd.dat', + and included in 'z80_ops.c' */ + + case 0x09: /* ADD REGISTER,BC */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(REGISTER,BC); + break; + case 0x19: /* ADD REGISTER,DE */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(REGISTER,DE); + break; + case 0x21: /* LD REGISTER,nnnn */ + REGISTERL=Z80_RB_MACRO(PC++); + REGISTERH=Z80_RB_MACRO(PC++); + break; + case 0x22: /* LD (nnnn),REGISTER */ + LD16_NNRR(REGISTERL,REGISTERH); + break; + case 0x23: /* INC REGISTER */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + REGISTER++; + break; + case 0x24: /* INC REGISTERH */ + INC(REGISTERH); + break; + case 0x25: /* DEC REGISTERH */ + DEC(REGISTERH); + break; + case 0x26: /* LD REGISTERH,nn */ + REGISTERH = Z80_RB_MACRO( PC++ ); + break; + case 0x29: /* ADD REGISTER,REGISTER */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(REGISTER,REGISTER); + break; + case 0x2a: /* LD REGISTER,(nnnn) */ + LD16_RRNN(REGISTERL,REGISTERH); + break; + case 0x2b: /* DEC REGISTER */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + REGISTER--; + break; + case 0x2c: /* INC REGISTERL */ + INC(REGISTERL); + break; + case 0x2d: /* DEC REGISTERL */ + DEC(REGISTERL); + break; + case 0x2e: /* LD REGISTERL,nn */ + REGISTERL = Z80_RB_MACRO( PC++ ); + break; + case 0x34: /* INC (REGISTER+dd) */ + { + uint8 offset, bytetemp; + uint16 wordtemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + wordtemp = REGISTER + (int8)offset; + bytetemp = Z80_RB_MACRO( wordtemp ); + contend_read_no_mreq( wordtemp, 1 ); + INC(bytetemp); + Z80_WB_MACRO(wordtemp,bytetemp); + } + break; + case 0x35: /* DEC (REGISTER+dd) */ + { + uint8 offset, bytetemp; + uint16 wordtemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + wordtemp = REGISTER + (int8)offset; + bytetemp = Z80_RB_MACRO( wordtemp ); + contend_read_no_mreq( wordtemp, 1 ); + DEC(bytetemp); + Z80_WB_MACRO(wordtemp,bytetemp); + } + break; + case 0x36: /* LD (REGISTER+dd),nn */ + { + uint8 offset, value; + offset = Z80_RB_MACRO( PC++ ); + value = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, value ); + } + break; + case 0x39: /* ADD REGISTER,SP */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADD16(REGISTER,SP); + break; + case 0x44: /* LD B,REGISTERH */ + B=REGISTERH; + break; + case 0x45: /* LD B,REGISTERL */ + B=REGISTERL; + break; + case 0x46: /* LD B,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + B = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x4c: /* LD C,REGISTERH */ + C=REGISTERH; + break; + case 0x4d: /* LD C,REGISTERL */ + C=REGISTERL; + break; + case 0x4e: /* LD C,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + C = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x54: /* LD D,REGISTERH */ + D=REGISTERH; + break; + case 0x55: /* LD D,REGISTERL */ + D=REGISTERL; + break; + case 0x56: /* LD D,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + D = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x5c: /* LD E,REGISTERH */ + E=REGISTERH; + break; + case 0x5d: /* LD E,REGISTERL */ + E=REGISTERL; + break; + case 0x5e: /* LD E,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + E = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x60: /* LD REGISTERH,B */ + REGISTERH=B; + break; + case 0x61: /* LD REGISTERH,C */ + REGISTERH=C; + break; + case 0x62: /* LD REGISTERH,D */ + REGISTERH=D; + break; + case 0x63: /* LD REGISTERH,E */ + REGISTERH=E; + break; + case 0x64: /* LD REGISTERH,REGISTERH */ + break; + case 0x65: /* LD REGISTERH,REGISTERL */ + REGISTERH=REGISTERL; + break; + case 0x66: /* LD H,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + H = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x67: /* LD REGISTERH,A */ + REGISTERH=A; + break; + case 0x68: /* LD REGISTERL,B */ + REGISTERL=B; + break; + case 0x69: /* LD REGISTERL,C */ + REGISTERL=C; + break; + case 0x6a: /* LD REGISTERL,D */ + REGISTERL=D; + break; + case 0x6b: /* LD REGISTERL,E */ + REGISTERL=E; + break; + case 0x6c: /* LD REGISTERL,REGISTERH */ + REGISTERL=REGISTERH; + break; + case 0x6d: /* LD REGISTERL,REGISTERL */ + break; + case 0x6e: /* LD L,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + L = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x6f: /* LD REGISTERL,A */ + REGISTERL=A; + break; + case 0x70: /* LD (REGISTER+dd),B */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, B ); + } + break; + case 0x71: /* LD (REGISTER+dd),C */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, C ); + } + break; + case 0x72: /* LD (REGISTER+dd),D */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, D ); + } + break; + case 0x73: /* LD (REGISTER+dd),E */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, E ); + } + break; + case 0x74: /* LD (REGISTER+dd),H */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, H ); + } + break; + case 0x75: /* LD (REGISTER+dd),L */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, L ); + } + break; + case 0x77: /* LD (REGISTER+dd),A */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + Z80_WB_MACRO( REGISTER + (int8)offset, A ); + } + break; + case 0x7c: /* LD A,REGISTERH */ + A=REGISTERH; + break; + case 0x7d: /* LD A,REGISTERL */ + A=REGISTERL; + break; + case 0x7e: /* LD A,(REGISTER+dd) */ + { + uint8 offset; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + A = Z80_RB_MACRO( REGISTER + (int8)offset ); + } + break; + case 0x84: /* ADD A,REGISTERH */ + ADD(REGISTERH); + break; + case 0x85: /* ADD A,REGISTERL */ + ADD(REGISTERL); + break; + case 0x86: /* ADD A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + ADD(bytetemp); + } + break; + case 0x8c: /* ADC A,REGISTERH */ + ADC(REGISTERH); + break; + case 0x8d: /* ADC A,REGISTERL */ + ADC(REGISTERL); + break; + case 0x8e: /* ADC A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + ADC(bytetemp); + } + break; + case 0x94: /* SUB A,REGISTERH */ + SUB(REGISTERH); + break; + case 0x95: /* SUB A,REGISTERL */ + SUB(REGISTERL); + break; + case 0x96: /* SUB A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + SUB(bytetemp); + } + break; + case 0x9c: /* SBC A,REGISTERH */ + SBC(REGISTERH); + break; + case 0x9d: /* SBC A,REGISTERL */ + SBC(REGISTERL); + break; + case 0x9e: /* SBC A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + SBC(bytetemp); + } + break; + case 0xa4: /* AND A,REGISTERH */ + AND(REGISTERH); + break; + case 0xa5: /* AND A,REGISTERL */ + AND(REGISTERL); + break; + case 0xa6: /* AND A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + AND(bytetemp); + } + break; + case 0xac: /* XOR A,REGISTERH */ + XOR(REGISTERH); + break; + case 0xad: /* XOR A,REGISTERL */ + XOR(REGISTERL); + break; + case 0xae: /* XOR A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + XOR(bytetemp); + } + break; + case 0xb4: /* OR A,REGISTERH */ + OR(REGISTERH); + break; + case 0xb5: /* OR A,REGISTERL */ + OR(REGISTERL); + break; + case 0xb6: /* OR A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + OR(bytetemp); + } + break; + case 0xbc: /* CP A,REGISTERH */ + CP(REGISTERH); + break; + case 0xbd: /* CP A,REGISTERL */ + CP(REGISTERL); + break; + case 0xbe: /* CP A,(REGISTER+dd) */ + { + uint8 offset, bytetemp; + offset = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); + contend_read_no_mreq( PC, 1 ); PC++; + bytetemp = Z80_RB_MACRO( REGISTER + (int8)offset ); + CP(bytetemp); + } + break; + case 0xcb: /* shift DDFDCB */ + { + uint16 tempaddr; uint8 opcode3; + tempaddr = REGISTER + (int8)Z80_RB_MACRO( PC ); + PC++; + opcode3 = Z80_RB_MACRO( PC ); + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); PC++; + switch(opcode3) { +#include "z80_ddfdcb.c" + } + } + break; + case 0xe1: /* POP REGISTER */ + POP16(REGISTERL,REGISTERH); + break; + case 0xe3: /* EX (SP),REGISTER */ + { + uint8 bytetempl, bytetemph; + bytetempl = Z80_RB_MACRO( SP ); + bytetemph = Z80_RB_MACRO( SP + 1 ); contend_read_no_mreq( SP + 1, 1 ); + Z80_WB_MACRO( SP + 1, REGISTERH ); + Z80_WB_MACRO( SP, REGISTERL ); + contend_write_no_mreq( SP, 1 ); contend_write_no_mreq( SP, 1 ); + REGISTERL=bytetempl; REGISTERH=bytetemph; + } + break; + case 0xe5: /* PUSH REGISTER */ + contend_read_no_mreq( IR, 1 ); + PUSH16(REGISTERL,REGISTERH); + break; + case 0xe9: /* JP REGISTER */ + PC=REGISTER; /* NB: NOT INDIRECT! */ + break; + case 0xf9: /* LD SP,REGISTER */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SP = REGISTER; + break; + default: /* Instruction did not involve H or L, so backtrack + one instruction and parse again */ + PC--; + R--; + opcode = opcode2; + break; // FIXME! + //goto end_opcode; diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ddfdcb.c b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ddfdcb.c new file mode 100644 index 0000000000..9e59d53229 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ddfdcb.c @@ -0,0 +1,1226 @@ +/* z80_ddfdcb.c Z80 {DD,FD}CBxx opcodes + Copyright (c) 1999-2003 Philip Kendall + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +/* NB: this file is autogenerated by 'z80.pl' from 'opcodes_ddfdcb.dat', + and included in 'z80_ops.c' */ + + case 0x00: /* LD B,RLC (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x01: /* LD C,RLC (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x02: /* LD D,RLC (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x03: /* LD E,RLC (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x04: /* LD H,RLC (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x05: /* LD L,RLC (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x06: /* RLC (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x07: /* LD A,RLC (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RLC(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x08: /* LD B,RRC (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x09: /* LD C,RRC (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x0a: /* LD D,RRC (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x0b: /* LD E,RRC (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x0c: /* LD H,RRC (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x0d: /* LD L,RRC (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x0e: /* RRC (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x0f: /* LD A,RRC (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RRC(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x10: /* LD B,RL (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x11: /* LD C,RL (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x12: /* LD D,RL (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x13: /* LD E,RL (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x14: /* LD H,RL (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x15: /* LD L,RL (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x16: /* RL (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x17: /* LD A,RL (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RL(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x18: /* LD B,RR (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x19: /* LD C,RR (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x1a: /* LD D,RR (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x1b: /* LD E,RR (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x1c: /* LD H,RR (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x1d: /* LD L,RR (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x1e: /* RR (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x1f: /* LD A,RR (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + RR(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x20: /* LD B,SLA (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x21: /* LD C,SLA (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x22: /* LD D,SLA (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x23: /* LD E,SLA (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x24: /* LD H,SLA (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x25: /* LD L,SLA (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x26: /* SLA (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x27: /* LD A,SLA (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLA(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x28: /* LD B,SRA (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x29: /* LD C,SRA (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x2a: /* LD D,SRA (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x2b: /* LD E,SRA (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x2c: /* LD H,SRA (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x2d: /* LD L,SRA (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x2e: /* SRA (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x2f: /* LD A,SRA (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRA(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x30: /* LD B,SLL (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x31: /* LD C,SLL (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x32: /* LD D,SLL (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x33: /* LD E,SLL (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x34: /* LD H,SLL (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x35: /* LD L,SLL (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x36: /* SLL (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x37: /* LD A,SLL (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SLL(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x38: /* LD B,SRL (REGISTER+dd) */ + B=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(B); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x39: /* LD C,SRL (REGISTER+dd) */ + C=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(C); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x3a: /* LD D,SRL (REGISTER+dd) */ + D=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(D); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x3b: /* LD E,SRL (REGISTER+dd) */ + E=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(E); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x3c: /* LD H,SRL (REGISTER+dd) */ + H=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(H); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x3d: /* LD L,SRL (REGISTER+dd) */ + L=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(L); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x3e: /* SRL (REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(bytetemp); + Z80_WB_MACRO(tempaddr,bytetemp); + } + break; + case 0x3f: /* LD A,SRL (REGISTER+dd) */ + A=Z80_RB_MACRO(tempaddr); + contend_read_no_mreq( tempaddr, 1 ); + SRL(A); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: /* BIT 0,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 0, bytetemp, tempaddr ); + } + break; + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: /* BIT 1,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 1, bytetemp, tempaddr ); + } + break; + case 0x50: + case 0x51: + case 0x52: + case 0x53: + case 0x54: + case 0x55: + case 0x56: + case 0x57: /* BIT 2,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 2, bytetemp, tempaddr ); + } + break; + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: /* BIT 3,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 3, bytetemp, tempaddr ); + } + break; + case 0x60: + case 0x61: + case 0x62: + case 0x63: + case 0x64: + case 0x65: + case 0x66: + case 0x67: /* BIT 4,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 4, bytetemp, tempaddr ); + } + break; + case 0x68: + case 0x69: + case 0x6a: + case 0x6b: + case 0x6c: + case 0x6d: + case 0x6e: + case 0x6f: /* BIT 5,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 5, bytetemp, tempaddr ); + } + break; + case 0x70: + case 0x71: + case 0x72: + case 0x73: + case 0x74: + case 0x75: + case 0x76: + case 0x77: /* BIT 6,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 6, bytetemp, tempaddr ); + } + break; + case 0x78: + case 0x79: + case 0x7a: + case 0x7b: + case 0x7c: + case 0x7d: + case 0x7e: + case 0x7f: /* BIT 7,(REGISTER+dd) */ + { + uint8 bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + BIT_I( 7, bytetemp, tempaddr ); + } + break; + case 0x80: /* LD B,RES 0,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x81: /* LD C,RES 0,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x82: /* LD D,RES 0,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x83: /* LD E,RES 0,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x84: /* LD H,RES 0,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x85: /* LD L,RES 0,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x86: /* RES 0,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xfe ); + } + break; + case 0x87: /* LD A,RES 0,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xfe; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x88: /* LD B,RES 1,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x89: /* LD C,RES 1,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x8a: /* LD D,RES 1,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x8b: /* LD E,RES 1,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x8c: /* LD H,RES 1,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x8d: /* LD L,RES 1,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x8e: /* RES 1,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xfd ); + } + break; + case 0x8f: /* LD A,RES 1,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xfd; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x90: /* LD B,RES 2,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x91: /* LD C,RES 2,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x92: /* LD D,RES 2,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x93: /* LD E,RES 2,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x94: /* LD H,RES 2,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x95: /* LD L,RES 2,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x96: /* RES 2,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xfb ); + } + break; + case 0x97: /* LD A,RES 2,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xfb; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0x98: /* LD B,RES 3,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0x99: /* LD C,RES 3,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0x9a: /* LD D,RES 3,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0x9b: /* LD E,RES 3,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0x9c: /* LD H,RES 3,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0x9d: /* LD L,RES 3,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0x9e: /* RES 3,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xf7 ); + } + break; + case 0x9f: /* LD A,RES 3,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xf7; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xa0: /* LD B,RES 4,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xa1: /* LD C,RES 4,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xa2: /* LD D,RES 4,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xa3: /* LD E,RES 4,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xa4: /* LD H,RES 4,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xa5: /* LD L,RES 4,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xa6: /* RES 4,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xef ); + } + break; + case 0xa7: /* LD A,RES 4,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xef; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xa8: /* LD B,RES 5,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xa9: /* LD C,RES 5,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xaa: /* LD D,RES 5,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xab: /* LD E,RES 5,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xac: /* LD H,RES 5,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xad: /* LD L,RES 5,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xae: /* RES 5,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xdf ); + } + break; + case 0xaf: /* LD A,RES 5,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xdf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xb0: /* LD B,RES 6,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xb1: /* LD C,RES 6,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xb2: /* LD D,RES 6,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xb3: /* LD E,RES 6,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xb4: /* LD H,RES 6,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xb5: /* LD L,RES 6,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xb6: /* RES 6,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0xbf ); + } + break; + case 0xb7: /* LD A,RES 6,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0xbf; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xb8: /* LD B,RES 7,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xb9: /* LD C,RES 7,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xba: /* LD D,RES 7,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xbb: /* LD E,RES 7,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xbc: /* LD H,RES 7,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xbd: /* LD L,RES 7,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xbe: /* RES 7,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp & 0x7f ); + } + break; + case 0xbf: /* LD A,RES 7,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) & 0x7f; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xc0: /* LD B,SET 0,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xc1: /* LD C,SET 0,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xc2: /* LD D,SET 0,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xc3: /* LD E,SET 0,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xc4: /* LD H,SET 0,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xc5: /* LD L,SET 0,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xc6: /* SET 0,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x01 ); + } + break; + case 0xc7: /* LD A,SET 0,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x01; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xc8: /* LD B,SET 1,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xc9: /* LD C,SET 1,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xca: /* LD D,SET 1,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xcb: /* LD E,SET 1,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xcc: /* LD H,SET 1,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xcd: /* LD L,SET 1,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xce: /* SET 1,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x02 ); + } + break; + case 0xcf: /* LD A,SET 1,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x02; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xd0: /* LD B,SET 2,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xd1: /* LD C,SET 2,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xd2: /* LD D,SET 2,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xd3: /* LD E,SET 2,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xd4: /* LD H,SET 2,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xd5: /* LD L,SET 2,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xd6: /* SET 2,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x04 ); + } + break; + case 0xd7: /* LD A,SET 2,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x04; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xd8: /* LD B,SET 3,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xd9: /* LD C,SET 3,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xda: /* LD D,SET 3,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xdb: /* LD E,SET 3,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xdc: /* LD H,SET 3,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xdd: /* LD L,SET 3,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xde: /* SET 3,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x08 ); + } + break; + case 0xdf: /* LD A,SET 3,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x08; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xe0: /* LD B,SET 4,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xe1: /* LD C,SET 4,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xe2: /* LD D,SET 4,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xe3: /* LD E,SET 4,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xe4: /* LD H,SET 4,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xe5: /* LD L,SET 4,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xe6: /* SET 4,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x10 ); + } + break; + case 0xe7: /* LD A,SET 4,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x10; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xe8: /* LD B,SET 5,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xe9: /* LD C,SET 5,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xea: /* LD D,SET 5,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xeb: /* LD E,SET 5,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xec: /* LD H,SET 5,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xed: /* LD L,SET 5,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xee: /* SET 5,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x20 ); + } + break; + case 0xef: /* LD A,SET 5,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x20; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xf0: /* LD B,SET 6,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xf1: /* LD C,SET 6,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xf2: /* LD D,SET 6,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xf3: /* LD E,SET 6,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xf4: /* LD H,SET 6,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xf5: /* LD L,SET 6,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xf6: /* SET 6,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x40 ); + } + break; + case 0xf7: /* LD A,SET 6,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x40; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; + case 0xf8: /* LD B,SET 7,(REGISTER+dd) */ + B = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, B); + break; + case 0xf9: /* LD C,SET 7,(REGISTER+dd) */ + C = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, C); + break; + case 0xfa: /* LD D,SET 7,(REGISTER+dd) */ + D = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, D); + break; + case 0xfb: /* LD E,SET 7,(REGISTER+dd) */ + E = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, E); + break; + case 0xfc: /* LD H,SET 7,(REGISTER+dd) */ + H = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, H); + break; + case 0xfd: /* LD L,SET 7,(REGISTER+dd) */ + L = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, L); + break; + case 0xfe: /* SET 7,(REGISTER+dd) */ + { + uint8 bytetemp; + bytetemp = Z80_RB_MACRO( tempaddr ); + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO( tempaddr, bytetemp | 0x80 ); + } + break; + case 0xff: /* LD A,SET 7,(REGISTER+dd) */ + A = Z80_RB_MACRO(tempaddr) | 0x80; + contend_read_no_mreq( tempaddr, 1 ); + Z80_WB_MACRO(tempaddr, A); + break; diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ed.c b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ed.c new file mode 100644 index 0000000000..e53ce22942 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ed.c @@ -0,0 +1,567 @@ +/* z80_ed.c: Z80 CBxx opcodes + Copyright (c) 1999-2003 Philip Kendall + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +/* NB: this file is autogenerated by 'z80.pl' from 'opcodes_ed.dat', + and included in 'z80_ops.c' */ + + case 0x40: /* IN B,(C) */ + Z80_IN( B, BC ); + break; + case 0x41: /* OUT (C),B */ + Z80_WP_MACRO( BC, B ); + break; + case 0x42: /* SBC HL,BC */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SBC16(BC); + break; + case 0x43: /* LD (nnnn),BC */ + LD16_NNRR(C,B); + break; + case 0x44: + case 0x4c: + case 0x54: + case 0x5c: + case 0x64: + case 0x6c: + case 0x74: + case 0x7c: /* NEG */ + { + uint8 bytetemp=A; + A=0; + SUB(bytetemp); + } + break; + case 0x45: + case 0x4d: + case 0x55: + case 0x5d: + case 0x65: + case 0x6d: + case 0x75: + case 0x7d: /* RETN */ + IFF1=IFF2; + RET(); + break; + case 0x46: + case 0x4e: + case 0x66: + case 0x6e: /* IM 0 */ + IM=0; + break; + case 0x47: /* LD I,A */ + contend_read_no_mreq( IR, 1 ); + I=A; + break; + case 0x48: /* IN C,(C) */ + Z80_IN( C, BC ); + break; + case 0x49: /* OUT (C),C */ + Z80_WP_MACRO( BC, C ); + break; + case 0x4a: /* ADC HL,BC */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADC16(BC); + break; + case 0x4b: /* LD BC,(nnnn) */ + LD16_RRNN(C,B); + break; + case 0x4f: /* LD R,A */ + contend_read_no_mreq( IR, 1 ); + R=R7=A; + break; + case 0x50: /* IN D,(C) */ + Z80_IN( D, BC ); + break; + case 0x51: /* OUT (C),D */ + Z80_WP_MACRO( BC, D ); + break; + case 0x52: /* SBC HL,DE */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SBC16(DE); + break; + case 0x53: /* LD (nnnn),DE */ + LD16_NNRR(E,D); + break; + case 0x56: + case 0x76: /* IM 1 */ + IM=1; + break; + case 0x57: /* LD A,I */ + contend_read_no_mreq( IR, 1 ); + A=I; + F = ( F & FLAG_C ) | sz53_table[A] | ( IFF2 ? FLAG_V : 0 ); + break; + case 0x58: /* IN E,(C) */ + Z80_IN( E, BC ); + break; + case 0x59: /* OUT (C),E */ + Z80_WP_MACRO( BC, E ); + break; + case 0x5a: /* ADC HL,DE */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADC16(DE); + break; + case 0x5b: /* LD DE,(nnnn) */ + LD16_RRNN(E,D); + break; + case 0x5e: + case 0x7e: /* IM 2 */ + IM=2; + break; + case 0x5f: /* LD A,R */ + contend_read_no_mreq( IR, 1 ); + A=(R&0x7f) | (R7&0x80); + F = ( F & FLAG_C ) | sz53_table[A] | ( IFF2 ? FLAG_V : 0 ); + break; + case 0x60: /* IN H,(C) */ + Z80_IN( H, BC ); + break; + case 0x61: /* OUT (C),H */ + Z80_WP_MACRO( BC, H ); + break; + case 0x62: /* SBC HL,HL */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SBC16(HL); + break; + case 0x63: /* LD (nnnn),HL */ + LD16_NNRR(L,H); + break; + case 0x67: /* RRD */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO(HL, ( A << 4 ) | ( bytetemp >> 4 ) ); + A = ( A & 0xf0 ) | ( bytetemp & 0x0f ); + F = ( F & FLAG_C ) | sz53p_table[A]; + } + break; + case 0x68: /* IN L,(C) */ + Z80_IN( L, BC ); + break; + case 0x69: /* OUT (C),L */ + Z80_WP_MACRO( BC, L ); + break; + case 0x6a: /* ADC HL,HL */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADC16(HL); + break; + case 0x6b: /* LD HL,(nnnn) */ + LD16_RRNN(L,H); + break; + case 0x6f: /* RLD */ + { + uint8 bytetemp = Z80_RB_MACRO( HL ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + Z80_WB_MACRO(HL, (bytetemp << 4 ) | ( A & 0x0f ) ); + A = ( A & 0xf0 ) | ( bytetemp >> 4 ); + F = ( F & FLAG_C ) | sz53p_table[A]; + } + break; + case 0x70: /* IN F,(C) */ + { + uint8 bytetemp; + Z80_IN( bytetemp, BC ); + } + break; + case 0x71: /* OUT (C),0 */ + Z80_WP_MACRO( BC, 0 ); + break; + case 0x72: /* SBC HL,SP */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + SBC16(SP); + break; + case 0x73: /* LD (nnnn),SP */ + LD16_NNRR(SPL,SPH); + break; + case 0x78: /* IN A,(C) */ + Z80_IN( A, BC ); + break; + case 0x79: /* OUT (C),A */ + Z80_WP_MACRO( BC, A ); + break; + case 0x7a: /* ADC HL,SP */ + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + contend_read_no_mreq( IR, 1 ); + ADC16(SP); + break; + case 0x7b: /* LD SP,(nnnn) */ + LD16_RRNN(SPL,SPH); + break; + case 0xa0: /* LDI */ + { + uint8 bytetemp=Z80_RB_MACRO( HL ); + BC--; + Z80_WB_MACRO(DE,bytetemp); + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + DE++; HL++; + bytetemp += A; + F = ( F & ( FLAG_C | FLAG_Z | FLAG_S ) ) | ( BC ? FLAG_V : 0 ) | + ( bytetemp & FLAG_3 ) | ( (bytetemp & 0x02) ? FLAG_5 : 0 ); + } + break; + case 0xa1: /* CPI */ + { + uint8 value = Z80_RB_MACRO( HL ), bytetemp = A - value, + lookup = ( ( A & 0x08 ) >> 3 ) | + ( ( (value) & 0x08 ) >> 2 ) | + ( ( bytetemp & 0x08 ) >> 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); + HL++; BC--; + F = ( F & FLAG_C ) | ( BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) | + halfcarry_sub_table[lookup] | ( bytetemp ? 0 : FLAG_Z ) | + ( bytetemp & FLAG_S ); + if(F & FLAG_H) bytetemp--; + F |= ( bytetemp & FLAG_3 ) | ( (bytetemp&0x02) ? FLAG_5 : 0 ); + } + break; + case 0xa2: /* INI */ + { + uint8 initemp, initemp2; + + contend_read_no_mreq( IR, 1 ); + initemp = Z80_RP_MACRO( BC ); + Z80_WB_MACRO( HL, initemp ); + + B--; HL++; + initemp2 = initemp + C + 1; + F = ( initemp & 0x80 ? FLAG_N : 0 ) | + ( ( initemp2 < initemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( initemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + } + break; + case 0xa3: /* OUTI */ + { + uint8 outitemp, outitemp2; + + contend_read_no_mreq( IR, 1 ); + outitemp = Z80_RB_MACRO( HL ); + B--; /* This does happen first, despite what the specs say */ + Z80_WP_MACRO(BC,outitemp); + + HL++; + outitemp2 = outitemp + L; + F = ( outitemp & 0x80 ? FLAG_N : 0 ) | + ( ( outitemp2 < outitemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( outitemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + } + break; + case 0xa8: /* LDD */ + { + uint8 bytetemp=Z80_RB_MACRO( HL ); + BC--; + Z80_WB_MACRO(DE,bytetemp); + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + DE--; HL--; + bytetemp += A; + F = ( F & ( FLAG_C | FLAG_Z | FLAG_S ) ) | ( BC ? FLAG_V : 0 ) | + ( bytetemp & FLAG_3 ) | ( (bytetemp & 0x02) ? FLAG_5 : 0 ); + } + break; + case 0xa9: /* CPD */ + { + uint8 value = Z80_RB_MACRO( HL ), bytetemp = A - value, + lookup = ( ( A & 0x08 ) >> 3 ) | + ( ( (value) & 0x08 ) >> 2 ) | + ( ( bytetemp & 0x08 ) >> 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); + HL--; BC--; + F = ( F & FLAG_C ) | ( BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) | + halfcarry_sub_table[lookup] | ( bytetemp ? 0 : FLAG_Z ) | + ( bytetemp & FLAG_S ); + if(F & FLAG_H) bytetemp--; + F |= ( bytetemp & FLAG_3 ) | ( (bytetemp&0x02) ? FLAG_5 : 0 ); + } + break; + case 0xaa: /* IND */ + { + uint8 initemp, initemp2; + + contend_read_no_mreq( IR, 1 ); + initemp = Z80_RP_MACRO( BC ); + Z80_WB_MACRO( HL, initemp ); + + B--; HL--; + initemp2 = initemp + C - 1; + F = ( initemp & 0x80 ? FLAG_N : 0 ) | + ( ( initemp2 < initemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( initemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + } + break; + case 0xab: /* OUTD */ + { + uint8 outitemp, outitemp2; + + contend_read_no_mreq( IR, 1 ); + outitemp = Z80_RB_MACRO( HL ); + B--; /* This does happen first, despite what the specs say */ + Z80_WP_MACRO(BC,outitemp); + + HL--; + outitemp2 = outitemp + L; + F = ( outitemp & 0x80 ? FLAG_N : 0 ) | + ( ( outitemp2 < outitemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( outitemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + } + break; + case 0xb0: /* LDIR */ + { + uint8 bytetemp=Z80_RB_MACRO( HL ); + Z80_WB_MACRO(DE,bytetemp); + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + BC--; + bytetemp += A; + F = ( F & ( FLAG_C | FLAG_Z | FLAG_S ) ) | ( BC ? FLAG_V : 0 ) | + ( bytetemp & FLAG_3 ) | ( (bytetemp & 0x02) ? FLAG_5 : 0 ); + if(BC) { + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + contend_write_no_mreq( DE, 1 ); + PC-=2; + } + HL++; DE++; + } + break; + case 0xb1: /* CPIR */ + { + uint8 value = Z80_RB_MACRO( HL ), bytetemp = A - value, + lookup = ( ( A & 0x08 ) >> 3 ) | + ( ( (value) & 0x08 ) >> 2 ) | + ( ( bytetemp & 0x08 ) >> 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); + BC--; + F = ( F & FLAG_C ) | ( BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) | + halfcarry_sub_table[lookup] | ( bytetemp ? 0 : FLAG_Z ) | + ( bytetemp & FLAG_S ); + if(F & FLAG_H) bytetemp--; + F |= ( bytetemp & FLAG_3 ) | ( (bytetemp&0x02) ? FLAG_5 : 0 ); + if( ( F & ( FLAG_V | FLAG_Z ) ) == FLAG_V ) { + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); + PC-=2; + } + HL++; + } + break; + case 0xb2: /* INIR */ + { + uint8 initemp, initemp2; + + contend_read_no_mreq( IR, 1 ); + initemp = Z80_RP_MACRO( BC ); + Z80_WB_MACRO( HL, initemp ); + + B--; + initemp2 = initemp + C + 1; + F = ( initemp & 0x80 ? FLAG_N : 0 ) | + ( ( initemp2 < initemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( initemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + + if( B ) { + contend_write_no_mreq( HL, 1 ); contend_write_no_mreq( HL, 1 ); + contend_write_no_mreq( HL, 1 ); contend_write_no_mreq( HL, 1 ); + contend_write_no_mreq( HL, 1 ); + PC -= 2; + } + HL++; + } + break; + case 0xb3: /* OTIR */ + { + uint8 outitemp, outitemp2; + + contend_read_no_mreq( IR, 1 ); + outitemp = Z80_RB_MACRO( HL ); + B--; /* This does happen first, despite what the specs say */ + Z80_WP_MACRO(BC,outitemp); + + HL++; + outitemp2 = outitemp + L; + F = ( outitemp & 0x80 ? FLAG_N : 0 ) | + ( ( outitemp2 < outitemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( outitemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + + if( B ) { + contend_read_no_mreq( BC, 1 ); contend_read_no_mreq( BC, 1 ); + contend_read_no_mreq( BC, 1 ); contend_read_no_mreq( BC, 1 ); + contend_read_no_mreq( BC, 1 ); + PC -= 2; + } + } + break; + case 0xb8: /* LDDR */ + { + uint8 bytetemp=Z80_RB_MACRO( HL ); + Z80_WB_MACRO(DE,bytetemp); + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + BC--; + bytetemp += A; + F = ( F & ( FLAG_C | FLAG_Z | FLAG_S ) ) | ( BC ? FLAG_V : 0 ) | + ( bytetemp & FLAG_3 ) | ( (bytetemp & 0x02) ? FLAG_5 : 0 ); + if(BC) { + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + contend_write_no_mreq( DE, 1 ); contend_write_no_mreq( DE, 1 ); + contend_write_no_mreq( DE, 1 ); + PC-=2; + } + HL--; DE--; + } + break; + case 0xb9: /* CPDR */ + { + uint8 value = Z80_RB_MACRO( HL ), bytetemp = A - value, + lookup = ( ( A & 0x08 ) >> 3 ) | + ( ( (value) & 0x08 ) >> 2 ) | + ( ( bytetemp & 0x08 ) >> 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); + BC--; + F = ( F & FLAG_C ) | ( BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) | + halfcarry_sub_table[lookup] | ( bytetemp ? 0 : FLAG_Z ) | + ( bytetemp & FLAG_S ); + if(F & FLAG_H) bytetemp--; + F |= ( bytetemp & FLAG_3 ) | ( (bytetemp&0x02) ? FLAG_5 : 0 ); + if( ( F & ( FLAG_V | FLAG_Z ) ) == FLAG_V ) { + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); contend_read_no_mreq( HL, 1 ); + contend_read_no_mreq( HL, 1 ); + PC-=2; + } + HL--; + } + break; + case 0xba: /* INDR */ + { + uint8 initemp, initemp2; + + contend_read_no_mreq( IR, 1 ); + initemp = Z80_RP_MACRO( BC ); + Z80_WB_MACRO( HL, initemp ); + + B--; + initemp2 = initemp + C - 1; + F = ( initemp & 0x80 ? FLAG_N : 0 ) | + ( ( initemp2 < initemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( initemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + + if( B ) { + contend_write_no_mreq( HL, 1 ); contend_write_no_mreq( HL, 1 ); + contend_write_no_mreq( HL, 1 ); contend_write_no_mreq( HL, 1 ); + contend_write_no_mreq( HL, 1 ); + PC -= 2; + } + HL--; + } + break; + case 0xbb: /* OTDR */ + { + uint8 outitemp, outitemp2; + + contend_read_no_mreq( IR, 1 ); + outitemp = Z80_RB_MACRO( HL ); + B--; /* This does happen first, despite what the specs say */ + Z80_WP_MACRO(BC,outitemp); + + HL--; + outitemp2 = outitemp + L; + F = ( outitemp & 0x80 ? FLAG_N : 0 ) | + ( ( outitemp2 < outitemp ) ? FLAG_H | FLAG_C : 0 ) | + ( parity_table[ ( outitemp2 & 0x07 ) ^ B ] ? FLAG_P : 0 ) | + sz53_table[B]; + + if( B ) { + contend_read_no_mreq( BC, 1 ); contend_read_no_mreq( BC, 1 ); + contend_read_no_mreq( BC, 1 ); contend_read_no_mreq( BC, 1 ); + contend_read_no_mreq( BC, 1 ); + PC -= 2; + } + } + break; + case 0xfb: /* slttrap */ + //slt_trap( HL, A ); + break; + default: /* All other opcodes are NOPD */ + break; diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80_macros.h b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_macros.h new file mode 100644 index 0000000000..e109994fc5 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_macros.h @@ -0,0 +1,432 @@ +/* z80_macros.h: Some commonly used z80 things as macros + Copyright (c) 1999-2011 Philip Kendall + + $Id: z80_macros.h 4624 2012-01-09 20:59:35Z pak21 $ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +#ifndef FUSE_Z80_MACROS_H +#define FUSE_Z80_MACROS_H + +/* Macros used for accessing the registers */ +#define A z80.af.b.h +#define F z80.af.b.l +#define AF z80.af.w + +#define B z80.bc.b.h +#define C z80.bc.b.l +#define BC z80.bc.w + +#define D z80.de.b.h +#define E z80.de.b.l +#define DE z80.de.w + +#define H z80.hl.b.h +#define L z80.hl.b.l +#define HL z80.hl.w + +#define A_ z80.af_.b.h +#define F_ z80.af_.b.l +#define AF_ z80.af_.w + +#define B_ z80.bc_.b.h +#define C_ z80.bc_.b.l +#define BC_ z80.bc_.w + +#define D_ z80.de_.b.h +#define E_ z80.de_.b.l +#define DE_ z80.de_.w + +#define H_ z80.hl_.b.h +#define L_ z80.hl_.b.l +#define HL_ z80.hl_.w + +#define IXH z80.ix.b.h +#define IXL z80.ix.b.l +#define IX z80.ix.w + +#define IYH z80.iy.b.h +#define IYL z80.iy.b.l +#define IY z80.iy.w + +#define SPH z80.sp.b.h +#define SPL z80.sp.b.l +#define SP z80.sp.w + +#define PCH z80.pc.b.h +#define PCL z80.pc.b.l +#define PC z80.pc.w + +#define I z80.i +#define R z80.r +#define R7 z80.r7 + +#define IFF1 z80.iff1 +#define IFF2 z80.iff2 +#define IM z80.im + +#define IR ( ( z80.i ) << 8 | ( z80.r7 & 0x80 ) | ( z80.r & 0x7f ) ) + +/* The flags */ + +#define FLAG_C 0x01 +#define FLAG_N 0x02 +#define FLAG_P 0x04 +#define FLAG_V FLAG_P +#define FLAG_3 0x08 +#define FLAG_H 0x10 +#define FLAG_5 0x20 +#define FLAG_Z 0x40 +#define FLAG_S 0x80 + +/* Get the appropriate contended memory delay. Use a macro for performance + reasons in the main core, but a function for flexibility when building + the core tester */ + +#ifndef CORETEST + +#if 0 +#define contend_read(address,time) \ + if( memory_map_read[ (address) >> MEMORY_PAGE_SIZE_LOGARITHM ].contended ) \ + z80_tstates += ula_contention[ z80_tstates ]; \ + z80_tstates += (time); + +#define contend_read_no_mreq(address,time) \ + if( memory_map_read[ (address) >> MEMORY_PAGE_SIZE_LOGARITHM ].contended ) \ + z80_tstates += ula_contention_no_mreq[ z80_tstates ]; \ + z80_tstates += (time); + +#define contend_write_no_mreq(address,time) \ + if( memory_map_write[ (address) >> MEMORY_PAGE_SIZE_LOGARITHM ].contended ) \ + z80_tstates += ula_contention_no_mreq[ z80_tstates ]; \ + z80_tstates += (time); +#endif + +#define contend_read(address,time) \ + z80_tstates += (time); + +#define contend_read_no_mreq(address,time) \ + z80_tstates += (time); + +#define contend_write_no_mreq(address,time) \ + z80_tstates += (time); + + +#else /* #ifndef CORETEST */ + +void contend_read( uint16 address, uint32 time ); +void contend_read_no_mreq( uint16 address, uint32 time ); +void contend_write_no_mreq( uint16 address, uint32 time ); + +#endif /* #ifndef CORETEST */ + +/* Some commonly used instructions */ +#define AND(value)\ +{\ + A &= (value);\ + F = FLAG_H | sz53p_table[A];\ +} + +#define ADC(value)\ +{\ + uint16 adctemp = A + (value) + ( F & FLAG_C ); \ + uint8 lookup = ( ( A & 0x88 ) >> 3 ) | \ + ( ( (value) & 0x88 ) >> 2 ) | \ + ( ( adctemp & 0x88 ) >> 1 ); \ + A=adctemp;\ + F = ( adctemp & 0x100 ? FLAG_C : 0 ) |\ + halfcarry_add_table[lookup & 0x07] | overflow_add_table[lookup >> 4] |\ + sz53_table[A];\ +} + +#define ADC16(value)\ +{\ + uint32 add16temp= HL + (value) + ( F & FLAG_C ); \ + uint8 lookup = ( ( HL & 0x8800 ) >> 11 ) | \ + ( ( (value) & 0x8800 ) >> 10 ) | \ + ( ( add16temp & 0x8800 ) >> 9 ); \ + HL = add16temp;\ + F = ( add16temp & 0x10000 ? FLAG_C : 0 )|\ + overflow_add_table[lookup >> 4] |\ + ( H & ( FLAG_3 | FLAG_5 | FLAG_S ) ) |\ + halfcarry_add_table[lookup&0x07]|\ + ( HL ? 0 : FLAG_Z );\ +} + +#define ADD(value)\ +{\ + uint16 addtemp = A + (value); \ + uint8 lookup = ( ( A & 0x88 ) >> 3 ) | \ + ( ( (value) & 0x88 ) >> 2 ) | \ + ( ( addtemp & 0x88 ) >> 1 ); \ + A=addtemp;\ + F = ( addtemp & 0x100 ? FLAG_C : 0 ) |\ + halfcarry_add_table[lookup & 0x07] | overflow_add_table[lookup >> 4] |\ + sz53_table[A];\ +} + +#define ADD16(value1,value2)\ +{\ + uint32 add16temp = (value1) + (value2); \ + uint8 lookup = ( ( (value1) & 0x0800 ) >> 11 ) | \ + ( ( (value2) & 0x0800 ) >> 10 ) | \ + ( ( add16temp & 0x0800 ) >> 9 ); \ + (value1) = add16temp;\ + F = ( F & ( FLAG_V | FLAG_Z | FLAG_S ) ) |\ + ( add16temp & 0x10000 ? FLAG_C : 0 )|\ + ( ( add16temp >> 8 ) & ( FLAG_3 | FLAG_5 ) ) |\ + halfcarry_add_table[lookup];\ +} + +/* This may look fairly inefficient, but the (gcc) optimiser does the + right thing assuming it's given a constant for 'bit' */ +#define BIT( bit, value ) \ +{ \ + F = ( F & FLAG_C ) | FLAG_H | ( value & ( FLAG_3 | FLAG_5 ) ); \ + if( ! ( (value) & ( 0x01 << (bit) ) ) ) F |= FLAG_P | FLAG_Z; \ + if( (bit) == 7 && (value) & 0x80 ) F |= FLAG_S; \ +} + +#define BIT_I( bit, value, address ) \ +{ \ + F = ( F & FLAG_C ) | FLAG_H | ( ( address >> 8 ) & ( FLAG_3 | FLAG_5 ) ); \ + if( ! ( (value) & ( 0x01 << (bit) ) ) ) F |= FLAG_P | FLAG_Z; \ + if( (bit) == 7 && (value) & 0x80 ) F |= FLAG_S; \ +} + +#define CALL()\ +{\ + uint8 calltempl, calltemph; \ + calltempl=Z80_RB_MACRO(PC++);\ + calltemph=Z80_RB_MACRO( PC ); \ + contend_read_no_mreq( PC, 1 ); PC++;\ + PUSH16(PCL,PCH);\ + PCL=calltempl; PCH=calltemph;\ +} + +#define CP(value)\ +{\ + uint16 cptemp = A - value; \ + uint8 lookup = ( ( A & 0x88 ) >> 3 ) | \ + ( ( (value) & 0x88 ) >> 2 ) | \ + ( ( cptemp & 0x88 ) >> 1 ); \ + F = ( cptemp & 0x100 ? FLAG_C : ( cptemp ? 0 : FLAG_Z ) ) | FLAG_N |\ + halfcarry_sub_table[lookup & 0x07] |\ + overflow_sub_table[lookup >> 4] |\ + ( value & ( FLAG_3 | FLAG_5 ) ) |\ + ( cptemp & FLAG_S );\ +} + +/* Macro for the {DD,FD} CB dd xx rotate/shift instructions */ +#define DDFDCB_ROTATESHIFT(time, target, instruction)\ +z80_tstates+=(time);\ +{\ + (target) = Z80_RB_MACRO( tempaddr );\ + instruction( (target) );\ + Z80_WB_MACRO( tempaddr, (target) );\ +}\ +break + +#define DEC(value)\ +{\ + F = ( F & FLAG_C ) | ( (value)&0x0f ? 0 : FLAG_H ) | FLAG_N;\ + (value)--;\ + F |= ( (value)==0x7f ? FLAG_V : 0 ) | sz53_table[value];\ +} + +#define Z80_IN( reg, port )\ +{\ + (reg)=Z80_RP_MACRO((port));\ + F = ( F & FLAG_C) | sz53p_table[(reg)];\ +} + +#define INC(value)\ +{\ + (value)++;\ + F = ( F & FLAG_C ) | ( (value)==0x80 ? FLAG_V : 0 ) |\ + ( (value)&0x0f ? 0 : FLAG_H ) | sz53_table[(value)];\ +} + +#define LD16_NNRR(regl,regh)\ +{\ + uint16 ldtemp; \ + ldtemp=Z80_RB_MACRO(PC++);\ + ldtemp|=Z80_RB_MACRO(PC++) << 8;\ + Z80_WB_MACRO(ldtemp++,(regl));\ + Z80_WB_MACRO(ldtemp,(regh));\ + break;\ +} + +#define LD16_RRNN(regl,regh)\ +{\ + uint16 ldtemp; \ + ldtemp=Z80_RB_MACRO(PC++);\ + ldtemp|=Z80_RB_MACRO(PC++) << 8;\ + (regl)=Z80_RB_MACRO(ldtemp++);\ + (regh)=Z80_RB_MACRO(ldtemp);\ + break;\ +} + +#define JP()\ +{\ + uint16 jptemp=PC; \ + PCL=Z80_RB_MACRO(jptemp++);\ + PCH=Z80_RB_MACRO(jptemp);\ +} + +#define JR()\ +{\ + int8 jrtemp = Z80_RB_MACRO( PC ); \ + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); \ + contend_read_no_mreq( PC, 1 ); contend_read_no_mreq( PC, 1 ); \ + contend_read_no_mreq( PC, 1 ); \ + PC += jrtemp; \ +} + +#define OR(value)\ +{\ + A |= (value);\ + F = sz53p_table[A];\ +} + +#define POP16(regl,regh)\ +{\ + (regl)=Z80_RB_MACRO(SP++);\ + (regh)=Z80_RB_MACRO(SP++);\ +} + +#define PUSH16(regl,regh)\ +{\ + Z80_WB_MACRO( --SP, (regh) );\ + Z80_WB_MACRO( --SP, (regl) );\ +} + +#define RET()\ +{\ + POP16(PCL,PCH);\ +} + +#define RL(value)\ +{\ + uint8 rltemp = (value); \ + (value) = ( (value)<<1 ) | ( F & FLAG_C );\ + F = ( rltemp >> 7 ) | sz53p_table[(value)];\ +} + +#define RLC(value)\ +{\ + (value) = ( (value)<<1 ) | ( (value)>>7 );\ + F = ( (value) & FLAG_C ) | sz53p_table[(value)];\ +} + +#define RR(value)\ +{\ + uint8 rrtemp = (value); \ + (value) = ( (value)>>1 ) | ( F << 7 );\ + F = ( rrtemp & FLAG_C ) | sz53p_table[(value)];\ +} + +#define RRC(value)\ +{\ + F = (value) & FLAG_C;\ + (value) = ( (value)>>1 ) | ( (value)<<7 );\ + F |= sz53p_table[(value)];\ +} + +#define RST(value)\ +{\ + PUSH16(PCL,PCH);\ + PC=(value);\ +} + +#define SBC(value)\ +{\ + uint16 sbctemp = A - (value) - ( F & FLAG_C ); \ + uint8 lookup = ( ( A & 0x88 ) >> 3 ) | \ + ( ( (value) & 0x88 ) >> 2 ) | \ + ( ( sbctemp & 0x88 ) >> 1 ); \ + A=sbctemp;\ + F = ( sbctemp & 0x100 ? FLAG_C : 0 ) | FLAG_N |\ + halfcarry_sub_table[lookup & 0x07] | overflow_sub_table[lookup >> 4] |\ + sz53_table[A];\ +} + +#define SBC16(value)\ +{\ + uint32 sub16temp = HL - (value) - (F & FLAG_C); \ + uint8 lookup = ( ( HL & 0x8800 ) >> 11 ) | \ + ( ( (value) & 0x8800 ) >> 10 ) | \ + ( ( sub16temp & 0x8800 ) >> 9 ); \ + HL = sub16temp;\ + F = ( sub16temp & 0x10000 ? FLAG_C : 0 ) |\ + FLAG_N | overflow_sub_table[lookup >> 4] |\ + ( H & ( FLAG_3 | FLAG_5 | FLAG_S ) ) |\ + halfcarry_sub_table[lookup&0x07] |\ + ( HL ? 0 : FLAG_Z) ;\ +} + +#define SLA(value)\ +{\ + F = (value) >> 7;\ + (value) <<= 1;\ + F |= sz53p_table[(value)];\ +} + +#define SLL(value)\ +{\ + F = (value) >> 7;\ + (value) = ( (value) << 1 ) | 0x01;\ + F |= sz53p_table[(value)];\ +} + +#define SRA(value)\ +{\ + F = (value) & FLAG_C;\ + (value) = ( (value) & 0x80 ) | ( (value) >> 1 );\ + F |= sz53p_table[(value)];\ +} + +#define SRL(value)\ +{\ + F = (value) & FLAG_C;\ + (value) >>= 1;\ + F |= sz53p_table[(value)];\ +} + +#define SUB(value)\ +{\ + uint16 subtemp = A - (value); \ + uint8 lookup = ( ( A & 0x88 ) >> 3 ) | \ + ( ( (value) & 0x88 ) >> 2 ) | \ + ( (subtemp & 0x88 ) >> 1 ); \ + A=subtemp;\ + F = ( subtemp & 0x100 ? FLAG_C : 0 ) | FLAG_N |\ + halfcarry_sub_table[lookup & 0x07] | overflow_sub_table[lookup >> 4] |\ + sz53_table[A];\ +} + +#define XOR(value)\ +{\ + A ^= (value);\ + F = sz53p_table[A];\ +} + +#endif /* #ifndef FUSE_Z80_MACROS_H */ diff --git a/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ops.cpp b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ops.cpp new file mode 100644 index 0000000000..ad09076eb4 --- /dev/null +++ b/Mednafen/mednafen/hw_cpu/z80-fuse/z80_ops.cpp @@ -0,0 +1,74 @@ +/* z80_ops.c: Process the next opcode + Copyright (c) 1999-2005 Philip Kendall, Witold Filipczyk + + $Id: z80_ops.c 4624 2012-01-09 20:59:35Z pak21 $ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + Author contact information: + + E-mail: philip-fuse@shadowmagic.org.uk + +*/ + +#include "z80.h" + +#include "z80_macros.h" + +int iline = 0; + +void z80_set_interrupt(int set) +{ + iline = set; +} + +int z80_do_opcode( void ) +{ + if(iline) + { + if(z80_interrupt()) + { + int ret = z80_tstates - last_z80_tstates; + last_z80_tstates = z80_tstates; + return(ret); + } + } + + uint8 opcode; + + /* Check to see if M1 cycles happen on even z80_tstates */ + //if( z80_tstates & 1 ) + // z80_tstates++; + //uint16 lastpc = PC; + + opcode = Z80_RB_MACRO( PC ); + //printf("Z80-op: %04x, %02x\n", PC, opcode); + z80_tstates++; + + PC++; + R++; + + switch(opcode) + { + #include "opcodes_base.c" + } + + int ret = z80_tstates - last_z80_tstates; + last_z80_tstates = z80_tstates; + + //printf("PC: %04x, %02x, time=%d\n", lastpc, opcode, ret); + + return(ret); +} diff --git a/Mednafen/mednafen/hw_misc/Makefile.am b/Mednafen/mednafen/hw_misc/Makefile.am new file mode 100644 index 0000000000..e43bf1c6dd --- /dev/null +++ b/Mednafen/mednafen/hw_misc/Makefile.am @@ -0,0 +1,11 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnhwmisc.a + +libmdfnhwmisc_a_SOURCES = + +if NEED_ARCADE_CARD_EMU +libmdfnhwmisc_a_SOURCES += arcade_card/arcade_card.cpp +endif diff --git a/Mednafen/mednafen/hw_misc/Makefile.in b/Mednafen/mednafen/hw_misc/Makefile.in new file mode 100644 index 0000000000..520b8fe6c3 --- /dev/null +++ b/Mednafen/mednafen/hw_misc/Makefile.in @@ -0,0 +1,692 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@NEED_ARCADE_CARD_EMU_TRUE@am__append_1 = arcade_card/arcade_card.cpp +subdir = src/hw_misc +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnhwmisc_a_AR = $(AR) $(ARFLAGS) +libmdfnhwmisc_a_LIBADD = +am__libmdfnhwmisc_a_SOURCES_DIST = arcade_card/arcade_card.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@NEED_ARCADE_CARD_EMU_TRUE@am__objects_1 = \ +@NEED_ARCADE_CARD_EMU_TRUE@ arcade_card/arcade_card.$(OBJEXT) +am_libmdfnhwmisc_a_OBJECTS = $(am__objects_1) +libmdfnhwmisc_a_OBJECTS = $(am_libmdfnhwmisc_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfnhwmisc_a_SOURCES) +DIST_SOURCES = $(am__libmdfnhwmisc_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnhwmisc.a +libmdfnhwmisc_a_SOURCES = $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/hw_misc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/hw_misc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +arcade_card/$(am__dirstamp): + @$(MKDIR_P) arcade_card + @: > arcade_card/$(am__dirstamp) +arcade_card/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) arcade_card/$(DEPDIR) + @: > arcade_card/$(DEPDIR)/$(am__dirstamp) +arcade_card/arcade_card.$(OBJEXT): arcade_card/$(am__dirstamp) \ + arcade_card/$(DEPDIR)/$(am__dirstamp) + +libmdfnhwmisc.a: $(libmdfnhwmisc_a_OBJECTS) $(libmdfnhwmisc_a_DEPENDENCIES) $(EXTRA_libmdfnhwmisc_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnhwmisc.a + $(AM_V_AR)$(libmdfnhwmisc_a_AR) libmdfnhwmisc.a $(libmdfnhwmisc_a_OBJECTS) $(libmdfnhwmisc_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnhwmisc.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f arcade_card/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@arcade_card/$(DEPDIR)/arcade_card.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f arcade_card/$(DEPDIR)/$(am__dirstamp) + -rm -f arcade_card/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf arcade_card/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf arcade_card/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/hw_misc/arcade_card/arcade_card.cpp b/Mednafen/mednafen/hw_misc/arcade_card/arcade_card.cpp new file mode 100644 index 0000000000..b0c4c93db5 --- /dev/null +++ b/Mednafen/mednafen/hw_misc/arcade_card/arcade_card.cpp @@ -0,0 +1,365 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + Arcade Card emulation based on information provided by Ki and David Shadoff +*/ + +#include +#include "arcade_card.h" + +#include +#include + +static INLINE void ACAutoIncrement(ACPort_t *port) +{ + if(port->control & 0x1) + { + if(port->control & 0x10) + { + //if(port->control & 0x4) + //{ + // printf("BOONY: %04x\n", port->increment); + // port->base = (port->base + port->increment + 0xFF0000) & 0xFFFFFF; + // printf("%04x\n", port->base); + //} + //else + port->base = (port->base + port->increment) & 0xFFFFFF; + } + else + { + port->offset = (port->offset + port->increment) & 0xFFFF; + } + } +} + +uint8 ArcadeCard::Read(uint32 A, bool peek) +{ + //printf("AC Read: %04x\n", A); + if((A & 0x1F00) != 0x1A00) + { + //if(!peek) + // printf("AC unknown read: %08x\n", A); + return(0xFF); + } + if(A < 0x1A80) + { + ACPort_t *port = &AC.ports[(A >> 4) & 0x3]; + + // if(!peek) + // if(A & 0x40) + // printf("AC mirrored port read: %08x\n", A); // Madou Monogatari does! + + switch(A & 0xF) + { + case 0x00: + case 0x01: + { + uint32 aci; + uint8 ret; + + aci = port->base; + if(port->control & 0x2) + { + aci += port->offset; + if(port->control & 0x8) + aci += 0xFF0000; + } + aci &= 0x1FFFFF; + ret = ACRAM[aci]; + if(!peek) + ACAutoIncrement(port); + return(ret); + } + case 0x02: return(port->base >> 0); + case 0x03: return(port->base >> 8); + case 0x04: return(port->base >> 16); + + case 0x05: return(port->offset >> 0); + case 0x06: return(port->offset >> 8); + + case 0x07: return(port->increment >> 0); + case 0x08: return(port->increment >> 8); + case 0x09: return(port->control); + } + } + else if(A >= 0x1AE0) + { + switch(A & 0x1F) + { + case 0x00: + case 0x01: + case 0x02: + case 0x03: return((AC.shift_latch >> (A & 3) * 8) & 0xFF); + + case 0x04: return(AC.shift_bits); + + case 0x05: return(AC.rotate_bits); + + case 0x1C: return(0x00); + + case 0x1D: return(0x00); + + case 0x1E: return(0x10); // Version number. We should verify this! + + case 0x1F: return(0x51); // Arcade Card ID + } + } + + //if(!peek) + // printf("AC unknown read: %08x\n", A); + return(0xFF); +} + +void ArcadeCard::Write(uint32 A, uint8 V) +{ + //printf("AC Write: %04x %02x\n", A, V); + if((A & 0x1F00) != 0x1A00) + { + //printf("AC unknown write: %08x:%02x\n", A, V); + return; + } + + if(A < 0x1A80) + { + ACPort_t *port = &AC.ports[(A >> 4) & 0x3]; + + switch(A & 0xF) + { + default: //printf("AC unknown write: %08x:%02x\n", A, V); + break; + + case 0x00: + case 0x01: + { + uint32 aci; + + aci = port->base; + if(port->control & 0x2) + { + aci += port->offset; + if(port->control & 0x8) + aci += 0xFF0000; + } + aci &= 0x1FFFFF; + + ACRAMUsed = true; + ACRAM[aci] = V; + ACAutoIncrement(port); + } + break; + + case 0x02: port->base &= ~0xFF; + port->base |= V << 0; + break; + + case 0x03: port->base &= ~0xFF00; + port->base |= V << 8; + break; + + case 0x04: port->base &= ~0xFF0000; + port->base |= V << 16; + break; + + case 0x05: port->offset &= ~0xFF; + port->offset |= V << 0; + if((port->control & 0x60) == 0x20) + { + if(port->control & 0x08) + port->base += 0xFF0000; + + port->base = (port->base + port->offset) & 0xFFFFFF; + } + break; + + case 0x06: port->offset &= ~0xFF00; + port->offset |= V << 8; + if((port->control & 0x60) == 0x40) + { + if(port->control & 0x08) + port->base += 0xFF0000; + + port->base = (port->base + port->offset) & 0xFFFFFF; + } + break; + + case 0x07: port->increment &= ~0xFF; + port->increment |= V << 0; + break; + + case 0x08: port->increment &= ~0xFF00; + port->increment |= V << 8; + break; + + case 0x09: port->control = V & 0x7F; + break; + + case 0x0A: if((port->control & 0x60) == 0x60) + { + if(port->control & 0x08) + port->base += 0xFF0000; + + port->base = (port->base + port->offset) & 0xFFFFFF; + } + break; + } + + //if(A & 0x40) + // printf("AC mirrored port write: %08x:%02x\n", A, V); + } + else if(A >= 0x1AE0) + { + switch(A & 0x1F) + { + default: //printf("Unknown AC write: %04x %02x\n", A, V); + break; + + case 0x00: + case 0x01: + case 0x02: + case 0x03: AC.shift_latch &= ~(0xFF << (A & 3) * 8); + AC.shift_latch |= (V << (A & 3) * 8); + break; + + case 0x04: AC.shift_bits = V & 0xF; + if(AC.shift_bits) + { + if(AC.shift_bits & 0x8) + AC.shift_latch >>= 16 - AC.shift_bits; + else + AC.shift_latch <<= AC.shift_bits; + } + break; + + case 0x05: AC.rotate_bits = V & 0xF; // Untested code follows: + if(AC.rotate_bits) + { + if(AC.rotate_bits & 0x8) + { + unsigned int sa = 16 - AC.rotate_bits; + unsigned int orv; + + orv = AC.shift_latch << (32 - sa); + + AC.shift_latch = (AC.shift_latch >> sa) | orv; + } + else + { + unsigned int sa = AC.rotate_bits; + unsigned int orv; + + orv = (AC.shift_latch >> (32 - sa)) & ((1 << sa) - 1); + + AC.shift_latch = (AC.shift_latch << sa) | orv; + } + } + break; + } + } +} + +ArcadeCard::ArcadeCard(void) +{ + ACRAMUsed = false; + + memset(&AC, 0, sizeof(AC)); + + memset(ACRAM, 0, sizeof(ACRAM)); +} + +ArcadeCard::~ArcadeCard() +{ + +} + +void ArcadeCard::Power(void) +{ + memset(ACRAM, 0, 0x200000); + ACRAMUsed = false; +} + +void ArcadeCard::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT ACUsedRegs[] = + { + SFVAR(ACRAMUsed), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, ACUsedRegs, "ArcadeCardUsed"); + + SFORMAT ACStateRegs[] = + { + SFVARN(AC.ports[0].base, "AC[0].base"), SFVARN(AC.ports[0].offset, "AC[0].offset"), + SFVARN(AC.ports[0].increment, "AC[0].increment"), SFVARN(AC.ports[0].control, "AC[0].control"), + + SFVARN(AC.ports[1].base, "AC[1].base"), SFVARN(AC.ports[1].offset, "AC[1].offset"), + SFVARN(AC.ports[1].increment, "AC[1].increment"), SFVARN(AC.ports[1].control, "AC[1].control"), + + SFVARN(AC.ports[2].base, "AC[2].base"), SFVARN(AC.ports[2].offset, "AC[2].offset"), + SFVARN(AC.ports[2].increment, "AC[2].increment"), SFVARN(AC.ports[2].control, "AC[2].control"), + + SFVARN(AC.ports[3].base, "AC[3].base"), SFVARN(AC.ports[3].offset, "AC[3].offset"), + SFVARN(AC.ports[3].increment, "AC[3].increment"), SFVARN(AC.ports[3].control, "AC[3].control"), + + SFVARN(AC.shift_bits, "ACShiftBits"), + SFVARN(AC.shift_latch, "ACShift"), + SFVARN(AC.rotate_bits, "ACRotateBits"), + SFARRAY(ACRAM, ACRAMUsed ? 0x200000 : 0x0), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, ACStateRegs, "ArcadeCard"); + + if(load) + { + + } +} + + +void ArcadeCard::PeekRAM(uint32 Address, uint32 Length, uint8 *Buffer) +{ + while(Length--) + { + Address &= (1 << 21) - 1; + + *Buffer = ACRAM[Address]; + + Address++; + Buffer++; + } +} + +void ArcadeCard::PokeRAM(uint32 Address, uint32 Length, const uint8 *Buffer) +{ + uint8 used = 0; + + while(Length--) + { + Address &= (1 << 21) - 1; + + ACRAM[Address] = *Buffer; + used |= ACRAM[Address]; + + Address++; + Buffer++; + } + + if(used) + ACRAMUsed = true; +} + diff --git a/Mednafen/mednafen/hw_misc/arcade_card/arcade_card.h b/Mednafen/mednafen/hw_misc/arcade_card/arcade_card.h new file mode 100644 index 0000000000..b1a090250b --- /dev/null +++ b/Mednafen/mednafen/hw_misc/arcade_card/arcade_card.h @@ -0,0 +1,55 @@ +#ifndef __MDFN_PCE_ARCADE_CARD_H +#define __MDFN_PCE_ARCADE_CARD_H + +typedef struct +{ + uint32 base; // 24 bits + uint16 offset; // 16 bits + uint16 increment; // 16 bits + uint8 control; // 7 bits +} ACPort_t; + +typedef struct +{ + ACPort_t ports[4]; + uint32 shift_latch; // 32 bits + uint8 shift_bits; // signed 4-bit value + uint8 rotate_bits; // same +} ArcadeCard_t; + +class ArcadeCard +{ + public: + + ArcadeCard(void); + ~ArcadeCard(); + + void Power(void); + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + uint8 Read(uint32 A, bool peek = false); // Pass peek as true if you don't want side-effects from this read(IE in a debugger). + void Write(uint32 A, uint8 V); + + INLINE void PhysWrite(uint32 A, uint8 V) + { + Write(0x1a00 | ((A >> 9) & 0x30), V); + } + + INLINE uint8 PhysRead(uint32 A, bool peek = false) + { + return(Read(0x1a00 | ((A >> 9) & 0x30), peek)); + } + + + void PeekRAM(uint32 Address, uint32 Length, uint8 *Buffer); + void PokeRAM(uint32 Address, uint32 Length, const uint8 *Buffer); + + private: + + ArcadeCard_t AC; + + bool ACRAMUsed; + uint8 ACRAM[0x200000]; +}; + +#endif diff --git a/Mednafen/mednafen/hw_sound/Makefile.am b/Mednafen/mednafen/hw_sound/Makefile.am new file mode 100644 index 0000000000..626598f0cb --- /dev/null +++ b/Mednafen/mednafen/hw_sound/Makefile.am @@ -0,0 +1,28 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnhwsound.a + +libmdfnhwsound_a_SOURCES = + +if NEED_YM2413_EMU +libmdfnhwsound_a_SOURCES += ym2413/emu2413.cpp +endif + +if NEED_YM2612_EMU +libmdfnhwsound_a_SOURCES += ym2612/Ym2612_Emu.cpp +endif + +if NEED_GB_APU_EMU +libmdfnhwsound_a_SOURCES += gb_apu/Gb_Apu.cpp gb_apu/Gb_Apu_State.cpp gb_apu/Gb_Oscs.cpp +endif + +if NEED_SMS_APU_EMU +libmdfnhwsound_a_SOURCES += sms_apu/Sms_Apu.cpp +endif + +if NEED_PCE_PSG_EMU +libmdfnhwsound_a_SOURCES += pce_psg/pce_psg.cpp +endif + diff --git a/Mednafen/mednafen/hw_sound/Makefile.in b/Mednafen/mednafen/hw_sound/Makefile.in new file mode 100644 index 0000000000..ade26c7826 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/Makefile.in @@ -0,0 +1,760 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@NEED_YM2413_EMU_TRUE@am__append_1 = ym2413/emu2413.cpp +@NEED_YM2612_EMU_TRUE@am__append_2 = ym2612/Ym2612_Emu.cpp +@NEED_GB_APU_EMU_TRUE@am__append_3 = gb_apu/Gb_Apu.cpp gb_apu/Gb_Apu_State.cpp gb_apu/Gb_Oscs.cpp +@NEED_SMS_APU_EMU_TRUE@am__append_4 = sms_apu/Sms_Apu.cpp +@NEED_PCE_PSG_EMU_TRUE@am__append_5 = pce_psg/pce_psg.cpp +subdir = src/hw_sound +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnhwsound_a_AR = $(AR) $(ARFLAGS) +libmdfnhwsound_a_LIBADD = +am__libmdfnhwsound_a_SOURCES_DIST = ym2413/emu2413.cpp \ + ym2612/Ym2612_Emu.cpp gb_apu/Gb_Apu.cpp \ + gb_apu/Gb_Apu_State.cpp gb_apu/Gb_Oscs.cpp sms_apu/Sms_Apu.cpp \ + pce_psg/pce_psg.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@NEED_YM2413_EMU_TRUE@am__objects_1 = ym2413/emu2413.$(OBJEXT) +@NEED_YM2612_EMU_TRUE@am__objects_2 = ym2612/Ym2612_Emu.$(OBJEXT) +@NEED_GB_APU_EMU_TRUE@am__objects_3 = gb_apu/Gb_Apu.$(OBJEXT) \ +@NEED_GB_APU_EMU_TRUE@ gb_apu/Gb_Apu_State.$(OBJEXT) \ +@NEED_GB_APU_EMU_TRUE@ gb_apu/Gb_Oscs.$(OBJEXT) +@NEED_SMS_APU_EMU_TRUE@am__objects_4 = sms_apu/Sms_Apu.$(OBJEXT) +@NEED_PCE_PSG_EMU_TRUE@am__objects_5 = pce_psg/pce_psg.$(OBJEXT) +am_libmdfnhwsound_a_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) +libmdfnhwsound_a_OBJECTS = $(am_libmdfnhwsound_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfnhwsound_a_SOURCES) +DIST_SOURCES = $(am__libmdfnhwsound_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnhwsound.a +libmdfnhwsound_a_SOURCES = $(am__append_1) $(am__append_2) \ + $(am__append_3) $(am__append_4) $(am__append_5) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/hw_sound/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/hw_sound/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +ym2413/$(am__dirstamp): + @$(MKDIR_P) ym2413 + @: > ym2413/$(am__dirstamp) +ym2413/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ym2413/$(DEPDIR) + @: > ym2413/$(DEPDIR)/$(am__dirstamp) +ym2413/emu2413.$(OBJEXT): ym2413/$(am__dirstamp) \ + ym2413/$(DEPDIR)/$(am__dirstamp) +ym2612/$(am__dirstamp): + @$(MKDIR_P) ym2612 + @: > ym2612/$(am__dirstamp) +ym2612/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ym2612/$(DEPDIR) + @: > ym2612/$(DEPDIR)/$(am__dirstamp) +ym2612/Ym2612_Emu.$(OBJEXT): ym2612/$(am__dirstamp) \ + ym2612/$(DEPDIR)/$(am__dirstamp) +gb_apu/$(am__dirstamp): + @$(MKDIR_P) gb_apu + @: > gb_apu/$(am__dirstamp) +gb_apu/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) gb_apu/$(DEPDIR) + @: > gb_apu/$(DEPDIR)/$(am__dirstamp) +gb_apu/Gb_Apu.$(OBJEXT): gb_apu/$(am__dirstamp) \ + gb_apu/$(DEPDIR)/$(am__dirstamp) +gb_apu/Gb_Apu_State.$(OBJEXT): gb_apu/$(am__dirstamp) \ + gb_apu/$(DEPDIR)/$(am__dirstamp) +gb_apu/Gb_Oscs.$(OBJEXT): gb_apu/$(am__dirstamp) \ + gb_apu/$(DEPDIR)/$(am__dirstamp) +sms_apu/$(am__dirstamp): + @$(MKDIR_P) sms_apu + @: > sms_apu/$(am__dirstamp) +sms_apu/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) sms_apu/$(DEPDIR) + @: > sms_apu/$(DEPDIR)/$(am__dirstamp) +sms_apu/Sms_Apu.$(OBJEXT): sms_apu/$(am__dirstamp) \ + sms_apu/$(DEPDIR)/$(am__dirstamp) +pce_psg/$(am__dirstamp): + @$(MKDIR_P) pce_psg + @: > pce_psg/$(am__dirstamp) +pce_psg/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pce_psg/$(DEPDIR) + @: > pce_psg/$(DEPDIR)/$(am__dirstamp) +pce_psg/pce_psg.$(OBJEXT): pce_psg/$(am__dirstamp) \ + pce_psg/$(DEPDIR)/$(am__dirstamp) + +libmdfnhwsound.a: $(libmdfnhwsound_a_OBJECTS) $(libmdfnhwsound_a_DEPENDENCIES) $(EXTRA_libmdfnhwsound_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnhwsound.a + $(AM_V_AR)$(libmdfnhwsound_a_AR) libmdfnhwsound.a $(libmdfnhwsound_a_OBJECTS) $(libmdfnhwsound_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnhwsound.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f gb_apu/*.$(OBJEXT) + -rm -f pce_psg/*.$(OBJEXT) + -rm -f sms_apu/*.$(OBJEXT) + -rm -f ym2413/*.$(OBJEXT) + -rm -f ym2612/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@gb_apu/$(DEPDIR)/Gb_Apu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gb_apu/$(DEPDIR)/Gb_Apu_State.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@gb_apu/$(DEPDIR)/Gb_Oscs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@pce_psg/$(DEPDIR)/pce_psg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@sms_apu/$(DEPDIR)/Sms_Apu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ym2413/$(DEPDIR)/emu2413.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ym2612/$(DEPDIR)/Ym2612_Emu.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f gb_apu/$(DEPDIR)/$(am__dirstamp) + -rm -f gb_apu/$(am__dirstamp) + -rm -f pce_psg/$(DEPDIR)/$(am__dirstamp) + -rm -f pce_psg/$(am__dirstamp) + -rm -f sms_apu/$(DEPDIR)/$(am__dirstamp) + -rm -f sms_apu/$(am__dirstamp) + -rm -f ym2413/$(DEPDIR)/$(am__dirstamp) + -rm -f ym2413/$(am__dirstamp) + -rm -f ym2612/$(DEPDIR)/$(am__dirstamp) + -rm -f ym2612/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf gb_apu/$(DEPDIR) pce_psg/$(DEPDIR) sms_apu/$(DEPDIR) ym2413/$(DEPDIR) ym2612/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf gb_apu/$(DEPDIR) pce_psg/$(DEPDIR) sms_apu/$(DEPDIR) ym2413/$(DEPDIR) ym2612/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu.cpp b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu.cpp new file mode 100644 index 0000000000..60f9bd2515 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu.cpp @@ -0,0 +1,394 @@ +// Gb_Snd_Emu 0.2.0. http://www.slack.net/~ant/ + +#include "Gb_Apu.h" + +/* Copyright (C) 2003-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +unsigned const vol_reg = 0xFF24; +unsigned const stereo_reg = 0xFF25; +unsigned const status_reg = 0xFF26; +unsigned const wave_ram = 0xFF30; + +int const power_mask = 0x80; + +void Gb_Apu::treble_eq( blip_eq_t const& eq ) +{ + good_synth.treble_eq( eq ); + med_synth .treble_eq( eq ); +} + +inline int Gb_Apu::calc_output( int osc ) const +{ + int bits = regs [stereo_reg - start_addr] >> osc; + return (bits >> 3 & 2) | (bits & 1); +} + +void Gb_Apu::set_output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right, int osc ) +{ + // Must be silent (all NULL), mono (left and right NULL), or stereo (none NULL) + require( !center || (center && !left && !right) || (center && left && right) ); + require( (unsigned) osc <= osc_count ); // fails if you pass invalid osc index + + if ( !center || !left || !right ) + { + left = center; + right = center; + } + + int i = (unsigned) osc % osc_count; + do + { + Gb_Osc& o = *oscs [i]; + o.outputs [1] = right; + o.outputs [2] = left; + o.outputs [3] = center; + o.output = o.outputs [calc_output( i )]; + } + while ( ++i < osc ); +} + +void Gb_Apu::synth_volume( int iv ) +{ + double v = volume_ * 0.60 / osc_count / 15 /*steps*/ / 8 /*master vol range*/ * iv; + good_synth.volume( v ); + med_synth .volume( v ); +} + +void Gb_Apu::apply_volume() +{ + // TODO: Doesn't handle differing left and right volumes (panning). + // Not worth the complexity. + int data = regs [vol_reg - start_addr]; + int left = data >> 4 & 7; + int right = data & 7; + //if ( data & 0x88 ) dprintf( "Vin: %02X\n", data & 0x88 ); + //if ( left != right ) dprintf( "l: %d r: %d\n", left, right ); + synth_volume( max( left, right ) + 1 ); +} + +void Gb_Apu::volume( double v ) +{ + if ( volume_ != v ) + { + volume_ = v; + apply_volume(); + } +} + +void Gb_Apu::reset_regs() +{ + for ( int i = 0; i < 0x20; i++ ) + regs [i] = 0; + + square1.reset(); + square2.reset(); + wave .reset(); + noise .reset(); + + apply_volume(); +} + +void Gb_Apu::reset_lengths() +{ + square1.length_ctr = 64; + square2.length_ctr = 64; + wave .length_ctr = 256; + noise .length_ctr = 64; +} + +void Gb_Apu::reduce_clicks( bool reduce ) +{ + reduce_clicks_ = reduce; + + // Click reduction makes DAC off generate same output as volume 0 + int dac_off_amp = 0; + if ( reduce && wave.mode != mode_agb ) // AGB already eliminates clicks + dac_off_amp = -Gb_Osc::dac_bias; + + for ( int i = 0; i < osc_count; i++ ) + oscs [i]->dac_off_amp = dac_off_amp; + + // AGB always eliminates clicks on wave channel using same method + if ( wave.mode == mode_agb ) + wave.dac_off_amp = -Gb_Osc::dac_bias; +} + +void Gb_Apu::reset( mode_t mode, bool agb_wave ) +{ + // Hardware mode + if ( agb_wave ) + mode = mode_agb; // using AGB wave features implies AGB hardware + wave.agb_mask = agb_wave ? 0xFF : 0; + for ( int i = 0; i < osc_count; i++ ) + oscs [i]->mode = mode; + reduce_clicks( reduce_clicks_ ); + + // Reset state + frame_time = 0; + last_time = 0; + frame_phase = 0; + + reset_regs(); + reset_lengths(); + + // Load initial wave RAM + static byte const initial_wave [2] [16] = { + {0x84,0x40,0x43,0xAA,0x2D,0x78,0x92,0x3C,0x60,0x59,0x59,0xB0,0x34,0xB8,0x2E,0xDA}, + {0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF}, + }; + for ( int b = 2; --b >= 0; ) + { + // Init both banks (does nothing if not in AGB mode) + // TODO: verify that this works + write_register( 0, 0xFF1A, b * 0x40 ); + for ( unsigned i = 0; i < sizeof initial_wave [0]; i++ ) + write_register( 0, i + wave_ram, initial_wave [(mode != mode_dmg)] [i] ); + } +} + +void Gb_Apu::set_tempo( double t ) +{ + frame_period = 4194304 / 512; // 512 Hz + if ( t != 1.0 ) + frame_period = blip_time_t (frame_period / t); +} + +Gb_Apu::Gb_Apu() +{ + wave.wave_ram = ®s [wave_ram - start_addr]; + + oscs [0] = &square1; + oscs [1] = &square2; + oscs [2] = &wave; + oscs [3] = &noise; + + for ( int i = osc_count; --i >= 0; ) + { + Gb_Osc& o = *oscs [i]; + o.regs = ®s [i * 5]; + o.output = 0; + o.outputs [0] = 0; + o.outputs [1] = 0; + o.outputs [2] = 0; + o.outputs [3] = 0; + o.good_synth = &good_synth; + o.med_synth = &med_synth; + } + + reduce_clicks_ = false; + set_tempo( 1.0 ); + volume_ = 1.0; + reset(); +} + +void Gb_Apu::run_until_( blip_time_t end_time ) +{ + while ( true ) + { + // run oscillators + blip_time_t time = end_time; + if ( time > frame_time ) + time = frame_time; + + square1.run( last_time, time ); + square2.run( last_time, time ); + wave .run( last_time, time ); + noise .run( last_time, time ); + last_time = time; + + if ( time == end_time ) + break; + + // run frame sequencer + frame_time += frame_period * Gb_Osc::clk_mul; + switch ( frame_phase++ ) + { + case 2: + case 6: + // 128 Hz + square1.clock_sweep(); + case 0: + case 4: + // 256 Hz + square1.clock_length(); + square2.clock_length(); + wave .clock_length(); + noise .clock_length(); + break; + + case 7: + // 64 Hz + frame_phase = 0; + square1.clock_envelope(); + square2.clock_envelope(); + noise .clock_envelope(); + } + } +} + +inline void Gb_Apu::run_until( blip_time_t time ) +{ + require( time >= last_time ); // end_time must not be before previous time + if ( time > last_time ) + run_until_( time ); +} + +void Gb_Apu::end_frame( blip_time_t end_time ) +{ + if ( end_time > last_time ) + run_until( end_time ); + + frame_time -= end_time; + assert( frame_time >= 0 ); + + last_time -= end_time; + assert( last_time >= 0 ); +} + +void Gb_Apu::silence_osc( Gb_Osc& o ) +{ + int delta = -o.last_amp; + if ( delta ) + { + o.last_amp = 0; + if ( o.output ) + { + o.output->set_modified(); + med_synth.offset( last_time, delta, o.output ); + } + } +} + +void Gb_Apu::apply_stereo() +{ + for ( int i = osc_count; --i >= 0; ) + { + Gb_Osc& o = *oscs [i]; + Blip_Buffer* out = o.outputs [calc_output( i )]; + if ( o.output != out ) + { + silence_osc( o ); + o.output = out; + } + } +} + +void Gb_Apu::write_register( blip_time_t time, unsigned addr, int data ) +{ + require( (unsigned) data < 0x100 ); + + int reg = addr - start_addr; + if ( (unsigned) reg >= register_count ) + { + require( false ); + return; + } + + if ( addr < status_reg && !(regs [status_reg - start_addr] & power_mask) ) + { + // Power is off + + // length counters can only be written in DMG mode + if ( wave.mode != mode_dmg || (reg != 1 && reg != 5+1 && reg != 10+1 && reg != 15+1) ) + return; + + if ( reg < 10 ) + data &= 0x3F; // clear square duty + } + + run_until( time ); + + if ( addr >= wave_ram ) + { + wave.write( addr, data ); + } + else + { + int old_data = regs [reg]; + regs [reg] = data; + + if ( addr < vol_reg ) + { + // Oscillator + write_osc( reg / 5, reg, old_data, data ); + } + else if ( addr == vol_reg && data != old_data ) + { + // Master volume + for ( int i = osc_count; --i >= 0; ) + silence_osc( *oscs [i] ); + + apply_volume(); + } + else if ( addr == stereo_reg ) + { + // Stereo panning + apply_stereo(); + } + else if ( addr == status_reg && (data ^ old_data) & power_mask ) + { + // Power control + frame_phase = 0; + for ( int i = osc_count; --i >= 0; ) + silence_osc( *oscs [i] ); + + reset_regs(); + if ( wave.mode != mode_dmg ) + reset_lengths(); + + regs [status_reg - start_addr] = data; + } + } +} + +int Gb_Apu::read_register( blip_time_t time, unsigned addr ) +{ + run_until( time ); + + int reg = addr - start_addr; + if ( (unsigned) reg >= register_count ) + { + require( false ); + return 0; + } + + if ( addr >= wave_ram ) + return wave.read( addr ); + + // Value read back has some bits always set + static byte const masks [] = { + 0x80,0x3F,0x00,0xFF,0xBF, + 0xFF,0x3F,0x00,0xFF,0xBF, + 0x7F,0xFF,0x9F,0xFF,0xBF, + 0xFF,0xFF,0x00,0x00,0xBF, + 0x00,0x00,0x70, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + }; + int mask = masks [reg]; + if ( wave.agb_mask && (reg == 10 || reg == 12) ) + mask = 0x1F; // extra implemented bits in wave regs on AGB + int data = regs [reg] | mask; + + // Status register + if ( addr == status_reg ) + { + data &= 0xF0; + data |= (int) square1.enabled << 0; + data |= (int) square2.enabled << 1; + data |= (int) wave .enabled << 2; + data |= (int) noise .enabled << 3; + } + + return data; +} diff --git a/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu.h b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu.h new file mode 100644 index 0000000000..6765f28999 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu.h @@ -0,0 +1,182 @@ +// Nintendo Game Boy sound hardware emulator with save state support + +// Gb_Snd_Emu 0.2.0 +#ifndef GB_APU_H +#define GB_APU_H + +#include "Gb_Oscs.h" + +struct gb_apu_state_t; + +class Gb_Apu { +public: +// Basics + + // Clock rate that sound hardware runs at. + enum { clock_rate = 4194304 * GB_APU_OVERCLOCK }; + + // Sets buffer(s) to generate sound into. If left and right are NULL, output is mono. + // If all are NULL, no output is generated but other emulation still runs. + // If chan is specified, only that channel's output is changed, otherwise all are. + enum { osc_count = 4 }; // 0: Square 1, 1: Square 2, 2: Wave, 3: Noise + void set_output( Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL, + int chan = osc_count ); + + // Resets hardware to initial power on state BEFORE boot ROM runs. Mode selects + // sound hardware. Additional AGB wave features are enabled separately. + enum mode_t { + mode_dmg, // Game Boy monochrome + mode_cgb, // Game Boy Color + mode_agb // Game Boy Advance + }; + void reset( mode_t mode = mode_cgb, bool agb_wave = false ); + + // Reads and writes must be within the start_addr to end_addr range, inclusive. + // Addresses outside this range are not mapped to the sound hardware. + enum { start_addr = 0xFF10 }; + enum { end_addr = 0xFF3F }; + enum { register_count = end_addr - start_addr + 1 }; + + // Times are specified as the number of clocks since the beginning of the + // current time frame. + + // Emulates CPU write of data to addr at specified time. + void write_register( blip_time_t time, unsigned addr, int data ); + + // Emulates CPU read from addr at specified time. + int read_register( blip_time_t time, unsigned addr ); + + // Emulates sound hardware up to specified time, ends current time frame, then + // starts a new frame at time 0. + void end_frame( blip_time_t frame_length ); + +// Sound adjustments + + // Sets overall volume, where 1.0 is normal. + void volume( double ); + + // If true, reduces clicking by disabling DAC biasing. Note that this reduces + // emulation accuracy, since the clicks are authentic. + void reduce_clicks( bool reduce = true ); + + // Sets treble equalization. + void treble_eq( blip_eq_t const& ); + + // Treble and bass values for various hardware. + enum { + speaker_treble = -47, // speaker on system + speaker_bass = 2000, + dmg_treble = 0, // headphones on each system + dmg_bass = 30, + cgb_treble = 0, + cgb_bass = 300, // CGB has much less bass + agb_treble = 0, + agb_bass = 30 + }; + + // Sets frame sequencer rate, where 1.0 is normal. Meant for adjusting the + // tempo in a game music player. + void set_tempo( double ); + +// Save states + + // Saves full emulation state to state_out. Data format is portable and + // includes some extra space to avoid expansion in case more state needs + // to be stored in the future. + void save_state( gb_apu_state_t* state_out ); + + // Loads state. You should call reset() BEFORE this. + blargg_err_t load_state( gb_apu_state_t const& in ); + +public: + Gb_Apu(); + + // Use set_output() in place of these + BLARGG_DEPRECATED void output ( Blip_Buffer* c ) { set_output( c, c, c ); } + BLARGG_DEPRECATED void output ( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ) { set_output( c, l, r ); } + BLARGG_DEPRECATED void osc_output( int i, Blip_Buffer* c ) { set_output( c, c, c, i ); } + BLARGG_DEPRECATED void osc_output( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ) { set_output( c, l, r, i ); } + +private: + // noncopyable + Gb_Apu( const Gb_Apu& ); + Gb_Apu& operator = ( const Gb_Apu& ); + + Gb_Osc* oscs [osc_count]; + blip_time_t last_time; // time sound emulator has been run to + blip_time_t frame_period; // clocks between each frame sequencer step + double volume_; + bool reduce_clicks_; + + Gb_Sweep_Square square1; + Gb_Square square2; + Gb_Wave wave; + Gb_Noise noise; + blip_time_t frame_time; // time of next frame sequencer action + int frame_phase; // phase of next frame sequencer step + enum { regs_size = register_count + 0x10 }; + BOOST::uint8_t regs [regs_size];// last values written to registers + + // large objects after everything else + Gb_Osc::Good_Synth good_synth; + Gb_Osc::Med_Synth med_synth; + + void reset_lengths(); + void reset_regs(); + int calc_output( int osc ) const; + void apply_stereo(); + void apply_volume(); + void synth_volume( int ); + void run_until_( blip_time_t ); + void run_until( blip_time_t ); + void silence_osc( Gb_Osc& ); + void write_osc( int index, int reg, int old_data, int data ); + const char* save_load( gb_apu_state_t*, bool save ); + void save_load2( gb_apu_state_t*, bool save ); + friend class Gb_Apu_Tester; +}; + +// Format of save state. Should be stable across versions of the library, +// with earlier versions properly opening later save states. Includes some +// room for expansion so the state size shouldn't increase. +struct gb_apu_state_t +{ +#if GB_APU_CUSTOM_STATE + // Values stored as plain int so your code can read/write them easily. + // Structure can NOT be written to disk, since format is not portable. + typedef int val_t; +#else + // Values written in portable little-endian format, allowing structure + // to be written directly to disk. + typedef unsigned char val_t [4]; +#endif + + enum { format0 = 0x50414247 }; + + val_t format; // format of all following data + val_t version; // later versions just add fields to end + + unsigned char regs [0x40]; + val_t frame_time; + val_t frame_phase; + + val_t sweep_freq; + val_t sweep_delay; + val_t sweep_enabled; + val_t sweep_neg; + val_t noise_divider; + val_t wave_buf; + + val_t delay [4]; + val_t length_ctr [4]; + val_t phase [4]; + val_t enabled [4]; + + val_t env_delay [3]; + val_t env_volume [3]; + val_t env_enabled [3]; + + val_t unused [13]; // for future expansion +}; + +#endif diff --git a/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu_State.cpp b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu_State.cpp new file mode 100644 index 0000000000..5fdd123b62 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Apu_State.cpp @@ -0,0 +1,118 @@ +// Gb_Snd_Emu 0.2.0. http://www.slack.net/~ant/ + +#include "Gb_Apu.h" + +#include + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#if GB_APU_CUSTOM_STATE + #define REFLECT( x, y ) (save ? (io->y) = (x) : (x) = (io->y) ) +#else + #define REFLECT( x, y ) (save ? set_val( io->y, x ) : (void) ((x) = get_val( io->y ))) + + static blargg_ulong get_val( byte const* p ) + { + return p [3] * 0x1000000 + p [2] * 0x10000 + p [1] * 0x100 + p [0]; + } + + static void set_val( byte* p, blargg_ulong n ) + { + p [0] = (byte) (n ); + p [1] = (byte) (n >> 8); + p [2] = (byte) (n >> 16); + p [3] = (byte) (n >> 24); + } +#endif + +inline const char* Gb_Apu::save_load( gb_apu_state_t* io, bool save ) +{ + #if !GB_APU_CUSTOM_STATE + assert( sizeof (gb_apu_state_t) == 256 ); + #endif + + int format = io->format0; + REFLECT( format, format ); + if ( format != io->format0 ) + return "Unsupported sound save state format"; + + int version = 0; + REFLECT( version, version ); + + // Registers and wave RAM + assert( regs_size == sizeof io->regs ); + if ( save ) + memcpy( io->regs, regs, sizeof io->regs ); + else + memcpy( regs, io->regs, sizeof regs ); + + // Frame sequencer + REFLECT( frame_time, frame_time ); + REFLECT( frame_phase, frame_phase ); + + REFLECT( square1.sweep_freq, sweep_freq ); + REFLECT( square1.sweep_delay, sweep_delay ); + REFLECT( square1.sweep_enabled, sweep_enabled ); + REFLECT( square1.sweep_neg, sweep_neg ); + + REFLECT( noise.divider, noise_divider ); + REFLECT( wave.sample_buf, wave_buf ); + + return 0; +} + +// second function to avoid inline limits of some compilers +inline void Gb_Apu::save_load2( gb_apu_state_t* io, bool save ) +{ + for ( int i = osc_count; --i >= 0; ) + { + Gb_Osc& osc = *oscs [i]; + REFLECT( osc.delay, delay [i] ); + REFLECT( osc.length_ctr, length_ctr [i] ); + REFLECT( osc.phase, phase [i] ); + REFLECT( osc.enabled, enabled [i] ); + + if ( i != 2 ) + { + int j = min( i, 2 ); + Gb_Env& env = STATIC_CAST(Gb_Env&,osc); + REFLECT( env.env_delay, env_delay [j] ); + REFLECT( env.volume, env_volume [j] ); + REFLECT( env.env_enabled, env_enabled [j] ); + } + } +} + +void Gb_Apu::save_state( gb_apu_state_t* out ) +{ + (void) save_load( out, true ); + save_load2( out, true ); + + #if !GB_APU_CUSTOM_STATE + memset( out->unused, 0, sizeof out->unused ); + #endif +} + +blargg_err_t Gb_Apu::load_state( gb_apu_state_t const& in ) +{ + RETURN_ERR( save_load( CONST_CAST(gb_apu_state_t*,&in), false ) ); + save_load2( CONST_CAST(gb_apu_state_t*,&in), false ); + + apply_stereo(); + synth_volume( 0 ); // suppress output for the moment + run_until_( last_time ); // get last_amp updated + apply_volume(); // now use correct volume + + return 0; +} diff --git a/Mednafen/mednafen/hw_sound/gb_apu/Gb_Oscs.cpp b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Oscs.cpp new file mode 100644 index 0000000000..28f550ade9 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Oscs.cpp @@ -0,0 +1,665 @@ +// Gb_Snd_Emu 0.2.0. http://www.slack.net/~ant/ + +#include "Gb_Apu.h" + +/* Copyright (C) 2003-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +bool const cgb_02 = false; // enables bug in early CGB units that causes problems in some games +bool const cgb_05 = false; // enables CGB-05 zombie behavior + +int const trigger_mask = 0x80; +int const length_enabled = 0x40; + +void Gb_Osc::reset() +{ + output = 0; + last_amp = 0; + delay = 0; + phase = 0; + enabled = false; +} + +inline void Gb_Osc::update_amp( blip_time_t time, int new_amp ) +{ + output->set_modified(); + int delta = new_amp - last_amp; + if ( delta ) + { + last_amp = new_amp; + med_synth->offset( time, delta, output ); + } +} + +// Units + +void Gb_Osc::clock_length() +{ + if ( (regs [4] & length_enabled) && length_ctr ) + { + if ( --length_ctr <= 0 ) + enabled = false; + } +} + +inline int Gb_Env::reload_env_timer() +{ + int raw = regs [2] & 7; + env_delay = (raw ? raw : 8); + return raw; +} + +void Gb_Env::clock_envelope() +{ + if ( env_enabled && --env_delay <= 0 && reload_env_timer() ) + { + int v = volume + (regs [2] & 0x08 ? +1 : -1); + if ( 0 <= v && v <= 15 ) + volume = v; + else + env_enabled = false; + } +} + +inline void Gb_Sweep_Square::reload_sweep_timer() +{ + sweep_delay = (regs [0] & period_mask) >> 4; + if ( !sweep_delay ) + sweep_delay = 8; +} + +void Gb_Sweep_Square::calc_sweep( bool update ) +{ + int const shift = regs [0] & shift_mask; + int const delta = sweep_freq >> shift; + sweep_neg = (regs [0] & 0x08) != 0; + int const freq = sweep_freq + (sweep_neg ? -delta : delta); + + if ( freq > 0x7FF ) + { + enabled = false; + } + else if ( shift && update ) + { + sweep_freq = freq; + + regs [3] = freq & 0xFF; + regs [4] = (regs [4] & ~0x07) | (freq >> 8 & 0x07); + } +} + +void Gb_Sweep_Square::clock_sweep() +{ + if ( --sweep_delay <= 0 ) + { + reload_sweep_timer(); + if ( sweep_enabled && (regs [0] & period_mask) ) + { + calc_sweep( true ); + calc_sweep( false ); + } + } +} + +int Gb_Wave::access( unsigned addr ) const +{ + if ( enabled ) + { + addr = phase & (bank_size - 1); + if ( mode == Gb_Apu::mode_dmg ) + { + addr++; + if ( delay > clk_mul ) + return -1; // can only access within narrow time window while playing + } + addr >>= 1; + } + return addr & 0x0F; +} + +// write_register + +int Gb_Osc::write_trig( int frame_phase, int max_len, int old_data ) +{ + int data = regs [4]; + + if ( (frame_phase & 1) && !(old_data & length_enabled) && length_ctr ) + { + if ( (data & length_enabled) || cgb_02 ) + length_ctr--; + } + + if ( data & trigger_mask ) + { + enabled = true; + if ( !length_ctr ) + { + length_ctr = max_len; + if ( (frame_phase & 1) && (data & length_enabled) ) + length_ctr--; + } + } + + if ( !length_ctr ) + enabled = false; + + return data & trigger_mask; +} + +inline void Gb_Env::zombie_volume( int old, int data ) +{ + int v = volume; + if ( mode == Gb_Apu::mode_agb || cgb_05 ) + { + // CGB-05 behavior, very close to AGB behavior as well + if ( (old ^ data) & 8 ) + { + if ( !(old & 8) ) + { + v++; + if ( old & 7 ) + v++; + } + + v = 16 - v; + } + else if ( (old & 0x0F) == 8 ) + { + v++; + } + } + else + { + // CGB-04&02 behavior, very close to MGB behavior as well + if ( !(old & 7) && env_enabled ) + v++; + else if ( !(old & 8) ) + v += 2; + + if ( (old ^ data) & 8 ) + v = 16 - v; + } + volume = v & 0x0F; +} + +bool Gb_Env::write_register( int frame_phase, int reg, int old, int data ) +{ + int const max_len = 64; + + switch ( reg ) + { + case 1: + length_ctr = max_len - (data & (max_len - 1)); + break; + + case 2: + if ( !dac_enabled() ) + enabled = false; + + zombie_volume( old, data ); + + if ( (data & 7) && env_delay == 8 ) + { + env_delay = 1; + clock_envelope(); // TODO: really happens at next length clock + } + break; + + case 4: + if ( write_trig( frame_phase, max_len, old ) ) + { + volume = regs [2] >> 4; + reload_env_timer(); + env_enabled = true; + if ( frame_phase == 7 ) + env_delay++; + if ( !dac_enabled() ) + enabled = false; + return true; + } + } + return false; +} + +bool Gb_Square::write_register( int frame_phase, int reg, int old_data, int data ) +{ + bool result = Gb_Env::write_register( frame_phase, reg, old_data, data ); + if ( result ) + delay = (delay & (4 * clk_mul - 1)) + period(); + return result; +} + +inline void Gb_Noise::write_register( int frame_phase, int reg, int old_data, int data ) +{ + if ( Gb_Env::write_register( frame_phase, reg, old_data, data ) ) + { + phase = 0x7FFF; + delay += 8 * clk_mul; + } +} + +inline void Gb_Sweep_Square::write_register( int frame_phase, int reg, int old_data, int data ) +{ + if ( reg == 0 && sweep_enabled && sweep_neg && !(data & 0x08) ) + enabled = false; // sweep negate disabled after used + + if ( Gb_Square::write_register( frame_phase, reg, old_data, data ) ) + { + sweep_freq = frequency(); + sweep_neg = false; + reload_sweep_timer(); + sweep_enabled = (regs [0] & (period_mask | shift_mask)) != 0; + if ( regs [0] & shift_mask ) + calc_sweep( false ); + } +} + +void Gb_Wave::corrupt_wave() +{ + int pos = ((phase + 1) & (bank_size - 1)) >> 1; + if ( pos < 4 ) + wave_ram [0] = wave_ram [pos]; + else + for ( int i = 4; --i >= 0; ) + wave_ram [i] = wave_ram [(pos & ~3) + i]; +} + +inline void Gb_Wave::write_register( int frame_phase, int reg, int old_data, int data ) +{ + int const max_len = 256; + + switch ( reg ) + { + case 0: + if ( !dac_enabled() ) + enabled = false; + break; + + case 1: + length_ctr = max_len - data; + break; + + case 4: + bool was_enabled = enabled; + if ( write_trig( frame_phase, max_len, old_data ) ) + { + if ( !dac_enabled() ) + enabled = false; + else if ( mode == Gb_Apu::mode_dmg && was_enabled && + (unsigned) (delay - 2 * clk_mul) < 2 * clk_mul ) + corrupt_wave(); + + phase = 0; + delay = period() + 6 * clk_mul; + } + } +} + +void Gb_Apu::write_osc( int index, int reg, int old_data, int data ) +{ + reg -= index * 5; + switch ( index ) + { + case 0: square1.write_register( frame_phase, reg, old_data, data ); break; + case 1: square2.write_register( frame_phase, reg, old_data, data ); break; + case 2: wave .write_register( frame_phase, reg, old_data, data ); break; + case 3: noise .write_register( frame_phase, reg, old_data, data ); break; + } +} + +// Synthesis + +void Gb_Square::run( blip_time_t time, blip_time_t end_time ) +{ + // Calc duty and phase + static byte const duty_offsets [4] = { 1, 1, 3, 7 }; + static byte const duties [4] = { 1, 2, 4, 6 }; + int const duty_code = regs [1] >> 6; + int duty_offset = duty_offsets [duty_code]; + int duty = duties [duty_code]; + if ( mode == Gb_Apu::mode_agb ) + { + // AGB uses inverted duty + duty_offset -= duty; + duty = 8 - duty; + } + int ph = (this->phase + duty_offset) & 7; + + // Determine what will be generated + int vol = 0; + Blip_Buffer* const out = this->output; + if ( out ) + { + int amp = dac_off_amp; + if ( dac_enabled() ) + { + if ( enabled ) + vol = this->volume; + + amp = -dac_bias; + if ( mode == Gb_Apu::mode_agb ) + amp = -(vol >> 1); + + // Play inaudible frequencies as constant amplitude + if ( frequency() >= 0x7FA && delay < 32 * clk_mul ) + { + amp += (vol * duty) >> 3; + vol = 0; + } + + if ( ph < duty ) + { + amp += vol; + vol = -vol; + } + } + update_amp( time, amp ); + } + + // Generate wave + time += delay; + if ( time < end_time ) + { + int const per = this->period(); + if ( !vol ) + { + // Maintain phase when not playing + int count = (end_time - time + per - 1) / per; + ph += count; // will be masked below + time += (blip_time_t) count * per; + } + else + { + // Output amplitude transitions + int delta = vol; + do + { + ph = (ph + 1) & 7; + if ( ph == 0 || ph == duty ) + { + good_synth->offset_inline( time, delta, out ); + delta = -delta; + } + time += per; + } + while ( time < end_time ); + + if ( delta != vol ) + last_amp -= delta; + } + this->phase = (ph - duty_offset) & 7; + } + delay = time - end_time; +} + +// Quickly runs LFSR for a large number of clocks. For use when noise is generating +// no sound. +static unsigned run_lfsr( unsigned s, unsigned mask, int count ) +{ + bool const optimized = true; // set to false to use only unoptimized loop in middle + + // optimization used in several places: + // ((s & (1 << b)) << n) ^ ((s & (1 << b)) << (n + 1)) = (s & (1 << b)) * (3 << n) + + if ( mask == 0x4000 && optimized ) + { + if ( count >= 32767 ) + count %= 32767; + + // Convert from Fibonacci to Galois configuration, + // shifted left 1 bit + s ^= (s & 1) * 0x8000; + + // Each iteration is equivalent to clocking LFSR 255 times + while ( (count -= 255) > 0 ) + s ^= ((s & 0xE) << 12) ^ ((s & 0xE) << 11) ^ (s >> 3); + count += 255; + + // Each iteration is equivalent to clocking LFSR 15 times + // (interesting similarity to single clocking below) + while ( (count -= 15) > 0 ) + s ^= ((s & 2) * (3 << 13)) ^ (s >> 1); + count += 15; + + // Remaining singles + while ( --count >= 0 ) + s = ((s & 2) * (3 << 13)) ^ (s >> 1); + + // Convert back to Fibonacci configuration + s &= 0x7FFF; + } + else if ( count < 8 || !optimized ) + { + // won't fully replace upper 8 bits, so have to do the unoptimized way + while ( --count >= 0 ) + s = (s >> 1 | mask) ^ (mask & -((s - 1) & 2)); + } + else + { + if ( count > 127 ) + { + count %= 127; + if ( !count ) + count = 127; // must run at least once + } + + // Need to keep one extra bit of history + s = s << 1 & 0xFF; + + // Convert from Fibonacci to Galois configuration, + // shifted left 2 bits + s ^= (s & 2) * 0x80; + + // Each iteration is equivalent to clocking LFSR 7 times + // (interesting similarity to single clocking below) + while ( (count -= 7) > 0 ) + s ^= ((s & 4) * (3 << 5)) ^ (s >> 1); + count += 7; + + // Remaining singles + while ( --count >= 0 ) + s = ((s & 4) * (3 << 5)) ^ (s >> 1); + + // Convert back to Fibonacci configuration and + // repeat last 8 bits above significant 7 + s = (s << 7 & 0x7F80) | (s >> 1 & 0x7F); + } + + return s; +} + +void Gb_Noise::run( blip_time_t time, blip_time_t end_time ) +{ + // Determine what will be generated + int vol = 0; + Blip_Buffer* const out = this->output; + if ( out ) + { + int amp = dac_off_amp; + if ( dac_enabled() ) + { + if ( enabled ) + vol = this->volume; + + amp = -dac_bias; + if ( mode == Gb_Apu::mode_agb ) + amp = -(vol >> 1); + + if ( !(phase & 1) ) + { + amp += vol; + vol = -vol; + } + } + + // AGB negates final output + if ( mode == Gb_Apu::mode_agb ) + { + vol = -vol; + amp = -amp; + } + + update_amp( time, amp ); + } + + // Run timer and calculate time of next LFSR clock + static byte const period1s [8] = { 1, 2, 4, 6, 8, 10, 12, 14 }; + int const period1 = period1s [regs [3] & 7] * clk_mul; + { + int extra = (end_time - time) - delay; + int const per2 = this->period2(); + time += delay + ((divider ^ (per2 >> 1)) & (per2 - 1)) * period1; + + int count = (extra < 0 ? 0 : (extra + period1 - 1) / period1); + divider = (divider - count) & period2_mask; + delay = count * period1 - extra; + } + + // Generate wave + if ( time < end_time ) + { + unsigned const mask = this->lfsr_mask(); + unsigned bits = this->phase; + + int per = period2( period1 * 8 ); + if ( period2_index() >= 0xE ) + { + time = end_time; + } + else if ( !vol ) + { + // Maintain phase when not playing + int count = (end_time - time + per - 1) / per; + time += (blip_time_t) count * per; + bits = run_lfsr( bits, ~mask, count ); + } + else + { + // Output amplitude transitions + int delta = -vol; + do + { + unsigned changed = bits + 1; + bits = bits >> 1 & mask; + if ( changed & 2 ) + { + bits |= ~mask; + delta = -delta; + med_synth->offset_inline( time, delta, out ); + } + time += per; + } + while ( time < end_time ); + + if ( delta == vol ) + last_amp += delta; + } + this->phase = bits; + } +} + +void Gb_Wave::run( blip_time_t time, blip_time_t end_time ) +{ + // Calc volume + static byte const volumes [8] = { 0, 4, 2, 1, 3, 3, 3, 3 }; + int const volume_shift = 2; + int const volume_idx = regs [2] >> 5 & (agb_mask | 3); // 2 bits on DMG/CGB, 3 on AGB + int const volume_mul = volumes [volume_idx]; + + // Determine what will be generated + int playing = false; + Blip_Buffer* const out = this->output; + if ( out ) + { + int amp = dac_off_amp; + if ( dac_enabled() ) + { + // Play inaudible frequencies as constant amplitude + amp = 8 << 4; // really depends on average of all samples in wave + + // if delay is larger, constant amplitude won't start yet + if ( frequency() <= 0x7FB || delay > 15 * clk_mul ) + { + if ( volume_mul ) + playing = (int) enabled; + + amp = (sample_buf << (phase << 2 & 4) & 0xF0) * playing; + } + + amp = ((amp * volume_mul) >> (volume_shift + 4)) - dac_bias; + } + update_amp( time, amp ); + } + + // Generate wave + time += delay; + if ( time < end_time ) + { + byte const* wave = this->wave_ram; + + // wave size and bank + int const size20_mask = 0x20; + int const flags = regs [0] & agb_mask; + int const wave_mask = (flags & size20_mask) | 0x1F; + int swap_banks = 0; + if ( flags & bank40_mask ) + { + swap_banks = flags & size20_mask; + wave += bank_size/2 - (swap_banks >> 1); + } + + int ph = this->phase ^ swap_banks; + ph = (ph + 1) & wave_mask; // pre-advance + + int const per = this->period(); + if ( !playing ) + { + // Maintain phase when not playing + int count = (end_time - time + per - 1) / per; + ph += count; // will be masked below + time += (blip_time_t) count * per; + } + else + { + // Output amplitude transitions + int lamp = this->last_amp + dac_bias; + do + { + // Extract nybble + int nybble = wave [ph >> 1] << (ph << 2 & 4) & 0xF0; + ph = (ph + 1) & wave_mask; + + // Scale by volume + int amp = (nybble * volume_mul) >> (volume_shift + 4); + + int delta = amp - lamp; + if ( delta ) + { + lamp = amp; + med_synth->offset_inline( time, delta, out ); + } + time += per; + } + while ( time < end_time ); + this->last_amp = lamp - dac_bias; + } + ph = (ph - 1) & wave_mask; // undo pre-advance and mask position + + // Keep track of last byte read + if ( enabled ) + sample_buf = wave [ph >> 1]; + + this->phase = ph ^ swap_banks; // undo swapped banks + } + delay = time - end_time; +} diff --git a/Mednafen/mednafen/hw_sound/gb_apu/Gb_Oscs.h b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Oscs.h new file mode 100644 index 0000000000..f5cb94708e --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/Gb_Oscs.h @@ -0,0 +1,190 @@ +// Private oscillators used by Gb_Apu + +// Gb_Snd_Emu 0.2.0 +#ifndef GB_OSCS_H +#define GB_OSCS_H + +#include "blargg_common.h" +#include + +#ifndef GB_APU_OVERCLOCK + #define GB_APU_OVERCLOCK 1 +#endif + +#if GB_APU_OVERCLOCK & (GB_APU_OVERCLOCK - 1) + #error "GB_APU_OVERCLOCK must be a power of 2" +#endif + +class Gb_Osc { +protected: + + // 11-bit frequency in NRx3 and NRx4 + int frequency() const { return (regs [4] & 7) * 0x100 + regs [3]; } + + void update_amp( blip_time_t, int new_amp ); + int write_trig( int frame_phase, int max_len, int old_data ); +public: + + enum { clk_mul = GB_APU_OVERCLOCK }; + enum { dac_bias = 7 }; + + Blip_Buffer* outputs [4];// NULL, right, left, center + Blip_Buffer* output; // where to output sound + BOOST::uint8_t* regs; // osc's 5 registers + int mode; // mode_dmg, mode_cgb, mode_agb + int dac_off_amp;// amplitude when DAC is off + int last_amp; // current amplitude in Blip_Buffer + typedef Blip_Synth Good_Synth; + typedef Blip_Synth Med_Synth; + Good_Synth const* good_synth; + Med_Synth const* med_synth; + + int delay; // clocks until frequency timer expires + int length_ctr; // length counter + unsigned phase; // waveform phase (or equivalent) + bool enabled; // internal enabled flag + + void clock_length(); + void reset(); +}; + +class Gb_Env : public Gb_Osc { +public: + int env_delay; + int volume; + bool env_enabled; + + void clock_envelope(); + bool write_register( int frame_phase, int reg, int old_data, int data ); + + void reset() + { + env_delay = 0; + volume = 0; + Gb_Osc::reset(); + } +protected: + // Non-zero if DAC is enabled + int dac_enabled() const { return regs [2] & 0xF8; } +private: + void zombie_volume( int old, int data ); + int reload_env_timer(); +}; + +class Gb_Square : public Gb_Env { +public: + bool write_register( int frame_phase, int reg, int old_data, int data ); + void run( blip_time_t, blip_time_t ); + + void reset() + { + Gb_Env::reset(); + delay = 0x40000000; // TODO: something less hacky (never clocked until first trigger) + } +private: + // Frequency timer period + int period() const { return (2048 - frequency()) * (4 * clk_mul); } +}; + +class Gb_Sweep_Square : public Gb_Square { +public: + int sweep_freq; + int sweep_delay; + bool sweep_enabled; + bool sweep_neg; + + void clock_sweep(); + void write_register( int frame_phase, int reg, int old_data, int data ); + + void reset() + { + sweep_freq = 0; + sweep_delay = 0; + sweep_enabled = false; + sweep_neg = false; + Gb_Square::reset(); + } +private: + enum { period_mask = 0x70 }; + enum { shift_mask = 0x07 }; + + void calc_sweep( bool update ); + void reload_sweep_timer(); +}; + +class Gb_Noise : public Gb_Env { +public: + + int divider; // noise has more complex frequency divider setup + + void run( blip_time_t, blip_time_t ); + void write_register( int frame_phase, int reg, int old_data, int data ); + + void reset() + { + divider = 0; + Gb_Env::reset(); + delay = 4 * clk_mul; // TODO: remove? + } +private: + enum { period2_mask = 0x1FFFF }; + + int period2_index() const { return regs [3] >> 4; } + int period2( int base = 8 ) const { return base << period2_index(); } + unsigned lfsr_mask() const { return (regs [3] & 0x08) ? ~0x4040 : ~0x4000; } +}; + +class Gb_Wave : public Gb_Osc { +public: + int sample_buf; // last wave RAM byte read (hardware has this as well) + + void write_register( int frame_phase, int reg, int old_data, int data ); + void run( blip_time_t, blip_time_t ); + + // Reads/writes wave RAM + int read( unsigned addr ) const; + void write( unsigned addr, int data ); + + void reset() + { + sample_buf = 0; + Gb_Osc::reset(); + } + +private: + enum { bank40_mask = 0x40 }; + enum { bank_size = 32 }; + + int agb_mask; // 0xFF if AGB features enabled, 0 otherwise + BOOST::uint8_t* wave_ram; // 32 bytes (64 nybbles), stored in APU + + friend class Gb_Apu; + + // Frequency timer period + int period() const { return (2048 - frequency()) * (2 * clk_mul); } + + // Non-zero if DAC is enabled + int dac_enabled() const { return regs [0] & 0x80; } + + void corrupt_wave(); + + BOOST::uint8_t* wave_bank() const { return &wave_ram [(~regs [0] & bank40_mask) >> 2 & agb_mask]; } + + // Wave index that would be accessed, or -1 if no access would occur + int access( unsigned addr ) const; +}; + +inline int Gb_Wave::read( unsigned addr ) const +{ + int index = access( addr ); + return (index < 0 ? 0xFF : wave_bank() [index]); +} + +inline void Gb_Wave::write( unsigned addr, int data ) +{ + int index = access( addr ); + if ( index >= 0 ) + wave_bank() [index] = data;; +} + +#endif diff --git a/Mednafen/mednafen/hw_sound/gb_apu/blargg_common.h b/Mednafen/mednafen/hw_sound/gb_apu/blargg_common.h new file mode 100644 index 0000000000..011850f047 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/blargg_common.h @@ -0,0 +1,206 @@ +// Sets up common environment for Shay Green's libraries. +// To change configuration options, modify blargg_config.h, not this file. + +// Gb_Snd_Emu 0.2.0 +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +#include +#include +#include +#include + +#undef BLARGG_COMMON_H +// allow blargg_config.h to #include blargg_common.h +#include "blargg_config.h" +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +// BLARGG_RESTRICT: equivalent to restrict, where supported +#if __GNUC__ >= 3 || _MSC_VER >= 1100 + #define BLARGG_RESTRICT __restrict +#else + #define BLARGG_RESTRICT +#endif + +// STATIC_CAST(T,expr): Used in place of static_cast (expr) +// CONST_CAST( T,expr): Used in place of const_cast (expr) +#ifndef STATIC_CAST + #if __GNUC__ >= 4 + #define STATIC_CAST(T,expr) static_cast (expr) + #define CONST_CAST( T,expr) const_cast (expr) + #else + #define STATIC_CAST(T,expr) ((T) (expr)) + #define CONST_CAST( T,expr) ((T) (expr)) + #endif +#endif + +// blargg_err_t (0 on success, otherwise error string) +#ifndef blargg_err_t + typedef const char* blargg_err_t; +#endif + +// blargg_vector - very lightweight vector of POD types (no constructor/destructor) +template +class blargg_vector { + T* begin_; + size_t size_; +public: + blargg_vector() : begin_( 0 ), size_( 0 ) { } + ~blargg_vector() { free( begin_ ); } + size_t size() const { return size_; } + T* begin() const { return begin_; } + T* end() const { return begin_ + size_; } + blargg_err_t resize( size_t n ) + { + // TODO: blargg_common.cpp to hold this as an outline function, ugh + void* p = realloc( begin_, n * sizeof (T) ); + if ( p ) + begin_ = (T*) p; + else if ( n > size_ ) // realloc failure only a problem if expanding + return "Out of memory"; + size_ = n; + return 0; + } + void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); } + T& operator [] ( size_t n ) const + { + assert( n <= size_ ); // <= to allow past-the-end value + return begin_ [n]; + } +}; + +#ifndef BLARGG_DISABLE_NOTHROW + // throw spec mandatory in ISO C++ if operator new can return NULL + #if __cplusplus >= 199711 || __GNUC__ >= 3 + #define BLARGG_THROWS( spec ) throw spec + #else + #define BLARGG_THROWS( spec ) + #endif + #define BLARGG_DISABLE_NOTHROW \ + void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\ + void operator delete ( void* p ) { free( p ); } + #define BLARGG_NEW new +#else + #include + #define BLARGG_NEW new (std::nothrow) +#endif + +// BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant) +#define BLARGG_4CHAR( a, b, c, d ) \ + ((a&0xFF)*0x1000000 + (b&0xFF)*0x10000 + (c&0xFF)*0x100 + (d&0xFF)) + +// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0. +#ifndef BOOST_STATIC_ASSERT + #ifdef _MSC_VER + // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] ) + #else + // Some other compilers fail when declaring same function multiple times in class, + // so differentiate them by line + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] ) + #endif +#endif + +// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1, +// compiler is assumed to support bool. If undefined, availability is determined. +#ifndef BLARGG_COMPILER_HAS_BOOL + #if defined (__MWERKS__) + #if !__option(bool) + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (_MSC_VER) + #if _MSC_VER < 1100 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (__GNUC__) + // supports bool + #elif __cplusplus < 199711 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif +#endif +#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL + // If you get errors here, modify your blargg_config.h file + typedef int bool; + const bool true = 1; + const bool false = 0; +#endif + +// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough + +#if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF + typedef long blargg_long; +#else + typedef int blargg_long; +#endif + +#if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF + typedef unsigned long blargg_ulong; +#else + typedef unsigned blargg_ulong; +#endif + +// BOOST::int8_t etc. + +// HAVE_STDINT_H: If defined, use for int8_t etc. +#if defined (HAVE_STDINT_H) + #include + #define BOOST + +// HAVE_INTTYPES_H: If defined, use for int8_t etc. +#elif defined (HAVE_INTTYPES_H) + #include + #define BOOST + +#else + struct BOOST + { + #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F + typedef signed char int8_t; + typedef unsigned char uint8_t; + #else + // No suitable 8-bit type available + typedef struct see_blargg_common_h int8_t; + typedef struct see_blargg_common_h uint8_t; + #endif + + #if USHRT_MAX == 0xFFFF + typedef short int16_t; + typedef unsigned short uint16_t; + #else + // No suitable 16-bit type available + typedef struct see_blargg_common_h int16_t; + typedef struct see_blargg_common_h uint16_t; + #endif + + #if ULONG_MAX == 0xFFFFFFFF + typedef long int32_t; + typedef unsigned long uint32_t; + #elif UINT_MAX == 0xFFFFFFFF + typedef int int32_t; + typedef unsigned int uint32_t; + #else + // No suitable 32-bit type available + typedef struct see_blargg_common_h int32_t; + typedef struct see_blargg_common_h uint32_t; + #endif + }; +#endif + +#if __GNUC__ >= 3 + #define BLARGG_DEPRECATED __attribute__ ((deprecated)) +#else + #define BLARGG_DEPRECATED +#endif + +// Use in place of "= 0;" for a pure virtual, since these cause calls to std C++ lib. +// During development, BLARGG_PURE( x ) expands to = 0; +// virtual int func() BLARGG_PURE( { return 0; } ) +#ifndef BLARGG_PURE + #define BLARGG_PURE( def ) def +#endif + +#endif +#endif diff --git a/Mednafen/mednafen/hw_sound/gb_apu/blargg_config.h b/Mednafen/mednafen/hw_sound/gb_apu/blargg_config.h new file mode 100644 index 0000000000..bcdde83761 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/blargg_config.h @@ -0,0 +1,31 @@ +// $package user configuration file. Don't replace when updating library. + +#ifndef BLARGG_CONFIG_H +#define BLARGG_CONFIG_H + +// Uncomment to have Gb_Apu run at 4x normal clock rate (16777216 Hz), useful in +// a Game Boy Advance emulator. +#define GB_APU_OVERCLOCK 4 + +// Uncomment to enable platform-specific (and possibly non-portable) optimizations. +//#define BLARGG_NONPORTABLE 1 + +// Uncomment if automatic byte-order determination doesn't work +//#define BLARGG_BIG_ENDIAN 1 + +// Uncomment to use zlib for transparent decompression of gzipped files +//#define HAVE_ZLIB_H + +// Uncomment if you get errors in the bool section of blargg_common.h +//#define BLARGG_COMPILER_HAS_BOOL 1 + +// Uncomment to disable out-of-memory exceptions +//#include +//#define BLARGG_NEW new (std::nothrow) + +// Use standard config.h if present +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#endif diff --git a/Mednafen/mednafen/hw_sound/gb_apu/blargg_source.h b/Mednafen/mednafen/hw_sound/gb_apu/blargg_source.h new file mode 100644 index 0000000000..ddef37d619 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/gb_apu/blargg_source.h @@ -0,0 +1,92 @@ +/* Included at the beginning of library source files, AFTER all other #include lines. +Sets up helpful macros and services used in my source code. Since this is only "active" +in my source code, I don't have to worry about polluting the global namespace with +unprefixed names. */ + +// Gb_Snd_Emu 0.2.0 +#ifndef BLARGG_SOURCE_H +#define BLARGG_SOURCE_H + +// The following four macros are for debugging only. Some or all might be defined +// to do nothing, depending on the circumstances. Described is what happens when +// a particular macro is defined to do something. When defined to do nothing, the +// macros do NOT evaluate their argument(s). + +// If expr is false, prints file and line number, then aborts program. Meant for +// checking internal state and consistency. A failed assertion indicates a bug +// in MY code. +// +// void assert( bool expr ); +#include + +// If expr is false, prints file and line number, then aborts program. Meant for +// checking caller-supplied parameters and operations that are outside the control +// of the module. A failed requirement probably indicates a bug in YOUR code. +// +// void require( bool expr ); +#undef require +#define require( expr ) assert( expr ) + +// Like printf() except output goes to debugging console/file. +// +// void dprintf( const char* format, ... ); +static inline void blargg_dprintf_( const char*, ... ) { } +#undef dprintf +#define dprintf (1) ? (void) 0 : blargg_dprintf_ + +// If expr is false, prints file and line number to debug console/log, then +// continues execution normally. Meant for flagging potential problems or things +// that should be looked into, but that aren't serious problems. +// +// void check( bool expr ); +#undef check +#define check( expr ) ((void) 0) + +// If expr yields non-NULL error string, returns it from current function, +// otherwise continues normally. +#undef RETURN_ERR +#define RETURN_ERR( expr ) do { \ + blargg_err_t blargg_return_err_ = (expr); \ + if ( blargg_return_err_ ) return blargg_return_err_; \ + } while ( 0 ) + +// If ptr is NULL, returns "Out of memory" error string, otherwise continues normally. +#undef CHECK_ALLOC +#define CHECK_ALLOC( ptr ) do { if ( (ptr) == 0 ) return "Out of memory"; } while ( 0 ) + +// The usual min/max functions for built-in types. +// +// template T min( T x, T y ) { return x < y ? x : y; } +// template T max( T x, T y ) { return x > y ? x : y; } +#define BLARGG_DEF_MIN_MAX( type ) \ + static inline type blargg_min( type x, type y ) { if ( y < x ) x = y; return x; }\ + static inline type blargg_max( type x, type y ) { if ( x < y ) x = y; return x; } + +BLARGG_DEF_MIN_MAX( int ) +BLARGG_DEF_MIN_MAX( unsigned ) +BLARGG_DEF_MIN_MAX( long ) +BLARGG_DEF_MIN_MAX( unsigned long ) +BLARGG_DEF_MIN_MAX( float ) +BLARGG_DEF_MIN_MAX( double ) + +#undef min +#define min blargg_min + +#undef max +#define max blargg_max + +// typedef unsigned char byte; +typedef unsigned char blargg_byte; +#undef byte +#define byte blargg_byte + +// deprecated +#define BLARGG_CHECK_ALLOC CHECK_ALLOC +#define BLARGG_RETURN_ERR RETURN_ERR + +// BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf and check +#ifdef BLARGG_SOURCE_BEGIN + #include BLARGG_SOURCE_BEGIN +#endif + +#endif diff --git a/Mednafen/mednafen/hw_sound/pce_psg/pce_psg.cpp b/Mednafen/mednafen/hw_sound/pce_psg/pce_psg.cpp new file mode 100644 index 0000000000..8217bdf052 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/pce_psg/pce_psg.cpp @@ -0,0 +1,905 @@ +/* Mednafen - Multi-system Emulator + * + * Original skeleton write handler and PSG structure definition: + * Copyright (C) 2001 Charles MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "pce_psg.h" + +#include +#include +#include + +// Frequency cache cutoff optimization threshold (<= FREQC7M_COT) +#define FREQC7M_COT 0x7 //0xA + +void PCE_PSG::SetVolume(double new_volume) +{ + for(int vl = 0; vl < 32; vl++) + { + double flub = 1.0 * new_volume * 8 / 6; + + if(vl) + flub /= pow(2, (double)1 / 4 * vl); // ~1.5dB reduction per increment of vl + + if(vl == 0x1F) + flub = 0; + + for(int samp = 0; samp < 32; samp++) + { + int eff_samp; + + if(revision == REVISION_HUC6280) + eff_samp = samp * 2; + else + eff_samp = samp * 2 - 0x1F; + + dbtable[vl][samp] = (int32)(flub * eff_samp * 128); // * 256); + dbtable_volonly[vl] = (int32)(flub * 65536); + + // dbtable[vl][samp] = (int32)(flub * eff_samp * 128); + // dbtable_volonly[vl] = (int32)(flub * 65536); + } + } +} + +// Note: Changing the 0x1F(not that there should be) would require changing the channel pseudo-off volume check logic later on. +static const int scale_tab[] = +{ + 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, + 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F +}; + +#define CLOCK_LFSR(lfsr) { unsigned int newbit = ((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 11) ^ (lfsr >> 12) ^ (lfsr >> 17)) & 1; lfsr = (lfsr >> 1) | (newbit << 17); } + +static const int16 Phase_Filter[2][7] = +{ + /* 0 */ { 35, 250, 579, 641, 425, 112, 6 }, // 2048 + /* 1 */ { 6, 112, 425, 641, 579, 250, 35 }, // 2048 +}; + +INLINE void PCE_PSG::UpdateOutputSub(const int32 timestamp, psg_channel *ch, const int32 samp0, const int32 samp1) +{ + int32 delta[2]; + + delta[0] = samp0 - ch->blip_prev_samp[0]; + delta[1] = samp1 - ch->blip_prev_samp[1]; + + const int16* c = Phase_Filter[(timestamp >> 1) & 1]; + const int32 l = (timestamp >> 2) & 0xFFFF; + + HRBufs[0][l + 0] += delta[0] * c[0]; + HRBufs[0][l + 1] += delta[0] * c[1]; + HRBufs[0][l + 2] += delta[0] * c[2]; + HRBufs[0][l + 3] += delta[0] * c[3]; + HRBufs[0][l + 4] += delta[0] * c[4]; + HRBufs[0][l + 5] += delta[0] * c[5]; + HRBufs[0][l + 6] += delta[0] * c[6]; + + HRBufs[1][l + 0] += delta[1] * c[0]; + HRBufs[1][l + 1] += delta[1] * c[1]; + HRBufs[1][l + 2] += delta[1] * c[2]; + HRBufs[1][l + 3] += delta[1] * c[3]; + HRBufs[1][l + 4] += delta[1] * c[4]; + HRBufs[1][l + 5] += delta[1] * c[5]; + HRBufs[1][l + 6] += delta[1] * c[6]; + + ch->blip_prev_samp[0] = samp0; + ch->blip_prev_samp[1] = samp1; +} + +void PCE_PSG::UpdateOutput_Norm(const int32 timestamp, psg_channel *ch) +{ + int sv = ch->dda; + + UpdateOutputSub(timestamp, ch, dbtable[ch->vl[0]][sv], + dbtable[ch->vl[1]][sv]); +} + +void PCE_PSG::UpdateOutput_Noise(const int32 timestamp, psg_channel *ch) +{ + int sv = ((ch->lfsr & 1) << 5) - (ch->lfsr & 1); //(ch->lfsr & 0x1) ? 0x1F : 0; + + UpdateOutputSub(timestamp, ch, dbtable[ch->vl[0]][sv], + dbtable[ch->vl[1]][sv]); +} + +void PCE_PSG::UpdateOutput_Off(const int32 timestamp, psg_channel *ch) +{ + UpdateOutputSub(timestamp, ch, 0, 0); +} + +void PCE_PSG::UpdateOutput_Accum_HuC6280A(const int32 timestamp, psg_channel *ch) +{ + int32 samp[2]; + + // 31(5-bit max) * 32 samples = 992 + // 992 / 2 = 496 + // + // 8 + 5 = 13 + // 13 - 12 = 1 + + samp[0] = ((int32)dbtable_volonly[ch->vl[0]] * ((int32)ch->samp_accum - 496)) >> (8 + 5); + samp[1] = ((int32)dbtable_volonly[ch->vl[1]] * ((int32)ch->samp_accum - 496)) >> (8 + 5); + + UpdateOutputSub(timestamp, ch, samp[0], samp[1]); +} + +void PCE_PSG::UpdateOutput_Accum_HuC6280(const int32 timestamp, psg_channel *ch) +{ + int32 samp[2]; + + samp[0] = ((int32)dbtable_volonly[ch->vl[0]] * (int32)ch->samp_accum) >> (8 + 5); + samp[1] = ((int32)dbtable_volonly[ch->vl[1]] * (int32)ch->samp_accum) >> (8 + 5); + + UpdateOutputSub(timestamp, ch, samp[0], samp[1]); +} + + +// This function should always be called after RecalcFreqCache() (it's not called from RecalcFreqCache to avoid redundant code) +void PCE_PSG::RecalcUOFunc(int chnum) +{ + psg_channel *ch = &channel[chnum]; + + //printf("UO Update: %d, %02x\n", chnum, ch->control); + + if((revision != REVISION_HUC6280 && !(ch->control & 0xC0)) || (revision == REVISION_HUC6280 && !(ch->control & 0x80))) + ch->UpdateOutput = &PCE_PSG::UpdateOutput_Off; + else if(ch->noisectrl & ch->control & 0x80) + ch->UpdateOutput = &PCE_PSG::UpdateOutput_Noise; + // If the control for the channel is in waveform play mode, and the (real) playback frequency is too high, and the channel is either not the LFO modulator channel or + // if the LFO trigger bit(which halts the LFO modulator channel's waveform incrementing when set) is clear + else if((ch->control & 0xC0) == 0x80 && ch->freq_cache <= FREQC7M_COT && (chnum != 1 || !(lfoctrl & 0x80)) ) + ch->UpdateOutput = UpdateOutput_Accum; + else + ch->UpdateOutput = &PCE_PSG::UpdateOutput_Norm; +} + + +void PCE_PSG::RecalcFreqCache(int chnum) +{ + psg_channel *ch = &channel[chnum]; + + if(chnum == 0 && (lfoctrl & 0x03)) + { + const uint32 shift = (((lfoctrl & 0x3) - 1) << 1); + uint8 la = channel[1].dda; + uint32 tmp_freq = (ch->frequency + ((uint32)(la - 0x10) << shift)) & 0xFFF; + + ch->freq_cache = (tmp_freq ? tmp_freq : 4096) << 1; + } + else + { + ch->freq_cache = (ch->frequency ? ch->frequency : 4096) << 1; + + if(chnum == 1 && (lfoctrl & 0x03)) + ch->freq_cache *= lfofreq ? lfofreq : 256; + } +} + +void PCE_PSG::RecalcNoiseFreqCache(int chnum) +{ + psg_channel *ch = &channel[chnum]; + int32 freq = 0x1F - (ch->noisectrl & 0x1F); + + if(!freq) + freq = 0x20; + else + freq <<= 6; + + freq <<= 1; + + ch->noise_freq_cache = freq; +} + +void PCE_PSG::PeekWave(const unsigned int ch, uint32 Address, uint32 Length, uint8 *Buffer) +{ + assert(ch <= 5); + + while(Length--) + { + Address &= 0x1F; + *Buffer = channel[ch].waveform[Address]; + Address++; + Buffer++; + } +} + +void PCE_PSG::PokeWave(const unsigned int ch, uint32 Address, uint32 Length, const uint8 *Buffer) +{ + assert(ch <= 5); + + while(Length--) + { + Address &= 0x1F; + channel[ch].samp_accum -= channel[ch].waveform[Address]; + channel[ch].waveform[Address] = *Buffer & 0x1F; + channel[ch].samp_accum += channel[ch].waveform[Address]; + Address++; + Buffer++; + } +} + +uint32 PCE_PSG::GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + const int ch = (id >> 8) & 0xF; + + switch(id & 0xF0FF) + { + default: break; + + case PSG_GSREG_SELECT: + value = select; + break; + + case PSG_GSREG_GBALANCE: + value = globalbalance; + break; + + case PSG_GSREG_LFOFREQ: + value = lfofreq; + break; + + case PSG_GSREG_LFOCTRL: + value = lfoctrl; + break; + + case PSG_GSREG_CH0_FREQ: + value = channel[ch].frequency; + break; + + case PSG_GSREG_CH0_CTRL: + value = channel[ch].control; + break; + + case PSG_GSREG_CH0_BALANCE: + value = channel[ch].balance; + break; + + case PSG_GSREG_CH0_WINDEX: + value = channel[ch].waveform_index; + break; + + case PSG_GSREG_CH0_SCACHE: + value = channel[ch].dda; + break; + + case PSG_GSREG_CH0_NCTRL: + value = channel[ch].noisectrl; + break; + + case PSG_GSREG_CH0_LFSR: + value = channel[ch].lfsr & 0x7FFF; + break; + } + return(value); +} + + +void PCE_PSG::SetRegister(const unsigned int id, const uint32 value) +{ + const int ch = (id >> 8) & 0xF; + + switch(id & 0xF0FF) + { + default: break; + + case PSG_GSREG_SELECT: + select = value & 0x07; + break; + + case PSG_GSREG_GBALANCE: + globalbalance = value & 0xFF; + break; + + case PSG_GSREG_LFOFREQ: + lfofreq = value & 0xFF; + break; + + case PSG_GSREG_LFOCTRL: + lfoctrl = value & 0x83; + RecalcFreqCache(0); + RecalcUOFunc(0); + RecalcFreqCache(1); + RecalcUOFunc(1); + break; + + case PSG_GSREG_CH0_FREQ: + channel[ch].frequency = value & 0xFFF; + RecalcFreqCache(ch); + RecalcUOFunc(ch); + break; + + case PSG_GSREG_CH0_CTRL: + channel[ch].control = value & 0xFF; + RecalcFreqCache(ch); + RecalcUOFunc(ch); + break; + + case PSG_GSREG_CH0_BALANCE: + channel[ch].balance = value & 0xFF; + break; + + case PSG_GSREG_CH0_WINDEX: + channel[ch].waveform_index = value & 0x1F; + break; + + case PSG_GSREG_CH0_SCACHE: + channel[ch].dda = value & 0x1F; + break; + + case PSG_GSREG_CH0_NCTRL: + channel[ch].noisectrl = value & 0xFF; + RecalcNoiseFreqCache(ch); + RecalcUOFunc(ch); + break; + + case PSG_GSREG_CH0_LFSR: + channel[ch].lfsr = value & 0x7FFF; + break; + } +} + + +#if 0 +void PSG_SetRegister(const unsigned int id, const uint32 value) +{ + + + if(name == "Select") + PSG_Write(0x00, V); + else if(name == "GBalance") + PSG_Write(0x01, V); + else if(name == "LFOFreq") + { + PSG_Write(0x08, V); + } + else if(name == "LFOCtrl") + PSG_Write(0x09, V); + else if(!strncmp(name.c_str(), "CH", 2)) + { + unsigned int psg_sel_save = select; + int ch = name[2] - '0'; + char moomoo[64]; + strncpy(moomoo, name.c_str() + 3, 63); + + PSG_Write(0x00, ch); + + if(!strcmp(moomoo, "Freq")) + { + PSG_Write(0x02, V); + PSG_Write(0x03, V >> 8); + } + else if(!strcmp(moomoo, "Ctrl")) + PSG_Write(0x04, V); + else if(!strcmp(moomoo, "Balance")) + PSG_Write(0x05, V); + else if(!strcmp(moomoo, "WIndex")) + psg.channel[ch].waveform_index = V & 0x1F; + else if(!strcmp(moomoo, "SCache")) + psg.channel[ch].dda = V & 0x1F; + else if(!strcmp(moomoo, "NCtrl") && ch < 4) + psg.channel[ch].noisectrl = V; + else if(!strcmp(moomoo, "LFSR") && ch < 4) + psg.channel[ch].lfsr = V & 0x3FFFF; + + PSG_Write(0x00, psg_sel_save); + } +} +#endif + +PCE_PSG::PCE_PSG(int32* hr_l, int32* hr_r, int want_revision) +{ + //printf("Test: %u, %u\n", sizeof(psg_channel), (uint8*)&channel[0].balance - (uint8*)&channel[0].waveform[0]); + + revision = want_revision; + switch(revision) + { + default: + abort(); + break; + + case REVISION_HUC6280: + UpdateOutput_Accum = &PCE_PSG::UpdateOutput_Accum_HuC6280; + break; + + case REVISION_HUC6280A: + UpdateOutput_Accum = &PCE_PSG::UpdateOutput_Accum_HuC6280A; + break; + } + HRBufs[0] = hr_l; + HRBufs[1] = hr_r; + + lastts = 0; + for(int ch = 0; ch < 6; ch++) + { + channel[ch].blip_prev_samp[0] = 0; + channel[ch].blip_prev_samp[1] = 0; + channel[ch].lastts = 0; + } + + SetVolume(1.0); // Will build dbtable in the process. + Power(0); +} + +PCE_PSG::~PCE_PSG() +{ + + +} + +int32 PCE_PSG::GetVL(const int chnum, const int lr) +{ + psg_channel *ch = &channel[chnum]; + + const int gbal = 0x1F - scale_tab[(globalbalance >> (lr ? 0 : 4)) & 0xF]; + const int bal = 0x1F - scale_tab[(ch->balance >> (lr ? 0 : 4)) & 0xF]; + const int al = 0x1F - (ch->control & 0x1F); + int vol_reduction; + + vol_reduction = gbal + bal + al; + + if(vol_reduction > 0x1F) + vol_reduction = 0x1F; + + return(vol_reduction); +} + +void PCE_PSG::Write(int32 timestamp, uint8 A, uint8 V) +{ + A &= 0x0F; + + if(A == 0x00) + { + select = (V & 0x07); + return; + } + + Update(timestamp); + + psg_channel *ch = &channel[select]; + + //if(A == 0x01 || select == 5) + // printf("Write Ch: %d %04x %02x, %d\n", select, A, V, timestamp); + + switch(A) + { + default: break; + + case 0x01: /* Global sound balance */ + globalbalance = V; + vol_pending = true; + break; + + case 0x02: /* Channel frequency (LSB) */ + if(select > 5) return; // no more than 6 channels, silly game. + + ch->frequency = (ch->frequency & 0x0F00) | V; + RecalcFreqCache(select); + RecalcUOFunc(select); + break; + + case 0x03: /* Channel frequency (MSB) */ + if(select > 5) return; // no more than 6 channels, silly game. + + ch->frequency = (ch->frequency & 0x00FF) | ((V & 0x0F) << 8); + RecalcFreqCache(select); + RecalcUOFunc(select); + break; + + case 0x04: /* Channel enable, DDA, volume */ + if(select > 5) return; // no more than 6 channels, silly game. + + if((ch->control & 0x40) && !(V & 0x40)) + { + ch->waveform_index = 0; + ch->dda = ch->waveform[ch->waveform_index]; + ch->counter = ch->freq_cache; + } + + if(!(ch->control & 0x80) && (V & 0x80)) + { + if(!(V & 0x40)) + { + ch->waveform_index = (ch->waveform_index + 1) & 0x1F; + ch->dda = ch->waveform[ch->waveform_index]; + } + } + + ch->control = V; + RecalcFreqCache(select); + RecalcUOFunc(select); + + vol_pending = true; + break; + + case 0x05: /* Channel balance */ + if(select > 5) return; // no more than 6 channels, silly game. + ch->balance = V; + + vol_pending = true; + break; + + case 0x06: /* Channel waveform data */ + if(select > 5) return; // no more than 6 channels, silly game. + V &= 0x1F; + + if(!(ch->control & 0x40)) + { + ch->samp_accum -= ch->waveform[ch->waveform_index]; + ch->waveform[ch->waveform_index] = V; + ch->samp_accum += ch->waveform[ch->waveform_index]; + } + + if((ch->control & 0xC0) == 0x00) + ch->waveform_index = ((ch->waveform_index + 1) & 0x1F); + + if(ch->control & 0x80) + { + // According to my tests(on SuperGrafx), writing to this channel + // will update the waveform value cache/latch regardless of DDA mode being enabled. + ch->dda = V; + } + break; + + case 0x07: /* Noise enable and frequency */ + if(select > 5) return; // no more than 6 channels, silly game. + if(select >= 4) + { + ch->noisectrl = V; + RecalcNoiseFreqCache(select); + RecalcUOFunc(select); + } + break; + + case 0x08: /* LFO frequency */ + lfofreq = V & 0xFF; + //printf("LFO Freq: %02x\n", V); + break; + + case 0x09: /* LFO trigger and control */ + //printf("LFO Ctrl: %02x\n", V); + if(V & 0x80) + { + channel[1].waveform_index = 0; + channel[1].dda = channel[1].waveform[channel[1].waveform_index]; + channel[1].counter = channel[1].freq_cache; + } + lfoctrl = V; + RecalcFreqCache(0); + RecalcUOFunc(0); + RecalcFreqCache(1); + RecalcUOFunc(1); + break; + } +} + +// Don't use INLINE, which has always_inline in it, due to gcc's inability to cope with the type of recursion +// used in this function. +void PCE_PSG::RunChannel(int chc, int32 timestamp, const bool LFO_On) +{ + psg_channel *ch = &channel[chc]; + int32 running_timestamp = ch->lastts; + int32 run_time = timestamp - ch->lastts; + + ch->lastts = timestamp; + + if(!run_time) + return; + + (this->*ch->UpdateOutput)(running_timestamp, ch); + + if(chc >= 4) + { + int32 freq = ch->noise_freq_cache; + + ch->noisecount -= run_time; + + if(&PCE_PSG::UpdateOutput_Noise == ch->UpdateOutput) + while(ch->noisecount <= 0) + { + CLOCK_LFSR(ch->lfsr); + UpdateOutput_Noise(timestamp + ch->noisecount, ch); + ch->noisecount += freq; + } + else + while(ch->noisecount <= 0) + { + CLOCK_LFSR(ch->lfsr); + ch->noisecount += freq; + } + } + + // D7 of control is 0, don't clock the counter at all. + // D7 of lfocontrol is 1(and chc == 1), don't clock the counter at all(not sure about this) + // In DDA mode, don't clock the counter. + // (Noise being enabled isn't handled here since AFAIK it doesn't disable clocking of the waveform portion, its sound just overrides the sound from + // the waveform portion when the noise enable bit is set, which is handled in our RecalcUOFunc). + if(!(ch->control & 0x80) || (chc == 1 && (lfoctrl & 0x80)) || (ch->control & 0x40)) + return; + + ch->counter -= run_time; + + if(!LFO_On && ch->freq_cache <= FREQC7M_COT) + { + if(ch->counter <= 0) + { + const int32 inc_count = ((0 - ch->counter) / ch->freq_cache) + 1; + + ch->counter += inc_count * ch->freq_cache; + + ch->waveform_index = (ch->waveform_index + inc_count) & 0x1F; + ch->dda = ch->waveform[ch->waveform_index]; + } + } + + while(ch->counter <= 0) + { + ch->waveform_index = (ch->waveform_index + 1) & 0x1F; + ch->dda = ch->waveform[ch->waveform_index]; + + (this->*ch->UpdateOutput)(timestamp + ch->counter, ch); + + if(LFO_On) + { + RunChannel(1, timestamp + ch->counter, false); + RecalcFreqCache(0); + RecalcUOFunc(0); + + ch->counter += (ch->freq_cache <= FREQC7M_COT) ? FREQC7M_COT : ch->freq_cache; // Not particularly accurate, but faster. + } + else + ch->counter += ch->freq_cache; + } +} + +void PCE_PSG::UpdateSubLFO(int32 timestamp) +{ + for(int chc = 0; chc < 6; chc++) + RunChannel(chc, timestamp, chc == 0); +} + +void PCE_PSG::UpdateSubNonLFO(int32 timestamp) +{ + for(int chc = 0; chc < 6; chc++) + RunChannel(chc, timestamp, false); +} + +void PCE_PSG::Update(int32 timestamp) +{ + int32 run_time = timestamp - lastts; + + if(vol_pending && !vol_update_counter && !vol_update_which) + { + vol_update_counter = 1; + vol_pending = false; + } + + bool lfo_on = (bool)(lfoctrl & 0x03); + + if(lfo_on) + { + if(!(channel[1].control & 0x80) || (lfoctrl & 0x80)) + { + lfo_on = 0; + RecalcFreqCache(0); + RecalcUOFunc(0); + } + } + + int32 clocks = run_time; + int32 running_timestamp = lastts; + + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(vol_update_counter > 0 && chunk_clocks > vol_update_counter) + chunk_clocks = vol_update_counter; + + running_timestamp += chunk_clocks; + clocks -= chunk_clocks; + + if(lfo_on) + UpdateSubLFO(running_timestamp); + else + UpdateSubNonLFO(running_timestamp); + + if(vol_update_counter > 0) + { + vol_update_counter -= chunk_clocks; + if(!vol_update_counter) + { + const int phase = vol_update_which & 1; + const int lr = ((vol_update_which >> 1) & 1) ^ 1; + const int chnum = vol_update_which >> 2; + + if(!phase) + { + //printf("Volume update(Read, %d since last): ch=%d, lr=%d, ts=%d\n", running_timestamp - last_read, chnum, lr, running_timestamp); + + if(chnum < 6) + { + vol_update_vllatch = GetVL(chnum, lr); + } + //last_read = running_timestamp; + } + else + { + // printf("Volume update(Apply): ch=%d, lr=%d, ts=%d\n", chnum, lr, running_timestamp); + if(chnum < 6) + { + channel[chnum].vl[lr] = vol_update_vllatch; + } + //last_apply = running_timestamp; + } + vol_update_which = (vol_update_which + 1) & 0x1F; + + if(vol_update_which) + vol_update_counter = phase ? 1 : 255; + else if(vol_pending) + { + vol_update_counter = phase ? 1 : 255; + vol_pending = false; + } + } + } + + lastts = running_timestamp; + } +} + +void PCE_PSG::ResetTS(int32 ts_base) +{ + lastts = ts_base; + + for(int chc = 0; chc < 6; chc++) + channel[chc].lastts = ts_base; +} + +void PCE_PSG::Power(const int32 timestamp) +{ + // Not sure about power-on values, these are mostly just intuitive guesses(with some laziness thrown in). + if(timestamp != lastts) + Update(timestamp); + + // Don't memset channel to 0, there's stuff like lastts and blip_prev_samp that shouldn't be altered on Power(). + + select = 0; + globalbalance = 0; + lfofreq = 0; + lfoctrl = 0; + + for(int ch = 0; ch < 6; ch++) + { + channel[ch].frequency = 0; + channel[ch].control = 0x00; + channel[ch].balance = 0; + memset(channel[ch].waveform, 0, 32); + channel[ch].samp_accum = 0; + + channel[ch].waveform_index = 0; + channel[ch].dda = 0x00; + channel[ch].noisectrl = 0x00; + + channel[ch].vl[0] = 0x1F; + channel[ch].vl[1] = 0x1F; + + channel[ch].samp_accum = 0; + + RecalcFreqCache(ch); + RecalcUOFunc(ch); + + channel[ch].counter = channel[ch].freq_cache; + + if(ch >= 4) + { + RecalcNoiseFreqCache(ch); + channel[ch].noisecount = 1; + channel[ch].lfsr = 1; + } + } + + vol_pending = false; + vol_update_counter = 0; + vol_update_which = 0; +} + +void PCE_PSG::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + for(int ch = 0; ch < 6; ch++) + { + char tmpstr[5] = "SCHx"; + psg_channel *pt = &channel[ch]; + + SFORMAT CH_StateRegs[] = + { + SFVARN(pt->counter, "counter"), + SFVARN(pt->frequency, "frequency"), + SFVARN(pt->control, "control"), + SFVARN(pt->balance, "balance"), + SFARRAYN(pt->waveform, 32, "waveform"), + SFVARN(pt->waveform_index, "waveform_index"), + SFVARN(pt->dda, "dda"), + SFVARN(pt->noisectrl, "noisectrl"), + SFVARN(pt->noisecount, "noisecount"), + SFVARN(pt->lfsr, "lfsr"), + SFARRAY32N(pt->vl, 2, "vl"), // TODO + SFEND + }; + tmpstr[3] = '0' + ch; + MDFNSS_StateAction(sm, load, data_only, CH_StateRegs, tmpstr); + } + + SFORMAT PSG_StateRegs[] = + { + SFVAR(select), + SFVAR(globalbalance), + SFVAR(lfofreq), + SFVAR(lfoctrl), + + SFVAR(vol_update_counter), + SFVAR(vol_update_which), + SFVAR(vol_pending), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, PSG_StateRegs, "PSG"); + + if(load) + { + vol_update_which &= 0x1F; + + if(!channel[4].lfsr) + channel[4].lfsr = 1; + + if(!channel[5].lfsr) + channel[5].lfsr = 1; + + for(int ch = 0; ch < 6; ch++) + { + channel[ch].samp_accum = 0; + for(int wi = 0; wi < 32; wi++) + { + channel[ch].waveform[wi] &= 0x1F; + channel[ch].samp_accum += channel[ch].waveform[wi]; + } + + for(int lr = 0; lr < 2; lr++) + channel[ch].vl[lr] &= 0x1F; + + if(!channel[ch].noisecount && ch >= 4) + { + printf("ch=%d, noisecount == 0\n", ch); + channel[ch].noisecount = 1; + } + + if(channel[ch].counter <= 0) + { + printf("ch=%d, counter <= 0\n", ch); + channel[ch].counter = 1; + } + + if(ch >= 4) + RecalcNoiseFreqCache(ch); + RecalcFreqCache(ch); + RecalcUOFunc(ch); + } + } +} diff --git a/Mednafen/mednafen/hw_sound/pce_psg/pce_psg.h b/Mednafen/mednafen/hw_sound/pce_psg/pce_psg.h new file mode 100644 index 0000000000..4405ac36ac --- /dev/null +++ b/Mednafen/mednafen/hw_sound/pce_psg/pce_psg.h @@ -0,0 +1,191 @@ +/* Mednafen - Multi-system Emulator + * + * Original skeleton write handler and PSG structure definition: + * Copyright (C) 2001 Charles MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _PCE_PSG_H +#define _PCE_PSG_H + +class PCE_PSG; + +struct psg_channel +{ + uint8 waveform[32]; /* Waveform data */ + uint8 waveform_index; /* Waveform data index */ + uint8 dda; + uint8 control; /* Channel enable, DDA, volume */ + uint8 noisectrl; /* Noise enable/ctrl (channels 4,5 only) */ + + int32 vl[2]; //vll, vlr; + + int32 counter; + + void (PCE_PSG::*UpdateOutput)(const int32 timestamp, psg_channel *ch); + + uint32 freq_cache; + uint32 noise_freq_cache; // Channel 4,5 only + int32 noisecount; + uint32 lfsr; + + int32 samp_accum; // The result of adding up all the samples in the waveform buffer(part of an optimization for high-frequency playback). + int32 blip_prev_samp[2]; + int32 lastts; + + uint16 frequency; /* Channel frequency */ + uint8 balance; /* Channel balance */ +}; + +// Only CH4 and CH5 have NCTRL and LFSR, but it's here for the other channels for "consistency". +enum +{ + PSG_GSREG_CH0_FREQ = 0x000, +// PSG_GSREG_CH0_COUNTER, + PSG_GSREG_CH0_CTRL, + PSG_GSREG_CH0_BALANCE, + PSG_GSREG_CH0_WINDEX, + PSG_GSREG_CH0_SCACHE, + PSG_GSREG_CH0_NCTRL, + PSG_GSREG_CH0_LFSR, + + PSG_GSREG_CH1_FREQ = 0x100, +// PSG_GSREG_CH1_COUNTER, + PSG_GSREG_CH1_CTRL, + PSG_GSREG_CH1_BALANCE, + PSG_GSREG_CH1_WINDEX, + PSG_GSREG_CH1_SCACHE, + PSG_GSREG_CH1_NCTRL, + PSG_GSREG_CH1_LFSR, + + PSG_GSREG_CH2_FREQ = 0x200, +// PSG_GSREG_CH2_COUNTER, + PSG_GSREG_CH2_CTRL, + PSG_GSREG_CH2_BALANCE, + PSG_GSREG_CH2_WINDEX, + PSG_GSREG_CH2_SCACHE, + PSG_GSREG_CH2_NCTRL, + PSG_GSREG_CH2_LFSR, + + PSG_GSREG_CH3_FREQ = 0x300, +// PSG_GSREG_CH3_COUNTER, + PSG_GSREG_CH3_CTRL, + PSG_GSREG_CH3_BALANCE, + PSG_GSREG_CH3_WINDEX, + PSG_GSREG_CH3_SCACHE, + PSG_GSREG_CH3_NCTRL, + PSG_GSREG_CH3_LFSR, + + PSG_GSREG_CH4_FREQ = 0x400, +// PSG_GSREG_CH4_COUNTER, + PSG_GSREG_CH4_CTRL, + PSG_GSREG_CH4_BALANCE, + PSG_GSREG_CH4_WINDEX, + PSG_GSREG_CH4_SCACHE, + PSG_GSREG_CH4_NCTRL, + PSG_GSREG_CH4_LFSR, + + PSG_GSREG_CH5_FREQ = 0x500, +// PSG_GSREG_CH5_COUNTER, + PSG_GSREG_CH5_CTRL, + PSG_GSREG_CH5_BALANCE, + PSG_GSREG_CH5_WINDEX, + PSG_GSREG_CH5_SCACHE, + PSG_GSREG_CH5_NCTRL, + PSG_GSREG_CH5_LFSR, + + PSG_GSREG_SELECT = 0x1000, + PSG_GSREG_GBALANCE, + PSG_GSREG_LFOFREQ, + PSG_GSREG_LFOCTRL, + _PSG_GSREG_COUNT +}; + +class PCE_PSG +{ + public: + + enum + { + REVISION_HUC6280 = 0, + REVISION_HUC6280A, + _REVISION_COUNT + }; + + + PCE_PSG(int32* hr_l, int32* hr_r, int want_revision); + ~PCE_PSG(); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + void Power(const int32 timestamp); + void Write(int32 timestamp, uint8 A, uint8 V); + + void SetVolume(double new_volume); + + void Update(int32 timestamp); + void ResetTS(int32 ts_base = 0); + + // TODO: timestamp + uint32 GetRegister(const unsigned int id, char *special, const uint32 special_len); + void SetRegister(const unsigned int id, const uint32 value); + + void PeekWave(const unsigned int ch, uint32 Address, uint32 Length, uint8 *Buffer); + void PokeWave(const unsigned int ch, uint32 Address, uint32 Length, const uint8 *Buffer); + + private: + + void UpdateSubLFO(int32 timestamp); + void UpdateSubNonLFO(int32 timestamp); + + void RecalcUOFunc(int chnum); + void UpdateOutputSub(const int32 timestamp, psg_channel *ch, const int32 samp0, const int32 samp1); + void UpdateOutput_Off(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Accum_HuC6280(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Accum_HuC6280A(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Norm(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Noise(const int32 timestamp, psg_channel *ch); + void (PCE_PSG::*UpdateOutput_Accum)(const int32 timestamp, psg_channel *ch); + + int32 GetVL(const int chnum, const int lr); + + void RecalcFreqCache(int chnum); + void RecalcNoiseFreqCache(int chnum); + void RunChannel(int chc, int32 timestamp, bool LFO_On); + + uint8 select; /* Selected channel (0-5) */ + uint8 globalbalance; /* Global sound balance */ + uint8 lfofreq; /* LFO frequency */ + uint8 lfoctrl; /* LFO control */ + + int32 vol_update_counter; + int32 vol_update_which; + int32 vol_update_vllatch; + bool vol_pending; + + psg_channel channel[6]; + + int32 lastts; + int revision; + + int32* HRBufs[2]; + + int32 dbtable_volonly[32]; + + int32 dbtable[32][32]; +}; + +#endif diff --git a/Mednafen/mednafen/hw_sound/sms_apu/Sms_Apu.cpp b/Mednafen/mednafen/hw_sound/sms_apu/Sms_Apu.cpp new file mode 100644 index 0000000000..7a22b455a8 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/sms_apu/Sms_Apu.cpp @@ -0,0 +1,384 @@ +// Sms_Snd_Emu 0.1.4. http://www.slack.net/~ant/ + +#include +#include "Sms_Apu.h" + +/* Copyright (C) 2003-2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +// Sms_Osc + +Sms_Osc::Sms_Osc() +{ + output = 0; + outputs [0] = 0; // always stays NULL + outputs [1] = 0; + outputs [2] = 0; + outputs [3] = 0; +} + +void Sms_Osc::reset() +{ + delay = 0; + last_amp = 0; + volume = 0; + output_select = 3; + output = outputs [3]; +} + +// Sms_Square + +blip_inline void Sms_Square::reset() +{ + period = 0; + phase = 0; + Sms_Osc::reset(); +} + +void Sms_Square::run( blip_time_t time, blip_time_t end_time ) +{ + int amp = volume; + if ( period > 128 ) + amp = amp << 1 & -phase; + + { + int delta = amp - last_amp; + if ( delta ) + { + last_amp = amp; + synth->offset( time, delta, output ); + } + } + + time += delay; + delay = 0; + if ( period ) + { + if ( time < end_time ) + { + if ( !volume || period <= 128 ) // ignore 16kHz and higher + { + // keep calculating phase + int count = (end_time - time + period - 1) / period; + phase = (phase + count) & 1; + time += count * period; + } + else + { + Blip_Buffer* const output = this->output; + int delta = amp * 2 - volume * 2; + do + { + delta = -delta; + synth->offset_inline( time, delta, output ); + time += period; + } + while ( time < end_time ); + + last_amp = (delta >> 1) + volume; + phase = (delta >= 0); + } + } + delay = time - end_time; + } +} + +// Sms_Noise + +static int const noise_periods [3] = { 0x100, 0x200, 0x400 }; + +blip_inline void Sms_Noise::reset() +{ + period = &noise_periods [0]; + shifter = 0x8000; + feedback = 0x9000; + Sms_Osc::reset(); +} + +void Sms_Noise::run( blip_time_t time, blip_time_t end_time ) +{ + int amp = (shifter & 1) ? 0 : volume * 2; + + { + int delta = amp - last_amp; + if ( delta ) + { + last_amp = amp; + synth.offset( time, delta, output ); + } + } + + time += delay; + if ( !volume ) + time = end_time; + + if ( time < end_time ) + { + Blip_Buffer* const output = this->output; + unsigned shifter = this->shifter; + int delta = (shifter & 1) ? (-volume * 2) : (volume * 2); + int period = *this->period * 2; + if ( !period ) + period = 16; + + do + { + int changed = shifter + 1; + shifter = (feedback & -(shifter & 1)) ^ (shifter >> 1); + if ( changed & 2 ) // true if bits 0 and 1 differ + { + amp = (shifter & 1) ? 0 : volume * 2; + delta = -delta; + synth.offset_inline( time, delta, output ); + last_amp = amp; + } + time += period; + } + while ( time < end_time ); + + this->shifter = shifter; + this->last_amp = (shifter & 1) ? 0 : volume * 2; //delta >> 1; + } + delay = time - end_time; +} + +// Sms_Apu + +Sms_Apu::Sms_Apu() +{ + for ( int i = 0; i < 3; i++ ) + { + squares [i].synth = &square_synth; + oscs [i] = &squares [i]; + } + oscs [3] = &noise; + + volume( 1.0 ); + reset(); +} + +Sms_Apu::~Sms_Apu() +{ +} + +void Sms_Apu::volume( double vol ) +{ + vol *= 0.85 / (osc_count * 64 * 2); + square_synth.volume( vol ); + noise.synth.volume( vol ); +} + +void Sms_Apu::treble_eq( const blip_eq_t& eq ) +{ + square_synth.treble_eq( eq ); + noise.synth.treble_eq( eq ); +} + +void Sms_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ) +{ + require( (unsigned) index < osc_count ); + require( (center && left && right) || (!center && !left && !right) ); + Sms_Osc& osc = *oscs [index]; + osc.outputs [1] = right; + osc.outputs [2] = left; + osc.outputs [3] = center; + osc.output = osc.outputs [osc.output_select]; +} + +void Sms_Apu::output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ) +{ + for ( int i = 0; i < osc_count; i++ ) + osc_output( i, center, left, right ); +} + +void Sms_Apu::reset( unsigned feedback, int noise_width ) +{ + last_time = 0; + latch = 0; + ggstereo_save = 0xFF; + + if ( !feedback || !noise_width ) + { + feedback = 0x0009; + noise_width = 16; + } + // convert to "Galios configuration" + looped_feedback = 1 << (noise_width - 1); + noise_feedback = 0; + while ( noise_width-- ) + { + noise_feedback = (noise_feedback << 1) | (feedback & 1); + feedback >>= 1; + } + + squares [0].reset(); + squares [1].reset(); + squares [2].reset(); + noise.reset(); +} + +void Sms_Apu::run_until( blip_time_t end_time ) +{ + require( end_time >= last_time ); // end_time must not be before previous time + + if ( end_time > last_time ) + { + // run oscillators + for ( int i = 0; i < osc_count; ++i ) + { + Sms_Osc& osc = *oscs [i]; + if ( osc.output ) + { + if ( i < 3 ) + squares [i].run( last_time, end_time ); + else + noise.run( last_time, end_time ); + } + } + + last_time = end_time; + } +} + +void Sms_Apu::end_frame( blip_time_t end_time ) +{ + if ( end_time > last_time ) + run_until( end_time ); + + assert( last_time >= end_time ); + last_time -= end_time; +} + +void Sms_Apu::write_ggstereo( blip_time_t time, int data ) +{ + require( (unsigned) data <= 0xFF ); + + ggstereo_save = data; + + run_until( time ); + + for ( int i = 0; i < osc_count; i++ ) + { + Sms_Osc& osc = *oscs [i]; + int flags = data >> i; + Blip_Buffer* old_output = osc.output; + osc.output_select = (flags >> 3 & 2) | (flags & 1); + osc.output = osc.outputs [osc.output_select]; + if ( osc.output != old_output && osc.last_amp ) + { + if ( old_output ) + { + square_synth.offset( time, -osc.last_amp, old_output ); + } + osc.last_amp = 0; + } + } +} + +// volumes [i] = 64 * pow( 1.26, 15 - i ) / pow( 1.26, 15 ) +static unsigned char const volumes [16] = { + 64, 50, 39, 31, 24, 19, 15, 12, 9, 7, 5, 4, 3, 2, 1, 0 +}; + +void Sms_Apu::write_data( blip_time_t time, int data ) +{ + require( (unsigned) data <= 0xFF ); + + run_until( time ); + + if ( data & 0x80 ) + latch = data; + + int index = (latch >> 5) & 3; + + //if(index == 3) + //printf("Write @ %d; Index: %d, %d, Value: %02x\n", time, index, latch, data); + + if ( latch & 0x10 ) + { + oscs [index]->volume = volumes [data & 15]; + } + else if ( index < 3 ) + { + Sms_Square& sq = squares [index]; + if ( data & 0x80 ) + sq.period = (sq.period & 0xFF00) | (data << 4 & 0x00FF); + else + sq.period = (sq.period & 0x00FF) | (data << 8 & 0x3F00); + } + else + { + int select = data & 3; + if ( select < 3 ) + noise.period = &noise_periods [select]; + else + noise.period = &squares [2].period; + + noise.feedback = (data & 0x04) ? noise_feedback : looped_feedback; + noise.shifter = 0x8000; + } +} + + +void Sms_Apu::save_state(Sms_ApuState *ret) +{ + memset(ret, 0, sizeof(Sms_ApuState)); + + ret->ggstereo = ggstereo_save; + + for(int x = 0; x < 4; x++) + { + ret->volume[x] = oscs[x]->volume; + } + + for(int x = 0; x < 3; x++) + { + ret->sq_period[x] = squares[x].period; + ret->sq_phase[x] = squares[x].phase; + } + + ret->noise_shifter = noise.shifter; + ret->noise_feedback = noise.feedback; + + if(noise.period == &noise_periods[0]) + ret->noise_period = 0; + else if(noise.period == &noise_periods[1]) + ret->noise_period = 1; + else if(noise.period == &noise_periods[2]) + ret->noise_period = 2; + else ret->noise_period = 3; +} + +void Sms_Apu::load_state(const Sms_ApuState *state) +{ + for(int x = 0; x < 4; x++) + { + oscs[x]->volume = state->volume[x]; + } + + for(int x = 0; x < 3; x++) + { + squares[x].period = state->sq_period[x]; + squares[x].phase = state->sq_phase[x]; + } + noise.shifter = state->noise_shifter; + noise.feedback = state->noise_feedback; + + int select = state->noise_period; + + if ( select < 3 ) + noise.period = &noise_periods [select]; + else + noise.period = &squares [2].period; + + write_ggstereo(0, state->ggstereo); +} + diff --git a/Mednafen/mednafen/hw_sound/sms_apu/Sms_Apu.h b/Mednafen/mednafen/hw_sound/sms_apu/Sms_Apu.h new file mode 100644 index 0000000000..3e83d6d998 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/sms_apu/Sms_Apu.h @@ -0,0 +1,92 @@ +// Sega Master System SN76489 PSG sound chip emulator + +// Sms_Snd_Emu 0.1.4 +#ifndef SMS_APU_H +#define SMS_APU_H + +#include "Sms_Oscs.h" + +typedef struct +{ + int32 sq_period[3]; + int32 sq_phase[3]; + int32 noise_period; + uint32 noise_shifter; + uint32 noise_feedback; + + int32 volume[4]; + uint8 ggstereo; + uint8 latch; +} Sms_ApuState; + +class Sms_Apu { +public: + // Set overall volume of all oscillators, where 1.0 is full volume + void volume( double ); + + // Set treble equalization + void treble_eq( const blip_eq_t& ); + + // Outputs can be assigned to a single buffer for mono output, or to three + // buffers for stereo output (using Stereo_Buffer to do the mixing). + + // Assign all oscillator outputs to specified buffer(s). If buffer + // is NULL, silences all oscillators. + void output( Blip_Buffer* mono ); + void output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ); + + // Assign single oscillator output to buffer(s). Valid indicies are 0 to 3, + // which refer to Square 1, Square 2, Square 3, and Noise. If buffer is NULL, + // silences oscillator. + enum { osc_count = 4 }; + void osc_output( int index, Blip_Buffer* mono ); + void osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ); + + // Reset oscillators and internal state + void reset( unsigned noise_feedback = 0, int noise_width = 0 ); + + // Write GameGear left/right assignment byte + void write_ggstereo( blip_time_t, int ); + + // Write to data port + void write_data( blip_time_t, int ); + + // Run all oscillators up to specified time, end current frame, then + // start a new frame at time 0. + void end_frame( blip_time_t ); + + void save_state(Sms_ApuState *); + void load_state(const Sms_ApuState *); + +public: + Sms_Apu(); + ~Sms_Apu(); +private: + // noncopyable + Sms_Apu( const Sms_Apu& ); + Sms_Apu& operator = ( const Sms_Apu& ); + + Sms_Osc* oscs [osc_count]; + Sms_Square squares [3]; + Sms_Square::Synth square_synth; // used by squares + blip_time_t last_time; + int latch; + Sms_Noise noise; + unsigned noise_feedback; + unsigned looped_feedback; + unsigned int ggstereo_save; + + void run_until( blip_time_t ); +}; + +struct sms_apu_state_t +{ + unsigned char regs [8] [2]; + unsigned char latch; +}; + +inline void Sms_Apu::output( Blip_Buffer* b ) { output( b, b, b ); } + +inline void Sms_Apu::osc_output( int i, Blip_Buffer* b ) { osc_output( i, b, b, b ); } + +#endif diff --git a/Mednafen/mednafen/hw_sound/sms_apu/Sms_Oscs.h b/Mednafen/mednafen/hw_sound/sms_apu/Sms_Oscs.h new file mode 100644 index 0000000000..f717958068 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/sms_apu/Sms_Oscs.h @@ -0,0 +1,48 @@ +// Private oscillators used by Sms_Apu + +// Sms_Snd_Emu 0.1.4 +#ifndef SMS_OSCS_H +#define SMS_OSCS_H + +#include + +struct Sms_Osc +{ + Blip_Buffer* outputs [4]; // NULL, right, left, center + Blip_Buffer* output; + int output_select; + + int delay; + int last_amp; + int volume; + + Sms_Osc(); + void reset(); +}; + +struct Sms_Square : Sms_Osc +{ + int period; + int phase; + + typedef Blip_Synth Synth; + const Synth* synth; + + void reset(); + void run( blip_time_t, blip_time_t ); +}; + +struct Sms_Noise : Sms_Osc +{ + const int* period; + unsigned shifter; + unsigned feedback; + + typedef Blip_Synth Synth; + Synth synth; + + void reset(); + void run( blip_time_t, blip_time_t ); +}; + +#endif diff --git a/Mednafen/mednafen/hw_sound/ym2413/2413tone.h b/Mednafen/mednafen/hw_sound/ym2413/2413tone.h new file mode 100644 index 0000000000..c8dc8be273 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/ym2413/2413tone.h @@ -0,0 +1,20 @@ +0x49,0x4c,0x4c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x61,0x61,0x1e,0x17,0xf0,0x7f,0x00,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x13,0x41,0x16,0x0e,0xfd,0xf4,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x03,0x01,0x9a,0x04,0xf3,0xf3,0x13,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x11,0x61,0x0e,0x07,0xfa,0x64,0x70,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x22,0x21,0x1e,0x06,0xf0,0x76,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x21,0x22,0x16,0x05,0xf0,0x71,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x21,0x61,0x1d,0x07,0x82,0x80,0x17,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x23,0x21,0x2d,0x16,0x90,0x90,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x21,0x21,0x1b,0x06,0x64,0x65,0x10,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x21,0x21,0x0b,0x1a,0x85,0xa0,0x70,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x23,0x01,0x83,0x10,0xff,0xb4,0x10,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x97,0xc1,0x20,0x07,0xff,0xf4,0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x61,0x00,0x0c,0x05,0xc2,0xf6,0x40,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x01,0x56,0x03,0x94,0xc2,0x03,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x21,0x01,0x89,0x03,0xf1,0xe4,0xf0,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x07,0x21,0x14,0x00,0xee,0xf8,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x01,0x31,0x00,0x00,0xf8,0xf7,0xf8,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x25,0x11,0x00,0x00,0xf8,0xfa,0xf8,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + diff --git a/Mednafen/mednafen/hw_sound/ym2413/emu2413.cpp b/Mednafen/mednafen/hw_sound/ym2413/emu2413.cpp new file mode 100644 index 0000000000..0712ee59d9 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/ym2413/emu2413.cpp @@ -0,0 +1,1767 @@ +/* Modified for usage in Mednafen's SMS emulation(YMF281B tone data removed, code simplified, and more!). + + License: + + Copyright (C) Mitsutaka Okazaki 2004 + + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from + the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +*/ + +/*********************************************************************************** + + emu2413.c -- YM2413 emulator written by Mitsutaka Okazaki 2001 + + 2001 01-08 : Version 0.10 -- 1st version. + 2001 01-15 : Version 0.20 -- semi-public version. + 2001 01-16 : Version 0.30 -- 1st public version. + 2001 01-17 : Version 0.31 -- Fixed bassdrum problem. + : Version 0.32 -- LPF implemented. + 2001 01-18 : Version 0.33 -- Fixed the drum problem, refine the mix-down method. + -- Fixed the LFO bug. + 2001 01-24 : Version 0.35 -- Fixed the drum problem, + support undocumented EG behavior. + 2001 02-02 : Version 0.38 -- Improved the performance. + Fixed the hi-hat and cymbal model. + Fixed the default percussive datas. + Noise reduction. + Fixed the feedback problem. + 2001 03-03 : Version 0.39 -- Fixed some drum bugs. + Improved the performance. + 2001 03-04 : Version 0.40 -- Improved the feedback. + Change the default table size. + Clock and Rate can be changed during play. + 2001 06-24 : Version 0.50 -- Improved the hi-hat and the cymbal tone. + Added VRC7 patch (EMU2413_reset_patch is changed). + Fixed EMU2413_reset() bug. + Added EMU2413_setMask, EMU2413_getMask and EMU2413_toggleMask. + Added EMU2413_writeIO. + 2001 09-28 : Version 0.51 -- Removed the noise table. + 2002 01-28 : Version 0.52 -- Added Stereo mode. + 2002 02-07 : Version 0.53 -- Fixed some drum bugs. + 2002 02-20 : Version 0.54 -- Added the best quality mode. + 2002 03-02 : Version 0.55 -- Removed EMU2413_init & EMU2413_close. + 2002 05-30 : Version 0.60 -- Fixed HH&CYM generator and all voice datas. + 2004 04-10 : Version 0.61 -- Added YMF281B tone (defined by Chabin). + + References: + fmopl.c -- 1999,2000 written by Tatsuyuki Satoh (MAME development). + fmopl.c(fixed) -- (C) 2002 Jarek Burczynski. + s_opl.c -- 2001 written by Mamiya (NEZplug development). + fmgen.cpp -- 1999,2000 written by cisc. + fmpac.ill -- 2000 created by NARUTO. + MSX-Datapack + YMU757 data sheet + YM2143 data sheet + +**************************************************************************************/ + +#include +#include +#include + +#include "emu2413.h" + +#define EMU2413_TONE_NUM 1 +static unsigned char default_inst[EMU2413_TONE_NUM][(16 + 3) * 16] = { + { +#include "2413tone.h" + } +}; + +/* Size of Sintable ( 8 -- 18 can be used. 9 recommended.) */ +#define PG_BITS 9 +#define PG_WIDTH (1<>(b)) + +/* Leave the lower b bit(s). */ +#define LOWBITS(c,b) ((c)&((1<<(b))-1)) + +/* Expand x which is s bits to d bits. */ +#define EXPAND_BITS(x,s,d) ((x)<<((d)-(s))) + +/* Expand x which is s bits to d bits and fill expanded bits '1' */ +#define EXPAND_BITS_X(x,s,d) (((x)<<((d)-(s)))|((1<<((d)-(s)))-1)) + +#define MOD(o,x) (&(o)->slot[(x)<<1]) +#define CAR(o,x) (&(o)->slot[((x)<<1)|1]) + +#define BIT(s,b) (((s)>>(b))&1) + +/* Input clock */ +static uint32 clk = 844451141; + +/* WaveTable for each envelope amp */ +static uint32 fullsintable[PG_WIDTH]; +static uint32 halfsintable[PG_WIDTH]; + +static uint32 *waveform[2] = { fullsintable, halfsintable }; + +/* LFO Table */ +static int32 pmtable[PM_PG_WIDTH]; +static int32 amtable[AM_PG_WIDTH]; + +/* Phase delta for LFO */ +static uint32 pm_dphase; +static uint32 am_dphase; + +/* dB to Liner table */ +static int32 DB2LIN_TABLE[(DB_MUTE + DB_MUTE) * 2]; + +/* Liner to Log curve conversion table (for Attack rate). */ +static uint32 AR_ADJUST_TABLE[1 << EG_BITS]; + +/* Empty voice data */ +static EMU2413_PATCH null_patch = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +/* Basic voice Data */ +static EMU2413_PATCH default_patch[EMU2413_TONE_NUM][(16 + 3) * 2]; + +/* Definition of envelope mode */ +enum EMU2413_EG_STATE +{ READY, ATTACK, DECAY, SUSHOLD, SUSTINE, RELEASE, SETTLE, FINISH }; + +/* Phase incr table for Attack */ +static uint32 dphaseARTable[16][16]; +/* Phase incr table for Decay and Release */ +static uint32 dphaseDRTable[16][16]; + +/* KSL + TL Table */ +static uint32 tllTable[16][8][1 << TL_BITS][4]; +static int32 rksTable[2][8][2]; + +/* Phase incr table for PG */ +static uint32 dphaseTable[512][8][16]; + +/*************************************************** + + Create tables + +****************************************************/ +INLINE static int32 +Min (int32 i, int32 j) +{ + if (i < j) + return i; + else + return j; +} + +/* Table for AR to LogCurve. */ +static void +makeAdjustTable (void) +{ + int32 i; + + AR_ADJUST_TABLE[0] = (1 << EG_BITS) - 1; + for (i = 1; i < (1<= DB_MUTE) DB2LIN_TABLE[i] = 0; + DB2LIN_TABLE[i + DB_MUTE + DB_MUTE] = (int32) (-DB2LIN_TABLE[i]); + //printf("%d\n", DB2LIN_TABLE[i]); + } +} + +/* Liner(+0.0 - +1.0) to dB((1<> (20 - DP_BITS)); +} + +static void +makeTllTable (void) +{ +#define dB2(x) ((x)*2) + + static double kltable[16] = { + dB2 (0.000), dB2 (9.000), dB2 (12.000), dB2 (13.875), dB2 (15.000), dB2 (16.125), dB2 (16.875), dB2 (17.625), + dB2 (18.000), dB2 (18.750), dB2 (19.125), dB2 (19.500), dB2 (19.875), dB2 (20.250), dB2 (20.625), dB2 (21.000) + }; + + int32 tmp; + int32 fnum, block, TL, KL; + + for (fnum = 0; fnum < 16; fnum++) + for (block = 0; block < 8; block++) + for (TL = 0; TL < 64; TL++) + for (KL = 0; KL < 4; KL++) + { + if (KL == 0) + { + tllTable[fnum][block][TL][KL] = TL2EG (TL); + } + else + { + tmp = (int32) (kltable[fnum] - dB2 (3.000) * (7 - block)); + if (tmp <= 0) + tllTable[fnum][block][TL][KL] = TL2EG (TL); + else + tllTable[fnum][block][TL][KL] = (uint32) ((tmp >> (3 - KL)) / EG_STEP) + TL2EG (TL); + } + } +} + +#ifdef USE_SPEC_ENV_SPEED +static double attacktime[16][4] = { + {0, 0, 0, 0}, + {1730.15, 1400.60, 1153.43, 988.66}, + {865.08, 700.30, 576.72, 494.33}, + {432.54, 350.15, 288.36, 247.16}, + {216.27, 175.07, 144.18, 123.58}, + {108.13, 87.54, 72.09, 61.79}, + {54.07, 43.77, 36.04, 30.90}, + {27.03, 21.88, 18.02, 15.45}, + {13.52, 10.94, 9.01, 7.72}, + {6.76, 5.47, 4.51, 3.86}, + {3.38, 2.74, 2.25, 1.93}, + {1.69, 1.37, 1.13, 0.97}, + {0.84, 0.70, 0.60, 0.54}, + {0.50, 0.42, 0.34, 0.30}, + {0.28, 0.22, 0.18, 0.14}, + {0.00, 0.00, 0.00, 0.00} +}; + +static double decaytime[16][4] = { + {0, 0, 0, 0}, + {20926.60, 16807.20, 14006.00, 12028.60}, + {10463.30, 8403.58, 7002.98, 6014.32}, + {5231.64, 4201.79, 3501.49, 3007.16}, + {2615.82, 2100.89, 1750.75, 1503.58}, + {1307.91, 1050.45, 875.37, 751.79}, + {653.95, 525.22, 437.69, 375.90}, + {326.98, 262.61, 218.84, 187.95}, + {163.49, 131.31, 109.42, 93.97}, + {81.74, 65.65, 54.71, 46.99}, + {40.87, 32.83, 27.36, 23.49}, + {20.44, 16.41, 13.68, 11.75}, + {10.22, 8.21, 6.84, 5.87}, + {5.11, 4.10, 3.42, 2.94}, + {2.55, 2.05, 1.71, 1.47}, + {1.27, 1.27, 1.27, 1.27} +}; +#endif + +/* Rate Table for Attack */ +static void +makeDphaseARTable (void) +{ + int32 AR, Rks, RM, RL; + +#ifdef USE_SPEC_ENV_SPEED + uint32 attacktable[16][4]; + + for (RM = 0; RM < 16; RM++) + for (RL = 0; RL < 4; RL++) + { + if (RM == 0) + attacktable[RM][RL] = 0; + else if (RM == 15) + attacktable[RM][RL] = EG_DP_WIDTH; + else + attacktable[RM][RL] = (uint32) ((double) (1 << EG_DP_BITS) / (attacktime[RM][RL] * 3579545 / 72000)); + + } +#endif + + for (AR = 0; AR < 16; AR++) + for (Rks = 0; Rks < 16; Rks++) + { + RM = AR + (Rks >> 2); + RL = Rks & 3; + if (RM > 15) + RM = 15; + switch (AR) + { + case 0: + dphaseARTable[AR][Rks] = 0; + break; + case 15: + dphaseARTable[AR][Rks] = 0;/*EG_DP_WIDTH;*/ + break; + default: +#ifdef USE_SPEC_ENV_SPEED + dphaseARTable[AR][Rks] = (attacktable[RM][RL]); +#else + dphaseARTable[AR][Rks] = ((3 * (RL + 4) << (RM + 1))); +#endif + break; + } + } +} + +/* Rate Table for Decay and Release */ +static void +makeDphaseDRTable (void) +{ + int32 DR, Rks, RM, RL; + +#ifdef USE_SPEC_ENV_SPEED + uint32 decaytable[16][4]; + + for (RM = 0; RM < 16; RM++) + for (RL = 0; RL < 4; RL++) + if (RM == 0) + decaytable[RM][RL] = 0; + else + decaytable[RM][RL] = (uint32) ((double) (1 << EG_DP_BITS) / (decaytime[RM][RL] * 3579545 / 72000)); +#endif + + for (DR = 0; DR < 16; DR++) + for (Rks = 0; Rks < 16; Rks++) + { + RM = DR + (Rks >> 2); + RL = Rks & 3; + if (RM > 15) + RM = 15; + switch (DR) + { + case 0: + dphaseDRTable[DR][Rks] = 0; + break; + default: +#ifdef USE_SPEC_ENV_SPEED + dphaseDRTable[DR][Rks] = (decaytable[RM][RL]); +#else + dphaseDRTable[DR][Rks] = ((RL + 4) << (RM - 1)); +#endif + break; + } + } +} + +static void +makeRksTable (void) +{ + + int32 fnum8, block, KR; + + for (fnum8 = 0; fnum8 < 2; fnum8++) + for (block = 0; block < 8; block++) + for (KR = 0; KR < 2; KR++) + { + if (KR != 0) + rksTable[fnum8][block][KR] = (block << 1) + fnum8; + else + rksTable[fnum8][block][KR] = block >> 1; + } +} + +void +EMU2413_dump2patch (const uint8 * dump, EMU2413_PATCH * patch) +{ + patch[0].AM = (dump[0] >> 7) & 1; + patch[1].AM = (dump[1] >> 7) & 1; + patch[0].PM = (dump[0] >> 6) & 1; + patch[1].PM = (dump[1] >> 6) & 1; + patch[0].EG = (dump[0] >> 5) & 1; + patch[1].EG = (dump[1] >> 5) & 1; + patch[0].KR = (dump[0] >> 4) & 1; + patch[1].KR = (dump[1] >> 4) & 1; + patch[0].ML = (dump[0]) & 15; + patch[1].ML = (dump[1]) & 15; + patch[0].KL = (dump[2] >> 6) & 3; + patch[1].KL = (dump[3] >> 6) & 3; + patch[0].TL = (dump[2]) & 63; + patch[0].FB = (dump[3]) & 7; + patch[0].WF = (dump[3] >> 3) & 1; + patch[1].WF = (dump[3] >> 4) & 1; + patch[0].AR = (dump[4] >> 4) & 15; + patch[1].AR = (dump[5] >> 4) & 15; + patch[0].DR = (dump[4]) & 15; + patch[1].DR = (dump[5]) & 15; + patch[0].SL = (dump[6] >> 4) & 15; + patch[1].SL = (dump[7] >> 4) & 15; + patch[0].RR = (dump[6]) & 15; + patch[1].RR = (dump[7]) & 15; +} + +void +EMU2413_getDefaultPatch (int32 type, int32 num, EMU2413_PATCH * patch) +{ + EMU2413_dump2patch (default_inst[type] + num * 16, patch); +} + +static void +makeDefaultPatch () +{ + int32 i, j; + + for (i = 0; i < EMU2413_TONE_NUM; i++) + for (j = 0; j < 19; j++) + EMU2413_getDefaultPatch (i, j, &default_patch[i][j * 2]); + +} + +void +EMU2413_setPatch (EMU2413 * opll, const uint8 * dump) +{ + EMU2413_PATCH patch[2]; + int i; + + for (i = 0; i < 19; i++) + { + EMU2413_dump2patch (dump + i * 16, patch); + memcpy (&opll->patch[i*2+0], &patch[0], sizeof (EMU2413_PATCH)); + memcpy (&opll->patch[i*2+1], &patch[1], sizeof (EMU2413_PATCH)); + } +} + +void +EMU2413_patch2dump (const EMU2413_PATCH * patch, uint8 * dump) +{ + dump[0] = (uint8) ((patch[0].AM << 7) + (patch[0].PM << 6) + (patch[0].EG << 5) + (patch[0].KR << 4) + patch[0].ML); + dump[1] = (uint8) ((patch[1].AM << 7) + (patch[1].PM << 6) + (patch[1].EG << 5) + (patch[1].KR << 4) + patch[1].ML); + dump[2] = (uint8) ((patch[0].KL << 6) + patch[0].TL); + dump[3] = (uint8) ((patch[1].KL << 6) + (patch[1].WF << 4) + (patch[0].WF << 3) + patch[0].FB); + dump[4] = (uint8) ((patch[0].AR << 4) + patch[0].DR); + dump[5] = (uint8) ((patch[1].AR << 4) + patch[1].DR); + dump[6] = (uint8) ((patch[0].SL << 4) + patch[0].RR); + dump[7] = (uint8) ((patch[1].SL << 4) + patch[1].RR); + dump[8] = 0; + dump[9] = 0; + dump[10] = 0; + dump[11] = 0; + dump[12] = 0; + dump[13] = 0; + dump[14] = 0; + dump[15] = 0; +} + +/************************************************************ + + Calc Parameters + +************************************************************/ + +INLINE static uint32 +calc_eg_dphase (EMU2413_SLOT * slot) +{ + + switch (slot->eg_mode) + { + case ATTACK: + return dphaseARTable[slot->patch->AR][slot->rks]; + + case DECAY: + return dphaseDRTable[slot->patch->DR][slot->rks]; + + case SUSHOLD: + return 0; + + case SUSTINE: + return dphaseDRTable[slot->patch->RR][slot->rks]; + + case RELEASE: + if (slot->sustine) + return dphaseDRTable[5][slot->rks]; + else if (slot->patch->EG) + return dphaseDRTable[slot->patch->RR][slot->rks]; + else + return dphaseDRTable[7][slot->rks]; + + case SETTLE: + return dphaseDRTable[15][0]; + + case FINISH: + return 0; + + default: + return 0; + } +} + +/************************************************************* + + EMU2413 internal interfaces + +*************************************************************/ +#define SLOT_BD1 12 +#define SLOT_BD2 13 +#define SLOT_HH 14 +#define SLOT_SD 15 +#define SLOT_TOM 16 +#define SLOT_CYM 17 + +#define UPDATE_PG(S) (S)->dphase = dphaseTable[(S)->fnum][(S)->block][(S)->patch->ML] +#define UPDATE_TLL(S)\ +(((S)->type==0)?\ +((S)->tll = tllTable[((S)->fnum)>>5][(S)->block][(S)->patch->TL][(S)->patch->KL]):\ +((S)->tll = tllTable[((S)->fnum)>>5][(S)->block][(S)->volume][(S)->patch->KL])) +#define UPDATE_RKS(S) (S)->rks = rksTable[((S)->fnum)>>8][(S)->block][(S)->patch->KR] +#define UPDATE_WF(S) (S)->sintbl = waveform[(S)->patch->WF] +#define UPDATE_EG(S) (S)->eg_dphase = calc_eg_dphase(S) +#define UPDATE_ALL(S)\ + UPDATE_PG(S);\ + UPDATE_TLL(S);\ + UPDATE_RKS(S);\ + UPDATE_WF(S); \ + UPDATE_EG(S) /* EG should be updated last. */ + + +/* Slot key on */ +INLINE static void +slotOn (EMU2413_SLOT * slot) +{ + slot->eg_mode = ATTACK; + slot->eg_phase = 0; + slot->phase = 0; + UPDATE_EG(slot); +} + +/* Slot key on without reseting the phase */ +INLINE static void +slotOn2 (EMU2413_SLOT * slot) +{ + slot->eg_mode = ATTACK; + slot->eg_phase = 0; + UPDATE_EG(slot); +} + +/* Slot key off */ +INLINE static void +slotOff (EMU2413_SLOT * slot) +{ + if (slot->eg_mode == ATTACK) + slot->eg_phase = EXPAND_BITS (AR_ADJUST_TABLE[HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS)], EG_BITS, EG_DP_BITS); + slot->eg_mode = RELEASE; + UPDATE_EG(slot); +} + +/* Channel key on */ +INLINE static void +keyOn (EMU2413 * opll, int32 i) +{ + if (!opll->slot_on_flag[i * 2]) + slotOn (MOD(opll,i)); + if (!opll->slot_on_flag[i * 2 + 1]) + slotOn (CAR(opll,i)); + opll->key_status[i] = 1; +} + +/* Channel key off */ +INLINE static void +keyOff (EMU2413 * opll, int32 i) +{ + if (opll->slot_on_flag[i * 2 + 1]) + slotOff (CAR(opll,i)); + opll->key_status[i] = 0; +} + +INLINE static void +keyOn_BD (EMU2413 * opll) +{ + keyOn (opll, 6); +} +INLINE static void +keyOn_SD (EMU2413 * opll) +{ + if (!opll->slot_on_flag[SLOT_SD]) + slotOn (CAR(opll,7)); +} +INLINE static void +keyOn_TOM (EMU2413 * opll) +{ + if (!opll->slot_on_flag[SLOT_TOM]) + slotOn (MOD(opll,8)); +} +INLINE static void +keyOn_HH (EMU2413 * opll) +{ + if (!opll->slot_on_flag[SLOT_HH]) + slotOn2 (MOD(opll,7)); +} +INLINE static void +keyOn_CYM (EMU2413 * opll) +{ + if (!opll->slot_on_flag[SLOT_CYM]) { + slotOn2 (CAR(opll,8)); + } +} + +/* Drum key off */ +INLINE static void +keyOff_BD (EMU2413 * opll) +{ + keyOff (opll, 6); +} +INLINE static void +keyOff_SD (EMU2413 * opll) +{ + if (opll->slot_on_flag[SLOT_SD]) + slotOff (CAR(opll,7)); +} +INLINE static void +keyOff_TOM (EMU2413 * opll) +{ + if (opll->slot_on_flag[SLOT_TOM]) + slotOff (MOD(opll,8)); +} +INLINE static void +keyOff_HH (EMU2413 * opll) +{ + if (opll->slot_on_flag[SLOT_HH]) + slotOff (MOD(opll,7)); +} +INLINE static void +keyOff_CYM (EMU2413 * opll) +{ + if (opll->slot_on_flag[SLOT_CYM]) { + CAR(opll,8)->sustine = 1; + slotOff (CAR(opll,8)); + } +} + +/* Change a voice */ +INLINE static void +setPatch (EMU2413 * opll, int32 i, int32 num) +{ + opll->patch_number[i] = num; + MOD(opll,i)->patch = &opll->patch[num * 2 + 0]; + CAR(opll,i)->patch = &opll->patch[num * 2 + 1]; +} + +/* Change a rhythm voice */ +INLINE static void +setSlotPatch (EMU2413_SLOT * slot, EMU2413_PATCH * patch) +{ + slot->patch = patch; +} + +/* Set sustine parameter */ +INLINE static void +setSustine (EMU2413 * opll, int32 c, int32 sustine) +{ + CAR(opll,c)->sustine = sustine; + if (MOD(opll,c)->type) + MOD(opll,c)->sustine = sustine; +} + +/* Volume : 6bit ( Volume register << 2 ) */ +INLINE static void +setVolume (EMU2413 * opll, int32 c, int32 volume) +{ + CAR(opll,c)->volume = volume; +} + +INLINE static void +setSlotVolume (EMU2413_SLOT * slot, int32 volume) +{ + slot->volume = volume; +} + +/* Set F-Number ( fnum : 9bit ) */ +INLINE static void +setFnumber (EMU2413 * opll, int32 c, int32 fnum) +{ + CAR(opll,c)->fnum = fnum; + MOD(opll,c)->fnum = fnum; +} + +/* Set Block data (block : 3bit ) */ +INLINE static void +setBlock (EMU2413 * opll, int32 c, int32 block) +{ + CAR(opll,c)->block = block; + MOD(opll,c)->block = block; +} + +/* Change Rhythm Mode */ +INLINE static void +update_rhythm_mode (EMU2413 * opll) +{ + if (opll->patch_number[6] & 0x10) + { + if (!(opll->slot_on_flag[SLOT_BD2] | (opll->reg[0x0e] & 32))) + { + opll->slot[SLOT_BD1].eg_mode = FINISH; + opll->slot[SLOT_BD2].eg_mode = FINISH; + setPatch (opll, 6, opll->reg[0x36] >> 4); + } + } + else if (opll->reg[0x0e] & 32) + { + opll->patch_number[6] = 16; + opll->slot[SLOT_BD1].eg_mode = FINISH; + opll->slot[SLOT_BD2].eg_mode = FINISH; + setSlotPatch (&opll->slot[SLOT_BD1], &opll->patch[16 * 2 + 0]); + setSlotPatch (&opll->slot[SLOT_BD2], &opll->patch[16 * 2 + 1]); + } + + if (opll->patch_number[7] & 0x10) + { + if (!((opll->slot_on_flag[SLOT_HH] && opll->slot_on_flag[SLOT_SD]) | (opll->reg[0x0e] & 32))) + { + opll->slot[SLOT_HH].type = 0; + opll->slot[SLOT_HH].eg_mode = FINISH; + opll->slot[SLOT_SD].eg_mode = FINISH; + setPatch (opll, 7, opll->reg[0x37] >> 4); + } + } + else if (opll->reg[0x0e] & 32) + { + opll->patch_number[7] = 17; + opll->slot[SLOT_HH].type = 1; + opll->slot[SLOT_HH].eg_mode = FINISH; + opll->slot[SLOT_SD].eg_mode = FINISH; + setSlotPatch (&opll->slot[SLOT_HH], &opll->patch[17 * 2 + 0]); + setSlotPatch (&opll->slot[SLOT_SD], &opll->patch[17 * 2 + 1]); + } + + if (opll->patch_number[8] & 0x10) + { + if (!((opll->slot_on_flag[SLOT_CYM] && opll->slot_on_flag[SLOT_TOM]) | (opll->reg[0x0e] & 32))) + { + opll->slot[SLOT_TOM].type = 0; + opll->slot[SLOT_TOM].eg_mode = FINISH; + opll->slot[SLOT_CYM].eg_mode = FINISH; + setPatch (opll, 8, opll->reg[0x38] >> 4); + } + } + else if (opll->reg[0x0e] & 32) + { + opll->patch_number[8] = 18; + opll->slot[SLOT_TOM].type = 1; + opll->slot[SLOT_TOM].eg_mode = FINISH; + opll->slot[SLOT_CYM].eg_mode = FINISH; + setSlotPatch (&opll->slot[SLOT_TOM], &opll->patch[18 * 2 + 0]); + setSlotPatch (&opll->slot[SLOT_CYM], &opll->patch[18 * 2 + 1]); + } +} + +INLINE static void +update_key_status (EMU2413 * opll) +{ + int ch; + + for (ch = 0; ch < 9; ch++) + opll->slot_on_flag[ch * 2] = opll->slot_on_flag[ch * 2 + 1] = (opll->reg[0x20 + ch]) & 0x10; + + if (opll->reg[0x0e] & 32) + { + opll->slot_on_flag[SLOT_BD1] |= (opll->reg[0x0e] & 0x10); + opll->slot_on_flag[SLOT_BD2] |= (opll->reg[0x0e] & 0x10); + opll->slot_on_flag[SLOT_SD] |= (opll->reg[0x0e] & 0x08); + opll->slot_on_flag[SLOT_HH] |= (opll->reg[0x0e] & 0x01); + opll->slot_on_flag[SLOT_TOM] |= (opll->reg[0x0e] & 0x04); + opll->slot_on_flag[SLOT_CYM] |= (opll->reg[0x0e] & 0x02); + } +} + +void +EMU2413_copyPatch (EMU2413 * opll, int32 num, EMU2413_PATCH * patch) +{ + memcpy (&opll->patch[num], patch, sizeof (EMU2413_PATCH)); +} + +/*********************************************************** + + Initializing + +***********************************************************/ + +static void +EMU2413_SLOT_reset (EMU2413_SLOT * slot, int type) +{ + slot->type = type; + slot->sintbl = waveform[0]; + slot->phase = 0; + slot->dphase = 0; + slot->output[0] = 0; + slot->output[1] = 0; + slot->feedback = 0; + slot->eg_mode = FINISH; + slot->eg_phase = EG_DP_WIDTH; + slot->eg_dphase = 0; + slot->rks = 0; + slot->tll = 0; + slot->sustine = 0; + slot->fnum = 0; + slot->block = 0; + slot->volume = 0; + slot->pgout = 0; + slot->egout = 0; + slot->patch = &null_patch; +} + +static void +internal_refresh (void) +{ + makeDphaseTable (); + makeDphaseARTable (); + makeDphaseDRTable (); + pm_dphase = (uint32) (PM_SPEED * PM_DP_WIDTH / (clk / 72)); + am_dphase = (uint32) (AM_SPEED * AM_DP_WIDTH / (clk / 72)); +} + +static void maketables (uint32 c) +{ + if (c != clk) + { + clk = c; + makePmTable (); + makeAmTable (); + makeDB2LinTable (); + makeAdjustTable (); + makeTllTable (); + makeRksTable (); + makeSinTable (); + makeDefaultPatch (); + } + internal_refresh (); +} + +EMU2413 *EMU2413_new (uint32 new_clk) +{ + EMU2413 *opll; + int32 i; + + maketables (new_clk); + + opll = (EMU2413 *) calloc (sizeof (EMU2413), 1); + if (opll == NULL) + return NULL; + + for (i = 0; i < 19 * 2; i++) + memcpy(&opll->patch[i],&null_patch,sizeof(EMU2413_PATCH)); + + opll->mask = 0; + + EMU2413_reset (opll); + EMU2413_reset_patch (opll, 0); + + return opll; +} + + +void +EMU2413_delete (EMU2413 * opll) +{ + free (opll); +} + + +/* Reset patch datas by system default. */ +void +EMU2413_reset_patch (EMU2413 * opll, int32 type) +{ + int32 i; + + for (i = 0; i < 19 * 2; i++) + EMU2413_copyPatch (opll, i, &default_patch[type % EMU2413_TONE_NUM][i]); +} + +/* Reset whole of EMU2413 except patch datas. */ +void +EMU2413_reset (EMU2413 * opll) +{ + int32 i; + + if (!opll) + return; + + opll->adr = 0; + opll->out = 0; + + opll->pm_phase = 0; + opll->am_phase = 0; + + opll->noise_seed = 0xffff; + opll->mask = 0; + + for (i = 0; i <18; i++) + EMU2413_SLOT_reset(&opll->slot[i], i%2); + + for (i = 0; i < 9; i++) + { + opll->key_status[i] = 0; + setPatch (opll, i, 0); + } + + for (i = 0; i < 0x40; i++) + EMU2413_writeReg (opll, i, 0); +} + +/* Force Refresh (When external program changes some parameters). */ +void EMU2413_forceRefresh (EMU2413 * opll) +{ + int32 i; + + if (opll == NULL) + return; + + for (i = 0; i < 9; i++) + setPatch(opll,i,opll->patch_number[i]); + + for (i = 0; i < 18; i++) + { + UPDATE_PG (&opll->slot[i]); + UPDATE_RKS (&opll->slot[i]); + UPDATE_TLL (&opll->slot[i]); + UPDATE_WF (&opll->slot[i]); + UPDATE_EG (&opll->slot[i]); + } +} + +/********************************************************* + + Generate wave data + +*********************************************************/ +/* Convert Amp(0 to EG_HEIGHT) to Phase(0 to 2PI). */ +#if ( SLOT_AMP_BITS - PG_BITS ) > 0 +#define wave2_2pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS )) +#else +#define wave2_2pi(e) ( (e) << ( PG_BITS - SLOT_AMP_BITS )) +#endif + +/* Convert Amp(0 to EG_HEIGHT) to Phase(0 to 4PI). */ +#if ( SLOT_AMP_BITS - PG_BITS - 1 ) == 0 +#define wave2_4pi(e) (e) +#elif ( SLOT_AMP_BITS - PG_BITS - 1 ) > 0 +#define wave2_4pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS - 1 )) +#else +#define wave2_4pi(e) ( (e) << ( 1 + PG_BITS - SLOT_AMP_BITS )) +#endif + +/* Convert Amp(0 to EG_HEIGHT) to Phase(0 to 8PI). */ +#if ( SLOT_AMP_BITS - PG_BITS - 2 ) == 0 +#define wave2_8pi(e) (e) +#elif ( SLOT_AMP_BITS - PG_BITS - 2 ) > 0 +#define wave2_8pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS - 2 )) +#else +#define wave2_8pi(e) ( (e) << ( 2 + PG_BITS - SLOT_AMP_BITS )) +#endif + +/* Update AM, PM unit */ +static void +update_ampm (EMU2413 * opll) +{ + opll->pm_phase = (opll->pm_phase + pm_dphase) & (PM_DP_WIDTH - 1); + opll->am_phase = (opll->am_phase + am_dphase) & (AM_DP_WIDTH - 1); + opll->lfo_am = amtable[HIGHBITS (opll->am_phase, AM_DP_BITS - AM_PG_BITS)]; + opll->lfo_pm = pmtable[HIGHBITS (opll->pm_phase, PM_DP_BITS - PM_PG_BITS)]; +} + +/* PG */ +INLINE static void calc_phase (EMU2413_SLOT * slot, int32 lfo) +{ + if (slot->patch->PM) + slot->phase += (slot->dphase * lfo) >> PM_AMP_BITS; + else + slot->phase += slot->dphase; + + slot->phase &= (DP_WIDTH - 1); + + slot->pgout = HIGHBITS (slot->phase, DP_BASE_BITS); +} + +/* Update Noise unit */ +static void +update_noise (EMU2413 * opll) +{ + if(opll->noise_seed&1) opll->noise_seed ^= 0x8003020; + opll->noise_seed >>= 1; +} + +/* EG */ +static void +calc_envelope (EMU2413_SLOT * slot, int32 lfo) +{ +#define S2E(x) (SL2EG((int32)(x/SL_STEP))<<(EG_DP_BITS-EG_BITS)) + + static uint32 SL[16] = { + S2E (0.0), S2E (3.0), S2E (6.0), S2E (9.0), S2E (12.0), S2E (15.0), S2E (18.0), S2E (21.0), + S2E (24.0), S2E (27.0), S2E (30.0), S2E (33.0), S2E (36.0), S2E (39.0), S2E (42.0), S2E (48.0) + }; + + uint32 egout; + + switch (slot->eg_mode) + { + case ATTACK: + egout = AR_ADJUST_TABLE[HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS)]; + slot->eg_phase += slot->eg_dphase; + if((EG_DP_WIDTH & slot->eg_phase)||(slot->patch->AR==15)) + { + egout = 0; + slot->eg_phase = 0; + slot->eg_mode = DECAY; + UPDATE_EG (slot); + } + break; + + case DECAY: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + slot->eg_phase += slot->eg_dphase; + if (slot->eg_phase >= SL[slot->patch->SL]) + { + if (slot->patch->EG) + { + slot->eg_phase = SL[slot->patch->SL]; + slot->eg_mode = SUSHOLD; + UPDATE_EG (slot); + } + else + { + slot->eg_phase = SL[slot->patch->SL]; + slot->eg_mode = SUSTINE; + UPDATE_EG (slot); + } + } + break; + + case SUSHOLD: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + if (slot->patch->EG == 0) + { + slot->eg_mode = SUSTINE; + UPDATE_EG (slot); + } + break; + + case SUSTINE: + case RELEASE: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + slot->eg_phase += slot->eg_dphase; + if (egout >= (1 << EG_BITS)) + { + slot->eg_mode = FINISH; + egout = (1 << EG_BITS) - 1; + } + break; + + case SETTLE: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + slot->eg_phase += slot->eg_dphase; + if (egout >= (1 << EG_BITS)) + { + slot->eg_mode = ATTACK; + egout = (1 << EG_BITS) - 1; + UPDATE_EG(slot); + } + break; + + case FINISH: + egout = (1 << EG_BITS) - 1; + break; + + default: + egout = (1 << EG_BITS) - 1; + break; + } + + if (slot->patch->AM) + egout = EG2DB (egout + slot->tll) + lfo; + else + egout = EG2DB (egout + slot->tll); + + if (egout >= DB_MUTE) + egout = DB_MUTE - 1; + + slot->egout = egout | 3; +} + +/* CARRIOR */ +INLINE static int32 calc_slot_car (EMU2413_SLOT * slot, int32 fm) +{ + if (slot->egout >= (DB_MUTE - 1)) + { + slot->output[0] = 0; + } + else + { + slot->output[0] = DB2LIN_TABLE[slot->sintbl[(slot->pgout+wave2_8pi(fm))&(PG_WIDTH-1)] + slot->egout]; + } + + slot->output[1] = (slot->output[1] + slot->output[0]) >> 1; + return slot->output[1]; +} + +/* MODULATOR */ +INLINE static int32 calc_slot_mod (EMU2413_SLOT * slot) +{ + int32 fm; + + slot->output[1] = slot->output[0]; + + if (slot->egout >= (DB_MUTE - 1)) + { + slot->output[0] = 0; + } + else if (slot->patch->FB != 0) + { + fm = wave2_4pi (slot->feedback) >> (7 - slot->patch->FB); + slot->output[0] = DB2LIN_TABLE[slot->sintbl[(slot->pgout+fm)&(PG_WIDTH-1)] + slot->egout]; + } + else + { + slot->output[0] = DB2LIN_TABLE[slot->sintbl[slot->pgout] + slot->egout]; + } + + slot->feedback = (slot->output[1] + slot->output[0]) >> 1; + + return slot->feedback; + +} + +/* TOM */ +INLINE static int32 calc_slot_tom (EMU2413_SLOT * slot) +{ + if (slot->egout >= (DB_MUTE - 1)) + return 0; + + return DB2LIN_TABLE[slot->sintbl[slot->pgout] + slot->egout]; + +} + +/* SNARE */ +INLINE static int32 calc_slot_snare (EMU2413_SLOT * slot, uint32 noise) +{ + if(slot->egout>=(DB_MUTE-1)) + return 0; + + if(BIT(slot->pgout,7)) + return DB2LIN_TABLE[(noise?DB_POS(0.0):DB_POS(15.0))+slot->egout]; + else + return DB2LIN_TABLE[(noise?DB_NEG(0.0):DB_NEG(15.0))+slot->egout]; +} + +/* + TOP-CYM + */ +INLINE static int32 calc_slot_cym (EMU2413_SLOT * slot, uint32 pgout_hh) +{ + uint32 dbout; + + if (slot->egout >= (DB_MUTE - 1)) + return 0; + else if( + /* the same as fmopl.c */ + ((BIT(pgout_hh,PG_BITS-8)^BIT(pgout_hh,PG_BITS-1))|BIT(pgout_hh,PG_BITS-7)) ^ + /* different from fmopl.c */ + (BIT(slot->pgout,PG_BITS-7)&!BIT(slot->pgout,PG_BITS-5)) + ) + dbout = DB_NEG(3.0); + else + dbout = DB_POS(3.0); + + return DB2LIN_TABLE[dbout + slot->egout]; +} + +/* + HI-HAT +*/ +INLINE static int32 calc_slot_hat (EMU2413_SLOT *slot, int32 pgout_cym, uint32 noise) +{ + uint32 dbout; + + if (slot->egout >= (DB_MUTE - 1)) + return 0; + else if( + /* the same as fmopl.c */ + ((BIT(slot->pgout,PG_BITS-8)^BIT(slot->pgout,PG_BITS-1))|BIT(slot->pgout,PG_BITS-7)) ^ + /* different from fmopl.c */ + (BIT(pgout_cym,PG_BITS-7)&!BIT(pgout_cym,PG_BITS-5)) + ) + { + if(noise) + dbout = DB_NEG(12.0); + else + dbout = DB_NEG(24.0); + } + else + { + if(noise) + dbout = DB_POS(12.0); + else + dbout = DB_POS(24.0); + } + + return DB2LIN_TABLE[dbout + slot->egout]; +} + +static int32 calc (EMU2413 * opll) +{ + int32 inst = 0, perc = 0, out = 0; + int32 i; + + update_ampm (opll); + update_noise (opll); + + for (i = 0; i < 18; i++) + { + calc_phase(&opll->slot[i],opll->lfo_pm); + calc_envelope(&opll->slot[i],opll->lfo_am); + } + + for (i = 0; i < 6; i++) + if (!(opll->mask & EMU2413_MASK_CH (i)) && (CAR(opll,i)->eg_mode != FINISH)) + inst += calc_slot_car (CAR(opll,i), calc_slot_mod(MOD(opll,i))); + + /* CH6 */ + if (opll->patch_number[6] <= 15) + { + if (!(opll->mask & EMU2413_MASK_CH (6)) && (CAR(opll,6)->eg_mode != FINISH)) + inst += calc_slot_car (CAR(opll,6), calc_slot_mod(MOD(opll,6))); + } + else + { + if (!(opll->mask & EMU2413_MASK_BD) && (CAR(opll,6)->eg_mode != FINISH)) + perc += calc_slot_car (CAR(opll,6), calc_slot_mod(MOD(opll,6))); + } + + /* CH7 */ + if (opll->patch_number[7] <= 15) + { + if (!(opll->mask & EMU2413_MASK_CH (7)) && (CAR(opll,7)->eg_mode != FINISH)) + inst += calc_slot_car (CAR(opll,7), calc_slot_mod(MOD(opll,7))); + } + else + { + if (!(opll->mask & EMU2413_MASK_HH) && (MOD(opll,7)->eg_mode != FINISH)) + perc += calc_slot_hat (MOD(opll,7), CAR(opll,8)->pgout, opll->noise_seed&1); + if (!(opll->mask & EMU2413_MASK_SD) && (CAR(opll,7)->eg_mode != FINISH)) + perc -= calc_slot_snare (CAR(opll,7), opll->noise_seed&1); + } + + /* CH8 */ + if (opll->patch_number[8] <= 15) + { + if (!(opll->mask & EMU2413_MASK_CH(8)) && (CAR(opll,8)->eg_mode != FINISH)) + inst += calc_slot_car (CAR(opll,8), calc_slot_mod (MOD(opll,8))); + } + else + { + if (!(opll->mask & EMU2413_MASK_TOM) && (MOD(opll,8)->eg_mode != FINISH)) + perc += calc_slot_tom (MOD(opll,8)); + if (!(opll->mask & EMU2413_MASK_CYM) && (CAR(opll,8)->eg_mode != FINISH)) + perc -= calc_slot_cym (CAR(opll,8), MOD(opll,7)->pgout); + } + + out = inst + (perc << 1); + return (int32) out; +} + +int32 EMU2413_calc (EMU2413 * opll) +{ + return calc (opll); +} + +uint32 EMU2413_setMask (EMU2413 * opll, uint32 mask) +{ + uint32 ret; + + if (opll) + { + ret = opll->mask; + opll->mask = mask; + return ret; + } + else + return 0; +} + +uint32 EMU2413_toggleMask (EMU2413 * opll, uint32 mask) +{ + uint32 ret; + + if (opll) + { + ret = opll->mask; + opll->mask ^= mask; + return ret; + } + else + return 0; +} + +/**************************************************** + + I/O Ctrl + +*****************************************************/ + +void EMU2413_writeReg (EMU2413 * opll, uint32 reg, uint32 data) +{ + + int32 i, v, ch; + + data = data & 0xff; + reg = reg & 0x3f; + opll->reg[reg] = (uint8) data; + + switch (reg) + { + case 0x00: + opll->patch[0].AM = (data >> 7) & 1; + opll->patch[0].PM = (data >> 6) & 1; + opll->patch[0].EG = (data >> 5) & 1; + opll->patch[0].KR = (data >> 4) & 1; + opll->patch[0].ML = (data) & 15; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_PG (MOD(opll,i)); + UPDATE_RKS (MOD(opll,i)); + UPDATE_EG (MOD(opll,i)); + } + } + break; + + case 0x01: + opll->patch[1].AM = (data >> 7) & 1; + opll->patch[1].PM = (data >> 6) & 1; + opll->patch[1].EG = (data >> 5) & 1; + opll->patch[1].KR = (data >> 4) & 1; + opll->patch[1].ML = (data) & 15; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_PG (CAR(opll,i)); + UPDATE_RKS (CAR(opll,i)); + UPDATE_EG (CAR(opll,i)); + } + } + break; + + case 0x02: + opll->patch[0].KL = (data >> 6) & 3; + opll->patch[0].TL = (data) & 63; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_TLL(MOD(opll,i)); + } + } + break; + + case 0x03: + opll->patch[1].KL = (data >> 6) & 3; + opll->patch[1].WF = (data >> 4) & 1; + opll->patch[0].WF = (data >> 3) & 1; + opll->patch[0].FB = (data) & 7; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_WF(MOD(opll,i)); + UPDATE_WF(CAR(opll,i)); + } + } + break; + + case 0x04: + opll->patch[0].AR = (data >> 4) & 15; + opll->patch[0].DR = (data) & 15; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_EG (MOD(opll,i)); + } + } + break; + + case 0x05: + opll->patch[1].AR = (data >> 4) & 15; + opll->patch[1].DR = (data) & 15; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_EG(CAR(opll,i)); + } + } + break; + + case 0x06: + opll->patch[0].SL = (data >> 4) & 15; + opll->patch[0].RR = (data) & 15; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_EG (MOD(opll,i)); + } + } + break; + + case 0x07: + opll->patch[1].SL = (data >> 4) & 15; + opll->patch[1].RR = (data) & 15; + for (i = 0; i < 9; i++) + { + if (opll->patch_number[i] == 0) + { + UPDATE_EG (CAR(opll,i)); + } + } + break; + + case 0x0e: + update_rhythm_mode (opll); + if (data & 32) + { + if (data & 0x10) + keyOn_BD (opll); + else + keyOff_BD (opll); + if (data & 0x8) + keyOn_SD (opll); + else + keyOff_SD (opll); + if (data & 0x4) + keyOn_TOM (opll); + else + keyOff_TOM (opll); + if (data & 0x2) + keyOn_CYM (opll); + else + keyOff_CYM (opll); + if (data & 0x1) + keyOn_HH (opll); + else + keyOff_HH (opll); + } + update_key_status (opll); + + UPDATE_ALL (MOD(opll,6)); + UPDATE_ALL (CAR(opll,6)); + UPDATE_ALL (MOD(opll,7)); + UPDATE_ALL (CAR(opll,7)); + UPDATE_ALL (MOD(opll,8)); + UPDATE_ALL (CAR(opll,8)); + + break; + + case 0x0f: + break; + + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + ch = reg - 0x10; + setFnumber (opll, ch, data + ((opll->reg[0x20 + ch] & 1) << 8)); + UPDATE_ALL (MOD(opll,ch)); + UPDATE_ALL (CAR(opll,ch)); + break; + + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + case 0x26: + case 0x27: + case 0x28: + ch = reg - 0x20; + setFnumber (opll, ch, ((data & 1) << 8) + opll->reg[0x10 + ch]); + setBlock (opll, ch, (data >> 1) & 7); + setSustine (opll, ch, (data >> 5) & 1); + if (data & 0x10) + keyOn (opll, ch); + else + keyOff (opll, ch); + UPDATE_ALL (MOD(opll,ch)); + UPDATE_ALL (CAR(opll,ch)); + update_key_status (opll); + update_rhythm_mode (opll); + break; + + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + i = (data >> 4) & 15; + v = data & 15; + if ((opll->reg[0x0e] & 32) && (reg >= 0x36)) + { + switch (reg) + { + case 0x37: + setSlotVolume (MOD(opll,7), i << 2); + break; + case 0x38: + setSlotVolume (MOD(opll,8), i << 2); + break; + default: + break; + } + } + else + { + setPatch (opll, reg - 0x30, i); + } + setVolume (opll, reg - 0x30, v << 2); + UPDATE_ALL (MOD(opll,reg - 0x30)); + UPDATE_ALL (CAR(opll,reg - 0x30)); + break; + + default: + break; + + } +} + +void EMU2413_writeIO (EMU2413 * opll, uint32 adr, uint32 val) +{ + if (adr & 1) + EMU2413_writeReg (opll, opll->adr, val); + else + opll->adr = val; +} + +#ifndef EMU2413_COMPACTION +/* STEREO MODE (OPT) */ +void EMU2413_set_pan (EMU2413 * opll, uint32 ch, uint32 pan) +{ + opll->pan[ch & 15] = pan & 3; +} + +static void calc_stereo (EMU2413 * opll, int32 out[2]) +{ + int32 b[4] = { 0, 0, 0, 0 }; /* Ignore, Right, Left, Center */ + int32 r[4] = { 0, 0, 0, 0 }; /* Ignore, Right, Left, Center */ + int32 i; + + update_ampm (opll); + update_noise (opll); + + for(i=0;i<18;i++) + { + calc_phase(&opll->slot[i],opll->lfo_pm); + calc_envelope(&opll->slot[i],opll->lfo_am); + } + + for (i = 0; i < 6; i++) + if (!(opll->mask & EMU2413_MASK_CH (i)) && (CAR(opll,i)->eg_mode != FINISH)) + b[opll->pan[i]] += calc_slot_car (CAR(opll,i), calc_slot_mod (MOD(opll,i))); + + + if (opll->patch_number[6] <= 15) + { + if (!(opll->mask & EMU2413_MASK_CH (6)) && (CAR(opll,6)->eg_mode != FINISH)) + b[opll->pan[6]] += calc_slot_car (CAR(opll,6), calc_slot_mod (MOD(opll,6))); + } + else + { + if (!(opll->mask & EMU2413_MASK_BD) && (CAR(opll,6)->eg_mode != FINISH)) + r[opll->pan[9]] += calc_slot_car (CAR(opll,6), calc_slot_mod (MOD(opll,6))); + } + + if (opll->patch_number[7] <= 15) + { + if (!(opll->mask & EMU2413_MASK_CH (7)) && (CAR (opll,7)->eg_mode != FINISH)) + b[opll->pan[7]] += calc_slot_car (CAR (opll,7), calc_slot_mod (MOD (opll,7))); + } + else + { + if (!(opll->mask & EMU2413_MASK_HH) && (MOD (opll,7)->eg_mode != FINISH)) + r[opll->pan[10]] += calc_slot_hat (MOD (opll,7), CAR(opll,8)->pgout, opll->noise_seed&1); + if (!(opll->mask & EMU2413_MASK_SD) && (CAR (opll,7)->eg_mode != FINISH)) + r[opll->pan[11]] -= calc_slot_snare (CAR (opll,7), opll->noise_seed&1); + } + + if (opll->patch_number[8] <= 15) + { + if (!(opll->mask & EMU2413_MASK_CH (8)) && (CAR (opll,8)->eg_mode != FINISH)) + b[opll->pan[8]] += calc_slot_car (CAR (opll,8), calc_slot_mod (MOD (opll,8))); + } + else + { + if (!(opll->mask & EMU2413_MASK_TOM) && (MOD (opll,8)->eg_mode != FINISH)) + r[opll->pan[12]] += calc_slot_tom (MOD (opll,8)); + if (!(opll->mask & EMU2413_MASK_CYM) && (CAR (opll,8)->eg_mode != FINISH)) + r[opll->pan[13]] -= calc_slot_cym (CAR (opll,8), MOD(opll,7)->pgout); + } + + out[1] = (b[1] + b[3] + ((r[1] + r[3]) << 1)); + out[0] = (b[2] + b[3] + ((r[2] + r[3]) << 1)); +} + +void EMU2413_calc_stereo (EMU2413 * opll, int32 out[2]) +{ + calc_stereo (opll, out); +} +#endif /* EMU2413_COMPACTION */ diff --git a/Mednafen/mednafen/hw_sound/ym2413/emu2413.h b/Mednafen/mednafen/hw_sound/ym2413/emu2413.h new file mode 100644 index 0000000000..a1f6e591d9 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/ym2413/emu2413.h @@ -0,0 +1,123 @@ +#ifndef _EMU2413_H_ +#define _EMU2413_H_ + +#define PI 3.14159265358979323846 + +enum {EMU2413_2413_TONE = 0}; + +/* voice data */ +typedef struct { + uint32 TL,FB,EG,ML,AR,DR,SL,RR,KR,KL,AM,PM,WF ; +} EMU2413_PATCH ; + +/* slot */ +typedef struct { + + EMU2413_PATCH *patch; + + int32 type ; /* 0 : modulator 1 : carrier */ + + /* OUTPUT */ + int32 feedback ; + int32 output[2] ; /* Output value of slot */ + + /* for Phase Generator (PG) */ + uint32 *sintbl ; /* Wavetable */ + uint32 phase ; /* Phase */ + uint32 dphase ; /* Phase increment amount */ + uint32 pgout ; /* output */ + + /* for Envelope Generator (EG) */ + int32 fnum ; /* F-Number */ + int32 block ; /* Block */ + int32 volume ; /* Current volume */ + int32 sustine ; /* Sustine 1 = ON, 0 = OFF */ + uint32 tll ; /* Total Level + Key scale level*/ + uint32 rks ; /* Key scale offset (Rks) */ + int32 eg_mode ; /* Current state */ + uint32 eg_phase ; /* Phase */ + uint32 eg_dphase ; /* Phase increment amount */ + uint32 egout ; /* output */ + +} EMU2413_SLOT ; + +/* Mask */ +#define EMU2413_MASK_CH(x) (1<<(x)) +#define EMU2413_MASK_HH (1<<(9)) +#define EMU2413_MASK_CYM (1<<(10)) +#define EMU2413_MASK_TOM (1<<(11)) +#define EMU2413_MASK_SD (1<<(12)) +#define EMU2413_MASK_BD (1<<(13)) +#define EMU2413_MASK_RHYTHM ( EMU2413_MASK_HH | EMU2413_MASK_CYM | EMU2413_MASK_TOM | EMU2413_MASK_SD | EMU2413_MASK_BD ) + +/* opll */ +typedef struct +{ + + uint32 adr ; + int32 out ; + + uint32 pan[16]; + + /* Register */ + uint8 reg[0x40] ; + int32 slot_on_flag[18] ; + + /* Pitch Modulator */ + uint32 pm_phase ; + int32 lfo_pm ; + + /* Amp Modulator */ + int32 am_phase ; + int32 lfo_am ; + + /* Noise Generator */ + uint32 noise_seed ; + + /* Channel Data */ + int32 patch_number[9]; + int32 key_status[9] ; + + /* Slot */ + EMU2413_SLOT slot[18] ; + + /* Voice Data */ + EMU2413_PATCH patch[19*2] ; + int32 patch_update[2] ; /* flag for check patch update */ + + uint32 mask ; + +} EMU2413 ; + +/* Create Object */ +EMU2413 *EMU2413_new(uint32 clk); +void EMU2413_delete(EMU2413 *); + +/* Setup */ +void EMU2413_reset(EMU2413 *); +void EMU2413_reset_patch(EMU2413 *, int32); +void EMU2413_set_pan(EMU2413 *, uint32 ch, uint32 pan); + +/* Port/Register access */ +void EMU2413_writeIO(EMU2413 *, uint32 reg, uint32 val) ; +void EMU2413_writeReg(EMU2413 *, uint32 reg, uint32 val) ; + +/* Synthsize */ +int32 EMU2413_calc(EMU2413 *) ; +void EMU2413_calc_stereo(EMU2413 *, int32 out[2]) ; + +/* Misc */ +void EMU2413_setPatch(EMU2413 *, const uint8 *dump) ; +void EMU2413_copyPatch(EMU2413 *, int32, EMU2413_PATCH *) ; +void EMU2413_forceRefresh(EMU2413 *) ; + +/* Utility */ +void EMU2413_dump2patch(const uint8 *dump, EMU2413_PATCH *patch) ; +void EMU2413_patch2dump(const EMU2413_PATCH *patch, uint8 *dump) ; +void EMU2413_getDefaultPatch(int32 type, int32 num, EMU2413_PATCH *) ; + +/* Channel Mask */ +uint32 EMU2413_setMask(EMU2413 *, uint32 mask) ; +uint32 EMU2413_toggleMask(EMU2413 *, uint32 mask) ; + +#endif diff --git a/Mednafen/mednafen/hw_sound/ym2612/Ym2612_Emu.cpp b/Mednafen/mednafen/hw_sound/ym2612/Ym2612_Emu.cpp new file mode 100644 index 0000000000..fa0b17bfe0 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/ym2612/Ym2612_Emu.cpp @@ -0,0 +1,1146 @@ +/* Copyright (C) 2002 St?phane Dallongeville (gens AT consolemul.com) */ +/* Copyright (C) 2004-2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +// This is mostly the original source in its C style and all. +// +// Somewhat optimized and simplified. Uses a template to generate the many +// variants of Update_Chan. Rewrote header file. In need of full rewrite by +// someone more familiar with FM sound and the YM2612. Has some inaccuracies +// compared to the Sega Genesis sound, particularly being mixed at such a +// high sample accuracy (the Genesis sounds like it has only 8 bit samples). +// - Shay + +// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/ + +// Based on Gens 2.10 ym2612.c + +/* Some emulation improvements(ostensibly!) done for Mednafen: + Handle detune underflow correctly(hopefully. :b) + + Don't update active fnum/block(octave) on $A4-$A6, $AC-$AE writes; only on $A0-$A2, $A8-$AA writes. + + LFO FM applied to 11-bit fnum + + Rewritten EG code. + + Misc other stuff. +*/ + + +#include "Ym2612_Emu.h" +#include + +#include +#include +#include +#include +#include +#include + +const int output_bits = 14; + +#include "ym2612_opeg.inc" + +struct slot_t +{ + const int *DT; // parametre detune + int MUL; // parametre "multiple de frequence" + int KSR_S; // Key Scale Rate Shift = facteur de prise en compte du KSL dans la variations de l'enveloppe + + int Fcnt; // Frequency Count = compteur-frequence pour determiner l'amplitude actuelle (SIN[Finc >> 16]) + int INd; // input data of the slot = donnees en entree du slot + int AMS; // AMS depth level of this SLOT = degre de modulation de l'amplitude par le LFO + int AMSon; // AMS enable flag = drapeau d'activation de l'AMS + + OpEG eg; +}; + +struct channel_t +{ + int S0_OUT[4]; // anciennes sorties slot 0 (pour le feed back) + int LEFT; // LEFT enable flag + int RIGHT; // RIGHT enable flag + int ALGO; // Algorythm = determine les connections entre les operateurs + int FB; // shift count of self feed back = degre de "Feed-Back" du SLOT 1 (il est son unique entree) + int FMS; // Frequency Modulation Sensitivity of channel = degre de modulation de la frequence sur la voie par le LFO + int AMS; // Amplitude Modulation Sensitivity of channel = degre de modulation de l'amplitude sur la voie par le LFO + int FNUM[4]; // hauteur frequence de la voie (+ 3 pour le mode special) + int FOCT[4]; // octave de la voie (+ 3 pour le mode special) + int KC[4]; // Key Code = valeur fonction de la frequence (voir KSR pour les slots, KSR = KC >> KSR_S) + slot_t SLOT[4]; // four slot.operators = les 4 slots de la voie +}; + +struct state_t +{ + int Status; // YM2612 Status (timer overflow) + int TimerA; // timerA limit = valeur jusqu'? laquelle le timer A doit compter + int TimerAL; + int TimerAcnt; // timerA counter = valeur courante du Timer A + int TimerB; // timerB limit = valeur jusqu'? laquelle le timer B doit compter + int TimerBL; + int TimerBcnt; // timerB counter = valeur courante du Timer B + int Mode; // Mode actuel des voie 3 et 6 (normal / special) + int DAC; // DAC enabled flag + int DACdata; + + uint32 EGCycleCounter; + uint32 EGDivCounter; + + int LFOcnt; // LFO counter = compteur-frequence pour le LFO + int LFOinc; // LFO step counter = pas d'incrementation du compteur-frequence du LFO + // plus le pas est grand, plus la frequence est grande + + channel_t CHANNEL[Ym2612_Emu::channel_count]; // Les 6 voies du YM2612 + int REG[2][0x100]; // Sauvegardes des valeurs de tout les registres, c'est facultatif + // cela nous rend le debuggage plus facile +}; + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +// SIN_LBITS <= 16 +// LFO_HBITS <= 16 +// (SIN_LBITS + SIN_HBITS) <= 26 +// (LFO_LBITS + LFO_HBITS) <= 28 + +// DON'T CHANGE THESE TWO DEFINES. +#define SIN_HBITS 10 // Sinus phase counter int part +#define SIN_LBITS 10 // Sinus phase counter float part (best setting) + + + +#define ENV_HBITS 12 // Env phase counter int part + +#define LFO_HBITS 10 // LFO phase counter int part +#define LFO_LBITS (28 - LFO_HBITS) // LFO phase counter float part (best setting) + +#define SIN_LENGHT (1 << SIN_HBITS) +#define ENV_LENGHT (1 << ENV_HBITS) +#define LFO_LENGHT (1 << LFO_HBITS) + +#define TL_LENGHT (ENV_LENGHT * 3) // Env + TL scaling + LFO + +#define SIN_MASK (SIN_LENGHT - 1) +#define ENV_MASK (ENV_LENGHT - 1) +#define LFO_MASK (LFO_LENGHT - 1) + +#define ENV_STEP (96.0 / ENV_LENGHT) // ENV_MAX = 96 dB + +#define MAX_OUT_BITS (SIN_HBITS + SIN_LBITS + 2) // Modulation = -4 <--> +4 +#define MAX_OUT ((1 << MAX_OUT_BITS) - 1) + +#define PG_CUT_OFF ((int) (78.0 / ENV_STEP)) + +#define S0 0 // Stupid typo of the YM2612 +#define S1 2 +#define S2 1 +#define S3 3 + +struct tables_t +{ + short SIN_TAB [SIN_LENGHT]; // SINUS TABLE (offset into TL TABLE) + int DT_TAB [8] [32]; // Detune table + int LFO_INC_TAB [8]; // LFO step table + + short LFO_ENV_TAB [LFO_LENGHT]; // LFO AMS TABLE (adjusted for 11.8 dB) + int TL_TAB [TL_LENGHT * 2]; // TOTAL LEVEL TABLE (positif and minus) +}; + +static const unsigned char DT_DEF_TAB [4][32] = +{ +// FD = 0 + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }, + +// FD = 1 + { + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8, + }, + +// FD = 2 + { + 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, + 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 16, 16, 16, 16, + }, + +// FD = 3 + { + 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, + 8 , 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 20, 22, 22, 22, 22 + } +}; + +static const unsigned char FKEY_TAB [16] = +{ + 0, 0, 0, 0, + 0, 0, 0, 1, + 2, 3, 3, 3, + 3, 3, 3, 3 +}; + +static const unsigned char LFO_AMS_TAB [4] = +{ + 31, 3, 1, 0 +}; + +static const unsigned int LFO_PhaseMod_Table[8][8] = +{ + { 0, 0, 0, 0, 0, 0, 0, 0 }, // 0 + { 0, 0, 0, 0, 1, 1, 1, 1 }, // 1 + { 0, 0, 0, 1, 1, 1, 2, 2 }, // 2 + { 0, 0, 1, 1, 2, 2, 3, 3 }, // 3 + { 0, 0, 1, 2, 2, 2, 3, 4 }, // 4 + { 0, 0, 2, 3, 4, 4, 5, 6 }, // 5 + { 0, 0, 4, 6, 8, 8,10,12 }, // 6 + { 0, 0, 8,12,16,16,20,24 }, // 7 +}; + +struct Ym2612_Impl +{ + enum { channel_count = Ym2612_Emu::channel_count }; + + state_t YM2612; + int mute_mask; + tables_t g; + + int SLOT_SET( int, int ); + int CHANNEL_SET( int, int ); + int YM_SET( int, int ); + + void set_rate(void); + void reset(); + void write0( int addr, int data ); + void write1( int addr, int data ); + int read(void); + void run_timer( void ); + void run( Ym2612_Emu::sample_t* ); +}; + +int Ym2612_Impl::SLOT_SET( int Adr, int data ) +{ + int nch = Adr & 3; + if ( nch == 3 ) + return 1; + + channel_t& ch = YM2612.CHANNEL [nch + (Adr & 0x100 ? 3 : 0)]; + slot_t& sl = ch.SLOT [(Adr >> 2) & 3]; + + switch ( Adr & 0xF0 ) + { + case 0x30: + if ( (sl.MUL = (data & 0x0F)) != 0 ) sl.MUL <<= 1; + else sl.MUL = 1; + + sl.DT = &g.DT_TAB [(data >> 4) & 7][0]; + + break; + + case 0x40: + sl.eg.SetTL(data & 0x7F); + break; + + case 0x50: + sl.eg.SetAR(data & 0x1F); + + sl.KSR_S = 3 - (data >> 6); + + break; + + case 0x60: + sl.eg.SetDR(data & 0x1F); + + if ( (sl.AMSon = (data & 0x80)) != 0 ) sl.AMS = ch.AMS; + else sl.AMS = 31; + break; + + case 0x70: + sl.eg.SetSR(data & 0x1F); + break; + + case 0x80: + sl.eg.SetSL((data >> 4) & 0x0F); + sl.eg.SetRR(data & 0x0F); + break; + + case 0x90: + // SSG-EG envelope shapes : + /* + E At Al H + + 1 0 0 0 \\\\ + 1 0 0 1 \___ + 1 0 1 0 \/\/ + 1 0 1 1 \ + 1 1 0 0 //// + 1 1 0 1 / + 1 1 1 0 /\/\ + 1 1 1 1 /___ + + E = SSG-EG enable + At = Start negate + Al = Altern + H = Hold */ + //data = 0; + //if(data & 8) + //printf("SSG: %02x, %02x\n", Adr, data); + sl.eg.SetSSG_EG(data & 0x0F); + break; + } + + return 0; +} + + +int Ym2612_Impl::CHANNEL_SET( int Adr, int data ) +{ + int num = Adr & 3; + if ( num == 3 ) + return 1; + + channel_t& ch = YM2612.CHANNEL [num + (Adr & 0x100 ? 3 : 0)]; + + switch ( Adr & 0xFC ) + { + case 0xA0: + { + int od = YM2612.REG[(bool)(Adr & 0x100)][(Adr & 0xFF) | 0x04]; + + ch.FNUM [0] = (ch.FNUM [0] & 0x0FF) + ((od & 0x07) << 8); + ch.FOCT [0] = (od & 0x38) >> 3; + } + + ch.FNUM [0] = (ch.FNUM [0] & 0x700) + data; + ch.KC [0] = (ch.FOCT [0] << 2) | FKEY_TAB [ch.FNUM [0] >> 7]; + break; + + case 0xA4: + break; + + case 0xA8: + if ( Adr < 0x100 ) + { + num++; + + { + int od = YM2612.REG[(bool)(Adr & 0x100)][(Adr & 0xFF) | 0x04]; + + YM2612.CHANNEL [2].FNUM [num] = (YM2612.CHANNEL [2].FNUM [num] & 0x0FF) + ((od & 0x07) << 8); + YM2612.CHANNEL [2].FOCT [num] = (od & 0x38) >> 3; + } + + YM2612.CHANNEL [2].FNUM [num] = (YM2612.CHANNEL [2].FNUM [num] & 0x700) + data; + YM2612.CHANNEL [2].KC [num] = (YM2612.CHANNEL [2].FOCT [num] << 2) | + FKEY_TAB [YM2612.CHANNEL [2].FNUM [num] >> 7]; + } + break; + + case 0xAC: + break; + + case 0xB0: + if ( ch.ALGO != (data & 7) ) + { + ch.ALGO = data & 7; + ch.SLOT[S0].eg.InstrParamChanged(); + ch.SLOT[S1].eg.InstrParamChanged(); + ch.SLOT[S2].eg.InstrParamChanged(); + ch.SLOT[S3].eg.InstrParamChanged(); + } + + ch.FB = 9 - ((data >> 3) & 7); // Real thing ? + +// if (ch.FB = ((data >> 3) & 7)) ch.FB = 9 - ch.FB; // Thunder force 4 (music stage 8), Gynoug, Aladdin bug sound... +// else ch.FB = 31; + break; + + case 0xB4: { + ch.LEFT = 0 - ((data >> 7) & 1); + ch.RIGHT = 0 - ((data >> 6) & 1); + + ch.AMS = LFO_AMS_TAB [(data >> 4) & 3]; + ch.FMS = data & 7; + + for ( int i = 0; i < 4; i++ ) + { + slot_t& sl = ch.SLOT [i]; + sl.AMS = (sl.AMSon ? ch.AMS : 31); + } + break; + } + } + + return 0; +} + + +int Ym2612_Impl::YM_SET(int Adr, int data) +{ + switch ( Adr ) + { + case 0x22: + //printf("%02x\n", data); + if (data & 8) // LFO enable + { + // Cool Spot music 1, LFO modified severals time which + // distord the sound, have to check that on a real genesis... + + if(YM2612.LFOinc == 0) + YM2612.LFOcnt = 0; + + YM2612.LFOinc = g.LFO_INC_TAB [data & 7]; + } + else + { + YM2612.LFOinc = 0; + } + //printf("%d\n", g.LFOcnt); + break; + + case 0x24: + YM2612.TimerA = (YM2612.TimerA & 0x003) | (((int) data) << 2); + + if (YM2612.TimerAL != (1024 - YM2612.TimerA)) + { + YM2612.TimerAcnt = YM2612.TimerAL = (1024 - YM2612.TimerA); + } + break; + + case 0x25: + YM2612.TimerA = (YM2612.TimerA & 0x3FC) | (data & 3); + + if (YM2612.TimerAL != (1024 - YM2612.TimerA)) + { + YM2612.TimerAcnt = YM2612.TimerAL = (1024 - YM2612.TimerA); + } + break; + + case 0x26: + YM2612.TimerB = data; + + if (YM2612.TimerBL != (256 - YM2612.TimerB) << 4) + { + YM2612.TimerBcnt = YM2612.TimerBL = (256 - YM2612.TimerB) << 4; + } + break; + + case 0x27: + // Parametre divers + // b7 = CSM MODE + // b6 = 3 slot mode + // b5 = reset b + // b4 = reset a + // b3 = timer enable b + // b2 = timer enable a + // b1 = load b + // b0 = load a + +// if ((data & 2) && (YM2612.Status & 2)) YM2612.TimerBcnt = YM2612.TimerBL; +// if ((data & 1) && (YM2612.Status & 1)) YM2612.TimerAcnt = YM2612.TimerAL; + +// YM2612.Status &= (~data >> 4); // Reset du Status au cas ou c'est demande + YM2612.Status &= (~data >> 4) & (data >> 2); // Reset Status + + YM2612.Mode = data; + break; + + case 0x28: { + int nch = data & 3; + if ( nch == 3 ) + return 1; + if ( data & 4 ) + nch += 3; + channel_t& ch = YM2612.CHANNEL [nch]; + + ch.SLOT[S0].eg.SetKONOFF((bool)(data & 0x10)); + ch.SLOT[S1].eg.SetKONOFF((bool)(data & 0x20)); + ch.SLOT[S2].eg.SetKONOFF((bool)(data & 0x40)); + ch.SLOT[S3].eg.SetKONOFF((bool)(data & 0x80)); + break; + } + case 0x2A: + YM2612.DACdata = ((int)data - 0x80) << 5; + break; + + case 0x2B: + YM2612.DAC = data & 0x80; // activation/desactivation du DAC + break; + } + + return 0; +} + +void Ym2612_Impl::set_rate(void) +{ + int i; + + // 144 = 12 * (prescale * 2) = 12 * 6 * 2 + // prescale set to 6 by default + double sample_rate = 53267; + + // Tableau TL : + // [0 - 4095] = +output [4095 - ...] = +output overflow (fill with 0) + // [12288 - 16383] = -output [16384 - ...] = -output overflow (fill with 0) + + for(i = 0; i < TL_LENGHT; i++) + { + double x = MAX_OUT; // Max output + + x /= pow(2.0, 16.0 * i / ENV_LENGHT); + + if(i >= 4096) + x = 0; + + //printf("%d: %f, %f\n", i, x, 20.0 * log10(x / MAX_OUT)); + //printf("%d\n", MAX_OUT); + + g.TL_TAB [i] = (int) x; + g.TL_TAB [TL_LENGHT + i] = -g.TL_TAB [i]; + } + + // Tableau SIN : + // g.SIN_TAB [x] [y] = sin(x) * y; + // x = phase and y = volume + + assert(SIN_LENGHT == 1024); + for(int x = 0; x < 256; x++) + { + double y = floor(0.5 + -log(sin((x+0.5)*M_PI/256/2))/log(2.0)*256); + //printf("%f\n", y); + g.SIN_TAB [x] = g.SIN_TAB [(SIN_LENGHT / 2) - x - 1] = y; + g.SIN_TAB [(SIN_LENGHT / 2) + x] = g.SIN_TAB [SIN_LENGHT - x - 1] = TL_LENGHT + y; + } + + // Tableau LFO (LFO wav) : + assert(LFO_LENGHT == 1024); + for(i = 0; i < LFO_LENGHT; i++) + { + double x = sin(PI + (PI / 2) + 2.0 * PI * (double) (i) / (double) (LFO_LENGHT)); // Sinus + x += 1.0; + x /= 2.0; // positive only + x *= 11.8 / ENV_STEP; // ajusted to MAX enveloppe modulation + + g.LFO_ENV_TAB [i] = (int) x; + //printf("%d %d\n", i, (int)x); + } + + // Tableau Detune + + for(i = 0; i < 4; i++) + { + for (unsigned int kc = 0; kc < 32; kc++) + { + unsigned int y = DT_DEF_TAB[i][kc]; + + g.DT_TAB [i + 0][kc] = (int) y; + g.DT_TAB [i + 4][kc] = (int) -y; + } + } + + // Tableau LFO + g.LFO_INC_TAB [0] = (unsigned int) (3.98 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [1] = (unsigned int) (5.56 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [2] = (unsigned int) (6.02 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [3] = (unsigned int) (6.37 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [4] = (unsigned int) (6.88 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [5] = (unsigned int) (9.63 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [6] = (unsigned int) (48.1 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + g.LFO_INC_TAB [7] = (unsigned int) (72.2 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate); + + reset(); +} + + +Ym2612_Emu::Ym2612_Emu() +{ + impl = new Ym2612_Impl(); + impl->mute_mask = 0; + + memset( &impl->YM2612, 0, sizeof impl->YM2612 ); // fixme, don't memset() a non-POD type(OpEG) + impl->set_rate(); +} + +Ym2612_Emu::~Ym2612_Emu() +{ + delete impl; +} + +void Ym2612_Impl::write0( int opn_addr, int data ) +{ + assert( (unsigned) data <= 0xFF ); + + if ( opn_addr < 0x30 ) + { + YM2612.REG [0] [opn_addr] = data; + YM_SET( opn_addr, data ); + } + else + { + YM2612.REG [0] [opn_addr] = data; + + if ( opn_addr < 0xA0 ) + SLOT_SET( opn_addr, data ); + else + CHANNEL_SET( opn_addr, data ); + } +} + +void Ym2612_Impl::write1( int opn_addr, int data ) +{ + assert( (unsigned) data <= 0xFF ); + + if ( opn_addr >= 0x30 ) + { + YM2612.REG [1] [opn_addr] = data; + + if ( opn_addr < 0xA0 ) + SLOT_SET( opn_addr + 0x100, data ); + else + CHANNEL_SET( opn_addr + 0x100, data ); + } +} + +inline int Ym2612_Impl::read( void ) +{ + return(YM2612.Status); +} + +void Ym2612_Emu::reset() +{ + impl->reset(); +} + +void Ym2612_Impl::reset() +{ + YM2612.LFOcnt = 0; + YM2612.TimerA = 0; + YM2612.TimerAL = 0; + YM2612.TimerAcnt = 0; + YM2612.TimerB = 0; + YM2612.TimerBL = 0; + YM2612.TimerBcnt = 0; + YM2612.DAC = 0; + YM2612.DACdata = 0; + YM2612.Status = 0; + + YM2612.EGDivCounter = 0; + YM2612.EGCycleCounter = 0; + + int i; + for ( i = 0; i < channel_count; i++ ) + { + channel_t& ch = YM2612.CHANNEL [i]; + + ch.LEFT = ~0; + ch.RIGHT = ~0; + ch.ALGO = 0; + ch.FB = 31; + ch.FMS = 0; + ch.AMS = 0; + + for ( int j = 0 ;j < 4 ; j++ ) + { + ch.S0_OUT [j] = 0; + ch.FNUM [j] = 0; + ch.FOCT [j] = 0; + ch.KC [j] = 0; + + ch.SLOT [j].Fcnt = 0; + + ch.SLOT [j].eg.Reset(); + } + } + + for ( i = 0; i < 0x100; i++ ) + { + YM2612.REG [0] [i] = -1; + YM2612.REG [1] [i] = -1; + } + + for ( i = 0xB6; i >= 0xB4; i-- ) + { + write0( i, 0xC0 ); + write1( i, 0xC0 ); + } + + for ( i = 0xB2; i >= 0x22; i-- ) + { + write0( i, 0 ); + write1( i, 0 ); + } + + write0( 0x2A, 0x80 ); +} + +void Ym2612_Emu::write0( int addr, int data ) +{ + impl->write0( addr, data ); +} + +void Ym2612_Emu::write1( int addr, int data ) +{ + impl->write1( addr, data ); +} + +int Ym2612_Emu::read(void) +{ + return(impl->read()); +} + +void Ym2612_Emu::mute_voices( int mask ) { impl->mute_mask = mask; } + +template +struct ym2612_update_chan { + static void func( state_t& st, tables_t&, channel_t&, Ym2612_Emu::sample_t*); +}; + +typedef void (*ym2612_update_chan_t)( state_t& st, tables_t&, channel_t&, Ym2612_Emu::sample_t*); + +//void MDFN_DispMessage(const char *format, ...) throw(); + +template +void ym2612_update_chan::func( state_t& st, tables_t& g, channel_t& ch, + Ym2612_Emu::sample_t* buf ) +{ + // algo is a compile-time constant, so all conditions based on it are resolved + // during compilation + int CH_S0_OUT_1 = ch.S0_OUT [1]; + + int in0 = ch.SLOT [S0].Fcnt; + int in1 = ch.SLOT [S1].Fcnt; + int in2 = ch.SLOT [S2].Fcnt; + int in3 = ch.SLOT [S3].Fcnt; + +// MDFN_DispMessage("%08x", in2); + { + // envelope + int const env_LFO = g.LFO_ENV_TAB [(st.LFOcnt >> LFO_LBITS) & LFO_MASK]; + + #define CALC_EN( x ) \ + int temp##x = (ch.SLOT [S##x].eg.GetOutAttenuation() << 2) + (env_LFO >> ch.SLOT [S##x].AMS); \ + int en##x = (temp##x < 0x1000) ? temp##x : 0xFFF; \ + + CALC_EN( 0 ) + CALC_EN( 1 ) + CALC_EN( 2 ) + CALC_EN( 3 ) + + int const* const TL_TAB = g.TL_TAB; + + #define SINT( i, o ) (TL_TAB [g.SIN_TAB [(i)] + (o)]) + + // feedback + int CH_S0_OUT_0 = ch.S0_OUT [0]; + { + int temp = in0 + ((CH_S0_OUT_0 + CH_S0_OUT_1) >> ch.FB); + CH_S0_OUT_1 = CH_S0_OUT_0; + CH_S0_OUT_0 = SINT( (temp >> SIN_LBITS) & SIN_MASK, en0 ); + } + + int CH_OUTd; + if ( algo == 0 ) + { + int temp = in1 + CH_S0_OUT_1; + temp = in2 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en1 ); + temp = in3 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en2 ); + CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 ); + } + else if ( algo == 1 ) + { + int temp = in2 + CH_S0_OUT_1 + SINT( (in1 >> SIN_LBITS) & SIN_MASK, en1 ); + temp = in3 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en2 ); + CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 ); + } + else if ( algo == 2 ) + { + int temp = in2 + SINT( (in1 >> SIN_LBITS) & SIN_MASK, en1 ); + temp = in3 + CH_S0_OUT_1 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en2 ); + CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 ); + } + else if ( algo == 3 ) + { + int temp = in1 + CH_S0_OUT_1; + temp = in3 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en1 ) + + SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 ); + CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 ); + } + else if ( algo == 4 ) + { + int temp = in3 + SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 ); + CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 ) + + SINT( ((in1 + CH_S0_OUT_1) >> SIN_LBITS) & SIN_MASK, en1 ); + //DO_LIMIT + } + else if ( algo == 5 ) + { + int temp = CH_S0_OUT_1; + CH_OUTd = SINT( ((in3 + temp) >> SIN_LBITS) & SIN_MASK, en3 ) + + SINT( ((in1 + temp) >> SIN_LBITS) & SIN_MASK, en1 ) + + SINT( ((in2 + temp) >> SIN_LBITS) & SIN_MASK, en2 ); + //DO_LIMIT + } + else if ( algo == 6 ) + { + CH_OUTd = SINT( (in3 >> SIN_LBITS) & SIN_MASK, en3 ) + + SINT( ((in1 + CH_S0_OUT_1) >> SIN_LBITS) & SIN_MASK, en1 ) + + SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 ); + //DO_LIMIT + } + else if ( algo == 7 ) + { + CH_OUTd = SINT( (in3 >> SIN_LBITS) & SIN_MASK, en3 ) + + SINT( (in1 >> SIN_LBITS) & SIN_MASK, en1 ) + + SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 ) + CH_S0_OUT_1; + //DO_LIMIT + } + + CH_OUTd >>= MAX_OUT_BITS - output_bits + 2; + + int t0 = buf [0] + (CH_OUTd & ch.LEFT); + int t1 = buf [1] + (CH_OUTd & ch.RIGHT); + + ch.S0_OUT [0] = CH_S0_OUT_0; + buf [0] = t0; + buf [1] = t1; + buf += 2; + } + + ch.S0_OUT [1] = CH_S0_OUT_1; + + ch.SLOT [S0].Fcnt = in0; + ch.SLOT [S1].Fcnt = in1; + ch.SLOT [S2].Fcnt = in2; + ch.SLOT [S3].Fcnt = in3; +} + +static const ym2612_update_chan_t UPDATE_CHAN [8] = { + &ym2612_update_chan<0>::func, + &ym2612_update_chan<1>::func, + &ym2612_update_chan<2>::func, + &ym2612_update_chan<3>::func, + &ym2612_update_chan<4>::func, + &ym2612_update_chan<5>::func, + &ym2612_update_chan<6>::func, + &ym2612_update_chan<7>::func +}; + +void Ym2612_Impl::run_timer(void) +{ + YM2612.CHANNEL[2].SLOT[0].eg.SetCSMKONOFF(false); + YM2612.CHANNEL[2].SLOT[1].eg.SetCSMKONOFF(false); + YM2612.CHANNEL[2].SLOT[2].eg.SetCSMKONOFF(false); + YM2612.CHANNEL[2].SLOT[3].eg.SetCSMKONOFF(false); + + if (YM2612.Mode & 1) // Timer A ON ? + { + YM2612.TimerAcnt--; + + if(YM2612.TimerAcnt <= 0) + { + // timer a overflow + YM2612.Status |= (YM2612.Mode & 0x04) >> 2; + YM2612.TimerAcnt += YM2612.TimerAL; + + if((YM2612.Mode & 0xC0) == 0x80) + { + YM2612.CHANNEL[2].SLOT[0].eg.SetCSMKONOFF(true); + YM2612.CHANNEL[2].SLOT[1].eg.SetCSMKONOFF(true); + YM2612.CHANNEL[2].SLOT[2].eg.SetCSMKONOFF(true); + YM2612.CHANNEL[2].SLOT[3].eg.SetCSMKONOFF(true); + } + } + } + + + if (YM2612.Mode & 2) // Timer B ON ? + { + YM2612.TimerBcnt--; + + if (YM2612.TimerBcnt <= 0) + { + // timer b overflow + YM2612.Status |= (YM2612.Mode & 0x08) >> 2; + YM2612.TimerBcnt += YM2612.TimerBL; + } + } +} + +void Ym2612_Impl::run( Ym2612_Emu::sample_t* out ) +{ + if ( YM2612.Mode & 3 ) + run_timer(); + + for(int i = 0; i < channel_count; i++) + { + Ym2612_Emu::sample_t tmp_out[2] = { 0, 0 }; + + UPDATE_CHAN[YM2612.CHANNEL [i].ALGO](YM2612, g, YM2612.CHANNEL [i], tmp_out); + + if(i == 5 && YM2612.DAC) + { + tmp_out[0] = YM2612.DACdata & YM2612.CHANNEL[5].LEFT; + tmp_out[1] = YM2612.DACdata & YM2612.CHANNEL[5].RIGHT; + } + + if(mute_mask & (1 << i)) + { + tmp_out[0] = tmp_out[1] = 0; + } + + out[0] += tmp_out[0]; + out[1] += tmp_out[1]; + } + + unsigned lfo_pm_position = ((YM2612.LFOcnt >> LFO_LBITS) & LFO_MASK) >> (LFO_HBITS - 5); + unsigned lfo_pm_tabposition = (lfo_pm_position & 0x8) ? (0x7 - (lfo_pm_position & 0x7)) : (lfo_pm_position & 0x7); + +// printf("%d %d\n", lfo_pm_position, lfo_pm_tabposition); + + for ( int chi = 0; chi < channel_count; chi++ ) + { + channel_t& ch = YM2612.CHANNEL [chi]; + + int i2 = 0; + if ( chi == 2 && (YM2612.Mode & 0x40) ) + i2 = 2; + + for ( int i = 0; i < 4; i++ ) + { + // static int seq [4] = { 2, 1, 3, 0 }; + // if ( i2 ) i2 = seq [i]; + slot_t& sl = ch.SLOT [i]; + int lfo_fnm_delta = 0; + + if(ch.FNUM[i2]) + { + int amp = LFO_PhaseMod_Table[ch.FMS][lfo_pm_tabposition]; + + lfo_fnm_delta = (amp << uilog2(ch.FNUM[i2])) >> 9; + + if(lfo_pm_position & 0x10) + lfo_fnm_delta = -lfo_fnm_delta; + + //if(lfo_fnm_delta) + // printf("%d %d: %d\n", chi, i, lfo_fnm_delta); + } + + int fnm = (ch.FNUM[i2] + lfo_fnm_delta) & 0x7FF; + int finc_tmp = (fnm << ch.FOCT [i2]) >> 1; + int finc = ((((finc_tmp + sl.DT[ch.KC[i2]]) & 0x1FFFF) * sl.MUL) >> 1) & 0xFFFFF; + int ksr = ch.KC [i2] >> sl.KSR_S; // keycode attenuation + + if(sl.eg.Run(YM2612.EGDivCounter == 0, YM2612.EGCycleCounter, ksr)) + sl.Fcnt += finc; + else + sl.Fcnt = 0; + + if ( i2 ) + i2 = (i2 ^ 2) ^ (i2 >> 1); + } + } + + //printf("%d %d\n", YM2612.EGDivCounter, YM2612.EGCycleCounter); + YM2612.EGDivCounter++; + if(YM2612.EGDivCounter == 3) + { + YM2612.EGDivCounter = 0; + YM2612.EGCycleCounter++; + } + + YM2612.LFOcnt += YM2612.LFOinc; +} + +void Ym2612_Emu::run( sample_t* out ) { impl->run( out ); } + + +void Ym2612_Emu::serialize(MDFN::LEPacker &slizer, bool load) +{ + state_t *s = &impl->YM2612; + tables_t *g = &impl->g; + const int cur_version = 0; + int version_saved = cur_version; + + slizer.set_read_mode(load); + + slizer ^ version_saved; + + if(version_saved != cur_version) + { + // ERROR + } + + for(int r0 = 0; r0 < 2; r0++) + { + for(int r1 = 0; r1 < 0x100; r1++) + { + slizer ^ s->REG[r0][r1]; + } + } + + slizer ^ s->Status; + slizer ^ s->TimerA; + slizer ^ s->TimerAL; + slizer ^ s->TimerAcnt; + slizer ^ s->TimerB; + slizer ^ s->TimerBL; + slizer ^ s->TimerBcnt; + slizer ^ s->Mode; + slizer ^ s->DAC; + slizer ^ s->DACdata; + slizer ^ s->EGCycleCounter; + slizer ^ s->EGDivCounter; + + slizer ^ s->LFOinc; + slizer ^ s->LFOcnt; + + + for(int ch = 0; ch < channel_count; ch++) + { + channel_t *c = &s->CHANNEL[ch]; + + for(int i = 0; i < 4; i++) + { + slizer ^ c->S0_OUT[i]; + } + + slizer ^ c->LEFT; + slizer ^ c->RIGHT; + slizer ^ c->ALGO; + slizer ^ c->FB; + slizer ^ c->FMS; + slizer ^ c->AMS; + + if(load) + { + c->ALGO &= 0x07; + c->FMS &= 0x07; + } + + for(int i = 0; i < 4; i++) + { + slizer ^ c->FNUM[i]; + } + + for(int i = 0; i < 4; i++) + { + slizer ^ c->FOCT[i]; + } + for(int i = 0; i < 4; i++) + { + slizer ^ c->KC[i]; + + if(load) + { + c->KC[i] &= 0x1F; + } + } + + for(int slot = 0; slot < 4; slot++) + { + slot_t *sl = &c->SLOT[slot]; + unsigned int tun = (unsigned int)(sl->DT - &g->DT_TAB[0][0]); + + slizer ^ tun; + + if(load) + { + tun &= 0x07; + sl->DT = &g->DT_TAB[tun][0]; + } + + slizer ^ sl->MUL; + slizer ^ sl->KSR_S; + + slizer ^ sl->Fcnt; + + slizer ^ sl->INd; + slizer ^ sl->AMS; + slizer ^ sl->AMSon; + + sl->eg.serialize(slizer, load); + } + } +} + + + +#if 0 + +#define SLOT_STATEREG(ch,sln) \ + SFVARN(s->CHANNEL[ch].SLOT[sln].DT, "DT"), \ + SFVARN(s->CHANNEL[ch].SLOT[sln].MUL, "MUL"), \ + SFVARN(s->CHANNEL[ch].SLOT[sln].KSR_S, "KSR_S"), \ + SFVARN(s->CHANNEL[ch].SLOT[sln].Fcnt, "Fcnt"), \ + SFVARN(s->CHANNEL[ch].SLOT[sln].INd, "INd"), \ + SFVARN(s->CHANNEL[ch].SLOT[sln].AMS, "AMS"), \ + SFVARN(s->CHANNEL[ch].SLOT[sln].AMSon, "AMSon"), + +#define CH_STATEREG(ch) SFARRAY32N(s->CHANNEL[ch].S0_OUT, 4, "S0_OUT"), \ + SFVARN(s->CHANNEL[ch].LEFT, "LEFT"), \ + SFVARN(s->CHANNEL[ch].RIGHT, "RIGHT"), \ + SFVARN(s->CHANNEL[ch].ALGO, "ALGO"), \ + SFVARN(s->CHANNEL[ch].FB, "FB"), \ + SFVARN(s->CHANNEL[ch].FMS, "FMS"), \ + SFVARN(s->CHANNEL[ch].AMS, "AMS"), \ + SFARRAY32N(s->CHANNEL[ch].FNUM, 4, "FNUM"), \ + SFARRAY32N(s->CHANNEL[ch].FOCT, 4, "FOCT"), \ + SFARRAY32N(s->CHANNEL[ch].KC, 4, "KC"), \ + SLOT_STATEREG(ch,0) \ + SLOT_STATEREG(ch,1) \ + SLOT_STATEREG(ch,2) \ + SLOT_STATEREG(ch,3) + +// EG here + +#define STATEREG(n) SFVARN(s->n, #n), + +int Ym2612_Emu::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + state_t *s = &impl->YM2612; + tables_t *g = &impl->g; + + SFORMAT StateRegs[] = + { + STATEREG(Status) + STATEREG(TimerA) + STATEREG(TimerAL) + STATEREG(TimerAcnt) + STATEREG(TimerB) + STATEREG(TimerBL) + STATEREG(TimerBcnt) + STATEREG(Mode) + STATEREG(DAC) + STATEREG(DACdata) + STATEREG(EGCycleCounter) + STATEREG(EGDivCounter) + + CH_STATEREG(0) + CH_STATEREG(1) + CH_STATEREG(2) + CH_STATEREG(3) + CH_STATEREG(4) + CH_STATEREG(5) + + SFARRAY32N(&s->REG[0][0], sizeof(s->REG) / sizeof(s->REG[0][0]), "REGS"), + SFEND + }; + +} + +#undef SLOT_STATEREG +#undef CH_STATEREG +#undef STATEREG + +#endif diff --git a/Mednafen/mednafen/hw_sound/ym2612/Ym2612_Emu.h b/Mednafen/mednafen/hw_sound/ym2612/Ym2612_Emu.h new file mode 100644 index 0000000000..c8d5a04dd0 --- /dev/null +++ b/Mednafen/mednafen/hw_sound/ym2612/Ym2612_Emu.h @@ -0,0 +1,39 @@ +// YM2612 FM sound chip emulator interface +#ifndef YM2612_EMU_H +#define YM2612_EMU_H + +#include +#include + +struct Ym2612_Impl; + +class Ym2612_Emu { + Ym2612_Impl* impl; +public: + Ym2612_Emu() MDFN_COLD; + ~Ym2612_Emu() MDFN_COLD; + + // Reset to power-up state + void reset() MDFN_COLD; + + // Mute voice n if bit n (1 << n) of mask is set + enum { channel_count = 6 }; + void mute_voices( int mask ); + + // Write addr to register 0 then data to register 1 + void write0( int addr, int data ); + + // Write addr to register 2 then data to register 3 + void write1( int addr, int data ); + + int read(void); + + // Run and add nt samples into current output buffer contents + typedef short sample_t; + enum { out_chan_count = 2 }; // stereo + void run( sample_t* out ); + + void serialize(MDFN::LEPacker &slizer, bool load); +}; + +#endif diff --git a/Mednafen/mednafen/hw_sound/ym2612/ym2612_opeg.inc b/Mednafen/mednafen/hw_sound/ym2612/ym2612_opeg.inc new file mode 100644 index 0000000000..984cebad9d --- /dev/null +++ b/Mednafen/mednafen/hw_sound/ym2612/ym2612_opeg.inc @@ -0,0 +1,400 @@ +class OpEG +{ + public: + + OpEG(); + ~OpEG(); + + void serialize(MDFN::LEPacker &slizer, bool load); + + void Reset(void); + + void SetKONOFF(bool); + void SetCSMKONOFF(bool); + void InstrParamChanged(void); + + bool Run(bool div3_run_eg, unsigned GlobalEGCycleCounter, unsigned ksr); + + void SetTL(unsigned); + void SetSL(unsigned); + void SetAR(unsigned); + void SetDR(unsigned); + void SetSR(unsigned); + void SetRR(unsigned); + void SetSSG_EG(unsigned); + + uint32 GetOutAttenuation(void); + + // + // + // + private: + + void CheckPhaseAdvance(void); + unsigned CalcRate(unsigned ksr); + + bool NeedFullKON; + bool KONOFF; + bool CSMKONOFF; + bool LA_OT_KONOFF; + uint8 TL, SL; + uint8 SSG_EG; + + union + { + struct + { + uint8 AR, DR, SR, RR; // Note: RR is stored (<< 1) | 1 here + }; + uint8 RawRates[4]; + }; + + unsigned CurPhase; + signed Attenuation; + bool SSGInvert; + + enum + { + ADSR_ATTACK = 0, + ADSR_DECAY = 1, + ADSR_SUSTAIN = 2, + ADSR_RELEASE = 3 + }; + #define SSGEG_MASK_HOLD 0x01 + #define SSGEG_MASK_ALTERNATE 0x02 + #define SSGEG_MASK_ATTACK 0x04 + #define SSGEG_MASK_ENABLE 0x08 +}; + +OpEG::OpEG() +{ + Reset(); +} + +OpEG::~OpEG() +{ + + +} + +void OpEG::serialize(MDFN::LEPacker &slizer, bool load) +{ + slizer ^ KONOFF; + slizer ^ CSMKONOFF; + slizer ^ LA_OT_KONOFF; + slizer ^ NeedFullKON; + slizer ^ TL; + slizer ^ SL; + slizer ^ SSG_EG; + + slizer ^ AR; + slizer ^ DR; + slizer ^ SR; + slizer ^ RR; + + slizer ^ CurPhase; + slizer ^ Attenuation; + slizer ^ SSGInvert; +} + +void OpEG::Reset(void) +{ + TL = 0; + SL = 0; + SSG_EG = 0; + + AR = 0; + DR = 0; + SR = 0; + RR = 1; + + CurPhase = ADSR_RELEASE; + Attenuation = 0x3FF; + SSGInvert = false; + KONOFF = false; + CSMKONOFF = false; + LA_OT_KONOFF = false; + + NeedFullKON = false; +} + + +void OpEG::InstrParamChanged(void) +{ + NeedFullKON = true; +} + +void OpEG::SetCSMKONOFF(bool ns) +{ + CSMKONOFF = ns; +} + +void OpEG::SetKONOFF(bool ns) +{ + // printf("NS: %d\n", ns); + //if(LA_OT_KONOFF != (KONOFF | CSMKONOFF)) + // puts("IYEE :(\n\n"); + + KONOFF = ns; +} + + +void OpEG::SetTL(unsigned v) +{ + TL = v & 0x7F; +} + +void OpEG::SetSL(unsigned v) +{ + SL = v & 0x0F; +} + +void OpEG::SetAR(unsigned v) +{ + AR = v & 0x1F; + //if(LA_OT_KONOFF != (KONOFF | CSMKONOFF) || CurPhase != ADSR_RELEASE) + // puts("AR Evil"); +} + +void OpEG::SetDR(unsigned v) +{ + DR = v & 0x1F; + //if(LA_OT_KONOFF != (KONOFF | CSMKONOFF) || CurPhase != ADSR_RELEASE) + // puts("DR Evil"); +} + +void OpEG::SetSR(unsigned v) +{ + SR = v & 0x1F; + //if(LA_OT_KONOFF != (KONOFF | CSMKONOFF) || CurPhase != ADSR_RELEASE) + // puts("SR Evil"); +} + +void OpEG::SetRR(unsigned v) +{ + RR = ((v & 0x0F) << 1) | 1; + //if(LA_OT_KONOFF != (KONOFF | CSMKONOFF) || CurPhase != ADSR_RELEASE) + // puts("RR Evil"); +} + +void OpEG::SetSSG_EG(unsigned v) +{ + SSG_EG = v & 0xF; +} + +unsigned OpEG::CalcRate(unsigned ksr) +{ + unsigned int rate = ((RawRates[CurPhase] << 1) + (RawRates[CurPhase] ? ksr : 0)); + + if(rate > 0x3F) + rate = 0x3F; + + return(rate); +} + + +// See Mega Turrican track 3, and Flashback track 3. +void OpEG::CheckPhaseAdvance(void) +{ + if(CurPhase == ADSR_ATTACK) + { + if(Attenuation == 0) + { + CurPhase = ADSR_DECAY; + } + } + + + if(CurPhase == ADSR_DECAY) + { + if(Attenuation >= ((SL == 0x0F) ? 0x3FF : (SL << 5))) + { + CurPhase = ADSR_SUSTAIN; + } + } +} + +// +bool OpEG::Run(bool div3_run_eg, unsigned GlobalEGCycleCounter, unsigned ksr) +{ + bool ret = true; + bool combo_KONOFF = KONOFF | CSMKONOFF; + + if(combo_KONOFF != LA_OT_KONOFF) + { + if(combo_KONOFF) // Key on + { + //printf("Key on\n"); + ret = false; + + CurPhase = ADSR_ATTACK; + SSGInvert = false; + + if(NeedFullKON) + { + Attenuation = 0x3FF; + NeedFullKON = false; + } + + if(CalcRate(ksr) >= 0x3E) + { + Attenuation = 0; + } + CheckPhaseAdvance(); + } + else // Key off + { + //printf("Key off\n"); + CurPhase = ADSR_RELEASE; + + if((SSG_EG & 0x08) && (SSGInvert ^ (bool)(SSG_EG & SSGEG_MASK_ATTACK))) + { + Attenuation = (0x200 - Attenuation) & 0x3FF; + } + } + } + LA_OT_KONOFF = combo_KONOFF; + + if((SSG_EG & 0x08) && (Attenuation >= 0x200)) + { + if((SSG_EG & SSGEG_MASK_ALTERNATE) && (!(SSG_EG & SSGEG_MASK_HOLD) || !SSGInvert)) + { + SSGInvert = !SSGInvert; + } + + if(!(SSG_EG & SSGEG_MASK_ALTERNATE) && !(SSG_EG & SSGEG_MASK_HOLD)) + { + ret = false; + } + + if(CurPhase != ADSR_ATTACK) + { + if((CurPhase != ADSR_RELEASE) && !(SSG_EG & SSGEG_MASK_HOLD)) + { + ret = false; + + CurPhase = ADSR_ATTACK; + + //Attenuation = 0x3FF; + if(NeedFullKON) + { + Attenuation = 0x3FF; + NeedFullKON = false; + } + + if(CalcRate(ksr) >= 0x3E) + { + Attenuation = 0; + } + CheckPhaseAdvance(); + } + else if((CurPhase == ADSR_RELEASE) || !(SSGInvert ^ (bool)(SSG_EG & SSGEG_MASK_ATTACK))) + { + Attenuation = 0x3FF; + CheckPhaseAdvance(); + } + } + } + + + if(div3_run_eg) + { + static const uint8 counter_shift_table[0x40] = { + 11, 11, 11, 11, // 0-3 (0x00-0x03) + 10, 10, 10, 10, // 4-7 (0x04-0x07) + 9, 9, 9, 9, // 8-11 (0x08-0x0B) + 8, 8, 8, 8, // 12-15 (0x0C-0x0F) + 7, 7, 7, 7, // 16-19 (0x10-0x13) + 6, 6, 6, 6, // 20-23 (0x14-0x17) + 5, 5, 5, 5, // 24-27 (0x18-0x1B) + 4, 4, 4, 4, // 28-31 (0x1C-0x1F) + 3, 3, 3, 3, // 32-35 (0x20-0x23) + 2, 2, 2, 2, // 36-39 (0x24-0x27) + 1, 1, 1, 1, // 40-43 (0x28-0x2B) + 0, 0, 0, 0, // 44-47 (0x2C-0x2F) + 0, 0, 0, 0, // 48-51 (0x30-0x33) + 0, 0, 0, 0, // 52-55 (0x34-0x37) + 0, 0, 0, 0, // 56-59 (0x38-0x3B) + 0, 0, 0, 0, // 60-63 (0x3C-0x3F) + }; + + static const uint8 atten_inc_table[0x40][0x08] = { + { 0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0 }, { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,0,1,0,1 }, // 0-3 (0x00-0x03) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,0,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,0,1,1,1 }, // 4-7 (0x04-0x07) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 8-11 (0x08-0x0B) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 12-15 (0x0C-0x0F) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 16-19 (0x10-0x13) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 20-23 (0x14-0x17) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 24-27 (0x18-0x1B) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 28-31 (0x1C-0x1F) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 32-35 (0x20-0x23) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 36-39 (0x24-0x27) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 40-43 (0x28-0x2B) + { 0,1,0,1,0,1,0,1 }, { 0,1,0,1,1,1,0,1 }, { 0,1,1,1,0,1,1,1 }, { 0,1,1,1,1,1,1,1 }, // 44-47 (0x2C-0x2F) + { 1,1,1,1,1,1,1,1 }, { 1,1,1,2,1,1,1,2 }, { 1,2,1,2,1,2,1,2 }, { 1,2,2,2,1,2,2,2 }, // 48-51 (0x30-0x33) + { 2,2,2,2,2,2,2,2 }, { 2,2,2,4,2,2,2,4 }, { 2,4,2,4,2,4,2,4 }, { 2,4,4,4,2,4,4,4 }, // 52-55 (0x34-0x37) + { 4,4,4,4,4,4,4,4 }, { 4,4,4,8,4,4,4,8 }, { 4,8,4,8,4,8,4,8 }, { 4,8,8,8,4,8,8,8 }, // 56-59 (0x38-0x3B) + { 8,8,8,8,8,8,8,8 }, { 8,8,8,8,8,8,8,8 }, { 8,8,8,8,8,8,8,8 }, { 8,8,8,8,8,8,8,8 }, // 60-63 (0x3C-0x3F) + }; + + unsigned rate = CalcRate(ksr); + + if((GlobalEGCycleCounter & ((1 << counter_shift_table[rate]) - 1)) == 0) + { + unsigned sub_cycle = (GlobalEGCycleCounter >> counter_shift_table[rate]) & 0x07; + signed inc_amount = atten_inc_table[rate][sub_cycle]; + + if(CurPhase == ADSR_ATTACK) + { + if(rate < 0x3E) + { + Attenuation += ((~Attenuation) * inc_amount) >> 4; + if(Attenuation < 0) + { + //printf("%d\n", Attenuation); + Attenuation = 0; + } + } + } + else + { + if(SSG_EG & 0x8) + { + if(Attenuation < 0x200) + { + Attenuation += inc_amount * 4; + } + } + else + Attenuation += inc_amount; + } + + if(Attenuation > 0x3FF) + Attenuation = 0x3FF; + + CheckPhaseAdvance(); + } + } + + return(ret); +} + + +uint32 OpEG::GetOutAttenuation(void) +{ + unsigned ret; + + if((SSG_EG & 0x08) && (CurPhase != ADSR_RELEASE) && (SSGInvert ^ (bool)(SSG_EG & SSGEG_MASK_ATTACK))) + { + ret = ((0x200 - Attenuation) & 0x3FF); + } + else + ret = Attenuation & 0x3FF; + + ret += TL << 3; + + if(ret > 0x3FF) + ret = 0x3FF; + + return(ret); +} diff --git a/Mednafen/mednafen/hw_video/Makefile.am b/Mednafen/mednafen/hw_video/Makefile.am new file mode 100644 index 0000000000..2a126d93cb --- /dev/null +++ b/Mednafen/mednafen/hw_video/Makefile.am @@ -0,0 +1,12 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnhwvideo.a + +libmdfnhwvideo_a_SOURCES = + +if NEED_HUC6270_EMU +libmdfnhwvideo_a_SOURCES += huc6270/vdc.cpp +endif + diff --git a/Mednafen/mednafen/hw_video/Makefile.in b/Mednafen/mednafen/hw_video/Makefile.in new file mode 100644 index 0000000000..299f01da44 --- /dev/null +++ b/Mednafen/mednafen/hw_video/Makefile.in @@ -0,0 +1,691 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@NEED_HUC6270_EMU_TRUE@am__append_1 = huc6270/vdc.cpp +subdir = src/hw_video +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnhwvideo_a_AR = $(AR) $(ARFLAGS) +libmdfnhwvideo_a_LIBADD = +am__libmdfnhwvideo_a_SOURCES_DIST = huc6270/vdc.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@NEED_HUC6270_EMU_TRUE@am__objects_1 = huc6270/vdc.$(OBJEXT) +am_libmdfnhwvideo_a_OBJECTS = $(am__objects_1) +libmdfnhwvideo_a_OBJECTS = $(am_libmdfnhwvideo_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfnhwvideo_a_SOURCES) +DIST_SOURCES = $(am__libmdfnhwvideo_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnhwvideo.a +libmdfnhwvideo_a_SOURCES = $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/hw_video/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/hw_video/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +huc6270/$(am__dirstamp): + @$(MKDIR_P) huc6270 + @: > huc6270/$(am__dirstamp) +huc6270/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) huc6270/$(DEPDIR) + @: > huc6270/$(DEPDIR)/$(am__dirstamp) +huc6270/vdc.$(OBJEXT): huc6270/$(am__dirstamp) \ + huc6270/$(DEPDIR)/$(am__dirstamp) + +libmdfnhwvideo.a: $(libmdfnhwvideo_a_OBJECTS) $(libmdfnhwvideo_a_DEPENDENCIES) $(EXTRA_libmdfnhwvideo_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnhwvideo.a + $(AM_V_AR)$(libmdfnhwvideo_a_AR) libmdfnhwvideo.a $(libmdfnhwvideo_a_OBJECTS) $(libmdfnhwvideo_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnhwvideo.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f huc6270/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@huc6270/$(DEPDIR)/vdc.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f huc6270/$(DEPDIR)/$(am__dirstamp) + -rm -f huc6270/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf huc6270/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf huc6270/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/hw_video/huc6270/vdc.cpp b/Mednafen/mednafen/hw_video/huc6270/vdc.cpp new file mode 100644 index 0000000000..acf01208f4 --- /dev/null +++ b/Mednafen/mednafen/hw_video/huc6270/vdc.cpp @@ -0,0 +1,1913 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* VDC emulation */ + +#include +#include +#include + +#include +#include +#include "vdc.h" + +#define VDC_DEBUG(x, ...) { } +//#define VDC_DEBUG(x, ...) printf(x ": HPhase=%d, HPhaseCounter=%d, RCRCount=%d\n", ## __VA_ARGS__, HPhase, HPhaseCounter, RCRCount); + +#define VDC_UNDEFINED(format, ...) { } +//#define VDC_UNDEFINED(format, ...) printf(format " RCRCount=%d" "\n", ## __VA_ARGS__, RCRCount) + +#define VDC_WARNING(format, ...) { } +//#define VDC_WARNING(format, ...) { printf(format "\n", ## __VA_ARGS__); } + +#define ULE_BG 1 +#define ULE_SPR 2 + +static const unsigned int bat_width_tab[4] = { 32, 64, 128, 128 }; +static const unsigned int bat_width_shift_tab[4] = { 5, 6, 7, 7 }; +static const unsigned int bat_height_tab[2] = { 32, 64 }; + +void VDC::FixTileCache(uint16 A) +{ + uint32 charname = (A >> 4); + uint32 y = (A & 0x7); + uint8 *tc = bg_tile_cache[charname][y]; + + uint32 bitplane01 = VRAM[y + charname * 16]; + uint32 bitplane23 = VRAM[y+ 8 + charname * 16]; + + for(int x = 0; x < 8; x++) + { + uint32 raw_pixel = ((bitplane01 >> x) & 1); + raw_pixel |= ((bitplane01 >> (x + 8)) & 1) << 1; + raw_pixel |= ((bitplane23 >> x) & 1) << 2; + raw_pixel |= ((bitplane23 >> (x + 8)) & 1) << 3; + tc[7 - x] = raw_pixel; + } +} + +// Some virtual vdc macros to make code simpler to read +#define M_vdc_HSW (HSR & 0x1F) // Horizontal Synchro Width +#define M_vdc_HDS ((HSR >> 8) & 0x7F) // Horizontal Display Start +#define M_vdc_HDW (HDR & 0x7F) // Horizontal Display Width +#define M_vdc_HDE ((HDR >> 8) & 0x7F) // Horizontal Display End + +#define M_vdc_VSW (VSR & 0x1F) // Vertical synchro width +#define M_vdc_VDS ((VSR >> 8) & 0xFF) // Vertical Display Start +#define M_vdc_VDW (VDR & 0x1FF) // Vertical Display Width(Height? :b) +#define M_vdc_VCR (VCR & 0xFF) + +#define M_vdc_EX ((CR >> 4) & 0x3) +#define M_vdc_TE ((CR >> 8) & 0x3) + +#define VDCS_CR 0x01 // Sprite #0 collision interrupt occurred +#define VDCS_OR 0x02 // sprite overflow "" "" +#define VDCS_RR 0x04 // RCR "" "" +#define VDCS_DS 0x08 // VRAM to SAT DMA completion interrupt occurred +#define VDCS_DV 0x10 // VRAM to VRAM DMA completion interrupt occurred +#define VDCS_VD 0x20 // Vertical blank interrupt occurred +#define VDCS_BSY 0x40 // VDC is waiting for a CPU access slot during the active display area?? + +uint32 VDC::GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case GSREG_SELECT: + value = select; + break; + + case GSREG_STATUS: + value = status; + break; + + case GSREG_MAWR: + value = MAWR; + break; + + case GSREG_MARR: + value = MARR; + break; + + case GSREG_CR: + value = CR; + + if(special) + { + trio_snprintf(special, special_len, "Sprite Hit IRQ: %s, Sprite Overflow IRQ: %s, RCR IRQ: %s, VBlank IRQ: %s, Sprites: %s, Background: %s", (value & 1) ? "On" : "Off", (value & 2) ? "On" : "Off", + (value & 4) ? "On" : "Off", (value & 8) ? "On" : "Off", (value & 0x40) ? "On" : "Off", (value & 0x80) ? "On" : "Off"); + } + break; + + case GSREG_RCR: + value = RCR; + break; + + case GSREG_BXR: + value = BXR; + break; + + case GSREG_BYR: + value = BYR; + break; + + case GSREG_MWR: + value = MWR; + + if(special) + { + trio_snprintf(special, special_len, "CG Mode: %d, BAT Width: %d(tiles), BAT Height: %d(tiles)", (int)(bool)(value & 0x80), + bat_width_tab[(value >> 4) & 0x3], + bat_height_tab[(value >> 6) & 0x1]); + } + break; + + case GSREG_HSR: + value = HSR; + if(special) + { + trio_snprintf(special, special_len, "HSW: %02x, HDS: %02x", value & 0x1F, (value >> 8) & 0x7F); + } + break; + + case GSREG_HDR: + value = HDR; + if(special) + { + trio_snprintf(special, special_len, "HDW: %02x, HDE: %02x", value & 0x7F, (value >> 8) & 0x7F); + } + break; + + + case GSREG_VSR: + value = VSR; + if(special) + { + trio_snprintf(special, special_len, "VSW: %02x, VDS: %02x", value & 0x1F, (value >> 8) & 0xFF); + } + break; + + case GSREG_VDR: + value = VDR; + break; + + case GSREG_VCR: + value = VCR; + break; + + case GSREG_DCR: + value = DCR; + if(special) + { + trio_snprintf(special, special_len, "SATB DMA IRQ: %s, VRAM DMA IRQ: %s, DMA Source Address: %s, DMA Dest Address: %s, Auto SATB DMA: %s", + (DCR & 0x1) ? "On" : "Off", (DCR & 0x2) ? "On" : "Off", (DCR & 0x4) ? "Decrement" : "Increment", (DCR & 0x8) ? "Decrement" : "Increment", + (DCR & 0x10) ? "On" : "Off"); + } + break; + + case GSREG_SOUR: + value = SOUR; + break; + + case GSREG_DESR: + value = DESR; + break; + + case GSREG_LENR: + value = LENR; + break; + + case GSREG_DVSSR: + value = DVSSR; + break; + } + + return(value); +} + +void VDC::SetRegister(const unsigned int id, const uint32 value) +{ + switch(id) + { + default: break; + + case GSREG_STATUS: + status = value & 0x3F; + break; + + case GSREG_SELECT: + select = value & 0x1F; + break; + + case GSREG_MAWR: + MAWR = value & 0xFFFF; + break; + + case GSREG_MARR: + MARR = value & 0xFFFF; + break; + + case GSREG_CR: + CR = value & 0xFFFF; + break; + + case GSREG_RCR: + RCR = value & 0x3FF; + break; + + case GSREG_BXR: + BXR = value & 0x3FF; + break; + + case GSREG_BYR: + BYR = value & 0x1FF; + break; + + case GSREG_MWR: + MWR = value & 0xFFFF; + break; + + case GSREG_HSR: + HSR = value & 0xFFFF; + break; + + case GSREG_HDR: + HDR = value & 0xFFFF; + break; + + case GSREG_VSR: + VSR = value & 0xFFFF; + break; + + case GSREG_VDR: + VDR = value & 0xFFFF; + break; + + case GSREG_VCR: + VCR = value & 0xFFFF; + break; + + case GSREG_DCR: + DCR = value & 0xFFFF; + break; + + case GSREG_SOUR: + SOUR = value & 0xFFFF; + break; + + case GSREG_DESR: + DESR = value & 0xFFFF; + break; + + case GSREG_LENR: + LENR = value & 0xFFFF; + break; + + case GSREG_DVSSR: + DVSSR = value & 0xFFFF; + break; + } +} + +void VDC::SetLayerEnableMask(uint64 mask) +{ + userle = mask; +} + +void VDC::RunSATDMA(int32 cycles, bool force_completion) +{ + assert(sat_dma_counter > 0); + + if(force_completion) + cycles = sat_dma_counter; + + sat_dma_counter -= cycles; + if(sat_dma_counter <= 0) + { + if(DCR & 0x01) + { + VDC_DEBUG("Sprite DMA IRQ"); + status |= VDCS_DS; + IRQHook(TRUE); + } + CheckAndCommitPending(); + burst_mode = true; + } +} + +void VDC::RunDMA(int32 cycles, bool force_completion) +{ + int num_transfers = 0; + + if(force_completion) + { + VDMA_CycleCounter = 0; + + num_transfers = 65536 * 2; + } + else + { + VDMA_CycleCounter += cycles; + num_transfers = VDMA_CycleCounter >> 1; + VDMA_CycleCounter -= num_transfers << 1; + } + + while(num_transfers--) + { + if(!DMAReadWrite) + { + if(SOUR >= VRAM_Size) + VDC_UNDEFINED("Unmapped VRAM DMA read"); + + DMAReadBuffer = VRAM[SOUR]; + //printf("DMA Read: %04x, %04x\n", SOUR, DMAReadBuffer); + } + else + { + if(DESR < VRAM_Size) + { + VRAM[DESR] = DMAReadBuffer; + FixTileCache(DESR); + } + + SOUR += (((DCR & 0x4) >> 1) ^ 2) - 1; + DESR += (((DCR & 0x8) >> 2) ^ 2) - 1; + LENR--; + + if(LENR == 0xFFFF) // DMA is done. + { + DMARunning = 0; // Clear this BEFORE CheckAndCommitPending() + + CheckAndCommitPending(); + + if(DCR & 0x02) + { + status |= VDCS_DV; + IRQHook(TRUE); + VDC_DEBUG("DMA IRQ"); + } + break; + } + } + DMAReadWrite ^= 1; + } +} + +/* + ChrlyMac: Was it you who determined exactly how many VDC clocks the SAT DMA took? + I know someone did, but I can't remember the results... + 1024 + It happens at the VDW->VCR transition +*/ + +void VDC::IncRCR(void) +{ + if(NeedBGYInc) + { + NeedBGYInc = false; + if(0 == RCRCount) + BG_YMoo = BYR; + else + BG_YMoo++; + } + + NeedBGYInc = true; + RCRCount++; + + VPhaseCounter--; + + if(VPhaseCounter <= 0) + { + VPhase = (VPhase + 1) % VPHASE_COUNT; + switch(VPhase) + { + case VPHASE_VDS: VPhaseCounter = VDS_cache + 2; + break; + + case VPHASE_VDW: VPhaseCounter = VDW_cache + 1; + //BG_YMoo = BYR - 1; + RCRCount = 0; + burst_mode = !(CR & 0xC0); + NeedVBIRQTest = true; + NeedSATDMATest = true; + + if(!burst_mode) + { + if(sat_dma_counter > 0) + { + printf("SAT DMA cancelled???\n"); + sat_dma_counter = 0; + CheckAndCommitPending(); + } + if(DMARunning) + { + printf("DMA Running Cancelled\n"); + DMARunning = false; + CheckAndCommitPending(); + } + } + break; + + case VPHASE_VCR: VPhaseCounter = VCR_cache; + break; + + case VPHASE_VSW: VPhaseCounter = VSW_cache + 1; + MWR_cache = MWR; + VDS_cache = M_vdc_VDS; + VSW_cache = M_vdc_VSW; + VDW_cache = M_vdc_VDW; + VCR_cache = M_vdc_VCR; + //VDC_WARNING("VSW Started"); + break; + } + } + + if(VPhase == VPHASE_VDW && !burst_mode) + { + FetchSpriteData(); + } + + if((int)RCRCount == ((int)RCR - 0x40) && (CR & 0x04)) + { + VDC_DEBUG("RCR IRQ"); + status |= VDCS_RR; + IRQHook(TRUE); + } +} + +void VDC::DoVBIRQTest(void) +{ + if(CR & 0x08) + { + VDC_DEBUG("VBlank IRQ"); + status |= VDCS_VD; + IRQHook(TRUE); + } +} + +static const int Cycles_Between_RCRIRQ_And_HDWEnd = 4; + +int VDC::TimeFromHDSStartToBYRLatch(void) +{ + int ret = 1; + + if(HDS_cache > 2) + ret += ((HDS_cache + 1) * 8) - 24 + 2; + + + //printf("%d, %d\n", HDS_cache, ret); + + return(ret); +} + +int VDC::TimeFromBYRLatchToBXRLatch(void) +{ + int ret = 2; + + if(HDS_cache > 2) + ret = 1; + + return(ret); +} + +void VDC::HDS_Start(void) +{ + if(NeedRCRInc) + { + IncRCR(); + NeedRCRInc = false; + } + + if(sprite_cg_fetch_counter > 0) + { + VDC_WARNING("Sprite truncation on %d. Wanted sprites: %d, cycles needed but not left: %d\n", RCRCount, active_sprites, sprite_cg_fetch_counter); + sprite_cg_fetch_counter = 0; + CheckAndCommitPending(); + } + + HSW_cache = M_vdc_HSW; + HDS_cache = M_vdc_HDS; + HDW_cache = M_vdc_HDW; + HDE_cache = M_vdc_HDE; + + VDC_DEBUG("HDS Start! HSW: %d, HDW: %d, HDW: %d, HDE: %d\n", HSW_cache, HDS_cache, HDW_cache, HDE_cache); + + CR_cache = CR; + + HPhase = HPHASE_HDS; + HPhaseCounter = TimeFromHDSStartToBYRLatch(); +} + +int32 VDC::HSync(bool hb) +{ + if(M_vdc_EX) + { + in_exhsync = 0; + return(CalcNextEvent()); + } + in_exhsync = hb; + + if(hb) // Going into hsync + { + mystery_counter = 48; + mystery_phase = false; + } + else // Leaving hsync + { + HPhase = HPHASE_HSW; + HPhaseCounter = 8; + + //HDS_Start(); + //HPhaseCounter += 8; + + pixel_copy_count = 0; + } + + + return(CalcNextEvent()); +} + +int32 VDC::VSync(bool vb) +{ + if(M_vdc_EX >= 0x2) + { + in_exvsync = 0; + return(CalcNextEvent()); + } + in_exvsync = vb; + + //printf("VBlank: %d\n", vb); + if(vb) // Going into vsync + { + NeedRCRInc = false; + NeedBGYInc = false; +/* if(NeedRCRInc) + { + IncRCR(); + NeedRCRInc = false; + } +*/ + MWR_cache = MWR; + + VDS_cache = M_vdc_VDS; + VSW_cache = M_vdc_VSW; + VDW_cache = M_vdc_VDW; + VCR_cache = M_vdc_VCR; + + VPhase = VPHASE_VSW; + VPhaseCounter = VSW_cache + 1; + } + else // Leaving vsync + { + + } + return(CalcNextEvent()); +} + +//int32 VDC::Run(int32 clocks, bool hs, bool vs, uint16 *pixels, bool skip) +int32 VDC::Run(int32 clocks, uint16 *pixels, bool skip) +{ + //uint16 *spixels = pixels; + + //puts("Run begin"); + //fflush(stdout); + + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(chunk_clocks > HPhaseCounter) + { + chunk_clocks = HPhaseCounter; + } + + if(sat_dma_counter > 0 && chunk_clocks > sat_dma_counter) + chunk_clocks = sat_dma_counter; + + if(sprite_cg_fetch_counter > 0 && chunk_clocks > sprite_cg_fetch_counter) + chunk_clocks = sprite_cg_fetch_counter; + + if(mystery_counter > 0 && chunk_clocks > mystery_counter) + chunk_clocks = mystery_counter; + + if(mystery_counter > 0) + { + mystery_counter -= chunk_clocks; + if(mystery_counter <= 0) + { + mystery_phase = !mystery_phase; + if(mystery_phase) + mystery_counter = 16; + else + CheckAndCommitPending(); + } + } + + if(sprite_cg_fetch_counter > 0) + { + sprite_cg_fetch_counter -= chunk_clocks; + if(sprite_cg_fetch_counter <= 0) + CheckAndCommitPending(); + } + + if(VPhase != VPHASE_VDW) + { + if(NeedSATDMATest) + { + NeedSATDMATest = false; + if(SATBPending || (DCR & 0x10)) + { + SATBPending = 0; + + sat_dma_counter = 1024; + + if(DVSSR > (VRAM_Size - 0x100)) + VDC_UNDEFINED("Unmapped VRAM DVSSR DMA read"); + + if(DVSSR < VRAM_Size) + { + uint32 len = 256; + if(DVSSR > (VRAM_Size - 0x100)) + len = VRAM_Size - DVSSR; + memcpy(SAT, &VRAM[DVSSR], len * sizeof(uint16)); + } + } + else + burst_mode = true; + } + } + + + + + if(DMAPending && burst_mode) + { + VDC_DEBUG("DMA Started"); + DMAPending = false; + DMARunning = true; + VDMA_CycleCounter = 0; + DMAReadWrite = 0; + } + + if(sat_dma_counter > 0) + RunSATDMA(chunk_clocks); + else if(DMARunning) + RunDMA(chunk_clocks); + + if(pixel_copy_count > 0) + { + if(!skip) + { + for(int i = 0; i < chunk_clocks; i++) + pixels[i] = linebuf[pixel_desu + i]; + //memcpy(pixels, linebuf + pixel_desu, chunk_clocks * sizeof(uint16)); + + if(M_vdc_TE == 0x1) + for(int i = 0; i < chunk_clocks; i++) + pixels[i] |= VDC_DISP_OUT_MASK; + } + + pixel_desu += chunk_clocks; + pixel_copy_count -= chunk_clocks; + } + else + { + uint16 pix = 0x100; + + if(M_vdc_TE == 0x1) + { + if(HPhase != HPHASE_HDS && HPhase != HPHASE_HDS_PART2 && HPhase != HPHASE_HDS_PART3) + pix |= VDC_DISP_OUT_MASK; + } + + if(HPhase == HPHASE_HSW) + { + if(M_vdc_EX >= 0x1) + pix |= VDC_HSYNC_OUT_MASK; + + if(M_vdc_TE >= 0x2) + pix |= VDC_DISP_OUT_MASK; + } + if(VPhase == VPHASE_VSW && M_vdc_EX >= 0x2) + pix |= VDC_VSYNC_OUT_MASK; + + if(!(userle & 1)) + pix |= VDC_BGDISABLE_OUT_MASK; + + if(!skip) + { + for(int i = 0; i < chunk_clocks; i++) + pixels[i] = pix; + } + } + + HPhaseCounter -= chunk_clocks; + + assert(HPhaseCounter >= 0); + + while(HPhaseCounter <= 0) + { + HPhase = (HPhase + 1) % HPHASE_COUNT; + + switch(HPhase) + { + case HPHASE_HDS: HDS_Start(); + break; + + + case HPHASE_HDS_PART2: + HPhaseCounter = TimeFromBYRLatchToBXRLatch(); + + if(NeedBGYInc && !in_exhsync) + { + NeedBGYInc = false; + + if(0 == RCRCount) + BG_YMoo = BYR; + else + BG_YMoo++; + } + BG_YOffset = BG_YMoo; + break; + + case HPHASE_HDS_PART3: + HPhaseCounter = (HDS_cache + 1) * 8 - TimeFromHDSStartToBYRLatch() - TimeFromBYRLatchToBXRLatch(); + + assert(HPhaseCounter > 0); + + BG_XOffset = BXR; + break; + + case HPHASE_HDW: + NeedRCRInc = true; + if(VPhase != VPHASE_VDW && NeedVBIRQTest) + { + DoVBIRQTest(); + NeedVBIRQTest = false; + } + CheckAndCommitPending(); + + HPhaseCounter = (HDW_cache + 1) * 8 - Cycles_Between_RCRIRQ_And_HDWEnd; + if(VPhase == VPHASE_VDW) + { + if(!burst_mode) + { + pixel_desu = 0; + pixel_copy_count = (HDW_cache + 1) * 8; + + // BG off, sprite on: fill = 0x100. bg off, sprite off: fill = 0x000 + if(!(CR_cache & 0x80)) + { + uint16 fill_val; + + if(!(CR_cache & 0xC0)) // Sprites and BG off + fill_val = 0x000; + else // Only BG off + fill_val = 0x100 | ((userle & ULE_BG) ? 0 : VDC_BGDISABLE_OUT_MASK); + + if(!(userle & ULE_BG)) + fill_val |= VDC_BGDISABLE_OUT_MASK; + + for(int i = 0; i < pixel_copy_count; i++) + linebuf[i] = fill_val; + } + + if(!skip) + if(CR_cache & 0x80) + { + DrawBG(linebuf, userle & ULE_BG); + } + //printf("%d %02x %02x\n", RCRCount, CR, CR_cache); + if(CR_cache & 0x40) + DrawSprites(linebuf, (userle & ULE_SPR) && !skip); + } + } + break; + + case HPHASE_HDW_FINAL: + if(NeedRCRInc) + { + IncRCR(); + NeedRCRInc = false; + } + HPhaseCounter = Cycles_Between_RCRIRQ_And_HDWEnd; + break; + + case HPHASE_HDE: //if(!burst_mode) //if(VPhase == VPHASE_VDW) //if(!burst_mode) + // lastats = 16; // + 16; + //else + // lastats = 16; + HPhaseCounter = (HDE_cache + 1) * 8; + break; + + case HPHASE_HSW: HPhaseCounter = (HSW_cache + 1) * 8; break; + } + } + pixels += chunk_clocks; + clocks -= chunk_clocks; + } + + //puts("Run end"); + //fflush(stdout); + + return(CalcNextEvent()); +} + + +void VDC::CalcWidthStartEnd(uint32 &display_width, uint32 &start, uint32 &end) +{ + display_width = (M_vdc_HDW + 1) * 8; + + start = 0; + end = start + display_width; +} + +void VDC::DrawBG(uint16 *target, int enabled) +{ + uint32 width; + uint32 start; + uint32 end; + int bat_width = bat_width_tab[(MWR_cache >> 4) & 3]; + int bat_width_mask = bat_width - 1; + int bat_width_shift = bat_width_shift_tab[(MWR_cache >> 4) & 3]; + int bat_height_mask = bat_height_tab[(MWR_cache >> 6) & 1] - 1; + + CalcWidthStartEnd(width, start, end); + + if(!enabled) + { + for(uint32 x = start; x < end; x++) + target[x] = 0x000 | VDC_BGDISABLE_OUT_MASK; + return; + } + + { + int bat_y = ((BG_YOffset >> 3) & bat_height_mask) << bat_width_shift; + uint32 first_end = start + 8 - (BG_XOffset & 7); + uint32 dohmask = 0xFFFFFFFF; + + if((MWR_cache & 0x3) == 0x3) + { + if(MWR_cache & 0x80) + dohmask = 0xCCCCCCCC; + else + dohmask = 0x33333333; + } + + // Draw the first pixels of the first tile, depending on the lower 3 bits of the xscroll/xoffset register, to + // we can render the rest of the line in 8x1 chunks, which is faster. + for(uint32 x = start; x < first_end; x++) + { + int bat_x = (BG_XOffset >> 3) & bat_width_mask; + uint16 bat = VRAM[bat_x | bat_y]; + const uint8 pal_or = ((bat >> 8) & 0xF0); + int palette_index = ((bat >> 12) & 0x0F) << 4; + uint32 raw_pixel; + + raw_pixel = bg_tile_cache[bat & 0xFFF][BG_YOffset & 7][BG_XOffset & 0x7] & dohmask; + target[x] = palette_index | raw_pixel | pal_or; + + if((bat & 0xFFF) > VRAM_BGTileNoMask) + VDC_UNDEFINED("Unmapped BG tile read"); + + BG_XOffset++; + } + + int bat_boom = (BG_XOffset >> 3) & bat_width_mask; + int line_sub = BG_YOffset & 7; + + if((MWR_cache & 0x3) == 0x3) + { + for(uint32 x = first_end; x < end; x+=8) + { + const uint16 bat = VRAM[bat_boom | bat_y]; + const uint8 pal_or = ((bat >> 8) & 0xF0); + uint8 *pix_lut = bg_tile_cache[bat & 0xFFF][line_sub]; + + if((bat & 0xFFF) > VRAM_BGTileNoMask) + VDC_UNDEFINED("Unmapped BG tile read"); + + + (target + 0)[x] = (pix_lut[0] & dohmask) | pal_or; + (target + 1)[x] = (pix_lut[1] & dohmask) | pal_or; + (target + 2)[x] = (pix_lut[2] & dohmask) | pal_or; + (target + 3)[x] = (pix_lut[3] & dohmask) | pal_or; + (target + 4)[x] = (pix_lut[4] & dohmask) | pal_or; + (target + 5)[x] = (pix_lut[5] & dohmask) | pal_or; + (target + 6)[x] = (pix_lut[6] & dohmask) | pal_or; + (target + 7)[x] = (pix_lut[7] & dohmask) | pal_or; + + bat_boom = (bat_boom + 1) & bat_width_mask; + BG_XOffset++; + + } + } + else + for(uint32 x = first_end; x < end; x+=8) // This will draw past the right side of the buffer, but since our pitch is 1024, and max width is ~512, we're safe. Also, + // any overflow that is on the visible screen are will be hidden by the overscan color code below this code. + { + const uint16 bat = VRAM[bat_boom | bat_y]; + const uint8 pal_or = ((bat >> 8) & 0xF0); + uint8 *pix_lut = bg_tile_cache[bat & 0xFFF][line_sub]; + + if((bat & 0xFFF) > VRAM_BGTileNoMask) + VDC_UNDEFINED("Unmapped BG tile read"); + + (target + 0)[x] = pix_lut[0] | pal_or; + (target + 1)[x] = pix_lut[1] | pal_or; + (target + 2)[x] = pix_lut[2] | pal_or; + (target + 3)[x] = pix_lut[3] | pal_or; + (target + 4)[x] = pix_lut[4] | pal_or; + (target + 5)[x] = pix_lut[5] | pal_or; + (target + 6)[x] = pix_lut[6] | pal_or; + (target + 7)[x] = pix_lut[7] | pal_or; + + bat_boom = (bat_boom + 1) & bat_width_mask; + BG_XOffset++; + } + } +} + +#define SPRF_PRIORITY 0x00080 +#define SPRF_HFLIP 0x00800 +#define SPRF_VFLIP 0x08000 +#define SPRF_SPRITE0 0x10000 + +static const unsigned int sprite_height_tab[4] = { 16, 32, 64, 64 }; +static const unsigned int sprite_height_no_mask[4] = { ~0U, ~2U, ~6U, ~6U }; +static const unsigned int sprite_width_tab[2] = { 16, 32 }; + +void VDC::FetchSpriteData(void) +{ + active_sprites = 0; + + // First, grab the up to 16 sprites. + for(int i = 0; i < 64; i++) + { + int16 y = (SAT[i * 4 + 0] & 0x3FF) - 0x40; + uint16 x = (SAT[i * 4 + 1] & 0x3FF); + uint16 no = (SAT[i * 4 + 2] >> 1) & 0x3FF; // Todo, cg mode bit + uint16 flags = (SAT[i * 4 + 3]); + + uint32 palette_index = (flags & 0xF) << 4; + uint32 height = sprite_height_tab[(flags >> 12) & 3]; + uint32 width = sprite_width_tab[(flags >> 8) & 1]; + + if((int32)RCRCount >= y && (int32)RCRCount < (int32)(y + height)) + { + bool second_half = 0; + uint32 y_offset = RCRCount - y; + if(y_offset > height) continue; + + + breepbreep: + + if(active_sprites == 16) + { + if(CR & 0x2) + { + status |= VDCS_OR; + IRQHook(TRUE); + VDC_DEBUG("Overflow IRQ"); + } + if(!unlimited_sprites) + break; + } + + + { + if(flags & SPRF_VFLIP) + y_offset = height - 1 - y_offset; + + no &= sprite_height_no_mask[(flags >> 12) & 3]; + no |= (y_offset & 0x30) >> 3; + if(width == 32) no &= ~1; + if(second_half) + no |= 1; + + SpriteList[active_sprites].flags = flags; + + if(flags & SPRF_HFLIP && width == 32) + no ^= 1; + //printf("Found: %d %d\n", RCRCount, x); + SpriteList[active_sprites].x = x; + SpriteList[active_sprites].palette_index = palette_index; + + if((no * 64) >= VRAM_Size) + VDC_UNDEFINED("Unmapped VRAM sprite tile read"); + + if((MWR_cache & 0xC) == 4) + { + if(SAT[i * 4 + 2] & 1) + { + SpriteList[active_sprites].pattern_data[0] = VRAM[no * 64 + (y_offset & 15) + 32]; + SpriteList[active_sprites].pattern_data[1] = VRAM[no * 64 + (y_offset & 15) + 48]; + SpriteList[active_sprites].pattern_data[2] = 0; + SpriteList[active_sprites].pattern_data[3] = 0; + } + else + { + SpriteList[active_sprites].pattern_data[0] = VRAM[no * 64 + (y_offset & 15) ]; + SpriteList[active_sprites].pattern_data[1] = VRAM[no * 64 + (y_offset & 15) + 16]; + SpriteList[active_sprites].pattern_data[2] = 0; + SpriteList[active_sprites].pattern_data[3] = 0; + } + } + else + { + SpriteList[active_sprites].pattern_data[0] = VRAM[no * 64 + (y_offset & 15) ]; + SpriteList[active_sprites].pattern_data[1] = VRAM[no * 64 + (y_offset & 15) + 16]; + SpriteList[active_sprites].pattern_data[2] = VRAM[no * 64 + (y_offset & 15) + 32]; + SpriteList[active_sprites].pattern_data[3] = VRAM[no * 64 + (y_offset & 15) + 48]; + } + + SpriteList[active_sprites].flags |= i ? 0 : SPRF_SPRITE0; + + active_sprites++; + + if(width == 32 && !second_half) + { + second_half = 1; + x += 16; + y_offset = RCRCount - y; // Fix the y offset so that sprites that are hflipped + vflipped display properly + goto breepbreep; + } + } + } + } + + sprite_cg_fetch_counter = ((active_sprites < 16) ? active_sprites : 16) * 4; +} + +void VDC::DrawSprites(uint16 *target, int enabled) +{ + alignas(16) uint16 sprite_line_buf[1024]; + + uint32 display_width, start, end; + + CalcWidthStartEnd(display_width, start, end); + + for(unsigned int i = start; i < end; i++) + sprite_line_buf[i] = 0; + + for(int i = (active_sprites - 1) ; i >= 0; i--) + { + int32 pos = SpriteList[i].x - 0x20 + start; + uint32 prio_or = 0; + + if(SpriteList[i].flags & SPRF_PRIORITY) + prio_or = 0x200; + + if((SpriteList[i].flags & SPRF_SPRITE0) && (CR & 0x01)) + { + for(uint32 x = 0; x < 16; x++) + { + uint32 raw_pixel; + uint32 pi = SpriteList[i].palette_index; + uint32 rev_x = 15 - x; + + if(SpriteList[i].flags & SPRF_HFLIP) + rev_x = x; + + raw_pixel = (SpriteList[i].pattern_data[0] >> rev_x) & 1; + raw_pixel |= ((SpriteList[i].pattern_data[1] >> rev_x) & 1) << 1; + raw_pixel |= ((SpriteList[i].pattern_data[2] >> rev_x) & 1) << 2; + raw_pixel |= ((SpriteList[i].pattern_data[3] >> rev_x) & 1) << 3; + + if(raw_pixel) + { + pi |= 0x100; + uint32 tx = pos + x; + + if(tx >= end) // Covers negative and overflowing the right side. + continue; + + if(sprite_line_buf[tx] & 0xF) + { + status |= VDCS_CR; + VDC_DEBUG("Sprite hit IRQ"); + IRQHook(TRUE); + } + sprite_line_buf[tx] = pi | raw_pixel | prio_or; + } + } + } // End sprite hit loop + else + { + for(uint32 x = 0; x < 16; x++) + { + uint32 raw_pixel; + uint32 pi = SpriteList[i].palette_index; + uint32 rev_x = 15 - x; + + if(SpriteList[i].flags & SPRF_HFLIP) + rev_x = x; + + raw_pixel = (SpriteList[i].pattern_data[0] >> rev_x) & 1; + raw_pixel |= ((SpriteList[i].pattern_data[1] >> rev_x) & 1) << 1; + raw_pixel |= ((SpriteList[i].pattern_data[2] >> rev_x) & 1) << 2; + raw_pixel |= ((SpriteList[i].pattern_data[3] >> rev_x) & 1) << 3; + + if(raw_pixel) + { + pi |= 0x100; + uint32 tx = pos + x; + + if(tx >= end) // Covers negative and overflowing the right side. + continue; + sprite_line_buf[tx] = pi | raw_pixel | prio_or; + } + } + } // End non-sprite-hit loop + } + + if(enabled) + { + for(unsigned int x = start; x < end; x++) + { + if(sprite_line_buf[x] & 0x0F) + { + if(!(target[x] & 0x0F) || (sprite_line_buf[x] & 0x200)) + target[x] = sprite_line_buf[x] & 0x1FF; + } + } + } + active_sprites = 0; +} + +/* + Caution: If we ever add something to Write() or Read() that will affect the timing of the next event, make sure + to set the passed-by-reference next_event BEFORE calling this function, or otherwise re-engineer this convoluted setup. +*/ +void VDC::DoWaitStates(void) +{ + //bool did_wait = VDC_IS_BSY; + + while(VDC_IS_BSY) + { + //int32 to_wait = CalcNextEvent(); + //if(!WSHook || !WSHook(to_wait)) + if(!WSHook || !WSHook(-1)) // Event-counter-based wait-stating + { + if(DMARunning) + { + VDC_WARNING("VRAM DMA completion forced."); + RunDMA(0, TRUE); + } + + if(sat_dma_counter > 0) + { + VDC_WARNING("SAT DMA completion forced."); + RunSATDMA(0, TRUE); + } + + if(mystery_phase) + { + bool backup_mystery_phase = mystery_phase; + mystery_phase = false; + CheckAndCommitPending(); + mystery_phase = backup_mystery_phase; + } + + break; + } + } + + //if(did_wait) + // printf("End of wait stating: %d %d\n", VDMA_CycleCounter, sat_dma_counter); + + assert(!pending_read); + assert(!pending_write); +} + +uint8 VDC::Read(uint32 A, int32 &next_event, bool peek) +{ + uint8 ret = 0; + int msb = A & 1; + + A &= 0x3; + + switch(A) + { + case 0x0: ret = status | (VDC_IS_BSY ? 0x40 : 0x00); + + if(!peek) + { + status &= ~0x3F; + IRQHook(FALSE); + } + break; + + case 0x2: + case 0x3: + if(!peek) + { + // Should we only wait on MSB reads... + DoWaitStates(); + } + + ret = VDC_REGGETP(read_buffer, msb); + + if(select == 0x2) // VRR - VRAM Read Register + { + if(msb) + { + if(!peek) + { + pending_read = TRUE; + pending_read_addr = MARR; + MARR += vram_inc_tab[(CR >> 11) & 0x3]; + + CheckAndCommitPending(); + } + } + } + break; + } + + return(ret); +} + +uint16 VDC::Read16(bool A, bool peek) +{ + uint16 ret = 0; + + if(!A) + { + ret = status | (VDC_IS_BSY ? 0x40 : 0x00); + + if(!peek) + { + status &= ~0x3F; + IRQHook(FALSE); + } + } + else + { + if(!peek) + DoWaitStates(); + + ret = read_buffer; + + if(select == 0x2) // VRR - VRAM Read Register + { + if(!peek) + { + pending_read = TRUE; + pending_read_addr = MARR; + MARR += vram_inc_tab[(CR >> 11) & 0x3]; + + CheckAndCommitPending(); + } + } + } + + return(ret); +} + + +void VDC::CheckAndCommitPending(void) +{ + if(sat_dma_counter <= 0 && !DMARunning /* && sprite_cg_fetch_counter <= 0*/ && !mystery_phase) + { + if(pending_write) + { + if(pending_write_addr < VRAM_Size) + { + VRAM[pending_write_addr] = pending_write_latch; + FixTileCache(pending_write_addr); + } + //else + // VDC_UNDEFINED("Unmapped VRAM write"); + + pending_write = FALSE; + } + + if(pending_read) + { + if(pending_read_addr >= VRAM_Size) + VDC_UNDEFINED("Unmapped VRAM VRR read"); + + read_buffer = VRAM[pending_read_addr]; + pending_read = FALSE; + } + } +} + + +void VDC::Write(uint32 A, uint8 V, int32 &next_event) +{ + int msb = A & 1; + + A &= 0x3; + + //if((A == 0x2 || A == 0x3) && (select >= 0xF && select <= 0x12)) + //if((A == 2 || A == 3) && select != 2) + // printf("VDC Write(RCRCount=%d): A=%02x, Select=%02x, V=%02x\n", RCRCount, A, select, V); + + switch(A) + { + case 0x0: select = V & 0x1F; + break; + + case 0x2: + case 0x3: + //if((select & 0x1F) >= 0x9 && (select & 0x1F) <= 0x1F) + // VDC_DEBUG("%02x %d, %02x", select & 0x1F, msb, V); + + switch(select & 0x1F) + { + case 0x00: VDC_REGSETP(MAWR, V, msb); + break; + + case 0x01: VDC_REGSETP(MARR, V, msb); + if(msb) + { + DoWaitStates(); + + pending_read = TRUE; + pending_read_addr = MARR; + MARR += vram_inc_tab[(CR >> 11) & 0x3]; + + CheckAndCommitPending(); + } + break; + + case 0x02: if(!msb) + { + write_latch = V; + } + else + { + // We must call CommitPendingWrite at the end of SAT/VRAM DMA for this to work! + DoWaitStates(); + + pending_write = TRUE; + pending_write_addr = MAWR; + pending_write_latch = write_latch | (V << 8); + MAWR += vram_inc_tab[(CR >> 11) & 0x3]; + + CheckAndCommitPending(); + } + break; + + case 0x05: VDC_REGSETP(CR, V, msb); + //printf("CR: %04x, %d\n", CR, msb); + break; + + case 0x06: VDC_REGSETP(RCR, V, msb); + RCR &= 0x3FF; + break; + + case 0x07: VDC_REGSETP(BXR, V, msb); + BXR &= 0x3FF; + //VDC_DEBUG("BXR Set"); + break; + + case 0x08: VDC_REGSETP(BYR, V, msb); + BYR &= 0x1FF; + BG_YMoo = BYR; // Set it on LSB and MSB writes(only changing on MSB breaks Youkai Douchuuki) + //VDC_DEBUG("BYR Set"); + break; + + case 0x09: VDC_REGSETP(MWR, V, msb); break; + case 0x0a: VDC_REGSETP(HSR, V, msb); break; + case 0x0b: VDC_REGSETP(HDR, V, msb); break; + case 0x0c: VDC_REGSETP(VSR, V, msb); break; + case 0x0d: VDC_REGSETP(VDR, V, msb); break; + case 0x0e: VDC_REGSETP(VCR, V, msb); break; + case 0x0f: VDC_REGSETP(DCR, V, msb); + if(DMARunning) + { + VDC_UNDEFINED("Set DCR during DMA: %04x\n", DCR); + } + + if(DMAPending) + { + VDC_UNDEFINED("Set DCR while DMAPending: %04x\n", DCR); + } + + break; + + case 0x10: VDC_REGSETP(SOUR, V, msb); + if(DMARunning) + { + VDC_UNDEFINED("Set SOUR during DMA: %04x\n", SOUR); + } + + if(DMAPending) + { + VDC_UNDEFINED("Set SOUR while DMAPending: %04x\n", SOUR); + } + break; + + case 0x11: VDC_REGSETP(DESR, V, msb); + if(DMARunning) + { + VDC_UNDEFINED("Set DESR during DMA: %04x\n", DESR); + } + if(DMAPending) + { + VDC_UNDEFINED("Set DESR while DMAPending: %04x\n", DESR); + } + break; + + case 0x12: VDC_REGSETP(LENR, V, msb); + if(DMARunning) + { + VDC_UNDEFINED("Set LENR during DMA: %04x\n", LENR); + } + + if(DMAPending) + { + VDC_UNDEFINED("Set LENR while DMAPending: %04x\n", LENR); + } + + if(msb) + { + VDC_DEBUG("DMA: %04x %04x %04x, %02x", SOUR, DESR, LENR, DCR); + DMAPending = 1; + } + break; + + case 0x13: VDC_REGSETP(DVSSR, V, msb); + SATBPending = 1; + break; + + default: VDC_WARNING("Unknown VDC register write: %04x %02x", select, V); + break; + } + break; + } +} + + +void VDC::Write16(bool A, uint16 V) +{ + if(!A) + select = V & 0x1F; + else + { + switch(select & 0x1F) + { + case 0x00: MAWR = V; + break; + + + case 0x01: MARR = V; + + DoWaitStates(); + + pending_read = TRUE; + pending_read_addr = MARR; + + MARR += vram_inc_tab[(CR >> 11) & 0x3]; + + CheckAndCommitPending(); + break; + + + case 0x02: // We must call CommitPendingWrite at the end of SAT/VRAM DMA for this to work! + DoWaitStates(); + + pending_write = TRUE; + pending_write_addr = MAWR; + pending_write_latch = V; + MAWR += vram_inc_tab[(CR >> 11) & 0x3]; + + CheckAndCommitPending(); + break; + + case 0x05: CR = V; + break; + + case 0x06: RCR = V & 0x3FF; + break; + + case 0x07: BXR = V & 0x3FF; + //VDC_DEBUG("BXR Set"); + break; + + case 0x08: BYR = V & 0x1FF; + BG_YMoo = BYR; + //VDC_DEBUG("BYR Set"); + break; + + case 0x09: MWR = V; break; + case 0x0a: HSR = V; break; + case 0x0b: HDR = V; break; + case 0x0c: VSR = V; break; + case 0x0d: VDR = V; break; + case 0x0e: VCR = V; break; + + case 0x0f: DCR = V; + if(DMARunning) + { + VDC_UNDEFINED("Set DCR during DMA: %04x\n", DCR); + } + + if(DMAPending) + { + VDC_UNDEFINED("Set DCR while DMAPending: %04x\n", DCR); + } + + break; + + case 0x10: SOUR = V; + if(DMARunning) + { + VDC_UNDEFINED("Set SOUR during DMA: %04x\n", SOUR); + } + + if(DMAPending) + { + VDC_UNDEFINED("Set SOUR while DMAPending: %04x\n", SOUR); + } + break; + + case 0x11: DESR = V; + if(DMARunning) + { + VDC_UNDEFINED("Set DESR during DMA: %04x\n", DESR); + } + if(DMAPending) + { + VDC_UNDEFINED("Set DESR while DMAPending: %04x\n", DESR); + } + break; + + case 0x12: LENR = V; + if(DMARunning) + { + VDC_UNDEFINED("Set LENR during DMA: %04x\n", LENR); + } + + if(DMAPending) + { + VDC_UNDEFINED("Set LENR while DMAPending: %04x\n", LENR); + } + + VDC_DEBUG("DMA: %04x %04x %04x, %02x", SOUR, DESR, LENR, DCR); + + DMAPending = 1; + break; + + case 0x13: DVSSR = V; + SATBPending = 1; + break; + + default: VDC_WARNING("Oops 2: %04x %02x", select, V); + break; + } + } + +} + + + +int32 VDC::Reset(void) +{ + memset(VRAM, 0, sizeof(VRAM)); + memset(SAT, 0, sizeof(SAT)); + memset(SpriteList, 0, sizeof(SpriteList)); + + for(uint32 A = 0; A < 65536; A += 16) + FixTileCache(A); + + pending_read = false; + pending_read_addr = 0xFFFF; + read_buffer = 0xFFFF; + write_latch = 0; + + pending_write = false; + pending_write_addr = 0xFFFF; + pending_write_latch = 0xFFFF; + + status = 0; + + HSR = 0; + HDR = 0; + VSR = 0; + VDR = 0; + VCR = 0; + + HSW_cache = M_vdc_HSW; + HDS_cache = M_vdc_HDS; + HDW_cache = M_vdc_HDW; + HDE_cache = M_vdc_HDE; + + VDS_cache = M_vdc_VDS; + VSW_cache = M_vdc_VSW; + VDW_cache = M_vdc_VDW; + VCR_cache = M_vdc_VCR; + + + + MAWR = 0; + MARR = 0; + + CR = CR_cache = 0; + RCR = 0; + BXR = 0; + BYR = 0; + MWR = 0; + MWR_cache = 0; + + DCR = 0; + SOUR = 0; + DESR = 0; + LENR = 0; + DVSSR = 0; + + VDMA_CycleCounter = 0; + + RCRCount = 0; + + DMAReadBuffer = 0; + DMAReadWrite = 0; + DMARunning = 0; + DMAPending = 0; + SATBPending = 0; + burst_mode = 0; + + BG_XOffset = 0; + BG_YOffset = 0; + BG_YMoo = 0; + + sat_dma_counter = 0; + select = 0; + + pixel_copy_count = 0; + + + NeedRCRInc = false; + NeedVBIRQTest = false; + NeedSATDMATest = false; + NeedBGYInc = false; + + HPhase = 0; + VPhase = 0; + HPhaseCounter = 1; + VPhaseCounter = 1; + + sprite_cg_fetch_counter = 0; + + mystery_counter = 0; + mystery_phase = false; + + pixel_desu = 0; + pixel_copy_count = 0; + active_sprites = 0; + + return(CalcNextEvent()); +} + +VDC::VDC(bool nospritelimit, uint32 par_VRAM_Size) +{ + unlimited_sprites = nospritelimit; //MDFN_GetSettingB("pce.nospritelimit"); + userle = ~0; + + assert(par_VRAM_Size == round_up_pow2(par_VRAM_Size)); + assert(par_VRAM_Size >= 16 && par_VRAM_Size <= 65536); + + VRAM_Size = par_VRAM_Size; + VRAM_SizeMask = VRAM_Size - 1; + VRAM_BGTileNoMask = VRAM_SizeMask / 16; + + WSHook = NULL; + IRQHook = NULL; + + in_exhsync = false; + in_exvsync = false; +} + +VDC::~VDC() +{ + +} + +void VDC::StateExtra(MDFN::LEPacker &sl_packer, bool load) +{ + sl_packer.set_read_mode(load); + + for(int i = 0; i < 64 * 2; i++) + { + sl_packer ^ SpriteList[i].x; + sl_packer ^ SpriteList[i].flags; + sl_packer ^ SpriteList[i].palette_index; + + for(int pd = 0; pd < 4; pd++) + sl_packer ^ SpriteList[i].pattern_data[pd]; + } +} + +void VDC::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *sname) +{ + MDFN::LEPacker sl_packer; + + StateExtra(sl_packer, false); + + SFORMAT StateRegs[] = + { + SFVAR(in_exhsync), + SFVAR(in_exvsync), + + SFVARN(sat_dma_counter, "sat_dma_counter"), + + SFVARN(select, "select"), + SFVARN(MAWR, "MAWR"), + SFVARN(MARR, "MARR"), + SFVARN(CR, "CR"), + SFVAR(CR_cache), + SFVARN(RCR, "RCR"), + SFVARN(BXR, "BXR"), + SFVARN(BYR, "BYR"), + SFVARN(MWR, "MWR"), + + SFVARN(HSR, "HSR"), + SFVARN(HDR, "HDR"), + SFVARN(VSR, "VSR"), + SFVARN(VDR, "VDR"), + + SFVARN(VCR, "VCR"), + SFVARN(DCR, "DCR"), + SFVARN(SOUR, "SOUR"), + SFVARN(DESR, "DESR"), + SFVARN(LENR, "LENR"), + SFVARN(DVSSR, "SATB"), + + + SFVAR(VDMA_CycleCounter), + + SFVARN(RCRCount, "RCRCount"), + + + SFVAR(pending_read), + SFVAR(pending_read_addr), + SFVAR(read_buffer), + + SFVAR(write_latch), + + SFVAR(pending_write), + SFVAR(pending_write_addr), + SFVAR(pending_write_latch), + + SFVARN(status, "status"), + + SFARRAY16N(SAT, 0x100, "SAT"), + + SFARRAY16N(VRAM, VRAM_Size, "VRAM"), + + SFVARN(DMAReadBuffer, "DMAReadBuffer"), + SFVARN(DMAReadWrite, "DMAReadWrite"), + SFVARN(DMARunning, "DMARunning"), + SFVAR(DMAPending), + SFVARN(SATBPending, "SATBPending"), + SFVARN(burst_mode, "burst_mode"), + + SFVARN(BG_YOffset, "BG_YOffset"), + SFVARN(BG_XOffset, "BG_XOffset"), + + SFVAR(HSW_cache), + SFVAR(HDS_cache), + SFVAR(HDW_cache), + SFVAR(HDE_cache), + + SFVARN(VDS_cache, "VDS_cache"), + SFVARN(VSW_cache, "VSW_cache"), + SFVARN(VDW_cache, "VDW_cache"), + SFVARN(VCR_cache, "VCR_cache"), + SFVARN(MWR_cache, "MWR_cache"), + + + SFVAR(BG_YMoo), + SFVAR(NeedRCRInc), + SFVAR(NeedVBIRQTest), + SFVAR(NeedSATDMATest), + SFVAR(NeedBGYInc), + + SFVAR(HPhase), + SFVAR(VPhase), + SFVAR(HPhaseCounter), + SFVAR(VPhaseCounter), + + SFVAR(sprite_cg_fetch_counter), + + SFVAR(mystery_counter), + SFVAR(mystery_phase), + + SFVAR(active_sprites), + + SFARRAYN(&sl_packer[0], sl_packer.size(), "ExtraState"), + //SFARRAY(SpriteListTemp, sizeof(SpriteListTemp)), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, sname); + + if(load) + { + StateExtra(sl_packer, true); + + for(int x = 0; x < VRAM_Size; x++) + FixTileCache(x); + } +} + +#ifdef WANT_DEBUGGER +bool VDC::DoGfxDecode(uint32 *target, const uint32 *color_table, const uint32 TransparentColor, bool DecodeSprites, + int32 w, int32 h, int32 scroll) +{ + const uint32 *palette_ptr = color_table; + + if(DecodeSprites) + { + for(int y = 0; y < h; y++) + { + for(int x = 0; x < w; x += 16) + { + int which_tile = (x / 16) + (scroll + (y / 16)) * (w / 16); + + if(which_tile >= VRAM_Size / 64) + { + for(int sx = 0; sx < 16; sx++) + { + target[x + sx] = TransparentColor; + target[x + w * 1 + sx] = 0; + target[x + w * 2 + sx] = 0; + } + continue; + } + + uint16 cg[4]; + cg[0] = VRAM[which_tile * 64 + (y & 15)]; + cg[1] = VRAM[which_tile * 64 + (y & 15) + 16]; + cg[2] = VRAM[which_tile * 64 + (y & 15) + 32]; + cg[3] = VRAM[which_tile * 64 + (y & 15) + 48]; + for(int sx = 0; sx < 16; sx++) + { + int rev_sx = 15 - sx; + target[x + sx] = palette_ptr[(((cg[0] >> rev_sx) & 1) << 0) | + (((cg[1] >> rev_sx) & 1) << 1) | (((cg[2] >> rev_sx) & 1) << 2) | (((cg[3] >> rev_sx) & 1) << 3)]; + target[x + w * 1 + sx] = which_tile; + target[x + w * 2 + sx] = which_tile * 64; + } + } + target += w * 3; + } + } + else for(int y = 0; y < h; y++) + { + for(int x = 0; x < w; x+=8) + { + int which_tile = (x / 8) + (scroll + (y / 8)) * (w / 8); + + if(which_tile >= (VRAM_Size / 16)) + { + for(int sx = 0; sx < 8; sx++) + { + target[x + sx] = TransparentColor; + target[x + w * 1 + sx] = 0; + target[x + w * 2 + sx] = 0; + } + continue; + } + + target[x + 0] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][0]]; + target[x + 1] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][1]]; + target[x + 2] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][2]]; + target[x + 3] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][3]]; + target[x + 4] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][4]]; + target[x + 5] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][5]]; + target[x + 6] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][6]]; + target[x + 7] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][7]]; + + target[x + w*1 + 0]=target[x + w*1 + 1]=target[x + w*1 + 2]=target[x + w*1 + 3] = + target[x + w*1 + 4]=target[x + w*1 + 5]=target[x + w*1 + 6]=target[x + w*1 + 7] = which_tile; + + target[x + w*2 + 0]=target[x + w*2 + 1]=target[x + w*2 + 2]=target[x + w*2 + 3] = + target[x + w*2 + 4]=target[x + w*2 + 5]=target[x + w*2 + 6]=target[x + w*2 + 7] = which_tile * 16; + } + target += w * 3; + } + + return(1); +} +#endif + diff --git a/Mednafen/mednafen/hw_video/huc6270/vdc.h b/Mednafen/mednafen/hw_video/huc6270/vdc.h new file mode 100644 index 0000000000..7430d728f5 --- /dev/null +++ b/Mednafen/mednafen/hw_video/huc6270/vdc.h @@ -0,0 +1,533 @@ +#ifndef __PCE_VDC_H +#define __PCE_VDC_H + +#include + +#define VDC_PIXEL_OUT_MASK 0x01FF + +// This bit will be set for a non-sprite pixel if the BG layer is disabled(via ToggleLayer()), +#define VDC_BGDISABLE_OUT_MASK 0x0200 + +// HSync and VSync out bits are only valid when the EX bits in VDC's CR +// are set so that the VDC will output sync signals rather than +// input them. If it is not configured in this manner, the bit(s) shall always be 0. +#define VDC_HSYNC_OUT_MASK 0x2000 +#define VDC_VSYNC_OUT_MASK 0x4000 + +// The DISP bit can either denote active display area(1 = active, 0 = inactive), +// colorburst insertion period(0 = insert colorburst, 1 = not in colorburst period; may not be emulated correctly), +// or "internal horizontal synchronous signal"(may not be emulated correctly), depending on the TE +// bits in the VDC's CR. +#define VDC_DISP_OUT_MASK 0x8000 + +#define VDC_REGSETP(_reg, _data, _msb) { _reg &= 0xFF << ((_msb) ? 0 : 8); _reg |= (_data) << ((_msb) ? 8 : 0); } +#define VDC_REGGETP(_reg, _msb) ((_reg >> ((_msb) ? 8 : 0)) & 0xFF) + +static const unsigned int vram_inc_tab[4] = { 1, 32, 64, 128 }; + +#define VDC_IS_BSY (pending_read || pending_write) + +typedef struct +{ + uint32 x; + uint32 flags; + uint8 palette_index; + uint16 pattern_data[4]; +} SPRLE; + +typedef struct +{ + // In the case the VDC access doesn't cause a VRAM read/write, only ReadCount/WriteCount will be set to 0. + uint32 ReadStart; + uint32 ReadCount; + uint32 WriteStart; + uint32 WriteCount; + + uint32 RegRWIndex; + bool RegWriteDone; + bool RegReadDone; +} VDC_SimulateResult; + +class VDC +{ + public: + + // The VRAM size is specified in 16-bit words. + VDC(bool nospritelimit, uint32 par_VRAM_Size); + ~VDC(); + +#if 0 + void *operator new(size_t bcount) + { + void *ret = calloc(1, bcount); + return(ret); + } + + void operator delete(void *ptr) + { + free(ptr); + } +#endif + + int32 Reset(void) MDFN_WARN_UNUSED_RESULT; + + // ResetSimulate(), SimulateWrite(), and SimulateRead() are intended to handle VRAM read/write breakpoints. + // SimulateWrite() and SimulateRead() will return the VRAM address that will EVENTUALLY be written(upper 32-bits) and/or read(lower 32-bits) to + // due to the access, or 0xFFFFFFFF in the upper or lower 32-bits if no VRAM access of that type occurs. + // + // The feature is intended to support block moves to VRAM in a single instruction. It may not function properly if the address passed to SimulateRead() + // or SimulateWrite() alternates(even if just once) between the data port high byte and control port between calls to ResetSimulate() + // Call to reset simulation state. + + + INLINE void ResetSimulate(void) + { + Simulate_MAWR = MAWR; + Simulate_MARR = MARR; + + Simulate_select = select; + Simulate_CR = CR; + + Simulate_LENR = LENR; + } + + INLINE void SimulateRead(uint32 A, VDC_SimulateResult *result) + { + result->ReadCount = 0; + result->WriteCount = 0; + result->RegReadDone = false; + result->RegWriteDone = false; + + if(A & 0x2) + { + result->RegReadDone = true; + result->RegRWIndex = Simulate_select; + } + + if((A & 0x3) == 0x3 && Simulate_select == 0x02) + { + Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; + + result->ReadStart = Simulate_MARR; + result->ReadCount = 1; + } + } + + INLINE void SimulateWrite(uint32 A, uint8 V, VDC_SimulateResult *result) + { + result->ReadCount = 0; + result->WriteCount = 0; + result->RegReadDone = false; + result->RegWriteDone = false; + + const unsigned int msb = A & 1; + + switch(A & 0x3) + { + case 0x00: Simulate_select = V & 0x1F; + break; + + case 0x02: + case 0x03: + result->RegWriteDone = true; + result->RegRWIndex = Simulate_select; + + switch(Simulate_select) + { + case 0x00: VDC_REGSETP(Simulate_MAWR, V, msb); + break; + + case 0x01: VDC_REGSETP(Simulate_MARR, V, msb); + Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; + + result->ReadStart = Simulate_MARR; + result->ReadCount = 1; + break; + + case 0x02: if(msb) + { + result->WriteStart = Simulate_MAWR; + result->WriteCount = 1; + + Simulate_MAWR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; + } + break; + + case 0x12: VDC_REGSETP(Simulate_LENR, V, msb); + if(msb) + { + result->ReadStart = SOUR; + result->ReadCount = Simulate_LENR + 1; + + if(DCR & 0x4) + result->ReadStart = (result->ReadStart - (result->ReadCount - 1)) & 0xFFFF; + + result->WriteStart = DESR; + result->WriteCount = Simulate_LENR + 1; + + if(DCR & 0x8) + result->WriteStart = (result->WriteStart - (result->WriteCount - 1)) & 0xFFFF; + } + break; + + } + break; + } + } + + INLINE void SimulateRead16(bool A, VDC_SimulateResult *result) + { + result->ReadCount = 0; + result->WriteCount = 0; + result->RegReadDone = false; + result->RegWriteDone = false; + + if(A & 0x2) + { + result->RegReadDone = true; + result->RegRWIndex = Simulate_select; + } + + if(A && Simulate_select == 0x02) + { + Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; + + result->ReadStart = Simulate_MARR; + result->ReadCount = 1; + } + } + + + INLINE void SimulateWrite16(bool A, uint16 V, VDC_SimulateResult *result) + { + result->ReadCount = 0; + result->WriteCount = 0; + result->RegReadDone = false; + result->RegWriteDone = false; + + if(!A) + Simulate_select = V & 0x1F; + else + { + result->RegWriteDone = true; + result->RegRWIndex = Simulate_select; + + switch(Simulate_select) + { + case 0x00: Simulate_MAWR = V; + break; + + case 0x01: Simulate_MARR = V; + Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; + + result->ReadStart = Simulate_MARR; + result->ReadCount = 1; + break; + + case 0x02: result->WriteStart = Simulate_MAWR; + result->WriteCount = 1; + + Simulate_MAWR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; + break; + + case 0x12: Simulate_LENR = V; + result->ReadStart = SOUR; + result->ReadCount = Simulate_LENR + 1; + + if(DCR & 0x4) + result->ReadStart = (result->ReadStart - (result->ReadCount - 1)) & 0xFFFF; + + result->WriteStart = DESR; + result->WriteCount = Simulate_LENR + 1; + + if(DCR & 0x8) + result->WriteStart = (result->WriteStart - (result->WriteCount - 1)) & 0xFFFF; + break; + + } + } + } + + + int32 HSync(bool); + int32 VSync(bool); + + + void Write(uint32 A, uint8 V, int32 &next_event); + uint8 Read(uint32 A, int32 &next_event, bool peek = FALSE); + + void Write16(bool A, uint16 V); + uint16 Read16(bool A, bool peek = FALSE); + + int32 Run(int32 clocks, /*bool hs, bool vs,*/ uint16 *pixels, bool skip); + + + void FixTileCache(uint16); + void SetLayerEnableMask(uint64 mask); + + void RunDMA(int32, bool force_completion = FALSE); + void RunSATDMA(int32, bool force_completion = FALSE); + + void IncRCR(void); + void DoVBIRQTest(void); + void HDS_Start(void); + + void StateExtra(MDFN::LEPacker &sl_packer, bool load); + void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *sname); + + // Peek(VRAM/SAT) and Poke(VRAM/SAT) work in 16-bit VRAM word units. + INLINE uint16 PeekVRAM(uint16 Address) + { + if(Address < VRAM_Size) + return(VRAM[Address]); + else + return(0); + } + + INLINE uint16 PeekSAT(uint8 Address) + { + return(SAT[Address]); + } + + INLINE void PokeVRAM(uint16 Address, const uint16 Data) + { + if(Address < VRAM_Size) + { + VRAM[Address] = Data; + FixTileCache(Address); + } + } + + INLINE void PokeSAT(uint8 Address, const uint16 Data) + { + SAT[Address] = Data; + } + + + // Register enums for GetRegister() and SetRegister() + enum + { + GSREG_MAWR = 0, + GSREG_MARR, + GSREG_CR, + GSREG_RCR, + GSREG_BXR, + GSREG_BYR, + GSREG_MWR, + GSREG_HSR, + GSREG_HDR, + GSREG_VSR, + GSREG_VDR, + GSREG_VCR, + GSREG_DCR, + GSREG_SOUR, + GSREG_DESR, + GSREG_LENR, + GSREG_DVSSR, + + GSREG_SELECT, + GSREG_STATUS, + + __GSREG_COUNT + }; + + // Pass NULL if you don't want more information about the special meaning of the value in the specified + // register. Otherwise, pass a buffer of at least 256 bytes in size. + uint32 GetRegister(const unsigned int id, char *special, const uint32 special_len); + void SetRegister(const unsigned int id, const uint32 value); + + #ifdef WANT_DEBUGGER + bool DoGfxDecode(uint32 *target, const uint32 *color_table, const uint32 TransparentColor, bool DecodeSprites, + int32 w, int32 h, int32 scroll); + #endif + + INLINE bool PeekIRQ(void) + { + return((bool)(status & 0x3F)); + } + + INLINE void SetIRQHook(void (*irqh)(bool)) + { + IRQHook = irqh; + } + + INLINE void SetWSHook(bool (*wsh)(int32)) + { + WSHook = wsh; + } + + private: + + int TimeFromHDSStartToBYRLatch(void); + int TimeFromBYRLatchToBXRLatch(void); + + enum + { + HPHASE_HDS = 0, + HPHASE_HDS_PART2, + HPHASE_HDS_PART3, + HPHASE_HDW, + HPHASE_HDW_FINAL, + HPHASE_HDE, + HPHASE_HSW, + HPHASE_COUNT + }; + + enum + { + VPHASE_VDS = 0, + VPHASE_VDW, + VPHASE_VCR, + VPHASE_VSW, + VPHASE_COUNT + }; + + int VRAM_Size; // = 0x8000; + int VRAM_SizeMask; // = VRAM_Size - 1; //0x7FFF; + int VRAM_BGTileNoMask; // = VRAM_SizeMask / 16; //0x7FF; + + void (*IRQHook)(bool); + bool (*WSHook)(int32); + + void DoWaitStates(void); + void CheckAndCommitPending(void); + + INLINE int32 CalcNextEvent(void) + { + int32 next_event = HPhaseCounter; + + if(sat_dma_counter > 0 && sat_dma_counter < next_event) + next_event = sat_dma_counter; + + if(sprite_cg_fetch_counter > 0 && sprite_cg_fetch_counter < next_event) + next_event = sprite_cg_fetch_counter; + + if(DMARunning) + { + assert(VDMA_CycleCounter < 2); + + int32 next_vram_dma_event = ((LENR + 1) * 4) - (DMAReadWrite * 2) - VDMA_CycleCounter; + + assert(next_vram_dma_event > 0); + + if(next_vram_dma_event > 0 && next_vram_dma_event < next_event) + next_event = next_vram_dma_event; + + //printf("Next VRAM DMA event: %d(LENR = %d)\n", next_vram_dma_event, LENR); + } + + assert(next_event > 0); + return(next_event); + } + + bool in_exhsync, in_exvsync; + + void CalcWidthStartEnd(uint32 &display_width, uint32 &start, uint32 &end); + void DrawBG(uint16 *target, int enabled); + void DrawSprites(uint16 *target, int enabled); + void FetchSpriteData(void); + + + uint8 Simulate_select; + uint16 Simulate_MAWR; + uint16 Simulate_MARR; + uint16 Simulate_CR; + uint16 Simulate_LENR; + + int32 sat_dma_counter; + + uint8 select; + uint16 MAWR; // Memory Address Write Register + uint16 MARR; // Memory Address Read Register + + uint16 CR; // Control Register + uint16 CR_cache; // Cache for BG/SPR enable + uint16 RCR; // Raster Compare Register + uint16 BXR; // Background X-Scroll Register + uint16 BYR; // Background Y-Scroll Register + uint16 MWR; // Memory Width Register + + uint16 HSR; // Horizontal Sync Register + uint16 HDR; // Horizontal Display Register + uint16 VSR; + uint16 VDR; + + uint16 VCR; + uint16 DCR; + uint16 SOUR; + uint16 DESR; + uint16 LENR; + uint16 DVSSR; + + // Internal SAT DMA transfer variables. + //uint16 SAT_SOUR; + //uint16 SAT_DESR; + //uint16 SAT_LENR; + + int32 VDMA_CycleCounter; + + uint32 RCRCount; + + bool pending_read; + uint16 pending_read_addr; + uint16 read_buffer; + + uint8 write_latch; // LSB + + bool pending_write; + uint16 pending_write_addr; + uint16 pending_write_latch; + + uint8 status; + + uint16 SAT[0x100]; + + uint16 VRAM[65536]; //VRAM_Size]; + + union + { + uint64 bg_tile_cache64[65536 / 16][8]; // Tile, y, x + uint8 bg_tile_cache[65536 / 16][8][8]; + }; + + uint16 DMAReadBuffer; + bool DMAReadWrite; + bool DMARunning; + bool DMAPending; + bool SATBPending; + bool burst_mode; + + uint32 BG_YOffset; // Reloaded from BYR at start of display area? + uint32 BG_XOffset; // Reloaded from BXR at each scanline, methinks. + + uint32 HSW_cache, HDS_cache, HDW_cache, HDE_cache; + + uint32 VDS_cache; + uint32 VSW_cache; + uint32 VDW_cache; + uint32 VCR_cache; + uint16 MWR_cache; + + + uint32 BG_YMoo; + bool NeedRCRInc, NeedVBIRQTest, NeedSATDMATest, NeedBGYInc; + int HPhase, VPhase; + int32 HPhaseCounter, VPhaseCounter; + + int32 sprite_cg_fetch_counter; + + + int32 mystery_counter; + bool mystery_phase; + + uint16 linebuf[1024 + 512]; + uint32 pixel_desu; + int32 pixel_copy_count; + uint32 userle; // User layer enable. + bool unlimited_sprites; + + int active_sprites; + SPRLE SpriteList[64 * 2]; // (see unlimited_sprites option, *2 to accommodate 32-pixel-width sprites ) //16]; +}; + +#endif diff --git a/Mednafen/mednafen/lepacker.h b/Mednafen/mednafen/lepacker.h new file mode 100644 index 0000000000..d53ee761dc --- /dev/null +++ b/Mednafen/mednafen/lepacker.h @@ -0,0 +1,103 @@ +#ifndef __MDFN_LEPACKER_H +#define __MDFN_LEPACKER_H + +#include "mednafen.h" + +#include +#include +#include + +/* Little-endian byte packer(and unpacker). */ + +namespace MDFN +{ + +class LEPacker; +class LEPackable +{ + public: + virtual void pack(LEPacker &lep) = 0; +}; + +class LEPacker : public std::vector +{ + public: + + LEPacker() : read_mode(0), read_pos(0), randomize_read_mode(0) + { + + } + + + inline void set_read_mode(bool new_read_mode, bool new_randomize_read_mode = false) + { + read_mode = new_read_mode; + randomize_read_mode = new_randomize_read_mode; + } + + inline void reset_read_pos(void) + { + read_pos = 0; + } + + void operator^(LEPackable &o) + { + o.pack(*this); + } + + template INLINE void operator^(T &val) + { + size_type csize = size(); + + if(read_mode) + { + if((read_pos + sizeof(T)) > csize) + throw(std::out_of_range("LEPacker::operator^")); + + uint8 *ptr = &(*this)[read_pos]; + val = 0; + + if(randomize_read_mode) + { + for(unsigned int n = 0; n < sizeof(T); n++) + val |= ((T)((rand() >> 4) & 0xFF)) << (n << 3); + } + else + { + for(unsigned int n = 0; n < sizeof(T); n++) + val |= ((T)ptr[n]) << (n << 3); + } + + read_pos += sizeof(T); + } + else + { + resize(csize + sizeof(T)); + + uint8 *ptr = &(*this)[csize]; + + for(unsigned int n = 0; n < sizeof(T); n++) + ptr[n] = val >> (n << 3); + } + } + + INLINE void operator^(bool &val) + { + uint8 tmp = val; + + (*this) ^ tmp; + + if(read_mode) + val = tmp; + } + + private: + + bool read_mode; + uint64 read_pos; + bool randomize_read_mode; +}; + +} + +#endif diff --git a/Mednafen/mednafen/lynx/Makefile.am b/Mednafen/mednafen/lynx/Makefile.am new file mode 100644 index 0000000000..7d486f1594 --- /dev/null +++ b/Mednafen/mednafen/lynx/Makefile.am @@ -0,0 +1,6 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = liblynx.a +liblynx_a_SOURCES = cart.cpp c65c02.cpp memmap.cpp mikie.cpp ram.cpp rom.cpp susie.cpp system.cpp diff --git a/Mednafen/mednafen/lynx/Makefile.in b/Mednafen/mednafen/lynx/Makefile.in new file mode 100644 index 0000000000..a6bff9cb98 --- /dev/null +++ b/Mednafen/mednafen/lynx/Makefile.in @@ -0,0 +1,685 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/lynx +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +liblynx_a_AR = $(AR) $(ARFLAGS) +liblynx_a_LIBADD = +am_liblynx_a_OBJECTS = cart.$(OBJEXT) c65c02.$(OBJEXT) \ + memmap.$(OBJEXT) mikie.$(OBJEXT) ram.$(OBJEXT) rom.$(OBJEXT) \ + susie.$(OBJEXT) system.$(OBJEXT) +liblynx_a_OBJECTS = $(am_liblynx_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(liblynx_a_SOURCES) +DIST_SOURCES = $(liblynx_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = liblynx.a +liblynx_a_SOURCES = cart.cpp c65c02.cpp memmap.cpp mikie.cpp ram.cpp rom.cpp susie.cpp system.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lynx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lynx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +liblynx.a: $(liblynx_a_OBJECTS) $(liblynx_a_DEPENDENCIES) $(EXTRA_liblynx_a_DEPENDENCIES) + $(AM_V_at)-rm -f liblynx.a + $(AM_V_AR)$(liblynx_a_AR) liblynx.a $(liblynx_a_OBJECTS) $(liblynx_a_LIBADD) + $(AM_V_at)$(RANLIB) liblynx.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c65c02.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memmap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mikie.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ram.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/susie.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/lynx/c6502mak.h b/Mednafen/mednafen/lynx/c6502mak.h new file mode 100644 index 0000000000..4b5726fc6e --- /dev/null +++ b/Mednafen/mednafen/lynx/c6502mak.h @@ -0,0 +1,694 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// 65C02 Macro definitions // +////////////////////////////////////////////////////////////////////////////// +// // +// This file contains all of the required address mode and operand // +// macro definitions for the 65C02 emulation // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +// +// Addressing mode decoding +// + +#define xIMMEDIATE() {mOperand=mPC;mPC++;} +#define xABSOLUTE() {mOperand=CPU_PEEKW(mPC);mPC+=2;} +#define xZEROPAGE() {mOperand=CPU_PEEK(mPC);mPC++;} +#define xZEROPAGE_X() {mOperand=CPU_PEEK(mPC)+mX;mPC++;mOperand&=0xff;} +#define xZEROPAGE_Y() {mOperand=CPU_PEEK(mPC)+mY;mPC++;mOperand&=0xff;} +#define xABSOLUTE_X() {mOperand=CPU_PEEKW(mPC);mPC+=2;mOperand+=mX;mOperand&=0xffff;} +#define xABSOLUTE_Y() {mOperand=CPU_PEEKW(mPC);mPC+=2;mOperand+=mY;mOperand&=0xffff;} +#define xINDIRECT_ABSOLUTE_X() {mOperand=CPU_PEEKW(mPC);mPC+=2;mOperand+=mX;mOperand&=0xffff;mOperand=CPU_PEEKW(mOperand);} +#define xRELATIVE() {mOperand=CPU_PEEK(mPC);mPC++;mOperand=(mPC+mOperand)&0xffff;} +#define xINDIRECT_X() {mOperand=CPU_PEEK(mPC);mPC++;mOperand=mOperand+mX;mOperand&=0x00ff;mOperand=CPU_PEEKW(mOperand);} +#define xINDIRECT_Y() {mOperand=CPU_PEEK(mPC);mPC++;mOperand=CPU_PEEKW(mOperand);mOperand=mOperand+mY;mOperand&=0xffff;} +#define xINDIRECT_ABSOLUTE() {mOperand=CPU_PEEKW(mPC);mPC+=2;mOperand=CPU_PEEKW(mOperand);} +#define xINDIRECT() {mOperand=CPU_PEEK(mPC);mPC++;mOperand=CPU_PEEKW(mOperand);} + +// +// Helper Macros +// +//#define SET_Z(m) { mZ=(m)?false:true; } +//#define SET_N(m) { mN=(m&0x80)?true:false; } +//#define SET_NZ(m) SET_Z(m) SET_N(m) +#define SET_Z(m) { mZ=!(m); } +#define SET_N(m) { mN=(m)&0x80; } +#define SET_NZ(m) { mZ=!(m); mN=(m)&0x80; } +#define PULL(m) { mSP++; mSP&=0xff; m=CPU_PEEK(mSP+0x0100); } +#define PUSH(m) { CPU_POKE(0x0100+mSP,m); mSP--; mSP&=0xff; } +// +// Opcode execution +// + +#define xADC()\ +{\ + int value=CPU_PEEK(mOperand);\ + if(mD)\ + {\ + int c = mC?1:0;\ + int lo = (mA & 0x0f) + (value & 0x0f) + c;\ + int hi = (mA & 0xf0) + (value & 0xf0);\ + mV=0;\ + mC=0;\ + if (lo > 0x09)\ + {\ + hi += 0x10;\ + lo += 0x06;\ + }\ + if (~(mA^value) & (mA^hi) & 0x80) mV=1;\ + if (hi > 0x90) hi += 0x60;\ + if (hi & 0xff00) mC=1;\ + mA = (lo & 0x0f) + (hi & 0xf0);\ + }\ + else\ + {\ + int c = mC?1:0;\ + int sum = mA + value + c;\ + mV=0;\ + mC=0;\ + if (~(mA^value) & (mA^sum) & 0x80) mV=1;\ + if (sum & 0xff00) mC=1;\ + mA = (uint8) sum;\ + }\ + SET_NZ(mA)\ +} + +#define xAND()\ +{\ + mA&=CPU_PEEK(mOperand);\ + SET_NZ(mA);\ +} + +#define xASL()\ +{\ + int value=CPU_PEEK(mOperand);\ + mC=value&0x80;\ + value<<=1;\ + value&=0xff;\ + SET_NZ(value);\ + CPU_POKE(mOperand,value);\ +} + +#define xASLA()\ +{\ + mC=mA&0x80;\ + mA<<=1;\ + mA&=0xff;\ + SET_NZ(mA);\ +} + +#define xBCC()\ +{\ + if(!mC)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xBCS()\ +{\ + if(mC)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xBEQ()\ +{\ + if(mZ)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +// This version of bit, not setting N and V status flags in immediate, seems to be correct. +// The same behaviour is reported on the 65C02 used in old Apple computers, at least. +// (From a pragmatic sense, using the normal version of bit for immediate +// mode breaks the title screen of "California Games" in a subtle way.) +#define xBIT()\ +{\ + int value=CPU_PEEK(mOperand);\ + SET_Z(mA&value);\ +\ + if(mOpcode!=0x89)\ + {\ + mN=value&0x80;\ + mV=value&0x40;\ + }\ +} +#define xBMI()\ +{\ + if(mN)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xBNE()\ +{\ + if(!mZ)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xBPL()\ +{\ + if(!mN)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xBRA()\ +{\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ +} + +#define xBRK()\ +{\ + mPC++;\ + PUSH(mPC>>8);\ + PUSH(mPC&0xff);\ + PUSH(PS()|0x10);\ +\ + mD=FALSE;\ + mI=TRUE;\ +\ + mPC=CPU_PEEKW(IRQ_VECTOR);\ +} +// KW 4/11/98 B flag needed to be set IN the stack status word = 0x10. + +#define xBVC()\ +{\ + if(!mV)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xBVS()\ +{\ + if(mV)\ + {\ + int offset=(signed char)CPU_PEEK(mPC);\ + mPC++;\ + mPC+=offset;\ + mPC&=0xffff;\ + }\ + else\ + {\ + mPC++;\ + mPC&=0xffff;\ + }\ +} + +#define xCLC()\ +{\ + mC=FALSE;\ +} + +#define xCLD()\ +{\ + mD=FALSE;\ +} + +#define xCLI()\ +{\ + mI=FALSE;\ +} + +#define xCLV()\ +{\ + mV=FALSE;\ +} + +#define xCMP()\ +{\ + int value=CPU_PEEK(mOperand);\ + mC=0;\ + if (mA >= value) mC=1;\ + SET_NZ((uint8)(mA - value))\ +} + +#define xCPX()\ +{\ + int value=CPU_PEEK(mOperand);\ + mC=0;\ + if (mX >= value) mC=1;\ + SET_NZ((uint8)(mX - value))\ +} + +#define xCPY()\ +{\ + int value=CPU_PEEK(mOperand);\ + mC=0;\ + if (mY >= value) mC=1;\ + SET_NZ((uint8)(mY - value))\ +} + +#define xDEC()\ +{\ + int value=CPU_PEEK(mOperand)-1;\ + value&=0xff;\ + CPU_POKE(mOperand,value);\ + SET_NZ(value);\ +} + +#define xDECA()\ +{\ + mA--;\ + mA&=0xff;\ + SET_NZ(mA);\ +} + +#define xDEX()\ +{\ + mX--;\ + mX&=0xff;\ + SET_NZ(mX);\ +} + +#define xDEY()\ +{\ + mY--;\ + mY&=0xff;\ + SET_NZ(mY);\ +} + +#define xEOR()\ +{\ + mA^=CPU_PEEK(mOperand);\ + SET_NZ(mA);\ +} + +#define xINC()\ +{\ + int value=CPU_PEEK(mOperand)+1;\ + value&=0xff;\ + CPU_POKE(mOperand,value);\ + SET_NZ(value);\ +} + +#define xINCA()\ +{\ + mA++;\ + mA&=0xff;\ + SET_NZ(mA);\ +} + +#define xINX()\ +{\ + mX++;\ + mX&=0xff;\ + SET_NZ(mX);\ +} + +#define xINY()\ +{\ + mY++;\ + mY&=0xff;\ + SET_NZ(mY);\ +} + +#define xJMP()\ +{\ + mPC=mOperand;\ +} + +#define xJSR()\ +{\ + PUSH((mPC-1)>>8);\ + PUSH((mPC-1)&0xff);\ + mPC=mOperand;\ +} + +#define xLDA()\ +{\ + mA=CPU_PEEK(mOperand);\ + SET_NZ(mA);\ +} + +#define xLDX()\ +{\ + mX=CPU_PEEK(mOperand);\ + SET_NZ(mX);\ +} + +#define xLDY()\ +{\ + mY=CPU_PEEK(mOperand);\ + SET_NZ(mY);\ +} + +#define xLSR()\ +{\ + int value=CPU_PEEK(mOperand);\ + mC=value&0x01;\ + value=(value>>1)&0x7f;\ + CPU_POKE(mOperand,value);\ + SET_NZ(value);\ +} + +#define xLSRA()\ +{\ + mC=mA&0x01;\ + mA=(mA>>1)&0x7f;\ + SET_NZ(mA);\ +} + +#define xNOP()\ +{\ +} + +#define xORA()\ +{\ + mA|=CPU_PEEK(mOperand);\ + SET_NZ(mA);\ +} + +#define xPHA()\ +{\ + PUSH(mA);\ +} + +#define xPHP()\ +{\ + PUSH(PS());\ +} + +#define xPHX()\ +{\ + PUSH(mX);\ +} + +#define xPHY()\ +{\ + PUSH(mY);\ +} + +#define xPLA()\ +{\ + PULL(mA);\ + SET_NZ(mA);\ +} + +#define xPLP()\ +{\ + int P;\ + PULL(P);\ + PS(P);\ +} + +#define xPLX()\ +{\ + PULL(mX);\ + SET_NZ(mX);\ +} + +#define xPLY()\ +{\ + PULL(mY);\ + SET_NZ(mY);\ +} + +#define xROL()\ +{\ + int value=CPU_PEEK(mOperand);\ + int oldC=mC;\ + mC=value&0x80;\ + value=(value<<1)|(oldC?1:0);\ + value&=0xff;\ + CPU_POKE(mOperand,value);\ + SET_NZ(value);\ +} + +#define xROLA()\ +{\ + int oldC=mC;\ + mC=mA&0x80;\ + mA=(mA<<1)|(oldC?1:0);\ + mA&=0xff;\ + SET_NZ(mA);\ +} + +#define xROR()\ +{\ + int value=CPU_PEEK(mOperand);\ + int oldC=mC;\ + mC=value&0x01;\ + value=((value>>1)&0x7f)|(oldC?0x80:0x00);\ + value&=0xff;\ + CPU_POKE(mOperand,value);\ + SET_NZ(value);\ +} + +#define xRORA()\ +{\ + int oldC=mC;\ + mC=mA&0x01;\ + mA=((mA>>1)&0x7f)|(oldC?0x80:0x00);\ + mA&=0xff;\ + SET_NZ(mA);\ +} + +#define xRTI()\ +{\ + int tmp;\ + PULL(tmp);\ + PS(tmp);\ + PULL(mPC);\ + PULL(tmp);\ + mPC|=tmp<<8;\ +} + +#define xRTS()\ +{\ + int tmp;\ + PULL(mPC);\ + PULL(tmp);\ + mPC|=tmp<<8;\ + mPC++;\ +} + +#define xSBC()\ +{\ + int value=CPU_PEEK(mOperand);\ + if (mD)\ + {\ + int c = mC?0:1;\ + int sum = mA - value - c;\ + int lo = (mA & 0x0f) - (value & 0x0f) - c;\ + int hi = (mA & 0xf0) - (value & 0xf0);\ + mV=0;\ + mC=0;\ + if ((mA^value) & (mA^sum) & 0x80) mV=1;\ + if (lo & 0xf0) lo -= 6;\ + if (lo & 0x80) hi -= 0x10;\ + if (hi & 0x0f00) hi -= 0x60;\ + if ((sum & 0xff00) == 0) mC=1;\ + mA = (lo & 0x0f) + (hi & 0xf0);\ + }\ + else\ + {\ + int c = mC?0:1;\ + int sum = mA - value - c;\ + mV=0;\ + mC=0;\ + if ((mA^value) & (mA^sum) & 0x80) mV=1;\ + if ((sum & 0xff00) == 0) mC=1;\ + mA = (uint8) sum;\ + }\ + SET_NZ(mA)\ +} + +#define xSEC()\ +{\ + mC=true;\ +} + +#define xSED()\ +{\ + mD=true;\ +} + +#define xSEI()\ +{\ + mI=true;\ +} + +#define xSTA()\ +{\ + CPU_POKE(mOperand,mA);\ +} + +#define xSTP()\ +{\ + gSystemCPUSleep=TRUE;\ +} + +#define xSTX()\ +{\ + CPU_POKE(mOperand,mX);\ +} + +#define xSTY()\ +{\ + CPU_POKE(mOperand,mY);\ +} + +#define xSTZ()\ +{\ + CPU_POKE(mOperand,0);\ +} + +#define xTAX()\ +{\ + mX=mA;\ + SET_NZ(mX);\ +} + +#define xTAY()\ +{\ + mY=mA;\ + SET_NZ(mY);\ +} + +#define xTRB()\ +{\ + int value=CPU_PEEK(mOperand);\ + SET_Z(mA&value);\ + value=value&(mA^0xff);\ + CPU_POKE(mOperand,value);\ +} + +#define xTSB()\ +{\ + int value=CPU_PEEK(mOperand);\ + SET_Z(mA&value);\ + value=value|mA;\ + CPU_POKE(mOperand,value);\ +} + +#define xTSX()\ +{\ + mX=mSP;\ + SET_NZ(mX);\ +} + +#define xTXA()\ +{\ + mA=mX;\ + SET_NZ(mA);\ +} + +#define xTXS()\ +{\ + mSP=mX;\ +} + +#define xTYA()\ +{\ + mA=mY;\ + SET_NZ(mA);\ +} + +#define xWAI()\ +{\ + gSystemCPUSleep=TRUE;\ +} + diff --git a/Mednafen/mednafen/lynx/c65c02.cpp b/Mednafen/mednafen/lynx/c65c02.cpp new file mode 100644 index 0000000000..cdb652760e --- /dev/null +++ b/Mednafen/mednafen/lynx/c65c02.cpp @@ -0,0 +1,990 @@ +#include "system.h" + +#include "c65c02.h" + +void C65C02::Update(void) +{ + if(gSystemCPUSleep) return; + if(gSystemIRQ && !mI && !mIRQActive) + { + // Push processor status + PUSH(mPC>>8); + PUSH(mPC&0xff); + PUSH(PS()&0xef); // Clear B flag on stack + + mI=TRUE; // Stop further interrupts + mD=FALSE; // Clear decimal mode + + // Pick up the new PC + mPC=CPU_PEEKW(IRQ_VECTOR); + } + // Fetch opcode + mOpcode=CPU_PEEK(mPC); + TRACE_CPU2("Update() PC=$%04x, Opcode=%02x",mPC,mOpcode); + mPC++; + + // Execute Opcode + + switch(mOpcode) + { +#define ADDCYC(x) { gSystemCycleCount += ((x) * 4); if(gSuzieDoneTime) gSuzieDoneTime += ((x) * 4); } +// +// 0x00 +// + case 0x00: + ADDCYC(7); + // IMPLIED + xBRK(); + break; + case 0x01: + ADDCYC(6); + xINDIRECT_X(); + xORA(); + break; + case 0x04: + ADDCYC(5); + xZEROPAGE(); + xTSB(); + break; + case 0x05: + ADDCYC(3); + xZEROPAGE(); + xORA(); + break; + case 0x06: + ADDCYC(5); + xZEROPAGE(); + xASL(); + break; + case 0x08: + ADDCYC(3); + // IMPLIED + xPHP(); + break; + case 0x09: + ADDCYC(3); + xIMMEDIATE(); + xORA(); + break; + case 0x0A: + ADDCYC(2); + // IMPLIED + xASLA(); + break; + case 0x0C: + ADDCYC(6); + xABSOLUTE(); + xTSB(); + break; + case 0x0D: + ADDCYC(4); + xABSOLUTE(); + xORA(); + break; + case 0x0E: + ADDCYC(6); + gSystemCycleCount+=(1+(5*CPU_RDWR_CYC)); + xABSOLUTE(); + xASL(); + break; + +// +// 0x10 +// + case 0x10: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBPL(); + break; + case 0x11: + ADDCYC(5); + xINDIRECT_Y(); + xORA(); + break; + case 0x12: + ADDCYC(5); + xINDIRECT(); + xORA(); + break; + case 0x14: + ADDCYC(5); + xZEROPAGE(); + xTRB(); + break; + case 0x15: + ADDCYC(4); + xZEROPAGE_X(); + xORA(); + break; + case 0x16: + ADDCYC(6); + xZEROPAGE_X(); + xASL(); + break; + case 0x18: + ADDCYC(2); + // IMPLIED + xCLC(); + break; + case 0x19: + ADDCYC(4); + xABSOLUTE_Y(); + xORA(); + break; + case 0x1A: + ADDCYC(2); + // IMPLIED + xINCA(); + break; + case 0x1C: + ADDCYC(6); + xABSOLUTE(); + xTRB(); + break; + case 0x1D: + ADDCYC(4); + xABSOLUTE_X(); + xORA(); + break; + case 0x1E: + ADDCYC(7); + xABSOLUTE_X(); + xASL(); + break; + +// +// 0x20 +// + case 0x20: + ADDCYC(6); + xABSOLUTE(); + xJSR(); + break; + case 0x21: + ADDCYC(6); + xINDIRECT_X(); + xAND(); + break; + case 0x24: + ADDCYC(3); + xZEROPAGE(); + xBIT(); + break; + case 0x25: + ADDCYC(3); + xZEROPAGE(); + xAND(); + break; + case 0x26: + ADDCYC(5); + xZEROPAGE(); + xROL(); + break; + case 0x28: + ADDCYC(4); + // IMPLIED + xPLP(); + break; + case 0x29: + ADDCYC(2); + xIMMEDIATE(); + xAND(); + break; + case 0x2A: + ADDCYC(2); + // IMPLIED + xROLA(); + break; + case 0x2C: + ADDCYC(4); + xABSOLUTE(); + xBIT(); + break; + case 0x2D: + ADDCYC(4); + xABSOLUTE(); + xAND(); + break; + case 0x2E: + ADDCYC(6); + xABSOLUTE(); + xROL(); + break; +// +// 0x30 +// + case 0x30: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBMI(); + break; + case 0x31: + ADDCYC(5); + xINDIRECT_Y(); + xAND(); + break; + case 0x32: + ADDCYC(5); + xINDIRECT(); + xAND(); + break; + case 0x34: + ADDCYC(4); + xZEROPAGE_X(); + xBIT(); + break; + case 0x35: + ADDCYC(4); + xZEROPAGE_X(); + xAND(); + break; + case 0x36: + ADDCYC(6); + xZEROPAGE_X(); + xROL(); + break; + case 0x38: + ADDCYC(2); + // IMPLIED + xSEC(); + break; + case 0x39: + ADDCYC(4); + xABSOLUTE_Y(); + xAND(); + break; + case 0x3A: + ADDCYC(2); + // IMPLIED + xDECA(); + break; + case 0x3C: + ADDCYC(4); + xABSOLUTE_X(); + xBIT(); + break; + case 0x3D: + ADDCYC(4); + xABSOLUTE_X(); + xAND(); + break; + case 0x3E: + ADDCYC(7); + xABSOLUTE_X(); + xROL(); + break; +// +// 0x40 +// + case 0x40: + ADDCYC(6); + // IMPLIED + xRTI(); + break; + case 0x41: + ADDCYC(6); + xINDIRECT_X(); + xEOR(); + break; + case 0x45: + ADDCYC(3); + xZEROPAGE(); + xEOR(); + break; + case 0x46: + ADDCYC(5); + xZEROPAGE(); + xLSR(); + break; + case 0x48: + ADDCYC(3); + // IMPLIED + xPHA(); + break; + case 0x49: + ADDCYC(2); + xIMMEDIATE(); + xEOR(); + break; + case 0x4A: + ADDCYC(2); + // IMPLIED + xLSRA(); + break; + case 0x4C: + ADDCYC(3); + xABSOLUTE(); + xJMP(); + break; + case 0x4D: + ADDCYC(4); + xABSOLUTE(); + xEOR(); + break; + case 0x4E: + ADDCYC(6); + xABSOLUTE(); + xLSR(); + break; + +// +// 0x50 +// + case 0x50: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBVC(); + break; + case 0x51: + ADDCYC(5); + xINDIRECT_Y(); + xEOR(); + break; + case 0x52: + ADDCYC(5); + xINDIRECT(); + xEOR(); + break; + case 0x55: + ADDCYC(4); + xZEROPAGE_X(); + xEOR(); + break; + case 0x56: + ADDCYC(6); + xZEROPAGE_X(); + xLSR(); + break; + case 0x58: + ADDCYC(2); + // IMPLIED + xCLI(); + break; + case 0x59: + ADDCYC(4); + xABSOLUTE_Y(); + xEOR(); + break; + case 0x5A: + ADDCYC(3); + // IMPLIED + xPHY(); + break; + case 0x5D: + ADDCYC(4); + xABSOLUTE_X(); + xEOR(); + break; + case 0x5E: + ADDCYC(7); + xABSOLUTE_X(); + xLSR(); + break; + +// +// 0x60 +// + case 0x60: + ADDCYC(6); + // IMPLIED + xRTS(); + break; + case 0x61: + ADDCYC(6); + xINDIRECT_X(); + xADC(); + break; + case 0x64: + ADDCYC(3); + xZEROPAGE(); + xSTZ(); + break; + case 0x65: + ADDCYC(3); + xZEROPAGE(); + xADC(); + break; + case 0x66: + ADDCYC(5); + xZEROPAGE(); + xROR(); + break; + case 0x68: + ADDCYC(4); + // IMPLIED + xPLA(); + break; + case 0x69: + ADDCYC(2); + xIMMEDIATE(); + xADC(); + break; + case 0x6A: + ADDCYC(2); + // IMPLIED + xRORA(); + break; + case 0x6C: + ADDCYC(6); + xINDIRECT_ABSOLUTE(); + xJMP(); + break; + case 0x6D: + ADDCYC(4); + xABSOLUTE(); + xADC(); + break; + case 0x6E: + ADDCYC(6); + xABSOLUTE(); + xROR(); + break; +// +// 0x70 +// + case 0x70: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBVS(); + break; + case 0x71: + ADDCYC(5); + xINDIRECT_Y(); + xADC(); + break; + case 0x72: + ADDCYC(5); + xINDIRECT(); + xADC(); + break; + case 0x74: + ADDCYC(4); + xZEROPAGE_X(); + xSTZ(); + break; + case 0x75: + ADDCYC(4); + xZEROPAGE_X(); + xADC(); + break; + case 0x76: + ADDCYC(6); + xZEROPAGE_X(); + xROR(); + break; + case 0x78: + ADDCYC(2); + // IMPLIED + xSEI(); + break; + case 0x79: + gSystemCycleCount+=(1+(3*CPU_RDWR_CYC)); + xABSOLUTE_Y(); + xADC(); + break; + case 0x7A: + ADDCYC(4); + // IMPLIED + xPLY(); + break; + case 0x7C: + ADDCYC(6); + xINDIRECT_ABSOLUTE_X(); + xJMP(); + break; + case 0x7D: + ADDCYC(4); + xABSOLUTE_X(); + xADC(); + break; + case 0x7E: + ADDCYC(7); + xABSOLUTE_X(); + xROR(); + break; +// +// 0x80 +// + case 0x80: + ADDCYC(3); + // RELATIVE (IN FUNCTION) + xBRA(); + break; + case 0x81: + ADDCYC(6); + xINDIRECT_X(); + xSTA(); + break; + case 0x84: + ADDCYC(3); + xZEROPAGE(); + xSTY(); + break; + case 0x85: + ADDCYC(3); + xZEROPAGE(); + xSTA(); + break; + case 0x86: + ADDCYC(3); + xZEROPAGE(); + xSTX(); + break; + case 0x88: + ADDCYC(2); + // IMPLIED + xDEY(); + break; + case 0x89: + ADDCYC(3); + xIMMEDIATE(); + xBIT(); + break; + case 0x8A: + ADDCYC(2); + // IMPLIED + xTXA(); + break; + case 0x8C: + ADDCYC(4); + xABSOLUTE(); + xSTY(); + break; + case 0x8D: + ADDCYC(4); + xABSOLUTE(); + xSTA(); + break; + case 0x8E: + ADDCYC(4); + xABSOLUTE(); + xSTX(); + break; + +// +// 0x90 +// + case 0x90: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBCC(); + break; + case 0x91: + ADDCYC(6); + xINDIRECT_Y(); + xSTA(); + break; + case 0x92: + ADDCYC(5); + xINDIRECT(); + xSTA(); + break; + case 0x94: + ADDCYC(4); + xZEROPAGE_X(); + xSTY(); + break; + case 0x95: + ADDCYC(4); + xZEROPAGE_X(); + xSTA(); + break; + case 0x96: + ADDCYC(4); + xZEROPAGE_Y(); + xSTX(); + break; + case 0x98: + ADDCYC(2); + // IMPLIED + xTYA(); + break; + case 0x99: + ADDCYC(5); + xABSOLUTE_Y(); + xSTA(); + break; + case 0x9A: + ADDCYC(2); + // IMPLIED + xTXS(); + break; + case 0x9C: + ADDCYC(4); + xABSOLUTE(); + xSTZ(); + break; + case 0x9D: + ADDCYC(5); + xABSOLUTE_X(); + xSTA(); + break; + case 0x9E: + ADDCYC(5); + xABSOLUTE_X(); + xSTZ(); + break; + +// +// 0xA0 +// + case 0xA0: + ADDCYC(2); + xIMMEDIATE(); + xLDY(); + break; + case 0xA1: + ADDCYC(6); + xINDIRECT_X(); + xLDA(); + break; + case 0xA2: + ADDCYC(2); + xIMMEDIATE(); + xLDX(); + break; + case 0xA4: + ADDCYC(3); + xZEROPAGE(); + xLDY(); + break; + case 0xA5: + ADDCYC(3); + xZEROPAGE(); + xLDA(); + break; + case 0xA6: + ADDCYC(3); + xZEROPAGE(); + xLDX(); + break; + case 0xA8: + ADDCYC(2); + // IMPLIED + xTAY(); + break; + case 0xA9: + ADDCYC(2); + xIMMEDIATE(); + xLDA(); + break; + case 0xAA: + ADDCYC(2); + // IMPLIED + xTAX(); + break; + case 0xAC: + ADDCYC(4); + xABSOLUTE(); + xLDY(); + break; + case 0xAD: + ADDCYC(4); + xABSOLUTE(); + xLDA(); + break; + case 0xAE: + ADDCYC(4); + xABSOLUTE(); + xLDX(); + break; + +// +// 0xB0 +// + case 0xB0: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBCS(); + break; + case 0xB1: + ADDCYC(5); + xINDIRECT_Y(); + xLDA(); + break; + case 0xB2: + ADDCYC(5); + xINDIRECT(); + xLDA(); + break; + case 0xB4: + ADDCYC(4); + xZEROPAGE_X(); + xLDY(); + break; + case 0xB5: + ADDCYC(4); + xZEROPAGE_X(); + xLDA(); + break; + case 0xB6: + ADDCYC(4); + xZEROPAGE_Y(); + xLDX(); + break; + case 0xB8: + ADDCYC(2); + // IMPLIED + xCLV(); + break; + case 0xB9: + ADDCYC(4); + xABSOLUTE_Y(); + xLDA(); + break; + case 0xBA: + ADDCYC(2); + // IMPLIED + xTSX(); + break; + case 0xBC: + ADDCYC(4); + xABSOLUTE_X(); + xLDY(); + break; + case 0xBD: + ADDCYC(4); + xABSOLUTE_X(); + xLDA(); + break; + case 0xBE: + ADDCYC(4); + xABSOLUTE_Y(); + xLDX(); + break; + +// +// 0xC0 +// + case 0xC0: + ADDCYC(2); + xIMMEDIATE(); + xCPY(); + break; + case 0xC1: + ADDCYC(6); + xINDIRECT_X(); + xCMP(); + break; + case 0xC4: + ADDCYC(3); + xZEROPAGE(); + xCPY(); + break; + case 0xC5: + ADDCYC(3); + xZEROPAGE(); + xCMP(); + break; + case 0xC6: + ADDCYC(5); + xZEROPAGE(); + xDEC(); + break; + case 0xC8: + ADDCYC(2); + // IMPLIED + xINY(); + break; + case 0xC9: + ADDCYC(2); + xIMMEDIATE(); + xCMP(); + break; + case 0xCA: + ADDCYC(2); + // IMPLIED + xDEX(); + break; + case 0xCB: + ADDCYC(2); + // IMPLIED + xWAI(); + break; + case 0xCC: + ADDCYC(4); + xABSOLUTE(); + xCPY(); + break; + case 0xCD: + ADDCYC(4); + xABSOLUTE(); + xCMP(); + break; + case 0xCE: + ADDCYC(6); + xABSOLUTE(); + xDEC(); + break; +// +// 0xD0 +// + case 0xD0: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBNE(); + break; + case 0xD1: + ADDCYC(5); + xINDIRECT_Y(); + xCMP(); + break; + case 0xD2: + ADDCYC(5); + xINDIRECT(); + xCMP(); + break; + case 0xD5: + ADDCYC(4); + xZEROPAGE_X(); + xCMP(); + break; + case 0xD6: + ADDCYC(6); + xZEROPAGE_X(); + xDEC(); + break; + case 0xD8: + ADDCYC(2); + // IMPLIED + xCLD(); + break; + case 0xD9: + ADDCYC(4); + xABSOLUTE_Y(); + xCMP(); + break; + case 0xDA: + ADDCYC(3); + // IMPLIED + xPHX(); + break; + case 0xDB: + ADDCYC(2); + // IMPLIED + xSTP(); + break; + case 0xDD: + ADDCYC(4); + xABSOLUTE_X(); + xCMP(); + break; + case 0xDE: + ADDCYC(7); + xABSOLUTE_X(); + xDEC(); + break; +// +// 0xE0 +// + case 0xE0: + ADDCYC(2); + xIMMEDIATE(); + xCPX(); + break; + case 0xE1: + ADDCYC(6); + xINDIRECT_X(); + xSBC(); + break; + case 0xE4: + ADDCYC(3); + xZEROPAGE(); + xCPX(); + break; + case 0xE5: + ADDCYC(3); + xZEROPAGE(); + xSBC(); + break; + case 0xE6: + ADDCYC(5); + xZEROPAGE(); + xINC(); + break; + case 0xE8: + ADDCYC(2); + // IMPLIED + xINX(); + break; + case 0xE9: + ADDCYC(2); + xIMMEDIATE(); + xSBC(); + break; + default: + case 0xEA: + ADDCYC(2); + // IMPLIED + xNOP(); + break; + case 0xEC: + ADDCYC(4); + xABSOLUTE(); + xCPX(); + break; + case 0xED: + ADDCYC(4); + xABSOLUTE(); + xSBC(); + break; + case 0xEE: + ADDCYC(6); + xABSOLUTE(); + xINC(); + break; +// +// 0xF0 +// + case 0xF0: + ADDCYC(2); + // RELATIVE (IN FUNCTION) + xBEQ(); + break; + case 0xF1: + ADDCYC(5); + xINDIRECT_Y(); + xSBC(); + break; + case 0xF2: + ADDCYC(5); + xINDIRECT(); + xSBC(); + break; + case 0xF5: + ADDCYC(4); + xZEROPAGE_X(); + xSBC(); + break; + case 0xF6: + ADDCYC(6); + xZEROPAGE_X(); + xINC(); + break; + case 0xF8: + ADDCYC(2); + // IMPLIED + xSED(); + break; + case 0xF9: + ADDCYC(4); + xABSOLUTE_Y(); + xSBC(); + break; + case 0xFA: + ADDCYC(4); + // IMPLIED + xPLX(); + break; + case 0xFD: + ADDCYC(4); + xABSOLUTE_X(); + xSBC(); + break; + case 0xFE: + ADDCYC(7); + xABSOLUTE_X(); + xINC(); + break; + } +} diff --git a/Mednafen/mednafen/lynx/c65c02.h b/Mednafen/mednafen/lynx/c65c02.h new file mode 100644 index 0000000000..60d0696a15 --- /dev/null +++ b/Mednafen/mednafen/lynx/c65c02.h @@ -0,0 +1,305 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// 65C02 Emulation class // +////////////////////////////////////////////////////////////////////////////// +// // +// This class emulates a 65C02 processor. It is interfaced to the rest of // +// the system via the PEEK/POKE macros and a number of global variables // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef C65C02_H +#define C65C02_H + +//#include +//#define TRACE_CPU + +#ifdef TRACE_CPU + +#define TRACE_CPU0(msg) _RPT1(_CRT_WARN,"C65C02::"msg" (Time=%012d)\n",gSystemCycleCount) +#define TRACE_CPU1(msg,arg1) _RPT2(_CRT_WARN,"C65C02::"msg" (Time=%012d)\n",arg1,gSystemCycleCount) +#define TRACE_CPU2(msg,arg1,arg2) _RPT3(_CRT_WARN,"C65C02::"msg" (Time=%012d)\n",arg1,arg2,gSystemCycleCount) +#define TRACE_CPU3(msg,arg1,arg2,arg3) _RPT4(_CRT_WARN,"C65C02::"msg" (Time=%012d)\n",arg1,arg2,arg3,gSystemCycleCount) + +#else + +#define TRACE_CPU0(msg) +#define TRACE_CPU1(msg,arg1) +#define TRACE_CPU2(msg,arg1,arg2) +#define TRACE_CPU3(msg,arg1,arg2,arg3) + +#endif + +// +// Handy definitions +// + +#define NMI_VECTOR 0xfffa +#define BOOT_VECTOR 0xfffc +#define IRQ_VECTOR 0xfffe + +#define MAX_CPU_BREAKPOINTS 8 + +// +// ACCESS MACROS +// + +//#define CPU_PEEK(m) (mSystem.Peek_CPU(m)) +//#define CPU_PEEKW(m) (mSystem.PeekW_CPU(m)) +//#define CPU_POKE(m1,m2) (mSystem.Poke_CPU(m1,m2)) + +#define CPU_PEEK(m) (((m<0xfc00)?mRamPointer[m]:mSystem.Peek_CPU(m))) +#define CPU_PEEKW(m) (((m<0xfc00)?(mRamPointer[m]+(mRamPointer[m+1]<<8)):mSystem.PeekW_CPU(m))) +#define CPU_POKE(m1,m2) {if(m1<0xfc00) mRamPointer[m1]=m2; else mSystem.Poke_CPU(m1,m2);} + + +enum { illegal=0, + accu, + imm, + absl, + zp, + zpx, + zpy, + absx, + absy, + iabsx, + impl, + rel, + zrel, + indx, + indy, + iabs, + ind +}; + +typedef struct +{ + int PS; // Processor status register 8 bits + int A; // Accumulator 8 bits + int X; // X index register 8 bits + int Y; // Y index register 8 bits + int SP; // Stack Pointer 8 bits + int Opcode; // Instruction opcode 8 bits + int Operand;// Intructions operand 16 bits + int PC; // Program Counter 16 bits + bool NMI; + bool IRQ; + bool WAIT; +}C6502_REGS; + +// +// The CPU emulation macros +// +#include "c6502mak.h" +// +// The CPU emulation macros +// + +class C65C02 +{ + public: + C65C02(CSystemBase& parent) + :mSystem(parent) + { + TRACE_CPU0("C65C02()"); + // Compute the BCD lookup table + for(uint16 t=0;t<256;++t) + { + mBCDTable[0][t]=((t >> 4) * 10) + (t & 0x0f); + mBCDTable[1][t]=(((t % 100) / 10) << 4) | (t % 10); + } + Reset(); + + } + + ~C65C02() + { + TRACE_CPU0("~C65C02()"); + } + + public: + inline void Reset(void) + { + TRACE_CPU0("Reset()"); + mRamPointer=mSystem.GetRamPointer(); + mA=0; + mX=0; + mY=0; + mSP=0xff; + mOpcode=0; + mOperand=0; + mPC=CPU_PEEKW(BOOT_VECTOR); + mN=FALSE; + mV=FALSE; + mB=FALSE; + mD=FALSE; + mI=TRUE; + mZ=TRUE; + mC=FALSE; + mIRQActive=FALSE; + + gSystemNMI=FALSE; + gSystemIRQ=FALSE; + gSystemCPUSleep=FALSE; + } + + inline void StateAction(StateMem *sm, const unsigned load, const bool data_only) + { + uint8 mPS; + + SFORMAT CPURegs[] = + { + SFVAR(mA), SFVAR(mY), SFVAR(mX), SFVAR(mSP), SFVAR(mPS), SFVAR(mPC), SFVAR(mIRQActive), + SFEND + }; + + if(!load) + { + mPS=PS(); + } + + MDFNSS_StateAction(sm, load, data_only, CPURegs, "CPU"); + + if(load) + { + PS(mPS); + } + } + + void Update(void); + +// inline void SetBreakpoint(uint32 breakpoint) {mPcBreakpoint=breakpoint;}; + + INLINE void SetRegs(C6502_REGS ®s) + { + PS(regs.PS); + mA=regs.A; + mX=regs.X; + mY=regs.Y; + mSP=regs.SP; + mOpcode=regs.Opcode; + mOperand=regs.Operand; + mPC=regs.PC; + gSystemCPUSleep=regs.WAIT; + gSystemNMI=regs.NMI; + gSystemIRQ=regs.IRQ; + } + + INLINE void GetRegs(C6502_REGS ®s) + { + regs.PS=PS(); + regs.A=mA; + regs.X=mX; + regs.Y=mY; + regs.SP=mSP; + regs.Opcode=mOpcode; + regs.Operand=mOperand; + regs.PC=mPC; + regs.WAIT=(gSystemCPUSleep)?true:false; + regs.NMI=(gSystemNMI)?true:false; + regs.IRQ=(gSystemIRQ)?true:false; + } + + inline int GetPC(void) { return mPC; } + + private: + CSystemBase &mSystem; + + // CPU Flags & status + + int mA; // Accumulator 8 bits + int mX; // X index register 8 bits + int mY; // Y index register 8 bits + int mSP; // Stack Pointer 8 bits + int mOpcode; // Instruction opcode 8 bits + int mOperand; // Intructions operand 16 bits + int mPC; // Program Counter 16 bits + + int mN; // N flag for processor status register + int mV; // V flag for processor status register + int mB; // B flag for processor status register + int mD; // D flag for processor status register + int mI; // I flag for processor status register + int mZ; // Z flag for processor status register + int mC; // C flag for processor status register + + int mIRQActive; + + uint8 *mRamPointer; + + // Associated lookup tables + + int mBCDTable[2][256]; + + // + // Opcode prototypes + // + + private: + + // Answers value of the Processor Status register + INLINE int PS(void) const + { + uint8 ps = 0x20; + if(mN) ps|=0x80; + if(mV) ps|=0x40; + if(mB) ps|=0x10; + if(mD) ps|=0x08; + if(mI) ps|=0x04; + if(mZ) ps|=0x02; + if(mC) ps|=0x01; + return ps; + } + + + // Change the processor flags to correspond to the given value + INLINE void PS(int ps) + { + mN=ps&0x80; + mV=ps&0x40; + mB=ps&0x10; + mD=ps&0x08; + mI=ps&0x04; + mZ=ps&0x02; + mC=ps&0x01; + } + +}; + + +#endif + diff --git a/Mednafen/mednafen/lynx/cart.cpp b/Mednafen/mednafen/lynx/cart.cpp new file mode 100644 index 0000000000..a097fa215a --- /dev/null +++ b/Mednafen/mednafen/lynx/cart.cpp @@ -0,0 +1,436 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Lynx Cartridge Class // +////////////////////////////////////////////////////////////////////////////// +// // +// This class emulates the Lynx cartridge interface, given a filename it // +// will contstruct a cartridge object via the constructor. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#define CART_CPP + +#include "system.h" + +#include +#include +#include "cart.h" +#include +#include + +LYNX_HEADER CCart::DecodeHeader(const uint8 *data) +{ + LYNX_HEADER header; + + memcpy(header.magic, data, 4); + data += 4; + + header.page_size_bank0 = MDFN_de16lsb(data); + data += 2; + + header.page_size_bank1 = MDFN_de16lsb(data); + data += 2; + + header.version = MDFN_de16lsb(data); + data += 2; + + memcpy(header.cartname, data, 32); + data += 32; + + memcpy(header.manufname, data, 16); + data += 16; + + header.rotation = *data; + data++; + + memcpy(header.spare, data, 5); + data += 5; + + return(header); +} + +bool CCart::TestMagic(const uint8 *data, uint32 size) +{ + if(size < HEADER_RAW_SIZE) + return(FALSE); + + if(memcmp(data, "LYNX", 4) || data[8] != 0x01) + return(FALSE); + + return(TRUE); +} + +CCart::CCart(Stream* fp) +{ + uint64 gamesize; + uint8 raw_header[HEADER_RAW_SIZE]; + LYNX_HEADER header; + uint32 loop; + + mWriteEnableBank0 = FALSE; + mWriteEnableBank1 = FALSE; + mCartRAM = FALSE; + + if(fp) + { + gamesize = fp->size(); + // Checkout the header bytes + if(gamesize < HEADER_RAW_SIZE) + { + throw MDFN_Error(0, _("Lynx ROM image is too small: %llu bytes"), (unsigned long long)gamesize); + } + + fp->read(raw_header, HEADER_RAW_SIZE); + } + else + { + gamesize = HEADER_RAW_SIZE; + memset(raw_header, 0, sizeof(raw_header)); + memcpy(raw_header, "LYNX", 4); + raw_header[8] = 0x01; + } + + header = DecodeHeader(raw_header); + gamesize -= HEADER_RAW_SIZE; + + InfoROMSize = gamesize; + + // Sanity checks on the header + if(header.magic[0]!='L' || header.magic[1]!='Y' || header.magic[2]!='N' || header.magic[3]!='X' || header.version!=1) + { + throw MDFN_Error(0, _("Missing or corrupted \"LYNX\" header magic.")); + } + + // Setup name & manufacturer + strncpy(mName,(char*)&header.cartname, 32); + strncpy(mManufacturer,(char*)&header.manufname, 16); + + // Setup rotation + mRotation=header.rotation; + if(mRotation!=CART_NO_ROTATE && mRotation!=CART_ROTATE_LEFT && mRotation!=CART_ROTATE_RIGHT) mRotation=CART_NO_ROTATE; + + // Set the filetypes + + CTYPE banktype0,banktype1; + + switch(header.page_size_bank0) + { + case 0x000: + banktype0=UNUSED; + mMaskBank0=0; + mShiftCount0=0; + mCountMask0=0; + break; + case 0x100: + banktype0=C64K; + mMaskBank0=0x00ffff; + mShiftCount0=8; + mCountMask0=0x0ff; + break; + case 0x200: + banktype0=C128K; + mMaskBank0=0x01ffff; + mShiftCount0=9; + mCountMask0=0x1ff; + break; + case 0x400: + banktype0=C256K; + mMaskBank0=0x03ffff; + mShiftCount0=10; + mCountMask0=0x3ff; + break; + case 0x800: + banktype0=C512K; + mMaskBank0=0x07ffff; + mShiftCount0=11; + mCountMask0=0x7ff; + break; + default: + throw MDFN_Error(0, _("Lynx file format invalid (Bank0)")); + break; + } + + switch(header.page_size_bank1) + { + case 0x000: + banktype1=UNUSED; + mMaskBank1=0; + mShiftCount1=0; + mCountMask1=0; + break; + case 0x100: + banktype1=C64K; + mMaskBank1=0x00ffff; + mShiftCount1=8; + mCountMask1=0x0ff; + break; + case 0x200: + banktype1=C128K; + mMaskBank1=0x01ffff; + mShiftCount1=9; + mCountMask1=0x1ff; + break; + case 0x400: + banktype1=C256K; + mMaskBank1=0x03ffff; + mShiftCount1=10; + mCountMask1=0x3ff; + break; + case 0x800: + banktype1=C512K; + mMaskBank1=0x07ffff; + mShiftCount1=11; + mCountMask1=0x7ff; + break; + default: + throw MDFN_Error(0, _("Lynx file format invalid (Bank1)")); + break; + } + + // Make some space for the new carts + + mCartBank0.reset(new uint8[mMaskBank0+1]); + mCartBank1.reset(new uint8[mMaskBank1+1]); + + // Set default bank + + mBank=bank0; + + // Initialiase + + for(loop=0;loop(gamesize, mMaskBank0+1); + fp->read(mCartBank0.get(), size); + md5.update(mCartBank0.get(), size); + gamesize -= size; + } + + // Read in the BANK0 bytes + if(mMaskBank1) + { + uint64 size = std::min(gamesize, mMaskBank1+1); + fp->read(mCartBank1.get(), size); + md5.update(mCartBank1.get(), size); + } + + md5.finish(MD5); + + // As this is a cartridge boot unset the boot address + + gCPUBootAddress=0; + + // Dont allow an empty Bank1 - Use it for shadow SRAM/EEPROM + if(banktype1==UNUSED) + { + // Allocate some new memory for us + banktype1=C64K; + mMaskBank1=0x00ffff; + mShiftCount1=8; + mCountMask1=0x0ff; + mCartBank1.reset(new uint8[mMaskBank1+1]); + for(loop=0;loop mCartBank0; + std::unique_ptr mCartBank1; + char mName[33]; + char mManufacturer[17]; + uint32 mRotation; + + uint32 mCounter; + uint32 mShifter; + uint32 mAddrData; + uint32 mStrobe; + + uint32 mShiftCount0; + uint32 mCountMask0; + uint32 mShiftCount1; + uint32 mCountMask1; + + int8 last_strobe; +}; + +#endif + diff --git a/Mednafen/mednafen/lynx/license.txt b/Mednafen/mednafen/lynx/license.txt new file mode 100644 index 0000000000..1352778411 --- /dev/null +++ b/Mednafen/mednafen/lynx/license.txt @@ -0,0 +1,21 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// \ No newline at end of file diff --git a/Mednafen/mednafen/lynx/lynxbase.h b/Mednafen/mednafen/lynx/lynxbase.h new file mode 100644 index 0000000000..196a1aa129 --- /dev/null +++ b/Mednafen/mednafen/lynx/lynxbase.h @@ -0,0 +1,57 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +// +// Generic Lynx base class. +// + +#ifndef LYNXBASE_H +#define LYNXBASE_H + +// +// bank0 - Cartridge bank 0 +// bank1 - Cartridge bank 1 +// ram - all ram +// cpu - system memory as viewed by the cpu +// +enum EMMODE {bank0,bank1,ram,cpu}; + +class CLynxBase +{ + // Function members + + public: + virtual ~CLynxBase() {}; + + public: + virtual void Reset(void) {}; + + virtual void Poke(uint32 addr,uint8 data)=0; + virtual uint8 Peek(uint32 addr)=0; + virtual void PokeW(uint32 addr,uint16 data) {}; // ONLY mSystem overloads these, they are never use by the clients + virtual uint16 PeekW(uint32 addr) {return 0;}; + virtual void BankSelect(EMMODE newbank){}; + virtual uint32 ObjectSize(void) {return 1;}; + +}; +#endif + diff --git a/Mednafen/mednafen/lynx/lynxdef.h b/Mednafen/mednafen/lynx/lynxdef.h new file mode 100644 index 0000000000..f8b3d62b3e --- /dev/null +++ b/Mednafen/mednafen/lynx/lynxdef.h @@ -0,0 +1,287 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Generic lyynx definition header file // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the definition of all of the useful hardware // +// addreses within the Lynx. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#define TMPADR 0xfc00 +#define TMPADRL 0xfc00 +#define TMPADRH 0xfc01 +#define TILTACUM 0xfc02 +#define TILTACUML 0xfc02 +#define TILTACUMH 0xfc03 +#define HOFF 0xfc04 +#define HOFFL 0xfc04 +#define HOFFH 0xfc05 +#define VOFF 0xfc06 +#define VOFFL 0xfc06 +#define VOFFH 0xfc07 +#define VIDBAS 0xfc08 +#define VIDBASL 0xfc08 +#define VIDBASH 0xfc09 +#define COLLBAS 0xfc0a +#define COLLBASL 0xfc0a +#define COLLBASH 0xfc0b +#define VIDADR 0xfc0c +#define VIDADRL 0xfc0c +#define VIDADRH 0xfc0d +#define COLLADR 0xfc0e +#define COLLADRL 0xfc0e +#define COLLADRH 0xfc0f +#define SCBNEXT 0xfc10 +#define SCBNEXTL 0xfc10 +#define SCBNEXTH 0xfc11 +#define SPRDLINE 0xfc12 +#define SPRDLINEL 0xfc12 +#define SPRDLINEH 0xfc13 +#define HPOSSTRT 0xfc14 +#define HPOSSTRTL 0xfc14 +#define HPOSSTRTH 0xfc15 +#define VPOSSTRT 0xfc16 +#define VPOSSTRTL 0xfc16 +#define VPOSSTRTH 0xfc17 +#define SPRHSIZ 0xfc18 +#define SPRHSIZL 0xfc18 +#define SPRHSIZH 0xfc19 +#define SPRVSIZ 0xfc1a +#define SPRVSIZL 0xfc1a +#define SPRVSIZH 0xfc1b +#define STRETCH 0xfc1c +#define STRETCHL 0xfc1c +#define STRETCHH 0xfc1d +#define TILT 0xfc1e +#define TILTL 0xfc1e +#define TILTH 0xfc1f +#define SPRDOFF 0xfc20 +#define SPRDOFFL 0xfc20 +#define SPRDOFFH 0xfc21 +#define SPRVPOS 0xfc22 +#define SPRVPOSL 0xfc22 +#define SPRVPOSH 0xfc23 +#define COLLOFF 0xfc24 +#define COLLOFFL 0xfc24 +#define COLLOFFH 0xfc25 +#define VSIZACUM 0xfc26 +#define VSIZACUML 0xfc26 +#define VSIZACUMH 0xfc27 +#define HSIZOFF 0xfc28 +#define HSIZOFFL 0xfc28 +#define HSIZOFFH 0xfc29 +#define VSIZOFF 0xfc2a +#define VSIZOFFL 0xfc2a +#define VSIZOFFH 0xfc2b +#define SCBADR 0xfc2c +#define SCBADRL 0xfc2c +#define SCBADRH 0xfc2d +#define PROCADR 0xfc2e +#define PROCADRL 0xfc2e +#define PROCADRH 0xfc2f +#define MATHD 0xfc52 +#define MATHC 0xfc53 +#define MATHB 0xfc54 +#define MATHA 0xfc55 +#define MATHP 0xfc56 +#define MATHN 0xfc57 +#define MATHH 0xfc60 +#define MATHG 0xfc61 +#define MATHF 0xfc62 +#define MATHE 0xfc63 +#define MATHM 0xfc6c +#define MATHL 0xfc6d +#define MATHK 0xfc6e +#define MATHJ 0xfc6f +#define SPRCTL0 0xfc80 +#define SPRCTL1 0xfc81 +#define SPRCOLL 0xfc82 +#define SPRINIT 0xfc83 +#define SUZYHREV 0xfc88 +#define SUZYSREV 0xfc89 +#define SUZYBUSEN 0xfc90 +#define SPRGO 0xfc91 +#define SPRSYS 0xfc92 +#define JOYSTICK 0xfcb0 +#define SWITCHES 0xfcb1 +#define RCART0 0xfcb2 +#define RCART1 0xfcb3 +#define LEDS 0xfcc0 +#define PPORTSTAT 0xfcc2 +#define PPORTDATA 0xfcc3 +#define HOWIE 0xfcc4 +#define TIM0BKUP 0xfd00 +#define TIM0CTLA 0xfd01 +#define TIM0CNT 0xfd02 +#define TIM0CTLB 0xfd03 +#define TIM1BKUP 0xfd04 +#define TIM1CTLA 0xfd05 +#define TIM1CNT 0xfd06 +#define TIM1CTLB 0xfd07 +#define TIM2BKUP 0xfd08 +#define TIM2CTLA 0xfd09 +#define TIM2CNT 0xfd0a +#define TIM2CTLB 0xfd0b +#define TIM3BKUP 0xfd0c +#define TIM3CTLA 0xfd0d +#define TIM3CNT 0xfd0e +#define TIM3CTLB 0xfd0f +#define TIM4BKUP 0xfd10 +#define TIM4CTLA 0xfd11 +#define TIM4CNT 0xfd12 +#define TIM4CTLB 0xfd13 +#define TIM5BKUP 0xfd14 +#define TIM5CTLA 0xfd15 +#define TIM5CNT 0xfd16 +#define TIM5CTLB 0xfd17 +#define TIM6BKUP 0xfd18 +#define TIM6CTLA 0xfd19 +#define TIM6CNT 0xfd1a +#define TIM6CTLB 0xfd1b +#define TIM7BKUP 0xfd1c +#define TIM7CTLA 0xfd1d +#define TIM7CNT 0xfd1e +#define TIM7CTLB 0xfd1f + +#define AUD0VOL 0xfd20 +#define AUD0SHFTFB 0xfd21 +#define AUD0OUTVAL 0xfd22 +#define AUD0L8SHFT 0xfd23 +#define AUD0TBACK 0xfd24 +#define AUD0CTL 0xfd25 +#define AUD0COUNT 0xfd26 +#define AUD0MISC 0xfd27 + +#define AUD1VOL 0xfd28 +#define AUD1SHFTFB 0xfd29 +#define AUD1OUTVAL 0xfd2a +#define AUD1L8SHFT 0xfd2b +#define AUD1TBACK 0xfd2c +#define AUD1CTL 0xfd2d +#define AUD1COUNT 0xfd2e +#define AUD1MISC 0xfd2f + +#define AUD2VOL 0xfd30 +#define AUD2SHFTFB 0xfd31 +#define AUD2OUTVAL 0xfd32 +#define AUD2L8SHFT 0xfd33 +#define AUD2TBACK 0xfd34 +#define AUD2CTL 0xfd35 +#define AUD2COUNT 0xfd36 +#define AUD2MISC 0xfd37 + +#define AUD3VOL 0xfd38 +#define AUD3SHFTFB 0xfd39 +#define AUD3OUTVAL 0xfd3a +#define AUD3L8SHFT 0xfd3b +#define AUD3TBACK 0xfd3c +#define AUD3CTL 0xfd3d +#define AUD3COUNT 0xfd3e +#define AUD3MISC 0xfd3f + +#define ATTEN_A 0xFD40 // +#define ATTEN_B 0xFD41 +#define ATTEN_C 0xFD42 // Lynx2 Regs see macros/handy.equ +#define ATTEN_D 0xFD43 +#define MPAN 0xFD44 // +#define MSTEREO 0xfd50 +#define INTRST 0xfd80 +#define INTSET 0xfd81 +#define MAGRDY0 0xfd84 +#define MAGRDY1 0xfd85 +#define AUDIN 0xfd86 +#define SYSCTL1 0xfd87 +#define MIKEYHREV 0xfd88 +#define MIKEYSREV 0xfd89 +#define IODIR 0xfd8a +#define IODAT 0xfd8b +#define SERCTL 0xfd8c +#define SERDAT 0xfd8d +#define SDONEACK 0xfd90 +#define CPUSLEEP 0xfd91 +#define DISPCTL 0xfd92 +#define PBKUP 0xfd93 +#define DISPADR 0xfd94 +#define DISPADRL 0xfd94 +#define DISPADRH 0xfd95 +#define Mtest0 0xfd9c +#define Mtest1 0xfd9d +#define Mtest2 0xfd9e +#define GREEN0 0xfda0 +#define GREEN1 0xfda1 +#define GREEN2 0xfda2 +#define GREEN3 0xfda3 +#define GREEN4 0xfda4 +#define GREEN5 0xfda5 +#define GREEN6 0xfda6 +#define GREEN7 0xfda7 +#define GREEN8 0xfda8 +#define GREEN9 0xfda9 +#define GREENA 0xfdaa +#define GREENB 0xfdab +#define GREENC 0xfdac +#define GREEND 0xfdad +#define GREENE 0xfdae +#define GREENF 0xfdaf +#define BLUERED0 0xfdb0 +#define BLUERED1 0xfdb1 +#define BLUERED2 0xfdb2 +#define BLUERED3 0xfdb3 +#define BLUERED4 0xfdb4 +#define BLUERED5 0xfdb5 +#define BLUERED6 0xfdb6 +#define BLUERED7 0xfdb7 +#define BLUERED8 0xfdb8 +#define BLUERED9 0xfdb9 +#define BLUEREDA 0xfdba +#define BLUEREDB 0xfdbb +#define BLUEREDC 0xfdbc +#define BLUEREDD 0xfdbd +#define BLUEREDE 0xfdbe +#define BLUEREDF 0xfdbf +#define MMAPCTL 0xfff9 +#define CPUNMI 0xfffa +#define CPUNMIL 0xfffa +#define CPUNMIH 0xfffb +#define CPURESET 0xfffc +#define CPURESETL 0xfffc +#define CPURESETH 0xfffd +#define CPUINT 0xfffe +#define CPUINTL 0xfffe +#define CPUINTH 0xffff + diff --git a/Mednafen/mednafen/lynx/machine.h b/Mednafen/mednafen/lynx/machine.h new file mode 100644 index 0000000000..31fcd3c8f7 --- /dev/null +++ b/Mednafen/mednafen/lynx/machine.h @@ -0,0 +1,83 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Core machine definitions header file // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the interface definition and code for the core // +// definitions used throughout the Handy code. Additionally it provides // +// a generic memory object definition. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef MACHINE_H +#define MACHINE_H + +#include + +typedef struct +{ + union + { + struct + { + #ifdef MSB_FIRST + uint8 High; + uint8 Low; + #else + uint8 Low; + uint8 High; + #endif + } Union8; + uint16 Val16; + }; +} Uuint16; + +// Read/Write Cycle definitions +#define CPU_RDWR_CYC 5 +#define DMA_RDWR_CYC 4 +#define SPR_RDWR_CYC 3 +// Ammended to 2 on 28/04/00, 16Mhz = 62.5nS cycle +// +// 2 cycles is 125ns - PAGE MODE CYCLE +// 4 cycles is 250ns - NORMAL MODE CYCLE +// + +#include "lynxbase.h" + +#endif + + diff --git a/Mednafen/mednafen/lynx/memmap.cpp b/Mednafen/mednafen/lynx/memmap.cpp new file mode 100644 index 0000000000..b67b3172e5 --- /dev/null +++ b/Mednafen/mednafen/lynx/memmap.cpp @@ -0,0 +1,218 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Lynx memory map class // +////////////////////////////////////////////////////////////////////////////// +// // +// This class provides the register $FFF9 functionality to the emulator, it // +// sets which devices can be seen by the CPU. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#define MEMMAP_CPP + +//#include +//#define TRACE_MEMMAP + +#include "system.h" +#include "memmap.h" + +#include + +// IGNORE THIS TEXT, now overridden by new system +// +// We will hold 16 different memory maps for the "top" area which are selected +// on the basis of mMemMap->mSelector: +// +// Code Vect ROM Mikie Susie +//---------------------------------------------------- +// (Default) 0000 V R M S +// 0001 V R M RAM +// 0001 V R RAM S +// 0011 V R RAM RAM +// 0100 V RAM M S +// .. +// .. +// 1111 RAM RAM RAM RAM +// +// Get it..... +// +// We can then index with mMemoryHandlers[mMemMap->mSelector][addr] for speed +// + +CMemMap::CMemMap(CSystem& parent) + :mSystem(parent) +{ + Reset(); +} + + +void CMemMap::Reset(void) +{ + + // Initialise ALL pointers to RAM then overload to correct + for(int loop=0;loopUpdate() doesnt have to call it // +// every cycle, massive speedup but big complexity headache. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#define MIKIE_CPP + +//#include +//#define TRACE_MIKIE + +#include "system.h" +#include "mikie.h" +#include "lynxdef.h" + + +void CMikie::BlowOut(void) +{ + C6502_REGS regs; + mSystem.GetRegs(regs); + //sprintf(addr,"Runtime Error - System Halted\nCMikie::Poke() - Read/Write to counter clocks at PC=$%04x.",regs.PC); + //gError->Warning(addr); + gSystemHalt=TRUE; +} + + +CMikie::CMikie(CSystem& parent) + :mSystem(parent) +{ + TRACE_MIKIE0("CMikie()"); + + mpDisplayCurrent=NULL; + mpRamPointer=NULL; + + mUART_CABLE_PRESENT=FALSE; + mpUART_TX_CALLBACK=NULL; + + int loop; + for(loop=0;loop<16;loop++) mPalette[loop].Index=loop; + for(loop=0;loop<4096;loop++) mColourMap[loop]=0; + + Reset(); +} + +CMikie::~CMikie() +{ + TRACE_MIKIE0("~CMikie()"); +} + + +void CMikie::Reset(void) +{ + TRACE_MIKIE0("Reset()"); + + mAudioInputComparator=FALSE; // Initialises to unknown + mDisplayAddress=0x00; // Initialises to unknown + mLynxLine=0; + mLynxLineDMACounter=0; + mLynxAddr=0; + + mTimerStatusFlags=0x00; // Initialises to ZERO, i.e No IRQ's + mTimerInterruptMask=0x00; + + mpRamPointer=mSystem.GetRamPointer(); // Fetch pointer to system RAM + + mTIM_0_BKUP=0; + mTIM_0_ENABLE_RELOAD=0; + mTIM_0_ENABLE_COUNT=0; + mTIM_0_LINKING=0; + mTIM_0_CURRENT=0; + mTIM_0_TIMER_DONE=0; + mTIM_0_LAST_CLOCK=0; + mTIM_0_BORROW_IN=0; + mTIM_0_BORROW_OUT=0; + mTIM_0_LAST_LINK_CARRY=0; + mTIM_0_LAST_COUNT=0; + + mTIM_1_BKUP=0; + mTIM_1_ENABLE_RELOAD=0; + mTIM_1_ENABLE_COUNT=0; + mTIM_1_LINKING=0; + mTIM_1_CURRENT=0; + mTIM_1_TIMER_DONE=0; + mTIM_1_LAST_CLOCK=0; + mTIM_1_BORROW_IN=0; + mTIM_1_BORROW_OUT=0; + mTIM_1_LAST_LINK_CARRY=0; + mTIM_1_LAST_COUNT=0; + + mTIM_2_BKUP=0; + mTIM_2_ENABLE_RELOAD=0; + mTIM_2_ENABLE_COUNT=0; + mTIM_2_LINKING=0; + mTIM_2_CURRENT=0; + mTIM_2_TIMER_DONE=0; + mTIM_2_LAST_CLOCK=0; + mTIM_2_BORROW_IN=0; + mTIM_2_BORROW_OUT=0; + mTIM_2_LAST_LINK_CARRY=0; + mTIM_2_LAST_COUNT=0; + + mTIM_3_BKUP=0; + mTIM_3_ENABLE_RELOAD=0; + mTIM_3_ENABLE_COUNT=0; + mTIM_3_LINKING=0; + mTIM_3_CURRENT=0; + mTIM_3_TIMER_DONE=0; + mTIM_3_LAST_CLOCK=0; + mTIM_3_BORROW_IN=0; + mTIM_3_BORROW_OUT=0; + mTIM_3_LAST_LINK_CARRY=0; + mTIM_3_LAST_COUNT=0; + + mTIM_4_BKUP=0; + mTIM_4_ENABLE_RELOAD=0; + mTIM_4_ENABLE_COUNT=0; + mTIM_4_LINKING=0; + mTIM_4_CURRENT=0; + mTIM_4_TIMER_DONE=0; + mTIM_4_LAST_CLOCK=0; + mTIM_4_BORROW_IN=0; + mTIM_4_BORROW_OUT=0; + mTIM_4_LAST_LINK_CARRY=0; + mTIM_4_LAST_COUNT=0; + + mTIM_5_BKUP=0; + mTIM_5_ENABLE_RELOAD=0; + mTIM_5_ENABLE_COUNT=0; + mTIM_5_LINKING=0; + mTIM_5_CURRENT=0; + mTIM_5_TIMER_DONE=0; + mTIM_5_LAST_CLOCK=0; + mTIM_5_BORROW_IN=0; + mTIM_5_BORROW_OUT=0; + mTIM_5_LAST_LINK_CARRY=0; + mTIM_5_LAST_COUNT=0; + + mTIM_6_BKUP=0; + mTIM_6_ENABLE_RELOAD=0; + mTIM_6_ENABLE_COUNT=0; + mTIM_6_LINKING=0; + mTIM_6_CURRENT=0; + mTIM_6_TIMER_DONE=0; + mTIM_6_LAST_CLOCK=0; + mTIM_6_BORROW_IN=0; + mTIM_6_BORROW_OUT=0; + mTIM_6_LAST_LINK_CARRY=0; + mTIM_6_LAST_COUNT=0; + + mTIM_7_BKUP=0; + mTIM_7_ENABLE_RELOAD=0; + mTIM_7_ENABLE_COUNT=0; + mTIM_7_LINKING=0; + mTIM_7_CURRENT=0; + mTIM_7_TIMER_DONE=0; + mTIM_7_LAST_CLOCK=0; + mTIM_7_BORROW_IN=0; + mTIM_7_BORROW_OUT=0; + mTIM_7_LAST_LINK_CARRY=0; + mTIM_7_LAST_COUNT=0; + + for(int y = 0; y < 4; y++) + { + mAUDIO_BKUP[y]=0; + mAUDIO_ENABLE_RELOAD[y]=0; + mAUDIO_ENABLE_COUNT[y]=0; + mAUDIO_LINKING[y]=0; + mAUDIO_CURRENT[y]=0; + mAUDIO_TIMER_DONE[y]=0; + mAUDIO_LAST_CLOCK[y]=0; + mAUDIO_BORROW_IN[y]=0; + mAUDIO_BORROW_OUT[y]=0; + mAUDIO_LAST_LINK_CARRY[y]=0; + mAUDIO_LAST_COUNT[y]=0; + mAUDIO_VOLUME[y]=0; + mAUDIO_INTEGRATE_ENABLE[y]=0; + mAUDIO_WAVESHAPER[y]=0; + + mAUDIO_OUTPUT[y] = 0; + } + mSTEREO=0xff; // xored! All channels enabled + mPAN=0x00; // all channels panning OFF + mAUDIO_ATTEN[0]=0xff; // Full volume + mAUDIO_ATTEN[1]=0xff; + mAUDIO_ATTEN[2]=0xff; + mAUDIO_ATTEN[3]=0xff; + + // Start with an empty palette + + for(int loop=0;loop<16;loop++) + { + mPalette[loop].Index=loop; + } + + // Initialise IODAT register + + mIODAT=0x00; + mIODIR=0x00; + mIODAT_REST_SIGNAL=0x00; + + // + // Initialise display control register vars + // + mDISPCTL_DMAEnable=FALSE; + mDISPCTL_Flip=FALSE; + mDISPCTL_FourColour=0; + mDISPCTL_Colour=0; + + // + // Initialise the UART variables + // + mUART_RX_IRQ_ENABLE=0; + mUART_TX_IRQ_ENABLE=0; + + mUART_TX_COUNTDOWN=UART_TX_INACTIVE; + mUART_RX_COUNTDOWN=UART_RX_INACTIVE; + + mUART_Rx_input_ptr=0; + mUART_Rx_output_ptr=0; + mUART_Rx_waiting=0; + mUART_Rx_framing_error=0; + mUART_Rx_overun_error=0; + + mUART_SENDBREAK=0; + mUART_TX_DATA=0; + mUART_RX_DATA=0; + mUART_RX_READY=0; + + mUART_PARITY_ENABLE=0; + mUART_PARITY_EVEN=0; +} + +uint32 CMikie::GetLfsrNext(uint32 current) +{ + // The table is built thus: + // Bits 0-11 LFSR (12 Bits) + // Bits 12-20 Feedback switches (9 Bits) + // (Order = 7,0,1,2,3,4,5,10,11) + // Order is mangled to make peek/poke easier as + // bit 7 is in a seperate register + // + // Total 21 bits = 2MWords @ 4 Bytes/Word = 8MB !!!!! + // + // If the index is a combination of Current LFSR+Feedback the + // table will give the next value. + + uint32 switches,lfsr,next,swloop,result; + static const uint32 switchbits[9]={7,0,1,2,3,4,5,10,11}; + + switches=current>>12; + lfsr=current&0xfff; + result=0; + for(swloop=0;swloop<9;swloop++) + { + if((switches>>swloop)&0x001) result^=(lfsr>>switchbits[swloop])&0x001; + } + result=(result)?0:1; + next=(switches<<12)|((lfsr<<1)&0xffe)|result; + return next; +} + +void CMikie::PresetForHomebrew(void) +{ + TRACE_MIKIE0("PresetForHomebrew()"); + + // + // After all of that nice timer init we'll start timers running as some homebrew + // i.e LR.O doesn't bother to setup the timers + + mTIM_0_BKUP=0x9e; + mTIM_0_ENABLE_RELOAD=TRUE; + mTIM_0_ENABLE_COUNT=TRUE; + + mTIM_2_BKUP=0x68; + mTIM_2_ENABLE_RELOAD=TRUE; + mTIM_2_ENABLE_COUNT=TRUE; + mTIM_2_LINKING=7; + + mDISPCTL_DMAEnable=TRUE; + mDISPCTL_Flip=FALSE; + mDISPCTL_FourColour=0; + mDISPCTL_Colour=TRUE; +} + +void CMikie::ComLynxCable(int status) +{ + mUART_CABLE_PRESENT=status; +} + +void CMikie::ComLynxRxData(int data) +{ + TRACE_MIKIE1("ComLynxRxData() - Received %04x",data); + // Copy over the data + if(mUART_Rx_waiting +void CMikie::CopyLineSurface(void) +{ + T* bitmap_tmp = mpDisplayCurrent->pix() + mpDisplayCurrentLine * mpDisplayCurrent->pitchinpix; + + if(mpDisplayCurrentLine > 102) + { + printf("Lynx Line Overflow: %d\n", mpDisplayCurrentLine); + return; + } + + for(uint32 loop = 0; loop < SCREEN_WIDTH / 2; loop++) + { + uint32 source = mpRamPointer[(uint16)mLynxAddr]; + if(mDISPCTL_Flip) + { + mLynxAddr--; + *bitmap_tmp=mColourMap[mPalette[source&0x0f].Index]; + bitmap_tmp++; + *bitmap_tmp=mColourMap[mPalette[source>>4].Index]; + bitmap_tmp++; + } + else + { + mLynxAddr++; + *bitmap_tmp = mColourMap[mPalette[source>>4].Index]; + bitmap_tmp++; + *bitmap_tmp = mColourMap[mPalette[source&0x0f].Index]; + bitmap_tmp++; + } + } +} + +uint32 CMikie::DisplayRenderLine(void) +{ + uint32 work_done=0; + + if(!mpDisplayCurrent) return 0; + if(!mDISPCTL_DMAEnable) return 0; +// if(mLynxLine&0x80000000) return 0; + + // Set the timer interrupt flag + if(mTimerInterruptMask&0x01) + { + TRACE_MIKIE0("Update() - TIMER0 IRQ Triggered (Line Timer)"); + mTimerStatusFlags|=0x01; + } + +// Logic says it should be 101 but testing on an actual lynx shows the rest +// persiod is between lines 102,101,100 with the new line being latched at +// the beginning of count==99 hence the code below !! + + // Emulate REST signal + if(mLynxLine==mTIM_2_BKUP-2 || mLynxLine==mTIM_2_BKUP-3 || mLynxLine==mTIM_2_BKUP-4) mIODAT_REST_SIGNAL=TRUE; else mIODAT_REST_SIGNAL=FALSE; + + if(mLynxLine==(mTIM_2_BKUP-3)) + { + if(mDISPCTL_Flip) + { + mLynxAddr=mDisplayAddress&0xfffc; + mLynxAddr+=3; + } + else + { + mLynxAddr=mDisplayAddress&0xfffc; + } + // Trigger line rending to start + mLynxLineDMACounter=102; + } + + // Decrement line counter logic + if(mLynxLine) mLynxLine--; + + // Do 102 lines, nothing more, less is OK. + if(mLynxLineDMACounter) + { +// TRACE_MIKIE1("Update() - Screen DMA, line %03d",line_count); + mLynxLineDMACounter--; + + // Cycle hit for a 80 RAM access in rendering a line + work_done+=80*DMA_RDWR_CYC; + + // Mikie screen DMA can only see the system RAM.... + // (Step through bitmap, line at a time) + + // Assign the temporary pointer; + if(!mpSkipFrame) + { + switch(mpDisplayCurrent->format.bpp) + { + case 16: + CopyLineSurface(); + break; + + case 32: + CopyLineSurface(); + break; + } + + if(mpDisplayCurrentLine < 102) + LynxLineDrawn[mpDisplayCurrentLine] = TRUE; + + mpDisplayCurrentLine++; + } + } + return work_done; +} + +uint32 CMikie::DisplayEndOfFrame(void) +{ + // Stop any further line rendering + mLynxLineDMACounter=0; + mLynxLine=mTIM_2_BKUP; + + // Set the timer status flag + if(mTimerInterruptMask&0x04) + { + TRACE_MIKIE0("Update() - TIMER2 IRQ Triggered (Frame Timer)"); + mTimerStatusFlags|=0x04; + } + + mpDisplayCurrent = NULL; + return 0; +} + +// Peek/Poke memory handlers + +void CMikie::Poke(uint32 addr,uint8 data) +{ + /* Sound register area */ + if(addr >= 0xFD20 && addr <= 0xFD3F) + { + int which = (addr - 0xFD20) >> 3; // Each channel gets 8 ports/registers + switch(addr & 0x7) + { + case (AUD0VOL&0x7): + mAUDIO_VOLUME[which]=(int8)data; + TRACE_MIKIE2("Poke(AUD0VOL,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0SHFTFB&0x7): + mAUDIO_WAVESHAPER[which]&=0x001fff; + mAUDIO_WAVESHAPER[which]|=(uint32)data<<13; + TRACE_MIKIE2("Poke(AUD0SHFTB,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0OUTVAL&0x7): + mAUDIO_OUTPUT[which]=data; + TRACE_MIKIE2("Poke(AUD0OUTVAL,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0L8SHFT&0x7): + mAUDIO_WAVESHAPER[which]&=0x1fff00; + mAUDIO_WAVESHAPER[which]|=data; + TRACE_MIKIE2("Poke(AUD0L8SHFT,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0TBACK&0x7): + mAUDIO_BKUP[which]=data; + TRACE_MIKIE2("Poke(AUD0TBACK,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0CTL&0x7): + mAUDIO_ENABLE_RELOAD[which]=data&0x10; + mAUDIO_ENABLE_COUNT[which]=data&0x08; + mAUDIO_LINKING[which]=data&0x07; + mAUDIO_INTEGRATE_ENABLE[which]=data&0x20; + if(data&0x40) mAUDIO_TIMER_DONE[which]=0; + mAUDIO_WAVESHAPER[which]&=0x1fefff; + mAUDIO_WAVESHAPER[which]|=(data&0x80)?0x001000:0x000000; + if(data&0x48) + { + mAUDIO_LAST_COUNT[which]=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(AUD0CTL,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0COUNT&0x7): + mAUDIO_CURRENT[which]=data; + TRACE_MIKIE2("Poke(AUD0COUNT,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (AUD0MISC&0x7): + mAUDIO_WAVESHAPER[which]&=0x1ff0ff; + mAUDIO_WAVESHAPER[which]|=(data&0xf0)<<4; + mAUDIO_BORROW_IN[which]=data&0x02; + mAUDIO_BORROW_OUT[which]=data&0x01; + mAUDIO_LAST_CLOCK[which]=data&0x04; + TRACE_MIKIE2("Poke(AUD0MISC,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + } + } + else switch(addr&0xff) + { + case (TIM0BKUP&0xff): + mTIM_0_BKUP=data; + TRACE_MIKIE2("Poke(TIM0BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM1BKUP&0xff): + mTIM_1_BKUP=data; + TRACE_MIKIE2("Poke(TIM1BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM2BKUP&0xff): + mTIM_2_BKUP=data; + TRACE_MIKIE2("Poke(TIM2BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM3BKUP&0xff): + mTIM_3_BKUP=data; + TRACE_MIKIE2("Poke(TIM3BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM4BKUP&0xff): + mTIM_4_BKUP=data; + TRACE_MIKIE2("Poke(TIM4BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM5BKUP&0xff): + mTIM_5_BKUP=data; + TRACE_MIKIE2("Poke(TIM5BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM6BKUP&0xff): + mTIM_6_BKUP=data; + TRACE_MIKIE2("Poke(TIM6BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM7BKUP&0xff): + mTIM_7_BKUP=data; + TRACE_MIKIE2("Poke(TIM7BKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + + case (TIM0CTLA&0xff): + mTimerInterruptMask&=(0x01^0xff); + mTimerInterruptMask|=(data&0x80)?0x01:0x00; + mTIM_0_ENABLE_RELOAD=data&0x10; + mTIM_0_ENABLE_COUNT=data&0x08; + mTIM_0_LINKING=data&0x07; + if(data&0x40) mTIM_0_TIMER_DONE=0; + if(data&0x48) + { + mTIM_0_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM0CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM1CTLA&0xff): + mTimerInterruptMask&=(0x02^0xff); + mTimerInterruptMask|=(data&0x80)?0x02:0x00; + mTIM_1_ENABLE_RELOAD=data&0x10; + mTIM_1_ENABLE_COUNT=data&0x08; + mTIM_1_LINKING=data&0x07; + if(data&0x40) mTIM_1_TIMER_DONE=0; + if(data&0x48) + { + mTIM_1_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM1CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM2CTLA&0xff): + mTimerInterruptMask&=(0x04^0xff); + mTimerInterruptMask|=(data&0x80)?0x04:0x00; + mTIM_2_ENABLE_RELOAD=data&0x10; + mTIM_2_ENABLE_COUNT=data&0x08; + mTIM_2_LINKING=data&0x07; + if(data&0x40) mTIM_2_TIMER_DONE=0; + if(data&0x48) + { + mTIM_2_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM2CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM3CTLA&0xff): + mTimerInterruptMask&=(0x08^0xff); + mTimerInterruptMask|=(data&0x80)?0x08:0x00; + mTIM_3_ENABLE_RELOAD=data&0x10; + mTIM_3_ENABLE_COUNT=data&0x08; + mTIM_3_LINKING=data&0x07; + if(data&0x40) mTIM_3_TIMER_DONE=0; + if(data&0x48) + { + mTIM_3_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM3CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM4CTLA&0xff): + // Timer 4 can never generate interrupts as its timer output is used + // to drive the UART clock generator + mTIM_4_ENABLE_RELOAD=data&0x10; + mTIM_4_ENABLE_COUNT=data&0x08; + mTIM_4_LINKING=data&0x07; + if(data&0x40) mTIM_4_TIMER_DONE=0; + if(data&0x48) + { + mTIM_4_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM4CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM5CTLA&0xff): + mTimerInterruptMask&=(0x20^0xff); + mTimerInterruptMask|=(data&0x80)?0x20:0x00; + mTIM_5_ENABLE_RELOAD=data&0x10; + mTIM_5_ENABLE_COUNT=data&0x08; + mTIM_5_LINKING=data&0x07; + if(data&0x40) mTIM_5_TIMER_DONE=0; + if(data&0x48) + { + mTIM_5_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM5CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM6CTLA&0xff): + mTimerInterruptMask&=(0x40^0xff); + mTimerInterruptMask|=(data&0x80)?0x40:0x00; + mTIM_6_ENABLE_RELOAD=data&0x10; + mTIM_6_ENABLE_COUNT=data&0x08; + mTIM_6_LINKING=data&0x07; + if(data&0x40) mTIM_6_TIMER_DONE=0; + if(data&0x48) + { + mTIM_6_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM6CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM7CTLA&0xff): + mTimerInterruptMask&=(0x80^0xff); + mTimerInterruptMask|=(data&0x80)?0x80:0x00; + mTIM_7_ENABLE_RELOAD=data&0x10; + mTIM_7_ENABLE_COUNT=data&0x08; + mTIM_7_LINKING=data&0x07; + if(data&0x40) mTIM_7_TIMER_DONE=0; + if(data&0x48) + { + mTIM_7_LAST_COUNT=gSystemCycleCount; + gNextTimerEvent=gSystemCycleCount; + } + TRACE_MIKIE2("Poke(TIM7CTLA,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + + case (TIM0CNT&0xff): + mTIM_0_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM0CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM1CNT&0xff): + mTIM_1_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM1CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM2CNT&0xff): + mTIM_2_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM2CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM3CNT&0xff): + mTIM_3_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM3CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM4CNT&0xff): + mTIM_4_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM4CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM5CNT&0xff): + mTIM_5_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM5CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM6CNT&0xff): + mTIM_6_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM6CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (TIM7CNT&0xff): + mTIM_7_CURRENT=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(TIM7CNT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + case (TIM0CTLB&0xff): + mTIM_0_TIMER_DONE=data&0x08; + mTIM_0_LAST_CLOCK=data&0x04; + mTIM_0_BORROW_IN=data&0x02; + mTIM_0_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM0CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM1CTLB&0xff): + mTIM_1_TIMER_DONE=data&0x08; + mTIM_1_LAST_CLOCK=data&0x04; + mTIM_1_BORROW_IN=data&0x02; + mTIM_1_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM1CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM2CTLB&0xff): + mTIM_2_TIMER_DONE=data&0x08; + mTIM_2_LAST_CLOCK=data&0x04; + mTIM_2_BORROW_IN=data&0x02; + mTIM_2_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM2CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM3CTLB&0xff): + mTIM_3_TIMER_DONE=data&0x08; + mTIM_3_LAST_CLOCK=data&0x04; + mTIM_3_BORROW_IN=data&0x02; + mTIM_3_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM3CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM4CTLB&0xff): + mTIM_4_TIMER_DONE=data&0x08; + mTIM_4_LAST_CLOCK=data&0x04; + mTIM_4_BORROW_IN=data&0x02; + mTIM_4_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM4CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM5CTLB&0xff): + mTIM_5_TIMER_DONE=data&0x08; + mTIM_5_LAST_CLOCK=data&0x04; + mTIM_5_BORROW_IN=data&0x02; + mTIM_5_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM5CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM6CTLB&0xff): + mTIM_6_TIMER_DONE=data&0x08; + mTIM_6_LAST_CLOCK=data&0x04; + mTIM_6_BORROW_IN=data&0x02; + mTIM_6_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM6CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + case (TIM7CTLB&0xff): + mTIM_7_TIMER_DONE=data&0x08; + mTIM_7_LAST_CLOCK=data&0x04; + mTIM_7_BORROW_IN=data&0x02; + mTIM_7_BORROW_OUT=data&0x01; + TRACE_MIKIE2("Poke(TIM7CTLB ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); +// BlowOut(); + break; + + case (ATTEN_A&0xff): + mAUDIO_ATTEN[0] = data; + TRACE_MIKIE2("Poke(ATTEN_A ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (ATTEN_B&0xff): + mAUDIO_ATTEN[1] = data; + TRACE_MIKIE2("Poke(ATTEN_B ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (ATTEN_C&0xff): + mAUDIO_ATTEN[2] = data; + TRACE_MIKIE2("Poke(ATTEN_C ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (ATTEN_D&0xff): + mAUDIO_ATTEN[3] = data; + TRACE_MIKIE2("Poke(ATTEN_D ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + CombobulateSound(gSystemCycleCount - startTS); + break; + case (MPAN&0xff): + TRACE_MIKIE2("Poke(MPAN ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mPAN = data; + CombobulateSound(gSystemCycleCount - startTS); + break; + + case (MSTEREO&0xff): + TRACE_MIKIE2("Poke(MSTEREO ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + data^=0xff; + mSTEREO=data; + CombobulateSound(gSystemCycleCount - startTS); + break; + + case (INTRST&0xff): + data^=0xff; + mTimerStatusFlags&=data; + gNextTimerEvent=gSystemCycleCount; + TRACE_MIKIE2("Poke(INTRST ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + case (INTSET&0xff): + TRACE_MIKIE2("Poke(INTSET ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mTimerStatusFlags|=data; + gNextTimerEvent=gSystemCycleCount; + break; + + case (SYSCTL1&0xff): + TRACE_MIKIE2("Poke(SYSCTL1 ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + if(!(data&0x02)) + { + C6502_REGS regs; + mSystem.GetRegs(regs); + MDFN_printf("Runtime Alert - System Halted\nCMikie::Poke(SYSCTL1) - Lynx power down occured at PC=$%04x.\nResetting system.\n",regs.PC); + mSystem.Reset(); + gSystemHalt=TRUE; + } + mSystem.CartAddressStrobe((data&0x01)?TRUE:FALSE); + break; + + case (MIKEYSREV&0xff): + TRACE_MIKIE2("Poke(MIKEYSREV,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + case (IODIR&0xff): + TRACE_MIKIE2("Poke(IODIR ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mIODIR=data; + break; + + case (IODAT&0xff): + TRACE_MIKIE2("Poke(IODAT ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mIODAT=data; + mSystem.CartAddressData((mIODAT&0x02)?TRUE:FALSE); + // Enable cart writes to BANK1 on AUDIN if AUDIN is set to output + if(mIODIR&0x10) mSystem.mCart->mWriteEnableBank1=(mIODAT&0x10)?TRUE:FALSE; + break; + + case (SERCTL&0xff): + TRACE_MIKIE2("Poke(SERCTL ,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mUART_TX_IRQ_ENABLE=(data&0x80)?true:false; + mUART_RX_IRQ_ENABLE=(data&0x40)?true:false; + mUART_PARITY_ENABLE=(data&0x10)?true:false; + mUART_SENDBREAK=data&0x02; + mUART_PARITY_EVEN=data&0x01; + + // Reset all errors if required + if(data&0x08) + { + mUART_Rx_overun_error=0; + mUART_Rx_framing_error=0; + } + + if(mUART_SENDBREAK) + { + // Trigger send break, it will self sustain as long as sendbreak is set + mUART_TX_COUNTDOWN=UART_TX_TIME_PERIOD; + // Loop back what we transmitted + ComLynxTxLoopback(UART_BREAK_CODE); + } + break; + + case (SERDAT&0xff): + TRACE_MIKIE2("Poke(SERDAT ,%04x) at PC=%04x",data,mSystem.mCpu->GetPC()); + // + // Fake transmission, set counter to be decremented by Timer 4 + // + // ComLynx only has one output pin, hence Rx & Tx are shorted + // therefore any transmitted data will loopback + // + mUART_TX_DATA=data; + // Calculate Parity data + if(mUART_PARITY_ENABLE) + { + // Calc parity value + // Leave at zero !! + } + else + { + // If disabled then the PAREVEN bit is sent + if(mUART_PARITY_EVEN) data|=0x0100; + } + // Set countdown to transmission + mUART_TX_COUNTDOWN=UART_TX_TIME_PERIOD; + // Loop back what we transmitted + ComLynxTxLoopback(mUART_TX_DATA); + break; + + case (SDONEACK&0xff): + TRACE_MIKIE2("Poke(SDONEACK,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + case (CPUSLEEP&0xff): + gSuzieDoneTime = gSystemCycleCount+mSystem.PaintSprites(); + SetCPUSleep(); + break; + + case (DISPCTL&0xff): + TRACE_MIKIE2("Poke(DISPCTL,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + { + TDISPCTL tmp; + tmp.Byte=data; + mDISPCTL_DMAEnable=tmp.Bits.DMAEnable; + mDISPCTL_Flip=tmp.Bits.Flip; + mDISPCTL_FourColour=tmp.Bits.FourColour; + mDISPCTL_Colour=tmp.Bits.Colour; + } + break; + case (PBKUP&0xff): + TRACE_MIKIE2("Poke(PBKUP,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + case (DISPADRL&0xff): + TRACE_MIKIE2("Poke(DISPADRL,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mDisplayAddress&=0xff00; + mDisplayAddress+=data; + break; + + case (DISPADRH&0xff): + TRACE_MIKIE2("Poke(DISPADRH,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mDisplayAddress&=0x00ff; + mDisplayAddress+=(data<<8); + break; + + case (Mtest0&0xff): + case (Mtest1&0xff): + // Test registers are unimplemented + // lets hope no programs use them. + TRACE_MIKIE2("Poke(MTEST0/1,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + case (Mtest2&0xff): + // Test registers are unimplemented + // lets hope no programs use them. + //gError->Warning("CMikie::Poke() - Write to MTEST2"); + TRACE_MIKIE2("Poke(MTEST2,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + break; + + case (GREEN0&0xff): + case (GREEN1&0xff): + case (GREEN2&0xff): + case (GREEN3&0xff): + case (GREEN4&0xff): + case (GREEN5&0xff): + case (GREEN6&0xff): + case (GREEN7&0xff): + case (GREEN8&0xff): + case (GREEN9&0xff): + case (GREENA&0xff): + case (GREENB&0xff): + case (GREENC&0xff): + case (GREEND&0xff): + case (GREENE&0xff): + case (GREENF&0xff): + TRACE_MIKIE2("Poke(GREENPAL0-F,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mPalette[addr&0x0f].Colours.Green=data&0x0f; + break; + + case (BLUERED0&0xff): + case (BLUERED1&0xff): + case (BLUERED2&0xff): + case (BLUERED3&0xff): + case (BLUERED4&0xff): + case (BLUERED5&0xff): + case (BLUERED6&0xff): + case (BLUERED7&0xff): + case (BLUERED8&0xff): + case (BLUERED9&0xff): + case (BLUEREDA&0xff): + case (BLUEREDB&0xff): + case (BLUEREDC&0xff): + case (BLUEREDD&0xff): + case (BLUEREDE&0xff): + case (BLUEREDF&0xff): + TRACE_MIKIE2("Poke(BLUEREDPAL0-F,%02x) at PC=%04x",data,mSystem.mCpu->GetPC()); + mPalette[addr&0x0f].Colours.Blue=(data&0xf0)>>4; + mPalette[addr&0x0f].Colours.Red=data&0x0f; + break; + +// Errors on read only register accesses + + case (MAGRDY0&0xff): + case (MAGRDY1&0xff): + case (AUDIN&0xff): + case (MIKEYHREV&0xff): + TRACE_MIKIE3("Poke(%04x,%02x) - Poke to read only register location at PC=%04x",addr,data,mSystem.mCpu->GetPC()); + break; + +// Errors on illegal location accesses + + default: + TRACE_MIKIE3("Poke(%04x,%02x) - Poke to illegal location at PC=%04x",addr,data,mSystem.mCpu->GetPC()); + break; + } +} + + + +uint8 CMikie::Peek(uint32 addr) +{ + /* Sound register area */ + if(addr >= 0xFD20 && addr <= 0xFD3F) + { + int which = (addr - 0xFD20) >> 3; // Each channel gets 8 ports/registers + switch(addr & 0x7) + { + case (AUD0VOL&0x7): + return (uint8)mAUDIO_VOLUME[which]; + break; + case (AUD0SHFTFB&0x7): + return (uint8)((mAUDIO_WAVESHAPER[which]>>13)&0xff); + break; + case (AUD0OUTVAL&0x7): + return (uint8)mAUDIO_OUTPUT[which]; + break; + case (AUD0L8SHFT&0x7): + return (uint8)(mAUDIO_WAVESHAPER[which]&0xff); + break; + case (AUD0TBACK&0x7): + return (uint8)mAUDIO_BKUP[which]; + break; + case (AUD0CTL&0x7): + { + uint8 retval=0; + retval|=(mAUDIO_INTEGRATE_ENABLE[which])?0x20:0x00; + retval|=(mAUDIO_ENABLE_RELOAD[which])?0x10:0x00; + retval|=(mAUDIO_ENABLE_COUNT[which])?0x08:0x00; + retval|=(mAUDIO_WAVESHAPER[which]&0x001000)?0x80:0x00; + retval|=mAUDIO_LINKING[which]; + return retval; + } + break; + case (AUD0COUNT&0x7): + return (uint8)mAUDIO_CURRENT[which]; + break; + case (AUD0MISC&0x7): + { + uint8 retval=0; + retval|=(mAUDIO_BORROW_OUT[which])?0x01:0x00; + retval|=(mAUDIO_BORROW_IN[which])?0x02:0x00; + retval|=(mAUDIO_LAST_CLOCK[which])?0x08:0x00; + retval|=(mAUDIO_WAVESHAPER[which]>>4)&0xf0; + return retval; + } + break; + } + } + else switch(addr&0xff) + { + +// Timer control registers + + case (TIM0BKUP&0xff): + TRACE_MIKIE2("Peek(TIM0KBUP ,%02x) at PC=%04x",mTIM_0_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_0_BKUP; + break; + case (TIM1BKUP&0xff): + TRACE_MIKIE2("Peek(TIM1KBUP ,%02x) at PC=%04x",mTIM_1_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_1_BKUP; + break; + case (TIM2BKUP&0xff): + TRACE_MIKIE2("Peek(TIM2KBUP ,%02x) at PC=%04x",mTIM_2_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_2_BKUP; + break; + case (TIM3BKUP&0xff): + TRACE_MIKIE2("Peek(TIM3KBUP ,%02x) at PC=%04x",mTIM_3_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_3_BKUP; + break; + case (TIM4BKUP&0xff): + TRACE_MIKIE2("Peek(TIM4KBUP ,%02x) at PC=%04x",mTIM_4_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_4_BKUP; + break; + case (TIM5BKUP&0xff): + TRACE_MIKIE2("Peek(TIM5KBUP ,%02x) at PC=%04x",mTIM_5_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_5_BKUP; + break; + case (TIM6BKUP&0xff): + TRACE_MIKIE2("Peek(TIM6KBUP ,%02x) at PC=%04x",mTIM_6_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_6_BKUP; + break; + case (TIM7BKUP&0xff): + TRACE_MIKIE2("Peek(TIM7KBUP ,%02x) at PC=%04x",mTIM_7_BKUP,mSystem.mCpu->GetPC()); + return (uint8)mTIM_7_BKUP; + break; + + case (TIM0CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x01)?0x80:0x00; + retval|=(mTIM_0_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_0_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_0_LINKING; + TRACE_MIKIE2("Peek(TIM0CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM1CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x02)?0x80:0x00; + retval|=(mTIM_1_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_1_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_1_LINKING; + TRACE_MIKIE2("Peek(TIM1CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM2CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x04)?0x80:0x00; + retval|=(mTIM_2_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_2_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_2_LINKING; + TRACE_MIKIE2("Peek(TIM2CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM3CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x08)?0x80:0x00; + retval|=(mTIM_3_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_3_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_3_LINKING; + TRACE_MIKIE2("Peek(TIM3CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM4CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x10)?0x80:0x00; + retval|=(mTIM_4_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_4_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_4_LINKING; + TRACE_MIKIE2("Peek(TIM4CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM5CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x20)?0x80:0x00; + retval|=(mTIM_5_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_5_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_5_LINKING; + TRACE_MIKIE2("Peek(TIM5CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM6CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x40)?0x80:0x00; + retval|=(mTIM_6_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_6_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_6_LINKING; + TRACE_MIKIE2("Peek(TIM6CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + case (TIM7CTLA&0xff): + { + uint8 retval=0; + retval|=(mTimerInterruptMask&0x80)?0x80:0x00; + retval|=(mTIM_7_ENABLE_RELOAD)?0x10:0x00; + retval|=(mTIM_7_ENABLE_COUNT)?0x08:0x00; + retval|=mTIM_7_LINKING; + TRACE_MIKIE2("Peek(TIM7CTLA ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } + break; + + case (TIM0CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM0CNT ,%02x) at PC=%04x",mTIM_0_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_0_CURRENT; + break; + case (TIM1CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM1CNT ,%02x) at PC=%04x",mTIM_1_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_1_CURRENT; + break; + case (TIM2CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM2CNT ,%02x) at PC=%04x",mTIM_2_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_2_CURRENT; + break; + case (TIM3CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM3CNT ,%02x) at PC=%04x",mTIM_3_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_3_CURRENT; + break; + case (TIM4CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM4CNT ,%02x) at PC=%04x",mTIM_4_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_4_CURRENT; + break; + case (TIM5CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM5CNT ,%02x) at PC=%04x",mTIM_5_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_5_CURRENT; + break; + case (TIM6CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM6CNT ,%02x) at PC=%04x",mTIM_6_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_6_CURRENT; + break; + case (TIM7CNT&0xff): + Update(); + TRACE_MIKIE2("Peek(TIM7CNT ,%02x) at PC=%04x",mTIM_7_CURRENT,mSystem.mCpu->GetPC()); + return (uint8)mTIM_7_CURRENT; + break; + + case (TIM0CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_0_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_0_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_0_BORROW_IN)?0x02:0x00; + retval|=(mTIM_0_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM0CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM1CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_1_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_1_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_1_BORROW_IN)?0x02:0x00; + retval|=(mTIM_1_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM1CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM2CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_2_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_2_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_2_BORROW_IN)?0x02:0x00; + retval|=(mTIM_2_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM2CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM3CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_3_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_3_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_3_BORROW_IN)?0x02:0x00; + retval|=(mTIM_3_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM3CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM4CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_4_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_4_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_4_BORROW_IN)?0x02:0x00; + retval|=(mTIM_4_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM4CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM5CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_5_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_5_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_5_BORROW_IN)?0x02:0x00; + retval|=(mTIM_5_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM5CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM6CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_6_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_6_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_6_BORROW_IN)?0x02:0x00; + retval|=(mTIM_6_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM6CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + case (TIM7CTLB&0xff): + { + uint8 retval=0; + retval|=(mTIM_7_TIMER_DONE)?0x08:0x00; + retval|=(mTIM_7_LAST_CLOCK)?0x04:0x00; + retval|=(mTIM_7_BORROW_IN)?0x02:0x00; + retval|=(mTIM_7_BORROW_OUT)?0x01:0x00; + TRACE_MIKIE2("Peek(TIM7CTLB ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return retval; + } +// BlowOut(); + break; + + // Extra audio control registers + + case (ATTEN_A&0xff): + TRACE_MIKIE1("Peek(ATTEN_A) at PC=%04x",mSystem.mCpu->GetPC()); + return (uint8) mAUDIO_ATTEN[0]; + break; + case (ATTEN_B&0xff): + TRACE_MIKIE1("Peek(ATTEN_B) at PC=%04x",mSystem.mCpu->GetPC()); + return (uint8) mAUDIO_ATTEN[1]; + break; + case (ATTEN_C&0xff): + TRACE_MIKIE1("Peek(ATTEN_C) at PC=%04x",mSystem.mCpu->GetPC()); + return (uint8) mAUDIO_ATTEN[2]; + break; + case (ATTEN_D&0xff): + TRACE_MIKIE1("Peek(ATTEN_D) at PC=%04x",mSystem.mCpu->GetPC()); + return (uint8) mAUDIO_ATTEN[3]; + break; + case (MPAN&0xff): + TRACE_MIKIE1("Peek(MPAN) at PC=%04x",mSystem.mCpu->GetPC()); + return (uint8) mPAN; + break; + + case (MSTEREO&0xff): + TRACE_MIKIE2("Peek(MSTEREO,%02x) at PC=%04x",(uint8)mSTEREO^0xff,mSystem.mCpu->GetPC()); + return (uint8) mSTEREO^0xff; + break; + +// Miscellaneous registers + + case (SERCTL&0xff): + { + uint32 retval=0; + retval|=(mUART_TX_COUNTDOWN&UART_TX_INACTIVE)?0xA0:0x00; // Indicate TxDone & TxAllDone + retval|=(mUART_RX_READY)?0x40:0x00; // Indicate Rx data ready + retval|=(mUART_Rx_overun_error)?0x08:0x0; // Framing error + retval|=(mUART_Rx_framing_error)?0x04:0x00; // Rx overrun + retval|=(mUART_RX_DATA&UART_BREAK_CODE)?0x02:0x00; // Indicate break received + retval|=(mUART_RX_DATA&0x0100)?0x01:0x00; // Add parity bit + TRACE_MIKIE2("Peek(SERCTL ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return (uint8)retval; + } + break; + + case (SERDAT&0xff): + mUART_RX_READY=0; + TRACE_MIKIE2("Peek(SERDAT ,%02x) at PC=%04x",(uint8)mUART_RX_DATA,mSystem.mCpu->GetPC()); + return (uint8)(mUART_RX_DATA&0xff); + break; + + case (IODAT&0xff): + { + uint32 retval=0; + retval|=(mIODIR&0x10)?mIODAT&0x10:0x10; // IODIR = output bit : input high (eeprom write done) + retval|=(mIODIR&0x08)?(((mIODAT&0x08)&&mIODAT_REST_SIGNAL)?0x00:0x08):0x00; // REST = output bit : input low + retval|=(mIODIR&0x04)?mIODAT&0x04:((mUART_CABLE_PRESENT)?0x04:0x00); // NOEXP = output bit : input low + retval|=(mIODIR&0x02)?mIODAT&0x02:0x00; // CARTAD = output bit : input low + retval|=(mIODIR&0x01)?mIODAT&0x01:0x01; // EXTPW = output bit : input high (Power connected) + TRACE_MIKIE2("Peek(IODAT ,%02x) at PC=%04x",retval,mSystem.mCpu->GetPC()); + return (uint8)retval; + } + break; + + case (INTRST&0xff): + case (INTSET&0xff): + TRACE_MIKIE2("Peek(INTSET ,%02x) at PC=%04x",mTimerStatusFlags,mSystem.mCpu->GetPC()); + return (uint8)mTimerStatusFlags; + break; + + case (MAGRDY0&0xff): + case (MAGRDY1&0xff): + TRACE_MIKIE2("Peek(MAGRDY0/1,%02x) at PC=%04x",0x00,mSystem.mCpu->GetPC()); + return 0x00; + break; + + case (AUDIN&0xff): +// TRACE_MIKIE2("Peek(AUDIN,%02x) at PC=%04x",mAudioInputComparator?0x80:0x00,mSystem.mCpu->GetPC()); +// if(mAudioInputComparator) return 0x80; else return 0x00; + TRACE_MIKIE2("Peek(AUDIN,%02x) at PC=%04x",0x80,mSystem.mCpu->GetPC()); + return 0x80; + break; + + case (MIKEYHREV&0xff): + TRACE_MIKIE2("Peek(MIKEYHREV,%02x) at PC=%04x",0x01,mSystem.mCpu->GetPC()); + return 0x01; + break; + +// Pallette registers + + case (GREEN0&0xff): + case (GREEN1&0xff): + case (GREEN2&0xff): + case (GREEN3&0xff): + case (GREEN4&0xff): + case (GREEN5&0xff): + case (GREEN6&0xff): + case (GREEN7&0xff): + case (GREEN8&0xff): + case (GREEN9&0xff): + case (GREENA&0xff): + case (GREENB&0xff): + case (GREENC&0xff): + case (GREEND&0xff): + case (GREENE&0xff): + case (GREENF&0xff): + TRACE_MIKIE2("Peek(GREENPAL0-F,%02x) at PC=%04x",mPalette[addr&0x0f].Colours.Green,mSystem.mCpu->GetPC()); + return mPalette[addr&0x0f].Colours.Green; + break; + + case (BLUERED0&0xff): + case (BLUERED1&0xff): + case (BLUERED2&0xff): + case (BLUERED3&0xff): + case (BLUERED4&0xff): + case (BLUERED5&0xff): + case (BLUERED6&0xff): + case (BLUERED7&0xff): + case (BLUERED8&0xff): + case (BLUERED9&0xff): + case (BLUEREDA&0xff): + case (BLUEREDB&0xff): + case (BLUEREDC&0xff): + case (BLUEREDD&0xff): + case (BLUEREDE&0xff): + case (BLUEREDF&0xff): + TRACE_MIKIE2("Peek(BLUEREDPAL0-F,%02x) at PC=%04x",(mPalette[addr&0x0f].Colours.Red | (mPalette[addr&0x0f].Colours.Blue<<4)),mSystem.mCpu->GetPC()); + return (mPalette[addr&0x0f].Colours.Red | (mPalette[addr&0x0f].Colours.Blue<<4)); + break; + +// Errors on write only register accesses + + // For easier debugging + + case (DISPADRL&0xff): + TRACE_MIKIE2("Peek(DISPADRL,%02x) at PC=%04x",(uint8)(mDisplayAddress&0xff),mSystem.mCpu->GetPC()); + return (uint8)(mDisplayAddress&0xff); + case (DISPADRH&0xff): + TRACE_MIKIE2("Peek(DISPADRH,%02x) at PC=%04x",(uint8)(mDisplayAddress>>8)&0xff,mSystem.mCpu->GetPC()); + return (uint8)(mDisplayAddress>>8)&0xff; + + case (DISPCTL&0xff): + case (SYSCTL1&0xff): + case (MIKEYSREV&0xff): + case (IODIR&0xff): + case (SDONEACK&0xff): + case (CPUSLEEP&0xff): + case (PBKUP&0xff): + case (Mtest0&0xff): + case (Mtest1&0xff): + case (Mtest2&0xff): + TRACE_MIKIE2("Peek(%04x) - Peek from write only register location at PC=$%04x",addr,mSystem.mCpu->GetPC()); + break; + +// Register to let programs know handy is running + + case (0xfd97&0xff): + TRACE_MIKIE2("Peek(%04x) - **** HANDY DETECT ATTEMPTED **** at PC=$%04x",addr,mSystem.mCpu->GetPC()); +// gError->Warning("EMULATOR DETECT REGISTER HAS BEEN READ"); + return 0x42; + break; + +// Errors on illegal location accesses + + default: + TRACE_MIKIE2("Peek(%04x) - Peek from illegal location at PC=$%04x",addr,mSystem.mCpu->GetPC()); + break; + } + return 0xff; +} + + +void CMikie::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT MikieRegs[] = + { + SFVAR(mDisplayAddress), + SFVAR(mAudioInputComparator), + SFVAR(mTimerStatusFlags), + SFVAR(mTimerInterruptMask), + + // TPALETTE is a union'd 32-bit integer + SFARRAY32N((uint32 *)mPalette, 16, "mPalette"), + SFVAR(mIODAT), + SFVAR(mIODAT_REST_SIGNAL), + SFVAR(mIODIR), + + SFVAR(mDISPCTL_DMAEnable), + SFVAR(mDISPCTL_Flip), + SFVAR(mDISPCTL_FourColour), + SFVAR(mDISPCTL_Colour), + + SFVAR(mTIM_0_BKUP), + SFVAR(mTIM_0_ENABLE_RELOAD), + SFVAR(mTIM_0_ENABLE_COUNT), + SFVAR(mTIM_0_LINKING), + SFVAR(mTIM_0_CURRENT), + SFVAR(mTIM_0_TIMER_DONE), + SFVAR(mTIM_0_LAST_CLOCK), + SFVAR(mTIM_0_BORROW_IN), + SFVAR(mTIM_0_BORROW_OUT), + SFVAR(mTIM_0_LAST_LINK_CARRY), + SFVAR(mTIM_0_LAST_COUNT), + + SFVAR(mTIM_1_BKUP), + SFVAR(mTIM_1_ENABLE_RELOAD), + SFVAR(mTIM_1_ENABLE_COUNT), + SFVAR(mTIM_1_LINKING), + SFVAR(mTIM_1_CURRENT), + SFVAR(mTIM_1_TIMER_DONE), + SFVAR(mTIM_1_LAST_CLOCK), + SFVAR(mTIM_1_BORROW_IN), + SFVAR(mTIM_1_BORROW_OUT), + SFVAR(mTIM_1_LAST_LINK_CARRY), + SFVAR(mTIM_1_LAST_COUNT), + + SFVAR(mTIM_2_BKUP), + SFVAR(mTIM_2_ENABLE_RELOAD), + SFVAR(mTIM_2_ENABLE_COUNT), + SFVAR(mTIM_2_LINKING), + SFVAR(mTIM_2_CURRENT), + SFVAR(mTIM_2_TIMER_DONE), + SFVAR(mTIM_2_LAST_CLOCK), + SFVAR(mTIM_2_BORROW_IN), + SFVAR(mTIM_2_BORROW_OUT), + SFVAR(mTIM_2_LAST_LINK_CARRY), + SFVAR(mTIM_2_LAST_COUNT), + + SFVAR(mTIM_3_BKUP), + SFVAR(mTIM_3_ENABLE_RELOAD), + SFVAR(mTIM_3_ENABLE_COUNT), + SFVAR(mTIM_3_LINKING), + SFVAR(mTIM_3_CURRENT), + SFVAR(mTIM_3_TIMER_DONE), + SFVAR(mTIM_3_LAST_CLOCK), + SFVAR(mTIM_3_BORROW_IN), + SFVAR(mTIM_3_BORROW_OUT), + SFVAR(mTIM_3_LAST_LINK_CARRY), + SFVAR(mTIM_3_LAST_COUNT), + + SFVAR(mTIM_4_BKUP), + SFVAR(mTIM_4_ENABLE_RELOAD), + SFVAR(mTIM_4_ENABLE_COUNT), + SFVAR(mTIM_4_LINKING), + SFVAR(mTIM_4_CURRENT), + SFVAR(mTIM_4_TIMER_DONE), + SFVAR(mTIM_4_LAST_CLOCK), + SFVAR(mTIM_4_BORROW_IN), + SFVAR(mTIM_4_BORROW_OUT), + SFVAR(mTIM_4_LAST_LINK_CARRY), + SFVAR(mTIM_4_LAST_COUNT), + + SFVAR(mTIM_5_BKUP), + SFVAR(mTIM_5_ENABLE_RELOAD), + SFVAR(mTIM_5_ENABLE_COUNT), + SFVAR(mTIM_5_LINKING), + SFVAR(mTIM_5_CURRENT), + SFVAR(mTIM_5_TIMER_DONE), + SFVAR(mTIM_5_LAST_CLOCK), + SFVAR(mTIM_5_BORROW_IN), + SFVAR(mTIM_5_BORROW_OUT), + SFVAR(mTIM_5_LAST_LINK_CARRY), + SFVAR(mTIM_5_LAST_COUNT), + + SFVAR(mTIM_6_BKUP), + SFVAR(mTIM_6_ENABLE_RELOAD), + SFVAR(mTIM_6_ENABLE_COUNT), + SFVAR(mTIM_6_LINKING), + SFVAR(mTIM_6_CURRENT), + SFVAR(mTIM_6_TIMER_DONE), + SFVAR(mTIM_6_LAST_CLOCK), + SFVAR(mTIM_6_BORROW_IN), + SFVAR(mTIM_6_BORROW_OUT), + SFVAR(mTIM_6_LAST_LINK_CARRY), + SFVAR(mTIM_6_LAST_COUNT), + + + SFVAR(mTIM_7_BKUP), + SFVAR(mTIM_7_ENABLE_RELOAD), + SFVAR(mTIM_7_ENABLE_COUNT), + SFVAR(mTIM_7_LINKING), + SFVAR(mTIM_7_CURRENT), + SFVAR(mTIM_7_TIMER_DONE), + SFVAR(mTIM_7_LAST_CLOCK), + SFVAR(mTIM_7_BORROW_IN), + SFVAR(mTIM_7_BORROW_OUT), + SFVAR(mTIM_7_LAST_LINK_CARRY), + SFVAR(mTIM_7_LAST_COUNT), + + SFVAR(mAUDIO_BKUP[0]), + SFVAR(mAUDIO_ENABLE_RELOAD[0]), + SFVAR(mAUDIO_ENABLE_COUNT[0]), + SFVAR(mAUDIO_LINKING[0]), + SFVAR(mAUDIO_CURRENT[0]), + SFVAR(mAUDIO_TIMER_DONE[0]), + SFVAR(mAUDIO_LAST_CLOCK[0]), + SFVAR(mAUDIO_BORROW_IN[0]), + SFVAR(mAUDIO_BORROW_OUT[0]), + SFVAR(mAUDIO_LAST_LINK_CARRY[0]), + SFVAR(mAUDIO_LAST_COUNT[0]), + SFVAR(mAUDIO_VOLUME[0]), + SFVAR(mAUDIO_OUTPUT[0]), + SFVAR(mAUDIO_INTEGRATE_ENABLE[0]), + SFVAR(mAUDIO_WAVESHAPER[0]), + + + SFVAR(mAUDIO_BKUP[1]), + SFVAR(mAUDIO_ENABLE_RELOAD[1]), + SFVAR(mAUDIO_ENABLE_COUNT[1]), + SFVAR(mAUDIO_LINKING[1]), + SFVAR(mAUDIO_CURRENT[1]), + SFVAR(mAUDIO_TIMER_DONE[1]), + SFVAR(mAUDIO_LAST_CLOCK[1]), + SFVAR(mAUDIO_BORROW_IN[1]), + SFVAR(mAUDIO_BORROW_OUT[1]), + SFVAR(mAUDIO_LAST_LINK_CARRY[1]), + SFVAR(mAUDIO_LAST_COUNT[1]), + SFVAR(mAUDIO_VOLUME[1]), + SFVAR(mAUDIO_OUTPUT[1]), + SFVAR(mAUDIO_INTEGRATE_ENABLE[1]), + SFVAR(mAUDIO_WAVESHAPER[1]), + + + SFVAR(mAUDIO_BKUP[2]), + SFVAR(mAUDIO_ENABLE_RELOAD[2]), + SFVAR(mAUDIO_ENABLE_COUNT[2]), + SFVAR(mAUDIO_LINKING[2]), + SFVAR(mAUDIO_CURRENT[2]), + SFVAR(mAUDIO_TIMER_DONE[2]), + SFVAR(mAUDIO_LAST_CLOCK[2]), + SFVAR(mAUDIO_BORROW_IN[2]), + SFVAR(mAUDIO_BORROW_OUT[2]), + SFVAR(mAUDIO_LAST_LINK_CARRY[2]), + SFVAR(mAUDIO_LAST_COUNT[2]), + SFVAR(mAUDIO_VOLUME[2]), + SFVAR(mAUDIO_OUTPUT[2]), + SFVAR(mAUDIO_INTEGRATE_ENABLE[2]), + SFVAR(mAUDIO_WAVESHAPER[2]), + + SFVAR(mAUDIO_BKUP[3]), + SFVAR(mAUDIO_ENABLE_RELOAD[3]), + SFVAR(mAUDIO_ENABLE_COUNT[3]), + SFVAR(mAUDIO_LINKING[3]), + SFVAR(mAUDIO_CURRENT[3]), + SFVAR(mAUDIO_TIMER_DONE[3]), + SFVAR(mAUDIO_LAST_CLOCK[3]), + SFVAR(mAUDIO_BORROW_IN[3]), + SFVAR(mAUDIO_BORROW_OUT[3]), + SFVAR(mAUDIO_LAST_LINK_CARRY[3]), + SFVAR(mAUDIO_LAST_COUNT[3]), + SFVAR(mAUDIO_VOLUME[3]), + SFVAR(mAUDIO_OUTPUT[3]), + SFVAR(mAUDIO_INTEGRATE_ENABLE[3]), + SFVAR(mAUDIO_WAVESHAPER[3]), + + // Lynx 2 extra audio registers + SFVAR(mSTEREO), + SFVAR(mPAN), + SFVAR(mAUDIO_ATTEN[0]), + SFVAR(mAUDIO_ATTEN[1]), + SFVAR(mAUDIO_ATTEN[2]), + SFVAR(mAUDIO_ATTEN[3]), + + // + // Serial related variables + // + SFVAR(mUART_RX_IRQ_ENABLE), + SFVAR(mUART_TX_IRQ_ENABLE), + + SFVAR(mUART_TX_COUNTDOWN), + SFVAR(mUART_RX_COUNTDOWN), + + SFVAR(mUART_SENDBREAK), + SFVAR(mUART_TX_DATA), + SFVAR(mUART_RX_DATA), + SFVAR(mUART_RX_READY), + + SFVAR(mUART_PARITY_ENABLE), + SFVAR(mUART_PARITY_EVEN), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, MikieRegs, "MIKY"); + + if(load) + { + + + + } +} + +void CMikie::CombobulateSound(uint32 teatime) +{ + int cur_lsample = 0; + int cur_rsample = 0; + static int last_lsample = 0; + static int last_rsample = 0; + int x; + + teatime >>= 2; + for(x = 0; x < 4; x++){ + /// Assumption (seems there is no documentation for the Attenuation registers) + /// a) they are linear from $0 to $f - checked! + /// b) an attenuation of $0 is equal to channel OFF (bits in mSTEREO not set) - checked! + /// c) an attenuation of $f is NOT equal to no attenuation (bits in PAN not set), $10 would be - checked! + /// These assumptions can only checked with an oszilloscope... - done + /// the values stored in mSTEREO are bit-inverted ... + /// mSTEREO was found to be set like that already (why?), but unused + + if(mSTEREO & (0x10 << x)) + { + if(mPAN & (0x10 << x)) + cur_lsample += (mAUDIO_OUTPUT[x]*(mAUDIO_ATTEN[x]&0xF0))/(16*16); /// NOT /15*16 see remark above + else + cur_lsample += mAUDIO_OUTPUT[x]; + } + if(mSTEREO & (0x01 << x)) + { + if(mPAN & (0x01 << x)) + cur_rsample += (mAUDIO_OUTPUT[x]*(mAUDIO_ATTEN[x]&0x0F))/16; /// NOT /15 see remark above + else + cur_rsample += mAUDIO_OUTPUT[x]; + } + } + if(cur_lsample != last_lsample){ + miksynth.offset_inline(teatime, cur_lsample - last_lsample, mikbuf.left()); + last_lsample = cur_lsample; + } + if(cur_rsample != last_rsample){ + miksynth.offset_inline(teatime, cur_rsample - last_rsample, mikbuf.right()); + last_rsample = cur_rsample; + } +} + +void CMikie::Update(void) +{ + int32 divide; + int32 decval; + uint32 tmp; + uint32 mikie_work_done=0; + + // + // To stop problems with cycle count wrap we will check and then correct the + // cycle counter. + // + +// TRACE_MIKIE0("Update()"); + + if(gSystemCycleCount>0xf0000000) + { + gSystemCycleCount-=0x80000000; + mTIM_0_LAST_COUNT-=0x80000000; + mTIM_1_LAST_COUNT-=0x80000000; + mTIM_2_LAST_COUNT-=0x80000000; + mTIM_3_LAST_COUNT-=0x80000000; + mTIM_4_LAST_COUNT-=0x80000000; + mTIM_5_LAST_COUNT-=0x80000000; + mTIM_6_LAST_COUNT-=0x80000000; + mTIM_7_LAST_COUNT-=0x80000000; + mAUDIO_LAST_COUNT[0]-=0x80000000; + mAUDIO_LAST_COUNT[1]-=0x80000000; + mAUDIO_LAST_COUNT[2]-=0x80000000; + mAUDIO_LAST_COUNT[3]-=0x80000000; + startTS -= 0x80000000; + // Only correct if sleep is active + if(gSuzieDoneTime) + { + gSuzieDoneTime-=0x80000000; + } + } + + gNextTimerEvent=0xffffffff; + + if(gSuzieDoneTime) + { + if(gSystemCycleCount >= gSuzieDoneTime) + { + ClearCPUSleep(); + gSuzieDoneTime = 0; + } + else if(gSuzieDoneTime > gSystemCycleCount) gNextTimerEvent = gSuzieDoneTime; + } + + // Timer updates, rolled out flat in group order + // + // Group A: + // Timer 0 -> Timer 2 -> Timer 4. + // + // Group B: + // Timer 1 -> Timer 3 -> Timer 5 -> Timer 7 -> Audio 0 -> Audio 1-> Audio 2 -> Audio 3 -> Timer 1. + // + + // + // Within each timer code block we will predict the cycle count number of + // the next timer event + // + // We don't need to count linked timers as the timer they are linked + // from will always generate earlier events. + // + // As Timer 4 (UART) will generate many events we will ignore it + // + // We set the next event to the end of time at first and let the timers + // overload it. Any writes to timer controls will force next event to + // be immediate and hence a new preidction will be done. The prediction + // causes overflow as opposed to zero i.e. current+1 + // (In reality T0 line counter should always be running.) + // + + + // + // Timer 0 of Group A + // + + // + // Optimisation, assume T0 (Line timer) is never in one-shot, + // never placed in link mode + // + + // KW bugfix 13/4/99 added (mTIM_x_ENABLE_RELOAD || ..) +// if(mTIM_0_ENABLE_COUNT && (mTIM_0_ENABLE_RELOAD || !mTIM_0_TIMER_DONE)) + if(mTIM_0_ENABLE_COUNT) + { + // Timer 0 has no linking +// if(mTIM_0_LINKING!=0x07) + { + // Ordinary clocked mode as opposed to linked mode + // 16MHz clock downto 1us == cyclecount >> 4 + divide=(4+mTIM_0_LINKING); + decval=(gSystemCycleCount-mTIM_0_LAST_COUNT)>>divide; + + if(decval) + { + mTIM_0_LAST_COUNT+=decval<2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_0_CURRENT&0x80000000)?1:((mTIM_0_CURRENT+1)<> 4 +// divide=(4+mTIM_2_LINKING); +// decval=(gSystemCycleCount-mTIM_2_LAST_COUNT)>>divide; +// } + + if(decval) + { +// mTIM_2_LAST_COUNT+=decval<> 4 + // Additional /8 (+3) for 8 clocks per bit transmit + divide=4+3+mTIM_4_LINKING; + decval=(gSystemCycleCount-mTIM_4_LAST_COUNT)>>divide; + } + + if(decval) + { + mTIM_4_LAST_COUNT+=decval<0) + { + mUART_RX_DATA=mUART_Rx_input_queue[mUART_Rx_output_ptr]; + mUART_Rx_output_ptr = (mUART_Rx_output_ptr + 1) % UART_MAX_RX_QUEUE; + mUART_Rx_waiting--; + TRACE_MIKIE2("Update() - RX Byte output ptr=%02d waiting=%02d",mUART_Rx_output_ptr,mUART_Rx_waiting); + } + else + { + TRACE_MIKIE0("Update() - RX Byte but no data waiting ????"); + } + + // Retrigger input if more bytes waiting + if(mUART_Rx_waiting>0) + { + mUART_RX_COUNTDOWN=UART_RX_TIME_PERIOD+UART_RX_NEXT_DELAY; + TRACE_MIKIE1("Update() - RX Byte retriggered, %d waiting",mUART_Rx_waiting); + } + else + { + mUART_RX_COUNTDOWN=UART_RX_INACTIVE; + TRACE_MIKIE0("Update() - RX Byte nothing waiting, deactivated"); + } + + // If RX_READY already set then we have an overrun + // as previous byte hasnt been read + if(mUART_RX_READY) mUART_Rx_overun_error=1; + + // Flag byte as being recvd + mUART_RX_READY=1; + } + else if(!(mUART_RX_COUNTDOWN&UART_RX_INACTIVE)) + { + mUART_RX_COUNTDOWN--; + } + + if(!mUART_TX_COUNTDOWN) + { + if(mUART_SENDBREAK) + { + mUART_TX_DATA=UART_BREAK_CODE; + // Auto-Respawn new transmit + mUART_TX_COUNTDOWN=UART_TX_TIME_PERIOD; + // Loop back what we transmitted + ComLynxTxLoopback(mUART_TX_DATA); + } + else + { + // Serial activity finished + mUART_TX_COUNTDOWN=UART_TX_INACTIVE; + } + + // If a networking object is attached then use its callback to send the data byte. + if(mpUART_TX_CALLBACK) + { + TRACE_MIKIE0("Update() - UART_TX_CALLBACK"); + (*mpUART_TX_CALLBACK)(mUART_TX_DATA,mUART_TX_CALLBACK_OBJECT); + } + + } + else if(!(mUART_TX_COUNTDOWN&UART_TX_INACTIVE)) + { + mUART_TX_COUNTDOWN--; + } + + // Set the timer status flag + // Timer 4 is the uart timer and doesn't generate IRQ's using this method + + // 16 Clocks = 1 bit transmission. Hold separate Rx & Tx counters + + // Reload if neccessary +// if(mTIM_4_ENABLE_RELOAD) +// { + mTIM_4_CURRENT+=mTIM_4_BKUP+1; + // The low reload values on TIM4 coupled with a longer + // timer service delay can sometimes cause + // an underun, check and fix + if(mTIM_4_CURRENT&0x80000000) + { + mTIM_4_CURRENT=mTIM_4_BKUP; + mTIM_4_LAST_COUNT=gSystemCycleCount; + } +// } +// else +// { +// mTIM_4_CURRENT=0; +// } +// mTIM_4_TIMER_DONE=TRUE; + } +// else +// { +// mTIM_4_BORROW_OUT=FALSE; +// } +// // Set carry in as we did a count +// mTIM_4_BORROW_IN=TRUE; + } +// else +// { +// // Clear carry in as we didn't count +// mTIM_4_BORROW_IN=FALSE; +// // Clear carry out +// mTIM_4_BORROW_OUT=FALSE; +// } +// +// // Prediction for next timer event cycle number +// +// if(mTIM_4_LINKING!=7) +// { + // Sometimes timeupdates can be >2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_4_CURRENT&0x80000000)?1:((mTIM_4_CURRENT+1)<> 4 + divide=(4+mTIM_1_LINKING); + decval=(gSystemCycleCount-mTIM_1_LAST_COUNT)>>divide; + + if(decval) + { + mTIM_1_LAST_COUNT+=decval<2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_1_CURRENT&0x80000000)?1:((mTIM_1_CURRENT+1)<> 4 + divide=(4+mTIM_3_LINKING); + decval=(gSystemCycleCount-mTIM_3_LAST_COUNT)>>divide; + } + + if(decval) + { + mTIM_3_LAST_COUNT+=decval<2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_3_CURRENT&0x80000000)?1:((mTIM_3_CURRENT+1)<> 4 + divide=(4+mTIM_5_LINKING); + decval=(gSystemCycleCount-mTIM_5_LAST_COUNT)>>divide; + } + + if(decval) + { + mTIM_5_LAST_COUNT+=decval<2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_5_CURRENT&0x80000000)?1:((mTIM_5_CURRENT+1)<> 4 + divide=(4+mTIM_7_LINKING); + decval=(gSystemCycleCount-mTIM_7_LAST_COUNT)>>divide; + } + + if(decval) + { + mTIM_7_LAST_COUNT+=decval<2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_7_CURRENT&0x80000000)?1:((mTIM_7_CURRENT+1)<> 4 + divide=(4+mTIM_6_LINKING); + decval=(gSystemCycleCount-mTIM_6_LAST_COUNT)>>divide; + + if(decval) + { + mTIM_6_LAST_COUNT+=decval<2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mTIM_6_CURRENT&0x80000000)?1:((mTIM_6_CURRENT+1)<> 4 + divide=(4+mAUDIO_LINKING[y]); + decval=(gSystemCycleCount-mAUDIO_LAST_COUNT[y])>>divide; + } + + if(decval) + { + mAUDIO_LAST_COUNT[y] += decval<127) temp=127; + if(temp<-128) temp=-128; + mAUDIO_OUTPUT[y]=(int8)temp; + } + else + { + if(mAUDIO_WAVESHAPER[y]&0x0001) mAUDIO_OUTPUT[y]=mAUDIO_VOLUME[y]; else mAUDIO_OUTPUT[y]=-mAUDIO_VOLUME[y]; + } + CombobulateSound(gSystemCycleCount - startTS); + } + else + { + mAUDIO_BORROW_OUT[y]=FALSE; + } + // Set carry in as we did a count + mAUDIO_BORROW_IN[y]=TRUE; + } + else + { + // Clear carry in as we didn't count + mAUDIO_BORROW_IN[y]=FALSE; + // Clear carry out + mAUDIO_BORROW_OUT[y]=FALSE; + } + + // Prediction for next timer event cycle number + + if(mAUDIO_LINKING[y]!=7) + { + // Sometimes timeupdates can be >2x rollover in which case + // then CURRENT may still be negative and we can use it to + // calc the next timer value, we just want another update ASAP + tmp=(mAUDIO_CURRENT[y]&0x80000000)?1:((mAUDIO_CURRENT[y]+1)<Warning("CMikie::Update() - gSystemCycleCount==gNextTimerEvent, system lock likely"); + // TRACE_MIKIE1("Update() - NextTimerEvent = %012d",gNextTimerEvent); + + // Update system IRQ status as a result of timer activity + // OR is required to ensure serial IRQ's are not masked accidentally + + gSystemIRQ=(mTimerStatusFlags)?TRUE:FALSE; + if(gSystemIRQ && gSystemCPUSleep) { ClearCPUSleep(); /*puts("ARLARM"); */ } + //else if(gSuzieDoneTime) SetCPUSleep(); + + // Now all the timer updates are done we can increment the system + // counter for any work done within the Update() function, gSystemCycleCounter + // cannot be updated until this point otherwise it screws up the counters. + gSystemCycleCount+=mikie_work_done; +} diff --git a/Mednafen/mednafen/lynx/mikie.h b/Mednafen/mednafen/lynx/mikie.h new file mode 100644 index 0000000000..22ca5ed9ba --- /dev/null +++ b/Mednafen/mednafen/lynx/mikie.h @@ -0,0 +1,403 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Mikey class header file // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the interface definition and some of the code // +// for the Mikey chip within the Lynx. The most crucial code is the // +// Update() function which as you can probably guess updates all of the // +// Mikey hardware counters and screen DMA from the prevous time it was // +// called. Yes I know how to spell Mikey but I cant be bothered to change // +// it everywhere. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef MIKIE_H +#define MIKIE_H + +//#include +//#define TRACE_MIKIE +#include + +#ifdef TRACE_MIKIE + +#define TRACE_MIKIE0(msg) _RPT1(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",gSystemCycleCount) +#define TRACE_MIKIE1(msg,arg1) _RPT2(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",arg1,gSystemCycleCount) +#define TRACE_MIKIE2(msg,arg1,arg2) _RPT3(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",arg1,arg2,gSystemCycleCount) +#define TRACE_MIKIE3(msg,arg1,arg2,arg3) _RPT4(_CRT_WARN,"CMikie::"msg" (Time=%012d)\n",arg1,arg2,arg3,gSystemCycleCount) + +#else + +#define TRACE_MIKIE0(msg) +#define TRACE_MIKIE1(msg,arg1) +#define TRACE_MIKIE2(msg,arg1,arg2) +#define TRACE_MIKIE3(msg,arg1,arg2,arg3) + +#endif + +class CSystem; + +#define MIKIE_START 0xfd00 +#define MIKIE_SIZE 0x100 + +// +// Define counter types and defines +// + +#define CTRL_A_IRQEN 0x80 +#define CTRL_A_RTD 0x40 +#define CTRL_A_RELOAD 0x10 +#define CTRL_A_COUNT 0x08 +#define CTRL_A_DIVIDE 0x07 + +#define CTRL_B_TDONE 0x08 +#define CTRL_B_LASTCK 0x04 +#define CTRL_B_CIN 0x02 +#define CTRL_B_COUT 0x01 + +#define LINE_TIMER 0x00 +#define SCREEN_TIMER 0x02 + +#define LINE_WIDTH 160 +#define LINE_SIZE 80 + +#define UART_TX_INACTIVE 0x80000000 +#define UART_RX_INACTIVE 0x80000000 +#define UART_BREAK_CODE 0x00008000 +#define UART_MAX_RX_QUEUE 32 +#define UART_TX_TIME_PERIOD (11) +#define UART_RX_TIME_PERIOD (11) +#define UART_RX_NEXT_DELAY (44) + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 unused:4; + uint8 Colour:1; + uint8 FourColour:1; + uint8 Flip:1; + uint8 DMAEnable:1; +#else + + uint8 DMAEnable:1; + uint8 Flip:1; + uint8 FourColour:1; + uint8 Colour:1; + uint8 unused:4; +#endif + }Bits; + uint8 Byte; + }; +}TDISPCTL; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 unused:8; + uint8 unused2:8; + uint8 unused3:4; + uint8 Blue:4; + uint8 Red:4; + uint8 Green:4; +#else + uint8 Green:4; + uint8 Red:4; + uint8 Blue:4; +#endif + }Colours; + uint32 Index; + }; +}TPALETTE; + + +// +// Emumerated types for possible mikie windows independant modes +// +enum +{ + MIKIE_BAD_MODE=0, + MIKIE_NO_ROTATE, + MIKIE_ROTATE_L, + MIKIE_ROTATE_R +}; + +enum +{ + MIKIE_PIXEL_FORMAT_8BPP=0, + MIKIE_PIXEL_FORMAT_16BPP_555, + MIKIE_PIXEL_FORMAT_16BPP_565, + MIKIE_PIXEL_FORMAT_24BPP, + MIKIE_PIXEL_FORMAT_32BPP, +}; + +#include + +typedef Blip_Synth Synth; + +class CMikie : public CLynxBase +{ + public: + CMikie(CSystem& parent) MDFN_COLD; + ~CMikie() MDFN_COLD; + + uint32 startTS; + Synth miksynth; + Stereo_Buffer mikbuf; + + void Reset(void) MDFN_COLD; + + uint8 Peek(uint32 addr); + void Poke(uint32 addr,uint8 data); + uint32 ReadCycle(void) {return 5;}; + uint32 WriteCycle(void) {return 5;}; + uint32 ObjectSize(void) {return MIKIE_SIZE;}; + void PresetForHomebrew(void); + uint32 GetLfsrNext(uint32 current); + + void ComLynxCable(int status); + void ComLynxRxData(int data); + void ComLynxTxLoopback(int data); + void ComLynxTxCallback(void (*function)(int data,uint32 objref),uint32 objref); + + void DisplaySetAttributes(const MDFN_PixelFormat &format, const uint8* CustomPalette); + + void BlowOut(void); + + uint32 DisplayRenderLine(void); + uint32 DisplayEndOfFrame(void); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + inline void SetCPUSleep(void) {gSystemCPUSleep=TRUE;}; + inline void ClearCPUSleep(void) {gSystemCPUSleep=FALSE;}; + + void CombobulateSound(uint32 teatime); + void Update(void); + + bool mpSkipFrame; + MDFN_Surface* mpDisplayCurrent; + uint32 mpDisplayCurrentLine; + + private: + CSystem &mSystem; + + // Hardware storage + + uint32 mDisplayAddress; + uint32 mAudioInputComparator; + uint32 mTimerStatusFlags; + uint32 mTimerInterruptMask; + + TPALETTE mPalette[16]; + uint32 mColourMap[4096]; + + uint32 mIODAT; + uint32 mIODIR; + uint32 mIODAT_REST_SIGNAL; + + uint32 mDISPCTL_DMAEnable; + uint32 mDISPCTL_Flip; + uint32 mDISPCTL_FourColour; + uint32 mDISPCTL_Colour; + + uint32 mTIM_0_BKUP; + uint32 mTIM_0_ENABLE_RELOAD; + uint32 mTIM_0_ENABLE_COUNT; + uint32 mTIM_0_LINKING; + uint32 mTIM_0_CURRENT; + uint32 mTIM_0_TIMER_DONE; + uint32 mTIM_0_LAST_CLOCK; + uint32 mTIM_0_BORROW_IN; + uint32 mTIM_0_BORROW_OUT; + uint32 mTIM_0_LAST_LINK_CARRY; + uint32 mTIM_0_LAST_COUNT; + + uint32 mTIM_1_BKUP; + uint32 mTIM_1_ENABLE_RELOAD; + uint32 mTIM_1_ENABLE_COUNT; + uint32 mTIM_1_LINKING; + uint32 mTIM_1_CURRENT; + uint32 mTIM_1_TIMER_DONE; + uint32 mTIM_1_LAST_CLOCK; + uint32 mTIM_1_BORROW_IN; + uint32 mTIM_1_BORROW_OUT; + uint32 mTIM_1_LAST_LINK_CARRY; + uint32 mTIM_1_LAST_COUNT; + + uint32 mTIM_2_BKUP; + uint32 mTIM_2_ENABLE_RELOAD; + uint32 mTIM_2_ENABLE_COUNT; + uint32 mTIM_2_LINKING; + uint32 mTIM_2_CURRENT; + uint32 mTIM_2_TIMER_DONE; + uint32 mTIM_2_LAST_CLOCK; + uint32 mTIM_2_BORROW_IN; + uint32 mTIM_2_BORROW_OUT; + uint32 mTIM_2_LAST_LINK_CARRY; + uint32 mTIM_2_LAST_COUNT; + + uint32 mTIM_3_BKUP; + uint32 mTIM_3_ENABLE_RELOAD; + uint32 mTIM_3_ENABLE_COUNT; + uint32 mTIM_3_LINKING; + uint32 mTIM_3_CURRENT; + uint32 mTIM_3_TIMER_DONE; + uint32 mTIM_3_LAST_CLOCK; + uint32 mTIM_3_BORROW_IN; + uint32 mTIM_3_BORROW_OUT; + uint32 mTIM_3_LAST_LINK_CARRY; + uint32 mTIM_3_LAST_COUNT; + + uint32 mTIM_4_BKUP; + uint32 mTIM_4_ENABLE_RELOAD; + uint32 mTIM_4_ENABLE_COUNT; + uint32 mTIM_4_LINKING; + uint32 mTIM_4_CURRENT; + uint32 mTIM_4_TIMER_DONE; + uint32 mTIM_4_LAST_CLOCK; + uint32 mTIM_4_BORROW_IN; + uint32 mTIM_4_BORROW_OUT; + uint32 mTIM_4_LAST_LINK_CARRY; + uint32 mTIM_4_LAST_COUNT; + + uint32 mTIM_5_BKUP; + uint32 mTIM_5_ENABLE_RELOAD; + uint32 mTIM_5_ENABLE_COUNT; + uint32 mTIM_5_LINKING; + uint32 mTIM_5_CURRENT; + uint32 mTIM_5_TIMER_DONE; + uint32 mTIM_5_LAST_CLOCK; + uint32 mTIM_5_BORROW_IN; + uint32 mTIM_5_BORROW_OUT; + uint32 mTIM_5_LAST_LINK_CARRY; + uint32 mTIM_5_LAST_COUNT; + + uint32 mTIM_6_BKUP; + uint32 mTIM_6_ENABLE_RELOAD; + uint32 mTIM_6_ENABLE_COUNT; + uint32 mTIM_6_LINKING; + uint32 mTIM_6_CURRENT; + uint32 mTIM_6_TIMER_DONE; + uint32 mTIM_6_LAST_CLOCK; + uint32 mTIM_6_BORROW_IN; + uint32 mTIM_6_BORROW_OUT; + uint32 mTIM_6_LAST_LINK_CARRY; + uint32 mTIM_6_LAST_COUNT; + + uint32 mTIM_7_BKUP; + uint32 mTIM_7_ENABLE_RELOAD; + uint32 mTIM_7_ENABLE_COUNT; + uint32 mTIM_7_LINKING; + uint32 mTIM_7_CURRENT; + uint32 mTIM_7_TIMER_DONE; + uint32 mTIM_7_LAST_CLOCK; + uint32 mTIM_7_BORROW_IN; + uint32 mTIM_7_BORROW_OUT; + uint32 mTIM_7_LAST_LINK_CARRY; + uint32 mTIM_7_LAST_COUNT; + + uint32 mAUDIO_BKUP[4]; + uint32 mAUDIO_ENABLE_RELOAD[4]; + uint32 mAUDIO_ENABLE_COUNT[4]; + uint32 mAUDIO_LINKING[4]; + uint32 mAUDIO_CURRENT[4]; + uint32 mAUDIO_TIMER_DONE[4]; + uint32 mAUDIO_LAST_CLOCK[4]; + uint32 mAUDIO_BORROW_IN[4]; + uint32 mAUDIO_BORROW_OUT[4]; + uint32 mAUDIO_LAST_LINK_CARRY[4]; + uint32 mAUDIO_LAST_COUNT[4]; + int8 mAUDIO_VOLUME[4]; + uint32 mAUDIO_INTEGRATE_ENABLE[4]; + uint32 mAUDIO_WAVESHAPER[4]; + + int8 mAUDIO_OUTPUT[4]; + uint8 mAUDIO_ATTEN[4]; + uint32 mSTEREO; + uint32 mPAN; + + // + // Serial related variables + // + uint32 mUART_RX_IRQ_ENABLE; + uint32 mUART_TX_IRQ_ENABLE; + + uint32 mUART_RX_COUNTDOWN; + uint32 mUART_TX_COUNTDOWN; + + uint32 mUART_SENDBREAK; + uint32 mUART_TX_DATA; + uint32 mUART_RX_DATA; + uint32 mUART_RX_READY; + + uint32 mUART_PARITY_ENABLE; + uint32 mUART_PARITY_EVEN; + + int mUART_CABLE_PRESENT; + void (*mpUART_TX_CALLBACK)(int data,uint32 objref); + uint32 mUART_TX_CALLBACK_OBJECT; + + int mUART_Rx_input_queue[UART_MAX_RX_QUEUE]; + unsigned int mUART_Rx_input_ptr; + unsigned int mUART_Rx_output_ptr; + int mUART_Rx_waiting; + int mUART_Rx_framing_error; + int mUART_Rx_overun_error; + + // + // Screen related + // + + uint8 *mpRamPointer; + uint32 mLynxLine; + uint32 mLynxLineDMACounter; + uint32 mLynxAddr; + + template void CopyLineSurface(void); +}; + + +#endif + diff --git a/Mednafen/mednafen/lynx/ram.cpp b/Mednafen/mednafen/lynx/ram.cpp new file mode 100644 index 0000000000..68f8e350e7 --- /dev/null +++ b/Mednafen/mednafen/lynx/ram.cpp @@ -0,0 +1,134 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// RAM emulation class // +////////////////////////////////////////////////////////////////////////////// +// // +// This class emulates the system RAM (64KB), the interface is pretty // +// simple: constructor, reset, peek, poke. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + + +#define RAM_CPP + +//#include +//#define TRACE_RAM + +#include "system.h" +#include "ram.h" +#include +#include + +bool CRam::TestMagic(const uint8* data, uint64 test_size) +{ + if(test_size < 10) + return false; + + if(memcmp(&data[6], "BS93", 4)) + return false; + + return true; +} + +CRam::CRam(Stream* fp) +{ + if(fp) + { + uint8 raw_header[HEADER_RAW_SIZE]; + md5_context md5; + md5.starts(); + + fp->read(raw_header, sizeof(raw_header)); + fp->rewind(); + + if(memcmp(&raw_header[6], "BS93", 4)) + { + throw MDFN_Error(0, _("Lynx file format invalid (Magic No)")); + } + + mRamXORData.reset(new uint8[RAM_SIZE]); + memset(&mRamXORData[0], 0, RAM_SIZE); + + const uint16 load_address = MDFN_de16msb(&raw_header[2]) - sizeof(raw_header); + const uint16 size = MDFN_de16msb(&raw_header[4]); + const unsigned rc0 = std::min((RAM_SIZE - load_address), size); + const unsigned rc1 = size - rc0; + + //printf("load_addr=%04x, size=%04x, rc0=%04x, rc1=%04x\n", load_address, size, rc0, rc1); + + fp->read(&mRamXORData[load_address], rc0); + md5.update(&mRamXORData[load_address], rc0); + fp->read(&mRamXORData[0x0000], rc1); + md5.update(&mRamXORData[0x0000], rc1); + + md5.finish(MD5); + InfoRAMSize = size; + + for(unsigned i = 0; i < RAM_SIZE; i++) + mRamXORData[i] ^= DEFAULT_RAM_CONTENTS; + + boot_addr = load_address; + } + else + InfoRAMSize = 0; + + // Reset will cause the loadup + Reset(); +} + +CRam::~CRam() +{ + +} + +void CRam::Reset(void) +{ + MDFNMP_AddRAM(65536, 0x0000, mRamData); + + for(unsigned i = 0; i < RAM_SIZE; i++) + mRamData[i] = DEFAULT_RAM_CONTENTS; + + if(mRamXORData) + { + for(unsigned i = 0; i < RAM_SIZE; i++) + mRamData[i] ^= mRamXORData[i]; + + gCPUBootAddress = boot_addr; + } +} + +//END OF FILE diff --git a/Mednafen/mednafen/lynx/ram.h b/Mednafen/mednafen/lynx/ram.h new file mode 100644 index 0000000000..4037867860 --- /dev/null +++ b/Mednafen/mednafen/lynx/ram.h @@ -0,0 +1,86 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// RAM object header file // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the interface definition for the RAM class // +// that emulates the Handy system RAM (64K) // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef RAM_H +#define RAM_H + +#define RAM_SIZE 65536 +#define RAM_ADDR_MASK 0xffff +#define DEFAULT_RAM_CONTENTS 0xff + +class CRam : public CLynxBase +{ + + // Function members + + public: + enum { HEADER_RAW_SIZE = 10 }; + + CRam(Stream* fp) MDFN_COLD; + ~CRam() MDFN_COLD; + static bool TestMagic(const uint8* data, uint64 test_size) MDFN_COLD; + + public: + + void Reset(void) MDFN_COLD; + + void Poke(uint32 addr, uint8 data){ mRamData[addr]=data;}; + uint8 Peek(uint32 addr){ return(mRamData[addr]);}; + uint32 ReadCycle(void) {return 5;}; + uint32 WriteCycle(void) {return 5;}; + uint32 ObjectSize(void) {return RAM_SIZE;}; + uint8* GetRamPointer(void) { return mRamData; }; + + uint8 MD5[16]; + uint32 InfoRAMSize; + // Data members + + private: + uint8 mRamData[RAM_SIZE]; + std::unique_ptr mRamXORData; + uint16 boot_addr; +}; + +#endif + diff --git a/Mednafen/mednafen/lynx/rom.cpp b/Mednafen/mednafen/lynx/rom.cpp new file mode 100644 index 0000000000..764e396895 --- /dev/null +++ b/Mednafen/mednafen/lynx/rom.cpp @@ -0,0 +1,84 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// ROM emulation class // +////////////////////////////////////////////////////////////////////////////// +// // +// This class emulates the system ROM (512B), the interface is pretty // +// simple: constructor, reset, peek, poke. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#define ROM_CPP + +//#include +//#define TRACE_ROM + +#include "system.h" +#include "rom.h" + +#include + +#include + +CRom::CRom(const char *romfile) +{ + mWriteEnable=FALSE; + Reset(); + + // Initialise ROM + for(int loop=0;loop +//#define TRACE_SUSIE + +#include "system.h" +#include "susie.h" +#include "lynxdef.h" + +// +// As the Susie sprite engine only ever sees system RAM +// wa can access this directly without the hassle of +// going through the system object, much faster +// +//#define RAM_PEEK(m) (mSystem.Peek_RAM((m))) +//#define RAM_POKE(m1,m2) (mSystem.Poke_RAM((m1),(m2))) +//#define RAM_PEEKW(m) (mSystem.PeekW_RAM((m))) + +#define RAM_PEEK(m) (mRamPointer[(m)]) +#define RAM_PEEKW(m) (mRamPointer[(m)]+(mRamPointer[(m)+1]<<8)) +#define RAM_POKE(m1,m2) {mRamPointer[(m1)]=(m2);} + +uint32 cycles_used=0; + +CSusie::CSusie(CSystem& parent) + :mSystem(parent) +{ + TRACE_SUSIE0("CSusie()"); + Reset(); +} + +CSusie::~CSusie() +{ + TRACE_SUSIE0("~CSusie()"); +} + +void CSusie::Reset(void) +{ + TRACE_SUSIE0("Reset()"); + + // Fetch pointer to system RAM, faster than object access + // and seeing as Susie only ever sees RAM. + + mRamPointer=mSystem.GetRamPointer(); + + // Reset ALL variables + + mTMPADR.Val16=0; + mTILTACUM.Val16=0; + mHOFF.Val16=0; + mVOFF.Val16=0; + mVIDBAS.Val16=0; + mCOLLBAS.Val16=0; + mVIDADR.Val16=0; + mCOLLADR.Val16=0; + mSCBNEXT.Val16=0; + mSPRDLINE.Val16=0; + mHPOSSTRT.Val16=0; + mVPOSSTRT.Val16=0; + mSPRHSIZ.Val16=0; + mSPRVSIZ.Val16=0; + mSTRETCH.Val16=0; + mTILT.Val16=0; + mSPRDOFF.Val16=0; + mSPRVPOS.Val16=0; + mCOLLOFF.Val16=0; + mVSIZACUM.Val16=0; + mHSIZACUM.Val16=0; + mHSIZOFF.Val16=0x007f; + mVSIZOFF.Val16=0x007f; + mSCBADR.Val16=0; + mPROCADR.Val16=0; + + // Must be initialised to this due to + // stun runner math initialisation bug + // see whatsnew for 0.7 + mMATHABCD.Long=0xffffffff; + mMATHEFGH.Long=0xffffffff; + mMATHJKLM.Long=0xffffffff; + mMATHNP.Long=0xffff; + + mMATHAB_sign=1; + mMATHCD_sign=1; + mMATHEFGH_sign=1; + + mSPRCTL0_Type=0; + mSPRCTL0_Vflip=0; + mSPRCTL0_Hflip=0; + mSPRCTL0_PixelBits=0; + + mSPRCTL1_StartLeft=0; + mSPRCTL1_StartUp=0; + mSPRCTL1_SkipSprite=0; + mSPRCTL1_ReloadPalette=0; + mSPRCTL1_ReloadDepth=0; + mSPRCTL1_Sizing=0; + mSPRCTL1_Literal=0; + + mSPRCOLL_Number=0; + mSPRCOLL_Collide=0; + + mSPRSYS_StopOnCurrent=0; + mSPRSYS_LeftHand=0; + mSPRSYS_VStretch=0; + mSPRSYS_NoCollide=0; + mSPRSYS_Accumulate=0; + mSPRSYS_SignedMath=0; + mSPRSYS_Status=0; + mSPRSYS_UnsafeAccess=0; + mSPRSYS_LastCarry=0; + mSPRSYS_Mathbit=0; + mSPRSYS_MathInProgress=0; + + mSUZYBUSEN=FALSE; + + mSPRINIT.Byte=0; + + mSPRGO=FALSE; + mEVERON=FALSE; + + for(int loop=0;loop<16;loop++) mPenIndex[loop]=loop; + + hquadoff = vquadoff = 0; + + mJOYSTICK.Byte=0; + mSWITCHES.Byte=0; +} + + +void CSusie::DoMathMultiply(void) +{ + mSPRSYS_Mathbit=FALSE; + + // Multiplies with out sign or accumulate take 44 ticks to complete. + // Multiplies with sign and accumulate take 54 ticks to complete. + // + // AB EFGH + // * CD / NP + // ------- ----------- + // EFGH ABCD + // Accumulate in JKLM Remainder in (JK)LM + // + + + uint32 result; + + // Basic multiply is ALWAYS unsigned, sign conversion is done later + result=(uint32)mMATHABCD.Words.AB*(uint32)mMATHABCD.Words.CD; + mMATHEFGH.Long=result; + + if(mSPRSYS_SignedMath) + { + TRACE_SUSIE0("DoMathMultiply() - SIGNED"); + // Add the sign bits, only >0 is +ve result + mMATHEFGH_sign=mMATHAB_sign+mMATHCD_sign; + if(!mMATHEFGH_sign) + { + mMATHEFGH.Long^=0xffffffff; + mMATHEFGH.Long++; + } + } + else + { + TRACE_SUSIE0("DoMathMultiply() - UNSIGNED"); + } + + TRACE_SUSIE2("DoMathMultiply() AB=$%04x * CD=$%04x",mMATHABCD.Words.AB,mMATHABCD.Words.CD); + + // Check overflow, if B31 has changed from 1->0 then its overflow time + if(mSPRSYS_Accumulate) + { + TRACE_SUSIE0("DoMathMultiply() - ACCUMULATED JKLM+=EFGH"); + uint32 tmp=mMATHJKLM.Long+mMATHEFGH.Long; + // Let sign change indicate overflow + if((tmp&0x80000000)!=(mMATHJKLM.Long&0x80000000)) + { + TRACE_SUSIE0("DoMathMultiply() - OVERFLOW DETECTED"); +// mSPRSYS_Mathbit=TRUE; + } + else + { +// mSPRSYS_Mathbit=FALSE; + } + // Save accumulated result + mMATHJKLM.Long=tmp; + } + + TRACE_SUSIE1("DoMathMultiply() Results (raw - no sign) Result=$%08x",result); + TRACE_SUSIE1("DoMathMultiply() Results (Multi) EFGH=$%08x",mMATHEFGH.Long); + TRACE_SUSIE1("DoMathMultiply() Results (Accum) JKLM=$%08x",mMATHJKLM.Long); +} + +void CSusie::DoMathDivide(void) +{ + mSPRSYS_Mathbit=FALSE; + + // + // Divides take 176 + 14*N ticks + // (N is the number of most significant zeros in the divisor.) + // + // AB EFGH + // * CD / NP + // ------- ----------- + // EFGH ABCD + // Accumulate in JKLM Remainder in (JK)LM + // + + // Divide is ALWAYS unsigned arithmetic... + if(mMATHNP.Long) + { + TRACE_SUSIE0("DoMathDivide() - UNSIGNED"); + mMATHABCD.Long=mMATHEFGH.Long/mMATHNP.Long; + mMATHJKLM.Long=mMATHEFGH.Long%mMATHNP.Long; + } + else + { + TRACE_SUSIE0("DoMathDivide() - DIVIDE BY ZERO ERROR"); + mMATHABCD.Long=0xffffffff; + mMATHJKLM.Long=0; + mSPRSYS_Mathbit=TRUE; + } + TRACE_SUSIE2("DoMathDivide() EFGH=$%08x / NP=%04x",mMATHEFGH.Long,mMATHNP.Long); + TRACE_SUSIE1("DoMathDivide() Results (div) ABCD=$%08x",mMATHABCD.Long); + TRACE_SUSIE1("DoMathDivide() Results (mod) JKLM=$%08x",mMATHJKLM.Long); +} + + +uint32 CSusie::PaintSprites(void) +{ + int sprcount=0; + int data=0; + int everonscreen=0; + + TRACE_SUSIE0(" "); + TRACE_SUSIE0(" "); + TRACE_SUSIE0(" "); + TRACE_SUSIE0("**************************************************************"); + TRACE_SUSIE0("********************** PaintSprites **************************"); + TRACE_SUSIE0("**************************************************************"); + TRACE_SUSIE0(" "); + + TRACE_SUSIE1("PaintSprites() VIDBAS $%04x",mVIDBAS.Val16); + TRACE_SUSIE1("PaintSprites() COLLBAS $%04x",mCOLLBAS.Val16); + TRACE_SUSIE1("PaintSprites() SPRSYS $%02x",Peek(SPRSYS)); + + if(!mSUZYBUSEN || !mSPRGO) + { + TRACE_SUSIE0("PaintSprites() Returned !mSUZYBUSEN || !mSPRGO"); + return 0; + } + + cycles_used=0; + + do + { + everonscreen = 0; + + TRACE_SUSIE1("PaintSprites() ************ Rendering Sprite %03d ************",sprcount); + + // Step 1 load up the SCB params into Susie + + // And thus it is documented that only the top byte of SCBNEXT is used. + // Its mentioned under the bits that are broke section in the bluebook + if(!(mSCBNEXT.Val16&0xff00)) + { + TRACE_SUSIE0("PaintSprites() mSCBNEXT==0 - FINISHED"); + mSPRSYS_Status=0; // Engine has finished + mSPRGO=FALSE; + break; + } + else + { + mSPRSYS_Status=1; + } + + mTMPADR.Val16=mSCBNEXT.Val16; // Copy SCB pointer + mSCBADR.Val16=mSCBNEXT.Val16; // Copy SCB pointer + TRACE_SUSIE1("PaintSprites() SCBADDR $%04x",mSCBADR.Val16); + + data=RAM_PEEK(mTMPADR.Val16); // Fetch control 0 + TRACE_SUSIE1("PaintSprites() SPRCTL0 $%02x",data); + mSPRCTL0_Type=data&0x0007; + mSPRCTL0_Vflip=data&0x0010; + mSPRCTL0_Hflip=data&0x0020; + mSPRCTL0_PixelBits=((data&0x00c0)>>6)+1; + mTMPADR.Val16+=1; + + data=RAM_PEEK(mTMPADR.Val16); // Fetch control 1 + TRACE_SUSIE1("PaintSprites() SPRCTL1 $%02x",data); + mSPRCTL1_StartLeft=data&0x0001; + mSPRCTL1_StartUp=data&0x0002; + mSPRCTL1_SkipSprite=data&0x0004; + mSPRCTL1_ReloadPalette=data&0x0008; + mSPRCTL1_ReloadDepth=(data&0x0030)>>4; + mSPRCTL1_Sizing=data&0x0040; + mSPRCTL1_Literal=data&0x0080; + mTMPADR.Val16+=1; + + data=RAM_PEEK(mTMPADR.Val16); // Collision num + TRACE_SUSIE1("PaintSprites() SPRCOLL $%02x",data); + mSPRCOLL_Number=data&0x000f; + mSPRCOLL_Collide=data&0x0020; + mTMPADR.Val16+=1; + + mSCBNEXT.Val16=RAM_PEEKW(mTMPADR.Val16); // Next SCB + TRACE_SUSIE1("PaintSprites() SCBNEXT $%04x",mSCBNEXT.Val16); + mTMPADR.Val16+=2; + + cycles_used+=5*SPR_RDWR_CYC; + + // Initialise the collision depositary + +// Although Tom Schenck says this is correct, it doesnt appear to be +// if(!mSPRCOLL_Collide && !mSPRSYS_NoCollide) +// { +// mCollision=RAM_PEEK((mSCBADR.Val16+mCOLLOFF.Val16)&0xffff); +// mCollision&=0x0f; +// } + mCollision=0; + + // Check if this is a skip sprite + + if(!mSPRCTL1_SkipSprite) + { + + mSPRDLINE.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite pack data + TRACE_SUSIE1("PaintSprites() SPRDLINE $%04x",mSPRDLINE.Val16); + mTMPADR.Val16+=2; + + mHPOSSTRT.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite horizontal start position + TRACE_SUSIE1("PaintSprites() HPOSSTRT $%04x",mHPOSSTRT.Val16); + mTMPADR.Val16+=2; + + mVPOSSTRT.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite vertical start position + TRACE_SUSIE1("PaintSprites() VPOSSTRT $%04x",mVPOSSTRT.Val16); + mTMPADR.Val16+=2; + + cycles_used+=6*SPR_RDWR_CYC; + + bool enable_sizing=FALSE; + bool enable_stretch=FALSE; + bool enable_tilt=FALSE; + + // Optional section defined by reload type in Control 1 + + TRACE_SUSIE1("PaintSprites() mSPRCTL1.Bits.ReloadDepth=%d",mSPRCTL1_ReloadDepth); + switch(mSPRCTL1_ReloadDepth) + { + case 1: + TRACE_SUSIE0("PaintSprites() Sizing Enabled"); + enable_sizing=TRUE; + + mSPRHSIZ.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite Horizontal size + mTMPADR.Val16+=2; + + mSPRVSIZ.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite Verticalal size + mTMPADR.Val16+=2; + + cycles_used+=4*SPR_RDWR_CYC; + break; + + case 2: + TRACE_SUSIE0("PaintSprites() Sizing Enabled"); + TRACE_SUSIE0("PaintSprites() Stretch Enabled"); + enable_sizing=TRUE; + enable_stretch=TRUE; + + mSPRHSIZ.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite Horizontal size + mTMPADR.Val16+=2; + + mSPRVSIZ.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite Verticalal size + mTMPADR.Val16+=2; + + mSTRETCH.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite stretch + mTMPADR.Val16+=2; + + cycles_used+=6*SPR_RDWR_CYC; + break; + + case 3: + TRACE_SUSIE0("PaintSprites() Sizing Enabled"); + TRACE_SUSIE0("PaintSprites() Stretch Enabled"); + TRACE_SUSIE0("PaintSprites() Tilt Enabled"); + enable_sizing=TRUE; + enable_stretch=TRUE; + enable_tilt=TRUE; + + mSPRHSIZ.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite Horizontal size + mTMPADR.Val16+=2; + + mSPRVSIZ.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite Verticalal size + mTMPADR.Val16+=2; + + mSTRETCH.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite stretch + mTMPADR.Val16+=2; + + mTILT.Val16=RAM_PEEKW(mTMPADR.Val16); // Sprite tilt + mTMPADR.Val16+=2; + + cycles_used+=8*SPR_RDWR_CYC; + break; + + default: + break; + } + + TRACE_SUSIE1("PaintSprites() SPRHSIZ $%04x",mSPRHSIZ.Val16); + TRACE_SUSIE1("PaintSprites() SPRVSIZ $%04x",mSPRVSIZ.Val16); + TRACE_SUSIE1("PaintSprites() STRETCH $%04x",mSTRETCH.Val16); + TRACE_SUSIE1("PaintSprites() TILT $%04x",mTILT.Val16); + + + // Optional Palette reload + + if(!mSPRCTL1_ReloadPalette) + { + TRACE_SUSIE0("PaintSprites() Palette reloaded"); + for(int loop=0;loop<8;loop++) + { + uint8 data_tmp = RAM_PEEK(mTMPADR.Val16++); + mPenIndex[loop*2]=(data_tmp>>4)&0x0f; + mPenIndex[(loop*2)+1]=data_tmp&0x0f; + } + // Increment cycle count for the reads + cycles_used+=8*SPR_RDWR_CYC; + } + + // Now we can start painting + + // Quadrant drawing order is: SE,NE,NW,SW + // start quadrant is given by sprite_control1:0 & 1 + + // Setup screen start end variables + + int screen_h_start=(int16)mHOFF.Val16; + int screen_h_end=(int16)mHOFF.Val16+SCREEN_WIDTH; + int screen_v_start=(int16)mVOFF.Val16; + int screen_v_end=(int16)mVOFF.Val16+SCREEN_HEIGHT; + + int world_h_mid=screen_h_start+0x8000+(SCREEN_WIDTH/2); + int world_v_mid=screen_v_start+0x8000+(SCREEN_HEIGHT/2); + + TRACE_SUSIE2("PaintSprites() screen_h_start $%04x screen_h_end $%04x",screen_h_start,screen_h_end); + TRACE_SUSIE2("PaintSprites() screen_v_start $%04x screen_v_end $%04x",screen_v_start,screen_v_end); + TRACE_SUSIE2("PaintSprites() world_h_mid $%04x world_v_mid $%04x",world_h_mid,world_v_mid); + + bool superclip=FALSE; + int quadrant=0; + int hsign,vsign; + + if(mSPRCTL1_StartLeft) + { + if(mSPRCTL1_StartUp) quadrant=2; else quadrant=3; + } + else + { + if(mSPRCTL1_StartUp) quadrant=1; else quadrant=0; + } + TRACE_SUSIE1("PaintSprites() Quadrant=%d",quadrant); + + // Check ref is inside screen area + + //if((int16)mHPOSSTRT.Val16=screen_h_end || + // (int16)mVPOSSTRT.Val16=screen_v_end) superclip=TRUE; + + TRACE_SUSIE1("PaintSprites() Superclip=%d",superclip); + + + // Quadrant mapping is: SE NE NW SW + // 0 1 2 3 + // hsign +1 +1 -1 -1 + // vsign +1 -1 -1 +1 + // + // + // 2 | 1 + // ------- + // 3 | 0 + // + + // Loop for 4 quadrants + + for(int loop=0;loop<4;loop++) + { + TRACE_SUSIE1("PaintSprites() -------- Rendering Quadrant %03d --------",quadrant); + + int sprite_v=mVPOSSTRT.Val16; + int sprite_h=mHPOSSTRT.Val16; + + bool render=FALSE; + + // Set quadrand multipliers + hsign=(quadrant==0 || quadrant==1)?1:-1; + vsign=(quadrant==0 || quadrant==3)?1:-1; + +// Preflip TRACE_SUSIE2("PaintSprites() hsign=%d vsign=%d",hsign,vsign); + + //Use h/v flip to invert v/hsign + + if(mSPRCTL0_Vflip) vsign=-vsign; + if(mSPRCTL0_Hflip) hsign=-hsign; + + TRACE_SUSIE2("PaintSprites() Hflip=%d Vflip=%d",mSPRCTL0_Hflip,mSPRCTL0_Vflip); + TRACE_SUSIE2("PaintSprites() Hsign=%d Vsign=%d",hsign,vsign); + TRACE_SUSIE2("PaintSprites() Hpos =%04x Vpos =%04x",mHPOSSTRT.Val16,mVPOSSTRT.Val16); + TRACE_SUSIE2("PaintSprites() Hsizoff =%04x Vsizoff =%04x",mHSIZOFF.Val16,mVSIZOFF.Val16); + + // Two different rendering algorithms used, on-screen & superclip + // when on screen we draw in x until off screen then skip to next + // line, BUT on superclip we draw all the way to the end of any + // given line checking each pixel is on screen. + + if(superclip) + { + // Check on the basis of each quad, we only render the quad + // IF the screen is in the quad, relative to the centre of + // the screen which is calculated below. + + // Quadrant mapping is: SE NE NW SW + // 0 1 2 3 + // hsign +1 +1 -1 -1 + // vsign +1 -1 -1 +1 + // + // + // 2 | 1 + // ------- + // 3 | 0 + // + // Quadrant mapping for superclipping must also take into account + // the hflip, vflip bits & negative tilt to be able to work correctly + // + int modquad=quadrant; + static const int vquadflip[4]={1,0,3,2}; + static const int hquadflip[4]={3,2,1,0}; + + if(mSPRCTL0_Vflip) modquad=vquadflip[modquad]; + if(mSPRCTL0_Hflip) modquad=hquadflip[modquad]; + + // This is causing Eurosoccer to fail!! + //if(enable_tilt && mTILT.Val16&0x8000) modquad=hquadflip[modquad]; + //if(quadrant == 0 && sprite_v == 219 && sprite_h == 890) + //printf("%d:%d %d %d\n", quadrant, modquad, sprite_h, sprite_v); + + switch(modquad) + { + case 3: + if((sprite_h>=screen_h_start || sprite_hworld_v_mid)) render=TRUE; + break; + case 2: + if((sprite_h>=screen_h_start || sprite_h=screen_v_start || sprite_vworld_h_mid) && (sprite_v>=screen_v_start || sprite_vworld_h_mid) && (sprite_vworld_v_mid)) render=TRUE; + break; + } + } + else + { + render=TRUE; + } + + // Is this quad to be rendered ?? + + TRACE_SUSIE1("PaintSprites() Render status %d",render); + + int pixel_height; + int pixel_width; + int pixel; + int hoff,voff; + int hloop,vloop; + bool onscreen; + + if(render) + { + // Set the vertical position & offset + voff=(int16)mVPOSSTRT.Val16-screen_v_start; + + // Zero the stretch,tilt & acum values + mTILTACUM.Val16=0; + + // Perform the SIZOFF + if(vsign==1) mVSIZACUM.Val16=mVSIZOFF.Val16; else mVSIZACUM.Val16=0; + + // Take the sign of the first quad (0) as the basic + // sign, all other quads drawing in the other direction + // get offset by 1 pixel in the other direction, this + // fixes the squashed look on the multi-quad sprites. +// if(vsign==-1 && loop>0) voff+=vsign; + if(loop==0) vquadoff=vsign; + if(vsign!=vquadoff) voff+=vsign; + + for(;;) + { + // Vertical scaling is done here + mVSIZACUM.Val16+=mSPRVSIZ.Val16; + pixel_height=mVSIZACUM.Union8.High; + mVSIZACUM.Union8.High=0; + + // Update the next data line pointer and initialise our line + mSPRDOFF.Val16=(uint16)LineInit(0); + + // If 1 == next quad, ==0 end of sprite, anyways its END OF LINE + if(mSPRDOFF.Val16==1) // End of quad + { + mSPRDLINE.Val16+=mSPRDOFF.Val16; + break; + } + + if(mSPRDOFF.Val16==0) // End of sprite + { + loop=4; // Halt the quad loop + break; + } + + // Draw one horizontal line of the sprite + for(vloop=0;vloop=SCREEN_HEIGHT) break; + if(vsign==-1 && voff<0) break; + + // Only allow the draw to take place if the line is visible + if(voff>=0 && voff>8); + mTILTACUM.Union8.High=0; + hoff=(int)((int16)mHPOSSTRT.Val16)-screen_h_start; + + // Zero/Force the horizontal scaling accumulator + if(hsign==1) mHSIZACUM.Val16=mHSIZOFF.Val16; else mHSIZACUM.Val16=0; + + // Take the sign of the first quad (0) as the basic + // sign, all other quads drawing in the other direction + // get offset by 1 pixel in the other direction, this + // fixes the squashed look on the multi-quad sprites. +// if(hsign==-1 && loop>0) hoff+=hsign; + if(loop==0) hquadoff=hsign; + if(hsign!=hquadoff) hoff+=hsign; + + // Initialise our line + LineInit(voff); + onscreen=FALSE; + + // Now render an individual destination line + while((pixel=LineGetPixel())!=LINE_END) + { + // This is allowed to update every pixel + mHSIZACUM.Val16+=mSPRHSIZ.Val16; + pixel_width=mHSIZACUM.Union8.High; + mHSIZACUM.Union8.High=0; + + for(hloop=0;hloop=0 && hoff4096) + { + // Stop the system, otherwise we may just come straight back in..... + gSystemHalt=TRUE; + // Display warning message + //gError->Warning("CSusie:PaintSprites(): Single draw sprite limit exceeded (>4096). The SCB is most likely looped back on itself. Reset/Exit is recommended"); + // Signal error to the caller + return 0; + } + } + while(1); + + // Fudge factor to fix many flickering issues, also the keypress + // problem with Hard Drivin and the strange pause in Dirty Larry. + //cycles_used>>=2; + return cycles_used; +} + + +INLINE void CSusie::WritePixel(uint32 hoff,uint32 pixel) +{ + uint32 scr_addr=mLineBaseAddress+(hoff/2); + + uint8 dest=RAM_PEEK(scr_addr); + if(!(hoff&0x01)) + { + // Upper nibble screen write + dest&=0x0f; + dest|=pixel<<4; + } + else + { + // Lower nibble screen write + dest&=0xf0; + dest|=pixel; + } + RAM_POKE(scr_addr,dest); + + // Increment cycle count for the read/modify/write + cycles_used+=2*SPR_RDWR_CYC; +} + +INLINE uint32 CSusie::ReadPixel(uint32 hoff) +{ + uint32 scr_addr=mLineBaseAddress+(hoff/2); + + uint32 data=RAM_PEEK(scr_addr); + if(!(hoff&0x01)) + { + // Upper nibble read + data>>=4; + } + else + { + // Lower nibble read + data&=0x0f; + } + + // Increment cycle count for the read/modify/write + cycles_used+=SPR_RDWR_CYC; + + return data; +} + +INLINE void CSusie::WriteCollision(uint32 hoff,uint32 pixel) +{ + uint32 col_addr=mLineCollisionAddress+(hoff/2); + + uint8 dest=RAM_PEEK(col_addr); + if(!(hoff&0x01)) + { + // Upper nibble screen write + dest&=0x0f; + dest|=pixel<<4; + } + else + { + // Lower nibble screen write + dest&=0xf0; + dest|=pixel; + } + RAM_POKE(col_addr,dest); + + // Increment cycle count for the read/modify/write + cycles_used+=2*SPR_RDWR_CYC; +} + +INLINE uint32 CSusie::ReadCollision(uint32 hoff) +{ + uint32 col_addr=mLineCollisionAddress+(hoff/2); + + uint32 data=RAM_PEEK(col_addr); + if(!(hoff&0x01)) + { + // Upper nibble read + data>>=4; + } + else + { + // Lower nibble read + data&=0x0f; + } + + // Increment cycle count for the read/modify/write + cycles_used+=SPR_RDWR_CYC; + + return data; +} + + +INLINE uint32 CSusie::LineGetBits(uint32 bits) +{ + uint32 retval; + + // Sanity, not really needed + // if(bits>32) return 0; + + // Only return data IF there is enought bits left in the packet + + //if(mLinePacketBitsLeft>(mLineShiftRegCount-bits); + retval&=(1<mCollision) + { + mCollision=collision; + } +// 01/05/00 V0.7 if(mSPRCOLL_Number>collision) + { + WriteCollision(hoff,mSPRCOLL_Number); + } + } + } + break; + + // NORMAL + // 1 F is opaque + // 1 E is collideable + // 0 0 is opaque and collideable + // 1 allow collision detect + // 1 allow coll. buffer access + // 0 exclusive-or the data + case sprite_normal: + if(pixel!=0x00) + { + WritePixel(hoff,pixel); + if(!mSPRCOLL_Collide && !mSPRSYS_NoCollide) + { + int collision=ReadCollision(hoff); + if(collision>mCollision) + { + mCollision=collision; + } +// 01/05/00 V0.7 if(mSPRCOLL_Number>collision) + { + WriteCollision(hoff,mSPRCOLL_Number); + } + } + } + break; + + // BOUNDARY_SHADOW + // 0 F is opaque + // 0 E is collideable + // 0 0 is opaque and collideable + // 1 allow collision detect + // 1 allow coll. buffer access + // 0 exclusive-or the data + case sprite_boundary_shadow: + if(pixel!=0x00 && pixel!=0x0e && pixel!=0x0f) + { + WritePixel(hoff,pixel); + } + if(pixel!=0x00 && pixel!=0x0e) + { + if(!mSPRCOLL_Collide && !mSPRSYS_NoCollide) + { + int collision=ReadCollision(hoff); + if(collision>mCollision) + { + mCollision=collision; + } +// 01/05/00 V0.7 if(mSPRCOLL_Number>collision) + { + WriteCollision(hoff,mSPRCOLL_Number); + } + } + } + break; + + // SHADOW + // 1 F is opaque + // 0 E is collideable + // 0 0 is opaque and collideable + // 1 allow collision detect + // 1 allow coll. buffer access + // 0 exclusive-or the data + case sprite_shadow: + if(pixel!=0x00) + { + WritePixel(hoff,pixel); + } + if(pixel!=0x00 && pixel!=0x0e) + { + if(!mSPRCOLL_Collide && !mSPRSYS_NoCollide) + { + int collision=ReadCollision(hoff); + if(collision>mCollision) + { + mCollision=collision; + } +// 01/05/00 V0.7 if(mSPRCOLL_Number>collision) + { + WriteCollision(hoff,mSPRCOLL_Number); + } + } + } + break; + + // XOR SHADOW + // 1 F is opaque + // 0 E is collideable + // 0 0 is opaque and collideable + // 1 allow collision detect + // 1 allow coll. buffer access + // 1 exclusive-or the data + case sprite_xor_shadow: + if(pixel!=0x00) + { + WritePixel(hoff,ReadPixel(hoff)^pixel); + } + if(pixel!=0x00 && pixel!=0x0e) + { + if(!mSPRCOLL_Collide && !mSPRSYS_NoCollide && pixel!=0x0e) + { + int collision=ReadCollision(hoff); + if(collision>mCollision) + { + mCollision=collision; + } +// 01/05/00 V0.7 if(mSPRCOLL_Number>collision) + { + WriteCollision(hoff,mSPRCOLL_Number); + } + } + } + break; + default: +// _asm int 3; + break; + } +} + +uint32 CSusie::LineInit(uint32 voff) +{ +// TRACE_SUSIE0("LineInit()"); + + mLineShiftReg=0; + mLineShiftRegCount=0; + mLineRepeatCount=0; + mLinePixel=0; + mLineType=line_error; + mLinePacketBitsLeft=0xffff; + + // Initialise the temporary pointer + + mTMPADR=mSPRDLINE; + + // First read the Offset to the next line + + uint32 offset=LineGetBits(8); +// TRACE_SUSIE1("LineInit() Offset=%04x",offset); + + // Specify the MAXIMUM number of bits in this packet, it + // can terminate early but can never use more than this + // without ending the current packet, we count down in LineGetBits() + + mLinePacketBitsLeft=(offset-1)*8; + + // Literals are a special case and get their count set on a line basis + + if(mSPRCTL1_Literal) + { + mLineType=line_abs_literal; + mLineRepeatCount=((offset-1)*8)/mSPRCTL0_PixelBits; + // Why is this necessary, is this compensating for the 1,1 offset bug +// mLineRepeatCount--; + } +// TRACE_SUSIE1("LineInit() mLineRepeatCount=$%04x",mLineRepeatCount); + + // Set the line base address for use in the calls to pixel painting + + if(voff>101) + { + //gError->Warning("CSusie::LineInit() Out of bounds (voff)"); + voff=0; + } + + mLineBaseAddress=mVIDBAS.Val16+(voff*(SCREEN_WIDTH/2)); + mLineCollisionAddress=mCOLLBAS.Val16+(voff*(SCREEN_WIDTH/2)); +// TRACE_SUSIE1("LineInit() mLineBaseAddress=$%04x",mLineBaseAddress); +// TRACE_SUSIE1("LineInit() mLineCollisionAddress=$%04x",mLineCollisionAddress); + + // Return the offset to the next line + + return offset; +} + +uint32 CSusie::LineGetPixel() +{ + if(!mLineRepeatCount) + { + // Normal sprites fetch their counts on a packet basis + if(mLineType!=line_abs_literal) + { + uint32 literal=LineGetBits(1); + if(literal) mLineType=line_literal; else mLineType=line_packed; + } + + // Pixel store is empty what should we do + switch(mLineType) + { + case line_abs_literal: + // This means end of line for us + mLinePixel=LINE_END; + return mLinePixel; // SPEEDUP + break; + case line_literal: + mLineRepeatCount=LineGetBits(4); + mLineRepeatCount++; + break; + case line_packed: + // + // From reading in between the lines only a packed line with + // a zero size i.e 0b00000 as a header is allowable as a packet end + // + mLineRepeatCount=LineGetBits(4); + if(!mLineRepeatCount) + { + mLinePixel=LINE_END; + } + else + { + mLinePixel=mPenIndex[LineGetBits(mSPRCTL0_PixelBits)]; + } + mLineRepeatCount++; + break; + default: + return 0; + } + } + + if(mLinePixel!=LINE_END) + { + mLineRepeatCount--; + + switch(mLineType) + { + case line_abs_literal: + mLinePixel=LineGetBits(mSPRCTL0_PixelBits); + // Check the special case of a zero in the last pixel + if(!mLineRepeatCount && !mLinePixel) + mLinePixel=LINE_END; + else + mLinePixel=mPenIndex[mLinePixel]; + break; + case line_literal: + mLinePixel=mPenIndex[LineGetBits(mSPRCTL0_PixelBits)]; + break; + case line_packed: + break; + default: + return 0; + } + } + + return mLinePixel; +} + + +void CSusie::Poke(uint32 addr,uint8 data) +{ + switch(addr&0xff) + { + case (TMPADRL&0xff): + mTMPADR.Union8.Low=data; + mTMPADR.Union8.High=0; + TRACE_SUSIE2("Poke(TMPADRL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (TMPADRH&0xff): + mTMPADR.Union8.High=data; + TRACE_SUSIE2("Poke(TMPADRH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (TILTACUML&0xff): + mTILTACUM.Union8.Low=data; + mTILTACUM.Union8.High=0; + TRACE_SUSIE2("Poke(TILTACUML,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (TILTACUMH&0xff): + mTILTACUM.Union8.High=data; + TRACE_SUSIE2("Poke(TILTACUMH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (HOFFL&0xff): + mHOFF.Union8.Low=data; + mHOFF.Union8.High=0; + TRACE_SUSIE2("Poke(HOFFL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (HOFFH&0xff): + mHOFF.Union8.High=data; + TRACE_SUSIE2("Poke(HOFFH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VOFFL&0xff): + mVOFF.Union8.Low=data; + mVOFF.Union8.High=0; + TRACE_SUSIE2("Poke(VOFFL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VOFFH&0xff): + mVOFF.Union8.High=data; + TRACE_SUSIE2("Poke(VOFFH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VIDBASL&0xff): + mVIDBAS.Union8.Low=data; + mVIDBAS.Union8.High=0; + TRACE_SUSIE2("Poke(VIDBASL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VIDBASH&0xff): + mVIDBAS.Union8.High=data; + TRACE_SUSIE2("Poke(VIDBASH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (COLLBASL&0xff): + mCOLLBAS.Union8.Low=data; + mCOLLBAS.Union8.High=0; + TRACE_SUSIE2("Poke(COLLBASL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (COLLBASH&0xff): + mCOLLBAS.Union8.High=data; + TRACE_SUSIE2("Poke(COLLBASH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VIDADRL&0xff): + mVIDADR.Union8.Low=data; + mVIDADR.Union8.High=0; + TRACE_SUSIE2("Poke(VIDADRL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VIDADRH&0xff): + mVIDADR.Union8.High=data; + TRACE_SUSIE2("Poke(VIDADRH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (COLLADRL&0xff): + mCOLLADR.Union8.Low=data; + mCOLLADR.Union8.High=0; + TRACE_SUSIE2("Poke(COLLADRL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (COLLADRH&0xff): + mCOLLADR.Union8.High=data; + TRACE_SUSIE2("Poke(COLLADRH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SCBNEXTL&0xff): + mSCBNEXT.Union8.Low=data; + mSCBNEXT.Union8.High=0; + TRACE_SUSIE2("Poke(SCBNEXTL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SCBNEXTH&0xff): + mSCBNEXT.Union8.High=data; + TRACE_SUSIE2("Poke(SCBNEXTH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRDLINEL&0xff): + mSPRDLINE.Union8.Low=data; + mSPRDLINE.Union8.High=0; + TRACE_SUSIE2("Poke(SPRDLINEL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRDLINEH&0xff): + mSPRDLINE.Union8.High=data; + TRACE_SUSIE2("Poke(SPRDLINEH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (HPOSSTRTL&0xff): + mHPOSSTRT.Union8.Low=data; + mHPOSSTRT.Union8.High=0; + TRACE_SUSIE2("Poke(HPOSSTRTL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (HPOSSTRTH&0xff): + mHPOSSTRT.Union8.High=data; + TRACE_SUSIE2("Poke(HPOSSTRTH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VPOSSTRTL&0xff): + mVPOSSTRT.Union8.Low=data; + mVPOSSTRT.Union8.High=0; + TRACE_SUSIE2("Poke(VPOSSTRTL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VPOSSTRTH&0xff): + mVPOSSTRT.Union8.High=data; + TRACE_SUSIE2("Poke(VPOSSTRTH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRHSIZL&0xff): + mSPRHSIZ.Union8.Low=data; + mSPRHSIZ.Union8.High=0; + TRACE_SUSIE2("Poke(SPRHSIZL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRHSIZH&0xff): + mSPRHSIZ.Union8.High=data; + TRACE_SUSIE2("Poke(SPRHSIZH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRVSIZL&0xff): + mSPRVSIZ.Union8.Low=data; + mSPRVSIZ.Union8.High=0; + TRACE_SUSIE2("Poke(SPRVSIZL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRVSIZH&0xff): + mSPRVSIZ.Union8.High=data; + TRACE_SUSIE2("Poke(SPRVSIZH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (STRETCHL&0xff): + mSTRETCH.Union8.Low=data; + mSTRETCH.Union8.High=0; + TRACE_SUSIE2("Poke(STRETCHL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (STRETCHH&0xff): + TRACE_SUSIE2("Poke(STRETCHH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mSTRETCH.Union8.High=data; + break; + case (TILTL&0xff): + mTILT.Union8.Low=data; + mTILT.Union8.High=0; + TRACE_SUSIE2("Poke(TILTL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (TILTH&0xff): + mTILT.Union8.High=data; + TRACE_SUSIE2("Poke(TILTH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRDOFFL&0xff): + TRACE_SUSIE2("Poke(SPRDOFFL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mSPRDOFF.Union8.Low=data; + mSPRDOFF.Union8.High=0; + break; + case (SPRDOFFH&0xff): + TRACE_SUSIE2("Poke(SPRDOFFH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mSPRDOFF.Union8.High=data; + break; + case (SPRVPOSL&0xff): + TRACE_SUSIE2("Poke(SPRVPOSL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mSPRVPOS.Union8.Low=data; + mSPRVPOS.Union8.High=0; + break; + case (SPRVPOSH&0xff): + mSPRVPOS.Union8.High=data; + TRACE_SUSIE2("Poke(SPRVPOSH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (COLLOFFL&0xff): + mCOLLOFF.Union8.Low=data; + mCOLLOFF.Union8.High=0; + TRACE_SUSIE2("Poke(COLLOFFL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (COLLOFFH&0xff): + mCOLLOFF.Union8.High=data; + TRACE_SUSIE2("Poke(COLLOFFH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VSIZACUML&0xff): + mVSIZACUM.Union8.Low=data; + mVSIZACUM.Union8.High=0; + TRACE_SUSIE2("Poke(VSIZACUML,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VSIZACUMH&0xff): + mVSIZACUM.Union8.High=data; + TRACE_SUSIE2("Poke(VSIZACUMH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (HSIZOFFL&0xff): + mHSIZOFF.Union8.Low=data; + mHSIZOFF.Union8.High=0; + TRACE_SUSIE2("Poke(HSIZOFFL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (HSIZOFFH&0xff): + mHSIZOFF.Union8.High=data; + TRACE_SUSIE2("Poke(HSIZOFFH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VSIZOFFL&0xff): + mVSIZOFF.Union8.Low=data; + mVSIZOFF.Union8.High=0; + TRACE_SUSIE2("Poke(VSIZOFFL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (VSIZOFFH&0xff): + mVSIZOFF.Union8.High=data; + TRACE_SUSIE2("Poke(VSIZOFFH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SCBADRL&0xff): + mSCBADR.Union8.Low=data; + mSCBADR.Union8.High=0; + TRACE_SUSIE2("Poke(SCBADRL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SCBADRH&0xff): + mSCBADR.Union8.High=data; + TRACE_SUSIE2("Poke(SCBADRH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (PROCADRL&0xff): + mPROCADR.Union8.Low=data; + mPROCADR.Union8.High=0; + TRACE_SUSIE2("Poke(PROCADRL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (PROCADRH&0xff): + mPROCADR.Union8.High=data; + TRACE_SUSIE2("Poke(PROCADRH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + + case (MATHD&0xff): + TRACE_SUSIE2("Poke(MATHD,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mMATHABCD.Bytes.D=data; +// mMATHABCD.Bytes.C=0; + // The hardware manual says that the sign shouldnt change + // but if I dont do this then stun runner will hang as it + // does the init in the wrong order and if the previous + // calc left a zero there then we'll get a sign error + Poke(MATHC,0); + break; + case (MATHC&0xff): + TRACE_SUSIE2("Poke(MATHC,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mMATHABCD.Bytes.C=data; + // Perform sign conversion if required + if(mSPRSYS_SignedMath) + { + // Account for the math bug that 0x8000 is +ve & 0x0000 is -ve by subracting 1 + if((mMATHABCD.Words.CD-1)&0x8000) + { + uint16 conv; + conv=mMATHABCD.Words.CD^0xffff; + conv++; + mMATHCD_sign=-1; + TRACE_SUSIE2("MATH CD signed conversion complete %04x to %04x",mMATHABCD.Words.CD,conv); + mMATHABCD.Words.CD=conv; + } + else + { + mMATHCD_sign=1; + } + } + break; + case (MATHB&0xff): + TRACE_SUSIE2("Poke(MATHB,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mMATHABCD.Bytes.B=data; + mMATHABCD.Bytes.A=0; + break; + case (MATHA&0xff): + TRACE_SUSIE2("Poke(MATHA,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + mMATHABCD.Bytes.A=data; + // Perform sign conversion if required + if(mSPRSYS_SignedMath) + { + // Account for the math bug that 0x8000 is +ve & 0x0000 is -ve by subracting 1 + if((mMATHABCD.Words.AB-1)&0x8000) + { + uint16 conv; + conv=mMATHABCD.Words.AB^0xffff; + conv++; + mMATHAB_sign=-1; + TRACE_SUSIE2("MATH AB signed conversion complete %04x to %04x",mMATHABCD.Words.AB,conv); + mMATHABCD.Words.AB=conv; + } + else + { + mMATHAB_sign=1; + } + } + DoMathMultiply(); + break; + + case (MATHP&0xff): + mMATHNP.Bytes.P=data; + mMATHNP.Bytes.N=0; + TRACE_SUSIE2("Poke(MATHP,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHN&0xff): + mMATHNP.Bytes.N=data; + TRACE_SUSIE2("Poke(MATHN,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + + case (MATHH&0xff): + mMATHEFGH.Bytes.H=data; + mMATHEFGH.Bytes.G=0; + TRACE_SUSIE2("Poke(MATHH,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHG&0xff): + mMATHEFGH.Bytes.G=data; + TRACE_SUSIE2("Poke(MATHG,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHF&0xff): + mMATHEFGH.Bytes.F=data; + mMATHEFGH.Bytes.E=0; + TRACE_SUSIE2("Poke(MATHF,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHE&0xff): + mMATHEFGH.Bytes.E=data; + TRACE_SUSIE2("Poke(MATHE,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + DoMathDivide(); + break; + + case (MATHM&0xff): + mMATHJKLM.Bytes.M=data; + mMATHJKLM.Bytes.L=0; + mSPRSYS_Mathbit=FALSE; + TRACE_SUSIE2("Poke(MATHM,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHL&0xff): + mMATHJKLM.Bytes.L=data; + TRACE_SUSIE2("Poke(MATHL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHK&0xff): + mMATHJKLM.Bytes.K=data; + mMATHJKLM.Bytes.J=0; + TRACE_SUSIE2("Poke(MATHK,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (MATHJ&0xff): + mMATHJKLM.Bytes.J=data; + TRACE_SUSIE2("Poke(MATHJ,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + + case (SPRCTL0&0xff): + mSPRCTL0_Type=data&0x0007; + mSPRCTL0_Vflip=data&0x0010; + mSPRCTL0_Hflip=data&0x0020; + mSPRCTL0_PixelBits=((data&0x00c0)>>6)+1; + TRACE_SUSIE2("Poke(SPRCTL0,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRCTL1&0xff): + mSPRCTL1_StartLeft=data&0x0001; + mSPRCTL1_StartUp=data&0x0002; + mSPRCTL1_SkipSprite=data&0x0004; + mSPRCTL1_ReloadPalette=data&0x0008; + mSPRCTL1_ReloadDepth=(data&0x0030)>>4; + mSPRCTL1_Sizing=data&0x0040; + mSPRCTL1_Literal=data&0x0080; + TRACE_SUSIE2("Poke(SPRCTL1,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRCOLL&0xff): + mSPRCOLL_Number=data&0x000f; + mSPRCOLL_Collide=data&0x0020; + TRACE_SUSIE2("Poke(SPRCOLL,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRINIT&0xff): + mSPRINIT.Byte=data; + TRACE_SUSIE2("Poke(SPRINIT,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SUZYBUSEN&0xff): + mSUZYBUSEN=data&0x01; + TRACE_SUSIE2("Poke(SUZYBUSEN,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRGO&0xff): + mSPRGO=data&0x01; + mEVERON=data&0x04; + TRACE_SUSIE2("Poke(SPRGO,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (SPRSYS&0xff): + mSPRSYS_StopOnCurrent=data&0x0002; + if(data&0x0004) mSPRSYS_UnsafeAccess=0; + mSPRSYS_LeftHand=data&0x0008; + mSPRSYS_VStretch=data&0x0010; + mSPRSYS_NoCollide=data&0x0020; + mSPRSYS_Accumulate=data&0x0040; + mSPRSYS_SignedMath=data&0x0080; + TRACE_SUSIE2("Poke(SPRSYS,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + +// Cartridge writing ports + + case (RCART0&0xff): + mSystem.Poke_CARTB0(data); + TRACE_SUSIE2("Poke(RCART0,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + case (RCART1&0xff): + mSystem.Poke_CARTB1(data); + TRACE_SUSIE2("Poke(RCART1,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + +// These are not so important, so lets ignore them for the moment + + case (LEDS&0xff): + case (PPORTSTAT&0xff): + case (PPORTDATA&0xff): + case (HOWIE&0xff): + TRACE_SUSIE2("Poke(LEDS/PPORTSTST/PPORTDATA/HOWIE,%02x) at PC=$%04x",data,mSystem.mCpu->GetPC()); + break; + +// Errors on read only register accesses + + case (SUZYHREV&0xff): + case (JOYSTICK&0xff): + case (SWITCHES&0xff): + TRACE_SUSIE3("Poke(%04x,%02x) - Poke to read only register location at PC=%04x",addr,data,mSystem.mCpu->GetPC()); + break; + +// Errors on illegal location accesses + + default: + TRACE_SUSIE3("Poke(%04x,%02x) - Poke to illegal location at PC=%04x",addr,data,mSystem.mCpu->GetPC()); + break; + } +} + +uint8 CSusie::Peek(uint32 addr) +{ + uint8 retval=0; + + switch(addr&0xff) + { + case (TMPADRL&0xff): + retval=mTMPADR.Union8.Low; + TRACE_SUSIE2("Peek(TMPADRL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (TMPADRH&0xff): + retval=mTMPADR.Union8.High; + TRACE_SUSIE2("Peek(TMPADRH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (TILTACUML&0xff): + retval=mTILTACUM.Union8.Low; + TRACE_SUSIE2("Peek(TILTACUML)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (TILTACUMH&0xff): + retval=mTILTACUM.Union8.High; + TRACE_SUSIE2("Peek(TILTACUMH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (HOFFL&0xff): + retval=mHOFF.Union8.Low; + TRACE_SUSIE2("Peek(HOFFL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (HOFFH&0xff): + retval=mHOFF.Union8.High; + TRACE_SUSIE2("Peek(HOFFH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VOFFL&0xff): + retval=mVOFF.Union8.Low; + TRACE_SUSIE2("Peek(VOFFL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VOFFH&0xff): + retval=mVOFF.Union8.High; + TRACE_SUSIE2("Peek(VOFFH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VIDBASL&0xff): + retval=mVIDBAS.Union8.Low; + TRACE_SUSIE2("Peek(VIDBASL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VIDBASH&0xff): + retval=mVIDBAS.Union8.High; + TRACE_SUSIE2("Peek(VIDBASH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (COLLBASL&0xff): + retval=mCOLLBAS.Union8.Low; + TRACE_SUSIE2("Peek(COLLBASL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (COLLBASH&0xff): + retval=mCOLLBAS.Union8.High; + TRACE_SUSIE2("Peek(COLLBASH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VIDADRL&0xff): + retval=mVIDADR.Union8.Low; + TRACE_SUSIE2("Peek(VIDADRL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VIDADRH&0xff): + retval=mVIDADR.Union8.High; + TRACE_SUSIE2("Peek(VIDADRH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (COLLADRL&0xff): + retval=mCOLLADR.Union8.Low; + TRACE_SUSIE2("Peek(COLLADRL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (COLLADRH&0xff): + retval=mCOLLADR.Union8.High; + TRACE_SUSIE2("Peek(COLLADRH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SCBNEXTL&0xff): + retval=mSCBNEXT.Union8.Low; + TRACE_SUSIE2("Peek(SCBNEXTL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SCBNEXTH&0xff): + retval=mSCBNEXT.Union8.High; + TRACE_SUSIE2("Peek(SCBNEXTH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRDLINEL&0xff): + retval=mSPRDLINE.Union8.Low; + TRACE_SUSIE2("Peek(SPRDLINEL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRDLINEH&0xff): + retval=mSPRDLINE.Union8.High; + TRACE_SUSIE2("Peek(SPRDLINEH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (HPOSSTRTL&0xff): + retval=mHPOSSTRT.Union8.Low; + TRACE_SUSIE2("Peek(HPOSSTRTL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (HPOSSTRTH&0xff): + retval=mHPOSSTRT.Union8.High; + TRACE_SUSIE2("Peek(HPOSSTRTH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VPOSSTRTL&0xff): + retval=mVPOSSTRT.Union8.Low; + TRACE_SUSIE2("Peek(VPOSSTRTL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VPOSSTRTH&0xff): + retval=mVPOSSTRT.Union8.High; + TRACE_SUSIE2("Peek(VPOSSTRTH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRHSIZL&0xff): + retval=mSPRHSIZ.Union8.Low; + TRACE_SUSIE2("Peek(SPRHSIZL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRHSIZH&0xff): + retval=mSPRHSIZ.Union8.High; + TRACE_SUSIE2("Peek(SPRHSIZH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRVSIZL&0xff): + retval=mSPRVSIZ.Union8.Low; + TRACE_SUSIE2("Peek(SPRVSIZL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRVSIZH&0xff): + retval=mSPRVSIZ.Union8.High; + TRACE_SUSIE2("Peek(SPRVSIZH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (STRETCHL&0xff): + retval=mSTRETCH.Union8.Low; + TRACE_SUSIE2("Peek(STRETCHL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (STRETCHH&0xff): + retval=mSTRETCH.Union8.High; + TRACE_SUSIE2("Peek(STRETCHH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (TILTL&0xff): + retval=mTILT.Union8.Low; + TRACE_SUSIE2("Peek(TILTL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (TILTH&0xff): + retval=mTILT.Union8.High; + TRACE_SUSIE2("Peek(TILTH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRDOFFL&0xff): + retval=mSPRDOFF.Union8.Low; + TRACE_SUSIE2("Peek(SPRDOFFL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRDOFFH&0xff): + retval=mSPRDOFF.Union8.High; + TRACE_SUSIE2("Peek(SPRDOFFH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRVPOSL&0xff): + retval=mSPRVPOS.Union8.Low; + TRACE_SUSIE2("Peek(SPRVPOSL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SPRVPOSH&0xff): + retval=mSPRVPOS.Union8.High; + TRACE_SUSIE2("Peek(SPRVPOSH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (COLLOFFL&0xff): + retval=mCOLLOFF.Union8.Low; + TRACE_SUSIE2("Peek(COLLOFFL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (COLLOFFH&0xff): + retval=mCOLLOFF.Union8.High; + TRACE_SUSIE2("Peek(COLLOFFH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VSIZACUML&0xff): + retval=mVSIZACUM.Union8.Low; + TRACE_SUSIE2("Peek(VSIZACUML)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VSIZACUMH&0xff): + retval=mVSIZACUM.Union8.High; + TRACE_SUSIE2("Peek(VSIZACUMH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (HSIZOFFL&0xff): + retval=mHSIZOFF.Union8.Low; + TRACE_SUSIE2("Peek(HSIZOFFL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (HSIZOFFH&0xff): + retval=mHSIZOFF.Union8.High; + TRACE_SUSIE2("Peek(HSIZOFFH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VSIZOFFL&0xff): + retval=mVSIZOFF.Union8.Low; + TRACE_SUSIE2("Peek(VSIZOFFL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (VSIZOFFH&0xff): + retval=mVSIZOFF.Union8.High; + TRACE_SUSIE2("Peek(VSIZOFFH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SCBADRL&0xff): + retval=mSCBADR.Union8.Low; + TRACE_SUSIE2("Peek(SCBADRL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (SCBADRH&0xff): + retval=mSCBADR.Union8.High; + TRACE_SUSIE2("Peek(SCBADRH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (PROCADRL&0xff): + retval=mPROCADR.Union8.Low; + TRACE_SUSIE2("Peek(PROCADRL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (PROCADRH&0xff): + retval=mPROCADR.Union8.High; + TRACE_SUSIE2("Peek(PROCADRH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + + case (MATHD&0xff): + retval=mMATHABCD.Bytes.D; + TRACE_SUSIE2("Peek(MATHD)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHC&0xff): + retval=mMATHABCD.Bytes.C; + TRACE_SUSIE2("Peek(MATHC)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHB&0xff): + retval=mMATHABCD.Bytes.B; + TRACE_SUSIE2("Peek(MATHB)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHA&0xff): + retval=mMATHABCD.Bytes.A; + TRACE_SUSIE2("Peek(MATHA)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + + case (MATHP&0xff): + retval=mMATHNP.Bytes.P; + TRACE_SUSIE2("Peek(MATHP)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHN&0xff): + retval=mMATHNP.Bytes.N; + TRACE_SUSIE2("Peek(MATHN)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + + case (MATHH&0xff): + retval=mMATHEFGH.Bytes.H; + TRACE_SUSIE2("Peek(MATHH)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHG&0xff): + retval=mMATHEFGH.Bytes.G; + TRACE_SUSIE2("Peek(MATHG)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHF&0xff): + retval=mMATHEFGH.Bytes.F; + TRACE_SUSIE2("Peek(MATHF)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHE&0xff): + retval=mMATHEFGH.Bytes.E; + TRACE_SUSIE2("Peek(MATHE)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + + case (MATHM&0xff): + retval=mMATHJKLM.Bytes.M; + TRACE_SUSIE2("Peek(MATHM)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHL&0xff): + retval=mMATHJKLM.Bytes.L; + TRACE_SUSIE2("Peek(MATHL)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHK&0xff): + retval=mMATHJKLM.Bytes.K; + TRACE_SUSIE2("Peek(MATHK)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (MATHJ&0xff): + retval=mMATHJKLM.Bytes.J; + TRACE_SUSIE2("Peek(MATHJ)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + + case (SUZYHREV&0xff): + retval=0x01; + TRACE_SUSIE2("Peek(SUZYHREV)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + + case (SPRSYS&0xff): + retval=0x0000; + // retval+=(mSPRSYS_Status)?0x0001:0x0000; + retval+= (gSuzieDoneTime)?0x0001:0x0000; + retval+=(mSPRSYS_StopOnCurrent)?0x0002:0x0000; + retval+=(mSPRSYS_UnsafeAccess)?0x0004:0x0000; + retval+=(mSPRSYS_LeftHand)?0x0008:0x0000; + retval+=(mSPRSYS_VStretch)?0x0010:0x0000; + retval+=(mSPRSYS_LastCarry)?0x0020:0x0000; + retval+=(mSPRSYS_Mathbit)?0x0040:0x0000; + retval+=(mSPRSYS_MathInProgress)?0x0080:0x0000; + TRACE_SUSIE2("Peek(SPRSYS)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + + case (JOYSTICK&0xff): + if(mSPRSYS_LeftHand) + { + retval= mJOYSTICK.Byte; + } + else + { + TJOYSTICK Modified=mJOYSTICK; + Modified.Bits.Left=mJOYSTICK.Bits.Right; + Modified.Bits.Right=mJOYSTICK.Bits.Left; + Modified.Bits.Down=mJOYSTICK.Bits.Up; + Modified.Bits.Up=mJOYSTICK.Bits.Down; + retval= Modified.Byte; + } +// TRACE_SUSIE2("Peek(JOYSTICK)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + + + case (SWITCHES&0xff): + retval=mSWITCHES.Byte; +// TRACE_SUSIE2("Peek(SWITCHES)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + +// Cartridge reading ports + + case (RCART0&0xff): + retval=mSystem.Peek_CARTB0(); +// TRACE_SUSIE2("Peek(RCART0)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + case (RCART1&0xff): + retval=mSystem.Peek_CARTB1(); +// TRACE_SUSIE2("Peek(RCART1)=$%02x at PC=$%04x",retval,mSystem.mCpu->GetPC()); + return retval; + break; + +// These are no so important so lets ignore them for the moment + + case (LEDS&0xff): + case (PPORTSTAT&0xff): + case (PPORTDATA&0xff): + case (HOWIE&0xff): + TRACE_SUSIE1("Peek(LEDS/PPORTSTAT/PPORTDATA) at PC=$%04x",mSystem.mCpu->GetPC()); + break; + +// Errors on write only register accesses + + case (SPRCTL0&0xff): + case (SPRCTL1&0xff): + case (SPRCOLL&0xff): + case (SPRINIT&0xff): + case (SUZYBUSEN&0xff): + case (SPRGO&0xff): + TRACE_SUSIE2("Peek(%04x) - Peek from write only register location at PC=$%04x",addr,mSystem.mCpu->GetPC()); + break; + +// Errors on illegal location accesses + + default: + TRACE_SUSIE2("Peek(%04x) - Peek from illegal location at PC=$%04x",addr,mSystem.mCpu->GetPC()); + break; + } + + return 0xff; +} + +void CSusie::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT SuzieRegs[] = + { + SFVAR(mTMPADR), + SFVAR(mTILTACUM), + SFVAR(mHOFF), + SFVAR(mVOFF), + SFVAR(mVIDBAS), + SFVAR(mCOLLBAS), + SFVAR(mVIDADR), + SFVAR(mCOLLADR), + SFVAR(mSCBNEXT), + SFVAR(mSPRDLINE), + SFVAR(mHPOSSTRT), + SFVAR(mVPOSSTRT), + SFVAR(mSPRHSIZ), + SFVAR(mSPRVSIZ), + SFVAR(mSTRETCH), + SFVAR(mTILT), + SFVAR(mSPRDOFF), + SFVAR(mSPRVPOS), + SFVAR(mCOLLOFF), + SFVAR(mVSIZACUM), + SFVAR(mHSIZACUM), + SFVAR(mHSIZOFF), + SFVAR(mVSIZOFF), + SFVAR(mSCBADR), + SFVAR(mPROCADR), + + SFVAR(mMATHABCD), + SFVAR(mMATHEFGH), + SFVAR(mMATHJKLM), + SFVAR(mMATHNP), + + SFVAR(mSPRCTL0_Type), + SFVAR(mSPRCTL0_Vflip), + SFVAR(mSPRCTL0_Hflip), + SFVAR(mSPRCTL0_PixelBits), + SFVAR(mSPRCTL1_StartLeft), + SFVAR(mSPRCTL1_StartUp), + SFVAR(mSPRCTL1_SkipSprite), + SFVAR(mSPRCTL1_ReloadPalette), + SFVAR(mSPRCTL1_ReloadDepth), + SFVAR(mSPRCTL1_Sizing), + SFVAR(mSPRCTL1_Literal), + + SFVAR(mSPRCOLL_Number), + SFVAR(mSPRCOLL_Collide), + + SFVAR(mSPRSYS_StopOnCurrent), + SFVAR(mSPRSYS_LeftHand), + SFVAR(mSPRSYS_VStretch), + SFVAR(mSPRSYS_NoCollide), + SFVAR(mSPRSYS_Accumulate), + SFVAR(mSPRSYS_SignedMath), + SFVAR(mSPRSYS_Status), + SFVAR(mSPRSYS_UnsafeAccess), + SFVAR(mSPRSYS_LastCarry), + SFVAR(mSPRSYS_Mathbit), + SFVAR(mSPRSYS_MathInProgress), + + SFVAR(mSUZYBUSEN), + + SFVAR(mSPRINIT), + SFVAR(mSPRGO), + SFVAR(mEVERON), + + SFARRAYN(mPenIndex, 16, "mPenIndex"), + + SFVAR(mLineType), + SFVAR(mLineShiftRegCount), + SFVAR(mLineShiftReg), + SFVAR(mLineRepeatCount), + SFVAR(mLinePixel), + SFVAR(mLinePacketBitsLeft), + + SFVAR(mCollision), + + SFVAR(mLineBaseAddress), + SFVAR(mLineCollisionAddress), + + SFVAR(mJOYSTICK), + SFVAR(mSWITCHES), + SFVAR(hquadoff), + SFVAR(vquadoff), + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, SuzieRegs, "SUZY"); + + if(load) + { + + } +} diff --git a/Mednafen/mednafen/lynx/susie.h b/Mednafen/mednafen/lynx/susie.h new file mode 100644 index 0000000000..fd9339efee --- /dev/null +++ b/Mednafen/mednafen/lynx/susie.h @@ -0,0 +1,445 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Susie object header file // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the interface definition for the Suzy class // +// which provides math and sprite support to the emulator // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef SUSIE_H +#define SUSIE_H + +#ifdef TRACE_SUSIE + +#define TRACE_SUSIE0(msg) _RPT1(_CRT_WARN,"CSusie::"msg" (Time=%012d)\n",gSystemCycleCount) +#define TRACE_SUSIE1(msg,arg1) _RPT2(_CRT_WARN,"CSusie::"msg" (Time=%012d)\n",arg1,gSystemCycleCount) +#define TRACE_SUSIE2(msg,arg1,arg2) _RPT3(_CRT_WARN,"CSusie::"msg" (Time=%012d)\n",arg1,arg2,gSystemCycleCount) +#define TRACE_SUSIE3(msg,arg1,arg2,arg3) _RPT4(_CRT_WARN,"CSusie::"msg" (Time=%012d)\n",arg1,arg2,arg3,gSystemCycleCount) + +#else + +#define TRACE_SUSIE0(msg) +#define TRACE_SUSIE1(msg,arg1) +#define TRACE_SUSIE2(msg,arg1,arg2) +#define TRACE_SUSIE3(msg,arg1,arg2,arg3) + +#endif + +class CSystem; + +#define SUSIE_START 0xfc00 +#define SUSIE_SIZE 0x100 + +#define SCREEN_WIDTH 160 +#define SCREEN_HEIGHT 102 + +#define LINE_END 0x80 + +// +// Define button values +// + +#define BUTTON_A 0x0001 +#define BUTTON_B 0x0002 +#define BUTTON_OPT2 0x0004 +#define BUTTON_OPT1 0x0008 +#define BUTTON_LEFT 0x0010 +#define BUTTON_RIGHT 0x0020 +#define BUTTON_UP 0x0040 +#define BUTTON_DOWN 0x0080 +#define BUTTON_PAUSE 0x0100 + + +enum {line_error=0,line_abs_literal,line_literal,line_packed}; +enum {math_finished=0,math_divide,math_multiply,math_init_divide,math_init_multiply}; + +enum {sprite_background_shadow=0, + sprite_background_noncollide, + sprite_boundary_shadow, + sprite_boundary, + sprite_normal, + sprite_noncollide, + sprite_xor_shadow, + sprite_shadow}; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 Fc1:1; + uint8 Fc2:1; + uint8 Fc3:1; + uint8 reserved:1; + uint8 Ac1:1; + uint8 Ac2:1; + uint8 Ac3:1; + uint8 Ac4:1; +#else + uint8 Ac4:1; + uint8 Ac3:1; + uint8 Ac2:1; + uint8 Ac1:1; + uint8 reserved:1; + uint8 Fc3:1; + uint8 Fc2:1; + uint8 Fc1:1; +#endif + }Bits; + uint8 Byte; + }; +}TSPRINIT; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 Up:1; + uint8 Down:1; + uint8 Left:1; + uint8 Right:1; + uint8 Option1:1; + uint8 Option2:1; + uint8 Inside:1; + uint8 Outside:1; +#else + uint8 Outside:1; + uint8 Inside:1; + uint8 Option2:1; + uint8 Option1:1; + uint8 Right:1; + uint8 Left:1; + uint8 Down:1; + uint8 Up:1; +#endif + }Bits; + uint8 Byte; + }; +}TJOYSTICK; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 spare:5; + uint8 Cart1IO:1; + uint8 Cart0IO:1; + uint8 Pause:1; +#else + uint8 Pause:1; + uint8 Cart0IO:1; + uint8 Cart1IO:1; + uint8 spare:5; +#endif + }Bits; + uint8 Byte; + }; +}TSWITCHES; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 A; + uint8 B; + uint8 C; + uint8 D; +#else + uint8 D; + uint8 C; + uint8 B; + uint8 A; +#endif + }Bytes; + struct + { +#ifdef MSB_FIRST + uint16 AB; + uint16 CD; +#else + uint16 CD; + uint16 AB; +#endif + }Words; + uint32 Long; + }; +}TMATHABCD; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 E; + uint8 F; + uint8 G; + uint8 H; +#else + uint8 H; + uint8 G; + uint8 F; + uint8 E; +#endif + }Bytes; + struct + { +#ifdef MSB_FIRST + uint16 EF; + uint16 GH; +#else + uint16 GH; + uint16 EF; +#endif + }Words; + uint32 Long; + }; +}TMATHEFGH; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 J; + uint8 K; + uint8 L; + uint8 M; +#else + uint8 M; + uint8 L; + uint8 K; + uint8 J; +#endif + }Bytes; + struct + { +#ifdef MSB_FIRST + uint16 JK; + uint16 LM; +#else + uint16 LM; + uint16 JK; +#endif + }Words; + uint32 Long; + }; +}TMATHJKLM; + +typedef struct +{ + union + { + struct + { +#ifdef MSB_FIRST + uint8 xx2; + uint8 xx1; + uint8 N; + uint8 P; +#else + uint8 P; + uint8 N; + uint8 xx1; + uint8 xx2; +#endif + }Bytes; + struct + { +#ifdef MSB_FIRST + uint16 xx1; + uint16 NP; +#else + uint16 NP; + uint16 xx1; +#endif + }Words; + uint32 Long; + }; +}TMATHNP; + + +class CSusie : public CLynxBase +{ + public: + CSusie(CSystem& parent) MDFN_COLD; + ~CSusie() MDFN_COLD; + + void Reset(void) MDFN_COLD; + + uint8 Peek(uint32 addr); + void Poke(uint32 addr,uint8 data); + uint32 ReadCycle(void) {return 9;}; + uint32 WriteCycle(void) {return 5;}; + uint32 ObjectSize(void) {return SUSIE_SIZE;}; + + void SetButtonData(uint32 data) {mJOYSTICK.Byte=(uint8)data;mSWITCHES.Byte=(uint8)(data>>8);}; + uint32 GetButtonData(void) {return mJOYSTICK.Byte+(mSWITCHES.Byte<<8);}; + + uint32 PaintSprites(void); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + private: + void DoMathDivide(void); + void DoMathMultiply(void); + uint32 LineInit(uint32 voff); + uint32 LineGetPixel(void); + uint32 LineGetBits(uint32 bits); + + void ProcessPixel(uint32 hoff,uint32 pixel); + void WritePixel(uint32 hoff,uint32 pixel); + uint32 ReadPixel(uint32 hoff); + void WriteCollision(uint32 hoff,uint32 pixel); + uint32 ReadCollision(uint32 hoff); + + private: + CSystem& mSystem; + + Uuint16 mTMPADR; // ENG + Uuint16 mTILTACUM; // ENG + Uuint16 mHOFF; // CPU + Uuint16 mVOFF; // CPU + Uuint16 mVIDBAS; // CPU + Uuint16 mCOLLBAS; // CPU + Uuint16 mVIDADR; // ENG + Uuint16 mCOLLADR; // ENG + Uuint16 mSCBNEXT; // SCB + Uuint16 mSPRDLINE; // SCB + Uuint16 mHPOSSTRT; // SCB + Uuint16 mVPOSSTRT; // SCB + Uuint16 mSPRHSIZ; // SCB + Uuint16 mSPRVSIZ; // SCB + Uuint16 mSTRETCH; // ENG + Uuint16 mTILT; // ENG + Uuint16 mSPRDOFF; // ENG + Uuint16 mSPRVPOS; // ENG + Uuint16 mCOLLOFF; // CPU + Uuint16 mVSIZACUM; // ENG + Uuint16 mHSIZACUM; // K.s creation + Uuint16 mHSIZOFF; // CPU + Uuint16 mVSIZOFF; // CPU + Uuint16 mSCBADR; // ENG + Uuint16 mPROCADR; // ENG + + TMATHABCD mMATHABCD; // ENG + TMATHEFGH mMATHEFGH; // ENG + TMATHJKLM mMATHJKLM; // ENG + TMATHNP mMATHNP; // ENG + int mMATHAB_sign; + int mMATHCD_sign; + int mMATHEFGH_sign; + + int mSPRCTL0_Type; // SCB + int mSPRCTL0_Vflip; + int mSPRCTL0_Hflip; + int mSPRCTL0_PixelBits; + + int mSPRCTL1_StartLeft; // SCB + int mSPRCTL1_StartUp; + int mSPRCTL1_SkipSprite; + int mSPRCTL1_ReloadPalette; + int mSPRCTL1_ReloadDepth; + int mSPRCTL1_Sizing; + int mSPRCTL1_Literal; + + int mSPRCOLL_Number; //CPU + int mSPRCOLL_Collide; + + int mSPRSYS_StopOnCurrent; //CPU + int mSPRSYS_LeftHand; + int mSPRSYS_VStretch; + int mSPRSYS_NoCollide; + int mSPRSYS_Accumulate; + int mSPRSYS_SignedMath; + int mSPRSYS_Status; + int mSPRSYS_UnsafeAccess; + int mSPRSYS_LastCarry; + int mSPRSYS_Mathbit; + int mSPRSYS_MathInProgress; + + uint32 mSUZYBUSEN; // CPU + + TSPRINIT mSPRINIT; // CPU + + uint32 mSPRGO; // CPU + int mEVERON; + + uint8 mPenIndex[16]; // SCB + + // Line rendering related variables + + uint32 mLineType; + uint32 mLineShiftRegCount; + uint32 mLineShiftReg; + uint32 mLineRepeatCount; + uint32 mLinePixel; + uint32 mLinePacketBitsLeft; + + int mCollision; + + uint8 *mRamPointer; + + uint32 mLineBaseAddress; + uint32 mLineCollisionAddress; + + int hquadoff, vquadoff; + + // Joystick switches + + TJOYSTICK mJOYSTICK; + TSWITCHES mSWITCHES; +}; + +#endif + diff --git a/Mednafen/mednafen/lynx/sysbase.h b/Mednafen/mednafen/lynx/sysbase.h new file mode 100644 index 0000000000..571125bd2f --- /dev/null +++ b/Mednafen/mednafen/lynx/sysbase.h @@ -0,0 +1,73 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// Systembase object class definition // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the interface definition for the systembase // +// class that is required to get around cross dependencies between // +// cpu/mikie/system classes // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef SYSBASE_H +#define SYSBASE_H + + +class CSystemBase +{ + // Function members + + public: + virtual ~CSystemBase() {}; + + public: + virtual void Reset(void)=0; + virtual void Poke_CPU(uint32 addr,uint8 data)=0; + virtual uint8 Peek_CPU(uint32 addr)=0; + virtual void PokeW_CPU(uint32 addr,uint16 data)=0; + virtual uint16 PeekW_CPU(uint32 addr)=0; + + virtual void Poke_RAM(uint32 addr,uint8 data)=0; + virtual uint8 Peek_RAM(uint32 addr)=0; + virtual void PokeW_RAM(uint32 addr,uint16 data)=0; + virtual uint16 PeekW_RAM(uint32 addr)=0; + + virtual uint8* GetRamPointer(void)=0; + +}; + +#endif diff --git a/Mednafen/mednafen/lynx/system.cpp b/Mednafen/mednafen/lynx/system.cpp new file mode 100644 index 0000000000..252ffef1c9 --- /dev/null +++ b/Mednafen/mednafen/lynx/system.cpp @@ -0,0 +1,485 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// System object class // +////////////////////////////////////////////////////////////////////////////// +// // +// This class provides the glue to bind of of the emulation objects // +// together via peek/poke handlers and pass thru interfaces to lower // +// objects, all control of the emulator is done via this class. Update() // +// does most of the work and each call emulates one CPU instruction and // +// updates all of the relevant hardware if required. It must be remembered // +// that if that instruction involves setting SPRGO then, it will cause a // +// sprite painting operation and then a corresponding update of all of the // +// hardware which will usually involve recursive calls to Update, see // +// Mikey SPRGO code for more details. // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#define SYSTEM_CPP + +//#include +//#define TRACE_SYSTEM + +#include "system.h" + +#include +#include +#include + +CSystem::CSystem(MDFNFILE* fp) +{ + mFileType = HANDY_FILETYPE_LNX; + + char clip[11]; + fp->read(clip, 11); + fp->seek(0, SEEK_SET); + clip[4]=0; + clip[10]=0; + + if(!strcmp(&clip[6],"BS93")) + mFileType = HANDY_FILETYPE_HOMEBREW; + else if(!strcmp(&clip[0],"LYNX")) + mFileType = HANDY_FILETYPE_LNX; + else + { + throw MDFN_Error(0, _("File format is unknown to module \"%s\"."), MDFNGameInfo->shortname); + } + + MDFNMP_Init(65536, 1); + + // Create the system objects that we'll use + + // Attempt to load the cartridge errors caught above here... + + mRom.reset(new CRom(MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, "lynxboot.img").c_str())); + + // An exception from this will be caught by the level above + + switch(mFileType) + { + default: abort(); + break; + + case HANDY_FILETYPE_LNX: + mCart.reset(new CCart(fp->stream())); + mRam.reset(new CRam(NULL)); + break; + + case HANDY_FILETYPE_HOMEBREW: + { + mCart.reset(new CCart(NULL)); + mRam.reset(new CRam(fp->stream())); + } + break; + } + + // These can generate exceptions + + mMikie.reset(new CMikie(*this)); + mSusie.reset(new CSusie(*this)); + +// Instantiate the memory map handler + + mMemMap.reset(new CMemMap(*this)); + +// Now the handlers are set we can instantiate the CPU as is will use handlers on reset + + mCpu.reset(new C65C02(*this)); + +// Now init is complete do a reset, this will cause many things to be reset twice +// but what the hell, who cares, I don't..... + + Reset(); +} + +CSystem::~CSystem() +{ + +} + +void CSystem::Reset(void) +{ + mMikie->startTS -= gSystemCycleCount; + gSystemCycleCount=0; + gNextTimerEvent=0; + gCPUBootAddress=0; + gSystemIRQ=FALSE; + gSystemNMI=FALSE; + gSystemCPUSleep=FALSE; + gSystemHalt=FALSE; + gSuzieDoneTime = 0; + + mMemMap->Reset(); + mCart->Reset(); + mRom->Reset(); + mRam->Reset(); + mMikie->Reset(); + mSusie->Reset(); + mCpu->Reset(); + + // Homebrew hashup + + if(mFileType==HANDY_FILETYPE_HOMEBREW) + { + mMikie->PresetForHomebrew(); + + C6502_REGS regs; + mCpu->GetRegs(regs); + regs.PC=(uint16)gCPUBootAddress; + mCpu->SetRegs(regs); + } +} + +// Somewhat of a hack to make sure undrawn lines are black. +bool LynxLineDrawn[256]; + +static CSystem *lynxie = NULL; +extern MDFNGI EmulatedLynx; + +static bool TestMagic(MDFNFILE *fp) +{ + uint8 data[((size_t)CCart::HEADER_RAW_SIZE > (size_t)CRam::HEADER_RAW_SIZE) ? (size_t)CCart::HEADER_RAW_SIZE : (size_t)CRam::HEADER_RAW_SIZE]; + uint64 rc; + + rc = fp->read(data, sizeof(data), false); + + if(rc >= CCart::HEADER_RAW_SIZE && CCart::TestMagic(data, sizeof(data))) + return true; + + if(rc >= CRam::HEADER_RAW_SIZE && CRam::TestMagic(data, sizeof(data))) + return true; + + return false; +} + +static void Cleanup(void) +{ + if(lynxie) + { + delete lynxie; + lynxie = NULL; + } +} + +static void Load(MDFNFILE *fp) +{ + try + { + lynxie = new CSystem(fp); + + switch(lynxie->CartGetRotate()) + { + case CART_ROTATE_LEFT: + MDFNGameInfo->rotated = MDFN_ROTATE270; + break; + + case CART_ROTATE_RIGHT: + MDFNGameInfo->rotated = MDFN_ROTATE90; + break; + } + + MDFNGameInfo->GameSetMD5Valid = false; + if(lynxie->mRam->InfoRAMSize) + { + memcpy(MDFNGameInfo->MD5, lynxie->mRam->MD5, 16); + MDFN_printf(_("RAM: %u bytes\n"), lynxie->mRam->InfoRAMSize); + MDFN_printf(_("RAM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + } + else + { + memcpy(MDFNGameInfo->MD5, lynxie->mCart->MD5, 16); + MDFN_printf(_("ROM: %dKiB\n"), (lynxie->mCart->InfoROMSize + 1023) / 1024); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + } + + MDFNGameInfo->fps = (uint32)(59.8 * 65536 * 256); + + if(MDFN_GetSettingB("lynx.lowpass")) + { + lynxie->mMikie->miksynth.treble_eq(-35); + } + else + { + lynxie->mMikie->miksynth.treble_eq(0); + } + } + catch(std::exception &e) + { + Cleanup(); + + throw; + } +} + +static void CloseGame(void) +{ + Cleanup(); +} + +static uint8 *chee; +static void Emulate(EmulateSpecStruct *espec) +{ + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.w = 160; + espec->DisplayRect.h = 102; + + if(espec->VideoFormatChanged) + lynxie->DisplaySetAttributes(espec->surface->format, espec->CustomPalette); + + if(espec->SoundFormatChanged) + { + lynxie->mMikie->mikbuf.set_sample_rate(espec->SoundRate ? espec->SoundRate : 44100, 60); + lynxie->mMikie->mikbuf.clock_rate((long int)(16000000 / 4)); + lynxie->mMikie->mikbuf.bass_freq(60); + lynxie->mMikie->miksynth.volume(0.50); + } + + uint16 butt_data = chee[0] | (chee[1] << 8); + + lynxie->SetButtonData(butt_data); + + MDFNMP_ApplyPeriodicCheats(); + + memset(LynxLineDrawn, 0, sizeof(LynxLineDrawn[0]) * 102); + + lynxie->mMikie->mpSkipFrame = espec->skip; + lynxie->mMikie->mpDisplayCurrent = espec->surface; + lynxie->mMikie->mpDisplayCurrentLine = 0; + lynxie->mMikie->startTS = gSystemCycleCount; + + while(lynxie->mMikie->mpDisplayCurrent && (gSystemCycleCount - lynxie->mMikie->startTS) < 700000) + { + lynxie->Update(); +// printf("%d ", gSystemCycleCount - lynxie->mMikie->startTS); + } + + { + // FIXME, we should integrate this into mikie.* + uint32 color_black = espec->CustomPalette ? espec->surface->MakeColor(espec->CustomPalette[0], espec->CustomPalette[1], espec->CustomPalette[2]) : espec->surface->MakeColor(30, 30, 30); + + for(int y = 0; y < 102; y++) + { + if(espec->surface->format.bpp == 16) + { + uint16 *row = espec->surface->pixels16 + y * espec->surface->pitchinpix; + + if(!LynxLineDrawn[y]) + { + for(int x = 0; x < 160; x++) + row[x] = color_black; + } + } + else + { + uint32 *row = espec->surface->pixels + y * espec->surface->pitchinpix; + + if(!LynxLineDrawn[y]) + { + for(int x = 0; x < 160; x++) + row[x] = color_black; + } + } + } + } + + espec->MasterCycles = gSystemCycleCount - lynxie->mMikie->startTS; + + if(espec->SoundBuf) + { + lynxie->mMikie->mikbuf.end_frame((gSystemCycleCount - lynxie->mMikie->startTS) >> 2); + espec->SoundBufSize = lynxie->mMikie->mikbuf.read_samples(espec->SoundBuf, espec->SoundBufMaxSize) / 2; // divide by nr audio chn + } + else + espec->SoundBufSize = 0; +} + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + chee = (uint8 *)ptr; +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT SystemRegs[] = + { + SFVAR(gSuzieDoneTime), + SFVAR(gSystemCycleCount), + SFVAR(gNextTimerEvent), + SFVAR(gCPUBootAddress), + SFVAR(gSystemIRQ), + SFVAR(gSystemNMI), + SFVAR(gSystemCPUSleep), + SFVAR(gSystemHalt), + SFARRAYN(lynxie->GetRamPointer(), RAM_SIZE, "RAM"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, SystemRegs, "SYST"); + lynxie->mSusie->StateAction(sm, load, data_only); + lynxie->mMemMap->StateAction(sm, load, data_only); + lynxie->mCart->StateAction(sm, load, data_only); + lynxie->mMikie->StateAction(sm, load, data_only); + lynxie->mCpu->StateAction(sm, load, data_only); +} + +static void SetLayerEnableMask(uint64 mask) +{ + + +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: + case MDFN_MSC_RESET: lynxie->Reset(); break; + } +} + +static MDFNSetting LynxSettings[] = +{ + { "lynx.rotateinput", MDFNSF_NOFLAGS, gettext_noop("Virtually rotate D-pad along with screen."), NULL, MDFNST_BOOL, "1" }, + { "lynx.lowpass", MDFNSF_CAT_SOUND, gettext_noop("Enable sound output lowpass filter."), NULL, MDFNST_BOOL, "1" }, + { NULL } +}; + +static const IDIISG IDII = +{ + { "a", "A (outer)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "b", "B (inner)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "option_2", "Option 2 (lower)", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "option_1", "Option 1 (upper)", 4, IDIT_BUTTON_CAN_RAPID, NULL }, + + + { "left", "LEFT ←", /*VIRTB_DPAD0_L,*/ 2, IDIT_BUTTON, "right", { "up", "right", "down" } }, + + { "right", "RIGHT →", /*VIRTB_DPAD0_R,*/ 3, IDIT_BUTTON, "left", { "down", "left", "up" } }, + + { "up", "UP ↑", /*VIRTB_DPAD0_U,*/ 0, IDIT_BUTTON, "down", { "right", "down", "left" } }, + + { "down", "DOWN ↓", /*VIRTB_DPAD0_D,*/ 1, IDIT_BUTTON, "up", { "left", "up", "right" } }, + + { "pause", "PAUSE", 6, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + IDII, + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo } +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".lnx", gettext_noop("Atari Lynx ROM Image") }, + { NULL, NULL } +}; + +static const CustomPalette_Spec CPInfo[] = +{ + { gettext_noop("Atari Lynx 12-bit RGB"), NULL, { 4096, 0 } }, + + { NULL, NULL }, +}; + +MDFNGI EmulatedLynx = +{ + "lynx", + "Atari Lynx", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + SetLayerEnableMask, + NULL, + + NULL, + NULL, + + CPInfo, + 1 << 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + LynxSettings, + MDFN_MASTERCLOCK_FIXED(16000000), + 0, + + false, // Multires possible? + + 160, // lcm_width + 102, // lcm_height + NULL, // Dummy + + + 160, // Nominal width + 102, // Nominal height + + 160, // Framebuffer width + 102, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/lynx/system.h b/Mednafen/mednafen/lynx/system.h new file mode 100644 index 0000000000..81768f0acf --- /dev/null +++ b/Mednafen/mednafen/lynx/system.h @@ -0,0 +1,231 @@ +// +// Copyright (c) 2004 K. Wilkins +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from +// the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// + +////////////////////////////////////////////////////////////////////////////// +// Handy - An Atari Lynx Emulator // +// Copyright (c) 1996,1997 // +// K. Wilkins // +////////////////////////////////////////////////////////////////////////////// +// System object header file // +////////////////////////////////////////////////////////////////////////////// +// // +// This header file provides the interface definition and inline code for // +// the system object, this object if what binds together all of the Handy // +// hardware enmulation objects, its the glue that holds the system together // +// // +// K. Wilkins // +// August 1997 // +// // +////////////////////////////////////////////////////////////////////////////// +// Revision History: // +// ----------------- // +// // +// 01Aug1997 KW Document header added & class documented. // +// // +////////////////////////////////////////////////////////////////////////////// + +#ifndef SYSTEM_H +#define SYSTEM_H + +#include "machine.h" + +#include +#include + +#define HANDY_SYSTEM_FREQ 16000000 +#define HANDY_TIMER_FREQ 20 + +#define HANDY_FILETYPE_LNX 0 +#define HANDY_FILETYPE_HOMEBREW 1 +#define HANDY_FILETYPE_SNAPSHOT 2 +#define HANDY_FILETYPE_ILLEGAL 3 + +#define HANDY_SCREEN_WIDTH 160 +#define HANDY_SCREEN_HEIGHT 102 +// +// Define the global variable list +// + +#ifdef SYSTEM_CPP + uint32 gSuzieDoneTime = 0; + uint32 gSystemCycleCount=0; + uint32 gNextTimerEvent=0; + uint32 gCPUBootAddress=0; + uint32 gSystemIRQ=FALSE; + uint32 gSystemNMI=FALSE; + uint32 gSystemCPUSleep=FALSE; + uint32 gSystemHalt=FALSE; +#else + extern uint32 gSystemCycleCount; + extern uint32 gSuzieDoneTime; + extern uint32 gNextTimerEvent; + extern uint32 gCPUBootAddress; + extern uint32 gSystemIRQ; + extern uint32 gSystemNMI; + extern uint32 gSystemCPUSleep; + extern uint32 gSystemHalt; +#endif + +// +// Define the interfaces before we start pulling in the classes +// as many classes look for articles from the interfaces to +// allow compilation + +#include "sysbase.h" + +class CSystem; + +// +// Now pull in the parts that build the system +// +#include "lynxbase.h" +#include "ram.h" +#include "rom.h" +#include "memmap.h" +#include "cart.h" +#include "susie.h" +#include "mikie.h" +#include "c65c02.h" + +#define TOP_START 0xfc00 +#define TOP_MASK 0x03ff +#define TOP_SIZE 0x400 +#define SYSTEM_SIZE 65536 + +class CSystem : public CSystemBase +{ + public: + CSystem(MDFNFILE* fp) MDFN_COLD; + ~CSystem() MDFN_COLD; + + public: + void Reset(void) MDFN_COLD; + + inline void Update(void) + { + // + // Only update if there is a predicted timer event + // + if(gSystemCycleCount>=gNextTimerEvent) + { + mMikie->Update(); + } + // + // Step the processor through 1 instruction + // + mCpu->Update(); + + // + // If the CPU is asleep then skip to the next timer event + // + if(gSystemCPUSleep) + { + gSystemCycleCount=gNextTimerEvent; + } + } + + // + // We MUST have separate CPU & RAM peek & poke handlers as all CPU accesses must + // go thru the address generator at $FFF9 + // + // BUT, Mikie video refresh & Susie see the whole system as RAM + // + // Complete and utter wankers, its taken me 1 week to find the 2 lines + // in all the documentation that mention this fact, the mother of all + // bugs has been found and FIXED....... + + // + // CPU + // + inline void Poke_CPU(uint32 addr, uint8 data) { mMemoryHandlers[addr]->Poke(addr,data);}; + inline uint8 Peek_CPU(uint32 addr) { return mMemoryHandlers[addr]->Peek(addr);}; + inline void PokeW_CPU(uint32 addr,uint16 data) { mMemoryHandlers[addr]->Poke(addr,data&0xff);addr++;mMemoryHandlers[addr]->Poke(addr,data>>8);}; + inline uint16 PeekW_CPU(uint32 addr) {return ((mMemoryHandlers[addr]->Peek(addr))+(mMemoryHandlers[addr]->Peek(addr+1)<<8));}; + + // + // RAM + // + inline void Poke_RAM(uint32 addr, uint8 data) { mRam->Poke(addr,data);}; + inline uint8 Peek_RAM(uint32 addr) { return mRam->Peek(addr);}; + inline void PokeW_RAM(uint32 addr,uint16 data) { mRam->Poke(addr,data&0xff);addr++;mRam->Poke(addr,data>>8);}; + inline uint16 PeekW_RAM(uint32 addr) {return ((mRam->Peek(addr))+(mRam->Peek(addr+1)<<8));}; + +// High level cart access for debug etc + + inline void Poke_CART(uint32 addr, uint8 data) {mCart->Poke(addr,data);}; + inline uint8 Peek_CART(uint32 addr) {return mCart->Peek(addr);}; + inline void CartBank(EMMODE bank) {mCart->BankSelect(bank);}; + inline uint32 CartSize(void) {return mCart->ObjectSize();}; + inline const char* CartGetName(void) { return mCart->CartGetName();}; + inline const char* CartGetManufacturer(void) { return mCart->CartGetManufacturer();}; + inline uint32 CartGetRotate(void) {return mCart->CartGetRotate();}; + +// Low level cart access for Suzy, Mikey + + inline void Poke_CARTB0(uint8 data) {mCart->Poke0(data);}; + inline void Poke_CARTB1(uint8 data) {mCart->Poke1(data);}; + inline uint8 Peek_CARTB0(void) {return mCart->Peek0();} + inline uint8 Peek_CARTB1(void) {return mCart->Peek1();} + inline void CartAddressStrobe(bool strobe) {mCart->CartAddressStrobe(strobe);}; + inline void CartAddressData(bool data) {mCart->CartAddressData(data);}; + +// Low level CPU access + + void SetRegs(C6502_REGS ®s) {mCpu->SetRegs(regs);}; + void GetRegs(C6502_REGS ®s) {mCpu->GetRegs(regs);}; + +// Mikey system interfacing + + void DisplaySetAttributes(const MDFN_PixelFormat &format, const uint8* CustomPalette) { mMikie->DisplaySetAttributes(format, CustomPalette); }; + + void ComLynxCable(int status) { mMikie->ComLynxCable(status); }; + void ComLynxRxData(int data) { mMikie->ComLynxRxData(data); }; + void ComLynxTxCallback(void (*function)(int data,uint32 objref),uint32 objref) { mMikie->ComLynxTxCallback(function,objref); }; + +// Suzy system interfacing + + uint32 PaintSprites(void) {return mSusie->PaintSprites();}; + +// Miscellaneous + + void SetButtonData(uint32 data) {mSusie->SetButtonData(data);}; + uint32 GetButtonData(void) {return mSusie->GetButtonData();}; + void SetCycleBreakpoint(uint32 breakpoint) {mCycleCountBreakpoint=breakpoint;}; + uint8* GetRamPointer(void) {return mRam->GetRamPointer();}; + + public: + uint32 mCycleCountBreakpoint; + CLynxBase *mMemoryHandlers[SYSTEM_SIZE]; + std::unique_ptr mCart; + std::unique_ptr mRom; + std::unique_ptr mMemMap; + std::unique_ptr mRam; + std::unique_ptr mCpu; + std::unique_ptr mMikie; + std::unique_ptr mSusie; + + uint32 mFileType; +}; + +extern bool LynxLineDrawn[256]; + +#endif diff --git a/Mednafen/mednafen/math_ops.h b/Mednafen/mednafen/math_ops.h new file mode 100644 index 0000000000..e134e8f2f2 --- /dev/null +++ b/Mednafen/mednafen/math_ops.h @@ -0,0 +1,206 @@ +#ifndef __MDFN_MATH_OPS_H +#define __MDFN_MATH_OPS_H + +// +// Result is defined for all possible inputs(including 0). +// +static INLINE unsigned MDFN_lzcount32(uint32 v) +{ + #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) + return v ? __builtin_clz(v) : 32; + #elif defined(_MSC_VER) + unsigned long idx; + + if(!v) + return 32; + + _BitScanReverse(&idx, v); + + return 31 - idx; + #else + unsigned ret = 0; + + if(!v) + return(32); + + if(!(v & 0xFFFF0000)) + { + v <<= 16; + ret += 16; + } + + if(!(v & 0xFF000000)) + { + v <<= 8; + ret += 8; + } + + if(!(v & 0xF0000000)) + { + v <<= 4; + ret += 4; + } + + if(!(v & 0xC0000000)) + { + v <<= 2; + ret += 2; + } + + if(!(v & 0x80000000)) + { + v <<= 1; + ret += 1; + } + + return(ret); + #endif +} + +// +// Result is defined for all possible inputs(including 0). +// +static INLINE unsigned MDFN_lzcount64(uint64 v) +{ + #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) + return v ? __builtin_clzll(v) : 64; + #elif defined(_MSC_VER) && defined(_WIN64) + unsigned long idx; + + if(!v) + return 64; + + _BitScanReverse64(&idx, v); + + return 63 - idx; + #else + unsigned ret = 0; + + if(!(v & 0xFFFFFFFFFFFFFFFFULL)) + return(64); + + if(!(v & 0xFFFFFFFF00000000ULL)) + { + v <<= 32; + ret += 32; + } + + if(!(v & 0xFFFF000000000000ULL)) + { + v <<= 16; + ret += 16; + } + + if(!(v & 0xFF00000000000000ULL)) + { + v <<= 8; + ret += 8; + } + + if(!(v & 0xF000000000000000ULL)) + { + v <<= 4; + ret += 4; + } + + if(!(v & 0xC000000000000000ULL)) + { + v <<= 2; + ret += 2; + } + + if(!(v & 0x8000000000000000ULL)) + { + v <<= 1; + ret += 1; + } + + return(ret); + #endif +} + + +// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 +// Rounds up to the nearest power of 2. +static INLINE uint64 round_up_pow2(uint64 v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v |= v >> 32; + v++; + + v += (v == 0); + + return(v); +} + +static INLINE uint32 uilog2(uint32 v) +{ + // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn + + static const uint32 MultiplyDeBruijnBitPosition[32] = + { + 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 + }; + + v |= v >> 1; // first round down to one less than a power of 2 + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + + return MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27]; +} + +// Some compilers' optimizers and some platforms might fubar the generated code from these macros, +// so some tests are run in...tests.cpp +#define sign_8_to_s16(_value) ((int16)(int8)(_value)) +#define sign_9_to_s16(_value) (((int16)((unsigned int)(_value) << 7)) >> 7) +#define sign_10_to_s16(_value) (((int16)((uint32)(_value) << 6)) >> 6) +#define sign_11_to_s16(_value) (((int16)((uint32)(_value) << 5)) >> 5) +#define sign_12_to_s16(_value) (((int16)((uint32)(_value) << 4)) >> 4) +#define sign_13_to_s16(_value) (((int16)((uint32)(_value) << 3)) >> 3) +#define sign_14_to_s16(_value) (((int16)((uint32)(_value) << 2)) >> 2) +#define sign_15_to_s16(_value) (((int16)((uint32)(_value) << 1)) >> 1) + +// This obviously won't convert higher-than-32 bit numbers to signed 32-bit ;) +// Also, this shouldn't be used for 8-bit and 16-bit signed numbers, since you can +// convert those faster with typecasts... +#define sign_x_to_s32(_bits, _value) (((int32)((uint32)(_value) << (32 - _bits))) >> (32 - _bits)) + +static INLINE int32 clamp_to_u8(int32 i) +{ + if(i & 0xFFFFFF00) + i = (((~i) >> 30) & 0xFF); + + return(i); +} + +static INLINE int32 clamp_to_u16(int32 i) +{ + if(i & 0xFFFF0000) + i = (((~i) >> 31) & 0xFFFF); + + return(i); +} + +template static INLINE void clamp(T *val, U minimum, V maximum) +{ + if(*val < minimum) + { + //printf("Warning: clamping to minimum(%d)\n", (int)minimum); + *val = minimum; + } + if(*val > maximum) + { + //printf("Warning: clamping to maximum(%d)\n", (int)maximum); + *val = maximum; + } +} + +#endif diff --git a/Mednafen/mednafen/md/Makefile.am b/Mednafen/mednafen/md/Makefile.am new file mode 100644 index 0000000000..d2b5326b67 --- /dev/null +++ b/Mednafen/mednafen/md/Makefile.am @@ -0,0 +1,18 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmd.a + +libmd_a_SOURCES = vdp.cpp genesis.cpp genio.cpp header.cpp mem68k.cpp membnk.cpp memvdp.cpp memz80.cpp sound.cpp system.cpp + +libmd_a_SOURCES += cart/cart.cpp cart/map_eeprom.cpp cart/map_realtec.cpp cart/map_ssf2.cpp cart/map_ff.cpp cart/map_rom.cpp cart/map_sbb.cpp cart/map_yase.cpp cart/map_rmx3.cpp cart/map_sram.cpp cart/map_svp.cpp +# cart/ssp16.c + +libmd_a_SOURCES += input/multitap.cpp input/4way.cpp input/megamouse.cpp input/gamepad.cpp + +libmd_a_SOURCES += cd/cd.cpp cd/timer.cpp cd/interrupt.cpp cd/pcm.cpp cd/cdc_cdd.cpp + +if WANT_DEBUGGER +libmd_a_SOURCES += debug.cpp +endif diff --git a/Mednafen/mednafen/md/Makefile.in b/Mednafen/mednafen/md/Makefile.in new file mode 100644 index 0000000000..a1e1f4e955 --- /dev/null +++ b/Mednafen/mednafen/md/Makefile.in @@ -0,0 +1,802 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = debug.cpp +subdir = src/md +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmd_a_AR = $(AR) $(ARFLAGS) +libmd_a_LIBADD = +am__libmd_a_SOURCES_DIST = vdp.cpp genesis.cpp genio.cpp header.cpp \ + mem68k.cpp membnk.cpp memvdp.cpp memz80.cpp sound.cpp \ + system.cpp cart/cart.cpp cart/map_eeprom.cpp \ + cart/map_realtec.cpp cart/map_ssf2.cpp cart/map_ff.cpp \ + cart/map_rom.cpp cart/map_sbb.cpp cart/map_yase.cpp \ + cart/map_rmx3.cpp cart/map_sram.cpp cart/map_svp.cpp \ + input/multitap.cpp input/4way.cpp input/megamouse.cpp \ + input/gamepad.cpp cd/cd.cpp cd/timer.cpp cd/interrupt.cpp \ + cd/pcm.cpp cd/cdc_cdd.cpp debug.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@WANT_DEBUGGER_TRUE@am__objects_1 = debug.$(OBJEXT) +am_libmd_a_OBJECTS = vdp.$(OBJEXT) genesis.$(OBJEXT) genio.$(OBJEXT) \ + header.$(OBJEXT) mem68k.$(OBJEXT) membnk.$(OBJEXT) \ + memvdp.$(OBJEXT) memz80.$(OBJEXT) sound.$(OBJEXT) \ + system.$(OBJEXT) cart/cart.$(OBJEXT) cart/map_eeprom.$(OBJEXT) \ + cart/map_realtec.$(OBJEXT) cart/map_ssf2.$(OBJEXT) \ + cart/map_ff.$(OBJEXT) cart/map_rom.$(OBJEXT) \ + cart/map_sbb.$(OBJEXT) cart/map_yase.$(OBJEXT) \ + cart/map_rmx3.$(OBJEXT) cart/map_sram.$(OBJEXT) \ + cart/map_svp.$(OBJEXT) input/multitap.$(OBJEXT) \ + input/4way.$(OBJEXT) input/megamouse.$(OBJEXT) \ + input/gamepad.$(OBJEXT) cd/cd.$(OBJEXT) cd/timer.$(OBJEXT) \ + cd/interrupt.$(OBJEXT) cd/pcm.$(OBJEXT) cd/cdc_cdd.$(OBJEXT) \ + $(am__objects_1) +libmd_a_OBJECTS = $(am_libmd_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmd_a_SOURCES) +DIST_SOURCES = $(am__libmd_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmd.a +# cart/ssp16.c +libmd_a_SOURCES = vdp.cpp genesis.cpp genio.cpp header.cpp mem68k.cpp \ + membnk.cpp memvdp.cpp memz80.cpp sound.cpp system.cpp \ + cart/cart.cpp cart/map_eeprom.cpp cart/map_realtec.cpp \ + cart/map_ssf2.cpp cart/map_ff.cpp cart/map_rom.cpp \ + cart/map_sbb.cpp cart/map_yase.cpp cart/map_rmx3.cpp \ + cart/map_sram.cpp cart/map_svp.cpp input/multitap.cpp \ + input/4way.cpp input/megamouse.cpp input/gamepad.cpp cd/cd.cpp \ + cd/timer.cpp cd/interrupt.cpp cd/pcm.cpp cd/cdc_cdd.cpp \ + $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/md/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/md/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +cart/$(am__dirstamp): + @$(MKDIR_P) cart + @: > cart/$(am__dirstamp) +cart/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) cart/$(DEPDIR) + @: > cart/$(DEPDIR)/$(am__dirstamp) +cart/cart.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_eeprom.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_realtec.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_ssf2.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_ff.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_rom.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_sbb.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_yase.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_rmx3.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_sram.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +cart/map_svp.$(OBJEXT): cart/$(am__dirstamp) \ + cart/$(DEPDIR)/$(am__dirstamp) +input/$(am__dirstamp): + @$(MKDIR_P) input + @: > input/$(am__dirstamp) +input/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) input/$(DEPDIR) + @: > input/$(DEPDIR)/$(am__dirstamp) +input/multitap.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/4way.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/megamouse.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/gamepad.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +cd/$(am__dirstamp): + @$(MKDIR_P) cd + @: > cd/$(am__dirstamp) +cd/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) cd/$(DEPDIR) + @: > cd/$(DEPDIR)/$(am__dirstamp) +cd/cd.$(OBJEXT): cd/$(am__dirstamp) cd/$(DEPDIR)/$(am__dirstamp) +cd/timer.$(OBJEXT): cd/$(am__dirstamp) cd/$(DEPDIR)/$(am__dirstamp) +cd/interrupt.$(OBJEXT): cd/$(am__dirstamp) \ + cd/$(DEPDIR)/$(am__dirstamp) +cd/pcm.$(OBJEXT): cd/$(am__dirstamp) cd/$(DEPDIR)/$(am__dirstamp) +cd/cdc_cdd.$(OBJEXT): cd/$(am__dirstamp) cd/$(DEPDIR)/$(am__dirstamp) + +libmd.a: $(libmd_a_OBJECTS) $(libmd_a_DEPENDENCIES) $(EXTRA_libmd_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmd.a + $(AM_V_AR)$(libmd_a_AR) libmd.a $(libmd_a_OBJECTS) $(libmd_a_LIBADD) + $(AM_V_at)$(RANLIB) libmd.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f cart/*.$(OBJEXT) + -rm -f cd/*.$(OBJEXT) + -rm -f input/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genesis.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem68k.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membnk.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memvdp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memz80.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vdp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/cart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_eeprom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_ff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_realtec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_rmx3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_rom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_sbb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_sram.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_ssf2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_svp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cart/$(DEPDIR)/map_yase.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cd/$(DEPDIR)/cd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cd/$(DEPDIR)/cdc_cdd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cd/$(DEPDIR)/interrupt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cd/$(DEPDIR)/pcm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@cd/$(DEPDIR)/timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/4way.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/gamepad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/megamouse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/multitap.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f cart/$(DEPDIR)/$(am__dirstamp) + -rm -f cart/$(am__dirstamp) + -rm -f cd/$(DEPDIR)/$(am__dirstamp) + -rm -f cd/$(am__dirstamp) + -rm -f input/$(DEPDIR)/$(am__dirstamp) + -rm -f input/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) cart/$(DEPDIR) cd/$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) cart/$(DEPDIR) cd/$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/md/cart/cart.cpp b/Mednafen/mednafen/md/cart/cart.cpp new file mode 100644 index 0000000000..820e8e95c9 --- /dev/null +++ b/Mednafen/mednafen/md/cart/cart.cpp @@ -0,0 +1,546 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" + +#include "map_rom.h" +#include "map_sram.h" +#include "map_eeprom.h" +#include "map_svp.h" + +#include "map_realtec.h" +#include "map_ssf2.h" + +#include "map_ff.h" +#include "map_rmx3.h" +#include "map_sbb.h" +#include "map_yase.h" + +#include "../header.h" +#include +#include +#include + +#include + +static MD_Cart_Type *cart_hardware = NULL; +static uint8 *cart_rom = NULL; +static uint32 Cart_ROM_Size; + +void MDCart_Write8(uint32 A, uint8 V) +{ + cart_hardware->Write8(A, V); +} + +void MDCart_Write16(uint32 A, uint16 V) +{ + cart_hardware->Write16(A, V); +} + +uint8 MDCart_Read8(uint32 A) +{ + return(cart_hardware->Read8(A)); +} + +uint16 MDCart_Read16(uint32 A) +{ + return(cart_hardware->Read16(A)); +} + +void MDCart_Reset(void) +{ + cart_hardware->Reset(); +} + +// MD_Cart_Type* (*MapperMake)(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); +// MD_Make_Cart_Type_REALTEC +// MD_Make_Cart_Type_SSF2 +// Final Fantasy +// MD_Make_Cart_Type_FF +// MD_Make_Cart_Type_RMX3 +// MD_Make_Cart_Type_SBB +// MD_Make_Cart_Type_YaSe + +typedef struct +{ + // Set any field to 0(or -1 for signed fields) to ignore it + const char *id; + + const uint64 md5; + const uint64 header_md5; + + const char *mapper; + + // Overrides for bad headers + const uint32 sram_type; + const int32 sram_start; + const int32 sram_end; + + const uint32 region_support; +} game_db_t; + +static game_db_t GamesDB[] = +{ + // Balloon Boy + { NULL, 0, 0xa9509f505d00db6eULL, "REALTEC", 0, 0, 0, 0 }, + + // Earth Defend + { NULL, 0, 0xcf6afbf45299a800ULL, "REALTEC", 0, 0, 0, 0 }, + + // Whac a Critter + { NULL, 0, 0x5499d14fcef32f60ULL, "REALTEC", 0, 0, 0, 0 }, + + // Super Street Fighter II + { "T-12056 -00", 0, 0, "SSF2", 0, 0, 0, 0 }, + { "T-12043 -00", 0, 0, "SSF2", 0, 0, 0, 0 }, + +// "Conquering the world III 0x3fff" +// "Xin Qi Gai Wing Zi", " +// 0xFFFF, 0x400000, 0x40ffff +// "Rings of Power", 0x200000 0x203fff + + // Final Fantasy + { NULL, 0, 0x7c0e11c426d65105ULL, "FF", 0, 0, 0, 0 }, + { NULL, 0, 0xe144baf931c8b61eULL, "FF", 0, 0, 0, 0 }, + + // Rockman X3 + { NULL, 0, 0x1d1add6f2a64fb99ULL, "RMX3", 0, 0, 0, 0 }, + + // Super Bubble Bobble + { NULL, 0, 0x8eff5373b653111eULL, "SBB", 0, 0, 0, 0 }, + + // Ya-Se Chuan Shuo + { NULL, 0, 0x2786df4902ef8856ULL, "YaSe", 0, 0, 0, 0 }, + + // Virtua Racing + { "MK-1229 -00", 0, 0, "SVP", 0, 0, 0, 0 }, + + + /*************************************** + // + // SRAM-related header corrections + // + ***************************************/ + + // Chaoji Dafuweng + { NULL, 0, 0x13639e87230c85aaULL, NULL, 0x5241f820, 0x200001, 0x200fff, 0 }, + + // Psy-O-Blade + { "T-26013 -00", 0, 0, NULL, 0x5241f820, 0x200000, 0x203fff, 0 }, + + // Sonic and Knuckles and Sonic 3 + { NULL, 0xde0ac4e17a844d10ULL, 0, NULL, 0x5241f820, 0x200000, 0x2003ff, 0 }, + + // Starflight + { "T-50216 -00", 0, 0, NULL, 0x5241f820, 0x200000, 0x203fff, 0 }, + { "T-50216 -01", 0, 0, NULL, 0x5241f820, 0x200000, 0x203fff, 0 }, + + // Taiwan Tycoon(TODO) + + // Top Shooter + { NULL, 0, 0x31fea3093b231863ULL, NULL, 0x5241f820, 0x200001, 0x203fff, 0 }, + + // World Pro Baseball 94 + { NULL, 0, 0xe7bb31787f189ebeULL, NULL, 0x5241f820, 0x200001, 0x20ffff, 0 }, + + + /*************************************** + // + // EEPROM Carts + // + ***************************************/ + + // + // Acclaim + // + // NBA Jam (UE) + {"T-081326 00", 0, 0, "Acclaim_24C02_Old", 0, 0, 0, 0 }, + + // NBA Jam (J) + {"T-81033 00", 0, 0, "Acclaim_24C02_Old", 0, 0, 0, 0 }, + + // NFL Quarterback Club + {"T-081276 00", 0, 0, "Acclaim_24C02", 0, 0, 0, 0 }, + + // NBA Jam TE + {"T-81406 -00", 0, 0, "Acclaim_24C04", 0, 0, 0, 0 }, + + // NFL Quarterback Club '96 + {"T-081586-00", 0, 0, "Acclaim_24C16", 0, 0, 0, 0 }, + + // College Slam + {"T-81576 -00", 0, 0, "Acclaim_24C65", 0, 0, 0, 0 }, + + // Frank Thomas Big Hurt Baseball + {"T-81476 -00", 0, 0, "Acclaim_24C65", 0, 0, 0, 0 }, + + // + // EA + // + // Rings of Power + {"T-50176 -00", 0, 0, "EA_24C01", 0, 0, 0, 0 }, + + // NHLPA Hockey 93 (UE) + {"T-50396 -00", 0, 0, "EA_24C01", 0, 0, 0, 0 }, + + // John Madden Football 93 + {"T-50446 -00", 0, 0, "EA_24C01", 0, 0, 0, 0 }, + + // John Madden Football 93 (Championship Edition) + {"T-50516 -00", 0, 0, "EA_24C01", 0, 0, 0, 0 }, + + // Bill Walsh College Football + {"T-50606 -00", 0, 0, "EA_24C01", 0, 0, 0, 0 }, + + + + // + // Sega + // + // Megaman - The Wily Wars + {"T-12046 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Rockman Mega World (J) + {"T-12053 -00", 0, 0x969a9e19a5850e7cULL, "Sega_24C01", 0, 0, 0, 0 }, // Hash necessary due to hacked RAM-using version floating around. + + // Evander 'Real Deal' Holyfield's Boxing + {"MK-1215 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Greatest Heavyweights of the Ring (U) + {"MK-1228 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Greatest Heavyweights of the Ring (J) + {"G-5538 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Greatest Heavyweights of the Ring (E) + {"PR-1993 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, // Confirm correct product code. + + // Wonderboy in Monster World + {"G-4060 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Sports Talk Baseball + {"00001211-00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Honoo no Toukyuuji Dodge Danpei + {"_00004076-00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Ninja Burai Densetsu + {"G-4524 -00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + // Game Toshokan + {"00054503-00", 0, 0, "Sega_24C01", 0, 0, 0, 0 }, + + + // + // Codemasters + // + // Brian Lara Cricket + {"T-120106-00", 0, 0, "Codemasters_24C08", 0, 0, 0, 0 }, + {"T-120106-50", 0, 0, "Codemasters_24C08", 0, 0, 0, 0 }, + + // Micro Machines Military + { NULL, 0, 0x34253755ee0eed41ULL, "Codemasters_24C08", 0, 0, 0, 0 }, + + // Micro Machines Military (bad) + { NULL, 0, 0x3241b7da6ce42fecULL, "Codemasters_24C08", 0, 0, 0, 0 }, + + // Micro Machines 2 - Turbo Tournament (E) + {"T-120096-50", 0, 0, "Codemasters_24C16", 0, 0, 0, 0 }, + + // Micro Machines Turbo Tournament 96 + {NULL, 0, 0xe672e84fed6ce270ULL, "Codemasters_24C16", 0, 0, 0, 0 }, + + // Micro Machines Turbo Tournament 96 (bad) + {NULL, 0, 0x290afe3cd27be26cULL, "Codemasters_24C16", 0, 0, 0, 0 }, + + // Brian Lara Cricket 96, Shane Warne Cricket + {"T-120146-50", 0, 0, "Codemasters_24C65", 0, 0, 0, 0 }, + // + // End EEPROM carts + // + + /* + ** Header region corrections + */ + // Gods (Europe) + { "T-119036-50", 0, 0, NULL, 0, 0, 0, REGIONMASK_OVERSEAS_PAL }, +/* + REGIONMASK_JAPAN_NTSC = 1, + REGIONMASK_JAPAN_PAL = 2, + REGIONMASK_OVERSEAS_NTSC = 4, + REGIONMASK_OVERSEAS_PAL = 8 + + REGIONMASK_JAPAN_NTSC +*/ +}; + +typedef struct +{ + const char *boardname; + MD_Cart_Type *(*MapperMake)(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, + const uint32 iparam, const char *sparam); + const uint32 iparam; + const char *sparam; +} BoardHandler_t; + +static BoardHandler_t BoardHandlers[] = +{ + { "ROM", MD_Make_Cart_Type_ROM, 0, NULL }, + { "SRAM", MD_Make_Cart_Type_SRAM, 0, NULL }, + + { "SVP", MD_Make_Cart_Type_SVP, 0, NULL }, + + { "REALTEC", MD_Make_Cart_Type_REALTEC, 0, NULL }, + { "SSF2", MD_Make_Cart_Type_SSF2, 0, NULL }, + { "FF", MD_Make_Cart_Type_FF, 0, NULL }, + { "RMX3", MD_Make_Cart_Type_RMX3, 0, NULL }, + { "SBB", MD_Make_Cart_Type_SBB, 0, NULL }, + { "YaSe", MD_Make_Cart_Type_YaSe, 0, NULL }, + + { "Acclaim_24C02_Old", MD_Make_Cart_Type_EEPROM, EEP_ACCLAIM_24C02_OLD, NULL }, + { "Acclaim_24C02", MD_Make_Cart_Type_EEPROM, EEP_ACCLAIM_24C02, NULL }, + { "Acclaim_24C04", MD_Make_Cart_Type_EEPROM, EEP_ACCLAIM_24C04, NULL }, + { "Acclaim_24C16", MD_Make_Cart_Type_EEPROM, EEP_ACCLAIM_24C16, NULL }, + { "Acclaim_24C65", MD_Make_Cart_Type_EEPROM, EEP_ACCLAIM_24C65, NULL }, + + { "EA_24C01", MD_Make_Cart_Type_EEPROM, EEP_EA_24C01, NULL }, + + { "Sega_24C01", MD_Make_Cart_Type_EEPROM, EEP_SEGA_24C01, NULL }, + + { "Codemasters_24C08", MD_Make_Cart_Type_EEPROM, EEP_CM_24C08, NULL }, + { "Codemasters_24C16", MD_Make_Cart_Type_EEPROM, EEP_CM_24C16, NULL }, + { "Codemasters_24C65", MD_Make_Cart_Type_EEPROM, EEP_CM_24C65, NULL }, + { NULL, NULL, 0, NULL }, +}; + +bool MDCart_TestMagic(MDFNFILE *fp) +{ + if(!strcmp(fp->ext, "gen") || !strcmp(fp->ext, "md")) + return true; + + uint8 data[512]; + + if(fp->read(data, 512, false) != 512) + return false; + + if(!memcmp(data + 0x100, "SEGA MEGA DRIVE", 15) || !memcmp(data + 0x100, "SEGA GENESIS", 12) || !memcmp(data + 0x100, "SEGA 32X", 8)) + return true; + + if((!memcmp(data + 0x100, "SEGA", 4) || !memcmp(data + 0x100, " SEGA", 5)) && !strcmp(fp->ext, "bin")) + return true; + + return false; +} + +static void Cleanup(void) +{ + if(cart_hardware) + { + delete cart_hardware; + cart_hardware = NULL; + } + + if(cart_rom) + { + MDFN_free(cart_rom); + cart_rom = NULL; + } +} + +void MDCart_Load(md_game_info *ginfo, MDFNFILE *fp) +{ + try + { + const char *mapper = NULL; + const uint64 fp_in_size = fp->size(); + + if(fp_in_size < 0x200) + throw MDFN_Error(0, _("ROM image is too small.")); + + if(fp_in_size > 1024 * 1024 * 128) + throw MDFN_Error(0, _("ROM image is too large.")); + + Cart_ROM_Size = fp_in_size; + cart_rom = (uint8 *)MDFN_calloc_T(1, Cart_ROM_Size, _("Cart ROM")); + fp->read(cart_rom, Cart_ROM_Size); + + MD_ReadSegaHeader(cart_rom + 0x100, ginfo); + ginfo->rom_size = Cart_ROM_Size; + + md5_context md5; + md5.starts(); + md5.update(cart_rom, Cart_ROM_Size); + md5.finish(ginfo->md5); + + ginfo->crc32 = crc32(0, cart_rom, Cart_ROM_Size); + + md5.starts(); + md5.update(cart_rom + 0x100, 0x100); + md5.finish(ginfo->info_header_md5); + + ginfo->checksum_real = 0; + for(uint32 i = 0x200; i < Cart_ROM_Size; i += 2) + { + ginfo->checksum_real += cart_rom[i + 0] << 8; + ginfo->checksum_real += cart_rom[i + 1] << 0; + } + + // Rockman MegaWorld: 5241e840 + // Sonic 3: 5241f820 + + uint32 sram_type = MDFN_de32msb(&cart_rom[0x1B0]); + uint32 sram_start = MDFN_de32msb(&cart_rom[0x1B4]); + uint32 sram_end = MDFN_de32msb(&cart_rom[0x1B8]); + + { + uint64 hmd5_partial = 0; + uint64 md5_partial = 0; + + for(int i = 0; i < 8; i++) + { + hmd5_partial |= (uint64)ginfo->info_header_md5[15 - i] << (8 * i); + md5_partial |= (uint64)ginfo->md5[15 - i] << (8 * i); + } + //printf("Real: 0x%016llxULL Header: 0x%016llxULL\n", (unsigned long long)md5_partial, (unsigned long long)hmd5_partial); + + for(unsigned int i = 0; i < sizeof(GamesDB) / sizeof(game_db_t); i++) + { + bool found = true; + + if(GamesDB[i].header_md5 && GamesDB[i].header_md5 != hmd5_partial) + found = false; + + if(GamesDB[i].md5 && GamesDB[i].md5 != md5_partial) + found = false; + + if(GamesDB[i].id && strcmp(GamesDB[i].id, ginfo->product_code)) + found = false; + + if(found) + { + if(GamesDB[i].mapper) + mapper = GamesDB[i].mapper; + + if(GamesDB[i].sram_type != ~0U) + sram_type = GamesDB[i].sram_type; + if(GamesDB[i].sram_start > 0) + sram_start = GamesDB[i].sram_start; + if(GamesDB[i].sram_end > 0) + sram_end = GamesDB[i].sram_end; + + if(GamesDB[i].region_support > 0) + ginfo->region_support = GamesDB[i].region_support; + + break; + } + } + } + + if(sram_type == 0x5241f820 && sram_start == 0x20202020) + sram_type = 0x20202020; + + ginfo->sram_type = sram_type; + ginfo->sram_start = sram_start; + ginfo->sram_end = sram_end; + + if(!mapper) + { + if(sram_type == 0x5241f820) + mapper = "SRAM"; + else if(sram_type == 0x5241e840) + mapper = "Sega_24C01"; + else + mapper = "ROM"; + } + + { + const BoardHandler_t *bh = BoardHandlers; + bool BoardFound = FALSE; + + MDFN_printf(_("Mapper: %s\n"), mapper); + MDFN_printf(_("SRAM Type: 0x%08x\n"), sram_type); + MDFN_printf(_("SRAM Start: 0x%08x\n"), sram_start); + MDFN_printf(_("SRAM End: 0x%08x\n"), sram_end); + while(bh->boardname) + { + if(!strcasecmp(bh->boardname, mapper)) + { + cart_hardware = bh->MapperMake(ginfo, cart_rom, Cart_ROM_Size, bh->iparam, bh->sparam); + BoardFound = TRUE; + break; + } + bh++; + } + if(!BoardFound) + { + throw MDFN_Error(0, _("Handler for mapper/board \"%s\" not found!\n"), mapper); + } + } + + //MD_Cart_Type* (*MapperMake)(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) = NULL; + //cart_hardware = MapperMake(ginfo, cart_rom, Cart_ROM_Size); + } + catch(...) + { + Cleanup(); + throw; + } +} + +void MDCart_LoadNV(void) +{ + if(cart_hardware->GetNVMemorySize()) + { + try + { + uint8 buf[cart_hardware->GetNVMemorySize()]; + std::unique_ptr sp = MDFN_AmbigGZOpenHelper(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav").c_str(), std::vector({ sizeof(buf) })); + + sp->read(buf, sizeof(buf)); + cart_hardware->WriteNVMemory(buf); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } +} + +void MDCart_SaveNV(void) +{ + if(cart_hardware->GetNVMemorySize()) + { + uint8 buf[cart_hardware->GetNVMemorySize()]; + + cart_hardware->ReadNVMemory(buf); + + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), buf, sizeof(buf), true); + } +} + +void MDCart_Kill(void) +{ + Cleanup(); +} + +int MDCart_StateAction(StateMem *sm, int load, int data_only) +{ + return(cart_hardware->StateAction(sm, load, data_only, "CARTBOARD")); +} + diff --git a/Mednafen/mednafen/md/cart/cart.h b/Mednafen/mednafen/md/cart/cart.h new file mode 100644 index 0000000000..da6620bee3 --- /dev/null +++ b/Mednafen/mednafen/md/cart/cart.h @@ -0,0 +1,82 @@ +#ifndef __MDFN_MD_CART_H +#define __MDFN_MD_CART_H + +#include "../header.h" + +void MDCart_Write8(uint32 address, uint8 value); +void MDCart_Write16(uint32 address, uint16 value); +uint8 MDCart_Read8(uint32 address); +uint16 MDCart_Read16(uint32 address); + +void MDCart_Reset(void); + +void MDCart_Load(md_game_info *ginfo, MDFNFILE *fp); +bool MDCart_TestMagic(MDFNFILE *fp); +void MDCart_LoadNV(void); +void MDCart_SaveNV(void); +void MDCart_Kill(void); + +int MDCart_StateAction(StateMem *sm, int load, int data_only); + +class MD_Cart_Type +{ + public: + MD_Cart_Type() + { + + } + MD_Cart_Type(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) + { + + } + virtual ~MD_Cart_Type() + { + + } + + // Hard reset + virtual void Reset(void) + { + + } + + virtual void Write8(uint32 A, uint8 V) + { + } + + virtual void Write16(uint32 A, uint16 V) + { + } + + virtual uint8 Read8(uint32 A) + { + return(0xFF); + } + + virtual uint16 Read16(uint32 A) + { + return(0xFF); + } + + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) + { + return(1); + } + + // In bytes + virtual uint32 GetNVMemorySize(void) + { + return(0); + } + + virtual void ReadNVMemory(uint8 *buffer) + { + } + + virtual void WriteNVMemory(const uint8 *buffer) + { + } +}; + + +#endif diff --git a/Mednafen/mednafen/md/cart/map_eeprom.cpp b/Mednafen/mednafen/md/cart/map_eeprom.cpp new file mode 100644 index 0000000000..fb0d528e9f --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_eeprom.cpp @@ -0,0 +1,641 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright (C) 2007, 2008, 2009 EkeEke + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + Genesis Plus GX EEPROM emulation modified 2011 for usage in Mednafen +*/ + +#include "../shared.h" +#include "cart.h" +#include "map_eeprom.h" + +typedef enum +{ + STAND_BY = 0, + WAIT_STOP, + GET_SLAVE_ADR, + GET_WORD_ADR_7BITS, + GET_WORD_ADR_HIGH, + GET_WORD_ADR_LOW, + WRITE_DATA, + READ_DATA, + +} T_EEPROM_STATE; + +/* this defines the type of EEPROM inside the game cartridge as Backup RAM + * + * Here are some notes from 8BitWizard (http://www.spritesmind.net/_GenDev/forum): + * + * Mode 1 (7-bit) - the chip takes a single byte with a 7-bit memory address and a R/W bit (24C01) + * Mode 2 (8-bit) - the chip takes a 7-bit device address and R/W bit followed by an 8-bit memory address; + * the device address may contain up to three more memory address bits (24C01 - 24C16). + * You can also string eight 24C01, four 24C02, two 24C08, or various combinations, set their address config lines correctly, + * and the result appears exactly the same as a 24C16 + * Mode 3 (16-bit) - the chip takes a 7-bit device address and R/W bit followed by a 16-bit memory address (24C32 and larger) + * + * Also, while most 24Cxx are addressed at 200000-2FFFFF, I have found two different ways of mapping the control lines. + * EA uses SDA on D7 (read/write) and SCL on D6 (write only), and I have found boards using different mapping (I think Accolade) + * which uses D1-read=SDA, D0-write=SDA, D1-write=SCL. Accolade also has a custom-chip mapper which may even use a third method. + */ + +typedef struct +{ + uint8 address_bits; /* number of bits needed to address memory: 7, 8 or 16 */ + uint16 size_mask; /* depends on the max size of the memory (in bytes) */ + uint16 pagewrite_mask; /* depends on the maximal number of bytes that can be written in a single write cycle */ + uint32 sda_in_adr; /* 68000 memory address mapped to SDA_IN */ + uint32 sda_out_adr; /* 68000 memory address mapped to SDA_OUT */ + uint32 scl_adr; /* 68000 memory address mapped to SCL */ + uint8 sda_in_bit; /* bit offset for SDA_IN */ + uint8 sda_out_bit; /* bit offset for SDA_OUT */ + uint8 scl_bit; /* bit offset for SCL */ + +} T_EEPROM_TYPE; + +typedef struct +{ + int board_type; + T_EEPROM_TYPE type; +} EEPROM_Config; + +static const EEPROM_Config database[EEP_TOTAL] = +{ + /* ACCLAIM mappers */ + /* 24C02 (old mapper) */ + { EEP_ACCLAIM_24C02_OLD,{8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200001, 0, 1, 1}}, + + /* 24C02 */ + { EEP_ACCLAIM_24C02, {8, 0xFF, 0xFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, + + /* 24C04 */ + { EEP_ACCLAIM_24C04, {8, 0x1FF, 0x1FF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, + + /* 24C16 */ + { EEP_ACCLAIM_24C16, {8, 0x7FF, 0x7FF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, + + /* 24C65 */ + {EEP_ACCLAIM_24C65, {16, 0x1FFF, 0x1FFF, 0x200001, 0x200001, 0x200000, 0, 0, 0}}, + + /* EA mapper (24C01 only) */ + { EEP_EA_24C01, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 7, 7, 6}}, + + /* SEGA mapper (24C01 only) */ + { EEP_SEGA_24C01, {7, 0x7F, 0x7F, 0x200001, 0x200001, 0x200001, 0, 0, 1}}, + + /* CODEMASTERS mapper */ + + /* 24C08 */ + { EEP_CM_24C08, {8, 0x3FF, 0x3FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, + + /* 24C16 */ + { EEP_CM_24C16, {8, 0x7FF, 0x7FF, 0x300000, 0x380001, 0x300000, 0, 7, 1}}, + + /* 24C65 */ + { EEP_CM_24C65, {16, 0x1FFF, 0x1FFF, 0x300000, 0x380001, 0x300000, 0, 7, 1}} +}; + + +class MD_Cart_Type_EEPROM : public MD_Cart_Type +{ + public: + + MD_Cart_Type_EEPROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const int BoardType); + virtual ~MD_Cart_Type_EEPROM() override; + virtual void Reset(void) override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + void WriteEEPROM(unsigned int address, unsigned int value, bool word_access); + unsigned int ReadEEPROM(unsigned int address, bool word_access); + + + const uint8 *rom; + uint32 rom_size; + + void Detect_START(); + void Detect_STOP(); + + uint8 sda; /* current /SDA line state */ + uint8 scl; /* current /SCL line state */ + uint8 old_sda; /* previous /SDA line state */ + uint8 old_scl; /* previous /SCL line state */ + uint8 cycles; /* current operation cycle number (0-9) */ + uint8 rw; /* operation type (1:READ, 0:WRITE) */ + uint16 slave_mask; /* device address (shifted by the memory address width)*/ + uint16 word_address; /* memory address */ + + uint8 *sram; + + T_EEPROM_STATE state; /* current operation state */ + T_EEPROM_TYPE type; /* EEPROM characteristics for this game */ +}; + + +MD_Cart_Type_EEPROM::MD_Cart_Type_EEPROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const int BoardType) +{ + bool found_board_type = FALSE; + + this->rom = ROM; + this->rom_size = ROM_size; + + /* initialize eeprom */ + sda = old_sda = 1; + scl = old_scl = 1; + state = STAND_BY; + + for(int i = 0; i < EEP_TOTAL; i++) + { + if(database[i].board_type == BoardType) + { + memcpy(&type, &database[i].type, sizeof(T_EEPROM_TYPE)); + found_board_type = TRUE; + break; + } + } + + // Debugging sanity check + if(!found_board_type) + throw(0); + + /* set SRAM start & end address */ + sram = (uint8 *)MDFN_malloc_T(type.size_mask + 1, _("Cart EEPROM")); + memset(sram, 0xFF, type.size_mask + 1); +} + +MD_Cart_Type_EEPROM::~MD_Cart_Type_EEPROM() +{ + if(sram) + MDFN_free(sram); +} + +INLINE void MD_Cart_Type_EEPROM::Detect_START() +{ + if (old_scl && scl) + { + if (old_sda && !sda) + { + cycles = 0; + slave_mask = 0; + if (type.address_bits == 7) + { + word_address = 0; + state = GET_WORD_ADR_7BITS; + } + else state = GET_SLAVE_ADR; + } + } +} + +INLINE void MD_Cart_Type_EEPROM::Detect_STOP() +{ + if (old_scl && scl) + { + if (!old_sda && sda) + { + state = STAND_BY; + } + } +} + +void MD_Cart_Type_EEPROM::Reset(void) +{ + sda = old_sda = 1; + scl = old_scl = 1; + state = STAND_BY; + cycles = 0; + rw = 0; + slave_mask = 0; + word_address = 0; +} + +void MD_Cart_Type_EEPROM::WriteEEPROM(unsigned int address, unsigned int data, bool word_access) +{ + /* decode SCL and SDA value */ + if (word_access) + { + /* 16-bits access */ + if (type.sda_in_adr == address) sda = (data >> (8 + type.sda_in_bit)) & 1; /* MSB */ + else if (type.sda_in_adr == (address | 1)) sda = (data >> type.sda_in_bit) & 1; /* LSB */ + else sda = old_sda; + + if (type.scl_adr == address) scl = (data >> (8 + type.scl_bit)) & 1; /* MSB */ + else if (type.scl_adr == (address | 1)) scl = (data >> type.scl_bit) & 1; /* LSB */ + else scl = old_scl; + } + else + { + if (type.sda_in_adr == address) sda = (data >> type.sda_in_bit) & 1; + else sda = old_sda; + + if (type.scl_adr == address) scl = (data >> type.scl_bit) & 1; + else scl = old_scl; + } + + /* EEPROM current state */ + switch (state) + { + /* Standby Mode */ + case STAND_BY: + Detect_START(); + Detect_STOP(); + break; + + /* Suspended Mode */ + case WAIT_STOP: + Detect_STOP(); + break; + + /* Get Word Address 7 bits: MODE-1 only (24C01) + * and R/W bit + */ + case GET_WORD_ADR_7BITS: + Detect_START(); + Detect_STOP(); + + /* look for SCL LOW to HIGH transition */ + if (!old_scl && scl) + { + if (cycles == 0) cycles ++; + } + + + /* look for SCL HIGH to LOW transition */ + if (old_scl && !scl && (cycles > 0)) + { + if (cycles < 8) + { + word_address |= (old_sda << (7 - cycles)); + } + else if (cycles == 8) + { + rw = old_sda; + } + else + { /* ACK CYCLE */ + cycles = 0; + word_address &= type.size_mask; + state = rw ? READ_DATA : WRITE_DATA; + } + + cycles ++; + } + break; + + + /* Get Slave Address (3bits) : MODE-2 & MODE-3 only (24C01 - 24C512) (0-3bits, depending on the array size) + * or/and Word Address MSB: MODE-2 only (24C04 - 24C16) (0-3bits, depending on the array size) + * and R/W bit + */ + case GET_SLAVE_ADR: + + Detect_START(); + Detect_STOP(); + + /* look for SCL LOW to HIGH transition */ + if (!old_scl && scl) + { + if (cycles == 0) cycles ++; + } + + /* look for SCL HIGH to LOW transition */ + if (old_scl && !scl && (cycles > 0)) + { + if ((cycles > 4) && (cycles <8)) + { + if ((type.address_bits == 16) || + (type.size_mask < (1 << (15 - cycles)))) + { + /* this is a SLAVE ADDRESS bit */ + slave_mask |= (old_sda << (7 - cycles)); + } + else + { + /* this is a WORD ADDRESS high bit */ + if (old_sda) word_address |= (1 << (15 - cycles)); + else word_address &= ~(1 << (15 - cycles)); + } + } + else if (cycles == 8) rw = old_sda; + else if (cycles > 8) + { + /* ACK CYCLE */ + cycles = 0; + if (type.address_bits == 16) + { + /* two ADDRESS bytes */ + state = rw ? READ_DATA : GET_WORD_ADR_HIGH; + slave_mask = 0; + } + else + { + /* one ADDRESS byte */ + state = rw ? READ_DATA : GET_WORD_ADR_LOW; + slave_mask <<= 8; + } + } + + cycles ++; + } + break; + + /* Get Word Address MSB (4-8bits depending on the array size) + * MODE-3 only (24C32 - 24C512) + */ + case GET_WORD_ADR_HIGH: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (old_scl && !scl) + { + if (cycles < 9) + { + if ((type.size_mask + 1) < (1 << (17 - cycles))) + { + /* ignored bit: slave mask should be right-shifted by one */ + slave_mask >>= 1; + } + else + { + /* this is a WORD ADDRESS high bit */ + if (old_sda) word_address |= (1 << (16 - cycles)); + else word_address &= ~(1 << (16 - cycles)); + } + + cycles ++; + } + else + { + /* ACK CYCLE */ + cycles = 1; + state = GET_WORD_ADR_LOW; + } + } + break; + + + /* Get Word Address LSB: 7bits (24C01) or 8bits (24C02-24C512) + * MODE-2 and MODE-3 only (24C01 - 24C512) + */ + case GET_WORD_ADR_LOW: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (old_scl && !scl) + { + if (cycles < 9) + { + if ((type.size_mask + 1) < (1 << (9 - cycles))) + { + /* ignored bit (X24C01): slave mask should be right-shifted by one */ + slave_mask >>= 1; + } + else + { + /* this is a WORD ADDRESS high bit */ + if (old_sda) word_address |= (1 << (8 - cycles)); + else word_address &= ~(1 << (8 - cycles)); + } + + cycles ++; + } + else + { + /* ACK CYCLE */ + cycles = 1; + word_address &= type.size_mask; + state = WRITE_DATA; + } + } + break; + + + /* + * Read Cycle + */ + case READ_DATA: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (old_scl && !scl) + { + if (cycles < 9) cycles ++; + else + { + cycles = 1; + + /* ACK not received */ + if (old_sda) state = WAIT_STOP; + } + } + break; + + + /* + * Write Cycle + */ + case WRITE_DATA: + + Detect_START(); + Detect_STOP(); + + /* look for SCL HIGH to LOW transition */ + if (old_scl && !scl) + { + if (cycles < 9) + { + /* Write DATA bits (max 64kBytes) */ + uint16 sram_address = (slave_mask | word_address) & 0xFFFF; + if (old_sda) sram[sram_address] |= (1 << (8 - cycles)); + else sram[sram_address] &= ~(1 << (8 - cycles)); + + if (cycles == 8) + { + /* WORD ADDRESS is incremented (roll up at maximum pagesize) */ + word_address = (word_address & (0xFFFF - type.pagewrite_mask)) | + ((word_address + 1) & type.pagewrite_mask); + } + + cycles ++; + } + else cycles = 1; /* ACK cycle */ + } + break; + } + + old_scl = scl; + old_sda = sda; +} + +unsigned int MD_Cart_Type_EEPROM::ReadEEPROM(unsigned int address, bool word_access) +{ + uint8 sda_out = sda; + + /* EEPROM state */ + switch (state) + { + case READ_DATA: + if (cycles < 9) + { + /* Return DATA bits (max 64kBytes) */ + uint16 sram_address = (slave_mask | word_address) & 0xffff; + sda_out = (sram[sram_address] >> (8 - cycles)) & 1; + + if (cycles == 8) + { + /* WORD ADDRESS is incremented (roll up at maximum array size) */ + word_address ++; + word_address &= type.size_mask; + } + } + break; + + case GET_WORD_ADR_7BITS: + case GET_SLAVE_ADR: + case GET_WORD_ADR_HIGH: + case GET_WORD_ADR_LOW: + case WRITE_DATA: + if (cycles == 9) sda_out = 0; + break; + + default: + break; + } + + /* memory access */ + if (word_access) + { + /* 16-bits access */ + if (type.sda_out_adr & 1) return (sda_out << type.sda_out_bit); /* LSB */ + else return (sda_out << (type.sda_out_bit + 8)); /* MSB */ + } + else return (sda_out << type.sda_out_bit); +} + + +void MD_Cart_Type_EEPROM::Write8(uint32 A, uint8 V) +{ + if((A == type.sda_in_adr) || (A == type.scl_adr)) + WriteEEPROM(A, V, false); +} + +void MD_Cart_Type_EEPROM::Write16(uint32 A, uint16 V) +{ + if((A == (type.sda_in_adr & 0xFFFFFE)) || (A == (type.scl_adr & 0xFFFFFE))) + WriteEEPROM(A, V, true); +} + +uint8 MD_Cart_Type_EEPROM::Read8(uint32 A) +{ + if(A == type.sda_out_adr) + return(ReadEEPROM(A, false)); + + // + + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_EEPROM] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_EEPROM::Read16(uint32 A) +{ + if(A == (type.sda_out_adr & 0xFFFFFE)) + return(ReadEEPROM(A, true)); + + // + + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_EEPROM] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_EEPROM::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(sda), + SFVAR(scl), + SFVAR(old_sda), + SFVAR(old_scl), + SFVAR(cycles), + SFVAR(rw), + SFVAR(slave_mask), + SFVAR(word_address), + SFVAR(state), + SFARRAY(sram, type.size_mask + 1), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + if(load) + { + + } + return(ret); +} + +uint32 MD_Cart_Type_EEPROM::GetNVMemorySize(void) +{ + return(type.size_mask + 1); +} + +void MD_Cart_Type_EEPROM::ReadNVMemory(uint8 *buffer) +{ + memcpy(buffer, sram, type.size_mask + 1); +} + +void MD_Cart_Type_EEPROM::WriteNVMemory(const uint8 *buffer) +{ + memcpy(sram, buffer, type.size_mask + 1); +} + +MD_Cart_Type *MD_Make_Cart_Type_EEPROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_EEPROM(ginfo, ROM, ROM_size, iparam)); +} diff --git a/Mednafen/mednafen/md/cart/map_eeprom.h b/Mednafen/mednafen/md/cart/map_eeprom.h new file mode 100644 index 0000000000..580f741469 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_eeprom.h @@ -0,0 +1,25 @@ +#ifndef __MD_MAP_EEPROM_H +#define __MD_MAP_EEPROM_H + +enum +{ + EEP_NONE = 0, + EEP_ACCLAIM_24C02_OLD = 1, + EEP_ACCLAIM_24C02, + EEP_ACCLAIM_24C04, + EEP_ACCLAIM_24C16, + EEP_ACCLAIM_24C65, + + EEP_EA_24C01, + + EEP_SEGA_24C01, + + EEP_CM_24C08, + EEP_CM_24C16, + EEP_CM_24C65, + EEP_TOTAL +}; + +MD_Cart_Type *MD_Make_Cart_Type_EEPROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + +#endif diff --git a/Mednafen/mednafen/md/cart/map_ff.cpp b/Mednafen/mednafen/md/cart/map_ff.cpp new file mode 100644 index 0000000000..92545ea2e6 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_ff.cpp @@ -0,0 +1,181 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +class MD_Cart_Type_FF : public MD_Cart_Type +{ + public: + + MD_Cart_Type_FF(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_FF() override; + virtual void Reset(void) override; + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + + uint8 latch; + uint8 sram[8192]; +}; + + +MD_Cart_Type_FF::MD_Cart_Type_FF(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_FF::~MD_Cart_Type_FF() +{ + memset(sram, 0xFF, 8192); +} + +void MD_Cart_Type_FF::Reset(void) +{ + latch = 0; +} + +void MD_Cart_Type_FF::Write8(uint32 A, uint8 V) +{ + if(A >= 0x200000 && A <= 0x203fff) + { + if(A & 1) + sram[(A >> 1) & 0x1FFF] = V; + } + else if(A == 0x400006) + latch = V; + else + { + MD_DBG(MD_DBG_WARNING, "[MAP_FF] Unknown write8 to 0x%08x, =0x%02x\n", A, V); + } +} + +void MD_Cart_Type_FF::Write16(uint32 A, uint16 V) +{ + if(A >= 0x200000 && A <= 0x203fff) + { + sram[(A >> 1) & 0x1FFF] = V; + } + else + { + MD_DBG(MD_DBG_WARNING, "[MAP_FF] Unknown write16 to 0x%08x, =0x%04x\n", A, V); + } +} + +uint8 MD_Cart_Type_FF::Read8(uint32 A) +{ + if(A < 0x400000) + { + if(A >= 0x200000 && A <= 0x203fff) + { + if(A & 1) + return(sram[(A >> 1) & 0x1FFF]); + } + + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_FF] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + + if(A == 0x400006) + return(latch); + + if(A > 0x410000) + { + MD_DBG(MD_DBG_WARNING, "[MAP_FF] Unknown read8 from 0x%08x\n", A); + } + + if(A >= 0x400000) + return(READ_BYTE_MSB(rom, (A & 0xFFFFF) + (61 * 32768))); + + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_FF::Read16(uint32 A) +{ + if(A < 0x400000) + { + if(A >= 0x200000 && A <= 0x203fff) + return(sram[(A >> 1) & 0x1FFF]); + + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_FF] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + MD_DBG(MD_DBG_WARNING, "[MAP_FF] Unknown read16 from 0x%08x\n", A); + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_FF::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFARRAY(sram, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + if(load) + { + + } + return(ret); + + return(1); +} + +uint32 MD_Cart_Type_FF::GetNVMemorySize(void) +{ + return(8192); +} + +void MD_Cart_Type_FF::ReadNVMemory(uint8 *buffer) +{ + memcpy(buffer, sram, 8192); +} + +void MD_Cart_Type_FF::WriteNVMemory(const uint8 *buffer) +{ + memcpy(sram, buffer, 8192); +} + +MD_Cart_Type *MD_Make_Cart_Type_FF(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_FF(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_ff.h b/Mednafen/mednafen/md/cart/map_ff.h new file mode 100644 index 0000000000..2990190780 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_ff.h @@ -0,0 +1,2 @@ +MD_Cart_Type *MD_Make_Cart_Type_FF(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + diff --git a/Mednafen/mednafen/md/cart/map_realtec.cpp b/Mednafen/mednafen/md/cart/map_realtec.cpp new file mode 100644 index 0000000000..1962d299ab --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_realtec.cpp @@ -0,0 +1,190 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +class MD_Cart_Type_REALTEC : public MD_Cart_Type +{ + public: + + MD_Cart_Type_REALTEC(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_REALTEC() override; + virtual void Reset(void) override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + + bool boot_mode; + uint8 bank_size; + uint8 bank_select; +}; + + +MD_Cart_Type_REALTEC::MD_Cart_Type_REALTEC(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_REALTEC::~MD_Cart_Type_REALTEC() +{ + +} + +void MD_Cart_Type_REALTEC::Reset(void) +{ + boot_mode = TRUE; + bank_select = 0; + bank_size = 0; +} + +void MD_Cart_Type_REALTEC::Write8(uint32 A, uint8 V) +{ + //printf("Write8: %08x %02x\n", A, V); + + switch(A & 0xC06000) + { + case 0x400000: boot_mode = !(V & 0x1); + bank_select &= ~0xC; + bank_select |= (V & 0x6) << 2; + break; + + case 0x402000: bank_size = V; + break; + + case 0x404000: bank_select &= ~0x7; + bank_select |= V & 0x7; + break; + } +} + +void MD_Cart_Type_REALTEC::Write16(uint32 A, uint16 V) +{ + //printf("Write16: %08x %04x\n", A, V); + switch(A & 0xC06000) + { + case 0x400000: boot_mode = !(V & 0x1); + bank_select &= ~0xC; + bank_select |= (V & 0x6) << 2; + break; + + case 0x402000: bank_size = V; + break; + + case 0x404000: bank_select &= ~0x7; + bank_select |= V & 0x7; + break; + } +} + +uint8 MD_Cart_Type_REALTEC::Read8(uint32 A) +{ + if(A < 0x400000) + { + uint32 rom_offset; + + if(boot_mode) + rom_offset = (A & 0x1FFF) | 0x7E000; //(rom_size &~ 0x1FFF) - 0x2000; + else + { + rom_offset = (A & ((0x20000 * bank_size) - 1)) | (bank_select * 0x20000); + } + + if(rom_offset >= rom_size) + return(0); + + return(READ_BYTE_MSB(rom, rom_offset)); + } + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_REALTEC::Read16(uint32 A) +{ + if(A < 0x400000) + { + uint32 rom_offset; + + if(boot_mode) + rom_offset = (A & 0x1FFF) | 0x07E000; //rom_size &~ 0x1FFF) - 0x2000; + else + { + rom_offset = (A & ((0x20000 * bank_size) - 1)) | (bank_select * 0x20000); + } + + if(rom_offset >= rom_size) + return(0); + + return(READ_WORD_MSB(rom, rom_offset)); + } + + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_REALTEC::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(bank_size), + SFVAR(bank_select), + SFVAR(boot_mode), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + if(load) + { + + } + return(ret); + + return(1); +} + +uint32 MD_Cart_Type_REALTEC::GetNVMemorySize(void) +{ + return(0); +} + +void MD_Cart_Type_REALTEC::ReadNVMemory(uint8 *buffer) +{ + +} + +void MD_Cart_Type_REALTEC::WriteNVMemory(const uint8 *buffer) +{ + +} + +MD_Cart_Type *MD_Make_Cart_Type_REALTEC(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_REALTEC(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_realtec.h b/Mednafen/mednafen/md/cart/map_realtec.h new file mode 100644 index 0000000000..367cc4bf36 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_realtec.h @@ -0,0 +1,6 @@ +#ifndef __MD_MAP_REALTEC_H +#define __MD_MAP_REALTEC_H + +MD_Cart_Type *MD_Make_Cart_Type_REALTEC(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + +#endif diff --git a/Mednafen/mednafen/md/cart/map_rmx3.cpp b/Mednafen/mednafen/md/cart/map_rmx3.cpp new file mode 100644 index 0000000000..5aa5a76445 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_rmx3.cpp @@ -0,0 +1,135 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +class MD_Cart_Type_RMX3 : public MD_Cart_Type +{ + public: + + MD_Cart_Type_RMX3(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_RMX3() override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + +}; + + +MD_Cart_Type_RMX3::MD_Cart_Type_RMX3(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_RMX3::~MD_Cart_Type_RMX3() +{ + +} + + +void MD_Cart_Type_RMX3::Write8(uint32 A, uint8 V) +{ + +} + +void MD_Cart_Type_RMX3::Write16(uint32 A, uint16 V) +{ + +} + +uint8 MD_Cart_Type_RMX3::Read8(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_RMX3] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + + if(A == 0xa13000) + return(0x0C); + if(A == 0x400004) + return(0x88); + + MD_DBG(MD_DBG_WARNING, "[MAP_RMX3] Unknown read8 from 0x%08x\n", A); + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_RMX3::Read16(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_RMX3] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + if(A == 0xa13000) + return(0x0C); + if(A == 0x400004) + return(0x88); + + MD_DBG(MD_DBG_WARNING, "[MAP_RMX3] Unknown read16 from 0x%08x\n", A); + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_RMX3::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + return(1); +} + +uint32 MD_Cart_Type_RMX3::GetNVMemorySize(void) +{ + return(0); +} + +void MD_Cart_Type_RMX3::ReadNVMemory(uint8 *buffer) +{ + +} + +void MD_Cart_Type_RMX3::WriteNVMemory(const uint8 *buffer) +{ + +} + +MD_Cart_Type *MD_Make_Cart_Type_RMX3(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_RMX3(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_rmx3.h b/Mednafen/mednafen/md/cart/map_rmx3.h new file mode 100644 index 0000000000..399054c767 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_rmx3.h @@ -0,0 +1,2 @@ +MD_Cart_Type *MD_Make_Cart_Type_RMX3(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + diff --git a/Mednafen/mednafen/md/cart/map_rom.cpp b/Mednafen/mednafen/md/cart/map_rom.cpp new file mode 100644 index 0000000000..8cc5eef9ff --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_rom.cpp @@ -0,0 +1,128 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +// Basic flat-space ROM-only mapper. + +class MD_Cart_Type_ROM : public MD_Cart_Type +{ + public: + + MD_Cart_Type_ROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_ROM() override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + +}; + + +MD_Cart_Type_ROM::MD_Cart_Type_ROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_ROM::~MD_Cart_Type_ROM() +{ + +} + + +void MD_Cart_Type_ROM::Write8(uint32 A, uint8 V) +{ + MD_DBG(MD_DBG_WARNING, "[MAP_ROM] Unknown write8 to 0x%08x, =0x%02x\n", A, V); +} + +void MD_Cart_Type_ROM::Write16(uint32 A, uint16 V) +{ + MD_DBG(MD_DBG_WARNING, "[MAP_ROM] Unknown write16 to 0x%08x, =0x%04x\n", A, V); +} + +uint8 MD_Cart_Type_ROM::Read8(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_ROM] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + + MD_DBG(MD_DBG_WARNING, "[MAP_ROM] Unknown read8 from 0x%08x\n", A); + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_ROM::Read16(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_ROM] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + MD_DBG(MD_DBG_WARNING, "[MAP_ROM] Unknown read16 from 0x%08x\n", A); + + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_ROM::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + return(1); +} + +uint32 MD_Cart_Type_ROM::GetNVMemorySize(void) +{ + return(0); +} + +void MD_Cart_Type_ROM::ReadNVMemory(uint8 *buffer) +{ + +} + +void MD_Cart_Type_ROM::WriteNVMemory(const uint8 *buffer) +{ + +} + +MD_Cart_Type *MD_Make_Cart_Type_ROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_ROM(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_rom.h b/Mednafen/mednafen/md/cart/map_rom.h new file mode 100644 index 0000000000..f7794bb3c9 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_rom.h @@ -0,0 +1,6 @@ +#ifndef __MD_MAP_ROM_H +#define __MD_MAP_ROM_H + +MD_Cart_Type *MD_Make_Cart_Type_ROM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + +#endif diff --git a/Mednafen/mednafen/md/cart/map_sbb.cpp b/Mednafen/mednafen/md/cart/map_sbb.cpp new file mode 100644 index 0000000000..6d2584ccba --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_sbb.cpp @@ -0,0 +1,135 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +class MD_Cart_Type_SBB : public MD_Cart_Type +{ + public: + + MD_Cart_Type_SBB(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_SBB() override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + +}; + + +MD_Cart_Type_SBB::MD_Cart_Type_SBB(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_SBB::~MD_Cart_Type_SBB() +{ + +} + + +void MD_Cart_Type_SBB::Write8(uint32 A, uint8 V) +{ + +} + +void MD_Cart_Type_SBB::Write16(uint32 A, uint16 V) +{ + +} + +uint8 MD_Cart_Type_SBB::Read8(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_SBB] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + + if(A == 0x400000) + return(0x55); + if(A == 0x400002) + return(0x0f); + + MD_DBG(MD_DBG_WARNING, "[MAP_SBB] Unknown read8 from 0x%08x\n", A); + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_SBB::Read16(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_SBB] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + if(A == 0x400000) + return(0x55); + if(A == 0x400002) + return(0x0f); + + MD_DBG(MD_DBG_WARNING, "[MAP_SBB] Unknown read16 from 0x%08x\n", A); + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_SBB::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + return(1); +} + +uint32 MD_Cart_Type_SBB::GetNVMemorySize(void) +{ + return(0); +} + +void MD_Cart_Type_SBB::ReadNVMemory(uint8 *buffer) +{ + +} + +void MD_Cart_Type_SBB::WriteNVMemory(const uint8 *buffer) +{ + +} + +MD_Cart_Type *MD_Make_Cart_Type_SBB(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_SBB(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_sbb.h b/Mednafen/mednafen/md/cart/map_sbb.h new file mode 100644 index 0000000000..f49258f2e8 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_sbb.h @@ -0,0 +1,2 @@ +MD_Cart_Type *MD_Make_Cart_Type_SBB(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + diff --git a/Mednafen/mednafen/md/cart/map_sram.cpp b/Mednafen/mednafen/md/cart/map_sram.cpp new file mode 100644 index 0000000000..1a70d4a3d3 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_sram.cpp @@ -0,0 +1,195 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_sram.h" + +// TODO: Add suport for 8-bit mapped into 16-bit space correctly + +class MD_Cart_Type_SRAM : public MD_Cart_Type +{ + public: + + MD_Cart_Type_SRAM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_SRAM() override; + virtual void Reset(void) override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + + uint32 sram_start; + uint32 sram_end; + uint32 sram_size; + + bool sram_enabled; + uint8 *sram; +}; + + +MD_Cart_Type_SRAM::MD_Cart_Type_SRAM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; + + sram_start = ginfo->sram_start; + sram_end = ginfo->sram_end; + + sram_size = 0; + + sram_start &= 0xFFFFFE; + sram_end |= 0x000001; + + if((uint32)(sram_end - sram_start) >= 0x10000 || sram_start == sram_end) + { + sram_end = sram_start + 0xFFFF; + } + sram_size = sram_end - sram_start + 1; + + //printf("%08x %08x %08x\n", sram_start, sram_end, sram_size); + + sram = (uint8 *)MDFN_malloc_T(sram_size, _("Cart SRAM")); + memset(sram, 0xFF, sram_size); +} + +MD_Cart_Type_SRAM::~MD_Cart_Type_SRAM() +{ + if(sram) + { + MDFN_free(sram); + sram = NULL; + } +} + +void MD_Cart_Type_SRAM::Reset(void) +{ + if(rom_size > sram_start) + sram_enabled = FALSE; + else + sram_enabled = TRUE; +} + +void MD_Cart_Type_SRAM::Write8(uint32 A, uint8 V) +{ + if(A == 0xA130F1) + sram_enabled = V & 1; + + if(A >= sram_start && A <= sram_end) + { + WRITE_BYTE_MSB(sram, A - sram_start, V); + } +} + +void MD_Cart_Type_SRAM::Write16(uint32 A, uint16 V) +{ + if(A == 0xA130F0) + sram_enabled = V & 1; + + if(A >= sram_start && A <= sram_end) + { + WRITE_WORD_MSB(sram, A - sram_start, V); + } +} + +uint8 MD_Cart_Type_SRAM::Read8(uint32 A) +{ + if(sram_enabled && A >= sram_start && A <= sram_end) + { + return(READ_BYTE_MSB(sram, A - sram_start)); + } + + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_SRAM] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_SRAM::Read16(uint32 A) +{ + if(sram_enabled && A >= sram_start && A <= sram_end) + { + return(READ_WORD_MSB(sram, A - sram_start)); + } + + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_SRAM] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_SRAM::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(sram_enabled), + SFARRAY(sram, sram_size), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + if(load) + { + + } + return(ret); +} + +uint32 MD_Cart_Type_SRAM::GetNVMemorySize(void) +{ + return(sram_size); +} + +void MD_Cart_Type_SRAM::ReadNVMemory(uint8 *buffer) +{ + memcpy(buffer, sram, sram_size); +} + +void MD_Cart_Type_SRAM::WriteNVMemory(const uint8 *buffer) +{ + memcpy(sram, buffer, sram_size); +} + +MD_Cart_Type *MD_Make_Cart_Type_SRAM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_SRAM(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_sram.h b/Mednafen/mednafen/md/cart/map_sram.h new file mode 100644 index 0000000000..b6263f292f --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_sram.h @@ -0,0 +1,6 @@ +#ifndef __MD_MAP_SRAM_H +#define __MD_MAP_SRAM_H + +MD_Cart_Type *MD_Make_Cart_Type_SRAM(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + +#endif diff --git a/Mednafen/mednafen/md/cart/map_ssf2.cpp b/Mednafen/mednafen/md/cart/map_ssf2.cpp new file mode 100644 index 0000000000..ef52dbfb29 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_ssf2.cpp @@ -0,0 +1,172 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +class MD_Cart_Type_SSF2 : public MD_Cart_Type +{ + public: + + MD_Cart_Type_SSF2(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_SSF2() override; + virtual void Reset(void) override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + uint8 sf2_banks[8]; + uint8 control; +}; + + +MD_Cart_Type_SSF2::MD_Cart_Type_SSF2(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_SSF2::~MD_Cart_Type_SSF2() +{ + +} + +void MD_Cart_Type_SSF2::Reset(void) +{ + control = 0; + + for(int i = 0; i < 8; i++) + sf2_banks[i] = i; +} + +void MD_Cart_Type_SSF2::Write8(uint32 A, uint8 V) +{ + switch(A) + { + default: MD_DBG(MD_DBG_WARNING, "[MAP_SSF2] Unknown write8 to 0x%08x, =0x%02x\n", A, V); + break; + + case 0xA130F1: control = V & 0x3; break; + case 0xA130F3: sf2_banks[1] = V & 0x3F; break; + case 0xA130F5: sf2_banks[2] = V & 0x3F; break; + case 0xA130F7: sf2_banks[3] = V & 0x3F; break; + case 0xA130F9: sf2_banks[4] = V & 0x3F; break; + case 0xA130FB: sf2_banks[5] = V & 0x3F; break; + case 0xA130FD: sf2_banks[6] = V & 0x3F; break; + case 0xA130FF: sf2_banks[7] = V & 0x3F; break; + } +} + +void MD_Cart_Type_SSF2::Write16(uint32 A, uint16 V) +{ + // Just a guess + switch(A) + { + default: MD_DBG(MD_DBG_WARNING, "[MAP_SSF2] Unknown write16 to 0x%08x, =0x%04x\n", A, V); + break; + + case 0xA130F0: control = V & 0x3; break; + case 0xA130F2: sf2_banks[1] = V & 0x3F; break; + case 0xA130F4: sf2_banks[2] = V & 0x3F; break; + case 0xA130F6: sf2_banks[3] = V & 0x3F; break; + case 0xA130F8: sf2_banks[4] = V & 0x3F; break; + case 0xA130FA: sf2_banks[5] = V & 0x3F; break; + case 0xA130FC: sf2_banks[6] = V & 0x3F; break; + case 0xA130FE: sf2_banks[7] = V & 0x3F; break; + } +} + +uint8 MD_Cart_Type_SSF2::Read8(uint32 A) +{ + if(A < 0x400000) + { + uint32 rom_offset = (sf2_banks[(A >> 19) & 0x7] << 19) | (A & 0x7FFFF); + + if(rom_offset >= rom_size) + return(0); + + return(READ_BYTE_MSB(rom, rom_offset)); + } + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_SSF2::Read16(uint32 A) +{ + if(A < 0x400000) + { + uint32 rom_offset = (sf2_banks[(A >> 19) & 0x7] << 19) | (A & 0x7FFFF); + + if(rom_offset >= rom_size) + return(0); + + return(READ_WORD_MSB(rom, rom_offset)); + } + + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_SSF2::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFARRAY(sf2_banks, 8), + SFVAR(control), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + if(load) + { + + } + return(ret); + + return(1); +} + +uint32 MD_Cart_Type_SSF2::GetNVMemorySize(void) +{ + return(0); +} + +void MD_Cart_Type_SSF2::ReadNVMemory(uint8 *buffer) +{ + +} + +void MD_Cart_Type_SSF2::WriteNVMemory(const uint8 *buffer) +{ + +} + +MD_Cart_Type *MD_Make_Cart_Type_SSF2(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_SSF2(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_ssf2.h b/Mednafen/mednafen/md/cart/map_ssf2.h new file mode 100644 index 0000000000..ec62fa919c --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_ssf2.h @@ -0,0 +1,6 @@ +#ifndef __MD_MAP_SSF2_H +#define __MD_MAP_SSF2_H + +MD_Cart_Type *MD_Make_Cart_Type_SSF2(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + +#endif diff --git a/Mednafen/mednafen/md/cart/map_svp.cpp b/Mednafen/mednafen/md/cart/map_svp.cpp new file mode 100644 index 0000000000..955077a27c --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_svp.cpp @@ -0,0 +1,127 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_svp.h" + +// UNFINISHED + +class MD_Cart_Type_SVP : public MD_Cart_Type +{ + public: + + MD_Cart_Type_SVP(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_SVP() override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + +}; + + +MD_Cart_Type_SVP::MD_Cart_Type_SVP(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; +} + +MD_Cart_Type_SVP::~MD_Cart_Type_SVP() +{ + +} + + +void MD_Cart_Type_SVP::Write8(uint32 A, uint8 V) +{ + printf("Write8: %08x %02x\n", A, V); +} + +void MD_Cart_Type_SVP::Write16(uint32 A, uint16 V) +{ + printf("Write16: %08x %04x\n", A, V); +} + +uint8 MD_Cart_Type_SVP::Read8(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + printf("Read8: %08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + printf("Read8: %08x\n", A); + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_SVP::Read16(uint32 A) +{ + if(A < 0x400000) + { + if(A >= rom_size) + { + printf("Read16: %08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + printf("Read16: %08x\n", A); + + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_SVP::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + return(1); +} + +uint32 MD_Cart_Type_SVP::GetNVMemorySize(void) +{ + return(0); +} + +void MD_Cart_Type_SVP::ReadNVMemory(uint8 *buffer) +{ + +} + +void MD_Cart_Type_SVP::WriteNVMemory(const uint8 *buffer) +{ + +} + +MD_Cart_Type *MD_Make_Cart_Type_SVP(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_SVP(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_svp.h b/Mednafen/mednafen/md/cart/map_svp.h new file mode 100644 index 0000000000..4d5db65190 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_svp.h @@ -0,0 +1,6 @@ +#ifndef __MD_MAP_SVP_H +#define __MD_MAP_SVP_H + +MD_Cart_Type *MD_Make_Cart_Type_SVP(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + +#endif diff --git a/Mednafen/mednafen/md/cart/map_yase.cpp b/Mednafen/mednafen/md/cart/map_yase.cpp new file mode 100644 index 0000000000..070f92a4b8 --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_yase.cpp @@ -0,0 +1,161 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cart.h" +#include "map_rom.h" + +class MD_Cart_Type_YaSe : public MD_Cart_Type +{ + public: + + MD_Cart_Type_YaSe(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size); + virtual ~MD_Cart_Type_YaSe() override; + + virtual void Write8(uint32 A, uint8 V) override; + virtual void Write16(uint32 A, uint16 V) override; + virtual uint8 Read8(uint32 A) override; + virtual uint16 Read16(uint32 A) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + // In bytes + virtual uint32 GetNVMemorySize(void) override; + virtual void ReadNVMemory(uint8 *buffer) override; + virtual void WriteNVMemory(const uint8 *buffer) override; + + private: + + const uint8 *rom; + uint32 rom_size; + uint8 sram[4096]; +}; + + +MD_Cart_Type_YaSe::MD_Cart_Type_YaSe(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size) +{ + this->rom = ROM; + this->rom_size = ROM_size; + + memset(sram, 0xFF, 4096); +} + +MD_Cart_Type_YaSe::~MD_Cart_Type_YaSe() +{ + +} + + +void MD_Cart_Type_YaSe::Write8(uint32 A, uint8 V) +{ + if(A >= 0x200000 && A <= 0x201fff) + { + if(A & 1) + sram[(A >> 1) & 0x1FFF] = V; + } +} + +void MD_Cart_Type_YaSe::Write16(uint32 A, uint16 V) +{ + if(A >= 0x200000 && A <= 0x201fff) + { + sram[(A >> 1) & 0x1FFF] = V; + } +} + +uint8 MD_Cart_Type_YaSe::Read8(uint32 A) +{ + if(A >= 0x200000 && A <= 0x201fff) + { + if(A & 1) + return(sram[(A >> 1) & 0x1FFF]); + } + + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_YASE] Unknown read8 from 0x%08x\n", A); + return(0); + } + return(READ_BYTE_MSB(rom, A)); + } + + if(A == 0x400000) + return(0x63); + if(A == 0x400002) + return(0x98); + if(A == 0x400004) + return(0xC9); + if(A == 0x400006) + return(0x18); + + MD_DBG(MD_DBG_WARNING, "[MAP_YASE] Unknown read8 from 0x%08x\n", A); + return(m68k_read_bus_8(A)); +} + +uint16 MD_Cart_Type_YaSe::Read16(uint32 A) +{ + if(A >= 0x200000 && A <= 0x201fff) + return(sram[(A >> 1) & 0x1FFF]); + + if(A < 0x400000) + { + if(A >= rom_size) + { + MD_DBG(MD_DBG_WARNING, "[MAP_YASE] Unknown read16 from 0x%08x\n", A); + return(0); + } + return(READ_WORD_MSB(rom, A)); + } + + if(A == 0x400000) + return(0x63); + if(A == 0x400002) + return(0x98); + if(A == 0x400004) + return(0xC9); + if(A == 0x400006) + return(0x18); + + MD_DBG(MD_DBG_WARNING, "[MAP_YASE] Unknown read16 from 0x%08x\n", A); + return(m68k_read_bus_16(A)); +} + +int MD_Cart_Type_YaSe::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + return(1); +} + +uint32 MD_Cart_Type_YaSe::GetNVMemorySize(void) +{ + return(4096); +} + +void MD_Cart_Type_YaSe::ReadNVMemory(uint8 *buffer) +{ + memcpy(buffer, sram, 4096); +} + +void MD_Cart_Type_YaSe::WriteNVMemory(const uint8 *buffer) +{ + memcpy(sram, buffer, 4096); +} + +MD_Cart_Type *MD_Make_Cart_Type_YaSe(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam) +{ + return(new MD_Cart_Type_YaSe(ginfo, ROM, ROM_size)); +} diff --git a/Mednafen/mednafen/md/cart/map_yase.h b/Mednafen/mednafen/md/cart/map_yase.h new file mode 100644 index 0000000000..bf91af858e --- /dev/null +++ b/Mednafen/mednafen/md/cart/map_yase.h @@ -0,0 +1,2 @@ +MD_Cart_Type *MD_Make_Cart_Type_YaSe(const md_game_info *ginfo, const uint8 *ROM, const uint32 ROM_size, const uint32 iparam, const char *sparam); + diff --git a/Mednafen/mednafen/md/cart/ssp16.c b/Mednafen/mednafen/md/cart/ssp16.c new file mode 100644 index 0000000000..f975208425 --- /dev/null +++ b/Mednafen/mednafen/md/cart/ssp16.c @@ -0,0 +1,1246 @@ +/* + * basic, incomplete SSP160x (SSP1601?) interpreter + * with SVP memory controller emu + * + * Copyright (c) Gražvydas "notaz" Ignotas, 2008 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the organization nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +//#define USE_DEBUGGER +/* detect ops with unimplemented/invalid fields. + * Useful for homebrew or if a new VR revision pops up. */ +//#define DO_CHECKS + +/* + * Register info + * + * 0. "-" + * size: 16 + * desc: Constant register with all bits set (0xffff). + * + * 1. "X" + * size: 16 + * desc: Generic register. When set, updates P (P = X * Y * 2) + * + * 2. "Y" + * size: 16 + * desc: Generic register. When set, updates P (P = X * Y * 2) + * + * 3. "A" + * size: 32 + * desc: Accumulator. + * + * 4. "ST" + * size: 16 + * desc: Status register. From MAME: bits 0-9 are CONTROL, other FLAG + * fedc ba98 7654 3210 + * 210 - RPL (?) "Loop size". If non-zero, makes (rX+) and (rX-) respectively + * modulo-increment and modulo-decrement. The value shows which + * power of 2 to use, i.e. 4 means modulo by 16. + * (e: fir16_32.sc, IIR_4B.SC, DECIM.SC) + * 43 - RB (?) + * 5 - GP0_0 (ST5?) Changed before acessing PM0 (affects banking?). + * 6 - GP0_1 (ST6?) Cleared before acessing PM0 (affects banking?). Set after. + * datasheet says these (5,6) bits correspond to hardware pins. + * 7 - IE (?) Not directly used by SVP code (never set, but preserved)? + * 8 - OP (?) Not used by SVP code (only cleared)? (MAME: saturated value + * (probably means clamping? i.e. 0x7ffc + 9 -> 0x7fff)) + * 9 - MACS (?) Not used by SVP code (only cleared)? (e: "mac shift") + * a - GPI_0 Interrupt 0 enable/status? + * b - GPI_1 Interrupt 1 enable/status? + * c - L L flag. Carry? + * d - Z Zero flag. + * e - OV Overflow flag. + * f - N Negative flag. + * seen directly changing code sequences: + * ldi ST, 0 ld A, ST ld A, ST ld A, ST ldi st, 20h + * ldi ST, 60h ori A, 60h and A, E8h and A, E8h + * ld ST, A ld ST, A ori 3 + * ld ST, A + * + * 5. "STACK" + * size: 16 + * desc: hw stack of 6 levels (according to datasheet) + * + * 6. "PC" + * size: 16 + * desc: Program counter. + * + * 7. "P" + * size: 32 + * desc: multiply result register. P = X * Y * 2 + * probably affected by MACS bit in ST. + * + * 8. "PM0" (PM from PMAR name from Tasco's docs) + * size: 16? + * desc: Programmable Memory access register. + * On reset, or when one (both?) GP0 bits are clear, + * acts as status for XST, mapped at 015004 at 68k side: + * bit0: ssp has written something to XST (cleared when 015004 is read) + * bit1: 68k has written something through a1500{0|2} (cleared on PM0 read) + * + * 9. "PM1" + * size: 16? + * desc: Programmable Memory access register. + * This reg. is only used as PMAR. + * + * 10. "PM2" + * size: 16? + * desc: Programmable Memory access register. + * This reg. is only used as PMAR. + * + * 11. "XST" + * size: 16? + * desc: eXternal STate. Mapped to a15000 and a15002 at 68k side. + * Can be programmed as PMAR? (only seen in test mode code) + * Affects PM0 when written to? + * + * 12. "PM4" + * size: 16? + * desc: Programmable Memory access register. + * This reg. is only used as PMAR. The most used PMAR by VR. + * + * 13. (unused by VR) + * + * 14. "PMC" (PMC from PMAC name from Tasco's docs) + * size: 32? + * desc: Programmable Memory access Control. Set using 2 16bit writes, + * first address, then mode word. After setting PMAC, PMAR sould + * be blind accessed (ld -, PMx or ld PMx, -) to program it for + * reading and writing respectively. + * Reading the register also shifts it's state (from "waiting for + * address" to "waiting for mode" and back). Reads always return + * address related to last PMx register accressed. + * (note: addresses do not wrap). + * + * 15. "AL" + * size: 16 + * desc: Accumulator Low. 16 least significant bits of accumulator. + * (normally reading acc (ld X, A) you get 16 most significant bits). + * + * + * There are 8 8-bit pointer registers rX. r0-r3 (ri) point to RAM0, r4-r7 (rj) point to RAM1. + * They can be accessed directly, or 2 indirection levels can be used [ (rX), ((rX)) ], + * which work similar to * and ** operators in C, only they use different memory banks and + * ((rX)) also does post-increment. First indirection level (rX) accesses RAMx, second accesses + * program memory at address read from (rX), and increments value in (rX). + * + * r0,r1,r2,r4,r5,r6 can be modified [ex: ldi r0, 5]. + * 3 modifiers can be applied (optional): + * + : post-increment [ex: ld a, (r0+) ]. Can be made modulo-increment by setting RPL bits in ST. + * - : post-decrement. Can be made modulo-decrement by setting RPL bits in ST (not sure). + * +!: post-increment, unaffected by RPL (probably). + * These are only used on 1st indirection level, so things like [ld a, ((r0+))] and [ld X, r6-] + * ar probably invalid. + * + * r3 and r7 are special and can not be changed (at least Samsung samples and VR code never do). + * They are fixed to the start of their RAM banks. (They are probably changeable for ssp1605+, + * Samsung's old DSP page claims that). + * 1 of these 4 modifiers must be used (short form direct addressing?): + * |00: RAMx[0] [ex: (r3|00), 0] (based on sample code) + * |01: RAMx[1] + * |10: RAMx[2] ? maybe 10h? accortding to Div_c_dp.sc, 2 + * |11: RAMx[3] + * + * + * Instruction notes + * + * ld a, * doesn't affect flags! (e: A_LAW.SC, Div_c_dp.sc) + * + * mld (rj), (ri) [, b] + * operation: A = 0; P = (rj) * (ri) + * notes: based on IIR_4B.SC sample. flags? what is b??? + * + * mpya (rj), (ri) [, b] + * name: multiply and add? + * operation: A += P; P = (rj) * (ri) + * + * mpys (rj), (ri), b + * name: multiply and subtract? + * notes: not used by VR code. + * + * mod cond, op + * mod cond, shr does arithmetic shift + * + * 'ld -, AL' and probably 'ld AL, -' are for dummy assigns + * + * memory map: + * 000000 - 1fffff ROM, accessable by both + * 200000 - 2fffff unused? + * 300000 - 31ffff DRAM, both + * 320000 - 38ffff unused? + * 390000 - 3907ff IRAM. can only be accessed by ssp? + * 390000 - 39ffff similar mapping to "cell arrange" in Sega CD, 68k only? + * 3a0000 - 3affff similar mapping to "cell arrange" in Sega CD, a bit different + * + * 30fe02 - 0 if SVP busy, 1 if done (set by SVP, checked and cleared by 68k) + * 30fe06 - also sync related. + * 30fe08 - job number [1-12] for SVP. 0 means no job. Set by 68k, read-cleared by VR. + * + * Assumptions and limitations in this code + * only Z and N status flags are emulated (others unused by VR) + * so all condition checks except N and Z are ignored (not used by VR) + * modifiers for 'OP a, ri' and ((ri)) are ignored (not used by VR) + * loop repeat mode when (ri) is destination is ignored + * ops not used by VR are not implemented + */ + +#include "stdlib.h" // NULL +#include "deps.h" +#include "svp.h" + +// 0 +#define rX ssp->gr[SSP_X].h +#define rY ssp->gr[SSP_Y].h +#define rA ssp->gr[SSP_A].h +#define rST ssp->gr[SSP_ST].h // 4 +#define rSTACK ssp->gr[SSP_STACK].h +#define rPC ssp->gr[SSP_PC].h +#define rP ssp->gr[SSP_P] +#define rPM0 ssp->gr[SSP_PM0].h // 8 +#define rPM1 ssp->gr[SSP_PM1].h +#define rPM2 ssp->gr[SSP_PM2].h +#define rXST ssp->gr[SSP_XST].h +#define rPM4 ssp->gr[SSP_PM4].h // 12 +// 13 +#define rPMC ssp->gr[SSP_PMC] // will keep addr in .l, mode in .h +#define rAL ssp->gr[SSP_A].l + +#define rA32 ssp->gr[SSP_A].v +#define rIJ ssp->r + +#define IJind (((op>>6)&4)|(op&3)) + +#define GET_PC() (PC - (unsigned short *)svp->iram_rom) +#define GET_PPC_OFFS() ((unsigned char *)PC - svp->iram_rom - 2) +#define SET_PC(d) PC = (unsigned short *)svp->iram_rom + d + +#define REG_READ(r) (((r) <= 4) ? ssp->gr[r].h : read_handlers[r]()) +#define REG_WRITE(r,d) { \ + int r1 = r; \ + if (r1 >= 4) write_handlers[r1](d); \ + else if (r1 > 0) ssp->gr[r1].h = d; \ +} + +// flags +#define SSP_FLAG_L (1<<0xc) +#define SSP_FLAG_Z (1<<0xd) +#define SSP_FLAG_V (1<<0xe) +#define SSP_FLAG_N (1<<0xf) + +// update ZN according to 32bit ACC. +#define UPD_ACC_ZN \ + rST &= ~(SSP_FLAG_Z|SSP_FLAG_N); \ + if (!rA32) rST |= SSP_FLAG_Z; \ + else rST |= (rA32>>16)&SSP_FLAG_N; + +// it seems SVP code never checks for L and OV, so we leave them out. +// rST |= (t>>4)&SSP_FLAG_L; +#define UPD_LZVN \ + rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ + if (!rA32) rST |= SSP_FLAG_Z; \ + else rST |= (rA32>>16)&SSP_FLAG_N; + +// standard cond processing. +// again, only Z and N is checked, as VR doesn't seem to use any other conds. +#define COND_CHECK \ + switch (op&0xf0) { \ + case 0x00: cond = 1; break; /* always true */ \ + case 0x50: cond = !((rST ^ (op<<5)) & SSP_FLAG_Z); break; /* Z matches f(?) bit */ \ + case 0x70: cond = !((rST ^ (op<<7)) & SSP_FLAG_N); break; /* N matches f(?) bit */ \ + default:elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: unimplemented cond @ %04x", GET_PPC_OFFS()); break; \ + } + +// ops with accumulator. +// how is low word really affected by these? +// nearly sure 'ld A' doesn't affect flags +#define OP_LDA(x) \ + ssp->gr[SSP_A].h = x + +#define OP_LDA32(x) \ + rA32 = x + +#define OP_SUBA(x) { \ + rA32 -= (x) << 16; \ + UPD_LZVN \ +} + +#define OP_SUBA32(x) { \ + rA32 -= (x); \ + UPD_LZVN \ +} + +#define OP_CMPA(x) { \ + u32 t = rA32 - ((x) << 16); \ + rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ + if (!t) rST |= SSP_FLAG_Z; \ + else rST |= (t>>16)&SSP_FLAG_N; \ +} + +#define OP_CMPA32(x) { \ + u32 t = rA32 - (x); \ + rST &= ~(SSP_FLAG_L|SSP_FLAG_Z|SSP_FLAG_V|SSP_FLAG_N); \ + if (!t) rST |= SSP_FLAG_Z; \ + else rST |= (t>>16)&SSP_FLAG_N; \ +} + +#define OP_ADDA(x) { \ + rA32 += (x) << 16; \ + UPD_LZVN \ +} + +#define OP_ADDA32(x) { \ + rA32 += (x); \ + UPD_LZVN \ +} + +#define OP_ANDA(x) \ + rA32 &= (x) << 16; \ + UPD_ACC_ZN + +#define OP_ANDA32(x) \ + rA32 &= (x); \ + UPD_ACC_ZN + +#define OP_ORA(x) \ + rA32 |= (x) << 16; \ + UPD_ACC_ZN + +#define OP_ORA32(x) \ + rA32 |= (x); \ + UPD_ACC_ZN + +#define OP_EORA(x) \ + rA32 ^= (x) << 16; \ + UPD_ACC_ZN + +#define OP_EORA32(x) \ + rA32 ^= (x); \ + UPD_ACC_ZN + + +#define OP_CHECK32(OP) { \ + if ((op & 0x0f) == SSP_P) { /* A <- P */ \ + read_P(); /* update P */ \ + OP(rP.v); \ + break; \ + } \ + if ((op & 0x0f) == SSP_A) { /* A <- A */ \ + OP(rA32); \ + break; \ + } \ +} + + +#ifdef DO_CHECKS +#define CHECK_IMM16() if (op&0x1ff) elprintf(EL_ANOMALY, "imm bits! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_B_SET() if (op&0x100) elprintf(EL_ANOMALY, "b set! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_B_CLEAR() if (!(op&0x100)) elprintf(EL_ANOMALY, "b clear! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_MOD() if (op&0x00c) elprintf(EL_ANOMALY, "mod bits! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_10f() if (op&0x10f) elprintf(EL_ANOMALY, "bits 10f! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_008() if (op&0x008) elprintf(EL_ANOMALY, "bits 008! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_00f() if (op&0x00f) elprintf(EL_ANOMALY, "bits 00f! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_0f0() if (op&0x0f0) elprintf(EL_ANOMALY, "bits 0f0! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_1f0() if (op&0x1f0) elprintf(EL_ANOMALY, "bits 1f0! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_RPL() if (rST&7) elprintf(EL_ANOMALY, "unhandled RPL! %04x @ %04x", op, GET_PPC_OFFS()) +#define CHECK_ST(d) if((rST^d)&0xf98)elprintf(EL_ANOMALY, "ssp FIXME ST %04x -> %04x @ %04x", rST, d, GET_PPC_OFFS()) +#else +#define CHECK_IMM16() +#define CHECK_B_SET() +#define CHECK_B_CLEAR() +#define CHECK_MOD() +#define CHECK_10f() +#define CHECK_008() +#define CHECK_00f() +#define CHECK_0f0() +#define CHECK_1f0() +#define CHECK_RPL() +#define CHECK_ST(d) +#endif + +ssp1601_t *ssp; +static unsigned short *PC; +static int g_cycles; + +#ifdef USE_DEBUGGER +static int running = 0; +static int last_iram = 0; +#endif + +// ----------------------------------------------------- +// register i/o handlers + +// 0-4, 13 +static u32 read_unknown(void) +{ + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: unknown read @ %04x", GET_PPC_OFFS()); + return 0; +} + +static void write_unknown(u32 d) +{ + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: unknown write @ %04x", GET_PPC_OFFS()); +} + +// 4 +static void write_ST(u32 d) +{ + CHECK_ST(d); + rST = d; +} + +// 5 +static u32 read_STACK(void) +{ + --rSTACK; + if ((short)rSTACK < 0) { + rSTACK = 5; + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: stack underflow! (%i) @ %04x", rSTACK, GET_PPC_OFFS()); + } + return ssp->stack[rSTACK]; +} + +static void write_STACK(u32 d) +{ + if (rSTACK >= 6) { + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME: stack overflow! (%i) @ %04x", rSTACK, GET_PPC_OFFS()); + rSTACK = 0; + } + ssp->stack[rSTACK++] = d; +} + +// 6 +static u32 read_PC(void) +{ + return GET_PC(); +} + +static void write_PC(u32 d) +{ + SET_PC(d); + g_cycles--; +} + +// 7 +static u32 read_P(void) +{ + int m1 = (signed short)rX; + int m2 = (signed short)rY; + rP.v = (m1 * m2 * 2); + return rP.h; +} + +// ----------------------------------------------------- + +static int get_inc(int mode) +{ + int inc = (mode >> 11) & 7; + if (inc != 0) { + if (inc != 7) inc--; + inc = 1 << inc; // 0 1 2 4 8 16 32 128 + if (mode & 0x8000) inc = -inc; // decrement mode + } + return inc; +} + +#define overwrite_write(dst, d) \ +{ \ + if (d & 0xf000) { dst &= ~0xf000; dst |= d & 0xf000; } \ + if (d & 0x0f00) { dst &= ~0x0f00; dst |= d & 0x0f00; } \ + if (d & 0x00f0) { dst &= ~0x00f0; dst |= d & 0x00f0; } \ + if (d & 0x000f) { dst &= ~0x000f; dst |= d & 0x000f; } \ +} + +static u32 pm_io(int reg, int write, u32 d) +{ + if (ssp->emu_status & SSP_PMC_SET) + { + // this MUST be blind r or w + if ((*(PC-1) & 0xff0f) && (*(PC-1) & 0xfff0)) { + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: tried to set PM%i (%c) with non-blind i/o %08x @ %04x", + reg, write ? 'w' : 'r', rPMC.v, GET_PPC_OFFS()); + ssp->emu_status &= ~SSP_PMC_SET; + return 0; + } + elprintf(EL_SVP, "PM%i (%c) set to %08x @ %04x", reg, write ? 'w' : 'r', rPMC.v, GET_PPC_OFFS()); + ssp->pmac_read[write ? reg + 6 : reg] = rPMC.v; + ssp->emu_status &= ~SSP_PMC_SET; + if ((rPMC.v & 0x7fffff) == 0x1c8000 || (rPMC.v & 0x7fffff) == 0x1c8240) { + elprintf(EL_SVP, "ssp IRAM copy from %06x to %04x", (ssp->RAM1[0]-1)<<1, (rPMC.v&0x7fff)<<1); +#ifdef USE_DEBUGGER + last_iram = (ssp->RAM1[0]-1)<<1; +#endif + } + return 0; + } + + // just in case + if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i (%c) with only addr set @ %04x", + reg, write ? 'w' : 'r', GET_PPC_OFFS()); + ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; + } + + if (reg == 4 || (rST & 0x60)) + { + #define CADDR ((((mode<<16)&0x7f0000)|addr)<<1) + unsigned short *dram = (unsigned short *)svp->dram; + if (write) + { + int mode = ssp->pmac_write[reg]>>16; + int addr = ssp->pmac_write[reg]&0xffff; + if ((mode & 0xb800) == 0xb800) + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: mode %04x", mode); + if ((mode & 0x43ff) == 0x0018) // DRAM + { + int inc = get_inc(mode); + elprintf(EL_SVP, "ssp PM%i DRAM w [%06x] %04x (inc %i, ovrw %i)", + reg, CADDR, d, inc, (mode>>10)&1); + if (mode & 0x0400) { + overwrite_write(dram[addr], d); + } else dram[addr] = d; + ssp->pmac_write[reg] += inc; + } + else if ((mode & 0xfbff) == 0x4018) // DRAM, cell inc + { + elprintf(EL_SVP, "ssp PM%i DRAM w [%06x] %04x (cell inc, ovrw %i) @ %04x", + reg, CADDR, d, (mode>>10)&1, GET_PPC_OFFS()); + if (mode & 0x0400) { + overwrite_write(dram[addr], d); + } else dram[addr] = d; + ssp->pmac_write[reg] += (addr&1) ? 31 : 1; + } + else if ((mode & 0x47ff) == 0x001c) // IRAM + { + int inc = get_inc(mode); + if ((addr&0xfc00) != 0x8000) + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: invalid IRAM addr: %04x", addr<<1); + elprintf(EL_SVP, "ssp IRAM w [%06x] %04x (inc %i)", (addr<<1)&0x7ff, d, inc); + ((unsigned short *)svp->iram_rom)[addr&0x3ff] = d; + ssp->pmac_write[reg] += inc; + } + else + { + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i unhandled write mode %04x, [%06x] %04x @ %04x", + reg, mode, CADDR, d, GET_PPC_OFFS()); + } + } + else + { + int mode = ssp->pmac_read[reg]>>16; + int addr = ssp->pmac_read[reg]&0xffff; + if ((mode & 0xfff0) == 0x0800) // ROM, inc 1, verified to be correct + { + elprintf(EL_SVP, "ssp ROM r [%06x] %04x", CADDR, + ((unsigned short *)Pico_rom)[addr|((mode&0xf)<<16)]); + ssp->pmac_read[reg] += 1; + d = ((unsigned short *)Pico_rom)[addr|((mode&0xf)<<16)]; + } + else if ((mode & 0x47ff) == 0x0018) // DRAM + { + int inc = get_inc(mode); + elprintf(EL_SVP, "ssp PM%i DRAM r [%06x] %04x (inc %i)", reg, CADDR, dram[addr]); + d = dram[addr]; + ssp->pmac_read[reg] += inc; + } + else + { + elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: PM%i unhandled read mode %04x, [%06x] @ %04x", + reg, mode, CADDR, GET_PPC_OFFS()); + d = 0; + } + } + + // PMC value corresponds to last PMR accessed (not sure). + rPMC.v = ssp->pmac_read[write ? reg + 6 : reg]; + + return d; + } + + return (u32)-1; +} + +// 8 +static u32 read_PM0(void) +{ + u32 d = pm_io(0, 0, 0); + if (d != (u32)-1) return d; + elprintf(EL_SVP, "PM0 raw r %04x @ %04x", rPM0, GET_PPC_OFFS()); + d = rPM0; + if (!(d & 2) && (GET_PPC_OFFS() == 0x800 || GET_PPC_OFFS() == 0x1851E)) { + ssp->emu_status |= SSP_WAIT_PM0; elprintf(EL_SVP, "det TIGHT loop: PM0"); + } + rPM0 &= ~2; // ? + return d; +} + +static void write_PM0(u32 d) +{ + u32 r = pm_io(0, 1, d); + if (r != (u32)-1) return; + elprintf(EL_SVP, "PM0 raw w %04x @ %04x", d, GET_PPC_OFFS()); + rPM0 = d; +} + +// 9 +static u32 read_PM1(void) +{ + u32 d = pm_io(1, 0, 0); + if (d != (u32)-1) return d; + // can be removed? + elprintf(EL_SVP|EL_ANOMALY, "PM1 raw r %04x @ %04x", rPM1, GET_PPC_OFFS()); + return rPM1; +} + +static void write_PM1(u32 d) +{ + u32 r = pm_io(1, 1, d); + if (r != (u32)-1) return; + // can be removed? + elprintf(EL_SVP|EL_ANOMALY, "PM1 raw w %04x @ %04x", d, GET_PPC_OFFS()); + rPM1 = d; +} + +// 10 +static u32 read_PM2(void) +{ + u32 d = pm_io(2, 0, 0); + if (d != (u32)-1) return d; + // can be removed? + elprintf(EL_SVP|EL_ANOMALY, "PM2 raw r %04x @ %04x", rPM2, GET_PPC_OFFS()); + return rPM2; +} + +static void write_PM2(u32 d) +{ + u32 r = pm_io(2, 1, d); + if (r != (u32)-1) return; + // can be removed? + elprintf(EL_SVP|EL_ANOMALY, "PM2 raw w %04x @ %04x", d, GET_PPC_OFFS()); + rPM2 = d; +} + +// 11 +static u32 read_XST(void) +{ + // can be removed? + u32 d = pm_io(3, 0, 0); + if (d != (u32)-1) return d; + + elprintf(EL_SVP, "XST raw r %04x @ %04x", rXST, GET_PPC_OFFS()); + return rXST; +} + +static void write_XST(u32 d) +{ + // can be removed? + u32 r = pm_io(3, 1, d); + if (r != (u32)-1) return; + + elprintf(EL_SVP, "XST raw w %04x @ %04x", d, GET_PPC_OFFS()); + rPM0 |= 1; + rXST = d; +} + +// 12 +static u32 read_PM4(void) +{ + u32 d = pm_io(4, 0, 0); + + if (d == 0) { + switch (GET_PPC_OFFS()) { + case 0x0854: ssp->emu_status |= SSP_WAIT_30FE08; elprintf(EL_SVP, "det TIGHT loop: [30fe08]"); break; + case 0x4f12: ssp->emu_status |= SSP_WAIT_30FE06; elprintf(EL_SVP, "det TIGHT loop: [30fe06]"); break; + } + } + + if (d != (u32)-1) return d; + // can be removed? + elprintf(EL_SVP|EL_ANOMALY, "PM4 raw r %04x @ %04x", rPM4, GET_PPC_OFFS()); + return rPM4; +} + +static void write_PM4(u32 d) +{ + u32 r = pm_io(4, 1, d); + if (r != (u32)-1) return; + // can be removed? + elprintf(EL_SVP|EL_ANOMALY, "PM4 raw w %04x @ %04x", d, GET_PPC_OFFS()); + rPM4 = d; +} + +// 14 +static u32 read_PMC(void) +{ + elprintf(EL_SVP, "PMC r a %04x (st %c) @ %04x", rPMC.l, + (ssp->emu_status & SSP_PMC_HAVE_ADDR) ? 'm' : 'a', GET_PPC_OFFS()); + if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { + //if (ssp->emu_status & SSP_PMC_SET) + // elprintf(EL_ANOMALY|EL_SVP, "prev PMC not used @ %04x", GET_PPC_OFFS()); + ssp->emu_status |= SSP_PMC_SET; + ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; + return ((rPMC.l << 4) & 0xfff0) | ((rPMC.l >> 4) & 0xf); + } else { + ssp->emu_status |= SSP_PMC_HAVE_ADDR; + return rPMC.l; + } +} + +static void write_PMC(u32 d) +{ + if (ssp->emu_status & SSP_PMC_HAVE_ADDR) { + //if (ssp->emu_status & SSP_PMC_SET) + // elprintf(EL_ANOMALY|EL_SVP, "prev PMC not used @ %04x", GET_PPC_OFFS()); + ssp->emu_status |= SSP_PMC_SET; + ssp->emu_status &= ~SSP_PMC_HAVE_ADDR; + rPMC.h = d; + elprintf(EL_SVP, "PMC w m %04x @ %04x", rPMC.h, GET_PPC_OFFS()); + } else { + ssp->emu_status |= SSP_PMC_HAVE_ADDR; + rPMC.l = d; + elprintf(EL_SVP, "PMC w a %04x @ %04x", rPMC.l, GET_PPC_OFFS()); + } +} + +// 15 +static u32 read_AL(void) +{ + if (*(PC-1) == 0x000f) + elprintf(EL_SVP, "ssp dummy PM assign %08x @ %04x", rPMC.v, GET_PPC_OFFS()); + ssp->emu_status &= ~(SSP_PMC_SET|SSP_PMC_HAVE_ADDR); // ? + return rAL; +} + +static void write_AL(u32 d) +{ + rAL = d; +} + + +typedef u32 (*read_func_t)(void); +typedef void (*write_func_t)(u32 d); + +static read_func_t read_handlers[16] = +{ + read_unknown, read_unknown, read_unknown, read_unknown, // -, X, Y, A + read_unknown, // 4 ST + read_STACK, + read_PC, + read_P, + read_PM0, // 8 + read_PM1, + read_PM2, + read_XST, + read_PM4, // 12 + read_unknown, // 13 gr13 + read_PMC, + read_AL +}; + +static write_func_t write_handlers[16] = +{ + write_unknown, write_unknown, write_unknown, write_unknown, // -, X, Y, A +// write_unknown, // 4 ST + write_ST, // 4 ST (debug hook) + write_STACK, + write_PC, + write_unknown, // 7 P + write_PM0, // 8 + write_PM1, + write_PM2, + write_XST, + write_PM4, // 12 + write_unknown, // 13 gr13 + write_PMC, + write_AL +}; + +// ----------------------------------------------------- +// pointer register handlers + +// +#define ptr1_read(op) ptr1_read_(op&3,(op>>6)&4,(op<<1)&0x18) + +static u32 ptr1_read_(int ri, int isj2, int modi3) +{ + //int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); + u32 mask, add = 0, t = ri | isj2 | modi3; + unsigned char *rp = NULL; + switch (t) + { + // mod=0 (00) + case 0x00: + case 0x01: + case 0x02: return ssp->RAM0[ssp->r0[t&3]]; + case 0x03: return ssp->RAM0[0]; + case 0x04: + case 0x05: + case 0x06: return ssp->RAM1[ssp->r1[t&3]]; + case 0x07: return ssp->RAM1[0]; + // mod=1 (01), "+!" + case 0x08: + case 0x09: + case 0x0a: return ssp->RAM0[ssp->r0[t&3]++]; + case 0x0b: return ssp->RAM0[1]; + case 0x0c: + case 0x0d: + case 0x0e: return ssp->RAM1[ssp->r1[t&3]++]; + case 0x0f: return ssp->RAM1[1]; + // mod=2 (10), "-" + case 0x10: + case 0x11: + case 0x12: rp = &ssp->r0[t&3]; t = ssp->RAM0[*rp]; + if (!(rST&7)) { (*rp)--; return t; } + add = -1; goto modulo; + case 0x13: return ssp->RAM0[2]; + case 0x14: + case 0x15: + case 0x16: rp = &ssp->r1[t&3]; t = ssp->RAM1[*rp]; + if (!(rST&7)) { (*rp)--; return t; } + add = -1; goto modulo; + case 0x17: return ssp->RAM1[2]; + // mod=3 (11), "+" + case 0x18: + case 0x19: + case 0x1a: rp = &ssp->r0[t&3]; t = ssp->RAM0[*rp]; + if (!(rST&7)) { (*rp)++; return t; } + add = 1; goto modulo; + case 0x1b: return ssp->RAM0[3]; + case 0x1c: + case 0x1d: + case 0x1e: rp = &ssp->r1[t&3]; t = ssp->RAM1[*rp]; + if (!(rST&7)) { (*rp)++; return t; } + add = 1; goto modulo; + case 0x1f: return ssp->RAM1[3]; + } + + return 0; + +modulo: + mask = (1 << (rST&7)) - 1; + *rp = (*rp & ~mask) | ((*rp + add) & mask); + return t; +} + +static void ptr1_write(int op, u32 d) +{ + int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); + switch (t) + { + // mod=0 (00) + case 0x00: + case 0x01: + case 0x02: ssp->RAM0[ssp->r0[t&3]] = d; return; + case 0x03: ssp->RAM0[0] = d; return; + case 0x04: + case 0x05: + case 0x06: ssp->RAM1[ssp->r1[t&3]] = d; return; + case 0x07: ssp->RAM1[0] = d; return; + // mod=1 (01), "+!" + // mod=3, "+" + case 0x08: + case 0x09: + case 0x0a: ssp->RAM0[ssp->r0[t&3]++] = d; return; + case 0x0b: ssp->RAM0[1] = d; return; + case 0x0c: + case 0x0d: + case 0x0e: ssp->RAM1[ssp->r1[t&3]++] = d; return; + case 0x0f: ssp->RAM1[1] = d; return; + // mod=2 (10), "-" + case 0x10: + case 0x11: + case 0x12: ssp->RAM0[ssp->r0[t&3]--] = d; CHECK_RPL(); return; + case 0x13: ssp->RAM0[2] = d; return; + case 0x14: + case 0x15: + case 0x16: ssp->RAM1[ssp->r1[t&3]--] = d; CHECK_RPL(); return; + case 0x17: ssp->RAM1[2] = d; return; + // mod=3 (11), "+" + case 0x18: + case 0x19: + case 0x1a: ssp->RAM0[ssp->r0[t&3]++] = d; CHECK_RPL(); return; + case 0x1b: ssp->RAM0[3] = d; return; + case 0x1c: + case 0x1d: + case 0x1e: ssp->RAM1[ssp->r1[t&3]++] = d; CHECK_RPL(); return; + case 0x1f: ssp->RAM1[3] = d; return; + } +} + +static u32 ptr2_read(int op) +{ + int mv = 0, t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18); + switch (t) + { + // mod=0 (00) + case 0x00: + case 0x01: + case 0x02: mv = ssp->RAM0[ssp->r0[t&3]]++; break; + case 0x03: mv = ssp->RAM0[0]++; break; + case 0x04: + case 0x05: + case 0x06: mv = ssp->RAM1[ssp->r1[t&3]]++; break; + case 0x07: mv = ssp->RAM1[0]++; break; + // mod=1 (01) + case 0x0b: mv = ssp->RAM0[1]++; break; + case 0x0f: mv = ssp->RAM1[1]++; break; + // mod=2 (10) + case 0x13: mv = ssp->RAM0[2]++; break; + case 0x17: mv = ssp->RAM1[2]++; break; + // mod=3 (11) + case 0x1b: mv = ssp->RAM0[3]++; break; + case 0x1f: mv = ssp->RAM1[3]++; break; + default: elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: invalid mod in ((rX))? @ %04x", GET_PPC_OFFS()); + return 0; + } + + return ((unsigned short *)svp->iram_rom)[mv]; +} + + +// ----------------------------------------------------- + +#if defined(USE_DEBUGGER) +static void debug_dump2file(const char *fname, void *mem, int len) +{ + FILE *f = fopen(fname, "wb"); + unsigned short *p = mem; + int i; + if (f) { + for (i = 0; i < len/2; i++) p[i] = (p[i]<<8) | (p[i]>>8); + fwrite(mem, 1, len, f); + fclose(f); + for (i = 0; i < len/2; i++) p[i] = (p[i]<<8) | (p[i]>>8); + printf("dumped to %s\n", fname); + } + else + printf("dump failed\n"); +} +#endif + +#ifdef USE_DEBUGGER +static void debug_dump(void) +{ + printf("GR0: %04x X: %04x Y: %04x A: %08x\n", ssp->gr[SSP_GR0].h, rX, rY, ssp->gr[SSP_A].v); + printf("PC: %04x (%04x) P: %08x\n", GET_PC(), GET_PC() << 1, rP.v); + printf("PM0: %04x PM1: %04x PM2: %04x\n", rPM0, rPM1, rPM2); + printf("XST: %04x PM4: %04x PMC: %08x\n", rXST, rPM4, rPMC.v); + printf(" ST: %04x %c%c%c%c, GP0_0 %i, GP0_1 %i\n", rST, rST&SSP_FLAG_N?'N':'n', rST&SSP_FLAG_V?'V':'v', + rST&SSP_FLAG_Z?'Z':'z', rST&SSP_FLAG_L?'L':'l', (rST>>5)&1, (rST>>6)&1); + printf("STACK: %i %04x %04x %04x %04x %04x %04x\n", rSTACK, ssp->stack[0], ssp->stack[1], + ssp->stack[2], ssp->stack[3], ssp->stack[4], ssp->stack[5]); + printf("r0-r2: %02x %02x %02x r4-r6: %02x %02x %02x\n", rIJ[0], rIJ[1], rIJ[2], rIJ[4], rIJ[5], rIJ[6]); + elprintf(EL_SVP, "cycles: %i, emu_status: %x", g_cycles, ssp->emu_status); +} + +static void debug_dump_mem(void) +{ + int h, i; + printf("RAM0\n"); + for (h = 0; h < 32; h++) + { + if (h == 16) printf("RAM1\n"); + printf("%03x:", h*16); + for (i = 0; i < 16; i++) + printf(" %04x", ssp->RAM[h*16+i]); + printf("\n"); + } +} + +static int bpts[10] = { 0, }; + +static void debug(unsigned int pc, unsigned int op) +{ + static char buffo[64] = {0,}; + char buff[64] = {0,}; + int i; + + if (running) { + for (i = 0; i < 10; i++) + if (pc != 0 && bpts[i] == pc) { + printf("breakpoint %i\n", i); + running = 0; + break; + } + } + if (running) return; + + printf("%04x (%02x) @ %04x\n", op, op >> 9, pc<<1); + + while (1) + { + printf("dbg> "); + fflush(stdout); + fgets(buff, sizeof(buff), stdin); + if (buff[0] == '\n') strcpy(buff, buffo); + else strcpy(buffo, buff); + + switch (buff[0]) { + case 0: exit(0); + case 'c': + case 'r': running = 1; return; + case 's': + case 'n': return; + case 'x': debug_dump(); break; + case 'm': debug_dump_mem(); break; + case 'b': { + char *baddr = buff + 2; + i = 0; + if (buff[3] == ' ') { i = buff[2] - '0'; baddr = buff + 4; } + bpts[i] = strtol(baddr, NULL, 16) >> 1; + printf("breakpoint %i set @ %04x\n", i, bpts[i]<<1); + break; + } + case 'd': + sprintf(buff, "iramrom_%04x.bin", last_iram); + debug_dump2file(buff, svp->iram_rom, sizeof(svp->iram_rom)); + debug_dump2file("dram.bin", svp->dram, sizeof(svp->dram)); + break; + default: printf("unknown command\n"); break; + } + } +} +#endif // USE_DEBUGGER + + +void ssp1601_reset(ssp1601_t *l_ssp) +{ + ssp = l_ssp; + ssp->emu_status = 0; + ssp->gr[SSP_GR0].v = 0xffff0000; + rPC = 0x400; + rSTACK = 0; // ? using ascending stack + rST = 0; +} + + +void ssp1601_run(int cycles) +{ + SET_PC(rPC); + + g_cycles = cycles; + + while (g_cycles > 0 && !(ssp->emu_status & SSP_WAIT_MASK)) + { + int op; + u32 tmpv; + + op = *PC++; +#ifdef USE_DEBUGGER + debug(GET_PC()-1, op); +#endif + switch (op >> 9) + { + // ld d, s + case 0x00: + CHECK_B_SET(); + if (op == 0) break; // nop + if (op == ((SSP_A<<4)|SSP_P)) { // A <- P + read_P(); // update P + rA32 = rP.v; + } + else + { + tmpv = REG_READ(op & 0x0f); + REG_WRITE((op & 0xf0) >> 4, tmpv); + } + break; + + // ld d, (ri) + case 0x01: tmpv = ptr1_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // ld (ri), s + case 0x02: tmpv = REG_READ((op & 0xf0) >> 4); ptr1_write(op, tmpv); break; + + // ldi d, imm + case 0x04: CHECK_10f(); tmpv = *PC++; REG_WRITE((op & 0xf0) >> 4, tmpv); g_cycles--; break; + + // ld d, ((ri)) + case 0x05: CHECK_MOD(); tmpv = ptr2_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); g_cycles -= 2; break; + + // ldi (ri), imm + case 0x06: tmpv = *PC++; ptr1_write(op, tmpv); g_cycles--; break; + + // ld adr, a + case 0x07: ssp->RAM[op & 0x1ff] = rA; break; + + // ld d, ri + case 0x09: CHECK_MOD(); tmpv = rIJ[(op&3)|((op>>6)&4)]; REG_WRITE((op & 0xf0) >> 4, tmpv); break; + + // ld ri, s + case 0x0a: CHECK_MOD(); rIJ[(op&3)|((op>>6)&4)] = REG_READ((op & 0xf0) >> 4); break; + + // ldi ri, simm + case 0x0c: + case 0x0d: + case 0x0e: + case 0x0f: rIJ[(op>>8)&7] = op; break; + + // call cond, addr + case 0x24: { + int cond = 0; + CHECK_00f(); + COND_CHECK + if (cond) { int new_PC = *PC++; write_STACK(GET_PC()); SET_PC(new_PC); } + else PC++; + g_cycles--; // always 2 cycles + break; + } + + // ld d, (a) + case 0x25: + CHECK_10f(); + tmpv = ((unsigned short *)svp->iram_rom)[rA]; + REG_WRITE((op & 0xf0) >> 4, tmpv); + g_cycles -= 2; // 3 cycles total + break; + + // bra cond, addr + case 0x26: { + int cond = 0; + CHECK_00f(); + COND_CHECK + if (cond) { int new_PC = *PC++; SET_PC(new_PC); } + else PC++; + g_cycles--; + break; + } + + // mod cond, op + case 0x48: { + int cond = 0; + CHECK_008(); + COND_CHECK + if (cond) { + switch (op & 7) { + case 2: rA32 = (signed int)rA32 >> 1; break; // shr (arithmetic) + case 3: rA32 <<= 1; break; // shl + case 6: rA32 = -(signed int)rA32; break; // neg + case 7: if ((int)rA32 < 0) rA32 = -(signed int)rA32; break; // abs + default: elprintf(EL_SVP|EL_ANOMALY, "ssp FIXME: unhandled mod %i @ %04x", + op&7, GET_PPC_OFFS()); + } + UPD_ACC_ZN + } + break; + } + + // mpys? + case 0x1b: + CHECK_B_CLEAR(); + read_P(); // update P + rA32 -= rP.v; + UPD_ACC_ZN + rX = ptr1_read_(op&3, 0, (op<<1)&0x18); + rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); + break; + + // mpya (rj), (ri), b + case 0x4b: + CHECK_B_CLEAR(); + read_P(); // update P + rA32 += rP.v; + UPD_ACC_ZN + rX = ptr1_read_(op&3, 0, (op<<1)&0x18); + rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); + break; + + // mld (rj), (ri), b + case 0x5b: + CHECK_B_CLEAR(); + rA32 = 0; + rST &= 0x0fff; + rST |= SSP_FLAG_Z; + rX = ptr1_read_(op&3, 0, (op<<1)&0x18); + rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18); + break; + + // OP a, s + case 0x10: CHECK_1f0(); OP_CHECK32(OP_SUBA32); tmpv = REG_READ(op & 0x0f); OP_SUBA(tmpv); break; + case 0x30: CHECK_1f0(); OP_CHECK32(OP_CMPA32); tmpv = REG_READ(op & 0x0f); OP_CMPA(tmpv); break; + case 0x40: CHECK_1f0(); OP_CHECK32(OP_ADDA32); tmpv = REG_READ(op & 0x0f); OP_ADDA(tmpv); break; + case 0x50: CHECK_1f0(); OP_CHECK32(OP_ANDA32); tmpv = REG_READ(op & 0x0f); OP_ANDA(tmpv); break; + case 0x60: CHECK_1f0(); OP_CHECK32(OP_ORA32 ); tmpv = REG_READ(op & 0x0f); OP_ORA (tmpv); break; + case 0x70: CHECK_1f0(); OP_CHECK32(OP_EORA32); tmpv = REG_READ(op & 0x0f); OP_EORA(tmpv); break; + + // OP a, (ri) + case 0x11: CHECK_0f0(); tmpv = ptr1_read(op); OP_SUBA(tmpv); break; + case 0x31: CHECK_0f0(); tmpv = ptr1_read(op); OP_CMPA(tmpv); break; + case 0x41: CHECK_0f0(); tmpv = ptr1_read(op); OP_ADDA(tmpv); break; + case 0x51: CHECK_0f0(); tmpv = ptr1_read(op); OP_ANDA(tmpv); break; + case 0x61: CHECK_0f0(); tmpv = ptr1_read(op); OP_ORA (tmpv); break; + case 0x71: CHECK_0f0(); tmpv = ptr1_read(op); OP_EORA(tmpv); break; + + // OP a, adr + case 0x03: tmpv = ssp->RAM[op & 0x1ff]; OP_LDA (tmpv); break; + case 0x13: tmpv = ssp->RAM[op & 0x1ff]; OP_SUBA(tmpv); break; + case 0x33: tmpv = ssp->RAM[op & 0x1ff]; OP_CMPA(tmpv); break; + case 0x43: tmpv = ssp->RAM[op & 0x1ff]; OP_ADDA(tmpv); break; + case 0x53: tmpv = ssp->RAM[op & 0x1ff]; OP_ANDA(tmpv); break; + case 0x63: tmpv = ssp->RAM[op & 0x1ff]; OP_ORA (tmpv); break; + case 0x73: tmpv = ssp->RAM[op & 0x1ff]; OP_EORA(tmpv); break; + + // OP a, imm + case 0x14: CHECK_IMM16(); tmpv = *PC++; OP_SUBA(tmpv); g_cycles--; break; + case 0x34: CHECK_IMM16(); tmpv = *PC++; OP_CMPA(tmpv); g_cycles--; break; + case 0x44: CHECK_IMM16(); tmpv = *PC++; OP_ADDA(tmpv); g_cycles--; break; + case 0x54: CHECK_IMM16(); tmpv = *PC++; OP_ANDA(tmpv); g_cycles--; break; + case 0x64: CHECK_IMM16(); tmpv = *PC++; OP_ORA (tmpv); g_cycles--; break; + case 0x74: CHECK_IMM16(); tmpv = *PC++; OP_EORA(tmpv); g_cycles--; break; + + // OP a, ((ri)) + case 0x15: CHECK_MOD(); tmpv = ptr2_read(op); OP_SUBA(tmpv); g_cycles -= 2; break; + case 0x35: CHECK_MOD(); tmpv = ptr2_read(op); OP_CMPA(tmpv); g_cycles -= 2; break; + case 0x45: CHECK_MOD(); tmpv = ptr2_read(op); OP_ADDA(tmpv); g_cycles -= 2; break; + case 0x55: CHECK_MOD(); tmpv = ptr2_read(op); OP_ANDA(tmpv); g_cycles -= 2; break; + case 0x65: CHECK_MOD(); tmpv = ptr2_read(op); OP_ORA (tmpv); g_cycles -= 2; break; + case 0x75: CHECK_MOD(); tmpv = ptr2_read(op); OP_EORA(tmpv); g_cycles -= 2; break; + + // OP a, ri + case 0x19: CHECK_MOD(); tmpv = rIJ[IJind]; OP_SUBA(tmpv); break; + case 0x39: CHECK_MOD(); tmpv = rIJ[IJind]; OP_CMPA(tmpv); break; + case 0x49: CHECK_MOD(); tmpv = rIJ[IJind]; OP_ADDA(tmpv); break; + case 0x59: CHECK_MOD(); tmpv = rIJ[IJind]; OP_ANDA(tmpv); break; + case 0x69: CHECK_MOD(); tmpv = rIJ[IJind]; OP_ORA (tmpv); break; + case 0x79: CHECK_MOD(); tmpv = rIJ[IJind]; OP_EORA(tmpv); break; + + // OP simm + case 0x1c: CHECK_B_SET(); OP_SUBA(op & 0xff); break; + case 0x3c: CHECK_B_SET(); OP_CMPA(op & 0xff); break; + case 0x4c: CHECK_B_SET(); OP_ADDA(op & 0xff); break; + case 0x5c: CHECK_B_SET(); OP_ANDA(op & 0xff); break; + case 0x6c: CHECK_B_SET(); OP_ORA (op & 0xff); break; + case 0x7c: CHECK_B_SET(); OP_EORA(op & 0xff); break; + + default: + elprintf(EL_ANOMALY|EL_SVP, "ssp FIXME unhandled op %04x @ %04x", op, GET_PPC_OFFS()); + break; + } + g_cycles--; + } + + rPC = GET_PC(); + read_P(); // update P +} + diff --git a/Mednafen/mednafen/md/cart/ssp16.h b/Mednafen/mednafen/md/cart/ssp16.h new file mode 100644 index 0000000000..ab1b477e21 --- /dev/null +++ b/Mednafen/mednafen/md/cart/ssp16.h @@ -0,0 +1,100 @@ +/* + * basic, incomplete SSP160x (SSP1601?) interpreter + * + * Copyright (c) Gražvydas "notaz" Ignotas, 2008 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the organization nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +// register names +enum { + SSP_GR0, SSP_X, SSP_Y, SSP_A, + SSP_ST, SSP_STACK, SSP_PC, SSP_P, + SSP_PM0, SSP_PM1, SSP_PM2, SSP_XST, + SSP_PM4, SSP_gr13, SSP_PMC, SSP_AL +}; + +typedef union +{ + unsigned int v; + struct { + unsigned short l; + unsigned short h; + }; +} ssp_reg_t; + +typedef struct +{ + union { + unsigned short RAM[256*2]; // 000 2 internal RAM banks + struct { + unsigned short RAM0[256]; + unsigned short RAM1[256]; + }; + }; + ssp_reg_t gr[16]; // 400 general registers + union { + unsigned char r[8]; // 440 BANK pointers + struct { + unsigned char r0[4]; + unsigned char r1[4]; + }; + }; + unsigned short stack[6]; // 448 + unsigned int pmac_read[6]; // 454 read modes/addrs for PM0-PM5 + unsigned int pmac_write[6]; // 46c write ... + // + #define SSP_PMC_HAVE_ADDR 0x0001 // address written to PMAC, waiting for mode + #define SSP_PMC_SET 0x0002 // PMAC is set + #define SSP_WAIT_PM0 0x2000 // bit1 in PM0 + #define SSP_WAIT_30FE06 0x4000 // ssp tight loops on 30FE06 to become non-zero + #define SSP_WAIT_30FE08 0x8000 // same for 30FE06 + #define SSP_WAIT_MASK 0xe000 + unsigned int emu_status; // 484 + /* used by recompiler only: */ + struct { + unsigned int ptr_rom; // 488 + unsigned int ptr_iram_rom; // 48c + unsigned int ptr_dram; // 490 + unsigned int iram_dirty; // 494 + unsigned int iram_context; // 498 + unsigned int ptr_btable; // 49c + unsigned int ptr_btable_iram; // 4a0 + unsigned int tmp0; // 4a4 + unsigned int tmp1; // 4a8 + unsigned int tmp2; // 4ac + } drc; +} ssp1601_t; + + +void ssp1601_reset(ssp1601_t *ssp); +void ssp1601_run(int cycles); + +#ifdef __cplusplus +} +#endif + diff --git a/Mednafen/mednafen/md/cd/cd.cpp b/Mednafen/mednafen/md/cd/cd.cpp new file mode 100644 index 0000000000..1329d059e8 --- /dev/null +++ b/Mednafen/mednafen/md/cd/cd.cpp @@ -0,0 +1,1004 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include +#include +#include +#include +#include "cd.h" +#include "pcm.h" +#include "cdc_cdd.h" +#include "interrupt.h" +#include "timer.h" + +#define READ8of16(value, a) ((value >> ((((a) & 1) ^ 1) << 3)) & 0xFF) + +c68k_struc Sub68K; +static int64 Sub68KCycleCounter; + +static uint8 *BIOS = NULL; // BIOS ROM, 128KiB +static uint8 *PRAM = NULL; // Program RAM, 512KiB +static uint8 *WordRAM = NULL; // Word RAM, 256KiB +static uint8 *BRAM = NULL; // 8KiB, Battery-backed RAM, accessible by sub CPU. +static bool SRES; // Sub CPU Reset. 0 = reset, 1 = run +static bool SBRQ; // Sub CPU Bus Req. + // Write: 0 = cancel, 1 = request + // Read: 0 = Sub CPU "operating"(?), 1 = acknowledge +static bool SACK; + +static uint8 LEDControl; +static bool InPeripheralReset; + +static uint8 MM_WP; // Write protect +static uint8 MM_BK; // R/W only on main. PRAM bank select for the main CPU +static uint8 MM_PM; // R/W only on sub. Priority mode. +static bool MM_MODE; // R/W on main and sub. 0 = 2M mode, 1 = 1M mode +enum +{ + MODE_2M = 0, + MODE_1M = 1, +}; + +static bool MM_DMNA; /* R/W on main, R only on sub. Dependent on MODE: + 2M Mode(0): If set, the main CPU can't access sub CPU word RAM at all. + 1M Mode(1): If set, sends a swap request to sub CPU. Returns 0 when the swap request is done. + */ +static bool MM_RET; /* R on main, R/W on sub. */ + +static uint16 StopWatchCounter; +static int32 StopWatchDiv; + +static uint16 COMM_FLAGS; + +// Both COMM_*[8] arrays are readable by both CPUs. CMD is only writeable by main, STATUS is only writeable by sub. +// Changed to uint8 arrays to simplify handling. +static uint8 COMM_CMD[8 * 2]; +static uint8 COMM_STATUS[8 * 2]; + +#define DEBUGMAIN(format, ...) { printf("MAIN " format, ## __VA_ARGS__); } +#define DEBUGSUB(format, ...) { printf("SUB " format, ## __VA_ARGS__); } + +#define UNDEFMAIN(format, ...) { printf("MAIN Undefined " format, ## __VA_ARGS__); } +#define UNDEFSUB(format, ...) { printf("SUB Undefined " format, ## __VA_ARGS__); } + +//#if 0 +//#define DEBUGMAIN(format, ...) { } +//#define DEBUGSUB(format, ...) + +//#define UNDEFMAIN(format, ...) { } +//#define UNDEFSUB(format, ...) +//#endif + +static void MDCD_MainWrite8(uint32 A, uint8 V) +{ + A &= 0xFFFFFF; + + if(A >= 0x40000) + DEBUGMAIN("Write8: %08x %02x\n", A, V); + + if(A >= 0x20000 && A <= 0x3FFFF) // Sub68k program RAM(banked) + { + if(!SBRQ) + { + UNDEFMAIN("Write8 to PRAM when BUSREQ is not held: %08x:%02x\n",A,V); + } + else + { + uint32 offset = (A & 0x1FFFF) | (MM_BK << 17); + + WRITE_BYTE_MSB(PRAM, offset, V); + } + } + else if(A >= 0x200000 && A <= 0x23FFFF) // Sub68k word RAM(switchable banking/mirroring) + { + if(MM_MODE == MODE_2M) + { + if(MM_DMNA) + { + UNDEFMAIN("Write to WordRAM when DMNA is set to 1: %08x %02x", A, V); + } + else + { + WRITE_BYTE_MSB(WordRAM, A & 0x3FFFF, V); + } + } + else + { + if(A <= 0x21FFFF) + { + uint32 offset = (A & 0x1FFFF) | (MM_RET << 17); + WRITE_BYTE_MSB(WordRAM, offset, V); + } + } + } + else if(A >= 0xa12000 && A <= 0xa120ff) + { + switch(A & 0xFF) + { + default: UNDEFMAIN("Unknown write: %08x %02x\n", A, V); + break; + case 0x00: if(V & 0x1) + MDCD_InterruptAssert(2, TRUE); + break; + case 0x01: + if(SRES != (V & 0x1)) + { + C68k_Reset(&Sub68K); + } + + SRES = V & 0x1; + SBRQ = V & 0x2; + SACK = SBRQ | (!SRES); + break; + + case 0x02: MM_WP = V; + break; + + case 0x03: MM_BK = (V >> 6) & 0x3; + MM_DMNA = (V >> 1) & 0x1; + printf("DMNA: %02x\n", MM_DMNA); + //if(MM_MODE == MODE_1M) + //{ + // if(!MM_DMNA) // Writing 0 to DMNA triggers it + // { + // MM_RET = !MM_RET; + //MM_DMNA = FALSE; + // } + //} + break; + + // CDC registers: + case 0x04 ... 0x0B: + MDCD_CDC_MainWrite8(A & 0xFF, V); + break; + + case 0x0E: COMM_FLAGS &= 0x00FF; + COMM_FLAGS |= V << 8; + break; + case 0x0F: // Unused on main CPU writes + break; + + case 0x10 ... 0x1F: WRITE_BYTE_MSB(COMM_CMD, A & 0xF, V); + break; + case 0x20 ... 0x2F: break; // Unused on main cpu writes + + } + } +} + +static void MDCD_MainWrite16(uint32 A, uint16 V) +{ + A &= 0xFFFFFF; + + if(A >= 0x40000) + DEBUGMAIN("Write16: %08x %04x\n", A, V); + + if(A >= 0x20000 && A <= 0x3FFFF) // Sub68k program RAM(banked) + { + if(!SBRQ) + { + UNDEFMAIN("Write16 to PRAM when BUSREQ is not held: %08x:%04x\n",A,V); + } + else + { + uint32 offset = (A & 0x1FFFF) | (MM_BK << 17); + + WRITE_WORD_MSB(PRAM, offset, V); + } + } + else if(A >= 0x200000 && A <= 0x23FFFF) // Sub68k word RAM(switchable banking/mirroring) + { + if(MM_MODE == MODE_2M) + { + if(MM_DMNA) + { + UNDEFMAIN("Write to WordRAM when DMNA is set to 1: %08x %02x", A, V); + } + else + { + WRITE_WORD_MSB(WordRAM, A & 0x3FFFF, V); + } + } + else + { + if(A <= 0x21FFFF) + { + uint32 offset = (A & 0x1FFFF) | (MM_RET << 17); + WRITE_WORD_MSB(WordRAM, offset, V); + } + } + } + else if(A >= 0xa12000 && A <= 0xa120ff) + { + switch(A & 0xFF) + { + default: UNDEFMAIN("Unknown write: %08x %04x\n", A, V); + break; + + case 0x00: if(V & 0x0100) + MDCD_InterruptAssert(2, TRUE); + + if(SRES != (V & 0x1)) + { + C68k_Reset(&Sub68K); + } + SRES = V & 0x1; + SBRQ = V & 0x2; + SACK = SBRQ | (!SRES); + + break; + + case 0x02: MM_WP = V >> 8; + MM_DMNA = (V >> 1) & 0x1; + MM_BK = (V >> 6) & 0x3; + printf("DMNA: %02x\n", MM_DMNA); + //if(MM_MODE == MODE_1M) + //{ + // if(MM_DMNA) + // { + // MM_RET = !MM_RET; + //MM_DMNA = FALSE; + // } + // } + break; + + // CDC registers: + case 0x04 ... 0x0B: + MDCD_CDC_MainWrite16(A & 0xFF, V); + break; + + case 0x0E: COMM_FLAGS &= 0x00FF; + COMM_FLAGS |= V & 0xFF00; + break; + case 0x10 ... 0x1F: WRITE_WORD_MSB(COMM_CMD, A & 0xF, V); + break; + case 0x20 ... 0x2F: // Unused on main CPU writes + break; + } + } +} + +static uint8 MDCD_MainRead8(uint32 A) +{ + A &= 0xFFFFFF; + + if(A >= 0x40000) + DEBUGMAIN("Read8: %08x\n", A); + + if(A <= 0x1FFFF) // BIOS ROM + { + return(READ_BYTE_MSB(BIOS, A)); + } + else if(A >= 0x20000 && A <= 0x3FFFF) // Sub68k program RAM(banked) + { + if(!SBRQ) + { + UNDEFMAIN("Read8 from PRAM when BUSREQ is not held: %08x\n",A); + } + else + { + uint32 offset = (A & 0x1FFFF) | (MM_BK << 17); + return(READ_BYTE_MSB(PRAM, offset)); + } + } + else if(A >= 0x200000 && A <= 0x23FFFF) // Sub68k word RAM(switchable banking/mirroring) + { + if(MM_MODE == MODE_2M) + { + if(MM_DMNA) + { + UNDEFMAIN("Read8 from WordRAM when DMNA is set to 1: %08x", A); + } + else + { + return(READ_BYTE_MSB(WordRAM, A & 0x3FFFF)); + } + } + else + { + if(A <= 0x21FFFF) + { + uint32 offset = (A & 0x1FFFF) | (MM_RET << 17); + return(READ_BYTE_MSB(WordRAM, offset)); + } + } + } + else if(A >= 0xa12000 && A <= 0xa120ff) + { + uint8 ret = 0; + switch(A & 0xFF) + { + case 0x00: ret |= MDCD_InterruptGetAsserted(2) ? 0x01 : 0x00; + ret |= MDCD_InterruptGetMask(2) ? 0x80 : 0x00; + return(ret); + + case 0x01: ret |= SRES ? 0x1 : 0x0; + ret |= SACK ? 0x2 : 0x0; + return(ret); + + case 0x02: ret = MM_WP; + return(ret); + + case 0x03: ret |= MM_BK << 6; + ret |= MM_MODE ? 0x4 : 0x0; + ret |= MM_DMNA ? 0x2 : 0x0; + ret |= MM_RET ? 0x1 : 0x0; + return(ret); + + // CDC registers: + case 0x04 ... 0x0B: + return(MDCD_CDC_MainRead8(A & 0xFF)); + + // Communications: + case 0x0C: + case 0x0D: return(READ8of16(StopWatchCounter, A & 1)); + + case 0x0E: return(COMM_FLAGS >> 8); + case 0x0F: return(COMM_FLAGS >> 0); + case 0x10 ... 0x1F: return(READ_BYTE_MSB(COMM_CMD, (A & 0xF))); + case 0x20 ... 0x2F: return(READ_BYTE_MSB(COMM_STATUS, (A & 0xF))); + } + } + printf("Unknown main read8: %08x\n", A); + return(0x0); +} + +static uint16 MDCD_MainRead16(uint32 A) +{ + A &= 0xFFFFFF; + + if(A >= 0x40000) + DEBUGMAIN("Read16: %08x\n", A); + + if(A <= 0x1FFFF) // BIOS ROM + { + return(READ_WORD_MSB(BIOS, A)); + } + else if(A >= 0x20000 && A <= 0x3FFFF) // Sub68k program RAM(banked) + { + if(!SBRQ) + { + UNDEFMAIN("Read16 from PRAM when BUSREQ is not held: %08x\n",A); + } + else + { + uint32 offset = (A & 0x1FFFF) | (MM_BK << 17); + return(READ_WORD_MSB(PRAM, offset)); + } + } + else if(A >= 0x200000 && A <= 0x23FFFF) // Sub68k word RAM(switchable banking/mirroring) + { + if(MM_MODE == MODE_2M) + { + if(MM_DMNA) + { + UNDEFMAIN("Read16 from WordRAM when DMNA is set to 1: %08x", A); + } + else + { + return(READ_WORD_MSB(WordRAM, A & 0x3FFFF)); + } + } + else + { + if(A <= 0x21FFFF) + { + uint32 offset = (A & 0x1FFFF) | (MM_RET << 17); + return(READ_WORD_MSB(WordRAM, offset)); + } + } + } + else if(A >= 0xa12000 && A <= 0xa120ff) + { + uint16 ret = 0; + + switch(A & 0xFF) + { + case 0x00: + ret |= MDCD_InterruptGetAsserted(2) ? 0x0100 : 0x0000; + ret |= MDCD_InterruptGetMask(2) ? 0x8000 : 0x0000; + ret |= SRES ? 0x1 : 0x0; + ret |= SACK ? 0x2 : 0x0; + return(ret); + + case 0x02: ret |= MM_WP << 8; + ret |= MM_BK << 6; + ret |= MM_MODE ? 0x4 : 0x0; + ret |= MM_DMNA ? 0x2 : 0x0; + ret |= MM_RET ? 0x1 : 0x0; + return(ret); + + // CDC registers: + case 0x04 ... 0x0B: + return(MDCD_CDC_MainRead16(A & 0xFF)); + + case 0x0C: return(StopWatchCounter); + case 0x0E: return(COMM_FLAGS); + case 0x10 ... 0x1F: return(READ_WORD_MSB(COMM_CMD, (A & 0xF))); + case 0x20 ... 0x2F: return(READ_WORD_MSB(COMM_STATUS, (A & 0xF))); + } + } + + printf("Unknown main Read16: %08x\n", A); + return(0); +} + +////////////////////////////////// +// +// Sub 68K memory map handling: +// +////////////////////////////////// +static void MDCD_SubWrite8(uint32 A, uint8 V) +{ + A &= 0xFFFFFF; + + if(A >= 0x80000) + DEBUGSUB("Write8: %08x %02x\n", A, V); + + if(A <= 0x7FFFF) // Program RAM + { + if((A >> 8) < MM_WP) + { + printf("Oops8: %08x:%02x\n", A, V); + } + else + { + WRITE_BYTE_MSB(PRAM, A, V); + } + } + else if(A >= 0x80000 && A <= 0xBFFFF) // Word RAM + { // 2M mode: full 256KiB + // 1M mode: + if(MM_MODE == MODE_2M) + { + WRITE_BYTE_MSB(WordRAM, A & 0x3FFFF, V); + } + else + { + //uint32 base = ((MM_RET ^ 1) << 17); + + } + } + else if(A >= 0xFE0000 && A <= 0xFE3FFF) //8KiB BRAM mapped into a 16KiB space + { + // Are even bytes open bus, 0, or the same as odd bytes? + if(A & 1) + BRAM[(A & 0x3FFF) >> 1] = V; + else + printf("Invalid write8: %08x:%02x\n", A, V); + } + else if(A >= 0xFE4000 && A <= 0xFEFFFF) //BRAM mirror(read only? unstable? reserved?) + { + printf("Invalid write8: %08x:%02x\n", A, V); + } + else if(A >= 0xFF0000 && A <= 0xFF3FFF) // PCM sound source + { + MDCD_PCM_Write((A >> 1) & 0x1FFF, V); + } + else if(A >= 0xFF4000 && A <= 0xFF7FFF) // PCM sound source mirror(read only? unstable? reserved?) + { + printf("Invalid write8: %08x:%02x\n", A, V); + } + else if(A >= 0xFF8000 && A <= 0xFF81FF) // Registers(as if everything else isn't ;)) + { + // + // Sub cpu registers! + // + switch(A & 0x1FF) + { + default: UNDEFSUB("Unknown write: %08x %02x\n", A, V); + break; + + case 0x00: LEDControl = (V & 0x3); + break; + case 0x01: if(!(V & 0x1)) + InPeripheralReset = TRUE; + break; + + case 0x02: break; // WP, unused on sub cpu writes + case 0x03: MM_PM = (V >> 3) & 0x3; + MM_MODE = (V >> 2) & 0x1; + MM_RET = (V >> 0) & 0x1; + printf("Cha8: %02x\n", V); + break; + + case 0x04 ... 0x0B: + MDCD_CDC_SubWrite8(A & 0x1FF, V); + break; + + case 0x0C: + case 0x0D: StopWatchCounter = 0; + // Should we reset the divider too? + break; + + //case 0x0E: break; // Unused on sub cpu writes. TODO: Investigate Dragon's Lair + case 0x0F: COMM_FLAGS &= 0xFF00; + COMM_FLAGS |= V << 0; + break; + + case 0x10 ... 0x1F: break; // Unused on sub cpu writes + case 0x20 ... 0x2F: WRITE_BYTE_MSB(COMM_STATUS, (A & 0xF), V); + break; + + case 0x30: break; + case 0x31: MDCD_Timer_Write(V); + break; + + case 0x32: break; + case 0x33: MDCD_InterruptWrite(V); + + case 0x34 ... 0x4B: + MDCD_CDD_Write8(A & 0x1FF, V); + break; + + } + } +} + +static void MDCD_SubWrite16(uint32 A, uint16 V) +{ + A &= 0xFFFFFF; + + assert(!(A & 1)); + + if(A >= 0x80000) + DEBUGSUB("Write16: %08x %04x\n", A, V); + + if(A <= 0x7FFFF) // Program RAM + { + if((A >> 8) < MM_WP) + { + printf("Oops16: %08x:%04x\n", A, V); + } + else + { + WRITE_WORD_MSB(PRAM, A, V); + } + } + else if(A >= 0x80000 && A <= 0xBFFFF) // Word RAM + { // 2M mode: full 256KiB + // 1M mode: + if(MM_MODE == MODE_2M) + { + WRITE_WORD_MSB(WordRAM, A & 0x3FFFF, V); + } + else + { + //uint32 base = ((MM_RET ^ 1) << 17); + + } + } + else if(A >= 0xFE0000 && A <= 0xFE3FFF) //8KiB BRAM mapped into a 16KiB space + { + BRAM[(A & 0x3FFF) >> 1] = V & 0xFF; + } + else if(A >= 0xFE4000 && A <= 0xFEFFFF) //BRAM mirror(read only? unstable? reserved?) + { + printf("Invalid write16: %08x:%04x\n", A, V); + } + else if(A >= 0xFF0000 && A <= 0xFF3FFF) // PCM sound source + { + MDCD_PCM_Write((A >> 1) & 0x1FFF, V & 0xFF); + } + else if(A >= 0xFF4000 && A <= 0xFF7FFF) // PCM sound source mirror(read only? unstable? reserved?) + { + printf("Invalid write16: %08x:%04x\n", A, V); + } + else if(A >= 0xFF8000 && A <= 0xFF81FF) // Registers(as if everything else isn't ;)) + { + // + // Sub cpu registers! + // + switch(A & 0x1FF) + { + default: UNDEFSUB("Unknown write: %08x %04x\n", A, V); + break; + + case 0x02: + MM_PM = (V >> 3) & 0x3; + MM_MODE = (V >> 2) & 0x1; + MM_RET = (V >> 0) & 0x1; + printf("Cha16: %04x\n", V); + break; + + case 0x04 ... 0x0B: + MDCD_CDC_SubWrite16(A & 0x1FF, V); + break; + + case 0x0C: StopWatchCounter = 0; + // Should we reset the divider too? + break; + + case 0x0E: + COMM_FLAGS &= 0xFF00; + COMM_FLAGS |= V & 0x00FF; + break; + + case 0x10 ... 0x1F: break; // Unused on sub cpu writes + case 0x20 ... 0x2F: WRITE_WORD_MSB(COMM_STATUS, (A & 0xF), V); + break; + + case 0x30: MDCD_Timer_Write(V & 0xFF); + break; + + case 0x32: MDCD_InterruptWrite(V); + break; + + case 0x34 ... 0x4B: + MDCD_CDD_Write16(A & 0x1FF, V); + break; + } + } +} + +static uint8 MDCD_SubRead8(uint32 A) +{ + A &= 0xFFFFFF; + + if(A >= 0x80000) + DEBUGSUB("Read8: %08x\n", A); + + if(A <= 0x7FFFF) // Program RAM + { + return(READ_BYTE_MSB(PRAM, A)); + } + else if(A >= 0x80000 && A <= 0xBFFFF) // Word RAM + { // 2M mode: full 256KiB + // 1M mode: + if(MM_MODE == MODE_2M) + { + return(READ_BYTE_MSB(WordRAM, A & 0x3FFFF)); + } + else + { + //uint32 base = ((MM_RET ^ 1) << 17); + + } + } + else if(A >= 0xC0000 && A <= 0xDFFFF) // Word RAM. + { // 2M mode: Unmapped + // 1M mode: Selectable + if(MM_MODE == MODE_1M) + { + uint32 offset = (A & 0x1FFFF) | ((MM_RET ^ 1) << 17); + return(READ_BYTE_MSB(WordRAM, offset)); + } + } + else if(A >= 0xFE0000 && A <= 0xFE3FFF) //8KiB BRAM mapped into a 16KiB space + { + // Are even bytes open bus, 0, or the same as odd bytes? + return(BRAM[(A & 0x3FFF) >> 1]); + } + else if(A >= 0xFE4000 && A <= 0xFEFFFF) //BRAM mirror(read only? unstable? reserved?) + { + return(BRAM[(A & 0x3FFF) >> 1]); + } + else if(A >= 0xFF0000 && A <= 0xFF3FFF) // PCM sound source + { + + } + else if(A >= 0xFF4000 && A <= 0xFF7FFF) // PCM sound source mirror(read only? unstable? reserved?) + { + + } + else if(A >= 0xFF8000 && A <= 0xFF81FF) // Registers(as if everything else isn't ;)) + { + // + // Sub cpu registers! + // + uint8 ret = 0; + + switch(A & 0x1FF) + { + case 0x00: ret |= LEDControl << 0; + return(ret); + case 0x01: ret |= 1 << 0; + ret |= 0 << 4; // Version + return(ret); + + case 0x02: return(MM_WP); + case 0x03: ret |= MM_RET << 0; + ret |= MM_DMNA << 1; + ret |= MM_MODE << 2; + ret |= MM_PM << 3; + return(ret); + + case 0x0C: + case 0x0D: return(READ8of16(StopWatchCounter, A & 1)); + + case 0x0E: return(COMM_FLAGS >> 8); + case 0x0F: return(COMM_FLAGS >> 0); + + case 0x10 ... 0x1F: return(READ_BYTE_MSB(COMM_CMD, (A & 0xF))); + case 0x20 ... 0x2F: return(READ_BYTE_MSB(COMM_STATUS, (A & 0xF))); + + case 0x30: break; + case 0x31: return(MDCD_Timer_Read()); + + case 0x32: break; + case 0x33: return(MDCD_InterruptRead()); + } + } + else if(A >= 0xFF8200 && A <= 0xFFFFFF) // Reserved + { + + } + + printf("Unknown Sub read8: %08x\n", A); + + return(0); +} + +static uint16 MDCD_SubRead16(uint32 A) +{ + A &= 0xFFFFFF; + + assert(!(A & 1)); + + if(A >= 0x80000) + DEBUGSUB("Read16: %08x\n", A); + + if(A <= 0x7FFFF) // Program RAM + { + return(READ_WORD_MSB(PRAM, A)); + } + else if(A >= 0x80000 && A <= 0xBFFFF) // Word RAM + { // 2M mode: full 256KiB + // 1M mode: + if(MM_MODE == MODE_2M) + { + return(READ_WORD_MSB(WordRAM, A & 0x3FFFF)); + } + else + { + //uint32 base = ((MM_RET ^ 1) << 17); + + } + } + else if(A >= 0xFE0000 && A <= 0xFE3FFF) //8KiB BRAM mapped into a 16KiB space + { + return(BRAM[(A & 0x3FFF) >> 1]); + } + else if(A >= 0xFE4000 && A <= 0xFEFFFF) //BRAM mirror(read only? unstable? reserved?) + { + return(BRAM[(A & 0x3FFF) >> 1]); + } + else if(A >= 0xFF0000 && A <= 0xFF3FFF) // PCM sound source + { + + } + else if(A >= 0xFF4000 && A <= 0xFF7FFF) // PCM sound source mirror(read only? unstable? reserved?) + { + + } + else if(A >= 0xFF8000 && A <= 0xFF81FF) // Registers(as if everything else isn't ;)) + { + // + // Sub cpu registers! + // + uint16 ret = 0; + + switch(A & 0x1FF) + { + case 0x02: ret = MM_WP << 8; + ret |= MM_RET << 0; + ret |= MM_DMNA << 1; + ret |= MM_MODE << 2; + ret |= MM_PM << 3; + return(ret); + + case 0x0C: return(StopWatchCounter); + case 0x0E: return(COMM_FLAGS); + case 0x10 ... 0x1F: return(READ_WORD_MSB(COMM_CMD, (A & 0xF))); + case 0x20 ... 0x2F: return(READ_WORD_MSB(COMM_STATUS, (A & 0xF))); + case 0x30: return(MDCD_Timer_Read()); + case 0x32: return(MDCD_InterruptRead()); + } + } + else if(A >= 0xFF8200 && A <= 0xFFFFFF) // Reserved + { + + } + + printf("Unknown Sub read16: %08x\n", A); + return(0); +} + +#define SUBCPU_CLOCK 12500000 + +void MDCD_Run(int32 md_master_cycles) +{ + const uint32 md_master_clock = CLOCK_NTSC; + + Sub68KCycleCounter += (int64)md_master_cycles * SUBCPU_CLOCK; + + while(Sub68KCycleCounter > 0) + { + int32 temp_cycles; + + if(MM_MODE) + exit(1); + + if(!SRES || SBRQ) + temp_cycles = 8; + else + { + //printf("Yay: %08x\n", C68k_Get_PC(&Sub68K)); + Sub68K.timestamp = 0; + C68k_Exec(&Sub68K); + temp_cycles = Sub68K.timestamp; + } + MDCD_Timer_Run(temp_cycles); + MDCD_PCM_Run(temp_cycles); + + // Run stop watch + StopWatchDiv -= temp_cycles; + while(StopWatchDiv <= 0) + { + StopWatchCounter = (StopWatchCounter + 1) & 0xFFF; + StopWatchDiv += 384; + } + Sub68KCycleCounter -= (int64)temp_cycles * md_master_clock; + } +} + +static void Cleanup(void) +{ + if(BIOS) + { + MDFN_free(BIOS); + BIOS = NULL; + } + + if(BRAM) + { + MDFN_free(BRAM); + BRAM = NULL; + } + + if(PRAM) + { + MDFN_free(PRAM); + PRAM = NULL; + } + + if(WordRAM) + { + MDFN_free(WordRAM); + WordRAM = NULL; + } +} + +void MDCD_Close(void) +{ + Cleanup(); +} + +static void MDCD_Init(void) +{ + BIOS = (uint8 *)MDFN_calloc_T(1, 0x20000, _("BIOS ROM")); + BRAM = (uint8 *)MDFN_calloc_T(1, 0x2000, _("Battery-backed RAM")); + memset(BRAM, 0xFF, 8192); + + PRAM = (uint8 *)MDFN_calloc_T(1, 0x80000, _("Program RAM")); + + WordRAM = (uint8 *)MDFN_calloc_T(1, 0x40000, _("Word RAM")); + + // Load the BIOS + { + std::string bios_path = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS("md.cdbios")); + FileStream bios_fp(bios_path.c_str(), FileStream::MODE_READ); + + if(bios_fp.size() != 0x20000) + throw MDFN_Error(0, _("BIOS is incorrect size.")); + + bios_fp.read(BIOS, 0x20000); + + bios_fp.close(); + } + + MD_ExtRead8 = MDCD_MainRead8; + MD_ExtRead16 = MDCD_MainRead16; + MD_ExtWrite8 = MDCD_MainWrite8; + MD_ExtWrite16 = MDCD_MainWrite16; + + C68k_Init(&Sub68K, MDCD_InterruptAck); + C68k_Set_ReadB(&Sub68K, MDCD_SubRead8); + C68k_Set_ReadW(&Sub68K, MDCD_SubRead16); + C68k_Set_WriteB(&Sub68K, MDCD_SubWrite8); + C68k_Set_WriteW(&Sub68K, MDCD_SubWrite16); +} + +static int32 CheckValidTrack(CDIF *cdiface, uint8 *sector_buffer) +{ + CDUtility::TOC toc; + bool DTFound = 0; + int32 track; + + cdiface->ReadTOC(&toc); + + for(track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + DTFound = 1; + break; + } + } + + if(DTFound) // Only add the MD5 hash if we were able to find a data track. + { + if(cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1)) + { + if(!memcmp(sector_buffer + 0x100, "SEGA MEGA DRIVE", 15) || !memcmp(sector_buffer + 0x100, "SEGA GENESIS", 12)) + return(track); + } + } + + return(0); +} + +bool MDCD_TestMagic(std::vector *CDInterfaces) +{ + uint8 sector_buffer[2048]; + + return((bool)CheckValidTrack((*CDInterfaces)[0], sector_buffer)); +} + +void MDCD_Load(std::vector *CDInterfaces, md_game_info *ginfo) +{ + try + { + uint8 sector_buffer[2048]; + + if(CheckValidTrack((*CDInterfaces)[0], sector_buffer)) + { + MD_ReadSegaHeader(sector_buffer + 0x100, ginfo); + } + + MDCD_Init(); + } + catch(...) + { + Cleanup(); + throw; + } +} + + +void MDCD_Reset(bool poweron) +{ + if(poweron) + { + memset(PRAM, 0, 0x80000); + memset(WordRAM, 0, 0x40000); + } + + C68k_Reset(&Sub68K); + MDCD_InterruptReset(); + MDCD_PCM_Reset(); + + SRES = 1; + SBRQ = 1; + SACK = 1; + + MM_WP = 0; + MM_BK = 0; + + MM_RET = 1; +} diff --git a/Mednafen/mednafen/md/cd/cd.h b/Mednafen/mednafen/md/cd/cd.h new file mode 100644 index 0000000000..68990ee99a --- /dev/null +++ b/Mednafen/mednafen/md/cd/cd.h @@ -0,0 +1,13 @@ +#ifndef __MDFN_MD_CD_H +#define __MDFN_MD_CD_H + +extern c68k_struc Sub68K; + +void MDCD_Run(int32 md_master_cycles); +void MDCD_PCM_Run(int32 cycles); +void MDCD_Reset(bool poweron); +void MDCD_Load(std::vector *CDInterfaces, md_game_info *); +bool MDCD_TestMagic(std::vector *CDInterfaces); +void MDCD_Close(void); + +#endif diff --git a/Mednafen/mednafen/md/cd/cdc_cdd.cpp b/Mednafen/mednafen/md/cd/cdc_cdd.cpp new file mode 100644 index 0000000000..dc56515117 --- /dev/null +++ b/Mednafen/mednafen/md/cd/cdc_cdd.cpp @@ -0,0 +1,74 @@ +#include "../shared.h" +#include "cd.h" +#include "cdc_cdd.h" + +void MDCD_CDC_MainWrite8(uint32 A, uint8 V) +{ + +} + + +void MDCD_CDC_MainWrite16(uint32 A, uint16 V) +{ + +} + +uint8 MDCD_CDC_MainRead8(uint32 A) +{ + + return 0; +} + +uint16 MDCD_CDC_MainRead16(uint32 A) +{ + + return 0; +} + + +void MDCD_CDC_SubWrite8(uint32 A, uint8 V) +{ + +} + +void MDCD_CDC_SubWrite16(uint32 A, uint16 V) +{ + +} + +uint8 MDCD_CDC_SubRead8(uint32 A) +{ + return 0; +} + +uint16 MDCD_CDC_SubRead16(uint32 A) +{ + return 0; +} + + + + +void MDCD_CDD_Write8(uint32 A, uint8 V) +{ + +} + + +void MDCD_CDD_Write16(uint32 A, uint16 V) +{ + +} + +uint8 MDCD_CDD_Read8(uint32 A) +{ + + return 0; +} + +uint16 MDCD_CDD_Read16(uint32 A) +{ + + return 0; +} + diff --git a/Mednafen/mednafen/md/cd/cdc_cdd.h b/Mednafen/mednafen/md/cd/cdc_cdd.h new file mode 100644 index 0000000000..cbc0b40f4d --- /dev/null +++ b/Mednafen/mednafen/md/cd/cdc_cdd.h @@ -0,0 +1,20 @@ +#ifndef __MDFN_MDCD_CDCCDD_H +#define __MDFN_MDCD_CDCCDD_H + +void MDCD_CDC_MainWrite8(uint32 A, uint8 V); +void MDCD_CDC_MainWrite16(uint32 A, uint16 V); +uint8 MDCD_CDC_MainRead8(uint32 A); +uint16 MDCD_CDC_MainRead16(uint32 A); + +void MDCD_CDC_SubWrite8(uint32 A, uint8 V); +void MDCD_CDC_SubWrite16(uint32 A, uint16 V); +uint8 MDCD_CDC_SubRead8(uint32 A); +uint16 MDCD_CDC_SubRead16(uint32 A); + + +void MDCD_CDD_Write8(uint32 A, uint8 V); +void MDCD_CDD_Write16(uint32 A, uint16 V); +uint8 MDCD_CDD_Read8(uint32 A); +uint16 MDCD_CDD_Read16(uint32 A); + +#endif diff --git a/Mednafen/mednafen/md/cd/interrupt.cpp b/Mednafen/mednafen/md/cd/interrupt.cpp new file mode 100644 index 0000000000..0a05b69b5e --- /dev/null +++ b/Mednafen/mednafen/md/cd/interrupt.cpp @@ -0,0 +1,104 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cd.h" +#include "interrupt.h" + +/* SegaCD interrupt levels: + 6 - Sub-channel buffering completed + 5 - CDC, error correction or buffer completed + 4 - CDD, command reception is completed? + 3 - Timer + 2 - Software int from main CPU + 1 - Graphics operation is completed +*/ + + +static uint32 asserted; +static uint32 InterruptMask; + +static void Rebuild(void) +{ + int pending_level = 0; + uint32 awm = asserted & InterruptMask; + + // Level 0 doesn't exist per-se. + // Level 7 doesn't seem to be used on the SegaCD + for(int i = 6; i > 0; i--) + { + if(awm & (1 << i)) + { + pending_level = i; + break; + } + } + + C68k_Set_IRQ(&Sub68K, pending_level); +} + +uint8 MDCD_InterruptRead(void) +{ + return(InterruptMask); +} + +bool MDCD_InterruptGetMask(int level) +{ + return((InterruptMask >> level) & 1); +} + +bool MDCD_InterruptGetAsserted(int level) +{ + return((asserted >> level) & 1); +} + +void MDCD_InterruptWrite(uint8 V) +{ + InterruptMask = V & 0x7E; + Rebuild(); +} + +int MDCD_InterruptAck(int level) +{ + printf("Interrupt: %d\n", level); + + asserted &= ~(1 << level); + Rebuild(); + + return(C68K_INT_ACK_AUTOVECTOR); +} + +void MDCD_InterruptAssert(int level, bool status) +{ + assert(status == 0 || status == 1); + + asserted &= ~(1 << level); + asserted |= status << level; + Rebuild(); +} + +void MDCD_InterruptReset(void) +{ + asserted = 0; + Rebuild(); +} + +void MDCD_InterruptInit(void) +{ + + +} diff --git a/Mednafen/mednafen/md/cd/interrupt.h b/Mednafen/mednafen/md/cd/interrupt.h new file mode 100644 index 0000000000..ab7b8f7dcc --- /dev/null +++ b/Mednafen/mednafen/md/cd/interrupt.h @@ -0,0 +1,13 @@ +#ifndef __MDFN_MDCD_INTERRUPT_H +#define __MDFN_MDCD_INTERRUPT_H + +bool MDCD_InterruptGetMask(int level); +bool MDCD_InterruptGetAsserted(int level); +int MDCD_InterruptAck(int level); +void MDCD_InterruptAssert(int level, bool status); +void MDCD_InterruptReset(void); + +uint8 MDCD_InterruptRead(void); +void MDCD_InterruptWrite(uint8 V); + +#endif diff --git a/Mednafen/mednafen/md/cd/pcm.cpp b/Mednafen/mednafen/md/cd/pcm.cpp new file mode 100644 index 0000000000..3e74797ad9 --- /dev/null +++ b/Mednafen/mednafen/md/cd/pcm.cpp @@ -0,0 +1,181 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cd.h" +#include "pcm.h" + +static bool IC_On; // Set by D7 of writes to 0x0007. +static uint8 WB; // Wave bank select. Set by the lower 4 bits of writes to 0x0007 when D6 is clear. +static uint8 CB; // Channel select. Set by the lower 3 bits of wries to 0x0007 when D6 is set. +static uint8 ChannelOn; // Register 0x0008, on/off register for each of the 8 channels +static uint8 WaveData[0x10000]; // 64KiB of waveform data +typedef struct +{ + uint32 Counter; // Address counter. The lower 11 bits are the fractional component. + uint8 ENV; // 0x0000 + uint8 PAN; // 0x0001. Upper 4 bits affect R output, lower 4 bits affect L output. + uint16 FD; // FDL(0x0002) and FDH(0x0003) Controls the incrementing of the address counter. + uint16 LS; // LSL(0x0004) and LSH(0x0005) When 0xFF(stop data) is read from waveform memory, + // the address counter will be reloaded with this value. + uint8 ST; // 0x0006 + // Upper 8-bits of the channel's read address are set to when a channel is enabled(the lower 8 bits are set to 0). + +} pcm_channel_t; + +static pcm_channel_t Channels[8]; + + +// Last timestamp +//static int32 last_ts; + +// Divide by (4 * 384) counter +static int32 div_count; + +static void PCM_Clock(void); +static void MDCD_PCM_Update(void); + +void MDCD_PCM_Write(uint32 A, uint8 V) +{ + A &= 0x1FFF; + + MDCD_PCM_Update(); + + if(A >= 0x1000) + { + WaveData[(WB << 12) | (A & 0x0FFF)] = V; + } + else switch(A) + { + case 0x00: Channels[CB].ENV = V; + break; + + case 0x01: Channels[CB].PAN = V; + break; + + case 0x02: Channels[CB].FD &= 0xFF00; + Channels[CB].FD |= V << 0; + break; + + case 0x03: Channels[CB].FD &= 0x00FF; + Channels[CB].FD |= V << 8; + break; + + case 0x04: Channels[CB].LS &= 0xFF00; + Channels[CB].LS |= V << 0; + break; + + case 0x05: Channels[CB].LS &= 0x00FF; + Channels[CB].LS |= V << 8; + break; + + case 0x06: Channels[CB].ST = V; + break; + + case 0x07: IC_On = V & 0x80; + if(V & 0x40) + CB = V & 0x7; + else + WB = V & 0xF; + break; + + case 0x08: ChannelOn = V; + break; + } +} + +static void PCM_Clock(void) +{ + int32 left = 0; + int32 right = 0; + + for(int ch = 0; ch < 8; ch++) + { + pcm_channel_t *CurChan = &Channels[ch]; + + if(!IC_On) + { + CurChan->Counter = CurChan->ST << (8 + 11); + } + else + { + uint8 tmp_sample; + + CurChan->Counter += CurChan->FD; + tmp_sample = WaveData[(CurChan->Counter >> 11) & 0xFFFF]; + + if(tmp_sample == 0xFF) + { + CurChan->Counter = CurChan->LS << 11; + } + } + int32 sample = WaveData[(CurChan->Counter >> 11) & 0xFFFF]; + + if(sample & 0x80) + sample = -(sample & 0x7F); + + sample *= CurChan->ENV; + + if(ChannelOn & (1 << ch)) + { + left += (sample * (CurChan->PAN & 0x0F)) >> 4; + right += (sample * ((CurChan->PAN >> 4) & 0x0F)) >> 4; + } + } + + if(left < -0x8000) + left = -0x8000; + if(left > 0x7FFF) + left = 0x7FFF; + + if(right < -0x8000) + right = -0x8000; + if(right > 0x7FFF) + right = 0x7FFF; +} + +void MDCD_PCM_Run(int32 cycles) +{ + div_count -= cycles; + while(div_count <= 0) + { + PCM_Clock(); + div_count += 384; + } +} + +void MDCD_PCM_Update(void) +{ + #if 0 + int32 cycles = md_cd_timestamp - last_ts; + + + last_ts = md_cd_timestamp; + #endif +} + +void MDCD_PCM_Reset(void) +{ + IC_On = 0; + WB = 0; + CB = 0; + ChannelOn = 0; + + + memset(WaveData, 0, sizeof(WaveData)); + memset(Channels, 0, sizeof(Channels)); +} diff --git a/Mednafen/mednafen/md/cd/pcm.h b/Mednafen/mednafen/md/cd/pcm.h new file mode 100644 index 0000000000..cea67ce779 --- /dev/null +++ b/Mednafen/mednafen/md/cd/pcm.h @@ -0,0 +1,7 @@ +#ifndef __MDFN_MD_PCM_H +#define __MDFN_MD_PCM_H + +void MDCD_PCM_Write(uint32 A, uint8 V); +void MDCD_PCM_Reset(void); + +#endif diff --git a/Mednafen/mednafen/md/cd/timer.cpp b/Mednafen/mednafen/md/cd/timer.cpp new file mode 100644 index 0000000000..e9265ea818 --- /dev/null +++ b/Mednafen/mednafen/md/cd/timer.cpp @@ -0,0 +1,61 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "cd.h" +#include "timer.h" +#include "interrupt.h" + +static uint8 TimerLatch; +static int32 TimerDiv; + +void MDCD_Timer_Reset(void) +{ + TimerLatch = 0; + TimerDiv = 0; + MDCD_InterruptAssert(3, FALSE); +} + +void MDCD_Timer_Run(int32 clocks) +{ + TimerDiv -= clocks; + + while(TimerDiv <= 0) + { + if(TimerLatch) + { + TimerLatch--; + if(!TimerLatch) + { + MDCD_InterruptAssert(3, TRUE); + } + } + TimerDiv += 384; + } +} + + +void MDCD_Timer_Write(uint8 V) +{ + TimerLatch = V; + // Should we cancel a pending interrupt on writes(or writes of 0)? +} + +uint8 MDCD_Timer_Read(void) +{ + return(TimerLatch); +} diff --git a/Mednafen/mednafen/md/cd/timer.h b/Mednafen/mednafen/md/cd/timer.h new file mode 100644 index 0000000000..0ed5fbb485 --- /dev/null +++ b/Mednafen/mednafen/md/cd/timer.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_MDCD_TIMER_H +#define __MDFN_MDCD_TIMER_H + +void MDCD_Timer_Reset(void); +void MDCD_Timer_Run(int32 clocks); +void MDCD_Timer_Write(uint8 V); +uint8 MDCD_Timer_Read(void); + +#endif diff --git a/Mednafen/mednafen/md/debug.cpp b/Mednafen/mednafen/md/debug.cpp new file mode 100644 index 0000000000..cc8c265172 --- /dev/null +++ b/Mednafen/mednafen/md/debug.cpp @@ -0,0 +1,476 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "shared.h" +#include "debug.h" +#include + +namespace MDFN_IEN_MD +{ +bool MD_DebugMode = FALSE; + +static void (*DriverCPUHook)(uint32, bool) = NULL; +static bool DriverCPUHookContinuous = false; + +static c68k_struc Main68K_BP; +static bool BPActive = FALSE; // Any breakpoints on? +static bool BPNonPCActive = FALSE; // Any breakpoints other than PC on? +static bool FoundBPoint; + +typedef struct +{ + uint32 A[2]; + int type; +} MD_BPOINT; + +static std::vector BreakPointsPC, BreakPointsRead, BreakPointsWrite; +static std::vector BreakPointsAux0Read, BreakPointsAux0Write; + +enum +{ + C68K_GSREG_PC = 0, + C68K_GSREG_SR, + + C68K_GSREG_D0, + C68K_GSREG_D7 = C68K_GSREG_D0 + 7, + + C68K_GSREG_A0, + C68K_GSREG_A7 = C68K_GSREG_A0 + 7, + + +}; + + +static uint32 M68K_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 ret = 0xDEADBEEF; + + if(id == C68K_GSREG_PC) + { + ret = C68k_Get_PC(&Main68K); + } + else if(id == C68K_GSREG_SR) + { + ret = C68k_Get_SR(&Main68K); + } + else if(id >= C68K_GSREG_D0 && id <= C68K_GSREG_D7) + { + ret = C68k_Get_DReg(&Main68K, id - C68K_GSREG_D0); + } + else if(id >= C68K_GSREG_A0 && id <= C68K_GSREG_A7) + { + ret = C68k_Get_AReg(&Main68K, id - C68K_GSREG_A0); + } + return(ret); +} + +void M68K_SetRegister(const unsigned int id, uint32 value) +{ + if(id == C68K_GSREG_PC) + { + C68k_Set_PC(&Main68K, value); + } +} + + +static RegType M68K_Regs[] = +{ + { C68K_GSREG_PC, "PC", "Program Counter", 4 }, + + { 0, "------", "", 0xFFFF }, + + { C68K_GSREG_D0 + 0, "D0", "D0(Data Register 0)", 4 }, + { C68K_GSREG_D0 + 1, "D1", "D1(Data Register 1)", 4 }, + { C68K_GSREG_D0 + 2, "D2", "D2(Data Register 2)", 4 }, + { C68K_GSREG_D0 + 3, "D3", "D3(Data Register 3)", 4 }, + { C68K_GSREG_D0 + 4, "D4", "D4(Data Register 4)", 4 }, + { C68K_GSREG_D0 + 5, "D5", "D5(Data Register 5)", 4 }, + { C68K_GSREG_D0 + 6, "D6", "D6(Data Register 6)", 4 }, + { C68K_GSREG_D0 + 7, "D7", "D7(Data Register 7)", 4 }, + + { 0, "------", "", 0xFFFF }, + + { C68K_GSREG_A0 + 0, "A0", "A0(Address Register 0)", 4 }, + { C68K_GSREG_A0 + 1, "A1", "A1(Address Register 1)", 4 }, + { C68K_GSREG_A0 + 2, "A2", "A2(Address Register 2)", 4 }, + { C68K_GSREG_A0 + 3, "A3", "A3(Address Register 3)", 4 }, + { C68K_GSREG_A0 + 4, "A4", "A4(Address Register 4)", 4 }, + { C68K_GSREG_A0 + 5, "A5", "A5(Address Register 5)", 4 }, + { C68K_GSREG_A0 + 6, "A6", "A6(Address Register 6)", 4 }, + { C68K_GSREG_A0 + 7, "A7", "A7/USP(Address Register 7 / User Stack Pointer)", 4 }, + + { 0, "------", "", 0xFFFF }, + { C68K_GSREG_SR, "SR", "Status Register", 2 }, + + { 0, "", "", 0 }, +}; + +static RegGroupType M68K_RegsGroup = +{ + "M68K", + M68K_Regs, + M68K_GetRegister, + M68K_SetRegister +}; + + +uint32 MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ret = 0; + + MD_HackyHackyMode++; + + for(unsigned int i = 0; i < bsize; i++) + { + A &= 0xFFFFFF; + ret |= MD_ReadMemory8(A) << ((bsize - 1 - i) * 8); + + A++; + } + + MD_HackyHackyMode--; + return(ret); +} + +static uint16_t dis_callb(uint32_t A, void *private_data) +{ + return(MD_ReadMemory16(A & 0xFFFFFF)); +} + +void Disassemble(uint32 &a, uint32 SpecialA, char *TextBuf) +{ + DESA68parm_t d; + + a &= 0xFFFFFE; + + //printf("Disassemble %06x: ", a); + + strcpy(TextBuf, "Invalid"); + memset(&d, 0, sizeof(DESA68parm_t)); + + d.mem_callb = dis_callb; + d.memmsk = 0xFFFFFF; + d.pc = a; + d.str = TextBuf; + d.strmax = 255; // FIXME, MDFN API change + + MD_HackyHackyMode++; + desa68(&d); + MD_HackyHackyMode--; + + a = d.pc & 0xFFFFFF; + + if(d.pc & 1) + puts("Oops"); + + if(!d.status) + strcpy(TextBuf, "Invalid"); + //printf("%d\n", d.status); +// puts(TextBuf); +} + +static inline void C68k_Copy_State2(const c68k_struc *source, c68k_struc *dest) +{ + memcpy(&dest->D[0], &source->D[0], ((uint8 *)&(source->dirty1)) - ((uint8 *)&(source->D[0]))); +} + +void MDDBG_CPUHook(void) //uint32 PC, uint16 op) +{ + uint32 PC = C68k_Get_PC(&Main68K); + std::vector::iterator bpit; + + FoundBPoint = 0; + + for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) + { + if(PC >= bpit->A[0] && PC <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + + if(BPNonPCActive) + { + MD_HackyHackyMode++; + + C68k_Copy_State2(&Main68K, &Main68K_BP); + + //printf("Moo: %08x\n", C68k_Get_PC(&Main68K_BP)); //, (int)(((uint8 *)&(Main68K.dirty1)) - ((uint8 *)&(Main68K.D[0])))); + + C68k_Exec(&Main68K_BP); + + MD_HackyHackyMode--; + } + + DriverCPUHookContinuous |= FoundBPoint; + + if(DriverCPUHookContinuous && DriverCPUHook) + DriverCPUHook(PC, FoundBPoint); +} + +static void RedoCPUHook(void) +{ + //C68k_Set_Debug(&Main68K, DriverCPUHook ? CPUHookHandler : NULL); + + BPNonPCActive = BreakPointsRead.size() || BreakPointsWrite.size() || BreakPointsAux0Read.size() || BreakPointsAux0Write.size(); + BPActive = BPNonPCActive || BreakPointsPC.size(); + + MD_DebugMode = (DriverCPUHook || BPActive); +} + +static void AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + MD_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type = type; + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_IO_READ) + BreakPointsAux0Read.push_back(tmp); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.push_back(tmp); + else if(type == BPOINT_PC) + BreakPointsPC.push_back(tmp); + + RedoCPUHook(); +} + + +void FlushBreakPoints(int type) +{ + std::vector::iterator bpit; + + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.clear(); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.clear(); + else if(type == BPOINT_PC) + BreakPointsPC.clear(); + + RedoCPUHook(); +} + +void SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + DriverCPUHook = callb; + DriverCPUHookContinuous = continuous; + RedoCPUHook(); +} + +static void EnableBranchTrace(bool enable) +{ + +} + +std::vector GetBranchTrace(void) +{ + std::vector ret; + + return(ret); +} + +static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + MD_HackyHackyMode++; + + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFFFF; + *Buffer = MD_ReadMemory8(Address); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + *Buffer = MD_ReadMemory8((Address & 0xFFFF) | 0xFF0000); + Address++; + Buffer++; + } + } + + MD_HackyHackyMode--; +} + +static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFFFF; + } + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + MD_WriteMemory8((Address & 0xFFFF) | 0xFF0000, *Buffer); + Address++; + Buffer++; + } + } +} + +static int dbg_int_ack_callback(int int_level) +{ + return C68K_INT_ACK_AUTOVECTOR; +} + +static uint8 MDDBG_ReadMemory8(uint32 address) +{ + std::vector::iterator bpit; + address &= 0xFFFFFF; + + for(bpit = BreakPointsRead.begin(); bpit != BreakPointsRead.end(); bpit++) + { + if(address >= bpit->A[0] && address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + + + return(MD_ReadMemory8(address)); +} + +static uint16 MDDBG_ReadMemory16(uint32 address) +{ + std::vector::iterator bpit; + + address &= 0xFFFFFF; + + for(bpit = BreakPointsRead.begin(); bpit != BreakPointsRead.end(); bpit++) + { + if((address | 1) >= bpit->A[0] && address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + + //printf("Read: %08x\n", address); + + return(MD_ReadMemory16(address)); +} + +static void MDDBG_WriteMemory8(uint32 address, uint8 value) +{ + std::vector::iterator bpit; + + address &= 0xFFFFFF; + + for(bpit = BreakPointsWrite.begin(); bpit != BreakPointsWrite.end(); bpit++) + { + if(address >= bpit->A[0] && address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + + + +} + +static void MDDBG_WriteMemory16(uint32 address, uint16 value) +{ + std::vector::iterator bpit; + + address &= 0xFFFFFF; + + + for(bpit = BreakPointsWrite.begin(); bpit != BreakPointsWrite.end(); bpit++) + { + if((address | 1) >= bpit->A[0] && address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + + +} + + + +bool MDDBG_Init(void) +{ + MDFNDBG_AddRegGroup(&M68K_RegsGroup); + + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "cpu", "CPU Physical", 24); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ram", "Work RAM", 16); + + + C68k_Init(&Main68K_BP, dbg_int_ack_callback); + + C68k_Set_TAS_Hack(&Main68K_BP, 1); + + C68k_Set_ReadB(&Main68K_BP, MDDBG_ReadMemory8); + C68k_Set_ReadW(&Main68K_BP, MDDBG_ReadMemory16); + + C68k_Set_WriteB(&Main68K_BP, MDDBG_WriteMemory8); + C68k_Set_WriteW(&Main68K_BP, MDDBG_WriteMemory16); + + MD_DebugMode = FALSE; + + return(TRUE); +} + +DebuggerInfoStruct DBGInfo = +{ + "shift_jis", + 10, // Max instruction size(bytes) + 2, // Instruction alignment(bytes) + 24, // Logical address bits + 24, // Physical address bits + 0xFF0000, // Default watch address + ~0U, // ZP + + MemPeek, + Disassemble, + NULL, + NULL, // IRQ, + NULL, // NESDBG_GetVector, + FlushBreakPoints, + AddBreakPoint, + SetCPUCallback, + EnableBranchTrace, + GetBranchTrace, + NULL, //SetGraphicsDecode, + NULL, //GetGraphicsDecodeBuffer, + NULL, //SetLogFunc, +}; + + + +}; diff --git a/Mednafen/mednafen/md/debug.h b/Mednafen/mednafen/md/debug.h new file mode 100644 index 0000000000..59fc01d35b --- /dev/null +++ b/Mednafen/mednafen/md/debug.h @@ -0,0 +1,20 @@ +#ifndef __MDFN_MD_DEBUG_H +#define __MDFN_MD_DEBUG_H + +#ifdef WANT_DEBUGGER +namespace MDFN_IEN_MD +{ + + +extern DebuggerInfoStruct DBGInfo; +bool MDDBG_Init(void); +void MDDBG_CPUHook(void); + +extern bool MD_DebugMode; + + +}; + +#endif + +#endif diff --git a/Mednafen/mednafen/md/genesis.cpp b/Mednafen/mednafen/md/genesis.cpp new file mode 100644 index 0000000000..16ec58ad36 --- /dev/null +++ b/Mednafen/mednafen/md/genesis.cpp @@ -0,0 +1,130 @@ +/* + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#include "shared.h" + +namespace MDFN_IEN_MD +{ + +uint8 (*MD_ExtRead8)(uint32 address) = NULL; +uint16 (*MD_ExtRead16)(uint32 address) = NULL; +void (*MD_ExtWrite8)(uint32 address, uint8 value) = NULL; +void (*MD_ExtWrite16)(uint32 address, uint16 value) = NULL; + +alignas(8) uint8 work_ram[0x10000]; /* 68K work RAM */ +alignas(8) uint8 zram[0x2000]; /* Z80 work RAM */ +uint8 zbusreq; /* /BUSREQ from Z80 */ +uint8 zreset; /* /RESET to Z80 */ +uint8 zbusack; /* /BUSACK to Z80 */ +uint8 zirq; /* /IRQ to Z80 */ +uint32 zbank; /* Address of Z80 bank window */ + +uint8 gen_running; + +c68k_struc Main68K; +MDVDP MainVDP; + +/*--------------------------------------------------------------------------*/ +/* Init, reset, shutdown functions */ +/*--------------------------------------------------------------------------*/ +int vdp_int_ack_callback(int int_level) +{ + return(MainVDP.IntAckCallback(int_level)); +} + +void gen_init(void) +{ + C68k_Init(&Main68K, vdp_int_ack_callback); + C68k_Set_TAS_Hack(&Main68K, 1); + + C68k_Set_ReadB(&Main68K, MD_ReadMemory8); + C68k_Set_ReadW(&Main68K, MD_ReadMemory16); + + C68k_Set_WriteB(&Main68K, MD_WriteMemory8); + C68k_Set_WriteW(&Main68K, MD_WriteMemory16); +} + +void gen_reset(bool poweron) +{ + /* Clear RAM */ + if(poweron) + { + memset(work_ram, 0, sizeof(work_ram)); + memset(zram, 0, sizeof(zram)); + } + + gen_running = 1; + zreset = 0; /* Z80 is reset */ + zbusreq = 0; /* Z80 has control of the Z bus */ + zbusack = 1; /* Z80 is busy using the Z bus */ + zbank = 0; /* Assume default bank is 000000-007FFF */ + zirq = 0; /* No interrupts occuring */ + + if(poweron) + { + gen_io_reset(); + } + + C68k_Reset(&Main68K); + z80_reset(); +} + +void gen_shutdown(void) +{ + +} + +/*--------------------------------------------------------------------------*/ +/* Bus controller chip functions */ +/*--------------------------------------------------------------------------*/ + +int gen_busack_r(void) +{ + //printf("busack_r: %d, %d\n", zbusack, md_timestamp); + return (zbusack & 1); +} + +void gen_busreq_w(int state) +{ + //printf("BUSREQ: %d, %d, %d\n", state, md_timestamp, scanline); + zbusreq = (state & 1); + zbusack = 1 ^ (zbusreq & zreset); +} + +void gen_reset_w(int state) +{ + //printf("ZRESET: %d, %d\n", state, md_timestamp); + zreset = (state & 1); + zbusack = 1 ^ (zbusreq & zreset); + + MDSound_SetYM2612Reset(!zreset); + + if(zreset == 0) + { + z80_reset(); + } +} + + +void gen_bank_w(int state) +{ + zbank = ((zbank >> 1) | ((state & 1) << 23)) & 0xFF8000; +} + +} diff --git a/Mednafen/mednafen/md/genesis.h b/Mednafen/mednafen/md/genesis.h new file mode 100644 index 0000000000..0e71641c3c --- /dev/null +++ b/Mednafen/mednafen/md/genesis.h @@ -0,0 +1,41 @@ + +#ifndef _GENESIS_H_ +#define _GENESIS_H_ + +namespace MDFN_IEN_MD +{ + +extern uint8 (*MD_ExtRead8)(uint32 address); +extern uint16 (*MD_ExtRead16)(uint32 address); +extern void (*MD_ExtWrite8)(uint32 address, uint8 value); +extern void (*MD_ExtWrite16)(uint32 address, uint16 value); + +class MDVDP; + +/* Global variables */ +alignas(8) extern uint8 work_ram[0x10000]; +alignas(8) extern uint8 zram[0x2000]; +extern uint8 zbusreq; +extern uint8 zbusack; +extern uint8 zreset; +extern uint8 zirq; +extern uint32 zbank; +extern uint8 gen_running; +extern c68k_struc Main68K; +extern MDVDP MainVDP; + +/* Function prototypes */ +void gen_init(void); +void gen_reset(bool poweron); +void gen_shutdown(void); +int gen_busack_r(void); +void gen_busreq_w(int state); +void gen_reset_w(int state); +void gen_bank_w(int state); +int z80_irq_callback(int param); +void m68k_irq_ack_callback(int int_level); + +} + +#endif /* _GEN_H_ */ + diff --git a/Mednafen/mednafen/md/genio.cpp b/Mednafen/mednafen/md/genio.cpp new file mode 100644 index 0000000000..c3cf0e5728 --- /dev/null +++ b/Mednafen/mednafen/md/genio.cpp @@ -0,0 +1,469 @@ +/* + genio.c + I/O controller chip emulation +*/ + +#include "shared.h" +#include "input/gamepad.h" +#include "input/megamouse.h" +#include "input/multitap.h" +#include "input/4way.h" + +namespace MDFN_IEN_MD +{ + +static bool is_pal; +static bool is_overseas; +static bool is_overseas_reported; +static bool is_pal_reported; + +// 3 internal ports +enum port_names {PORT_A = 0, PORT_B, PORT_C, PORT_MAX}; + +static MD_Input_Device *port[PORT_MAX] = { NULL }; + +static uint8* data_ptr[8]; +static MD_Input_Device *InputDevice[8] = { NULL }; +static MD_Multitap* MultitapDevice[2] = { NULL }; +static MD_4Way* Way4Device = NULL; +static unsigned MultitapEnabled; +static MD_Input_Device* DummyDevice = nullptr; + +static const std::vector InputDeviceInfo = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + { + "gamepad2", + "2-Button Gamepad", + NULL, + Gamepad2IDII + }, + + { + "gamepad", + "3-Button Gamepad", + NULL, + GamepadIDII + }, + + { + "gamepad6", + "6-Button Gamepad", + NULL, + Gamepad6IDII + }, + + { + "megamouse", + "Sega Mega Mouse", + NULL, + MegaMouseIDII + }, + +}; + +const std::vector MDPortInfo = +{ + { "port1", "Virtual Port 1", InputDeviceInfo, "gamepad" }, + { "port2", "Virtual Port 2", InputDeviceInfo, "gamepad" }, + { "port3", "Virtual Port 3", InputDeviceInfo, "gamepad" }, + { "port4", "Virtual Port 4", InputDeviceInfo, "gamepad" }, + { "port5", "Virtual Port 5", InputDeviceInfo, "gamepad" }, + { "port6", "Virtual Port 6", InputDeviceInfo, "gamepad" }, + { "port7", "Virtual Port 7", InputDeviceInfo, "gamepad" }, + { "port8", "Virtual Port 8", InputDeviceInfo, "gamepad" } +}; + +static void UpdateBusThing(const int32 master_timestamp); + +static void RebuildPortMap(void) +{ + for(unsigned pp = 0, vp = 0; pp < 2; pp++) + { + MD_Input_Device* nd = nullptr; + + if(MultitapEnabled == MTAP_TP_DUAL || (pp == 0 && MultitapEnabled == MTAP_TP_PRT1) || (pp == 1 && MultitapEnabled == MTAP_TP_PRT2)) + { + nd = MultitapDevice[pp]; + for(unsigned i = 0; i < 4; i++) + { + MultitapDevice[pp]->SetSubPort(i, InputDevice[vp] ? InputDevice[vp] : DummyDevice); + vp++; + } + } + else if(MultitapEnabled == MTAP_4WAY) + { + nd = Way4Device->GetShim(pp); + + if(!pp) + { + for(unsigned i = 0; i < 4; i++) + { + Way4Device->SetSubPort(i, InputDevice[vp] ? InputDevice[vp] : DummyDevice); + vp++; + } + } + } + else + { + nd = InputDevice[vp] ? InputDevice[vp] : DummyDevice; + vp++; + } + + if(port[pp] != nd) + { + port[pp] = nd; + port[pp]->Power(); + } + } + + port[2] = DummyDevice; +} + +void MDIO_Init(bool overseas, bool PAL, bool overseas_reported, bool PAL_reported) +{ + MultitapEnabled = false; + + is_overseas = overseas; + is_pal = PAL; + is_overseas_reported = overseas_reported; + is_pal_reported = PAL_reported; + + DummyDevice = new MD_Input_Device(); + + Way4Device = new MD_4Way(); + + for(unsigned i = 0; i < 2; i++) + MultitapDevice[i] = new MD_Multitap(); + + for(unsigned i = 0; i < 8; i++) + InputDevice[i] = nullptr; + + RebuildPortMap(); + + UpdateBusThing(md_timestamp); +} + +void MDIO_Kill(void) +{ + if(DummyDevice) + { + delete DummyDevice; + DummyDevice = nullptr; + } + + if(Way4Device) + { + delete Way4Device; + Way4Device = nullptr; + } + + for(unsigned i = 0; i < 2; i++) + { + if(MultitapDevice[i]) + { + delete MultitapDevice[i]; + MultitapDevice[i] = nullptr; + } + } + + for(unsigned i = 0; i < 8; i++) + { + if(InputDevice[i]) + { + delete InputDevice[i]; + InputDevice[i] = nullptr; + } + } +} + +void MDINPUT_SetMultitap(unsigned type) +{ + MultitapEnabled = type; + + RebuildPortMap(); +} + +static uint8 PortData[3]; +static uint8 PortDataBus[3]; +static uint8 PortCtrl[3]; +static uint8 PortTxData[3]; +static uint8 PortSCtrl[3]; + +static void UpdateBusThing(const int32 master_timestamp) +{ + for(int i = 0; i < PORT_MAX; i++) + { + PortDataBus[i] &= ~PortCtrl[i]; + PortDataBus[i] |= PortData[i] & PortCtrl[i]; + port[i]->UpdateBus(master_timestamp, PortDataBus[i], PortCtrl[i] & 0x7F); + } +} + + +void gen_io_reset(void) +{ + for(int i = 0; i < 3; i++) + { + PortDataBus[i] = 0x7F; + PortData[i] = 0x00; + PortCtrl[i] = 0x00; + PortTxData[i] = 0xFF; + PortSCtrl[i] = 0x00; + port[i]->Power(); + } + + PortTxData[2] = 0xFB; + + UpdateBusThing(0); + + for(int i = 0; i < 3; i++) + { + port[i]->Power(); // Power before and after UpdateBusThing() + } +} + +/*--------------------------------------------------------------------------*/ +/* I/O chip functions */ +/*--------------------------------------------------------------------------*/ + +void gen_io_w(int offset, int value) +{ + //printf("I/O Write: %04x:%04x, %d @ %08x\n", offset, value, md_timestamp, C68k_Get_PC(&Main68K)); + + switch(offset) + { + case 0x01: /* Port A Data */ + case 0x02: /* Port B Data */ + case 0x03: /* Port C Data */ + { + int wp = offset - 0x01; + PortData[wp] = value; + } + UpdateBusThing(md_timestamp); + break; + + case 0x04: /* Port A Ctrl */ + case 0x05: /* Port B Ctrl */ + case 0x06: /* Port C Ctrl */ + { + int wp = offset - 0x04; + + PortCtrl[wp] = value; + } + UpdateBusThing(md_timestamp); + break; + + case 0x07: /* Port A TxData */ + case 0x0A: /* Port B TxData */ + case 0x0D: /* Port C TxData */ + PortTxData[(offset - 0x07) / 3] = value; + break; + + case 0x09: /* Port A S-Ctrl */ + case 0x0C: /* Port B S-Ctrl */ + case 0x0F: /* Port C S-Ctrl */ + PortSCtrl[(offset - 0x09) / 3] = value & 0xF8; + break; + } +} + +int gen_io_r(int offset) +{ + uint8 ret; + uint8 temp; + uint8 has_scd = MD_IsCD ? 0x00 : 0x20; + uint8 gen_ver = 0x00; /* Version 0 hardware */ + + switch(offset) + { + default: + ret = 0x00; + MD_DBG(MD_DBG_WARNING, "[IO] Unmapped I/O Read: %04x\n", offset); + break; + + case 0x00: /* Version */ + temp = 0x00; + if(is_overseas_reported) + temp |= 0x80; + if(is_pal_reported) + temp |= 0x40; + ret = (temp | has_scd | gen_ver); + break; + + case 0x01: /* Port A Data */ + case 0x02: /* Port B Data */ + case 0x03: /* Port C Data */ + { + int wp = offset - 0x01; + + UpdateBusThing(md_timestamp); + ret = (PortDataBus[wp] & 0x7F) | (PortCtrl[wp] & 0x80); + } + break; + + case 0x04: /* Port A Ctrl */ + case 0x05: /* Port B Ctrl */ + case 0x06: /* Port C Ctrl */ + ret = PortCtrl[offset - 0x04]; + break; + + case 0x07: /* Port A TxData */ + case 0x0A: /* Port B TxData */ + case 0x0D: /* Port C TxData */ + ret = PortTxData[(offset - 0x07) / 3]; + break; + + case 0x09: /* Port A S-Ctrl */ + case 0x0C: /* Port B S-Ctrl */ + case 0x0F: /* Port C S-Ctrl */ + ret = PortSCtrl[(offset - 0x09) / 3]; + break; + } + + //printf("I/O Read: %04x ret=%02x, %d @ %08x\n", offset, ret, md_timestamp, C68k_Get_PC(&Main68K)); + + return(ret); +} + + +void MDIO_BeginTimePeriod(const int32 timestamp_base) +{ + for(int i = 0; i < 3; i++) + port[i]->BeginTimePeriod(timestamp_base); +} + +void MDIO_EndTimePeriod(const int32 master_timestamp) +{ + for(int i = 0; i < 3; i++) + port[i]->EndTimePeriod(master_timestamp); +} + + +/*--------------------------------------------------------------------------*/ +/* Null device */ +/*--------------------------------------------------------------------------*/ +MD_Input_Device::MD_Input_Device() +{ + +} + +MD_Input_Device::~MD_Input_Device() +{ + + +} + +void MD_Input_Device::Power(void) +{ + +} + +void MD_Input_Device::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ +// printf("%02x -- %02x\n", bus, genesis_asserted); +// bus |= 0x3F &~ genesis_asserted; +// bus &= genesis_asserted; +} + +void MD_Input_Device::UpdatePhysicalState(const void *data) +{ + +} + +void MD_Input_Device::BeginTimePeriod(const int32 timestamp_base) +{ + +} + +void MD_Input_Device::EndTimePeriod(const int32 master_timestamp) +{ + +} + + +void MD_Input_Device::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + +} + +void MDINPUT_Frame(void) +{ + MDFNGameInfo->mouse_sensitivity = MDFN_GetSettingF("md.input.mouse_sensitivity"); + + for(unsigned vp = 0; vp < 8; vp++) + { + if(InputDevice[vp]) + InputDevice[vp]->UpdatePhysicalState(data_ptr[vp]); + } +} + +void MDINPUT_SetInput(unsigned vp, const char *type, uint8 *ptr) +{ + assert(vp < 8); + + data_ptr[vp] = ptr; + + if(InputDevice[vp]) + { + delete InputDevice[vp]; + InputDevice[vp] = nullptr; + } + + if(!strcasecmp(type, "none")) + InputDevice[vp] = nullptr; + else if(!strcasecmp(type, "gamepad")) + InputDevice[vp] = MDInput_MakeMD3B(); + else if(!strcasecmp(type, "gamepad6")) + InputDevice[vp] = MDInput_MakeMD6B(); + else if(!strcasecmp(type, "gamepad2")) + InputDevice[vp] = MDInput_MakeMS2B(); + else if(!strcasecmp(type, "megamouse")) + InputDevice[vp] = MDInput_MakeMegaMouse(); + else + abort(); + + if(InputDevice[vp]) + InputDevice[vp]->Power(); + + RebuildPortMap(); + // + // + // + UpdateBusThing(md_timestamp); +} + +void MDINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PortData, 3), + SFARRAY(PortCtrl, 3), + SFARRAY(PortTxData, 3), + SFARRAY(PortSCtrl, 3), + + SFARRAY(PortDataBus, 3), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "IO"); + + port[0]->StateAction(sm, load, data_only, "PRTA"); + port[1]->StateAction(sm, load, data_only, "PRTB"); + port[2]->StateAction(sm, load, data_only, "PRTC"); + + if(load) + { + + } +} + + +} diff --git a/Mednafen/mednafen/md/genio.h b/Mednafen/mednafen/md/genio.h new file mode 100644 index 0000000000..6b27d83728 --- /dev/null +++ b/Mednafen/mednafen/md/genio.h @@ -0,0 +1,58 @@ +#ifndef __MDFN_MD_GENIO_H +#define __MDFN_MD_GENIO_H + +namespace MDFN_IEN_MD +{ + +/* Function prototypes */ +extern void gen_io_reset(void); +extern void gen_io_w(int offset, int value); +extern int gen_io_r(int offset); + +extern void gen_io_update(void); +extern void gen_io_set_device(int which, int type); + +void MDIO_BeginTimePeriod(const int32 timestamp_base); +void MDIO_EndTimePeriod(const int32 master_timestamp); + +void MDIO_Init(bool overseas, bool PAL, bool overseas_reported, bool PAL_reported); +void MDIO_Kill(void); + +void MDINPUT_Frame(void); +void MDINPUT_SetInput(unsigned port, const char *type, uint8 *ptr); + +enum +{ + MTAP_NONE = 0, + MTAP_TP_PRT1 = 1, + MTAP_TP_PRT2 = 2, + MTAP_TP_DUAL = 3, + MTAP_4WAY = 4, +}; +void MDINPUT_SetMultitap(unsigned type); + +extern const std::vector MDPortInfo; + +class MD_Input_Device +{ + public: + MD_Input_Device(); + virtual ~MD_Input_Device(); + + virtual void Power(void); + + // genesis_asserted is intended for more accurately emulating a device that has pull-up or pull-down resistors + // on one or more data lines. + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted); // genesis_asserted should + virtual void UpdatePhysicalState(const void *data); + virtual void BeginTimePeriod(const int32 timestamp_base); + virtual void EndTimePeriod(const int32 master_timestamp); + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix); +}; + +void MDINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +} + +#endif + diff --git a/Mednafen/mednafen/md/header.cpp b/Mednafen/mednafen/md/header.cpp new file mode 100644 index 0000000000..fa8d892173 --- /dev/null +++ b/Mednafen/mednafen/md/header.cpp @@ -0,0 +1,121 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "shared.h" +#include "header.h" +#include +#include + +namespace MDFN_IEN_MD +{ + +typedef struct +{ + uint8 ascii; + uint8 numeric; +} region_lut_t; + +static const region_lut_t region_lut[] = +{ + { 0xFF, 0x1 }, + { 0x00, 0x1 }, + { 0xd4, 0x1 }, + + { 4, 0x4 }, // Silly Toy Story + + { ' ', 0x1 }, // Assume Japanese + { 'J', 0x1 }, + { 'U', 0x4 }, + { 'E', 0x8 }, + + { '0', 0x0 }, + { '1', 0x1 }, + { '2', 0x2 }, + { '3', 0x3 }, + { '4', 0x4 }, + { '5', 0x5 }, + { '6', 0x6 }, + { '7', 0x7 }, + { '8', 0x8 }, + { '9', 0x9 }, + { 'A', 0xa }, + { 'B', 0xb }, + { 'C', 0xc }, + { 'D', 0xd }, + { 'E', 0xe }, + { 'F', 0xf } +}; + +static uint8 get_region_numeric(uint8 code) +{ + code = toupper(code); + + for(unsigned i = 0; i < sizeof(region_lut) / sizeof(region_lut_t); i++) + { + if(region_lut[i].ascii == code) + { + return(region_lut[i].numeric); + } + } + + printf("Unknown region code: %c %02x\n", code, code); + //exit(1); + + return(0x0); +} + +void MD_ReadSegaHeader(const uint8 *header, md_game_info *ginfo) +{ + ginfo->rom_size = 0; //fp->size; + + memcpy(ginfo->copyright, header + 0x10, 16); + ginfo->copyright[16] = 0; + MDFN_RemoveControlChars(ginfo->copyright); + + // FIXME: SJIS to UTF8 conversion. + memcpy(ginfo->domestic_name, header + 0x20, 0x30); + ginfo->domestic_name[0x30] = 0; + MDFN_RemoveControlChars(ginfo->domestic_name); + + memcpy(ginfo->overseas_name, header + 0x50, 0x30); + ginfo->overseas_name[0x30] = 0; + MDFN_RemoveControlChars(ginfo->overseas_name); + + memcpy(ginfo->product_code, header + 0x82, 0x0C); + ginfo->product_code[0xC] = 0; + MDFN_RemoveControlChars(ginfo->product_code); + MDFN_trim(ginfo->product_code); + + ginfo->checksum = (header[0x8E] << 8) | (header[0x8F] << 0); + + for(int i = 0; i < 16; i++) + { + for(unsigned int iot = 0; iot < sizeof(IO_types) / sizeof(IO_type_t); iot++) + { + if(IO_types[iot].code_char == header[0x90 + i]) + { + ginfo->io_support |= 1 << IO_types[iot].id; + break; + } + } + } + + ginfo->region_support = get_region_numeric(header[0xF0]); +} + + +} diff --git a/Mednafen/mednafen/md/header.h b/Mednafen/mednafen/md/header.h new file mode 100644 index 0000000000..807d02b8b2 --- /dev/null +++ b/Mednafen/mednafen/md/header.h @@ -0,0 +1,85 @@ +#ifndef __MDFN_MD_HEADER_H +#define __MDFN_MD_HEADER_H + +namespace MDFN_IEN_MD +{ + +enum +{ + REGIONMASK_JAPAN_NTSC = 1, + REGIONMASK_JAPAN_PAL = 2, + REGIONMASK_OVERSEAS_NTSC = 4, + REGIONMASK_OVERSEAS_PAL = 8 +}; + +enum +{ + IOS_GAMEPAD = 0, + IOS_GAMEPAD6B, + IOS_KEYBOARD, + IOS_PRINTER, + IOS_BALL, + IOS_FLOPPY, + IOS_ACTIVATOR, + IOS_TEAM_PLAY, + IOS_GAMEPAD_MS, + IOS_RS232C, + IOS_TABLET, + IOS_PADDLE, + IOS_CDROM, + IOS_MEGA_MOUSE +}; + +typedef struct +{ + const int id; + const char code_char; + const char *name; +} IO_type_t; + +static const IO_type_t IO_types[] = +{ + { IOS_GAMEPAD, 'J', "3-Button Gamepad" }, + { IOS_GAMEPAD6B, '6', "6-Button Gamepad" }, + { IOS_KEYBOARD, 'K', "Keyboard" }, + { IOS_PRINTER, 'P', "Printer" }, + { IOS_BALL, 'B', "Ball Controller" }, + { IOS_FLOPPY, 'F', "Floppy disk drive" }, + { IOS_ACTIVATOR, 'L', "Activator" }, + { IOS_TEAM_PLAY, '4', "Team Play" }, + { IOS_GAMEPAD_MS, '0', "2-Button Master System Gamepad" }, + { IOS_RS232C, 'R', "RS232C Serial Port" }, + { IOS_TABLET, 'T', "Tablet" }, + { IOS_PADDLE, 'V', "Paddle Controller" }, + { IOS_CDROM, 'C', "CD-ROM" }, + { IOS_MEGA_MOUSE, 'M', "Mega Mouse" }, +}; + +typedef struct +{ + uint32 rom_size; + + uint32 io_support; + char copyright[0x10 + 1]; + char domestic_name[0x30 + 1]; + char overseas_name[0x30 + 1]; + char product_code[0xC + 1]; + uint16 checksum; // Recorded game checksum + uint8 region_support; + + uint32 sram_type; + uint32 sram_start; + uint32 sram_end; + + // Convenience, not set by the header parsing code: + uint32 crc32 = 0; + uint8 md5[16]; + uint8 info_header_md5[16]; + uint16 checksum_real; +} md_game_info; + +void MD_ReadSegaHeader(const uint8 *header, md_game_info *ginfo); + +} + +#endif diff --git a/Mednafen/mednafen/md/hvc.h b/Mednafen/mednafen/md/hvc.h new file mode 100644 index 0000000000..41bf04035c --- /dev/null +++ b/Mednafen/mednafen/md/hvc.h @@ -0,0 +1,817 @@ +/*************************************************************************************** + * Genesis Plus + * HV Counters + * + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald + * Eke-Eke (2007,2008,2009), additional code & fixes for the GCN/Wii port + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + ****************************************************************************************/ + +/* + NTSC, 256x192 + ------------- + + Lines Description + + 192 Active display + 24 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 27 Top border + + V counter values + 00-DA, D5-FF + + NTSC, 256x224 + ------------- + + Lines Description + + 224 Active display + 8 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 11 Top border + + V counter values + 00-EA, E5-FF + + NTSC, 256x240 + ------------- + + This mode does not work on NTSC machines. All 30 rows of the name table are + displayed, there is no border, blanking, or retrace period, and the next + frame starts after the 30th row. The display rolls continuously though it + can be stabilized by adjusting the vertical hold. + + V counter values + 00-FF, 00-06 + + PAL, 256x192 + ------------ + + Lines Description + + 192 Active display + 48 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 54 Top border + + V counter values + 00-F2, BA-FF + + PAL, 256x224 + ------------ + + Lines Description + + 224 Active display + 32 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 38 Top border + + V counter values + 00-FF, 00-02, CA-FF + + PAL, 256x240 + ------------ + + Lines Description + + 240 Active display + 24 Bottom border + 3 Bottom blanking + 3 Vertical blanking + 13 Top blanking + 30 Top border + + V counter values + 00-FF, 00-0A, D2-FF + + Here are some details about what the different screen areas look like, + useful if you are emulating overscan or if you want to have a 'virtual' + vertical hold control in your emulator. + + Active display - Where the display generated by the VDP goes. + Bottom border - Filled with border color from VDP register #7. + Bottom blanking - Filled with a light black color. (like display was blanked) + Vertical sync - Filled with a pure black color. (like display was turned off) + Top blanking - Filled with a light black color. (like display was blanked) + Top border - Filled with the border color from VDP register #7. + +*/ +#ifndef _HVC_H_ +#define _HVC_H_ + +/***************************************************************/ +/* */ +/* H-counter timings in H32 & H40 modes (starts from HINT) */ +/* */ +/* There are exactly 3420 Master Clock counts per raster line. */ +/* */ +/* in H32 mode, dot clock is divided from MCLK (MCLK/10). */ +/* in H40 mode, dot clock is divided from EDCLK (EDCLK/2). */ +/* */ +/* EDCLK (external dot clock ?) is generated outside the VDP: */ +/* During HSYNC, it is oscillating between MCLK/10 and MCLK/8, */ +/* otherwise it is fixed to MCLK/8. */ +/* */ +/***************************************************************/ + +static const uint8 cycle2hc32[3420] = +{ + /* end of active display (16 pixels -> 160 Mcycles) , H interrupt triggered, Vcounter increment */ + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, + + /* right border (14 pixels -> 140 Mcycles) */ + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + + /* right blanking (9 pixels -> 90 Mcycles) , VDP status HBLANK flag set */ + 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + + /* horizontal sync (26 pixels -> 260 Mcycles) */ + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, + 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, + 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, + 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, + + /* left blanking (24 pixels -> 240 Mcycles) */ + 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, + 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, + 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, + 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, + 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, + 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, + 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, + /* V interrupt triggered (MD mode) */ + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + + /* left border (13 pixels -> 130 Mcycles) , VDP status HBLANK flag cleared */ + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + + /* remaining active display (240 pixels -> 2400 Mcycles) */ + 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, + 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, + 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, + 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, + 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, + 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, + 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, + 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, + 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, + 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, + 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, + 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, + 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, + 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, + 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, + 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, + 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, + 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, + 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, + 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, + 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, + 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, + 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, + 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, + 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, + 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, + 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, + 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, + 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, + 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, + 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, + 0x72, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, + 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, + 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, + 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, + 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, + 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, +}; + +static const uint8 cycle2hc40[3420] = +{ + /* end of active display (16 pixels -> 128 Mcycles) , HINT triggered , Vcounter increment */ + 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, + 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, + 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, 0xa7, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, 0xa9, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, + + /* right border (14 pixels -> 112 Mcycles) */ + 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, 0xad, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, + 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, 0xaf, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, 0xb2, + 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + + /* right blanking (9 pixels -> 72 Mcycles) , VDP status HBLANK flag set */ + 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xb6, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + + /* horizontal sync (32 pixels -> 313 Mcycles) */ + 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + 0xe6, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, + 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, + 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, + 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xea, 0xea, 0xea, + 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xeb, + 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, + 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, + 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xed, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xef, 0xef, + 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, + 0xef, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, + 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, + 0xf6, + + /* left blanking (32 pixels -> 259 Mcycles) */ + 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xf9, + 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, + 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, + 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, + 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, + 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, + 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + /* Vertical Interrupt triggered */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, + + /* left border (13 pixels -> 104 Mcycles) , VDP status HBLANK flag cleared */ + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, + + /* remaining active display (304 pixels -> 2432 Mcycles) */ + 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x24, + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, + 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2c, + 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x37, 0x37, + 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x39, + 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x3a, 0x3a, 0x3a, 0x3a, + 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3c, + 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, + 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, + 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, + 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x45, + 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x47, 0x47, 0x47, 0x47, + 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x49, + 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x4a, 0x4a, 0x4a, 0x4a, + 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4b, + 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4c, + 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, + 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4d, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x4f, + 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x50, + 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x51, + 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, + 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, + 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x56, 0x56, 0x56, 0x56, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x5a, 0x5a, 0x5a, 0x5a, + 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5b, + 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5c, + 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5d, + 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5e, 0x5e, 0x5e, 0x5e, + 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x61, + 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x62, 0x63, 0x63, 0x63, 0x63, + 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x65, + 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x67, 0x67, 0x67, 0x67, + 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x68, + 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x69, + 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x6a, 0x6a, 0x6a, 0x6a, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6c, + 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6d, + 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6d, 0x6e, 0x6e, 0x6e, 0x6e, + 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x71, + 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x72, 0x72, 0x72, 0x72, + 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x72, 0x73, 0x73, 0x73, 0x73, + 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x74, + 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x75, + 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x75, 0x76, 0x76, 0x76, 0x76, + 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x76, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x78, + 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x79, + 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7a, 0x7a, 0x7a, 0x7a, + 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7b, + 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7c, + 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, + 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, 0x7e, + 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, + 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x83, 0x83, + 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x84, + 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x85, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x85, 0x86, 0x86, 0x86, 0x86, + 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x86, 0x87, 0x87, 0x87, 0x87, + 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x89, + 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, 0x8a, 0x8a, 0x8a, 0x8a, + 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8b, + 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, + 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8d, 0x8e, 0x8e, 0x8e, 0x8e, + 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x90, + 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x91, + 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, 0x92, 0x92, 0x92, 0x92, + 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x94, 0x95, 0x95, 0x95, 0x95, + 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x95, 0x96, 0x96, 0x96, 0x96, + 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x96, 0x97, 0x97, 0x97, 0x97, + 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a, 0x9a, 0x9a, 0x9a, + 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9b, + 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9d, + 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9e, 0x9e, 0x9e, 0x9e, + 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa0, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa1, 0xa1, + 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa2, 0xa2, 0xa2, 0xa2, + 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa4, 0xa4, + 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4, 0xa4}; + +#endif /* _HVC_H_ */ + +#if 0 + + +#ifndef _HVC_H_ +#define _HVC_H_ + + +#if 0 + +/* V counter values for NTSC 192-line display */ +static const uint8 vc_ntsc_192[262] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, + 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for NTSC 224-line display */ +static const uint8 vc_ntsc_224[262] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, + 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for NTSC 240-line display */ +static const uint8 vc_ntsc_240[262] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 +}; + +/* V counter values for PAL 192-line display */ +static const uint8 vc_pal_192[313] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, + 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for PAL 224-line display */ +static const uint8 vc_pal_224[313] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, + 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* V counter values for PAL 240-line display */ +static const uint8 vc_pal_240[313] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, +}; +#endif + +/* H counter values for a 256-pixel wide display (342 pixel max.) */ +static const uint8 hc_256[171] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, + 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +/* H counter values for a 320-pixel wide display (442[sic, is it really 422?] pixels max.) */ +static const uint8 hc_320[211] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, + 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +#if 0 +static const uint8 *vc_table[6] = { + vc_ntsc_192, + vc_ntsc_224, + vc_ntsc_240, + vc_pal_192, + vc_pal_224, + vc_pal_240 +}; +#endif + +static const uint8 *hc_table[2] = { + hc_256, + hc_320, +}; + +#endif /* _HVC_H_ */ + +#endif diff --git a/Mednafen/mednafen/md/input/4way.cpp b/Mednafen/mednafen/md/input/4way.cpp new file mode 100644 index 0000000000..e2065a5a4a --- /dev/null +++ b/Mednafen/mednafen/md/input/4way.cpp @@ -0,0 +1,184 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "4way.h" +#include + +MD_4Way_Shim::MD_4Way_Shim(unsigned nin, MD_4Way* p4w) : n(nin), parent(p4w) +{ + + +} + +MD_4Way_Shim::~MD_4Way_Shim() +{ + + +} + +void MD_4Way_Shim::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + if(!n) + parent->StateAction(sm, load, data_only, section_prefix); +} + +void MD_4Way_Shim::Power(void) +{ + if(!n) + parent->Power(); +} + +void MD_4Way_Shim::BeginTimePeriod(const int32 timestamp_base) +{ + if(!n) + parent->BeginTimePeriod(timestamp_base); +} + +void MD_4Way_Shim::EndTimePeriod(const int32 master_timestamp) +{ + if(!n) + parent->EndTimePeriod(master_timestamp); +} + +void MD_4Way_Shim::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ + parent->UpdateBus(n, master_timestamp, bus, genesis_asserted); +} + +MD_4Way::MD_4Way() +{ + Power(); +} + +MD_4Way::~MD_4Way() +{ + + + +} + +void MD_4Way::Power(void) +{ + index = 8; + for(unsigned i = 0; i < 4; i++) + { + if(SubPort[i]) + SubPort[i]->Power(); + } +} + + +void MD_4Way::BeginTimePeriod(const int32 timestamp_base) +{ + for(unsigned i = 0; i < 4; i++) + { + SubPort[i]->BeginTimePeriod(timestamp_base); + } +} + +void MD_4Way::EndTimePeriod(const int32 master_timestamp) +{ + for(unsigned i = 0; i < 4; i++) + { + SubPort[i]->EndTimePeriod(master_timestamp); + } +} + + +void MD_4Way::UpdateBus(unsigned n, const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ + //printf("%d, %02x %02x\n", n, bus, genesis_asserted); + + if(n) + { + if((bus & 0xF) == 0xC) + { + index = (bus >> 4) & 0x7; + + //if(index == 7) + // printf("%08x\n", C68k_Get_PC(&Main68K)); + } + else + index = 8; + } + else + { + if(index & 4) + bus = (bus &~ 0x3); + } + +#if 1 + for(unsigned sp = 0; sp < 4; sp++) + { + if(sp == index) + { + SubPort[sp]->UpdateBus(master_timestamp, bus, genesis_asserted); + } + else + { + uint8 tmp = 0x7F; + SubPort[sp]->UpdateBus(master_timestamp, tmp, 0); + } + } +#endif + +#if 0 + if(index < 4) + { + SubPort[index]->UpdateBus(master_timestamp, bus, genesis_asserted); + } +#endif +} + +void MD_4Way::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(index), + SFEND + }; + + char sname[64]; + + trio_snprintf(sname, sizeof(sname), "%s-4W", section_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + Power(); + else if(load) + { + + } + + for(unsigned i = 0; i < 4; i++) + { + char ss_prefix[64]; + + trio_snprintf(ss_prefix, sizeof(ss_prefix), "%s-4W%u", section_prefix, i); + + SubPort[i]->StateAction(sm, load, data_only, ss_prefix); + } +} + + +void MD_4Way::SetSubPort(unsigned n, MD_Input_Device* d) +{ + assert(n < 4); + + SubPort[n] = d; +} + diff --git a/Mednafen/mednafen/md/input/4way.h b/Mednafen/mednafen/md/input/4way.h new file mode 100644 index 0000000000..f0d818a20a --- /dev/null +++ b/Mednafen/mednafen/md/input/4way.h @@ -0,0 +1,40 @@ +class MD_4Way; + +class MD_4Way_Shim final : public MD_Input_Device +{ + public: + MD_4Way_Shim(unsigned nin, MD_4Way* p4w); + virtual ~MD_4Way_Shim() override; + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) override; + virtual void Power(void) override; + virtual void BeginTimePeriod(const int32 timestamp_base) override; + virtual void EndTimePeriod(const int32 master_timestamp) override; + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) override; + + private: + unsigned n; + MD_4Way* parent; +}; + +class MD_4Way +{ + public: + MD_4Way(); + ~MD_4Way(); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix); + void Power(void); + void BeginTimePeriod(const int32 timestamp_base); + void EndTimePeriod(const int32 master_timestamp); + + INLINE MD_Input_Device* GetShim(unsigned n) { return &Shams[n]; } + + void UpdateBus(unsigned n, const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted); + void SetSubPort(unsigned n, MD_Input_Device* d); + + private: + MD_Input_Device* SubPort[4] = { nullptr, nullptr, nullptr, nullptr }; + MD_4Way_Shim Shams[2] = { { 0, this}, {1, this } }; + uint8 index; +}; + diff --git a/Mednafen/mednafen/md/input/gamepad.cpp b/Mednafen/mednafen/md/input/gamepad.cpp new file mode 100644 index 0000000000..f7aa4f96c8 --- /dev/null +++ b/Mednafen/mednafen/md/input/gamepad.cpp @@ -0,0 +1,409 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "gamepad.h" +#include + +/*--------------------------------------------------------------------------*/ +/* Master System 2-button gamepad */ +/*--------------------------------------------------------------------------*/ +class Gamepad2 final : public MD_Input_Device +{ + public: + Gamepad2(); + virtual ~Gamepad2() override; + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) override; + virtual void UpdatePhysicalState(const void *data) override; + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) override; + + private: + uint8 buttons; +}; + +/*--------------------------------------------------------------------------*/ +/* Genesis 3-button gamepad */ +/*--------------------------------------------------------------------------*/ +class Gamepad3 final : public MD_Input_Device +{ + public: + Gamepad3(); + virtual ~Gamepad3() override; + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) override; + virtual void UpdatePhysicalState(const void *data) override; + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) override; + + private: + uint8 buttons; +}; + +/*--------------------------------------------------------------------------*/ +/* Fighting Pad 6B */ +/*--------------------------------------------------------------------------*/ +class Gamepad6 final : public MD_Input_Device +{ + public: + Gamepad6(); + virtual ~Gamepad6() override; + + virtual void Power(void) override; + + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) override; + virtual void UpdatePhysicalState(const void *data) override; + virtual void BeginTimePeriod(const int32 timestamp_base) override; + virtual void EndTimePeriod(const int32 master_timestamp) override; + + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) override; + + private: + void Run(const int32 master_timestamp); + + int32 prev_timestamp; + int32 count; + bool old_select; + int32 timeout; + uint16 buttons; + + bool compat_mode; +}; + +const IDIISG Gamepad2IDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "a", "A", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + { "b", "B", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "start", "Start", 4, IDIT_BUTTON, NULL }, +}; + +Gamepad2::Gamepad2() +{ + buttons = 0; +} + +Gamepad2::~Gamepad2() +{ + +} + +void Gamepad2::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(buttons), + SFEND + }; + + char sname[64]; + + trio_snprintf(sname, sizeof(sname), "%s-gp2", section_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + Power(); + else if(load) + { + + } +} + + +void Gamepad2::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ + bus = (bus &~ 0x3F) | (0x3F & ~buttons); +} + +void Gamepad2::UpdatePhysicalState(const void *data) +{ + buttons = *(uint8 *)data; +} + +const IDIISG GamepadIDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "b", "B", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "c", "C", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "a", "A", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + { "start", "Start", 4, IDIT_BUTTON, NULL }, +}; + +Gamepad3::Gamepad3() +{ + buttons = 0; +} + +Gamepad3::~Gamepad3() +{ + +} + +void Gamepad3::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ + const bool select = (bus >> 6) & 1; + uint8 temp; + + if(select) + temp = 0x3F & ~buttons; + else + temp = 0x33 & ~(buttons & 0x3) & ~((buttons >> 2) & 0x30); + + bus = (bus & ~0x3F) | temp; +} + +void Gamepad3::UpdatePhysicalState(const void *data) +{ + buttons = *(uint8 *)data; +} + +void Gamepad3::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(buttons), + SFEND + }; + + char sname[64]; + + trio_snprintf(sname, sizeof(sname), "%s-gp3", section_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + Power(); + else if(load) + { + + } +} + + +const IDIISG Gamepad6IDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "b", "B", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "c", "C", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "a", "A", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + { "start", "Start", 4, IDIT_BUTTON, NULL }, + { "z", "Z", 10, IDIT_BUTTON_CAN_RAPID, NULL }, + { "y", "Y", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "x", "X", 8, IDIT_BUTTON_CAN_RAPID, NULL }, + { "mode", "Mode", 11, IDIT_BUTTON, NULL }, +}; + +Gamepad6::Gamepad6() +{ + buttons = 0; + old_select = 0; + prev_timestamp = 0; +} + +Gamepad6::~Gamepad6() // Destructor. DEEEEEEEE. Don't put variables to initialize here again! +{ + +} + +void Gamepad6::Power(void) +{ + count = 0; + timeout = 0; + + //compat_mode = false; //(bool)(buttons & (1 << 11)); + //compat_mode_counter = 4474431; // ~5 video frames + compat_mode = (bool)(buttons & (1 << 11)); +} + +void Gamepad6::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(old_select), + SFVAR(buttons), + SFVAR(count), + SFVAR(timeout), + SFVAR(compat_mode), + SFEND + }; + char sname[64]; + + trio_snprintf(sname, sizeof(sname), "%s-gp6", section_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + Power(); + else if(load) + { + + } +} + + +void Gamepad6::Run(const int32 master_timestamp) +{ + const int32 clocks = master_timestamp - prev_timestamp; + + //printf("%d\n", master_timestamp - prev_timestamp); +#if 0 + if(compat_mode_counter >= 0) + { + if(!(buttons & (1 << 11))) + compat_mode_counter = false; + else + { + compat_mode_counter -= clocks; + if(compat_mode_counter <= 0) + compat_mode = true; + } + } +#endif + + timeout += clocks; + + if(timeout >= 8192 * 7) + { + timeout = 0; + count = 0; + + //if(!select) + // count++; + //printf("TIMEOUT: %d\n", select); + } + + prev_timestamp = master_timestamp; +} + +void Gamepad6::BeginTimePeriod(const int32 timestamp_base) +{ + //printf("Begin: %d\n", timestamp_base); + prev_timestamp = timestamp_base; +} + +void Gamepad6::EndTimePeriod(const int32 master_timestamp) +{ + //printf("End: %d\n", master_timestamp); + Run(master_timestamp); +} + +/* + How it's implemented here(copy/pasted from Charles' doc, and rearranged a bit): + + Count: + + 0 TH = 0 : ?0SA00DU 3-button pad return value + 0 TH = 1 : ?1CBRLDU 3-button pad return value + + 1 TH = 0 : ?0SA00DU 3-button pad return value + 1 TH = 1 : ?1CBRLDU 3-button pad return value + + 2 TH = 0 : ?0SA00DU 3-button pad return value + 2 TH = 1 : ?1CBRLDU 3-button pad return value + + 3 TH = 0 : ?0SA0000 D3-0 are forced to '0' + 3 TH = 1 : ?1CBMXYZ Extra buttons returned in D3-0 + + 4 TH = 0 : ?0SA1111 D3-0 are forced to '1' + 4 TH = 1 : ?1CBRLDU 3-button pad return value + + ... TH = 0 : ?0SA00DU 3-button pad return value + ... TH = 1 : ?1CBRLDU 3-button pad return value + +*/ + +/* + 6-button controller games to test when making changes: + Comix Zone + + 6-button controller incompatible games(incomplete): + Ms. Pac Man +*/ + +void Gamepad6::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ + Run(master_timestamp); + + const bool select = (bus >> 6) & 1; + uint8 temp = 0x3F; + + // Only take action if TH changed. + if(select != old_select) + { + timeout = 0; + old_select = select; + + if(!select && count < 5 && !compat_mode) // If TH is going from 1->0, and we haven't reached the end yet, increment the counter. + count++; + } + + switch(count) + { + case 5: + case 0: + case 1: + case 2: + if(select) + temp = 0x3F & ~buttons; + else + temp = 0x33 & ~(buttons & 0x3) & ~((buttons >> 2) & 0x30); + break; + + case 3: + if(select) + temp = (0x30 & ~buttons) | (0x0F & ~(buttons >> 8)); + else + temp = 0x30 & ~((buttons >> 2) & 0x30); + break; + + case 4: + if(select) + temp = 0x3F & ~buttons; + else + temp = 0x3F & ~((buttons >> 2) & 0x30); + break; + } + + //printf("Read: %d 0x%02x\n", (count << 1) | select, temp); + bus = (bus & ~0x3F) | temp; +} + +void Gamepad6::UpdatePhysicalState(const void *data) +{ + //printf("Buttons: %04x\n", MDFN_de16lsb((uint8 *)data)); + buttons = MDFN_de16lsb((uint8 *)data); +} + +MD_Input_Device *MDInput_MakeMS2B(void) +{ + return new Gamepad2; +} + +MD_Input_Device *MDInput_MakeMD3B(void) +{ + return new Gamepad3; +} + +MD_Input_Device *MDInput_MakeMD6B(void) +{ + return new Gamepad6; +} + diff --git a/Mednafen/mednafen/md/input/gamepad.h b/Mednafen/mednafen/md/input/gamepad.h new file mode 100644 index 0000000000..a0115fd039 --- /dev/null +++ b/Mednafen/mednafen/md/input/gamepad.h @@ -0,0 +1,7 @@ +extern const IDIISG Gamepad2IDII; +extern const IDIISG GamepadIDII; +extern const IDIISG Gamepad6IDII; +MD_Input_Device *MDInput_MakeMS2B(void); +MD_Input_Device *MDInput_MakeMD3B(void); +MD_Input_Device *MDInput_MakeMD6B(void); + diff --git a/Mednafen/mednafen/md/input/megamouse.cpp b/Mednafen/mednafen/md/input/megamouse.cpp new file mode 100644 index 0000000000..170c58aa49 --- /dev/null +++ b/Mednafen/mednafen/md/input/megamouse.cpp @@ -0,0 +1,280 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../shared.h" +#include "megamouse.h" +#include + +enum +{ + MASK_TH = 0x40, + MASK_TR = 0x20, + MASK_TL = 0x10, + MASK_DATA = 0x0F +}; + +class MegaMouse final : public MD_Input_Device +{ + public: + MegaMouse(); + virtual ~MegaMouse() override; + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) override; + virtual void UpdatePhysicalState(const void *data) override; + virtual void BeginTimePeriod(const int32 timestamp_base) override; + virtual void EndTimePeriod(const int32 master_timestamp) override; + virtual void Power(void) override; + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) override; + + private: + int32 mouse_x; + int32 mouse_y; + uint8 buttons; + + int32 busy_until; + + uint8 phase; + uint8 bus_av; + uint8 data_buffer[0x8]; +}; + +const IDIISG MegaMouseIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS_REL }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL }, + { "left", "Left Button", 0, IDIT_BUTTON, NULL }, + { "right", "Right Button", 1, IDIT_BUTTON, NULL }, + { "middle", "Middle Button", 2, IDIT_BUTTON, NULL }, + { "start", "Start Button", 3, IDIT_BUTTON, NULL }, +}; + +enum +{ + PHASE_RESETTING = 0, + PHASE_RESET_EXEC, + PHASE_INITIAL, + PHASE_BEGIN, + PHASE_DATA0, + PHASE_DATA1, + PHASE_DATA2, + PHASE_DATA3, + PHASE_DATA4, + PHASE_DATA5, + PHASE_DATA6, + PHASE_DATA7, + PHASE_END +}; + +MegaMouse::MegaMouse() +{ + mouse_x = 0; + mouse_y = 0; + buttons = 0; + + phase = PHASE_INITIAL; + busy_until = -1; +} + +MegaMouse::~MegaMouse() +{ + +} + +void MegaMouse::Power(void) +{ + bus_av = 0x10; + phase = PHASE_INITIAL; + busy_until = -1; +} + + +void MegaMouse::BeginTimePeriod(const int32 timestamp_base) +{ + //puts("Begin"); + if(busy_until >= 0) + busy_until += timestamp_base; +} + +void MegaMouse::EndTimePeriod(const int32 master_timestamp) +{ + if(busy_until >= 0 && master_timestamp >= busy_until) + { + //puts("Advance phase"); + if(phase < PHASE_END) + phase++; + busy_until = -1; + } + + if(busy_until >= 0) + busy_until -= master_timestamp; +} + +void MegaMouse::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ + const bool th = bus & MASK_TH; + const bool tr = bus & MASK_TR; + + if(th && tr && phase != PHASE_RESET_EXEC) + { + busy_until = -1; + phase = PHASE_INITIAL; + } + + if(busy_until >= 0) + { + if(master_timestamp >= busy_until) + { + //puts("Advance phase"); + if(phase < PHASE_END) + phase++; + busy_until = -1; + } + } + + if(busy_until < 0) + { + switch(phase) + { + case PHASE_RESET_EXEC: + bus_av = 0x00; + if(tr) + busy_until = master_timestamp + 400; + break; + + case PHASE_INITIAL: + if(th) + { + bus_av = 0x10; + + if(!tr) + { + phase = PHASE_RESETTING; + busy_until = master_timestamp + 400; + } + } + else + { + phase++; + } + break; + + case PHASE_BEGIN: + bus_av = 0x1B; + if(!tr) + { + int32 rel_x = mouse_x; + int32 rel_y = mouse_y; + bool x_neg = 0; + bool y_neg = 0; + + if(rel_x < -255) + rel_x = -255; + + if(rel_x > 255) + rel_x = 255; + + if(rel_y < -255) + rel_y = -255; + + if(rel_y > 255) + rel_y = 255; + + mouse_x -= rel_x; + mouse_y -= rel_y; + + rel_y = -rel_y; + + x_neg = (rel_x < 0); + y_neg = (rel_y < 0); + + data_buffer[0] = 0xF; + data_buffer[1] = 0xF; + data_buffer[2] = (x_neg ? 0x1 : 0x0) | (y_neg ? 0x2 : 0x0); // Axis sign and overflow + data_buffer[3] = buttons; // Button state + data_buffer[4] = (rel_x >> 4) & 0xF; // X axis MSN + data_buffer[5] = (rel_x >> 0) & 0xF; // X axis LSN + data_buffer[6] = (rel_y >> 4) & 0xF; // Y axis MSN + data_buffer[7] = (rel_y >> 0) & 0xF; // Y axis LSN + + //printf("DB: %02x %02x %02x %02x %02x %02x %02x %02x\n", data_buffer[0], data_buffer[1], data_buffer[2], data_buffer[3], data_buffer[4], data_buffer[5], data_buffer[6], data_buffer[7]); + + busy_until = master_timestamp + 400; + } + break; + + case PHASE_DATA0: case PHASE_DATA1: case PHASE_DATA2: case PHASE_DATA3: + case PHASE_DATA4: case PHASE_DATA5: case PHASE_DATA6: case PHASE_DATA7: + bus_av = data_buffer[phase - PHASE_DATA0] | (((phase - PHASE_DATA0) & 1) << 4); + if(tr != ((phase - PHASE_DATA0) & 1)) + busy_until = master_timestamp + 400; + break; + + case PHASE_END: + bus_av ^= 0x10; + + if(tr != (bool)(bus_av & 0x10)) + { + busy_until = master_timestamp + 400; + } + break; + } + } + + bus = (bus &~ 0x1F) | bus_av; + //printf("%02x, %02x --- %d -- %d\n", bus, bus_av, phase, master_timestamp); +} + +void MegaMouse::UpdatePhysicalState(const void *data) +{ + mouse_x += (int32)MDFN_de32lsb((uint8 *)data + 0); + mouse_y += (int32)MDFN_de32lsb((uint8 *)data + 4); + buttons = ((uint8 *)data)[8]; +} + +void MegaMouse::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(mouse_x), + SFVAR(mouse_y), + SFVAR(buttons), + + SFVAR(busy_until), + + SFVAR(phase), + SFVAR(bus_av), + SFARRAY(data_buffer, sizeof(data_buffer)), + + SFEND + }; + char sname[64]; + + trio_snprintf(sname, sizeof(sname), "%s-mmouse", section_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + Power(); + else if(load) + { + + } +} + +MD_Input_Device *MDInput_MakeMegaMouse(void) +{ + MD_Input_Device *ret = new MegaMouse(); + + return(ret); +} diff --git a/Mednafen/mednafen/md/input/megamouse.h b/Mednafen/mednafen/md/input/megamouse.h new file mode 100644 index 0000000000..8ce3cf8d37 --- /dev/null +++ b/Mednafen/mednafen/md/input/megamouse.h @@ -0,0 +1,3 @@ +extern const IDIISG MegaMouseIDII; +MD_Input_Device *MDInput_MakeMegaMouse(void); + diff --git a/Mednafen/mednafen/md/input/multitap.cpp b/Mednafen/mednafen/md/input/multitap.cpp new file mode 100644 index 0000000000..0de38471df --- /dev/null +++ b/Mednafen/mednafen/md/input/multitap.cpp @@ -0,0 +1,248 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// +// Bleck, so many horrible guesses. +// + +#include "../shared.h" +#include "multitap.h" +#include + +MD_Multitap::MD_Multitap() +{ + prev_th = false; + prev_tr = false; + + Power(); +} + +MD_Multitap::~MD_Multitap() +{ + + + +} + +void MD_Multitap::Power(void) +{ + phase = 0; + + memset(bb, 0, sizeof(bb)); + data_out = 0; + data_out_offs = 0; + nyb = 0; + + for(unsigned i = 0; i < 4; i++) + { + if(SubPort[i]) + SubPort[i]->Power(); + } +} + + +void MD_Multitap::BeginTimePeriod(const int32 timestamp_base) +{ +#if 0 + static uint32 counter = 0; + + counter++; + + if(counter >= 600) + exit(0); +#endif + + for(unsigned i = 0; i < 4; i++) + { + SubPort[i]->BeginTimePeriod(timestamp_base); + } +} + +void MD_Multitap::EndTimePeriod(const int32 master_timestamp) +{ + for(unsigned i = 0; i < 4; i++) + { + SubPort[i]->EndTimePeriod(master_timestamp); + } +} + + +void MD_Multitap::UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) +{ +#if 0 + const bool th = (bus & 0x40); + const bool tr = (bus & 0x20); + printf("%02x\n", bus); + + if(th) + bus &= (~0x0F) | 3; + else + bus |= 0x0F; +#endif + //bus &= (genesis_asserted & 0x60) | ~0x60; + + const bool th = (bus & 0x40); + const bool tr = (bus & 0x20); + + if(th) + { + phase = 0; + bus &= ~0x1F; + bus |= 0x03 | (tr << 4); + nyb = 0x0F; + data_out_offs = 0; + data_out = 0; + } + else if(phase < 18) + { + if(tr != prev_tr) + { + if(phase == 0) + { + for(int idx = -2; idx < 5; idx++) + { + for(unsigned sp = 0; sp < 4; sp++) + { + uint8 sub_bus = ((!(idx & 1)) << 6) | 0x3F; + uint8 sub_asserted = 0x40; + + SubPort[sp]->UpdateBus(master_timestamp, sub_bus, sub_asserted); + + if(idx >= 0) + bb[sp][idx] = sub_bus; + } + } + } + + if(phase >= 0 && phase <= 1) + { + nyb = 0x0; + } + else if(phase >= 2 && phase <= 5) + { + uint8* cb = bb[phase - 2]; + + //printf("MOO: %d %02x %02x %02x %02x\n", phase - 2, cb[0], cb[1], cb[2], cb[3]); + + switch(cb[3] & 0xF) + { + default: + case 0xF: // Nothing + nyb = 0xF; + break; + + case 0x1: + case 0x2: + case 0x3: // 3-button + nyb = 0x0; + data_out |= (uint64)((cb[0] & 0x3F) | ((cb[1] << 2) & 0xC0)) << data_out_offs; + data_out_offs += 8; + break; + + case 0x0: // 6-button + nyb = 0x1; + data_out |= (uint64)((cb[0] & 0x3F) | ((cb[1] << 2) & 0xC0) | ((cb[4] & 0xF) << 8)) << data_out_offs; + data_out_offs += 12; + break; + } + + if(phase == 5) + data_out |= (~(uint64)0) << data_out_offs; + } + else if(phase >= 6 && phase <= 17) + { + nyb = data_out & 0xF; + data_out >>= 4; + } + phase++; + } + + bus = (bus &~ 0x1F) | (tr << 4) | nyb; + } + + //printf("Phase: %3d, Bus: 0x%02x --- %02x\n", phase, bus, genesis_asserted); + +#if 0 + { + static uint32 th_counter = 0; + + if(th != prev_th) + th_counter++; + + if(phase == 10) + { + //printf("YES: %08x\n", C68k_Get_PC(&Main68K)); + exit(1); + } + + if(th_counter >= 100) + { + exit(0); + } + } +#endif + + prev_th = th; + prev_tr = tr; +} + +void MD_Multitap::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(phase), + SFVAR(prev_th), + SFVAR(prev_tr), + + SFARRAY(&bb[0][0], sizeof(bb) / sizeof(bb[0][0])), + + SFVAR(data_out), + SFVAR(data_out_offs), + SFVAR(nyb), + + SFEND + }; + + char sname[64]; + + trio_snprintf(sname, sizeof(sname), "%s-MT", section_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + Power(); + else if(load) + { + + } + + for(unsigned i = 0; i < 4; i++) + { + char ss_prefix[64]; + + trio_snprintf(ss_prefix, sizeof(ss_prefix), "%s-MT%u", section_prefix, i); + + SubPort[i]->StateAction(sm, load, data_only, ss_prefix); + } +} + + +void MD_Multitap::SetSubPort(unsigned n, MD_Input_Device* d) +{ + assert(n < 4); + + SubPort[n] = d; +} + diff --git a/Mednafen/mednafen/md/input/multitap.h b/Mednafen/mednafen/md/input/multitap.h new file mode 100644 index 0000000000..291d3a376f --- /dev/null +++ b/Mednafen/mednafen/md/input/multitap.h @@ -0,0 +1,25 @@ +class MD_Multitap final : public MD_Input_Device +{ + public: + MD_Multitap(); + virtual ~MD_Multitap() override; + virtual void UpdateBus(const int32 master_timestamp, uint8 &bus, const uint8 genesis_asserted) override; + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_prefix) override; + virtual void Power(void) override; + virtual void BeginTimePeriod(const int32 timestamp_base) override; + virtual void EndTimePeriod(const int32 master_timestamp) override; + + void SetSubPort(unsigned n, MD_Input_Device* d); + + private: + MD_Input_Device* SubPort[4] = { nullptr, nullptr, nullptr, nullptr }; + + unsigned phase; + bool prev_th, prev_tr; + + uint8 bb[4][5]; + uint64 data_out; + unsigned data_out_offs; + uint8 nyb; +}; + diff --git a/Mednafen/mednafen/md/macros.h b/Mednafen/mednafen/md/macros.h new file mode 100644 index 0000000000..1a3e13df81 --- /dev/null +++ b/Mednafen/mednafen/md/macros.h @@ -0,0 +1,48 @@ + +#ifndef _MACROS_H_ +#define _MACROS_H_ + +static inline uint8 READ_BYTE_MSB(const uint8 *base, const unsigned int addr) +{ + return(base[addr + 0]); +} + +static inline uint16 READ_WORD_MSB(const uint8 *base, const unsigned int addr) +{ + return((base[addr + 0] << 8) | (base[addr + 1] << 0)); +} + +static inline void WRITE_BYTE_MSB(uint8 *base, const unsigned int addr, const uint8 value) +{ + base[addr + 0] = value; +} + +static inline void WRITE_WORD_MSB(uint8 *base, const unsigned int addr, const uint16 value) +{ + base[addr + 0] = value >> 8; + base[addr + 1] = value; +} + +static inline uint8 READ_BYTE_LSB(const uint8 *base, const unsigned int addr) +{ + return(base[addr + 0]); +} + +static inline uint16 READ_WORD_LSB(const uint8 *base, const unsigned int addr) +{ + return((base[addr + 0] << 0) | (base[addr + 1] << 8)); +} + +static inline void WRITE_BYTE_LSB(uint8 *base, const unsigned int addr, const uint8 value) +{ + base[addr + 0] = value; +} + +static inline void WRITE_WORD_LSB(uint8 *base, const unsigned int addr, const uint16 value) +{ + base[addr + 0] = value >> 0; + base[addr + 1] = value >> 8; +} + +#endif /* _MACROS_H_ */ + diff --git a/Mednafen/mednafen/md/mem68k.cpp b/Mednafen/mednafen/md/mem68k.cpp new file mode 100644 index 0000000000..1be7750488 --- /dev/null +++ b/Mednafen/mednafen/md/mem68k.cpp @@ -0,0 +1,710 @@ +/* + Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "shared.h" + +namespace MDFN_IEN_MD +{ + +unsigned int m68k_read_bus_8(unsigned int address) +{ + uint16 temp = m68k_read_bus_16(address); + return ((address & 1) ? (temp & 0xFF) : (temp >> 8)); +} + +unsigned int m68k_read_bus_16(unsigned int address) +{ + uint16 temp = 0x4e71; + + if(address >= 0xC00000) + { + return (temp); + } + else + { + return (temp & 0xFF00); + } +} + +void m68k_unused_8_w(unsigned int address, unsigned int value) +{ + MD_DBG(MD_DBG_WARNING, "[MEM68K] Unused %08X = %02X\n", address, value); +} + +void m68k_unused_16_w(unsigned int address, unsigned int value) +{ + MD_DBG(MD_DBG_WARNING, "[MEM68K] Unused %08X = %04X\n", address, value); +} + +/* + Functions to handle memory accesses which cause the Genesis to halt + either temporarily (press RESET button to restart) or unrecoverably + (cycle power to restart). +*/ + +void m68k_lockup_w_8(unsigned int address, unsigned int value) +{ + MD_DBG(MD_DBG_WARNING, "[MEM68K] Lockup %08X = %02X (%08X)\n", address, value, C68k_Get_PC(&Main68K)); +} + +void m68k_lockup_w_16(unsigned int address, unsigned int value) +{ + MD_DBG(MD_DBG_WARNING, "[MEM68K] Lockup %08X = %04X (%08X)\n", address, value, C68k_Get_PC(&Main68K)); +} + +unsigned int m68k_lockup_r_8(unsigned int address) +{ + MD_DBG(MD_DBG_WARNING, "[MEM68K] Lockup %08X.b (%08X)\n", address, C68k_Get_PC(&Main68K)); + return -1; +} + +unsigned int m68k_lockup_r_16(unsigned int address) +{ + MD_DBG(MD_DBG_WARNING, "[MEM68K] Lockup %08X.w (%08X)\n", address, C68k_Get_PC(&Main68K)); + return -1; +} + +/*--------------------------------------------------------------------------*/ +/* 68000 memory handlers */ +/*--------------------------------------------------------------------------*/ + +uint8 MD_ReadMemory8(uint32 address) +{ + MD_UpdateSubStuff(); + + address &= 0xFFFFFF; + + //printf("Read8: %08x\n", address); + + switch((address >> 21) & 7) + { + case 0: /* ROM */ + case 1: + case 2: /* Unused */ + case 3: + return(MD_ExtRead8(address)); + + case 7: /* RAM */ + return READ_BYTE_MSB(work_ram, address & 0xFFFF); + + case 5: /* Z80 & I/O */ + if(address <= 0xA0FFFF) + { + if(zbusack == 1) + { + /* Z80 controls Z bus */ + return (m68k_read_bus_8(address)); + } + else + { + /* Read data from Z bus */ + switch(address & 0x6000) + { + case 0x0000: /* RAM */ + case 0x2000: + return (zram[(address & 0x1FFF)]); + + case 0x4000: /* YM2612 */ + return (MDSound_ReadFM(address & 3)); + + case 0x6000: /* Unused */ + switch(address & 0xFF00) + { + case 0x7F00: /* VDP */ + m68k_lockup_r_8(address); + + default: /* Unused */ + return (0xFF); + } + break; + } + } + } + else + { + switch((address >> 8) & 0xFF) + { + case 0x00: /* I/O CHIP */ + if(address <= 0xA1001F) + { + return (gen_io_r((address >> 1) & 0x0F)); + } + else + { + return (m68k_read_bus_8(address)); + } + break; + + case 0x10: /* MEMORY MODE */ + return (m68k_read_bus_8(address)); + + case 0x11: /* BUSACK */ + if((address & 1) == 0) + { + return (gen_busack_r() | (m68k_read_bus_8(address) & 0xFE)); + } + else + return (m68k_read_bus_8(address)); + + case 0x12: /* RESET */ + case 0x13: /* TIME */ + case 0x20: /* UNKNOWN */ + case 0x30: /* UNKNOWN */ + return (MD_ExtRead8(address)); + + default: /* Unused */ + return (m68k_lockup_r_8(address)); + } + } + break; + + case 6: /* VDP */ + if((address & 0xE700E0) == 0xC00000) + { + switch(address & 0x1F) + { + case 0x00: /* DATA */ + case 0x02: + return (MainVDP.vdp_data_r() >> 8); + + case 0x01: /* DATA */ + case 0x03: + return (MainVDP.vdp_data_r() & 0xFF); + + case 0x04: /* CTRL */ + case 0x06: + return ((m68k_read_bus_8(address) & 0xFC) | (MainVDP.vdp_ctrl_r() >> 8)); + + case 0x05: /* CTRL */ + case 0x07: + return (MainVDP.vdp_ctrl_r() & 0xFF); + + case 0x08: /* HVC */ + case 0x0A: + case 0x0C: + case 0x0E: + return (MainVDP.vdp_hvc_r() >> 8); + + case 0x09: /* HVC */ + case 0x0B: + case 0x0D: + case 0x0F: + return (MainVDP.vdp_hvc_r() & 0xFF); + + case 0x10: /* PSG */ + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return (m68k_lockup_r_8(address)); + + case 0x18: /* Unused */ + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + return (m68k_read_bus_8(address)); + } + } + else + { + /* Unused */ + return (m68k_lockup_r_8(address)); + } + break; + + case 4: /* Unused */ + return (m68k_lockup_r_8(address)); + } + + return -1; +} + + +uint16 MD_ReadMemory16(uint32 address) +{ + MD_UpdateSubStuff(); + + if(MDFN_UNLIKELY(address & 1)) + { + // TODO: Generate 68K exception(and remove address &= ~1) + MD_DBG(MD_DBG_WARNING, "[MEM68K] 16-bit unaligned read from 0x%08x\n", address); + address &= ~1; + } + address &= 0xFFFFFF; + + //printf("Read16: %08x\n", address); + + switch((address >> 21) & 7) + { + + case 0: /* ROM */ + case 1: + case 2: + case 3: + return(MD_ExtRead16(address)); + + case 7: /* RAM */ + return MDFN_de16msb(&work_ram[address & 0xFFFF]); + + case 5: /* Z80 & I/O */ + if(address <= 0xA0FFFF) + { + if(zbusack == 1) + { + return (m68k_read_bus_16(address)); + } + else + { + uint8 temp; + + switch(address & 0x6000) + { + case 0x0000: /* RAM */ + case 0x2000: + temp = zram[address & 0x1FFF]; + return (temp << 8 | temp); + + case 0x4000: /* YM2612 */ + temp = MDSound_ReadFM(address & 3); + return (temp << 8 | temp); + + case 0x6000: + switch(address & 0xFF00) + { + case 0x7F00: /* VDP */ + m68k_lockup_r_16(address); + + default: /* Unused */ + return (0xFFFF); + } + break; + } + } + } + else + { + if(address <= 0xA1001F) + { + uint8 temp = gen_io_r((address >> 1) & 0x0F); + return (temp << 8 | temp); + } + else + { + switch((address >> 8) & 0xFF) + { + case 0x10: /* MEMORY MODE */ + return (m68k_read_bus_16(address)); + + case 0x11: /* BUSACK */ + return ((m68k_read_bus_16(address) & 0xFEFF) | (gen_busack_r() << 8)); + + case 0x12: /* RESET */ + case 0x13: /* TIME */ + case 0x20: /* UNKNOWN */ + case 0x30: /* UNKNOWN */ + return(MD_ExtRead16(address)); + + default: /* Unused */ + return (m68k_lockup_r_16(address)); + } + } + } + break; + + case 6: + if((address & 0xE700E0) == 0xC00000) + { + switch(address & 0x1F) + { + case 0x00: /* DATA */ + case 0x02: + return (MainVDP.vdp_data_r()); + + case 0x04: /* CTRL */ + case 0x06: + return (MainVDP.vdp_ctrl_r() | (m68k_read_bus_16(address) & 0xFC00)); + + case 0x08: /* HVC */ + case 0x0A: + case 0x0C: + case 0x0E: + return (MainVDP.vdp_hvc_r()); + + case 0x10: /* PSG */ + case 0x12: + case 0x14: + case 0x16: + return (m68k_lockup_r_16(address)); + + case 0x18: /* Unused */ + case 0x1A: + case 0x1C: + case 0x1E: + return (m68k_read_bus_16(address)); + } + } + else + { + return (m68k_lockup_r_16(address)); + } + break; + + case 4: + return (m68k_lockup_r_16(address)); + } + + return (0xA5A5); +} + + +void MD_WriteMemory8(uint32 address, uint8 value) +{ + MD_UpdateSubStuff(); + + address &= 0xFFFFFF; + + //printf("Write8: %08x %02x\n", address & 0xFFFFFF, value); + + switch((address >> 21) & 7) + { + case 7: + WRITE_BYTE_MSB(work_ram, address & 0xFFFF, value); + return; + + case 6: + if((address & 0xE700E0) == 0xC00000) + { + switch(address & 0x1F) + { + case 0x00: /* DATA */ + case 0x01: + case 0x02: + case 0x03: + MainVDP.vdp_data_w(value << 8 | value); + return; + + case 0x04: /* CTRL */ + case 0x05: + case 0x06: + case 0x07: + MainVDP.vdp_ctrl_w(value << 8 | value); + return; + + case 0x08: /* HVC */ + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + m68k_lockup_w_8(address, value); + return; + + case 0x10: /* PSG */ + case 0x12: + case 0x14: + case 0x16: + m68k_unused_8_w(address, value); + return; + + case 0x11: /* PSG */ + case 0x13: + case 0x15: + case 0x17: + psg_write(value); + return; + + case 0x18: /* Unused */ + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + m68k_unused_8_w(address, value); + return; + } + } + else + { + m68k_lockup_w_8(address, value); + return; + } + + case 5: + if(address <= 0xA0FFFF) + { + if(zbusack == 1) + { + m68k_unused_8_w(address, value); + return; + } + else + { + switch(address & 0x6000) + { + case 0x0000: + case 0x2000: + zram[(address & 0x1FFF)] = value; + return; + + case 0x4000: + fm_write(address & 3, value); + return; + + case 0x6000: + switch(address & 0xFF00) + { + case 0x6000: /* BANK */ + gen_bank_w(value & 1); + return; + + case 0x7F00: /* VDP */ + m68k_lockup_w_8(address, value); + return; + + default: /* Unused */ + m68k_unused_8_w(address, value); + return; + } + break; + } + } + } + else + { + if(address <= 0xA1001F) + { + /* I/O chip only gets /LWR */ + if(address & 1) + gen_io_w((address >> 1) & 0x0F, value); + return; + } + else + { + /* Bus control chip registers */ + switch((address >> 8) & 0xFF) + { + case 0x10: /* MEMORY MODE */ + m68k_unused_8_w(address, value); + return; + + case 0x11: /* BUSREQ */ + if((address & 1) == 0) + { + gen_busreq_w(value & 1); + } + else + { + m68k_unused_8_w(address, value); + } + return; + + case 0x12: /* RESET */ + gen_reset_w(value & 1); + return; + + case 0x13: /* TIME */ + case 0x20: /* UNKNOWN */ + case 0x30: /* UNKNOWN */ + MD_ExtWrite8(address, value); + return; + + default: /* Unused */ + m68k_lockup_w_8(address, value); + return; + } + } + } + break; + + + case 0: /* ROM */ + case 1: /* ROM */ + case 2: /* Unused */ + case 3: + MD_ExtWrite8(address, value); + //m68k_unused_8_w(address, value); + return; + + case 4: /* Unused */ + m68k_lockup_w_8(address, value); + return; + } + +} + + +void MD_WriteMemory16(uint32 address, uint16 value) +{ + MD_UpdateSubStuff(); + + if(MDFN_UNLIKELY(address & 1)) + { + // TODO: Generate 68K exception(and remove address &= ~1) + MD_DBG(MD_DBG_WARNING, "[MEM68K] 16-bit unaligned write to 0x%08x, =0x%04x\n", address, value); + address &= ~1; + } + address &= 0xFFFFFF; + + //printf("Write16: %08x %04x\n", address & 0xFFFFFF, value); + + switch((address >> 21) & 7) + { + case 0: /* ROM */ + case 1: /* ROM */ + case 2: /* Unused */ + case 3: + MD_ExtWrite16(address, value); + return; + + case 4: /* Unused */ + m68k_lockup_w_16(address, value); + return; + + case 5: /* Z80 area, I/O chip, miscellaneous. */ + if(address <= 0xA0FFFF) + { + /* Writes are ignored when the Z80 hogs the Z-bus */ + if(zbusack == 1) { + m68k_unused_8_w(address, value); + return; + } + + /* Write into Z80 address space */ + switch(address & 0x6000) + { + case 0x0000: /* Work RAM */ + case 0x2000: /* Work RAM */ + zram[(address & 0x1FFF)] = (value >> 8) & 0xFF; + return; + + case 0x4000: /* YM2612 */ + fm_write(address & 3, (value >> 8) & 0xFF); + return; + + case 0x6000: /* Bank register and VDP */ + switch(address & 0x7F00) + { + case 0x6000: /* Bank register */ + MD_DBG(MD_DBG_WARNING, "[MEM68K] 16-bit bank register write: 0x%04x\n", value); + gen_bank_w((value >> 8) & 1); + return; + + case 0x7F00: /* VDP registers */ + m68k_lockup_w_16(address, value); + return; + + default: /* Unused */ + m68k_unused_16_w(address, value); + return; + } + break; + } + } + else + { + /* I/O chip */ + if(address <= 0xA1001F) + { + gen_io_w((address >> 1) & 0x0F, value & 0x00FF); + return; + } + else + { + /* Bus control chip registers */ + switch((address >> 8) & 0xFF) + { + case 0x10: /* MEMORY MODE */ + m68k_unused_16_w(address, value); + return; + + case 0x11: /* BUSREQ */ + gen_busreq_w((value >> 8) & 1); + return; + + case 0x12: /* RESET */ + gen_reset_w((value >> 8) & 1); + return; + + case 0x13: /* TIME */ + case 0x20: /* UNKNOWN */ + case 0x30: /* UNKNOWN */ + MD_ExtWrite16(address, value); + return; + + default: /* Unused */ + m68k_lockup_w_16(address, value); + return; + } + } + } + break; + + case 6: /* VDP */ + if((address & 0xE700E0) == 0xC00000) + { + switch(address & 0x1C) + { + case 0x00: /* DATA */ + MainVDP.vdp_data_w(value); + return; + + case 0x04: /* CTRL */ + MainVDP.vdp_ctrl_w(value); + return; + + case 0x08: /* HV counter */ + case 0x0C: /* HV counter */ + m68k_lockup_w_16(address, value); + return; + + case 0x10: /* PSG */ + case 0x14: /* PSG */ + psg_write(value & 0xFF); + return; + + case 0x18: /* Unused */ + case 0x1C: /* Unused */ + m68k_unused_8_w(address, value); + return; + } + } + else + { + /* Invalid address */ + m68k_lockup_w_16(address, value); + } + break; + + case 7: /* Work RAM */ + WRITE_WORD_MSB(work_ram, address & 0xFFFF, value); + return; + } +} + +} diff --git a/Mednafen/mednafen/md/mem68k.h b/Mednafen/mednafen/md/mem68k.h new file mode 100644 index 0000000000..fbf3ec7969 --- /dev/null +++ b/Mednafen/mednafen/md/mem68k.h @@ -0,0 +1,24 @@ +#ifndef _MEM68K_H_ +#define _MEM68K_H_ + +namespace MDFN_IEN_MD +{ + +/* Function prototypes */ +unsigned int m68k_read_bus_8(unsigned int address); +unsigned int m68k_read_bus_16(unsigned int address); + +void m68k_lockup_w_8(unsigned int address, unsigned int value); +void m68k_lockup_w_16(unsigned int address, unsigned int value); +unsigned int m68k_lockup_r_8(unsigned int address); +unsigned int m68k_lockup_r_16(unsigned int address); + + +uint8 MD_ReadMemory8(uint32 address); +uint16 MD_ReadMemory16(uint32 address); +void MD_WriteMemory8(uint32 address, uint8 value); +void MD_WriteMemory16(uint32 address, uint16 value); + +} + +#endif /* _MEM68K_H_ */ diff --git a/Mednafen/mednafen/md/membnk.cpp b/Mednafen/mednafen/md/membnk.cpp new file mode 100644 index 0000000000..51788f82de --- /dev/null +++ b/Mednafen/mednafen/md/membnk.cpp @@ -0,0 +1,324 @@ +/* + membnk.c -- + Memory handlers Z80 access to the banked V-bus address space. +*/ + +#include "shared.h" +#include "cart/cart.h" + +namespace MDFN_IEN_MD +{ + +void z80_write_banked_memory(unsigned int address, unsigned int data) +{ + //printf("Z80 Banked Write: %02x, %08x, %02x\n", address >> 21, address, data); + + switch((address >> 21) & 7) + { + case 0: /* Cartridge ROM */ + case 1: + MD_ExtWrite8(address, data); + return; + + case 2: /* Unused */ + case 3: + MD_ExtWrite8(address, data); + return; + + case 4: /* Unused (lockup) */ + z80bank_lockup_w(address, data); + return; + + case 5: /* Z80, I/O chip, etc. */ + if(address <= 0xA0FFFF) + { + z80bank_lockup_w(address, data); + return; + } + else + { + switch((address >> 8) & 0xFF) + { + case 0x00: /* I/O chip */ + if(address <= 0xA1001F) + gen_io_w((address >> 1) & 0x0F, data); + else + z80bank_unused_w(address, data); + return; + + case 0x10: /* DRAM refresh */ + z80bank_unused_w(address, data); + return; + + case 0x11: /* /BUSREQ */ + if(address & 1) + z80bank_unused_w(address, data); + else + gen_busreq_w(data & 1); + return; + + case 0x12: /* /RESET (w) */ + if(address & 1) + z80bank_unused_w(address, data); + else + gen_reset_w(data & 1); + return; + + case 0x13: /* /TIME region */ + case 0x20: /* ? */ + case 0x30: /* ? */ + MD_ExtWrite8(address, data); + return; + + default: /* Invalid */ + z80bank_lockup_w(address, data); + return; + } + } + return; + + case 6: /* VDP */ + z80bank_vdp_w(address, data); + return; + + case 7: /* Work RAM */ + WRITE_BYTE_MSB(work_ram, address & 0xFFFF, data); + return; + } +} + + +int z80_read_banked_memory(unsigned int address) +{ + //printf("Z80 Banked Read: %02x, %08x\n", address >> 21, address); + + switch((address >> 21) & 7) + { + case 0: /* Cartridge ROM */ + case 1: + return(MD_ExtRead8(address)); + + case 2: /* Unused */ + case 3: + return(MD_ExtRead8(address)); + + case 4: /* Unused (lockup) */ + return z80bank_lockup_r(address); + + case 5: /* Z80, I/O chip, etc.*/ + if(address <= 0xA0FFFF) + { + return z80bank_lockup_r(address); + } + else + { + switch((address >> 8) & 0xFF) + { + case 0x00: /* I/O chip */ + if(address <= 0xA1001F) + return gen_io_r((address >> 1) & 0x0F); + else + return z80bank_unused_r(address); + break; + + case 0x10: /* Unused */ + return z80bank_unused_r(address); + + case 0x11: /* /BUSACK from Z80 */ + /* The Z80 can't read this bit (it would be halted + when the bit was zero) so we always return '1'. */ + return 0xFF; + + case 0x12: /* Unused */ + case 0x13: /* /TIME region */ + case 0x20: /* Unused */ + case 0x30: /* Unused */ + return(MD_ExtRead8(address)); + + default: /* Lockup */ + return z80bank_lockup_r(address); + } + } + break; + + case 6: /* VDP */ + return z80bank_vdp_r(address); + + case 7: /* Work RAM - can't be read on some Genesis models (!) */ + return 0xFF; + } + + return (-1); +} + + +void z80bank_vdp_w(int address, int data) +{ + if((address & 0xE700E0) == 0xC00000) + { + switch(address & 0x1F) + { + case 0x00: /* Data port */ + case 0x01: + case 0x02: + case 0x03: + puts("MOO2"); + MainVDP.vdp_data_w(data << 8 | data); + return; + + case 0x04: /* Control port */ + case 0x05: + case 0x06: + case 0x07: + MainVDP.vdp_ctrl_w(data << 8 | data); + return; + + case 0x08: /* Lockup (HVC) */ + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + z80bank_lockup_w(address, data); + return; + + case 0x10: /* Unused */ + case 0x12: + case 0x14: + case 0x16: + z80bank_unused_w(address, data); + return; + + case 0x11: /* PSG */ + case 0x13: + case 0x15: + case 0x17: + psg_write(data); + return; + + case 0x18: /* Unused */ + case 0x19: + case 0x1A: + case 0x1B: + z80bank_unused_w(address, data); + return; + + case 0x1C: /* Test register */ + case 0x1D: + case 0x1E: + case 0x1F: + MainVDP.vdp_test_w(data << 8 | data); + return; + } + } + else + { + /* Invalid VDP address */ + z80bank_lockup_w(address, data); + return; + } +} + + +int z80bank_vdp_r(int address) +{ + if((address & 0xE700E0) == 0xC00000) + { + switch(address & 0x1F) + { + case 0x00: /* Data */ + case 0x02: + return (MainVDP.vdp_data_r() >> 8) & 0xFF; + + case 0x01: /* Data */ + case 0x03: + return MainVDP.vdp_data_r() & 0xFF; + + case 0x04: /* Control */ + case 0x06: + return (0xFC | (MainVDP.vdp_ctrl_r() >> 8)) & 0xFF; + + case 0x05: /* Control */ + case 0x07: + return MainVDP.vdp_ctrl_r() & 0xFF; + + case 0x08: /* HVC */ + case 0x0A: + case 0x0C: + case 0x0E: + return (MainVDP.vdp_hvc_r() >> 8) & 0xFF; + + case 0x09: /* HVC */ + case 0x0B: + case 0x0D: + case 0x0F: + return MainVDP.vdp_hvc_r() & 0xFF; + + case 0x10: /* Lockup */ + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return z80bank_lockup_r(address); + + case 0x18: /* Unused */ + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + return (z80bank_unused_r(address) | 0xFF); + } + } + else + { + /* Invalid VDP address */ + return z80bank_lockup_r(address); + } + + return 0xFF; +} + + + + +/* + Handlers for access to unused addresses and those which make the + machine lock up. +*/ +void z80bank_unused_w(int address, int data) +{ + MD_DBG(MD_DBG_WARNING, "[MEMBNK] unused write %06X = %02X (%04X)\n", address, data, z80_getpc()); +} + +int z80bank_unused_r(int address) +{ + MD_DBG(MD_DBG_WARNING, "[MEMBNK] unused read %06X (%04X)\n", address, z80_getpc()); + return (address & 1) ? 0x00 : 0xFF; +} + +void z80bank_lockup_w(int address, int data) +{ + MD_DBG(MD_DBG_WARNING, "[MEMBNK] lockup write %06X = %02X (%04X)\n", address, data, z80_getpc()); + gen_running = 0; + // FIXME/TODO + //z80_end_timeslice(); +} + +int z80bank_lockup_r(int address) +{ + MD_DBG(MD_DBG_WARNING, "[MEMBNK] lockup read %06X (%04X)\n", address, z80_getpc()); + gen_running = 0; + //z80_end_timeslice(); + // FIXME/TODO + return 0xFF; +} + +} diff --git a/Mednafen/mednafen/md/membnk.h b/Mednafen/mednafen/md/membnk.h new file mode 100644 index 0000000000..45e2727eda --- /dev/null +++ b/Mednafen/mednafen/md/membnk.h @@ -0,0 +1,22 @@ + +#ifndef _MEMBNK_H_ +#define _MEMBNK_H_ + +namespace MDFN_IEN_MD +{ + +/* Function prototypes */ +void z80_write_banked_memory(unsigned int address, unsigned int data); +int z80_read_banked_memory(unsigned int address); + +void z80bank_vdp_w(int address, int data); +int z80bank_vdp_r(int address); + +void z80bank_unused_w(int address, int data); +int z80bank_unused_r(int address); +void z80bank_lockup_w(int address, int data); +int z80bank_lockup_r(int address); + +} + +#endif /* _MEMBNK_H_ */ diff --git a/Mednafen/mednafen/md/memvdp.cpp b/Mednafen/mednafen/md/memvdp.cpp new file mode 100644 index 0000000000..a0f8528131 --- /dev/null +++ b/Mednafen/mednafen/md/memvdp.cpp @@ -0,0 +1,59 @@ +/* + memvdp.c -- + Memory handlers for when the VDP reads the V-bus during DMA. +*/ + +#include "shared.h" +#include "cart/cart.h" + +namespace MDFN_IEN_MD +{ + +unsigned int vdp_dma_r(unsigned int address) +{ + switch((address >> 21) & 7) + { + case 0: /* Cartridge ROM */ + case 1: + case 2: /* Unused */ + case 3: + return(MD_ExtRead16(address)); + //return READ_WORD_MSB(cart_rom, address); + //return 0xFF00; + + case 4: /* Work RAM */ + case 6: + case 7: + return READ_WORD_MSB(work_ram, address & 0xFFFF); + + case 5: /* Z80 area and I/O chip */ + + /* Z80 area always returns $FFFF */ + if(address <= 0xA0FFFF) + { + /* Return $FFFF only when the Z80 isn't hogging the Z-bus. + (e.g. Z80 isn't reset and 68000 has the bus) */ + return (zbusack == 0) + ? 0xFFFF + : READ_WORD_MSB(work_ram, address & 0xFFFF); + } + else + + /* The I/O chip and work RAM try to drive the data bus which + results in both values being combined in random ways when read. + We return the I/O chip values which seem to have precedence, */ + if(address <= 0xA1001F) + { + uint8 temp = gen_io_r((address >> 1) & 0x0F); + return (temp << 8 | temp); + } + else + + /* All remaining locations access work RAM */ + return READ_WORD_MSB(work_ram, address & 0xFFFF); + } + + return -1; +} + +} diff --git a/Mednafen/mednafen/md/memvdp.h b/Mednafen/mednafen/md/memvdp.h new file mode 100644 index 0000000000..1945199415 --- /dev/null +++ b/Mednafen/mednafen/md/memvdp.h @@ -0,0 +1,14 @@ + +#ifndef _MEMVDP_H_ +#define _MEMVDP_H_ + +namespace MDFN_IEN_MD +{ + + +/* Function prototypes */ +unsigned int vdp_dma_r(unsigned int address); + +} + +#endif /* _MEMVDP_H_ */ diff --git a/Mednafen/mednafen/md/memz80.cpp b/Mednafen/mednafen/md/memz80.cpp new file mode 100644 index 0000000000..c9322d6205 --- /dev/null +++ b/Mednafen/mednafen/md/memz80.cpp @@ -0,0 +1,255 @@ +/* + memz80.c -- + Memory handlers for Z80 memory and port access, and the Z80 to + VDP interface. +*/ + +#define LOG_PORT 0 /* 1= Log Z80 I/O port accesses */ + +#include "shared.h" + +namespace MDFN_IEN_MD +{ + + +uint8 MD_Z80_ReadByte(uint16 address) +{ + switch((address >> 13) & 7) + { + case 0: /* Work RAM */ + case 1: + return zram[address & 0x1FFF]; + + case 2: /* YM2612 */ + return MDSound_ReadFM(address & 3); + + case 3: /* VDP */ + // printf("Z80 Read: %08x, %04x, %08x\n", zbank, address, zbank | address); + if((address & 0xFF00) == 0x7F00) + return z80_vdp_r(address); + return 0xFF; + + default: /* V-bus bank */ + return z80_read_banked_memory(zbank | (address & 0x7FFF)); + } + + return 0xFF; +} + + +void MD_Z80_WriteByte(uint16 address, uint8 data) +{ + switch((address >> 13) & 7) + { + case 0: /* Work RAM */ + case 1: + zram[address & 0x1FFF] = data; + return; + + case 2: /* YM2612 */ + fm_write(address & 3, data); + return; + + case 3: /* Bank register and VDP */ + //printf("Z80 Write: %08x, %04x, %08x\n", zbank, address, zbank | address); + switch(address & 0xFF00) + { + case 0x6000: + gen_bank_w(data & 1); + return; + + case 0x7F00: + z80_vdp_w(address, data); + return; + + default: + z80_unused_w(address, data); + return; + } + return; + + default: /* V-bus bank */ + z80_write_banked_memory(zbank | (address & 0x7FFF), data); + return; + } +} + + +int z80_vdp_r(int address) +{ + switch(address & 0xFF) + { + case 0x00: /* VDP data port */ + case 0x02: + return (MainVDP.vdp_data_r() >> 8) & 0xFF; + + case 0x01: /* VDP data port */ + case 0x03: + return (MainVDP.vdp_data_r() & 0xFF); + + case 0x04: /* VDP control port */ + case 0x06: + return (0xFF | ((MainVDP.vdp_ctrl_r() >> 8) & 3)); + + case 0x05: /* VDP control port */ + case 0x07: + return (MainVDP.vdp_ctrl_r() & 0xFF); + + case 0x08: /* HV counter */ + case 0x0A: + case 0x0C: + case 0x0E: + return (MainVDP.vdp_hvc_r() >> 8) & 0xFF; + + case 0x09: /* HV counter */ + case 0x0B: + case 0x0D: + case 0x0F: + return (MainVDP.vdp_hvc_r() & 0xFF); + + case 0x10: /* Unused (PSG) */ + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + return z80_lockup_r(address); + + case 0x18: /* Unused */ + case 0x19: + case 0x1A: + case 0x1B: + return z80_unused_r(address); + + case 0x1C: /* Unused (test register) */ + case 0x1D: + case 0x1E: + case 0x1F: + return z80_unused_r(address); + + default: /* Invalid VDP addresses */ + return z80_lockup_r(address); + } + + return 0xFF; +} + + +void z80_vdp_w(int address, int data) +{ + switch(address & 0xFF) + { + case 0x00: /* VDP data port */ + case 0x01: + case 0x02: + case 0x03: + puts("MOO"); + MainVDP.vdp_data_w(data << 8 | data); + return; + + case 0x04: /* VDP control port */ + case 0x05: + case 0x06: + case 0x07: + MainVDP.vdp_ctrl_w(data << 8 | data); + return; + + case 0x08: /* Unused (HV counter) */ + case 0x09: + case 0x0A: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + z80_lockup_w(address, data); + return; + + case 0x11: /* PSG */ + case 0x13: + case 0x15: + case 0x17: + psg_write(data); + return; + + case 0x10: /* Unused */ + case 0x12: + case 0x14: + case 0x16: + z80_unused_w(address, data); + + case 0x18: /* Unused */ + case 0x19: + case 0x1A: + case 0x1B: + z80_unused_w(address, data); + return; + + case 0x1C: /* Test register */ + case 0x1D: + case 0x1E: + case 0x1F: + MainVDP.vdp_test_w(data << 8 | data); + return; + + default: /* Invalid VDP addresses */ + z80_lockup_w(address, data); + return; + } +} + + +/* + Port handlers. Ports are unused when not in Mark III compatability mode. + + Games that access ports anyway: + - Thunder Force IV reads port $BF in its interrupt handler. +*/ + +uint8 MD_Z80_ReadPort(uint16 address) +{ + MD_DBG(MD_DBG_WARNING, "[MEMZ80] read port %04X (%04X)\n", address, z80_getpc()); + return 0xFF; +} + +void MD_Z80_WritePort(uint16 address, uint8 data) +{ + MD_DBG(MD_DBG_WARNING, "[MEMZ80] write %02X to port %04X (%04X)\n", data, address, z80_getpc()); +} + + +/* + Handlers for access to unused addresses and those which make the + machine lock up. +*/ +void z80_unused_w(int address, int data) +{ + MD_DBG(MD_DBG_WARNING, "[MEMZ80] unused write %04X = %02X (%04X)\n", address, data, z80_getpc()); +} + +int z80_unused_r(int address) +{ + MD_DBG(MD_DBG_WARNING, "[MEMZ80] unused read %04X (%04X)\n", address, z80_getpc()); + return 0xFF; +} + +void z80_lockup_w(int address, int data) +{ + MD_DBG(MD_DBG_WARNING, "[MEMZ80] lockup write %04X = %02X (%04X)\n", address, data, z80_getpc()); + gen_running = 0; + //z80_end_timeslice(); + // FIXME/TODO +} + +int z80_lockup_r(int address) +{ + MD_DBG(MD_DBG_WARNING, "[MEMZ80] lockup read %04X (%04X)\n", address, z80_getpc()); + gen_running = 0; + //z80_end_timeslice(); + // FIXME/TODO + return 0xFF; +} + +} diff --git a/Mednafen/mednafen/md/memz80.h b/Mednafen/mednafen/md/memz80.h new file mode 100644 index 0000000000..54a6e789ee --- /dev/null +++ b/Mednafen/mednafen/md/memz80.h @@ -0,0 +1,23 @@ + +#ifndef _MEMZ80_H_ +#define _MEMZ80_H_ + +namespace MDFN_IEN_MD +{ + +/* Function prototypes */ +uint8 MD_Z80_ReadByte(uint16 address); +void MD_Z80_WriteByte(uint16 address, uint8 data); +uint8 MD_Z80_ReadPort(uint16 address); +void MD_Z80_WritePort(uint16 address, uint8 data); + +void z80_unused_w(int address, int data); +int z80_unused_r(int address); +void z80_lockup_w(int address, int data); +int z80_lockup_r(int address); +int z80_vdp_r(int address); +void z80_vdp_w(int address, int data); + +} + +#endif /* _MEMZ80_H_ */ diff --git a/Mednafen/mednafen/md/shared.h b/Mednafen/mednafen/md/shared.h new file mode 100644 index 0000000000..ce88ffba69 --- /dev/null +++ b/Mednafen/mednafen/md/shared.h @@ -0,0 +1,35 @@ +#ifndef _SHARED_H_ +#define _SHARED_H_ + +#include + +#include +#include +#include + +#include +#include + +enum +{ + CLOCK_NTSC = 53693175, + CLOCK_PAL = 53203424 // Is this correct? +}; + +#include "macros.h" +#include "header.h" +#include "debug.h" +#include "genesis.h" +#include "mem68k.h" +#include "memz80.h" +#include "membnk.h" +#include "memvdp.h" +#include "system.h" +#include "genio.h" +#include "sound.h" +#include "vdp.h" + +using namespace MDFN_IEN_MD; + +#endif /* _SHARED_H_ */ + diff --git a/Mednafen/mednafen/md/sound.cpp b/Mednafen/mednafen/md/sound.cpp new file mode 100644 index 0000000000..f436477c2b --- /dev/null +++ b/Mednafen/mednafen/md/sound.cpp @@ -0,0 +1,197 @@ +/* + sound.c + YM2612 and SN76489 emulation +*/ + +#include "shared.h" +#include +#include +#include +#include + +static Stereo_Buffer zebuf; +static Sms_Apu apu; + +/* YM2612 data */ +static Blip_Synth FMSynth; +static int16 fm_last_values[2]; +static int32 fm_last_timestamp; +static int32 fm_div; +static uint32 fm_latch; // Address latch(9-bits) +static Ym2612_Emu FMUnit; +static bool FMReset; + +namespace MDFN_IEN_MD +{ + +static void UpdateFM(void) +{ + int32 cycles = md_timestamp - fm_last_timestamp; + + fm_div -= cycles; + while(fm_div <= 0) + { + int16 new_values[2]; + + new_values[0] = new_values[1] = 0; + + if(!FMReset) + FMUnit.run(new_values); + + //if(FSettings.SndRate) + { + FMSynth.offset((md_timestamp + fm_div) / 15, new_values[0] - fm_last_values[0], zebuf.left()); + FMSynth.offset((md_timestamp + fm_div) / 15, new_values[1] - fm_last_values[1], zebuf.right()); + + fm_last_values[0] = new_values[0]; + fm_last_values[1] = new_values[1]; + } + + fm_div += (72 * 7 * 2); + } + + fm_last_timestamp = md_timestamp; +} + +void fm_write(int address, int data) +{ + if(FMReset) + return; + + if(address & 0x1) + { + UpdateFM(); + + if(fm_latch & 0x100) + FMUnit.write1(fm_latch & 0xFF, data); + else + FMUnit.write0(fm_latch & 0xFF, data); + } + else + { + /* Register latch */ + fm_latch = data | ((address & 0x2) ? 0x100 : 0x00); + } +} + + +int MDSound_ReadFM(int address) +{ + if(FMReset) + return(0x00); + + UpdateFM(); + + return(FMUnit.read()); +} + +void MDSound_SetYM2612Reset(bool new_reset) +{ + // Only call the reset routine when reset begins, and just ignore all + // reads/writes while reset is active. + if(new_reset && !FMReset) + { + UpdateFM(); + FMUnit.reset(); + } + FMReset = new_reset; +} + + +void psg_write(int data) +{ + apu.write_data(md_timestamp / 15, data); +} + +static void RedoVolume(void) +{ + apu.output(zebuf.center(), zebuf.left(), zebuf.right()); + //apu.volume(0.15); + apu.volume(0.25); + FMSynth.volume(1.00); +} + +bool MDSound_SetSoundRate(uint32 rate) +{ + zebuf.set_sample_rate(rate ?rate : 44100, 60); + return(TRUE); +} + +int32 MDSound_Flush(int16 *SoundBuf, const int32 MaxSoundFrames) +{ + int32 FrameCount = 0; + + UpdateFM(); + apu.end_frame(md_timestamp / 15); + + zebuf.end_frame(md_timestamp / 15); + + if(SoundBuf) + FrameCount = zebuf.read_samples(SoundBuf, MaxSoundFrames * 2) / 2; + else + zebuf.clear(); + + fm_last_timestamp = 0; + + return(FrameCount); +} + +void MDSound_Init(void) +{ + MDSound_SetSoundRate(0); + zebuf.clock_rate((long)(CLOCK_NTSC / 15)); + + RedoVolume(); + zebuf.bass_freq(20); +} + +void MDSound_Kill(void) +{ + zebuf.clear(); + fm_last_values[0] = 0; + fm_last_values[1] = 0; +} + +void MDSound_Power(void) +{ + FMUnit.reset(); + apu.reset(); +} + +void MDSound_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + Sms_ApuState sn_state; + MDFN::LEPacker fm_slizer; + + apu.save_state(&sn_state); + FMUnit.serialize(fm_slizer, false); + + SFORMAT StateRegs[] = + { + SFVAR(fm_last_timestamp), + SFVAR(FMReset), + SFVAR(fm_div), + SFVAR(fm_latch), + + SFARRAYN(&fm_slizer[0], fm_slizer.size(), "FMState"), + + SFARRAY32N(sn_state.volume, 4, "Volume"), + SFARRAY32N(sn_state.sq_period, 3, "SQPeriod"), + SFARRAY32N(sn_state.sq_phase, 3, "SQPhase"), + SFVARN(sn_state.noise_period, "NPeriod"), + SFVARN(sn_state.noise_shifter, "NShifter"), + SFVARN(sn_state.noise_feedback, "NFeedback"), + SFVARN(sn_state.latch, "Latch"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "SND"); + + if(load) + { + FMUnit.serialize(fm_slizer, true); + apu.load_state(&sn_state); + } +} + +}; diff --git a/Mednafen/mednafen/md/sound.h b/Mednafen/mednafen/md/sound.h new file mode 100644 index 0000000000..08655ffc59 --- /dev/null +++ b/Mednafen/mednafen/md/sound.h @@ -0,0 +1,25 @@ + +#ifndef _SOUND_H_ +#define _SOUND_H_ + +namespace MDFN_IEN_MD +{ + +/* Function prototypes */ +void fm_write(int address, int data); +void psg_write(int data); + +void MDSound_SetYM2612Reset(bool new_reset); +int MDSound_ReadFM(int address); +void MDSound_SetSoundMultiplier(double multiplier); +bool MDSound_SetSoundRate(uint32 rate); +int32 MDSound_Flush(int16 *SoundBuf, const int32 MaxSoundFrames); +void MDSound_Init(void); +void MDSound_Kill(void); +void MDSound_Power(void); + +void MDSound_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +}; + +#endif /* _SOUND_H_ */ diff --git a/Mednafen/mednafen/md/system.cpp b/Mednafen/mednafen/md/system.cpp new file mode 100644 index 0000000000..b2e10974b2 --- /dev/null +++ b/Mednafen/mednafen/md/system.cpp @@ -0,0 +1,830 @@ +/* + Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "shared.h" +#include "cart/cart.h" +#include "cd/cd.h" +#include +#include +#include + +#include + +namespace MDFN_IEN_MD +{ + +enum +{ + REGION_SAME = 1, + REGION_GAME, + REGION_OVERSEAS_NTSC, + REGION_OVERSEAS_PAL, + REGION_DOMESTIC_NTSC, + REGION_DOMESTIC_PAL +}; + + +static const MDFNSetting_EnumList MultiTap_List[] = +{ + { "none", MTAP_NONE, gettext_noop("No multitap(s).") }, + + { "tp1", MTAP_TP_PRT1, gettext_noop("Team Player/Sega Tap on MD/Genesis port 1.") }, + { "tp2", MTAP_TP_PRT2, gettext_noop("Team Player/Sega Tap on MD/Genesis port 2.") }, + { "tpd", MTAP_TP_DUAL, gettext_noop("Team Player/Sega Tap on both MD/Genesis ports.") }, + + { "4way", MTAP_4WAY, gettext_noop("EA 4-Way Play") }, + + { NULL, 0 }, +}; + + +int MD_HackyHackyMode = 0; +bool MD_IsCD; +static int32 z80_cycle_counter; +static int32 z80_last_ts; +int32 md_timestamp; +static bool suspend68k = FALSE; + +static bool run_cpu; + +void MD_Suspend68K(bool state) +{ + suspend68k = state; +} + +bool MD_Is68KSuspended(void) +{ + return(suspend68k); +} + +static void system_init(bool overseas, bool PAL, bool overseas_reported, bool PAL_reported) +{ + gen_running = 1; + + z80_init(); + z80_readbyte = MD_Z80_ReadByte; + z80_writebyte = MD_Z80_WriteByte; + z80_readport = MD_Z80_ReadPort; + z80_writeport = MD_Z80_WritePort; + + gen_init(); + MDIO_Init(overseas, PAL, overseas_reported, PAL_reported); + MainVDP.SetSettings(PAL, PAL_reported, MDFN_GetSettingB("md.correct_aspect")); + +#ifdef WANT_DEBUGGER + MDDBG_Init(); +#endif + +} + +static void system_reset(bool poweron) +{ + z80_cycle_counter = 0; + z80_last_ts = 0; + + if(MD_IsCD) + MDCD_Reset(poweron); + else + MDCart_Reset(); + + gen_reset(poweron); + if(poweron) + MainVDP.Reset(); + MDSound_Power(); +} + +void MD_ExitCPULoop(void) +{ + run_cpu = FALSE; +} + +void MD_UpdateSubStuff(void) +{ + int32 max_md_timestamp; + + max_md_timestamp = Main68K.timestamp * 7; + + if(zreset == 1 && zbusreq == 0) + { + z80_cycle_counter += max_md_timestamp - z80_last_ts; + + while(z80_cycle_counter > 0) + { + int32 z80_temp = z80_do_opcode() * 15; + + z80_cycle_counter -= z80_temp; + md_timestamp += z80_temp; + + if(md_timestamp > max_md_timestamp) + { + //printf("Meow: %d\n", md_timestamp - max_md_timestamp); + md_timestamp = max_md_timestamp; + } + MainVDP.Run(); + } + } + z80_last_ts = max_md_timestamp; + + md_timestamp = max_md_timestamp; + MainVDP.Run(); + + //if(MD_IsCD) + // MDCD_Run(master_cycles); +} + +void MD_DBG(unsigned level, const char *format, ...) throw() +{ +#if 0 + //if(md_dbg_level >= level) + { + va_list ap; + + va_start(ap, format); + + trio_vprintf(format, ap); + + va_end(ap); + } +#endif +} + + +static int system_frame(int do_skip) +{ + run_cpu = TRUE; + + while(run_cpu > 0) + { + if(suspend68k) + { + Main68K.timestamp += 4; + } + else + { + #ifdef WANT_DEBUGGER + if(MD_DebugMode) + MDDBG_CPUHook(); + #endif + + C68k_Exec(&Main68K); + } + + MD_UpdateSubStuff(); + } + return gen_running; +} + +static void Emulate(EmulateSpecStruct *espec) +{ + MDFNMP_ApplyPeriodicCheats(); + + MDIO_BeginTimePeriod(md_timestamp); + + MDINPUT_Frame(); + + if(espec->VideoFormatChanged) + MainVDP.SetPixelFormat(espec->surface->format); //.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift); + + if(espec->SoundFormatChanged) + MDSound_SetSoundRate(espec->SoundRate); + + MainVDP.SetSurface(espec); //espec->surface, &espec->DisplayRect); + + system_frame(0); + + espec->MasterCycles = md_timestamp; + + espec->SoundBufSize = MDSound_Flush(espec->SoundBuf, espec->SoundBufMaxSize); + +#if 0 + { + static double avg = 0; + static double s_avg = 0; + + avg += (espec->MasterCycles - avg) * 0.05; + s_avg += (espec->SoundBufSize - s_avg) * 0.05; + printf("%f, %f\n", avg / 262 / 10, 48000 / s_avg); + } +#endif + + MDIO_EndTimePeriod(md_timestamp); + + md_timestamp = 0; + z80_last_ts = 0; + Main68K.timestamp = 0; + MainVDP.ResetTS(); + + //MainVDP.SetSurface(NULL); +} + +static void Cleanup(void) +{ + MDCart_Kill(); + MDIO_Kill(); + + MDSound_Kill(); +} + +static void CloseGame(void) +{ + try + { + MDCart_SaveNV(); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + + Cleanup(); +} + +static const struct +{ + const char* prod_code; + uint32 crc32; + bool compat_6button; + unsigned tap; + unsigned max_players; +} +InputDB[] = +{ + { NULL, 0x2c6cbd77, true, MTAP_TP_PRT1, 4 }, // Aq Renkan Awa (China) (Unl) + { "MK-1234 -00", 0x8c822884, true, MTAP_TP_PRT1, 4 }, // ATP Tour Championship Tennis (USA) + { "MK-1234 -50", 0x1a3da8c5, true, MTAP_TP_PRT1, 4 }, // ATP Tour (Europe) + { "T-172106-01", 0xac5bc26a, true, MTAP_4WAY, 4 }, // Australian Rugby League (Europe) + { "T-119066-01", 0xde27357b, true, MTAP_TP_PRT1, 4 }, // Barkley Shut Up and Jam 2 (USA) (Beta) + { "T-119186-00", 0x321bb6bd, true, MTAP_TP_PRT1, 4 }, // Barkley Shut Up and Jam 2 (USA) + { "T-119066-00", 0x63fbf497, true, MTAP_TP_PRT1, 4 }, // Barkley Shut Up and Jam! (USA, Europe) + { "T-50826 -00", 0xa582f45a, true, MTAP_4WAY, 4 }, // Bill Walsh College Football 95 (USA) + { "T-50606 -00", 0x3ed83362, true, MTAP_4WAY, 4 }, // Bill Walsh College Football (USA, Europe) + { "T-172016-00", 0x67c309c6, true, MTAP_4WAY, 4 }, // Coach K College Basketball (USA) + { "T-172046-00", 0xb9075385, true, MTAP_4WAY, 4 }, // College Football USA 96 (USA) + { "T-172126-01", 0x2ebb90a3, true, MTAP_4WAY, 4 }, // College Football USA 97 (USA) + { "MK-1241 -00", 0x65b64413, true, MTAP_TP_PRT1, 4 }, // College Football's National Championship II (USA) + { "MK-1227 -00", 0x172c5dbb, true, MTAP_TP_PRT1, 4 }, // College Football's National Championship (USA) + { "T-81576 -00", 0x96a42431, true, MTAP_TP_PRT1, 4 }, // College Slam (USA) + { "T-23056 -00", 0xdc678f6d, true, MTAP_TP_PRT2, 5 }, // Columns III - Revenge of Columns (USA) + { "00004801-00", 0xcd07462f, true, MTAP_TP_PRT2, 5 }, // Columns III - Taiketsu! Columns World (Japan, Korea) + { "T-70276-00", 0x4608f53a, true, MTAP_TP_PRT2, 4 }, // Dino Dini's Soccer (Europe) + /* Can support dual multitap, *BUT* Some game modes are incompatible with multitap + { "T-95126-00", 0x8352b1d0, true, * }, // Double Dribble - The Playoff Edition (USA) + */ + { "T-70286 -00", 0xfdeed51d, true, MTAP_TP_PRT1, 3 }, // Dragon - The Bruce Lee Story (Europe) + { "T-81496 -00", 0xefe850e5, true, MTAP_TP_PRT1, 3 }, // Dragon - The Bruce Lee Story (USA) + { "T-50976 -00", 0xe10a25c0, true, MTAP_4WAY, 4 }, // Elitserien 95 (Sweden) + { "T-172096-00", 0x9821d0a3, true, MTAP_4WAY, 4 }, // Elitserien 96 (Sweden) + { NULL, 0xa427814a, true, MTAP_TP_PRT1, 4 }, // ESPN National Hockey Night (USA) (Beta) + { "T-93176 -00", 0x1d08828c, true, MTAP_TP_PRT1, 4 }, // ESPN National Hockey Night (USA) + { "T-79196-50", 0xfac29677, true, MTAP_TP_PRT1, 5 }, // Fever Pitch Soccer (Europe) (En,Fr,De,Es,It) + { "T-172206-00", 0x96947f57, true, MTAP_4WAY, 4 }, // FIFA 98 - Road to World Cup (Europe) (En,Fr,Es,It,Sv) + { "T-50706 -00", 0xbddbb763, true, MTAP_4WAY, 4 }, // FIFA International Soccer (USA, Europe) (En,Fr,De,Es) + { "T-50916 -01", 0x012591f9, true, MTAP_4WAY, 4 }, // FIFA Soccer 95 (Korea) (En,Fr,De,Es) + { "T-50916 -00", 0xb389d036, true, MTAP_4WAY, 4 }, // FIFA Soccer 95 (USA, Europe) (En,Fr,De,Es) + { "T-172086-00", 0xbad30ffa, true, MTAP_4WAY, 4 }, // FIFA Soccer 96 (USA, Europe) (En,Fr,De,Es,It,Sv) + { "T-172156-01", 0xa33d5803, true, MTAP_4WAY, 4 }, // FIFA Soccer 97 (USA, Europe) (En,Fr,De,Es,It,Sv) + // Maybe port2? { "T-81476 -00", 0x863e0950, true, MTAP_TP_PRT1, 4 }, // Frank Thomas Big Hurt Baseball (USA, Europe) + // Maybe port2? { "133037 -00", 0xcdf5678f, true, MTAP_TP_PRT1, 4 }, // From TV Animation Slam Dunk - Kyougou Makkou Taiketsu! (Japan) + { "T-48216 -00", 0x3bf46dce, true, MTAP_TP_PRT1, 4 }, // Gauntlet IV (USA, Europe) (En,Ja) (August 1993) + { "T-48123 -00", 0xf9d60510, true, MTAP_TP_PRT1, 4 }, // Gauntlet IV (USA, Europe) (En,Ja) (September 1993) + { "T-48123 -00", 0xf9872055, true, MTAP_TP_PRT1, 4 }, // Gauntlet (Japan) (En,Ja) + { "T-106253-00", 0x05cc7369, true, MTAP_4WAY, 4 }, // General Chaos (Japan) + { "T-50626 -00", 0xf1ecc4df, true, MTAP_4WAY, 4 }, // General Chaos (USA, Europe) + { "T-79196", 0xdcffa327, true, MTAP_TP_PRT1, 5 }, // Head-On Soccer (USA) + /* Can support dual multitap, *BUT* Some game modes are incompatible with multitap + { "T-95126-00", 0xf27c576a, true, * }, // Hyper Dunk (Europe) + { NULL, 0xdb124bbb, true, * }, // Hyper Dunk - The Playoff Edition (Japan) (Beta) + { "T-95083-00", 0x5baf53d7, true, * }, // Hyper Dunk - The Playoff Edition (Japan) + */ + { "T-50836 -00", 0xe04ffc2b, true, MTAP_4WAY, 4 }, // IMG International Tour Tennis (USA, Europe) + { "T-95196-50", 0x9bb3b180, true, MTAP_TP_PRT1, 5 }, // International Superstar Soccer Deluxe (Europe) + //{ "G-5540 00", 0x9fe71002, true, MTAP_TP_PRT2, 4 }, // J. League Pro Striker 2 (Japan) + { "G-5547", 0xe35e25fb, true, MTAP_TP_PRT1, 4 }, // J. League Pro Striker Final Stage (Japan) + //{ "00005518-00", 0xec229156, true, MTAP_TP_PRT1, 4 }, // J. League Pro Striker (Japan) (v1.0) + //{ "00005518-03", 0x2d5b7a11, true, MTAP_TP_PRT1, 4 }, // J. League Pro Striker (Japan) (v1.3) + //{ "00005532-00", 0x0abed379, true, MTAP_TP_PRT1, 4 }, // J. League Pro Striker Perfect (Japan) + { NULL, 0x17bed25f, true, MTAP_TP_PRT1, 3 }, // Lost Vikings, The (Europe) (Beta) + { "T-70226-500", 0x1f14efc6, true, MTAP_TP_PRT1, 3 }, // Lost Vikings, The (Europe) + { "T-125016-00", 0x7ba49edb, true, MTAP_TP_PRT1, 3 }, // Lost Vikings, The (USA) + { "T-50676 -00", 0xd14b811b, true, MTAP_4WAY, 4 }, // Madden NFL '94 (USA, Europe) + { "T-50926 -00", 0xdb0be0c2, true, MTAP_4WAY, 4 }, // Madden NFL 95 (USA, Europe) + { "T-172076-00", 0xf126918b, true, MTAP_4WAY, 4 }, // Madden NFL 96 (USA, Europe) + { "T-172136-00", 0xc4b4e112, true, MTAP_4WAY, 4 }, // Madden NFL 97 (USA, Europe) + { "T-172196-00", 0xe051ea62, true, MTAP_4WAY, 4 }, // Madden NFL 98 (USA) + { "MK-1573-00", 0x54ab3beb, true, MTAP_TP_PRT1, 4 }, // Mega Bomberman (Europe) + { "MK-1573-00", 0x4bd6667d, true, MTAP_TP_PRT1, 4 }, // Mega Bomberman (USA) + { NULL, 0xd41c0d81, true, MTAP_TP_DUAL, 8 }, // Mega Bomberman - 8 Player Demo (Unl) + { "T-120096-50", 0x01c22a5d, false, MTAP_TP_PRT1, 4 }, // Micro Machines 2 - Turbo Tournament (Europe) (J-Cart) (Alt 1) + { "T-120096-50", 0x42bfb7eb, false, MTAP_TP_PRT1, 4 }, // Micro Machines 2 - Turbo Tournament (Europe) (J-Cart) + { NULL, 0xb3abb15e, false, MTAP_TP_PRT1, 4 }, // Micro Machines Military (Europe) (J-Cart) + { NULL, 0x7492b1de, false, MTAP_TP_PRT1, 4 }, // Micro Machines Turbo Tournament 96 (Europe) (J-Cart) + { NULL, 0x23319d0d, false, MTAP_TP_PRT1, 4 }, // Micro Machines Turbo Tournament 96 (Europe) (v1.1) (J-Cart) + { "T-50816 -00", 0x14a8064d, true, MTAP_4WAY, 4 }, // MLBPA Baseball (USA) + { "T-50766 -00", 0x3529180f, true, MTAP_4WAY, 4 }, // Mutant League Hockey (USA, Europe) + { "MK-1221 -00", 0x99c348ba, true, MTAP_TP_PRT1, 5 }, // NBA Action '94 (USA) + { "MK-1236 -00", 0xaa7006d6, true, MTAP_TP_PRT1, 5 }, // NBA Action '95 Starring David Robinson (USA, Europe) + { "T-97136 -50", 0xedb4d4aa, true, MTAP_TP_PRT1, 4 }, // NBA Hang Time (Europe) + { "T-97136 -00", 0x176b0338, true, MTAP_TP_PRT1, 4 }, // NBA Hang Time (USA) + { "T-81033 00", 0xa6c6305a, true, MTAP_TP_PRT1, 4 }, // NBA Jam (Japan) + { "T-81406 -00", 0xe9ffcb37, true, MTAP_TP_PRT1, 4 }, // NBA Jam Tournament Edition (World) + { "T-081326 00", 0x10fa248f, true, MTAP_TP_PRT1, 4 }, // NBA Jam (USA, Europe) + { "T-081326 01", 0xeb8360e6, true, MTAP_TP_PRT1, 4 }, // NBA Jam (USA, Europe) (v1.1) + { "T-50936 -00", 0x779c1244, true, MTAP_4WAY, 4 }, // NBA Live 95 (Korea) + { "T-50936 -00", 0x66018abc, true, MTAP_4WAY, 4 }, // NBA Live 95 (USA, Europe) + { "T-172056-00", 0x49de0062, true, MTAP_4WAY, 4 }, // NBA Live 96 (USA, Europe) + { "T-172166-00", 0x7024843a, true, MTAP_4WAY, 4 }, // NBA Live 97 (USA, Europe) + { "T-172186-00", 0x23473a8a, true, MTAP_TP_PRT1, 4 }, // NBA Live 98 (USA) + { NULL, 0xeea19bce, true, MTAP_TP_PRT1, 4 }, // NBA Pro Basketball '94 (Japan) + { "T-50756 -00", 0x160b7090, true, MTAP_4WAY, 4 }, // NBA Showdown '94 (USA, Europe) + { "T-158016-00", 0xed0c1303, true, MTAP_TP_PRT1, 5 }, // NCAA Final Four Basketball (USA) + { "T-87106 -00", 0x081012f0, true, MTAP_TP_PRT1, 4 }, // NCAA Football (USA) + { "MK-1237 -00", 0xb58e4a81, true, MTAP_TP_PRT1, 4 }, // NFL '95 (USA, Europe) + { "MK-1243 -00", 0xf73ec54c, true, MTAP_TP_PRT1, 4 }, // NFL 98 (USA) + { "T-081586-00", 0xd5a37cab, true, MTAP_TP_PRT1, 4 }, // NFL Quarterback Club 96 (USA, Europe) + { "T-081276 00", 0x94542eaf, true, MTAP_TP_PRT1, 4 }, // NFL Quarterback Club (World) + { "T-50656 -00", 0x9438f5dd, true, MTAP_4WAY, 4 }, // NHL '94 (USA, Europe) + { "T-50856 -00", 0xe8ee917e, true, MTAP_4WAY, 4 }, // NHL 95 (USA, Europe) + { "T-172036-00", 0x8135702c, true, MTAP_4WAY, 4 }, // NHL 96 (USA, Europe) + { "T-172146-03", 0xf067c103, true, MTAP_4WAY, 4 }, // NHL 97 (USA, Europe) + { "T-172176-00", 0x7b64cd98, true, MTAP_4WAY, 4 }, // NHL 98 (USA) + { "00004107-00", 0x9d4b447a, true, MTAP_TP_PRT2, 5 }, // Party Quiz Mega Q (Japan) + { "T-119096-00", 0x05a486e9, true, MTAP_TP_PRT1, 4 }, // Pele II - World Tournament Soccer (USA, Europe) + { "G-4133-00", 0xd1e2324b, true, MTAP_TP_PRT2, 4 }, // Pepenga Pengo (Japan) + { "T-50796 -00", 0x8ca45acd, true, MTAP_4WAY, 4 }, // PGA European Tour (USA, Europe) + { "T-50946 -00", 0xaeb3f65f, true, MTAP_4WAY, 4 }, // PGA Tour Golf III (USA, Europe) + { "MK-1240 -00", 0x5aa53cbc, true, MTAP_TP_PRT1, 4 }, // Prime Time NFL Starring Deion Sanders (USA) + { "G-4128 -00", 0x7bdec762, true, MTAP_TP_PRT1, 4 }, // Puzzle & Action - Ichidanto-R (Japan) + { "G-4118 -00", 0xd2d2d437, true, MTAP_TP_PRT1, 4 }, // Puzzle & Action - Tanto-R (Japan) + { "T-50956 -00", 0x61f90a8a, true, MTAP_4WAY, 4 }, // Rugby World Cup 95 (USA, Europe) (En,Fr,It) + { "MK-1183 -00", 0x07fedaf1, true, MTAP_TP_PRT2, 4 }, // Sega Sports 1 (Europe) + { NULL, 0x72dd884f, true, MTAP_TP_PRT1, 4 }, // Shi Jie Zhi Bang Zheng Ba Zhan - World Pro Baseball 94 (China) (Unl) + { "MK-1233 -00", 0x7e3ecabf, true, MTAP_TP_PRT1, 5 }, // Sport Games (Brazil) [b] + { "T-177016-00", 0x1a58d5fe, true, MTAP_TP_PRT1, 4 }, // Street Racer (Europe) + { "T-95146-00", 0x1227b2b2, true, MTAP_TP_PRT1, 4 }, // Tiny Toon Adventures - Acme All-Stars (Europe) + { "T-95146-00", 0x2f9faa1d, true, MTAP_TP_PRT1, 4 }, // Tiny Toon Adventures - Acme All-Stars (USA, Korea) + { "T-172026-04", 0xf1748e91, true, MTAP_4WAY, 4 }, // Triple Play 96 (USA) + { "T-172116-00", 0xbbe69017, true, MTAP_4WAY, 4 }, // Triple Play - Gold Edition (USA) + //maybe port2? { NULL, 0x9d451f72, true, MTAP_TP_PRT1, 4 }, // Ultimate Soccer (Europe) (En,Fr,De,Es,It) (Beta) + //{ "MK1219 -00", 0x83db6e58, true, MTAP_TP_PRT1, 4 }, // Ultimate Soccer (Europe) (En,Fr,De,Es,It) + { "T-119156-00", 0x9920e7b7, true, MTAP_TP_PRT1, 4 }, // Unnecessary Roughness '95 (USA) + { "T-048416-00", 0xc2c13b81, true, MTAP_TP_PRT1, 4 }, // Wayne Gretzky and the NHLPA All-Stars (USA, Europe) + { "MK-1224 -50", 0xb791a435, true, MTAP_TP_PRT2, 4 }, // Wimbledon Championship Tennis (Europe) + { "G-4110 -00", 0x3e0c9daf, true, MTAP_TP_PRT2, 4 }, // Wimbledon Championship Tennis (Japan) + { NULL, 0x9febc760, true, MTAP_TP_PRT2, 4 }, // Wimbledon Championship Tennis (USA) (Beta) + { "MK-1224 -00", 0xf9142aee, true, MTAP_TP_PRT2, 4 }, // Wimbledon Championship Tennis (USA) + { "MK-1233 -00", 0x6065774d, true, MTAP_TP_PRT1, 5 }, // World Championship Soccer II (Europe) + { "MK-1233 -00", 0xc1dd1c8e, true, MTAP_TP_PRT1, 5 }, // World Championship Soccer II (USA) + { "T-79116-00", 0x0171b47f, true, MTAP_TP_PRT1, 4 }, // World Cup USA 94 (USA, Europe) + { "T-081316-00", 0x4ef5d411, true, MTAP_TP_PRT1, 4 }, // WWF Raw (World) + { "G-004122-00", 0x71ceac6f, true, MTAP_TP_PRT1, 4 }, // Yuu Yuu Hakusho - Makyou Toitsusen (Japan) + { "G-004122-00", 0xfe3fb8ee, true, MTAP_TP_PRT1, 4 }, // Yuu Yuu Hakusho - Sunset Fighters (Brazil) +}; + +static bool decode_region_setting(const int setting, bool &overseas, bool &pal) +{ + switch(setting) + { + default: assert(0); + return(false); + + case REGION_OVERSEAS_NTSC: + overseas = TRUE; + pal = FALSE; + return(TRUE); + + case REGION_OVERSEAS_PAL: + overseas = TRUE; + pal = TRUE; + return(TRUE); + + case REGION_DOMESTIC_NTSC: + overseas = FALSE; + pal = FALSE; + return(TRUE); + + case REGION_DOMESTIC_PAL: + overseas = FALSE; + pal = TRUE; + return(TRUE); + } +} + +static void LoadCommonPost(const md_game_info &ginfo) +{ + MDFN_printf(_("ROM: %dKiB\n"), (ginfo.rom_size + 1023) / 1024); + MDFN_printf(_("ROM CRC32: 0x%08x\n"), ginfo.crc32); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(ginfo.md5, 0).c_str()); + MDFN_printf(_("Header MD5: 0x%s\n"), md5_context::asciistr(ginfo.info_header_md5, 0).c_str()); + MDFN_printf(_("Product Code: %s\n"), ginfo.product_code); + MDFN_printf(_("Domestic name: %s\n"), ginfo.domestic_name); // TODO: Character set conversion(shift_jis -> utf-8) + MDFN_printf(_("Overseas name: %s\n"), ginfo.overseas_name); + MDFN_printf(_("Copyright: %s\n"), ginfo.copyright); + if(ginfo.checksum == ginfo.checksum_real) + MDFN_printf(_("Checksum: 0x%04x\n"), ginfo.checksum); + else + MDFN_printf(_("Checksum: 0x%04x\n Warning: calculated checksum(0x%04x) does not match\n"), ginfo.checksum, ginfo.checksum_real); + + MDFN_printf(_("Supported I/O devices:\n")); + MDFN_indent(1); + for(unsigned int iot = 0; iot < sizeof(IO_types) / sizeof(IO_type_t); iot++) + { + if(ginfo.io_support & (1 << IO_types[iot].id)) + MDFN_printf(_("%s\n"), _(IO_types[iot].name)); + } + MDFN_indent(-1); + + MDFNMP_Init(8192, (1 << 24) / 8192); + + for(uint32 A = (0x7 << 21); A < (0x8 << 21); A += 65536) + MDFNMP_AddRAM(65536, A, work_ram, (A == 0xFF0000)); + + MDFNGameInfo->GameSetMD5Valid = FALSE; + + MDSound_Init(); + + MDFN_printf(_("Supported regions:\n")); + MDFN_indent(1); + if(ginfo.region_support & REGIONMASK_JAPAN_NTSC) + MDFN_printf(_("Japan/Domestic NTSC\n")); + if(ginfo.region_support & REGIONMASK_JAPAN_PAL) + MDFN_printf(_("Japan/Domestic PAL\n")); + if(ginfo.region_support & REGIONMASK_OVERSEAS_NTSC) + MDFN_printf(_("Overseas NTSC\n")); + if(ginfo.region_support & REGIONMASK_OVERSEAS_PAL) + MDFN_printf(_("Overseas PAL\n")); + MDFN_indent(-1); + + { + const int region_setting = MDFN_GetSettingI("md.region"); + const int reported_region_setting = MDFN_GetSettingI("md.reported_region"); + + // Default, in case the game doesn't support any regions! + bool game_overseas = TRUE; + bool game_pal = FALSE; + bool overseas; + bool pal; + bool overseas_reported; + bool pal_reported; + + // Preference order, TODO: Make it configurable + if(ginfo.region_support & REGIONMASK_OVERSEAS_NTSC) + { + game_overseas = TRUE; + game_pal = FALSE; + } + else if(ginfo.region_support & REGIONMASK_JAPAN_NTSC) + { + game_overseas = FALSE; + game_pal = FALSE; + } + else if(ginfo.region_support & REGIONMASK_OVERSEAS_PAL) + { + game_overseas = TRUE; + game_pal = TRUE; + } + else if(ginfo.region_support & REGIONMASK_JAPAN_PAL) // WTF? + { + game_overseas = FALSE; + game_pal = TRUE; + } + + if(region_setting == REGION_GAME) + { + overseas = game_overseas; + pal = game_pal; + } + else + { + decode_region_setting(region_setting, overseas, pal); + } + + if(reported_region_setting == REGION_GAME) + { + overseas_reported = game_overseas; + pal_reported = game_pal; + } + else if(reported_region_setting == REGION_SAME) + { + overseas_reported = overseas; + pal_reported = pal; + } + else + { + decode_region_setting(reported_region_setting, overseas_reported, pal_reported); + } + + MDFN_printf("\n"); + MDFN_printf(_("Active Region: %s %s\n"), overseas ? _("Overseas") : _("Domestic"), pal ? _("PAL") : _("NTSC")); + MDFN_printf(_("Active Region Reported: %s %s\n"), overseas_reported ? _("Overseas") : _("Domestic"), pal_reported ? _("PAL") : _("NTSC")); + + system_init(overseas, pal, overseas_reported, pal_reported); + + if(pal) + MDFNGameInfo->nominal_height = 240; + else + MDFNGameInfo->nominal_height = 224; + + MDFNGameInfo->MasterClock = MDFN_MASTERCLOCK_FIXED(pal ? CLOCK_PAL : CLOCK_NTSC); + + if(pal) + MDFNGameInfo->fps = (int64)CLOCK_PAL * 65536 * 256 / (313 * 3420); + else + MDFNGameInfo->fps = (int64)CLOCK_NTSC * 65536 * 256 / (262 * 3420); + + //printf("%f\n", (double)MDFNGameInfo->fps / 65536 / 256); + } + + if(MDFN_GetSettingB("md.correct_aspect")) + { + MDFNGameInfo->nominal_width = 292; + MDFNGameInfo->lcm_width = 1280; + } + else + { + MDFNGameInfo->nominal_width = 320; + MDFNGameInfo->lcm_width = 320; + } + + MDFNGameInfo->lcm_height = MDFNGameInfo->nominal_height * 2; + + MDFNGameInfo->LayerNames = "BG0\0BG1\0OBJ\0"; + + // + // + { + unsigned mtt = MDFN_GetSettingUI("md.input.multitap"); + + if(MDFN_GetSettingB("md.input.auto")) + { + for(auto const& e : InputDB) + { + if(e.crc32 == ginfo.crc32 && (!e.prod_code || !strcmp(e.prod_code, ginfo.product_code))) + { + MDFNGameInfo->DesiredInput.resize(8); + + for(unsigned n = e.max_players; n < 8; n++) // Particularly for Gauntlet 4. + MDFNGameInfo->DesiredInput[n] = "none"; + + mtt = e.tap; + break; + } + } + } + + for(const auto* mte = MultiTap_List; mte->string; mte++) + { + if((unsigned)mte->number == mtt) + { + MDFN_printf(_("Active Multitap(s): %s\n"), mte->description); + break; + } + } + + MDINPUT_SetMultitap(mtt); + } + + // + // + + system_reset(true); +} + +static void Load(MDFNFILE *fp) +{ + try + { + md_game_info ginfo; + + memset(&ginfo, 0, sizeof(md_game_info)); + MDCart_Load(&ginfo, fp); + + memcpy(MDFNGameInfo->MD5, ginfo.md5, 16); + + MD_IsCD = FALSE; + + MD_ExtRead8 = MDCart_Read8; + MD_ExtRead16 = MDCart_Read16; + MD_ExtWrite8 = MDCart_Write8; + MD_ExtWrite16 = MDCart_Write16; + + MDCart_LoadNV(); + + LoadCommonPost(ginfo); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void LoadCD(std::vector *CDInterfaces) +{ + try + { + md_game_info ginfo; + + memset(&ginfo, 0, sizeof(md_game_info)); + + MD_IsCD = TRUE; + + MDCD_Load(CDInterfaces, &ginfo); + + LoadCommonPost(ginfo); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static bool TestMagicCD(std::vector *CDInterfaces) +{ + return(MDCD_TestMagic(CDInterfaces)); +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: system_reset(true); break; + case MDFN_MSC_RESET: system_reset(false); break; + } +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + const unsigned int c68k_state_len = C68k_State_Max_Len; + uint8 c68k_state[c68k_state_len]; + + C68k_Save_State(&Main68K, c68k_state); + + SFORMAT StateRegs[] = + { + SFARRAY(work_ram, 65536), + SFARRAY(zram, 8192), + SFVAR(zbusreq), + SFVAR(zreset), + SFVAR(zbusack), + SFVAR(zirq), + SFVAR(zbank), + + SFVAR(md_timestamp), + SFVAR(suspend68k), + SFVAR(z80_cycle_counter), + + SFARRAY(c68k_state, c68k_state_len), + SFEND + }; + + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + z80_state_action(sm, load, data_only, "Z80"); + MDINPUT_StateAction(sm, load, data_only); + MainVDP.StateAction(sm, load, data_only); + MDSound_StateAction(sm, load, data_only); + MDCart_StateAction(sm, load, data_only); + + if(load) + { + C68k_Load_State(&Main68K, c68k_state); + z80_set_interrupt(zirq); + } +} + +static const MDFNSetting_EnumList RegionList[] = +{ + { "game", REGION_GAME, gettext_noop("Match game's header."), gettext_noop("Emulate the region that the game indicates it expects to run in via data in the header(or in an internal database for a few games that may have bad header data).") }, + + { "overseas_ntsc", REGION_OVERSEAS_NTSC, gettext_noop("Overseas(non-Japan), NTSC"), gettext_noop("Region used in North America.") }, + { "overseas_pal", REGION_OVERSEAS_PAL, gettext_noop("Overseas(non-Japan), PAL"), gettext_noop("Region used in Europe.") }, + + { "domestic_ntsc", REGION_DOMESTIC_NTSC, gettext_noop("Domestic(Japan), NTSC"), gettext_noop("Region used in Japan.") }, + { "domestic_pal", REGION_DOMESTIC_PAL, gettext_noop("Domestic(Japan), PAL"), gettext_noop("Probably an invalid region, but available for testing purposes anyway.") }, + + { NULL, 0 } +}; + +static const MDFNSetting_EnumList ReportedRegionList[] = +{ + { "same", REGION_SAME, gettext_noop("Match the region emulated.") }, + + { "game", REGION_GAME, gettext_noop("Match game's header."), gettext_noop("This option, in conjunction with the \"md.region\" setting, can be used to run all games at NTSC speeds, or all games at PAL speeds.") }, + + { "overseas_ntsc", REGION_OVERSEAS_NTSC, gettext_noop("Overseas(non-Japan), NTSC"), gettext_noop("Region used in North America.") }, + { "overseas_pal", REGION_OVERSEAS_PAL, gettext_noop("Overseas(non-Japan), PAL"), gettext_noop("Region used in Europe.") }, + + { "domestic_ntsc", REGION_DOMESTIC_NTSC, gettext_noop("Domestic(Japan), NTSC"), gettext_noop("Region used in Japan.") }, + { "domestic_pal", REGION_DOMESTIC_PAL, gettext_noop("Domestic(Japan), PAL"), gettext_noop("Probably an invalid region, but available for testing purposes anyway.") }, + + { NULL, 0 }, +}; + +static MDFNSetting MDSettings[] = +{ + { "md.region", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate the specified region's Genesis/MegaDrive"), NULL, MDFNST_ENUM, "game", NULL, NULL, NULL, NULL, RegionList }, + { "md.reported_region", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Region reported to the game."), NULL, MDFNST_ENUM, "same", NULL, NULL, NULL, NULL, ReportedRegionList }, + + { "md.cdbios", MDFNSF_EMU_STATE, gettext_noop("Path to the CD BIOS"), gettext_noop("SegaCD/MegaCD emulation is currently nonfunctional."), MDFNST_STRING, "us_scd1_9210.bin" }, + + { "md.correct_aspect", MDFNSF_CAT_VIDEO, gettext_noop("Correct the aspect ratio."), NULL, MDFNST_BOOL, "1" }, + + { "md.input.auto", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Automatically select appropriate input devices."), + gettext_noop("Automatically select appropriate input devices, based on an internal database. Currently, only multitap device usage data is contained in the database."), + MDFNST_BOOL, "1" }, + { "md.input.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap(s)."), NULL, MDFNST_ENUM, "none", NULL, NULL, NULL, NULL, MultiTap_List }, + + { "md.input.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Emulated mouse sensitivity."), NULL, MDFNST_FLOAT, "1.00", NULL, NULL }, + + { NULL } +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".bin", gettext_noop("Super Magic Drive binary ROM Image") }, + { ".smd", gettext_noop("Super Magic Drive interleaved format ROM Image") }, + { ".md", gettext_noop("Multi Game Doctor format ROM Image") }, + { NULL, NULL } +}; + +void SetLayerEnableMask(uint64 mask) +{ + MainVDP.SetLayerEnableMask(mask); +} + +} + + +MDFNGI EmulatedMD = +{ + "md", + "Sega Genesis/MegaDrive", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &DBGInfo, + #else + NULL, + #endif + MDPortInfo, + Load, + MDCart_TestMagic, + LoadCD, + TestMagicCD, + CloseGame, + + SetLayerEnableMask, + NULL, + + NULL, + NULL, + + NULL, + 0, + NULL, //InstallReadPatch, + NULL, //RemoveReadPatches, + NULL, //MemRead, + NULL, + false, + StateAction, + Emulate, + NULL, + MDINPUT_SetInput, + NULL, + DoSimpleCommand, + MDSettings, + 0, // MasterClock(set in game loading code) + 0, + TRUE, // Multires possible? + + 0, // lcm_width // Calculated in game load + 0, // lcm_height // Calculated in game load + NULL, // Dummy + + + // We want maximum values for nominal width and height here so the automatic fullscreen setting generation code will have + // selected a setting suitable if aspect ratio correction is turned off. + 320, // Nominal width(adjusted in game loading code, with aspect ratio correction enabled, it's 292, otherwise 320) + 240, // Nominal height(adjusted in game loading code to 224 for NTSC, and 240 for PAL) + 1024, // Framebuffer width + 512, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/md/system.h b/Mednafen/mednafen/md/system.h new file mode 100644 index 0000000000..e5dd0162db --- /dev/null +++ b/Mednafen/mednafen/md/system.h @@ -0,0 +1,47 @@ + +#ifndef _SYSTEM_H_ +#define _SYSTEM_H_ + +namespace MDFN_IEN_MD +{ + +/* Input devices */ +#define MAX_DEVICES (8) /* Unsure of maximum */ +#define DEVICE_2BUTTON (0) /* 2-button gamepad */ +#define DEVICE_3BUTTON (1) /* 3-button gamepad */ +#define DEVICE_6BUTTON (2) /* 6-button gamepad */ + +/* Input bitmasks */ +#define INPUT_MODE (0x00000800) +#define INPUT_Z (0x00000400) +#define INPUT_Y (0x00000200) +#define INPUT_X (0x00000100) +#define INPUT_START (0x00000080) +#define INPUT_C (0x00000040) +#define INPUT_B (0x00000020) +#define INPUT_A (0x00000010) +#define INPUT_RIGHT (0x00000008) +#define INPUT_LEFT (0x00000004) +#define INPUT_DOWN (0x00000002) +#define INPUT_UP (0x00000001) + +extern int32 md_timestamp; + +#define MD_DBG_ERROR 0 // Emulator-level error. +#define MD_DBG_WARNING 1 // Warning about game doing questionable things/hitting stuff that might not be emulated correctly. +void MD_DBG(unsigned level, const char *format, ...) throw() MDFN_COLD MDFN_FORMATSTR(gnu_printf, 2, 3); + +void MD_ExitCPULoop(void); +void MD_Suspend68K(bool state); +void MD_68KHALTHack(void); +bool MD_Is68KSuspended(void); + +void MD_UpdateSubStuff(); + +extern bool MD_IsCD; +extern int MD_HackyHackyMode; + +} + +#endif /* _SYSTEM_H_ */ + diff --git a/Mednafen/mednafen/md/vcnt.h b/Mednafen/mednafen/md/vcnt.h new file mode 100644 index 0000000000..2c58d03b5a --- /dev/null +++ b/Mednafen/mednafen/md/vcnt.h @@ -0,0 +1,98 @@ +#ifndef __MDFN_MD_VCNT_H_ +#define __MDFN_MD_VCNT_H_ + +// TODO: Recheck vc30 and PAL counts + +static const uint8 vc28_ntsc[262] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, + 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, + 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +static const uint8 vc30_ntsc[262] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, //0x06, +}; + +static const uint8 vc28_pal[313] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, + + 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, + 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, + 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; + +static const uint8 vc30_pal[313] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, + 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, + 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, + 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF +}; +#endif diff --git a/Mednafen/mednafen/md/vdp.cpp b/Mednafen/mednafen/md/vdp.cpp new file mode 100644 index 0000000000..93357b1191 --- /dev/null +++ b/Mednafen/mednafen/md/vdp.cpp @@ -0,0 +1,1924 @@ +/* + Copyright (C) 1999, 2000, 2001, 2002, 2003 Charles MacDonald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* + FIXME: + + HC table for 320-pixel mode is mapped to cycles incorrectly. + +*/ + +#include "shared.h" +#include "vcnt.h" +#include "hvc.h" + +namespace MDFN_IEN_MD +{ + +/* + only update window clip on window change (?) + fix leftmost window/nta render and window bug + sprite masking isn't right in sonic/micromachines 2, but + seems ok in galaxy force 2 +*/ + + +/*--------------------------------------------------------------------------*/ +/* Init, reset, shutdown functions */ +/*--------------------------------------------------------------------------*/ + +const uint8 MDVDP::shift_table[4] = { 6, 7, 0, 8 }; +const uint8 MDVDP::col_mask_table[4] = { 0x1F, 0x3F, 0x1F, 0x7F }; +const uint16 MDVDP::row_mask_table[4] = { 0x0FF, 0x1FF, 0x2FF, 0x3FF }; +const uint32 MDVDP::y_mask_table[4] = { 0x1FC0, 0x1FC0, 0x1F80, 0x1F00 }; + + /* Attribute expansion table */ +const uint32 MDVDP::atex_table[8] = { + 0x00000000, 0x10101010, 0x20202020, 0x30303030, + 0x40404040, 0x50505050, 0x60606060, 0x70707070 + }; + +MDVDP::MDVDP() +{ + int bx, ax, i; + + UserLE = ~0; + + /* Allocate and align pixel look-up tables */ + lut_base = (uint8 *)malloc((LUT_MAX * LUT_SIZE) + LUT_SIZE); + lut[0] = (uint8 *)(((uint64)lut_base + LUT_SIZE) & ~(LUT_SIZE - 1)); + for(i = 1; i < LUT_MAX; i += 1) + { + lut[i] = lut[0] + (i * LUT_SIZE); + } + + /* Make pixel look-up table data */ + for(bx = 0; bx < 0x100; bx += 1) + for(ax = 0; ax < 0x100; ax += 1) + { + uint16 index = (bx << 8) | (ax); + lut[0][index] = make_lut_bg(bx, ax); + lut[1][index] = make_lut_obj(bx, ax); + lut[2][index] = make_lut_bg_ste(bx, ax); + lut[3][index] = make_lut_obj_ste(bx, ax); + lut[4][index] = make_lut_bgobj_ste(bx, ax); + } + + /* Make sprite name look-up table */ + make_name_lut(); +} + +void MDVDP::SetSettings(bool PAL, bool PAL_reported, bool auto_aspect) +{ + is_pal = PAL; + report_pal = PAL_reported; + WantAutoAspect = auto_aspect; +} + +MDVDP::~MDVDP() +{ + if(lut_base) free(lut_base); +} + +void MDVDP::RedoViewport(void) +{ + // Warning: Don't test these viewport variables to determine what video mode we're in(do it right, with reg[0xC]) +#if 0 + bitmap.viewport.x = 0x20; + bitmap.viewport.y = 0x20; + bitmap.viewport.w = WantAutoAspect ? ((reg[0xC] & 0x1) ? 320 : 256) : 320; + bitmap.viewport.h = (reg[0x1] & 0x8) ? 240 : 224; + + if((reg[0xC] & 0x06) == 0x06) + bitmap.viewport.h *= 2; + + bitmap.viewport.changed = 1; +#endif +} + +void MDVDP::SyncColors(void) +{ + /* Update colors */ + for(int i = 0; i < 0x40; i++) + color_update(i, cram[i]); + + color_update(0x00, cram[border]); + color_update(0x40, cram[border]); + color_update(0x80, cram[border]); +} + +void MDVDP::Reset(void) +{ + memset(sat, 0, sizeof(sat)); + memset(vram, 0, sizeof(vram)); + memset(cram, 0, sizeof(cram)); + memset(vsram, 0, sizeof(vsram)); + + memset(bg_name_dirty, 0, sizeof(bg_name_dirty)); + memset(bg_name_list, 0, sizeof(bg_name_list)); + bg_list_index = 0; + memset(bg_pattern_cache, 0, sizeof(bg_pattern_cache)); + memset(reg, 0, sizeof(reg)); + + addr = addr_latch = code = pending = buffer = status = 0; + ntab = ntbb = ntwb = satb = hscb = 0; + sat_base_mask = 0xFE00; + sat_addr_mask = 0x01FF; + + /* Mark all colors as dirty to force a palette update */ + border = 0x00; + + playfield_shift = 6; + playfield_col_mask = 0x1F; + playfield_row_mask = 0x0FF; + y_mask = 0x1FC0; + + hint_pending = vint_pending = 0; + counter = 0; + visible_frame_end = 0xE0; + v_counter = v_update = 0; + + fifo_simu_count = 0; + dma_fill_latch = 0; + DMASource = 0; + DMALength = 0; + dma_fill = 0; + im2_flag = 0; + + vdp_last_ts = 0; + vdp_cycle_counter = 102; + vdp_line_phase = 5; + vdp_hcounter_start_ts = 0; + scanline = visible_frame_end; + + MD_Suspend68K(FALSE); + z80_set_interrupt(FALSE); + C68k_Set_IRQ(&Main68K, 0); + + RedoViewport(); + + memset(&clip, 0, sizeof(clip)); + memset(&pixel_32, 0, sizeof(pixel_32)); + + SyncColors(); +} + + +/*--------------------------------------------------------------------------*/ +/* Memory access functions */ +/*--------------------------------------------------------------------------*/ +void MDVDP::vdp_ctrl_w(uint16 data) +{ + if(pending == 0) + { + if((data & 0xC000) == 0x8000) + { + uint8 r = (data >> 8) & 0x1F; + uint8 d = (data >> 0) & 0xFF; + vdp_reg_w(r, d); + } + else + { + pending = 1; + } + + addr = ((addr_latch & 0xC000) | (data & 0x3FFF)) & 0xFFFF; + code = ((code & 0x3C) | ((data >> 14) & 0x03)) & 0x3F; + } + else + { + /* Clear pending flag */ + pending = 0; + + /* Update address and code registers */ + addr = ((addr & 0x3FFF) | ((data & 3) << 14)) & 0xFFFF; + code = ((code & 0x03) | ((data >> 2) & 0x3C)) & 0x3F; + + /* Save address bits A15 and A14 */ + addr_latch = (addr & 0xC000); + + if((code & 0x20) && (reg[1] & 0x10)) + { + // printf("DMA: %02x, %d, %d\n", reg[23], scanline, DMALength); + switch(reg[23] & 0xC0) + { + case 0x00: /* V bus to VDP DMA */ + case 0x40: /* V bus to VDP DMA */ + if((code & 0x0F) != 0x1 && (code & 0x0F) != 0x3 && (code & 0x0F) != 0x5) + MD_DBG(MD_DBG_WARNING, "[VDP] Invalid code for V bus to VDP dma: %02x\n", code); + status |= 0x2; + Recalc68KSuspend(); + break; + + case 0x80: /* VRAM fill */ + if((code & 0x0F) != 0x1) + MD_DBG(MD_DBG_WARNING, "[VDP] Invalid code for fill dma: %02x\n", code); + dma_fill = 1; + break; + + case 0xC0: /* VRAM copy */ + if((code & 0x0F) != 0x0) + MD_DBG(MD_DBG_WARNING, "[VDP] Invalid code for copy dma: %02x\n", code); + status |= 0x2; + break; + } + } + } +} + +uint16 MDVDP::vdp_ctrl_r(void) +{ + #if 1 + uint16 backup_status = status; + bool backup_pending = pending; + #endif + + uint16 temp = 0; //(0x4e71 & 0xFC00); + pending = 0; + + status &= ~0x0001; + status |= report_pal ? 0x0001 : 0x0000; + + if(fifo_simu_count >= 4) + temp |= 0x0100; + + if(fifo_simu_count == 0) + temp |= 0x0200; // FIFO empty + + temp |= status & 0x03FF; + + if(!(reg[1] & 0x40)) + temp |= 0x08; + + status &= ~0x0020; // Clear sprite hit flag on reads. + status &= ~0x0040; // Clear sprite overflow flag on reads. + + + if(MD_HackyHackyMode) + { + status = backup_status; + pending = backup_pending; + } + return (temp); +} + +INLINE void MDVDP::WriteCRAM(uint16 data) +{ + const int index = (addr >> 1) & 0x3F; + uint16 *p = &cram[index]; + uint16 packed_data; + + data &= 0x0EEE; + packed_data = PACK_CRAM(data); + + if(packed_data != *p) + { + *p = packed_data; + + // Must come before the next color_update call! + color_update(index, *p); + + if(index == border || !index) + { + color_update(0x00, cram[border]); + } + + } +} + +// Only used for DMA fill and VRAM->VRAM DMA copy. +// Since CRAM and VSRAM only allow 16-bit accesses, trying +// to use DMA fill on CRAM and CSRAM will probably not work so well. +INLINE void MDVDP::MemoryWrite8(uint8 data) +{ + switch(code & 0x0F) + { + case 0x01: /* VRAM */ + /* Copy SAT data to the internal SAT */ + if((addr & sat_base_mask) == satb) + { + sat[addr & sat_addr_mask] = data; + } + + /* Only write unique data to VRAM */ + if(data != READ_BYTE_LSB(vram, addr & 0xFFFF)) + { + /* Write data to VRAM */ + WRITE_BYTE_LSB(vram, addr & 0xFFFF, data); + + /* Update the pattern cache */ + MARK_BG_DIRTY(addr); + } + break; + case 0x03: /* CRAM */ + WriteCRAM(data); + break; + + case 0x05: /* VSRAM */ + vsram[(addr & 0x7E) >> 1] = data; + break; + } + + /* Bump address register */ + addr += reg[15]; +} + + +INLINE void MDVDP::MemoryWrite16(uint16 data) +{ + switch(code & 0x0F) + { + case 0x01: /* VRAM */ + /* Byte-swap data if A0 is set */ + if(addr & 1) data = (data >> 8) | (data << 8); + + /* Copy SAT data to the internal SAT */ + if((addr & sat_base_mask) == satb) + { + //MDFN_en16lsb(&sat[addr & sat_addr_mask], data); + MDFN_en16lsb(&sat[addr & sat_addr_mask & ~1], data); + } + + /* Only write unique data to VRAM */ + if(data != READ_WORD_LSB(vram, addr & 0xFFFE)) + { + /* Write data to VRAM */ + WRITE_WORD_LSB(vram, addr & 0xFFFE, data); + + /* Update the pattern cache */ + MARK_BG_DIRTY(addr); + } + break; + + case 0x03: /* CRAM */ + WriteCRAM(data); + break; + + case 0x05: /* VSRAM */ + vsram[(addr & 0x7E) >> 1] = data; + break; + } + + /* Bump address register */ + addr += reg[15]; +} + +INLINE void MDVDP::Recalc68KSuspend(void) +{ + MD_Suspend68K((fifo_simu_count > 4) || ((status & 0x2) && (reg[23] & 0xC0) < 0x80)); +} + +void MDVDP::vdp_data_w(uint16 data) +{ + /* Clear pending flag */ + pending = 0; + + if(fifo_simu_count < 16) + fifo_simu_count++; + + //printf("%04x, %d\n", data, scanline); + MemoryWrite16(data); + + if(dma_fill) + { + dma_fill_latch = data >> 8; + status |= 0x2; + //printf("DMA Fill: %d, %02x, %04x\n", DMALength, code & 0x0F, data); + dma_fill = 0; + } + + Recalc68KSuspend(); +} + +uint16 MDVDP::vdp_data_r(void) +{ + uint16 temp = 0; + + /* Clear pending flag */ + if(!MD_HackyHackyMode) + pending = 0; + + switch(code & 0x0F) + { + case 0x00: /* VRAM */ + temp = READ_WORD_LSB(vram, addr & 0xFFFE); + break; + + case 0x08: /* CRAM */ + temp = cram[(addr & 0x7E) >> 1]; + temp = UNPACK_CRAM(temp); + break; + + case 0x04: /* VSRAM */ + temp = vsram[(addr & 0x7E) >> 1]; + break; + } + + /* Bump address register */ + if(!MD_HackyHackyMode) + addr += reg[15]; + + /* return data */ + return (temp); +} + + +/* + The reg[] array is updated at the *end* of this function, so the new + register data can be compared with the previous data. +*/ +void MDVDP::vdp_reg_w(uint8 r, uint8 d) +{ + // If in mode 4, ignore writes to registers >= 0x0B + if(!(reg[1] & 0x4) && r >= 0x0B) + return; + + switch(r) + { + case 0x00: /* CTRL #1 */ + break; + + case 0x01: /* CTRL #2 */ + /* Change the frame timing */ + visible_frame_end = (d & 8) ? 0xF0 : 0xE0; + + /* Check if the viewport height has actually been changed */ + if((reg[1] & 8) != (d & 8)) + { + reg[1] = d; + RedoViewport(); + } + break; + + case 0x02: /* NTAB */ + ntab = (d << 10) & 0xE000; + break; + + case 0x03: /* NTWB */ + ntwb = (d << 10) & 0xF800; + if(reg[12] & 1) ntwb &= 0xF000; + break; + + case 0x04: /* NTBB */ + ntbb = (d << 13) & 0xE000; + break; + + case 0x05: /* SATB */ + sat_base_mask = (reg[12] & 1) ? 0xFC00 : 0xFE00; + sat_addr_mask = (reg[12] & 1) ? 0x03FF : 0x01FF; + satb = (d << 9) & sat_base_mask; + break; + + case 0x07: + d &= 0x3F; + + /* Check if the border color has actually changed */ + if(border != d) + { + /* Mark the border color as modified */ + border = d; + + color_update(0x00, cram[border]); + color_update(0x40, cram[border]); + color_update(0x80, cram[border]); + } + break; + + case 0x0C: + + /* See if the S/TE mode bit has changed */ + if((reg[0x0C] & 8) != (d & 8)) + { + reg[0x0C] = d; + + SyncColors(); + } + + /* Check interlace mode 2 setting */ + im2_flag = ((d & 0x06) == 0x06) ? 1 : 0; + + /* The following register updates check this value */ + reg[0x0C] = d; + + RedoViewport(); + + /* Update display-dependent registers */ + vdp_reg_w(0x03, reg[0x03]); + vdp_reg_w(0x05, reg[0x05]); + + break; + + case 0x0D: /* HSCB */ + hscb = (d << 10) & 0xFC00; + break; + + case 0x10: /* Playfield size */ + playfield_shift = shift_table[(d & 3)]; + playfield_col_mask = col_mask_table[(d & 3)]; + playfield_row_mask = row_mask_table[(d >> 4) & 3]; + y_mask = y_mask_table[(d & 3)]; + break; + + + case 0x13: DMALength &= 0xFF00; + DMALength |= d << 0; + break; + + case 0x14: DMALength &= 0x00FF; + DMALength |= d << 8; + break; + + case 0x15: DMASource &= 0xFFFF00; + DMASource |= d << 0; + break; + + case 0x16: DMASource &= 0xFF00FF; + DMASource |= d << 8; + break; + + case 0x17: DMASource &= 0x00FFFF; + DMASource |= d << 16; + break; + } + + /* Write new register value */ + reg[r] = d; +} + + +uint16 MDVDP::vdp_hvc_r(void) +{ + int32 cycle = (md_timestamp - vdp_hcounter_start_ts) % 3420; + int hc; + uint8 vc; + + hc = (reg[0xC] & 1) ? cycle2hc40[cycle] : cycle2hc32[cycle]; + + if(is_pal) + vc = (reg[0x1] & 0x8) ? vc30_pal[v_counter] : vc28_pal[v_counter]; + else + vc = (reg[0x1] & 0x8) ? vc30_ntsc[v_counter] : vc28_ntsc[v_counter]; + + if(im2_flag) + { + vc = (vc << 1) | (vc >> 7); + } + + return (vc << 8 | hc); +} + +INLINE void MDVDP::CheckDMA(void) +{ + // + static const int vbus_cc[2][2] = + { + { 16, 167 }, + { 18, 205 }, + }; + static const int copy_cc[2][2] = + { + { 8, 83 }, + { 9, 102 }, + }; + static const int fill_cc[2][2] = + { + { 16, 167 }, + { 18, 205 }, + }; + const int vb_index = ((status & 0x8) >> 3) | (((reg[1] & 0x40) ^ 0x40) >> 6); + + if(!(status & 0x2)) + return; + + switch(reg[23] & 0xC0) + { + case 0x00: /* V bus to VDP DMA */ + case 0x40: /* V bus to VDP DMA */ + { + int32 runcount = (vbus_cc[reg[0x0C] & 1][vb_index] + 1) / 2; + + //printf("%08x, %d, %02x\n", DMASource, DMALength, reg[0xC] & 0x81); + do + { + uint16 temp = vdp_dma_r((DMASource & 0x7FFFFF) << 1); + DMASource = (DMASource & 0xFF0000) | ((DMASource + 1) & 0xFFFF); + MemoryWrite16(temp); + DMALength--; + runcount--; + } while (DMALength && runcount); + + if(!DMALength) + { + status &= ~0x2; + Recalc68KSuspend(); + } + break; + } + case 0x80: // DMA Fill + { + int32 runcount = fill_cc[reg[0x0C] & 1][vb_index]; + + do + { + MemoryWrite8(dma_fill_latch); + DMALength--; + runcount--; + } while(DMALength && runcount); + + if(!DMALength) + status &= ~0x2; + + break; + } + + case 0xC0: // VRAM copy + { + int32 runcount = copy_cc[reg[0x0C] & 1][vb_index]; + + do + { + uint8 temp = READ_BYTE_LSB(vram, DMASource & 0xFFFF); + WRITE_BYTE_LSB(vram, addr, temp); + MARK_BG_DIRTY(addr); + if((addr & sat_base_mask) == satb) + { + sat[addr & sat_addr_mask] = temp; + } + DMASource = (DMASource & 0xFF0000) | ((DMASource + 1) & 0xFFFF); + addr = (addr + reg[15]) & 0xFFFF; + DMALength--; + runcount--; + } while(DMALength && runcount); + + if(!DMALength) + { + status &= ~0x2; + } + break; + } + + } +} + + +void MDVDP::vdp_test_w(uint16 value) +{ +} + +void MDVDP::Run(void) +{ + #include "vdp_run.inc" +} + +void MDVDP::ResetTS(void) +{ + //printf("%d, %d\n", vdp_cycle_counter, md_timestamp); + vdp_hcounter_start_ts -= vdp_last_ts; + vdp_last_ts = 0; +} + +void MDVDP::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(sat, 0x400), + SFARRAY(vram, 0x10000), + SFARRAY16(cram, 0x40), + SFARRAY16(vsram, 0x40), + SFARRAY(reg, 0x20), + + SFVAR(addr), + SFVAR(addr_latch), + SFVAR(code), + SFVAR(pending), + SFVAR(buffer), + SFVAR(status), + SFVAR(ntab), + SFVAR(ntbb), + SFVAR(ntwb), + SFVAR(satb), + SFVAR(hscb), + SFVAR(sat_base_mask), + SFVAR(sat_addr_mask), + + SFVAR(dma_fill_latch), + SFVAR(DMASource), + SFVAR(DMALength), + SFVAR(border), + SFVAR(playfield_shift), + SFVAR(playfield_col_mask), + SFVAR(playfield_row_mask), + SFVAR(y_mask), + + SFVAR(hint_pending), + SFVAR(vint_pending), + SFVAR(counter), + SFVAR(dma_fill), + SFVAR(im2_flag), + SFVAR(visible_frame_end), + SFVAR(v_counter), + SFVAR(v_update), + SFVAR(vdp_cycle_counter), + SFVAR(vdp_last_ts), + SFVAR(vdp_line_phase), + SFVAR(vdp_hcounter_start_ts), + SFVAR(scanline), + + SFVAR(fifo_simu_count), + + //SFVAR(is_pal), SFVAR(report_pal), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "VDP"); + + if(load) + { + vdp_line_phase %= 8; // tied to table in vdp_run.inc !!! + + status &= ~(0x200 | 0x100); + + for(int i = 0; i < 0x800; i++) + { + bg_name_list[i] = i; + bg_name_dirty[i] = 0xFF; + } + bg_list_index = 0x800; + + for(int i = 0; i < 0x40; i++) + color_update(i, cram[i]); + + color_update(0x00, cram[border]); + + RedoViewport(); + + update_bg_pattern_cache(); + } +} + +/* + + + + + + + +*/ + +/* Draw a single 16-pixel column */ +#define DRAW_COLUMN(ATTR, LINE) \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = &bg_pattern_cache[(ATTR & 0x1FFF) << 4 | (LINE)]; \ + MDFN_ennsb(dst++, (*src++ | atex)); \ + MDFN_ennsb(dst++, (*src++ | atex)); \ + ATTR >>= 16; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + src = &bg_pattern_cache[(ATTR & 0x1FFF) << 4 | (LINE)]; \ + MDFN_ennsb(dst++, (*src++ | atex)); \ + MDFN_ennsb(dst++, (*src++ | atex)); + +/* Draw a single 16-pixel column */ +#define DRAW_COLUMN_IM2(ATTR, LINE) \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 5 | (ATTR & 0x1800) << 4 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x10; \ + src = &bg_pattern_cache[offs]; \ + MDFN_ennsb(dst++, (*src++ | atex)); \ + MDFN_ennsb(dst++, (*src++ | atex)); \ + ATTR >>= 16; \ + atex = atex_table[(ATTR >> 13) & 7]; \ + offs = (ATTR & 0x03FF) << 5 | (ATTR & 0x1800) << 4 | (LINE); \ + if(ATTR & 0x1000) offs ^= 0x10; \ + src = &bg_pattern_cache[offs]; \ + MDFN_ennsb(dst++, (*src++ | atex)); \ + MDFN_ennsb(dst++, (*src++ | atex)); + +/* + gcc complains about this: + *lb++ = table[(*lb << 8) |(*src++ | palette)]; + .. claiming the result on lb is undefined. + So we manually advance lb and use constant offsets into the line buffer. +*/ +#define DRAW_SPRITE_TILE \ + for(int p = 0; p < 8; p++) \ + { \ + if(((lb[p] & 0x8F) > 0x80) && (*src & 0xF)) \ + status |= 0x20; \ + lb[p] = table[(lb[p] << 8) |(*src++ | palette)]; \ + } + + + +void MDVDP::SetPixelFormat(const MDFN_PixelFormat &format) +{ + /* Make pixel data tables */ + for(int i = 0; i < 0x200; i += 1) + { + const int mult = 17; // 0x7 | 0x8 = 0xF, 0xF * 17 = 0xFF + int r, g, b; + + r = (i >> 6) & 7; + g = (i >> 3) & 7; + b = (i >> 0) & 7; + + //r = g = b = 1; + pixel_32_lut[0][i] = format.MakeColor(mult * r, mult * g, mult * b); + pixel_32_lut[1][i] = format.MakeColor(mult * (r << 1), mult * (g << 1), mult * (b << 1)); + pixel_32_lut[2][i] = format.MakeColor(mult * (r|8), mult * (g|8), mult * (b|8)); + } + + SyncColors(); +} + +void MDVDP::SetSurface(EmulateSpecStruct *espec_arg) //MDFN_Surface *new_surface, MDFN_Rect *new_rect) +{ + espec = espec_arg; + surface = espec->surface; + rect = &espec->DisplayRect; +} + + +void MDVDP::SetLayerEnableMask(uint64 mask) +{ + UserLE = mask; +} + + +void MDVDP::make_name_lut(void) +{ + int col, row; + int vcol, vrow; + int width, height; + int flipx, flipy; + int i, name; + + memset(name_lut, 0, sizeof(name_lut)); + + for(i = 0; i < 0x400; i += 1) + { + vcol = col = i & 3; + vrow = row = (i >> 2) & 3; + height = (i >> 4) & 3; + width = (i >> 6) & 3; + flipx = (i >> 8) & 1; + flipy = (i >> 9) & 1; + + if(flipx) + vcol = (width - col); + if(flipy) + vrow = (height - row); + + name = vrow + (vcol * (height + 1)); + + if((row > height) || col > width) + name = -1; + + name_lut[i] = name; + } +} + + +/*--------------------------------------------------------------------------*/ +/* Line render function */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::render_line(int line) +{ + /* Line buffers */ + alignas(8) uint8 tmp_buf[0x400]; /* Temporary buffer */ + alignas(8) uint8 bg_buf[0x400]; /* Merged background buffer */ + alignas(8) uint8 nta_buf[0x400]; /* Plane A / Window line buffer */ + alignas(8) uint8 ntb_buf[0x400]; /* Plane B line buffer */ + alignas(8) uint8 obj_buf[0x400]; /* Object layer line buffer */ + uint8 *lb = tmp_buf; + + const int32 vp_x = 0x20; + const int32 vp_w = ((reg[0xC] & 0x1) ? 320 : 256); + + // Our display output window is nominally XXX*224 with NTSC, XXX*240 with PAL. + + if(line == 120) + { + rect->x = 0; + rect->w = WantAutoAspect ? vp_w : 320; + } + + if((reg[1] & 0x40) == 0x00 || line >= visible_frame_end) + { + /* Use the overscan color to clear the screen */ + memset(&lb[vp_x], 0x40 | border, vp_w); + } + else + { + update_bg_pattern_cache(); + window_clip(line); + + if(im2_flag) + { + render_ntx_im2(0, line, nta_buf); + render_ntx_im2(1, line, ntb_buf); + } + else + { + if(reg[0x0B] & 4) + { + render_ntx_vs(0, line, nta_buf); + render_ntx_vs(1, line, ntb_buf); + } + else + { + render_ntx(0, line, nta_buf); + render_ntx(1, line, ntb_buf); + } + } + + if(im2_flag) + render_ntw_im2(line, nta_buf); + else + render_ntw(line, nta_buf); + + if(!(UserLE & 0x1)) + memset(&nta_buf[0x20], 0, (reg[12] & 1) ? 320 : 256); + + if(!(UserLE & 0x2)) + memset(&ntb_buf[0x20], 0, (reg[12] & 1) ? 320 : 256); + + if(reg[12] & 8) + { + merge(&nta_buf[0x20], &ntb_buf[0x20], &bg_buf[0x20], lut[2], (reg[12] & 1) ? 320 : 256); + memset(&obj_buf[0], 0, 0x20 + ((reg[12] & 1) ? 320 : 256) + 0x20); // Need to clear left and right padding areas to prevent uninitialized memory usage. + + if(im2_flag) + render_obj_im2(line, obj_buf, lut[3]); + else + render_obj(line, obj_buf, lut[3]); + + if(!(UserLE & 0x4)) + memset(&obj_buf[0x20], 0, (reg[12] & 1) ? 320 : 256); + + merge(&obj_buf[0x20], &bg_buf[0x20], &lb[0x20], lut[4], (reg[12] & 1) ? 320 : 256); + } + else + { + // So sprite rendering won't read from uninitialized memory. + memset(&lb[0x00], 0, 0x20); + memset(&lb[0x20 + ((reg[12] & 1) ? 320 : 256)], 0, 0x20); + + + if(UserLE & 0x4) + merge(&nta_buf[0x20], &ntb_buf[0x20], &lb[0x20], lut[0], (reg[12] & 1) ? 320 : 256); + else + memset(&lb[0x20], 0, (reg[12] & 1) ? 320 : 256); + + if(im2_flag) + render_obj_im2(line, lb, lut[1]); + else + render_obj(line, lb, lut[1]); + + if(!(UserLE & 0x4)) + merge(&nta_buf[0x20], &ntb_buf[0x20], &lb[0x20], lut[0], (reg[12] & 1) ? 320 : 256); + } + + if(reg[0] & 0x20) + { + memset(&lb[vp_x], 0x40 | border, 0x08); + } + } + + const unsigned int lines_per_frame = is_pal ? 313 : 262; // FIXME: have this as an inline function(duplicated in vdp_run.inc) + unsigned int cvp_line = (line + ((240 - visible_frame_end) >> 1)) % lines_per_frame; + + if(cvp_line < 240) + { + //printf("ION: %d, IFIELD: %d --- %d, %d, im2f=%d\n", espec->InterlaceOn, espec->InterlaceField, line, ((line + ((240 - visible_frame_end) >> 1)) * (espec->InterlaceOn ? 2 : 1) + espec->InterlaceField), im2_flag); + //printf("%d, %d %d\n", line, espec->InterlaceOn, espec->InterlaceField); + switch(surface->format.bpp) + { + case 16:CopyLineSurface(&lb[vp_x], cvp_line, vp_w); + break; + + case 32:CopyLineSurface(&lb[vp_x], cvp_line, vp_w); + break; + } + } +} +/*--------------------------------------------------------------------------*/ +/* Window rendering */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::render_ntw(int line, uint8 *buf) +{ + int column, v_line, width; + uint32 *nt, *src, *dst, atex, atbuf; + + v_line = (line & 7) << 1; + width = (reg[12] & 1) ? 7 : 6; + + nt = (uint32 *)&vram[ntwb | ((line >> 3) << width)]; + dst = (uint32 *)&buf[0x20 + (clip[1].left << 4)]; + + for(column = clip[1].left; column < clip[1].right; column += 1) + { + atbuf = MDFN_de32lsb(&nt[column]); + DRAW_COLUMN(atbuf, v_line) + } +} + +void MDVDP::render_ntw_im2(int line, uint8 *buf) +{ + int column, v_line, width; + uint32 *nt, *src, *dst, atex, atbuf, offs; + + v_line = ((line & 7) << 1 | ((status >> 4) & 1)) << 1; + width = (reg[12] & 1) ? 7 : 6; + + nt = (uint32 *)&vram[ntwb | ((line >> 3) << width)]; + dst = (uint32 *)&buf[0x20 + (clip[1].left << 4)]; + + for(column = clip[1].left; column < clip[1].right; column += 1) + { + atbuf = MDFN_de32lsb(&nt[column]); + DRAW_COLUMN_IM2(atbuf, v_line) + } +} + +/*--------------------------------------------------------------------------*/ +/* Background plane rendering */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::render_ntx(int which, int line, uint8 *buf) +{ + int column; + int start, end; + int index; + int shift; + int nametable_row_mask = (playfield_col_mask >> 1); + int v_line; + uint32 atex, atbuf, *src, *dst; + uint16 xascroll, xbscroll, xscroll; + int y_scroll; + uint8 *nt; + uint16 *vs; + uint16 table; + + + table = (which) ? ntbb : ntab; + + get_hscroll(line, &xascroll, &xbscroll); + xscroll = (which) ? xbscroll : xascroll; + + shift = (xscroll & 0x0F); + index = ((playfield_col_mask + 1) >> 1) - ((xscroll >> 4) & nametable_row_mask); + + if(which) + { + start = 0; + end = (reg[0x0C] & 1) ? 20 : 16; + } + else + { +// Looks correct if clip[0].left has 1 subtracted +// Otherwise window has gap between endpoint and where the first normal +// nta column starts + + if(clip[0].enable == 0) return; + start = clip[0].left; + end = clip[0].right; + index = (index + clip[0].left) & nametable_row_mask; + } + + vs = &vsram[which ? 1 : 0]; + + y_scroll = vs[0]; + y_scroll = (line + (y_scroll & 0x3FF)) & playfield_row_mask; + v_line = (y_scroll & 7) << 1; + nt = &vram[table + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + + if(shift) + { + dst = (uint32 *)&buf[0x20-(0x10-shift)]; + atbuf = MDFN_de32lsb(&nt[((index-1) & nametable_row_mask) << 2]); + DRAW_COLUMN(atbuf, v_line) + } + buf = (buf + 0x20 + shift); + dst = (uint32 *)&buf[start<<4]; + + for(column = start; column < end; column += 1, index += 1) + { + atbuf = MDFN_de32lsb(&nt[(index & nametable_row_mask) << 2]); + DRAW_COLUMN(atbuf, v_line) + } +} + + +void MDVDP::render_ntx_im2(int which, int line, uint8 *buf) +{ + int column; + int start, end; + int index; + int shift; + int nametable_row_mask = (playfield_col_mask >> 1); + int v_line; + uint32 atex, atbuf, *src, *dst; + uint16 xascroll, xbscroll, xscroll; + int y_scroll; + uint8 *nt; + uint16 *vs; + uint16 table; + uint32 offs; + + table = (which) ? ntbb : ntab; + + get_hscroll(line, &xascroll, &xbscroll); + xscroll = (which) ? xbscroll : xascroll; + + shift = (xscroll & 0x0F); + index = ((playfield_col_mask + 1) >> 1) - ((xscroll >> 4) & nametable_row_mask); + + if(which) + { + start = 0; + end = (reg[0x0C] & 1) ? 20 : 16; + } + else + { + if(clip[0].enable == 0) return; + start = clip[0].left; + end = clip[0].right; + index = (index + clip[0].left) & nametable_row_mask; + } + + vs = &vsram[which ? 1 : 0]; + + y_scroll = vs[0]; + y_scroll = (line + ((y_scroll >> 1) & 0x3FF)) & playfield_row_mask; + v_line = (((y_scroll & 7) << 1) | ((status >> 4) & 1)) << 1; + nt = &vram[table + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + + if(shift) + { + dst = (uint32 *)&buf[0x20-(0x10-shift)]; + atbuf = MDFN_de32lsb(&nt[((index-1) & nametable_row_mask) << 2]); + DRAW_COLUMN_IM2(atbuf, v_line) + } + buf = (buf + 0x20 + shift); + dst = (uint32 *)&buf[start<<4]; + + for(column = start; column < end; column += 1, index += 1) + { + atbuf = MDFN_de32lsb(&nt[(index & nametable_row_mask) << 2]); + DRAW_COLUMN_IM2(atbuf, v_line) + } +} + + +void MDVDP::render_ntx_vs(int which, int line, uint8 *buf) +{ + int column; + int start, end; + int index; + int shift; + int nametable_row_mask = (playfield_col_mask >> 1); + int v_line; + uint32 atex, atbuf, *src, *dst; + uint16 xascroll, xbscroll, xscroll; + int y_scroll; + uint8 *nt; + uint16 *vs; + uint16 table; + + table = (which) ? ntbb : ntab; + + get_hscroll(line, &xascroll, &xbscroll); + xscroll = (which) ? xbscroll : xascroll; + shift = (xscroll & 0x0F); + index = ((playfield_col_mask + 1) >> 1) - ((xscroll >> 4) & nametable_row_mask); + + if(which) + { + start = 0; + end = (reg[0x0C] & 1) ? 20 : 16; + } + else + { + if(clip[0].enable == 0) return; + start = clip[0].left; + end = clip[0].right; + index = (index + clip[0].left) & nametable_row_mask; + } + + vs = &vsram[which ? 1 : 0]; + end = (reg[0x0C] & 1) ? 20 : 16; + + if(shift) + { + dst = (uint32 *)&buf[0x20-(0x10-shift)]; + y_scroll = (line & playfield_row_mask); + v_line = (y_scroll & 7) << 1; + nt = &vram[table + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + atbuf = MDFN_de32lsb(&nt[((index-1) & nametable_row_mask) << 2]); + DRAW_COLUMN(atbuf, v_line) + } + + buf = (buf + 0x20 + shift); + dst = (uint32 *)&buf[start << 4]; + + for(column = start; column < end; column += 1, index += 1) + { + y_scroll = vs[column << 1]; + y_scroll = (line + (y_scroll & 0x3FF)) & playfield_row_mask; + v_line = (y_scroll & 7) << 1; + nt = &vram[table + (((y_scroll >> 3) << playfield_shift) & y_mask)]; + atbuf = MDFN_de32lsb(&nt[(index & nametable_row_mask) << 2]); + DRAW_COLUMN(atbuf, v_line) + } +} +/*--------------------------------------------------------------------------*/ +/* Helper functions (cache update, hscroll, window clip) */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::update_bg_pattern_cache(void) +{ + int i; + uint8 x, y, c; + uint16 name; + + if(!bg_list_index) return; + + for(i = 0; i < bg_list_index; i += 1) + { + name = bg_name_list[i]; + bg_name_list[i] = 0; + + for(y = 0; y < 8; y += 1) + { + if(bg_name_dirty[name] & (1 << y)) + { + uint8 *dst = (uint8 *)&bg_pattern_cache[name << 4]; + uint32 bp = MDFN_de32lsb(vram + ((name << 5) | (y << 2))); + + for(x = 0; x < 8; x += 1) + { + c = (bp >> ((x ^ 3) << 2)) & 0x0F; + dst[0x00000 | (y << 3) | (x)] = (c); + dst[0x20000 | (y << 3) | (x ^ 7)] = (c); + dst[0x40000 | ((y ^ 7) << 3) | (x)] = (c); + dst[0x60000 | ((y ^ 7) << 3) | (x ^ 7)] = (c); + } + } + } + bg_name_dirty[name] = 0; + } + bg_list_index = 0; +} + +void MDVDP::get_hscroll(int line, uint16 *scrolla, uint16 *scrollb) +{ + switch(reg[11] & 3) + { + case 0: /* Full-screen */ + *scrolla = READ_WORD_LSB(vram, hscb + 0); + *scrollb = READ_WORD_LSB(vram, hscb + 2); + break; + + case 1: /* First 8 lines */ + *scrolla = READ_WORD_LSB(vram, hscb + ((line & 7) << 2) + 0); + *scrollb = READ_WORD_LSB(vram, hscb + ((line & 7) << 2) + 2); + break; + + case 2: /* Every 8 lines */ + *scrolla = READ_WORD_LSB(vram, hscb + ((line & ~7) << 2) + 0); + *scrollb = READ_WORD_LSB(vram, hscb + ((line & ~7) << 2) + 2); + break; + + case 3: /* Every line */ + *scrolla = READ_WORD_LSB(vram, hscb + (line << 2) + 0); + *scrollb = READ_WORD_LSB(vram, hscb + (line << 2) + 2); + break; + } + + *scrolla &= 0x03FF; + *scrollb &= 0x03FF; +} + +void MDVDP::window_clip(int line) +{ + /* Window size and invert flags */ + int hp = (reg[17] & 0x1F); + int hf = (reg[17] >> 7) & 1; + int vp = (reg[18] & 0x1F) << 3; + int vf = (reg[18] >> 7) & 1; + + /* Display size */ + int sw = (reg[12] & 1) ? 20 : 16; + + /* Clear clipping data */ + memset(&clip, 0, sizeof(clip)); + + /* Check if line falls within window range */ + if(vf == (line >= vp)) + { + /* Window takes up entire line */ + clip[1].right = sw; + clip[1].enable = 1; + } + else + { + /* Perform horizontal clipping; the results are applied in reverse + if the horizontal inversion flag is set */ + int a = hf; + int w = hf ^ 1; + + if(hp) + { + if(hp > sw) + { + /* Plane W takes up entire line */ + clip[w].right = sw; + clip[w].enable = 1; + } + else + { + /* Window takes left side, Plane A takes right side */ + clip[w].right = hp; + clip[a].left = hp; + clip[a].right = sw; + clip[0].enable = clip[1].enable = 1; + } + } + else + { + /* Plane A takes up entire line */ + clip[a].right = sw; + clip[a].enable = 1; + } + } +} + + + +/*--------------------------------------------------------------------------*/ +/* Look-up table functions */ +/*--------------------------------------------------------------------------*/ + +/* Input (bx): d5-d0=color, d6=priority, d7=unused */ +/* Input (ax): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=priority, d7=unused */ +int MDVDP::make_lut_bg(int bx, int ax) +{ + int bf, bp, b; + int af, ap, a; + int x = 0; + int c; + + bf = (bx & 0x7F); + bp = (bx >> 6) & 1; + b = (bx & 0x0F); + + af = (ax & 0x7F); + ap = (ax >> 6) & 1; + a = (ax & 0x0F); + + c = (ap ? (a ? af : (b ? bf : x)) : \ + (bp ? (b ? bf : (a ? af : x)) : \ + ( (a ? af : (b ? bf : x)) ))); + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c = (c & 0xC0); + + return (c); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=sprite pixel marker */ +/* Input (sx): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=zero, d7=sprite pixel marker */ +int MDVDP::make_lut_obj(int bx, int sx) +{ + int bf, bp, bs, b; + int sf, sp, s; + int c; + + bf = (bx & 0x3F); + bs = (bx >> 7) & 1; + bp = (bx >> 6) & 1; + b = (bx & 0x0F); + + sf = (sx & 0x3F); + sp = (sx >> 6) & 1; + s = (sx & 0x0F); + + if(s == 0) return bx; + + if(bs) + { + c = bf; + } + else + { + c = (sp ? (s ? sf : bf) : \ + (bp ? (b ? bf : (s ? sf : bf)) : \ + (s ? sf : bf) )); + } + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c = (c & 0xC0); + + return (c | 0x80); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=unused */ +/* Input (sx): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=priority, d7=intensity select (half/normal) */ +int MDVDP::make_lut_bg_ste(int bx, int ax) +{ + int bf, bp, b; + int af, ap, a; + int gi; + int x = 0; + int c; + + bf = (bx & 0x7F); + bp = (bx >> 6) & 1; + b = (bx & 0x0F); + + af = (ax & 0x7F); + ap = (ax >> 6) & 1; + a = (ax & 0x0F); + + gi = (ap | bp) ? 0x80 : 0x00; + + c = (ap ? (a ? af : (b ? bf : x )) : \ + (bp ? (b ? bf : (a ? af : x )) : \ + ( (a ? af : (b ? bf : x)) ))); + + c |= gi; + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c = (c & 0xC0); + + return (c); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=sprite pixel marker */ +/* Input (sx): d5-d0=color, d6=priority, d7=unused */ +/* Output: d5-d0=color, d6=priority, d7=sprite pixel marker */ +int MDVDP::make_lut_obj_ste(int bx, int sx) +{ + int bf, bs; + int sf; + int c; + + bf = (bx & 0x7F); + bs = (bx >> 7) & 1; + sf = (sx & 0x7F); + + if((sx & 0x0F) == 0) return bx; + + c = (bs) ? bf : sf; + + /* Strip palette bits from transparent pixels */ + if((c & 0x0F) == 0x00) c = (c & 0xC0); + + return (c | 0x80); +} + + +/* Input (bx): d5-d0=color, d6=priority, d7=intensity (half/normal) */ +/* Input (sx): d5-d0=color, d6=priority, d7=sprite marker */ +/* Output: d5-d0=color, d6=intensity (half/normal), d7=(double/invalid) */ +int MDVDP::make_lut_bgobj_ste(int bx, int sx) +{ + int c; + + int bf = (bx & 0x3F); + int bp = (bx >> 6) & 1; + int bi = (bx & 0x80) ? 0x40 : 0x00; + int b = (bx & 0x0F); + + int sf = (sx & 0x3F); + int sp = (sx >> 6) & 1; + int si = (sx & 0x40); + int s = (sx & 0x0F); + + if(bi & 0x40) si |= 0x40; + + if(sp) + { + if(s) + { + if((sf & 0x3E) == 0x3E) + { + if(sf & 1) + { + c = (bf | 0x00); + } + else + { + c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); + } + } + else + { + if(sf == 0x0E || sf == 0x1E || sf == 0x2E) + { + c = (sf | 0x40); + } + else + { + c = (sf | si); + } + } + } + else + { + c = (bf | bi); + } + } + else + { + if(bp) + { + if(b) + { + c = (bf | bi); + } + else + { + if(s) + { + if((sf & 0x3E) == 0x3E) + { + if(sf & 1) + { + c = (bf | 0x00); + } + else + { + c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); + } + } + else + { + if(sf == 0x0E || sf == 0x1E || sf == 0x2E) + { + c = (sf | 0x40); + } + else + { + c = (sf | si); + } + } + } + else + { + c = (bf | bi); + } + } + } + else + { + if(s) + { + if((sf & 0x3E) == 0x3E) + { + if(sf & 1) + { + c = (bf | 0x00); + } + else + { + c = (bx & 0x80) ? (bf | 0x80) : (bf | 0x40); + } + } + else + { + if(sf == 0x0E || sf == 0x1E || sf == 0x2E) + { + c = (sf | 0x40); + } + else + { + c = (sf | si); + } + } + } + else + { + c = (bf | bi); + } + } + } + + if((c & 0x0f) == 0x00) c = (c & 0xC0); + + return (c); +} + +/*--------------------------------------------------------------------------*/ +/* Remap functions */ +/*--------------------------------------------------------------------------*/ +template +void MDVDP::CopyLineSurface(const uint8 *src, const unsigned cvp_line, const unsigned width) +{ + T *out = &surface->pix()[(cvp_line * (espec->InterlaceOn ? 2 : 1) + espec->InterlaceField) * surface->pitchinpix]; + + if(!WantAutoAspect) + { + int half_diff = (320 - width) >> 1; + const uint32 cb = pixel_32[0x40 | border]; //surface->MakeColor(0,0,0); + + for(int i = 0; i < half_diff; i++) + { + out[i] = cb; + out[half_diff + width + i] = cb; + } + out += (320 - width) >> 1; + } + + for(unsigned i = 0; i < width; i++) + out[i] = pixel_32[src[i]]; +} + +/*--------------------------------------------------------------------------*/ +/* Merge functions */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width) +{ + int i; + for(i = 0; i < width; i += 1) + { + uint8 a = srca[i]; + uint8 b = srcb[i]; + uint8 c = table[(b << 8) | (a)]; + dst[i] = c; + } +} + +/*--------------------------------------------------------------------------*/ +/* Color update functions */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::color_update(int index, uint16 data) +{ + if(reg[12] & 8) + { + pixel_32[0x00 | index] = pixel_32_lut[0][data]; + pixel_32[0x40 | index] = pixel_32_lut[1][data]; + pixel_32[0x80 | index] = pixel_32_lut[2][data]; + } + else + { + uint32 temp = pixel_32_lut[1][data]; + pixel_32[0x00 | index] = temp; + pixel_32[0x40 | index] = temp; + pixel_32[0x80 | index] = temp; + } +} + +/*--------------------------------------------------------------------------*/ +/* Object render functions */ +/*--------------------------------------------------------------------------*/ + +void MDVDP::parse_satb(int line) +{ + static const uint8 sizetab[] = {8, 16, 24, 32}; + uint8 *p, *q, link = 0; + uint16 ypos; + int pixel_count = 0; + int max_pixel_count = (reg[12] & 1) ? 320 : 256; + + int count; + int height; + + int limit = (reg[12] & 1) ? 20 : 16; + int total = (reg[12] & 1) ? 80 : 64; + + object_index_count = 0; + + for(count = 0; count < total; count += 1) + { + q = &sat[link << 3]; + p = &vram[satb + (link << 3)]; + + ypos = MDFN_de16lsb(&q[0]); + + if(im2_flag) + ypos = (ypos >> 1) & 0x1FF; + else + ypos &= 0x1FF; + + height = sizetab[q[3] & 3]; + + if((line >= ypos) && (line < (ypos + height))) + { + pixel_count += sizetab[(q[3] >> 2) & 3]; + + if(pixel_count > max_pixel_count) + { + status |= 0x40; + return; + } + + object_info[object_index_count].ypos = MDFN_de16lsb(&q[0]); + object_info[object_index_count].xpos = MDFN_de16lsb(&p[6]); + + // using xpos from internal satb stops sprite x + // scrolling in bloodlin.bin, + // but this seems to go against the test prog + //object_info[object_index_count].xpos = MDFN_de16lsb(&q[6]); + object_info[object_index_count].attr = MDFN_de16lsb(&p[4]); + object_info[object_index_count].size = q[3]; + object_info[object_index_count].index = count; + + object_index_count += 1; + + if(object_index_count == limit) + { + status |= 0x40; + return; + } + } + + link = q[2] & 0x7F; + if(link == 0) break; + } +} + +void MDVDP::render_obj(int line, uint8 *buf, uint8 *table) +{ + uint16 ypos; + uint16 attr; + uint16 xpos; + uint8 sizetab[] = {8, 16, 24, 32}; + uint8 size; + uint8 *src; + + int count; + int pixellimit = (reg[12] & 1) ? 320 : 256; + int pixelcount = 0; + int width; + int v_line; + int column; + int sol_flag = 0; + int left = 0x80; + int right = 0x80 + ((reg[12] & 1) ? 320 : 256); + + uint8 *s, *lb; + uint16 name, index; + uint8 palette; + + int attr_mask, nt_row; + + if(object_index_count == 0) return; + + for(count = 0; count < object_index_count; count += 1) + { + size = object_info[count].size & 0x0f; + xpos = object_info[count].xpos; + xpos &= 0x1ff; + + width = sizetab[(size >> 2) & 3]; + + if(xpos != 0) sol_flag = 1; + else + if(xpos == 0 && sol_flag) return; + + if(pixelcount > pixellimit) return; + pixelcount += width; + + if(((xpos + width) >= left) && (xpos < right)) + { + ypos = object_info[count].ypos; + ypos &= 0x1ff; + + attr = object_info[count].attr; + attr_mask = (attr & 0x1800); + + palette = (attr >> 9) & 0x70; + + v_line = (line - ypos); + nt_row = (v_line >> 3) & 3; + v_line = (v_line & 7) << 1; + + name = (attr & 0x07FF); + s = &name_lut[((attr >> 3) & 0x300) | (size << 4) | (nt_row << 2)]; + + lb = (uint8 *)&buf[0x20 + (xpos - 0x80)]; + width >>= 3; + for(column = 0; column < width; column += 1, lb+=8) + { + index = attr_mask | ((name + s[column]) & 0x07FF); + src = (uint8 *)&bg_pattern_cache[(index << 4) | (v_line)]; + DRAW_SPRITE_TILE; + } + } + } +} + +void MDVDP::render_obj_im2(int line, uint8 *buf, uint8 *table) +{ + uint16 ypos; + uint16 attr; + uint16 xpos; + uint8 sizetab[] = {8, 16, 24, 32}; + uint8 size; + uint8 *src; + + int count; + int pixellimit = (reg[12] & 1) ? 320 : 256; + int pixelcount = 0; + int width; + int v_line; + int column; + int sol_flag = 0; + int left = 0x80; + int right = 0x80 + ((reg[12] & 1) ? 320 : 256); + + uint8 *s, *lb; + uint16 name, index; + uint8 palette; + uint32 offs; + + int attr_mask, nt_row; + + if(object_index_count == 0) return; + + for(count = 0; count < object_index_count; count += 1) + { + size = object_info[count].size & 0x0f; + xpos = object_info[count].xpos; + xpos &= 0x1ff; + + width = sizetab[(size >> 2) & 3]; + + if(xpos != 0) sol_flag = 1; + else + if(xpos == 0 && sol_flag) return; + + if(pixelcount > pixellimit) return; + pixelcount += width; + + if(((xpos + width) >= left) && (xpos < right)) + { + ypos = object_info[count].ypos; + ypos = (ypos >> 1) & 0x1ff; + + attr = object_info[count].attr; + attr_mask = (attr & 0x1800); + + palette = (attr >> 9) & 0x70; + + v_line = (line - ypos); + nt_row = (v_line >> 3) & 3; + v_line = (((v_line & 7) << 1) | ((status >> 4) & 1)) << 1; + + name = (attr & 0x03FF); + s = &name_lut[((attr >> 3) & 0x300) | (size << 4) | (nt_row << 2)]; + + lb = (uint8 *)&buf[0x20 + (xpos - 0x80)]; + + width >>= 3; + for(column = 0; column < width; column += 1, lb+=8) + { + index = (name + s[column]) & 0x3ff; + offs = (index << 5) | (attr_mask << 4) | v_line; + if(attr & 0x1000) offs ^= 0x10; + + src = (uint8 *)&bg_pattern_cache[offs]; + DRAW_SPRITE_TILE; + } + } + } +} + + + + +} + + + + + + + diff --git a/Mednafen/mednafen/md/vdp.h b/Mednafen/mednafen/md/vdp.h new file mode 100644 index 0000000000..a1c0a8c2cb --- /dev/null +++ b/Mednafen/mednafen/md/vdp.h @@ -0,0 +1,254 @@ +#ifndef _VDP_H_ +#define _VDP_H_ + +namespace MDFN_IEN_MD +{ + +/* Pack and unpack CRAM data */ +#define PACK_CRAM(d) ((((d)&0xE00)>>9)|(((d)&0x0E0)>>2)|(((d)&0x00E)<<5)) +#define UNPACK_CRAM(d) ((((d)&0x1C0)>>5)|((d)&0x038)<<2|(((d)&0x007)<<9)) + +/* Mark a pattern as dirty */ +#define MARK_BG_DIRTY(addr) \ +{ \ + int name = (addr >> 5) & 0x7FF; \ + if(bg_name_dirty[name] == 0) \ + { \ + assert(bg_list_index < 0x800); \ + bg_name_list[bg_list_index] = name; \ + bg_list_index += 1; \ + } \ + bg_name_dirty[name] |= (1 << ((addr >> 2) & 0x07)); \ +} + +/* Look-up pixel table information */ +#define LUT_MAX (5) +#define LUT_SIZE (0x10000) + +/* Clip structure */ +typedef struct +{ + uint8 left; + uint8 right; + uint8 enable; +} clip_t; + +typedef struct +{ + uint16 ypos; + uint16 xpos; + uint16 attr; + uint8 size; + uint8 index; +} object_info_t; + +class MDVDP +{ + public: + + /* Function prototypes */ + MDVDP(void) MDFN_COLD; + ~MDVDP() MDFN_COLD; + + void SetSettings(bool PAL, bool PAL_reported, bool auto_aspect); + + void Reset(void) MDFN_COLD; + void vdp_ctrl_w(uint16 data); + uint16 vdp_ctrl_r(void); + void vdp_data_w(uint16 data); + uint16 vdp_data_r(void); + void vdp_reg_w(uint8 r, uint8 d); + uint16 vdp_hvc_r(void); + void dma_copy(void); + void dma_vbus(void); + void vdp_test_w(uint16 value); + + void SyncColors(void); + + void SetPixelFormat(const MDFN_PixelFormat &format); //int rs, int gs, int bs); + void SetSurface(EmulateSpecStruct *espec); //MDFN_Surface *surface, MDFN_Rect *rect); + + void SetLayerEnableMask(uint64 mask); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + void ResetTS(void); + + inline int IntAckCallback(int int_level) + { + // printf("Callback: %d; %d %d, %d\n", int_level, hint_pending, vint_pending, scanline); + switch(int_level) + { + case 4: + hint_pending = 0; + status &= ~0x0080; + vint_pending = 0; + break; + + case 6: + status &= ~0x0080; + vint_pending = 0; + break; + } + // C68k_Set_IRQ(&Main68K, 0); + + return C68K_INT_ACK_AUTOVECTOR; + } + + private: + /* Tables that define the playfield layout */ + static const uint8 shift_table[4]; + static const uint8 col_mask_table[4]; + static const uint16 row_mask_table[4]; + static const uint32 y_mask_table[4]; + + /* Attribute expansion table */ + static const uint32 atex_table[8]; + + enum + { + //(Totally guesstimated and bsed VDP timing :b) + + // H-counter starts at H40: 0xE4, H32: 0xE9 from here + // H-int is done here as well? + // Increment scanline here as well? + VDPLP_HRETRACE_0 = 0, // H40: 56, H32: 46 + + // H-counter starts at 0 from here. + VDPLP_HRETRACE_1, // H40: 16, H32: 13 + + // Vertical interrupt happens here on the appropriate line + VDPLP_VISIBLE_0, // H40: 4, H32: 4 + VDPLP_VISIBLE_1, // H40: 320 H32: 256 + + // Vblank flag is set here + VDPLP_VISIBLE_2, // H40: 26 H32: 23 + VDPLP_TOTAL + }; + + + alignas(8) uint8 sat[0x400]; /* Internal copy of sprite attribute table */ + alignas(8) uint8 vram[0x10000]; /* Video RAM (64Kx8) */ + uint16 cram[0x40]; /* On-chip color RAM (64x9) */ + uint16 vsram[0x40]; /* On-chip vertical scroll RAM (40x11) */ + uint8 reg[0x20]; /* Internal VDP registers (23x8) */ + + uint16 addr; /* Address register */ + uint16 addr_latch; /* Latched A15, A14 of address */ + uint8 code; /* Code register */ + uint8 pending; /* Pending write flag */ + uint16 buffer; /* Read buffer */ + uint16 status; /* VDP status flags */ + uint16 ntab; /* Name table A base address */ + uint16 ntbb; /* Name table B base address */ + uint16 ntwb; /* Name table W base address */ + uint16 satb; /* Sprite attribute table base address */ + uint16 hscb; /* Horizontal scroll table base address */ + uint16 sat_base_mask; /* Base bits of SAT */ + uint16 sat_addr_mask; /* Index bits of SAT */ + + uint8 dma_fill_latch; + uint32 DMASource; + uint16 DMALength; + + uint8 border; /* Border color index */ + uint8 bg_name_dirty[0x800]; /* 1= This pattern is dirty */ + uint16 bg_name_list[0x800]; /* List of modified pattern indices */ + uint16 bg_list_index; /* # of modified patterns in list */ + uint32 bg_pattern_cache[0x80000 / sizeof(uint32)];/* Cached and flipped patterns */ + uint8 playfield_shift; /* Width of planes A, B (in bits) */ + uint8 playfield_col_mask; /* Vertical scroll mask */ + uint16 playfield_row_mask; /* Horizontal scroll mask */ + uint32 y_mask; /* Name table Y-index bits mask */ + + bool hint_pending; /* 0= Line interrupt is pending */ + bool vint_pending; /* 1= Frame interrupt is pending */ + uint16 counter; /* Raster counter */ + bool dma_fill; /* 1= DMA fill has been requested */ + int im2_flag; /* 1= Interlace mode 2 is being used */ + int visible_frame_end; /* End-of-frame (IRQ line) */ + int v_counter; /* VDP scan line counter */ + int v_update; /* 1= VC was updated by a ctrl or HV read */ + + int32 vdp_cycle_counter; + int32 vdp_last_ts; + uint32 vdp_line_phase; + int32 vdp_hcounter_start_ts; + + int32 fifo_simu_count; + + int32 scanline; + bool is_pal, report_pal; + bool WantAutoAspect; + + + void RedoViewport(void); + void WriteCRAM(uint16); + void MemoryWrite8(uint8); + void MemoryWrite16(uint16); + void CheckDMA(void); + + + MDFN_Surface *surface; + MDFN_Rect *rect; + EmulateSpecStruct *espec; + + /* Clip data */ + clip_t clip[2]; + + /* Sprite name look-up table */ + uint8 name_lut[0x400]; + + /* Sprite line buffer data */ + uint8 object_index_count; + + object_info_t object_info[20]; + + /* Pixel look-up tables and table base address */ + uint8 *lut[5]; + uint8 *lut_base; + + /* 32-bit pixel remapping data */ + uint32 pixel_32[0x100]; + uint32 pixel_32_lut[3][0x200]; + + uint32 UserLE; // User layer enable; + +/* Function prototypes */ + void render_line(int line); + void render_obj(int line, uint8 *buf, uint8 *table); + void render_obj_im2(int line, uint8 *buf, uint8 *table); + void render_ntw(int line, uint8 *buf); + void render_ntw_im2(int line, uint8 *buf); + void render_ntx(int which, int line, uint8 *buf); + void render_ntx_im2(int which, int line, uint8 *buf); + void render_ntx_vs(int which, int line, uint8 *buf); + void update_bg_pattern_cache(void); + void get_hscroll(int line, uint16 *scrolla, uint16 *scrollb); + void window_clip(int line); + int make_lut_bg(int bx, int ax) MDFN_COLD; + int make_lut_obj(int bx, int sx) MDFN_COLD; + int make_lut_bg_ste(int bx, int ax) MDFN_COLD; + int make_lut_obj_ste(int bx, int sx) MDFN_COLD; + int make_lut_bgobj_ste(int bx, int sx) MDFN_COLD; + template void CopyLineSurface(const uint8 *src, const unsigned cvp_line, const unsigned vp_w); + void merge(uint8 *srca, uint8 *srcb, uint8 *dst, uint8 *table, int width); + void color_update(int index, uint16 data); + void make_name_lut(void); + void parse_satb(int line); + + void Recalc68KSuspend(void); + + public: + #if 0 + inline void Run(void) + { + #include "vdp_run.inc" + } + #else + void Run(void); + #endif +}; + +} + +#endif /* _VDP_H_ */ diff --git a/Mednafen/mednafen/md/vdp_run.inc b/Mednafen/mednafen/md/vdp_run.inc new file mode 100644 index 0000000000..99aed720ec --- /dev/null +++ b/Mednafen/mednafen/md/vdp_run.inc @@ -0,0 +1,286 @@ + + int32 cycles = md_timestamp - vdp_last_ts; + bool hcell_mode = (reg[0x0C] & 1); // True on H40, FALSE on H32 + //bool do_skip = FALSE; + + /* Maximum FIFO wait times(there is no wait during vblank): + 5.98uSec - H32 cell mode + 4.77uSec - H40 cell mode + + Maximum VRAM(8-bit??)/CRAM(16-bit)/VSRAM(16-bit) FIFO writes during a scanline("unlimited" during vblank): + 16 - H32 cell mode + + Maximum v-bus(68K) to VRAM writes per line: + 16 - H32 cell mode, active display + 167 - H32 cell mode, vblank + 18 - H40 cell mode, active display + 205 - H40 cell mode, vblank + + Maximum VRAM fill writes per line: + 15 - H32 cell mode, active display + 166 - H32 cell mode, vblank + 17 - H40 cell mode, active display + 204 - H40 cell mode, vblank + + Maximum VRAM copy read/write combos per line: + 8 - H32 cell mode, active display + 83 - H32 cell mode, vblank + 9 - H40 cell mode, active display + 102 - H40 cell mode, vblank + + + H display + H retrace + + + Horizontal blanking(H40 cell mode): + Start: H-counter = 0xE4 + End: H-counter = 0x08 (of the next line) + + Horizontal blanking(H32 cell mode): + Start: H-counter = 0xE9 + End: H-counter = ? + + Vertical blanking(H40 cell mode, V28 cell mode): + Start: V-Counter = 0xE0, H-counter = 0xAA + End: V-Counter = 0xFF, H-counter = 0xAA + + Vertical interrupt(H40 cell mode, V28 cell mode): + Start: V-Counter = 0xE0, H-counter = 0x08+ish + End: ?? + + + / 10 in H32 mode + / 8 in H40 mode? + + + 28 + */ + //const int divider = hcell_mode ? 8 : 10; + const int lines_per_frame = is_pal ? 313 : 262; + static const int event_count = 8; + + // If we change this table, we need to fix "vdp_line_phase" and related init values in MDVDP::Reset(), and also handle old values + // without crashing when loading save states. + static struct + { + const void *lptr; + int32 cyc_to_next[2]; + } line_event_table[event_count] = + { + { &&EVT_END_OF_ACTIVE, { 160, 128 } }, + { &&EVT_RIGHT_BORDER, { 140, 112 } }, + { &&EVT_RIGHT_BLANKING, { 90, 72 } }, + { &&EVT_HSYNC, { 260, 313 } }, + { &&EVT_LEFT_BLANKING, { 138, 163 } }, + { &&EVT_VINT, { 102, 96 } }, + { &&EVT_LEFT_BORDER, { 130, 104 } }, + { &&EVT_REMAINING_AD, { 2400, 2432 } }, + }; + + if(fifo_simu_count) + { + bool in_vb = ((status & 0x8) >> 3) | (((reg[1] & 0x40) ^ 0x40) >> 6); + int div = ((hcell_mode ? 190 : 214) << ((code & 0xF) == 0x1)); + int run_count = ((md_timestamp - vdp_hcounter_start_ts) / div) - ((vdp_last_ts - vdp_hcounter_start_ts) / div); + + if(in_vb) + run_count = 1000; + + fifo_simu_count -= run_count; + if(fifo_simu_count <= 0) + { + fifo_simu_count = 0; + } + + Recalc68KSuspend(); + } + + + vdp_cycle_counter -= cycles; + while(vdp_cycle_counter <= 0) + { + vdp_line_phase = (vdp_line_phase + 1) % event_count; + //printf("%d, %d\n", scanline, vdp_line_phase); + + goto *(line_event_table[vdp_line_phase].lptr); + + EVT_END_OF_ACTIVE: + vdp_hcounter_start_ts = md_timestamp + vdp_cycle_counter; + + scanline = (scanline + 1) % lines_per_frame; + v_counter = scanline; + + render_line(scanline); + + if(scanline < (visible_frame_end - 1)) + parse_satb(0x81 + scanline); + else if(scanline == (lines_per_frame - 1)) + parse_satb(0x80); + + if(scanline <= visible_frame_end) + { + counter--; + if(counter == 0xFFFF) + { + counter = reg[10]; + hint_pending = 1; + } + } + else + { + counter = reg[10]; + } + + goto EVT_exit; + + EVT_RIGHT_BORDER: + if(scanline == visible_frame_end) + { + /* Set V-Blank flag */ + status |= 0x0008; + } + + CheckDMA(); + + if(scanline == lines_per_frame - 1) + { + rect->y = is_pal ? 0 : 8; + rect->h = is_pal ? 240 : 224; + + if(im2_flag) + { + status ^= 0x0010; + espec->InterlaceOn = true; + espec->InterlaceField = (bool)(status & 0x10); + + // Double-vertical-resolution interlaced mode + rect->y *= 2; + rect->h *= 2; + } + else + status &= ~0x0010; + + /* Clear V-Blank flag */ + status &= ~0x0008; + } + goto EVT_exit; + + EVT_RIGHT_BLANKING: + status |= 0x0004; // Set h-blank flag + goto EVT_exit; + + EVT_HSYNC: + goto EVT_exit; + + EVT_LEFT_BLANKING: + goto EVT_exit; + + EVT_VINT: + /* If a Z80 interrupt is still pending after a scanline, cancel it */ + if(zirq == 1) + { + zirq = 0; + z80_set_interrupt(FALSE); + } + + if(scanline == visible_frame_end) + { + status |= 0x0080; + vint_pending = 1; + + z80_set_interrupt(TRUE); + zirq = 1; + MD_ExitCPULoop(); + } + + goto EVT_exit; + + EVT_LEFT_BORDER: + status &= ~0x0004; // Clear h-blank flag + goto EVT_exit; + + EVT_REMAINING_AD: + goto EVT_exit; + + EVT_exit: ; + vdp_cycle_counter += line_event_table[vdp_line_phase].cyc_to_next[hcell_mode]; + } + + +#if 0 + //while(cycles > 0) + { + vdp_cycle_counter -= cycles; //this_cycles; + while(vdp_cycle_counter <= 0) + { + vdp_line_phase = (vdp_line_phase + 1) % VDPLP_TOTAL; + + // Now, we're going INTO the phase that the if statement corresponds to. + if(vdp_line_phase == VDPLP_HRETRACE_0) + { + + + } + else if(vdp_line_phase == VDPLP_HRETRACE_1) + { + //printf("%d\n", md_timestamp - vdp_hcounter_start_ts); + //vdp_hcounter_start_ts = md_timestamp + vdp_cycle_counter; + vdp_cycle_counter += divider * (hcell_mode ? 16 : 13); + } + else if(vdp_line_phase == VDPLP_VISIBLE_0) + { + status &= ~0x0004; //C lear h-blank flag + + vdp_cycle_counter += divider * (hcell_mode ? 4 : 4); + + /* If a Z80 interrupt is still pending after a scanline, cancel it */ + if(zirq == 1) + { + zirq = 0; + z80_set_interrupt(FALSE); + } + if(scanline == visible_frame_end) + { + status |= 0x0080; + vint_pending = 1; + + z80_set_interrupt(TRUE); + zirq = 1; + MD_ExitCPULoop(); + } + } + else if(vdp_line_phase == VDPLP_VISIBLE_1) + { + vdp_cycle_counter += divider * (hcell_mode ? 320 : 256); + } + else if(vdp_line_phase == VDPLP_VISIBLE_2) + { + vdp_cycle_counter += divider * (hcell_mode ? 26 : 23); + } + } + } +#endif + + if(!MD_Is68KSuspended()) + { + if(vint_pending && (reg[1] & 0x20)) + { + //printf("V-int: %d, %d\n", scanline, md_timestamp); + C68k_Set_IRQ(&Main68K, 6); + } + else if(hint_pending && (reg[0] & 0x10)) + { + //printf("H-int: %d %d\n", scanline, md_timestamp); + C68k_Set_IRQ(&Main68K, 4); + } + else + { + //printf("Int end: %d %d\n", scanline, md_timestamp); + C68k_Set_IRQ(&Main68K, 0); + } + } + + vdp_last_ts = md_timestamp; + + diff --git a/Mednafen/mednafen/mednafen-driver.h b/Mednafen/mednafen/mednafen-driver.h new file mode 100644 index 0000000000..9a98cc8a78 --- /dev/null +++ b/Mednafen/mednafen/mednafen-driver.h @@ -0,0 +1,169 @@ +#ifndef __MDFN_MEDNAFEN_DRIVER_H +#define __MDFN_MEDNAFEN_DRIVER_H + +#include +#include +#include + +#include "settings-common.h" + +extern std::vectorMDFNSystems; + +/* Indent stdout newlines +- "indent" amount */ +void MDFN_indent(int indent); +struct MDFN_AutoIndent +{ + INLINE MDFN_AutoIndent() : indented(0) { } + INLINE MDFN_AutoIndent(int amount) : indented(amount) { MDFN_indent(indented); } + INLINE ~MDFN_AutoIndent() { MDFN_indent(-indented); } + + //INLINE void indent(int indoot) { indented += indoot; MDFN_indent(indoot); } + private: + int indented; +}; +void MDFN_printf(const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); + +#define MDFNI_printf MDFN_printf + +/* Displays an error. Can block or not. */ +void MDFND_PrintError(const char *s); +void MDFND_Message(const char *s); + +uint32 MDFND_GetTime(void); +void MDFND_Sleep(uint32 ms); + +// Synchronize virtual time to actual time using members of espec: +// +// MasterCycles and MasterCyclesALMS (coupled with MasterClock of MDFNGI) +// and/or +// SoundBuf, SoundBufSize, and SoundBufSizeALMS +// +// ...and after synchronization, update the data pointed to by the pointers passed to MDFNI_SetInput(). +// DO NOT CALL MDFN_* or MDFNI_* functions from within MDFND_MidSync(). +// Calling MDFN_printf(), MDFN_DispMessage(),and MDFND_PrintError() are ok, though. +// +// If you do not understand how to implement this function, you can leave it empty at first, but know that doing so +// will subtly break at least one PC Engine game(Takeda Shingen), and raise input latency on some other PC Engine games. +void MDFND_MidSync(const EmulateSpecStruct *espec); + +// +// Begin threading support. +// +// Mostly based off SDL's prototypes and semantics. +// Driver code should actually define MDFN_Thread and MDFN_Mutex. +// +// Caution: Do not attempt to use the synchronization primitives(mutex, cond variables, etc.) for inter-process synchronization, they'll only work reliably with +// intra-process synchronization(the "mutex" is implemented as a a critical section under Windows, for example). +// +struct MDFN_Thread; +struct MDFN_Mutex; +struct MDFN_Cond; // mmm condiments +struct MDFN_Sem; + +MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data); +void MDFND_WaitThread(MDFN_Thread *thread, int *status); +uint32 MDFND_ThreadID(void); + +MDFN_Mutex *MDFND_CreateMutex(void) MDFN_COLD; +void MDFND_DestroyMutex(MDFN_Mutex *mutex) MDFN_COLD; + +int MDFND_LockMutex(MDFN_Mutex *mutex); +int MDFND_UnlockMutex(MDFN_Mutex *mutex); + +MDFN_Cond* MDFND_CreateCond(void) MDFN_COLD; +void MDFND_DestroyCond(MDFN_Cond* cond) MDFN_COLD; + +/* MDFND_SignalCond() *MUST* be called with a lock on the mutex used with MDFND_WaitCond() or MDFND_WaitCondTimeout() */ +int MDFND_SignalCond(MDFN_Cond* cond); +int MDFND_WaitCond(MDFN_Cond* cond, MDFN_Mutex* mutex); + +#define MDFND_COND_TIMEDOUT 1 +int MDFND_WaitCondTimeout(MDFN_Cond* cond, MDFN_Mutex* mutex, unsigned ms); + + +MDFN_Sem* MDFND_CreateSem(void); +void MDFND_DestroySem(MDFN_Sem* sem); + +int MDFND_WaitSem(MDFN_Sem* sem); +#define MDFND_SEM_TIMEDOUT 1 +int MDFND_WaitSemTimeout(MDFN_Sem* sem, unsigned ms); +int MDFND_PostSem(MDFN_Sem* sem); +// +// End threading support. +// + +void MDFNI_Reset(void); +void MDFNI_Power(void); + +/* path = path of game/file to load. returns NULL on failure. */ +MDFNGI *MDFNI_LoadGame(const char *force_module, const char *path); + +MDFNGI *MDFNI_LoadCD(const char *force_module, const char *path); // Deprecated interface. + +// Call this function as early as possible, even before MDFNI_Initialize() +bool MDFNI_InitializeModules(const std::vector &ExternalSystems); + +/* allocates memory. 0 on failure, 1 on success. */ +/* Also pass it the base directory to load the configuration file. */ +int MDFNI_Initialize(const char *basedir, const std::vector &DriverSettings); + +/* Call only when a game is loaded. */ +int MDFNI_NetplayStart(void); + +/* Emulates a frame. */ +void MDFNI_Emulate(EmulateSpecStruct *espec); + +#if 0 +/* Support function for scaling multiple-horizontal-resolution frames to a single width; mostly intended for unofficial ports. + The driver code really ought to handle multi-horizontal-resolution frames natively and properly itself, however. + + WARNING: If you use this function, you'll need to create the video surface with a width of something like: + std::max(fb_width, lcm_width) + instead of just fb_width, otherwise you'll get memory corruption/crashes. +*/ +void MDFNI_AutoScaleMRFrame(EmulateSpecStruct *espec); +#endif + +/* Closes currently loaded game */ +void MDFNI_CloseGame(void); + +/* Deallocates all allocated memory. Call after MDFNI_Emulate() returns. */ +void MDFNI_Kill(void); + +void MDFN_DispMessage(const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); +#define MDFNI_DispMessage MDFN_DispMessage + +uint32 MDFNI_CRC32(uint32 crc, uint8 *buf, uint32 len); + +// NES hackish function. Should abstract in the future. +int MDFNI_DatachSet(const uint8 *rcode); + +void MDFNI_SetLayerEnableMask(uint64 mask); + + +//TODO(need to work out how it'll interact with port device type settings): +//void MDFNI_SetInput(uint32 port, uint32 type); +//void MDFND_InputSetNotification(uint32 port, uint32 type, uint8* ptr); +uint8* MDFNI_SetInput(const uint32 port, const uint32 type); + +bool MDFNI_SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx = 0); +void MDFND_MediaSetNotification(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx); + +// Arcade-support functions +// We really need to reexamine how we should abstract this, considering the initial state of the DIP switches, +// and moving the DIP switch drawing code to the driver side. +void MDFNI_ToggleDIP(int which); +void MDFNI_InsertCoin(void); +void MDFNI_ToggleDIPView(void); + +bool MDFNI_EnableStateRewind(bool enable); + +bool MDFNI_StartAVRecord(const char *path, double SoundRate); +void MDFNI_StopAVRecord(void); + +bool MDFNI_StartWAVRecord(const char *path, double SoundRate); +void MDFNI_StopWAVRecord(void); + +void MDFNI_DumpModulesDef(const char *fn); + +#endif diff --git a/Mednafen/mednafen/mednafen.cpp b/Mednafen/mednafen/mednafen.cpp new file mode 100644 index 0000000000..f22a0e9463 --- /dev/null +++ b/Mednafen/mednafen/mednafen.cpp @@ -0,0 +1,2099 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "netplay.h" +#include "netplay-driver.h" +#include "general.h" +#include "string/trim.h" + +#include "state.h" +#include "movie.h" +#include "state_rewind.h" +#include "video.h" +#include "video/Deinterlacer.h" +#include "file.h" +#include "sound/WAVRecord.h" +#include "cdrom/cdromif.h" +#include "mempatcher.h" +#include "compress/minilzo.h" +#include "tests.h" +#include "video/tblur.h" +#include "qtrecord.h" +#include +#include +#include "sound/Fir_Resampler.h" + +#include "string/escape.h" + +#include "cdrom/CDUtility.h" + +static void SettingChanged(const char* name); + +static const char *CSD_forcemono = gettext_noop("Force monophonic sound output."); +static const char *CSD_enable = gettext_noop("Enable (automatic) usage of this module."); +static const char *CSD_tblur = gettext_noop("Enable video temporal blur(50/50 previous/current frame by default)."); +static const char *CSD_tblur_accum = gettext_noop("Accumulate color data rather than discarding it."); +static const char *CSD_tblur_accum_amount = gettext_noop("Blur amount in accumulation mode, specified in percentage of accumulation buffer to mix with the current frame."); + +static MDFNSetting_EnumList VCodec_List[] = +{ + { "raw", (int)QTRecord::VCODEC_RAW, "Raw", + gettext_noop("A fast codec, computationally, but will cause enormous file size and may exceed your storage medium's sustained write rate.") }, + + { "cscd", (int)QTRecord::VCODEC_CSCD, "CamStudio Screen Codec", + gettext_noop("A good balance between performance and compression ratio.") }, + + { "png", (int)QTRecord::VCODEC_PNG, "PNG", + gettext_noop("Has a better compression ratio than \"cscd\", but is much more CPU intensive. Use for compatibility with official QuickTime in cases where you have insufficient disk space for \"raw\".") }, + + { NULL, 0 }, +}; + +static MDFNSetting_EnumList Deinterlacer_List[] = +{ + { "weave", Deinterlacer::DEINT_WEAVE, gettext_noop("Good for low-motion video; can be used in conjunction with negative .scanlines setting values.") }, + { "bob", Deinterlacer::DEINT_BOB, gettext_noop("Good for causing a headache. All glory to Bob.") }, + { "bob_offset", Deinterlacer::DEINT_BOB_OFFSET, gettext_noop("Good for high-motion video, but is a bit flickery; reduces the subjective vertical resolution.") }, + + { NULL, 0 }, +}; + +static const char *fname_extra = gettext_noop("See fname_format.txt for more information. Edit at your own risk."); + +static MDFNSetting MednafenSettings[] = +{ + { "netplay.password", MDFNSF_NOFLAGS, gettext_noop("Server password."), gettext_noop("Password to connect to the netplay server."), MDFNST_STRING, "" }, + { "netplay.localplayers", MDFNSF_NOFLAGS, gettext_noop("Local player count."), gettext_noop("Number of local players for network play. This number is advisory to the server, and the server may assign fewer players if the number of players requested is higher than the number of controllers currently available."), MDFNST_UINT, "1", "0", "16" }, + { "netplay.nick", MDFNSF_NOFLAGS, gettext_noop("Nickname."), gettext_noop("Nickname to use for network play chat."), MDFNST_STRING, "" }, + { "netplay.gamekey", MDFNSF_NOFLAGS, gettext_noop("Key to hash with the MD5 hash of the game."), NULL, MDFNST_STRING, "" }, + + { "srwframes", MDFNSF_NOFLAGS, gettext_noop("Number of frames to keep states for when state rewinding is enabled."), + gettext_noop("WARNING: Setting this to a large value may cause excessive RAM usage in some circumstances, such as with games that stream large volumes of data off of CDs."), MDFNST_UINT, "600", "10", "99999" }, + + { "cd.image_memcache", MDFNSF_NOFLAGS, gettext_noop("Cache entire CD images in memory."), gettext_noop("Reads the entire CD image(s) into memory at startup(which will cause a small delay). Can help obviate emulation hiccups due to emulated CD access. May cause more harm than good on low memory systems, systems with swap enabled, and/or when the disc images in question are on a fast SSD."), MDFNST_BOOL, "0" }, + + { "filesys.untrusted_fip_check", MDFNSF_NOFLAGS, gettext_noop("Enable untrusted file-inclusion path security check."), + gettext_noop("When this setting is set to \"1\", the default, paths to files referenced from files like CUE sheets and PSF rips are checked for certain characters that can be used in directory traversal, and if found, loading is aborted. Set it to \"0\" if you want to allow constructs like absolute paths in CUE sheets, but only if you understand the security implications of doing so(see \"Security Issues\" section in the documentation)."), MDFNST_BOOL, "1" }, + + { "filesys.path_snap", MDFNSF_NOFLAGS, gettext_noop("Path to directory for screen snapshots."), NULL, MDFNST_STRING, "snaps" }, + { "filesys.path_sav", MDFNSF_NOFLAGS, gettext_noop("Path to directory for save games and nonvolatile memory."), gettext_noop("WARNING: Do not set this path to a directory that contains Famicom Disk System disk images, or you will corrupt them when you load an FDS game and exit Mednafen."), MDFNST_STRING, "sav" }, + { "filesys.path_state", MDFNSF_NOFLAGS, gettext_noop("Path to directory for save states."), NULL, MDFNST_STRING, "mcs" }, + { "filesys.path_movie", MDFNSF_NOFLAGS, gettext_noop("Path to directory for movies."), NULL, MDFNST_STRING, "mcm" }, + { "filesys.path_cheat", MDFNSF_NOFLAGS, gettext_noop("Path to directory for cheats."), NULL, MDFNST_STRING, "cheats" }, + { "filesys.path_palette", MDFNSF_NOFLAGS, gettext_noop("Path to directory for custom palettes."), NULL, MDFNST_STRING, "palettes" }, + { "filesys.path_pgconfig", MDFNSF_NOFLAGS, gettext_noop("Path to directory for per-game configuration override files."), NULL, MDFNST_STRING, "pgconfig" }, + { "filesys.path_firmware", MDFNSF_NOFLAGS, gettext_noop("Path to directory for firmware."), NULL, MDFNST_STRING, "firmware" }, + + { "filesys.fname_movie", MDFNSF_NOFLAGS, gettext_noop("Format string for movie filename."), fname_extra, MDFNST_STRING, "%f.%M%p.%x" }, + { "filesys.fname_state", MDFNSF_NOFLAGS, gettext_noop("Format string for state filename."), fname_extra, MDFNST_STRING, "%f.%M%X" /*"%F.%M%p.%x"*/ }, + { "filesys.fname_sav", MDFNSF_NOFLAGS, gettext_noop("Format string for save games filename."), gettext_noop("WARNING: %x should always be included, otherwise you run the risk of overwriting save data for games that create multiple save data files.\n\nSee fname_format.txt for more information. Edit at your own risk."), MDFNST_STRING, "%F.%M%x" }, + { "filesys.fname_snap", MDFNSF_NOFLAGS, gettext_noop("Format string for screen snapshot filenames."), gettext_noop("WARNING: %x or %p should always be included, otherwise there will be a conflict between the numeric counter text file and the image data file.\n\nSee fname_format.txt for more information. Edit at your own risk."), MDFNST_STRING, "%f-%p.%x" }, + + { "filesys.state_comp_level", MDFNSF_NOFLAGS, gettext_noop("Save state file compression level."), gettext_noop("gzip/deflate compression level for save states saved to files. -1 will disable gzip compression and wrapping entirely."), MDFNST_INT, "6", "-1", "9" }, + + + { "qtrecord.w_double_threshold", MDFNSF_NOFLAGS, gettext_noop("Double the raw image's width if it's below this threshold."), NULL, MDFNST_UINT, "384", "0", "1073741824" }, + { "qtrecord.h_double_threshold", MDFNSF_NOFLAGS, gettext_noop("Double the raw image's height if it's below this threshold."), NULL, MDFNST_UINT, "256", "0", "1073741824" }, + + { "qtrecord.vcodec", MDFNSF_NOFLAGS, gettext_noop("Video codec to use."), NULL, MDFNST_ENUM, "cscd", NULL, NULL, NULL, NULL, VCodec_List }, + + { "video.deinterlacer", MDFNSF_CAT_VIDEO, gettext_noop("Deinterlacer to use for interlaced video."), NULL, MDFNST_ENUM, "weave", NULL, NULL, NULL, SettingChanged, Deinterlacer_List }, + + { NULL } +}; + +static MDFNSetting RenamedSettings[] = +{ + { "path_snap", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_snap" }, + { "path_sav", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_sav" }, + { "path_state", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_state" }, + { "path_movie", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_movie" }, + { "path_cheat", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_cheat" }, + { "path_palette", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_palette" }, + { "path_firmware", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "filesys.path_firmware" }, + + { "sounddriver", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "sound.driver" }, + { "sounddevice", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "sound.device" }, + { "soundrate", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "sound.rate" }, + { "soundvol", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "sound.volume" }, + { "soundbufsize", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "sound.buffer_time" }, + + { "nethost", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.host" }, + { "netport", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.port" }, + { "netpassword", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.password"}, + { "netlocalplayers", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.localplayers" }, + { "netnick", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.nick" }, + { "netgamekey", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.gamekey" }, + { "netsmallfont", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "netplay.smallfont" }, + + { "frameskip", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "video.frameskip" }, + { "vdriver", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "video.driver" }, + { "glvsync", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "video.glvsync" }, + { "fs", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "video.fs" }, + + { "autofirefreq", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "input.autofirefreq" }, + { "analogthreshold", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "input.joystick.axis_threshold" }, + { "ckdelay", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "input.ckdelay" }, + + + { "psx.input.port1.multitap", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "psx.input.pport1.multitap" }, + { "psx.input.port2.multitap", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "psx.input.pport2.multitap" }, + + { "snes_faust.spexf", MDFNSF_NOFLAGS, NULL, NULL, MDFNST_ALIAS , "snes_faust.spex" }, + + { NULL } +}; + +static uint8* CustomPalette = NULL; +static uint32 CustomPaletteNumEntries = 0; + +static uint32 PortDevice[16]; +static uint8* PortData[16]; +static uint32 PortDataLen[16]; + +MDFNGI *MDFNGameInfo = NULL; + +static QTRecord *qtrecorder = NULL; +static WAVRecord *wavrecorder = NULL; +static Fir_Resampler<16> ff_resampler; +static double LastSoundMultiplier; + +static bool FFDiscard = FALSE; // TODO: Setting to discard sound samples instead of increasing pitch + +static MDFN_PixelFormat last_pixel_format; +static double last_sound_rate; + +static bool PrevInterlaced; +static Deinterlacer deint; + +static std::vector CDInterfaces; // FIXME: Cleanup on error out. + +struct DriveMediaStatus +{ + uint32 state_idx = 0; + uint32 media_idx = 0; + uint32 orientation_idx = 0; +}; + +static std::vector DMStatus; + +static void SettingChanged(const char* name) +{ + if(!strcmp(name, "video.deinterlacer")) + deint.SetType(MDFN_GetSettingUI(name)); +} + +bool MDFNI_StartWAVRecord(const char *path, double SoundRate) +{ + try + { + wavrecorder = new WAVRecord(path, SoundRate, MDFNGameInfo->soundchan); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + return(false); + } + + return(true); +} + +bool MDFNI_StartAVRecord(const char *path, double SoundRate) +{ + try + { + QTRecord::VideoSpec spec; + + memset(&spec, 0, sizeof(spec)); + + spec.SoundRate = SoundRate; + spec.SoundChan = MDFNGameInfo->soundchan; + spec.VideoWidth = MDFNGameInfo->lcm_width; + spec.VideoHeight = MDFNGameInfo->lcm_height; + spec.VideoCodec = MDFN_GetSettingI("qtrecord.vcodec"); + spec.MasterClock = MDFNGameInfo->MasterClock; + + if(spec.VideoWidth < MDFN_GetSettingUI("qtrecord.w_double_threshold")) + spec.VideoWidth *= 2; + + if(spec.VideoHeight < MDFN_GetSettingUI("qtrecord.h_double_threshold")) + spec.VideoHeight *= 2; + + + spec.AspectXAdjust = ((double)MDFNGameInfo->nominal_width * 2) / spec.VideoWidth; + spec.AspectYAdjust = ((double)MDFNGameInfo->nominal_height * 2) / spec.VideoHeight; + + MDFN_printf("\n"); + MDFN_printf(_("Starting QuickTime recording to file \"%s\":\n"), path); + MDFN_indent(1); + MDFN_printf(_("Video width: %u\n"), spec.VideoWidth); + MDFN_printf(_("Video height: %u\n"), spec.VideoHeight); + MDFN_printf(_("Video codec: %s\n"), MDFN_GetSettingS("qtrecord.vcodec").c_str()); + + if(spec.SoundRate && spec.SoundChan) + { + MDFN_printf(_("Sound rate: %u\n"), std::min(spec.SoundRate, 64000)); + MDFN_printf(_("Sound channels: %u\n"), spec.SoundChan); + } + else + MDFN_printf(_("Sound: Disabled\n")); + + MDFN_indent(-1); + MDFN_printf("\n"); + + qtrecorder = new QTRecord(path, spec); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + return(false); + } + return(true); +} + +void MDFNI_StopAVRecord(void) +{ + if(qtrecorder) + { + delete qtrecorder; + qtrecorder = NULL; + } +} + +void MDFNI_StopWAVRecord(void) +{ + if(wavrecorder) + { + delete wavrecorder; + wavrecorder = NULL; + } +} + +void MDFNI_CloseGame(void) +{ + if(MDFNGameInfo) + { + if(MDFNnetplay) + MDFNI_NetplayStop(); + + MDFNSRW_End(); + MDFNMOV_Stop(); + + if(MDFNGameInfo->GameType != GMT_PLAYER) + MDFN_FlushGameCheats(0); + + MDFNGameInfo->CloseGame(); + + // + // + // + if(MDFNGameInfo->name) + { + free(MDFNGameInfo->name); + MDFNGameInfo->name = NULL; + } + + if(MDFNGameInfo->RMD) + { + delete MDFNGameInfo->RMD; + MDFNGameInfo->RMD = NULL; + } + + MDFNMP_Kill(); + + + // + // + memset(MDFNGameInfo->MD5, 0, sizeof(MDFNGameInfo->MD5)); + memset(MDFNGameInfo->GameSetMD5, 0, sizeof(MDFNGameInfo->GameSetMD5)); + MDFNGameInfo->GameSetMD5Valid = false; + MDFNGameInfo = NULL; + + for(unsigned i = 0; i < CDInterfaces.size(); i++) + delete CDInterfaces[i]; + CDInterfaces.clear(); + } + TBlur_Kill(); + + #ifdef WANT_DEBUGGER + MDFNDBG_Kill(); + #endif + + for(unsigned x = 0; x < 16; x++) + { + if(PortData[x]) + { + free(PortData[x]); + PortData[x] = NULL; + } + + PortDevice[x] = ~0U; + PortDataLen[x] = 0; + } + + if(CustomPalette != NULL) + { + delete[] CustomPalette; + CustomPalette = NULL; + } + CustomPaletteNumEntries = 0; + + MDFN_ClearAllOverrideSettings(); +} + +int MDFNI_NetplayStart(void) +{ + return(NetplayStart(PortDevice, PortDataLen)); +} + + +#ifdef WANT_NES_EMU +extern MDFNGI EmulatedNES; +#endif + +#ifdef WANT_SNES_EMU +extern MDFNGI EmulatedSNES; +#endif + +#ifdef WANT_SNES_FAUST_EMU +extern MDFNGI EmulatedSNES_Faust; +#endif + +#ifdef WANT_GBA_EMU +extern MDFNGI EmulatedGBA; +#endif + +#ifdef WANT_GB_EMU +extern MDFNGI EmulatedGB; +#endif + +#ifdef WANT_LYNX_EMU +extern MDFNGI EmulatedLynx; +#endif + +#ifdef WANT_MD_EMU +extern MDFNGI EmulatedMD; +#endif + +#ifdef WANT_NGP_EMU +extern MDFNGI EmulatedNGP; +#endif + +#ifdef WANT_PCE_EMU +extern MDFNGI EmulatedPCE; +#endif + +#ifdef WANT_PCE_FAST_EMU +extern MDFNGI EmulatedPCE_Fast; +#endif + +#ifdef WANT_PCFX_EMU +extern MDFNGI EmulatedPCFX; +#endif + +#ifdef WANT_PSX_EMU +extern MDFNGI EmulatedPSX; +#endif + +#ifdef WANT_VB_EMU +extern MDFNGI EmulatedVB; +#endif + +#ifdef WANT_WSWAN_EMU +extern MDFNGI EmulatedWSwan; +#endif + +#ifdef WANT_SMS_EMU +extern MDFNGI EmulatedSMS, EmulatedGG; +#endif + +extern MDFNGI EmulatedCDPlay; +extern MDFNGI EmulatedDEMO; + +std::vector MDFNSystems; +static std::list MDFNSystemsPrio; + +bool MDFNSystemsPrio_CompareFunc(MDFNGI *first, MDFNGI *second) +{ + if(first->ModulePriority > second->ModulePriority) + return(true); + + return(false); +} + +static void AddSystem(MDFNGI *system) +{ + MDFNSystems.push_back(system); +} + +void MDFNI_DumpModulesDef(const char *fn) +{ + FileStream fp(fn, FileStream::MODE_WRITE); + + fp.print_format("%s\n", MEDNAFEN_VERSION); + + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + fp.print_format("%s\n", MDFNSystems[i]->shortname); + fp.print_format("%s\n", MDFNSystems[i]->fullname); + fp.print_format("%d\n", MDFNSystems[i]->nominal_width); + fp.print_format("%d\n", MDFNSystems[i]->nominal_height); + } + fp.close(); +} + +static void ReadM3U(std::vector &file_list, std::string path, unsigned depth = 0) +{ + FileStream m3u_file(path, FileStream::MODE_READ); + std::string dir_path; + std::string linebuf; + + MDFN_GetFilePathComponents(path, &dir_path); + + linebuf.reserve(2048); + + while(m3u_file.get_line(linebuf) >= 0) + { + std::string efp; + + MDFN_rtrim(linebuf); + + // Blank line, skip it. + if(linebuf.size() == 0) + continue; + + // Comment line, skip it. + if(linebuf[0] == '#') + continue; + + efp = MDFN_EvalFIP(dir_path, linebuf); + + if(efp.size() >= 4 && efp.substr(efp.size() - 4) == ".m3u") + { + if(efp == path) + throw(MDFN_Error(0, _("M3U at \"%s\" references self."), efp.c_str())); + + if(depth == 99) + throw(MDFN_Error(0, _("M3U load recursion too deep!"))); + + ReadM3U(file_list, efp, depth++); + } + else + file_list.push_back(efp); + } +} + +static void MakeGIName(MDFNGI* gi, const char* path) +{ + char* ns = NULL; + char* tmp; + + if((ns = strdup(GetFNComponent(path)))) + { + unsigned nslen = strlen(ns); + + for(unsigned x = 0; x < nslen; x++) + { + if(ns[x] == '_') + ns[x] = ' '; + else if(ns[x] < 0x20) + ns[x] = ' '; + } + + if((tmp = strrchr(ns, '.'))) + *tmp = 0; + + MDFN_trim(ns); + + gi->name = ns; + } +} + +static void PrintDiscsLayout(std::vector *ifaces) +{ + MDFN_AutoIndent aind(1); + + for(unsigned i = 0; i < (*ifaces).size(); i++) + { + CDUtility::TOC toc; + + (*ifaces)[i]->ReadTOC(&toc); + + MDFN_printf(_("CD %u TOC:\n"), i + 1); + { + MDFN_AutoIndent aindd(1); + int32 eff_lt = 0; + const char* disc_type_string; + + switch(toc.disc_type) + { + default: + disc_type_string = ""; + break; + + case CDUtility::DISC_TYPE_CDDA_OR_M1: + disc_type_string = _(" (CD-DA or Mode 1)"); + break; + + case CDUtility::DISC_TYPE_CD_I: + disc_type_string = _(" (CD-i)"); + break; + + case CDUtility::DISC_TYPE_CD_XA: + disc_type_string = _(" (CD-XA)"); + break; + } + + MDFN_printf(_("Disc Type: 0x%02x%s\n"), toc.disc_type, disc_type_string); + MDFN_printf(_("First Track: %2d\n"), toc.first_track); + MDFN_printf(_("Last Track: %2d\n"), toc.last_track); + + for(int32 track = 1; track <= 99; track++) + { + if(!toc.tracks[track].valid) + continue; + + eff_lt = track; + + uint8 m, s, f; + + CDUtility::LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); + + MDFN_printf(_("Track %2d, MSF: %02d:%02d:%02d, LBA: %6d %s%s\n"), + track, + m, s, f, + toc.tracks[track].lba, + (toc.tracks[track].control & 0x4) ? "DATA" : "AUDIO", + (track < toc.first_track || track > toc.last_track) ? _(" (Hidden)") : ""); + } + + MDFN_printf(_("Leadout: %6d %s\n"), toc.tracks[100].lba, (toc.tracks[100].control & 0x4) ? "DATA" : "AUDIO"); + + if((toc.tracks[eff_lt].control & 0x4) != (toc.tracks[100].control & 0x4)) + MDFN_printf(_("WARNING: DATA/AUDIO TYPE MISMATCH BETWEEN LAST TRACK AND LEADOUT AREA.")); + + MDFN_printf("\n"); + } + } +} + +static void CalcDiscsLayoutMD5(std::vector *ifaces, uint8 out_md5[16]) +{ + md5_context layout_md5; + + layout_md5.starts(); + + for(unsigned i = 0; i < (*ifaces).size(); i++) + { + CD_TOC toc; + + (*ifaces)[i]->ReadTOC(&toc); + + layout_md5.update_u32_as_lsb(toc.first_track); + layout_md5.update_u32_as_lsb(toc.last_track); + layout_md5.update_u32_as_lsb(toc.tracks[100].lba); + + for(uint32 track = 1; track <= 99; track++) + { + if(!toc.tracks[track].valid) + continue; + + layout_md5.update_u32_as_lsb(toc.tracks[track].lba); + layout_md5.update_u32_as_lsb(toc.tracks[track].control & 0x4); + } + } + + layout_md5.finish(out_md5); +} + +static void LoadCustomPalette(void) +{ + if(!MDFNGameInfo->CPInfo) + return; + + for(auto cpi = MDFNGameInfo->CPInfo; cpi->description || cpi->name_override; cpi++) + { + if(!(MDFNGameInfo->CPInfoActiveBF & (1U << (cpi - MDFNGameInfo->CPInfo)))) + continue; + + std::string colormap_fn = MDFN_MakeFName(MDFNMKF_PALETTE, 0, cpi->name_override); + + MDFN_printf("\n"); + MDFN_printf(_("Loading custom palette from \"%s\"...\n"), colormap_fn.c_str()); + { + MDFN_AutoIndent aind(1); + + try + { + FileStream fp(colormap_fn, FileStream::MODE_READ); + const uint64 fpsz = fp.size(); + + for(auto vec = cpi->valid_entry_count; *vec; vec++) + { + if(fpsz == *vec * 3) + { + CustomPaletteNumEntries = *vec; + CustomPalette = new uint8[CustomPaletteNumEntries * 3]; + + fp.read(CustomPalette, CustomPaletteNumEntries * 3); + + return; + } + } + + // + // File size is not valid, print out an error message with helpful information. + // + std::string vfszs; + for(auto vec = cpi->valid_entry_count; *vec; vec++) + { + if(vfszs.size()) + vfszs += _(", "); + + vfszs += std::to_string(3 * *vec); + } + + throw MDFN_Error(0, _("Custom palette file's size(%llu bytes) is incorrect. Valid sizes are: %s"), (unsigned long long)fpsz, vfszs.c_str()); + } + catch(MDFN_Error &e) + { + MDFN_printf(_("Error: %s\n"), e.what()); + + if(e.GetErrno() != ENOENT) + throw; + + return; + } + catch(std::exception &e) + { + MDFN_printf(_("Error: %s\n"), e.what()); + throw; + } + } + break; + } +} + +static void LoadCommonPost(const char* name) +{ + DMStatus.resize(MDFNGameInfo->RMD->Drives.size()); + + if(!MDFNGameInfo->name && name) + MakeGIName(MDFNGameInfo, name); + + // + // + // + + LoadCustomPalette(); + if(MDFNGameInfo->GameType != GMT_PLAYER) + { + MDFN_LoadGameCheats(NULL); + MDFNMP_InstallReadPatches(); + } + + MDFNI_SetLayerEnableMask(~0ULL); + + #ifdef WANT_DEBUGGER + MDFNDBG_PostGameLoad(); + #endif + + MDFNSS_CheckStates(); + MDFNMOV_CheckMovies(); + + MDFN_ResetMessages(); // Save state, status messages, etc. + + PrevInterlaced = false; + deint.ClearState(); + SettingChanged("video.deinterlacer"); + + TBlur_Init(); + + MDFNSRW_Begin(); + + LastSoundMultiplier = 1; + last_sound_rate = -1; + memset(&last_pixel_format, 0, sizeof(MDFN_PixelFormat)); +} + +MDFNGI *MDFNI_LoadCD(const char *force_module, const char *path) +{ + uint8 LayoutMD5[16]; + + MDFNI_CloseGame(); + + assert(path != NULL); + MDFN_printf(_("Loading %s...\n"), path); + + try + { + MDFN_AutoIndent aind(1); + const bool image_memcache = MDFN_GetSettingB("cd.image_memcache"); + + if(strlen(path) > 4 && !strcasecmp(path + strlen(path) - 4, ".m3u")) + { + std::vector file_list; + + ReadM3U(file_list, path); + + CDInterfaces.resize(file_list.size()); + for(unsigned i = 0; i < file_list.size(); i++) + { + CDInterfaces[i] = CDIF_Open(file_list[i], image_memcache); + } + } + else + { + CDInterfaces.resize(1); + CDInterfaces[0] = CDIF_Open(path, image_memcache); + } + GetFileBase(path); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Error opening CD: %s"), e.what()); + + for(unsigned i = 0; i < CDInterfaces.size(); i++) + { + if(CDInterfaces[i]) + { + delete CDInterfaces[i]; + CDInterfaces[i] = NULL; + } + } + CDInterfaces.clear(); + + MDFNGameInfo = NULL; + + return(NULL); + } + + MDFN_printf("\n"); + + // + // Print out a track list for all discs. + // + PrintDiscsLayout(&CDInterfaces); + + // + // Calculate layout MD5. The system emulation LoadCD() code is free to ignore this value and calculate + // its own, or to use it to look up a game in its database. + // + CalcDiscsLayoutMD5(&CDInterfaces, LayoutMD5); + + try + { + std::unique_ptr rmd(new RMD_Layout()); + MDFNGameInfo = NULL; + + { + RMD_Drive dr; + + dr.Name = std::string("Virtual CD Drive"); + dr.PossibleStates.push_back(RMD_State({"Tray Open", false, false, true})); + dr.PossibleStates.push_back(RMD_State({"Tray Closed (Empty)", false, false, false})); + dr.PossibleStates.push_back(RMD_State({"Tray Closed", true, true, false})); + dr.CompatibleMedia.push_back(0); + dr.MediaMtoPDelay = 2000; + + rmd->Drives.push_back(dr); + rmd->MediaTypes.push_back(RMD_MediaType({"CD"})); + } + + + for(size_t i = 0; i < CDInterfaces.size(); i++) + { + char namebuf[128]; + + trio_snprintf(namebuf, sizeof(namebuf), _("Disc %zu of %zu"), i + 1, CDInterfaces.size()); + rmd->Media.push_back(RMD_Media({namebuf, 0})); + } + + for(std::list::iterator it = MDFNSystemsPrio.begin(); it != MDFNSystemsPrio.end(); it++) //_unsigned int x = 0; x < MDFNSystems.size(); x++) + { + if(force_module) + { + if(!strcmp(force_module, (*it)->shortname)) + { + MDFNGameInfo = *it; + break; + } + } + else + { + char tmpstr[256]; + trio_snprintf(tmpstr, 256, "%s.enable", (*it)->shortname); + + // Is module enabled? + if(!MDFN_GetSettingB(tmpstr)) + { + MDFN_printf(_("Skipping module \"%s\" per \"%s\" setting.\n"), (*it)->shortname, tmpstr); + continue; + } + + if(!(*it)->LoadCD || !(*it)->TestMagicCD) + continue; + + if((*it)->TestMagicCD(&CDInterfaces)) + { + MDFNGameInfo = *it; + break; + } + } + } + + if(!MDFNGameInfo) + { + if(force_module) + throw MDFN_Error(0, _("Unrecognized system \"%s\"!"), force_module); + else + throw MDFN_Error(0, _("Could not find a system that supports this CD.")); + } + + // This if statement will be true if force_module references a system without CDROM support. + if(!MDFNGameInfo->LoadCD) + throw MDFN_Error(0, _("Specified system \"%s\" doesn't support CDs!"), force_module); + + MDFN_printf(_("Using module: %s(%s)\n"), MDFNGameInfo->shortname, MDFNGameInfo->fullname); + { + MDFN_AutoIndent aindentgm(1); + + assert(MDFNGameInfo->soundchan != 0); + + MDFNGameInfo->name = NULL; + MDFNGameInfo->rotated = 0; + MDFNGameInfo->RMD = rmd.get(); + + memcpy(MDFNGameInfo->MD5, LayoutMD5, 16); + + { + std::string modoverride_settings_file_path = MDFN_GetBaseDirectory() + std::string(PSS) + std::string(MDFNGameInfo->shortname) + std::string(".cfg"); + MDFN_LoadSettings(modoverride_settings_file_path.c_str(), true); + } + { + std::string pgcoverride_settings_file_path = MDFN_MakeFName(MDFNMKF_PGCONFIG, 0, NULL); + MDFN_LoadSettings(pgcoverride_settings_file_path.c_str(), true); + } + + MDFN_printf("\n"); + + MDFNGameInfo->LoadCD(&CDInterfaces); + } + + LoadCommonPost(path); + + rmd.release(); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + + for(unsigned i = 0; i < CDInterfaces.size(); i++) + { + if(CDInterfaces[i]) + { + delete CDInterfaces[i]; + CDInterfaces[i] = NULL; + } + } + CDInterfaces.clear(); + + if(MDFNGameInfo != NULL) + { + memset(MDFNGameInfo->MD5, 0, sizeof(MDFNGameInfo->MD5)); + MDFNGameInfo->RMD = NULL; + MDFNGameInfo = NULL; + } + + if(CustomPalette != NULL) + { + delete[] CustomPalette; + CustomPalette = NULL; + } + CustomPaletteNumEntries = 0; + + MDFN_ClearAllOverrideSettings(); + + return(NULL); + } + + return(MDFNGameInfo); +} + +static void LoadIPS(MDFNFILE* GameFile, const std::string& path) +{ + MDFN_printf(_("Applying IPS file \"%s\"...\n"), path.c_str()); + + try + { + FileStream IPSFile(path, FileStream::MODE_READ); + + GameFile->ApplyIPS(&IPSFile); + } + catch(MDFN_Error &e) + { + MDFN_indent(1); + MDFN_printf(_("Failed: %s\n"), e.what()); + MDFN_indent(-1); + if(e.GetErrno() != ENOENT) + throw; + } + catch(std::exception &e) + { + MDFN_indent(1); + MDFN_printf(_("Failed: %s\n"), e.what()); + MDFN_indent(-1); + throw; + } +} + +static MDFNGI* FindCompatibleModule(const char* force_module, MDFNFILE* gf) +{ + //for(unsigned pass = 0; pass < 2; pass++) + //{ + for(std::list::iterator it = MDFNSystemsPrio.begin(); it != MDFNSystemsPrio.end(); it++) //_unsigned int x = 0; x < MDFNSystems.size(); x++) + { + if(force_module) + { + if(!strcmp(force_module, (*it)->shortname)) + { + if(!(*it)->Load) + { + if((*it)->LoadCD) + throw MDFN_Error(0, _("Specified system only supports CD(physical, or image files, such as *.cue and *.toc) loading.")); + else + throw MDFN_Error(0, _("Specified system does not support normal file loading.")); + } + return(*it); + } + } + else + { + char tmpstr[256]; + trio_snprintf(tmpstr, 256, "%s.enable", (*it)->shortname); + + // Is module enabled? + if(!MDFN_GetSettingB(tmpstr)) + { + MDFN_printf(_("Skipping module \"%s\" per \"%s\" setting.\n"), (*it)->shortname, tmpstr); + continue; + } + + if(!(*it)->Load || !(*it)->TestMagic) + continue; + + gf->rewind(); + + if((*it)->TestMagic(gf)) + { + return(*it); + } + } + } + //} + + return(NULL); +} + +MDFNGI *MDFNI_LoadGame(const char *force_module, const char *name) +{ + if(strlen(name) > 4 && (!strcasecmp(name + strlen(name) - 4, ".cue") || !strcasecmp(name + strlen(name) - 4, ".toc") || !strcasecmp(name + strlen(name) - 4, ".ccd") || !strcasecmp(name + strlen(name) - 4, ".m3u"))) + { + return(MDFNI_LoadCD(force_module, name)); + } + + MDFNI_CloseGame(); + + MDFN_printf(_("Loading %s...\n"), name); + + try + { + MDFN_AutoIndent aind(1); + std::vector valid_iae; + std::unique_ptr rmd(new RMD_Layout()); + + MDFNGameInfo = NULL; + + GetFileBase(name); + + // Construct a NULL-delimited list of known file extensions for MDFN_fopen() + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + const FileExtensionSpecStruct *curexts = MDFNSystems[i]->FileExtensions; + + // If we're forcing a module, only look for extensions corresponding to that module + if(force_module && strcmp(MDFNSystems[i]->shortname, force_module)) + continue; + + if(curexts) + while(curexts->extension && curexts->description) + { + valid_iae.push_back(*curexts); + curexts++; + } + } + { + FileExtensionSpecStruct tmpext = { NULL, NULL }; + valid_iae.push_back(tmpext); + } + + MDFNFILE GameFile(name, &valid_iae[0], _("game")); + //printf("FBASE=%s,EXT=%s\n", GameFile.fbase, GameFile.ext); + + LoadIPS(&GameFile, MDFN_MakeFName(MDFNMKF_IPS, 0, 0)); + + MDFNGameInfo = FindCompatibleModule(force_module, &GameFile);; + + if(!MDFNGameInfo) + { + if(force_module) + throw MDFN_Error(0, _("Unrecognized system \"%s\"!"), force_module); + else + throw MDFN_Error(0, _("Unrecognized file format.")); + } + + MDFN_printf(_("Using module: %s(%s)\n"), MDFNGameInfo->shortname, MDFNGameInfo->fullname); + { + MDFN_AutoIndent aindentgm(1); + + assert(MDFNGameInfo->soundchan != 0); + + MDFNGameInfo->name = NULL; + MDFNGameInfo->rotated = 0; + MDFNGameInfo->RMD = rmd.get(); + + { + std::string modoverride_settings_file_path = MDFN_GetBaseDirectory() + std::string(PSS) + std::string(MDFNGameInfo->shortname) + std::string(".cfg"); + MDFN_LoadSettings(modoverride_settings_file_path.c_str(), true); + } + { + std::string pgcoverride_settings_file_path = MDFN_MakeFName(MDFNMKF_PGCONFIG, 0, NULL); + MDFN_LoadSettings(pgcoverride_settings_file_path.c_str(), true); + } + + MDFN_printf("\n"); + + GameFile.rewind(); + MDFNGameInfo->Load(&GameFile); + } + + LoadCommonPost(name); + rmd.release(); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + + if(MDFNGameInfo != NULL) + { + MDFNGameInfo->RMD = NULL; + MDFNGameInfo = NULL; + } + + if(CustomPalette != NULL) + { + delete[] CustomPalette; + CustomPalette = NULL; + } + CustomPaletteNumEntries = 0; + + MDFN_ClearAllOverrideSettings(); + + return(NULL); + } + + return(MDFNGameInfo); +} + +static void BuildDynamicSetting(MDFNSetting *setting, const char *system_name, const char *name, uint32 flags, const char *description, MDFNSettingType type, + const char *default_value, const char *minimum = NULL, const char *maximum = NULL, + bool (*validate_func)(const char *name, const char *value) = NULL, void (*ChangeNotification)(const char *name) = NULL) +{ + char setting_name[256]; + + memset(setting, 0, sizeof(MDFNSetting)); + + trio_snprintf(setting_name, 256, "%s.%s", system_name, name); + + setting->name = strdup(setting_name); + setting->description = description; + setting->type = type; + setting->flags = flags; + setting->default_value = default_value; + setting->minimum = minimum; + setting->maximum = maximum; + setting->validate_func = validate_func; + setting->ChangeNotification = ChangeNotification; +} + +bool MDFNI_InitializeModules(const std::vector &ExternalSystems) +{ + static MDFNGI *InternalSystems[] = + { +#ifdef WANT_NES_EMU + &EmulatedNES, +#endif + +#ifdef WANT_SNES_EMU + &EmulatedSNES, +#endif + +#ifdef WANT_SNES_FAUST_EMU + &EmulatedSNES_Faust, +#endif + +#ifdef WANT_GB_EMU + &EmulatedGB, +#endif + +#ifdef WANT_GBA_EMU + &EmulatedGBA, +#endif + +#ifdef WANT_PCE_EMU + &EmulatedPCE, +#endif + +#ifdef WANT_PCE_FAST_EMU + &EmulatedPCE_Fast, +#endif + +#ifdef WANT_LYNX_EMU + &EmulatedLynx, +#endif + +#ifdef WANT_MD_EMU + &EmulatedMD, +#endif + +#ifdef WANT_PCFX_EMU + &EmulatedPCFX, +#endif + +#ifdef WANT_NGP_EMU + &EmulatedNGP, +#endif + +#ifdef WANT_PSX_EMU + &EmulatedPSX, +#endif + +#ifdef WANT_VB_EMU + &EmulatedVB, +#endif + +#ifdef WANT_WSWAN_EMU + &EmulatedWSwan, +#endif + +#ifdef WANT_SMS_EMU + &EmulatedSMS, + &EmulatedGG, +#endif + + &EmulatedCDPlay, + &EmulatedDEMO + }; + std::string i_modules_string, e_modules_string; + + // Static, clear it first + MDFNSystems.clear(); + assert(MEDNAFEN_VERSION_NUMERIC >= 0x0938); + + for(unsigned int i = 0; i < sizeof(InternalSystems) / sizeof(MDFNGI *); i++) + { + AddSystem(InternalSystems[i]); + if(i) + i_modules_string += " "; + i_modules_string += std::string(InternalSystems[i]->shortname); + } + + for(unsigned int i = 0; i < ExternalSystems.size(); i++) + { + AddSystem(ExternalSystems[i]); + if(i) + i_modules_string += " "; + e_modules_string += std::string(ExternalSystems[i]->shortname); + } + + MDFNI_printf(_("Internal emulation modules: %s\n"), i_modules_string.c_str()); + MDFNI_printf(_("External emulation modules: %s\n"), e_modules_string.c_str()); + + + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + MDFNSystemsPrio.push_back(MDFNSystems[i]); + + MDFNSystemsPrio.sort(MDFNSystemsPrio_CompareFunc); + + CDUtility::CDUtility_Init(); + + return(1); +} + +static std::string settings_file_path; + +int MDFNI_Initialize(const char *basedir, const std::vector &DriverSettings) +{ + static std::vector dynamic_settings; + dynamic_settings.clear(); + + // DO NOT REMOVE/DISABLE THESE MATH AND COMPILER SANITY TESTS. THEY EXIST FOR A REASON. + //uint32 st = MDFND_GetTime(); +// if(!MDFN_RunMathTests()) +// { +// return(0); +// } + //printf("%u\n", MDFND_GetTime() - st); + + for(unsigned x = 0; x < 16; x++) + { + PortDevice[x] = ~0U; + PortData[x] = NULL; + PortDataLen[x] = 0; + } + + lzo_init(); + + MDFN_SetBaseDirectory(basedir); + + MDFN_InitFontData(); + + // Generate dynamic settings + for(unsigned int i = 0; i < MDFNSystems.size(); i++) + { + MDFNSetting setting; + const char *sysname; + + sysname = (const char *)MDFNSystems[i]->shortname; + + if(!MDFNSystems[i]->soundchan) + printf("0 sound channels for %s????\n", sysname); + + if(MDFNSystems[i]->soundchan == 2) + { + BuildDynamicSetting(&setting, sysname, "forcemono", MDFNSF_COMMON_TEMPLATE | MDFNSF_CAT_SOUND, CSD_forcemono, MDFNST_BOOL, "0"); + dynamic_settings.push_back(setting); + } + + BuildDynamicSetting(&setting, sysname, "enable", MDFNSF_COMMON_TEMPLATE, CSD_enable, MDFNST_BOOL, "1"); + dynamic_settings.push_back(setting); + + BuildDynamicSetting(&setting, sysname, "tblur", MDFNSF_COMMON_TEMPLATE | MDFNSF_CAT_VIDEO, CSD_tblur, MDFNST_BOOL, "0"); + dynamic_settings.push_back(setting); + + BuildDynamicSetting(&setting, sysname, "tblur.accum", MDFNSF_COMMON_TEMPLATE | MDFNSF_CAT_VIDEO, CSD_tblur_accum, MDFNST_BOOL, "0"); + dynamic_settings.push_back(setting); + + BuildDynamicSetting(&setting, sysname, "tblur.accum.amount", MDFNSF_COMMON_TEMPLATE | MDFNSF_CAT_VIDEO, CSD_tblur_accum_amount, MDFNST_FLOAT, "50", "0", "100"); + dynamic_settings.push_back(setting); + } + + // First merge all settable settings, then load the settings from the SETTINGS FILE OF DOOOOM + MDFN_MergeSettings(MednafenSettings); + MDFN_MergeSettings(dynamic_settings); + MDFN_MergeSettings(MDFNMP_Settings); + + if(DriverSettings.size()) + MDFN_MergeSettings(DriverSettings); + + for(unsigned int x = 0; x < MDFNSystems.size(); x++) + { + if(MDFNSystems[x]->Settings) + MDFN_MergeSettings(MDFNSystems[x]->Settings); + } + + MDFN_MergeSettings(RenamedSettings); + + try + { + settings_file_path = std::string(basedir) + std::string(PSS) + std::string("mednafen-09x.cfg"); + MDFN_LoadSettings(settings_file_path.c_str()); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + return(0); + } + + #ifdef WANT_DEBUGGER + MDFNDBG_Init(); + #endif + return(1); +} + +void MDFNI_Kill(void) +{ + MDFN_SaveSettings(settings_file_path.c_str()); + MDFN_KillSettings(); +} + +static double multiplier_save, volume_save; +static std::vector SoundBufPristine; + +static void ProcessAudio(EmulateSpecStruct *espec) +{ + if(espec->SoundVolume != 1) + volume_save = espec->SoundVolume; + + if(espec->soundmultiplier != 1) + multiplier_save = espec->soundmultiplier; + + if(espec->SoundBuf && espec->SoundBufSize) + { + int16 *const SoundBuf = espec->SoundBuf + espec->SoundBufSizeALMS * MDFNGameInfo->soundchan; + int32 SoundBufSize = espec->SoundBufSize - espec->SoundBufSizeALMS; + const int32 SoundBufMaxSize = espec->SoundBufMaxSize - espec->SoundBufSizeALMS; + + // + // Sound reverse code goes before copying sound data to SoundBufPristine. + // + if(espec->NeedSoundReverse) + { + int16 *yaybuf = SoundBuf; + int32 slen = SoundBufSize; + + if(MDFNGameInfo->soundchan == 1) + { + for(int x = 0; x < (slen / 2); x++) + { + int16 cha = yaybuf[slen - x - 1]; + yaybuf[slen - x - 1] = yaybuf[x]; + yaybuf[x] = cha; + } + } + else if(MDFNGameInfo->soundchan == 2) + { + for(int x = 0; x < (slen * 2) / 2; x++) + { + int16 cha = yaybuf[slen * 2 - (x&~1) - ((x&1) ^ 1) - 1]; + yaybuf[slen * 2 - (x&~1) - ((x&1) ^ 1) - 1] = yaybuf[x]; + yaybuf[x] = cha; + } + } + } + + + if(qtrecorder && (volume_save != 1 || multiplier_save != 1)) + { + int32 orig_size = SoundBufPristine.size(); + + SoundBufPristine.resize(orig_size + SoundBufSize * MDFNGameInfo->soundchan); + for(int i = 0; i < SoundBufSize * MDFNGameInfo->soundchan; i++) + SoundBufPristine[orig_size + i] = SoundBuf[i]; + } + +#if 0 + // + // Sine wave sweep for test purposes. + // + { + static double phase = 0; + static double phase_inc = 0.000; + static double phase_inc_inc = 0.000003; + static int32 scounter = 0; + + int16 *sbuf = SoundBuf; + int32 slen = SoundBufSize; + + + if(MDFNGameInfo->soundchan == 2) + { + for(int i = 0; i < slen; i++) + { + int16 tmp = 127 * 256 * sin(phase); + + tmp = (scounter & 8) ? 127 * 256 : -127 * 256; + + sbuf[i * 2 + 0] = tmp; + sbuf[i * 2 + 1] = tmp; + phase += phase_inc; + phase_inc += phase_inc_inc; + scounter++; + } + } + else + { + for(int i = 0; i < slen; i++) + { + int16 tmp = 127 * 256 * sin(phase); + + tmp = (scounter & 8) ? 127 * 256 : -127 * 256; + + sbuf[i] = tmp; + + phase += phase_inc; + phase_inc += phase_inc_inc; + scounter++; + } + } + } + +#endif + + try + { + if(wavrecorder) + wavrecorder->WriteSound(SoundBuf, SoundBufSize); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + delete wavrecorder; + wavrecorder = NULL; + } + + if(multiplier_save != LastSoundMultiplier) + { + ff_resampler.time_ratio(multiplier_save, 0.9965); + LastSoundMultiplier = multiplier_save; + } + + if(multiplier_save != 1) + { + if(FFDiscard) + { + if(SoundBufSize >= multiplier_save) + SoundBufSize /= multiplier_save; + } + else + { + if(MDFNGameInfo->soundchan == 2) + { + assert(ff_resampler.max_write() >= SoundBufSize * 2); + + for(int i = 0; i < SoundBufSize * 2; i++) + ff_resampler.buffer()[i] = SoundBuf[i]; + } + else + { + assert(ff_resampler.max_write() >= SoundBufSize * 2); + + for(int i = 0; i < SoundBufSize; i++) + { + ff_resampler.buffer()[i * 2] = SoundBuf[i]; + ff_resampler.buffer()[i * 2 + 1] = 0; + } + } + ff_resampler.write(SoundBufSize * 2); + + int avail = ff_resampler.avail(); + int real_read = std::min((int)(SoundBufMaxSize * MDFNGameInfo->soundchan), avail); + + if(MDFNGameInfo->soundchan == 2) + SoundBufSize = ff_resampler.read(SoundBuf, real_read ) >> 1; + else + SoundBufSize = ff_resampler.read_mono_hack(SoundBuf, real_read ); + + avail -= real_read; + + if(avail > 0) + { + printf("ff_resampler.avail() > espec->SoundBufMaxSize * MDFNGameInfo->soundchan - %d\n", avail); + ff_resampler.clear(); + } + } + } + + if(volume_save != 1) + { + if(volume_save < 1) + { + int volume = (int)(16384 * volume_save); + + for(int i = 0; i < SoundBufSize * MDFNGameInfo->soundchan; i++) + SoundBuf[i] = (SoundBuf[i] * volume) >> 14; + } + else + { + int volume = (int)(256 * volume_save); + + for(int i = 0; i < SoundBufSize * MDFNGameInfo->soundchan; i++) + { + int temp = ((SoundBuf[i] * volume) >> 8) + 32768; + + temp = clamp_to_u16(temp); + + SoundBuf[i] = temp - 32768; + } + } + } + + // TODO: Optimize this. + if(MDFNGameInfo->soundchan == 2 && MDFN_GetSettingB(std::string(std::string(MDFNGameInfo->shortname) + ".forcemono"))) + { + for(int i = 0; i < SoundBufSize * MDFNGameInfo->soundchan; i += 2) + { + // We should use division instead of arithmetic right shift for correctness(rounding towards 0 instead of negative infinitininintinity), but I like speed. + int32 mixed = (SoundBuf[i + 0] + SoundBuf[i + 1]) >> 1; + + SoundBuf[i + 0] = + SoundBuf[i + 1] = mixed; + } + } + + espec->SoundBufSize = espec->SoundBufSizeALMS + SoundBufSize; + } // end to: if(espec->SoundBuf && espec->SoundBufSize) +} + +void MDFN_MidSync(EmulateSpecStruct *espec) +{ + if(MDFNnetplay) + return; + + ProcessAudio(espec); + + MDFND_MidSync(espec); + + if(MDFNGameInfo->TransformInput) // Call after MDFND_MidSync, and before MDFNMOV_ProcessInput + MDFNGameInfo->TransformInput(); + + MDFNMOV_ProcessInput(PortData, PortDataLen, MDFNGameInfo->PortInfo.size()); + + espec->SoundBufSizeALMS = espec->SoundBufSize; + espec->MasterCyclesALMS = espec->MasterCycles; +} + +void MDFN_MidLineUpdate(EmulateSpecStruct *espec, int y) +{ + //MDFND_MidLineUpdate(espec, y); +} + +void MDFNI_Emulate(EmulateSpecStruct *espec) +{ + multiplier_save = 1; + volume_save = 1; + + espec->CustomPalette = CustomPalette; + espec->CustomPaletteNumEntries = CustomPaletteNumEntries; + + // Initialize some espec member data to zero, to catch some types of bugs. + espec->DisplayRect.x = 0; + espec->DisplayRect.w = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.h = 0; + + assert((bool)(espec->SoundBuf != NULL) == (bool)espec->SoundRate && (bool)espec->SoundRate == (bool)espec->SoundBufMaxSize); + + espec->SoundBufSize = 0; + + espec->VideoFormatChanged = false; + espec->SoundFormatChanged = false; + + if(memcmp(&last_pixel_format, &espec->surface->format, sizeof(MDFN_PixelFormat))) + { + espec->VideoFormatChanged = TRUE; + + last_pixel_format = espec->surface->format; + } + + if(espec->SoundRate != last_sound_rate) + { + espec->SoundFormatChanged = true; + last_sound_rate = espec->SoundRate; + + ff_resampler.buffer_size((espec->SoundRate / 2) * 2); + } + + // We want to record movies without any dropped video frames and without fast-forwarding sound distortion and without custom volume. + // The same goes for WAV recording(sans the dropped video frames bit :b). + if(qtrecorder || wavrecorder) + { + multiplier_save = espec->soundmultiplier; + espec->soundmultiplier = 1; + + volume_save = espec->SoundVolume; + espec->SoundVolume = 1; + } + + if(MDFNGameInfo->TransformInput) + MDFNGameInfo->TransformInput(); + + if(MDFNnetplay) + { + Netplay_Update(PortDevice, PortData, PortDataLen); + } + + MDFNMOV_ProcessInput(PortData, PortDataLen, MDFNGameInfo->PortInfo.size()); + + if(qtrecorder) + espec->skip = 0; + + if(TBlur_IsOn()) + espec->skip = 0; + + if(espec->NeedRewind) + { + if(MDFNnetplay) + { + espec->NeedRewind = false; + MDFN_DispMessage(_("Can't rewind during netplay.")); + } + } + + // Don't even save states with state rewinding if netplay is enabled, it will degrade netplay performance, and can cause + // desynchs with some emulation(IE SNES based on bsnes). + + if(MDFNnetplay) + espec->NeedSoundReverse = false; + else + espec->NeedSoundReverse = MDFNSRW_Frame(espec->NeedRewind); + + MDFNGameInfo->Emulate(espec); + + if(MDFNnetplay) + Netplay_PostProcess(PortDevice, PortData, PortDataLen); + + // + // Sanity checks + // + if(!espec->skip) + { + if(espec->DisplayRect.h == 0) + { + fprintf(stderr, "[BUG] espec->DisplayRect.h == 0\n"); + } + } + + if(!espec->MasterCycles) + { + fprintf(stderr, "[BUG] espec->MasterCycles == 0\n"); + } + + if(espec->MasterCycles < espec->MasterCyclesALMS) + { + fprintf(stderr, "[BUG] espec->MasterCycles < espec->MasterCyclesALMS\n"); + } + + // + // + // + + if(espec->InterlaceOn) + { + if(!PrevInterlaced) + deint.ClearState(); + + deint.Process(espec->surface, espec->DisplayRect, espec->LineWidths, espec->InterlaceField); + + if(deint.GetType() != Deinterlacer::DEINT_WEAVE) + { + espec->InterlaceOn = false; + espec->InterlaceField = 0; + } + + PrevInterlaced = true; + } + else + PrevInterlaced = false; + + ProcessAudio(espec); + + if(qtrecorder) + { + int16 *sb_backup = espec->SoundBuf; + int32 sbs_backup = espec->SoundBufSize; + + if(SoundBufPristine.size()) + { + espec->SoundBuf = &SoundBufPristine[0]; + espec->SoundBufSize = SoundBufPristine.size() / MDFNGameInfo->soundchan; + } + + try + { + qtrecorder->WriteFrame(espec->surface, espec->DisplayRect, espec->LineWidths, espec->SoundBuf, espec->SoundBufSize, espec->MasterCycles); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + delete qtrecorder; + qtrecorder = NULL; + } + + SoundBufPristine.clear(); + + espec->SoundBuf = sb_backup; + espec->SoundBufSize = sbs_backup; + } + + if(TBlur_IsOn()) + TBlur_Run(espec); +} + +static void StateAction_RINP(StateMem* sm, const unsigned load, const bool data_only) +{ + char namebuf[16][2 + 8 + 1]; + + if(!data_only) + { + for(unsigned x = 0; x < 16; x++) + { + trio_snprintf(namebuf[x], sizeof(namebuf[x]), "%02x%08x", x, PortDevice[x]); + } + } + + #define SFRIH(x) SFARRAYN(PortData[x], PortDataLen[x], namebuf[x]) + SFORMAT StateRegs[] = + { + SFRIH(0), SFRIH(1), SFRIH(2), SFRIH(3), SFRIH(4), SFRIH(5), SFRIH(6), SFRIH(7), + SFRIH(8), SFRIH(9), SFRIH(10), SFRIH(11), SFRIH(12), SFRIH(13), SFRIH(14), SFRIH(15), + SFEND + }; + #undef SFRIH + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MDFNRINP", true); +} + +void MDFN_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + for(unsigned i = 0; i < DMStatus.size(); i++) + { + struct DriveMediaStatus tmp = DMStatus[i]; + char sname[32]; + SFORMAT StateRegs[] = + { + SFVARN(tmp.state_idx, "state_idx"), + SFVARN(tmp.media_idx, "media_idx"), + SFVARN(tmp.orientation_idx, "orientation_idx"), + + SFEND + }; + + trio_snprintf(sname, sizeof(sname), "MDFNDRIVE_%08x", i); + + if(MDFNSS_StateAction(sm, load, data_only, StateRegs, sname, true) && load) + { + // Be sure to set media before loading the emulation module state, as setting media + // may affect what state is saved in the emulation module code, and setting media + // can also have side effects(that will be undone by the state load). + if(tmp.state_idx != DMStatus[i].state_idx || tmp.media_idx != DMStatus[i].media_idx || tmp.orientation_idx != DMStatus[i].orientation_idx) + MDFN_UntrustedSetMedia(i, tmp.state_idx, tmp.media_idx, tmp.orientation_idx); + } + } + + StateAction_RINP(sm, load, data_only); + + if(data_only) + MDFNMOV_StateAction(sm, load); + + MDFNGameInfo->StateAction(sm, load, data_only); +} + +static int curindent = 0; + +void MDFN_indent(int indent) +{ + curindent += indent; + if(curindent < 0) + { + fprintf(stderr, "MDFN_indent negative!\n"); + curindent = 0; + } +} + +static uint8 lastchar = 0; +void MDFN_printf(const char *format, ...) noexcept +{ + char *format_temp; + char *temp; + unsigned int x, newlen; + + va_list ap; + va_start(ap,format); + + + // First, determine how large our format_temp buffer needs to be. + uint8 lastchar_backup = lastchar; // Save lastchar! + for(newlen=x=0;xDoSimpleCommand(cmd); +} + +void MDFN_QSimpleCommand(int cmd) +{ + if(MDFNnetplay) + NetplaySendCommand(cmd, 0); + else + { + if(!MDFNMOV_IsPlaying()) + { + MDFN_DoSimpleCommand(cmd); + MDFNMOV_AddCommand(cmd); + } + } +} + +void MDFNI_Power(void) +{ + assert(MDFNGameInfo); + + MDFN_QSimpleCommand(MDFN_MSC_POWER); +} + +void MDFNI_Reset(void) +{ + assert(MDFNGameInfo); + + MDFN_QSimpleCommand(MDFN_MSC_RESET); +} + +// Arcade-support functions + + +// +// Quick and dirty kludge until we can (re-)abstract DIP switch handling properly. +// +#ifdef WANT_NES_EMU +namespace MDFN_IEN_NES +{ +void MDFN_VSUniToggleDIPView(void); +} +#endif +void MDFNI_ToggleDIPView(void) +{ +#ifdef WANT_NES_EMU + if(MDFNGameInfo == &EmulatedNES) + { + MDFN_IEN_NES::MDFN_VSUniToggleDIPView(); + } +#endif +} + +void MDFNI_ToggleDIP(int which) +{ + assert(MDFNGameInfo); + assert(which >= 0); + + MDFN_QSimpleCommand(MDFN_MSC_TOGGLE_DIP0 + which); +} + +void MDFNI_InsertCoin(void) +{ + assert(MDFNGameInfo); + + MDFN_QSimpleCommand(MDFN_MSC_INSERT_COIN); +} + +// +// Disk/Disc-based system support functions +// + +/* Normal chain: MDFNI_SetMedia() -> NetplaySendCommand() + -> MDFNMOVAddCommand() + -> MDFN_UntrustedSetMedia()->MDFNGameInfo->SetMedia + ->MDFN_MediaSetNotification->MDFND_MediaSetNotification() + + MDFN_UntrustedSetMedia() may be called from the movie and netplay code after receiving command data. + MDFN_UntrustedSetMedia() may be called from the core Mednafen save state code. + + MDFN_MediaSetNotification() might be called(in the future) from the emulation module code, particularly to notify the core and driver interface + code of a program-triggered state change(like insert/ejecting a CD); assuming we ever emulate a system with such capabilities. +*/ +void MDFN_MediaSetNotification(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + assert(drive_idx < DMStatus.size()); + //if(drive_idx >= DMStatus.size()) + // DMStatus.resize(drive_idx + 1); + + DMStatus[drive_idx].state_idx = state_idx; + DMStatus[drive_idx].media_idx = media_idx; + DMStatus[drive_idx].orientation_idx = orientation_idx; + + MDFND_MediaSetNotification(drive_idx, state_idx, media_idx, orientation_idx); +} + +bool MDFN_UntrustedSetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + //printf("MDFN_UntrustedSetMedia: %d %d %d %d\n", drive_idx, state_idx, media_idx, orientation_idx); + + if(!MDFNGameInfo->SetMedia) + return(false); + + if(drive_idx >= MDFNGameInfo->RMD->Drives.size()) + return(false); + + if(state_idx >= MDFNGameInfo->RMD->Drives[drive_idx].PossibleStates.size()) + return(false); + + if(media_idx >= MDFNGameInfo->RMD->Media.size()) + return(false); + + if(orientation_idx && orientation_idx >= MDFNGameInfo->RMD->Media[media_idx].Orientations.size()) + return(false); + + if(MDFNGameInfo->SetMedia(drive_idx, state_idx, media_idx, orientation_idx)) + MDFN_MediaSetNotification(drive_idx, state_idx, media_idx, orientation_idx); + + return(true); +} + +bool MDFNI_SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + assert(MDFNGameInfo); + + if(MDFNnetplay || MDFNMOV_IsRecording()) + { + uint8 buf[4 * 4]; + + MDFN_en32lsb(&buf[0x0], drive_idx); + MDFN_en32lsb(&buf[0x4], state_idx); + MDFN_en32lsb(&buf[0x8], media_idx); + MDFN_en32lsb(&buf[0xC], orientation_idx); + + if(MDFNnetplay) + NetplaySendCommand(MDFNNPCMD_SET_MEDIA, sizeof(buf), buf); + + if(MDFNMOV_IsRecording()) + MDFNMOV_AddCommand(MDFNNPCMD_SET_MEDIA, sizeof(buf), buf); + } + + if(!MDFNnetplay && !MDFNMOV_IsPlaying()) + return MDFN_UntrustedSetMedia(drive_idx, state_idx, media_idx, orientation_idx); + else + return false; +} + +void MDFNI_SetLayerEnableMask(uint64 mask) +{ + if(MDFNGameInfo && MDFNGameInfo->SetLayerEnableMask) + { + MDFNGameInfo->SetLayerEnableMask(mask); + } +} + +uint8* MDFNI_SetInput(const uint32 port, const uint32 type) +{ + if(MDFNGameInfo) + { + assert(port < 16 && port < MDFNGameInfo->PortInfo.size()); + assert(type < MDFNGameInfo->PortInfo[port].DeviceInfo.size()); + + if(type != PortDevice[port]) + { + size_t tmp_len = MDFNGameInfo->PortInfo[port].DeviceInfo[type].IDII.InputByteSize; + uint8* tmp_ptr; + + tmp_ptr = (uint8*)malloc(tmp_len ? tmp_len : 1); // Ensure PortData[port], for valid port, is never NULL, for easier handling in regards to stuff like memcpy() + // (which may have "undefined" behavior when a pointer argument is NULL even when length == 0). + memset(tmp_ptr, 0, tmp_len); + + if(PortData[port] != NULL) + free(PortData[port]); + + PortData[port] = tmp_ptr; + PortDataLen[port] = tmp_len; + PortDevice[port] = type; + + MDFNGameInfo->SetInput(port, MDFNGameInfo->PortInfo[port].DeviceInfo[type].ShortName, PortData[port]); + //MDFND_InputSetNotification(port, type, PortData[port]); + } + + return PortData[port]; + } + else + return(NULL); +} + diff --git a/Mednafen/mednafen/mednafen.h b/Mednafen/mednafen/mednafen.h new file mode 100644 index 0000000000..28ba129ecc --- /dev/null +++ b/Mednafen/mednafen/mednafen.h @@ -0,0 +1,45 @@ +#ifndef __MDFN_MEDNAFEN_H +#define __MDFN_MEDNAFEN_H + +#include "types.h" +#include +#include +#include +#include "gettext.h" + +#define _(String) gettext (String) + +#include "math_ops.h" +#include "git.h" + +extern MDFNGI *MDFNGameInfo; + +#include "settings.h" + +void MDFN_PrintError(const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); +void MDFN_printf(const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); +void MDFN_DispMessage(const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); + +void MDFN_DebugPrintReal(const char *file, const int line, const char *format, ...) MDFN_FORMATSTR(gnu_printf, 3, 4); + +#define MDFN_DebugPrint(format, ...) MDFN_DebugPrintReal(__FILE__, __LINE__, format, ## __VA_ARGS__) + +void MDFN_FlushGameCheats(int nosave); +void MDFN_DoSimpleCommand(int cmd); +void MDFN_QSimpleCommand(int cmd); +bool MDFN_UntrustedSetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx); +void MDFN_MediaSetNotification(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx); + +void MDFN_MidSync(EmulateSpecStruct *espec); +void MDFN_MidLineUpdate(EmulateSpecStruct *espec, int y); + +#include "state.h" +// MDFN_StateAction->(Emu Module)StateAction->MDFNSS_StateAction() +void MDFN_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +#include "mednafen-driver.h" + +#include "endian.h" +#include "memory.h" + +#endif diff --git a/Mednafen/mednafen/memory.cpp b/Mednafen/mednafen/memory.cpp new file mode 100644 index 0000000000..dd2bceb176 --- /dev/null +++ b/Mednafen/mednafen/memory.cpp @@ -0,0 +1,128 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" + +#include +#include + +#include "memory.h" + +void *MDFN_calloc_real(bool dothrow, size_t nmemb, size_t size, const char *purpose, const char *_file, const int _line) +{ + void *ret; + + ret = calloc(nmemb, size); + + if(!ret) + { + if(dothrow) + { + ErrnoHolder ene; + + throw MDFN_Error(ene.Errno(), _("Error allocating(calloc) %zu*%zu bytes for \"%s\" in %s(%d)!"), nmemb, size, purpose, _file, _line); + } + else + { + MDFN_PrintError(_("Error allocating(calloc) %zu*%zu bytes for \"%s\" in %s(%d)!"), nmemb, size, purpose, _file, _line); + return(0); + } + } + return ret; +} + +void *MDFN_malloc_real(bool dothrow, size_t size, const char *purpose, const char *_file, const int _line) +{ + void *ret; + + ret = malloc(size); + + if(!ret) + { + if(dothrow) + { + ErrnoHolder ene; + + throw MDFN_Error(ene.Errno(), _("Error allocating(malloc) %zu bytes for \"%s\" in %s(%d)!"), size, purpose, _file, _line); + } + else + { + MDFN_PrintError(_("Error allocating(malloc) %zu bytes for \"%s\" in %s(%d)!"), size, purpose, _file, _line); + return(0); + } + } + return ret; +} + +void *MDFN_realloc_real(bool dothrow, void *ptr, size_t size, const char *purpose, const char *_file, const int _line) +{ + void *ret; + + ret = realloc(ptr, size); + + if(!ret) + { + if(dothrow) + { + ErrnoHolder ene; + + throw MDFN_Error(ene.Errno(), _("Error allocating(realloc) %zu bytes for \"%s\" in %s(%d)!"), size, purpose, _file, _line); + } + else + { + MDFN_PrintError(_("Error allocating(realloc) %zu bytes for \"%s\" in %s(%d)!"), size, purpose, _file, _line); + return(0); + } + } + return ret; +} + +void MDFN_free(void *ptr) +{ + free(ptr); +} + + +// +// +// +void MDFN_FastMemXOR(void* dest, const void* src, size_t count) +{ + const unsigned alch = ((unsigned long long)dest | (unsigned long long)src); + + uint8* pd = (uint8*)dest; + const uint8* sd = (const uint8*)src; + + if((alch & 0x7) == 0) + { + while(MDFN_LIKELY(count >= 32)) + { + MDFN_ennsb(&pd[0], MDFN_densb(&pd[0]) ^ MDFN_densb(&sd[0])); + MDFN_ennsb(&pd[8], MDFN_densb(&pd[8]) ^ MDFN_densb(&sd[8])); + MDFN_ennsb(&pd[16], MDFN_densb(&pd[16]) ^ MDFN_densb(&sd[16])); + MDFN_ennsb(&pd[24], MDFN_densb(&pd[24]) ^ MDFN_densb(&sd[24])); + + pd += 32; + sd += 32; + count -= 32; + } + } + + for(size_t i = 0; MDFN_LIKELY(i < count); i++) + pd[i] ^= sd[i]; +} + diff --git a/Mednafen/mednafen/memory.h b/Mednafen/mednafen/memory.h new file mode 100644 index 0000000000..0074510259 --- /dev/null +++ b/Mednafen/mednafen/memory.h @@ -0,0 +1,184 @@ +#ifndef _MDFN_MEMORY_H + +#include "error.h" + +#include +#include + +// These functions can be used from driver code or from internal Mednafen code. + +#define MDFN_malloc(size, purpose) MDFN_malloc_real(false, size, purpose, __FILE__, __LINE__) +#define MDFN_calloc(nmemb, size, purpose) MDFN_calloc_real(false, nmemb, size, purpose, __FILE__, __LINE__) +#define MDFN_realloc(ptr, size, purpose) MDFN_realloc_real(false, ptr, size, purpose, __FILE__, __LINE__) + +// These three will throw an error message instead of returning NULL. +#define MDFN_malloc_T(size, purpose) MDFN_malloc_real(true, size, purpose, __FILE__, __LINE__) +#define MDFN_calloc_T(nmemb, size, purpose) MDFN_calloc_real(true, nmemb, size, purpose, __FILE__, __LINE__) +#define MDFN_realloc_T(ptr, size, purpose) MDFN_realloc_real(true, ptr, size, purpose, __FILE__, __LINE__) + + +void *MDFN_malloc_real(bool dothrow, size_t size, const char *purpose, const char *_file, const int _line); +void *MDFN_calloc_real(bool dothrow, size_t nmemb, size_t size, const char *purpose, const char *_file, const int _line); +void *MDFN_realloc_real(bool dothrow, void *ptr, size_t size, const char *purpose, const char *_file, const int _line); +void MDFN_free(void *ptr); + +static INLINE void MDFN_FastU32MemsetM8(uint32 *array, uint32 value_32, unsigned int u32len) +{ + #ifdef ARCH_X86 + uint32 dummy_output0, dummy_output1; + + #ifdef __x86_64__ + asm volatile( + "cld\n\t" + "rep stosq\n\t" + : "=D" (dummy_output0), "=c" (dummy_output1) + : "a" (value_32 | ((uint64)value_32 << 32)), "D" (array), "c" (u32len >> 1) + : "cc", "memory"); + #else + asm volatile( + "cld\n\t" + "rep stosl\n\t" + : "=D" (dummy_output0), "=c" (dummy_output1) + : "a" (value_32), "D" (array), "c" (u32len) + : "cc", "memory"); + + #endif + + #else + for(uint32 *ai = array; MDFN_LIKELY(ai < array + u32len); ai += 2) + { + MDFN_ennsb(ai, value_32 | ((uint64)value_32 << 32)); + } + #endif +} + +void MDFN_FastMemXOR(void* dest, const void* src, size_t count); + +struct MDFN_TransientXOR +{ + INLINE MDFN_TransientXOR(void* dest, const void* src, size_t count) : ld(dest), ls(src), lc(count) + { + MDFN_FastMemXOR(ld, ls, lc); + } + + MDFN_TransientXOR(const MDFN_TransientXOR&) = delete; + const MDFN_TransientXOR& operator=(const MDFN_TransientXOR&) = delete; + + INLINE ~MDFN_TransientXOR() + { + if(ld && ls) + { + MDFN_FastMemXOR(ld, ls, lc); + + // To more easily catch problems in case something goes amiss. + ld = NULL; + ls = NULL; + } + } + + INLINE void release(void) + { + ld = NULL; + ls = NULL; + } + + private: + void* ld; + const void* ls; + const size_t lc; +}; + + +// memset() replacement that will work on uncachable memory. +//void *MDFN_memset_safe(void *s, int c, size_t n); + + +// +// WARNING: Only use PODFastVector with POD types, and take note that taking a pointer to an element, calling PODFastVector::resize(), and then dereferencing that +// pointer is liable to explode horribly on Tuesdays. +// +template +class PODFastVector +{ + public: + + INLINE PODFastVector() : data(NULL), data_size_ine(0) + { + + } + + INLINE PODFastVector(size_t new_size) : data(NULL), data_size_ine(0) + { + resize(new_size); + } + + INLINE ~PODFastVector() + { + if(data != NULL) + { + free(data); + data = NULL; + } + } + + INLINE T& operator[](size_t index) + { + return data[index]; + } + + INLINE const T& operator[](size_t index) const + { + return data[index]; + } + + INLINE void fill(const T value) + { + for(size_t i = 0; i < data_size_ine; i++) + data[i] = value; + } + + INLINE void resize(size_t new_size) + { + if(!new_size) + { + if(data != NULL) + { + free(data); + data = NULL; + data_size_ine = 0; + } + } + else + { + void* tmp = realloc(data, sizeof(T) * new_size); + + if(tmp == NULL) + { + throw MDFN_Error(ErrnoHolder(errno)); + } + + data = (T*)tmp; + data_size_ine = new_size; + } + } + + INLINE void clear(void) + { + resize(0); + } + + INLINE size_t size(void) const + { + return data_size_ine; + } + + private: + PODFastVector(const PODFastVector &); + PODFastVector & operator=(const PODFastVector &); + + T* data; + size_t data_size_ine; +}; + +#define _MDFN_MEMORY_H +#endif diff --git a/Mednafen/mednafen/mempatcher-driver.h b/Mednafen/mednafen/mempatcher-driver.h new file mode 100644 index 0000000000..9ddbd22c54 --- /dev/null +++ b/Mednafen/mednafen/mempatcher-driver.h @@ -0,0 +1,56 @@ +#ifndef __MDFN_MEMPATCHER_DRIVER_H +#define __MDFN_MEMPATCHER_DRIVER_H + +struct MemoryPatch +{ + MemoryPatch(); + ~MemoryPatch(); + + std::string name; + std::string conditions; + + uint32 addr; + uint64 val; + uint64 compare; + + uint32 mltpl_count; + uint32 mltpl_addr_inc; + uint64 mltpl_val_inc; + + uint32 copy_src_addr; + uint32 copy_src_addr_inc; + + unsigned length; + bool bigendian; + bool status; // (in)active + unsigned icount; + + char type; /* 'R' for replace, 'S' for substitute(GG), 'C' for substitute with compare */ + /* 'T' for copy/transfer data, 'A' for add(variant of type R) */ + + //enum { TypeReplace, TypeSubst, TypeCompSubst }; + //int type; +}; + + +int MDFNI_DecodePAR(const char *code, uint32 *a, uint8 *v, uint8 *c, char *type); + +void MDFNI_AddCheat(const MemoryPatch& patch); +void MDFNI_DelCheat(uint32 which); + +int MDFNI_ToggleCheat(uint32 which); + +int32 MDFNI_CheatSearchGetCount(void); +void MDFNI_CheatSearchGetRange(uint32 first, uint32 last, int (*callb)(uint32 a, uint8 last, uint8 current)); +void MDFNI_CheatSearchGet(int (*callb)(uint32 a, uint64 last, uint64 current, void *data), void *data); +void MDFNI_CheatSearchBegin(void); +void MDFNI_CheatSearchEnd(int type, uint64 v1, uint64 v2, unsigned int bytelen, bool bigendian); +void MDFNI_ListCheats(int (*callb)(const MemoryPatch& patch, void *data), void *data); + +MemoryPatch MDFNI_GetCheat(uint32 which); +void MDFNI_SetCheat(uint32 which, const MemoryPatch& patch); + +void MDFNI_CheatSearchShowExcluded(void); +void MDFNI_CheatSearchSetCurrentAsOriginal(void); + +#endif diff --git a/Mednafen/mednafen/mempatcher.cpp b/Mednafen/mednafen/mempatcher.cpp new file mode 100644 index 0000000000..a7e58cad1d --- /dev/null +++ b/Mednafen/mednafen/mempatcher.cpp @@ -0,0 +1,1047 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + The ugly kludges with the strcasecmp(MDFNGameInfo->shortname, "psx") are to work around the mess created by our + flawed game ID generation code(the PS1 game library is enormous, and many games only have one track, leading to many collisions); + TODO: a more permanent, system-agnostic solution to the problem. +*/ + +#include "mednafen.h" + +#include +#include +#include +#include +#include + +#include "general.h" +#include "string/trim.h" +#include +#include "mempatcher.h" +#include "FileStream.h" +#include "MemoryStream.h" + +MemoryPatch::MemoryPatch() : addr(0), val(0), compare(0), + mltpl_count(1), mltpl_addr_inc(0), mltpl_val_inc(0), copy_src_addr(0), copy_src_addr_inc(0), + length(0), bigendian(false), status(false), icount(0), type(0) +{ + +} + +MemoryPatch::~MemoryPatch() +{ + +} + +static uint8 **RAMPtrs = NULL; +static bool* RAMUseInSearch = NULL; +static uint32 PageSize; +static uint32 NumPages; + +typedef struct +{ + bool excluded; + uint8 value; +} CompareStruct; + +typedef MemoryPatch CHEATF; +#if 0 +typedef struct __CHEATF +{ + char *name; + char *conditions; + + uint32 addr; + uint64 val; + uint64 compare; + + unsigned int length; + bool bigendian; + unsigned int icount; // Instance count + char type; /* 'R' for replace, 'S' for substitute(GG), 'C' for substitute with compare */ + int status; +} CHEATF; +#endif + +static std::vector cheats; +static bool savecheats; +static CompareStruct **CheatComp = NULL; +static uint32 resultsbytelen = 1; +static bool resultsbigendian = 0; +static bool CheatsActive = TRUE; + +bool SubCheatsOn = 0; +std::vector SubCheats[8]; + +static void RebuildSubCheats(void) +{ + std::vector::iterator chit; + + SubCheatsOn = 0; + for(int x = 0; x < 8; x++) + SubCheats[x].clear(); + + if(!CheatsActive) return; + + for(chit = cheats.begin(); chit != cheats.end(); chit++) + { + if(chit->status && (chit->type == 'S' || chit->type == 'C')) + { + for(unsigned int x = 0; x < chit->length; x++) + { + SUBCHEAT tmpsub; + unsigned int shiftie; + + if(chit->bigendian) + shiftie = (chit->length - 1 - x) * 8; + else + shiftie = x * 8; + + tmpsub.addr = chit->addr + x; + tmpsub.value = (chit->val >> shiftie) & 0xFF; + if(chit->type == 'C') + tmpsub.compare = (chit->compare >> shiftie) & 0xFF; + else + tmpsub.compare = -1; + SubCheats[(chit->addr + x) & 0x7].push_back(tmpsub); + SubCheatsOn = 1; + } + } + } +} + +bool MDFNMP_Init(uint32 ps, uint32 numpages) +{ + PageSize = ps; + NumPages = numpages; + + RAMPtrs = (uint8 **)calloc(numpages, sizeof(uint8 *)); + RAMUseInSearch = (bool*)calloc(numpages, sizeof(bool)); + + CheatComp = (CompareStruct **)calloc(numpages, sizeof(CompareStruct *)); + + CheatsActive = MDFN_GetSettingB("cheats"); + return(1); +} + +void MDFNMP_Kill(void) +{ + if(CheatComp) + { + free(CheatComp); + CheatComp = NULL; + } + + if(RAMPtrs) + { + free(RAMPtrs); + RAMPtrs = NULL; + } + + if(RAMUseInSearch) + { + free(RAMUseInSearch); + RAMUseInSearch = NULL; + } +} + + +void MDFNMP_AddRAM(uint32 size, uint32 A, uint8 *RAM, bool use_in_search) +{ + //printf("%02x:%04x, %16llx, %d\n", A >> 16, A & 0xFFFF, (unsigned long long)RAM, use_in_search); + + uint32 AB = A / PageSize; + + size /= PageSize; + + for(unsigned int x = 0; x < size; x++) + { + RAMPtrs[AB + x] = RAM; + RAMUseInSearch[AB + x] = use_in_search; + + if(RAM) // Don't increment the RAM pointer if we're passed a NULL pointer + RAM += PageSize; + } +} + +void MDFNMP_InstallReadPatches(void) +{ + if(!CheatsActive) return; + + std::vector::iterator chit; + + for(unsigned int x = 0; x < 8; x++) + for(chit = SubCheats[x].begin(); chit != SubCheats[x].end(); chit++) + { + if(MDFNGameInfo->InstallReadPatch) + MDFNGameInfo->InstallReadPatch(chit->addr, chit->value, chit->compare); + } +} + +void MDFNMP_RemoveReadPatches(void) +{ + if(MDFNGameInfo->RemoveReadPatches) + MDFNGameInfo->RemoveReadPatches(); +} + +static bool SeekToOurSection(Stream* fp) // Tentacle monster section aisle five, stale eggs and donkeys in aisle 2E. +{ + std::string linebuf; + + linebuf.reserve(1024); + + while(fp->get_line(linebuf) >= 0) + { + if(linebuf.size() >= 1 && linebuf[0] == '[') + { + if(!strncmp(linebuf.c_str() + 1, md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str(), 32) && + (strcasecmp(MDFNGameInfo->shortname, "psx") || linebuf.size() < 36 || !MDFNGameInfo->name || linebuf[34] != ' ' || !strcmp(linebuf.c_str() + 35, MDFNGameInfo->name))) + return(true); + } + } + return(false); +} + +void MDFN_LoadGameCheats(Stream* override) +{ + Stream* fp = NULL; + int tc = 0; + std::string fn = MDFN_MakeFName(MDFNMKF_CHEAT,0,0); + + if(!override) + { + MDFN_printf("\n"); + MDFN_printf(_("Loading cheats from %s...\n"), fn.c_str()); + MDFN_indent(1); + } + + savecheats = false; + + //unsigned st = MDFND_GetTime(); + try + { + if(override) + fp = override; + else + fp = /*new MemoryStream(*/new FileStream(fn, FileStream::MODE_READ)/*)*/; + + if(SeekToOurSection(fp)) + { + std::string linebuf; + + linebuf.reserve(1024); + + while(fp->get_line(linebuf) >= 0) + { + std::string tbuf = linebuf; + std::string name; + std::string conditions; + bool ext_format = false; + unsigned int addr = 0; + unsigned long long val = 0; + unsigned int status = 0; + char type = 0; + unsigned long long compare = 0; + unsigned int length = 0; + unsigned int icount = 0; + bool bigendian = false; + + unsigned mltpl_count = 1; + unsigned mltpl_addr_inc = 0; + unsigned long long mltpl_val_inc = 0; + + unsigned copy_src_addr = 0; + unsigned copy_src_addr_inc = 0; + + if(tbuf.size() >= 1 && tbuf[0] == '[') // No more cheats for this game, so sad :( + break; + + MDFN_trim(tbuf); + + if(tbuf.size() >= 1 && tbuf[0] == '!') + { + ext_format = true; + tbuf = tbuf.substr(1); + MDFN_trim(tbuf); + } + + if(!tbuf.size()) // Don't parse if the line is empty. + continue; + + type = tbuf[0]; + + if(type != 'R' && type != 'C' && type != 'S' && type != 'T' && type != 'A') + throw MDFN_Error(0, _("Invalid cheat type: %c\n"), tbuf[0]); + + // + // + // + char status_tmp, endian_tmp; + int name_position = 0; + + if(type == 'C') + trio_sscanf(tbuf.c_str(), "%c %c %d %c %d %08x %16llx %16llx %n", &type, &status_tmp, &length, &endian_tmp, &icount, &addr, &val, &compare, &name_position); + else + { + if(ext_format) + trio_sscanf(tbuf.c_str(), "%c %c %d %c %d %08x %016llx %08x %08x %016llx %08x %08x %n", &type, &status_tmp, &length, &endian_tmp, &icount, &addr, &val, &mltpl_count, &mltpl_addr_inc, &mltpl_val_inc, ©_src_addr, ©_src_addr_inc, &name_position); + else + trio_sscanf(tbuf.c_str(), "%c %c %d %c %d %08x %16llx %n", &type, &status_tmp, &length, &endian_tmp, &icount, &addr, &val, &name_position); + } + + status = (status_tmp == 'A') ? 1 : 0; + bigendian = (endian_tmp == 'B') ? 1 : 0; + + // + // Grab the name. + // + name = linebuf.substr(name_position); + + for(unsigned i = 0; i < name.size(); i++) + if(name[i] < 0x20) + name[i] = ' '; + + MDFN_trim(name); + + // + // Grab the conditions. + // + if(fp->get_line(linebuf) >= 0) + { + conditions = linebuf; + + for(unsigned i = 0; i < conditions.size(); i++) + if(conditions[i] < 0x20) + conditions[i] = ' '; + + MDFN_trim(conditions); + } + + { + CHEATF temp; + + temp.name = name; + temp.conditions = conditions; + temp.addr = addr; + temp.val = val; + temp.status = status; + temp.compare = compare; + temp.length = length; + temp.bigendian = bigendian; + temp.type = type; + + temp.mltpl_count = mltpl_count; + temp.mltpl_addr_inc = mltpl_addr_inc; + temp.mltpl_val_inc = mltpl_val_inc; + + temp.copy_src_addr = copy_src_addr; + temp.copy_src_addr_inc = copy_src_addr_inc; + + cheats.push_back(temp); + } + tc++; + } + } + + RebuildSubCheats(); + + if(!override) + { + MDFN_printf(_("%lu cheats loaded.\n"), (unsigned long)cheats.size()); + MDFN_indent(-1); + delete fp; + fp = NULL; + } + } + catch(std::exception &e) + { + MDFN_printf("%s\n", e.what()); + MDFN_indent(-1); + + if(fp != NULL) + { + delete fp; + fp = NULL; + } + } + + //printf("%u\n", MDFND_GetTime() - st); +} + +static void WriteCheatsSection(Stream* tmp_fp, bool needheader) +{ + if(needheader) + tmp_fp->print_format("[%s] %s\n", md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str(), MDFNGameInfo->name ? (char *)MDFNGameInfo->name : ""); + + std::vector::iterator next; + + for(next = cheats.begin(); next != cheats.end(); next++) + { + if(next->type == 'C') + { + if(next->length == 1) + tmp_fp->print_format("%c %c %d %c %d %08x %02llx %02llx %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, (unsigned long long)next->compare, next->name.c_str()); + else if(next->length == 2) + tmp_fp->print_format("%c %c %d %c %d %08x %04llx %04llx %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, (unsigned long long)next->compare, next->name.c_str()); + else + tmp_fp->print_format("%c %c %d %c %d %08x %016llx %016llx %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, (unsigned long long)next->compare, next->name.c_str()); + } + else if(next->mltpl_count != 1 || next->mltpl_addr_inc != 0 || next->mltpl_val_inc != 0 || next->copy_src_addr != 0 || next->copy_src_addr_inc != 0) + { + tmp_fp->print_format("!%c %c %d %c %d %08x %016llx %08x %08x %016llx %08x %08x %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, next->mltpl_count, next->mltpl_addr_inc, (unsigned long long)next->mltpl_val_inc, next->copy_src_addr, next->copy_src_addr_inc, next->name.c_str()); + } + else + { + if(next->length == 1) + tmp_fp->print_format("%c %c %d %c %d %08x %02llx %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, next->name.c_str()); + else if(next->length == 2) + tmp_fp->print_format("%c %c %d %c %d %08x %04llx %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, next->name.c_str()); + else + tmp_fp->print_format("%c %c %d %c %d %08x %016llx %s\n", next->type, next->status ? 'A' : 'I', next->length, next->bigendian ? 'B' : 'L', next->icount, next->addr, (unsigned long long)next->val, next->name.c_str()); + } + tmp_fp->print_format("%s\n", next->conditions.c_str()); + } +} + +static void WriteCheats(void) +{ + std::string fn, tmp_fn; + FileStream *fp = NULL, *tmp_fp = NULL; + + fn = MDFN_MakeFName(MDFNMKF_CHEAT, 0, 0); + tmp_fn = MDFN_MakeFName(MDFNMKF_CHEAT_TMP, 0, 0); + + try + { + fp = new FileStream(fn.c_str(), FileStream::MODE_READ); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + + try + { + int insection = 0; // Can contain 0, 1, or 2. + std::string linebuf; + + tmp_fp = new FileStream(tmp_fn.c_str(), FileStream::MODE_WRITE); + + linebuf.reserve(1024); + + if(fp == NULL) + { + WriteCheatsSection(tmp_fp, true); + } + else + { + while(fp->get_line(linebuf) >= 0) + { + if(linebuf.size() >= 1 && linebuf[0] == '[' && !insection) + { + if(!strncmp((char *)linebuf.c_str() + 1, md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str(), 32) && + (strcasecmp(MDFNGameInfo->shortname, "psx") || linebuf.size() < 36 || !MDFNGameInfo->name || linebuf[34] != ' ' || !strcmp(linebuf.c_str() + 35, MDFNGameInfo->name))) + { + insection = 1; + + if(cheats.size()) + tmp_fp->put_line(linebuf); + } + else + tmp_fp->put_line(linebuf); + } + else if(insection == 1) + { + if(linebuf[0] == '[') + { + // Write any of our game cheats here. + WriteCheatsSection(tmp_fp, false); + insection = 2; + tmp_fp->put_line(linebuf); + } + } + else + { + tmp_fp->put_line(linebuf); + } + } + + if(cheats.size()) + { + if(!insection) + WriteCheatsSection(tmp_fp, 1); + else if(insection == 1) + WriteCheatsSection(tmp_fp, 0); + } + + fp->close(); + } + + tmp_fp->close(); + + if(rename(tmp_fn.c_str(), fn.c_str()) != 0 && errno == EACCES) // For Windows especially; see http://msdn.microsoft.com/en-us/library/zw5t957f.aspx + { + unlink(fn.c_str()); + rename(tmp_fn.c_str(), fn.c_str()); + } + } + catch(...) + { + if(fp != NULL) + { + delete fp; + fp = NULL; + } + + if(tmp_fp != NULL) + { + delete tmp_fp; + tmp_fp = NULL; + } + throw; + } + + if(fp != NULL) + { + delete fp; + fp = NULL; + } + + if(tmp_fp != NULL) + { + delete tmp_fp; + tmp_fp = NULL; + } +} + +void MDFN_FlushGameCheats(int nosave) +{ + if(CheatComp) + { + free(CheatComp); + CheatComp = 0; + } + + if(savecheats && !nosave) + { + try + { + WriteCheats(); + savecheats = false; + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + } + + cheats.clear(); + RebuildSubCheats(); +} + +void MDFNI_AddCheat(const MemoryPatch& patch) +{ + cheats.push_back(patch); + + savecheats = true; + + MDFNMP_RemoveReadPatches(); + RebuildSubCheats(); + MDFNMP_InstallReadPatches(); +} + +void MDFNI_DelCheat(uint32 which) +{ + cheats.erase(cheats.begin() + which); + + savecheats = true; + + MDFNMP_RemoveReadPatches(); + RebuildSubCheats(); + MDFNMP_InstallReadPatches(); +} + +/* + Condition format(ws = white space): + +
+ [,second condition...etc.] + + Value should be unsigned integer, hex(with a 0x prefix) or + base-10. + + Operations: + >= + <= + > + < + == + != + & // Result of AND between two values is nonzero + !& // Result of AND between two values is zero + ^ // same, XOR + !^ + | // same, OR + !| + + Full example: + + 2 L 0xADDE == 0xDEAD, 1 L 0xC000 == 0xA0 + +*/ + +static bool TestConditions(const char *string) +{ + char address[64]; + char operation[64]; + char value[64]; + char endian; + unsigned int bytelen; + bool passed = 1; + + while(trio_sscanf(string, "%u %c %63s %63s %63s", &bytelen, &endian, address, operation, value) == 5 && passed) + { + uint32 v_address; + uint64 v_value; + uint64 value_at_address; + + if(address[0] == '0' && address[1] == 'x') + v_address = strtoul(address + 2, NULL, 16); + else + v_address = strtoul(address, NULL, 10); + + if(value[0] == '0' && value[1] == 'x') + v_value = strtoull(value + 2, NULL, 16); + else + v_value = strtoull(value, NULL, 0); + + value_at_address = 0; + for(unsigned int x = 0; x < bytelen; x++) + { + unsigned int shiftie; + + if(endian == 'B') + shiftie = (bytelen - 1 - x) * 8; + else + shiftie = x * 8; + + if(MDFNGameInfo->MemRead != NULL) + value_at_address |= (uint64)MDFNGameInfo->MemRead(v_address + x) << shiftie; + else + { + uint32 page = ((v_address + x) / PageSize) % NumPages; + + if(RAMPtrs[page]) + value_at_address |= (uint64)RAMPtrs[page][(v_address + x) % PageSize] << shiftie; + } + } + + //printf("A: %08x, V: %08llx, VA: %08llx, OP: %s\n", v_address, v_value, value_at_address, operation); + if(!strcmp(operation, ">=")) + { + if(!(value_at_address >= v_value)) + passed = 0; + } + else if(!strcmp(operation, "<=")) + { + if(!(value_at_address <= v_value)) + passed = 0; + } + else if(!strcmp(operation, ">")) + { + if(!(value_at_address > v_value)) + passed = 0; + } + else if(!strcmp(operation, "<")) + { + if(!(value_at_address < v_value)) + passed = 0; + } + else if(!strcmp(operation, "==")) + { + if(!(value_at_address == v_value)) + passed = 0; + } + else if(!strcmp(operation, "!=")) + { + if(!(value_at_address != v_value)) + passed = 0; + } + else if(!strcmp(operation, "&")) + { + if(!(value_at_address & v_value)) + passed = 0; + } + else if(!strcmp(operation, "!&")) + { + if(value_at_address & v_value) + passed = 0; + } + else if(!strcmp(operation, "^")) + { + if(!(value_at_address ^ v_value)) + passed = 0; + } + else if(!strcmp(operation, "!^")) + { + if(value_at_address ^ v_value) + passed = 0; + } + else if(!strcmp(operation, "|")) + { + if(!(value_at_address | v_value)) + passed = 0; + } + else if(!strcmp(operation, "!|")) + { + if(value_at_address | v_value) + passed = 0; + } + else + puts("Invalid operation"); + string = strchr(string, ','); + if(string == NULL) + break; + else + string++; + //printf("Foo: %s\n", string); + } + + return(passed); +} + +void MDFNMP_ApplyPeriodicCheats(void) +{ + std::vector::iterator chit; + + + if(!CheatsActive) + return; + + //TestConditions("2 L 0x1F00F5 == 0xDEAD"); + //if(TestConditions("1 L 0x1F0058 > 0")) //, 1 L 0xC000 == 0x01")); + for(chit = cheats.begin(); chit != cheats.end(); chit++) + { + if(chit->status && (chit->type == 'R' || chit->type == 'A' || chit->type == 'T')) + { + if(chit->conditions.size() == 0 || TestConditions(chit->conditions.c_str())) + { + uint32 mltpl_count = chit->mltpl_count; + uint32 mltpl_addr = chit->addr; + uint64 mltpl_val = chit->val; + uint32 copy_src_addr = chit->copy_src_addr; + + while(mltpl_count--) + { + uint8 carry = 0; + + for(unsigned int x = 0; x < chit->length; x++) + { + const uint32 tmpaddr = chit->bigendian ? (mltpl_addr + chit->length - 1 - x) : (mltpl_addr + x); + const uint32 page = (tmpaddr / PageSize) % NumPages; + const uint8 tmpval = mltpl_val >> (x * 8); + + if(RAMPtrs[page]) + { + if(chit->type == 'A') + { + unsigned t = RAMPtrs[page][tmpaddr % PageSize] + tmpval + carry; + + carry = t >> 8; + + RAMPtrs[page][tmpaddr % PageSize] = t; + } + else if(chit->type == 'T') + { + const uint32 tmpsrcaddr = chit->bigendian ? (copy_src_addr + chit->length - 1 - x) : (copy_src_addr + x); + const uint32 srcpage = (tmpsrcaddr / PageSize) % NumPages; + uint8 cv = 0; + + if(RAMPtrs[srcpage]) + cv = RAMPtrs[srcpage][tmpsrcaddr % PageSize]; + + RAMPtrs[page][tmpaddr % PageSize] = cv; + } + else + RAMPtrs[page][tmpaddr % PageSize] = tmpval; + } + } + mltpl_addr += chit->mltpl_addr_inc; + mltpl_val += chit->mltpl_val_inc; + copy_src_addr += chit->copy_src_addr_inc; + } + + } // end if(chit->conditions.size() == 0 || TestConditions(chit->conditions.c_str())) + } + } +} + + +void MDFNI_ListCheats(int (*callb)(const MemoryPatch& patch, void *data), void *data) +{ + std::vector::iterator chit; + + for(chit = cheats.begin(); chit != cheats.end(); chit++) + { + if(!callb(*chit, data)) + break; + } +} + +MemoryPatch MDFNI_GetCheat(uint32 which) +{ + return cheats[which]; +} + +void MDFNI_SetCheat(uint32 which, const MemoryPatch& patch) +{ + cheats[which] = patch; + + savecheats = true; + + MDFNMP_RemoveReadPatches(); + RebuildSubCheats(); + MDFNMP_InstallReadPatches(); +} + +/* Convenience function. */ +int MDFNI_ToggleCheat(uint32 which) +{ + cheats[which].status = !cheats[which].status; + + savecheats = true; + + MDFNMP_RemoveReadPatches(); + RebuildSubCheats(); + MDFNMP_InstallReadPatches(); + + return(cheats[which].status); +} + +void MDFNI_CheatSearchSetCurrentAsOriginal(void) +{ + for(uint32 page = 0; page < NumPages; page++) + { + if(CheatComp[page]) + { + for(uint32 addr = 0; addr < PageSize; addr++) + { + // Don't check for .excluded here, or we'll break multi-byte iterative cheat searching! + CheatComp[page][addr].value = RAMPtrs[page][addr]; + } + } + } +} + +void MDFNI_CheatSearchShowExcluded(void) +{ + for(uint32 page = 0; page < NumPages; page++) + { + if(CheatComp[page]) + { + for(uint32 addr = 0; addr < PageSize; addr++) + { + CheatComp[page][addr].excluded = 0; + } + } + } +} + + +int32 MDFNI_CheatSearchGetCount(void) +{ + uint32 count = 0; + + for(uint32 page = 0; page < NumPages; page++) + { + if(CheatComp[page]) + { + for(uint32 addr = 0; addr < PageSize; addr++) + { + if(!CheatComp[page][addr].excluded) + count++; + } + } + } + return count; +} + +/* This function will give the initial value of the search and the current value at a location. */ + +void MDFNI_CheatSearchGet(int (*callb)(uint32 a, uint64 last, uint64 current, void *data), void *data) +{ + for(uint32 page = 0; page < NumPages; page++) + { + if(CheatComp[page]) + { + for(uint32 addr = 0; addr < PageSize; addr++) + { + if(!CheatComp[page][addr].excluded) + { + uint64 ccval; + uint64 ramval; + + ccval = ramval = 0; + for(unsigned int x = 0; x < resultsbytelen; x++) + { + uint32 curpage = (page + (addr + x) / PageSize) % NumPages; + if(CheatComp[curpage]) + { + unsigned int shiftie; + + if(resultsbigendian) + shiftie = (resultsbytelen - 1 - x) * 8; + else + shiftie = x * 8; + ccval |= (uint64)CheatComp[curpage][(addr + x) % PageSize].value << shiftie; + ramval |= (uint64)RAMPtrs[curpage][(addr + x) % PageSize] << shiftie; + } + } + + if(!callb(page * PageSize + addr, ccval, ramval, data)) + return; + } + } + } + } +} + +void MDFNI_CheatSearchBegin(void) +{ + resultsbytelen = 1; + resultsbigendian = 0; + + for(uint32 page = 0; page < NumPages; page++) + { + if(RAMUseInSearch[page] && RAMPtrs[page]) + { + if(!CheatComp[page]) + CheatComp[page] = (CompareStruct *)calloc(PageSize, sizeof(CompareStruct)); + + for(uint32 addr = 0; addr < PageSize; addr++) + { + CheatComp[page][addr].excluded = 0; + CheatComp[page][addr].value = RAMPtrs[page][addr]; + } + } + } +} + + +static uint64 INLINE CAbs(uint64 x) +{ + if(x < 0) + return(0 - x); + return x; +} + +void MDFNI_CheatSearchEnd(int type, uint64 v1, uint64 v2, unsigned int bytelen, bool bigendian) +{ + v1 &= (~0ULL) >> (8 - bytelen); + v2 &= (~0ULL) >> (8 - bytelen); + + resultsbytelen = bytelen; + resultsbigendian = bigendian; + + for(uint32 page = 0; page < NumPages; page++) + { + if(CheatComp[page]) + { + for(uint32 addr = 0; addr < PageSize; addr++) + { + if(!CheatComp[page][addr].excluded) + { + bool doexclude = 0; + uint64 ccval; + uint64 ramval; + + ccval = ramval = 0; + for(unsigned int x = 0; x < bytelen; x++) + { + uint32 curpage = (page + (addr + x) / PageSize) % NumPages; + if(CheatComp[curpage]) + { + unsigned int shiftie; + + if(bigendian) + shiftie = (bytelen - 1 - x) * 8; + else + shiftie = x * 8; + ccval |= (uint64)CheatComp[curpage][(addr + x) % PageSize].value << shiftie; + ramval |= (uint64)RAMPtrs[curpage][(addr + x) % PageSize] << shiftie; + } + } + + switch(type) + { + case 0: // Change to a specific value. + if(!(ccval == v1 && ramval == v2)) + doexclude = 1; + break; + + case 1: // Search for relative change(between values). + if(!(ccval == v1 && CAbs(ccval - ramval) == v2)) + doexclude = 1; + break; + + case 2: // Purely relative change. + if(!(CAbs(ccval - ramval) == v2)) + doexclude = 1; + break; + case 3: // Any change + if(!(ccval != ramval)) + doexclude = 1; + break; + case 4: // Value decreased + if(ramval >= ccval) + doexclude = 1; + break; + case 5: // Value increased + if(ramval <= ccval) + doexclude = 1; + break; + } + if(doexclude) + CheatComp[page][addr].excluded = TRUE; + } + } + } + } + + if(type >= 4) + MDFNI_CheatSearchSetCurrentAsOriginal(); +} + +static void SettingChanged(const char *name) +{ + MDFNMP_RemoveReadPatches(); + + CheatsActive = MDFN_GetSettingB("cheats"); + + RebuildSubCheats(); + + MDFNMP_InstallReadPatches(); +} + + +MDFNSetting MDFNMP_Settings[] = +{ + { "cheats", MDFNSF_NOFLAGS, "Enable cheats.", NULL, MDFNST_BOOL, "1", NULL, NULL, NULL, SettingChanged }, + { NULL} +}; diff --git a/Mednafen/mednafen/mempatcher.h b/Mednafen/mednafen/mempatcher.h new file mode 100644 index 0000000000..a67745414c --- /dev/null +++ b/Mednafen/mednafen/mempatcher.h @@ -0,0 +1,32 @@ +#ifndef __MDFN_MEMPATCHER_H +#define __MDFN_MEMPATCHER_H + +#include "mempatcher-driver.h" +#include "Stream.h" +#include + +// Substitution cheat/patch stuff +struct SUBCHEAT +{ + uint32 addr; + uint8 value; + int compare; // < 0 on no compare +}; + +extern std::vector SubCheats[8]; +extern bool SubCheatsOn; + + +bool MDFNMP_Init(uint32 ps, uint32 numpages); +void MDFNMP_AddRAM(uint32 size, uint32 address, uint8 *RAM, bool use_in_search = true); +void MDFNMP_Kill(void); + +void MDFN_LoadGameCheats(Stream* override = NULL); +void MDFNMP_InstallReadPatches(void); +void MDFNMP_RemoveReadPatches(void); + +void MDFNMP_ApplyPeriodicCheats(void); + +extern MDFNSetting MDFNMP_Settings[]; + +#endif diff --git a/Mednafen/mednafen/movie-driver.h b/Mednafen/mednafen/movie-driver.h new file mode 100644 index 0000000000..dcb619369a --- /dev/null +++ b/Mednafen/mednafen/movie-driver.h @@ -0,0 +1,6 @@ + +void MDFNI_SelectMovie(int); + +void MDFNI_SaveMovie(char *fname, const MDFN_Surface *surface, const MDFN_Rect *DisplayRect, const int32 *LineWidths); +void MDFNI_LoadMovie(char *fname); + diff --git a/Mednafen/mednafen/movie.cpp b/Mednafen/mednafen/movie.cpp new file mode 100644 index 0000000000..33417f99fe --- /dev/null +++ b/Mednafen/mednafen/movie.cpp @@ -0,0 +1,369 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" + +#include +#include +#include +#include +#include + +#include "driver.h" +#include "state.h" +#include "general.h" +#include "video.h" +#include "netplay.h" +#include "movie.h" +#include "state.h" + +#include "FileStream.h" + +enum +{ + MOVIE_STOPPED = 0, + MOVIE_PLAYING = 1, + MOVIE_RECORDING = 2 +}; + +static unsigned ActiveMovieMode = MOVIE_STOPPED; +static int ActiveSlotNumber; // Negative for no slot in use/fname specified directly. +static FileStream* ActiveMovieStream = NULL; + +static int CurrentMovie = 0; +static int RecentlySavedMovie = -1; +static int MovieStatus[10]; + +static void HandleMovieError(const std::exception &e) +{ + if(ActiveMovieStream) + { + delete ActiveMovieStream; + ActiveMovieStream = NULL; + } + + if(ActiveSlotNumber >= 0) + { + MovieStatus[ActiveSlotNumber] = 0; + + if(ActiveMovieMode == MOVIE_PLAYING) + MDFN_DispMessage(_("Movie %u playback failed."), ActiveSlotNumber); + else + MDFN_DispMessage(_("Movie %u recording failed."), ActiveSlotNumber); + } + + MDFN_PrintError(_("Movie error: %s"), e.what()); + ActiveMovieMode = MOVIE_STOPPED; + ActiveSlotNumber = -1; +} + +bool MDFNMOV_IsPlaying(void) noexcept +{ + return(ActiveMovieMode == MOVIE_PLAYING); +} + +bool MDFNMOV_IsRecording(void) noexcept +{ + return(ActiveMovieMode == MOVIE_RECORDING); +} + +void MDFNI_SaveMovie(char *fname, const MDFN_Surface *surface, const MDFN_Rect *DisplayRect, const int32 *LineWidths) +{ + try + { + if(!MDFNGameInfo->StateAction) + { + throw MDFN_Error(0, _("Module \"%s\" doesn't support save states."), MDFNGameInfo->shortname); + } + + if(MDFNnetplay && (MDFNGameInfo->SaveStateAltersState == true)) + { + throw MDFN_Error(0, _("Module %s is not compatible with manual movie save starting/stopping during netplay."), MDFNGameInfo->shortname); + } + + if(ActiveMovieMode == MOVIE_PLAYING) /* Can't interrupt playback.*/ + { + throw MDFN_Error(0, _("Can't record movie during movie playback.")); + } + + if(ActiveMovieMode == MOVIE_RECORDING) /* Stop saving. */ + { + MDFNMOV_Stop(); + return; + } + + ActiveMovieMode = MOVIE_RECORDING; + ActiveSlotNumber = fname ? -1 : CurrentMovie; + + ActiveMovieStream = new FileStream(fname ? std::string(fname) : MDFN_MakeFName(MDFNMKF_MOVIE, CurrentMovie, 0), FileStream::MODE_WRITE); + + // + // Save save state first. + // + MDFNSS_SaveSM(ActiveMovieStream, false, surface, DisplayRect, LineWidths); + ActiveMovieStream->flush(); // Flush output so that previews will still work right while + // the movie is being recorded. + + MDFN_DispMessage(_("Movie recording started.")); + MovieStatus[ActiveSlotNumber] = 1; + RecentlySavedMovie = ActiveSlotNumber; + } + catch(std::exception &e) + { + HandleMovieError(e); + } +} + +void MDFNMOV_Stop(void) noexcept +{ + const unsigned PAMM = ActiveMovieMode; + + if(ActiveMovieMode != MOVIE_STOPPED) + { + if(ActiveMovieMode == MOVIE_RECORDING) + { + MDFNMOV_RecordState(); + //MovieStatus[current - 1] = 1; + //RecentlySavedMovie = current - 1; + } + + if(ActiveMovieStream) + { + delete ActiveMovieStream; + ActiveMovieStream = NULL; + } + + ActiveMovieMode = MOVIE_STOPPED; + ActiveSlotNumber = -1; + + if(PAMM == MOVIE_PLAYING) + MDFN_DispMessage(_("Movie playback stopped.")); + else if(PAMM == MOVIE_RECORDING) + MDFN_DispMessage(_("Movie recording stopped.")); + } +} + +void MDFNI_LoadMovie(char *fname) +{ + try + { + if(!MDFNGameInfo->StateAction) + { + throw MDFN_Error(0, _("Module \"%s\" doesn't support save states."), MDFNGameInfo->shortname); + } + + if(MDFNnetplay) + { + throw MDFN_Error(0, _("Can't play movies during netplay.")); + } + + if(ActiveMovieMode == MOVIE_RECORDING) /* Can't interrupt recording. */ + { + throw MDFN_Error(0, _("Can't play movie during movie recording.")); + } + + if(ActiveMovieMode == MOVIE_PLAYING) /* Stop playback. */ + { + MDFNMOV_Stop(); + return; + } + + ActiveMovieMode = MOVIE_PLAYING; + + if(fname) + ActiveSlotNumber = -1; + else + { + ActiveSlotNumber = CurrentMovie; + MovieStatus[CurrentMovie] = 1; + } + + ActiveMovieStream = new FileStream(fname ? std::string(fname) : MDFN_MakeFName(MDFNMKF_MOVIE, CurrentMovie, 0), FileStream::MODE_READ); + + // + // + // + MDFNSS_LoadSM(ActiveMovieStream, false); + + MDFN_DispMessage(_("Movie playback started.")); + } + catch(std::exception &e) + { + HandleMovieError(e); + } +} + +void MDFNMOV_ProcessInput(uint8 *PortData[], uint32 PortLen[], int NumPorts) noexcept +{ + try + { + if(ActiveMovieMode == MOVIE_STOPPED) + return; /* Not playback nor recording. */ + + if(ActiveMovieMode == MOVIE_PLAYING) /* Playback */ + { + int t; + + while((t = ActiveMovieStream->get_char()) >= 0 && t) + { + if(t == MDFNNPCMD_LOADSTATE) + MDFNSS_LoadSM(ActiveMovieStream, false); + else if(t == MDFNNPCMD_SET_MEDIA) + { + uint8 buf[4 * 4]; + ActiveMovieStream->read(buf, sizeof(buf)); + MDFN_UntrustedSetMedia(MDFN_de32lsb(&buf[0]), MDFN_de32lsb(&buf[4]), MDFN_de32lsb(&buf[8]), MDFN_de32lsb(&buf[12])); + } + else + MDFN_DoSimpleCommand(t); + } + + if(t < 0) // EOF + { + MDFNMOV_Stop(); + return; + } + + for(int p = 0; p < NumPorts; p++) + { + if(PortData[p]) + ActiveMovieStream->read(PortData[p], PortLen[p]); + } + } + else /* Recording */ + { + ActiveMovieStream->put_u8(0); + + for(int p = 0; p < NumPorts; p++) + { + if(PortData[p]) + ActiveMovieStream->write(PortData[p], PortLen[p]); + } + } + } + catch(std::exception &e) + { + HandleMovieError(e); + } +} + +void MDFNMOV_AddCommand(uint8 cmd, uint32 data_len, uint8* data) noexcept +{ + // Return if not recording a movie + if(ActiveMovieMode != MOVIE_RECORDING) + return; + + try + { + ActiveMovieStream->put_u8(cmd); + + if(data_len > 0) + ActiveMovieStream->write(data, data_len); + } + catch(std::exception &e) + { + HandleMovieError(e); + } +} + +void MDFNMOV_RecordState(void) noexcept +{ + try + { + ActiveMovieStream->put_u8(MDFNNPCMD_LOADSTATE); + MDFNSS_SaveSM(ActiveMovieStream, false); + } + catch(std::exception &e) + { + HandleMovieError(e); + } +} + +void MDFNMOV_StateAction(StateMem* sm, const unsigned load) +{ + if(!ActiveMovieStream) + return; + + uint64 fpos = ActiveMovieStream->tell(); + SFORMAT StateRegs[] = + { + SFVAR(fpos), + SFEND + }; + + MDFNSS_StateAction(sm, load, true, StateRegs, "MEDNAFEN_MOVIE"); + + if(load) + { + ActiveMovieStream->seek(fpos, SEEK_SET); + + if(ActiveMovieMode == MOVIE_RECORDING) + ActiveMovieStream->truncate(fpos); + } +} + +void MDFNMOV_CheckMovies(void) +{ + time_t last_time = 0; + + for(int ssel = 0; ssel < 10; ssel++) + { + struct stat stat_buf; + + MovieStatus[ssel] = 0; + if(stat(MDFN_MakeFName(MDFNMKF_MOVIE, ssel, 0).c_str(), &stat_buf) == 0) + { + MovieStatus[ssel] = 1; + if(stat_buf.st_mtime > last_time) + { + RecentlySavedMovie = ssel; + last_time = stat_buf.st_mtime; + } + } + } + CurrentMovie = 0; +} + +void MDFNI_SelectMovie(int w) +{ + StateStatusStruct *status = NULL; + + if(w == -1) + { + return; + } + MDFNI_SelectState(-1); + + CurrentMovie = w; + MDFN_ResetMessages(); + + status = (StateStatusStruct*)MDFN_calloc(1, sizeof(StateStatusStruct), _("Movie status")); + + memcpy(status->status, MovieStatus, 10 * sizeof(int)); + status->current = CurrentMovie; + status->current_movie = 0; + if(ActiveMovieMode == MOVIE_RECORDING) + status->current_movie = 1 + ActiveSlotNumber; + else if(ActiveMovieMode == MOVIE_PLAYING) + status->current_movie = -1 - ActiveSlotNumber; + + status->recently_saved = RecentlySavedMovie; + + MDFNSS_GetStateInfo(MDFN_MakeFName(MDFNMKF_MOVIE,CurrentMovie,NULL).c_str(), status); + MDFND_SetMovieStatus(status); +} + diff --git a/Mednafen/mednafen/movie.h b/Mednafen/mednafen/movie.h new file mode 100644 index 0000000000..d169acbdfe --- /dev/null +++ b/Mednafen/mednafen/movie.h @@ -0,0 +1,21 @@ +#ifndef __MDFN_MOVIE_H +#define __MDFN_MOVIE_H + +class MemoryStream; + +#include "movie-driver.h" +#include "state.h" + +void MDFNMOV_ProcessInput(uint8 *PortData[], uint32 PortLen[], int NumPorts) noexcept; +void MDFNMOV_Stop(void) noexcept; +void MDFNMOV_AddCommand(uint8 cmd, uint32 data_len = 0, uint8* data = NULL) noexcept; +bool MDFNMOV_IsPlaying(void) noexcept; +bool MDFNMOV_IsRecording(void) noexcept; +void MDFNMOV_RecordState(void) noexcept; + +// For state rewinding only. +void MDFNMOV_StateAction(StateMem* sm, const unsigned load); + +void MDFNI_SelectMovie(int); +void MDFNMOV_CheckMovies(void); +#endif diff --git a/Mednafen/mednafen/mpcdec/!VERSION b/Mednafen/mednafen/mpcdec/!VERSION new file mode 100644 index 0000000000..20d8bf2631 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/!VERSION @@ -0,0 +1,19 @@ +http://svn.musepack.net/libmpc/trunk/ + +libmpcdec from r484 + +perl -p -i -e "s/include ]*)>/include \"\1\"/" *.c *.h + +Added + +#ifdef HAVE_CONFIG_H +#include +#endif + +to: + +mpc_types.h + + + +Renamed "log2" LUT in mpc_bits_reader.c to "log2_tab" diff --git a/Mednafen/mednafen/mpcdec/AUTHORS b/Mednafen/mednafen/mpcdec/AUTHORS new file mode 100644 index 0000000000..1bcac63765 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/AUTHORS @@ -0,0 +1,10 @@ +libmpcdec is the result of the work of many people: + +* Andree Buschmann and Frank Klemm + Original implementation and core development. + +* Peter Pawlowski and Benoit Amiaux + Portability and further optimizations. + +* Miles Egan + Port to pure C, documentation, and api refinements. diff --git a/Mednafen/mednafen/mpcdec/CMakeLists.txt b/Mednafen/mednafen/mpcdec/CMakeLists.txt new file mode 100644 index 0000000000..5579d55f5d --- /dev/null +++ b/Mednafen/mednafen/mpcdec/CMakeLists.txt @@ -0,0 +1,23 @@ +SET(mpcdec_VERSION_MAJOR 7) +SET(mpcdec_VERSION_MINOR 0) +SET(mpcdec_VERSION_PATCH 1) + +set(mpcdec_VERSION ${mpcdec_VERSION_MAJOR}.${mpcdec_VERSION_MINOR}.${mpcdec_VERSION_PATCH}) + +include_directories(${libmpc_SOURCE_DIR}/include) +install(FILES + ${libmpc_SOURCE_DIR}/include/mpc/mpcdec.h + ${libmpc_SOURCE_DIR}/include/mpc/reader.h + ${libmpc_SOURCE_DIR}/include/mpc/streaminfo.h + ${libmpc_SOURCE_DIR}/include/mpc/mpc_types.h + DESTINATION include/mpc COMPONENT headers) + +if(SHARED) + add_library(mpcdec SHARED huffman mpc_decoder mpc_reader streaminfo mpc_bits_reader mpc_demux requant synth_filter ${libmpc_SOURCE_DIR}/common/crc32) + set_target_properties(mpcdec PROPERTIES VERSION ${mpcdec_VERSION} SOVERSION ${mpcdec_VERSION_MAJOR}) + install(TARGETS mpcdec LIBRARY DESTINATION "lib" COMPONENT libraries) +else(SHARED) + add_library(mpcdec_static STATIC huffman mpc_decoder mpc_reader streaminfo mpc_bits_reader mpc_demux requant synth_filter ${libmpc_SOURCE_DIR}/common/crc32) + install(TARGETS mpcdec_static ARCHIVE DESTINATION "lib/static" COMPONENT libraries) +endif(SHARED) + diff --git a/Mednafen/mednafen/mpcdec/COPYING b/Mednafen/mednafen/mpcdec/COPYING new file mode 100644 index 0000000000..10190c014a --- /dev/null +++ b/Mednafen/mednafen/mpcdec/COPYING @@ -0,0 +1,31 @@ +Copyright (c) 2005, The Musepack Development Team +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Mednafen/mednafen/mpcdec/ChangeLog b/Mednafen/mednafen/mpcdec/ChangeLog new file mode 100644 index 0000000000..6c998480bd --- /dev/null +++ b/Mednafen/mednafen/mpcdec/ChangeLog @@ -0,0 +1,40 @@ +1.3.0 + * first sv8 release + * major changes in the API (decoder and demuxer are split) + +1.2.3 + * Reduced memory usage and code size. Patch by Peter Pawlowski + +1.2.2 + * Fixed compilation under OpenBSD + * Unix EOF again + +1.2.1 + * Warnings cleanup, patch by Tomas Salfischberger, Thom Johansen and + Daniel Stenberg (Rockbox) + * Mplayer interface, patch by Reimar Doffinger + * Unix EOF everywhere + +1.2 + * 1.1.1 broke the API (BOOL type changed to mpc_bool_t). Version bumped to 1.2 to reflect the major change. Sorry to those who were caught by this error + * Fixed relative/absolute includes (#include "stuff.h" in /include/mpcdec, #include in src/) + * Added msvc project files + * Changed mpc_reader_t structure, any specific data of the reader's + implementations should be hidden behind the (void*) data pointer. (example + in default implementation mpc_reader_file) + * Renamed to libmpcdec (to make room for libmpcenc) + +1.1.1 + * fix for fixed-point mode bug + +1.1 + * add compliance & cleanup patches from Michael Roitzsch of xine project + * switch to BSD license + * port to pure C + * add doxygen documentation + * revise API somewhat + +1.0.3 + * autotools build process + * sample binary added + * floating-point mode by default diff --git a/Mednafen/mednafen/mpcdec/Makefile.am b/Mednafen/mednafen/mpcdec/Makefile.am new file mode 100644 index 0000000000..e06f72f8bc --- /dev/null +++ b/Mednafen/mednafen/mpcdec/Makefile.am @@ -0,0 +1,7 @@ +DEFS = @DEFS@ @CFLAG_VISIBILITY@ -DMPC_FIXED_POINT=1 + +noinst_LIBRARIES = libmpcdec.a + +libmpcdec_a_SOURCES = huffman.c mpc_decoder.c mpc_reader.c \ + requant.c streaminfo.c synth_filter.c mpc_bits_reader.c mpc_demux.c \ + crc32.c diff --git a/Mednafen/mednafen/mpcdec/Makefile.in b/Mednafen/mednafen/mpcdec/Makefile.in new file mode 100644 index 0000000000..fe39e6eb01 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/Makefile.in @@ -0,0 +1,687 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/mpcdec +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp AUTHORS \ + COPYING ChangeLog README +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmpcdec_a_AR = $(AR) $(ARFLAGS) +libmpcdec_a_LIBADD = +am_libmpcdec_a_OBJECTS = huffman.$(OBJEXT) mpc_decoder.$(OBJEXT) \ + mpc_reader.$(OBJEXT) requant.$(OBJEXT) streaminfo.$(OBJEXT) \ + synth_filter.$(OBJEXT) mpc_bits_reader.$(OBJEXT) \ + mpc_demux.$(OBJEXT) crc32.$(OBJEXT) +libmpcdec_a_OBJECTS = $(am_libmpcdec_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libmpcdec_a_SOURCES) +DIST_SOURCES = $(libmpcdec_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ @CFLAG_VISIBILITY@ -DMPC_FIXED_POINT=1 +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_LIBRARIES = libmpcdec.a +libmpcdec_a_SOURCES = huffman.c mpc_decoder.c mpc_reader.c \ + requant.c streaminfo.c synth_filter.c mpc_bits_reader.c mpc_demux.c \ + crc32.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/mpcdec/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/mpcdec/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libmpcdec.a: $(libmpcdec_a_OBJECTS) $(libmpcdec_a_DEPENDENCIES) $(EXTRA_libmpcdec_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmpcdec.a + $(AM_V_AR)$(libmpcdec_a_AR) libmpcdec.a $(libmpcdec_a_OBJECTS) $(libmpcdec_a_LIBADD) + $(AM_V_at)$(RANLIB) libmpcdec.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huffman.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpc_bits_reader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpc_decoder.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpc_demux.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpc_reader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/requant.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/streaminfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synth_filter.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/mpcdec/README b/Mednafen/mednafen/mpcdec/README new file mode 100644 index 0000000000..cb4657c7f1 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/README @@ -0,0 +1,6 @@ +Musepack Decoder Library: + +run "./configure [--prefix=/usr]; make" + +To create a sample app using the musepack decoder library +Check ../mpcdec/mpcdec.c and ../include/mpc/mpcdec.h for more details. diff --git a/Mednafen/mednafen/mpcdec/crc32.c b/Mednafen/mednafen/mpcdec/crc32.c new file mode 100644 index 0000000000..2e9cc119eb --- /dev/null +++ b/Mednafen/mednafen/mpcdec/crc32.c @@ -0,0 +1,56 @@ +/* +* C Implementation: crc32 +* +* code from http://www.w3.org/TR/PNG/#D-CRCAppendix +* +*/ + +/* Table of CRCs of all 8-bit messages. */ +static unsigned long crc_table[256]; + +/* Flag: has the table been computed? Initially false. */ +static int crc_table_computed = 0; + +/* Make the table for a fast CRC. */ +static void make_crc_table(void) +{ + unsigned long c; + int n, k; + + for (n = 0; n < 256; n++) { + c = (unsigned long) n; + for (k = 0; k < 8; k++) { + if (c & 1) + c = 0xedb88320L ^ (c >> 1); + else + c = c >> 1; + } + crc_table[n] = c; + } + crc_table_computed = 1; +} + + +/* Update a running CRC with the bytes buf[0..len-1]--the CRC + should be initialized to all 1's, and the transmitted value + is the 1's complement of the final running CRC (see the + crc() routine below). */ + +static unsigned long update_crc(unsigned long crc, unsigned char *buf, int len) +{ + unsigned long c = crc; + int n; + + if (!crc_table_computed) + make_crc_table(); + for (n = 0; n < len; n++) { + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c; +} + +/* Return the CRC of the bytes buf[0..len-1]. */ +unsigned long mpc_crc32(unsigned char *buf, int len) +{ + return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL; +} diff --git a/Mednafen/mednafen/mpcdec/datatypes.h b/Mednafen/mednafen/mpcdec/datatypes.h new file mode 100644 index 0000000000..7e6c5fc671 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/datatypes.h @@ -0,0 +1,37 @@ +/* + * Musepack audio compression + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see + */ + +#pragma once + +// mpcenc.h +#define CENTER 448 // offset for centering current data in Main-array +#define BLOCK 1152 // blocksize +#define ANABUFFER (BLOCK + CENTER) // size of PCM-data array for analysis + + +typedef struct { + float L [36]; + float R [36]; +} SubbandFloatTyp; + +typedef struct { + float L [ANABUFFER]; + float R [ANABUFFER]; + float M [ANABUFFER]; + float S [ANABUFFER]; +} PCMDataTyp; + diff --git a/Mednafen/mednafen/mpcdec/decoder.h b/Mednafen/mednafen/mpcdec/decoder.h new file mode 100644 index 0000000000..a6fe441d5a --- /dev/null +++ b/Mednafen/mednafen/mpcdec/decoder.h @@ -0,0 +1,101 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file decoder.h +#ifndef _MPCDEC_DECODER_H_ +#define _MPCDEC_DECODER_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "reader.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define SEEKING_TABLE_SIZE 256u +// set it to SLOW_SEEKING_WINDOW to not use fast seeking +#define FAST_SEEKING_WINDOW 32 +// set it to FAST_SEEKING_WINDOW to only use fast seeking +#define SLOW_SEEKING_WINDOW 0x80000000 + +enum { + MPC_V_MEM = 2304, + MPC_DECODER_MEMSIZE = 16384, // overall buffer size +}; + +struct mpc_decoder_t { + /// @name internal state variables + //@{ + mpc_uint32_t stream_version; ///< Streamversion of stream + mpc_int32_t max_band; ///< Maximum band-index used in stream (0...31) + mpc_uint32_t ms; ///< Mid/side stereo (0: off, 1: on) + mpc_uint32_t channels; ///< Number of channels in stream + + mpc_uint64_t samples; ///< Number of samples in stream + + mpc_uint64_t decoded_samples; ///< Number of samples decoded from file begining + mpc_uint32_t samples_to_skip; ///< Number samples to skip (used for seeking) + mpc_int32_t last_max_band; ///< number of bands used in the last frame + + // randomizer state variables + mpc_uint32_t __r1; + mpc_uint32_t __r2; + + mpc_int32_t SCF_Index_L [32] [3]; + mpc_int32_t SCF_Index_R [32] [3]; // holds scalefactor-indices + mpc_quantizer Q [32]; // holds quantized samples + mpc_int32_t Res_L [32]; + mpc_int32_t Res_R [32]; // holds the chosen quantizer for each subband + mpc_bool_t DSCF_Flag_L [32]; + mpc_bool_t DSCF_Flag_R [32]; // differential SCF used? + mpc_int32_t SCFI_L [32]; + mpc_int32_t SCFI_R [32]; // describes order of transmitted SCF + mpc_bool_t MS_Flag[32]; // MS used? +#ifdef MPC_FIXED_POINT + mpc_uint8_t SCF_shift[256]; +#endif + + MPC_SAMPLE_FORMAT V_L[MPC_V_MEM + 960]; + MPC_SAMPLE_FORMAT V_R[MPC_V_MEM + 960]; + MPC_SAMPLE_FORMAT Y_L[36][32]; + MPC_SAMPLE_FORMAT Y_R[36][32]; + MPC_SAMPLE_FORMAT SCF[256]; ///< holds adapted scalefactors (for clipping prevention) + //@} +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/huffman.c b/Mednafen/mednafen/mpcdec/huffman.c new file mode 100644 index 0000000000..52cdfd92c4 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/huffman.c @@ -0,0 +1,358 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file huffman.c +/// Implementations of sv7/sv8 huffman decoding functions. +#include "huffman.h" + + +// sv7 huffman tables +static const mpc_huffman mpc_table_HuffHdr [10] = { +{0x8000, 1, 0}, {0x6000, 3, 1}, {0x5e00, 7, -4}, {0x5d80, 9, 3}, {0x5d00, 9, 4}, {0x5c00, 8, -5}, {0x5800, 6, 2}, {0x5000, 5, -3}, {0x4000, 4, -2}, {0x0, 2, -1} +}; +mpc_lut_data mpc_HuffHdr = {mpc_table_HuffHdr}; + +const mpc_huffman mpc_table_HuffSCFI [4] = { + {0x8000, 1, 1}, {0x6000, 3, 2}, {0x4000, 3, 0}, {0x0, 2, 3} +}; + +static const mpc_huffman mpc_table_HuffDSCF [16] = { + {0xf800, 5, 5}, {0xf000, 5, -4}, {0xe000, 4, 3}, {0xd000, 4, -3}, {0xc000, 4, 8}, {0xa000, 3, 1}, {0x9000, 4, 0}, {0x8800, 5, -5}, {0x8400, 6, 7}, {0x8000, 6, -7}, {0x6000, 3, -1}, {0x4000, 3, 2}, {0x3000, 4, 4}, {0x2800, 5, 6}, {0x2000, 5, -6}, {0x0, 3, -2} +}; +mpc_lut_data mpc_HuffDSCF = {mpc_table_HuffDSCF}; + +static const mpc_huffman mpc_table_HuffQ1 [2] [27] = { + { + {0xe000, 3, 13}, {0xdc00, 6, 26}, {0xd800, 6, 0}, {0xd400, 6, 20}, {0xd000, 6, 6}, {0xc000, 4, 14}, {0xb000, 4, 12}, {0xa000, 4, 4}, {0x9000, 4, 22}, {0x8c00, 6, 8}, {0x8800, 6, 18}, {0x8400, 6, 24}, {0x8000, 6, 2}, {0x7000, 4, 16}, {0x6000, 4, 10}, {0x5800, 5, 17}, {0x5000, 5, 9}, {0x4800, 5, 1}, {0x4000, 5, 25}, {0x3800, 5, 5}, {0x3000, 5, 21}, {0x2800, 5, 3}, {0x2000, 5, 11}, {0x1800, 5, 15}, {0x1000, 5, 23}, {0x800, 5, 19}, {0x0, 5, 7} + }, { + {0x8000, 1, 13}, {0x7e00, 7, 15}, {0x7c00, 7, 1}, {0x7a00, 7, 11}, {0x7800, 7, 7}, {0x7600, 7, 17}, {0x7400, 7, 25}, {0x7200, 7, 19}, {0x7180, 9, 8}, {0x7100, 9, 18}, {0x7080, 9, 2}, {0x7000, 9, 24}, {0x6e00, 7, 3}, {0x6c00, 7, 23}, {0x6a00, 7, 21}, {0x6800, 7, 5}, {0x6700, 8, 0}, {0x6600, 8, 26}, {0x6500, 8, 6}, {0x6400, 8, 20}, {0x6000, 6, 9}, {0x5000, 4, 14}, {0x4000, 4, 12}, {0x3000, 4, 4}, {0x2000, 4, 22}, {0x1000, 4, 16}, {0x0, 4, 10} + } +}; + +static const mpc_huffman mpc_table_HuffQ2 [2] [25] = { + { + {0xf000, 4, 13}, {0xe000, 4, 17}, {0xd000, 4, 7}, {0xc000, 4, 11}, {0xbc00, 6, 1}, {0xb800, 6, 23}, {0xb600, 7, 4}, {0xb400, 7, 20}, {0xb200, 7, 0}, {0xb000, 7, 24}, {0xa800, 5, 22}, {0xa000, 5, 10}, {0x8000, 3, 12}, {0x7800, 5, 2}, {0x7000, 5, 14}, {0x6000, 4, 6}, {0x5000, 4, 18}, {0x4000, 4, 8}, {0x3000, 4, 16}, {0x2800, 5, 9}, {0x2000, 5, 5}, {0x1800, 5, 15}, {0x1000, 5, 21}, {0x800, 5, 19}, {0x0, 5, 3} + }, { + {0xf800, 5, 18}, {0xf000, 5, 6}, {0xe800, 5, 8}, {0xe700, 8, 3}, {0xe6c0, 10, 24}, {0xe680, 10, 4}, {0xe640, 10, 0}, {0xe600, 10, 20}, {0xe400, 7, 23}, {0xe200, 7, 1}, {0xe000, 7, 19}, {0xd800, 5, 16}, {0xd600, 7, 15}, {0xd400, 7, 21}, {0xd200, 7, 9}, {0xd000, 7, 5}, {0xcc00, 6, 2}, {0xc800, 6, 10}, {0xc400, 6, 14}, {0xc000, 6, 22}, {0x8000, 2, 12}, {0x6000, 3, 13}, {0x4000, 3, 17}, {0x2000, 3, 11}, {0x0, 3, 7} + } +}; + +static const mpc_huffman mpc_table_HuffQ3 [2] [7] = { + { + {0xe000, 3, 1}, {0xd000, 4, 3}, {0xc000, 4, -3}, {0xa000, 3, 2}, {0x8000, 3, -2}, {0x4000, 2, 0}, {0x0, 2, -1} + }, { + {0xc000, 2, 0}, {0x8000, 2, -1}, {0x4000, 2, 1}, {0x3000, 4, -2}, {0x2800, 5, 3}, {0x2000, 5, -3}, {0x0, 3, 2} + } +}; + +static const mpc_huffman mpc_table_HuffQ4 [2] [9] = { + { + {0xe000, 3, 0}, {0xc000, 3, -1}, {0xa000, 3, 1}, {0x8000, 3, -2}, {0x6000, 3, 2}, {0x5000, 4, -4}, {0x4000, 4, 4}, {0x2000, 3, 3}, {0x0, 3, -3} + }, { + {0xe000, 3, 1}, {0xd000, 4, 2}, {0xc000, 4, -3}, {0x8000, 2, 0}, {0x6000, 3, -2}, {0x5000, 4, 3}, {0x4800, 5, -4}, {0x4000, 5, 4}, {0x0, 2, -1} + } +}; + +static const mpc_huffman mpc_table_HuffQ5 [2] [15] = { + { + {0xf000, 4, 2}, {0xe800, 5, 5}, {0xe400, 6, -7}, {0xe000, 6, 7}, {0xd000, 4, -3}, {0xc000, 4, 3}, {0xb800, 5, -6}, {0xb000, 5, 6}, {0xa000, 4, -4}, {0x9000, 4, 4}, {0x8000, 4, -5}, {0x6000, 3, 0}, {0x4000, 3, -1}, {0x2000, 3, 1}, {0x0, 3, -2} + }, { + {0xf000, 4, 3}, {0xe800, 5, 4}, {0xe600, 7, 6}, {0xe500, 8, -7}, {0xe400, 8, 7}, {0xe000, 6, -6}, {0xc000, 3, 0}, {0xa000, 3, -1}, {0x8000, 3, 1}, {0x6000, 3, -2}, {0x4000, 3, 2}, {0x3800, 5, -5}, {0x3000, 5, 5}, {0x2000, 4, -4}, {0x0, 3, -3} + } +}; + +static const mpc_huffman mpc_table_HuffQ6 [2] [31] = { + { + {0xf800, 5, 3}, {0xf000, 5, -4}, {0xec00, 6, -11}, {0xe800, 6, 12}, {0xe000, 5, 4}, {0xd800, 5, 6}, {0xd000, 5, -5}, {0xc800, 5, 5}, {0xc000, 5, 7}, {0xb800, 5, -7}, {0xb400, 6, -12}, {0xb000, 6, -13}, {0xa800, 5, -6}, {0xa000, 5, 8}, {0x9800, 5, -8}, {0x9000, 5, 9}, {0x8800, 5, -9}, {0x8400, 6, 13}, {0x8200, 7, -15}, {0x8000, 7, 15}, {0x7000, 4, 0}, {0x6800, 5, -10}, {0x6000, 5, 10}, {0x5000, 4, -1}, {0x4000, 4, 2}, {0x3000, 4, 1}, {0x2000, 4, -2}, {0x1c00, 6, 14}, {0x1800, 6, -14}, {0x1000, 5, 11}, {0x0, 4, -3} + }, { + {0xf800, 5, -6}, {0xf000, 5, 6}, {0xe000, 4, 1}, {0xd000, 4, -1}, {0xce00, 7, 10}, {0xcc00, 7, -10}, {0xcb00, 8, -11}, {0xca80, 9, -12}, {0xca60, 11, 13}, {0xca58, 13, 15}, {0xca50, 13, -14}, {0xca48, 13, 14}, {0xca40, 13, -15}, {0xca00, 10, -13}, {0xc900, 8, 11}, {0xc800, 8, 12}, {0xc400, 6, -9}, {0xc000, 6, 9}, {0xb000, 4, -2}, {0xa000, 4, 2}, {0x9000, 4, 3}, {0x8000, 4, -3}, {0x7800, 5, -7}, {0x7000, 5, 7}, {0x6000, 4, -4}, {0x5000, 4, 4}, {0x4800, 5, -8}, {0x4000, 5, 8}, {0x3000, 4, 5}, {0x2000, 4, -5}, {0x0, 3, 0} + } +}; + +static const mpc_huffman mpc_table_HuffQ7 [2] [63] = { + { + {0xfc00, 6, 7}, {0xf800, 6, 8}, {0xf400, 6, 9}, {0xf000, 6, -8}, {0xec00, 6, 11}, {0xea00, 7, 21}, {0xe900, 8, -28}, {0xe800, 8, 28}, {0xe400, 6, -9}, {0xe200, 7, -22}, {0xe000, 7, -21}, {0xdc00, 6, -10}, {0xd800, 6, -11}, {0xd400, 6, 10}, {0xd000, 6, 12}, {0xcc00, 6, -13}, {0xca00, 7, 22}, {0xc800, 7, 23}, {0xc400, 6, -12}, {0xc000, 6, 13}, {0xbc00, 6, 14}, {0xb800, 6, -14}, {0xb600, 7, -23}, {0xb500, 8, -29}, {0xb400, 8, 29}, {0xb000, 6, -15}, {0xac00, 6, 15}, {0xa800, 6, 16}, {0xa400, 6, -16}, {0xa200, 7, -24}, {0xa000, 7, 24}, {0x9c00, 6, 17}, {0x9a00, 7, -25}, {0x9900, 8, -30}, {0x9800, 8, 30}, {0x9400, 6, -17}, {0x9000, 6, 18}, {0x8c00, 6, -18}, {0x8a00, 7, 25}, {0x8800, 7, 26}, {0x8400, 6, 19}, {0x8200, 7, -26}, {0x8000, 7, -27}, {0x7800, 5, 2}, {0x7400, 6, -19}, {0x7000, 6, 20}, {0x6800, 5, -1}, {0x6700, 8, -31}, {0x6600, 8, 31}, {0x6400, 7, 27}, {0x6000, 6, -20}, {0x5800, 5, 1}, {0x5000, 5, -5}, {0x4800, 5, -3}, {0x4000, 5, 3}, {0x3800, 5, 0}, {0x3000, 5, -2}, {0x2800, 5, -4}, {0x2000, 5, 4}, {0x1800, 5, 5}, {0x1000, 5, -6}, {0x800, 5, 6}, {0x0, 5, -7} + }, { + {0xf800, 5, -1}, {0xf000, 5, 2}, {0xe800, 5, -2}, {0xe000, 5, 3}, {0xdf00, 8, -20}, {0xdec0, 10, 24}, {0xdebc, 14, 28}, {0xdeb8, 14, -28}, {0xdeb4, 14, -30}, {0xdeb0, 14, 30}, {0xdea0, 12, -27}, {0xde9c, 14, 29}, {0xde98, 14, -29}, {0xde94, 14, 31}, {0xde90, 14, -31}, {0xde80, 12, 27}, {0xde00, 9, -22}, {0xdc00, 7, -17}, {0xd800, 6, -11}, {0xd000, 5, -3}, {0xc800, 5, 4}, {0xc000, 5, -4}, {0xbe00, 7, 17}, {0xbd00, 8, 20}, {0xbc80, 9, 22}, {0xbc40, 10, -25}, {0xbc00, 10, -26}, {0xb800, 6, 12}, {0xb000, 5, 5}, {0xa800, 5, -5}, {0xa000, 5, 6}, {0x9800, 5, -6}, {0x9400, 6, -12}, {0x9200, 7, -18}, {0x9000, 7, 18}, {0x8c00, 6, 13}, {0x8800, 6, -13}, {0x8000, 5, -7}, {0x7c00, 6, 14}, {0x7b00, 8, 21}, {0x7a00, 8, -21}, {0x7800, 7, -19}, {0x7000, 5, 7}, {0x6800, 5, 8}, {0x6400, 6, -14}, {0x6000, 6, -15}, {0x5800, 5, -8}, {0x5400, 6, 15}, {0x5200, 7, 19}, {0x51c0, 10, 25}, {0x5180, 10, 26}, {0x5100, 9, -23}, {0x5080, 9, 23}, {0x5000, 9, -24}, {0x4800, 5, -9}, {0x4000, 5, 9}, {0x3c00, 6, 16}, {0x3800, 6, -16}, {0x3000, 5, 10}, {0x2000, 4, 0}, {0x1800, 5, -10}, {0x1000, 5, 11}, {0x0, 4, 1} + } +}; + +mpc_lut_data mpc_HuffQ [7] [2] = { + {{mpc_table_HuffQ1[0]}, {mpc_table_HuffQ1[1]}}, + {{mpc_table_HuffQ2[0]}, {mpc_table_HuffQ2[1]}}, + {{mpc_table_HuffQ3[0]}, {mpc_table_HuffQ3[1]}}, + {{mpc_table_HuffQ4[0]}, {mpc_table_HuffQ4[1]}}, + {{mpc_table_HuffQ5[0]}, {mpc_table_HuffQ5[1]}}, + {{mpc_table_HuffQ6[0]}, {mpc_table_HuffQ6[1]}}, + {{mpc_table_HuffQ7[0]}, {mpc_table_HuffQ7[1]}} +}; + + +// sv8 huffman tables +static const mpc_huffman mpc_huff_SCFI_1 [3] = { + {0x8000, 1, 1}, {0x4000, 2, 2}, {0x0, 3, 3} +}; // 3 +static const mpc_int8_t mpc_sym_SCFI_1 [4] = { + 2, 3, 1, 0 +}; +static const mpc_huffman mpc_huff_SCFI_2 [5] = { + {0x8000, 2, 3}, {0x4000, 3, 5}, {0x1800, 5, 11}, {0x400, 6, 14}, {0x0, 7, 15} +}; // 5 +static const mpc_int8_t mpc_sym_SCFI_2 [16] = { + 15, 10, 14, 11, 13, 9, 7, 6, 5, 12, 8, 3, 2, 0, 4, 1 +}; +mpc_can_data mpc_can_SCFI[2] = {{mpc_huff_SCFI_1, mpc_sym_SCFI_1}, {mpc_huff_SCFI_2, mpc_sym_SCFI_2}}; + +static const mpc_huffman mpc_huff_DSCF_1 [12] = { + {0xa000, 3, 7}, {0x4000, 4, 12}, {0x2800, 5, 16}, {0x1800, 6, 21}, {0xe00, 7, 27}, {0x700, 8, 34}, {0x380, 9, 41}, {0x140, 10, 48}, {0x80, 11, 53}, {0x30, 12, 57}, {0x18, 13, 60}, {0x0, 14, 63} +}; // 12 +static const mpc_int8_t mpc_sym_DSCF_1 [64] = { + 35, 34, 33, 36, 32, 30, 29, 27, 26, 37, 28, 25, 39, 38, 24, 23, 40, 22, 21, 20, 19, 43, 42, 41, 18, 17, 16, 15, 46, 45, 44, 14, 13, 12, 11, 49, 48, 47, 31, 10, 9, 8, 7, 6, 52, 51, 50, 5, 4, 3, 54, 53, 2, 1, 0, 57, 56, 55, 63, 62, 61, 60, 59, 58 +}; +static const mpc_huffman mpc_huff_DSCF_2 [13] = { + {0x6000, 3, 7}, {0x3000, 4, 10}, {0x1800, 5, 13}, {0x1000, 6, 16}, {0xa00, 7, 20}, {0x600, 8, 25}, {0x380, 9, 31}, {0x1c0, 10, 38}, {0xe0, 11, 45}, {0x50, 12, 52}, {0x20, 13, 57}, {0xc, 14, 61}, {0x0, 15, 64} +}; // 13 +static const mpc_int8_t mpc_sym_DSCF_2 [65] = { + 33, 32, 31, 30, 29, 34, 28, 27, 36, 35, 26, 37, 25, 38, 24, 23, 40, 39, 22, 21, 42, 41, 20, 19, 18, 45, 44, 43, 17, 16, 15, 14, 48, 47, 46, 13, 12, 11, 10, 64, 52, 51, 50, 49, 9, 8, 7, 6, 55, 54, 53, 5, 4, 3, 58, 57, 56, 2, 1, 63, 62, 61, 60, 59, 0 +}; +mpc_can_data mpc_can_DSCF[2] = {{mpc_huff_DSCF_1, mpc_sym_DSCF_1}, {mpc_huff_DSCF_2, mpc_sym_DSCF_2}}; + +static const mpc_huffman mpc_huff_Bands [12] = { + {0x8000, 1, 1}, {0x4000, 2, 2}, {0x2000, 3, 3}, {0x1000, 5, 6}, {0x800, 6, 8}, {0x600, 7, 10}, {0x300, 8, 13}, {0x200, 9, 16}, {0x140, 10, 20}, {0xc0, 11, 25}, {0x10, 12, 31}, {0x0, 13, 32} +}; // 12 +static const mpc_int8_t mpc_sym_Bands [33] = { + 0, 32, 1, 31, 2, 30, 3, 4, 29, 6, 5, 28, 7, 27, 26, 8, 25, 24, 23, 9, 22, 21, 20, 18, 17, 16, 15, 14, 12, 11, 10, 19, 13 +}; +mpc_can_data mpc_can_Bands = {mpc_huff_Bands, mpc_sym_Bands}; + +static const mpc_huffman mpc_huff_Res_1 [16] = { + {0x8000, 1, 1}, {0x4000, 2, 2}, {0x2000, 3, 3}, {0x1000, 4, 4}, {0x800, 5, 5}, {0x400, 6, 6}, {0x200, 7, 7}, {0x100, 8, 8}, {0x80, 9, 9}, {0x40, 10, 10}, {0x20, 11, 11}, {0x10, 12, 12}, {0x8, 13, 13}, {0x4, 14, 14}, {0x2, 15, 15}, {0x0, 16, 16} +}; // 16 +static const mpc_int8_t mpc_sym_Res_1 [17] = { + 0, 1, 16, 2, 3, 4, 5, 15, 6, 7, 8, 9, 10, 11, 12, 14, 13 +}; +static const mpc_huffman mpc_huff_Res_2 [12] = { + {0x4000, 2, 3}, {0x2000, 3, 4}, {0x1000, 4, 5}, {0x800, 5, 6}, {0x400, 6, 7}, {0x200, 7, 8}, {0x100, 8, 9}, {0x80, 9, 10}, {0x40, 10, 11}, {0x20, 11, 12}, {0x10, 12, 13}, {0x0, 14, 16} +}; // 12 +static const mpc_int8_t mpc_sym_Res_2 [17] = { + 16, 1, 0, 2, 15, 3, 14, 4, 5, 13, 6, 12, 7, 11, 10, 9, 8 +}; +mpc_can_data mpc_can_Res[2] = {{mpc_huff_Res_1, mpc_sym_Res_1}, {mpc_huff_Res_2, mpc_sym_Res_2}}; + +static const mpc_huffman mpc_huff_Q1 [10] = { + {0x6000, 3, 7}, {0x1000, 4, 10}, {0x800, 5, 11}, {0x400, 6, 12}, {0x200, 7, 13}, {0x100, 8, 14}, {0x80, 9, 15}, {0x40, 10, 16}, {0x20, 11, 17}, {0x0, 12, 18} +}; // 10 +static const mpc_int8_t mpc_sym_Q1 [19] = { + 7, 6, 5, 4, 3, 10, 9, 8, 2, 1, 11, 0, 12, 13, 14, 15, 16, 18, 17 +}; +mpc_can_data mpc_can_Q1 = {mpc_huff_Q1, mpc_sym_Q1}; + +static const mpc_huffman mpc_huff_Q2_1 [10] = { + {0xe000, 3, 7}, {0x8000, 4, 14}, {0x3c00, 6, 38}, {0x2a00, 7, 53}, {0x1200, 8, 74}, {0x600, 9, 92}, {0x3c0, 10, 104}, {0x60, 11, 119}, {0x20, 12, 122}, {0x0, 13, 124} +}; // 10 +static const mpc_int8_t mpc_sym_Q2_1 [125] = { + 62, 87, 67, 63, 61, 57, 37, 93, 92, 88, 86, 83, 82, 81, 68, 66, 58, 56, 42, 41, 38, 36, 32, 31, 112, 91, 72, 64, 60, 52, 43, 33, 12, 117, 113, 111, 107, 97, 89, 85, 77, 73, 71, 69, 65, 59, 55, 53, 51, 47, 39, 35, 27, 17, 13, 11, 7, 118, 116, 108, 106, 98, 96, 94, 90, 84, 80, 78, 76, 48, 46, 44, 40, 34, 30, 28, 26, 18, 16, 8, 6, 122, 110, 102, 74, 70, 54, 50, 22, 2, 123, 121, 119, 115, 114, 109, 105, 103, 101, 99, 95, 79, 75, 49, 45, 29, 25, 23, 21, 19, 15, 14, 10, 9, 5, 3, 1, 124, 104, 20, 0, 120, 100, 24, 4 +}; +static const mpc_huffman mpc_huff_Q2_2 [9] = { + {0xf000, 4, 15}, {0x7000, 5, 30}, {0x4800, 6, 44}, {0x3c00, 7, 62}, {0xc00, 8, 92}, {0x780, 9, 104}, {0xc0, 10, 119}, {0x40, 11, 122}, {0x0, 12, 124} +}; // 9 +static const mpc_int8_t mpc_sym_Q2_2 [125] = { + 62, 92, 87, 86, 82, 68, 67, 66, 63, 61, 58, 57, 56, 42, 38, 37, 32, 93, 91, 88, 83, 81, 43, 41, 36, 33, 31, 112, 72, 64, 60, 52, 12, 118, 117, 116, 113, 111, 108, 107, 106, 98, 97, 96, 94, 90, 89, 85, 84, 80, 78, 77, 76, 73, 71, 69, 65, 59, 55, 53, 51, 48, 47, 46, 44, 40, 39, 35, 34, 30, 28, 27, 26, 18, 17, 16, 13, 11, 8, 7, 6, 122, 110, 74, 70, 54, 50, 22, 14, 2, 123, 121, 119, 115, 114, 109, 105, 103, 102, 101, 99, 95, 79, 75, 49, 45, 29, 25, 23, 21, 19, 15, 10, 9, 5, 3, 1, 124, 104, 20, 0, 120, 100, 24, 4 +}; + +static const mpc_huffman mpc_huff_Q3 [7] = { + {0xe000, 3, 7}, {0x8000, 4, 14}, {0x5000, 5, 22}, {0x2400, 6, 32}, {0xa00, 7, 41}, {0x200, 8, 46}, {0x0, 9, 48} +}; // 7 +static const mpc_int8_t mpc_sym_Q3 [49] = { + 0, 17, 16, 1, 15, -16, -1, 32, 31, 2, 14, -15, -32, 34, 33, 47, 46, 18, 30, -14, -2, -31, -17, -18, 49, 48, 63, 19, 29, 3, 13, -13, -3, -30, -47, -48, -33, 50, 62, 35, 45, -29, -19, -46, -34, 51, 61, -45, -35 +}; + +static const mpc_huffman mpc_huff_Q4 [8] = { + {0xf000, 4, 15}, {0x9000, 5, 30}, {0x3400, 6, 48}, {0x1800, 7, 61}, {0x500, 8, 73}, {0x100, 9, 78}, {0x0, 10, 80}, {0x0, 0, 90} +}; // 8 +static const mpc_int8_t mpc_sym_Q4 [91] = { + 0, 32, 17, 16, 31, 2, 1, 15, 14, -15, -16, -1, -32, 49, 48, 34, 33, 47, 46, 19, 18, 30, 29, 3, 13, -13, -14, -2, -3, -30, -31, -17, -18, -47, -48, -33, 64, 50, 63, 62, 35, 45, 4, 12, -29, -19, -46, -34, -64, -49, 66, 65, 79, 78, 51, 61, 36, 44, 20, 28, -12, -4, -28, -20, -45, -35, -62, -63, -50, 67, 77, 52, 60, -44, -36, -61, -51, 68, 76, -60, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const mpc_huffman mpc_huff_Q5_1 [6] = { + {0xc000, 2, 3}, {0x4000, 3, 6}, {0x2000, 4, 8}, {0x1000, 5, 10}, {0x800, 6, 12}, {0x0, 7, 14} +}; // 6 +static const mpc_int8_t mpc_sym_Q5_1 [15] = { + 0, 2, 1, -1, -2, 3, -3, 4, -4, 5, -5, 7, 6, -6, -7 +}; +static const mpc_huffman mpc_huff_Q5_2 [4] = { + {0x6000, 3, 7}, {0x2000, 4, 10}, {0x1000, 5, 12}, {0x0, 6, 14} +}; // 4 +static const mpc_int8_t mpc_sym_Q5_2 [15] = { + 2, 1, 0, -1, -2, 4, 3, -3, -4, 5, -5, 7, 6, -6, -7 +}; + +static const mpc_huffman mpc_huff_Q6_1 [8] = { + {0xc000, 2, 3}, {0x8000, 3, 6}, {0x4000, 4, 10}, {0x2800, 5, 14}, {0xc00, 6, 19}, {0x800, 7, 22}, {0x400, 8, 26}, {0x0, 9, 30} +}; // 8 +static const mpc_int8_t mpc_sym_Q6_1 [31] = { + 0, 1, -1, 3, 2, -2, -3, 4, -4, -5, 8, 7, 6, 5, -6, -7, -8, 9, -9, 11, 10, -10, -11, 15, 14, 13, 12, -12, -13, -14, -15 +}; +static const mpc_huffman mpc_huff_Q6_2 [5] = { + {0x5000, 4, 15}, {0x2000, 5, 20}, {0x1000, 6, 24}, {0x400, 7, 28}, {0x0, 8, 30} +}; // 5 +static const mpc_int8_t mpc_sym_Q6_2 [31] = { + 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, 8, 7, 6, -6, -7, -8, 10, 9, -9, -10, 13, 12, 11, -11, -12, -13, 15, 14, -14, -15 +}; + +static const mpc_huffman mpc_huff_Q7_1 [9] = { + {0xc000, 2, 3}, {0x8000, 3, 6}, {0x6000, 4, 10}, {0x4000, 5, 16}, {0x2800, 6, 24}, {0x1400, 7, 34}, {0xa00, 8, 44}, {0x400, 9, 54}, {0x0, 10, 62} +}; // 9 +static const mpc_int8_t mpc_sym_Q7_1 [63] = { + 0, 1, -1, 2, -2, 4, 3, -3, -4, 7, 6, 5, -5, -6, -7, 13, 11, 10, 9, 8, -8, -9, -10, -11, -12, 17, 16, 15, 14, 12, -13, -14, -15, -16, -17, 28, 27, 21, 20, 19, 18, -18, -19, -20, -21, -27, -28, 31, 30, 29, 26, 25, 24, 23, 22, -22, -23, -24, -25, -26, -29, -30, -31 +}; +static const mpc_huffman mpc_huff_Q7_2 [5] = { + {0x6000, 5, 31}, {0x2400, 6, 43}, {0x1000, 7, 52}, {0x200, 8, 60}, {0x0, 9, 62} +}; // 5 +static const mpc_int8_t mpc_sym_Q7_2 [63] = { + 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 17, 16, 15, 14, 13, 12, 11, -10, -11, -12, -13, -14, -15, -16, -17, 22, 21, 20, 19, 18, -18, -19, -20, -21, -22, 29, 28, 27, 26, 25, 24, 23, -23, -24, -25, -26, -27, -28, -29, 31, 30, -30, -31 +}; + +static const mpc_huffman mpc_huff_Q8_1 [11] = { + {0xc000, 2, 3}, {0x8000, 3, 6}, {0x7000, 4, 10}, {0x5800, 5, 17}, {0x3800, 6, 28}, {0x2800, 7, 42}, {0x1900, 8, 62}, {0xd00, 9, 87}, {0x280, 10, 113}, {0x60, 11, 123}, {0x0, 12, 126} +}; // 11 +static const mpc_int8_t mpc_sym_Q8_1 [127] = { + 0, 1, -1, -2, 3, 2, -3, 7, 6, 5, 4, -4, -5, -6, -7, 11, 10, 9, 8, -8, -9, -10, -11, 19, 18, 17, 16, 15, 14, 13, 12, -12, -13, -14, -15, -16, -17, -19, 56, 55, 31, 28, 27, 26, 25, 24, 23, 22, 21, 20, -18, -20, -21, -22, -23, -24, -25, -26, -27, -33, -54, -56, 63, 62, 61, 60, 59, 58, 57, 54, 53, 43, 40, 39, 38, 37, 36, 35, 34, 33, 32, 30, 29, -28, -29, -30, -31, -32, -34, -35, -36, -37, -38, -39, -40, -41, -43, -53, -55, -57, -58, -59, -60, -61, 49, 47, 46, 45, 44, 42, 41, -42, -44, -45, -46, -47, -48, -49, -50, -62, -63, 52, 51, 50, 48, -51, -52 +}; +static const mpc_huffman mpc_huff_Q8_2 [4] = { + {0x9800, 6, 63}, {0x2a00, 7, 101}, {0x400, 8, 122}, {0x0, 9, 126} +}; // 4 +static const mpc_int8_t mpc_sym_Q8_2 [127] = { + 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 12, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, -42, -43, -44, -45, -46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -57, -58, -59, 63, 62, 61, 60, -60, -61, -62, -63 +}; + +static const mpc_huffman mpc_huff_Q9up [6] = { + {0xf800, 6, 63}, {0xac00, 7, 125}, {0x2600, 8, -45}, {0x280, 9, -7}, {0x40, 10, -2}, {0x0, 11, -1} +}; // 6 +static const mpc_int8_t mpc_sym_Q9up [256] = { + -128, 127, -108, -110, -111, -112, -113, -114, -115, -116, -117, -118, -119, -120, -121, -122, -123, -124, -125, -126, -127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, -44, -45, -46, -47, -48, -49, -50, -51, -52, -53, -54, -55, -56, -57, -58, -59, -60, -61, -62, -63, -64, -65, -66, -67, -68, -69, -70, -71, -72, -73, -74, -75, -76, -77, -78, -79, -80, -81, -82, -83, -84, -85, -86, -87, -88, -89, -90, -91, -92, -93, -94, -95, -96, -97, -98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -109, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 40, 20, 19, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, -30, -31, -32, -33, -34, -35, -36, -37, -38, -39, -40, -41, -42, -43, 41, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, -3, -4, -5, -6, 4, 3, 2, 1, 0, -1, -2 +}; +mpc_can_data mpc_can_Q9up = {mpc_huff_Q9up, mpc_sym_Q9up}; + + +mpc_can_data mpc_can_Q [6][2] = { + {{mpc_huff_Q2_1, mpc_sym_Q2_1}, {mpc_huff_Q2_2, mpc_sym_Q2_2}}, + {{mpc_huff_Q3, mpc_sym_Q3}, {mpc_huff_Q4, mpc_sym_Q4}}, + {{mpc_huff_Q5_1, mpc_sym_Q5_1}, {mpc_huff_Q5_2, mpc_sym_Q5_2}}, + {{mpc_huff_Q6_1, mpc_sym_Q6_1}, {mpc_huff_Q6_2, mpc_sym_Q6_2}}, + {{mpc_huff_Q7_1, mpc_sym_Q7_1}, {mpc_huff_Q7_2, mpc_sym_Q7_2}}, + {{mpc_huff_Q8_1, mpc_sym_Q8_1}, {mpc_huff_Q8_2, mpc_sym_Q8_2}} +}; + +static void huff_fill_lut(const mpc_huffman * table, mpc_huff_lut * lut, const int bits) +{ + int i, idx = 0; + const int shift = 16 - bits; + for (i = (1 << bits) - 1; i >= 0 ; i--) { + if ((table[idx].Code >> shift) < i) { + lut[i].Length = table[idx].Length; + lut[i].Value = table[idx].Value; + } else { + if (table[idx].Length <= bits) { + lut[i].Length = table[idx].Length; + lut[i].Value = table[idx].Value; + } else { + lut[i].Length = 0; + lut[i].Value = idx; + } + if (i != 0) + do { + idx++; + } while ((table[idx].Code >> shift) == i); + } + } +} + +static void can_fill_lut(mpc_can_data * data, const int bits) +{ + int i, idx = 0; + const int shift = 16 - bits; + const mpc_huffman * table = data->table; + const mpc_int8_t * sym = data->sym; + mpc_huff_lut * lut = data->lut; + for (i = (1 << bits) - 1; i >= 0 ; i--) { + if ((table[idx].Code >> shift) < i) { + if (table[idx].Length <= bits) { + lut[i].Length = table[idx].Length; + lut[i].Value = sym[(table[idx].Value - (i >> (bits - table[idx].Length))) & 0xFF]; + } else { + lut[i].Length = 0; + lut[i].Value = idx; + } + } else { + if (table[idx].Length <= bits) { + lut[i].Length = table[idx].Length; + lut[i].Value = sym[(table[idx].Value - (i >> (bits - table[idx].Length))) & 0xFF]; + } else { + lut[i].Length = 0; + lut[i].Value = idx; + } + if (i != 0) + do { + idx++; + } while ((table[idx].Code >> shift) == i); + } + } +} + +void huff_init_lut(const int bits) +{ + int i, j; + + huff_fill_lut(mpc_HuffDSCF.table, mpc_HuffDSCF.lut, bits); + huff_fill_lut(mpc_HuffHdr.table, mpc_HuffHdr.lut, bits); + + can_fill_lut(&mpc_can_SCFI[0], bits); + can_fill_lut(&mpc_can_SCFI[1], bits); + can_fill_lut(&mpc_can_DSCF[0], bits); + can_fill_lut(&mpc_can_DSCF[1], bits); + can_fill_lut(&mpc_can_Res[0], bits); + can_fill_lut(&mpc_can_Res[1], bits); + can_fill_lut(&mpc_can_Q1, bits); + can_fill_lut(&mpc_can_Q9up, bits); + + + for( i = 0; i < 7; i++){ + for( j = 0; j < 2; j++){ + if (i != 6) can_fill_lut(&mpc_can_Q[i][j], bits); + huff_fill_lut(mpc_HuffQ[i][j].table, mpc_HuffQ[i][j].lut, bits); + } + } +} + + diff --git a/Mednafen/mednafen/mpcdec/huffman.h b/Mednafen/mednafen/mpcdec/huffman.h new file mode 100644 index 0000000000..5ddba1478b --- /dev/null +++ b/Mednafen/mednafen/mpcdec/huffman.h @@ -0,0 +1,83 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file huffman.h +/// Data structures and functions for huffman coding. + +#ifndef _MPCDEC_HUFFMAN_H_ +#define _MPCDEC_HUFFMAN_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "mpc_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// LUT size parameter, LUT size is 1 << LUT_DEPTH +#define LUT_DEPTH 6 + +/// Huffman table entry. +typedef struct mpc_huffman_t { + mpc_uint16_t Code; + mpc_uint8_t Length; + mpc_int8_t Value; +} mpc_huffman; + +/// Huffman LUT entry. +typedef struct mpc_huff_lut_t { + mpc_uint8_t Length; + mpc_int8_t Value; +} mpc_huff_lut; + +/// Type used for huffman LUT decoding +typedef struct mpc_lut_data_t { + mpc_huffman const * const table; + mpc_huff_lut lut[1 << LUT_DEPTH]; +} mpc_lut_data; + +/// Type used for canonical huffman decoding +typedef struct mpc_can_data_t { + mpc_huffman const * const table; + mpc_int8_t const * const sym; + mpc_huff_lut lut[1 << LUT_DEPTH]; +} mpc_can_data; + +void huff_init_lut(const int bits); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/internal.h b/Mednafen/mednafen/mpcdec/internal.h new file mode 100644 index 0000000000..52276c6b68 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/internal.h @@ -0,0 +1,110 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file internal.h +/// Definitions and structures used only internally by the libmpcdec. +#ifndef _MPCDEC_INTERNAL_H_ +#define _MPCDEC_INTERNAL_H_ +#ifdef WIN32 +#pragma once +#endif +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpcdec.h" + +/// Big/little endian 32 bit byte swapping routine. +static mpc_inline +mpc_uint32_t mpc_swap32(mpc_uint32_t val) { + return (((val & 0xFF000000) >> 24) | ((val & 0x00FF0000) >> 8) + | ((val & 0x0000FF00) << 8) | ((val & 0x000000FF) << 24)); +} + +typedef struct mpc_block_t { + char key[2]; // block key + mpc_uint64_t size; // block size minus the block header size +} mpc_block; + +#define MAX_FRAME_SIZE 4352 +#define DEMUX_BUFFER_SIZE (65536 - MAX_FRAME_SIZE) // need some space as sand box + +struct mpc_demux_t { + mpc_reader * r; + mpc_decoder * d; + mpc_streaminfo si; + + // buffer + mpc_uint8_t buffer[DEMUX_BUFFER_SIZE + MAX_FRAME_SIZE]; + mpc_size_t bytes_total; + mpc_bits_reader bits_reader; + mpc_int32_t block_bits; /// bits remaining in current audio block + mpc_uint_t block_frames; /// frames remaining in current audio block + + // seeking + mpc_seek_t * seek_table; + mpc_uint_t seek_pwr; /// distance between 2 frames in seek_table = 2^seek_pwr + mpc_uint32_t seek_table_size; /// used size in seek_table + + // chapters + mpc_seek_t chap_pos; /// supposed position of the first chapter block + mpc_int_t chap_nb; /// number of chapters (-1 if unknown, 0 if no chapter) + mpc_chap_info * chap; /// chapters position and tag + +}; + +/** + * checks if a block key is valid + * @param key the two caracters key to check + * @return MPC_STATUS_FAIL if the key is invalid, MPC_STATUS_OK else + */ +static mpc_inline mpc_status mpc_check_key(char * key) +{ + if (key[0] < 65 || key[0] > 90 || key[1] < 65 || key[1] > 90) + return MPC_STATUS_FAIL; + return MPC_STATUS_OK; +} + +/// helper functions used by multiple files +mpc_uint32_t mpc_random_int(mpc_decoder *d); // in synth_filter.c +void mpc_decoder_init_quant(mpc_decoder *d, double scale_factor); +void mpc_decoder_synthese_filter_float(mpc_decoder *d, MPC_SAMPLE_FORMAT* OutData, mpc_int_t channels); + +#define MPC_IS_FAILURE(X) ((int)(X) < (int)MPC_STATUS_OK) +#define MPC_AUTO_FAIL(X) { mpc_status s = (X); if (MPC_IS_FAILURE(s)) return s; } + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/minimax.h b/Mednafen/mednafen/mpcdec/minimax.h new file mode 100644 index 0000000000..5351a21112 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/minimax.h @@ -0,0 +1,56 @@ +/* + * Musepack audio compression + * Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see + */ + +#pragma once + +# define clip(x,min,max) ( (x) < (min) ? (min) : (x) > (max) ? (max) : (x) ) + +#ifdef __cplusplus + +# define maxi(A,B) ( (A) >? (B) ) +# define mini(A,B) ( (A) ? (B) ) +# define mind(A,B) ( (A) ? (B) ) +# define minf(A,B) ( (A) (B) ? (A) : (B) ) +# define mini(A,B) ( (A) < (B) ? (A) : (B) ) +# define maxd(A,B) ( (A) > (B) ? (A) : (B) ) +# define mind(A,B) ( (A) < (B) ? (A) : (B) ) +# define maxf(A,B) ( (A) > (B) ? (A) : (B) ) +# define minf(A,B) ( (A) < (B) ? (A) : (B) ) + +#endif + +#ifdef __GNUC__ + +# define absi(A) abs (A) +# define absf(A) fabsf (A) +# define absd(A) fabs (A) + +#else + +# define absi(A) ( (A) >= 0 ? (A) : -(A) ) +# define absf(A) ( (A) >= 0.f ? (A) : -(A) ) +# define absd(A) ( (A) >= 0. ? (A) : -(A) ) + +#endif + diff --git a/Mednafen/mednafen/mpcdec/mpc_bits_reader.c b/Mednafen/mednafen/mpcdec/mpc_bits_reader.c new file mode 100644 index 0000000000..2d5da9926d --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpc_bits_reader.c @@ -0,0 +1,181 @@ +/* + Copyright (c) 2007-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "mpcdec.h" +#include "internal.h" +#include "huffman.h" +#include "mpc_bits_reader.h" + +const mpc_uint32_t Cnk[MAX_ENUM / 2][MAX_ENUM] = +{ + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, + {0, 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465}, + {0, 0, 0, 1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 286, 364, 455, 560, 680, 816, 969, 1140, 1330, 1540, 1771, 2024, 2300, 2600, 2925, 3276, 3654, 4060, 4495}, + {0, 0, 0, 0, 1, 5, 15, 35, 70, 126, 210, 330, 495, 715, 1001, 1365, 1820, 2380, 3060, 3876, 4845, 5985, 7315, 8855, 10626, 12650, 14950, 17550, 20475, 23751, 27405, 31465}, + {0, 0, 0, 0, 0, 1, 6, 21, 56, 126, 252, 462, 792, 1287, 2002, 3003, 4368, 6188, 8568, 11628, 15504, 20349, 26334, 33649, 42504, 53130, 65780, 80730, 98280, 118755, 142506, 169911}, + {0, 0, 0, 0, 0, 0, 1, 7, 28, 84, 210, 462, 924, 1716, 3003, 5005, 8008, 12376, 18564, 27132, 38760, 54264, 74613, 100947, 134596, 177100, 230230, 296010, 376740, 475020, 593775, 736281}, + {0, 0, 0, 0, 0, 0, 0, 1, 8, 36, 120, 330, 792, 1716, 3432, 6435, 11440, 19448, 31824, 50388, 77520, 116280, 170544, 245157, 346104, 480700, 657800, 888030, 1184040, 1560780, 2035800, 2629575}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 45, 165, 495, 1287, 3003, 6435, 12870, 24310, 43758, 75582, 125970, 203490, 319770, 490314, 735471, 1081575, 1562275, 2220075, 3108105, 4292145, 5852925, 7888725}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 55, 220, 715, 2002, 5005, 11440, 24310, 48620, 92378, 167960, 293930, 497420, 817190, 1307504, 2042975, 3124550, 4686825, 6906900, 10015005, 14307150, 20160075}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11, 66, 286, 1001, 3003, 8008, 19448, 43758, 92378, 184756, 352716, 646646, 1144066, 1961256, 3268760, 5311735, 8436285, 13123110, 20030010, 30045015, 44352165}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 78, 364, 1365, 4368, 12376, 31824, 75582, 167960, 352716, 705432, 1352078, 2496144, 4457400, 7726160, 13037895, 21474180, 34597290, 54627300, 84672315}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 13, 91, 455, 1820, 6188, 18564, 50388, 125970, 293930, 646646, 1352078, 2704156, 5200300, 9657700, 17383860, 30421755, 51895935, 86493225, 141120525}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 105, 560, 2380, 8568, 27132, 77520, 203490, 497420, 1144066, 2496144, 5200300, 10400600, 20058300, 37442160, 67863915, 119759850, 206253075}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15, 120, 680, 3060, 11628, 38760, 116280, 319770, 817190, 1961256, 4457400, 9657700, 20058300, 40116600, 77558760, 145422675, 265182525}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 136, 816, 3876, 15504, 54264, 170544, 490314, 1307504, 3268760, 7726160, 17383860, 37442160, 77558760, 155117520, 300540195}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 153, 969, 4845, 20349, 74613, 245157, 735471, 2042975, 5311735, 13037895, 30421755, 67863915, 145422675, 300540195} +}; + +const mpc_uint8_t Cnk_len[MAX_ENUM / 2][MAX_ENUM] = +{ + {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {0, 0, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + {0, 0, 0, 2, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13}, + {0, 0, 0, 0, 3, 4, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16}, + {0, 0, 0, 0, 0, 3, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18}, + {0, 0, 0, 0, 0, 0, 3, 5, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20}, + {0, 0, 0, 0, 0, 0, 0, 3, 6, 7, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22}, + {0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 23, 24}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 10, 12, 13, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 25, 26, 26}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 11, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 27}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 9, 11, 13, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 28}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 10, 12, 14, 15, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 10, 12, 14, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 28, 29}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 10, 12, 14, 16, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 30}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 10, 13, 15, 17, 18, 20, 21, 23, 24, 25, 27, 28, 29, 30} + +}; + +const mpc_uint32_t Cnk_lost[MAX_ENUM / 2][MAX_ENUM] = +{ + {0, 0, 1, 0, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + {0, 0, 1, 2, 6, 1, 11, 4, 28, 19, 9, 62, 50, 37, 23, 8, 120, 103, 85, 66, 46, 25, 3, 236, 212, 187, 161, 134, 106, 77, 47, 16}, + {0, 0, 0, 0, 6, 12, 29, 8, 44, 8, 91, 36, 226, 148, 57, 464, 344, 208, 55, 908, 718, 508, 277, 24, 1796, 1496, 1171, 820, 442, 36, 3697, 3232}, + {0, 0, 0, 0, 3, 1, 29, 58, 2, 46, 182, 17, 309, 23, 683, 228, 1716, 1036, 220, 3347, 2207, 877, 7529, 5758, 3734, 1434, 15218, 12293, 9017, 5363, 1303, 29576}, + {0, 0, 0, 0, 0, 2, 11, 8, 2, 4, 50, 232, 761, 46, 1093, 3824, 2004, 7816, 4756, 880, 12419, 6434, 31887, 23032, 12406, 65292, 50342, 32792, 12317, 119638, 92233, 60768}, + {0, 0, 0, 0, 0, 0, 1, 4, 44, 46, 50, 100, 332, 1093, 3187, 184, 4008, 14204, 5636, 26776, 11272, 56459, 30125, 127548, 85044, 31914, 228278, 147548, 49268, 454801, 312295, 142384}, + {0, 0, 0, 0, 0, 0, 0, 0, 28, 8, 182, 232, 332, 664, 1757, 4944, 13320, 944, 15148, 53552, 14792, 91600, 16987, 178184, 43588, 390776, 160546, 913112, 536372, 61352, 1564729, 828448}, + {0, 0, 0, 0, 0, 0, 0, 0, 7, 19, 91, 17, 761, 1093, 1757, 3514, 8458, 21778, 55490, 5102, 58654, 204518, 33974, 313105, 1015577, 534877, 1974229, 1086199, 4096463, 2535683, 499883, 6258916}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9, 36, 309, 46, 3187, 4944, 8458, 16916, 38694, 94184, 230358, 26868, 231386, 789648, 54177, 1069754, 3701783, 1481708, 6762211, 2470066, 13394357, 5505632}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 62, 226, 23, 1093, 184, 13320, 21778, 38694, 77388, 171572, 401930, 953086, 135896, 925544, 3076873, 8340931, 3654106, 13524422, 3509417, 22756699, 2596624}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50, 148, 683, 3824, 4008, 944, 55490, 94184, 171572, 343144, 745074, 1698160, 3931208, 662448, 3739321, 12080252, 32511574, 12481564, 49545413, 5193248}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 57, 228, 2004, 14204, 15148, 5102, 230358, 401930, 745074, 1490148, 3188308, 7119516, 16170572, 3132677, 15212929, 47724503, 127314931, 42642616}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23, 464, 1716, 7816, 5636, 53552, 58654, 26868, 953086, 1698160, 3188308, 6376616, 13496132, 29666704, 66353813, 14457878, 62182381, 189497312}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 344, 1036, 4756, 26776, 14792, 204518, 231386, 135896, 3931208, 7119516, 13496132, 26992264, 56658968, 123012781, 3252931, 65435312}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 208, 220, 880, 11272, 91600, 33974, 789648, 925544, 662448, 16170572, 29666704, 56658968, 113317936, 236330717, 508019104}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 103, 55, 3347, 12419, 56459, 16987, 313105, 54177, 3076873, 3739321, 3132677, 66353813, 123012781, 236330717} +}; + +static const mpc_uint8_t log2_tab[32] = +{ 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6}; + +static const mpc_uint8_t log2_lost[32] = +{ 0, 1, 0, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31}; + +mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k) +{ + unsigned int l = 0; + unsigned int code = r->buff[0] & ((1 << r->count) - 1); + + while( code == 0 ) { + l += r->count; + r->buff++; + code = r->buff[0]; + r->count = 8; + } + + while( ((1 << (r->count - 1)) & code) == 0 ) { + l++; + r->count--; + } + r->count--; + + while( r->count < k ) { + r->buff++; + r->count += 8; + code = (code << 8) | r->buff[0]; + } + + r->count -= k; + + return (l << k) | ((code >> r->count) & ((1 << k) - 1)); +} + +mpc_uint32_t mpc_bits_log_dec(mpc_bits_reader * r, mpc_uint_t max) +{ + mpc_uint32_t value = 0; + if (max == 0) + return 0; + if (log2_tab[max - 1] > 1) + value = mpc_bits_read(r, log2_tab[max - 1] - 1); + if (value >= log2_lost[max - 1]) + value = ((value << 1) | mpc_bits_read(r, 1)) - log2_lost[max - 1]; + return value; +} + +unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size) +{ + unsigned char tmp; + mpc_uint64_t size = 0; + unsigned int ret = 0; + + do { + tmp = mpc_bits_read(r, 8); + size = (size << 7) | (tmp & 0x7F); + ret++; + } while((tmp & 0x80)); + + *p_size = size; + return ret; +} + +int mpc_bits_get_block(mpc_bits_reader * r, mpc_block * p_block) +{ + int size = 2; + + p_block->size = 0; + p_block->key[0] = mpc_bits_read(r, 8); + p_block->key[1] = mpc_bits_read(r, 8); + + size += mpc_bits_get_size(r, &(p_block->size)); + + if (p_block->size >= size) // check if the block size doesn't conflict with the header size + p_block->size -= size; + + return size; +} + + + diff --git a/Mednafen/mednafen/mpcdec/mpc_bits_reader.h b/Mednafen/mednafen/mpcdec/mpc_bits_reader.h new file mode 100644 index 0000000000..a7d8d66905 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpc_bits_reader.h @@ -0,0 +1,149 @@ +/* + Copyright (c) 2007-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#define MAX_ENUM 32 + +MPC_API int mpc_bits_get_block(mpc_bits_reader * r, mpc_block * p_block); +mpc_int32_t mpc_bits_golomb_dec(mpc_bits_reader * r, const mpc_uint_t k); +MPC_API unsigned int mpc_bits_get_size(mpc_bits_reader * r, mpc_uint64_t * p_size); +mpc_uint32_t mpc_bits_log_dec(mpc_bits_reader * r, mpc_uint_t max); + +extern const mpc_uint32_t Cnk[MAX_ENUM / 2][MAX_ENUM]; +extern const mpc_uint8_t Cnk_len[MAX_ENUM / 2][MAX_ENUM]; +extern const mpc_uint32_t Cnk_lost[MAX_ENUM / 2][MAX_ENUM]; + +// can read up to 31 bits +static mpc_inline mpc_uint32_t mpc_bits_read(mpc_bits_reader * r, const unsigned int nb_bits) +{ + mpc_uint32_t ret; + + r->buff -= (int)(r->count - nb_bits) >> 3; + r->count = (r->count - nb_bits) & 0x07; + + ret = (r->buff[0] | (r->buff[-1] << 8)) >> r->count; + if (nb_bits > (16 - r->count)) { + ret |= (mpc_uint32_t)((r->buff[-2] << 16) | (r->buff[-3] << 24)) >> r->count; + if (nb_bits > 24 && r->count != 0) + ret |= r->buff[-4] << (32 - r->count); + } + + return ret & ((1 << nb_bits) - 1); +} + +// basic huffman decoding routine +// works with maximum lengths up to 16 +static mpc_inline mpc_int32_t mpc_bits_huff_dec(mpc_bits_reader * r, const mpc_huffman *Table) +{ + mpc_uint16_t code; + code = (mpc_uint16_t)((((r->buff[0] << 16) | (r->buff[1] << 8) | r->buff[2]) >> r->count) & 0xFFFF); + + while (code < Table->Code) Table++; + + r->buff -= (int)(r->count - Table->Length) >> 3; + r->count = (r->count - Table->Length) & 0x07; + + return Table->Value; +} + +static mpc_inline mpc_int32_t mpc_bits_can_dec(mpc_bits_reader * r, const mpc_can_data *can) +{ + mpc_uint16_t code; + mpc_huff_lut tmp; + const mpc_huffman * Table; + code = (mpc_uint16_t)((((r->buff[0] << 16) | (r->buff[1] << 8) | r->buff[2]) >> r->count) & 0xFFFF); + + tmp = can->lut[code >> (16 - LUT_DEPTH)]; + if (tmp.Length != 0) { + r->buff -= (int)(r->count - tmp.Length) >> 3; + r->count = (r->count - tmp.Length) & 0x07; + return tmp.Value; + } + + Table = can->table + (unsigned char)tmp.Value; + while (code < Table->Code) Table++; + + r->buff -= (int)(r->count - Table->Length) >> 3; + r->count = (r->count - Table->Length) & 0x07; + + return can->sym[(Table->Value - (code >> (16 - Table->Length))) & 0xFF] ; +} + +// LUT-based huffman decoding routine +// works with maximum lengths up to 16 +static mpc_inline mpc_int32_t mpc_bits_huff_lut(mpc_bits_reader * r, const mpc_lut_data *lut) +{ + mpc_uint16_t code; + mpc_huff_lut tmp; + const mpc_huffman * Table; + code = (mpc_uint16_t)((((r->buff[0] << 16) | (r->buff[1] << 8) | r->buff[2]) >> r->count) & 0xFFFF); + + tmp = lut->lut[code >> (16 - LUT_DEPTH)]; + if (tmp.Length != 0) { + r->buff -= (int)(r->count - tmp.Length) >> 3; + r->count = (r->count - tmp.Length) & 0x07; + return tmp.Value; + } + + Table = lut->table + (unsigned char)tmp.Value; + while (code < Table->Code) Table++; + + r->buff -= (int)(r->count - Table->Length) >> 3; + r->count = (r->count - Table->Length) & 0x07; + + return Table->Value; +} + +static mpc_inline mpc_uint32_t mpc_bits_enum_dec(mpc_bits_reader * r, mpc_uint_t k, mpc_uint_t n) +{ + mpc_uint32_t bits = 0; + mpc_uint32_t code; + const mpc_uint32_t * C = Cnk[k-1]; + + code = mpc_bits_read(r, Cnk_len[k-1][n-1] - 1); + + if (code >= Cnk_lost[k-1][n-1]) + code = ((code << 1) | mpc_bits_read(r, 1)) - Cnk_lost[k-1][n-1]; + + do { + n--; + if (code >= C[n]) { + bits |= 1 << n; + code -= C[n]; + C -= MAX_ENUM; + k--; + } + } while(k > 0); + + return bits; +} diff --git a/Mednafen/mednafen/mpcdec/mpc_decoder.c b/Mednafen/mednafen/mpcdec/mpc_decoder.c new file mode 100644 index 0000000000..b6ed8961fd --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpc_decoder.c @@ -0,0 +1,681 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file mpc_decoder.c +/// Core decoding routines and logic. + +#include +#include "mpcdec.h" +#include "minimax.h" +#include "decoder.h" +#include "huffman.h" +#include "internal.h" +#include "mpcdec_math.h" +#include "requant.h" +#include "mpc_bits_reader.h" + +//SV7 tables +extern const mpc_lut_data mpc_HuffQ [7] [2]; +extern const mpc_lut_data mpc_HuffHdr; +extern const mpc_huffman mpc_table_HuffSCFI [ 4]; +extern const mpc_lut_data mpc_HuffDSCF; + +//SV8 tables +extern const mpc_can_data mpc_can_Bands; +extern const mpc_can_data mpc_can_SCFI[2]; +extern const mpc_can_data mpc_can_DSCF[2]; +extern const mpc_can_data mpc_can_Res [2]; +extern const mpc_can_data mpc_can_Q [8][2]; +extern const mpc_can_data mpc_can_Q1; +extern const mpc_can_data mpc_can_Q9up; + +//------------------------------------------------------------------------------ +// types +//------------------------------------------------------------------------------ +enum +{ + MEMSIZE = MPC_DECODER_MEMSIZE, // overall buffer size + MEMSIZE2 = (MEMSIZE/2), // size of one buffer + MEMMASK = (MEMSIZE-1) +}; + +//------------------------------------------------------------------------------ +// forward declarations +//------------------------------------------------------------------------------ +void mpc_decoder_read_bitstream_sv7(mpc_decoder * d, mpc_bits_reader * r); +void mpc_decoder_read_bitstream_sv8(mpc_decoder * d, mpc_bits_reader * r, + mpc_bool_t is_key_frame); +static void mpc_decoder_requantisierung(mpc_decoder *d); + +/** + * set the scf indexes for seeking use + * needed only for sv7 seeking + * @param d + */ +void mpc_decoder_reset_scf(mpc_decoder * d, int value) +{ + memset(d->SCF_Index_L, value, sizeof d->SCF_Index_L ); + memset(d->SCF_Index_R, value, sizeof d->SCF_Index_R ); +} + + +void mpc_decoder_setup(mpc_decoder *d) +{ + memset(d, 0, sizeof *d); + + d->__r1 = 1; + d->__r2 = 1; + + mpc_decoder_init_quant(d, 1.0f); +} + +void mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si) +{ + d->stream_version = si->stream_version; + d->ms = si->ms; + d->max_band = si->max_band; + d->channels = si->channels; + d->samples_to_skip = MPC_DECODER_SYNTH_DELAY + si->beg_silence; + + if (si->stream_version == 7 && si->is_true_gapless) + d->samples = ((si->samples + MPC_FRAME_LENGTH - 1) / MPC_FRAME_LENGTH) * MPC_FRAME_LENGTH; + else + d->samples = si->samples; +} + +mpc_decoder * mpc_decoder_init(mpc_streaminfo *si) +{ + mpc_decoder* p_tmp = malloc(sizeof(mpc_decoder)); + + if (p_tmp != 0) { + mpc_decoder_setup(p_tmp); + mpc_decoder_set_streaminfo(p_tmp, si); + huff_init_lut(LUT_DEPTH); // FIXME : this needs to be called only once when the library is loaded + } + + return p_tmp; +} + +void mpc_decoder_exit(mpc_decoder *d) +{ + free(d); +} + +void mpc_decoder_decode_frame(mpc_decoder * d, + mpc_bits_reader * r, + mpc_frame_info * i) +{ + mpc_bits_reader r_sav = *r; + mpc_int64_t samples_left; + + samples_left = d->samples - d->decoded_samples + MPC_DECODER_SYNTH_DELAY; + + if (samples_left <= 0 && d->samples != 0) { + i->samples = 0; + i->bits = -1; + return; + } + + if (d->stream_version == 8) + mpc_decoder_read_bitstream_sv8(d, r, i->is_key_frame); + else + mpc_decoder_read_bitstream_sv7(d, r); + + if (d->samples_to_skip < MPC_FRAME_LENGTH + MPC_DECODER_SYNTH_DELAY) { + mpc_decoder_requantisierung(d); + mpc_decoder_synthese_filter_float(d, i->buffer, d->channels); + } + + d->decoded_samples += MPC_FRAME_LENGTH; + + // reconstruct exact filelength + if (d->decoded_samples - d->samples < MPC_FRAME_LENGTH && d->stream_version == 7) { + int last_frame_samples = mpc_bits_read(r, 11); + if (d->decoded_samples == d->samples) { + if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH; + d->samples += last_frame_samples - MPC_FRAME_LENGTH; + samples_left += last_frame_samples - MPC_FRAME_LENGTH; + } + } + + i->samples = samples_left > MPC_FRAME_LENGTH ? MPC_FRAME_LENGTH : samples_left < 0 ? 0 : (mpc_uint32_t) samples_left; + i->bits = (mpc_uint32_t) (((r->buff - r_sav.buff) << 3) + r_sav.count - r->count); + + if (d->samples_to_skip) { + if (i->samples <= d->samples_to_skip) { + d->samples_to_skip -= i->samples; + i->samples = 0; + } else { + i->samples -= d->samples_to_skip; + memmove(i->buffer, i->buffer + d->samples_to_skip * d->channels, + i->samples * d->channels * sizeof (MPC_SAMPLE_FORMAT)); + d->samples_to_skip = 0; + } + } +} + +void +mpc_decoder_requantisierung(mpc_decoder *d) +{ + mpc_int32_t Band; + mpc_int32_t n; + MPC_SAMPLE_FORMAT facL; + MPC_SAMPLE_FORMAT facR; + MPC_SAMPLE_FORMAT templ; + MPC_SAMPLE_FORMAT tempr; + MPC_SAMPLE_FORMAT* YL; + MPC_SAMPLE_FORMAT* YR; + mpc_int16_t* L; + mpc_int16_t* R; + const mpc_int32_t Last_Band = d->max_band; + +#ifdef MPC_FIXED_POINT +#if MPC_FIXED_POINT_FRACTPART == 14 +#define MPC_MULTIPLY_SCF(CcVal, SCF_idx) \ + MPC_MULTIPLY_EX(CcVal, d->SCF[SCF_idx], d->SCF_shift[SCF_idx]) +#else + +#error FIXME, Cc table is in 18.14 format + +#endif +#else +#define MPC_MULTIPLY_SCF(CcVal, SCF_idx) \ + MPC_MULTIPLY(CcVal, d->SCF[SCF_idx]) +#endif + // requantization and scaling of subband-samples + for ( Band = 0; Band <= Last_Band; Band++ ) { // setting pointers + YL = d->Y_L[0] + Band; + YR = d->Y_R[0] + Band; + L = d->Q[Band].L; + R = d->Q[Band].R; + /************************** MS-coded **************************/ + if ( d->MS_Flag [Band] ) { + if ( d->Res_L [Band] ) { + if ( d->Res_R [Band] ) { // M!=0, S!=0 + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); + for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { + *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++)); + *YR = templ - tempr; + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); + for ( ; n < 24; n++, YL += 32, YR += 32 ) { + *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++)); + *YR = templ - tempr; + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); + for ( ; n < 36; n++, YL += 32, YR += 32 ) { + *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++)); + *YR = templ - tempr; + } + } else { // M!=0, S==0 + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); + for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { + *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); + for ( ; n < 24; n++, YL += 32, YR += 32 ) { + *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); + for ( ; n < 36; n++, YL += 32, YR += 32 ) { + *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + } + } + } else { + if (d->Res_R[Band]) // M==0, S!=0 + { + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); + for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { + *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++))); + } + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); + for ( ; n < 24; n++, YL += 32, YR += 32 ) { + *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++))); + } + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); + for ( ; n < 36; n++, YL += 32, YR += 32 ) { + *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++))); + } + } else { // M==0, S==0 + for ( n = 0; n < 36; n++, YL += 32, YR += 32 ) { + *YR = *YL = 0; + } + } + } + } + /************************** LR-coded **************************/ + else { + if ( d->Res_L [Band] ) { + if ( d->Res_R [Band] ) { // L!=0, R!=0 + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); + for (n = 0; n < 12; n++, YL += 32, YR += 32 ) { + *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); + for (; n < 24; n++, YL += 32, YR += 32 ) { + *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); + for (; n < 36; n++, YL += 32, YR += 32 ) { + *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); + } + } else { // L!=0, R==0 + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF); + for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { + *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + *YR = 0; + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF); + for ( ; n < 24; n++, YL += 32, YR += 32 ) { + *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + *YR = 0; + } + facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF); + for ( ; n < 36; n++, YL += 32, YR += 32 ) { + *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++); + *YR = 0; + } + } + } + else { + if ( d->Res_R [Band] ) { // L==0, R!=0 + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF); + for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) { + *YL = 0; + *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); + } + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF); + for ( ; n < 24; n++, YL += 32, YR += 32 ) { + *YL = 0; + *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); + } + facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF); + for ( ; n < 36; n++, YL += 32, YR += 32 ) { + *YL = 0; + *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++); + } + } else { // L==0, R==0 + for ( n = 0; n < 36; n++, YL += 32, YR += 32 ) { + *YR = *YL = 0; + } + } + } + } + } +} + +void mpc_decoder_read_bitstream_sv7(mpc_decoder * d, mpc_bits_reader * r) +{ + // these arrays hold decoding results for bundled quantizers (3- and 5-step) + static const mpc_int32_t idx30[] = { -1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1}; + static const mpc_int32_t idx31[] = { -1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1}; + static const mpc_int32_t idx32[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + static const mpc_int32_t idx50[] = { -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2}; + static const mpc_int32_t idx51[] = { -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; + + mpc_int32_t n, idx, Max_used_Band = 0; + + /***************************** Header *****************************/ + + // first subband + d->Res_L[0] = mpc_bits_read(r, 4); + d->Res_R[0] = mpc_bits_read(r, 4); + if (!(d->Res_L[0] == 0 && d->Res_R[0] == 0)) { + if (d->ms) + d->MS_Flag[0] = mpc_bits_read(r, 1); + Max_used_Band = 1; + } + + // consecutive subbands + for ( n = 1; n <= d->max_band; n++ ) { + idx = mpc_bits_huff_lut(r, & mpc_HuffHdr); + d->Res_L[n] = (idx!=4) ? d->Res_L[n - 1] + idx : (int) mpc_bits_read(r, 4); + + idx = mpc_bits_huff_lut(r, & mpc_HuffHdr); + d->Res_R[n] = (idx!=4) ? d->Res_R[n - 1] + idx : (int) mpc_bits_read(r, 4); + + if (!(d->Res_L[n] == 0 && d->Res_R[n] == 0)) { + if (d->ms) + d->MS_Flag[n] = mpc_bits_read(r, 1); + Max_used_Band = n + 1; + } + } + + /****************************** SCFI ******************************/ + for ( n = 0; n < Max_used_Band; n++ ) { + if (d->Res_L[n]) + d->SCFI_L[n] = mpc_bits_huff_dec(r, mpc_table_HuffSCFI); + if (d->Res_R[n]) + d->SCFI_R[n] = mpc_bits_huff_dec(r, mpc_table_HuffSCFI); + } + + /**************************** SCF/DSCF ****************************/ + for ( n = 0; n < Max_used_Band; n++ ) { + mpc_int32_t * SCF = d->SCF_Index_L[n]; + mpc_uint32_t Res = d->Res_L[n], SCFI = d->SCFI_L[n]; + do { + if (Res) { + switch (SCFI) { + case 1: + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6); + SCF[2] = SCF[1]; + break; + case 3: + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); + SCF[1] = SCF[0]; + SCF[2] = SCF[1]; + break; + case 2: + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); + SCF[1] = SCF[0]; + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6); + break; + case 0: + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6); + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6); + idx = mpc_bits_huff_lut(r, & mpc_HuffDSCF); + SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6); + break; + default: + return; + } + if (SCF[0] > 1024) + SCF[0] = 0x8080; + if (SCF[1] > 1024) + SCF[1] = 0x8080; + if (SCF[2] > 1024) + SCF[2] = 0x8080; + } + Res = d->Res_R[n]; + SCFI = d->SCFI_R[n]; + } while ( SCF == d->SCF_Index_L[n] && (SCF = d->SCF_Index_R[n])); + } + +// if (d->seeking == TRUE) +// return; + + /***************************** Samples ****************************/ + for ( n = 0; n < Max_used_Band; n++ ) { + mpc_int16_t *q = d->Q[n].L, Res = d->Res_L[n]; + do { + mpc_int32_t k; + const mpc_lut_data *Table; + switch (Res) { + case -2: case -3: case -4: case -5: case -6: case -7: case -8: case -9: + case -10: case -11: case -12: case -13: case -14: case -15: case -16: case -17: case 0: + break; + case -1: + for (k=0; k<36; k++ ) { + mpc_uint32_t tmp = mpc_random_int(d); + q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; + } + break; + case 1: + Table = & mpc_HuffQ[0][mpc_bits_read(r, 1)]; + for ( k = 0; k < 36; k += 3) { + idx = mpc_bits_huff_lut(r, Table); + q[k] = idx30[idx]; + q[k + 1] = idx31[idx]; + q[k + 2] = idx32[idx]; + } + break; + case 2: + Table = & mpc_HuffQ[1][mpc_bits_read(r, 1)]; + for ( k = 0; k < 36; k += 2) { + idx = mpc_bits_huff_lut(r, Table); + q[k] = idx50[idx]; + q[k + 1] = idx51[idx]; + } + break; + case 3: + case 4: + case 5: + case 6: + case 7: + Table = & mpc_HuffQ[Res - 1][mpc_bits_read(r, 1)]; + for ( k = 0; k < 36; k++ ) + q[k] = mpc_bits_huff_lut(r, Table); + break; + case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: + for ( k = 0; k < 36; k++ ) + q[k] = (mpc_int32_t)mpc_bits_read(r, Res_bit[Res]) - Dc[Res]; + break; + default: + return; + } + + Res = d->Res_R[n]; + } while (q == d->Q[n].L && (q = d->Q[n].R)); + } +} + +void mpc_decoder_read_bitstream_sv8(mpc_decoder * d, mpc_bits_reader * r, mpc_bool_t is_key_frame) +{ + // these arrays hold decoding results for bundled quantizers (3- and 5-step) + static const mpc_int8_t idx50[125] = {-2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2}; + static const mpc_int8_t idx51[125] = {-2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2}; + static const mpc_int8_t idx52[125] = {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}; + + mpc_int32_t n, Max_used_Band; + const mpc_can_data * Table, * Tables[2]; + + /***************************** Header *****************************/ + + if (is_key_frame == MPC_TRUE) { + Max_used_Band = mpc_bits_log_dec(r, d->max_band + 1); + } else { + Max_used_Band = d->last_max_band + mpc_bits_can_dec(r, & mpc_can_Bands); + if (Max_used_Band > 32) Max_used_Band -= 33; + } + d->last_max_band = Max_used_Band; + + if (Max_used_Band) { + d->Res_L[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]); + d->Res_R[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]); + if (d->Res_L[Max_used_Band-1] > 15) d->Res_L[Max_used_Band-1] -= 17; + if (d->Res_R[Max_used_Band-1] > 15) d->Res_R[Max_used_Band-1] -= 17; + for ( n = Max_used_Band - 2; n >= 0; n--) { + d->Res_L[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1]; + if (d->Res_L[n] > 15) d->Res_L[n] -= 17; + d->Res_R[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1]; + if (d->Res_R[n] > 15) d->Res_R[n] -= 17; + } + + if (d->ms) { + mpc_uint_t cnt = 0, tot = 0; + mpc_uint32_t tmp = 0; + for( n = 0; n < Max_used_Band; n++) + if ( d->Res_L[n] != 0 || d->Res_R[n] != 0 ) + tot++; + cnt = mpc_bits_log_dec(r, tot); + if (cnt != 0 && cnt != tot) + tmp = mpc_bits_enum_dec(r, mini(cnt, tot-cnt), tot); + if (cnt * 2 > tot) tmp = ~tmp; + for( n = Max_used_Band - 1; n >= 0; n--) + if ( d->Res_L[n] != 0 || d->Res_R[n] != 0 ) { + d->MS_Flag[n] = tmp & 1; + tmp >>= 1; + } + } + } + + for( n = Max_used_Band; n <= d->max_band; n++) + d->Res_L[n] = d->Res_R[n] = 0; + + /****************************** SCFI ******************************/ + if (is_key_frame == MPC_TRUE){ + for( n = 0; n < 32; n++) + d->DSCF_Flag_L[n] = d->DSCF_Flag_R[n] = 1; // new block -> force key frame + } + + Tables[0] = & mpc_can_SCFI[0]; + Tables[1] = & mpc_can_SCFI[1]; + for ( n = 0; n < Max_used_Band; n++ ) { + int tmp = 0, cnt = -1; + if (d->Res_L[n]) cnt++; + if (d->Res_R[n]) cnt++; + if (cnt >= 0) { + tmp = mpc_bits_can_dec(r, Tables[cnt]); + if (d->Res_L[n]) d->SCFI_L[n] = tmp >> (2 * cnt); + if (d->Res_R[n]) d->SCFI_R[n] = tmp & 3; + } + } + + /**************************** SCF/DSCF ****************************/ + + for ( n = 0; n < Max_used_Band; n++ ) { + mpc_int32_t * SCF = d->SCF_Index_L[n]; + mpc_uint32_t Res = d->Res_L[n], SCFI = d->SCFI_L[n]; + mpc_bool_t * DSCF_Flag = &d->DSCF_Flag_L[n]; + + do { + if ( Res ) { + int m; + if (*DSCF_Flag == 1) { + SCF[0] = (mpc_int32_t)mpc_bits_read(r, 7) - 6; + *DSCF_Flag = 0; + } else { + mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[1]); + if (tmp == 64) + tmp += mpc_bits_read(r, 6); + SCF[0] = ((SCF[2] - 25 + tmp) & 127) - 6; + } + for( m = 0; m < 2; m++){ + if (((SCFI << m) & 2) == 0) { + mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[0]); + if (tmp == 31) + tmp = 64 + mpc_bits_read(r, 6); + SCF[m + 1] = ((SCF[m] - 25 + tmp) & 127) - 6; + } else + SCF[m + 1] = SCF[m]; + } + } + Res = d->Res_R[n]; + SCFI = d->SCFI_R[n]; + DSCF_Flag = &d->DSCF_Flag_R[n]; + } while ( SCF == d->SCF_Index_L[n] && (SCF = d->SCF_Index_R[n])); + } + + /***************************** Samples ****************************/ + for ( n = 0; n < Max_used_Band; n++ ) { + mpc_int16_t *q = d->Q[n].L, Res = d->Res_L[n]; + static const unsigned int thres[] = {0, 0, 3, 0, 0, 1, 3, 4, 8}; + static const mpc_int8_t HuffQ2_var[5*5*5] = + {6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6, 5, 4, 3, 4, 5, 4, 3, 2, 3, 4, 5, 4, 3, 4, 5, 6, 5, 4, 5, 6}; + + do { + mpc_uint32_t k = 0, idx = 1; + if (Res != 0) { + if (Res == 2) { + Tables[0] = & mpc_can_Q [0][0]; + Tables[1] = & mpc_can_Q [0][1]; + idx = 2 * thres[Res]; + for ( ; k < 36; k += 3) { + int tmp = mpc_bits_can_dec(r, Tables[idx > thres[Res]]); + q[k] = idx50[tmp]; + q[k + 1] = idx51[tmp]; + q[k + 2] = idx52[tmp]; + idx = (idx >> 1) + HuffQ2_var[tmp]; + } + } else if (Res == 1) { + Table = & mpc_can_Q1; + for( ; k < 36; ){ + mpc_uint32_t kmax = k + 18; + mpc_uint_t cnt = mpc_bits_can_dec(r, Table); + idx = 0; + if (cnt > 0 && cnt < 18) + idx = mpc_bits_enum_dec(r, cnt <= 9 ? cnt : 18 - cnt, 18); + if (cnt > 9) idx = ~idx; + for ( ; k < kmax; k++) { + q[k] = 0; + if ( idx & (1 << 17) ) + q[k] = (mpc_bits_read(r, 1) << 1) - 1; + idx <<= 1; + } + } + } else if (Res == -1) { + for ( ; k<36; k++ ) { + mpc_uint32_t tmp = mpc_random_int(d); + q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510; + } + } else if (Res <= 4) { + Table = & mpc_can_Q[1][Res - 3]; + for ( ; k < 36; k += 2 ) { + union { + mpc_int8_t sym; + struct { mpc_int8_t s1:4, s2:4; }; + } tmp; + tmp.sym = mpc_bits_can_dec(r, Table); + q[k] = tmp.s1; + q[k + 1] = tmp.s2; + } + } else if (Res <= 8) { + Tables[0] = & mpc_can_Q [Res - 3][0]; + Tables[1] = & mpc_can_Q [Res - 3][1]; + idx = 2 * thres[Res]; + for ( ; k < 36; k++ ) { + q[k] = mpc_bits_can_dec(r, Tables[idx > thres[Res]]); + idx = (idx >> 1) + absi(q[k]); + } + } else { + for ( ; k < 36; k++ ) { + q[k] = (unsigned char) mpc_bits_can_dec(r, & mpc_can_Q9up); + if (Res != 9) + q[k] = (q[k] << (Res - 9)) | mpc_bits_read(r, Res - 9); + q[k] -= Dc[Res]; + } + } + } + + Res = d->Res_R[n]; + } while (q == d->Q[n].L && (q = d->Q[n].R)); + } +} + diff --git a/Mednafen/mednafen/mpcdec/mpc_demux.c b/Mednafen/mednafen/mpcdec/mpc_demux.c new file mode 100644 index 0000000000..20f51a762e --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpc_demux.c @@ -0,0 +1,733 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include "streaminfo.h" +#include "mpcdec.h" +#include "minimax.h" +#include "internal.h" +#include "decoder.h" +#include "huffman.h" +#include "mpc_bits_reader.h" + +/// maximum number of seek points in the table. The distance between points will +/// be adapted so this value is never exceeded. +#define MAX_SEEK_TABLE_SIZE 65536 + +// streaminfo.c +mpc_status streaminfo_read_header_sv8(mpc_streaminfo* si, + const mpc_bits_reader * r_in, + mpc_size_t block_size); +mpc_status streaminfo_read_header_sv7(mpc_streaminfo* si, mpc_bits_reader * r_in); +void streaminfo_encoder_info(mpc_streaminfo* si, const mpc_bits_reader * r_in); +void streaminfo_gain(mpc_streaminfo* si, const mpc_bits_reader * r_in); + +// mpc_decoder.c +void mpc_decoder_reset_scf(mpc_decoder * d, int value); + +enum { + MPC_BUFFER_SWAP = 1, + MPC_BUFFER_FULL = 2, +}; + +static void mpc_demux_clear_buff(mpc_demux * d) +{ + d->bytes_total = 0; + d->bits_reader.buff = d->buffer; + d->bits_reader.count = 8; + d->block_bits = 0; + d->block_frames = 0; +} + +// Returns the amount of unread bytes in the demux buffer. +// Unchecked version - may return a negative value when we've been reading +// past the end of the valid data as a result of some problem with the file. +static mpc_int32_t mpc_unread_bytes_unchecked(mpc_demux * d) { + return d->bytes_total + d->buffer - d->bits_reader.buff - ((8 - d->bits_reader.count) >> 3); +} + + +// Returns the number of bytes available in the buffer. +static mpc_uint32_t +mpc_demux_fill(mpc_demux * d, mpc_uint32_t min_bytes, int flags) +{ + mpc_uint32_t unread_bytes = (mpc_uint32_t) mpc_unread_bytes_unchecked(d); + int offset = 0; + + if ((mpc_int32_t) unread_bytes < 0) + return 0; // Error - we've been reading past the end of the buffer - abort + + if (min_bytes == 0 || min_bytes > DEMUX_BUFFER_SIZE || + (unread_bytes < min_bytes && (flags & MPC_BUFFER_FULL) != 0 )) + min_bytes = DEMUX_BUFFER_SIZE; + + if (unread_bytes < min_bytes) { + mpc_uint32_t bytes2read = min_bytes - unread_bytes; + mpc_uint32_t bytes_free = DEMUX_BUFFER_SIZE - d->bytes_total; + mpc_uint32_t bytesread; + + if (flags & MPC_BUFFER_SWAP) { + bytes2read &= -1 << 2; + offset = (unread_bytes + 3) & ( -1 << 2); + offset -= unread_bytes; + } + + if (bytes2read > bytes_free) { + if (d->bits_reader.count == 0) { + d->bits_reader.count = 8; + d->bits_reader.buff++; + } + memmove(d->buffer + offset, d->bits_reader.buff, unread_bytes); + d->bits_reader.buff = d->buffer + offset; + d->bytes_total = unread_bytes + offset; + } + bytesread = d->r->read(d->r, d->buffer + d->bytes_total, bytes2read); + if (bytesread < bytes2read) { + memset(d->buffer + d->bytes_total + bytesread, 0, bytes2read - bytesread); // FIXME : why ? + } + if (flags & MPC_BUFFER_SWAP) { + unsigned int i, * tmp = (unsigned int *) (d->buffer + d->bytes_total); + for(i = 0 ;i < (bytes2read >> 2); i++) + tmp[i] = mpc_swap32(tmp[i]); + } + d->bytes_total += bytesread; + unread_bytes += bytesread; + } + + return unread_bytes; +} + +/** + * seek to a bit position in the stream + * @param d demuxer context + * @param fpos position in the stream in bits from the beginning of mpc datas + * @param min_bytes number of bytes to load after seeking + */ +static mpc_status +mpc_demux_seek(mpc_demux * d, mpc_seek_t fpos, mpc_uint32_t min_bytes) { + mpc_seek_t start_pos, end_pos; + mpc_int_t bit_offset; + + // get current buffer position + end_pos = ((mpc_seek_t)(d->r->tell(d->r))) << 3; + start_pos = end_pos - (d->bytes_total << 3); + + if (fpos >= start_pos && fpos < end_pos) { + d->bits_reader.buff = d->buffer + ((fpos - start_pos) >> 3); + bit_offset = fpos & 7; + d->block_bits = 0; + d->block_frames = 0; + } else { + mpc_seek_t next_pos = fpos >> 3; + if (d->si.stream_version == 7) + next_pos = ((next_pos - d->si.header_position) & (-1 << 2)) + d->si.header_position; + bit_offset = (int) (fpos - (next_pos << 3)); + + mpc_demux_clear_buff(d); + if (!d->r->seek(d->r, (mpc_int32_t) next_pos)) + return MPC_STATUS_FAIL; + } + + if (d->si.stream_version == 7) + mpc_demux_fill(d, (min_bytes + ((bit_offset + 7) >> 3) + 3) & (~3), MPC_BUFFER_SWAP); + else + mpc_demux_fill(d, min_bytes + ((bit_offset + 7) >> 3), 0); + d->bits_reader.buff += bit_offset >> 3; + d->bits_reader.count = 8 - (bit_offset & 7); + + return MPC_STATUS_OK; +} + +/** + * return the current position in the stream (in bits) from the beginning + * of the file + * @param d demuxer context + * @return current stream position in bits + */ +mpc_seek_t mpc_demux_pos(mpc_demux * d) +{ + return (((mpc_seek_t)(d->r->tell(d->r)) - d->bytes_total + + d->bits_reader.buff - d->buffer) << 3) + 8 - d->bits_reader.count; +} + +/** + * Searches for a ID3v2-tag and reads the length (in bytes) of it. + * + * @param d demuxer context + * @return size of tag, in bytes + * @return MPC_STATUS_FAIL on errors of any kind + */ +static mpc_int32_t mpc_demux_skip_id3v2(mpc_demux * d) +{ + mpc_uint8_t tmp [4]; + mpc_bool_t footerPresent; // ID3v2.4-flag + mpc_int32_t size; + + // we must be at the beginning of the stream + mpc_demux_fill(d, 3, 0); + + // check id3-tag + if ( 0 != memcmp( d->bits_reader.buff, "ID3", 3 ) ) + return 0; + + mpc_demux_fill(d, 10, 0); + + mpc_bits_read(&d->bits_reader, 24); // read ID3 + mpc_bits_read(&d->bits_reader, 16); // read tag version + + tmp[0] = mpc_bits_read(&d->bits_reader, 8); // read flags + footerPresent = tmp[0] & 0x10; + if ( tmp[0] & 0x0F ) + return MPC_STATUS_FAIL; // not (yet???) allowed + + tmp[0] = mpc_bits_read(&d->bits_reader, 8); // read size + tmp[1] = mpc_bits_read(&d->bits_reader, 8); // read size + tmp[2] = mpc_bits_read(&d->bits_reader, 8); // read size + tmp[3] = mpc_bits_read(&d->bits_reader, 8); // read size + + if ( (tmp[0] | tmp[1] | tmp[2] | tmp[3]) & 0x80 ) + return MPC_STATUS_FAIL; // not allowed + + // read headerSize (syncsave: 4 * $0xxxxxxx = 28 significant bits) + size = tmp[0] << 21; + size |= tmp[1] << 14; + size |= tmp[2] << 7; + size |= tmp[3]; + + size += 10; //header + + if ( footerPresent ) size += 10; + + // This is called before file headers get read, streamversion etc isn't yet known, demuxing isn't properly initialized and we can't call mpc_demux_seek() from here. + mpc_demux_clear_buff(d); + if (!d->r->seek(d->r, size)) + return MPC_STATUS_FAIL; + + return size; +} + +static mpc_status mpc_demux_seek_init(mpc_demux * d) +{ + size_t seek_table_size; + if (d->seek_table != 0) + return MPC_STATUS_OK; + + d->seek_pwr = 6; + if (d->si.block_pwr > d->seek_pwr) + d->seek_pwr = d->si.block_pwr; + seek_table_size = (2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)); + while (seek_table_size > MAX_SEEK_TABLE_SIZE) { + d->seek_pwr++; + seek_table_size = (2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr)); + } + d->seek_table = malloc((size_t)(seek_table_size * sizeof(mpc_seek_t))); + if (d->seek_table == 0) + return MPC_STATUS_FAIL; + d->seek_table[0] = (mpc_seek_t)mpc_demux_pos(d); + d->seek_table_size = 1; + + return MPC_STATUS_OK; +} + +static mpc_status mpc_demux_ST(mpc_demux * d) +{ + mpc_uint64_t tmp; + mpc_seek_t * table, last[2]; + mpc_bits_reader r = d->bits_reader; + mpc_uint_t i, diff_pwr = 0, mask; + mpc_uint32_t file_table_size; + + if (d->seek_table != 0) + return MPC_STATUS_OK; + + mpc_bits_get_size(&r, &tmp); + file_table_size = (mpc_seek_t) tmp; + d->seek_pwr = d->si.block_pwr + mpc_bits_read(&r, 4); + + tmp = 2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr); + while (tmp > MAX_SEEK_TABLE_SIZE) { + d->seek_pwr++; + diff_pwr++; + tmp = 2 + d->si.samples / (MPC_FRAME_LENGTH << d->seek_pwr); + } + if ((file_table_size >> diff_pwr) > tmp) + file_table_size = tmp << diff_pwr; + d->seek_table = malloc((size_t) (tmp * sizeof(mpc_seek_t))); + d->seek_table_size = (file_table_size + ((1 << diff_pwr) - 1)) >> diff_pwr; + + table = d->seek_table; + mpc_bits_get_size(&r, &tmp); + table[0] = last[0] = (mpc_seek_t) (tmp + d->si.header_position) * 8; + + if (d->seek_table_size == 1) + return MPC_STATUS_OK; + + mpc_bits_get_size(&r, &tmp); + last[1] = (mpc_seek_t) (tmp + d->si.header_position) * 8; + if (diff_pwr == 0) table[1] = last[1]; + + mask = (1 << diff_pwr) - 1; + for (i = 2; i < file_table_size; i++) { + int code = mpc_bits_golomb_dec(&r, 12); + if (code & 1) + code = -(code & (-1 << 1)); + code <<= 2; + last[i & 1] = code + 2 * last[(i-1) & 1] - last[i & 1]; + if ((i & mask) == 0) + table[i >> diff_pwr] = last[i & 1]; + } + return MPC_STATUS_OK; +} + +static mpc_status mpc_demux_SP(mpc_demux * d, int size, int block_size) +{ + mpc_seek_t cur; + mpc_uint64_t ptr; + mpc_block b; + int st_head_size; + + cur = mpc_demux_pos(d); + mpc_bits_get_size(&d->bits_reader, &ptr); + MPC_AUTO_FAIL( mpc_demux_seek(d, (ptr - size) * 8 + cur, 11) ); + st_head_size = mpc_bits_get_block(&d->bits_reader, &b); + if (memcmp(b.key, "ST", 2) == 0) { + d->chap_pos = (ptr - size + b.size + st_head_size) * 8 + cur; + d->chap_nb = -1; + if (mpc_demux_fill(d, (mpc_uint32_t) b.size, 0) < b.size) + return MPC_STATUS_FAIL; + MPC_AUTO_FAIL( mpc_demux_ST(d) ); + } + return mpc_demux_seek(d, cur, 11 + block_size); +} + +static void mpc_demux_chap_empty(mpc_demux * d) { + free(d->chap); d->chap = 0; + d->chap_nb = 0; // -1 for undefined, 0 for no chapters + d->chap_pos = 0; +} + +static mpc_status mpc_demux_chap_find_inner(mpc_demux * d) +{ + mpc_block b; + int tag_size = 0, chap_size = 0, size, i = 0; + + d->chap_nb = 0; + + if (d->si.stream_version < 8) + return MPC_STATUS_OK; + + if (d->chap_pos == 0) { + mpc_uint64_t cur_pos = (d->si.header_position + 4) * 8; + MPC_AUTO_FAIL( mpc_demux_seek(d, cur_pos, 11) ); // seek to the beginning of the stream + size = mpc_bits_get_block(&d->bits_reader, &b); + while (memcmp(b.key, "SE", 2) != 0) { + mpc_uint64_t new_pos = cur_pos + (size + b.size) * 8; + MPC_AUTO_FAIL(mpc_check_key(b.key)); + + if (memcmp(b.key, "CT", 2) == 0) { + if (d->chap_pos == 0) d->chap_pos = cur_pos; + } else { + d->chap_pos = 0; + } + if (new_pos <= cur_pos) + return MPC_STATUS_FAIL; + cur_pos = new_pos; + + MPC_AUTO_FAIL( mpc_demux_seek(d, cur_pos, 11) ); + size = mpc_bits_get_block(&d->bits_reader, &b); + } + if (d->chap_pos == 0) + d->chap_pos = cur_pos; + } + + mpc_demux_seek(d, d->chap_pos, 20); + size = mpc_bits_get_block(&d->bits_reader, &b); + while (memcmp(b.key, "CT", 2) == 0) { + mpc_uint64_t chap_sample; + d->chap_nb++; + chap_size += size; + size = mpc_bits_get_size(&d->bits_reader, &chap_sample) + 4; + chap_size += size; + tag_size += b.size - size; + MPC_AUTO_FAIL( mpc_demux_seek(d, d->chap_pos + (chap_size + tag_size) * 8, 20) ); + size = mpc_bits_get_block(&d->bits_reader, &b); + } + + if (d->chap_nb > 0) { + char * ptag; + d->chap = malloc(sizeof(mpc_chap_info) * d->chap_nb + tag_size); + if (d->chap == 0) + return MPC_STATUS_FAIL; + + ptag = (char*)(d->chap + d->chap_nb); + + MPC_AUTO_FAIL( mpc_demux_seek(d, d->chap_pos, 11) ); + size = mpc_bits_get_block(&d->bits_reader, &b); + while (memcmp(b.key, "CT", 2) == 0) { + mpc_uint_t tmp_size; + char * tmp_ptag = ptag; + if (mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0) < b.size) + return MPC_STATUS_FAIL; + size = mpc_bits_get_size(&d->bits_reader, &d->chap[i].sample) + 4; + d->chap[i].gain = (mpc_uint16_t) mpc_bits_read(&d->bits_reader, 16); + d->chap[i].peak = (mpc_uint16_t) mpc_bits_read(&d->bits_reader, 16); + + tmp_size = b.size - size; + do { + mpc_uint_t rd_size = tmp_size; + mpc_uint8_t * tmp_buff = d->bits_reader.buff + ((8 - d->bits_reader.count) >> 3); + mpc_uint32_t avail_bytes = d->bytes_total + d->buffer - tmp_buff; + rd_size = mini(rd_size, avail_bytes); + memcpy(tmp_ptag, tmp_buff, rd_size); + tmp_size -= rd_size; + tmp_ptag += rd_size; + d->bits_reader.buff += rd_size; + mpc_demux_fill(d, tmp_size, 0); + } while (tmp_size > 0); + + d->chap[i].tag_size = b.size - size; + d->chap[i].tag = ptag; + ptag += b.size - size; + i++; + size = mpc_bits_get_block(&d->bits_reader, &b); + } + } + + d->bits_reader.buff -= size; + return MPC_STATUS_OK; +} + +static mpc_status mpc_demux_chap_find(mpc_demux * d) { + mpc_status s = mpc_demux_chap_find_inner(d); + if (MPC_IS_FAILURE(s)) + mpc_demux_chap_empty(d); + return s; +} + +/** + * Gets the number of chapters in the stream + * @param d pointer to a musepack demuxer + * @return the number of chapters found in the stream + */ +mpc_int_t mpc_demux_chap_nb(mpc_demux * d) +{ + if (d->chap_nb == -1) + mpc_demux_chap_find(d); + return d->chap_nb; +} + +/** + * Gets datas associated to a given chapter + * The chapter tag is an APEv2 tag without the preamble + * @param d pointer to a musepack demuxer + * @param chap_nb chapter number you want datas (from 0 to mpc_demux_chap_nb(d) - 1) + * @return the chapter information structure + */ +mpc_chap_info const * mpc_demux_chap(mpc_demux * d, int chap_nb) +{ + if (d->chap_nb == -1) + mpc_demux_chap_find(d); + if (chap_nb >= d->chap_nb || chap_nb < 0) + return 0; + return &d->chap[chap_nb]; +} + +static mpc_status mpc_demux_header(mpc_demux * d) +{ + char magic[4]; + + d->si.pns = 0xFF; + d->si.profile_name = "n.a."; + + // get header position + d->si.header_position = mpc_demux_skip_id3v2(d); + if(d->si.header_position < 0) + return MPC_STATUS_FAIL; + + d->si.tag_offset = d->si.total_file_length = d->r->get_size(d->r); + + mpc_demux_fill(d, 4, 0); + magic[0] = mpc_bits_read(&d->bits_reader, 8); + magic[1] = mpc_bits_read(&d->bits_reader, 8); + magic[2] = mpc_bits_read(&d->bits_reader, 8); + magic[3] = mpc_bits_read(&d->bits_reader, 8); + + if (memcmp(magic, "MP+", 3) == 0) { + d->si.stream_version = magic[3] & 15; + d->si.pns = magic[3] >> 4; + if (d->si.stream_version != 7) + return MPC_STATUS_FAIL; + if (mpc_demux_fill(d, 6 * 4, MPC_BUFFER_SWAP) < 6 * 4) // header block size + endian convertion + return MPC_STATUS_FAIL; + MPC_AUTO_FAIL( streaminfo_read_header_sv7(&d->si, &d->bits_reader) ); + } else if (memcmp(magic, "MPCK", 4) == 0) { + mpc_block b; + int size; + mpc_demux_fill(d, 11, 0); // max header block size + size = mpc_bits_get_block(&d->bits_reader, &b); + while( memcmp(b.key, "AP", 2) != 0 ){ // scan all blocks until audio + if (mpc_check_key(b.key) != MPC_STATUS_OK) + return MPC_STATUS_FAIL; + if (b.size > (mpc_uint64_t) DEMUX_BUFFER_SIZE - 11) + return MPC_STATUS_FAIL; + + if (mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, 0) <= b.size) + return MPC_STATUS_FAIL; + + if (memcmp(b.key, "SH", 2) == 0) { + MPC_AUTO_FAIL( streaminfo_read_header_sv8(&d->si, &d->bits_reader, (mpc_uint32_t) b.size) ); + } else if (memcmp(b.key, "RG", 2) == 0) { + streaminfo_gain(&d->si, &d->bits_reader); + } else if (memcmp(b.key, "EI", 2) == 0) { + streaminfo_encoder_info(&d->si, &d->bits_reader); + } else if (memcmp(b.key, "SO", 2) == 0) { + MPC_AUTO_FAIL( mpc_demux_SP(d, size, (mpc_uint32_t) b.size) ); + } else if (memcmp(b.key, "ST", 2) == 0) { + MPC_AUTO_FAIL( mpc_demux_ST(d) ); + } + d->bits_reader.buff += b.size; + size = mpc_bits_get_block(&d->bits_reader, &b); + } + d->bits_reader.buff -= size; + if (d->si.stream_version == 0) // si not initialized !!! + return MPC_STATUS_FAIL; + } else { + return MPC_STATUS_FAIL; + } + + return MPC_STATUS_OK; +} + +mpc_demux * mpc_demux_init(mpc_reader * p_reader) +{ + mpc_demux* p_tmp = malloc(sizeof(mpc_demux)); + + if (p_tmp != 0) { + memset(p_tmp, 0, sizeof(mpc_demux)); + p_tmp->r = p_reader; + p_tmp->chap_nb = -1; + mpc_demux_clear_buff(p_tmp); + if (mpc_demux_header(p_tmp) == MPC_STATUS_OK && + mpc_demux_seek_init(p_tmp) == MPC_STATUS_OK) { + p_tmp->d = mpc_decoder_init(&p_tmp->si); + } else { + if (p_tmp->seek_table) + free(p_tmp->seek_table); + free(p_tmp); + p_tmp = 0; + } + } + + return p_tmp; +} + +void mpc_demux_exit(mpc_demux * d) +{ + mpc_decoder_exit(d->d); + free(d->seek_table); + free(d->chap); + free(d); +} + +void mpc_demux_get_info(mpc_demux * d, mpc_streaminfo * i) +{ + memcpy(i, &d->si, sizeof d->si); +} + +static mpc_status mpc_demux_decode_inner(mpc_demux * d, mpc_frame_info * i) +{ + mpc_bits_reader r; + if (d->si.stream_version >= 8) { + i->is_key_frame = MPC_FALSE; + + if (d->block_frames == 0) { + mpc_block b = {{0,0},0}; + d->bits_reader.count &= -8; + if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { + d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d); + d->seek_table_size ++; + } + mpc_demux_fill(d, 11, MPC_BUFFER_FULL); // max header block size + mpc_bits_get_block(&d->bits_reader, &b); + while( memcmp(b.key, "AP", 2) != 0 ) { // scan all blocks until audio + MPC_AUTO_FAIL( mpc_check_key(b.key) ); + + if (memcmp(b.key, "SE", 2) == 0) { // end block + i->bits = -1; + return MPC_STATUS_OK; + } + + if (mpc_demux_fill(d, 11 + (mpc_uint32_t) b.size, MPC_BUFFER_FULL) < b.size) + return MPC_STATUS_FAIL; + + d->bits_reader.buff += b.size; + mpc_bits_get_block(&d->bits_reader, &b); + } + d->block_bits = (mpc_uint32_t) b.size * 8; + d->block_frames = 1 << d->si.block_pwr; + i->is_key_frame = MPC_TRUE; + } + if (d->buffer + d->bytes_total - d->bits_reader.buff <= MAX_FRAME_SIZE) + mpc_demux_fill(d, (d->block_bits >> 3) + 1, MPC_BUFFER_FULL); + r = d->bits_reader; + mpc_decoder_decode_frame(d->d, &d->bits_reader, i); + d->block_bits -= ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count; + d->block_frames--; + if (d->block_bits < 0 || (d->block_frames == 0 && d->block_bits > 7)) + return MPC_STATUS_FAIL; + } else { + if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { + d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d); + d->seek_table_size ++; + } + mpc_demux_fill(d, MAX_FRAME_SIZE, MPC_BUFFER_FULL | MPC_BUFFER_SWAP); + d->block_bits = (mpc_int_t) mpc_bits_read(&d->bits_reader, 20); // read frame size + if (MPC_FRAME_LENGTH > d->d->samples - d->d->decoded_samples - 1) d->block_bits += 11; // we will read last frame size + r = d->bits_reader; + mpc_decoder_decode_frame(d->d, &d->bits_reader, i); + if (i->bits != -1 && d->block_bits != ((d->bits_reader.buff - r.buff) << 3) + r.count - d->bits_reader.count) + return MPC_STATUS_FAIL; + } + if (i->bits != -1 && d->buffer + d->bytes_total < d->bits_reader.buff + ((8 - d->bits_reader.count) >> 3)) + return MPC_STATUS_FAIL; + + return MPC_STATUS_OK; +} + +mpc_status mpc_demux_decode(mpc_demux * d, mpc_frame_info * i) { + for(;;) { + // mpc_demux_decode_inner may return 0 samples and require repeated calls after a seek. Loop over until we have data to return. + mpc_status s = mpc_demux_decode_inner(d, i); + if (MPC_IS_FAILURE(s)) + i->bits = -1; // we pretend it's end of file + + if (i->bits == -1 || i->samples > 0) + return s; + } +} + +mpc_status mpc_demux_seek_second(mpc_demux * d, double seconds) +{ + return mpc_demux_seek_sample(d, (mpc_int64_t)(seconds * (double)d->si.sample_freq + 0.5)); +} + +mpc_status mpc_demux_seek_sample(mpc_demux * d, mpc_uint64_t destsample) +{ + mpc_uint32_t fwd, samples_to_skip, i; + mpc_uint32_t block_samples = MPC_FRAME_LENGTH << d->si.block_pwr; + mpc_seek_t fpos; + + destsample += d->si.beg_silence; + if (destsample > d->si.samples) destsample = d->si.samples; + fwd = (mpc_uint32_t) (destsample / block_samples); + samples_to_skip = MPC_DECODER_SYNTH_DELAY + + (mpc_uint32_t) (destsample % block_samples); + if (d->si.stream_version == 7) { + if (fwd > 32) { + fwd -= 32; + samples_to_skip += MPC_FRAME_LENGTH * 32; + } else { + samples_to_skip += MPC_FRAME_LENGTH * fwd; + fwd = 0; + } + } + + i = fwd >> (d->seek_pwr - d->si.block_pwr); + if (i >= d->seek_table_size) + i = d->seek_table_size - 1; + fpos = d->seek_table[i]; + i <<= d->seek_pwr - d->si.block_pwr; + d->d->decoded_samples = i * block_samples; + + if (d->si.stream_version >= 8) { + mpc_block b; + int size; + mpc_demux_seek(d, fpos, 11); + size = mpc_bits_get_block(&d->bits_reader, &b); + while(i < fwd) { + if (memcmp(b.key, "AP", 2) == 0) { + if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { + d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d) - 8 * size; + d->seek_table_size ++; + } + d->d->decoded_samples += block_samples; + i++; + } + fpos += ((mpc_uint32_t)b.size + size) * 8; + mpc_demux_seek(d, fpos, 11); + size = mpc_bits_get_block(&d->bits_reader, &b); + } + d->bits_reader.buff -= size; + } else { + mpc_decoder_reset_scf(d->d, fwd != 0); + mpc_demux_seek(d, fpos, 4); + for( ; i < fwd; i++){ + if (d->d->decoded_samples == (d->seek_table_size << d->seek_pwr) * MPC_FRAME_LENGTH) { + d->seek_table[d->seek_table_size] = (mpc_seek_t) mpc_demux_pos(d); + d->seek_table_size ++; + } + d->d->decoded_samples += block_samples; + fpos += mpc_bits_read(&d->bits_reader, 20) + 20; + mpc_demux_seek(d, fpos, 4); + } + } + d->d->samples_to_skip = samples_to_skip; + return MPC_STATUS_OK; +} + +void mpc_set_replay_level(mpc_demux * d, float level, mpc_bool_t use_gain, + mpc_bool_t use_title, mpc_bool_t clip_prevention) +{ + float peak = (float) ( use_title ? d->si.peak_title : d->si.peak_album ); + float gain = (float) ( use_title ? d->si.gain_title : d->si.gain_album ); + + if(!use_gain && !clip_prevention) + return; + + if(!peak) + peak = 1.; + else + peak = (float) ( (1 << 15) / pow(10, peak / (20 * 256)) ); + + if(!gain) + gain = 1.; + else + gain = (float) pow(10, (level - gain / 256) / 20); + + if(clip_prevention && (peak < gain || !use_gain)) + gain = peak; + + mpc_decoder_scale_output(d->d, gain); +} diff --git a/Mednafen/mednafen/mpcdec/mpc_reader.c b/Mednafen/mednafen/mpcdec/mpc_reader.c new file mode 100644 index 0000000000..c3d344fce5 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpc_reader.c @@ -0,0 +1,144 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file mpc_reader.c +/// Contains implementations for simple file-based mpc_reader +#include "reader.h" +#include "internal.h" +#include + +#define STDIO_MAGIC 0xF34B963C ///< Just a random safe-check value... +typedef struct mpc_reader_stdio_t { + FILE *p_file; + int file_size; + mpc_bool_t is_seekable; + mpc_int32_t magic; +} mpc_reader_stdio; + +/// mpc_reader callback implementations +static mpc_int32_t +read_stdio(mpc_reader *p_reader, void *ptr, mpc_int32_t size) +{ + mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; + if(p_stdio->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; + return (mpc_int32_t) fread(ptr, 1, size, p_stdio->p_file); +} + +static mpc_bool_t +seek_stdio(mpc_reader *p_reader, mpc_int32_t offset) +{ + mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; + if(p_stdio->magic != STDIO_MAGIC) return MPC_FALSE; + return p_stdio->is_seekable ? fseek(p_stdio->p_file, offset, SEEK_SET) == 0 : MPC_FALSE; +} + +static mpc_int32_t +tell_stdio(mpc_reader *p_reader) +{ + mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; + if(p_stdio->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; + return ftell(p_stdio->p_file); +} + +static mpc_int32_t +get_size_stdio(mpc_reader *p_reader) +{ + mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; + if(p_stdio->magic != STDIO_MAGIC) return MPC_STATUS_FAIL; + return p_stdio->file_size; +} + +static mpc_bool_t +canseek_stdio(mpc_reader *p_reader) +{ + mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; + if(p_stdio->magic != STDIO_MAGIC) return MPC_FALSE; + return p_stdio->is_seekable; +} + +mpc_status +mpc_reader_init_stdio_stream(mpc_reader * p_reader, FILE * p_file) +{ + mpc_reader tmp_reader; mpc_reader_stdio *p_stdio; int err; + + p_stdio = NULL; + memset(&tmp_reader, 0, sizeof tmp_reader); + p_stdio = malloc(sizeof *p_stdio); + if(!p_stdio) return MPC_STATUS_FAIL; + memset(p_stdio, 0, sizeof *p_stdio); + + p_stdio->magic = STDIO_MAGIC; + p_stdio->p_file = p_file; + p_stdio->is_seekable = MPC_TRUE; + err = fseek(p_stdio->p_file, 0, SEEK_END); + if(err < 0) goto clean; + err = ftell(p_stdio->p_file); + if(err < 0) goto clean; + p_stdio->file_size = err; + err = fseek(p_stdio->p_file, 0, SEEK_SET); + if(err < 0) goto clean; + + tmp_reader.data = p_stdio; + tmp_reader.canseek = canseek_stdio; + tmp_reader.get_size = get_size_stdio; + tmp_reader.read = read_stdio; + tmp_reader.seek = seek_stdio; + tmp_reader.tell = tell_stdio; + + *p_reader = tmp_reader; + return MPC_STATUS_OK; +clean: + if(p_stdio && p_stdio->p_file) + fclose(p_stdio->p_file); + free(p_stdio); + return MPC_STATUS_FAIL; +} + +mpc_status +mpc_reader_init_stdio(mpc_reader *p_reader, const char *filename) +{ + FILE * stream = fopen(filename, "rb"); + if (stream == NULL) return MPC_STATUS_FAIL; + return mpc_reader_init_stdio_stream(p_reader,stream); +} + +void +mpc_reader_exit_stdio(mpc_reader *p_reader) +{ + mpc_reader_stdio *p_stdio = (mpc_reader_stdio*) p_reader->data; + if(p_stdio->magic != STDIO_MAGIC) return; + fclose(p_stdio->p_file); + free(p_stdio); + p_reader->data = NULL; +} + diff --git a/Mednafen/mednafen/mpcdec/mpc_types.h b/Mednafen/mednafen/mpcdec/mpc_types.h new file mode 100644 index 0000000000..e8bb0c0af3 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpc_types.h @@ -0,0 +1,150 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _MPC_TYPES_H_ +#define _MPC_TYPES_H_ +#ifdef WIN32 +#pragma once +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +typedef __int8 mpc_int8_t; +typedef unsigned __int8 mpc_uint8_t; +typedef __int16 mpc_int16_t; +typedef unsigned __int16 mpc_uint16_t; +typedef __int32 mpc_int32_t; +typedef unsigned __int32 mpc_uint32_t; +typedef __int64 mpc_int64_t; +typedef unsigned __int64 mpc_uint64_t; +#define mpc_inline __inline +#else +#include +typedef int8_t mpc_int8_t; +typedef uint8_t mpc_uint8_t; +typedef int16_t mpc_int16_t; +typedef uint16_t mpc_uint16_t; +typedef int32_t mpc_int32_t; +typedef uint32_t mpc_uint32_t; +typedef int64_t mpc_int64_t; +typedef uint64_t mpc_uint64_t; +#define mpc_inline inline +#endif + +typedef int mpc_int_t; +typedef unsigned int mpc_uint_t; +typedef size_t mpc_size_t; +typedef mpc_uint8_t mpc_bool_t; + +// #define LONG_SEEK_TABLE +#ifdef LONG_SEEK_TABLE // define as needed (mpc_uint32_t supports files up to 512 MB) +typedef mpc_uint64_t mpc_seek_t; +#else +typedef mpc_uint32_t mpc_seek_t; +#endif + +# define mpc_int64_min -9223372036854775808ll +# define mpc_int64_max 9223372036854775807ll + +typedef struct mpc_quantizer { + mpc_int16_t L [36]; + mpc_int16_t R [36]; +} mpc_quantizer; + +/// Libmpcdec error codes +typedef enum mpc_status { + // Success. + MPC_STATUS_OK = 0, + // Generic failure (I/O error or invalid file). + MPC_STATUS_FAIL = -1 +} mpc_status; + + +#define MPC_FIXED_POINT_SHIFT 16 + +#ifdef MPC_FIXED_POINT +# define MPC_FIXED_POINT_FRACTPART 14 +# define MPC_FIXED_POINT_SCALE_SHIFT (MPC_FIXED_POINT_SHIFT + MPC_FIXED_POINT_FRACTPART) +# define MPC_FIXED_POINT_SCALE (1 << (MPC_FIXED_POINT_SCALE_SHIFT - 1)) +typedef mpc_int32_t MPC_SAMPLE_FORMAT; +#else +typedef float MPC_SAMPLE_FORMAT; +#endif + +enum { + MPC_FALSE = 0, + MPC_TRUE = !MPC_FALSE +}; + +//// 'Cdecl' forces the use of standard C/C++ calling convention /////// +#if defined _WIN32 +# define mpc_cdecl __cdecl +#elif defined __ZTC__ +# define mpc_cdecl _cdecl +#elif defined __TURBOC__ +# define mpc_cdecl cdecl +#else +# define mpc_cdecl +#endif + +/* DLL building support on win32 hosts */ +#ifndef MPC_API +# ifdef DLL_EXPORT /* defined by libtool (if required) */ +# define MPC_API __declspec(dllexport) +# endif +# ifdef MPC_DLL_IMPORT /* define if linking with this dll */ +# define MPC_API __declspec(dllimport) +# endif +# ifndef MPC_API /* static linking or !_WIN32 */ +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define MPC_API __attribute__ ((visibility("default"))) +# else +# define MPC_API +# endif +# endif +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/mpcdec.h b/Mednafen/mednafen/mpcdec/mpcdec.h new file mode 100644 index 0000000000..c72359516c --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpcdec.h @@ -0,0 +1,148 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file mpcdec.h +/// Top level include file for libmpcdec. +#ifndef _MPCDEC_H_ +#define _MPCDEC_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "reader.h" +#include "streaminfo.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + MPC_FRAME_LENGTH = (36 * 32), ///< Samples per mpc frame + MPC_DECODER_BUFFER_LENGTH = (MPC_FRAME_LENGTH * 4), ///< Required buffer size for decoder + MPC_DECODER_SYNTH_DELAY = 481 +}; + +typedef struct mpc_decoder_t mpc_decoder; +typedef struct mpc_demux_t mpc_demux; + +typedef struct mpc_bits_reader_t { + unsigned char * buff; /// pointer on current byte + unsigned int count; /// unread bits in current byte +} mpc_bits_reader; + +typedef struct mpc_frame_info_t { + mpc_uint32_t samples; /// number of samples in the frame (counting once for multiple channels) + mpc_int32_t bits; /// number of bits consumed by this frame (-1) if end of stream + MPC_SAMPLE_FORMAT * buffer; /// frame samples buffer (size = samples * channels * sizeof(MPC_SAMPLE_FORMAT)) + mpc_bool_t is_key_frame; /// 1 if this frame is a key frame (first in block) 0 else. Set by the demuxer. +} mpc_frame_info; + +typedef struct mpc_chap_info_t { + mpc_uint64_t sample; /// sample where the chapter starts + mpc_uint16_t gain; /// replaygain chapter value + mpc_uint16_t peak; /// peak chapter loudness level + mpc_uint_t tag_size; /// size of the tag element (0 if no tag is present for this chapter) + char * tag; /// pointer to an APEv2 tag without the preamble +} mpc_chap_info; + +/// Initializes mpc decoder with the supplied stream info parameters. +/// \param si streaminfo structure indicating format of source stream +/// \return pointer on the initialized decoder structure if successful, 0 if not +MPC_API mpc_decoder * mpc_decoder_init(mpc_streaminfo *si); + +/// Releases input mpc decoder +MPC_API void mpc_decoder_exit(mpc_decoder *p_dec); + +/** + * Sets decoder sample scaling factor. All decoded samples will be multiplied + * by this factor. Useful for applying replay gain. + * @param scale_factor multiplicative scaling factor + */ +MPC_API void mpc_decoder_scale_output(mpc_decoder *p_dec, double scale_factor); + +MPC_API void mpc_decoder_decode_frame(mpc_decoder * d, mpc_bits_reader * r, mpc_frame_info * i); + +// This is the gain reference used in old replaygain +#define MPC_OLD_GAIN_REF 64.82 + +/** + * init demuxer + * @param p_reader initialized mpc_reader pointer + * @return an initialized mpc_demux pointer + */ +MPC_API mpc_demux * mpc_demux_init(mpc_reader * p_reader); +/// free demuxer +MPC_API void mpc_demux_exit(mpc_demux * d); +/** + * Calls mpc_decoder_scale_output to set the scaling factor according to the + * replay gain stream information and the supplied ouput level + * @param d pointer to a musepack demuxer + * @param level the desired ouput level (in db). Must be MPC_OLD_GAIN_REF (64.82 db) if you want to get the old replaygain behavior + * @param use_gain set it to MPC_TRUE if you want to set the scaling factor according to the stream gain + * @param use_title MPC_TRUE : uses the title gain, MPC_FALSE : uses the album gain + * @param clip_prevention MPC_TRUE : uses cliping prevention + */ +MPC_API void mpc_set_replay_level(mpc_demux * d, float level, mpc_bool_t use_gain, + mpc_bool_t use_title, mpc_bool_t clip_prevention); +/// decode frame +MPC_API mpc_status mpc_demux_decode(mpc_demux * d, mpc_frame_info * i); +/// get streaminfo +MPC_API void mpc_demux_get_info(mpc_demux * d, mpc_streaminfo * i); +/// seeks to a given sample +MPC_API mpc_status mpc_demux_seek_sample(mpc_demux * d, mpc_uint64_t destsample); +/// seeks to a given second +MPC_API mpc_status mpc_demux_seek_second(mpc_demux * d, double seconds); + +/// \return the current position in the stream (in bits) from the beginning of the file +MPC_API mpc_seek_t mpc_demux_pos(mpc_demux * d); + +/// chapters : only for sv8 streams +/** + * Gets the number of chapters in the stream + * @param d pointer to a musepack demuxer + * @return the number of chapters found in the stream + */ +MPC_API mpc_int_t mpc_demux_chap_nb(mpc_demux * d); +/** + * Gets datas associated to a given chapter + * The chapter tag is an APEv2 tag without the preamble + * @param d pointer to a musepack demuxer + * @param chap_nb chapter number you want datas (from 0 to mpc_demux_chap_nb(d) - 1) + * @return the chapter information structure + */ +MPC_API mpc_chap_info const * mpc_demux_chap(mpc_demux * d, int chap_nb); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/mpcdec_math.h b/Mednafen/mednafen/mpcdec/mpcdec_math.h new file mode 100644 index 0000000000..03af65e64c --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpcdec_math.h @@ -0,0 +1,135 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file mpcdec_math.h +/// Libmpcdec internal math routines. +#ifndef _MPCDEC_MATH_H_ +#define _MPCDEC_MATH_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "mpc_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef MPC_FIXED_POINT + +#ifdef _WIN32_WCE +#include +#define MPC_HAVE_MULHIGH +#endif + +//in fixedpoint mode, results in decode output buffer are in -MPC_FIXED_POINT_SCALE ... MPC_FIXED_POINT_SCALE range + +typedef mpc_int64_t MPC_SAMPLE_FORMAT_MULTIPLY; + +#define MAKE_MPC_SAMPLE(X) (MPC_SAMPLE_FORMAT)((double)(X) * (double)(((mpc_int64_t)1)<> MPC_FIXED_POINT_FRACTPART) + +#define MPC_MULTIPLY_EX_NOTRUNCATE(X,Y,Z) \ + (((MPC_SAMPLE_FORMAT_MULTIPLY)(X) * (MPC_SAMPLE_FORMAT_MULTIPLY)(Y)) >> (Z)) + +#ifdef _DEBUG +static mpc_inline MPC_SAMPLE_FORMAT MPC_MULTIPLY(MPC_SAMPLE_FORMAT item1,MPC_SAMPLE_FORMAT item2) +{ + MPC_SAMPLE_FORMAT_MULTIPLY temp = MPC_MULTIPLY_NOTRUNCATE(item1,item2); + assert(temp == (MPC_SAMPLE_FORMAT_MULTIPLY)(MPC_SAMPLE_FORMAT)temp); + return (MPC_SAMPLE_FORMAT)temp; +} + +static mpc_inline MPC_SAMPLE_FORMAT MPC_MULTIPLY_EX(MPC_SAMPLE_FORMAT item1,MPC_SAMPLE_FORMAT item2,unsigned shift) +{ + MPC_SAMPLE_FORMAT_MULTIPLY temp = MPC_MULTIPLY_EX_NOTRUNCATE(item1,item2,shift); + assert(temp == (MPC_SAMPLE_FORMAT_MULTIPLY)(MPC_SAMPLE_FORMAT)temp); + return (MPC_SAMPLE_FORMAT)temp; +} + +#else + +#define MPC_MULTIPLY(X,Y) ((MPC_SAMPLE_FORMAT)MPC_MULTIPLY_NOTRUNCATE(X,Y)) +#define MPC_MULTIPLY_EX(X,Y,Z) ((MPC_SAMPLE_FORMAT)MPC_MULTIPLY_EX_NOTRUNCATE(X,Y,Z)) + +#endif + +#ifdef MPC_HAVE_MULHIGH +#define MPC_MULTIPLY_FRACT(X,Y) _MulHigh(X,Y) +#else +#define MPC_MULTIPLY_FRACT(X,Y) MPC_MULTIPLY_EX(X,Y,32) +#endif + +#define MPC_MAKE_FRACT_CONST(X) (MPC_SAMPLE_FORMAT)((X) * (double)(((mpc_int64_t)1)<<32) ) +#define MPC_MULTIPLY_FRACT_CONST(X,Y) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST(Y)) +#define MPC_MULTIPLY_FRACT_CONST_FIX(X,Y,Z) ( MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y / (1<<(Z)) )) << (Z) ) +#define MPC_MULTIPLY_FRACT_CONST_SHR(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y / (1<<(Z)) )) + +#define MPC_MULTIPLY_FLOAT_INT(X,Y) ((X)*(Y)) +#define MPC_SCALE_CONST(X,Y,Z) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)) +#define MPC_SCALE_CONST_SHL(X,Y,Z,S) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)-(S)) +#define MPC_SCALE_CONST_SHR(X,Y,Z,S) MPC_MULTIPLY_EX(X,MAKE_MPC_SAMPLE_EX(Y,Z),(Z)+(S)) +#define MPC_SHR(X,Y) ((X)>>(Y)) +#define MPC_SHL(X,Y) ((X)<<(Y)) + +#else + +//in floating-point mode, decoded samples are in -1...1 range + +#define MAKE_MPC_SAMPLE(X) ((MPC_SAMPLE_FORMAT)(X)) +#define MAKE_MPC_SAMPLE_EX(X,Y) ((MPC_SAMPLE_FORMAT)(X)) + +#define MPC_MULTIPLY_FRACT(X,Y) ((X)*(Y)) +#define MPC_MAKE_FRACT_CONST(X) (X) +#define MPC_MULTIPLY_FRACT_CONST(X,Y) MPC_MULTPLY_FRACT(X,MPC_MAKE_FRACT_CONST(Y)) +#define MPC_MULTIPLY_FRACT_CONST_SHR(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y )) +#define MPC_MULTIPLY_FRACT_CONST_FIX(X,Y,Z) MPC_MULTIPLY_FRACT(X,MPC_MAKE_FRACT_CONST( Y )) + +#define MPC_MULTIPLY_FLOAT_INT(X,Y) ((X)*(Y)) +#define MPC_MULTIPLY(X,Y) ((X)*(Y)) +#define MPC_MULTIPLY_EX(X,Y,Z) ((X)*(Y)) +#define MPC_SCALE_CONST(X,Y,Z) ((X)*(Y)) +#define MPC_SCALE_CONST_SHL(X,Y,Z,S) ((X)*(Y)) +#define MPC_SCALE_CONST_SHR(X,Y,Z,S) ((X)*(Y)) +#define MPC_SHR(X,Y) (X) +#define MPC_SHL(X,Y) (X) + +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/mpcmath.h b/Mednafen/mednafen/mpcdec/mpcmath.h new file mode 100644 index 0000000000..7c4b130824 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/mpcmath.h @@ -0,0 +1,154 @@ +/* + * Musepack audio compression + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; If not, see + */ + +#include + +#include "mpc_types.h" + +typedef union mpc_floatint +{ + float f; + mpc_int32_t n; +} mpc_floatint; + +typedef union mpc_doubleint +{ + double d; + mpc_int32_t n[2]; +} mpc_doubleint; + +static mpc_inline mpc_int32_t mpc_lrintf(float fVal) +{ + mpc_floatint tmp; + tmp.f = fVal + 0x00FF8000; + return tmp.n - 0x4B7F8000; +} + +#define mpc_round32 mpc_lrintf +#define mpc_nearbyintf mpc_lrintf + + +#ifndef M_PI +# define M_PI 3.1415926535897932384626433832795029 // 4*atan(1) +# define M_PIl 3.1415926535897932384626433832795029L +# define M_LN2 0.6931471805599453094172321214581766 // ln(2) +# define M_LN2l 0.6931471805599453094172321214581766L +# define M_LN10 2.3025850929940456840179914546843642 // ln 10 */ +# define M_LN10l 2.3025850929940456840179914546843642L +#endif + +// fast but maybe more inaccurate, use if you need speed +#if defined(__GNUC__) && !defined(__APPLE__) +# define SIN(x) sinf ((float)(x)) +# define COS(x) cosf ((float)(x)) +# define ATAN2(x,y) atan2f ((float)(x), (float)(y)) +# define SQRT(x) sqrtf ((float)(x)) +# define LOG(x) logf ((float)(x)) +# define LOG10(x) log10f ((float)(x)) +# define POW(x,y) expf (logf(x) * (y)) +# define POW10(x) expf (M_LN10 * (x)) +# define FLOOR(x) floorf ((float)(x)) +# define IFLOOR(x) (int) floorf ((float)(x)) +# define FABS(x) fabsf ((float)(x)) +#else +# define SIN(x) (float) sin (x) +# define COS(x) (float) cos (x) +# define ATAN2(x,y) (float) atan2 (x, y) +# define SQRT(x) (float) sqrt (x) +# define LOG(x) (float) log (x) +# define LOG10(x) (float) log10 (x) +# define POW(x,y) (float) pow (x,y) +# define POW10(x) (float) pow (10., (x)) +# define FLOOR(x) (float) floor (x) +# define IFLOOR(x) (int) floor (x) +# define FABS(x) (float) fabs (x) +#endif + +#define SQRTF(x) SQRT (x) +#ifdef FAST_MATH +# define TABSTEP 64 +# define COSF(x) my_cos ((float)(x)) +# define ATAN2F(x,y) my_atan2 ((float)(x), (float)(y)) +# define IFLOORF(x) my_ifloor ((float)(x)) + +void Init_FastMath ( void ); +extern const float tabatan2 [] [2]; +extern const float tabcos [] [2]; +extern const float tabsqrt_ex []; +extern const float tabsqrt_m [] [2]; + +static mpc_inline float my_atan2 ( float x, float y ) +{ + float t, ret; int i; mpc_floatint mx, my; + + mx.f = x; + my.f = y; + if ( (mx.n & 0x7FFFFFFF) < (my.n & 0x7FFFFFFF) ) { + i = mpc_round32 (t = TABSTEP * (mx.f / my.f)); + ret = tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (t-i); + if ( my.n < 0 ) + ret = (float)(ret - M_PI); + } + else if ( mx.n < 0 ) { + i = mpc_round32 (t = TABSTEP * (my.f / mx.f)); + ret = - M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t); + } + else if ( mx.n > 0 ) { + i = mpc_round32 (t = TABSTEP * (my.f / mx.f)); + ret = + M_PI/2 - tabatan2 [1*TABSTEP+i][0] + tabatan2 [1*TABSTEP+i][1] * (i-t); + } + else { + ret = 0.; + } + return ret; +} + + +static mpc_inline float my_cos ( float x ) +{ + float t, ret; int i; + i = mpc_round32 (t = TABSTEP * x); + ret = tabcos [13*TABSTEP+i][0] + tabcos [13*TABSTEP+i][1] * (t-i); + return ret; +} + + +static mpc_inline int my_ifloor ( float x ) +{ + mpc_floatint mx; + mx.f = (float) (x + (0x0C00000L + 0.500000001)); + return mx.n - 1262485505; +} + + +static mpc_inline float my_sqrt ( float x ) +{ + float ret; int i, ex; mpc_floatint mx; + mx.f = x; + ex = mx.n >> 23; // get the exponent + mx.n = (mx.n & 0x7FFFFF) | 0x42800000; // delete the exponent + i = mpc_round32 (mx.f); // Integer-part of the mantissa (round ????????????) + ret = tabsqrt_m [i-TABSTEP][0] + tabsqrt_m [i-TABSTEP][1] * (mx.f-i); // calculate value + ret *= tabsqrt_ex [ex]; + return ret; +} +#else +# define COSF(x) COS (x) +# define ATAN2F(x,y) ATAN2 (x,y) +# define IFLOORF(x) IFLOOR (x) +#endif + diff --git a/Mednafen/mednafen/mpcdec/reader.h b/Mednafen/mednafen/mpcdec/reader.h new file mode 100644 index 0000000000..cfe2a11c88 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/reader.h @@ -0,0 +1,98 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file reader.h +#ifndef _MPCDEC_READER_H_ +#define _MPCDEC_READER_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "mpc_types.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/// \brief Stream reader interface structure. +/// +/// This is the structure you must supply to the musepack decoding library +/// to feed it with raw data. Implement the five member functions to provide +/// a functional reader. +typedef struct mpc_reader_t mpc_reader; +struct mpc_reader_t { + /// Reads size bytes of data into buffer at ptr. + mpc_int32_t (*read)(mpc_reader *p_reader, void *ptr, mpc_int32_t size); + + /// Seeks to byte position offset. + mpc_bool_t (*seek)(mpc_reader *p_reader, mpc_int32_t offset); + + /// Returns the current byte offset in the stream. + mpc_int32_t (*tell)(mpc_reader *p_reader); + + /// Returns the total length of the source stream, in bytes. + mpc_int32_t (*get_size)(mpc_reader *p_reader); + + /// True if the stream is a seekable stream. + mpc_bool_t (*canseek)(mpc_reader *p_reader); + + /// Field that can be used to identify a particular instance of + /// reader or carry along data associated with that reader. + void *data; +}; + +/// Initializes reader with default stdio file reader implementation. Use +/// this if you're just reading from a plain file. +/// +/// \param r p_reader handle to initialize +/// \param filename input filename to attach to the reader +MPC_API mpc_status mpc_reader_init_stdio(mpc_reader *p_reader, const char *filename); + +/// Initializes reader with default stdio file reader implementation. Use +/// this if you prefer to open the file yourself. +/// +/// \param r p_reader handle to initialize +/// \param p_file input file handle (already open) +MPC_API mpc_status mpc_reader_init_stdio_stream(mpc_reader * p_reader, FILE * p_file); + +/// Release reader with default stdio file reader implementation. +/// +/// \param r reader handle to release +MPC_API void mpc_reader_exit_stdio(mpc_reader *p_reader); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/requant.c b/Mednafen/mednafen/mpcdec/requant.c new file mode 100644 index 0000000000..2e6f7cb008 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/requant.c @@ -0,0 +1,124 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file requant.c +/// Requantization function implementations. +/// \todo document me +#include "mpcdec.h" + +#include "requant.h" +#include "mpcdec_math.h" +#include "decoder.h" + +/* C O N S T A N T S */ +// Bits per sample for chosen quantizer +const mpc_uint8_t Res_bit [18] = { + 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 +}; + +// Requantization coefficients +// 65536/step bzw. 65536/(2*D+1) + +#define _(X) MAKE_MPC_SAMPLE_EX(X,14) + +const MPC_SAMPLE_FORMAT __Cc [1 + 18] = { + _(111.285962475327f), // 32768/2/255*sqrt(3) + _(65536.000000000000f), _(21845.333333333332f), _(13107.200000000001f), _(9362.285714285713f), + _(7281.777777777777f), _(4369.066666666666f), _(2114.064516129032f), _(1040.253968253968f), + _(516.031496062992f), _(257.003921568627f), _(128.250489236790f), _(64.062561094819f), + _(32.015632633121f), _(16.003907203907f), _(8.000976681723f), _(4.000244155527f), + _(2.000061037018f), _(1.000015259021f) +}; + +#undef _ + +// Requantization offset +// 2*D+1 = steps of quantizer +const mpc_int16_t __Dc [1 + 18] = { + 2, + 0, 1, 2, 3, 4, 7, 15, 31, 63, + 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767 +}; + +#ifdef MPC_FIXED_POINT +static mpc_uint32_t find_shift(double fval) +{ + mpc_int64_t val = (mpc_int64_t) fval; + mpc_uint32_t ptr = 0; + if(val<0) + val = -val; + while(val) + { + val >>= 1; + ptr++; + } + return ptr > 31 ? 0 : 31 - ptr; +} +#endif + +/* F U N C T I O N S */ + +#define SET_SCF(N,X) d->SCF[N] = MAKE_MPC_SAMPLE_EX(X,d->SCF_shift[N] = (mpc_uint8_t) find_shift(X)); + +void +mpc_decoder_scale_output(mpc_decoder *d, double factor) +{ + mpc_int32_t n; double f1, f2; + +#ifndef MPC_FIXED_POINT + factor *= 1.0 / (double) (1<<(MPC_FIXED_POINT_SHIFT-1)); +#else + factor *= 1.0 / (double) (1<<(16-MPC_FIXED_POINT_SHIFT)); +#endif + f1 = f2 = factor; + + // handles +1.58...-98.41 dB, where's scf[n] / scf[n-1] = 1.20050805774840750476 + + SET_SCF(1,factor); + + f1 *= 0.83298066476582673961; + f2 *= 1/0.83298066476582673961; + + for ( n = 1; n <= 128; n++ ) { + SET_SCF((mpc_uint8_t)(1+n),f1); + SET_SCF((mpc_uint8_t)(1-n),f2); + f1 *= 0.83298066476582673961; + f2 *= 1/0.83298066476582673961; + } +} + +void +mpc_decoder_init_quant(mpc_decoder *d, double scale_factor) +{ + mpc_decoder_scale_output(d, scale_factor); +} diff --git a/Mednafen/mednafen/mpcdec/requant.h b/Mednafen/mednafen/mpcdec/requant.h new file mode 100644 index 0000000000..908fda30eb --- /dev/null +++ b/Mednafen/mednafen/mpcdec/requant.h @@ -0,0 +1,61 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file requant.h +/// Requantization function definitions. +#ifndef _MPCDEC_REQUANT_H_ +#define _MPCDEC_REQUANT_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "mpc_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* C O N S T A N T S */ +extern const mpc_uint8_t Res_bit [18]; ///< Bits per sample for chosen quantizer +extern const MPC_SAMPLE_FORMAT __Cc [1 + 18]; ///< Requantization coefficients +extern const mpc_int16_t __Dc [1 + 18]; ///< Requantization offset + +#define Cc (__Cc + 1) +#define Dc (__Dc + 1) + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/streaminfo.c b/Mednafen/mednafen/mpcdec/streaminfo.c new file mode 100644 index 0000000000..164af81bf2 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/streaminfo.c @@ -0,0 +1,244 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file streaminfo.c +/// Implementation of streaminfo reading functions. + +#include +#include "mpcdec.h" +#include "streaminfo.h" +#include +#include "internal.h" +#include "huffman.h" +#include "mpc_bits_reader.h" + +unsigned long mpc_crc32(unsigned char *buf, int len); + +static const char na[] = "n.a."; +static char const * const versionNames[] = { + na, "'Unstable/Experimental'", na, na, na, "'quality 0'", "'quality 1'", + "'Telephone'", "'Thumb'", "'Radio'", "'Standard'", "'Extreme'", "'Insane'", + "'BrainDead'", "'quality 9'", "'quality 10'" +}; +static const mpc_int32_t samplefreqs[8] = { 44100, 48000, 37800, 32000 }; + +static const char * +mpc_get_version_string(float profile) // profile is 0...15, where 7...13 is used +{ + return profile >= sizeof versionNames / sizeof *versionNames ? na : versionNames[(int)profile]; +} + +static void +mpc_get_encoder_string(mpc_streaminfo* si) +{ + int ver = si->encoder_version; + if (si->stream_version >= 8) + ver = (si->encoder_version >> 24) * 100 + ((si->encoder_version >> 16) & 0xFF); + if (ver <= 116) { + if (ver == 0) { + sprintf(si->encoder, "Buschmann 1.7.0...9, Klemm 0.90...1.05"); + } else { + switch (ver % 10) { + case 0: + sprintf(si->encoder, "Release %u.%u", ver / 100, + ver / 10 % 10); + break; + case 2: case 4: case 6: case 8: + sprintf(si->encoder, "Beta %u.%02u", ver / 100, + ver % 100); + break; + default: + sprintf(si->encoder, "--Alpha-- %u.%02u", + ver / 100, ver % 100); + break; + } + } + } else { + int major = si->encoder_version >> 24; + int minor = (si->encoder_version >> 16) & 0xFF; + int build = (si->encoder_version >> 8) & 0xFF; + char * tmp = "--Stable--"; + + if (minor & 1) + tmp = "--Unstable--"; + + sprintf(si->encoder, "%s %u.%u.%u", tmp, major, minor, build); + } +} + +static mpc_status check_streaminfo(mpc_streaminfo * si) +{ + if (si->max_band == 0 || si->max_band >= 32 + || si->channels > 2 || si->channels == 0 || si->sample_freq == 0) + return MPC_STATUS_FAIL; + return MPC_STATUS_OK; +} + +/// Reads streaminfo from SV7 header. +mpc_status +streaminfo_read_header_sv7(mpc_streaminfo* si, mpc_bits_reader * r) +{ + mpc_uint32_t frames, last_frame_samples; + + si->bitrate = 0; + frames = (mpc_bits_read(r, 16) << 16) | mpc_bits_read(r, 16); + mpc_bits_read(r, 1); // intensity stereo : should be 0 + si->ms = mpc_bits_read(r, 1); + si->max_band = mpc_bits_read(r, 6); + si->profile = mpc_bits_read(r, 4); + si->profile_name = mpc_get_version_string(si->profile); + mpc_bits_read(r, 2); // Link ? + si->sample_freq = samplefreqs[mpc_bits_read(r, 2)]; + mpc_bits_read(r, 16); // skip MaxLevel (maximum level of input PCM) + si->gain_title = (mpc_uint16_t) mpc_bits_read(r, 16); + si->peak_title = (mpc_uint16_t) mpc_bits_read(r, 16); + si->gain_album = (mpc_uint16_t) mpc_bits_read(r, 16); + si->peak_album = (mpc_uint16_t) mpc_bits_read(r, 16); + si->is_true_gapless = mpc_bits_read(r, 1); // true gapless: used? + last_frame_samples = mpc_bits_read(r, 11); // true gapless: valid samples for last frame + si->fast_seek = mpc_bits_read(r, 1); // fast seeking + mpc_bits_read(r, 19); // unused + si->encoder_version = mpc_bits_read(r, 8); + si->channels = 2; + si->block_pwr = 0; + + // convert gain info + if (si->gain_title != 0) { + int tmp = (int)((MPC_OLD_GAIN_REF - (mpc_int16_t)si->gain_title / 100.) * 256. + .5); + if (tmp >= (1 << 16) || tmp < 0) tmp = 0; + si->gain_title = (mpc_int16_t) tmp; + } + + if (si->gain_album != 0) { + int tmp = (int)((MPC_OLD_GAIN_REF - (mpc_int16_t)si->gain_album / 100.) * 256. + .5); + if (tmp >= (1 << 16) || tmp < 0) tmp = 0; + si->gain_album = (mpc_int16_t) tmp; + } + + if (si->peak_title != 0) + si->peak_title = (mpc_uint16_t) (log10(si->peak_title) * 20 * 256 + .5); + + if (si->peak_album != 0) + si->peak_album = (mpc_uint16_t) (log10(si->peak_album) * 20 * 256 + .5); + + mpc_get_encoder_string(si); + + if (last_frame_samples == 0) last_frame_samples = MPC_FRAME_LENGTH; + else if (last_frame_samples > MPC_FRAME_LENGTH) return MPC_STATUS_FAIL; + si->samples = (mpc_int64_t) frames * MPC_FRAME_LENGTH; + if (si->is_true_gapless) + si->samples -= (MPC_FRAME_LENGTH - last_frame_samples); + else + si->samples -= MPC_DECODER_SYNTH_DELAY; + + si->average_bitrate = (si->tag_offset - si->header_position) * 8.0 + * si->sample_freq / si->samples; + + return check_streaminfo(si); +} + +/// Reads replay gain datas +void streaminfo_gain(mpc_streaminfo* si, const mpc_bits_reader * r_in) +{ + mpc_bits_reader r = *r_in; + + int version = mpc_bits_read(&r, 8); // gain version + if (version != 1) // we only know ver 1 + return; + si->gain_title = (mpc_uint16_t) mpc_bits_read(&r, 16); + si->peak_title = (mpc_uint16_t) mpc_bits_read(&r, 16); + si->gain_album = (mpc_uint16_t) mpc_bits_read(&r, 16); + si->peak_album = (mpc_uint16_t) mpc_bits_read(&r, 16); +} + +/// Reads streaminfo from SV8 header. +mpc_status +streaminfo_read_header_sv8(mpc_streaminfo* si, const mpc_bits_reader * r_in, + mpc_size_t block_size) +{ + mpc_uint32_t CRC; + mpc_bits_reader r = *r_in; + + CRC = (mpc_bits_read(&r, 16) << 16) | mpc_bits_read(&r, 16); + if (CRC != mpc_crc32(r.buff + 1 - (r.count >> 3), (int)block_size - 4)) + return MPC_STATUS_FAIL; + + si->stream_version = mpc_bits_read(&r, 8); + if (si->stream_version != 8) + return MPC_STATUS_FAIL; + + mpc_bits_get_size(&r, &si->samples); + mpc_bits_get_size(&r, &si->beg_silence); + + si->is_true_gapless = 1; + si->sample_freq = samplefreqs[mpc_bits_read(&r, 3)]; + si->max_band = mpc_bits_read(&r, 5) + 1; + si->channels = mpc_bits_read(&r, 4) + 1; + si->ms = mpc_bits_read(&r, 1); + si->block_pwr = mpc_bits_read(&r, 3) * 2; + + si->bitrate = 0; + + if ((si->samples - si->beg_silence) != 0) + si->average_bitrate = (si->tag_offset - si->header_position) * 8.0 + * si->sample_freq / (si->samples - si->beg_silence); + + return check_streaminfo(si); +} + +/// Reads encoder informations +void streaminfo_encoder_info(mpc_streaminfo* si, const mpc_bits_reader * r_in) +{ + mpc_bits_reader r = *r_in; + + si->profile = mpc_bits_read(&r, 7) / 8.; + si->profile_name = mpc_get_version_string(si->profile); + si->pns = mpc_bits_read(&r, 1); + si->encoder_version = mpc_bits_read(&r, 8) << 24; // major + si->encoder_version |= mpc_bits_read(&r, 8) << 16; // minor + si->encoder_version |= mpc_bits_read(&r, 8) << 8; // build + + + mpc_get_encoder_string(si); +} + +double +mpc_streaminfo_get_length(mpc_streaminfo * si) +{ + return (double) (si->samples - si->beg_silence) / si->sample_freq; +} + +mpc_int64_t mpc_streaminfo_get_length_samples(mpc_streaminfo *si) +{ + return si->samples - si->beg_silence; +} diff --git a/Mednafen/mednafen/mpcdec/streaminfo.h b/Mednafen/mednafen/mpcdec/streaminfo.h new file mode 100644 index 0000000000..f7ecc14375 --- /dev/null +++ b/Mednafen/mednafen/mpcdec/streaminfo.h @@ -0,0 +1,109 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file streaminfo.h +#ifndef _MPCDEC_STREAMINFO_H_ +#define _MPCDEC_STREAMINFO_H_ +#ifdef WIN32 +#pragma once +#endif + +#include "mpc_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +typedef mpc_int32_t mpc_streaminfo_off_t; + +/// \brief mpc stream properties structure +/// +/// Structure containing all the properties of an mpc stream. Populated +/// by the streaminfo_read function. +typedef struct mpc_streaminfo { + /// @name Core mpc stream properties + //@{ + mpc_uint32_t sample_freq; ///< Sample frequency of stream + mpc_uint32_t channels; ///< Number of channels in stream + mpc_uint32_t stream_version; ///< Streamversion of stream + mpc_uint32_t bitrate; ///< Bitrate of stream file (in bps) + double average_bitrate; ///< Average bitrate of stream (in bits/sec) + mpc_uint32_t max_band; ///< Maximum band-index used in stream (0...31) + mpc_uint32_t ms; ///< Mid/side stereo (0: off, 1: on) + mpc_uint32_t fast_seek; ///< True if stream supports fast-seeking (sv7) + mpc_uint32_t block_pwr; ///< Number of frames in a block = 2^block_pwr (sv8) + //@} + + /// @name Replaygain properties + //@{ + mpc_uint16_t gain_title; ///< Replaygain title value + mpc_uint16_t gain_album; ///< Replaygain album value + mpc_uint16_t peak_album; ///< Peak album loudness level + mpc_uint16_t peak_title; ///< Peak title loudness level + //@} + + /// @name True gapless properties + //@{ + mpc_uint32_t is_true_gapless; ///< True gapless? (0: no, 1: yes) + mpc_uint64_t samples; ///< Number of samples in the stream + mpc_uint64_t beg_silence; ///< Number of samples that must not be played at the beginning of the stream + //@} + + /// @name Encoder informations + //@{ + mpc_uint32_t encoder_version; ///< Version of encoder used + char encoder[256]; ///< Encoder name + mpc_bool_t pns; ///< pns used + float profile; ///< Quality profile of stream + const char* profile_name; ///< Name of profile used by stream + //@} + + + mpc_streaminfo_off_t header_position; ///< Byte offset of position of header in stream + mpc_streaminfo_off_t tag_offset; ///< Offset to file tags + mpc_streaminfo_off_t total_file_length; ///< Total length of underlying file +} mpc_streaminfo; + +/// Gets length of stream si, in seconds. +/// \return length of stream in seconds +MPC_API double mpc_streaminfo_get_length(mpc_streaminfo *si); + +/// Returns length of stream si, in samples. +/// \return length of stream in samples +MPC_API mpc_int64_t mpc_streaminfo_get_length_samples(mpc_streaminfo *si); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Mednafen/mednafen/mpcdec/synth_filter.c b/Mednafen/mednafen/mpcdec/synth_filter.c new file mode 100644 index 0000000000..401da6d94e --- /dev/null +++ b/Mednafen/mednafen/mpcdec/synth_filter.c @@ -0,0 +1,430 @@ +/* + Copyright (c) 2005-2009, The Musepack Development Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the The Musepack Development Team nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/// \file synth_filter.c +/// Synthesis functions. +/// \todo document me +#include +#include "mpcdec.h" +#include "decoder.h" +#include "mpcdec_math.h" + +/* C O N S T A N T S */ +#define MPC_FIXED_POINT_SYNTH_FIX 2 + +#undef _ +#ifdef MPC_FIXED_POINT +#define _(value) MPC_MAKE_FRACT_CONST((double)value/(double)(0x40000)) +#else +#define _(value) MAKE_MPC_SAMPLE((double)value/(double)(0x10000)) +#endif + + +static const MPC_SAMPLE_FORMAT Di_opt [32] [16] = { + { _( 0), _( -29), _( 213), _( -459), _( 2037), _(-5153), _( 6574), _(-37489), _(75038), _(37489), _(6574), _( 5153), _(2037), _( 459), _(213), _(29) }, + { _( -1), _( -31), _( 218), _( -519), _( 2000), _(-5517), _( 5959), _(-39336), _(74992), _(35640), _(7134), _( 4788), _(2063), _( 401), _(208), _(26) }, + { _( -1), _( -35), _( 222), _( -581), _( 1952), _(-5879), _( 5288), _(-41176), _(74856), _(33791), _(7640), _( 4425), _(2080), _( 347), _(202), _(24) }, + { _( -1), _( -38), _( 225), _( -645), _( 1893), _(-6237), _( 4561), _(-43006), _(74630), _(31947), _(8092), _( 4063), _(2087), _( 294), _(196), _(21) }, + { _( -1), _( -41), _( 227), _( -711), _( 1822), _(-6589), _( 3776), _(-44821), _(74313), _(30112), _(8492), _( 3705), _(2085), _( 244), _(190), _(19) }, + { _( -1), _( -45), _( 228), _( -779), _( 1739), _(-6935), _( 2935), _(-46617), _(73908), _(28289), _(8840), _( 3351), _(2075), _( 197), _(183), _(17) }, + { _( -1), _( -49), _( 228), _( -848), _( 1644), _(-7271), _( 2037), _(-48390), _(73415), _(26482), _(9139), _( 3004), _(2057), _( 153), _(176), _(16) }, + { _( -2), _( -53), _( 227), _( -919), _( 1535), _(-7597), _( 1082), _(-50137), _(72835), _(24694), _(9389), _( 2663), _(2032), _( 111), _(169), _(14) }, + { _( -2), _( -58), _( 224), _( -991), _( 1414), _(-7910), _( 70), _(-51853), _(72169), _(22929), _(9592), _( 2330), _(2001), _( 72), _(161), _(13) }, + { _( -2), _( -63), _( 221), _(-1064), _( 1280), _(-8209), _( -998), _(-53534), _(71420), _(21189), _(9750), _( 2006), _(1962), _( 36), _(154), _(11) }, + { _( -2), _( -68), _( 215), _(-1137), _( 1131), _(-8491), _( -2122), _(-55178), _(70590), _(19478), _(9863), _( 1692), _(1919), _( 2), _(147), _(10) }, + { _( -3), _( -73), _( 208), _(-1210), _( 970), _(-8755), _( -3300), _(-56778), _(69679), _(17799), _(9935), _( 1388), _(1870), _( -29), _(139), _( 9) }, + { _( -3), _( -79), _( 200), _(-1283), _( 794), _(-8998), _( -4533), _(-58333), _(68692), _(16155), _(9966), _( 1095), _(1817), _( -57), _(132), _( 8) }, + { _( -4), _( -85), _( 189), _(-1356), _( 605), _(-9219), _( -5818), _(-59838), _(67629), _(14548), _(9959), _( 814), _(1759), _( -83), _(125), _( 7) }, + { _( -4), _( -91), _( 177), _(-1428), _( 402), _(-9416), _( -7154), _(-61289), _(66494), _(12980), _(9916), _( 545), _(1698), _(-106), _(117), _( 7) }, + { _( -5), _( -97), _( 163), _(-1498), _( 185), _(-9585), _( -8540), _(-62684), _(65290), _(11455), _(9838), _( 288), _(1634), _(-127), _(111), _( 6) }, + { _( -5), _(-104), _( 146), _(-1567), _( -45), _(-9727), _( -9975), _(-64019), _(64019), _( 9975), _(9727), _( 45), _(1567), _(-146), _(104), _( 5) }, + { _( -6), _(-111), _( 127), _(-1634), _( -288), _(-9838), _(-11455), _(-65290), _(62684), _( 8540), _(9585), _( -185), _(1498), _(-163), _( 97), _( 5) }, + { _( -7), _(-117), _( 106), _(-1698), _( -545), _(-9916), _(-12980), _(-66494), _(61289), _( 7154), _(9416), _( -402), _(1428), _(-177), _( 91), _( 4) }, + { _( -7), _(-125), _( 83), _(-1759), _( -814), _(-9959), _(-14548), _(-67629), _(59838), _( 5818), _(9219), _( -605), _(1356), _(-189), _( 85), _( 4) }, + { _( -8), _(-132), _( 57), _(-1817), _(-1095), _(-9966), _(-16155), _(-68692), _(58333), _( 4533), _(8998), _( -794), _(1283), _(-200), _( 79), _( 3) }, + { _( -9), _(-139), _( 29), _(-1870), _(-1388), _(-9935), _(-17799), _(-69679), _(56778), _( 3300), _(8755), _( -970), _(1210), _(-208), _( 73), _( 3) }, + { _(-10), _(-147), _( -2), _(-1919), _(-1692), _(-9863), _(-19478), _(-70590), _(55178), _( 2122), _(8491), _(-1131), _(1137), _(-215), _( 68), _( 2) }, + { _(-11), _(-154), _( -36), _(-1962), _(-2006), _(-9750), _(-21189), _(-71420), _(53534), _( 998), _(8209), _(-1280), _(1064), _(-221), _( 63), _( 2) }, + { _(-13), _(-161), _( -72), _(-2001), _(-2330), _(-9592), _(-22929), _(-72169), _(51853), _( -70), _(7910), _(-1414), _( 991), _(-224), _( 58), _( 2) }, + { _(-14), _(-169), _(-111), _(-2032), _(-2663), _(-9389), _(-24694), _(-72835), _(50137), _(-1082), _(7597), _(-1535), _( 919), _(-227), _( 53), _( 2) }, + { _(-16), _(-176), _(-153), _(-2057), _(-3004), _(-9139), _(-26482), _(-73415), _(48390), _(-2037), _(7271), _(-1644), _( 848), _(-228), _( 49), _( 1) }, + { _(-17), _(-183), _(-197), _(-2075), _(-3351), _(-8840), _(-28289), _(-73908), _(46617), _(-2935), _(6935), _(-1739), _( 779), _(-228), _( 45), _( 1) }, + { _(-19), _(-190), _(-244), _(-2085), _(-3705), _(-8492), _(-30112), _(-74313), _(44821), _(-3776), _(6589), _(-1822), _( 711), _(-227), _( 41), _( 1) }, + { _(-21), _(-196), _(-294), _(-2087), _(-4063), _(-8092), _(-31947), _(-74630), _(43006), _(-4561), _(6237), _(-1893), _( 645), _(-225), _( 38), _( 1) }, + { _(-24), _(-202), _(-347), _(-2080), _(-4425), _(-7640), _(-33791), _(-74856), _(41176), _(-5288), _(5879), _(-1952), _( 581), _(-222), _( 35), _( 1) }, + { _(-26), _(-208), _(-401), _(-2063), _(-4788), _(-7134), _(-35640), _(-74992), _(39336), _(-5959), _(5517), _(-2000), _( 519), _(-218), _( 31), _( 1) } +}; + +#undef _ + +static void +mpc_compute_new_V(const MPC_SAMPLE_FORMAT* p_sample, MPC_SAMPLE_FORMAT* pV) +{ + // Calculating new V-buffer values for left channel + // calculate new V-values (ISO-11172-3, p. 39) + // based upon fast-MDCT algorithm by Byeong Gi Lee + MPC_SAMPLE_FORMAT A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15; + MPC_SAMPLE_FORMAT B00, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15; + MPC_SAMPLE_FORMAT tmp; + + A00 = p_sample[ 0] + p_sample[31]; + A01 = p_sample[ 1] + p_sample[30]; + A02 = p_sample[ 2] + p_sample[29]; + A03 = p_sample[ 3] + p_sample[28]; + A04 = p_sample[ 4] + p_sample[27]; + A05 = p_sample[ 5] + p_sample[26]; + A06 = p_sample[ 6] + p_sample[25]; + A07 = p_sample[ 7] + p_sample[24]; + A08 = p_sample[ 8] + p_sample[23]; + A09 = p_sample[ 9] + p_sample[22]; + A10 = p_sample[10] + p_sample[21]; + A11 = p_sample[11] + p_sample[20]; + A12 = p_sample[12] + p_sample[19]; + A13 = p_sample[13] + p_sample[18]; + A14 = p_sample[14] + p_sample[17]; + A15 = p_sample[15] + p_sample[16]; + + B00 = A00 + A15; + B01 = A01 + A14; + B02 = A02 + A13; + B03 = A03 + A12; + B04 = A04 + A11; + B05 = A05 + A10; + B06 = A06 + A09; + B07 = A07 + A08;; + B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31); + B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31); + B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31); + B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31); + B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31); + B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30); + B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30); + B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28); + + A00 = B00 + B07; + A01 = B01 + B06; + A02 = B02 + B05; + A03 = B03 + B04; + A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31); + A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31); + A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31); + A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29); + A08 = B08 + B15; + A09 = B09 + B14; + A10 = B10 + B13; + A11 = B11 + B12; + A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31); + A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31); + A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31); + A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29); + + B00 = A00 + A03; + B01 = A01 + A02; + B02 = MPC_MULTIPLY_FRACT_CONST_FIX((A00 - A03) , 0.5411961079f , 1); + B03 = MPC_MULTIPLY_FRACT_CONST_FIX((A01 - A02) , 1.3065630198f , 2); + B04 = A04 + A07; + B05 = A05 + A06; + B06 = MPC_MULTIPLY_FRACT_CONST_FIX((A04 - A07) , 0.5411961079f , 1); + B07 = MPC_MULTIPLY_FRACT_CONST_FIX((A05 - A06) , 1.3065630198f , 2); + B08 = A08 + A11; + B09 = A09 + A10; + B10 = MPC_MULTIPLY_FRACT_CONST_FIX((A08 - A11) , 0.5411961079f , 1); + B11 = MPC_MULTIPLY_FRACT_CONST_FIX((A09 - A10) , 1.3065630198f , 2); + B12 = A12 + A15; + B13 = A13 + A14; + B14 = MPC_MULTIPLY_FRACT_CONST_FIX((A12 - A15) , 0.5411961079f , 1); + B15 = MPC_MULTIPLY_FRACT_CONST_FIX((A13 - A14) , 1.3065630198f , 2); + + A00 = B00 + B01; + A01 = MPC_MULTIPLY_FRACT_CONST_FIX((B00 - B01) , 0.7071067691f , 1); + A02 = B02 + B03; + A03 = MPC_MULTIPLY_FRACT_CONST_FIX((B02 - B03) , 0.7071067691f , 1); + A04 = B04 + B05; + A05 = MPC_MULTIPLY_FRACT_CONST_FIX((B04 - B05) , 0.7071067691f , 1); + A06 = B06 + B07; + A07 = MPC_MULTIPLY_FRACT_CONST_FIX((B06 - B07) , 0.7071067691f , 1); + A08 = B08 + B09; + A09 = MPC_MULTIPLY_FRACT_CONST_FIX((B08 - B09) , 0.7071067691f , 1); + A10 = B10 + B11; + A11 = MPC_MULTIPLY_FRACT_CONST_FIX((B10 - B11) , 0.7071067691f , 1); + A12 = B12 + B13; + A13 = MPC_MULTIPLY_FRACT_CONST_FIX((B12 - B13) , 0.7071067691f , 1); + A14 = B14 + B15; + A15 = MPC_MULTIPLY_FRACT_CONST_FIX((B14 - B15) , 0.7071067691f , 1); + + pV[48] = -A00; + pV[ 0] = A01; + pV[40] = -A02 - (pV[ 8] = A03); + pV[36] = -((pV[ 4] = A05 + (pV[12] = A07)) + A06); + pV[44] = - A04 - A06 - A07; + pV[ 6] = (pV[10] = A11 + (pV[14] = A15)) + A13; + pV[38] = (pV[34] = -(pV[ 2] = A09 + A13 + A15) - A14) + A09 - A10 - A11; + pV[46] = (tmp = -(A12 + A14 + A15)) - A08; + pV[42] = tmp - A10 - A11; + + A00 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 0] - p_sample[31]) , 0.5006030202f , MPC_FIXED_POINT_SYNTH_FIX); + A01 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 1] - p_sample[30]) , 0.5054709315f , MPC_FIXED_POINT_SYNTH_FIX); + A02 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 2] - p_sample[29]) , 0.5154473186f , MPC_FIXED_POINT_SYNTH_FIX); + A03 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 3] - p_sample[28]) , 0.5310425758f , MPC_FIXED_POINT_SYNTH_FIX); + A04 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 4] - p_sample[27]) , 0.5531039238f , MPC_FIXED_POINT_SYNTH_FIX); + A05 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 5] - p_sample[26]) , 0.5829349756f , MPC_FIXED_POINT_SYNTH_FIX); + A06 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 6] - p_sample[25]) , 0.6225041151f , MPC_FIXED_POINT_SYNTH_FIX); + A07 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 7] - p_sample[24]) , 0.6748083234f , MPC_FIXED_POINT_SYNTH_FIX); + A08 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 8] - p_sample[23]) , 0.7445362806f , MPC_FIXED_POINT_SYNTH_FIX); + A09 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 9] - p_sample[22]) , 0.8393496275f , MPC_FIXED_POINT_SYNTH_FIX); + A10 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[10] - p_sample[21]) , 0.9725682139f , MPC_FIXED_POINT_SYNTH_FIX); +#if MPC_FIXED_POINT_SYNTH_FIX>=2 + A11 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[11] - p_sample[20]) , 1.1694399118f , MPC_FIXED_POINT_SYNTH_FIX); + A12 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[12] - p_sample[19]) , 1.4841645956f , MPC_FIXED_POINT_SYNTH_FIX); +#else + A11 = MPC_SCALE_CONST_SHR ((p_sample[11] - p_sample[20]) , 1.1694399118f , 30, MPC_FIXED_POINT_SYNTH_FIX); + A12 = MPC_SCALE_CONST_SHR ((p_sample[12] - p_sample[19]) , 1.4841645956f , 30, MPC_FIXED_POINT_SYNTH_FIX); +#endif + A13 = MPC_SCALE_CONST_SHR ((p_sample[13] - p_sample[18]) , 2.0577809811f , 29, MPC_FIXED_POINT_SYNTH_FIX); + A14 = MPC_SCALE_CONST_SHR ((p_sample[14] - p_sample[17]) , 3.4076085091f , 29, MPC_FIXED_POINT_SYNTH_FIX); + A15 = MPC_SCALE_CONST_SHR ((p_sample[15] - p_sample[16]) , 10.1900081635f, 27 ,MPC_FIXED_POINT_SYNTH_FIX); + + B00 = A00 + A15; + B01 = A01 + A14; + B02 = A02 + A13; + B03 = A03 + A12; + B04 = A04 + A11; + B05 = A05 + A10; + B06 = A06 + A09; + B07 = A07 + A08; + B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31); + B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31); + B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31); + B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31); + B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31); + B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30); + B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30); + B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28); + + A00 = B00 + B07; + A01 = B01 + B06; + A02 = B02 + B05; + A03 = B03 + B04; + A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31); + A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31); + A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31); + A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29); + A08 = B08 + B15; + A09 = B09 + B14; + A10 = B10 + B13; + A11 = B11 + B12; + A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31); + A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31); + A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31); + A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29); + + B00 = A00 + A03; + B01 = A01 + A02; + B02 = MPC_SCALE_CONST((A00 - A03) , 0.5411961079f , 31); + B03 = MPC_SCALE_CONST((A01 - A02) , 1.3065630198f , 30); + B04 = A04 + A07; + B05 = A05 + A06; + B06 = MPC_SCALE_CONST((A04 - A07) , 0.5411961079f , 31); + B07 = MPC_SCALE_CONST((A05 - A06) , 1.3065630198f , 30); + B08 = A08 + A11; + B09 = A09 + A10; + B10 = MPC_SCALE_CONST((A08 - A11) , 0.5411961079f , 31); + B11 = MPC_SCALE_CONST((A09 - A10) , 1.3065630198f , 30); + B12 = A12 + A15; + B13 = A13 + A14; + B14 = MPC_SCALE_CONST((A12 - A15) , 0.5411961079f , 31); + B15 = MPC_SCALE_CONST((A13 - A14) , 1.3065630198f , 30); + + A00 = MPC_SHL(B00 + B01, MPC_FIXED_POINT_SYNTH_FIX); + A01 = MPC_SCALE_CONST_SHL((B00 - B01) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A02 = MPC_SHL(B02 + B03, MPC_FIXED_POINT_SYNTH_FIX); + A03 = MPC_SCALE_CONST_SHL((B02 - B03) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A04 = MPC_SHL(B04 + B05, MPC_FIXED_POINT_SYNTH_FIX); + A05 = MPC_SCALE_CONST_SHL((B04 - B05) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A06 = MPC_SHL(B06 + B07, MPC_FIXED_POINT_SYNTH_FIX); + A07 = MPC_SCALE_CONST_SHL((B06 - B07) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A08 = MPC_SHL(B08 + B09, MPC_FIXED_POINT_SYNTH_FIX); + A09 = MPC_SCALE_CONST_SHL((B08 - B09) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A10 = MPC_SHL(B10 + B11, MPC_FIXED_POINT_SYNTH_FIX); + A11 = MPC_SCALE_CONST_SHL((B10 - B11) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A12 = MPC_SHL(B12 + B13, MPC_FIXED_POINT_SYNTH_FIX); + A13 = MPC_SCALE_CONST_SHL((B12 - B13) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + A14 = MPC_SHL(B14 + B15, MPC_FIXED_POINT_SYNTH_FIX); + A15 = MPC_SCALE_CONST_SHL((B14 - B15) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX); + + // mehrfach verwendete Ausdrcke: A04+A06+A07, A09+A13+A15 + pV[ 5] = (pV[11] = (pV[13] = A07 + (pV[15] = A15)) + A11) + A05 + A13; + pV[ 7] = (pV[ 9] = A03 + A11 + A15) + A13; + pV[33] = -(pV[ 1] = A01 + A09 + A13 + A15) - A14; + pV[35] = -(pV[ 3] = A05 + A07 + A09 + A13 + A15) - A06 - A14; + pV[37] = (tmp = -(A10 + A11 + A13 + A14 + A15)) - A05 - A06 - A07; + pV[39] = tmp - A02 - A03; // abh�gig vom Befehl drber + pV[41] = (tmp += A13 - A12) - A02 - A03; // abh�gig vom Befehl 2 drber + pV[43] = tmp - A04 - A06 - A07; // abh�gig von Befehlen 1 und 3 drber + pV[47] = (tmp = -(A08 + A12 + A14 + A15)) - A00; + pV[45] = tmp - A04 - A06 - A07; // abh�gig vom Befehl drber + + pV[32] = -pV[ 0]; + pV[31] = -pV[ 1]; + pV[30] = -pV[ 2]; + pV[29] = -pV[ 3]; + pV[28] = -pV[ 4]; + pV[27] = -pV[ 5]; + pV[26] = -pV[ 6]; + pV[25] = -pV[ 7]; + pV[24] = -pV[ 8]; + pV[23] = -pV[ 9]; + pV[22] = -pV[10]; + pV[21] = -pV[11]; + pV[20] = -pV[12]; + pV[19] = -pV[13]; + pV[18] = -pV[14]; + pV[17] = -pV[15]; + + pV[63] = pV[33]; + pV[62] = pV[34]; + pV[61] = pV[35]; + pV[60] = pV[36]; + pV[59] = pV[37]; + pV[58] = pV[38]; + pV[57] = pV[39]; + pV[56] = pV[40]; + pV[55] = pV[41]; + pV[54] = pV[42]; + pV[53] = pV[43]; + pV[52] = pV[44]; + pV[51] = pV[45]; + pV[50] = pV[46]; + pV[49] = pV[47]; +} + +static void +mpc_synthese_filter_float_internal(MPC_SAMPLE_FORMAT* p_out, MPC_SAMPLE_FORMAT* pV, const MPC_SAMPLE_FORMAT* pY, mpc_int_t channels) +{ + mpc_uint32_t n; + for ( n = 0; n < 36; n++, pY += 32 ) + { + MPC_SAMPLE_FORMAT* pData = p_out; + const MPC_SAMPLE_FORMAT* pD = (const MPC_SAMPLE_FORMAT*) &Di_opt; + mpc_int32_t k; + pV -= 64; + mpc_compute_new_V( pY, pV ); + for ( k = 0; k < 32; k++, pD += 16, pV++ ) + { + *pData = MPC_SHL( + MPC_MULTIPLY_FRACT(pV[ 0], pD[ 0]) + MPC_MULTIPLY_FRACT(pV[ 96], pD[ 1]) + MPC_MULTIPLY_FRACT(pV[128], pD[ 2]) + MPC_MULTIPLY_FRACT(pV[224], pD[ 3]) + + MPC_MULTIPLY_FRACT(pV[256], pD[ 4]) + MPC_MULTIPLY_FRACT(pV[352], pD[ 5]) + MPC_MULTIPLY_FRACT(pV[384], pD[ 6]) + MPC_MULTIPLY_FRACT(pV[480], pD[ 7]) + + MPC_MULTIPLY_FRACT(pV[512], pD[ 8]) + MPC_MULTIPLY_FRACT(pV[608], pD[ 9]) + MPC_MULTIPLY_FRACT(pV[640], pD[10]) + MPC_MULTIPLY_FRACT(pV[736], pD[11]) + + MPC_MULTIPLY_FRACT(pV[768], pD[12]) + MPC_MULTIPLY_FRACT(pV[864], pD[13]) + MPC_MULTIPLY_FRACT(pV[896], pD[14]) + MPC_MULTIPLY_FRACT(pV[992], pD[15]) + , 2); + pData += channels; + } + pV -= 32; //bleh + p_out += 32 * channels; + } +} + +void +mpc_decoder_synthese_filter_float(mpc_decoder* p_dec, MPC_SAMPLE_FORMAT* p_out, mpc_int_t channels) +{ + /********* left channel ********/ + memmove(&p_dec->V_L[MPC_V_MEM], p_dec->V_L, 960 * sizeof *p_dec->V_L); + mpc_synthese_filter_float_internal(p_out, &p_dec->V_L[MPC_V_MEM], p_dec->Y_L[0], channels); + + /******** right channel ********/ + if (channels > 1) { + memmove(&p_dec->V_R[MPC_V_MEM], p_dec->V_R, 960 * sizeof *p_dec->V_R); + mpc_synthese_filter_float_internal(p_out + 1, &p_dec->V_R[MPC_V_MEM], p_dec->Y_R[0], channels); + } +} + +/*******************************************/ +/* */ +/* dithered synthesis */ +/* */ +/*******************************************/ + +static const mpc_uint8_t Parity [256] = { // parity + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 +}; + +/* + * This is a simple random number generator with good quality for audio purposes. + * It consists of two polycounters with opposite rotation direction and different + * periods. The periods are coprime, so the total period is the product of both. + * + * ------------------------------------------------------------------------------------------------- + * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| + * | ------------------------------------------------------------------------------------------------- + * | | | | | | | + * | +--+--+--+-XOR-+--------+ + * | | + * +--------------------------------------------------------------------------------------+ + * + * ------------------------------------------------------------------------------------------------- + * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ + * ------------------------------------------------------------------------------------------------- | + * | | | | | + * +--+----XOR----+--+ | + * | | + * +----------------------------------------------------------------------------------------+ + * + * + * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, + * which gives a period of 18.410.713.077.675.721.215. The result is the + * XORed values of both generators. + */ +mpc_uint32_t +mpc_random_int(mpc_decoder* p_dec) +{ +#if 1 + mpc_uint32_t t1, t2, t3, t4; + + t3 = t1 = p_dec->__r1; t4 = t2 = p_dec->__r2; // Parity calculation is done via table lookup, this is also available + t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable + t1 = Parity[t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations. + t1 <<= 31; t2 = Parity[t2]; + + return (p_dec->__r1 = (t3 >> 1) | t1 ) ^ (p_dec->__r2 = (t4 + t4) | t2 ); +#else + return (p_dec->__r1 = (p_dec->__r1 >> 1) | ((mpc_uint32_t) Parity[ p_dec->__r1 & 0xF5] << 31)) + ^ (p_dec->__r2 = (p_dec->__r2 << 1) | (mpc_uint32_t) Parity[(p_dec->__r2 >> 25) & 0x63]); +#endif +} diff --git a/Mednafen/mednafen/nes/Makefile.am b/Mednafen/mednafen/nes/Makefile.am new file mode 100644 index 0000000000..7523139670 --- /dev/null +++ b/Mednafen/mednafen/nes/Makefile.am @@ -0,0 +1,16 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libnes.a +libnes_a_SOURCES = nes.cpp x6502.cpp cart.cpp fds.cpp ines.cpp input.cpp nsf.cpp nsfe.cpp unif.cpp vsuni.cpp sound.cpp filter.cpp fds-sound.cpp + +if WANT_DEBUGGER +libnes_a_SOURCES += debug.cpp +endif + +include ppu/Makefile.am.inc +include boards/Makefile.am.inc +include input/Makefile.am.inc + +libnes_a_SOURCES += ntsc/nes_ntsc.cpp diff --git a/Mednafen/mednafen/nes/Makefile.in b/Mednafen/mednafen/nes/Makefile.in new file mode 100644 index 0000000000..3062fbdba2 --- /dev/null +++ b/Mednafen/mednafen/nes/Makefile.in @@ -0,0 +1,1190 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = debug.cpp +DIST_COMMON = $(srcdir)/ppu/Makefile.am.inc \ + $(srcdir)/boards/Makefile.am.inc \ + $(srcdir)/input/Makefile.am.inc $(srcdir)/Makefile.in \ + $(srcdir)/Makefile.am $(top_srcdir)/mkinstalldirs \ + $(top_srcdir)/depcomp +subdir = src/nes +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libnes_a_AR = $(AR) $(ARFLAGS) +libnes_a_LIBADD = +am__libnes_a_SOURCES_DIST = nes.cpp x6502.cpp cart.cpp fds.cpp \ + ines.cpp input.cpp nsf.cpp nsfe.cpp unif.cpp vsuni.cpp \ + sound.cpp filter.cpp fds-sound.cpp debug.cpp ppu/ppu.cpp \ + ppu/palette.cpp boards/8237.cpp boards/h2288.cpp \ + boards/simple.cpp boards/super24.cpp boards/mmc2and4.cpp \ + boards/vrc6.cpp boards/emu2413.cpp boards/vrc7.cpp \ + boards/96.cpp boards/208.cpp boards/187.cpp boards/95.cpp \ + boards/fme7.cpp boards/mmc5.cpp boards/mmc3.cpp \ + boards/mmc1.cpp boards/tengen.cpp boards/90.cpp \ + boards/deirom.cpp boards/n106.cpp boards/maxicart.cpp \ + boards/112.cpp boards/113.cpp boards/114.cpp boards/117.cpp \ + boards/22.cpp boards/23.cpp boards/25.cpp boards/67.cpp \ + boards/68.cpp boards/16.cpp boards/97.cpp boards/99.cpp \ + boards/151.cpp boards/180.cpp boards/182.cpp boards/184.cpp \ + boards/88.cpp boards/89.cpp boards/92.cpp boards/86.cpp \ + boards/82.cpp boards/80.cpp boards/18.cpp boards/21.cpp \ + boards/228.cpp boards/234.cpp boards/232.cpp boards/42.cpp \ + boards/ffe.cpp boards/65.cpp boards/nina06.cpp boards/73.cpp \ + boards/32.cpp boards/33.cpp boards/41.cpp boards/46.cpp \ + boards/72.cpp boards/75.cpp boards/76.cpp boards/77.cpp \ + boards/colordreams.cpp boards/140.cpp boards/93.cpp \ + boards/94.cpp boards/malee.cpp boards/156.cpp \ + boards/supervision.cpp boards/novel.cpp boards/242.cpp \ + boards/246.cpp boards/248.cpp boards/15.cpp boards/8.cpp \ + boards/193.cpp boards/189.cpp boards/244.cpp boards/sachen.cpp \ + boards/107.cpp boards/51.cpp boards/152.cpp boards/70.cpp \ + boards/185.cpp boards/78.cpp boards/87.cpp boards/34.cpp \ + boards/222.cpp boards/codemasters.cpp boards/38.cpp \ + boards/240.cpp boards/241.cpp boards/163.cpp input/cursor.cpp \ + input/zapper.cpp input/powerpad.cpp input/arkanoid.cpp \ + input/shadow.cpp input/fkb.cpp input/fkb.h input/hypershot.cpp \ + input/mahjong.cpp input/oekakids.cpp input/ftrainer.cpp \ + input/partytap.cpp input/toprider.cpp input/bworld.cpp \ + input/suborkb.cpp ntsc/nes_ntsc.cpp +@WANT_DEBUGGER_TRUE@am__objects_1 = debug.$(OBJEXT) +am__dirstamp = $(am__leading_dot)dirstamp +am_libnes_a_OBJECTS = nes.$(OBJEXT) x6502.$(OBJEXT) cart.$(OBJEXT) \ + fds.$(OBJEXT) ines.$(OBJEXT) input.$(OBJEXT) nsf.$(OBJEXT) \ + nsfe.$(OBJEXT) unif.$(OBJEXT) vsuni.$(OBJEXT) sound.$(OBJEXT) \ + filter.$(OBJEXT) fds-sound.$(OBJEXT) $(am__objects_1) \ + ppu/ppu.$(OBJEXT) ppu/palette.$(OBJEXT) boards/8237.$(OBJEXT) \ + boards/h2288.$(OBJEXT) boards/simple.$(OBJEXT) \ + boards/super24.$(OBJEXT) boards/mmc2and4.$(OBJEXT) \ + boards/vrc6.$(OBJEXT) boards/emu2413.$(OBJEXT) \ + boards/vrc7.$(OBJEXT) boards/96.$(OBJEXT) boards/208.$(OBJEXT) \ + boards/187.$(OBJEXT) boards/95.$(OBJEXT) boards/fme7.$(OBJEXT) \ + boards/mmc5.$(OBJEXT) boards/mmc3.$(OBJEXT) \ + boards/mmc1.$(OBJEXT) boards/tengen.$(OBJEXT) \ + boards/90.$(OBJEXT) boards/deirom.$(OBJEXT) \ + boards/n106.$(OBJEXT) boards/maxicart.$(OBJEXT) \ + boards/112.$(OBJEXT) boards/113.$(OBJEXT) boards/114.$(OBJEXT) \ + boards/117.$(OBJEXT) boards/22.$(OBJEXT) boards/23.$(OBJEXT) \ + boards/25.$(OBJEXT) boards/67.$(OBJEXT) boards/68.$(OBJEXT) \ + boards/16.$(OBJEXT) boards/97.$(OBJEXT) boards/99.$(OBJEXT) \ + boards/151.$(OBJEXT) boards/180.$(OBJEXT) boards/182.$(OBJEXT) \ + boards/184.$(OBJEXT) boards/88.$(OBJEXT) boards/89.$(OBJEXT) \ + boards/92.$(OBJEXT) boards/86.$(OBJEXT) boards/82.$(OBJEXT) \ + boards/80.$(OBJEXT) boards/18.$(OBJEXT) boards/21.$(OBJEXT) \ + boards/228.$(OBJEXT) boards/234.$(OBJEXT) boards/232.$(OBJEXT) \ + boards/42.$(OBJEXT) boards/ffe.$(OBJEXT) boards/65.$(OBJEXT) \ + boards/nina06.$(OBJEXT) boards/73.$(OBJEXT) \ + boards/32.$(OBJEXT) boards/33.$(OBJEXT) boards/41.$(OBJEXT) \ + boards/46.$(OBJEXT) boards/72.$(OBJEXT) boards/75.$(OBJEXT) \ + boards/76.$(OBJEXT) boards/77.$(OBJEXT) \ + boards/colordreams.$(OBJEXT) boards/140.$(OBJEXT) \ + boards/93.$(OBJEXT) boards/94.$(OBJEXT) boards/malee.$(OBJEXT) \ + boards/156.$(OBJEXT) boards/supervision.$(OBJEXT) \ + boards/novel.$(OBJEXT) boards/242.$(OBJEXT) \ + boards/246.$(OBJEXT) boards/248.$(OBJEXT) boards/15.$(OBJEXT) \ + boards/8.$(OBJEXT) boards/193.$(OBJEXT) boards/189.$(OBJEXT) \ + boards/244.$(OBJEXT) boards/sachen.$(OBJEXT) \ + boards/107.$(OBJEXT) boards/51.$(OBJEXT) boards/152.$(OBJEXT) \ + boards/70.$(OBJEXT) boards/185.$(OBJEXT) boards/78.$(OBJEXT) \ + boards/87.$(OBJEXT) boards/34.$(OBJEXT) boards/222.$(OBJEXT) \ + boards/codemasters.$(OBJEXT) boards/38.$(OBJEXT) \ + boards/240.$(OBJEXT) boards/241.$(OBJEXT) boards/163.$(OBJEXT) \ + input/cursor.$(OBJEXT) input/zapper.$(OBJEXT) \ + input/powerpad.$(OBJEXT) input/arkanoid.$(OBJEXT) \ + input/shadow.$(OBJEXT) input/fkb.$(OBJEXT) \ + input/hypershot.$(OBJEXT) input/mahjong.$(OBJEXT) \ + input/oekakids.$(OBJEXT) input/ftrainer.$(OBJEXT) \ + input/partytap.$(OBJEXT) input/toprider.$(OBJEXT) \ + input/bworld.$(OBJEXT) input/suborkb.$(OBJEXT) \ + ntsc/nes_ntsc.$(OBJEXT) +libnes_a_OBJECTS = $(am_libnes_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libnes_a_SOURCES) +DIST_SOURCES = $(am__libnes_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libnes.a +libnes_a_SOURCES = nes.cpp x6502.cpp cart.cpp fds.cpp ines.cpp \ + input.cpp nsf.cpp nsfe.cpp unif.cpp vsuni.cpp sound.cpp \ + filter.cpp fds-sound.cpp $(am__append_1) ppu/ppu.cpp \ + ppu/palette.cpp boards/8237.cpp boards/h2288.cpp \ + boards/simple.cpp boards/super24.cpp boards/mmc2and4.cpp \ + boards/vrc6.cpp boards/emu2413.cpp boards/vrc7.cpp \ + boards/96.cpp boards/208.cpp boards/187.cpp boards/95.cpp \ + boards/fme7.cpp boards/mmc5.cpp boards/mmc3.cpp \ + boards/mmc1.cpp boards/tengen.cpp boards/90.cpp \ + boards/deirom.cpp boards/n106.cpp boards/maxicart.cpp \ + boards/112.cpp boards/113.cpp boards/114.cpp boards/117.cpp \ + boards/22.cpp boards/23.cpp boards/25.cpp boards/67.cpp \ + boards/68.cpp boards/16.cpp boards/97.cpp boards/99.cpp \ + boards/151.cpp boards/180.cpp boards/182.cpp boards/184.cpp \ + boards/88.cpp boards/89.cpp boards/92.cpp boards/86.cpp \ + boards/82.cpp boards/80.cpp boards/18.cpp boards/21.cpp \ + boards/228.cpp boards/234.cpp boards/232.cpp boards/42.cpp \ + boards/ffe.cpp boards/65.cpp boards/nina06.cpp boards/73.cpp \ + boards/32.cpp boards/33.cpp boards/41.cpp boards/46.cpp \ + boards/72.cpp boards/75.cpp boards/76.cpp boards/77.cpp \ + boards/colordreams.cpp boards/140.cpp boards/93.cpp \ + boards/94.cpp boards/malee.cpp boards/156.cpp \ + boards/supervision.cpp boards/novel.cpp boards/242.cpp \ + boards/246.cpp boards/248.cpp boards/15.cpp boards/8.cpp \ + boards/193.cpp boards/189.cpp boards/244.cpp boards/sachen.cpp \ + boards/107.cpp boards/51.cpp boards/152.cpp boards/70.cpp \ + boards/185.cpp boards/78.cpp boards/87.cpp boards/34.cpp \ + boards/222.cpp boards/codemasters.cpp boards/38.cpp \ + boards/240.cpp boards/241.cpp boards/163.cpp input/cursor.cpp \ + input/zapper.cpp input/powerpad.cpp input/arkanoid.cpp \ + input/shadow.cpp input/fkb.cpp input/fkb.h input/hypershot.cpp \ + input/mahjong.cpp input/oekakids.cpp input/ftrainer.cpp \ + input/partytap.cpp input/toprider.cpp input/bworld.cpp \ + input/suborkb.cpp ntsc/nes_ntsc.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/ppu/Makefile.am.inc $(srcdir)/boards/Makefile.am.inc $(srcdir)/input/Makefile.am.inc $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/nes/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/nes/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/ppu/Makefile.am.inc $(srcdir)/boards/Makefile.am.inc $(srcdir)/input/Makefile.am.inc: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +ppu/$(am__dirstamp): + @$(MKDIR_P) ppu + @: > ppu/$(am__dirstamp) +ppu/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ppu/$(DEPDIR) + @: > ppu/$(DEPDIR)/$(am__dirstamp) +ppu/ppu.$(OBJEXT): ppu/$(am__dirstamp) ppu/$(DEPDIR)/$(am__dirstamp) +ppu/palette.$(OBJEXT): ppu/$(am__dirstamp) \ + ppu/$(DEPDIR)/$(am__dirstamp) +boards/$(am__dirstamp): + @$(MKDIR_P) boards + @: > boards/$(am__dirstamp) +boards/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) boards/$(DEPDIR) + @: > boards/$(DEPDIR)/$(am__dirstamp) +boards/8237.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/h2288.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/simple.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/super24.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/mmc2and4.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/vrc6.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/emu2413.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/vrc7.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/96.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/208.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/187.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/95.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/fme7.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/mmc5.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/mmc3.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/mmc1.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/tengen.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/90.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/deirom.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/n106.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/maxicart.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/112.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/113.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/114.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/117.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/22.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/23.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/25.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/67.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/68.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/16.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/97.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/99.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/151.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/180.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/182.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/184.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/88.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/89.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/92.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/86.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/82.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/80.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/18.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/21.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/228.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/234.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/232.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/42.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/ffe.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/65.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/nina06.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/73.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/32.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/33.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/41.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/46.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/72.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/75.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/76.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/77.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/colordreams.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/140.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/93.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/94.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/malee.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/156.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/supervision.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/novel.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/242.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/246.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/248.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/15.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/8.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/193.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/189.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/244.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/sachen.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/107.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/51.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/152.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/70.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/185.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/78.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/87.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/34.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/222.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/codemasters.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/38.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/240.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/241.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +boards/163.$(OBJEXT): boards/$(am__dirstamp) \ + boards/$(DEPDIR)/$(am__dirstamp) +input/$(am__dirstamp): + @$(MKDIR_P) input + @: > input/$(am__dirstamp) +input/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) input/$(DEPDIR) + @: > input/$(DEPDIR)/$(am__dirstamp) +input/cursor.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/zapper.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/powerpad.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/arkanoid.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/shadow.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/fkb.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/hypershot.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/mahjong.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/oekakids.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/ftrainer.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/partytap.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/toprider.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/bworld.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/suborkb.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +ntsc/$(am__dirstamp): + @$(MKDIR_P) ntsc + @: > ntsc/$(am__dirstamp) +ntsc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ntsc/$(DEPDIR) + @: > ntsc/$(DEPDIR)/$(am__dirstamp) +ntsc/nes_ntsc.$(OBJEXT): ntsc/$(am__dirstamp) \ + ntsc/$(DEPDIR)/$(am__dirstamp) + +libnes.a: $(libnes_a_OBJECTS) $(libnes_a_DEPENDENCIES) $(EXTRA_libnes_a_DEPENDENCIES) + $(AM_V_at)-rm -f libnes.a + $(AM_V_AR)$(libnes_a_AR) libnes.a $(libnes_a_OBJECTS) $(libnes_a_LIBADD) + $(AM_V_at)$(RANLIB) libnes.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f boards/*.$(OBJEXT) + -rm -f input/*.$(OBJEXT) + -rm -f ntsc/*.$(OBJEXT) + -rm -f ppu/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fds-sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fds.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ines.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nsf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nsfe.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unif.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsuni.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x6502.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/107.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/112.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/113.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/114.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/117.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/140.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/15.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/151.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/152.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/156.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/16.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/163.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/18.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/180.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/182.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/184.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/185.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/187.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/189.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/193.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/208.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/21.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/22.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/222.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/228.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/23.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/232.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/234.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/240.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/241.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/242.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/244.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/246.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/248.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/25.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/32.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/33.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/34.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/38.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/41.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/42.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/46.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/51.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/65.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/67.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/68.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/70.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/72.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/73.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/75.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/76.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/77.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/78.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/8.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/80.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/82.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/8237.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/86.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/87.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/88.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/89.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/90.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/92.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/93.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/94.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/95.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/96.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/97.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/99.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/codemasters.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/colordreams.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/deirom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/emu2413.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/ffe.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/fme7.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/h2288.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/malee.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/maxicart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/mmc1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/mmc2and4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/mmc3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/mmc5.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/n106.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/nina06.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/novel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/sachen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/simple.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/super24.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/supervision.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/tengen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/vrc6.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@boards/$(DEPDIR)/vrc7.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/arkanoid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/bworld.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/cursor.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/fkb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/ftrainer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/hypershot.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/mahjong.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/oekakids.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/partytap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/powerpad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/shadow.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/suborkb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/toprider.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/zapper.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ntsc/$(DEPDIR)/nes_ntsc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ppu/$(DEPDIR)/palette.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ppu/$(DEPDIR)/ppu.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f boards/$(DEPDIR)/$(am__dirstamp) + -rm -f boards/$(am__dirstamp) + -rm -f input/$(DEPDIR)/$(am__dirstamp) + -rm -f input/$(am__dirstamp) + -rm -f ntsc/$(DEPDIR)/$(am__dirstamp) + -rm -f ntsc/$(am__dirstamp) + -rm -f ppu/$(DEPDIR)/$(am__dirstamp) + -rm -f ppu/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) boards/$(DEPDIR) input/$(DEPDIR) ntsc/$(DEPDIR) ppu/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) boards/$(DEPDIR) input/$(DEPDIR) ntsc/$(DEPDIR) ppu/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/nes/NES-TODO b/Mednafen/mednafen/nes/NES-TODO new file mode 100644 index 0000000000..010290c52c --- /dev/null +++ b/Mednafen/mednafen/nes/NES-TODO @@ -0,0 +1,28 @@ +************ +**Old TODO**: +************ + +The following games are broken to some extent: + +Crystalis: Mostly working, but the screen jumps around during + dialogue. It apparently resets the MMC3 IRQ counter + mid-scanline. It'll require low-level PPU and MMC3 + IRQ counter emulation to function properly. + +Kickmaster: IRQ occurs a few CPU cycles too late, interferes with NMI routine, + and causes the game to lock up after the second boss. Luckily, there + are passwords, at least. + *"FIXED" BY HACK* + +Star Wars(PAL Beam Software version): + MMC3 IRQ occurs when it shouldn't, similar to the problem in + Kickmaster. + *"FIXED" BY HACK* + +*** Emulation: + + Figure out what mapper 113 really is. + + Sound frame count stuff on PAL games(is it correct?). + + Fix Zapper emulation(one version of Chiller still doesn't always work correctly). diff --git a/Mednafen/mednafen/nes/boards/107.cpp b/Mednafen/mednafen/nes/boards/107.cpp new file mode 100644 index 0000000000..bac8780aa1 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/107.cpp @@ -0,0 +1,45 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg32(0x8000, latch >> 1); + setchr8(latch & 0x07); +} + +static DECLFW(m107w) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper107_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,m107w); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/112.cpp b/Mednafen/mednafen/nes/boards/112.cpp new file mode 100644 index 0000000000..9c3473be06 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/112.cpp @@ -0,0 +1,120 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static char Mirroring; +static uint8 RegSelect; +static uint8 Regs[8]; + +static uint8 *WRAM = NULL; + +static void SyncPRGCHR(void) +{ + setprg8(0x8000, Regs[0]); + setprg8(0xa000, Regs[1]); + setchr2(0x0000, Regs[2] >> 1); + setchr2(0x0800, Regs[3] >> 1); + setchr1(0x1000, Regs[4]); + setchr1(0x1400, Regs[5]); + setchr1(0x1800, Regs[6]); + setchr1(0x1C00, Regs[7]); +} + +static DECLFW(Mapper112_write) +{ + switch(A) + { + case 0xe000:Mirroring = V & 1; setmirror((V&1) ^ 1); break; + case 0x8000:RegSelect = V & 0x7; break; + case 0xa000:Regs[RegSelect & 7] = V; + SyncPRGCHR(); + break; + } +} + +static void Power(CartInfo *info) +{ + int x; + for(x = 0; x < 8; x++) + Regs[x] = ~0; + Mirroring = 1; + setmirror(Mirroring ^ 1); + SyncPRGCHR(); + setprg16(0xc000, 0x7F); + setprg8r(0x10, 0x6000, 0); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static void Close(void) +{ + if(WRAM) + { + free(WRAM); + WRAM = NULL; + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(RegSelect), + SFVAR(Mirroring), + SFARRAY(Regs, 8), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "M112"); + if(load) + { + Mirroring &= 1; + SyncPRGCHR(); + setmirror(Mirroring ^ 1); + } + + return(ret); +} + +int Mapper112_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper112_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + info->Power = Power; + info->Close = Close; + info->StateAction = StateAction; + + if(!(WRAM = (uint8 *)malloc(8192))) + return(0); + + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/113.cpp b/Mednafen/mednafen/nes/boards/113.cpp new file mode 100644 index 0000000000..97a9964841 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/113.cpp @@ -0,0 +1,77 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +/* I'm getting the feeling this is another "jam two different bank + switching hardwares into one mapper". +*/ + +static uint8 latch; + +/* HES 4-in-1 */ +static DECLFW(Mapper113_write) +{ + latch = V; + + setprg32(0x8000, (V >> 3) & 0x7); + setchr8(V & 0x7); +} + + +/* Deathbots */ +static DECLFW(Mapper113_writeh) +{ + latch = ((V & 0x7) << 3); + setprg32(0x8000, V & 0x7); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setprg32(0x8000, 0); + setchr8(0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "M113"); + if(load) + { + setprg32(0x8000, (latch >> 3) & 0x7); + setchr8(latch & 0x7); + } + return(ret); +} +int Mapper113_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x4020,0x7fff,Mapper113_write); + SetWriteHandler(0x8000,0xffff,Mapper113_writeh); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/114.cpp b/Mednafen/mednafen/nes/boards/114.cpp new file mode 100644 index 0000000000..b8ff8134df --- /dev/null +++ b/Mednafen/mednafen/nes/boards/114.cpp @@ -0,0 +1,138 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 master, incmd, IRQCount, cmd, regs[8], Mirroring; + +static void dochr(void) +{ + setchr2(0x0000,(regs[0]>>1)); + setchr2(0x0800,(regs[2]>>1)); + setchr1(0x1000, regs[6]); + setchr1(0x1400, regs[1]); + setchr1(0x1800, regs[7]); + setchr1(0x1c00, regs[3]); +} + +static void doprg() +{ + if(master&0x80) + { + setprg16(0x8000,master&0x1F); + } + else + { + setprg8(0x8000,regs[4]); + setprg8(0xa000,regs[5]); + } +} + +static DECLFW(Mapper114_write) +{ + if(A<=0x7FFF) + { + master=V; + doprg(); + } + else if(A==0xe003) IRQCount=V; + else if(A==0xe002) X6502_IRQEnd(MDFN_IQEXT); + else switch(A&0xE000) + { + case 0x8000:Mirroring = V & 1; setmirror((V & 1) ^ 1);break; + case 0xa000:cmd=V;incmd=1;break; + case 0xc000: + if(!incmd) break; + regs[cmd & 0x7]=V; + switch(cmd & 0x7) + { + case 0x0: case 1: case 2: case 3: case 6: case 7: + dochr();break; + case 0x4: + case 0x5:doprg();break; + } + incmd=0; + break; + } + +} + +static void Mapper114_hb(void) +{ + if(IRQCount) + { + IRQCount--; + if(!IRQCount) + { + X6502_IRQBegin(MDFN_IQEXT); + //printf("IRQ: %d\n",scanline); + } + } + +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(master), SFVAR(incmd), SFVAR(IRQCount), SFVAR(Mirroring), SFVAR(cmd), + SFARRAY(regs, 8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "M114"); + if(load) + { + Mirroring &= 1; + dochr(); + doprg(); + setmirror(Mirroring ^ 1); + } + + return(ret); +} +static void Power(CartInfo *info) +{ + int x; + + IRQCount = 0; + master = incmd = cmd = ~0; + + for(x = 0; x < 8; x++) + regs[x] = ~0; + + dochr(); + doprg(); + setprg16(0xc000, ~0); + + Mirroring = 1; + setmirror(Mirroring ^ 1); +} + +int Mapper114_Init(CartInfo *info) +{ + GameHBIRQHook=Mapper114_hb; + SetWriteHandler(0x6000,0xffff,Mapper114_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/117.cpp b/Mednafen/mednafen/nes/boards/117.cpp new file mode 100644 index 0000000000..dd7140ce8e --- /dev/null +++ b/Mednafen/mednafen/nes/boards/117.cpp @@ -0,0 +1,110 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 IRQLatch, IRQCount, CHRBanks[8], PRGBanks[4], IRQa; + +static void DoPRG(void) +{ + int x; + for(x = 0; x < 4; x++) + setprg8(0x8000 + 8192 * x, PRGBanks[x]); +} + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 8; x++) + setchr1(0x0000 + 1024 * x, CHRBanks[x]); +} + +static DECLFW(Mapper117_write) +{ + A &= 0xF00F; + + if(A >= 0xa000 && A <= 0xa007) + { + CHRBanks[A & 7] = V; + DoCHR(); + } + else + { + //A &= 0xF003; + if(A >= 0x8000 && A <= 0x8003) + { + PRGBanks[A & 3] = V; + DoPRG(); + } + else + switch(A) + { + case 0xc001:IRQLatch=V;break; + case 0xc003:IRQCount=IRQLatch;IRQa|=2;break; + case 0xe000:IRQa&=~1;IRQa|=V&1;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xc002:X6502_IRQEnd(MDFN_IQEXT);break; + //default: printf("Oops: %04x $%02x\n", A, V); break; + } + } +} + +static void Mapper117_hb(void) +{ + if(IRQa==3 && IRQCount) + { + IRQCount--; + if(!IRQCount) + { + IRQa&=1; + X6502_IRQBegin(MDFN_IQEXT); + } + } +} + +static void Power(CartInfo *info) +{ + int x; + + IRQCount = IRQLatch = ~0; + IRQa = 3; + + for(x = 0; x < 8; x++) + CHRBanks[x] = ~0; + + for(x = 0; x < 4; x++) + PRGBanks[x] = ~0; + + DoCHR(); + DoPRG(); + + //IRQa = 0; + //setprg16(0x8000, 0); + //setprg16(0xc000, ~0); +} + +int Mapper117_Init(CartInfo *info) +{ + info->Power = Power; + GameHBIRQHook=Mapper117_hb; + SetWriteHandler(0x8000,0xffff,Mapper117_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/140.cpp b/Mednafen/mednafen/nes/boards/140.cpp new file mode 100644 index 0000000000..6bc3e036ef --- /dev/null +++ b/Mednafen/mednafen/nes/boards/140.cpp @@ -0,0 +1,45 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setchr8(latch & 0xF); + setprg32(0x8000, (latch >> 4)); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); +} + + +static DECLFW(Write) +{ + latch = V; + Sync(); +} + +int Mapper140_Init(CartInfo *info) +{ + SetWriteHandler(0x6000, 0x7FFF, Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->StateAction = StateAction; + info->Power = Power; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/15.cpp b/Mednafen/mednafen/nes/boards/15.cpp new file mode 100644 index 0000000000..670d44ec3d --- /dev/null +++ b/Mednafen/mednafen/nes/boards/15.cpp @@ -0,0 +1,91 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch[2]; + +static void Sync(void) +{ + int x; + + setmirror(((latch[0]>>6)&1)^1); + switch(latch[1]&0x3) + { + case 0x0: + for(x=0;x<4;x++) + setprg8(0x8000+x*8192,(((latch[0]&0x7F)<<1)+x)^(latch[0]>>7)); + break; + case 0x2: + for(x=0;x<4;x++) + setprg8(0x8000+x*8192,((latch[0]&0x7F)<<1)+(latch[0]>>7)); + break; + case 0x1: + case 0x3: + for(x=0;x<4;x++) + { + unsigned int b; + + b=latch[0]&0x7F; + if(x>=2 && !(latch[1]&0x2)) + b=0x7F; + setprg8(0x8000+x*8192,(x&1)+((b<<1)^(latch[0]>>7))); + } + break; + } +} + + +static DECLFW(Mapper15_write) +{ + latch[0]=V; + latch[1]=A&3; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch[0] = latch[1] = 0; + Sync(); + setchr8(0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(latch, 2), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper15_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xFFFF,Mapper15_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/151.cpp b/Mednafen/mednafen/nes/boards/151.cpp new file mode 100644 index 0000000000..e0f959dcb6 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/151.cpp @@ -0,0 +1,81 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 PRGBanks[3], CHRBanks[2]; + +static void Sync(void) +{ + for(int x = 0; x < 3; x++) + setprg8(0x8000 + x * 8192, PRGBanks[x]); + setchr4(0x0000, CHRBanks[0]); + setchr4(0x1000, CHRBanks[1]); +} + +static DECLFW(Mapper151_write) +{ + switch(A&0xF000) + { + case 0x8000:PRGBanks[0] = V; break; + case 0xA000:PRGBanks[1] = V; break; + case 0xC000:PRGBanks[2] = V; break; + case 0xe000:CHRBanks[0] = V; break; + case 0xf000:CHRBanks[1] = V; break; + } + Sync(); +} + +static void Power(CartInfo *info) +{ + int x; + for(x = 0; x < 3; x++) + PRGBanks[x] = ~0; + + for(x = 0; x < 2; x++) + CHRBanks[x] = x; + + Sync(); + setprg8(0xe000, ~0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRGBanks, 3), SFARRAY(CHRBanks, 2), SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper151_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper151_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/152.cpp b/Mednafen/mednafen/nes/boards/152.cpp new file mode 100644 index 0000000000..c653208ba3 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/152.cpp @@ -0,0 +1,48 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg16(0x8000, (latch >> 4) & 0x07); + setchr8(latch & 0x0F); + setmirror((latch >> 7) ? MI_1 : MI_0); +} + +static DECLFW(Mapper152_write) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setprg16(0xc000, 0x07); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper152_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x6000,0xffff,Mapper152_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/156.cpp b/Mednafen/mednafen/nes/boards/156.cpp new file mode 100644 index 0000000000..b93449711f --- /dev/null +++ b/Mednafen/mednafen/nes/boards/156.cpp @@ -0,0 +1,69 @@ +#include "mapinc.h" + +static uint8 CHRBanks[8], PRGBank16; +static uint8 WRAM[8192]; + +static void Sync(void) +{ + setprg16(0x8000, PRGBank16); + for(int x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static DECLFW(M156Write) +{ + if(A>=0xc000 && A<=0xC003) + CHRBanks[A & 3] = V; + else if(A>=0xc008 && A<=0xc00b) + CHRBanks[4 + (A & 3)] = V; + if(A==0xc010) + PRGBank16 = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + for(int x = 0; x < 8; x++) + CHRBanks[x] = x; + PRGBank16 = 0; + Sync(); + setprg16(0xc000, 0xFF); + setprg8r(0x10, 0x6000, 0); + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), + SFVAR(PRGBank16), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper156_Init(CartInfo *info) +{ + setmirror(MI_0); + SetWriteHandler(0xc000,0xc010,M156Write); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetReadHandler(0x6000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + if(info->battery) + { + memset(WRAM, 0xFF, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/16.cpp b/Mednafen/mednafen/nes/boards/16.cpp new file mode 100644 index 0000000000..bb5c47cfc6 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/16.cpp @@ -0,0 +1,802 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static unsigned EEPROM_Type; // Bitfield, set by *_Init(). + +static uint8 IRQa, CHRBanks[8], PRGBank16, Mirroring; +static uint16 IRQCount, IRQLatch; +static uint8 EEPROM_Control; +template +struct X24C0xP +{ + X24C0xP() + { + memset(mem, 0xFF, sizeof(mem)); + Reset(); + } + + ~X24C0xP() + { + + } + + int StateAction(StateMem *sm, int load, int data_only, const char *sname) + { + SFORMAT StateRegs[] = + { + SFARRAY(mem, mem_size), + SFVAR(prev_sda_in), + SFVAR(prev_scl_in), + SFVAR(phase), + SFVAR(buf), + SFVAR(bitpos), + SFVAR(sda_out), + + SFVAR(slave_addr), + SFVAR(rw_bit), + SFVAR(mem_addr), + + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, sname); + + if(load) + { + mem_addr &= (mem_size - 1); + } + + return(ret); + } + + + INLINE bool SDA(void) + { + return(prev_sda_in & sda_out); + } + + void Reset(void) + { + prev_sda_in = false; + prev_scl_in = false; + buf = 0; + bitpos = 0; + phase = PHASE_STOPPED; + sda_out = -1; + + slave_addr = 0; + rw_bit = 0; + mem_addr = 0; + } + + void SetBus(bool scl_in, bool sda_in) + { + if((sda_out == -1 || phase == PHASE_STOPPED || phase == PHASE_NO_READ_ACK) && (scl_in & prev_scl_in) == 1 && (prev_sda_in ^ sda_in)) + { + if(sda_in == 0) + { + //if(phase != PHASE_NO_READ_ACK) // Leaving this in breaks DBZ2 and DBZ3. :/ + { + //puts("START"); + + if(model == 1) + phase = PHASE_MEM_ADDR; + else + phase = PHASE_SLAVE_ADDR; + bitpos = 0; + buf = 0; + sda_out = -1; + } + } + else + { + //puts("STOP"); + phase = PHASE_STOPPED; + sda_out = -1; + } + } + else if(phase != PHASE_STOPPED && phase != PHASE_NO_READ_ACK) + { + if((scl_in ^ prev_scl_in) && scl_in == 1) // SCL 0->1 + { + //printf("SCL 0->1, Bit in: bitpos=%d, bit=%d\n", bitpos, sda_in); + + if(bitpos < 8) + { + if(phase != PHASE_MEM_READ) + buf |= sda_in << (7 - bitpos); + } + else if(bitpos == 8 && phase == PHASE_MEM_READ && sda_in != 0) + { + //printf("PHASE_MEM_READ ACK FAILED --- %d\n", sda_out); + phase = PHASE_NO_READ_ACK; + sda_out = -1; + } + + bitpos++; + } + + if((scl_in ^ prev_scl_in) && scl_in == 0) // SCL 1->0 + { + //printf("SCL 1->0, bitpos=%d\n", bitpos); + if(bitpos == 8) + { + if(phase == PHASE_SLAVE_ADDR) + { + slave_addr = buf & 0xFE; + rw_bit = buf & 0x01; + + //printf("Slave Address: %02x\n", slave_addr); + + if(slave_addr == 0xA0) + sda_out = 0; // ACK + else + { + phase = PHASE_STOPPED; + sda_out = -1; + } + } + else if(phase == PHASE_MEM_ADDR) + { + if(model == 2) + mem_addr = buf; + else + { + mem_addr = buf >> 1; + rw_bit = buf & 1; + } + + //printf("Mem Address: %02x\n", buf); + + sda_out = 0; // ACK + } + else if(phase == PHASE_MEM_WRITE) + { + //printf("WriteIntoBuf: %02x %02x\n", mem_addr, buf); + mem[mem_addr] = buf; + mem_addr = (mem_addr &~ 3) | ((mem_addr + 1) & 0x3); + sda_out = 0; // ACK + //abort(); + //write_buffer[write_buffer_addr & 0x3] = buf; + //write_buffer_addr = (write_buffer_addr + 1) & 0x3; + } + else if(phase == PHASE_MEM_READ) + { + mem_addr = (mem_addr + 1) & (mem_size - 1); + sda_out = -1; // De-assert sda + } + else + { + + } + } + else if(bitpos == 9) + { + bitpos = 0; + buf = 0; + sda_out = -1; + + if(phase == PHASE_SLAVE_ADDR) + { + if(rw_bit) + phase = PHASE_MEM_READ; + else + phase = PHASE_MEM_ADDR; + } + else if(phase == PHASE_MEM_ADDR) + { + if(model == 2) + phase = PHASE_MEM_WRITE; + else + { + if(rw_bit) + phase = PHASE_MEM_READ; + else + phase = PHASE_MEM_WRITE; + } + } + + if(phase == PHASE_MEM_READ) + { + //printf(" ReadIntoBuf addr=0x%02x, val=0x%02x\n", mem_addr, mem[mem_addr]); + buf = mem[mem_addr]; + } + } + + if(bitpos < 8) + { + if(phase == PHASE_MEM_READ) + sda_out = (buf >> (7 - bitpos)) & 1; + } + } + } + + prev_sda_in = sda_in; + prev_scl_in = scl_in; + } + + bool prev_sda_in, prev_scl_in; + unsigned phase; + + enum + { + PHASE_STOPPED = 0, + PHASE_SLAVE_ADDR, + PHASE_MEM_ADDR, + PHASE_MEM_WRITE, + PHASE_MEM_READ, + + PHASE_NO_READ_ACK, + }; + uint8 mem[mem_size]; + uint8 buf; + uint8 bitpos; + int sda_out; + + // + // + // + uint8 slave_addr; + bool rw_bit; + uint8 mem_addr; + + //uint8 write_buffer_addr; + //uint8 write_buffer[4]; +}; + +typedef X24C0xP<1, 128> X24C01P; +typedef X24C0xP<2, 256> X24C02P; + +static X24C01P eep128; +static X24C02P eep256; + +static void UpdateEEPROMSignals(void) +{ + if(EEPROM_Type & 0x02) + eep256.SetBus(EEPROM_Control & 0x20, ((EEPROM_Control & 0x80) ? 1 : (EEPROM_Control & 0x40))); + + if(EEPROM_Type & 0x01) + eep128.SetBus(EEPROM_Control & 0x20, ((EEPROM_Control & 0x80) ? 1 : (EEPROM_Control & 0x40))); +} + +static void BandaiIRQHook(int a) +{ + if(IRQa) + { + uint16 last_irq = IRQCount; + IRQCount-=a; + if(IRQCount > last_irq) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + } + } +} + +static void DoCHR(void) +{ + if(CHRsize[0] <= 8192) + setchr8(0); + else + { + for(int x = 0; x < 8; x++) + setchr1(x << 10, CHRBanks[x]); + } +} + +static void DoPRG(void) +{ + setprg16(0x8000, PRGBank16 & 0xF); +} + +static void DoMirroring(void) +{ + static const int mir_tab[4] = { MI_V, MI_H, MI_0, MI_1 }; + setmirror(mir_tab[Mirroring & 3]); +} + +static DECLFR(EEPROM_Read) +{ + uint8 ret = 0; + + if(EEPROM_Type == 2) + ret |= eep256.SDA() << 4; + else if(EEPROM_Type == 1) + ret |= eep128.SDA() << 4; + + //printf(" EEP SDA READ: %02x\n", ret); + + return(ret); +} + +static DECLFW(Mapper16_write) +{ + A&=0xF; + + if(A<=0x7) + { + CHRBanks[A & 0x7] = V; + DoCHR(); + } + else if(A==0x8) + { + PRGBank16 = V & 0xF; + DoPRG(); + } + else switch(A) + { + case 0x9: Mirroring = V & 3; + DoMirroring(); + break; + case 0xA: X6502_IRQEnd(MDFN_IQEXT); + IRQa=V&1; + IRQCount=IRQLatch; + break; + case 0xB: IRQLatch&=0xFF00; + IRQLatch|=V; + break; + case 0xC: IRQLatch&=0xFF; + IRQLatch|=V<<8; + break; + + case 0xD: //printf("EEPROM Write: %02x\n", V); + // D5(0x20) = SCL? + // D6(0x40) = SDA? + // D7(0x80) = 1, de-assert SDA? + //printf("SCL=%d, SDA=%d, DES=%d\n", (bool)(V & 0x20), (bool)(V & 0x40), (bool)(V & 0x80)); + EEPROM_Control = V & 0xE0; + UpdateEEPROMSignals(); + //printf("\n"); + break; + + default: //printf("Unknown Write: %02x %02x\n", A, V); + break; + } +} + +static void Reset(CartInfo *info) +{ + EEPROM_Control = 0x00; + eep128.Reset(); + eep256.Reset(); +} + +static void Power(CartInfo *info) +{ + Reset(info); + + IRQCount = IRQLatch = IRQa = 0; + PRGBank16 = 0; + for(int x = 0; x < 8; x++) + CHRBanks[x] = x; + DoPRG(); + DoCHR(); + DoMirroring(); + + setprg16(0xc000, 0xF); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), + SFVAR(PRGBank16), + + SFVAR(IRQa), SFVAR(IRQCount), SFVAR(IRQLatch), + + SFVAR(Mirroring), + SFVAR(EEPROM_Control), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(EEPROM_Type & 0x01) + ret &= eep128.StateAction(sm, load, data_only, "X24C01P-BANDAI"); + + if(EEPROM_Type & 0x02) + ret &= eep256.StateAction(sm, load, data_only, "X24C02P-BANDAI"); + + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + UpdateEEPROMSignals(); + } + return(ret); +} + +int Mapper16_Init(CartInfo *info) +{ + info->Reset = Reset; + info->Power = Power; + info->StateAction = StateAction; + MapIRQHook = BandaiIRQHook; + + EEPROM_Type = 0x02; + info->battery = true; // A LIE! + info->SaveGame[0] = eep256.mem; + info->SaveGameLen[0] = sizeof(eep256.mem); + + SetReadHandler(0x6000, 0x7FFF, EEPROM_Read); + SetWriteHandler(0x6000, 0xFFFF, Mapper16_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} + +int Mapper159_Init(CartInfo *info) +{ + info->Reset = Reset; + info->Power = Power; + info->StateAction = StateAction; + MapIRQHook = BandaiIRQHook; + + EEPROM_Type = 0x01; + info->battery = true; // A LIE! + info->SaveGame[0] = eep128.mem; + info->SaveGameLen[0] = sizeof(eep128.mem); + + SetReadHandler(0x6000, 0x7FFF, EEPROM_Read); + SetWriteHandler(0x6000, 0xFFFF, Mapper16_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} + +// +// +// Famicom jump 2: +// 0-7: Lower bit of data selects which 256KB PRG block is in use. +// This seems to be a hack on the developers' part, so I'll make emulation +// of it a hack(I think the current PRG block would depend on whatever the +// lowest bit of the CHR bank switching register that corresponds to the +// last CHR address read). +// +// +static uint8 WRAM[8192]; + +static void DoPRG_153(void) +{ + uint32 base=(CHRBanks[0]&1)<<4; + setprg16(0x8000,(PRGBank16&0xF)|base); + setprg16(0xC000,base|0xF); +} + +static DECLFW(Mapper153_write) +{ + A&=0xF; + if(A<=0x7) + { + CHRBanks[A & 0x7] = V; + DoPRG_153(); + } + else if(A==0x8) + { + PRGBank16 = V; + DoPRG_153(); + } + else switch(A) { + case 0x9: Mirroring = V; + DoMirroring(); + break; + case 0xA:X6502_IRQEnd(MDFN_IQEXT); + IRQa=V&1; + IRQCount=IRQLatch; + break; + case 0xB:IRQLatch&=0xFF00; + IRQLatch|=V; + break; + case 0xC:IRQLatch&=0xFF; + IRQLatch|=V<<8; + break; + } +} + +static int StateAction_153(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), + SFVAR(PRGBank16), + SFVAR(IRQa), SFVAR(IRQCount), SFVAR(IRQLatch), + SFVAR(Mirroring), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG_153(); + //DoCHR(); + DoMirroring(); + } + return(ret); +} + +static void Power_153(CartInfo *info) +{ + IRQCount = IRQLatch = IRQa = 0; + PRGBank16 = 0; + for(int x = 0; x < 8; x++) + CHRBanks[x] = x; + DoPRG_153(); + DoCHR(); + DoMirroring(); + + setprg16r(0x10, 0x6000, 0); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +int Mapper153_Init(CartInfo *info) +{ + MapIRQHook=BandaiIRQHook; + SetWriteHandler(0x8000,0xFFFF,Mapper153_write); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetReadHandler(0x6000, 0xFFFF, CartBR); + + info->Power = Power_153; + info->StateAction = StateAction_153; + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + /* This mapper/board seems to have WRAM at $6000-$7FFF. */ + + return(1); +} + +// +// +// +// +// +// +// + +static uint8 BarcodeData[256]; +static uint8 BarcodeReadPos; +static uint32 BarcodeCycleCount; +static uint8 BarcodeOut; + +int MDFNI_DatachSet(const uint8 *rcode) +{ + static const uint8 prefix_parity_type[10][6] = { + {0,0,0,0,0,0}, {0,0,1,0,1,1}, {0,0,1,1,0,1}, {0,0,1,1,1,0}, + {0,1,0,0,1,1}, {0,1,1,0,0,1}, {0,1,1,1,0,0}, {0,1,0,1,0,1}, + {0,1,0,1,1,0}, {0,1,1,0,1,0} + }; + static const uint8 data_left_odd[10][7] = { + {0,0,0,1,1,0,1}, {0,0,1,1,0,0,1}, {0,0,1,0,0,1,1}, {0,1,1,1,1,0,1}, + {0,1,0,0,0,1,1}, {0,1,1,0,0,0,1}, {0,1,0,1,1,1,1}, {0,1,1,1,0,1,1}, + {0,1,1,0,1,1,1}, {0,0,0,1,0,1,1} + }; + static const uint8 data_left_even[10][7] = { + {0,1,0,0,1,1,1}, {0,1,1,0,0,1,1}, {0,0,1,1,0,1,1}, {0,1,0,0,0,0,1}, + {0,0,1,1,1,0,1}, {0,1,1,1,0,0,1}, {0,0,0,0,1,0,1}, {0,0,1,0,0,0,1}, + {0,0,0,1,0,0,1}, {0,0,1,0,1,1,1} + }; + static const uint8 data_right[10][7] = { + {1,1,1,0,0,1,0}, {1,1,0,0,1,1,0}, {1,1,0,1,1,0,0}, {1,0,0,0,0,1,0}, + {1,0,1,1,1,0,0}, {1,0,0,1,1,1,0}, {1,0,1,0,0,0,0}, {1,0,0,0,1,0,0}, + {1,0,0,1,0,0,0}, {1,1,1,0,1,0,0} + }; + uint8 code[13+1]; + uint32 tmp_p=0; + int i, j; + int len; + + for(i=len=0;i<13;i++) + { + if(!rcode[i]) break; + + if((code[i]=rcode[i]-'0') > 9) + return(0); + len++; + } + if(len!=13 && len!=12 && len!=8 && len!=7) return(0); + + #define BS(x) BarcodeData[tmp_p]=x;tmp_p++ + + for(j=0;j<32;j++) + { + BS(0x00); + } + + /* Left guard bars */ + BS(1); BS(0); BS(1); + + if(len==13 || len==12) + { + uint32 csum; + + for(i=0;i<6;i++) + if(prefix_parity_type[code[0]][i]) + { + for(j=0;j<7;j++) + { + BS(data_left_even[code[i+1]][j]); + } + } + else + for(j=0;j<7;j++) + { + BS(data_left_odd[code[i+1]][j]); + } + + /* Center guard bars */ + BS(0); BS(1); BS(0); BS(1); BS(0); + + for(i=7;i<12;i++) + for(j=0;j<7;j++) + { + BS(data_right[code[i]][j]); + } + csum=0; + for(i=0;i<12;i++) csum+=code[i]*((i&1)?3:1); + csum=(10-(csum%10))%10; + //printf("%d\n",csum); + for(j=0;j<7;j++) + { + BS(data_right[csum][j]); + } + + } + else if(len==8 || len==7) + { + uint32 csum=0; + + for(i=0;i<7;i++) csum+=(i&1)?code[i]:(code[i]*3); + + csum=(10-(csum%10))%10; + + for(i=0;i<4;i++) + for(j=0;j<7;j++) + { + BS(data_left_odd[code[i]][j]); + } + + + /* Center guard bars */ + BS(0); BS(1); BS(0); BS(1); BS(0); + + for(i=4;i<7;i++) + for(j=0;j<7;j++) + { + BS(data_right[code[i]][j]); + } + + for(j=0;j<7;j++) + { BS(data_right[csum][j]);} + + } + + /* Right guard bars */ + BS(1); BS(0); BS(1); + + for(j=0;j<32;j++) + { + BS(0x00); + } + + BS(0xFF); + #undef BS + BarcodeReadPos=0; + BarcodeOut=0x8; + BarcodeCycleCount=0; + return(1); +} + +static void BarcodeIRQHook(int a) +{ + BandaiIRQHook(a); + + BarcodeCycleCount+=a; + + if(BarcodeCycleCount >= 1000) + { + BarcodeCycleCount -= 1000; + if(BarcodeData[BarcodeReadPos]==0xFF) + { + BarcodeOut=0; + } + else + { + BarcodeOut=(BarcodeData[BarcodeReadPos]^1)<<3; + BarcodeReadPos++; + } + } +} + +static DECLFR(Mapper157_read) +{ + uint8 ret = 0; + + ret |= BarcodeOut; + ret |= eep256.SDA() << 4; + + return(ret); +} + +static void Mapper157_Power(CartInfo *info) +{ + BarcodeData[0]=0xFF; + BarcodeReadPos=0; + BarcodeOut=0; + BarcodeCycleCount=0; + + Power(info); +} + +static int StateAction_157(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(BarcodeData, 256), + SFVAR(BarcodeReadPos), SFVAR(BarcodeCycleCount), SFVAR(BarcodeOut), + SFARRAY(CHRBanks, 8), + SFVAR(PRGBank16), + SFVAR(IRQa), SFVAR(IRQCount), SFVAR(IRQLatch), + SFVAR(Mirroring), + SFVAR(EEPROM_Control), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + ret &= eep256.StateAction(sm, load, data_only, "X24C02P-BANDAI"); + + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + UpdateEEPROMSignals(); + } + return(ret); +} + +int Mapper157_Init(CartInfo *info) +{ + info->Power = Mapper157_Power; + info->StateAction = StateAction_157; + MDFNGameInfo->cspecial = "datach"; + MapIRQHook=BarcodeIRQHook; + + EEPROM_Type = 0x02; + info->battery = true; // A LIE! + info->SaveGame[0] = eep256.mem; + info->SaveGameLen[0] = sizeof(eep256.mem); + + SetWriteHandler(0x6000, 0xFFFF, Mapper16_write); + SetReadHandler(0x6000, 0x7FFF, Mapper157_read); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/163.cpp b/Mednafen/mednafen/nes/boards/163.cpp new file mode 100644 index 0000000000..cdf83287d9 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/163.cpp @@ -0,0 +1,199 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Mapper 163(Nanjing) emulation Based on code from VirtuaNES */ + +#include "mapinc.h" + +static uint8 *WRAM = NULL; +static uint8 security, trigger, strobe; +static uint8 regs[2]; +static uint8 chrbank[2]; + +static void Sync(void) +{ + setprg32(0x8000, (regs[0] & 0xF) | ((regs[1] & 0xF) << 4)); + setchr4(0x0000, chrbank[0]); + setchr4(0x1000, chrbank[1]); +} + +static DECLFW(Write) +{ + //printf("Write: %04x %02x\n", A, V); + switch(A & 0xF300) + { + case 0x5000: regs[0] = V; + if(!(regs[0] & 0x80) && scanline < 128) + { + chrbank[0] = 0; + chrbank[1] = 1; + } + Sync(); + break; + + case 0x5100: if(A & 1) + { + if(strobe && !V) + trigger ^= 1; + strobe = V; + } + else + { + // Needed by NJ023... + if(V == 6) + { + regs[0] &= ~0x0F; + regs[0] |= 0x03; + regs[1] &= ~0x0F; // Is this correct? + Sync(); + } + + //printf("Oops: %04x %02x\n", A, V); + } + break; + + case 0x5200: regs[1] = V; + Sync(); + break; + + case 0x5300: security = V; + break; + + } +} + +static DECLFR(ReadLow) +{ + //printf("Readlow: %04x\n", A); + switch(A & 0xF700) + { + case 0x5100: return(security); + case 0x5500: return(trigger ? security : 0); + default: return(4); + } + return(0x00); +} + +static void Mapper163_HB(void) +{ + if(regs[0] & 0x80) + { + switch(scanline) + { + case 127: chrbank[0] = 1; + chrbank[1] = 1; + break; + + case 239: chrbank[0] = 0; + chrbank[1] = 0; + break; + } + } + Sync(); +} + +static DECLFW(BWRAM) +{ + //printf("WriteRA: %04x %02x\n", A, V); + WRAM[A-0x6000]=V; +} + +static DECLFR(AWRAM) +{ + //printf("ReadRA: %04x\n", A); + return(WRAM[A-0x6000]); +} + +static void Power(CartInfo *info) +{ + + regs[0] = 0x8F; + regs[1] = 0x00; + strobe = 1; + security = 0x00; + trigger = 0; + + chrbank[0] = 0; + chrbank[1] = 1; + Sync(); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); // 0xFF or 0x00? +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 8192), + SFARRAY(regs, 2), + SFARRAY(chrbank, 2), + SFVAR(strobe), + SFVAR(security), + SFVAR(trigger), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + Sync(); + } + return(ret); +} + +static void Close(void) +{ + if(WRAM) + { + free(WRAM); + WRAM = NULL; + } +} + +int Mapper163_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + info->Close = Close; + + GameHBIRQHook2 = Mapper163_HB; + + + if(!(WRAM = (uint8 *)malloc(8192))) + { + return(0); + } + + memset(WRAM, 0x00, 8192); // 0x00 needed over 0xFF for NJ079. Probably programmed that way in the factory? + MDFNMP_AddRAM(8192, 0x6000, WRAM); + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + + SetReadHandler(0x5000, 0x5FFF, ReadLow); + SetWriteHandler(0x5000, 0x5FFF, Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + SetReadHandler(0x6000, 0x7FFF, AWRAM); + SetWriteHandler(0x6000, 0x7FFF, BWRAM); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/18.cpp b/Mednafen/mednafen/nes/boards/18.cpp new file mode 100644 index 0000000000..312b7075f1 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/18.cpp @@ -0,0 +1,164 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint16 IRQCount, IRQLatch, Mirroring; +static uint8 IRQa, PRGBanks[4], CHRBanks[8]; +static uint8 WRAM[8192]; + +static void JalecoIRQHook(int a) +{ + if(IRQa && IRQCount) + { + uint16 prev = IRQCount; + IRQCount-=a; + + if(IRQCount == 0 || IRQCount > prev) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQCount=0; + IRQa=0; + } + } +} + +static void DoCHR(void) +{ + for(int x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static void DoPRG(void) +{ + for(int x = 0; x < 4; x++) + setprg8(0x8000 + x * 8192, PRGBanks[x]); +} + +static void DoMirroring(void) +{ + if(Mirroring & 2) + setmirror(MI_0); + else + setmirror(Mirroring & 1); +} + +static DECLFW(Mapper18_write) +{ + A&=0xF003; + if(A>=0x8000 && A<=0x9001) + { + int x=((A>>1)&1)|((A-0x8000)>>11); + + PRGBanks[x]&=(0xF0)>>((A&1)<<2); + PRGBanks[x]|=(V&0xF)<<((A&1)<<2); + DoPRG(); + } + else if(A>=0xa000 && A<=0xd003) + { + int x=((A>>1)&1)|((A-0xA000)>>11); + + CHRBanks[x]&=(0xF0)>>((A&1)<<2); + CHRBanks[x]|=(V&0xF)<<((A&1)<<2); + DoCHR(); + } + else switch(A) + { + case 0xe000:IRQLatch&=0xFFF0;IRQLatch|=(V&0x0f);break; + case 0xe001:IRQLatch&=0xFF0F;IRQLatch|=(V&0x0f)<<4;break; + case 0xe002:IRQLatch&=0xF0FF;IRQLatch|=(V&0x0f)<<8;break; + case 0xe003:IRQLatch&=0x0FFF;IRQLatch|=(V&0x0f)<<12;break; + case 0xf000:IRQCount=IRQLatch;break; + case 0xf001:IRQa=V&1; + X6502_IRQEnd(MDFN_IQEXT); + break; + case 0xf002:Mirroring = V & 3; + DoMirroring(); + break; + } +} + +static void Power(CartInfo *info) +{ + int x; + + Mirroring = IRQCount = IRQLatch = IRQa = 0; + for(x = 0; x < 8; x++) + CHRBanks[x] = x; + + PRGBanks[0] = 0; + PRGBanks[1] = 1; + PRGBanks[2] = ~1; + PRGBanks[3] = ~0; + + DoPRG(); + DoCHR(); + DoMirroring(); + + + setprg8r(0x10, 0x6000, 0); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 8192), + SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(Mirroring), + SFVAR(IRQa), SFARRAY(PRGBanks, 4), SFARRAY(CHRBanks, 8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +int Mapper18_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetReadHandler(0x6000, 0x7FFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + + + info->StateAction = StateAction; + info->Power = Power; + SetWriteHandler(0x8000,0xffff,Mapper18_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + MapIRQHook=JalecoIRQHook; + + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/180.cpp b/Mednafen/mednafen/nes/boards/180.cpp new file mode 100644 index 0000000000..8fee39ca0b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/180.cpp @@ -0,0 +1,44 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg16(0xc000, latch & 0xF); +} + +static DECLFW(Mapper180_write) +{ + latch = V & 0xF; + Sync(); +} + +static void Power(CartInfo *info) +{ + setchr8(0); + setprg16(0x8000, 0); + latch = 0xF; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { SFVAR(latch), SFEND }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper180_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper180_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/182.cpp b/Mednafen/mednafen/nes/boards/182.cpp new file mode 100644 index 0000000000..99540ecfcd --- /dev/null +++ b/Mednafen/mednafen/nes/boards/182.cpp @@ -0,0 +1,79 @@ +#include "mapinc.h" + +static uint8 IRQCount, IRQa, Mirroring, cmd, regs[8]; + +static void Sync(void) +{ + setmirror((Mirroring & 1) ^ 1); + setchr2(0x0000, regs[0] >> 1); + setchr1(0x1400, regs[1]); + setchr2(0x0800, regs[2] >> 1); + setchr1(0x1c00, regs[3]); + setprg8(0x8000, regs[4]); + setprg8(0xa000, regs[5]); + setchr1(0x1000, regs[6]); + setchr1(0x1800, regs[7]); +} + +static DECLFW(Mapper182_write) +{ + switch(A&0xf003) + { + case 0xe003:IRQCount=V;IRQa=1;X6502_IRQEnd(MDFN_IQEXT);break; + case 0x8001:Mirroring = V&1; Sync();break; + case 0xA000:cmd = V; break; + case 0xC000: regs[cmd & 7] = V; Sync(); break; + } +} + +static void blop(void) +{ + if(IRQa) + { + if(IRQCount) + { + IRQCount--; + if(!IRQCount) + { + IRQa=0; + X6502_IRQBegin(MDFN_IQEXT); + } + } + } +} + +static void Power(CartInfo *info) +{ + IRQCount = IRQa = Mirroring = cmd = 0; + for(int x = 0; x < 8; x++) + regs[x] = 0xFF; + + Sync(); + setprg16(0xc000, ~0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(IRQCount), SFVAR(IRQa), SFVAR(Mirroring), SFVAR(cmd), + SFARRAY(regs, 8), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper182_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xFFFF,Mapper182_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + GameHBIRQHook=blop; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/184.cpp b/Mednafen/mednafen/nes/boards/184.cpp new file mode 100644 index 0000000000..8ad376c569 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/184.cpp @@ -0,0 +1,47 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setchr4(0x0000, latch & 0xf); + setchr4(0x1000, latch >> 4); +} + +static DECLFW(Mapper184_write) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); + setprg32(0x8000, 0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper184_Init(CartInfo *info) +{ + SetWriteHandler(0x6000,0xffff,Mapper184_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/185.cpp b/Mednafen/mednafen/nes/boards/185.cpp new file mode 100644 index 0000000000..49ee28874b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/185.cpp @@ -0,0 +1,81 @@ +#include "mapinc.h" + +static uint16 firstwrite; +static uint8 latch; +static uint8 CHRBogus[8192]; + +static void Sync(void) +{ + //printf("%02x\n",mapbyte1[0]); + //if((mapbyte1[0]&3)==3) + if(CHRmask8[0] == 0) + { + if(firstwrite & 0x200) + { + if((latch&3) == 1) + setchr8(0); + else + setchr8r(0x10,0); + } + else + { + if(latch != firstwrite) + setchr8(0); + else + setchr8r(0x10,0); + } + } + else if(CHRmask8[0] == 1) + { + if((latch&2)) setchr8(latch&1); + else setchr8r(0x10,0); + } +} + +static DECLFW(Mapper185_write) +{ + if(firstwrite & 0x100) + firstwrite = V; + + latch = V; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFVAR(firstwrite), + SFEND + }; + + if(load) + firstwrite = 0x200; // For some degree of backwards compat with < 0.9.38.4 save states. + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + firstwrite = 0x100; + setprg32(0x8000, 0); + latch = 0x0; + Sync(); +} + +int Mapper185_Init(CartInfo *info) +{ + memset(CHRBogus, 0xFF, 8192); + info->Power = Power; + info->StateAction = StateAction; + + SetupCartCHRMapping(0x10,CHRBogus,8192,0); + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x8000,0xFFFF,Mapper185_write); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/187.cpp b/Mednafen/mednafen/nes/boards/187.cpp new file mode 100644 index 0000000000..e310c42982 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/187.cpp @@ -0,0 +1,186 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: Remove this mapper or add a StateAction for it! + +#include "mapinc.h" + +static uint8 LastWr; +static uint8 ExtMode; +static uint8 cmd; +static uint8 DRegs[8]; +static uint32 count; +static uint32 last; +static int safe; +static uint8 poofish; + +static int32 IRQCount; +static uint8 IRQa; +static uint8 IRQLatch; + +static void Sync(void) +{ + int x; + uint32 base=0; + + if(cmd&0x80) base=0x1000; + setchr2(0x0000^base,(0x100|DRegs[0])>>1); + setchr2(0x0800^base,(0x100|DRegs[1])>>1); + for(x=0;x<4;x++) + setchr1((0x1000^base)+x*0x400,DRegs[2+x]); + + if(ExtMode&0x80) + { + if(ExtMode&0x20) + setprg32(0x8000,(ExtMode&0x1F)>>1); + else + { + setprg16(0x8000,(ExtMode&0x1F)); + setprg16(0xc000,(ExtMode&0x1F)); + } + } + else + { + setprg8(0x8000,DRegs[6]); + setprg8(0xc000,~1); + setprg8(0xa000,DRegs[7]); + setprg8(0xe000,~0); + } +} + +static DECLFW(M187Write) +{ + LastWr=V; + if(A==0x5000) + ExtMode=V; + Sync(); +} + +static DECLFW(M187HWrite) +{ + //if(A==0x8003 && X.PC<0x800) MDFNI_DumpMem("dmp",0x0000,0xFFFF); + //printf("$%04x:$%02x, %04x\n",A,V,X.PC); + LastWr=V; + + if(A==0x8003) + { + if(V==0x28 || V==0x2A) + poofish=V; + } + else if(A==0x8000) poofish=0; + + switch(A) + { + case 0xc000:IRQLatch=IRQCount=V;break; + case 0xc001:IRQCount=IRQLatch;last=count=0;break; + case 0xe000:IRQa=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xe001:IRQa=1;break; + case 0xa000:setmirror((V&1) ^ 1);break; + + case 0x8000:cmd=V;safe=1;break; + case 0x8001: + if(safe) + { + //printf("Cmd: %d, %02x, %04x\n",cmd&0x7,V,X.PC); + DRegs[cmd&7]=V; + Sync(); + safe=0; + } + if(poofish==0x28) setprg8(0xc000,0x17); + break; + + } +} + +static DECLFR(ProtRead) +{ + switch(LastWr&0x3) + { + case 0x1: + case 0x0: return(0x80); + case 0x2: return(0x42); + } + return(0); +} + +static void M187Power(CartInfo *info) +{ + LastWr = 0; + ExtMode = 0; + cmd = 0; + + memset(DRegs, 0, sizeof(DRegs)); + + count = 0; + last = 0; + safe = 0; + poofish = 0; + + IRQCount = 0; + IRQa = 0; + IRQLatch = 0; + + Sync(); +} + +static void sl(void) +{ + if(IRQa) + { + if(IRQCount>=0) + { + IRQCount--; + if(IRQCount<0) + { + X6502_IRQBegin(MDFN_IQEXT); + } + } + } +} + +static void foo(uint32 A) +{ + if((A&0x2000) && !(last&0x2000)) + { + count++; + if(count==42) + { + sl(); + count=0; + } + } + last=A; +} + +int Mapper187_Init(CartInfo *info) +{ + info->Power=M187Power; + //GameHBIRQHook=sl; + PPU_hook=foo; + + SetWriteHandler(0x5000,0x5fff,M187Write); + SetWriteHandler(0x8000,0xFFFF,M187HWrite); + SetReadHandler(0x5000,0x5FFF,ProtRead); + SetWriteHandler(0x6000,0x7FFF,M187Write); + SetReadHandler(0x8000,0xffff,CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/189.cpp b/Mednafen/mednafen/nes/boards/189.cpp new file mode 100644 index 0000000000..33111470f0 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/189.cpp @@ -0,0 +1,103 @@ +/* Is this an MMC3 workalike piece of hardware, with the addition of + a register at $4120 or does it have only partial MMC3 functionality? + A good test would be to see if commands 6 and 7 can change PRG banks + and of course test the regs >=$c000, on the real cart. +*/ +#include "mapinc.h" + +static uint8 IRQCount, IRQLatch, IRQa, cmd, regs[8]; +static uint8 PRGBank32, Mirroring; + +static void Sync(void) +{ + setprg32(0x8000, PRGBank32); + setchr2(0x0000, regs[0] >> 1); + setchr2(0x0800, regs[1] >> 1); + setchr1(0x1000, regs[2]); + setchr1(0x1400, regs[3]); + setchr1(0x1800, regs[4]); + setchr1(0x1c00, regs[5]); + setmirror((Mirroring & 1) ? MI_H : MI_V); +} + +static DECLFW(Mapper189_write) +{ + //if(A>=0xc000) printf("$%04x:$%02x\n",A,V); + if((A&0xF100)==0x4100) + { + PRGBank32 = V >> 4; + Sync(); + } + else if((A&0xF100)==0x6100) + { + PRGBank32 = V & 0x3; + Sync(); + } + else switch(A&0xE001) + { + case 0xa000:Mirroring = V & 1; Sync();break; + case 0x8000:cmd=V;break; + case 0x8001:regs[cmd & 0x7] = V; Sync(); break; + case 0xc000:IRQLatch=V;break; + case 0xc001:IRQCount=IRQLatch;break; + case 0xe000:IRQa=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xe001:IRQa=1;break; + break; + + } +} +void m189irq(void) +{ + if(IRQa) + { + if(IRQCount) + { + IRQCount--; + if(!IRQCount) X6502_IRQBegin(MDFN_IQEXT); + } + } + +} + +static void Power(CartInfo *info) +{ + IRQCount = IRQLatch = IRQa = 0; + cmd = 0; + regs[0] = 0; + regs[1] = 2; + regs[2] = 4; + regs[3] = 5; + regs[4] = 6; + regs[5] = 7; + PRGBank32 = 0; + Mirroring = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(regs, 8), + SFVAR(PRGBank32), + SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(IRQa), + SFVAR(Mirroring), SFVAR(cmd), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper189_Init(CartInfo *info) +{ + GameHBIRQHook=m189irq; + SetWriteHandler(0x4120,0xFFFF,Mapper189_write); + SetReadHandler(0x8000,0xFFFF,CartBR); + info->Power = Power; + info->StateAction = StateAction; + return(1); +} + + diff --git a/Mednafen/mednafen/nes/boards/193.cpp b/Mednafen/mednafen/nes/boards/193.cpp new file mode 100644 index 0000000000..ca1321732c --- /dev/null +++ b/Mednafen/mednafen/nes/boards/193.cpp @@ -0,0 +1,58 @@ +#include "mapinc.h" + +static uint8 CHRBanks[3], PRGBank8; +static void Sync(void) +{ + setchr4(0x0000, CHRBanks[0]); + setchr2(0x1000, CHRBanks[1]); + setchr2(0x1800, CHRBanks[2]); + setprg8(0x8000, PRGBank8); +} + +static DECLFW(m193w) +{ + switch(A&3) + { + case 0:CHRBanks[0] = V >> 2;break; + case 1:CHRBanks[1] = (V >> 1) & 0x3F; break; + case 2:CHRBanks[2] = (V >> 1) & 0x3F; break; + case 3:PRGBank8 = V;break; + } + Sync(); +} + +static void Power(CartInfo *info) +{ + CHRBanks[0] = 0; + CHRBanks[1] = 2; + CHRBanks[2] = 3; + PRGBank8 = 0xFC; + Sync(); + setprg8(0xa000, 0xFD); + setprg8(0xc000, 0xFE); + setprg8(0xe000, 0xFF); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 3), + SFVAR(PRGBank8), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + + +int Mapper193_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x4018,0x7fff,m193w); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/208.cpp b/Mednafen/mednafen/nes/boards/208.cpp new file mode 100644 index 0000000000..37f4e876d9 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/208.cpp @@ -0,0 +1,157 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: Remove this mapper or add a StateAction() + +#include "mapinc.h" + +static uint8 PRGSel; +static uint8 PBuf[4],PSel; +static uint8 cmd; +static uint8 DRegs[8]; +static uint32 count; +static uint32 last; +static int32 IRQCount; +static uint8 IRQLatch; +static uint8 IRQa; + +static DECLFW(M208Write1) +{ + PRGSel=(V&0x1)|((V>>3)&0x2); + setprg32(0x8000,PRGSel); +} + +static DECLFW(M208Write2) +{ + static const uint8 lut[256]={ + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x59, 0x49, 0x19, 0x09, 0x59, 0x49, 0x19, 0x09, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x51, 0x41, 0x11, 0x01, 0x51, 0x41, 0x11, 0x01, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x59, 0x49, 0x19, 0x09, 0x59, 0x49, 0x19, 0x09, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x51, 0x41, 0x11, 0x01, 0x51, 0x41, 0x11, 0x01, + 0x00, 0x10, 0x40, 0x50, 0x00, 0x10, 0x40, 0x50,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x18, 0x48, 0x58, 0x08, 0x18, 0x48, 0x58,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x40, 0x50, 0x00, 0x10, 0x40, 0x50,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x18, 0x48, 0x58, 0x08, 0x18, 0x48, 0x58,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x58, 0x48, 0x18, 0x08, 0x58, 0x48, 0x18, 0x08, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x50, 0x40, 0x10, 0x00, 0x50, 0x40, 0x10, 0x00, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x58, 0x48, 0x18, 0x08, 0x58, 0x48, 0x18, 0x08, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59,0x50, 0x40, 0x10, 0x00, 0x50, 0x40, 0x10, 0x00, + 0x01, 0x11, 0x41, 0x51, 0x01, 0x11, 0x41, 0x51,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x19, 0x49, 0x59, 0x09, 0x19, 0x49, 0x59,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x11, 0x41, 0x51, 0x01, 0x11, 0x41, 0x51,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x19, 0x49, 0x59, 0x09, 0x19, 0x49, 0x59,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + + }; + if(A<=0x57FF) PSel=V; + else + PBuf[(A&0x03)]=V^lut[PSel]; +} + +static DECLFR(M208Read) +{ + return(PBuf[(A&0x3)]); +} + +static void Sync(void) +{ + int x; + + setchr2(0x0000,DRegs[0]>>1); + setchr2(0x0800,DRegs[1]>>1); + for(x=0;x<4;x++) + setchr1(0x1000+x*0x400,DRegs[2+x]); +} + +static DECLFW(M208HWrite) +{ + switch(A&0xe001) + { + case 0xc000:IRQLatch=IRQCount=V;break; + case 0xc001:IRQCount=IRQLatch;last=count=0;break; + case 0xe000:IRQa=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xe001:IRQa=1;break; + case 0x8000:cmd=V;break; + case 0x8001:DRegs[cmd&7]=V; + Sync(); + break; + + } +} + +static void M208Power(CartInfo *info) +{ + memset(PBuf, 0, sizeof(PBuf)); + PSel = 0; + cmd = 0; + memset(DRegs, 0, sizeof(DRegs)); + count = 0; + last = 0; + IRQCount = 0; + IRQLatch = 0; + IRQa = 0; + PRGSel = 3; + + setprg32(0x8000,3); +} + +static void sl(void) +{ + if(IRQa) + { + if(IRQCount>=0) + { + IRQCount--; + if(IRQCount<0) + { + X6502_IRQBegin(MDFN_IQEXT); + } + } + } +} + +static void foo(uint32 A) +{ + if((A&0x2000) && !(last&0x2000)) + { + count++; + if(count==42) + { + sl(); + count=0; + } + } + last=A; +} + +int Mapper208_Init(CartInfo *info) +{ + info->Power=M208Power; + //GameHBIRQHook=sl; + PPU_hook=foo; + + SetWriteHandler(0x4800,0x4FFF,M208Write1); + SetWriteHandler(0x5000,0x5fff,M208Write2); + SetWriteHandler(0x8000,0xFFFF,M208HWrite); + SetReadHandler(0x5800,0x5FFF,M208Read); + SetReadHandler(0x8000,0xffff,CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/21.cpp b/Mednafen/mednafen/nes/boards/21.cpp new file mode 100644 index 0000000000..93add7efc2 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/21.cpp @@ -0,0 +1,178 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 CHRBanks[8], PRGBanks[2], K4IRQ, K4sel, IRQCount, IRQLatch, Mirroring, IRQa, WRAM[8192]; +static int32 acount; + +static void DoPRG(void) +{ + setprg8(0xa000, PRGBanks[1]); + + if(K4sel & 2) + { + setprg8(0xc000, PRGBanks[0]); + setprg8(0x8000, ~1); + } + else + { + setprg8(0x8000, PRGBanks[0]); + setprg8(0xC000, ~1); + } +} + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static void DoMirroring(void) +{ + switch(Mirroring & 3) + { + case 0: setmirror(MI_V); break; + case 1: setmirror(MI_H); break; + case 2: setmirror(MI_0); break; + case 3: setmirror(MI_1); break; + } +} + +static DECLFW(Mapper21_write) +{ + A|=((A>>5)&0xF); + + if((A&0xF000)==0xA000) + { + PRGBanks[1] = V; + DoPRG(); + } + else if((A&0xF000)==0x8000) + { + PRGBanks[0] = V; + DoPRG(); + } + else if(A>=0xb000 && A<=0xefff) + { + A&=0xF006; + { + int x=((A>>2)&1)|((A-0xB000)>>11); + + CHRBanks[x]&=(0xF0)>>((A&2)<<1); + CHRBanks[x]|=(V&0xF)<<((A&2)<<1); + DoCHR(); + } + } + else switch(A&0xF006) + { + case 0x9000: Mirroring = V; DoMirroring();break; + case 0x9006: + case 0x9004: + case 0x9002:K4sel=V; + DoPRG(); + break; + case 0xf000:IRQLatch&=0xF0;IRQLatch|=V&0xF;break; + case 0xf002:IRQLatch&=0x0F;IRQLatch|=V<<4;break; + case 0xf004:IRQCount=IRQLatch;acount=0; + IRQa=V&2;K4IRQ=V&1; + X6502_IRQEnd(MDFN_IQEXT); + break; + case 0xf006:IRQa=K4IRQ;X6502_IRQEnd(MDFN_IQEXT);break; + } +} +static void KonamiIRQHook(int a) +{ + #define LCYCS ((227*2)+1) + //#define LCYCS 341 + if(IRQa) + { +// acount+=a*3; + acount+=a*4; + if(acount>=LCYCS) + { + doagainbub:acount-=LCYCS;IRQCount++; + if(!IRQCount) {X6502_IRQBegin(MDFN_IQEXT);IRQCount=IRQLatch;} + if(acount>=LCYCS) goto doagainbub; + } + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), SFARRAY(PRGBanks, 2), SFARRAY(WRAM, 8192), + SFVAR(K4IRQ), SFVAR(K4sel), SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(Mirroring), SFVAR(IRQa), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +static void Power(CartInfo *info) +{ + int x; + + acount = 0; + + for(x = 0; x < 8; x++) + CHRBanks[x] = x; + DoCHR(); + K4sel = 0; + PRGBanks[0] = 0; + PRGBanks[1] = 1; + DoPRG(); + Mirroring = 0; + DoMirroring(); + + IRQCount = IRQLatch = 0; + setprg8(0xe000, ~0); + setprg8r(0x10, 0x6000, 0); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +int Mapper21_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetWriteHandler(0x8000,0xffff,Mapper21_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + MapIRQHook=KonamiIRQHook; + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/22.cpp b/Mednafen/mednafen/nes/boards/22.cpp new file mode 100644 index 0000000000..aa4e29d11a --- /dev/null +++ b/Mednafen/mednafen/nes/boards/22.cpp @@ -0,0 +1,95 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 PRGBanks[2], CHRBanks[8], Mirroring; + +static void DoPRG(void) +{ + setprg8(0x8000, PRGBanks[0]); + setprg8(0xa000, PRGBanks[1]); +} + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x] >> 1); +} + +static void DoMirroring(void) +{ + switch(Mirroring & 3) + { + case 0: setmirror(MI_V); break; + case 1: setmirror(MI_H); break; + case 2: setmirror(MI_0); break; + case 3: setmirror(MI_1); break; + } +} + +static DECLFW(Mapper22_write) +{ + if(A<=0xAFFF) + { + switch(A&0xF000) + { + case 0x8000:PRGBanks[0] = V; DoPRG(); break; + case 0xa000:PRGBanks[1] = V; DoPRG(); break; + case 0x9000:Mirroring = V & 3; DoMirroring(); break; + } + } + else + { + A&=0xF003; + if(A>=0xb000 && A<=0xe003) + { + int x=(A&1)|((A-0xB000)>>11); + + CHRBanks[x]&=(0xF0)>>((A&2)<<1); + CHRBanks[x]|=(V&0xF)<<((A&2)<<1); + DoCHR(); + } + } +} + +static void Power(CartInfo *info) +{ + int x; + + Mirroring = 3; + + for(x = 0; x < 8; x++) + CHRBanks[x] = ~0; + DoCHR(); + PRGBanks[0] = PRGBanks[1] = ~0; + DoPRG(); + + setprg16(0xc000, 0x7F); +} + +int Mapper22_Init(CartInfo *info) +{ + info->Power = Power; + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x8000,0xffff,Mapper22_write); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/222.cpp b/Mednafen/mednafen/nes/boards/222.cpp new file mode 100644 index 0000000000..d19d56d963 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/222.cpp @@ -0,0 +1,96 @@ +#include "mapinc.h" + +static uint8 PRGBanks[2], CHRBanks[8], IRQCount, IRQLatch, IRQa; +static int32 acount; + +static void Sync(void) +{ + int x; + + setprg8(0x8000, PRGBanks[0]); + setprg8(0xa000, PRGBanks[1]); + for(x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + + +static DECLFW(Write) +{ + A &= 0xF003; + if((A & 0xF000) == 0x8000) + PRGBanks[0] = V; + else if((A & 0xF000) == 0xA000) + PRGBanks[1] = V; + else switch(A) + { + case 0xb000: CHRBanks[0] = V; break; + case 0xb002: CHRBanks[1] = V; break; + case 0xc000: CHRBanks[2] = V; break; + case 0xc002: CHRBanks[3] = V; break; + case 0xd000: CHRBanks[4] = V; break; + case 0xd002: CHRBanks[5] = V; break; + case 0xe000: CHRBanks[6] = V; break; + case 0xe002: CHRBanks[7] = V; break; + case 0xf000: IRQLatch = V; break; + case 0xf001: X6502_IRQEnd(MDFN_IQEXT); IRQa = 0; IRQCount = IRQLatch; break; + case 0xf002: IRQa = 1; break; + default: printf("%04x: %02x\n", A, V);break; + } + + Sync(); +} + +static void Power(CartInfo *info) +{ + IRQCount = IRQa = 0; + PRGBanks[0] = 0; + PRGBanks[1] = 1; + setprg16(0xc000, 0x7F); + for(unsigned int x = 0; x < 8; x++) + CHRBanks[x] = x; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRGBanks, 2), + SFARRAY(CHRBanks, 8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void IRQHook(int a) +{ + if(IRQa) + { + acount += a * 3; + while(acount >= 341) + { + acount -= 341; + IRQCount++; + if(IRQCount == 0) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + } + } + } +} + + +int Mapper222_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x8000, 0xFFFF, Write); + MapIRQHook = IRQHook; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/228.cpp b/Mednafen/mednafen/nes/boards/228.cpp new file mode 100644 index 0000000000..458bca9409 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/228.cpp @@ -0,0 +1,79 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint16 latch; +static uint8 v_latch; + +static void Sync(void) +{ + uint32 page,pagel,pageh; + + setmirror(((latch>>13)&1) ? MI_H : MI_V); + + page=(latch>>7)&0x3F; + //printf("%04x\n",A); + if((page&0x30)==0x30) + page-=0x10; + + pagel=pageh=(page<<1) + (((latch>>6)&1)&((latch>>5)&1)); + pageh+=((latch>>5)&1)^1; + + setprg16(0x8000,pagel); + setprg16(0xC000,pageh); + setchr8( (v_latch&0x3) | ((latch&0xF)<<2) ); +} + +static DECLFW(Mapper228_write) +{ + latch = A; + v_latch = V; + Sync(); +} + +static void Reset(CartInfo *info) +{ + latch = v_latch = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), SFVAR(v_latch), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper228_Init(CartInfo *info) +{ + info->Power = info->Reset = Reset; + info->StateAction = StateAction; + SetWriteHandler(0x8000, 0xffff, Mapper228_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/23.cpp b/Mednafen/mednafen/nes/boards/23.cpp new file mode 100644 index 0000000000..087e3534f4 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/23.cpp @@ -0,0 +1,187 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 CHRBanks[8], PRGBanks[2], IRQCount, IRQLatch, Mirroring, K4IRQ, IRQa, K4sel; +static int32 acount; +static uint8 *WRAM = NULL; + +static void DoMirroring(void) +{ + switch(Mirroring & 3) + { + case 0: setmirror(MI_V); break; + case 1: setmirror(MI_H); break; + case 2: setmirror(MI_0); break; + case 3: setmirror(MI_1); break; + } +} + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static void DoPRG(void) +{ + if(K4sel & 2) + { + setprg8(0x8000, 0xFE); + setprg8(0xc000, PRGBanks[0]); + } + else + { + setprg8(0xc000, 0xFE); + setprg8(0x8000, PRGBanks[0]); + } + setprg8(0xa000, PRGBanks[1]); +} + +static DECLFW(Mapper23_write) +{ + if((A&0xF000)==0x8000) + { + PRGBanks[0] = V; + DoPRG(); + } + else if((A&0xF000)==0xA000) + { + PRGBanks[1] = V; + DoPRG(); + } + else + { + A|=((A>>2)&0x3)|((A>>4)&0x3)|((A>>6)&0x3); + A&=0xF003; + if(A>=0xb000 && A<=0xe003) + { + int x=((A>>1)&1)|((A-0xB000)>>11); + + CHRBanks[x]&=(0xF0)>>((A&1)<<2); + CHRBanks[x]|=(V&0xF)<<((A&1)<<2); + DoCHR(); + } + else + switch(A) + { + case 0xf000:X6502_IRQEnd(MDFN_IQEXT);IRQLatch&=0xF0;IRQLatch|=V&0xF;break; + case 0xf001:X6502_IRQEnd(MDFN_IQEXT);IRQLatch&=0x0F;IRQLatch|=V<<4;break; + case 0xf002:X6502_IRQEnd(MDFN_IQEXT);acount=0;IRQCount=IRQLatch;IRQa=V&2;K4IRQ=V&1;break; + case 0xf003:X6502_IRQEnd(MDFN_IQEXT);IRQa=K4IRQ;break; + case 0x9001: + case 0x9002: + case 0x9003:K4sel=V; + DoPRG(); + break; + case 0x9000: Mirroring = V & 0x3; DoMirroring(); break; + } + } +} + +static void KonamiIRQHook2(int a) +{ + #define LCYCS 341 + if(IRQa) + { + acount+=a*3; + if(acount>=LCYCS) + { + doagainbub:acount-=LCYCS;IRQCount++; + if(!IRQCount) {X6502_IRQBegin(MDFN_IQEXT);IRQCount=IRQLatch;} + if(acount>=LCYCS) goto doagainbub; + } + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), SFARRAY(PRGBanks, 2), SFARRAY(WRAM, 8192), + SFVAR(K4IRQ), SFVAR(K4sel), SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(Mirroring), SFVAR(IRQa), + SFVAR(acount), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +static void Power(CartInfo *info) +{ + for(int x = 0; x < 8; x++) + CHRBanks[x] = ~0; + PRGBanks[0] = PRGBanks[1] = ~0; + setprg8r(0x10, 0x6000, 0); + setprg16(0xc000, 0x7F); + IRQCount = IRQLatch = IRQa = K4sel = K4IRQ = 0; + Mirroring = 3; + DoPRG(); + DoCHR(); + DoMirroring(); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); + + acount = 0; +} + +static void Close(void) +{ + if(WRAM) + { + free(WRAM); + WRAM = NULL; + } +} + +int Mapper23_Init(CartInfo *info) +{ + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper23_write); + + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + + MapIRQHook=KonamiIRQHook2; + info->Power = Power; + info->Close = Close; + + if(!(WRAM = (uint8 *)malloc(8192))) + return(0); + + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/232.cpp b/Mednafen/mednafen/nes/boards/232.cpp new file mode 100644 index 0000000000..7d2f230c84 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/232.cpp @@ -0,0 +1,74 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latches[2]; + +static void Sync(void) +{ + setprg16(0x8000,(latches[1]&3) | ((latches[0]&0x18)>>1)); + setprg16(0xc000,3|(((latches[0])&0x18)>>1)); +} + +static DECLFW(Mapper232_write) +{ + if(A<=0x9FFF) + latches[0]=V; + else + latches[1]=V; + Sync(); +} + +static void Reset(CartInfo *info) +{ + latches[0]=0x18; + Sync(); + + setchr8(0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(latches, 2), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + Sync(); + } + return(ret); +} + +int BIC48_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper232_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + info->Power = info->Reset = Reset; + info->StateAction = StateAction; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/234.cpp b/Mednafen/mednafen/nes/boards/234.cpp new file mode 100644 index 0000000000..c8c8a4adaf --- /dev/null +++ b/Mednafen/mednafen/nes/boards/234.cpp @@ -0,0 +1,115 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 r1, r2; + +static void DoBS(void) +{ + if(r1&0x40) + { + setprg32(0x8000, (r1&0xE)|(r2&1)); + setchr8( ((r1&0xE)<<2) | ((r2>>4)&7) ); + } + else + { + setprg32(0x8000, r1&0xF); + setchr8( ((r1&0xF)<<2) | ((r2>>4)&3) ); + } +} + +static void R1Set(uint8 V) +{ + if(r1) return; + r1=V; + setmirror(((V >> 7) & 1) ^ 1); + DoBS(); +} + +static void R2Set(uint8 V) +{ + r2=V; + DoBS(); +} + +static DECLFW(R1W) +{ + R1Set(V); +} + +static DECLFR(R1R) +{ + uint8 r=CartBR(A); + R1Set(r); + return r; +} + +static DECLFW(R2W) +{ + R2Set(V); +} + +static DECLFR(R2R) +{ + uint8 r=CartBR(A); + R2Set(r); + return r; +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { SFVAR(r1), SFVAR(r2), SFEND }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + DoBS(); + setmirror(((r1 >> 7) & 1) ^ 1); + } + + return(ret); +} + +static void Power(CartInfo *info) +{ + r1=r2=0; + DoBS(); + setmirror(MI_V); +} + +int Mapper234_Init(CartInfo *info) +{ + SetReadHandler(0x8000, 0xFFFF, CartBR); + + SetWriteHandler(0xff80,0xff9f,R1W); + SetReadHandler(0xff80,0xff9f,R1R); + + SetWriteHandler(0xffe8,0xfff7,R2W); + SetReadHandler(0xffe8,0xfff7,R2R); + + info->Power = Power; + info->StateAction = StateAction; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/240.cpp b/Mednafen/mednafen/nes/boards/240.cpp new file mode 100644 index 0000000000..364f072802 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/240.cpp @@ -0,0 +1,108 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 *WRAM = NULL; +static uint8 latch; + +static void Sync(void) +{ + setprg32(0x8000, latch >> 4); + setchr8(latch & 0xF); +} + +static DECLFW(Write) +{ + latch = V; + Sync(); +} + +static DECLFW(BWRAM) +{ + WRAM[A-0x6000]=V; +} + +static DECLFR(AWRAM) +{ + return(WRAM[A-0x6000]); +} + +static void Power(CartInfo *info) +{ + latch = 0xFF; + Sync(); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + Sync(); + } + return(ret); +} + +static void Close(void) +{ + if(WRAM) + { + free(WRAM); + WRAM = NULL; + } +} + +int Mapper240_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + info->Close = Close; + + if(!(WRAM = (uint8 *)malloc(8192))) + { + return(0); + } + + memset(WRAM, 0xFF, 8192); + + MDFNMP_AddRAM(8192, 0x6000, WRAM); + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x4020, 0x5FFF, Write); + + SetReadHandler(0x6000, 0x7FFF, AWRAM); + SetWriteHandler(0x6000, 0x7FFF, BWRAM); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/241.cpp b/Mednafen/mednafen/nes/boards/241.cpp new file mode 100644 index 0000000000..93e33ac4ed --- /dev/null +++ b/Mednafen/mednafen/nes/boards/241.cpp @@ -0,0 +1,123 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 *WRAM = NULL; +static uint8 latch; + +static void Sync(void) +{ + setprg32(0x8000, latch); +} + +static DECLFW(Write) +{ + if(A & 0x8000) + { + latch = V; + Sync(); + } + //else + // printf("%04x %02x\n", A, V); +} + +static DECLFR(ReadLow) +{ + //printf("ReadLow: %04x\n", A); + return(0x00); +} + +static DECLFW(BWRAM) +{ + //printf("Write: %04x %02x\n", A, V); + WRAM[A-0x6000]=V; +} + +static DECLFR(AWRAM) +{ + //printf("Read: %04x\n", A); + return(WRAM[A-0x6000]); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); + setchr8(0); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 8192), + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + Sync(); + } + return(ret); +} + +static void Close(void) +{ + if(WRAM) + { + free(WRAM); + WRAM = NULL; + } +} + +int Mapper241_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + info->Close = Close; + + if(!(WRAM = (uint8 *)malloc(8192))) + { + return(0); + } + + memset(WRAM, 0xFF, 8192); + + MDFNMP_AddRAM(8192, 0x6000, WRAM); + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + + SetReadHandler(0x5000, 0x5FFF, ReadLow); + SetWriteHandler(0x5000, 0x5FFF, Write); + SetWriteHandler(0x8000, 0xFFFF, Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + SetReadHandler(0x6000, 0x7FFF, AWRAM); + SetWriteHandler(0x6000, 0x7FFF, BWRAM); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/242.cpp b/Mednafen/mednafen/nes/boards/242.cpp new file mode 100644 index 0000000000..61e3381e29 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/242.cpp @@ -0,0 +1,81 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 Mirroring, PRGBank32, WRAM[8192]; + +static void Sync(void) +{ + const int mirtab[4] = { MI_V, MI_H, MI_0, MI_1 }; + + setprg32(0x8000, PRGBank32); + setmirror(mirtab[Mirroring & 3]); +} + +static DECLFW(Mapper242_write) +{ + PRGBank32 = (A >> 3) & 0xF; + Mirroring = V & 3; + Sync(); +} + +static void Power(CartInfo *info) +{ + Mirroring = PRGBank32 = 0; + Sync(); + setchr8(0); + setprg8r(0x10, 0x6000, 0); + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Mirroring), + SFVAR(PRGBank32), + SFARRAY(WRAM, 8192), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper242_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper242_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + info->Power = Power; + info->StateAction = StateAction; + if(info->battery) + { + memset(WRAM, 0xFF, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/244.cpp b/Mednafen/mednafen/nes/boards/244.cpp new file mode 100644 index 0000000000..10ba88bc1b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/244.cpp @@ -0,0 +1,70 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 CaH4e3 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 PRGBank32, CHRBank8; + +static void Sync(void) +{ + setprg32(0x8000, PRGBank32); + setchr8(CHRBank8); +} +static DECLFW(Mapper244_write_1) +{ + PRGBank32 = (A - 0x8065) & 0x3; + Sync(); +} + +static DECLFW(Mapper244_write_2) +{ + CHRBank8 = (A - 0x80A5) & 0x7; + Sync(); +} + +static void Power(CartInfo *info) +{ + CHRBank8 = PRGBank32 = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PRGBank32), + SFVAR(CHRBank8), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper244_Init(CartInfo *info) +{ + SetWriteHandler(0x8065,0x80a4,Mapper244_write_1); + SetWriteHandler(0x80a5,0x80e4,Mapper244_write_2); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/246.cpp b/Mednafen/mednafen/nes/boards/246.cpp new file mode 100644 index 0000000000..36d4863c05 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/246.cpp @@ -0,0 +1,102 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" +static uint8 PRGBanks[4], CHRBanks[4]; +static uint8 WRAM[0x800]; + +static void Sync(void) +{ + int x; + for(x = 0; x < 4; x++) + { + setprg8(0x8000 + x * 8192, PRGBanks[x]); + setchr2(0x0000 + x * 2048, CHRBanks[x]); + } +} +static DECLFW(Mapper246_write) +{ + switch(A&0xF007) + { + case 0x6000:PRGBanks[0] = V;break; + case 0x6001:PRGBanks[1] = V;break; + case 0x6002:PRGBanks[2] = V;break; + case 0x6003:PRGBanks[3] = V;break; + case 0x6004:CHRBanks[0] = V;break; + case 0x6005:CHRBanks[1] = V;break; + case 0x6006:CHRBanks[2] = V;break; + case 0x6007:CHRBanks[3] = V;break; + } + Sync(); +} + +static void Reset(CartInfo *info) +{ + int x; + for(x = 0; x < 4; x++) + CHRBanks[x] = x; + PRGBanks[0] = 0; + PRGBanks[1] = 1; + PRGBanks[2] = 0xFE; + PRGBanks[3] = 0xFF; + setprg2r(0x10, 0x6800, 0); + Sync(); + if(!info->battery) + memset(WRAM, 0xFF, 0x800); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRGBanks, 4), + SFARRAY(CHRBanks, 4), + SFARRAY(WRAM, 0x800), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + Sync(); + } + return(ret); +} + +int Mapper246_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 0x800, 1); + SetWriteHandler(0x4020,0x67ff,Mapper246_write); + SetWriteHandler(0x8000,0xffff,Mapper246_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetReadHandler(0x6800, 0x6FFF, CartBR); + SetWriteHandler(0x6800, 0x6FFF, CartBW); + info->Reset = info->Power = Reset; + info->StateAction = StateAction; + if(info->battery) + { + memset(WRAM, 0xFF, 0x800); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 2048; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/248.cpp b/Mednafen/mednafen/nes/boards/248.cpp new file mode 100644 index 0000000000..525b8295a2 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/248.cpp @@ -0,0 +1,144 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 cmd, lpa, prgl[2], Mirroring, IRQLatch, IRQCount, IRQa, CHRBanks[6]; + +static void PRGSynco(void) +{ + if(lpa&0x80) + { + setprg16(0x8000,lpa&0xF); + } + else + { + setprg8(0x8000,prgl[0]&0x1F); + setprg8(0xa000,prgl[1]&0x1F); + } +} +static void DoCHR(void) +{ + setchr2(0x0000, CHRBanks[0]); + setchr2(0x0800, CHRBanks[1]); + for(int x = 0; x < 4; x++) + setchr1(0x1000 + x * 1024, CHRBanks[2 + x]); +} +static DECLFW(Mapper248_writelow) +{ + lpa=V; + PRGSynco(); +} + +static DECLFW(Mapper248_write) +{ + switch(A&0xF001) + { + case 0xa000:Mirroring = V & 1; setmirror(Mirroring ? MI_H : MI_V);break; // Not sure if this is right. Mirroring may be hard wired... + case 0xc000:IRQLatch=V;break; + case 0xc001:IRQCount=IRQLatch;break; + case 0xe000:IRQa=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xe001:IRQa=1;break; + case 0x8000:cmd=V;break; + case 0x8001:switch(cmd&7) + { + case 0:CHRBanks[0] = V >> 1;DoCHR();break; + case 1:CHRBanks[1] = V >> 1;DoCHR();break; + case 2:CHRBanks[2] = V;DoCHR();break; + case 3:CHRBanks[3] = V;DoCHR();break; + case 4:CHRBanks[4] = V;DoCHR();break; + case 5:CHRBanks[5] = V;DoCHR();break; + case 6:prgl[0]=V;PRGSynco();break; + case 7:prgl[1]=V;PRGSynco();break; + } + break; + } +} + +static void Mapper248_hb(void) +{ + if(IRQa) + { + IRQCount--; + if(IRQCount == 0xFF) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQCount = IRQLatch; + } + } +} + +static void Power(CartInfo *info) +{ + CHRBanks[0] = 0; + CHRBanks[1] = 1; + CHRBanks[2] = 4; + CHRBanks[3] = 5; + CHRBanks[4] = 6; + CHRBanks[5] = 7; + IRQCount = IRQLatch = IRQa = 0; + + Mirroring = (info->mirror & 1) ^ 1; + setmirror(Mirroring ^ 1); + cmd = 0; + lpa = 0; + prgl[0] = 0; + prgl[1] = 1; + setprg16(0xc000, 0x7F); + PRGSynco(); + DoCHR(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 6), + SFARRAY(prgl, 2), + SFVAR(lpa), + SFVAR(cmd), + SFVAR(Mirroring), + SFVAR(IRQCount), + SFVAR(IRQLatch), + SFVAR(IRQa), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + Mirroring &= 1; + setmirror(Mirroring ^ 1); + DoCHR(); + PRGSynco(); + } + return(ret); +} + +int Mapper248_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x6000,0x6fff,Mapper248_writelow); + SetWriteHandler(0x8000,0xffff,Mapper248_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + GameHBIRQHook=Mapper248_hb; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/25.cpp b/Mednafen/mednafen/nes/boards/25.cpp new file mode 100644 index 0000000000..2dce0fe009 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/25.cpp @@ -0,0 +1,174 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 CHRBanks[8], PRGBanks[2], K4IRQ, K4sel, IRQCount, IRQLatch, Mirroring, IRQa, WRAM[8192]; +static int32 acount; + +static void DoPRG(void) +{ + setprg8(0xa000, PRGBanks[1]); + + if(K4sel & 2) + { + setprg8(0xc000, PRGBanks[0]); + setprg8(0x8000, ~1); + } + else + { + setprg8(0x8000, PRGBanks[0]); + setprg8(0xC000, ~1); + } +} + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static void DoMirroring(void) +{ + switch(Mirroring & 3) + { + case 0: setmirror(MI_V); break; + case 1: setmirror(MI_H); break; + case 2: setmirror(MI_0); break; + case 3: setmirror(MI_1); break; + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), SFARRAY(PRGBanks, 2), SFARRAY(WRAM, 8192), + SFVAR(K4IRQ), SFVAR(K4sel), SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(Mirroring), SFVAR(IRQa), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +static DECLFW(Mapper25_write) +{ + A=(A&0xF003)|((A&0xC)>>2); + + if((A&0xF000)==0xA000) + { + PRGBanks[1] = V; + DoPRG(); + } + else if(A>=0xB000 && A<=0xEFFF) + { + int x=(A&1)|((A-0xB000)>>11); + + CHRBanks[x]&=(0xF0)>>((A&2)<<1); + CHRBanks[x]|=(V&0xF)<<((A&2)<<1); + DoCHR(); + } + else if((A&0xF000)==0x8000) + { + PRGBanks[0] = V; + DoPRG(); + } + else switch(A) + { + case 0x9000:Mirroring = V; DoMirroring(); break; + case 0x9001:K4sel=V; DoPRG(); break; + break; + case 0xf000:IRQLatch&=0xF0;IRQLatch|=V&0xF;break; + case 0xf002:IRQLatch&=0x0F;IRQLatch|=V<<4;break; + case 0xf001:IRQCount=IRQLatch;IRQa=V&2;K4IRQ=V&1;acount=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xf003:IRQa=K4IRQ;X6502_IRQEnd(MDFN_IQEXT);break; + } +} + +static void KonamiIRQHook(int a) +{ +// #define LCYCS ((227*2)) + #define LCYCS 341 + if(IRQa) + { + acount+=a*3; + // acount+=a*4; + if(acount>=LCYCS) + { + doagainbub:acount-=LCYCS;IRQCount++; + if(IRQCount == 0) + {//acount=0; + X6502_IRQBegin(MDFN_IQEXT);IRQCount=IRQLatch; + } + if(acount>=LCYCS) goto doagainbub; + } + } +} + +static void Power(CartInfo *info) +{ + int x; + + acount = 0; + + for(x = 0; x < 8; x++) + CHRBanks[x] = x; + DoCHR(); + K4sel = 0; + PRGBanks[0] = 0; + PRGBanks[1] = 1; + DoPRG(); + Mirroring = 0; + DoMirroring(); + + IRQCount = IRQLatch = 0; + setprg8(0xe000, ~0); + setprg8r(0x10, 0x6000, 0); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +int Mapper25_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetWriteHandler(0x8000,0xffff,Mapper25_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + MapIRQHook=KonamiIRQHook; + info->Power = Power; + info->StateAction = StateAction; + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/32.cpp b/Mednafen/mednafen/nes/boards/32.cpp new file mode 100644 index 0000000000..8982e1d553 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/32.cpp @@ -0,0 +1,127 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 PRGBanks[2], IREMCon, CHRBanks[8], WRAM[8192]; + +static void DoCHR(void) +{ + for(int x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} +static void DoPRG(void) +{ + if(IREMCon & 2) + { + setprg8(0xC000, PRGBanks[0]); + setprg8(0x8000, 0xFE); + } + else + { + setprg8(0x8000, PRGBanks[0]); + setprg8(0xC000, 0xFE); + } + setprg8(0xa000, PRGBanks[1]); +} + +static void DoMirroring(void) +{ + setmirror((IREMCon & 1) ? MI_H : MI_V); +} + +static DECLFW(Mapper32_write) +{ + switch(A>>12) + { + case 0x8: + PRGBanks[0] = V; + DoPRG(); + break; + case 0x9:IREMCon = V; + DoPRG(); + DoMirroring(); + break; + case 0xa:PRGBanks[1] = V;DoPRG(); + break; + } + + if((A&0xF000)==0xb000) + { + CHRBanks[A & 7] = V; + DoCHR(); + } +} + +static void Power(CartInfo *info) +{ + PRGBanks[0] = 0; + PRGBanks[1] = 1; + for(int x = 0; x < 8; x++) + CHRBanks[x] = x; + IREMCon = 0; + setprg16(0xc000, 0x7F); + DoPRG(); + DoCHR(); + DoMirroring(); + setprg8r(0x10, 0x6000, 0); + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRGBanks, 2), + SFARRAY(CHRBanks, 8), + SFVAR(IREMCon), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + + return(ret); +} + +int Mapper32_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetWriteHandler(0x8000,0xffff,Mapper32_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + if(info->battery) + { + memset(WRAM, 0xFF, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/33.cpp b/Mednafen/mednafen/nes/boards/33.cpp new file mode 100644 index 0000000000..1677bb04ae --- /dev/null +++ b/Mednafen/mednafen/nes/boards/33.cpp @@ -0,0 +1,166 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static bool is48; +static uint8 IRQCount, IRQa, IRQLatch, PRGBanks[2], Mirroring, CHRBanks[6]; + +static void DoPRG(void) +{ + if(is48) + { + setprg8(0x8000, PRGBanks[0]); + setprg8(0xa000, PRGBanks[1]); + } + else + { + setprg8(0x8000, PRGBanks[0] & 0x3F); + setprg8(0xa000, PRGBanks[1] & 0x3F); + } +} + +static void DoCHR(void) +{ + for(int x = 0; x < 4; x++) + setchr1(0x1000 + x * 1024, CHRBanks[x]); + setchr2(0x0000, CHRBanks[4]); + setchr2(0x0800, CHRBanks[5]); +} + +static void DoMirroring(void) +{ + if(is48) + setmirror(((Mirroring >> 6) & 1) ? MI_H : MI_V); + else + setmirror(((PRGBanks[0] >> 6) & 1) ? MI_H : MI_V); +} + +static DECLFW(Mapper33_write) +{ + A&=0xF003; + if(A>=0xA000 && A<=0xA003) + { + CHRBanks[A & 3] = V; + DoCHR(); + } + else switch(A) + { + case 0x8000:PRGBanks[0] = V; DoPRG(); DoMirroring(); break; + case 0x8001:PRGBanks[1] = V; DoPRG(); break; + case 0x8002:CHRBanks[4] = V; DoCHR(); break; + case 0x8003:CHRBanks[5] = V; DoCHR(); break; + } +} + +static DECLFW(Mapper48_HiWrite) +{ + switch(A&0xF003) + { + case 0xc000:IRQLatch=V;break; + case 0xc001:IRQCount=IRQLatch;break; + case 0xc003:IRQa=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xc002:IRQa=1;break; + case 0xe000:Mirroring = V; DoMirroring(); ;break; + } +} + +static void heho(void) +{ + if(IRQa) + { + IRQCount++; + if(!IRQCount) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + } + } +} + +static void Power(CartInfo *info) +{ + PRGBanks[0] = 0; + PRGBanks[1] = 1; + Mirroring = 0; + IRQLatch = IRQCount = IRQa = 0; + for(int x = 0; x < 6; x++) + CHRBanks[x] = 0; + DoPRG(); + DoCHR(); + DoMirroring(); + + if(is48) + setprg16(0xc000, 0x7F); + else + setprg16(0xc000, 0x1F); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRGBanks, 2), + SFARRAY(CHRBanks, 6), + SFEND + }; + + SFORMAT StateRegs48[] = + { + SFARRAY(PRGBanks, 2), + SFARRAY(CHRBanks, 6), + SFVAR(Mirroring), + SFVAR(IRQCount), SFVAR(IRQa), SFVAR(IRQLatch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, is48 ? StateRegs48 : StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +int Mapper33_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper33_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + is48=0; + + return(1); +} + +int Mapper48_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper33_write); + SetWriteHandler(0xc000,0xffff,Mapper48_HiWrite); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + GameHBIRQHook=heho; + is48=1; + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/34.cpp b/Mednafen/mednafen/nes/boards/34.cpp new file mode 100644 index 0000000000..359dd9a438 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/34.cpp @@ -0,0 +1,68 @@ +#include "mapinc.h" + +static uint8 PRGBank32, CHRBanks[2], WRAM[8192]; + +static void Sync(void) +{ + setprg32(0x8000, PRGBank32); + setchr4(0x0000, CHRBanks[0]); + setchr4(0x1000, CHRBanks[1]); +} + +static DECLFW(Mapper34_write) +{ + switch(A) + { + case 0x7FFD:PRGBank32 = V;break; + case 0x7FFE:CHRBanks[0] = V;break; + case 0x7fff:CHRBanks[1] = V;break; + } + if(A>=0x8000) + PRGBank32 = V; + + Sync(); +} + +static void Power(CartInfo *info) +{ + if(!info->battery) + memset(WRAM, 0xFF, 8192); + PRGBank32 = 0; + CHRBanks[0] = 0; + CHRBanks[1] = 1; + setprg8r(0x10, 0x6000, 0); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PRGBank32), + SFARRAY(CHRBanks, 2), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper34_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + if(info->battery) + { + memset(WRAM, 0xFF, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetWriteHandler(0x7ffd,0xffff,Mapper34_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/38.cpp b/Mednafen/mednafen/nes/boards/38.cpp new file mode 100644 index 0000000000..99e2fc7c5f --- /dev/null +++ b/Mednafen/mednafen/nes/boards/38.cpp @@ -0,0 +1,61 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; +static void Sync(void) +{ + setprg32(0x8000, latch & 0x3); + setchr8((latch >> 2) & 0x3); +} + +static DECLFW(Mapper38_write) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper38_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x7000, 0x7fff, Mapper38_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/41.cpp b/Mednafen/mednafen/nes/boards/41.cpp new file mode 100644 index 0000000000..8418f8a517 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/41.cpp @@ -0,0 +1,79 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 calreg, calchr; + +static void Sync(void) +{ + setprg32(0x8000, calreg & 0x7); + setmirror((calreg & 0x20) ? MI_H : MI_V); + setchr8(calchr); +} + +static DECLFW(Mapper41_write) +{ + if(A<0x8000) + { + calreg=A; + calchr&=0x3; + calchr|=(A>>1)&0xC; + } + else if(calreg&0x4) + { + calchr&=0xC; + calchr|=A&3; + } + Sync(); +} + +static void Reset(CartInfo *info) +{ + calreg=calchr=0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(calreg), + SFVAR(calchr), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + + +int Mapper41_Init(CartInfo *info) +{ + info->Power = info->Reset = Reset; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper41_write); + SetWriteHandler(0x6000,0x67ff,Mapper41_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/42.cpp b/Mednafen/mednafen/nes/boards/42.cpp new file mode 100644 index 0000000000..1f57036e57 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/42.cpp @@ -0,0 +1,111 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 regs[4], CHRBank8; +static uint16 IRQCount; + +static void Sync(void) +{ + setchr8(CHRBank8); + setprg8(0x6000, regs[0] & 0xF); + setmirror((regs[1] & 0x08) ? MI_H : MI_V); +} + +static DECLFW(NicolWrite) +{ + CHRBank8 = V; + Sync(); +} + +static DECLFW(Write) +{ + regs[A & 3] = V; + if((A & 3) == 2) + if(!(V & 2)) + { + X6502_IRQEnd(MDFN_IQEXT); + IRQCount = 0; + } + Sync(); +} + +static void IRQHook(int a) +{ + if(regs[2] & 2) + { + IRQCount += a; + if(IRQCount >= 24576) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQCount = 24576; + } + } +} + +static void Power(CartInfo *info) +{ + int x; + + CHRBank8 = 0; + + IRQCount = 0; + + for(x = 0; x < 4; x++) + regs[x] = 0; + + setprg8(0x8000, 0xC); + setprg8(0xa000, 0xD); + setprg8(0xc000, 0xE); + setprg8(0xe000, 0xF); + + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(regs, 4), + SFVAR(IRQCount), + SFVAR(CHRBank8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + Sync(); + } + + return(ret); +} + +int BioMiracleA_Init(CartInfo *info) +{ + MapIRQHook = IRQHook; + info->Power = Power; + info->StateAction = StateAction; + + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x8000, 0x9FFF, NicolWrite); + SetWriteHandler(0xe000, 0xFFFF, Write); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/46.cpp b/Mednafen/mednafen/nes/boards/46.cpp new file mode 100644 index 0000000000..7442a85f25 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/46.cpp @@ -0,0 +1,72 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 A64reg, A64wr; + +static void Sync(void) +{ + setprg32(0x8000, (A64wr&1)+((A64reg&0xF)<<1)); + setchr8(((A64wr>>4)&7)+((A64reg&0xF0)>>1)); +} + +static DECLFW(Mapper46_writel) +{ + A64reg=V; + Sync(); +} + +static DECLFW(Mapper46_write) +{ + A64wr=V; + Sync(); +} + +static void Reset(CartInfo *info) +{ + A64reg = A64wr = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(A64reg), + SFVAR(A64wr), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper46_Init(CartInfo *info) +{ + info->Power = Reset; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper46_write); + SetWriteHandler(0x6000,0x7fff,Mapper46_writel); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/51.cpp b/Mednafen/mednafen/nes/boards/51.cpp new file mode 100644 index 0000000000..d7cceb4ebe --- /dev/null +++ b/Mednafen/mednafen/nes/boards/51.cpp @@ -0,0 +1,87 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 mode, page; + +static uint32 Get8K(uint32 A) +{ + uint32 bank; + + bank=(page<<2)|((A>>13)&1); + + if(A&0x4000 && !(mode&1)) bank|=0xC; + if(!(A&0x8000)) bank|=0x20; + if(mode==2) bank|=2; + else bank|=(A>>13)&2; + return(bank); +} + +static void Synco(void) +{ + uint32 x; + if(mode<=2) + setmirror(MI_V); + else + setmirror(MI_H); + for(x=0x6000;x<0x10000;x+=8192) + setprg8(x,Get8K(x)); +} + +static DECLFW(Write) +{ + if(A&0x8000) page=V&0xF; + else mode=(mode&2)|((V>>1)&1); + + if(A&0x4000) mode=(mode&1)|((V>>3)&2); + Synco(); +} + +static void Power(CartInfo *info) +{ + setchr8(0); + mode = 1; + page = 0; + Synco(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(page), + SFVAR(mode), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Synco(); + return(ret); +} + +int Mapper51_Init(CartInfo *info) +{ + SetWriteHandler(0x6000,0xFFFF,Write); + SetReadHandler(0x6000,0xFFFF,CartBR); + info->Power = Power; + info->StateAction = StateAction; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/65.cpp b/Mednafen/mednafen/nes/boards/65.cpp new file mode 100644 index 0000000000..3fc06a3cbe --- /dev/null +++ b/Mednafen/mednafen/nes/boards/65.cpp @@ -0,0 +1,130 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 IRQa, CHRBanks[8], PRGBanks[3], Mirroring; +static uint16 IRQCount, IRQLatch; + +static void DoCHR(void) +{ + for(int x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static void DoPRG(void) +{ + for(int x = 0; x < 3; x++) + setprg8(0x8000 + x * 8192, PRGBanks[x]); +} + +static void DoMirroring(void) +{ + setmirror((Mirroring & 1) ^ 1); +} + +static void IREMIRQHook(int a) +{ + if(IRQa) + { + uint16 last = IRQCount; + IRQCount-=a; + if(IRQCount > last) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + IRQCount=0xFFFF; + } + } +} + +static DECLFW(Mapper65_write) +{ + A&= 0xF007; + + if(A >= 0xb000 && A <= 0xB007) + { + CHRBanks[A & 7] = V; + DoCHR(); + } + else switch(A) + { + case 0x8000:PRGBanks[0] = V; DoPRG(); break; + case 0x9001:Mirroring = V >> 7; DoMirroring();break; + case 0x9003:IRQa=V&0x80;X6502_IRQEnd(MDFN_IQEXT);break; + case 0x9004:IRQCount=IRQLatch;break; + case 0x9005: IRQLatch&=0x00FF; + IRQLatch|=V<<8; + break; + case 0x9006: IRQLatch&=0xFF00;IRQLatch|=V; + break; + case 0xa000:PRGBanks[1] = V; DoPRG();break; + case 0xC000:PRGBanks[2] = V; DoPRG();break; + } +} + +static void Power(CartInfo *info) +{ + int x; + + for(x = 0; x < 8; x++) + CHRBanks[x] = x; + + Mirroring = ((info->mirror & 1) ^ 1); + PRGBanks[0] = 0; + PRGBanks[1] = 1; + PRGBanks[2] = 0xFE; + DoPRG(); + DoCHR(); + DoMirroring(); + setprg8(0xe000, 0xFF); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), SFARRAY(PRGBanks, 3), + SFVAR(Mirroring), + SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(IRQa), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoCHR(); + DoPRG(); + DoMirroring(); + } + + return(ret); +} + +int Mapper65_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + MapIRQHook=IREMIRQHook; + SetWriteHandler(0x8000,0xffff,Mapper65_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/67.cpp b/Mednafen/mednafen/nes/boards/67.cpp new file mode 100644 index 0000000000..c1e1e4207d --- /dev/null +++ b/Mednafen/mednafen/nes/boards/67.cpp @@ -0,0 +1,136 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 CHRBanks[4], PRGBank16, Mirroring, suntoggle, IRQa; +static uint16 IRQCount; + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 4; x++) + setchr2(x * 2048, CHRBanks[x]); +} + +static void DoMirroring(void) +{ + switch(Mirroring & 3) + { + case 0: setmirror(MI_V); break; + case 1: setmirror(MI_H); break; + case 2: setmirror(MI_0); break; + case 3: setmirror(MI_1); break; + } +} + +static void DoPRG(void) +{ + setprg16(0x8000, PRGBank16); +} + +static DECLFW(Mapper67_write) +{ + A&=0xF800; + if((A&0x800) && A<=0xb800) + { + CHRBanks[(A - 0x8800) >> 12] = V; + DoCHR(); + } + else switch(A) + { + case 0xc800: + case 0xc000:if(!suntoggle) + { + IRQCount&=0xFF; + IRQCount|=V<<8; + } + else + { + IRQCount&=0xFF00; + IRQCount|=V; + } + suntoggle^=1; + break; + case 0xd800:suntoggle=0;IRQa=V&0x10;X6502_IRQEnd(MDFN_IQEXT);break; + + case 0xe800:Mirroring = V & 3; DoMirroring(); break; + case 0xf800:PRGBank16 = V; DoPRG(); break; + } +} + +static void SunIRQHook(int a) +{ + if(IRQa) + { + uint16 last = IRQCount; + IRQCount-=a; + if(last < IRQCount) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + } + } +} + +static void Power(CartInfo *info) +{ + Mirroring = 0; + IRQCount = IRQa = 0; + for(int x = 0; x < 4; x++) + CHRBanks[x] = x; + PRGBank16 = 0; + DoMirroring(); + DoPRG(); + DoCHR(); + + setprg16(0xc000, ~0); +} + + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 4), + SFVAR(PRGBank16), SFVAR(Mirroring), SFVAR(suntoggle), SFVAR(IRQa), SFVAR(IRQCount), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + Mirroring &= 3; + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +int Mapper67_Init(CartInfo *info) +{ + SetWriteHandler(0x8000, 0xffff, Mapper67_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + MapIRQHook=SunIRQHook; + info->Power = Power; + info->StateAction = StateAction; + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/68.cpp b/Mednafen/mednafen/nes/boards/68.cpp new file mode 100644 index 0000000000..4b7261afe2 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/68.cpp @@ -0,0 +1,140 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 CHRBanks[4], Mirroring, NTBanks[2], PRGBank16; +static uint8 WRAM[8192]; + +static void DoCHR(void) +{ + if(!(Mirroring & 0x10)) + { + const int mir_tab[4] = {MI_V, MI_H, MI_0, MI_1}; + setmirror(mir_tab[Mirroring & 3]); + } + else + { + uint8 *b[2]; + b[0] = CHRptr[0] + (((NTBanks[0] | 0x80)&CHRmask1[0])<<10); + b[1] = CHRptr[0] + (((NTBanks[1] | 0x80) & CHRmask1[0]) << 10); + + const int zoom_tab[4][4] = + { + { 0, 1, 0, 1 }, + { 0, 0, 1, 1 }, + { 0, 0, 0, 0 }, + { 1, 1, 1, 1 }, + }; + for(int x = 0; x < 4; x++) + setntamem(b[zoom_tab[Mirroring & 3][x]], 0, x); + } + for(int x = 0; x < 4; x++) + setchr2(x << 11, CHRBanks[x]); +} + +static void DoPRG(void) +{ + setprg16(0x8000, PRGBank16); +} + +static DECLFW(Mapper68_write) +{ + A&=0xF000; + + if(A>=0x8000 && A<=0xB000) + { + CHRBanks[(A - 0x8000) >> 12] = V; + DoCHR(); + } + else switch(A) + { + case 0xc000:NTBanks[0] = V; + DoCHR(); + break; + + case 0xd000:NTBanks[1] = V; + DoCHR(); + break; + + case 0xe000: Mirroring = V; + DoCHR(); + break; + case 0xf000: PRGBank16 = V; DoPRG();break; + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Mirroring), SFARRAY(CHRBanks, 4), SFVAR(PRGBank16), SFARRAY(NTBanks, 2), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + } + + return(ret); +} + +static void Power(CartInfo *info) +{ + int x; + for(x = 0; x < 4; x++) + CHRBanks[x] = x; + PRGBank16 = 0; + Mirroring = 0; + for(x = 0; x < 2; x++) + NTBanks[x] = 0; + DoPRG(); + DoCHR(); + setprg16(0xc000, ~0); + + if(!info->battery) + memset(WRAM, 0, 8192); + + setprg16r(0x10, 0x6000, 0); +} + +int Mapper68_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper68_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + // external WRAM is apparently used by Nantettatte Baseball + SetReadHandler(0x6000, 0x7FFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/70.cpp b/Mednafen/mednafen/nes/boards/70.cpp new file mode 100644 index 0000000000..49ada9dab8 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/70.cpp @@ -0,0 +1,47 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg16(0x8000, (latch >> 4) & 0x0f); + setchr8(latch & 0x0F); +} + +static DECLFW(Mapper70_write) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setprg16(0xc000, 0x0F); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper70_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x6000,0xffff,Mapper70_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/72.cpp b/Mednafen/mednafen/nes/boards/72.cpp new file mode 100644 index 0000000000..085d6cadbc --- /dev/null +++ b/Mednafen/mednafen/nes/boards/72.cpp @@ -0,0 +1,78 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg16(0x8000, latch & 0xF); + setchr8(latch >> 4); +} +static DECLFW(Mapper72_write) +{ + if(V&0x80) + { + latch &= 0xF0; + latch |= V & 0xF; + } + + if(V&0x40) + { + latch &= 0x0F; + latch |= (V&0xF) << 4; + } + + if(V&0xC0) + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setprg16(0xc000, 0xF); + Sync(); +} + +int Mapper72_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x6000,0xffff,Mapper72_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/73.cpp b/Mednafen/mednafen/nes/boards/73.cpp new file mode 100644 index 0000000000..2b367a3ae6 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/73.cpp @@ -0,0 +1,107 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint16 IRQCount; +static uint8 IRQa, PRGBank16, WRAM[8192]; + +static void Sync(void) +{ + setprg16(0x8000, PRGBank16); +} + +static DECLFW(Mapper73_write) +{ + //if(A>=0xd000 && A<=0xdfff) + X6502_IRQEnd(MDFN_IQEXT); /* How are IRQs acknowledged on this chip? */ + switch(A&0xF000) + { + //default: printf("$%04x:$%02x\n",A,V);break; + case 0x8000:IRQCount&=0xFFF0;IRQCount|=(V&0xF);break; + case 0x9000:IRQCount&=0xFF0F;IRQCount|=(V&0xF)<<4;break; + case 0xa000:IRQCount&=0xF0FF;IRQCount|=(V&0xF)<<8;break; + case 0xb000:IRQCount&=0x0FFF;IRQCount|=(V&0xF)<<12;break; + case 0xc000:IRQa=V&2;break; + case 0xf000:PRGBank16 = V; Sync(); break; + } +} + +static void Mapper73IRQHook(int a) +{ + if(IRQa) + { + uint32 tmp = IRQCount; + tmp += a; + if(tmp >= 0xFFFF) + { + IRQCount&=0xFFFF; + IRQa=0; + X6502_IRQBegin(MDFN_IQEXT); + } + else + IRQCount = tmp; + } +} + +static void Power(CartInfo *info) +{ + IRQCount = IRQa = 0; + PRGBank16 = 0; + setprg16(0xc000, 0xFF); + setchr8(0); + setprg8r(0x10, 0x6000, 0); + Sync(); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(IRQCount), SFVAR(IRQa), SFVAR(PRGBank16), + SFARRAY(WRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} +int Mapper73_Init(CartInfo *info) +{ + info->StateAction = StateAction; + + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetWriteHandler(0x8000,0xffff,Mapper73_write); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetReadHandler(0x6000, 0xFFFF, CartBR); + info->Power = Power; + MapIRQHook=Mapper73IRQHook; + + if(info->battery) + { + memset(WRAM, 0xFF, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/75.cpp b/Mednafen/mednafen/nes/boards/75.cpp new file mode 100644 index 0000000000..88b40291cd --- /dev/null +++ b/Mednafen/mednafen/nes/boards/75.cpp @@ -0,0 +1,100 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + + +static uint8 PRGBanks[3], map75ar[2], map75sel; + +static void DoPRG(void) +{ + setprg8(0x8000, PRGBanks[0]); + setprg8(0xa000, PRGBanks[1]); + setprg8(0xc000, PRGBanks[2]); +} + +static void DoCHR(void) +{ + setchr4(0x0000, ((map75sel & 2) << 3) | map75ar[0]); + setchr4(0x1000, ((map75sel & 4) << 2) | map75ar[1]); +} + +static void DoMirroring(void) +{ + setmirror((map75sel & 1) ? MI_H : MI_V); +} + +static DECLFW(Mapper75_write) +{ + switch(A&0xF000) + { + case 0x8000:PRGBanks[0] = V; DoPRG(); break; + case 0x9000:map75sel = V; DoCHR(); DoMirroring(); map75sel=V; break; + case 0xa000:PRGBanks[1] = V; DoPRG();break; + case 0xc000:PRGBanks[2] = V; DoPRG();break; + case 0xe000:V&=0xF;map75ar[0]=V;DoCHR();break; + case 0xf000:V&=0xF;map75ar[1]=V;DoCHR();break; + } +} +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRGBanks, 3), + SFARRAY(map75ar, 2), + SFVAR(map75sel), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +static void Power(CartInfo *info) +{ + PRGBanks[0] = 0; + PRGBanks[1] = 1; + PRGBanks[2] = 0xFE; + map75ar[0] = 0; + map75ar[1] = 1; + map75sel = 0; + DoPRG(); + DoCHR(); + DoMirroring(); + + setprg8(0xe000, 0xFF); +} + +int Mapper75_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper75_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/76.cpp b/Mednafen/mednafen/nes/boards/76.cpp new file mode 100644 index 0000000000..65fce8f4f8 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/76.cpp @@ -0,0 +1,118 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 cmd, CHRBanks[4], PRGBanks[2], Mirroring; + +static void DoCHR(void) +{ + for(int x = 0; x < 4; x++) + setchr2(x * 2048, CHRBanks[x]); +} + +static void DoPRG(void) +{ + if(cmd & 0x40) + { + setprg8(0xc000, PRGBanks[0]); + setprg8(0x8000, 0xFE); + } + else + { + setprg8(0x8000, PRGBanks[0]); + setprg8(0xc000, 0xFE); + } + setprg8(0xa000, PRGBanks[1]); +} + +static void DoMirroring(void) +{ + setmirror((Mirroring & 1) ? MI_H : MI_V); +} + +static DECLFW(Mapper76_write) +{ + switch(A&0xE001) + { + case 0x8000: cmd = V; DoPRG(); break; + case 0x8001: + switch(cmd&0x07) + { + case 2: CHRBanks[0] = V; DoCHR(); break; + case 3: CHRBanks[1] = V; DoCHR(); break; + case 4: CHRBanks[2] = V; DoCHR(); break; + case 5: CHRBanks[3] = V; DoCHR(); break; + case 6: PRGBanks[0] = V; DoPRG(); break; + case 7: PRGBanks[1] = V; DoPRG(); break; + } + break; + case 0xA000: Mirroring = V & 1; DoMirroring(); break; + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(cmd), + SFVAR(Mirroring), + SFARRAY(CHRBanks, 4), + SFARRAY(PRGBanks, 2), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +static void Power(CartInfo *info) +{ + int x; + + for(x = 0; x < 4; x++) + CHRBanks[x] = x; + + PRGBanks[0] = 0; + PRGBanks[1] = 1; + Mirroring = 0; + cmd = 0; + DoPRG(); + DoCHR(); + DoMirroring(); + setprg16(0xc000, 0x7F); +} + + +int Mapper76_Init(CartInfo *info) +{ + SetWriteHandler(0x8000,0xffff,Mapper76_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/77.cpp b/Mednafen/mednafen/nes/boards/77.cpp new file mode 100644 index 0000000000..e9020558bc --- /dev/null +++ b/Mednafen/mednafen/nes/boards/77.cpp @@ -0,0 +1,68 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; +static uint8 CHRRAM[8192]; + +static void Sync(void) +{ + setprg32(0x8000, latch & 0x7); + setchr2(0x0000, (latch & 0xF0) >> 4); +} + +static DECLFW(Mapper77_write) +{ + latch = V; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFARRAY(CHRRAM, 8192), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); + for(int x = 2; x < 8; x++) + setchr1r(0x10, x * 0x400, x); + memset(CHRRAM, 0xFF, 8192); +} + +int Mapper77_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + + SetupCartCHRMapping(0x10, CHRRAM, 8192, 1); + SetWriteHandler(0x6000,0xffff,Mapper77_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/78.cpp b/Mednafen/mednafen/nes/boards/78.cpp new file mode 100644 index 0000000000..5f9b6125fa --- /dev/null +++ b/Mednafen/mednafen/nes/boards/78.cpp @@ -0,0 +1,47 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg16(0x8000, latch & 0x7); + setmirror(((latch >> 3) & 1) ? MI_1 : MI_0); + setchr8(latch >> 4); +} + +static DECLFW(Mapper78_write) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setprg16(0xc000, 0x0F); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper78_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper78_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/8.cpp b/Mednafen/mednafen/nes/boards/8.cpp new file mode 100644 index 0000000000..6cf075026f --- /dev/null +++ b/Mednafen/mednafen/nes/boards/8.cpp @@ -0,0 +1,79 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 WRAM[8192], latch; + +static void Sync(void) +{ + setprg16(0x8000, latch >> 3); + setchr8(latch & 0x7); +} + +static DECLFW(Mapper8_write) +{ + latch = V; + Sync(); +} + +static void Reset(CartInfo *info) +{ + if(!info->battery) + memset(WRAM, 0x00, 8192); + latch = 0; + Sync(); + setprg8r(0x10, 0x6000, 0); + setprg16(0xc000, 0x1F); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 8192), + SFVAR(latch), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper8_Init(CartInfo *info) +{ + latch = 0; + info->Power = info->Reset = Reset; + info->StateAction = StateAction; + if(info->battery) // Do FFE units initialize 6000-7fff RAM? + { + memset(WRAM, 0x00, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + Sync(); + SetWriteHandler(0x8000,0xFFFF,Mapper8_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/80.cpp b/Mednafen/mednafen/nes/boards/80.cpp new file mode 100644 index 0000000000..70b29c07ea --- /dev/null +++ b/Mednafen/mednafen/nes/boards/80.cpp @@ -0,0 +1,212 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 Mirroring, PRGBanks[3], CHRBanks[6], IRAM[128]; +static uint32 lastA; +static bool isfu; +static uint8 CCache[8]; +static int32 lastmc; +static uint8 IRAM_Control; + +static void Fudou_PPU(uint32 A) +{ + static uint8 z; + + if(A>=0x2000) return; + + A>>=10; + lastA=A; + + z=CCache[A]; + if(z != lastmc) + { + setmirror(z?MI_1:MI_0); + lastmc = z; + } +} + +static void mira() +{ + if(isfu) + { + int x; + CCache[0]=CCache[1]=CHRBanks[0]>>7; + CCache[2]=CCache[3]=CHRBanks[1]>>7; + + for(x=0;x<4;x++) + CCache[4+x]=CHRBanks[2+x]>>7; + + setmirror(CCache[lastA] ? MI_1 : MI_0); + } + else + setmirror(Mirroring & 1); +} +static void DoPRG(void) +{ + int x; + for(x = 0; x < 3; x++) + setprg8(0x8000 + x * 8192, PRGBanks[x]); +} +static void DoCHR(void) +{ + setchr2(0x0000, (CHRBanks[0] >> 1) & 0x3F); + setchr2(0x0800, (CHRBanks[1] >> 1) & 0x3F); + + for(int x = 0; x < 4; x++) + setchr1(0x1000 + x * 1024, CHRBanks[2 + x]); +} + +static DECLFR(IRAM_Read) +{ + //printf("%04x\n", A); + + if(IRAM_Control == 0xA3) + return IRAM[A & 0x7F]; + + return(X.DB); +} + +static DECLFW(IRAM_Write) +{ + //printf("%04x:%02x\n", A, V); + + if(IRAM_Control == 0xA3) + IRAM[A & 0x7F] = V; +} + +static DECLFW(Mapper80_write) +{ + //if((A & 0xF) == 0x7 || ((A & 0xE) == 0x8)) + // printf("%04x:%02x\n", A, V); + + switch(A & 0xF) + { + case 0x0: CHRBanks[0]=V;DoCHR();mira();break; + case 0x1: CHRBanks[1]=V;DoCHR();mira();break; + + case 0x2: CHRBanks[2]=V;DoCHR();mira();break; + case 0x3: CHRBanks[3]=V;DoCHR();mira();break; + case 0x4: CHRBanks[4]=V;DoCHR();mira();break; + case 0x5: CHRBanks[5]=V;DoCHR();mira();break; + + case 0x6: + case 0x7: Mirroring = V & 1; + mira(); + break; + + case 0x8: + case 0x9: IRAM_Control = V; + break; + + case 0xa: + case 0xb: PRGBanks[0] = V; DoPRG();break; + + case 0xc: + case 0xd: PRGBanks[1] = V; DoPRG();break; + + case 0xe: + case 0xf: PRGBanks[2] = V; DoPRG();break; + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Mirroring), + SFARRAY(PRGBanks, 3), + SFVAR(lastA), + SFVAR(lastmc), + SFARRAY(CHRBanks, 6), + + SFARRAY(IRAM, 128), + SFVAR(IRAM_Control), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + DoPRG(); + DoCHR(); + mira(); + } + return(ret); +} + +static void Power(CartInfo *info) +{ + int x; + + for(x = 0; x < 6; x++) + CHRBanks[x] = 0; + + for(x = 0; x < 3; x++) + PRGBanks[x] = x; + + Mirroring = 0; + lastA = 0; + lastmc = -1; + + setprg8(0xe000, ~0); + DoPRG(); + DoCHR(); + mira(); + + if(!info->battery) + memset(IRAM, 0xFF, 128); + + setprg8r(0x10, 0x6000, 0); +} + +int Mapper80_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x7ef0, 0x7eff, Mapper80_write); + + SetWriteHandler(0x7f00, 0x7fff, IRAM_Write); + SetReadHandler(0x7f00, 0x7fff, IRAM_Read); + + isfu = false; + + if(info->battery) + { + info->SaveGame[0] = IRAM; + info->SaveGameLen[0] = 128; + } + + return(1); +} + +int Mapper207_Init(CartInfo *info) +{ + Mapper80_Init(info); + isfu = true; + PPU_hook=Fudou_PPU; + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/82.cpp b/Mednafen/mednafen/nes/boards/82.cpp new file mode 100644 index 0000000000..fb5e712bfe --- /dev/null +++ b/Mednafen/mednafen/nes/boards/82.cpp @@ -0,0 +1,115 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 ctrl, CHRBanks[6], PRGBanks[3], WRAM[8192]; + +static void DoPRG(void) +{ + int x; + for(x = 0; x < 3; x++) + setprg8(0x8000 + 8192 * x, PRGBanks[x]); +} + +static void DoCHR(void) +{ + int x; + + setmirror(ctrl & 1); + + for(x=0;x<2;x++) + setchr2((x<<11)|((ctrl&2)<<11),CHRBanks[x]>>1); + for(x=0;x<4;x++) + setchr1((x<<10) | (((ctrl&2)^2)<<11),CHRBanks[2+x]); +} + +static DECLFW(Mapper82_write) +{ + if(A>=0x7EF0 && A<=0x7EF5) + { + CHRBanks[A - 0x7EF0]=V; + DoCHR(); + } + else + switch(A) + { + case 0x7ef6:ctrl=V&3; + DoCHR(); + break; + case 0x7efa:V>>=2;PRGBanks[0]=V;DoPRG();break; + case 0x7efb:V>>=2;PRGBanks[1]=V;DoPRG();break; + case 0x7efc:V>>=2;PRGBanks[2]=V;DoPRG();break; + } +} + +static void Power(CartInfo *info) +{ + int x; + + for(x = 0; x < 3; x++) + PRGBanks[x] = x; + ctrl = 0; + for(x = 0; x < 6; x++) + CHRBanks[x] = 0; + + setprg8(0xe000, 0xFF >> 2); + DoPRG(); + DoCHR(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(ctrl), + SFARRAY(CHRBanks, 6), + SFARRAY(PRGBanks, 3), + SFARRAY(WRAM, 8192), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + DoPRG(); + DoCHR(); + } + + return(ret); +} + +int Mapper82_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + /* external WRAM might end at $73FF */ + SetWriteHandler(0x7ef0,0x7efc,Mapper82_write); + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/8237.cpp b/Mednafen/mednafen/nes/boards/8237.cpp new file mode 100644 index 0000000000..fe7fedd94e --- /dev/null +++ b/Mednafen/mednafen/nes/boards/8237.cpp @@ -0,0 +1,165 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 cmdin; +static uint8 cmd; +static uint8 regs[8]; +static uint8 master,chrm; + +static int32 IRQCount,IRQa; + +static void DoPRG(void) +{ + if(master&0x80) + { + if(master&0x20) + { + setprg32(0x8000,(master&0xF)>>1); + } + else + { + setprg16(0x8000,master&0xF); + setprg16(0xC000,master&0xF); + } + } + else + { + setprg8(0xA000,regs[4]); + setprg8(0xE000,~0); + if(cmd&0x40) + { + setprg8(0xC000,regs[2]); + setprg8(0x8000,~1); + } + else + { + setprg8(0x8000,regs[2]); + setprg8(0xC000,~1); + } + } +} + +static void DoCHR(void) +{ + uint32 base=(cmd&0x80)<<5; + int orie=(chrm&0x4)<<6; + + setchr2(0x0000^base,(orie|regs[0])>>1); //K + setchr2(0x0800^base,(orie|regs[3])>>1); //43 + + setchr1(0x1000,orie|regs[1]); + setchr1(0x1400,orie|regs[5]); + setchr1(0x1800,orie|regs[6]); + setchr1(0x1c00,orie|regs[7]); +} + +static DECLFW(UNL8237Write) +{ + switch(A&0xF000) + { + case 0xf000:IRQCount=V;break; + case 0xE000:X6502_IRQEnd(MDFN_IQEXT);break; + } +// if(A<0x8000) +// printf("$%04x:$%02x, %d\n",A&0xFFFF,V,scanline); + if(A==0x5000) + { + master=V; + DoPRG(); + DoCHR(); + } + else if(A==0x5001) + { + chrm=V; + DoCHR(); + } + else + switch(A&0xE000) + { + case 0x8000:setmirror(((V|(V>>7))&1)^1);break; + case 0xa000:cmd=V;cmdin=1;DoPRG();DoCHR();break; + case 0xC000:if(!cmdin) break; + regs[cmd&7]=V; + DoPRG(); + DoCHR(); + cmdin=0; + break; + } +} + +static void UNL8237Reset(CartInfo *info) +{ + int x; + + for(x=0;x<8;x++) regs[x]=0; + master=chrm=cmd=cmdin=IRQCount=IRQa=0; + DoPRG(); + DoCHR(); +} + +static void hooko(void) +{ + if(IRQCount) + { + IRQCount--; + if(!IRQCount) + { + X6502_IRQBegin(MDFN_IQEXT); + //printf("IRQ: %d\n",scanline); + } + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYN(regs, 8, "REGS"), + SFVARN(IRQCount, "IRQC"), + SFVARN(IRQa, "IRQA"), + SFVARN(master, "MAST"), + SFVARN(chrm, "CHRM"), + SFVARN(cmd, "CMD"), + SFVARN(cmdin, "CMDI"), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + DoPRG(); + DoCHR(); + } + return(ret); +} + +int UNL8237_Init(CartInfo *info) +{ + GameHBIRQHook=hooko; + info->Power=UNL8237Reset; + info->StateAction = StateAction; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x5000,0xFFFF,UNL8237Write); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/86.cpp b/Mednafen/mednafen/nes/boards/86.cpp new file mode 100644 index 0000000000..d910a48e5e --- /dev/null +++ b/Mednafen/mednafen/nes/boards/86.cpp @@ -0,0 +1,65 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; +static void Sync(void) +{ + setchr8((latch&3)|((latch>>4)&4)); + setprg32(0x8000, (latch >> 4) & 3); +} + +static DECLFW(Mapper86_write) +{ + if(A>=0x6000 && A<=0x6fFF) + { + latch = V; + Sync(); + } +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper86_Init(CartInfo *info) +{ + info->StateAction = StateAction; + info->Power = Power; + SetWriteHandler(0x6000,0x6fff,Mapper86_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/87.cpp b/Mednafen/mednafen/nes/boards/87.cpp new file mode 100644 index 0000000000..3ad31f5ea6 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/87.cpp @@ -0,0 +1,45 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setchr8(latch); +} + +static DECLFW(Mapper87_write) +{ + latch = V >> 1; + Sync(); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setprg32(0x8000, 0); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper87_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x6000,0x7fff,Mapper87_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/88.cpp b/Mednafen/mednafen/nes/boards/88.cpp new file mode 100644 index 0000000000..9c319410f0 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/88.cpp @@ -0,0 +1,98 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static int mn; +static uint8 cmd, regs[8]; + +static void Sync(void) +{ + if(mn) + { + setmirror(((cmd >> 6) & 1) ? MI_1 : MI_0); + } + setchr2(0x0000, (regs[0] & 0x3E) >> 1); + setchr2(0x0800, (regs[1] & 0x3E) >> 1); + setchr1(0x1000, (regs[2] & 0x3F) | 0x40); + setchr1(0x1400, (regs[3] & 0x3F) | 0x40); + setchr1(0x1800, (regs[4] & 0x3F) | 0x40); + setchr1(0x1c00, (regs[5] & 0x3F) | 0x40); + setprg8(0x8000, regs[6]); + setprg8(0xa000, regs[7]); +} + +static DECLFW(Mapper88_write) +{ + switch(A&0x8001) + { + case 0x8000:cmd = V; + Sync(); + break; + case 0x8001:regs[cmd & 0x7] = V;Sync();break; + } +} + +static void Power(CartInfo *info) +{ + cmd = 0; + int x; + for(x = 0; x < 8; x++) + regs[x] = ~0; + + setprg16(0xc000, ~0); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(cmd), + SFARRAY(regs, 8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper88_Init(CartInfo *info) +{ + mn=0; + SetWriteHandler(0x8000,0xffff,Mapper88_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + return(1); +} + +int Mapper154_Init(CartInfo *info) +{ + mn=1; + SetWriteHandler(0x8000,0xffff,Mapper88_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->Power = Power; + info->StateAction = StateAction; + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/89.cpp b/Mednafen/mednafen/nes/boards/89.cpp new file mode 100644 index 0000000000..f3960ce968 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/89.cpp @@ -0,0 +1,66 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setchr8((latch&7)|((latch>>4)&8)); + setprg16(0x8000,(latch>>4)&7); + setmirror(((latch >> 3) & 1) ? MI_1 : MI_0); +} + +static DECLFW(Mapper89_write) +{ + latch = V; + Sync(); +} +static void Power(CartInfo *info) +{ + latch = 0; + setprg16(0xc000, 0x7); + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret= MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper89_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper89_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/90.cpp b/Mednafen/mednafen/nes/boards/90.cpp new file mode 100644 index 0000000000..e177de2fc9 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/90.cpp @@ -0,0 +1,358 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static int is209; + +static uint8 IRQMode; // from $c001 +static uint8 IRQPre; // from $c004 +static uint8 IRQPreSize; // from $c007 +static uint8 IRQCount; // from $c005 +static uint8 IRQXOR; // Loaded from $C006 +static uint8 IRQa; // $c002, $c003, and $c000 + +static uint8 mul[2]; +static uint8 regie; + +static uint8 tkcom[4]; +static uint8 prgb[4]; +static uint8 chrlow[8]; +static uint8 chrhigh[8]; + +static uint16 names[4]; +static uint8 tekker; + +static DECLFR(tekread) +{ + //MDFN_printf("READ READ READ: $%04x, $%04x\n",A,X.PC); + switch(A) + { + case 0x5000:return(tekker); + case 0x5800:return(mul[0]*mul[1]); + case 0x5801:return((mul[0]*mul[1])>>8); + case 0x5803:return(regie); + default:break; + } + return(X.DB); +} + +static void mira(void) +{ + if(tkcom[0]&0x20 && is209) + { + int x; + if(tkcom[0] & 0x40) // Name tables are ROM-only + { + for(x=0;x<4;x++) + setntamem(CHRptr[0]+(((names[x])&CHRmask1[0])<<10), 0, x); + } + else // Name tables can be RAM or ROM. + { + for(x=0;x<4;x++) + { + if((tkcom[2]&0x80) == (names[x]&0x80)) // RAM selected. + setntamem(NTARAM + ((names[x]&0x1)<<10),1,x); + else + setntamem(CHRptr[0]+(((names[x])&CHRmask1[0])<<10), 0, x); + } + } + } + else + { + switch(tkcom[1]&3){ + case 0:setmirror(MI_V);break; + case 1:setmirror(MI_H);break; + case 2:setmirror(MI_0);break; + case 3:setmirror(MI_1);break; + } + } +} + +static void tekprom(void) +{ + switch(tkcom[0]&3) + { + case 1: // 16 KB + setprg16(0x8000,prgb[0]); + setprg16(0xC000,prgb[2]); + break; + case 2: //2 = 8 KB ?? + if(tkcom[0]&0x4) + { + setprg8(0x8000,prgb[0]); + setprg8(0xa000,prgb[1]); + setprg8(0xc000,prgb[2]); + setprg8(0xe000,prgb[3]); + } + else + { + if(tkcom[0]&0x80) + setprg8(0x6000,prgb[3]); + setprg8(0x8000,prgb[0]); + setprg8(0xa000,prgb[1]); + setprg8(0xc000,prgb[2]); + setprg8(0xe000,~0); + } + break; + case 0: + case 3: + setprg8(0x8000,prgb[0]); + setprg8(0xa000,prgb[1]); + setprg8(0xc000,prgb[2]); + setprg8(0xe000,prgb[3]); + break; + } +} + +static void tekvrom(void) +{ + int x; + + switch(tkcom[0]&0x18) + { + case 0x00: // 8KB + setchr8(chrlow[0]|(chrhigh[0]<<8)); + break; + case 0x08: // 4KB + for(x=0;x<8;x+=4) + setchr4(x<<10,chrlow[x]|(chrhigh[x]<<8)); + break; + case 0x10: // 2KB + for(x=0;x<8;x+=2) + setchr2(x<<10,chrlow[x]|(chrhigh[x]<<8)); + break; + case 0x18: // 1KB + for(x=0;x<8;x++) + setchr1(x<<10,(chrlow[x]|(chrhigh[x]<<8))); + break; + } +} + +static DECLFW(Mapper90_write) +{ + //printf("$%04x:$%02x\n",A,V); + + if(A==0x5800) mul[0]=V; + else if(A==0x5801) mul[1]=V; + else if(A==0x5803) regie=V; + + + //if(A>=0xc000 && A<=0xc007) + // MDFN_printf("$%04x:$%02x $%04x, %d, %d\n",A,V,X.PC,scanline,timestamp); + + A&=0xF007; + if(A>=0x8000 && A<=0x8003) + { + prgb[A&3]=V; + tekprom(); + } + else if(A>=0x9000 && A<=0x9007) + { + chrlow[A&7]=V; + tekvrom(); + } + else if(A>=0xa000 && A<=0xa007) + { + chrhigh[A&7]=V; + tekvrom(); + } + else if(A>=0xb000 && A<=0xb007) + { + //printf("$%04x:$%02x\n",A,V); + if(A&4) + { + names[A&3]&=0x00FF; + names[A&3]|=V<<8; + } + else + { + names[A&3]&=0xFF00; + names[A&3]|=V; + } + mira(); + } + else if(A>=0xd000 && A<=0xdfff) + { + tkcom[A&3]=V; + tekprom(); + tekvrom(); + mira(); + } + else switch(A) + { + case 0xc000: IRQa=V&1;if(!(V&1)) X6502_IRQEnd(MDFN_IQEXT);break; + case 0xc002: IRQa=0;X6502_IRQEnd(MDFN_IQEXT);break; + case 0xc003: IRQa=1;break; + + case 0xc001: IRQMode=V;break; + case 0xc004: IRQPre=V^IRQXOR;break; + case 0xc005: IRQCount=V^IRQXOR;break; + case 0xc006: IRQXOR=V;break; + case 0xc007: IRQPreSize=V;break; + } + +} + +static void CCL(void) +{ + if((IRQMode>>6) == 1) // Count Up + { + IRQCount++; + if((IRQCount == 0) && IRQa) + X6502_IRQBegin(MDFN_IQEXT); + } + else if((IRQMode>>6) == 2) // Count down + { + IRQCount--; + if((IRQCount == 0xFF) && IRQa) + X6502_IRQBegin(MDFN_IQEXT); + } +} + +static void ClockCounter(void) +{ + uint8 premask; + + if(IRQMode & 0x4) premask = 0x7; + else premask = 0xFF; + + if((IRQMode>>6) == 1) // Count up + { + IRQPre++; + + if((IRQPre & premask) == 0) + CCL(); + } + else if((IRQMode>>6) == 2) // Count down + { + IRQPre--; + //printf("%d\n",IRQPre); + if((IRQPre & premask) == premask) + CCL(); + } +} + +static void SLWrap(void) +{ + int x; + for(x=0;x<8;x++) ClockCounter(); // 8 PPU A10 0->1 transitions per scanline(usually) +} +/* +static uint32 lasta; +static void YARGH(uint32 A) +{ + if((A&0x1000) && !(lasta & 0x1000)) + ClockCounter(); + + lasta = A; +} +*/ + +static void togglie(CartInfo *info) +{ + tekker^=0xFF; +} + +static void M90Power(CartInfo *info) +{ + mul[0]=mul[1]=regie=0xFF; + + tkcom[0]=tkcom[1]=tkcom[2]=tkcom[3]=0xFF; + + memset(prgb,0xff,sizeof(prgb)); + memset(chrlow,0xff,sizeof(chrlow)); + memset(chrhigh,0xff,sizeof(chrhigh)); + memset(names,0x00,sizeof(names)); + + tekker=0; + + prgb[0]=0xFF; + prgb[1]=0xFF; + prgb[2]=0xFF; + prgb[3]=0xFF; + tekprom(); + tekvrom(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[]={ + SFVARN(IRQCount, "IRQC"), + SFVARN(IRQa, "IRQa"), + SFARRAYN(mul, 2, "MUL"), + SFVARN(regie, "REGI"), + SFARRAYN(tkcom, 4, "TKCO"), + SFARRAYN(prgb, 4, "PRGB"), + SFARRAYN(chrlow, 4, "CHRL"), + SFARRAYN(chrhigh, 8, "CHRH"), + SFVARN(names[0], "NMS0"), + SFVARN(names[1], "NMS1"), + SFVARN(names[2], "NMS2"), + SFVARN(names[3], "NMS3"), + SFVARN(tekker, "TEKR"), + SFEND +}; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + tekprom(); + tekvrom(); + mira(); + } + + return(ret); +} + +int Mapper90_Init(CartInfo *info) +{ + is209=0; + info->Reset=togglie; + info->Power=M90Power; + //PPU_hook = YARGH; + info->StateAction = StateAction; + GameHBIRQHook2 = SLWrap; + + SetWriteHandler(0x5000,0xffff,Mapper90_write); + SetReadHandler(0x5000,0x5fff,tekread); + + SetReadHandler(0x6000,0xffff,CartBR); + + return(1); +} + +int Mapper209_Init(CartInfo *info) +{ + is209=1; + info->Reset=togglie; + info->Power=M90Power; + //PPU_hook = YARGH; + GameHBIRQHook2 = SLWrap; + info->StateAction = StateAction; + + SetWriteHandler(0x5000,0xffff,Mapper90_write); + SetReadHandler(0x5000,0x5fff,tekread); + + SetReadHandler(0x6000,0xffff,CartBR); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/92.cpp b/Mednafen/mednafen/nes/boards/92.cpp new file mode 100644 index 0000000000..daead3381b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/92.cpp @@ -0,0 +1,80 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +/* Original code provided by LULU */ +static uint8 PRGBank16, CHRBank8; + +static void Sync(void) +{ + setprg16(0xc000, PRGBank16); + setchr8(CHRBank8); +} + +static DECLFW(Mapper92_write) +{ + uint8 reg=(A&0xF0)>>4; + uint8 bank=A&0xF; + + if(A>=0x9000) + { + if(reg==0xD) PRGBank16 = bank; + else if(reg==0xE) CHRBank8 = bank; + } + else + { + if(reg==0xB) PRGBank16 = bank; + else if(reg==0x7) CHRBank8 = bank; + } + Sync(); +} + +static void Power(CartInfo *info) +{ + PRGBank16 = 0xFF; + CHRBank8 = 0; + Sync(); + setprg16(0x8000, 0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PRGBank16), SFVAR(CHRBank8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + + return(ret); +} + +int Mapper92_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x8000,0xFFFF,Mapper92_write); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/93.cpp b/Mednafen/mednafen/nes/boards/93.cpp new file mode 100644 index 0000000000..7df6e9c466 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/93.cpp @@ -0,0 +1,48 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setmirror((latch & 1) ? MI_H : MI_V); + setchr8(latch & 0xF); + setprg16(0x8000, (latch >> 4)); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setchr8(0); + setprg16(0xc000, 0xF); + Sync(); +} + + +static DECLFW(Write) +{ + latch = V; + Sync(); +} + +int Mapper93_Init(CartInfo *info) +{ + SetWriteHandler(0x8000, 0xFFFF, Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->StateAction = StateAction; + info->Power = Power; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/94.cpp b/Mednafen/mednafen/nes/boards/94.cpp new file mode 100644 index 0000000000..788bdc4f02 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/94.cpp @@ -0,0 +1,46 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg16(0x8000, latch >> 2); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + latch = 0; + setchr8(0); + setprg16(0xc000, 0x3F); + Sync(); +} + + +static DECLFW(Write) +{ + latch = V & CartBR(A); + Sync(); +} + +int Mapper94_Init(CartInfo *info) +{ + SetWriteHandler(0x8000, 0xFFFF, Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->StateAction = StateAction; + info->Power = Power; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/95.cpp b/Mednafen/mednafen/nes/boards/95.cpp new file mode 100644 index 0000000000..bd49321696 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/95.cpp @@ -0,0 +1,146 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 lastA; +static uint8 DRegs[8]; +static uint8 cmd; +static uint8 MirCache[8]; +static int32 lastmc; + +static void dragonbust_ppu(uint32 A) +{ + static uint8 z; + + if(A>=0x2000) return; + + A>>=10; + + lastA=A; + + z=MirCache[A]; + if(z!=lastmc) + { + setmirror(z?MI_1:MI_0); + lastmc = z; + } +} + +static void toot(void) +{ + int x; + + MirCache[0]=MirCache[1]=(DRegs[0]>>4)&1; + MirCache[2]=MirCache[3]=(DRegs[1]>>4)&1; + + for(x=0;x<4;x++) + MirCache[4+x]=(DRegs[2+x]>>5)&1; + setmirror(MirCache[lastA]?MI_1:MI_0); +} + +static DECLFW(Mapper95_write) +{ + switch(A&0xF001) + { + + case 0x8000: + cmd = V; + break; + + case 0x8001: + switch(cmd&0x07) + { + case 0: DRegs[0]=(V&0x3F)>>1;toot();V>>=1;setchr2(0x0000,V&0x1F);break; + case 1: DRegs[1]=(V&0x3F)>>1;toot();V>>=1;setchr2(0x0800,V&0x1F);break; + case 2: DRegs[2]=V&0x3F;toot();setchr1(0x1000,V&0x1F); break; + case 3: DRegs[3]=V&0x3F;toot();setchr1(0x1400,V&0x1F); break; + case 4: DRegs[4]=V&0x3F;toot();setchr1(0x1800,V&0x1F); break; + case 5: DRegs[5]=V&0x3F;toot();setchr1(0x1C00,V&0x1F); break; + case 6: DRegs[6]=V&0x3F; + setprg8(0x8000,V); + break; + case 7: DRegs[7]=V&0x3F; + setprg8(0xA000,V); + break; + } + break; + } +} + +static void DBSync() +{ + int x; + + setchr2(0x0000,DRegs[0]); + setchr2(0x0800,DRegs[1]); + + for(x=0;x<4;x++) + setchr1(0x1000+x*0x400,DRegs[2+x]); + + setprg8(0x8000,DRegs[6]); + setprg8(0xa000,DRegs[7]); + toot(); +} + +static void DBPower(CartInfo *info) +{ + lastmc = -1; + + memset(DRegs,0x3F,8); + DRegs[0]=DRegs[1]=0x1F; + + DBSync(); + + setprg8(0xc000,0x3E); + setprg8(0xe000,0x3F); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[]={ + SFARRAYN(DRegs, 8, "DREG"), + SFVARN(cmd, "CMD"), + SFVARN(lastA, "LAST"), + SFVAR(lastmc), + SFEND + }; + + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + DBSync(); + + return(ret); +} + +int Mapper95_Init(CartInfo *info) +{ + info->Power=DBPower; + info->StateAction = StateAction; + PPU_hook = dragonbust_ppu; + + SetReadHandler(0x8000,0xffff,CartBR); + SetWriteHandler(0x8000,0xffff,Mapper95_write); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/96.cpp b/Mednafen/mednafen/nes/boards/96.cpp new file mode 100644 index 0000000000..45fe05f572 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/96.cpp @@ -0,0 +1,81 @@ +#include "mapinc.h" + +/* I might want to add some code to the mapper 96 PPU hook function + to not change CHR banks if the attribute table is being accessed, + if I make emulation a little more accurate in the future. +*/ +static uint8 latche; +static uint8 M96LA; +static uint8 *M96_CHR = NULL; + +static DECLFW(Mapper96_write) +{ + latche=V; + setprg32(0x8000,V&3); + setchr4r(0x10,0x0000,(latche&4)|M96LA); + setchr4r(0x10,0x1000,(latche&4)|3); +} + +static void M96Hook(uint32 A) +{ + if((A&0x3000)!=0x2000) return; + //if((A&0x3ff)>=0x3c0) return; + M96LA=(A>>8)&3; + setchr4r(0x10,0x0000,(latche&4)|M96LA); +} + +static void M96Sync(void) +{ + setprg32(0x8000,latche&3); + setchr4r(0x10,0x0000,(latche&4)|M96LA); + setchr4r(0x10,0x1000,(latche&4)|3); +} + +static int M96_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[]= + { + SFVARN(latche, "LATC"), + SFVARN(M96LA, "LAVA"), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + M96Sync(); + + return(ret); +} + +static void Mapper96_Close(void) +{ + if(M96_CHR) + free(M96_CHR); + M96_CHR = NULL; +} + +static void Mapper96_Reset(CartInfo *info) +{ + latche = 0; + M96LA = 0; + M96Sync(); +} + +int Mapper96_Init(CartInfo *info) +{ + if(!(M96_CHR = (uint8 *)malloc(32768))) + return(0); + + SetWriteHandler(0x8000, 0xffff, Mapper96_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + PPU_hook = M96Hook; + info->StateAction = M96_StateAction; + info->Close = Mapper96_Close; + info->Power = Mapper96_Reset; + SetupCartCHRMapping(0x10, M96_CHR, 32768, 1); + latche=M96LA=0; + setmirror(MI_0); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/97.cpp b/Mednafen/mednafen/nes/boards/97.cpp new file mode 100644 index 0000000000..3a2f0f4948 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/97.cpp @@ -0,0 +1,80 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; +static void Sync(void) +{ + setprg16(0xC000, latch & 0xF); + + /* +switch(V>>6) + { + case 0:break; + case 1:MIRROR_SET2(0);break; + case 2:MIRROR_SET2(1);break; + case 3:break; + } + */ +} + +static DECLFW(Mapper97_write) +{ + latch = V; +switch(V>>6) + { + case 0:break; + case 1:setmirror(MI_H);break; + case 2:setmirror(MI_V);break; + case 3:break; + } + + Sync(); +} + +static void Power(CartInfo *info) +{ + setprg16(0x8000, 0xF); + setchr8(0); + latch = 0xFF; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { SFVAR(latch), SFEND }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper97_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetWriteHandler(0x8000,0xffff,Mapper97_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/99.cpp b/Mednafen/mednafen/nes/boards/99.cpp new file mode 100644 index 0000000000..505f695c01 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/99.cpp @@ -0,0 +1,67 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setchr8((latch >> 2) & 1); + setprg8(0x8000, latch & 0x4); +} + +static DECLFW(Write) +{ + latch = V; + Sync(); +} + +static void Power(CartInfo *info) +{ + setprg32(0x8000, 0); + + latch = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int Mapper99_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x4016, 0x4016, Write); // Warning: relies on kludge in input.cpp + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/Makefile.am.inc b/Mednafen/mednafen/nes/boards/Makefile.am.inc new file mode 100755 index 0000000000..b3d66b2c27 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/Makefile.am.inc @@ -0,0 +1,8 @@ +libnes_a_SOURCES += boards/8237.cpp boards/h2288.cpp boards/simple.cpp boards/super24.cpp boards/mmc2and4.cpp boards/vrc6.cpp boards/emu2413.cpp boards/vrc7.cpp boards/96.cpp boards/208.cpp boards/187.cpp boards/95.cpp boards/fme7.cpp boards/mmc5.cpp boards/mmc3.cpp boards/mmc1.cpp boards/tengen.cpp boards/90.cpp boards/deirom.cpp boards/n106.cpp boards/maxicart.cpp +libnes_a_SOURCES += boards/112.cpp boards/113.cpp boards/114.cpp boards/117.cpp boards/22.cpp boards/23.cpp boards/25.cpp boards/67.cpp boards/68.cpp boards/16.cpp boards/97.cpp boards/99.cpp boards/151.cpp boards/180.cpp boards/182.cpp boards/184.cpp +libnes_a_SOURCES += boards/88.cpp boards/89.cpp boards/92.cpp boards/86.cpp boards/82.cpp boards/80.cpp boards/18.cpp boards/21.cpp boards/228.cpp boards/234.cpp boards/232.cpp +libnes_a_SOURCES += boards/42.cpp boards/ffe.cpp boards/65.cpp boards/nina06.cpp boards/73.cpp boards/32.cpp boards/33.cpp boards/41.cpp boards/46.cpp boards/72.cpp boards/75.cpp boards/76.cpp boards/77.cpp boards/colordreams.cpp +libnes_a_SOURCES += boards/140.cpp boards/93.cpp boards/94.cpp boards/malee.cpp boards/156.cpp boards/supervision.cpp boards/novel.cpp boards/242.cpp boards/246.cpp boards/248.cpp boards/15.cpp boards/8.cpp boards/193.cpp boards/189.cpp +libnes_a_SOURCES += boards/244.cpp boards/sachen.cpp boards/107.cpp boards/51.cpp boards/152.cpp boards/70.cpp boards/185.cpp boards/78.cpp boards/87.cpp boards/34.cpp boards/222.cpp boards/codemasters.cpp boards/38.cpp + +libnes_a_SOURCES += boards/240.cpp boards/241.cpp boards/163.cpp diff --git a/Mednafen/mednafen/nes/boards/codemasters.cpp b/Mednafen/mednafen/nes/boards/codemasters.cpp new file mode 100644 index 0000000000..74459d922c --- /dev/null +++ b/Mednafen/mednafen/nes/boards/codemasters.cpp @@ -0,0 +1,93 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 PRGBank16, Mirroring; +static int isbf9097; + +static void Sync(void) +{ + setprg16(0x8000, PRGBank16 & 0xF); + if(isbf9097) + setmirror(Mirroring?MI_1:MI_0); +} + +static DECLFW(WriteHi) +{ + PRGBank16 = V; + Sync(); +} + +static DECLFW(WriteLo) +{ + Mirroring = (V >> 4) & 1; + Sync(); +} + +static void Power(CartInfo *info) +{ + Mirroring = 0; + PRGBank16 = 0; + Sync(); + setchr8(0); + setprg16(0xc000, 0xF); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PRGBank16), + SFVAR(Mirroring), // Only for firehawk, though + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + Sync(); + + return(ret); +} + +int Mapper71_Init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetWriteHandler(0xC000, 0xFFFF, WriteHi); + + isbf9097 = 0; + + return(1); +} + +int BIC62_Init(CartInfo *info) +{ + Mapper71_Init(info); + + SetWriteHandler(0x8000, 0xBFFF, WriteLo); + isbf9097 = 1; + PRGmask16[0] &= 0x7; + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/colordreams.cpp b/Mednafen/mednafen/nes/boards/colordreams.cpp new file mode 100644 index 0000000000..c914291e28 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/colordreams.cpp @@ -0,0 +1,60 @@ +#include "mapinc.h" + +static uint8 latch; + +static void Sync(void) +{ + setprg32(0x8000, latch & 3); + setchr8((latch >> 4) & 0xF); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); +} + + +static DECLFW(Write) +{ + latch = V & CartBR(A); + Sync(); +} + +static DECLFW(Write50282) +{ + latch = (V & 0xFE & CartBR(A)) | (CartBR(A) & 1); + Sync(); +} + +int Mapper11_Init(CartInfo *info) +{ + SetWriteHandler(0x8000, 0xFFFF, Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->StateAction = StateAction; + info->Power = Power; + return(1); +} + +int AGCI50282_Init(CartInfo *info) +{ + SetWriteHandler(0x8000, 0xFFFF, Write50282); + SetReadHandler(0x8000, 0xFFFF, CartBR); + info->StateAction = StateAction; + info->Power = Power; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/deirom.cpp b/Mednafen/mednafen/nes/boards/deirom.cpp new file mode 100644 index 0000000000..3387a26442 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/deirom.cpp @@ -0,0 +1,89 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 cmd; +static uint8 DRegs[8]; + +static void Sync(void) +{ + int x; + + setchr2(0x0000,DRegs[0]); + setchr2(0x0800,DRegs[1]); + for(x=0;x<4;x++) + setchr1(0x1000+(x<<10),DRegs[2+x]); + setprg8(0x8000,DRegs[6]); + setprg8(0xa000,DRegs[7]); +} + +static DECLFW(DEIWrite) +{ + switch(A&0x8001) + { + case 0x8000:cmd=V&0x07;break; + case 0x8001:if(cmd<=0x05) V&=0x3F; + else V&=0x0F; + if(cmd<=0x01) V>>=1; + DRegs[cmd&0x07]=V; + Sync(); + break; + } +} + +static void DEIPower(CartInfo *info) +{ + setprg8(0xc000,0xE); + setprg8(0xe000,0xF); + cmd=0; + memset(DRegs,0,8); + Sync(); +} + + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[]= + { + SFVAR(cmd), + SFARRAY(DRegs, 8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + return(ret); +} + +int DEIROM_Init(CartInfo *info) +{ + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xFFFF,DEIWrite); + info->Power=DEIPower; + info->StateAction = StateAction; + return(1); +} + +int Mapper206_Init(CartInfo *info) +{ + return(DEIROM_Init(info)); +} diff --git a/Mednafen/mednafen/nes/boards/emu2413.cpp b/Mednafen/mednafen/nes/boards/emu2413.cpp new file mode 100644 index 0000000000..c6fe70cb1b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/emu2413.cpp @@ -0,0 +1,1138 @@ +/* +Permission is granted to anyone to use this software for any purpose, +including commercial applications. To alter this software and redistribute it freely, +if the origin of this software is not misrepresented. +*/ + +/* This software has been heavily modified for VRC7. To get a stock YM2413 emulator, download + MSXplug. +*/ + +/*********************************************************************************** + + emu2413.c -- YM2413 emulator written by Mitsutaka Okazaki 2001 + + 2001 01-08 : Version 0.10 -- 1st version. + 2001 01-15 : Version 0.20 -- semi-public version. + 2001 01-16 : Version 0.30 -- 1st public version. + 2001 01-17 : Version 0.31 -- Fixed bassdrum problem. + : Version 0.32 -- LPF implemented. + 2001 01-18 : Version 0.33 -- Fixed the drum problem, refine the mix-down method. + -- Fixed the LFO bug. + 2001 01-24 : Version 0.35 -- Fixed the drum problem, + support undocumented EG behavior. + 2001 02-02 : Version 0.38 -- Improved the performance. + Fixed the hi-hat and cymbal model. + Fixed the default percussive datas. + Noise reduction. + Fixed the feedback problem. + 2001 03-03 : Version 0.39 -- Fixed some drum bugs. + Improved the performance. + 2001 03-04 : Version 0.40 -- Improved the feedback. + Change the default table size. + Clock and Rate can be changed during play. + 2001 06-24 : Version 0.50 -- Improved the hi-hat and the cymbal tone. + Added VRC7 patch (OPLL_reset_patch is changed). + Fixed OPLL_reset() bug. + Added OPLL_setMask, OPLL_getMask and OPLL_toggleMask. + Added OPLL_writeIO. + 2001 09-28 : Version 0.51 -- Removed the noise table. + 2002 01-28 : Version 0.52 -- Added Stereo mode. + 2002 02-07 : Version 0.53 -- Fixed some drum bugs. + 2002 02-20 : Version 0.54 -- Added the best quality mode. + 2002 03-02 : Version 0.55 -- Removed OPLL_init & OPLL_close. + 2002 05-30 : Version 0.60 -- Fixed HH&CYM generator and all voice datas. + + 2004 01-24 : Modified by xodnizel to remove code not needed for the VRC7, among other things. + + References: + fmopl.c -- 1999,2000 written by Tatsuyuki Satoh (MAME development). + fmopl.c(fixed) -- (C) 2002 Jarek Burczynski. + s_opl.c -- 2001 written by Mamiya (NEZplug development). + fmgen.cpp -- 1999,2000 written by cisc. + fmpac.ill -- 2000 created by NARUTO. + MSX-Datapack + YMU757 data sheet + YM2143 data sheet + +**************************************************************************************/ +#include +#include +#include +#include +#include "emu2413.h" + +static const unsigned char default_inst[15][8] = { + #include "vrc7tone.h" +}; + +#define EG2DB(d) ((d)*(e_int32)(EG_STEP/DB_STEP)) +#define TL2EG(d) ((d)*(e_int32)(TL_STEP/EG_STEP)) +#define SL2EG(d) ((d)*(e_int32)(SL_STEP/EG_STEP)) + +#define DB_POS(x) (e_uint32)((x)/DB_STEP) +#define DB_NEG(x) (e_uint32)(DB_MUTE+DB_MUTE+(x)/DB_STEP) + +/* Bits for liner value */ +#define DB2LIN_AMP_BITS 11 +#define SLOT_AMP_BITS (DB2LIN_AMP_BITS) + +/* Bits for envelope phase incremental counter */ +#define EG_DP_BITS 22 +#define EG_DP_WIDTH (1<>(b)) + +/* Leave the lower b bit(s). */ +#define LOWBITS(c,b) ((c)&((1<<(b))-1)) + +/* Expand x which is s bits to d bits. */ +#define EXPAND_BITS(x,s,d) ((x)<<((d)-(s))) + +/* Expand x which is s bits to d bits and fill expanded bits '1' */ +#define EXPAND_BITS_X(x,s,d) (((x)<<((d)-(s)))|((1<<((d)-(s)))-1)) + +#define MOD(o,x) (&(o)->slot[(x)<<1]) +#define CAR(o,x) (&(o)->slot[((x)<<1)|1]) + +#define BIT(s,b) (((s)>>(b))&1) + +/* Definition of envelope mode */ +enum +{ SETTLE, ATTACK, DECAY, SUSHOLD, SUSTINE, RELEASE, FINISH }; + +/*************************************************** + + Create tables + +****************************************************/ +INLINE static e_int32 Min (e_int32 i, e_int32 j) +{ + if (i < j) + return i; + else + return j; +} + +/* Table for AR to LogCurve. */ +static void makeAdjustTable (OPLL * opll) +{ + e_int32 i; + + opll->AR_ADJUST_TABLE[0] = (1 << EG_BITS); + for (i = 1; i < 128; i++) + opll->AR_ADJUST_TABLE[i] = (e_uint16) ((double) (1 << EG_BITS) - 1 - (1 << EG_BITS) * log (i) / log (128)); +} + + +/* Table for dB(0 -- (1<DB2LIN_TABLE[i] = (e_int16) ((double) ((1 << DB2LIN_AMP_BITS) - 1) * pow (10, -(double) i * DB_STEP / 20)); + if (i >= DB_MUTE) opll->DB2LIN_TABLE[i] = 0; + //printf("%d\n",DB2LIN_TABLE[i]); + opll->DB2LIN_TABLE[i + DB_MUTE + DB_MUTE] = (e_int16) (-opll->DB2LIN_TABLE[i]); + } +} + +/* Liner(+0.0 - +1.0) to dB((1<fullsintable[i] = (e_uint32) lin2db (sin (2.0 * PI * i / PG_WIDTH) ); + } + + for (i = 0; i < PG_WIDTH / 4; i++) + { + opll->fullsintable[PG_WIDTH / 2 - 1 - i] = opll->fullsintable[i]; + } + + for (i = 0; i < PG_WIDTH / 2; i++) + { + opll->fullsintable[PG_WIDTH / 2 + i] = (e_uint32) (DB_MUTE + DB_MUTE + opll->fullsintable[i]); + } + + for (i = 0; i < PG_WIDTH / 2; i++) + opll->halfsintable[i] = opll->fullsintable[i]; + for (i = PG_WIDTH / 2; i < PG_WIDTH; i++) + opll->halfsintable[i] = opll->fullsintable[0]; +} + +/* Table for Pitch Modulator */ +static void makePmTable (OPLL * opll) +{ + e_int32 i; + + for (i = 0; i < PM_PG_WIDTH; i++) + opll->pmtable[i] = (e_int32) ((double) PM_AMP * pow (2, (double) PM_DEPTH * sin (2.0 * PI * i / PM_PG_WIDTH) / 1200)); +} + +/* Table for Amp Modulator */ +static void makeAmTable (OPLL * opll) +{ + e_int32 i; + + for (i = 0; i < AM_PG_WIDTH; i++) + opll->amtable[i] = (e_int32) ((double) AM_DEPTH / 2 / DB_STEP * (1.0 + sin (2.0 * PI * i / PM_PG_WIDTH))); +} + +/* Phase increment counter table */ +static void makeDphaseTable (OPLL * opll) +{ + e_uint32 fnum, block, ML; + e_uint32 mltable[16] = + { 1, 1 * 2, 2 * 2, 3 * 2, 4 * 2, 5 * 2, 6 * 2, 7 * 2, 8 * 2, 9 * 2, 10 * 2, 10 * 2, 12 * 2, 12 * 2, 15 * 2, 15 * 2 }; + + for (fnum = 0; fnum < 512; fnum++) + for (block = 0; block < 8; block++) + for (ML = 0; ML < 16; ML++) + opll->dphaseTable[fnum][block][ML] = (((fnum * mltable[ML]) << block) >> (20 - DP_BITS)); +} + +static void makeTllTable (OPLL *opll) +{ +#define dB2(x) ((x)*2) + + static const double kltable[16] = { + dB2 (0.000), dB2 (9.000), dB2 (12.000), dB2 (13.875), dB2 (15.000), dB2 (16.125), dB2 (16.875), dB2 (17.625), + dB2 (18.000), dB2 (18.750), dB2 (19.125), dB2 (19.500), dB2 (19.875), dB2 (20.250), dB2 (20.625), dB2 (21.000) + }; + + e_int32 tmp; + e_int32 fnum, block, TL, KL; + + for (fnum = 0; fnum < 16; fnum++) + for (block = 0; block < 8; block++) + for (TL = 0; TL < 64; TL++) + for (KL = 0; KL < 4; KL++) + { + if (KL == 0) + { + opll->tllTable[fnum][block][TL][KL] = TL2EG (TL); + } + else + { + tmp = (e_int32) (kltable[fnum] - dB2 (3.000) * (7 - block)); + if (tmp <= 0) + opll->tllTable[fnum][block][TL][KL] = TL2EG (TL); + else + opll->tllTable[fnum][block][TL][KL] = (e_uint32) ((tmp >> (3 - KL)) / EG_STEP) + TL2EG (TL); + } + } +} + +#ifdef USE_SPEC_ENV_SPEED +static const double attacktime[16][4] = { + {0, 0, 0, 0}, + {1730.15, 1400.60, 1153.43, 988.66}, + {865.08, 700.30, 576.72, 494.33}, + {432.54, 350.15, 288.36, 247.16}, + {216.27, 175.07, 144.18, 123.58}, + {108.13, 87.54, 72.09, 61.79}, + {54.07, 43.77, 36.04, 30.90}, + {27.03, 21.88, 18.02, 15.45}, + {13.52, 10.94, 9.01, 7.72}, + {6.76, 5.47, 4.51, 3.86}, + {3.38, 2.74, 2.25, 1.93}, + {1.69, 1.37, 1.13, 0.97}, + {0.84, 0.70, 0.60, 0.54}, + {0.50, 0.42, 0.34, 0.30}, + {0.28, 0.22, 0.18, 0.14}, + {0.00, 0.00, 0.00, 0.00} +}; + +static const double decaytime[16][4] = { + {0, 0, 0, 0}, + {20926.60, 16807.20, 14006.00, 12028.60}, + {10463.30, 8403.58, 7002.98, 6014.32}, + {5231.64, 4201.79, 3501.49, 3007.16}, + {2615.82, 2100.89, 1750.75, 1503.58}, + {1307.91, 1050.45, 875.37, 751.79}, + {653.95, 525.22, 437.69, 375.90}, + {326.98, 262.61, 218.84, 187.95}, + {163.49, 131.31, 109.42, 93.97}, + {81.74, 65.65, 54.71, 46.99}, + {40.87, 32.83, 27.36, 23.49}, + {20.44, 16.41, 13.68, 11.75}, + {10.22, 8.21, 6.84, 5.87}, + {5.11, 4.10, 3.42, 2.94}, + {2.55, 2.05, 1.71, 1.47}, + {1.27, 1.27, 1.27, 1.27} +}; +#endif + +/* Rate Table for Attack */ +static void makeDphaseARTable(OPLL * opll) +{ + e_int32 AR, Rks, RM, RL; +#ifdef USE_SPEC_ENV_SPEED + e_uint32 attacktable[16][4]; + + for (RM = 0; RM < 16; RM++) + for (RL = 0; RL < 4; RL++) + { + if (RM == 0) + attacktable[RM][RL] = 0; + else if (RM == 15) + attacktable[RM][RL] = EG_DP_WIDTH; + else + attacktable[RM][RL] = (e_uint32) ((double) (1 << EG_DP_BITS) / (attacktime[RM][RL] * 3579545 / 72000)); + + } +#endif + + for (AR = 0; AR < 16; AR++) + for (Rks = 0; Rks < 16; Rks++) + { + RM = AR + (Rks >> 2); + RL = Rks & 3; + if (RM > 15) + RM = 15; + switch (AR) + { + case 0: + opll->dphaseARTable[AR][Rks] = 0; + break; + case 15: + opll->dphaseARTable[AR][Rks] = 0;/*EG_DP_WIDTH;*/ + break; + default: +#ifdef USE_SPEC_ENV_SPEED + opll->dphaseARTable[AR][Rks] = (attacktable[RM][RL]); +#else + opll->dphaseARTable[AR][Rks] = ((3 * (RL + 4) << (RM + 1))); +#endif + break; + } + } +} + +/* Rate Table for Decay and Release */ +static void makeDphaseDRTable (OPLL * opll) +{ + e_int32 DR, Rks, RM, RL; + +#ifdef USE_SPEC_ENV_SPEED + e_uint32 decaytable[16][4]; + + for (RM = 0; RM < 16; RM++) + for (RL = 0; RL < 4; RL++) + if (RM == 0) + decaytable[RM][RL] = 0; + else + decaytable[RM][RL] = (e_uint32) ((double) (1 << EG_DP_BITS) / (decaytime[RM][RL] * 3579545 / 72000)); +#endif + + for (DR = 0; DR < 16; DR++) + for (Rks = 0; Rks < 16; Rks++) + { + RM = DR + (Rks >> 2); + RL = Rks & 3; + if (RM > 15) + RM = 15; + switch (DR) + { + case 0: + opll->dphaseDRTable[DR][Rks] = 0; + break; + default: +#ifdef USE_SPEC_ENV_SPEED + opll->dphaseDRTable[DR][Rks] = (decaytable[RM][RL]); +#else + opll->dphaseDRTable[DR][Rks] = ((RL + 4) << (RM - 1)); +#endif + break; + } + } +} + +static void makeRksTable (OPLL *opll) +{ + + e_int32 fnum8, block, KR; + + for (fnum8 = 0; fnum8 < 2; fnum8++) + for (block = 0; block < 8; block++) + for (KR = 0; KR < 2; KR++) + { + if (KR != 0) + opll->rksTable[fnum8][block][KR] = (block << 1) + fnum8; + else + opll->rksTable[fnum8][block][KR] = block >> 1; + } +} + +/************************************************************ + + Calc Parameters + +************************************************************/ + +INLINE static e_uint32 calc_eg_dphase (OPLL *opll, OPLL_SLOT * slot) +{ + + switch (slot->eg_mode) + { + case ATTACK: + return opll->dphaseARTable[slot->patch.AR][slot->rks]; + + case DECAY: + return opll->dphaseDRTable[slot->patch.DR][slot->rks]; + + case SUSHOLD: + return 0; + + case SUSTINE: + return opll->dphaseDRTable[slot->patch.RR][slot->rks]; + + case RELEASE: + if (slot->sustine) + return opll->dphaseDRTable[5][slot->rks]; + else if (slot->patch.EG) + return opll->dphaseDRTable[slot->patch.RR][slot->rks]; + else + return opll->dphaseDRTable[7][slot->rks]; + + case FINISH: + return 0; + + default: + return 0; + } +} + +/************************************************************* + + OPLL internal interfaces + +*************************************************************/ + +#define UPDATE_PG(S) (S)->dphase = opll->dphaseTable[(S)->fnum][(S)->block][(S)->patch.ML] +#define UPDATE_TLL(S)\ +(((S)->type==0)?\ +((S)->tll = opll->tllTable[((S)->fnum)>>5][(S)->block][(S)->patch.TL][(S)->patch.KL]):\ +((S)->tll = opll->tllTable[((S)->fnum)>>5][(S)->block][(S)->volume][(S)->patch.KL])) +#define UPDATE_RKS(S) (S)->rks = opll->rksTable[((S)->fnum)>>8][(S)->block][(S)->patch.KR] +#define UPDATE_WF(S) (S)->sintbl = opll->waveform[(S)->patch.WF] +#define UPDATE_EG(S) (S)->eg_dphase = calc_eg_dphase(opll,S) +#define UPDATE_ALL(S)\ + UPDATE_PG(S);\ + UPDATE_TLL(S);\ + UPDATE_RKS(S);\ + UPDATE_WF(S); \ + UPDATE_EG(S) /* EG should be updated last. */ + + +/* Slot key on */ +INLINE static void slotOn (OPLL_SLOT * slot) +{ + slot->eg_mode = ATTACK; + slot->eg_phase = 0; + slot->phase = 0; +} + +/* Slot key on without reseting the phase */ +INLINE static void slotOn2 (OPLL_SLOT * slot) +{ + slot->eg_mode = ATTACK; + slot->eg_phase = 0; +} + +/* Slot key off */ +INLINE static void slotOff (OPLL *opll, OPLL_SLOT * slot) +{ + if (slot->eg_mode == ATTACK) + slot->eg_phase = EXPAND_BITS (opll->AR_ADJUST_TABLE[HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS)], EG_BITS, EG_DP_BITS); + slot->eg_mode = RELEASE; +} + +/* Channel key on */ +INLINE static void keyOn (OPLL * opll, e_int32 i) +{ + if (!opll->slot_on_flag[i * 2]) + slotOn (MOD(opll,i)); + if (!opll->slot_on_flag[i * 2 + 1]) + slotOn (CAR(opll,i)); + opll->key_status[i] = 1; +} + +/* Channel key off */ +INLINE static void keyOff (OPLL * opll, e_int32 i) +{ + if (opll->slot_on_flag[i * 2 + 1]) + slotOff (opll, CAR(opll,i)); + opll->key_status[i] = 0; +} + +/* Set sustine parameter */ +INLINE static void setSustine (OPLL * opll, e_int32 c, e_int32 sustine) +{ + CAR(opll,c)->sustine = sustine; + if (MOD(opll,c)->type) + MOD(opll,c)->sustine = sustine; +} + +/* Volume : 6bit ( Volume register << 2 ) */ +INLINE static void setVolume (OPLL * opll, e_int32 c, e_int32 volume) +{ + CAR(opll,c)->volume = volume; +} + +INLINE static void setSlotVolume (OPLL_SLOT * slot, e_int32 volume) +{ + slot->volume = volume; +} + +/* Set F-Number ( fnum : 9bit ) */ +INLINE static void setFnumber (OPLL * opll, e_int32 c, e_int32 fnum) +{ + CAR(opll,c)->fnum = fnum; + MOD(opll,c)->fnum = fnum; +} + +/* Set Block data (block : 3bit ) */ +INLINE static void setBlock (OPLL * opll, e_int32 c, e_int32 block) +{ + CAR(opll,c)->block = block; + MOD(opll,c)->block = block; +} + +INLINE static void update_key_status (OPLL * opll) +{ + int ch; + + for (ch = 0; ch < 6; ch++) + opll->slot_on_flag[ch * 2] = opll->slot_on_flag[ch * 2 + 1] = (opll->HiFreq[ch]) & 0x10; +} + +/*********************************************************** + + Initializing + +***********************************************************/ + +static void OPLL_SLOT_reset (OPLL *opll, OPLL_SLOT * slot, int type) +{ + slot->type = type; + slot->sintbl = opll->waveform[0]; + slot->phase = 0; + slot->dphase = 0; + slot->output[0] = 0; + slot->output[1] = 0; + slot->feedback = 0; + slot->eg_mode = SETTLE; + slot->eg_phase = EG_DP_WIDTH; + slot->eg_dphase = 0; + slot->rks = 0; + slot->tll = 0; + slot->sustine = 0; + slot->fnum = 0; + slot->block = 0; + slot->volume = 0; + slot->pgout = 0; + slot->egout = 0; +} + +static void internal_refresh (OPLL *opll) +{ + makeDphaseTable (opll); + makeDphaseARTable (opll); + makeDphaseDRTable (opll); + opll->pm_dphase = (e_uint32) (PM_SPEED * PM_DP_WIDTH / (opll->clk / 72)); + opll->am_dphase = (e_uint32) (AM_SPEED * AM_DP_WIDTH / (opll->clk / 72)); +} + +static void maketables (OPLL *opll, e_uint32 c) +{ + opll->clk = c; + makePmTable (opll); + makeAmTable (opll); + makeDB2LinTable (opll); + makeAdjustTable (opll); + makeTllTable (opll); + makeRksTable (opll); + makeSinTable (opll); + //makeDefaultPatch (); + internal_refresh (opll); +} + +OPLL *OPLL_new (e_uint32 clk) +{ + OPLL *opll; + + opll = (OPLL *) calloc (sizeof (OPLL), 1); + if (opll == NULL) + return NULL; + maketables(opll,clk); + + opll->waveform[0]=opll->fullsintable; + opll->waveform[1]=opll->halfsintable; + + opll->mask = 0; + + OPLL_reset (opll); + + return opll; +} + + +void OPLL_delete (OPLL * opll) +{ + free (opll); +} + +/* Reset whole of OPLL except patch datas. */ +void OPLL_reset (OPLL * opll) +{ + e_int32 i; + + if (!opll) + return; + + opll->adr = 0; + opll->out = 0; + + opll->pm_phase = 0; + opll->am_phase = 0; + + opll->mask = 0; + + for (i = 0; i < 12; i++) + OPLL_SLOT_reset(opll, &opll->slot[i], i%2); + + for (i = 0; i < 6; i++) + { + opll->key_status[i] = 0; + //setPatch (opll, i, 0); + } + + for (i = 0; i < 0x40; i++) + OPLL_writeReg (opll, i, 0); +} + +/* Force Refresh (When external program changes some parameters). */ +void OPLL_forceRefresh (OPLL * opll) +{ + e_int32 i; + + if (opll == NULL) + return; + + for (i = 0; i < 12; i++) + { + UPDATE_PG (&opll->slot[i]); + UPDATE_RKS (&opll->slot[i]); + UPDATE_TLL (&opll->slot[i]); + UPDATE_WF (&opll->slot[i]); + UPDATE_EG (&opll->slot[i]); + } +} + +void OPLL_set_rate (OPLL * opll, e_uint32 r) +{ + internal_refresh (opll); +} + +/********************************************************* + + Generate wave data + +*********************************************************/ +/* Convert Amp(0 to EG_HEIGHT) to Phase(0 to 2PI). */ +#if ( SLOT_AMP_BITS - PG_BITS ) > 0 +#define wave2_2pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS )) +#else +#define wave2_2pi(e) ( (e) << ( PG_BITS - SLOT_AMP_BITS )) +#endif + +/* Convert Amp(0 to EG_HEIGHT) to Phase(0 to 4PI). */ +#if ( SLOT_AMP_BITS - PG_BITS - 1 ) == 0 +#define wave2_4pi(e) (e) +#elif ( SLOT_AMP_BITS - PG_BITS - 1 ) > 0 +#define wave2_4pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS - 1 )) +#else +#define wave2_4pi(e) ( (e) << ( 1 + PG_BITS - SLOT_AMP_BITS )) +#endif + +/* Convert Amp(0 to EG_HEIGHT) to Phase(0 to 8PI). */ +#if ( SLOT_AMP_BITS - PG_BITS - 2 ) == 0 +#define wave2_8pi(e) (e) +#elif ( SLOT_AMP_BITS - PG_BITS - 2 ) > 0 +#define wave2_8pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS - 2 )) +#else +#define wave2_8pi(e) ( (e) << ( 2 + PG_BITS - SLOT_AMP_BITS )) +#endif + + + +/* Update AM, PM unit */ +static void update_ampm (OPLL * opll) +{ + opll->pm_phase = (opll->pm_phase + opll->pm_dphase) & (PM_DP_WIDTH - 1); + opll->am_phase = (opll->am_phase + opll->am_dphase) & (AM_DP_WIDTH - 1); + opll->lfo_am = opll->amtable[HIGHBITS (opll->am_phase, AM_DP_BITS - AM_PG_BITS)]; + opll->lfo_pm = opll->pmtable[HIGHBITS (opll->pm_phase, PM_DP_BITS - PM_PG_BITS)]; +} + +/* PG */ +INLINE static void +calc_phase (OPLL_SLOT * slot, e_int32 lfo) +{ + if (slot->patch.PM) + slot->phase += (slot->dphase * lfo) >> PM_AMP_BITS; + else + slot->phase += slot->dphase; + + slot->phase &= (DP_WIDTH - 1); + + slot->pgout = HIGHBITS (slot->phase, DP_BASE_BITS); +} + +/* EG */ +static void calc_envelope(OPLL *opll, OPLL_SLOT * slot, e_int32 lfo) +{ +#define S2E(x) (SL2EG((e_int32)(x/SL_STEP))<<(EG_DP_BITS-EG_BITS)) + + static const e_uint32 SL[16] = { + S2E (0.0), S2E (3.0), S2E (6.0), S2E (9.0), S2E (12.0), S2E (15.0), S2E (18.0), S2E (21.0), + S2E (24.0), S2E (27.0), S2E (30.0), S2E (33.0), S2E (36.0), S2E (39.0), S2E (42.0), S2E (48.0) + }; + + e_uint32 egout; + + switch (slot->eg_mode) + { + + case ATTACK: + egout = opll->AR_ADJUST_TABLE[HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS)]; + slot->eg_phase += slot->eg_dphase; + if((EG_DP_WIDTH & slot->eg_phase)||(slot->patch.AR==15)) + { + egout = 0; + slot->eg_phase = 0; + slot->eg_mode = DECAY; + UPDATE_EG (slot); + } + break; + + case DECAY: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + slot->eg_phase += slot->eg_dphase; + if (slot->eg_phase >= SL[slot->patch.SL]) + { + if (slot->patch.EG) + { + slot->eg_phase = SL[slot->patch.SL]; + slot->eg_mode = SUSHOLD; + UPDATE_EG (slot); + } + else + { + slot->eg_phase = SL[slot->patch.SL]; + slot->eg_mode = SUSTINE; + UPDATE_EG (slot); + } + } + break; + + case SUSHOLD: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + if (slot->patch.EG == 0) + { + slot->eg_mode = SUSTINE; + UPDATE_EG (slot); + } + break; + + case SUSTINE: + case RELEASE: + egout = HIGHBITS (slot->eg_phase, EG_DP_BITS - EG_BITS); + slot->eg_phase += slot->eg_dphase; + if (egout >= (1 << EG_BITS)) + { + slot->eg_mode = FINISH; + egout = (1 << EG_BITS) - 1; + } + break; + + case FINISH: + egout = (1 << EG_BITS) - 1; + break; + + default: + egout = (1 << EG_BITS) - 1; + break; + } + + if (slot->patch.AM) + egout = EG2DB (egout + slot->tll) + lfo; + else + egout = EG2DB (egout + slot->tll); + + if (egout >= DB_MUTE) + egout = DB_MUTE - 1; + + slot->egout = egout; +} + +/* CARRIOR */ +INLINE static e_int32 calc_slot_car(OPLL *opll, OPLL_SLOT * slot, e_int32 fm) +{ + slot->output[1] = slot->output[0]; + + if (slot->egout >= (DB_MUTE - 1)) + { + slot->output[0] = 0; + } + else + { + slot->output[0] = opll->DB2LIN_TABLE[slot->sintbl[(slot->pgout+wave2_8pi(fm))&(PG_WIDTH-1)] + slot->egout]; + } + + return (slot->output[1] + slot->output[0]) >> 1; +} + +/* MODULATOR */ +INLINE static e_int32 calc_slot_mod(OPLL *opll, OPLL_SLOT * slot) +{ + e_int32 fm; + + slot->output[1] = slot->output[0]; + + if (slot->egout >= (DB_MUTE - 1)) + { + slot->output[0] = 0; + } + else if (slot->patch.FB != 0) + { + fm = wave2_4pi (slot->feedback) >> (7 - slot->patch.FB); + slot->output[0] = opll->DB2LIN_TABLE[slot->sintbl[(slot->pgout + fm)&(PG_WIDTH-1)] + slot->egout]; + } + else + { + slot->output[0] = opll->DB2LIN_TABLE[slot->sintbl[slot->pgout] + slot->egout]; + } + + slot->feedback = (slot->output[1] + slot->output[0]) >> 1; + + return slot->feedback; + +} + +static INLINE e_int16 calc (OPLL * opll) +{ + e_int32 inst = 0, out = 0; + e_int32 i; + + update_ampm (opll); + + for (i = 0; i < 12; i++) + { + calc_phase(&opll->slot[i],opll->lfo_pm); + calc_envelope(opll, &opll->slot[i],opll->lfo_am); + } + + for (i = 0; i < 6; i++) + if (!(opll->mask & OPLL_MASK_CH (i)) && (CAR(opll,i)->eg_mode != FINISH)) + inst += calc_slot_car (opll, CAR(opll,i), calc_slot_mod(opll,MOD(opll,i))); + + out = inst; + return (e_int16) out; +} + +e_int16 OPLL_calc (OPLL * opll) +{ + return calc (opll); +} + +e_uint32 +OPLL_setMask (OPLL * opll, e_uint32 mask) +{ + e_uint32 ret; + + if (opll) + { + ret = opll->mask; + opll->mask = mask; + return ret; + } + else + return 0; +} + +e_uint32 +OPLL_toggleMask (OPLL * opll, e_uint32 mask) +{ + e_uint32 ret; + + if (opll) + { + ret = opll->mask; + opll->mask ^= mask; + return ret; + } + else + return 0; +} + +/**************************************************** + + I/O Ctrl + +*****************************************************/ + +static void setInstrument(OPLL * opll, e_uint i, e_uint inst) +{ + const e_uint8 *src; + OPLL_PATCH *modp, *carp; + + opll->patch_number[i]=inst; + + if(inst) + src=default_inst[inst-1]; + else + src=opll->CustInst; + + modp=&MOD(opll,i)->patch; + carp=&CAR(opll,i)->patch; + + modp->AM=(src[0]>>7)&1; + modp->PM=(src[0]>>6)&1; + modp->EG=(src[0]>>5)&1; + modp->KR=(src[0]>>4)&1; + modp->ML=(src[0]&0xF); + + carp->AM=(src[1]>>7)&1; + carp->PM=(src[1]>>6)&1; + carp->EG=(src[1]>>5)&1; + carp->KR=(src[1]>>4)&1; + carp->ML=(src[1]&0xF); + + modp->KL=(src[2]>>6)&3; + modp->TL=(src[2]&0x3F); + + carp->KL = (src[3] >> 6) & 3; + carp->WF = (src[3] >> 4) & 1; + + modp->WF = (src[3] >> 3) & 1; + + modp->FB = (src[3]) & 7; + + modp->AR = (src[4]>>4)&0xF; + modp->DR = (src[4]&0xF); + + carp->AR = (src[5]>>4)&0xF; + carp->DR = (src[5]&0xF); + + modp->SL = (src[6]>>4)&0xF; + modp->RR = (src[6]&0xF); + + carp->SL = (src[7]>>4)&0xF; + carp->RR = (src[7]&0xF); +} + + +void OPLL_writeReg (OPLL * opll, e_uint32 reg, e_uint32 data) +{ + + e_int32 i, v, ch; + + data = data & 0xff; + reg = reg & 0x3f; + + switch (reg) + { + case 0x00: + opll->CustInst[0]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_PG (MOD(opll,i)); + UPDATE_RKS (MOD(opll,i)); + UPDATE_EG (MOD(opll,i)); + } + } + break; + + case 0x01: + opll->CustInst[1]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_PG (CAR(opll,i)); + UPDATE_RKS (CAR(opll,i)); + UPDATE_EG (CAR(opll,i)); + } + } + break; + + case 0x02: + opll->CustInst[2]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_TLL(MOD(opll,i)); + } + } + break; + + case 0x03: + opll->CustInst[3]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_WF(MOD(opll,i)); + UPDATE_WF(CAR(opll,i)); + } + } + break; + + case 0x04: + opll->CustInst[4]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_EG (MOD(opll,i)); + } + } + break; + + case 0x05: + opll->CustInst[5]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_EG(CAR(opll,i)); + } + } + break; + + case 0x06: + opll->CustInst[6]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_EG (MOD(opll,i)); + } + } + break; + + case 0x07: + opll->CustInst[7]=data; + for (i = 0; i < 6; i++) + { + if (opll->patch_number[i] == 0) + { + setInstrument(opll, i, 0); + UPDATE_EG (CAR(opll,i)); + } + } + break; + + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + ch = reg - 0x10; + opll->LowFreq[ch]=data; + setFnumber (opll, ch, data + ((opll->HiFreq[ch] & 1) << 8)); + UPDATE_ALL (MOD(opll,ch)); + UPDATE_ALL (CAR(opll,ch)); + break; + + case 0x20: + case 0x21: + case 0x22: + case 0x23: + case 0x24: + case 0x25: + ch = reg - 0x20; + opll->HiFreq[ch]=data; + + setFnumber (opll, ch, ((data & 1) << 8) + opll->LowFreq[ch]); + setBlock (opll, ch, (data >> 1) & 7); + setSustine (opll, ch, (data >> 5) & 1); + if (data & 0x10) + keyOn (opll, ch); + else + keyOff (opll, ch); + UPDATE_ALL (MOD(opll,ch)); + UPDATE_ALL (CAR(opll,ch)); + update_key_status (opll); + break; + + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + opll->InstVol[reg-0x30]=data; + i = (data >> 4) & 15; + v = data & 15; + setInstrument(opll, reg-0x30, i); + setVolume (opll, reg - 0x30, v << 2); + UPDATE_ALL (MOD(opll,reg - 0x30)); + UPDATE_ALL (CAR(opll,reg - 0x30)); + break; + + default: + break; + + } +} + +void OPLL_writeIO (OPLL * opll, e_uint32 adr, e_uint32 val) +{ + if (adr & 1) + OPLL_writeReg (opll, opll->adr, val); + else + opll->adr = val; +} diff --git a/Mednafen/mednafen/nes/boards/emu2413.h b/Mednafen/mednafen/nes/boards/emu2413.h new file mode 100644 index 0000000000..d6046ef690 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/emu2413.h @@ -0,0 +1,207 @@ +#ifndef _EMU2413_H_ +#define _EMU2413_H_ + +#include "emutypes.h" + +/* Size of Sintable ( 8 -- 18 can be used. 9 recommended.)*/ +#define PG_BITS 9 +#define PG_WIDTH (1< last) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + IRQCount=0; + } + } + else + { + uint16 last = IRQCount; + IRQCount+=a; + if(IRQCount < last) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + IRQCount=0; + } + } + } +} + +static void DoMirroring(void) +{ + if(!MirSelect) + setmirror(((MirRegs[0] >> 4) & 1) ? MI_1 : MI_0); + else + setmirror(((MirRegs[1] >> 4) & 1) ? MI_H : MI_V); +} + +static void DoPRG(void) +{ + if(!ModeSelect) + { + for(int x = 0; x < 4; x++) + setprg8(0x8000 + x * 8192, PRGBanks[x]); + } + else + { + setprg16(0x8000, (latch >> 2) & 0x3F); + setprg16(0xc000, 0x7); + } +} + +static void DoCHR(void) +{ + if(!ModeSelect) + { + for(int x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); + } + else + { + setchr8(latch & 3); + } +} + +static DECLFW(Mapper6_write) +{ + if(A >= 0x4500 && A <= 0x4503) + printf("%04x: %02x\n", A, V); + if(A < 0x8000) + { + switch(A) + { + default: printf("Oops: %04x : %02x\n", A, V);break; + case 0x42FE: MirSelect = 0; MirRegs[0] = V; DoMirroring(); break; + case 0x42FF: MirSelect = 1; MirRegs[1] = V; DoMirroring(); break; + case 0x4501: IRQa = V & 1; X6502_IRQEnd(MDFN_IQEXT); break; + case 0x4502: IRQCount &= 0xFF00; IRQCount |= V; X6502_IRQEnd(MDFN_IQEXT); break; + case 0x4503: IRQCount &= 0x00FF; IRQCount |= V << 8; IRQa = 1; X6502_IRQEnd(MDFN_IQEXT); break; + case 0x4504: PRGBanks[0] = V; DoPRG(); break; + case 0x4505: PRGBanks[1] = V; DoPRG(); break; + case 0x4506: PRGBanks[2] = V; DoPRG(); break; + case 0x4507: PRGBanks[3] = V; DoPRG(); break; + case 0x4510: CHRBanks[0] = V; DoCHR(); break; + case 0x4511: CHRBanks[1] = V; DoCHR(); break; + case 0x4512: CHRBanks[2] = V; DoCHR(); break; + case 0x4513: CHRBanks[3] = V; DoCHR(); break; + case 0x4514: CHRBanks[4] = V; DoCHR(); break; + case 0x4515: CHRBanks[5] = V; DoCHR(); break; + case 0x4516: CHRBanks[6] = V; DoCHR(); break; + case 0x4517: CHRBanks[7] = V; DoCHR(); break; + } + } + else + { + latch = V; + DoPRG(); + DoCHR(); + } +} + +static void Reset(CartInfo *info) +{ + int x; + + if(!info->battery) + memset(WRAM, 0x00, 8192); + + latch = 0; + MirRegs[0] = 0x00; + MirRegs[1] = 0x00 | (((info->mirror & 1) << 4) ^ 0x10); + MirSelect = 1; + DoMirroring(); + + for(x = 0; x < 8; x++) + CHRBanks[x] = x; + PRGBanks[0] = 0; + PRGBanks[1] = 1; + PRGBanks[2] = 0xFE; + PRGBanks[3] = 0xFF; + DoPRG(); + DoCHR(); + + setprg8r(0x10, 0x6000, 0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 8192), + SFARRAY(CHRBanks, 8), + SFARRAY(PRGBanks, 4), + SFARRAY(MirRegs, 2), + SFVAR(MirSelect), + SFVAR(latch), + SFVAR(IRQCount), + SFVAR(IRQa), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + DoCHR(); + DoPRG(); + DoMirroring(); + } + + return(ret); +} + +int Mapper6_Init(CartInfo *info) +{ + ModeSelect = 1; + MapIRQHook = FFEIRQHook; + info->Power = info->Reset = Reset; + + SetWriteHandler(0x4020,0x5fff,Mapper6_write); + SetWriteHandler(0x8000,0xffff,Mapper6_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + + if(info->battery) + { + memset(WRAM, 0x00, 8192); + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + + info->StateAction = StateAction; + return(1); +} + +int Mapper17_Init(CartInfo *info) +{ + Mapper6_Init(info); + ModeSelect = 0; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/fme7.cpp b/Mednafen/mednafen/nes/boards/fme7.cpp new file mode 100644 index 0000000000..8cf27d671c --- /dev/null +++ b/Mednafen/mednafen/nes/boards/fme7.cpp @@ -0,0 +1,327 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" +#include "../nsf.h" +#include + +static uint8 WRAM[8192]; +static void AYSoundHQ(void); +static void DoAYSQHQ(int x); + +static uint16 IRQCount; +static uint8 IRQa; +static uint8 CHRRegs[8]; +static uint8 PRGRegs[3]; +static uint8 Mirroring; + +static uint8 reg_select; +static uint8 wram_control; +static int32 amp_lut[0x10]; +static uint8 sr[0x10]; +static uint8 sr_index; + +static int32 vcount[3]; +static uint32 dcount[3]; +static uint32 CAYBC[3]; + + +static DECLFW(SUN5BWRAM) +{ + if((wram_control&0xC0)==0xC0) + (WRAM-0x6000)[A]=V; +} + +static DECLFR(SUN5AWRAM) +{ + if((wram_control&0xC0)==0x40) + return X.DB; + return CartBR(A); +} + +static void SyncCHR(void) +{ + for(unsigned x = 0; x < 8; x++) + setchr1(x << 10, CHRRegs[x]); +} + +static void SyncPRG(void) +{ + if(wram_control&0x40) + { + if(wram_control&0x80) // Select WRAM + setprg8r(0x10,0x6000,0); + } + else + setprg8(0x6000,wram_control); + + setprg8(0x8000, PRGRegs[0]); + setprg8(0xa000, PRGRegs[1]); + setprg8(0xc000, PRGRegs[2]); +} + +static void SyncMirroring(void) +{ + switch(Mirroring&3) + { + case 0:setmirror(MI_V);break; + case 1:setmirror(MI_H);break; + case 2:setmirror(MI_0);break; + case 3:setmirror(MI_1);break; + } +} + +static DECLFW(Mapper69_SWL) +{ + sr_index= V & 0xF; +} + +static DECLFW(Mapper69_SWH) +{ + int x; + + switch(sr_index) + { + case 0: + case 1: + case 8:DoAYSQHQ(0);break; + case 2: + case 3: + case 9:DoAYSQHQ(1);;break; + case 4: + case 5: + case 10:DoAYSQHQ(2);break; + case 7: + for(x=0;x<2;x++) + DoAYSQHQ(x); + break; + } + sr[sr_index]=V; +} + +static DECLFW(Mapper69_write) +{ + switch(A&0xE000) + { + case 0x8000:reg_select=V;break; + case 0xa000: + reg_select&=0xF; + if(reg_select < 8) + { + CHRRegs[reg_select] = V; + SyncCHR(); + } + else + switch(reg_select&0x0f) + { + case 0x8: wram_control = V; SyncPRG(); break; + case 0x9: PRGRegs[0] = V & 0x3F; SyncPRG(); break; + case 0xa: PRGRegs[1] = V & 0x3F; SyncPRG(); break; + case 0xb: PRGRegs[2] = V & 0x3F; SyncPRG(); break; + case 0xc: Mirroring = V & 0x3; SyncMirroring(); break; + + case 0xd:IRQa=V; X6502_IRQEnd(MDFN_IQEXT); break; + case 0xe:IRQCount&=0xFF00;IRQCount|=V;break; + case 0xf:IRQCount&=0x00FF;IRQCount|=V<<8;break; + } + break; + } +} + +static void DoAYSQHQ(int x) +{ + const int32 period = sr[x * 2] | ((sr[(x * 2) + 1] & 0xF) << 8); + const int32 amp = amp_lut[(sr[0x8 + x] & 0xF)]; + uint32 V; + + if(!(sr[0x7]&(1<= period) + { + dcount[x] = (dcount[x] + 1) & 0x1F; + vcount[x] = 0; + } + } + } + CAYBC[x]=SOUNDTS; +} + +static void AYSoundHQ(void) +{ + DoAYSQHQ(0); + DoAYSQHQ(1); + DoAYSQHQ(2); +} + +static void AYHiSync(int32 ts) +{ + int x; + + for(x=0;x<3;x++) + CAYBC[x]=ts; +} + +static void SunIRQHook(int a) +{ + if(IRQa & 1) + { + uint16 prev = IRQCount; + + IRQCount-=a; + + if(IRQCount > prev && (IRQa & 0x80)) + { + X6502_IRQBegin(MDFN_IQEXT); + } + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVARN(reg_select, "FM7S"), + SFVARN(wram_control, "FM7W"), + SFARRAYN(sr, 0x10, "FM7SR"), + SFVARN(sr_index, "FM7I"), + SFARRAY(PRGRegs, 3), + SFARRAY(CHRRegs, 8), + SFVAR(Mirroring), + SFARRAY32(vcount, 3), + SFARRAY32(dcount, 3), + + SFVAR(IRQa), + SFVAR(IRQCount), + + SFARRAY(WRAM, 8192), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + SyncCHR(); + SyncPRG(); + SyncMirroring(); + } + + return(ret); +} + +void Mapper69_ESI(EXPSOUND *ep) +{ + for(int i = 0; i < 0x10; i++) + { + double vl = 1.0 / pow(2, 1.0 / 2 * (15 - i)); + + //amp_lut[i] = i * 96; + amp_lut[i] = 7000 * vl; //7500 * vl; //6500 * vl; //8192 * vl; //(int32)(48 * 128 * vl); + + if(!i) + amp_lut[i] = 0; + + //printf("%d %f, %d\n", i, vl, amp_lut[i]); + } + + ep->HiFill=AYSoundHQ; + ep->HiSync=AYHiSync; + memset(dcount,0,sizeof(dcount)); + memset(vcount,0,sizeof(vcount)); + memset(CAYBC,0,sizeof(CAYBC)); +} + +int NSFAY_Init(EXPSOUND *ep, bool MultiChip) +{ + sr_index=0; + if(MultiChip) + { + NSFECSetWriteHandler(0xc000,0xc000,Mapper69_SWL); + NSFECSetWriteHandler(0xe000,0xe000,Mapper69_SWH); + } + else + { + NSFECSetWriteHandler(0xc000,0xdfff,Mapper69_SWL); + NSFECSetWriteHandler(0xe000,0xffff,Mapper69_SWH); + } + Mapper69_ESI(ep); + return(1); +} + +static void Reset(CartInfo *info) +{ + sr_index = 0; + wram_control = 0; + memset(sr, 0xFF, sizeof(sr)); // Setting all bits will cause sound output to be disabled on reset. + + for(unsigned x = 0; x < 8; x++) + CHRRegs[x] = x; + + PRGRegs[0] = PRGRegs[1] = PRGRegs[2] = 0x3F; + + Mirroring = info->mirror ? 0 : 1; // Do any mapper 69 boards use hardware-fixed mirroring? + + SyncCHR(); + SyncPRG(); + SyncMirroring(); + + setprg8(0xe000, 0x3F); +} + +static void Power(CartInfo *info) +{ + if(!info->battery) + memset(WRAM, 0x00, 8192); + + Reset(info); +} + +int BTR_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10,WRAM,8192,1); + + SetWriteHandler(0x8000,0xbfff,Mapper69_write); + SetWriteHandler(0xc000,0xdfff,Mapper69_SWL); + SetWriteHandler(0xe000,0xffff,Mapper69_SWH); + SetWriteHandler(0x6000,0x7fff,SUN5BWRAM); + SetReadHandler(0x6000,0x7fff,SUN5AWRAM); + SetReadHandler(0x8000, 0xFFFF, CartBR); + + info->Power = Power; + info->Reset = Reset; + info->StateAction = StateAction; + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + + Mapper69_ESI(&info->CartExpSound); + + MapIRQHook = SunIRQHook; + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/h2288.cpp b/Mednafen/mednafen/nes/boards/h2288.cpp new file mode 100644 index 0000000000..fb21e872da --- /dev/null +++ b/Mednafen/mednafen/nes/boards/h2288.cpp @@ -0,0 +1,116 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Not finished. Darn evil game... *Mumble*... */ + +#include "mapinc.h" + +static uint8 cmd; +static uint8 regs[8]; + +static void DoPRG(void) +{ + if(cmd&0x40) + { + setprg8(0xC000,regs[4]); + setprg8(0xA000,regs[5]); + setprg8(0x8000,~1); + setprg8(0xE000,~0); + } + else + { + setprg8(0x8000,regs[4]); + setprg8(0xA000,regs[5]); + setprg8(0xC000,~1); + setprg8(0xE000,~0); + } +} + +static void DoCHR(void) +{ + uint32 base=(cmd&0x80)<<5; + + setchr2(0x0000^base,regs[0]); + setchr2(0x0800^base,regs[2]); + + setchr1(0x1000^base,regs[6]); + setchr1(0x1400^base,regs[1]); + setchr1(0x1800^base,regs[7]); + setchr1(0x1c00^base,regs[3]); +} + +static DECLFW(PWrite) +{ + //printf("$%04x:$%02x\n",A,V); +} + +static DECLFW(H2288Write) +{ + //printf("$%04x:$%02x, $%04x\n",A,V,X.PC); + //MDFNI_DumpMem("dmp",0xc000,0xffff); + + switch(A&0xE001) + { + case 0xa000:setmirror((V&1)^1);break; + case 0x8000: + cmd=V;DoPRG();DoCHR();break; + case 0x8001:regs[cmd&7]=V; + if((cmd&7)==4 || (cmd&7)==5) + DoPRG(); + else + DoCHR(); + break; + } +} + +static DECLFR(H2288Read) +{ + int bit; + //printf("Read: $%04x, $%04x\n",A,X.PC); + //DumpMem("out",0x8000,0xFFFF); + bit=(A&1)^1; + bit&=((A>>8)&1); + bit^=1; + return((X.DB&0xFE)|bit); +} + +static void H2288Reset(CartInfo *info) +{ + int x; + + for(x=0;x<8;x++) regs[x]=0; + regs[4]=0; + regs[5]=1; + cmd=0; + DoPRG(); + DoCHR(); +} + +int H2288_Init(CartInfo *info) +{ + info->Power=H2288Reset; + + SetReadHandler(0x5000,0x5FFF,H2288Read); + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x5000,0x5FFF,PWrite); + SetWriteHandler(0x8000,0xFFFF,H2288Write); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/malee.cpp b/Mednafen/mednafen/nes/boards/malee.cpp new file mode 100644 index 0000000000..c10ab137c7 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/malee.cpp @@ -0,0 +1,63 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 WRAM[2048]; + +static DECLFW(MWrite) +{ + (WRAM-0x7000)[A]=V; +} + +static void MALEEReset(CartInfo *info) +{ + memset(WRAM, 0x00, 2048); + setprg2r(0x10,0x7000,0); + setprg2r(1,0x6000,0); + setprg32(0x8000,0); + setchr8(0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 2048), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + return(ret); +} + +int MALEE_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 2048, 1); + info->Power=MALEEReset; + info->StateAction = StateAction; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetReadHandler(0x6000,0x67ff,CartBR); + SetReadHandler(0x7000,0x77FF,CartBR); + SetWriteHandler(0x7000,0x77FF,MWrite); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/mapinc.h b/Mednafen/mednafen/nes/boards/mapinc.h new file mode 100644 index 0000000000..961110c682 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/mapinc.h @@ -0,0 +1,7 @@ +#include "../nes.h" +#include "../x6502.h" +#include "../ppu/ppu.h" +#include "../sound.h" +#include "../cart.h" +#include "../unif.h" +#include diff --git a/Mednafen/mednafen/nes/boards/maxicart.cpp b/Mednafen/mednafen/nes/boards/maxicart.cpp new file mode 100644 index 0000000000..498e53cb16 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/maxicart.cpp @@ -0,0 +1,120 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +typedef struct +{ + uint8 PRGSelect; + uint8 RAMSelect; +} M125Data; + +static M125Data Mapper125; +static uint8 *WRAM = NULL; + +static DECLFW(M125w) +{ + if(A==0x5000) + { + Mapper125.PRGSelect=V&0xF; + setprg32(0x8000,V&0xF); + } + else if(A==0x5001) + { + Mapper125.RAMSelect=V&0x33; + setchr8(V&3); + setprg8r(0x10,0x6000,(V>>4)&3); + } +} + +static void M125_Reset(CartInfo *info) +{ + +} + +static void M125_Power(CartInfo *info) +{ + Mapper125.PRGSelect = ~0; + Mapper125.RAMSelect = 0; + + setprg32(0x8000,Mapper125.PRGSelect&0xF); + setchr8(Mapper125.RAMSelect&3); + setprg8r(0x10,0x6000,(Mapper125.RAMSelect>>4)&3); + + if(!info->battery) + { + memset(WRAM, 0xFF, 32768); + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Mapper125.RAMSelect), SFVAR(Mapper125.PRGSelect), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + setprg32(0x8000,Mapper125.PRGSelect&0xF); + setchr8(Mapper125.RAMSelect&3); + setprg8r(0x10,0x6000,(Mapper125.RAMSelect>>4)&3); + } + return(ret); +} + +static void Close(void) +{ + if(WRAM) + { + free(WRAM); + WRAM = NULL; + } +} + +int Mapper125_Init(CartInfo *info) +{ + if(!(WRAM = (uint8*) MDFN_malloc(32768, _("expansion RAM")))) + { + return(0); + } + + SetupCartPRGMapping(0x10, WRAM, 32768, 1); + info->Reset=M125_Reset; + info->Power=M125_Power; + info->StateAction = StateAction; + info->Close = Close; + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 32768; + } + + SetReadHandler(0x6000,0xFFFF,CartBR); + SetWriteHandler(0x5000,0x5001,M125w); + SetWriteHandler(0x6000,0x7FFF,CartBW); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/mmc1.cpp b/Mednafen/mednafen/nes/boards/mmc1.cpp new file mode 100644 index 0000000000..b4ba7723ae --- /dev/null +++ b/Mednafen/mednafen/nes/boards/mmc1.cpp @@ -0,0 +1,637 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static void GenMMC1Power(CartInfo *info); +static int GenMMC1Init(CartInfo *info, int prg, int chr, int wram, int battery); + +static uint8 DRegs[4]; +static uint8 Buffer,BufferShift; + +static int mmc1opts; + +static void (*MMC1CHRHook4)(uint32 A, uint8 V); +static void (*MMC1PRGHook16)(uint32 A, uint8 V); + +static int WRAM_Size; +static uint8 *WRAM=NULL; +static uint8 *CHRRAM=NULL; +static int is155; + +static DECLFW(MBWRAM) +{ + if(!(DRegs[3]&0x10) || is155) + Page[A>>11][A]=V; // WRAM is enabled. +} + +static DECLFR(MAWRAM) +{ + if((DRegs[3]&0x10) && !is155) + return X.DB; // WRAM is disabled + return(Page[A>>11][A]); +} + +static void MMC1CHR(void) +{ + if(mmc1opts&4) + { + if(DRegs[0]&0x10) + setprg8r(0x10,0x6000,(DRegs[1]>>4)&1); + else + setprg8r(0x10,0x6000,(DRegs[1]>>3)&1); + } + + if(MMC1CHRHook4) + { + if(DRegs[0]&0x10) + { + MMC1CHRHook4(0x0000,DRegs[1]); + MMC1CHRHook4(0x1000,DRegs[2]); + } + else + { + MMC1CHRHook4(0x0000,(DRegs[1]&0xFE)); + MMC1CHRHook4(0x1000,DRegs[1]|1); + } + } + else + { + if(DRegs[0]&0x10) + { + setchr4(0x0000,DRegs[1]); + setchr4(0x1000,DRegs[2]); + } + else + setchr8(DRegs[1]>>1); + } +} + +static void MMC1PRG(void) +{ + uint8 offs; + + offs=DRegs[1]&0x10; + if(MMC1PRGHook16) + { + switch(DRegs[0]&0xC) + { + case 0xC: MMC1PRGHook16(0x8000,(DRegs[3]+offs)); + MMC1PRGHook16(0xC000,0xF+offs); + break; + case 0x8: MMC1PRGHook16(0xC000,(DRegs[3]+offs)); + MMC1PRGHook16(0x8000,offs); + break; + case 0x0: + case 0x4: + MMC1PRGHook16(0x8000,((DRegs[3]&~1)+offs)); + MMC1PRGHook16(0xc000,((DRegs[3]&~1)+offs+1)); + break; + } + } + else + switch(DRegs[0]&0xC) + { + case 0xC: setprg16(0x8000,(DRegs[3]+offs)); + setprg16(0xC000,0xF+offs); + break; + case 0x8: setprg16(0xC000,(DRegs[3]+offs)); + setprg16(0x8000,offs); + break; + case 0x0: + case 0x4: + setprg16(0x8000,((DRegs[3]&~1)+offs)); + setprg16(0xc000,((DRegs[3]&~1)+offs+1)); + break; + } +} + +static void MMC1MIRROR(void) +{ + switch(DRegs[0]&3) + { + case 2: setmirror(MI_V);break; + case 3: setmirror(MI_H);break; + case 0: setmirror(MI_0);break; + case 1: setmirror(MI_1);break; + } +} + +#ifdef WANT_DEBUGGER +enum +{ + MMC1_GSREG_CONTROL = 0, + MMC1_GSREG_CHRBANK0, + MMC1_GSREG_CHRBANK1, + MMC1_GSREG_PRGBANK, + MMC1_GSREG_BUFFER, + MMC1_GSREG_BUFFERSHIFT +}; + +static RegType DBGMMC1Regs[] = +{ + { MMC1_GSREG_CONTROL, "Control", "Control(MMC1 register 0)", 1 }, + { MMC1_GSREG_CHRBANK0, "CHRBank0", "CHR Bank Register 0(MMC1 register 1)", 1 }, + { MMC1_GSREG_CHRBANK1, "CHRBank1", "CHR Bank Register 1(MMC1 register 2)", 1 }, + { MMC1_GSREG_PRGBANK, "PRGBank", "PRG Bank Bank Register(MMC1 register 3)", 1 }, + { MMC1_GSREG_BUFFER, "Buffer", "Shifty buffer that takes your moneys!", 1 }, + { MMC1_GSREG_BUFFERSHIFT, "BufferShift", "Place to stick bit in shifty bit buffer", 1 }, + { 0, "", "", 0 }, +}; + +static uint32 MMC1DBG_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case MMC1_GSREG_CONTROL: + value = DRegs[0]; + + if(special) + { + static const char *PMNames[4] = { "One-screen(0)", "One-screen(1)", "Vertical", "Horizontal" }; + char tmpstr[256]; + tmpstr[0] = 0; + + sprintf(tmpstr + strlen(tmpstr), "PRG Bank Size: %dKiB", (DRegs[0] & 0x8) ? 16 : 32); + if(DRegs[0] & 0x8) + { + sprintf(tmpstr + strlen(tmpstr), " @ 0x%04x, ", (DRegs[0] & 0x4) ? 0x8000 : 0xC000); + } + else + strcat(tmpstr, ", "); + + sprintf(tmpstr + strlen(tmpstr), "CHR Bank Size: %dKiB, ", (DRegs[0]&0x10) ? 4 : 8); + + if(!CartHasHardMirroring()) + sprintf(tmpstr + strlen(tmpstr), "Mirroring: %s", PMNames[DRegs[0] & 0x3]); + + strncpy(special, tmpstr, special_len); + } + break; + + case MMC1_GSREG_CHRBANK0: + value = DRegs[1]; + break; + + case MMC1_GSREG_CHRBANK1: + value = DRegs[2]; + break; + + case MMC1_GSREG_PRGBANK: + value = DRegs[3]; + break; + + case MMC1_GSREG_BUFFER: + value = Buffer; + break; + + case MMC1_GSREG_BUFFERSHIFT: + value = BufferShift; + break; + } + + return(value); +} + +static void MMC1DBG_SetRegister(const unsigned int id, uint32 value) +{ + switch(id) + { + case MMC1_GSREG_CONTROL: + DRegs[0] = value; + break; + + case MMC1_GSREG_CHRBANK0: + DRegs[1] = value; + break; + + case MMC1_GSREG_CHRBANK1: + DRegs[2] = value; + break; + + case MMC1_GSREG_PRGBANK: + DRegs[3] = value; + break; + + case MMC1_GSREG_BUFFER: + Buffer = value; + break; + + case MMC1_GSREG_BUFFERSHIFT: + BufferShift = value % 5; + break; + } + + MMC1MIRROR(); + MMC1CHR(); + MMC1PRG(); +} + +static RegGroupType DBGMMC1RegsGroup = +{ + "MMC1", + DBGMMC1Regs, + MMC1DBG_GetRegister, + MMC1DBG_SetRegister, +}; + +#endif + + +static uint64 lreset; +static DECLFW(MMC1_write) +{ + int n=(A>>13)-4; + //MDFN_DispMessage("%016x",timestampbase+timestamp); + //printf("$%04x:$%02x, $%04x\n",A,V,X.PC); + //DumpMem("out",0xe000,0xffff); + + /* The MMC1 is busy so ignore the write. */ + /* As of version Mednafen 0.81, the timestamp is only + increased before each instruction is executed(in other words + precision isn't that great), but this should still work to + deal with 2 writes in a row from a single RMW instruction. + */ + if( (timestampbase+timestamp)<(lreset+2)) + return; + if (V&0x80) + { + DRegs[0]|=0xC; + BufferShift=Buffer=0; + MMC1PRG(); + lreset=timestampbase+timestamp; + return; + } + + Buffer|=(V&1)<<(BufferShift++); + + if (BufferShift==5) { + DRegs[n] = Buffer; + BufferShift = Buffer = 0; + + switch(n){ + case 0: + MMC1MIRROR(); + MMC1CHR(); + MMC1PRG(); + break; + case 1: + MMC1CHR(); + MMC1PRG(); + break; + case 2: + MMC1CHR(); + break; + case 3: + MMC1PRG(); + break; + } + } +} + +static void MMC1CMReset(void) +{ + int i; + + for(i=0;i<4;i++) + DRegs[i]=0; + Buffer = BufferShift = 0; + DRegs[0]=0x1F; + + DRegs[1]=0; + DRegs[2]=0; // Should this be something other than 0? + DRegs[3]=0; + + MMC1MIRROR(); + MMC1CHR(); + MMC1PRG(); +} + +static int DetectMMC1WRAMSize(uint32 crc32) +{ + switch(crc32) + { + default:return(8); + case 0xc6182024: /* Romance of the 3 Kingdoms */ + case 0x2225c20f: /* Genghis Khan */ + case 0x4642dda6: /* Nobunaga's Ambition */ + case 0x29449ba9: /* "" "" (J) */ + case 0x2b11e0b0: /* "" "" (J) */ + MDFN_printf(_(">8KB external WRAM present. Use UNIF if you hack the ROM image.\n")); + return(16); + } +} + +static uint32 NWCIRQCount; +static uint8 NWCRec; +#define NWCDIP 0xE + +static void NWCIRQHook(int a) +{ + if(!(NWCRec&0x10)) + { + NWCIRQCount+=a; + if((NWCIRQCount|(NWCDIP<<25))>=0x3e000000) + { + NWCIRQCount=0; + X6502_IRQBegin(MDFN_IQEXT); + } + } +} + +static void NWCCHRHook(uint32 A, uint8 V) +{ + if((V&0x10)) // && !(NWCRec&0x10)) + { + NWCIRQCount=0; + X6502_IRQEnd(MDFN_IQEXT); + } + + NWCRec=V; + if(V&0x08) + MMC1PRG(); + else + setprg32(0x8000,(V>>1)&3); +} + +static void NWCPRGHook(uint32 A, uint8 V) +{ + if(NWCRec&0x8) + setprg16(A,8|(V&0x7)); + else + setprg32(0x8000,(NWCRec>>1)&3); +} + +static void NWCPower(CartInfo *info) +{ + GenMMC1Power(info); + setchr8r(0,0); +} + +static int NWC_StateAction(StateMem *sm, int load, int data_only); +int Mapper105_Init(CartInfo *info) +{ + if(!(GenMMC1Init(info, 256, 256, 8, 0))) + return(0); + + MMC1CHRHook4=NWCCHRHook; + MMC1PRGHook16=NWCPRGHook; + MapIRQHook=NWCIRQHook; + info->Power=NWCPower; + info->StateAction = NWC_StateAction; + return(1); +} + +static void GenMMC1Power(CartInfo *info) +{ + lreset=0; + if(mmc1opts&1) + { + if(mmc1opts&4) + memset(WRAM,0,8192); + else if(!(mmc1opts&2)) + memset(WRAM,0,8192); + } + + if(mmc1opts&1) + { + setprg8r(0x10,0x6000,0); + } + + MMC1CMReset(); +} + +static void GenMMC1Close(void) +{ + if(CHRRAM) + MDFN_free(CHRRAM); + if(WRAM) + MDFN_free(WRAM); + CHRRAM=WRAM=NULL; +} + +static int NWC_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, WRAM_Size), + SFARRAY(CHRRAM, 8192), + SFARRAY(DRegs, 4), + SFVAR(lreset), + SFVAR(Buffer), + SFVAR(BufferShift), + SFVAR(NWCIRQCount), + SFVAR(NWCRec), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + MMC1MIRROR(); + MMC1CHR(); + MMC1PRG(); + lreset=0; /* timestamp(base) is not stored in save states. */ + } + return(ret); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + //uint32 NWCIRQCount; + //uint8 NWCRec; + + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, WRAM_Size), + SFARRAY(CHRRAM, 8192), + SFARRAY(DRegs, 4), + SFVAR(lreset), + SFVAR(Buffer), + SFVAR(BufferShift), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + MMC1MIRROR(); + MMC1CHR(); + MMC1PRG(); + lreset=0; /* timestamp(base) is not stored in save states. */ + } + return(ret); +} + +static int GenMMC1Init(CartInfo *info, int prg, int chr, int wram, int battery) +{ + is155=0; + + info->StateAction = StateAction; + info->Close=GenMMC1Close; + MMC1PRGHook16=MMC1CHRHook4=0; + mmc1opts=0; + PRGmask16[0]&=(prg>>14)-1; + CHRmask4[0]&=(chr>>12)-1; + CHRmask8[0]&=(chr>>13)-1; + + WRAM_Size = wram * 1024; + if(wram) + { + if(!(WRAM=(uint8*)malloc(wram*1024))) + { + GenMMC1Close(); + return(0); + } + mmc1opts|=1; + if(wram>8) mmc1opts|=4; + SetupCartPRGMapping(0x10,WRAM,wram*1024,1); + + if(battery) + { + mmc1opts|=2; + + info->SaveGame[0]=WRAM+((mmc1opts&4)?8192:0); + info->SaveGameLen[0]=8192; + } + } + if(!chr) + { + if(!(CHRRAM=(uint8*)malloc(8192))) + { + GenMMC1Close(); + return(0); + } + SetupCartCHRMapping(0, CHRRAM, 8192, 1); + } + info->Power=GenMMC1Power; + + + #ifdef WANT_DEBUGGER + MDFNDBG_AddRegGroup(&DBGMMC1RegsGroup); + #endif + + SetWriteHandler(0x8000,0xFFFF,MMC1_write); + SetReadHandler(0x8000,0xFFFF,CartBR); + + if(mmc1opts&1) + { + MDFNMP_AddRAM(8192,0x6000,WRAM); + SetReadHandler(0x6000,0x7FFF,MAWRAM); + SetWriteHandler(0x6000,0x7FFF,MBWRAM); + } + + return(1); +} + +int Mapper1_Init(CartInfo *info) +{ + int ws=DetectMMC1WRAMSize(info->CRC32); + return(GenMMC1Init(info, 512, 256, ws, info->battery)); +} + +/* Same as mapper 1, without respect for WRAM enable bit. */ +int Mapper155_Init(CartInfo *info) +{ + int ret = GenMMC1Init(info,512,256,8,info->battery); + + is155=1; + + return(ret); +} + +//static void GenMMC1Init(int prg, int chr, int wram, int battery) +int SAROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 128, 64, 8, info->battery)); +} + +int SBROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 128, 64, 0, 0)); +} + +int SCROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 128, 128, 0, 0)); +} + +int SEROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 32, 64, 0, 0)); +} + +int SGROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 0, 0, 0)); +} + +int SKROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 64, 8, info->battery)); +} + +int SLROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 128, 0, 0)); +} + +int SL1ROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 128, 128, 0, 0)); +} + +/* Begin unknown - may be wrong - perhaps they use different MMC1s from the + similarly functioning boards? +*/ + +int SL2ROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 256, 0, 0)); +} + +int SFROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 256, 0, 0)); +} + +int SHROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 256, 0, 0)); +} + +/* End unknown */ +/* */ +/* */ + +int SNROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 0, 8, info->battery)); +} + +int SOROM_Init(CartInfo *info) +{ + return(GenMMC1Init(info, 256, 0, 16, info->battery)); +} + + diff --git a/Mednafen/mednafen/nes/boards/mmc2and4.cpp b/Mednafen/mednafen/nes/boards/mmc2and4.cpp new file mode 100644 index 0000000000..d82d969adf --- /dev/null +++ b/Mednafen/mednafen/nes/boards/mmc2and4.cpp @@ -0,0 +1,229 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latches[2]; +static uint8 CHRBanks[4]; +static uint8 Mirroring; +static uint8 PRGBank; + +static void latchcheck(uint32 VAddr) +{ + uint8 l,h; + + h=VAddr>>8; + + if(h>=0x20 || ((h&0xF)!=0xF)) + return; + + l=VAddr&0xF8; + + if(h<0x10) + { + if(l==0xD8) + { + setchr4(0x0000, CHRBanks[0]); + latches[0] = 0; + } + else if(l==0xE8) + { + setchr4(0x0000, CHRBanks[1]); + latches[0] = 1; + } + } + else + { + if(l==0xD8) + { + setchr4(0x1000, CHRBanks[2]); + latches[1] = 0; + } + else if(l==0xE8) + { + setchr4(0x1000, CHRBanks[3]); + latches[1] = 1; + } + } +} + +static DECLFW(MMC2_PRG_Write) // $Axxx +{ + PRGBank = V & 0xF; + setprg8(0x8000, PRGBank); +} + +static DECLFW(MMC4_PRG_Write) +{ + PRGBank = V & 0xF; + setprg16(0x8000, PRGBank); +} + +static void CHRSync(void) +{ + if(latches[0] == 0) + setchr4(0x0000, CHRBanks[0]); + else + setchr4(0x0000, CHRBanks[1]); + + if(latches[1] == 0) + setchr4(0x1000, CHRBanks[2]); + else + setchr4(0x1000, CHRBanks[3]); +} + +static DECLFW(CommonWrite) +{ + switch(A&0xF000) + { + case 0xB000: + CHRBanks[0] = V & 0x1F; + CHRSync(); + break; + case 0xC000: + CHRBanks[1] = V & 0x1F; + CHRSync(); + break; + case 0xD000: + CHRBanks[2] = V & 0x1F; + CHRSync(); + break; + case 0xE000: + CHRBanks[3] = V & 0x1F; + CHRSync(); + break; + case 0xF000: + setmirror((V & 1) ^ 1); + Mirroring = V & 1; + break; + } +} + +static void MMC2_Power(CartInfo *info) +{ + int x; + + latches[0] = latches[1] = 1; + for(x = 0; x < 4; x++) + CHRBanks[x] = 0x1F; + CHRSync(); + + PRGBank = 0; + + setprg8(0x8000, 0x00); + setprg8(0xA000, 0x0D); + setprg8(0xC000, 0x0E); + setprg8(0xE000, 0x0F); +} + +static int MMC2_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYN(CHRBanks, 4, "CHRBanks"), + SFVARN(PRGBank, "PRGBank"), + SFARRAYN(latches, 2, "latches"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MMC2"); + + if(load) + { + CHRSync(); + setmirror(Mirroring ^ 1); + setprg8(0x8000, PRGBank); + } + + return(ret); +} + +// MMC2, also covers PEEOROM +int PNROM_Init(CartInfo *info) +{ + info->Power = MMC2_Power; + info->StateAction = MMC2_StateAction; + SetWriteHandler(0xA000,0xAFFF, MMC2_PRG_Write); + SetWriteHandler(0xB000,0xFFFF, CommonWrite); + SetReadHandler(0x8000, 0xFFFF, CartBR); + PPU_hook = latchcheck; + + return(1); +} + +static uint8 MMC4_WRAM[8192]; + +static void MMC4_Power(CartInfo *info) +{ + int x; + + latches[0] = latches[1] = 1; + for(x = 0; x < 4; x++) + CHRBanks[x] = 0x1F; + CHRSync(); + PRGBank = 0; + setprg16(0x8000, 0); + setprg16(0xc000, 0xF); + + setprg8r(0x10, 0x6000, 0); + + if(!info->battery) + memset(MMC4_WRAM, 0xFF, 8192); +} + +static int MMC4_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYN(CHRBanks, 4, "CHRBanks"), + SFVARN(PRGBank, "PRGBank"), + SFARRAYN(latches, 2, "latches"), + SFARRAYN(MMC4_WRAM, 8192, "WRAM"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MMC2"); + if(load) + { + CHRSync(); + setmirror(Mirroring ^ 1); + setprg16(0x8000, PRGBank); + } + + return(ret); +} + +int MMC4_Init(CartInfo *info) +{ + info->StateAction = MMC4_StateAction; + info->Power = MMC4_Power; + SetWriteHandler(0xA000, 0xAFFF, MMC4_PRG_Write); + SetWriteHandler(0xB000, 0xFFFF, CommonWrite); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + SetupCartPRGMapping(0x10, MMC4_WRAM, 8192, 1); + + + info->SaveGame[0] = MMC4_WRAM; + info->SaveGameLen[0] = 8192; + + PPU_hook = latchcheck; + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/mmc3.cpp b/Mednafen/mednafen/nes/boards/mmc3.cpp new file mode 100644 index 0000000000..cd50bcaf1a --- /dev/null +++ b/Mednafen/mednafen/nes/boards/mmc3.cpp @@ -0,0 +1,1704 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2003 Xodnizel + * Mapper 12 code Copyright (C) 2003 CaH4e3 + * UNL6035052 code Copyright (C) 2005 CaH4e3 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Code for emulating iNES mappers 4, 118,119 */ + +#include "mapinc.h" + +static uint8 resetmode,MMC3_cmd,A000B,A001B; +static uint8 DRegBuf[8]; + +static uint8 *WRAM; +static uint8 *CHRRAM; +static uint32 CHRRAMSize; + +static uint8 PPUCHRBus; +static uint8 TKSMIR[8]; +static uint8 EXPREGS[8], EXPRCount, cmdin; /* For bootleg games, mostly. */ +static uint8 IRQCount,IRQLatch,IRQa; +static uint8 IRQReload; + +static void (*pwrap)(uint32 A, uint8 V); +static void (*cwrap)(uint32 A, uint8 V); +static void (*mwrap)(uint8 V); + +static int mmc3opts; + +static void GenMMC3Close(void); +static int GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery); +static void GenMMC3Power(CartInfo *info); +static void FixMMC3PRG(int V); +static void FixMMC3CHR(int V); + +static void FixMMC3PRG(int V) +{ + if(V&0x40) + { + pwrap(0xC000,DRegBuf[6]); + pwrap(0x8000,~1); + } + else + { + pwrap(0x8000,DRegBuf[6]); + pwrap(0xC000,~1); + } + pwrap(0xA000,DRegBuf[7]); + pwrap(0xE000,~0); +} + +static void FixMMC3CHR(int V) +{ + int cbase=(V&0x80)<<5; + cwrap((cbase^0x000),DRegBuf[0]&(~1)); + cwrap((cbase^0x400),DRegBuf[0]|1); + cwrap((cbase^0x800),DRegBuf[1]&(~1)); + cwrap((cbase^0xC00),DRegBuf[1]|1); + + cwrap(cbase^0x1000,DRegBuf[2]); + cwrap(cbase^0x1400,DRegBuf[3]); + cwrap(cbase^0x1800,DRegBuf[4]); + cwrap(cbase^0x1c00,DRegBuf[5]); +} + +static void MMC3RegReset(void) +{ + IRQCount=IRQLatch=IRQa=MMC3_cmd=0; + + DRegBuf[0]=0; + DRegBuf[1]=2; + DRegBuf[2]=4; + DRegBuf[3]=5; + DRegBuf[4]=6; + DRegBuf[5]=7; + DRegBuf[6]=0; + DRegBuf[7]=1; + + FixMMC3PRG(0); + FixMMC3CHR(0); +} + +static void MMC3RegReset(CartInfo *info) +{ + MMC3RegReset(); +} + +static DECLFW(MMC3_CMDWrite) +{ + switch(A&0xE001) + { + case 0x8000: + if((V&0x40) != (MMC3_cmd&0x40)) + FixMMC3PRG(V); + if((V&0x80) != (MMC3_cmd&0x80)) + FixMMC3CHR(V); + MMC3_cmd = V; + break; + + case 0x8001: + { + int cbase=(MMC3_cmd&0x80)<<5; + DRegBuf[MMC3_cmd&0x7]=V; + switch(MMC3_cmd&0x07) + { + case 0: cwrap((cbase^0x000),V&(~1)); + cwrap((cbase^0x400),V|1); + break; + case 1: cwrap((cbase^0x800),V&(~1)); + cwrap((cbase^0xC00),V|1); + break; + case 2: cwrap(cbase^0x1000,V); break; + case 3: cwrap(cbase^0x1400,V); break; + case 4: cwrap(cbase^0x1800,V); break; + case 5: cwrap(cbase^0x1C00,V); break; + case 6: if (MMC3_cmd&0x40) pwrap(0xC000,V); + else pwrap(0x8000,V); + break; + case 7: pwrap(0xA000,V); + break; + } + } + break; + + case 0xA000: + if(mwrap) mwrap(V&1); + break; + case 0xA001: + A001B=V; + break; + } +} + +static DECLFW(MMC3_IRQWrite) +{ + switch(A&0xE001) + { + case 0xc000:IRQLatch=V;break; + case 0xc001:IRQReload = 1;break; + case 0xE000:X6502_IRQEnd(MDFN_IQEXT);IRQa=0;break; + case 0xE001:IRQa=1;break; + } +} + + + +static void ClockMMC3Counter(void) +{ + int count = IRQCount; + if(!count || IRQReload) + { + IRQCount = IRQLatch; + IRQReload = 0; + } + else IRQCount--; + if(count && !IRQCount) + { + if(IRQa) + { + X6502_IRQBegin(MDFN_IQEXT); + } + } +} + +static void MMC3_hb(void) +{ + ClockMMC3Counter(); +} + +static void MMC3_hb_KickMasterHack(void) +{ + if(scanline==238) + ClockMMC3Counter(); + ClockMMC3Counter(); +} + +static void MMC3_hb_PALStarWarsHack(void) +{ + if(scanline==240) + ClockMMC3Counter(); + ClockMMC3Counter(); +} +/* +static void ClockMMC6Counter(void) +{ + unsigned int count = IRQCount; + + if(!count || IRQReload) + { + IRQCount = IRQLatch; + IRQReload = 0; + } + else IRQCount--; + if(!IRQCount) + { + if(IRQa) + X6502_IRQBegin(MDFN_IQEXT); + } +} +*/ + + +/* +static uint32 lasta; +static void MMC3_PPUIRQ(uint32 A) +{ + if(A&0x2000) return; + if((A&0x1000) && !(lasta&0x1000)) + ClockMMC3Counter(); + lasta = A; +} +*/ + +static void GENCWRAP(uint32 A, uint8 V) +{ + setchr1(A,V); +} + +static void GENPWRAP(uint32 A, uint8 V) +{ + setprg8(A,V&0x3F); +} + +static void GENMWRAP(uint8 V) +{ + A000B=V; + setmirror(V^1); +} + +static void GENNOMWRAP(uint8 V) +{ + A000B=V; +} + + + +static void M12CW(uint32 A, uint8 V) +{ + setchr1(A,(EXPREGS[(A&0x1000)>>12]<<8)+V); +} + +static DECLFW(M12Write) +{ + EXPREGS[0]= V&0x01; + EXPREGS[1]= (V&0x10)>>4; +} + +static void M12_Power(CartInfo *info) +{ + EXPREGS[0]=EXPREGS[1]=0; + GenMMC3Power(info); +} + +int Mapper12_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) return(0); + + SetWriteHandler(0x4100,0x5FFF,M12Write); + + cwrap=M12CW; + info->Power=M12_Power; + EXPRCount = 2; + + return(1); +} + +static void M47PW(uint32 A, uint8 V) +{ + V&=0xF; + V|=EXPREGS[0]<<4; + setprg8(A,V); +} + +static void M47CW(uint32 A, uint8 V) +{ + uint32 NV=V; + NV&=0x7F; + NV|=EXPREGS[0]<<7; + setchr1(A,NV); +} + +static DECLFW(M47Write) +{ + EXPREGS[0]=V&1; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +static void M47_Power(CartInfo *info) +{ + EXPREGS[0]=0; + GenMMC3Power(info); +} + +int Mapper47_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) return(0); + + SetWriteHandler(0x6000,0x7FFF,M47Write); + SetReadHandler(0x6000,0x7FFF,0); + + pwrap=M47PW; + cwrap=M47CW; + info->Power=M47_Power; + EXPRCount = 1; + return(1); +} + +static void M44PW(uint32 A, uint8 V) +{ + uint32 NV=V; + if(EXPREGS[0]>=6) NV&=0x1F; + else NV&=0x0F; + NV|=EXPREGS[0]<<4; + setprg8(A,NV); +} + +static void M44CW(uint32 A, uint8 V) +{ + uint32 NV=V; + if(EXPREGS[0]<6) NV&=0x7F; + NV|=EXPREGS[0]<<7; + setchr1(A,NV); +} + +static DECLFW(Mapper44_write) +{ + if(A&1) + { + EXPREGS[0]=V&7; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } + else + MMC3_CMDWrite(A,V); +} + +static void M44_Power(CartInfo *info) +{ + EXPREGS[0]=0; + GenMMC3Power(info); +} + +int Mapper44_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) return(0); + + SetWriteHandler(0xA000,0xBFFF,Mapper44_write); + + cwrap=M44CW; + pwrap=M44PW; + info->Power=M44_Power; + EXPRCount = 1; + return(1); +} + +static void M52PW(uint32 A, uint8 V) +{ + uint32 NV=V; + NV&=0x1F^((EXPREGS[0]&8)<<1); + NV|=((EXPREGS[0]&6)|((EXPREGS[0]>>3)&EXPREGS[0]&1))<<4; + setprg8(A,NV); +} + +static void M52CW(uint32 A, uint8 V) +{ + uint32 NV=V; + NV&=0xFF^((EXPREGS[0]&0x40)<<1); + NV|=(((EXPREGS[0]>>3)&4)|((EXPREGS[0]>>1)&2)|((EXPREGS[0]>>6)&(EXPREGS[0]>>4)&1))<<7; + setchr1(A,NV); +} + +static DECLFW(Mapper52_write) +{ + if(EXPREGS[1]) + { + WRAM[A-0x6000]=V; + return; + } + EXPREGS[1]=1; + EXPREGS[0]=V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +static void M52Reset(CartInfo *info) +{ + EXPREGS[0]=EXPREGS[1]=0; + MMC3RegReset(info); +} + +static void M52Power(CartInfo *info) +{ + M52Reset(info); + GenMMC3Power(info); +} + +int Mapper52_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + + SetWriteHandler(0x6000,0x7FFF,Mapper52_write); + + cwrap=M52CW; + pwrap=M52PW; + info->Reset=M52Reset; + info->Power=M52Power; + EXPRCount = 2; + return(1); +} + +static void M45CW(uint32 A, uint8 V) +{ + uint32 NV=V; + if(EXPREGS[2]&8) + NV&=(1<<( (EXPREGS[2]&7)+1 ))-1; + else + NV&=0; + NV|=EXPREGS[0]|((EXPREGS[2]&0xF0)<<4); // &0x10(not 0xf0) is valid given the original + // description of mapper 45 by kevtris, + // but this fixes Super 8 in 1. + setchr1(A,NV); +} + +static void M45PW(uint32 A, uint8 V) +{ + //V=((V&(EXPREGS[3]^0xFF))&0x3f)|EXPREGS[1]; + V&=(EXPREGS[3]&0x3F)^0x3F; + V|=EXPREGS[1]; + //printf("$%04x, $%02x\n",A,V); + setprg8(A,V); +} + +static DECLFW(Mapper45_write) +{ + //printf("$%02x, %d\n",V,EXPREGS[4]); + if(EXPREGS[3]&0x40) + { + WRAM[A-0x6000]=V; + return; + } + EXPREGS[EXPREGS[4]]=V; + EXPREGS[4]=(EXPREGS[4]+1)&3; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +static void M45Reset(CartInfo *info) +{ + memset(EXPREGS,0,5); + MMC3RegReset(info); +} + +static void M45Power(CartInfo *info) +{ + M45Reset(info); + GenMMC3Power(info); +} + +int Mapper45_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + + SetWriteHandler(0x6000,0x7FFF,Mapper45_write); + + cwrap=M45CW; + pwrap=M45PW; + + info->Reset=M45Reset; + info->Power=M45Power; + + EXPRCount = 5; + return(1); +} + +static void M49PW(uint32 A, uint8 V) +{ + if(EXPREGS[0]&1) + { + V&=0xF; + V|=(EXPREGS[0]&0xC0)>>2; + setprg8(A,V); + } + else + setprg32(0x8000,(EXPREGS[0]>>4)&3); +} + +static void M49CW(uint32 A, uint8 V) +{ + uint32 NV=V; + NV&=0x7F; + NV|=(EXPREGS[0]&0xC0)<<1; + setchr1(A,NV); +} + +static DECLFW(M49Write) +{ + //printf("$%04x:$%02x\n",A,V); + if(A001B&0x80) + { + EXPREGS[0]=V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } +} + +static void M49Reset(CartInfo *info) +{ + EXPREGS[0]=0; + MMC3RegReset(info); +} + +static void M49Power(CartInfo *info) +{ + M49Reset(info); + GenMMC3Power(info); +} + +int Mapper49_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 0, 0))) + return(0); + + SetWriteHandler(0x6000,0x7FFF,M49Write); + SetReadHandler(0x6000,0x7FFF,0); + + cwrap=M49CW; + pwrap=M49PW; + info->Reset=M49Reset; + info->Power=M49Power; + + EXPRCount = 1; + return(1); +} + +static void M115PW(uint32 A, uint8 V) +{ + if(EXPREGS[0]&0x80) + setprg32(0x8000,(EXPREGS[0]&7) >> 1); + else + setprg8(A,V); +} + +static void M115CW(uint32 A, uint8 V) +{ + setchr1(A,(uint32)V|((EXPREGS[1]&1)<<8)); +} + +static DECLFW(M115Write) +{ + if(A==0x6000) + EXPREGS[0]=V; + else if(A==0x6001) + EXPREGS[1]=V; + FixMMC3PRG(MMC3_cmd); +} + +static void M115Power(CartInfo *info) +{ + GenMMC3Power(info); +} + +int Mapper115_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 512, 0, 0))) + return(0); + + SetWriteHandler(0x6000,0x7FFF,M115Write); + SetReadHandler(0x6000,0x7FFF,0); + + cwrap=M115CW; + pwrap=M115PW; + info->Power=M115Power; + EXPRCount = 2; + + return(1); +} + +static void M116PW(uint32 A, uint8 V) +{ + // setprg8(A,(V&0xF)|((EXPREGS[1]&0x2)<<3)); + // setprg8(A,(V&7)|(<<3)); + setprg8(A,V); + if(!(EXPREGS[1]&2)) + { + setprg16(0x8000,1); //EXPREGS[2]); + } +} + +static void M116CW(uint32 A, uint8 V) +{ + //if(EXPREGS[1]&2) + setchr1(A,V|((EXPREGS[0]&0x4)<<6)); + //else + //{ + // setchr1(A,(V&7)|((EXPREGS[2])<<3)); + //} +} + +static DECLFW(M116Write) +{ + if(A==0x4100) {EXPREGS[0]=V;setmirror(V&1);} + else if(A==0x4141) EXPREGS[1]=V; + else if(A==0xa000) EXPREGS[2]=V; + else if(A==0x4106) EXPREGS[3]=V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +// MIRROR_SET(0); + //printf("Wr: $%04x:$%02x, $%04x, %d, %d\n",A,V,X.PC,timestamp,scanline); +} +static DECLFW(M116Write2) +{ + //printf("Wr2: %04x:%02x\n",A,V); +} +static void M116Power(CartInfo *info) +{ + + EXPREGS[0]=0; + EXPREGS[1]=2; + EXPREGS[2]=0; + EXPREGS[3]=0; + + GenMMC3Power(info); +} + +int Mapper116_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 0, 0))) + return(0); + + SetWriteHandler(0x4020,0x7fff,M116Write); + SetWriteHandler(0xa000,0xbfff,M116Write2); + + cwrap=M116CW; + pwrap=M116PW; + info->Power=M116Power; + EXPRCount = 4; + + return(1); +} + +static void M165CW(uint32 A, uint8 V) +{ + if(V==0) + setchr4r(0x10,A,0); + else + setchr4(A,V>>2); +} + +static void M165PPUSync(void) +{ + if(EXPREGS[0] == 0xFD) + M165CW(0x0000, DRegBuf[0]); + else + M165CW(0x0000, DRegBuf[1]); + + if(EXPREGS[0] == 0xFD) + M165CW(0x1000, DRegBuf[2]); + else + M165CW(0x1000, DRegBuf[3]); +} + +static void M165PPU(uint32 A, uint8 V) +{ + M165PPUSync(); +} + +static void ppu165(uint32 VAddr) +{ + uint8 l,h; + + h=VAddr>>8; + + if(h>=0x20 || ((h&0xF)!=0xF)) + return; + + l=VAddr&0xF8; + + if(h<0x10) + { + if(l==0xD8) + { + EXPREGS[0]=0xFD; + M165PPUSync(); + } + else if(l==0xE8) + { + EXPREGS[0]=0xFE; + M165PPUSync(); + } + } + else + { + if(l==0xD8) + { + EXPREGS[1]=0xFD; + M165PPUSync(); + } + else if(l==0xE8) + { + EXPREGS[1]=0xFE; + M165PPUSync(); + } + } +} + + +int Mapper165_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 128, 8, info->battery))) + return(0); + + cwrap=M165PPU; + if(!(CHRRAM = (uint8*)malloc(4096))) + { + GenMMC3Close(); + return(0); + } + + EXPREGS[0]=0xFD; + EXPREGS[1]=0xFE; + PPU_hook=ppu165; + + CHRRAMSize = 4096; + SetupCartCHRMapping(0x10, CHRRAM, 4096, 1); + EXPRCount = 4; + return(1); +} + +// ---------------------------- Mapper 215 ------------------------------ + +static const uint8 m215_perm[8] = {0, 2, 5, 3, 6, 1, 7, 4}; + +static void M215CW(uint32 A, uint8 V) +{ + if(EXPREGS[1]&0x04) + setchr1(A,V|0x100); + else + setchr1(A,(V&0x7F)|((EXPREGS[1]&0x10)<<3)); +// setchr1(A,V|((EXPREGS[1]&0x4)<<6)); +} + +static void M215PW(uint32 A, uint8 V) +{ + if(EXPREGS[1]&0x08) + setprg8(A,(V&0x1F)|0x20); + else + setprg8(A,(V&0x0F)|(EXPREGS[1]&0x10)); +} + +static DECLFW(M215Write) +{ + if(!(EXPREGS[2])) + { + if(A >= 0xc000) + MMC3_IRQWrite(A, V); + else + MMC3_CMDWrite(A,V); + } + else switch(A&0xE001) + { + case 0xE000: X6502_IRQEnd(MDFN_IQEXT); IRQa=0; break; + case 0xE001: IRQCount=V; break; + case 0xC001: IRQa=1; break; + case 0xC000: MMC3_CMDWrite(0xA000,V|(V>>7)); break; + case 0xA000: MMC3_CMDWrite(0x8000,(V&0xC0)|(m215_perm[V&7])); cmdin=1; break; + case 0x8001: + if(!cmdin||((EXPREGS[0]&0x80)&&(((MMC3_cmd&7)==6)||((MMC3_cmd&7)==7)))) break; + MMC3_CMDWrite(0x8001,V); + cmdin=0; + break; + } +} + +static DECLFW(M215ExWrite) +{ + switch(A) + { + case 0x5000: + EXPREGS[0]=V; + if(V&0x80) + { + setprg16(0x8000,(V&0x0F)|(EXPREGS[1]&0x10)); + setprg16(0xC000,(V&0x0F)|(EXPREGS[1]&0x10)); + } + else + FixMMC3PRG(MMC3_cmd); + break; + case 0x5001: +// FCEU_printf("CMD: %04x:%04x\n",A,V); + EXPREGS[1]=V; + FixMMC3CHR(MMC3_cmd); + break; + case 0x5007: + EXPREGS[2]=V; + MMC3RegReset(); + break; + } +} + +static void M215Power(CartInfo *info) +{ + EXPREGS[0]=0; + EXPREGS[1]=0xFF; + EXPREGS[2]=4; + GenMMC3Power(info); +} + +int Mapper215_Init(CartInfo *info) +{ + GenMMC3_Init(info, 256, 256, 0, 0); + + SetWriteHandler(0x8000,0xFFFF,M215Write); + SetWriteHandler(0x5000,0x7FFF,M215ExWrite); + + cwrap=M215CW; + pwrap=M215PW; + info->Power=M215Power; + EXPRCount = 3; + + return(1); +} + + +// ---------------------------- Mapper 217 ------------------------------ + +static const uint8 m217_perm[8] = {0, 6, 3, 7, 5, 2, 4, 1}; + +static void M217CW(uint32 A, uint8 V) +{ + if(EXPREGS[1]&0x08) + setchr1(A,V|((EXPREGS[1]&3)<<8)); + else + setchr1(A,(V&0x7F)|((EXPREGS[1]&3)<<8)|((EXPREGS[1]&0x10)<<3)); +} + +static void M217PW(uint32 A, uint8 V) +{ + if(EXPREGS[1]&0x08) + setprg8(A,(V&0x1F)|((EXPREGS[1]&3)<<5)); + else + setprg8(A,(V&0x0F)|((EXPREGS[1]&3)<<5)|(EXPREGS[1]&0x10)); +} + +static DECLFW(M217Write) +{ + if(!EXPREGS[2]) + { + if(A >= 0xc000) + MMC3_IRQWrite(A, V); + else + MMC3_CMDWrite(A,V); + } + else switch(A&0xE001) + { + case 0x8000: IRQCount=V; break; + case 0xE000: X6502_IRQEnd(MDFN_IQEXT);IRQa=0; break; + case 0xC001: IRQa=1; break; + case 0xA001: MMC3_CMDWrite(0xA000,V); break; + case 0x8001: MMC3_CMDWrite(0x8000,(V&0xC0)|(m217_perm[V&7])); cmdin=1; break; + case 0xA000: + if (!cmdin || ((EXPREGS[0]&0x80) && (((MMC3_cmd&7)==6)||((MMC3_cmd&7)==7)))) break; + MMC3_CMDWrite(0x8001,V); + cmdin=0; + break; + } +} + +static DECLFW(M217ExWrite) +{ + switch(A) + { + case 0x5000: + EXPREGS[0]=V; + if(EXPREGS[0]&0x80) + { + setprg16(0x8000,(V&0x0F)|((EXPREGS[1]&3)<<4)); + setprg16(0xC000,(V&0x0F)|((EXPREGS[1]&3)<<4)); + } + else + FixMMC3PRG(MMC3_cmd); + break; + case 0x5001: + EXPREGS[1]=V; + FixMMC3PRG(MMC3_cmd); + break; + case 0x5007: + EXPREGS[2]=V; + break; + } +} + +static void M217Power(CartInfo *info) +{ + EXPREGS[0]=0; + EXPREGS[1]=0xFF; + EXPREGS[2]=3; + GenMMC3Power(info); +} + +int Mapper217_Init(CartInfo *info) +{ + EXPRCount = 3; + GenMMC3_Init(info, 256, 256, 0, 0); + cwrap=M217CW; + pwrap=M217PW; + info->Power=M217Power; + + SetWriteHandler(0x8000,0xFFFF,M217Write); + SetWriteHandler(0x5000,0x7FFF,M217ExWrite); + + return(1); +} + + + +static DECLFW(Mapper250_write) +{ + MMC3_CMDWrite((A&0xE000)|((A&0x400)>>10),A&0xFF); +} + +static DECLFW(M250_IRQWrite) +{ + MMC3_IRQWrite((A&0xE000)|((A&0x400)>>10),A&0xFF); +} + +static void M250_Power(CartInfo *info) +{ + GenMMC3Power(info); +} + +int Mapper250_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + info->Power=M250_Power; + + SetWriteHandler(0x8000,0xBFFF,Mapper250_write); + SetWriteHandler(0xC000,0xFFFF,M250_IRQWrite); + + return(1); +} + +static void M249PW(uint32 A, uint8 V) +{ + if(EXPREGS[0]&0x2) + { + if(V<0x20) + V=(V&1)|((V>>3)&2)|((V>>1)&4)|((V<<2)&8)|((V<<2)&0x10); + else + { + V-=0x20; + V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0); + } + } + setprg8(A,V); +} + +static void M249CW(uint32 A, uint8 V) +{ + if(EXPREGS[0]&0x2) + V=(V&3)|((V>>1)&4)|((V>>4)&8)|((V>>2)&0x10)|((V<<3)&0x20)|((V<<2)&0xC0); + setchr1(A,V); +} + +static DECLFW(Mapper249_write) +{ + EXPREGS[0]=V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +static void M249Power(CartInfo *info) +{ + EXPREGS[0]=0; + GenMMC3Power(info); +} + +int Mapper249_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + cwrap=M249CW; + pwrap=M249PW; + info->Power=M249Power; + EXPRCount = 1; + + SetWriteHandler(0x5000,0x5000,Mapper249_write); + + return(1); +} + +static void M245CW(uint32 A, uint8 V) +{ + //printf("$%04x:$%02x\n",A,V); + //setchr1(A,V); + // + EXPREGS[0]=V; + FixMMC3PRG(MMC3_cmd); +} + +static void M245PW(uint32 A, uint8 V) +{ + setprg8(A,(V&0x3F)|((EXPREGS[0]&2)<<5)); + //printf("%d\n",(V&0x3F)|((EXPREGS[0]&2)<<5)); +} + +static void M245Power(CartInfo *info) +{ + EXPREGS[0]=0; + GenMMC3Power(info); +} + +int Mapper245_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + + info->Power=M245Power; + cwrap=M245CW; + pwrap=M245PW; + EXPRCount = 1; + + return(1); +} + +void m74p(uint32 a, uint8 v) +{ + setprg8(a,v&0x3f); +} + +void m74m(uint8 V) +{ + A000B = V; + setmirror(V ^ 1); +} + +static void m74kie(uint32 a, uint8 v) +{ + if(v == 0x8 || v == 0x9) //((PRGsize[0]>>16)&0x08) || v==1+((PRGsize[0]>>16)&0x08)) + setchr1r(0x10,a, v & 0x1); + else + setchr1r(0x0,a,v); +} + +static void M74_Power(CartInfo *info) +{ + GenMMC3Power(info); +} + +int Mapper74_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + cwrap=m74kie; + pwrap=m74p; + mwrap = m74m; + + info->Power = M74_Power; + + if(!(CHRRAM=(uint8*)malloc(2048))) + { + GenMMC3Close(); + return(0); + } + CHRRAMSize=2048; + SetupCartCHRMapping(0x10, CHRRAM, 2048, 1); + return(1); +} + +static void m148kie(uint32 a, uint8 v) +{ + if(v==128 || v==129) + setchr1r(0x10,a,v); + else + setchr1r(0x0,a,v); +} + +int Mapper148_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + cwrap=m148kie; + pwrap=m74p; + if(!(CHRRAM=(uint8*)malloc(2048))) + { + GenMMC3Close(); + return(0); + } + CHRRAMSize=2048; + SetupCartCHRMapping(0x10, CHRRAM, 2048, 1); + return(1); +} + + +static const uint8 UNL6035052_lut[4] = { 0x00, 0x02, 0x02, 0x03 }; + +static DECLFW(UNL6035052ProtWrite) +{ + EXPREGS[0]=UNL6035052_lut[V&3]; +} + +static DECLFR(UNL6035052ProtRead) +{ + return EXPREGS[0]; +} + +static void UNL6035052Power(CartInfo *info) +{ + GenMMC3Power(info); +} + +int UNL6035052_Init(CartInfo *info) +{ + if(!GenMMC3_Init(info, 128, 256, 0, 0)) + return(0); + + SetWriteHandler(0x4020,0x7FFF,UNL6035052ProtWrite); + SetReadHandler(0x4020,0x7FFF,UNL6035052ProtRead); + + info->Power=UNL6035052Power; + EXPRCount = 1; + + return(1); +} + + + +static void TKSPPU(uint32 A) +{ + //static uint8 z; + //if(A>=0x2000 || type<0) return; + //if(type<0) return; + A&=0x1FFF; + //if(scanline>=140 && scanline<=200) {setmirror(MI_1);return;} + //if(scanline>=140 && scanline<=200) + // if(scanline>=190 && scanline<=200) {setmirror(MI_1);return;} + // setmirror(MI_1); + //printf("$%04x\n",A); + + A>>=10; + PPUCHRBus=A; + setmirror(MI_0+TKSMIR[A]); +} + +static void TKSWRAP(uint32 A, uint8 V) +{ + TKSMIR[A>>10]=V>>7; + setchr1(A,V&0x7F); + if(PPUCHRBus==(A>>10)) + setmirror(MI_0+(V>>7)); +} + + +static void TQWRAP(uint32 A, uint8 V) +{ + setchr1r((V&0x40)>>2,A,V&0x3F); +} + +static int wrams; + +static DECLFW(MBWRAM) +{ + WRAM[A-0x6000]=V; +} + +static DECLFR(MAWRAM) +{ + return(WRAM[A-0x6000]); +} + +static DECLFW(MBWRAMMMC6) +{ + WRAM[A&0x3ff]=V; +} + +static DECLFR(MAWRAMMMC6) +{ + return(WRAM[A&0x3ff]); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, wrams), + SFARRAY(CHRRAM, CHRRAMSize), + SFARRAYN(DRegBuf, 8, "REGS"), + SFVARN(resetmode, "RMOD"), + SFVARN(MMC3_cmd, "CMD"), + SFVARN(A000B, "A000"), + SFVARN(A001B, "A001"), + SFVARN(IRQReload, "IRQR"), + SFVARN(IRQCount, "IRQC"), + SFVARN(IRQLatch, "IRQL"), + SFVARN(IRQa, "IRQA"), + SFVAR(PPUCHRBus), + SFARRAY(EXPREGS, EXPRCount), + SFVAR(cmdin), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + mwrap(A000B&1); + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } + return(ret); +} + +static void GenMMC3Power(CartInfo *info) +{ + A001B=A000B=0; + setmirror((A000B&1)^1); + if(mmc3opts&1) + { + if(!(mmc3opts&2)) + memset(WRAM, 0x00, wrams); + } + MMC3RegReset(info); + if(CHRRAM) + memset(CHRRAM,0,CHRRAMSize); +} + +static void GenMMC3Close(void) +{ + if(CHRRAM) + MDFN_free(CHRRAM); + if(WRAM) + MDFN_free(WRAM); + CHRRAM=WRAM=NULL; +} + +#ifdef WANT_DEBUGGER +enum +{ + MMC3_GSREG_CONTROL = 0, + MMC3_GSREG_MIRRORING, + MMC3_GSREG_WRAMPROTECT, + MMC3_GSREG_CHRBANK0, + MMC3_GSREG_CHRBANK1, + MMC3_GSREG_CHRBANK2, + MMC3_GSREG_CHRBANK3, + MMC3_GSREG_CHRBANK4, + MMC3_GSREG_CHRBANK5, + MMC3_GSREG_PRGBANK0, + MMC3_GSREG_PRGBANK1, + MMC3_GSREG_IRQCOUNT, + MMC3_GSREG_IRQLATCH, + MMC3_GSREG_IRQENABLE +}; + +static RegType DBGMMC3Regs[] = +{ + { MMC3_GSREG_CONTROL, "Control", "Command/Control", 1 }, + { MMC3_GSREG_MIRRORING, "Mirroring", "Mirroring", 1 }, + { MMC3_GSREG_WRAMPROTECT, "WRAMProtect", "Cart WRAM Protect", 1 }, + { MMC3_GSREG_CHRBANK0, "CHRBank0", "CHR Bank(2KiB) Register 0", 1 }, + { MMC3_GSREG_CHRBANK1, "CHRBank1", "CHR Bank(2KiB) Register 1", 1 }, + { MMC3_GSREG_CHRBANK2, "CHRBank2", "CHR Bank(1KiB) Register 2", 1 }, + { MMC3_GSREG_CHRBANK3, "CHRBank3", "CHR Bank(1KiB) Register 3", 1 }, + { MMC3_GSREG_CHRBANK4, "CHRBank4", "CHR Bank(1KiB) Register 4", 1 }, + { MMC3_GSREG_CHRBANK5, "CHRBank5", "CHR Bank(1KiB) Register 5", 1 }, + { MMC3_GSREG_PRGBANK0, "PRGBank0", "PRG Bank(8KiB, @8000 or C000) Register 0", 1 }, + { MMC3_GSREG_PRGBANK1, "PRGBank1", "PRG Bank(8KiB, @A000) Register 1", 1 }, + + { MMC3_GSREG_IRQCOUNT, "IRQCount", "IRQ Counter", 1 }, + { MMC3_GSREG_IRQLATCH, "IRQLatch", "IRQ Counter Latch", 1 }, + { MMC3_GSREG_IRQENABLE, "IRQEnable", "IRQ Counter Enable", 1 }, + + { 0, "", "", 0 }, +}; + +static uint32 MMC3DBG_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case MMC3_GSREG_CONTROL: + value = MMC3_cmd; + break; + + case MMC3_GSREG_CHRBANK0: + value = DRegBuf[0]; + break; + + case MMC3_GSREG_CHRBANK1: + value = DRegBuf[1]; + break; + + case MMC3_GSREG_CHRBANK2: + value = DRegBuf[2]; + break; + + case MMC3_GSREG_CHRBANK3: + value = DRegBuf[3]; + break; + + case MMC3_GSREG_CHRBANK4: + value = DRegBuf[4]; + break; + + case MMC3_GSREG_CHRBANK5: + value = DRegBuf[5]; + break; + + case MMC3_GSREG_PRGBANK0: + value = DRegBuf[6]; + break; + + case MMC3_GSREG_PRGBANK1: + value = DRegBuf[7]; + break; + + case MMC3_GSREG_IRQCOUNT: + value = IRQCount; + break; + + case MMC3_GSREG_IRQLATCH: + value = IRQLatch; + break; + + case MMC3_GSREG_IRQENABLE: + value = IRQa; + break; + + case MMC3_GSREG_MIRRORING: + value = A000B; + break; + + case MMC3_GSREG_WRAMPROTECT: + value = A001B; + break; + } + return(value); +} + +static void MMC3DBG_SetRegister(const unsigned int id, uint32 value) +{ + switch(id) + { + case MMC3_GSREG_CONTROL: + MMC3_cmd = value; + break; + + case MMC3_GSREG_CHRBANK0: + DRegBuf[0] = value; + break; + + case MMC3_GSREG_CHRBANK1: + DRegBuf[1] = value; + break; + + case MMC3_GSREG_CHRBANK2: + DRegBuf[2] = value; + break; + + case MMC3_GSREG_CHRBANK3: + DRegBuf[3] = value; + break; + + case MMC3_GSREG_CHRBANK4: + DRegBuf[4] = value; + break; + + case MMC3_GSREG_CHRBANK5: + DRegBuf[5] = value; + break; + + case MMC3_GSREG_PRGBANK0: + DRegBuf[6] = value; + break; + + case MMC3_GSREG_PRGBANK1: + DRegBuf[7] = value; + break; + + case MMC3_GSREG_IRQCOUNT: + IRQCount = value; + break; + + case MMC3_GSREG_IRQLATCH: + IRQLatch = value; + break; + + case MMC3_GSREG_IRQENABLE: + IRQa = value; + break; + + case MMC3_GSREG_MIRRORING: + A000B = value; + mwrap(A000B&1); + break; + + case MMC3_GSREG_WRAMPROTECT: + A001B = value; + break; + } + + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +static RegGroupType DBGMMC3RegsGroup = +{ + "MMC3", + DBGMMC3Regs, + MMC3DBG_GetRegister, + MMC3DBG_SetRegister, +}; + +#endif + +static int GenMMC3_Init(CartInfo *info, int prg, int chr, int wram, int battery) +{ + mmc3opts = 0; + + pwrap=GENPWRAP; + cwrap=GENCWRAP; + mwrap=GENMWRAP; + + wrams=wram*1024; + + PRGmask8[0]&=(prg>>13)-1; + CHRmask1[0]&=(chr>>10)-1; + CHRmask2[0]&=(chr>>11)-1; + + if(wram) + { + mmc3opts|=1; + if(!(WRAM=(uint8*)malloc(wram*1024))) + { + GenMMC3Close(); + return(0); + } + } + + if(battery) + { + mmc3opts|=2; + + info->SaveGame[0]=WRAM; + info->SaveGameLen[0]=wram*1024; + } + + if(!chr) + { + if(!(CHRRAM=(uint8*)malloc(8192))) + { + GenMMC3Close(); + return(0); + } + CHRRAMSize=8192; + SetupCartCHRMapping(0, CHRRAM, 8192, 1); + } + + info->StateAction = StateAction; + info->Power=GenMMC3Power; + info->Reset=MMC3RegReset; + info->Close=GenMMC3Close; + + //PPU_hook=MMC3_PPUIRQ; + + if(info->CRC32 == 0x5104833e) // Kick Master + GameHBIRQHook = MMC3_hb_KickMasterHack; + else if(info->CRC32 == 0x5a6860f1 || info->CRC32 == 0xae280e20) // Shougi Meikan '92/'93 + GameHBIRQHook = MMC3_hb_KickMasterHack; + else if(info->CRC32 == 0xfcd772eb) // PAL Star Wars, similar problem as Kick Master. + GameHBIRQHook = MMC3_hb_PALStarWarsHack; + else + GameHBIRQHook=MMC3_hb; + + #ifdef WANT_DEBUGGER + MDFNDBG_AddRegGroup(&DBGMMC3RegsGroup); + #endif + + SetWriteHandler(0x8000,0xBFFF,MMC3_CMDWrite); + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0xC000,0xFFFF,MMC3_IRQWrite); + + if(mmc3opts&1) + { + if(wrams==1024) + { + MDFNMP_AddRAM(1024,0x7000,WRAM); + SetReadHandler(0x7000,0x7FFF,MAWRAMMMC6); + SetWriteHandler(0x7000,0x7FFF,MBWRAMMMC6); + } + else + { + MDFNMP_AddRAM(wrams, 0x6000, WRAM); + SetReadHandler(0x6000,0x6000+wrams-1,MAWRAM); + SetWriteHandler(0x6000,0x6000+wrams-1,MBWRAM); + } + } + + return(1); +} + +static int hackm4; /* For Karnov, maybe others. BLAH. Stupid iNES format.*/ + +static void Mapper4Power(CartInfo *info) +{ + GenMMC3Power(info); + A000B=(hackm4^1)&1; + setmirror(hackm4); +} + +int Mapper4_Init(CartInfo *info) +{ + int ws=8; + + if((info->CRC32==0x93991433 || info->CRC32==0xaf65aa84)) + { + MDFN_printf(_("Low-G-Man can not work normally in the iNES format.\nThis game has been recognized by its CRC32 value, and the appropriate changes will be made so it will run.\nIf you wish to hack this game, you should use the UNIF format for your hack.\n\n")); + ws=0; + } + if(!(GenMMC3_Init(info,512,256,ws,info->battery))) + return(0); + info->Power=Mapper4Power; + hackm4=info->mirror; + return(1); +} + +int Mapper118_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + cwrap=TKSWRAP; + mwrap=GENNOMWRAP; + PPU_hook=TKSPPU; + return(1); +} + +int Mapper119_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 64, 0, 0))) + return(0); + cwrap=TQWRAP; + if(!(CHRRAM=(uint8*)malloc(8192))) + { + GenMMC3Close(); + return(0); + } + CHRRAMSize=8192; + SetupCartCHRMapping(0x10, CHRRAM, 8192, 1); + return(1); +} + +int TEROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 32, 32, 0, 0)); +} + +int TFROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 512, 64, 0, 0)); +} + +int TGROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 512, 0, 0, 0)); +} + +int TKROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 512, 256, 8, info->battery)); +} + +int TLROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 512, 256, 0, 0)); +} + +int TSROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 512, 256, 8, 0)); +} + +int TLSROM_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, 0))) + return(0); + + cwrap=TKSWRAP; + mwrap=GENNOMWRAP; + PPU_hook=TKSPPU; + return(1); +} + +int TKSROM_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 256, 8, info->battery))) + return(0); + + cwrap=TKSWRAP; + mwrap=GENNOMWRAP; + PPU_hook=TKSPPU; + return(1); +} + +int TQROM_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 512, 64, 0, 0))) + return(0); + cwrap=TQWRAP; + if(!(CHRRAM=(uint8*)malloc(8192))) + { + GenMMC3Close(); + return(0); + } + CHRRAMSize=8192; + SetupCartCHRMapping(0x10, CHRRAM, 8192, 1); + + return(0); +} + +static void M37PW(uint32 A, uint8 V) +{ + uint32 NV = V; + const unsigned Q = (EXPREGS[0] >> 2) & 1; + const unsigned B = EXPREGS[0] & 0x3; + + NV &= (Q << 3) | 0x7; + NV |= Q << 4; + NV |= (B + 5) & 0x8; + + setprg8(A, NV); +} + +static void M37CW(uint32 A, uint8 V) +{ + uint32 NV = V; + const unsigned Q = (EXPREGS[0] >> 2) & 1; + + NV &= 0x7F; + NV |= Q << 7; + + setchr1(A, NV); +} + +static DECLFW(M37Write) +{ + EXPREGS[0] = V & 0x7; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +static void M37_Power(CartInfo *info) +{ + EXPREGS[0] = 0; + GenMMC3Power(info); +} + +static void M37_Reset(CartInfo *info) +{ + EXPREGS[0] = 0; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); +} + +int Mapper37_Init(CartInfo *info) +{ + if(!(GenMMC3_Init(info, 256, 256, 0, 0))) + return(0); + + SetWriteHandler(0x6000, 0x7FFF, M37Write); + SetReadHandler(0x6000, 0x7FFF, 0); + + pwrap = M37PW; + cwrap = M37CW; + info->Power = M37_Power; + info->Reset = M37_Reset; + EXPRCount = 1; + + return(0); +} + +/* MMC6 board */ +int HKROM_Init(CartInfo *info) +{ + return(GenMMC3_Init(info, 512, 512, 1, info->battery)); +} diff --git a/Mednafen/mednafen/nes/boards/mmc5.cpp b/Mednafen/mednafen/nes/boards/mmc5.cpp new file mode 100644 index 0000000000..46a9ea5fad --- /dev/null +++ b/Mednafen/mednafen/nes/boards/mmc5.cpp @@ -0,0 +1,880 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* None of this code should use any of the iNES bank switching wrappers. */ + +#include "mapinc.h" +#include "../nsf.h" + +static void (*sfun)(int P); +static void (*psfun)(void); + +void MMC5RunSoundHQ(void); + +static INLINE void MMC5SPRVROM_BANK1(uint32 A,uint32 V) +{ + if(CHRptr[0]) + { + V&=CHRmask1[0]; + MMC5SPRVPage[(A)>>10]=&CHRptr[0][(V)<<10]-(A); + } +} + +static INLINE void MMC5BGVROM_BANK1(uint32 A,uint32 V) {if(CHRptr[0]){V&=CHRmask1[0];MMC5BGVPage[(A)>>10]=&CHRptr[0][(V)<<10]-(A);}} + +static INLINE void MMC5SPRVROM_BANK2(uint32 A,uint32 V) {if(CHRptr[0]){V&=CHRmask2[0];MMC5SPRVPage[(A)>>10]=MMC5SPRVPage[((A)>>10)+1]=&CHRptr[0][(V)<<11]-(A);}} +static INLINE void MMC5BGVROM_BANK2(uint32 A,uint32 V) {if(CHRptr[0]){V&=CHRmask2[0];MMC5BGVPage[(A)>>10]=MMC5BGVPage[((A)>>10)+1]=&CHRptr[0][(V)<<11]-(A);}} + +static INLINE void MMC5SPRVROM_BANK4(uint32 A,uint32 V) {if(CHRptr[0]){V&=CHRmask4[0];MMC5SPRVPage[(A)>>10]=MMC5SPRVPage[((A)>>10)+1]= MMC5SPRVPage[((A)>>10)+2]=MMC5SPRVPage[((A)>>10)+3]=&CHRptr[0][(V)<<12]-(A);}} +static INLINE void MMC5BGVROM_BANK4(uint32 A,uint32 V) {if(CHRptr[0]){V&=CHRmask4[0];MMC5BGVPage[(A)>>10]=MMC5BGVPage[((A)>>10)+1]=MMC5BGVPage[((A)>>10)+2]=MMC5BGVPage[((A)>>10)+3]=&CHRptr[0][(V)<<12]-(A);}} + +static INLINE void MMC5SPRVROM_BANK8(uint32 V) {if(CHRptr[0]){V&=CHRmask8[0];MMC5SPRVPage[0]=MMC5SPRVPage[1]=MMC5SPRVPage[2]=MMC5SPRVPage[3]=MMC5SPRVPage[4]=MMC5SPRVPage[5]=MMC5SPRVPage[6]=MMC5SPRVPage[7]=&CHRptr[0][(V)<<13];}} +static INLINE void MMC5BGVROM_BANK8(uint32 V) {if(CHRptr[0]){V&=CHRmask8[0];MMC5BGVPage[0]=MMC5BGVPage[1]=MMC5BGVPage[2]=MMC5BGVPage[3]=MMC5BGVPage[4]=MMC5BGVPage[5]=MMC5BGVPage[6]=MMC5BGVPage[7]=&CHRptr[0][(V)<<13];}} + +static uint8 PRGBanks[4]; +static uint8 WRAMPage; +static uint32 CHRBanksA[8], CHRBanksB[4]; +static uint8 WRAMMaskEnable[2]; +static uint8 ABMode; /* A=0, B=1 */ + +static uint8 IRQScanline,IRQEnable; +static uint8 CHRMode, NTAMirroring, NTFill, ATFill; + +static uint8 MMC5IRQR; +static uint8 MMC5LineCounter; +static uint8 mmc5psize, mmc5vsize; +static uint8 MMC5BigCHRSelect; +static uint8 mul[2]; + +static uint8 *WRAM=NULL; +static uint8 *MMC5fill=NULL; +static uint8 *ExRAM=NULL; + +static uint8 MMC5WRAMsize; +static uint8 MMC5WRAMIndex[8]; + +static uint8 MMC5ROMWrProtect[4]; +static uint8 MMC5MemIn[5]; + +static void MMC5CHRA(void); +static void MMC5CHRB(void); + +typedef struct __cartdata { + uint32 crc32; + uint8 size; +} cartdata; + + +// ETROM seems to have 16KB of WRAM, ELROM seems to have 8KB +// EWROM seems to have 32KB of WRAM + +#define MMC5_NOCARTS 14 +cartdata MMC5CartList[MMC5_NOCARTS]= +{ + {0x9c18762b,2}, /* L'Empereur */ + {0x26533405,2}, + {0x6396b988,2}, + + {0xaca15643,2}, /* Uncharted Waters */ + {0xfe3488d1,2}, /* Dai Koukai Jidai */ + + {0x15fe6d0f,2}, /* BKAC */ + {0x39f2ce4b,2}, /* Suikoden */ + + {0x8ce478db,2}, /* Nobunaga's Ambition 2 */ + {0xeee9a682,2}, + + {0x1ced086f,2}, /* Ishin no Arashi */ + + {0xf540677b,4}, /* Nobunaga...Bushou Fuuun Roku */ + + {0x6f4e4312,4}, /* Aoki Ookami..Genchou */ + + {0xf011e490,4}, /* Romance of the 3 Kingdoms 2 */ + {0x184c2124,4}, /* Sangokushi 2 */ +}; + + +int DetectMMC5WRAMSize(uint32 crc32) +{ + int x; + + for(x=0;x8KB external WRAM present. Use UNIF if you hack the ROM image.\n")); + return(MMC5CartList[x].size*8); + } + return(8); +} + +static void BuildWRAMSizeTable(void) +{ + int x; + + for(x=0;x<8;x++) + { + switch(MMC5WRAMsize) + { + case 0:MMC5WRAMIndex[x]=255;break; + case 1:MMC5WRAMIndex[x]=(x>3)?255:0;break; + case 2:MMC5WRAMIndex[x]=(x&4)>>2;break; + case 4:MMC5WRAMIndex[x]=(x>3)?255:(x&3);break; + } + } +} + +static void MMC5CHRA(void) +{ + int x; + switch(mmc5vsize&3) + { + case 0:setchr8(CHRBanksA[7]); + MMC5SPRVROM_BANK8(CHRBanksA[7]); + break; + case 1:setchr4(0x0000,CHRBanksA[3]); + setchr4(0x1000,CHRBanksA[7]); + MMC5SPRVROM_BANK4(0x0000,CHRBanksA[3]); + MMC5SPRVROM_BANK4(0x1000,CHRBanksA[7]); + break; + case 2:setchr2(0x0000,CHRBanksA[1]); + setchr2(0x0800,CHRBanksA[3]); + setchr2(0x1000,CHRBanksA[5]); + setchr2(0x1800,CHRBanksA[7]); + MMC5SPRVROM_BANK2(0x0000,CHRBanksA[1]); + MMC5SPRVROM_BANK2(0x0800,CHRBanksA[3]); + MMC5SPRVROM_BANK2(0x1000,CHRBanksA[5]); + MMC5SPRVROM_BANK2(0x1800,CHRBanksA[7]); + break; + case 3: + for(x=0;x<8;x++) + { + setchr1(x<<10,CHRBanksA[x]); + MMC5SPRVROM_BANK1(x<<10,CHRBanksA[x]); + } + break; + } +} + +static void MMC5CHRB(void) +{ + int x; + switch(mmc5vsize&3) + { + case 0: + setchr8(CHRBanksB[3]); + MMC5BGVROM_BANK8(CHRBanksB[3]); + break; + + case 1: + setchr4(0x0000,CHRBanksB[3]); + setchr4(0x1000,CHRBanksB[3]); + MMC5BGVROM_BANK4(0x0000,CHRBanksB[3]); + MMC5BGVROM_BANK4(0x1000,CHRBanksB[3]); + break; + + case 2: + setchr2(0x0000,CHRBanksB[1]); + setchr2(0x0800,CHRBanksB[3]); + setchr2(0x1000,CHRBanksB[1]); + setchr2(0x1800,CHRBanksB[3]); + MMC5BGVROM_BANK2(0x0000,CHRBanksB[1]); + MMC5BGVROM_BANK2(0x0800,CHRBanksB[3]); + MMC5BGVROM_BANK2(0x1000,CHRBanksB[1]); + MMC5BGVROM_BANK2(0x1800,CHRBanksB[3]); + break; + case 3: + for(x=0;x<8;x++) + { + setchr1(x<<10,CHRBanksB[x&3]); + MMC5BGVROM_BANK1(x<<10,CHRBanksB[x&3]); + } + break; + } +} + +static void MMC5WRAM(uint32 A, uint32 V) +{ + //printf("%02x\n",V); + V=MMC5WRAMIndex[V&7]; + if(V!=255) + { + setprg8r(0x10,A,V); + MMC5MemIn[(A-0x6000)>>13]=1; + } + else + MMC5MemIn[(A-0x6000)>>13]=0; +} + +static void MMC5PRG(void) +{ + int x; + + switch(mmc5psize&3) + { + case 0: + MMC5ROMWrProtect[0]=MMC5ROMWrProtect[1]= + MMC5ROMWrProtect[2]=MMC5ROMWrProtect[3]=1; + setprg32(0x8000,((PRGBanks[3]&0x7F)>>2)); + for(x=0;x<4;x++) + MMC5MemIn[1+x]=1; + break; + case 1: + if(PRGBanks[1]&0x80) + { + MMC5ROMWrProtect[0]=MMC5ROMWrProtect[1]=1; + setprg16(0x8000,(PRGBanks[1]>>1)); + MMC5MemIn[1]=MMC5MemIn[2]=1; + } + else + { + MMC5ROMWrProtect[0]=MMC5ROMWrProtect[1]=0; + MMC5WRAM(0x8000,PRGBanks[1]&7&0xFE); + MMC5WRAM(0xA000,(PRGBanks[1]&7&0xFE)+1); + } + MMC5MemIn[3]=MMC5MemIn[4]=1; + MMC5ROMWrProtect[2]=MMC5ROMWrProtect[3]=1; + setprg16(0xC000,(PRGBanks[3]&0x7F)>>1); + break; + case 2: + if(PRGBanks[1]&0x80) + { + MMC5MemIn[1]=MMC5MemIn[2]=1; + MMC5ROMWrProtect[0]=MMC5ROMWrProtect[1]=1; + setprg16(0x8000,(PRGBanks[1]&0x7F)>>1); + } + else + { + MMC5ROMWrProtect[0]=MMC5ROMWrProtect[1]=0; + MMC5WRAM(0x8000,PRGBanks[1]&7&0xFE); + MMC5WRAM(0xA000,(PRGBanks[1]&7&0xFE)+1); + } + if(PRGBanks[2]&0x80) + {MMC5ROMWrProtect[2]=1;MMC5MemIn[3]=1;setprg8(0xC000,PRGBanks[2]&0x7F);} + else + {MMC5ROMWrProtect[2]=0;MMC5WRAM(0xC000,PRGBanks[2]&7);} + MMC5MemIn[4]=1; + MMC5ROMWrProtect[3]=1; + setprg8(0xE000,PRGBanks[3]&0x7F); + break; + case 3: + for(x=0;x<3;x++) + if(PRGBanks[x]&0x80) + { + MMC5ROMWrProtect[x]=1; + setprg8(0x8000+(x<<13),PRGBanks[x]&0x7F); + MMC5MemIn[1+x]=1; + } + else + { + MMC5ROMWrProtect[x]=0; + MMC5WRAM(0x8000+(x<<13),PRGBanks[x]&7); + } + MMC5MemIn[4]=1; + MMC5ROMWrProtect[3]=1; + setprg8(0xE000,PRGBanks[3]&0x7F); + break; + } +} + +static DECLFW(Mapper5_write) +{ + if(A >= 0x5120 && A <= 0x5127) + { + MDFNPPU_LineUpdate(); + ABMode = 0; + CHRBanksA[A&7] = V | (MMC5BigCHRSelect << 8); + MMC5CHRA(); + } + else if(A >= 0x5128 && A <= 0x512B) + { + MDFNPPU_LineUpdate(); + ABMode=1; + CHRBanksB[A&3] = V | (MMC5BigCHRSelect << 8); + MMC5CHRB(); + } + else switch(A) + { + default: + //printf("$%04x, $%02x\n",A,V); + break; + case 0x5105: + MDFNPPU_LineUpdate(); + { + int x; + for(x=0;x<4;x++) + { + switch((V>>(x<<1))&3) + { + case 0:PPUNTARAM|=1<>3)&0x1F;break; + case 0x5202:MMC5HackSPPage=V&0x3F;break; + case 0x5203:X6502_IRQEnd(MDFN_IQEXT);IRQScanline=V;break; + case 0x5204:X6502_IRQEnd(MDFN_IQEXT);IRQEnable=V&0x80;break; + case 0x5205:mul[0]=V;break; + case 0x5206:mul[1]=V;break; + } +} + +static DECLFR(MMC5_ReadROMRAM) +{ + if(MMC5MemIn[(A-0x6000)>>13]) + return Page[A>>11][A]; + else + return X.DB; +} + +static DECLFW(MMC5_WriteROMRAM) +{ + if(A>=0x8000) + if(MMC5ROMWrProtect[(A-0x8000)>>13]) + return; + if(MMC5MemIn[(A-0x6000)>>13]) + if(((WRAMMaskEnable[0]&3)|((WRAMMaskEnable[1]&3)<<2)) == 6) + Page[A>>11][A]=V; +} + +static DECLFW(MMC5_ExRAMWr) +{ + if(MMC5HackCHRMode!=3) + ExRAM[A&0x3ff]=V; +} + +static DECLFR(MMC5_ExRAMRd) +{ + /* Not sure if this is correct, so I'll comment it out for now. */ + //if(MMC5HackCHRMode>=2) + return ExRAM[A&0x3ff]; + //else + // return(X.DB); +} + +static DECLFR(MMC5_read) +{ + switch(A) + { + //default:printf("$%04x\n",A);break; + case 0x5204:X6502_IRQEnd(MDFN_IQEXT); + { + uint8 x; + x=MMC5IRQR; + if(!fceuindbg) + MMC5IRQR&=0x40; + return x; + } + case 0x5205:return (mul[0]*mul[1]); + case 0x5206:return ((mul[0]*mul[1])>>8); + } + return(X.DB); +} + +void MMC5Synco(void) +{ + int x; + + MMC5PRG(); + for(x=0;x<4;x++) + { + switch((NTAMirroring>>(x<<1))&3) + { + case 0:PPUNTARAM|=1<>2); + MMC5Sound.env[A>>2]=V; + break; + case 0x2: + case 0x6:if(sfun) sfun(A>>2); + MMC5Sound.wl[A>>2]&=~0x00FF; + MMC5Sound.wl[A>>2]|=V&0xFF; + break; + case 0x3: + case 0x7://printf("%04x:$%02x\n",A,V>>3); + MMC5Sound.wl[A>>2]&=~0x0700; + MMC5Sound.wl[A>>2]|=(V&0x07)<<8; + MMC5Sound.running|=1<<(A>>2); + break; + case 0x15:if(sfun) + { + sfun(0); + sfun(1); + } + MMC5Sound.running&=V; + MMC5Sound.enable=V; + //printf("%02x\n",V); + break; + } +} + +static void Do5SQHQ(int P) +{ + static const int tal[4]={1,2,4,6}; + uint32 V; + int32 amp,rthresh,wl; + + wl=MMC5Sound.wl[P]+1; + amp=((MMC5Sound.env[P]&0xF)<<8); + rthresh=tal[(MMC5Sound.env[P]&0xC0)>>6]; + + if(wl>=8 && (MMC5Sound.running&(P+1))) + { + int dc,vc; + + wl<<=1; + + dc=MMC5Sound.dcount[P]; + vc=MMC5Sound.vcount[P]; + for(V=MMC5Sound.BC[P];VHiSync = MMC5HiSync; + ep->HiFill = MMC5RunSoundHQ; +} + +void NSFMMC5_Close(void) +{ + if(ExRAM) + MDFN_free(ExRAM); + ExRAM=NULL; +} + +int NSFMMC5_Init(EXPSOUND *ep, bool MultiChip) +{ + try + { + memset(&MMC5Sound,0,sizeof(MMC5Sound)); + mul[0]=mul[1]=0; + + ExRAM = (uint8*)MDFN_malloc_T(1024, _("MMC5 EXRAM")); + + Mapper5_ESI(ep); + NSFECSetWriteHandler(0x5c00,0x5fef,MMC5_ExRAMWr); + SetReadHandler(0x5c00,0x5fef,MMC5_ExRAMRd); + MMC5HackCHRMode=2; + NSFECSetWriteHandler(0x5000,0x5015,Mapper5_SW); + NSFECSetWriteHandler(0x5205,0x5206,Mapper5_write); + SetReadHandler(0x5205,0x5206,MMC5_read); + } + catch(...) + { + NSFMMC5_Close(); + throw; + } + + return(1); +} + +static void GenMMC5Reset(CartInfo *info) +{ + int x; + + memset(ExRAM, 0, 0x400); + + MMC5BigCHRSelect = 0; + + for(x=0;x<4;x++) PRGBanks[x]=~0; + for(x=0;x<8;x++) CHRBanksA[x]=~0; + for(x=0;x<4;x++) CHRBanksB[x]=~0; + WRAMMaskEnable[0]=WRAMMaskEnable[1]=~0; + + mmc5psize=mmc5vsize=3; + CHRMode=0; + + NTAMirroring=NTFill=ATFill=0xFF; + + MMC5Synco(); + + //GameHBIRQHook=MMC5_hb; +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[]= + { + SFARRAY(WRAM, MMC5WRAMsize * 8192), + SFARRAY(ExRAM, 1024), + SFARRAYN(PRGBanks, 4, "PRGB"), + SFARRAY32N(CHRBanksA, 8, "CHRA"), + SFARRAY32N(CHRBanksB, 4, "CHRB"), + + SFVAR(MMC5BigCHRSelect), + SFVAR(mmc5psize), + SFVAR(mmc5vsize), + SFARRAY(mul, 2), + SFVAR(MMC5IRQR), + SFVAR(MMC5LineCounter), + + SFVARN(WRAMPage, "WRMP"), + SFARRAYN(WRAMMaskEnable, 2, "WRME"), + SFVARN(ABMode, "ABMD"), + SFVARN(IRQScanline, "IRQS"), + SFVARN(IRQEnable, "IRQE"), + SFVARN(CHRMode, "CHRM"), + SFVARN(NTAMirroring, "NTAM"), + SFVARN(NTFill, "NTFL"), + SFVARN(ATFill, "ATFL"), + + SFVARN(MMC5HackSPMode, "SPLM"), + SFVARN(MMC5HackSPScroll, "SPLS"), + SFVARN(MMC5HackSPPage, "SPLP"), + + SFVARN(MMC5Sound.wl[0], "SDW0"), + SFVARN(MMC5Sound.wl[1], "SDW1"), + SFARRAYN(MMC5Sound.env, 2, "SDEV"), + SFVARN(MMC5Sound.enable, "SDEN"), + SFVARN(MMC5Sound.running, "SDRU"), + SFVARN(MMC5Sound.raw, "SDRW"), + SFVARN(MMC5Sound.rawcontrol, "SDRC"), + SFVARN(MMC5Sound.vcount[0], "SDV0"), + SFVARN(MMC5Sound.vcount[1], "SDV1"), + SFVARN(MMC5Sound.dcount[0], "SDD0"), + SFVARN(MMC5Sound.dcount[1], "SDD1"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MMC5"); + + if(load) + { + MMC5BigCHRSelect &= 0x3; + MMC5HackCHRBank = MMC5BigCHRSelect; + MMC5Synco(); + } + + return(ret); +} + +static void GenMMC5_Close(void) +{ + if(WRAM) + { + MDFN_free(WRAM); + WRAM = NULL; + } + + if(MMC5fill) + { + MDFN_free(MMC5fill); + MMC5fill = NULL; + } + + if(ExRAM) + { + MDFN_free(ExRAM); + ExRAM = NULL; + } +} + +static int GenMMC5_Init(CartInfo *info, int wsize, int battery) +{ + try + { + info->StateAction = StateAction; + + if(wsize) + { + WRAM = (uint8*)MDFN_malloc_T(wsize*1024, _("WRAM")); + memset(WRAM, 0x00, wsize * 1024); + SetupCartPRGMapping(0x10,WRAM,wsize*1024,1); + } + + MMC5fill = (uint8*)MDFN_malloc_T(1024, _("MMC5 Fill")); + + ExRAM = (uint8*)MDFN_malloc_T(1024, _("MMC5 EXRAM")); + + MMC5WRAMsize=wsize/8; + BuildWRAMSizeTable(); + info->Power=GenMMC5Reset; + + if(battery) + { + info->SaveGame[0]=WRAM; + if(wsize<=16) + info->SaveGameLen[0]=8192; + else + info->SaveGameLen[0]=32768; + } + + MMC5HackVROMMask=CHRmask4[0]; + MMC5HackExNTARAMPtr=ExRAM; + MMC5Hack=1; + MMC5HackVROMPTR=CHRptr[0]; + MMC5HackCHRMode=0; + MMC5HackSPMode=MMC5HackSPScroll=MMC5HackSPPage=0; + + + Mapper5_ESI(&info->CartExpSound); + + SetWriteHandler(0x4020,0x5bff,Mapper5_write); + SetReadHandler(0x4020,0x5bff,MMC5_read); + + SetWriteHandler(0x5c00,0x5fff,MMC5_ExRAMWr); + SetReadHandler(0x5c00,0x5fff,MMC5_ExRAMRd); + + SetWriteHandler(0x6000,0xFFFF,MMC5_WriteROMRAM); + SetReadHandler(0x6000,0xFFFF,MMC5_ReadROMRAM); + + SetWriteHandler(0x5000,0x5015,Mapper5_SW); + SetWriteHandler(0x5205,0x5206,Mapper5_write); + SetReadHandler(0x5205,0x5206,MMC5_read); + + MDFNMP_AddRAM(8192, 0x6000, WRAM); + MDFNMP_AddRAM(1024, 0x5c00, ExRAM); + } + catch(...) + { + GenMMC5_Close(); + throw; + } + + return(1); +} + +int Mapper5_Init(CartInfo *info) +{ + return(GenMMC5_Init(info, DetectMMC5WRAMSize(info->CRC32), info->battery)); +} + +// ELROM seems to have 0KB of WRAM +// EKROM seems to have 8KB of WRAM +// ETROM seems to have 16KB of WRAM +// EWROM seems to have 32KB of WRAM + +// ETROM and EWROM are battery-backed, EKROM isn't. + +int ETROM_Init(CartInfo *info) +{ + return(GenMMC5_Init(info, 16,info->battery)); +} + +int ELROM_Init(CartInfo *info) +{ + return(GenMMC5_Init(info,0,0)); +} + +int EWROM_Init(CartInfo *info) +{ + return(GenMMC5_Init(info,32,info->battery)); +} + +int EKROM_Init(CartInfo *info) +{ + return(GenMMC5_Init(info,8,info->battery)); +} diff --git a/Mednafen/mednafen/nes/boards/n106.cpp b/Mednafen/mednafen/nes/boards/n106.cpp new file mode 100644 index 0000000000..c8b5c6d2ab --- /dev/null +++ b/Mednafen/mednafen/nes/boards/n106.cpp @@ -0,0 +1,552 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" +#include "../nsf.h" + +static uint16 IRQCount; +static uint8 IRQa; + +static uint8 WRAM[8192]; +static uint8 IRAM[128]; + +static DECLFR(AWRAM) +{ + return(WRAM[A-0x6000]); +} + +static DECLFW(BWRAM) +{ + WRAM[A-0x6000]=V; +} + +static uint8 NTAPage[4]; + +static uint8 dopol; +static uint8 gorfus; +static uint8 gorko; + +static void (*DoNamcoSound)(void) = NULL; +static void SyncHQ(int32 ts); + +static int is210; /* Lesser mapper. */ + +static uint8 PRG[3]; +static uint8 CHR[8]; + +static uint64 PlayIndexBS[8]; +static uint32 PlayIndex[8]; +static int32 vcount[8]; +static int32 CVBC; + +static void SyncPRG(void) +{ + setprg8(0x8000,PRG[0]); + setprg8(0xa000,PRG[1]); + setprg8(0xc000,PRG[2]); + setprg8(0xe000,0x3F); +} + +static void NamcoIRQHook(int a) +{ + if(IRQa) + { + IRQCount+=a; + if(IRQCount>=0x7FFF) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQa=0; + IRQCount=0x7FFF; //7FFF; + } + } +} + +static DECLFR(Namco_Read4800) +{ + uint8 ret=IRAM[dopol&0x7f]; + + /* Maybe I should call DoNamcoSound() here? */ + if(!fceuindbg) + if(dopol&0x80) + dopol=(dopol&0x80)|((dopol+1)&0x7f); + return ret; +} + +static DECLFR(Namco_Read5000) +{ + return(IRQCount); +} + +static DECLFR(Namco_Read5800) +{ + return(IRQCount>>8); +} + +static void DoNTARAMROM(int w, uint8 V) +{ + NTAPage[w]=V; + + if(V>=0xE0) + setntamem(NTARAM+((V&1)<<10), 1, w); + else + { + V&=CHRmask1[0]; + setntamem(CHRptr[0]+(V<<10), 0, w); + } +} + +static void FixNTAR(void) +{ + int x; + + for(x=0;x<4;x++) + DoNTARAMROM(x,NTAPage[x]); +} + +static void DoCHRRAMROM(int x, uint8 V) +{ + CHR[x]=V; + + if(!is210 && !((gorfus>>((x>>2)+6))&1) && (V>=0xE0)) + { + // printf("BLAHAHA: %d, %02x\n",x,V); + //setchr1r(0x10,x<<10,V&7); + } + else + { +// printf("Noha: %d, %02x\n",x,V); + setchr1(x<<10,V); + } +} + +static void FixCRR(void) +{ + int x; + for(x=0;x<8;x++) + DoCHRRAMROM(x,CHR[x]); +} + +static DECLFW(Mapper19C0D8_write) +{ + DoNTARAMROM((A-0xC000)>>11,V); +} + +static uint32 FreqCache[8]; +static uint32 EnvCache[8]; +static uint32 LengthCache[8]; + +static void FixCache(int a,int V) +{ + int w=(a>>3)&0x7; + switch(a&0x07) + { + case 0x00:FreqCache[w]&=~0x000000FF;FreqCache[w]|=V;break; + case 0x02:FreqCache[w]&=~0x0000FF00;FreqCache[w]|=V<<8;break; + case 0x04:FreqCache[w]&=~0x00030000;FreqCache[w]|=(V&3)<<16; + LengthCache[w] = 0x100 - (V & 0xFC); + //printf("%u, RL: 0x%02x, LC: %u\n", w, V & 0xFC, LengthCache[w]); + break; + case 0x07:EnvCache[w]=(uint32)(V&0xF)*576716;break; + } + +} + +static DECLFW(Mapper19_write) +{ + A&=0xF800; + + if(A>=0x8000 && A<=0xb800) + DoCHRRAMROM((A-0x8000)>>11,V); + else switch(A) + { + case 0x4800: + //printf("Yahaoo: %02x, %02x\n",dopol&0x7F,V); + //puts("Hmm"); + if(dopol&0x40) + { + DoNamcoSound(); + FixCache(dopol,V); + } + IRAM[dopol&0x7f]=V; + + if(dopol&0x80) + dopol=(dopol&0x80)|((dopol+1)&0x7f); + break; + + case 0xf800: dopol=V;break; + case 0x5000: IRQCount&=0xFF00;IRQCount|=V;X6502_IRQEnd(MDFN_IQEXT);break; + case 0x5800: IRQCount&=0x00ff;IRQCount|=(V&0x7F)<<8; + IRQa=V&0x80; + X6502_IRQEnd(MDFN_IQEXT); + //puts("IRQe"); + break; + + case 0xE000:gorko=V&0xC0; + PRG[0]=V&0x3F; + SyncPRG(); + break; + case 0xE800:gorfus=V&0xC0; + FixCRR(); + PRG[1]=V&0x3F; + SyncPRG(); + break; + case 0xF000:PRG[2]=V&0x3F; + SyncPRG(); + break; + } +} + +#define TOINDEXBS (16 + 10) + +#define TOINDEX (16+1) + +// 16:15 +static void SyncHQ(int32 ts) +{ + CVBC=ts; +} + + +/* Things to do: + 1 Read freq low + 2 Read freq mid + 3 Read freq high + 4 Read envelope + ...? +*/ + +static INLINE uint32 FetchDuff(uint32 P, uint32 envelope) +{ + uint32 duff; + duff=IRAM[((IRAM[0x46+(P<<3)]+(PlayIndex[P]>>TOINDEX))&0xFF)>>1]; + if((IRAM[0x46+(P<<3)]+(PlayIndex[P]>>TOINDEX))&1) + duff>>=4; + duff&=0xF; + duff=(duff*envelope)>>16; + return(duff); +} + +static INLINE uint32 FetchDuffBS(uint32 P, uint32 envelope) +{ + uint32 duff; + duff=IRAM[((IRAM[0x46+(P<<3)]+(PlayIndexBS[P]>>TOINDEXBS))&0xFF)>>1]; + if((IRAM[0x46+(P<<3)]+(PlayIndexBS[P]>>TOINDEXBS))&1) + duff>>=4; + duff&=0xF; + duff=(duff*envelope)>>16; + return(duff); +} + +static void DoNamcoSoundAccurate(void) +{ + int32 P; + uint32 V; + int32 cyclesuck=(((IRAM[0x7F]>>4)&7)+1) * 15; + + for(P=7;P>=(7-((IRAM[0x7F]>>4)&7));P--) + { + if((IRAM[0x44+(P<<3)]&0xE0) && (IRAM[0x47+(P<<3)]&0xF)) + { + uint32 freq; + int32 vco; + uint32 duff2,lengo,envelope; + + vco = vcount[P]; + freq = FreqCache[P]; + + envelope = EnvCache[P]; + lengo=LengthCache[P]; + + duff2=FetchDuff(P,envelope); + for(V=CVBC<<1;V>1]-=duff2; + if(!vco) + { + PlayIndex[P]+=freq; + while((PlayIndex[P]>>TOINDEX) >=lengo) + PlayIndex[P]-=lengo<>4)&7)+1) * 15; + + for(P=7;P>=(7-((IRAM[0x7F]>>4)&7));P--) + { + if((IRAM[0x44+(P<<3)]&0xE0) && (IRAM[0x47+(P<<3)]&0xF)) + { + uint32 freq; + uint32 duff2,lengo,envelope; + + freq = FreqCache[P] * 1024 / cyclesuck; + + envelope = EnvCache[P]; + lengo = LengthCache[P]; + + duff2 = FetchDuffBS(P,envelope) << 1; + + for(V=CVBC;V>TOINDEXBS) >=lengo) + PlayIndexBS[P]-=(uint64)lengo<HiFill=DoNamcoSound; + ep->HiSync=SyncHQ; + + memset(vcount,0,sizeof(vcount)); + memset(PlayIndex,0,sizeof(PlayIndex)); + memset(PlayIndexBS, 0, sizeof(PlayIndexBS)); + CVBC=0; +} + +int NSFN106_Init(EXPSOUND *ep, bool MultiChip) +{ + NSFECSetWriteHandler(0xf800,0xffff,Mapper19_write); + NSFECSetWriteHandler(0x4800,0x4fff,Mapper19_write); + SetReadHandler(0x4800,0x4fff,Namco_Read4800); + Mapper19_ESI(ep); + return(1); +} + +static void InstallRW(CartInfo *info) +{ + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xffff,Mapper19_write); + SetWriteHandler(0x4020,0x5fff,Mapper19_write); + + if(!is210) + { + SetWriteHandler(0xc000,0xdfff,Mapper19C0D8_write); + SetReadHandler(0x4800,0x4fff,Namco_Read4800); + SetReadHandler(0x5000,0x57ff,Namco_Read5000); + SetReadHandler(0x5800,0x5fff,Namco_Read5800); + } + + SetReadHandler(0x6000,0x7FFF,AWRAM); + SetWriteHandler(0x6000,0x7FFF,BWRAM); + + +} + +static void N106_Power(CartInfo *info) +{ + int x; + + if(!is210) + { + NTAPage[0]=NTAPage[1]=NTAPage[2]=NTAPage[3]=0xFF; + FixNTAR(); + } + + MDFNMP_AddRAM(8192, 0x6000, WRAM); + + gorfus=0xFF; + SyncPRG(); + FixCRR(); + + if(!info->battery) + { + memset(WRAM,0,8192); + memset(IRAM,0,128); + } + for(x=0x40;x<0x80;x++) + FixCache(x,IRAM[x]); + + memset(vcount,0,sizeof(vcount)); + memset(PlayIndex,0,sizeof(PlayIndex)); + memset(PlayIndexBS, 0, sizeof(PlayIndexBS)); +} + +#ifdef WANT_DEBUGGER +static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "wram")) + { + while(Length--) + { + Address &= 8192 - 1; + *Buffer = WRAM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "iram")) + { + while(Length--) + { + Address &= 0x7F; + *Buffer = IRAM[Address]; + Address++; + Buffer++; + } + } +} + +static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "wram")) + { + while(Length--) + { + Address &= 8192 - 1; + WRAM[Address] = *Buffer; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "iram")) + { + while(Length--) + { + Address &= 0x7F; + IRAM[Address] = *Buffer; + Address++; + Buffer++; + } + } +} +#endif + +int Mapper19_Init(CartInfo *info) +{ + is210=0; + + info->Power=N106_Power; + info->StateAction = StateAction; + + MapIRQHook=NamcoIRQHook; + + Mapper19_ESI(&info->CartExpSound); + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + + info->SaveGame[1] = IRAM; + info->SaveGameLen[1] = 128; + } + + #ifdef WANT_DEBUGGER + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "wram", "Cart WRAM", 13); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "iram", "N106 Internal RAM", 7); + #endif + + InstallRW(info); + + return(1); +} + +static int Mapper210_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PRG,3), + SFARRAY(CHR,8), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + SyncPRG(); + FixCRR(); + } + return(ret); +} + +int Mapper210_Init(CartInfo *info) +{ + is210=1; + info->StateAction = Mapper210_StateAction; + info->Power=N106_Power; + + InstallRW(info); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/nina06.cpp b/Mednafen/mednafen/nes/boards/nina06.cpp new file mode 100644 index 0000000000..d097e1e1b5 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/nina06.cpp @@ -0,0 +1,70 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; +static void Sync(void) +{ + setprg32(0x8000, (latch >> 3) & 1); + setchr8(latch & 0x7); +} + +static DECLFW(Write) +{ + if(A<0x8000 && ((A^0x4100)==0)) + { + latch = V; + Sync(); + } + if(A >= 0x8000) + { + latch &= ~0x7; + latch |= V & 0x7; + Sync(); + } +} + +static void Power(CartInfo *info) +{ + latch = 0; + Sync(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { SFVAR(latch), SFEND }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + Sync(); + + return(ret); +} + +int NINA06_Init(CartInfo *info) +{ + info->StateAction = StateAction; + info->Power = Power; + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x4020,0x5fff, Write); + SetWriteHandler(0x8000, 0xFFFF, Write); + + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/novel.cpp b/Mednafen/mednafen/nes/boards/novel.cpp new file mode 100644 index 0000000000..aee55ed693 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/novel.cpp @@ -0,0 +1,65 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch; + +static void DoNovel(void) +{ + setprg32(0x8000,latch&3); + setchr8(latch&7); +} + +static DECLFW(NovelWrite) +{ + latch=A&0xFF; + DoNovel(); +} + +static void NovelReset(CartInfo *info) +{ + latch = 0; + DoNovel(); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latch), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + DoNovel(); + return(ret); +} + +int Novel_Init(CartInfo *info) +{ + info->StateAction = StateAction; + info->Power=NovelReset; + + SetWriteHandler(0x8000,0xFFFF,NovelWrite); + SetReadHandler(0x8000,0xFFFF,CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/sachen.cpp b/Mednafen/mednafen/nes/boards/sachen.cpp new file mode 100644 index 0000000000..45498e4e4b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/sachen.cpp @@ -0,0 +1,360 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 cmd; +static uint8 latch[8]; + +static int cmd_save, latch_save; +static void (*SachSync)(int version); + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + // FIXME to not abuse SFARRAYN: + SFARRAYN(&cmd, cmd_save, "cmd"), + SFARRAY(latch, latch_save), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + SachSync(load); + return(ret); +} + +static void StateInit(CartInfo *info, void (*ss)(int), int nc, int nl) +{ + info->StateAction = StateAction; + SachSync = ss; + cmd_save = nc; + latch_save = nl; +} + +static void S74LS374NSynco(void) +{ + setprg32(0x8000,latch[0]); + setchr8(latch[1]); + setmirror(latch[2]&1); +// setchr8(6); +} + +static DECLFW(S74LS374NWrite) +{ + //printf("$%04x:$%02x\n",A,V); + A&=0x4101; + if(A==0x4100) + cmd=V&7; + else + { + switch(cmd) + { + case 0:latch[0]=0;latch[1]=3;break; + case 4:latch[1]&=3;latch[1]|=(V<<2);break; + case 5:latch[0]=V&0x7;break; + case 6:latch[1]&=0x1C;latch[1]|=V&3;break; + case 7:latch[2]=V&1;break; + } + S74LS374NSynco(); + } +} + +static void S74LS374NReset(CartInfo *info) +{ + latch[0]=latch[2]=0; + latch[1]=3; + S74LS374NSynco(); +} + +static void S74LS374NRestore(int version) +{ + S74LS374NSynco(); +} + +int S74LS374N_Init(CartInfo *info) +{ + info->Power=S74LS374NReset; + StateInit(info, S74LS374NRestore, 1, 3); + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0x7FFF,S74LS374NWrite); + + return(1); +} + +static int type; +static void S8259Synco(void) +{ + int x; + + setprg32(0x8000,latch[5]&7); + + if(!UNIFchrrama) // No CHR RAM? Then BS'ing is ok. + { + if(!type) + { + for(x=0;x<4;x++) + setchr2(0x800*x,(x&1)|((latch[x]&7)<<1)|((latch[4]&7)<<4)); + } + else + { + for(x=0;x<4;x++) + setchr2(0x800*x,(latch[x]&0x7)|((latch[4]&7)<<3)); + } + } + switch((latch[7]>>1)&3) + { + case 0:setmirrorw(0,0,0,1);break; + case 1:setmirror(MI_H);break; + case 2:setmirror(MI_V);break; + case 3:setmirror(MI_0);break; + } +} + +static DECLFW(S8259Write) +{ + A&=0x4101; + if(A==0x4100) cmd=V; + else + { + latch[cmd&7]=V; + S8259Synco(); + } +} + +static void S8259Reset(CartInfo *info) +{ + int x; + cmd=0; + + for(x=0;x<8;x++) latch[x]=0; + if(UNIFchrrama) setchr8(0); + + S8259Synco(); +} + +static void S8259Restore(int version) +{ + S8259Synco(); +} + +int S8259A_Init(CartInfo *info) +{ + info->Power=S8259Reset; + StateInit(info, S8259Restore, 1, 8); + type=0; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0x7FFF,S8259Write); + + return(1); +} + +int S8259B_Init(CartInfo *info) +{ + info->Power=S8259Reset; + StateInit(info, S8259Restore, 1, 8); + type=1; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0x7FFF,S8259Write); + + return(1); +} + +static void(*WSync)(void); + +static void SA0161MSynco() +{ + setprg32(0x8000,(latch[0]>>3)&1); + setchr8(latch[0]&7); +} + +static DECLFW(SAWrite) +{ + if(A&0x100) + { + latch[0]=V; + WSync(); + } +} + +static void SAReset(CartInfo *info) +{ + latch[0]=0; + WSync(); +} + +static void SA0161MRestore(int version) +{ + SA0161MSynco(); +} + +int SA0161M_Init(CartInfo *info) +{ + WSync=SA0161MSynco; + StateInit(info, SA0161MRestore, 0, 1); + info->Power=SAReset; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0x5FFF,SAWrite); + + return(1); +} + +static void SA72007Synco() +{ + setprg32(0x8000,0); + setchr8(latch[0]>>7); +} + +static void SA72007Restore(int version) +{ + SA72007Synco(); +} + +int SA72007_Init(CartInfo *info) +{ + WSync=SA72007Synco; + StateInit(info, SA72007Restore, 0, 1); + info->Power=SAReset; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0x5FFF,SAWrite); + + return(1); +} + +static void SA72008Synco() +{ + setprg32(0x8000,(latch[0]>>2)&1); + setchr8(latch[0]&3); +} + +static void SA72008Restore(int version) +{ + SA72008Synco(); +} + +int SA72008_Init(CartInfo *info) +{ + WSync=SA72008Synco; + StateInit(info, SA72008Restore, 0, 1); + info->Power=SAReset; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0x5FFF,SAWrite); + + return(1); +} + +static DECLFW(SADWrite) +{ + latch[0]=V; + WSync(); +} + +static void SADReset(CartInfo *info) +{ + latch[0]=0; + WSync(); +} + +static void SA0036Synco() +{ + setprg32(0x8000,0); + setchr8(latch[0]>>7); +} + +static void SA0036Restore(int version) +{ + SA0036Synco(); +} + +static void SA0037Synco() +{ + setprg32(0x8000,(latch[0]>>3)&1); + setchr8(latch[0]&7); +} + +static void SA0037Restore(int version) +{ + SA0037Synco(); +} + +int SA0036_Init(CartInfo *info) +{ + WSync=SA0036Synco; + StateInit(info, SA0036Restore, 0, 1); + info->Power=SADReset; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xFFFF,SADWrite); + + return(1); +} + +int SA0037_Init(CartInfo *info) +{ + WSync=SA0037Synco; + StateInit(info, SA0037Restore, 0, 1); + info->Power=SADReset; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xFFFF,SADWrite); + + return(1); +} + +static void TCU01Synco() +{ + setprg32(0x8000,(latch[0]>>2)&1); + setchr8((latch[0]>>3)&0xF); +} + +static DECLFW(TCWrite) +{ + if((A&0x103)==0x102) + latch[0]=V; + TCU01Synco(); +} + +static void TCU01Reset(CartInfo *info) +{ + latch[0]=0; + TCU01Synco(); +} + +static void TCU01Restore(int version) +{ + TCU01Synco(); +} + +int TCU01_Init(CartInfo *info) +{ + StateInit(info, TCU01Restore, 0, 1); + info->Power=TCU01Reset; + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x4100,0xFFFF,TCWrite); + return(1); +} + diff --git a/Mednafen/mednafen/nes/boards/simple.cpp b/Mednafen/mednafen/nes/boards/simple.cpp new file mode 100644 index 0000000000..832313319d --- /dev/null +++ b/Mednafen/mednafen/nes/boards/simple.cpp @@ -0,0 +1,366 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latche; + +static DECLFW(CPROMWrite) +{ + latche=V&3; + setchr4(0x1000, V & 3); +} + +static void CPROMReset(CartInfo *info) +{ + latche = 0; + setprg32(0x8000,0); + setchr4(0x0000, 0); + setchr4(0x1000, 0); +} + +static int CPROM_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + setchr4(0x1000, latche & 3); + return(ret); +} + +int CPROM_Init(CartInfo *info) +{ + info->Power=CPROMReset; + info->StateAction = CPROM_StateAction; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xffff,CPROMWrite); + + return(1); +} + +static int CNROM_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + setchr8(latche); + return(ret); +} + +static DECLFW(CNROMWrite) +{ + latche = V & 3 & CartBR(A); + setchr8(latche); +} + +static void CNROMReset(CartInfo *info) +{ + latche = 0; + setprg16(0x8000,0); + setprg16(0xC000,1); + setchr8(0); +} + +int CNROM_Init(CartInfo *info) +{ + info->Power=CNROMReset; + info->StateAction = CNROM_StateAction; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x8000,0xffff,CNROMWrite); + + return(1); +} + + +static int Mapper101_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + setchr8(latche); + return(ret); +} + +static DECLFW(Mapper101Write) +{ + latche = ((V & 1) << 1) | ((V & 2) >> 1); + setchr8(latche); +} + +static void Mapper101Reset(CartInfo *info) +{ + latche = 0; + setprg16(0x8000,0); + setprg16(0xC000,1); + setchr8(0); +} + +int Mapper101_Init(CartInfo *info) +{ + info->Power=Mapper101Reset; + info->StateAction = Mapper101_StateAction; + + SetReadHandler(0x8000,0xFFFF,CartBR); + SetWriteHandler(0x6000,0x7fff,Mapper101Write); + + return(1); +} + + + + +static void NROM128Reset(CartInfo *info) +{ + setprg16(0x8000,0); + setprg16(0xC000,0); + setchr8(0); +} + +static void NROM256Reset(CartInfo *info) +{ + setprg16(0x8000,0); + setprg16(0xC000,1); + setchr8(0); +} + +int NROM128_Init(CartInfo *info) +{ + info->Power=NROM128Reset; + SetReadHandler(0x8000,0xFFFF,CartBR); + + return(1); +} + +int NROM256_Init(CartInfo *info) +{ + info->Power=NROM256Reset; + SetReadHandler(0x8000,0xFFFF,CartBR); + + return(1); +} + +static int MHROM_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + setprg32(0x8000, latche >> 4), + setchr8(latche & 0xF); + } + return(ret); +} + +static DECLFW(MHROMWrite) +{ + setprg32(0x8000,V>>4); + setchr8(V & 0xF); + latche=V; +} + +static void MHROMReset(CartInfo *info) +{ + setprg32(0x8000,0); + setchr8(0); + latche=0; +} + +int MHROM_Init(CartInfo *info) +{ + info->Power=MHROMReset; + info->StateAction = MHROM_StateAction; + PRGmask32[0]&=1; + CHRmask8[0]&=1; + SetReadHandler(0x8000, 0xFFFF, CartBR); + SetWriteHandler(0x8000, 0xFFFF, MHROMWrite); + return(1); +} + +#ifdef WANT_DEBUGGER +static RegType DBGUNROMRegs[] = +{ + { 0, "PRGBank", "PRG Bank, 16KiB @8000", 1 }, + { 0, "", "", 0 }, +}; + +static uint32 UNROMDBG_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + return(latche); +} + +static void UNROMDBG_SetRegister(const unsigned int id, uint32 value) +{ + latche = value; + setprg16(0x8000, latche); +} + +static RegGroupType DBGUNROMRegsGroup = +{ + "UNROM", + DBGUNROMRegs, + UNROMDBG_GetRegister, + UNROMDBG_SetRegister, +}; + +#endif + +static int UNROM_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + setprg16(0x8000, latche); + return(ret); +} + +static DECLFW(UNROMWrite) +{ + setprg16(0x8000,V); + latche=V; +} + +static void UNROMReset(CartInfo *info) +{ + setchr8(0); + setprg16(0x8000,0); + setprg16(0xc000,~0); + latche=0; +} + +int UNROM_Init(CartInfo *info) +{ + info->Power=UNROMReset; + info->StateAction = UNROM_StateAction; + + #ifdef WANT_DEBUGGER + MDFNDBG_AddRegGroup(&DBGUNROMRegsGroup); + #endif + + SetWriteHandler(0x8000,0xffff,UNROMWrite); + SetReadHandler(0x8000,0xFFFF,CartBR); + + //PRGmask16[0]&=7; + return(1); +} + +static void GNROMSync() +{ + setchr8(latche&3); + setprg32(0x8000,(latche>>4)&3); +} + +static DECLFW(GNROMWrite) +{ + latche=V&0x33; + GNROMSync(); +} + +static int GNROM_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + GNROMSync(); + return(ret); +} + +static void GNROMReset(CartInfo *info) +{ + latche=0; + GNROMSync(); +} + +int GNROM_Init(CartInfo *info) +{ + info->Power=GNROMReset; + info->StateAction = GNROM_StateAction; + + SetWriteHandler(0x8000,0xffff,GNROMWrite); + SetReadHandler(0x8000,0xFFFF,CartBR); + + return(1); +} + +static DECLFW(AOROM_Write) +{ + latche = V; + setprg32(0x8000, V & 0xF); + setmirror(((V >> 4) & 1) ? MI_1 : MI_0); +} + +static void AOROM_Reset(CartInfo *info) +{ + setprg32(0x8000, 0xF); + setchr8(0); + setmirror(MI_0); + latche = 0; +} + +static int AOROM_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(latche), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + setprg32(0x8000, latche & 0xF); + setmirror(((latche >> 4) & 1) ? MI_1 : MI_0); + } + return(ret); +} + + +int AOROM_Init(CartInfo *info) +{ + info->Power = AOROM_Reset; + info->StateAction = AOROM_StateAction; + SetWriteHandler(0x8000, 0xFFFF, AOROM_Write); + SetReadHandler(0x8000, 0xFFFF, CartBR); + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/super24.cpp b/Mednafen/mednafen/nes/boards/super24.cpp new file mode 100644 index 0000000000..2eda203dc9 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/super24.cpp @@ -0,0 +1,260 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 *CHRRAM = NULL; +static int32 IRQCount,IRQLatch; +static uint8 IRQa,resetmode,mbia; +static uint8 sizer,bigbank,bigbank2; +static uint8 DRegBuf[8],MMC3_cmd; + +static const int masko8[8] = { 63,31,15,1,3,0,0,0 }; +//static int masko1[8]={511,255,127,7,7,0,0,0}; + +static void swsetprg8(uint32 A, uint32 V) +{ + V&=masko8[sizer&7]; + V|=(bigbank*2); + setprg8r((V/64)&15,A,V); +} + +static void swsetchr1(uint32 A, uint32 V) +{ + if(sizer&0x20) + setchr1r(0x10,A,V); + else + { +// V&=masko1[sizer&7]; + V|=bigbank2*8; + setchr1r((V/512)&15,A,V); + } +} + +static void swsetchr2(uint32 A, uint32 V) +{ + if(sizer&0x20) + setchr2r(0x10,A,V); + else + { + //V&=masko1[sizer&7]>>1; + V|=bigbank2*4; + setchr2r((V/256)&15,A,V); + } +} + +static void Sup24_hb(void) +{ + resetmode=0; + + if(IRQCount>=0) + { + IRQCount--; + if(IRQCount<0) + { + if(IRQa) + { + resetmode = 1; + X6502_IRQBegin(MDFN_IQEXT); + //printf("IRQ: %d,%d\n",scanline,timestamp); + } + } + } +} + +static DECLFW(Sup24IRQWrite) +{ + //printf("%04x, $%02x, %d, %d\n",A,V,scanline,timestamp); + switch(A&0xE001) + { + case 0xc000:IRQLatch=V; + if(resetmode==1) + IRQCount=IRQLatch; + break; + case 0xc001:resetmode=1; + IRQCount=IRQLatch; + break; + case 0xE000:IRQa=0;X6502_IRQEnd(MDFN_IQEXT); + if(resetmode==1) + {IRQCount=IRQLatch;} + break; + case 0xE001:IRQa=1; + if(resetmode==1) + {IRQCount=IRQLatch;} + break; + } +} + +static INLINE void FixMMC3PRG(int V) +{ + swsetprg8(0xA000,DRegBuf[7]); + swsetprg8(0xE000,~0); + if(V&0x40) + { + swsetprg8(0xC000,DRegBuf[6]); + swsetprg8(0x8000,~1); + } + else + { + swsetprg8(0x8000,DRegBuf[6]); + swsetprg8(0xC000,~1); + } +} + +static INLINE void FixMMC3CHR(int V) +{ + int cbase=(V&0x80)<<5; + swsetchr2((cbase^0x000),DRegBuf[0]>>1); + swsetchr2((cbase^0x800),DRegBuf[1]>>1); + swsetchr1(cbase^0x1000,DRegBuf[2]); + swsetchr1(cbase^0x1400,DRegBuf[3]); + swsetchr1(cbase^0x1800,DRegBuf[4]); + swsetchr1(cbase^0x1c00,DRegBuf[5]); +} + +static DECLFW(Super24hiwrite) +{ + //printf("$%04x:$%02x, %d\n",A,V,scanline); + switch(A&0xE001) + { + case 0x8000: + if((V&0x40) != (MMC3_cmd&0x40)) + FixMMC3PRG(V); + if((V&0x80) != (MMC3_cmd&0x80)) + FixMMC3CHR(V); + MMC3_cmd = V; + break; + + case 0x8001: + { + int cbase=(MMC3_cmd&0x80)<<5; + DRegBuf[MMC3_cmd&0x7]=V; + switch(MMC3_cmd&0x07) + { + case 0: V>>=1;swsetchr2((cbase^0x000),V);break; + case 1: V>>=1;swsetchr2((cbase^0x800),V);break; + case 2: swsetchr1(cbase^0x1000,V); break; + case 3: swsetchr1(cbase^0x1400,V); break; + case 4: swsetchr1(cbase^0x1800,V); break; + case 5: swsetchr1(cbase^0x1C00,V); break; + case 6: if (MMC3_cmd&0x40) swsetprg8(0xC000,V); + else swsetprg8(0x8000,V); + break; + case 7: swsetprg8(0xA000,V); + break; + } + } + break; + + case 0xA000: + mbia=V; + setmirror((V&1)^1); + break; + } +} + + +static DECLFW(Super24Write) +{ + //printf("$%04x:$%02x\n",A,V); + switch(A) + { + case 0x5ff0:sizer=V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + break; + case 0x5FF1: + bigbank=V; + FixMMC3PRG(MMC3_cmd); + break; + case 0x5FF2: + bigbank2=V; + FixMMC3CHR(MMC3_cmd); + break; + } +} + +static void Super24Reset(CartInfo *info) +{ + GameHBIRQHook=Sup24_hb; + IRQCount=IRQLatch=IRQa=resetmode=0; + sizer=0x24; + bigbank=159; + bigbank2=0; + + MMC3_cmd=0; + DRegBuf[6]=0; + DRegBuf[7]=1; + + FixMMC3PRG(0); + FixMMC3CHR(0); +} + +static void Super24Close(void) +{ + if(CHRRAM) + free(CHRRAM); + CHRRAM = NULL; +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYN(CHRRAM, 8192, "CHRR"), + SFARRAYN(DRegBuf, 8, "DREG"), + SFVARN(IRQCount, "IRQC"), + SFVARN(IRQLatch, "IQL1"), + SFVARN(IRQa, "IRQA"), + SFVARN(sizer, "SIZA"), + SFVARN(bigbank, "BIG1"), + SFVARN(bigbank2, "BIG2"), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + setmirror((mbia & 1) ^ 1); + } + return(ret); +} + +int Super24_Init(CartInfo *info) +{ + info->Power=Super24Reset; + info->StateAction = StateAction; + + if(!(CHRRAM = (uint8 *)malloc(8192))) + return(0); + + info->Close = Super24Close; + + SetupCartCHRMapping(0x10, CHRRAM, 8192, 1); + + SetWriteHandler(0x8000,0xBFFF,Super24hiwrite); + SetWriteHandler(0x5000,0x7FFF,Super24Write); + SetWriteHandler(0xC000,0xFFFF,Sup24IRQWrite); + SetReadHandler(0x8000,0xFFFF,CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/supervision.cpp b/Mednafen/mednafen/nes/boards/supervision.cpp new file mode 100644 index 0000000000..00a5bb434e --- /dev/null +++ b/Mednafen/mednafen/nes/boards/supervision.cpp @@ -0,0 +1,84 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 latch[2]; + +static void DoSuper(void) +{ + setprg8r((latch[0]&0xC)>>2,0x6000,((latch[0]&0x3)<<4)|0xF); + if(latch[0]&0x10) + { + setprg16r((latch[0]&0xC)>>2,0x8000,((latch[0]&0x3)<<3)|(latch[1]&7)); + setprg16r((latch[0]&0xC)>>2,0xc000,((latch[0]&0x3)<<3)|7); + } + else + setprg32r(4,0x8000,0); + + setmirror(((latch[0]&0x20)>>5)^1); +} + +static DECLFW(SuperWrite) +{ + if(!(latch[0]&0x10)) + { + latch[0]=V; + DoSuper(); + } +} + +static DECLFW(SuperHi) +{ + latch[1]=V; + DoSuper(); +} + +static void SuperReset(CartInfo *info) +{ + latch[0] = latch[1] = 0; + setprg32r(4,0x8000,0); + setchr8(0); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(latch, 2), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + DoSuper(); + return(ret); +} + +int Supervision16_Init(CartInfo *info) +{ + info->Power=SuperReset; + info->StateAction = StateAction; + + SetWriteHandler(0x6000,0x7FFF,SuperWrite); + SetWriteHandler(0x8000,0xFFFF,SuperHi); + SetReadHandler(0x6000,0xFFFF,CartBR); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/tengen.cpp b/Mednafen/mednafen/nes/boards/tengen.cpp new file mode 100644 index 0000000000..6f145f3f3b --- /dev/null +++ b/Mednafen/mednafen/nes/boards/tengen.cpp @@ -0,0 +1,238 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" + +static uint8 cmd,mir,rmode,IRQmode; +static uint8 DRegs[11]; +static uint8 IRQCount,IRQa,IRQLatch; + +static void (*setchr1wrap)(unsigned int A, unsigned int V); +static int nomirror; + +static void RAMBO1_IRQHook(int a) +{ + static int smallcount; + if(!IRQmode) return; + + smallcount+=a; + while(smallcount>=4) + { + smallcount-=4; + IRQCount--; + if(IRQCount==0xFF) + { + if(IRQa) + { + //printf("IRQ: %d\n",scanline); + //rmode = 1; + X6502_IRQBegin(MDFN_IQEXT); + } + } + } +} + +static void RAMBO1_hb(void) +{ + if(IRQmode) return; + if(scanline==240) return; /* hmm. Maybe that should be an mmc3-only + call in fce.c. */ + rmode=0; + IRQCount--; + if(IRQCount==0xFF) + { + if(IRQa) + { + rmode = 1; + X6502_IRQBegin(MDFN_IQEXT); + } + } +} + +static void Synco(void) +{ + int x; + + if(cmd&0x20) + { + setchr1wrap(0x0000,DRegs[0]); + setchr1wrap(0x0800,DRegs[1]); + setchr1wrap(0x0400,DRegs[8]); + setchr1wrap(0x0c00,DRegs[9]); + } + else + { + setchr1wrap(0x0000,(DRegs[0]&0xFE)); + setchr1wrap(0x0400,(DRegs[0]&0xFE)|1); + setchr1wrap(0x0800,(DRegs[1]&0xFE)); + setchr1wrap(0x0C00,(DRegs[1]&0xFE)|1); + } + + for(x=0;x<4;x++) + setchr1wrap(0x1000+x*0x400,DRegs[2+x]); + + setprg8(0x8000,DRegs[6]); + setprg8(0xA000,DRegs[7]); + + setprg8(0xC000,DRegs[10]); +} + + +static DECLFW(RAMBO1_write) +{ + //if(A>=0xC000 && A<=0xFFFF) printf("$%04x:$%02x, %d, %d\n",A,V,scanline,timestamp); + switch(A&0xF001) + { + case 0xa000:mir=V&1; + if(!nomirror) + setmirror(mir^1); + break; + case 0x8000:cmd = V; + break; + case 0x8001: + if((cmd&0xF)<10) + DRegs[cmd&0xF]=V; + else if((cmd&0xF)==0xF) + DRegs[10]=V; + Synco(); + break; + case 0xc000:IRQLatch=V; + if(rmode==1) + { + IRQCount=IRQLatch; + } + break; + case 0xc001:rmode=1; + IRQCount=IRQLatch; + IRQmode=V&1; + break; + case 0xE000:IRQa=0;X6502_IRQEnd(MDFN_IQEXT); + if(rmode==1) + {IRQCount=IRQLatch;} + break; + case 0xE001:IRQa=1; + if(rmode==1) + {IRQCount=IRQLatch;} + break; + } +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[]={ + SFVARN(cmd, "CMD"), + SFVARN(mir, "MIR"), + SFVARN(rmode, "RMOD"), + SFVARN(IRQmode, "IRQM"), + SFVARN(IRQCount, "IRQC"), + SFVARN(IRQa, "IRQA"), + SFVARN(IRQLatch, "IRQL"), + SFARRAYN(DRegs, 11, "DREG"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + + if(load) + { + Synco(); + if(!nomirror) + setmirror(mir^1); + } + + return(ret); +} + +static void Power(CartInfo *info) +{ + int x; + + for(x=0;x<11;x++) + DRegs[x]=~0; + cmd=0; + mir=0; + if(!nomirror) + setmirror(1); + Synco(); + setprg8(0xe000, 0xFF); +} + +static void RAMBO1_init(CartInfo *info) +{ + info->Power = Power; + info->StateAction = StateAction; + GameHBIRQHook=RAMBO1_hb; + MapIRQHook=RAMBO1_IRQHook; + SetWriteHandler(0x8000,0xffff,RAMBO1_write); + SetReadHandler(0x8000, 0xFFFF, CartBR); +} + +static void CHRWrap(unsigned int A, unsigned int V) +{ + setchr1(A,V); +} + +int Mapper64_Init(CartInfo *info) +{ + setchr1wrap=CHRWrap; + nomirror=0; + RAMBO1_init(info); + return(1); +} + +static int MirCache[8]; +static unsigned int PPUCHRBus; + +static void MirWrap(unsigned int A, unsigned int V) +{ + MirCache[A>>10]=(V>>7)&1; + if(PPUCHRBus==(A>>10)) + setmirror(MI_0+((V>>7)&1)); + setchr1(A,V); +} + +static void MirrorFear(uint32 A) +{ + A&=0x1FFF; + A>>=10; + PPUCHRBus=A; + setmirror(MI_0+MirCache[A]); +} + +int Mapper158_Init(CartInfo *info) +{ + setchr1wrap=MirWrap; + PPU_hook=MirrorFear; + nomirror=1; + RAMBO1_init(info); + return(1); +} + + +static DECLFW(MIMIC1_Write) +{ + + +} + +void Mapper159_init(void) +{ + SetWriteHandler(0x8000,0xFFFF,MIMIC1_Write); +} diff --git a/Mednafen/mednafen/nes/boards/vrc6.cpp b/Mednafen/mednafen/nes/boards/vrc6.cpp new file mode 100644 index 0000000000..bdb1dffe97 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/vrc6.cpp @@ -0,0 +1,362 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mapinc.h" +#include "../nsf.h" + +static void (*sfun[3])(void); + +static uint8 PRGBank8, PRGBank16, CHRBanks[8], Mirroring; + +static uint8 IRQCount, IRQLatch, IRQEnabled; +static uint8 vrctemp; +static uint8 VPSG[3][3]; +static uint8 WRAM[8192]; + +static int swaparoo; + +static uint8 b3; +static int32 phaseacc; + +static int32 acount; + +static int32 CVBC[3]; +static int32 vcount[3]; +static uint32 dcount[2]; + +#define VOLADJ *4/8 + +static void DoPRG(void) +{ + setprg16(0x8000, PRGBank16); + setprg8(0xc000, PRGBank8); +} + +static void DoCHR(void) +{ + int x; + for(x = 0; x < 8; x++) + setchr1(x * 1024, CHRBanks[x]); +} + +static void DoMirroring(void) +{ + switch(Mirroring & 3) + { + case 0: setmirror(MI_V); break; + case 1: setmirror(MI_H); break; + case 2: setmirror(MI_0); break; + case 3: setmirror(MI_1); break; + } +} + +static void KonamiIRQHook(int a) +{ + #define LCYCS 341 +// #define LCYCS ((227*2)+1) + if(IRQEnabled) + { + acount+=a*3; + if(acount>=LCYCS) + { + doagainbub:acount-=LCYCS;IRQCount++; + if(IRQCount == 0x00) + { + X6502_IRQBegin(MDFN_IQEXT); + IRQCount=IRQLatch; + } + if(acount>=LCYCS) goto doagainbub; + } + } +} + +static DECLFW(VRC6SW) +{ + A&=0xF003; + if(A>=0x9000 && A<=0x9002) + { + VPSG[0][A&3]=V; + if(sfun[0]) sfun[0](); + } + else if(A>=0xa000 && A<=0xa002) + { + VPSG[1][A&3]=V; + if(sfun[1]) sfun[1](); + } + else if(A>=0xb000 && A<=0xb002) + { + VPSG[2][A&3]=V; + if(sfun[2]) sfun[2](); + } + +} + +static DECLFW(Mapper24_write) +{ + if(swaparoo) + A=(A&0xFFFC)|((A>>1)&1)|((A<<1)&2); + A&=0xF003; + + if(A>=0x9000 && A<=0xb002) + { + VRC6SW(A,V); + return; + } + + if(A >= 0xD000 && A <= 0xD003) + { + int w = A & 3; + CHRBanks[w] = V; + setchr1(w * 0x400, V); + } + else if(A >= 0xE000 && A <= 0xE003) + { + int w = 4 | (A & 3); + CHRBanks[w] = V; + setchr1(w * 0x400, V); + } + switch(A&0xF003) + { + case 0x8000:PRGBank16 = V; DoPRG(); break; + case 0xB003: Mirroring = (V >> 2) & 0x3; DoMirroring(); break; + case 0xC000:PRGBank8 = V; DoPRG(); break; + case 0xF000:IRQLatch=V; + //acount=0; + break; + case 0xF001:IRQEnabled=V&2; + vrctemp=V&1; + if(V&2) + { + IRQCount=IRQLatch; + acount=0; + } + X6502_IRQEnd(MDFN_IQEXT); + break; + case 0xf002:IRQEnabled = vrctemp; + X6502_IRQEnd(MDFN_IQEXT);break; + case 0xF003:break; + } +} + +static INLINE void DoSQVHQ(int x) +{ + uint32 V; + int32 amp=((VPSG[x][0]&15)<<8)VOLADJ; + + if(VPSG[x][0x2]&0x80) + { + if(VPSG[x][0]&0x80) + { + for(V=CVBC[x];V>4)&7; + for(V=CVBC[x];Vthresh) /* Greater than, not >=. Important. */ + WaveHiEx[V]+=amp; + vcount[x]--; + if(vcount[x]<=0) /* Should only be <0 in a few circumstances. */ + { + vcount[x]=(VPSG[x][0x1]|((VPSG[x][0x2]&15)<<8))+1; + dcount[x]=(dcount[x]+1)&15; + } + } + } + } + CVBC[x]=SOUNDTS; +} + +static void DoSQV1HQ(void) +{ + DoSQVHQ(0); +} + +static void DoSQV2HQ(void) +{ + DoSQVHQ(1); +} + +static void DoSawVHQ(void) +{ + uint32 V; + + if(VPSG[2][2]&0x80) + { + for(V=CVBC[2];V>3)&0x1f)<<8) VOLADJ; + vcount[2]--; + if(vcount[2]<=0) + { + vcount[2]=(VPSG[2][1]+((VPSG[2][2]&15)<<8)+1)<<1; + phaseacc+=VPSG[2][0]&0x3f; + b3++; + if(b3==7) + { + b3=0; + phaseacc=0; + } + + } + } + } + CVBC[2]=SOUNDTS; +} + +void VRC6SoundHQ(void) +{ + DoSQV1HQ(); + DoSQV2HQ(); + DoSawVHQ(); +} + +void VRC6SyncHQ(int32 ts) +{ + int x; + for(x=0;x<3;x++) CVBC[x]=ts; +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 8192), + SFARRAY(CHRBanks, 8), + SFVAR(PRGBank8), SFVAR(PRGBank16), + SFVAR(IRQCount), SFVAR(IRQLatch), SFVAR(IRQEnabled), + SFVAR(b3), SFVAR(phaseacc), SFVAR(acount), + SFVAR(vcount[0]), SFVAR(vcount[1]), SFVAR(vcount[2]), + SFVAR(dcount[0]), SFVAR(dcount[1]), + SFARRAYN(&VPSG[0][0], 3 * 3, "VPSG"), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "VRC6"); + + if(load) + { + DoPRG(); + DoCHR(); + DoMirroring(); + } + return(ret); +} + +static void VRC6_ESI(EXPSOUND *ep) +{ + ep->HiFill=VRC6SoundHQ; + ep->HiSync=VRC6SyncHQ; + + memset(CVBC,0,sizeof(CVBC)); + memset(vcount,0,sizeof(vcount)); + memset(dcount,0,sizeof(dcount)); + b3 = 0; + phaseacc = 0; + acount = 0; + + sfun[0] = DoSQV1HQ; + sfun[1] = DoSQV2HQ; + sfun[2] = DoSawVHQ; +} + +static void Close(void) +{ + +} + +static void Power(CartInfo *info) +{ + for(int x = 0; x < 8; x++) + CHRBanks[x] = x; + + DoCHR(); + + if(!info->battery) + memset(WRAM, 0xFF, 8192); + + setprg8r(0x10, 0x6000, 0); + PRGBank8 = ~1; + PRGBank16 = 0; + + setprg8(0xe000, ~0); + DoPRG(); + + IRQCount = IRQLatch = IRQEnabled = 0; + Mirroring = 0; + DoMirroring(); + + b3 = 0; + phaseacc = 0; + acount = 0; + +} + +static int VRC6_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetWriteHandler(0x8000, 0xffff, Mapper24_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + + VRC6_ESI(&info->CartExpSound); + + MapIRQHook = KonamiIRQHook; + info->StateAction = StateAction; + info->Power = Power; + info->Close = Close; + + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + return(1); +} + +int Mapper24_Init(CartInfo *info) +{ + swaparoo = 0; + return(VRC6_Init(info)); +} + +int Mapper26_Init(CartInfo *info) +{ + swaparoo = 1; + return(VRC6_Init(info)); +} + +int NSFVRC6_Init(EXPSOUND *ep, bool MultiChip) +{ + VRC6_ESI(ep); + + if(MultiChip) + { + NSFECSetWriteHandler(0x9000, 0x9002, VRC6SW); + NSFECSetWriteHandler(0xa000, 0xa002, VRC6SW); + NSFECSetWriteHandler(0xb000, 0xb002, VRC6SW); + } + else + { + NSFECSetWriteHandler(0x9000,0xbfff,VRC6SW); + } + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/vrc7.cpp b/Mednafen/mednafen/nes/boards/vrc7.cpp new file mode 100644 index 0000000000..b3e9f62048 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/vrc7.cpp @@ -0,0 +1,237 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: Fix NSF variable initialization + +#include "mapinc.h" +#include "../nsf.h" + +static uint8 CHRBanks[8], PRGBanks[3], WRAM[8192], Mirroring; +static uint8 IRQLatch, IRQCount, IRQEnabled; +static uint8 vrctemp; +static uint8 indox; +static int32 acount; +static int32 divc; + +#include "emu2413.h" + +static OPLL *VRC7Sound=NULL; +static uint32 V7BC; +static int32 V7out; + +void DoVRC7Sound(void) +{ + uint32 V; + + for(V=V7BC;V=0xa000 && A<=0xDFFF) + { + // printf("$%04x, $%04x\n",X.PC,A); + A&=0xF010; + { + int x=((A>>4)&1)|((A-0xA000)>>11); + CHRBanks[x] = V; + setchr1(x<<10,V); + } + } + else if(A==0x9030) + { + DoVRC7Sound(); + OPLL_writeReg(VRC7Sound, indox, V); + } + else switch(A&0xF010) + { + case 0x8000:PRGBanks[0]=V;setprg8(0x8000,V);break; + case 0x8010:PRGBanks[1]=V;setprg8(0xa000,V);break; + case 0x9000:PRGBanks[2]=V;setprg8(0xc000,V);break; + case 0x9010:indox=V;break; + case 0xe000:Mirroring=V;DaMirror(V);break; + case 0xE010:IRQLatch=V; + X6502_IRQEnd(MDFN_IQEXT); + break; + case 0xF000:IRQEnabled=V&2; + vrctemp=V&1; + if(V&2) {IRQCount=IRQLatch;} + acount=0; + X6502_IRQEnd(MDFN_IQEXT); + break; + case 0xf010:if(vrctemp) IRQEnabled=1; + else IRQEnabled=0; + X6502_IRQEnd(MDFN_IQEXT); + break; + } +} + +static void KonamiIRQHook(int a) +{ + #define ACBOO 341 +// #define ACBOO ((227*2)+1) + if(IRQEnabled) + { + acount+=a*3; + + if(acount>=ACBOO) + { + doagainbub:acount-=ACBOO; + IRQCount++; + if(IRQCount == 0) {X6502_IRQBegin(MDFN_IQEXT);IRQCount=IRQLatch;} + if(acount>=ACBOO) goto doagainbub; + } + } +} + +static void Sync(void) +{ + int x; + + for(x=0;x<8;x++) + setchr1(x*0x400,CHRBanks[x]); + for(x=0;x<3;x++) + setprg8(0x8000+x*8192,PRGBanks[x]); + DaMirror(Mirroring); +} + +static void M85SKill(void) +{ + if(VRC7Sound) + OPLL_delete(VRC7Sound); + VRC7Sound=NULL; +} + +static void VRC7SI(EXPSOUND *ep) +{ + ep->Kill=M85SKill; + ep->HiFill=DoVRC7Sound; + ep->HiSync = HiSync; + + VRC7Sound=OPLL_new(3579545); + OPLL_reset(VRC7Sound); +} + +int NSFVRC7_Init(EXPSOUND *ep, bool MultiChip) +{ + NSFECSetWriteHandler(0x9010,0x901F,Mapper85_write); + NSFECSetWriteHandler(0x9030,0x903F,Mapper85_write); + VRC7SI(ep); + + return(1); +} + +static void Power(CartInfo *info) +{ + if(!info->battery) + memset(WRAM, 0xFF, 8192); + + setprg8r(0x10, 0x6000, 0); + setprg8(0xe000, 0xFF); + + for(int x = 0; x < 8; x++) + CHRBanks[x] = x; + + for(int x = 0; x < 3; x++) + PRGBanks[x] = x; + Mirroring = IRQLatch = IRQCount = IRQEnabled = vrctemp = indox = acount = divc = 0; + V7out = 0; + Sync(); + + OPLL_reset(VRC7Sound); +} + +static int StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CHRBanks, 8), SFARRAY(PRGBanks, 3), + SFARRAY(WRAM, 8192), SFVAR(Mirroring), + SFVAR(IRQLatch), SFVAR(IRQCount), SFVAR(IRQEnabled), + SFVAR(vrctemp), SFVAR(indox), SFVAR(acount), + SFVAR(divc), + + SFARRAY(VRC7Sound->LowFreq, 6), + SFARRAY(VRC7Sound->HiFreq, 6), + SFARRAY(VRC7Sound->InstVol, 6), + SFARRAY(VRC7Sound->CustInst, 8), + SFARRAY32(VRC7Sound->slot_on_flag, 6 * 2), + SFVAR(VRC7Sound->pm_phase), SFVAR(VRC7Sound->lfo_pm), + SFVAR(VRC7Sound->am_phase), SFVAR(VRC7Sound->lfo_am), + SFARRAY32(VRC7Sound->patch_number, 6), + SFARRAY32(VRC7Sound->key_status, 6), + + // FIXME + SFARRAYN((uint8 *)VRC7Sound->slot, sizeof(VRC7Sound->slot), "VRC7Sound->slot"), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAPR"); + if(load) + { + Sync(); + OPLL_forceRefresh(VRC7Sound); + } + return(ret); +} + +int Mapper85_Init(CartInfo *info) +{ + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + info->Power = Power; + info->StateAction = StateAction; + if(info->battery) + { + info->SaveGame[0] = WRAM; + info->SaveGameLen[0] = 8192; + } + MapIRQHook=KonamiIRQHook; + SetWriteHandler(0x8000,0xffff,Mapper85_write); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + + VRC7SI(&info->CartExpSound); + + return(1); +} diff --git a/Mednafen/mednafen/nes/boards/vrc7tone.h b/Mednafen/mednafen/nes/boards/vrc7tone.h new file mode 100644 index 0000000000..d136307367 --- /dev/null +++ b/Mednafen/mednafen/nes/boards/vrc7tone.h @@ -0,0 +1,17 @@ +/* VRC7 instruments, January 17, 2004 update -Xodnizel */ + {0x03, 0x21, 0x04, 0x06, 0x8D, 0xF2, 0x42, 0x17}, + {0x13, 0x41, 0x05, 0x0E, 0x99, 0x96, 0x63, 0x12}, + {0x31, 0x11, 0x10, 0x0A, 0xF0, 0x9C, 0x32, 0x02}, + {0x21, 0x61, 0x1D, 0x07, 0x9F, 0x64, 0x20, 0x27}, + {0x22, 0x21, 0x1E, 0x06, 0xF0, 0x76, 0x08, 0x28}, + {0x02, 0x01, 0x06, 0x00, 0xF0, 0xF2, 0x03, 0x95}, + {0x21, 0x61, 0x1C, 0x07, 0x82, 0x81, 0x16, 0x07}, + {0x23, 0x21, 0x1A, 0x17, 0xEF, 0x82, 0x25, 0x15}, + {0x25, 0x11, 0x1F, 0x00, 0x86, 0x41, 0x20, 0x11}, + {0x85, 0x01, 0x1F, 0x0F, 0xE4, 0xA2, 0x11, 0x12}, + {0x07, 0xC1, 0x2B, 0x45, 0xB4, 0xF1, 0x24, 0xF4}, + {0x61, 0x23, 0x11, 0x06, 0x96, 0x96, 0x13, 0x16}, + {0x01, 0x02, 0xD3, 0x05, 0x82, 0xA2, 0x31, 0x51}, + {0x61, 0x22, 0x0D, 0x02, 0xC3, 0x7F, 0x24, 0x05}, + {0x21, 0x62, 0x0E, 0x00, 0xA1, 0xA0, 0x44, 0x17}, + diff --git a/Mednafen/mednafen/nes/cart.cpp b/Mednafen/mednafen/nes/cart.cpp new file mode 100644 index 0000000000..5e4d6e5f08 --- /dev/null +++ b/Mednafen/mednafen/nes/cart.cpp @@ -0,0 +1,905 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include +#include "ppu/ppu.h" +#include "cart.h" +#include "x6502.h" + +#include + +#include +#include + +/* + This file contains all code for coordinating the mapping in of the + address space external to the NES. + It's also (ab)used by the NSF code. +*/ +namespace MDFN_IEN_NES +{ +uint8 *Page[32],*VPage[8]; +uint8 **VPageR=VPage; +uint8 *VPageG[8]; +uint8 *MMC5SPRVPage[8]; +uint8 *MMC5BGVPage[8]; + +static uint8 PRGIsRAM[32]; /* This page is/is not PRG RAM. */ + +/* 16 are (sort of) reserved for UNIF/iNES and 16 to map other stuff. */ +static int CHRram[32]; +static int PRGram[32]; + +uint8 *PRGptr[32]; +uint8 *CHRptr[32]; + +uint32 PRGsize[32]; +uint32 CHRsize[32]; + +uint32 PRGmask2[32]; +uint32 PRGmask4[32]; +uint32 PRGmask8[32]; +uint32 PRGmask16[32]; +uint32 PRGmask32[32]; + +uint32 CHRmask1[32]; +uint32 CHRmask2[32]; +uint32 CHRmask4[32]; +uint32 CHRmask8[32]; + +// +// +// +// + +/* +enum +{ + GENIESTAGE_UNUSED = 0, + GENIESTAGE_ENTRY = 1, + GENIESTAGE_GAME = 2 +}; +*/ + +uint8 geniestage = 0; +static uint8 modcon; +static std::array genieval; +static std::array geniech; +static std::array genieaddr; + +static DECLFR(GenieFix1); +static DECLFR(GenieFix2); +static DECLFR(GenieFix3); +static readfunc const GenieFix[3] = { GenieFix1, GenieFix2, GenieFix3 }; + +// +// +// +// + +static INLINE void setpageptr(int s, uint32 A, uint8 *p, int ram) +{ + uint32 AB=A>>11; + int x; + + if(p) + for(x=(s>>1)-1;x>=0;x--) + { + PRGIsRAM[AB+x]=ram; + Page[AB+x]=p-A; + } + else + for(x=(s>>1)-1;x>=0;x--) + { + PRGIsRAM[AB+x]=0; + Page[AB+x]=0; + } +} + +static uint8 nothing[8192]; + +uint8 *GetCartPagePtr(uint16 A) +{ + int n = A >> 11; + + if(Page[n] == (nothing - (n << 11))) + { + return(0); + } + else + return(Page[n]); +} + +void ResetCartMapping(void) +{ + int x; + + for(x=0;x<32;x++) + { + Page[x]=nothing-x*2048; + PRGptr[x]=CHRptr[x]=0; + PRGsize[x]=CHRsize[x]=0; + } + for(x=0;x<8;x++) + { + MMC5SPRVPage[x]=MMC5BGVPage[x]=VPageR[x]=nothing-0x400*x; + } + +} + +void SetupCartPRGMapping(int chip, uint8 *p, uint32 size, int ram) +{ + PRGptr[chip]=p; + PRGsize[chip]=size; + + PRGmask2[chip]=(size>>11)-1; + PRGmask4[chip]=(size>>12)-1; + PRGmask8[chip]=(size>>13)-1; + PRGmask16[chip]=(size>>14)-1; + PRGmask32[chip]=(size>>15)-1; + + PRGram[chip]=ram?1:0; +} + +void SetupCartCHRMapping(int chip, uint8 *p, uint32 size, int ram) +{ + CHRptr[chip]=p; + CHRsize[chip]=size; + + CHRmask1[chip]=(size>>10)-1; + CHRmask2[chip]=(size>>11)-1; + CHRmask4[chip]=(size>>12)-1; + CHRmask8[chip]=(size>>13)-1; + + CHRram[chip]=ram; +} + +DECLFR(CartBR) +{ + return Page[A>>11][A]; +} + +DECLFW(CartBW) +{ + //printf("Ok: %04x:%02x, %d\n",A,V,PRGIsRAM[A>>11]); + if(PRGIsRAM[A>>11] && Page[A>>11]) + Page[A>>11][A]=V; +} + +DECLFR(CartBROB) +{ + if(!Page[A>>11]) return(X.DB); + return Page[A>>11][A]; +} + +void setprg2r(int r, unsigned int A, unsigned int V) +{ + V&=PRGmask2[r]; + + setpageptr(2,A,PRGptr[r]?(&PRGptr[r][V<<11]):0,PRGram[r]); +} + +void setprg2(uint32 A, uint32 V) +{ + setprg2r(0,A,V); +} + +void setprg4r(int r, unsigned int A, unsigned int V) +{ + V&=PRGmask4[r]; + setpageptr(4,A,PRGptr[r]?(&PRGptr[r][V<<12]):0,PRGram[r]); +} + +void setprg4(uint32 A, uint32 V) +{ + setprg4r(0,A,V); +} + +void setprg8r(int r, unsigned int A, unsigned int V) +{ + if(PRGsize[r]>=8192) + { + V&=PRGmask8[r]; + setpageptr(8,A,PRGptr[r]?(&PRGptr[r][V<<13]):0,PRGram[r]); + } + else + { + uint32 VA=V<<2; + int x; + for(x=0;x<4;x++) + setpageptr(2,A+(x<<11),PRGptr[r]?(&PRGptr[r][((VA+x)&PRGmask2[r])<<11]):0,PRGram[r]); + } +} + +void setprg8(uint32 A, uint32 V) +{ + setprg8r(0,A,V); +} + +void setprg16r(int r, unsigned int A, unsigned int V) +{ + if(PRGsize[r]>=16384) + { + V&=PRGmask16[r]; + setpageptr(16,A,PRGptr[r]?(&PRGptr[r][V<<14]):0,PRGram[r]); + } + else + { + uint32 VA=V<<3; + int x; + + for(x=0;x<8;x++) + setpageptr(2,A+(x<<11),PRGptr[r]?(&PRGptr[r][((VA+x)&PRGmask2[r])<<11]):0,PRGram[r]); + } +} + +void setprg16(uint32 A, uint32 V) +{ + setprg16r(0,A,V); +} + +void setprg32r(int r,unsigned int A, unsigned int V) +{ + if(PRGsize[r]>=32768) + { + V&=PRGmask32[r]; + setpageptr(32,A,PRGptr[r]?(&PRGptr[r][V<<15]):0,PRGram[r]); + } + else + { + uint32 VA=V<<4; + int x; + + for(x=0;x<16;x++) + setpageptr(2,A+(x<<11),PRGptr[r]?(&PRGptr[r][((VA+x)&PRGmask2[r])<<11]):0,PRGram[r]); + } +} + +void setprg32(uint32 A, uint32 V) +{ + setprg32r(0,A,V); +} + +void setchr1r(int r, unsigned int A, unsigned int V) +{ + if(!CHRptr[r]) return; + MDFNPPU_LineUpdate(); + V&=CHRmask1[r]; + if(CHRram[r]) + PPUCHRRAM|=(1<<(A>>10)); + else + PPUCHRRAM&=~(1<<(A>>10)); + VPageR[(A)>>10]=&CHRptr[r][(V)<<10]-(A); +} + +void setchr2r(int r, unsigned int A, unsigned int V) +{ + if(!CHRptr[r]) return; + MDFNPPU_LineUpdate(); + V&=CHRmask2[r]; + VPageR[(A)>>10]=VPageR[((A)>>10)+1]=&CHRptr[r][(V)<<11]-(A); + if(CHRram[r]) + PPUCHRRAM|=(3<<(A>>10)); + else + PPUCHRRAM&=~(3<<(A>>10)); +} + +void setchr4r(int r, unsigned int A, unsigned int V) +{ + if(!CHRptr[r]) return; + MDFNPPU_LineUpdate(); + V&=CHRmask4[r]; + VPageR[(A)>>10]=VPageR[((A)>>10)+1]= + VPageR[((A)>>10)+2]=VPageR[((A)>>10)+3]=&CHRptr[r][(V)<<12]-(A); + + if(CHRram[r]) + PPUCHRRAM |= (15<<(A>>10)); + else + PPUCHRRAM&=~(15<<(A>>10)); +} + +void setchr8r(int r, unsigned int V) +{ + int x; + + if(!CHRptr[r]) return; + MDFNPPU_LineUpdate(); + V&=CHRmask8[r]; + for(x=7;x>=0;x--) + VPageR[x]=&CHRptr[r][V<<13]; + + if(CHRram[r]) + PPUCHRRAM = 0xFF; + else + PPUCHRRAM = 0; +} + +void setchr1(unsigned int A, unsigned int V) +{ + setchr1r(0,A,V); +} + +void setchr2(unsigned int A, unsigned int V) +{ + setchr2r(0,A,V); +} + +void setchr4(unsigned int A, unsigned int V) +{ + setchr4r(0,A,V); +} + +void setchr8(unsigned int V) +{ + setchr8r(0,V); +} + +void setvram8(uint8 *p) +{ + int x; + + MDFNPPU_LineUpdate(); + + for(x=7;x>=0;x--) + VPageR[x]=p; + PPUCHRRAM|=255; +} + +void setvram4(uint32 A, uint8 *p) +{ + int x; + + MDFNPPU_LineUpdate(); + + for(x=3;x>=0;x--) + VPageR[(A>>10)+x]=p-A; + PPUCHRRAM|=(15<<(A>>10)); +} + +void setvramb1(uint8 *p, uint32 A, uint32 b) +{ + MDFNPPU_LineUpdate(); + VPageR[A>>10]=p-A+(b<<10); + PPUCHRRAM|=(1<<(A>>10)); +} + +void setvramb2(uint8 *p, uint32 A, uint32 b) +{ + MDFNPPU_LineUpdate(); + VPageR[(A>>10)]=VPageR[(A>>10)+1]=p-A+(b<<11); + PPUCHRRAM|=(3<<(A>>10)); +} + +void setvramb4(uint8 *p, uint32 A, uint32 b) +{ + int x; + + MDFNPPU_LineUpdate(); + for(x=3;x>=0;x--) + VPageR[(A>>10)+x]=p-A+(b<<12); + PPUCHRRAM|=(15<<(A>>10)); +} + +void setvramb8(uint8 *p, uint32 b) +{ + int x; + + MDFNPPU_LineUpdate(); + for(x=7;x>=0;x--) + VPageR[x]=p+(b<<13); + PPUCHRRAM|=255; +} + +/* This function can be called without calling SetupCartMirroring(). */ + +void setntamem(uint8 *p, int ram, uint32 b) +{ + MDFNPPU_LineUpdate(); + vnapage[b]=p; + PPUNTARAM&=~(1<> (4 + x)) & 1) + { + //assert(!GenieBackup[x]); + + GenieBackup[x] = GetReadHandler(genieaddr[x]); + SetReadHandler(genieaddr[x], genieaddr[x], GenieFix[x]); + } + } +} + +static void RemoveGenieReadPatches(void) +{ + // Remove in reverse order to install in case addrs are the same(corrupted save states could trigger this possibly). + for(int x = 2; x >= 0; x--) + { + if(GenieBackup[x]) + { + SetReadHandler(genieaddr[x], genieaddr[x], GenieBackup[x]); + GenieBackup[x] = NULL; + } + } +} + +/* Called when a game(file) is opened successfully. */ +void Genie_Init(void) +{ + try + { + if(!GENIEROM) + { + GENIEROM = (uint8 *)MDFN_malloc_T(4096+1024, _("Game Genie ROM image")); + + std::string fn = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS("nes.ggrom")); + MDFNFILE fp(fn.c_str(), NULL, _("Game Genie ROM Image")); + + fp.read(GENIEROM, 16); + + if(!memcmp(GENIEROM, "NES\x1A", 4)) /* iNES ROM image */ + { + fp.read(GENIEROM, 4096); + fp.seek(16384 - 4096, SEEK_CUR); + fp.read(GENIEROM + 4096, 256); + } + else + { + fp.read(GENIEROM + 16, 4352-16); + } + fp.Close(); + + /* Workaround for the Mednafen CHR page size only being 1KB */ + for(int x = 0; x < 4; x++) + memcpy(GENIEROM + 4096 + (x<<8), GENIEROM + 4096, 256); + } + + AReadGG = (readfunc *)MDFN_calloc_T(sizeof(readfunc), 32768, _("Game Genie Read Map Backup")); + BWriteGG = (writefunc *)MDFN_calloc_T(sizeof(writefunc), 32768, _("Game Genie Write Map Backup")); + + GenieBIOSHooksInstalled = FALSE; + + for(int x = 0; x < 3; x++) + { + GenieBackup[x] = NULL; + + genieval[x] = 0xFF; + geniech[x] = 0xFF; + genieaddr[x] = 0xFFFF; + } + + geniestage=1; + } + catch(...) + { + if(GENIEROM) + { + MDFN_free(GENIEROM); + GENIEROM = NULL; + } + + if(AReadGG) + { + MDFN_free(AReadGG); + AReadGG = NULL; + } + + if(BWriteGG) + { + MDFN_free(BWriteGG); + BWriteGG = NULL; + } + + throw; + } +} + +void Genie_Kill(void) +{ + geniestage = 0; + //FlushGenieRW(); + VPageR = VPage; + + if(GENIEROM) + { + MDFN_free(GENIEROM); + GENIEROM = NULL; + } + + if(AReadGG) + { + MDFN_free(AReadGG); + AReadGG = NULL; + } + + if(BWriteGG) + { + MDFN_free(BWriteGG); + BWriteGG = NULL; + } + + memset(&GenieBackup, 0, sizeof(GenieBackup)); +} + +static DECLFR(GenieRead) +{ + return GENIEROM[A&4095]; +} + +static DECLFW(GenieWrite) +{ + switch(A) + { + case 0x800c: + case 0x8008: + case 0x8004: + genieval[((A-4)&0xF)>>2]=V; + break; + + case 0x800b: + case 0x8007: + case 0x8003: + geniech[((A-3)&0xF)>>2]=V; + break; + + case 0x800a: + case 0x8006: + case 0x8002:genieaddr[((A-2)&0xF)>>2] &= 0xFF00; + genieaddr[((A-2)&0xF)>>2] |= V; + break; + + case 0x8009: + case 0x8005: + case 0x8001:genieaddr[((A-1)&0xF)>>2] &= 0x00FF; + genieaddr[((A-1)&0xF)>>2] |= (V | 0x80) << 8; + break; + + case 0x8000:if(!V) + FixGenieMap(); + else + { + modcon = V ^ 0xFF; + if(V == 0x71) + modcon=0; + } + break; + } +} + + +static DECLFR(GenieFix1) +{ + uint8 r=GenieBackup[0](A); + + if((modcon>>1)&1) // No check + return genieval[0]; + else if(r==geniech[0]) + return genieval[0]; + + return r; +} + +static DECLFR(GenieFix2) +{ + uint8 r=GenieBackup[1](A); + + if((modcon>>2)&1) // No check + return genieval[1]; + else if(r==geniech[1]) + return genieval[1]; + + return r; +} + +static DECLFR(GenieFix3) +{ + uint8 r=GenieBackup[2](A); + + if((modcon>>3)&1) // No check + return genieval[2]; + else if(r==geniech[2]) + return genieval[2]; + + return r; +} + +static void FixGenieMap(void) +{ + geniestage = 2; + + if(!GenieBIOSHooksInstalled) + return; + + RemoveGenieBIOSHooks(); + + InstallGenieReadPatches(); + + // Call this last, after GenieBIOSHooksInstalled = FALSE and our read cheat hooks are installed. Yay spaghetti code. + MDFNMP_InstallReadPatches(); +} + +void Genie_Power(void) +{ + if(!geniestage) + return; + + RemoveGenieReadPatches(); + + for(unsigned x = 0; x < 3; x++) + { + genieval[x] = 0xFF; + geniech[x] = 0xFF; + genieaddr[x] = 0xFFFF; + } + + geniestage = 1; + modcon = 0; + + if(!GenieBIOSHooksInstalled) + InstallGenieBIOSHooks(); +} + +void Genie_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + auto tmp_modcon = modcon; + auto tmp_geniestage = geniestage; + auto tmp_genieval = genieval; + auto tmp_geniech = geniech; + auto tmp_genieaddr = genieaddr; + + SFORMAT StateRegs[] = + { + SFVAR(tmp_geniestage), + SFVAR(tmp_modcon), + + SFARRAY(tmp_genieval.data(), tmp_genieval.size()), + SFARRAY(tmp_geniech.data(), tmp_geniech.size()), + SFARRAY16(tmp_genieaddr.data(), tmp_genieaddr.size()), + + SFEND + }; + + bool lsv = MDFNSS_StateAction(sm, load, data_only, StateRegs, "GENIE", load < 0x937); + + if(load) + { + if(!lsv || !GENIEROM) + { + if(lsv && tmp_geniestage == 1) + throw MDFN_Error(0, _("State saved in Game Genie screen, but GG emulation is currently disabled!")); + + tmp_geniestage = (GENIEROM ? 2 : 0); + tmp_modcon = 0; + + for(unsigned x = 0; x < 3; x++) + { + tmp_genieval[x] = 0xFF; + tmp_geniech[x] = 0xFF; + tmp_genieaddr[x] = 0xFFFF; + } + } + + for(unsigned x = 0; x < 3; x++) + tmp_genieaddr[x] |= 0x8000; + + MDFNMP_RemoveReadPatches(); + RemoveGenieReadPatches(); + RemoveGenieBIOSHooks(); + + modcon = tmp_modcon; + geniestage = tmp_geniestage; + genieval = tmp_genieval; + geniech = tmp_geniech; + genieaddr = tmp_genieaddr; + + switch(geniestage) + { + default: + geniestage = 0; + MDFNMP_InstallReadPatches(); + break; + + case 1: + InstallGenieBIOSHooks(); + break; + + case 2: + InstallGenieReadPatches(); + MDFNMP_InstallReadPatches(); + break; + } + } +} + +void MDFN_SaveGameSave(CartInfo *LocalHWInfo) +{ + if(LocalHWInfo->battery && LocalHWInfo->SaveGame[0]) + { + try + { + FileStream sp(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), FileStream::MODE_WRITE_INPLACE); + + for(unsigned x = 0; x < 4; x++) + if(LocalHWInfo->SaveGame[x]) + sp.write(LocalHWInfo->SaveGame[x], LocalHWInfo->SaveGameLen[x]); + + sp.close(); + } + catch(std::exception &e) + { + throw MDFN_Error(0, _("Error saving save game file: %s\n"), e.what()); + } + } +} + +void MDFN_LoadGameSave(CartInfo *LocalHWInfo) +{ + if(LocalHWInfo->battery && LocalHWInfo->SaveGame[0]) + { + try + { + FileStream sp(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), FileStream::MODE_READ); + + for(unsigned x = 0; x < 4; x++) + if(LocalHWInfo->SaveGame[x]) + sp.read(LocalHWInfo->SaveGame[x], LocalHWInfo->SaveGameLen[x]); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw MDFN_Error(0, _("Error loading save game file: %s\n"), e.what()); + } + catch(std::exception &e) + { + throw MDFN_Error(0, _("Error loading save game file: %s\n"), e.what()); + } + } +} + +} diff --git a/Mednafen/mednafen/nes/cart.h b/Mednafen/mednafen/nes/cart.h new file mode 100644 index 0000000000..5d42413824 --- /dev/null +++ b/Mednafen/mednafen/nes/cart.h @@ -0,0 +1,117 @@ +#ifndef __MDFN_NES_CART_H +#define __MDFN_NES_CART_H + +#include "sound.h" + +namespace MDFN_IEN_NES +{ + +typedef struct __CartInfo { + /* Set by mapper/board code: */ + void (*Power)(struct __CartInfo *); + void (*Reset)(struct __CartInfo *); + void (*Close)(void); + uint8 *SaveGame[4]; /* Pointers to memory to save/load. */ + uint32 SaveGameLen[4]; /* How much memory to save/load. */ + + int (*StateAction)(StateMem *sm, int load, int data_only); /* Save state saving/loading function. */ + + EXPSOUND CartExpSound; /* Board code should set at least HiSync and HiFill to non-NULL if uses expansion sound. */ + + /* Set by iNES/UNIF loading code. */ + int mirror; /* As set in the header or chunk. + iNES/UNIF specific. Intended + to help support games like "Karnov" + that are not really MMC3 but are + set to mapper 4. + */ + int battery; /* Presence of an actual battery. */ + uint8 MD5[16]; + uint32 CRC32; /* Should be set by the iNES/UNIF loading + code, used by mapper/board code, maybe + other code in the future. + */ +} CartInfo; + +void MDFN_SaveGameSave(CartInfo *LocalHWInfo); +void MDFN_LoadGameSave(CartInfo *LocalHWInfo); + +extern uint8 *Page[32],*VPage[8],*MMC5SPRVPage[8],*MMC5BGVPage[8]; + +void ResetCartMapping(void); +void SetupCartPRGMapping(int chip, uint8 *p, uint32 size, int ram); +void SetupCartCHRMapping(int chip, uint8 *p, uint32 size, int ram); +void SetupCartMirroring(int m, int hard, uint8 *extra); +bool CartHasHardMirroring(void); +uint8 *GetCartPagePtr(uint16 A); + +DECLFR(CartBROB); +DECLFR(CartBR); +DECLFW(CartBW); + +extern uint8 *PRGptr[32]; +extern uint8 *CHRptr[32]; + +extern uint32 PRGsize[32]; +extern uint32 CHRsize[32]; + +extern uint32 PRGmask2[32]; +extern uint32 PRGmask4[32]; +extern uint32 PRGmask8[32]; +extern uint32 PRGmask16[32]; +extern uint32 PRGmask32[32]; + +extern uint32 CHRmask1[32]; +extern uint32 CHRmask2[32]; +extern uint32 CHRmask4[32]; +extern uint32 CHRmask8[32]; + +void setprg2(uint32 A, uint32 V); +void setprg4(uint32 A, uint32 V); +void setprg8(uint32 A, uint32 V); +void setprg16(uint32 A, uint32 V); +void setprg32(uint32 A, uint32 V); + +void setprg2r(int r, unsigned int A, unsigned int V); +void setprg4r(int r, unsigned int A, unsigned int V); +void setprg8r(int r, unsigned int A, unsigned int V); +void setprg16r(int r, unsigned int A, unsigned int V); +void setprg32r(int r, unsigned int A, unsigned int V); + +void setchr1r(int r, unsigned int A, unsigned int V); +void setchr2r(int r, unsigned int A, unsigned int V); +void setchr4r(int r, unsigned int A, unsigned int V); +void setchr8r(int r, unsigned int V); + +void setchr1(unsigned int A, unsigned int V); +void setchr2(unsigned int A, unsigned int V); +void setchr4(unsigned int A, unsigned int V); +void setchr8(unsigned int V); + +void setvram4(uint32 A, uint8 *p); +void setvram8(uint8 *p); + +void setvramb1(uint8 *p, uint32 A, uint32 b); +void setvramb2(uint8 *p, uint32 A, uint32 b); +void setvramb4(uint8 *p, uint32 A, uint32 b); +void setvramb8(uint8 *p, uint32 b); + +void setmirror(int t); +void setmirrorw(int a, int b, int c, int d); +void setntamem(uint8 *p, int ram, uint32 b); + +#define MI_H 0 +#define MI_V 1 +#define MI_0 2 +#define MI_1 3 + +extern uint8 geniestage; + +void Genie_Init(void); +void Genie_Kill(void); +bool Genie_BIOSInstalled(void); +void Genie_StateAction(StateMem* sm, const unsigned load, const bool data_only); +void Genie_Power(void); + +} +#endif diff --git a/Mednafen/mednafen/nes/debug.cpp b/Mednafen/mednafen/nes/debug.cpp new file mode 100644 index 0000000000..f9ac09a02b --- /dev/null +++ b/Mednafen/mednafen/nes/debug.cpp @@ -0,0 +1,534 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include +#include "x6502.h" +#include "debug.h" +#include "ppu/ppu.h" +#include "cart.h" +#include + +namespace MDFN_IEN_NES +{ +static void RedoHooks(void); + +#define NUMBT 64 + +struct BTEntry +{ + uint32 from; + uint32 to; + uint32 vector; + uint32 branch_count; + bool valid; +}; + +static BTEntry BTEntries[NUMBT]; +static int BTIndex; +static bool BTEnabled; + +void NESDBG_AddBranchTrace(uint32 from, uint32 to, uint32 vector) +{ + BTEntry *prevbt = &BTEntries[(BTIndex + NUMBT - 1) % NUMBT]; + + from &= 0xFFFF; + to &= 0xFFFF; + + //if(BTEntries[(BTIndex - 1) & 0xF] == PC) return; + + if(prevbt->from == from && prevbt->to == to && prevbt->vector == vector && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid) + prevbt->branch_count++; + else + { + BTEntries[BTIndex].from = from; + BTEntries[BTIndex].to = to; + BTEntries[BTIndex].vector = vector; + BTEntries[BTIndex].branch_count = 1; + BTEntries[BTIndex].valid = true; + + BTIndex = (BTIndex + 1) % NUMBT; + } +} + +static void EnableBranchTrace(bool enable) +{ + BTEnabled = enable; + if(!enable) + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + } + RedoHooks(); +} + +static std::vector GetBranchTrace(void) +{ + BranchTraceResult tmp; + std::vector ret; + + for(int x = 0; x < NUMBT; x++) + { + const BTEntry *bt = &BTEntries[(x + BTIndex) % NUMBT]; + + if(!bt->valid) + continue; + + tmp.count = bt->branch_count; + trio_snprintf(tmp.from, sizeof(tmp.from), "%04X", bt->from); + trio_snprintf(tmp.to, sizeof(tmp.to), "%04X", bt->to); + + tmp.code[1] = 0; + switch(bt->vector) + { + default: tmp.code[0] = 0; + break; + + case 0xFFFC: + tmp.code[0] = 'R'; // RESET + break; + + case 0xFFFA: + tmp.code[0] = 'N'; // NMI + break; + + case 0xFFFE: + tmp.code[0] = 'I'; // IRQ + break; + } + + ret.push_back(tmp); + } + return(ret); +} + +uint32 NESDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ret = 0; + + for(unsigned int i = 0; i < bsize; i++) + { + A &= 0xFFFF; + + if(hl) + fceuindbg = 1; + ret |= ARead[A](A) << (i * 8); + fceuindbg = 0; + + A++; + } + return(ret); +} + +void NESDBG_MemPoke(uint32 A, uint32 V, unsigned int bsize, bool hl, bool logical) +{ + extern uint8 *Page[32]; + + for(unsigned int i = 0; i < bsize; i++) + { + A &= 0xFFFF; + if(hl) + { + if(Page[A/2048]) + Page[A/2048][A] = V & 0xFF; + } + else + BWrite[A](A,V & 0xFF); + + V >>= 8; + A++; + } +} + +extern NESGameType *GameInterface; + +void NESDBG_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + fceuindbg = 1; + while(Length--) + { + Address &= 0xFFFF; + *Buffer = ARead[Address](Address); + + Address++; + Buffer++; + } + fceuindbg = 0; + } +} + +void NESDBG_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + fceuindbg = 1; + while(Length--) + { + Address &= 0xFFFF; + uint8 *page = GetCartPagePtr(Address); + + if(page && hl) + page[Address] = *Buffer; + else + BWrite[Address](Address,*Buffer); + + Address++; + Buffer++; + } + fceuindbg = 0; + } +} + + +void NESDBG_IRQ(int level) +{ + + +} + +uint32 NESDBG_GetVector(int level) +{ + // Fixme? + return(0); +} + +class Dis2A03 : public Dis6502 +{ + public: + Dis2A03(void) : Dis6502(0) + { + + } + + uint8 GetX(void) + { + return(X.X); + } + + uint8 GetY(void) + { + return(X.Y); + } + + uint8 Read(uint16 A) + { + uint8 ret; + fceuindbg = 1; + ret = ARead[A](A); + fceuindbg = 0; + return(ret); + } +}; + +static Dis2A03 DisObj; + +void NESDBG_Disassemble(uint32 &a, uint32 SpecialA, char *TextBuf) +{ + uint16 tmpa = a; + std::string ret; + + DisObj.Disassemble(tmpa, SpecialA, TextBuf); + + a = tmpa; +} + +typedef struct __NES_BPOINT { + unsigned int A[2]; + int type; +} NES_BPOINT; + +static std::vector BreakPointsPC, BreakPointsRead, BreakPointsWrite; + +static void (*CPUHook)(uint32 PC, bool) = NULL; +static bool CPUHookContinuous = false; +static bool FoundBPoint = 0; + +static void CPUHandler(uint32 PC) +{ + std::vector::iterator bpit; + + if(!FoundBPoint) + for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) + { + if(PC >= bpit->A[0] && PC <= bpit->A[1]) + { + FoundBPoint = true; + break; + } + } + + CPUHookContinuous |= FoundBPoint; + if(CPUHookContinuous && CPUHook) + CPUHook(PC, FoundBPoint); + + FoundBPoint = false; +} + +static uint8 ReadHandler(X6502 *cur_X, unsigned int A) +{ + if(cur_X->preexec) + { + std::vector::iterator bpit; + + for(bpit = BreakPointsRead.begin(); bpit != BreakPointsRead.end(); bpit++) + { + if(A >= bpit->A[0] && A <= bpit->A[1]) + { + FoundBPoint = 1; + break; + } + } + } + return(ARead[A](A)); +} + +static void WriteHandler(X6502 *cur_X, unsigned int A, uint8 V) +{ + if(cur_X->preexec) + { + std::vector::iterator bpit; + + for(bpit = BreakPointsWrite.begin(); bpit != BreakPointsWrite.end(); bpit++) + { + if(A >= bpit->A[0] && A <= bpit->A[1]) + { + FoundBPoint = 1; + break; + } + } + } + else + BWrite[A](A,V); +} + +static void RedoHooks(void) +{ + X6502_Debug((CPUHook || BTEnabled) ? CPUHandler : NULL, (CPUHook && BreakPointsRead.size()) ? ReadHandler : NULL, (CPUHook && BreakPointsWrite.size()) ? WriteHandler : 0); +} + +static void AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + NES_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type =type; + + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_PC) + BreakPointsPC.push_back(tmp); + + RedoHooks(); +} + +static void FlushBreakPoints(int type) +{ + std::vector::iterator bpit; + + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_PC) + BreakPointsPC.clear(); + + RedoHooks(); +} + +static void SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + CPUHook = callb; + CPUHookContinuous = continuous; + + RedoHooks(); +} + +enum +{ + CPU_GSREG_PC = 0, + CPU_GSREG_A, + CPU_GSREG_X, + CPU_GSREG_Y, + CPU_GSREG_SP, + CPU_GSREG_P, + CPU_GSREG_TIMESTAMP +}; + +static RegType NESCPURegs[] = +{ + { CPU_GSREG_PC, "PC", "Program Counter", 2 }, + { CPU_GSREG_A, "A", "Accumulator", 1 }, + { CPU_GSREG_X, "X", "X Index", 1 }, + { CPU_GSREG_Y, "Y", "Y Index", 1 }, + { CPU_GSREG_SP, "SP", "Stack Pointer", 1 }, + { CPU_GSREG_P, "P", "Status", 1 }, + { CPU_GSREG_TIMESTAMP, "TiSt", "Timestamp", 4 }, + { 0, "", "", 0 }, +}; + +static uint32 GetRegister_CPU(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case CPU_GSREG_PC: + value = X.PC; + break; + + case CPU_GSREG_A: + value = X.A; + break; + + case CPU_GSREG_X: + value = X.X; + break; + + case CPU_GSREG_Y: + value = X.Y; + break; + + case CPU_GSREG_SP: + value = X.S; + break; + + case CPU_GSREG_P: + value = X.P; + if(special) + { + trio_snprintf(special, special_len, "N: %d, V: %d, D: %d, I: %d, Z: %d, C: %d", (int)(bool)(value & N_FLAG), + (int)(bool)(value & V_FLAG), + (int)(bool)(value & D_FLAG), + (int)(bool)(value & I_FLAG), + (int)(bool)(value & Z_FLAG), + (int)(bool)(value & C_FLAG)); + } + break; + + case CPU_GSREG_TIMESTAMP: + value = timestamp; + break; + } + + return(value); +} + +static void SetRegister_CPU(const unsigned int id, uint32 value) +{ + switch(id) + { + case CPU_GSREG_PC: + X.PC = value & 0xFFFF; + break; + + case CPU_GSREG_A: + X.A = value & 0xFF; + break; + + case CPU_GSREG_X: + X.X = value & 0xFF; + break; + + case CPU_GSREG_Y: + X.Y = value & 0xFF; + break; + + case CPU_GSREG_SP: + X.S = value & 0xFF; + break; + + case CPU_GSREG_P: + X.P = (value & 0xFF) & ~(B_FLAG | U_FLAG); + break; + + case CPU_GSREG_TIMESTAMP: + break; + } +} + +static RegGroupType NESCPURegsGroup = +{ + "6502", + NESCPURegs, + GetRegister_CPU, + SetRegister_CPU +}; + + +static RegType NESPPURegs[] = +{ + { PPU_GSREG_PPU0, "PPU0", "PPU0", 1 }, + { PPU_GSREG_PPU1, "PPU1", "PPU1", 1 }, + { PPU_GSREG_PPU2, "PPU2", "PPU2", 1 }, + { PPU_GSREG_PPU3, "PPU3", "PPU3", 1 }, + { PPU_GSREG_XOFFSET, "XOffset", "Tile X Offset", 1}, + { PPU_GSREG_RADDR, "RAddr", "Refresh Address", 2}, + { PPU_GSREG_TADDR, "TAddr", "Temp Address", 2}, + { PPU_GSREG_VRAMBUF, "VRAM Buf", "VRAM Buffer", 1}, + { PPU_GSREG_VTOGGLE, "V-Toggle", "High/low Toggle", 1}, + { PPU_GSREG_SCANLINE, "Scanline", "Current Scanline(0 = first visible, 0xF0 = in vblank)", 1 }, + { 0, "", "", 0 }, +}; + +static RegGroupType NESPPURegsGroup = +{ + "PPU", + NESPPURegs, + NESPPU_GetRegister, + NESPPU_SetRegister +}; + +DebuggerInfoStruct NESDBGInfo = +{ + "cp437", + 3, + 1, // Instruction alignment(bytes) + 16, + 16, + 0x0000, // Default watch addr + 0x0000, // ZP + NESDBG_MemPeek, + NESDBG_Disassemble, + NULL, + NESDBG_IRQ, + NESDBG_GetVector, + FlushBreakPoints, + AddBreakPoint, + SetCPUCallback, + EnableBranchTrace, + GetBranchTrace, + NESPPU_SetGraphicsDecode, +}; + +bool NESDBG_Init(void) +{ + memset(BTEntries, 0, sizeof(BTEntries)); + BTIndex = 0; + BTEnabled = false; + + MDFNDBG_AddRegGroup(&NESCPURegsGroup); + MDFNDBG_AddRegGroup(&NESPPURegsGroup); + + return(TRUE); +} +} diff --git a/Mednafen/mednafen/nes/debug.h b/Mednafen/mednafen/nes/debug.h new file mode 100644 index 0000000000..ac03e8082b --- /dev/null +++ b/Mednafen/mednafen/nes/debug.h @@ -0,0 +1,28 @@ +#ifndef __MDFN_NES_DEBUG_H +#define __MDFN_NES_DEBUG_H + +#ifdef WANT_DEBUGGER + +namespace MDFN_IEN_NES +{ +#include "x6502struct.h" + +uint32 NESDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical); +void NESDBG_MemPoke(uint32 A, uint32 V, unsigned int bsize, bool, bool logical); +void NESDBG_IRQ(int level); +uint32 NESDBG_GetVector(int level); +void NESDBG_Disassemble(uint32 &a, uint32 SpecialA, char *); + +void NESDBG_AddBranchTrace(uint32 from, uint32 to, uint32 vector); + +void NESDBG_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer); +void NESDBG_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer); + +bool NESDBG_Init(void); + +extern DebuggerInfoStruct NESDBGInfo; +} + +#endif + +#endif diff --git a/Mednafen/mednafen/nes/fds-sound.cpp b/Mednafen/mednafen/nes/fds-sound.cpp new file mode 100644 index 0000000000..0b246f6185 --- /dev/null +++ b/Mednafen/mednafen/nes/fds-sound.cpp @@ -0,0 +1,513 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "x6502.h" +#include "fds.h" +#include "sound.h" +#include "cart.h" +#include "nsf.h" +#include "fds-sound.h" + +namespace MDFN_IEN_NES +{ + +static void RenderSoundHQ(void); + +static DECLFW(FDSWaveWrite); +static DECLFR(FDSWaveRead); + +static DECLFR(FDSSRead); +static DECLFW(FDSSWrite); + +//static bool cwave_ip = TRUE; + +static int32 env_divider; // Main envelope clock divider. + +static int32 sample_out_cache; // Sample out cache, with volume stuff applied. + +static uint32 cwave_freq; // $4082 and lower 4 bits of $4083 +static uint32 cwave_pos; +static uint8 cwave_control; // $4083, lower 6 bits masked out. + +static uint32 mod_freq; // $4086 and lower 4 bits of $4087 +static uint32 mod_pos; // Should be named "mwave_pos", but "mod_pos" distinguishes it more. +static bool mod_disabled; // Upper bit of $4087 + +static uint8 master_control; // Waveform write enable and master volume($4089) +static uint8 env_speed; // Master envelope speed controller($408A). + +static uint8 env_control[2]; // Envelope control(4080/4084) +static uint8 volume[2]; // Current volumes. + +static int32 mwave[0x20]; // Modulation waveform. Stored in expanded(after LUT) form. + // Set to 0x10 if the original value is 0x4(reset sweep bias accumulator). +static uint8 cwave[0x40]; // Game-defined waveform(carrier) + +static int32 env_counter[2]; + +static uint32 sweep_bias; + +static int32 cov; // Current out volume, 8 bits of after-decimal place precision. + +static int32 FBC = 0; + +// We need to call this function whenever volume[0] changes, and on changes in the lower 2 bits of master_control, +static INLINE void CalcCOV(void) +{ + int k = volume[0]; + +// printf("%d %d\n", volume[0], master_control & 0x3); + + if(k > 0x20) + k = 0x20; + + cov = 256 * k * 6 / ((master_control & 0x3) + 2); +} + +static DECLFR(FDSSRead) +{ + if(!fceuindbg) + RenderSoundHQ(); + + //printf("Read: %04x\n", A); + switch(A & 0xF) + { + case 0x0: return(volume[0] | (X.DB&0xC0)); + case 0x2: return(volume[1] | (X.DB&0xC0)); + } + return(X.DB); +} + +bool reset_mode = 0; + +static INLINE int GetEnvReload(uint8 value) +{ + int ret; + + ret = (value & 0x3F) + 1; + + return(ret); +} + +static DECLFW(FDSSWrite) +{ + RenderSoundHQ(); + + //printf("%04x %02x, %lld\n", A, V, timestampbase + timestamp); + A -= 0x4080; + switch(A) + { + default: //printf("%04x %02x\n", A, V); + break; + + case 0x0: if(V & 0x80) + { + volume[0] = V & 0x3F; + CalcCOV(); + } + else if(env_control[0] & 0x80) + env_counter[0] = GetEnvReload(V); + + env_control[0] = V; + break; + + case 0x2: cwave_freq &= 0xFF00; + cwave_freq |= V << 0; + break; + + case 0x3: + if(!(V & 0x80) && (cwave_control & 0x80)) + cwave_pos = 0; + + //if(!(V & 0x40) && (cwave_control & 0x40)) + // env_divider = env_speed << 3; + + cwave_freq &= 0x00FF; + cwave_freq |= (V & 0xF) << 8; + cwave_control = V & 0xC0; + break; + + case 0x4: if(V & 0x80) + { + volume[1] = V & 0x3F; + } + else if(env_control[1] & 0x80) + env_counter[1] = GetEnvReload(V); + + env_control[1] = V; + break; + + case 0x5: sweep_bias = (V & 0x7F) << 4; + mod_pos = 0; + //printf("Sweep Bias: %02x\n", V & 0x7F); + break; + + case 0x6: mod_freq &= 0xFF00; + mod_freq |= V << 0; + break; + + case 0x7: + //if(!(V & 0x80) && mod_disabled) + // mod_pos = 0; + + mod_freq &= 0x00FF; + mod_freq |= (V & 0xF) << 8; + mod_disabled = (bool)(V & 0x80); + break; + + case 0x8: + if(mod_disabled) + { + static const int bias_tab[8] = { 0, 1, 2, 4, 0, -4, -2, -1 }; + + for(int i = 0; i < 31; i++) + mwave[i] = mwave[i + 1]; + + mwave[0x1F] = bias_tab[V & 0x7]; + + if((V & 0x7) == 0x4) + mwave[0x1F] = 0x10; + } + //else + // puts("NYAR"); + break; + + case 0x9: master_control = V; + CalcCOV(); + break; + + case 0xA: env_speed = V; + break; + } +} + +static void ClockEnv(void) +{ + for(int x = 0; x < 2; x++) + { + if((env_control[x] & 0x80) || (cwave_control & 0x40)) + continue; + + env_counter[x]--; + + if(env_counter[x] <= 0) + { + if(env_control[x] & 0x40) // Fade in + { + if(volume[x] < 0x20) + volume[x]++; + } + else // Fade out + { + if(volume[x] > 0) + volume[x]--; + } + if(!x) + CalcCOV(); + + env_counter[x] = GetEnvReload(env_control[x]); + } + } +} + +static DECLFR(FDSWaveRead) +{ + if(master_control & 0x80) + return(cwave[A&0x3f]|(X.DB&0xC0)); + else + { + //puts("MEOWARG"); + return(X.DB); + } +} + +static DECLFW(FDSWaveWrite) +{ + if(master_control & 0x80) + { + const int index = A & 0x3F; + + //printf("%04x %02x, %lld\n", A, V, timestampbase + timestamp); + + cwave[index] = V & 0x3F; + } +} + +static uint32 prev_mod_pos = 0; +static int32 temp = 0; +int mod_div = 0; + +static INLINE void ClockMod(void) +{ + if(!mod_disabled) + { + prev_mod_pos = mod_pos; + + mod_pos += mod_freq; + + if((mod_pos & (0x3F << 12)) != (prev_mod_pos & (0x3F << 12))) + { + const int32 mw = mwave[((mod_pos >> 17) & 0x1F)]; + + sweep_bias = (sweep_bias + mw) & 0x7FF; + //printf("%d %d\n", mod_pos >> 17, sweep_bias); + if(mw == 0x10) + sweep_bias = 0; + } + + temp = sign_x_to_s32(11, sweep_bias) * ((volume[1] > 0x20) ? 0x20 : volume[1]); + + // >> 4 or / 16? / 16 sounds better in Zelda... + if(temp & 0x0F0) + { + temp /= 256; + if(sweep_bias & 0x400) + temp--; + else + temp += 2; + } + else + temp /= 256; + + if(temp >= 194) + { + //printf("Oops: %d\n", temp); + temp -= 258; + } + if(temp < -64) + { + //printf("Oops2: %d\n", temp); + temp += 256; + } + } +} + +static INLINE void ClockCarrier(void) +{ + int32 cur_cwave_freq; + + if(!mod_disabled) + { + cur_cwave_freq = (int32)(cwave_freq << 6) + (int32)cwave_freq * temp; + + if(cur_cwave_freq < 0) + cur_cwave_freq = 0; + } + else + cur_cwave_freq = cwave_freq << 6; + + cwave_pos += cur_cwave_freq; +} + +static INLINE void FDSDoSound(void) +{ + uint32 prev_cwave_pos = cwave_pos; + + ClockMod(); + + if(!(master_control & 0x80) && !(cwave_control & 0x80)) + ClockCarrier(); + + if(env_speed) + { + env_divider--; + if(env_divider <= 0) + { + env_divider = env_speed << 3; + + ClockEnv(); + } + } + + #if 0 + if(cwave_ip) + { + int k = volume[0]; + + if(k > 0x20) + k = 0x20; + + //printf("%d, %d, %lld\n", prev_cwave_pos >> 22, cwave_pos >> 22, timestampbase + timestamp); + + int32 cur, delta, iped; + + cur = (cwave[(cwave_pos >> 22) & 0x3F] - 0x20) * k * 6; + delta = ((cwave[((cwave_pos >> 22) + 1) & 0x3F] - 0x20) * k * 6) - cur; + + iped = cur + ((delta * ((cwave_pos >> 14) & 0xFF)) >> 8); + + sample_out_cache = iped / ((master_control & 0x3) + 2); + } + else + #endif + + if((cwave_pos ^ prev_cwave_pos) & (1 << 22)) + //if(!(master_control & 0x80) && !(cwave_control & 0x80)) + { + //printf("%d, %d, %lld\n", prev_cwave_pos >> 22, cwave_pos >> 22, timestampbase + timestamp); + + sample_out_cache = ((cwave[(cwave_pos >> 22) & 0x3F] - 0x20) * cov) >> 8; + } +} + +#define NZEROS 2 +#define NPOLES 2 +#define GAIN 5.172298875e+03 + +static float xv[NZEROS+1], yv[NPOLES+1]; + +static INLINE double filterloop(double input) +{ + xv[0] = xv[1]; + xv[1] = xv[2]; + xv[2] = input / GAIN; + yv[0] = yv[1]; + yv[1] = yv[2]; + + yv[2] = (xv[0] + xv[2]) + 2 * xv[1] + + ( -0.9610604561 * yv[0]) + ( 1.9602871056 * yv[1]); + return(yv[2]); +} + +static void RenderSoundHQ(void) +{ + //MDFN_DispMessage("%02x\n", volume[1]); + for(uint32 x = FBC; x < SOUNDTS; x++) + { + FDSDoSound(); + + WaveHiEx[x] += sample_out_cache; //filterloop(sample_out_cache); + } + + FBC = SOUNDTS; +} + +static void HQSync(int32 ts) +{ + FBC=ts; +} + +int NSFFDS_Init(EXPSOUND *ep, bool MultiChip) +{ + //memset(&fdso,0,sizeof(fdso)); + + ep->HiSync=HQSync; + ep->HiFill=RenderSoundHQ; + + SetReadHandler(0x4040,0x407f,FDSWaveRead); + NSFECSetWriteHandler(0x4040,0x407f,FDSWaveWrite); + NSFECSetWriteHandler(0x4080,0x408A,FDSSWrite); + SetReadHandler(0x4090,0x4092,FDSSRead); + + return(1); +} + + +bool FDSSound_Init(void) +{ + EXPSOUND TmpExpSound; + memset(&TmpExpSound, 0, sizeof(TmpExpSound)); + + SetReadHandler(0x4040, 0x407f, FDSWaveRead); + SetWriteHandler(0x4040, 0x407f, FDSWaveWrite); + SetWriteHandler(0x4080, 0x408A, FDSSWrite); + SetReadHandler(0x4090, 0x4092, FDSSRead); + + TmpExpSound.HiSync=HQSync; + TmpExpSound.HiFill=RenderSoundHQ; + + GameExpSound.push_back(TmpExpSound); + + return(1); +} + + +void FDSSound_Power(void) +{ + env_divider = 0; + sample_out_cache = 0; + + cwave_freq = 0; + cwave_pos = 0; + cwave_control = 0; + + mod_freq = 0; + mod_pos = 0; + mod_disabled = 0; + + master_control = 0; + env_speed = 0; + + memset(&env_control, 0, sizeof(env_control)); + memset(&volume, 0, sizeof(volume)); + memset(cwave, 0, sizeof(cwave)); + memset(mwave, 0, sizeof(mwave)); + memset(env_counter, 0, sizeof(env_counter)); + + sweep_bias = 0; +} + + +void FDSSound_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(env_divider), + + SFVAR(sample_out_cache), + + SFVAR(cwave_freq), + SFVAR(cwave_pos), + SFVAR(cwave_control), + + SFVAR(mod_freq), + SFVAR(mod_pos), + SFVAR(mod_disabled), + + SFVAR(master_control), + SFVAR(env_speed), + + SFARRAY(env_control, 2), + SFARRAY(volume, 2), + SFARRAY32(mwave, 0x20), + SFARRAY(cwave, 0x40), + + SFARRAY32(env_counter, 2), + + SFVAR(sweep_bias), + + SFEND + }; + + if(!load) + { + + } + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "FDSS"); + + if(load) + { + for(int i = 0; i < 0x40; i++) + cwave[i] &= 0x3F; + + CalcCOV(); + } +} + +} diff --git a/Mednafen/mednafen/nes/fds-sound.h b/Mednafen/mednafen/nes/fds-sound.h new file mode 100644 index 0000000000..29129f9579 --- /dev/null +++ b/Mednafen/mednafen/nes/fds-sound.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_NES_FDSSOUND_H +#define __MDFN_NES_FDSSOUND_H + +namespace MDFN_IEN_NES +{ +bool FDSSound_Init(void); +void FDSSound_Power(void); +void FDSSound_StateAction(StateMem *sm, const unsigned load, const bool data_only); +} + +#endif diff --git a/Mednafen/mednafen/nes/fds.cpp b/Mednafen/mednafen/nes/fds.cpp new file mode 100644 index 0000000000..a9c368155b --- /dev/null +++ b/Mednafen/mednafen/nes/fds.cpp @@ -0,0 +1,773 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "x6502.h" +#include "fds.h" +#include "sound.h" +#include "cart.h" +#include "nsf.h" +#include "fds-sound.h" +#include +#include + +#include + +/* TODO: Add code to put a delay in between the time a disk is inserted + and the when it can be successfully read/written to. This should + prevent writes to wrong places OR add code to prevent disk ejects + when the virtual motor is on(mmm...virtual motor). +*/ +namespace MDFN_IEN_NES +{ +static DECLFR(FDSRead4030); +static DECLFR(FDSRead4031); +static DECLFR(FDSRead4032); +static DECLFR(FDSRead4033); + +static DECLFW(FDSWrite); + +static DECLFR(FDSBIOSRead); +static DECLFR(FDSRAMRead); +static DECLFW(FDSRAMWrite); +static void FDSPower(void); +static void FDSInit(void); +static void FDSFix(int a); + + +static uint8 *FDSRAM = NULL; +static uint8 *CHRRAM = NULL; + +static uint8 V4023; +static uint8 ExLatch; + +static uint8 Control; + +static int32 IRQCounter, IRQReload, IRQControl; + +static void FDSSaveNV(void); +static void FDSKill(void); + +static uint8 FDSBIOS[8192]; + +/* Original disk data backup, to help in creating save states. */ +static uint8 *diskdatao[8]={0,0,0,0,0,0,0,0}; + +static uint8 *diskdata[8]={0,0,0,0,0,0,0,0}; + +static unsigned int TotalSides; +static bool DiskWritten; /* Set to 1 if disk was written to. */ +static uint8 writeskip; +static uint32 DiskPtr; +static int32 DiskSeekIRQ; + +static int ActiveDisk = -1; + +bool FDS_SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + const RMD_Layout* rmd = MDFNGameInfo->RMD; + const RMD_Drive* rd = &rmd->Drives[drive_idx]; + const RMD_State* rs = &rd->PossibleStates[state_idx]; + + if(rs->MediaPresent && rs->MediaUsable) + ActiveDisk = (media_idx * 2) | (orientation_idx & 1); + else + ActiveDisk = -1; + + return true; +} + +static void FDSFix(int a) +{ + if(IRQCounter) + { + IRQCounter -= a; + if(IRQCounter <= 0) + { + //extern int scanline; + //printf("FDS IRQ: %d\n", scanline); + + if(IRQControl & 1) + IRQCounter = IRQReload; + else + IRQCounter = 0; + X6502_IRQBegin(MDFN_IQEXT); + } + } + + if(DiskSeekIRQ>0) + { + DiskSeekIRQ-=a; + if(DiskSeekIRQ<=0) + { + if(Control & 0x80) + { + X6502_IRQBegin(MDFN_IQEXT2); + } + } + } +} + +static DECLFR(FDSRead4030) +{ + uint8 ret=0; + + /* Cheap hack. */ + if(X.IRQlow&MDFN_IQEXT) ret|=1; + if(X.IRQlow&MDFN_IQEXT2) ret|=2; + + if(!fceuindbg) + { + X6502_IRQEnd(MDFN_IQEXT); + X6502_IRQEnd(MDFN_IQEXT2); + } + //printf("Read 4030: %02x\n", ret); + + return ret; +} + +static DECLFR(FDSRead4031) +{ + static uint8 z=0; + if(ActiveDisk >= 0) + { + z=diskdata[ActiveDisk][DiskPtr]; + if(!fceuindbg) + { + if(DiskPtr<64999) DiskPtr++; + DiskSeekIRQ=150; + X6502_IRQEnd(MDFN_IQEXT2); + } + } + return z; +} +static DECLFR(FDSRead4032) +{ + uint8 ret; + + ret=X.DB&~7; + if(ActiveDisk < 0) + ret|=5; + + if(ActiveDisk < 0 || !(Control & 1) || (Control & 2)) + ret|=2; + return ret; +} + +static DECLFR(FDSRead4033) +{ + return(0x80 & ExLatch); // battery +} + +static DECLFW(FDSRAMWrite) +{ + (FDSRAM-0x6000)[A]=V; +} + +static DECLFR(FDSBIOSRead) +{ + return (FDSBIOS-0xE000)[A]; +} + +static DECLFR(FDSRAMRead) +{ + return (FDSRAM-0x6000)[A]; +} + +static DECLFW(FDSWrite) +{ +// extern int scanline; +// if(A == 0x4020 || A == 0x4021 || A == 0x4022 || A == 0x4023) +// MDFN_printf("IRQ Write : $%04x:$%02x, %d %08x %08x %02x\n",A,V,scanline, IRQReload, IRQCounter, V4023); +// else +// MDFN_printf("$%04x:$%02x, %d %08x %08x\n",A,V,scanline, IRQReload, IRQCounter); + + switch(A) + { + case 0x4020: + if(V4023 & 1) + { + IRQReload &= 0xFF00; + IRQReload |= V; + } + break; + + case 0x4021: + if(V4023 & 1) + { + IRQReload &= 0x00FF; + IRQReload |= V << 8; + } + break; + + case 0x4022: + X6502_IRQEnd(MDFN_IQEXT); + + if(V4023 & 1) + { + if(V & 2) + IRQCounter = IRQReload; + + IRQControl = V & 1; + } + break; + + case 0x4023: + V4023 = V; + break; + + case 0x4024: + if(ActiveDisk >= 0 && !(Control & 0x4) && (V4023 & 0x1)) + { + if(DiskPtr>=0 && DiskPtr<65500) + { + if(writeskip) writeskip--; + else if(DiskPtr>=2) + { + DiskWritten = true; + diskdata[ActiveDisk][DiskPtr-2]=V; + } + } + } + break; + + case 0x4025: + X6502_IRQEnd(MDFN_IQEXT2); + if(ActiveDisk >= 0) + { + if(!(V&0x40)) + { + if((Control & 0x40) && !(V & 0x10)) + { + DiskSeekIRQ=200; + DiskPtr-=2; + } + if(DiskPtr<0) DiskPtr=0; + } + if(!(V&0x4)) writeskip=2; + if(V&2) {DiskPtr=0;DiskSeekIRQ=200;} + if(V&0x40) DiskSeekIRQ=200; + } + setmirror(((V>>3)&1)^1); + + Control = V; + break; + + case 0x4026: + ExLatch = V; + break; + + } +} + +static void FreeFDSMemory(void) +{ + for(unsigned int x = 0; x < 8; x++) + { + if(diskdata[x]) + { + MDFN_free(diskdata[x]); + diskdata[x] = NULL; + } + + if(diskdatao[x]) + { + MDFN_free(diskdatao[x]); + diskdatao[x] = NULL; + } + } + + if(FDSRAM) + { + MDFN_free(FDSRAM); + FDSRAM = NULL; + } + + if(CHRRAM) + { + MDFN_free(CHRRAM); + CHRRAM = NULL; + } + + TotalSides = 0; + DiskWritten = false; +} + +static void SubLoad(Stream *fp) +{ + uint8 header[16]; + uint32 MaxSides = 8; + + fp->read(header, 16); + + if(!memcmp(header,"FDS\x1a",4)) + { + MaxSides = std::min(MaxSides, header[4]); + + if(!MaxSides) + MaxSides = 1; + } + else + fp->rewind(); + + TotalSides = 0; + for(unsigned x = 0; x < MaxSides; x++) + { + diskdata[x] = (uint8 *)MDFN_malloc_T(65500, _("FDS Disk Data")); + if(fp->read(diskdata[x], 65500, false) != 65500) + { + MDFN_free(diskdata[x]); + diskdata[x] = NULL; + break; + } + TotalSides++; + } +} + +static void FDS_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + unsigned int x; + SFORMAT StateRegs[] = + { + SFARRAY(diskdata[0], 65500), + SFARRAY(diskdata[1], 65500), + SFARRAY(diskdata[2], 65500), + SFARRAY(diskdata[3], 65500), + SFARRAY(diskdata[4], 65500), + SFARRAY(diskdata[5], 65500), + SFARRAY(diskdata[6], 65500), + SFARRAY(diskdata[7], 65500), + SFARRAY(FDSRAM, 32768), + SFARRAY(CHRRAM, 8192), + + SFVAR(V4023), + SFVAR(ExLatch), + SFVAR(Control), + SFVAR(IRQCounter), + SFVAR(IRQReload), + SFVAR(IRQControl), + SFVAR(writeskip), + SFVAR(DiskPtr), + SFVAR(DiskSeekIRQ), + SFVAR(DiskWritten), + SFEND + }; + + if(!load) + { + for(x=0;x>3)^1); + + for(x=0;xread(header, 16, false) != 16 || (memcmp(header, "FDS\x1a", 4) && memcmp(header + 1, "*NINTENDO-HVC*", 14))) + return false; + + return true; +} + + +void FDSLoad(Stream *fp, NESGameType *gt) +{ + try + { + fp->rewind(); + + SubLoad(fp); + + md5_context md5; + md5.starts(); + + for(unsigned int x = 0; x < TotalSides; x++) + { + md5.update(diskdata[x],65500); + + diskdatao[x] = (uint8 *)MDFN_malloc_T(65500, _("FDS Disk Data")); + memcpy(diskdatao[x],diskdata[x],65500); + } + md5.finish(MDFNGameInfo->MD5); + + { + FileStream bios_fp(MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, "disksys.rom"), FileStream::MODE_READ); + + bios_fp.read(FDSBIOS, 8192); + if(!memcmp(FDSBIOS, "NES\x1a", 4)) // Encapsulated in iNES format? + { + uint32 seekrel = 16; + + if(FDSBIOS[4] == 2) + seekrel += 16384; + + bios_fp.seek(seekrel, SEEK_CUR); + bios_fp.read(FDSBIOS, 8192); + } + } + + FDSRAM = (uint8*)MDFN_malloc_T(32768, _("FDS RAM")); + CHRRAM = (uint8*)MDFN_malloc_T(8192, _("CHR RAM")); + + DiskWritten = false; + + // + // + // + try + { + GZFileStream tp(MDFN_MakeFName(MDFNMKF_SAV, 0, "fds"), GZFileStream::MODE::READ); + + for(unsigned int x = 0; x < TotalSides; x++) + { + if(diskdata[x]) + { + MDFN_free(diskdata[x]); + diskdata[x] = NULL; + } + } + + SubLoad(&tp); + DiskWritten = true; /* For save state handling. */ + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + // + // + // + { + RMD_Drive dr; + + dr.Name = "FDS"; + dr.PossibleStates.push_back(RMD_State({_("Disk Ejected"), false, false, true})); + dr.PossibleStates.push_back(RMD_State({_("Disk Inserted"), true, true, false})); + dr.CompatibleMedia.push_back(0); + dr.MediaMtoPDelay = 2000; + MDFNGameInfo->RMD->Drives.push_back(dr); + MDFNGameInfo->RMD->MediaTypes.push_back(RMD_MediaType({_("FDS Floppy Disk")})); + + for(unsigned n = 0; n < TotalSides; n += 2) + { + std::vector orientations; + char namebuf[128]; + char obuf[128]; + + trio_snprintf(namebuf, sizeof(namebuf), _("Disk %u of %u"), 1 + n / 2, (TotalSides + 1) / 2); + + for(unsigned o = 0; o < std::min(2, TotalSides - n); o++) + { + trio_snprintf(obuf, sizeof(obuf), _("Side %c"), o ? 'B' : 'A'); + orientations.push_back(obuf); + } + + MDFNGameInfo->RMD->Media.push_back({namebuf, 0, orientations}); + } + } + + ActiveDisk = -1; + + ResetCartMapping(); + SetupCartCHRMapping(0,CHRRAM,8192,1); + SetupCartMirroring(0,0,0); + memset(CHRRAM,0,8192); + memset(FDSRAM,0,32768); + + MDFN_printf(_("Sides: %d\n"),TotalSides); + MDFN_printf(_("Manufacturer Code: %02x (%s)\n"), diskdata[0][0xF], GetManName(diskdata[0][0xF])); + MDFN_printf(_("MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + FDSInit(); + + gt->SaveNV = FDSSaveNV; + gt->Kill = FDSKill; + gt->Power = FDSPower; + gt->StateAction = FDS_StateAction; + } + catch(...) + { + FreeFDSMemory(); + throw; + } +} + +static void FDSSaveNV(void) +{ + if(DiskWritten) + { + try + { + FileStream fp(MDFN_MakeFName(MDFNMKF_SAV, 0, "fds"), FileStream::MODE_WRITE_INPLACE); + + for(unsigned int x = 0; x < TotalSides; x++) + fp.write(diskdata[x], 65500); + + fp.truncate(fp.tell()); + fp.close(); + } + catch(std::exception &e) + { + MDFN_PrintError("Error saving FDS image: %s", e.what()); + } + } +} + +static void FDSKill(void) +{ + FreeFDSMemory(); +} + + +static void FDSInit(void) +{ + MapIRQHook = FDSFix; + + SetReadHandler(0x4030, 0x4030, FDSRead4030); + SetReadHandler(0x4031, 0x4031, FDSRead4031); + SetReadHandler(0x4032, 0x4032, FDSRead4032); + SetReadHandler(0x4033, 0x4033, FDSRead4033); + + SetWriteHandler(0x4020, 0x402F, FDSWrite); + + SetWriteHandler(0x6000, 0xdfff, FDSRAMWrite); + SetReadHandler(0x6000, 0xdfff, FDSRAMRead); + SetReadHandler(0xE000, 0xFFFF, FDSBIOSRead); + + FDSSound_Init(); +} + +static void FDSPower(void) +{ + setprg8r(0, 0xe000, 0); // BIOS + setprg32r(1, 0x6000, 0); // 32KB RAM + setchr8(0); // 8KB CHR RAM + + writeskip=DiskPtr=DiskSeekIRQ=0; + + Control = 0; + setmirror(1); + + V4023 = 0; + ExLatch = 0; + IRQCounter = 0; + IRQReload = 0; + IRQControl = 0; + + FDSSound_Power(); +} + +} diff --git a/Mednafen/mednafen/nes/fds.h b/Mednafen/mednafen/nes/fds.h new file mode 100644 index 0000000000..9c37ad64ec --- /dev/null +++ b/Mednafen/mednafen/nes/fds.h @@ -0,0 +1,10 @@ +#ifndef __MDFN_NES_FDS_H +#define __MDFN_NES_FDS_H + +namespace MDFN_IEN_NES +{ +void FDSSoundReset(void); +bool FDS_SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx); +} + +#endif diff --git a/Mednafen/mednafen/nes/filter.cpp b/Mednafen/mednafen/nes/filter.cpp new file mode 100644 index 0000000000..355b916518 --- /dev/null +++ b/Mednafen/mednafen/nes/filter.cpp @@ -0,0 +1,910 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* This resampler has only been designed with NES CPU frequencies(NTSC and PAL) as the input rate, and output rates of + 22050-192000 in mind, up to 1024 coefficient multiply-accumulates per output sample. + + An SSE2-utilizing MAC-loop is written, but is commented out as it is likely to perform significantly worse than the MMX + version on a large number of common x86 CPU architectures. +*/ + +// +// Don't set these higher than 3, the accumulation variables will overflow if you do. +// +#define FIR_TABLE_EXTRA_BITS 3 +#define FIR_TABLE_EXTRA_BITS_S "3" + +#include +#include +#include "filter.h" +#include + +#if defined(ARCH_POWERPC_ALTIVEC) && defined(HAVE_ALTIVEC_H) + #include +#endif + +#ifdef __FAST_MATH__ + #error "filter.cpp not compatible with unsafe math optimizations!" +#endif + +static void kaiser_window( double* io, int count, double beta ) +{ + int const accuracy = 16; //12; + + double* end = io + count; + + double beta2 = beta * beta * (double) -0.25; + double to_fract = beta2 / ((double) count * count); + double i = 0; + double rescale = 0; // Doesn't need an initializer, to shut up gcc + + for ( ; io < end; ++io, i += 1 ) + { + double x = i * i * to_fract - beta2; + double u = x; + double k = x + 1; + + double n = 2; + do + { + u *= x / (n * n); + n += 1; + k += u; + } + while ( k <= u * (1 << accuracy) ); + + if ( !i ) + rescale = 1 / k; // otherwise values get large + + *io *= k * rescale; + } +} + +static void gen_sinc( double* out, int size, double cutoff, double kaiser ) +{ + assert( size % 2 == 0 ); // size must be enev + + int const half_size = size / 2; + double* const mid = &out [half_size]; + + // Generate right half of sinc + for ( int i = 0; i < half_size; i++ ) + { + double angle = (i * 2 + 1) * (M_PI / 2); + mid [i] = sin( angle * cutoff ) / angle; + } + + kaiser_window( mid, half_size, kaiser ); + + // Mirror for left half + for ( int i = 0; i < half_size; i++ ) + out [i] = mid [half_size - 1 - i]; +} + +static void normalize( double* io, int size, double gain = 1.0 ) +{ + double sum = 0; + for ( int i = 0; i < size; i++ ) + sum += io [i]; + + double scale = gain / sum; + for ( int i = 0; i < size; i++ ) + io [i] *= scale; +} + + +static INLINE void DoMAC(int16 *wave, int16 *coeffs, int32 count, int32 *accum_output) +{ + int32 acc0[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + int32 acc1[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + int c; + + for(c = 0; c < (count >> 1); c += 8) + { + acc0[0] += ((int32)wave[c + 0] * coeffs[c + 0]); + acc0[1] += ((int32)wave[c + 1] * coeffs[c + 1]); + acc0[2] += ((int32)wave[c + 2] * coeffs[c + 2]); + acc0[3] += ((int32)wave[c + 3] * coeffs[c + 3]); + acc0[4] += ((int32)wave[c + 4] * coeffs[c + 4]); + acc0[5] += ((int32)wave[c + 5] * coeffs[c + 5]); + acc0[6] += ((int32)wave[c + 6] * coeffs[c + 6]); + acc0[7] += ((int32)wave[c + 7] * coeffs[c + 7]); + } + + acc0[0] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[1] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[2] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[3] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[4] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[5] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[6] >>= FIR_TABLE_EXTRA_BITS + 1; + acc0[7] >>= FIR_TABLE_EXTRA_BITS + 1; + + + for(; c < count; c += 8) + { + acc1[0] += ((int32)wave[c + 0] * coeffs[c + 0]); + acc1[1] += ((int32)wave[c + 1] * coeffs[c + 1]); + acc1[2] += ((int32)wave[c + 2] * coeffs[c + 2]); + acc1[3] += ((int32)wave[c + 3] * coeffs[c + 3]); + acc1[4] += ((int32)wave[c + 4] * coeffs[c + 4]); + acc1[5] += ((int32)wave[c + 5] * coeffs[c + 5]); + acc1[6] += ((int32)wave[c + 6] * coeffs[c + 6]); + acc1[7] += ((int32)wave[c + 7] * coeffs[c + 7]); + } + + acc1[0] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[1] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[2] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[3] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[4] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[5] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[6] >>= FIR_TABLE_EXTRA_BITS + 1; + acc1[7] >>= FIR_TABLE_EXTRA_BITS + 1; + + *accum_output = (acc0[0] + acc0[1] + acc0[2] + acc0[3] + acc0[4] + acc0[5] + acc0[6] + acc0[7] + + acc1[0] + acc1[1] + acc1[2] + acc1[3] + acc1[4] + acc1[5] + acc1[6] + acc1[7]) >> 15; +} + +#ifdef ARCH_X86 + +#ifdef __x86_64__ +#define X86_REGC "r" +#define X86_REGAT "" +#else +#define X86_REGC "e" +#define X86_REGAT "l" +#endif + +#if 0 +static INLINE void DoMAC_SSE2(int16 *wave, int16 *coeffs, int32 count, int32 *accum_output) +{ + // Multiplies 32 coefficients at a time. + int dummy; + +/* + ?di = wave pointer + ?si = coeffs pointer + ecx = count / 32 + edx = 32-bit int output pointer + + +*/ + // Will read 16 bytes of input waveform past end. + asm volatile( +"pxor %%xmm3, %%xmm3\n\t" // For a loop optimization + +"pxor %%xmm4, %%xmm4\n\t" +"pxor %%xmm5, %%xmm5\n\t" +"pxor %%xmm6, %%xmm6\n\t" +"pxor %%xmm7, %%xmm7\n\t" + +"movups 0(%%" X86_REGC "di), %%xmm0\n\t" +"SSE_Loop:\n\t" + +"movups 16(%%" X86_REGC "di), %%xmm1\n\t" +"pmaddwd 0(%%" X86_REGC "si), %%xmm0\n\t" +"paddd %%xmm3, %%xmm7\n\t" + +"movups 32(%%" X86_REGC "di), %%xmm2\n\t" +"pmaddwd 16(%%" X86_REGC "si), %%xmm1\n\t" +"paddd %%xmm0, %%xmm4\n\t" + +"movups 48(%%" X86_REGC "di), %%xmm3\n\t" +"pmaddwd 32(%%" X86_REGC "si), %%xmm2\n\t" +"paddd %%xmm1, %%xmm5\n\t" + +"movups 64(%%" X86_REGC "di), %%xmm0\n\t" +"pmaddwd 48(%%" X86_REGC "si), %%xmm3\n\t" +"paddd %%xmm2, %%xmm6\n\t" + +"add" X86_REGAT " $64, %%" X86_REGC "si\n\t" +"add" X86_REGAT " $64, %%" X86_REGC "di\n\t" +"subl $1, %%ecx\n\t" +"jnz SSE_Loop\n\t" + +"paddd %%xmm3, %%xmm7\n\t" // For a loop optimization + +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%xmm4\n\t" +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%xmm5\n\t" +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%xmm6\n\t" +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%xmm7\n\t" + +// +// Add the four summation xmm regs together into one xmm register, xmm7 +// +"paddd %%xmm4, %%xmm5\n\t" +"paddd %%xmm6, %%xmm7\n\t" +"paddd %%xmm5, %%xmm7\n\t" + +// +// Pre shift right by 1(and shift the rest, 15 bits, later) so we don't overflow during horizontal addition(could occur with large input +// amplitudes approaching the limits of the signed 16-bit range) +// +"psrad $1, %%xmm7\n\t" + +// +// Now for the "fun" horizontal addition... +// +// +"movaps %%xmm7, %%xmm4\n\t" +// (3 * 2^0) + (2 * 2^2) + (1 * 2^4) + (0 * 2^6) = 27 +"shufps $27, %%xmm7, %%xmm4\n\t" +"paddd %%xmm4, %%xmm7\n\t" + +// At this point, xmm7: +// (3 + 0), (2 + 1), (1 + 2), (0 + 3) +// +// (1 * 2^0) + (0 * 2^2) = 1 +"movaps %%xmm7, %%xmm4\n\t" +"shufps $1, %%xmm7, %%xmm4\n\t" +"paddd %%xmm4, %%xmm7\n\t" +"psrad $15, %%xmm7\n\t" +"movss %%xmm7, (%%" X86_REGC "dx)\n\t" + : "=D" (dummy), "=S" (dummy), "=c" (dummy) + : "D" (wave), "S" (coeffs), "c" (count >> 5), "d" (accum_output) +#ifdef __SSE__ + : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "cc", "memory" +#else + : "cc", "memory" +#endif +); +} +#endif + +static INLINE void DoMAC_MMX(int16 *wave, int16 *coeffs, int32 count, int32 *accum_output) +{ + // Multiplies 16 coefficients at a time. + int dummy; + +/* + MMX register usage: + mm0: Temporary sample load and multiply register + mm2: Temporary sample load and multiply register + + mm1: accumulator, 2 32-bit signed values + mm3: accumulator, 2 32-bit signed values + + mm4: accumulator, 2 32-bit signed values + mm5: accumulator, 2 32-bit signed values + + mm6: Temporary sample load and multiply register, temporary summation register + mm7: Temporary sample load and multiply register + +*/ + asm volatile( +"pxor %%mm1, %%mm1\n\t" +"pxor %%mm3, %%mm3\n\t" +"pxor %%mm4, %%mm4\n\t" +"pxor %%mm5, %%mm5\n\t" +"MMX_Loop:\n\t" + +"movq (%%" X86_REGC "di), %%mm0\n\t" +"pmaddwd (%%" X86_REGC "si), %%mm0\n\t" + +"movq 8(%%" X86_REGC "di), %%mm2\n\t" +"psrad $1, %%mm0\n\t" +"pmaddwd 8(%%" X86_REGC "si), %%mm2\n\t" + +"movq 16(%%" X86_REGC "di), %%mm6\n\t" +"psrad $1, %%mm2\n\t" +"pmaddwd 16(%%" X86_REGC "si), %%mm6\n\t" + +"movq 24(%%" X86_REGC "di), %%mm7\n\t" +"psrad $1, %%mm6\n\t" +"pmaddwd 24(%%" X86_REGC "si), %%mm7\n\t" + +"paddd %%mm0, %%mm1\n\t" +"paddd %%mm2, %%mm3\n\t" +"psrad $1, %%mm7\n\t" +"paddd %%mm6, %%mm4\n\t" +"paddd %%mm7, %%mm5\n\t" + +"add" X86_REGAT " $32, %%" X86_REGC "si\n\t" +"add" X86_REGAT " $32, %%" X86_REGC "di\n\t" +"subl $1, %%ecx\n\t" +"jnz MMX_Loop\n\t" + +// +#if FIR_TABLE_EXTRA_BITS != 0 +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%mm1\n\t" +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%mm3\n\t" +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%mm4\n\t" +"psrad $" FIR_TABLE_EXTRA_BITS_S ", %%mm5\n\t" +#endif + +// Now, mm1, mm3, mm4, mm5 contain 8 32-bit sums that need to be added together. + +"paddd %%mm5, %%mm3\n\t" +"paddd %%mm4, %%mm1\n\t" +"paddd %%mm3, %%mm1\n\t" +"movq %%mm1, %%mm6\n\t" +"psrlq $32, %%mm6\n\t" +"paddd %%mm6, %%mm1\n\t" + +"psrad $15, %%mm1\n\t" +//"psrad $16, %%mm1\n\t" +"movd %%mm1, (%%" X86_REGC "dx)\n\t" + : "=D" (dummy), "=S" (dummy), "=c" (dummy) + : "D" (wave), "S" (coeffs), "c" ((count + 0xF) >> 4), "d" (accum_output) + : "cc", "memory" +#ifdef __MMX__ + , "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7" +#else + // gcc has a bug or weird design flaw or something in it that keeps this from working properly: , "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)" +#endif +); +} +#endif + + +#ifdef ARCH_POWERPC_ALTIVEC +static INLINE void DoMAC_AltiVec(int16 *wave, int16 *coeffs, int32 count, int32 *accum_output) +{ + vector signed int acc0, acc1, acc2, acc3; + vector unsigned int vecsrEBp1 = vec_splats((unsigned int)FIR_TABLE_EXTRA_BITS + 1); + vector unsigned int vecsr16m1 = vec_splats((unsigned int)16 - 1); + vector signed int zerosi = vec_splat_s32(0); + vector signed short wd0, fd0; + vector signed short wd1, fd1; + vector signed int tmp; + int32 ino; + +#if 0 + { + const uint8 blocksize = 1 * sizeof(int16); + const uint8 blockcount = (count + 15) / 16; + const int16 blockstride = blocksize; + + vec_dstt(coeffs, (blocksize << 3) | (blockcount << 8) | (blockstride << 16), 0); + } +#endif + + acc0 = zerosi; + acc1 = zerosi; + acc2 = zerosi; + acc3 = zerosi; + + for(ino = 0; ino < count; ino += (16 << 1)) + { + wd0 = vec_ld(ino, wave); + fd0 = vec_ld(ino, coeffs); + acc0 = vec_msums(wd0, fd0, acc0); + + wd1 = vec_ld(ino + (8 << 1), wave); + fd1 = vec_ld(ino + (8 << 1), coeffs); + acc1 = vec_msums(wd1, fd1, acc1); + } + + acc0 = vec_sra(acc0, vecsrEBp1); + acc1 = vec_sra(acc1, vecsrEBp1); + + for(; ino < (count << 1); ino += (16 << 1)) + { + wd0 = vec_ld(ino, wave); + fd0 = vec_ld(ino, coeffs); + acc2 = vec_msums(wd0, fd0, acc2); + + wd1 = vec_ld(ino + (8 << 1), wave); + fd1 = vec_ld(ino + (8 << 1), coeffs); + acc3 = vec_msums(wd1, fd1, acc3); + } + + acc2 = vec_sra(acc2, vecsrEBp1); + acc3 = vec_sra(acc3, vecsrEBp1); + + // + // + tmp = vec_add(vec_add(acc0, acc2), vec_add(acc1, acc3)); + tmp = vec_splat(vec_sums(tmp, zerosi), 3); + tmp = vec_sra(tmp, vecsr16m1); + + vec_ste(tmp, 0, accum_output); +} +#endif + +/* Returns number of samples written to out. */ +/* leftover is set to the number of samples that need to be copied + from the end of in to the beginning of in. +*/ + +int32 NES_Resampler::Do(int16 *in, int16 *out, uint32 maxoutlen, uint32 inlen, int32 *leftover) +{ + uint32 max; + uint32 count=0; + int32 *boobuf = &IntermediateBuffer[0]; + int32 *I32Out = boobuf; + + { + int64 max_temp = inlen; + + max_temp -= NumCoeffs; + + if(max_temp < 0) + { + puts("Eep"); + max_temp = 0; + } + max = max_temp; + } + //printf("%d %d\n", inlen, max); + + if(0) + { + + } + #ifdef ARCH_X86 +#if 0 + else if((cpuext & CPUTEST_FLAG_SSE2) && !(cpuext & CPUTEST_FLAG_SSE2SLOW)) + { + while(InputIndex < max) + { + int16 *wave = &in[InputIndex]; + int16 *coeffs = &FIR_ENTRY(0, InputPhase, 0); + int32 coeff_count = FIR_CoCounts[0]; + + DoMAC_SSE2(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + } +#endif + else if(cpuext & CPUTEST_FLAG_MMX) + { + while(InputIndex < max) + { + const unsigned int align_index = InputIndex & 0x3; //((int)(unsigned long long)wave & 0x6) >> 1; + int16 *wave = &in[InputIndex &~ 0x3]; + int16 *coeffs = &FIR_ENTRY(align_index, InputPhase, 0); + int32 coeff_count = FIR_CoCounts[align_index]; + + DoMAC_MMX(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + asm volatile("emms\n\t"); + } + #endif + #ifdef ARCH_POWERPC_ALTIVEC + else if(cpuext & CPUTEST_FLAG_ALTIVEC) + { + while(InputIndex < max) + { + const unsigned int align_index = InputIndex & 0x7; + int16 *wave = &in[InputIndex &~ 0x7]; + int16 *coeffs = &FIR_ENTRY(align_index, InputPhase, 0); + int32 coeff_count = FIR_CoCounts[align_index]; + + DoMAC_AltiVec(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + } + #endif + else + { + while(InputIndex < max) + { + int16 *wave = &in[InputIndex]; + int16 *coeffs = &FIR_ENTRY(0, InputPhase, 0); + int32 coeff_count = FIR_CoCounts[0]; + + DoMAC(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + } + + + *leftover = inlen - InputIndex; + + InputIndex = 0; + + if(*leftover < 0) + { + //printf("Oops: %d\n", *leftover); + InputIndex = (0 - *leftover); + *leftover = 0; + } + + if(!debias_multiplier) + { + if(SoundVolume == 256) + { + for(uint32 x = 0; x < count; x++) + out[x] = boobuf[x]; + } + else + { + for(uint32 x = 0; x < count; x++) + out[x] = (boobuf[x] * SoundVolume) >> 8; + } + } + else + { + for(uint32 x = 0; x < count; x++) + { + int32 sample = boobuf[x]; + debias += ((int64)((int32)((uint32)sample << 16) - debias) * debias_multiplier) >> 32; + out[x] = ((sample - (debias >> 16)) * SoundVolume) >> 8; + } + } + return(count); +} + +NES_Resampler::~NES_Resampler() +{ + if(PhaseNext) + free(PhaseNext); + + if(PhaseStep) + free(PhaseStep); + + if(FIR_Coeffs_Real) + { + for(unsigned int i = 0; i < NumAlignments * NumPhases; i++) + if(FIR_Coeffs_Real[i]) + free(FIR_Coeffs_Real[i]); + + free(FIR_Coeffs_Real); + } + + if(FIR_Coeffs) + free(FIR_Coeffs); + + if(FIR_CoCounts) + free(FIR_CoCounts); +} + +void NES_Resampler::SetVolume(double newvolume) +{ + SoundVolume = (int32)(newvolume * 256); +} + +NES_Resampler::NES_Resampler(double input_rate, double output_rate, double rate_error, double hp_tc, int quality) +{ + double *FilterBuf = NULL; + double ratio = (double)output_rate / input_rate; + double cutoff; + double required_bandwidth; + double k_beta; + double k_d; + + InputRate = input_rate; + OutputRate = output_rate; + RateError = rate_error; + Quality = quality; + + IntermediateBuffer.resize(OutputRate * 4 / 50); // *4 for safety padding, / min(50,60), an approximate calculation + + cpuext = cputest_get_flags(); + + MDFN_printf("filter.cpp debug info:\n"); + MDFN_indent(1); + + if(0) + { + abort(); + } + #ifdef ARCH_X86 +#if 0 + else if((cpuext & CPUTEST_FLAG_SSE2) && !(cpuext & CPUTEST_FLAG_SSE2SLOW)) + { + MDFN_printf("SSE2\n"); + NumAlignments = 1; + } +#endif + else if(cpuext & CPUTEST_FLAG_MMX) + { + MDFN_printf("MMX\n"); + NumAlignments = 4; + } + #elif ARCH_POWERPC_ALTIVEC + else if(cpuext & CPUTEST_FLAG_ALTIVEC) + { + puts("AltiVec"); + NumAlignments = 8; + } + #endif + else + { + NumAlignments = 1; + puts("None"); + } + + + if(quality == -2) + { + k_beta = 4.538; + k_d = 2.93; + NumCoeffs = 192; + } + else if(quality == -1) + { + k_beta = 4.538; + k_d = 2.93; + NumCoeffs = 256; + } + else if(quality == 0) + { + k_beta = 5.658; + k_d = 3.62; + NumCoeffs = 352; + } + else if(quality == 1) + { + k_beta = 7.865; + k_d = 5.0; + NumCoeffs = 512; + } + else if(quality == 2) + { + k_beta = 8.960; + k_d = 5.7; + NumCoeffs = 768; + } + else if(quality == 3) + { + k_beta = 10.056; + k_d = 6.4; + NumCoeffs = 1024; + } + else + { + MDFN_indent(-1); + throw(-1); + } + + assert((NumCoeffs % 32) == 0); + assert(NumAlignments <= 8); + + NumCoeffs_Padded = NumCoeffs + 4 + 16; // FIXME: set differently based on SIMD path in use. + + required_bandwidth = k_d / NumCoeffs; + + MDFN_printf("%f\n", required_bandwidth); + + // Get the number of phases required, and adjust ratio. + { + double s_ratio = (double)input_rate / output_rate; + double findo = 0; + uint32 count = 0; + uint32 findo_i; + + do + { + count++; + findo += s_ratio; + } while( fabs(1.0 - ((floor(0.5 + findo) / count) / s_ratio)) > rate_error); + + s_ratio = floor(0.5 + findo) / count; + findo_i = (uint32) floor(0.5 + findo); + ratio = 1 / s_ratio; + NumPhases = count; + + PhaseNext = (uint32 *)malloc(sizeof(uint32) * NumPhases); + PhaseStep = (uint32 *)malloc(sizeof(uint32) * NumPhases); + + uint32 last_indoo = 0; + for(unsigned int i = 0; i < NumPhases; i++) + { + uint32 index_pos = i * findo_i / NumPhases; + + PhaseNext[i] = (i + 1) % (NumPhases); + PhaseStep[i] = index_pos - last_indoo; + last_indoo = index_pos; + } + PhaseStep[0] = findo_i - last_indoo; + + Ratio_Dividend = findo_i; + Ratio_Divisor = NumPhases; + + MDFN_printf("Phases: %d, Output rate: %f, %d %d\n", NumPhases, input_rate * ratio, Ratio_Dividend, Ratio_Divisor); + + MDFN_printf("Desired rate error: %.10f, Actual rate error: %.10f\n", rate_error, fabs((double)input_rate / output_rate * ratio - 1)); + } + + // Optimize cutoff for maximum sound frequencies humans can perceive, keep individual coefficient values from + // becoming too large, and keep dogs from freaking out with some games that "silence" + // sounds by making their fundamental frequencies beyond the range of typical human hearing. + // + // (For when output playback rate is considerably higher than 48KHz) + // + // This also incidentally handles the case of UPSAMPLING to a higher rate(at least when upsampling from the NES + // CPU frequency), so if this code is removed/disabled, code to handle that case will need to be added. + { + double cutoff_robot = (ratio - required_bandwidth) / NumPhases; + double cutoff_human = ((24000 * 2) / input_rate) / NumPhases; // Not subtracting required_bandwidth here is intentional. + + if(cutoff_human < cutoff_robot) + { + //puts("HUMANS WIN THIS ROUND"); + cutoff = cutoff_human; + } + else + cutoff = cutoff_robot; + } + + MDFN_printf("Cutoff: %f, %f\n", cutoff, required_bandwidth); + + if(cutoff <= 0) + { + MDFN_printf("Cutoff frequency is <= 0: %f\n", cutoff); + } + + FIR_Coeffs = (int16 **)malloc(sizeof(int16 **) * NumAlignments * NumPhases); + FIR_Coeffs_Real = (int16 **)malloc(sizeof(int16 **) * NumAlignments * NumPhases); + + for(unsigned int i = 0; i < NumAlignments * NumPhases; i++) + { + uint8 *tmp_ptr = (uint8 *)calloc(sizeof(int16) * NumCoeffs_Padded + 16, 1); + + FIR_Coeffs_Real[i] = (int16 *)tmp_ptr; + tmp_ptr += 0xF; + tmp_ptr -= ((unsigned long long)tmp_ptr & 0xF); + FIR_Coeffs[i] = (int16 *)tmp_ptr; + } + + MDFN_printf("FIR table memory usage: %d bytes\n", (int)((sizeof(int16) * NumCoeffs_Padded + 16) * NumAlignments * NumPhases)); + + + FilterBuf = (double *)malloc(sizeof(double) * NumCoeffs * NumPhases); + gen_sinc(FilterBuf, NumCoeffs * NumPhases, cutoff, k_beta); + normalize(FilterBuf, NumCoeffs * NumPhases); + + #if 0 + for(int i = 0; i < NumCoeffs * NumPhases; i++) + fprintf(stderr, "%.20f\n", FilterBuf[i]); + + #endif + + + FIR_CoCounts = (uint32 *)calloc(NumAlignments, sizeof(uint32)); + FIR_CoCounts[0] = NumCoeffs; + + for(unsigned int phase = 0; phase < NumPhases; phase++) + { + int32 neg_sum = 0; + int32 pos_sum = 0; + int32 sum = 0; + int32 sum_absv = 0; + int32 sum_absv8[8] = { 0 }; + int32 sum_absv8_alt[2][8] = { { 0 } }; + int32 sum_absv16[16] = { 0 }; + int32 max = 0, min = 0; + double amp_mult = 65536 * NumPhases * (1 << FIR_TABLE_EXTRA_BITS); + + const unsigned sp = (NumPhases - 1 - (((uint64)phase * Ratio_Dividend) % NumPhases)); + const unsigned tp = phase; + + + for(unsigned int i = 0; i < NumCoeffs; i++) + { + int32 tmpco = (int32)(FilterBuf[i * NumPhases + sp] * amp_mult); + + FIR_ENTRY(0, tp, i) = (int16)tmpco; + + sum += tmpco; + sum_absv += abs(tmpco); + sum_absv8[i & 0x7] += abs(tmpco); + sum_absv8_alt[i >= (NumCoeffs >> 1)][i & 0x7] += abs(tmpco); + sum_absv16[i & 0xF] += abs(tmpco); + + if(tmpco > max) + max = tmpco; + + if(tmpco < min) + min = tmpco; + + if(tmpco > 0) + pos_sum += tmpco; + else + neg_sum += tmpco; + } + + assert(min >= -32768); + assert(max <= 32767); + + + double wcru = 0; + + for(int i = 0; i < 8; i++) + { + double tmp_wcru = (-32768.0 * sum_absv8[i] / 2) / -2147483648.0; + + if(tmp_wcru > wcru) + wcru = tmp_wcru; + } + + for(int a = 0; a < 2; a++) + { + for(int i = 0; i < 8; i++) + { + double tmp_wcru = (-32768.0 * sum_absv8_alt[a][i]) / -2147483648.0; + + if(tmp_wcru > wcru) + wcru = tmp_wcru; + } + } + + for(int i = 0; i < 16; i++) + { + double tmp_wcru = (-32768.0 * sum_absv16[i]) / -2147483648.0; + + if(tmp_wcru > wcru) + wcru = tmp_wcru; + } + + // + // If wcru > 1.0, it indicates that the MAC loop(s) may suffer from integer overflows. + // though as long as it's < 1.05, it shouldn't cause problems(at least not with the NES sound emulation code this resampler is currently paired with). + // + MDFN_printf("Phase %d: min=%d max=%d, neg_sum=%d, pos_sum=%d, sum=%d, sum_absv=%d, wcru=%.4f\n", phase, min, max, neg_sum, pos_sum, sum, sum_absv, wcru); + } + + for(unsigned int ali = 1; ali < NumAlignments; ali++) + { + for(unsigned int phase = 0; phase < NumPhases; phase++) + { + FIR_CoCounts[ali] = NumCoeffs + ali; + for(unsigned int i = 0; i < NumCoeffs; i++) + { + FIR_ENTRY(ali, phase, i + ali) = FIR_ENTRY(0, phase, i); + } + } + } + + free(FilterBuf); + FilterBuf = NULL; + + InputIndex = 0; + InputPhase = 0; + + debias = 0; + + if(hp_tc > 0) + { + double tdm = (pow(2.0 - pow(M_E, -1.0), 1.0 / (hp_tc * output_rate)) - 1.0); + + //printf("%f\n", tdm); + assert(tdm >= 0.0 && tdm <= 0.4); + + debias_multiplier = ((int64)1 << 32) * tdm; + assert(debias_multiplier >= 0); + //printf("%d\n", debias_multiplier); + } + else + debias_multiplier = 0; + + MDFN_indent(-1); +} diff --git a/Mednafen/mednafen/nes/filter.h b/Mednafen/mednafen/nes/filter.h new file mode 100644 index 0000000000..3646d1e3c3 --- /dev/null +++ b/Mednafen/mednafen/nes/filter.h @@ -0,0 +1,89 @@ +#ifndef __NES_FILTER_H +#define __NES_FILTER_H + +#include + +class NES_Resampler +{ + public: + + // Resamples from input_rate to output_rate, allowing for rate_error(output_rate +/- output_rate*rate_error) + // error in the resample ratio. + // + // hp_tc is the time constant(in seconds) for the DC bias removal highpass filter. + // Higher values will result in more bias removal(and cause a high-pass filter effect), while lower values will lower this effect. + // Values lower than 200e-6, other than 0, may cause assert()'s to be triggered at some output rates due to overflow issues. + // A value of 0 will disable it entirely. + // + // quality is an arbitrary control of quality(-3 for lowest quality, 3 for highest quality) + NES_Resampler(double input_rate, double output_rate, double rate_error, double hp_tc, int quality) MDFN_COLD; + NES_Resampler(const NES_Resampler &resamp) MDFN_COLD; + ~NES_Resampler() MDFN_COLD; + + // Specify volume in percent amplitude(range 0 through 1.000..., inclusive). Default: SetVolume(1.0); + void SetVolume(double newvolume); + + // Resamples "inlen" samples from "in", writing the output "out", generating no more output samples than "maxoutlen". + // The int32 pointed to by leftover is set to the number of input samples left over from this filter iteration. + // "in" should be aligned to a 16-byte boundary, for the SIMD versions of the filter to work properly. "out" doesn't have any + // special alignment requirement. + int32 Do(int16 *in, int16 *out, uint32 maxoutlen, uint32 inlen, int32 *leftover); + + // Get the InputRate / OutputRate ratio, expressed as a / b + void GetRatio(int32 *a, int32 *b) + { + *a = Ratio_Dividend; + *b = Ratio_Divisor; + } + + private: + + // Copy of the parameters passed to the constructor + double InputRate, OutputRate, RateError; + int Quality; + + // Number of phases. + uint32 NumPhases; + uint32 NumPhases_Padded; + + // Coefficients(in each phase, not total) + uint32 NumCoeffs; + uint32 NumCoeffs_Padded; + + uint32 NumAlignments; + + // Index into the input buffer + uint32 InputIndex; + + // Current input phase + uint32 InputPhase; + + // In the FIR loop: InputPhase = PhaseNext[InputPhase] + uint32 *PhaseNext; + + // Incrementor for InputIndex. In the FIR loop, after updating InputPhase: InputIndex += PhaseStep[InputPhase] + uint32 *PhaseStep; + uint32 *PhaseStepSave; + + // One pointer for each phase in each possible alignment + int16 **FIR_Coeffs; + int16 **FIR_Coeffs_Real; + + #define FIR_ENTRY(align, phase, coco) FIR_Coeffs[(phase) * NumAlignments + align][coco] + + // Coefficient counts for the 4 alignments + uint32 *FIR_CoCounts; + + int32 SoundVolume; + std::vector IntermediateBuffer; //int32 boobuf[8192]; + + uint32 cpuext; + + int32 debias; + int32 debias_multiplier; + + // for GetRatio() + int32 Ratio_Dividend; + int32 Ratio_Divisor; +}; +#endif diff --git a/Mednafen/mednafen/nes/ines-bad.inc b/Mednafen/mednafen/nes/ines-bad.inc new file mode 100644 index 0000000000..20f0cf7909 --- /dev/null +++ b/Mednafen/mednafen/nes/ines-bad.inc @@ -0,0 +1,38 @@ +{ 0xecf78d8a13a030a6LL, "Ai Sensei no Oshiete", INESB_HACKED }, +{ 0x10f90ba5bd55c22eLL, "Alien Syndrome", INESB_HACKED }, +{ 0x4712856d3e12f21fLL, "Akumajou Densetsu", INESB_HACKED }, +{ 0x0d69ab3ad28ad1c2LL, "Banana", INESB_INCOMPLETE }, +{ 0x85d2c348a161cdbfLL, "Bio Senshi Dan", INESB_HACKED }, +{ 0x18fdb7c16aa8cb5cLL, "Bucky O'Hare", INESB_CORRUPT }, +{ 0xe27c48302108d11bLL, "Chibi Maruko Chan", INESB_HACKED }, +{ 0x9d1f505c6ba507bfLL, "Contra", INESB_HACKED }, +{ 0x60936436d3ea0ab6LL, "Crisis Force", INESB_HACKED }, +{ 0xcf31097ddbb03c5dLL, "Crystalis (Prototype)", INESB_CORRUPT }, +{ 0x92080a8ce94200eaLL, "Digital Devil Story II", INESB_HACKED }, +{ 0x97f133d8bc1c28dbLL, "Dragon Ball", INESB_HACKED }, +{ 0x6c2a2f95c2fe4b6eLL, "Dragon Ball", INESB_HACKED }, +{ 0x767aaff62963c58fLL, "Dragon Ball", INESB_HACKED }, +{ 0x500b267abb323005LL, "Dragon Warrior 4", INESB_CORRUPT }, +{ 0x02bdcf375704784bLL, "Erika to Satoru no Yume Bouken", INESB_HACKED }, +{ 0xd4fea9d2633b9186LL, "Famista 91", INESB_HACKED }, +{ 0xfdf8c812839b61f0LL, "Famista 92", INESB_HACKED }, +{ 0xb5bb1d0fb47d0850LL, "Famista 93", INESB_HACKED }, +{ 0x30471e773f7cdc89LL, "Famista 94", INESB_HACKED }, +{ 0x76c5c44ffb4a0bd7LL, "Fantasy Zone", INESB_HACKED }, +{ 0x27da2b0c500dc346LL, "Fire Emblem", INESB_HACKED }, +{ 0xb470bfb90e2b1049LL, "Fire Emblem Gaiden", INESB_HACKED }, +{ 0x23214fe456fba2ceLL, "Ganbare Goemon 2", INESB_HACKED }, +{ 0xbf8b22524e8329d9LL, "Ganbare Goemon Gaiden", INESB_HACKED }, +{ 0xa97041c3da0134e3LL, "Gegege no Kitarou 2", INESB_INCOMPLETE }, +{ 0x805db49a86db5449LL, "Goonies", INESB_HACKED }, +{ 0xc5abdaa65ac49b6bLL, "Gradius 2", INESB_HACKED }, +{ 0x04afae4ad480c11cLL, "Gradius 2", INESB_HACKED }, +{ 0x9b4bad37b5498992LL, "Gradius 2", INESB_HACKED }, +{ 0xb068d4ac10ef848eLL, "Highway Star", INESB_HACKED }, +{ 0xbf5175271e5019c3LL, "Kaiketsu Yanchamaru 3", INESB_HACKED }, +{ 0xfb4b508a236bbba3LL, "Salamander", INESB_HACKED }, +{ 0x3716c4bebf885344LL, "Super Mario Bros.", INESB_HACKED }, +{ 0x1895afc6eef26c7dLL, "Super Mario Bros.", INESB_HACKED }, +{ 0x103fc85d978b861bLL, "Sweet Home", INESB_CORRUPT }, +{ 0xfffda4407d80885aLL, "Sweet Home", INESB_CORRUPT }, +{ 0, 0, 0 } diff --git a/Mednafen/mednafen/nes/ines-correct.inc b/Mednafen/mednafen/nes/ines-correct.inc new file mode 100644 index 0000000000..685d0df3dd --- /dev/null +++ b/Mednafen/mednafen/nes/ines-correct.inc @@ -0,0 +1,216 @@ +{ 0, 185, -1, 0xc11e39a017a5f62aULL }, /* Othello (Japan) */ + +{ 0, 135, 8, 0x6ae12e21239c2688ULL }, /* Super Pang */ + + +{ 0, 159, 8, 0xdbe23478bb1f8326ULL }, /* Magical Taruruuto-kun */ +{ 0, 159, 8, 0xeb656a7a02dcbfb2ULL }, /* Magical Taruruuto-kun */ +{ 0, 159, 8, 0x224f9b6d97a65a5cULL }, /* Magical Taruruuto-kun 2 */ + +{ 0, 159, 8, 0x9c751033d0fe983aULL }, /* Dragon Ball Z - Kyoushuu Saiyajin */ +{ 0, 159, 8, 0xa87fc767b93cc611ULL }, /* Dragon Ball Z - Kyoushuu Saiyajin (UNOFFICIAL TRANSLATION) */ + +{ 0, 159, 8, 0x8daf8dd17cfc0b25ULL }, /* SD Gundam Gaiden - Knight Gundam Monogatari */ +{ 0, 159, 8, 0xb788abef0b537d9cULL }, /* SD Gundam Gaiden - Knight Gundam Monogatari (UNOFFICIAL PARTIAL TRANSLATION) */ + + +{0, 37, -1, 0xa4057e574307d204ULL }, /* Super Mario Bros + Tetris + Nintendo World Cup (Europe) */ +{0, 101, -1, 0x58d32b2e1ba753e1ULL }, /* Urusei Yatsura */ +{0x1b71ccdb, 4, 8}, /* Gauntlet 2 */ +{0xfebf5dc1, 0, 1}, /* Onyako Town(Bootleg) */ + +{0x6b523bd7,71, 1}, /* Micro Machines */ +{0x892434dd,71, 1}, /* Ultimate Stuntman */ +{0x1bc686a8,150, 8}, /* FireHawk */ + +{0x9cbadc25,5,8}, /* JustBreed */ + +{0x6e68e31a,16,8}, /* Dragon Ball 3*/ +{0x3f15d20d,153,8}, /* Famicom Jump 2 */ +{0x983d8175,157,8}, /* Datach Battle Rush */ +{0x894efdbc,157,8}, /* Datach Crayon Shin Chan */ +{0x19e81461,157,8}, /* Datach DBZ */ +{0xbe06853f,157,8}, /* Datach J-League */ +{0x0be0a328,157,8}, /* Datach SD Gundam Wars */ +{0x5b457641,157,8}, /* Datach Ultraman Club */ +{0xf51a7f46,157,8}, /* Datach Yuu Yuu Hakusho */ + +{0xe62e3382,71,-1}, /* Mig-29 Soviet Fighter */ +{0x21a653c7,4,-1}, /* Super Sky Kid */ + +{0xdd4d9a62,209,-1}, /* Shin Samurai Spirits 2 */ +{0x063b1151,209,-1}, /* Power Rangers 4 */ +{0xdd8ced31,209,-1}, /* Power Rangers 3 */ + +{0x60bfeb0c,90,-1}, /* MK 2*/ +{0x0c47946d,210,-1}, /* Chibi Maruko Chan */ +{0xbd523011,210,-1}, /* Dream Master */ +{0xc247cc80,210,-1}, /* Family Circuit '91 */ +{0x6ec51de5,210,-1}, /* Famista '92 */ +{0xadffd64f,210,-1}, /* Famista '93 */ +{0x429103c9,210,-1}, /* Famista '94 */ +{0x81b7f1a8,210,-1}, /* Heisei Tensai Bakabon */ +{0x2447e03b,210,-1}, /* Top Striker */ +{0x1dc0f740,210,-1}, /* Wagyan Land 2 */ +{0xd323b806,210,-1}, /* Wagyan Land 3 */ +{0x07eb2c12,208,-1}, /* Street Fighter IV */ +{0x96ce586e,189,8}, /* Street Fighter 2 YOKO */ +{0x7678f1d5,207,8}, /* Fudou Myouou Den */ +{0x276237b3,206,0}, /* Karnov */ +{0x4e1c1e3c,206,0}, /* Karnov */ + + /* Some entries to sort out the minor 33/48 mess. */ +{0xaebd6549,48,8}, /* Bakushou!! Jinsei Gekijou 3 */ +{0x6cdc0cd9,48,8}, /* Bubble Bobble 2 */ +//{0x10e24006,48,8}, /* Flintstones 2 - bad dump? */ +{0x40c0ad47,48,8}, /* Flintstones 2 */ +{0xa7b0536c,48,8}, /* Don Doko Don 2 */ +{0x99c395f9,48,8}, /* Captain Saver */ +{0x1500e835,48,8}, /* Jetsons (J) */ + + {0x637134e8,193,1}, /* Fighting Hero */ + {0xcbf4366f,158,8}, /* Alien Syndrome (U.S. unlicensed) */ + {0xb19a55dd,64,8}, /* Road Runner */ + //{0x3eafd012,116,-1}, /* AV Girl Fighting */ + {0x1d0f4d6b,2,1}, /* Black Bass thinging */ + {0xf92be3ec,64,-1}, /* Rolling Thunder */ + {0x345ee51a,245,-1}, /* DQ4c */ + {0xf518dd58,7,8}, /* Captain Skyhawk */ + {0x7ccb12a3,43,-1}, /* SMB2j */ + {0x6f12afc5,235,-1}, /* Golden Game 150-in-1 */ + {0xccc03440,156,-1}, /* Buzz & Waldog */ + {0xc9ee15a7,3,-1}, /* 3 is probably best. 41 WILL NOT WORK. */ + + {0x3e1271d5,79,1}, /* Tiles of Fate */ + {0x8eab381c,113,1}, /* Death Bots */ + + {0xd4a76b07,79,0}, /* F-15 City Wars*/ + {0xa4fbb438,79,0}, + + {0x1eb4a920,79,1}, /* Double Strike */ + {0x345d3a1a,11,1}, /* Castle of Deceit */ + {0x62ef6c79,232,8}, /* Quattro Sports -Aladdin */ + {0x5caa3e61,144,1}, /* Death Race */ + {0xd2699893,88,0}, /* Dragon Spirit */ + +{0x2f27cdef,155,8}, /* Tatakae!! Rahmen Man */ +{0xcfd4a281,155,8}, /* Money Game. Yay for money! */ +{0xd1691028,154,8}, /* Devil Man */ + + {0xc68363f6,180,0}, /* Crazy Climber */ + {0xbe939fce,9,1}, /* Punchout*/ + {0x5e66eaea,13,1}, /* Videomation */ + {0xaf5d7aa2,-1,0}, /* Clu Clu Land */ + +{0xc2730c30,34,0}, /* Deadly Towers */ +{0x932ff06e,34,1}, /* Classic Concentration */ +{0x4c7c1af3,34,1}, /* Caesar's Palace */ + +{0x15141401,4,8}, /* Asmik Kun Land */ +{0x59280bec,4,8}, /* Jackie Chan */ +{0x4cccd878,4,8}, /* Cat Ninden Teyandee */ +{0x9eefb4b4,4,8}, /* Pachi Slot Adventure 2 */ +{0x5337f73c,4,8}, /* Niji no Silk Road */ +{0x7474ac92,4,8}, /* Kabuki: Quantum Fighter */ + +{0xbb7c5f7a,89,8}, /* Mito Koumon or something similar */ + +/* Probably a Namco MMC3-workalike */ +{0xa5e6baf9,4,1|4}, /* Dragon Slayer 4 */ +{0xe40b4973,4,1|4}, /* Metro Cross */ +{0xd97c31b0,4,1|4}, /* Rasaaru Ishii no Childs Quest */ + +{0x84382231,9,0}, /* Punch Out (J) */ + +{0xe28f2596,0,1}, /* Pac Land (J) */ +{0xfcdaca80,0,0}, /* Elevator Action */ +{0xe492d45a,0,0}, /* Zippy Race */ +{0x32fa246f,0,0}, /* Tag Team Pro Wrestling */ +{0xc05a365b,0,0}, /* Exed Exes (J) */ +{0xb3c30bea,0,0}, /* Xevious (J) */ + +{0x804f898a,2,1}, /* Dragon Unit */ +{0xe1b260da,2,1}, /* Argos no Senshi */ +{0x6d65cac6,2,0}, /* Terra Cresta */ +{0x9ea1dc76,2,0}, /* Rainbow Islands */ +{0x28c11d24,2,1}, /* Sukeban Deka */ +{0x02863604,2,1}, /* Sukeban Deka */ +{0x2bb6a0f8,2,1}, /* Sherlock Holmes */ +{0x55773880,2,1}, /* Gilligan's Island */ +{0x419461d0,2,1}, /* Super Cars */ +{0x6e0eb43e,2,1}, /* Puss n Boots */ +{0x266ce198,2,1}, /* City Adventure Touch */ + +{0x48349b0b,1,8}, /* Dragon Quest 2 */ +{0xd09b74dc,1,8}, /* Great Tank (J) */ +{0xe8baa782,1,8}, /* Gun Hed (J) */ +{0x970bd9c2,1,8}, /* Hanjuku Hero */ +{0xcd7a2fd7,1,8}, /* Hanjuku Hero */ +{0x63469396,1,8}, /* Hokuto no Ken 4 */ +{0x291bcd7d,1,8}, /* Pachio Kun 2 */ +{0xf74dfc91,1,-1}, /* Win, Lose, or Draw */ + + {0x3f56a392,1,8}, /* Captain Ed (J) */ + {0x078ced30,1,8}, /* Choujin - Ultra Baseball */ + {0x391aa1b8,1,8}, /* Bloody Warriors (J) */ + {0x61a852ea,1,8}, /* Battle Stadium - Senbatsu Pro Yakyuu */ + {0xfe364be5,1,8}, /* Deep Dungeon 4 */ + {0xd8ee7669,1,8}, /* Adventures of Rad Gravity */ + {0xa5e8d2cd,1,8}, /* Breakthru */ + {0xf6fa4453,1,8}, /* Bigfoot */ + {0x37ba3261,1,8}, /* Back to the Future 2 and 3 */ + {0x934db14a,1,-1}, /* All-Pro Basketball */ + {0xe94d5181,1,8}, /* Mirai Senshi - Lios */ + {0x7156cb4d,1,8}, /* Muppet Adventure Carnival thingy */ + {0x5b6ca654,1,8}, /* Barbie rev X*/ + {0x57c12280,1,8}, /* Demon Sword */ + {0x70f67ab7,1,8}, /* Musashi no Bouken */ + {0xa9a4ea4c,1,8}, /* Satomi Hakkenden */ + {0xcc3544b0,1,8}, /* Triathron */ + + {0x1d41cc8c,3,1}, /* Gyruss */ + {0xd8eff0df,3,1}, /* Gradius (J) */ + {0xdbf90772,3,0}, /* Alpha Mission */ + {0xd858033d,3,0}, /* Armored Scrum Object */ + {0xcf322bb3,3,1}, /* John Elway's Quarterback */ + {0x9bde3267,3,1}, /* Adventures of Dino Riki */ + {0x02cc3973,3,1}, /* Ninja Kid */ + {0xb5d28ea2,3,1}, /* Mystery Quest - mapper 3?*/ + {0xbc065fc3,3,1}, /* Pipe Dream */ + + {0x5b837e8d,1,8}, /* Alien Syndrome */ + {0x283ad224,32,8}, /* Ai Sensei no Oshiete */ + {0x5555fca3,32,8}, /* "" "" */ + {0x243a8735,32,0x10|4}, /* Major League */ + +{0x6bc65d7e,66,1}, /* Youkai Club*/ +{0xc2df0a00,66,1}, /* Bio Senshi Dan(hacked) */ +{0xbde3ae9b,66,1}, /* Doraemon */ +{0xd26efd78,66,1}, /* SMB Duck Hunt */ +{0x811f06d9,66,1}, /* Dragon Power */ +{0x3293afea,66,1}, /* Mississippi Satsujin Jiken */ +{0xe84274c5,66,1}, /* "" "" */ +{0x9552e8df,66,1}, /* Dragon Ball */ + + {0xba51ac6f,78,2}, + {0x3d1c3137,78,8}, /* Uchuusen - Cosmo Carrier */ + + {0xbda8f8e4,152,8}, /* Gegege no Kitarou 2 */ + {0x026c5fca,152,8}, /* Saint Seiya Ougon Densetsu */ + {0x0f141525,152,8}, /* Arkanoid 2 (Japanese) */ + {0xb1a94b82,152,8}, /* Pocket Zaurus */ + + {0xbba58be5,70,-1}, /* Family Trainer - Manhattan Police */ + {0x370ceb65,70,-1}, /* Family Trainer - Meiro Dai Sakusen */ + {0xdd8ed0f7,70,1}, /* Kamen Rider Club */ + + {0x90c773c1,118,-1}, /* Goal! 2 */ + {0xb9b4d9e0,118,-1}, /* NES Play Action Football */ + {0x78b657ac,118,-1}, /* Armadillo */ + {0x37b62d04,118,-1}, /* Ys 3 */ + {0x07d92c31,118,-1}, /* RPG Jinsei Game */ + {0x2705eaeb,234,-1}, /* Maxi 15 */ + {0x404b2e8b,4,2}, /* Rad Racer 2 */ + + {0xa912b064,51|0x800,8}, /* 11-in-1 Ball Games(has CHR ROM when it shouldn't) */ + {0,-1,-1} diff --git a/Mednafen/mednafen/nes/ines.cpp b/Mednafen/mednafen/nes/ines.cpp new file mode 100644 index 0000000000..1e1d66c024 --- /dev/null +++ b/Mednafen/mednafen/nes/ines.cpp @@ -0,0 +1,941 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" + +#include +#include +#include +#include + +#include "x6502.h" +#include "cart.h" +#include "ppu/ppu.h" + +#define INESPRIV +#include "ines.h" +#include "unif.h" +#include "vsuni.h" +#include "input.h" + +namespace MDFN_IEN_NES +{ + +static uint8 ExtraNTARAM[0x800]; +static uint32 CHRRAMSize; + +static uint8 trainerpoo[512], TrainerRAM[512]; +static uint8 *WRAM = NULL; // External RAM used for ROM images using mappers that nominally don't support external RAM +static uint8 *ROM = NULL; +static uint8 *VROM = NULL; +static CartInfo iNESCart; + +static int Mirroring; + +static uint32 ROM_size; +static uint32 VROM_size; + +static void NewiNES_Init(int num); + +static int MapperNo; + +static iNES_HEADER head; + +static DECLFR(TrainerRead) +{ + return(TrainerRAM[A&0x1FF]); +} + +static DECLFW(TrainerWrite) +{ + TrainerRAM[A & 0x1FF] = V; +} + +static void iNES_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(ExtraNTARAM, head.ROM_type & 8 ? 2048 : 0), + SFARRAY(VROM, VROM_size ? 0 : CHRRAMSize), + SFARRAY(TrainerRAM, (head.ROM_type & 4) ? 0x200 : 0), + SFARRAY(WRAM, WRAM ? 8192 : 0), + SFEND + }; + + if(NESIsVSUni) + MDFNNES_VSUNIStateAction(sm,load, data_only); + + if(head.ROM_type & 8 || !VROM_size) + MDFNSS_StateAction(sm, load, data_only, StateRegs, "iNES"); + + if(iNESCart.StateAction) // Call after loading/saving VS Uni and iNES sections. + iNESCart.StateAction(sm, load, data_only); +} +static void iNESFree(void) +{ + if(ROM) + { + MDFN_free(ROM); + ROM = NULL; + } + + if(VROM) + { + MDFN_free(VROM); + VROM = NULL; + } + + if(WRAM) + { + MDFN_free(WRAM); + WRAM = NULL; + } +} + +static void iNES_Reset(void) +{ + if(head.ROM_type & 4) + memcpy(TrainerRAM, trainerpoo, 512); + + if(iNESCart.Reset) + iNESCart.Reset(&iNESCart); +} + +static void iNES_Power(void) +{ + if(!VROM_size) + memset(VROM, 0xFF, CHRRAMSize); + + if(head.ROM_type & 8) + memset(ExtraNTARAM, 0xFF, 2048); + + if(head.ROM_type & 4) + memcpy(TrainerRAM, trainerpoo, 512); + + if(WRAM) + setprg8r(0x10, 0x6000, 0); + + if(iNESCart.Power) + iNESCart.Power(&iNESCart); +} + +static void iNES_SaveNV(void) +{ + MDFN_SaveGameSave(&iNESCart); +} + +static void iNES_Kill(void) +{ + if(iNESCart.Close) iNESCart.Close(); + + iNESFree(); +} + +#ifdef WANT_DEBUGGER +static void iNES_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "prgrom")) + { + while(Length--) + { + Address &= (ROM_size << 14) - 1; + *Buffer = ROM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "chrrom") && VROM_size) + { + while(Length--) + { + Address &= (VROM_size << 13) - 1; + *Buffer = VROM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "chrram") && !VROM_size && CHRRAMSize) + { + while(Length--) + { + Address &= CHRRAMSize - 1; + *Buffer = VROM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "wram") && WRAM) + { + while(Length--) + { + Address &= 0x1FFF; + *Buffer = WRAM[Address]; + Address++; + Buffer++; + } + } +} + +static void iNES_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "prgrom")) + { + while(Length--) + { + Address &= (ROM_size << 14) - 1; + ROM[Address] = *Buffer; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "chrrom") && VROM_size) + { + while(Length--) + { + Address &= (VROM_size << 13) - 1; + VROM[Address] = *Buffer; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "chrram") && !VROM_size && CHRRAMSize) + { + while(Length--) + { + Address &= CHRRAMSize - 1; + VROM[Address] = *Buffer; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "wram") && WRAM) + { + while(Length--) + { + Address &= 0x1FFF; + WRAM[Address] = *Buffer; + Address++; + Buffer++; + } + } +} +#endif + + +uint32 iNESGameCRC32; + +struct CRCMATCH { + uint32 crc; + const char *name; +}; + +struct INPSEL { + const uint32 crc32; + const char* input1; + const char *input2; + const char *inputfc; +}; + +/* This is mostly for my personal use. So HA. */ +static void SetInput(void) +{ + static struct INPSEL moo[]= + { + {0x62c67984, "gamepad", "gamepad", "4player" }, // Nekketsu Koukou Dodgeball-bu + + {0x3a1694f9,"gamepad","gamepad","4player"}, /* Nekketsu Kakutou Densetsu */ + + {0xc3c0811d,"gamepad","gamepad","oekakids"}, /* The two "Oeka Kids" games */ + {0x9d048ea4,"gamepad","gamepad","oekakids"}, /* */ + + {0xaf4010ea,"gamepad","powerpadb", NULL}, /* World Class Track Meet */ + {0xd74b2719,"gamepad","powerpadb", NULL}, /* Super Team Games */ + {0x61d86167,"gamepad","powerpadb", NULL}, /* Street Cop */ + {0x6435c095,"gamepad","powerpadb", NULL}, /* Short Order/Eggsplode */ + + + {0x48ca0ee1,"gamepad","gamepad", "bworld"}, /* Barcode World */ + {0x9f8f200a,"gamepad","gamepad","ftrainera"}, /* Super Mogura Tataki!! - Pokkun Moguraa */ + {0x9044550e,"gamepad","gamepad","ftrainera"}, /* Rairai Kyonshizu */ + {0x2f128512,"gamepad","gamepad","ftrainera"}, /* Jogging Race */ + {0x60ad090a,"gamepad","gamepad","ftrainera"}, /* Athletic World */ + + {0x8a12a7d9,"gamepad","gamepad","ftrainerb"}, /* Totsugeki Fuuun Takeshi Jou */ + {0xea90f3e2,"gamepad","gamepad","ftrainerb"}, /* Running Stadium */ + {0x370ceb65,"gamepad","gamepad","ftrainerb"}, /* Meiro Dai Sakusen */ + // Bad dump? {0x69ffb014,"gamepad","gamepad","ftrainerb"}, /* Fuun Takeshi Jou 2 */ + {0x6cca1c1f,"gamepad","gamepad","ftrainerb"}, /* Dai Undoukai */ + {0x29de87af,"gamepad","gamepad","ftrainerb"}, /* Aerobics Studio */ + {0xbba58be5,"gamepad","gamepad","ftrainerb"}, /* Family Trainer: Manhattan Police */ + {0xea90f3e2,"gamepad","gamepad","ftrainerb"}, /* Family Trainer: Running Stadium */ + + {0xd9f45be9,"gamepad","gamepad","partytap"}, /* Gimme a Break ... */ + {0x1545bd13,"gamepad","gamepad","partytap"}, /* Gimme a Break ... 2 */ + + {0x7b44fb2a,"gamepad","gamepad","mahjong"}, /* Ide Yousuke Meijin no Jissen Mahjong 2 */ + {0x9fae4d46,"gamepad","gamepad","mahjong"}, /* Ide Yousuke Meijin no Jissen Mahjong */ + + {0x980be936,"gamepad","gamepad","hypershot"}, /* Hyper Olympic */ + {0x21f85681,"gamepad","gamepad","hypershot"}, /* Hyper Olympic (Gentei Ban) */ + {0x915a53a7,"gamepad","gamepad","hypershot"}, /* Hyper Sports */ + {0xad9c63e2,"gamepad",NULL,"shadow"}, /* Space Shadow */ + + {0x4d68cfb1, NULL, "zapper", "none"}, /* Crime Busters */ + {0xbbe40dc4,NULL,"zapper", "none"}, /* Baby Boomer */ + {0x24598791,NULL,"zapper", "none"}, /* Duck Hunt */ + {0xff24d794,NULL,"zapper", "none"}, /* Hogan's Alley */ + {0xbeb8ab01,NULL,"zapper", "none"}, /* Gumshoe */ + {0xde8fd935,NULL,"zapper", "none"}, /* To the Earth */ + {0xedc3662b,NULL,"zapper", "none"}, /* Operation Wolf */ + {0x2a6559a1,NULL,"zapper", "none"}, /* Operation Wolf (J) */ + + {0x23d17f5e,"gamepad","zapper", "none"}, /* The Lone Ranger */ + {0xb8b9aca3,NULL,"zapper", "none"}, /* Wild Gunman */ + {0x5112dc21,NULL,"zapper", "none"}, /* Wild Gunman */ + {0x4318a2f8,NULL,"zapper", "none"}, /* Barker Bill's Trick Shooting */ + {0x5ee6008e,NULL,"zapper", "none"}, /* Mechanized Attack */ + {0x3e58a87e,NULL,"zapper", "none"}, /* Freedom Force */ + {0x851eb9be,"gamepad","zapper", "none"}, /* Shooting Range */ + {0x74bea652,"gamepad","zapper", "none"}, /* Supergun 3-in-1 */ + {0x32fb0583,NULL,"arkanoid","none"}, /* Arkanoid(NES) */ + {0xd89e5a67,NULL,NULL,"arkanoid"}, /* Arkanoid (J) */ + {0x0f141525,NULL,NULL,"arkanoid"}, /* Arkanoid 2(J) */ + + {0x912989dc,NULL,NULL,"fkb"}, /* Playbox BASIC */ + {0xf7606810,NULL,NULL,"fkb"}, /* Family BASIC 2.0A */ + {0x895037bc,NULL,NULL,"fkb"}, /* Family BASIC 2.1a */ + {0xb2530afc,NULL,NULL,"fkb"}, /* Family BASIC 3.0 */ + {0, NULL, NULL, NULL }, + }; + int x=0; + + while(moo[x].input1 > 0 || moo[x].input2 > 0 || moo[x].inputfc > 0) + { + if(moo[x].crc32==iNESGameCRC32) + { + MDFNGameInfo->DesiredInput.clear(); + MDFNGameInfo->DesiredInput.push_back(moo[x].input1); + MDFNGameInfo->DesiredInput.push_back(moo[x].input2); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + MDFNGameInfo->DesiredInput.push_back(moo[x].inputfc); + break; + } + x++; + } +} + +#define INESB_INCOMPLETE 1 +#define INESB_CORRUPT 2 +#define INESB_HACKED 4 + +struct BADINF { + uint64 md5partial; + const char *name; + uint32 type; +}; + + +static struct BADINF BadROMImages[]= +{ + #include "ines-bad.inc" +}; + +void CheckBad(uint64 md5partial) +{ + int x; + + x=0; + //printf("0x%llx\n",md5partial); + while(BadROMImages[x].name) + { + if(BadROMImages[x].md5partial == md5partial) + { + MDFN_PrintError(_("The copy of the game you have loaded, \"%s\", is bad, and will not work properly on Mednafen."), BadROMImages[x].name); + return; + } + x++; + } + +} +struct CHINF { + uint32 crc32; + int32 mapper; + int32 mirror; + uint64 pmd5; +}; + +static void CheckHInfo(void) +{ + /* ROM images that have the battery-backed bit set in the header that really + don't have battery-backed RAM is not that big of a problem, so I'll + treat this differently by only listing games that should have battery-backed RAM. + + Lower 64 bits of the MD5 hash. + */ + + static uint64 savie[]= + { + 0x58abd7c8990c4e25ULL, /* Taito Grand Prix - Eikou e no License */ + 0x82000965f04a71bbULL, /* Mirai Shinwa Jarvas */ + 0x38ed9483242b252dULL, /* Honoo no Toukyuuji - Dodge Danpei 2 */ + 0x01c6be88b105e2dbULL, /* Barcode World */ + + 0x498c10dc463cfe95ULL, /* Battle Fleet */ + 0x6917ffcaca2d8466ULL, /* Famista '90 */ + + 0xd63dcc68c2b20adcULL, /* Final Fantasy J */ + 0x012df596e2b31174ULL, /* Final Fantasy 1+2 */ + 0xf6b359a720549ecdULL, /* Final Fantasy 2 */ + 0x5a30da1d9b4af35dULL, /* Final Fantasy 3 */ + + 0x2ee3417ba8b69706ULL, /* Hydlide 3*/ + + 0xebbce5a54cf3ecc0ULL, /* Justbreed */ + + 0x6a858da551ba239eULL, /* Kaijuu Monogatari */ + 0xa40666740b7d22feULL, /* Mindseeker */ + + 0x77b811b2760104b9ULL, /* Mouryou Senki Madara */ + + 0x11b69122efe86e8cULL, /* RPG Jinsei Game */ + + 0xa70b495314f4d075ULL, /* Ys 3 */ + + + 0xc04361e499748382ULL, /* AD&D Heroes of the Lance */ + 0xb72ee2337ced5792ULL, /* AD&D Hillsfar */ + 0x2b7103b7a27bd72fULL, /* AD&D Pool of Radiance */ + + 0x854d7947a3177f57ULL, /* Crystalis */ + + 0xb0bcc02c843c1b79ULL, /* DW */ + 0x4a1f5336b86851b6ULL, /* DW */ + + 0x2dcf3a98c7937c22ULL, /* DW 2 */ + 0x733026b6b72f2470ULL, /* Dw 3 */ + 0x98e55e09dfcc7533ULL, /* DW 4*/ + 0x8da46db592a1fcf4ULL, /* Faria */ + 0x91a6846d3202e3d6ULL, /* Final Fantasy */ + 0xedba17a2c4608d20ULL, /* "" */ + + 0x94b9484862a26cbaULL, /* Legend of Zelda */ + 0x04a31647de80fdabULL, /* "" */ + + 0x9aa1dc16c05e7de5ULL, /* Startropics */ + 0x1b084107d0878bd0ULL, /* Startropics 2*/ + + 0x836c0ff4f3e06e45ULL, /* Zelda 2 */ + + 0 /* Abandon all hope if the game has 0 in the lower 64-bits of its MD5 hash */ + }; + + static struct CHINF moo[]= + { + #include "ines-correct.inc" + }; + int tofix=0; + int x; + uint64 partialmd5=0; + + for(x=0;x<8;x++) + { + partialmd5 |= (uint64)iNESCart.MD5[15-x] << (x*8); + //printf("%16llx\n", partialmd5); + } + CheckBad(partialmd5); + x=0; + + do + { + if((moo[x].crc32 && moo[x].crc32 == iNESGameCRC32) || (moo[x].pmd5 && moo[x].pmd5 == partialmd5)) + { + if(moo[x].mapper >= 0) + { + if((moo[x].mapper & 0x800) && VROM_size) + { + VROM_size=0; + MDFN_free(VROM); + VROM = 0; + tofix|=8; + } + if(MapperNo != (moo[x].mapper & 0xFF)) + { + tofix|=1; + MapperNo=moo[x].mapper&0xFF; + } + } + if(moo[x].mirror>=0) + { + if(moo[x].mirror==8) + { + if(Mirroring==2) /* Anything but hard-wired(four screen). */ + { + tofix|=2; + Mirroring=0; + } + } + else if(Mirroring!=moo[x].mirror) + { + if(Mirroring!=(moo[x].mirror&~4)) + if((moo[x].mirror&~4)<=2) /* Don't complain if one-screen mirroring + needs to be set(the iNES header can't + hold this information). + */ + tofix|=2; + Mirroring=moo[x].mirror; + } + } + break; + } + x++; + } while(moo[x].mirror>=0 || moo[x].mapper>=0); + + x=0; + while(savie[x] != 0) + { + if(savie[x] == partialmd5) + { + if(!(head.ROM_type&2)) + { + tofix|=4; + head.ROM_type|=2; + } + } + x++; + } + + /* Games that use these iNES mappers tend to have the four-screen bit set + when it should not be. + */ + if((MapperNo==118 || MapperNo==24 || MapperNo==26) && (Mirroring==2)) + { + Mirroring=0; + tofix|=2; + } + + /* Four-screen mirroring implicitly set. */ + if(MapperNo==99) + Mirroring=2; + + if(tofix) + { + MDFN_printf(_("The iNES header contains incorrect information. For now, the information will be corrected in RAM:\n")); + MDFN_indent(1); + if(tofix&1) + MDFN_printf(_("The mapper number should be set to %d.\n"), MapperNo); + + if(tofix&2) + { + const char *mstr[3] = { + _("Horizontal"), _("Vertical"), _("Four-screen") + }; + MDFN_printf(_("Mirroring should be set to \"%s\".\n"), mstr[Mirroring & 3]); + } + if(tofix&4) + { + MDFN_printf(_("The battery-backed bit should be set.\n")); + } + if(tofix&8) + { + MDFN_printf(_("This game should not have any CHR ROM. ")); + } + MDFN_indent(-1); + } +} + + + +bool iNES_TestMagic(MDFNFILE *fp) +{ + uint8 header[16]; + + if(fp->read(header, 16, false) != 16 || memcmp(header, "NES\x1a", 4)) + return false; + + return true; +} + +void iNESLoad(Stream *fp, NESGameType *gt) +{ + try + { + const uint64 raw_size = fp->size(); + md5_context md5; + + fp->read(head.raw, 16); + + if(memcmp(head.ID, "NES\x1a", 4)) + throw MDFN_Error(0, _("Not a valid iNES format file.")); + + { + const uint64 needed_size = 16 + (head.ROM_size ? head.ROM_size : 256) * 0x4000 + head.VROM_size * 0x2000 + ((head.ROM_type & 4) ? 512 : 0); + + if(raw_size < needed_size) + throw MDFN_Error(0, _("iNES format file is too small by %llu bytes to contain all data specified by header!"), (unsigned long long)needed_size - raw_size); + + if(raw_size > needed_size) + MDFN_printf(_("Warning: iNES format file has %llu bytes of unused trailing data.\n"), (unsigned long long)(raw_size - needed_size)); + } + + memset(&iNESCart, 0, sizeof(iNESCart)); + + /* Do some fixes to common strings found in + old iNES-format headers. + */ + if(!memcmp(&head.raw[0x7], "DiskDude", 8)) + { + memset(&head.raw[0x7], 0, 0x9); + } + + if(!memcmp(&head.raw[0x7], "demiforce", 9)) + { + memset(&head.raw[0x7], 0, 0x9); + } + + if(!memcmp(&head.raw[0xA], "Ni03", 4)) + { + if(!memcmp(&head.raw[0x7], "Dis", 3)) + memset(&head.raw[0x7], 0, 0x9); + else + memset(&head.raw[0xA], 0, 0x6); + } + + ROM_size = round_up_pow2((head.ROM_size ? head.ROM_size : 256)); + VROM_size = head.VROM_size; + + if(VROM_size) + VROM_size = round_up_pow2(VROM_size); + + MapperNo = (head.ROM_type>>4); + MapperNo|=(head.ROM_type2&0xF0); + Mirroring = (head.ROM_type&1); + + if(head.ROM_type&8) Mirroring=2; + + ROM = (uint8 *)MDFN_malloc_T(ROM_size<<14, _("PRG ROM")); + + #ifdef WANT_DEBUGGER + ASpace_Add(iNES_GetAddressSpaceBytes, iNES_PutAddressSpaceBytes, "prgrom", "PRG ROM", (unsigned int)(log(ROM_size << 14) / log(2))); + #endif + + if(VROM_size) + { + VROM = (uint8 *)MDFN_malloc_T(VROM_size<<13, _("CHR ROM")); + #ifdef WANT_DEBUGGER + ASpace_Add(iNES_GetAddressSpaceBytes, iNES_PutAddressSpaceBytes, "chrrom", "CHR ROM", (unsigned int)(log(VROM_size << 13) / log(2))); + #endif + } + + memset(ROM, 0xFF, ROM_size << 14); + + if(VROM_size) + memset(VROM, 0xFF, VROM_size << 13); + + if(head.ROM_type&4) /* Trainer */ + { + fp->read(trainerpoo, 512); + } + + ResetCartMapping(); + + SetupCartPRGMapping(0, ROM, ROM_size * 0x4000, 0); + + fp->read(ROM, 0x4000 * (head.ROM_size ? head.ROM_size : 256)); + + if(VROM_size) + { + fp->read(VROM, 0x2000 * head.VROM_size); + } + + md5.starts(); + md5.update(ROM,ROM_size<<14); + + iNESGameCRC32 = crc32(0,ROM,ROM_size<<14); + + if(VROM_size) + { + iNESGameCRC32 = crc32(iNESGameCRC32,VROM,VROM_size<<13); + md5.update(VROM,VROM_size<<13); + } + md5.finish(iNESCart.MD5); + memcpy(MDFNGameInfo->MD5,iNESCart.MD5,sizeof(iNESCart.MD5)); + + iNESCart.CRC32 = iNESGameCRC32; + + MDFN_printf(_("PRG ROM: %3d x 16KiB\n"), (head.ROM_size ? head.ROM_size : 256)); + MDFN_printf(_("CHR ROM: %3d x 8KiB\n"), head.VROM_size); + MDFN_printf(_("ROM CRC32: 0x%08x\n"), iNESGameCRC32); + + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(iNESCart.MD5, 0).c_str()); + MDFN_printf(_("Mapper: %d\n"), MapperNo); + MDFN_printf(_("Mirroring: %s\n"), Mirroring==2?_("None(Four-screen)"):Mirroring?_("Vertical"):_("Horizontal")); + + if(head.ROM_type&2) MDFN_printf(_("Battery-backed.\n")); + if(head.ROM_type&4) MDFN_printf(_("Trained.\n")); + + SetInput(); + CheckHInfo(); + { + int x; + uint64 partialmd5=0; + + for(x=0;x<8;x++) + { + partialmd5 |= (uint64)iNESCart.MD5[7-x] << (x*8); + } + + MDFN_VSUniCheck(partialmd5, &MapperNo, &Mirroring); + } + /* Must remain here because above functions might change value of + VROM_size and free(VROM). + */ + if(VROM_size) + SetupCartCHRMapping(0,VROM,VROM_size*0x2000,0); + + if(Mirroring==2) + SetupCartMirroring(4,1,ExtraNTARAM); + else if(Mirroring>=0x10) + SetupCartMirroring(2+(Mirroring&1),1,0); + else + SetupCartMirroring(Mirroring&1,(Mirroring&4)>>2,0); + + iNESCart.battery = (head.ROM_type&2)?1:0; + iNESCart.mirror = Mirroring; + + NewiNES_Init(MapperNo); + + MDFN_LoadGameSave(&iNESCart); + + gt->Power = iNES_Power; + gt->Reset = iNES_Reset; + gt->SaveNV = iNES_SaveNV; + gt->Kill = iNES_Kill; + gt->StateAction = iNES_StateAction; + + if(iNESCart.CartExpSound.HiFill) + GameExpSound.push_back(iNESCart.CartExpSound); + + if(head.ROM_type & 4) + { + SetReadHandler(0x7000, 0x71FF, TrainerRead); + SetWriteHandler(0x7000, 0x71FF, TrainerWrite); + } + } + catch(...) + { + iNESFree(); + throw; + } +} + + +#define BMAPF_32KCHRR 1 // 32KB CHR RAM +#define BMAPF_INESWRAMOK 2 // Ok to emulate WRAM here(ines.cpp) if the battery-backed bit is set. + +typedef struct { + int number; + int (*init)(CartInfo *); + uint32 flags; +} BMAPPING; + +static const BMAPPING bmap[] = { + { 0, NROM256_Init, BMAPF_INESWRAMOK }, + { 1, Mapper1_Init, 0 }, + { 2, UNROM_Init, BMAPF_INESWRAMOK }, + { 3, CNROM_Init, BMAPF_INESWRAMOK }, + { 4, Mapper4_Init, 0}, + { 5, Mapper5_Init, 0}, + { 6, Mapper6_Init, BMAPF_32KCHRR}, + { 7, AOROM_Init, 0}, + { 8, Mapper8_Init, 0}, + { 9, PNROM_Init, 0}, + { 10, MMC4_Init, 0}, + { 11, Mapper11_Init, 0}, + { 12, Mapper12_Init, 0}, + { 13, CPROM_Init, BMAPF_32KCHRR}, + { 15, Mapper15_Init, 0 }, + { 16, Mapper16_Init, 0}, + { 17, Mapper17_Init, 0}, + { 18, Mapper18_Init, 0}, + { 19, Mapper19_Init, 0}, + { 21, Mapper21_Init, 0}, + { 22, Mapper22_Init, 0}, + { 23, Mapper23_Init, 0}, + { 24, Mapper24_Init, 0}, + { 25, Mapper25_Init, 0}, + { 26, Mapper26_Init, 0}, + { 32, Mapper32_Init, 0}, + { 33, Mapper33_Init, 0}, + { 34, Mapper34_Init, 0}, + { 37, Mapper37_Init, 0}, + { 38, Mapper38_Init, 0}, + { 41, Mapper41_Init, 0}, + { 42, BioMiracleA_Init, 0}, + { 44, Mapper44_Init, 0}, + { 45, Mapper45_Init, 0}, + { 46, Mapper46_Init, 0}, + { 47, Mapper47_Init, 0}, + { 48, Mapper48_Init, 0}, + { 49, Mapper49_Init, 0}, + { 51, Mapper51_Init, 0}, + { 52, Mapper52_Init, 0}, + { 64, Mapper64_Init, 0}, + { 65, Mapper65_Init, 0}, + { 66, GNROM_Init, 0}, + { 67, Mapper67_Init, 0}, + { 68, Mapper68_Init, 0}, + { 69, BTR_Init, 0}, + { 70, Mapper70_Init, 0}, + { 71, Mapper71_Init, 0}, + { 72, Mapper72_Init, 0}, + { 73, Mapper73_Init, 0}, + { 74, Mapper74_Init, 0}, + { 75, Mapper75_Init, 0}, + { 76, Mapper76_Init, 0}, + { 77, Mapper77_Init, 0}, + { 78, Mapper78_Init, 0}, + { 79, NINA06_Init, 0}, + { 80, Mapper80_Init, 0}, + { 82, Mapper82_Init, 0}, + { 85, Mapper85_Init, 0}, + { 86, Mapper86_Init, 0}, + { 87, Mapper87_Init, 0}, + { 88, Mapper88_Init, 0}, + { 89, Mapper89_Init, 0}, + { 90, Mapper90_Init, 0}, + { 92, Mapper92_Init, 0}, + { 93, Mapper93_Init, 0}, + { 94, Mapper94_Init, 0}, + { 95, Mapper95_Init, 0}, + { 96, Mapper96_Init, 0}, + { 97, Mapper97_Init, 0}, + { 99, Mapper99_Init, 0}, + { 101, Mapper101_Init, 0}, + { 105, Mapper105_Init, 0}, + { 107, Mapper107_Init, 0}, + { 112, Mapper112_Init, 0}, + { 113, Mapper113_Init, 0}, + { 114, Mapper114_Init, 0}, + { 115, Mapper115_Init, 0}, + { 116, Mapper116_Init, 0}, + { 117, Mapper117_Init, 0}, + { 118, Mapper118_Init, 0}, + { 119, Mapper119_Init, 0}, /* Has CHR ROM and CHR RAM by default. Hmm. */ + { 133, SA72008_Init, 0}, + { 134, S74LS374N_Init, 0}, + { 135, S8259A_Init, 0}, + { 140, Mapper140_Init, 0}, + { 144, AGCI50282_Init, 0}, + { 150, BIC62_Init, 0}, + { 151, Mapper151_Init, 0}, + { 152, Mapper152_Init, 0}, + { 153, Mapper153_Init, 0}, + { 154, Mapper154_Init, 0}, + { 155, Mapper155_Init, 0}, + { 156, Mapper156_Init, 0}, + { 157, Mapper157_Init, 0}, + { 158, Mapper158_Init, 0}, + { 159, Mapper159_Init, 0 }, + { 160, Mapper90_Init, 0}, + { 163, Mapper163_Init, 0 }, + { 180, Mapper180_Init, 0}, + { 182, Mapper182_Init, 0}, + { 184, Mapper184_Init, 0}, + { 185, Mapper185_Init, 0}, + { 187, Mapper187_Init, 0}, + { 189, Mapper189_Init, 0}, + { 193, Mapper193_Init, 0}, + { 206, Mapper206_Init, 0}, + { 207, Mapper207_Init, 0}, + { 208, Mapper208_Init, 0}, + { 209, Mapper209_Init, 0}, + { 210, Mapper210_Init, 0}, + { 215, Mapper215_Init, 0}, + { 217, Mapper217_Init, 0}, + { 222, Mapper222_Init, 0}, + { 228, Mapper228_Init, 0}, + { 232, BIC48_Init, 0}, + { 234, Mapper234_Init, 0}, + { 240, Mapper240_Init, 0}, + { 241, Mapper241_Init, 0}, + { 242, Mapper242_Init, 0}, + { 243, S74LS374N_Init, 0}, + { 244, Mapper244_Init, 0}, + { 245, Mapper245_Init, 0}, + { 246, Mapper246_Init, 0}, + { 248, Mapper248_Init, 0}, + { 249, Mapper249_Init, 0}, + { 250, Mapper250_Init, 0}, + { 0, NULL, 0} +}; + +static void NewiNES_Init(int num) +{ + const BMAPPING *tmp=bmap; + + while(tmp->init) + { + if(num == tmp->number) + { + if(!VROM_size) + { + if(tmp->flags & BMAPF_32KCHRR) + CHRRAMSize = 32768; + else + CHRRAMSize = 8192; + + VROM = (uint8 *)MDFN_malloc_T(CHRRAMSize, _("CHR RAM")); + + SetupCartCHRMapping(0x0,VROM,CHRRAMSize,1); + + #ifdef WANT_DEBUGGER + ASpace_Add(iNES_GetAddressSpaceBytes, iNES_PutAddressSpaceBytes, "chrram", "CHR RAM", (unsigned int)(log(CHRRAMSize) / log(2))); + #endif + } + + if(iNESCart.battery && (tmp->flags & BMAPF_INESWRAMOK)) + { + WRAM = (uint8 *)MDFN_malloc_T(8192, _("WRAM")); + + memset(WRAM, 0x00, 8192); + + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetReadHandler(0x6000, 0x7FFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + iNESCart.SaveGame[0] = WRAM; + iNESCart.SaveGameLen[0] = 8192; + + #ifdef WANT_DEBUGGER + ASpace_Add(iNES_GetAddressSpaceBytes, iNES_PutAddressSpaceBytes, "wram", "WRAM", 13); + #endif + } + + tmp->init(&iNESCart); + return; + } + tmp++; + } + + throw MDFN_Error(0, _("iNES mapper %d is not supported!"), num); +} + +} diff --git a/Mednafen/mednafen/nes/ines.h b/Mednafen/mednafen/nes/ines.h new file mode 100644 index 0000000000..e424926d5c --- /dev/null +++ b/Mednafen/mednafen/nes/ines.h @@ -0,0 +1,149 @@ +#ifndef __MDFN_NES_INES_H +#define __MDFN_NES_INES_H + +namespace MDFN_IEN_NES +{ +#ifdef INESPRIV +extern uint32 iNESGameCRC32; +#else +#endif + +struct iNES_HEADER +{ + union + { + struct + { + char ID[4]; /*NES^Z*/ + uint8 ROM_size; + uint8 VROM_size; + uint8 ROM_type; + uint8 ROM_type2; + uint8 reserve[8]; + }; + uint8 raw[16]; + }; +}; + +} + +int Mapper1_Init(CartInfo *); +int Mapper4_Init(CartInfo *); +int Mapper5_Init(CartInfo *); +int Mapper6_Init(CartInfo *); +int Mapper8_Init(CartInfo *); +int Mapper11_Init(CartInfo *); +int Mapper12_Init(CartInfo *); +int Mapper15_Init(CartInfo *); +int Mapper16_Init(CartInfo *); +int Mapper17_Init(CartInfo *); +int Mapper18_Init(CartInfo *); +int Mapper19_Init(CartInfo *); +int Mapper21_Init(CartInfo *); +int Mapper22_Init(CartInfo *); +int Mapper23_Init(CartInfo *); +int Mapper24_Init(CartInfo *); +int Mapper25_Init(CartInfo *); +int Mapper26_Init(CartInfo *); +int Mapper32_Init(CartInfo *); +int Mapper33_Init(CartInfo *); +int Mapper34_Init(CartInfo *); +int Mapper37_Init(CartInfo *); +int Mapper38_Init(CartInfo *); +int Mapper41_Init(CartInfo *); +int Mapper44_Init(CartInfo *); +int Mapper45_Init(CartInfo *); +int Mapper46_Init(CartInfo *); +int Mapper47_Init(CartInfo *); +int Mapper48_Init(CartInfo *); +int Mapper49_Init(CartInfo *); +int Mapper51_Init(CartInfo *); +int Mapper52_Init(CartInfo *); +int Mapper64_Init(CartInfo *); +int Mapper65_Init(CartInfo *); +int Mapper67_Init(CartInfo *); +int Mapper68_Init(CartInfo *); +int Mapper70_Init(CartInfo *); +int Mapper71_Init(CartInfo *); +int Mapper72_Init(CartInfo *); +int Mapper73_Init(CartInfo *); +int Mapper74_Init(CartInfo *); +int Mapper75_Init(CartInfo *); +int Mapper76_Init(CartInfo *); +int Mapper77_Init(CartInfo *); +int Mapper78_Init(CartInfo *); +int Mapper80_Init(CartInfo *); +int Mapper82_Init(CartInfo *); +int Mapper85_Init(CartInfo *); +int Mapper86_Init(CartInfo *); +int Mapper87_Init(CartInfo *); +int Mapper88_Init(CartInfo *); +int Mapper89_Init(CartInfo *); +int Mapper92_Init(CartInfo *); + +int Mapper90_Init(CartInfo *); +int Mapper97_Init(CartInfo *); +int Mapper99_Init(CartInfo *); +int Mapper101_Init(CartInfo *); + +int Mapper165_Init(CartInfo *); +int Mapper209_Init(CartInfo *); +int Mapper91_Init(CartInfo *); +int Mapper92_Init(CartInfo *); +int Mapper93_Init(CartInfo *); +int Mapper94_Init(CartInfo *); +int Mapper95_Init(CartInfo *); +int Mapper96_Init(CartInfo *); +int Mapper105_Init(CartInfo *); +int Mapper107_Init(CartInfo *); +int Mapper112_Init(CartInfo *); +int Mapper113_Init(CartInfo *); +int Mapper114_Init(CartInfo *); +int Mapper115_Init(CartInfo *); +int Mapper116_Init(CartInfo *); +int Mapper117_Init(CartInfo *); +int Mapper118_Init(CartInfo *); +int Mapper119_Init(CartInfo *); +int Mapper140_Init(CartInfo *); +int Mapper150_Init(CartInfo *); +int Mapper151_Init(CartInfo *); +int Mapper152_Init(CartInfo *); +int Mapper153_Init(CartInfo *); +int Mapper154_Init(CartInfo *); +int Mapper155_Init(CartInfo *); +int Mapper156_Init(CartInfo *); +int Mapper157_Init(CartInfo *); +int Mapper158_Init(CartInfo *); +int Mapper159_Init(CartInfo *); +int Mapper163_Init(CartInfo *); +int Mapper164_Init(CartInfo *); +int Mapper180_Init(CartInfo *); +int Mapper182_Init(CartInfo *); +int Mapper184_Init(CartInfo *); +int Mapper185_Init(CartInfo *); +int Mapper187_Init(CartInfo *); +int Mapper188_Init(CartInfo *); +int Mapper189_Init(CartInfo *); +int Mapper193_Init(CartInfo *); +int Mapper206_Init(CartInfo *); +int Mapper207_Init(CartInfo *); +int Mapper208_Init(CartInfo *); +int Mapper209_Init(CartInfo *); +int Mapper210_Init(CartInfo *); +int Mapper215_Init(CartInfo *); +int Mapper217_Init(CartInfo *); +int Mapper222_Init(CartInfo *); +int Mapper228_Init(CartInfo *); +int Mapper232_Init(CartInfo *); +int Mapper234_Init(CartInfo *); +int Mapper240_Init(CartInfo *); +int Mapper241_Init(CartInfo *); +int Mapper242_Init(CartInfo *); +int Mapper244_Init(CartInfo *); +int Mapper245_Init(CartInfo *); +int Mapper246_Init(CartInfo *); +int Mapper248_Init(CartInfo *); +int Mapper249_Init(CartInfo *); +int Mapper250_Init(CartInfo *); + +#endif diff --git a/Mednafen/mednafen/nes/input.cpp b/Mednafen/mednafen/nes/input.cpp new file mode 100644 index 0000000000..0949ea9d32 --- /dev/null +++ b/Mednafen/mednafen/nes/input.cpp @@ -0,0 +1,857 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "x6502.h" +#include "sound.h" +#include "input.h" +#include "vsuni.h" +#include "fds.h" +#include "input/cursor.h" + +extern INPUTC *MDFN_InitZapper(int w); +extern INPUTC *MDFN_InitPowerpadA(int w); +extern INPUTC *MDFN_InitPowerpadB(int w); +extern INPUTC *MDFN_InitArkanoid(int w); + +extern INPUTCFC *MDFN_InitArkanoidFC(void); +extern INPUTCFC *MDFN_InitSpaceShadow(void); +extern INPUTCFC *MDFN_InitFKB(void); +extern INPUTCFC *MDFN_InitHS(void); +extern INPUTCFC *MDFN_InitMahjong(void); +extern INPUTCFC *MDFN_InitPartyTap(void); +extern INPUTCFC *MDFN_InitFamilyTrainerA(void); +extern INPUTCFC *MDFN_InitFamilyTrainerB(void); +extern INPUTCFC *MDFN_InitOekaKids(void); +extern INPUTCFC *MDFN_InitTopRider(void); +extern INPUTCFC *MDFN_InitBarcodeWorld(void); + +namespace MDFN_IEN_NES +{ + +static const IDIISG GamepadIDII = +{ + { "a", "A", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "b", "B", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, +}; + +static const IDIISG ZapperIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS }, + { "trigger", "Trigger", 0, IDIT_BUTTON, NULL }, + { "away_trigger", "Away Trigger", 1, IDIT_BUTTON, NULL }, +}; + +static const IDIISG PowerpadIDII = +{ + { "1", "1", 0, IDIT_BUTTON, NULL }, + { "2", "2", 1, IDIT_BUTTON, NULL }, + { "3", "3", 2, IDIT_BUTTON, NULL }, + { "4", "4", 3, IDIT_BUTTON, NULL }, + { "5", "5", 4, IDIT_BUTTON, NULL }, + { "6", "6", 5, IDIT_BUTTON, NULL }, + { "7", "7", 6, IDIT_BUTTON, NULL }, + { "8", "8", 7, IDIT_BUTTON, NULL }, + { "9", "9", 8, IDIT_BUTTON, NULL }, + { "10", "10", 9, IDIT_BUTTON, NULL }, + { "11", "11", 10, IDIT_BUTTON, NULL }, + { "12", "12", 11, IDIT_BUTTON, NULL }, +}; + +static const IDIISG ArkanoidIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS }, + { "button", "Button", 0, IDIT_BUTTON, NULL }, +}; + +static const IDIISG FKBIDII = +{ + { "f1", "F1", 0, IDIT_BUTTON }, + { "f2", "F2", 1, IDIT_BUTTON }, + { "f3", "F3", 2, IDIT_BUTTON }, + { "f4", "F4", 3, IDIT_BUTTON }, + { "f5", "F5", 4, IDIT_BUTTON }, + { "f6", "F6", 5, IDIT_BUTTON }, + { "f7", "F7", 6, IDIT_BUTTON }, + { "f8", "F8", 7, IDIT_BUTTON }, + + { "1", "1", 8, IDIT_BUTTON }, + { "2", "2", 9, IDIT_BUTTON }, + { "3", "3", 10, IDIT_BUTTON }, + { "4", "4", 11, IDIT_BUTTON }, + { "5", "5", 12, IDIT_BUTTON }, + { "6", "6", 13, IDIT_BUTTON }, + { "7", "7", 14, IDIT_BUTTON }, + { "8", "8", 15, IDIT_BUTTON }, + { "9", "9", 16, IDIT_BUTTON }, + { "0", "0", 17, IDIT_BUTTON }, + { "minus", "-", 18, IDIT_BUTTON }, + { "caret", "^", 19, IDIT_BUTTON }, + { "backslash", "\\", 20, IDIT_BUTTON }, + { "stop", "STOP", 21, IDIT_BUTTON }, + + { "escape", "ESC", 22, IDIT_BUTTON }, + { "q", "Q", 23, IDIT_BUTTON }, + { "w", "W", 24, IDIT_BUTTON }, + { "e", "E", 25, IDIT_BUTTON }, + { "r", "R", 26, IDIT_BUTTON }, + { "t", "T", 27, IDIT_BUTTON }, + { "y", "Y", 28, IDIT_BUTTON }, + { "u", "U", 29, IDIT_BUTTON }, + { "i", "I", 30, IDIT_BUTTON }, + { "o", "O", 31, IDIT_BUTTON }, + { "p", "P", 32, IDIT_BUTTON }, + { "at", "@", 33, IDIT_BUTTON }, + { "left_bracket", "[", 34, IDIT_BUTTON }, + { "return", "RETURN", 35, IDIT_BUTTON }, + { "ctrl", "CTR", 36, IDIT_BUTTON }, + { "a", "A", 37, IDIT_BUTTON }, + { "s", "S", 38, IDIT_BUTTON }, + { "d", "D", 39, IDIT_BUTTON }, + { "f", "F", 40, IDIT_BUTTON }, + { "g", "G", 41, IDIT_BUTTON }, + { "h", "H", 42, IDIT_BUTTON }, + { "j", "J", 43, IDIT_BUTTON }, + { "k", "K", 44, IDIT_BUTTON }, + { "l", "L", 45, IDIT_BUTTON }, + { "semicolon", ";", 46, IDIT_BUTTON }, + { "colon", ":", 47, IDIT_BUTTON }, + { "right_bracket", "]", 48, IDIT_BUTTON }, + { "kana", "カナ", 49, IDIT_BUTTON }, + { "left_shift", "Left SHIFT", 50, IDIT_BUTTON }, + { "z", "Z", 51, IDIT_BUTTON }, + { "x", "X", 52, IDIT_BUTTON }, + { "c", "C", 53, IDIT_BUTTON }, + { "v", "V", 54, IDIT_BUTTON }, + { "b", "B", 55, IDIT_BUTTON }, + { "n", "N", 56, IDIT_BUTTON }, + { "m", "M", 57, IDIT_BUTTON }, + { "comma", ",", 58, IDIT_BUTTON }, + { "period", ".", 59, IDIT_BUTTON }, + { "slash", "/", 60, IDIT_BUTTON }, + { "empty", "Empty", 61, IDIT_BUTTON }, + { "right_shift", "Right SHIFT", 62, IDIT_BUTTON }, + { "graph", "GRPH", 63, IDIT_BUTTON }, + { "space", "SPACE", 64, IDIT_BUTTON }, + + { "clear", "CLR", 65, IDIT_BUTTON }, + { "insert", "INS", 66, IDIT_BUTTON }, + { "delete", "DEL", 67, IDIT_BUTTON }, + { "up", "UP", 68, IDIT_BUTTON }, + { "left", "LEFT", 69, IDIT_BUTTON }, + { "right", "RIGHT", 70, IDIT_BUTTON }, + { "down", "DOWN", 71, IDIT_BUTTON }, +}; + +static const IDIISG HypershotIDII = +{ + { "i_run", "I, RUN", 0, IDIT_BUTTON_CAN_RAPID, NULL }, + { "i_jump", "I, JUMP", 1, IDIT_BUTTON_CAN_RAPID, NULL }, + { "ii_run", "II, RUN", 2, IDIT_BUTTON_CAN_RAPID, NULL }, + { "ii_jump", "II, JUMP", 3, IDIT_BUTTON_CAN_RAPID, NULL }, +}; + +static const IDIISG MahjongIDII = +{ + { "1", "1", 0, IDIT_BUTTON, NULL }, + { "2", "2", 1, IDIT_BUTTON, NULL }, + { "3", "3", 2, IDIT_BUTTON, NULL }, + { "4", "4", 3, IDIT_BUTTON, NULL }, + { "5", "5", 4, IDIT_BUTTON, NULL }, + { "6", "6", 5, IDIT_BUTTON, NULL }, + { "7", "7", 6, IDIT_BUTTON, NULL }, + { "8", "8", 7, IDIT_BUTTON, NULL }, + { "9", "9", 8, IDIT_BUTTON, NULL }, + { "10", "10", 9, IDIT_BUTTON, NULL }, + { "11", "11", 10, IDIT_BUTTON, NULL }, + { "12", "12", 11, IDIT_BUTTON, NULL }, + { "13", "13", 12, IDIT_BUTTON, NULL }, + { "14", "14", 13, IDIT_BUTTON, NULL }, + { "15", "15", 14, IDIT_BUTTON, NULL }, + { "16", "16", 15, IDIT_BUTTON, NULL }, + { "17", "17", 16, IDIT_BUTTON, NULL }, + { "18", "18", 17, IDIT_BUTTON, NULL }, + { "19", "19", 18, IDIT_BUTTON, NULL }, + { "20", "20", 19, IDIT_BUTTON, NULL }, + { "21", "21", 20, IDIT_BUTTON, NULL }, +}; + +static const IDIISG PartyTapIDII = +{ + { "buzzer_1", "Buzzer 1", 0, IDIT_BUTTON, NULL }, + { "buzzer_2", "Buzzer 2", 1, IDIT_BUTTON, NULL }, + { "buzzer_3", "Buzzer 3", 2, IDIT_BUTTON, NULL }, + { "buzzer_4", "Buzzer 4", 3, IDIT_BUTTON, NULL }, + { "buzzer_5", "Buzzer 5", 4, IDIT_BUTTON, NULL }, + { "buzzer_6", "Buzzer 6", 5, IDIT_BUTTON, NULL }, +}; + +static const IDIISG FTrainerIDII = +{ + { "1", "1", 0, IDIT_BUTTON, NULL }, + { "2", "2", 1, IDIT_BUTTON, NULL }, + { "3", "3", 2, IDIT_BUTTON, NULL }, + { "4", "4", 3, IDIT_BUTTON, NULL }, + { "5", "5", 4, IDIT_BUTTON, NULL }, + { "6", "6", 5, IDIT_BUTTON, NULL }, + { "7", "7", 6, IDIT_BUTTON, NULL }, + { "8", "8", 7, IDIT_BUTTON, NULL }, + { "9", "9", 8, IDIT_BUTTON, NULL }, + { "10", "10", 9, IDIT_BUTTON, NULL }, + { "11", "11", 10, IDIT_BUTTON, NULL }, + { "12", "12", 11, IDIT_BUTTON, NULL }, +}; + +static const IDIISG OekaIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS }, + { "button", "Button", 0, IDIT_BUTTON, NULL }, +}; + +static const IDIISG BWorldIDII = +{ + { "new", "New", -1, IDIT_BYTE_SPECIAL }, + { "bd1", "Barcode Digit 1", -1, IDIT_BYTE_SPECIAL }, + { "bd2", "Barcode Digit 2", -1, IDIT_BYTE_SPECIAL }, + { "bd3", "Barcode Digit 3", -1, IDIT_BYTE_SPECIAL }, + { "bd4", "Barcode Digit 4", -1, IDIT_BYTE_SPECIAL }, + { "bd5", "Barcode Digit 5", -1, IDIT_BYTE_SPECIAL }, + { "bd6", "Barcode Digit 6", -1, IDIT_BYTE_SPECIAL }, + { "bd7", "Barcode Digit 7", -1, IDIT_BYTE_SPECIAL }, + { "bd8", "Barcode Digit 8", -1, IDIT_BYTE_SPECIAL }, + { "bd9", "Barcode Digit 9", -1, IDIT_BYTE_SPECIAL }, + { "bd10", "Barcode Digit 10", -1, IDIT_BYTE_SPECIAL }, + { "bd11", "Barcode Digit 11", -1, IDIT_BYTE_SPECIAL }, + { "bd12", "Barcode Digit 12", -1, IDIT_BYTE_SPECIAL }, + { "bd13", "Barcode Digit 13", -1, IDIT_BYTE_SPECIAL }, +}; + +static const std::vector InputDeviceInfoNESPort34 = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII + }, + +}; + +static const std::vector InputDeviceInfoNESPort = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII + }, + + // Zapper + { + "zapper", + "Zapper", + NULL, + ZapperIDII + }, + + // Powerpad A + { + "powerpada", + "Power Pad Side A", + NULL, + PowerpadIDII + }, + + // Powerpad B + { + "powerpadb", + "Power Pad Side B", + NULL, + PowerpadIDII + }, + + // Arkanoid + { + "arkanoid", + "Arkanoid Paddle", + NULL, + ArkanoidIDII + }, + + +}; + +static const std::vector InputDeviceInfoFamicomPort = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Arkanoid + { + "arkanoid", + "Arkanoid Paddle", + NULL, + ArkanoidIDII + }, + + // Space Shadow Gun + { + "shadow", + "Space Shadow Gun", + NULL, + ZapperIDII + }, + + // 4-player + { + "4player", + "4-player Adapter", + NULL, + IDII_Empty + }, + + // Family Keyboard + { + "fkb", + "Family Keyboard", + NULL, + FKBIDII + }, + + // Hypershot + { + "hypershot", + "Hypershot Paddles", + NULL, + HypershotIDII + }, + + // Mahjong + { + "mahjong", + "Mahjong Controller", + NULL, + MahjongIDII + }, + + // Party Tap + { + "partytap", + "Party Tap", + NULL, + PartyTapIDII + }, + + // Family Trainer A + { + "ftrainera", + "Family Trainer Side A", + NULL, + FTrainerIDII + }, + + // Family Trainer B + { + "ftrainerb", + "Family Trainer Side B", + NULL, + FTrainerIDII + }, + + // Oeka Kids + { + "oekakids", + "Oeka Kids Tablet", + NULL, + OekaIDII + }, + + // Barcode World + { + "bworld", + "Barcode World Scanner", + NULL, + BWorldIDII + }, + +}; + +// The temptation is there, but don't change the "fcexp" default setting to anything other than "none", as the presence of a device +// there by default will cause compatibility problems with games. +const std::vector NESPortInfo = +{ + { "port1", "Port 1", InputDeviceInfoNESPort, "gamepad" }, + { "port2", "Port 2", InputDeviceInfoNESPort, "gamepad" }, + { "port3", "Port 3", InputDeviceInfoNESPort34, "gamepad" }, + { "port4", "Port 4", InputDeviceInfoNESPort34, "gamepad" }, + { "fcexp", "Famicom Expansion Port", InputDeviceInfoFamicomPort, "none" }, +}; + +static uint8 joy_readbit[2]; +//static +uint8 joy[4]={0,0,0,0}; +static uint8 LastStrobe; + +/* This function is a quick hack to get the NSF player to use emulated gamepad + input. +*/ +uint8 MDFN_GetJoyJoy(void) +{ + return(joy[0]|joy[1]|joy[2]|joy[3]); +} +extern uint8 coinon; + +static int FSDisable=0; /* Set to 1 if NES-style four-player adapter is disabled. */ + +static const char *JPType[5] = { "none", "none", "none", "none", "none" }; +static void *InputDataPtr[5]; + +void (*InputScanlineHook)(uint8 *bg, uint32 linets, int final); + + +static INPUTC DummyJPort = {0, 0, 0, 0, 0, NULL}; +static INPUTC *JPorts[4] = {&DummyJPort, &DummyJPort, &DummyJPort, &DummyJPort}; +static INPUTCFC *FCExp = NULL; + +static uint8 ReadGPVS(int w) +{ + uint8 ret=0; + + if(joy_readbit[w]>=8) + ret=1; + else + { + ret = ((joy[w]>>(joy_readbit[w]))&1); + if(!fceuindbg) + joy_readbit[w]++; + } + return ret; +} + +static uint8 ReadGP(int w) +{ + uint8 ret; + + if(joy_readbit[w]>=8) + ret = ((joy[2+w]>>(joy_readbit[w]&7))&1); + else + ret = ((joy[w]>>(joy_readbit[w]))&1); + if(joy_readbit[w]>=16) ret=0; + if(FSDisable) + { + if(joy_readbit[w]>=8) ret|=1; + } + else + { + if(joy_readbit[w]==19-w) ret|=1; + } + if(!fceuindbg) + joy_readbit[w]++; + return ret; +} + +static DECLFR(JPRead) +{ + uint8 ret=0; + + if(JPorts[A&1]->Read) + ret|=JPorts[A&1]->Read(A&1); + + if(FCExp) + { + if(FCExp->Read) + { + ret=FCExp->Read(A&1,ret); + } + } + ret|=X.DB&0xC0; + return(ret); +} + +static DECLFW(B4016) +{ + if(FCExp) + if(FCExp->Write) + FCExp->Write(V&7); + + if(JPorts[0]->Write) + JPorts[0]->Write(V&1); + if(JPorts[1]->Write) + JPorts[1]->Write(V&1); + + if((LastStrobe&1) && (!(V&1))) + { + /* This strobe code is just for convenience. If it were + with the code in input / *.c, it would more accurately represent + what's really going on. But who wants accuracy? ;) + Seriously, though, this shouldn't be a problem. + */ + if(JPorts[0]->Strobe) + JPorts[0]->Strobe(0); + if(JPorts[1]->Strobe) + JPorts[1]->Strobe(1); + if(FCExp) + if(FCExp->Strobe) + FCExp->Strobe(); + } + LastStrobe=V&0x1; +} + +static void StrobeGP(int w) +{ + joy_readbit[w]=0; +} + +static void StateActionGP(int w, StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(joy_readbit[w]), + SFVAR(joy[w + 0]), + SFVAR(joy[w + 2]), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, w ? "INP1" : "INP0", true); + + if(load) + { + + } +} + +static uint8 F4ReadBit[2]; +static void StateActionGPFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(F4ReadBit, 2), + SFARRAY(joy, 4), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs,"INPF", true); + + if(load) + { + + } +} + +static void StrobeFami4(void) +{ + F4ReadBit[0]=F4ReadBit[1]=0; +} + +static uint8 ReadFami4(int w, uint8 ret) +{ + ret&=1; + + ret |= ((joy[2+w]>>(F4ReadBit[w]))&1)<<1; + if(F4ReadBit[w]>=8) ret|=2; + else F4ReadBit[w]++; + + return(ret); +} + +static void UpdateGamepad(int w, void *data) +{ + joy[w] = *(uint8*)data; +} + +static INPUTCFC FAMI4C = { ReadFami4,0,StrobeFami4,0,0,0, StateActionGPFC }; +static INPUTC GPC = {ReadGP,0,StrobeGP,UpdateGamepad,0,0, StateActionGP }; +static INPUTC GPCVS = {ReadGPVS,0,StrobeGP,UpdateGamepad,0,0, StateActionGP }; + +void MDFN_DrawInput(uint8* pix, int pix_y) +{ + for(unsigned i = 0; i < 2; i++) + { + if(JPorts[i]->Draw) + JPorts[i]->Draw(i, pix, pix_y); + } + + if(FCExp && FCExp->Draw) + FCExp->Draw(pix, pix_y); +} + +void MDFN_UpdateInput(void) +{ + int x; + + for(x = 0; x < 4;x++) + { + if(JPorts[x]->Update) + JPorts[x]->Update(x, InputDataPtr[x]); + } + + if(FCExp) + if(FCExp->Update) + FCExp->Update(InputDataPtr[4]); + + if(NESIsVSUni && coinon) + coinon--; + + if(NESIsVSUni) + MDFN_VSUniSwap(&joy[0], &joy[1]); +} + +extern uint8 vsdip; // FIXME + +static DECLFR(VSUNIRead0) +{ + uint8 ret=0; + + if(JPorts[0]->Read) + ret|=(JPorts[0]->Read(0))&1; + + ret|=(vsdip&3)<<3; + if(coinon) + ret|=0x4; + return ret; +} + +static DECLFR(VSUNIRead1) +{ + uint8 ret=0; + + if(JPorts[1]->Read) + ret|=(JPorts[1]->Read(1))&1; + ret|=vsdip&0xFC; + return ret; +} + +static void SLHLHook(uint8 *pix, uint32 linets, int final) +{ + int x; + + for(x=0;x<2;x++) + if(JPorts[x]->SLHook) + JPorts[x]->SLHook(x, pix, linets, final); + if(FCExp) + if(FCExp->SLHook) + FCExp->SLHook(pix, linets, final); +} + +static void CheckSLHook(void) +{ + InputScanlineHook=0; + if(JPorts[0]->SLHook || JPorts[1]->SLHook) + InputScanlineHook=SLHLHook; + if(FCExp) + if(FCExp->SLHook) + InputScanlineHook=SLHLHook; +} + +static void SetInputStuff(int x) +{ + const char *ts = JPType[x]; + + if(x == 4) + { + if(!strcasecmp(ts, "none")) + FCExp = NULL; + else if(!strcasecmp(ts, "arkanoid")) + FCExp = MDFN_InitArkanoidFC(); + else if(!strcasecmp(ts, "shadow")) + FCExp=MDFN_InitSpaceShadow(); + else if(!strcasecmp(ts, "oekakids")) + FCExp=MDFN_InitOekaKids(); + else if(!strcasecmp(ts, "4player")) + { + FCExp=&FAMI4C; + memset(&F4ReadBit,0,sizeof(F4ReadBit)); + } + else if(!strcasecmp(ts, "fkb")) + FCExp=MDFN_InitFKB(); + else if(!strcasecmp(ts, "hypershot")) + FCExp=MDFN_InitHS(); + else if(!strcasecmp(ts, "mahjong")) + FCExp=MDFN_InitMahjong(); + else if(!strcasecmp(ts, "partytap")) + FCExp=MDFN_InitPartyTap(); + else if(!strcasecmp(ts, "ftrainera")) + FCExp=MDFN_InitFamilyTrainerA(); + else if(!strcasecmp(ts, "ftrainerb")) + FCExp=MDFN_InitFamilyTrainerB(); + else if(!strcasecmp(ts, "bworld")) + FCExp=MDFN_InitBarcodeWorld(); + } + else + { + if(!strcasecmp(ts, "gamepad")) + { + if(NESIsVSUni) + JPorts[x] = &GPCVS; + else + JPorts[x]=&GPC; + } + else if(!strcasecmp(ts, "arkanoid")) + JPorts[x]=MDFN_InitArkanoid(x); + else if(!strcasecmp(ts, "zapper")) + JPorts[x]=MDFN_InitZapper(x); + else if(!strcasecmp(ts, "powerpada")) + JPorts[x]=MDFN_InitPowerpadA(x); + else if(!strcasecmp(ts, "powerpadb")) + JPorts[x]=MDFN_InitPowerpadB(x); + else if(!strcasecmp(ts, "none")) + JPorts[x]=&DummyJPort; + } + + CheckSLHook(); +} + +void NESINPUT_Power(void) +{ + memset(joy_readbit,0,sizeof(joy_readbit)); + memset(joy,0,sizeof(joy)); + LastStrobe = 0; + + for(int x = 0; x < 5; x++) + SetInputStuff(x); +} + +void MDFNNES_SetInput(unsigned port, const char *type, uint8 *ptr) +{ + JPType[port] = type; + InputDataPtr[port] = ptr; + SetInputStuff(port); +} + +void NESINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVARN(LastStrobe, "LSTS"), + SFEND + }; + + if(load && !data_only) // Kludgey forced initialization of variables in case a section or variable is missing. + { + for(unsigned x = 0; x < 5; x++) + SetInputStuff(x); + } + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPT"); + + if(JPorts[0]->StateAction) + JPorts[0]->StateAction(0, sm, load, data_only); + if(JPorts[1]->StateAction) + JPorts[1]->StateAction(1, sm, load, data_only); + + if(FCExp && FCExp->StateAction) + FCExp->StateAction(sm, load, data_only); + + if(load) + { + + } +} + +static writefunc Other4016WHandler; + +static DECLFW(B4016_Chained) +{ + Other4016WHandler(A, V); + B4016(A, V); +} + +void NESINPUT_PaletteChanged(void) +{ + NESCURSOR_PaletteChanged(); +} + +void NESINPUT_Init(void) +{ + FSDisable = MDFN_GetSettingB("nes.nofs"); + + if(NESIsVSUni) + { + SetReadHandler(0x4016, 0x4016, VSUNIRead0); + SetReadHandler(0x4017, 0x4017, VSUNIRead1); + } + else + SetReadHandler(0x4016, 0x4017, JPRead); + + Other4016WHandler = GetWriteHandler(0x4016); + + if(Other4016WHandler != BNull) + SetWriteHandler(0x4016, 0x4016, B4016_Chained); + else + SetWriteHandler(0x4016, 0x4016, B4016); +} + + + +void MDFNNES_DoSimpleCommand(int cmd) +{ + if(cmd >= MDFN_MSC_TOGGLE_DIP0 && cmd <= MDFN_MSC_TOGGLE_DIP7) + { + MDFN_VSUniToggleDIP(cmd - MDFN_MSC_TOGGLE_DIP0); + } + else switch(cmd) + { + case MDFN_MSC_INSERT_COIN: + MDFN_VSUniCoin(); + break; + + case MDFN_MSC_POWER: + PowerNES(); + break; + + case MDFN_MSC_RESET: + ResetNES(); + break; + } +} + +} diff --git a/Mednafen/mednafen/nes/input.h b/Mednafen/mednafen/nes/input.h new file mode 100644 index 0000000000..e047e3f7e1 --- /dev/null +++ b/Mednafen/mednafen/nes/input.h @@ -0,0 +1,82 @@ +#ifndef __MDFN_NES_INPUT_H +#define __MDFN_NES_INPUT_H + +#include + +namespace MDFN_IEN_NES +{ + +#define JOY_A 1 +#define JOY_B 2 +#define JOY_SELECT 4 +#define JOY_START 8 +#define JOY_UP 0x10 +#define JOY_DOWN 0x20 +#define JOY_LEFT 0x40 +#define JOY_RIGHT 0x80 + +#define SI_NONE 0 +#define SI_GAMEPAD 1 +#define SI_ZAPPER 2 +#define SI_POWERPADA 3 +#define SI_POWERPADB 4 +#define SI_ARKANOID 5 + +#define SIFC_NONE 0 +#define SIFC_ARKANOID 1 +#define SIFC_SHADOW 2 +#define SIFC_4PLAYER 3 +#define SIFC_FKB 4 +#define SIFC_HYPERSHOT 5 +#define SIFC_MAHJONG 6 +#define SIFC_PARTYTAP 7 +#define SIFC_FTRAINERA 8 +#define SIFC_FTRAINERB 9 +#define SIFC_OEKAKIDS 10 +#define SIFC_BWORLD 11 +#define SIFC_TOPRIDER 12 + +#define SIS_NONE 0 +#define SIS_DATACH 1 +#define SIS_NWC 2 +#define SIS_VSUNISYSTEM 3 +#define SIS_NSF 4 + +typedef struct { + uint8 (*Read)(int w); + void (*Write)(uint8 v); + void (*Strobe)(int w); + void (*Update)(int w, void *data); + void (*SLHook)(int w, uint8 *pix, uint32 linets, int final); + void (*Draw)(int w, uint8* pix, int pix_y); + void (*StateAction)(int w, StateMem *sm, const unsigned load, const bool data_only); +} INPUTC; + +typedef struct { + uint8 (*Read)(int w, uint8 ret); + void (*Write)(uint8 v); + void (*Strobe)(void); + void (*Update)(void *data); + void (*SLHook)(uint8 *pix, uint32 linets, int final); + void (*Draw)(uint8* pix, int pix_y); + void (*StateAction)(StateMem *sm, const unsigned load, const bool data_only); +} INPUTCFC; + +void MDFN_DrawInput(uint8* pix, int pix_y); +void MDFN_UpdateInput(void); +void NESINPUT_Power(void) MDFN_COLD; +void NESINPUT_Init(void) MDFN_COLD; +void NESINPUT_PaletteChanged(void) MDFN_COLD; +void NESINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +extern void (*PStrobe[2])(void); +extern void (*InputScanlineHook)(uint8 *pix, uint32 linets, int final); + +void MDFNNES_DoSimpleCommand(int cmd); +void MDFNNES_SetInput(unsigned port, const char *type, uint8 *ptr) MDFN_COLD; + +extern const std::vector NESPortInfo; + +} + +#endif diff --git a/Mednafen/mednafen/nes/input/Makefile.am.inc b/Mednafen/mednafen/nes/input/Makefile.am.inc new file mode 100755 index 0000000000..007f790cb6 --- /dev/null +++ b/Mednafen/mednafen/nes/input/Makefile.am.inc @@ -0,0 +1 @@ +libnes_a_SOURCES += input/cursor.cpp input/zapper.cpp input/powerpad.cpp input/arkanoid.cpp input/shadow.cpp input/fkb.cpp input/fkb.h input/hypershot.cpp input/mahjong.cpp input/oekakids.cpp input/ftrainer.cpp input/partytap.cpp input/toprider.cpp input/bworld.cpp input/suborkb.cpp diff --git a/Mednafen/mednafen/nes/input/arkanoid.cpp b/Mednafen/mednafen/nes/input/arkanoid.cpp new file mode 100644 index 0000000000..bca034f0d7 --- /dev/null +++ b/Mednafen/mednafen/nes/input/arkanoid.cpp @@ -0,0 +1,164 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +typedef struct { + uint32 mzx,mzb; + uint32 readbit; +} ARK; + +static ARK NESArk[2]; +static ARK FCArk; + +static void StrobeARKFC(void) +{ + FCArk.readbit=0; +} + + +static uint8 ReadARKFC(int w,uint8 ret) +{ + ret&=~2; + + if(w) + { + if(FCArk.readbit>=8) + ret|=2; + else + { + ret|=((FCArk.mzx>>(7-FCArk.readbit))&1)<<1; + if(!fceuindbg) + FCArk.readbit++; + } + } + else + ret|=FCArk.mzb<<1; + return(ret); +} + +static uint32 FixX(uint32 in_x) +{ + int32 x; + + x = (int32)in_x + 98 - 32; + + if(x < 98) + x = 98; + + if(x > 242) + x = 242; + + x=~x; + return(x); +} + +static void UpdateARKFC(void *data) +{ + uint8 *ptr = (uint8*)data; + + FCArk.mzx = FixX((int16)MDFN_de16lsb(ptr + 0)); + FCArk.mzb = (bool)ptr[2]; +} + +static void StateAction(int w, StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(NESArk[w].mzx), + SFVAR(NESArk[w].mzb), + SFVAR(NESArk[w].readbit), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, w ? "INP1" : "INP0", true); + + if(load) + { + + } +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(FCArk.mzx), + SFVAR(FCArk.mzb), + SFVAR(FCArk.readbit), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + + +static INPUTCFC ARKCFC={ReadARKFC,0,StrobeARKFC,UpdateARKFC,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitArkanoidFC(void) +{ + FCArk.mzx=98; + FCArk.mzb=0; + return(&ARKCFC); +} + +static uint8 ReadARK(int w) +{ + uint8 ret=0; + + if(NESArk[w].readbit>=8) + ret|=1<<4; + else + { + ret|=((NESArk[w].mzx>>(7-NESArk[w].readbit))&1)<<4; + if(!fceuindbg) + NESArk[w].readbit++; + } + ret|=(NESArk[w].mzb&1)<<3; + return(ret); +} + + +static void StrobeARK(int w) +{ + NESArk[w].readbit=0; +} + +static void UpdateARK(int w, void *data) +{ + uint8 *ptr = (uint8*)data; + + NESArk[w].mzx = FixX((int16)MDFN_de16lsb(ptr + 0)); + NESArk[w].mzb = (bool)ptr[2]; +} + +static INPUTC ARKC={ReadARK, 0, StrobeARK, UpdateARK, 0, 0, StateAction }; + +INPUTC *MDFN_InitArkanoid(int w) +{ + NESArk[w].mzx=98; + NESArk[w].mzb=0; + return(&ARKC); +} diff --git a/Mednafen/mednafen/nes/input/bworld.cpp b/Mednafen/mednafen/nes/input/bworld.cpp new file mode 100644 index 0000000000..57c8a19d0e --- /dev/null +++ b/Mednafen/mednafen/nes/input/bworld.cpp @@ -0,0 +1,115 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static int seq; +static uint8 ptr, bit, cnt; +static bool have; +static uint8 bdata[20]; + + +static uint8 Read(int w, uint8 ret) +{ + if(w && have) + { + switch(seq) + { + case 0: seq++; + ptr=0; + ret|=0x4; + break; + + case 1: seq++; + bit=bdata[ptr]; + cnt=0; + ret|=0x4; + break; + + case 2: ret|=((bit&0x01)^0x01)<<2; + bit>>=1; + if(++cnt > 7) + seq++; + break; + + case 3: if(++ptr > 19) + { + seq=-1; + have=0; + } + else + seq=1; + break; + + default: break; + } + } + return(ret); +} + +static void Write(uint8 V) +{ + //printf("%02x\n",V); +} + +static void Update(void *data) +{ + if(*(uint8 *)data) + { + *(uint8 *)data=0; + seq=ptr=0; + have=1; + strncpy((char *)bdata, (char *)data+1, 13); + memcpy((char *)&bdata[13], "SUNSOFT", strlen("SUNSOFT")); + } +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(seq), + SFVAR(ptr), + SFVAR(bit), + SFVAR(cnt), + SFVAR(have), + SFARRAY(bdata, 20), + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + if(ptr > 19) // Sanity check. + { + have = false; + seq = -1; + } + } +} + + +static INPUTCFC BarcodeWorld={Read,Write,0,Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitBarcodeWorld(void) +{ + return(&BarcodeWorld); +} + diff --git a/Mednafen/mednafen/nes/input/cursor.cpp b/Mednafen/mednafen/nes/input/cursor.cpp new file mode 100644 index 0000000000..c969c81b02 --- /dev/null +++ b/Mednafen/mednafen/nes/input/cursor.cpp @@ -0,0 +1,141 @@ +#include "share.h" + +#include + +static const uint8 GunSight[]= +{ + 0,0,0,0,0,0,1,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,3,0,0,0,0,0,0, + 1,2,1,2,0,3,3,3,0,2,1,2,1, + 0,0,0,0,0,0,3,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,0,0,0, +}; + +static const uint8 MDFNcursor[11*19]= +{ + 1,0,0,0,0,0,0,0,0,0,0, + 1,1,0,0,0,0,0,0,0,0,0, + 1,2,1,0,0,0,0,0,0,0,0, + 1,2,2,1,0,0,0,0,0,0,0, + 1,2,2,2,1,0,0,0,0,0,0, + 1,2,2,2,2,1,0,0,0,0,0, + 1,2,2,2,2,2,1,0,0,0,0, + 1,2,2,2,2,2,2,1,0,0,0, + 1,2,2,2,2,2,2,2,1,0,0, + 1,2,2,2,2,2,2,2,2,1,0, + 1,2,2,2,2,2,1,1,1,1,1, + 1,2,2,1,2,2,1,0,0,0,0, + 1,2,1,0,1,2,2,1,0,0,0, + 1,1,0,0,1,2,2,1,0,0,0, + 1,0,0,0,0,1,2,2,1,0,0, + 0,0,0,0,0,1,2,2,1,0,0, + 0,0,0,0,0,0,1,2,2,1,0, + 0,0,0,0,0,0,1,2,2,1,0, + 0,0,0,0,0,0,0,1,1,0,0, +}; + +static uint8 invert_tab[0x40]; +static uint8 pe_white; +static uint8 pe_black; +static uint8 pe_bright_cake; + +static uint8 FindClose(uint8 r, uint8 g, uint8 b) MDFN_COLD; +static uint8 FindClose(uint8 r, uint8 g, uint8 b) +{ + double rl, gl, bl; + int closest = -1; + double closest_cs = 1000; + + rl = pow((double)r / 255, 2.2 / 1.0); + gl = pow((double)g / 255, 2.2 / 1.0); + bl = pow((double)b / 255, 2.2 / 1.0); + + for(unsigned x = 0; x < 0x40; x++) + { + double rcl, gcl, bcl; + double cs; + + rcl = pow((double)ActiveNESPalette[x].r / 255, 2.2 / 1.0); + gcl = pow((double)ActiveNESPalette[x].g / 255, 2.2 / 1.0); + bcl = pow((double)ActiveNESPalette[x].b / 255, 2.2 / 1.0); + + cs = fabs(rcl - rl) * 0.2126 + fabs(gcl - gl) * 0.7152 + fabs(bcl - bl) * 0.0722; + if(cs < closest_cs) + { + closest_cs = cs; + closest = x; + } + } + + return(closest); +} + +void NESCURSOR_PaletteChanged(void) +{ + pe_white = FindClose(0xFF, 0xFF, 0xFF); + pe_black = FindClose(0x00, 0x00, 0x00); + pe_bright_cake = FindClose(0xFF, 0xC0, 0xFF); + + //uint32 st = MDFND_GetTime(); + for(int i = 0; i < 0x40; i++) + { + invert_tab[i] = FindClose(ActiveNESPalette[i].r ^ 0x80, ActiveNESPalette[i].g ^ 0x80, ActiveNESPalette[i].b ^ 0x80); + } + //printf("%u\n", MDFND_GetTime() - st); +} + +void NESCURSOR_DrawGunSight(int w, uint8* pix, int pix_y, int xc, int yc) +{ + const uint8 ctransform[2][2] = { { pe_black, pe_bright_cake }, { pe_white, pe_black } }; + int y = pix_y - yc + 7; + + if(y >= 0 && y < 13) + { + for(int x = 0; x < 13; x++) + { + uint8 a = GunSight[y*13+x]; + + if(a) + { + int d = xc + (x - 7); + if(d >= 0 && d < 256) + { + if(a==3) + pix[d] = invert_tab[pix[d] & 0x3F]; + else + pix[d] = ctransform[w][(a - 1) & 1]; + } + } + } + } +} + + +void NESCURSOR_DrawCursor(uint8* pix, int pix_y, int xc, int yc) +{ + const uint32 ctransform[4] = { pe_black, pe_black, pe_white, pe_black }; + int y = pix_y - yc; + + if(y >= 0 && y < 19) + { + for(int x = 0; x < 11; x++) + { + uint8 a = MDFNcursor[y*11 + x]; + if(a) + { + int d = x + xc; + + if(d >= 0 && d < 256) + pix[d] = ctransform[a & 0x3]; + } + } + } +} diff --git a/Mednafen/mednafen/nes/input/cursor.h b/Mednafen/mednafen/nes/input/cursor.h new file mode 100644 index 0000000000..b04670e2f2 --- /dev/null +++ b/Mednafen/mednafen/nes/input/cursor.h @@ -0,0 +1,8 @@ +#ifndef __MDFN_NES_INPUT_CURSOR_H +#define __MDFN_NES_INPUT_CURSOR_H + +void NESCURSOR_PaletteChanged(void); +void NESCURSOR_DrawCursor(uint8 *pix, int pix_y, int xc, int yc); +void NESCURSOR_DrawGunSight(int w, uint8 *pix, int pix_y, int xc, int yc); + +#endif diff --git a/Mednafen/mednafen/nes/input/fkb.cpp b/Mednafen/mednafen/nes/input/fkb.cpp new file mode 100644 index 0000000000..9b813df521 --- /dev/null +++ b/Mednafen/mednafen/nes/input/fkb.cpp @@ -0,0 +1,121 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" +#include "fkb.h" + +#define AK(x) ((FKB_##x) - 1) + +static uint8 bufit[0x9]; +static uint8 ksmode; +static uint8 ksindex; + +static const uint8 matrix[9][2][4]= +{ +{{AK(F8),AK(RETURN),AK(BRACKETLEFT),AK(BRACKETRIGHT)}, + {AK(KANA),AK(RIGHTSHIFT),AK(BACKSLASH),AK(STOP)}}, +{{AK(F7),AK(AT),AK(COLON),AK(SEMICOLON)}, + {AK(UNDERSCORE),AK(SLASH),AK(MINUS),AK(CARET)}}, +{{AK(F6),AK(O),AK(L),AK(K)}, + {AK(PERIOD),AK(COMMA),AK(P),AK(0)}}, +{{AK(F5),AK(I),AK(U),AK(J)}, + {AK(M),AK(N),AK(9),AK(8)}}, +{{AK(F4),AK(Y),AK(G),AK(H)}, + {AK(B),AK(V),AK(7),AK(6)}}, +{{AK(F3),AK(T),AK(R),AK(D)}, + {AK(F),AK(C),AK(5),AK(4)}}, +{{AK(F2),AK(W),AK(S),AK(A)}, + {AK(X),AK(Z),AK(E),AK(3)}}, +{{AK(F1),AK(ESCAPE),AK(Q),AK(CONTROL)}, + {AK(LEFTSHIFT),AK(GRAPH),AK(1),AK(2)}}, +{{AK(CLEAR),AK(UP),AK(RIGHT),AK(LEFT)}, + {AK(DOWN),AK(SPACE),AK(DELETE),AK(INSERT)}}, +}; + +static void FKB_Write(uint8 v) +{ + v>>=1; + if(v&2) + { + if((ksmode&1) && !(v&1)) + ksindex=(ksindex+1)%9; + } + ksmode=v; +} + +static uint8 FKB_Read(int w, uint8 ret) +{ + //printf("$%04x, %d, %d\n",w+0x4016,ksindex,ksmode&1); + if(w) + { + ret |= 0x1E; + + for(int x = 0; x < 4; x++) + { + unsigned bi = matrix[ksindex][ksmode&1][x]; + + if(bufit[bi >> 3] & (1U << (bi & 0x7))) + { + ret ^= 1U << (x + 1); + } + } + } + return(ret); +} + +static void FKB_Strobe(void) +{ + ksmode=0; + ksindex=0; + //printf("strobe\n"); +} + +static void FKB_Update(void *data) +{ + memcpy(bufit, data, 0x9); +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(bufit, 0x9), + SFVAR(ksmode), + SFVAR(ksindex), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + + +static INPUTCFC FKB={FKB_Read,FKB_Write,FKB_Strobe,FKB_Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitFKB(void) +{ + memset(bufit, 0, sizeof(bufit)); + ksmode=ksindex=0; + return(&FKB); +} diff --git a/Mednafen/mednafen/nes/input/fkb.h b/Mednafen/mednafen/nes/input/fkb.h new file mode 100644 index 0000000000..ca27b34a47 --- /dev/null +++ b/Mednafen/mednafen/nes/input/fkb.h @@ -0,0 +1,72 @@ +#define FKB_F1 0x01 +#define FKB_F2 0x02 +#define FKB_F3 0x03 +#define FKB_F4 0x04 +#define FKB_F5 0x05 +#define FKB_F6 0x06 +#define FKB_F7 0x07 +#define FKB_F8 0x08 +#define FKB_1 0x09 +#define FKB_2 0x0A +#define FKB_3 0x0B +#define FKB_4 0x0C +#define FKB_5 0x0D +#define FKB_6 0x0E +#define FKB_7 0x0F +#define FKB_8 0x10 +#define FKB_9 0x11 +#define FKB_0 0x12 +#define FKB_MINUS 0x13 +#define FKB_CARET 0x14 +#define FKB_BACKSLASH 0x15 +#define FKB_STOP 0x16 +#define FKB_ESCAPE 0x17 +#define FKB_Q 0x18 +#define FKB_W 0x19 +#define FKB_E 0x1A +#define FKB_R 0x1B +#define FKB_T 0x1C +#define FKB_Y 0x1D +#define FKB_U 0x1E +#define FKB_I 0x1F +#define FKB_O 0x20 +#define FKB_P 0x21 +#define FKB_AT 0x22 +#define FKB_BRACKETLEFT 0x23 +#define FKB_RETURN 0x24 +#define FKB_CONTROL 0x25 +#define FKB_A 0x26 +#define FKB_S 0x27 +#define FKB_D 0x28 +#define FKB_F 0x29 +#define FKB_G 0x2A +#define FKB_H 0x2B +#define FKB_J 0x2C +#define FKB_K 0x2D +#define FKB_L 0x2E +#define FKB_SEMICOLON 0x2F +#define FKB_COLON 0x30 +#define FKB_BRACKETRIGHT 0x31 +#define FKB_KANA 0x32 +#define FKB_LEFTSHIFT 0x33 +#define FKB_Z 0x34 +#define FKB_X 0x35 +#define FKB_C 0x36 +#define FKB_V 0x37 +#define FKB_B 0x38 +#define FKB_N 0x39 +#define FKB_M 0x3A +#define FKB_COMMA 0x3B +#define FKB_PERIOD 0x3C +#define FKB_SLASH 0x3D +#define FKB_UNDERSCORE 0x3E +#define FKB_RIGHTSHIFT 0x3F +#define FKB_GRAPH 0x40 +#define FKB_SPACE 0x41 +#define FKB_CLEAR 0x42 +#define FKB_INSERT 0x43 +#define FKB_DELETE 0x44 +#define FKB_UP 0x45 +#define FKB_LEFT 0x46 +#define FKB_RIGHT 0x47 +#define FKB_DOWN 0x48 diff --git a/Mednafen/mednafen/nes/input/ftrainer.cpp b/Mednafen/mednafen/nes/input/ftrainer.cpp new file mode 100644 index 0000000000..01872ab168 --- /dev/null +++ b/Mednafen/mednafen/nes/input/ftrainer.cpp @@ -0,0 +1,90 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static uint32 FTVal,FTValR; +static char side; + +static uint8 FT_Read(int w, uint8 ret) +{ + if(w) + { + ret|=FTValR; + } + return(ret); +} + +static void FT_Write(uint8 V) +{ + FTValR=0; + + //printf("%08x\n",FTVal); + if(!(V&0x1)) + FTValR=(FTVal>>8); + else if(!(V&0x2)) + FTValR=(FTVal>>4); + else if(!(V&0x4)) + FTValR=FTVal; + + FTValR=(~FTValR)&0xF; + if(side=='B') + FTValR=((FTValR&0x8)>>3) | ((FTValR&0x4)>>1) | ((FTValR&0x2)<<1) | ((FTValR&0x1)<<3); + FTValR<<=1; +} + +static void FT_Update(void *data) +{ + FTVal = MDFN_de16lsb((uint8*)data); +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(FTValR), + SFVAR(FTVal), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC FamilyTrainer={FT_Read,FT_Write,0,FT_Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitFamilyTrainerA(void) +{ + side='A'; + FTVal=FTValR=0; + return(&FamilyTrainer); +} + +INPUTCFC *MDFN_InitFamilyTrainerB(void) +{ + side='B'; + FTVal=FTValR=0; + return(&FamilyTrainer); +} + diff --git a/Mednafen/mednafen/nes/input/hypershot.cpp b/Mednafen/mednafen/nes/input/hypershot.cpp new file mode 100644 index 0000000000..66287108e9 --- /dev/null +++ b/Mednafen/mednafen/nes/input/hypershot.cpp @@ -0,0 +1,65 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static uint8 HSVal,HSValR; + + +static uint8 HS_Read(int w, uint8 ret) +{ + if(w) ret|=HSValR; + + return(ret); +} + +static void HS_Strobe(void) +{ + HSValR=HSVal<<1; +} + +static void HS_Update(void *data) +{ + HSVal=*(uint8*)data; +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(HSVal), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "HSHT", true); + + if(load) + { + + } +} + +static INPUTCFC HyperShot={HS_Read,0,HS_Strobe,HS_Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitHS(void) +{ + HSVal=HSValR=0; + return(&HyperShot); +} diff --git a/Mednafen/mednafen/nes/input/mahjong.cpp b/Mednafen/mednafen/nes/input/mahjong.cpp new file mode 100644 index 0000000000..519f1f1fdf --- /dev/null +++ b/Mednafen/mednafen/nes/input/mahjong.cpp @@ -0,0 +1,95 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static uint32 MReal,MRet; + +static uint8 MJ_Read(int w, uint8 ret) +{ + if(w) + { +// ret|=(MRet&1)<<1; + ret|=((MRet&0x80)>>6)&2; +// MRet>>=1; + if(!fceuindbg) + MRet<<=1; + } + return(ret); +} + +static void MJ_Write(uint8 v) +{ + /* 1: I-D7, J-D6, K-D5, L-D4, M-D3, Big Red-D2 + 2: A-D7, B-D6, C-D5, D-D4, E-D3, F-D2, G-D1, H-D0 + 3: Sel-D6, Start-D7, D5, D4, D3, D2, D1 + */ + MRet=0; + + v>>=1; + v&=3; + + if(v==3) + { + MRet=(MReal>>14)&0x7F; + //MRet=((MRet&0x1F) |((MRet&0x40)>>1)|((MRet&0x20)<<1)) <<1; //(MReal>>13)&0x7F; + } + else if(v==2) + { + MRet=MReal&0xFF; + } + else if(v==1) + { + MRet=(MReal>>8)&0x3F; + } +// HSValR=HSVal<<1; +} + +static void MJ_Update(void *data) +{ + MReal = MDFN_de24lsb((uint8*)data); + //printf("%08x\n",MReal>>13); + //HSVal=*(uint8*)data; +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(MReal), + SFVAR(MRet), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC Mahjong={MJ_Read,MJ_Write,0,MJ_Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitMahjong(void) +{ + MReal=MRet=0; + return(&Mahjong); +} diff --git a/Mednafen/mednafen/nes/input/oekakids.cpp b/Mednafen/mednafen/nes/input/oekakids.cpp new file mode 100644 index 0000000000..92fe83b3d3 --- /dev/null +++ b/Mednafen/mednafen/nes/input/oekakids.cpp @@ -0,0 +1,116 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static uint8 OKValR,LastWR; +static uint32 OKData; +static uint32 OKX,OKY,OKB; + +static uint8 OK_Read(int w, uint8 ret) +{ + if(w) + { + ret|=OKValR; + } + return(ret); +} + +static void OK_Write(uint8 V) +{ + if(!(V&0x1)) + { + int32 vx,vy; + + //puts("Redo"); + OKValR=OKData=0; + + if(OKB) OKData|=1; + + if(OKY >= 48) + OKData|=2; + else if(OKB) OKData|=3; + + vx=OKX*240/256+8; + vy=OKY*256/240-12; + if(vy<0) vy=0; + if(vy>255) vy=255; + if(vx<0) vx=0; + if(vx>255) vx=255; + OKData |= (vx<<10) | (vy<<2); + } + else + { + if((~LastWR)&V&0x02) + OKData<<=1; + + if(!(V&0x2)) OKValR=0x4; + else + { + if(OKData&0x40000) OKValR=0; + else OKValR=0x8; + } + } + LastWR=V; +} + +static void OK_Update(void *data) +{ + OKX = (int16)MDFN_de16lsb((uint8 *)data + 0); + OKY = (int16)MDFN_de16lsb((uint8 *)data + 2); + OKB=((uint8*)data)[4]; + + //printf("%d\n", OKX); +} + +static void DrawOeka(uint8 *pix, int pix_y) +{ + if(OKY<44) + NESCURSOR_DrawCursor(pix, pix_y, OKX, OKY); +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(OKX), + SFVAR(OKY), + SFVAR(OKB), + SFVAR(OKData), + SFVAR(OKValR), + SFVAR(LastWR), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC OekaKids={OK_Read,OK_Write,0,OK_Update,0,DrawOeka, StateActionFC }; + +INPUTCFC *MDFN_InitOekaKids(void) +{ + OKValR=0; + return(&OekaKids); +} diff --git a/Mednafen/mednafen/nes/input/partytap.cpp b/Mednafen/mednafen/nes/input/partytap.cpp new file mode 100644 index 0000000000..9b4b307e06 --- /dev/null +++ b/Mednafen/mednafen/nes/input/partytap.cpp @@ -0,0 +1,93 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static uint8 QZVal,QZValR; +static uint8 FunkyMode; + +static uint8 QZ_Read(int w, uint8 ret) +{ + if(w) + { + //if(X.PC==0xdc7d) return(0xFF); + //printf("Blah: %04x\n",X.PC); + //MDFNI_DumpMem("dmp2",0xc000,0xffff); + + ret|=(QZValR&0x7)<<2; + QZValR=QZValR>>3; + + if(FunkyMode) + { + //ret=0x14; + //puts("Funky"); + QZValR|=0x28; + } + else + { + QZValR|=0x38; + } + } + return(ret); +} + +static void QZ_Strobe(void) +{ + QZValR=QZVal; + //puts("Strobe"); +} + +static void QZ_Write(uint8 V) +{ + //printf("Wr: %02x\n",V); + FunkyMode=V&4; +} + +static void QZ_Update(void *data) +{ + QZVal=*(uint8 *)data; +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(QZValR), + SFVAR(QZVal), + SFVAR(FunkyMode), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC PartyTap = { QZ_Read,QZ_Write,QZ_Strobe,QZ_Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitPartyTap(void) +{ + QZVal=QZValR=0; + + return(&PartyTap); +} diff --git a/Mednafen/mednafen/nes/input/powerpad.cpp b/Mednafen/mednafen/nes/input/powerpad.cpp new file mode 100644 index 0000000000..48294d294e --- /dev/null +++ b/Mednafen/mednafen/nes/input/powerpad.cpp @@ -0,0 +1,100 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + + +static bool side; // false = A, true = B +static uint32 pprsb[2]; +static uint32 pprdata[2]; + +static uint8 ReadPP(int w) +{ + uint8 ret=0; + ret|=((pprdata[w]>>pprsb[w])&1)<<3; + ret|=((pprdata[w]>>(pprsb[w]+8))&1)<<4; + if(pprsb[w]>=4) + { + ret|=0x10; + if(pprsb[w]>=8) + ret|=0x08; + } + if(!fceuindbg) + pprsb[w]++; + return ret; +} + +static void StrobePP(int w) +{ + pprsb[w]=0; +} + +void UpdatePP(int w, void *data) +{ + static const unsigned char shifttable[2][12] = + { + {8,9,0,1,11,7,4,2,10,6,5,3}, + {1,0,9,8,2,4,7,11,3,5,6,10} + }; + const uint16 ind16 = MDFN_de16lsb((uint8*)data); + + pprdata[w] = 0; + for(int x = 0; x < 12; x++) + { + pprdata[w] |= ((ind16 >> x) & 1) << shifttable[side][x]; + } +} + +static void StateAction(int w, StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(pprsb[w]), + SFVAR(pprdata[w]), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, w ? "INP1" : "INP0", true); + + if(load) + { + + } +} + +static INPUTC PwrPadCtrl={ReadPP,0,StrobePP,UpdatePP,0,0, StateAction }; + +static INPUTC *MDFN_InitPowerpad(int w) +{ + pprsb[w]=pprdata[w]=0; + return(&PwrPadCtrl); +} + +INPUTC *MDFN_InitPowerpadA(int w) +{ + side = false; + return(MDFN_InitPowerpad(w)); +} + +INPUTC *MDFN_InitPowerpadB(int w) +{ + side = true; + return(MDFN_InitPowerpad(w)); +} diff --git a/Mednafen/mednafen/nes/input/shadow.cpp b/Mednafen/mednafen/nes/input/shadow.cpp new file mode 100644 index 0000000000..57db4e1663 --- /dev/null +++ b/Mednafen/mednafen/nes/input/shadow.cpp @@ -0,0 +1,152 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +struct SPACE_SHADOW +{ + uint32 mzx,mzy,mzb; + int bogo; + uint64 zaphit; +}; + +static SPACE_SHADOW ZD; + +static void ShadowLinehook(uint8 *bg, uint32 linets, int final) +{ + int xs,xe; + int zx,zy; + + xs=linets; + xe=final; + + zx=ZD.mzx; + zy=ZD.mzy; + + if(xe>256) xe=256; + + if(scanline>=(zy-6) && scanline<=(zy+6)) + { + int32 sum = 0; + + while(xs=(zx-7)) + { + a1=bg[xs] & 0x3F; + sum += (((ActiveNESPalette[a1].r+ActiveNESPalette[a1].g+ActiveNESPalette[a1].b) << 8) - sum) >> 2; + + if(sum >= 256 * 220*3) + { + //puts("K"); + ZD.zaphit=timestampbase + timestamp; + goto endo; + } + } + xs++; + } + } + endo: ; +} + +static INLINE int CheckColor(void) +{ + MDFNPPU_LineUpdate(); + + if((ZD.zaphit+10)>=(timestampbase+timestamp) && !(ZD.mzb & 0x2)) + return(0); + + return(1); +} + + +static uint8 ReadShadow(int w, uint8 ret) +{ + if(w) + { + ret&=~0x18; + if(ZD.bogo) + ret|=0x10; + if(CheckColor()) + ret|=0x8; + } + else + { + ret&=~2; + ret|=(ret&1)<<1; + } + return ret; +} + +static void DrawShadow(uint8 *pix, int pix_y) +{ + NESCURSOR_DrawGunSight(1, pix, pix_y, ZD.mzx, ZD.mzy); +} + +static void UpdateShadow(void *data) +{ + uint8 *ptr=(uint8*)data; + + if(ZD.bogo) + ZD.bogo--; + + if((ptr[4] & 0x3) && !(ZD.mzb & 0x3)) + ZD.bogo=5; + + ZD.mzx = (int16)MDFN_de16lsb(ptr + 0); + ZD.mzy = (int16)MDFN_de16lsb(ptr + 2); + ZD.mzb=ptr[4]; +} + +static void StrobeShadow(void) +{ + +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(ZD.mzx), + SFVAR(ZD.mzy), + SFVAR(ZD.mzb), + SFVAR(ZD.bogo), + SFVAR(ZD.zaphit), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC SHADOWC = { ReadShadow, 0, StrobeShadow, UpdateShadow, ShadowLinehook, DrawShadow, StateActionFC }; + +INPUTCFC *MDFN_InitSpaceShadow(void) +{ + memset(&ZD, 0, sizeof(SPACE_SHADOW)); + return(&SHADOWC); +} + + diff --git a/Mednafen/mednafen/nes/input/share.h b/Mednafen/mednafen/nes/input/share.h new file mode 100644 index 0000000000..0b0fce707e --- /dev/null +++ b/Mednafen/mednafen/nes/input/share.h @@ -0,0 +1,15 @@ +#ifndef __MDFN_NES_INPUT_SHARE_H +#define __MDFN_NES_INPUT_SHARE_H + +#include "../nes.h" +#include "../input.h" +#include "../ppu/ppu.h" +#include "../x6502.h" +#include "../ppu/palette.h" +#include + +#include "cursor.h" + +using namespace MDFN_IEN_NES; + +#endif diff --git a/Mednafen/mednafen/nes/input/suborkb.cpp b/Mednafen/mednafen/nes/input/suborkb.cpp new file mode 100644 index 0000000000..4787853c97 --- /dev/null +++ b/Mednafen/mednafen/nes/input/suborkb.cpp @@ -0,0 +1,111 @@ +#include "share.h" +#include "suborkb.h" +#define AK2(x,y) ( (FKB_##x) | (FKB_##y <<8) ) +#define AK(x) FKB_##x + +static uint8 bufit[0x61]; +static uint8 ksmode; +static uint8 ksindex; + + +static const uint16 matrix[13][2][4]= +{ +{{AK(4),AK(G),AK(F),AK(C)}, + {AK(F2),AK(E),AK(5),AK(V)}}, +{{AK(2),AK(D),AK(S),AK(END)}, + {AK(F1),AK(W),AK(3),AK(X)}}, +{{AK(INSERT),AK(BACK),AK(NEXT),AK(RIGHT)}, + {AK(F8),AK(PRIOR),AK(DELETE),AK(HOME)}}, +{{AK(9),AK(I),AK(L),AK(COMMA)}, + {AK(F5),AK(O),AK(0),AK(PERIOD)}}, +{{AK(RBRACKET),AK(RETURN),AK(UP),AK(LEFT)}, + {AK(F7),AK(LBRACKET),AK(BACKSLASH),AK(DOWN)}}, +{{AK(Q),AK(CAPITAL),AK(Z),AK(TAB)}, + {AK(ESCAPE),AK(A),AK(1),AK(LCONTROL)}}, +{{AK(7),AK(Y),AK(K),AK(M)}, + {AK(F4),AK(U),AK(8),AK(J)}}, +{{AK(MINUS),AK(SEMICOLON),AK(APOSTROPHE),AK(SLASH)}, + {AK(F6),AK(P),AK(EQUALS),AK(LSHIFT)}}, +{{AK(T),AK(H),AK(N),AK(SPACE)}, + {AK(F3),AK(R),AK(6),AK(B)}}, +{{0,0,0,0}, + {0,0,0,0}}, +{{AK(LMENU),AK(NUMPAD4),AK(NUMPAD7),AK(F11)}, + {AK(F12),AK(NUMPAD1),AK(NUMPAD2),AK(NUMPAD8)}}, +{{AK(SUBTRACT),AK(ADD),AK(MULTIPLY),AK(NUMPAD9)}, + {AK(F10),AK(NUMPAD5),AK(DIVIDE),AK(NUMLOCK)}}, +{{AK(GRAVE),AK(NUMPAD6),AK(PAUSE),AK(SPACE)}, + {AK(F9),AK(NUMPAD3),AK(DECIMAL),AK(NUMPAD0)}}, +}; + +static void SuborKB_Write(uint8 v) +{ + v>>=1; + if(v&2) + { + if((ksmode&1) && !(v&1)) + ksindex=(ksindex+1)%13; + } + ksmode=v; +} + +static uint8 SuborKB_Read(int w, uint8 ret) +{ + if(w) + { + int x; + + ret&=~0x1E; +// if (ksindex==9) +// { +// if (ksmode&1) +// ret|=2; +// } +// else +// { + for(x=0;x<4;x++) + if(bufit[matrix[ksindex][ksmode&1][x]&0xFF]||bufit[matrix[ksindex][ksmode&1][x]>>8]) + ret|=1<<(x+1); +// } + ret^=0x1E; + } + return(ret); +} + +static void SuborKB_Strobe(void) +{ + ksmode=0; + ksindex=0; +} + +static void SuborKB_Update(void *data) +{ + memcpy(bufit+1,data,0x60); +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(bufit, 0x61), + SFVAR(ksmode), + SFVAR(ksindex), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC SuborKB={SuborKB_Read,SuborKB_Write,SuborKB_Strobe,SuborKB_Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitSuborKB(void) +{ + memset(bufit,0,sizeof(bufit)); + ksmode=ksindex=0; + return(&SuborKB); +} diff --git a/Mednafen/mednafen/nes/input/suborkb.h b/Mednafen/mednafen/nes/input/suborkb.h new file mode 100644 index 0000000000..588afa4448 --- /dev/null +++ b/Mednafen/mednafen/nes/input/suborkb.h @@ -0,0 +1,96 @@ +#define FKB_ESCAPE 0x01 +#define FKB_F1 0x02 +#define FKB_F2 0x03 +#define FKB_F3 0x04 +#define FKB_F4 0x05 +#define FKB_F5 0x06 +#define FKB_F6 0x07 +#define FKB_F7 0x08 +#define FKB_F8 0x09 +#define FKB_F9 0x0A +#define FKB_F10 0x0B +#define FKB_F11 0x0C +#define FKB_F12 0x0D +#define FKB_PAUSE 0x0E +#define FKB_GRAVE 0x0F +#define FKB_1 0x10 +#define FKB_2 0x11 +#define FKB_3 0x12 +#define FKB_4 0x13 +#define FKB_5 0x14 +#define FKB_6 0x15 +#define FKB_7 0x16 +#define FKB_8 0x17 +#define FKB_9 0x18 +#define FKB_0 0x19 +#define FKB_MINUS 0x1A +#define FKB_EQUALS 0x1B +#define FKB_BACK 0x1C +#define FKB_INSERT 0x1D +#define FKB_HOME 0x1E +#define FKB_PRIOR 0x1F +#define FKB_NUMLOCK 0x20 +#define FKB_DIVIDE 0x21 +#define FKB_MULTIPLY 0x22 +#define FKB_SUBTRACT 0x23 +#define FKB_TAB 0x24 +#define FKB_Q 0x25 +#define FKB_W 0x26 +#define FKB_E 0x27 +#define FKB_R 0x28 +#define FKB_T 0x29 +#define FKB_Y 0x2A +#define FKB_U 0x2B +#define FKB_I 0x2C +#define FKB_O 0x2D +#define FKB_P 0x2E +#define FKB_LBRACKET 0x2F +#define FKB_RBRACKET 0x30 +#define FKB_RETURN 0x31 +#define FKB_DELETE 0x32 +#define FKB_END 0x33 +#define FKB_NEXT 0x34 +#define FKB_NUMPAD7 0x35 +#define FKB_NUMPAD8 0x36 +#define FKB_NUMPAD9 0x37 +#define FKB_ADD 0x38 +#define FKB_CAPITAL 0x39 +#define FKB_A 0x3A +#define FKB_S 0x3B +#define FKB_D 0x3C +#define FKB_F 0x3D +#define FKB_G 0x3E +#define FKB_H 0x3F +#define FKB_J 0x40 +#define FKB_K 0x41 +#define FKB_L 0x42 +#define FKB_SEMICOLON 0x43 +#define FKB_APOSTROPHE 0x44 +#define FKB_NUMPAD4 0x45 +#define FKB_NUMPAD5 0x46 +#define FKB_NUMPAD6 0x47 +#define FKB_LSHIFT 0x48 +#define FKB_Z 0x49 +#define FKB_X 0x4A +#define FKB_C 0x4B +#define FKB_V 0x4C +#define FKB_B 0x4D +#define FKB_N 0x4E +#define FKB_M 0x4F +#define FKB_COMMA 0x50 +#define FKB_PERIOD 0x51 +#define FKB_SLASH 0x52 +#define FKB_BACKSLASH 0x53 +#define FKB_UP 0x54 +#define FKB_NUMPAD1 0x55 +#define FKB_NUMPAD2 0x56 +#define FKB_NUMPAD3 0x57 +#define FKB_LCONTROL 0x58 +#define FKB_LMENU 0x59 +#define FKB_SPACE 0x5A +#define FKB_LEFT 0x5B +#define FKB_DOWN 0x5C +#define FKB_RIGHT 0x5D +#define FKB_NUMPAD0 0x5E +#define FKB_DECIMAL 0x5F + diff --git a/Mednafen/mednafen/nes/input/toprider.cpp b/Mednafen/mednafen/nes/input/toprider.cpp new file mode 100644 index 0000000000..8a385d861c --- /dev/null +++ b/Mednafen/mednafen/nes/input/toprider.cpp @@ -0,0 +1,79 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +static uint32 bs,bss; +static uint32 boop; + +static uint8 Read(int w, uint8 ret) +{ + if(w) + { + ret|=(bs&1)<<3; + ret|=(boop&1)<<4; + bs>>=1; + boop>>=1; +// puts("Read"); + } + return(ret); +} + +static void Write(uint8 V) +{ + // if(V&0x2) + bs=bss; + //printf("Write: %02x\n",V); +// boop=0xC0; +} + +static void Update(void *data) +{ + bss=*(uint8*)data; + bss|=bss<<8; + bss|=bss<<8; +} + +static void StateActionFC(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(bs), + SFVAR(bss), + SFVAR(boop), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPF", true); + + if(load) + { + + } +} + +static INPUTCFC TopRider={Read,Write,0,Update,0,0, StateActionFC }; + +INPUTCFC *MDFN_InitTopRider(void) +{ + + return(&TopRider); +} + diff --git a/Mednafen/mednafen/nes/input/zapper.cpp b/Mednafen/mednafen/nes/input/zapper.cpp new file mode 100644 index 0000000000..16d7984ac4 --- /dev/null +++ b/Mednafen/mednafen/nes/input/zapper.cpp @@ -0,0 +1,167 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "share.h" + +typedef struct { + uint32 mzx,mzy; + uint8 mzb; + int bogo; + uint64 zaphit; + uint8 zaplatch; +} ZAPPER; + +static ZAPPER ZD[2]; + +static void ZapperFrapper(int w, uint8 *bg, uint32 linets, int final) +{ + int xs,xe; + int zx,zy; + + xs=linets; + xe=final; + + if(xe > 256) + xe = 256; + + zx=ZD[w].mzx; + zy=ZD[w].mzy; + + if(scanline>=(zy-4) && scanline<=(zy+4)) + { + while(xs=(zx-4)) + { + a1 = bg[xs] & 0x3F; + sum = ActiveNESPalette[a1].r + ActiveNESPalette[a1].g + ActiveNESPalette[a1].b; + + if(sum>=100*3) + { + ZD[w].zaphit = timestampbase + timestamp; +// printf("Hit: %d %d %ld\n", scanline, timestamp, timestampbase + timestamp); + goto endo; + } + } + xs++; + } + } + endo:; +} + +static int CheckColor(int w) +{ + MDFNPPU_LineUpdate(); + + if((ZD[w].zaphit+100)>=(timestampbase+timestamp) && !(ZD[w].mzb&2)) + { + return(0); + } + return(1); +} + +static uint8 ReadZapperVS(int w) +{ + uint8 ret = ZD[w].zaplatch & 1; + + if(!fceuindbg) + ZD[w].zaplatch>>=1; + return ret; +} + +static void StrobeZapperVS(int w) +{ + ZD[w].zaplatch = (1 << 4) | (ZD[w].bogo ? 0x80 : 0x00) | (CheckColor(w) ? 0x00 : 0x40); +// printf("Strobe: %d %ld %02x\n", timestamp, timestampbase + timestamp, ZD[w].zaplatch); +} + +static uint8 ReadZapper(int w) +{ + uint8 ret=0; + + if(ZD[w].bogo) + ret|=0x10; + if(CheckColor(w)) + ret|=0x8; + return ret; +} + +static void DrawZapper(int w, uint8* pix, int pix_y) +{ + NESCURSOR_DrawGunSight(w, pix, pix_y, ZD[w].mzx, ZD[w].mzy); +} + +static void UpdateZapper(int w, void *data) +{ + uint8 *data_8 = (uint8 *)data; + uint32 new_x = (int16)MDFN_de16lsb(data_8 + 0); + uint32 new_y = (int16)MDFN_de16lsb(data_8 + 2); + uint8 new_b = *(uint8 *)(data_8 + 4); + + if(ZD[w].bogo) + ZD[w].bogo--; + + if((new_b&3) && (!(ZD[w].mzb&3))) + ZD[w].bogo=5; + + ZD[w].mzx = new_x; + ZD[w].mzy = new_y; + ZD[w].mzb = new_b; + + //printf("La: %08x %08x %08x\n", new_x, new_y, new_b); +} + +static void StateAction(int w, StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(ZD[w].mzx), + SFVAR(ZD[w].mzy), + SFVAR(ZD[w].mzb), + SFVAR(ZD[w].bogo), + SFVAR(ZD[w].zaphit), + SFVAR(ZD[w].zaplatch), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, w ? "INP1" : "INP0", true); + + if(load) + { + + } +} + +static INPUTC ZAPC={ReadZapper,0,0,UpdateZapper,ZapperFrapper,DrawZapper, StateAction }; +static INPUTC ZAPVSC={ReadZapperVS,0,StrobeZapperVS,UpdateZapper,ZapperFrapper,DrawZapper, StateAction }; + +INPUTC *MDFN_InitZapper(int w) +{ + memset(&ZD[w],0,sizeof(ZAPPER)); + + if(NESIsVSUni) + return(&ZAPVSC); + else + return(&ZAPC); +} + + diff --git a/Mednafen/mednafen/nes/nes.cpp b/Mednafen/mednafen/nes/nes.cpp new file mode 100644 index 0000000000..e1ea49e8c2 --- /dev/null +++ b/Mednafen/mednafen/nes/nes.cpp @@ -0,0 +1,817 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include + +#include "x6502.h" +#include "ppu/ppu.h" +#include "ppu/palette.h" +#include "sound.h" + +#include "cart.h" +#include "nsf.h" +#include "fds.h" +#include "ines.h" +#include "unif.h" +#include +#include "input.h" +#include "vsuni.h" +#include "debug.h" + +#include + +extern MDFNGI EmulatedNES; + +namespace MDFN_IEN_NES +{ +uint64 timestampbase; + +// Accessed in debug.cpp +NESGameType *GameInterface = NULL; + +static readfunc NonCheatARead[0x10000 + 0x100]; +readfunc ARead[0x10000 + 0x100]; +writefunc BWrite[0x10000 + 0x100]; + +bool NESIsVSUni; + +//static +DECLFW(BNull) +{ + //printf("Null Write: %04x %02x\n", A, V); +} + +//static +DECLFR(ANull) +{ + //printf("Null Read: %04x\n", A); + return(X.DB); +} + +readfunc GetReadHandler(int32 a) +{ + return ARead[a]; +} + +void SetReadHandler(int32 start, int32 end, readfunc func, bool snc) +{ + int32 x; + + //printf("%08x %08x %lld %d\n", start, end, func, snc); + + if(!func) + func=ANull; + + for(x=end;x>=start;x--) + { + ARead[x]=func; + if(snc) + NonCheatARead[x] = func; + } +} + +writefunc GetWriteHandler(int32 a) +{ + return BWrite[a]; +} + +void SetWriteHandler(int32 start, int32 end, writefunc func) +{ + int32 x; + + if(!func) + func=BNull; + + for(x=end;x>=start;x--) + BWrite[x]=func; +} + +uint8 RAM[0x800]; +uint8 PAL=0; + +static DECLFW(BRAML) +{ + RAM[A]=V; +} + +static DECLFW(BRAMH) +{ + RAM[A&0x7FF]=V; +} + +static DECLFR(ARAML) +{ + return RAM[A]; +} + +static DECLFR(ARAMH) +{ + return RAM[A&0x7FF]; +} + +// We need to look up the correct function in the ARead[] and BWrite[] tables +// for these overflow functions, because the RAM access handlers might be hooked +// for cheats or other things. + +static DECLFR(AOverflow) +{ + A &= 0xFFFF; + X.PC &= 0xFFFF; + return(ARead[A](A)); +} + +static DECLFW(BOverflow) +{ + A &= 0xFFFF; + return(BWrite[A](A, V)); +} + +static void Cleanup(void) +{ + for(std::vector::iterator ep = GameExpSound.begin(); ep != GameExpSound.end(); ep++) + { + if(ep->Kill) + ep->Kill(); + } + + GameExpSound.clear(); + + if(GameInterface) + { + if(GameInterface->Kill) + GameInterface->Kill(); + free(GameInterface); + GameInterface = NULL; + } + + Genie_Kill(); + MDFNSND_Close(); + MDFNPPU_Close(); +} + +static void CloseGame(void) +{ + if(GameInterface && GameInterface->SaveNV) + GameInterface->SaveNV(); + + Cleanup(); +} + +static void InitCommon(const char *fbase) +{ + NESIsVSUni = FALSE; + PPU_hook = 0; + GameHBIRQHook = 0; + + MapIRQHook = 0; + MMC5Hack = 0; + PAL &= 1; + + MDFNGameInfo->VideoSystem = VIDSYS_NONE; + + MDFNGameInfo->cspecial = NULL; + MDFNGameInfo->GameSetMD5Valid = FALSE; + + + if(MDFN_GetSettingB("nes.fnscan")) + { + if(strstr(fbase, "(U)") || strstr(fbase, "(USA)")) + MDFNGameInfo->VideoSystem = VIDSYS_NTSC; + else if(strstr(fbase, "(J)") || strstr(fbase, "(Japan)")) + MDFNGameInfo->VideoSystem = VIDSYS_NTSC; + else if(strstr(fbase, "(E)") || strstr(fbase, "(G)") || strstr(fbase, "(Europe)") || strstr(fbase, "(Germany)") ) + MDFNGameInfo->VideoSystem = VIDSYS_PAL; + } + + GameInterface = (NESGameType *)calloc(1, sizeof(NESGameType)); + + SetReadHandler(0x0000, 0xFFFF, ANull); + SetWriteHandler(0x0000, 0xFFFF, BNull); + + SetReadHandler(0x10000,0x10000 + 0xFF, AOverflow); + SetWriteHandler(0x10000,0x10000 + 0xFF, BOverflow); + + SetReadHandler(0,0x7FF,ARAML); + SetWriteHandler(0,0x7FF,BRAML); + + SetReadHandler(0x800,0x1FFF,ARAMH); /* Part of a little */ + SetWriteHandler(0x800,0x1FFF,BRAMH); /* hack for a small speed boost. */ + + MDFNMP_Init(1024, 65536 / 1024); + + + #ifdef WANT_DEBUGGER + NESDBG_Init(); + + ASpace_Add(NESDBG_GetAddressSpaceBytes, NESDBG_PutAddressSpaceBytes, "cpu", "CPU", 16); + ASpace_Add(NESPPU_GetAddressSpaceBytes, NESPPU_PutAddressSpaceBytes, "ppu", "PPU", 14); + ASpace_Add(NESPPU_GetAddressSpaceBytes, NESPPU_PutAddressSpaceBytes, "spram", "Sprite RAM", 8); + #endif +} + +void UNIFLoad(Stream *fp, NESGameType *); +void iNESLoad(Stream *fp, NESGameType *); +void FDSLoad(Stream *fp, NESGameType *); + +bool iNES_TestMagic(MDFNFILE *fp); +bool UNIF_TestMagic(MDFNFILE *fp); +bool FDS_TestMagic(MDFNFILE *fp); + +typedef void (*LoadFunction_t)(Stream *fp, NESGameType *); + +static LoadFunction_t GetLoadFunctionByMagic(MDFNFILE *fp) +{ + bool (*MagicFunctions[4])(MDFNFILE *fp) = { iNES_TestMagic, UNIF_TestMagic, NSF_TestMagic, FDS_TestMagic }; + LoadFunction_t LoadFunctions[4] = { iNESLoad, UNIFLoad, NSFLoad, FDSLoad }; + LoadFunction_t ret = NULL; + + for(int x = 0; x < 4; x++) + { + fp->rewind(); + if(MagicFunctions[x](fp)) + { + fp->rewind(); + ret = LoadFunctions[x]; + break; + } + } + return(ret); +} + +static bool TestMagic(MDFNFILE *fp) +{ + return(GetLoadFunctionByMagic(fp) != NULL); +} + +static void Load(MDFNFILE *fp) +{ + try + { + LoadFunction_t LoadFunction = NULL; + + LoadFunction = GetLoadFunctionByMagic(fp); + + // If the file type isn't recognized, return -1! + if(!LoadFunction) + throw MDFN_Error(0, _("File format is unknown to module \"%s\"."), MDFNGameInfo->shortname); + + InitCommon(fp->fbase); + + LoadFunction(fp->stream(), GameInterface); + + { + int w; + + if(MDFNGameInfo->VideoSystem == VIDSYS_NTSC) + w = 0; + else if(MDFNGameInfo->VideoSystem == VIDSYS_PAL) + w = 1; + else + { + w = MDFN_GetSettingB("nes.pal"); + MDFNGameInfo->VideoSystem = w ? VIDSYS_PAL : VIDSYS_NTSC; + } + PAL=w?1:0; + MDFNGameInfo->fps = PAL? 838977920 : 1008307711; + MDFNGameInfo->MasterClock = MDFN_MASTERCLOCK_FIXED(PAL ? PAL_CPU : NTSC_CPU); + } + + X6502_Init(); + MDFNPPU_Init(); + MDFNSND_Init(PAL); + NESINPUT_Init(); + + if(NESIsVSUni) + MDFN_VSUniInstallRWHooks(); + + if(MDFNGameInfo->GameType != GMT_PLAYER) + if(MDFN_GetSettingB("nes.gg")) + Genie_Init(); + + PowerNES(); + + MDFN_InitPalette(NESIsVSUni ? MDFN_VSUniGetPaletteNum() : (bool)PAL, NULL, 0); + + if(MDFNGameInfo->GameType != GMT_PLAYER) + MDFNGameInfo->CPInfoActiveBF = 1 << (NESIsVSUni ? MDFN_VSUniGetPaletteNum() : (bool)PAL); + else + MDFNGameInfo->CPInfoActiveBF = 0; + + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void Emulate(EmulateSpecStruct *espec) +{ + int ssize; + +#if 0 + static bool firstcat = true; + + MDFN_PixelFormat tmp_pf; + + tmp_pf.Rshift = 0; + tmp_pf.Gshift = 0; + tmp_pf.Bshift = 0; + tmp_pf.Ashift = 8; + + tmp_pf.Rprec = 6; + tmp_pf.Gprec = 6; + tmp_pf.Bprec = 6; + tmp_pf.Aprec = 0; + + tmp_pf.bpp = 8; + tmp_pf.colorspace = MDFN_COLORSPACE_RGB; + + espec->surface->SetFormat(tmp_pf, false); + espec->VideoFormatChanged = firstcat; + firstcat = false; +#endif + + + if(espec->VideoFormatChanged) + { + MDFN_InitPalette(NESIsVSUni ? MDFN_VSUniGetPaletteNum() : (bool)PAL, espec->CustomPalette, espec->CustomPaletteNumEntries); + MDFNNES_SetPixelFormat(espec->surface->format); + } + + if(espec->SoundFormatChanged) + MDFNNES_SetSoundRate(espec->SoundRate); + + NESPPU_GetDisplayRect(&espec->DisplayRect); + + MDFN_UpdateInput(); + + if(!Genie_BIOSInstalled()) + MDFNMP_ApplyPeriodicCheats(); + + MDFNPPU_Loop(espec); + + ssize = FlushEmulateSound(espec->NeedSoundReverse, espec->SoundBuf, espec->SoundBufMaxSize); + espec->NeedSoundReverse = 0; + + timestampbase += timestamp; + espec->MasterCycles = timestamp; + + timestamp = 0; + + if(MDFNGameInfo->GameType == GMT_PLAYER) + MDFNNES_DrawNSF(espec->surface, &espec->DisplayRect, espec->SoundBuf, ssize); + + espec->SoundBufSize = ssize; + + + if(MDFNGameInfo->GameType != GMT_PLAYER) + { + if(NESIsVSUni) + MDFN_VSUniDraw(espec->surface); + } +} + +void ResetNES(void) +{ + if(GameInterface->Reset) + GameInterface->Reset(); + MDFNSND_Reset(); + MDFNPPU_Reset(); + X6502_Reset(); +} + +void PowerNES(void) +{ + if(!MDFNGameInfo) + return; + + if(!Genie_BIOSInstalled()) + MDFNMP_RemoveReadPatches(); + + MDFNMP_AddRAM(0x0800, 0x0000, RAM); + + // Genie_Power() will remove any cheat read patches, and then install the BIOS(and its read hooks) + Genie_Power(); + + // http://wiki.nesdev.com/w/index.php/CPU_power_up_state + memset(RAM, 0xFF, 0x800); + RAM[0x008] = 0xF7; + RAM[0x009] = 0xEF; + RAM[0x00A] = 0xDF; + RAM[0x00F] = 0xBF; + + NESINPUT_Power(); + MDFNSND_Power(); + MDFNPPU_Power(); + + /* Have the external game hardware "powered" after the internal NES stuff. + Needed for the NSF code and VS System code. + */ + if(GameInterface->Power) + GameInterface->Power(); + + if(NESIsVSUni) + MDFN_VSUniPower(); + + timestampbase = 0; + X6502_Power(); + + if(!Genie_BIOSInstalled()) + MDFNMP_InstallReadPatches(); +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + Genie_StateAction(sm, load, data_only); + + X6502_StateAction(sm, load, data_only); + MDFNPPU_StateAction(sm, load, data_only); + MDFNSND_StateAction(sm, load, data_only); + NESINPUT_StateAction(sm, load, data_only); + + if(GameInterface->StateAction) + { + GameInterface->StateAction(sm, load, data_only); + } +} + +// TODO: Actual enum vals +static const MDFNSetting_EnumList NTSCPresetList[] = +{ + { "disabled", -1, gettext_noop("Disabled") }, + { "none", -1 }, // Old setting value + + { "composite", -1, gettext_noop("Composite Video") }, + { "svideo", -1, gettext_noop("S-Video") }, + { "rgb", -1, gettext_noop("RGB") }, + { "monochrome", -1, gettext_noop("Monochrome") }, + + { NULL, 0 }, +}; + +static MDFNSetting NESSettings[] = +{ + { "nes.nofs", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Disable four-score emulation."), NULL, MDFNST_BOOL, "0" }, + + { "nes.no8lim", MDFNSF_NOFLAGS, gettext_noop("Remove 8-sprites-per-scanline hardware limit."), + gettext_noop("WARNING: Enabling this option will cause graphical glitches in some games, including \"Solstice\"."), MDFNST_BOOL, "0", NULL, NULL, NULL, NESPPU_SettingChanged }, + + { "nes.soundq", MDFNSF_NOFLAGS, gettext_noop("Sound quality."), gettext_noop("Higher values correspond to better SNR and better preservation of higher frequencies(\"brightness\"), at the cost of increased computational complexity and a negligible(<0.5ms) increase in latency."), MDFNST_INT, "0", "-2", "3" }, + { "nes.sound_rate_error", MDFNSF_NOFLAGS, gettext_noop("Output rate tolerance."), gettext_noop("Lower values correspond to better matching of the output rate of the resampler to the actual desired output rate, at the expense of increased RAM usage and poorer CPU cache utilization. DO NOT INCREASE THIS VALUE, OR SOUND WILL LIKELY BE OFF-KEY AND THE WRONG TEMPO, AMONG OTHER PROBLEMS."), MDFNST_FLOAT, "0.00004", "0.0000001", "0.01" }, + { "nes.n106bs", MDFNSF_NOFLAGS, gettext_noop("Enable less-accurate, but better sounding, Namco 106(mapper 19) sound emulation."), NULL, MDFNST_BOOL, "0" }, + { "nes.fnscan", MDFNSF_EMU_STATE, gettext_noop("Scan filename for (U),(J),(E),etc. strings to en/dis-able PAL emulation."), + gettext_noop("Warning: This option may break NES network play when enabled IF the players are using ROM images with different filenames."), MDFNST_BOOL, "1" }, + + { "nes.pal", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable PAL(50Hz) NES emulation."), NULL, MDFNST_BOOL, "0" }, + { "nes.gg", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable Game Genie emulation."), NULL, MDFNST_BOOL, "0" }, + { "nes.ggrom", MDFNSF_EMU_STATE, gettext_noop("Path to Game Genie ROM image."), NULL, MDFNST_STRING, "gg.rom" }, + { "nes.clipsides", MDFNSF_NOFLAGS, gettext_noop("Clip left+right 8 pixel columns."), NULL, MDFNST_BOOL, "0" }, + { "nes.slstart", MDFNSF_NOFLAGS, gettext_noop("First displayed scanline in NTSC mode."), NULL, MDFNST_UINT, "8", "0", "239" }, + { "nes.slend", MDFNSF_NOFLAGS, gettext_noop("Last displayed scanline in NTSC mode."), NULL, MDFNST_UINT, "231", "0", "239" }, + { "nes.slstartp", MDFNSF_NOFLAGS, gettext_noop("First displayed scanline in PAL mode."), NULL, MDFNST_UINT, "0", "0", "239" }, + { "nes.slendp", MDFNSF_NOFLAGS, gettext_noop("Last displayed scanline in PAL mode."), NULL, MDFNST_UINT, "239", "0", "239" }, + + { "nes.correct_aspect", MDFNSF_CAT_VIDEO, gettext_noop("Correct the aspect ratio."), NULL, MDFNST_BOOL, "0" }, + { "nes.ntscblitter", MDFNSF_NOFLAGS, gettext_noop("Enable NTSC color generation and blitter."), + gettext_noop("NOTE: If your refresh rate isn't very close to 60.1Hz(+-0.1), you will need to set the nes.ntsc.mergefields setting to \"1\" to avoid excessive flickering."), MDFNST_BOOL, "0" }, + + + { "nes.ntsc.preset", MDFNSF_NOFLAGS, gettext_noop("Video quality/type preset."), NULL, MDFNST_ENUM, "none", NULL, NULL, NULL, NULL, NTSCPresetList }, + { "nes.ntsc.mergefields", MDFNSF_NOFLAGS, gettext_noop("Merge fields to partially work around !=60.1Hz refresh rates."), NULL, MDFNST_BOOL, "0" }, + { "nes.ntsc.saturation", MDFNSF_NOFLAGS, gettext_noop("NTSC composite blitter saturation."), NULL, MDFNST_FLOAT, "0", "-1", "1" }, + { "nes.ntsc.hue", MDFNSF_NOFLAGS, gettext_noop("NTSC composite blitter hue."), NULL, MDFNST_FLOAT, "0", "-1", "1" }, + { "nes.ntsc.sharpness", MDFNSF_NOFLAGS, gettext_noop("NTSC composite blitter sharpness."), NULL, MDFNST_FLOAT, "0", "-1", "1" }, + { "nes.ntsc.brightness", MDFNSF_NOFLAGS, gettext_noop("NTSC composite blitter brightness."), NULL, MDFNST_FLOAT, "0", "-1", "1" }, + { "nes.ntsc.contrast", MDFNSF_NOFLAGS, gettext_noop("NTSC composite blitter contrast."), NULL, MDFNST_FLOAT, "0", "-1", "1" }, + + { "nes.ntsc.matrix", MDFNSF_NOFLAGS, gettext_noop("Enable NTSC custom decoder matrix."), NULL, MDFNST_BOOL, "0" }, + + /* Default custom decoder matrix(not plain default matrix) is from Sony */ + { "nes.ntsc.matrix.0", MDFNSF_NOFLAGS, gettext_noop("NTSC custom decoder matrix element 0(red, value * V)."), NULL, MDFNST_FLOAT, "1.539", "-2.000", "2.000", NULL, NESPPU_SettingChanged }, + { "nes.ntsc.matrix.1", MDFNSF_NOFLAGS, gettext_noop("NTSC custom decoder matrix element 1(red, value * U)."), NULL, MDFNST_FLOAT, "-0.622", "-2.000", "2.000", NULL, NESPPU_SettingChanged }, + { "nes.ntsc.matrix.2", MDFNSF_NOFLAGS, gettext_noop("NTSC custom decoder matrix element 2(green, value * V)."), NULL, MDFNST_FLOAT, "-0.571", "-2.000", "2.000", NULL, NESPPU_SettingChanged }, + { "nes.ntsc.matrix.3", MDFNSF_NOFLAGS, gettext_noop("NTSC custom decoder matrix element 3(green, value * U)."), NULL, MDFNST_FLOAT, "-0.185", "-2.000", "2.000", NULL, NESPPU_SettingChanged }, + { "nes.ntsc.matrix.4", MDFNSF_NOFLAGS, gettext_noop("NTSC custom decoder matrix element 4(blue, value * V)."), NULL, MDFNST_FLOAT, "0.000", "-2.000", "2.000", NULL, NESPPU_SettingChanged }, + { "nes.ntsc.matrix.5", MDFNSF_NOFLAGS, gettext_noop("NTSC custom decoder matrix element 5(blue, value * U."), NULL, MDFNST_FLOAT, "2.000", "-2.000", "2.000", NULL, NESPPU_SettingChanged }, + { NULL } +}; + +static uint8 MemRead(uint32 addr) +{ + addr &= 0xFFFF; + + return(NonCheatARead[addr](addr)); +} + +static DECLFR(CheatReadFunc) +{ + std::vector::iterator chit; + //printf("%08x, %d\n", A, NonCheatARead[A]); + uint8 retval = NonCheatARead[A](A); + + for(chit = SubCheats[A & 0x7].begin(); chit != SubCheats[A & 0x7].end(); chit++) + { + if(A == chit->addr) + { + if(chit->compare == -1 || chit->compare == retval) + { + retval = chit->value; + break; + } + } + } + return(retval); +} + +static void InstallReadPatch(uint32 address, uint8 value, int compare) +{ + if(Genie_BIOSInstalled()) + return; + + address &= 0xFFFF; + + SetReadHandler(address, address, CheatReadFunc, 0); +} + +static void RemoveReadPatches(void) +{ + if(Genie_BIOSInstalled()) + return; + + for(uint32 A = 0; A <= 0xFFFF; A++) + { + SetReadHandler(A, A, NonCheatARead[A], 0); + } +} + + +static int GGtobin(char c) +{ + static char lets[16]={'A','P','Z','L','G','I','T','Y','E','O','X','U','K','S','V','N'}; + + for(int x = 0; x < 16; x++) + if(lets[x] == toupper(c)) + return(x); + + if(c & 0x80) + throw MDFN_Error(0, _("Invalid character in Game Genie code.")); + else + throw MDFN_Error(0, _("Invalid character in Game Genie code: %c"), c); +} + +static bool DecodeGG(const std::string& cheat_string, MemoryPatch* patch) +{ + uint16 A; + uint8 V,C; + uint8 t; + const unsigned s = cheat_string.size(); + const char *str = cheat_string.c_str(); + + if(s != 6 && s != 8) + throw(MDFN_Error(0, _("Game Genie code is of an incorrect length."))); + + A = 0x8000; + V = 0; + C = 0; + + t = GGtobin(*str++); + V |= (t&0x07); + V |= (t&0x08)<<4; + + t = GGtobin(*str++); + V |= (t&0x07)<<4; + A |= (t&0x08)<<4; + + t = GGtobin(*str++); + A |= (t&0x07)<<4; + //if(t&0x08) return(0); /* 8-character code?! */ + + t = GGtobin(*str++); + A |= (t&0x07)<<12; + A |= (t&0x08); + + t = GGtobin(*str++); + A |= (t&0x07); + A |= (t&0x08)<<8; + + if(s == 6) + { + t = GGtobin(*str++); + A |= (t&0x07)<<8; + V |= (t&0x08); + + patch->addr = A; + patch->val = V; + patch->compare = 0; + patch->type = 'S'; + patch->length = 1; + } + else + { + t = GGtobin(*str++); + A |= (t&0x07)<<8; + C |= (t&0x08); + + t = GGtobin(*str++); + C |= (t&0x07); + C |= (t&0x08)<<4; + + t = GGtobin(*str++); + C |= (t&0x07)<<4; + V |= (t&0x08); + + patch->addr = A; + patch->val = V; + patch->compare = C; + patch->type = 'C'; + patch->length = 1; + } + return(false); +} + + +static bool DecodePAR(const std::string& cheat_string, MemoryPatch* patch) +{ + int boo[4]; + + if(cheat_string.size() != 8) + throw MDFN_Error(0, _("Pro Action Replay code is of an incorrect length.")); + + if(trio_sscanf(cheat_string.c_str(), "%02x%02x%02x%02x", boo, boo + 1, boo + 2, boo + 3) != 4) + throw MDFN_Error(0, _("Malformed Pro Action Replay code.")); + + if(boo[0]) + { + patch->addr = (boo[3] << 8) | ((boo[2] + 0x7F) & 0xFF); + patch->val = boo[1]; + patch->compare = 0; + patch->type = 'S'; + } + else + { + patch->addr = ((boo[1] & 0x07) << 8) | (boo[2] << 0); + patch->val = boo[3]; + patch->compare = 0; + patch->type = 'R'; + } + + patch->length = 1; + + return(false); +} + +static bool DecodeRocky(const std::string& cheat_string, MemoryPatch* patch) +{ + if(cheat_string.size() != 8) + throw MDFN_Error(0, _("Pro Action Rocky code is of an incorrect length.")); + + uint32 ev = 0; + + for(unsigned i = 0; i < 8; i++) + { + int c = cheat_string[i]; + + ev <<= 4; + + if(c >= '0' && c <= '9') + ev |= c - '0'; + else if(c >= 'a' && c <= 'f') + ev |= c - 'a' + 0xA; + else if(c >= 'A' && c <= 'F') + ev |= c - 'A' + 0xA; + else + { + if(c & 0x80) + throw MDFN_Error(0, _("Invalid character in Pro Action Rocky code.")); + else + throw MDFN_Error(0, _("Invalid character in Pro Action Rocky code: %c"), c); + } + } + + uint32 accum = 0xfcbdd275; + uint32 result = 0; + + for(signed int b = 30; b >= 0; b--) + { + const unsigned tmp = (accum ^ ev) >> 31; + static const uint8 lut[31] = + { + 3, 13, 14, 1, 6, 9, 5, 0, 12, 7, 2, 8, 10, 11, 4, + 19, 21, 23, 22, 20, 17, 16, 18, + 29, 31, 24, 26, 25, 30, 27, 28 + }; + result |= tmp << lut[b]; + + if(tmp) + accum ^= 0xb8309722; + accum <<= 1; + ev <<= 1; + } + + patch->addr = (result & 0x7FFF) | 0x8000; + patch->val = (result >> 24) & 0xFF; + patch->compare = (result >> 16) & 0xFF; + patch->length = 1; + patch->type = 'C'; + + return(false); +} + + +static CheatFormatStruct CheatFormats[] = +{ + { "Game Genie", gettext_noop("Genies will eat your cheeses."), DecodeGG }, + { "Pro Action Replay (Incomplete)", gettext_noop("Prooooooooooooooooocom."), DecodePAR }, + { "Pro Action Rocky", gettext_noop("No pie."), DecodeRocky }, +}; + +static CheatFormatInfoStruct CheatFormatInfo = +{ + 3, + CheatFormats +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".nes", "iNES Format ROM Image" }, + { ".nez", "iNES Format ROM Image" }, // Odd naming variant + { ".fds", "Famicom Disk System Disk Image" }, + { ".nsf", "Nintendo Sound Format" }, + { ".nsfe", "Extended Nintendo Sound Format" }, + { ".unf", "UNIF Format ROM Image" }, // Sexy 8.3 variant + { ".unif", "UNIF Format ROM Image" }, + { NULL, NULL } +}; +} + +MDFNGI EmulatedNES = +{ + "nes", + "Nintendo Entertainment System/Famicom", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &NESDBGInfo, + #else + NULL, + #endif + NESPortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + MDFNNES_SetLayerEnableMask, + "Background\0Sprites\0", + NULL, + NULL, + + NES_CPInfo, + 0, + + InstallReadPatch, + RemoveReadPatches, + MemRead, + &CheatFormatInfo, + false, + StateAction, + Emulate, + NULL, + MDFNNES_SetInput, + FDS_SetMedia, + MDFNNES_DoSimpleCommand, + NESSettings, + 0, + 0, + FALSE, // Multires + + 0, // lcm_width (replaced in game load) + 0, // lcm_height (replaced in game load) + NULL, // Dummy + + 256, // Nominal width + 240, // Nominal height + 256, // Framebuffer width(altered if NTSC blitter is enabled) + 240, // Framebuffer height + + 1, // Number of output sound channels +}; diff --git a/Mednafen/mednafen/nes/nes.h b/Mednafen/mednafen/nes/nes.h new file mode 100644 index 0000000000..945dec88bc --- /dev/null +++ b/Mednafen/mednafen/nes/nes.h @@ -0,0 +1,68 @@ +#ifndef __MDFN_NES_NES_H +#define __MDFN_NES_NES_H + +#include +#include +#include +#include +#include +#include +#include + +namespace MDFN_IEN_NES +{ + +typedef void (MDFN_FASTCALL *writefunc)(uint32 A, uint8 V); +typedef uint8 (MDFN_FASTCALL *readfunc)(uint32 A); + +void ResetMapping(void); +void ResetNES(void); +void PowerNES(void); + +extern uint64 timestampbase; +extern uint32 MMC5HackVROMMask; +extern uint8 *MMC5HackExNTARAMPtr; +extern uint32 MMC5HackCHRBank; +extern int MMC5Hack; +extern uint8 *MMC5HackVROMPTR; +extern uint8 MMC5HackCHRMode; +extern uint8 MMC5HackSPMode; +extern uint8 MMC5HackSPScroll; +extern uint8 MMC5HackSPPage; + +extern readfunc ARead[0x10000 + 0x100]; +extern writefunc BWrite[0x10000 + 0x100]; + +extern int GameAttributes; +extern uint8 PAL; + +extern int fceuindbg; +void ResetGameLoaded(void); + +#define DECLFR(x) uint8 MDFN_FASTCALL x (uint32 A) +#define DECLFW(x) void MDFN_FASTCALL x (uint32 A, uint8 V) + +DECLFR(ANull); +DECLFW(BNull); + +void SetReadHandler(int32 start, int32 end, readfunc func, bool snc = 1); +void SetWriteHandler(int32 start, int32 end, writefunc func); +writefunc GetWriteHandler(int32 a); +readfunc GetReadHandler(int32 a); + +typedef struct +{ + void (*Power)(void); + void (*Reset)(void); + void (*SaveNV)(void); + void (*Kill)(void); + void (*StateAction)(StateMem *sm, const unsigned load, const bool data_only); +} NESGameType; + + +extern bool NESIsVSUni; +} + +using namespace MDFN_IEN_NES; + +#endif diff --git a/Mednafen/mednafen/nes/nsf.cpp b/Mednafen/mednafen/nes/nsf.cpp new file mode 100644 index 0000000000..07e000ca6b --- /dev/null +++ b/Mednafen/mednafen/nes/nsf.cpp @@ -0,0 +1,569 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include +#include "x6502.h" +#include "sound.h" +#include "nsf.h" +#include "nsfe.h" +#include "fds.h" +#include "fds-sound.h" +#include "cart.h" +#include "input.h" +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +int NSFVRC6_Init(EXPSOUND *, bool MultiChip); +int NSFMMC5_Init(EXPSOUND *, bool MultiChip); +int NSFAY_Init(EXPSOUND *, bool MultiChip); +int NSFN106_Init(EXPSOUND *, bool MultiChip); +int NSFVRC7_Init(EXPSOUND *, bool MultiChip); + +namespace MDFN_IEN_NES +{ + +int NSFFDS_Init(EXPSOUND *, bool MultiChip); + +static DECLFW(NSF_write); +static DECLFR(NSF_read); +static void NSF_init(void); + +static NSFINFO *NSFInfo; +typedef std::vector NSFWriteEntry; +static NSFWriteEntry *WriteHandlers = NULL; //[0x10000]; + +static uint8 NSFROM[0x30+6]= +{ +/* 0x00 - NMI */ +0x8D,0xF4,0x3F, /* Stop play routine NMIs. */ +0xA2,0xFF,0x9A, /* Initialize the stack pointer. */ +0xAD,0xF0,0x3F, /* See if we need to init. */ +0xF0,0x09, /* If 0, go to play routine playing. */ + +0xAD,0xF1,0x3F, /* Confirm and load A */ +0xAE,0xF3,0x3F, /* Load X with PAL/NTSC byte */ + +0x20,0x00,0x00, /* JSR to init routine */ + +0xA9,0x00, +0xAA, +0xA8, +0x20,0x00,0x00, /* JSR to play routine */ +0x8D,0xF5,0x3F, /* Start play routine NMIs. */ +0x90,0xFE, /* Loopie time. */ + +/* 0x20 */ +0x8D,0xF3,0x3F, /* Init init NMIs */ +0x18, +0x90,0xFE /* Loopie time. */ +}; + +static DECLFR(NSFROMRead) +{ + return (NSFROM-0x3800)[A]; +} + +static uint8 BSon; + +static uint8 SongReload; +static bool doreset = false; +static int NSFNMIFlags; +static uint8 *ExWRAM = NULL; + +static void FreeNSF(void) +{ + if(NSFInfo) + { + delete NSFInfo; + NSFInfo = NULL; + } + + if(ExWRAM) + { + free(ExWRAM); + ExWRAM = NULL; + } + + if(WriteHandlers) + { + delete[] WriteHandlers; + WriteHandlers = NULL; + } +} + +static void NSF_Kill(void) +{ + FreeNSF(); +} + +static void NSF_Reset(void) +{ + NSF_init(); +} + +static void NSF_Power(void) +{ + NSF_init(); +} + +static void NSF_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(SongReload), + SFVAR(doreset), + SFVAR(NSFNMIFlags), + SFARRAY(ExWRAM, ((NSFInfo->SoundChip&4) ? (32768+8192) : 8192)), + + SFVAR(NSFInfo->CurrentSong), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "NSF"); + + if(load) + { + NSFInfo->CurrentSong %= NSFInfo->TotalSongs; + } +} + + +// First 32KB is reserved for sound chip emulation in the iNES mapper code. + +static INLINE void BANKSET(uint32 A, uint32 bank) +{ + bank &= NSFInfo->NSFMaxBank; + if(NSFInfo->SoundChip&4) + memcpy(ExWRAM+(A-0x6000),NSFInfo->NSFDATA+(bank<<12),4096); + else + setprg4(A,bank); +} + +static void LoadNSF(Stream *fp) +{ + NSF_HEADER NSFHeader; + + fp->read(&NSFHeader, 0x80); + + // NULL-terminate strings just in case. + NSFHeader.GameName[31] = NSFHeader.Artist[31] = NSFHeader.Copyright[31] = 0; + + NSFInfo->GameName = std::string(MDFN_RemoveControlChars((char *)NSFHeader.GameName)); + NSFInfo->Artist = std::string(MDFN_RemoveControlChars((char *)NSFHeader.Artist)); + NSFInfo->Copyright = std::string(MDFN_RemoveControlChars((char *)NSFHeader.Copyright)); + + MDFN_trim(NSFInfo->GameName); + MDFN_trim(NSFInfo->Artist); + MDFN_trim(NSFInfo->Copyright); + + NSFInfo->LoadAddr = NSFHeader.LoadAddressLow | (NSFHeader.LoadAddressHigh << 8); + NSFInfo->InitAddr = NSFHeader.InitAddressLow | (NSFHeader.InitAddressHigh << 8); + NSFInfo->PlayAddr = NSFHeader.PlayAddressLow | (NSFHeader.PlayAddressHigh << 8); + + uint64 tmp_size = fp->size() - 0x80; + if(tmp_size > 16 * 1024 * 1024) + throw MDFN_Error(0, _("NSF is too large.")); + + NSFInfo->NSFSize = tmp_size; + + NSFInfo->NSFMaxBank = ((NSFInfo->NSFSize+(NSFInfo->LoadAddr&0xfff)+4095)/4096); + NSFInfo->NSFMaxBank = round_up_pow2(NSFInfo->NSFMaxBank); + + NSFInfo->NSFDATA=(uint8 *)MDFN_malloc_T(NSFInfo->NSFMaxBank*4096, _("NSF data")); + + memset(NSFInfo->NSFDATA, 0x00, NSFInfo->NSFMaxBank*4096); + fp->read(NSFInfo->NSFDATA+(NSFInfo->LoadAddr&0xfff), NSFInfo->NSFSize); + + NSFInfo->NSFMaxBank--; + + NSFInfo->VideoSystem = NSFHeader.VideoSystem; + NSFInfo->SoundChip = NSFHeader.SoundChip; + NSFInfo->TotalSongs = NSFHeader.TotalSongs; + + if(NSFHeader.StartingSong == 0) + NSFHeader.StartingSong = 1; + + NSFInfo->StartingSong = NSFHeader.StartingSong - 1; + memcpy(NSFInfo->BankSwitch, NSFHeader.BankSwitch, 8); +} + + +bool NSF_TestMagic(MDFNFILE *fp) +{ + uint8 magic[5]; + + if(fp->read(magic, 5, false) != 5 || (memcmp(magic, "NESM\x1a", 5) && memcmp(magic, "NSFE", 4))) + return false; + + return true; +} + +void NSFLoad(Stream *fp, NESGameType *gt) +{ + try + { + char magic[5]; + int x; + + NSFInfo = new NSFINFO(); + + fp->rewind(); + fp->read(magic, 5); + + if(!memcmp(magic, "NESM\x1a", 5)) + { + fp->rewind(); + LoadNSF(fp); + } + else if(!memcmp(magic, "NSFE", 4)) + { + fp->rewind(); + LoadNSFE(NSFInfo, fp, 0); + } + + if(NSFInfo->LoadAddr < 0x6000) + throw MDFN_Error(0, _("Load address is invalid!")); + + if(NSFInfo->TotalSongs < 1) + throw MDFN_Error(0, _("Total number of songs is less than 1!")); + + BSon = 0; + for(x=0;x<8;x++) + BSon |= NSFInfo->BankSwitch[x]; + + MDFNGameInfo->GameType = GMT_PLAYER; + + if(NSFInfo->GameName.size()) + MDFNGameInfo->name = strdup(NSFInfo->GameName.c_str()); + + for(x=0;;x++) + { + if(NSFROM[x]==0x20) + { + NSFROM[x+1]=NSFInfo->InitAddr&0xFF; + NSFROM[x+2]=NSFInfo->InitAddr>>8; + NSFROM[x+8]=NSFInfo->PlayAddr&0xFF; + NSFROM[x+9]=NSFInfo->PlayAddr>>8; + break; + } + } + + if(NSFInfo->VideoSystem == 0) + MDFNGameInfo->VideoSystem = VIDSYS_NTSC; + else if(NSFInfo->VideoSystem == 1) + MDFNGameInfo->VideoSystem = VIDSYS_PAL; + + MDFN_printf(_("NSF Loaded. File information:\n\n")); + MDFN_indent(1); + if(NSFInfo->GameName.size()) + MDFN_printf(_("Game/Album Name:\t%s\n"), NSFInfo->GameName.c_str()); + if(NSFInfo->Artist.size()) + MDFN_printf(_("Music Artist:\t%s\n"), NSFInfo->Artist.c_str()); + if(NSFInfo->Copyright.size()) + MDFN_printf(_("Copyright:\t\t%s\n"), NSFInfo->Copyright.c_str()); + if(NSFInfo->Ripper.size()) + MDFN_printf(_("Ripper:\t\t%s\n"), NSFInfo->Ripper.c_str()); + + if(NSFInfo->SoundChip) + { + static const char *tab[6]={"Konami VRCVI","Konami VRCVII","Nintendo FDS","Nintendo MMC5","Namco 106","Sunsoft FME-07"}; + + for(x=0;x<6;x++) + if(NSFInfo->SoundChip&(1<SoundChip=1<LoadAddr,NSFInfo->InitAddr,NSFInfo->PlayAddr); + MDFN_printf("%s\n",(NSFInfo->VideoSystem&1)?"PAL":"NTSC"); + MDFN_printf(_("Starting song: %d / %d\n\n"),NSFInfo->StartingSong + 1,NSFInfo->TotalSongs); + + if(NSFInfo->SoundChip&4) + ExWRAM=(uint8 *)MDFN_malloc_T(32768+8192, _("NSF expansion RAM")); + else + ExWRAM=(uint8 *)MDFN_malloc_T(8192, _("NSF expansion RAM")); + + MDFN_indent(-1); + + gt->Power = NSF_Power; + gt->Reset = NSF_Reset; + gt->SaveNV = NULL; + gt->Kill = NSF_Kill; + gt->StateAction = NSF_StateAction; + + Player_Init(NSFInfo->TotalSongs, NSFInfo->GameName, NSFInfo->Artist, NSFInfo->Copyright, NSFInfo->SongNames); + } + catch(...) + { + FreeNSF(); + throw; + } +} + +static DECLFR(NSFVectorRead) +{ + if(((NSFNMIFlags&1) && SongReload) || (NSFNMIFlags&2) || doreset) + { + if(A==0xFFFA) return(0x00); + else if(A==0xFFFB) return(0x38); + else if(A==0xFFFC) return(0x20); + else if(A==0xFFFD) { doreset = false; return(0x38); } + return(X.DB); + } + else + return(CartBR(A)); +} + +void NSFECSetWriteHandler(int32 start, int32 end, writefunc func) +{ + int32 x; + + if(!func) return; + + for(x=end;x>=start;x--) + WriteHandlers[x].push_back(func); +} + +static DECLFW(NSFECWriteHandler) +{ + for(unsigned int x = 0; x < WriteHandlers[A].size(); x++) + WriteHandlers[A][x](A, V); + +} + +static void NSF_init(void) +{ + doreset = true; + + WriteHandlers = new NSFWriteEntry[0x10000]; + + ResetCartMapping(); + + SetWriteHandler(0x2000, 0x3FFF, NSFECWriteHandler); + SetWriteHandler(0x4020, 0xFFFF, NSFECWriteHandler); + + if(NSFInfo->SoundChip&4) + { + SetupCartPRGMapping(0,ExWRAM,32768+8192,1); + setprg32(0x6000,0); + setprg8(0xE000,4); + memset(ExWRAM,0x00,32768+8192); + NSFECSetWriteHandler(0x6000,0xDFFF,CartBW); + SetReadHandler(0x6000,0xFFFF,CartBR); + } + else + { + memset(ExWRAM,0x00,8192); + SetReadHandler(0x6000,0x7FFF,CartBR); + NSFECSetWriteHandler(0x6000,0x7FFF,CartBW); + SetupCartPRGMapping(0,NSFInfo->NSFDATA,((NSFInfo->NSFMaxBank+1)*4096),0); + SetupCartPRGMapping(1,ExWRAM,8192,1); + setprg8r(1,0x6000,0); + SetReadHandler(0x8000,0xFFFF,CartBR); + } + + if(BSon) + { + int32 x; + for(x=0;x<8;x++) + { + if(NSFInfo->SoundChip&4 && x>=6) + BANKSET(0x6000+(x-6)*4096,NSFInfo->BankSwitch[x]); + BANKSET(0x8000+x*4096,NSFInfo->BankSwitch[x]); + } + } + else + { + int32 x; + for(x=(NSFInfo->LoadAddr&0xF000);x<0x10000;x+=0x1000) + BANKSET(x,((x-(NSFInfo->LoadAddr&0xf000))>>12)); + } + + SetReadHandler(0xFFFA,0xFFFD,NSFVectorRead); + + NSFECSetWriteHandler(0x2000,0x3fff,0); + SetReadHandler(0x2000,0x37ff,0); + SetReadHandler(0x3836,0x3FFF,0); + SetReadHandler(0x3800,0x3835,NSFROMRead); + + NSFECSetWriteHandler(0x5ff6,0x5fff,NSF_write); + + NSFECSetWriteHandler(0x3ff0,0x3fff,NSF_write); + SetReadHandler(0x3ff0,0x3fff,NSF_read); + + int (*InitPointers[8])(EXPSOUND *, bool MultiChip) = { NSFVRC6_Init, NSFVRC7_Init, NSFFDS_Init, NSFMMC5_Init, NSFN106_Init, NSFAY_Init, NULL, NULL }; + + for(int x = 0; x < 8; x++) + if((NSFInfo->SoundChip & (1U << x)) && InitPointers[x]) + { + EXPSOUND TmpExpSound; + memset(&TmpExpSound, 0, sizeof(TmpExpSound)); + + InitPointers[x](&TmpExpSound, NSFInfo->SoundChip != (1U << x)); + GameExpSound.push_back(TmpExpSound); + } + + NSFInfo->CurrentSong=NSFInfo->StartingSong; + SongReload=0xFF; + NSFNMIFlags=0; +} + +static DECLFW(NSF_write) +{ + switch(A) + { + case 0x3FF3:NSFNMIFlags|=1;break; + case 0x3FF4:NSFNMIFlags&=~2;break; + case 0x3FF5:NSFNMIFlags|=2;break; + + case 0x5FF6: + case 0x5FF7:if(!(NSFInfo->SoundChip&4)) return; + case 0x5FF8: + case 0x5FF9: + case 0x5FFA: + case 0x5FFB: + case 0x5FFC: + case 0x5FFD: + case 0x5FFE: + case 0x5FFF:if(!BSon) return; + A&=0xF; + BANKSET((A*4096),V); + break; + } +} + +static DECLFR(NSF_read) +{ + int x; + + switch(A) + { + case 0x3ff0:x=SongReload; + if(!fceuindbg) + SongReload=0; + return x; + case 0x3ff1: + if(!fceuindbg) + { + for(int i = 0; i < 0x800; i++) + BWrite[i](i, 0x00); + + BWrite[0x4015](0x4015,0x0); + for(x=0;x<0x14;x++) + BWrite[0x4000+x](0x4000+x,0); + BWrite[0x4015](0x4015,0xF); + + if(NSFInfo->SoundChip & 4) + { + FDSSound_Power(); + BWrite[0x4017](0x4017,0xC0); /* FDS BIOS writes $C0 */ + BWrite[0x4089](0x4089,0x80); + BWrite[0x408A](0x408A,0xE8); + } + else + { + memset(ExWRAM,0x00,8192); + BWrite[0x4017](0x4017,0xC0); + BWrite[0x4017](0x4017,0xC0); + BWrite[0x4017](0x4017,0x40); + } + + if(BSon) + { + for(x=0;x<8;x++) + BANKSET(0x8000+x*4096,NSFInfo->BankSwitch[x]); + } + return (NSFInfo->CurrentSong); + } + case 0x3FF3:return PAL; + } + return 0; +} + +uint8 MDFN_GetJoyJoy(void); + +void DoNSFFrame(void) +{ + if(((NSFNMIFlags&1) && SongReload) || (NSFNMIFlags&2)) + TriggerNMI(); + + { + static uint8 last=0; + uint8 tmp; + tmp=MDFN_GetJoyJoy(); + if((tmp&JOY_RIGHT) && !(last&JOY_RIGHT)) + { + if(NSFInfo->CurrentSong < (NSFInfo->TotalSongs - 1)) + { + NSFInfo->CurrentSong++; + SongReload = 0xFF; + } + } + else if((tmp&JOY_LEFT) && !(last&JOY_LEFT)) + { + if(NSFInfo->CurrentSong > 0) + { + NSFInfo->CurrentSong--; + SongReload = 0xFF; + } + } + else if((tmp&JOY_UP) && !(last&JOY_UP)) + { + unsigned ns = NSFInfo->CurrentSong + std::min(NSFInfo->TotalSongs - 1 - NSFInfo->CurrentSong, 10); + + if(NSFInfo->CurrentSong != ns) + { + NSFInfo->CurrentSong = ns; + SongReload = 0xFF; + } + } + else if((tmp&JOY_DOWN) && !(last&JOY_DOWN)) + { + unsigned ns = NSFInfo->CurrentSong - std::min(NSFInfo->CurrentSong, 10); + + if(NSFInfo->CurrentSong != ns) + { + NSFInfo->CurrentSong = ns; + SongReload = 0xFF; + } + } + else if((tmp&JOY_START) && !(last&JOY_START)) + SongReload = 0xFF; + else if((tmp&JOY_A) && !(last&JOY_A)) + { + + } + last=tmp; + } +} + +void MDFNNES_DrawNSF(MDFN_Surface *surface, MDFN_Rect *DisplayRect, int16 *samples, int32 scount) +{ + Player_Draw(surface, DisplayRect, NSFInfo->CurrentSong, samples, scount); +} + +} diff --git a/Mednafen/mednafen/nes/nsf.h b/Mednafen/mednafen/nes/nsf.h new file mode 100644 index 0000000000..78b5d60969 --- /dev/null +++ b/Mednafen/mednafen/nes/nsf.h @@ -0,0 +1,63 @@ +#ifndef __MDFN_NES_NSF_H +#define __MDFN_NES_NSF_H + +class MDFNFILE; + +namespace MDFN_IEN_NES +{ + +struct NSFINFO +{ + std::string GameName, Artist, Copyright, Ripper; + std::vector SongNames; + + unsigned TotalSongs = 0; + unsigned StartingSong = 0; + unsigned CurrentSong = 0; + unsigned TotalChannels = 0 ; + unsigned VideoSystem = 0; + + uint16 PlayAddr = 0,InitAddr = 0, LoadAddr = 0; + uint8 BankSwitch[8] = { 0 }; + unsigned SoundChip = 0; + + uint8 *NSFDATA = NULL; + unsigned NSFMaxBank = 0; + unsigned NSFSize = 0; +}; + +typedef struct { + char ID[5]; /*NESM^Z*/ + uint8 Version; + uint8 TotalSongs; + uint8 StartingSong; + uint8 LoadAddressLow; + uint8 LoadAddressHigh; + uint8 InitAddressLow; + uint8 InitAddressHigh; + uint8 PlayAddressLow; + uint8 PlayAddressHigh; + uint8 GameName[32]; + uint8 Artist[32]; + uint8 Copyright[32]; + uint8 NTSCspeed[2]; // Unused + uint8 BankSwitch[8]; + uint8 PALspeed[2]; // Unused + uint8 VideoSystem; + uint8 SoundChip; + uint8 Expansion[4]; + uint8 reserve[8]; +} NSF_HEADER; + +void NSFLoad(Stream *fp, NESGameType *gt); +bool NSF_TestMagic(MDFNFILE *fp); + +void DoNSFFrame(void); +void MDFNNES_DrawNSF(MDFN_Surface *surface, MDFN_Rect *DisplayRect, int16 *samples, int32 scount); + +// NSF Expansion Chip Set Write Handler +void NSFECSetWriteHandler(int32 start, int32 end, writefunc func); + +} + +#endif diff --git a/Mednafen/mednafen/nes/nsfe.cpp b/Mednafen/mednafen/nes/nsfe.cpp new file mode 100644 index 0000000000..0529391550 --- /dev/null +++ b/Mednafen/mednafen/nes/nsfe.cpp @@ -0,0 +1,179 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include +#include "x6502.h" +#include "sound.h" +#include "cart.h" +#include "nsf.h" +#include "nsfe.h" + +namespace MDFN_IEN_NES +{ + +static void GetString(Stream* fp, uint32* chunk_size, std::string* str) +{ + str->clear(); + + while(*chunk_size) + { + uint8 c; + + fp->read(&c, 1); + + (*chunk_size)--; + + if(!c) + break; + + if(c < 0x20) + c = 0x20; + + str->push_back(c); + } +} + +void LoadNSFE(NSFINFO *nfe, Stream* fp, int info_only) +{ + uint8 magic[4]; + + fp->read(magic, 4); + + for(;;) + { + uint8 subhead[8]; + uint32 chunk_size; + + fp->read(subhead, 8); + chunk_size = MDFN_de32lsb(&subhead[0]); + + if(chunk_size > 64 * 1024 * 1024) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" size(%u) is invalid."), (char*)&subhead[4], chunk_size); + + //printf("\nChunk: %.4s %d\n", &subhead[4], chunk_size); + if(!memcmp(&subhead[4], "INFO", 4)) + { + if(nfe->TotalSongs) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" is duplicate."), (char*)&subhead[4]); + + if(chunk_size < 8) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" size(%u) is invalid."), (char*)&subhead[4], chunk_size); + + nfe->LoadAddr = fp->get_LE(); + nfe->InitAddr = fp->get_LE(); + nfe->PlayAddr = fp->get_LE(); + nfe->VideoSystem = fp->get_u8(); + nfe->SoundChip = fp->get_u8(); + + chunk_size -= 8; + + if(chunk_size) + { + nfe->TotalSongs = fp->get_u8(); + if(!nfe->TotalSongs) + nfe->TotalSongs = 256; + chunk_size--; + } + else + nfe->TotalSongs = 1; + + if(chunk_size) + { + nfe->StartingSong = fp->get_u8(); + chunk_size--; + } + else + nfe->StartingSong = 0; + + nfe->SongNames.resize(nfe->TotalSongs); + } + else if(!memcmp(&subhead[4], "DATA", 4)) + { + if(!nfe->TotalSongs) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" is out of order."), (char*)&subhead[4]); + + if(nfe->NSFDATA) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" is duplicate."), (char*)&subhead[4]); + + nfe->NSFSize = chunk_size; + nfe->NSFMaxBank = round_up_pow2((nfe->NSFSize + (nfe->LoadAddr & 0xfff) + 0xfff) / 0x1000) - 1; + if(!info_only) + { + nfe->NSFDATA = (uint8 *)MDFN_malloc_T((nfe->NSFMaxBank + 1) * 4096, _("NSF Data")); + memset(nfe->NSFDATA, 0, (nfe->NSFMaxBank + 1) * 4096); + fp->read(nfe->NSFDATA + (nfe->LoadAddr & 0xfff), nfe->NSFSize); + chunk_size -= nfe->NSFSize; + } + } + else if(!memcmp(&subhead[4], "BANK", 4)) + { + uint64 tr = std::min(chunk_size, 8); + + fp->read(nfe->BankSwitch, tr); + chunk_size -= 8; + } + else if(!memcmp(&subhead[4], "NEND", 4)) + { + if(chunk_size != 0) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" size(%u) is invalid."), (char*)&subhead[4], chunk_size); + else if(!nfe->NSFDATA) + throw MDFN_Error(0, _("NEND reached without preceding DATA chunk.")); + else + return; + } + else if(!memcmp(&subhead[4], "tlbl", 4)) + { + if(!nfe->TotalSongs) + throw MDFN_Error(0, _("NSFE chunk \"%.4s\" is out of order."), (char*)&subhead[4]); + + for(unsigned ws = 0; ws < nfe->TotalSongs && chunk_size > 0; ws++) + { + GetString(fp, &chunk_size, &nfe->SongNames[ws]); + } + } + else if(!memcmp(&subhead[4], "auth", 4)) + { + for(unsigned which = 0; which < 4 && chunk_size > 0; which++) + { + switch(which) + { + case 0: GetString(fp, &chunk_size, &nfe->GameName); break; + case 1: GetString(fp, &chunk_size, &nfe->Artist); break; + case 2: GetString(fp, &chunk_size, &nfe->Copyright); break; + case 3: GetString(fp, &chunk_size, &nfe->Ripper); break; + } + } + } + else if(subhead[4] >= 'A' && subhead[4] <= 'Z') /* Unrecognized mandatory chunk */ + { + throw MDFN_Error(0, _("NSFE unrecognized mandatory chunk \"%.4s\"."), (char*)&subhead[4]); + } + else + { + //printf("Skip chunk: %.4s\n", (char*)&subhead[4]); + } + + if(chunk_size) + { + fp->seek(chunk_size, SEEK_CUR); + chunk_size = 0; + } + } +} + +} diff --git a/Mednafen/mednafen/nes/nsfe.h b/Mednafen/mednafen/nes/nsfe.h new file mode 100644 index 0000000000..6548ed7bb7 --- /dev/null +++ b/Mednafen/mednafen/nes/nsfe.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_NES_NSFE_H +#define __MDFN_NES_NSFE_H + +namespace MDFN_IEN_NES +{ + void LoadNSFE(NSFINFO *nfe, Stream* fp, int info_only); +} + +#endif diff --git a/Mednafen/mednafen/nes/ntsc/LGPL.txt b/Mednafen/mednafen/nes/ntsc/LGPL.txt new file mode 100644 index 0000000000..b1e3f5a263 --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/LGPL.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/Mednafen/mednafen/nes/ntsc/benchmark.c b/Mednafen/mednafen/nes/ntsc/benchmark.c new file mode 100644 index 0000000000..4a57315d3e --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/benchmark.c @@ -0,0 +1,87 @@ + +/* Measures performance of blitter, useful for improving a custom blitter. +NOTE: This assumes that the process is getting 100% CPU time; you might need to +arrange for this or else the performance will be reported lower than it really is. */ + +#include "nes_ntsc.h" + +#include +#include +#include + +enum { in_width = 256 }; +enum { in_height = 240 }; + +enum { out_width = NES_NTSC_OUT_WIDTH( in_width ) }; +enum { out_height = in_height }; + +struct data_t +{ + nes_ntsc_t ntsc; + unsigned char in [ in_height] [ in_width]; + unsigned short out [out_height] [out_width]; +}; + +static int time_blitter( void ); + +int main() +{ + struct data_t* data = (struct data_t*) malloc( sizeof *data ); + if ( data ) + { + /* fill with random pixel data */ + int y; + for ( y = 0; y < in_height; y++ ) + { + int x; + for ( x = 0; x < in_width; x++ ) + data->in [y] [x] = rand() >> 4 & 0x1F; + } + + printf( "Timing nes_ntsc...\n" ); + fflush( stdout ); + + nes_ntsc_init( &data->ntsc, 0 ); + + /* measure frame rate */ + while ( time_blitter() ) + { + nes_ntsc_blit( &data->ntsc, data->in [0], in_width, 0, + in_width, in_height, data->out [0], sizeof data->out [0] ); + } + + free( data ); + } + + return 0; +} + +static int time_blitter( void ) +{ + int const duration = 4; /* seconds */ + static clock_t end_time; + static int count; + if ( !count ) + { + clock_t time = clock(); + while ( clock() == time ) { } + if ( clock() - time > CLOCKS_PER_SEC ) + { + /* clock increments less-often than once every second */ + printf( "Insufficient time resolution\n" ); + return 0; + } + end_time = clock() + CLOCKS_PER_SEC * duration; + } + else if ( clock() >= end_time ) + { + int rate = count / duration; + printf( "Performance: %d frames per second, which would use %d%% CPU at 60 FPS\n", + rate, 60 * 100 / rate ); + return 0; + } + count++; + + return 1; +} + diff --git a/Mednafen/mednafen/nes/ntsc/changes.txt b/Mednafen/mednafen/nes/ntsc/changes.txt new file mode 100644 index 0000000000..e30bd64a87 --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/changes.txt @@ -0,0 +1,91 @@ +nes_ntsc Change Log +------------------- + +nes_ntsc 0.2.0 +-------------- +- Significantly improved NTSC signal processing to give clearer image and +better sharpness control + +- Added parameters for gamma, resolution, color bleed, artifacts, and color +fringing + +- Added presets for composite video, S-video, RGB, and monochrome + +- Added NES_NTSC_OUT_WIDTH() and NES_NTSC_IN_WIDTH() for calculating +input/output widths + +- Improved default blitter to support emphasis and allow specification of RGB +output bit depth + +- Improved demo with more controls and interpolation and darkening of scanlines +rather than duplicating them + +- Improved documentation + +- Interface changes: nes_ntsc_blit() now takes *input* size rather than output +size. NES_NTSC_BEGIN_ROW now takes two additional pixels. + +- Deprecated: nes_ntsc_x_in/out_width, NES_NTSC_RGBnn_OUT, and NES_NTSC_RAW_OUT + + +nes_ntsc 0.1.7 +-------------- +- Fixed color emphasis to affect xD colors instead of incorrectly leaving them +as always gray + +- Added ability to generate a 64- or 512-color RGB palette for use when full +NTSC emulation isn't desired + +- Documented more accurate burst_phase handling and included three test ROMs +for verifying proper implementation + +- Moved color emphasis support to new nes_ntsc_emph_t structure, eliminating +the ugly global NES_NTSC_DISABLE_EMPHASIS configuration macro + +- Extended demo to use optional Sony decoder matrix and write standard 192-byte +NES .PAL file using current settings + +- Improved documentation slightly + +- Lowered maximum saturation to avoid overflow of blue when blue color emphasis +is enabled + + +nes_ntsc 0.1.6 +-------------- +- Cleaned up hue, decoder matrix, and hue warping to do transformations in the +proper order and direction + + +nes_ntsc 0.1.5 +-------------- +- Added support for color emphasis/tint bits (can be turned off to reduce +memory usage) + +- Added ability to specify optional decoder matrix + +- Improved documentation + +- Added constants for overscan borders + + +nes_ntsc 0.1.0 +-------------- +- First official version + +- Completely rewrote algorithm to do all NTSC signal processing at +initialization time, putting results into a table for use during blitting. This +increased performance by over 300% and allowed many improvements in quality and +image options. + +- Eliminated multiple output formats and options. Now you can define a custom +blitter for this. + +- Added sharpness and "hue warping" controls + +- Added option to merge even and odd artifacts to reduce flicker when host +monitor's refresh rate doesn't match emulator's frame rate. + +- Added built-in horizontal rescaling. I never realized the old one was way too +wide. + diff --git a/Mednafen/mednafen/nes/ntsc/demo.c b/Mednafen/mednafen/nes/ntsc/demo.c new file mode 100644 index 0000000000..10269dcee8 --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/demo.c @@ -0,0 +1,255 @@ + +/* Uses nes_ntsc to display a raw NES image on screen with adjustment of +sharpness and hue warping using mouse. Writes "nes.pal" RGB color file on exit. + +Space Toggles field merging +C Composite video quality +S S-video quality +R RGB video quality +M Monochrome video quality +D Toggles between standard and Sony decoder matrix +*/ + +#include "nes_ntsc.h" +#include +#include +#include +#include "SDL.h" + +/* NES pixel buffer size */ +enum { nes_width = 256 }; +enum { nes_height = 240 }; + +/* Output size */ +enum { out_width = NES_NTSC_OUT_WIDTH( nes_width ) }; +enum { out_height = nes_height * 2 }; + +/* Shell */ +void fatal_error( const char* str ); +void sdl_init( int width, int height, int depth ); +void sdl_lock_pixels(); +void sdl_display(); +int sdl_run(); +static unsigned char* sdl_pixels; +static long sdl_pitch; +static float mouse_x = 0.5f, mouse_y = 0.5f; /* 0.0 to 1.0 */ +static int mouse_moved; +static int key_pressed; + +/* Globals */ +static unsigned char* nes_pixels; +static nes_ntsc_setup_t setup; +static nes_ntsc_t* ntsc; +static int burst_phase = 0; + +static void init() +{ + /* read raw image */ + FILE* file = fopen( "nes.raw", "rb" ); + if ( !file ) + fatal_error( "Couldn't open image file" ); + nes_pixels = (unsigned char*) malloc( (long) nes_height * nes_width ); + if ( !nes_pixels ) + fatal_error( "Out of memory" ); + fread( nes_pixels, nes_width, nes_height, file ); + fclose( file ); + + /* allocate memory for nes_ntsc and initialize */ + ntsc = (nes_ntsc_t*) malloc( sizeof (nes_ntsc_t) ); + if ( !ntsc ) + fatal_error( "Out of memory" ); + nes_ntsc_init( ntsc, &setup ); +} + +static void display() +{ + sdl_lock_pixels(); + + /* force phase to 0 if merge_fields is on */ + burst_phase ^= 1; + if ( setup.merge_fields ) + burst_phase = 0; + + /* blit image to every other row of output by doubling output pitch */ + nes_ntsc_blit( ntsc, nes_pixels, nes_width, burst_phase, + nes_width, nes_height, sdl_pixels, sdl_pitch * 2 ); + + /* interpolate and darken between scanlines */ + { + int y; + for ( y = 1; y < out_height - 1; y += 2 ) + { + unsigned char* io = sdl_pixels + y * sdl_pitch; + int n; + for ( n = out_width; n; --n ) + { + unsigned prev = *(unsigned short*) (io - sdl_pitch); + unsigned next = *(unsigned short*) (io + sdl_pitch); + /* mix 16-bit rgb without losing low bits */ + unsigned mixed = prev + next + ((prev ^ next) & 0x0821); + /* darken by 12% */ + *(unsigned short*) io = (mixed >> 1) - (mixed >> 4 & 0x18E3); + io += 2; + } + } + } + + sdl_display(); +} + +static void write_palette() +{ + FILE* out = fopen( "nes.pal", "wb" ); + if ( out ) + { + unsigned char palette [64 * 3]; + setup.palette_out = palette; + nes_ntsc_init( 0, &setup ); + fwrite( palette, sizeof palette, 1, out ); + } +} + +int main( int argc, char** argv ) +{ + int merge_fields = 1; + int sony_decoder = 0; + + setup = nes_ntsc_composite; + init(); + sdl_init( out_width, out_height, 16 ); /* 16-bit RGB output buffer */ + + /* keep displaying frames until mouse is clicked */ + while ( sdl_run() ) + { + display(); + + switch ( key_pressed ) + { + case SDLK_SPACE: merge_fields = !merge_fields; break; + + case SDLK_c : setup = nes_ntsc_composite; break; + + case SDLK_s : setup = nes_ntsc_svideo; break; + + case SDLK_r : setup = nes_ntsc_rgb; break; + + case SDLK_m : setup = nes_ntsc_monochrome; break; + + case SDLK_d : sony_decoder = !sony_decoder; break; + } + + if ( key_pressed || mouse_moved ) + { + /* convert mouse range to -1 to +1 */ + float x = mouse_x * 2 - 1; + float y = mouse_y * 2 - 1; + + /* parameters: hue, saturation, contrast, brightness, sharpness, + gamma, bleed, resolution, artifacts, fringing, hue_warping */ + setup.sharpness = x; + setup.hue_warping = y; + + setup.merge_fields = merge_fields; + + setup.decoder_matrix = 0; + setup.hue = 0; + if ( sony_decoder ) + { + /* Sony CXA2095S US */ + static float matrix [6] = { 1.539, -0.622, -0.571, -0.185, 0.000, 2.000 }; + setup.decoder_matrix = matrix; + setup.hue += 33 / 180.0; + } + + nes_ntsc_init( ntsc, &setup ); + } + } + + free( ntsc ); + + write_palette(); + + return 0; +} + +/* Shell */ + +static SDL_Rect rect; +static SDL_Surface* screen; +static SDL_Surface* surface; +static unsigned long next_time; + +void fatal_error( const char* str ) +{ + fprintf( stderr, "Error: %s\n", str ); + exit( EXIT_FAILURE ); +} + +void sdl_init( int width, int height, int depth ) +{ + rect.w = width; + rect.h = height; + + if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) + fatal_error( "SDL initialization failed" ); + atexit( SDL_Quit ); + + screen = SDL_SetVideoMode( width, height, 0, 0 ); + surface = SDL_CreateRGBSurface( SDL_SWSURFACE, width, height, depth, 0, 0, 0, 0 ); + if ( !screen || !surface ) + fatal_error( "SDL initialization failed" ); +} + +int sdl_run() +{ + SDL_Event e; + + /* limit to 60 calls per second */ + unsigned long start = SDL_GetTicks(); + if ( start < next_time && next_time - start > 10 ) + SDL_Delay( next_time - start ); + while ( SDL_GetTicks() < next_time ) { } + next_time = start + 1000 / 60; + + mouse_moved = 0; + key_pressed = 0; + + while ( SDL_PollEvent( &e ) ) + { + if ( e.type == SDL_MOUSEBUTTONDOWN || e.type == SDL_QUIT ) + return 0; + + if ( e.type == SDL_KEYDOWN ) + { + if ( e.key.keysym.sym == SDLK_ESCAPE || e.key.keysym.sym == SDLK_q ) + return 0; + key_pressed = e.key.keysym.sym; + } + + if ( e.type == SDL_MOUSEMOTION ) + { + int x, y; + SDL_GetMouseState( &x, &y ); + mouse_moved = 1; + mouse_x = x / (float) (SDL_GetVideoSurface()->w - 1); + mouse_y = 1 - y / (float) (SDL_GetVideoSurface()->h - 1); + } + } + return 1; +} + +void sdl_lock_pixels() +{ + if ( SDL_LockSurface( surface ) < 0 ) + fatal_error( "Couldn't lock surface" ); + sdl_pitch = surface->pitch; + sdl_pixels = (unsigned char*) surface->pixels; +} + +void sdl_display() +{ + SDL_UnlockSurface( surface ); + if ( SDL_BlitSurface( surface, &rect, screen, &rect ) < 0 || SDL_Flip( screen ) < 0 ) + fatal_error( "SDL blit failed" ); +} + diff --git a/Mednafen/mednafen/nes/ntsc/nes.raw b/Mednafen/mednafen/nes/ntsc/nes.raw new file mode 100644 index 0000000000..9d32abb235 --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/nes.raw @@ -0,0 +1 @@ +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000077700000000000000000000000000000000070000000000000000000000000000000000007000000000000077777770000000000000000000000007770000000000000000000000000000000000&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&777770000000000000000000000000000000&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7700000000000000000000000000000000000000&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&77777777700000000000000000000000000000000000&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&77000000000000000000000000000000000&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&77700000000000000000000000000000000&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&777000000000077777777777777%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%77'7''77'''''7'''''7''''''777''77777777'77%'''7%''''''''777777777777777%%7777%%%%%%%'7777%%%%%%%''''77%%%%''''777%%%''''777%%'''77%'''''77%%'''''''77%%%%%%%%%%%%%%%%%%%%%%% \ No newline at end of file diff --git a/Mednafen/mednafen/nes/ntsc/nes_ntsc.cpp b/Mednafen/mednafen/nes/ntsc/nes_ntsc.cpp new file mode 100644 index 0000000000..86f3216539 --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/nes_ntsc.cpp @@ -0,0 +1,658 @@ + +/* nes_ntsc 0.2.0. http://www.slack.net/~ant/ */ + +/* compilable in C or C++; just change the file extension */ + +#include "nes_ntsc.h" + +#include +#include + +/* Based on algorithm by NewRisingSun */ +/* Copyright (C) 2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. You should have received a copy of the GNU Lesser General +Public License along with this module; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +enum { disable_correction = 0 }; /* for debugging */ + +/* macro constants are used instead of enum in some places to work around compiler bug */ + +#define rgb_unit 0x100 + +/* begin mostly common NES/SNES/SMS code */ + +nes_ntsc_setup_t const nes_ntsc_monochrome = { 0,-1, 0, 0,.2, 0,.2,-.2,-.2,-1, 0, 1, 0, 0 }; +nes_ntsc_setup_t const nes_ntsc_composite = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }; +nes_ntsc_setup_t const nes_ntsc_svideo = { 0, 0, 0, 0,.2, 0,.2, -1, -1, 0, 0, 1, 0, 0 }; +nes_ntsc_setup_t const nes_ntsc_rgb = { 0, 0, 0, 0,.2, 0,.7, -1, -1,-1, 0, 1, 0, 0 }; + +enum { alignment_count = 3 }; /* different pixel alignments with respect to yiq quads */ + +enum { kernel_half = 16 }; +enum { kernel_size = kernel_half * 2 + 1 }; +#define rescale_in 8 +enum { rescale_out = 7 }; + +struct ntsc_impl_t +{ + float to_rgb [nes_ntsc_burst_count] [6]; + float sin_hue; + float cos_hue; + float brightness; + float contrast; + float artifacts; + float fringing; + float hue_warping; + float kernel [rescale_out * kernel_size * 2]; +}; + +#define PI 3.14159265358979323846f + +static void init_ntsc_impl( struct ntsc_impl_t* impl, nes_ntsc_setup_t const* setup ) +{ + float kernels [kernel_size * 2]; + + impl->brightness = (float) setup->brightness * (0.4f * rgb_unit); + impl->contrast = (float) setup->contrast * (0.4f * rgb_unit) + rgb_unit; + impl->hue_warping = (float) setup->hue_warping; + + impl->artifacts = (float) setup->artifacts; + if ( impl->artifacts > 0 ) + impl->artifacts *= 0.5f; + impl->artifacts += 1.0f; + + impl->fringing = (float) setup->fringing; + if ( impl->fringing > 0 ) + impl->fringing *= 0.5f; + impl->fringing += 1.0f; + + /* generate luma (y) filter using sinc kernel */ + { + /* sinc with rolloff (dsf) */ + /* double precision avoids instability */ + double const rolloff = 1 + setup->sharpness * 0.004; + double const maxh = 256; + double const pow_a_n = pow( rolloff, maxh ); + float sum; + int i; + /* quadratic mapping to reduce negative (blurring) range */ + double to_angle = setup->resolution + 1; + to_angle = PI / maxh * 0.20 * (to_angle * to_angle + 1); + + kernels [kernel_size * 3 / 2] = (float) maxh; + for ( i = 0; i < kernel_half * 2 + 1; i++ ) + { + int x = i - kernel_half; + double angle = x * to_angle; + /* instability occurs at center point with rolloff very close to 1.0 */ + if ( x || pow_a_n > 1.01 || pow_a_n < 0.99 ) + { + double rolloff_cos_a = rolloff * cos( angle ); + double num = 1 - rolloff_cos_a - + pow_a_n * cos( maxh * angle ) + + pow_a_n * rolloff * cos( (maxh - 1) * angle ); + double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff; + double dsf = num / den; + kernels [kernel_size * 3 / 2 - kernel_half + i] = (float) dsf; + } + } + + /* apply blackman window and find sum */ + sum = 0; + for ( i = 0; i < kernel_half * 2 + 1; i++ ) + { + float x = PI * 2 / (kernel_half * 2) * i; + float blackman = 0.42f - 0.5f * (float) cos( x ) + 0.08f * (float) cos( x * 2 ); + sum += (kernels [kernel_size * 3 / 2 - kernel_half + i] *= blackman); + } + + /* normalize kernel */ + sum = 1.0f / sum; + for ( i = 0; i < kernel_half * 2 + 1; i++ ) + { + int x = kernel_size * 3 / 2 - kernel_half + i; + kernels [x] *= sum; + assert( kernels [x] == kernels [x] ); /* catch numerical instability */ + } + } + + /* generate chroma (iq) filter using gaussian kernel */ + { + float const cutoff_factor = -0.03125f; + float cutoff = (float) setup->bleed; + int i; + + if ( cutoff < 0 ) + { + /* keep extreme value accessible only near upper end of scale (1.0) */ + cutoff *= cutoff; + cutoff *= cutoff; + cutoff *= cutoff; + cutoff *= -30.0f / 0.65f; + } + cutoff = cutoff_factor - 0.65f * cutoff_factor * cutoff; + + for ( i = -kernel_half; i <= kernel_half; i++ ) + kernels [kernel_size / 2 + i] = (float) exp( i * i * cutoff ); + + /* normalize even and odd phases separately */ + for ( i = 0; i < 2; i++ ) + { + float sum = 0; + int x; + for ( x = i; x < kernel_size; x += 2 ) + sum += kernels [x]; + + sum = 1.0f / sum; + for ( x = i; x < kernel_size; x += 2 ) + { + kernels [x] *= sum; + assert( kernels [x] == kernels [x] ); /* catch numerical instability */ + } + } + } + + /* generate linear rescale kernels */ + { + int i; + for ( i = 0; i < rescale_out; i++ ) + { + float* out = &impl->kernel [i * kernel_size * 2]; + float second = 1.0f / rescale_in * (i + 1); + float first = 1.0f - second; + int x; + *out++ = kernels [0] * first; + for ( x = 1; x < kernel_size * 2; x++ ) + *out++ = kernels [x] * first + kernels [x - 1] * second; + } + } + + /* setup decoder matricies */ + { + static float const default_decoder [6] = + { 0.956f, 0.621f, -0.272f, -0.647f, -1.105f, 1.702f }; + float hue = (float) setup->hue * PI; + float sat = (float) setup->saturation; + float const* decoder = setup->decoder_matrix; + int i; + if ( !decoder ) + { + decoder = default_decoder; + hue -= PI / 180 * 15; + } + sat = (sat < 0 ? sat : sat * 0.41f) + 1; + impl->sin_hue = (float) sin( hue ); + impl->cos_hue = (float) cos( hue ); + + for ( i = 0; i < nes_ntsc_burst_count; i++ ) + { + float s = (float) sin( hue ) * sat; + float c = (float) cos( hue ) * sat; + float const* in = decoder; + float* out = impl->to_rgb [i]; + int n; + for ( n = 3; n; --n ) + { + float vi = *in++; + float vq = *in++; + *out++ = vi * c - vq * s; + *out++ = vi * s + vq * c; + } + hue -= PI / 180 * 120; + } + } +} + +/* kernel generation */ + +enum { rgb_kernel_size = nes_ntsc_burst_size / alignment_count }; + +static float const rgb_offset = rgb_unit * 2 + 0.5f; +static ntsc_rgb_t const ntsc_rgb_bias = rgb_unit * 2 * ntsc_rgb_builder; + +#define TO_RGB( y, i, q, to_rgb ) ( \ + ((int) (y + to_rgb [0] * i + to_rgb [1] * q) << 21) +\ + ((int) (y + to_rgb [2] * i + to_rgb [3] * q) << 11) +\ + ((int) (y + to_rgb [4] * i + to_rgb [5] * q) << 1)\ +) + +typedef struct pixel_info_t +{ + int offset; + float negate; + float kernel [4]; +} pixel_info_t; + +#define PIXEL_OFFSET_( ntsc, scaled ) \ + (kernel_size / 2 + ntsc + (scaled != 0) + (rescale_out - scaled) % rescale_out + \ + (kernel_size * 2 * scaled)) + +#define PIXEL_OFFSET( ntsc, scaled ) \ + PIXEL_OFFSET_( ((ntsc) - (scaled) / rescale_out * rescale_in),\ + (((scaled) + rescale_out * 10) % rescale_out) ),\ + (1.0f - (((ntsc) + 100) & 2)) + +/* Generate pixel at all burst phases and column alignments */ +static void gen_kernel( struct ntsc_impl_t* impl, float y, float i, float q, ntsc_rgb_t* out ) +{ + /* generate for each scanline burst phase */ + float const* to_rgb = impl->to_rgb [0]; + do + { + static pixel_info_t const pixels [alignment_count] = { + { PIXEL_OFFSET( -4, -9 ), { 1.0000f, 1.0000f, .6667f, .0000f } }, + { PIXEL_OFFSET( -2, -7 ), { .3333f, 1.0000f, 1.0000f, .3333f } }, + { PIXEL_OFFSET( 0, -5 ), { .0000f, .6667f, 1.0000f, 1.0000f } }, + }; + + /* Encode yiq into *two* composite signals (to allow control over artifacting). + Convolve these with kernels which: filter respective components, apply + sharpening, and rescale horizontally. Convert resulting yiq to rgb and pack + into integer. */ + pixel_info_t const* pixel = pixels; + do + { + /* negate is -1 when composite starts at odd multiple of 2 */ + float const yy = y * impl->fringing * pixel->negate; + float const ic0 = (i + yy) * pixel->kernel [0]; + float const qc1 = (q + yy) * pixel->kernel [1]; + float const ic2 = (i - yy) * pixel->kernel [2]; + float const qc3 = (q - yy) * pixel->kernel [3]; + + float const factor = impl->artifacts * pixel->negate; + float const ii = i * factor; + float const yc0 = (y + ii) * pixel->kernel [0]; + float const yc2 = (y - ii) * pixel->kernel [2]; + + float const qq = q * factor; + float const yc1 = (y + qq) * pixel->kernel [1]; + float const yc3 = (y - qq) * pixel->kernel [3]; + + float const* k = &impl->kernel [pixel->offset]; + int n; + for ( n = rgb_kernel_size; n; --n ) + { + float vi = k[0]*ic0 + k[2]*ic2; + float vq = k[1]*qc1 + k[3]*qc3; + float vy = k[kernel_size+0]*yc0 + k[kernel_size+1]*yc1 + + k[kernel_size+2]*yc2 + k[kernel_size+3]*yc3 + rgb_offset; + if ( k >= &impl->kernel [kernel_size * 2 * (rescale_out - 1)] ) + k -= kernel_size * 2 * (rescale_out - 1) + 2; + else + k += kernel_size * 2 - 1; + *out++ = TO_RGB( vy, vi, vq, to_rgb ) - ntsc_rgb_bias; + } + } + while ( pixel++ < &pixels [alignment_count - 1] ); + + to_rgb += 6; + + /* rotate -120 degrees */ + { + float const sin_b = -0.866025f; + float const cos_b = -0.5f; + float t; + t = i * cos_b - q * sin_b; + q = i * sin_b + q * cos_b; + i = t; + } + } + while ( to_rgb < impl->to_rgb [nes_ntsc_burst_count] ); +} + +static void merge_fields( ntsc_rgb_t* io ) +{ + int n; + for ( n = nes_ntsc_burst_size; n; --n ) + { + ntsc_rgb_t p0 = io [nes_ntsc_burst_size * 0] + ntsc_rgb_bias; + ntsc_rgb_t p1 = io [nes_ntsc_burst_size * 1] + ntsc_rgb_bias; + ntsc_rgb_t p2 = io [nes_ntsc_burst_size * 2] + ntsc_rgb_bias; + /* merge fields without losing precision */ + io [nes_ntsc_burst_size * 0] = + ((p0 + p1 - ((p0 ^ p1) & ntsc_rgb_builder)) >> 1) - ntsc_rgb_bias; + io [nes_ntsc_burst_size * 1] = + ((p1 + p2 - ((p1 ^ p2) & ntsc_rgb_builder)) >> 1) - ntsc_rgb_bias; + io [nes_ntsc_burst_size * 2] = + ((p2 + p0 - ((p2 ^ p0) & ntsc_rgb_builder)) >> 1) - ntsc_rgb_bias; + ++io; + } +} + +static void correct_errors( ntsc_rgb_t color, ntsc_rgb_t* out ) +{ + int burst; + for ( burst = 0; burst < nes_ntsc_burst_count; burst++ ) + { + int i; + for ( i = 0; i < rgb_kernel_size / 2; i++ ) + { + ntsc_rgb_t error = color - + out [i ] - + out [i + 3 +28] - + out [i + 5 +14] - + out [i + 7 ] - + out [(i+10)%14+28] - + out [(i+12)%14+14]; + + /* distribute error among four kernels */ + ntsc_rgb_t fourth = (error + 2 * ntsc_rgb_builder) >> 2; + fourth &= (ntsc_rgb_bias >> 1) - ntsc_rgb_builder; + fourth -= ntsc_rgb_bias >> 2; + if ( disable_correction ) { out [i] += ntsc_rgb_bias; continue; } + out [i + 3 +28] += fourth; + out [i + 5 +14] += fourth; + out [i + 7 ] += fourth; + out [i ] += error - (fourth * 3); + } + out += alignment_count * rgb_kernel_size; + } +} +/* end common code */ + +static void nes_ntsc_init_( ntsc_rgb_t* table, nes_ntsc_setup_t const* setup, int color_count ) +{ + /* init pixel renderer */ + int entry; + struct ntsc_impl_t impl; + if ( !setup ) + setup = &nes_ntsc_composite; + init_ntsc_impl( &impl, setup ); + + /* Generate pixel for every possible color */ + for ( entry = 0; entry < color_count; entry++ ) + { + /* determine y/i/q levels for color */ + static float const lo_levels [4] = { -0.12f, 0.00f, 0.31f, 0.72f }; + static float const hi_levels [4] = { 0.40f, 0.68f, 1.00f, 1.00f }; + int level = entry >> 4 & 0x03; + float lo = lo_levels [level]; + float hi = hi_levels [level]; + + int color = entry & 0x0F; + if ( color == 0 ) + lo = hi; + if ( color == 0x0D ) + hi = lo; + if ( color > 0x0D ) + hi = lo = 0.0f; + + { + #define TO_ANGLE( c ) (PI / 6 * ((c) - 3)) + float angle = TO_ANGLE( color ); + float sat = (hi - lo) * (0.5f * rgb_unit); + float i = (float) sin( angle ) * sat; + float q = (float) cos( angle ) * sat; + float y = (hi + lo) * 0.5f; + int tint = entry >> 6 & 7; + + /* apply color emphasis */ + if ( tint && color <= 0x0D ) + { + float const atten_mul = 0.79399f; + float const atten_sub = 0.0782838f; + + if ( tint == 7 ) + { + y = y * (atten_mul * 1.13f) - (atten_sub * 1.13f); + } + else + { + static unsigned char tints [8] = { 0, 6, 10, 8, 2, 4, 0, 0 }; + float vangle = TO_ANGLE( tints [tint] ); + float vsat = hi * (0.5f - atten_mul * 0.5f) + atten_sub * 0.5f; + y -= vsat * 0.5f; + if ( tint >= 3 && tint != 4 ) + { + /* combined tint bits */ + vsat *= 0.6f; + y -= vsat; + } + vsat *= rgb_unit; + i += (float) sin( vangle ) * vsat; + q += (float) cos( vangle ) * vsat; + } + } + + /* warp hue */ + if ( impl.hue_warping ) + { + /* rotate to angle decoder would use */ + float wi = q * impl.sin_hue + i * impl.cos_hue; + float wq = q * impl.cos_hue - i * impl.sin_hue; + + float factor = wi * wq; + if ( factor <= 0 && wq != 0 ) + { + factor *= impl.hue_warping / (wi * wi + wq * wq); + wi -= wi * factor; + wq += wq * factor; + + /* rotate back to pre-decoder angle */ + i = wi * impl.cos_hue - wq * impl.sin_hue; + q = wi * impl.sin_hue + wq * impl.cos_hue; + } + } + + if ( setup->gamma && y > 0 ) + y = (float) pow( (double) y, 1 - setup->gamma * 0.5 ); + + y = y * impl.contrast + impl.brightness; + + if ( table ) + { + gen_kernel( &impl, y, i, q, table ); + if ( setup->merge_fields ) + merge_fields( table ); + } + + y += rgb_offset; + + { + /* blue tends to overflow */ + /* ntsc_rgb_t rgb = TO_RGB( y, i, q, impl.to_rgb [0] ); */ + int r = (int) (y + impl.to_rgb [0] [0] * i + impl.to_rgb [0] [1] * q); + int g = (int) (y + impl.to_rgb [0] [2] * i + impl.to_rgb [0] [3] * q); + int b = (int) (y + impl.to_rgb [0] [4] * i + impl.to_rgb [0] [5] * q); + ntsc_rgb_t rgb = (r << 21) + (g << 11) + (b < 0x3E0 ? b << 1 : 0x3E0 << 1); + + /* optionally output to palette */ + unsigned char* out = setup->palette_out; + if ( out ) + { + ntsc_rgb_t clamped = rgb; + NES_NTSC_CLAMP_( clamped ); + out += entry * 3; + out [0] = clamped >> 21 & 0xFF; + out [1] = clamped >> 11 & 0xFF; + out [2] = clamped >> 1 & 0xFF; + } + + /* generate and adjust kernel */ + if ( table ) + { + correct_errors( rgb, table ); + table += nes_ntsc_entry_size; + } + } + } + } +} + +void nes_ntsc_init( nes_ntsc_t* ntsc, nes_ntsc_setup_t const* setup ) +{ + nes_ntsc_init_( (ntsc ? ntsc->table : 0), setup, nes_ntsc_palette_size ); +} + +void nes_ntsc_init_emph( nes_ntsc_emph_t* ntsc, nes_ntsc_setup_t const* setup ) +{ + nes_ntsc_init_( (ntsc ? ntsc->table : 0), setup, nes_ntsc_emph_palette_size ); +} + +/* Disable 'restrict' keyword by default. If your compiler supports it, put + + #define restrict restrict + +somewhere in a config header, or the equivalent in the command-line: + + -Drestrict=restrict + +If your compiler supports a non-standard version, like __restrict, do this: + + #define restrict __restrict + +Enabling this if your compiler supports it will allow better optimization. */ +#ifndef restrict + #define restrict +#endif + +/* Default to 16-bit RGB output */ +#ifndef NES_NTSC_OUT_DEPTH + #define NES_NTSC_OUT_DEPTH 16 +#endif + +#include + +#if NES_NTSC_OUT_DEPTH > 16 + #if UINT_MAX == 0xFFFFFFFF + typedef unsigned int nes_ntsc_out_t; + #elif ULONG_MAX == 0xFFFFFFFF + typedef unsigned long nes_ntsc_out_t; + #else + #error "Need 32-bit int type" + #endif +#else + #if USHRT_MAX == 0xFFFF + typedef unsigned short nes_ntsc_out_t; + #else + #error "Need 16-bit int type" + #endif +#endif + +/* useful if you have a linker which doesn't remove unused code from executable */ +#ifndef NES_NTSC_NO_BLITTERS + +/* Use this as a starting point for writing your own blitter. To allow easy upgrades +to new versions of this library, put your blitter in a separate source file rather +than modifying this one directly. */ + +void nes_ntsc_blit( nes_ntsc_t const* ntsc, unsigned char const* nes_in, + long in_row_width, int burst_phase, int in_width, int in_height, + void* rgb_out, long out_pitch ) +{ + int chunk_count = (in_width - 1) / nes_ntsc_in_chunk; + for ( ; in_height; --in_height ) + { + /* begin row and read first input pixel */ + unsigned char const* line_in = nes_in; + NES_NTSC_BEGIN_ROW( ntsc, burst_phase, + nes_ntsc_black, nes_ntsc_black, *line_in++ & 0x3F ); + nes_ntsc_out_t* restrict line_out = (nes_ntsc_out_t*) rgb_out; + int n; + + /* blit main chunks, each using 3 input pixels to generate 7 output pixels */ + for ( n = chunk_count; n; --n ) + { + /* order of input and output pixels must not be altered */ + NES_NTSC_COLOR_IN( 0, line_in [0] & 0x3F ); + NES_NTSC_RGB_OUT( 0, line_out [0], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 1, line_out [1], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 1, line_in [1] & 0x3F ); + NES_NTSC_RGB_OUT( 2, line_out [2], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 3, line_out [3], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 2, line_in [2] & 0x3F ); + NES_NTSC_RGB_OUT( 4, line_out [4], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 5, line_out [5], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 6, line_out [6], NES_NTSC_OUT_DEPTH ); + + line_in += 3; + line_out += 7; + } + + /* you can eliminate the need for the final chunk below by padding + input with three extra black pixels at the end of each row */ + + /* finish final pixels without starting any new ones */ + NES_NTSC_COLOR_IN( 0, nes_ntsc_black ); + NES_NTSC_RGB_OUT( 0, line_out [0], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 1, line_out [1], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 1, nes_ntsc_black ); + NES_NTSC_RGB_OUT( 2, line_out [2], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 3, line_out [3], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 2, nes_ntsc_black ); + NES_NTSC_RGB_OUT( 4, line_out [4], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 5, line_out [5], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 6, line_out [6], NES_NTSC_OUT_DEPTH ); + + /* advance burst phase and line pointers */ + burst_phase = (burst_phase + 1) % nes_ntsc_burst_count; + nes_in += in_row_width; + rgb_out = (char*) rgb_out + out_pitch; + } +} + +void nes_ntsc_blit_emph( nes_ntsc_emph_t const* ntsc, unsigned short const* nes_in, + long in_row_width, int burst_phase, int in_width, int height, + void* rgb_out, long out_pitch ) +{ + /* see comments in nes_ntsc_blit */ + int chunk_count = (in_width - 1) / nes_ntsc_in_chunk; + for ( ; height; --height ) + { + unsigned short const* line_in = nes_in; + NES_NTSC_BEGIN_ROW( ntsc, burst_phase, + nes_ntsc_black, nes_ntsc_black, *line_in++ & 0x1FF ); + nes_ntsc_out_t* restrict line_out = (nes_ntsc_out_t*) rgb_out; + int n; + + for ( n = chunk_count; n; --n ) + { + NES_NTSC_COLOR_IN( 0, line_in [0] & 0x1FF ); + NES_NTSC_RGB_OUT( 0, line_out [0], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 1, line_out [1], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 1, line_in [1] & 0x1FF ); + NES_NTSC_RGB_OUT( 2, line_out [2], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 3, line_out [3], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 2, line_in [2] & 0x1FF ); + NES_NTSC_RGB_OUT( 4, line_out [4], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 5, line_out [5], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 6, line_out [6], NES_NTSC_OUT_DEPTH ); + + line_in += 3; + line_out += 7; + } + + NES_NTSC_COLOR_IN( 0, nes_ntsc_black ); + NES_NTSC_RGB_OUT( 0, line_out [0], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 1, line_out [1], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 1, nes_ntsc_black ); + NES_NTSC_RGB_OUT( 2, line_out [2], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 3, line_out [3], NES_NTSC_OUT_DEPTH ); + + NES_NTSC_COLOR_IN( 2, nes_ntsc_black ); + NES_NTSC_RGB_OUT( 4, line_out [4], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 5, line_out [5], NES_NTSC_OUT_DEPTH ); + NES_NTSC_RGB_OUT( 6, line_out [6], NES_NTSC_OUT_DEPTH ); + + burst_phase = (burst_phase + 1) % nes_ntsc_burst_count; + nes_in += in_row_width; + rgb_out = (char*) rgb_out + out_pitch; + } +} + +#endif + diff --git a/Mednafen/mednafen/nes/ntsc/nes_ntsc.h b/Mednafen/mednafen/nes/ntsc/nes_ntsc.h new file mode 100644 index 0000000000..a9da1dee9e --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/nes_ntsc.h @@ -0,0 +1,170 @@ + +/* NES NTSC composite video to RGB emulator/blitter */ + +/* nes_ntsc 0.2.0 */ + +#ifndef NES_NTSC_H +#define NES_NTSC_H + +/* Image parameters, ranging from -1.0 to 1.0 */ +typedef struct nes_ntsc_setup_t +{ + /* Basic parameters */ + double hue; /* -1 = -180 degrees, +1 = +180 degrees */ + double saturation; /* -1 = grayscale, +1 = oversaturated colors */ + double contrast; + double brightness; + double sharpness; /* edge contrast enhancement/blurring */ + + /* Advanced parameters */ + double gamma; + double resolution; /* image resolution */ + double artifacts; /* artifacts caused by color changes */ + double fringing; /* color artifacts caused by brightness changes */ + double bleed; /* color bleed (color resolution reduction) */ + double hue_warping;/* -1 = expand purple & green, +1 = expand orange & cyan */ + int merge_fields; /* if 1, merges even and odd fields together to reduce flicker */ + float const* decoder_matrix; /* optional RGB decoder matrix, 6 elements */ + + unsigned char* palette_out; /* optional RGB palette out, 3 bytes per color */ +} nes_ntsc_setup_t; + +/* Video format presets */ +extern nes_ntsc_setup_t const nes_ntsc_composite; /* color bleeding + artifacts */ +extern nes_ntsc_setup_t const nes_ntsc_svideo; /* color bleeding only */ +extern nes_ntsc_setup_t const nes_ntsc_rgb; /* crisp image */ +extern nes_ntsc_setup_t const nes_ntsc_monochrome;/* desaturated + artifacts */ + +enum { nes_ntsc_palette_size = 64 }; +enum { nes_ntsc_emph_palette_size = 64 * 8 }; + +/* Initialize and adjust parameters. Can be called multiple times on the same +nes_ntsc_t object. Caller must allocate memory for nes_ntsc_t. Can pass 0 +for either parameter. */ +typedef struct nes_ntsc_t nes_ntsc_t; +void nes_ntsc_init( nes_ntsc_t* ntsc, nes_ntsc_setup_t const* setup ); + +/* Blit one or more rows of pixels. Input pixels are 6-bit palette indicies. +In_row_width is the number of pixels to get to the next input row. Out_pitch +is the number of *bytes* to get to the next output row. Output pixel format +is set by NES_NTSC_OUT_DEPTH (defaults to 16-bit RGB). */ +void nes_ntsc_blit( nes_ntsc_t const* ntsc, unsigned char const* nes_in, + long in_row_width, int burst_phase, int in_width, int in_height, + void* rgb_out, long out_pitch ); + +/* Equivalent functions with color emphasis support. Source pixels are +9-bit values with the upper 3 bits specifying the emphasis bits from 0x2001. */ +typedef struct nes_ntsc_emph_t nes_ntsc_emph_t; +void nes_ntsc_init_emph( nes_ntsc_emph_t* ntsc, nes_ntsc_setup_t const* setup ); +void nes_ntsc_blit_emph( nes_ntsc_emph_t const* ntsc, unsigned short const* nes_in, + long in_row_width, int burst_phase, int in_width, int in_height, + void* rgb_out, long out_pitch ); + +/* Number of output pixels written by blitter for given input width. Width might +be rounded down slightly; use NES_NTSC_IN_WIDTH() on result to find rounded +value. Guaranteed not to round 256 down at all. */ +#define NES_NTSC_OUT_WIDTH( in_width ) \ + (((in_width) - 1) / nes_ntsc_in_chunk * nes_ntsc_out_chunk + nes_ntsc_out_chunk) + +/* Number of input pixels that will fit within given output width. Might be +rounded down slightly; use NES_NTSC_OUT_WIDTH() on result to find rounded +value. */ +#define NES_NTSC_IN_WIDTH( out_width ) \ + ((out_width) / nes_ntsc_out_chunk * nes_ntsc_in_chunk - nes_ntsc_in_chunk + 1) + + +/* Interface for user-defined custom blitters. +Can be used with nes_ntsc_t and nes_ntsc_emph_t */ + +enum { nes_ntsc_in_chunk = 3 }; /* number of input pixels read per chunk */ +enum { nes_ntsc_out_chunk = 7 }; /* number of output pixels generated per chunk */ +enum { nes_ntsc_black = 15 }; /* palette index for black */ +enum { nes_ntsc_burst_count = 3 }; /* burst phase cycles through 0, 1, and 2 */ + +/* Begin outputting row and start three pixels. First pixel will be cut off a bit. +Use nes_ntsc_black for unused pixels. Declares variables, so must be before first +statement in a block (unless you're using C++). */ +#define NES_NTSC_BEGIN_ROW( ntsc, burst, pixel0, pixel1, pixel2 ) \ + char const* ktable = (char*) (ntsc)->table + burst * (nes_ntsc_burst_size * sizeof (ntsc_rgb_t));\ + ntsc_rgb_t const* kernel0 = NES_NTSC_ENTRY_( pixel0 );\ + ntsc_rgb_t const* kernel1 = NES_NTSC_ENTRY_( pixel1 );\ + ntsc_rgb_t const* kernel2 = NES_NTSC_ENTRY_( pixel2 );\ + ntsc_rgb_t const* kernelx0;\ + ntsc_rgb_t const* kernelx1 = kernel0;\ + ntsc_rgb_t const* kernelx2 = kernel0 + +/* Begin input pixel */ +#define NES_NTSC_COLOR_IN( in_index, color_in ) {\ + kernelx##in_index = kernel##in_index;\ + kernel##in_index = NES_NTSC_ENTRY_( color_in );\ +} + +/* Generate output pixel. Bits can be 24, 16, 15, or 32 (treated as 24): +24: RRRRRRRR GGGGGGGG BBBBBBBB +16: RRRRRGGG GGGBBBBB +15: RRRRRGG GGGBBBBB + 0: xxxRRRRR RRRxxGGG GGGGGxxB BBBBBBBx (raw format; x = junk bits) */ +#define NES_NTSC_RGB_OUT( x, rgb_out, bits ) {\ + ntsc_rgb_t raw =\ + kernel0 [x ] + kernel1 [(x+12)%7+14] + kernel2 [(x+10)%7+28] +\ + kernelx0 [(x+7)%14] + kernelx1 [(x+ 5)%7+21] + kernelx2 [(x+ 3)%7+35];\ + NES_NTSC_CLAMP_( raw );\ + if ( bits == 16 )\ + rgb_out = (raw >> 13 & 0xF800) | (raw >> 8 & 0x07E0) | (raw >> 4 & 0x001F);\ + else if ( bits == 24 || bits == 32 )\ + rgb_out = (raw >> 5 & 0xFF0000) | (raw >> 3 & 0xFF00) | (raw >> 1 & 0xFF);\ + else if ( bits == 15 )\ + rgb_out = (raw >> 14 & 0x7C00) | (raw >> 9 & 0x03E0) | (raw >> 4 & 0x001F);\ + else\ + rgb_out = raw;\ +} + + +/* private */ + +enum { nes_ntsc_entry_size = 128 }; +typedef unsigned long ntsc_rgb_t; +struct nes_ntsc_t { + ntsc_rgb_t table [nes_ntsc_palette_size * nes_ntsc_entry_size]; +}; +struct nes_ntsc_emph_t { + ntsc_rgb_t table [nes_ntsc_emph_palette_size * nes_ntsc_entry_size]; +}; +enum { nes_ntsc_burst_size = nes_ntsc_entry_size / nes_ntsc_burst_count }; + +enum { ntsc_rgb_builder = (1L << 21) | (1 << 11) | (1 << 1) }; +enum { nes_ntsc_clamp_mask = ntsc_rgb_builder * 3 / 2 }; +enum { nes_ntsc_clamp_add = ntsc_rgb_builder * 0x101 }; + +#define NES_NTSC_ENTRY_( n ) \ + (ntsc_rgb_t*) (ktable + (n) * (nes_ntsc_entry_size * sizeof (ntsc_rgb_t))) + +#define NES_NTSC_CLAMP_( io ) {\ + ntsc_rgb_t sub = io >> 9 & nes_ntsc_clamp_mask;\ + ntsc_rgb_t clamp = nes_ntsc_clamp_add - sub;\ + io |= clamp;\ + clamp -= sub;\ + io &= clamp;\ +} + +/* deprecated */ +#define NES_NTSC_RGB24_OUT( x, out ) NES_NTSC_RGB_OUT( x, out, 24 ) +#define NES_NTSC_RGB16_OUT( x, out ) NES_NTSC_RGB_OUT( x, out, 16 ) +#define NES_NTSC_RGB15_OUT( x, out ) NES_NTSC_RGB_OUT( x, out, 15 ) +#define NES_NTSC_RAW_OUT( x, out ) NES_NTSC_RGB_OUT( x, out, 0 ) + +enum { nes_ntsc_min_in_width = 256 }; +enum { nes_ntsc_min_out_width = NES_NTSC_OUT_WIDTH( nes_ntsc_min_in_width ) }; + +enum { nes_ntsc_640_in_width = 271 }; +enum { nes_ntsc_640_out_width = NES_NTSC_OUT_WIDTH( nes_ntsc_640_in_width ) }; +enum { nes_ntsc_640_overscan_left = 8 }; +enum { nes_ntsc_640_overscan_right = nes_ntsc_640_in_width - 256 - nes_ntsc_640_overscan_left }; + +enum { nes_ntsc_full_in_width = 283 }; +enum { nes_ntsc_full_out_width = NES_NTSC_OUT_WIDTH( nes_ntsc_full_in_width ) }; +enum { nes_ntsc_full_overscan_left = 16 }; +enum { nes_ntsc_full_overscan_right = nes_ntsc_full_in_width - 256 - nes_ntsc_full_overscan_left }; + +#endif + diff --git a/Mednafen/mednafen/nes/ntsc/nes_ntsc.txt b/Mednafen/mednafen/nes/ntsc/nes_ntsc.txt new file mode 100644 index 0000000000..29bcbdbdc4 --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/nes_ntsc.txt @@ -0,0 +1,232 @@ +nes_ntsc 0.2.0: NES NTSC Video Filter +------------------------------------- +Author : Shay Green +Website : http://www.slack.net/~ant/ +Forum : http://groups.google.com/group/blargg-sound-libs +License : GNU Lesser General Public License (LGPL) +Language: C or C++ + + +Overview +-------- +To perform NTSC filtering, first allocate memory for a nes_ntsc_t object +and call nes_ntsc_init(), then call nes_ntsc_blit() to perform +filtering. You can call nes_ntsc_init() at any time to change image +parameters. + +Nes_ntsc_blit() reads NES pixels and writes RGB pixels (16-bit by +default). The NES pixels are raw palette values (0 to 0x3F) stored in +the 8-bit unsigned char type. If your emulator outputs RGB pixels and +can't easily be made to output raw NES palette indicies, use my +snes_ntsc library instead, which accepts 16-bit RGB pixels and will +produce the same result as this library. If you use snes_ntsc, read the +burst phase section below since it still applies. + +For support of the three color emphasis bits at the top of PPU register +0x2001, use nes_ntsc_emph_t, nes_ntsc_init_emph(), and +nes_ntsc_blit_emph(). Input pixels must be stored in the 16-bit unsigned +short type to allow for the three emphasis bits stored just above the +6-bit palette index (9 bits per pixel): + + index = (ppu_2001 << 1 & 0x1C0) | (palette_index & 0x3F). + + +RGB Palette Generation +---------------------- +An RGB palette can be generated for use in a normal blitter, either 64 +colors (192 bytes) or including all 8 color emphasis combinations to +result in 512 colors (1536 bytes). The 64-color version matches the +format of the common NES .pal file. In your nes_ntsc_setup_t structure, +point palette_out to a buffer to hold the palette, then call +nes_ntsc_init() (nes_ntsc_init_emph() for the 512-color version). If you +only need the palette and aren't going to be using the NTSC filter, pass +0 for the first parameter. + + +Image Parameters +---------------- +Many image parameters can be adjusted and presets are provided for +composite video, S-video, RGB, and monochrome. Most are floating-point +values with a general range of -1.0 to 1.0, where 0 is normal. The +ranges are adjusted so that one parameter at an extreme (-1 or +1) and +the rest at zero shouldn't result in any internal overflow (garbage +pixels). Setting multiple parameters to their extreme can produce +garbage. Put another way, the state space defined by all parameters +within the range -1 to +1 is not fully usable, but some extreme corners +are very useful so I don't want to reduce the parameter ranges. + +The sharpness and resolution parameters have similar effects. Resolution +affects how crisp pixels are. Sharpness merely enhances the edges by +increasing contrast, which makes things brighter at the edges. Artifacts +sets how much "junk" is around the edges where colors and brightness +change in the image, where -1 completely eliminates them. (Color) bleed +affects how much colors blend together and the artifact colors at the +edges of pixels surrounded by black. (Color) fringing affects how much +color fringing occurs around the edges of bright objects, especially +white text on a black background. + + +Image Size +---------- +Use the NES_NTSC_OUT_WIDTH() and NES_NTSC_IN_WIDTH() macros to convert +between input and output widths that the blitter uses. For example, if +you are blitting an image 256 pixels wide, use NES_NTSC_OUT_WIDTH( 256 ) +to find out how many output pixels are written per row. Another example, +use NES_NTSC_IN_WIDTH( 640 ) to find how many input pixels will fit +within 640 output pixels. The blitter rounds the input width down in +some cases, so the requested width might not be possible. Use +NES_NTSC_IN_WIDTH( NES_NTSC_OUT_WIDTH( in_width ) ) to find what a given +in_width would be rounded down to. + +For proper aspect ratio, the image generated by the library should be +doubled vertically. This can be done in software, as the demo does, done +in a custom blitter for more efficiency (see below), or using a modern +video card's hardware rescaling. On a TV pixels never have crisp edges, +so simply doubling scanlines doesn't give a very authentic image. I've +found reducing the doubled scanline's brightness to 75% looks +significantly better without darkening the image much. To drop +brightness to 75%, calculate 25% brightness using simple bit shifting +and masking, then subtract this from the original. + + +RGB Format +---------- +By default, the blitters output 16-bit RGB pixels. To use a different +format, #define NES_NTSC_OUT_DEPTH to 15, 16, 24, or 32 (same as 24). +You can specify this either in the compiler command-line options + + -DNES_NTSC_OUT_DEPTH=32 + +or by wrapping nes_ntsc.c with your own source file and using this in +place of nes_ntsc.c. + + /* my_nes_ntsc.c */ + #define NES_NTSC_OUT_DEPTH 32 + #include "nes_ntsc.c" + + +Burst Phase +----------- +The burst_phase parameter to nes_ntsc_blit() should generally toggle +values between frames, i.e. 0 on first call to nes_ntsc_blit(), 1 on +second call, 0 on third call, 1 on fourth, etc. If merge_fields is +enabled (see below), you should always pass 0. Read further for more +detailed operation. + +If you're using nes_ntsc_blit() to do partial screen updates, +burst_phase should be calculated as (burst_phase + row) % 3, where row +is the starting row (0 through 239). For example, if burst_phase is 1 +for the current frame and you make two calls to nes_ntsc_blit() to blit +rows 0 to 100, then rows 101 to 239, for the first call you should pass +1 for burst_phase, and for the second call you should pass 0 for +burst_phase: (1 + 101) % 3 = 0. + +For more accurate burst_phase operation, it should be adjusted at the +beginning of a frame based on the length of scanline 20: if 341 clocks +(normal), burst_phase = (burst_phase + 1) % 3, otherwise burst_phase = +(burst_phase + 2) % 3 (for shorter 340 clock scanline). + +The included test ROMs verify proper burst_phase implementation. They +must pass in order; an earlier failing test means that later tests will +give meaningless results. The first two tests will pass with either +method of burst_phase handling described above; the third will only pass +with the more accurate handling. The tests flash sets of dots quickly +with the dot color being the only important aspect. + +1.line_phase.nes - Tests for proper burst_phase on each scanline. All +dots on screen should be the same color. + +2.frame_phase.nes - Tests for proper burst_phase toggling between +frames. Each row of dots should alternate between the same two colors +(if merge_fields is set to 1, they should all be the same color). + +3.special_frame_phase.nes - Tests for proper burst_phase incrementing +between frames when $2001 rendering is enabled late in the frame. Each +rectangle of dots should be one color, and there should be three +different colors of rectangles (if merge_fields is set to 1, each +rectangle should be made of three colors of dots). There is a visual +glitch near the top of the screen for the first line of dots; this is +unrelated the test and should be ignored. + + +Flickering +---------- +The displayed image toggles between two different pixel artifact +patterns at a steady rate, making it appear stable. For an emulator to +duplicate this effect, its frame rate must match the host monitor's +refresh rate, it must be synchronizing to the refresh (vsync), and it +must not be skipping any frames. If any of these don't hold, the image +will probably flicker much more than it would on a TV. It is important +that you play around with these factors to get a good feel for the +issue, and document it clearly for end-users, otherwise they will have +difficulty getting an authentic image. + +The library includes a partial workaround for this issue, for the cases +where all the conditions can't be met. When merge_fields is set to 1, +nes_ntsc_blit() does the equivalent of blitting the image twice with the +two different phases and then mixes them together, but without any +performance impact. The result is similar to what you'd see if the +monitor's refresh rate were the same as the emulator's. It does reduce +the shimmer effect when scrolling, so it's not a complete solution to +the refresh rate issue. + +The merge_fields option is also useful when taking a screenshot. If you +capture without merge_fields set to 1, you'll only get the even or odd +artifacts, which will make the image look more grainy than when the +emulator is running. Again, play around with this to get an idea of the +difference. It might be best to simply allow the user to choose when to +enable this option. + +Note that when you have merge_fields set to 1, you should always pass 0 +for the burst_phase parameter to nes_ntsc_blit(). If you don't, you'll +still get some flicker. + + +Custom Blitter +-------------- +You can write your own blitter, allowing customization of how NES pixels +are obtained (you might want to run through a palette first), the format +of output pixels (15, 16, or 32-bit RGB), optimizations for your +platform, and additional effects like efficient scanline doubling during +blitting. + +Macros are included in nes_ntsc.h for writing your blitter so that your +code can be carried over without changes to improved versions of the +library. The default blitters at the end of nes_ntsc.c show how to use +the macros. For an example of a flexible blitter written in C++ and +optimized for the x86 architecture, refer to Nestopia 1.28's +NstVideoFilterNtsc.hpp. + +NES_NTSC_BEGIN_ROW macro allows starting up to three pixels. The first +pixel is cut off; its use is in specifying a background color other than +black for the sliver on the left edge. The next two pixels can be used +to handle the extra one or two pixels not handled by the main chunks of +three pixels. For example if you want to blit 257 NES pixels on a row +(for whatever odd reason), you would start the first two with +NES_NTSC_BEGIN_ROW( ... nes_ntsc_black, nes_in [0], nes_in [1] ), then +do the remaining 255 in chunks of three (255 / 3 = 85.0). + + +Limitations +----------- +The library's horizontal rescaling is too wide by about 3% in order to +allow a much more optimal implementation. This means that a 256 pixel +wide NES image should appear as 581 output pixels, but with this library +appears as 602 output pixels. TV aspect ratios probably vary by this +much anyway. If you really need unscaled output, contact me and I'll see +about adding it. + + +Thanks +------ +Thanks to NewRisingSun for his original code, which was a starting point +for me learning about NTSC video and decoding. Thanks to the Nesdev +forum for feedback and encouragement. Thanks to byuu (bsnes author) and +pagefault (ZSNES team) for integrating a SNES version of this in their +emulators. Thanks to Martin Freij (Nestopia author) for using an earlier +development version in Nestopia and for feedback about the custom +blitter interface. Thanks to Charles MacDonald for feedback on the SMS +version's interface. + +-- +Shay Green diff --git a/Mednafen/mednafen/nes/ntsc/readme.txt b/Mednafen/mednafen/nes/ntsc/readme.txt new file mode 100644 index 0000000000..3bff9b8fbf --- /dev/null +++ b/Mednafen/mednafen/nes/ntsc/readme.txt @@ -0,0 +1,68 @@ +nes_ntsc 0.2.0: NES NTSC Video Filter +------------------------------------- +Nes_ntsc emulates NES NTSC video output, allowing an authentic image in an +emulator. It uses a highly optimized algorithm to perform the same signal +processing as an NTSC decoder in a TV, giving very similar pixel artifacts. The +usual TV picture controls can be adjusted: hue (tint), saturation, contrast, +brightness, and sharpness. Additionally, the amount of NTSC chroma and luma +artifacts can be adjusted, allowing an image that corresponds to composite +video (lots of artifacts), S-video (color bleeding only), RGB (clean pixels), +or anywhere inbetween. + +The output is scaled to the proper horizontal width, leaving it up the emulator +to simply double the height. An optional even/odd field merging feature is +included to help when the host display's refresh rate doesn't match the +emulator's frame rate. Custom blitters can be written using a special +interface, allowing output in other pixel formats and efficient scanline +doubling as a part of blitting. + +Blitting a 256x240 source image to a 602x240 pixel 16-bit RGB memory buffer at +60 frames per second uses 8% CPU on a 2.0 GHz Athlon 3500+ and 40% CPU on a +10-year-old 400 MHz G3 PowerMac. + +Feedback about the interface and usability would be helpful. + +Author : Shay Green +Website : http://www.slack.net/~ant/ +Forum : http://groups.google.com/group/blargg-sound-libs +License : GNU Lesser General Public License (LGPL) +Language: C or C++ + + +Getting Started +--------------- +Build a program consisting of demo.c, nes_ntsc.c, and the SDL multimedia +library (see http://libsdl.org/). Running the program with "nes.raw" in the +same directory should show an image as it would look on a TV, with mouse +control of two picture parameters. + +A simple benchmark program is included to allow measuring the frame rate and +how much CPU time the blitter would use running at 60 frames per second. This +is useful for getting an idea of whether this library will be usable in your +emulator, and for improving the performance of a custom blitter. + +If you're using C++, to avoid linking issues rename nes_ntsc.c to nes_ntsc.cpp +(this causes compilation in C++ rather than C). + +See nes_ntsc.txt for more information, and respective header (.h) files for +reference. Post to the discussion forum for assistance. + + +Files +----- +readme.txt Essential information +nes_ntsc.txt Library documentation +changes.txt Changes since previous releases +LGPL.txt GNU Lesser General Public License + +demo.c Loads raw image and displays on screen using SDL +nes.raw Raw image for demo +benchmark.c Measures frame rate and CPU usage of blitter + +nes_ntsc.h Library header and source +nes_ntsc.c + +tests/ Test ROMs to verify burst phase operation + +-- +Shay Green diff --git a/Mednafen/mednafen/nes/ops.h b/Mednafen/mednafen/nes/ops.h new file mode 100644 index 0000000000..a9be8ea65c --- /dev/null +++ b/Mednafen/mednafen/nes/ops.h @@ -0,0 +1,491 @@ +/* Mednafen - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +case 0x00: /* BRK */ + _PC++; + PUSH(_PC>>8); + PUSH(_PC); + PUSH(_P|U_FLAG|B_FLAG); + _P|=I_FLAG; + _PI|=I_FLAG; + _PC=RdMem(0xFFFE); + _PC|=RdMem(0xFFFF)<<8; + ADDBT(_PC); + break; + +case 0x40: /* RTI */ + _P=POP(); + /* _PI=_P; This is probably incorrect, so it's commented out. */ + _PI = _P; + _PC=POP(); + _PC|=POP()<<8; + ADDBT(_PC); + break; + +case 0x60: /* RTS */ + _PC=POP(); + _PC|=POP()<<8; + _PC++; + ADDBT(_PC); + break; + +case 0x48: /* PHA */ + PUSH(_A); + break; +case 0x08: /* PHP */ + PUSH(_P|U_FLAG|B_FLAG); + break; +case 0x68: /* PLA */ + _A=POP(); + X_ZN(_A); + break; +case 0x28: /* PLP */ + _P=POP(); + break; +case 0x4C: + { + uint16 ptmp=_PC; + unsigned int npc; + + npc=RdMem(ptmp); + ptmp++; + npc|=RdMem(ptmp)<<8; + _PC=npc; + ADDBT(_PC); + } + break; /* JMP ABSOLUTE */ +case 0x6C: + { + uint32 tmp; + GetAB(tmp); + _PC=RdMem(tmp); + _PC|=RdMem( ((tmp+1)&0x00FF) | (tmp&0xFF00))<<8; + ADDBT(_PC); + } + break; +case 0x20: /* JSR */ + { + uint8 npc; + npc=RdMem(_PC); + _PC++; + PUSH(_PC>>8); + PUSH(_PC); + _PC=RdMem(_PC)<<8; + _PC|=npc; + ADDBT(_PC); + } + break; + +case 0xAA: /* TAX */ + _X=_A; + X_ZN(_A); + break; + +case 0x8A: /* TXA */ + _A=_X; + X_ZN(_A); + break; + +case 0xA8: /* TAY */ + _Y=_A; + X_ZN(_A); + break; +case 0x98: /* TYA */ + _A=_Y; + X_ZN(_A); + break; + +case 0xBA: /* TSX */ + _X=_S; + X_ZN(_X); + break; +case 0x9A: /* TXS */ + _S=_X; + break; + +case 0xCA: /* DEX */ + _X--; + X_ZN(_X); + break; +case 0x88: /* DEY */ + _Y--; + X_ZN(_Y); + break; + +case 0xE8: /* INX */ + _X++; + X_ZN(_X); + break; +case 0xC8: /* INY */ + _Y++; + X_ZN(_Y); + break; + +case 0x18: /* CLC */ + _P&=~C_FLAG; + break; +case 0xD8: /* CLD */ + _P&=~D_FLAG; + break; +case 0x58: /* CLI */ + _P&=~I_FLAG; + break; +case 0xB8: /* CLV */ + _P&=~V_FLAG; + break; + +case 0x38: /* SEC */ + _P|=C_FLAG; + break; +case 0xF8: /* SED */ + _P|=D_FLAG; + break; +case 0x78: /* SEI */ + _P|=I_FLAG; + break; + +case 0xEA: /* NOP */ + break; + +case 0x0A: RMW_A(ASL); +case 0x06: RMW_ZP(ASL); +case 0x16: RMW_ZPX(ASL); +case 0x0E: RMW_AB(ASL); +case 0x1E: RMW_ABX(ASL); + +case 0xC6: RMW_ZP(DEC); +case 0xD6: RMW_ZPX(DEC); +case 0xCE: RMW_AB(DEC); +case 0xDE: RMW_ABX(DEC); + +case 0xE6: RMW_ZP(INC); +case 0xF6: RMW_ZPX(INC); +case 0xEE: RMW_AB(INC); +case 0xFE: RMW_ABX(INC); + +case 0x4A: RMW_A(LSR); +case 0x46: RMW_ZP(LSR); +case 0x56: RMW_ZPX(LSR); +case 0x4E: RMW_AB(LSR); +case 0x5E: RMW_ABX(LSR); + +case 0x2A: RMW_A(ROL); +case 0x26: RMW_ZP(ROL); +case 0x36: RMW_ZPX(ROL); +case 0x2E: RMW_AB(ROL); +case 0x3E: RMW_ABX(ROL); + +case 0x6A: RMW_A(ROR); +case 0x66: RMW_ZP(ROR); +case 0x76: RMW_ZPX(ROR); +case 0x6E: RMW_AB(ROR); +case 0x7E: RMW_ABX(ROR); + +case 0x69: LD_IM(ADC); +case 0x65: LD_ZP(ADC); +case 0x75: LD_ZPX(ADC); +case 0x6D: LD_AB(ADC); +case 0x7D: LD_ABX(ADC); +case 0x79: LD_ABY(ADC); +case 0x61: LD_IX(ADC); +case 0x71: LD_IY(ADC); + +case 0x29: LD_IM(AND); +case 0x25: LD_ZP(AND); +case 0x35: LD_ZPX(AND); +case 0x2D: LD_AB(AND); +case 0x3D: LD_ABX(AND); +case 0x39: LD_ABY(AND); +case 0x21: LD_IX(AND); +case 0x31: LD_IY(AND); + +case 0x24: LD_ZP(BIT); +case 0x2C: LD_AB(BIT); + +case 0xC9: LD_IM(CMP); +case 0xC5: LD_ZP(CMP); +case 0xD5: LD_ZPX(CMP); +case 0xCD: LD_AB(CMP); +case 0xDD: LD_ABX(CMP); +case 0xD9: LD_ABY(CMP); +case 0xC1: LD_IX(CMP); +case 0xD1: LD_IY(CMP); + +case 0xE0: LD_IM(CPX); +case 0xE4: LD_ZP(CPX); +case 0xEC: LD_AB(CPX); + +case 0xC0: LD_IM(CPY); +case 0xC4: LD_ZP(CPY); +case 0xCC: LD_AB(CPY); + +case 0x49: LD_IM(EOR); +case 0x45: LD_ZP(EOR); +case 0x55: LD_ZPX(EOR); +case 0x4D: LD_AB(EOR); +case 0x5D: LD_ABX(EOR); +case 0x59: LD_ABY(EOR); +case 0x41: LD_IX(EOR); +case 0x51: LD_IY(EOR); + +case 0xA9: LD_IM(LDA); +case 0xA5: LD_ZP(LDA); +case 0xB5: LD_ZPX(LDA); +case 0xAD: LD_AB(LDA); +case 0xBD: LD_ABX(LDA); +case 0xB9: LD_ABY(LDA); +case 0xA1: LD_IX(LDA); +case 0xB1: LD_IY(LDA); + +case 0xA2: LD_IM(LDX); +case 0xA6: LD_ZP(LDX); +case 0xB6: LD_ZPY(LDX); +case 0xAE: LD_AB(LDX); +case 0xBE: LD_ABY(LDX); + +case 0xA0: LD_IM(LDY); +case 0xA4: LD_ZP(LDY); +case 0xB4: LD_ZPX(LDY); +case 0xAC: LD_AB(LDY); +case 0xBC: LD_ABX(LDY); + +case 0x09: LD_IM(ORA); +case 0x05: LD_ZP(ORA); +case 0x15: LD_ZPX(ORA); +case 0x0D: LD_AB(ORA); +case 0x1D: LD_ABX(ORA); +case 0x19: LD_ABY(ORA); +case 0x01: LD_IX(ORA); +case 0x11: LD_IY(ORA); + +case 0xEB: /* (undocumented) */ +case 0xE9: LD_IM(SBC); +case 0xE5: LD_ZP(SBC); +case 0xF5: LD_ZPX(SBC); +case 0xED: LD_AB(SBC); +case 0xFD: LD_ABX(SBC); +case 0xF9: LD_ABY(SBC); +case 0xE1: LD_IX(SBC); +case 0xF1: LD_IY(SBC); + +case 0x85: ST_ZP(_A); +case 0x95: ST_ZPX(_A); +case 0x8D: ST_AB(_A); +case 0x9D: ST_ABX(_A); +case 0x99: ST_ABY(_A); +case 0x81: ST_IX(_A); +case 0x91: ST_IY(_A); + +case 0x86: ST_ZP(_X); +case 0x96: ST_ZPY(_X); +case 0x8E: ST_AB(_X); + +case 0x84: ST_ZP(_Y); +case 0x94: ST_ZPX(_Y); +case 0x8C: ST_AB(_Y); + +/* BCC */ +case 0x90: JR(!(_P&C_FLAG)); break; + +/* BCS */ +case 0xB0: JR(_P&C_FLAG); break; + +/* BEQ */ +case 0xF0: JR(_P&Z_FLAG); break; + +/* BNE */ +case 0xD0: JR(!(_P&Z_FLAG)); break; + +/* BMI */ +case 0x30: JR(_P&N_FLAG); break; + +/* BPL */ +case 0x10: JR(!(_P&N_FLAG)); break; + +/* BVC */ +case 0x50: JR(!(_P&V_FLAG)); break; + +/* BVS */ +case 0x70: JR(_P&V_FLAG); break; + +//default: printf("Bad %02x at $%04x\n",b1,X.PC);break; +//ifdef moo +/* Here comes the undocumented instructions block. Note that this implementation + may be "wrong". If so, please tell me. +*/ + +/* AAC */ +case 0x2B: +case 0x0B: LD_IM(AND;_P&=~C_FLAG;_P|=_A>>7); + +/* AAX */ +case 0x87: ST_ZP(_A&_X); +case 0x97: ST_ZPY(_A&_X); +case 0x8F: ST_AB(_A&_X); +case 0x83: ST_IX(_A&_X); + +/* ARR - ARGH, MATEY! */ +case 0x6B: { + uint8 arrtmp; + LD_IM(AND;_P&=~V_FLAG;_P|=(_A^(_A>>1))&0x40;arrtmp=_A>>7;_A>>=1;_A|=(_P&C_FLAG)<<7;_P&=~C_FLAG;_P|=arrtmp;X_ZN(_A)); + } +/* ASR */ +case 0x4B: LD_IM(AND;LSRA); + +/* ATX(OAL) Is this(OR with $EE) correct? */ +case 0xAB: LD_IM(_A|=0xEE;AND;_X=_A); + +/* AXS */ +case 0xCB: LD_IM(AXS); + +/* DCP */ +case 0xC7: RMW_ZP(DEC;CMP); +case 0xD7: RMW_ZPX(DEC;CMP); +case 0xCF: RMW_AB(DEC;CMP); +case 0xDF: RMW_ABX(DEC;CMP); +case 0xDB: RMW_ABY(DEC;CMP); +case 0xC3: RMW_IX(DEC;CMP); +case 0xD3: RMW_IY(DEC;CMP); + +/* ISB */ +case 0xE7: RMW_ZP(INC;SBC); +case 0xF7: RMW_ZPX(INC;SBC); +case 0xEF: RMW_AB(INC;SBC); +case 0xFF: RMW_ABX(INC;SBC); +case 0xFB: RMW_ABY(INC;SBC); +case 0xE3: RMW_IX(INC;SBC); +case 0xF3: RMW_IY(INC;SBC); + +/* DOP */ + +case 0x04: _PC++;break; +case 0x14: _PC++;break; +case 0x34: _PC++;break; +case 0x44: _PC++;break; +case 0x54: _PC++;break; +case 0x64: _PC++;break; +case 0x74: _PC++;break; + +case 0x80: _PC++;break; +case 0x82: _PC++;break; +case 0x89: _PC++;break; +case 0xC2: _PC++;break; +case 0xD4: _PC++;break; +case 0xE2: _PC++;break; +case 0xF4: _PC++;break; + +/* KIL */ + +case 0x02: +case 0x12: +case 0x22: +case 0x32: +case 0x42: +case 0x52: +case 0x62: +case 0x72: +case 0x92: +case 0xB2: +case 0xD2: +case 0xF2:ADDCYC(0xFF); + _jammed=1; + _PC--; + break; + +/* LAR */ +case 0xBB: RMW_ABY(_S&=x;_A=_X=_S;X_ZN(_X)); + +/* LAX */ +case 0xA7: LD_ZP(LDA;LDX); +case 0xB7: LD_ZPY(LDA;LDX); +case 0xAF: LD_AB(LDA;LDX); +case 0xBF: LD_ABY(LDA;LDX); +case 0xA3: LD_IX(LDA;LDX); +case 0xB3: LD_IY(LDA;LDX); + +/* NOP */ +case 0x1A: +case 0x3A: +case 0x5A: +case 0x7A: +case 0xDA: +case 0xFA: break; + +/* RLA */ +case 0x27: RMW_ZP(ROL;AND); +case 0x37: RMW_ZPX(ROL;AND); +case 0x2F: RMW_AB(ROL;AND); +case 0x3F: RMW_ABX(ROL;AND); +case 0x3B: RMW_ABY(ROL;AND); +case 0x23: RMW_IX(ROL;AND); +case 0x33: RMW_IY(ROL;AND); + +/* RRA */ +case 0x67: RMW_ZP(ROR;ADC); +case 0x77: RMW_ZPX(ROR;ADC); +case 0x6F: RMW_AB(ROR;ADC); +case 0x7F: RMW_ABX(ROR;ADC); +case 0x7B: RMW_ABY(ROR;ADC); +case 0x63: RMW_IX(ROR;ADC); +case 0x73: RMW_IY(ROR;ADC); + +/* SLO */ +case 0x07: RMW_ZP(ASL;ORA); +case 0x17: RMW_ZPX(ASL;ORA); +case 0x0F: RMW_AB(ASL;ORA); +case 0x1F: RMW_ABX(ASL;ORA); +case 0x1B: RMW_ABY(ASL;ORA); +case 0x03: RMW_IX(ASL;ORA); +case 0x13: RMW_IY(ASL;ORA); + +/* SRE */ +case 0x47: RMW_ZP(LSR;EOR); +case 0x57: RMW_ZPX(LSR;EOR); +case 0x4F: RMW_AB(LSR;EOR); +case 0x5F: RMW_ABX(LSR;EOR); +case 0x5B: RMW_ABY(LSR;EOR); +case 0x43: RMW_IX(LSR;EOR); +case 0x53: RMW_IY(LSR;EOR); + +/* AXA - SHA */ +case 0x93: ST_IY(_A&_X&(((A-_Y)>>8)+1)); +case 0x9F: ST_ABY(_A&_X&(((A-_Y)>>8)+1)); + +/* SYA */ +case 0x9C: ST_ABX(_Y&(((A-_X)>>8)+1)); + +/* SXA */ +case 0x9E: ST_ABY(_X&(((A-_Y)>>8)+1)); + +/* XAS */ +case 0x9B: _S=_A&_X;ST_ABY(_S& (((A-_Y)>>8)+1) ); + +/* TOP */ +case 0x0C: LD_AB(ARNOP); +case 0x1C: +case 0x3C: +case 0x5C: +case 0x7C: +case 0xDC: +case 0xFC: LD_ABX(ARNOP); + +/* XAA - BIG QUESTION MARK HERE */ +case 0x8B: _A|=0xEE; _A&=_X; LD_IM(AND); +//endif diff --git a/Mednafen/mednafen/nes/ppu/Makefile.am.inc b/Mednafen/mednafen/nes/ppu/Makefile.am.inc new file mode 100644 index 0000000000..99ff6eb518 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/Makefile.am.inc @@ -0,0 +1 @@ +libnes_a_SOURCES += ppu/ppu.cpp ppu/palette.cpp diff --git a/Mednafen/mednafen/nes/ppu/fast-pputile.h b/Mednafen/mednafen/nes/ppu/fast-pputile.h new file mode 100644 index 0000000000..1de303e697 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/fast-pputile.h @@ -0,0 +1,95 @@ + uint8 *C; + register uint8 cc; + uint32 vadr; + + #if !defined(PPUT_MMC5SP) && !defined(PPUT_MMC5CHR1) + register uint8 zz; + #endif + + { + uint8 *S=PALRAMCache; + uint32 pixdata; + + pixdata=ppulut1[(pshift[0]>>XOC)&0xFF] | ppulut2[(pshift[1]>>XOC)&0xFF]; + pixdata|=ppulut3[XOffset|((atlatch&0xf)<<3)]; + + P[0]=S[pixdata&0xF]; + pixdata>>=4; + P[1]=S[pixdata&0xF]; + pixdata>>=4; + P[2]=S[pixdata&0xF]; + pixdata>>=4; + P[3]=S[pixdata&0xF]; + pixdata>>=4; + P[4]=S[pixdata&0xF]; + pixdata>>=4; + P[5]=S[pixdata&0xF]; + pixdata>>=4; + P[6]=S[pixdata&0xF]; + pixdata>>=4; + P[7]=S[pixdata&0xF]; + P+=8; + } + + #ifdef PPUT_HOOK + PPU_hook(0x2000|(RefreshAddr&0xfff)); + #endif + + #ifdef PPUT_MMC5SP + vadr=(MMC5HackExNTARAMPtr[xs|(ys<<5)]<<4)+(vofs&7); + #else + #ifndef PPUT_MMC5CHR1 + zz=RefreshAddr&0x1F; + #endif + C=vnapage[(RefreshAddr>>10)&3]; + vadr=(C[RefreshAddr&0x3ff]<<4)+vofs; /* Fetch name table byte. */ + #endif + + + #ifdef PPUT_MMC5SP + cc=MMC5HackExNTARAMPtr[0x3c0+(xs>>2)+((ys&0x1C)<<1)]; + cc=((cc >> ((xs&2) + ((ys&0x2)<<1))) &3); + #else + #ifdef PPUT_MMC5CHR1 + cc=(MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff] & 0xC0)>>6; + #else + cc=C[0x3c0+(zz>>2)+((RefreshAddr&0x380)>>4)]; /* Fetch attribute table byte. */ + cc=((cc >> ((zz&2) + ((RefreshAddr&0x40)>>4))) &3); + #endif + #endif + + atlatch|=cc<<4; + + #ifdef PPUT_MMC5SP + C = MMC5HackVROMPTR+vadr; + C += ((MMC5HackSPPage & 0x3f & MMC5HackVROMMask) << 12); + #else + #ifdef PPUT_MMC5CHR1 + C = MMC5HackVROMPTR; + C += (((MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff]) & 0x3f & MMC5HackVROMMask) << 12) + (vadr & 0xfff); + #elif defined(PPUT_MMC5) + C=MMC5BGVRAMADR(vadr); + #else + C = VRAMADR(vadr); + #endif + #endif + + #ifdef PPUT_HOOK + PPU_hook(vadr | 8); + #endif + + pshift[0]|=C[0]; + pshift[1]|=C[8]; + + pshift[0]<<=8; + pshift[1]<<=8; + atlatch >>= 2; + if((RefreshAddr&0x1f)==0x1f) + RefreshAddr^=0x41F; + else + RefreshAddr++; + + #ifdef PPUT_HOOK + PPU_hook(0x2000|(RefreshAddr&0xfff)); + #endif + diff --git a/Mednafen/mednafen/nes/ppu/palette.cpp b/Mednafen/mednafen/nes/ppu/palette.cpp new file mode 100644 index 0000000000..93f7e7c3f2 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palette.cpp @@ -0,0 +1,137 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002,2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../nes.h" +#include "../input.h" +#include +#include "palette.h" +#include + +namespace MDFN_IEN_NES +{ + +static const MDFNPalStruct rp2c04_0001[64] = { + #include "palettes/rp2c04-0001.h" +}; + +static const MDFNPalStruct rp2c04_0002[64] = { + #include "palettes/rp2c04-0002.h" +}; + +static const MDFNPalStruct rp2c04_0003[64] = { + #include "palettes/rp2c04-0003.h" +}; + +static const MDFNPalStruct rp2c04_0004[64] = { + #include "palettes/rp2c04-0004.h" +}; + +static const MDFNPalStruct rp2c0x[64] = { + #include "palettes/rp2c0x.h" +}; + +/* Default palette */ +static const MDFNPalStruct default_palette[64] = { + #include "palettes/default.h" +}; + + +MDFNPalStruct ActiveNESPalette[0x200]; + +const CustomPalette_Spec NES_CPInfo[7 + 1] = +{ + { gettext_noop("NTSC NES/Famicom Palette"), NULL, { 64, 512, 0 } }, + { gettext_noop("PAL NES Palette"), "nes-pal", { 64, 512, 0 } }, + + { gettext_noop("Arcade RP2C04-0001 Palette"), "rp2c04-0001", { 64, 0 } }, + { gettext_noop("Arcade RP2C04-0002 Palette"), "rp2c04-0002", { 64, 0 } }, + { gettext_noop("Arcade RP2C04-0003 Palette"), "rp2c04-0003", { 64, 0 } }, + { gettext_noop("Arcade RP2C04-0004 Palette"), "rp2c04-0004", { 64, 0 } }, + + { gettext_noop("Arcade RP2C03/RP2C05 Palette"), "rp2c0x", { 64, 0 } }, + + { NULL, NULL }, +}; + +static const MDFNPalStruct *Palettes[7] = +{ + default_palette, + default_palette, + + rp2c04_0001, + rp2c04_0002, + rp2c04_0003, + rp2c04_0004, + rp2c0x +}; + +void MDFN_InitPalette(const unsigned int which, const uint8* custom_palette, const unsigned cp_numentries) +{ +#if 0 + static const double rtmul[8] = { 1.000000, 1.098460, 0.738724, 0.813256, 0.855748, 0.884351, 0.661166, 0.75 }; + static const double gtmul[8] = { 1.000000, 0.800111, 1.041284, 0.797887, 0.835279, 0.680845, 0.819155, 0.75 }; + static const double btmul[8] = { 1.000000, 0.836181, 0.722674, 0.657716, 1.188771, 0.961351, 0.897613, 0.75 }; +#endif + static const double rtmul[8] = { 1, 1.239, .794, 1.019, .905, 1.023, .741, .75 }; + static const double gtmul[8] = { 1, .915, 1.086, .98, 1.026, .908, .987, .75 }; + static const double btmul[8] = { 1, .743, .882, .653, 1.277, .979, .101, .75 }; + const MDFNPalStruct *palette = Palettes[which]; + + for(int x = 0; x < 0x200; x++) + { + unsigned emp = (which >= 2) ? 0 : (x >> 6); + int r, g, b; + + if(custom_palette) + { + unsigned cpx = x % cp_numentries; + + if(cpx >= 64) + emp = 0; + + r = custom_palette[cpx * 3 + 0]; + g = custom_palette[cpx * 3 + 1]; + b = custom_palette[cpx * 3 + 2]; + } + else + { + r = palette[x & 0x3F].r; + g = palette[x & 0x3F].g; + b = palette[x & 0x3F].b; + } + + r = (int)(r * rtmul[emp]); + g = (int)(g * gtmul[emp]); + b = (int)(b * btmul[emp]); + + + if(r > 255) r = 255; + if(g > 255) g = 255; + if(b > 255) b = 255; + + ActiveNESPalette[x].r = r; + ActiveNESPalette[x].g = g; + ActiveNESPalette[x].b = b; + } + + NESINPUT_PaletteChanged(); +} + +} diff --git a/Mednafen/mednafen/nes/ppu/palette.h b/Mednafen/mednafen/nes/ppu/palette.h new file mode 100644 index 0000000000..fe73b7ce94 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palette.h @@ -0,0 +1,19 @@ +#ifndef _PPU_PALETTEH +#define _PPU_PALETTEH + +namespace MDFN_IEN_NES +{ + +typedef struct { + uint8 r,g,b; +} MDFNPalStruct; + +extern MDFNPalStruct ActiveNESPalette[0x200]; + +extern const CustomPalette_Spec NES_CPInfo[]; + +void MDFN_InitPalette(const unsigned int which, const uint8* custom_palette, const unsigned cp_numentries); + +} + +#endif diff --git a/Mednafen/mednafen/nes/ppu/palettes/default.h b/Mednafen/mednafen/nes/ppu/palettes/default.h new file mode 100644 index 0000000000..8510bb5024 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palettes/default.h @@ -0,0 +1,64 @@ + { 0x1D<<2, 0x1D<<2, 0x1D<<2 }, /* Value 0 */ + { 0x09<<2, 0x06<<2, 0x23<<2 }, /* Value 1 */ + { 0x00<<2, 0x00<<2, 0x2A<<2 }, /* Value 2 */ + { 0x11<<2, 0x00<<2, 0x27<<2 }, /* Value 3 */ + { 0x23<<2, 0x00<<2, 0x1D<<2 }, /* Value 4 */ + { 0x2A<<2, 0x00<<2, 0x04<<2 }, /* Value 5 */ + { 0x29<<2, 0x00<<2, 0x00<<2 }, /* Value 6 */ + { 0x1F<<2, 0x02<<2, 0x00<<2 }, /* Value 7 */ + { 0x10<<2, 0x0B<<2, 0x00<<2 }, /* Value 8 */ + { 0x00<<2, 0x11<<2, 0x00<<2 }, /* Value 9 */ + { 0x00<<2, 0x14<<2, 0x00<<2 }, /* Value 10 */ + { 0x00<<2, 0x0F<<2, 0x05<<2 }, /* Value 11 */ + { 0x06<<2, 0x0F<<2, 0x17<<2 }, /* Value 12 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 13 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 14 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 15 */ + { 0x2F<<2, 0x2F<<2, 0x2F<<2 }, /* Value 16 */ + { 0x00<<2, 0x1C<<2, 0x3B<<2 }, /* Value 17 */ + { 0x08<<2, 0x0E<<2, 0x3B<<2 }, /* Value 18 */ + { 0x20<<2, 0x00<<2, 0x3C<<2 }, /* Value 19 */ + { 0x2F<<2, 0x00<<2, 0x2F<<2 }, /* Value 20 */ + { 0x39<<2, 0x00<<2, 0x16<<2 }, /* Value 21 */ + { 0x36<<2, 0x0A<<2, 0x00<<2 }, /* Value 22 */ + { 0x32<<2, 0x13<<2, 0x03<<2 }, /* Value 23 */ + { 0x22<<2, 0x1C<<2, 0x00<<2 }, /* Value 24 */ + { 0x00<<2, 0x25<<2, 0x00<<2 }, /* Value 25 */ + { 0x00<<2, 0x2A<<2, 0x00<<2 }, /* Value 26 */ + { 0x00<<2, 0x24<<2, 0x0E<<2 }, /* Value 27 */ + { 0x00<<2, 0x20<<2, 0x22<<2 }, /* Value 28 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 29 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 30 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 31 */ + { 0x3F<<2, 0x3F<<2, 0x3F<<2 }, /* Value 32 */ + { 0x0F<<2, 0x2F<<2, 0x3F<<2 }, /* Value 33 */ + { 0x17<<2, 0x25<<2, 0x3F<<2 }, /* Value 34 */ + { 0x10<<2, 0x22<<2, 0x3F<<2 }, /* Value 35 */ + { 0x3D<<2, 0x1E<<2, 0x3F<<2 }, /* Value 36 */ + { 0x3F<<2, 0x1D<<2, 0x2D<<2 }, /* Value 37 */ + { 0x3F<<2, 0x1D<<2, 0x18<<2 }, /* Value 38 */ + { 0x3F<<2, 0x26<<2, 0x0E<<2 }, /* Value 39 */ + { 0x3C<<2, 0x2F<<2, 0x0F<<2 }, /* Value 40 */ + { 0x20<<2, 0x34<<2, 0x04<<2 }, /* Value 41 */ + { 0x13<<2, 0x37<<2, 0x12<<2 }, /* Value 42 */ + { 0x16<<2, 0x3E<<2, 0x26<<2 }, /* Value 43 */ + { 0x00<<2, 0x3A<<2, 0x36<<2 }, /* Value 44 */ + { 0x1E<<2, 0x1E<<2, 0x1E<<2 }, /* Value 45 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 46 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 47 */ + { 0x3F<<2, 0x3F<<2, 0x3F<<2 }, /* Value 48 */ + { 0x2A<<2, 0x39<<2, 0x3F<<2 }, /* Value 49 */ + { 0x31<<2, 0x35<<2, 0x3F<<2 }, /* Value 50 */ + { 0x35<<2, 0x32<<2, 0x3F<<2 }, /* Value 51 */ + { 0x3F<<2, 0x31<<2, 0x3F<<2 }, /* Value 52 */ + { 0x3F<<2, 0x31<<2, 0x36<<2 }, /* Value 53 */ + { 0x3F<<2, 0x2F<<2, 0x2C<<2 }, /* Value 54 */ + { 0x3F<<2, 0x36<<2, 0x2A<<2 }, /* Value 55 */ + { 0x3F<<2, 0x39<<2, 0x28<<2 }, /* Value 56 */ + { 0x38<<2, 0x3F<<2, 0x28<<2 }, /* Value 57 */ + { 0x2A<<2, 0x3C<<2, 0x2F<<2 }, /* Value 58 */ + { 0x2C<<2, 0x3F<<2, 0x33<<2 }, /* Value 59 */ + { 0x27<<2, 0x3F<<2, 0x3C<<2 }, /* Value 60 */ + { 0x31<<2, 0x31<<2, 0x31<<2 }, /* Value 61 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 62 */ + { 0x00<<2, 0x00<<2, 0x00<<2 }, /* Value 63 */ diff --git a/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0001.h b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0001.h new file mode 100644 index 0000000000..484e541e45 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0001.h @@ -0,0 +1,64 @@ + { 0xff, 0xb6, 0xb6 }, + { 0xda, 0x6d, 0xff }, + { 0xff, 0x00, 0x00 }, + { 0x91, 0x91, 0xff }, + { 0x00, 0x91, 0x91 }, + { 0x24, 0x48, 0x00 }, + { 0x48, 0x48, 0x48 }, + { 0xff, 0x00, 0x91 }, + { 0xff, 0xff, 0xff }, + { 0x6d, 0x6d, 0x6d }, + { 0xff, 0xb6, 0x00 }, + { 0xb6, 0x00, 0x6d }, + { 0x91, 0x00, 0x6d }, + { 0xda, 0xda, 0x00 }, + { 0x6d, 0x48, 0x00 }, + { 0xff, 0xff, 0xff }, + { 0x6d, 0xb6, 0xff }, + { 0xda, 0xb6, 0x6d }, + { 0x6d, 0x24, 0x00 }, + { 0x6d, 0xda, 0x00 }, + { 0x91, 0xda, 0xff }, + { 0xda, 0xb6, 0xff }, + { 0xff, 0xda, 0x91 }, + { 0x00, 0x48, 0xff }, + { 0xff, 0xda, 0x00 }, + { 0x48, 0xff, 0xda }, + { 0x00, 0x00, 0x00 }, + { 0x48, 0x00, 0x00 }, + { 0xda, 0xda, 0xda }, + { 0x91, 0x91, 0x91 }, + { 0xff, 0x00, 0xff }, + { 0x00, 0x24, 0x91 }, + { 0x00, 0x00, 0x6d }, + { 0xb6, 0xda, 0xff }, + { 0xff, 0xb6, 0xff }, + { 0x00, 0xff, 0x00 }, + { 0x00, 0xff, 0xff }, + { 0x00, 0x48, 0x48 }, + { 0x00, 0xb6, 0x6d }, + { 0xb6, 0x00, 0xff }, + { 0x00, 0x00, 0x00 }, + { 0x91, 0x48, 0x00 }, + { 0xff, 0x91, 0xff }, + { 0xb6, 0x24, 0x00 }, + { 0x91, 0x00, 0xff }, + { 0x00, 0x00, 0xda }, + { 0xff, 0x91, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x24, 0x91, 0x00 }, + { 0xb6, 0xb6, 0xb6 }, + { 0x00, 0x6d, 0x24 }, + { 0xb6, 0xff, 0x48 }, + { 0x6d, 0x48, 0xda }, + { 0xff, 0xff, 0x00 }, + { 0xda, 0x6d, 0x00 }, + { 0x00, 0x48, 0x00 }, + { 0x00, 0x6d, 0xda }, + { 0x00, 0x91, 0x00 }, + { 0x24, 0x24, 0x24 }, + { 0xff, 0xff, 0x6d }, + { 0xff, 0x6d, 0xff }, + { 0x91, 0x6d, 0x00 }, + { 0x91, 0xff, 0x6d }, diff --git a/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0002.h b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0002.h new file mode 100644 index 0000000000..f826e1961d --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0002.h @@ -0,0 +1,64 @@ + { 0x00, 0x00, 0x00 }, + { 0xff, 0xb6, 0x00 }, + { 0x91, 0x6d, 0x00 }, + { 0xb6, 0xff, 0x48 }, + { 0x91, 0xff, 0x6d }, + { 0xff, 0x6d, 0xff }, + { 0x00, 0x91, 0x91 }, + { 0xb6, 0xda, 0xff }, + { 0xff, 0x00, 0x00 }, + { 0x91, 0x00, 0xff }, + { 0xff, 0xff, 0x6d }, + { 0xff, 0x91, 0xff }, + { 0xff, 0xff, 0xff }, + { 0xda, 0x6d, 0xff }, + { 0x91, 0xda, 0xff }, + { 0x00, 0x91, 0x00 }, + { 0x00, 0x48, 0x00 }, + { 0x6d, 0xb6, 0xff }, + { 0xb6, 0x24, 0x00 }, + { 0xda, 0xda, 0xda }, + { 0x00, 0xb6, 0x6d }, + { 0x6d, 0xda, 0x00 }, + { 0x48, 0x00, 0x00 }, + { 0x91, 0x91, 0xff }, + { 0x48, 0x48, 0x48 }, + { 0xff, 0x00, 0xff }, + { 0x00, 0x00, 0x6d }, + { 0x48, 0xff, 0xda }, + { 0xda, 0xb6, 0xff }, + { 0x6d, 0x48, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x6d, 0x48, 0xda }, + { 0x91, 0x00, 0x6d }, + { 0xff, 0xda, 0x91 }, + { 0xff, 0x91, 0x00 }, + { 0xff, 0xb6, 0xff }, + { 0x00, 0x6d, 0xda }, + { 0x6d, 0x24, 0x00 }, + { 0xb6, 0xb6, 0xb6 }, + { 0x00, 0x00, 0xda }, + { 0xb6, 0x00, 0xff }, + { 0xff, 0xda, 0x00 }, + { 0x6d, 0x6d, 0x6d }, + { 0x24, 0x48, 0x00 }, + { 0x00, 0x48, 0xff }, + { 0x00, 0x00, 0x00 }, + { 0xda, 0xda, 0x00 }, + { 0xff, 0xff, 0xff }, + { 0xda, 0xb6, 0x6d }, + { 0x24, 0x24, 0x24 }, + { 0x00, 0xff, 0x00 }, + { 0xda, 0x6d, 0x00 }, + { 0x00, 0x48, 0x48 }, + { 0x00, 0x24, 0x91 }, + { 0xff, 0x00, 0x91 }, + { 0x24, 0x91, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0xff, 0xff }, + { 0x91, 0x48, 0x00 }, + { 0xff, 0xff, 0x00 }, + { 0xff, 0xb6, 0xb6 }, + { 0xb6, 0x00, 0x6d }, + { 0x00, 0x6d, 0x24 }, + { 0x91, 0x91, 0x91 }, diff --git a/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0003.h b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0003.h new file mode 100644 index 0000000000..53c75f874a --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0003.h @@ -0,0 +1,64 @@ + { 0xb6, 0x00, 0xff }, + { 0xff, 0x6d, 0xff }, + { 0x91, 0xff, 0x6d }, + { 0xb6, 0xb6, 0xb6 }, + { 0x00, 0x91, 0x00 }, + { 0xff, 0xff, 0xff }, + { 0xb6, 0xda, 0xff }, + { 0x24, 0x48, 0x00 }, + { 0x00, 0x24, 0x91 }, + { 0x00, 0x00, 0x00 }, + { 0xff, 0xda, 0x91 }, + { 0x6d, 0x48, 0x00 }, + { 0xff, 0x00, 0x91 }, + { 0xda, 0xda, 0xda }, + { 0xda, 0xb6, 0x6d }, + { 0x91, 0xda, 0xff }, + { 0x91, 0x91, 0xff }, + { 0x00, 0x91, 0x91 }, + { 0xb6, 0x00, 0x6d }, + { 0x00, 0x48, 0xff }, + { 0x24, 0x91, 0x00 }, + { 0x91, 0x6d, 0x00 }, + { 0xda, 0x6d, 0x00 }, + { 0x00, 0xb6, 0x6d }, + { 0x6d, 0x6d, 0x6d }, + { 0x6d, 0x48, 0xda }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0xda }, + { 0xff, 0x00, 0x00 }, + { 0xb6, 0x24, 0x00 }, + { 0xff, 0x91, 0xff }, + { 0xff, 0xb6, 0xb6 }, + { 0xda, 0x6d, 0xff }, + { 0x00, 0x48, 0x00 }, + { 0x00, 0x00, 0x6d }, + { 0xff, 0xff, 0x00 }, + { 0x24, 0x24, 0x24 }, + { 0xff, 0xb6, 0x00 }, + { 0xff, 0x91, 0x00 }, + { 0xff, 0xff, 0xff }, + { 0x6d, 0xda, 0x00 }, + { 0x91, 0x00, 0x6d }, + { 0x6d, 0xb6, 0xff }, + { 0xff, 0x00, 0xff }, + { 0x00, 0x6d, 0xda }, + { 0x91, 0x91, 0x91 }, + { 0x00, 0x00, 0x00 }, + { 0x6d, 0x24, 0x00 }, + { 0x00, 0xff, 0xff }, + { 0x48, 0x00, 0x00 }, + { 0xb6, 0xff, 0x48 }, + { 0xff, 0xb6, 0xff }, + { 0x91, 0x48, 0x00 }, + { 0x00, 0xff, 0x00 }, + { 0xda, 0xda, 0x00 }, + { 0x48, 0x48, 0x48 }, + { 0x00, 0x6d, 0x24 }, + { 0x00, 0x00, 0x00 }, + { 0xda, 0xb6, 0xff }, + { 0xff, 0xff, 0x6d }, + { 0x91, 0x00, 0xff }, + { 0x48, 0xff, 0xda }, + { 0xff, 0xda, 0x00 }, + { 0x00, 0x48, 0x48 }, diff --git a/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0004.h b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0004.h new file mode 100644 index 0000000000..207760ec7f --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palettes/rp2c04-0004.h @@ -0,0 +1,64 @@ + { 0x91, 0x6d, 0x00 }, + { 0x6d, 0x48, 0xda }, + { 0x00, 0x91, 0x91 }, + { 0xda, 0xda, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0xff, 0xb6, 0xb6 }, + { 0x00, 0x24, 0x91 }, + { 0xda, 0x6d, 0x00 }, + { 0xb6, 0xb6, 0xb6 }, + { 0x6d, 0x24, 0x00 }, + { 0x00, 0xff, 0x00 }, + { 0x00, 0x00, 0x6d }, + { 0xff, 0xda, 0x91 }, + { 0xff, 0xff, 0x00 }, + { 0x00, 0x91, 0x00 }, + { 0xb6, 0xff, 0x48 }, + { 0xff, 0x6d, 0xff }, + { 0x48, 0x00, 0x00 }, + { 0x00, 0x48, 0xff }, + { 0xff, 0x91, 0xff }, + { 0x00, 0x00, 0x00 }, + { 0x48, 0x48, 0x48 }, + { 0xb6, 0x24, 0x00 }, + { 0xff, 0x91, 0x00 }, + { 0xda, 0xb6, 0x6d }, + { 0x00, 0xb6, 0x6d }, + { 0x91, 0x91, 0xff }, + { 0x24, 0x91, 0x00 }, + { 0x91, 0x00, 0x6d }, + { 0x00, 0x00, 0x00 }, + { 0x91, 0xff, 0x6d }, + { 0x6d, 0xb6, 0xff }, + { 0xb6, 0x00, 0x6d }, + { 0x00, 0x6d, 0x24 }, + { 0x91, 0x48, 0x00 }, + { 0x00, 0x00, 0xda }, + { 0x91, 0x00, 0xff }, + { 0xb6, 0x00, 0xff }, + { 0x6d, 0x6d, 0x6d }, + { 0xff, 0x00, 0x91 }, + { 0x00, 0x48, 0x48 }, + { 0xda, 0xda, 0xda }, + { 0x00, 0x6d, 0xda }, + { 0x00, 0x48, 0x00 }, + { 0x24, 0x24, 0x24 }, + { 0xff, 0xff, 0x6d }, + { 0x91, 0x91, 0x91 }, + { 0xff, 0x00, 0xff }, + { 0xff, 0xb6, 0xff }, + { 0xff, 0xff, 0xff }, + { 0x6d, 0x48, 0x00 }, + { 0xff, 0x00, 0x00 }, + { 0xff, 0xda, 0x00 }, + { 0x48, 0xff, 0xda }, + { 0xff, 0xff, 0xff }, + { 0x91, 0xda, 0xff }, + { 0x00, 0x00, 0x00 }, + { 0xff, 0xb6, 0x00 }, + { 0xda, 0x6d, 0xff }, + { 0xb6, 0xda, 0xff }, + { 0x6d, 0xda, 0x00 }, + { 0xda, 0xb6, 0xff }, + { 0x00, 0xff, 0xff }, + { 0x24, 0x48, 0x00 }, diff --git a/Mednafen/mednafen/nes/ppu/palettes/rp2c0x.h b/Mednafen/mednafen/nes/ppu/palettes/rp2c0x.h new file mode 100644 index 0000000000..2a32d1c52f --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/palettes/rp2c0x.h @@ -0,0 +1,64 @@ + { 0x6d, 0x6d, 0x6d }, + { 0x00, 0x24, 0x91 }, + { 0x00, 0x00, 0xda }, + { 0x6d, 0x48, 0xda }, + { 0x91, 0x00, 0x6d }, + { 0xb6, 0x00, 0x6d }, + { 0xb6, 0x24, 0x00 }, + { 0x91, 0x48, 0x00 }, + { 0x6d, 0x48, 0x00 }, + { 0x24, 0x48, 0x00 }, + { 0x00, 0x6d, 0x24 }, + { 0x00, 0x91, 0x00 }, + { 0x00, 0x48, 0x48 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0xb6, 0xb6, 0xb6 }, + { 0x00, 0x6d, 0xda }, + { 0x00, 0x48, 0xff }, + { 0x91, 0x00, 0xff }, + { 0xb6, 0x00, 0xff }, + { 0xff, 0x00, 0x91 }, + { 0xff, 0x00, 0x00 }, + { 0xda, 0x6d, 0x00 }, + { 0x91, 0x6d, 0x00 }, + { 0x24, 0x91, 0x00 }, + { 0x00, 0x91, 0x00 }, + { 0x00, 0xb6, 0x6d }, + { 0x00, 0x91, 0x91 }, + { 0x24, 0x24, 0x24 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0xff, 0xff, 0xff }, + { 0x6d, 0xb6, 0xff }, + { 0x91, 0x91, 0xff }, + { 0xda, 0x6d, 0xff }, + { 0xff, 0x00, 0xff }, + { 0xff, 0x6d, 0xff }, + { 0xff, 0x91, 0x00 }, + { 0xff, 0xb6, 0x00 }, + { 0xda, 0xda, 0x00 }, + { 0x6d, 0xda, 0x00 }, + { 0x00, 0xff, 0x00 }, + { 0x48, 0xff, 0xda }, + { 0x00, 0xff, 0xff }, + { 0x48, 0x48, 0x48 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0xff, 0xff, 0xff }, + { 0xb6, 0xda, 0xff }, + { 0xda, 0xb6, 0xff }, + { 0xff, 0xb6, 0xff }, + { 0xff, 0x91, 0xff }, + { 0xff, 0xb6, 0xb6 }, + { 0xff, 0xda, 0x91 }, + { 0xff, 0xff, 0x48 }, + { 0xff, 0xff, 0x6d }, + { 0xb6, 0xff, 0x48 }, + { 0x91, 0xff, 0x6d }, + { 0x48, 0xff, 0xda }, + { 0x91, 0xda, 0xff }, + { 0x91, 0x91, 0x91 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, diff --git a/Mednafen/mednafen/nes/ppu/ppu-fastrl.h b/Mednafen/mednafen/nes/ppu/ppu-fastrl.h new file mode 100644 index 0000000000..9b4f135b62 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/ppu-fastrl.h @@ -0,0 +1,242 @@ +/* Mednafen - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +static void FastRefreshLine(int firsttile, uint8 *target) +{ + if(scanline == -1) return; + + uint32 smorkus=RefreshAddr; + + #define RefreshAddr smorkus + uint32 vofs; + int X1; + int XOC; + + register uint8 *P; + static int norecurse=0; /* Prevent recursion: + PPU_hook() functions can call + mirroring/chr bank switching functions, + which call MDFNPPU_LineUpdate, which call this + function. */ + if(norecurse) return; + + target += firsttile << 3; + P = target; + + vofs=((PPU[0]&0x10)<<8) | ((RefreshAddr>>12)&7); + + memset(emphlinebuf + (firsttile << 3), PPU[1] >> 5, (32 - firsttile) << 3); + + if(!ScreenON && !SpriteON) + { + memset(target,PALRAM[poopoo()],(32 - firsttile)<<3); + return; + } + + if(!RCBGOn) + { + memset(target, PALRAM[0] | 0x40, (32 - firsttile)<<3); + return; + } + /* Priority bits, needed for sprite emulation. */ + PALRAMCache[0x0]=PALRAMCache[0x4]=PALRAMCache[0x8]=PALRAMCache[0xC]=PALRAM[0] | 64; + + /* This high-level graphics MMC5 emulation code was written + for MMC5 carts in "CL" mode. It's probably not totally + correct for carts in "SL" mode. + */ + + XOC = 16 - XOffset; + + #define PPUT_MMC5 + if(MMC5Hack && geniestage!=1) + { + if(MMC5HackCHRMode==0 && (MMC5HackSPMode&0x80)) + { + for(X1=firsttile;X1<32;X1++) + { + if((tochange<=0 && MMC5HackSPMode&0x40) || (tochange>0 && !(MMC5HackSPMode&0x40))) + { + #define PPUT_MMC5SP + #include "fast-pputile.h" + #undef PPUT_MMC5SP + } + else + { + #include "fast-pputile.h" + } + tochange--; + xs++; + } + } + else if(MMC5HackCHRMode==1 && (MMC5HackSPMode&0x80)) + { + #define PPUT_MMC5SP + #define PPUT_MMC5CHR1 + for(X1=firsttile;X1<32;X1++) + { + #include "fast-pputile.h" + } + #undef PPUT_MMC5CHR1 + #undef PPUT_MMC5SP + } + else if(MMC5HackCHRMode==1) + { + #define PPUT_MMC5CHR1 + for(X1=firsttile;X1<32;X1++) + { + #include "fast-pputile.h" + } + #undef PPUT_MMC5CHR1 + } + else + { + for(X1=firsttile;X1<32;X1++) + { + #include "fast-pputile.h" + } + } + } + #undef PPUT_MMC5 + else if(PPU_hook) + { + norecurse=1; + #define PPUT_HOOK + for(X1=firsttile;X1<32;X1++) + { + #include "fast-pputile.h" + } + #undef PPUT_HOOK + norecurse=0; + } + else + { + for(X1=firsttile;X1<32;X1++) + { + #include "fast-pputile.h" + } + } + + #undef vofs + #undef RefreshAddr + + RefreshAddr=smorkus; + if(!firsttile && !(PPU[1]&2)) + memset(target, PALRAM[0] | 0x40, 8); +} + +static void FastLineEffects(int firsttile, uint8 *target) +{ + if(scanline == -1) return; + + if(ScreenON || SpriteON) + { + if(PPU[1]&0x01) + { + for(int x = 63; x >= 0; x--) + { + uint8* p = &target[x << 2]; + + MDFN_ennsb(p, MDFN_densb(p) & 0x30303030); + } + } + } +} + +static void FastCopySprites(int firsttile, uint8 *target, int skip) +{ + uint8 n=((PPU[1]&4)^4)<<1; + uint8 *P=target; + + if(scanline == -1) return; + + if(sphitx != 0x100 && scanline >= 0) + { + int meep, maxmeep, firstmeep; + + firstmeep = sphitx; + maxmeep = sphitx + 8; + + if(firstmeep < (firsttile << 3)) firstmeep = firsttile << 3; + if(maxmeep > 255) maxmeep = 255; // Don't go over 256 pixels(the screen isn't that wide!), and don't check on the 255th column(NES PPU bug). + + for(meep = firstmeep; meep < maxmeep; meep++) + { + if((sphitdata & (0x80 >> (meep - sphitx)))&& !(target[meep]&64)) + { + //printf("Hit: %d\n",scanline); + PPU_status |= 0x40; + } + } + } + + if(rendis & 1) + MDFN_FastU32MemsetM8((uint32 *)(target + firsttile * 8), 0x40404040 | 0x3C3C3C3C, (256 - firsttile * 8) / sizeof(uint32)); + + if(!RCSPROn || skip) return; + + if(n < (firsttile << 3)) n = firsttile << 3; + +#if 0 //defined(__MMX__) + { + __m64 foofoo = _mm_set1_pi8(0xFF); + __m64 fourfour = _mm_set1_pi8(0x40); + + do + { + __m64 t = *(__m64*)&sprlinebuf[n]; + __m64 poo = *(__m64*)&P[n]; + __m64 choo, bgmask, sprmask; + + choo = _mm_srli_pi32(_mm_and_si64(_mm_or_si64(_mm_xor_si64(_mm_or_si64(poo, t), foofoo), _mm_srli_pi32(t, 1)), fourfour), 6); + bgmask = _mm_add_pi8(choo, foofoo); + sprmask = _mm_xor_si64(bgmask, foofoo); + + *(__m64*)&P[n] = _mm_or_si64(_mm_and_si64(t, bgmask), _mm_and_si64(poo, sprmask)); + n += 8; + } while(n); + _mm_empty(); + } +#else + do + { + #ifdef HAVE_NATIVE64BIT + uint64 t = MDFN_densb(sprlinebuf + n); + uint64 poo = MDFN_densb(P + n); + uint64 choo = (((~(poo | t)) | (t >> 1)) & 0x4040404040404040) >> 6; + uint64 bgmask = ((choo - 0x01) & 0xFF) | ((choo - 0x0100) & 0xFF00) | ((choo - 0x010000) & 0xFF0000) | ((choo - 0x01000000) & 0xFF000000) | + ((choo - 0x0100000000) & 0xFF00000000) | ((choo - 0x010000000000) & 0xFF0000000000) | ((choo - 0x01000000000000) & 0xFF000000000000) | ((choo - 0x0100000000000000) & 0xFF00000000000000); + uint64 sprmask = ~bgmask; + + MDFN_ennsb(P + n, (t & bgmask) | (poo & sprmask)); + n += 8; + #else + uint32 t = MDFN_densb(sprlinebuf + n); + uint32 poo = MDFN_densb(P + n); + uint32 choo = (((~(poo | t)) | (t >> 1)) & 0x40404040) >> 6; + uint32 bgmask = ((choo - 0x01) & 0xFF) | ((choo - 0x0100) & 0xFF00) | ((choo - 0x010000) & 0xFF0000) | ((choo - 0x01000000) & 0xFF000000); + uint32 sprmask = ~bgmask; + + MDFN_ennsb(P + n, (t & bgmask) | (poo & sprmask)); + n += 4; + #endif + } while(n); +#endif +} diff --git a/Mednafen/mednafen/nes/ppu/ppu-subline.h b/Mednafen/mednafen/nes/ppu/ppu-subline.h new file mode 100644 index 0000000000..39c4cbeea8 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/ppu-subline.h @@ -0,0 +1,90 @@ + if(firstpixel == 256 && lastpixel == 341) + { + Fixit2(); + if(MMC5Mode >= 3) + { + xs = 0; + tochange = MMC5HackSPMode&0x1F; + } + if(scanline == -1) + RefreshAddr = TempAddr; + + FetchNT(MMC5Mode); + FetchAT(MMC5Mode); + FetchCD1(MMC5Mode); + FetchCD2(MMC5Mode); + FetchNT(MMC5Mode); + FetchAT(MMC5Mode); + FetchCD1(MMC5Mode); + FetchCD2(MMC5Mode); + + //printf("Meow: %d %d %d\n", scanline, firstpixel, lastpixel); + } + else + for(x=firstpixel; x= 0) + { + uint8 *S=PALRAMCache; + uint32 pixdata; + + pixdata=ppulut1[(pshift[0]>>(16-XOffset)) &0xFF]|ppulut2[(pshift[1]>>(16-XOffset)) &0xFF]; + pixdata|=ppulut3[XOffset|((atlatch&0xf)<<3)]; + + if(!RCBGOn) pixdata = 0; + if(!(PPU[1]&2) && x < 8) pixdata = 0; + + emphlinebuf[x] = PPU[1] >> 5; + Pline[x] = S[(pixdata >> (4 * (x&7))) & 0xF]; + + if(RCSPROn && ((PPU[1]&4) || x>= 8)) + { + if(sphitx != 0x100 && scanline >= 0) + { + if(x >= sphitx && x < (sphitx + 8) && x < 255) // Don't check on column 255. + if((sphitdata & (0x80 >> (x - sphitx)))&& !(Pline[x]&64)) + { +// printf("Slow Hit: %d\n",scanline); + PPU_status |= 0x40; + sphitx = 0x100; + } + } + if(!(sprlinebuf[x] & 0x80)) + { + if((sprlinebuf[x]&0x40) || (Pline[x] & 0x40)) + Pline[x] = sprlinebuf[x]; + } + } + if(rendis & 1) + { + emphlinebuf[x] = 0; + Pline[x] = 0x3C | 0x40; + } + Pline[x] = (Pline[x] & pix_mask); + switch(x & 7) + { + case 1: FetchNT(MMC5Mode); break; + case 3: FetchAT(MMC5Mode); break; + case 5: FetchCD1(MMC5Mode); break; + case 7: FetchCD2(MMC5Mode); break; + } + if(x == 252) { Fixit1(); } + } + if(x == (257)) + { + Fixit2(); + if(MMC5Mode >= 3) + { + xs = 0; + tochange = MMC5HackSPMode&0x1F; + } + } + if(x == 304 && scanline == -1) + RefreshAddr = TempAddr; + + if(x == 321 || x == 329) FetchNT(MMC5Mode); + else if(x == 323 || x == 331) FetchAT(MMC5Mode); + else if(x == 325 || x == 333) FetchCD1(MMC5Mode); + else if(x == 327 || x == 335) FetchCD2(MMC5Mode); + } + diff --git a/Mednafen/mednafen/nes/ppu/ppu.cpp b/Mednafen/mednafen/nes/ppu/ppu.cpp new file mode 100644 index 0000000000..2f6f4fa038 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/ppu.cpp @@ -0,0 +1,1812 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 1998 BERO + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../nes.h" +#include "../x6502.h" +#include "../nsf.h" +#include "../sound.h" + +#include "../cart.h" +#include "ppu.h" +#include "palette.h" +#include "../input.h" +#include "../ntsc/nes_ntsc.h" +#include +#include + +#ifdef __MMX__ + #include "mmintrin.h" +#endif + +void MMC5_hb(int); /* Ugh ugh ugh. */ + +namespace MDFN_IEN_NES +{ + +#define VBlankON (PPU[0]&0x80) /* Generate VBlank NMI */ +#define Sprite16 (PPU[0]&0x20) /* Sprites 8x16/8x8 */ +#define BGAdrHI (PPU[0]&0x10) /* BG pattern adr $0000/$1000 */ +#define SpAdrHI (PPU[0]&0x08) /* Sprite pattern adr $0000/$1000 */ +#define INC32 (PPU[0]&0x04) /* auto increment 1/32 */ + +#define SpriteON (PPU[1]&0x10) /* Show Sprite */ +#define ScreenON (PPU[1]&0x08) /* Show screen */ + +#define PPU_status (PPU[2]) + +static nes_ntsc_emph_t *NTSCBlitter = NULL; +static nes_ntsc_setup_t setup; + +static void FetchSpriteData(void); +static void RefreshLine(int lastpixel); +static void RefreshSprites(void); + +static void Fixit1(void); +static uint32 ppulut1[256], ppulut2[256], ppulut3[128]; + +static void DoGfxDecode(void); +static MDFN_Surface *GfxDecode_Buf = NULL; +static int GfxDecode_Line = -1; +static int GfxDecode_Layer = 0; +static int GfxDecode_Scroll = 0; +static int GfxDecode_Pbn = 0; + +static void makeppulut(void) +{ + int x; + int y; + + for(x=0;x<256;x++) + { + ppulut1[x]=0; + for(y=0;y<8;y++) + { + ppulut1[x] |= ((x>>(7 - y))&0x1) << (y*4); + } + ppulut2[x]=ppulut1[x]<<1; + } + + { + + int cc,xo,pixel; + + for(cc=0;cc<16;cc++) + { + for(xo=0;xo<8;xo++) + { + ppulut3[xo|(cc<<3)]=0; + for(pixel=0;pixel<8;pixel++) + { + int shiftr; + shiftr=(pixel+xo)/8; + shiftr*=2; + ppulut3[xo|(cc<<3)]|=(( cc>>shiftr )&3)<<(2+pixel*4); + } +// printf("%08x\n",ppulut3[xo|(cc<<3)]); + } + } + + } +} + +static int ppudead; +static int kook; +int fceuindbg=0; + +int MMC5Hack; +uint32 MMC5HackCHRBank; +uint32 MMC5HackVROMMask; +uint8 *MMC5HackExNTARAMPtr; +uint8 *MMC5HackVROMPTR; +uint8 MMC5HackCHRMode=0; +uint8 MMC5HackSPMode; +uint8 MMC5HackSPScroll; +uint8 MMC5HackSPPage; + + +uint8 VRAMBuffer,PPUGenLatch; +uint8 *vnapage[4]; +uint8 PPUNTARAM; +uint8 PPUCHRRAM; + +void (*GameHBIRQHook)(void), (*GameHBIRQHook2)(void); +void (*PPU_hook)(uint32 A); + +static uint8 vtoggle; +static uint8 XOffset; +static uint32 TempAddr, RefreshAddr; + +static int maxsprites; + +/* scanline is equal to the current visible scanline we're on. */ + +int scanline; +static uint32 scanlines_per_frame; + +#define V_FLIP 0x80 +#define H_FLIP 0x40 +#define SP_BACK 0x20 + +typedef struct { + uint8 y,no,atr,x; +} SPR; + +typedef struct { + uint8 ca[2],atr,x; +} SPRB; + +uint8 PPU[4]; +uint8 PPUSPL; +uint8 NTARAM[0x800],PALRAM[0x20],PALRAMCache[0x20]; + +uint8 SPRAM[0x100]; +static SPRB SPRBUF[64]; // 8] if we didn't have an excess sprites option. + +static union +{ + uint32 PALRAMLUTCache[0x200]; + + struct + { + uint8 PALRAMLUTCache8[0x200]; + MDFN_PaletteEntry NESPalette8BPP[0x100]; + }; +} CM; + +static uint8 FindClose(const MDFN_PaletteEntry& pe) MDFN_COLD; +static uint8 FindClose(const MDFN_PaletteEntry& pe) +{ + double rl, gl, bl; + int closest = -1; + double closest_cs = 1000; + + rl = pow((double)pe.r / 255, 2.2 / 1.0); + gl = pow((double)pe.g / 255, 2.2 / 1.0); + bl = pow((double)pe.b / 255, 2.2 / 1.0); + + for(unsigned x = 0; x < 256; x++) + { + double rcl, gcl, bcl; + double cs; + + rcl = pow((double)CM.NESPalette8BPP[x].r / 255, 2.2 / 1.0); + gcl = pow((double)CM.NESPalette8BPP[x].g / 255, 2.2 / 1.0); + bcl = pow((double)CM.NESPalette8BPP[x].b / 255, 2.2 / 1.0); + + cs = fabs(rcl - rl) * 0.2126 + fabs(gcl - gl) * 0.7152 + fabs(bcl - bl) * 0.0722; + if(cs < closest_cs) + { + closest_cs = cs; + closest = x; + } + } + + return(closest); +} + +void MDFNNES_SetPixelFormat(const MDFN_PixelFormat &pixel_format) +{ + if(pixel_format.bpp == 8) + { + for(int x = 0; x < 0x40; x++) + { + CM.NESPalette8BPP[x] = pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b); + CM.PALRAMLUTCache8[x] = x; + } + + for(int x = 0x80; x < 0xC0; x++) + { + CM.NESPalette8BPP[0x40 | (x & 0x3F)] = pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b); + CM.PALRAMLUTCache8[x] = 0x40 | (x & 0x3F); + } + + for(int x = 0x100; x < 0x140; x++) + { + CM.NESPalette8BPP[0x80 | (x & 0x3F)] = pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b); + CM.PALRAMLUTCache8[x] = 0x80 | (x & 0x3F); + } + + for(int x = 0x1C0; x < 0x200; x++) + { + CM.NESPalette8BPP[0xC0 | (x & 0x3F)] = pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b); + CM.PALRAMLUTCache8[x] = 0xC0 | (x & 0x3F); + } + + for(int x = 0x40; x < 0x80; x++) + CM.PALRAMLUTCache8[x] = FindClose(pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b)); + + for(int x = 0xC0; x < 0x100; x++) + CM.PALRAMLUTCache8[x] = FindClose(pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b)); + + for(int x = 0x140; x < 0x1C0; x++) + CM.PALRAMLUTCache8[x] = FindClose(pixel_format.MakePColor(ActiveNESPalette[x].r, ActiveNESPalette[x].g, ActiveNESPalette[x].b)); + } + else + { + for(int x = 0; x < 0x200; x++) + { + int r = ActiveNESPalette[x].r; + int g = ActiveNESPalette[x].g; + int b = ActiveNESPalette[x].b; + + CM.PALRAMLUTCache[x] = pixel_format.MakeColor(r, g, b); + } + } +} + +#define MMC5SPRVRAMADR(V) &MMC5SPRVPage[(V)>>10][(V)] +#define MMC5BGVRAMADR(V) &MMC5BGVPage[(V)>>10][(V)] +#define VRAMADR(V) &VPage[(V)>>10][(V)] + + +static int32 sphitx; +static uint8 sphitdata; + +static DECLFR(A2002) +{ + uint8 ret; + + if(!fceuindbg) + if(sphitx != 0x100) + MDFNPPU_LineUpdate(); + ret = PPU_status; + ret|=PPUGenLatch&0x1F; + + if(!fceuindbg) + { + vtoggle = 0; + PPU_status &= 0x7F; + PPUGenLatch = ret; + } + return ret; +} + +static DECLFR(A200x) /* Not correct for $2004 reads. */ +{ + MDFNPPU_LineUpdate(); + return PPUGenLatch; +} + +#define GETLASTPIXEL (PAL?((timestamp*48-linestartts)/15) : ((timestamp*48-linestartts)>>4) ) + +static uint8 *Pline; +static int firstpixel; +static int linestartts; + +static DECLFR(A2004) +{ + if(Pline) //InPPUActiveArea) + { + int poopix = GETLASTPIXEL; + + if(poopix > 320 && poopix < 340) + return(0); + return(0xFF); + } + else + { + uint8 ret = SPRAM[PPU[3]]; + return(ret); + } +} + +static DECLFR(A2007) +{ + uint8 ret; + uint32 tmp = RefreshAddr & 0x3FFF; + + MDFNPPU_LineUpdate(); + ret = VRAMBuffer; + + if(!fceuindbg) + { + if(PPU_hook) PPU_hook(tmp); + PPUGenLatch=VRAMBuffer; + + if(tmp<0x2000) + VRAMBuffer=VPage[tmp>>10][tmp]; + else + { + VRAMBuffer=vnapage[(tmp>>10)&0x3][tmp&0x3FF]; + if(tmp >= 0x3f00) + { + tmp &= (tmp & 3)? 0x1F : 0x0C; + ret = PALRAM[tmp]; + } + } + } + + if(!fceuindbg) + { + if (INC32) RefreshAddr+=32; + else RefreshAddr++; + if(PPU_hook) PPU_hook(RefreshAddr&0x3fff); + } + return ret; +} + + +static DECLFW(B2000) +{ + //printf("%04x:$%02x, %d\n",A,V&0x38,scanline); + + MDFNPPU_LineUpdate(); + PPUGenLatch=V; + if(!(PPU[0]&0x80) && (V&0x80) && (PPU_status&0x80)) + { + //printf("Trigger NMI, %d, %d\n",timestamp,ppudead); + TriggerNMI2(); + } + PPU[0]=V; + TempAddr&=0xF3FF; + TempAddr|=(V&3)<<10; +} + +static int RCBGOn; +static int RCSPROn; +static int rendis; +static void RedoRenderCache(void) +{ + RCSPROn = SpriteON; + + RCBGOn = ScreenON; +} + +static DECLFW(B2001) +{ + //printf("%04x:$%02x, %d\n",A,V,scanline); + MDFNPPU_LineUpdate(); + PPUGenLatch=V; + PPU[1]=V; + RedoRenderCache(); +} + +static DECLFW(B2002) +{ + PPUGenLatch=V; +} + +static DECLFW(B2003) +{ + PPUGenLatch=V; + PPU[3]=V; + PPUSPL=V&0xFC; +} + +static DECLFW(B2004) +{ + PPUGenLatch=V; + SPRAM[PPU[3]]=V; + PPU[3]++; +} + +static DECLFW(B2005) +{ + uint32 tmp = TempAddr; + + MDFNPPU_LineUpdate(); + PPUGenLatch = V; + + if(!vtoggle) + { + tmp &= 0xFFE0; + tmp |= V>>3; + XOffset = V&7; + } + else + { + tmp &= 0x8C1F; + tmp|=((V&~0x7)<<2); + tmp|=(V&7)<<12; + } + TempAddr=tmp; + vtoggle^=1; +} + +static uint8 poopoo(void) +{ + if((RefreshAddr & 0x3F00) == 0x3F00) + return(RefreshAddr & 0xF); + return(0); +} + + +static DECLFW(B2006) +{ + MDFNPPU_LineUpdate(); + PPUGenLatch=V; + if(!vtoggle) + { + TempAddr&=0x00FF; + TempAddr|=(V&0x3f)<<8; + } + else + { + TempAddr&=0xFF00; + TempAddr|=V; + + RefreshAddr=TempAddr; + + if(PPU_hook) + PPU_hook(RefreshAddr); + //printf("%d, %04x\n",scanline,RefreshAddr); + } + vtoggle^=1; +} + +static DECLFW(B2007) +{ + uint32 tmp=RefreshAddr&0x3FFF; + + MDFNPPU_LineUpdate(); + + PPUGenLatch=V; + if(tmp >= 0x3F00) + { + tmp &= (tmp & 3)? 0x1F : 0x0C; + PALRAM[tmp] = PALRAMCache[tmp] = V & 0x3F; + } + else if(tmp<0x2000) + { + if(PPUCHRRAM&(1<<(tmp>>10))) + VPage[tmp>>10][tmp]=V; + } + else + { + if(PPUNTARAM&(1<<((tmp&0xF00)>>10))) + vnapage[((tmp&0xF00)>>10)][tmp&0x3FF]=V; + } + if (INC32) RefreshAddr+=32; + else RefreshAddr++; + if(PPU_hook) PPU_hook(RefreshAddr&0x3fff); +} + +static DECLFW(B4014) +{ + uint32 t=V<<8; + int x; + + for(x=0;x<256;x++) + X6502_DMW(0x2004,X6502_DMR(t+x)); +} + +static void ResetRL(uint8 *target) +{ + Pline=target; + firstpixel = 0; + + linestartts=timestamp*48+X.count; + //printf("Line: %d\n", GETLASTPIXEL); + //MDFNPPU_LineUpdate(); +} + +alignas(16) static uint8 sprlinebuf[256+8]; +alignas(16) static uint8 emphlinebuf[256]; + +void MDFNPPU_LineUpdate(void) +{ + if(!fceuindbg) + if(Pline) + { + int l=GETLASTPIXEL; + RefreshLine(l); + } +} + +void MDFNNES_SetLayerEnableMask(uint64 mask) +{ + rendis = ~mask; + + RedoRenderCache(); +} + +static void EndRL(void) +{ + RefreshLine(341); + Pline=0; +} + + +static uint8 NT_TMP = 0; +static uint8 MMC5NT_TMP; +static uint32 pshift[2]; +static uint32 atlatch; +static uint8 xs, ys; +static int tochange; + +static INLINE void FetchNT(int MMC5Ex) +{ + uint8 *C; + + if(PPU_hook) + PPU_hook((RefreshAddr & 0xfff) | 0x2000); + + C = vnapage[(RefreshAddr>>10)&3]; + + NT_TMP = C[RefreshAddr&0x3ff]; /* Fetch name table byte. */ + + if(MMC5Ex == 1) + MMC5NT_TMP = MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff]; + else if((MMC5Ex == 3 || MMC5Ex == 4) && ((tochange<=0 && MMC5HackSPMode&0x40) || (tochange>0 && !(MMC5HackSPMode&0x40))) ) + { + NT_TMP = MMC5HackExNTARAMPtr[xs|(ys<<5)]; + // printf("OK: %d, %d\n",scanline,xs); + } +} + +static INLINE void FetchAT(int MMC5Ex) +{ + uint8 cc, zz; + uint8 *C; + + C = vnapage[(RefreshAddr >> 10) & 3]; + zz = RefreshAddr & 0x1f; + + if(MMC5Ex == 1) + cc=(MMC5HackExNTARAMPtr[RefreshAddr & 0x3ff] & 0xC0)>>6; + else if((MMC5Ex == 3 || MMC5Ex == 4) && ((tochange<=0 && MMC5HackSPMode&0x40) || (tochange>0 && !(MMC5HackSPMode&0x40))) ) + { + cc=MMC5HackExNTARAMPtr[0x3c0+(xs>>2)+((ys&0x1C)<<1)]; + cc=((cc >> ((xs&2) + ((ys&0x2)<<1))) &3); + } + else + { + cc=C[0x3c0+(zz>>2)+((RefreshAddr&0x380)>>4)]; /* Fetch attribute table byte. */ + cc=((cc >> ((zz&2) + ((RefreshAddr&0x40)>>4))) &3); + } + atlatch |= cc<<4; + + if((RefreshAddr&0x1f)==0x1f) + RefreshAddr^=0x41F; + else + RefreshAddr++; + + if(PPU_hook) + PPU_hook(RefreshAddr & 0x3FFF); +} + +static INLINE void FetchCD1(int MMC5Ex) +{ + uint32 vofs = ((PPU[0]&0x10)<<8) | ((RefreshAddr>>12)&7); + uint32 vadr = (NT_TMP << 4) | vofs; + uint8 *C = VRAMADR(vadr); + + if(MMC5Ex == 1) + { + C = MMC5HackVROMPTR; + C += (((MMC5NT_TMP) & 0x3f & MMC5HackVROMMask) << 12) + (vadr & 0xfff); + } + else if(MMC5Ex == 2) + { + C = MMC5BGVRAMADR(vadr); + } + else if(MMC5Ex == 3 || MMC5Ex == 4) + { + if(((tochange<=0 && MMC5HackSPMode&0x40) || (tochange>0 && !(MMC5HackSPMode&0x40))) ) + { + C = MMC5HackVROMPTR + ((NT_TMP << 4) | ((RefreshAddr >> 12)&7)); + C += ((MMC5HackSPPage & 0x3f & MMC5HackVROMMask) << 12); + } + else + { + C = MMC5BGVRAMADR(vadr); + } + } + + pshift[0] |= C[0]; + + if(PPU_hook) + PPU_hook(vadr); +} + +static INLINE void FetchCD2(int MMC5Ex) +{ + uint32 vofs = ((PPU[0]&0x10)<<8) | ((RefreshAddr>>12)&7); + uint32 vadr = (NT_TMP << 4) | vofs; + uint8 *C = VRAMADR(vadr); + + if(MMC5Ex == 1) + { + C = MMC5HackVROMPTR; + C += (((MMC5NT_TMP) & 0x3f & MMC5HackVROMMask) << 12) + (vadr & 0xfff); + } + else if(MMC5Ex == 2) + { + C = MMC5BGVRAMADR(vadr); + } + else if(MMC5Ex == 3 || MMC5Ex == 4) + { + if(((tochange<=0 && MMC5HackSPMode&0x40) || (tochange>0 && !(MMC5HackSPMode&0x40))) ) + { + C = MMC5HackVROMPTR + ((NT_TMP << 4) | ((RefreshAddr >> 12)&7)); + C += ((MMC5HackSPPage & 0x3f & MMC5HackVROMMask) << 12); + } + else + { + C = MMC5BGVRAMADR(vadr); + } + //printf("%d, %d\n",scanline,xs); + xs++; + tochange--; + } + + pshift[1] |= C[8]; + + pshift[0] <<= 8; + pshift[1] <<= 8; + atlatch >>= 2; + + if(PPU_hook) + PPU_hook(vadr | 8); +} + +static int spork=0; /* spork the world. Any sprites on this line? + Then this will be set to 1. + */ + +static INLINE void Fixit2(void) +{ + uint32 rad=RefreshAddr; + rad&=0xFBE0; + rad|=TempAddr&0x041f; + RefreshAddr=rad; +} + +static void RefreshLine(int lastpixel) +{ + static int norecurse = 0; + int x; + + if(norecurse) + return; + norecurse = 1; + + if(ScreenON || SpriteON) + { + uint8 pix_mask = 0x3F; + + if(PPU[1]&0x01) + pix_mask = 0x30; + + PALRAMCache[0x0]=PALRAMCache[0x4]=PALRAMCache[0x8]=PALRAMCache[0xC]=PALRAM[0] | 64; + + if(MMC5Hack && geniestage != 1) + { + if(MMC5HackCHRMode==0 && (MMC5HackSPMode&0x80)) + { + const int MMC5Mode = 4; + + #include "ppu-subline.h" + } + else if (MMC5HackCHRMode==1 && (MMC5HackSPMode&0x80)) + { + const int MMC5Mode = 3; + + #include "ppu-subline.h" + } + else if(MMC5HackCHRMode == 1) + { + const int MMC5Mode = 1; + #include "ppu-subline.h" + } + else + { + const int MMC5Mode = 2; + #include "ppu-subline.h" + } + } + else + { + const int MMC5Mode = 0; + #include "ppu-subline.h" + } + } + else + { + int count = lastpixel - firstpixel; + + if((count + firstpixel) > 256) count = 256 - firstpixel; + + if(count > 0) + { + if(rendis & 1) + { + memset(emphlinebuf + firstpixel, 0, count); + memset(Pline + firstpixel, 0x40 | 0x3C, count); + } + else + { + memset(emphlinebuf + firstpixel, PPU[1] >> 5, count); + memset(Pline + firstpixel, PALRAM[poopoo()], count); + } + } + //pshift[0] = pshift[1] = atlatch = 0; + } + + if(InputScanlineHook && scanline >= 0) + InputScanlineHook(Pline, firstpixel, lastpixel); + firstpixel = lastpixel; + + norecurse = 0; +} + +static void Fixit1(void) +{ + uint32 rad=RefreshAddr; + + if((rad&0x7000)==0x7000) + { + rad^=0x7000; + if((rad&0x3E0)==0x3A0) + { + rad^=0x3A0; + rad^=0x800; + } + else + { + if((rad&0x3E0)==0x3e0) + rad^=0x3e0; + else rad+=0x20; + } + } + else + rad+=0x1000; + RefreshAddr=rad; +} + +#include "ppu-fastrl.h" + +// FIXME, use MakeColor() method +#define MEOW_OUT(n, a) { uint32 otmp; NES_NTSC_RAW_OUT(n, otmp); a = (((otmp >> 21) & 0xFF) << pixel_format.Rshift) | (((otmp >> 11) & 0xFF) << pixel_format.Gshift) | (((otmp >> 1) & 0xFF) << pixel_format.Bshift); } + +static void nes_ntsc_blit(const MDFN_PixelFormat &pixel_format, nes_ntsc_emph_t const* ntsc, uint8 const* nes_in, uint8 const* nes_emph_in, long in_pitch, + int burst_phase, int width, int height, uint32* rgb_out, long out_pitch ) +{ + /* determine how many chunks to blit, less one for the final chunk */ + int chunk_count = width / nes_ntsc_out_chunk - 1; + + /* begin row and read first nes pixel */ + uint8 const* line_in = nes_in; + uint8 const* line_emph_in = nes_emph_in; + NES_NTSC_BEGIN_ROW( ntsc, burst_phase, nes_ntsc_black, nes_ntsc_black, (*line_in++ & 0x3F) | (*line_emph_in++ << 6)); + uint32* line_out = rgb_out; + int n; + + /* blit main chunks, each using 3 nes pixels to generate 7 output pixels */ + for ( n = chunk_count; n; --n ) + { + /* order of NES_NTSC_COLOR_IN and NES_NTSC_RGB16_OUT must not be altered */ + + /* you can use NES_NTSC_RGB24_OUT and NES_NTSC_RGB15_OUT for other RGB + output formats, or NES_NTSC_RAW_OUT for the internal format */ + NES_NTSC_COLOR_IN( 0, (line_in [0] & 0x3F) | (line_emph_in [0] << 6) ); + MEOW_OUT( 0, line_out [0] ); + MEOW_OUT( 1, line_out [1] ); + + NES_NTSC_COLOR_IN( 1, (line_in [1] & 0x3F) | (line_emph_in [1] << 6) ); + MEOW_OUT( 2, line_out [2] ); + MEOW_OUT( 3, line_out [3] ); + + NES_NTSC_COLOR_IN( 2, (line_in [2] & 0x3F) | (line_emph_in [2] << 6) ); + MEOW_OUT( 4, line_out [4] ); + MEOW_OUT( 5, line_out [5] ); + MEOW_OUT( 6, line_out [6] ); + line_in += 3; + line_emph_in += 3; + line_out += 7; + } + + /* you can eliminate the need for the final chunk below by padding your nes + input with three extra black pixels at the end of each row */ + + /* finish final pixels without starting any new ones */ + NES_NTSC_COLOR_IN( 0, nes_ntsc_black ); + MEOW_OUT( 0, line_out [0] ); + MEOW_OUT( 1, line_out [1] ); + + NES_NTSC_COLOR_IN( 1, nes_ntsc_black ); + MEOW_OUT( 2, line_out [2] ); + MEOW_OUT( 3, line_out [3] ); + + NES_NTSC_COLOR_IN( 2, nes_ntsc_black ); + MEOW_OUT( 4, line_out [4] ); + MEOW_OUT( 5, line_out [5] ); + MEOW_OUT( 6, line_out [6] ); +} + +static int BurstPhase = 0; + +static void DoLine(MDFN_Surface *surface, int skip) +{ + alignas(8) uint8 target[256]; + + if(InputScanlineHook) // Frame skipping will break zapper emulation soooo muchlybadlydoubleplusungoodly. + skip = 0; + + if(RCSPROn) RefreshSprites(); + + ResetRL(target); + + if(scanline >= 0 && MMC5Hack && (ScreenON || SpriteON)) MMC5_hb(scanline); + + if(MMC5Hack) + { + ys=((scanline>>3)+MMC5HackSPScroll)&0x1F; + if(ys>=0x1E) ys-=0x1E; + } + + X6502_Run(256); + if(firstpixel < 240) + { + int newfirst = firstpixel; + + if(newfirst & 7) + { + newfirst = (newfirst + 7) &~7; + //printf("%d\n",newfirst); + RefreshLine(newfirst); + } + + Pline=0; // We don't want any PPU_hook()-calling-RefreshLine()-business going on! + + FastRefreshLine(newfirst >> 3, target); + + if(RCSPROn && spork) + FastCopySprites(newfirst >> 3, target, skip); + else if(rendis & 1) + MDFN_FastU32MemsetM8((uint32 *)(target + newfirst), 0x40404040 | 0x3C3C3C3C, (256 - newfirst) / sizeof(uint32)); + + if(!skip) + FastLineEffects(newfirst >> 3, target); + + if(InputScanlineHook && scanline >= 0) + InputScanlineHook(target, newfirst, 256); + + firstpixel = 256; + if(ScreenON || SpriteON) + Fixit1(); + + Pline = target; // Restore it! + } + else + MDFNPPU_LineUpdate(); + + if(scanline >= 0) + { + if(!skip) + MDFN_DrawInput(target, scanline); + + if(NTSCBlitter) + { + if(!skip) + { + // TODO: Factor this out/make it more elegant. + if(surface->format.colorspace != MDFN_COLORSPACE_RGB || surface->format.bpp != 32) + { + MDFN_PixelFormat nf; + + memset(&nf, 0, sizeof(nf)); + + nf.bpp = 32; + nf.colorspace = MDFN_COLORSPACE_RGB; + + nf.Rshift = 0; + nf.Gshift = 8; + nf.Bshift = 16; + nf.Ashift = 24; + + surface->SetFormat(nf, false); + } + nes_ntsc_blit(surface->format, NTSCBlitter, target, emphlinebuf, nes_ntsc_min_in_width, setup.merge_fields ? scanline % 3 : BurstPhase, nes_ntsc_min_out_width, 1, surface->pixels + scanline * surface->pitchinpix, surface->pitch32 * sizeof(uint32)); + } + BurstPhase = (BurstPhase + 1) % 3; + } + else + { + if(!skip) + { + switch(surface->format.bpp) + { + default: + case 32: + { + uint32 *real_target = surface->pixels + scanline * surface->pitchinpix; + + for(int x = 0; x < 256; x++) + real_target[x] = CM.PALRAMLUTCache[(target[x] & 0x3F) | (emphlinebuf[x] << 6)]; + } + break; + + case 16: + { + uint16 *real_target16 = surface->pixels16 + scanline * surface->pitchinpix; + + for(int x = 0; x < 256; x++) + real_target16[x] = CM.PALRAMLUTCache[(target[x] & 0x3F) | (emphlinebuf[x] << 6)]; + } + break; + + case 8: + { + uint8 *real_target8 = surface->pixels8 + scanline * surface->pitchinpix; + + for(int x = 0; x < 256; x++) + real_target8[x] = CM.PALRAMLUTCache8[(target[x] & 0x3F) | (emphlinebuf[x] << 6)]; + } + break; + } + } + } + } + sphitx=0x100; + + if(ScreenON || SpriteON) + FetchSpriteData(); + + if(GameHBIRQHook && (ScreenON || SpriteON) && ((PPU[0]&0x38)!=0x18)) + { + X6502_Run(10); + GameHBIRQHook(); + X6502_Run(85-16-10); + } + else + { + X6502_Run(85-16); + + // A semi-hack for Star Trek: 25th Anniversary + if(GameHBIRQHook && (ScreenON || SpriteON) && ((PPU[0]&0x38)!=0x18)) + GameHBIRQHook(); + } + + if(GameHBIRQHook2 && (ScreenON || SpriteON)) + GameHBIRQHook2(); + + if(scanline == -1 && !PAL) + { + kook ^= 1; + if(ScreenON && kook) + { + X6502_Run(15); + BurstPhase = (BurstPhase + 2) % 3; + } + else + { + X6502_Run(16); + BurstPhase = (BurstPhase + 1) % 3; + } + } + else + X6502_Run(16); + + EndRL(); + + + scanline++; +} + +static uint8 numsprites,SpriteBlurp; + +static void FetchSpriteData(void) +{ + uint8 ns,sb; + uint8 H; + int vofs; + uint8 P0=PPU[0]; + + H=8; + + ns=sb=0; + + vofs=(unsigned int)(P0&0x8&(((P0&0x20)^0x20)>>2))<<9; + H+=(P0&0x20)>>2; + + for(int n = 0;n < 64;n++) + { + SPR *spr = (SPR *)&SPRAM[n * 4]; + + if(n < 2) + { + spr = (SPR *)&SPRAM[(n * 4 + PPUSPL) & 0xFF]; + } + + if((unsigned int)(scanline-spr->y)>=H) continue; + + if(nsy); + + if (Sprite16) + vadr = ((spr->no&1)<<12) + ((spr->no&0xFE)<<4); + else + vadr = (spr->no<<4)+vofs; + + if (spr->atr&V_FLIP) + { + vadr+=7; + vadr-=t; + vadr+=(P0&0x20)>>1; + vadr-=t&8; + } + else + { + vadr+=t; + vadr+=t&8; + } + + if(MMC5Hack && geniestage!=1 && Sprite16) C = MMC5SPRVRAMADR(vadr); + else C = VRAMADR(vadr); + dst->ca[0]=C[0]; + + if(PPU_hook && ns < 8) + { + PPU_hook(0x2000); + PPU_hook(vadr); + } + + dst->ca[1]=C[8]; + + if(PPU_hook && ns<8) + PPU_hook(vadr | 8); + + dst->x=spr->x; + dst->atr=spr->atr; + + ns++; + } + else + { + PPU_status|=0x20; + break; + } + } + //if(ns>=7) + //printf("%d %d\n",scanline,ns); + if(ns>8) PPU_status|=0x20; /* Handle case when >8 sprites per + scanline option is enabled. */ + else if(PPU_hook) + { + for(int n = 0; n < (8-ns); n++) + { + PPU_hook(0x2000); + PPU_hook(vofs); + } + } + numsprites=ns; + SpriteBlurp=sb; +} + + + +static void RefreshSprites(void) +{ + spork = 0; + + MDFN_FastU32MemsetM8((uint32 *)sprlinebuf, 0x80808080, 256 / sizeof(uint32)); + + if(!numsprites) + return; + + for(int n = numsprites - 1; n >= 0; n--) + { + register uint32 pixdata; + register uint8 J,atr; + register SPRB *spr = &SPRBUF[n]; + + int x = spr->x; + uint8 *C; + uint8 *VB; + + pixdata=ppulut1[spr->ca[0]]|ppulut2[spr->ca[1]]; + J=spr->ca[0]|spr->ca[1]; + atr=spr->atr; + + if(J) + { + if(n==0 && SpriteBlurp && !(PPU_status&0x40)) + { + sphitx=x; + sphitdata=J; + if(atr&H_FLIP) + sphitdata= ((J<<7)&0x80) | + ((J<<5)&0x40) | + ((J<<3)&0x20) | + ((J<<1)&0x10) | + ((J>>1)&0x08) | + ((J>>3)&0x04) | + ((J>>5)&0x02) | + ((J>>7)&0x01); + } + + C = sprlinebuf+x; + VB = (PALRAM+0x10)+((atr&3)<<2); + uint8 pbit = (atr & SP_BACK) ? 0x00 : 0x40; + + if (atr&H_FLIP) + { + if(J & 0x80) C[7]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x40) C[6]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x20) C[5]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x10) C[4]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x08) C[3]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x04) C[2]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x02) C[1]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x01) C[0]=VB[pixdata] | pbit; + } else { + if(J & 0x80) C[0]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x40) C[1]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x20) C[2]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x10) C[3]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x08) C[4]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x04) C[5]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x02) C[6]=VB[pixdata&3] | pbit; + pixdata>>=4; + if(J & 0x01) C[7]=VB[pixdata] | pbit; + } + } + } + SpriteBlurp=0; + spork=1; + + if(rendis & 2) + MDFN_FastU32MemsetM8((uint32 *)sprlinebuf, 0x80808080, 256 / sizeof(uint32)); +} + +void MDFNPPU_Reset(void) +{ + VRAMBuffer=PPU[0]=PPU[1]=PPU_status=PPU[3]=0; + PPUSPL=0; + PPUGenLatch=0; + RefreshAddr=TempAddr=0; + XOffset = 0; + vtoggle = 0; + ppudead = 1; + kook = 0; + RedoRenderCache(); +} + +void MDFNPPU_Power(void) +{ + memset(NTARAM, 0x00, 0x800); + memset(PALRAM, 0x00, 0x20); + memset(SPRAM, 0x00, 0x100); + MDFNPPU_Reset(); +} + + +int MDFNPPU_Loop(EmulateSpecStruct *espec) +{ + MDFN_Surface* surface = espec->surface; + int skip = espec->skip; + + if(!skip && surface->palette) + memcpy(surface->palette, CM.NESPalette8BPP, sizeof(CM.NESPalette8BPP)); + + if(ppudead) /* Needed for Knight Rider, Time Lord, possibly others. */ + { + if(!skip) + { + surface->Fill(0, 0, 0, 0); + for(int y = 0; y < 240; y++) + MDFN_MidLineUpdate(espec, y); + } + X6502_Run(27384 - (256 + 85)); + ppudead = 0; + } + else + { + X6502_Run(256+85); + PPU_status |= 0x80; + PPU[3]=PPUSPL=0; /* Not sure if this is correct. According + to Matt Conte and my own tests, it is. Timing is probably + off, though. NOTE: Not having this here + breaks a Super Donkey Kong game. */ + /* I need to figure out the true nature and length + of this delay. + */ + X6502_Run(12); + + if(MDFNGameInfo->GameType == GMT_PLAYER) + DoNSFFrame(); + else + { + if(VBlankON) + TriggerNMI(); + } + X6502_Run((scanlines_per_frame-242)*(256+85)-12); + PPU_status&=0x1F; + scanline = -1; + DoLine(surface, skip); + + /* Clean this stuff up later. */ + spork=numsprites=0; + + if(MDFNGameInfo->GameType == GMT_PLAYER) + X6502_Run((256+85)*240); + else + { + for(scanline=0;scanline<240;) //scanline is incremented in DoLine. Evil. :/ + { + if(GfxDecode_Buf && scanline == GfxDecode_Line) + DoGfxDecode(); + DoLine(surface, skip); + MDFN_MidLineUpdate(espec, scanline); + } + if(MMC5Hack && (ScreenON || SpriteON)) MMC5_hb(scanline); + } + } /* else... to if(ppudead) */ + + + if(skip) + return(0); + else + return(1); +} + +uint32 NESPPU_GetRegister(const unsigned int id, char* special, const uint32 special_len) +{ + if(id == PPU_GSREG_PPU0) + { + if(special) + { + trio_snprintf(special, special_len, "VBlank NMI: %s, Sprite size: 8x%d, BG CHR: 0x%04x, SPR CHR: 0x%04x, VRAM Addr Increment: %d", (PPU[0] & 0x80) ? "On" : "Off", + (PPU[0] & 0x20) ? 16 : 8, (PPU[0] & 0x10) ? 0x1000 : 0x0000, (PPU[0] & 0x08) ? 0x1000 : 0x0000, + (PPU[0] & 0x04) ? 32 : 1); + } + return(PPU[0]); + } + else if(id == PPU_GSREG_PPU1) + { + if(special) + { + trio_snprintf(special, special_len, "Sprites: %s, Background: %s, Leftmost 8 SPR Pixels: %s, Leftmost 8 BG Pixels: %s", + (PPU[1] & 0x10) ? "On" : "Off", (PPU[1] & 0x08) ? "On" : "Off", + (PPU[1] & 0x04) ? "On" : "Off", (PPU[1] & 0x02) ? "On" : "Off"); + } + return(PPU[1]); + } + else if(id == PPU_GSREG_PPU2) + return(PPU[2]); + else if(id == PPU_GSREG_PPU3) + return(PPU[3]); + else if(id == PPU_GSREG_XOFFSET) + return(XOffset); + else if(id == PPU_GSREG_RADDR) + return(RefreshAddr); + else if(id == PPU_GSREG_TADDR) + return(TempAddr); + else if(id == PPU_GSREG_VRAMBUF) + return(VRAMBuffer); + else if(id == PPU_GSREG_VTOGGLE) + return(vtoggle); + else if(id == PPU_GSREG_SCANLINE) + { + if(scanline == -1) return(261); + else return(scanline); + } + else return(0xDEADBEEF); +} + +void NESPPU_SetRegister(const unsigned int id, uint32 value) +{ + if(id == PPU_GSREG_PPU0) + { + PPU[0] = value & 0xFF; + } + else if(id == PPU_GSREG_PPU1) + { + PPU[1] = value & 0xFF; + RedoRenderCache(); + } + else if(id == PPU_GSREG_PPU2) + { + PPU[2] = value & 0xE0; + } + else if(id == PPU_GSREG_PPU3) + { + PPU[3] = value & 0xFF; + } + else if(id == PPU_GSREG_XOFFSET) + { + XOffset = value & 0x07; + } + else if(id == PPU_GSREG_RADDR) + { + RefreshAddr = value & 0x3FFF; + } + else if(id == PPU_GSREG_TADDR) + { + TempAddr = value & 0x3FFF; + } + else if(id == PPU_GSREG_VRAMBUF) + VRAMBuffer = value & 0xFF; + else if(id == PPU_GSREG_VTOGGLE) + vtoggle = value ? 1 : 0; +} + + +void MDFNPPU_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + uint16 TempAddrT,RefreshAddrT; + + SFORMAT PPU_STATEINFO[]= + { + SFARRAYN(NTARAM, 0x800, "NTAR"), + SFARRAYN(PALRAM, 0x20, "PRAM"), + SFARRAYN(SPRAM, 0x100, "SPRA"), + SFARRAYN(PPU, 0x4, "PPUR"), + SFVARN(BurstPhase, "BurstPhase"), + SFVARN(kook, "KOOK"), + SFVARN(ppudead, "DEAD"), + SFVARN(PPUSPL, "PSPL"), + SFVARN(XOffset, "XOFF"), + SFVARN(vtoggle, "VTOG"), + SFVARN(RefreshAddrT, "RADD"), + SFVARN(TempAddrT, "TADD"), + SFVARN(VRAMBuffer, "VBUF"), + SFVARN(PPUGenLatch, "PGEN"), + SFEND + }; + + if(!load) + { + TempAddrT=TempAddr; + RefreshAddrT=RefreshAddr; + } + + MDFNSS_StateAction(sm, load, data_only, PPU_STATEINFO, "PPU"); + + if(load) + { + int x; + + TempAddr=TempAddrT; + RefreshAddr=RefreshAddrT; + + for(x=0;x<0x20;x++) + { + PALRAM[x] &= 0x3F; + PALRAMCache[x] = PALRAM[x]; + } + RedoRenderCache(); + } +} + +static MDFN_Rect PPUDisplayRect; + +void NESPPU_GetDisplayRect(MDFN_Rect *DisplayRect) +{ + memcpy(DisplayRect, &PPUDisplayRect, sizeof(MDFN_Rect)); +} + +static void RedoRL(void) +{ + unsigned sls, sle; + + PPUDisplayRect.x = NTSCBlitter ? 4 : 0; + PPUDisplayRect.w = NTSCBlitter ? 602 - 4 - 2: 256; + + sls = MDFN_GetSettingUI(PAL ? "nes.slstartp" : "nes.slstart"); + sle = MDFN_GetSettingUI(PAL ? "nes.slendp" : "nes.slend"); + + if(sls > sle) + { + unsigned tmp = sls; + sls = sle; + sle = tmp; + } + + PPUDisplayRect.y = sls; + PPUDisplayRect.h = sle - sls + 1; + + if(MDFN_GetSettingUI("nes.clipsides")) + { + if(NTSCBlitter) + { + PPUDisplayRect.x += 18; + PPUDisplayRect.w -= 36; + } + else + { + PPUDisplayRect.x += 8; + PPUDisplayRect.w -= 16; + } + } + + MDFNGameInfo->nominal_width = NTSCBlitter ? (PPUDisplayRect.w * (MDFN_GetSettingB("nes.correct_aspect") ? 292 : 298) / 596) : (PPUDisplayRect.w * (MDFN_GetSettingB("nes.correct_aspect") ? (PAL ? 344 : 292) : 256) / 256); + MDFNGameInfo->nominal_height = PPUDisplayRect.h; + + MDFNGameInfo->mouse_scale_x = (float)PPUDisplayRect.w / MDFNGameInfo->nominal_width * (NTSCBlitter ? 256.0 / 596.0 : 1.0); + MDFNGameInfo->mouse_offs_x = (float)PPUDisplayRect.x * (NTSCBlitter ? 256.0 / 596.0 : 1.0); + MDFNGameInfo->mouse_scale_y = 1.0; + MDFNGameInfo->mouse_offs_y = (float)PPUDisplayRect.y; + + //printf("%f %f\n", MDFNGameInfo->mouse_scale_x, MDFNGameInfo->mouse_offs_x); + + MDFNGameInfo->lcm_width = PPUDisplayRect.w; + MDFNGameInfo->lcm_height = MDFNGameInfo->nominal_height; + + MDFNGameInfo->fb_width = (NTSCBlitter ? 768 : 256); +} + +void MDFNPPU_Close(void) +{ + if(NTSCBlitter) + { + free(NTSCBlitter); + NTSCBlitter = NULL; + } +} + +void MDFNPPU_Init(void) +{ + makeppulut(); + rendis = 0; + maxsprites = MDFN_GetSettingB("nes.no8lim") ? 64 : 8; + + if(MDFN_GetSettingB("nes.ntscblitter") && !PAL && !NESIsVSUni && MDFNGameInfo->GameType != GMT_PLAYER) + { + static float matrix[6]; + + memset(&setup, 0, sizeof(setup)); + + if(MDFN_GetSettingB("nes.ntsc.matrix")) + { + matrix[0] = MDFN_GetSettingF("nes.ntsc.matrix.0"); + matrix[1] = MDFN_GetSettingF("nes.ntsc.matrix.1"); + matrix[2] = MDFN_GetSettingF("nes.ntsc.matrix.2"); + matrix[3] = MDFN_GetSettingF("nes.ntsc.matrix.3"); + matrix[4] = MDFN_GetSettingF("nes.ntsc.matrix.4"); + matrix[5] = MDFN_GetSettingF("nes.ntsc.matrix.5"); + + setup.decoder_matrix = matrix; + } + + setup.merge_fields = MDFN_GetSettingB("nes.ntsc.mergefields"); + setup.hue = MDFN_GetSettingF("nes.ntsc.hue"); + setup.saturation = MDFN_GetSettingF("nes.ntsc.saturation"); + setup.sharpness = MDFN_GetSettingF("nes.ntsc.sharpness"); + setup.brightness = MDFN_GetSettingF("nes.ntsc.brightness"); + setup.contrast = MDFN_GetSettingF("nes.ntsc.contrast"); + + std::string preset = MDFN_GetSettingS("nes.ntsc.preset"); + + if(preset == "composite") + setup = nes_ntsc_composite; + else if(preset == "svideo") + setup = nes_ntsc_svideo; + else if(preset == "rgb") + setup = nes_ntsc_rgb; + else if(preset == "monochrome") + setup = nes_ntsc_monochrome; + +#if 0 + uint8 palette_tmp[3 * 512]; + setup.palette_out = palette_tmp; +#endif + + NTSCBlitter = (nes_ntsc_emph_t *)calloc(1, sizeof(nes_ntsc_emph_t)); + nes_ntsc_init_emph(NTSCBlitter, &setup); + +#if 0 + //FileStream fp("test.pal", FileStream::MODE_WRITE); + //fp.write(palette_tmp, sizeof(palette_tmp)); + //fp.close(); + double cmul[3][8]; + + for(int emph = 0; emph < 8; emph++) + { + double accum[3] = { 0 }; + double accum_e[3] = { 0 }; + + for(int i = 0; i < 64; i++) + { + double weights[3] = { 0 }; + + for(int j = 0; j < 3; j++) + { + double n = (double)palette_tmp[(emph * 64 + i) * 3 + j]; + double d = (double)palette_tmp[i * 3 + j]; + + //if(fabs(1.0 - n / d) >= 0.04) + { + accum_e[j] += n; + accum[j] += d; + } + + if(!n && !d) + { + weights[j] = 1.0; + } + else + { + weights[j] = n / d; + } + } + //printf("%3d: %f, %f, %f\n", emph * 64 + i, weights[0], weights[1], weights[2]); + } + for(int j = 0; j < 3; j++) + cmul[j][emph] = accum_e[j] / accum[j]; + } + + for(int j = 0; j < 3; j++) + { + for(int i = 0; i < 8; i++) + printf("%f, ", cmul[j][i]); + printf("\n"); + } + +#endif + } + else + NTSCBlitter = NULL; + + if(PAL) + scanlines_per_frame=312; + else + scanlines_per_frame=262; + + if(MDFNGameInfo->GameType != GMT_PLAYER) + RedoRL(); + + + for(int x = 0x2000;x < 0x4000; x += 8) + { + SetReadHandler(x, x, A200x); + BWrite[x] = B2000; + + SetReadHandler(x+1, x+1, A200x); + BWrite[x+1] = B2001; + + SetReadHandler(x+2, x+2, A2002); + BWrite[x+2] = B2002; + + SetReadHandler(x+3, x+3, A200x); + BWrite[x+3] = B2003; + + SetReadHandler(x+4, x+4, A2004); + BWrite[x+4] = B2004; + + SetReadHandler(x+5, x+5, A200x); + BWrite[x+5] = B2005; + + SetReadHandler(x+6, x+6, A200x); + BWrite[x+6] = B2006; + + SetReadHandler(x+7, x+7, A2007); + BWrite[x+7] = B2007; + } + BWrite[0x4014] = B4014; + +} + +void NESPPU_SettingChanged(const char *name) +{ + if(!strcmp(name, "nes.no8lim")) + { + maxsprites = MDFN_GetSettingB("nes.no8lim") ? 64 : 8; + } +} + +void NESPPU_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "ppu")) + { + while(Length--) + { + Address &= 0x3FFF; + + if(Address < 0x2000) + *Buffer = VPage[Address >> 10][Address]; + else if(Address >= 0x3f00) + *Buffer = PALRAM[Address & ((Address & 3)? 0x1F : 0x0C)]; + else + *Buffer = vnapage[(Address >> 10) & 0x3][Address & 0x3FF]; + + Address++; + Buffer++; + } + } + else if(!strcmp(name, "spram")) + { + while(Length--) + { + Address &= 0xFF; + + *Buffer = SPRAM[Address]; + + Address++; + Buffer++; + } + } +} + +void NESPPU_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "ppu")) + { + while(Length--) + { + Address &= 0x3FFF; + + if(Address < 0x2000) + VPage[Address >> 10][Address] = *Buffer; + else if(Address >= 0x3f00) + { + uint32 tmp = Address & ((Address & 3)? 0x1F : 0x0C); + PALRAM[tmp] = PALRAMCache[tmp] = *Buffer; + } + else + vnapage[(Address >> 10) & 0x3][Address & 0x3FF] = *Buffer; + + Address++; + Buffer++; + } + } + else if(!strcmp(name, "spram")) + { + while(Length--) + { + Address &= 0xFF; + + SPRAM[Address] = *Buffer; + + Address++; + Buffer++; + } + } +} + + +void NESPPU_SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn) +{ + GfxDecode_Buf = surface; + GfxDecode_Line = line; + GfxDecode_Layer = which; + GfxDecode_Scroll = yscroll; + GfxDecode_Pbn = pbn; + + if(GfxDecode_Line == -1) + DoGfxDecode(); +} + +static void DoGfxDecode(void) +{ + uint32 *target = GfxDecode_Buf->pixels; + const unsigned pbn = (GfxDecode_Pbn & 0x3) | (GfxDecode_Layer ? 0x4 : 0x0); + uint32 neo_palette[4]; + + if(GfxDecode_Pbn == -1) + { + for(int x = 0; x < 4; x++) + neo_palette[x] = GfxDecode_Buf->format.MakeColor(x * 85, x * 85, x * 85, 0xFF); + } + else + for(int x = 0; x < 4; x++) + neo_palette[x] = CM.PALRAMLUTCache[PALRAMCache[pbn * 4 + x] & 0x3F] | GfxDecode_Buf->format.MakeColor(0, 0, 0, 0xFF); + + for(int y = 0; y < GfxDecode_Buf->h; y++) + { + for(int x = 0; x < GfxDecode_Buf->w; x+=8) + { + unsigned which_tile = (x / 8) + (GfxDecode_Scroll + (y / 8)) * (GfxDecode_Buf->w / 8); + unsigned tile_c = 0; + + uint8 *cg_ptr; + uint8 cg[2]; + + if(MMC5Hack) + { + if(GfxDecode_Layer) // Sprites + { + //which_tile &= 0x1FF; + cg_ptr = MMC5SPRVRAMADR(which_tile * 16); + tile_c = 0x200; + } + else + { + switch(MMC5HackCHRMode) + { + case 1: break; + default: //which_tile &= 0x1FF; + cg_ptr = MMC5BGVRAMADR(which_tile * 16); + tile_c = 0x200; + break; + } + } + } + else + { + if(GfxDecode_Layer) // Sprites + { + if(Sprite16) + { + tile_c = 0x200; + } + else + { + if(SpAdrHI) + { + which_tile += 0x100; + tile_c = 0x200; + } + else + tile_c = 0x100; + } + } + else // Background + { + if(BGAdrHI) + { + which_tile += 0x100; + tile_c = 0x200; + } + else + tile_c = 0x100; + } + + cg_ptr = VRAMADR(which_tile * 16); + } + + if(which_tile >= tile_c) + { + for(int sx = 0; sx < 8; sx++) target[x + sx] = GfxDecode_Buf->format.MakeColor(0, 0, 0, 0); + continue; + } + + cg[0] = cg_ptr[0 + (y & 0x7)]; + cg[1] = cg_ptr[8 + (y & 0x7)]; + + for(int sx = 0; sx < 8; sx++) + target[x + sx] = neo_palette[((cg[0] >> (7-sx)) & 0x1) | (((cg[1] >> (7-sx)) & 0x1) << 1)]; + + target[x + GfxDecode_Buf->w*2 + 0] = target[x + GfxDecode_Buf->w*2 + 1] = target[x + GfxDecode_Buf->w*2 + 2] = target[x + GfxDecode_Buf->w*2 + 3] = + target[x + GfxDecode_Buf->w*2 + 4] = target[x + GfxDecode_Buf->w*2 + 5] = target[x + GfxDecode_Buf->w*2 + 6] = target[x + GfxDecode_Buf->w*2 + 7] = which_tile * 16; + + target[x + GfxDecode_Buf->w*1 + 0]=target[x + GfxDecode_Buf->w*1 + 1]=target[x + GfxDecode_Buf->w*1 + 2]=target[x + GfxDecode_Buf->w*1 + 3] = + target[x + GfxDecode_Buf->w*1 + 4]=target[x + GfxDecode_Buf->w*1 + 5]=target[x + GfxDecode_Buf->w*1 + 6]=target[x + GfxDecode_Buf->w*1 + 7] = which_tile; + } + target += GfxDecode_Buf->w * 3; + } +} + +} diff --git a/Mednafen/mednafen/nes/ppu/ppu.h b/Mednafen/mednafen/nes/ppu/ppu.h new file mode 100644 index 0000000000..7b00067767 --- /dev/null +++ b/Mednafen/mednafen/nes/ppu/ppu.h @@ -0,0 +1,55 @@ +#ifndef __MDFN_NES_PPU_H +#define __MDFN_NES_PPU_H + +namespace MDFN_IEN_NES +{ +void MDFNPPU_Init(void) MDFN_COLD; +void MDFNPPU_Close(void) MDFN_COLD; +void MDFNPPU_Reset(void) MDFN_COLD; +void MDFNPPU_Power(void) MDFN_COLD; +int MDFNPPU_Loop(EmulateSpecStruct *espec); + +void MDFNPPU_LineUpdate(); + +void NESPPU_GetDisplayRect(MDFN_Rect *DisplayRect); + + +extern void (*PPU_hook)(uint32 A); +extern void (*GameHBIRQHook)(void), (*GameHBIRQHook2)(void); + +/* For cart.c and banksw.h, mostly */ +extern uint8 NTARAM[0x800],*vnapage[4]; +extern uint8 PPUNTARAM; +extern uint8 PPUCHRRAM; + +extern int scanline; + +void MDFNNES_SetPixelFormat(const MDFN_PixelFormat &nf) MDFN_COLD; +void MDFNPPU_StateAction(StateMem *sm, const unsigned load, const bool data_only); +void MDFNNES_SetLayerEnableMask(uint64 mask); + +enum +{ + PPU_GSREG_PPU0 = 0, + PPU_GSREG_PPU1, + PPU_GSREG_PPU2, + PPU_GSREG_PPU3, + PPU_GSREG_XOFFSET, + PPU_GSREG_RADDR, + PPU_GSREG_TADDR, + PPU_GSREG_VRAMBUF, + PPU_GSREG_VTOGGLE, + PPU_GSREG_SCANLINE +}; + +uint32 NESPPU_GetRegister(const unsigned int id, char *special, const uint32 special_len) MDFN_COLD; +void NESPPU_SetRegister(const unsigned int id, uint32 value) MDFN_COLD; + + +void NESPPU_SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn) MDFN_COLD; +void NESPPU_SettingChanged(const char *name) MDFN_COLD; + +void NESPPU_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) MDFN_COLD; +void NESPPU_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) MDFN_COLD; +} +#endif diff --git a/Mednafen/mednafen/nes/sound.cpp b/Mednafen/mednafen/nes/sound.cpp new file mode 100644 index 0000000000..4cbf31e37f --- /dev/null +++ b/Mednafen/mednafen/nes/sound.cpp @@ -0,0 +1,1085 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "x6502.h" + +#include "sound.h" +#include "filter.h" + +#define SQ_SHIFT 8 +#define TRINPCM_SHIFT 0 +#include + +namespace MDFN_IEN_NES +{ + +static void DoSQ1(void); +static void DoSQ2(void); +static void DoTriangle(void); +static void DoNoiseAndPCM(void); + +static void KillResampler(void); + +static NES_Resampler *ff = NULL; + +static int SoundPAL; + +static uint32 wlookup1[32]; +static uint32 wlookup2[203]; + +alignas(16) static int16 WaveHi[40000]; +alignas(16) int16 WaveHiEx[40000]; + +std::vector GameExpSound; + +static uint8 TriCount; +static uint8 TriMode; + +static int32 tristep; + +static int32 wlcount[4]; /* Wave length counters. */ + +static uint8 IRQFrameMode; /* $4017 / xx000000 */ +static uint8 PSG[0x10]; +static uint8 RawDALatch; /* $4011 0xxxxxxx */ + +static uint8 EnabledChannels; /* Byte written to $4015 */ + +typedef struct { + uint8 Speed; + uint8 Mode; /* Fixed volume(1), and loop(2) */ + uint8 DecCountTo1; + uint8 decvolume; + int reloaddec; +} ENVUNIT; + +static ENVUNIT EnvUnits[3]; + +static const int RectDuties[4]={1,2,4,6}; + +static int32 RectDutyCount[2]; +static uint8 SweepOn[2]; +static int32 curfreq[2]; +static uint8 SweepCount[2]; +static uint8 SweepReload[2]; +static uint32 SweepPeriod[2]; +static unsigned int SweepShift[2]; + +static uint16 nreg; + +static uint8 fcnt; +static int32 fhcnt; +static int32 fhinc; + +uint32 soundtsoffs; + +static int32 lengthcount[4]; +static const uint8 lengthtable[0x20]= +{ + 0x0A, 0xFE, 0x14, 0x02, 0x28, 0x04, 0x50, 0x06, 0xa0, 0x08, 0x3c, 0x0a, 0x0e, 0x0c, 0x1a, 0x0e, 0x0c, 0x10, 0x18, 0x12, 0x30, 0x14, 0x60, 0x16, 0xc0, 0x18, 0x48, 0x1a, 0x10, 0x1c, 0x20, 0x1E +}; + +static const uint32 NTSCNoiseFreqTable[0x10]= +{ + 4, 8, 16, 32, 64, 96, 128, 160, 202, 254, 380, 508, 762, 1016, 2034, 4068 +}; + +static const uint32 PALNoiseFreqTable[0x10] = +{ + 4, 7, 14, 30, 60, 88, 118, 148, 188, 236, 354, 472, 708, 944, 1890, 3778 +}; + +static const uint32 NTSCDMCTable[0x10]= +{ + 428,380,340,320,286,254,226,214, + 190,160,142,128,106, 84 ,72,54 +}; + +static const uint32 PALDMCTable[0x10]= +{ + 398, 354, 316, 298, 276, 236, 210, 198, 176, 148, 132, 118, 98, 78, 66, 50 +}; + +// $4010 - Frequency +// $4011 - Actual data outputted +// $4012 - Address register: $c000 + V*64 +// $4013 - Size register: Size in bytes = (V+1)*64 + +static int32 DMCacc=1; +static int32 DMCPeriod; +static uint8 DMCBitCount=0; + +static uint8 DMCAddressLatch,DMCSizeLatch; /* writes to 4012 and 4013 */ +static uint8 DMCFormat; /* Write to $4010 */ + +static uint32 DMCAddress; +static int32 DMCSize; +static uint8 DMCShift; +static uint8 SIRQStat=0; + +static char DMCHaveDMA; +static uint8 DMCDMABuf=0; +static char DMCHaveSample; + +static uint32 ChannelBC[5]; + +static void LoadDMCPeriod(uint8 V) +{ + if(SoundPAL) + DMCPeriod=PALDMCTable[V]; + else + DMCPeriod=NTSCDMCTable[V]; +} + +static void PrepDPCM() +{ + DMCAddress=0x4000+(DMCAddressLatch<<6); + DMCSize=(DMCSizeLatch<<4)+1; +} + +/* Instantaneous? Maybe the new freq value is being calculated all of the time... */ + +static int CheckFreq(uint32 cf, uint8 sr) +{ + uint32 mod; + if(!(sr&0x8)) + { + mod=cf>>(sr&7); + if((mod+cf)&0x800) + return(0); + } + return(1); +} + +static void SQReload(int x, uint8 V) +{ + if(EnabledChannels&(1<>3)&0x1f]; + } + + //SweepOn[x]=(PSG[(x<<2)|1]&0x80) && SweepShift[x]; + curfreq[x] = (curfreq[x] & 0xFF) | ((V&7)<<8); + //curfreq[x]=PSG[(x<<2)|0x2]|((V&7)<<8); + //SweepCount[x]=((PSG[(x<<2)|0x1]>>4)&7)+1; + + RectDutyCount[x]=7; + EnvUnits[x].reloaddec=1; + //reloadfreq[x]=1; +} + +static DECLFW(Write_PSG) +{ + A&=0x1F; + switch(A) + { + case 0x0:DoSQ1(); + EnvUnits[0].Mode=(V&0x30)>>4; + EnvUnits[0].Speed=(V&0xF); + break; + + case 0x1: + DoSQ1(); + SweepReload[0] = 1; + SweepPeriod[0] = ((V >> 4) & 0x7) + 1; + SweepShift[0] = (V & 0x7); + SweepOn[0]=(V&0x80) && SweepShift[0]; + break; + + case 0x2: + DoSQ1(); + curfreq[0]&=0xFF00; + curfreq[0]|=V; + break; + + case 0x3: + SQReload(0,V); + break; + + case 0x4: + DoSQ2(); + EnvUnits[1].Mode=(V&0x30)>>4; + EnvUnits[1].Speed=(V&0xF); + break; + + case 0x5: + DoSQ2(); + SweepReload[1] = 1; + SweepPeriod[1] = ((V >> 4) & 0x7) + 1; + SweepShift[1] = (V & 0x7); + SweepOn[1] = (V&0x80) && SweepShift[1]; + break; + + case 0x6:DoSQ2(); + curfreq[1]&=0xFF00; + curfreq[1]|=V; + break; + + case 0x7: + SQReload(1,V); + break; + + case 0xa:DoTriangle(); + break; + + case 0xb: + DoTriangle(); + if(EnabledChannels&0x4) + lengthcount[2]=lengthtable[(V>>3)&0x1f]; + TriMode=1; // Load mode + break; + + case 0xC:DoNoiseAndPCM(); + EnvUnits[2].Mode=(V&0x30)>>4; + EnvUnits[2].Speed=(V&0xF); + break; + + case 0xE:DoNoiseAndPCM(); + break; + + case 0xF: + DoNoiseAndPCM(); + if(EnabledChannels&0x8) + lengthcount[3]=lengthtable[(V>>3)&0x1f]; + EnvUnits[2].reloaddec=1; + break; + } + PSG[A]=V; +} + +static DECLFW(Write_DMCRegs) +{ + A&=0xF; + + switch(A) + { + case 0x00:DoNoiseAndPCM(); + LoadDMCPeriod(V&0xF); + + if(SIRQStat & 0x80) + { + if((V & 0xC0) != 0x80) + { + X6502_IRQEnd(MDFN_IQDPCM); + SIRQStat&=~0x80; + } + } + DMCFormat=V; + break; + case 0x01:DoNoiseAndPCM(); + RawDALatch=V&0x7F; + break; + case 0x02:DMCAddressLatch=V;break; + case 0x03:DMCSizeLatch=V;break; + } + + +} + +static DECLFW(StatusWrite) +{ + int x; + + DoSQ1(); + DoSQ2(); + DoTriangle(); + DoNoiseAndPCM(); + + for(x=0;x<4;x++) + if(!(V&(1<0) + lengthcount[2]--; + + if(!(PSG[0xC]&0x20)) /* Make sure loop flag is not set. */ + if(lengthcount[3]>0) + lengthcount[3]--; + + for(P=0;P<2;P++) + { + if(!(PSG[P<<2]&0x20)) /* Make sure loop flag is not set. */ + if(lengthcount[P]>0) + lengthcount[P]--; + + /* Frequency Sweep Code Here */ + /* xxxx 0000 */ + /* xxxx = hz. 120/(x+1)*/ + if(SweepCount[P]>0) + SweepCount[P]--; + if(SweepCount[P]<=0) + { + SweepCount[P]=SweepPeriod[P]; + if(SweepOn[P] && curfreq[P] >= 8) + { + int offset = curfreq[P] >> SweepShift[P]; + + if(PSG[(P<<2)+0x1]&0x8) + { + curfreq[P] -= offset + (P^1); + } + else if(curfreq[P] + offset < 0x800) + { + curfreq[P] += offset; + } + } + } + if(SweepReload[P]) + { + SweepCount[P] = SweepPeriod[P]; + SweepReload[P] = 0; + } + + } + } + + /* Now do envelope decay + linear counter. */ + + if(TriMode) // In load mode? + TriCount=PSG[0x8]&0x7F; + else if(TriCount) + TriCount--; + + if(!(PSG[0x8]&0x80)) + TriMode=0; + + for(P=0;P<3;P++) + { + if(EnvUnits[P].reloaddec) + { + EnvUnits[P].decvolume=0xF; + EnvUnits[P].DecCountTo1=EnvUnits[P].Speed+1; + EnvUnits[P].reloaddec=0; + continue; + } + + if(EnvUnits[P].DecCountTo1>0) EnvUnits[P].DecCountTo1--; + if(EnvUnits[P].DecCountTo1==0) + { + EnvUnits[P].DecCountTo1=EnvUnits[P].Speed+1; + if(EnvUnits[P].decvolume || (EnvUnits[P].Mode&0x2)) + { + EnvUnits[P].decvolume--; + EnvUnits[P].decvolume&=0xF; + } + } + } +} + +static void FrameSoundUpdate(void) +{ + // Linear counter: Bit 0-6 of $4008 + // Length counter: Bit 4-7 of $4003, $4007, $400b, $400f + + if(fcnt==3) + { + if(IRQFrameMode&0x2) + fhcnt+=fhinc; + } + fcnt=(fcnt+1) & 3; + FrameSoundStuff(fcnt); + if(!fcnt && !(IRQFrameMode&0x3)) + { + SIRQStat|=0x40; + X6502_IRQBegin(MDFN_IQFCOUNT); + } +} + +static DECLFW(Write_IRQFM) +{ + //printf("%02x\n",V); + V=(V&0xC0)>>6; + fcnt=0; + if(V&0x2) + FrameSoundUpdate(); + fhcnt=fhinc; + if(V & 1) + { + X6502_IRQEnd(MDFN_IQFCOUNT); + SIRQStat&=~0x40; + } + IRQFrameMode=V; +} + + +static INLINE void tester(void) +{ + if(DMCBitCount==0) + { + if(!DMCHaveDMA) + DMCHaveSample=0; + else + { + DMCHaveSample=1; + DMCShift=DMCDMABuf; + DMCHaveDMA=0; + } + } +} + +static INLINE void DMCDMA(void) +{ + if(DMCSize && !DMCHaveDMA) + { + X6502_DMR(0x8000+DMCAddress); + X6502_DMR(0x8000+DMCAddress); + X6502_DMR(0x8000+DMCAddress); + DMCDMABuf=X6502_DMR(0x8000+DMCAddress); + DMCHaveDMA=1; + DMCAddress=(DMCAddress+1)&0x7fff; + DMCSize--; + if(!DMCSize) + { + if(DMCFormat&0x40) + PrepDPCM(); + else + { + if(DMCFormat & 0x80) + { + SIRQStat |= 0x80; + X6502_IRQBegin(MDFN_IQDPCM); + } + } + } + } +} + +void MDFN_FASTCALL MDFN_SoundCPUHook(int cycles) +{ + DMCDMA(); + DMCacc -= cycles; + + while(DMCacc <= 0) + { + if(DMCHaveSample) + { + uint8 bah = RawDALatch; + int t = ((DMCShift&1)<<2)-2; + + /* Unbelievably ugly hack */ + soundtsoffs+=DMCacc; + DoNoiseAndPCM(); + soundtsoffs-=DMCacc; + /* End unbelievably ugly hack */ + + RawDALatch += t; + if(RawDALatch & 0x80) + RawDALatch = bah; + } + + DMCacc += DMCPeriod; + DMCBitCount = (DMCBitCount + 1) & 7; + DMCShift >>= 1; + tester(); + } + + // This needs to come after the DMC code because of the "soundtsoffs" +=/-= hack + fhcnt-=cycles*48; + if(fhcnt<=0) + { + FrameSoundUpdate(); + fhcnt+=fhinc; + } +} + +/* This has the correct phase. Don't mess with it. */ +static INLINE void DoSQ(int x) +{ + int32 V; + int32 amp; + int32 rthresh; + int16 *D; + int32 currdc; + int32 cf; + int32 rc; + + if(curfreq[x]<8 || curfreq[x]>0x7ff) + goto endit; + if(!CheckFreq(curfreq[x],PSG[(x<<2)|0x1])) + goto endit; + if(!lengthcount[x]) + goto endit; + + if(EnvUnits[x].Mode&0x1) + amp=EnvUnits[x].Speed; + else + amp=EnvUnits[x].decvolume; + +// printf("%d\n",amp); + amp<<=SQ_SHIFT; + + rthresh=RectDuties[(PSG[(x<<2)]&0xC0)>>6]; + + D=&WaveHi[ChannelBC[x]]; + V=SOUNDTS-ChannelBC[x]; + + currdc=RectDutyCount[x]; + cf=(curfreq[x]+1)*2; + rc=wlcount[x]; + + while(V>0) + { + if(currdc>8)&1)^((nreg>>14)&1); + nreg=(nreg<<1) | feedback; + outo=amptab[nreg & 1]; + } + } + else + for(V=ChannelBC[3];V>13)&1)^((nreg>>14)&1); + nreg=(nreg<<1) | feedback; + outo=amptab[nreg & 1]; + } + } + ChannelBC[3]=SOUNDTS; +} + +static int64 capacimoo = 0; +int FlushEmulateSound(int reverse, int16 *SoundBuf, int32 MaxSoundFrames) +{ + int32 end,left; + + if(!timestamp) return(0); + + bool HasHiFill = 0; + + for(std::vector::iterator ep = GameExpSound.begin(); ep != GameExpSound.end(); ep++) + if(ep->HiFill) + { + HasHiFill = 1; + break; + } + + DoSQ1(); + DoSQ2(); + DoTriangle(); + DoNoiseAndPCM(); + + if(SoundBuf) + { + int16 *tmpo=&WaveHi[soundtsoffs]; + int16 *intmpo = &WaveHi[soundtsoffs]; + + if(HasHiFill) + { + int16 *intmpoex = &WaveHiEx[soundtsoffs]; + const int32 mult = (int64)(1U << 20) * 94 / 1789772.72727272; + + for(std::vector::iterator ep = GameExpSound.begin(); ep != GameExpSound.end(); ep++) + if(ep->HiFill) + ep->HiFill(); + + for(int x=timestamp;x;x--) + { + const uint32 b = *intmpo; + const int32 sample = wlookup2[(b >> TRINPCM_SHIFT) & 0xFF] + wlookup1[b >> SQ_SHIFT]; + int64 delta; + + delta = ((int64)sample << 20) - capacimoo; + + *tmpo= (int16)((delta >> 20) - *intmpoex); + // Invert expansion sound channels relative to main sound. + // I think the VRC6 is like this, but the MMC5 is not(exception handled in mmc5.c) + // Namco 106 *appears* to be like the MMC5. + // Unsure about other chips. + capacimoo += (delta * mult) >> 20; + + tmpo++; + intmpo++; + intmpoex++; + } + } + else + { + for(int x = timestamp; x; x--) + { + const uint32 b = *intmpo; + + *tmpo = wlookup2[(b >> TRINPCM_SHIFT) & 0xFF] + wlookup1[b >> SQ_SHIFT]; + + #if 0 + { +static double phase = 0; +static double phase_inc = 0.000; +static double phase_inc_inc = 0.000000001; + + *tmpo = 20000 * sin(phase); + phase += phase_inc; + phase_inc += phase_inc_inc; + + //static uint32 meow = 0; + //*tmpo = (((meow & 32) * 65535) / 32) - 32768; //(meow & 32) * 29200 / 32; + //meow++; + // *tmpo = (rand() & 0x7FFF) * 28000 / 32768; + //*tmpo = (int16)(rand() & 0xFFFF); // * 28000 * 2 / 32768; + } + #endif + tmpo++; + intmpo++; + } + } + + if(reverse) + { + int16 *neo1,*neo2; + + neo1 = &WaveHi[soundtsoffs]; + neo2 = &neo1[timestamp - 1]; + + while(neo1 < neo2) + { + uint16 cha = *neo1; + *neo1 = *neo2; + *neo2 = cha; + neo1++; + neo2--; + } + } + + end = ff->Do((int16*)WaveHi, SoundBuf, MaxSoundFrames, SOUNDTS, &left); + + memmove(WaveHi,(int16 *)WaveHi+SOUNDTS-left,left*sizeof(uint16)); + memset((int16 *)WaveHi+left,0,sizeof(WaveHi)-left*sizeof(uint16)); + + if(HasHiFill) + memset((int16 *)WaveHiEx+left,0,sizeof(WaveHiEx)-left*sizeof(uint16)); + } + else // Sound is disabled: + { + left = 0; + end = 0; + } + + for(std::vector::iterator ep = GameExpSound.begin(); ep != GameExpSound.end(); ep++) + if(ep->HiSync) + ep->HiSync(left); + + for(int x = 0; x < 5; x++) + ChannelBC[x] = left; + + soundtsoffs = left; + + return(end); +} + +/* FIXME: Find out what sound registers get reset on reset. I know $4001/$4005 don't, +due to that whole MegaMan 2 Game Genie thing. +*/ + +/* Called when a game is being closed. */ +void MDFNSND_Close(void) +{ + KillResampler(); +} + +void MDFNSND_Reset(void) +{ + int x; + + IRQFrameMode=0x0; + fhcnt=fhinc; + fcnt=0; + + nreg=1; + for(x=0;x<2;x++) + { + wlcount[x]=2048; + SweepOn[x]=0; + curfreq[x]=0; + } + wlcount[2]=1; //2048; + wlcount[3]=2048; + + RawDALatch=0x00; + TriCount=0; + TriMode=0; + tristep=0; + EnabledChannels=0; + for(x=0;x<4;x++) + lengthcount[x]=0; + + // FIXME: Which DMC state is reset on reset, and which on power? + DMCacc = 1; + DMCPeriod = 0; + DMCBitCount = 0; + + DMCAddressLatch = 0; + DMCSizeLatch = 0; + DMCFormat = 0; + + DMCAddress = 0; + DMCSize = 0; + DMCShift = 0; + SIRQStat=0; + + DMCHaveDMA = 0; + DMCDMABuf = 0; + DMCHaveSample = 0; + + LoadDMCPeriod(DMCFormat&0xF); +} + +void MDFNSND_Power(void) +{ + int x; + + memset(PSG, 0x00, sizeof(PSG)); + + MDFNSND_Reset(); + + memset(WaveHi,0, sizeof(WaveHi)); + memset(WaveHiEx, 0, sizeof(WaveHiEx)); + memset(&EnvUnits,0, sizeof(EnvUnits)); + + capacimoo = 0; + + for(x=0;x<5;x++) + ChannelBC[x]=0; + soundtsoffs=0; +} + +static void KillResampler(void) +{ + /* Kill the filter if it was initialized. */ + if(ff) + { + delete ff; + ff = NULL; + } +} + +static bool InitResampler(double rate) +{ + KillResampler(); + + ff = new NES_Resampler(PAL ? PAL_CPU : NTSC_CPU, rate, MDFN_GetSettingF("nes.sound_rate_error"), 5216.592e-6, MDFN_GetSettingI("nes.soundq")); + ff->SetVolume((double)3 / 2); + return(TRUE); +} + +bool MDFNNES_SetSoundRate(double rate) +{ + memset(WaveHi, 0, sizeof(WaveHi)); + memset(WaveHiEx, 0, sizeof(WaveHiEx)); + + KillResampler(); + + if(rate) + { + if(!InitResampler(rate)) + return(false); + } + return(TRUE); +} + +/* Called when a game has been loaded. */ +int MDFNSND_Init(bool IsPAL) +{ + SoundPAL = IsPAL; + + SetWriteHandler(0x4000, 0x400F, Write_PSG); + SetWriteHandler(0x4010, 0x4013, Write_DMCRegs); + SetWriteHandler(0x4017, 0x4017, Write_IRQFM); + + SetWriteHandler(0x4015, 0x4015, StatusWrite); + SetReadHandler(0x4015, 0x4015, StatusRead); + + wlookup1[0] = 0; + for(int x = 1; x < 32; x++) + { + double val = ( (double)16*16*16*4*95.52 / ( (double)8128 / (double)x+100) ); + + // Testing: + //val = 4323 * (double)x / 31; + + wlookup1[x] = (uint32)val; + } + + wlookup2[0] = 0; + for(int x = 1; x < 203; x++) + { + double val = ((double)16*16*16*4*163.67/((double)24329/(double)x+100)); + wlookup2[x] = (uint32)val; + } + + fhinc = SoundPAL ? 16626 : 14915; // *2 CPU clock rate + fhinc *= 24; + + return(1); +} + +void MDFNSND_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT MDFNSND_STATEINFO[]= + { + SFVARN(fhcnt, "FHCN"), + SFVARN(fcnt, "FCNT"), + SFARRAYN(PSG, 0x10, "PSG"), + + SFVARN(EnabledChannels, "ENCH"), + SFVARN(IRQFrameMode, "IQFM"), + SFVARN(nreg, "NREG"), + SFVARN(TriMode, "TRIM"), + SFVARN(TriCount, "TRIC"), + + SFVARN(EnvUnits[0].Speed, "E0SP"), + SFVARN(EnvUnits[1].Speed, "E1SP"), + SFVARN(EnvUnits[2].Speed, "E2SP"), + + SFVARN(EnvUnits[0].Mode, "E0MO"), + SFVARN(EnvUnits[1].Mode, "E1MO"), + SFVARN(EnvUnits[2].Mode, "E2MO"), + + SFVARN(EnvUnits[0].DecCountTo1, "E0D1"), + SFVARN(EnvUnits[1].DecCountTo1, "E1D1"), + SFVARN(EnvUnits[2].DecCountTo1, "E2D1"), + + SFVARN(EnvUnits[0].decvolume, "E0DV"), + SFVARN(EnvUnits[1].decvolume, "E1DV"), + SFVARN(EnvUnits[2].decvolume, "E2DV"), + + SFVARN(EnvUnits[0].reloaddec, "E0ReDec"), + SFVARN(EnvUnits[1].reloaddec, "E1ReDec"), + SFVARN(EnvUnits[2].reloaddec, "E2ReDec"), + + + SFVARN(lengthcount[0], "LEN0"), + SFVARN(lengthcount[1], "LEN1"), + SFVARN(lengthcount[2], "LEN2"), + SFVARN(lengthcount[3], "LEN3"), + + SFARRAYN(SweepOn, 2, "SWEE"), + + SFVARN(RectDutyCount[0], "RDC0"), + SFVARN(RectDutyCount[1], "RDC1"), + + SFVARN(tristep, "TRST"), + + SFVARN(wlcount[0], "WLC0"), + SFVARN(wlcount[1], "WLC1"), + SFVARN(wlcount[2], "WLC2"), + SFVARN(wlcount[3], "WLC3"), + + + SFVARN(curfreq[0], "CRF1"), + SFVARN(curfreq[1], "CRF2"), + SFARRAYN(SweepCount, 2, "SWCT"), + SFARRAYN(SweepReload, 2, "SweepReload"), + SFARRAY32N(SweepPeriod, 2, "SweepPeriod"), + SFARRAY32N(SweepShift, 2, "SweepShift"), + + SFVARN(SIRQStat, "SIRQ"), + + SFVARN(DMCacc, "5ACC"), + SFVARN(DMCBitCount, "5BIT"), + SFVARN(DMCAddress, "5ADD"), + SFVARN(DMCSize, "5SIZ"), + SFVARN(DMCShift, "5SHF"), + + SFVARN(DMCHaveDMA, "5HVDM"), + SFVARN(DMCDMABuf, "DMCDMABuf"), + SFVARN(DMCHaveSample, "5HVSP"), + + SFVARN(DMCSizeLatch, "5SZL"), + SFVARN(DMCAddressLatch, "5ADL"), + SFVARN(DMCFormat, "5FMT"), + SFVARN(RawDALatch, "RWDA"), + SFVARN(capacimoo, "CMOOI64"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, MDFNSND_STATEINFO, "SND"); + + if(load) + { + LoadDMCPeriod(DMCFormat&0xF); + RawDALatch&=0x7F; + DMCAddress&=0x7FFF; + + if(DMCacc <= 0) + DMCacc = 1; + } +} + +} diff --git a/Mednafen/mednafen/nes/sound.h b/Mednafen/mednafen/nes/sound.h new file mode 100644 index 0000000000..01f6b0fadf --- /dev/null +++ b/Mednafen/mednafen/nes/sound.h @@ -0,0 +1,38 @@ +#ifndef __MDFN_NES_SOUND_H +#define __MDFN_NES_SOUND_H + +#include + +namespace MDFN_IEN_NES +{ + +typedef struct __EXPSOUND { + void (*HiFill)(void); + void (*HiSync)(int32 ts); + + void (*Kill)(void); +} EXPSOUND; + +extern std::vector GameExpSound; + +int FlushEmulateSound(int reverse, int16 *SoundBuf, int32 MaxSoundFrames); + +alignas(16) extern int16 WaveHiEx[40000]; + +extern uint32 soundtsoffs; +#define SOUNDTS (timestamp + soundtsoffs) + +int MDFNSND_Init(bool IsPAL) MDFN_COLD; +void MDFNSND_Close(void) MDFN_COLD; +void MDFNSND_Power(void) MDFN_COLD; +void MDFNSND_Reset(void) MDFN_COLD; + +void MDFN_FASTCALL MDFN_SoundCPUHook(int); +void MDFNSND_StateAction(StateMem *sm, const unsigned load, const bool data_only); +void MDFNNES_SetSoundVolume(uint32 volume) MDFN_COLD; +void MDFNNES_SetSoundMultiplier(double multiplier) MDFN_COLD; +bool MDFNNES_SetSoundRate(double Rate) MDFN_COLD; + +} + +#endif diff --git a/Mednafen/mednafen/nes/unif.cpp b/Mednafen/mednafen/nes/unif.cpp new file mode 100644 index 0000000000..8d883038c5 --- /dev/null +++ b/Mednafen/mednafen/nes/unif.cpp @@ -0,0 +1,628 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "cart.h" +#include "unif.h" +#include "input.h" +#include "vsuni.h" + +namespace MDFN_IEN_NES +{ + +struct UNIF_HEADER +{ + char ID[4]; + uint32 info; +}; + +struct BMAPPING +{ + const char *name; + uint16 prg_rm; + int (*init)(CartInfo *); + int flags; +}; + +struct BFMAPPING +{ + const char *name; + void (*init)(Stream *fp); + const uint32 info_ms; +}; + +static CartInfo UNIFCart; + +static int vramo; +static int mirrortodo; +static uint8 *boardname = NULL; +static uint8 *sboardname = NULL; + +static uint32 CHRRAMSize; +uint8 *UNIFchrrama = NULL; +static uint8 *exntar = NULL; + +static UNIF_HEADER unhead; +static UNIF_HEADER uchead; + +static uint8 *malloced[32] = { NULL }; +static uint32 mallocedsizes[32] = { 0 }; + +static uint32 FixRomSize(uint32 size, uint32 minimum) +{ + uint32 x = 1; + + if(size < minimum) + return minimum; + + while(x < size) + x <<= 1; + + return x; +} + +static void UNIF_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(exntar, 2048), + SFARRAY(UNIFchrrama, CHRRAMSize), + SFEND + }; + + if(NESIsVSUni) + { + MDFNNES_VSUNIStateAction(sm,load, data_only); + } + + if(exntar || UNIFchrrama) + { + MDFNSS_StateAction(sm, load, data_only, StateRegs, "UNIF"); + } + + if(UNIFCart.StateAction) + UNIFCart.StateAction(sm, load, data_only); +} + +static void FreeUNIF(void) +{ + if(UNIFchrrama) + { + MDFN_free(UNIFchrrama); + UNIFchrrama = NULL; + } + + if(exntar) + { + MDFN_free(exntar); + exntar = NULL; + } + + if(boardname) + { + MDFN_free(boardname); + boardname = NULL; + } + + for(int x = 0; x < 32; x++) + { + if(malloced[x]) + { + MDFN_free(malloced[x]); + malloced[x] = NULL; + } + } +} + +static void ResetUNIF(void) +{ + for(int x = 0; x < 32; x++) + malloced[x] = NULL; + + vramo=0; + boardname=0; + mirrortodo=0; + memset(&UNIFCart,0,sizeof(UNIFCart)); + UNIFchrrama=0; +} + +static void InitBoardMirroring(void) +{ + if(mirrortodo<0x4) + SetupCartMirroring(mirrortodo,1,0); + else if(mirrortodo==0x4) + { + exntar = (uint8 *)MDFN_malloc_T(2048, _("Nametable RAM")); + SetupCartMirroring(4,1,exntar); + } + else + SetupCartMirroring(0,0,0); +} + +static void DoMirroring(Stream *fp) +{ + uint8 t; + + fp->read(&t, 1); + + mirrortodo=t; + + { + static const char *stuffo[6]={"Horizontal","Vertical","$2000","$2400","\"Four-screen\"","Controlled by Mapper Hardware"}; + if(t<6) + MDFN_printf(_("Name/Attribute Table Mirroring: %s\n"),stuffo[t]); + } +} + +static void NAME(Stream *fp) +{ + char* namebuf = NULL; + + assert(uchead.info <= (SIZE_MAX - 1)); + namebuf = (char*)MDFN_malloc_T((size_t)uchead.info + 1, "Name"); + + fp->read(namebuf, uchead.info); + + namebuf[uchead.info] = 0; + MDFN_RemoveControlChars(namebuf); + + MDFN_printf(_("Name: %s\n"), namebuf); + + if(!MDFNGameInfo->name) + MDFNGameInfo->name = namebuf; + else + { + free(namebuf); + namebuf = NULL; + } +} + +static void DINF(Stream *fp) +{ + union + { + struct + { + char name[100]; + uint8 raw_date[4]; + char method[100]; + }; + uint8 raw[100 + 4 + 100]; + } dinf; + uint8 d, m; + uint16 y; + + fp->read(dinf.raw, sizeof(dinf.raw)); + + d = dinf.raw_date[0]; + m = dinf.raw_date[1]; + y = MDFN_de16lsb(&dinf.raw_date[2]); + + dinf.name[99] = dinf.method[99] = 0; + + MDFN_RemoveControlChars(dinf.name); + MDFN_RemoveControlChars(dinf.method); + + MDFN_printf(_("Dumped by: %s\n"), dinf.name); + MDFN_printf(_("Dumped with: %s\n"), dinf.method); + { + const char* months[12]={_("January"),_("February"),_("March"),_("April"),_("May"),_("June"),_("July"), + _("August"),_("September"),_("October"),_("November"),_("December")}; + MDFN_printf(_("Dumped on: %s %d, %d\n"),months[(m-1)%12],d,y); + } +} + +static const char *WantInput[3]; + +static void CTRL(Stream *fp) +{ + uint8 t; + + fp->read(&t, 1); + + /* The information stored in this byte isn't very helpful, but it's + better than nothing...maybe. + */ + + if(t&1) + { + WantInput[0] = WantInput[1] = "gamepad"; + } + else + { + WantInput[0] = WantInput[1] = "none"; + } + + if(t&2) + { + WantInput[1] = "zapper"; + } +} + +static void TVCI(Stream *fp) +{ + uint8 t; + + fp->read(&t, 1); + + if(t<=2) + { + const char *stuffo[3]={"NTSC","PAL","NTSC and PAL"}; + + if(t==0) + MDFNGameInfo->VideoSystem = VIDSYS_NTSC; + else if(t==1) + MDFNGameInfo->VideoSystem = VIDSYS_PAL; + + MDFN_printf(_("TV Standard Compatibility: %s\n"),stuffo[t]); + } +} + +static void EnableBattery(Stream *fp) +{ + uint8 t; + + fp->read(&t, 1); + + MDFN_printf(_("Battery-backed.\n")); + + UNIFCart.battery = 1; +} + +static void LoadPRG(Stream *fp) +{ + uint32 t; + unsigned z; + + z = uchead.ID[3] - '0'; // FIXME hex + + if(z > 15) + throw MDFN_Error(0, "Invalid PRG ROM index '%c'.\n", uchead.ID[3]); + + MDFN_printf(_("PRG ROM %u size: %u\n"), z, uchead.info); + + if(malloced[z]) + free(malloced[z]); + + t = FixRomSize(uchead.info, 2048); + + malloced[z] = (uint8 *)MDFN_malloc_T(t, _("PRG ROM")); + mallocedsizes[z] = t; + memset(malloced[z] + uchead.info, 0xFF, t - uchead.info); + + fp->read(malloced[z], uchead.info); + + SetupCartPRGMapping(z,malloced[z],t,0); +} + +static void SetBoardName(Stream *fp) +{ + assert(uchead.info <= (SIZE_MAX - 1)); + boardname = (uint8*)MDFN_malloc_T((size_t)uchead.info + 1, _("Board Name")); + + fp->read(boardname, uchead.info); + boardname[uchead.info] = 0; + MDFN_RemoveControlChars((char*)boardname); + + MDFN_printf(_("Board name: %s\n"), boardname); + sboardname=boardname; + if(!memcmp(boardname,"NES-",4) || !memcmp(boardname,"UNL-",4) || !memcmp(boardname,"HVC-",4) || !memcmp(boardname,"BTL-",4) || !memcmp(boardname,"BMC-",4)) + sboardname+=4; +} + +static void LoadCHR(Stream *fp) +{ + uint32 t; + unsigned z; + + z = uchead.ID[3] - '0'; + + if(z > 15) + throw MDFN_Error(0, "Invalid CHR ROM index '%c'.\n", uchead.ID[3]); + + MDFN_printf(_("CHR ROM %u size: %u\n"), z, uchead.info); + + if(malloced[16 + z]) + free(malloced[16 + z]); + + t = FixRomSize(uchead.info, 8192); + malloced[16 + z] = (uint8 *)MDFN_malloc_T(t, _("CHR ROM")); + mallocedsizes[16 + z]=t; + memset(malloced[16 + z] + uchead.info, 0xFF, t - uchead.info); + + fp->read(malloced[16 + z], uchead.info); + + SetupCartCHRMapping(z, malloced[16 + z], t, 0); +} + + +#define BMCFLAG_FORCE4 1 +#define BMCFLAG_32KCHRR 2 // Generic UNIF code should make available 32K CHR RAM if no VROM is present(else just 8KB CHR RAM). + +static const BMAPPING bmap[] = +{ + { "BTR", 0x0001U, BTR_Init, 0 }, + + /* MMC2 */ + { "PNROM", 0x0001U, PNROM_Init, 0 }, + { "PEEOROM", 0x0001U, PNROM_Init, 0}, + +/* Sachen Carts */ + { "TC-U01-1.5M", 0x0001U, TCU01_Init,0}, + { "Sachen-8259B", 0x0001U, S8259B_Init, 0}, + { "Sachen-8259A", 0x0001U, S8259A_Init,0}, + { "Sachen-74LS374N", 0x0001U, S74LS374N_Init,0}, + { "SA-016-1M", 0x0001U, SA0161M_Init,0}, + { "SA-72007", 0x0001U, SA72007_Init,0}, + { "SA-72008", 0x0001U, SA72008_Init,0}, + { "SA-0036", 0x0001U, SA0036_Init,0}, + { "SA-0037", 0x0001U, SA0037_Init,0}, + + { "H2288", 0x0001U, H2288_Init,0}, + { "8237", 0x0001U, UNL8237_Init,0}, + +// /* AVE carts. */ +// { "MB-91", 0x0001U, MB91_Init,0}, // DeathBots + { "NINA-06", 0x0001U, NINA06_Init,0}, // F-15 City War +// { "NINA-03", NINA03_Init,0}, // Tiles of Fate +// { "NINA-001", NINA001_Init,0}, // Impossible Mission 2 + + { "HKROM", 0x0001U, HKROM_Init,0}, + + { "EWROM", 0x0001U, EWROM_Init,0}, + { "EKROM", 0x0001U, EKROM_Init,0}, + { "ELROM", 0x0001U, ELROM_Init,0}, + { "ETROM", 0x0001U, ETROM_Init,0}, + + { "SAROM", 0x0001U, SAROM_Init,0}, + { "SBROM", 0x0001U, SBROM_Init,0}, + { "SCROM", 0x0001U, SCROM_Init,0}, + { "SEROM", 0x0001U, SEROM_Init,0}, + { "SGROM", 0x0001U, SGROM_Init,0}, + { "SKROM", 0x0001U, SKROM_Init,0}, + { "SLROM", 0x0001U, SLROM_Init,0}, + { "SL1ROM", 0x0001U, SL1ROM_Init,0}, + { "SNROM", 0x0001U, SNROM_Init,0}, + { "SOROM", 0x0001U, SOROM_Init,0}, + + { "TGROM", 0x0001U, TGROM_Init,0}, + { "TR1ROM", 0x0001U, TFROM_Init,BMCFLAG_FORCE4}, + + { "TEROM", 0x0001U, TEROM_Init,0}, + { "TFROM", 0x0001U, TFROM_Init,0}, + { "TLROM", 0x0001U, TLROM_Init,0}, + { "TKROM", 0x0001U, TKROM_Init,0}, + { "TSROM", 0x0001U, TSROM_Init,0}, + + { "TLSROM", 0x0001U, TLSROM_Init,0}, + { "TKSROM", 0x0001U, TKSROM_Init,0}, + { "TQROM", 0x0001U, TQROM_Init,0}, + { "TVROM", 0x0001U, TLROM_Init,BMCFLAG_FORCE4}, + + { "AOROM", 0x0001U, AOROM_Init, 0}, + { "CPROM", 0x0001U, CPROM_Init, BMCFLAG_32KCHRR}, + { "CNROM", 0x0001U, CNROM_Init,0}, + { "GNROM", 0x0001U, GNROM_Init,0}, + { "NROM", 0x0001U, NROM256_Init,0 }, + { "RROM", 0x0001U, NROM128_Init,0 }, + { "RROM-128", 0x0001U, NROM128_Init,0 }, + { "NROM-128", 0x0001U, NROM128_Init,0 }, + { "NROM-256", 0x0001U, NROM256_Init,0 }, + { "MHROM", 0x0001U, MHROM_Init,0}, + { "UNROM", 0x0001U, UNROM_Init, 0}, + + { "MARIO1-MALEE2", 0x0003U, MALEE_Init, 0}, + { "Supervision16in1", 0x001FU, Supervision16_Init,0}, + { "NovelDiamond9999999in1", 0x0001U, Novel_Init,0}, + { "Super24in1SC03", 0x001FU, Super24_Init,0}, + { "BioMiracleA", 0x0001U, BioMiracleA_Init, 0}, + + { "603-5052", 0x0001U, UNL6035052_Init, 0}, +}; + +static const BFMAPPING bfunc[] = +{ + { "CTRL", CTRL, ~0U }, + { "TVCI", TVCI, ~0U }, + { "BATR", EnableBattery, ~0U }, + { "MIRR", DoMirroring, ~0U }, + { "DINF", DINF, ~0U }, + + { "PRG", LoadPRG, 512 * 1024 * 1024 }, + { "CHR", LoadCHR, 512 * 1024 * 1024 }, + { "MAPR", SetBoardName, 512 * 1024 * 1024 }, + { "NAME", NAME, 512 * 1024 * 1024 }, +}; + +static void LoadUNIFChunks(Stream *fp) +{ + uint64 uhrc; + + while((uhrc = fp->read(&uchead, 4, false)) == 4) + { + bool found_handler = false; + + uchead.info = fp->get_LE(); + + for(auto const& bf : bfunc) + { + if(!memcmp(&uchead, bf.name, strlen(bf.name))) + { + if(uchead.info > bf.info_ms) + throw MDFN_Error(0, _("Value(%u) in length field of chunk \"%.4s\" is too large."), uchead.info, &uchead.ID[0]); + + bf.init(fp); + + found_handler = true; + break; + } + } + + //printf("%.4s\n", &uchead); + + if(!found_handler) + fp->seek(uchead.info, SEEK_CUR); + } + + if(uhrc != 0) + throw MDFN_Error(0, _("Unexpected EOF")); +} + +static void InitializeBoard(void) +{ + if(!sboardname) + throw MDFN_Error(0, _("Missing UNIF board name.")); + + for(auto const& bm : bmap) + { + if(!strcmp((char *)sboardname, (char *)bm.name)) + { + for(unsigned i = 0; i < 16; i++) + { + if((bm.prg_rm & (1U << i)) && !malloced[i]) + throw MDFN_Error(0, _("Missing PRG ROM %u."), i); + } + + if(!malloced[16]) + { + if(bm.flags & BMCFLAG_32KCHRR) + CHRRAMSize = 32768; + else + CHRRAMSize = 8192; + + UNIFchrrama = (uint8 *)MDFN_malloc_T(CHRRAMSize, _("CHR RAM")); + SetupCartCHRMapping(0,UNIFchrrama,CHRRAMSize,1); + } + + if(bm.flags & BMCFLAG_FORCE4) + mirrortodo=4; + InitBoardMirroring(); + bm.init(&UNIFCart); + return; + } + } + throw MDFN_Error(0, _("Board type not supported.")); +} + +static void UNIF_Reset(void) +{ + if(UNIFCart.Reset) + UNIFCart.Reset(&UNIFCart); +} + +static void UNIF_Power(void) +{ + if(UNIFCart.Power) + UNIFCart.Power(&UNIFCart); + if(UNIFchrrama) memset(UNIFchrrama, 0xFF, CHRRAMSize); +} + +static void UNIF_SaveNV(void) +{ + MDFN_SaveGameSave(&UNIFCart); +} + +static void UNIF_Kill(void) +{ + if(UNIFCart.Close) + UNIFCart.Close(); + FreeUNIF(); +} + +bool UNIF_TestMagic(MDFNFILE *fp) +{ + uint8 magic[4]; + + if(fp->read(magic, 4, false) != 4 || memcmp(magic, "UNIF", 4)) + return false; + + return true; +} + + +void UNIFLoad(Stream *fp, NESGameType *gt) +{ + try + { + uint8 magic[4]; + + if(fp->read(magic, 4, false) != 4 || memcmp(magic, "UNIF", 4)) + throw MDFN_Error(0, _("Not a valid UNIF file.")); + + ResetCartMapping(); + + ResetUNIF(); + memset(WantInput, 0, sizeof(WantInput)); + + unhead.info = fp->get_LE(); + fp->seek(0x20, SEEK_SET); + + LoadUNIFChunks(fp); + + { + md5_context md5; + + md5.starts(); + + for(int x = 0; x < 32; x++) + { + if(malloced[x]) + { + md5.update(malloced[x],mallocedsizes[x]); + } + } + md5.finish(UNIFCart.MD5); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(UNIFCart.MD5, 0).c_str()); + memcpy(MDFNGameInfo->MD5,UNIFCart.MD5,sizeof(UNIFCart.MD5)); + MDFN_printf("\n"); + } + + InitializeBoard(); + + MDFN_LoadGameSave(&UNIFCart); + + gt->Power = UNIF_Power; + gt->Reset = UNIF_Reset; + gt->SaveNV = UNIF_SaveNV; + gt->Kill = UNIF_Kill; + gt->StateAction = UNIF_StateAction; + + if(UNIFCart.CartExpSound.HiFill) + GameExpSound.push_back(UNIFCart.CartExpSound); + + MDFNGameInfo->DesiredInput.push_back(WantInput[0]); + MDFNGameInfo->DesiredInput.push_back(WantInput[1]); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + + MDFNGameInfo->DesiredInput.push_back(WantInput[2]); + } + catch(...) + { + if(UNIFCart.Close) + UNIFCart.Close(); + + FreeUNIF(); + ResetUNIF(); + throw; + } +} + +} diff --git a/Mednafen/mednafen/nes/unif.h b/Mednafen/mednafen/nes/unif.h new file mode 100644 index 0000000000..9797d4f73f --- /dev/null +++ b/Mednafen/mednafen/nes/unif.h @@ -0,0 +1,84 @@ +#ifndef __MDFN_NES_UNIF_H +#define __MDFN_NES_UNIF_H + +int UNL6035052_Init(CartInfo *info); + + +int BIC43_Init(CartInfo *info); +int BIC48_Init(CartInfo *info); +int BIC62_Init(CartInfo *info); +int BIC64_Init(CartInfo *info); + +int AGCI50282_Init(CartInfo *info); +int BioMiracleA_Init(CartInfo *info); +int NINA06_Init(CartInfo *info); + +int AOROM_Init(CartInfo *info); +int BTR_Init(CartInfo *info); + +int TCU01_Init(CartInfo *info); +int S8259B_Init(CartInfo *info); +int S8259A_Init(CartInfo *info); +int S74LS374N_Init(CartInfo *info); +int SA0161M_Init(CartInfo *info); + +int SA72007_Init(CartInfo *info); +int SA72008_Init(CartInfo *info); +int SA0036_Init(CartInfo *info); +int SA0037_Init(CartInfo *info); + +int H2288_Init(CartInfo *info); +int UNL8237_Init(CartInfo *info); + +int HKROM_Init(CartInfo *info); + +int ETROM_Init(CartInfo *info); +int EKROM_Init(CartInfo *info); +int ELROM_Init(CartInfo *info); +int EWROM_Init(CartInfo *info); + +int SAROM_Init(CartInfo *info); +int SBROM_Init(CartInfo *info); +int SCROM_Init(CartInfo *info); +int SEROM_Init(CartInfo *info); +int SGROM_Init(CartInfo *info); +int SKROM_Init(CartInfo *info); +int SLROM_Init(CartInfo *info); +int SL1ROM_Init(CartInfo *info); +int SNROM_Init(CartInfo *info); +int SOROM_Init(CartInfo *info); + +int NROM_Init(CartInfo *info); +int NROM256_Init(CartInfo *info); +int NROM128_Init(CartInfo *info); +int MHROM_Init(CartInfo *info); +int UNROM_Init(CartInfo *info); +int MALEE_Init(CartInfo *info); +int Supervision16_Init(CartInfo *info); +int Super24_Init(CartInfo *info); +int Novel_Init(CartInfo *info); +int CNROM_Init(CartInfo *info); +int CPROM_Init(CartInfo *info); +int GNROM_Init(CartInfo *info); + +int TEROM_Init(CartInfo *info); +int TFROM_Init(CartInfo *info); +int TGROM_Init(CartInfo *info); +int TKROM_Init(CartInfo *info); +int TSROM_Init(CartInfo *info); +int TLROM_Init(CartInfo *info); +int TLSROM_Init(CartInfo *info); +int TKSROM_Init(CartInfo *info); +int TQROM_Init(CartInfo *info); +int TQROM_Init(CartInfo *info); + +int MMC4_Init(CartInfo *info); +int PNROM_Init(CartInfo *info); + +namespace MDFN_IEN_NES +{ +extern uint8 *UNIFchrrama; // Meh. So I can stop CHR RAM + // bank switcherooing with certain boards... +} + +#endif diff --git a/Mednafen/mednafen/nes/vsuni.cpp b/Mednafen/mednafen/nes/vsuni.cpp new file mode 100644 index 0000000000..b8520d8f49 --- /dev/null +++ b/Mednafen/mednafen/nes/vsuni.cpp @@ -0,0 +1,405 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2003 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "x6502.h" +#include "input.h" +#include "vsuni.h" +#include "cart.h" + +namespace MDFN_IEN_NES +{ + +static uint8 WRAM[8192]; + +#define IOPTION_GUN 0x1 +#define IOPTION_SWAPDIRAB 0x2 + +#define IOPTION_PREDIP 0x10 +typedef struct +{ + const char *name; + uint64 md5partial; + int mapper; + int mirroring; + int ppu; + int ioption; + int predip; +} VSUNIENTRY; + +VSUNIENTRY *curvs; + +static uint8 DIPS=0; +uint8 vsdip=0; + +void MDFN_VSUniToggleDIPView(void) +{ + DIPS=!DIPS; +} + +void MDFN_VSUniToggleDIP(int w) +{ + vsdip^=1<> w) & 1) != state) + MDFN_VSUniToggleDIP(w); +} + +uint8 MDFNI_VSUniGetDIPs(void) +{ + return(vsdip); +} + +static uint8 secdata[2][32]= +{ + { + 0xff, 0xbf, 0xb7, 0x97, 0x97, 0x17, 0x57, 0x4f, + 0x6f, 0x6b, 0xeb, 0xa9, 0xb1, 0x90, 0x94, 0x14, + 0x56, 0x4e, 0x6f, 0x6b, 0xeb, 0xa9, 0xb1, 0x90, + 0xd4, 0x5c, 0x3e, 0x26, 0x87, 0x83, 0x13, 0x00 + }, + { + 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + } +}; + +static uint8 *secptr; + +static uint8 VSindex; + +static DECLFR(VSSecRead) +{ + switch(A) + { + case 0x5e00: VSindex=0;return X.DB; + case 0x5e01: return(secptr[(VSindex++)&0x1F]); + } + return(0x00); +} +uint8 coinon=0; + +void MDFN_VSUniCoin(void) +{ + coinon=6; +} + +static int curppu; +static int64 curmd5; + +#define RP2C04_001 1 +#define RP2C04_002 2 +#define RP2C04_003 3 +#define RP2C04_004 4 +#define RCP2C03B 5 +#define RC2C05_01 6 +#define RC2C05_02 7 +#define RC2C05_03 8 +#define RC2C05_04 9 + +static readfunc OldReadPPU; +static writefunc OldWritePPU[2]; + +static DECLFR(A2002_Gumshoe) +{ + return( (OldReadPPU(A)&~0x3F) | 0x1C); +} + +static DECLFR(A2002_Topgun) +{ + return( (OldReadPPU(A)&~0x3F) | 0x1B); +} + +static DECLFR(A2002_MBJ) // Mighty Bomb Jack +{ + return( (OldReadPPU(A)&~0x3F) | 0x3D); +} + +static DECLFW(B2000_2001_2C05) +{ + OldWritePPU[(A&1)^1](A ^ 1, V); +} +static uint8 xevselect = 0; +static DECLFR(XevRead) +{ + //printf("%04x\n",A); + if(A == 0x54FF) + { + return(0x5); + } + else if(A == 0x5678) + { + return(xevselect?0:1); + } + else if(A == 0x578F) + { + return(xevselect?0xd1:0x89); + } + else if(A == 0x5567) + { + xevselect ^=1; + return(xevselect?0x37:0x3E); + } + return(X.DB); +} + +void MDFN_VSUniSwap(uint8 *j0, uint8 *j1) +{ + if(curvs->ioption & IOPTION_SWAPDIRAB) + { + uint16 t=*j0; + *j0=(*j0&0xC)|(*j1&0xF3); + *j1=(*j1&0xC)|(t&0xF3); + } +} + +void MDFN_VSUniInstallRWHooks(void) +{ + assert(NESIsVSUni); + + if(secptr) + SetReadHandler(0x5e00,0x5e01,VSSecRead); + + if(curppu == RC2C05_04) + { + OldReadPPU = GetReadHandler(0x2002); + SetReadHandler(0x2002, 0x2002, A2002_Topgun); + } + else if(curppu == RC2C05_03) + { + OldReadPPU = GetReadHandler(0x2002); + SetReadHandler(0x2002, 0x2002, A2002_Gumshoe); + } + else if(curppu == RC2C05_02) + { + OldReadPPU = GetReadHandler(0x2002); + SetReadHandler(0x2002, 0x2002, A2002_MBJ); + } + if(curppu == RC2C05_04 || curppu == RC2C05_01 || curppu == RC2C05_03 || curppu == RC2C05_02) + { + OldWritePPU[0] = GetWriteHandler(0x2000); + OldWritePPU[1] = GetWriteHandler(0x2001); + SetWriteHandler(0x2000, 0x2001, B2000_2001_2C05); + } + if(curmd5 == 0x2d396247cf58f9faLL) /* Super Xevious */ + { + SetReadHandler(0x5400,0x57FF,XevRead); + } +} + +void MDFN_VSUniPower(void) +{ + coinon = 0; + VSindex = 0; + + memset(WRAM, 0xFF, 8192); + setprg8r(0x10, 0x6000, 0); +} + +/* Games that will probably not be supported ever(or for a long time), since they require + dual-system: + + Balloon Fight + VS Mahjong + VS Tennis + Wrecking Crew +*/ + +VSUNIENTRY VSUniGames[] = +{ + {"Baseball", 0x691d4200ea42be45LL, 99, 2,RP2C04_001,0}, + {"Battle City", 0x8540949d74c4d0ebLL, 99, 2,RP2C04_001,0}, + {"Battle City(Bootleg)",0x8093cbe7137ac031LL, 99, 2,RP2C04_001,0}, + + {"Clu Clu Land", 0x1b8123218f62b1eeLL, 99, 2,RP2C04_004,IOPTION_SWAPDIRAB}, + {"Dr Mario", 0xe1af09c477dc0081LL, 1, 0,RP2C04_003,IOPTION_SWAPDIRAB}, + {"Duck Hunt", 0x47735d1e5f1205bbLL, 99, 2,RCP2C03B ,IOPTION_GUN}, + {"Excitebike", 0x3dcd1401bcafde77LL, 99, 2,RP2C04_003,0}, + {"Excitebike (J)", 0x7ea51c9d007375f0LL, 99, 2,RP2C04_004,0}, + {"Freedom Force", 0xed96436bd1b5e688LL, 4, 0,RP2C04_001,IOPTION_GUN}, + {"Stroke and Match Golf",0x612325606e82bc66LL, 99, 2,RP2C04_002,IOPTION_SWAPDIRAB|IOPTION_PREDIP,0x01}, + + {"Goonies", 0x3b0085c4ff29098eLL, 151,1,RP2C04_003,0}, + {"Goonies", 0xb4032d694e1d2733LL, 151, 1, RP2C04_003, 0 }, + {"Gradius", 0x50687ae63bdad976LL,151, 1,RP2C04_001,IOPTION_SWAPDIRAB}, + {"Gumshoe", 0xb8500780bf69ce29LL, 99, 2,RC2C05_03,IOPTION_GUN}, + {"Hogan's Alley", 0xd78b7f0bb621fb45LL, 99, 2,RP2C04_001,IOPTION_GUN}, + {"Ice Climber", 0xd21e999513435e2aLL, 99, 2,RP2C04_004,IOPTION_SWAPDIRAB}, + {"Ladies Golf", 0x781b24be57ef6785LL, 99, 2,RP2C04_002,IOPTION_SWAPDIRAB|IOPTION_PREDIP,0x1}, + + {"Mach Rider", 0x015672618af06441LL, 99, 2, RP2C04_002,0}, + {"Mach Rider (J)", 0xa625afb399811a8aLL, 99, 2, RP2C04_001,0}, + {"Mighty Bomb Jack", 0xe6a89f4873fac37bLL, 0, 2, RC2C05_02,0}, + {"Ninja Jajamaru Kun", 0xb26a2c31474099c0LL, 99, 2,RC2C05_01 ,IOPTION_SWAPDIRAB}, + {"Pinball", 0xc5f49d3de7f2e9b8LL, 99, 2,RP2C04_001,IOPTION_PREDIP,0x01}, + {"Pinball (J)", 0x66ab1a3828cc901cLL, 99, 2,RCP2C03B,IOPTION_PREDIP,0x1}, + {"Platoon", 0x160f237351c19f1fLL, 68, 1,RP2C04_001,0}, + {"RBI Baseball", 0x6a02d345812938afLL, 4, 1,RP2C04_001 ,IOPTION_SWAPDIRAB}, + {"Soccer", 0xd4e7a9058780eda3LL, 99, 2,RP2C04_003,IOPTION_SWAPDIRAB}, + {"Star Luster", 0x8360e134b316d94cLL, 99, 2,RCP2C03B ,0}, + {"Stroke and Match Golf (J)",0x869bb83e02509747LL, 99, 2,RCP2C03B,IOPTION_SWAPDIRAB|IOPTION_PREDIP,0x1}, + {"Super Sky Kid", 0x78d04c1dd4ec0101LL, 4, 1,RCP2C03B ,IOPTION_SWAPDIRAB | IOPTION_PREDIP,0x20}, + + {"Super Xevious", 0x2d396247cf58f9faLL, 206, 0,RP2C04_001,0}, + {"Tetris", 0x531a5e8eea4ce157LL, 99, 2,RCP2C03B ,IOPTION_PREDIP,0x20}, + {"Top Gun", 0xf1dea36e6a7b531dLL, 2, 0,RC2C05_04 ,0}, + {"VS Castlevania", 0x92fd6909c81305b9LL, 2, 1,RP2C04_002,0}, + {"VS Slalom", 0x4889b5a50a623215LL, 0, 1,RP2C04_002,0}, + + {"VS Super Mario Bros",0x39d8cfa788e20b6cLL, 99, 2,RP2C04_004,0}, // Bad? + {"VS Super Mario Bros",0xfc182e5aefbce14dLL, 99, 2,RP2C04_004,0}, + + {"VS TKO Boxing", 0x6e1ee06171d8ce3aLL,4, 1,RP2C04_003,IOPTION_PREDIP,0x00}, + {0} +}; + +static unsigned int wpal; + +unsigned int MDFN_VSUniGetPaletteNum(void) +{ + return(wpal); +} + +void MDFN_VSUniCheck(uint64 md5partial, int *MapperNo, int *Mirroring) +{ + VSUNIENTRY *vs = VSUniGames; + + while(vs->name) + { + if(md5partial == vs->md5partial) + { + if(vs->ppu < RCP2C03B) + wpal = 1 + vs->ppu; + else + wpal = 1 + 5; + //puts(vs->name); + *MapperNo = vs->mapper; + *Mirroring = vs->mirroring; + + NESIsVSUni = TRUE; + MDFNGameInfo->GameType = GMT_ARCADE; + + curppu = vs->ppu; + curmd5 = md5partial; + + secptr = 0; + + { + static const uint64 tko=0x6e1ee06171d8ce3aULL, rbi=0x6a02d345812938afULL; + if(md5partial == tko) + secptr=secdata[0]; + if(md5partial == rbi) + secptr = secdata[1]; + } + + vsdip = 0x0; + if(vs->ioption & IOPTION_PREDIP) + { + vsdip= vs->predip; + } + if(vs->ioption & IOPTION_GUN) + { + MDFNGameInfo->DesiredInput.push_back("zapper"); + MDFNGameInfo->DesiredInput.push_back("none"); + MDFNGameInfo->DesiredInput.push_back("none"); + MDFNGameInfo->DesiredInput.push_back("none"); + + MDFNGameInfo->DesiredInput.push_back("none"); + } + else + { + MDFNGameInfo->DesiredInput.push_back("gamepad"); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + MDFNGameInfo->DesiredInput.push_back("gamepad"); + + MDFNGameInfo->DesiredInput.push_back("none"); + } + curvs = vs; + SetupCartPRGMapping(0x10, WRAM, 8192, 1); + SetReadHandler(0x6000, 0x7FFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); + + return; + } + vs++; + } +} + +void MDFN_VSUniDraw(MDFN_Surface *surface) +{ + uint32 *XBuf = surface->pixels; + + uint32 *dest; + int y,x; + + if(!DIPS) return; + + dest = XBuf+256*12+164; + for(y=24;y;y--,dest+=256-72) + { + for(x=72;x;x--,dest++) + *dest = surface->MakeColor(0, 0, 0); + } + + dest = XBuf+256*(12+4)+164+6; + for(y=16;y;y--,dest+=256-64) + for(x=8;x;x--) + { + uint32 col = surface->MakeColor(0xE0, 0xE0, 0xE0); + *dest=col; //0x01010101; + *(dest + 1) = col; + *(dest + 2) = col; + *(dest + 3) = col; + dest+=8; + } + + dest = XBuf+256*(12+4)+164+6; + for(x=0;x<8;x++,dest+=8) + { + uint32 *da=dest+256; + + if(!((vsdip>>x)&1)) + da+=256*10; + for(y=4;y;y--,da+=256) + { + *da = *(da + 1) = *(da + 2) = *(da + 3) = surface->MakeColor(0x70, 0x10, 0x70); + } + } + +} + +void MDFNNES_VSUNIStateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[]= + { + SFVAR(vsdip), SFVAR(coinon), SFVAR(VSindex), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "VSUN"); +} + +} diff --git a/Mednafen/mednafen/nes/vsuni.h b/Mednafen/mednafen/nes/vsuni.h new file mode 100644 index 0000000000..7e567fecd0 --- /dev/null +++ b/Mednafen/mednafen/nes/vsuni.h @@ -0,0 +1,24 @@ +#ifndef __MDFN_NES_VSUNI_H +#define __MDFN_NES_VSUNI_H + +namespace MDFN_IEN_NES +{ + +void MDFN_VSUniPower(void); +void MDFN_VSUniCheck(uint64 md5partial, int *, int *); +void MDFN_VSUniDraw(MDFN_Surface *surface); + +void MDFN_VSUniToggleDIPView(void); +void MDFN_VSUniToggleDIP(int); /* For movies and netplay */ +void MDFN_VSUniCoin(void); +void MDFN_VSUniSwap(uint8 *j0, uint8 *j1); + +void MDFNNES_VSUNIStateAction(StateMem *sm, const unsigned load, const bool data_only); + +void MDFN_VSUniInstallRWHooks(void); + +unsigned int MDFN_VSUniGetPaletteNum(void); + +} + +#endif diff --git a/Mednafen/mednafen/nes/x6502.cpp b/Mednafen/mednafen/nes/x6502.cpp new file mode 100644 index 0000000000..0686ffcd90 --- /dev/null +++ b/Mednafen/mednafen/nes/x6502.cpp @@ -0,0 +1,731 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "nes.h" +#include "x6502.h" +#include "sound.h" +#include "debug.h" + +namespace MDFN_IEN_NES +{ +X6502 X; + +#ifdef WANT_DEBUGGER +void (*X6502_Run)(int32 cycles); +#endif + +uint32 timestamp; +void (*MapIRQHook)(int a); + +#define _PC X.PC +#define _A X.A +#define _X X.X +#define _Y X.Y +#define _S X.S +#define _P X.P +#define _PI X.mooPI +#define _DB X.DB +#define _count X.count +#define _tcount X.tcount +#define _IRQlow X.IRQlow +#define _jammed X.jammed + +#define ADDCYC(x) \ +{ \ + int __x=x; \ + _tcount+=__x; \ + _count-=__x*48; \ + timestamp+=__x; \ +} + +static INLINE uint8 RdMemNorm(unsigned int A) +{ + return(_DB=ARead[A](A)); +} + +static INLINE void WrMemNorm(unsigned int A, uint8 V) +{ + BWrite[A](A,V); +} + +#ifdef WANT_DEBUGGER +X6502 XSave; /* This is getting ugly. */ +//#define RdMemHook(A) ( X.ReadHook?(_DB=X.ReadHook(&X,A)):(_DB=ARead[A](A)) ) +//#define WrMemHook(A,V) { if(X.WriteHook) X.WriteHook(&X,A,V); else BWrite[A](A,V); } + +static INLINE uint8 RdMemHook(unsigned int A) +{ + if(X.ReadHook) + return(_DB = X.ReadHook(&X,A) ); + else + return(_DB=ARead[A](A)); +} + +static INLINE void WrMemHook(unsigned int A, uint8 V) +{ + if(X.WriteHook) + X.WriteHook(&X,A,V); + else if(!X.preexec) + BWrite[A](A,V); +} +#endif + +uint8 X6502_DMR(uint32 A) +{ + ADDCYC(1); + return(X.DB=ARead[A](A)); +} + +void X6502_DMW(uint32 A, uint8 V) +{ + ADDCYC(1); + BWrite[A](A,V); +} + +#define PUSH(V) \ +{ \ + uint8 VTMP=V; \ + WrMem(0x100+_S,VTMP); \ + _S--; \ +} + +#define POP() RdMem(0x100+(++_S)) + +static uint8 ZNTable[256]; +/* Some of these operations will only make sense if you know what the flag + constants are. */ + +#define X_ZN(zort) _P&=~(Z_FLAG|N_FLAG);_P|=ZNTable[zort] +#define X_ZNT(zort) _P|=ZNTable[zort] + +#define JR(cond); \ +{ \ + if(cond) \ + { \ + uint32 tmp; \ + int32 disp; \ + disp=(int8)RdMem(_PC); \ + _PC++; \ + ADDCYC(1); \ + tmp=_PC; \ + _PC+=disp; \ + if((tmp^_PC)&0x100) \ + ADDCYC(1); \ + \ + ADDBT(_PC); \ + } \ + else _PC++; \ +} + +#define ARNOP (void)x + +#define LDA _A=x;X_ZN(_A) +#define LDX _X=x;X_ZN(_X) +#define LDY _Y=x;X_ZN(_Y) + +/* All of the freaky arithmetic operations. */ +#define AND _A&=x;X_ZN(_A) +#define BIT _P&=~(Z_FLAG|V_FLAG|N_FLAG);_P|=ZNTable[x&_A]&Z_FLAG;_P|=x&(V_FLAG|N_FLAG) +#define EOR _A^=x;X_ZN(_A) +#define ORA _A|=x;X_ZN(_A) + +#define ADC { \ + uint32 l=_A+x+(_P&1); \ + _P&=~(Z_FLAG|C_FLAG|N_FLAG|V_FLAG); \ + _P|=((((_A^x)&0x80)^0x80) & ((_A^l)&0x80))>>1; \ + _P|=(l>>8)&C_FLAG; \ + _A=l; \ + X_ZNT(_A); \ + } + +#define SBC { \ + uint32 l=_A-x-((_P&1)^1); \ + _P&=~(Z_FLAG|C_FLAG|N_FLAG|V_FLAG); \ + _P|=((_A^l)&(_A^x)&0x80)>>1; \ + _P|=((l>>8)&C_FLAG)^C_FLAG; \ + _A=l; \ + X_ZNT(_A); \ + } + +#define CMPL(a1,a2) { \ + uint32 t=a1-a2; \ + X_ZN(t&0xFF); \ + _P&=~C_FLAG; \ + _P|=((t>>8)&C_FLAG)^C_FLAG; \ + } + +/* Special undocumented operation. Very similar to CMP. */ +#define AXS { \ + uint32 t=(_A&_X)-x; \ + X_ZN(t&0xFF); \ + _P&=~C_FLAG; \ + _P|=((t>>8)&C_FLAG)^C_FLAG; \ + _X=t; \ + } + +#define CMP CMPL(_A,x) +#define CPX CMPL(_X,x) +#define CPY CMPL(_Y,x) + +/* The following operations modify the byte being worked on. */ +#define DEC x--;X_ZN(x) +#define INC x++;X_ZN(x) + +#define ASL _P&=~C_FLAG;_P|=x>>7;x<<=1;X_ZN(x) +#define LSR _P&=~(C_FLAG|N_FLAG|Z_FLAG);_P|=x&1;x>>=1;X_ZNT(x) + +/* For undocumented instructions, maybe for other things later... */ +#define LSRA _P&=~(C_FLAG|N_FLAG|Z_FLAG);_P|=_A&1;_A>>=1;X_ZNT(_A) + +#define ROL { \ + uint8 l=x>>7; \ + x<<=1; \ + x|=_P&C_FLAG; \ + _P&=~(Z_FLAG|N_FLAG|C_FLAG); \ + _P|=l; \ + X_ZNT(x); \ + } +#define ROR { \ + uint8 l=x&1; \ + x>>=1; \ + x|=(_P&C_FLAG)<<7; \ + _P&=~(Z_FLAG|N_FLAG|C_FLAG); \ + _P|=l; \ + X_ZNT(x); \ + } + +/* Icky icky thing for some undocumented instructions. Can easily be + broken if names of local variables are changed. +*/ + +/* Absolute */ +#define GetAB(target) \ +{ \ + target=RdMem(_PC); \ + _PC++; \ + target|=RdMem(_PC)<<8; \ + _PC++; \ +} + +/* Absolute Indexed(for reads) */ +#define GetABIRD(target, i) \ +{ \ + unsigned int tmp; \ + GetAB(tmp); \ + target=tmp; \ + target+=i; \ + if((target^tmp)&0x100) \ + { \ + RdMem(target - 0x100); \ + ADDCYC(1); \ + } \ +} + +/* Absolute Indexed(for writes and rmws) */ +#define GetABIWR(target, i) \ +{ \ + unsigned int rt; \ + GetAB(rt); \ + target=rt; \ + target+=i; \ + RdMem((target&0x00FF)|(rt&0xFF00)); \ +} + +/* Zero Page */ +#define GetZP(target) \ +{ \ + target=RdMem(_PC); \ + _PC++; \ +} + +/* Zero Page Indexed */ +#define GetZPI(target,i) \ +{ \ + target=i+RdMem(_PC); \ + _PC++; \ +} + +/* Indexed Indirect */ +#define GetIX(target) \ +{ \ + uint8 tmp; \ + tmp=RdMem(_PC); \ + _PC++; \ + tmp+=_X; \ + target=RdMem(tmp); \ + tmp++; \ + target|=RdMem(tmp)<<8; \ +} + +/* Indirect Indexed(for reads) */ +#define GetIYRD(target) \ +{ \ + unsigned int rt; \ + uint8 tmp; \ + tmp=RdMem(_PC); \ + _PC++; \ + rt=RdMem(tmp); \ + tmp++; \ + rt|=RdMem(tmp)<<8; \ + target=rt; \ + target+=_Y; \ + if((target^rt)&0x100) \ + { \ + RdMem(target - 0x100); \ + ADDCYC(1); \ + } \ +} + +/* Indirect Indexed(for writes and rmws) */ +#define GetIYWR(target) \ +{ \ + unsigned int rt; \ + uint8 tmp; \ + tmp=RdMem(_PC); \ + _PC++; \ + rt=RdMem(tmp); \ + tmp++; \ + rt|=RdMem(tmp)<<8; \ + target=rt; \ + target+=_Y; \ + RdMem((target&0x00FF)|(rt&0xFF00)); \ +} + +/* Now come the macros to wrap up all of the above stuff addressing mode functions + and operation macros. Note that operation macros will always operate(redundant + redundant) on the variable "x". +*/ + +#define RMW_A(op) {uint8 x=_A; op; _A=x; break; } /* Meh... */ +#define RMW_AB(op) {unsigned int A; uint8 x; GetAB(A); x=RdMem(A); WrMem(A,x); op; WrMem(A,x); break; } +#define RMW_ABI(reg,op) {unsigned int A; uint8 x; GetABIWR(A,reg); x=RdMem(A); WrMem(A,x); op; WrMem(A,x); break; } +#define RMW_ABX(op) RMW_ABI(_X,op) +#define RMW_ABY(op) RMW_ABI(_Y,op) +#define RMW_IX(op) {unsigned int A; uint8 x; GetIX(A); x=RdMem(A); WrMem(A,x); op; WrMem(A,x); break; } +#define RMW_IY(op) {unsigned int A; uint8 x; GetIYWR(A); x=RdMem(A); WrMem(A,x); op; WrMem(A,x); break; } +#define RMW_ZP(op) {uint8 A; uint8 x; GetZP(A); x=RdMem(A); op; WrMem(A,x); break; } +#define RMW_ZPX(op) {uint8 A; uint8 x; GetZPI(A,_X); x=RdMem(A); op; WrMem(A,x); break;} + +#define LD_IM(op) {uint8 x; x=RdMem(_PC); _PC++; op; break;} +#define LD_ZP(op) {uint8 A; uint8 x; GetZP(A); x=RdMem(A); op; break;} +#define LD_ZPX(op) {uint8 A; uint8 x; GetZPI(A,_X); x=RdMem(A); op; break;} +#define LD_ZPY(op) {uint8 A; uint8 x; GetZPI(A,_Y); x=RdMem(A); op; break;} +#define LD_AB(op) {unsigned int A; uint8 x; GetAB(A); x=RdMem(A); op; break; } +#define LD_ABI(reg,op) {unsigned int A; uint8 x; GetABIRD(A,reg); x=RdMem(A); op; break;} +#define LD_ABX(op) LD_ABI(_X,op) +#define LD_ABY(op) LD_ABI(_Y,op) +#define LD_IX(op) {unsigned int A; uint8 x; GetIX(A); x=RdMem(A); op; break;} +#define LD_IY(op) {unsigned int A; uint8 x; GetIYRD(A); x=RdMem(A); op; break;} + +#define ST_ZP(r) {uint8 A; GetZP(A); WrMem(A,r); break;} +#define ST_ZPX(r) {uint8 A; GetZPI(A,_X); WrMem(A,r); break;} +#define ST_ZPY(r) {uint8 A; GetZPI(A,_Y); WrMem(A,r); break;} +#define ST_AB(r) {unsigned int A; GetAB(A); WrMem(A,r); break;} +#define ST_ABI(reg,r) {unsigned int A; GetABIWR(A,reg); WrMem(A,r); break; } +#define ST_ABX(r) ST_ABI(_X,r) +#define ST_ABY(r) ST_ABI(_Y,r) +#define ST_IX(r) {unsigned int A; GetIX(A); WrMem(A,r); break; } +#define ST_IY(r) {unsigned int A; GetIYWR(A); WrMem(A,r); break; } + +static const uint8 CycTable[256] = +{ +/*0x00*/ 7,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6, +/*0x10*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, +/*0x20*/ 6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6, +/*0x30*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, +/*0x40*/ 6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6, +/*0x50*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, +/*0x60*/ 6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6, +/*0x70*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, +/*0x80*/ 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4, +/*0x90*/ 2,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5, +/*0xA0*/ 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4, +/*0xB0*/ 2,5,2,5,4,4,4,4,2,4,2,4,4,4,4,4, +/*0xC0*/ 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6, +/*0xD0*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, +/*0xE0*/ 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6, +/*0xF0*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, +}; + +void X6502_IRQBegin(int w) +{ + //printf("IRQ begin: %d; %d\n", w, _IRQlow); + _IRQlow|=w; +} + +void X6502_IRQEnd(int w) +{ + //printf("IRQ end: %d; %d\n", w, _IRQlow); + _IRQlow&=~w; +} + +void TriggerNMI(void) +{ + _IRQlow|=MDFN_IQNMI; +} + +void TriggerNMI2(void) +{ + _IRQlow|=MDFN_IQNMI2; +} + +/* Called from debugger. */ +void MDFNI_NMI(void) +{ + _IRQlow|=MDFN_IQNMI; +} + +void MDFNI_IRQ(void) +{ + _IRQlow|=MDFN_IQTEMP; +} + +void X6502_GetIVectors(uint16 *reset, uint16 *irq, uint16 *nmi) +{ + fceuindbg=1; + + *reset=RdMemNorm(0xFFFC); + *reset|=RdMemNorm(0xFFFD)<<8; + *nmi=RdMemNorm(0xFFFA); + *nmi|=RdMemNorm(0xFFFB)<<8; + *irq=RdMemNorm(0xFFFE); + *irq|=RdMemNorm(0xFFFF)<<8; + fceuindbg=0; +} +static int debugmode; + +void X6502_Reset(void) +{ + _IRQlow=MDFN_IQRESET; +} + +void X6502_Init(void) +{ + int x; + + memset((void *)&X,0,sizeof(X)); + for(x=0;x<256;x++) + if(!x) ZNTable[x]=Z_FLAG; + else if (x&0x80) ZNTable[x]=N_FLAG; + else ZNTable[x]=0; + #ifdef WANT_DEBUGGER + X6502_Debug(0,0,0); + #endif +} + +void X6502_Power(void) +{ + _count=_tcount=_IRQlow=_PC=_A=_X=_Y=_S=_P=_PI=_DB=_jammed=0; + timestamp=0; + X6502_Reset(); +} + +#ifdef WANT_DEBUGGER +static void X6502_RunDebug(int32 cycles) +{ + #define RdMem RdMemHook + #define WrMem WrMemHook + #define ADDBT(to) NESDBG_AddBranchTrace(old_PC, to, 0) + + if(PAL) + cycles*=15; // 15*4=60 + else + cycles*=16; // 16*4=64 + + _count+=cycles; + + PenguinPower: + while(_count>0) + { + const uint16 old_PC = _PC; + int32 temp; + uint8 b1; + + if(_IRQlow && !X.cpoint) // Don't run IRQ stuff if we weren't here in a save state + { + if(_IRQlow&MDFN_IQRESET) + { + _S -= 3; + _PC=RdMem(0xFFFC); + _PC|=RdMem(0xFFFD)<<8; + NESDBG_AddBranchTrace(old_PC, _PC, 0xFFFC); // ADDBT(_PC); + _jammed=0; + _PI=_P=I_FLAG; + _IRQlow&=~MDFN_IQRESET; + } + else if(_IRQlow&MDFN_IQNMI2) + { + _IRQlow&=~MDFN_IQNMI2; + _IRQlow|=MDFN_IQNMI; + } + else if(_IRQlow&MDFN_IQNMI) + { + if(!_jammed) + { + ADDCYC(7); + PUSH(_PC>>8); + PUSH(_PC); + PUSH((_P&~B_FLAG)|(U_FLAG)); + _P|=I_FLAG; + _PC=RdMem(0xFFFA); + _PC|=RdMem(0xFFFB)<<8; + NESDBG_AddBranchTrace(old_PC, _PC, 0xFFFA); // ADDBT(_PC); + _IRQlow&=~MDFN_IQNMI; + } + } + else + { + if(!(_PI&I_FLAG) && !_jammed) + { + ADDCYC(7); + PUSH(_PC>>8); + PUSH(_PC); + PUSH((_P&~B_FLAG)|(U_FLAG)); + _P|=I_FLAG; + _PC=RdMem(0xFFFE); + _PC|=RdMem(0xFFFF)<<8; + NESDBG_AddBranchTrace(old_PC, _PC, 0xFFFE); //ADDBT(_PC); + } + } + _IRQlow&=~(MDFN_IQTEMP); + if(_count<=0) + { + _PI=_P; + return; + } /* Should increase accuracy without a */ + /* major speed hit. */ + } + + /* Ok, now the real fun starts. */ + /* Do the pre-exec voodoo. */ + + if(X.ReadHook || X.WriteHook) + { + uint32 tsave=timestamp; + XSave=X; + + fceuindbg=1; + X.preexec=1; + b1=RdMem(_PC); + _PC++; + switch(b1) + { + #include "ops.h" + } + + timestamp=tsave; + + X=XSave; + fceuindbg=0; + } + + X.cpoint = 1; + + if(X.CPUHook) X.CPUHook(_PC); + if(!X.cpoint) + goto PenguinPower; + X.cpoint = 0; + + _PI = _P; + b1=RdMem(_PC); + ADDCYC(CycTable[b1]); + + temp=_tcount; + _tcount=0; + if(MapIRQHook) MapIRQHook(temp); + + MDFN_SoundCPUHook(temp); + + _PC++; + switch(b1) + { + #include "ops.h" + } + _PC &= 0xFFFF; + } + #undef RdMem + #undef WrMem + #undef ADDBT +} + +static void X6502_RunNormal(int32 cycles) +{ +#else +void X6502_Run(int32 cycles) +{ +#endif + #define RdMem RdMemNorm + #define WrMem WrMemNorm + #define ADDBT(x) + + uint32 pbackus; + + pbackus=_PC; + + #undef _PC + #define _PC pbackus + + if(PAL) + cycles*=15; // 15*4=60 + else + cycles*=16; // 16*4=64 + + _count+=cycles; + + // This handles the (rare) case of a save state being saved in step mode in the debugger + if(X.cpoint && _count > 0) + { + X.cpoint = 0; + goto SephirothBishie; + } + + while(_count>0) + { + int32 temp; + static uint8 b1; + + if(_IRQlow) + { + if(_IRQlow&MDFN_IQRESET) + { + _S -= 3; + _PC=RdMem(0xFFFC); + _PC|=RdMem(0xFFFD)<<8; + _jammed=0; + _PI=_P=I_FLAG; + _IRQlow&=~MDFN_IQRESET; + } + else if(_IRQlow&MDFN_IQNMI2) + { + _IRQlow&=~MDFN_IQNMI2; + _IRQlow|=MDFN_IQNMI; + } + else if(_IRQlow&MDFN_IQNMI) + { + if(!_jammed) + { + ADDCYC(7); + PUSH(_PC>>8); + PUSH(_PC); + PUSH((_P&~B_FLAG)|(U_FLAG)); + _P|=I_FLAG; + _PC=RdMem(0xFFFA); + _PC|=RdMem(0xFFFB)<<8; + _IRQlow&=~MDFN_IQNMI; + } + } + else + { + if(!(_PI&I_FLAG) && !_jammed) + { + ADDCYC(7); + PUSH(_PC>>8); + PUSH(_PC); + PUSH((_P&~B_FLAG)|(U_FLAG)); + _P|=I_FLAG; + _PC=RdMem(0xFFFE); + _PC|=RdMem(0xFFFF)<<8; + } + } + _IRQlow&=~(MDFN_IQTEMP); + if(_count<=0) + { + _PI=_P; + X.PC = pbackus; + return; + } /* Should increase accuracy without a major speed hit. */ + } + + SephirothBishie: + + _PI = _P; + b1=RdMem(_PC); + + ADDCYC(CycTable[b1]); + + temp=_tcount; + _tcount=0; + if(MapIRQHook) MapIRQHook(temp); + MDFN_SoundCPUHook(temp); + _PC++; + + switch(b1) + { + #include "ops.h" + } + _PC &= 0xFFFF; + } + + #undef _PC + #define _PC X.PC + #undef ADDBT + _PC=pbackus; +} + +void X6502_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + extern uint8 RAM[0x800]; // from nes.cpp + + SFORMAT SFCPU[]={ + SFVARN(X.PC, "PC"), + SFVARN(X.A, "A"), + SFVARN(X.P, "P"), + SFVARN(X.mooPI, "PI"), + SFVARN(X.X, "X"), + SFVARN(X.Y, "Y"), + SFVARN(X.S, "S"), + SFARRAYN(RAM, 0x800, "RAM"), + SFEND + }; + + SFORMAT SFCPUC[]={ + SFVARN(X.jammed, "jammed"), + SFVARN(X.IRQlow, "IRQLow"), + SFVARN(X.tcount, "tcount"), + SFVARN(X.count, "count"), + SFVARN(timestampbase, "timestampbase"), + SFVARN(X.cpoint, "CPoint"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, SFCPU, "CPU"); + MDFNSS_StateAction(sm, load, data_only, SFCPUC, "CPUC"); + + if(load) + { + X.PC &= 0xFFFF; + } +} + +#ifdef WANT_DEBUGGER +void X6502_Debug(void (*CPUHook)(uint32), + uint8 (*ReadHook)(X6502 *, unsigned int), + void (*WriteHook)(X6502 *, unsigned int, uint8)) +{ + debugmode=(ReadHook || WriteHook || CPUHook)?1:0; + X.ReadHook=ReadHook; + X.WriteHook=WriteHook; + X.CPUHook=CPUHook; + + if(!debugmode) + X6502_Run=X6502_RunNormal; + else + X6502_Run=X6502_RunDebug; +} +#endif + +} diff --git a/Mednafen/mednafen/nes/x6502.h b/Mednafen/mednafen/nes/x6502.h new file mode 100644 index 0000000000..899fab82ba --- /dev/null +++ b/Mednafen/mednafen/nes/x6502.h @@ -0,0 +1,59 @@ +#ifndef __MDFN_NES_X6502_H +#define __MDFN_NES_X6502_H +namespace MDFN_IEN_NES +{ +#include "x6502struct.h" + +#ifdef WANT_DEBUGGER +void X6502_Debug(void (*CPUHook)(uint32), + uint8 (*ReadHook)(X6502 *, unsigned int), + void (*WriteHook)(X6502 *, unsigned int, uint8)); + +extern void (*X6502_Run)(int32 cycles); +#else +void X6502_Run(int32 cycles); +#endif + +extern uint32 timestamp; +extern X6502 X; + +#define N_FLAG 0x80 +#define V_FLAG 0x40 +#define U_FLAG 0x20 +#define B_FLAG 0x10 +#define D_FLAG 0x08 +#define I_FLAG 0x04 +#define Z_FLAG 0x02 +#define C_FLAG 0x01 + +extern void (*MapIRQHook)(int a); + +#define NTSC_CPU 1789772.7272727272727272 +#define PAL_CPU 1662607.125 + +#define MDFN_IQEXT 0x001 +#define MDFN_IQEXT2 0x002 +/* ... */ +#define MDFN_IQRESET 0x020 +#define MDFN_IQNMI2 0x040 // Delayed NMI, gets converted to *_IQNMI +#define MDFN_IQNMI 0x080 +#define MDFN_IQDPCM 0x100 +#define MDFN_IQFCOUNT 0x200 +#define MDFN_IQTEMP 0x800 + +void X6502_Init(void); +void X6502_Reset(void); +void X6502_Power(void); + +void TriggerNMI(void); +void TriggerNMI2(void); + +uint8 X6502_DMR(uint32 A); +void X6502_DMW(uint32 A, uint8 V); + +void X6502_IRQBegin(int w); +void X6502_IRQEnd(int w); + +void X6502_StateAction(StateMem *sm, const unsigned load, const bool data_only); +} +#endif diff --git a/Mednafen/mednafen/nes/x6502struct.h b/Mednafen/mednafen/nes/x6502struct.h new file mode 100644 index 0000000000..c5e1e891a1 --- /dev/null +++ b/Mednafen/mednafen/nes/x6502struct.h @@ -0,0 +1,25 @@ +#ifndef _X6502STRUCTH + +typedef struct __X6502 +{ + int32 tcount; /* Temporary cycle counter */ + uint32 PC; + uint8 A,X,Y,S,P,mooPI; + uint8 jammed; + + int32 count; + uint32 IRQlow; /* Simulated IRQ pin held low(or is it high?). + And other junk hooked on for speed reasons.*/ + uint8 DB; /* Data bus "cache" for reads from certain areas */ + + int preexec; /* Pre-exec'ing for debug breakpoints. */ + int cpoint; + + #ifdef WANT_DEBUGGER + void (*CPUHook)(uint32); + uint8 (*ReadHook)(struct __X6502 *, unsigned int); + void (*WriteHook)(struct __X6502 *, unsigned int, uint8); + #endif +} X6502; +#define _X6502STRUCTH +#endif diff --git a/Mednafen/mednafen/netplay-driver.h b/Mednafen/mednafen/netplay-driver.h new file mode 100644 index 0000000000..1f5cc6d61f --- /dev/null +++ b/Mednafen/mednafen/netplay-driver.h @@ -0,0 +1,30 @@ +/* Network interface */ + +/* Parse and handle a line of UI text(may include / commands) */ +void MDFNI_NetplayLine(const char *text, bool &inputable, bool &viewable); + +/* Call when network play needs to stop. */ +void MDFNI_NetplayStop(void); + +/* Note: YOU MUST NOT CALL ANY MDFNI_* FUNCTIONS WHILE IN MDFND_SendData() or + MDFND_RecvData(). +*/ + +int MDFND_NetworkConnect(void); + +/* Called when a fatal error occurred and network play can't continue. This function + should call MDFNI_NetplayStop() after it has deinitialized the network on the driver + side. +*/ +void MDFND_NetworkClose(void); + +void MDFND_SendData(const void *data, uint32 len); // thrown std::exception will be handled +void MDFND_RecvData(void *data, uint32 len); // thrown std::exception will be handled + +/* Display netplay-related text. */ +/* NetEcho will be set to TRUE if the displayed text is a network + echo of what we typed. +*/ +void MDFND_NetplayText(const char* text, bool NetEcho); + +int MDFND_NetworkConnect(void); diff --git a/Mednafen/mednafen/netplay.cpp b/Mednafen/mednafen/netplay.cpp new file mode 100644 index 0000000000..5ad174af0f --- /dev/null +++ b/Mednafen/mednafen/netplay.cpp @@ -0,0 +1,1478 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "netplay.h" +#include "netplay-driver.h" +#include "general.h" +#include "string/trim.h" +#include "state.h" +#include "movie.h" +#include +#include "mempatcher.h" + +#include "MemoryStream.h" + +#include "driver.h" + +int MDFNnetplay=0; + +static std::map PlayersList; +static char *OurNick = NULL; + +static bool Joined = false; +static uint32 LocalPlayersMask = 0; +static uint32 LocalInputStateSize = 0; +static uint32 TotalInputStateSize = 0; +static uint8 PortVtoLVMap[16]; +static uint8 PortLVtoVMap[16]; +static std::vector PreNPPortDataPortData[16]; +static std::vector PostEmulatePortData[16]; +static bool StateLoaded; // Set to true/false in Netplay_Update() call paths, used in Netplay_PostProcess() + // to determine where to pull switch data from. + +static std::unique_ptr incoming_buffer; // TotalInputStateSize + 1 +static std::unique_ptr outgoing_buffer; // 1 + LocalInputStateSize + 4 + +static void RebuildPortVtoVMap(const uint32 PortDevIdx[]) +{ + const unsigned NumPorts = MDFNGameInfo->PortInfo.size(); + + memset(PortVtoLVMap, 0xFF, sizeof(PortVtoLVMap)); + memset(PortLVtoVMap, 0xFF, sizeof(PortLVtoVMap)); + + for(unsigned x = 0; x < NumPorts; x++) + { + if(LocalPlayersMask & (1U << x)) + { + for(unsigned n = 0; n <= x; n++) + { + auto const* IDII_N = &MDFNGameInfo->PortInfo[n].DeviceInfo[PortDevIdx[n]].IDII; + auto const* IDII_X = &MDFNGameInfo->PortInfo[x].DeviceInfo[PortDevIdx[x]].IDII; + + if(PortLVtoVMap[n] == 0xFF && IDII_N == IDII_X) + { + PortLVtoVMap[n] = x; + PortVtoLVMap[x] = n; + break; + } + } + } + } +} + +static void SetLPM(const uint32 v, const uint32 PortDevIdx[], const uint32 PortLen[]) +{ + LocalPlayersMask = v; + LocalInputStateSize = 0; + + for(unsigned x = 0; x < MDFNGameInfo->PortInfo.size(); x++) + { + if(LocalPlayersMask & (1U << x)) + LocalInputStateSize += PortLen[x]; + } + + outgoing_buffer.reset(nullptr); + outgoing_buffer.reset(new uint8[1 + LocalInputStateSize + 4]); + + RebuildPortVtoVMap(PortDevIdx); +} + + +static void NetError(const char *format, ...) +{ + char *temp = NULL; + va_list ap; + + va_start(ap, format); + temp = trio_vaprintf(format, ap); + va_end(ap); + + MDFND_NetplayText(temp, FALSE); + MDFND_NetworkClose(); + free(temp); +} + +static void NetPrintText(const char *format, ...) +{ + char *temp = NULL; + va_list ap; + + va_start(ap, format); + temp = trio_vaprintf(format, ap); + va_end(ap); + + MDFND_NetplayText(temp, FALSE); + free(temp); +} + + +void MDFNI_NetplayStop(void) +{ + if(MDFNnetplay) + { + Joined = false; + MDFNnetplay = 0; + MDFN_FlushGameCheats(1); /* Don't save netplay cheats. */ + MDFN_LoadGameCheats(0); /* Reload our original cheats. */ + if(OurNick) + { + free(OurNick); + OurNick = NULL; + } + PlayersList.clear(); + incoming_buffer.reset(nullptr); + outgoing_buffer.reset(nullptr); + } + else puts("Check your code!"); +} + +struct login_data_t +{ + uint8 gameid[16]; + uint8 password[16]; + + uint8 protocol_version; + uint8 total_controllers; + uint8 padding0[2]; + + uint8 emu_name_len[4]; // Length of emulator name and version string(up to 64 bytes) - (note that any non-0 + // bytes < 0x20 in this string will be replaced by 0x20). + + uint8 padding1[8]; + + uint8 controller_data_size[16]; + + uint8 padding3[16]; + + uint8 controller_type[16]; + + uint8 local_players; +}; + +#if 0 +// WIP, mostly just ideas now, nothing to justify implementing it. +struct p4_login_data_t +{ + uint8 magic[16]; // MEDNAFEN_NETPLAY + uint8 protocol_version[4]; // uint32 + + // + // + // + uint8 password[16]; // + uint8 nickname[256]; // + + // + // + // + uint8 game_id[32]; + uint8 emu_id[256]; + + uint8 total_controllers; // Total number of controllers(max 32) + uint8 controller_type[32]; + uint8 controller_data_size[32]; + uint8 local_controllers; // Number of local controllers. +}; +#endif + +int NetplayStart(const uint32 PortDeviceCache[16], const uint32 PortDataLenCache[16]) +{ + try + { + const char *emu_id = PACKAGE " " MEDNAFEN_VERSION; + const uint32 local_players = MDFN_GetSettingUI("netplay.localplayers"); + const std::string nickname = MDFN_GetSettingS("netplay.nick"); + const std::string game_key = MDFN_GetSettingS("netplay.gamekey"); + const std::string connect_password = MDFN_GetSettingS("netplay.password"); + login_data_t *ld = NULL; + std::vector sendbuf; + + PlayersList.clear(); + MDFNnetplay = true; + + sendbuf.resize(4 + sizeof(login_data_t) + nickname.size() + strlen(emu_id)); + + MDFN_en32lsb(&sendbuf[0], sendbuf.size() - 4); + ld = (login_data_t*)&sendbuf[4]; + + if(game_key != "") + { + md5_context md5; + uint8 md5out[16]; + + md5.starts(); + md5.update(MDFNGameInfo->MD5, 16); + md5.update((uint8 *)game_key.c_str(), game_key.size()); + md5.finish(md5out); + memcpy(ld->gameid, md5out, 16); + } + else + memcpy(ld->gameid, MDFNGameInfo->MD5, 16); + + if(connect_password != "") + { + md5_context md5; + uint8 md5out[16]; + + md5.starts(); + md5.update((uint8*)connect_password.c_str(), connect_password.size()); + md5.finish(md5out); + memcpy(ld->password, md5out, 16); + } + + assert(MDFNGameInfo->PortInfo.size() <= 16); + + ld->protocol_version = 3; + + // Set input device number thingies here. + ld->total_controllers = MDFNGameInfo->PortInfo.size(); // Total number of ports + + MDFN_en32lsb(ld->emu_name_len, strlen(emu_id)); + + // Controller data sizes. + for(unsigned x = 0; x < MDFNGameInfo->PortInfo.size(); x++) + ld->controller_data_size[x] = PortDataLenCache[x]; + + // Controller types + for(unsigned x = 0; x < MDFNGameInfo->PortInfo.size(); x++) + ld->controller_type[x] = PortDeviceCache[x]; // FIXME: expand controller_type from 8-bit -> 32-bit + + ld->local_players = local_players; + + if(nickname != "") + memcpy(&sendbuf[4 + sizeof(login_data_t)], nickname.c_str(), nickname.size()); + + memcpy(&sendbuf[4 + sizeof(login_data_t) + nickname.size()], emu_id, strlen(emu_id)); + + MDFND_SendData(&sendbuf[0], sendbuf.size()); + + TotalInputStateSize = 0; + for(unsigned x = 0; x < MDFNGameInfo->PortInfo.size(); x++) + TotalInputStateSize += PortDataLenCache[x]; + + // Hack so the server can always encode its command data length properly(a matching "hack" exists in the server). + if(TotalInputStateSize < 4) + TotalInputStateSize = 4; + + incoming_buffer.reset(nullptr); + incoming_buffer.reset(new uint8[TotalInputStateSize + 1]); + + SetLPM(0, PortDeviceCache, PortDataLenCache); + Joined = false; + + // + // + // + for(unsigned x = 0; x < MDFNGameInfo->PortInfo.size(); x++) + { + PreNPPortDataPortData[x].assign(PortDataLenCache[x], 0); + PostEmulatePortData[x].assign(PortDataLenCache[x], 0); + } + + MDFN_FlushGameCheats(0); /* Save our pre-netplay cheats. */ + + if(MDFNMOV_IsPlaying()) /* Recording's ok during netplay, playback is not. */ + MDFNMOV_Stop(); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + return(false); + } + + //printf("%d\n", TotalInputStateSize); + + return(1); +} + +static void SendCommand(uint8 cmd, uint32 len, const void* data = NULL) +{ + outgoing_buffer[0] = cmd; + memset(&outgoing_buffer[1], 0, LocalInputStateSize); + MDFN_en32lsb(&outgoing_buffer[1 + LocalInputStateSize], len); + MDFND_SendData(&outgoing_buffer[0], LocalInputStateSize + 1 + 4); + + if(data != NULL) + { + MDFND_SendData(data, len); + } +} + +bool NetplaySendCommand(uint8 cmd, uint32 len, const void* data) +{ + try + { + SendCommand(cmd, len, data); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + return(false); + } + return(true); +} + +static std::string GenerateMPSString(uint32 mps, bool ctlr_string = false) +{ + char tmpbuf[256]; + + tmpbuf[0] = 0; + + if(!mps) + { + if(!ctlr_string) + trio_snprintf(tmpbuf, sizeof(tmpbuf), _("a lurker")); + } + else + trio_snprintf(tmpbuf, sizeof(tmpbuf), ("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"), ctlr_string ? ((mps == round_up_pow2(mps)) ? _("controller") : _("controllers")) : ((mps == round_up_pow2(mps)) ? _("player") : _("players")), + (mps & 0x0001) ? " 1" : "", + (mps & 0x0002) ? " 2" : "", + (mps & 0x0004) ? " 3" : "", + (mps & 0x0008) ? " 4" : "", + (mps & 0x0010) ? " 5" : "", + (mps & 0x0020) ? " 6" : "", + (mps & 0x0040) ? " 7" : "", + (mps & 0x0080) ? " 8" : "", + (mps & 0x0100) ? " 9" : "", + (mps & 0x0200) ? " 10" : "", + (mps & 0x0400) ? " 11" : "", + (mps & 0x0800) ? " 12" : "", + (mps & 0x1000) ? " 13" : "", + (mps & 0x2000) ? " 14" : "", + (mps & 0x4000) ? " 15" : "", + (mps & 0x8000) ? " 16" : ""); + + + return(std::string(tmpbuf)); +} + +static void MDFNI_NetplaySwap(uint8 a, uint8 b) +{ + try + { + SendCommand(MDFNNPCMD_CTRLR_SWAP, (a << 0) | (b << 8)); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void MDFNI_NetplayTake(uint32 mask) +{ + try + { + SendCommand(MDFNNPCMD_CTRLR_TAKE, mask); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void MDFNI_NetplayDrop(uint32 mask) +{ + try + { + SendCommand(MDFNNPCMD_CTRLR_DROP, mask); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void MDFNI_NetplayDupe(uint32 mask) +{ + try + { + SendCommand(MDFNNPCMD_CTRLR_DUPE, mask); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void MDFNI_NetplayList(void) +{ + try + { + for(auto& it : PlayersList) + { + NetPrintText(_("** <%s> is %s"), it.first.c_str(), GenerateMPSString(it.second).c_str()); + } + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + + +static void MDFNI_NetplayPing(void) +{ + try + { + uint64 now_time; + + now_time = MDFND_GetTime(); + + // Endianness doesn't matter, since it will be echoed back only to us. + SendCommand(MDFNNPCMD_ECHO, sizeof(now_time), &now_time); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} +#if 0 +static void MDFNI_NetplayIntegrity(void) +{ + try + { + SendCommand(MDFNNPCMD_INTEGRITY, 0); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} +#endif +static void MDFNI_NetplayText(const char *text) +{ + try + { + uint32 len; + + if(!Joined) return; + + len = strlen(text); + + SendCommand(MDFNNPCMD_TEXT, len, text); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void MDFNI_NetplayChangeNick(const char* newnick) +{ + try + { + uint32 len; + + if(!Joined) return; + + len = strlen(newnick); + + SendCommand(MDFNNPCMD_SETNICK, len, newnick); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void MDFNI_NetplayQuit(const char *quit_message) +{ + try + { + SendCommand(MDFNNPCMD_QUIT, strlen(quit_message), quit_message); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + + +// +// Integrity checking is experimental, and needs work to function properly(in the emulator cores). +// +static int SendIntegrity(void) +{ + MemoryStream sm(65536); + md5_context md5; + uint8 digest[16]; + + // Do not do a raw/data-only state for speed, due to lack of endian and bool conversion. + MDFNSS_SaveSM(&sm, false); + + md5.starts(); + md5.update(sm.map(), sm.size()); + md5.finish(digest); + + SendCommand(MDFNNPCMD_INTEGRITY_RES, 16, digest); + + return(1); +} + + +static void SendState(void) +{ + std::vector cbuf; + uLongf clen; + + { + MemoryStream sm(65536); + + MDFNSS_SaveSM(&sm, false); + + clen = sm.size() + sm.size() / 1000 + 12; + cbuf.resize(4 + clen); + MDFN_en32lsb(&cbuf[0], sm.size()); + compress2((Bytef *)&cbuf[0] + 4, &clen, (Bytef *)sm.map(), sm.size(), 7); + } + + SendCommand(MDFNNPCMD_LOADSTATE, clen + 4, &cbuf[0]); +} + +static void RecvState(const uint32 clen) +{ + std::vector cbuf; + + if(clen < 4) + { + throw MDFN_Error(0, _("Compressed save state data is too small: %u"), clen); + } + + if(clen > 8 * 1024 * 1024) // Compressed length sanity check - 8 MiB max. + { + throw MDFN_Error(0, _("Compressed save state data is too large: %u"), clen); + } + + cbuf.resize(clen); + + MDFND_RecvData(&cbuf[0], clen); + + uLongf len = MDFN_de32lsb(&cbuf[0]); + if(len > 12 * 1024 * 1024) // Uncompressed length sanity check - 12 MiB max. + { + throw MDFN_Error(0, _("Uncompressed save state data is too large: %llu"), (unsigned long long)len); + } + + MemoryStream sm(len, -1); + + uncompress((Bytef *)sm.map(), &len, (Bytef *)&cbuf[0] + 4, clen - 4); + + MDFNSS_LoadSM(&sm, false); + + if(MDFNMOV_IsRecording()) + MDFNMOV_RecordState(); +} + +void NetplaySendState(void) +{ + try + { + SendState(); + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +static void ProcessCommand(const uint8 cmd, const uint32 raw_len, const uint32 PortDevIdx[], uint8* const PortData[], const uint32 PortLen[], int NumPorts) +{ + switch(cmd) + { + case 0: break; // No command + + default: MDFN_DoSimpleCommand(cmd); + break; + + case MDFNNPCMD_INTEGRITY: + SendIntegrity(); + break; + + case MDFNNPCMD_REQUEST_STATE: + SendState(); + break; + + case MDFNNPCMD_LOADSTATE: + RecvState(raw_len); + StateLoaded = true; + MDFN_DispMessage(_("Remote state loaded.")); + break; + + case MDFNNPCMD_SET_MEDIA: + { + uint8 buf[4 * 4]; + + MDFND_RecvData(buf, sizeof(buf)); + + MDFN_UntrustedSetMedia(MDFN_de32lsb(&buf[0]), MDFN_de32lsb(&buf[4]), MDFN_de32lsb(&buf[8]), MDFN_de32lsb(&buf[12])); + } + break; + + case MDFNNPCMD_SERVERTEXT: + { + static const uint32 MaxLength = 2000; + uint8 neobuf[MaxLength + 1]; + char *textbuf = NULL; + const uint32 totallen = raw_len; + + if(totallen > MaxLength) // Sanity check + { + throw MDFN_Error(0, _("Text length is too long: %u"), totallen); + } + + MDFND_RecvData(neobuf, totallen); + + neobuf[totallen] = 0; + trio_asprintf(&textbuf, "** %s", neobuf); + MDFND_NetplayText(textbuf, FALSE); + free(textbuf); + } + break; + + case MDFNNPCMD_ECHO: + { + uint32 totallen = raw_len; + uint64 then_time; + uint64 now_time; + + if(totallen != sizeof(then_time)) + { + throw MDFN_Error(0, _("Echo response length is incorrect size: %u"), totallen); + } + + MDFND_RecvData(&then_time, sizeof(then_time)); + + now_time = MDFND_GetTime(); + + char *textbuf = NULL; + trio_asprintf(&textbuf, _("*** Round-trip time: %llu ms"), (unsigned long long)(now_time - then_time)); + MDFND_NetplayText(textbuf, FALSE); + free(textbuf); + } + break; + + case MDFNNPCMD_TEXT: + { + static const uint32 MaxLength = 2000; + char neobuf[MaxLength + 1]; + const uint32 totallen = raw_len; + uint32 nicklen; + bool NetEcho = false; + char *textbuf = NULL; + + if(totallen < 4) + { + throw MDFN_Error(0, _("Text command length is too short: %u"), totallen); + } + + if(totallen > MaxLength) // Sanity check + { + throw MDFN_Error(0, _("Text command length is too long: %u"), totallen); + } + + MDFND_RecvData(neobuf, totallen); + + nicklen = MDFN_de32lsb(neobuf); + if(nicklen > (totallen - 4)) // Sanity check + { + throw MDFN_Error(0, _("Received nickname length is too long: %u"), nicklen); + } + + neobuf[totallen] = 0; + + if(nicklen) + { + memmove(neobuf, neobuf + 4, nicklen); + neobuf[nicklen] = 0; + + if(OurNick && !strcasecmp(OurNick, neobuf)) + { + trio_asprintf(&textbuf, "> %s", &neobuf[4 + nicklen]); + NetEcho = true; + } + else + trio_asprintf(&textbuf, "<%s> %s", neobuf, &neobuf[4 + nicklen]); + } + else + { + trio_asprintf(&textbuf, "* %s", &neobuf[4]); + } + MDFND_NetplayText(textbuf, NetEcho); + free(textbuf); + } + break; + + case MDFNNPCMD_NICKCHANGED: + { + static const uint32 MaxLength = 2000; + uint8 neobuf[MaxLength + 1]; + uint8 *newnick; + char *textbuf = NULL; + const uint32 len = raw_len; + + if(len > MaxLength) // Sanity check + { + throw MDFN_Error(0, _("Nickname change length is too long: %u"), len); + } + + MDFND_RecvData(neobuf, len); + + neobuf[len] = 0; + + newnick = (uint8*)strchr((char*)neobuf, '\n'); + + if(newnick) + { + bool IsMeow = FALSE; + *newnick = 0; + newnick++; + if(OurNick) + { + if(!strcasecmp((char*)neobuf, (char*)OurNick)) + { + free(OurNick); + OurNick = strdup((char*)newnick); + textbuf = trio_aprintf(_("* You are now known as <%s>."), newnick); + IsMeow = TRUE; + } + } + if(!textbuf) + textbuf = trio_aprintf(_("* <%s> is now known as <%s>"), neobuf, newnick); + MDFND_NetplayText(textbuf, IsMeow); + free(textbuf); + + // Update players list. + { + const std::string ons = std::string((const char*)neobuf); + const std::string nns = std::string((const char*)newnick); + + if(ons != nns) + { + auto ons_it = PlayersList.find(ons); + auto nns_it = PlayersList.find(nns); + + if(ons_it == PlayersList.end() || nns_it != PlayersList.end()) + MDFND_NetplayText(_("[BUG] Players list state out of sync."), false); + else + { + PlayersList[nns] = ons_it->second; + PlayersList.erase(ons_it); + } + } + } + } + } + break; + + case MDFNNPCMD_CTRL_CHANGE: + { + const uint32 len = raw_len; + + // + // Joined = true; + SendCommand(MDFNNPCMD_CTRL_CHANGE_ACK, len); + // + // + LocalInputStateSize = 0; + SetLPM(len, PortDevIdx, PortLen); + } + break; + + case MDFNNPCMD_CTRLR_SWAP_NOTIF: + { + const uint32 cm = raw_len; + char textbuf[512]; + const uint8 c0 = cm & 0xFF; + const uint8 c1 = (cm >> 8) & 0xFF; + + trio_snprintf(textbuf, sizeof(textbuf), _("* All instances of controllers %u and %u have been swapped."), c0 + 1, c1 + 1); + MDFND_NetplayText(textbuf, false); + + for(auto& it : PlayersList) + { + uint32 mps = it.second; + bool c0b, c1b; + + // Grab bits first before any clearing. + c0b = ((c0 < sizeof(mps) * 8) ? ((mps >> c0) & 1) : false); + c1b = ((c1 < sizeof(mps) * 8) ? ((mps >> c1) & 1) : false); + + if(c0 < sizeof(mps) * 8) + { + mps &= ~((uint32)1 << c0); + mps |= (uint32)c1b << c0; + } + + if(c1 < sizeof(mps) * 8) + { + mps &= ~((uint32)1 << c1); + mps |= (uint32)c0b << c1; + } + + it.second = mps; + } + } + break; + + case MDFNNPCMD_CTRLR_TAKE_NOTIF: + case MDFNNPCMD_CTRLR_DROP_NOTIF: + case MDFNNPCMD_CTRLR_DUPE_NOTIF: + { + static const uint32 MaxNicknameLength = 1000; + static const uint32 MaxLength = 12 + MaxNicknameLength; + const char *fstr = NULL; + const uint32 len = raw_len; + uint8 ntf_buf[MaxLength + 1]; + char *textbuf = NULL; + + if(len < 12) + throw MDFN_Error(0, _("Take/drop/dupe notification is too short: %u"), len); + + if(len > MaxLength) + throw MDFN_Error(0, _("Take/drop/dupe notification is too long: %u"), len); + + MDFND_RecvData(ntf_buf, len); + ntf_buf[len] = 0; + + switch(cmd) + { + case MDFNNPCMD_CTRLR_TAKE_NOTIF: + fstr = _("* <%s> took all instances of %s, and is now %s."); + break; + + case MDFNNPCMD_CTRLR_DUPE_NOTIF: + fstr = _("* <%s> took copies of %s, and is now %s."); + break; + + case MDFNNPCMD_CTRLR_DROP_NOTIF: + fstr = _("* <%s> dropped %s, and is now %s."); + break; + } + trio_asprintf(&textbuf, fstr, ntf_buf + 12, GenerateMPSString(MDFN_de32lsb(&ntf_buf[0]), true).c_str(), GenerateMPSString(MDFN_de32lsb(&ntf_buf[4]), false).c_str()); + MDFND_NetplayText(textbuf, false); + free(textbuf); + + // Update players list. + { + auto it = PlayersList.find(std::string((const char*)ntf_buf + 12)); + + if(it == PlayersList.end()) + MDFND_NetplayText(_("[BUG] Players list state out of sync."), false); + else + it->second = MDFN_de32lsb(&ntf_buf[4]); + } + } + break; + + case MDFNNPCMD_YOUJOINED: + case MDFNNPCMD_YOULEFT: + case MDFNNPCMD_PLAYERLEFT: + case MDFNNPCMD_PLAYERJOINED: + { + static const uint32 MaxLength = 2000; + uint8 neobuf[MaxLength + 1]; + char *textbuf = NULL; + uint32 mps; + std::string mps_string; + const uint32 len = raw_len; + + if(len < 8) + { + throw MDFN_Error(0, _("Join/Left length is too short: %u"), len); + } + + if(len > MaxLength) // Sanity check + { + throw MDFN_Error(0, _("Join/Left length is too long: %u"), len); + } + + MDFND_RecvData(neobuf, len); + neobuf[len] = 0; // NULL-terminate the string + + mps = MDFN_de32lsb(&neobuf[0]); + + mps_string = GenerateMPSString(mps); + + if(cmd == MDFNNPCMD_YOULEFT) + { + // Uhm, not supported yet! + SetLPM(0, PortDevIdx, PortLen); + Joined = FALSE; + } + else if(cmd == MDFNNPCMD_YOUJOINED) + { + if(OurNick) // This shouldn't happen, really... + { + free(OurNick); + OurNick = NULL; + } + OurNick = strdup((char*)neobuf + 8); + + trio_asprintf(&textbuf, _("* You, %s, have connected as: %s"), neobuf + 8, mps_string.c_str()); + + SetLPM(mps, PortDevIdx, PortLen); + Joined = TRUE; + + SendCommand(MDFNNPCMD_SETFPS, MDFNGameInfo->fps); + } + else if(cmd == MDFNNPCMD_PLAYERLEFT) + { + trio_asprintf(&textbuf, _("* %s(%s) has left"), neobuf + 8, mps_string.c_str()); + } + else + { + trio_asprintf(&textbuf, _("* %s has connected as: %s"), neobuf + 8, mps_string.c_str()); + } + + MDFND_NetplayText(textbuf, FALSE); + free(textbuf); + + // Update players list. + if(cmd == MDFNNPCMD_YOUJOINED || cmd == MDFNNPCMD_PLAYERJOINED) + { + PlayersList[std::string((const char*)neobuf + 8)] = mps; + } + else + { + auto it = PlayersList.find(std::string((const char*)neobuf + 8)); + + if(it == PlayersList.end()) + MDFND_NetplayText(_("[BUG] Players list state out of sync."), false); + else + PlayersList.erase(it); + } + } + break; + } +} + +#if 0 + for(auto const& idii : *IDII_N) + { + if(idii.Type == IDIT_SWITCH) + { + const uint32 cur = BitsExtract(&PortData[n][0], idii.BitOffset, idii.BitSize); + const uint32 prev = BitsExtract(&PrevPortData[n][0], idii.BitOffset, idii.BitSize); + const uint32 delta = cur - prev; + + printf("%d\n", delta); + + // We mustn't modify PortData with this filter, only outgoing_buffer(because we can load state in the middle of this function, + // which will load new port data that doesn't have this filter applied, and things go boom-boom)! + BitsIntract(&outgoing_buffer[wpos], idii.BitOffset, idii.BitSize, delta); + } + } +#endif + +#if 0 + if(LocalPlayersMask & (1 << x)) + { + for(unsigned n = 0; n <= x; n++) + { + auto const* IDII_N = &MDFNGameInfo->PortInfo[n].DeviceInfo[PortDevIdx[n]].IDII; + auto const* IDII_X = &MDFNGameInfo->PortInfo[x].DeviceInfo[PortDevIdx[x]].IDII; + + if(!Taken[n] && IDII_N == IDII_X) + { + memcpy(outgoing_buffer + wpos, PortData[n], PortLen[n]); + Taken[n] = TRUE; + wpos += PortLen[n]; + break; + } + } + } +#endif + +void Netplay_Update(const uint32 PortDevIdx[], uint8* const PortData[], const uint32 PortLen[]) +{ + const unsigned NumPorts = MDFNGameInfo->PortInfo.size(); + + StateLoaded = false; + + try + { + // + // + // + if(Joined) + { + outgoing_buffer[0] = 0; // Not a command + + for(unsigned x = 0, wpos = 1; x < NumPorts; x++) + { + if(!PortLen[x]) + continue; + + memcpy(PreNPPortDataPortData[x].data(), PortData[x], PortLen[x]); + + auto n = PortVtoLVMap[x]; + if(n != 0xFF) + { + memcpy(&outgoing_buffer[wpos], PortData[n], PortLen[n]); + wpos += PortLen[n]; + } + } + MDFND_SendData(&outgoing_buffer[0], 1 + LocalInputStateSize); + } + // + // + // + uint8 cmd; + uint32 cmd_raw_len; + + do + { + MDFND_RecvData(&incoming_buffer[0], TotalInputStateSize + 1); + + cmd = incoming_buffer[TotalInputStateSize]; + cmd_raw_len = MDFN_de32lsb(&incoming_buffer[0]); + + if(cmd != 0) + ProcessCommand(cmd, cmd_raw_len, PortDevIdx, PortData, PortLen, NumPorts); + } while(cmd != 0); + + // + // Update local port data buffers with data received. + // + for(unsigned x = 0, rpos = 0; x < NumPorts; x++) + { + memcpy(PortData[x], &incoming_buffer[rpos], PortLen[x]); + rpos += PortLen[x]; + } + } + catch(std::exception &e) + { + NetError("%s", e.what()); + } +} + +void Netplay_PostProcess(const uint32 PortDevIdx[], uint8* const PortData[], const uint32 PortLen[]) +{ + const unsigned NumPorts = MDFNGameInfo->PortInfo.size(); + + // + // Make a backup copy of the current port data, then zero the port data(specifically for rumble and status bits). + // + for(unsigned x = 0; x < NumPorts; x++) + { + if(!PortLen[x]) + continue; + + assert(PostEmulatePortData[x].size() == PortLen[x]); + assert(PreNPPortDataPortData[x].size() == PortLen[x]); + + memcpy(PostEmulatePortData[x].data(), PortData[x], PortLen[x]); + memset(PortData[x], 0, PortLen[x]); + } + + // + // Remap rumble and status(along with other data that doesn't matter), and copy switch state bits + // into the current port data from a backup copy saved BEFORE all netplay shenanigans(including load remote save state), + // as a kludgey way of keeping switches from getting into a delay/feedback loop and going bonkers. + // + for(unsigned x = 0; x < NumPorts; x++) + { + if(PortLVtoVMap[x] != 0xFF) + memcpy(PortData[x], PostEmulatePortData[PortLVtoVMap[x]].data(), PortLen[x]); + + for(auto const& idii : MDFNGameInfo->PortInfo[x].DeviceInfo[PortDevIdx[x]].IDII) + { + switch(idii.Type) + { + default: + break; + case IDIT_SWITCH: + { + uint32 tmp; + + tmp = BitsExtract(PreNPPortDataPortData[x].data(), idii.BitOffset, idii.BitSize); + BitsIntract(PortData[x], idii.BitOffset, idii.BitSize, tmp); + } + break; + } + } + } +} + +// +// +// +// + +struct CommandEntry +{ + const char *name; + bool (*func)(const char* arg); + const char *help_args; + const char *help_desc; +}; + +static bool CC_server(const char *arg); +static bool CC_quit(const char *arg); +static bool CC_help(const char *arg); +static bool CC_nick(const char *arg); +static bool CC_ping(const char *arg); +//static bool CC_integrity(const char *arg); +static bool CC_gamekey(const char *arg); +static bool CC_swap(const char *arg); +static bool CC_dupe(const char *arg); +static bool CC_drop(const char *arg); +static bool CC_take(const char *arg); +static bool CC_list(const char *arg); + +static CommandEntry ConsoleCommands[] = +{ + { "/server", CC_server, gettext_noop("[REMOTE_HOST] [PORT]"), "Connects to REMOTE_HOST(IP address or FQDN), on PORT." }, + + { "/connect", CC_server, NULL, NULL }, + + { "/gamekey", CC_gamekey, gettext_noop("[GAMEKEY]"), gettext_noop("Changes the game key to the specified GAMEKEY.") }, + + { "/quit", CC_quit, gettext_noop("[MESSAGE]"), gettext_noop("Disconnects from the netplay server.") }, + + { "/help", CC_help, "", gettext_noop("Help, I'm drowning in a sea of cliche metaphors!") }, + + { "/nick", CC_nick, gettext_noop("NICKNAME"), gettext_noop("Changes your nickname to the specified NICKNAME.") }, + + { "/swap", CC_swap, gettext_noop("A B"), gettext_noop("Swap/Exchange all instances of controllers A and B(numbered from 1).") }, + + { "/dupe", CC_dupe, gettext_noop("[A] [...]"), gettext_noop("Duplicate and take instances of specified controller(s).") }, + { "/drop", CC_drop, gettext_noop("[A] [...]"), gettext_noop("Drop all instances of specified controller(s).") }, + { "/take", CC_take, gettext_noop("[A] [...]"), gettext_noop("Take all instances of specified controller(s).") }, + + { "/list", CC_list, "", "List players in game." }, + + { "/ping", CC_ping, "", "Pings the server." }, + + //{ "/integrity", CC_integrity, "", "Starts netplay integrity check sequence." }, + + { NULL, NULL }, +}; + + +static bool CC_server(const char *arg) +{ + char server[300]; + unsigned int port = 0; + + server[0] = 0; + + switch(trio_sscanf(arg, "%299s %u", server, &port)) + { + default: + case 0: + break; + + case 1: + MDFNI_SetSetting("netplay.host", server); + break; + + case 2: + MDFNI_SetSetting("netplay.host", server); + MDFNI_SetSettingUI("netplay.port", port); + break; + } + + MDFND_NetworkConnect(); + + return(false); +} + +static bool CC_gamekey(const char *arg) +{ + MDFNI_SetSetting("netplay.gamekey", arg); + + if(arg[0] == 0) + NetPrintText(_("** Game key cleared.")); + else + { + NetPrintText(_("** Game key changed to: %s"), arg); + } + + if(MDFNnetplay) + { + NetPrintText(_("** Caution: Changing the game key will not affect the current netplay session.")); + } + +// SendCEvent(CEVT_NP_SETGAMEKEY, strdup(arg), NULL); + return(true); +} + +static bool CC_quit(const char *arg) +{ + if(MDFNnetplay) + { + MDFNI_NetplayQuit(arg); + MDFND_NetworkClose(); + } + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + + return(false); +} + +static bool CC_list(const char *arg) +{ + if(MDFNnetplay) + MDFNI_NetplayList(); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + + return(true); +} + +static bool CC_swap(const char *arg) +{ + int a = 0, b = 0; + + if(sscanf(arg, "%u %u", &a, &b) == 2 && a && b) + { + uint32 sc = ((a - 1) & 0xFF) | (((b - 1) & 0xFF) << 8); + + if(MDFNnetplay) + MDFNI_NetplaySwap((sc >> 0) & 0xFF, (sc >> 8) & 0xFF); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + } + else + { + NetPrintText(_("*** %s command requires at least %u non-zero integer argument(s)."), "SWAP", 2); + return(true); + } + + return(false); +} + +static bool CC_dupe(const char *arg) +{ + int tmp[32]; + int count; + + + memset(tmp, 0, sizeof(tmp)); + count = sscanf(arg, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u", + &tmp[0x00], &tmp[0x01], &tmp[0x02], &tmp[0x03], &tmp[0x04], &tmp[0x05], &tmp[0x06], &tmp[0x07], + &tmp[0x08], &tmp[0x09], &tmp[0x0A], &tmp[0x0B], &tmp[0x0C], &tmp[0x0D], &tmp[0x0E], &tmp[0x0F], + &tmp[0x00], &tmp[0x01], &tmp[0x02], &tmp[0x03], &tmp[0x04], &tmp[0x05], &tmp[0x06], &tmp[0x07], + &tmp[0x08], &tmp[0x09], &tmp[0x0A], &tmp[0x0B], &tmp[0x0C], &tmp[0x0D], &tmp[0x0E], &tmp[0x0F]); + + if(count > 0) + { + uint32 mask = 0; + + for(int i = 0; i < 32; i++) + { + if(tmp[i] > 0) + mask |= 1U << (unsigned)(tmp[i] - 1); + } + + if(MDFNnetplay) + MDFNI_NetplayDupe(mask); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + } + else + { + NetPrintText(_("*** %s command requires at least %u non-zero integer argument(s)."), "DUPE", 1); + return(true); + } + + return(false); +} + +static bool CC_drop(const char *arg) +{ + int tmp[32]; + int count; + + + memset(tmp, 0, sizeof(tmp)); + count = sscanf(arg, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u", + &tmp[0x00], &tmp[0x01], &tmp[0x02], &tmp[0x03], &tmp[0x04], &tmp[0x05], &tmp[0x06], &tmp[0x07], + &tmp[0x08], &tmp[0x09], &tmp[0x0A], &tmp[0x0B], &tmp[0x0C], &tmp[0x0D], &tmp[0x0E], &tmp[0x0F], + &tmp[0x00], &tmp[0x01], &tmp[0x02], &tmp[0x03], &tmp[0x04], &tmp[0x05], &tmp[0x06], &tmp[0x07], + &tmp[0x08], &tmp[0x09], &tmp[0x0A], &tmp[0x0B], &tmp[0x0C], &tmp[0x0D], &tmp[0x0E], &tmp[0x0F]); + + if(count > 0) + { + uint32 mask = 0; + + for(int i = 0; i < 32; i++) + { + if(tmp[i] > 0) + mask |= 1U << (unsigned)(tmp[i] - 1); + } + + if(MDFNnetplay) + MDFNI_NetplayDrop(mask); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + } + else + { + NetPrintText(_("*** %s command requires at least %u non-zero integer argument(s)."), "DROP", 1); + return(true); + } + + return(false); +} + +static bool CC_take(const char *arg) +{ + int tmp[32]; + int count; + + + memset(tmp, 0, sizeof(tmp)); + count = sscanf(arg, "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u", + &tmp[0x00], &tmp[0x01], &tmp[0x02], &tmp[0x03], &tmp[0x04], &tmp[0x05], &tmp[0x06], &tmp[0x07], + &tmp[0x08], &tmp[0x09], &tmp[0x0A], &tmp[0x0B], &tmp[0x0C], &tmp[0x0D], &tmp[0x0E], &tmp[0x0F], + &tmp[0x00], &tmp[0x01], &tmp[0x02], &tmp[0x03], &tmp[0x04], &tmp[0x05], &tmp[0x06], &tmp[0x07], + &tmp[0x08], &tmp[0x09], &tmp[0x0A], &tmp[0x0B], &tmp[0x0C], &tmp[0x0D], &tmp[0x0E], &tmp[0x0F]); + + if(count > 0) + { + uint32 mask = 0; + + for(int i = 0; i < 32; i++) + { + if(tmp[i] > 0) + mask |= 1U << (unsigned)(tmp[i] - 1); + } + + if(MDFNnetplay) + MDFNI_NetplayTake(mask); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + } + else + { + NetPrintText(_("*** %s command requires at least %u non-zero integer argument(s)."), "TAKE", 1); + return(true); + } + + return(false); +} + +static bool CC_ping(const char *arg) +{ + if(MDFNnetplay) + MDFNI_NetplayPing(); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + + return(false); +} + +#if 0 +static bool CC_integrity(const char *arg) +{ + if(MDFNnetplay) + MDFNI_NetplayIntegrity(); + else + { + NetPrintText(_("*** Not connected!")); + return(true); + } + + return(FALSE); +} +#endif + +static bool CC_help(const char *arg) +{ + for(unsigned int x = 0; ConsoleCommands[x].name; x++) + { + if(ConsoleCommands[x].help_desc) + { + char help_buf[512]; + trio_snprintf(help_buf, 512, "%s %s - %s", ConsoleCommands[x].name, _(ConsoleCommands[x].help_args), _(ConsoleCommands[x].help_desc)); + MDFND_NetplayText(help_buf, false); + } + } + return(true); +} + +static bool CC_nick(const char *arg) +{ + MDFNI_SetSetting("netplay.nick", arg); + + if(MDFNnetplay) + MDFNI_NetplayChangeNick(arg); + + return(true); +} + +void MDFNI_NetplayLine(const char *text, bool &inputable, bool &viewable) +{ + inputable = viewable = false; + + for(unsigned int x = 0; ConsoleCommands[x].name; x++) + { + if(!strncasecmp(ConsoleCommands[x].name, (char*)text, strlen(ConsoleCommands[x].name)) && text[strlen(ConsoleCommands[x].name)] <= 0x20) + { + char *trim_text = strdup((char*)&text[strlen(ConsoleCommands[x].name)]); + + MDFN_trim(trim_text); + + inputable = viewable = ConsoleCommands[x].func(trim_text); + + free(trim_text); + return; + } + } + + if(text[0] != 0) // Is non-empty line? + { + MDFNI_NetplayText(text); + viewable = true; + } +} diff --git a/Mednafen/mednafen/netplay.h b/Mednafen/mednafen/netplay.h new file mode 100644 index 0000000000..faf14ca02a --- /dev/null +++ b/Mednafen/mednafen/netplay.h @@ -0,0 +1,82 @@ +#ifndef _MDFN_NETPLAY_H +#define _MDFN_NETPLAY_H + +int InitNetplay(void); + +void Netplay_Update(const uint32 PortDeviceCache[], uint8* const PortData[], const uint32 PortLen[]); +void Netplay_PostProcess(const uint32 PortDevIdx[], uint8* const PortData[], const uint32 PortLen[]); + +int NetplayStart(const uint32 PortDeviceCache[16], const uint32 PortDataLenCache[16]); +void NetplaySendState(void); +bool NetplaySendCommand(uint8, uint32, const void* data = NULL); + +extern int MDFNnetplay; + +#define MDFNNPCMD_RESET MDFN_MSC_RESET +#define MDFNNPCMD_POWER MDFN_MSC_POWER + +#define MDFNNPCMD_VSUNICOIN MDFN_MSC_INSERT_COIN +#define MDFNNPCMD_VSUNIDIP0 MDFN_MSC_TOGGLE_DIP0 +#define MDFNNPCMD_FDSINSERTx MDFN_MSC_INSERT_DISK0 +#define MDFNNPCMD_FDSINSERT MDFN_MSC_INSERT_DISK +#define MDFNNPCMD_FDSEJECT MDFN_MSC_EJECT_DISK +#define MDFNNPCMD_FDSSELECT MDFN_MSC_SELECT_DISK + +#define MDFNNPCMD_SETFPS 0x40 // Client->server. It should be ignored server-side if it's not from the first + // active player for the game). + +#define MDFNNPCMD_NOP 0x41 // Client->server. + +// +#define MDFNNPCMD_CTRL_CHANGE 0x43 // Server->client. +#define MDFNNPCMD_CTRL_CHANGE_ACK 0x44 // Client->server. Acknowledge controller change. Sent using old local data length, everything after + // this should be new data size. +// + +#define MDFNNPCMD_CTRLR_SWAP_NOTIF 0x68 // Server->Client + +#define MDFNNPCMD_CTRLR_TAKE 0x70 // Client->server. Take the specified controllers(from other clients) +#define MDFNNPCMD_CTRLR_DROP 0x71 // Client->server. Drop(relinquish) the specified controllers. +#define MDFNNPCMD_CTRLR_DUPE 0x72 // Client->server. Take the specified controllers(but let other clients still keep their control). + + +#define MDFNNPCMD_CTRLR_SWAP 0x78 // Client->server. + +#define MDFNNPCMD_REQUEST_LIST 0x7F // client->server + +#define MDFNNPCMD_LOADSTATE 0x80 // Client->server, and server->client +#define MDFNNPCMD_REQUEST_STATE 0x81 // Server->client + +#define MDFNNPCMD_TEXT 0x90 + +#define MDFNNPCMD_SERVERTEXT 0x93 // Server text message(informational), server->client +#define MDFNNPCMD_ECHO 0x94 // Echos the string(no larger than 256 bytes) back to the client(used for pinging). + +#define MDFNNPCMD_INTEGRITY 0x95 // Send from a client to a server, then from the server to all clients. +#define MDFNNPCMD_INTEGRITY_RES 0x96 // Integrity result, sent from the clients to the server. The result should be no larger + // than 256 bytes. + +#define MDFNNPCMD_SETNICK 0x98 /* Sent from client to server only. */ + +#define MDFNNPCMD_PLAYERJOINED 0xA0 // Data: + // +#define MDFNNPCMD_PLAYERLEFT 0xA1 // Data: (see above) + +#define MDFNNPCMD_YOUJOINED 0xB0 +#define MDFNNPCMD_YOULEFT 0xB1 + +#define MDFNNPCMD_NICKCHANGED 0xB8 + +#define MDFNNPCMD_LIST 0xC0 // Server->client + +#define MDFNNPCMD_SET_MEDIA 0xD0 // Client->server, and server->client + +#define MDFNNPCMD_CTRLR_TAKE_NOTIF 0xF0 // Server->client +#define MDFNNPCMD_CTRLR_DROP_NOTIF 0xF1 // Server->client +#define MDFNNPCMD_CTRLR_DUPE_NOTIF 0xF2 // Server->client + + +#define MDFNNPCMD_QUIT 0xFF // Client->server + +int MDFNNET_SendCommand(uint8, uint32); +#endif diff --git a/Mednafen/mednafen/ngp/Makefile.am b/Mednafen/mednafen/ngp/Makefile.am new file mode 100644 index 0000000000..12e06273b6 --- /dev/null +++ b/Mednafen/mednafen/ngp/Makefile.am @@ -0,0 +1,15 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -fno-strict-aliasing +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libngp.a +ngp_SOURCES = bios.cpp biosHLE.cpp dma.cpp flash.cpp gfx.cpp T6W28_Apu.cpp \ + gfx_scanline_mono.cpp gfx_scanline_colour.cpp interrupt.cpp mem.cpp neopop.cpp \ + rom.cpp rtc.cpp sound.cpp Z80_interface.cpp \ + TLCS-900h/TLCS900h_disassemble_extra.cpp TLCS-900h/TLCS900h_disassemble_reg.cpp \ + TLCS-900h/TLCS900h_interpret_single.cpp TLCS-900h/TLCS900h_disassemble_src.cpp \ + TLCS-900h/TLCS900h_interpret.cpp TLCS-900h/TLCS900h_registers.cpp TLCS-900h/TLCS900h_interpret_reg.cpp \ + TLCS-900h/TLCS900h_disassemble.cpp TLCS-900h/TLCS900h_interpret_src.cpp \ + TLCS-900h/TLCS900h_interpret_dst.cpp TLCS-900h/TLCS900h_disassemble_dst.cpp + +libngp_a_SOURCES = $(ngp_SOURCES) diff --git a/Mednafen/mednafen/ngp/Makefile.in b/Mednafen/mednafen/ngp/Makefile.in new file mode 100644 index 0000000000..2fc601761c --- /dev/null +++ b/Mednafen/mednafen/ngp/Makefile.in @@ -0,0 +1,759 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/ngp +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libngp_a_AR = $(AR) $(ARFLAGS) +libngp_a_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = bios.$(OBJEXT) biosHLE.$(OBJEXT) dma.$(OBJEXT) \ + flash.$(OBJEXT) gfx.$(OBJEXT) T6W28_Apu.$(OBJEXT) \ + gfx_scanline_mono.$(OBJEXT) gfx_scanline_colour.$(OBJEXT) \ + interrupt.$(OBJEXT) mem.$(OBJEXT) neopop.$(OBJEXT) \ + rom.$(OBJEXT) rtc.$(OBJEXT) sound.$(OBJEXT) \ + Z80_interface.$(OBJEXT) \ + TLCS-900h/TLCS900h_disassemble_extra.$(OBJEXT) \ + TLCS-900h/TLCS900h_disassemble_reg.$(OBJEXT) \ + TLCS-900h/TLCS900h_interpret_single.$(OBJEXT) \ + TLCS-900h/TLCS900h_disassemble_src.$(OBJEXT) \ + TLCS-900h/TLCS900h_interpret.$(OBJEXT) \ + TLCS-900h/TLCS900h_registers.$(OBJEXT) \ + TLCS-900h/TLCS900h_interpret_reg.$(OBJEXT) \ + TLCS-900h/TLCS900h_disassemble.$(OBJEXT) \ + TLCS-900h/TLCS900h_interpret_src.$(OBJEXT) \ + TLCS-900h/TLCS900h_interpret_dst.$(OBJEXT) \ + TLCS-900h/TLCS900h_disassemble_dst.$(OBJEXT) +am_libngp_a_OBJECTS = $(am__objects_1) +libngp_a_OBJECTS = $(am_libngp_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libngp_a_SOURCES) +DIST_SOURCES = $(libngp_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -fno-strict-aliasing +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libngp.a +ngp_SOURCES = bios.cpp biosHLE.cpp dma.cpp flash.cpp gfx.cpp T6W28_Apu.cpp \ + gfx_scanline_mono.cpp gfx_scanline_colour.cpp interrupt.cpp mem.cpp neopop.cpp \ + rom.cpp rtc.cpp sound.cpp Z80_interface.cpp \ + TLCS-900h/TLCS900h_disassemble_extra.cpp TLCS-900h/TLCS900h_disassemble_reg.cpp \ + TLCS-900h/TLCS900h_interpret_single.cpp TLCS-900h/TLCS900h_disassemble_src.cpp \ + TLCS-900h/TLCS900h_interpret.cpp TLCS-900h/TLCS900h_registers.cpp TLCS-900h/TLCS900h_interpret_reg.cpp \ + TLCS-900h/TLCS900h_disassemble.cpp TLCS-900h/TLCS900h_interpret_src.cpp \ + TLCS-900h/TLCS900h_interpret_dst.cpp TLCS-900h/TLCS900h_disassemble_dst.cpp + +libngp_a_SOURCES = $(ngp_SOURCES) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/ngp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/ngp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +TLCS-900h/$(am__dirstamp): + @$(MKDIR_P) TLCS-900h + @: > TLCS-900h/$(am__dirstamp) +TLCS-900h/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) TLCS-900h/$(DEPDIR) + @: > TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_disassemble_extra.$(OBJEXT): \ + TLCS-900h/$(am__dirstamp) TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_disassemble_reg.$(OBJEXT): \ + TLCS-900h/$(am__dirstamp) TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_interpret_single.$(OBJEXT): \ + TLCS-900h/$(am__dirstamp) TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_disassemble_src.$(OBJEXT): \ + TLCS-900h/$(am__dirstamp) TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_interpret.$(OBJEXT): TLCS-900h/$(am__dirstamp) \ + TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_registers.$(OBJEXT): TLCS-900h/$(am__dirstamp) \ + TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_interpret_reg.$(OBJEXT): TLCS-900h/$(am__dirstamp) \ + TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_disassemble.$(OBJEXT): TLCS-900h/$(am__dirstamp) \ + TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_interpret_src.$(OBJEXT): TLCS-900h/$(am__dirstamp) \ + TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_interpret_dst.$(OBJEXT): TLCS-900h/$(am__dirstamp) \ + TLCS-900h/$(DEPDIR)/$(am__dirstamp) +TLCS-900h/TLCS900h_disassemble_dst.$(OBJEXT): \ + TLCS-900h/$(am__dirstamp) TLCS-900h/$(DEPDIR)/$(am__dirstamp) + +libngp.a: $(libngp_a_OBJECTS) $(libngp_a_DEPENDENCIES) $(EXTRA_libngp_a_DEPENDENCIES) + $(AM_V_at)-rm -f libngp.a + $(AM_V_AR)$(libngp_a_AR) libngp.a $(libngp_a_OBJECTS) $(libngp_a_LIBADD) + $(AM_V_at)$(RANLIB) libngp.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f TLCS-900h/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/T6W28_Apu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Z80_interface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bios.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/biosHLE.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dma.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx_scanline_colour.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx_scanline_mono.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interrupt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/neopop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_disassemble.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_disassemble_dst.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_disassemble_extra.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_disassemble_reg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_disassemble_src.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_interpret.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_interpret_dst.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_interpret_reg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_interpret_single.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_interpret_src.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@TLCS-900h/$(DEPDIR)/TLCS900h_registers.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f TLCS-900h/$(DEPDIR)/$(am__dirstamp) + -rm -f TLCS-900h/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) TLCS-900h/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) TLCS-900h/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/ngp/T6W28_Apu.cpp b/Mednafen/mednafen/ngp/T6W28_Apu.cpp new file mode 100644 index 0000000000..139bee2697 --- /dev/null +++ b/Mednafen/mednafen/ngp/T6W28_Apu.cpp @@ -0,0 +1,420 @@ +// T6W28_Snd_Emu + +#include +#include "T6W28_Apu.h" + +/* Copyright (C) 2003-2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. You should have received a copy of the GNU Lesser General +Public License along with this module; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +// T6W28_Osc + +T6W28_Osc::T6W28_Osc() +{ + outputs [0] = NULL; // always stays NULL + outputs [1] = NULL; + outputs [2] = NULL; + outputs [3] = NULL; +} + +void T6W28_Osc::reset() +{ + delay = 0; + last_amp_left = 0; + last_amp_right = 0; + + volume_left = 0; + volume_right = 0; +} + +// T6W28_Square + +blip_inline void T6W28_Square::reset() +{ + period = 0; + phase = 0; + T6W28_Osc::reset(); +} + +void T6W28_Square::run( sms_time_t time, sms_time_t end_time ) +{ + if ((!volume_left && !volume_right) || period <= 128 ) + { + // ignore 16kHz and higher + if ( last_amp_left ) + { + synth->offset( time, -last_amp_left, outputs[2] ); + last_amp_left = 0; + } + + if ( last_amp_right ) + { + synth->offset( time, -last_amp_right, outputs[1] ); + last_amp_right = 0; + } + + time += delay; + if ( !period ) + { + time = end_time; + } + else if ( time < end_time ) + { + // keep calculating phase + int count = (end_time - time + period - 1) / period; + phase = (phase + count) & 1; + time += count * period; + } + } + else + { + int amp_left = phase ? volume_left : -volume_left; + int amp_right = phase ? volume_right : -volume_right; + + { + int delta_left = amp_left - last_amp_left; + int delta_right = amp_right - last_amp_right; + + if ( delta_left ) + { + last_amp_left = amp_left; + synth->offset( time, delta_left, outputs[2] ); + } + + if ( delta_right ) + { + last_amp_right = amp_right; + synth->offset( time, delta_right, outputs[1] ); + } + } + + time += delay; + if ( time < end_time ) + { + Blip_Buffer* const output_left = this->outputs[2]; + Blip_Buffer* const output_right = this->outputs[1]; + + int delta_left = amp_left * 2; + int delta_right = amp_right * 2; + do + { + delta_left = -delta_left; + delta_right = -delta_right; + + synth->offset_inline( time, delta_left, output_left ); + synth->offset_inline( time, delta_right, output_right ); + time += period; + phase ^= 1; + } + while ( time < end_time ); + + this->last_amp_left = phase ? volume_left : -volume_left; + this->last_amp_right = phase ? volume_right : -volume_right; + } + } + delay = time - end_time; +} + +// T6W28_Noise + +static const int noise_periods [3] = { 0x100, 0x200, 0x400 }; + +blip_inline void T6W28_Noise::reset() +{ + period = &noise_periods [0]; + shifter = 0x4000; + tap = 13; + T6W28_Osc::reset(); +} + +void T6W28_Noise::run( sms_time_t time, sms_time_t end_time ) +{ + int amp_left = volume_left; + int amp_right = volume_right; + + if ( shifter & 1 ) + { + amp_left = -amp_left; + amp_right = -amp_right; + } + + { + int delta_left = amp_left - last_amp_left; + int delta_right = amp_right - last_amp_right; + + if ( delta_left ) + { + last_amp_left = amp_left; + synth.offset( time, delta_left, outputs[2] ); + } + + if ( delta_right ) + { + last_amp_right = amp_right; + synth.offset( time, delta_right, outputs[1] ); + } + } + + time += delay; + + if ( !volume_left && !volume_right ) + time = end_time; + + if ( time < end_time ) + { + Blip_Buffer* const output_left = this->outputs[2]; + Blip_Buffer* const output_right = this->outputs[1]; + + unsigned l_shifter = this->shifter; + int delta_left = amp_left * 2; + int delta_right = amp_right * 2; + + int l_period = *this->period * 2; + if ( !l_period ) + l_period = 16; + + do + { + int changed = (l_shifter + 1) & 2; // set if prev and next bits differ + l_shifter = (((l_shifter << 14) ^ (l_shifter << tap)) & 0x4000) | (l_shifter >> 1); + if ( changed ) + { + delta_left = -delta_left; + synth.offset_inline( time, delta_left, output_left ); + + delta_right = -delta_right; + synth.offset_inline( time, delta_right, output_right ); + } + time += l_period; + } + while ( time < end_time ); + + this->shifter = l_shifter; + this->last_amp_left = delta_left >> 1; + this->last_amp_right = delta_right >> 1; + } + delay = time - end_time; +} + +// T6W28_Apu + +T6W28_Apu::T6W28_Apu() +{ + for ( int i = 0; i < 3; i++ ) + { + squares [i].synth = &square_synth; + oscs [i] = &squares [i]; + } + oscs [3] = &noise; + + volume( 1.0 ); + reset(); +} + +T6W28_Apu::~T6W28_Apu() +{ +} + +void T6W28_Apu::volume( double vol ) +{ + vol *= 0.85 / (osc_count * 64 * 2); + square_synth.volume( vol ); + noise.synth.volume( vol ); +} + +void T6W28_Apu::treble_eq( const blip_eq_t& eq ) +{ + square_synth.treble_eq( eq ); + noise.synth.treble_eq( eq ); +} + +void T6W28_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ) +{ + require( (unsigned) index < osc_count ); + require( (center && left && right) || (!center && !left && !right) ); + T6W28_Osc& osc = *oscs [index]; + osc.outputs [1] = right; + osc.outputs [2] = left; + osc.outputs [3] = center; +} + +void T6W28_Apu::output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ) +{ + for ( int i = 0; i < osc_count; i++ ) + osc_output( i, center, left, right ); +} + +void T6W28_Apu::reset() +{ + last_time = 0; + latch_left = 0; + latch_right = 0; + + squares [0].reset(); + squares [1].reset(); + squares [2].reset(); + noise.reset(); +} + +void T6W28_Apu::run_until( sms_time_t end_time ) +{ + require( end_time >= last_time ); // end_time must not be before previous time + + if ( end_time > last_time ) + { + // run oscillators + for ( int i = 0; i < osc_count; ++i ) + { + T6W28_Osc& osc = *oscs [i]; + if ( osc.outputs[1] ) + { + if ( i < 3 ) + squares [i].run( last_time, end_time ); + else + noise.run( last_time, end_time ); + } + } + + last_time = end_time; + } +} + +bool T6W28_Apu::end_frame( sms_time_t end_time ) +{ + if ( end_time > last_time ) + run_until( end_time ); + + assert( last_time >= end_time ); + last_time -= end_time; + + return(1); +} + +static const unsigned char volumes [16] = { + // volumes [i] = 64 * pow( 1.26, 15 - i ) / pow( 1.26, 15 ) + 64, 50, 39, 31, 24, 19, 15, 12, 9, 7, 5, 4, 3, 2, 1, 0 +}; + +void T6W28_Apu::write_data_left( sms_time_t time, int data ) +{ + require( (unsigned) data <= 0xFF ); + + run_until( time ); + + if ( data & 0x80 ) + latch_left = data; + + int index = (latch_left >> 5) & 3; + + if ( latch_left & 0x10 ) + { + oscs [index]->volume_left = volumes [data & 15]; + } + else if ( index < 3 ) + { + T6W28_Square& sq = squares [index]; + if ( data & 0x80 ) + sq.period = (sq.period & 0xFF00) | (data << 4 & 0x00FF); + else + sq.period = (sq.period & 0x00FF) | (data << 8 & 0x3F00); + } +} + +void T6W28_Apu::write_data_right( sms_time_t time, int data ) +{ + require( (unsigned) data <= 0xFF ); + + run_until( time ); + + if ( data & 0x80 ) + latch_right = data; + + int index = (latch_right >> 5) & 3; + //printf("%d\n", index); + + if ( latch_right & 0x10 ) + { + oscs [index]->volume_right = volumes [data & 15]; + } + else if ( index == 2 ) + { + if ( data & 0x80 ) + noise.period_extra = (noise.period_extra & 0xFF00) | (data << 4 & 0x00FF); + else + noise.period_extra = (noise.period_extra & 0x00FF) | (data << 8 & 0x3F00); + } + else if(index == 3) + { + int select = data & 3; + if ( select < 3 ) + noise.period = &noise_periods [select]; + else + noise.period = &noise.period_extra; + + int const tap_disabled = 16; + noise.tap = (data & 0x04) ? 13 : tap_disabled; + noise.shifter = 0x4000; + } +} + + +void T6W28_Apu::save_state(T6W28_ApuState *ret) +{ + for(int x = 0; x < 4; x++) + { + ret->volume_left[x] = oscs[x]->volume_left; + ret->volume_right[x] = oscs[x]->volume_right; + } + for(int x = 0; x < 3; x++) + { + ret->sq_period[x] = squares[x].period; + ret->sq_phase[x] = squares[x].phase; + } + ret->noise_shifter = noise.shifter; + ret->noise_tap = noise.tap; + + if(noise.period == &noise_periods[0]) + ret->noise_period = 0; + else if(noise.period == &noise_periods[1]) + ret->noise_period = 1; + else if(noise.period == &noise_periods[2]) + ret->noise_period = 2; + else ret->noise_period = 3; + + ret->latch_left = latch_left; + ret->latch_right = latch_right; +} + +void T6W28_Apu::load_state(const T6W28_ApuState *state) +{ + for(int x = 0; x < 4; x++) + { + oscs[x]->volume_left = state->volume_left[x]; + oscs[x]->volume_right = state->volume_right[x]; + } + for(int x = 0; x < 3; x++) + { + squares[x].period = state->sq_period[x]; + squares[x].phase = state->sq_phase[x]; + } + noise.shifter = state->noise_shifter; + noise.tap = state->noise_tap; + + int select = state->noise_period; + + if ( select < 3 ) + noise.period = &noise_periods [select]; + else + noise.period = &noise.period_extra; + + latch_left = state->latch_left; + latch_right = state->latch_right; +} + diff --git a/Mednafen/mednafen/ngp/T6W28_Apu.h b/Mednafen/mednafen/ngp/T6W28_Apu.h new file mode 100644 index 0000000000..f2732c8483 --- /dev/null +++ b/Mednafen/mednafen/ngp/T6W28_Apu.h @@ -0,0 +1,84 @@ +// T6W28_Snd_Emu + +#ifndef SMS_APU_H +#define SMS_APU_H + +typedef long sms_time_t; // clock cycle count + +#include "T6W28_Oscs.h" + +typedef struct +{ + int32 sq_period[3]; + int32 sq_phase[3]; + int32 noise_period; + uint32 noise_shifter; + uint32 noise_tap; + + int32 volume_left[4]; + int32 volume_right[4]; + uint8 latch_left, latch_right; +} T6W28_ApuState; + +class T6W28_Apu { +public: + // Set overall volume of all oscillators, where 1.0 is full volume + void volume( double ); + + // Set treble equalization + void treble_eq( const blip_eq_t& ); + + // Outputs can be assigned to a single buffer for mono output, or to three + // buffers for stereo output (using Stereo_Buffer to do the mixing). + + // Assign all oscillator outputs to specified buffer(s). If buffer + // is NULL, silences all oscillators. + void output( Blip_Buffer* mono ); + void output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ); + + // Assign single oscillator output to buffer(s). Valid indicies are 0 to 3, + // which refer to Square 1, Square 2, Square 3, and Noise. If buffer is NULL, + // silences oscillator. + enum { osc_count = 4 }; + void osc_output( int index, Blip_Buffer* mono ); + void osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right ); + + // Reset oscillators and internal state + void reset(); + + // Write to data port + void write_data_left( sms_time_t, int ); + void write_data_right( sms_time_t, int ); + + // Run all oscillators up to specified time, end current frame, then + // start a new frame at time 0. Returns true if any oscillators added + // sound to one of the left/right buffers, false if they only added + // to the center buffer. + bool end_frame( sms_time_t ); + + void save_state(T6W28_ApuState*); + void load_state(const T6W28_ApuState*); +public: + T6W28_Apu(); + ~T6W28_Apu(); +private: + // noncopyable + T6W28_Apu( const T6W28_Apu& ); + T6W28_Apu& operator = ( const T6W28_Apu& ); + + T6W28_Osc* oscs [osc_count]; + T6W28_Square squares [3]; + T6W28_Square::Synth square_synth; // used by squares + sms_time_t last_time; + int latch_left, latch_right; + T6W28_Noise noise; + + void run_until( sms_time_t ); +}; + +inline void T6W28_Apu::output( Blip_Buffer* b ) { output( b, b, b ); } + +inline void T6W28_Apu::osc_output( int i, Blip_Buffer* b ) { osc_output( i, b, b, b ); } + +#endif + diff --git a/Mednafen/mednafen/ngp/T6W28_Oscs.h b/Mednafen/mednafen/ngp/T6W28_Oscs.h new file mode 100644 index 0000000000..94d3140c97 --- /dev/null +++ b/Mednafen/mednafen/ngp/T6W28_Oscs.h @@ -0,0 +1,55 @@ + +// Private oscillators used by T6W28_Apu + +// T6W28_Snd_Emu + +#ifndef SMS_OSCS_H +#define SMS_OSCS_H + +#include + +struct T6W28_Osc +{ + Blip_Buffer* outputs [4]; // NULL, right, left, center + Blip_Buffer* output; + int output_select; + + int delay; + int last_amp_left; + int last_amp_right; + + int volume_left; + int volume_right; + + T6W28_Osc(); + void reset(); +}; + +struct T6W28_Square : T6W28_Osc +{ + int period; + int phase; + + typedef Blip_Synth Synth; + const Synth* synth; + + void reset(); + void run( sms_time_t, sms_time_t ); +}; + +struct T6W28_Noise : T6W28_Osc +{ + const int* period; + int period_extra; + unsigned shifter; + unsigned tap; + + typedef Blip_Synth Synth; + Synth synth; + + void reset(); + void run( sms_time_t, sms_time_t ); +}; + +#endif + diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble.cpp new file mode 100644 index 0000000000..48cff31cb6 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble.cpp @@ -0,0 +1,641 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_disassemble.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +25 JUL 2002 - neopop_uk +======================================= +- Added missing registers to disassmbly table (unused, I hope!) + +//--------------------------------------------------------------------------- +*/ + +//========================================================================= + +#include "../neopop.h" +#include "TLCS900h_disassemble.h" +#include "TLCS900h_registers.h" +#include "TLCS900h_interpret.h" +#include "../mem.h" + +namespace TLCS900H +{ + +void TLCS900h_disassemble_extra(void); +void TLCS900h_disassemble_src(int size); +void TLCS900h_disassemble_dst(void); +void TLCS900h_disassemble_reg(int size); + +//========================================================================= + +char str_R[8]; //Big R +char str_r[8]; //Little R + +//Control register names +const char* crName[3][0x40] = +{ + { + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + 0,0,0,0, + + 0,0, "DMAM0", 0, + 0,0, "DMAM1", 0, + 0,0, "DMAM2", 0, + 0,0, "DMAM3", 0, + }, + + { + 0,0, + 0,0, + 0,0, + 0,0, + 0,0, + 0,0, + 0,0, + 0,0, + + "DMAC0", 0, + "DMAC1", 0, + "DMAC2", 0, + "DMAC3", 0, + + 0,0, //30 + 0,0, + 0,0, + "NSP",0, //3C + }, + + { + "DMAS0", //00 + "DMAS1", + "DMAS2", + "DMAS3", + "DMAD0", //10 + "DMAD1", + "DMAD2", + "DMAD3", + 0, //20 + 0, + 0, + 0, + 0, //30 + 0, + 0, + "XNSP", //3C + } +}; + +//Register names +const char* gprName[8][3] = +{ + {"W", "WA", "XWA"}, + {"A", "BC", "XBC"}, + {"B", "DE", "XDE"}, + {"C", "HL", "XHL"}, + {"D", "IX", "XIX"}, + {"E", "IY", "XIY"}, + {"H", "IZ", "XIZ"}, + {"L", "SP", "XSP"} +}; + +//Condition Code names +const char* ccName[] = +{ + "F","LT","LE","ULE", + "OV","MI","Z","C", + "T","GE","GT","UGT", + "NOV","PL","NZ","NC" +}; + +const char* regCodeName[3][256] = +{ + { + "RA0","RW0","QA0","QW0","RC0","RB0","QC0","QB0", //BANK 0 + "RE0","RD0","QE0","QD0","RL0","RH0","QL0","QH0", + "RA1","RW1","QA1","QW1","RC1","RB1","QC1","QB1", //BANK 1 + "RE1","RD1","QE1","QD1","RL1","RH1","QL1","QH1", + "RA2","RW2","QA2","QW2","RC2","RB2","QC2","QB2", //BANK 2 + "RE2","RD2","QE2","QD2","RL2","RH2","QL2","QH2", + "RA3","RW3","QA3","QW3","RC3","RB3","QC3","QB3", //BANK 3 + "RE3","RD3","QE3","QD3","RL3","RH3","QL3","QH3", + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + + "A'","W'","QA'","QW'","C'","B'","QC'","QB'", //Previous Bank + "E'","D'","QE'","QD'","L'","H'","QL'","QH'", + "A","W","QA","QW","C","B","QC","QB", //Current Bank + "E","D","QE","QD","L","H","QL","QH", + + "IXL","IXH","QIXL","QIXH","IYL","IYH","QIYL","QIYH", + "IZL","IZH","QIZL","QIZH","SPL","SPH","QSPL","QSPX" + }, + + { + "RWA0","QWA0","RBC0","QBC0", //BANK 0 + "RDE0","QDE0","RHL0","QHL0", + "RWA1","QWA1","RBC1","QBC1", //BANK 1 + "RDE1","QDE1","RHL1","QHL1", + "RWA2","QWA2","RBC2","QBC2", //BANK 2 + "RDE2","QDE2","RHL2","QHL2", + "RWA3","QWA3","RBC3","QBC3", //BANK 3 + "RDE3","QDE3","RHL3","QHL3", + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + + "WA'","QWA'","BC'","QBC'","DE'","QDE'","HL'","QHL'",//Previous Bank + "WA","QWA","BC","QBC","DE","QDE","HL","QHL", //Current Bank + + "IX","QIX","IY","QIY","IZ","QIZ","SP","QSP" + }, + + { + "XWA0","XBC0","XDE0","XHL0", //BANK 0 + "XWA1","XBC1","XDE1","XHL1", //BANK 1 + "XWA2","XBC2","XDE2","XHL2", //BANK 2 + "XWA3","XBC3","XDE3","XHL3", //BANK 3 + + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0, + + "XWA'","XBC'","XDE'","XHL'", //Previous Bank + "XWA","XBC","XDE","XHL", //Current Bank + + "XIX","XIY","XIZ","XSP" + } +}; + +//========================================================================= + +void get_rr_Name(void) +{ + sprintf(str_r, "???"); + + if (size == 0 && first == 0xC7) + { + sprintf(str_r, "%s", extra); + return; + } + + switch(first & 7) + { + case 0: if (size == 1) sprintf(str_r, "XWA"); break; + case 1: + if (size == 0) sprintf(str_r, "WA"); + if (size == 1) sprintf(str_r, "XBC"); + break; + case 2: if (size == 1) sprintf(str_r, "XDE"); break; + case 3: + if (size == 0) sprintf(str_r, "BC"); + if (size == 1) sprintf(str_r, "XHL"); + break; + case 4: if (size == 1) sprintf(str_r, "XIX"); break; + case 5: + if (size == 0) sprintf(str_r, "DE"); + if (size == 1) sprintf(str_r, "XIY"); + break; + case 6: if (size == 1) sprintf(str_r, "XIZ"); break; + case 7: + if (size == 0) sprintf(str_r, "HL"); + if (size == 1) sprintf(str_r, "XSP"); + break; + } +} + +void get_RR_Name(void) +{ + sprintf(str_R, "???"); + + switch(second & 7) + { + case 0: if (size == 1) sprintf(str_R, "XWA"); break; + case 1: + if (size == 0) sprintf(str_R, "WA"); + if (size == 1) sprintf(str_R, "XBC"); + break; + case 2: if (size == 1) sprintf(str_R, "XDE"); break; + case 3: + if (size == 0) sprintf(str_R, "BC"); + if (size == 1) sprintf(str_R, "XHL"); + break; + case 4: if (size == 1) sprintf(str_R, "XIX"); break; + case 5: + if (size == 0) sprintf(str_R, "DE"); + if (size == 1) sprintf(str_R, "XIY"); + break; + case 6: if (size == 1) sprintf(str_R, "XIZ"); break; + case 7: + if (size == 0) sprintf(str_R, "HL"); + if (size == 1) sprintf(str_R, "XSP"); + break; + } +} + +//============================================================================= + +char instr[128]; //Print the disassembled instruction to this string +uint8 bytes[16]; //Stores the bytes used +uint8 bcnt; //Byte Counter for above + +//============================================================================= + +uint8 get8_dis(void) +{ + uint8 a = bytes[bcnt++] = loadB(pc++); + return a; +} + +uint16 get16_dis(void) +{ + uint16 a = *(uint16*)(uint8*)(bytes + bcnt) = loadW(pc); + pc += 2; bcnt += 2; + return a; +} + +uint32 get24_dis(void) +{ + uint8 b; uint16 a; + a = *(uint16*)(uint8*)(bytes + bcnt) = loadW(pc); + pc += 2; bcnt += 2; + b = bytes[bcnt++] = loadB(pc++); + return ((uint32)b << 16) | (uint32)a; +} + +uint32 get32_dis(void) +{ + uint32 a = *(uint32*)(uint8*)(bytes + bcnt) = loadL(pc); + pc += 4; bcnt += 4; + return a; +} + +//========================================================================= + +static void src_B() { TLCS900h_disassemble_src(0); } +static void src_W() { TLCS900h_disassemble_src(1); } +static void src_L() { TLCS900h_disassemble_src(2); } +static void dst() { TLCS900h_disassemble_dst(); } +static void reg_B() { TLCS900h_disassemble_reg(0);} +static void reg_W() { TLCS900h_disassemble_reg(1);} +static void reg_L() { TLCS900h_disassemble_reg(2);} + +//========================================================================= + +//Single Byte Opcode + +static void NOP() +{ + sprintf(instr, "NOP"); +} + +static void NORMAL() +{ + sprintf(instr, "NORMAL"); +} + +static void PUSHSR() +{ + sprintf(instr, "PUSH SR"); +} + +static void POPSR() +{ + sprintf(instr, "POP SR"); +} + +static void MAX() +{ + sprintf(instr, "MAX"); +} + +static void HALT() +{ + sprintf(instr, "HALT"); +} + +static void EI() +{ + uint8 value = get8_dis(); + + if (value == 7) + sprintf(instr, "DI"); + else + sprintf(instr, "EI %d", value); +} + +static void RETI() +{ + sprintf(instr, "RETI"); +} + +static void LD8_8() +{ + uint8 dst = get8_dis(), src = get8_dis(); + sprintf(instr, "LD (0x%02X),0x%02X", dst, src); +} + +static void PUSH8() +{ + sprintf(instr, "PUSH 0x%02X", get8_dis()); +} + +static void LD8_16() +{ + uint8 dst = get8_dis(); + uint16 src = get16_dis(); + sprintf(instr, "LD.w (0x%02X),0x%04X", dst, src); +} + +static void PUSH16() +{ + sprintf(instr, "PUSH 0x%04X", get16_dis()); +} + +static void INCF() +{ + sprintf(instr, "INCF"); +} + +static void DECF() +{ + sprintf(instr, "DECF"); +} + +static void RET() +{ + sprintf(instr, "RET"); +} + +static void RETD() +{ + sprintf(instr, "RETD %d", get16_dis()); +} + +static void RCF() +{ + sprintf(instr, "RCF"); +} + +static void SCF() +{ + sprintf(instr, "SCF"); +} + +static void CCF() +{ + sprintf(instr, "CCF"); +} + +static void ZCF() +{ + sprintf(instr, "ZCF"); +} + +static void PUSHA() +{ + sprintf(instr, "PUSH A"); +} + +static void POPA() +{ + sprintf(instr, "POP A"); +} + +static void EX() +{ + sprintf(instr, "EX F,F'"); +} + +static void LDF() +{ + sprintf(instr, "LDF 0x%02X", get8_dis()); +} + +static void PUSHF() +{ + sprintf(instr, "PUSH F"); +} + +static void POPF() +{ + sprintf(instr, "POP F"); +} + +static void JP16() +{ + sprintf(instr, "JP 0x%04X", get16_dis()); +} + +static void JP24() +{ + sprintf(instr, "JP 0x%06X", get24_dis()); +} + +static void CALL16() +{ + sprintf(instr, "CALL 0x%04X", get16_dis()); +} + +static void CALL24() +{ + sprintf(instr, "CALL 0x%06X", get24_dis()); +} + +static void CALR() +{ + sprintf(instr, "CALR 0x%06X", (int16)get16_dis() + pc); +} + +static void LDB() +{ + sprintf(instr, "LD %s,0x%02X", gprName[first & 7][0], get8_dis()); +} + +static void PUSHW() +{ + sprintf(instr, "PUSH %s", gprName[first & 7][1]); +} + +static void LDW() +{ + sprintf(instr, "LD %s,0x%04X", gprName[first & 7][1], get16_dis()); +} + +static void PUSHL() +{ + sprintf(instr, "PUSH %s", gprName[first & 7][2]); +} + +static void LDL() +{ + sprintf(instr, "LD %s,0x%08X", gprName[first & 7][2], get32_dis()); +} + +static void POPW() +{ + sprintf(instr, "POP %s", gprName[first & 7][1]); +} + +static void POPL() +{ + sprintf(instr, "POP %s", gprName[first & 7][2]); +} + +static void JR() +{ + sprintf(instr, "JR %s,0x%06X", ccName[first & 0xF], (int8)get8_dis() + pc); +} + +static void JRL() +{ + sprintf(instr, "JRL %s,0x%06X", ccName[first & 0xF], (int16)get16_dis() + pc); +} + +static void LDX() +{ + uint8 dst, src; + + get8_dis(); //00 + dst = get8_dis(); //#8 + get8_dis(); //00 + src = get8_dis(); //# + get8_dis(); //00 + sprintf(instr, "LDX (0x%02X),0x%02X", dst, src); +} + +static void SWI() +{ + sprintf(instr, "SWI %d", first & 7); +} + +//========================================================================= + +static void dBIOSHLE() +{ + sprintf(instr, "BIOS-HLE"); +} + +//========================================================================= + +//Primary Instruction decode +static void (*decode[256])() = +{ +/*0*/ NOP, NORMAL, PUSHSR, POPSR, MAX, HALT, EI, RETI, + LD8_8, PUSH8, LD8_16, PUSH16, INCF, DECF, RET, RETD, +/*1*/ RCF, SCF, CCF, ZCF, PUSHA, POPA, EX, LDF, + PUSHF, POPF, JP16, JP24, CALL16, CALL24, CALR, dBIOSHLE, +/*2*/ LDB, LDB, LDB, LDB, LDB, LDB, LDB, LDB, + PUSHW, PUSHW, PUSHW, PUSHW, PUSHW, PUSHW, PUSHW, PUSHW, +/*3*/ LDW, LDW, LDW, LDW, LDW, LDW, LDW, LDW, + PUSHL, PUSHL, PUSHL, PUSHL, PUSHL, PUSHL, PUSHL, PUSHL, +/*4*/ LDL, LDL, LDL, LDL, LDL, LDL, LDL, LDL, + POPW, POPW, POPW, POPW, POPW, POPW, POPW, POPW, +/*5*/ 0, 0, 0, 0, 0, 0, 0, 0, + POPL, POPL, POPL, POPL, POPL, POPL, POPL, POPL, +/*6*/ JR, JR, JR, JR, JR, JR, JR, JR, + JR, JR, JR, JR, JR, JR, JR, JR, +/*7*/ JRL, JRL, JRL, JRL, JRL, JRL, JRL, JRL, + JRL, JRL, JRL, JRL, JRL, JRL, JRL, JRL, +/*8*/ src_B, src_B, src_B, src_B, src_B, src_B, src_B, src_B, + src_B, src_B, src_B, src_B, src_B, src_B, src_B, src_B, +/*9*/ src_W, src_W, src_W, src_W, src_W, src_W, src_W, src_W, + src_W, src_W, src_W, src_W, src_W, src_W, src_W, src_W, +/*A*/ src_L, src_L, src_L, src_L, src_L, src_L, src_L, src_L, + src_L, src_L, src_L, src_L, src_L, src_L, src_L, src_L, +/*B*/ dst, dst, dst, dst, dst, dst, dst, dst, + dst, dst, dst, dst, dst, dst, dst, dst, +/*C*/ src_B, src_B, src_B, src_B, src_B, src_B, 0, reg_B, + reg_B, reg_B, reg_B, reg_B, reg_B, reg_B, reg_B, reg_B, +/*D*/ src_W, src_W, src_W, src_W, src_W, src_W, 0, reg_W, + reg_W, reg_W, reg_W, reg_W, reg_W, reg_W, reg_W, reg_W, +/*E*/ src_L, src_L, src_L, src_L, src_L, src_L, 0, reg_L, + reg_L, reg_L, reg_L, reg_L, reg_L, reg_L, reg_L, reg_L, +/*F*/ dst, dst, dst, dst, dst, dst, 0, LDX, + SWI, SWI, SWI, SWI, SWI, SWI, SWI, SWI +}; + +//============================================================================= + +char* TLCS900h_disassemble(void) +{ + char str[80]; + unsigned int i; + + memset(str, 0, 80); + + //Reset + bcnt = 0; + brCode = FALSE; + sprintf(instr, "unknown"); + sprintf(extra, "unknown"); + + //Fix big addresses + pc &= 0xFFFFFF; + + //Add the program counter + sprintf(str, "%06X: ", pc); + + first = get8_dis(); //Get the first opcode + + //Disassemble + if (decode[first]) + { + //Decode any extra data + TLCS900h_disassemble_extra(); + (*decode[first])(); + } + + //Add the instruction + strcat(str, instr); + + //Add the bytes used + for (i = strlen(str); i < 32; i++) + str[i] = ' '; + str[32] = '\"'; + for (i = 0; i < bcnt; i++) + { + char tmp[80]; + sprintf(tmp, "%02X ", bytes[i]); + strcat(str, tmp); + } + str[strlen(str) - 1] = '\"'; + + return strdup(str); +} +}; +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble.h new file mode 100644 index 0000000000..2995be36aa --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble.h @@ -0,0 +1,77 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_disassemble.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_DISASSEMBLE__ +#define __TLCS900H_DISASSEMBLE__ + +namespace TLCS900H +{ +//============================================================================= + +//Disassembles a single instruction from 'pc', +//pc is incremented to the start of the next instruction. +char* TLCS900h_disassemble(void); + +//Print to this string the disassembled instruction +extern char instr[128]; + +//Print the mnemonic for the addressing mode / reg code. +extern char extra[256]; + +//============================================================================= + +extern char str_R[8]; //Big R +extern char str_r[8]; //Little R + +//Translate an rr or RR value for MUL/MULS/DIV/DIVS +void get_rr_Name(void); +void get_RR_Name(void); + +extern uint8 bytes[16]; //Stores the bytes used +extern uint8 bcnt; //Byte Counter for above + +extern const char* gprName[8][3]; //8 regs * 3 names (byte, word, long) +extern const char* regCodeName[3][256]; +extern const char* crName[3][0x40]; + +extern const char* ccName[]; + +uint8 get8_dis(void); +uint16 get16_dis(void); +uint32 get24_dis(void); +uint32 get32_dis(void); + +}; + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_dst.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_dst.cpp new file mode 100644 index 0000000000..ff35e1f80a --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_dst.cpp @@ -0,0 +1,240 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_disassemble_dst.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + +//========================================================================= + +#include "../neopop.h" +#include "TLCS900h_disassemble.h" +#include "TLCS900h_registers.h" +#include "TLCS900h_interpret.h" + +//========================================================================= +namespace TLCS900H +{ + +static void LDBi() +{ + sprintf(instr, "LD (%s),0x%02X", extra, get8_dis()); +} + +static void LDWi() +{ + sprintf(instr, "LD (%s),0x%04X", extra, get16_dis()); +} + +static void POPB() +{ + sprintf(instr, "POP.b (%s)", extra); +} + +static void POPW() +{ + sprintf(instr, "POP.w (%s)", extra); +} + +static void LDBm16() +{ + sprintf(instr, "LD.b (%s),(0x%04X)", extra, get16_dis()); +} + +static void LDWm16() +{ + sprintf(instr, "LD.w (%s),(0x%04X)", extra, get16_dis()); +} + +static void LDAW() +{ + sprintf(instr, "LDA %s,%s", gprName[second & 7][1], extra); +} + +static void LDAL() +{ + sprintf(instr, "LDA %s,%s", gprName[second & 7][2], extra); +} + +static void ANDCFA() +{ + sprintf(instr, "ANDCF A,(%s)", extra); +} + +static void ORCFA() +{ + sprintf(instr, "ORCF A,(%s)", extra); +} + +static void XORCFA() +{ + sprintf(instr, "XORCF A,(%s)", extra); +} + +static void LDCFA() +{ + sprintf(instr, "LDCF A,(%s)", extra); +} + +static void STCFA() +{ + sprintf(instr, "STCF A,(%s)", extra); +} + +static void LDBR() +{ + sprintf(instr, "LD (%s),%s", extra, gprName[second&7][0]); +} + +static void LDWR() +{ + sprintf(instr, "LD (%s),%s", extra, gprName[second&7][1]); +} + +static void LDLR() +{ + sprintf(instr, "LD (%s),%s", extra, gprName[second&7][2]); +} + +static void ANDCF() +{ + sprintf(instr, "ANDCF %d,(%s)", second & 7, extra); +} + +static void ORCF() +{ + sprintf(instr, "ORCF %d,(%s)", second & 7, extra); +} + +static void XORCF() +{ + sprintf(instr, "XORCF %d,(%s)", second & 7, extra); +} + +static void LDCF() +{ + sprintf(instr, "LDCF %d,(%s)", second & 7, extra); +} + +static void STCF() +{ + sprintf(instr, "STCF %d,(%s)", second & 7, extra); +} + +static void TSET() +{ + sprintf(instr, "TSET %d,(%s)", second & 7, extra); +} + +static void RES() +{ + sprintf(instr, "RES %d,(%s)", second & 7, extra); +} + +static void SET() +{ + sprintf(instr, "SET %d,(%s)", second & 7, extra); +} + +static void CHG() +{ + sprintf(instr, "CHG %d,(%s)", second & 7, extra); +} + +static void BIT() +{ + sprintf(instr, "BIT %d,(%s)", second & 7, extra); +} + +static void JP() +{ + sprintf(instr, "JP %s,%s", ccName[second & 0xF], extra); +} + +static void CALL() +{ + sprintf(instr, "CALL %s,%s", ccName[second & 0xF], extra); +} + +static void RET() +{ + sprintf(instr, "RET %s", ccName[second & 0xF]); +} + +//========================================================================= + +//Secondary (DST) Instruction decode +static void (*decode[256])() = +{ +/*0*/ LDBi, 0, LDWi, 0, POPB, 0, POPW, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +/*1*/ 0, 0, 0, 0, LDBm16, 0, LDWm16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +/*2*/ LDAW, LDAW, LDAW, LDAW, LDAW, LDAW, LDAW, LDAW, + ANDCFA, ORCFA, XORCFA, LDCFA, STCFA, 0, 0, 0, +/*3*/ LDAL, LDAL, LDAL, LDAL, LDAL, LDAL, LDAL, LDAL, + 0, 0, 0, 0, 0, 0, 0, 0, +/*4*/ LDBR, LDBR, LDBR, LDBR, LDBR, LDBR, LDBR, LDBR, + 0, 0, 0, 0, 0, 0, 0, 0, +/*5*/ LDWR, LDWR, LDWR, LDWR, LDWR, LDWR, LDWR, LDWR, + 0, 0, 0, 0, 0, 0, 0, 0, +/*6*/ LDLR, LDLR, LDLR, LDLR, LDLR, LDLR, LDLR, LDLR, + 0, 0, 0, 0, 0, 0, 0, 0, +/*7*/ 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +/*8*/ ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, ANDCF, + ORCF, ORCF, ORCF, ORCF, ORCF, ORCF, ORCF, ORCF, +/*9*/ XORCF, XORCF, XORCF, XORCF, XORCF, XORCF, XORCF, XORCF, + LDCF, LDCF, LDCF, LDCF, LDCF, LDCF, LDCF, LDCF, +/*A*/ STCF, STCF, STCF, STCF, STCF, STCF, STCF, STCF, + TSET, TSET, TSET, TSET, TSET, TSET, TSET, TSET, +/*B*/ RES, RES, RES, RES, RES, RES, RES, RES, + SET, SET, SET, SET, SET, SET, SET, SET, +/*C*/ CHG, CHG, CHG, CHG, CHG, CHG, CHG, CHG, + BIT, BIT, BIT, BIT, BIT, BIT, BIT, BIT, +/*D*/ JP, JP, JP, JP, JP, JP, JP, JP, + JP, JP, JP, JP, JP, JP, JP, JP, +/*E*/ CALL, CALL, CALL, CALL, CALL, CALL, CALL, CALL, + CALL, CALL, CALL, CALL, CALL, CALL, CALL, CALL, +/*F*/ RET, RET, RET, RET, RET, RET, RET, RET, + RET, RET, RET, RET, RET, RET, RET, RET +}; + +//============================================================================= + +void TLCS900h_disassemble_dst(void) +{ + second = get8_dis(); //Get the second opcode + + if (decode[second]) + (*decode[second])(); + else + sprintf(instr, "unknown dst instr. %02X", second); +} +}; diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_extra.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_extra.cpp new file mode 100644 index 0000000000..cd69775c2d --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_extra.cpp @@ -0,0 +1,199 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_disassemble_extra.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +02 SEP 2002 - neopop_uk +======================================= +- Added the undocumented type 0x13 R32 address mode. + +//--------------------------------------------------------------------------- +*/ + +//========================================================================= + +#include "../neopop.h" +#include "TLCS900h_disassemble.h" +#include "TLCS900h_interpret.h" + +#define RCN_fetch(_a, _b) (regCodeName[(_a)][(_b)] ? regCodeName[(_a)][(_b)] : "-UNK-") + +namespace TLCS900H +{ + +//========================================================================= + +char extra[256]; //Print the mnemonic for the addressing mode here. + +//========================================================================= + +static void ExXWA() {sprintf(extra, "XWA");} +static void ExXBC() {sprintf(extra, "XBC");} +static void ExXDE() {sprintf(extra, "XDE");} +static void ExXHL() {sprintf(extra, "XHL");} +static void ExXIX() {sprintf(extra, "XIX");} +static void ExXIY() {sprintf(extra, "XIY");} +static void ExXIZ() {sprintf(extra, "XIZ");} +static void ExXSP() {sprintf(extra, "XSP");} + +static void ExXWAd() {sprintf(extra, "XWA %+d", (int8)get8_dis());} +static void ExXBCd() {sprintf(extra, "XBC %+d", (int8)get8_dis());} +static void ExXDEd() {sprintf(extra, "XDE %+d", (int8)get8_dis());} +static void ExXHLd() {sprintf(extra, "XHL %+d", (int8)get8_dis());} +static void ExXIXd() {sprintf(extra, "XIX %+d", (int8)get8_dis());} +static void ExXIYd() {sprintf(extra, "XIY %+d", (int8)get8_dis());} +static void ExXIZd() {sprintf(extra, "XIZ %+d", (int8)get8_dis());} +static void ExXSPd() {sprintf(extra, "XSP %+d", (int8)get8_dis());} + +static void Ex8() {sprintf(extra, "0x%02X", get8_dis());} +static void Ex16() {sprintf(extra, "0x%04X", get16_dis());} +static void Ex24() {sprintf(extra, "0x%06X", get24_dis());} + +static void ExR32() +{ + uint8 data = get8_dis(); + + if (data == 0x03) + { + uint8 rIndex, r32; + r32 = get8_dis(); //r32, upper 6 bits + rIndex = get8_dis(); //r8 / r16 + sprintf(extra, "%s + %s", + RCN_fetch(2, r32 >> 2), RCN_fetch(0, rIndex >> 0)); + return; + } + + if (data == 0x07) + { + uint8 rIndex, r32; + r32 = get8_dis(); //r32, upper 6 bits + rIndex = get8_dis(); //r8 / r16 + sprintf(extra, "%s + %s", + RCN_fetch(2, r32 >> 2), RCN_fetch(1, rIndex >> 1)); + return; + } + + //Undocumented mode. + if (data == 0x13) + { + sprintf(extra, "pc %+d", (int16)get16_dis()); + return; + } + + if ((data & 3) == 1) + sprintf(extra, "%s %+d", RCN_fetch(2, data >> 2), (int16)get16_dis()); + else + sprintf(extra, "%s", RCN_fetch(2, data >> 2)); +} + +static void ExDec() +{ + uint8 data = get8_dis(); + uint8 r32 = data & 0xFC; + + switch(data & 3) + { + case 0: sprintf(extra, "1--%s", RCN_fetch(2, r32 >> 2)); break; + case 1: sprintf(extra, "2--%s", RCN_fetch(2, r32 >> 2)); break; + case 2: sprintf(extra, "4--%s", RCN_fetch(2, r32 >> 2)); break; + } +} + +static void ExInc() +{ + uint8 data = get8_dis(); + uint8 r32 = data & 0xFC; + + switch(data & 3) + { + case 0: sprintf(extra, "%s++1", RCN_fetch(2, r32 >> 2)); break; + case 1: sprintf(extra, "%s++2", RCN_fetch(2, r32 >> 2)); break; + case 2: sprintf(extra, "%s++4", RCN_fetch(2, r32 >> 2)); break; + } +} + +static void ExRCB() +{ + uint8 data = get8_dis(); + sprintf(extra, "%s", RCN_fetch(0, data >> 0)); + brCode = TRUE; +} + +static void ExRCW() +{ + uint8 data = get8_dis(); + sprintf(extra, "%s", RCN_fetch(1, data >> 1)); + brCode = TRUE; +} + +static void ExRCL() +{ + uint8 data = get8_dis(); + sprintf(extra, "%s", RCN_fetch(2, data >> 2)); + brCode = TRUE; +} + +//========================================================================= + +//Address Mode & Register Code +static void (*decodeExtra[256])() = +{ +/*0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*1*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*2*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*3*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*4*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*5*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*6*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*7*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*8*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*9*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*A*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*B*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*C*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, ExRCB, + 0, 0, 0, 0, 0, 0, 0, 0, +/*D*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, ExRCW, + 0, 0, 0, 0, 0, 0, 0, 0, +/*E*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, ExRCL, + 0, 0, 0, 0, 0, 0, 0, 0, +/*F*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void TLCS900h_disassemble_extra(void) +{ + //Is any extra data used by this instruction? + if (decodeExtra[first]) + (*decodeExtra[first])(); +} + +}; diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_reg.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_reg.cpp new file mode 100644 index 0000000000..9d0eb10c07 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_reg.cpp @@ -0,0 +1,662 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_disassemble_reg.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +22 JUL 2002 - neopop_uk +======================================= +- Fixed disassembly of Link, it's second operand is signed. + +28 JUL 2002 - neopop_uk +======================================= +- Better disassembly of MUL/MULS/DIV/DIVS - operand size is shown. + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "TLCS900h_disassemble.h" +#include "TLCS900h_registers.h" +#include "TLCS900h_interpret.h" + +//========================================================================= + +namespace TLCS900H +{ + +static void LDi() +{ + switch(size) + { + case 0: sprintf(instr, "LD %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "LD %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "LD %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void PUSH() +{ + sprintf(instr, "PUSH %s", str_r); +} + +static void POP() +{ + sprintf(instr, "POP %s", str_r); +} + +static void CPL() +{ + sprintf(instr, "CPL %s", str_r); +} + +static void NEG() +{ + sprintf(instr, "NEG %s", str_r); +} + +static void MULi() +{ + get_rr_Name(); + + switch(size) + { + case 0: sprintf(instr, "MUL.b %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "MUL.w %s,0x%04X", str_r, get16_dis()); break; + } +} + +static void MULSi() +{ + get_rr_Name(); + + switch(size) + { + case 0: sprintf(instr, "MULS.b %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "MULS.w %s,0x%04X", str_r, get16_dis()); break; + } +} + +static void DIVi() +{ + get_rr_Name(); + + switch(size) + { + case 0: sprintf(instr, "DIV.b %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "DIV.w %s,0x%04X", str_r, get16_dis()); break; + } +} + +static void DIVSi() +{ + get_rr_Name(); + + switch(size) + { + case 0: sprintf(instr, "DIVS.b %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "DIVS.w %s,0x%04X", str_r, get16_dis()); break; + } +} + +static void LINK() +{ + sprintf(instr, "LINK %s, %d", str_r, (int16)get16_dis()); +} + +static void UNLK() +{ + sprintf(instr, "UNLK %s", str_r); +} + +static void BS1F() +{ + sprintf(instr, "BS1F A,%s", str_r); +} + +static void BS1B() +{ + sprintf(instr, "BS1B A,%s", str_r); +} + +static void DAA() +{ + sprintf(instr, "DAA %s", str_r); +} + +static void EXTZ() +{ + sprintf(instr, "EXTZ %s", str_r); +} + +static void EXTS() +{ + sprintf(instr, "EXTS %s", str_r); +} + +static void PAA() +{ + sprintf(instr, "PAA %s", str_r); +} + +static void MIRR() +{ + sprintf(instr, "MIRR %s", str_r); +} + +static void MULA() +{ + sprintf(instr, "MULA %s", str_r); +} + +static void DJNZ() +{ + sprintf(instr, "DJNZ %s,0x%06X", str_r, (int8)get8_dis() + pc); +} + +static void ANDCFi() +{ + sprintf(instr, "ANDCF %d,%s", get8_dis() & 0xF, str_r); +} + +static void ORCFi() +{ + sprintf(instr, "ORCF %d,%s", get8_dis() & 0xF, str_r); +} + +static void XORCFi() +{ + sprintf(instr, "XORCF %d,%s", get8_dis() & 0xF, str_r); +} + +static void LDCFi() +{ + sprintf(instr, "LDCF %d,%s", get8_dis() & 0xF, str_r); +} + +static void STCFi() +{ + sprintf(instr, "STCF %d,%s", get8_dis() & 0xF, str_r); +} + +static void ANDCFA() +{ + sprintf(instr, "ANDCF A,%s", str_r); +} + +static void ORCFA() +{ + sprintf(instr, "ORCF A,%s", str_r); +} + +static void XORCFA() +{ + sprintf(instr, "XORCF A,%s", str_r); +} + +static void LDCFA() +{ + sprintf(instr, "LDCF A,%s", str_r); +} + +static void STCFA() +{ + sprintf(instr, "STCF A,%s", str_r); +} + +static void LDCcrr() +{ + uint8 cr = get8_dis(); + sprintf(instr, "LDC %s,%s", crName[size][cr >> size], str_r); +} + +static void LDCrcr() +{ + uint8 cr = get8_dis(); + sprintf(instr, "LDC %s,%s", str_r, crName[size][cr >> size]); +} + +static void RES() +{ + sprintf(instr, "RES %d,%s", get8_dis() & 0xF, str_r); +} + +static void SET() +{ + sprintf(instr, "SET %d,%s", get8_dis() & 0xF, str_r); +} + +static void CHG() +{ + sprintf(instr, "CHG %d,%s", get8_dis() & 0xF, str_r); +} + +static void BIT() +{ + sprintf(instr, "BIT %d,%s", get8_dis() & 0xF, str_r); +} + +static void TSET() +{ + sprintf(instr, "TSET %d,%s", get8_dis() & 0xF, str_r); +} + +static void MINC1() +{ + sprintf(instr, "MINC1 %d,%s", get16_dis()+1, str_r); +} + +static void MINC2() +{ + sprintf(instr, "MINC2 %d,%s", get16_dis()+2, str_r); +} + +static void MINC4() +{ + sprintf(instr, "MINC4 %d,%s", get16_dis()+4, str_r); +} + +static void MDEC1() +{ + sprintf(instr, "MDEC1 %d,%s", get16_dis()+1, str_r); +} + +static void MDEC2() +{ + sprintf(instr, "MDEC2 %d,%s", get16_dis()+2, str_r); +} + +static void MDEC4() +{ + sprintf(instr, "MDEC4 %d,%s", get16_dis()+4, str_r); +} + +static void MUL() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "MUL.b %s,%s", str_R, str_r); break; + case 1: sprintf(instr, "MUL.w %s,%s", str_R, str_r); break; + } +} + +static void MULS() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "MULS.b %s,%s", str_R, str_r); break; + case 1: sprintf(instr, "MULS.w %s,%s", str_R, str_r); break; + } +} + +static void DIV() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "DIV.b %s,%s", str_R, str_r); break; + case 1: sprintf(instr, "DIV.w %s,%s", str_R, str_r); break; + } +} + +static void DIVS() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "DIVS.b %s,%s", str_R, str_r); break; + case 1: sprintf(instr, "DIVS.w %s,%s", str_R, str_r); break; + } +} + +static void INC() +{ + uint8 val = (second & 7); + if (val == 0) + val = 8; + + sprintf(instr, "INC %d,%s", val, str_r); +} + +static void DEC() +{ + uint8 val = (second & 7); + if (val == 0) + val = 8; + + sprintf(instr, "DEC %d,%s", val, str_r); +} + +static void SCC() +{ + sprintf(instr, "SCC %s,%s", ccName[second & 0xF], str_r); +} + +static void ADD() +{ + sprintf(instr, "ADD %s,%s", str_R, str_r); +} + +static void LDRr() +{ + sprintf(instr, "LD %s,%s", str_R, str_r); +} + +static void LDrR() +{ + sprintf(instr, "LD %s,%s", str_r, str_R); +} + +static void ADC() +{ + sprintf(instr, "ADC %s,%s", str_R, str_r); +} + +static void SUB() +{ + sprintf(instr, "SUB %s,%s", str_R, str_r); +} + +static void SBC() +{ + sprintf(instr, "SBC %s,%s", str_R, str_r); +} + +static void LDr3() +{ + sprintf(instr, "LD %s,%d", str_r, second & 7); +} + +static void EX() +{ + sprintf(instr, "EX %s,%s", str_R, str_r); +} + +static void AND() +{ + sprintf(instr, "AND %s,%s", str_R, str_r); +} + +static void ADDi() +{ + switch(size) + { + case 0: sprintf(instr, "ADD %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "ADD %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "ADD %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void ADCi() +{ + switch(size) + { + case 0: sprintf(instr, "ADC %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "ADC %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "ADC %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void SUBi() +{ + switch(size) + { + case 0: sprintf(instr, "SUB %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "SUB %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "SUB %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void SBCi() +{ + switch(size) + { + case 0: sprintf(instr, "SBC %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "SBC %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "SBC %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void ANDi() +{ + switch(size) + { + case 0: sprintf(instr, "AND %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "AND %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "AND %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void XORi() +{ + switch(size) + { + case 0: sprintf(instr, "XOR %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "XOR %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "XOR %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void ORi() +{ + switch(size) + { + case 0: sprintf(instr, "OR %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "OR %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "OR %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void CPi() +{ + switch(size) + { + case 0: sprintf(instr, "CP %s,0x%02X", str_r, get8_dis()); break; + case 1: sprintf(instr, "CP %s,0x%04X", str_r, get16_dis()); break; + case 2: sprintf(instr, "CP %s,0x%08X", str_r, get32_dis()); break; + } +} + +static void XOR() +{ + sprintf(instr, "XOR %s,%s", str_R, str_r); +} + +static void CPr3() +{ + sprintf(instr,"CP %s,%d", str_r, second&7); +} + +static void OR() +{ + sprintf(instr, "OR %s,%s", str_R, str_r); +} + +static void RLCi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "RLC %d,%s", val, str_r); +} + +static void RRCi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "RRC %d,%s", val, str_r); +} + +static void RLi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "RL %d,%s", val, str_r); +} + +static void RRi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "RR %d,%s", val, str_r); +} + +static void SLAi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "SLA %d,%s", val, str_r); +} + +static void SRAi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "SRA %d,%s", val, str_r); +} + +static void SLLi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "SLL %d,%s", val, str_r); +} + +static void SRLi() +{ + uint8 val = get8_dis() & 0xF; + if (val == 0) val = 16; + sprintf(instr, "SRL %d,%s", val, str_r); +} + +static void CP() +{ + sprintf(instr, "CP %s,%s", str_R, str_r); +} + +static void RLCA() +{ + sprintf(instr, "RLC A,%s", str_r); +} + +static void RRCA() +{ + sprintf(instr, "RRC A,%s", str_r); +} + +static void RLA() +{ + sprintf(instr, "RL A,%s", str_r); +} + +static void RRA() +{ + sprintf(instr, "RR A,%s", str_r); +} + +static void SLAA() +{ + sprintf(instr, "SLA A,%s", str_r); +} + +static void SRAA() +{ + sprintf(instr, "SRA A,%s", str_r); +} + +static void SLLA() +{ + sprintf(instr, "SLL A,%s", str_r); +} + +static void SRLA() +{ + sprintf(instr, "SRL A,%s", str_r); +} + +//========================================================================= + +//Secondary (REG) Instruction decode +static void (*decode[256])() = +{ +/*0*/ 0, 0, 0, LDi, PUSH, POP, CPL, NEG, + MULi, MULSi, DIVi, DIVSi, LINK, UNLK, BS1F, BS1B, +/*1*/ DAA, 0, EXTZ, EXTS, PAA, 0, MIRR, 0, + 0, MULA, 0, 0, DJNZ, 0, 0, 0, +/*2*/ ANDCFi, ORCFi, XORCFi, LDCFi, STCFi, 0, 0, 0, + ANDCFA, ORCFA, XORCFA, LDCFA, STCFA, 0, LDCcrr, LDCrcr, +/*3*/ RES, SET, CHG, BIT, TSET, 0, 0, 0, + MINC1, MINC2, MINC4, 0, MDEC1, MDEC2, MDEC4, 0, +/*4*/ MUL, MUL, MUL, MUL, MUL, MUL, MUL, MUL, + MULS, MULS, MULS, MULS, MULS, MULS, MULS, MULS, +/*5*/ DIV, DIV, DIV, DIV, DIV, DIV, DIV, DIV, + DIVS, DIVS, DIVS, DIVS, DIVS, DIVS, DIVS, DIVS, +/*6*/ INC, INC, INC, INC, INC, INC, INC, INC, + DEC, DEC, DEC, DEC, DEC, DEC, DEC, DEC, +/*7*/ SCC, SCC, SCC, SCC, SCC, SCC, SCC, SCC, + SCC, SCC, SCC, SCC, SCC, SCC, SCC, SCC, +/*8*/ ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD, + LDRr, LDRr, LDRr, LDRr, LDRr, LDRr, LDRr, LDRr, +/*9*/ ADC, ADC, ADC, ADC, ADC, ADC, ADC, ADC, + LDrR, LDrR, LDrR, LDrR, LDrR, LDrR, LDrR, LDrR, +/*A*/ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, + LDr3, LDr3, LDr3, LDr3, LDr3, LDr3, LDr3, LDr3, +/*B*/ SBC, SBC, SBC, SBC, SBC, SBC, SBC, SBC, + EX, EX, EX, EX, EX, EX, EX, EX, +/*C*/ AND, AND, AND, AND, AND, AND, AND, AND, + ADDi, ADCi, SUBi, SBCi, ANDi, XORi, ORi, CPi, +/*D*/ XOR, XOR, XOR, XOR, XOR, XOR, XOR, XOR, + CPr3, CPr3, CPr3, CPr3, CPr3, CPr3, CPr3, CPr3, +/*E*/ OR, OR, OR, OR, OR, OR, OR, OR, + RLCi, RRCi, RLi, RRi, SLAi, SRAi, SLLi, SRLi, +/*F*/ CP, CP, CP, CP, CP, CP, CP, CP, + RLCA, RRCA, RLA, RRA, SLAA, SRAA, SLLA, SRLA +}; + +//============================================================================= + +void TLCS900h_disassemble_reg(int opsize) +{ + second = get8_dis(); //Get the second opcode + size = opsize; + + //Prepare 'Big R' + sprintf(str_R, "%s", gprName[second & 7][size]); + + //Prepare 'little r' + if (brCode) + sprintf(str_r, "%s", extra); + else + sprintf(str_r, "%s", gprName[first & 7][opsize]); + + if (decode[second]) + (*decode[second])(); + else + sprintf(instr, "unknown reg instr. %02X", second); +} +}; diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_src.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_src.cpp new file mode 100644 index 0000000000..27e42d5035 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_disassemble_src.cpp @@ -0,0 +1,507 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_disassemble_src.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +28 JUL 2002 - neopop_uk +======================================= +- Better disassembly of MUL/MULS/DIV/DIVS - operand size is shown. + +//--------------------------------------------------------------------------- +*/ + +//========================================================================= + +#include "../neopop.h" +#include "TLCS900h_disassemble.h" +#include "TLCS900h_registers.h" +#include "TLCS900h_interpret.h" + +//========================================================================= + +namespace TLCS900H +{ + +static void PUSH() +{ + sprintf(instr, "PUSH (%s)", extra); +} + +static void RLD() +{ + sprintf(instr, "RLD A,(%s)", extra); +} + +static void RRD() +{ + sprintf(instr, "RRD A,(%s)", extra); +} + +static void LDI() +{ + if ((first & 0xF) == 3) + { + switch(size) + { + case 0: sprintf(instr, "LDI.b (XDE+),(XHL+)"); break; + case 1: sprintf(instr, "LDI.w (XDE+),(XHL+)"); break; + } + } + + if ((first & 0xF) == 5) + { + switch(size) + { + case 0: sprintf(instr, "LDI.b (XIX+),(XIY+)"); break; + case 1: sprintf(instr, "LDI.w (XIX+),(XIY+)"); break; + } + } +} + +static void LDIR() +{ + if ((first & 0xF) == 3) + { + switch(size) + { + case 0: sprintf(instr, "LDIR.b (XDE+),(XHL+)"); break; + case 1: sprintf(instr, "LDIR.w (XDE+),(XHL+)"); break; + } + } + + if ((first & 0xF) == 5) + { + switch(size) + { + case 0: sprintf(instr, "LDIR.b (XIX+),(XIY+)"); break; + case 1: sprintf(instr, "LDIR.w (XIX+),(XIY+)"); break; + } + } +} + +static void LDD() +{ + if ((first & 0xF) == 3) + { + switch(size) + { + case 0: sprintf(instr, "LDD.b (XDE-),(XHL-)"); break; + case 1: sprintf(instr, "LDD.w (XDE-),(XHL-)"); break; + } + } + + if ((first & 0xF) == 5) + { + switch(size) + { + case 0: sprintf(instr, "LDD.b (XIX-),(XIY-)"); break; + case 1: sprintf(instr, "LDD.w (XIX-),(XIY-)"); break; + } + } +} + +static void LDDR() +{ + if ((first & 0xF) == 3) + { + switch(size) + { + case 0: sprintf(instr, "LDDR.b (XDE-),(XHL-)"); break; + case 1: sprintf(instr, "LDDR.w (XDE-),(XHL-)"); break; + } + } + + if ((first & 0xF) == 5) + { + switch(size) + { + case 0: sprintf(instr, "LDDR.b (XIX-),(XIY-)"); break; + case 1: sprintf(instr, "LDDR.w (XIX-),(XIY-)"); break; + } + } +} + +static void CPI() +{ + sprintf(instr, "CPI"); +} + +static void CPIR() +{ + switch(size) + { + case 0: sprintf(instr, "CPIR.b A,(%s+)", gprName[first & 7][2]); break; + case 1: sprintf(instr, "CPIR.w WA,(%s+)", gprName[first & 7][2]); break; + } +} + +static void CPD() +{ + switch(size) + { + case 0: sprintf(instr, "CPD.b A,(%s+)", gprName[first & 7][2]); break; + case 1: sprintf(instr, "CPD.w WA,(%s+)", gprName[first & 7][2]); break; + } +} + +static void CPDR() +{ + switch(size) + { + case 0: sprintf(instr, "CPDR.b A,(%s+)", gprName[first & 7][2]); break; + case 1: sprintf(instr, "CPDR.w WA,(%s+)", gprName[first & 7][2]); break; + } +} + +static void LD16m() +{ + sprintf(instr, "LD (0x%04X),(%s)", get16_dis(), extra); +} + +static void LD() +{ + sprintf(instr, "LD %s,(%s)", str_R, extra); +} + +static void EX() +{ + switch(size) + { + case 0: sprintf(instr, "EX.b (%s),%s", extra, str_R); break; + case 1: sprintf(instr, "EX.w (%s),%s", extra, str_R); break; + } + +} + +static void ADDi() +{ + switch(size) + { + case 0: sprintf(instr, "ADD (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "ADD (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void ADCi() +{ + switch(size) + { + case 0: sprintf(instr, "ADC (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "ADC (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void SUBi() +{ + switch(size) + { + case 0: sprintf(instr, "SUB (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "SUB (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void SBCi() +{ + switch(size) + { + case 0: sprintf(instr, "SBC (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "SBC (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void ANDi() +{ + switch(size) + { + case 0: sprintf(instr, "AND (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "AND (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void XORi() +{ + switch(size) + { + case 0: sprintf(instr, "XOR (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "XOR (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void ORi() +{ + switch(size) + { + case 0: sprintf(instr, "OR (%s), 0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "OR (%s), 0x%04X", extra, get16_dis()); break; + } +} + +static void CPi() +{ + switch(size) + { + case 0: sprintf(instr, "CP (%s),0x%02X", extra, get8_dis()); break; + case 1: sprintf(instr, "CP (%s),0x%04X", extra, get16_dis()); break; + } +} + +static void MUL() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "MUL.b (%s),(%s)",str_R, extra); break; + case 1: sprintf(instr, "MUL.w (%s),(%s)",str_R, extra); break; + } +} + +static void MULS() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "MULS.b (%s),(%s)",str_R, extra); break; + case 1: sprintf(instr, "MULS.w (%s),(%s)",str_R, extra); break; + } +} + +static void DIV() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "DIV.b (%s),(%s)",str_R, extra); break; + case 1: sprintf(instr, "DIV.w (%s),(%s)",str_R, extra); break; + } +} + +static void DIVS() +{ + get_RR_Name(); + switch(size) + { + case 0: sprintf(instr, "DIVS.b (%s),(%s)",str_R, extra); break; + case 1: sprintf(instr, "DIVS.w (%s),(%s)",str_R, extra); break; + } +} + +static void INC() +{ + uint8 val = (second & 7); + if (val == 0) + val = 8; + + sprintf(instr, "INC %d,(%s)", val, extra); +} + +static void DEC() +{ + uint8 val = (second & 7); + if (val == 0) + val = 8; + + sprintf(instr, "DEC %d,(%s)", val, extra); +} + +static void RLC() +{ + sprintf(instr, "RLC (%s)", extra); +} + +static void RRC() +{ + sprintf(instr, "RRC (%s)", extra); +} + +static void RL() +{ + sprintf(instr, "RL (%s)", extra); +} + +static void RR() +{ + sprintf(instr, "RR (%s)", extra); +} + +static void SLA() +{ + sprintf(instr, "SLA (%s)", extra); +} + +static void SRA() +{ + sprintf(instr, "SRA (%s)", extra); +} + +static void SLL() +{ + sprintf(instr, "SLL (%s)", extra); +} + +static void SRL() +{ + sprintf(instr, "SRL (%s)", extra); +} + +static void ADDRm() +{ + sprintf(instr, "ADD %s,(%s)", str_R, extra); +} + +static void ADDmR() +{ + sprintf(instr, "ADD (%s),%s", extra, str_R); +} + +static void ADCRm() +{ + sprintf(instr, "ADC %s,(%s)", str_R, extra); +} + +static void ADCmR() +{ + sprintf(instr, "ADC (%s),%s", extra, str_R); +} + +static void SUBRm() +{ + sprintf(instr, "SUB %s,(%s)", str_R, extra); +} + +static void SUBmR() +{ + sprintf(instr, "SUB (%s),%s", extra, str_R); +} + +static void SBCRm() +{ + sprintf(instr, "SBC %s,(%s)", str_R, extra); +} + +static void SBCmR() +{ + sprintf(instr, "SBC (%s),%s", extra, str_R); +} + +static void ANDmR() +{ + sprintf(instr, "AND (%s),%s", extra, str_R); +} + +static void ANDRm() +{ + sprintf(instr, "AND %s,(%s)", str_R, extra); +} + +static void XORmR() +{ + sprintf(instr, "XOR (%s),%s", extra, str_R); +} + +static void XORRm() +{ + sprintf(instr, "XOR %s,(%s)", str_R, extra); +} + +static void ORmR() +{ + sprintf(instr, "OR (%s),%s", extra, str_R); +} + +static void ORRm() +{ + sprintf(instr, "OR %s,(%s)", str_R, extra); +} + +static void CPmR() +{ + sprintf(instr, "CP (%s),%s", extra, str_R); +} + +static void CPRm() +{ + sprintf(instr, "CP %s,(%s)", str_R, extra); +} + +//========================================================================= + +//Secondary (SRC) Instruction decode +static void (*decode[256])() = +{ +/*0*/ 0, 0, 0, 0, PUSH, 0, RLD, RRD, + 0, 0, 0, 0, 0, 0, 0, 0, +/*1*/ LDI, LDIR, LDD, LDDR, CPI, CPIR, CPD, CPDR, + 0, LD16m, 0, 0, 0, 0, 0, 0, +/*2*/ LD, LD, LD, LD, LD, LD, LD, LD, + 0, 0, 0, 0, 0, 0, 0, 0, +/*3*/ EX, EX, EX, EX, EX, EX, EX, EX, + ADDi, ADCi, SUBi, SBCi, ANDi, XORi, ORi, CPi, +/*4*/ MUL, MUL, MUL, MUL, MUL, MUL, MUL, MUL, + MULS, MULS, MULS, MULS, MULS, MULS, MULS, MULS, +/*5*/ DIV, DIV, DIV, DIV, DIV, DIV, DIV, DIV, + DIVS, DIVS, DIVS, DIVS, DIVS, DIVS, DIVS, DIVS, +/*6*/ INC, INC, INC, INC, INC, INC, INC, INC, + DEC, DEC, DEC, DEC, DEC, DEC, DEC, DEC, +/*7*/ 0, 0, 0, 0, 0, 0, 0, 0, + RLC, RRC, RL, RR, SLA, SRA, SLL, SRL, +/*8*/ ADDRm, ADDRm, ADDRm, ADDRm, ADDRm, ADDRm, ADDRm, ADDRm, + ADDmR, ADDmR, ADDmR, ADDmR, ADDmR, ADDmR, ADDmR, ADDmR, +/*9*/ ADCRm, ADCRm, ADCRm, ADCRm, ADCRm, ADCRm, ADCRm, ADCRm, + ADCmR, ADCmR, ADCmR, ADCmR, ADCmR, ADCmR, ADCmR, ADCmR, +/*A*/ SUBRm, SUBRm, SUBRm, SUBRm, SUBRm, SUBRm, SUBRm, SUBRm, + SUBmR, SUBmR, SUBmR, SUBmR, SUBmR, SUBmR, SUBmR, SUBmR, +/*B*/ SBCRm, SBCRm, SBCRm, SBCRm, SBCRm, SBCRm, SBCRm, SBCRm, + SBCmR, SBCmR, SBCmR, SBCmR, SBCmR, SBCmR, SBCmR, SBCmR, +/*C*/ ANDRm, ANDRm, ANDRm, ANDRm, ANDRm, ANDRm, ANDRm, ANDRm, + ANDmR, ANDmR, ANDmR, ANDmR, ANDmR, ANDmR, ANDmR, ANDmR, +/*D*/ XORRm, XORRm, XORRm, XORRm, XORRm, XORRm, XORRm, XORRm, + XORmR, XORmR, XORmR, XORmR, XORmR, XORmR, XORmR, XORmR, +/*E*/ ORRm, ORRm, ORRm, ORRm, ORRm, ORRm, ORRm, ORRm, + ORmR, ORmR, ORmR, ORmR, ORmR, ORmR, ORmR, ORmR, +/*F*/ CPRm, CPRm, CPRm, CPRm, CPRm, CPRm, CPRm, CPRm, + CPmR, CPmR, CPmR, CPmR, CPmR, CPmR, CPmR, CPmR +}; + +//============================================================================= + +void TLCS900h_disassemble_src(int opsize) +{ + second = get8_dis(); //Get the second opcode + size = opsize; + + //Prepare 'Big R' + sprintf(str_R, "%s", gprName[second & 7][size]); + + if (decode[second]) + (*decode[second])(); + else + sprintf(instr, "unknown src instr. %02X", second); +} +}; + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret.cpp new file mode 100644 index 0000000000..275e799b86 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret.cpp @@ -0,0 +1,975 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +26 JUL 2002 - neopop_uk +======================================= +- Fixed a nasty bug that only affects [src]"EX (mem), XWA", + it was executing "EX F,F'" instead - Very bad! + +28 JUL 2002 - neopop_uk +======================================= +- Added generic DIV and DIVS functions + +30 AUG 2002 - neopop_uk +======================================= +- Fixed detection of R32+d16 addressing mode. + +02 SEP 2002 - neopop_uk +======================================= +- Added the undocumented type 0x13 R32 address mode. + +09 SEP 2002 - neopop_uk +======================================= +- Extra cycles for addressing modes. + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "TLCS900h_registers.h" +#include "../interrupt.h" +#include "../mem.h" +#include "../bios.h" +#include "TLCS900h_interpret.h" +#include "TLCS900h_interpret_single.h" +#include "TLCS900h_interpret_src.h" +#include "TLCS900h_interpret_dst.h" +#include "TLCS900h_interpret_reg.h" + +namespace TLCS900H +{ + +static void DUMMY_instruction_error(const char* vaMessage,...) +{ + + +} + +void (*instruction_error)(const char* vaMessage,...) = DUMMY_instruction_error; + +//========================================================================= + +uint32 mem; //Result of addressing mode +int size; //operand size, 0 = Byte, 1 = Word, 2 = Long + +uint8 first; //The first byte +uint8 R; //big R +uint8 second; //The second opcode + +bool brCode; //Register code used? +uint8 rCode; //The code + +int32 cycles; //How many state changes? +int32 cycles_extra; //How many extra state changes? + +//========================================================================= + +uint16 fetch16(void) +{ + uint16 a = loadW(pc); + pc += 2; + return a; +} + +uint32 fetch24(void) +{ + uint32 b, a = loadW(pc); + pc += 2; + b = loadB(pc++); + return (b << 16) | a; +} + +uint32 fetch32(void) +{ + uint32 a = loadL(pc); + pc += 4; + return a; +} + +//============================================================================= + +void parityB(uint8 value) +{ + uint8 count = 0, i; + + for (i = 0; i < 8; i++) + { + if (value & 1) count++; + value >>= 1; + } + + // if (count & 1) == FALSE, means even, thus SET + SETFLAG_V((count & 1) == 0); +} + +void parityW(uint16 value) +{ + uint8 count = 0, i; + + for (i = 0; i < 16; i++) + { + if (value & 1) count++; + value >>= 1; + } + + // if (count & 1) == FALSE, means even, thus SET + SETFLAG_V((count & 1) == 0); +} + +//========================================================================= + +void push8(uint8 data) { REGXSP -= 1; storeB(REGXSP, data);} +void push16(uint16 data) { REGXSP -= 2; storeW(REGXSP, data);} +void push32(uint32 data) { REGXSP -= 4; storeL(REGXSP, data);} + +uint8 pop8(void) { uint8 temp = loadB(REGXSP); REGXSP += 1; return temp;} +uint16 pop16(void) { uint16 temp = loadW(REGXSP); REGXSP += 2; return temp;} +uint32 pop32(void) { uint32 temp = loadL(REGXSP); REGXSP += 4; return temp;} + +//============================================================================= + +uint16 generic_DIV_B(uint16 val, uint8 div) +{ + if (div == 0) + { + SETFLAG_V1 + return (val << 8) | ((val >> 8) ^ 0xFF); + } + else + { + uint16 quo = val / (uint16)div; + uint16 rem = val % (uint16)div; + if (quo > 0xFF) SETFLAG_V1 else SETFLAG_V0 + return (quo & 0xFF) | ((rem & 0xFF) << 8); + } +} + +uint32 generic_DIV_W(uint32 val, uint16 div) +{ + if (div == 0) + { + SETFLAG_V1 + return (val << 16) | ((val >> 16) ^ 0xFFFF); + } + else + { + uint32 quo = val / (uint32)div; + uint32 rem = val % (uint32)div; + if (quo > 0xFFFF) SETFLAG_V1 else SETFLAG_V0 + return (quo & 0xFFFF) | ((rem & 0xFFFF) << 16); + } +} + +//============================================================================= + +uint16 generic_DIVS_B(int16 val, int8 div) +{ + if (div == 0) + { + SETFLAG_V1 + return (val << 8) | ((val >> 8) ^ 0xFF); + } + else + { + int16 quo = val / (int16)div; + int16 rem = val % (int16)div; + if (quo > 0xFF) SETFLAG_V1 else SETFLAG_V0 + return (quo & 0xFF) | ((rem & 0xFF) << 8); + } +} + +uint32 generic_DIVS_W(int32 val, int16 div) +{ + if (div == 0) + { + SETFLAG_V1 + return (val << 16) | ((val >> 16) ^ 0xFFFF); + } + else + { + int32 quo = val / (int32)div; + int32 rem = val % (int32)div; + if (quo > 0xFFFF) SETFLAG_V1 else SETFLAG_V0 + return (quo & 0xFFFF) | ((rem & 0xFFFF) << 16); + } +} + +//============================================================================= + +uint8 generic_ADD_B(uint8 dst, uint8 src) +{ + uint8 half = (dst & 0xF) + (src & 0xF); + uint32 resultC = (uint32)dst + (uint32)src; + uint8 result = (uint8)(resultC & 0xFF); + + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int8)dst >= 0) && ((int8)src >= 0) && ((int8)result < 0)) || + (((int8)dst < 0) && ((int8)src < 0) && ((int8)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N0; + SETFLAG_C(resultC > 0xFF); + + return result; +} + +uint16 generic_ADD_W(uint16 dst, uint16 src) +{ + uint16 half = (dst & 0xF) + (src & 0xF); + uint32 resultC = (uint32)dst + (uint32)src; + uint16 result = (uint16)(resultC & 0xFFFF); + + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int16)dst >= 0) && ((int16)src >= 0) && ((int16)result < 0)) || + (((int16)dst < 0) && ((int16)src < 0) && ((int16)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N0; + SETFLAG_C(resultC > 0xFFFF); + + return result; +} + +uint32 generic_ADD_L(uint32 dst, uint32 src) +{ + uint64 resultC = (uint64)dst + (uint64)src; + uint32 result = (uint32)(resultC & 0xFFFFFFFF); + + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + + if ((((int32)dst >= 0) && ((int32)src >= 0) && ((int32)result < 0)) || + (((int32)dst < 0) && ((int32)src < 0) && ((int32)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N0; + SETFLAG_C(resultC > 0xFFFFFFFF); + + return result; +} + +//============================================================================= + +uint8 generic_ADC_B(uint8 dst, uint8 src) +{ + uint8 half = (dst & 0xF) + (src & 0xF) + FLAG_C; + uint32 resultC = (uint32)dst + (uint32)src + (uint32)FLAG_C; + uint8 result = (uint8)(resultC & 0xFF); + + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int8)dst >= 0) && ((int8)src >= 0) && ((int8)result < 0)) || + (((int8)dst < 0) && ((int8)src < 0) && ((int8)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N0; + SETFLAG_C(resultC > 0xFF); + + return result; +} + +uint16 generic_ADC_W(uint16 dst, uint16 src) +{ + uint16 half = (dst & 0xF) + (src & 0xF) + FLAG_C; + uint32 resultC = (uint32)dst + (uint32)src + (uint32)FLAG_C; + uint16 result = (uint16)(resultC & 0xFFFF); + + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int16)dst >= 0) && ((int16)src >= 0) && ((int16)result < 0)) || + (((int16)dst < 0) && ((int16)src < 0) && ((int16)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N0; + SETFLAG_C(resultC > 0xFFFF); + + return result; +} + +uint32 generic_ADC_L(uint32 dst, uint32 src) +{ + uint64 resultC = (uint64)dst + (uint64)src + (uint64)FLAG_C; + uint32 result = (uint32)(resultC & 0xFFFFFFFF); + + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + + if ((((int32)dst >= 0) && ((int32)src >= 0) && ((int32)result < 0)) || + (((int32)dst < 0) && ((int32)src < 0) && ((int32)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N0; + SETFLAG_C(resultC > 0xFFFFFFFF); + + return result; +} + +//============================================================================= + +uint8 generic_SUB_B(uint8 dst, uint8 src) +{ + uint8 half = (dst & 0xF) - (src & 0xF); + uint32 resultC = (uint32)dst - (uint32)src; + uint8 result = (uint8)(resultC & 0xFF); + + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int8)dst >= 0) && ((int8)src < 0) && ((int8)result < 0)) || + (((int8)dst < 0) && ((int8)src >= 0) && ((int8)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N1; + SETFLAG_C(resultC > 0xFF); + + return result; +} + +uint16 generic_SUB_W(uint16 dst, uint16 src) +{ + uint16 half = (dst & 0xF) - (src & 0xF); + uint32 resultC = (uint32)dst - (uint32)src; + uint16 result = (uint16)(resultC & 0xFFFF); + + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int16)dst >= 0) && ((int16)src < 0) && ((int16)result < 0)) || + (((int16)dst < 0) && ((int16)src >= 0) && ((int16)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N1; + SETFLAG_C(resultC > 0xFFFF); + + return result; +} + +uint32 generic_SUB_L(uint32 dst, uint32 src) +{ + uint64 resultC = (uint64)dst - (uint64)src; + uint32 result = (uint32)(resultC & 0xFFFFFFFF); + + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + + if ((((int32)dst >= 0) && ((int32)src < 0) && ((int32)result < 0)) || + (((int32)dst < 0) && ((int32)src >= 0) && ((int32)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N1; + SETFLAG_C(resultC > 0xFFFFFFFF); + + return result; +} + +//============================================================================= + +uint8 generic_SBC_B(uint8 dst, uint8 src) +{ + uint8 half = (dst & 0xF) - (src & 0xF) - FLAG_C; + uint32 resultC = (uint32)dst - (uint32)src - (uint32)FLAG_C; + uint8 result = (uint8)(resultC & 0xFF); + + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int8)dst >= 0) && ((int8)src < 0) && ((int8)result < 0)) || + (((int8)dst < 0) && ((int8)src >= 0) && ((int8)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N1; + SETFLAG_C(resultC > 0xFF); + + return result; +} + +uint16 generic_SBC_W(uint16 dst, uint16 src) +{ + uint16 half = (dst & 0xF) - (src & 0xF) - FLAG_C; + uint32 resultC = (uint32)dst - (uint32)src - (uint32)FLAG_C; + uint16 result = (uint16)(resultC & 0xFFFF); + + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if ((((int16)dst >= 0) && ((int16)src < 0) && ((int16)result < 0)) || + (((int16)dst < 0) && ((int16)src >= 0) && ((int16)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N1; + SETFLAG_C(resultC > 0xFFFF); + + return result; +} + +uint32 generic_SBC_L(uint32 dst, uint32 src) +{ + uint64 resultC = (uint64)dst - (uint64)src - (uint64)FLAG_C; + uint32 result = (uint32)(resultC & 0xFFFFFFFF); + + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + + if ((((int32)dst >= 0) && ((int32)src < 0) && ((int32)result < 0)) || + (((int32)dst < 0) && ((int32)src >= 0) && ((int32)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_N1; + SETFLAG_C(resultC > 0xFFFFFFFF); + + return result; +} + +//============================================================================= + +bool conditionCode(int cc) +{ + switch(cc) + { + case 0: return 0; //(F) + case 1: if (FLAG_S ^ FLAG_V) return 1; else return 0; //(LT) + case 2: if (FLAG_Z | (FLAG_S ^ FLAG_V)) return 1; else return 0; //(LE) + case 3: if (FLAG_C | FLAG_Z) return 1; else return 0; //(ULE) + case 4: if (FLAG_V) return 1; else return 0; //(OV) + case 5: if (FLAG_S) return 1; else return 0; //(MI) + case 6: if (FLAG_Z) return 1; else return 0; //(Z) + case 7: if (FLAG_C) return 1; else return 0; //(C) + case 8: return 1; //always True + case 9: if (FLAG_S ^ FLAG_V) return 0; else return 1; //(GE) + case 10:if (FLAG_Z | (FLAG_S ^ FLAG_V)) return 0; else return 1; //(GT) + case 11:if (FLAG_C | FLAG_Z) return 0; else return 1; //(UGT) + case 12:if (FLAG_V) return 0; else return 1; //(NOV) + case 13:if (FLAG_S) return 0; else return 1; //(PL) + case 14:if (FLAG_Z) return 0; else return 1; //(NZ) + case 15:if (FLAG_C) return 0; else return 1; //(NC) + } + +#ifdef NEOPOP_DEBUG + system_debug_message("Unknown Condition Code %d", cc); +#endif + return FALSE; +} + +//============================================================================= + +uint8 get_rr_Target(void) +{ + uint8 target = 0x80; + + if (size == 0 && first == 0xC7) + return rCode; + + //Create a regCode + switch(first & 7) + { + case 0: if (size == 1) target = 0xE0; break; + case 1: + if (size == 0) target = 0xE0; + if (size == 1) target = 0xE4; + break; + case 2: if (size == 1) target = 0xE8; break; + case 3: + if (size == 0) target = 0xE4; + if (size == 1) target = 0xEC; + break; + case 4: if (size == 1) target = 0xF0; break; + case 5: + if (size == 0) target = 0xE8; + if (size == 1) target = 0xF4; + break; + case 6: if (size == 1) target = 0xF8; break; + case 7: + if (size == 0) target = 0xEC; + if (size == 1) target = 0xFC; + break; + } + + return target; +} + +uint8 get_RR_Target(void) +{ + uint8 target = 0x80; + + //Create a regCode + switch(second & 7) + { + case 0: if (size == 1) target = 0xE0; break; + case 1: + if (size == 0) target = 0xE0; + if (size == 1) target = 0xE4; + break; + case 2: if (size == 1) target = 0xE8; break; + case 3: + if (size == 0) target = 0xE4; + if (size == 1) target = 0xEC; + break; + case 4: if (size == 1) target = 0xF0; break; + case 5: + if (size == 0) target = 0xE8; + if (size == 1) target = 0xF4; + break; + case 6: if (size == 1) target = 0xF8; break; + case 7: + if (size == 0) target = 0xEC; + if (size == 1) target = 0xFC; + break; + } + + return target; +} + +//========================================================================= + +static void ExXWA() {mem = regL(0);} +static void ExXBC() {mem = regL(1);} +static void ExXDE() {mem = regL(2);} +static void ExXHL() {mem = regL(3);} +static void ExXIX() {mem = regL(4);} +static void ExXIY() {mem = regL(5);} +static void ExXIZ() {mem = regL(6);} +static void ExXSP() {mem = regL(7);} + +static void ExXWAd() {mem = regL(0) + (int8)FETCH8; cycles_extra = 2;} +static void ExXBCd() {mem = regL(1) + (int8)FETCH8; cycles_extra = 2;} +static void ExXDEd() {mem = regL(2) + (int8)FETCH8; cycles_extra = 2;} +static void ExXHLd() {mem = regL(3) + (int8)FETCH8; cycles_extra = 2;} +static void ExXIXd() {mem = regL(4) + (int8)FETCH8; cycles_extra = 2;} +static void ExXIYd() {mem = regL(5) + (int8)FETCH8; cycles_extra = 2;} +static void ExXIZd() {mem = regL(6) + (int8)FETCH8; cycles_extra = 2;} +static void ExXSPd() {mem = regL(7) + (int8)FETCH8; cycles_extra = 2;} + +static void Ex8() {mem = FETCH8; cycles_extra = 2;} +static void Ex16() {mem = fetch16(); cycles_extra = 2;} +static void Ex24() {mem = fetch24(); cycles_extra = 3;} + +static void ExR32() +{ + uint8 data = FETCH8; + + if (data == 0x03) + { + uint8 rIndex, r32; + r32 = FETCH8; //r32 + rIndex = FETCH8; //r8 + mem = rCodeL(r32) + (int8)rCodeB(rIndex); + cycles_extra = 8; + return; + } + + if (data == 0x07) + { + uint8 rIndex, r32; + r32 = FETCH8; //r32 + rIndex = FETCH8; //r16 + mem = rCodeL(r32) + (int16)rCodeW(rIndex); + cycles_extra = 8; + return; + } + + //Undocumented mode! + if (data == 0x13) + { + mem = pc + (int16)fetch16(); + cycles_extra = 8; //Unconfirmed... doesn't make much difference + return; + } + + cycles_extra = 5; + + if ((data & 3) == 1) + mem = rCodeL(data) + (int16)fetch16(); + else + mem = rCodeL(data); +} + +static void ExDec() +{ + uint8 data = FETCH8; + uint8 r32 = data & 0xFC; + + cycles_extra = 3; + + switch(data & 3) + { + case 0: rCodeL(r32) -= 1; mem = rCodeL(r32); break; + case 1: rCodeL(r32) -= 2; mem = rCodeL(r32); break; + case 2: rCodeL(r32) -= 4; mem = rCodeL(r32); break; + } +} + +static void ExInc() +{ + uint8 data = FETCH8; + uint8 r32 = data & 0xFC; + + cycles_extra = 3; + + switch(data & 3) + { + case 0: mem = rCodeL(r32); rCodeL(r32) += 1; break; + case 1: mem = rCodeL(r32); rCodeL(r32) += 2; break; + case 2: mem = rCodeL(r32); rCodeL(r32) += 4; break; + } +} + +static void ExRC() +{ + brCode = TRUE; + rCode = FETCH8; + cycles_extra = 1; +} + +//========================================================================= + +//Address Mode & Register Code +static void (*decodeExtra[256])() = +{ +/*0*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*1*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*2*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*3*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*4*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*5*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*6*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*7*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +/*8*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*9*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*A*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*B*/ ExXWA, ExXBC, ExXDE, ExXHL, ExXIX, ExXIY, ExXIZ, ExXSP, + ExXWAd, ExXBCd, ExXDEd, ExXHLd, ExXIXd, ExXIYd, ExXIZd, ExXSPd, +/*C*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, ExRC, + 0, 0, 0, 0, 0, 0, 0, 0, +/*D*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, ExRC, + 0, 0, 0, 0, 0, 0, 0, 0, +/*E*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, ExRC, + 0, 0, 0, 0, 0, 0, 0, 0, +/*F*/ Ex8, Ex16, Ex24, ExR32, ExDec, ExInc, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +//========================================================================= + +static void e(void) +{ + instruction_error("Unknown instruction %02X", first); +} + +static void es(void) +{ + //instruction_error("Unknown [src] instruction %02X", second); +} + +static void ed(void) +{ + //instruction_error("Unknown [dst] instruction %02X", second); +} + +static void er(void) +{ + //instruction_error("Unknown [reg] instruction %02X", second); +} + +//========================================================================= + +//Secondary (SRC) Instruction decode +static void (*srcDecode[256])() = +{ +/*0*/ es, es, es, es, srcPUSH, es, srcRLD, srcRRD, + es, es, es, es, es, es, es, es, +/*1*/ srcLDI, srcLDIR, srcLDD, srcLDDR, srcCPI, srcCPIR, srcCPD, srcCPDR, + es, srcLD16m, es, es, es, es, es, es, +/*2*/ srcLD, srcLD, srcLD, srcLD, srcLD, srcLD, srcLD, srcLD, + es, es, es, es, es, es, es, es, +/*3*/ srcEX, srcEX, srcEX, srcEX, srcEX, srcEX, srcEX, srcEX, + srcADDi, srcADCi, srcSUBi, srcSBCi, srcANDi, srcXORi, srcORi, srcCPi, +/*4*/ srcMUL, srcMUL, srcMUL, srcMUL, srcMUL, srcMUL, srcMUL, srcMUL, + srcMULS, srcMULS, srcMULS, srcMULS, srcMULS, srcMULS, srcMULS, srcMULS, +/*5*/ srcDIV, srcDIV, srcDIV, srcDIV, srcDIV, srcDIV, srcDIV, srcDIV, + srcDIVS, srcDIVS, srcDIVS, srcDIVS, srcDIVS, srcDIVS, srcDIVS, srcDIVS, +/*6*/ srcINC, srcINC, srcINC, srcINC, srcINC, srcINC, srcINC, srcINC, + srcDEC, srcDEC, srcDEC, srcDEC, srcDEC, srcDEC, srcDEC, srcDEC, +/*7*/ es, es, es, es, es, es, es, es, + srcRLC, srcRRC, srcRL, srcRR, srcSLA, srcSRA, srcSLL, srcSRL, +/*8*/ srcADDRm, srcADDRm, srcADDRm, srcADDRm, srcADDRm, srcADDRm, srcADDRm, srcADDRm, + srcADDmR, srcADDmR, srcADDmR, srcADDmR, srcADDmR, srcADDmR, srcADDmR, srcADDmR, +/*9*/ srcADCRm, srcADCRm, srcADCRm, srcADCRm, srcADCRm, srcADCRm, srcADCRm, srcADCRm, + srcADCmR, srcADCmR, srcADCmR, srcADCmR, srcADCmR, srcADCmR, srcADCmR, srcADCmR, +/*A*/ srcSUBRm, srcSUBRm, srcSUBRm, srcSUBRm, srcSUBRm, srcSUBRm, srcSUBRm, srcSUBRm, + srcSUBmR, srcSUBmR, srcSUBmR, srcSUBmR, srcSUBmR, srcSUBmR, srcSUBmR, srcSUBmR, +/*B*/ srcSBCRm, srcSBCRm, srcSBCRm, srcSBCRm, srcSBCRm, srcSBCRm, srcSBCRm, srcSBCRm, + srcSBCmR, srcSBCmR, srcSBCmR, srcSBCmR, srcSBCmR, srcSBCmR, srcSBCmR, srcSBCmR, +/*C*/ srcANDRm, srcANDRm, srcANDRm, srcANDRm, srcANDRm, srcANDRm, srcANDRm, srcANDRm, + srcANDmR, srcANDmR, srcANDmR, srcANDmR, srcANDmR, srcANDmR, srcANDmR, srcANDmR, +/*D*/ srcXORRm, srcXORRm, srcXORRm, srcXORRm, srcXORRm, srcXORRm, srcXORRm, srcXORRm, + srcXORmR, srcXORmR, srcXORmR, srcXORmR, srcXORmR, srcXORmR, srcXORmR, srcXORmR, +/*E*/ srcORRm, srcORRm, srcORRm, srcORRm, srcORRm, srcORRm, srcORRm, srcORRm, + srcORmR, srcORmR, srcORmR, srcORmR, srcORmR, srcORmR, srcORmR, srcORmR, +/*F*/ srcCPRm, srcCPRm, srcCPRm, srcCPRm, srcCPRm, srcCPRm, srcCPRm, srcCPRm, + srcCPmR, srcCPmR, srcCPmR, srcCPmR, srcCPmR, srcCPmR, srcCPmR, srcCPmR +}; + +//Secondary (DST) Instruction decode +static void (*dstDecode[256])() = +{ +/*0*/ dstLDBi, ed, dstLDWi, ed, dstPOPB, ed, dstPOPW, ed, + ed, ed, ed, ed, ed, ed, ed, ed, +/*1*/ ed, ed, ed, ed, dstLDBm16, ed, dstLDWm16, ed, + ed, ed, ed, ed, ed, ed, ed, ed, +/*2*/ dstLDAW, dstLDAW, dstLDAW, dstLDAW, dstLDAW, dstLDAW, dstLDAW, dstLDAW, + dstANDCFA, dstORCFA, dstXORCFA, dstLDCFA, dstSTCFA, ed, ed, ed, +/*3*/ dstLDAL, dstLDAL, dstLDAL, dstLDAL, dstLDAL, dstLDAL, dstLDAL, dstLDAL, + ed, ed, ed, ed, ed, ed, ed, ed, +/*4*/ dstLDBR, dstLDBR, dstLDBR, dstLDBR, dstLDBR, dstLDBR, dstLDBR, dstLDBR, + ed, ed, ed, ed, ed, ed, ed, ed, +/*5*/ dstLDWR, dstLDWR, dstLDWR, dstLDWR, dstLDWR, dstLDWR, dstLDWR, dstLDWR, + ed, ed, ed, ed, ed, ed, ed, ed, +/*6*/ dstLDLR, dstLDLR, dstLDLR, dstLDLR, dstLDLR, dstLDLR, dstLDLR, dstLDLR, + ed, ed, ed, ed, ed, ed, ed, ed, +/*7*/ ed, ed, ed, ed, ed, ed, ed, ed, + ed, ed, ed, ed, ed, ed, ed, ed, +/*8*/ dstANDCF, dstANDCF, dstANDCF, dstANDCF, dstANDCF, dstANDCF, dstANDCF, dstANDCF, + dstORCF, dstORCF, dstORCF, dstORCF, dstORCF, dstORCF, dstORCF, dstORCF, +/*9*/ dstXORCF, dstXORCF, dstXORCF, dstXORCF, dstXORCF, dstXORCF, dstXORCF, dstXORCF, + dstLDCF, dstLDCF, dstLDCF, dstLDCF, dstLDCF, dstLDCF, dstLDCF, dstLDCF, +/*A*/ dstSTCF, dstSTCF, dstSTCF, dstSTCF, dstSTCF, dstSTCF, dstSTCF, dstSTCF, + dstTSET, dstTSET, dstTSET, dstTSET, dstTSET, dstTSET, dstTSET, dstTSET, +/*B*/ dstRES, dstRES, dstRES, dstRES, dstRES, dstRES, dstRES, dstRES, + dstSET, dstSET, dstSET, dstSET, dstSET, dstSET, dstSET, dstSET, +/*C*/ dstCHG, dstCHG, dstCHG, dstCHG, dstCHG, dstCHG, dstCHG, dstCHG, + dstBIT, dstBIT, dstBIT, dstBIT, dstBIT, dstBIT, dstBIT, dstBIT, +/*D*/ dstJP, dstJP, dstJP, dstJP, dstJP, dstJP, dstJP, dstJP, + dstJP, dstJP, dstJP, dstJP, dstJP, dstJP, dstJP, dstJP, +/*E*/ dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, + dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, dstCALL, +/*F*/ dstRET, dstRET, dstRET, dstRET, dstRET, dstRET, dstRET, dstRET, + dstRET, dstRET, dstRET, dstRET, dstRET, dstRET, dstRET, dstRET +}; + +//Secondary (REG) Instruction decode +static void (*regDecode[256])() = +{ +/*0*/ er, er, er, regLDi, regPUSH, regPOP, regCPL, regNEG, + regMULi, regMULSi, regDIVi, regDIVSi, regLINK, regUNLK, regBS1F, regBS1B, +/*1*/ regDAA, er, regEXTZ, regEXTS, regPAA, er, regMIRR, er, + er, regMULA, er, er, regDJNZ, er, er, er, +/*2*/ regANDCFi, regORCFi, regXORCFi, regLDCFi, regSTCFi, er, er, er, + regANDCFA, regORCFA, regXORCFA, regLDCFA, regSTCFA, er, regLDCcrr, regLDCrcr, +/*3*/ regRES, regSET, regCHG, regBIT, regTSET, er, er, er, + regMINC1, regMINC2, regMINC4, er, regMDEC1, regMDEC2, regMDEC4, er, +/*4*/ regMUL, regMUL, regMUL, regMUL, regMUL, regMUL, regMUL, regMUL, + regMULS, regMULS, regMULS, regMULS, regMULS, regMULS, regMULS, regMULS, +/*5*/ regDIV, regDIV, regDIV, regDIV, regDIV, regDIV, regDIV, regDIV, + regDIVS, regDIVS, regDIVS, regDIVS, regDIVS, regDIVS, regDIVS, regDIVS, +/*6*/ regINC, regINC, regINC, regINC, regINC, regINC, regINC, regINC, + regDEC, regDEC, regDEC, regDEC, regDEC, regDEC, regDEC, regDEC, +/*7*/ regSCC, regSCC, regSCC, regSCC, regSCC, regSCC, regSCC, regSCC, + regSCC, regSCC, regSCC, regSCC, regSCC, regSCC, regSCC, regSCC, +/*8*/ regADD, regADD, regADD, regADD, regADD, regADD, regADD, regADD, + regLDRr, regLDRr, regLDRr, regLDRr, regLDRr, regLDRr, regLDRr, regLDRr, +/*9*/ regADC, regADC, regADC, regADC, regADC, regADC, regADC, regADC, + regLDrR, regLDrR, regLDrR, regLDrR, regLDrR, regLDrR, regLDrR, regLDrR, +/*A*/ regSUB, regSUB, regSUB, regSUB, regSUB, regSUB, regSUB, regSUB, + regLDr3, regLDr3, regLDr3, regLDr3, regLDr3, regLDr3, regLDr3, regLDr3, +/*B*/ regSBC, regSBC, regSBC, regSBC, regSBC, regSBC, regSBC, regSBC, + regEX, regEX, regEX, regEX, regEX, regEX, regEX, regEX, +/*C*/ regAND, regAND, regAND, regAND, regAND, regAND, regAND, regAND, + regADDi, regADCi, regSUBi, regSBCi, regANDi, regXORi, regORi, regCPi, +/*D*/ regXOR, regXOR, regXOR, regXOR, regXOR, regXOR, regXOR, regXOR, + regCPr3, regCPr3, regCPr3, regCPr3, regCPr3, regCPr3, regCPr3, regCPr3, +/*E*/ regOR, regOR, regOR, regOR, regOR, regOR, regOR, regOR, + regRLCi, regRRCi, regRLi, regRRi, regSLAi, regSRAi, regSLLi, regSRLi, +/*F*/ regCP, regCP, regCP, regCP, regCP, regCP, regCP, regCP, + regRLCA, regRRCA, regRLA, regRRA, regSLAA, regSRAA, regSLLA, regSRLA +}; + +//========================================================================= + +static void src_B() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + size = 0; //Byte Size + + (*srcDecode[second])(); //Call +} + +static void src_W() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + size = 1; //Word Size + + (*srcDecode[second])(); //Call +} + +static void src_L() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + size = 2; //Long Size + + (*srcDecode[second])(); //Call +} + +static void dst() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + + (*dstDecode[second])(); //Call +} + +static uint8 rCodeConversionB[8] = { 0xE1, 0xE0, 0xE5, 0xE4, 0xE9, 0xE8, 0xED, 0xEC }; +static uint8 rCodeConversionW[8] = { 0xE0, 0xE4, 0xE8, 0xEC, 0xF0, 0xF4, 0xF8, 0xFC }; +static uint8 rCodeConversionL[8] = { 0xE0, 0xE4, 0xE8, 0xEC, 0xF0, 0xF4, 0xF8, 0xFC }; + +static void reg_B() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + size = 0; //Byte Size + + if (brCode == FALSE) + { + brCode = TRUE; + rCode = rCodeConversionB[first & 7]; + } + + (*regDecode[second])(); //Call +} + +static void reg_W() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + size = 1; //Word Size + + if (brCode == FALSE) + { + brCode = TRUE; + rCode = rCodeConversionW[first & 7]; + } + + (*regDecode[second])(); //Call +} + +static void reg_L() +{ + second = FETCH8; //Get the second opcode + R = second & 7; + size = 2; //Long Size + + if (brCode == FALSE) + { + brCode = TRUE; + rCode = rCodeConversionL[first & 7]; + } + + (*regDecode[second])(); //Call +} + +//============================================================================= + +//Primary Instruction decode +static void (*decode[256])() = +{ +/*0*/ sngNOP, sngNORMAL, sngPUSHSR, sngPOPSR, sngMAX, sngHALT, sngEI, sngRETI, + sngLD8_8, sngPUSH8, sngLD8_16, sngPUSH16, sngINCF, sngDECF, sngRET, sngRETD, +/*1*/ sngRCF, sngSCF, sngCCF, sngZCF, sngPUSHA, sngPOPA, sngEX, sngLDF, + sngPUSHF, sngPOPF, sngJP16, sngJP24, sngCALL16, sngCALL24, sngCALR, iBIOSHLE, +/*2*/ sngLDB, sngLDB, sngLDB, sngLDB, sngLDB, sngLDB, sngLDB, sngLDB, + sngPUSHW, sngPUSHW, sngPUSHW, sngPUSHW, sngPUSHW, sngPUSHW, sngPUSHW, sngPUSHW, +/*3*/ sngLDW, sngLDW, sngLDW, sngLDW, sngLDW, sngLDW, sngLDW, sngLDW, + sngPUSHL, sngPUSHL, sngPUSHL, sngPUSHL, sngPUSHL, sngPUSHL, sngPUSHL, sngPUSHL, +/*4*/ sngLDL, sngLDL, sngLDL, sngLDL, sngLDL, sngLDL, sngLDL, sngLDL, + sngPOPW, sngPOPW, sngPOPW, sngPOPW, sngPOPW, sngPOPW, sngPOPW, sngPOPW, +/*5*/ e, e, e, e, e, e, e, e, + sngPOPL, sngPOPL, sngPOPL, sngPOPL, sngPOPL, sngPOPL, sngPOPL, sngPOPL, +/*6*/ sngJR, sngJR, sngJR, sngJR, sngJR, sngJR, sngJR, sngJR, + sngJR, sngJR, sngJR, sngJR, sngJR, sngJR, sngJR, sngJR, +/*7*/ sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, + sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, sngJRL, +/*8*/ src_B, src_B, src_B, src_B, src_B, src_B, src_B, src_B, + src_B, src_B, src_B, src_B, src_B, src_B, src_B, src_B, +/*9*/ src_W, src_W, src_W, src_W, src_W, src_W, src_W, src_W, + src_W, src_W, src_W, src_W, src_W, src_W, src_W, src_W, +/*A*/ src_L, src_L, src_L, src_L, src_L, src_L, src_L, src_L, + src_L, src_L, src_L, src_L, src_L, src_L, src_L, src_L, +/*B*/ dst, dst, dst, dst, dst, dst, dst, dst, + dst, dst, dst, dst, dst, dst, dst, dst, +/*C*/ src_B, src_B, src_B, src_B, src_B, src_B, e, reg_B, + reg_B, reg_B, reg_B, reg_B, reg_B, reg_B, reg_B, reg_B, +/*D*/ src_W, src_W, src_W, src_W, src_W, src_W, e, reg_W, + reg_W, reg_W, reg_W, reg_W, reg_W, reg_W, reg_W, reg_W, +/*E*/ src_L, src_L, src_L, src_L, src_L, src_L, e, reg_L, + reg_L, reg_L, reg_L, reg_L, reg_L, reg_L, reg_L, reg_L, +/*F*/ dst, dst, dst, dst, dst, dst, e, sngLDX, + sngSWI, sngSWI, sngSWI, sngSWI, sngSWI, sngSWI, sngSWI, sngSWI +}; + +//============================================================================= + +int32 TLCS900h_interpret(void) +{ + brCode = FALSE; + + first = FETCH8; //Get the first byte + + //Is any extra data used by this instruction? + cycles_extra = 0; + if (decodeExtra[first]) + (*decodeExtra[first])(); + + (*decode[first])(); //Decode + + return cycles + cycles_extra; +} + +}; + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret.h new file mode 100644 index 0000000000..056b58521e --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret.h @@ -0,0 +1,137 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +21 JUL 2002 - neopop_uk +======================================= +- Added the 'instruction_error' function declaration here. + +28 JUL 2002 - neopop_uk +======================================= +- Removed CYCLE_WARNING as it is now obsolete. +- Added generic DIV prototypes. + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_INTERPRET__ +#define __TLCS900H_INTERPRET__ +namespace TLCS900H +{ + +//============================================================================= + +//Interprets a single instruction from 'pc', +//pc is incremented to the start of the next instruction. +//Returns the number of cycles taken for this instruction +int32 TLCS900h_interpret(void); + +//============================================================================= + +extern uint32 mem; +extern int size; +extern uint8 first; //First byte +extern uint8 second; //Second byte +extern uint8 R; //(second & 7) +extern uint8 rCode; +extern int32 cycles; +extern bool brCode; + +//============================================================================= + +extern void (*instruction_error)(const char* vaMessage,...); + +//============================================================================= + +#define FETCH8 loadB(pc++) + +uint16 fetch16(void); +uint32 fetch24(void); +uint32 fetch32(void); + +//============================================================================= + +void parityB(uint8 value); +void parityW(uint16 value); + +//============================================================================= + +void push8(uint8 data); +void push16(uint16 data); +void push32(uint32 data); + +uint8 pop8(void); +uint16 pop16(void); +uint32 pop32(void); + +//============================================================================= + +//DIV =============== +uint16 generic_DIV_B(uint16 val, uint8 div); +uint32 generic_DIV_W(uint32 val, uint16 div); + +//DIVS =============== +uint16 generic_DIVS_B(int16 val, int8 div); +uint32 generic_DIVS_W(int32 val, int16 div); + +//ADD =============== +uint8 generic_ADD_B(uint8 dst, uint8 src); +uint16 generic_ADD_W(uint16 dst, uint16 src); +uint32 generic_ADD_L(uint32 dst, uint32 src); + +//ADC =============== +uint8 generic_ADC_B(uint8 dst, uint8 src); +uint16 generic_ADC_W(uint16 dst, uint16 src); +uint32 generic_ADC_L(uint32 dst, uint32 src); + +//SUB =============== +uint8 generic_SUB_B(uint8 dst, uint8 src); +uint16 generic_SUB_W(uint16 dst, uint16 src); +uint32 generic_SUB_L(uint32 dst, uint32 src); + +//SBC =============== +uint8 generic_SBC_B(uint8 dst, uint8 src); +uint16 generic_SBC_W(uint16 dst, uint16 src); +uint32 generic_SBC_L(uint32 dst, uint32 src); + +//============================================================================= + +//Confirms a condition code check +bool conditionCode(int cc); + +//============================================================================= + +//Translate an rr or RR value for MUL/MULS/DIV/DIVS +uint8 get_rr_Target(void); +uint8 get_RR_Target(void); + +}; + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_dst.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_dst.cpp new file mode 100644 index 0000000000..e59b3d554c --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_dst.cpp @@ -0,0 +1,315 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_dst.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +22 JUL 2002 - neopop_uk +======================================= +- Added ANDCF,ORCF and XORCF in # and A modes. These were being used + by one of the obscure pachinko "games". + +23 JUL 2002 - neopop_uk +======================================= +- Added cycle count for TSET. + +16 AUG 2002 - neopop_uk +======================================= +- Replaced 'second & 7' with 'R', clearer, faster - and for some reason + more accurate... oh well! + +21 AUG 2002 - neopop_uk +======================================= +- Added TSET. + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "TLCS900h_interpret.h" +#include "TLCS900h_registers.h" +#include "../mem.h" + +namespace TLCS900H +{ + +//========================================================================= + +//===== LD (mem),# +void dstLDBi() +{ + storeB(mem, FETCH8); + cycles = 5; +} + +//===== LD (mem),# +void dstLDWi() +{ + storeW(mem, fetch16()); + cycles = 6; +} + +//===== POP (mem) +void dstPOPB() +{ + storeB(mem, pop8()); + cycles = 6; +} + +//===== POP (mem) +void dstPOPW() +{ + storeW(mem, pop16()); + cycles = 6; +} + +//===== LD (mem),(nn) +void dstLDBm16() +{ + storeB(mem, loadB(fetch16())); + cycles = 8; +} + +//===== LD (mem),(nn) +void dstLDWm16() +{ + storeW(mem, loadW(fetch16())); + cycles = 8; +} + +//===== LDA R,mem +void dstLDAW() +{ + regW(R) = (uint16)mem; + cycles = 4; +} + +//===== LDA R,mem +void dstLDAL() +{ + regL(R) = (uint32)mem; + cycles = 4; +} + +//===== ANDCF A,(mem) +void dstANDCFA() +{ + uint8 bit = REGA & 0xF; + uint8 mbit = (loadB(mem) >> bit) & 1; + if (bit < 8) SETFLAG_C(mbit & FLAG_C); + cycles = 8; +} + +//===== ORCF A,(mem) +void dstORCFA() +{ + uint8 bit = REGA & 0xF; + uint8 mbit = (loadB(mem) >> bit) & 1; + if (bit < 8) SETFLAG_C(mbit | FLAG_C); + cycles = 8; +} + +//===== XORCF A,(mem) +void dstXORCFA() +{ + uint8 bit = REGA & 0xF; + uint8 mbit = (loadB(mem) >> bit) & 1; + if (bit < 8) SETFLAG_C(mbit ^ FLAG_C); + cycles = 8; +} + +//===== LDCF A,(mem) +void dstLDCFA() +{ + uint8 bit = REGA & 0xF; + uint8 mask = (1 << bit); + if (bit < 8) SETFLAG_C(loadB(mem) & mask); + cycles = 8; +} + +//===== STCF A,(mem) +void dstSTCFA() +{ + uint8 bit = REGA & 0xF; + uint8 cmask = ~(1 << bit); + uint8 set = FLAG_C << bit; + if (bit < 8) storeB(mem, (loadB(mem) & cmask) | set); + cycles = 8; +} + +//===== LD (mem),R +void dstLDBR() +{ + storeB(mem, regB(R)); + cycles = 4; +} + +//===== LD (mem),R +void dstLDWR() +{ + storeW(mem, regW(R)); + cycles = 4; +} + +//===== LD (mem),R +void dstLDLR() +{ + storeL(mem, regL(R)); + cycles = 6; +} + +//===== ANDCF #3,(mem) +void dstANDCF() +{ + uint8 bit = R; + uint8 mbit = (loadB(mem) >> bit) & 1; + SETFLAG_C(mbit & FLAG_C); + cycles = 8; +} + +//===== ORCF #3,(mem) +void dstORCF() +{ + uint8 bit = R; + uint8 mbit = (loadB(mem) >> bit) & 1; + SETFLAG_C(mbit | FLAG_C); + cycles = 8; +} + +//===== XORCF #3,(mem) +void dstXORCF() +{ + uint8 bit = R; + uint8 mbit = (loadB(mem) >> bit) & 1; + SETFLAG_C(mbit ^ FLAG_C); + cycles = 8; +} + +//===== LDCF #3,(mem) +void dstLDCF() +{ + uint8 bit = R; + uint32 mask = (1 << bit); + SETFLAG_C(loadB(mem) & mask); + cycles = 8; +} + +//===== STCF #3,(mem) +void dstSTCF() +{ + uint8 bit = R; + uint8 cmask = ~(1 << bit); + uint8 set = FLAG_C << bit; + storeB(mem, (loadB(mem) & cmask) | set); + cycles = 8; +} + +//===== TSET #3,(mem) +void dstTSET() +{ + SETFLAG_Z(! (loadB(mem) & (1 << R)) ); + storeB(mem, loadB(mem) | (1 << R)); + + SETFLAG_H1 + SETFLAG_N0 + cycles = 10; +} + +//===== RES #3,(mem) +void dstRES() +{ + storeB(mem, loadB(mem) & (~(1 << R))); + cycles = 8; +} + +//===== SET #3,(mem) +void dstSET() +{ + storeB(mem, loadB(mem) | (1 << R)); + cycles = 8; +} + +//===== CHG #3,(mem) +void dstCHG() +{ + storeB(mem, loadB(mem) ^ (1 << R)); + cycles = 8; +} + +//===== BIT #3,(mem) +void dstBIT() +{ + SETFLAG_Z(! (loadB(mem) & (1 << R)) ); + SETFLAG_H1; + SETFLAG_N0; + cycles = 8; +} + +//===== JP cc,mem +void dstJP() +{ + if (conditionCode(second & 0xF)) + { + pc = mem; + cycles = 9; + } + else + { + cycles = 6; + } +} + +//===== CALL cc,mem +void dstCALL() +{ + if (conditionCode(second & 0xF)) + { + push32(pc); + pc = mem; + cycles = 12; + } + else + { + cycles = 6; + } +} + +//===== RET cc +void dstRET() +{ + if (conditionCode(second & 0xF)) + { + pc = pop32(); + cycles = 12; + } + else + { + cycles = 6; + } +} +}; +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_dst.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_dst.h new file mode 100644 index 0000000000..2a8a579ff7 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_dst.h @@ -0,0 +1,132 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_dst.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_DST__ +#define __TLCS900H_DST__ + +namespace TLCS900H +{ + +//========================================================================= + +//===== LD (mem),# +void dstLDBi(void); + +//===== LD (mem),# +void dstLDWi(void); + +//===== POP (mem) +void dstPOPB(void); + +//===== POP (mem) +void dstPOPW(void); + +//===== LD (mem),(nn) +void dstLDBm16(void); + +//===== LD (mem),(nn) +void dstLDWm16(void); + +//===== LDA R,mem +void dstLDAW(void); + +//===== LDA R,mem +void dstLDAL(void); + +//===== ANDCF A,(mem) +void dstANDCFA(void); + +//===== ORCF A,(mem) +void dstORCFA(void); + +//===== XORCF A,(mem) +void dstXORCFA(void); + +//===== LDCF A,(mem) +void dstLDCFA(void); + +//===== STCF A,(mem) +void dstSTCFA(void); + +//===== LD (mem),R +void dstLDBR(void); + +//===== LD (mem),R +void dstLDWR(void); + +//===== LD (mem),R +void dstLDLR(void); + +//===== ANDCF #3,(mem) +void dstANDCF(void); + +//===== ORCF #3,(mem) +void dstORCF(void); + +//===== XORCF #3,(mem) +void dstXORCF(void); + +//===== LDCF #3,(mem) +void dstLDCF(void); + +//===== STCF #3,(mem) +void dstSTCF(void); + +//===== TSET #3,(mem) +void dstTSET(void); + +//===== RES #3,(mem) +void dstRES(void); + +//===== SET #3,(mem) +void dstSET(void); + +//===== CHG #3,(mem) +void dstCHG(void); + +//===== BIT #3,(mem) +void dstBIT(void); + +//===== JP cc,mem +void dstJP(void); + +//===== CALL cc,mem +void dstCALL(void); + +//===== RET cc +void dstRET(void); + +}; + +//========================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_reg.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_reg.cpp new file mode 100644 index 0000000000..4d928edb70 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_reg.cpp @@ -0,0 +1,2187 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_reg.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +22 JUL 2002 - neopop_uk +======================================= +- Added ANDCF,ORCF and XORCF in A mode and improved the remaining ones. + +22 JUL 2002 - neopop_uk +======================================= +- Added LINK and UNLK to fix "Rockman Battle and Fighters" + +23 JUL 2002 - neopop_uk +======================================= +- Added MIRR to fix "Card Fighters 2" +- Added cycle counts for TSET. + +28 JUL 2002 - neopop_uk +======================================= +- Converted DIV/DIVS to use the generic function + +16 AUG 2002 - neopop_uk +======================================= +- Removed all of the 'second & 7' with R as it's pre-calculated anyway. +- Fixed V flag emulation of INC/DEC, fixes "Cotton" menus +- Fixed MINC4 + +21 AUG 2002 - neopop_uk +======================================= +- Added TSET and MULA, both untested. + +04 SEP 2002 - neopop_uk +======================================= +- Fixed GCC compatibility. + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "TLCS900h_interpret.h" +#include "TLCS900h_registers.h" +#include "../mem.h" +#include "../dma.h" + +namespace TLCS900H +{ + +//========================================================================= + +//===== LD r,# +void regLDi() +{ + switch(size) + { + case 0: rCodeB(rCode) = FETCH8; cycles = 4; break; + case 1: rCodeW(rCode) = fetch16(); cycles = 4; break; + case 2: rCodeL(rCode) = fetch32(); cycles = 6; break; + } +} + +//===== PUSH r +void regPUSH() +{ + switch(size) + { + case 0: push8(rCodeB(rCode)); cycles = 5;break; + case 1: push16(rCodeW(rCode)); cycles = 5;break; + case 2: push32(rCodeL(rCode)); cycles = 7;break; + } +} + +//===== POP r +void regPOP() +{ + switch(size) + { + case 0: rCodeB(rCode) = pop8(); cycles = 6;break; + case 1: rCodeW(rCode) = pop16(); cycles = 6;break; + case 2: rCodeL(rCode) = pop32(); cycles = 8;break; + } +} + +//===== CPL r +void regCPL() +{ + switch(size) + { + case 0: rCodeB(rCode) = ~ rCodeB(rCode); break; + case 1: rCodeW(rCode) = ~ rCodeW(rCode); break; + } + + SETFLAG_H1; + SETFLAG_N1; + cycles = 4; +} + +//===== NEG r +void regNEG() +{ + switch(size) + { + case 0: rCodeB(rCode) = generic_SUB_B(0, rCodeB(rCode)); break; + case 1: rCodeW(rCode) = generic_SUB_W(0, rCodeW(rCode)); break; + } + cycles = 5; +} + +//===== MUL rr,# +void regMULi() +{ + uint8 target = get_rr_Target(); + if (target == 0x80) + { +#ifdef NEOPOP_DEBUG + instruction_error("reg: MULi bad \'rr\' dst code"); +#endif + return; + } + + switch(size) + { + case 0: rCodeW(target) = (rCodeW(target) & 0xFF) * FETCH8; + cycles = 18; break; + case 1: rCodeL(target) = (rCodeL(target) & 0xFFFF) * fetch16(); + cycles = 26; break; + } +} + +//===== MULS rr,# +void regMULSi() +{ + uint8 target = get_rr_Target(); + if (target == 0x80) + { + instruction_error("reg: MULSi bad \'rr\' dst code"); + return; + } + + switch(size) + { + case 0: rCodeW(target) = (int8)(rCodeW(target) & 0xFF) * (int8)FETCH8; + cycles = 18; break; + case 1: rCodeL(target) = (int16)(rCodeL(target) & 0xFFFF) * (int16)fetch16(); + cycles = 26; break; + } +} + +//===== DIV rr,# +void regDIVi() +{ + uint8 target = get_rr_Target(); + if (target == 0x80) + { + instruction_error("reg: DIVi bad \'rr\' dst code"); + return; + } + + switch(size) + { + case 0: { rCodeW(target) = generic_DIV_B(rCodeW(target), FETCH8); + cycles = 22; + break; } + + case 1: { rCodeL(target) = generic_DIV_W(rCodeL(target), fetch16()); + cycles = 30; + break; } + } +} + +//===== DIVS rr,# +void regDIVSi() +{ + uint8 target = get_rr_Target(); + if (target == 0x80) + { + instruction_error("reg: DIVSi bad \'rr\' dst code"); + return; + } + + switch(size) + { + case 0: { rCodeW(target) = generic_DIVS_B(rCodeW(target), FETCH8); + cycles = 24; + break; } + + case 1: { rCodeL(target) = generic_DIVS_W(rCodeL(target), fetch16()); + cycles = 32; + break; } + } +} + +//===== LINK r,dd +void regLINK() +{ + int16 d = (int16)fetch16(); + push32(rCodeL(rCode)); + rCodeL(rCode) = REGXSP; + REGXSP += d; + cycles = 10; +} + +//===== UNLK r +void regUNLK() +{ + REGXSP = rCodeL(rCode); + rCodeL(rCode) = pop32(); + cycles = 8; +} + +//===== BS1F A,r +void regBS1F() +{ + uint16 data = rCodeW(rCode), mask = 0x0001; + uint8 i; + + SETFLAG_V0; + for (i = 0; i < 15; i++) + { + if (data & mask) + { + REGA = i; + return; + } + + mask <<= 1; + } + + SETFLAG_V1; + cycles = 4; +} + +//===== BS1B A,r +void regBS1B() +{ + uint16 data = rCodeW(rCode), mask = 0x8000; + uint8 i; + + SETFLAG_V0; + for (i = 0; i < 15; i++) + { + if (data & mask) + { + REGA = 15 - i; + return; + } + + mask >>= 1; + } + + SETFLAG_V1; + cycles = 4; +} + +//===== DAA r +void regDAA() +{ + uint16 resultC; + uint8 src = rCodeB(rCode), result, added = 0, half; + bool setC = FALSE; + + uint8 upper4 = (src & 0xF0); + uint8 lower4 = (src & 0x0F); + + if (FLAG_C) // {C = 1} + { + if (FLAG_H) // {H = 1} + { + setC = TRUE; + added = 0x66; + } + else // {H = 0} + { + if (lower4 < 0x0a) { added = 0x60; } + else { added = 0x66; } + setC = TRUE; + } + } + else // {C = 0} + { + if (FLAG_H) // {H = 1} + { + if (src < 0x9A) { added = 0x06; } + else { added = 0x66; } + } + else // {H = 0} + { + if ((upper4 < 0x90) && (lower4 > 0x9)) { added = 0x06; } + else if ((upper4 > 0x80) && (lower4 > 0x9)) { added = 0x66; } + else if ((upper4 > 0x90) && (lower4 < 0xa)) { added = 0x60; } + } + } + + if (FLAG_N) + { + resultC = (uint16)src - (uint16)added; + half = (src & 0xF) - (added & 0xF); + } + else + { + resultC = (uint16)src + (uint16)added; + half = (src & 0xF) + (added & 0xF); + } + + result = (uint8)(resultC & 0xFF); + + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + + if (FLAG_N) SETFLAG_C(result > src || setC) + else SETFLAG_C(result < src || setC) + + parityB(result); + rCodeB(rCode) = result; + cycles = 6; +} + +//===== EXTZ r +void regEXTZ() +{ + switch(size) + { + case 1: rCodeW(rCode) &= 0xFF; break; + case 2: rCodeL(rCode) &= 0xFFFF; break; + } + + cycles = 4; +} + +//===== EXTS r +void regEXTS() +{ + switch(size) + { + case 1: if (rCodeW(rCode) & 0x0080) + { rCodeW(rCode) |= 0xFF00; } else + { rCodeW(rCode) &= 0x00FF; } + break; + + case 2: if (rCodeL(rCode) & 0x00008000) + { rCodeL(rCode) |= 0xFFFF0000; } else + { rCodeL(rCode) &= 0x0000FFFF; } + break; + } + + cycles = 5; +} + +//===== PAA r +void regPAA() +{ + switch(size) + { + case 1: if (rCodeW(rCode) & 0x1) rCodeW(rCode)++; break; + case 2: if (rCodeL(rCode) & 0x1) rCodeL(rCode)++; break; + } + cycles = 4; +} + +//===== MIRR r +void regMIRR() +{ + uint16 src = rCodeW(rCode), dst = 0, bit; + + //Undocumented - see p165 of CPU .PDF + //Seems to mirror bits completely, ie. 1234 -> 4321 + + for (bit = 0; bit < 16; bit++) + if (src & (1 << bit)) + dst |= (1 << (15 - bit)); + + rCodeW(rCode) = dst; + cycles = 4; +} + +//===== MULA rr +void regMULA() +{ + uint32 src = (int16)loadW(regL(2/*XDE*/)) * (int16)loadW(regL(3/*XHL*/)); + uint32 dst = rCodeL(rCode); + uint32 result = dst + src; + + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + + if ((((int32)dst >= 0) && ((int32)src >= 0) && ((int32)result < 0)) || + (((int32)dst < 0) && ((int32)src < 0) && ((int32)result >= 0))) + {SETFLAG_V1} else {SETFLAG_V0} + + cycles = 31; +} + +//===== DJNZ r,d +void regDJNZ() +{ + int8 offset = FETCH8; + + cycles = 7; + + switch(size) + { + case 0: + rCodeB(rCode) --; + if (rCodeB(rCode) != 0) + { + cycles = 11; + pc = pc + offset; + } + break; + + case 1: + rCodeW(rCode) --; + if (rCodeW(rCode) != 0) + { + cycles = 11; + pc = pc + offset; + } + break; + } +} + +//===== ANDCF #,r +void regANDCFi() +{ + uint8 data, bit = FETCH8 & 0xF; + switch(size) + { + case 0: { data = (rCodeB(rCode) >> bit) & 1; + if (bit < 8) SETFLAG_C(FLAG_C & data); + break; } + + case 1: { data = (rCodeW(rCode) >> bit) & 1; + SETFLAG_C(FLAG_C & data); + break; } + } + cycles = 4; +} + +//===== ORCF #,r +void regORCFi() +{ + uint8 data, bit = FETCH8 & 0xF; + switch(size) + { + case 0: { data = (rCodeB(rCode) >> bit) & 1; + if (bit < 8) SETFLAG_C(FLAG_C | data); + break; } + + case 1: { data = (rCodeW(rCode) >> bit) & 1; + SETFLAG_C(FLAG_C | data); + break; } + } + cycles = 4; +} + +//===== XORCF #,r +void regXORCFi() +{ + uint8 data, bit = FETCH8 & 0xF; + switch(size) + { + case 0: { data = (rCodeB(rCode) >> bit) & 1; + if (bit < 8) SETFLAG_C(FLAG_C ^ data); + break; } + + case 1: { data = (rCodeW(rCode) >> bit) & 1; + SETFLAG_C(FLAG_C ^ data); + break; } + } + cycles = 4; +} + +//===== LDCF #,r +void regLDCFi() +{ + uint8 bit = FETCH8 & 0xF; + switch(size) + { + case 0: { uint8 mask = (1 << bit); + if (bit < 8) + SETFLAG_C(rCodeB(rCode) & mask); + break; } + + + case 1: { uint16 mask = (1 << bit); + SETFLAG_C(rCodeW(rCode) & mask); + break; } + } + + cycles = 4; +} + +//===== STCF #,r +void regSTCFi() +{ + uint8 bit = FETCH8 & 0xF; + switch(size) + { + case 0: { uint8 cmask = ~(1 << bit); + uint8 set = FLAG_C << bit; + if (bit < 8) rCodeB(rCode) = (rCodeB(rCode) & cmask) | set; + break; } + + case 1: { uint16 cmask = ~(1 << bit); + uint16 set = FLAG_C << bit; + rCodeW(rCode) = (rCodeW(rCode) & cmask) | set; + break; } + } + + cycles = 4; +} + +//===== ANDCF A,r +void regANDCFA() +{ + uint8 data, bit = REGA & 0xF; + switch(size) + { + case 0: { data = (rCodeB(rCode) >> bit) & 1; + if (bit < 8) SETFLAG_C(FLAG_C & data); + break; } + + case 1: { data = (rCodeW(rCode) >> bit) & 1; + SETFLAG_C(FLAG_C & data); + break; } + } + cycles = 4; +} + +//===== ORCF A,r +void regORCFA() +{ + uint8 data, bit = REGA & 0xF; + switch(size) + { + case 0: { data = (rCodeB(rCode) >> bit) & 1; + if (bit < 8) SETFLAG_C(FLAG_C | data); + break; } + + case 1: { data = (rCodeW(rCode) >> bit) & 1; + SETFLAG_C(FLAG_C | data); + break; } + } + cycles = 4; +} + +//===== XORCF A,r +void regXORCFA() +{ + uint8 data, bit = REGA & 0xF; + switch(size) + { + case 0: { data = (rCodeB(rCode) >> bit) & 1; + if (bit < 8) SETFLAG_C(FLAG_C ^ data); + break; } + + case 1: { data = (rCodeW(rCode) >> bit) & 1; + SETFLAG_C(FLAG_C ^ data); + break; } + } + cycles = 4; +} + +//===== LDCF A,r +void regLDCFA() +{ + uint8 bit = REGA & 0xF; + uint32 mask = (1 << bit); + + switch(size) + { + case 0: if (bit < 8) SETFLAG_C(rCodeB(rCode) & mask); break; + case 1: SETFLAG_C(rCodeW(rCode) & mask); break; + } + + cycles = 4; +} + +//===== STCF A,r +void regSTCFA() +{ + switch(size) + { + case 0: { uint8 bit = REGA & 0xF; + uint8 cmask = ~(1 << bit); + uint8 set = FLAG_C << bit; + if (bit < 8) rCodeB(rCode) = (rCodeB(rCode) & cmask) | set; + break; } + + case 1: { uint8 bit = REGA & 0xF; + uint16 cmask = ~(1 << bit); + uint16 set = FLAG_C << bit; + rCodeW(rCode) = (rCodeW(rCode) & cmask) | set; + break; } + } + + cycles = 4; +} + +//===== LDC cr,r +void regLDCcrr() +{ + uint8 cr = FETCH8; + + switch(size) + { + case 0: dmaStoreB(cr, rCodeB(rCode)); break; + case 1: dmaStoreW(cr, rCodeW(rCode)); break; + case 2: dmaStoreL(cr, rCodeL(rCode)); break; + } + + cycles = 8; +} + +//===== LDC r,cr +void regLDCrcr() +{ + uint8 cr = FETCH8; + + switch(size) + { + case 0: rCodeB(rCode) = dmaLoadB(cr); break; + case 1: rCodeW(rCode) = dmaLoadW(cr); break; + case 2: rCodeL(rCode) = dmaLoadL(cr); break; + } + + cycles = 8; +} + +//===== RES #,r +void regRES() +{ + uint8 b = FETCH8 & 0xF; + + switch(size) + { + case 0: rCodeB(rCode) &= ~(uint8)(1 << b); break; + case 1: rCodeW(rCode) &= ~(uint16)(1 << b); break; + } + + cycles = 4; +} + +//===== SET #,r +void regSET() +{ + uint8 b = FETCH8 & 0xF; + + switch(size) + { + case 0: rCodeB(rCode) |= (1 << b); break; + case 1: rCodeW(rCode) |= (1 << b); break; + } + + cycles = 4; +} + +//===== CHG #,r +void regCHG() +{ + uint8 b = FETCH8 & 0xF; + + switch(size) + { + case 0: rCodeB(rCode) ^= (1 << b); break; + case 1: rCodeW(rCode) ^= (1 << b); break; + } + + cycles = 4; +} + +//===== BIT #,r +void regBIT() +{ + uint8 b = FETCH8 & 0xF; + + switch(size) + { + case 0: SETFLAG_Z(! (rCodeB(rCode) & (1 << b)) ); break; + case 1: SETFLAG_Z(! (rCodeW(rCode) & (1 << b)) ); break; + } + + SETFLAG_H1; + SETFLAG_N0; + cycles = 4; +} + +//===== TSET #,r +void regTSET() +{ + uint8 b = FETCH8 & 0xF; + + switch(size) + { + case 0: SETFLAG_Z(! (rCodeB(rCode) & (1 << b)) ); + rCodeB(rCode) |= (1 << b); + break; + + case 1: SETFLAG_Z(! (rCodeW(rCode) & (1 << b)) ); + rCodeW(rCode) |= (1 << b); + break; + } + + SETFLAG_H1 + SETFLAG_N0 + cycles = 6; +} + +//===== MINC1 #,r +void regMINC1() +{ + uint16 num = fetch16() + 1; + + if (size == 1) + { + if ((rCodeW(rCode) % num) == (num - 1)) + rCodeW(rCode) -= (num - 1); + else + rCodeW(rCode) += 1; + } + + cycles = 8; +} + +//===== MINC2 #,r +void regMINC2() +{ + uint16 num = fetch16() + 2; + + if (size == 1) + { + if ((rCodeW(rCode) % num) == (num - 2)) + rCodeW(rCode) -= (num - 2); + else + rCodeW(rCode) += 2; + } + + cycles = 8; +} + +//===== MINC4 #,r +void regMINC4() +{ + uint16 num = fetch16() + 4; + + if (size == 1) + { + if ((rCodeW(rCode) % num) == (num - 4)) + rCodeW(rCode) -= (num - 4); + else + rCodeW(rCode) += 4; + } + + cycles = 8; +} + +//===== MDEC1 #,r +void regMDEC1() +{ + uint16 num = fetch16() + 1; + + if (size == 1) + { + if ((rCodeW(rCode) % num) == 0) + rCodeW(rCode) += (num - 1); + else + rCodeW(rCode) -= 1; + } + + cycles = 7; +} + +//===== MDEC2 #,r +void regMDEC2() +{ + uint16 num = fetch16() + 2; + + if (size == 1) + { + if ((rCodeW(rCode) % num) == 0) + rCodeW(rCode) += (num - 2); + else + rCodeW(rCode) -= 2; + } + + cycles = 7; +} + +//===== MDEC4 #,r +void regMDEC4() +{ + uint16 num = fetch16() + 4; + + if (size == 1) + { + if ((rCodeW(rCode) % num) == 0) + rCodeW(rCode) += (num - 4); + else + rCodeW(rCode) -= 4; + } + + cycles = 7; +} + +//===== MUL RR,r +void regMUL() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("reg: MUL bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: rCodeW(target) = (rCodeW(target) & 0xFF) * rCodeB(rCode); + cycles = 18; break; + case 1: rCodeL(target) = (rCodeL(target) & 0xFFFF) * rCodeW(rCode); + cycles = 26; break; + } +} + +//===== MULS RR,r +void regMULS() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("reg: MUL bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: rCodeW(target) = (int8)(rCodeW(target) & 0xFF) * (int8)rCodeB(rCode); + cycles = 18; break; + case 1: rCodeL(target) = (int16)(rCodeL(target) & 0xFFFF) * (int16)rCodeW(rCode); + cycles = 26; break; + } +} + +//===== DIV RR,r +void regDIV() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("reg: DIV bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: { rCodeW(target) = generic_DIV_B(rCodeW(target), rCodeB(rCode)); + cycles = 22; + break; } + + case 1: { rCodeL(target) = generic_DIV_W(rCodeL(target), rCodeW(rCode)); + cycles = 30; + break; } + } +} + +//===== DIVS RR,r +void regDIVS() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("reg: DIVS bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: { rCodeW(target) = generic_DIVS_B(rCodeW(target), rCodeB(rCode)); + cycles = 24; + break; } + + case 1: { rCodeL(target) = generic_DIVS_W(rCodeL(target), rCodeW(rCode)); + cycles = 32; + break; } + } +} + +//===== INC #3,r +void regINC() +{ + uint8 val = R; + if (val == 0) + val = 8; + + switch(size) + { + case 0: { uint8 dst = rCodeB(rCode); + uint8 half = (dst & 0xF) + val; + uint32 resultC = dst + val; + uint8 result = (uint8)(resultC & 0xFF); + SETFLAG_S(result & 0x80); + + if (((int8)dst >= 0) && ((int8)result < 0)) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_H(half > 0xF); + SETFLAG_Z(result == 0); + SETFLAG_N0; + rCodeB(rCode) = result; + break; } + + case 1: { rCodeW(rCode) += val; break; } + + case 2: { rCodeL(rCode) += val; break; } + } + + cycles = 4; +} + +//===== DEC #3,r +void regDEC() +{ + uint8 val = R; + if (val == 0) + val = 8; + + switch(size) + { + case 0: { uint8 dst = rCodeB(rCode); + uint8 half = (dst & 0xF) - val; + uint32 resultC = dst - val; + uint8 result = (uint8)(resultC & 0xFF); + SETFLAG_S(result & 0x80); + + if (((int8)dst < 0) && ((int8)result >= 0)) + {SETFLAG_V1} else {SETFLAG_V0} + + SETFLAG_H(half > 0xF); + SETFLAG_Z(result == 0); + SETFLAG_N1; + rCodeB(rCode) = result; + cycles = 4; + break; } + + case 1: { rCodeW(rCode) -= val; cycles = 4; break; } + + case 2: { rCodeL(rCode) -= val; cycles = 5; break; } + } +} + +//===== SCC cc,r +void regSCC() +{ + uint32 result; + + if (conditionCode(second & 0xF)) + result = 1; + else + result = 0; + + switch(size) + { + case 0: rCodeB(rCode) = (uint8)result; break; + case 1: rCodeW(rCode) = (uint16)result; break; + } + + cycles = 6; +} + +//===== LD R,r +void regLDRr() +{ + switch(size) + { + case 0: regB(R) = rCodeB(rCode); break; + case 1: regW(R) = rCodeW(rCode); break; + case 2: regL(R) = rCodeL(rCode); break; + } + + cycles = 4; +} + +//===== LD r,R +void regLDrR() +{ + switch(size) + { + case 0: rCodeB(rCode) = regB(R); break; + case 1: rCodeW(rCode) = regW(R); break; + case 2: rCodeL(rCode) = regL(R); break; + } + + cycles = 4; +} + +//===== ADD R,r +void regADD() +{ + switch(size) + { + case 0: regB(R) = generic_ADD_B(regB(R), rCodeB(rCode)); cycles = 4; break; + case 1: regW(R) = generic_ADD_W(regW(R), rCodeW(rCode)); cycles = 4; break; + case 2: regL(R) = generic_ADD_L(regL(R), rCodeL(rCode)); cycles = 7; break; + } +} + +//===== ADC R,r +void regADC() +{ + switch(size) + { + case 0: regB(R) = generic_ADC_B(regB(R), rCodeB(rCode)); cycles = 4; break; + case 1: regW(R) = generic_ADC_W(regW(R), rCodeW(rCode)); cycles = 4; break; + case 2: regL(R) = generic_ADC_L(regL(R), rCodeL(rCode)); cycles = 7; break; + } +} + +//===== SUB R,r +void regSUB() +{ + switch(size) + { + case 0: regB(R) = generic_SUB_B(regB(R), rCodeB(rCode)); cycles = 4; break; + case 1: regW(R) = generic_SUB_W(regW(R), rCodeW(rCode)); cycles = 4; break; + case 2: regL(R) = generic_SUB_L(regL(R), rCodeL(rCode)); cycles = 7; break; + } +} + +//===== SBC R,r +void regSBC() +{ + switch(size) + { + case 0: regB(R) = generic_SBC_B(regB(R), rCodeB(rCode)); cycles = 4; break; + case 1: regW(R) = generic_SBC_W(regW(R), rCodeW(rCode)); cycles = 4; break; + case 2: regL(R) = generic_SBC_L(regL(R), rCodeL(rCode)); cycles = 7; break; + } +} + +//===== LD r,#3 +void regLDr3() +{ + switch(size) + { + case 0: rCodeB(rCode) = R; break; + case 1: rCodeW(rCode) = R; break; + case 2: rCodeL(rCode) = R; break; + } + + cycles = 4; +} + +//===== EX R,r +void regEX() +{ + switch(size) + { + case 0: { uint8 temp = regB(R); regB(R) = rCodeB(rCode); rCodeB(rCode) = temp; break;} + case 1: { uint16 temp = regW(R); regW(R) = rCodeW(rCode); rCodeW(rCode) = temp; break;} + case 2: { uint32 temp = regL(R); regL(R) = rCodeL(rCode); rCodeL(rCode) = temp; break;} + } + + cycles = 5; +} + +//===== ADD r,# +void regADDi() +{ + switch(size) + { + case 0: rCodeB(rCode) = generic_ADD_B(rCodeB(rCode), FETCH8); cycles = 4;break; + case 1: rCodeW(rCode) = generic_ADD_W(rCodeW(rCode), fetch16()); cycles = 4;break; + case 2: rCodeL(rCode) = generic_ADD_L(rCodeL(rCode), fetch32()); cycles = 7;break; + } +} + +//===== ADC r,# +void regADCi() +{ + switch(size) + { + case 0: rCodeB(rCode) = generic_ADC_B(rCodeB(rCode), FETCH8); cycles = 4;break; + case 1: rCodeW(rCode) = generic_ADC_W(rCodeW(rCode), fetch16()); cycles = 4;break; + case 2: rCodeL(rCode) = generic_ADC_L(rCodeL(rCode), fetch32()); cycles = 7;break; + } +} + +//===== SUB r,# +void regSUBi() +{ + switch(size) + { + case 0: rCodeB(rCode) = generic_SUB_B(rCodeB(rCode), FETCH8); cycles = 4;break; + case 1: rCodeW(rCode) = generic_SUB_W(rCodeW(rCode), fetch16()); cycles = 4;break; + case 2: rCodeL(rCode) = generic_SUB_L(rCodeL(rCode), fetch32()); cycles = 7;break; + } +} + +//===== SBC r,# +void regSBCi() +{ + switch(size) + { + case 0: rCodeB(rCode) = generic_SBC_B(rCodeB(rCode), FETCH8); cycles = 4;break; + case 1: rCodeW(rCode) = generic_SBC_W(rCodeW(rCode), fetch16()); cycles = 4;break; + case 2: rCodeL(rCode) = generic_SBC_L(rCodeL(rCode), fetch32()); cycles = 7;break; + } +} + +//===== CP r,# +void regCPi() +{ + switch(size) + { + case 0: generic_SUB_B(rCodeB(rCode), FETCH8); cycles = 4;break; + case 1: generic_SUB_W(rCodeW(rCode), fetch16());cycles = 4; break; + case 2: generic_SUB_L(rCodeL(rCode), fetch32());cycles = 7; break; + } +} + +//===== AND r,# +void regANDi() +{ + switch(size) + { + case 0: { uint8 result = rCodeB(rCode) & FETCH8; + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = rCodeW(rCode) & fetch16(); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = rCodeL(rCode) & fetch32(); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 7; + break; } + } + + SETFLAG_H1; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== OR r,# +void regORi() +{ + switch(size) + { + case 0: { uint8 result = rCodeB(rCode) | FETCH8; + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + rCodeB(rCode) = result; + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = rCodeW(rCode) | fetch16(); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + rCodeW(rCode) = result; + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = rCodeL(rCode) | fetch32(); + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + rCodeL(rCode) = result; + cycles = 7; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== XOR r,# +void regXORi() +{ + switch(size) + { + case 0: { uint8 result = rCodeB(rCode) ^ FETCH8; + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + rCodeB(rCode) = result; + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = rCodeW(rCode) ^ fetch16(); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + rCodeW(rCode) = result; + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = rCodeL(rCode) ^ fetch32(); + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + rCodeL(rCode) = result; + cycles = 7; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== AND R,r +void regAND() +{ + switch(size) + { + case 0: { uint8 result = regB(R) & rCodeB(rCode); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + regB(R) = result; + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = regW(R) & rCodeW(rCode); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + regW(R) = result; + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = regL(R) & rCodeL(rCode); + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + regL(R) = result; + cycles = 7; + break; } + } + + SETFLAG_H1; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== OR R,r +void regOR() +{ + switch(size) + { + case 0: { uint8 result = regB(R) | rCodeB(rCode); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + regB(R) = result; + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = regW(R) | rCodeW(rCode); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + regW(R) = result; + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = regL(R) | rCodeL(rCode); + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + regL(R) = result; + cycles = 7; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== XOR R,r +void regXOR() +{ + switch(size) + { + case 0: { uint8 result = regB(R) ^ rCodeB(rCode); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + regB(R) = result; + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = regW(R) ^ rCodeW(rCode); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + regW(R) = result; + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = regL(R) ^ rCodeL(rCode); + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + regL(R) = result; + cycles = 7; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== CP r,#3 +void regCPr3() +{ + switch(size) + { + case 0: generic_SUB_B(rCodeB(rCode), R); break; + case 1: generic_SUB_W(rCodeW(rCode), R); break; + } + + cycles = 4; +} + +//===== CP R,r +void regCP() +{ + switch(size) + { + case 0: generic_SUB_B(regB(R), rCodeB(rCode));cycles = 4; break; + case 1: generic_SUB_W(regW(R), rCodeW(rCode));cycles = 4; break; + case 2: generic_SUB_L(regL(R), rCodeL(rCode));cycles = 7; break; + } +} + +//===== RLC #,r +void regRLCi() +{ + int i; + uint8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeB(rCode) & 0x80); + rCodeB(rCode) <<= 1; + if (FLAG_C) rCodeB(rCode) |= 1; + } + SETFLAG_S(rCodeB(rCode) & 0x80); + SETFLAG_Z(rCodeB(rCode) == 0); + parityB(rCodeB(rCode)); + cycles = 6 + (2*sa); + break; + + case 1: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeW(rCode) & 0x8000); + rCodeW(rCode) <<= 1; + if (FLAG_C) rCodeW(rCode) |= 1; + } + SETFLAG_S(rCodeW(rCode) & 0x8000); + SETFLAG_Z(rCodeW(rCode) == 0); + parityW(rCodeW(rCode)); + cycles = 6 + (2*sa); + break; + + case 2: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeL(rCode) & 0x80000000); + rCodeL(rCode) <<= 1; + if (FLAG_C) rCodeL(rCode) |= 1; + } + SETFLAG_S(rCodeL(rCode) & 0x80000000); + SETFLAG_Z(rCodeL(rCode) == 0); + cycles = 8 + (2*sa); + break; + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RRC #,r +void regRRCi() +{ + int i; + uint8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeB(rCode) & 1); + rCodeB(rCode) >>= 1; + if (FLAG_C) rCodeB(rCode) |= 0x80; + } + SETFLAG_S(rCodeB(rCode) & 0x80); + SETFLAG_Z(rCodeB(rCode) == 0); + parityB(rCodeB(rCode)); + cycles = 6 + (2*sa); + break; + + case 1: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeW(rCode) & 1); + rCodeW(rCode) >>= 1; + if (FLAG_C) rCodeW(rCode) |= 0x8000; + } + SETFLAG_S(rCodeW(rCode) & 0x8000); + SETFLAG_Z(rCodeW(rCode) == 0); + parityW(rCodeW(rCode)); + cycles = 6 + (2*sa); + break; + + case 2: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeL(rCode) & 1); + rCodeL(rCode) >>= 1; + if (FLAG_C) rCodeL(rCode) |= 0x80000000; + } + SETFLAG_S(rCodeL(rCode) & 0x80000000); + SETFLAG_Z(rCodeL(rCode) == 0); + cycles = 8 + (2*sa); + break; + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RL #,r +void regRLi() +{ + int i; + bool tempC; + uint8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: { uint8 result; + for (i = 0; i < sa; i++) + { + result = rCodeB(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x80); + result <<= 1; + if (tempC) result |= 1; + rCodeB(rCode) = result; + } + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + (2*sa); + break; } + + case 1: { uint16 result; + for (i = 0; i < sa; i++) + { + result = rCodeW(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x8000); + result <<= 1; + if (tempC) result |= 1; + rCodeW(rCode) = result; + } + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + (2*sa); + break; } + + case 2: { uint32 result; + for (i = 0; i < sa; i++) + { + result = rCodeL(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x80000000); + result <<= 1; + if (tempC) result |= 1; + rCodeL(rCode) = result; + } + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + cycles = 8 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RR #,r +void regRRi() +{ + int i; + bool tempC; + uint8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: { uint8 result; + for (i = 0; i < sa; i++) + { + result = rCodeB(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x01); + result >>= 1; + if (tempC) result |= 0x80; + rCodeB(rCode) = result; + } + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + cycles = 6 + (2*sa); + parityB(result); + break; } + + case 1: { uint16 result; + for (i = 0; i < sa; i++) + { + result = rCodeW(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x01); + result >>= 1; + if (tempC) result |= 0x8000; + rCodeW(rCode) = result; + } + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + cycles = 6 + (2*sa); + parityW(result); + break; } + + case 2: { uint32 result; + for (i = 0; i < sa; i++) + { + result = rCodeL(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x01); + result >>= 1; + if (tempC) result |= 0x80000000; + rCodeL(rCode) = result; + } + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + cycles = 8 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SLA #,r +void regSLAi() +{ + int8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { int8 result, data = (int8)rCodeB(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80); + result <<= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { int16 result, data = (int16)rCodeW(rCode); + result = (data << sa); + SETFLAG_C(result & 0x8000); + result <<= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { int32 result, data = (int32)rCodeL(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80000000); + result <<= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SRA #,r +void regSRAi() +{ + int8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { int8 data = (int8)rCodeB(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { int16 data = (int16)rCodeW(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { int32 data = (int32)rCodeL(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SLL #,r +void regSLLi() +{ + uint8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { uint8 result, data = rCodeB(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80); + result <<= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { uint16 result, data = rCodeW(rCode); + result = (data << sa); + SETFLAG_C(result & 0x8000); + result <<= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { uint32 result, data = rCodeL(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80000000); + result <<= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SRL #,r +void regSRLi() +{ + uint8 sa = FETCH8 & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { uint8 data = rCodeB(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { uint16 data = rCodeW(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { uint32 data = rCodeL(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RLC A,r +void regRLCA() +{ + int i; + uint8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeB(rCode) & 0x80); + rCodeB(rCode) <<= 1; + if (FLAG_C) rCodeB(rCode) |= 1; + } + SETFLAG_S(rCodeB(rCode) & 0x80); + SETFLAG_Z(rCodeB(rCode) == 0); + cycles = 6 + (2*sa); + parityB(rCodeB(rCode)); + break; + + case 1: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeW(rCode) & 0x8000); + rCodeW(rCode) <<= 1; + if (FLAG_C) rCodeW(rCode) |= 1; + } + SETFLAG_S(rCodeW(rCode) & 0x8000); + SETFLAG_Z(rCodeW(rCode) == 0); + cycles = 6 + (2*sa); + parityW(rCodeW(rCode)); + break; + + case 2: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeL(rCode) & 0x80000000); + rCodeL(rCode) <<= 1; + if (FLAG_C) rCodeL(rCode) |= 1; + } + SETFLAG_S(rCodeL(rCode) & 0x80000000); + SETFLAG_Z(rCodeL(rCode) == 0); + cycles = 8 + (2*sa); + break; + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RRC A,r +void regRRCA() +{ + int i; + uint8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeB(rCode) & 1); + rCodeB(rCode) >>= 1; + if (FLAG_C) rCodeB(rCode) |= 0x80; + } + SETFLAG_S(rCodeB(rCode) & 0x80); + SETFLAG_Z(rCodeB(rCode) == 0); + parityB(rCodeB(rCode)); + cycles = 6 + (2*sa); + break; + + case 1: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeW(rCode) & 1); + rCodeW(rCode) >>= 1; + if (FLAG_C) rCodeW(rCode) |= 0x8000; + } + SETFLAG_S(rCodeW(rCode) & 0x8000); + SETFLAG_Z(rCodeW(rCode) == 0); + parityW(rCodeW(rCode)); + cycles = 6 + (2*sa); + break; + + case 2: for (i = 0; i < sa; i++) + { + SETFLAG_C(rCodeL(rCode) & 1); + rCodeL(rCode) >>= 1; + if (FLAG_C) rCodeL(rCode) |= 0x80000000; + } + SETFLAG_S(rCodeL(rCode) & 0x80000000); + SETFLAG_Z(rCodeL(rCode) == 0); + cycles = 8 + (2*sa); + break; + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RL A,r +void regRLA() +{ + int i; + bool tempC; + uint8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: { uint8 result; + for (i = 0; i < sa; i++) + { + result = rCodeB(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x80); + result <<= 1; + if (tempC) result |= 1; + rCodeB(rCode) = result; + } + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + cycles = 6 + (2*sa); + parityB(result); + break; } + + case 1: { uint16 result; + for (i = 0; i < sa; i++) + { + result = rCodeW(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x8000); + result <<= 1; + if (tempC) result |= 1; + rCodeW(rCode) = result; + } + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + cycles = 6 + (2*sa); + parityW(result); + break; } + + case 2: { uint32 result; + for (i = 0; i < sa; i++) + { + result = rCodeL(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x80000000); + result <<= 1; + if (tempC) result |= 1; + rCodeL(rCode) = result; + } + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + cycles = 8 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== RR A,r +void regRRA() +{ + int i; + bool tempC; + uint8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + + switch(size) + { + case 0: { uint8 result; + for (i = 0; i < sa; i++) + { + result = rCodeB(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x01); + result >>= 1; + if (tempC) result |= 0x80; + rCodeB(rCode) = result; + } + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + cycles = 6 + (2*sa); + parityB(result); + break; } + + case 1: { uint16 result; + for (i = 0; i < sa; i++) + { + result = rCodeW(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x01); + result >>= 1; + if (tempC) result |= 0x8000; + rCodeW(rCode) = result; + } + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + cycles = 6 + (2*sa); + parityW(result); + break; } + + case 2: { uint32 result; + for (i = 0; i < sa; i++) + { + result = rCodeL(rCode); + tempC = FLAG_C; + SETFLAG_C(result & 0x01); + result >>= 1; + if (tempC) result |= 0x80000000; + rCodeL(rCode) = result; + } + SETFLAG_S(result & 0x80000000); + SETFLAG_Z(result == 0); + cycles = 8 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SLA A,r +void regSLAA() +{ + int8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { int8 result, data = (int8)rCodeB(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80); + result <<= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { int16 result, data = (int16)rCodeW(rCode); + result = (data << sa); + SETFLAG_C(result & 0x8000); + result <<= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { int32 result, data = (int32)rCodeL(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80000000); + result <<= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SRA A,r +void regSRAA() +{ + int8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { int8 data = (int8)rCodeB(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { int16 data = (int16)rCodeW(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { int32 data = (int32)rCodeL(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SLL A,r +void regSLLA() +{ + uint8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { uint8 result, data = rCodeB(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80); + result <<= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { uint16 result, data = rCodeW(rCode); + result = (data << sa); + SETFLAG_C(result & 0x8000); + result <<= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { uint32 result, data = rCodeL(rCode); + result = (data << sa); + SETFLAG_C(result & 0x80000000); + result <<= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== SRL A,r +void regSRLA() +{ + uint8 sa = REGA & 0xF; + if (sa == 0) sa = 16; + sa--; + + switch(size) + { + case 0: { uint8 data = rCodeB(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80); + rCodeB(rCode) = result; + SETFLAG_Z(result == 0); + parityB(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 1: { uint16 data = rCodeW(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x8000); + rCodeW(rCode) = result; + SETFLAG_Z(result == 0); + parityW(result); + cycles = 6 + 2 + (2*sa); + break; } + + case 2: { uint32 data = rCodeL(rCode), result; + result = (data >> sa); + SETFLAG_C(result & 1); + result >>= 1; + SETFLAG_S(result & 0x80000000); + rCodeL(rCode) = result; + SETFLAG_Z(result == 0); + cycles = 8 + 2 + (2*sa); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; +} + +}; + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_reg.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_reg.h new file mode 100644 index 0000000000..1895c8dc62 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_reg.h @@ -0,0 +1,305 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_reg.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_REG__ +#define __TLCS900H_REG__ +//========================================================================= + +namespace TLCS900H +{ + +//===== LD r,# +void regLDi(void); + +//===== PUSH r +void regPUSH(void); + +//===== POP r +void regPOP(void); + +//===== CPL r +void regCPL(void); + +//===== NEG r +void regNEG(void); + +//===== MUL rr,# +void regMULi(void); + +//===== MULS rr,# +void regMULSi(void); + +//===== DIV rr,# +void regDIVi(void); + +//===== DIVS rr,# +void regDIVSi(void); + +//===== LINK r,dd +void regLINK(void); + +//===== UNLK r +void regUNLK(void); + +//===== BS1F A,r +void regBS1F(void); + +//===== BS1B A,r +void regBS1B(void); + +//===== DAA r +void regDAA(void); + +//===== EXTZ r +void regEXTZ(void); + +//===== EXTS r +void regEXTS(void); + +//===== PAA r +void regPAA(void); + +//===== MIRR r +void regMIRR(void); + +//===== MULA r +void regMULA(void); + +//===== DJNZ r,d +void regDJNZ(void); + +//===== ANDCF #,r +void regANDCFi(void); + +//===== ORCF #,r +void regORCFi(void); + +//===== XORCF #,r +void regXORCFi(void); + +//===== LDCF #,r +void regLDCFi(void); + +//===== STCF #,r +void regSTCFi(void); + +//===== ANDCF A,r +void regANDCFA(void); + +//===== ORCF A,r +void regORCFA(void); + +//===== XORCF A,r +void regXORCFA(void); + +//===== LDCF A,r +void regLDCFA(void); + +//===== STCF A,r +void regSTCFA(void); + +//===== LDC cr,r +void regLDCcrr(void); + +//===== LDC r,cr +void regLDCrcr(void); + +//===== RES #,r +void regRES(void); + +//===== SET #,r +void regSET(void); + +//===== CHG #,r +void regCHG(void); + +//===== BIT #,r +void regBIT(void); + +//===== TSET #,r +void regTSET(void); + +//===== MINC1 #,r +void regMINC1(void); + +//===== MINC2 #,r +void regMINC2(void); + +//===== MINC4 #,r +void regMINC4(void); + +//===== MDEC1 #,r +void regMDEC1(void); + +//===== MDEC2 #,r +void regMDEC2(void); + +//===== MDEC4 #,r +void regMDEC4(void); + +//===== MUL RR,r +void regMUL(void); + +//===== MULS RR,r +void regMULS(void); + +//===== DIV RR,r +void regDIV(void); + +//===== DIVS RR,r +void regDIVS(void); + +//===== INC #3,r +void regINC(void); + +//===== DEC #3,r +void regDEC(void); + +//===== SCC cc,r +void regSCC(void); + +//===== LD R,r +void regLDRr(void); + +//===== LD r,R +void regLDrR(void); + +//===== ADD R,r +void regADD(void); + +//===== ADC R,r +void regADC(void); + +//===== SUB R,r +void regSUB(void); + +//===== SBC R,r +void regSBC(void); + +//===== LD r,#3 +void regLDr3(void); + +//===== EX R,r +void regEX(void); + +//===== ADD r,# +void regADDi(void); + +//===== ADC r,# +void regADCi(void); + +//===== SUB r,# +void regSUBi(void); + +//===== SBC r,# +void regSBCi(void); + +//===== CP r,# +void regCPi(void); + +//===== AND r,# +void regANDi(void); + +//===== OR r,# +void regORi(void); + +//===== XOR r,# +void regXORi(void); + +//===== AND R,r +void regAND(void); + +//===== OR R,r +void regOR(void); + +//===== XOR R,r +void regXOR(void); + +//===== CP r,#3 +void regCPr3(void); + +//===== CP R,r +void regCP(void); + +//===== RLC #,r +void regRLCi(void); + +//===== RRC #,r +void regRRCi(void); + +//===== RL #,r +void regRLi(void); + +//===== RR #,r +void regRRi(void); + +//===== SLA #,r +void regSLAi(void); + +//===== SRA #,r +void regSRAi(void); + +//===== SLL #,r +void regSLLi(void); + +//===== SRL #,r +void regSRLi(void); + +//===== RLC A,r +void regRLCA(void); + +//===== RRC A,r +void regRRCA(void); + +//===== RL A,r +void regRLA(void); + +//===== RR A,r +void regRRA(void); + +//===== SLA A,r +void regSLAA(void); + +//===== SRA A,r +void regSRAA(void); + +//===== SLL A,r +void regSLLA(void); + +//===== SRL A,r +void regSRLA(void); + +}; + +//========================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_single.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_single.cpp new file mode 100644 index 0000000000..96422b249f --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_single.cpp @@ -0,0 +1,428 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_single.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +22 JUL 2002 - neopop_uk +======================================= +- Removed setting the register file pointer to 3 in the SWI instruction + This has fixed "Metal Slug 2" and flash saving in many games. + +26 JUL 2002 - neopop_uk +======================================= +- Prefixed all instruction functions with "sng" to avoid a repeat of the + the 'EX' fiasco. + +30 JUL 2002 - neopop_uk +======================================= +- Um... SWI doesn't cause a problem if IFF is set to 3... why did +"Metal Slug 2" start working??? + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "TLCS900h_interpret.h" +#include "TLCS900h_registers.h" +#include "../mem.h" +#include "../interrupt.h" + +namespace TLCS900H +{ + +//========================================================================= + +//===== NOP +void sngNOP() +{ + cycles = 2; +} + +//===== NORMAL +void sngNORMAL() +{ + //Not supported + cycles = 4; +} + +//===== PUSH SR +void sngPUSHSR() +{ + push16(sr); + cycles = 4; +} + +//===== POP SR +void sngPOPSR() +{ + sr = pop16(); changedSP(); + cycles = 6; +} + +//===== MAX +void sngMAX() +{ + //Not supported + cycles = 4; +} + +//===== HALT +void sngHALT() +{ + MDFN_printf("CPU halt requested and ignored.\nPlease send me a saved state."); + cycles = 8; +} + +//===== EI #3 +void sngEI() +{ + setStatusIFF(FETCH8); + int_check_pending(); + cycles = 5; +} + +//===== RETI +void sngRETI() +{ + uint16 temp = pop16(); + pc = pop32(); + sr = temp; changedSP(); + cycles = 12; +} + +//===== LD (n), n +void sngLD8_8() +{ + uint8 dst = FETCH8; + uint8 src = FETCH8; + storeB(dst, src); + cycles = 5; +} + +//===== PUSH n +void sngPUSH8() +{ + uint8 data = FETCH8; + push8(data); + cycles = 4; +} + +//===== LD (n), nn +void sngLD8_16() +{ + uint8 dst = FETCH8; + uint16 src = fetch16(); + storeW(dst, src); + cycles = 6; +} + +//===== PUSH nn +void sngPUSH16() +{ + push16(fetch16()); + cycles = 5; +} + +//===== INCF +void sngINCF() +{ + setStatusRFP(((sr & 0x300) >> 8) + 1); + cycles = 2; +} + +//===== DECF +void sngDECF() +{ + setStatusRFP(((sr & 0x300) >> 8) - 1); + cycles = 2; +} + +//===== RET condition +void sngRET() +{ + pc = pop32(); + cycles = 9; +} + +//===== RETD dd +void sngRETD() +{ + int16 d = (int16)fetch16(); + pc = pop32(); + REGXSP += d; + cycles = 9; +} + +//===== RCF +void sngRCF() +{ + SETFLAG_N0; + SETFLAG_V0; + SETFLAG_C0; + cycles = 2; +} + +//===== SCF +void sngSCF() +{ + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C1; + cycles = 2; +} + +//===== CCF +void sngCCF() +{ + SETFLAG_N0; + SETFLAG_C(!FLAG_C); + cycles = 2; +} + +//===== ZCF +void sngZCF() +{ + SETFLAG_N0; + SETFLAG_C(!FLAG_Z); + cycles = 2; +} + +//===== PUSH A +void sngPUSHA() +{ + push8(REGA); + cycles = 3; +} + +//===== POP A +void sngPOPA() +{ + REGA = pop8(); + cycles = 4; +} + +//===== EX F,F' +void sngEX() +{ + uint8 f = sr & 0xFF; + sr = (sr & 0xFF00) | f_dash; + f_dash = f; + cycles = 2; +} + +//===== LDF #3 +void sngLDF() +{ + setStatusRFP(FETCH8); + cycles = 2; +} + +//===== PUSH F +void sngPUSHF() +{ + push8(sr & 0xFF); + cycles = 3; +} + +//===== POP F +void sngPOPF() +{ + sr = (sr & 0xFF00) | pop8(); + cycles = 4; +} + +//===== JP nn +void sngJP16() +{ + pc = fetch16(); + cycles = 7; +} + +//===== JP nnn +void sngJP24() +{ + pc = fetch24(); + cycles = 7; +} + +//===== CALL #16 +void sngCALL16() +{ + uint32 target = fetch16(); + push32(pc); + pc = target; + cycles = 12; +} + +//===== CALL #24 +void sngCALL24() +{ + uint32 target = fetch24(); + push32(pc); + pc = target; + cycles = 12; +} + +//===== CALR $+3+d16 +void sngCALR() +{ + int16 displacement = (int16)fetch16(); + uint32 target = pc + displacement; + push32(pc); + pc = target; + cycles = 12; +} + +//===== LD R, n +void sngLDB() +{ + regB(first & 7) = FETCH8; + cycles = 2; +} + +//===== PUSH RR +void sngPUSHW() +{ + push16(regW(first & 7)); + cycles = 3; +} + +//===== LD RR, nn +void sngLDW() +{ + regW(first & 7) = fetch16(); + cycles = 3; +} + +//===== PUSH XRR +void sngPUSHL() +{ + push32(regL(first & 7)); + cycles = 5; +} + +//===== LD XRR, nnnn +void sngLDL() +{ + regL(first & 7) = fetch32(); + cycles = 5; +} + +//===== POP RR +void sngPOPW() +{ + regW(first & 7) = pop16(); + cycles = 4; +} + +//===== POP XRR +void sngPOPL() +{ + regL(first & 7) = pop32(); + cycles = 6; +} + +//===== JR cc,PC + d +void sngJR() +{ + if (conditionCode(first & 0xF)) + { + int8 displacement = (int8)FETCH8; + + cycles = 8; + pc += displacement; + } + else + { + cycles = 4; + FETCH8; + } +} + +//===== JR cc,PC + dd +void sngJRL() +{ + if (conditionCode(first & 0xF)) + { + int16 displacement = (int16)fetch16(); + cycles = 8; + pc += displacement; + } + else + { + cycles = 4; + fetch16(); + } +} + +//===== LDX dst,src +void sngLDX() +{ + uint8 dst, src; + + FETCH8; //00 + dst = FETCH8; //#8 + FETCH8; //00 + src = FETCH8; //# + FETCH8; //00 + + storeB(dst, src); + cycles = 9; +} + +//===== SWI num +void sngSWI() +{ + cycles = 16; + + //printf("SWI: %02x\n", first & 0x7); + switch(first & 7) + { + //System Call + case 1: push32(pc); + pc = loadL(0xFFFE00 + ((rCodeB(0x31) & 0x1F) << 2)); + break; + + case 3: interrupt(0); //SWI 3 + break; + + case 4: interrupt(1); //SWI 4 + break; + + case 5: interrupt(2); //SWI 5 + break; + + case 6: interrupt(3); //SWI 6 + break; + + default: instruction_error("SWI %d is not valid.", first & 7); + break; + } +} +}; +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_single.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_single.h new file mode 100644 index 0000000000..f34d758493 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_single.h @@ -0,0 +1,170 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_single.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_SINGLE__ +#define __TLCS900H_SINGLE__ +//========================================================================= + +namespace TLCS900H +{ + +//===== NOP +void sngNOP(void); + +//===== NORMAL +void sngNORMAL(void); + +//===== PUSH SR +void sngPUSHSR(void); + +//===== POP SR +void sngPOPSR(void); + +//===== MAX +void sngMAX(void); + +//===== HALT +void sngHALT(void); + +//===== EI #3 +void sngEI(void); + +//===== RETI +void sngRETI(void); + +//===== LD (n), n +void sngLD8_8(void); + +//===== PUSH n +void sngPUSH8(void); + +//===== LD (n), nn +void sngLD8_16(void); + +//===== PUSH nn +void sngPUSH16(void); + +//===== INCF +void sngINCF(void); + +//===== DECF +void sngDECF(void); + +//===== RET condition +void sngRET(void); + +//===== RETD dd +void sngRETD(void); + +//===== RCF +void sngRCF(void); + +//===== SCF +void sngSCF(void); + +//===== CCF +void sngCCF(void); + +//===== ZCF +void sngZCF(void); + +//===== PUSH A +void sngPUSHA(void); + +//===== POP A +void sngPOPA(void); + +//===== EX F,F' +void sngEX(void); + +//===== LDF #3 +void sngLDF(void); + +//===== PUSH F +void sngPUSHF(void); + +//===== POP F +void sngPOPF(void); + +//===== JP nn +void sngJP16(void); + +//===== JP nnn +void sngJP24(void); + +//===== CALL #16 +void sngCALL16(void); + +//===== CALL #24 +void sngCALL24(void); + +//===== CALR $+3+d16 +void sngCALR(void); + +//===== LD R, n +void sngLDB(void); + +//===== PUSH RR +void sngPUSHW(void); + +//===== LD RR, nn +void sngLDW(void); + +//===== PUSH XRR +void sngPUSHL(void); + +//===== LD XRR, nnnn +void sngLDL(void); + +//===== POP RR +void sngPOPW(void); + +//===== POP XRR +void sngPOPL(void); + +//===== JR cc,PC + d +void sngJR(void); + +//===== JR cc,PC + dd +void sngJRL(void); + +//===== LDX dst,src +void sngLDX(void); + +//===== SWI num +void sngSWI(void); + +}; + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_src.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_src.cpp new file mode 100644 index 0000000000..9e16ea5590 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_src.cpp @@ -0,0 +1,1266 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_src.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +24 JUL 2002 - neopop_uk +======================================= +- Fixed S flag in "RRC (mem)" + +25 JUL 2002 - neopop_uk +======================================= +- Removed unneeded Long mode from EX. + +28 JUL 2002 - neopop_uk +======================================= +- Improved the LDIR/LDDR/CPIR/CPDR instructions so that they + finish with the correct register settings, even if there is + a memory error. +- Converted DIV/DIVS to use the generic function + +16 AUG 2002 - neopop_uk +======================================= +- Replaced 'second & 7' with 'R', clearer, faster - and for some reason + more accurate... oh well! +- Fixed V flag emulation of INC/DEC, fixes "Cotton" menus + +21 AUG 2002 - neopop_uk +======================================= +- Fixed "RR (mem)" - It was actually the [REG] version that hadn't been + changed to use memory accesses! + +30 AUG 2002 - neopop_uk +======================================= +- Fixed "DIV RR,(mem)" in long mode, wrong operand size. + +04 SEP 2002 - neopop_uk +======================================= +- Fixed GCC compatibility. + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "TLCS900h_interpret.h" +#include "TLCS900h_registers.h" +#include "../mem.h" + +namespace TLCS900H +{ + +//========================================================================= + +//===== PUSH (mem) +void srcPUSH() +{ + switch(size) + { + case 0: push8(loadB(mem)); break; + case 1: push16(loadW(mem)); break; + } + cycles = 7; +} + +//===== RLD A,(mem) +void srcRLD() +{ + uint8 al = REGA & 0xF, m, mh, ml; + + m = loadB(mem); + mh = (m & 0xF0) >> 4; + ml = (m & 0x0F) << 4; + + REGA = (REGA & 0xF0) | mh; + storeB(mem, ml | al); + + SETFLAG_S(REGA & 0x80); + SETFLAG_Z(REGA == 0); + SETFLAG_H0 + SETFLAG_N0 + parityB(REGA); + + cycles = 12; +} + +//===== RRD A,(mem) +void srcRRD() +{ + uint8 al = (REGA & 0xF) << 4, m, mh, ml; + + m = loadB(mem); + mh = (m & 0xF0) >> 4; + ml = m & 0x0F; + + REGA = (REGA & 0xF0) | ml; + storeB(mem, al | mh); + + SETFLAG_S(REGA & 0x80); + SETFLAG_Z(REGA == 0); + SETFLAG_H0 + SETFLAG_N0 + parityB(REGA); + + cycles = 12; +} + +//===== LDI +void srcLDI() +{ + uint8 dst = 2/*XDE*/, src = 3/*XHL*/; + if ((first & 0xF) == 5) { dst = 4/*XIX*/; src = 5/*XIY*/; } + + switch(size) + { + case 0: + storeB(regL(dst), loadB(regL(src))); + regL(dst) += 1; + regL(src) += 1; + break; + + case 1: + storeW(regL(dst), loadW(regL(src))); + regL(dst) += 2; + regL(src) += 2; + break; + } + + REGBC --; + SETFLAG_V(REGBC); + + SETFLAG_H0; + SETFLAG_N0; + cycles = 10; +} + +//===== LDIR +void srcLDIR() +{ + uint8 dst = 2/*XDE*/, src = 3/*XHL*/; + if ((first & 0xF) == 5) { dst = 4/*XIX*/; src = 5/*XIY*/; } + + cycles = 10; + + do + { + switch(size) + { + case 0: if (debug_abort_memory == FALSE) + storeB(regL(dst), loadB(regL(src))); + regL(dst) += 1; + regL(src) += 1; + break; + + case 1: if (debug_abort_memory == FALSE) + storeW(regL(dst), loadW(regL(src))); + regL(dst) += 2; + regL(src) += 2; + break; + } + + REGBC --; + SETFLAG_V(REGBC); + + cycles += 14; + } + while (FLAG_V); + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== LDD +void srcLDD() +{ + uint8 dst = 2/*XDE*/, src = 3/*XHL*/; + if ((first & 0xF) == 5) { dst = 4/*XIX*/; src = 5/*XIY*/; } + + switch(size) + { + case 0: + storeB(regL(dst), loadB(regL(src))); + regL(dst) -= 1; + regL(src) -= 1; + break; + + case 1: + storeW(regL(dst), loadW(regL(src))); + regL(dst) -= 2; + regL(src) -= 2; + break; + } + + REGBC --; + SETFLAG_V(REGBC); + + SETFLAG_H0; + SETFLAG_N0; + cycles = 10; +} + +//===== LDDR +void srcLDDR() +{ + uint8 dst = 2/*XDE*/, src = 3/*XHL*/; + if ((first & 0xF) == 5) { dst = 4/*XIX*/; src = 5/*XIY*/; } + + cycles = 10; + + do + { + switch(size) + { + case 0: + if (debug_abort_memory == FALSE) + storeB(regL(dst), loadB(regL(src))); + regL(dst) -= 1; + regL(src) -= 1; + break; + + case 1: + if (debug_abort_memory == FALSE) + storeW(regL(dst), loadW(regL(src))); + regL(dst) -= 2; + regL(src) -= 2; + break; + } + + REGBC --; + SETFLAG_V(REGBC); + + cycles += 14; + } + while (FLAG_V); + + SETFLAG_H0; + SETFLAG_N0; +} + +//===== CPI +void srcCPI() +{ + uint8 R = first & 7; + + switch(size) + { + case 0: generic_SUB_B(REGA, loadB(regL(R))); + regL(R) ++; break; + + case 1: generic_SUB_W(REGWA, loadW(regL(R))); + regL(R) += 2; break; + } + + REGBC --; + SETFLAG_V(REGBC); + + cycles = 8; +} + +//===== CPIR +void srcCPIR() +{ + uint8 R = first & 7; + + cycles = 10; + + do + { + switch(size) + { + case 0: if (debug_abort_memory == FALSE) + generic_SUB_B(REGA, loadB(regL(R))); + regL(R) ++; break; + + case 1: if (debug_abort_memory == FALSE) + generic_SUB_W(REGWA, loadW(regL(R))); + regL(R) += 2; break; + } + + REGBC --; + SETFLAG_V(REGBC); + + cycles += 14; + } + while (FLAG_V && (FLAG_Z == FALSE)); +} + +//===== CPD +void srcCPD() +{ + uint8 R = first & 7; + + switch(size) + { + case 0: generic_SUB_B(REGA, loadB(regL(R))); + regL(R) --; break; + + case 1: generic_SUB_W(REGWA, loadW(regL(R))); + regL(R) -= 2; break; + } + + REGBC --; + SETFLAG_V(REGBC); + + cycles = 8; +} + +//===== CPDR +void srcCPDR() +{ + uint8 R = first & 7; + + cycles = 10; + + do + { + switch(size) + { + case 0: if (debug_abort_memory == FALSE) + generic_SUB_B(REGA, loadB(regL(R))); + regL(R) -= 1; break; + + case 1: if (debug_abort_memory == FALSE) + generic_SUB_W(REGWA, loadW(regL(R))); + regL(R) -= 2; break; + } + + REGBC --; + SETFLAG_V(REGBC); + + cycles += 14; + } + while (FLAG_V && (FLAG_Z == FALSE)); +} + +//===== LD (nn),(mem) +void srcLD16m() +{ + switch(size) + { + case 0: storeB(fetch16(), loadB(mem)); break; + case 1: storeW(fetch16(), loadW(mem)); break; + } + + cycles = 8; +} + +//===== LD R,(mem) +void srcLD() +{ + switch(size) + { + case 0: regB(R) = loadB(mem); cycles = 4; break; + case 1: regW(R) = loadW(mem); cycles = 4; break; + case 2: regL(R) = loadL(mem); cycles = 6; break; + } +} + +//===== EX (mem),R +void srcEX() +{ + switch(size) + { + case 0: { uint8 temp = regB(R); + regB(R) = loadB(mem); + storeB(mem, temp); break; } + + case 1: { uint16 temp = regW(R); + regW(R) = loadW(mem); + storeW(mem, temp); break; } + } + + cycles = 6; +} + +//===== ADD (mem),# +void srcADDi() +{ + switch(size) + { + case 0: storeB(mem, generic_ADD_B(loadB(mem), FETCH8)); cycles = 7;break; + case 1: storeW(mem, generic_ADD_W(loadW(mem), fetch16())); cycles = 8;break; + } +} + +//===== ADC (mem),# +void srcADCi() +{ + switch(size) + { + case 0: storeB(mem, generic_ADC_B(loadB(mem), FETCH8)); cycles = 7;break; + case 1: storeW(mem, generic_ADC_W(loadW(mem), fetch16())); cycles = 8;break; + } +} + +//===== SUB (mem),# +void srcSUBi() +{ + switch(size) + { + case 0: storeB(mem, generic_SUB_B(loadB(mem), FETCH8)); cycles = 7;break; + case 1: storeW(mem, generic_SUB_W(loadW(mem), fetch16())); cycles = 8;break; + } +} + +//===== SBC (mem),# +void srcSBCi() +{ + switch(size) + { + case 0: storeB(mem, generic_SBC_B(loadB(mem), FETCH8)); cycles = 7;break; + case 1: storeW(mem, generic_SBC_W(loadW(mem), fetch16())); cycles = 8;break; + } +} + +//===== AND (mem),# +void srcANDi() +{ + switch(size) + { + case 0: { uint8 result = loadB(mem) & FETCH8; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + cycles = 7; + break; } + + case 1: { uint16 result = loadW(mem) & fetch16(); + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + cycles = 8; + break; } + } + + SETFLAG_H1; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== OR (mem),# +void srcORi() +{ + switch(size) + { + case 0: { uint8 result = loadB(mem) | FETCH8; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + cycles = 7; + break; } + + case 1: { uint16 result = loadW(mem) | fetch16(); + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + cycles = 8; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== XOR (mem),# +void srcXORi() +{ + switch(size) + { + case 0: { uint8 result = loadB(mem) ^ FETCH8; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + cycles = 7; + break; } + + case 1: { uint16 result = loadW(mem) ^ fetch16(); + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + cycles = 8; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== CP (mem),# +void srcCPi() +{ + switch(size) + { + case 0: generic_SUB_B(loadB(mem), FETCH8); break; + case 1: generic_SUB_W(loadW(mem), fetch16()); break; + } + + cycles = 6; +} + +//===== MUL RR,(mem) +void srcMUL() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("src: MUL bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: rCodeW(target) = (rCodeW(target) & 0xFF) * loadB(mem); + cycles = 18; break; + case 1: rCodeL(target) = (rCodeL(target) & 0xFFFF) * loadW(mem); + cycles = 26; break; + } +} + +//===== MULS RR,(mem) +void srcMULS() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("src: MUL bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: rCodeW(target) = (int8)(rCodeW(target) & 0xFF) * (int8)loadB(mem); + cycles = 18; break; + case 1: rCodeL(target) = (int16)(rCodeL(target) & 0xFFFF) * (int16)loadW(mem); + cycles = 26; break; + } +} + +//===== DIV RR,(mem) +void srcDIV() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("src: DIV bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: { rCodeW(target) = generic_DIV_B(rCodeW(target), loadB(mem)); + cycles = 22; + break; } + + case 1: { rCodeL(target) = generic_DIV_W(rCodeL(target), loadW(mem)); + cycles = 30; + break; } + } +} + +//===== DIVS RR,(mem) +void srcDIVS() +{ + uint8 target = get_RR_Target(); + if (target == 0x80) + { + instruction_error("src: DIVS bad \'RR\' dst code"); + return; + } + + switch(size) + { + case 0: { rCodeW(target) = generic_DIVS_B(rCodeW(target), loadB(mem)); + cycles = 24; + break; } + + case 1: { rCodeL(target) = generic_DIVS_W(rCodeL(target), loadW(mem)); + cycles = 32; + break; } + } +} + +//===== INC #3,(mem) +void srcINC() +{ + uint8 val = R; + if (val == 0) + val = 8; + + switch(size) + { + case 0: { uint8 dst = loadB(mem); + uint32 resultC = dst + val; + uint8 half = (dst & 0xF) + val; + uint8 result = (uint8)(resultC & 0xFF); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + SETFLAG_S(result & 0x80); + SETFLAG_N0; + + if (((int8)dst >= 0) && ((int8)result < 0)) + {SETFLAG_V1} else {SETFLAG_V0} + + storeB(mem, result); + break; } + + case 1: { uint16 dst = loadW(mem); + uint32 resultC = dst + val; + uint8 half = (dst & 0xF) + val; + uint16 result = (uint16)(resultC & 0xFFFF); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + SETFLAG_S(result & 0x8000); + SETFLAG_N0; + + if (((int16)dst >= 0) && ((int16)result < 0)) + {SETFLAG_V1} else {SETFLAG_V0} + + storeW(mem, result); + break; } + } + + cycles = 6; +} + +//===== DEC #3,(mem) +void srcDEC() +{ + uint8 val = R; + if (val == 0) + val = 8; + + switch(size) + { + case 0: { uint8 dst = loadB(mem); + uint32 resultC = dst - val; + uint8 half = (dst & 0xF) - val; + uint8 result = (uint8)(resultC & 0xFF); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + SETFLAG_S(result & 0x80); + SETFLAG_N1; + + if (((int8)dst < 0) && ((int8)result >= 0)) + {SETFLAG_V1} else {SETFLAG_V0} + + storeB(mem, result); + break; } + + case 1: { uint16 dst = loadW(mem); + uint32 resultC = dst - val; + uint8 half = (dst & 0xF) - val; + uint16 result = (uint16)(resultC & 0xFFFF); + SETFLAG_Z(result == 0); + SETFLAG_H(half > 0xF); + SETFLAG_S(result & 0x8000); + SETFLAG_N1; + + if (((int16)dst < 0) && ((int16)result >= 0)) + {SETFLAG_V1} else {SETFLAG_V0} + + storeW(mem, result); + break; } + } + + cycles = 6; +} + +//===== RLC (mem) +void srcRLC() +{ + switch(size) + { + case 0: { uint8 result = loadB(mem); + SETFLAG_C(result & 0x80); + result <<= 1; + if (FLAG_C) result |= 1; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result = loadW(mem); + SETFLAG_C(result & 0x8000); + result <<= 1; + if (FLAG_C) result |= 1; + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + + cycles = 8; +} + +//===== RRC (mem) +void srcRRC() +{ + switch(size) + { + case 0: { uint8 data = loadB(mem), result; + SETFLAG_C(data & 1); + result = data >> 1; + if (FLAG_C) result |= 0x80; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 data = loadW(mem), result; + SETFLAG_C(data & 1); + result = data >> 1; + if (FLAG_C) result |= 0x8000; + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + + cycles = 8; +} + +//===== RL (mem) +void srcRL() +{ + bool tempC; + + switch(size) + { + case 0: { uint8 result = loadB(mem); + tempC = FLAG_C; + SETFLAG_C(result & 0x80); + result <<= 1; + if (tempC) result |= 1; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result = loadW(mem); + tempC = FLAG_C; + SETFLAG_C(result & 0x8000); + result <<= 1; + if (tempC) result |= 1; + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + cycles = 8; +} + +//===== RR (mem) +void srcRR() +{ + bool tempC; + + switch(size) + { + case 0: { uint8 result = loadB(mem); + tempC = FLAG_C; + SETFLAG_C(result & 1); + result >>= 1; + if (tempC) result |= 0x80; + storeB(mem, result); + SETFLAG_S(result & 0x80); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result = loadW(mem); + tempC = FLAG_C; + SETFLAG_C(result & 1); + result >>= 1; + if (tempC) result |= 0x8000; + storeW(mem, result); + SETFLAG_S(result & 0x8000); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + cycles = 8; +} + +//===== SLA (mem) +void srcSLA() +{ + switch(size) + { + case 0: { uint8 result, data = loadB(mem); + SETFLAG_C(data & 0x80); + result = ((int8)data << 1); + SETFLAG_S(result & 0x80); + storeB(mem, result); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result, data = loadW(mem); + SETFLAG_C(data & 0x8000); + result = ((int16)data << 1); + SETFLAG_S(result & 0x8000); + storeW(mem, result); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + + cycles = 8; +} + +//===== SRA (mem) +void srcSRA() +{ + switch(size) + { + case 0: { uint8 result, data = loadB(mem); + SETFLAG_C(data & 0x1); + result = ((int8)data >> 1); + SETFLAG_S(result & 0x80); + storeB(mem, result); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result, data = loadW(mem); + SETFLAG_C(data & 0x1); + result = ((int16)data >> 1); + SETFLAG_S(result & 0x8000); + storeW(mem, result); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + + cycles = 8; +} + +//===== SLL (mem) +void srcSLL() +{ + switch(size) + { + case 0: { uint8 result, data = loadB(mem); + SETFLAG_C(data & 0x80); + result = (data << 1); + SETFLAG_S(result & 0x80); + storeB(mem, result); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result, data = loadW(mem); + SETFLAG_C(data & 0x8000); + result = (data << 1); + SETFLAG_S(result & 0x8000); + storeW(mem, result); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + + cycles = 8; +} + +//===== SRL (mem) +void srcSRL() +{ + switch(size) + { + case 0: { uint8 result, data = loadB(mem); + SETFLAG_C(data & 0x01); + result = (data >> 1); + SETFLAG_S(result & 0x80); + storeB(mem, result); + SETFLAG_Z(result == 0); + parityB(result); + break; } + + case 1: { uint16 result, data = loadW(mem); + SETFLAG_C(data & 0x0001); + result = (data >> 1); + SETFLAG_S(result & 0x8000); + storeW(mem, result); + SETFLAG_Z(result == 0); + parityW(result); + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + + cycles = 8; +} + +//===== ADD R,(mem) +void srcADDRm() +{ + switch(size) + { + case 0: regB(R) = generic_ADD_B(regB(R), loadB(mem)); cycles = 4;break; + case 1: regW(R) = generic_ADD_W(regW(R), loadW(mem)); cycles = 4;break; + case 2: regL(R) = generic_ADD_L(regL(R), loadL(mem)); cycles = 6;break; + } +} + +//===== ADD (mem),R +void srcADDmR() +{ + switch(size) + { + case 0: storeB(mem, generic_ADD_B(loadB(mem), regB(R))); cycles = 6;break; + case 1: storeW(mem, generic_ADD_W(loadW(mem), regW(R))); cycles = 6;break; + case 2: storeL(mem, generic_ADD_L(loadL(mem), regL(R))); cycles = 10;break; + } +} + +//===== ADC R,(mem) +void srcADCRm() +{ + switch(size) + { + case 0: regB(R) = generic_ADC_B(regB(R), loadB(mem)); cycles = 4;break; + case 1: regW(R) = generic_ADC_W(regW(R), loadW(mem)); cycles = 4;break; + case 2: regL(R) = generic_ADC_L(regL(R), loadL(mem)); cycles = 6;break; + } +} + +//===== ADC (mem),R +void srcADCmR() +{ + switch(size) + { + case 0: storeB(mem, generic_ADC_B(loadB(mem), regB(R))); cycles = 6;break; + case 1: storeW(mem, generic_ADC_W(loadW(mem), regW(R))); cycles = 6;break; + case 2: storeL(mem, generic_ADC_L(loadL(mem), regL(R))); cycles = 10;break; + } +} + +//===== SUB R,(mem) +void srcSUBRm() +{ + switch(size) + { + case 0: regB(R) = generic_SUB_B(regB(R), loadB(mem)); cycles = 4;break; + case 1: regW(R) = generic_SUB_W(regW(R), loadW(mem)); cycles = 4;break; + case 2: regL(R) = generic_SUB_L(regL(R), loadL(mem)); cycles = 6;break; + } +} + +//===== SUB (mem),R +void srcSUBmR() +{ + switch(size) + { + case 0: storeB(mem, generic_SUB_B(loadB(mem), regB(R))); cycles = 6;break; + case 1: storeW(mem, generic_SUB_W(loadW(mem), regW(R))); cycles = 6;break; + case 2: storeL(mem, generic_SUB_L(loadL(mem), regL(R))); cycles = 10;break; + } +} + +//===== SBC R,(mem) +void srcSBCRm() +{ + switch(size) + { + case 0: regB(R) = generic_SBC_B(regB(R), loadB(mem)); cycles = 4;break; + case 1: regW(R) = generic_SBC_W(regW(R), loadW(mem)); cycles = 4;break; + case 2: regL(R) = generic_SBC_L(regL(R), loadL(mem)); cycles = 6;break; + } +} + +//===== SBC (mem),R +void srcSBCmR() +{ + switch(size) + { + case 0: storeB(mem, generic_SBC_B(loadB(mem), regB(R))); cycles = 6;break; + case 1: storeW(mem, generic_SBC_W(loadW(mem), regW(R))); cycles = 6;break; + case 2: storeL(mem, generic_SBC_L(loadL(mem), regL(R))); cycles = 10;break; + } +} + +//===== AND R,(mem) +void srcANDRm() +{ + switch(size) + { + case 0: { uint8 result = regB(R) & loadB(mem); + regB(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = regW(R) & loadW(mem); + regW(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = regL(R) & loadL(mem); + regL(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 6; + break; } + } + + SETFLAG_H1; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== AND (mem),R +void srcANDmR() +{ + switch(size) + { + case 0: { uint8 result = regB(R) & loadB(mem); + storeB(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 6; + break; } + + case 1: { uint16 result = regW(R) & loadW(mem); + storeW(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 6; + break; } + + case 2: { uint32 result = regL(R) & loadL(mem); + storeL(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 10; + break; } + } + + SETFLAG_H1; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== XOR R,(mem) +void srcXORRm() +{ + switch(size) + { + case 0: { uint8 result = regB(R) ^ loadB(mem); + regB(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = regW(R) ^ loadW(mem); + regW(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = regL(R) ^ loadL(mem); + regL(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 6; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== XOR (mem),R +void srcXORmR() +{ + switch(size) + { + case 0: { uint8 result = regB(R) ^ loadB(mem); + storeB(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 6; + break; } + + case 1: { uint16 result = regW(R) ^ loadW(mem); + storeW(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 6; + break; } + + case 2: { uint32 result = regL(R) ^ loadL(mem); + storeL(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 10; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== OR R,(mem) +void srcORRm() +{ + switch(size) + { + case 0: { uint8 result = regB(R) | loadB(mem); + regB(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 4; + break; } + + case 1: { uint16 result = regW(R) | loadW(mem); + regW(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 4; + break; } + + case 2: { uint32 result = regL(R) | loadL(mem); + regL(R) = result; + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 6; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== OR (mem),R +void srcORmR() +{ + switch(size) + { + case 0: { uint8 result = regB(R) | loadB(mem); + storeB(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80); + parityB(result); + cycles = 6; + break; } + + case 1: { uint16 result = regW(R) | loadW(mem); + storeW(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x8000); + parityW(result); + cycles = 6; + break; } + + case 2: { uint32 result = regL(R) | loadL(mem); + storeL(mem, result); + SETFLAG_Z(result == 0); + SETFLAG_S(result & 0x80000000); + cycles = 10; + break; } + } + + SETFLAG_H0; + SETFLAG_N0; + SETFLAG_C0; +} + +//===== CP R,(mem) +void srcCPRm() +{ + switch(size) + { + case 0: generic_SUB_B(regB(R), loadB(mem)); cycles = 4; break; + case 1: generic_SUB_W(regW(R), loadW(mem)); cycles = 4; break; + case 2: generic_SUB_L(regL(R), loadL(mem)); cycles = 6; break; + } +} + +//===== CP (mem),R +void srcCPmR() +{ + switch(size) + { + case 0: generic_SUB_B(loadB(mem), regB(R)); break; + case 1: generic_SUB_W(loadW(mem), regW(R)); break; + case 2: generic_SUB_L(loadL(mem), regL(R)); break; + } + + cycles = 6; +} +}; +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_src.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_src.h new file mode 100644 index 0000000000..a89e775df8 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_interpret_src.h @@ -0,0 +1,200 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_interpret_src.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_SRC__ +#define __TLCS900H_SRC__ +//========================================================================= +namespace TLCS900H +{ + + +//===== PUSH (mem) +void srcPUSH(void); + +//===== RLD A,(mem) +void srcRLD(void); + +//===== RRD A,(mem) +void srcRRD(void); + +//===== LDI +void srcLDI(void); + +//===== LDIR +void srcLDIR(void); + +//===== LDD +void srcLDD(void); + +//===== LDDR +void srcLDDR(void); + +//===== CPI +void srcCPI(void); + +//===== CPIR +void srcCPIR(void); + +//===== CPD +void srcCPD(void); + +//===== CPDR +void srcCPDR(void); + +//===== LD (nn),(mem) +void srcLD16m(void); + +//===== LD R,(mem) +void srcLD(void); + +//===== EX (mem),R +void srcEX(void); + +//===== ADD (mem),# +void srcADDi(void); + +//===== ADC (mem),# +void srcADCi(void); + +//===== SUB (mem),# +void srcSUBi(void); + +//===== SBC (mem),# +void srcSBCi(void); + +//===== AND (mem),# +void srcANDi(void); + +//===== OR (mem),# +void srcORi(void); + +//===== XOR (mem),# +void srcXORi(void); + +//===== CP (mem),# +void srcCPi(void); + +//===== MUL RR,(mem) +void srcMUL(void); + +//===== MULS RR,(mem) +void srcMULS(void); + +//===== DIV RR,(mem) +void srcDIV(void); + +//===== DIVS RR,(mem) +void srcDIVS(void); + +//===== INC #3,(mem) +void srcINC(void); + +//===== DEC #3,(mem) +void srcDEC(void); + +//===== RLC (mem) +void srcRLC(void); + +//===== RRC (mem) +void srcRRC(void); + +//===== RL (mem) +void srcRL(void); + +//===== RR (mem) +void srcRR(void); + +//===== SLA (mem) +void srcSLA(void); + +//===== SRA (mem) +void srcSRA(void); + +//===== SLL (mem) +void srcSLL(void); + +//===== SRL (mem) +void srcSRL(void); + +//===== ADD R,(mem) +void srcADDRm(void); + +//===== ADD (mem),R +void srcADDmR(void); + +//===== ADC R,(mem) +void srcADCRm(void); + +//===== ADC (mem),R +void srcADCmR(void); + +//===== SUB R,(mem) +void srcSUBRm(void); + +//===== SUB (mem),R +void srcSUBmR(void); + +//===== SBC R,(mem) +void srcSBCRm(void); + +//===== SBC (mem),R +void srcSBCmR(void); + +//===== AND R,(mem) +void srcANDRm(void); + +//===== AND (mem),R +void srcANDmR(void); + +//===== XOR R,(mem) +void srcXORRm(void); + +//===== XOR (mem),R +void srcXORmR(void); + +//===== OR R,(mem) +void srcORRm(void); + +//===== OR (mem),R +void srcORmR(void); + +//===== CP R,(mem) +void srcCPRm(void); + +//===== CP (mem),R +void srcCPmR(void); + +}; + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers.cpp b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers.cpp new file mode 100644 index 0000000000..d17e4a2a31 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers.cpp @@ -0,0 +1,208 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +10 AUG 2002 - neopop_uk +======================================= +- Moved default PC setup to the 'reset_registers' function. + +//--------------------------------------------------------------------------- +*/ + +#include "../neopop.h" +#include "../interrupt.h" +#include "TLCS900h_registers.h" + +namespace TLCS900H +{ + +#ifdef MSB_FIRST +#define BYTE0 3 +#define BYTE1 2 +#define BYTE2 1 +#define BYTE3 0 +#define WORD0 2 +#define WORD1 0 +#else +#define BYTE0 0 +#define BYTE1 1 +#define BYTE2 2 +#define BYTE3 3 +#define WORD0 0 +#define WORD1 2 +#endif + +//============================================================================= + +uint32 pc, gprBank[4][4], gpr[4]; +uint16 sr; +uint8 f_dash; + +//============================================================================= + +//Bank Data +uint8* gprMapB[4][8] = +{ + #include "TLCS900h_registers_mapB.h" +}; + +uint16* gprMapW[4][8] = +{ + #include "TLCS900h_registers_mapW.h" +}; + +uint32* gprMapL[4][8] = +{ + #include "TLCS900h_registers_mapL.h" +}; + +//============================================================================= + +uint32 rErr; + +uint8* regCodeMapB[4][256] = +{ + { + #include "TLCS900h_registers_mapCodeB0.h" + }, + + { + #include "TLCS900h_registers_mapCodeB1.h" + }, + + { + #include "TLCS900h_registers_mapCodeB2.h" + }, + + { + #include "TLCS900h_registers_mapCodeB3.h" + } +}; + +uint16* regCodeMapW[4][128] = +{ + { + #include "TLCS900h_registers_mapCodeW0.h" + }, + + { + #include "TLCS900h_registers_mapCodeW1.h" + }, + + { + #include "TLCS900h_registers_mapCodeW2.h" + }, + + { + #include "TLCS900h_registers_mapCodeW3.h" + } +}; + +uint32* regCodeMapL[4][64] = +{ + { + #include "TLCS900h_registers_mapCodeL0.h" + }, + + { + #include "TLCS900h_registers_mapCodeL1.h" + }, + + { + #include "TLCS900h_registers_mapCodeL2.h" + }, + + { + #include "TLCS900h_registers_mapCodeL3.h" + } +}; + +//============================================================================= + +uint8 statusIFF(void) +{ + uint8 iff = (sr & 0x7000) >> 12; + + if (iff == 1) + return 0; + else + return iff; +} + +void setStatusIFF(uint8 iff) +{ + sr = (sr & 0x8FFF) | ((iff & 0x7) << 12); +} + +//============================================================================= + +uint8 statusRFP; + +void setStatusRFP(uint8 rfp) +{ + sr = (sr & 0xF8FF) | ((rfp & 0x3) << 8); + changedSP(); +} + +void changedSP(void) +{ + //Store global RFP for optimisation. + statusRFP = ((sr & 0x300) >> 8); + int_check_pending(); +} + +//============================================================================= + +void reset_registers(void) +{ + memset(gprBank, 0, sizeof(gprBank)); + memset(gpr, 0, sizeof(gpr)); + + if (ngpc_rom.data) + pc = MDFN_de32lsb(rom_header->startPC) & 0xFFFFFF; + else + pc = 0xFFFFFE; + + sr = 0xF800; // = %11111000???????? (?) are undefined in the manual) + changedSP(); + + f_dash = 00; + + rErr = RERR_VALUE; + + gpr[0] = 0xff23c3; + gpr[1] = 0xff23df; + gpr[2] = 0x006480; + REGXSP = 0x00006C00; //Confirmed from BIOS, + //immediately changes value from default of 0x100 +} + +}; + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers.h new file mode 100644 index 0000000000..b343cf8f43 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers.h @@ -0,0 +1,126 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +21 AUG 2002 - neopop_uk +======================================= +- Fixed potential precidence problems in regX and rCodeX by using ()'s + +//--------------------------------------------------------------------------- +*/ + +#ifndef __TLCS900H_REGISTERS__ +#define __TLCS900H_REGISTERS__ +//============================================================================= + +namespace TLCS900H +{ + +void reset_registers(void); +void dump_registers_TLCS900h(void); + +//The value read by bad rCodes, leave 0, improves "Gals Fighters" +#define RERR_VALUE 0 + +//============================================================================= + +extern uint32 pc; +extern uint16 sr; +extern uint8 f_dash; + +extern uint32 gprBank[4][4], gpr[4]; + +extern uint32 rErr; + +extern uint8 statusRFP; + +//GPR Access +extern uint8* gprMapB[4][8]; +extern uint16* gprMapW[4][8]; +extern uint32* gprMapL[4][8]; + +#define regB(x) (*(gprMapB[statusRFP][(x)])) +#define regW(x) (*(gprMapW[statusRFP][(x)])) +#define regL(x) (*(gprMapL[statusRFP][(x)])) + +//Reg.Code Access +extern uint8* regCodeMapB[4][256]; +extern uint16* regCodeMapW[4][128]; +extern uint32* regCodeMapL[4][64]; + +#define rCodeB(r) (*(regCodeMapB[statusRFP][(r)])) +#define rCodeW(r) (*(regCodeMapW[statusRFP][(r) >> 1])) +#define rCodeL(r) (*(regCodeMapL[statusRFP][(r) >> 2])) + +//Common Registers +#define REGA (regB(1)) +#define REGWA (regW(0)) +#define REGBC (regW(1)) +#define REGXSP (gpr[3]) + +//============================================================================= + +uint8 statusIFF(void); +void setStatusIFF(uint8 iff); + +void setStatusRFP(uint8 rfp); +void changedSP(void); + +#define FLAG_S ((sr & 0x0080) >> 7) +#define FLAG_Z ((sr & 0x0040) >> 6) +#define FLAG_H ((sr & 0x0010) >> 4) +#define FLAG_V ((sr & 0x0004) >> 2) +#define FLAG_N ((sr & 0x0002) >> 1) +#define FLAG_C (sr & 1) + +#define SETFLAG_S(s) { uint16 sr1 = sr & 0xFF7F; if (s) sr1 |= 0x0080; sr = sr1; } +#define SETFLAG_Z(z) { uint16 sr1 = sr & 0xFFBF; if (z) sr1 |= 0x0040; sr = sr1; } +#define SETFLAG_H(h) { uint16 sr1 = sr & 0xFFEF; if (h) sr1 |= 0x0010; sr = sr1; } +#define SETFLAG_V(v) { uint16 sr1 = sr & 0xFFFB; if (v) sr1 |= 0x0004; sr = sr1; } +#define SETFLAG_N(n) { uint16 sr1 = sr & 0xFFFD; if (n) sr1 |= 0x0002; sr = sr1; } +#define SETFLAG_C(c) { uint16 sr1 = sr & 0xFFFE; if (c) sr1 |= 0x0001; sr = sr1; } + +#define SETFLAG_S0 { sr &= 0xFF7F; } +#define SETFLAG_Z0 { sr &= 0xFFBF; } +#define SETFLAG_H0 { sr &= 0xFFEF; } +#define SETFLAG_V0 { sr &= 0xFFFB; } +#define SETFLAG_N0 { sr &= 0xFFFD; } +#define SETFLAG_C0 { sr &= 0xFFFE; } + +#define SETFLAG_S1 { sr |= 0x0080; } +#define SETFLAG_Z1 { sr |= 0x0040; } +#define SETFLAG_H1 { sr |= 0x0010; } +#define SETFLAG_V1 { sr |= 0x0004; } +#define SETFLAG_N1 { sr |= 0x0002; } +#define SETFLAG_C1 { sr |= 0x0001; } + +}; + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapB.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapB.h new file mode 100644 index 0000000000..f6688f88bd --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapB.h @@ -0,0 +1,83 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapB.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //Bank 0 + { + (uint8*)&(gprBank[0][0]) + BYTE1, + (uint8*)&(gprBank[0][0]) + BYTE0, + (uint8*)&(gprBank[0][1]) + BYTE1, + (uint8*)&(gprBank[0][1]) + BYTE0, + (uint8*)&(gprBank[0][2]) + BYTE1, + (uint8*)&(gprBank[0][2]) + BYTE0, + (uint8*)&(gprBank[0][3]) + BYTE1, + (uint8*)&(gprBank[0][3]) + BYTE0, + }, + + //Bank 1 + { + (uint8*)&(gprBank[1][0]) + BYTE1, + (uint8*)&(gprBank[1][0]) + BYTE0, + (uint8*)&(gprBank[1][1]) + BYTE1, + (uint8*)&(gprBank[1][1]) + BYTE0, + (uint8*)&(gprBank[1][2]) + BYTE1, + (uint8*)&(gprBank[1][2]) + BYTE0, + (uint8*)&(gprBank[1][3]) + BYTE1, + (uint8*)&(gprBank[1][3]) + BYTE0, + }, + + //Bank 2 + { + (uint8*)&(gprBank[2][0]) + BYTE1, + (uint8*)&(gprBank[2][0]) + BYTE0, + (uint8*)&(gprBank[2][1]) + BYTE1, + (uint8*)&(gprBank[2][1]) + BYTE0, + (uint8*)&(gprBank[2][2]) + BYTE1, + (uint8*)&(gprBank[2][2]) + BYTE0, + (uint8*)&(gprBank[2][3]) + BYTE1, + (uint8*)&(gprBank[2][3]) + BYTE0, + }, + + //Bank 3 + { + (uint8*)&(gprBank[3][0]) + BYTE1, + (uint8*)&(gprBank[3][0]) + BYTE0, + (uint8*)&(gprBank[3][1]) + BYTE1, + (uint8*)&(gprBank[3][1]) + BYTE0, + (uint8*)&(gprBank[3][2]) + BYTE1, + (uint8*)&(gprBank[3][2]) + BYTE0, + (uint8*)&(gprBank[3][3]) + BYTE1, + (uint8*)&(gprBank[3][3]) + BYTE0, + } + +//============================================================================= + diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB0.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB0.h new file mode 100644 index 0000000000..8b76446da5 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB0.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeB0.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + ((uint8*)&gprBank[0][0]) + BYTE0,((uint8*)&gprBank[0][0]) + BYTE1, //BANK 0 + ((uint8*)&gprBank[0][0]) + BYTE2, ((uint8*)&gprBank[0][0]) + BYTE3, + ((uint8*)&gprBank[0][1]) + BYTE0,((uint8*)&gprBank[0][1]) + BYTE1, + ((uint8*)&gprBank[0][1]) + BYTE2, ((uint8*)&gprBank[0][1]) + BYTE3, + ((uint8*)&gprBank[0][2]) + BYTE0,((uint8*)&gprBank[0][2]) + BYTE1, + ((uint8*)&gprBank[0][2]) + BYTE2, ((uint8*)&gprBank[0][2]) + BYTE3, + ((uint8*)&gprBank[0][3]) + BYTE0,((uint8*)&gprBank[0][3]) + BYTE1, + ((uint8*)&gprBank[0][3]) + BYTE2, ((uint8*)&gprBank[0][3]) + BYTE3, + + ((uint8*)&gprBank[1][0]) + BYTE0,((uint8*)&gprBank[1][0]) + BYTE1, //BANK 1 + ((uint8*)&gprBank[1][0]) + BYTE2, ((uint8*)&gprBank[1][0]) + BYTE3, + ((uint8*)&gprBank[1][1]) + BYTE0,((uint8*)&gprBank[1][1]) + BYTE1, + ((uint8*)&gprBank[1][1]) + BYTE2, ((uint8*)&gprBank[1][1]) + BYTE3, + ((uint8*)&gprBank[1][2]) + BYTE0,((uint8*)&gprBank[1][2]) + BYTE1, + ((uint8*)&gprBank[1][2]) + BYTE2, ((uint8*)&gprBank[1][2]) + BYTE3, + ((uint8*)&gprBank[1][3]) + BYTE0,((uint8*)&gprBank[1][3]) + BYTE1, + ((uint8*)&gprBank[1][3]) + BYTE2, ((uint8*)&gprBank[1][3]) + BYTE3, + + ((uint8*)&gprBank[2][0]) + BYTE0,((uint8*)&gprBank[2][0]) + BYTE1, //BANK 2 + ((uint8*)&gprBank[2][0]) + BYTE2, ((uint8*)&gprBank[2][0]) + BYTE3, + ((uint8*)&gprBank[2][1]) + BYTE0,((uint8*)&gprBank[2][1]) + BYTE1, + ((uint8*)&gprBank[2][1]) + BYTE2, ((uint8*)&gprBank[2][1]) + BYTE3, + ((uint8*)&gprBank[2][2]) + BYTE0,((uint8*)&gprBank[2][2]) + BYTE1, + ((uint8*)&gprBank[2][2]) + BYTE2, ((uint8*)&gprBank[2][2]) + BYTE3, + ((uint8*)&gprBank[2][3]) + BYTE0,((uint8*)&gprBank[2][3]) + BYTE1, + ((uint8*)&gprBank[2][3]) + BYTE2, ((uint8*)&gprBank[2][3]) + BYTE3, + + ((uint8*)&gprBank[3][0]) + BYTE0,((uint8*)&gprBank[3][0]) + BYTE1, //BANK 3 + ((uint8*)&gprBank[3][0]) + BYTE2, ((uint8*)&gprBank[3][0]) + BYTE3, + ((uint8*)&gprBank[3][1]) + BYTE0,((uint8*)&gprBank[3][1]) + BYTE1, + ((uint8*)&gprBank[3][1]) + BYTE2, ((uint8*)&gprBank[3][1]) + BYTE3, + ((uint8*)&gprBank[3][2]) + BYTE0,((uint8*)&gprBank[3][2]) + BYTE1, + ((uint8*)&gprBank[3][2]) + BYTE2, ((uint8*)&gprBank[3][2]) + BYTE3, + ((uint8*)&gprBank[3][3]) + BYTE0,((uint8*)&gprBank[3][3]) + BYTE1, + ((uint8*)&gprBank[3][3]) + BYTE2, ((uint8*)&gprBank[3][3]) + BYTE3, + + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + + //Previous Bank + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr, + + //Current Bank + ((uint8*)&gprBank[0][0]) + BYTE0,((uint8*)&gprBank[0][0]) + BYTE1, + ((uint8*)&gprBank[0][0]) + BYTE2, ((uint8*)&gprBank[0][0]) + BYTE3, + ((uint8*)&gprBank[0][1]) + BYTE0,((uint8*)&gprBank[0][1]) + BYTE1, + ((uint8*)&gprBank[0][1]) + BYTE2, ((uint8*)&gprBank[0][1]) + BYTE3, + ((uint8*)&gprBank[0][2]) + BYTE0,((uint8*)&gprBank[0][2]) + BYTE1, + ((uint8*)&gprBank[0][2]) + BYTE2, ((uint8*)&gprBank[0][2]) + BYTE3, + ((uint8*)&gprBank[0][3]) + BYTE0,((uint8*)&gprBank[0][3]) + BYTE1, + ((uint8*)&gprBank[0][3]) + BYTE2, ((uint8*)&gprBank[0][3]) + BYTE3, + + ((uint8*)&gpr[0]) + BYTE0, ((uint8*)&gpr[0]) + BYTE1, + ((uint8*)&gpr[0]) + BYTE2, ((uint8*)&gpr[0]) + BYTE3, + ((uint8*)&gpr[1]) + BYTE0, ((uint8*)&gpr[1]) + BYTE1, + ((uint8*)&gpr[1]) + BYTE2, ((uint8*)&gpr[1]) + BYTE3, + ((uint8*)&gpr[2]) + BYTE0, ((uint8*)&gpr[2]) + BYTE1, + ((uint8*)&gpr[2]) + BYTE2, ((uint8*)&gpr[2]) + BYTE3, + ((uint8*)&gpr[3]) + BYTE0, ((uint8*)&gpr[3]) + BYTE1, + ((uint8*)&gpr[3]) + BYTE2, ((uint8*)&gpr[3]) + BYTE3 + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB1.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB1.h new file mode 100644 index 0000000000..d9f7868bf5 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB1.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeB1.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + ((uint8*)&gprBank[0][0]) + BYTE0,((uint8*)&gprBank[0][0]) + BYTE1, //BANK 0 + ((uint8*)&gprBank[0][0]) + BYTE2, ((uint8*)&gprBank[0][0]) + BYTE3, + ((uint8*)&gprBank[0][1]) + BYTE0,((uint8*)&gprBank[0][1]) + BYTE1, + ((uint8*)&gprBank[0][1]) + BYTE2, ((uint8*)&gprBank[0][1]) + BYTE3, + ((uint8*)&gprBank[0][2]) + BYTE0,((uint8*)&gprBank[0][2]) + BYTE1, + ((uint8*)&gprBank[0][2]) + BYTE2, ((uint8*)&gprBank[0][2]) + BYTE3, + ((uint8*)&gprBank[0][3]) + BYTE0,((uint8*)&gprBank[0][3]) + BYTE1, + ((uint8*)&gprBank[0][3]) + BYTE2, ((uint8*)&gprBank[0][3]) + BYTE3, + + ((uint8*)&gprBank[1][0]) + BYTE0,((uint8*)&gprBank[1][0]) + BYTE1, //BANK 1 + ((uint8*)&gprBank[1][0]) + BYTE2, ((uint8*)&gprBank[1][0]) + BYTE3, + ((uint8*)&gprBank[1][1]) + BYTE0,((uint8*)&gprBank[1][1]) + BYTE1, + ((uint8*)&gprBank[1][1]) + BYTE2, ((uint8*)&gprBank[1][1]) + BYTE3, + ((uint8*)&gprBank[1][2]) + BYTE0,((uint8*)&gprBank[1][2]) + BYTE1, + ((uint8*)&gprBank[1][2]) + BYTE2, ((uint8*)&gprBank[1][2]) + BYTE3, + ((uint8*)&gprBank[1][3]) + BYTE0,((uint8*)&gprBank[1][3]) + BYTE1, + ((uint8*)&gprBank[1][3]) + BYTE2, ((uint8*)&gprBank[1][3]) + BYTE3, + + ((uint8*)&gprBank[2][0]) + BYTE0,((uint8*)&gprBank[2][0]) + BYTE1, //BANK 2 + ((uint8*)&gprBank[2][0]) + BYTE2, ((uint8*)&gprBank[2][0]) + BYTE3, + ((uint8*)&gprBank[2][1]) + BYTE0,((uint8*)&gprBank[2][1]) + BYTE1, + ((uint8*)&gprBank[2][1]) + BYTE2, ((uint8*)&gprBank[2][1]) + BYTE3, + ((uint8*)&gprBank[2][2]) + BYTE0,((uint8*)&gprBank[2][2]) + BYTE1, + ((uint8*)&gprBank[2][2]) + BYTE2, ((uint8*)&gprBank[2][2]) + BYTE3, + ((uint8*)&gprBank[2][3]) + BYTE0,((uint8*)&gprBank[2][3]) + BYTE1, + ((uint8*)&gprBank[2][3]) + BYTE2, ((uint8*)&gprBank[2][3]) + BYTE3, + + ((uint8*)&gprBank[3][0]) + BYTE0,((uint8*)&gprBank[3][0]) + BYTE1, //BANK 3 + ((uint8*)&gprBank[3][0]) + BYTE2, ((uint8*)&gprBank[3][0]) + BYTE3, + ((uint8*)&gprBank[3][1]) + BYTE0,((uint8*)&gprBank[3][1]) + BYTE1, + ((uint8*)&gprBank[3][1]) + BYTE2, ((uint8*)&gprBank[3][1]) + BYTE3, + ((uint8*)&gprBank[3][2]) + BYTE0,((uint8*)&gprBank[3][2]) + BYTE1, + ((uint8*)&gprBank[3][2]) + BYTE2, ((uint8*)&gprBank[3][2]) + BYTE3, + ((uint8*)&gprBank[3][3]) + BYTE0,((uint8*)&gprBank[3][3]) + BYTE1, + ((uint8*)&gprBank[3][3]) + BYTE2, ((uint8*)&gprBank[3][3]) + BYTE3, + + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + + //Previous Bank + ((uint8*)&gprBank[0][0]) + BYTE0,((uint8*)&gprBank[0][0]) + BYTE1, + ((uint8*)&gprBank[0][0]) + BYTE2, ((uint8*)&gprBank[0][0]) + BYTE3, + ((uint8*)&gprBank[0][1]) + BYTE0,((uint8*)&gprBank[0][1]) + BYTE1, + ((uint8*)&gprBank[0][1]) + BYTE2, ((uint8*)&gprBank[0][1]) + BYTE3, + ((uint8*)&gprBank[0][2]) + BYTE0,((uint8*)&gprBank[0][2]) + BYTE1, + ((uint8*)&gprBank[0][2]) + BYTE2, ((uint8*)&gprBank[0][2]) + BYTE3, + ((uint8*)&gprBank[0][3]) + BYTE0,((uint8*)&gprBank[0][3]) + BYTE1, + ((uint8*)&gprBank[0][3]) + BYTE2, ((uint8*)&gprBank[0][3]) + BYTE3, + + //Current Bank + ((uint8*)&gprBank[1][0]) + BYTE0,((uint8*)&gprBank[1][0]) + BYTE1, + ((uint8*)&gprBank[1][0]) + BYTE2, ((uint8*)&gprBank[1][0]) + BYTE3, + ((uint8*)&gprBank[1][1]) + BYTE0,((uint8*)&gprBank[1][1]) + BYTE1, + ((uint8*)&gprBank[1][1]) + BYTE2, ((uint8*)&gprBank[1][1]) + BYTE3, + ((uint8*)&gprBank[1][2]) + BYTE0,((uint8*)&gprBank[1][2]) + BYTE1, + ((uint8*)&gprBank[1][2]) + BYTE2, ((uint8*)&gprBank[1][2]) + BYTE3, + ((uint8*)&gprBank[1][3]) + BYTE0,((uint8*)&gprBank[1][3]) + BYTE1, + ((uint8*)&gprBank[1][3]) + BYTE2, ((uint8*)&gprBank[1][3]) + BYTE3, + + ((uint8*)&gpr[0]) + BYTE0, ((uint8*)&gpr[0]) + BYTE1, + ((uint8*)&gpr[0]) + BYTE2, ((uint8*)&gpr[0]) + BYTE3, + ((uint8*)&gpr[1]) + BYTE0, ((uint8*)&gpr[1]) + BYTE1, + ((uint8*)&gpr[1]) + BYTE2, ((uint8*)&gpr[1]) + BYTE3, + ((uint8*)&gpr[2]) + BYTE0, ((uint8*)&gpr[2]) + BYTE1, + ((uint8*)&gpr[2]) + BYTE2, ((uint8*)&gpr[2]) + BYTE3, + ((uint8*)&gpr[3]) + BYTE0, ((uint8*)&gpr[3]) + BYTE1, + ((uint8*)&gpr[3]) + BYTE2, ((uint8*)&gpr[3]) + BYTE3 + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB2.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB2.h new file mode 100644 index 0000000000..036604be22 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB2.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeB2.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + ((uint8*)&gprBank[0][0]) + BYTE0,((uint8*)&gprBank[0][0]) + BYTE1, //BANK 0 + ((uint8*)&gprBank[0][0]) + BYTE2, ((uint8*)&gprBank[0][0]) + BYTE3, + ((uint8*)&gprBank[0][1]) + BYTE0,((uint8*)&gprBank[0][1]) + BYTE1, + ((uint8*)&gprBank[0][1]) + BYTE2, ((uint8*)&gprBank[0][1]) + BYTE3, + ((uint8*)&gprBank[0][2]) + BYTE0,((uint8*)&gprBank[0][2]) + BYTE1, + ((uint8*)&gprBank[0][2]) + BYTE2, ((uint8*)&gprBank[0][2]) + BYTE3, + ((uint8*)&gprBank[0][3]) + BYTE0,((uint8*)&gprBank[0][3]) + BYTE1, + ((uint8*)&gprBank[0][3]) + BYTE2, ((uint8*)&gprBank[0][3]) + BYTE3, + + ((uint8*)&gprBank[1][0]) + BYTE0,((uint8*)&gprBank[1][0]) + BYTE1, //BANK 1 + ((uint8*)&gprBank[1][0]) + BYTE2, ((uint8*)&gprBank[1][0]) + BYTE3, + ((uint8*)&gprBank[1][1]) + BYTE0,((uint8*)&gprBank[1][1]) + BYTE1, + ((uint8*)&gprBank[1][1]) + BYTE2, ((uint8*)&gprBank[1][1]) + BYTE3, + ((uint8*)&gprBank[1][2]) + BYTE0,((uint8*)&gprBank[1][2]) + BYTE1, + ((uint8*)&gprBank[1][2]) + BYTE2, ((uint8*)&gprBank[1][2]) + BYTE3, + ((uint8*)&gprBank[1][3]) + BYTE0,((uint8*)&gprBank[1][3]) + BYTE1, + ((uint8*)&gprBank[1][3]) + BYTE2, ((uint8*)&gprBank[1][3]) + BYTE3, + + ((uint8*)&gprBank[2][0]) + BYTE0,((uint8*)&gprBank[2][0]) + BYTE1, //BANK 2 + ((uint8*)&gprBank[2][0]) + BYTE2, ((uint8*)&gprBank[2][0]) + BYTE3, + ((uint8*)&gprBank[2][1]) + BYTE0,((uint8*)&gprBank[2][1]) + BYTE1, + ((uint8*)&gprBank[2][1]) + BYTE2, ((uint8*)&gprBank[2][1]) + BYTE3, + ((uint8*)&gprBank[2][2]) + BYTE0,((uint8*)&gprBank[2][2]) + BYTE1, + ((uint8*)&gprBank[2][2]) + BYTE2, ((uint8*)&gprBank[2][2]) + BYTE3, + ((uint8*)&gprBank[2][3]) + BYTE0,((uint8*)&gprBank[2][3]) + BYTE1, + ((uint8*)&gprBank[2][3]) + BYTE2, ((uint8*)&gprBank[2][3]) + BYTE3, + + ((uint8*)&gprBank[3][0]) + BYTE0,((uint8*)&gprBank[3][0]) + BYTE1, //BANK 3 + ((uint8*)&gprBank[3][0]) + BYTE2, ((uint8*)&gprBank[3][0]) + BYTE3, + ((uint8*)&gprBank[3][1]) + BYTE0,((uint8*)&gprBank[3][1]) + BYTE1, + ((uint8*)&gprBank[3][1]) + BYTE2, ((uint8*)&gprBank[3][1]) + BYTE3, + ((uint8*)&gprBank[3][2]) + BYTE0,((uint8*)&gprBank[3][2]) + BYTE1, + ((uint8*)&gprBank[3][2]) + BYTE2, ((uint8*)&gprBank[3][2]) + BYTE3, + ((uint8*)&gprBank[3][3]) + BYTE0,((uint8*)&gprBank[3][3]) + BYTE1, + ((uint8*)&gprBank[3][3]) + BYTE2, ((uint8*)&gprBank[3][3]) + BYTE3, + + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + + //Previous Bank + ((uint8*)&gprBank[1][0]) + BYTE0,((uint8*)&gprBank[1][0]) + BYTE1, + ((uint8*)&gprBank[1][0]) + BYTE2, ((uint8*)&gprBank[1][0]) + BYTE3, + ((uint8*)&gprBank[1][1]) + BYTE0,((uint8*)&gprBank[1][1]) + BYTE1, + ((uint8*)&gprBank[1][1]) + BYTE2, ((uint8*)&gprBank[1][1]) + BYTE3, + ((uint8*)&gprBank[1][2]) + BYTE0,((uint8*)&gprBank[1][2]) + BYTE1, + ((uint8*)&gprBank[1][2]) + BYTE2, ((uint8*)&gprBank[1][2]) + BYTE3, + ((uint8*)&gprBank[1][3]) + BYTE0,((uint8*)&gprBank[1][3]) + BYTE1, + ((uint8*)&gprBank[1][3]) + BYTE2, ((uint8*)&gprBank[1][3]) + BYTE3, + + //Current Bank + ((uint8*)&gprBank[2][0]) + BYTE0,((uint8*)&gprBank[2][0]) + BYTE1, + ((uint8*)&gprBank[2][0]) + BYTE2, ((uint8*)&gprBank[2][0]) + BYTE3, + ((uint8*)&gprBank[2][1]) + BYTE0,((uint8*)&gprBank[2][1]) + BYTE1, + ((uint8*)&gprBank[2][1]) + BYTE2, ((uint8*)&gprBank[2][1]) + BYTE3, + ((uint8*)&gprBank[2][2]) + BYTE0,((uint8*)&gprBank[2][2]) + BYTE1, + ((uint8*)&gprBank[2][2]) + BYTE2, ((uint8*)&gprBank[2][2]) + BYTE3, + ((uint8*)&gprBank[2][3]) + BYTE0,((uint8*)&gprBank[2][3]) + BYTE1, + ((uint8*)&gprBank[2][3]) + BYTE2, ((uint8*)&gprBank[2][3]) + BYTE3, + + ((uint8*)&gpr[0]) + BYTE0, ((uint8*)&gpr[0]) + BYTE1, + ((uint8*)&gpr[0]) + BYTE2, ((uint8*)&gpr[0]) + BYTE3, + ((uint8*)&gpr[1]) + BYTE0, ((uint8*)&gpr[1]) + BYTE1, + ((uint8*)&gpr[1]) + BYTE2, ((uint8*)&gpr[1]) + BYTE3, + ((uint8*)&gpr[2]) + BYTE0, ((uint8*)&gpr[2]) + BYTE1, + ((uint8*)&gpr[2]) + BYTE2, ((uint8*)&gpr[2]) + BYTE3, + ((uint8*)&gpr[3]) + BYTE0, ((uint8*)&gpr[3]) + BYTE1, + ((uint8*)&gpr[3]) + BYTE2, ((uint8*)&gpr[3]) + BYTE3 + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB3.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB3.h new file mode 100644 index 0000000000..b3e1fd77fb --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeB3.h @@ -0,0 +1,105 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeB3.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + ((uint8*)&gprBank[0][0]) + BYTE0,((uint8*)&gprBank[0][0]) + BYTE1, //BANK 0 + ((uint8*)&gprBank[0][0]) + BYTE2, ((uint8*)&gprBank[0][0]) + BYTE3, + ((uint8*)&gprBank[0][1]) + BYTE0,((uint8*)&gprBank[0][1]) + BYTE1, + ((uint8*)&gprBank[0][1]) + BYTE2, ((uint8*)&gprBank[0][1]) + BYTE3, + ((uint8*)&gprBank[0][2]) + BYTE0,((uint8*)&gprBank[0][2]) + BYTE1, + ((uint8*)&gprBank[0][2]) + BYTE2, ((uint8*)&gprBank[0][2]) + BYTE3, + ((uint8*)&gprBank[0][3]) + BYTE0,((uint8*)&gprBank[0][3]) + BYTE1, + ((uint8*)&gprBank[0][3]) + BYTE2, ((uint8*)&gprBank[0][3]) + BYTE3, + + ((uint8*)&gprBank[1][0]) + BYTE0,((uint8*)&gprBank[1][0]) + BYTE1, //BANK 1 + ((uint8*)&gprBank[1][0]) + BYTE2, ((uint8*)&gprBank[1][0]) + BYTE3, + ((uint8*)&gprBank[1][1]) + BYTE0,((uint8*)&gprBank[1][1]) + BYTE1, + ((uint8*)&gprBank[1][1]) + BYTE2, ((uint8*)&gprBank[1][1]) + BYTE3, + ((uint8*)&gprBank[1][2]) + BYTE0,((uint8*)&gprBank[1][2]) + BYTE1, + ((uint8*)&gprBank[1][2]) + BYTE2, ((uint8*)&gprBank[1][2]) + BYTE3, + ((uint8*)&gprBank[1][3]) + BYTE0,((uint8*)&gprBank[1][3]) + BYTE1, + ((uint8*)&gprBank[1][3]) + BYTE2, ((uint8*)&gprBank[1][3]) + BYTE3, + + ((uint8*)&gprBank[2][0]) + BYTE0,((uint8*)&gprBank[2][0]) + BYTE1, //BANK 2 + ((uint8*)&gprBank[2][0]) + BYTE2, ((uint8*)&gprBank[2][0]) + BYTE3, + ((uint8*)&gprBank[2][1]) + BYTE0,((uint8*)&gprBank[2][1]) + BYTE1, + ((uint8*)&gprBank[2][1]) + BYTE2, ((uint8*)&gprBank[2][1]) + BYTE3, + ((uint8*)&gprBank[2][2]) + BYTE0,((uint8*)&gprBank[2][2]) + BYTE1, + ((uint8*)&gprBank[2][2]) + BYTE2, ((uint8*)&gprBank[2][2]) + BYTE3, + ((uint8*)&gprBank[2][3]) + BYTE0,((uint8*)&gprBank[2][3]) + BYTE1, + ((uint8*)&gprBank[2][3]) + BYTE2, ((uint8*)&gprBank[2][3]) + BYTE3, + + ((uint8*)&gprBank[3][0]) + BYTE0,((uint8*)&gprBank[3][0]) + BYTE1, //BANK 3 + ((uint8*)&gprBank[3][0]) + BYTE2, ((uint8*)&gprBank[3][0]) + BYTE3, + ((uint8*)&gprBank[3][1]) + BYTE0,((uint8*)&gprBank[3][1]) + BYTE1, + ((uint8*)&gprBank[3][1]) + BYTE2, ((uint8*)&gprBank[3][1]) + BYTE3, + ((uint8*)&gprBank[3][2]) + BYTE0,((uint8*)&gprBank[3][2]) + BYTE1, + ((uint8*)&gprBank[3][2]) + BYTE2, ((uint8*)&gprBank[3][2]) + BYTE3, + ((uint8*)&gprBank[3][3]) + BYTE0,((uint8*)&gprBank[3][3]) + BYTE1, + ((uint8*)&gprBank[3][3]) + BYTE2, ((uint8*)&gprBank[3][3]) + BYTE3, + + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + (uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr,(uint8*)&rErr, + + //Previous Bank + ((uint8*)&gprBank[2][0]) + BYTE0,((uint8*)&gprBank[2][0]) + BYTE1, + ((uint8*)&gprBank[2][0]) + BYTE2, ((uint8*)&gprBank[2][0]) + BYTE3, + ((uint8*)&gprBank[2][1]) + BYTE0,((uint8*)&gprBank[2][1]) + BYTE1, + ((uint8*)&gprBank[2][1]) + BYTE2, ((uint8*)&gprBank[2][1]) + BYTE3, + ((uint8*)&gprBank[2][2]) + BYTE0,((uint8*)&gprBank[2][2]) + BYTE1, + ((uint8*)&gprBank[2][2]) + BYTE2, ((uint8*)&gprBank[2][2]) + BYTE3, + ((uint8*)&gprBank[2][3]) + BYTE0,((uint8*)&gprBank[2][3]) + BYTE1, + ((uint8*)&gprBank[2][3]) + BYTE2, ((uint8*)&gprBank[2][3]) + BYTE3, + + //Current Bank + ((uint8*)&gprBank[3][0]) + BYTE0,((uint8*)&gprBank[3][0]) + BYTE1, + ((uint8*)&gprBank[3][0]) + BYTE2, ((uint8*)&gprBank[3][0]) + BYTE3, + ((uint8*)&gprBank[3][1]) + BYTE0,((uint8*)&gprBank[3][1]) + BYTE1, + ((uint8*)&gprBank[3][1]) + BYTE2, ((uint8*)&gprBank[3][1]) + BYTE3, + ((uint8*)&gprBank[3][2]) + BYTE0,((uint8*)&gprBank[3][2]) + BYTE1, + ((uint8*)&gprBank[3][2]) + BYTE2, ((uint8*)&gprBank[3][2]) + BYTE3, + ((uint8*)&gprBank[3][3]) + BYTE0,((uint8*)&gprBank[3][3]) + BYTE1, + ((uint8*)&gprBank[3][3]) + BYTE2, ((uint8*)&gprBank[3][3]) + BYTE3, + + ((uint8*)&gpr[0]) + BYTE0, ((uint8*)&gpr[0]) + BYTE1, + ((uint8*)&gpr[0]) + BYTE2, ((uint8*)&gpr[0]) + BYTE3, + ((uint8*)&gpr[1]) + BYTE0, ((uint8*)&gpr[1]) + BYTE1, + ((uint8*)&gpr[1]) + BYTE2, ((uint8*)&gpr[1]) + BYTE3, + ((uint8*)&gpr[2]) + BYTE0, ((uint8*)&gpr[2]) + BYTE1, + ((uint8*)&gpr[2]) + BYTE2, ((uint8*)&gpr[2]) + BYTE3, + ((uint8*)&gpr[3]) + BYTE0, ((uint8*)&gpr[3]) + BYTE1, + ((uint8*)&gpr[3]) + BYTE2, ((uint8*)&gpr[3]) + BYTE3 + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL0.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL0.h new file mode 100644 index 0000000000..6897182d51 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL0.h @@ -0,0 +1,60 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeL0.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + &(gprBank[0][0]), &(gprBank[0][1]), &(gprBank[0][2]), &(gprBank[0][3]), + + //BANK 1 + &(gprBank[1][0]), &(gprBank[1][1]), &(gprBank[1][2]), &(gprBank[1][3]), + + //BANK 2 + &(gprBank[2][0]), &(gprBank[2][1]), &(gprBank[2][2]), &(gprBank[2][3]), + + //BANK 3 + &(gprBank[3][0]), &(gprBank[3][1]), &(gprBank[3][2]), &(gprBank[3][3]), + + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr, + + //Previous Bank + &rErr,&rErr,&rErr,&rErr, + + //Current Bank + &(gprBank[0][0]), &(gprBank[0][1]), &(gprBank[0][2]), &(gprBank[0][3]), + + &(gpr[0]), &(gpr[1]), &(gpr[2]), &(gpr[3]) + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL1.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL1.h new file mode 100644 index 0000000000..6099806d63 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL1.h @@ -0,0 +1,60 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeL1.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + &(gprBank[0][0]), &(gprBank[0][1]), &(gprBank[0][2]), &(gprBank[0][3]), + + //BANK 1 + &(gprBank[1][0]), &(gprBank[1][1]), &(gprBank[1][2]), &(gprBank[1][3]), + + //BANK 2 + &(gprBank[2][0]), &(gprBank[2][1]), &(gprBank[2][2]), &(gprBank[2][3]), + + //BANK 3 + &(gprBank[3][0]), &(gprBank[3][1]), &(gprBank[3][2]), &(gprBank[3][3]), + + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr, + + //Previous Bank + &(gprBank[0][0]), &(gprBank[0][1]), &(gprBank[0][2]), &(gprBank[0][3]), + + //Current Bank + &(gprBank[1][0]), &(gprBank[1][1]), &(gprBank[1][2]), &(gprBank[1][3]), + + &(gpr[0]), &(gpr[1]), &(gpr[2]), &(gpr[3]) + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL2.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL2.h new file mode 100644 index 0000000000..57492049bf --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL2.h @@ -0,0 +1,60 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeL2.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + &(gprBank[0][0]), &(gprBank[0][1]), &(gprBank[0][2]), &(gprBank[0][3]), + + //BANK 1 + &(gprBank[1][0]), &(gprBank[1][1]), &(gprBank[1][2]), &(gprBank[1][3]), + + //BANK 2 + &(gprBank[2][0]), &(gprBank[2][1]), &(gprBank[2][2]), &(gprBank[2][3]), + + //BANK 3 + &(gprBank[3][0]), &(gprBank[3][1]), &(gprBank[3][2]), &(gprBank[3][3]), + + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr, + + //Previous Bank + &(gprBank[1][0]), &(gprBank[1][1]), &(gprBank[1][2]), &(gprBank[1][3]), + + //Current Bank + &(gprBank[2][0]), &(gprBank[2][1]), &(gprBank[2][2]), &(gprBank[2][3]), + + &(gpr[0]), &(gpr[1]), &(gpr[2]), &(gpr[3]) + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL3.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL3.h new file mode 100644 index 0000000000..aa597cadba --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeL3.h @@ -0,0 +1,60 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeL3.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + &(gprBank[0][0]), &(gprBank[0][1]), &(gprBank[0][2]), &(gprBank[0][3]), + + //BANK 1 + &(gprBank[1][0]), &(gprBank[1][1]), &(gprBank[1][2]), &(gprBank[1][3]), + + //BANK 2 + &(gprBank[2][0]), &(gprBank[2][1]), &(gprBank[2][2]), &(gprBank[2][3]), + + //BANK 3 + &(gprBank[3][0]), &(gprBank[3][1]), &(gprBank[3][2]), &(gprBank[3][3]), + + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr,&rErr, + &rErr,&rErr,&rErr,&rErr, + + //Previous Bank + &(gprBank[2][0]), &(gprBank[2][1]), &(gprBank[2][2]), &(gprBank[2][3]), + + //Current Bank + &(gprBank[3][0]), &(gprBank[3][1]), &(gprBank[3][2]), &(gprBank[3][3]), + + &(gpr[0]), &(gpr[1]), &(gpr[2]), &(gpr[3]) + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW0.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW0.h new file mode 100644 index 0000000000..ba9fb6954d --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW0.h @@ -0,0 +1,94 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeW0.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), (uint16*)(((uint8*)&gprBank[0][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), (uint16*)(((uint8*)&gprBank[0][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), (uint16*)(((uint8*)&gprBank[0][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), (uint16*)(((uint8*)&gprBank[0][3]) + WORD1), + + //BANK 1 + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), (uint16*)(((uint8*)&gprBank[1][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), (uint16*)(((uint8*)&gprBank[1][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), (uint16*)(((uint8*)&gprBank[1][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), (uint16*)(((uint8*)&gprBank[1][3]) + WORD1), + + //BANK 2 + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), (uint16*)(((uint8*)&gprBank[2][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), (uint16*)(((uint8*)&gprBank[2][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), (uint16*)(((uint8*)&gprBank[2][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), (uint16*)(((uint8*)&gprBank[2][3]) + WORD1), + + //BANK 3 + (uint16*)(((uint8*)&gprBank[3][0]) + WORD0), (uint16*)(((uint8*)&gprBank[3][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][1]) + WORD0), (uint16*)(((uint8*)&gprBank[3][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][2]) + WORD0), (uint16*)(((uint8*)&gprBank[3][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][3]) + WORD0), (uint16*)(((uint8*)&gprBank[3][3]) + WORD1), + + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + + //Previous Bank + (uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr, + + //Current Bank + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), (uint16*)(((uint8*)&gprBank[0][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), (uint16*)(((uint8*)&gprBank[0][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), (uint16*)(((uint8*)&gprBank[0][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), (uint16*)(((uint8*)&gprBank[0][3]) + WORD1), + + (uint16*)((uint8*)&(gpr[0]) + WORD0), (uint16*)((uint8*)&(gpr[0]) + WORD1), + (uint16*)((uint8*)&(gpr[1]) + WORD0), (uint16*)((uint8*)&(gpr[1]) + WORD1), + (uint16*)((uint8*)&(gpr[2]) + WORD0), (uint16*)((uint8*)&(gpr[2]) + WORD1), + (uint16*)((uint8*)&(gpr[3]) + WORD0), (uint16*)((uint8*)&(gpr[3]) + WORD1), + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW1.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW1.h new file mode 100644 index 0000000000..fa7f93f1d9 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW1.h @@ -0,0 +1,94 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeW1.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), (uint16*)(((uint8*)&gprBank[0][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), (uint16*)(((uint8*)&gprBank[0][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), (uint16*)(((uint8*)&gprBank[0][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), (uint16*)(((uint8*)&gprBank[0][3]) + WORD1), + + //BANK 1 + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), (uint16*)(((uint8*)&gprBank[1][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), (uint16*)(((uint8*)&gprBank[1][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), (uint16*)(((uint8*)&gprBank[1][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), (uint16*)(((uint8*)&gprBank[1][3]) + WORD1), + + //BANK 2 + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), (uint16*)(((uint8*)&gprBank[2][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), (uint16*)(((uint8*)&gprBank[2][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), (uint16*)(((uint8*)&gprBank[2][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), (uint16*)(((uint8*)&gprBank[2][3]) + WORD1), + + //BANK 3 + (uint16*)(((uint8*)&gprBank[3][0]) + WORD0), (uint16*)(((uint8*)&gprBank[3][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][1]) + WORD0), (uint16*)(((uint8*)&gprBank[3][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][2]) + WORD0), (uint16*)(((uint8*)&gprBank[3][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][3]) + WORD0), (uint16*)(((uint8*)&gprBank[3][3]) + WORD1), + + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + + //Previous Bank + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), (uint16*)(((uint8*)&gprBank[0][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), (uint16*)(((uint8*)&gprBank[0][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), (uint16*)(((uint8*)&gprBank[0][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), (uint16*)(((uint8*)&gprBank[0][3]) + WORD1), + + //Current Bank + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), (uint16*)(((uint8*)&gprBank[1][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), (uint16*)(((uint8*)&gprBank[1][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), (uint16*)(((uint8*)&gprBank[1][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), (uint16*)(((uint8*)&gprBank[1][3]) + WORD1), + + (uint16*)((uint8*)&(gpr[0]) + WORD0), (uint16*)((uint8*)&(gpr[0]) + WORD1), + (uint16*)((uint8*)&(gpr[1]) + WORD0), (uint16*)((uint8*)&(gpr[1]) + WORD1), + (uint16*)((uint8*)&(gpr[2]) + WORD0), (uint16*)((uint8*)&(gpr[2]) + WORD1), + (uint16*)((uint8*)&(gpr[3]) + WORD0), (uint16*)((uint8*)&(gpr[3]) + WORD1), + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW2.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW2.h new file mode 100644 index 0000000000..805c605598 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW2.h @@ -0,0 +1,94 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeW2.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), (uint16*)(((uint8*)&gprBank[0][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), (uint16*)(((uint8*)&gprBank[0][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), (uint16*)(((uint8*)&gprBank[0][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), (uint16*)(((uint8*)&gprBank[0][3]) + WORD1), + + //BANK 1 + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), (uint16*)(((uint8*)&gprBank[1][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), (uint16*)(((uint8*)&gprBank[1][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), (uint16*)(((uint8*)&gprBank[1][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), (uint16*)(((uint8*)&gprBank[1][3]) + WORD1), + + //BANK 2 + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), (uint16*)(((uint8*)&gprBank[2][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), (uint16*)(((uint8*)&gprBank[2][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), (uint16*)(((uint8*)&gprBank[2][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), (uint16*)(((uint8*)&gprBank[2][3]) + WORD1), + + //BANK 3 + (uint16*)(((uint8*)&gprBank[3][0]) + WORD0), (uint16*)(((uint8*)&gprBank[3][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][1]) + WORD0), (uint16*)(((uint8*)&gprBank[3][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][2]) + WORD0), (uint16*)(((uint8*)&gprBank[3][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][3]) + WORD0), (uint16*)(((uint8*)&gprBank[3][3]) + WORD1), + + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + + //Previous Bank + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), (uint16*)(((uint8*)&gprBank[1][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), (uint16*)(((uint8*)&gprBank[1][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), (uint16*)(((uint8*)&gprBank[1][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), (uint16*)(((uint8*)&gprBank[1][3]) + WORD1), + + //Current Bank + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), (uint16*)(((uint8*)&gprBank[2][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), (uint16*)(((uint8*)&gprBank[2][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), (uint16*)(((uint8*)&gprBank[2][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), (uint16*)(((uint8*)&gprBank[2][3]) + WORD1), + + (uint16*)((uint8*)&(gpr[0]) + WORD0), (uint16*)((uint8*)&(gpr[0]) + WORD1), + (uint16*)((uint8*)&(gpr[1]) + WORD0), (uint16*)((uint8*)&(gpr[1]) + WORD1), + (uint16*)((uint8*)&(gpr[2]) + WORD0), (uint16*)((uint8*)&(gpr[2]) + WORD1), + (uint16*)((uint8*)&(gpr[3]) + WORD0), (uint16*)((uint8*)&(gpr[3]) + WORD1), + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW3.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW3.h new file mode 100644 index 0000000000..a1f431766e --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapCodeW3.h @@ -0,0 +1,94 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapCodeW3.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //BANK 0 + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), (uint16*)(((uint8*)&gprBank[0][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), (uint16*)(((uint8*)&gprBank[0][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), (uint16*)(((uint8*)&gprBank[0][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), (uint16*)(((uint8*)&gprBank[0][3]) + WORD1), + + //BANK 1 + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), (uint16*)(((uint8*)&gprBank[1][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), (uint16*)(((uint8*)&gprBank[1][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), (uint16*)(((uint8*)&gprBank[1][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), (uint16*)(((uint8*)&gprBank[1][3]) + WORD1), + + //BANK 2 + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), (uint16*)(((uint8*)&gprBank[2][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), (uint16*)(((uint8*)&gprBank[2][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), (uint16*)(((uint8*)&gprBank[2][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), (uint16*)(((uint8*)&gprBank[2][3]) + WORD1), + + //BANK 3 + (uint16*)(((uint8*)&gprBank[3][0]) + WORD0), (uint16*)(((uint8*)&gprBank[3][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][1]) + WORD0), (uint16*)(((uint8*)&gprBank[3][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][2]) + WORD0), (uint16*)(((uint8*)&gprBank[3][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][3]) + WORD0), (uint16*)(((uint8*)&gprBank[3][3]) + WORD1), + + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + (uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr,(uint16*)&rErr, + + //Previous Bank + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), (uint16*)(((uint8*)&gprBank[2][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), (uint16*)(((uint8*)&gprBank[2][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), (uint16*)(((uint8*)&gprBank[2][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), (uint16*)(((uint8*)&gprBank[2][3]) + WORD1), + + //Current Bank + (uint16*)(((uint8*)&gprBank[3][0]) + WORD0), (uint16*)(((uint8*)&gprBank[3][0]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][1]) + WORD0), (uint16*)(((uint8*)&gprBank[3][1]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][2]) + WORD0), (uint16*)(((uint8*)&gprBank[3][2]) + WORD1), + (uint16*)(((uint8*)&gprBank[3][3]) + WORD0), (uint16*)(((uint8*)&gprBank[3][3]) + WORD1), + + (uint16*)((uint8*)&(gpr[0]) + WORD0), (uint16*)((uint8*)&(gpr[0]) + WORD1), + (uint16*)((uint8*)&(gpr[1]) + WORD0), (uint16*)((uint8*)&(gpr[1]) + WORD1), + (uint16*)((uint8*)&(gpr[2]) + WORD0), (uint16*)((uint8*)&(gpr[2]) + WORD1), + (uint16*)((uint8*)&(gpr[3]) + WORD0), (uint16*)((uint8*)&(gpr[3]) + WORD1), + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapL.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapL.h new file mode 100644 index 0000000000..102a9f0436 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapL.h @@ -0,0 +1,84 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapL.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //Bank 0 + { + (uint32*)&(gprBank[0][0]), + (uint32*)&(gprBank[0][1]), + (uint32*)&(gprBank[0][2]), + (uint32*)&(gprBank[0][3]), + (uint32*)&(gpr[0]), + (uint32*)&(gpr[1]), + (uint32*)&(gpr[2]), + (uint32*)&(gpr[3]), + }, + + //Bank 1 + { + (uint32*)&(gprBank[1][0]), + (uint32*)&(gprBank[1][1]), + (uint32*)&(gprBank[1][2]), + (uint32*)&(gprBank[1][3]), + (uint32*)&(gpr[0]), + (uint32*)&(gpr[1]), + (uint32*)&(gpr[2]), + (uint32*)&(gpr[3]), + }, + + //Bank 2 + { + (uint32*)&(gprBank[2][0]), + (uint32*)&(gprBank[2][1]), + (uint32*)&(gprBank[2][2]), + (uint32*)&(gprBank[2][3]), + (uint32*)&(gpr[0]), + (uint32*)&(gpr[1]), + (uint32*)&(gpr[2]), + (uint32*)&(gpr[3]), + }, + + //Bank 3 + { + (uint32*)&(gprBank[3][0]), + (uint32*)&(gprBank[3][1]), + (uint32*)&(gprBank[3][2]), + (uint32*)&(gprBank[3][3]), + (uint32*)&(gpr[0]), + (uint32*)&(gpr[1]), + (uint32*)&(gpr[2]), + (uint32*)&(gpr[3]), + }, + +//============================================================================= + + diff --git a/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapW.h b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapW.h new file mode 100644 index 0000000000..0cd86877d5 --- /dev/null +++ b/Mednafen/mednafen/ngp/TLCS-900h/TLCS900h_registers_mapW.h @@ -0,0 +1,84 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + TLCS900h_registers_mapW.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +//--------------------------------------------------------------------------- +*/ + + //Bank 0 + { + (uint16*)(((uint8*)&gprBank[0][0]) + WORD0), + (uint16*)(((uint8*)&gprBank[0][1]) + WORD0), + (uint16*)(((uint8*)&gprBank[0][2]) + WORD0), + (uint16*)(((uint8*)&gprBank[0][3]) + WORD0), + (uint16*)(((uint8*)&gpr[0]) + WORD0), + (uint16*)(((uint8*)&gpr[1]) + WORD0), + (uint16*)(((uint8*)&gpr[2]) + WORD0), + (uint16*)(((uint8*)&gpr[3]) + WORD0), + }, + + //Bank 1 + { + (uint16*)(((uint8*)&gprBank[1][0]) + WORD0), + (uint16*)(((uint8*)&gprBank[1][1]) + WORD0), + (uint16*)(((uint8*)&gprBank[1][2]) + WORD0), + (uint16*)(((uint8*)&gprBank[1][3]) + WORD0), + (uint16*)(((uint8*)&gpr[0]) + WORD0), + (uint16*)(((uint8*)&gpr[1]) + WORD0), + (uint16*)(((uint8*)&gpr[2]) + WORD0), + (uint16*)(((uint8*)&gpr[3]) + WORD0), + }, + + //Bank 2 + { + (uint16*)(((uint8*)&gprBank[2][0]) + WORD0), + (uint16*)(((uint8*)&gprBank[2][1]) + WORD0), + (uint16*)(((uint8*)&gprBank[2][2]) + WORD0), + (uint16*)(((uint8*)&gprBank[2][3]) + WORD0), + (uint16*)(((uint8*)&gpr[0]) + WORD0), + (uint16*)(((uint8*)&gpr[1]) + WORD0), + (uint16*)(((uint8*)&gpr[2]) + WORD0), + (uint16*)(((uint8*)&gpr[3]) + WORD0), + }, + + //Bank 3 + { + (uint16*)(((uint8*)&gprBank[3][0]) + WORD0), + (uint16*)(((uint8*)&gprBank[3][1]) + WORD0), + (uint16*)(((uint8*)&gprBank[3][2]) + WORD0), + (uint16*)(((uint8*)&gprBank[3][3]) + WORD0), + (uint16*)(((uint8*)&gpr[0]) + WORD0), + (uint16*)(((uint8*)&gpr[1]) + WORD0), + (uint16*)(((uint8*)&gpr[2]) + WORD0), + (uint16*)(((uint8*)&gpr[3]) + WORD0), + }, + +//============================================================================= + + diff --git a/Mednafen/mednafen/ngp/Z80_interface.cpp b/Mednafen/mednafen/ngp/Z80_interface.cpp new file mode 100644 index 0000000000..7696ff1ffd --- /dev/null +++ b/Mednafen/mednafen/ngp/Z80_interface.cpp @@ -0,0 +1,141 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "mem.h" +#include "sound.h" +#include "Z80_interface.h" +#include "interrupt.h" +#include "dma.h" + +static uint8 CommByte; +static bool Z80Enabled; + +uint8 Z80_ReadComm(void) +{ + return(CommByte); +} + +void Z80_WriteComm(uint8 data) +{ + CommByte = data; +} + +static uint8 NGP_z80_readbyte(uint16 address) +{ + if (address <= 0xFFF) + return loadB(0x7000 + address); + + if (address == 0x8000) + { + return CommByte; + } + return 0; +} + +//============================================================================= + +static void NGP_z80_writebyte(uint16 address, uint8 value) +{ + if (address <= 0x0FFF) + { + storeB(0x7000 + address, value); + return; + } + + if (address == 0x8000) + { + CommByte = value; + return; + } + + if (address == 0x4001) { Write_SoundChipLeft(value); return; } + if (address == 0x4000) { Write_SoundChipRight(value); return; } + + if (address == 0xC000) + { + TestIntHDMA(6, 0x0C); + } +} + +//============================================================================= + +static void NGP_z80_writeport(uint16 port, uint8 value) +{ + //printf("Portout: %04x %02x\n", port, value); + z80_set_interrupt(0); +} + +static uint8 NGP_z80_readport(uint16 port) +{ + //printf("Portin: %04x\n", port); + return 0; +} + +void Z80_nmi(void) +{ + z80_nmi(); +} + +void Z80_irq(void) +{ + z80_set_interrupt(1); +} + +void Z80_reset(void) +{ + Z80Enabled = 0; + + z80_writebyte = NGP_z80_writebyte; + z80_readbyte = NGP_z80_readbyte; + z80_writeport = NGP_z80_writeport; + z80_readport = NGP_z80_readport; + + z80_init(); + z80_reset(); +} + +void Z80_SetEnable(bool set) +{ + Z80Enabled = set; + if(!set) + z80_reset(); +} + +bool Z80_IsEnabled(void) +{ + return(Z80Enabled); +} + +int Z80_RunOP(void) +{ + if(!Z80Enabled) + return(-1); + + return(z80_do_opcode()); +} + +void MDFNNGPCZ80_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(CommByte), + SFVAR(Z80Enabled), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "Z80X"); + + z80_state_action(sm, load, data_only, "Z80"); +} diff --git a/Mednafen/mednafen/ngp/Z80_interface.h b/Mednafen/mednafen/ngp/Z80_interface.h new file mode 100644 index 0000000000..41730917ce --- /dev/null +++ b/Mednafen/mednafen/ngp/Z80_interface.h @@ -0,0 +1,34 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __Z80_CONTROL__ +#define __Z80_CONTROL__ +//============================================================================= + +#include + +uint8 Z80_ReadComm(void); +void Z80_WriteComm(uint8 data); + +void Z80_reset(void); // z80 reset + +void Z80_irq(void); // Cause an interrupt +void Z80_nmi(void); // Cause an NMI +void Z80_SetEnable(bool set); +bool Z80_IsEnabled(void); +int Z80_RunOP(void); + +void MDFNNGPCZ80_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +#endif diff --git a/Mednafen/mednafen/ngp/bios.cpp b/Mednafen/mednafen/ngp/bios.cpp new file mode 100644 index 0000000000..11ad5003f5 --- /dev/null +++ b/Mednafen/mednafen/ngp/bios.cpp @@ -0,0 +1,236 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "Z80_interface.h" +#include "gfx.h" +#include "mem.h" +#include "interrupt.h" +#include "sound.h" +#include "dma.h" +#include "bios.h" + +//============================================================================= + +uint8 ngpc_bios[0x10000]; //Holds bios program data + +//============================================================================= + +void reset(void) +{ + NGPGfx->power(); + Z80_reset(); + reset_int(); + reset_timers(); + + reset_memory(); + BIOSHLE_Reset(); + reset_registers(); // TLCS900H registers + reset_dma(); +} + +//============================================================================= + +static const uint8 font[0x800] = { + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xF8,0xF8,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0, + 0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0, + 0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x20,0x30,0x38,0x3C,0x38,0x30,0x20,0x00,0x04,0x0C,0x1C,0x3C,0x1C,0x0C,0x04,0x00, + 0x00,0x00,0xFE,0x7C,0x38,0x10,0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x00,0x00, + 0x20,0x3C,0x08,0x3C,0x28,0x7E,0x08,0x00,0x3C,0x24,0x3C,0x24,0x3C,0x24,0x24,0x00, + 0x3C,0x24,0x24,0x3C,0x24,0x24,0x3C,0x00,0x10,0x10,0x54,0x54,0x10,0x28,0xC6,0x00, + 0x10,0x12,0xD4,0x58,0x54,0x92,0x10,0x00,0x10,0x10,0x7C,0x10,0x38,0x54,0x92,0x00, + 0x10,0x28,0x7C,0x92,0x38,0x54,0xFE,0x00,0x10,0x10,0x10,0x7C,0x10,0x10,0xFE,0x00, + 0x7F,0xFF,0xE0,0xFF,0x7F,0x01,0xFF,0xFF,0xDC,0xDE,0x1F,0x9F,0xDF,0xDD,0xDC,0x9C, + 0x3B,0x3B,0x3B,0xBB,0xFB,0xFB,0xFB,0x7B,0x8F,0x9E,0xBC,0xF8,0xF8,0xBC,0x9E,0x8F, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x08,0x10,0x00,0x18,0x00, + 0x6C,0x6C,0x24,0x48,0x00,0x00,0x00,0x00,0x14,0x14,0xFE,0x28,0xFE,0x50,0x50,0x00, + 0x10,0x7C,0x90,0x7C,0x12,0xFC,0x10,0x00,0x42,0xA4,0xA8,0x54,0x2A,0x4A,0x84,0x00, + 0x30,0x48,0x38,0x62,0x94,0x88,0x76,0x00,0x18,0x18,0x08,0x10,0x00,0x00,0x00,0x00, + 0x08,0x10,0x20,0x20,0x20,0x10,0x08,0x00,0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00, + 0x10,0x92,0x54,0x38,0x38,0x54,0x92,0x00,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x00, + 0x00,0x00,0x00,0x30,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00, + 0x3C,0x42,0x46,0x5A,0x62,0x42,0x3C,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x00, + 0x3C,0x42,0x42,0x0C,0x30,0x40,0x7E,0x00,0x3C,0x42,0x02,0x1C,0x02,0x42,0x3C,0x00, + 0x0C,0x14,0x24,0x44,0x7E,0x04,0x04,0x00,0x7E,0x40,0x7C,0x02,0x02,0x42,0x3C,0x00, + 0x3C,0x40,0x7C,0x42,0x42,0x42,0x3C,0x00,0x7E,0x02,0x04,0x08,0x08,0x10,0x10,0x00, + 0x3C,0x42,0x42,0x3C,0x42,0x42,0x3C,0x00,0x3C,0x42,0x42,0x42,0x3E,0x02,0x3C,0x00, + 0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x08,0x10,0x00, + 0x00,0x08,0x10,0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x00,0x00, + 0x00,0x10,0x08,0x04,0x08,0x10,0x00,0x00,0x3C,0x62,0x62,0x0C,0x18,0x00,0x18,0x00, + 0x7C,0x82,0xBA,0xA2,0xBA,0x82,0x7C,0x00,0x10,0x28,0x28,0x44,0x7C,0x82,0x82,0x00, + 0x7C,0x42,0x42,0x7C,0x42,0x42,0x7C,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00, + 0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x00,0x7E,0x40,0x40,0x7E,0x40,0x40,0x7E,0x00, + 0x7E,0x40,0x40,0x7C,0x40,0x40,0x40,0x00,0x3C,0x42,0x80,0x9E,0x82,0x46,0x3A,0x00, + 0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, + 0x02,0x02,0x02,0x02,0x42,0x42,0x3C,0x00,0x42,0x44,0x48,0x50,0x68,0x44,0x42,0x00, + 0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x82,0xC6,0xAA,0x92,0x82,0x82,0x82,0x00, + 0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x00, + 0x7C,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x38,0x44,0x82,0x82,0x8A,0x44,0x3A,0x00, + 0x7C,0x42,0x42,0x7C,0x48,0x44,0x42,0x00,0x3C,0x42,0x40,0x3C,0x02,0x42,0x3C,0x00, + 0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00, + 0x82,0x82,0x44,0x44,0x28,0x28,0x10,0x00,0x82,0x92,0x92,0xAA,0xAA,0x44,0x44,0x00, + 0x82,0x44,0x28,0x10,0x28,0x44,0x82,0x00,0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x00, + 0x7E,0x04,0x08,0x10,0x20,0x40,0x7E,0x00,0x18,0x10,0x10,0x10,0x10,0x10,0x18,0x00, + 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x18,0x00, + 0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00, + 0x08,0x10,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x78,0x04,0x7C,0x84,0x84,0x7E,0x00, + 0x40,0x40,0x7C,0x42,0x42,0x42,0x3C,0x00,0x00,0x00,0x3C,0x42,0x40,0x42,0x3C,0x00, + 0x02,0x02,0x3E,0x42,0x42,0x42,0x3C,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x3E,0x00, + 0x0C,0x10,0x3E,0x10,0x10,0x10,0x10,0x00,0x00,0x3C,0x42,0x42,0x3E,0x02,0x7C,0x00, + 0x40,0x40,0x7C,0x42,0x42,0x42,0x42,0x00,0x18,0x18,0x00,0x08,0x08,0x08,0x08,0x00, + 0x06,0x06,0x00,0x02,0x42,0x42,0x3C,0x00,0x20,0x20,0x26,0x28,0x30,0x28,0x26,0x00, + 0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x80,0xEC,0x92,0x92,0x92,0x92,0x00, + 0x00,0x40,0x78,0x44,0x44,0x44,0x44,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00, + 0x00,0x3C,0x42,0x42,0x7C,0x40,0x40,0x00,0x00,0x78,0x84,0x84,0x7C,0x04,0x06,0x00, + 0x00,0x00,0x5C,0x62,0x40,0x40,0x40,0x00,0x00,0x00,0x3E,0x40,0x3C,0x02,0x7C,0x00, + 0x00,0x10,0x7C,0x10,0x10,0x10,0x0E,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x3F,0x00, + 0x00,0x00,0x42,0x42,0x24,0x24,0x18,0x00,0x00,0x00,0x92,0x92,0x92,0x92,0x6C,0x00, + 0x00,0x00,0x42,0x24,0x18,0x24,0x42,0x00,0x00,0x00,0x42,0x42,0x3E,0x02,0x7C,0x00, + 0x00,0x00,0x7E,0x02,0x3C,0x40,0x7E,0x00,0x08,0x10,0x10,0x20,0x10,0x10,0x08,0x00, + 0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x00,0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x00, + 0x00,0x00,0x60,0x92,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x00, + 0x1E,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0xF0,0x00, + 0x00,0x00,0x00,0x80,0x40,0x60,0x60,0x00,0x00,0x00,0x00,0x30,0x78,0x30,0x00,0x00, + 0x20,0xF8,0x26,0x78,0xD0,0x80,0x7C,0x00,0x00,0x10,0x3A,0x1C,0x36,0x5A,0x36,0x00, + 0x00,0x00,0x44,0x42,0x42,0x42,0x30,0x00,0x00,0x3C,0x00,0x3C,0x42,0x02,0x3C,0x00, + 0x00,0x3C,0x00,0x7C,0x08,0x38,0x66,0x00,0x00,0x14,0x72,0x1C,0x32,0x52,0x34,0x00, + 0x00,0x28,0x2C,0x3A,0x62,0x16,0x10,0x00,0x00,0x08,0x5C,0x6A,0x4A,0x0C,0x18,0x00, + 0x00,0x08,0x0C,0x38,0x4C,0x4A,0x38,0x00,0x00,0x00,0x00,0x1C,0x62,0x02,0x1C,0x00, + 0x00,0x00,0x80,0x7E,0x00,0x00,0x00,0x00,0x28,0xF2,0x3C,0x6A,0xAA,0xB6,0xEC,0x00, + 0x80,0x88,0x84,0x84,0x82,0x92,0x70,0x00,0x78,0x00,0x3C,0xC2,0x02,0x04,0x78,0x00, + 0x78,0x00,0xFC,0x08,0x30,0x50,0x9E,0x00,0x2C,0xF2,0x20,0x7C,0xA2,0xA2,0xE4,0x00, + 0x28,0xF4,0x2A,0x4A,0x4A,0x88,0xB0,0x00,0x20,0xFC,0x12,0xFC,0x08,0xC2,0x7C,0x00, + 0x04,0x18,0x60,0x80,0xC0,0x30,0x0E,0x00,0x84,0xBE,0x84,0x84,0x84,0x84,0x58,0x00, + 0x00,0x7C,0x02,0x00,0x80,0x82,0x7E,0x00,0x20,0xFE,0x10,0x78,0x8C,0xC0,0x7C,0x00, + 0x80,0x80,0x80,0x80,0x82,0x84,0x78,0x00,0x04,0xFE,0x3C,0x44,0x7C,0x04,0x78,0x00, + 0x44,0x5E,0xF4,0x44,0x48,0x40,0x3E,0x00,0x44,0x58,0xE0,0x3E,0xC0,0x40,0x3C,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x00, + 0x1E,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0xF0,0x00, + 0x00,0x00,0x00,0x80,0x40,0x60,0x60,0x00,0x00,0x00,0x00,0x30,0x78,0x30,0x00,0x00, + 0x1E,0x62,0x1E,0x62,0x04,0x0C,0x30,0x00,0x00,0x00,0x1E,0x6A,0x0E,0x08,0x18,0x00, + 0x00,0x00,0x06,0x18,0x68,0x08,0x08,0x00,0x00,0x10,0x1C,0x72,0x42,0x04,0x38,0x00, + 0x00,0x00,0x0C,0x78,0x10,0x10,0x7E,0x00,0x00,0x08,0x08,0x7C,0x18,0x28,0x48,0x00, + 0x00,0x00,0x26,0x1A,0x72,0x10,0x08,0x00,0x00,0x00,0x0C,0x34,0x04,0x08,0x7E,0x00, + 0x00,0x00,0x78,0x04,0x3C,0x04,0x78,0x00,0x00,0x00,0x52,0x4A,0x22,0x04,0x38,0x00, + 0x00,0x00,0x80,0x7E,0x00,0x00,0x00,0x00,0x3C,0xC2,0x14,0x1C,0x10,0x30,0x60,0x00, + 0x02,0x0C,0x38,0xC8,0x08,0x08,0x08,0x00,0x60,0x3C,0xE2,0x82,0x82,0x04,0x38,0x00, + 0x00,0x1C,0x70,0x10,0x10,0x1C,0xE2,0x00,0x08,0xFE,0x18,0x38,0x68,0xC8,0x18,0x00, + 0x10,0x3E,0xD2,0x12,0x22,0x62,0xCC,0x00,0x20,0x3C,0xF0,0x1E,0xF0,0x08,0x08,0x00, + 0x10,0x3E,0x62,0xC2,0x04,0x0C,0x70,0x00,0x40,0x7E,0x44,0x84,0x84,0x08,0x30,0x00, + 0x3E,0xC2,0x02,0x02,0x02,0x02,0xFC,0x00,0x44,0x5E,0xE4,0x44,0x44,0x08,0xF0,0x00, + 0x60,0x12,0xC2,0x22,0x04,0x04,0xF8,0x00,0x3C,0xC6,0x0C,0x08,0x38,0x6C,0xC6,0x00, + 0x40,0x4E,0x72,0xC4,0x4C,0x40,0x3E,0x00,0x82,0x42,0x62,0x04,0x04,0x08,0x70,0x00, + 0x3C,0x42,0x72,0x8A,0x04,0x0C,0x70,0x00,0x0C,0xF8,0x10,0xFE,0x10,0x10,0x60,0x00, + 0x22,0xA2,0x92,0x42,0x04,0x08,0x70,0x00,0x3C,0x40,0x1E,0xE8,0x08,0x10,0x60,0x00, + 0x40,0x40,0x70,0x4C,0x42,0x40,0x40,0x00,0x08,0x3E,0xC8,0x08,0x08,0x18,0x70,0x00, + 0x00,0x1C,0x60,0x00,0x00,0x3C,0xC2,0x00,0x3C,0xC2,0x26,0x38,0x1C,0x36,0xE2,0x00, + 0x10,0x3C,0xC6,0x1C,0x38,0xD6,0x12,0x00,0x02,0x02,0x02,0x06,0x04,0x1C,0xF0,0x00, + 0x18,0x4C,0x44,0x46,0x42,0x82,0x82,0x00,0x80,0x86,0xBC,0xE0,0x80,0x80,0x7E,0x00, + 0x3C,0xC2,0x02,0x02,0x04,0x08,0x30,0x00,0x30,0x48,0x4C,0x84,0x86,0x02,0x02,0x00, + 0x10,0xFE,0x10,0x54,0x52,0x92,0x92,0x00,0x3C,0xC2,0x02,0x44,0x28,0x10,0x0C,0x00, + 0x70,0x0C,0x60,0x18,0xC4,0x30,0x0E,0x00,0x30,0x40,0x4C,0x84,0x8E,0xBA,0x62,0x00, + 0x04,0x04,0x64,0x18,0x0C,0x16,0xE2,0x00,0x1C,0xE0,0x3E,0xE0,0x20,0x20,0x1E,0x00, + 0x4E,0x52,0x62,0xE4,0x20,0x10,0x18,0x00,0x1C,0x64,0x04,0x08,0x08,0x10,0xFE,0x00, + 0x1C,0x62,0x02,0x3E,0x02,0x02,0x7C,0x00,0x3C,0xC0,0x3E,0xC2,0x02,0x04,0x78,0x00, + 0x44,0x42,0x42,0x42,0x22,0x04,0x78,0x00,0x50,0x50,0x52,0x52,0x52,0x54,0x88,0x00, + 0x80,0x80,0x82,0x82,0x84,0x88,0xF0,0x00,0x1C,0xE2,0x82,0x82,0x82,0x4C,0x74,0x00, + 0x3C,0xC2,0x82,0x82,0x02,0x04,0x38,0x00,0xC0,0x62,0x22,0x02,0x04,0x08,0xF0,0x00, + 0x00,0x00,0x00,0x00,0x0A,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x02,0x00, + 0x20,0xF8,0x40,0x5E,0x80,0xA0,0x9E,0x00,0x20,0xFE,0x40,0x7C,0xC2,0x86,0x3C,0x00, + 0x00,0x3C,0xC6,0x02,0x02,0x0C,0x38,0x00,0x0E,0xF8,0x10,0x20,0x20,0x10,0x0E,0x00, + 0x40,0x4C,0x30,0x40,0x80,0x80,0x7E,0x00,0x44,0xF2,0x4A,0x9C,0xA4,0xA6,0x3A,0x00, + 0x40,0x5C,0x82,0x80,0xA0,0xA0,0x9E,0x00,0x48,0x7C,0x52,0xB2,0xBE,0xAA,0x4C,0x00, + 0x20,0xFC,0x32,0x62,0xEE,0xAA,0x2C,0x00,0x38,0x54,0x92,0x92,0xB2,0xA2,0x4C,0x00, + 0x44,0x5E,0x84,0x9C,0xA4,0xA6,0x9C,0x00,0x28,0xEE,0x44,0x84,0x84,0x44,0x38,0x00, + 0x78,0x10,0x64,0x34,0x8A,0x8A,0x30,0x00,0x30,0x58,0x48,0x84,0x84,0x02,0x02,0x00, + 0xBC,0x88,0xBE,0x84,0xBC,0xA6,0x9C,0x00,0x68,0x1E,0x68,0x1E,0x78,0x8C,0x7A,0x00, + 0x70,0x14,0x7C,0x96,0x94,0x94,0x68,0x00,0x2C,0xF2,0x60,0xA0,0xA2,0xC2,0x7C,0x00, + 0x48,0x7C,0x6A,0xAA,0xB2,0xB2,0x6C,0x00,0x10,0xF8,0x20,0xF8,0x22,0x22,0x1C,0x00, + 0x48,0x5C,0x6A,0xC2,0x64,0x20,0x18,0x00,0x10,0xBC,0xD6,0xCA,0xAA,0x1C,0x70,0x00, + 0x10,0x1C,0x12,0x70,0x9C,0x92,0x70,0x00,0xE0,0x18,0x40,0x7C,0xC2,0x82,0x3C,0x00, + 0x44,0x42,0x82,0xA2,0x62,0x04,0x78,0x00,0x7C,0x38,0x7C,0xC2,0xBA,0x26,0x3C,0x00, + 0x48,0xD4,0x64,0x64,0xC4,0xC4,0x46,0x00,0x7C,0x30,0x7C,0xC2,0x82,0x06,0x3C,0x00, + 0x20,0xFC,0x32,0x62,0xE2,0xA2,0x2C,0x00,0x10,0x30,0x60,0x72,0xD2,0x92,0x9C,0x00, + 0x00,0x00,0x00,0x00,0x0A,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x02,0x05,0x02,0x00 +}; + +bool bios_install(void) +{ + //=== Install the reverse engineered bios + int i; + + uint32 vectable[] = + { + 0xFF27A2, //0 VECT_SHUTDOWN + 0xFF1030, //1 VECT_CLOCKGEARSET + 0xFF1440, //2 VECT_RTCGET + 0xFF12B4, //3 ? + 0xFF1222, //4 VECT_INTLVSET + 0xFF8D8A, //5 VECT_SYSFONTSET + 0xFF6FD8, //6 VECT_FLASHWRITE + 0xFF7042, //7 VECT_FLASHALLERS + 0xFF7082, //8 VECT_FLASHERS + 0xFF149B, //9 VECT_ALARMSET + 0xFF1033, //10 ? + 0xFF1487, //11 VECT_ALARMDOWNSET + 0xFF731F, //12 ? + 0xFF70CA, //13 VECT_FLASHPROTECT + 0xFF17C4, //14 VECT_GEMODESET + 0xFF1032, //15 ? + + 0xFF2BBD, //0x10 VECT_COMINIT + 0xFF2C0C, //0x11 VECT_COMSENDSTART + 0xFF2C44, //0x12 VECT_COMRECIVESTART + 0xFF2C86, //0x13 VECT_COMCREATEDATA + 0xFF2CB4, //0x14 VECT_COMGETDATA + 0xFF2D27, //0x15 VECT_COMONRTS + 0xFF2D33, //0x16 VECT_COMOFFRTS + 0xFF2D3A, //0x17 VECT_COMSENDSTATUS + 0xFF2D4E, //0x18 VECT_COMRECIVESTATUS + 0xFF2D6C, //0x19 VECT_COMCREATEBUFDATA + 0xFF2D85, //0x1a VECT_COMGETBUFDATA + }; + + //System Call Table, install iBIOSHLE instructions + for (i = 0; i <= 0x1A; i++) + { + MDFN_en32lsb(&ngpc_bios[0xFE00 + (i * 4)], vectable[i]); + ngpc_bios[vectable[i] & 0xFFFF] = 0x1F; //iBIOSHLE + } + + //System Font + memcpy(ngpc_bios + 0x8DCF, font, 0x800); + + //Default Interrupt handler + ngpc_bios[0x23DF] = 0x07; //RETI + + // ========== + + //Install a Quick and Dirty Bios + ngpc_bios[0xFFFE] = 0x68; // - JR 0xFFFFFE (Infinite loop!) + ngpc_bios[0xFFFF] = 0xFE; + + return TRUE; //Success +} + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/bios.h b/Mednafen/mednafen/ngp/bios.h new file mode 100644 index 0000000000..a8bf3839cd --- /dev/null +++ b/Mednafen/mednafen/ngp/bios.h @@ -0,0 +1,52 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + bios.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +18 AUG 2002 - neopop_uk +======================================= +- Moved reset() and biosInstall() to neopop.h + +//--------------------------------------------------------------------------- +*/ + +#ifndef __NEOPOP_BIOS__ +#define __NEOPOP_BIOS__ +//============================================================================= + +extern uint8 ngpc_bios[0x10000]; + +void iBIOSHLE(void); + +void biosDecode(int function); +void BIOSHLE_Reset(void); +int BIOSHLE_StateAction(StateMem *sm, int load, int data_only); + +//============================================================================= +#endif + diff --git a/Mednafen/mednafen/ngp/biosHLE.cpp b/Mednafen/mednafen/ngp/biosHLE.cpp new file mode 100644 index 0000000000..3720cc0c64 --- /dev/null +++ b/Mednafen/mednafen/ngp/biosHLE.cpp @@ -0,0 +1,627 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "bios.h" +#include "mem.h" +#include "flash.h" +#include "dma.h" +#include "interrupt.h" + + +static uint8 CacheIntPrio[0xB]; // Iinterrupt prio registers at 0x0070-0x007a don't have priority readable. + // This should probably be stored in BIOS work RAM somewhere instead of a separate array, but I don't know where! + + +void BIOSHLE_Reset(void) +{ + memset(CacheIntPrio, 0, sizeof(CacheIntPrio)); + CacheIntPrio[0] = 0x02; + CacheIntPrio[1] = 0x32; + + for(int x = 0; x < 0xB; x++) + storeB(0x70 + x, CacheIntPrio[x]); +} + +/* This is the custom HLE instruction. I considered it was the fastest and +most streamlined way of intercepting a bios call. The operation performed +is dependant on the current program counter. */ + +void iBIOSHLE(void) +{ + //Only works within the bios + if ((pc & 0xFF0000) != 0xFF0000) + return; + + pc --; //Compensate for processing this instruction. + + cycles = 8; //TODO: Correct cycle counts (or approx?) + + //if(pc != 0xff1222) + //printf("SPOON: %08x\n", pc); + + switch (pc & 0xffffff) + { + + //default: printf("SPOON: %08x\n", pc); break; + //VECT_SHUTDOWN + case 0xFF27A2: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + if (a != 0xBAADC0DE) + system_debug_message("VECT_SHUTDOWN: called before %06X", a); + push32(a); + } + + system_debug_stop(); +#endif + { + //Cheap bit of code to stop the message appearing repeatedly. + uint32 a = pop32(); + if (a != 0xBAADC0DE) + MDFN_printf("IDS_POWER"); + push32(0xBAADC0DE); //Sure is! + } + + return; //Don't pop a return address, stay here + + //VECT_CLOCKGEARSET + case 0xFF1030: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_CLOCKGEARSET: called before %06X", a); + push32(a); + } +#endif + //MDFN_printf("%d\n", rCodeB(0x35)); + //TODO + // if (rCodeB(0x35) > 0) + // system_message("Unsupported clock gear %d set\nPlease inform the author", rCodeB(0x35)); + + break; + + //VECT_RTCGET + case 0xFF1440: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_RTCGET: called before %06X", a); + push32(a); + } +#endif + + if (rCodeL(0x3C) < 0xC000) + { + //Copy data from hardware area + storeB(rCodeL(0x3C) + 0, loadB(0x91)); + storeB(rCodeL(0x3C) + 1, loadB(0x92)); + storeB(rCodeL(0x3C) + 2, loadB(0x93)); + storeB(rCodeL(0x3C) + 3, loadB(0x94)); + storeB(rCodeL(0x3C) + 4, loadB(0x95)); + storeB(rCodeL(0x3C) + 5, loadB(0x96)); + storeB(rCodeL(0x3C) + 6, loadB(0x97)); + } + + break; + + //? + //case 0xFF12B4: + // break; + + //VECT_INTLVSET + case 0xFF1222: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_INTLVSET: called before %06X", a); + push32(a); + } +#endif + + { + + uint8 level = rCodeB(0x35); //RB3 + uint8 interrupt = rCodeB(0x34); //RC3 + + // 0 - Interrupt from RTC alarm + // 1 - Interrupt from the Z80 CPU + // 2 - Interrupt from the 8 bit timer 0 + // 3 - Interrupt from the 8 bit timer 1 + // 4 - Interrupt from the 8 bit timer 2 + // 5 - Interrupt from the 8 bit timer 3 + // 6 - End of transfer interrupt from DMA channel 0 + // 7 - End of transfer interrupt from DMA channel 1 + // 8 - End of transfer interrupt from DMA channel 2 + // 9 - End of transfer interrupt from DMA channel 3 + + switch(interrupt) + { + case 0x00: CacheIntPrio[0x0] = (CacheIntPrio[0x0] & 0xf0) | (level & 0x07); + storeB(0x70, CacheIntPrio[0x0]); + break; + + case 0x01: CacheIntPrio[0x1] = (CacheIntPrio[0x1] & 0x0f) | ((level & 0x07)<<4); + storeB(0x71, CacheIntPrio[0x1]); + break; + + case 0x02: CacheIntPrio[0x3] = (CacheIntPrio[0x3] & 0xf0) | (level & 0x07); + storeB(0x73, CacheIntPrio[0x3]); + break; + + case 0x03: CacheIntPrio[0x3] = (CacheIntPrio[0x3] & 0x0f) | ((level & 0x07)<<4); + storeB(0x73, CacheIntPrio[0x3]); + break; + + case 0x04: CacheIntPrio[0x4] = (CacheIntPrio[0x4] & 0xf0) | (level & 0x07); + storeB(0x74, CacheIntPrio[0x4]); + break; + + case 0x05: CacheIntPrio[0x4] = (CacheIntPrio[0x4] & 0x0f) | ((level & 0x07)<<4); + storeB(0x74, CacheIntPrio[0x4]); + break; + + case 0x06: CacheIntPrio[0x9] = (CacheIntPrio[0x9] & 0xf0) | (level & 0x07); + storeB(0x79, CacheIntPrio[0x9]); + break; + + case 0x07: CacheIntPrio[0x9] = (CacheIntPrio[0x9] & 0x0f) | ((level & 0x07)<<4); + storeB(0x79, CacheIntPrio[0x9]); + break; + + case 0x08: CacheIntPrio[0xa] = (CacheIntPrio[0xa] & 0xf0) | (level & 0x07); + storeB(0x7a, CacheIntPrio[0xa]); + break; + + case 0x09: CacheIntPrio[0xa] = (CacheIntPrio[0xa] & 0x0f) | ((level & 0x07)<<4); + storeB(0x7a, CacheIntPrio[0xa]); + break; + default: puts("DOH"); break; + } + } + break; + + //VECT_SYSFONTSET + case 0xFF8D8A: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_SYSFONTSET: called before %06X", a); + push32(a); + } +#endif + { + uint8 a,b,c, j; + uint16 i, dst = 0xA000; + + b = rCodeB(0x30) >> 4; + a = rCodeB(0x30) & 3; + + for (i = 0; i < 0x800; i++) + { + c = ngpc_bios[0x8DCF + i]; + + for (j = 0; j < 8; j++, c<<=1) + { + uint16 data16; + + data16 = loadW(dst); + data16 <<= 2; + storeW(dst, data16); + + if (c & 0x80) storeB(dst, loadB(dst) | a); + else storeB(dst, loadB(dst) | b); + } + + dst += 2; + } + } + + break; + + //VECT_FLASHWRITE + case 0xFF6FD8: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_FLASHWRITE: called before %06X", a); + push32(a); + } +#endif + { + uint32 i, bank = 0x200000; + + //Select HI rom? + if (rCodeB(0x30) == 1) + bank = 0x800000; + +#ifdef NEOPOP_DEBUG + if (filter_bios) + system_debug_message("VECT_FLASHWRITE: Copy %06X -> %06X, %d bytes", + rCodeL(0x3C), rCodeL(0x38) + bank, rCodeW(0x34) * 256); +#endif + + memory_flash_error = FALSE; + memory_unlock_flash_write = TRUE; + //Copy as 32 bit values for speed + for (i = 0; i < rCodeW(0x34) * 64ul; i++) + storeL(rCodeL(0x38) + bank + (i * 4), loadL(rCodeL(0x3C) + (i * 4))); + memory_unlock_flash_write = FALSE; + + if (memory_flash_error) + { +#ifdef NEOPOP_DEBUG + if (filter_bios) + system_debug_message("VECT_FLASHWRITE: Error"); +#endif + rCodeB(0x30) = 0xFF; //RA3 = SYS_FAILURE + } + else + { + uint32 address = rCodeL(0x38); + if (rCodeB(0x30) == 1) + address += 0x800000; + else + address += 0x200000; + + //Save this data to an external file + flash_write(address, rCodeW(0x34) * 256); + + rCodeB(0x30) = 0; //RA3 = SYS_SUCCESS + } + } + + break; + + //VECT_FLASHALLERS + case 0xFF7042: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_FLASHALLERS: called before %06X", a); + push32(a); + } +#endif + //TODO + rCodeB(0x30) = 0; //RA3 = SYS_SUCCESS + break; + + //VECT_FLASHERS + case 0xFF7082: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_FLASHERS: called before %06X", a); + push32(a); + } +#endif +#ifdef NEOPOP_DEBUG + if (filter_bios) + system_debug_message("VECT_FLASHERS: bank %d, block %d (?)", rCodeB(0x30), rCodeB(0x35)); +#endif + //TODO + rCodeB(0x30) = 0; //RA3 = SYS_SUCCESS + break; + + //VECT_ALARMSET + case 0xFF149B: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_ALARMSET: called before %06X", a); + push32(a); + } +#endif + //TODO + rCodeB(0x30) = 0; //RA3 = SYS_SUCCESS + break; + + //? + //case 0xFF1033: break; + + //VECT_ALARMDOWNSET + case 0xFF1487: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_ALARMDOWNSET: called before %06X", a); + push32(a); + } +#endif + //TODO + rCodeB(0x30) = 0; //RA3 = SYS_SUCCESS + break; + + //? + //case 0xFF731F: break; + + //VECT_FLASHPROTECT + case 0xFF70CA: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_FLASHPROTECT: called before %06X", a); + push32(a); + } +#endif + //TODO + rCodeB(0x30) = 0; //RA3 = SYS_SUCCESS + break; + + //VECT_GEMODESET + case 0xFF17C4: +#ifdef NEOPOP_DEBUG + if (filter_bios) + { + uint32 a = pop32(); + system_debug_message("VECT_GEMODESET: called before %06X", a); + push32(a); + } +#endif + //TODO + break; + + //? + //case 0xFF1032: break; + + //VECT_COMINIT + case 0xFF2BBD: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMINIT: called before %06X", a); + push32(a); + } +#endif + // Nothing to do. + rCodeB(0x30) = 0; //RA3 = COM_BUF_OK + break; + + //VECT_COMSENDSTART + case 0xFF2C0C: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMSENDSTART: called before %06X", a); + push32(a); + } +#endif + // Nothing to do. + break; + + //VECT_COMRECIVESTART + case 0xFF2C44: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMRECIVESTART: called before %06X", a); + push32(a); + } +#endif + // Nothing to do. + break; + + //VECT_COMCREATEDATA + case 0xFF2C86: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMCREATEDATA: called before %06X", a); + push32(a); + } +#endif + { + //Write the byte + uint8 data = rCodeB(0x35); + system_comms_write(data); + } + + //Restore $PC after BIOS-HLE instruction + pc = pop32(); + + TestIntHDMA(11, 0x18); + + //Always COM_BUF_OK because the write call always succeeds. + rCodeB(0x30) = 0x0; //RA3 = COM_BUF_OK + return; + + //VECT_COMGETDATA + case 0xFF2CB4: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMGETDATA: called before %06X", a); + push32(a); + } +#endif + { + uint8 data; + + if (system_comms_read(&data)) + { + rCodeB(0x30) = 0; //COM_BUF_OK + rCodeB(0x35) = data; + + pc = pop32(); + + //Comms. Read interrupt + storeB(0x50, data); + TestIntHDMA(12, 0x19); + + return; + } + else + { + rCodeB(0x30) = 1; //COM_BUF_EMPTY + } + } + + break; + + //VECT_COMONRTS + case 0xFF2D27: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMONRTS: called before %06X", a); + push32(a); + } +#endif + storeB(0xB2, 0); + break; + + //VECT_COMOFFRTS + case 0xFF2D33: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMOFFRTS: called before %06X", a); + push32(a); + } +#endif + storeB(0xB2, 1); + break; + + //VECT_COMSENDSTATUS + case 0xFF2D3A: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMSENDSTATUS: called before %06X", a); + push32(a); + } +#endif + // Nothing to do. + rCodeW(0x30) = 0; //Send Buffer Count, never any pending data! + break; + + //VECT_COMRECIVESTATUS + case 0xFF2D4E: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMRECIVESTATUS: called before %06X", a); + push32(a); + } +#endif + + // Receive Buffer Count + rCodeW(0x30) = system_comms_read(NULL); + + break; + + //VECT_COMCREATEBUFDATA + case 0xFF2D6C: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMCREATEBUFDATA: called before %06X", a); + push32(a); + } +#endif + pc = pop32(); + + while(rCodeB(0x35) > 0) + { + uint8 data; + data = loadB(rCodeL(0x3C)); + + //Write data from (XHL3++) + system_comms_write(data); + rCodeL(0x3C)++; //Next data + + rCodeB(0x35)--; //RB3 = Count Left + } + + TestIntHDMA(11, 0x18); + return; + + //VECT_COMGETBUFDATA + case 0xFF2D85: +#ifdef NEOPOP_DEBUG + if (filter_comms) + { + uint32 a = pop32(); + system_debug_message("VECT_COMGETBUFDATA: called before %06X", a); + push32(a); + } +#endif + { + pc = pop32(); + + while(rCodeB(0x35) > 0) + { + uint8 data; + + if (system_comms_read(&data)) + { + //Read data into (XHL3++) + storeB(rCodeL(0x3C), data); + rCodeL(0x3C)++; //Next data + rCodeB(0x35)--; //RB3 = Count Left + + //Comms. Read interrupt + storeB(0x50, data); + TestIntHDMA(12, 0x19); + return; + } + else + break; + } + + } + + return; + } + + //RET + pc = pop32(); +} + +int BIOSHLE_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(CacheIntPrio, 0xB), + SFEND + }; + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "BHLE")) + return(0); + + return(1); +} + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/dma.cpp b/Mednafen/mednafen/ngp/dma.cpp new file mode 100644 index 0000000000..e25eb741b0 --- /dev/null +++ b/Mednafen/mednafen/ngp/dma.cpp @@ -0,0 +1,313 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + dma.c + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +25 JUL 2002 - neopop_uk +======================================= +- Removed incorrect quick-fix code and added new DMA_update functions + to process the dma values. +- Fixed setting of C and M registers +- Added source copy byte and word mode DMA, seems to be only ones used. + +26 JUL 2002 - neopop_uk +======================================= +- Added more DMA modes - "Kikouseki Unitron (J)" uses counter mode + and 4 byte memory to I/O transfer. +- Added load *from* dma control register. + +30 JUL 2002 - neopop_uk +======================================= +- Made DMA_update more secure in it's ability to detect unknown DMA modes. +- DMA mode and count are printed in decimal, for internal consistancy. + +01 AUG 2002 - neopop_uk +======================================= +- Re-written DMA_update for clarity, and added missing modes, + fixes "Super Real Mahjong" + +//--------------------------------------------------------------------------- +*/ + +#include "neopop.h" +#include "dma.h" +#include "mem.h" +#include "interrupt.h" + +//============================================================================= + +static uint32 dmaS[4], dmaD[4]; +static uint16 dmaC[4]; +static uint8 dmaM[4]; + +//============================================================================= + +void reset_dma(void) +{ + memset(dmaS, 0, sizeof(dmaS)); + memset(dmaD, 0, sizeof(dmaD)); + memset(dmaC, 0, sizeof(dmaC)); + memset(dmaM, 0, sizeof(dmaM)); +} + +//============================================================================= + +void DMA_update(int channel) +{ + uint8 mode = (dmaM[channel] & 0x1C) >> 2; + uint8 size = (dmaM[channel] & 0x03); //byte, word or long + + // Correct? + if (dmaC[channel] == 0) + return; + + switch (mode) + { + case 0: // Destination INC mode, I/O to Memory transfer + switch(size) + { + case 0: storeB(dmaD[channel], loadB(dmaS[channel])); + dmaD[channel] += 1; //Byte increment + break; + + case 1: storeW(dmaD[channel], loadW(dmaS[channel])); + dmaD[channel] += 2; //Word increment + break; + + case 2: storeL(dmaD[channel], loadL(dmaS[channel])); + dmaD[channel] += 4; //Long increment + break; + } + break; + + case 1: // Destination DEC mode, I/O to Memory transfer + switch(size) + { + case 0: storeB(dmaD[channel], loadB(dmaS[channel])); + dmaD[channel] -= 1; //Byte decrement + break; + + case 1: storeW(dmaD[channel], loadW(dmaS[channel])); + dmaD[channel] -= 2; //Word decrement + break; + + case 2: storeL(dmaD[channel], loadL(dmaS[channel])); + dmaD[channel] -= 4; //Long decrement + break; + } + break; + + case 2: // Source INC mode, Memory to I/O transfer + switch(size) + { + case 0: storeB(dmaD[channel], loadB(dmaS[channel])); + dmaS[channel] += 1; //Byte increment + break; + + case 1: storeW(dmaD[channel], loadW(dmaS[channel])); + dmaS[channel] += 2; //Word increment + break; + + case 2: storeL(dmaD[channel], loadL(dmaS[channel])); + dmaS[channel] += 4; //Long increment + break; + } + break; + + case 3: // Source DEC mode, Memory to I/O transfer + switch(size) + { + case 0: storeB(dmaD[channel], loadB(dmaS[channel])); + dmaS[channel] -= 1; //Byte decrement + break; + + case 1: storeW(dmaD[channel], loadW(dmaS[channel])); + dmaS[channel] -= 2; //Word decrement + break; + + case 2: storeL(dmaD[channel], loadL(dmaS[channel])); + dmaS[channel] -= 4; //Long decrement + break; + } + break; + + case 4: // Fixed Address Mode + switch(size) + { + case 0: storeB(dmaD[channel], loadB(dmaS[channel])); + break; + + case 1: storeW(dmaD[channel], loadW(dmaS[channel])); + break; + + case 2: storeL(dmaD[channel], loadL(dmaS[channel])); + break; + } + break; + + case 5: // Counter Mode + dmaS[channel] ++; + break; + + default: + MDFN_printf("Bad DMA mode %d\nPlease report this to the author.", dmaM[channel]); + return; + } + + // Perform common counter decrement, + // vector clearing, and interrupt handling. + + dmaC[channel] --; + if (dmaC[channel] == 0) + { + interrupt(14 + channel); + storeB(0x7C + channel, 0); + } +} + +//============================================================================= + +void dmaStoreB(uint8 cr, uint8 data) +{ + switch(cr) + { + case 0x22: dmaM[0] = data; break; + case 0x26: dmaM[1] = data; break; + case 0x2A: dmaM[2] = data; break; + case 0x2E: dmaM[3] = data; break; + + default: + MDFN_printf("dmaStoreB: Unknown register 0x%02X <- %02X\nPlease report this to the author.\n", cr, data); + break; + } +} + +void dmaStoreW(uint8 cr, uint16 data) +{ + switch(cr) + { + case 0x20: dmaC[0] = data; break; + case 0x24: dmaC[1] = data; break; + case 0x28: dmaC[2] = data; break; + case 0x2C: dmaC[3] = data; break; + + default: + MDFN_printf("dmaStoreW: Unknown register 0x%02X <- %04X\nPlease report this to the author.\n", cr, data); + break; + } +} + +void dmaStoreL(uint8 cr, uint32 data) +{ + switch(cr) + { + case 0x00: dmaS[0] = data; break; + case 0x04: dmaS[1] = data; break; + case 0x08: dmaS[2] = data; break; + case 0x0C: dmaS[3] = data; break; + + case 0x10: dmaD[0] = data; break; + case 0x14: dmaD[1] = data; break; + case 0x18: dmaD[2] = data; break; + case 0x1C: dmaD[3] = data; break; + + default: + MDFN_printf("dmaStoreL: Unknown register 0x%02X <- %08X\nPlease report this to the author.\n", cr, data); + break; + } +} + +//============================================================================= + +uint8 dmaLoadB(uint8 cr) +{ + + switch(cr) + { + case 0x22: return dmaM[0]; break; + case 0x26: return dmaM[1]; break; + case 0x2A: return dmaM[2]; break; + case 0x2E: return dmaM[3]; break; + + default: + MDFN_printf("dmaLoadB: Unknown register 0x%02X\nPlease report this to the author.", cr); + return 0; + } +} + +uint16 dmaLoadW(uint8 cr) +{ + switch(cr) + { + case 0x20: return dmaC[0]; break; + case 0x24: return dmaC[1]; break; + case 0x28: return dmaC[2]; break; + case 0x2C: return dmaC[3]; break; + + default: + MDFN_printf("dmaLoadW: Unknown register 0x%02X\nPlease report this to the author.", cr); + return 0; + } +} + +uint32 dmaLoadL(uint8 cr) +{ + switch(cr) + { + case 0x00: return dmaS[0]; break; + case 0x04: return dmaS[1]; break; + case 0x08: return dmaS[2]; break; + case 0x0C: return dmaS[3]; break; + + case 0x10: return dmaD[0]; break; + case 0x14: return dmaD[1]; break; + case 0x18: return dmaD[2]; break; + case 0x1C: return dmaD[3]; break; + + default: + MDFN_printf("dmaLoadL: Unknown register 0x%02X\nPlease report this to the author.", cr); + return 0; + } +} + +int MDFNNGPCDMA_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY32N(dmaS, 4, "DMAS"), + SFARRAY32N(dmaD, 4, "DMAD"), + SFARRAY16N(dmaC, 4, "DMAC"), + SFARRAYN(dmaM, 4, "DMAM"), + SFEND + }; + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "DMA")) + return(0); + + return(1); +} diff --git a/Mednafen/mednafen/ngp/dma.h b/Mednafen/mednafen/ngp/dma.h new file mode 100644 index 0000000000..9a57f97aa1 --- /dev/null +++ b/Mednafen/mednafen/ngp/dma.h @@ -0,0 +1,57 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +/* +//--------------------------------------------------------------------------- +//========================================================================= + + dma.h + +//========================================================================= +//--------------------------------------------------------------------------- + + History of changes: + =================== + +20 JUL 2002 - neopop_uk +======================================= +- Cleaned and tidied up for the source release + +25 JUL 2002 - neopop_uk +======================================= +- Added function prototype for DMA_update + +//--------------------------------------------------------------------------- +*/ + +#ifndef __NEOPOP_DMA__ +#define __NEOPOP_DMA__ +//============================================================================= + +void reset_dma(void); + +void DMA_update(int channel); + +uint8 dmaLoadB(uint8 cr); +uint16 dmaLoadW(uint8 cr); +uint32 dmaLoadL(uint8 cr); + +void dmaStoreB(uint8 cr, uint8 data); +void dmaStoreW(uint8 cr, uint16 data); +void dmaStoreL(uint8 cr, uint32 data); + +int MDFNNGPCDMA_StateAction(StateMem *sm, int load, int data_only); + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/flash.cpp b/Mednafen/mednafen/ngp/flash.cpp new file mode 100644 index 0000000000..fd5b41418a --- /dev/null +++ b/Mednafen/mednafen/ngp/flash.cpp @@ -0,0 +1,354 @@ +/* + FIXME: + File format is not endian-safe. + + Still possible for corrupt/malicious save game data to cause a crash, from blindly reading past the end of the buffer. +*/ + +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "flash.h" +#include "mem.h" + +#include + +//----------------------------------------------------------------------------- +// Local Definitions +//----------------------------------------------------------------------------- +//This value is used to verify flash data - it is set to the +//version number that the flash description was modified for. + +#define FLASH_VALID_ID 0x0053 + +//Number of different flash blocks, this should be enough. + +#define FLASH_MAX_BLOCKS 256 + +typedef struct +{ + //Flash Id + uint16 valid_flash_id; // = FLASH_VALID_ID + + uint16 block_count; //Number of flash data blocks + + uint32 total_file_length; // header + block[0 - block_count] + +} FlashFileHeader; + +typedef struct +{ + uint32 start_address; // 24 bit address + uint16 data_length; // length of following data + + //Followed by data_length bytes of the actual data. + +} FlashFileBlockHeader; + +//----------------------------------------------------------------------------- +// Local Data +//----------------------------------------------------------------------------- +static FlashFileBlockHeader blocks[FLASH_MAX_BLOCKS]; +static uint16 block_count; + +//============================================================================= + +//----------------------------------------------------------------------------- +// optimise_blocks() +//----------------------------------------------------------------------------- +static void optimise_blocks(void) +{ + int i, j; + + // Bubble Sort by address + for (i = 0; i < block_count - 1; i++) + { + for (j = i+1; j < block_count; j++) + { + //Swap? + if (blocks[i].start_address > blocks[j].start_address) + { + uint32 temp32; + uint16 temp16; + + temp32 = blocks[i].start_address; + blocks[i].start_address = blocks[j].start_address; + blocks[j].start_address = temp32; + + temp16 = blocks[i].data_length; + blocks[i].data_length = blocks[j].data_length; + blocks[j].data_length = temp16; + } + } + } + + //Join contiguous blocks + //Only advance 'i' if required, this will allow subsequent + //blocks to be compared to the newly expanded block. + for (i = 0; i < block_count - 1; /**/) + { + //Next block lies within (or borders) this one? + if (blocks[i+1].start_address <= + (blocks[i].start_address + blocks[i].data_length)) + { + //Extend the first block + blocks[i].data_length = + (uint16)((blocks[i+1].start_address + blocks[i+1].data_length) - + blocks[i].start_address); + + //Remove the next one. + for (j = i+2; j < block_count; j++) + { + blocks[j-1].start_address = blocks[j].start_address; + blocks[j-1].data_length = blocks[j].data_length; + } + block_count --; + } + else + { + i++; // Try the next block + } + } +} + +static void do_flash_read(const uint8 *flashdata) +{ + FlashFileHeader header; + const uint8 *fileptr; + uint16 i; + uint32 j; + bool PREV_memory_unlock_flash_write = memory_unlock_flash_write; // kludge, hack, FIXME + + memcpy(&header, flashdata, sizeof(header)); + + if(header.block_count > FLASH_MAX_BLOCKS) + { + throw MDFN_Error(0, _("FLASH header block_count(%u) > FLASH_MAX_BLOCKS!"), header.block_count); + } + + //Read header + block_count = header.block_count; + fileptr = flashdata + sizeof(FlashFileHeader); + + //Copy blocks + memory_unlock_flash_write = TRUE; + for (i = 0; i < block_count; i++) + { + FlashFileBlockHeader* current = (FlashFileBlockHeader*)fileptr; + fileptr += sizeof(FlashFileBlockHeader); + + blocks[i].start_address = current->start_address; + blocks[i].data_length = current->data_length; + + //Copy data + for (j = 0; j < blocks[i].data_length; j++) + { + storeB(blocks[i].start_address + j, *fileptr); + fileptr++; + } + } + memory_unlock_flash_write = PREV_memory_unlock_flash_write; + + optimise_blocks(); //Optimise + +#if 0 + //Output block list... + for (i = 0; i < block_count; i++) + printf("flash block: %06X, %d bytes\n", + blocks[i].start_address, blocks[i].data_length); +#endif +} + + +void FLASH_LoadNV(void) +{ + FlashFileHeader header; + PODFastVector flashdata; + + //Initialise the internal flash configuration + block_count = 0; + + //Read flash buffer header + if (system_io_flash_read((uint8*)&header, sizeof(FlashFileHeader)) == FALSE) + return; //Silent failure - no flash data yet. + + //Verify correct flash id + if (header.valid_flash_id != FLASH_VALID_ID) + { + throw MDFN_Error(0, _("FLASH header ID is bad!")); + } + + if(header.total_file_length < sizeof(FlashFileHeader) || header.total_file_length > 16384 * 1024) + { + throw MDFN_Error(0, _("FLASH header total_file_length is bad!")); + } + + //Read the flash data + flashdata.resize(header.total_file_length); + system_io_flash_read(&flashdata[0], flashdata.size()); + + do_flash_read(&flashdata[0]); +} + + +//----------------------------------------------------------------------------- +// flash_write() +//----------------------------------------------------------------------------- +void flash_write(uint32 start_address, uint16 length) +{ + uint16 i; + + //Now we need a new flash command before the next flash write will work! + memory_flash_command = FALSE; + +// system_debug_message("flash write: %06X, %d bytes", start_address, length); + + for (i = 0; i < block_count; i++) + { + //Got this block with enough bytes to cover it + if (blocks[i].start_address == start_address && + blocks[i].data_length >= length) + { + return; //Nothing to do, block already registered. + } + + //Got this block with but it's length is too short + if (blocks[i].start_address == start_address && + blocks[i].data_length < length) + { + blocks[i].data_length = length; //Enlarge block updating. + return; + } + } + + if(block_count >= FLASH_MAX_BLOCKS) + { + MDFN_PrintError(_("[FLASH] Block list overflow!")); + return; + } + else + { + // New block needs to be added + blocks[block_count].start_address = start_address; + blocks[block_count].data_length = length; + block_count++; + } +} + +static void make_flash_commit(PODFastVector &flashdata) +{ + FlashFileHeader header; + uint8 *fileptr; + + flashdata.clear(); + + //No flash data? + if (block_count == 0) + return; + + //Optimise before writing + optimise_blocks(); + + //Build a header; + header.valid_flash_id = FLASH_VALID_ID; + header.block_count = block_count; + header.total_file_length = sizeof(FlashFileHeader); + for(int i = 0; i < block_count; i++) + { + header.total_file_length += sizeof(FlashFileBlockHeader); + header.total_file_length += blocks[i].data_length; + } + + //Write the flash data + flashdata.resize(header.total_file_length); + + //Copy header + memcpy(&flashdata[0], &header, sizeof(FlashFileHeader)); + fileptr = &flashdata[0] + sizeof(FlashFileHeader); + + //Copy blocks + for(int i = 0; i < block_count; i++) + { + memcpy(fileptr, &blocks[i], sizeof(FlashFileBlockHeader)); + fileptr += sizeof(FlashFileBlockHeader); + + //Copy data + for(uint32 j = 0; j < blocks[i].data_length; j++) + { + *fileptr = loadB(blocks[i].start_address + j); + fileptr++; + } + } +} + +void FLASH_SaveNV(void) +{ + PODFastVector flashdata; + + make_flash_commit(flashdata); + + if(flashdata.size() > 0) + { + system_io_flash_write(&flashdata[0], flashdata.size()); + } +} + + +void FLASH_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + uint32 FlashLength = 0; + PODFastVector flashdata; + + if(!load) + { + make_flash_commit(flashdata); + FlashLength = flashdata.size(); + } + + SFORMAT FINF_StateRegs[] = + { + SFVAR(FlashLength), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, FINF_StateRegs, "FINF"); + + if(!FlashLength) // No flash data to save, OR no flash data to load. + { + return; + } + + if(load) + { + if(FlashLength > 16384 * 1024) + FlashLength = 16384 * 1024; + + flashdata.resize(FlashLength); + } + + SFORMAT FLSH_StateRegs[] = + { + SFARRAYN(&flashdata[0], FlashLength, "flashdata"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, FLSH_StateRegs, "FLSH"); + + if(load) + { + memcpy(ngpc_rom.data, ngpc_rom.orig_data, ngpc_rom.length); // Restore FLASH/ROM data to its state before any writes to FLASH the game made(or were loaded from file). + do_flash_read(&flashdata[0]); + } +} diff --git a/Mednafen/mednafen/ngp/flash.h b/Mednafen/mednafen/ngp/flash.h new file mode 100644 index 0000000000..20f0fc3f34 --- /dev/null +++ b/Mednafen/mednafen/ngp/flash.h @@ -0,0 +1,27 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __NEOPOP_FLASH__ +#define __NEOPOP_FLASH__ +//============================================================================= + +//Marks flash blocks for saving. +void flash_write(uint32 start_address, uint16 length); + +void FLASH_LoadNV(void); +void FLASH_SaveNV(void); +void FLASH_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/gfx.cpp b/Mednafen/mednafen/ngp/gfx.cpp new file mode 100644 index 0000000000..da0ef87e90 --- /dev/null +++ b/Mednafen/mednafen/ngp/gfx.cpp @@ -0,0 +1,393 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "mem.h" +#include "gfx.h" +#include "interrupt.h" +#include "dma.h" + +NGPGFX_CLASS::NGPGFX_CLASS(void) +{ + layer_enable_setting = 1 | 2 | 4; +} + +NGPGFX_CLASS::~NGPGFX_CLASS() +{ + + +} + +void NGPGFX_CLASS::reset(void) +{ + memset(SPPLT, 0x7, sizeof(SPPLT)); + memset(SCRP1PLT, 0x7, sizeof(SCRP1PLT)); + memset(SCRP2PLT, 0x7, sizeof(SCRP2PLT)); + + raster_line = 0; + S1SO_H = 0; + S1SO_V = 0; + S2SO_H = 0; + S2SO_V = 0; + WBA_H = 0; + WBA_V = 0; + + WSI_H = 0xFF; + WSI_V = 0xFF; + + C_OVR = 0; + BLNK = 0; + + PO_H = 0; + PO_V = 0; + P_F = 0; + + BG_COL = 0x7; + CONTROL_2D = 0; + CONTROL_INT = 0; + SCREEN_PERIOD = 0xC6; + K2GE_MODE = 0; + + delayed_settings(); +} + +void NGPGFX_CLASS::power(void) +{ + reset(); + + memset(ScrollVRAM, 0, sizeof(ScrollVRAM)); + memset(CharacterRAM, 0, sizeof(CharacterRAM)); + memset(SpriteVRAM, 0, sizeof(SpriteVRAM)); + memset(SpriteVRAMColor, 0, sizeof(SpriteVRAMColor)); + memset(ColorPaletteRAM, 0, sizeof(ColorPaletteRAM)); +} + +void NGPGFX_CLASS::delayed_settings(void) +{ + //Window dimensions + winx = WBA_H; + winy = WBA_V; + winw = WSI_H; + winh = WSI_V; + + //Scroll Planes (Confirmed delayed) + scroll1x = S1SO_H; + scroll1y = S1SO_V; + + scroll2x = S2SO_H; + scroll2y = S2SO_V; + + //Sprite offset (Confirmed delayed) + scrollsprx = PO_H; + scrollspry = PO_V; + + //Plane Priority (Confirmed delayed) + planeSwap = P_F & 0x80; + + //Background colour register (Confirmed delayed) + bgc = BG_COL; + + //2D Control register (Confirmed delayed) + oowc = CONTROL_2D & 7; + negative = CONTROL_2D & 0x80; +} + +bool NGPGFX_CLASS::hint(void) +{ + //H_Int / Delayed settings + if ((raster_line < SCREEN_HEIGHT-1 || raster_line == SCREEN_PERIOD)) + { + delayed_settings(); //Get delayed settings + + //Allowed? + if (CONTROL_INT & 0x40) + return(1); + } + return(0); +} + +void NGPGFX_CLASS::set_pixel_format(const MDFN_PixelFormat &format) +{ + for(int x = 0; x < 4096; x++) + { + int r = (x & 0xF) * 17; + int g = ((x >> 4) & 0xF) * 17; + int b = ((x >> 8) & 0xF) * 17; + + ColorMap[x] = format.MakeColor(r, g, b); + } +} + +bool NGPGFX_CLASS::draw(MDFN_Surface *surface, bool skip) +{ + bool ret = 0; + + //Draw the scanline + if (raster_line < SCREEN_HEIGHT && !skip) + { + if (!K2GE_MODE) draw_scanline_colour(layer_enable_setting, raster_line); + else draw_scanline_mono(layer_enable_setting, raster_line); + + uint32 *dest = surface->pixels + surface->pitch32 * raster_line; + for(int x = 0; x < SCREEN_WIDTH; x++) + dest[x] = ColorMap[cfb_scanline[x] & 4095]; + } + raster_line++; + + //V_Int? + if (raster_line == SCREEN_HEIGHT) + { + BLNK = 1; + ret = 1; + + if(CONTROL_INT & 0x80) // (statusIFF() <= 4 + TestIntHDMA(5, 0x0B); + } + + //End of V_Int + if(raster_line == SCREEN_PERIOD + 1) //Last scanline + 1 + { + raster_line = 0; + C_OVR = 0; + BLNK = 0; + } + + return(ret); +} + +int NGPGFX_CLASS::StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(raster_line), + SFVAR(S1SO_H), SFVAR(S1SO_V), SFVAR(S2SO_H), SFVAR(S2SO_V), + SFVAR(WBA_H), SFVAR(WBA_V), SFVAR(WSI_H), SFVAR(WSI_V), + SFVAR(C_OVR), SFVAR(BLNK), + SFVAR(PO_H), SFVAR(PO_V), + SFVAR(P_F), + SFVAR(BG_COL), + SFVAR(CONTROL_2D), + SFVAR(CONTROL_INT), + SFVAR(SCREEN_PERIOD), + SFVAR(K2GE_MODE), + + SFARRAY(SPPLT, 6), + SFARRAY(SCRP1PLT, 6), + SFARRAY(SCRP2PLT, 6), + + SFVAR(winx), SFVAR(winw), + SFVAR(winy), SFVAR(winh), + SFVAR(scroll1x), SFVAR(scroll1y), + SFVAR(scroll2x), SFVAR(scroll2y), + SFVAR(scrollsprx), SFVAR(scrollspry), + SFVAR(planeSwap), + SFVAR(bgc), SFVAR(oowc), + + SFVAR(negative), + + SFARRAY(ScrollVRAM, 4096), + SFARRAY(CharacterRAM, 8192), + SFARRAY(SpriteVRAM, 256), + SFARRAY(SpriteVRAMColor, 0x40), + SFARRAY(ColorPaletteRAM, 0x200), + + SFEND + }; + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "GFX")) + return(0); + + return(1); +} + +void NGPGFX_CLASS::SetLayerEnableMask(uint64 mask) +{ + layer_enable_setting = mask; +} + +//extern uint32 ngpc_soundTS; +void NGPGFX_CLASS::write8(uint32 address, uint8 data) +{ + //if(address >= 0x8032 && address <= 0x8035) + // printf("%08x %02x %d\n", address, data, ngpc_soundTS); + + if(address >= 0x9000 && address <= 0x9fff) + ScrollVRAM[address - 0x9000] = data; + else if(address >= 0xa000 && address <= 0xbfff) + CharacterRAM[address - 0xa000] = data; + else if(address >= 0x8800 && address <= 0x88ff) + SpriteVRAM[address - 0x8800] = data; + else if(address >= 0x8c00 && address <= 0x8c3f) + SpriteVRAMColor[address - 0x8c00] = data & 0x0f; + else if(address >= 0x8200 && address <= 0x83ff) + ColorPaletteRAM[address - 0x8200] = data; + else switch(address) + { + //default: printf("HuhW: %08x\n", address); break; + + case 0x8000: CONTROL_INT = data & 0xC0; break; + case 0x8002: WBA_H = data; break; + case 0x8003: WBA_V = data; break; + case 0x8004: WSI_H = data; break; + case 0x8005: WSI_V = data; break; + case 0x8006: SCREEN_PERIOD = data; break; + case 0x8012: CONTROL_2D = data & 0x87; break; + case 0x8020: PO_H = data; break; + case 0x8021: PO_V = data; break; + case 0x8030: P_F = data & 0x80; break; + case 0x8032: S1SO_H = data; break; + case 0x8033: S1SO_V = data; break; + case 0x8034: S2SO_H = data; break; + case 0x8035: S2SO_V = data; break; + + case 0x8101: SPPLT[0] = data & 0x7; break; + case 0x8102: SPPLT[1] = data & 0x7; break; + case 0x8103: SPPLT[2] = data & 0x7; break; + + case 0x8105: SPPLT[3] = data & 0x7; break; + case 0x8106: SPPLT[4] = data & 0x7; break; + case 0x8107: SPPLT[5] = data & 0x7; break; + + case 0x8109: SCRP1PLT[0] = data & 0x7; break; + case 0x810a: SCRP1PLT[1] = data & 0x7; break; + case 0x810b: SCRP1PLT[2] = data & 0x7; break; + + case 0x810d: SCRP1PLT[3] = data & 0x7; break; + case 0x810e: SCRP1PLT[4] = data & 0x7; break; + case 0x810f: SCRP1PLT[5] = data & 0x7; break; + + case 0x8111: SCRP2PLT[0] = data & 0x7; break; + case 0x8112: SCRP2PLT[1] = data & 0x7; break; + case 0x8113: SCRP2PLT[2] = data & 0x7; break; + + case 0x8115: SCRP2PLT[3] = data & 0x7; break; + case 0x8116: SCRP2PLT[4] = data & 0x7; break; + case 0x8117: SCRP2PLT[5] = data & 0x7; break; + + case 0x8118: BG_COL = data & 0xC7; break; + + case 0x87e0: if(data == 0x52) + { + puts("GEreset"); + reset(); + } + break; + case 0x87e2: K2GE_MODE = data & 0x80; break; + } +} + +void NGPGFX_CLASS::write16(uint32 address, uint16 data) +{ + write8(address, data & 0xFF); + write8(address + 1, data >> 8); +} + +#if 0 +namespace TLCS900H +{ + extern uint32 pc; +}; +#endif + +uint8 NGPGFX_CLASS::read8(uint32 address) +{ +#if 0 + if(address >= 0x8200 && address <= 0xbfff) + { + printf("[GFX] Read8: %08x -- %08x\n", address, TLCS900H::pc); + if(pc == 0x0028dd3d) //21) + { + TLCS900H::pc = 0x28DD15; + for(int x = 0; x < 256; x++) + puts(TLCS900h_disassemble()); + + abort(); + } + } +#endif + + if(address >= 0x9000 && address <= 0x9fff) + return(ScrollVRAM[address - 0x9000]); + else if(address >= 0xa000 && address <= 0xbfff) + return(CharacterRAM[address - 0xa000]); + else if(address >= 0x8800 && address <= 0x88ff) + return(SpriteVRAM[address - 0x8800]); + else if(address >= 0x8c00 && address <= 0x8c3f) + return(SpriteVRAMColor[address - 0x8c00]); + else if(address >= 0x8200 && address <= 0x83ff) + return(ColorPaletteRAM[address - 0x8200]); + else switch(address) + { + //default: printf("Huh: %08x\n", address); break; + case 0x8000: return(CONTROL_INT); + case 0x8002: return(WBA_H); + case 0x8003: return(WBA_V); + case 0x8004: return(WSI_H); + case 0x8005: return(WSI_V); + case 0x8006: return(SCREEN_PERIOD); + + case 0x8008: return( (uint8)((abs(TIMER_HINT_RATE - (int)timer_hint)) >> 2) ); //RAS.H read (Simulated horizontal raster position) + case 0x8009: return(raster_line); + case 0x8010: return((C_OVR ? 0x80 : 0x00) | (BLNK ? 0x40 : 0x00)); + case 0x8012: return(CONTROL_2D); + case 0x8020: return(PO_H); + case 0x8021: return(PO_V); + case 0x8030: return(P_F); + case 0x8032: return(S1SO_H); + case 0x8033: return(S1SO_V); + case 0x8034: return(S2SO_H); + case 0x8035: return(S2SO_V); + + case 0x8101: return(SPPLT[0]); break; + case 0x8102: return(SPPLT[1]); break; + case 0x8103: return(SPPLT[2]); break; + + case 0x8105: return(SPPLT[3]); break; + case 0x8106: return(SPPLT[4]); break; + case 0x8107: return(SPPLT[5]); break; + + case 0x8108: return(SCRP1PLT[0]); break; + case 0x8109: return(SCRP1PLT[1]); break; + case 0x810a: return(SCRP1PLT[2]); break; + + case 0x810d: return(SCRP1PLT[3]); break; + case 0x810e: return(SCRP1PLT[4]); break; + case 0x810f: return(SCRP1PLT[5]); break; + + case 0x8111: return(SCRP2PLT[0]); break; + case 0x8112: return(SCRP2PLT[1]); break; + case 0x8113: return(SCRP2PLT[2]); break; + + case 0x8115: return(SCRP2PLT[3]); break; + case 0x8116: return(SCRP2PLT[4]); break; + case 0x8117: return(SCRP2PLT[5]); break; + + case 0x8118: return(BG_COL); + + case 0x87e2: return(K2GE_MODE); + } + + return(0); +} + +uint16 NGPGFX_CLASS::read16(uint32 address) +{ + uint16 ret; + + ret = read8(address); + ret |= read8(address + 1) << 8; + + return(ret); +} + diff --git a/Mednafen/mednafen/ngp/gfx.h b/Mednafen/mednafen/ngp/gfx.h new file mode 100644 index 0000000000..ac856d3154 --- /dev/null +++ b/Mednafen/mednafen/ngp/gfx.h @@ -0,0 +1,107 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __NEOPOP_GFX__ +#define __NEOPOP_GFX__ +//============================================================================= + +#define ZDEPTH_BACK_SPRITE 2 +#define ZDEPTH_BACKGROUND_SCROLL 3 +#define ZDEPTH_MIDDLE_SPRITE 4 +#define ZDEPTH_FOREGROUND_SCROLL 5 +#define ZDEPTH_FRONT_SPRITE 6 + +class NGPGFX_CLASS +{ + public: + + NGPGFX_CLASS(); + ~NGPGFX_CLASS(); + + void write8(uint32 address, uint8 data); + void write16(uint32 address, uint16 data); + + uint8 read8(uint32 address); + uint16 read16(uint32 address); + + int StateAction(StateMem *sm, int load, int data_only); + void SetLayerEnableMask(uint64 mask); + void set_pixel_format(const MDFN_PixelFormat &format); + + bool draw(MDFN_Surface *surface, bool skip); + bool hint(void); + + void power(void); + + private: + + // TODO: Alignment for faster memset + uint8 zbuffer[256]; // __attribute__ ((aligned (8))); //Line z-buffer + uint16 cfb_scanline[256]; // __attribute__ ((aligned (8))); + + uint8 winx, winw; + uint8 winy, winh; + uint8 scroll1x, scroll1y; + uint8 scroll2x, scroll2y; + uint8 scrollsprx, scrollspry; + uint8 planeSwap; + uint8 bgc, oowc, negative; + + void reset(void); + void delayed_settings(void); + + void draw_scanline_colour(int, int); + void drawColourPattern(uint8 screenx, uint16 tile, uint8 tiley, uint16 mirror, + uint16* palette_ptr, uint8 pal, uint8 depth); + void draw_colour_scroll1(uint8 depth, int ngpc_scanline); + void draw_colour_scroll2(uint8 depth, int ngpc_scanline); + + void draw_scanline_mono(int, int); + void MonoPlot(uint8 x, uint8* palette_ptr, uint16 pal_hi, uint8 index, uint8 depth); + void drawMonoPattern(uint8 screenx, uint16 tile, uint8 tiley, uint16 mirror, + uint8* palette_ptr, uint16 pal, uint8 depth); + void draw_mono_scroll1(uint8 depth, int ngpc_scanline); + void draw_mono_scroll2(uint8 depth, int ngpc_scanline); + + + + uint8 ScrollVRAM[4096]; // 9000-9fff + uint8 CharacterRAM[8192]; // a000-bfff + uint8 SpriteVRAM[256]; // 8800-88ff + uint8 SpriteVRAMColor[0x40]; // 8C00-8C3F + uint8 ColorPaletteRAM[0x200]; // 8200-83ff + + uint8 SPPLT[6]; + uint8 SCRP1PLT[6]; + uint8 SCRP2PLT[6]; + + uint8 raster_line; + uint8 S1SO_H, S1SO_V, S2SO_H, S2SO_V; + uint8 WBA_H, WBA_V, WSI_H, WSI_V; + bool C_OVR, BLNK; + uint8 PO_H, PO_V; + uint8 P_F; + uint8 BG_COL; + uint8 CONTROL_2D; + uint8 CONTROL_INT; + uint8 SCREEN_PERIOD; + uint8 K2GE_MODE; + + uint32 ColorMap[4096]; + + int layer_enable_setting; +}; + +#endif + diff --git a/Mednafen/mednafen/ngp/gfx_scanline_colour.cpp b/Mednafen/mednafen/ngp/gfx_scanline_colour.cpp new file mode 100644 index 0000000000..c2ddf44f57 --- /dev/null +++ b/Mednafen/mednafen/ngp/gfx_scanline_colour.cpp @@ -0,0 +1,265 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "mem.h" +#include "gfx.h" + +//============================================================================= + +static const unsigned char mirrored[] = { + 0x00, 0x40, 0x80, 0xc0, 0x10, 0x50, 0x90, 0xd0, + 0x20, 0x60, 0xa0, 0xe0, 0x30, 0x70, 0xb0, 0xf0, + 0x04, 0x44, 0x84, 0xc4, 0x14, 0x54, 0x94, 0xd4, + 0x24, 0x64, 0xa4, 0xe4, 0x34, 0x74, 0xb4, 0xf4, + 0x08, 0x48, 0x88, 0xc8, 0x18, 0x58, 0x98, 0xd8, + 0x28, 0x68, 0xa8, 0xe8, 0x38, 0x78, 0xb8, 0xf8, + 0x0c, 0x4c, 0x8c, 0xcc, 0x1c, 0x5c, 0x9c, 0xdc, + 0x2c, 0x6c, 0xac, 0xec, 0x3c, 0x7c, 0xbc, 0xfc, + 0x01, 0x41, 0x81, 0xc1, 0x11, 0x51, 0x91, 0xd1, + 0x21, 0x61, 0xa1, 0xe1, 0x31, 0x71, 0xb1, 0xf1, + 0x05, 0x45, 0x85, 0xc5, 0x15, 0x55, 0x95, 0xd5, + 0x25, 0x65, 0xa5, 0xe5, 0x35, 0x75, 0xb5, 0xf5, + 0x09, 0x49, 0x89, 0xc9, 0x19, 0x59, 0x99, 0xd9, + 0x29, 0x69, 0xa9, 0xe9, 0x39, 0x79, 0xb9, 0xf9, + 0x0d, 0x4d, 0x8d, 0xcd, 0x1d, 0x5d, 0x9d, 0xdd, + 0x2d, 0x6d, 0xad, 0xed, 0x3d, 0x7d, 0xbd, 0xfd, + 0x02, 0x42, 0x82, 0xc2, 0x12, 0x52, 0x92, 0xd2, + 0x22, 0x62, 0xa2, 0xe2, 0x32, 0x72, 0xb2, 0xf2, + 0x06, 0x46, 0x86, 0xc6, 0x16, 0x56, 0x96, 0xd6, + 0x26, 0x66, 0xa6, 0xe6, 0x36, 0x76, 0xb6, 0xf6, + 0x0a, 0x4a, 0x8a, 0xca, 0x1a, 0x5a, 0x9a, 0xda, + 0x2a, 0x6a, 0xaa, 0xea, 0x3a, 0x7a, 0xba, 0xfa, + 0x0e, 0x4e, 0x8e, 0xce, 0x1e, 0x5e, 0x9e, 0xde, + 0x2e, 0x6e, 0xae, 0xee, 0x3e, 0x7e, 0xbe, 0xfe, + 0x03, 0x43, 0x83, 0xc3, 0x13, 0x53, 0x93, 0xd3, + 0x23, 0x63, 0xa3, 0xe3, 0x33, 0x73, 0xb3, 0xf3, + 0x07, 0x47, 0x87, 0xc7, 0x17, 0x57, 0x97, 0xd7, + 0x27, 0x67, 0xa7, 0xe7, 0x37, 0x77, 0xb7, 0xf7, + 0x0b, 0x4b, 0x8b, 0xcb, 0x1b, 0x5b, 0x9b, 0xdb, + 0x2b, 0x6b, 0xab, 0xeb, 0x3b, 0x7b, 0xbb, 0xfb, + 0x0f, 0x4f, 0x8f, 0xcf, 0x1f, 0x5f, 0x9f, 0xdf, + 0x2f, 0x6f, 0xaf, 0xef, 0x3f, 0x7f, 0xbf, 0xff +}; + +//============================================================================= + + +void NGPGFX_CLASS::drawColourPattern(uint8 screenx, uint16 tile, uint8 tiley, uint16 mirror, + uint16* palette_ptr, uint8 pal, uint8 depth) +{ + int index, x, left, right, highmark, xx; + uint16 data16; + + x = screenx; + if (x > 0xf8) + x -= 256; + if (x >= SCREEN_WIDTH) + return; + + //Get the data for the "tiley'th" line of "tile". + index = MDFN_de16lsb(CharacterRAM + (tile * 16) + (tiley * 2)); + + //Horizontal Flip + if (mirror) + index = mirrored[(index & 0xff00)>>8] | (mirrored[(index & 0xff)] << 8); + + palette_ptr += pal << 2; + left = max(max(x, winx), 0); + right = x+7; + + highmark = min(winw+winx, SCREEN_WIDTH)-1; + + if (right > highmark) { + index >>= (right - highmark)*2; + right = highmark; + } + + for (xx=right; xx>=left; --xx,index>>=2) { + if (depth <= zbuffer[xx] || (index&3)==0) + continue; + zbuffer[xx] = depth; + + //Get the colour of the pixel + data16 = MDFN_de16lsb(&palette_ptr[index&3]); + + if (negative) + cfb_scanline[xx] = ~data16; + else + cfb_scanline[xx] = data16; + } +} + +void NGPGFX_CLASS::draw_colour_scroll1(uint8 depth, int ngpc_scanline) +{ + uint8 tx, row, line; + uint16 data16; + + line = ngpc_scanline + scroll1y; + row = line & 7; //Which row? + + //Draw Foreground scroll plane (Scroll 1) + for (tx = 0; tx < 32; tx++) + { + data16 = MDFN_de16lsb(ScrollVRAM + ((tx + ((line >> 3) << 5)) << 1)); + + //Draw the line of the tile + drawColourPattern((tx << 3) - scroll1x, data16 & 0x01FF, + (data16 & 0x4000) ? (7 - row) : row, data16 & 0x8000, (uint16*)(ColorPaletteRAM + 0x0080), + (data16 & 0x1E00) >> 9, depth); + } +} + +void NGPGFX_CLASS::draw_colour_scroll2(uint8 depth, int ngpc_scanline) +{ + uint8 tx, row, line; + uint16 data16; + + line = ngpc_scanline + scroll2y; + row = line & 7; //Which row? + + //Draw Background scroll plane (Scroll 2) + for (tx = 0; tx < 32; tx++) + { + data16 = MDFN_de16lsb(ScrollVRAM + 0x0800 + ((tx + ((line >> 3) << 5)) << 1)); + + //Draw the line of the tile + drawColourPattern((tx << 3) - scroll2x, data16 & 0x01FF, + (data16 & 0x4000) ? (7 - row) : row, data16 & 0x8000, (uint16*)(ColorPaletteRAM + 0x0100), + (data16 & 0x1E00) >> 9, depth); + } +} + +void NGPGFX_CLASS::draw_scanline_colour(int layer_enable, int ngpc_scanline) +{ + int16 lastSpriteX; + int16 lastSpriteY; + int spr; + uint16 win_color; + + memset(cfb_scanline, 0, SCREEN_WIDTH * sizeof(uint16)); + memset(zbuffer, 0, SCREEN_WIDTH); + + //Window colour + win_color = MDFN_de16lsb(ColorPaletteRAM + 0x01F0 + (oowc << 1)); + if (negative) win_color = ~win_color; + + //Top + if (ngpc_scanline < winy) + { + for (int x = 0; x < SCREEN_WIDTH; x++) + cfb_scanline[x] = win_color; + } + else + { + //Middle + if (ngpc_scanline < winy + winh) + { + for (int x = 0; x < min(winx, SCREEN_WIDTH); x++) + cfb_scanline[x] = win_color; + + for (int x = min(winx + winw, SCREEN_WIDTH); x < SCREEN_WIDTH; x++) + cfb_scanline[x] = win_color; + } + else //Bottom + { + for (int x = 0; x < SCREEN_WIDTH; x++) + cfb_scanline[x] = win_color; + } + } + + //Ignore above and below the window's top and bottom + if (ngpc_scanline >= winy && ngpc_scanline < winy + winh) + { + //Background colour Enabled? HACK: 01 AUG 2002 - Always on! + // if ((bgc & 0xC0) == 0x80) + { + win_color = MDFN_de16lsb(ColorPaletteRAM + 0x01E0 + ((bgc & 7) << 1)); + } + // else win_color = 0; + + if (negative) win_color = ~win_color; + + //Draw background! + for (int x = winx; x < min(winx + winw, SCREEN_WIDTH); x++) + cfb_scanline[x] = win_color; + + //Swap Front/Back scroll planes? + if (planeSwap) + { + if(layer_enable & 1) + draw_colour_scroll1(ZDEPTH_BACKGROUND_SCROLL, ngpc_scanline); //Swap + if(layer_enable & 2) + draw_colour_scroll2(ZDEPTH_FOREGROUND_SCROLL, ngpc_scanline); + } + else + { + if(layer_enable & 1) + draw_colour_scroll2(ZDEPTH_BACKGROUND_SCROLL, ngpc_scanline); //Normal + if(layer_enable & 2) + draw_colour_scroll1(ZDEPTH_FOREGROUND_SCROLL, ngpc_scanline); + } + + //Draw Sprites + //Last sprite position, (defaults to top-left, sure?) + lastSpriteX = 0; + lastSpriteY = 0; + + if(layer_enable & 4) + for (spr = 0; spr < 64; spr++) + { + uint8 priority, row; + uint8 sx = SpriteVRAM[(spr * 4) + 2]; //X position + uint8 sy = SpriteVRAM[(spr * 4) + 3]; //Y position + int16 x = sx; + int16 y = sy; + uint16 data16; + + data16 = MDFN_de16lsb(SpriteVRAM + (spr * 4)); + priority = (data16 & 0x1800) >> 11; + + if (data16 & 0x0400) x = lastSpriteX + sx; //Horizontal chain? + if (data16 & 0x0200) y = lastSpriteY + sy; //Vertical chain? + + //Store the position for chaining + lastSpriteX = x; + lastSpriteY = y; + + //Visible? + if (priority == 0) continue; + + //Scroll the sprite + x += scrollsprx; + y += scrollspry; + + //Off-screen? + if (x > 248 && x < 256) x = x - 256; else x &= 0xFF; + if (y > 248 && y < 256) y = y - 256; else y &= 0xFF; + + //In range? + if (ngpc_scanline >= y && ngpc_scanline <= y + 7) + { + row = (ngpc_scanline - y) & 7; //Which row? + drawColourPattern((uint8)x, data16 & 0x01FF, + (data16 & 0x4000) ? 7 - row : row, data16 & 0x8000, + (uint16*)ColorPaletteRAM, SpriteVRAMColor[spr] & 0xF, priority << 1); + } + } + + //========== + } + +} + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/gfx_scanline_mono.cpp b/Mednafen/mednafen/ngp/gfx_scanline_mono.cpp new file mode 100644 index 0000000000..6f821c53e7 --- /dev/null +++ b/Mednafen/mednafen/ngp/gfx_scanline_mono.cpp @@ -0,0 +1,248 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "mem.h" +#include "gfx.h" + +//============================================================================= + +void NGPGFX_CLASS::MonoPlot(uint8 x, uint8* palette_ptr, uint16 pal_hi, uint8 index, uint8 depth) +{ + uint8 data8; + + //Clip + if (index == 0 || x < winx || x >= (winw + winx) || x >= SCREEN_WIDTH) + return; + + //Depth check, <= to stop later sprites overwriting pixels! + if (depth <= zbuffer[x]) return; + zbuffer[x] = depth; + + //Get the colour of the pixel + if (pal_hi) + data8 = palette_ptr[3 + index - 1]; + else + data8 = palette_ptr[0 + index - 1]; + + uint16 r = (data8 & 7) << 1; + uint16 g = (data8 & 7) << 5; + uint16 b = (data8 & 7) << 9; + + if (negative) + cfb_scanline[x] = (r | g | b); + else + cfb_scanline[x] = ~(r | g | b); +} + +void NGPGFX_CLASS::drawMonoPattern(uint8 screenx, uint16 tile, uint8 tiley, uint16 mirror, + uint8* palette_ptr, uint16 pal, uint8 depth) +{ + //Get the data for th e "tiley'th" line of "tile". + uint16 data = MDFN_de16lsb(CharacterRAM + (tile * 16) + (tiley * 2)); + + //Horizontal Flip + if (mirror) + { + MonoPlot(screenx + 7, palette_ptr, pal, (data & 0xC000) >> 0xE, depth); + MonoPlot(screenx + 6, palette_ptr, pal, (data & 0x3000) >> 0xC, depth); + MonoPlot(screenx + 5, palette_ptr, pal, (data & 0x0C00) >> 0xA, depth); + MonoPlot(screenx + 4, palette_ptr, pal, (data & 0x0300) >> 0x8, depth); + MonoPlot(screenx + 3, palette_ptr, pal, (data & 0x00C0) >> 0x6, depth); + MonoPlot(screenx + 2, palette_ptr, pal, (data & 0x0030) >> 0x4, depth); + MonoPlot(screenx + 1, palette_ptr, pal, (data & 0x000C) >> 0x2, depth); + MonoPlot(screenx + 0, palette_ptr, pal, (data & 0x0003) >> 0x0, depth); + } + else + //Normal + { + MonoPlot(screenx + 0, palette_ptr, pal, (data & 0xC000) >> 0xE, depth); + MonoPlot(screenx + 1, palette_ptr, pal, (data & 0x3000) >> 0xC, depth); + MonoPlot(screenx + 2, palette_ptr, pal, (data & 0x0C00) >> 0xA, depth); + MonoPlot(screenx + 3, palette_ptr, pal, (data & 0x0300) >> 0x8, depth); + MonoPlot(screenx + 4, palette_ptr, pal, (data & 0x00C0) >> 0x6, depth); + MonoPlot(screenx + 5, palette_ptr, pal, (data & 0x0030) >> 0x4, depth); + MonoPlot(screenx + 6, palette_ptr, pal, (data & 0x000C) >> 0x2, depth); + MonoPlot(screenx + 7, palette_ptr, pal, (data & 0x0003) >> 0x0, depth); + } +} + +void NGPGFX_CLASS::draw_mono_scroll1(uint8 depth, int ngpc_scanline) +{ + uint8 tx, row, line; + uint16 data16; + + line = ngpc_scanline + scroll1y; + row = line & 7; //Which row? + + //Draw Foreground scroll plane (Scroll 1) + for (tx = 0; tx < 32; tx++) + { + data16 = MDFN_de16lsb(ScrollVRAM + ((tx + ((line >> 3) << 5)) << 1)); + + //Draw the line of the tile + drawMonoPattern((tx << 3) - scroll1x, data16 & 0x01FF, + (data16 & 0x4000) ? 7 - row : row, data16 & 0x8000, SCRP1PLT, + data16 & 0x2000, depth); + } +} + +void NGPGFX_CLASS::draw_mono_scroll2(uint8 depth, int ngpc_scanline) +{ + uint8 tx, row, line; + uint16 data16; + + line = ngpc_scanline + scroll2y; + row = line & 7; //Which row? + + //Draw Background scroll plane (Scroll 2) + for (tx = 0; tx < 32; tx++) + { + data16 = MDFN_de16lsb(ScrollVRAM + 0x0800 + ((tx + ((line >> 3) << 5)) << 1)); + + //Draw the line of the tile + drawMonoPattern((tx << 3) - scroll2x, data16 & 0x01FF, + (data16 & 0x4000) ? 7 - row : row, data16 & 0x8000, SCRP2PLT, + data16 & 0x2000, depth); + } +} + +void NGPGFX_CLASS::draw_scanline_mono(int layer_enable, int ngpc_scanline) +{ + int16 lastSpriteX; + int16 lastSpriteY; + int spr; + uint16 data16; + + memset(cfb_scanline, 0, SCREEN_WIDTH * sizeof(uint16)); + memset(zbuffer, 0, SCREEN_WIDTH); + + //Window colour + uint16 r = (uint16)oowc << 1; + uint16 g = (uint16)oowc << 5; + uint16 b = (uint16)oowc << 9; + + if (negative) + data16 = (r | g | b); + else + data16 = ~(r | g | b); + + //Top + if (ngpc_scanline < winy) + { + for (int x = 0; x < SCREEN_WIDTH; x++) + cfb_scanline[x] = data16; + } + else + { + //Middle + if (ngpc_scanline < winy + winh) + { + for (int x = 0; x < min(winx, SCREEN_WIDTH); x++) + cfb_scanline[x] = data16; + for (int x = min(winx + winw, SCREEN_WIDTH); x < SCREEN_WIDTH; x++) + cfb_scanline[x] = data16; + } + else //Bottom + { + for (int x = 0; x < SCREEN_WIDTH; x++) + cfb_scanline[x] = data16; + } + } + + //Ignore above and below the window's top and bottom + if (ngpc_scanline >= winy && ngpc_scanline < winy + winh) + { + //Background colour Enabled? + if ((bgc & 0xC0) == 0x80) + { + r = (uint16)(bgc & 7) << 1; + g = (uint16)(bgc & 7) << 5; + b = (uint16)(bgc & 7) << 9; + data16 = ~(r | g | b); + } + else data16 = 0x0FFF; + + if (negative) data16 = ~data16; + + //Draw background! + for (int x = winx; x < min(winx + winw, SCREEN_WIDTH); x++) + cfb_scanline[x] = data16; + + //Swap Front/Back scroll planes? + if (planeSwap) + { + if(layer_enable & 1) + draw_mono_scroll1(ZDEPTH_BACKGROUND_SCROLL, ngpc_scanline); //Swap + if(layer_enable & 2) + draw_mono_scroll2(ZDEPTH_FOREGROUND_SCROLL, ngpc_scanline); + } + else + { + if(layer_enable & 1) + draw_mono_scroll2(ZDEPTH_BACKGROUND_SCROLL, ngpc_scanline); //Normal + if(layer_enable & 2) + draw_mono_scroll1(ZDEPTH_FOREGROUND_SCROLL, ngpc_scanline); + } + + //Draw Sprites + //Last sprite position, (defaults to top-left, sure?) + lastSpriteX = 0; + lastSpriteY = 0; + if(layer_enable & 4) + for (spr = 0; spr < 64; spr++) + { + uint8 priority, row; + uint8 sx = SpriteVRAM[(spr * 4) + 2]; //X position + uint8 sy = SpriteVRAM[(spr * 4) + 3]; //Y position + int16 x = sx; + int16 y = sy; + + data16 = MDFN_de16lsb(SpriteVRAM + (spr * 4)); + priority = (data16 & 0x1800) >> 11; + + if (data16 & 0x0400) x = lastSpriteX + sx; //Horizontal chain? + if (data16 & 0x0200) y = lastSpriteY + sy; //Vertical chain? + + //Store the position for chaining + lastSpriteX = x; + lastSpriteY = y; + + //Visible? + if (priority == 0) continue; + + //Scroll the sprite + x += scrollsprx; + y += scrollspry; + + //Off-screen? + if (x > 248 && x < 256) x = x - 256; else x &= 0xFF; + if (y > 248 && y < 256) y = y - 256; else y &= 0xFF; + + //In range? + if (ngpc_scanline >= y && ngpc_scanline <= y + 7) + { + row = (ngpc_scanline - y) & 7; //Which row? + drawMonoPattern((uint8)x, data16 & 0x01FF, + (data16 & 0x4000) ? 7 - row : row, data16 & 0x8000, + SPPLT, data16 & 0x2000, priority << 1); + } + } + + } + + //========== +} + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/interrupt.cpp b/Mednafen/mednafen/ngp/interrupt.cpp new file mode 100644 index 0000000000..af7f14eaa0 --- /dev/null +++ b/Mednafen/mednafen/ngp/interrupt.cpp @@ -0,0 +1,552 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "mem.h" +#include "gfx.h" +#include "interrupt.h" +#include "Z80_interface.h" +#include "dma.h" + +//============================================================================= + +uint32 timer_hint; +static uint32 timer_clock[4]; +static uint8 timer[4]; //Up-counters +static uint8 timer_threshold[4]; + +static uint8 TRUN; +static uint8 T01MOD, T23MOD; +static uint8 TRDC; +static uint8 TFFCR; +static uint8 HDMAStartVector[4]; + +static int32 ipending[24]; +static int32 IntPrio[0xB]; // 0070-007a +static bool h_int, timer0, timer2; + +// The way interrupt processing is set up is still written towards BIOS HLE emulation, which assumes +// that the interrupt handler will immediately call DI, clear the interrupt latch(so the interrupt won't happen again when interrupts are re-enabled), +// and then call the game's interrupt handler. + +// We automatically clear the interrupt latch when the interrupt is accepted, and the interrupt latch is not checked every instruction, +// but only when: an EI/DI, POP SR, or RETI instruction occurs; after a write to an interrupt priority register occurs; and when +// a device sets the virual interrupt latch register, signaling it wants an interrupt. + +// FIXME in the future if we ever add real bios support? +void interrupt(uint8 index) +{ + //printf("INT: %d\n", index); + push32(pc); + push16(sr); + + //Up the IFF + if (((sr & 0x7000) >> 12) < 7) + setStatusIFF(((sr & 0x7000) >> 12) + 1); + + //Access the interrupt vector table to find the jump destination + pc = loadL(0x6FB8 + index * 4); +} + +void set_interrupt(uint8 index, bool set) +{ + assert(index < 24); + + ipending[index] = set; + int_check_pending(); +} + +void int_check_pending(void) +{ + uint8 prio; + uint8 curIFF = statusIFF(); + + // Technically, the BIOS should clear the interrupt pending flag by writing with IxxC set to "0", but + // we'll actually need to implement a BIOS to do that! + + prio = IntPrio[0x1] & 0x07; // INT4 + if(ipending[5] && curIFF <= prio && prio && prio != 7) + { + ipending[5] = 0; + interrupt(5); + return; + } + + prio = (IntPrio[0x1] & 0x70) >> 4; // INT5 (Z80) + if(ipending[6] && curIFF <= prio && prio && prio != 7) + { + ipending[6] = 0; + interrupt(6); + return; + } + + prio = IntPrio[0x3] & 0x07; // INTT0 + if(ipending[7] && curIFF <= prio && prio && prio != 7) + { + ipending[7] = 0; + interrupt(7); + return; + } + + prio = (IntPrio[0x3] & 0x70) >> 4; // INTT1 + if(ipending[8] && curIFF <= prio && prio && prio != 7) + { + ipending[8] = 0; + interrupt(8); + return; + } + + prio = (IntPrio[0x4] & 0x07); // INTT2 + if(ipending[9] && curIFF <= prio && prio && prio != 7) + { + ipending[9] = 0; + interrupt(9); + return; + } + + prio = ((IntPrio[0x4] & 0x70) >> 4); // INTT3 + if(ipending[10] && curIFF <= prio && prio && prio != 7) + { + ipending[10] = 0; + interrupt(10); + return; + } + + prio = (IntPrio[0x7] & 0x07); // INTRX0 + if(ipending[11] && curIFF <= prio && prio && prio != 7) + { + ipending[11] = 0; + interrupt(11); + return; + } + + prio = ((IntPrio[0x7] & 0x70) >> 4); // INTTX0 + if(ipending[12] && curIFF <= prio && prio && prio != 7) + { + ipending[12] = 0; + interrupt(12); + return; + } + +} + +void int_write8(uint32 address, uint8 data) +{ + switch(address) + { + case 0x71: if(!(data & 0x08)) ipending[5] = 0; + if(!(data & 0x80)) ipending[6] = 0; + break; + case 0x73: if(!(data & 0x08)) ipending[7] = 0; + if(!(data & 0x80)) ipending[8] = 0; + break; + case 0x74: if(!(data & 0x08)) ipending[9] = 0; + if(!(data & 0x80)) ipending[10] = 0; + break; + case 0x77: if(!(data & 0x08)) ipending[11] = 0; + if(!(data & 0x80)) ipending[12] = 0; + break; + case 0x7C: HDMAStartVector[0] = data; break; + case 0x7D: HDMAStartVector[1] = data; break; + case 0x7E: HDMAStartVector[2] = data; break; + case 0x7F: HDMAStartVector[3] = data; break; + } + if(address >= 0x70 && address <= 0x7A) + { + IntPrio[address - 0x70] = data; + int_check_pending(); + } +} + +uint8 int_read8(uint32 address) +{ + uint8 ret = 0; + switch(address) + { + case 0x71: ret = ((ipending[5] ? 0x08 : 0x00) | (ipending[6] ? 0x80 : 0x00)); break; + case 0x73: ret = ((ipending[7] ? 0x08 : 0x00) | (ipending[8] ? 0x80 : 0x00)); break; + case 0x74: ret = ((ipending[9] ? 0x08 : 0x00) | (ipending[10] ? 0x80 : 0x00)); break; + case 0x77: ret = ((ipending[11] ? 0x08 : 0x00) | (ipending[12] ? 0x80 : 0x00)); break; + } + + return(ret); +} + +void TestIntHDMA(int bios_num, int vec_num) +{ + bool WasDMA = 0; + + if (HDMAStartVector[0] == vec_num) + { + WasDMA = 1; + DMA_update(0); + } + else + { + if (HDMAStartVector[1] == vec_num) + { + WasDMA = 1; + DMA_update(1); + } + else + { + if (HDMAStartVector[2] == vec_num) + { + WasDMA = 1; + DMA_update(2); + } + else + { + if (HDMAStartVector[3] == vec_num) + { + WasDMA = 1; + DMA_update(3); + } + } + } + } + if(!WasDMA) + set_interrupt(bios_num, TRUE); +} + + +extern int32 ngpc_soundTS; +extern bool NGPFrameSkip; + +bool updateTimers(MDFN_Surface *surface, int cputicks) +{ + bool ret = 0; + + ngpc_soundTS += cputicks; + //increment H-INT timer + timer_hint += cputicks; + + //======================= + + //End of scanline / Start of Next one + if (timer_hint >= TIMER_HINT_RATE) + { + uint8 data; + + // ============= END OF CURRENT SCANLINE ============= + + h_int = NGPGfx->hint(); + ret = NGPGfx->draw(surface, NGPFrameSkip); + + // ============= START OF NEXT SCANLINE ============= + + timer_hint -= TIMER_HINT_RATE; //Start of next scanline + + //Comms. Read interrupt + if ((COMMStatus & 1) == 0 && system_comms_poll(&data)) + { + storeB(0x50, data); + TestIntHDMA(12, 0x19); + } + } + + //======================= + + //Tick the Clock Generator + timer_clock[0] += cputicks; + timer_clock[1] += cputicks; + + timer0 = FALSE; //Clear the timer0 tick, for timer1 chain mode. + + //======================= + + //Run Timer 0 (TRUN)? + if ((TRUN & 0x01)) + { + //T01MOD + switch(T01MOD & 0x03) + { + case 0: if (h_int) //Horizontal interrupt trigger + { + timer[0]++; + + timer_clock[0] = 0; + h_int = FALSE; // Stop h_int remaining active + } + break; + + case 1: while (timer_clock[0] >= TIMER_T1_RATE) + { + timer[0]++; + timer_clock[0] -= TIMER_T1_RATE; + } + break; + + case 2: while(timer_clock[0] >= TIMER_T4_RATE) + { + timer[0]++; + timer_clock[0] -= TIMER_T4_RATE; + } + break; + + case 3: while (timer_clock[0] >= TIMER_T16_RATE) + { + timer[0]++; + timer_clock[0] -= TIMER_T16_RATE; + } + break; + } + + + //Threshold check + if (timer_threshold[0] && timer[0] >= timer_threshold[0]) + { + timer[0] = 0; + timer0 = TRUE; + + TestIntHDMA(7, 0x10); + } + } + + //======================= + + //Run Timer 1 (TRUN)? + if ((TRUN & 0x02)) + { + //T01MOD + switch((T01MOD & 0x0C) >> 2) + { + case 0: if (timer0) //Timer 0 chain mode. + { + timer[1] += timer0; + timer_clock[1] = 0; + } + break; + + case 1: while (timer_clock[1] >= TIMER_T1_RATE) + { + timer[1]++; + timer_clock[1] -= TIMER_T1_RATE; + } + break; + + case 2: while (timer_clock[1] >= TIMER_T16_RATE) + { + timer[1]++; + timer_clock[1] -= TIMER_T16_RATE; + } + break; + + case 3: while (timer_clock[1] >= TIMER_T256_RATE) + { + timer[1]++; + timer_clock[1] -= TIMER_T256_RATE; + } + break; + } + + //Threshold check + if (timer_threshold[1] && timer[1] >= timer_threshold[1]) + { + timer[1] = 0; + + TestIntHDMA(8, 0x11); + } + } + + //======================= + + //Tick the Clock Generator + timer_clock[2] += cputicks; + timer_clock[3] += cputicks; + + timer2 = FALSE; //Clear the timer2 tick, for timer3 chain mode. + + //======================= + + //Run Timer 2 (TRUN)? + if ((TRUN & 0x04)) + { + //T23MOD + switch(T23MOD & 0x03) + { + case 0: // - + break; + + case 1: while (timer_clock[2] >= TIMER_T1_RATE / 2) // Kludge :( + { + timer[2]++; + timer_clock[2] -= TIMER_T1_RATE / 2; + } + break; + + case 2: while (timer_clock[2] >= TIMER_T4_RATE) + { + timer[2]++; + timer_clock[2] -= TIMER_T4_RATE; + } + break; + + case 3: while (timer_clock[2] >= TIMER_T16_RATE) + { + timer[2]++; + timer_clock[2] -= TIMER_T16_RATE; + } + break; + } + + //Threshold check + if (timer_threshold[2] && timer[2] >= timer_threshold[2]) + { + timer[2] = 0; + timer2 = TRUE; + + TestIntHDMA(9, 0x12); + } + } + + //======================= + + //Run Timer 3 (TRUN)? + if ((TRUN & 0x08)) + { + //T23MOD + switch((T23MOD & 0x0C) >> 2) + { + case 0: if(timer2) //Timer 2 chain mode. + { + timer[3] += timer2; + timer_clock[3] = 0; + } + break; + + case 1: while (timer_clock[3] >= TIMER_T1_RATE) + { + timer[3]++; + timer_clock[3] -= TIMER_T1_RATE; + } + break; + + case 2: while (timer_clock[3] >= TIMER_T16_RATE) + { + timer[3]++; + timer_clock[3] -= TIMER_T16_RATE; + } + break; + + case 3: while (timer_clock[3] >= TIMER_T256_RATE) + { + timer[3]++; + timer_clock[3] -= TIMER_T256_RATE; + } + break; + } + + //Threshold check + if (timer_threshold[3] && timer[3] >= timer_threshold[3]) + { + timer[3] = 0; + + Z80_irq(); + TestIntHDMA(10, 0x13); + } + } + return(ret); +} + +void reset_timers(void) +{ + timer_hint = 0; + + memset(timer, 0, sizeof(timer)); + memset(timer_clock, 0, sizeof(timer_clock)); + memset(timer_threshold, 0, sizeof(timer_threshold)); + + timer0 = FALSE; + timer2 = FALSE; +} + +void reset_int(void) +{ + TRUN = 0; + T01MOD = 0; + T23MOD = 0; + TRDC = 0; + TFFCR = 0; + + memset(HDMAStartVector, 0, sizeof(HDMAStartVector)); + memset(ipending, 0, sizeof(ipending)); + memset(IntPrio, 0, sizeof(IntPrio)); + + h_int = FALSE; +} + +void timer_write8(uint32 address, uint8 data) +{ + switch(address) + { + case 0x20: TRUN = data; + if ((TRUN & 0x01) == 0) timer[0] = 0; + if ((TRUN & 0x02) == 0) timer[1] = 0; + if ((TRUN & 0x04) == 0) timer[2] = 0; + if ((TRUN & 0x08) == 0) timer[3] = 0; + break; + case 0x22: timer_threshold[0] = data; break; + case 0x23: timer_threshold[1] = data; break; + case 0x24: T01MOD = data; break; + case 0x25: TFFCR = data & 0x33; break; + case 0x26: timer_threshold[2] = data; break; + case 0x27: timer_threshold[3] = data; break; + case 0x28: T23MOD = data; break; + case 0x29: TRDC = data & 0x3; break; + } +} + +uint8 timer_read8(uint32 address) +{ + uint8 ret = 0; + + switch(address) + { + //default: printf("Baaaad: %08x\n", address); break; + // Cool boarders is stupid and tries to read from a write-only register >_< + // Returning 4 makes the game run ok, so 4 it is! + default: ret = 0x4; break; + case 0x20: ret = TRUN; break; + case 0x29: ret = TRDC; break; + } + + //printf("UNK B R: %08x\n", address); + return(ret); +} + +int int_timer_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(timer_hint), + SFARRAY32(timer_clock, 4), + SFARRAY(timer, 4), + SFARRAY(timer_threshold, 4), + SFVAR(TRUN), + SFVAR(T01MOD), SFVAR(T23MOD), + SFVAR(TRDC), + SFVAR(TFFCR), + SFARRAY(HDMAStartVector, 4), + SFARRAY32(ipending, 24), + SFARRAY32(IntPrio, 0xB), + SFVAR(h_int), + SFVAR(timer0), + SFVAR(timer2), + SFEND + }; + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "INTT")) + return(0); + return(1); +} diff --git a/Mednafen/mednafen/ngp/interrupt.h b/Mednafen/mednafen/ngp/interrupt.h new file mode 100644 index 0000000000..6717650479 --- /dev/null +++ b/Mednafen/mednafen/ngp/interrupt.h @@ -0,0 +1,59 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __NEOPOP_INTERRUPT__ +#define __NEOPOP_INTERRUPT__ +//============================================================================= + +void interrupt(uint8 index); + +#define TIMER_HINT_RATE 515 //CPU Ticks between horizontal interrupts + +#define TIMER_BASE_RATE 32 //1 //ticks + +#define TIMER_T1_RATE (8 * TIMER_BASE_RATE) +#define TIMER_T4_RATE (32 * TIMER_BASE_RATE) +#define TIMER_T16_RATE (128 * TIMER_BASE_RATE) +#define TIMER_T256_RATE (2048 * TIMER_BASE_RATE) + +void reset_timers(void); +void reset_int(void); + +//Call this after each instruction +bool updateTimers(MDFN_Surface *surface, int cputicks); + +//H-INT Timer +extern uint32 timer_hint; + +void timer_write8(uint32 address, uint8 data); +uint8 timer_read8(uint32 address); + + +// Set this value to fix problems with glitching extra lines. +extern bool gfx_hack; + + +void int_write8(uint32 address, uint8 data); +uint8 int_read8(uint32 address); +void int_check_pending(void); +void TestIntHDMA(int bios_num, int vec_num); + +int int_timer_StateAction(StateMem *sm, int load, int data_only); + +//============================================================================= +#endif + + + + diff --git a/Mednafen/mednafen/ngp/mem.cpp b/Mednafen/mednafen/ngp/mem.cpp new file mode 100644 index 0000000000..bf4228dda6 --- /dev/null +++ b/Mednafen/mednafen/ngp/mem.cpp @@ -0,0 +1,677 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "Z80_interface.h" +#include "bios.h" +#include "gfx.h" +#include "mem.h" +#include "interrupt.h" +#include "sound.h" +#include "flash.h" +#include "rtc.h" + +//============================================================================= + +//Hack way of returning good Flash status. +bool FlashStatusEnable = FALSE; +static uint32 FlashStatus; + +uint8 CPUExRAM[16384]; + +bool debug_abort_memory = FALSE; +bool debug_mask_memory_error_messages = FALSE; + +bool memory_unlock_flash_write = FALSE; +bool memory_flash_error = FALSE; +bool memory_flash_command = FALSE; + + +uint8 SC0BUF; // Serial channel 0 buffer. +uint8 COMMStatus; + +// In very very very rare conditions(like on embedded platforms with no virtual memory and very limited RAM and +// malloc happens to return a pointer aligned to a 64KiB boundary), a FastReadMap entry may be NULL even if +// it points to valid data when it's added to the address of the read, but +// if this happens, it will only make the emulator slightly slower. +static uint8 *FastReadMap[256], *FastReadMapReal[256]; + + +void SetFRM(void) // Call this function after rom is loaded +{ + for(unsigned int x = 0; x < 256; x++) + FastReadMapReal[x] = NULL; + + for(unsigned int x = 0x20; x <= 0x3f; x++) + { + if(ngpc_rom.length > (x * 65536 + 65535 - 0x20000)) + FastReadMapReal[x] = &ngpc_rom.data[x * 65536 - 0x200000] - x * 65536; + } + + for(unsigned int x = 0x80; x <= 0x9f; x++) + { + if(ngpc_rom.length > (x * 65536 + 65535 - 0x80000)) + FastReadMapReal[x] = &ngpc_rom.data[x * 65536 - 0x800000] - x * 65536; + } + +} + +void RecacheFRM(void) +{ + for(int x = 0; x < 256; x++) + FastReadMap[x] = FlashStatusEnable ? NULL : FastReadMapReal[x]; +} + +static void* translate_address_read(uint32 address) +{ + address &= 0xFFFFFF; + + //Get Flash status? + if (FlashStatusEnable) + { + if ((address >= ROM_START && address <= ROM_END) || (address >= HIROM_START && address <= HIROM_END)) + { + FlashStatusEnable = FALSE; + RecacheFRM(); + if (address == 0x220000 || address == 0x230000) + { + FlashStatus = 0xFFFFFFFF; + return &FlashStatus; + } + } + } + + //ROM (LOW) + if (address >= ROM_START && address <= ROM_END) + { + if (address <= ROM_START + ngpc_rom.length) + return ngpc_rom.data + (address - ROM_START); + else + return NULL; + } + + //ROM (HIGH) + if (address >= HIROM_START && address <= HIROM_END) + { + if (address <= HIROM_START + (ngpc_rom.length - 0x200000)) + return ngpc_rom.data + 0x200000 + (address - HIROM_START); + else + return NULL; + } + + // =================================== + + //BIOS Access? + if ((address & 0xFF0000) == 0xFF0000) + { + return ngpc_bios + (address & 0xFFFF); // BIOS ROM + } + return NULL; +} + +//============================================================================= + +static void* translate_address_write(uint32 address) +{ + address &= 0xFFFFFF; + + if (memory_unlock_flash_write) + { + //ROM (LOW) + if (address >= ROM_START && address <= ROM_END) + { + if (address <= ROM_START + ngpc_rom.length) + return ngpc_rom.data + (address - ROM_START); + else + return NULL; + } + + //ROM (HIGH) + if (address >= HIROM_START && address <= HIROM_END) + { + if (address <= HIROM_START + (ngpc_rom.length - 0x200000)) + return ngpc_rom.data + 0x200000 + (address - HIROM_START); + else + return NULL; + } + } + else + { + //ROM (LOW) + if (address >= ROM_START && address <= ROM_END) + { + //Ignore Flash commands + if (address == 0x202AAA || address == 0x205555) + { + // system_debug_message("%06X: Enable Flash command from %06X", pc, address); + memory_flash_command = TRUE; + return NULL; + } + + //Set Flash status reading? + if (address == 0x220000 || address == 0x230000) + { + // system_debug_message("%06X: Flash status read from %06X", pc, address); + FlashStatusEnable = TRUE; + RecacheFRM(); + return NULL; + } + + if (memory_flash_command) + { + //Write the 256byte block around the flash data + flash_write(address & 0xFFFF00, 256); + + //Need to issue a new command before writing will work again. + memory_flash_command = FALSE; + + // system_debug_message("%06X: Direct Flash write to %06X", pc, address & 0xFFFF00); + // system_debug_stop(); + + //Write to the rom itself. + if (address <= ROM_START + ngpc_rom.length) + return ngpc_rom.data + (address - ROM_START); + } + } + } + + // =================================== + return NULL; +} + +/* WARNING: 32-bit loads and stores apparently DON'T have to be 4-byte-aligned(so we must +2 instead of |2). */ +/* Treat all 32-bit operations as two 16-bit operations */ +uint8 loadB(uint32 address) +{ + address &= 0xFFFFFF; + + if(FastReadMap[address >> 16]) + return(FastReadMap[address >> 16][address]); + + + uint8* ptr = (uint8*)translate_address_read(address); + + if (ptr) + return *ptr; + + if(address >= 0x8000 && address <= 0xbfff) + return(NGPGfx->read8(address)); + if(address >= 0x4000 && address <= 0x7fff) + { + return(*(uint8 *)(CPUExRAM + address - 0x4000)); + } + + if(address >= 0x70 && address <= 0x7F) + { + return(int_read8(address)); + } + + if(address >= 0x90 && address <= 0x97) + { + return(rtc_read8(address)); + } + + if(address >= 0x20 && address <= 0x29) + { + return(timer_read8(address)); + } + + if(address == 0x50) + return(SC0BUF); + + if(address == 0xBC) + return Z80_ReadComm(); + + //printf("UNK B R: %08x\n", address); + + return(0); +} + +uint16 loadW(uint32 address) +{ + address &= 0xFFFFFF; + + if(address & 1) + { + uint16 ret; + + ret = loadB(address); + ret |= loadB(address + 1) << 8; + + return(ret); + } + + if(FastReadMap[address >> 16]) + return(MDFN_de16lsb(&FastReadMap[address >> 16][address])); + + uint16* ptr = (uint16*)translate_address_read(address); + if(ptr) + return MDFN_de16lsb(ptr); + + if(address >= 0x8000 && address <= 0xbfff) + return(NGPGfx->read16(address)); + + if(address >= 0x4000 && address <= 0x7fff) + { + return(MDFN_de16lsb(CPUExRAM + address - 0x4000)); + } + if(address == 0x50) + return(SC0BUF); + + if(address >= 0x70 && address <= 0x7F) + { + uint16 ret; + + ret = int_read8(address); + ret |= int_read8(address + 1) << 8; + + return(ret); + } + + if(address >= 0x90 && address <= 0x97) + { + uint16 ret; + + ret = rtc_read8(address); + ret |= rtc_read8(address + 1) << 8; + + return(ret); + } + + if(address >= 0x20 && address <= 0x29) + { + uint16 ret; + + ret = timer_read8(address); + ret |= timer_read8(address + 1) << 8; + + return(ret); + } + + if(address == 0xBC) + return Z80_ReadComm(); + + //printf("UNK W R: %08x\n", address); + + return(0); +} + +uint32 loadL(uint32 address) +{ + uint32 ret; + + ret = loadW(address); + ret |= loadW(address + 2) << 16; + + return(ret); +} + +//============================================================================= + +void storeB(uint32 address, uint8 data) +{ + address &= 0xFFFFFF; + + if(address >= 0x8000 && address <= 0xbfff) + { + NGPGfx->write8(address, data); + return; + } + if(address >= 0x4000 && address <= 0x7fff) + { + *(uint8 *)(CPUExRAM + address - 0x4000) = data; + return; + } + if(address >= 0x70 && address <= 0x7F) + { + int_write8(address, data); + return; + } + if(address >= 0x20 && address <= 0x29) + { + timer_write8(address, data); + return; + } + + if(address == 0x50) + { + SC0BUF = data; + return; + } + + if(address == 0x6f) // Watchdog timer + { + return; + } + + if(address == 0xb2) // Comm? + { + COMMStatus = data & 1; + return; + } + + if(address == 0xb9) + { + if(data == 0x55) + Z80_SetEnable(1); + else if(data == 0xAA) + Z80_SetEnable(0); + return; + } + + if(address == 0xb8) + { + if(data == 0x55) + MDFNNGPCSOUND_SetEnable(1); + else if(data == 0xAA) + MDFNNGPCSOUND_SetEnable(0); + return; + } + + if (address == 0xBA) + { + Z80_nmi(); + return; + } + + if(address == 0xBC) + { + Z80_WriteComm(data); + return; + } + + if(address >= 0xa0 && address <= 0xA3) + { + if(!Z80_IsEnabled()) + { + if (address == 0xA1) Write_SoundChipLeft(data); + else if (address == 0xA0) Write_SoundChipRight(data); + } + //DAC Write + if (address == 0xA2) + { + dac_write_left(data); + } + else if (address == 0xA3) + { + dac_write_right(data); + } + return; + } + + //printf("%08x %02x\n", address, data); + uint8* ptr = (uint8*)translate_address_write(address); + + //Write + if (ptr) + { + *ptr = data; + } + //else + // printf("ACK: %08x %02x\n", address, data); + +} + +void storeW(uint32 address, uint16 data) +{ + address &= 0xFFFFFF; + + if(address & 1) + { + storeB(address + 0, data & 0xFF); + storeB(address + 1, data >> 8); + return; + } + + if(address >= 0x8000 && address <= 0xbfff) + { + NGPGfx->write16(address, data); + return; + } + if(address >= 0x4000 && address <= 0x7fff) + { + MDFN_en16lsb(CPUExRAM + address - 0x4000, data); + return; + } + if(address >= 0x70 && address <= 0x7F) + { + int_write8(address, data & 0xFF); + int_write8(address + 1, data >> 8); + return; + } + + if(address >= 0x20 && address <= 0x29) + { + timer_write8(address, data & 0xFF); + timer_write8(address + 1, data >> 8); + } + + if(address == 0x50) + { + SC0BUF = data & 0xFF; + return; + } + + if(address == 0x6e) // Watchdog timer(technically 0x6f) + { + return; + } + + if(address == 0xb2) // Comm? + { + COMMStatus = data & 1; + return; + } + + if(address == 0xb8) + { + if((data & 0xFF00) == 0x5500) + Z80_SetEnable(1); + else if((data & 0xFF00) == 0xAA00) + Z80_SetEnable(0); + + if((data & 0xFF) == 0x55) + MDFNNGPCSOUND_SetEnable(1); + else if((data & 0xFF) == 0xAA) + MDFNNGPCSOUND_SetEnable(0); + return; + } + + if (address == 0xBA) + { + Z80_nmi(); + return; + } + + if(address == 0xBC) + { + Z80_WriteComm(data); + return; + } + + if(address >= 0xa0 && address <= 0xA3) + { + storeB(address, data & 0xFF); + storeB(address + 1, data >> 8); + return; + } + + uint16* ptr = (uint16*)translate_address_write(address); + + //Write + if (ptr) + { + MDFN_en16lsb(ptr, data); + } + //else + // printf("ACK16: %08x %04x\n", address, data); + +} + +void storeL(uint32 address, uint32 data) +{ + storeW(address, data & 0xFFFF); + storeW(address + 2, data >> 16); +} + +//============================================================================= + +static const uint8 systemMemory[] = +{ + // 0x00 // 0x08 + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, + // 0x10 // 0x18 + 0x34, 0x3C, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x3F, 0xFF, 0x2D, 0x01, 0xFF, 0xFF, 0x03, 0xB2, + // 0x20 // 0x28 + 0x80, 0x00, 0x01, 0x90, 0x03, 0xB0, 0x90, 0x62, 0x05, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x4C, 0x4C, + // 0x30 // 0x38 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0xFF, 0x80, 0x7F, + // 0x40 // 0x48 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0x50 // 0x58 + 0x00, 0x20, 0x69, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + // 0x60 // 0x68 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x03, 0x03, 0x02, 0x00, 0x00, 0x4E, + // 0x70 // 0x78 + 0x02, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0x80 // 0x88 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0x90 // 0x98 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0xA0 // 0xA8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0xB0 // 0xB8 + 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0xC0 // 0xC8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0xD0 // 0xD8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0xE0 // 0xE8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + // 0xF0 // 0xF8 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +//============================================================================= + +void reset_memory(void) +{ + unsigned int i; + + FlashStatusEnable = FALSE; + RecacheFRM(); + + memory_flash_command = FALSE; + +//============================================================================= +//000000 -> 000100 CPU Internal RAM (Timers/DMA/Z80) +//===================================================== + + for (i = 0; i < sizeof(systemMemory); i++) + storeB(i, systemMemory[i]); + +//============================================================================= +//006C00 -> 006FFF BIOS Workspace +//================================== + + storeL(0x6C00, MDFN_de32lsb(rom_header->startPC)); //Start + + storeW(0x6C04, MDFN_de16lsb(rom_header->catalog)); + storeW(0x6E82, MDFN_de16lsb(rom_header->catalog)); + + storeB(0x6C06, rom_header->subCatalog); + storeB(0x6E84, rom_header->subCatalog); + + for(i = 0; i < 12; i++) + storeB(0x6c08 + i, ngpc_rom.data[0x24 + i]); + + storeB(0x6C58, 0x01); + + //32MBit cart? + if (ngpc_rom.length > 0x200000) + storeB(0x6C59, 0x01); + else + storeB(0x6C59, 0x00); + + storeB(0x6C55, 1); //Commercial game + + storeB(0x6F80, 0xFF); //Lots of battery power! + storeB(0x6F81, 0x03); + + storeB(0x6F84, 0x40); // "Power On" startup + storeB(0x6F85, 0x00); // No shutdown request + storeB(0x6F86, 0x00); // No user answer (?) + + //Language: 0 = Japanese, 1 = English + storeB(0x6F87, MDFN_GetSettingB("ngp.language")); + + //Color Mode Selection: 0x00 = B&W, 0x10 = Colour + storeB(0x6F91, rom_header->mode); + storeB(0x6F95, rom_header->mode); + + //Interrupt table + for (i = 0; i < 0x12; i++) + storeL(0x6FB8 + i * 4, 0x00FF23DF); + + +//============================================================================= +//008000 -> 00BFFF Video RAM +//============================= + + storeB(0x8000, 0xC0); // Both interrupts allowed + + //Hardware window + storeB(0x8002, 0x00); + storeB(0x8003, 0x00); + storeB(0x8004, 0xFF); + storeB(0x8005, 0xFF); + + storeB(0x8006, 0xc6); // Frame Rate Register + + storeB(0x8012, 0x00); // NEG / OOWC setting. + + storeB(0x8118, 0x80); // BGC on! + + storeB(0x83E0, 0xFF); // Default background colour + storeB(0x83E1, 0x0F); + + storeB(0x83F0, 0xFF); // Default window colour + storeB(0x83F1, 0x0F); + + storeB(0x8400, 0xFF); // LED on + storeB(0x8402, 0x80); // Flash cycle = 1.3s + + storeB(0x87E2, loadB(0x6F95) ? 0x00 : 0x80); + + + // + // Metal Slug - 2nd Mission oddly relies on a specific character RAM pattern. + // + { + static const uint8 char_data[64] = { + 255, 63, 255, 255, 0, 252, 255, 255, 255, 63, 3, 0, 255, 255, 255, 255, + 240, 243, 252, 243, 255, 3, 255, 195, 255, 243, 243, 243, 240, 243, 240, 195, + 207, 15, 207, 15, 207, 15, 207, 207, 207, 255, 207, 255, 207, 255, 207, 63, + 255, 192, 252, 195, 240, 207, 192, 255, 192, 255, 240, 207, 252, 195, 255, 192 }; + + for(i = 0; i < 64; i++) + { + storeB(0xA1C0 + i, char_data[i]); + } + } +} + +//============================================================================= + + diff --git a/Mednafen/mednafen/ngp/mem.h b/Mednafen/mednafen/ngp/mem.h new file mode 100644 index 0000000000..8a72daeb3d --- /dev/null +++ b/Mednafen/mednafen/ngp/mem.h @@ -0,0 +1,56 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __NEOPOP_MEM__ +#define __NEOPOP_MEM__ +//============================================================================= + +#define ROM_START 0x200000 +#define ROM_END 0x3FFFFF + +#define HIROM_START 0x800000 +#define HIROM_END 0x9FFFFF + +#define BIOS_START 0xFF0000 +#define BIOS_END 0xFFFFFF + +void reset_memory(void); + +void dump_memory(uint32 start, uint32 length); + +extern bool debug_abort_memory; +extern bool debug_mask_memory_error_messages; + +extern bool memory_unlock_flash_write; +extern bool memory_flash_error; +extern bool memory_flash_command; + +extern bool FlashStatusEnable; +extern uint8 COMMStatus; + +//============================================================================= + +uint8 loadB(uint32 address); +uint16 loadW(uint32 address); +uint32 loadL(uint32 address); + +void storeB(uint32 address, uint8 data); +void storeW(uint32 address, uint16 data); +void storeL(uint32 address, uint32 data); + +void SetFRM(void); +void RecacheFRM(void); + +//============================================================================= +#endif diff --git a/Mednafen/mednafen/ngp/neopop.cpp b/Mednafen/mednafen/ngp/neopop.cpp new file mode 100644 index 0000000000..9d7d23dbff --- /dev/null +++ b/Mednafen/mednafen/ngp/neopop.cpp @@ -0,0 +1,433 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include +#include +#include + +#include "Z80_interface.h" +#include "interrupt.h" +#include "mem.h" +#include "gfx.h" +#include "sound.h" +#include "dma.h" +#include "bios.h" +#include "flash.h" + +#include + +extern uint8 CPUExRAM[16384]; + +NGPGFX_CLASS *NGPGfx = NULL; + +COLOURMODE system_colour = COLOURMODE_AUTO; + +uint8 NGPJoyLatch; + +bool system_comms_read(uint8* buffer) +{ + return(0); +} + +bool system_comms_poll(uint8* buffer) +{ + return(0); +} + +void system_comms_write(uint8 data) +{ + return; +} + +void instruction_error(char* vaMessage,...) +{ + char message[1000]; + va_list vl; + + va_start(vl, vaMessage); + vsprintf(message, vaMessage, vl); + va_end(vl); + + MDFN_printf("[PC %06X] %s\n", pc, message); +} + +static uint8 *chee; + +bool NGPFrameSkip; +int32 ngpc_soundTS = 0; +//static int32 main_timeaccum; +static int32 z80_runtime; + +static void Emulate(EmulateSpecStruct *espec) +{ + bool MeowMeow = 0; + + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.w = 160; + espec->DisplayRect.h = 152; + + if(espec->VideoFormatChanged) + NGPGfx->set_pixel_format(espec->surface->format); + + if(espec->SoundFormatChanged) + MDFNNGPC_SetSoundRate(espec->SoundRate); + + + NGPJoyLatch = *chee; + storeB(0x6F82, *chee); + + MDFNMP_ApplyPeriodicCheats(); + + ngpc_soundTS = 0; + NGPFrameSkip = espec->skip; + + do + { +#if 0 + int32 timetime; + + if(main_timeaccum == 0) + { + main_timeaccum = TLCS900h_interpret(); + if(main_timeaccum > 255) + { + main_timeaccum = 255; + printf("%d\n", main_timeaccum); + } + } + + timetime = std::min(main_timeaccum, 24); + main_timeaccum -= timetime; +#else +#if 0 + uint32 old_pc = pc; + { + uint32 xix = gpr[0]; + uint32 xiz = gpr[2]; + printf("%08x %08x --- %s\n", xix, xiz, TLCS900h_disassemble()); + } + pc = old_pc; +#endif + + int32 timetime = (uint8)TLCS900h_interpret(); // This is sooo not right, but it's replicating the old behavior(which is necessary + // now since I've fixed the TLCS900h core and other places not to truncate cycle counts + // internally to 8-bits). Switch to the #if 0'd block of code once we fix cycle counts in the + // TLCS900h core(they're all sorts of messed up), and investigate if certain long + // instructions are interruptable(by interrupts) and later resumable, RE Rockman Battle + // & Fighters voice sample playback. +#endif + //if(timetime > 255) + // printf("%d\n", timetime); + + // Note: Don't call updateTimers with a time/tick/cycle/whatever count greater than 255. + MeowMeow |= updateTimers(espec->surface, timetime); + + z80_runtime += timetime; + + while(z80_runtime > 0) + { + int z80rantime = Z80_RunOP(); + + if(z80rantime < 0) // Z80 inactive, so take up all run time! + { + z80_runtime = 0; + break; + } + + z80_runtime -= z80rantime << 1; + + } + } while(!MeowMeow); + + + espec->MasterCycles = ngpc_soundTS; + espec->SoundBufSize = MDFNNGPCSOUND_Flush(espec->SoundBuf, espec->SoundBufMaxSize); +} + +static bool TestMagic(MDFNFILE *fp) +{ + if(strcasecmp(fp->ext, "ngp") && strcasecmp(fp->ext, "ngpc") && strcasecmp(fp->ext, "ngc") && strcasecmp(fp->ext, "npc")) + return(false); + + return(true); +} + +static void Cleanup(void) +{ + rom_unload(); + + if(NGPGfx != NULL) + { + delete NGPGfx; + NGPGfx = NULL; + } +} + +static void Load(MDFNFILE *fp) +{ + try + { + const uint64 fp_size = fp->size(); + + if(fp_size > 1024 * 1024 * 8) // 4MiB maximum ROM size, 2* to be a little tolerant of garbage. + throw MDFN_Error(0, _("NGP/NGPC ROM image is too large.")); + + ngpc_rom.length = fp_size; + ngpc_rom.data = (uint8*)MDFN_malloc_T(ngpc_rom.length, _("ROM")); + fp->read(ngpc_rom.data, ngpc_rom.length); + + md5_context md5; + md5.starts(); + md5.update(ngpc_rom.data, ngpc_rom.length); + md5.finish(MDFNGameInfo->MD5); + + rom_loaded(); + MDFN_printf(_("ROM: %uKiB\n"), (ngpc_rom.length + 1023) / 1024); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + FLASH_LoadNV(); + + MDFNMP_Init(1024, 1024 * 1024 * 16 / 1024); + + NGPGfx = new NGPGFX_CLASS(); + + MDFNGameInfo->fps = (uint32)((uint64)6144000 * 65536 * 256 / 515 / 198); // 3072000 * 2 * 10000 / 515 / 198 + MDFNGameInfo->GameSetMD5Valid = FALSE; + + MDFNNGPCSOUND_Init(); + + MDFNMP_AddRAM(16384, 0x4000, CPUExRAM); + + SetFRM(); // Set up fast read memory mapping + + bios_install(); + + //main_timeaccum = 0; + z80_runtime = 0; + + reset(); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void CloseGame(void) +{ + try + { + FLASH_SaveNV(); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + + Cleanup(); +} + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + if(!port) chee = (uint8 *)ptr; +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(z80_runtime), + SFARRAY(CPUExRAM, 16384), + SFVAR(FlashStatusEnable), + SFEND + }; + + SFORMAT TLCS_StateRegs[] = + { + SFVARN(pc, "PC"), + SFVARN(sr, "SR"), + SFVARN(f_dash, "F_DASH"), + SFARRAY32N(gpr, 4, "GPR"), + SFARRAY32N(gprBank[0], 4, "GPRB0"), + SFARRAY32N(gprBank[1], 4, "GPRB1"), + SFARRAY32N(gprBank[2], 4, "GPRB2"), + SFARRAY32N(gprBank[3], 4, "GPRB3"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + MDFNSS_StateAction(sm, load, data_only, TLCS_StateRegs, "TLCS"); + MDFNNGPCDMA_StateAction(sm, load, data_only); + MDFNNGPCSOUND_StateAction(sm, load, data_only); + NGPGfx->StateAction(sm, load, data_only); + MDFNNGPCZ80_StateAction(sm, load, data_only); + int_timer_StateAction(sm, load, data_only); + BIOSHLE_StateAction(sm, load, data_only); + FLASH_StateAction(sm, load, data_only); + + if(load) + { + RecacheFRM(); + changedSP(); + } +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: + case MDFN_MSC_RESET: reset(); + break; + } +} + +static const MDFNSetting_EnumList LanguageList[] = +{ + { "japanese", 0, gettext_noop("Japanese") }, + { "0", 0 }, + + { "english", 1, gettext_noop("English") }, + { "1", 1 }, + + { NULL, 0 }, +}; + +static MDFNSetting NGPSettings[] = +{ + { "ngp.language", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Language games should display text in."), NULL, MDFNST_ENUM, "english", NULL, NULL, NULL, NULL, LanguageList }, + { NULL } +}; + + +bool system_io_flash_read(uint8* buffer, uint32 bufferLength) +{ + try + { + FileStream fp(MDFN_MakeFName(MDFNMKF_SAV, 0, "flash"), FileStream::MODE_READ); + + fp.read(buffer, bufferLength); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() == ENOENT) + return(false); + else + throw; + } + + return(true); +} + +void system_io_flash_write(uint8* buffer, uint32 bufferLength) +{ + FileStream fp(MDFN_MakeFName(MDFNMKF_SAV, 0, "flash"), FileStream::MODE_WRITE); + + fp.write(buffer, bufferLength); + fp.close(); +} + +static void SetLayerEnableMask(uint64 mask) +{ + NGPGfx->SetLayerEnableMask(mask); +} + +static const IDIISG IDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "a", "A", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + { "b", "B", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "option", "OPTION", 4, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + IDII + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo, "gamepad" } +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".ngp", gettext_noop("Neo Geo Pocket ROM Image") }, + { ".ngc", gettext_noop("Neo Geo Pocket Color ROM Image") }, + { NULL, NULL } +}; + +MDFNGI EmulatedNGP = +{ + "ngp", + "Neo Geo Pocket (Color)", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + SetLayerEnableMask, + "Background Scroll\0Foreground Scroll\0Sprites\0", + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + NGPSettings, + MDFN_MASTERCLOCK_FIXED(6144000), + 0, + + false, // Multires possible? + + 160, // lcm_width + 152, // lcm_height + NULL, // Dummy + + 160, // Nominal width + 152, // Nominal height + + 160, // Framebuffer width + 152, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/ngp/neopop.h b/Mednafen/mednafen/ngp/neopop.h new file mode 100644 index 0000000000..c67fbc4350 --- /dev/null +++ b/Mednafen/mednafen/ngp/neopop.h @@ -0,0 +1,187 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __NEOPOP__ +#define __NEOPOP__ +//============================================================================= + +#include +#include + +#include +#include +#include +#include + +#include "TLCS-900h/TLCS900h_disassemble.h" +#include "TLCS-900h/TLCS900h_interpret_dst.h" +#include "TLCS-900h/TLCS900h_interpret.h" +#include "TLCS-900h/TLCS900h_interpret_reg.h" +#include "TLCS-900h/TLCS900h_interpret_single.h" +#include "TLCS-900h/TLCS900h_interpret_src.h" +#include "TLCS-900h/TLCS900h_registers.h" + + +// I put the TLCS900h code in its own namespace, so it doesn't +// pollute the global namespace with all of its CARAZZZY short-named global variables. +// (I'm too lazy to clean up and turn it into an object :b) +using namespace TLCS900H; + +//============================================================================= + + +//=========================== +// GCC specific +//=========================== + +#ifndef max +#define max(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifndef min +#define min(a,b) ((a)<(b)?(a):(b)) +#endif + +//COLOURMODE +typedef enum +{ + COLOURMODE_GREYSCALE, + COLOURMODE_COLOUR, + COLOURMODE_AUTO +} +COLOURMODE; + +//RomInfo +typedef struct +{ + uint8* data; //Pointer to the rom data + uint8 *orig_data; // Original data(without flash writes during emulation; necessary for save states) + + uint32 length; //Length of the rom + + uint8 name[16]; //Null terminated string, holding the Game name +} +RomInfo; + +//RomHeader +typedef struct +{ + uint8 licence[28]; // 0x00 - 0x1B + uint8 startPC[4]; // 0x1C - 0x1F + uint8 catalog[2]; // 0x20 - 0x21 + uint8 subCatalog; // 0x22 + uint8 mode; // 0x23 + uint8 name[12]; // 0x24 - 0x2F + + uint8 reserved1[4]; // 0x30 - 0x33 + uint8 reserved2[4]; // 0x34 - 0x37 + uint8 reserved3[4]; // 0x38 - 0x3B + uint8 reserved4[4]; // 0x3C - 0x3F +} __attribute__((__packed__)) RomHeader; + +//============================================================================= + +//----------------------------------------------------------------------------- +// Core <--> System-Main Interface +//----------------------------------------------------------------------------- + + void reset(void); + +/* Fill the bios rom area with a bios. call once at program start */ + bool bios_install(void); + + extern RomInfo ngpc_rom; + + extern RomHeader* rom_header; + +/*! Emulate a single instruction with correct TLCS900h:Z80 timing */ + + void emulate(void); + +/*! Call this function when a rom has just been loaded, it will perform + the system independent actions required. */ + + void rom_loaded(void); + +/*! Tidy up the rom and free the resources used. */ + + void rom_unload(void); + + //========================================= + +/*! Used to generate a critical message for the user. After the message + has been displayed, the function should return. The message is not + necessarily a fatal error. */ + + void system_message(char* vaMessage,...); + +//----------------------------------------------------------------------------- +// Core <--> System-Graphics Interface +//----------------------------------------------------------------------------- + + // Physical screen dimensions +#define SCREEN_WIDTH 160 +#define SCREEN_HEIGHT 152 + + extern COLOURMODE system_colour; + + +//----------------------------------------------------------------------------- +// Core <--> System-IO Interface +//----------------------------------------------------------------------------- + +/*! Reads a byte from the other system. If no data is available or no + high-level communications have been established, then return FALSE. + If buffer is NULL, then no data is read, only status is returned */ + + bool system_comms_read(uint8* buffer); + + +/*! Peeks at any data from the other system. If no data is available or + no high-level communications have been established, then return FALSE. + If buffer is NULL, then no data is read, only status is returned */ + + bool system_comms_poll(uint8* buffer); + + +/*! Writes a byte from the other system. This function should block until + the data is written. USE RELIABLE COMMS! Data cannot be re-requested. */ + + void system_comms_write(uint8 data); + + +/*! Reads as much of the file specified by 'filename' into the given, + preallocated buffer. This is rom data */ + + bool system_io_rom_read(char* filename, uint8* buffer, uint32 bufferLength); + + +/*! Reads the "appropriate" (system specific) flash data into the given + preallocated buffer. The emulation core doesn't care where from. */ + + bool system_io_flash_read(uint8* buffer, uint32 bufferLength); + + +/*! Writes the given flash data into an "appropriate" (system specific) + place. The emulation core doesn't care where to. */ + + void system_io_flash_write(uint8* buffer, uint32 bufferLength); + +void int_redo_icache(void); + +#include "gfx.h" + +extern NGPGFX_CLASS *NGPGfx; +extern uint8 NGPJoyLatch; +#endif diff --git a/Mednafen/mednafen/ngp/rom.cpp b/Mednafen/mednafen/ngp/rom.cpp new file mode 100644 index 0000000000..bf2479c9ee --- /dev/null +++ b/Mednafen/mednafen/ngp/rom.cpp @@ -0,0 +1,131 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include "flash.h" +#include "interrupt.h" + +//============================================================================= + +RomInfo ngpc_rom; +RomHeader* rom_header; + +#define MATCH_CATALOG(c, s) (MDFN_de16lsb(rom_header->catalog) == (c) && rom_header->subCatalog == (s)) + +//============================================================================= +static void rom_hack(void) +{ + //============================= + // SPECIFIC ROM HACKS ! + //============================= + + //"Neo-Neo! V1.0 (PD)" + if (MATCH_CATALOG(0, 16)) + { + ngpc_rom.data[0x23] = 0x10; // Fix rom header + + MDFN_printf("HACK: \"Neo-Neo! V1.0 (PD)\"\n"); + } + + //"Cool Cool Jam SAMPLE (U)" + if (MATCH_CATALOG(4660, 161)) + { + ngpc_rom.data[0x23] = 0x10; // Fix rom header + + MDFN_printf("HACK: \"Cool Cool Jam SAMPLE (U)\"\n"); + } + + //"Dokodemo Mahjong (J)" + if (MATCH_CATALOG(51, 33)) + { + ngpc_rom.data[0x23] = 0x00; // Fix rom header + + MDFN_printf("HACK: \"Dokodemo Mahjong (J)\"\n"); + } +} + +//============================================================================= + +static void rom_display_header(void) +{ + MDFN_printf(_("Name: %s\n"), ngpc_rom.name); + MDFN_printf(_("System: ")); + + if(rom_header->mode & 0x10) + MDFN_printf(_("Color")); + else + MDFN_printf(_("Greyscale")); + + MDFN_printf("\n"); + + MDFN_printf(_("Catalog: %u (sub %u)\n"), + MDFN_de16lsb(rom_header->catalog), + rom_header->subCatalog); + + //Starting PC + MDFN_printf(_("Starting PC: 0x%06X\n"), MDFN_de32lsb(rom_header->startPC) & 0xFFFFFF); +} + +//============================================================================= + +//----------------------------------------------------------------------------- +// rom_loaded() +//----------------------------------------------------------------------------- +void rom_loaded(void) +{ + //Extract the header + rom_header = (RomHeader*)(ngpc_rom.data); + + //Rom Name + for(int i = 0; i < 12; i++) + { + if (rom_header->name[i] >= 32 && rom_header->name[i] < 128) + ngpc_rom.name[i] = rom_header->name[i]; + else + ngpc_rom.name[i] = ' '; + } + ngpc_rom.name[12] = 0; + + rom_hack(); //Apply a hack if required! + + rom_display_header(); + + ngpc_rom.orig_data = (uint8 *)MDFN_malloc_T(ngpc_rom.length, _("ROM FLASH backup")); + memcpy(ngpc_rom.orig_data, ngpc_rom.data, ngpc_rom.length); +} + +//----------------------------------------------------------------------------- +// rom_unload() +//----------------------------------------------------------------------------- +void rom_unload(void) +{ + if(ngpc_rom.data) + { + MDFN_free(ngpc_rom.data); + ngpc_rom.data = NULL; + ngpc_rom.length = 0; + rom_header = 0; + + for(int i = 0; i < 16; i++) + ngpc_rom.name[i] = 0; + } + + if(ngpc_rom.orig_data) + { + MDFN_free(ngpc_rom.orig_data); + ngpc_rom.orig_data = NULL; + } +} + +//============================================================================= diff --git a/Mednafen/mednafen/ngp/rtc.cpp b/Mednafen/mednafen/ngp/rtc.cpp new file mode 100644 index 0000000000..1cead040ac --- /dev/null +++ b/Mednafen/mednafen/ngp/rtc.cpp @@ -0,0 +1,66 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#include "neopop.h" +#include + +static uint8 rtc_latch[7]; + +static void update_rtc_latch(void) +{ + uint8 low, high; + + struct tm *localTime; + time_t long_time; + + //Get the system time + time(&long_time); + localTime = localtime(&long_time); + if (localTime) + { + low = localTime->tm_year - 100; high = low; //Years + rtc_latch[0x00] = ((high / 10) << 4) | (low % 10); + + low = localTime->tm_mon + 1; high = low; //Months + rtc_latch[0x01] = ((high / 10) << 4) | (low % 10); + + low = localTime->tm_mday; high = low; //Days + rtc_latch[0x02] = ((high / 10) << 4) | (low % 10); + + low = localTime->tm_hour; high = low; //Hours + rtc_latch[0x03] = ((high / 10) << 4) | (low % 10); + + low = localTime->tm_min; high = low; //Minutes + rtc_latch[0x04] = ((high / 10) << 4) | (low % 10); + + low = localTime->tm_sec; high = low; //Seconds + rtc_latch[0x05] = ((high / 10) << 4) | (low % 10); + + rtc_latch[0x06] = ((rtc_latch[0x00] % 4)<<4) | (localTime->tm_wday & 0x0F); + } +} + + + +uint8 rtc_read8(uint32 address) +{ + if(address >= 0x0091 && address <= 0x0097) + { + if(address == 0x0091) + update_rtc_latch(); + + return(rtc_latch[address - 0x0091]); + } + return(0); +} diff --git a/Mednafen/mednafen/ngp/rtc.h b/Mednafen/mednafen/ngp/rtc.h new file mode 100644 index 0000000000..3c954de0f1 --- /dev/null +++ b/Mednafen/mednafen/ngp/rtc.h @@ -0,0 +1,6 @@ +#ifndef __NGP_RTC_H +#define __NGP_RTC_H + +uint8 rtc_read8(uint32 address); + +#endif diff --git a/Mednafen/mednafen/ngp/sound.cpp b/Mednafen/mednafen/ngp/sound.cpp new file mode 100644 index 0000000000..61300539c2 --- /dev/null +++ b/Mednafen/mednafen/ngp/sound.cpp @@ -0,0 +1,154 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "neopop.h" +#include "sound.h" + +#include +#include "T6W28_Apu.h" +#include + +static T6W28_Apu apu; + +static Stereo_Buffer st_buf; + +static uint8 LastDACLeft = 0, LastDACRight = 0; +static uint8 CurrentDACLeft = 0, CurrentDACRight = 0; + +typedef Blip_Synth Synth; +static Synth synth; +extern int32 ngpc_soundTS; +static bool schipenable = 0; + +void MDFNNGPCSOUND_SetEnable(bool set) +{ + schipenable = set; + if(!set) + apu.reset(); +} + +void Write_SoundChipLeft(uint8 data) +{ + if(schipenable) + apu.write_data_left(ngpc_soundTS >> 1, data); +} + +void Write_SoundChipRight(uint8 data) +{ + if(schipenable) + apu.write_data_right(ngpc_soundTS >> 1, data); +} + + +void dac_write_left(uint8 data) +{ + CurrentDACLeft = data; + + synth.offset_inline(ngpc_soundTS >> 1, CurrentDACLeft - LastDACLeft, st_buf.left()); + + LastDACLeft = data; +} + +void dac_write_right(uint8 data) +{ + CurrentDACRight = data; + + synth.offset_inline(ngpc_soundTS >> 1, CurrentDACRight - LastDACRight, st_buf.right()); + + LastDACRight = data; +} + + +int32 MDFNNGPCSOUND_Flush(int16 *SoundBuf, const int32 MaxSoundFrames) +{ + int32 FrameCount = 0; + + apu.end_frame(ngpc_soundTS >> 1); + + st_buf.end_frame(ngpc_soundTS >> 1); + + if(SoundBuf) + FrameCount = st_buf.read_samples(SoundBuf, MaxSoundFrames * 2) / 2; + else + st_buf.clear(); + + return(FrameCount); +} + +static void RedoVolume(void) +{ + apu.output(st_buf.center(), st_buf.left(), st_buf.right()); + apu.volume(0.30); + synth.volume(0.40); +} + +void MDFNNGPCSOUND_Init(void) +{ + MDFNNGPC_SetSoundRate(0); + st_buf.clock_rate((long)(3072000)); + + RedoVolume(); + st_buf.bass_freq(20); +} + +bool MDFNNGPC_SetSoundRate(uint32 rate) +{ + st_buf.set_sample_rate(rate?rate:44100, 60); + return(TRUE); +} + +int MDFNNGPCSOUND_StateAction(StateMem *sm, int load, int data_only) +{ + T6W28_ApuState sn_state; + + apu.save_state(&sn_state); + + SFORMAT StateRegs[] = + { + SFVAR(CurrentDACLeft), + SFVAR(CurrentDACRight), + + SFVAR(schipenable), + + SFARRAY32N(sn_state.volume_left, 4, "VolumeLeft"), + SFARRAY32N(sn_state.volume_right, 4, "VolumeRight"), + SFARRAY32N(sn_state.sq_period, 3, "SQPeriod"), + SFARRAY32N(sn_state.sq_phase, 3, "SQPhase"), + SFVARN(sn_state.noise_period, "NPeriod"), + SFVARN(sn_state.noise_shifter, "NShifter"), + SFVARN(sn_state.noise_tap, "NTap"), + SFVARN(sn_state.latch_left, "LatchLeft"), + SFVARN(sn_state.latch_right, "LatchRight"), + SFEND + }; + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "SND")) + { + return(0); + } + + if(load) + { + apu.load_state(&sn_state); + synth.offset(ngpc_soundTS >> 1, CurrentDACLeft - LastDACLeft, st_buf.left()); + synth.offset(ngpc_soundTS >> 1, CurrentDACRight - LastDACRight, st_buf.right()); + LastDACLeft = CurrentDACLeft; + LastDACRight = CurrentDACRight; + } + + return(1); +} diff --git a/Mednafen/mednafen/ngp/sound.h b/Mednafen/mednafen/ngp/sound.h new file mode 100644 index 0000000000..b7eb7a404b --- /dev/null +++ b/Mednafen/mednafen/ngp/sound.h @@ -0,0 +1,30 @@ +//--------------------------------------------------------------------------- +// NEOPOP : Emulator as in Dreamland +// +// Copyright (c) 2001-2002 by neopop_uk +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. See also the license.txt file for +// additional informations. +//--------------------------------------------------------------------------- + +#ifndef __NEOPOP_SOUND__ +#define __NEOPOP_SOUND__ + +void Write_SoundChipLeft(uint8 data); +void Write_SoundChipRight(uint8 data); + +void dac_write_left(uint8); +void dac_write_right(uint8); + +int32 MDFNNGPCSOUND_Flush(int16 *SoundBuf, const int32 MaxSoundFrames); +void MDFNNGPCSOUND_Init(void); +bool MDFNNGPC_SetSoundRate(uint32 rate); +int MDFNNGPCSOUND_StateAction(StateMem *sm, int load, int data_only); +void MDFNNGPCSOUND_SetEnable(bool set); + +#endif diff --git a/Mednafen/mednafen/pce/Makefile.am b/Mednafen/mednafen/pce/Makefile.am new file mode 100644 index 0000000000..89a969821d --- /dev/null +++ b/Mednafen/mednafen/pce/Makefile.am @@ -0,0 +1,11 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libpce.a +libpce_a_SOURCES = pce.cpp vce.cpp input.cpp huc.cpp pcecd.cpp hes.cpp tsushin.cpp mcgenjin.cpp +libpce_a_SOURCES += input/gamepad.cpp input/tsushinkb.cpp input/mouse.cpp +if WANT_DEBUGGER +libpce_a_SOURCES += debug.cpp +endif + diff --git a/Mednafen/mednafen/pce/Makefile.in b/Mednafen/mednafen/pce/Makefile.in new file mode 100644 index 0000000000..d5631c09d7 --- /dev/null +++ b/Mednafen/mednafen/pce/Makefile.in @@ -0,0 +1,714 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = debug.cpp +subdir = src/pce +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libpce_a_AR = $(AR) $(ARFLAGS) +libpce_a_LIBADD = +am__libpce_a_SOURCES_DIST = pce.cpp vce.cpp input.cpp huc.cpp \ + pcecd.cpp hes.cpp tsushin.cpp mcgenjin.cpp input/gamepad.cpp \ + input/tsushinkb.cpp input/mouse.cpp debug.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@WANT_DEBUGGER_TRUE@am__objects_1 = debug.$(OBJEXT) +am_libpce_a_OBJECTS = pce.$(OBJEXT) vce.$(OBJEXT) input.$(OBJEXT) \ + huc.$(OBJEXT) pcecd.$(OBJEXT) hes.$(OBJEXT) tsushin.$(OBJEXT) \ + mcgenjin.$(OBJEXT) input/gamepad.$(OBJEXT) \ + input/tsushinkb.$(OBJEXT) input/mouse.$(OBJEXT) \ + $(am__objects_1) +libpce_a_OBJECTS = $(am_libpce_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libpce_a_SOURCES) +DIST_SOURCES = $(am__libpce_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libpce.a +libpce_a_SOURCES = pce.cpp vce.cpp input.cpp huc.cpp pcecd.cpp hes.cpp \ + tsushin.cpp mcgenjin.cpp input/gamepad.cpp input/tsushinkb.cpp \ + input/mouse.cpp $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pce/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/pce/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +input/$(am__dirstamp): + @$(MKDIR_P) input + @: > input/$(am__dirstamp) +input/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) input/$(DEPDIR) + @: > input/$(DEPDIR)/$(am__dirstamp) +input/gamepad.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/tsushinkb.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/mouse.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) + +libpce.a: $(libpce_a_OBJECTS) $(libpce_a_DEPENDENCIES) $(EXTRA_libpce_a_DEPENDENCIES) + $(AM_V_at)-rm -f libpce.a + $(AM_V_AR)$(libpce_a_AR) libpce.a $(libpce_a_OBJECTS) $(libpce_a_LIBADD) + $(AM_V_at)$(RANLIB) libpce.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f input/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mcgenjin.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pce.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcecd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsushin.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vce.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/gamepad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/mouse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/tsushinkb.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f input/$(DEPDIR)/$(am__dirstamp) + -rm -f input/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/pce/debug.cpp b/Mednafen/mednafen/pce/debug.cpp new file mode 100644 index 0000000000..1021b11095 --- /dev/null +++ b/Mednafen/mednafen/pce/debug.cpp @@ -0,0 +1,1237 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITPCES FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include +#include +#include + +#include +#include +#include "debug.h" +#include "vce.h" +#include "huc.h" +#include +#include "pcecd.h" +#include +#include +#include + +namespace MDFN_IEN_PCE +{ + +static HuC6280 *ShadowCPU = NULL; + + +extern VCE *vce; +extern ArcadeCard *arcade_card; + +static PCE_PSG *psg = NULL; + +static bool IsSGX; + +static void RedoDH(void); + +// +// +// +#define NUMBT 64 +struct BTEntry +{ + uint32 from; + uint32 to; + uint32 vector; + uint32 branch_count; + bool valid; +}; + +static int BTIndex; +static BTEntry BTEntries[NUMBT]; +static bool BTEnabled; +// +// +// + + +typedef struct __PCE_BPOINT +{ + unsigned int A[2]; + int type; + bool logical; +} PCE_BPOINT; + +static std::vector BreakPointsRead, BreakPointsWrite, BreakPointsAux0Read, BreakPointsAux0Write; + +static uint8 BreakPointsPC[65536 / 8]; +static bool BreakPointsPCUsed; + +static uint8 BreakPointsOp[256]; +static bool BreakPointsOpUsed; + + +static bool NeedExecSimu; // Cache variable, recalculated in RedoDH(). + +static void (*CPUCB)(uint32 PC, bool bpoint) = NULL; +static bool CPUCBContinuous = false; +static bool FoundBPoint = false; +static void (*LogFunc)(const char *, const char *); +bool PCE_LoggingOn = FALSE; +static uint16 LastPC = 0xBEEF; + +static void AddBranchTrace(uint32 from, uint32 to, uint32 vector) +{ + BTEntry *prevbt = &BTEntries[(BTIndex + NUMBT - 1) % NUMBT]; + + from &= 0xFFFF; + to &= 0xFFFF; + + //if(BTEntries[(BTIndex - 1) & 0xF] == PC) return; + + if(prevbt->from == from && prevbt->to == to && prevbt->vector == vector && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid) + prevbt->branch_count++; + else + { + BTEntries[BTIndex].from = from; + BTEntries[BTIndex].to = to; + BTEntries[BTIndex].vector = vector; + BTEntries[BTIndex].branch_count = 1; + BTEntries[BTIndex].valid = true; + + BTIndex = (BTIndex + 1) % NUMBT; + } +} + +static void EnableBranchTrace(bool enable) +{ + BTEnabled = enable; + if(!enable) + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + } + RedoDH(); +} + +static std::vector GetBranchTrace(void) +{ + BranchTraceResult tmp; + std::vector ret; + + for(int x = 0; x < NUMBT; x++) + { + const BTEntry *bt = &BTEntries[(x + BTIndex) % NUMBT]; + + if(!bt->valid) + continue; + + tmp.count = bt->branch_count; + trio_snprintf(tmp.from, sizeof(tmp.from), "%04X", bt->from); + trio_snprintf(tmp.to, sizeof(tmp.to), "%04X", bt->to); + + tmp.code[1] = 0; + switch(bt->vector) + { + default: tmp.code[0] = 0; + break; + + case 0xFFFE: + tmp.code[0] = 'R'; // RESET + break; + + case 0xFFFA: + tmp.code[0] = 'T'; // TIMER + break; + + case 0xFFF8: + tmp.code[0] = '1'; // IRQ1 + break; + + case 0xFFF6: + tmp.code[0] = '2'; // IRQ2 + break; + } + + ret.push_back(tmp); + } + return(ret); +} + +static INLINE bool TestOpBP(uint8 opcode) +{ + return(BreakPointsOp[opcode]); +} + +static INLINE bool TestPCBP(uint16 PC) +{ + return((BreakPointsPC[PC >> 3] >> (PC & 0x7)) & 1); +} + +void PCEDBG_CheckBP(int type, uint32 address, unsigned int len) +{ + std::vector::iterator bpit, bpit_end; + + if(type == BPOINT_READ) + { + bpit = BreakPointsRead.begin(); + bpit_end = BreakPointsRead.end(); + } + else if(type == BPOINT_WRITE) + { + bpit = BreakPointsWrite.begin(); + bpit_end = BreakPointsWrite.end(); + } + else if(type == BPOINT_AUX_READ) + { + bpit = BreakPointsAux0Read.begin(); + bpit_end = BreakPointsAux0Read.end(); + } + else if(type == BPOINT_AUX_WRITE) + { + bpit = BreakPointsAux0Write.begin(); + bpit_end = BreakPointsAux0Write.end(); + } + else + return; + + for(; bpit != bpit_end; bpit++) + { + uint32 tmp_address = address; + uint32 tmp_len = len; + + while(tmp_len--) + { + if(tmp_address >= bpit->A[0] && tmp_address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + tmp_address++; + } + } +} + + +uint32 PCEDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ret = 0; + + PCE_InDebug++; + + for(unsigned int i = 0; i < bsize; i++) + { + if(logical) + { + A &= 0xFFFF; + + ret |= HuCPU->PeekLogical(A) << (i * 8); + } + else + { + A &= (1 << 21) - 1; + + ret |= HuCPU->PeekPhysical(A) << (i * 8); + } + + A++; + } + + PCE_InDebug--; + + return(ret); +} + +void PCEDBG_IRQ(int level) +{ + if(level == 0) // NMI + { + + } + else if(level == 1) + HuCPU->IRQBegin(HuC6280::IQIRQ1); + else if(level == 2) + HuCPU->IRQBegin(HuC6280::IQIRQ2); + else if(level == 3) + HuCPU->IRQBegin(HuC6280::IQTIMER); +} + +class DisPCE : public Dis6280 +{ + public: + DisPCE(void) + { + + } + + uint8 GetX(void) + { + return(HuCPU->GetRegister(HuC6280::GSREG_X)); + } + + uint8 GetY(void) + { + return(HuCPU->GetRegister(HuC6280::GSREG_Y)); + } + + uint8 Read(uint16 A) + { + uint8 ret; + + PCE_InDebug++; + + ret = HuCPU->PeekLogical(A); + + PCE_InDebug--; + + return(ret); + } +}; + +static DisPCE DisObj; + +void PCEDBG_Disassemble(uint32 &a, uint32 SpecialA, char *TextBuf) +{ + uint16 tmpa = a; + std::string ret; + + DisObj.Disassemble(tmpa, SpecialA, TextBuf); + + a = tmpa; +} + +static void TestRWBP(void) NO_INLINE; +static void TestRWBP(void) +{ + ShadowCPU->LoadShadow(*HuCPU); + + vce->ResetSimulateVDC(); + + ShadowCPU->Run(TRUE); + + //printf("%d, %02x\n",ShadowCPU->IRQlow); + //assert(!ShadowCPU->IRQlow); +} + +static bool MachineStateChanged = false; +void PCEDBG_MachineStateChanged(void) +{ + if(PCE_InDebug) + MachineStateChanged = true; +} + +static bool CPUHandler(uint32 PC) +{ + // MachineStateChanged can be set to true under CPUCB(). + + PCE_InDebug++; + + FoundBPoint = TestPCBP(PC) | TestOpBP(HuCPU->PeekLogical(PC)); + + if(NeedExecSimu) + TestRWBP(); + + CPUCBContinuous |= FoundBPoint; + if(CPUCBContinuous && CPUCB) + { + vce->Update(HuCPU->Timestamp()); + CPUCB(PC, FoundBPoint); + } + + if(PC == 0xe060 && PCE_LoggingOn && PCE_IsCD) + { + uint16 sjis_glyph; + + sjis_glyph = HuCPU->PeekLogical(0x20F8) | (HuCPU->PeekLogical(0x20F9) << 8); + PCEDBG_DoLog("BIOS", "Call EX_GETFNT from $%04X, ax=0x%04x = %s", LastPC, sjis_glyph, PCEDBG_ShiftJIS_to_UTF8(sjis_glyph)); + } + LastPC = PC; + PCE_InDebug--; + assert(!PCE_InDebug); + + bool ret = MachineStateChanged; + MachineStateChanged = 0; + return(ret); +} + +static DECLFR(ReadHandler) +{ + std::vector::iterator bpit; + + if((A & 0x1FFFFF) >= (0xFF * 8192) && (A & 0x1FFFFF) <= (0xFF * 8192 + 0x3FF)) + { + VDC_SimulateResult result; + + int which_vdc = vce->SimulateReadVDC(A & 0x80000003, &result); + + if(result.ReadCount) + PCEDBG_CheckBP(BPOINT_AUX_READ, (which_vdc << 16) | result.ReadStart, result.ReadCount); + + if(result.WriteCount) + PCEDBG_CheckBP(BPOINT_AUX_WRITE, (which_vdc << 16) | result.WriteStart, result.WriteCount); + + if(result.RegReadDone) + PCEDBG_CheckBP(BPOINT_AUX_READ, 0x20000 | (which_vdc << 16) | result.RegRWIndex, 1); + } + + for(bpit = BreakPointsRead.begin(); bpit != BreakPointsRead.end(); bpit++) + { + unsigned int testA = bpit->logical ? ShadowCPU->GetLastLogicalReadAddr() : A; + + if(testA >= bpit->A[0] && testA <= bpit->A[1]) + { + FoundBPoint = 1; + break; + } + } + + return(HuCPU->PeekPhysical(A)); +} + +static DECLFW(WriteHandler) +{ + std::vector::iterator bpit; + + if((A & 0x1FFFFF) >= (0xFF * 8192) && (A & 0x1FFFFF) <= (0xFF * 8192 + 0x3FF)) + { + VDC_SimulateResult result; + + int which_vdc = vce->SimulateWriteVDC(A & 0x80000003, V, &result); + + if(result.ReadCount) + PCEDBG_CheckBP(BPOINT_AUX_READ, (which_vdc << 16) | result.ReadStart, result.ReadCount); + + if(result.WriteCount) + PCEDBG_CheckBP(BPOINT_AUX_WRITE, (which_vdc << 16) | result.WriteStart, result.WriteCount); + + if(result.RegWriteDone) + PCEDBG_CheckBP(BPOINT_AUX_WRITE, 0x20000 | (which_vdc << 16) | result.RegRWIndex, 1); + } + + + for(bpit = BreakPointsWrite.begin(); bpit != BreakPointsWrite.end(); bpit++) + { + unsigned int testA; + + if(!bpit->logical) + testA = A; + else + { + if(A & 0x80000000) continue; // Ignore ST0/ST1/ST2 writes, which always use hardcoded physical addresses. + + testA = ShadowCPU->GetLastLogicalWriteAddr(); + } + + if(testA >= bpit->A[0] && testA <= bpit->A[1]) + { + FoundBPoint = 1; + break; + } + } +} + +static void RedoDH(void) +{ + bool BPointsUsed; + + NeedExecSimu = BreakPointsRead.size() || BreakPointsWrite.size() || BreakPointsAux0Read.size() || BreakPointsAux0Write.size(); + + BPointsUsed = BreakPointsPCUsed || BreakPointsOpUsed || BreakPointsRead.size() || BreakPointsWrite.size() || + BreakPointsAux0Read.size() || BreakPointsAux0Write.size(); + + if(BPointsUsed || CPUCB || PCE_LoggingOn) + HuCPU->SetCPUHook(CPUHandler, BTEnabled ? AddBranchTrace : NULL); + else + HuCPU->SetCPUHook(NULL, BTEnabled ? AddBranchTrace : NULL); +} + +void PCEDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + PCE_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type =type; + tmp.logical = logical; + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_PC) + { + for(unsigned int i = A1; i <= A2; i++) + { + if((unsigned int)i < 65536) + { + BreakPointsPCUsed = true; + BreakPointsPC[i >> 3] |= 1 << (i & 0x7); + } + } + } + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.push_back(tmp); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.push_back(tmp); + else if(type == BPOINT_OP) + { + for(unsigned int i = A1; i <= A2; i++) + { + if((unsigned int)i < 256) + { + BreakPointsOpUsed = true; + BreakPointsOp[i] = 1; + } + } + } + + RedoDH(); +} + +void PCEDBG_FlushBreakPoints(int type) +{ + std::vector::iterator bpit; + + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_PC) + { + memset(BreakPointsPC, 0, sizeof(BreakPointsPC)); + BreakPointsPCUsed = false; + } + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.clear(); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.clear(); + else if(type == BPOINT_OP) + { + memset(BreakPointsOp, 0, sizeof(BreakPointsOp)); + BreakPointsOpUsed = false; + } + + RedoDH(); +} + +static void SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + CPUCB = callb; + CPUCBContinuous = continuous; + RedoDH(); +} + +void PCEDBG_DoLog(const char *type, const char *format, ...) +{ + if(LogFunc) + { + char *temp; + + va_list ap; + va_start(ap, format); + + temp = trio_vaprintf(format, ap); + LogFunc(type, temp); + free(temp); + + va_end(ap); + } +} + +static iconv_t sjis_ict = (iconv_t)-1; + +void PCEDBG_SetLogFunc(void (*func)(const char *, const char *)) +{ + LogFunc = func; + + PCE_LoggingOn = func ? TRUE : FALSE; + SCSICD_SetLog(func ? PCEDBG_DoLog : NULL); + + if(PCE_LoggingOn) + { + if(sjis_ict == (iconv_t)-1) + sjis_ict = iconv_open("UTF-8", "shift_jis"); + } + else + { + if(sjis_ict != (iconv_t)-1) + { + iconv_close(sjis_ict); + sjis_ict = (iconv_t)-1; + } + } + RedoDH(); +} + +char *PCEDBG_ShiftJIS_to_UTF8(const uint16 sjc) +{ + static char ret[16]; + char inbuf[3]; + char *in_ptr, *out_ptr; + size_t ibl, obl; + + ret[0] = 0; + + if(sjc < 256) + { + inbuf[0] = sjc; + inbuf[1] = 0; + ibl = 1; + } + else + { + inbuf[0] = sjc >> 8; + inbuf[1] = sjc >> 0; + inbuf[2] = 0; + ibl = 2; + } + + in_ptr = inbuf; + out_ptr = ret; + obl = 16; + + iconv(sjis_ict, (ICONV_CONST char **)&in_ptr, &ibl, &out_ptr, &obl); + + return(ret); +} + +extern uint64 PCE_TimestampBase; +static uint32 GetRegister_HuC6280(const unsigned int id, char *special, const uint32 special_len) +{ + if(id == HuC6280::GSREG_STAMP) + { + return(PCE_TimestampBase + HuCPU->GetRegister(id, special, special_len)); + } + return(HuCPU->GetRegister(id, special, special_len)); +} + +static void SetRegister_HuC6280(const unsigned int id, uint32 value) +{ + HuCPU->SetRegister(id, value); +} + +static uint32 GetRegister_PSG(const unsigned int id, char *special, const uint32 special_len) +{ + return(psg->GetRegister(id, special, special_len)); +} + +static void SetRegister_PSG(const unsigned int id, uint32 value) +{ + psg->SetRegister(id, value); +} + +static uint32 GetRegister_VDC(const unsigned int id, char *special, const uint32 special_len) +{ + if(id & 0x8000) + return(vce->GetRegister(id &~ 0x8000, special, special_len)); + + return(vce->GetRegisterVDC(0, id, special, special_len)); +} + +static void SetRegister_VDC(const unsigned int id, uint32 value) +{ + if(id & 0x8000) + { + vce->SetRegister(id &~ 0x8000, value); + return; + } + + vce->SetRegisterVDC(0, id, value); +} + +static uint32 GetRegister_SGXVDC(const unsigned int id, char *special, const uint32 special_len) +{ + if(id & 0x8000) + return(vce->GetRegister(id &~ 0x8000, special, special_len)); + + return(vce->GetRegisterVDC(1, id, special, special_len)); +} + +static void SetRegister_SGXVDC(const unsigned int id, uint32 value) +{ + if(id & 0x8000) + { + vce->SetRegister(id &~ 0x8000, value); + return; + } + + vce->SetRegisterVDC(1, id, value); +} + +static uint32 GetRegister_CD(const unsigned int id, char *special, const uint32 special_len) +{ + return(PCECD_GetRegister(id, special, special_len)); +} + +static void SetRegister_CD(const unsigned int id, uint32 value) +{ + PCECD_SetRegister(id, value); +} + + +static RegType Regs_HuC6280[] = +{ + { HuC6280::GSREG_PC, "PC", "Program Counter", 2 }, + { HuC6280::GSREG_A, "A", "Accumulator", 1 }, + { HuC6280::GSREG_X, "X", "X Index Register", 1 }, + { HuC6280::GSREG_Y, "Y", "Y Index Register", 1 }, + { HuC6280::GSREG_SP, "SP", "Stack Pointer", 1 }, + { HuC6280::GSREG_P, "P", "Status", 1 }, + { HuC6280::GSREG_MPR0, "MPR0", "MPR0", 1}, + { HuC6280::GSREG_MPR1, "MPR1", "MPR1", 1}, + { HuC6280::GSREG_MPR2, "MPR2", "MPR2", 1}, + { HuC6280::GSREG_MPR3, "MPR3", "MPR3", 1}, + { HuC6280::GSREG_MPR4, "MPR4", "MPR4", 1}, + { HuC6280::GSREG_MPR5, "MPR5", "MPR5", 1}, + { HuC6280::GSREG_MPR6, "MPR6", "MPR6", 1}, + { HuC6280::GSREG_MPR7, "MPR7", "MPR7", 1}, + { HuC6280::GSREG_SPD, "SPD", "CPU Speed", 1 }, + { HuC6280::GSREG_IRQM, "IRQM", "IRQ Mask", 1}, + { HuC6280::GSREG_TIMS, "TIMS", "Timer Status", 1}, + { HuC6280::GSREG_TIMV, "TIMV", "Timer Value", 1}, + { HuC6280::GSREG_TIML, "TIML", "Timer Load", 1}, + { HuC6280::GSREG_TIMD, "TIMD", "Timer Div Counter", 2}, + { 0, "------", "", 0xFFFF }, \ + { HuC6280::GSREG_STAMP, "TS", "Timestamp", 4 }, + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_HuC6280 = +{ + "HuC6280", + Regs_HuC6280, + GetRegister_HuC6280, + SetRegister_HuC6280 +}; + + +#define CHPDMOO(n) \ + { 0, "------", "", 0xFFFF }, \ + { PSG_GSREG_CH0_FREQ | (n << 8), "CH"#n"Freq", "PSG Ch"#n" Frequency(Period)", 2 }, \ + { PSG_GSREG_CH0_CTRL | (n << 8), "CH"#n"Ctrl", "PSG Ch"#n" Control", 1 }, \ + { PSG_GSREG_CH0_BALANCE | (n << 8), "CH"#n"Balance", "PSG Ch"#n" Balance", 1 }, \ + { PSG_GSREG_CH0_WINDEX | (n << 8), "CH"#n"WIndex", "PSG Ch"#n" Waveform Index", 1}, \ + { PSG_GSREG_CH0_SCACHE | (n << 8), "CH"#n"SCache", "PSG Ch"#n" Sample Cache", 1 } + +static RegType Regs_PSG[] = +{ + { PSG_GSREG_SELECT, "Select", "PSG Channel Select", 1 }, + { PSG_GSREG_GBALANCE, "GBalance", "PSG Global Balance", 1 }, + { PSG_GSREG_LFOFREQ, "LFOFreq", "PSG LFO Freq", 1 }, + { PSG_GSREG_LFOCTRL, "LFOCtrl", "PSG LFO Control", 1 }, + + CHPDMOO(0), + CHPDMOO(1), + CHPDMOO(2), + CHPDMOO(3), + CHPDMOO(4), + { PSG_GSREG_CH4_NCTRL, "CH4NCtrl", "PSG Ch4 Noise Control", 1 }, + { PSG_GSREG_CH4_LFSR, "CH4LFSR", "PSG Ch4 Noise LFSR", 2 }, + CHPDMOO(5), + { PSG_GSREG_CH5_NCTRL, "CH5NCtrl", "PSG Ch5 Noise Control", 1 }, + { PSG_GSREG_CH5_LFSR, "CH5LFSR", "PSG Ch5 Noise LFSR", 2 }, + + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_PSG = +{ + "PSG", + Regs_PSG, + GetRegister_PSG, + SetRegister_PSG +}; + +static RegType Regs_VDC[] = +{ + { VDC::GSREG_SELECT, "Select", "Register Select", 1 }, + { VDC::GSREG_STATUS, "Status", "Status", 1 }, + + { VDC::GSREG_MAWR, "MAWR", "Memory Write Address", 2 }, + { VDC::GSREG_MARR, "MARR", "Memory Read Address", 2 }, + { VDC::GSREG_CR, "CR", "Control", 2 }, + { VDC::GSREG_RCR, "RCR", "Raster Counter", 2 }, + { VDC::GSREG_BXR, "BXR", "X Scroll", 2 }, + { VDC::GSREG_BYR, "BYR", "Y Scroll", 2 }, + { VDC::GSREG_MWR, "MWR", "Memory Width", 2 }, + + { VDC::GSREG_HSR, "HSR", "HSR", 2 }, + { VDC::GSREG_HDR, "HDR", "HDR", 2 }, + { VDC::GSREG_VSR, "VSR", "VSR", 2 }, + { VDC::GSREG_VDR, "VDR", "VDR", 2 }, + + { VDC::GSREG_VCR, "VCR", "VCR", 2 }, + { VDC::GSREG_DCR, "DCR", "DMA Control", 2 }, + { VDC::GSREG_SOUR, "SOUR", "VRAM DMA Source Address", 2 }, + { VDC::GSREG_DESR, "DESR", "VRAM DMA Dest Address", 2 }, + { VDC::GSREG_LENR, "LENR", "VRAM DMA Length", 2 }, + { VDC::GSREG_DVSSR, "DVSSR", "DVSSR Update Address", 2 }, + { 0, "------", "", 0xFFFF }, + + { 0x8000 | VCE::GSREG_CR, "VCECR", "VCE Control Register", 1 }, + { 0x8000 | VCE::GSREG_CTA, "VCECTA", "VCE Color/Palette Table Address", 2 }, + { 0x8000 | VCE::GSREG_SCANLINE, "Line", "Current Scanline", 2 }, + + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_VDC = +{ + "VDC", + Regs_VDC, + GetRegister_VDC, + SetRegister_VDC +}; + + +static RegType Regs_SGXVDC[] = +{ + { VDC::GSREG_SELECT, "Select", "Register Select, VDC-B", 1 }, + { VDC::GSREG_STATUS, "Status", "Status, VDC-B", 1 }, + + { VDC::GSREG_MAWR, "MAWR-B", "Memory Write Address, VDC-B", 2 }, + { VDC::GSREG_MARR, "MARR-B", "Memory Read Address, VDC-B", 2 }, + { VDC::GSREG_CR, "CR-B", "Control, VDC-B", 2 }, + { VDC::GSREG_RCR, "RCR-B", "Raster Counter, VDC-B", 2 }, + { VDC::GSREG_BXR, "BXR-B", "X Scroll, VDC-B", 2 }, + { VDC::GSREG_BYR, "BYR-B", "Y Scroll, VDC-B", 2 }, + { VDC::GSREG_MWR, "MWR-B", "Memory Width, VDC-B", 2 }, + + { VDC::GSREG_HSR, "HSR-B", "HSR, VDC-B", 2 }, + { VDC::GSREG_HDR, "HDR-B", "HDR, VDC-B", 2 }, + { VDC::GSREG_VSR, "VSR-B", "VSR, VDC-B", 2 }, + { VDC::GSREG_VDR, "VDR-B", "VDR, VDC-B", 2 }, + + { VDC::GSREG_VCR, "VCR-B", "VCR, VDC-B", 2 }, + { VDC::GSREG_DCR, "DCR-B", "DMA Control, VDC-B", 2 }, + { VDC::GSREG_SOUR, "SOUR-B", "VRAM DMA Source Address, VDC-B", 2 }, + { VDC::GSREG_DESR, "DESR-B", "VRAM DMA Dest Address, VDC-B", 2 }, + { VDC::GSREG_LENR, "LENR-B", "VRAM DMA Length, VDC-B", 2 }, + { VDC::GSREG_DVSSR, "DVSSR-B", "DVSSR Update Address, VDC-B", 2 }, + { 0, "------", "", 0xFFFF }, + + { 0x8000 | VCE::GSREG_ST_MODE, "STMode", "ST(ST0/ST1/ST2) Mode/Target", 1 }, + { 0x8000 | VCE::GSREG_PRIORITY_0, "PRIO0", "VPC Priority Register 0", 1 }, + { 0x8000 | VCE::GSREG_PRIORITY_1, "PRIO1", "VPC Priority Register 1", 1 }, + { 0x8000 | VCE::GSREG_WINDOW_WIDTH_0, "WIND0", "VPC Window Width Register 0", 2 }, + { 0x8000 | VCE::GSREG_WINDOW_WIDTH_1, "WIND1", "VPC Window Width Register 1", 2 }, + + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_SGXVDC = +{ + "VDC-B", + Regs_SGXVDC, + GetRegister_SGXVDC, + SetRegister_SGXVDC +}; + +static RegType Regs_CD[] = +{ + { CD_GSREG_BSY, "BSY", "SCSI BSY", 1 }, + { CD_GSREG_REQ, "REQ", "SCSI REQ", 1 }, + { CD_GSREG_MSG, "MSG", "SCSI MSG", 1 }, + { CD_GSREG_IO, "IO", "SCSI IO", 1 }, + { CD_GSREG_CD, "CD", "SCSI CD", 1 }, + { CD_GSREG_SEL, "SEL", "SCSI SEL", 1 }, + + { 0, "---ADPCM:---", "", 0xFFFF }, + { CD_GSREG_ADPCM_CONTROL, "Control", "ADPCM Control", 1 }, + { CD_GSREG_ADPCM_FREQ, "Freq", "ADPCM Frequency", 1 }, + { CD_GSREG_ADPCM_CUR, "CUR", "ADPCM Current 12-bit Value", 2 }, + { CD_GSREG_ADPCM_WRADDR, "WrAddr", "ADPCM Write Address", 2 }, + { CD_GSREG_ADPCM_RDADDR, "RdAddr", "ADPCM Read Address", 2 }, + { CD_GSREG_ADPCM_LENGTH, "Length", "ADPCM Length", 2 }, + { CD_GSREG_ADPCM_PLAYNIBBLE, "PlNibble", "ADPCM Play Nibble Select", 1 }, + + { CD_GSREG_ADPCM_PLAYING, "Playing", "ADPCM Playing Flag", 1 }, + { CD_GSREG_ADPCM_HALFREACHED, "Half", "ADPCM Half-point Reached Flag", 1 }, + { CD_GSREG_ADPCM_ENDREACHED, "End", "ADPCM End Reached Flag", 1 } , + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_CD = +{ + "CD", + Regs_CD, + GetRegister_CD, + SetRegister_CD +}; + +static void Do16BitGet(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + int wc = 0; + + if(!strcmp(name, "vram0")) + wc = 0; + else if(!strcmp(name, "vram1")) + wc = 1; + else if(!strcmp(name, "sat0")) + wc = 2; + else if(!strcmp(name, "sat1")) + wc = 3; + else if(!strcmp(name, "pram")) + wc = 4; + + while(Length) + { + uint16 data; + + if(wc == 4) + data = vce->PeekPRAM((Address >> 1) & 0x1FF); + else if(wc & 2) + data = vce->PeekVDCSAT(wc & 1, (Address >> 1) & 0xFF); + else + data = vce->PeekVDCVRAM(wc & 1, (Address >> 1) & 0x7FFF); + + if((Address & 1) || Length == 1) + { + *Buffer = data >> ((Address & 1) << 3); + Buffer++; + Address++; + Length--; + } + else + { + Buffer[0] = data & 0xFF; + Buffer[1] = data >> 8; + + Buffer += 2; + Address += 2; + Length -= 2; + } + } +} + +static void Do16BitPut(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + int wc = 0; + + if(!strcmp(name, "vram0")) + wc = 0; + else if(!strcmp(name, "vram1")) + wc = 1; + else if(!strcmp(name, "sat0")) + wc = 2; + else if(!strcmp(name, "sat1")) + wc = 3; + else if(!strcmp(name, "pram")) + wc = 4; + + while(Length) + { + uint16 data; + int inc_amount; + + if((Address & 1) || Length == 1) + { + if(wc == 4) + data = vce->PeekPRAM((Address >> 1) & 0x1FF); + else if(wc & 2) + data = vce->PeekVDCSAT(wc & 1, (Address >> 1) & 0xFF); + else + data = vce->PeekVDCVRAM(wc & 1, (Address >> 1) & 0x7FFF); + + data &= ~(0xFF << ((Address & 1) << 3)); + data |= *Buffer << ((Address & 1) << 3); + + inc_amount = 1; + } + else + { + data = Buffer[0] | (Buffer[1] << 8); + inc_amount = 2; + } + + if(wc == 4) + vce->PokePRAM((Address >> 1) & 0x1FF, data); + else if(wc & 2) + vce->PokeVDCSAT(wc & 1, (Address >> 1) & 0xFF, data); + else + vce->PokeVDCVRAM(wc & 1, (Address >> 1) & 0x7FFF, data); + + Buffer += inc_amount; + Address += inc_amount; + Length -= inc_amount; + } +} + + +static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + PCE_InDebug++; + + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFF; + + *Buffer = HuCPU->PeekLogical(Address); + + Address++; + Buffer++; + } + } + else if(!strcmp(name, "physical")) + { + while(Length--) + { + Address &= 0x1FFFFF; + + *Buffer = HuCPU->PeekPhysical(Address); + + Address++; + Buffer++; + } + + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= (IsSGX ? 32768 : 8192) - 1; + *Buffer = PCE_PeekMainRAM(Address); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "adpcm")) + ADPCM_PeekRAM(Address, Length, Buffer); + else if(!strcmp(name, "acram")) + arcade_card->PeekRAM(Address, Length, Buffer); + else if(!strcmp(name, "bram")) + { + while(Length--) + { + Address &= 0x7FF; + *Buffer = HuC_PeekBRAM(Address); + Address++; + Buffer++; + } + } + else if(!strncmp(name, "psgram", 6)) + psg->PeekWave(name[6] - '0', Address, Length, Buffer); + + PCE_InDebug--; +} + +static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + PCE_InDebug++; + + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFF; + + HuCPU->PokeLogical(Address, *Buffer, hl); + + Address++; + Buffer++; + } + } + else if(!strcmp(name, "physical")) + { + while(Length--) + { + Address &= 0x1FFFFF; + + HuCPU->PokePhysical(Address, *Buffer, hl); + + Address++; + Buffer++; + } + + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= (IsSGX ? 32768 : 8192) - 1; + PCE_PokeMainRAM(Address, *Buffer); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "adpcm")) + ADPCM_PokeRAM(Address, Length, Buffer); + else if(!strcmp(name, "acram")) + arcade_card->PokeRAM(Address, Length, Buffer); + else if(!strcmp(name, "bram")) + { + while(Length--) + { + Address &= 0x7FF; + HuC_PokeBRAM(Address, *Buffer); + Address++; + Buffer++; + } + } + else if(!strncmp(name, "psgram", 6)) + psg->PokeWave(name[6] - '0', Address, Length, Buffer); + + PCE_InDebug--; +} + + +static void SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn) +{ + vce->SetGraphicsDecode(surface, line, which, xscroll, yscroll, pbn); +} + +DebuggerInfoStruct PCEDBGInfo = +{ + "shift_jis", + 7, + 1, // Instruction alignment(bytes) + 16, + 21, + 0x2000, + 0x2000, // ZP + + PCEDBG_MemPeek, + PCEDBG_Disassemble, + NULL, + PCEDBG_IRQ, + NULL, //NESDBG_GetVector, + PCEDBG_FlushBreakPoints, + PCEDBG_AddBreakPoint, + SetCPUCallback, + EnableBranchTrace, + GetBranchTrace, + SetGraphicsDecode, + PCEDBG_SetLogFunc, +}; + +static void Cleanup(void) +{ + if(ShadowCPU != NULL) + { + delete ShadowCPU; + ShadowCPU = NULL; + } +} + +void PCEDBG_Kill(void) +{ + Cleanup(); +} + +void PCEDBG_Init(bool sgx, PCE_PSG *new_psg) +{ + try + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + BTEnabled = false; + + BreakPointsPCUsed = false; + BreakPointsOpUsed = false; + + memset(BreakPointsOp, 0, sizeof(BreakPointsOp)); + memset(BreakPointsPC, 0, sizeof(BreakPointsPC)); + + ShadowCPU = new HuC6280(); + + for(int x = 0; x < 0x100; x++) + { + ShadowCPU->SetFastRead(x, NULL); + + ShadowCPU->SetReadHandler(x, ReadHandler); + ShadowCPU->SetWriteHandler(x, WriteHandler); + } + + ShadowCPU->Power(); + + psg = new_psg; + + IsSGX = sgx; + + MDFNDBG_AddRegGroup(&RegsGroup_HuC6280); + MDFNDBG_AddRegGroup(&RegsGroup_VDC); + + if(IsSGX) + MDFNDBG_AddRegGroup(&RegsGroup_SGXVDC); + + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "cpu", "CPU Logical", 16); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "physical", "CPU Physical", 21); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ram", "RAM", IsSGX ? 15 : 13); + + ASpace_Add(Do16BitGet, Do16BitPut, "pram", "VCE Palette RAM", 10); + + if(IsSGX) + { + ASpace_Add(Do16BitGet, Do16BitPut, "vram0", "VDC-A VRAM", 15 + 1); + ASpace_Add(Do16BitGet, Do16BitPut, "sat0", "VDC-A SAT", 8 + 1); + ASpace_Add(Do16BitGet, Do16BitPut, "vram1", "VDC-B VRAM", 15 + 1); + ASpace_Add(Do16BitGet, Do16BitPut, "sat1", "VDC-B SAT", 8 + 1); + } + else + { + ASpace_Add(Do16BitGet, Do16BitPut, "vram0", "VDC VRAM", 15 + 1); + ASpace_Add(Do16BitGet, Do16BitPut, "sat0", "VDC SAT", 8 + 1); + } + + if(PCE_IsCD) + { + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "adpcm", "ADPCM RAM", 16); + MDFNDBG_AddRegGroup(&RegsGroup_CD); + } + + if(arcade_card) + { + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "acram", "Arcade Card RAM", 21); + } + + if(HuC_IsBRAMAvailable()) + { + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "bram", "BRAM", 11); + } + + for(int x = 0; x < 6; x++) + { + AddressSpaceType newt; + char tmpname[128], tmpinfo[128]; + + trio_snprintf(tmpname, 128, "psgram%d", x); + trio_snprintf(tmpinfo, 128, "PSG Ch %d RAM", x); + + newt.GetAddressSpaceBytes = GetAddressSpaceBytes; + newt.PutAddressSpaceBytes = PutAddressSpaceBytes; + + newt.name = std::string(tmpname); + newt.long_name = std::string(tmpinfo); + newt.TotalBits = 5; + newt.NP2Size = 0; + + newt.IsWave = TRUE; + newt.WaveFormat = ASPACE_WFMT_UNSIGNED; + newt.WaveBits = 5; + ASpace_Add(newt); //PSG_GetAddressSpaceBytes, PSG_PutAddressSpaceBytes, tmpname, tmpinfo, 5); + } + MDFNDBG_AddRegGroup(&RegsGroup_PSG); + } + catch(...) + { + Cleanup(); + throw; + } +} + + +}; diff --git a/Mednafen/mednafen/pce/debug.h b/Mednafen/mednafen/pce/debug.h new file mode 100644 index 0000000000..792b855ec2 --- /dev/null +++ b/Mednafen/mednafen/pce/debug.h @@ -0,0 +1,46 @@ +#ifndef _PCE_DEBUG_H +#define _PCE_DEBUG_H + +#ifdef WANT_DEBUGGER + +#include + +namespace MDFN_IEN_PCE +{ + +void PCEDBG_MachineStateChanged(void); + +void PCEDBG_FlushBreakPoints(int type); +void PCEDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical); + +uint32 PCEDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical); +void PCEDBG_IRQ(int level); +uint32 PCEDBG_GetVector(int level); +void PCEDBG_Disassemble(uint32 &a, uint32 SpecialA, char *); + +void PCEDBG_CheckBP(int type, uint32 address, unsigned int len); + +void PCEDBG_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer); +void PCEDBG_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer); + + +void PCEDBG_SetLogFunc(void (*func)(const char *, const char *)); + +void PCEDBG_DoLog(const char *type, const char *format, ...); +char *PCEDBG_ShiftJIS_to_UTF8(const uint16 sjc); + +void PCEDBG_EnableUsageMap(bool); + +extern bool PCE_LoggingOn; +extern bool PCE_UsageMapOn; + +extern DebuggerInfoStruct PCEDBGInfo; + +void PCEDBG_Init(bool sgx, PCE_PSG *psg); +void PCEDBG_Kill(void); + +}; + +#endif + +#endif diff --git a/Mednafen/mednafen/pce/hes.cpp b/Mednafen/mednafen/pce/hes.cpp new file mode 100644 index 0000000000..04057f8e9d --- /dev/null +++ b/Mednafen/mednafen/pce/hes.cpp @@ -0,0 +1,325 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "hes.h" +#include "huc.h" +#include "pcecd.h" +#include + +namespace MDFN_IEN_PCE +{ + +static uint8 mpr_start[8]; +static uint8 IBP[0x100]; +static uint8 *rom = NULL, *rom_backup = NULL; + +static uint8 CurrentSong; +static bool bootstrap; +static bool ROMWriteWarningGiven; + +uint8 ReadIBP(unsigned int A) +{ + if(!(A & 0x100)) + return(IBP[A & 0xFF]); + + if(bootstrap) + { + if(!PCE_InDebug) + { + memcpy(rom + 0x1FF0, rom_backup + 0x1FF0, 16); + bootstrap = false; + } + return(CurrentSong); + } + + return(0xFF); +} + +static DECLFW(HESROMWrite) +{ + if(bootstrap) + { + puts("Write during bootstrap?"); + return; + } + + rom[A] = V; + //printf("%08x: %02x\n", A, V); + if(!ROMWriteWarningGiven) + { + MDFN_printf(_("Warning: HES is writing to physical address %08x. Future warnings of this nature are temporarily disabled for this HES file.\n"), A); + ROMWriteWarningGiven = TRUE; + } +} + +static const uint8 BootROM[16] = { 0xA9, 0xFF, 0x53, 0x01, 0xEA, 0xEA, 0xEA, 0xEA, + 0xEA, 0xEA, 0xEA, 0x4C, 0x00, 0x1C, 0xF0, 0xFF }; + +static DECLFR(HESROMRead) +{ + return(rom[A]); +} + +static void Cleanup(void) +{ + if(rom) + { + MDFN_free(rom); + rom = NULL; + } + + if(rom_backup) + { + MDFN_free(rom_backup); + rom_backup = NULL; + } +} + +static const uint8 vdc_init_rom[] = +{ + 0xA0, 0x01, + + 0x8C, 0x0E, 0x00, // SGFX ST_mode + + // + // + // + 0xA2, 0x1F, + + 0x8E, 0x00, 0x00, + 0x8E, 0x10, 0x00, + + 0x13, 0x00, + 0x23, 0x00, + 0xCA, + 0x10, 0xF3, + // + // + // + 0x03, 0x0A, + 0x13, 0x02, + 0x23, 0x02, + + 0x03, 0x0B, + 0x13, 0x1F, + 0x23, 0x04, + + 0x03, 0x0C, + 0x13, 0x02, + 0x23, 0x0D, + + 0x03, 0x0D, + 0x13, 0xEF, + 0x23, 0x00, + + 0x03, 0x0E, + 0x13, 0x04, + + 0x88, + 0x10, 0xCF, + + // VCE init + 0xA9, 0x04, + 0x8D, 0x00, 0x04, +}; + +void HES_Load(MDFNFILE* fp) +{ + try + { + uint32 LoadAddr, LoadSize; + uint16 InitAddr; + uint8 StartingSong; + int TotalSongs; + uint8 header[0x10]; + uint8 sub_header[0x10]; + + fp->read(header, 0x10); + + if(memcmp(header, "HESM", 4)) + throw MDFN_Error(0, _("HES header magic is invalid.")); + + InitAddr = MDFN_de16lsb(&header[0x6]); + + rom = (uint8 *)MDFN_malloc_T(0x88 * 8192, _("HES ROM")); + rom_backup = (uint8 *)MDFN_malloc_T(0x88 * 8192, _("HES ROM")); + + MDFN_printf(_("HES Information:\n")); + MDFN_AutoIndent aind(1); + + StartingSong = header[5]; + + MDFN_printf(_("Init address: 0x%04x\n"), InitAddr); + MDFN_printf(_("Starting song: %d\n"), StartingSong + 1); + + for(int x = 0; x < 8; x++) + { + mpr_start[x] = header[0x8 + x]; + MDFN_printf("MPR%d: 0x%02x\n", x, mpr_start[x]); + } + + memset(rom, 0, 0x88 * 8192); + memset(rom_backup, 0, 0x88 * 8192); + + while(fp->read(sub_header, 0x10, false) == 0x10) + { + LoadSize = MDFN_de32lsb(&sub_header[0x4]); + LoadAddr = MDFN_de32lsb(&sub_header[0x8]); + + //printf("Size: %08x(%d), Addr: %08x, La: %02x\n", LoadSize, LoadSize, LoadAddr, LoadAddr / 8192); + MDFN_printf(_("Chunk load:\n")); + + MDFN_AutoIndent aindc(1); + MDFN_printf(_("File offset: 0x%08llx\n"), (unsigned long long)fp->tell() - 0x10); + MDFN_printf(_("Load size: 0x%08x\n"), LoadSize); + MDFN_printf(_("Load target address: 0x%08x\n"), LoadAddr); + + // 0x88 * 8192 = 0x110000 + if(((uint64)LoadAddr + LoadSize) > 0x110000) + { + MDFN_printf(_("Warning: HES is trying to load data past boundary.\n")); + + if(LoadAddr >= 0x110000) + break; + + LoadSize = 0x110000 - LoadAddr; + } + + uint64 rc = fp->read(rom + LoadAddr, LoadSize, false); + if(rc < LoadSize) + { + MDFN_printf(_("Warning: HES tried to load %llu bytes more data than exists!\n"), (unsigned long long)(LoadSize - rc)); + } + } + + memcpy(rom_backup, rom, 0x88 * 8192); + + // + // Try to detect SuperGrafx rips in the future? + // + //for(unsigned i = 0; i < 0x80; i++) + //{ + // printf("0x%02x: 0x%08x\n", i, (uint32)crc32(0, &rom[i * 8192], 8192)); + //} + // + // + // + + CurrentSong = StartingSong; + TotalSongs = 256; + uint8 *IBP_WR = IBP; + + for(int i = 0; i < 8; i++) + { + *IBP_WR++ = 0xA9; // LDA (immediate) + *IBP_WR++ = mpr_start[i]; + *IBP_WR++ = 0x53; // TAM + *IBP_WR++ = 1 << i; + } + + // Initialize VDC registers. + memcpy(IBP_WR, vdc_init_rom, sizeof(vdc_init_rom)); + IBP_WR += sizeof(vdc_init_rom); + + *IBP_WR++ = 0xAD; // LDA(absolute) + *IBP_WR++ = 0x00; // + *IBP_WR++ = 0x1D; // + *IBP_WR++ = 0x20; // JSR + *IBP_WR++ = InitAddr; // JSR target LSB + *IBP_WR++ = InitAddr >> 8; // JSR target MSB + *IBP_WR++ = 0x58; // CLI + *IBP_WR++ = 0xCB; // (Mednafen Special) + *IBP_WR++ = 0x80; // BRA + *IBP_WR++ = 0xFD; // -3 + + assert((unsigned int)(IBP_WR - IBP) <= sizeof(IBP)); + + Player_Init(TotalSongs, "", "", ""); //NULL, NULL, NULL, NULL); //UTF8 **snames); + + for(int x = 0; x < 0x88; x++) + { + if(x) + HuCPU->SetFastRead(x, rom + x * 8192); + HuCPU->SetReadHandler(x, HESROMRead); + HuCPU->SetWriteHandler(x, HESROMWrite); + } + + ROMWriteWarningGiven = FALSE; + } + catch(...) + { + Cleanup(); + throw; + } +} + +void HES_Reset(void) +{ + memcpy(rom, rom_backup, 0x88 * 8192); + memcpy(rom + 0x1FF0, BootROM, 16); + bootstrap = true; +} + +void HES_Update(EmulateSpecStruct *espec, uint16 jp_data) +{ + static uint8 last = 0; + bool needreload = 0; + + if((jp_data & 0x20) && !(last & 0x20)) + { + CurrentSong++; + needreload = 1; + } + + if((jp_data & 0x80) && !(last & 0x80)) + { + CurrentSong--; + needreload = 1; + } + + if((jp_data & 0x8) && !(last & 0x8)) + needreload = 1; + + if((jp_data & 0x10) && !(last & 0x10)) + { + CurrentSong += 10; + needreload = 1; + } + + if((jp_data & 0x40) && !(last & 0x40)) + { + CurrentSong -= 10; + needreload = 1; + } + + last = jp_data; + + if(needreload) + PCE_Power(); + + if(!espec->skip) + Player_Draw(espec->surface, &espec->DisplayRect, CurrentSong, espec->SoundBuf, espec->SoundBufSize); +} + +void HES_Close(void) +{ + Cleanup(); +} + + +}; diff --git a/Mednafen/mednafen/pce/hes.h b/Mednafen/mednafen/pce/hes.h new file mode 100644 index 0000000000..d768c4b34e --- /dev/null +++ b/Mednafen/mednafen/pce/hes.h @@ -0,0 +1,15 @@ +#ifndef __MDFN_PCE_HES_H +#define __MDFN_PCE_HES_H + +namespace MDFN_IEN_PCE +{ + +uint8 ReadIBP(unsigned int A); +void HES_Load(MDFNFILE* fp); +void HES_Reset(void); +void HES_Update(EmulateSpecStruct *espec, uint16 jp_data); +void HES_Close(void); + +}; + +#endif diff --git a/Mednafen/mednafen/pce/huc.cpp b/Mednafen/mednafen/pce/huc.cpp new file mode 100644 index 0000000000..b2f49e44be --- /dev/null +++ b/Mednafen/mednafen/pce/huc.cpp @@ -0,0 +1,647 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "huc.h" +#include "pcecd.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "mcgenjin.h" + +namespace MDFN_IEN_PCE +{ + +static const uint8 BRAM_Init_String[8] = { 'H', 'U', 'B', 'M', 0x00, 0x88, 0x10, 0x80 }; //"HUBM\x00\x88\x10\x80"; +static bool BRAM_Disabled; // Cached at game load, don't remove this caching behavior or save game loss may result(if we ever get a GUI). + +ArcadeCard *arcade_card = NULL; + +static MCGenjin *mcg = NULL; +static uint8 *HuCROM = NULL; +static uint8 *ROMMap[0x100] = { NULL }; + +static bool IsPopulous; +bool IsTsushin; +bool PCE_IsCD; + +static uint8 *TsushinRAM = NULL; // 0x8000 +static uint8 *PopRAM = NULL; // 0x8000 +static uint8 SaveRAM[2048]; +static uint8 *CDRAM = NULL; //262144; + +static uint8 *SysCardRAM = NULL; + +static void Cleanup(void) +{ + if(HuCROM) + { + MDFN_free(HuCROM); + HuCROM = NULL; + } + + if(PopRAM) + { + MDFN_free(PopRAM); + PopRAM = NULL; + } + + if(TsushinRAM) + { + MDFN_free(TsushinRAM); + TsushinRAM = NULL; + } + + if(CDRAM) + { + MDFN_free(CDRAM); + CDRAM = NULL; + } + + if(SysCardRAM) + { + MDFN_free(SysCardRAM); + SysCardRAM = NULL; + } + + if(arcade_card) + { + delete arcade_card; + arcade_card = NULL; + } + + if(mcg) + { + delete mcg; + mcg = NULL; + } +} + + +static DECLFR(AC_PhysRead) +{ + return(arcade_card->PhysRead(A, PCE_InDebug)); +} + +static DECLFW(AC_PhysWrite) +{ + return(arcade_card->PhysWrite(A, V)); +} + +static DECLFW(SysCardRAMWrite) +{ + SysCardRAM[A - 0x68 * 8192] = V; +} + +static DECLFR(SysCardRAMRead) +{ + return(SysCardRAM[A - 0x68 * 8192]); +} + +static DECLFW(CDRAMWrite) +{ + CDRAM[A - 0x80 * 8192] = V; +} + +static DECLFR(CDRAMRead) +{ + return(CDRAM[A - 0x80 * 8192]); +} + +static DECLFR(SaveRAMRead) +{ + if(BRAM_Disabled) + return(0xFF); + + if((!PCE_IsCD || PCECD_IsBRAMEnabled()) && (A & 8191) < 2048) + return(SaveRAM[A & 2047]); + else + return(0xFF); +} + +static DECLFW(SaveRAMWrite) +{ + if(BRAM_Disabled) + return; + + if((!PCE_IsCD || PCECD_IsBRAMEnabled()) && (A & 8191) < 2048) + SaveRAM[A & 2047] = V; +} + +static DECLFR(HuCRead) +{ + return(ROMMap[A >> 13][A]); +} + +static DECLFW(HuCRAMWrite) +{ + ROMMap[A >> 13][A] = V; +} + +static uint8 HuCSF2Latch; +static uint8 HuCSF2BankMask; + +static DECLFR(HuCSF2ReadLow) +{ + return(HuCROM[A]); +} + +static DECLFR(HuCSF2Read) +{ + return(HuCROM[(A & 0x7FFFF) + 0x80000 + (HuCSF2Latch & HuCSF2BankMask) * 0x80000 ]); +} + +static DECLFW(HuCSF2Write) +{ + if((A & 0x1FF0) == 0x1FF0) + HuCSF2Latch = A & 0xF; +} + +static DECLFR(MCG_ReadHandler) +{ + return mcg->Read(HuCPU->Timestamp(), A); +} + +static DECLFW(MCG_WriteHandler) +{ + mcg->Write(HuCPU->Timestamp(), A, V); +} + +static void LoadSaveMemory(const std::string& path, uint8* const data, const uint64 len, bool possibly_gz = true) +{ + try + { + std::unique_ptr fp(possibly_gz ? (Stream*)(new GZFileStream(path, GZFileStream::MODE::READ)) : (Stream*)(new FileStream(path, FileStream::MODE_READ))); + const uint64 fp_size_tmp = fp->size(); + + if(fp_size_tmp != len) + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu bytes."), path.c_str(), (unsigned long long)fp_size_tmp, (unsigned long long)len); + + fp->read(data, len); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } +} + +uint32 HuC_Load(MDFNFILE* fp, bool DisableBRAM, SysCardType syscard) +{ + uint32 crc = 0; + const uint32 sf2_threshold = 2048 * 1024; + bool sf2_mapper = FALSE; + bool mcg_mapper = FALSE; + bool UseBRAM = FALSE; + + try + { + uint64 len, m_len; + + len = fp->size(); + if(len & 512) // Skip copier header. + { + len &= ~512; + fp->seek(512, SEEK_SET); + } + m_len = (len + 8191) &~ 8191; + + if(len >= 8192) + { + uint8 buf[8192]; + + fp->read(buf, 8192); + + if(!memcmp(buf + 0x1FD0, "MCGENJIN", 8)) + mcg_mapper = TRUE; + + fp->seek(-8192, SEEK_CUR); // Seek backwards so we don't undo skip copier header. + } + + if(!syscard && m_len >= sf2_threshold && !mcg_mapper) + { + sf2_mapper = TRUE; + + // Only used the "extended" SF2 mapper if it's considerably larger than the normal SF2 mapper size. + if(m_len < (512 * 1024 * 6)) + m_len = 512 * 1024 * 5; + else + m_len = round_up_pow2(m_len - 512 * 1024) + 512 * 1024; + + if(m_len > 8912896) + throw MDFN_Error(0, _("ROM image is too large for extended SF2 mapper!")); + + HuCSF2BankMask = ((m_len - 512 * 1024) / (512 * 1024)) - 1; + + //printf("%d %d, %02x\n", len, m_len, HuCSF2BankMask); + } + + IsPopulous = 0; + PCE_IsCD = 0; + + if(syscard != SYSCARD_NONE) + { + CDRAM = (uint8 *)MDFN_calloc_T(1, 8 * 8192, _("CD RAM")); + + for(int x = 0x80; x < 0x88; x++) + { + ROMMap[x] = &CDRAM[(x - 0x80) * 8192] - x * 8192; + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + + HuCPU->SetReadHandler(x, CDRAMRead); + HuCPU->SetWriteHandler(x, CDRAMWrite); + } + MDFNMP_AddRAM(8 * 8192, 0x80 * 8192, CDRAM); + + UseBRAM = TRUE; + } + + if(mcg_mapper) + { + mcg = new MCGenjin(fp); + + for(unsigned i = 0; i < 128; i++) + { + HuCPU->SetFastRead(i, NULL); + HuCPU->SetReadHandler(i, MCG_ReadHandler); + HuCPU->SetWriteHandler(i, MCG_WriteHandler); + } + + for(unsigned i = 0; i < mcg->GetNVPDC(); i++) + { + uint32 nvs = mcg->GetNVSize(i); + + if(nvs) + { + char buf[32]; + std::vector tmp_buf; + + tmp_buf.resize(nvs); + trio_snprintf(buf, sizeof(buf), "mg%d", i); + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, buf), &tmp_buf[0], tmp_buf.size(), false); + mcg->WriteNV(i, &tmp_buf[0], 0, tmp_buf.size()); + } + } + + goto BRAM_Init; // SO EVIL YES EVVIIIIIL(FIXME) + } + + HuCROM = (uint8 *)MDFN_malloc_T(m_len, _("HuCard ROM")); + memset(HuCROM, 0xFF, m_len); + fp->read(HuCROM, std::min(m_len, len)); + crc = crc32(0, HuCROM, std::min(m_len, len)); + + if(syscard == SYSCARD_NONE) + { + md5_context md5; + md5.starts(); + md5.update(HuCROM, std::min(m_len, len)); + md5.finish(MDFNGameInfo->MD5); + + MDFN_printf(_("ROM: %lluKiB\n"), (unsigned long long)(std::min(m_len, len) / 1024)); + MDFN_printf(_("ROM CRC32: 0x%08x\n"), crc); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + } + + if(m_len == 0x60000) + { + for(int x = 0; x < 128; x++) + { + ROMMap[x] = &HuCROM[(x & 0x1F) * 8192] - x * 8192; + + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + HuCPU->SetReadHandler(x, HuCRead); + } + + for(int x = 64; x < 128; x++) + { + ROMMap[x] = &HuCROM[((x & 0xF) + 32) * 8192] - x * 8192; + + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + HuCPU->SetReadHandler(x, HuCRead); + } + } + else if(m_len == 0x80000) + { + for(int x = 0; x < 64; x++) + { + ROMMap[x] = &HuCROM[(x & 0x3F) * 8192] - x * 8192; + + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + HuCPU->SetReadHandler(x, HuCRead); + } + for(int x = 64; x < 128; x++) + { + ROMMap[x] = &HuCROM[((x & 0x1F) + 32) * 8192] - x * 8192; + + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + HuCPU->SetReadHandler(x, HuCRead); + } + } + else + { + for(int x = 0; x < 128; x++) + { + uint8 bank = x % (m_len / 8192); + + ROMMap[x] = &HuCROM[bank * 8192] - x * 8192; + + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + HuCPU->SetReadHandler(x, HuCRead); + } + } + + if(syscard) + { + if(syscard == SYSCARD_3 || syscard == SYSCARD_ARCADE) + { + SysCardRAM = (uint8 *)MDFN_calloc_T(1, 24 * 8192, _("System Card RAM")); + + for(int x = 0x68; x < 0x80; x++) + { + ROMMap[x] = &SysCardRAM[(x - 0x68) * 8192] - x * 8192; + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + + HuCPU->SetReadHandler(x, SysCardRAMRead); + HuCPU->SetWriteHandler(x, SysCardRAMWrite); + } + MDFNMP_AddRAM(24 * 8192, 0x68 * 8192, SysCardRAM); + } + + if(syscard == SYSCARD_ARCADE) + { + arcade_card = new ArcadeCard(); + + for(int x = 0x40; x < 0x44; x++) + { + ROMMap[x] = NULL; + HuCPU->SetFastRead(x, NULL); + + HuCPU->SetReadHandler(x, AC_PhysRead); + HuCPU->SetWriteHandler(x, AC_PhysWrite); + } + } + } + else + { + if(!memcmp(HuCROM + 0x1F26, "POPULOUS", strlen("POPULOUS"))) + { + PopRAM = (uint8 *)MDFN_malloc_T(32768, _("Populous RAM")); + memset(PopRAM, 0xFF, 32768); + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), PopRAM, 32768); + + IsPopulous = 1; + MDFN_printf("Populous\n"); + for(int x = 0x40; x < 0x44; x++) + { + ROMMap[x] = &PopRAM[(x & 3) * 8192] - x * 8192; + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + + HuCPU->SetReadHandler(x, HuCRead); + HuCPU->SetWriteHandler(x, HuCRAMWrite); + } + MDFNMP_AddRAM(32768, 0x40 * 8192, PopRAM); + } + else if(crc == 0x34dc65c4) // Tsushin Booster + { + TsushinRAM = (uint8*)MDFN_malloc_T(0x8000, _("Tsushin Booster RAM")); + memset(TsushinRAM, 0xFF, 0x8000); + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), TsushinRAM, 32768); + + IsTsushin = 1; + MDFN_printf("Tsushin Booster\n"); + for(int x = 0x88; x < 0x8C; x++) + { + ROMMap[x] = &TsushinRAM[(x & 3) * 8192] - x * 8192; + HuCPU->SetFastRead(x, ROMMap[x] + x * 8192); + + HuCPU->SetReadHandler(x, HuCRead); + HuCPU->SetWriteHandler(x, HuCRAMWrite); + } + MDFNMP_AddRAM(32768, 0x88 * 8192, TsushinRAM); + } + else + UseBRAM = TRUE; + + // 0x1A558 + if(sf2_mapper) + { + for(int x = 0x20; x < 0x40; x++) + HuCPU->SetReadHandler(x, HuCSF2ReadLow); + for(int x = 0x40; x < 0x80; x++) + { + HuCPU->SetFastRead(x, NULL); // Make sure our reads go through our read function, and not a table lookup + HuCPU->SetReadHandler(x, HuCSF2Read); + } + HuCPU->SetWriteHandler(0, HuCSF2Write); + + MDFN_printf("Street Fighter 2 Mapper\n"); + HuCSF2Latch = 0; + } + } // end else to if(syscard) + + BRAM_Init: + + BRAM_Disabled = DisableBRAM; + if(BRAM_Disabled) + UseBRAM = false; + + if(UseBRAM) + { + // Initialize BRAM here so users don't have to manually intialize the file cabinet + // in the CD BIOS screen. + memset(SaveRAM, 0x00, 2048); + memcpy(SaveRAM, BRAM_Init_String, 8); + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), SaveRAM, 2048); + + HuCPU->SetWriteHandler(0xF7, SaveRAMWrite); + HuCPU->SetReadHandler(0xF7, SaveRAMRead); + MDFNMP_AddRAM(2048, 0xF7 * 8192, SaveRAM); + } + } + catch(...) + { + Cleanup(); + throw; + } + + return crc; +} + + +bool IsBRAMUsed(void) +{ + if(BRAM_Disabled) + return(false); + + if(memcmp(SaveRAM, BRAM_Init_String, 8)) // HUBM string is modified/missing + return(1); + + for(int x = 8; x < 2048; x++) + if(SaveRAM[x]) return(1); + + return(0); +} + +void HuC_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(PopRAM, IsPopulous ? 32768 : 0), + SFARRAY(TsushinRAM, IsTsushin ? 32768 : 0), + SFARRAY(SaveRAM, (IsPopulous || IsTsushin || BRAM_Disabled) ? 0 : 2048), + SFARRAY(CDRAM, CDRAM ? (8192 * 8) : 0), + SFARRAY(SysCardRAM, SysCardRAM ? (8192 * 24) : 0), + SFVAR(HuCSF2Latch), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "HuC"); + + if(load) + HuCSF2Latch &= 0xF; + + if(PCE_IsCD) + { + if(arcade_card) + arcade_card->StateAction(sm, load, data_only); + + PCECD_StateAction(sm, load, data_only); + } + + if(mcg) + mcg->StateAction(sm, load, data_only); +} + +void HuC_SaveNV(void) +{ + if(mcg) + { + for(unsigned i = 0; i < mcg->GetNVPDC(); i++) + { + uint32 nvs = mcg->GetNVSize(i); + + if(nvs) + { + char buf[32]; + + trio_snprintf(buf, sizeof(buf), "mg%d", i); + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, buf), mcg->ReadNV(i), nvs); + } + } + } + + if(IsPopulous) + { + if(PopRAM) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), PopRAM, 32768); + } + } + else if(IsTsushin) + { + if(TsushinRAM) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), TsushinRAM, 32768); + } + } + else if(!BRAM_Disabled && IsBRAMUsed()) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), SaveRAM, 2048); + } +} + +// +// HuC_Kill() may be called before HuC_Load*() is called or even after it errors out, so we have a separate HuC_SaveNV() +// to prevent save game file corruption in case of error. +void HuC_Kill(void) +{ + Cleanup(); +} + +void HuC_Update(int32 timestamp) +{ + if(mcg) + mcg->Update(timestamp); +} + +void HuC_ResetTS(int32 ts_base) +{ + if(mcg) + mcg->ResetTS(ts_base); +} + + +void HuC_Power(void) +{ + if(CDRAM) + memset(CDRAM, 0x00, 8 * 8192); + + if(SysCardRAM) + memset(SysCardRAM, 0x00, 24 * 8192); + + if(arcade_card) + arcade_card->Power(); + + HuCSF2Latch = 0; + + if(mcg) + mcg->Power(); +} + + +bool HuC_IsBRAMAvailable(void) +{ + if(IsPopulous) + return(false); + + if(IsTsushin) + return(false); + + if(BRAM_Disabled) + return(false); + + return(true); +} + +uint8 HuC_PeekBRAM(uint32 A) +{ + assert(HuC_IsBRAMAvailable()); + + return(SaveRAM[A & 2047]); +} + +void HuC_PokeBRAM(uint32 A, uint8 V) +{ + assert(HuC_IsBRAMAvailable()); + + SaveRAM[A & 2047] = V; +} + + +}; diff --git a/Mednafen/mednafen/pce/huc.h b/Mednafen/mednafen/pce/huc.h new file mode 100644 index 0000000000..c20687a0f9 --- /dev/null +++ b/Mednafen/mednafen/pce/huc.h @@ -0,0 +1,39 @@ +#ifndef __MDFN_PCE_HUC_H +#define __MDFN_PCE_HUC_H + +namespace MDFN_IEN_PCE +{ + +typedef enum +{ + SYSCARD_NONE = 0, + SYSCARD_1, + SYSCARD_2, + SYSCARD_3, + SYSCARD_ARCADE // 3.0 + extras +} SysCardType; + +uint32 HuC_Load(MDFNFILE* fp, bool DisableBRAM = false, SysCardType syscard = SYSCARD_NONE); +void HuC_SaveNV(void); +void HuC_Kill(void); + +void HuC_Update(int32 timestamp); +void HuC_ResetTS(int32 ts_base); + +void HuC_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +void HuC_Power(void); + +DECLFR(PCE_ACRead); +DECLFW(PCE_ACWrite); + +extern bool PCE_IsCD; +extern bool IsTsushin; + +// Debugger support functions. +bool HuC_IsBRAMAvailable(void); +uint8 HuC_PeekBRAM(uint32 A); +void HuC_PokeBRAM(uint32 A, uint8 V); +}; + +#endif diff --git a/Mednafen/mednafen/pce/input.cpp b/Mednafen/mednafen/pce/input.cpp new file mode 100644 index 0000000000..3a8e0ccdae --- /dev/null +++ b/Mednafen/mednafen/pce/input.cpp @@ -0,0 +1,397 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "input.h" +#include "huc.h" + +#include "vce.h" // For debugging only(but not the debugger :b) + +#include "input/gamepad.h" +#include "input/mouse.h" +#include "input/tsushinkb.h" + +#include + +namespace MDFN_IEN_PCE +{ + +enum +{ + PCEINPUT_NONE = 0, + PCEINPUT_GAMEPAD = 1, + PCEINPUT_MOUSE = 2, + PCEINPUT_TSUSHINKB = 3, +}; + +//PCE_Input_Device::PCE_Input_Device(int which) +//{ +// +//} + +PCE_Input_Device::~PCE_Input_Device() +{ + +} + +void PCE_Input_Device::Power(int32 timestamp) +{ + + +} + +void PCE_Input_Device::TransformInput(uint8* data, const bool DisableSR) +{ + + +} + +void PCE_Input_Device::AdjustTS(int32 delta) +{ + +} + +void PCE_Input_Device::Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) +{ + +} + +uint8 PCE_Input_Device::Read(int32 timestamp) +{ + return(0xF); +} + +void PCE_Input_Device::Update(const void *data) +{ + +} + +int PCE_Input_Device::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + return(1); +} + +static PCE_Input_Device *devices[5] = { NULL }; +static bool MultiTapEnabled = TRUE; +static int InputTypes[5] = { 0 }; +static uint8 *data_ptr[5]; +static bool SEL, CLR; +static uint8 read_index = 0; +static bool DisableSR = false; + +static void RemakeDevices(int which = -1) +{ + int s = 0; + int e = 5; + + if(which != -1) + { + s = which; + e = which + 1; + } + + for(int i = s; i < e; i++) + { + if(devices[i]) + delete devices[i]; + devices[i] = NULL; + + switch(InputTypes[i]) + { + default: + case PCEINPUT_NONE: break; + case PCEINPUT_GAMEPAD: devices[i] = PCEINPUT_MakeGamepad(); break; + case PCEINPUT_MOUSE: devices[i] = PCEINPUT_MakeMouse(); break; + case PCEINPUT_TSUSHINKB: devices[i] = PCEINPUT_MakeTsushinKB(); break; + } + } +} + + +static void SyncSettings(void); + +void PCEINPUT_SettingChanged(const char *name) +{ + SyncSettings(); +} + +void PCEINPUT_Init(void) +{ + SyncSettings(); + RemakeDevices(); +} + +void PCEINPUT_TransformInput(void) +{ + for(unsigned i = 0; i < 5; i++) + { + if(devices[i]) + devices[i]->TransformInput(data_ptr[i], DisableSR); + } +} + +void PCEINPUT_SetInput(unsigned port, const char *type, uint8 *ptr) +{ + assert(port < 5); + + if(!strcasecmp(type, "gamepad")) + InputTypes[port] = PCEINPUT_GAMEPAD; + else if(!strcasecmp(type, "mouse")) + InputTypes[port] = PCEINPUT_MOUSE; + else if(!strcasecmp(type, "tsushinkb")) + InputTypes[port] = PCEINPUT_TSUSHINKB; + else + InputTypes[port] = PCEINPUT_NONE; + + data_ptr[port] = (uint8 *)ptr; + + RemakeDevices(port); +} + +uint16 INPUT_HESHack(void) +{ + uint16 ret = 0; + + switch(InputTypes[0]) + { + case PCEINPUT_GAMEPAD: ret = MDFN_de16lsb(data_ptr[0]); + break; + } + return(ret); +} + +void INPUT_Frame(void) +{ + for(int i = 0; i < 5; i++) + if(devices[i]) + devices[i]->Update(data_ptr[i]); +} + +void INPUT_AdjustTS(int32 delta_timestamp) +{ + for(int i = 0; i < 5; i++) + if(devices[i]) + devices[i]->AdjustTS(delta_timestamp); +} + +static INLINE uint8 RealPortRead(int32 timestamp, int which) +{ + uint8 ret = 0xF; + + //printf("RealInputRead: %d %d\n", which, timestamp); + if(devices[which]) + ret = devices[which]->Read(timestamp); + + return(ret); +} + +static INLINE void RealPortWrite(int32 timestamp, int which, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) +{ + if(devices[which]) + devices[which]->Write(timestamp, old_SEL, new_SEL, old_CLR, new_CLR); +} + +static INLINE uint8 MultiTapRead(int32 timestamp) +{ + uint8 ret = 0xF; + + if(read_index > 4) + ret = 0; + else + ret = RealPortRead(timestamp, read_index); + + return(ret); +} + +static INLINE void MultiTapWrite(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) +{ + for(int i = 0; i < 5; i++) + RealPortWrite(timestamp, i, old_SEL, new_SEL, old_CLR, new_CLR); + + // SEL held high, CLR transitions from 0->1, reset counter. + // Scratch that, only check if SEL is high on the write that changes CLR from 0 to 1, to fix "Strip Fighter". + if(/*old_SEL &&*/ new_SEL && !old_CLR && new_CLR) + { + //puts("Reset read index"); + + read_index = 0; + } + // CLR held low, SEL transitions from 0->1, increment counter. + else if(!old_CLR && !new_CLR && !old_SEL && new_SEL) + { + //puts("Increment read index"); + if(read_index < 255) + read_index++; + } +} + +uint8 INPUT_Read(int32 timestamp, unsigned int A) +{ + uint8 ret; + + //{ + // extern VCE *vce; + // printf("Input Read: %04x, %d\n", A, vce->GetScanlineNo()); + //} + + if(MultiTapEnabled && InputTypes[0] != PCEINPUT_TSUSHINKB) + ret = MultiTapRead(timestamp); + else + ret = RealPortRead(timestamp, 0); + + //printf("Input read: %04x, %02x\n",A,ret); + + if(!PCE_IsCD) + ret |= 0x80; // Set when CDROM is not attached + + //ret |= 0x40; // PC Engine if set, TG16 if clear. Let's leave it clear, PC Engine games don't seem to mind if it's clear, but TG16 games barf if it's set. + + ret |= 0x30; // Always-set? + + return(ret); +} + +void INPUT_Write(int32 timestamp, unsigned int A, uint8 V) +{ + //printf("Input Write: %04x, %02x\n", A, V); + bool new_SEL = V & 0x1; + bool new_CLR = V & 0x2; + + if(MultiTapEnabled) + MultiTapWrite(timestamp, SEL, new_SEL, CLR, new_CLR); + else + RealPortWrite(timestamp, 0, SEL, new_SEL, CLR, new_CLR); + + SEL = new_SEL; + CLR = new_CLR; +} + +void PCEINPUT_Power(int32 timestamp) +{ + read_index = 0; + SEL = 0; + CLR = 0; + + for(int i = 0; i < 5; i++) + if(devices[i]) + devices[i]->Power(timestamp); +} + +int INPUT_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(SEL), + SFVAR(CLR), + SFVAR(read_index), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "JOY"); + + for(int i = 0; i < 5; i++) + { + if(devices[i]) + { + char sn[8]; + trio_snprintf(sn, 8, "INP%d", i); + ret &= devices[i]->StateAction(sm, load, data_only, sn); + } + } + + return(ret); +} + +static const std::vector InputDeviceInfo = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + PCE_GamepadIDII + }, + + // Mouse + { + "mouse", + "Mouse", + NULL, + PCE_MouseIDII + }, +}; + +static const std::vector InputDeviceInfoPort1 = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + PCE_GamepadIDII + }, + + // Mouse + { + "mouse", + "Mouse", + NULL, + PCE_MouseIDII + }, + + // Tsushin Keyboard + { + "tsushinkb", + "Tsushin Keyboard", + NULL, + PCE_TsushinKBIDII + }, +}; + +const std::vector PCEPortInfo = +{ + { "port1", "Port 1", InputDeviceInfoPort1, "gamepad" }, + { "port2", "Port 2", InputDeviceInfo, "gamepad" }, + { "port3", "Port 3", InputDeviceInfo, "gamepad" }, + { "port4", "Port 4", InputDeviceInfo, "gamepad" }, + { "port5", "Port 5", InputDeviceInfo, "gamepad" }, +}; + +static void SyncSettings(void) +{ + MDFNGameInfo->mouse_sensitivity = MDFN_GetSettingF("pce.mouse_sensitivity"); + MultiTapEnabled = MDFN_GetSettingB("pce.input.multitap"); + DisableSR = MDFN_GetSettingB("pce.disable_softreset"); +} + +}; diff --git a/Mednafen/mednafen/pce/input.h b/Mednafen/mednafen/pce/input.h new file mode 100644 index 0000000000..1009a1e2ae --- /dev/null +++ b/Mednafen/mednafen/pce/input.h @@ -0,0 +1,37 @@ +#ifndef __PCE_INPUT_H +#define __PCE_INPUT_H + +namespace MDFN_IEN_PCE +{ + +class PCE_Input_Device +{ + public: +// PCE_Input_Device(int which); // "which" is advisory and only should be used in status messages. + virtual ~PCE_Input_Device(); + virtual void TransformInput(uint8* data, const bool DisableSR); + virtual void AdjustTS(int32 delta); + virtual void Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR); + virtual uint8 Read(int32 timestamp); + virtual void Power(int32 timestamp); + virtual void Update(const void *data); + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name); +}; + +void PCEINPUT_Power(int32 timestamp); +void PCEINPUT_Init(void); +void PCEINPUT_SettingChanged(const char *name); +void PCEINPUT_TransformInput(void); +void PCEINPUT_SetInput(unsigned port, const char *type, uint8 *ptr); +uint8 INPUT_Read(int32 timestamp, unsigned int A); +void INPUT_Write(int32 timestamp, unsigned int A, uint8 V); +void INPUT_Frame(void); +int INPUT_StateAction(StateMem *sm, int load, int data_only); +extern const std::vector PCEPortInfo; +void INPUT_AdjustTS(int32 delta_timestamp); + +uint16 INPUT_HESHack(void); + +}; + +#endif diff --git a/Mednafen/mednafen/pce/input/gamepad.cpp b/Mednafen/mednafen/pce/input/gamepad.cpp new file mode 100644 index 0000000000..26469f1c63 --- /dev/null +++ b/Mednafen/mednafen/pce/input/gamepad.cpp @@ -0,0 +1,153 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../pce.h" +#include "../input.h" +#include "gamepad.h" + +namespace MDFN_IEN_PCE +{ + +class PCE_Input_Gamepad : public PCE_Input_Device +{ + public: + PCE_Input_Gamepad(); + virtual void TransformInput(uint8* data, const bool DisableSR) override; + virtual void Power(int32 timestamp) override; + virtual void Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) override; + virtual uint8 Read(int32 timestamp) override; + virtual void Update(const void *data) override; + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name) override; + + + private: + bool SEL, CLR; + uint16 buttons; + bool AVPad6Which; +}; + + +PCE_Input_Gamepad::PCE_Input_Gamepad() +{ + Power(0); // FIXME? +} + +void PCE_Input_Gamepad::Power(int32 timestamp) +{ + SEL = 0; + CLR = 0; + buttons = 0; + AVPad6Which = 0; +} + +void PCE_Input_Gamepad::TransformInput(uint8* data, const bool DisableSR) +{ + if(DisableSR) + { + uint16 tmp = MDFN_de16lsb(data); + + if((tmp & 0xC) == 0xC) + tmp &= ~0xC; + + MDFN_en16lsb(data, tmp); + } +} + +void PCE_Input_Gamepad::Update(const void *data) +{ + buttons = MDFN_de16lsb((uint8 *)data); +} + +uint8 PCE_Input_Gamepad::Read(int32 timestamp) +{ + uint8 ret = 0xF; + + if(AVPad6Which && (buttons & 0x1000)) + { + if(SEL) + ret ^= 0xF; + else + ret ^= (buttons >> 8) & 0x0F; + } + else + { + if(SEL) + ret ^= (buttons >> 4) & 0x0F; + else + ret ^= buttons & 0x0F; + } + + //if(CLR) + // ret = 0; + + return(ret); +} + +void PCE_Input_Gamepad::Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) +{ + SEL = new_SEL; + CLR = new_CLR; + + //if(old_SEL && new_SEL && old_CLR && !new_CLR) + if(!old_SEL && new_SEL) + AVPad6Which = !AVPad6Which; +} + +int PCE_Input_Gamepad::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(SEL), + SFVAR(CLR), + SFVAR(buttons), + SFVAR(AVPad6Which), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + + return(ret); +} + +static const char* ModeSwitchPositions[] = +{ + gettext_noop("2-button"), + gettext_noop("6-button"), +}; + +const IDIISG PCE_GamepadIDII = +{ + { "i", "I", 12, IDIT_BUTTON_CAN_RAPID, NULL }, + { "ii", "II", 11, IDIT_BUTTON_CAN_RAPID, NULL }, + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "run", "RUN", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "iii", "III", 10, IDIT_BUTTON, NULL }, + { "iv", "IV", 7, IDIT_BUTTON, NULL }, + { "v", "V", 8, IDIT_BUTTON, NULL }, + { "vi", "VI", 9, IDIT_BUTTON, NULL }, + IDIIS_Switch("mode_select", "Mode", 6, ModeSwitchPositions, sizeof(ModeSwitchPositions) / sizeof(ModeSwitchPositions[0])), +}; + +PCE_Input_Device *PCEINPUT_MakeGamepad(void) +{ + return new PCE_Input_Gamepad(); +} + +}; diff --git a/Mednafen/mednafen/pce/input/gamepad.h b/Mednafen/mednafen/pce/input/gamepad.h new file mode 100644 index 0000000000..c7f2cdd0c9 --- /dev/null +++ b/Mednafen/mednafen/pce/input/gamepad.h @@ -0,0 +1,10 @@ +#ifndef __PCE_INPUT_GAMEPAD_H +#define __PCE_INPUT_GAMEPAD_H + +namespace MDFN_IEN_PCE +{ + extern const IDIISG PCE_GamepadIDII; + PCE_Input_Device *PCEINPUT_MakeGamepad(void); +}; + +#endif diff --git a/Mednafen/mednafen/pce/input/mouse.cpp b/Mednafen/mednafen/pce/input/mouse.cpp new file mode 100644 index 0000000000..99451001d7 --- /dev/null +++ b/Mednafen/mednafen/pce/input/mouse.cpp @@ -0,0 +1,171 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../pce.h" +#include "../input.h" +#include "mouse.h" + +namespace MDFN_IEN_PCE +{ + +class PCE_Input_Mouse : public PCE_Input_Device +{ + public: + PCE_Input_Mouse(); + virtual void Power(int32 timestamp); + + virtual void AdjustTS(int32 delta); + virtual void Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR); + virtual uint8 Read(int32 timestamp); + virtual void Update(const void *data); + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name); + + private: + bool SEL, CLR; + int64 mouse_last_meow; + + int32 mouse_x, mouse_y; + uint8 pce_mouse_button; + uint8 mouse_index; + + + uint16 mouse_shifter; +}; + +void PCE_Input_Mouse::Power(int32 timestamp) +{ + SEL = CLR = 0; + mouse_last_meow = 0; + mouse_x = mouse_y = 0; + pce_mouse_button = 0; + mouse_index = 0; + mouse_shifter = 0; +} + +PCE_Input_Mouse::PCE_Input_Mouse() +{ + Power(0); +} + +void PCE_Input_Mouse::Update(const void *data) +{ + //puts("Frame"); + uint8 *data_ptr = (uint8 *)data; + + mouse_x += (int32)MDFN_de32lsb(data_ptr + 0); + mouse_y += (int32)MDFN_de32lsb(data_ptr + 4); + pce_mouse_button = *(uint8 *)(data_ptr + 8); +} + +void PCE_Input_Mouse::AdjustTS(int32 delta) +{ + //printf("Adjust: %d\n", delta); + mouse_last_meow += delta; +} + +void PCE_Input_Mouse::Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) +{ + //printf("Write: %d old_SEL=%d, new_SEL=%d, old_CLR=%d, new_CLR=%d\n", timestamp, old_SEL, new_SEL, old_CLR, new_CLR); + if(!old_CLR && new_CLR) + { + //printf("%lld\n", (int64)timestamp - mouse_last_meow); + if(((int64)timestamp - mouse_last_meow) > 10000 * 3) + { + mouse_last_meow = timestamp; + + int32 rel_x = (int32)((0-mouse_x)); + int32 rel_y = (int32)((0-mouse_y)); + + if(rel_x < -127) rel_x = -127; + if(rel_x > 127) rel_x = 127; + if(rel_y < -127) rel_y = -127; + if(rel_y > 127) rel_y = 127; + + mouse_shifter = ((rel_x & 0xF0) >> 4) | ((rel_x & 0x0F) << 4); + mouse_shifter |= (((rel_y & 0xF0) >> 4) | ((rel_y & 0x0F) << 4)) << 8; + + mouse_x += (int32)(rel_x); + mouse_y += (int32)(rel_y); + + //printf("Latch: %d %d, %04x\n", rel_x, rel_y, mouse_shifter); + } + else + { + //puts("Shift"); + mouse_shifter >>= 4; + } + } + + SEL = new_SEL; + CLR = new_CLR; +} + +uint8 PCE_Input_Mouse::Read(int32 timestamp) +{ + uint8 ret = 0xF; + + //printf("Read: %d\n", timestamp); + + if(SEL) + { + ret = (mouse_shifter & 0xF); + //printf("Read: %02x\n", ret); + } + else + { + ret ^= pce_mouse_button & 0xF; + } + + return(ret); +} + +int PCE_Input_Mouse::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(SEL), + SFVAR(CLR), + SFVAR(mouse_last_meow), + SFVAR(mouse_x), + SFVAR(mouse_y), + SFVAR(pce_mouse_button), + SFVAR(mouse_index), + SFVAR(mouse_shifter), + + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + + return(ret); +} + +const IDIISG PCE_MouseIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS_REL }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL }, + { "right", "Right Button", 3, IDIT_BUTTON, NULL }, + { "left", "Left Button", 2, IDIT_BUTTON, NULL }, + { "select", "SELECT", 0, IDIT_BUTTON, NULL }, + { "run", "RUN", 1, IDIT_BUTTON, NULL }, +}; + +PCE_Input_Device *PCEINPUT_MakeMouse(void) +{ + return(new PCE_Input_Mouse()); +} + +}; diff --git a/Mednafen/mednafen/pce/input/mouse.h b/Mednafen/mednafen/pce/input/mouse.h new file mode 100644 index 0000000000..c758863bf7 --- /dev/null +++ b/Mednafen/mednafen/pce/input/mouse.h @@ -0,0 +1,13 @@ +#ifndef __PCE_INPUT_MOUSE_H +#define __PCE_INPUT_MOUSE_H + +namespace MDFN_IEN_PCE +{ + +extern const IDIISG PCE_MouseIDII; + +PCE_Input_Device *PCEINPUT_MakeMouse(void); + +}; + +#endif diff --git a/Mednafen/mednafen/pce/input/tsushinkb.cpp b/Mednafen/mednafen/pce/input/tsushinkb.cpp new file mode 100644 index 0000000000..581715defa --- /dev/null +++ b/Mednafen/mednafen/pce/input/tsushinkb.cpp @@ -0,0 +1,304 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../pce.h" +#include "../input.h" +#include "tsushinkb.h" + +namespace MDFN_IEN_PCE +{ + +class PCE_Input_TsushinKB : public PCE_Input_Device +{ + public: + + PCE_Input_TsushinKB(); + + virtual void Power(int32 timestamp); + virtual void Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR); + virtual uint8 Read(int32 timestamp); + virtual void Update(const void *data); + virtual int StateAction(StateMem *sm, int load, int data_only, const char *section_name); + + + private: + bool SEL, CLR; + uint8 TsuKBState[16]; + uint8 TsuKBLatch[16 + 2 + 1]; + uint32 TsuKBIndex; + bool last_capslock; +}; + +void PCE_Input_TsushinKB::Power(int32 timestamp) +{ + SEL = CLR = 0; + memset(TsuKBState, 0, sizeof(TsuKBState)); + memset(TsuKBLatch, 0, sizeof(TsuKBLatch)); + TsuKBIndex = 0; + last_capslock = 0; +} + +PCE_Input_TsushinKB::PCE_Input_TsushinKB() +{ + Power(0); +} + +void PCE_Input_TsushinKB::Update(const void *data) +{ + uint8 *data_ptr = (uint8 *)data; + bool capslock = TsuKBState[0xE] & 0x10; + bool new_capslock = data_ptr[0xE] & 0x10; + + if(!last_capslock && new_capslock) + capslock ^= 1; + + for(int i = 0; i < 16; i++) + { + TsuKBState[i] = data_ptr[i]; + } + + TsuKBState[0xE] = (TsuKBState[0xE] & ~0x10) | (capslock ? 0x10 : 0x00); + + last_capslock = new_capslock; +} + +uint8 PCE_Input_TsushinKB::Read(int32 timestamp) +{ + uint8 ret; + + ret = ((TsuKBLatch[TsuKBIndex] >> (SEL * 4)) & 0xF); + + return(ret); +} + +void PCE_Input_TsushinKB::Write(int32 timestamp, bool old_SEL, bool new_SEL, bool old_CLR, bool new_CLR) +{ + SEL = new_SEL; + CLR = new_CLR; + + //printf("Write: %d %d %d %d\n", old_SEL, new_SEL, old_CLR, new_CLR); + + if(!old_CLR && new_CLR) + { + TsuKBLatch[0] = 0x02; + + for(int i = 0; i < 16; i++) + TsuKBLatch[i + 1] = TsuKBState[i] ^ 0xFF; + + TsuKBLatch[17] = 0x02; + TsuKBIndex = 0; + //puts("Latched"); + } + else if(!old_SEL && new_SEL) + { + TsuKBIndex = (TsuKBIndex + 1) % 18; + if(!TsuKBIndex) + { + for(int i = 0; i < 16; i++) + TsuKBLatch[i + 1] = TsuKBState[i] ^ 0xFF; + } + } +} + +int PCE_Input_TsushinKB::StateAction(StateMem *sm, int load, int data_only, const char *section_name) +{ + SFORMAT StateRegs[] = + { + SFVAR(SEL), + SFVAR(CLR), + SFARRAY(TsuKBState, sizeof(TsuKBState)), + SFARRAY(TsuKBLatch, sizeof(TsuKBLatch)), + SFVAR(TsuKBIndex), + SFVAR(last_capslock), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name); + + return(ret); +} + +const IDIISG PCE_TsushinKBIDII = +{ + // 0 - DONE! + { "kp_0", "Keypad 0", 0, IDIT_BUTTON }, + { "kp_1", "Keypad 1", 0, IDIT_BUTTON }, + { "kp_2", "Keypad 2", 0, IDIT_BUTTON }, + { "kp_3", "Keypad 3", 0, IDIT_BUTTON }, + { "kp_4", "Keypad 4", 0, IDIT_BUTTON }, + { "kp_5", "Keypad 5", 0, IDIT_BUTTON }, + { "kp_6", "Keypad 6", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 1 - DONE! + { "kp_8", "Keypad 8", 0, IDIT_BUTTON }, + { "kp_9", "Keypad 9", 0, IDIT_BUTTON }, + { "kp_multiply", "Keypad *", 0, IDIT_BUTTON }, + { "kp_plus", "Keypad +", 0, IDIT_BUTTON }, + { "kp_equals", "Keypad =", 0, IDIT_BUTTON }, + { "kp_comma", "Keypad ,", 0, IDIT_BUTTON }, + { "kp_period", "Keypad .", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 2 - DONE! + { "at", "@", 0, IDIT_BUTTON }, + { "a", "a", 0, IDIT_BUTTON }, + { "b", "b", 0, IDIT_BUTTON }, + { "c", "c", 0, IDIT_BUTTON }, + { "d", "d", 0, IDIT_BUTTON }, + { "e", "e", 0, IDIT_BUTTON }, + { "f", "f", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 3 - DONE! + { "h", "h", 0, IDIT_BUTTON }, + { "i", "i", 0, IDIT_BUTTON }, + { "j", "j", 0, IDIT_BUTTON }, + { "k", "k", 0, IDIT_BUTTON }, + { "l", "l", 0, IDIT_BUTTON }, + { "m", "m", 0, IDIT_BUTTON }, + { "n", "n", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 4 - DONE! + { "p", "p", 0, IDIT_BUTTON }, + { "q", "q", 0, IDIT_BUTTON }, + { "r", "r", 0, IDIT_BUTTON }, + { "s", "s", 0, IDIT_BUTTON }, + { "t", "t", 0, IDIT_BUTTON }, + { "u", "u", 0, IDIT_BUTTON }, + { "v", "v", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 5 - DONE! + { "x", "x", 0, IDIT_BUTTON }, + { "y", "y", 0, IDIT_BUTTON }, + { "z", "z", 0, IDIT_BUTTON }, + { "left_bracket", "[", 0, IDIT_BUTTON }, + { "yen", "Yen", 0, IDIT_BUTTON }, + { "right_bracket", "]", 0, IDIT_BUTTON }, + { "caret", "^", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 6 - DONE! + { "0", "0", 0, IDIT_BUTTON }, + { "1", "1", 0, IDIT_BUTTON }, + { "2", "2", 0, IDIT_BUTTON }, + { "3", "3", 0, IDIT_BUTTON }, + { "4", "4", 0, IDIT_BUTTON }, + { "5", "5", 0, IDIT_BUTTON }, + { "6", "6", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 7 - DONE! + { "8", "8", 0, IDIT_BUTTON }, + { "9", "9", 0, IDIT_BUTTON }, + { "colon", ":", 0, IDIT_BUTTON }, + { "semicolon", ";", 0, IDIT_BUTTON }, + { "comma", ",", 0, IDIT_BUTTON }, + { "period", ".", 0, IDIT_BUTTON }, + { "slash", "/", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 8 - DONE enough + { "clear", "clear", 0, IDIT_BUTTON }, + { "up", "up", 0, IDIT_BUTTON }, + { "right", "right", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // Alternate backspace key on PC-88 keyboard??? { "unk80", "unknown", 0, IDIT_BUTTON }, + { "grph", "GRPH", 0, IDIT_BUTTON }, + { "kana", "カナ", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // Alternate shift key on PC-88 keyboard??? { "unk83", "unknown", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// 9 - DONE! + { "stop", "STOP", 0, IDIT_BUTTON }, // Break / STOP + { "f1", "F1", 0, IDIT_BUTTON }, + { "f2", "F2", 0, IDIT_BUTTON }, + { "f3", "F3", 0, IDIT_BUTTON }, + { "f4", "F4", 0, IDIT_BUTTON }, + { "f5", "F5", 0, IDIT_BUTTON }, + { "space", "space", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// A - DONE! + { "tab", "Tab", 0, IDIT_BUTTON }, // Tab + { "down", "down", 0, IDIT_BUTTON }, + { "left", "left", 0, IDIT_BUTTON }, + { "help", "Help", 0, IDIT_BUTTON }, // -624 + { "copy", "Copy", 0, IDIT_BUTTON }, // -623 + { "kp_minus", "Keypad Minus", 0, IDIT_BUTTON }, + { "kp_divide", "Keypad Divide", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + + // B - DONE(most likely) + { "roll_down", "ROLL DOWN", 0, IDIT_BUTTON }, + { "roll_up", "ROLL UP", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownB2", "unknown", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownB3", "unknown", 0, IDIT_BUTTON }, + { "o", "o", 0, IDIT_BUTTON }, + { "underscore", "Underscore", 0, IDIT_BUTTON }, + { "g", "g", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// C - DONE! + { "f6", "f6", 0, IDIT_BUTTON }, + { "f7", "f7", 0, IDIT_BUTTON }, + { "f8", "f8", 0, IDIT_BUTTON }, + { "f9", "f9", 0, IDIT_BUTTON }, + { "f10", "F10", 0, IDIT_BUTTON }, + { "backspace", "backspace", 0, IDIT_BUTTON }, + { "insert", "insert", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// D - DONE! + { "convert", "変換", 0, IDIT_BUTTON }, // (-620) Begin marking entered text, and disable marking after pressing the + // end-of-block key. + { "nonconvert", "決定", 0, IDIT_BUTTON }, // (-619) End text marking block + { "pc", "PC", 0, IDIT_BUTTON }, // (-617) Selects between Rgana and Rkana. SHIFT+this key switches between + // latin and kana/gana mode? + { "width", "変換", 0, IDIT_BUTTON }, // (-618) Chooses font width? + { "ctrl", "CTRL/Control", 0, IDIT_BUTTON }, // CTRL + { "kp_7", "Keypad 7", 0, IDIT_BUTTON }, + { "w", "w", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// E - DONE! + { "return", "return", 0, IDIT_BUTTON }, // enter + { "kp_enter", "Keypad Enter", 0, IDIT_BUTTON }, // enter + { "left_shift", "Left Shift", 0, IDIT_BUTTON }, // Left Shift + { "right_shift", "Right Shift", 0, IDIT_BUTTON }, // Right Shift + { "caps_lock", "Caps Lock", 0, IDIT_BUTTON }, // Caps Lock(mechanically-locking...) + { "delete", "Delete", 0, IDIT_BUTTON }, + { "escape", "Escape", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + +// F - DONE(most likely) + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownF0", "unknown", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownF1", "unknown", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownF2", "unknown", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownF3", "unknown", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, // { "unknownF4", "unknown", 0, IDIT_BUTTON }, + { "minus", "Minus", 0, IDIT_BUTTON }, + { "7", "7", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, +}; + +PCE_Input_Device *PCEINPUT_MakeTsushinKB(void) +{ + return(new PCE_Input_TsushinKB()); +} + +}; diff --git a/Mednafen/mednafen/pce/input/tsushinkb.h b/Mednafen/mednafen/pce/input/tsushinkb.h new file mode 100644 index 0000000000..7f33cb4d14 --- /dev/null +++ b/Mednafen/mednafen/pce/input/tsushinkb.h @@ -0,0 +1,13 @@ +#ifndef __PCE_INPUT_TSUSHINKB_H +#define __PCE_INPUT_TSUSHINKB_H + +namespace MDFN_IEN_PCE +{ + +extern const IDIISG PCE_TsushinKBIDII; + +PCE_Input_Device *PCEINPUT_MakeTsushinKB(void); + +}; + +#endif diff --git a/Mednafen/mednafen/pce/mcgenjin.cpp b/Mednafen/mednafen/pce/mcgenjin.cpp new file mode 100644 index 0000000000..b23cb39c49 --- /dev/null +++ b/Mednafen/mednafen/pce/mcgenjin.cpp @@ -0,0 +1,279 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "mcgenjin.h" + +using namespace MDFN_IEN_PCE; + +MCGenjin_CS_Device::MCGenjin_CS_Device() +{ + +} + +MCGenjin_CS_Device::~MCGenjin_CS_Device() +{ + +} + +void MCGenjin_CS_Device::Power(void) +{ + +} + +void MCGenjin_CS_Device::Update(int32 timestamp) +{ + +} + +void MCGenjin_CS_Device::ResetTS(int32 ts_base) +{ + +} + +int MCGenjin_CS_Device::StateAction(StateMem *sm, int load, int data_only, const char *sname) +{ + return 1; +} + + +uint8 MCGenjin_CS_Device::Read(int32 timestamp, uint32 A) +{ + return 0xFF; +} + +void MCGenjin_CS_Device::Write(int32 timestamp, uint32 A, uint8 V) +{ + +} + +uint32 MCGenjin_CS_Device::GetNVSize(void) const +{ + return 0; +} + +const uint8* MCGenjin_CS_Device::ReadNV(void) const +{ + return NULL; +} + +void MCGenjin_CS_Device::WriteNV(const uint8 *buffer, uint32 offset, uint32 count) +{ + +} + +class MCGenjin_CS_Device_RAM : public MCGenjin_CS_Device +{ + public: + + MCGenjin_CS_Device_RAM(uint32 size, bool nv) + { + assert(round_up_pow2(size) == size); + + ram.resize(size); + nonvolatile = nv; + } + + virtual ~MCGenjin_CS_Device_RAM() override + { + + } + + virtual void Power(void) override + { + if(!nonvolatile) + ram.assign(ram.size(), 0xFF); + + bank_select = 0; + } + + virtual int StateAction(StateMem *sm, int load, int data_only, const char *sname) override + { + SFORMAT StateRegs[] = + { + SFARRAY(&ram[0], ram.size()), + SFVAR(bank_select), + SFEND + }; + int ret = 1; + + ret &= MDFNSS_StateAction(sm, load, data_only, StateRegs, sname); + + return ret; + } + + + virtual uint8 Read(int32 timestamp, uint32 A) override + { + return ram[(A | (bank_select << 18)) & (ram.size() - 1)]; + } + + virtual void Write(int32 timestamp, uint32 A, uint8 V) override + { + if(!A) + bank_select = V; + + ram[(A | (bank_select << 18)) & (ram.size() - 1)] = V; + } + + virtual uint32 GetNVSize(void) const override + { + return nonvolatile ? ram.size() : 0; + } + + virtual const uint8* ReadNV(void) const override + { + return &ram[0]; + } + + virtual void WriteNV(const uint8 *buffer, uint32 offset, uint32 count) override + { + while(count) + { + ram[offset % ram.size()] = *buffer; + buffer++; + offset++; + count--; + } + } + + private: + std::vector ram; + bool nonvolatile; + uint8 bank_select; +}; + +void MCGenjin::Power(void) +{ + bank_select = 0; + dlr = 0; + + stmode_control = 0x00; + + for(unsigned i = 0; i < 2; i++) + cs[i]->Power(); +} + +void MCGenjin::Update(int32 timestamp) +{ + for(unsigned i = 0; i < 2; i++) + cs[i]->Update(timestamp); +} + +void MCGenjin::ResetTS(int32 ts_base) +{ + for(unsigned i = 0; i < 2; i++) + cs[i]->ResetTS(ts_base); +} + +uint32 MCGenjin::GetNVSize(const unsigned di) const +{ + return cs[di]->GetNVSize(); +} + +const uint8* MCGenjin::ReadNV(const unsigned di) const +{ + return cs[di]->ReadNV(); +} + +void MCGenjin::WriteNV(const unsigned di, const uint8 *buffer, uint32 offset, uint32 count) +{ + cs[di]->WriteNV(buffer, offset, count); +} + +MCGenjin::MCGenjin(MDFNFILE* fp) +{ + const uint64 rr_size = fp->size(); + uint8 revision, num256_pages, region, cs_di[2]; + + if(rr_size > 1024 * 1024 * 128) + throw MDFN_Error(0, _("MCGenjin ROM size is too large!")); + + if(rr_size < 8192) + throw MDFN_Error(0, _("MCGenjin ROM size is too small!")); + + rom.resize(round_up_pow2(rr_size)); + fp->read(&rom[0], rr_size); + + if(memcmp(&rom[0x1FD0], "MCGENJIN", 8)) + throw MDFN_Error(0, _("MC Genjin header magic missing!")); + + revision = rom[0x1FD8]; + num256_pages = rom[0x1FD9]; + region = rom[0x1FDA]; + cs_di[0] = rom[0x1FDB]; + cs_di[1] = rom[0x1FDC]; + + MDFN_printf(_("MCGenjin Header:\n")); + MDFN_indent(1); + MDFN_printf(_("Revision: 0x%02x\n"), revision); + MDFN_printf(_("ROM Size: %u\n"), num256_pages * 262144); + MDFN_printf(_("Region: 0x%02x\n"), region); + MDFN_printf(_("CS0 Type: 0x%02x\n"), cs_di[0]); + MDFN_printf(_("CS1 Type: 0x%02x\n"), cs_di[1]); + MDFN_indent(-1); + + // Don't set addr_write_mask to larger than 0xF unless code in mcgenjin.h is adjusted as well. + if(revision >= 0x80) + addr_write_mask = 0xF; + else + addr_write_mask = 0x3; + + for(unsigned i = 0; i < 2; i++) + { + if((cs_di[i] >= 0x10 && cs_di[i] <= 0x18) || (cs_di[i] >= 0x20 && cs_di[i] <= 0x28)) + { + MDFN_printf(_("CS%d: %uKiB %sRAM\n"), i, 8 << (cs_di[i] & 0xF), (cs_di[i] & 0x20) ? "Nonvolatile " : ""); + cs[i].reset(new MCGenjin_CS_Device_RAM(8192 << (cs_di[i] & 0xF), (bool)(cs_di[i] & 0x20))); + } + else switch(cs_di[i]) + { + default: + throw MDFN_Error(0, _("Unsupported MCGENJIN device on CS%d: 0x%02x"), i, cs_di[i]); + break; + + case 0x00: + MDFN_printf(_("CS%d: Unused\n"), i); + cs[i].reset(new MCGenjin_CS_Device()); + break; + } + } +} + +MCGenjin::~MCGenjin() +{ + +} + +int MCGenjin::StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(bank_select), + SFVAR(dlr), + SFEND + }; + int ret = 1; + + ret &= MDFNSS_StateAction(sm, load, data_only, StateRegs, "MCGENJIN"); + + for(unsigned i = 0; i < 2; i++) + ret &= MDFNSS_StateAction(sm, load, data_only, StateRegs, i ? "MCGENJIN_CS1" : "MCGENJIN_CS0"); + + return ret; +} + diff --git a/Mednafen/mednafen/pce/mcgenjin.h b/Mednafen/mednafen/pce/mcgenjin.h new file mode 100644 index 0000000000..36f866a0e8 --- /dev/null +++ b/Mednafen/mednafen/pce/mcgenjin.h @@ -0,0 +1,199 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_PCE_MCGENJIN_H +#define __MDFN_PCE_MCGENJIN_H + +#include +#include + +class MCGenjin_CS_Device +{ + public: + + MCGenjin_CS_Device(); + virtual ~MCGenjin_CS_Device(); + + virtual void Power(void); + virtual void Update(int32 timestamp); + virtual void ResetTS(int32 ts_base); + + virtual int StateAction(StateMem *sm, int load, int data_only, const char *sname); + + virtual uint8 Read(int32 timestamp, uint32 A); + virtual void Write(int32 timestamp, uint32 A, uint8 V) ; + + virtual uint32 GetNVSize(void) const; + virtual const uint8* ReadNV(void) const; + virtual void WriteNV(const uint8 *buffer, uint32 offset, uint32 count); +}; + +class MCGenjin +{ + public: + + MCGenjin(MDFNFILE* fp); + ~MCGenjin(); + + void Power(void); + void Update(int32 timestamp); + void ResetTS(int32 ts_base); + int StateAction(StateMem *sm, int load, int data_only); + + INLINE unsigned GetNVPDC(void) { return 2; } + uint32 GetNVSize(const unsigned di) const; + const uint8* ReadNV(const unsigned di) const; + void WriteNV(const unsigned di, const uint8 *buffer, uint32 offset, uint32 count); + + INLINE uint8 combobble(uint8 v) + { + if(dlr) + return ((((v * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL) >> 32); + else + return v; + } + + template + INLINE uint8 ReadTP(int32 timestamp, uint32 A) + { + uint8 ret = 0xFF; + + switch(ar) + { + case 0: ret = combobble(rom[A & 0x3FFFF & (rom.size() - 1)]); + break; + + case 1: { + const uint32 rom_addr_or = bank_select << 18; + const uint32 rom_addr_xor = ((stmode_control & 0x7E) << 6) | (stmode_control & STMODEC_MASK_ENABLE); + uint32 rom_addr_and = (rom.size() - 1); + + if((stmode_control & 0x80) && !(A & 0x1)) + rom_addr_and &= ~0x1FFC; + + ret = combobble(rom[(((A & 0x3FFFF) | rom_addr_or) ^ rom_addr_xor) & rom_addr_and]); + } + break; + + case 2: ret = cs[0]->Read(timestamp, A & 0x3FFFF); break; + case 3: ret = cs[1]->Read(timestamp, A & 0x3FFFF); break; + } + + return ret; + } + + template + INLINE void WriteTP(int32 timestamp, uint32 A, uint8 V) + { + switch(ar) + { + case 0: + case 1: + switch((A & addr_write_mask) | (~addr_write_mask & 0xF)) + { + case 0x0: avl_mask[0] = V; break; + case 0x1: avl_mask[1] = V; break; + case 0x2: avl_mask[2] = V; break; + case 0x3: avl_mask[3] = V; break; + + case 0x4: avl[0] &= 0xFF00; avl[0] |= V; break; + case 0x5: avl[1] &= 0xFF00; avl[1] |= V; break; + case 0x6: avl[2] &= 0xFF00; avl[2] |= V; break; + case 0x7: avl[3] &= 0xFF00; avl[3] |= V; break; + + case 0x8: avl[0] &= 0x00FF; avl[0] |= V << 8; break; + case 0x9: avl[1] &= 0x00FF; avl[1] |= V << 8; break; + case 0xA: avl[2] &= 0x00FF; avl[2] |= V << 8; break; + case 0xB: avl[3] &= 0x00FF; avl[3] |= V << 8; break; + + case 0xC: + for(unsigned i = 0; i < 4; i++) + { + if(V & (1U << i)) + shadow_avl[i] += avl[i]; + else + shadow_avl[i] = avl[i]; + } + break; + + case 0xD: + stmode_control = V; + break; + + case 0xE: + dlr = V & 0x1; + break; + + case 0xF: + bank_select = V; + break; + } + break; + + case 2: return cs[0]->Write(timestamp, A & 0x3FFFF, V); + case 3: return cs[1]->Write(timestamp, A & 0x3FFFF, V); + } + } + + + INLINE uint8 Read(int32 timestamp, uint32 A) + { + switch((A >> 18) & 0x3) + { + default: return 0xFF; + case 0: return ReadTP<0>(timestamp, A); + case 1: return ReadTP<1>(timestamp, A); + case 2: return ReadTP<2>(timestamp, A); + case 3: return ReadTP<3>(timestamp, A); + } + } + + INLINE void Write(int32 timestamp, uint32 A, uint8 V) + { + switch((A >> 18) & 0x3) + { + case 0: WriteTP<0>(timestamp, A, V); + case 1: WriteTP<1>(timestamp, A, V); + case 2: WriteTP<2>(timestamp, A, V); + case 3: WriteTP<3>(timestamp, A, V); + } + } + + private: + + std::vector rom; + + std::unique_ptr cs[2]; + + uint8 bank_select; + uint8 dlr; + + enum { STMODEC_MASK_ENABLE = 0x80 }; + + // + // + // + uint8 addr_write_mask; + + uint8 stmode_control; + + uint16 avl[4]; + uint8 avl_mask[4]; + uint16 shadow_avl[4]; +}; + +#endif diff --git a/Mednafen/mednafen/pce/notes/EVENT_SYSTEM_NOTES b/Mednafen/mednafen/pce/notes/EVENT_SYSTEM_NOTES new file mode 100644 index 0000000000..dac991a902 --- /dev/null +++ b/Mednafen/mednafen/pce/notes/EVENT_SYSTEM_NOTES @@ -0,0 +1,7 @@ +On virtual power/reset, don't reset event system(timestamps such as lastts and such; but recalculating events based on new emulated register settings caused by the + power/reset is good). + +All Reset()/Power() functions should be passed a timestamp(of the reset/power event). + +All users of the event system should initialize internal timestamp(lastts) to 0 on initialization, and only reset to 0 when its EndFrame() or ResetTS() or similar +function is called. diff --git a/Mednafen/mednafen/pce/notes/GAME_NOTES b/Mednafen/mednafen/pce/notes/GAME_NOTES new file mode 100644 index 0000000000..6bb96ce128 --- /dev/null +++ b/Mednafen/mednafen/pce/notes/GAME_NOTES @@ -0,0 +1,208 @@ +--------------------------------- +Mid-frame dot/pixel clock change: +--------------------------------- + +Asuka 120% + +Order of the Griffon + +Ryuuko no Ken + + + +---------------------------------- +Rely on edge-case timer behaviour: +---------------------------------- + +Battle Royale + + + +---------------------------------------------------------------------------------- +Rely on edge-case VDC vblank flag/IRQ behaviour(maybe, need to investigate again): +---------------------------------------------------------------------------------- + +Battle Lode Runner + +Ryukyu + + + +--------------------------------------------- +Rely on sprite overflow to mask/hide sprites: +--------------------------------------------- + +Bloody Wolf + During first boss(submarine) battle, at least. + +Ninja Ryukenden + During cutscene(s). + + +------------------------------ +Write to VRAM during VRAM DMA: +------------------------------ + +Bari Bari Densetsu + +Riot Zone + + + +----------------------- +Uses 2-bit sprite mode: +----------------------- + +Fighting Run + + + +-------------------------------------------------------------- +Requires input state that can change more than once per frame: +-------------------------------------------------------------- + +Takeda Shingen + Appears to work properly at first, but you can't break locked swords with only 1 update per frame. + + + +------------------------------------------------------------ +Requires VDC to wait-state the CPU under certain conditions: +------------------------------------------------------------ + +Popful Mail + During cutscenes, else there will be major graphics glitches and lockups in cutscenes. + +Star Breaker + When going to world map. (For quick testing, add temporary RAM replace cheat for address $1F0E17, value $38, to bypass castle guards, but remember + to remove it afterwards!). + +Wonder Momo + (Hypothetically) + +--------------------------------------------------------------------------------------------- +Use horizontal timing registers to intentionally position active display far off from center: +--------------------------------------------------------------------------------------------- + +Final Blaster + In the intro sequence after pressing "Run" at the title screen. + + + +------------- +Use VRAM DMA: +------------- + +Bari Bari Densetsu + +Cosmic Fantasy IV + Timing sensitive. + +Crest of Wolf / Riot Zone + Timing sensitive. + +Fushigi no Yume no Alice + +Langrisser + Timing sensitive(status bar will glitch during map scrolling if not emulated correctly). + +Legendary Axe II / Ankoku Densetsu + Timing sensitive. Stage 5 particularly is a timing nightmare(stage select code at title + screen is "I, II, I, II, II, I, II, I, I, I"; for full testing, also go to level 5 by + playing through the end of level 4) + +Magical Chase + +Ninja Ryukenden + +Ruin + +Takeda Shingen + Timing sensitive(maybe). + + + +--------------------------------- +Use streaming audio and/or video: +--------------------------------- + +Akumajou Dracula X + Cutscene(s) + +Beyond Shadowgate + +Dragon Slayer + +Dragonball Z + +Galaxy Fraulein Yuna HuVideo + Video + +It Came from the Desert + Video + +John Madden Duo Football + Video + +Kuusou Kagaku Sekai Gulliver Boy + Video + +Last Armageddon + Cutscene(s) + +Sherlock Holmes 1 and 2 + Video + +The Addams Family + +Travelers + + + +----------------- +Use sound LFO FM: +----------------- + +Flash Hiders + +Forgotten Worlds + +Hanii in the Sky + +Juuoki + + + +----------------------------------------------------------------------------------------- +Rely on sound channel volume update specifics(period, order, and update start condition): +----------------------------------------------------------------------------------------- + +Hanii in the Sky + Failing to emulate volume update semantics at least somewhat correctly will cause crackles and + pops while the game is paused. + + + +------------- +K$Q#(nH^(U$^( +------------- + +Download + Requires the data-buffer latching effect of $0800-$17ff to be emulated, or it won't run. + To be specific, it reads from $1403, and expects bit 5(mask = 0x20) to be set. + +Youkai Douchuuki + JSRs to a routine to set the MPRs before the MPR corresponding to the stack page is set, and then RTSs. KABOOM. + + + +-------------------- +Other Especially VDC Timing Sensitive(listed here so we remember to test after making any significant changes) +-------------------- + +Camp California (raster effects) +Shapeshifter (raster effects) +Shin Megami Tensei (raster effects) +Seiya Monogatari (raster effects) +Street Fighter II (vblank irq versus rcr irq? timing, massively glitchy frames if off, need to run tests) +World Court Tennis (vibrascreen!) diff --git a/Mednafen/mednafen/pce/notes/PATENTS b/Mednafen/mednafen/pce/notes/PATENTS new file mode 100644 index 0000000000..2ed81f06df --- /dev/null +++ b/Mednafen/mednafen/pce/notes/PATENTS @@ -0,0 +1,8 @@ +5,319,786 - Apparatus for controlling a scanning type video display to be divided into plural display regions +5,226,140 - Apparatus for controlling the transfer of data +5,059,955 - Apparatus for producing video signals +5,034,886 - Computer system for reducing number of dedicated registers using memory stock and sharing of address and general purpose registers +5,030,946 - Apparatus for the control of an access to a video memory +4,970,642 - An apparatus for accessing a memory +4,951,038 - Apparatus for displaying a sprite on a screen +4,924,744 - Apparatus for generating sound through low frequency and noise modulation diff --git a/Mednafen/mednafen/pce/pce.cpp b/Mednafen/mednafen/pce/pce.cpp new file mode 100644 index 0000000000..6d46fbd4e6 --- /dev/null +++ b/Mednafen/mednafen/pce/pce.cpp @@ -0,0 +1,1235 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "vce.h" +#include +#include "input.h" +#include "huc.h" +#include "pcecd.h" +#include +#include "hes.h" +#include "debug.h" +#include "tsushin.h" +#include +#include +#include +#include +#include +#include +#include + +#include + +#define PCE_DEBUG(x, ...) { /* printf(x, ## __VA_ARGS__); */ } + +extern MDFNGI EmulatedPCE; + +namespace MDFN_IEN_PCE +{ + +static const MDFNSetting_EnumList PSGRevisionList[] = +{ + { "huc6280", PCE_PSG::REVISION_HUC6280, "HuC6280", gettext_noop("HuC6280 as found in the original PC Engine.") }, + { "huc6280a", PCE_PSG::REVISION_HUC6280A, "HuC6280A", gettext_noop("HuC6280A as found in the SuperGrafx and CoreGrafx I. Provides proper channel amplitude centering, but may cause clicking in a few games designed with the original HuC6280's sound characteristics in mind.") }, + { "match", PCE_PSG::_REVISION_COUNT, gettext_noop("Match emulation mode."), gettext_noop("Selects \"huc6280\" for non-SuperGrafx mode, and \"huc6280a\" for SuperGrafx(full) mode.") }, + { NULL, 0 }, +}; + +static std::vector *cdifs = NULL; + +HuC6280 *HuCPU; + +VCE *vce = NULL; + +static PCE_PSG *psg = NULL; + +extern ArcadeCard *arcade_card; // Bah, lousy globals. + +static OwlBuffer* HRBufs[2] = { NULL, NULL }; +static RavenBuffer* ADPCMBuf = NULL; +static RavenBuffer* CDDABufs[2] = { NULL, NULL }; +static OwlResampler* HRRes = NULL; + +static bool SetSoundRate(double rate); + +static void Cleanup(void); + +bool PCE_ACEnabled; +uint32 PCE_InDebug = 0; +uint64 PCE_TimestampBase; // Only used with the debugger for the time being. + +static bool IsSGX; +static bool IsHES; + +// Accessed in debug.cpp +static uint8 BaseRAM[32768]; // 8KB for PCE, 32KB for Super Grafx +uint8 PCE_PeekMainRAM(uint32 A) +{ + return BaseRAM[A & ((IsSGX ? 32768 : 8192) - 1)]; +} + +void PCE_PokeMainRAM(uint32 A, uint8 V) +{ + BaseRAM[A & ((IsSGX ? 32768 : 8192) - 1)] = V; +} + + + +HuC6280::readfunc NonCheatPCERead[0x100]; + +static DECLFR(PCEBusRead) +{ + if(!PCE_InDebug) + { + PCE_DEBUG("Unmapped Read: %02x %04x\n", A >> 13, A); + } + return(0xFF); +} + +static DECLFW(PCENullWrite) +{ + if(!PCE_InDebug) + { + PCE_DEBUG("Unmapped Write: %02x, %08x %02x\n", A >> 13, A, V); + } +} + +static DECLFR(BaseRAMReadSGX) +{ + return(BaseRAM[A & 0x7FFF]); +} + +static DECLFW(BaseRAMWriteSGX) +{ + BaseRAM[A & 0x7FFF] = V; +} + +static DECLFR(BaseRAMRead) +{ + return(BaseRAM[A & 0x1FFF]); +} + +static DECLFW(BaseRAMWrite) +{ + BaseRAM[A & 0x1FFF] = V; +} + +static DECLFR(IORead) +{ + A &= 0x1FFF; + + switch(A & 0x1c00) + { + case 0x0000: if(!PCE_InDebug) + HuCPU->StealCycle(); + return(vce->ReadVDC(A)); + + case 0x0400: if(!PCE_InDebug) + HuCPU->StealCycle(); + return(vce->Read(A)); + + case 0x0800: if(HuCPU->InBlockMove()) + return(0); + return(HuCPU->GetIODataBuffer()); + + case 0x0c00: if(HuCPU->InBlockMove()) + return(0); + { + uint8 ret = HuCPU->TimerRead(A, PCE_InDebug); + if(!PCE_InDebug) + HuCPU->SetIODataBuffer(ret); + return(ret); + } + + case 0x1000: if(HuCPU->InBlockMove()) + return(0); + { + uint8 ret = INPUT_Read(HuCPU->Timestamp(), A); + if(!PCE_InDebug) + HuCPU->SetIODataBuffer(ret); + return(ret); + } + + case 0x1400: if(HuCPU->InBlockMove()) + return(0); + { + uint8 ret = HuCPU->IRQStatusRead(A, PCE_InDebug); + if(!PCE_InDebug) + HuCPU->SetIODataBuffer(ret); + return(ret); + } + + case 0x1800: if(IsTsushin) + return(PCE_TsushinRead(A)); + + if(!PCE_IsCD) + break; + if((A & 0x1E00) == 0x1A00) + { + if(arcade_card) + return(arcade_card->Read(A, PCE_InDebug)); + else + return(0); + } + else + { + int32 next_cd_event; + uint8 ret; + + ret = PCECD_Read(HuCPU->Timestamp(), A, next_cd_event, PCE_InDebug); + + vce->SetCDEvent(next_cd_event); + + return(ret); + } + + case 0x1C00: if(IsHES) + return(ReadIBP(A)); + + break; // Expansion + } + + if(!PCE_InDebug) + { + PCE_DEBUG("I/O Unmapped Read: %04x\n", A); + } + + return(0xFF); +} + +static DECLFW(IOWrite) +{ + switch(A & 0x1c00) + { + case 0x0000: HuCPU->StealCycle(); + vce->WriteVDC(A & 0x80001FFF, V); + break; + + case 0x0400: HuCPU->StealCycle(); + vce->Write(A & 0x1FFF, V); + break; + + case 0x0800: HuCPU->SetIODataBuffer(V); + psg->Write(HuCPU->Timestamp() / 3, A & 0x1FFF, V); + break; + + case 0x0c00: HuCPU->SetIODataBuffer(V); + HuCPU->TimerWrite(A & 0x1FFF, V); + break; + + case 0x1000: HuCPU->SetIODataBuffer(V); + INPUT_Write(HuCPU->Timestamp(), A & 0x1FFF, V); + break; + + case 0x1400: HuCPU->SetIODataBuffer(V); + HuCPU->IRQStatusWrite(A & 0x1FFF, V); + break; + + case 0x1800: if(IsTsushin) + PCE_TsushinWrite(A & 0x1FFF, V); + + if(!PCE_IsCD) + { + if(!PCE_InDebug) + { + PCE_DEBUG("I/O Unmapped Write: %04x %02x\n", A, V); + } + break; + } + + if((A & 0x1E00) == 0x1A00) + { + if(arcade_card) + arcade_card->Write(A& 0x1FFF, V); + } + else + { + int32 next_cd_event = PCECD_Write(HuCPU->Timestamp(), A & 0x1FFF, V); + + vce->SetCDEvent(next_cd_event); + } + + break; + + case 0x1C00: //if(!PCE_InDebug) + //{ + // PCE_DEBUG("I/O Unmapped Write: %04x %02x\n", A, V); + //} + break; + } +} + +static void PCECDIRQCB(bool asserted) +{ + if(asserted) + HuCPU->IRQBegin(HuC6280::IQIRQ2); + else + HuCPU->IRQEnd(HuC6280::IQIRQ2); +} + +static int LoadCommon(void); +static void LoadCommonPre(void); + +static bool TestMagic(MDFNFILE *fp) +{ + if(strcasecmp(fp->ext, "hes") && strcasecmp(fp->ext, "pce") && strcasecmp(fp->ext, "sgx")) + return(false); + + return(true); +} + +static void SetCDSettings(bool silent_status = false) +{ + double cdpsgvolume; + PCECD_Settings cd_settings; + memset(&cd_settings, 0, sizeof(PCECD_Settings)); + + cdpsgvolume = (double)MDFN_GetSettingUI("pce.cdpsgvolume") / 100; + cd_settings.CDDA_Volume = (double)MDFN_GetSettingUI("pce.cddavolume") / 100; + cd_settings.ADPCM_Volume = (double)MDFN_GetSettingUI("pce.adpcmvolume") / 100; + cd_settings.ADPCM_ExtraPrecision = MDFN_GetSettingB("pce.adpcmextraprec"); + +#if 0 + if(IsHES) + { + double new_cdpsgvolume = 1.0 / 0.678; + + if(new_cdpsgvolume > cdpsgvolume) + { + cd_settings.ADPCM_Volume *= new_cdpsgvolume / (cdpsgvolume ? cdpsgvolume : 1.0); + cd_settings.ADPCM_Volume = std::min(cd_settings.ADPCM_Volume, 2.0); + cdpsgvolume = new_cdpsgvolume; + } + } +#endif + + if(!silent_status) + { + if(cd_settings.CDDA_Volume != 1.0 || cd_settings.ADPCM_Volume != 1.0 || cdpsgvolume != 1.0) + { + MDFN_printf(_("CD-DA Volume: %d%%\n"), (int)(100 * cd_settings.CDDA_Volume)); + MDFN_printf(_("ADPCM Volume: %d%%\n"), (int)(100 * cd_settings.ADPCM_Volume)); + MDFN_printf(_("CD PSG Volume: %d%%\n"), (int)(100 * cdpsgvolume)); + } + } + + PCECD_SetSettings(&cd_settings); + psg->SetVolume(0.678 * cdpsgvolume); +} + +static void CDSettingChanged(const char *name) +{ + SetCDSettings(true); +} + + +static const struct +{ + uint32 crc; + const char* name; +} sgx_table[] = +{ + { 0xbebfe042, "Darius Plus", }, + { 0x4c2126b0, "Aldynes" }, + { 0x8c4588e2, "1941 - Counter Attack" }, + { 0x1f041166, "Madouou Granzort" }, + { 0xb486a8ed, "Daimakaimura" }, + { 0x3b13af61, "Battle Ace" }, +}; + +static void Load(MDFNFILE *fp) +{ + try + { + uint8 hes_header[4]; + + IsHES = false; + IsSGX = false; + + fp->read(hes_header, 4); + fp->seek(0, SEEK_SET); + + if(!memcmp(hes_header, "HESM", 4)) + IsHES = true; + + LoadCommonPre(); + + if(IsHES) + { + HES_Load(fp); + + ADPCMBuf = new RavenBuffer(); + PCE_IsCD = 1; + PCECD_Init(NULL, PCECDIRQCB, PCE_MASTER_CLOCK, ADPCMBuf->Buf(), NULL, NULL); + } + else + { + uint32 crc; + + crc = HuC_Load(fp, MDFN_GetSettingB("pce.disable_bram_hucard")); + + if(!strcasecmp(fp->ext, "sgx")) + IsSGX = true; + else + { + for(auto const& e : sgx_table) + { + if(e.crc == crc) + { + IsSGX = true; + MDFN_printf(_("SuperGrafx: %s\n"), e.name); + break; + } + } + } + } + + LoadCommon(); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void LoadCommonPre(void) +{ + // Initialize sound buffers + for(unsigned ch = 0; ch < 2; ch++) + HRBufs[ch] = new OwlBuffer(); + + // FIXME: Make these globals less global! + PCE_ACEnabled = MDFN_GetSettingB("pce.arcadecard"); + + HuCPU = new HuC6280(IsHES); + + for(int x = 0; x < 0x100; x++) + { + HuCPU->SetFastRead(x, NULL); + HuCPU->SetReadHandler(x, PCEBusRead); + HuCPU->SetWriteHandler(x, PCENullWrite); + } + + MDFNMP_Init(1024, (1 << 21) / 1024); +} + +static int LoadCommon(void) +{ + IsSGX |= MDFN_GetSettingB("pce.forcesgx") ? 1 : 0; + + if(IsHES) + IsSGX = 1; + // Don't modify IsSGX past this point. + + vce = new VCE(IsSGX, MDFN_GetSettingB("pce.nospritelimit")); + + if(IsSGX) + MDFN_printf("SuperGrafx Emulation Enabled.\n"); + + for(int i = 0xF8; i < 0xFC; i++) + { + HuCPU->SetReadHandler(i, IsSGX ? BaseRAMReadSGX : BaseRAMRead); + HuCPU->SetWriteHandler(i, IsSGX ? BaseRAMWriteSGX : BaseRAMWrite); + + if(IsSGX) + HuCPU->SetFastRead(i, BaseRAM + (i & 0x3) * 8192); + else + HuCPU->SetFastRead(i, BaseRAM); + } + + MDFNMP_AddRAM(IsSGX ? 32768 : 8192, 0xf8 * 8192, BaseRAM); + + HuCPU->SetReadHandler(0xFF, IORead); + HuCPU->SetWriteHandler(0xFF, IOWrite); + + { + int psgrevision = MDFN_GetSettingI("pce.psgrevision"); + + if(psgrevision == PCE_PSG::_REVISION_COUNT) + { + psgrevision = IsSGX ? PCE_PSG::REVISION_HUC6280A : PCE_PSG::REVISION_HUC6280; + } + + for(const MDFNSetting_EnumList *el = PSGRevisionList; el->string; el++) + { + if(el->number == psgrevision) + { + MDFN_printf(_("PSG Revision: %s\n"), el->description); + break; + } + } + psg = new PCE_PSG(HRBufs[0]->Buf(), HRBufs[1]->Buf(), psgrevision); + } + + psg->SetVolume(1.0); + + if(PCE_IsCD) + SetCDSettings(); + + PCEINPUT_Init(); + + PCE_Power(); + + MDFNGameInfo->LayerNames = IsSGX ? "BG0\0SPR0\0BG1\0SPR1\0" : "Background\0Sprites\0"; + MDFNGameInfo->fps = (uint32)((double)7159090.90909090 / 455 / 263 * 65536 * 256); + MDFNGameInfo->CPInfoActiveBF = IsHES ? 0 : 1 << 0; + + for(unsigned int i = 0; i < 0x100; i++) + NonCheatPCERead[i] = HuCPU->GetReadHandler(i); + + if(!IsHES) + { + MDFNGameInfo->nominal_height = MDFN_GetSettingUI("pce.slend") - MDFN_GetSettingUI("pce.slstart") + 1; + MDFNGameInfo->nominal_width = MDFN_GetSettingB("pce.h_overscan") ? 320 : 288; + + MDFNGameInfo->lcm_width = MDFN_GetSettingB("pce.h_overscan") ? 1120 : 1024; + MDFNGameInfo->lcm_height = MDFNGameInfo->nominal_height; + } + + vce->SetShowHorizOS(MDFN_GetSettingB("pce.h_overscan")); + +#ifdef WANT_DEBUGGER + PCEDBG_Init(IsSGX, psg); +#endif + + + return(1); +} + +static bool DetectGECD(CDIF *cdiface) // Very half-assed detection until(if) we get ISO-9660 reading code. +{ + uint8 sector_buffer[2048]; + CDUtility::TOC toc; + + cdiface->ReadTOC(&toc); + + // Now, test for the Games Express CD games. The GE BIOS seems to always look at sector 0x10, but only if the first track is a + // data track. + if(toc.first_track == 1 && (toc.tracks[1].control & 0x4)) + { + if(cdiface->ReadSector(sector_buffer, 0x10, 1) == 0x1) + { + if(!memcmp((char *)sector_buffer + 0x8, "HACKER CD ROM SYSTEM", 0x14)) + return(true); + + if(!memcmp((char *)sector_buffer + 0x01, "CD001", 0x5)) + { + if(cdiface->ReadSector(sector_buffer, 0x14, 1) == 0x1) + { + static const uint32 known_crcs[] = + { + 0xd7b47c06, // AV Tanjou + 0x86aec522, // Bishoujo Jyanshi [...] + 0xc8d1b5ef, // CD Bishoujo [...] + 0x0bdbde64, // CD Pachisuro [...] + }; + uint32 zecrc = crc32(0, sector_buffer, 2048); + + //printf("%04x\n", zecrc); + for(unsigned int i = 0; i < sizeof(known_crcs) / sizeof(uint32); i++) + if(known_crcs[i] == zecrc) + return(true); + } + } + } + } + + return(false); +} + +static bool TestMagicCD(std::vector *CDInterfaces) +{ + static const uint8 magic_test[0x20] = { 0x82, 0xB1, 0x82, 0xCC, 0x83, 0x76, 0x83, 0x8D, 0x83, 0x4F, 0x83, 0x89, 0x83, 0x80, 0x82, 0xCC, + 0x92, 0x98, 0x8D, 0xEC, 0x8C, 0xA0, 0x82, 0xCD, 0x8A, 0x94, 0x8E, 0xAE, 0x89, 0xEF, 0x8E, 0xD0 + }; + CDIF *cdiface = (*CDInterfaces)[0]; + uint8 sector_buffer[2048]; + CDUtility::TOC toc; + bool ret = FALSE; + + memset(sector_buffer, 0, sizeof(sector_buffer)); + + cdiface->ReadTOC(&toc); + + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + if(cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1) != 0x1) + break; + + if(!memcmp((char*)sector_buffer, (char *)magic_test, 0x20)) + ret = TRUE; + + // PCE CD BIOS apparently only looks at the first data track. + break; + } + } + + // If it's a PC-FX CD(Battle Heat), return false. + // This is very kludgy. + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1); + if(!strncmp("PC-FX:Hu_CD-ROM", (char*)sector_buffer, strlen("PC-FX:Hu_CD-ROM"))) + { + return(false); + } + } + } + + if(DetectGECD(cdiface)) + ret = true; + + return(ret); +} + +static void LoadCD(std::vector *CDInterfaces) +{ + try + { + static const FileExtensionSpecStruct KnownBIOSExtensions[] = + { + { ".pce", gettext_noop("PC Engine ROM Image") }, + { ".bin", gettext_noop("PC Engine ROM Image") }, + { ".bios", gettext_noop("BIOS Image") }, + { NULL, NULL } + }; + IsHES = 0; + IsSGX = 0; + + LoadCommonPre(); + + const char *bios_sname = DetectGECD((*CDInterfaces)[0]) ? "pce.gecdbios" : "pce.cdbios"; + std::string bios_path = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS(bios_sname)); + MDFNFILE fp(bios_path.c_str(), KnownBIOSExtensions, _("CD BIOS")); + + bool disable_bram_cd = MDFN_GetSettingB("pce.disable_bram_cd"); + + if(disable_bram_cd) + MDFN_printf(_("Warning: BRAM is disabled per pcfx.disable_bram_cd setting. This is simulating a malfunction.\n")); + + HuC_Load(&fp, disable_bram_cd, PCE_ACEnabled ? SYSCARD_ARCADE : SYSCARD_3); + + ADPCMBuf = new RavenBuffer(); + for(unsigned lr = 0; lr < 2; lr++) + CDDABufs[lr] = new RavenBuffer(); + + PCE_IsCD = 1; + PCECD_Init(NULL, PCECDIRQCB, PCE_MASTER_CLOCK, ADPCMBuf->Buf(), CDDABufs[0]->Buf(), CDDABufs[1]->Buf()); + + cdifs = CDInterfaces; + + SCSICD_SetDisc(true, NULL, true); + + MDFN_printf(_("CD Layout: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + MDFN_printf(_("Arcade Card Emulation: %s\n"), PCE_ACEnabled ? _("Enabled") : _("Disabled")); + + LoadCommon(); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void Cleanup(void) +{ + #ifdef WANT_DEBUGGER + PCEDBG_Kill(); + #endif + + if(PCE_IsCD) + { + PCECD_Close(); + } + + if(IsHES) + HES_Close(); + else + { + HuC_Kill(); + } + + if(vce) + { + delete vce; + vce = NULL; + } + + if(psg) + { + delete psg; + psg = NULL; + } + + if(HuCPU) + { + delete HuCPU; + HuCPU = NULL; + } + + for(unsigned ch = 0; ch < 2; ch++) + { + if(HRBufs[ch]) + { + delete HRBufs[ch]; + HRBufs[ch] = NULL; + } + + if(CDDABufs[ch]) + { + delete CDDABufs[ch]; + CDDABufs[ch] = NULL; + } + } + + if(ADPCMBuf) + { + delete ADPCMBuf; + ADPCMBuf = NULL; + } + + if(HRRes) + { + delete HRRes; + HRRes = NULL; + } +} + +static void CloseGame(void) +{ + HuC_SaveNV(); + Cleanup(); +} + +#if 0 +void TestThing(unsigned count) +{ + int poo = 0; + + //for(int x = 0; x < count; x++) + { + //static const double pinc = 44100.0 / 1789772.7272; + //static double p = 0; + + //p += pinc; + //if(p >= 1.0) + //{ + // p -= 1.0; + static const uint32 ptv = (int64)(1024 * 1024) * 21477272 / 44100; + static int64 p = 0; + + //if(x == (count - 1) || 1) //!(rand() & 1)) + //{ + // p -= (12 * (x - poo)) << 20; + // poo = x; + //} + //p -= (12 << 20); + int x = count; + + p -= ((int64)12 * x) << 20; + + while(p <= 0) + { + //const int synthtime = x; + //const int synthtime_phase = ((((1 << 20) + p) >> 4) - 0x80; + //const int synthtime_phase_int = synthtime_phase >> 8; + //const int synthtime_phase_fract = synthtime_phase & 0xFF; + const uint64 synthtime_ex = ((((uint64)((x + 1) * 12) << 20) + p) / 3) >> (4 + 2); + const int synthtime = synthtime_ex >> 16; + const int synthtime_phase = (int)(synthtime_ex & 0xFFFF) - 0x80; + const int synthtime_phase_int = synthtime_phase >> 8; + const int synthtime_phase_fract = synthtime_phase & 0xFF; + static unsigned counter = 0; + static int32 wv = 0x6000; + + //printf("%d %d %lld\n", x, synthtime, ptv); + + p += ptv; + + if(!counter) + { + wv = -wv; + counter = 8; + } + else + counter--; + +// HRBufs[0][HRBUF_LEFTOVER_PADDING + x + 0] += wv * 41 * 256; +// HRBufs[0][HRBUF_LEFTOVER_PADDING + x + 1] += 0 - (wv * 41 * 256); +#if 1 + for(unsigned ch = 0; ch < 2; ch++) + { + int32 prev = 0; + for(unsigned c = 0; c < CDDA_Filter_NumConvolutions; c++) + { + int32 coeff; + int32 mr; + + //coeff = CDDA_Filter[1 + synthtime_phase_int + 0][c]; + coeff = (CDDA_Filter[1 + synthtime_phase_int + 0][c] * (256 - synthtime_phase_fract) + + CDDA_Filter[1 + synthtime_phase_int + 1][c] * (synthtime_phase_fract)) >> 8; + + mr = (wv * coeff) >> (16 - 6 - 8); + HRBufs[ch][HRBUF_LEFTOVER_PADDING + synthtime + c] += mr - prev; + prev = mr; + } + HRBufs[ch][HRBUF_LEFTOVER_PADDING + synthtime + CDDA_Filter_NumConvolutions] += 0 - prev; + } +#endif + } + } + +#if 0 + for(unsigned x = 0; x < count; x++) + { + HRBufs[0][HRBUF_LEFTOVER_PADDING + x] = 0; + HRBufs[1][HRBUF_LEFTOVER_PADDING + x] = 0; + } +#endif +} +#endif + +static EmulateSpecStruct *es; +static void Emulate(EmulateSpecStruct *espec) +{ + es = espec; + + espec->MasterCycles = 0; + espec->SoundBufSize = 0; + + MDFNMP_ApplyPeriodicCheats(); + + if(espec->VideoFormatChanged) + vce->SetPixelFormat(espec->surface->format, espec->CustomPalette, espec->CustomPaletteNumEntries); + + if(espec->SoundFormatChanged) + SetSoundRate(espec->SoundRate); + + //int t = MDFND_GetTime(); + + vce->StartFrame(espec->surface, &espec->DisplayRect, espec->LineWidths, IsHES ? 1 : espec->skip); + + // Begin loop here: + //for(int i = 0; i < 2; i++) + bool rp_rv; + do + { + assert(HuCPU->Timestamp() < 12); + //printf("ST: %d\n", HuCPU->Timestamp()); + + INPUT_Frame(); + + //vce->RunFrame(espec->surface, &espec->DisplayRect, espec->LineWidths, IsHES ? 1 : espec->skip); + do + { + rp_rv = vce->RunPartial(); + } while(espec->NeedSoundReverse && !rp_rv); + + const uint32 end_timestamp = HuCPU->Timestamp(); + const uint32 end_timestamp_div12 = end_timestamp / 12; + const uint32 end_timestamp_mod12 = end_timestamp % 12; + + INPUT_AdjustTS((int32)end_timestamp_mod12 - (int32)end_timestamp); // Careful with this! + + psg->Update(end_timestamp / 3); + psg->ResetTS(end_timestamp_mod12 / 3); + + HuC_Update(end_timestamp); + HuC_ResetTS(end_timestamp_mod12); + + { + const unsigned rsc = std::min(65536, end_timestamp_div12); + int32 new_sc; + + if(ADPCMBuf) + PCECD_ProcessADPCMBuffer(rsc); + + for(unsigned ch = 0; ch < 2; ch++) + { + if(HRRes) + { + // + // These filter parameters cause much less of a lowpass and much much less of a highpass filter effect than what I've tested on my Turbo Duo, + // but I think it's probably broken(in need of capacitor replacements). + // + HRBufs[ch]->Integrate(rsc, 2 /* lp shift, lower = less lp effect */, 14 /* hp shift, higher = less hp effect*/, ADPCMBuf, CDDABufs[ch]); + } + +#if 0 + for(unsigned x = 0; x < end_timestamp_div12; x++) + { + static double phase[2] = { 0}; + static double phase_inc[2] = { 0 }; + static double phase_inc_inc = 0.000000001; //0.000003; + + if(1) + { + static int zoom = 32767 * 0.75 * 256 / 4; + + //if(!(rand() & 0xFFFFFF)) + // zoom = -zoom; + *(float*)&HRBufs[ch]->Buf()[x] = zoom; + } + // *(float*)&HRBufs[ch]->Buf()[x] = 256 * 32767 * 0.75 * sin(phase[ch]); + else + *(float*)&HRBufs[ch]->Buf()[x] = 256 * 0.75 * ((int16)rand()); + + phase[ch] += phase_inc[ch]; + phase_inc[ch] += phase_inc_inc; + } +#endif + +#if 0 + for(unsigned x = 0; x < rsc; x++) + { + static int32 wv[2] = { 0x6000 * 256, 0x6000 * 256 }; + static int counter[2] = { 0, 0 }; + + *(float*)&HRBufs[ch]->Buf()[x] = wv[ch]; + + if(!counter[ch]) + { + wv[ch] = -wv[ch]; + counter[ch] = 80; + } + else + counter[ch]--; + } + +#endif + + if(espec->SoundBuf && HRRes) + { + //printf("%04x\n", rsc); + new_sc = HRRes->Resample(HRBufs[ch], rsc, espec->SoundBuf + (espec->SoundBufSize * 2) + ch, espec->SoundBufMaxSize - espec->SoundBufSize, espec->NeedSoundReverse); + } + else + { + HRBufs[ch]->ResampleSkipped(rsc); + new_sc = 0; + } + } + + espec->NeedSoundReverse = false; + + if(ADPCMBuf) + ADPCMBuf->Finish(rsc); + + if(CDDABufs[0]) + { + CDDABufs[0]->Finish(rsc); + CDDABufs[1]->Finish(rsc); + } + + espec->SoundBufSize += new_sc; + } + + if(PCE_IsCD) + PCECD_ResetTS(end_timestamp_mod12); + + vce->ResetTS(end_timestamp_mod12); + + HuCPU->SyncAndResetTimestamp(end_timestamp_mod12); + + // + // + // + PCE_TimestampBase += end_timestamp - end_timestamp_mod12; + espec->MasterCycles += end_timestamp - end_timestamp_mod12; + + if(!rp_rv) + { + MDFN_MidSync(espec); + } + } while(!rp_rv); + + //printf("%d\n", MDFND_GetTime() - t); + + // End loop here. + //printf("%d\n", vce->GetScanlineNo()); + + if(IsHES) + HES_Update(espec, INPUT_HESHack()); //Draw(espec->skip ? NULL : espec->surface, espec->skip ? NULL : &espec->DisplayRect, espec->SoundBuf, espec->SoundBufSize, INPUT_HESHack()); +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(BaseRAM, IsSGX? 32768 : 8192), + SFVAR(PCE_TimestampBase), + + SFEND + }; + +#ifdef WANT_DEBUGGER + PCEDBG_MachineStateChanged(); +#endif + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + HuCPU->StateAction(sm, load, data_only); + vce->StateAction(sm, load, data_only); + psg->StateAction(sm, load, data_only); + INPUT_StateAction(sm, load, data_only); + HuC_StateAction(sm, load, data_only); + + if(load) + { + + } +} + +void PCE_Power(void) +{ +#ifdef WANT_DEBUGGER + PCEDBG_MachineStateChanged(); +#endif + + memset(BaseRAM, 0x00, sizeof(BaseRAM)); + + HuCPU->Power(); + PCE_TimestampBase = 0; // FIXME, move to init. + const int32 timestamp = HuCPU->Timestamp(); + + vce->Reset(timestamp); + psg->Power(timestamp / 3); + + if(IsHES) + HES_Reset(); + else + HuC_Power(); + + PCEINPUT_Power(timestamp); + + if(PCE_IsCD) + { + vce->SetCDEvent(PCECD_Power(timestamp)); + } + //printf("%d\n", HuCPU->Timestamp()); +} + +static bool SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + const RMD_Layout* rmd = EmulatedPCE.RMD; + const RMD_Drive* rd = &rmd->Drives[drive_idx]; + const RMD_State* rs = &rd->PossibleStates[state_idx]; + + if(rs->MediaPresent && rs->MediaUsable) + { + SCSICD_SetDisc(false, (*cdifs)[media_idx]); + } + else + { + SCSICD_SetDisc(rs->MediaCanChange, NULL); + } + + return(true); +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_RESET: PCE_Power(); break; + case MDFN_MSC_POWER: PCE_Power(); break; + } +} + +static MDFNSetting PCESettings[] = +{ + { "pce.input.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap(TurboTap) emulation."), NULL, MDFNST_BOOL, "1" }, + + { "pce.slstart", MDFNSF_NOFLAGS, gettext_noop("First rendered scanline."), NULL, MDFNST_UINT, "4", "0", "239" }, + { "pce.slend", MDFNSF_NOFLAGS, gettext_noop("Last rendered scanline."), NULL, MDFNST_UINT, "235", "0", "239" }, + + { "pce.h_overscan", MDFNSF_NOFLAGS, gettext_noop("Show horizontal overscan area."), NULL, MDFNST_BOOL, "0" }, + + { "pce.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Emulated mouse sensitivity."), NULL, MDFNST_FLOAT, "0.50", NULL, NULL, NULL, PCEINPUT_SettingChanged }, + { "pce.disable_softreset", MDFNSF_NOFLAGS, gettext_noop("If set, when RUN+SEL are pressed simultaneously, disable both buttons temporarily."), NULL, MDFNST_BOOL, "0", NULL, NULL, NULL, PCEINPUT_SettingChanged }, + + { "pce.disable_bram_cd", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Disable BRAM(saved game memory) for CD games."), gettext_noop("It is intended for viewing CD games' error screens that may be different from simple BRAM full and uninitialized BRAM error screens, though it can cause the game to crash outright."), MDFNST_BOOL, "0" }, + { "pce.disable_bram_hucard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Disable BRAM(saved game memory) for HuCard games."), gettext_noop("It is intended for changing the behavior(passwords vs save games) of some HuCard games."), MDFNST_BOOL, "0" }, + + { "pce.forcesgx", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Force SuperGrafx emulation."), + gettext_noop("Enabling this option is not necessary to run unrecognized PCE ROM images in SuperGrafx mode, and enabling it is discouraged; ROM images with a file extension of \".sgx\" will automatically enable SuperGrafx emulation."), MDFNST_BOOL, "0" }, + + { "pce.arcadecard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable Arcade Card emulation."), + gettext_noop("Leaving this option enabled is recommended, unless you want to see special warning screens on ACD games, or you prefer the non-enhanced modes of ACD-enhanced SCD games. Additionally, you may want to disable it you you wish to use state rewinding with a SCD ACD-enhanced game on a slow CPU, as the extra 2MiB of RAM the Arcade Card offers is difficult to compress in real-time."), MDFNST_BOOL, "1" }, + + { "pce.nospritelimit", MDFNSF_NOFLAGS, gettext_noop("Remove 16-sprites-per-scanline hardware limit."), + gettext_noop("WARNING: Enabling this option may cause undesirable graphics glitching on some games(such as \"Bloody Wolf\")."), MDFNST_BOOL, "0" }, + + { "pce.cdbios", MDFNSF_EMU_STATE, gettext_noop("Path to the CD BIOS"), NULL, MDFNST_STRING, "syscard3.pce" }, + { "pce.gecdbios", MDFNSF_EMU_STATE, gettext_noop("Path to the GE CD BIOS"), gettext_noop("Games Express CD Card BIOS (Unlicensed)"), MDFNST_STRING, "gecard.pce" }, + + { "pce.psgrevision", MDFNSF_NOFLAGS, gettext_noop("Select PSG revision."), gettext_noop("WARNING: HES playback will always use the \"huc6280a\" revision if this setting is set to \"match\", since HES playback is always done with SuperGrafx emulation enabled."), MDFNST_ENUM, "match", NULL, NULL, NULL, NULL, PSGRevisionList }, + + { "pce.cdpsgvolume", MDFNSF_NOFLAGS, gettext_noop("PSG volume when playing a CD game."), gettext_noop("Setting this volume control too high may cause sample clipping."), MDFNST_UINT, "100", "0", "200", NULL, CDSettingChanged }, + { "pce.cddavolume", MDFNSF_NOFLAGS, gettext_noop("CD-DA volume."), gettext_noop("Setting this volume control too high may cause sample clipping."), MDFNST_UINT, "100", "0", "200", NULL, CDSettingChanged }, + { "pce.adpcmvolume", MDFNSF_NOFLAGS, gettext_noop("ADPCM volume."), gettext_noop("Setting this volume control too high may cause sample clipping."), MDFNST_UINT, "100", "0", "200", NULL, CDSettingChanged }, + { "pce.adpcmextraprec", MDFNSF_NOFLAGS, gettext_noop("Output the full 12-bit ADPCM predictor."), gettext_noop("Enabling this option causes the MSM5205 ADPCM predictor to be outputted with full precision of 12-bits, rather than only outputting 10-bits of precision(as an actual MSM5205 does). Enable this option to reduce whining noise during ADPCM playback."), MDFNST_BOOL, "0" }, + + { "pce.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("Sound quality."), gettext_noop("Higher values correspond to better SNR and better preservation of higher frequencies(\"brightness\"), at the cost of increased computational complexity and a negligible increase in latency.\n\nHigher values will also slightly increase the probability of sample clipping(relevant if Mednafen's volume control settings are set too high), due to increased (time-domain) ringing."), MDFNST_INT, "3", "0", "5" }, + { "pce.resamp_rate_error", MDFNSF_NOFLAGS, gettext_noop("Sound output rate tolerance."), gettext_noop("Lower values correspond to better matching of the output rate of the resampler to the actual desired output rate, at the expense of increased RAM usage and poorer CPU cache utilization."), MDFNST_FLOAT, "0.0000009", "0.0000001", "0.0000350" }, + + { "pce.vramsize", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE | MDFNSF_SUPPRESS_DOC, gettext_noop("Size of emulated VRAM per VDC in 16-bit words. DO NOT CHANGE THIS UNLESS YOU KNOW WTF YOU ARE DOING."), NULL, MDFNST_UINT, "32768", "32768", "65536" }, + { NULL } +}; + +static DECLFR(CheatReadFunc) +{ + std::vector::iterator chit; + uint8 retval = NonCheatPCERead[(A / 8192) & 0xFF](A); + + for(chit = SubCheats[A & 0x7].begin(); chit != SubCheats[A & 0x7].end(); chit++) + { + if(A == chit->addr) + { + if(chit->compare == -1 || chit->compare == retval) + { + retval = chit->value; + break; + } + } + } + return(retval); +} + +static uint8 MemRead(uint32 addr) +{ + return(NonCheatPCERead[(addr / 8192) & 0xFF](addr)); +} + +static void InstallReadPatch(uint32 address, uint8 value, int compare) +{ + HuCPU->SetFastRead(address >> 13, NULL); + HuCPU->SetReadHandler(address >> 13, CheatReadFunc); +} + +static void RemoveReadPatches(void) +{ + for(int x = 0; x < 0x100; x++) + HuCPU->SetReadHandler(x, NonCheatPCERead[x]); +} + +static void SetLayerEnableMask(uint64 mask) +{ + vce->SetLayerEnableMask(mask); +} + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".pce", gettext_noop("PC Engine ROM Image") }, + { ".hes", gettext_noop("PC Engine Music Rip") }, + { ".sgx", gettext_noop("SuperGrafx ROM Image") }, + { NULL, NULL } +}; + +static bool SetSoundRate(double rate) +{ + if(HRRes) + { + delete HRRes; + HRRes = NULL; + } + + if(rate > 0) + { + HRRes = new OwlResampler(PCE_MASTER_CLOCK / 12, rate, MDFN_GetSettingF("pce.resamp_rate_error"), 20, MDFN_GetSettingUI("pce.resamp_quality")); + for(unsigned i = 0; i < 2; i++) + HRRes->ResetBufResampState(HRBufs[i]); + } + + return(TRUE); +} + +//MDFN_printf(_("Palette is missing the full set of 512 greyscale entries. Strip-colorburst entries will be calculated.\n")); +static const CustomPalette_Spec CPInfo[] = +{ + { gettext_noop("PCE/TG16 9-bit RGB"), NULL, { 512, 1024, 0 } }, + + { NULL, NULL } +}; + + +}; + +using namespace MDFN_IEN_PCE; + +MDFNGI EmulatedPCE = +{ + "pce", + "PC Engine (CD)/TurboGrafx 16 (CD)/SuperGrafx", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &PCEDBGInfo, + #else + NULL, + #endif + PCEPortInfo, + Load, + TestMagic, + LoadCD, + TestMagicCD, + CloseGame, + + SetLayerEnableMask, + NULL, + + NULL, + NULL, + + CPInfo, + 0, + + InstallReadPatch, + RemoveReadPatches, + MemRead, + NULL, + false, + StateAction, + Emulate, + PCEINPUT_TransformInput, + PCEINPUT_SetInput, + SetMedia, + DoSimpleCommand, + PCESettings, + MDFN_MASTERCLOCK_FIXED(PCE_MASTER_CLOCK), + 0, + TRUE, // Multires possible? + + 0, // lcm_width + 0, // lcm_height + NULL, // Dummy + + 320, // Nominal width + 232, // Nominal height + 1365, // Framebuffer width + 270, // Framebuffer height(TODO: decrease to 264(263 + spillover line)) + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/pce/pce.h b/Mednafen/mednafen/pce/pce.h new file mode 100644 index 0000000000..a016284ff3 --- /dev/null +++ b/Mednafen/mednafen/pce/pce.h @@ -0,0 +1,33 @@ +#ifndef _PCE_H + +#include +#include +#include + +namespace MDFN_IEN_PCE +{ + +#define PCE_MASTER_CLOCK 21477272.727273 + +#define DECLFR(x) uint8 x (uint32 A) +#define DECLFW(x) void x (uint32 A, uint8 V) + +}; + +#include + +namespace MDFN_IEN_PCE +{ +extern HuC6280 *HuCPU; + +extern uint32 PCE_InDebug; +extern bool PCE_ACEnabled; // Arcade Card emulation enabled? +void PCE_Power(void); + +uint8 PCE_PeekMainRAM(uint32 A); +void PCE_PokeMainRAM(uint32 A, uint8 V); + +}; + +#define _PCE_H +#endif diff --git a/Mednafen/mednafen/pce/pcecd.cpp b/Mednafen/mednafen/pce/pcecd.cpp new file mode 100644 index 0000000000..a3fadd69d4 --- /dev/null +++ b/Mednafen/mednafen/pce/pcecd.cpp @@ -0,0 +1,1338 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2004 Ki + * Copyright (C) 2007-2011 Mednafen Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + Stuff to test: + ADPCM playback rate relative to main PC Engine master clock rate. (Might vary significantly from system-to-system + due to imperfections in the separate clocks) + + Figure out how the ADPCM DMA control bits work. + + Determine real fade timings. + + Determine what D0 of the fade control register does(maybe mutes the channel not being fad-controlled if it's set?). + + Determine what D7 of the fade control register does("TEST"), assuming it even exists on the production model PCE CD. + + Handle D2 of register at 0x1804 better. Determine what the other bits of 0x1804 are for. + + Determine what registers and bits setting D7 of $180D causes to reset. + + Test behavior of D0-D3 of $180D on a real system(already tested D4). (Does setting the read address + cause a new byte to be loaded into the read buffer?) + + Test ADPCM write performance at all frequencies when playback is occurring. + + OTHER STUFF. +*/ + +/* + Notes: + Reading from $180A decrements length. Appears to saturate at 0x0000. + Side effects include at least: half/end IRQ bit setting. Oddly enough, when the end flags are set via read from $180A, the intermediate + flag appears to be cleared. This wouldn't appear to occur in normal ADPCM playback, ie both end and intermediate flags are 1 by the end + of playback(though if D6 of $180D is cleared, the intermediate flag is apparently cleared on the next sample clock, either intentionally or due to + some kind of length underflow I don't know; but the mode of operation of having D6 cleared is buggy, and I doubt games rely on any of its + weirder nuances). + + Writing to $180A increments length. Appears to saturate at 0xFFFF. + Side effects include at least: half IRQ bit setting/clearing. + + For $180A port read/write accesses at least, half_point = (bool)(length < 32768), evaluated before length is decremented or incremented. + + ADPCM RAM reads due to playback apparently aren't reflected in $180A as ADPCM read busy state. Unknown if it shares the same + buffer as $180A port reads though. + + Having D4 of $180D set clears the end flags(and they will not be set as long as D4 is set). It doesn't clear the intermediate/half flag though. + Short of resetting the ADPCM hardware by setting D7 of $180D, this was the only way I could find to clear the end flags via software. + + Having D4 of $180D set does NOT prevent the half flag from being set(at least not during reads/writes to $180A). + + ADPCM playback doesn't seem to start if the end flags are set and 0x60 is written to $180D, but starts(at least as can be determined from a program + monitoring the status bits) if 0x20 is written(IE D6 is clear). More investigation is needed(unlikely to affect games though). + + ADPCM playback starting is likely delayed(or at certain intervals) compared to writes to $180D. Investigation is needed, but emulating a non-constant + granularity-related delay may be undesirable due to the potential of triggering race conditions in game code. + + I say "end flags", but I'm assuming there's effectively one end flag, that's present in both $1803 and $180C reads(though in different positions). +*/ + +/* + Design notes: + For a given timestamp, any calls to SCSICD_Run() called from above PCECD_Run() must be preceded by a call to PCECD_Run() or else + timekeeping variables will get out of sync and everything will go boom. +*/ + +#include +#include +#include +#include +#include + +#include "pcecd.h" + +//#define PCECD_DEBUG + +static void (*IRQCB)(bool asserted); + +// Settings: +static double CDDABaseVolume; +static double ADPCMBaseVolume; +static bool ADPCMExtraPrecision; +//static bool ADPCMFancyLP; // Commented out, not really a worthwhile feature IMO(sound effects don't sound right without the extra spectrum duplicates). + + +static bool bBRAMEnabled; +static uint8 _Port[15]; +static uint8 ACKStatus; + +static SimpleFIFO SubChannelFIFO(16); + +static int32* ADPCMBuf; +static int16 RawPCMVolumeCache[2]; + +static int32 ClearACKDelay; + +static int32 lastts; +static int32 scsicd_ne = 0; + +// ADPCM variables and whatnot +#define ADPCM_DEBUG(x, ...) { /*printf("[Half=%d, End=%d, Playing=%d] "x, ADPCM.HalfReached, ADPCM.EndReached, ADPCM.Playing, ## __VA_ARGS__);*/ } + +static OKIADPCM_Decoder MSM5205; + +typedef struct +{ + uint8 *RAM; // = NULL; //0x10000; + uint16 Addr; + uint16 ReadAddr; + uint16 WriteAddr; + uint16 LengthCount; + + bool HalfReached; + bool EndReached; + bool Playing; + + uint8 LastCmd; + uint32 SampleFreq; + + uint8 PlayBuffer; + uint8 ReadBuffer; + int32 ReadPending; + int32 WritePending; + uint8 WritePendingValue; + + uint32 PlayNibble; + + + int64 bigdivacc; + int64 bigdiv; + // + // + // + int32 last_pcm; + int32 integrate_accum; + int64 lp1p_fstate; + int64 lp2p_fstate[3]; +} ADPCM_t; + +static ADPCM_t ADPCM; + +typedef struct +{ + uint8 Command; + int32 Volume; + + int32 CycleCounter; + uint32 CountValue; // What to reload CycleCounter with when it expires. + bool Clocked; +} FADE_t; + +static FADE_t Fader; +static int32 ADPCMFadeVolume, CDDAFadeVolume; +static int32 ADPCMTotalVolume; + +static INLINE void Fader_SyncWhich(void) +{ + if(Fader.Command & 0x2) // ADPCM fade + { + ADPCMFadeVolume = Fader.Volume; + CDDAFadeVolume = 65536; + } + else // CD-DA Fade + { + CDDAFadeVolume = Fader.Volume; + ADPCMFadeVolume = 65536; + } + + ADPCMTotalVolume = ADPCMBaseVolume * ADPCMFadeVolume; + SCSICD_SetCDDAVolume(CDDAFadeVolume * CDDABaseVolume / 65536, CDDAFadeVolume * CDDABaseVolume / 65536); +} + +static INLINE int32 ADPCM_ClocksToNextEvent(void) +{ + int32 ret = (ADPCM.bigdiv + 65535) >> 16; + + if(ADPCM.WritePending && ret > ADPCM.WritePending) + ret = ADPCM.WritePending; + + if(ADPCM.ReadPending && ret > ADPCM.ReadPending) + ret = ADPCM.ReadPending; + + return(ret); +} + +static int32 CalcNextEvent(int32 base) +{ + int32 next_event = base; + int32 ADPCM_ctne = ADPCM_ClocksToNextEvent(); + + if(next_event > ADPCM_ctne) + next_event = ADPCM_ctne; + + if(ClearACKDelay > 0 && next_event > ClearACKDelay) + next_event = ClearACKDelay; + + if(next_event > scsicd_ne) + next_event = scsicd_ne; + + if(Fader.Clocked && next_event > Fader.CycleCounter) + next_event = Fader.CycleCounter; + + return(next_event); +} + +uint32 PCECD_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case CD_GSREG_BSY: + value = SCSICD_GetBSY(); + break; + + case CD_GSREG_REQ: + value = SCSICD_GetREQ(); + break; + + case CD_GSREG_MSG: + value = SCSICD_GetMSG(); + break; + + case CD_GSREG_CD: + value = SCSICD_GetCD(); + break; + + case CD_GSREG_IO: + value = SCSICD_GetIO(); + break; + + case CD_GSREG_SEL: + value = SCSICD_GetSEL(); + break; + + case CD_GSREG_ADPCM_CONTROL: + value = ADPCM.LastCmd; + break; + + case CD_GSREG_ADPCM_FREQ: + value = ADPCM.SampleFreq; + break; + + case CD_GSREG_ADPCM_CUR: + value = MSM5205.GetSample(); + break; + + case CD_GSREG_ADPCM_WRADDR: + value = ADPCM.WriteAddr; + break; + + case CD_GSREG_ADPCM_RDADDR: + value = ADPCM.ReadAddr; + break; + + case CD_GSREG_ADPCM_LENGTH: + value = ADPCM.LengthCount; + break; + + case CD_GSREG_ADPCM_PLAYNIBBLE: + value = (bool)(ADPCM.PlayNibble); + break; + + case CD_GSREG_ADPCM_PLAYING: + value = ADPCM.Playing; + break; + + case CD_GSREG_ADPCM_HALFREACHED: + value = ADPCM.HalfReached; + break; + + case CD_GSREG_ADPCM_ENDREACHED: + value = ADPCM.EndReached; + break; + } + + return(value); +} + +// TODO: +void PCECD_SetRegister(const unsigned int id, const uint32 value) +{ + +} + +void ADPCM_PeekRAM(uint32 Address, uint32 Length, uint8 *Buffer) +{ + while(Length--) + { + Address &= 0xFFFF; + *Buffer = ADPCM.RAM[Address]; + Address++; + Buffer++; + } +} + +void ADPCM_PokeRAM(uint32 Address, uint32 Length, const uint8 *Buffer) +{ + while(Length--) + { + Address &= 0xFFFF; + ADPCM.RAM[Address] = *Buffer; + Address++; + Buffer++; + } +} + +static void update_irq_state() +{ + uint8 irq = _Port[2] & _Port[0x3] & (0x4|0x8|0x10|0x20|0x40); + + IRQCB((bool)irq); +} + +static void StuffSubchannel(uint8 meow, int subindex) +{ + uint8 tmp_data = meow & 0x7F; + + if(subindex == -2) + tmp_data = 0x00; + else if(subindex == -1) + tmp_data = 0x80; + + if(SubChannelFIFO.CanWrite()) + SubChannelFIFO.Write(&tmp_data, 1); + + _Port[0x3] |= 0x10; + update_irq_state(); +} + +static void CDIRQ(int type) +{ + #ifdef PCECD_DEBUG + if(type != 0x8000 || _Port[0x3] & 0x60) + printf("CDIRQ: %d\n", type); + #endif + if(type & 0x8000) + { + type &= 0x7FFF; + if(type == SCSICD_IRQ_DATA_TRANSFER_DONE) + _Port[0x3] &= ~0x20; + else if(type == SCSICD_IRQ_DATA_TRANSFER_READY) + _Port[0x3] &= ~0x40; + } + else if(type == SCSICD_IRQ_DATA_TRANSFER_DONE) + { + _Port[0x3] |= 0x20; + } + else if(type == SCSICD_IRQ_DATA_TRANSFER_READY) + { + _Port[0x3] |= 0x40; + } + update_irq_state(); +} + +static void UpdateADPCMIRQState(void) +{ + _Port[0x3] &= ~0xC; + + _Port[0x3] |= ADPCM.HalfReached ? 0x4 : 0x0; + _Port[0x3] |= ADPCM.EndReached ? 0x8 : 0x0; + + update_irq_state(); +} + +static INLINE uint8 read_1808(int32 timestamp, const bool PeekMode) +{ + uint8 ret = SCSICD_GetDB(); + + if(!PeekMode) + { + if(SCSICD_GetREQ() && !SCSICD_GetACK() && !SCSICD_GetCD()) + { + if(SCSICD_GetIO()) + { + SCSICD_SetACK(TRUE); + ACKStatus = TRUE; + scsicd_ne = SCSICD_Run(timestamp); + ClearACKDelay = 15 * 3; + } + } + } + + return(ret); +} + +bool PCECD_SetSettings(const PCECD_Settings *settings) +{ + //CDDABaseVolume = 0.5850f * (settings ? settings->CDDA_Volume : 1.0); + //ADPCMBaseVolume = 0.50f * (settings ? settings->ADPCM_Volume : 1.0); + + CDDABaseVolume = 0.50f * (settings ? settings->CDDA_Volume : 1.0); + ADPCMBaseVolume = 0.42735f * (settings ? settings->ADPCM_Volume : 1.0); + ADPCMExtraPrecision = settings ? settings->ADPCM_ExtraPrecision : false; + //ADPCMFancyLP = false; + + Fader_SyncWhich(); + return true; +} + +static void Cleanup(void) +{ + if(ADPCM.RAM) + { + MDFN_free(ADPCM.RAM); + ADPCM.RAM = NULL; + } + SCSICD_Close(); +} + +void PCECD_Init(const PCECD_Settings *settings, void (*irqcb)(bool), double master_clock, int32* adbuf, int32* hrbuf_l, int32* hrbuf_r) +{ + try + { + ADPCM.last_pcm = 0; + ADPCM.integrate_accum = 0; + ADPCM.lp1p_fstate = 0; + memset(ADPCM.lp2p_fstate, 0, sizeof(ADPCM.lp2p_fstate)); + + lastts = 0; + + IRQCB = irqcb; + + ADPCMBuf = adbuf; + + SCSICD_Init(SCSICD_PCE, 3, hrbuf_l, hrbuf_r, 126000, master_clock, CDIRQ, StuffSubchannel); + + ADPCM.RAM = (uint8 *)MDFN_malloc_T(0x10000, _("PCE ADPCM RAM")); + + PCECD_SetSettings(settings); + + ADPCM.bigdivacc = (int64)((double)master_clock * 65536 / 32087.5); + } + catch(...) + { + Cleanup(); + throw; + } +} + + +void PCECD_Close(void) +{ + Cleanup(); +} + + +int32 PCECD_Power(uint32 timestamp) +{ + if((int32)timestamp != lastts) + (void)PCECD_Run(timestamp); + + IRQCB(0); + + SCSICD_Power(timestamp); + scsicd_ne = 0x7fffffff; + + bBRAMEnabled = FALSE; + memset(_Port, 0, sizeof(_Port)); + ACKStatus = 0; + ClearACKDelay = 0; + + memset(ADPCM.RAM, 0x00, 65536); + + ADPCM.ReadPending = ADPCM.WritePending = 0; + ADPCM.ReadBuffer = 0; + ADPCM.PlayBuffer = 0; + + ADPCM.LastCmd = 0; + MSM5205.SetSample(0x800); + MSM5205.SetSSI(0); + + ADPCM.SampleFreq = 0; + ADPCM.bigdiv = ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); + + ADPCM.Addr = 0; + ADPCM.ReadAddr = 0; + ADPCM.WriteAddr = 0; + ADPCM.LengthCount = 0; + ADPCM.LastCmd = 0; + + ADPCM.HalfReached = false; + ADPCM.EndReached = false; + ADPCM.Playing = false; + ADPCM.PlayNibble = 0; + + UpdateADPCMIRQState(); + + Fader.Command = 0x00; + Fader.Volume = 0; + Fader.CycleCounter = 0; + Fader.CountValue = 0; + Fader.Clocked = FALSE; + + return(CalcNextEvent(0x7FFFFFFF)); +} + +bool PCECD_IsBRAMEnabled() +{ + return bBRAMEnabled; +} + +uint8 PCECD_Read(uint32 timestamp, uint32 A, int32 &next_event, const bool PeekMode) +{ + uint8 ret = 0; + + if((A & 0x18c0) == 0x18c0) + { + switch (A & 0x18cf) + { + case 0x18c1: ret = 0xaa; break; + case 0x18c2: ret = 0x55; break; + case 0x18c3: ret = 0x00; break; + case 0x18c5: ret = 0xaa; break; + case 0x18c6: ret = 0x55; break; + case 0x18c7: ret = 0x03; break; + } + } + else + { + if(!PeekMode) + PCECD_Run(timestamp); + + switch(A & 0xf) + { + case 0x0: + ret = 0; + ret |= SCSICD_GetBSY() ? 0x80 : 0x00; + ret |= SCSICD_GetREQ() ? 0x40 : 0x00; + ret |= SCSICD_GetMSG() ? 0x20 : 0x00; + ret |= SCSICD_GetCD() ? 0x10 : 0x00; + ret |= SCSICD_GetIO() ? 0x08 : 0x00; + break; + + case 0x1: ret = SCSICD_GetDB(); + break; + + case 0x2: ret = _Port[2]; + break; + + case 0x3: bBRAMEnabled = FALSE; + + /* switch left/right of digitized cd playback */ + ret = _Port[0x3]; + if(!PeekMode) + _Port[0x3] ^= 2; + break; + + case 0x4: ret = _Port[4]; + break; + + case 0x5: if(_Port[0x3] & 0x2) + ret = RawPCMVolumeCache[1] & 0xff; // Right + else + ret = RawPCMVolumeCache[0] & 0xff; // Left + break; + + case 0x6: if(_Port[0x3] & 0x2) + ret = ((uint16)RawPCMVolumeCache[1]) >> 8; // Right + else + ret = ((uint16)RawPCMVolumeCache[0]) >> 8; // Left + break; + + case 0x7: + if(SubChannelFIFO.CanRead() > 0) + ret = SubChannelFIFO.ReadByte(PeekMode); + else + ret = 0x00; // Not sure if it's 0, 0xFF, the last byte read, or something else. + + if(!PeekMode) + { + if(SubChannelFIFO.CanRead() == 0) + { + _Port[0x3] &= ~0x10; + update_irq_state(); + } + } + break; + + case 0x8: + ret = read_1808(timestamp, PeekMode); + break; + + case 0xa: + if(!PeekMode) + { + ADPCM_DEBUG("ReadBuffer\n"); + ADPCM.ReadPending = 19 * 3; //24 * 3; + } + + ret = ADPCM.ReadBuffer; + + break; + + case 0xb: + ret = _Port[0xb]; + break; + + case 0xc: + //printf("ADPCM Status Read: %d\n", timestamp); + ret = 0x00; + + ret |= (ADPCM.EndReached) ? 0x01 : 0x00; + ret |= (ADPCM.Playing) ? 0x08 : 0x00; + ret |= (ADPCM.WritePending > 0) ? 0x04 : 0x00; + ret |= (ADPCM.ReadPending > 0) ? 0x80 : 0x00; + break; + + case 0xd: + ret = ADPCM.LastCmd; + break; + } + } + + #ifdef PCECD_DEBUG + printf("Read: %04x %02x, %d\n", A, ret, timestamp); + #endif + + next_event = CalcNextEvent(0x7FFFFFFF); + + return(ret); +} + +static INLINE void Fader_Run(const int32 clocks) +{ + if(Fader.Clocked) + { + Fader.CycleCounter -= clocks; + while(Fader.CycleCounter <= 0) + { + if(Fader.Volume) + Fader.Volume--; + + Fader_SyncWhich(); + + Fader.CycleCounter += Fader.CountValue; + } + } +} + + +int32 PCECD_Write(uint32 timestamp, uint32 physAddr, uint8 data) +{ + const uint8 V = data; + + #ifdef PCECD_DEBUG + printf("Write: (PC=%04x, t=%6d) %04x %02x; MSG: %d, REQ: %d, ACK: %d, CD: %d, IO: %d, BSY: %d, SEL: %d\n", HuCPU.PC, timestamp, physAddr, data, SCSICD_GetMSG(), SCSICD_GetREQ(), SCSICD_GetACK(), SCSICD_GetCD(), SCSICD_GetIO(), SCSICD_GetBSY(), SCSICD_GetSEL()); + #endif + + PCECD_Run(timestamp); + + switch (physAddr & 0xf) + { + case 0x0: + SCSICD_SetSEL(1); + SCSICD_Run(timestamp); + SCSICD_SetSEL(0); + scsicd_ne = SCSICD_Run(timestamp); + + /* reset irq status */ + _Port[0x3] &= ~(0x20 | 0x40); // TODO: Confirm writing this register really reset these bits. + update_irq_state(); + break; + + case 0x1: // $1801 + _Port[1] = data; + SCSICD_SetDB(data); + scsicd_ne = SCSICD_Run(timestamp); + break; + + case 0x2: // $1802 + #ifdef PCECD_DEBUG + if(!(_Port[0x3] & _Port[2] & 0x40) && (_Port[0x3] & data & 0x40)) + puts("IRQ on waah 0x40"); + if(!(_Port[0x3] & _Port[2] & 0x20) && (_Port[0x3] & data & 0x20)) + puts("IRQ on waah 0x20"); + #endif + + SCSICD_SetACK(data & 0x80); + scsicd_ne = SCSICD_Run(timestamp); + _Port[2] = data; + ACKStatus = (bool)(data & 0x80); + update_irq_state(); + break; + + case 0x3: // read only + break; + + case 0x4: + SCSICD_SetRST(data & 0x2); + scsicd_ne = SCSICD_Run(timestamp); + if(data & 0x2) + { + _Port[0x3] &= ~0x70; + update_irq_state(); + } + _Port[4] = data; + break; + + case 0x5: + case 0x6: + { + int16 left, right; + SCSICD_GetCDDAValues(left, right); + RawPCMVolumeCache[0] = ((int64)abs(left) * CDDAFadeVolume) >> 16; + RawPCMVolumeCache[1] = ((int64)abs(right) * CDDAFadeVolume) >> 16; + } + break; + + case 0x7: // $1807: D7=1 enables backup ram + if (data & 0x80) + { + bBRAMEnabled = TRUE; + } + break; + + case 0x8: // Set ADPCM address low + if(ADPCM.LastCmd & 0x80) + break; + + ADPCM.Addr &= 0xFF00; + ADPCM.Addr |= V; + + ADPCM_DEBUG("SAL: %02x, %d\n", V, timestamp); + + // Length appears to be constantly latched when D4 is set(tested on a real system) + if(ADPCM.LastCmd & 0x10) + { + ADPCM_DEBUG("Set length(crazy way L): %04x\n", ADPCM.Addr); + ADPCM.LengthCount = ADPCM.Addr; + } + break; + + case 0x9: // Set ADPCM address high + if(ADPCM.LastCmd & 0x80) + break; + + ADPCM.Addr &= 0x00FF; + ADPCM.Addr |= V << 8; + + ADPCM_DEBUG("SAH: %02x, %d\n", V, timestamp); + + // Length appears to be constantly latched when D4 is set(tested on a real system) + if(ADPCM.LastCmd & 0x10) + { + ADPCM_DEBUG("Set length(crazy way H): %04x\n", ADPCM.Addr); + ADPCM.LengthCount = ADPCM.Addr; + } + break; + + case 0xa: + //ADPCM_DEBUG("Write: %02x, %d\n", V, timestamp); + ADPCM.WritePending = 3 * 11; + ADPCM.WritePendingValue = data; + break; + + case 0xb: // adpcm dma + ADPCM_DEBUG("DMA: %02x\n", V); + _Port[0xb] = data; + break; + + case 0xc: // read-only + break; + + case 0xd: + ADPCM_DEBUG("Write180D: %02x\n", V); + if(data & 0x80) + { + ADPCM.Addr = 0; + ADPCM.ReadAddr = 0; + ADPCM.WriteAddr = 0; + ADPCM.LengthCount = 0; + ADPCM.LastCmd = 0; + + ADPCM.Playing = false; + ADPCM.HalfReached = false; + ADPCM.EndReached = false; + + ADPCM.PlayNibble = 0; + + UpdateADPCMIRQState(); + + MSM5205.SetSample(0x800); + MSM5205.SetSSI(0); + break; + } + + if(ADPCM.Playing && !(data & 0x20)) + ADPCM.Playing = false; + + if(!ADPCM.Playing && (data & 0x20)) + { + ADPCM.bigdiv = ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); + ADPCM.Playing = true; + ADPCM.HalfReached = false; // Not sure about this. + ADPCM.PlayNibble = 0; + MSM5205.SetSample(0x800); + MSM5205.SetSSI(0); + } + + // Length appears to be constantly latched when D4 is set(tested on a real system) + if(data & 0x10) + { + ADPCM_DEBUG("Set length: %04x\n", ADPCM.Addr); + ADPCM.LengthCount = ADPCM.Addr; + ADPCM.EndReached = false; + } + + // D2 and D3 control read address + if(!(ADPCM.LastCmd & 0x8) && (data & 0x08)) + { + if(data & 0x4) + ADPCM.ReadAddr = ADPCM.Addr; + else + ADPCM.ReadAddr = (ADPCM.Addr - 1) & 0xFFFF; + + ADPCM_DEBUG("Set ReadAddr: %04x, %06x\n", ADPCM.Addr, ADPCM.ReadAddr); + } + + // D0 and D1 control write address + if(!(ADPCM.LastCmd & 0x2) && (data & 0x2)) + { + ADPCM.WriteAddr = ADPCM.Addr; + if(!(data & 0x1)) + ADPCM.WriteAddr = (ADPCM.WriteAddr - 1) & 0xFFFF; + ADPCM_DEBUG("Set WriteAddr: %04x, %06x\n", ADPCM.Addr, ADPCM.WriteAddr); + } + ADPCM.LastCmd = data; + UpdateADPCMIRQState(); + break; + + case 0xe: // Set ADPCM playback rate + { + uint8 freq = V & 0x0F; + + ADPCM.SampleFreq = freq; + + ADPCM_DEBUG("Freq: %02x\n", freq); + } + break; + + case 0xf: + Fader.Command = V; + + #ifdef PCECD_DEBUG + printf("Fade: %02x\n", data); + #endif + + // Cancel fade + if(!(V & 0x8)) + { + Fader.Volume = 65536; + Fader.CycleCounter = 0; + Fader.CountValue = 0; + Fader.Clocked = FALSE; + } + else + { + Fader.CountValue = 3 * ((V & 0x4) ? 273 : 655); // 2.500s : 6.000s; + + if(!Fader.Clocked) + Fader.CycleCounter = Fader.CountValue; + + Fader.Clocked = TRUE; + } + Fader_SyncWhich(); + break; + } + + + return(CalcNextEvent(0x7FFFFFFF)); +} + +static const unsigned ADPCM_Filter_NumPhases = 64; +static const unsigned ADPCM_Filter_NumConvolutions = 7; + +static const uint8 ADPCM_Filter[64][ADPCM_Filter_NumConvolutions] = +{ + /* 0 */ { 5, 37, 86, 86, 37, 5, 0 }, // 256 256.314778(diff = 0.314778) + /* 1 */ { 5, 36, 85, 86, 38, 6, 0 }, // 256 255.972526(diff = 0.027474) + /* 2 */ { 5, 35, 84, 87, 39, 6, 0 }, // 256 255.977727(diff = 0.022273) + /* 3 */ { 5, 34, 84, 87, 40, 6, 0 }, // 256 255.982355(diff = 0.017645) + /* 4 */ { 4, 34, 83, 88, 41, 6, 0 }, // 256 255.986452(diff = 0.013548) + /* 5 */ { 4, 33, 83, 88, 41, 7, 0 }, // 256 256.007876(diff = 0.007876) + /* 6 */ { 4, 32, 82, 89, 42, 7, 0 }, // 256 255.993212(diff = 0.006788) + /* 7 */ { 4, 32, 81, 89, 43, 7, 0 }, // 256 255.995950(diff = 0.004050) + /* 8 */ { 4, 31, 80, 90, 44, 7, 0 }, // 256 255.642895(diff = 0.357105) + /* 9 */ { 3, 30, 80, 90, 45, 8, 0 }, // 256 256.000315(diff = 0.000315) + /* 10 */ { 3, 30, 79, 91, 45, 8, 0 }, // 256 256.512678(diff = 0.512678) + /* 11 */ { 3, 29, 79, 91, 46, 8, 0 }, // 256 256.003417(diff = 0.003417) + /* 12 */ { 3, 28, 78, 91, 47, 9, 0 }, // 256 256.004569(diff = 0.004569) + /* 13 */ { 3, 27, 77, 92, 48, 9, 0 }, // 256 256.005492(diff = 0.005492) + /* 14 */ { 3, 27, 76, 92, 49, 9, 0 }, // 256 255.832851(diff = 0.167149) + /* 15 */ { 3, 26, 76, 92, 49, 10, 0 }, // 256 256.006751(diff = 0.006751) + /* 16 */ { 2, 26, 75, 93, 50, 10, 0 }, // 256 256.322217(diff = 0.322217) + /* 17 */ { 2, 25, 75, 93, 51, 10, 0 }, // 256 256.380094(diff = 0.380094) + /* 18 */ { 2, 24, 74, 93, 52, 11, 0 }, // 256 256.007518(diff = 0.007518) + /* 19 */ { 2, 24, 73, 93, 53, 11, 0 }, // 256 256.007555(diff = 0.007555) + /* 20 */ { 2, 23, 72, 93, 54, 12, 0 }, // 256 256.007514(diff = 0.007514) + /* 21 */ { 2, 22, 72, 94, 54, 12, 0 }, // 256 256.376453(diff = 0.376453) + /* 22 */ { 2, 22, 71, 94, 55, 12, 0 }, // 256 256.007255(diff = 0.007255) + /* 23 */ { 2, 21, 69, 94, 56, 13, 1 }, // 256 254.698920(diff = 1.301080) + /* 24 */ { 2, 21, 69, 94, 56, 13, 1 }, // 256 254.310181(diff = 1.689819) + /* 25 */ { 1, 20, 68, 94, 58, 14, 1 }, // 256 256.006624(diff = 0.006624) + /* 26 */ { 1, 20, 67, 94, 59, 14, 1 }, // 256 256.002270(diff = 0.002270) + /* 27 */ { 1, 19, 67, 94, 59, 15, 1 }, // 256 256.006163(diff = 0.006163) + /* 28 */ { 1, 18, 66, 95, 60, 15, 1 }, // 256 256.005944(diff = 0.005944) + /* 29 */ { 1, 18, 65, 95, 61, 15, 1 }, // 256 256.005740(diff = 0.005740) + /* 30 */ { 1, 17, 64, 95, 62, 16, 1 }, // 256 256.005555(diff = 0.005555) + /* 31 */ { 1, 17, 63, 95, 63, 16, 1 }, // 256 256.005391(diff = 0.005391) + /* 32 */ { 1, 16, 63, 95, 63, 17, 1 }, // 256 256.005391(diff = 0.005391) + /* 33 */ { 1, 16, 62, 95, 64, 17, 1 }, // 256 256.005555(diff = 0.005555) + /* 34 */ { 1, 15, 61, 95, 65, 18, 1 }, // 256 256.005740(diff = 0.005740) + /* 35 */ { 1, 15, 60, 95, 66, 18, 1 }, // 256 256.005944(diff = 0.005944) + /* 36 */ { 1, 15, 59, 94, 67, 19, 1 }, // 256 256.006163(diff = 0.006163) + /* 37 */ { 1, 14, 59, 94, 67, 20, 1 }, // 256 256.002270(diff = 0.002270) + /* 38 */ { 1, 14, 58, 94, 68, 20, 1 }, // 256 256.006624(diff = 0.006624) + /* 39 */ { 1, 13, 56, 94, 69, 21, 2 }, // 256 254.310181(diff = 1.689819) + /* 40 */ { 1, 13, 56, 94, 69, 21, 2 }, // 256 254.698920(diff = 1.301080) + /* 41 */ { 0, 12, 55, 94, 71, 22, 2 }, // 256 256.007255(diff = 0.007255) + /* 42 */ { 0, 12, 54, 94, 72, 22, 2 }, // 256 256.376453(diff = 0.376453) + /* 43 */ { 0, 12, 54, 93, 72, 23, 2 }, // 256 256.007514(diff = 0.007514) + /* 44 */ { 0, 11, 53, 93, 73, 24, 2 }, // 256 256.007555(diff = 0.007555) + /* 45 */ { 0, 11, 52, 93, 74, 24, 2 }, // 256 256.007518(diff = 0.007518) + /* 46 */ { 0, 10, 51, 93, 75, 25, 2 }, // 256 256.380094(diff = 0.380094) + /* 47 */ { 0, 10, 50, 93, 75, 26, 2 }, // 256 256.322217(diff = 0.322217) + /* 48 */ { 0, 10, 49, 92, 76, 26, 3 }, // 256 256.006751(diff = 0.006751) + /* 49 */ { 0, 9, 49, 92, 76, 27, 3 }, // 256 255.832851(diff = 0.167149) + /* 50 */ { 0, 9, 48, 92, 77, 27, 3 }, // 256 256.005492(diff = 0.005492) + /* 51 */ { 0, 9, 47, 91, 78, 28, 3 }, // 256 256.004569(diff = 0.004569) + /* 52 */ { 0, 8, 46, 91, 79, 29, 3 }, // 256 256.003417(diff = 0.003417) + /* 53 */ { 0, 8, 45, 91, 79, 30, 3 }, // 256 256.512678(diff = 0.512678) + /* 54 */ { 0, 8, 45, 90, 80, 30, 3 }, // 256 256.000315(diff = 0.000315) + /* 55 */ { 0, 7, 44, 90, 80, 31, 4 }, // 256 255.642895(diff = 0.357105) + /* 56 */ { 0, 7, 43, 89, 81, 32, 4 }, // 256 255.995950(diff = 0.004050) + /* 57 */ { 0, 7, 42, 89, 82, 32, 4 }, // 256 255.993212(diff = 0.006788) + /* 58 */ { 0, 7, 41, 88, 83, 33, 4 }, // 256 256.007876(diff = 0.007876) + /* 59 */ { 0, 6, 41, 88, 83, 34, 4 }, // 256 255.986452(diff = 0.013548) + /* 60 */ { 0, 6, 40, 87, 84, 34, 5 }, // 256 255.982355(diff = 0.017645) + /* 61 */ { 0, 6, 39, 87, 84, 35, 5 }, // 256 255.977727(diff = 0.022273) + /* 62 */ { 0, 6, 38, 86, 85, 36, 5 }, // 256 255.972526(diff = 0.027474) + /* 63 */ { 0, 5, 37, 86, 86, 37, 5 }, // 256 256.314778(diff = 0.314778) +}; + +// TODO: ADPCM_UpdateOutput() function here(for power and ADPCM state reset stuuuuffff). timestamp_ex(timestamp << 16) as a parameter? + +static INLINE void ADPCM_PB_Run(int32 basetime, int32 run_time) +{ + ADPCM.bigdiv -= run_time * 65536; + + while(ADPCM.bigdiv <= 0) + { + //const uint32 synthtime = ((basetime + (ADPCM.bigdiv >> 16))) / (3 * OC_Multiplier); + const uint64 synthtime_ex = ((((uint64)basetime << 16) + ADPCM.bigdiv) / 3) >> 2; + const int synthtime = synthtime_ex >> 16; + const int synthtime_phase_int = (synthtime_ex & 0xFFFF) >> 10; + //const int synthtime_phase = (int)(synthtime_ex & 0xFFFF) - 0x80; + //const int synthtime_phase_int = synthtime_phase >> 10; //(16 - 6); + //const int synthtime_phase_fract = synthtime_phase & 1023; //((1U << (16 - 6)) - 1); + + ADPCM.bigdiv += ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); + + if(ADPCM.Playing && !ADPCM.PlayNibble) // Do playback sample buffer fetch. + { + ADPCM.HalfReached = (ADPCM.LengthCount < 32768); + if(!ADPCM.LengthCount && !(ADPCM.LastCmd & 0x10)) + { + if(ADPCM.EndReached) + ADPCM.HalfReached = false; + + ADPCM.EndReached = true; + + if(ADPCM.LastCmd & 0x40) + ADPCM.Playing = false; + } + + ADPCM.PlayBuffer = ADPCM.RAM[ADPCM.ReadAddr]; + ADPCM.ReadAddr = (ADPCM.ReadAddr + 1) & 0xFFFF; + + if(ADPCM.LengthCount && !(ADPCM.LastCmd & 0x10)) + ADPCM.LengthCount--; + } + +#if 0 + { + static unsigned counter = 0; + static int16 wv = 0x6000; + + if(!counter) + { + wv = -wv; + counter = 1; + } + else + counter--; + + int32 delta = wv - ADPCM.last_pcm; + for(unsigned c = 0; c < ADPCM_Filter_NumConvolutions; c++) + { + int32 coeff; + + coeff = ADPCM_Filter[synthtime_phase_int][c]; + HRBufs[0][synthtime + c] += (delta * coeff); + HRBufs[1][synthtime + c] += (delta * coeff); + } + ADPCM.last_pcm = wv; + } +#else + if(ADPCM.Playing) + { + int32 pcm; + uint8 nibble; + + nibble = (ADPCM.PlayBuffer >> (ADPCM.PlayNibble ^ 4)) & 0x0F; + + if(ADPCMExtraPrecision) + pcm = MSM5205.Decode(nibble) - 2048; + else + pcm = (MSM5205.Decode(nibble) &~3) - 2048; // Chop lower 2 bits off 12-bit result, MSM5205 internal DAC is only 10 bits. + + ADPCM.PlayNibble ^= 4; + + pcm = (pcm * ADPCMTotalVolume) >> 12; + + // + // + // + if(ADPCMBuf) + { + int32 delta = pcm - ADPCM.last_pcm; + const uint8* sf = ADPCM_Filter[synthtime_phase_int]; + int32* tb = &ADPCMBuf[synthtime & 0xFFFF]; + + for(unsigned c = 0; c < ADPCM_Filter_NumConvolutions; c++) + { + tb[c] += (delta * sf[c]); + } + ADPCM.last_pcm = pcm; + } + } +#endif + } +} + +#if 0 +static const struct +{ + double gain; + double yv0_coeff; + double yv1_coeff; + double yv2_coeff; +} ADPCMLP_FilterParams[16] = +{ + /* CF: 1002.734 */ { 2.300517993e+07, 0.9929843194, -2.9859439639, 2.9929596010 }, + /* CF: 1069.583 */ { 1.896012966e+07, 0.9925183607, -2.9850086552, 2.9924902417 }, + /* CF: 1145.982 */ { 1.541941409e+07, 0.9919861033, -2.9839399984, 2.9919538303 }, + /* CF: 1234.134 */ { 1.234948104e+07, 0.9913723196, -2.9827072999, 2.9913348993 }, + /* CF: 1336.979 */ { 9.716697944e+06, 0.9906567117, -2.9812696212, 2.9906128066 }, + /* CF: 1458.522 */ { 7.487534140e+06, 0.9898116667, -2.9795712330, 2.9897594328 }, + /* CF: 1604.375 */ { 5.628367975e+06, 0.9887985545, -2.9775341077, 2.9887353756 }, + /* CF: 1782.638 */ { 4.105654952e+06, 0.9875617266, -2.9750457348, 2.9874837647 }, + /* CF: 2005.468 */ { 2.885788193e+06, 0.9860178585, -2.9719374507, 2.9859192457 }, + /* CF: 2291.964 */ { 1.935196585e+06, 0.9840364292, -2.9679446716, 2.9839077257 }, + /* CF: 2673.958 */ { 1.220301436e+06, 0.9814007204, -2.9626272564, 2.9812257166 }, + /* CF: 3208.750 */ { 7.075197786e+05, 0.9777225813, -2.9551949245, 2.9774709298 }, + /* CF: 4010.937 */ { 3.632718552e+05, 0.9722312105, -2.9440727965, 2.9718388333 }, + /* CF: 5347.916 */ { 1.539763246e+05, 0.9631473739, -2.9256061287, 2.9624522603 }, + /* CF: 8021.875 */ { 4.605288317e+04, 0.9452335200, -2.8889356853, 2.9436804511 }, + /* CF: 16043.75 */ { 5.921030260e+03, 0.8934664072, -2.7810185247, 2.8873832279 }, +}; +#endif + +void PCECD_ProcessADPCMBuffer(const uint32 rsc) +{ +#if 0 + if(ADPCMFancyLP) + { + static double yv[4] = { 0 }; + double gain_recip = 1024.0 / ADPCMLP_FilterParams[ADPCM.SampleFreq].gain; + double yv_coeff[3] = { ADPCMLP_FilterParams[ADPCM.SampleFreq].yv0_coeff, + ADPCMLP_FilterParams[ADPCM.SampleFreq].yv1_coeff, + ADPCMLP_FilterParams[ADPCM.SampleFreq].yv2_coeff }; + //printf("%.10f %.10f %.10f\n", yv_coeff[0], yv_coeff[1], yv_coeff[2]); + + for(uint32 i = 0; i < rsc; i++) + { + ADPCM.integrate_accum += ADPCMBuf[i]; + + yv[0] = yv[1]; + yv[1] = yv[2]; + yv[2] = yv[3]; + yv[3] = (double)ADPCM.integrate_accum + (yv_coeff[0] * yv[0]) + (yv_coeff[1] * yv[1]) + (yv_coeff[2] * yv[2]); + + ADPCM.lp1p_fstate += ((int64)(yv[3] * gain_recip) - ADPCM.lp1p_fstate) >> 2; + + ADPCMBuf[i] = ADPCM.lp1p_fstate >> 10; + //if(i < 10) + // printf("%d, %f\n", i, yv[3] * gain_recip); + } + } + else +#endif + { + for(uint32 i = 0; i < rsc; i++) + { + ADPCM.integrate_accum += ADPCMBuf[i]; + + ADPCM.lp2p_fstate[0] = ADPCM.lp2p_fstate[1]; + ADPCM.lp2p_fstate[1] = ADPCM.lp2p_fstate[2]; + ADPCM.lp2p_fstate[2] = (ADPCM.integrate_accum + (((int64)-62671 * ADPCM.lp2p_fstate[0]) >> 16) + (((int64)128143 * ADPCM.lp2p_fstate[1]) >> 16)); + + ADPCM.lp1p_fstate += (ADPCM.lp2p_fstate[2] - ADPCM.lp1p_fstate) >> 2; + + ADPCMBuf[i] = ADPCM.lp1p_fstate >> 10; + //printf("%lld\n", yv[2] >> 10); + } + } +} + +static INLINE void ADPCM_Run(const int32 clocks, const int32 timestamp) +{ + //printf("ADPCM Run: %d\n", clocks); + ADPCM_PB_Run(timestamp, clocks); + + if(ADPCM.WritePending) + { + ADPCM.WritePending -= clocks; + if(ADPCM.WritePending <= 0) + { + ADPCM.HalfReached = (ADPCM.LengthCount < 32768); + if(!(ADPCM.LastCmd & 0x10) && ADPCM.LengthCount < 0xFFFF) + ADPCM.LengthCount++; + + ADPCM.RAM[ADPCM.WriteAddr++] = ADPCM.WritePendingValue; + ADPCM.WritePending = 0; + } + } + + if(!ADPCM.WritePending) + { + if(_Port[0xb] & 0x3) + { + // Run SCSICD before we examine the signals. + scsicd_ne = SCSICD_Run(timestamp); + + if(!SCSICD_GetCD() && SCSICD_GetIO() && SCSICD_GetREQ() && !SCSICD_GetACK()) + { + ADPCM.WritePendingValue = read_1808(timestamp, false); //read_1801(); + ADPCM.WritePending = 10 * 3; + } + } + } + + if(ADPCM.ReadPending) + { + ADPCM.ReadPending -= clocks; + if(ADPCM.ReadPending <= 0) + { + ADPCM.ReadBuffer = ADPCM.RAM[ADPCM.ReadAddr]; + ADPCM.ReadAddr = (ADPCM.ReadAddr + 1) & 0xFFFF; + ADPCM.ReadPending = 0; + + ADPCM.HalfReached = (ADPCM.LengthCount < 32768); + if(!(ADPCM.LastCmd & 0x10)) + { + if(ADPCM.LengthCount) + ADPCM.LengthCount--; + else + { + ADPCM.EndReached = true; + ADPCM.HalfReached = false; + + if(ADPCM.LastCmd & 0x40) + ADPCM.Playing = false; + } + } + } + } + + UpdateADPCMIRQState(); +} + + +// The return value of this function is ignored in PCECD_Read() and PCECD_Write() for speed reasons, and the +// fact that reading and writing can change the next potential event, +int32 PCECD_Run(uint32 in_timestamp) +{ + int32 clocks = in_timestamp - lastts; + int32 running_ts = lastts; + + //printf("Run Begin: Clocks=%d(%d - %d), cl=%d\n", clocks, in_timestamp, lastts, CalcNextEvent); + //fflush(stdout); + + while(clocks > 0) + { + int32 chunk_clocks = CalcNextEvent(clocks); + + running_ts += chunk_clocks; + + if(ClearACKDelay > 0) + { + ClearACKDelay -= chunk_clocks; + if(ClearACKDelay <= 0) + { + ACKStatus = FALSE; + SCSICD_SetACK(FALSE); + SCSICD_Run(running_ts); + if(SCSICD_GetCD()) + { + _Port[0xb] &= ~1; + #ifdef PCECD_DEBUG + puts("DMA End"); + #endif + } + } + } + + Fader_Run(chunk_clocks); + + ADPCM_Run(chunk_clocks, running_ts); + scsicd_ne = SCSICD_Run(running_ts); + + clocks -= chunk_clocks; + } + + lastts = in_timestamp; + + //puts("Run End"); + //fflush(stdout); + + return(CalcNextEvent(0x7FFFFFFF)); +} + +void PCECD_ResetTS(uint32 ts_base) +{ + SCSICD_ResetTS(ts_base); + lastts = ts_base; +} + +static void ADPCM_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + uint32 ad_sample = MSM5205.GetSample(); + int32 ad_ref_index = MSM5205.GetSSI(); + + SFORMAT StateRegs[] = + { + SFARRAY(ADPCM.RAM, 0x10000), + + SFVAR(ADPCM.bigdiv), + SFVAR(ADPCM.Addr), + SFVAR(ADPCM.ReadAddr), + SFVAR(ADPCM.WriteAddr), + SFVAR(ADPCM.LengthCount), + SFVAR(ADPCM.LastCmd), + SFVAR(ADPCM.SampleFreq), + + SFVAR(ADPCM.ReadPending), + SFVAR(ADPCM.ReadBuffer), + SFVAR(ADPCM.PlayBuffer), + + SFVAR(ADPCM.WritePending), + SFVAR(ADPCM.WritePendingValue), + + SFVAR(ADPCM.HalfReached), + SFVAR(ADPCM.EndReached), + SFVAR(ADPCM.Playing), + + SFVAR(ADPCM.PlayNibble), + + SFVAR(ad_sample), + SFVAR(ad_ref_index), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "APCM"); + + if(load) + { + MSM5205.SetSample(ad_sample); + MSM5205.SetSSI(ad_ref_index); + } +} + +void PCECD_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(bBRAMEnabled), + SFVAR(ACKStatus), + SFVAR(ClearACKDelay), + SFARRAY16(RawPCMVolumeCache, 2), + SFARRAY(_Port, sizeof(_Port)), + + SFVAR(Fader.Command), + SFVAR(Fader.Volume), + SFVAR(Fader.CycleCounter), + SFVAR(Fader.CountValue), + SFVAR(Fader.Clocked), + + SFARRAY(&SubChannelFIFO.data[0], SubChannelFIFO.data.size()), + SFVAR(SubChannelFIFO.read_pos), + SFVAR(SubChannelFIFO.write_pos), + SFVAR(SubChannelFIFO.in_count), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "PECD"); + SCSICD_StateAction(sm, load, data_only, "CDRM"); + ADPCM_StateAction(sm, load, data_only); + + if(load) + { + Fader_SyncWhich(); + //SCSICD_SetDB(_Port[1]); + SCSICD_SetACK(ACKStatus); + SCSICD_SetRST(_Port[4] & 0x2); + + SubChannelFIFO.read_pos %= SubChannelFIFO.size; + SubChannelFIFO.write_pos %= SubChannelFIFO.size; + } +} diff --git a/Mednafen/mednafen/pce/pcecd.h b/Mednafen/mednafen/pce/pcecd.h new file mode 100644 index 0000000000..6a076be37c --- /dev/null +++ b/Mednafen/mednafen/pce/pcecd.h @@ -0,0 +1,61 @@ +#ifndef __MDFN_PCE_PCECD_H +#define __MDFN_PCE_PCECD_H + +typedef struct +{ + double CDDA_Volume; + double ADPCM_Volume; + bool ADPCM_ExtraPrecision; +} PCECD_Settings; + + +enum +{ + CD_GSREG_BSY = 0, + CD_GSREG_REQ, // RO + CD_GSREG_MSG, // RO + CD_GSREG_CD, // RO + CD_GSREG_IO, // RO + CD_GSREG_SEL, + + CD_GSREG_ADPCM_CONTROL, + CD_GSREG_ADPCM_FREQ, + CD_GSREG_ADPCM_CUR, + CD_GSREG_ADPCM_WRADDR, + CD_GSREG_ADPCM_RDADDR, + CD_GSREG_ADPCM_LENGTH, + CD_GSREG_ADPCM_PLAYNIBBLE, + + CD_GSREG_ADPCM_PLAYING, + CD_GSREG_ADPCM_HALFREACHED, + CD_GSREG_ADPCM_ENDREACHED, +}; + +uint32 PCECD_GetRegister(const unsigned int id, char *special, const uint32 special_len); +void PCECD_SetRegister(const unsigned int id, const uint32 value); + + +int32 PCECD_Run(uint32 in_timestamp); +void PCECD_ResetTS(uint32 ts_base = 0); +void PCECD_ProcessADPCMBuffer(const uint32 rsc); + +void PCECD_Init(const PCECD_Settings *settings, void (*irqcb)(bool), double master_clock, int32* adbuf, int32* hrbuf_l, int32* hrbuf_r); +bool PCECD_SetSettings(const PCECD_Settings *settings); + +void PCECD_Close(); + +// Returns number of cycles until next CD event. +int32 PCECD_Power(uint32 timestamp); + +uint8 PCECD_Read(uint32 timestamp, uint32, int32 &next_event, const bool PeekMode = false); +int32 PCECD_Write(uint32 timestamp, uint32, uint8 data) MDFN_WARN_UNUSED_RESULT; + +bool PCECD_IsBRAMEnabled(); + +void PCECD_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +void ADPCM_PeekRAM(uint32 Address, uint32 Length, uint8 *Buffer); +void ADPCM_PokeRAM(uint32 Address, uint32 Length, const uint8 *Buffer); + +#endif + diff --git a/Mednafen/mednafen/pce/tsushin.cpp b/Mednafen/mednafen/pce/tsushin.cpp new file mode 100644 index 0000000000..c86702d4bf --- /dev/null +++ b/Mednafen/mednafen/pce/tsushin.cpp @@ -0,0 +1,53 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "pce.h" + +namespace MDFN_IEN_PCE +{ + +/* + Startup: + 0x80 -> $1830 + 0x40 -> $1823 + 0x50 -> $1823 + 0x02 -> $1821 + 0x40 -> $1823 + + Read from $1822 16 times, expecting (return value & 0xC0) == 0x80 each time + + 0x50 -> $1823 + 0x01 -> $1821 + 0x40 -> $1823 + 0x04 -> $1822 + +*/ + +DECLFR(PCE_TsushinRead) +{ + //printf("Read: %04x, %04x\n", A, HuCPU.PC); + + return(0x80); +} + +DECLFW(PCE_TsushinWrite) +{ + //printf("Write: %04x %02x, %04x\n", A, V, HuCPU.PC); +} + +}; diff --git a/Mednafen/mednafen/pce/tsushin.h b/Mednafen/mednafen/pce/tsushin.h new file mode 100644 index 0000000000..6a0eb421b9 --- /dev/null +++ b/Mednafen/mednafen/pce/tsushin.h @@ -0,0 +1,12 @@ +#ifndef __PCE_TSUSHIN_H +#define __PCE_TSUSHIN_H + +namespace MDFN_IEN_PCE +{ + +DECLFR(PCE_TsushinRead); +DECLFW(PCE_TsushinWrite); + +}; + +#endif diff --git a/Mednafen/mednafen/pce/vce.cpp b/Mednafen/mednafen/pce/vce.cpp new file mode 100644 index 0000000000..354bed72dd --- /dev/null +++ b/Mednafen/mednafen/pce/vce.cpp @@ -0,0 +1,779 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* VCE and VPC emulation */ + +/* +<_Ki> So here is what I found today: the /Hblank signal is not affected (at all) by VCE's dot clock selection. + It seems to be completely fixed; /HBlank-L-period = 237 x master clock cycles, and /HBlank-H-period = 1128, and + that makes h-period = 1365 x master clock cycles as a whole. +*/ + +#include "pce.h" +#include "huc.h" +#include +#include +#include "vce.h" +#include +#include "debug.h" +#include "pcecd.h" +#include + +namespace MDFN_IEN_PCE +{ + +#define SUPERDUPERMODE 0 + +static const int vce_ratios[4] = { 4, 3, 2, 2 }; + +static void IRQChange_Hook(bool newstatus) +{ + extern VCE *vce; //HORRIBLE + vce->IRQChangeCheck(); +} + +bool VCE::WS_Hook(int32 vdc_cycles) +{ + bool ret = true; + int32 to_steal; + + if(vdc_cycles == -1) // Special event-based wait-stating + to_steal = CalcNextEvent(); + else + to_steal = ((vdc_cycles * dot_clock_ratio - clock_divider) + 2) / 3; + + if(to_steal <= 0) // This should never happen. But in case it does... + { + printf("Bad steal: %d; Wanted VDC: %d; Dot clock ratio: %d; Clock divider: %d\n", to_steal, vdc_cycles, dot_clock_ratio, clock_divider); + to_steal = 1; + } + + if((to_steal + ws_counter) > 455 * 64) + { + printf("WS Over: Wanted: %d, could: %d\n", to_steal, 455 * 64 - ws_counter); + to_steal = 455 * 64 - ws_counter; + + if(to_steal < 0) + to_steal = 0; + + ret = FALSE; + } + + if(to_steal > 0) + { + HuCPU->StealCycles(to_steal); + ws_counter += to_steal; + } + + return(ret); +} + +static bool WS_Hook(int32 vdc_cycles) +{ + extern VCE *vce; + + return(vce->WS_Hook(vdc_cycles)); +} + +void VCE::IRQChangeCheck(void) +{ + bool irqtmp = 0; + + for(int chip = 0; chip < chip_count; chip++) + irqtmp |= vdc[chip]->PeekIRQ(); + + if(irqtmp) + HuCPU->IRQBegin(HuC6280::IQIRQ1); + else + HuCPU->IRQEnd(HuC6280::IQIRQ1); +} + +void VCE::SetShowHorizOS(bool show) +{ + ShowHorizOS = show; +} + + +VCE::VCE(bool want_sgfx, bool nospritelimit) +{ + ShowHorizOS = false; + + sgfx = want_sgfx; + chip_count = sgfx ? 2 : 1; + + cd_event = 1; + + fb = NULL; + pitch32 = 0; + + vdc[0] = vdc[1] = NULL; + for(int chip = 0; chip < chip_count; chip++) + { + vdc[chip] = new VDC(nospritelimit, MDFN_GetSettingUI("pce.vramsize")); + vdc[chip]->SetIRQHook(IRQChange_Hook); + vdc[chip]->SetWSHook(MDFN_IEN_PCE::WS_Hook); + } + + memset(systemColorMap32, 0, sizeof(systemColorMap32)); + + #ifdef WANT_DEBUGGER + GfxDecode_Buf = NULL; + GfxDecode_Line = -1; + GfxDecode_Layer = 0; + GfxDecode_Scroll = 0; + GfxDecode_Pbn = 0; + #endif + + + SetShowHorizOS(false); +} + +VCE::~VCE() +{ + for(int chip = 0; chip < chip_count; chip++) + delete vdc[chip]; +} + +void VCE::Reset(const int32 timestamp) +{ + last_ts = 0; + + pixel_offset = 0; + dot_clock = 0; + dot_clock_ratio = vce_ratios[dot_clock]; + clock_divider = 0; + + ws_counter = 0; + scanline = 0; + scanline_out_ptr = NULL; + CR = 0; + lc263 = 0; + bw = 0; + + memset(color_table, 0, sizeof(color_table)); + memset(color_table_cache, 0, sizeof(color_table_cache)); + + ctaddress = 0; + + hblank = 1; + vblank = 1; + + NeedSLReset = false; + + hblank_counter = 237; + vblank_counter = 4095 + 30; + + for(int chip = 0; chip < chip_count; chip++) + child_event[chip] = vdc[chip]->Reset(); + + // SuperGrafx VPC init + priority[0] = 0x11; + priority[1] = 0x11; + winwidths[0] = 0; + winwidths[1] = 0; + st_mode = 0; + window_counter[0] = 0x40; + window_counter[1] = 0x40; + + if(fb) + scanline_out_ptr = &fb[scanline * pitch32]; +} + +static int32 *LW; + +static bool skipframe; + +/* + Note: If we're skipping the frame, don't write to the data behind the pXBuf, DisplayRect, and LineWidths + pointers at all. There's no need to, and HES playback depends on these structures being left alone; if they're not, + there will be graphics distortion, and maybe memory corruption. +*/ + +void VCE::StartFrame(MDFN_Surface *surface, MDFN_Rect *DisplayRect, int32 *LineWidths, int skip) +{ + uint32 *pXBuf = surface->pixels; + + FrameDone = false; + + //printf("Clock divider: %d\n", clock_divider); + + color_table_cache[0x200] = color_table_cache[0x300] = surface->format.MakeColor(0x00, 0xFE, 0x00); + + if(!skip) + { + DisplayRect->x = 0; + DisplayRect->w = 1365; + DisplayRect->y = 0 + 14; + DisplayRect->h = 240; //263 - 14; + + DisplayRect->y = 14 + MDFN_GetSettingUI("pce.slstart"); + DisplayRect->h = MDFN_GetSettingUI("pce.slend") - MDFN_GetSettingUI("pce.slstart") + 1; + + for(int y = 0; y < 263; y++) + LineWidths[y] = 0; + + pitch32 = surface->pitch32; + fb = pXBuf; + LW = LineWidths; + scanline_out_ptr = &fb[scanline * pitch32]; + } + else + { + pitch32 = 0; + fb = NULL; + LW = NULL; + scanline_out_ptr = NULL; + } + + skipframe = skip; +} + +bool VCE::RunPartial(void) +{ + HuCPU->SetEventHandler(this); + + if(!PCE_IsCD) + cd_event = 0x3FFFFFFF; + + ws_counter = 0; + HuCPU->Run(); + + if(!skipframe) + { + // Worst-case fallback + int32 LW_Fix = 256; + + for(int y = 0; y < 263; y++) + { + if(LW[y]) + { + LW_Fix = LW[y]; + break; + } + } + + for(int y = 0; y < 263; y++) + { + if(!LW[y]) + LW[y] = LW_Fix; + } + } + + Update(HuCPU->Timestamp()); + + return(FrameDone); +} + +void VCE::Update(const int32 timestamp) +{ + if(PCE_IsCD) + SetCDEvent(PCECD_Run(timestamp)); + + HuCPU->SetEvent(Sync(timestamp)); +} + +// If we ignore the return value of Sync(), we must do "HuCPU->SetEvent(CalcNextEvent());" +// before the function(read/write functions) that called Sync() return! +int32 VCE::Sync(const int32 timestamp) +{ + int32 clocks = timestamp - last_ts; + + cd_event -= clocks; + if(cd_event <= 0) + cd_event = PCECD_Run(timestamp); + + + if(sgfx) + { + #define VCE_SGFX_MODE 1 + #include "vce_sync.inc" + #undef VCE_SGFX_MODE + } + else + { + #include "vce_sync.inc" + } + + int32 ret = CalcNextEvent(); + + last_ts = timestamp; + + return(ret); +} + +void VCE::FixPCache(int entry) +{ + const uint32 *cm32 = systemColorMap32[bw]; + + if(!(entry & 0xFF)) + { + for(int x = 0; x < 16; x++) + color_table_cache[(entry & 0x100) + (x << 4)] = cm32[color_table[entry & 0x100]]; + } + if(!(entry & 0xF)) + return; + + color_table_cache[entry] = cm32[color_table[entry]]; +} + +void VCE::SetVCECR(uint8 V) +{ + if(((V & 0x80) >> 7) != bw) + { + bw = V & 0x80; + for(int x = 0; x < 512; x++) + FixPCache(x); + } + + lc263 = (V & 0x04); + + #if 0 + int new_dot_clock = V & 1; + if(V & 2) + new_dot_clock = 2; + + dot_clock = new_dot_clock; + #endif + + dot_clock = V & 0x3; + if(dot_clock == 3) // Remove this once we determine any relevant differences between 2 and 3. + dot_clock = 2; + + dot_clock_ratio = vce_ratios[dot_clock]; + + CR = V; +} + +void VCE::SetPixelFormat(const MDFN_PixelFormat &format, const uint8* CustomColorMap, const uint32 CustomColorMapLen) +{ + for(int x = 0; x < 512; x++) + { + int r, g, b; + int sc_r, sc_g, sc_b; + + if(CustomColorMap) + { + r = CustomColorMap[x * 3 + 0]; + g = CustomColorMap[x * 3 + 1]; + b = CustomColorMap[x * 3 + 2]; + } + else + { + b = 36 * (x & 0x007); + r = 36 * ((x & 0x038) >> 3); + g = 36 * ((x & 0x1c0) >> 6); + } + + if(CustomColorMap && CustomColorMapLen == 1024) + { + sc_r = CustomColorMap[(512 + x) * 3 + 0]; + sc_g = CustomColorMap[(512 + x) * 3 + 1]; + sc_b = CustomColorMap[(512 + x) * 3 + 2]; + } + else + { + double y; + + y = floor(0.5 + 0.300 * r + 0.589 * g + 0.111 * b); + + if(y < 0) + y = 0; + + if(y > 255) + y = 255; + + sc_r = sc_g = sc_b = y; + } + + systemColorMap32[0][x] = format.MakeColor(r, g, b); + systemColorMap32[1][x] = format.MakeColor(sc_r, sc_g, sc_b); + } + + // I know the temptation is there, but don't combine these two loops just + // because they loop 512 times ;) + for(int x = 0; x < 512; x++) + FixPCache(x); +} + +uint8 VCE::Read(uint32 A) +{ + uint8 ret = 0xFF; + + if(!PCE_InDebug) + Sync(HuCPU->Timestamp()); + + switch(A & 0x7) + { + case 4: ret = color_table[ctaddress & 0x1FF]; + break; + + case 5: ret = color_table[ctaddress & 0x1FF] >> 8; + ret &= 1; + ret |= 0xFE; + if(!PCE_InDebug) + { + ctaddress++; + } + break; + } + + if(!PCE_InDebug) + HuCPU->SetEvent(CalcNextEvent()); + + return(ret); +} + +void VCE::Write(uint32 A, uint8 V) +{ + Sync(HuCPU->Timestamp()); + + //printf("VCE Write(vce scanline=%d, HuCPU.timestamp=%d): %04x %02x\n", scanline, HuCPU.timestamp, A, V); + switch(A&0x7) + { + case 0: + { + int old_dot_clock = dot_clock; + + SetVCECR(V); + + if(old_dot_clock != dot_clock) // FIXME, this is wrong. A total fix will require changing the meaning + // of clock_divider variable. + { + clock_divider = 0; + } + } + break; + + case 2: ctaddress &= 0x100; ctaddress |= V; break; + case 3: ctaddress &= 0x0FF; ctaddress |= (V & 1) << 8; break; + + case 4: color_table[ctaddress & 0x1FF] &= 0x100; + color_table[ctaddress & 0x1FF] |= V; + FixPCache(ctaddress & 0x1FF); + break; + + case 5: color_table[ctaddress & 0x1FF] &= 0xFF; + color_table[ctaddress & 0x1FF] |= (V & 1) << 8; + FixPCache(ctaddress & 0x1FF); + ctaddress++; + break; + } + + HuCPU->SetEvent(CalcNextEvent()); +} + +uint8 VCE::ReadVDC(uint32 A) +{ + uint8 ret; + + if(!PCE_InDebug) + Sync(HuCPU->Timestamp()); + + if(!sgfx) + { + ret = vdc[0]->Read(A, child_event[0], PCE_InDebug); + } + else + { + int chip = 0; + + A &= 0x1F; + + if(A & 0x8) + { + ret = 0; + + switch(A) + { + case 0x8: ret = priority[0]; break; + case 0x9: ret = priority[1]; break; + case 0xA: ret = winwidths[0]; break; + case 0xB: ret = winwidths[0] >> 8; break; + case 0xC: ret = winwidths[1]; break; + case 0xD: ret = winwidths[1] >> 8; break; + case 0xE: ret = 0; break; + } + } + else + { + chip = (A & 0x10) >> 4; + ret = vdc[chip]->Read(A & 0x3, child_event[chip], PCE_InDebug); + } + } + + if(!PCE_InDebug) + HuCPU->SetEvent(CalcNextEvent()); + + return(ret); +} + +void VCE::WriteVDC(uint32 A, uint8 V) +{ + Sync(HuCPU->Timestamp()); + + if(!sgfx) + { + vdc[0]->Write(A & 0x1FFF, V, child_event[0]); + } + else + { + int chip = 0; + + // For ST0/ST1/ST2 + A |= ((A >> 31) & st_mode) << 4; + + A &= 0x1F; + + if(A & 0x8) + { + switch(A) + { + case 0x8: priority[0] = V; break; + case 0x9: priority[1] = V; break; + case 0xA: winwidths[0] &= 0x300; winwidths[0] |= V; break; + case 0xB: winwidths[0] &= 0x0FF; winwidths[0] |= (V & 3) << 8; break; + case 0xC: winwidths[1] &= 0x300; winwidths[1] |= V; break; + case 0xD: winwidths[1] &= 0x0FF; winwidths[1] |= (V & 3) << 8; break; + case 0xE: st_mode = V & 1; break; + } + } + else + { + chip = (A & 0x10) >> 4; + vdc[chip]->Write(A & 0x3, V, child_event[chip]); + } + } + + HuCPU->SetEvent(CalcNextEvent()); +} + +void VCE::WriteVDC_ST(uint32 A, uint8 V) +{ + Sync(HuCPU->Timestamp()); + + if(!sgfx) + { + vdc[0]->Write(A, V, child_event[0]); + } + else + { + int chip = st_mode & 1; + vdc[chip]->Write(A, V, child_event[chip]); + } + + HuCPU->SetEvent(CalcNextEvent()); +} + +void VCE::SetLayerEnableMask(uint64 mask) +{ + for(unsigned chip = 0; chip < (unsigned)chip_count; chip++) + { + vdc[chip]->SetLayerEnableMask((mask >> (chip * 2)) & 0x3); + } +} + +void VCE::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT VCE_StateRegs[] = + { + SFVARN(CR, "VCECR"), + + SFVAR(ws_counter), + + SFVARN(ctaddress, "ctaddress"), + SFARRAY16N(color_table, 0x200, "color_table"), + + SFVARN(clock_divider, "clock_divider"), + SFARRAY32N(child_event, 2, "child_event"), + SFVARN(scanline, "scanline"), + SFVARN(pixel_offset, "pixel_offset"), + SFVARN(hblank_counter, "hblank_counter"), + SFVARN(vblank_counter, "vblank_counter"), + SFVAR(hblank), + SFVAR(vblank), + SFVAR(NeedSLReset), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, VCE_StateRegs, "VCE"); + + if(sgfx) + { + SFORMAT VPC_StateRegs[] = + { + SFARRAYN(priority, 2, "priority"), + SFARRAY16N(winwidths, 2, "winwidths"), + SFVARN(st_mode, "st_mode"), + SFARRAY32N(window_counter, 2, "window_counter"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, VPC_StateRegs, "VPC"); + } + + if(load) + { + // TODO/FIXME: Integrity checks to prevent buffer overflows. + SetVCECR(CR); + for(int x = 0; x < 512; x++) + FixPCache(x); + } + + for(int chip = 0; chip < chip_count; chip++) + vdc[chip]->StateAction(sm, load, data_only, chip ? "VDCB" : "VDC"); +} + + +#ifdef WANT_DEBUGGER + +uint32 VCE::GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case GSREG_CR: + value = CR; + if(special) + { + trio_snprintf(special, special_len, "Clock: %.2fMHz, %d lines/frame, Strip colorburst: %s", + floor(0.5 + PCE_MASTER_CLOCK / 1e4 / vce_ratios[(value & 0x3) &~ ((value & 0x2) >> 1)]) / 100, + (value & 0x04) ? 263 : 262, + (value & 0x80) ? "On" : "Off"); + } + break; + + case GSREG_CTA: + value = ctaddress; + break; + + case GSREG_SCANLINE: + value = scanline; + break; + + // VPC: + case GSREG_ST_MODE: + value = st_mode; + break; + + case GSREG_WINDOW_WIDTH_0: + case GSREG_WINDOW_WIDTH_1: + value = winwidths[id - GSREG_WINDOW_WIDTH_0]; + if(special) + { + trio_snprintf(special, special_len, "Window width: %d%s", value - 0x40, (value <= 0x40) ? "(window disabled)" : ""); + } + break; + + case GSREG_PRIORITY_0: + case GSREG_PRIORITY_1: + value = priority[id - GSREG_PRIORITY_0]; + break; + } + return(value); +} + +void VCE::SetRegister(const unsigned int id, const uint32 value) +{ + switch(id) + { + case GSREG_CR: + SetVCECR(value); + break; + + case GSREG_CTA: + ctaddress = value & 0x1FF; + break; + // VPC: + case GSREG_ST_MODE: + st_mode = (bool)value; + break; + + case GSREG_WINDOW_WIDTH_0: + case GSREG_WINDOW_WIDTH_1: + winwidths[id - GSREG_WINDOW_WIDTH_0] = value & 0x3FF; + break; + + case GSREG_PRIORITY_0: + case GSREG_PRIORITY_1: + priority[id - GSREG_PRIORITY_0] = value; + break; + + } +} + +void VCE::SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn) +{ + GfxDecode_Buf = surface; + GfxDecode_Line = line; + GfxDecode_Layer = which; + GfxDecode_Scroll = yscroll; + GfxDecode_Pbn = pbn; + + if(GfxDecode_Buf && GfxDecode_Line == -1) + DoGfxDecode(); +} + +uint32 VCE::GetRegisterVDC(const unsigned int which_vdc, const unsigned int id, char *special, const uint32 special_len) +{ + assert(which_vdc < (unsigned int)chip_count); + + return(vdc[which_vdc]->GetRegister(id, special, special_len)); +} + +void VCE::SetRegisterVDC(const unsigned int which_vdc, const unsigned int id, const uint32 value) +{ + assert(which_vdc < (unsigned int)chip_count); + + vdc[which_vdc]->SetRegister(id, value); +} + + +uint16 VCE::PeekPRAM(const uint16 Address) +{ + return(color_table[Address & 0x1FF]); +} + +void VCE::PokePRAM(const uint16 Address, const uint16 Data) +{ + color_table[Address & 0x1FF] = Data & 0x1FF; + FixPCache(Address); +} + + +void VCE::DoGfxDecode(void) +{ + const int which_vdc = (GfxDecode_Layer >> 1) & 1; + const bool DecodeSprites = GfxDecode_Layer & 1; + uint32 neo_palette[16]; + + assert(GfxDecode_Buf); + + if(GfxDecode_Pbn == -1) + { + for(int x = 0; x < 16; x++) + neo_palette[x] = GfxDecode_Buf->MakeColor(x * 17, x * 17, x * 17, 0xFF); + } + else + for(int x = 0; x < 16; x++) + neo_palette[x] = color_table_cache[x | (DecodeSprites ? 0x100 : 0x000) | ((GfxDecode_Pbn & 0xF) << 4)] | GfxDecode_Buf->MakeColor(0, 0, 0, 0xFF); + + vdc[which_vdc]->DoGfxDecode(GfxDecode_Buf->pixels, neo_palette, GfxDecode_Buf->MakeColor(0, 0, 0, 0xFF), DecodeSprites, GfxDecode_Buf->w, GfxDecode_Buf->h, GfxDecode_Scroll); +} +#endif + +}; diff --git a/Mednafen/mednafen/pce/vce.h b/Mednafen/mednafen/pce/vce.h new file mode 100644 index 0000000000..9e1b203d6e --- /dev/null +++ b/Mednafen/mednafen/pce/vce.h @@ -0,0 +1,308 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __PCE_VCE_H +#define __PCE_VCE_H + +#include +#include + +namespace MDFN_IEN_PCE +{ + +//class VDC; +//#include "vdc.h" + +class VCE final : public HuC6280_Support +{ + public: + + VCE(bool want_sgfx, bool nospritelimit); + ~VCE(); + + void SetShowHorizOS(bool show); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + void SetPixelFormat(const MDFN_PixelFormat &format, const uint8* CustomColorMap, const uint32 CustomColorMapLen); + + void StartFrame(MDFN_Surface *surface, MDFN_Rect *DisplayRect, int32 *LineWidths, int skip); + bool RunPartial(void); + + void Update(const int32 timestamp); + + INLINE void ResetTS(int ts_base) + { + last_ts = ts_base; + } + + inline int GetScanlineNo(void) + { + return(scanline); + } + + void Reset(const int32 timestamp); + + void Write(uint32 A, uint8 V); + uint8 Read(uint32 A); + + uint8 ReadVDC(uint32 A); + void WriteVDC(uint32 A, uint8 V); + void WriteVDC_ST(uint32 A, uint8 V); + + void SetLayerEnableMask(uint64 mask); + + #ifdef WANT_DEBUGGER + + uint16 PeekPRAM(const uint16 Address); + void PokePRAM(const uint16 Address, const uint16 Data); + + + // Peek(VRAM/SAT) and Poke(VRAM/SAT) work in 16-bit VRAM word units(Address and Length, both). + INLINE uint16 PeekVDCVRAM(unsigned int which, uint16 Address) + { + assert(which < (unsigned int)chip_count); + + return(vdc[which]->PeekVRAM(Address)); + } + + INLINE uint16 PeekVDCSAT(unsigned int which, uint8 Address) + { + assert(which < (unsigned int)chip_count); + + return(vdc[which]->PeekSAT(Address)); + } + + INLINE void PokeVDCVRAM(const unsigned int which, const uint16 Address, const uint16 Data) + { + assert(which < (unsigned int)chip_count); + + vdc[which]->PokeVRAM(Address, Data); + } + + INLINE void PokeVDCSAT(const unsigned int which, const uint8 Address, const uint16 Data) + { + assert(which < (unsigned int)chip_count); + + vdc[which]->PokeSAT(Address, Data); + } + + void SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn); + + enum + { + GSREG_CR = 0, + GSREG_CTA, + GSREG_SCANLINE, + + // VPC: + GSREG_PRIORITY_0, + GSREG_PRIORITY_1, + GSREG_WINDOW_WIDTH_0, + GSREG_WINDOW_WIDTH_1, + GSREG_ST_MODE + }; + + uint32 GetRegister(const unsigned int id, char *special, const uint32 special_len); + void SetRegister(const unsigned int id, const uint32 value); + + + uint32 GetRegisterVDC(const unsigned int which_vdc, const unsigned int id, char *special, const uint32 special_len); + void SetRegisterVDC(const unsigned int which_vdc, const unsigned int id, const uint32 value); + + INLINE void ResetSimulateVDC(void) + { + for(int chip = 0; chip < chip_count; chip++) + vdc[chip]->ResetSimulate(); + } + + INLINE int SimulateReadVDC(uint32 A, VDC_SimulateResult *result) + { + if(!sgfx) + { + vdc[0]->SimulateRead(A, result); + return(0); + } + else + { + int chip = 0; + + A &= 0x1F; + + if(!(A & 0x8)) + { + chip = (A & 0x10) >> 4; + vdc[chip]->SimulateRead(A & 0x3, result); + return(chip); + } + } + + result->ReadCount = result->WriteCount = 0; + return(0); + } + + // If the simulated write is due to a ST0, ST1, or ST2 instruction, set the high bit of the passed address to 1. + INLINE int SimulateWriteVDC(uint32 A, uint8 V, VDC_SimulateResult *result) + { + if(!sgfx) + { + vdc[0]->SimulateWrite(A, V, result); + return(0); + } + else + { + // For ST0/ST1/ST2 + A |= ((A >> 31) & st_mode) << 4; + + A &= 0x1F; + + if(!(A & 0x8)) + { + int chip = (A & 0x10) >> 4; + vdc[chip]->SimulateWrite(A & 0x3, V, result); + return(chip); + } + } + + result->ReadCount = result->WriteCount = 0; + result->ReadStart = result->WriteStart = 0; + return(0); + } + #endif + + void IRQChangeCheck(void); + + bool WS_Hook(int32 vdc_cycles); + + + // So wrong, but feels so...MUSHROOMY. + // THIS IS BROKEN! + // We need to put Sync() call before that, or bias + // cd_event and the value to HuCPU->SetEvent by (HuCPU->timestamp - last_ts) + INLINE void SetCDEvent(const int32 cycles) + { + const int32 time_behind = HuCPU->Timestamp() - last_ts; + + assert(time_behind >= 0); + + cd_event = cycles + time_behind; + HuCPU->SetEvent(CalcNextEvent() - time_behind); + } + + private: + + int32 Sync(const int32 timestamp); + void FixPCache(int entry); + void SetVCECR(uint8 V); + + #ifdef WANT_DEBUGGER + void DoGfxDecode(void); + #endif + + INLINE int32 CalcNextEvent(void) + { + int32 next_event = hblank_counter; + + if(next_event > vblank_counter) + next_event = vblank_counter; + + if(next_event > cd_event) + next_event = cd_event; + + for(int chip = 0; chip < chip_count; chip++) + { + int fwoom = (child_event[chip] * dot_clock_ratio - clock_divider); + + if(fwoom < 1) + fwoom = 1; + + if(next_event > fwoom) + next_event = fwoom; + } + + if(next_event < 1) + next_event = 1; + + return(next_event); + } + + int32 child_event[2]; + + int32 cd_event; + + uint32 *fb; // Pointer to the framebuffer. + uint32 pitch32; // Pitch(in 32-bit pixels) + bool FrameDone; + + int32 clock_divider; + + int32 scanline; + uint32 *scanline_out_ptr; // Pointer into fb + int32 pixel_offset; + + int32 hblank_counter; + int32 vblank_counter; + + bool hblank; // TRUE if in HBLANK, FALSE if not. + bool vblank; // TRUE if in vblank, FALSE if not + + bool NeedSLReset; + + + uint8 CR; // Control Register + bool lc263; // CR->263 line count if set, 262 if not + bool bw; // CR->Black and White + uint8 dot_clock; // CR->Dot Clock(5, 7, or 10 MHz = 0, 1, 2/3) + int32 dot_clock_ratio; // CR->Dot Clock ratio cache + + int32 ws_counter; + + uint16 color_table[0x200]; + uint32 color_table_cache[0x200 * 2]; // * 2 for user layer disabling stuff. + uint16 ctaddress; + + uint32 systemColorMap32[2][512]; + + int32 last_ts; + + VDC *vdc[2]; + + // SuperGrafx stuff: + bool sgfx; + int chip_count; // = 1 when sgfx is FALSE, = 2 when sgfx is TRUE + uint8 priority[2]; + uint16 winwidths[2]; + uint8 st_mode; + int32 window_counter[2]; + + uint16 pixel_buffer[2][2048]; // Internal temporary pixel buffers, used in vce_sync.inc. + + #ifdef WANT_DEBUGGER + MDFN_Surface *GfxDecode_Buf;// = NULL; + int GfxDecode_Line;// = -1; + int GfxDecode_Layer;// = 0; + int GfxDecode_Scroll;// = 0; + int GfxDecode_Pbn;// = 0; + #endif + + bool ShowHorizOS; +}; + + +}; + +#endif diff --git a/Mednafen/mednafen/pce/vce_sync.inc b/Mednafen/mednafen/pce/vce_sync.inc new file mode 100644 index 0000000000..da5a171a81 --- /dev/null +++ b/Mednafen/mednafen/pce/vce_sync.inc @@ -0,0 +1,241 @@ + while(clocks > 0) + { + int32 div_clocks; + int32 chunk_clocks = clocks; + + if(chunk_clocks > hblank_counter) + chunk_clocks = hblank_counter; + + if(chunk_clocks > vblank_counter) + chunk_clocks = vblank_counter; + + #ifdef VCE_SGFX_MODE + for(int chip = 0; chip < 2; chip++) + { + #else + { + const int chip = 0; + #endif + int fwoom = (child_event[chip] * dot_clock_ratio - clock_divider); + + assert(fwoom >= 1); + + if(chunk_clocks > fwoom) + chunk_clocks = fwoom; + } + + clock_divider += chunk_clocks; + div_clocks = clock_divider / dot_clock_ratio; + clock_divider -= div_clocks * dot_clock_ratio; + + child_event[0] -= div_clocks; + #ifdef VCE_SGFX_MODE + child_event[1] -= div_clocks; + #endif + + if(div_clocks > 0) + { + child_event[0] = vdc[0]->Run(div_clocks, pixel_buffer[0], skipframe); + #ifdef VCE_SGFX_MODE + child_event[1] = vdc[1]->Run(div_clocks, pixel_buffer[1], skipframe); + #endif + + if(!skipframe) + { + #ifdef VCE_SGFX_MODE + { + for(int32 i = 0; MDFN_LIKELY(i < div_clocks); i++) // * vce_ratios[dot_clock]; i++) + { + static const int prio_select[4] = { 1, 1, 0, 0 }; + static const int prio_shift[4] = { 4, 0, 4, 0 }; + uint32 pix; + int in_window = 0; + + if(window_counter[0] > 0x40) + { + in_window |= 1; + window_counter[0]--; + } + + if(window_counter[1] > 0x40) + { + in_window |= 2; + window_counter[1]--; + } + + uint8 pb = (priority[prio_select[in_window]] >> prio_shift[in_window]) & 0xF; + uint32 vdc2_pixel, vdc1_pixel; + + vdc2_pixel = vdc1_pixel = 0; + + if(pb & 1) + vdc1_pixel = pixel_buffer[0][i]; + if(pb & 2) + vdc2_pixel = pixel_buffer[1][i]; + + /* Dai MakaiMura uses setting 1, and expects VDC #2 sprites in front of VDC #1 background, but + behind VDC #1's sprites. + */ + switch(pb >> 2) + { + case 1: + if((vdc2_pixel & 0x100) && !(vdc1_pixel & 0x100) && (vdc2_pixel & 0xF)) + vdc1_pixel = 0; //amask; + break; + case 2: + if((vdc1_pixel & 0x100) && !(vdc2_pixel & 0x100) && (vdc2_pixel & 0xF)) + vdc1_pixel = 0; //|= amask; + break; + } + pix = color_table_cache[((vdc1_pixel & 0xF) ? vdc1_pixel : vdc2_pixel) & 0x1FF]; + + #if SUPERDUPERMODE + for(int32 s_i = 0; s_i < dot_clock_ratio; s_i++) + #endif + { + scanline_out_ptr[pixel_offset & 2047] = pix; + pixel_offset++; + } + } + } + #else + { + #if SUPERDUPERMODE + for(int32 i = 0; MDFN_LIKELY(i < div_clocks); i++) + { + for(int32 si = 0; si < dot_clock_ratio; si++) + { + uint32 pix = color_table_cache[pixel_buffer[0][i] & 0x3FF]; + + scanline_out_ptr[pixel_offset & 2047] = pix; + pixel_offset++; + } + } + #else + for(int32 i = 0; MDFN_LIKELY(i < div_clocks); i++) // * vce_ratios[dot_clock]; i++) + { + uint32 pix = color_table_cache[pixel_buffer[0][i] & 0x3FF]; + scanline_out_ptr[pixel_offset & 2047] = pix; + pixel_offset++; + } + #endif + + } + #endif + } // end if(!skipframe) + } // end if(div_clocks > 0) + + clocks -= chunk_clocks; + hblank_counter -= chunk_clocks; + if(hblank_counter <= 0) + { + hblank ^= 1; + + if(hblank) + { + // Clock gets stretched and "synchronized" at the beginning of the 237-master-cycle hsync period. + //clock_divider = 0; + } + else + { + if(sgfx) + { + int add = 0; + if(dot_clock & 2) + add = 8 + 96; + else + add = 8 + (dot_clock ? 38 : 24); + window_counter[0] = winwidths[0] + add; + window_counter[1] = winwidths[1] + add; + } + + if(NeedSLReset) + scanline = 0; + else + scanline++; + + if(scanline == 14 + 240) + FrameDone = true; + + if((scanline == 14 + 240) || (scanline == 123)) + { + HuCPU->Exit(); + } + +#if 0 // Testing code + HuCPU->Exit(); +#endif + + //printf("VCE New scanline: %d\n", scanline); + + scanline_out_ptr = &fb[scanline * pitch32]; + +#ifdef WANT_DEBUGGER + if(GfxDecode_Buf && GfxDecode_Line == scanline) + DoGfxDecode(); +#endif + + pixel_offset = 0; + NeedSLReset = FALSE; + + if(!skipframe) + { + static const int x_offsets[2][4] = { + { 8 + 24, 8 + 38, 8 + 96, 8 + 96 }, + { 8 + 24 - 12, 8 + 38 - 16, 8 + 96 - 24, 8 + 96 - 24 }, + }; + static const int w_cows[2][4] = { + { 256, 341, 512, 512 }, + { 256 + 24, 341 + 32, 512 + 48, 512 + 48 }, + }; + + int rect_x, rect_w; + + #if SUPERDUPERMODE + { + if(dot_clock >= 2) + rect_x = 208; + else if(dot_clock == 1) + rect_x = 136; + else + rect_x = 128; + rect_w = 1024; + + if(ShowHorizOS) + { + rect_x -= 48; + rect_w += 96; + } + } + #else + { + rect_x = x_offsets[ShowHorizOS][dot_clock]; + rect_w = w_cows[ShowHorizOS][dot_clock]; + } + #endif + + pixel_offset = (0 - rect_x) & 2047; + LW[scanline] = rect_w; + } + } + hblank_counter = hblank ? 237 : 1128; + + for(int chip = 0; chip < chip_count; chip++) + child_event[chip] = vdc[chip]->HSync(hblank); + } + + vblank_counter -= chunk_clocks; + if(vblank_counter <= 0) + { + vblank ^= 1; + vblank_counter = vblank ? 4095 : ((lc263 ? 358995 : 357630) - 4095); + + if(!vblank) + { + NeedSLReset = TRUE; + } + + for(int chip = 0; chip < chip_count; chip++) + child_event[chip] = vdc[chip]->VSync(vblank); + } + } diff --git a/Mednafen/mednafen/pce_fast/Makefile.am b/Mednafen/mednafen/pce_fast/Makefile.am new file mode 100644 index 0000000000..184d511a2b --- /dev/null +++ b/Mednafen/mednafen/pce_fast/Makefile.am @@ -0,0 +1,7 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libpce_fast.a +libpce_fast_a_SOURCES = huc6280.cpp pce.cpp vdc.cpp input.cpp huc.cpp hes.cpp pcecd.cpp pcecd_drive.cpp psg.cpp + diff --git a/Mednafen/mednafen/pce_fast/Makefile.in b/Mednafen/mednafen/pce_fast/Makefile.in new file mode 100644 index 0000000000..6af677366c --- /dev/null +++ b/Mednafen/mednafen/pce_fast/Makefile.in @@ -0,0 +1,686 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/pce_fast +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libpce_fast_a_AR = $(AR) $(ARFLAGS) +libpce_fast_a_LIBADD = +am_libpce_fast_a_OBJECTS = huc6280.$(OBJEXT) pce.$(OBJEXT) \ + vdc.$(OBJEXT) input.$(OBJEXT) huc.$(OBJEXT) hes.$(OBJEXT) \ + pcecd.$(OBJEXT) pcecd_drive.$(OBJEXT) psg.$(OBJEXT) +libpce_fast_a_OBJECTS = $(am_libpce_fast_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libpce_fast_a_SOURCES) +DIST_SOURCES = $(libpce_fast_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libpce_fast.a +libpce_fast_a_SOURCES = huc6280.cpp pce.cpp vdc.cpp input.cpp huc.cpp hes.cpp pcecd.cpp pcecd_drive.cpp psg.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pce_fast/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/pce_fast/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libpce_fast.a: $(libpce_fast_a_OBJECTS) $(libpce_fast_a_DEPENDENCIES) $(EXTRA_libpce_fast_a_DEPENDENCIES) + $(AM_V_at)-rm -f libpce_fast.a + $(AM_V_AR)$(libpce_fast_a_AR) libpce_fast.a $(libpce_fast_a_OBJECTS) $(libpce_fast_a_LIBADD) + $(AM_V_at)$(RANLIB) libpce_fast.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hes.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huc6280.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pce.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcecd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcecd_drive.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vdc.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/pce_fast/hes.cpp b/Mednafen/mednafen/pce_fast/hes.cpp new file mode 100644 index 0000000000..00b062b00b --- /dev/null +++ b/Mednafen/mednafen/pce_fast/hes.cpp @@ -0,0 +1,267 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "hes.h" +#include "huc.h" +#include "pcecd.h" +#include +#include + +namespace PCE_Fast +{ + + +static uint8 mpr_start[8]; +static uint8 IBP_Bank[0x2000]; +static uint8 *rom = NULL, *rom_backup = NULL; + +static uint8 CurrentSong; +static bool bootstrap; +static bool ROMWriteWarningGiven; + +uint8 ReadIBP(unsigned int A) +{ + if(!(A & 0x100)) + return(IBP_Bank[0x1C00 + (A & 0xF)]); + + if(bootstrap) + { + memcpy(rom + 0x1FF0, rom_backup + 0x1FF0, 16); + bootstrap = false; + return(CurrentSong); + } + return(0xFF); +} + +static DECLFW(HESROMWrite) +{ + rom[A] = V; + //printf("%08x: %02x\n", A, V); + if(!ROMWriteWarningGiven) + { + MDFN_printf(_("Warning: HES is writing to physical address %08x. Future warnings of this nature are temporarily disabled for this HES file.\n"), A); + ROMWriteWarningGiven = TRUE; + } +} + +static DECLFR(HESROMRead) +{ + return(rom[A]); +} + +static void Cleanup(void) MDFN_COLD; +static void Cleanup(void) +{ + PCECD_Close(); + + if(rom) + { + MDFN_free(rom); + rom = NULL; + } + + if(rom_backup) + { + MDFN_free(rom_backup); + rom_backup = NULL; + } +} + +void HES_Load(MDFNFILE* fp) +{ + try + { + uint32 LoadAddr, LoadSize; + uint16 InitAddr; + uint8 StartingSong; + int TotalSongs; + uint8 header[0x10]; + uint8 sub_header[0x10]; + + fp->read(header, 0x10); + + if(memcmp(header, "HESM", 4)) + throw MDFN_Error(0, _("HES header magic is invalid.")); + + InitAddr = MDFN_de16lsb(&header[0x6]); + + rom = (uint8 *)MDFN_malloc_T(0x88 * 8192, _("HES ROM")); + rom_backup = (uint8 *)MDFN_malloc_T(0x88 * 8192, _("HES ROM")); + + MDFN_printf(_("HES Information:\n")); + MDFN_AutoIndent aind(1); + + StartingSong = header[5]; + + MDFN_printf(_("Init address: 0x%04x\n"), InitAddr); + MDFN_printf(_("Starting song: %d\n"), StartingSong + 1); + + for(int x = 0; x < 8; x++) + { + mpr_start[x] = header[0x8 + x]; + MDFN_printf("MPR%d: 0x%02x\n", x, mpr_start[x]); + } + + memset(rom, 0, 0x88 * 8192); + memset(rom_backup, 0, 0x88 * 8192); + + while(fp->read(sub_header, 0x10, false) == 0x10) + { + LoadSize = MDFN_de32lsb(&sub_header[0x4]); + LoadAddr = MDFN_de32lsb(&sub_header[0x8]); + + //printf("Size: %08x(%d), Addr: %08x, La: %02x\n", LoadSize, LoadSize, LoadAddr, LoadAddr / 8192); + MDFN_printf(_("Chunk load:\n")); + + MDFN_AutoIndent aindc(1); + MDFN_printf(_("File offset: 0x%08llx\n"), (unsigned long long)fp->tell() - 0x10); + MDFN_printf(_("Load size: 0x%08x\n"), LoadSize); + MDFN_printf(_("Load target address: 0x%08x\n"), LoadAddr); + + // 0x88 * 8192 = 0x110000 + if(((uint64)LoadAddr + LoadSize) > 0x110000) + { + MDFN_printf(_("Warning: HES is trying to load data past boundary.\n")); + + if(LoadAddr >= 0x110000) + break; + + LoadSize = 0x110000 - LoadAddr; + } + + uint64 rc = fp->read(rom + LoadAddr, LoadSize, false); + if(rc < LoadSize) + { + MDFN_printf(_("Warning: HES tried to load %llu bytes more data than exists!\n"), (unsigned long long)(LoadSize - rc)); + } + } + + memcpy(rom_backup, rom, 0x88 * 8192); + + CurrentSong = StartingSong; + TotalSongs = 256; + + memset(IBP_Bank, 0, 0x2000); + + uint8 *IBP_WR = IBP_Bank + 0x1C00; + + for(int i = 0; i < 8; i++) + { + *IBP_WR++ = 0xA9; // LDA (immediate) + *IBP_WR++ = mpr_start[i]; + *IBP_WR++ = 0x53; // TAM + *IBP_WR++ = 1 << i; + } + + *IBP_WR++ = 0xAD; // LDA(absolute) + *IBP_WR++ = 0x00; // + *IBP_WR++ = 0x1D; // + *IBP_WR++ = 0x20; // JSR + *IBP_WR++ = InitAddr; // JSR target LSB + *IBP_WR++ = InitAddr >> 8; // JSR target MSB + *IBP_WR++ = 0x58; // CLI + *IBP_WR++ = 0xFC; // (Mednafen Special) + *IBP_WR++ = 0x80; // BRA + *IBP_WR++ = 0xFD; // -3 + + Player_Init(TotalSongs, "", "", ""); //NULL, NULL, NULL, NULL); //UTF8 **snames); + + for(int x = 0; x < 0x80; x++) + { + HuCPUFastMap[x] = rom; + PCERead[x] = HESROMRead; + PCEWrite[x] = HESROMWrite; + } + + HuCPUFastMap[0xFF] = IBP_Bank - (0xFF * 8192); + + // FIXME: If a HES rip tries to execute a SCSI command, the CD emulation code will probably crash. Obviously, a HES rip shouldn't do this, + // but Mednafen shouldn't crash either. ;) + PCE_IsCD = 1; + PCE_InitCD(); + + ROMWriteWarningGiven = FALSE; + } + catch(...) + { + Cleanup(); + throw; + } +} + + +static const uint8 BootROM[16] = { 0xA9, 0xFF, 0x53, 0x01, 0xEA, 0xEA, 0xEA, 0xEA, + 0xEA, 0xEA, 0xEA, 0x4C, 0x00, 0x1C, 0xF0, 0xFF }; +void HES_Reset(void) +{ + memcpy(rom, rom_backup, 0x88 * 8192); + memcpy(rom + 0x1FF0, BootROM, 16); + bootstrap = true; +} + + +void HES_Draw(MDFN_Surface *surface, MDFN_Rect *DisplayRect, int16 *SoundBuf, int32 SoundBufSize) +{ + extern uint16 pce_jp_data[5]; + static uint8 last = 0; + bool needreload = 0; + uint8 newset = (pce_jp_data[0] ^ last) & pce_jp_data[0]; + + if(newset & 0x20) + { + CurrentSong++; + needreload = 1; + } + + if(newset & 0x80) + { + CurrentSong--; + needreload = 1; + } + + if(newset & 0x08) + needreload = 1; + + if(newset & 0x10) + { + CurrentSong += 10; + needreload = 1; + } + + if(newset & 0x40) + { + CurrentSong -= 10; + needreload = 1; + } + + last = pce_jp_data[0]; + + if(needreload) + PCE_Power(); + + Player_Draw(surface, DisplayRect, CurrentSong, SoundBuf, SoundBufSize); +} + +void HES_Close(void) +{ + Cleanup(); +} + + + +}; diff --git a/Mednafen/mednafen/pce_fast/hes.h b/Mednafen/mednafen/pce_fast/hes.h new file mode 100644 index 0000000000..5abb6cc18b --- /dev/null +++ b/Mednafen/mednafen/pce_fast/hes.h @@ -0,0 +1,11 @@ +namespace PCE_Fast +{ + +uint8 ReadIBP(unsigned int A); +void HES_Draw(MDFN_Surface *surface, MDFN_Rect *DisplayRect, int16 *samples, int32 sampcount); + +void HES_Load(MDFNFILE* fp) MDFN_COLD; +void HES_Reset(void) MDFN_COLD; +void HES_Close(void) MDFN_COLD; + +}; diff --git a/Mednafen/mednafen/pce_fast/huc.cpp b/Mednafen/mednafen/pce_fast/huc.cpp new file mode 100644 index 0000000000..824171d08d --- /dev/null +++ b/Mednafen/mednafen/pce_fast/huc.cpp @@ -0,0 +1,398 @@ +/* Mednafen - Multi-system Emulator + * + * Portions of this file Copyright (C) 2004 Ki + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include +#include "pcecd.h" +#include +#include +#include +#include +#include +#include + +namespace PCE_Fast +{ + +static const uint8 BRAM_Init_String[8] = { 'H', 'U', 'B', 'M', 0x00, 0x88, 0x10, 0x80 }; //"HUBM\x00\x88\x10\x80"; + +ArcadeCard *arcade_card = NULL; + +static uint8 *HuCROM = NULL; + +static bool IsPopulous; +bool PCE_IsCD; + +static uint8 SaveRAM[2048]; + +static DECLFW(ACPhysWrite) +{ + arcade_card->PhysWrite(A, V); +} + +static DECLFR(ACPhysRead) +{ + return(arcade_card->PhysRead(A)); +} + +static DECLFR(SaveRAMRead) +{ + if((!PCE_IsCD || PCECD_IsBRAMEnabled()) && (A & 8191) < 2048) + return(SaveRAM[A & 2047]); + else + return(0xFF); +} + +static DECLFW(SaveRAMWrite) +{ + if((!PCE_IsCD || PCECD_IsBRAMEnabled()) && (A & 8191) < 2048) + SaveRAM[A & 2047] = V; +} + +static DECLFR(HuCRead) +{ + return ROMSpace[A]; +} + +static DECLFW(HuCRAMWrite) +{ + ROMSpace[A] = V; +} + +static DECLFW(HuCRAMWriteCDSpecial) // Hyper Dyne Special hack +{ + BaseRAM[0x2000 | (A & 0x1FFF)] = V; + ROMSpace[A] = V; +} + +static uint8 HuCSF2Latch = 0; + +static DECLFR(HuCSF2Read) +{ + return(HuCROM[(A & 0x7FFFF) + 0x80000 + HuCSF2Latch * 0x80000 ]); // | (HuCSF2Latch << 19) ]); +} + +static DECLFW(HuCSF2Write) +{ + if((A & 0x1FFC) == 0x1FF0) + { + HuCSF2Latch = (A & 0x3); + } +} + +static void Cleanup(void) MDFN_COLD; +static void Cleanup(void) +{ + if(arcade_card) + { + delete arcade_card; + arcade_card = NULL; + } + + if(PCE_IsCD) + { + PCECD_Close(); + } + + if(HuCROM) + { + MDFN_free(HuCROM); + HuCROM = NULL; + } +} + +static void LoadSaveMemory(const std::string& path, uint8* const data, const uint64 len) +{ + try + { + GZFileStream fp(path, GZFileStream::MODE::READ); + const uint64 fp_size_tmp = fp.size(); + + if(fp_size_tmp != len) + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu bytes."), path.c_str(), (unsigned long long)fp_size_tmp, (unsigned long long)len); + + fp.read(data, len); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } +} + +uint32 HuC_Load(MDFNFILE* fp) +{ + uint32 crc = 0; + + try + { + uint32 sf2_threshold = 2048 * 1024; + uint32 sf2_required_size = 2048 * 1024 + 512 * 1024; + uint64 len = fp->size(); + uint64 m_len = (len + 8191)&~8191; + bool sf2_mapper = FALSE; + + if(m_len >= sf2_threshold) + { + sf2_mapper = TRUE; + + if(m_len != sf2_required_size) + m_len = sf2_required_size; + } + + IsPopulous = 0; + PCE_IsCD = 0; + + + HuCROM = (uint8 *)MDFN_malloc_T(m_len, _("HuCard ROM")); + memset(HuCROM, 0xFF, m_len); + fp->read(HuCROM, std::min(m_len, len)); + + md5_context md5; + md5.starts(); + md5.update(HuCROM, std::min(m_len, len)); + md5.finish(MDFNGameInfo->MD5); + + crc = crc32(0, HuCROM, std::min(m_len, len)); + + MDFN_printf(_("ROM: %lluKiB\n"), (unsigned long long)(std::min(m_len, len) / 1024)); + MDFN_printf(_("ROM CRC32: 0x%04x\n"), crc); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + memset(ROMSpace, 0xFF, 0x88 * 8192 + 8192); + + if(m_len == 0x60000) + { + memcpy(ROMSpace + 0x00 * 8192, HuCROM, 0x20 * 8192); + memcpy(ROMSpace + 0x20 * 8192, HuCROM, 0x20 * 8192); + memcpy(ROMSpace + 0x40 * 8192, HuCROM + 0x20 * 8192, 0x10 * 8192); + memcpy(ROMSpace + 0x50 * 8192, HuCROM + 0x20 * 8192, 0x10 * 8192); + memcpy(ROMSpace + 0x60 * 8192, HuCROM + 0x20 * 8192, 0x10 * 8192); + memcpy(ROMSpace + 0x70 * 8192, HuCROM + 0x20 * 8192, 0x10 * 8192); + } + else if(m_len == 0x80000) + { + memcpy(ROMSpace + 0x00 * 8192, HuCROM, 0x40 * 8192); + memcpy(ROMSpace + 0x40 * 8192, HuCROM + 0x20 * 8192, 0x20 * 8192); + memcpy(ROMSpace + 0x60 * 8192, HuCROM + 0x20 * 8192, 0x20 * 8192); + } + else + { + memcpy(ROMSpace + 0x00 * 8192, HuCROM, (m_len < 1024 * 1024) ? m_len : 1024 * 1024); + } + + for(int x = 0x00; x < 0x80; x++) + { + HuCPUFastMap[x] = ROMSpace; + PCERead[x] = HuCRead; + } + + if(!memcmp(HuCROM + 0x1F26, "POPULOUS", strlen("POPULOUS"))) + { + uint8 *PopRAM = ROMSpace + 0x40 * 8192; + memset(PopRAM, 0xFF, 32768); + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), PopRAM, 32768); + + IsPopulous = 1; + + MDFN_printf("Populous\n"); + + for(int x = 0x40; x < 0x44; x++) + { + HuCPUFastMap[x] = &PopRAM[(x & 3) * 8192] - x * 8192; + PCERead[x] = HuCRead; + PCEWrite[x] = HuCRAMWrite; + } + MDFNMP_AddRAM(32768, 0x40 * 8192, PopRAM); + } + else + { + memset(SaveRAM, 0x00, 2048); + memcpy(SaveRAM, BRAM_Init_String, 8); // So users don't have to manually intialize the file cabinet + // in the CD BIOS screen. + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), SaveRAM, 2048); + + PCEWrite[0xF7] = SaveRAMWrite; + PCERead[0xF7] = SaveRAMRead; + MDFNMP_AddRAM(2048, 0xF7 * 8192, SaveRAM); + } + + // 0x1A558 + //if(len >= 0x20000 && !memcmp(HuCROM + 0x1A558, "STREET FIGHTER#", strlen("STREET FIGHTER#"))) + if(sf2_mapper) + { + for(int x = 0x40; x < 0x80; x++) + { + // FIXME: PCE_FAST + HuCPUFastMap[x] = NULL; // Make sure our reads go through our read function, and not a table lookup + PCERead[x] = HuCSF2Read; + } + PCEWrite[0] = HuCSF2Write; + MDFN_printf("Street Fighter 2 Mapper\n"); + HuCSF2Latch = 0; + } + } + catch(...) + { + Cleanup(); + throw; + } + + return crc; +} + +bool IsBRAMUsed(void) +{ + if(memcmp(SaveRAM, BRAM_Init_String, 8)) // HUBM string is modified/missing + return(1); + + for(int x = 8; x < 2048; x++) + if(SaveRAM[x]) return(1); + + return(0); +} + +void HuC_LoadCD(const std::string& bios_path) +{ + static const FileExtensionSpecStruct KnownBIOSExtensions[] = + { + { ".pce", gettext_noop("PC Engine ROM Image") }, + { ".bin", gettext_noop("PC Engine ROM Image") }, + { ".bios", gettext_noop("BIOS Image") }, + { NULL, NULL } + }; + + try + { + MDFNFILE fp(bios_path.c_str(), KnownBIOSExtensions, _("CD BIOS")); + + memset(ROMSpace, 0xFF, 262144); + + if(fp.size() & 512) + fp.seek(512, SEEK_SET); + + fp.read(ROMSpace, 262144); + + fp.Close(); + + PCE_IsCD = 1; + PCE_InitCD(); + + MDFN_printf(_("Arcade Card Emulation: %s\n"), PCE_ACEnabled ? _("Enabled") : _("Disabled")); + for(int x = 0; x < 0x40; x++) + { + HuCPUFastMap[x] = ROMSpace; + PCERead[x] = HuCRead; + } + + for(int x = 0x68; x < 0x88; x++) + { + HuCPUFastMap[x] = ROMSpace; + PCERead[x] = HuCRead; + PCEWrite[x] = HuCRAMWrite; + } + PCEWrite[0x80] = HuCRAMWriteCDSpecial; // Hyper Dyne Special hack + MDFNMP_AddRAM(262144, 0x68 * 8192, ROMSpace + 0x68 * 8192); + + if(PCE_ACEnabled) + { + arcade_card = new ArcadeCard(); + + for(int x = 0x40; x < 0x44; x++) + { + HuCPUFastMap[x] = NULL; + PCERead[x] = ACPhysRead; + PCEWrite[x] = ACPhysWrite; + } + } + + memset(SaveRAM, 0x00, 2048); + memcpy(SaveRAM, BRAM_Init_String, 8); // So users don't have to manually intialize the file cabinet + // in the CD BIOS screen. + + LoadSaveMemory(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), SaveRAM, 2048); + + PCEWrite[0xF7] = SaveRAMWrite; + PCERead[0xF7] = SaveRAMRead; + MDFNMP_AddRAM(2048, 0xF7 * 8192, SaveRAM); + } + catch(...) + { + Cleanup(); + throw; + } +} + +int HuC_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(ROMSpace + 0x40 * 8192, IsPopulous ? 32768 : 0), + SFARRAY(SaveRAM, IsPopulous ? 0 : 2048), + SFARRAY(ROMSpace + 0x68 * 8192, PCE_IsCD ? 262144 : 0), + SFVAR(HuCSF2Latch), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "HuC"); + + if(load) + HuCSF2Latch &= 0x3; + + if(PCE_IsCD) + { + ret &= PCECD_StateAction(sm, load, data_only); + + if(arcade_card) + arcade_card->StateAction(sm, load, data_only); + } + return(ret); +} + +// +// HuC_Kill() may be called before HuC_Load*() is called or even after it errors out, so we have a separate HuC_SaveNV() +// to prevent save game file corruption in case of error. +void HuC_Kill(void) +{ + Cleanup(); +} + +void HuC_SaveNV(void) +{ + if(IsPopulous) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), ROMSpace + 0x40 * 8192, 32768); + } + else if(IsBRAMUsed()) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), SaveRAM, 2048); + } +} + +void HuC_Power(void) +{ + if(PCE_IsCD) + memset(ROMSpace + 0x68 * 8192, 0x00, 262144); + + if(arcade_card) + arcade_card->Power(); +} + +}; diff --git a/Mednafen/mednafen/pce_fast/huc.h b/Mednafen/mednafen/pce_fast/huc.h new file mode 100644 index 0000000000..37d314a261 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/huc.h @@ -0,0 +1,35 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +namespace PCE_Fast +{ + +uint32 HuC_Load(MDFNFILE* fp) MDFN_COLD; +void HuC_LoadCD(const std::string& bios_path) MDFN_COLD; +void HuC_SaveNV(void) MDFN_COLD; +void HuC_Kill(void) MDFN_COLD; + +int HuC_StateAction(StateMem *sm, int load, int data_only); + +void HuC_Power(void) MDFN_COLD; + +DECLFR(PCE_ACRead); +DECLFW(PCE_ACWrite); + +extern bool PCE_IsCD; + +}; diff --git a/Mednafen/mednafen/pce_fast/huc6280.cpp b/Mednafen/mednafen/pce_fast/huc6280.cpp new file mode 100644 index 0000000000..6c546fe754 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/huc6280.cpp @@ -0,0 +1,788 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "vdc.h" + +namespace PCE_Fast +{ + +HuC6280 HuCPU; +uint8 *HuCPUFastMap[0x100]; + +#define HU_PC PC_local //HuCPU.PC +#define HU_PC_base HuCPU.PC_base +#define HU_A HuCPU.A +#define HU_X X_local //HuCPU.X +#define HU_Y Y_local //HuCPU.Y +#define HU_S HuCPU.S +#define HU_P P_local //HuCPU.P +#define HU_PI HuCPU.mooPI +#define HU_IRQlow HuCPU.IRQlow +#define HU_Page1 Page1_local +//HuCPU.Page1 +//Page1_local //HuCPU.Page1 + +#ifdef HUC6280_LAZY_FLAGS + #define HU_ZNFlags HuCPU.ZNFlags +#endif + + +#ifdef HUC6280_CRAZY_VERSION +#define LOAD_LOCALS_PC() register uint8 *PC_local = HuCPU.PC; +#else +#define LOAD_LOCALS_PC() register uint32 PC_local /*asm ("edi")*/ = HuCPU.PC; // asm ("edi") = HuCPU.PC; +#endif + +#define LOAD_LOCALS() \ + LOAD_LOCALS_PC(); \ + uint8 X_local = HuCPU.X; \ + uint8 Y_local = HuCPU.Y; \ + uint8 P_local = HuCPU.P; \ + uint8 *Page1_local = HuCPU.Page1; + +#define SAVE_LOCALS() HuCPU.PC = PC_local; \ + HuCPU.X = X_local; \ + HuCPU.Y = Y_local; \ + HuCPU.P = P_local; \ + HuCPU.Page1 = Page1_local; + +#ifdef HUC6280_LAZY_FLAGS + #define COMPRESS_FLAGS() HU_P &= ~(N_FLAG | Z_FLAG); HU_P |= ((HU_ZNFlags >> 24) & 0x80) | ((HU_ZNFlags & 0xFF) ? 0 : Z_FLAG); + //((((HU_ZNFlags & 0xFF) - 1) >> 8) & Z_FLAG); + #define EXPAND_FLAGS() HU_ZNFlags = (HU_P << 24) | ((HU_P & Z_FLAG) ^ Z_FLAG); +#else + #define COMPRESS_FLAGS() + #define EXPAND_FLAGS() +#endif + +#ifdef HUC6280_CRAZY_VERSION + #define GetRealPC() ((unsigned int)(HU_PC - HU_PC_base)) + #define GetRealPC_EXTERNAL() ((unsigned int)(HuCPU.PC - HuCPU.PC_base)) +#else + #define GetRealPC() (HU_PC) + #define GetRealPC_EXTERNAL() (HuCPU.PC) +#endif + +#ifdef HUC6280_CRAZY_VERSION + #define SetPC(value) { unsigned int tempmoo = value; HU_PC = &HuCPU.FastPageR[tempmoo >> 13][tempmoo]; \ + HU_PC_base = HU_PC - tempmoo; } + #define SetPC_EXTERNAL(value) { unsigned int tempmoo = value; \ + HuCPU.PC = &HuCPU.FastPageR[tempmoo >> 13][tempmoo]; HuCPU.PC_base = HuCPU.PC - tempmoo; } +#else + #define SetPC(value) { HU_PC = (value); } + #define SetPC_EXTERNAL(value) { HuCPU.PC = (value); } +#endif + +// Page change PC, GET IT?! +#ifdef HUC6280_CRAZY_VERSION + #define FixPC_PC() SetPC(GetRealPC()); +#else + #define FixPC_PC() +#endif + +//#define IncPC() { HU_PC++; if(!(GetRealPC() & 0x1FFF)) printf("Bank crossing: %04x\n", GetRealPC()); } +//#define IncPC() HU_PC++; +#if 0 +#define IncPC() { HU_PC++; if(!(GetRealPC() & 0x1FFF) && \ + HuCPU.MPR[(GetRealPC() - 1) >> 13] != (HuCPU.MPR[(GetRealPC()) >> 13] - 1)) \ + printf("Bank crossing: %04x, %02x, %02x\n", GetRealPC(), HuCPU.MPR[(GetRealPC() - 1) >> 13], \ + HuCPU.MPR[GetRealPC() >> 13]); } +#else +#define IncPC() HU_PC++; +#endif + +#ifdef HUC6280_CRAZY_VERSION + #define RdAtPC() (*HU_PC) +#else + #define RdAtPC() RdOp(HU_PC) +#endif + +// If we change this definition, we'll need to also fix HuC6280_StealCycle() in huc6280.h +#define ADDCYC(x) { HuCPU.timestamp += x; } + +static uint8 dummy_bank[8192 + 8192]; // + 8192 for PC-as-ptr safety padding + +#define SET_MPR(arg_i, arg_v) \ +{ \ + const unsigned int wmpr = arg_i, wbank = arg_v; \ + if(wmpr == 1) \ + { \ + HU_Page1 = HuCPUFastMap[wbank] ? HuCPUFastMap[wbank] + wbank * 8192 : dummy_bank; \ + } \ + HuCPU.MPR[wmpr] = wbank; \ + HuCPU.FastPageR[wmpr] = HuCPUFastMap[wbank] ? (HuCPUFastMap[wbank] + wbank * 8192) - wmpr * 8192 : (dummy_bank - wmpr * 8192); \ +} + +void HuC6280_SetMPR(int i, int v) +{ + uint8 *Page1_local = HuCPU.Page1; + + SET_MPR(i, v); + + HuCPU.Page1 = Page1_local; +} + + +static void HuC6280_FlushMPRCache(void) +{ + for(int x = 0; x < 9; x++) + HuC6280_SetMPR(x, HuCPU.MPR[x & 0x7]); +} + +static INLINE uint8 RdMem(unsigned int A) +{ + uint8 wmpr = HuCPU.MPR[A >> 13]; + return(PCERead[wmpr]((wmpr << 13) | (A & 0x1FFF))); +} + +static INLINE uint16 RdMem16(unsigned int A) +{ + uint16 ret; + + ret = RdMem(A); + ret |= RdMem(A + 1) << 8; + + return(ret); +} + +static INLINE void WrMem(unsigned int A, uint8 V) +{ + uint8 wmpr = HuCPU.MPR[A >> 13]; + PCEWrite[wmpr]((wmpr << 13) | (A & 0x1FFF), V); +} + +static INLINE uint8 RdOp(unsigned int A) +{ + return(HuCPU.FastPageR[A >> 13][A]); +} + +#define PUSH(V) \ +{ \ + HU_Page1[0x100 + HU_S] = V; \ + HU_S--; \ +} + +#define PUSH_PC() \ +{ \ + unsigned int real_pc = GetRealPC(); \ + PUSH(real_pc >> 8); \ + PUSH(real_pc); \ +} + +#define POP() HU_Page1[0x100 + ++HU_S] + +#define POP_PC() \ +{ \ + unsigned int npc; \ + npc = POP(); \ + npc |= POP() << 8; \ + SetPC(npc); \ +} + +// Hopefully we never RTS to 0x0000. ;) +#define POP_PC_AP() \ +{ \ + uint32 npc; \ + npc = POP(); \ + npc |= POP() << 8; \ + npc++; \ + SetPC(npc); \ +} + +/* Some of these operations will only make sense if you know what the flag + constants are. */ + +#ifdef HUC6280_LAZY_FLAGS + #define X_ZN(zort) { HU_ZNFlags = (int32)(int8)(uint8)(zort); } + #define X_ZN_BIT(opres, argie) { HU_ZNFlags = (opres) | ((argie) << 24); } +#else + static uint8 ZNTable[256]; + #define X_ZN(zort) HU_P&=~(Z_FLAG|N_FLAG);HU_P|=ZNTable[zort] + #define X_ZN_BIT(opres, argie) { HU_P &= ~(Z_FLAG | N_FLAG); HU_P |= ZNTable[opres] & Z_FLAG; HU_P |= argie & N_FLAG; } +#endif + +#define JR(cond) \ +{ \ + if(cond) \ + { \ + int32 disp; \ + disp = 1 + (int8)RdAtPC(); \ + ADDCYC(2); \ + HU_PC+=disp; \ + } \ + else IncPC(); \ +} + +#define BRA \ +{ \ + int32 disp; \ + disp = 1 + (int8)RdAtPC(); \ + HU_PC+=disp; \ +} + +#define BBRi(bitto) JR(!(x & (1 << bitto))) +#define BBSi(bitto) JR(x & (1 << bitto)) + +#define ST0 VDC_Write_ST(0, x) +#define ST1 VDC_Write_ST(2, x) +#define ST2 VDC_Write_ST(3, x) + +#define LDA HU_A=x;X_ZN(HU_A) +#define LDX HU_X=x;X_ZN(HU_X) +#define LDY HU_Y=x;X_ZN(HU_Y) + +/* All of the freaky arithmetic operations. */ +#define AND HU_A&=x;X_ZN(HU_A); + +#define BIT HU_P&=~V_FLAG; X_ZN_BIT(x & HU_A, x); HU_P |= x & V_FLAG; +#define EOR HU_A^=x;X_ZN(HU_A); +#define ORA HU_A|=x;X_ZN(HU_A); + +#define ADC { \ + if(HU_P & D_FLAG) \ + { \ + uint32 tmp; \ + tmp = (HU_A & 0x0F) + (x & 0x0F) + (HU_P & 1); \ + if(tmp >= 0x0A) \ + tmp += 0x06; \ + tmp += (HU_A & 0xF0) + (x & 0xF0); \ + if(tmp >= 0xA0) \ + tmp += 0x60; \ + HU_P &= ~C_FLAG; \ + if(tmp & 0xFF00) \ + HU_P |= C_FLAG; \ + HU_A = tmp; \ + X_ZN(HU_A); \ + } \ + else \ + { \ + uint32 l=HU_A+x+(HU_P&1); \ + HU_P&=~(C_FLAG|V_FLAG); \ + HU_P|=((((HU_A^x)&0x80)^0x80) & ((HU_A^l)&0x80))>>1; \ + HU_P|=(l>>8)&C_FLAG; \ + HU_A=l; \ + X_ZN(HU_A); \ + } \ + } + +#define SBC if(HU_P & D_FLAG) \ + { \ + const uint8 m = (HU_A & 0xF) - (x & 0xF) - ((HU_P & 1) ^ 1); \ + const uint8 n = (HU_A >> 4) - (x >> 4) - ((m >> 4) & 1); \ + uint8 res = (n << 4) | (m & 0xF); \ + if(m & 0x10) \ + res -= 0x06; \ + if(n & 0x10) \ + res -= 0x60; \ + HU_A = res; \ + HU_P &= ~C_FLAG; \ + HU_P |= ((n >> 4) & 0x1) ^ 1; \ + X_ZN(HU_A); \ + } else { \ + uint32 l=HU_A-x-((HU_P&1)^1); \ + HU_P&=~(C_FLAG|V_FLAG); \ + HU_P|=((HU_A^l)&(HU_A^x)&0x80)>>1; \ + HU_P|=((l>>8)&C_FLAG)^C_FLAG; \ + HU_A=l; \ + X_ZN(HU_A); \ + } + +#define CMPL(a1,a2) { \ + uint32 t=a1-a2; \ + X_ZN(t&0xFF); \ + HU_P&=~C_FLAG; \ + HU_P|=((t>>8)&C_FLAG)^C_FLAG; \ + } + +#define TAM for(int i = 0; i < 8; i ++) { \ + if(x & (1 << i)) \ + { \ + SET_MPR(i, HU_A); \ + } \ + } SET_MPR(8, HuCPU.MPR[0]); + +#define TMA for(int i = 0; i < 8; i ++) { \ + if(x & (1 << i)) \ + HU_A = HuCPU.MPR[i]; \ + } + +#define CSL +#define CSH + +#define RMB(bitto) x &= ~(1 << (bitto & 7)) +#define SMB(bitto) x |= 1 << (bitto & 7) + +#define TSB { HU_P &= ~V_FLAG; X_ZN_BIT(x | HU_A, x); HU_P |= x & V_FLAG; x |= HU_A; } +#define TRB { HU_P &= ~V_FLAG; X_ZN_BIT(x & ~HU_A, x); HU_P |= x & V_FLAG; x &= ~HU_A; } +#define TST { HU_P &= ~V_FLAG; X_ZN_BIT(x & zoomhack, x); HU_P |= x & V_FLAG; } + +#define CMP CMPL(HU_A,x) +#define CPX CMPL(HU_X,x) +#define CPY CMPL(HU_Y,x) + +/* The following operations modify the byte being worked on. */ +#define DEC x--;X_ZN(x) +#define INC x++;X_ZN(x) + +#define ASL HU_P&=~C_FLAG;HU_P|=x>>7;x<<=1;X_ZN(x) +#define LSR HU_P&=~C_FLAG;HU_P|=x&1;x>>=1;X_ZN(x) + +#define ROL { \ + uint8 l=x>>7; \ + x<<=1; \ + x|=HU_P&C_FLAG; \ + HU_P&=~C_FLAG; \ + HU_P|=l; \ + X_ZN(x); \ + } +#define ROR { \ + uint8 l=x&1; \ + x>>=1; \ + x|=(HU_P&C_FLAG)<<7; \ + HU_P&=~C_FLAG; \ + HU_P|=l; \ + X_ZN(x); \ + } + +/* Absolute */ +#define GetAB(target) \ +{ \ + target=RdAtPC(); \ + IncPC(); \ + target|=RdAtPC()<<8; \ + IncPC(); \ +} + +/* Absolute Indexed(for reads) */ +#define GetABI(target, i) \ +{ \ + unsigned int tmp; \ + GetAB(tmp); \ + target=tmp; \ + target+=i; \ +} + +/* Zero Page */ +#define GetZP(target) \ +{ \ + target=RdAtPC(); \ + IncPC(); \ +} + +/* Zero Page Indexed */ +#define GetZPI(target,i) \ +{ \ + target=i+RdAtPC(); \ + IncPC(); \ +} + +/* Indirect */ +#define GetIND(target) \ +{ \ + uint8 tmp; \ + tmp=RdAtPC(); \ + IncPC(); \ + target=HU_Page1[tmp]; \ + tmp++; \ + target|=HU_Page1[tmp]<<8; \ +} + + +/* Indexed Indirect */ +#define GetIX(target) \ +{ \ + uint8 tmp; \ + tmp=RdAtPC(); \ + IncPC(); \ + tmp+=HU_X; \ + target=HU_Page1[tmp]; \ + tmp++; \ + target|=HU_Page1[tmp] <<8; \ +} + +/* Indirect Indexed(for reads) */ +#define GetIY(target) \ +{ \ + unsigned int rt; \ + uint8 tmp; \ + tmp=RdAtPC(); \ + rt=HU_Page1[tmp]; \ + tmp++; \ + rt|=HU_Page1[tmp]<<8; \ + target = (rt + HU_Y); \ + IncPC(); \ +} + +/* Now come the macros to wrap up all of the above stuff addressing mode functions + and operation macros. Note that operation macros will always operate(redundant + redundant) on the variable "x". +*/ + +#define RMW_A(op) {uint8 x=HU_A; op; HU_A=x; break; } /* Meh... */ +#define RMW_AB(op) {unsigned int EA; uint8 x; GetAB(EA); x=RdMem(EA); op; WrMem(EA,x); break; } +#define RMW_ABI(reg,op) {unsigned int EA; uint8 x; GetABI(EA,reg); x=RdMem(EA); op; WrMem(EA,x); break; } +#define RMW_ABX(op) RMW_ABI(HU_X,op) +#define RMW_ABY(op) RMW_ABI(HU_Y,op) +#define RMW_IND(op) { unsigned int EA; uint8 x; GetIND(EA); x = RdMem(EA); op; WrMem(EA, x); break; } +#define RMW_IX(op) { unsigned int EA; uint8 x; GetIX(EA); x=RdMem(EA); op; WrMem(EA,x); break; } +#define RMW_IY(op) { unsigned int EA; uint8 x; GetIY(EA); x=RdMem(EA); op; WrMem(EA,x); break; } +#define RMW_ZP(op) { uint8 EA; uint8 x; GetZP(EA); x=HU_Page1[EA]; op; HU_Page1[EA] = x; break; } +#define RMW_ZPX(op) { uint8 EA; uint8 x; GetZPI(EA,HU_X); x=HU_Page1[EA]; op; HU_Page1[EA] = x; break;} + +#define LD_IM(op) { uint8 x; x=RdAtPC(); IncPC(); op; break; } +#define LD_ZP(op) { uint8 EA; uint8 x; GetZP(EA); x=HU_Page1[EA]; op; break; } +#define LD_ZPX(op) { uint8 EA; uint8 x; GetZPI(EA,HU_X); x=HU_Page1[EA]; op; break; } +#define LD_ZPY(op) { uint8 EA; uint8 x; GetZPI(EA,HU_Y); x=HU_Page1[EA]; op; break; } +#define LD_AB(op) { unsigned int EA; uint8 x; GetAB(EA); x=RdMem(EA); op; break; } +#define LD_ABI(reg,op) { unsigned int EA; uint8 x; GetABI(EA,reg); x=RdMem(EA); op; break; } +#define LD_ABX(op) LD_ABI(HU_X,op) +#define LD_ABY(op) LD_ABI(HU_Y,op) + +#define LD_IND(op) { unsigned int EA; uint8 x; GetIND(EA); x=RdMem(EA); op; break; } +#define LD_IX(op) { unsigned int EA; uint8 x; GetIX(EA); x=RdMem(EA); op; break; } +#define LD_IY(op) { unsigned int EA; uint8 x; GetIY(EA); x=RdMem(EA); op; break; } + +#define BMT_PREHONK(pork) HuCPU.in_block_move = IBM_##pork; +#define BMT_HONKHONK(pork) if(HuCPU.timestamp >= next_user_event) goto GetOutBMT; continue_the_##pork: + +#define BMT_TDD BMT_PREHONK(TDD); do { ADDCYC(6); WrMem(HuCPU.bmt_dest, RdMem(HuCPU.bmt_src)); HuCPU.bmt_src--; HuCPU.bmt_dest--; BMT_HONKHONK(TDD); HuCPU.bmt_length--; } while(HuCPU.bmt_length); +#define BMT_TAI BMT_PREHONK(TAI); {HuCPU.bmt_alternate = 0; do { ADDCYC(6); WrMem(HuCPU.bmt_dest, RdMem(HuCPU.bmt_src + HuCPU.bmt_alternate)); HuCPU.bmt_dest++; HuCPU.bmt_alternate ^= 1; BMT_HONKHONK(TAI); HuCPU.bmt_length--; } while(HuCPU.bmt_length); } +#define BMT_TIA BMT_PREHONK(TIA); {HuCPU.bmt_alternate = 0; do { ADDCYC(6); WrMem(HuCPU.bmt_dest + HuCPU.bmt_alternate, RdMem(HuCPU.bmt_src)); HuCPU.bmt_src++; HuCPU.bmt_alternate ^= 1; BMT_HONKHONK(TIA); HuCPU.bmt_length--; } while(HuCPU.bmt_length); } +#define BMT_TII BMT_PREHONK(TII); do { ADDCYC(6); WrMem(HuCPU.bmt_dest, RdMem(HuCPU.bmt_src)); HuCPU.bmt_src++; HuCPU.bmt_dest++; BMT_HONKHONK(TII); HuCPU.bmt_length--; } while(HuCPU.bmt_length); +#define BMT_TIN BMT_PREHONK(TIN); do { ADDCYC(6); WrMem(HuCPU.bmt_dest, RdMem(HuCPU.bmt_src)); HuCPU.bmt_src++; BMT_HONKHONK(TIN); HuCPU.bmt_length--; } while(HuCPU.bmt_length); + +// Block memory transfer load +#define LD_BMT(op) { PUSH(HU_Y); PUSH(HU_A); PUSH(HU_X); GetAB(HuCPU.bmt_src); GetAB(HuCPU.bmt_dest); GetAB(HuCPU.bmt_length); op; HuCPU.in_block_move = 0; HU_X = POP(); HU_A = POP(); HU_Y = POP(); break; } + +#define ST_ZP(r) {uint8 EA; GetZP(EA); HU_Page1[EA] = r; break;} +#define ST_ZPX(r) {uint8 EA; GetZPI(EA,HU_X); HU_Page1[EA] = r; break;} +#define ST_ZPY(r) {uint8 EA; GetZPI(EA,HU_Y); HU_Page1[EA] = r; break;} +#define ST_AB(r) {unsigned int EA; GetAB(EA); WrMem(EA, r); break;} +#define ST_ABI(reg,r) {unsigned int EA; GetABI(EA,reg); WrMem(EA,r); break; } +#define ST_ABX(r) ST_ABI(HU_X,r) +#define ST_ABY(r) ST_ABI(HU_Y,r) + +#define ST_IND(r) {unsigned int EA; GetIND(EA); WrMem(EA,r); break; } +#define ST_IX(r) {unsigned int EA; GetIX(EA); WrMem(EA,r); break; } +#define ST_IY(r) {unsigned int EA; GetIY(EA); WrMem(EA,r); break; } + +static const uint8 CycTable[256] = +{ + /*0x00*/ 8, 7, 3, 4, 6, 4, 6, 7, 3, 2, 2, 2, 7, 5, 7, 6, + /*0x10*/ 2, 7, 7, 4, 6, 4, 6, 7, 2, 5, 2, 2, 7, 5, 7, 6, + /*0x20*/ 7, 7, 3, 4, 4, 4, 6, 7, 4, 2, 2, 2, 5, 5, 7, 6, + /*0x30*/ 2, 7, 7, 2, 4, 4, 6, 7, 2, 5, 2, 2, 5, 5, 7, 6, + /*0x40*/ 7, 7, 3, 4, 8, 4, 6, 7, 3, 2, 2, 2, 4, 5, 7, 6, + /*0x50*/ 2, 7, 7, 5, 3, 4, 6, 7, 2, 5, 3, 2, 2, 5, 7, 6, + /*0x60*/ 7, 7, 2, 2, 4, 4, 6, 7, 4, 2, 2, 2, 7, 5, 7, 6, + /*0x70*/ 2, 7, 7, 17, 4, 4, 6, 7, 2, 5, 4, 2, 7, 5, 7, 6, + + /*0x80*/ 4, 7, 2, 7, 4, 4, 4, 7, 2, 2, 2, 2, 5, 5, 5, 6, + /*0x90*/ 2, 7, 7, 8, 4, 4, 4, 7, 2, 5, 2, 2, 5, 5, 5, 6, + /*0xA0*/ 2, 7, 2, 7, 4, 4, 4, 7, 2, 2, 2, 2, 5, 5, 5, 6, + /*0xB0*/ 2, 7, 7, 8, 4, 4, 4, 7, 2, 5, 2, 2, 5, 5, 5, 6, + /*0xC0*/ 2, 7, 2, 17, 4, 4, 6, 7, 2, 2, 2, 2, 5, 5, 7, 6, + /*0xD0*/ 2, 7, 7, 17, 3, 4, 6, 7, 2, 5, 3, 2, 2, 5, 7, 6, + /*0xE0*/ 2, 7, 2, 17, 4, 4, 6, 7, 2, 2, 2, 2, 5, 5, 7, 6, + /*0xF0*/ 2, 7, 7, 17, 2, 4, 6, 7, 2, 5, 4, 2, 2, 5, 7, 6, +}; +#if 0 +static bool WillIRQOccur(void) NO_INLINE; +static bool WillIRQOccur(void) +{ + bool ret = false; + + if(HU_IRQlow) + { + if(!(HU_PI&I_FLAG)) + { + if(HU_IRQlow & MDFN_IQTIMER & HuCPU.IRQMaskDelay) + ret = true; + else if((HU_IRQlow & MDFN_IQIRQ1 & HuCPU.IRQMaskDelay) || ((HU_IRQlow >> 8) & MDFN_IQIRQ1 & HuCPU.IRQMaskDelay)) + ret = true; + else if(HU_IRQlow & MDFN_IQIRQ2 & HuCPU.IRQMaskDelay) + ret = true; + } + } + + return(true); +} +#endif + +void HuC6280_IRQBegin(int w) +{ + HU_IRQlow|=w; +} + +void HuC6280_IRQEnd(int w) +{ + HU_IRQlow&=~w; +} + +void HuC6280_Reset(void) +{ + HuCPU.timer_next_timestamp = HuCPU.timestamp + 1024; + + HuCPU.timer_load = 0; + HuCPU.timer_value = 0; + HuCPU.timer_status = 0; + HuCPU.in_block_move = 0; + + unsigned int npc; + + HuCPU.IRQMask = HuCPU.IRQMaskDelay = 7; + + HuC6280_SetMPR(0, 0xFF); + HuC6280_SetMPR(8, 0xFF); + HuC6280_SetMPR(1, 0xF8); + + for(int i = 2; i < 8; i++) + HuC6280_SetMPR(i, 0); + + npc = RdMem16(0xFFFE); + + #define PC_local HuCPU.PC + SetPC(npc); + #undef PC_local + + HuCPU.mooPI = I_FLAG; + HuCPU.P = I_FLAG; + + HU_IRQlow = 0; +} + +void HuC6280_Init(void) +{ + memset((void *)&HuCPU,0,sizeof(HuCPU)); + memset(dummy_bank, 0, sizeof(dummy_bank)); + + #ifdef HUC6280_LAZY_FLAGS + + #else + for(int x=0; x < 256; x++) + if(!x) ZNTable[x]=Z_FLAG; + else if (x&0x80) ZNTable[x]=N_FLAG; + else ZNTable[x]=0; + #endif +} + +void HuC6280_Power(void) +{ + HuCPU.IRQlow = 0; + + HuCPU.A = 0; + HuCPU.X = 0; + HuCPU.Y = 0; + HuCPU.S = 0; + HuCPU.P = 0; + HuCPU.mooPI = 0; + + #if 0 + HU_PC = HU_PC_base = NULL; + #else + HuCPU.PC = 0; + #endif + + HuCPU.timestamp = 0; + + for(int i = 0; i < 9; i++) + { + HuCPU.MPR[i] = 0; + HuCPU.FastPageR[i] = NULL; + } + HuC6280_Reset(); +} + +void HuC6280_Run(int32 cycles) +{ + const int32 next_user_event = HuCPU.previous_next_user_event + cycles * pce_overclocked; + + HuCPU.previous_next_user_event = next_user_event; + + LOAD_LOCALS(); + + if(HuCPU.timestamp >= next_user_event) + return; + + int32 next_event; + + if(HuCPU.in_block_move) + { + next_event = (next_user_event < HuCPU.timer_next_timestamp) ? next_user_event : HuCPU.timer_next_timestamp; + + switch(HuCPU.in_block_move) + { + case IBM_TIA: goto continue_the_TIA; + case IBM_TAI: goto continue_the_TAI; + case IBM_TDD: goto continue_the_TDD; + case IBM_TII: goto continue_the_TII; + case IBM_TIN: goto continue_the_TIN; + } + } + + while(MDFN_LIKELY(HuCPU.timestamp < next_user_event)) + { + next_event = (next_user_event < HuCPU.timer_next_timestamp) ? next_user_event : HuCPU.timer_next_timestamp; + + while(MDFN_LIKELY(HuCPU.timestamp < next_event)) + { + uint8 b1; + + if(HU_IRQlow) + { + if(!(HU_PI&I_FLAG)) + { + uint32 tmpa = 0; + + if(HU_IRQlow & MDFN_IQTIMER & HuCPU.IRQMaskDelay) + tmpa = 0xFFFA; + else if((HU_IRQlow & MDFN_IQIRQ1 & HuCPU.IRQMaskDelay) || ((HU_IRQlow >> 8) & MDFN_IQIRQ1 & HuCPU.IRQMaskDelay)) + tmpa = 0xFFF8; + else if(HU_IRQlow & MDFN_IQIRQ2 & HuCPU.IRQMaskDelay) + tmpa = 0xFFF6; + + if(tmpa) + { + unsigned int npc; + + ADDCYC(8); + PUSH_PC(); + + COMPRESS_FLAGS(); + PUSH((HU_P&~B_FLAG)); + HU_P |= I_FLAG; + HU_P &= ~(T_FLAG | D_FLAG); + HU_PI = HU_P; + + npc = RdMem16(tmpa); + SetPC(npc); + + if(tmpa == 0xFFF8) + HU_IRQlow &= ~0x200; + + continue; + } + } + } // end if(HU_IRQlow) + + //printf("%04x\n", GetRealPC()); + HU_PI = HU_P; + HuCPU.IRQMaskDelay = HuCPU.IRQMask; + + b1 = RdAtPC(); + + ADDCYC(CycTable[b1]); + + IncPC(); + + switch(b1) + { + #include "huc6280_ops.inc" + } + + #ifndef HUC6280_EXTRA_CRAZY + FixPC_PC(); + #endif + } // end while(HuCPU.timestamp < next_event) + + while(HuCPU.timestamp >= HuCPU.timer_next_timestamp) + { + HuCPU.timer_next_timestamp += 1024 * pce_overclocked; + + if(HuCPU.timer_status) + { + HuCPU.timer_value --; + if(HuCPU.timer_value < 0) + { + HuCPU.timer_value = HuCPU.timer_load; + HuC6280_IRQBegin(MDFN_IQTIMER); + } + } + } + } // end while(HuCPU.timestamp < next_user_event) + + GetOutBMT: + + SAVE_LOCALS(); +} + +void HuC6280_ResetTS(void) +{ + HuCPU.timer_next_timestamp -= HuCPU.timestamp; + HuCPU.previous_next_user_event -= HuCPU.timestamp; + HuCPU.timestamp = 0; +} + +int HuC6280_StateAction(StateMem *sm, int load, int data_only) +{ + uint16 tmp_PC = GetRealPC_EXTERNAL(); + + #define P_local HuCPU.P + COMPRESS_FLAGS(); + + SFORMAT SFCPU[]= + { + SFVARN(tmp_PC, "PC"), + SFVARN(HuCPU.A, "A"), + SFVARN(HuCPU.P, "P"), + SFVARN(HuCPU.X, "X"), + SFVARN(HuCPU.Y, "Y"), + SFVARN(HuCPU.S, "S"), + SFVARN(HuCPU.mooPI, "PI"), + + SFVARN(HuCPU.IRQMask, "IRQMask"), + SFVARN(HuCPU.IRQMaskDelay, "IRQMaskDelay"), + SFARRAYN(HuCPU.MPR, 8, "MPR"), + SFVARN(HuCPU.timer_status, "timer_status"), + SFVARN(HuCPU.timer_value, "timer_value"), + SFVARN(HuCPU.timer_load, "timer_load"), + + + SFVARN(HuCPU.IRQlow, "IRQlow"), + SFVARN(HuCPU.in_block_move, "IBM"), + SFVARN(HuCPU.bmt_src, "IBM_SRC"), + SFVARN(HuCPU.bmt_dest, "IBM_DEST"), + SFVARN(HuCPU.bmt_length, "IBM_LENGTH"), + SFVARN(HuCPU.bmt_alternate, "IBM_ALTERNATE"), + + SFVARN(HuCPU.timestamp, "timestamp"), + SFVARN(HuCPU.timer_next_timestamp, "timer_next_timestamp"), + SFVARN(HuCPU.previous_next_user_event, "previous_next_user_event"), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, SFCPU, "CPU"); + + if(load) + { + // Update MPR cache + HuC6280_FlushMPRCache(); + + // This must be after the MPR cache is updated: + SetPC_EXTERNAL(tmp_PC); + } + + EXPAND_FLAGS(); + #undef P_local + + return(ret); +} + + +}; diff --git a/Mednafen/mednafen/pce_fast/huc6280.h b/Mednafen/mednafen/pce_fast/huc6280.h new file mode 100644 index 0000000000..0137d29b5e --- /dev/null +++ b/Mednafen/mednafen/pce_fast/huc6280.h @@ -0,0 +1,156 @@ +#ifndef _HuC6280H + +#define HUC6280_CRAZY_VERSION +//#define HUC6280_EXTRA_CRAZY + +#define HUC6280_LAZY_FLAGS + +namespace PCE_Fast +{ + + +typedef struct __HuC6280 +{ + #ifdef HUC6280_CRAZY_VERSION + uint8 *PC, *PC_base; + #else + uint16 PC; + #endif + + uint8 A,X,Y,S,P,mooPI; + #ifdef HUC6280_LAZY_FLAGS + uint32 ZNFlags; + #endif + uint8 MPR[9]; // 8, + 1 for PC overflow from $ffff to $10000 + uint8 *FastPageR[9]; + uint8 *Page1; + //uint8 *PAGE1_W; + //const uint8 *PAGE1_R; + + uint32 IRQlow; /* Simulated IRQ pin held low(or is it high?). + And other junk hooked on for speed reasons.*/ + int32 timestamp; + + uint8 IRQMask, IRQMaskDelay; + uint8 timer_status; + int32 timer_value, timer_load; + int32 timer_next_timestamp; + + uint32 in_block_move; + uint16 bmt_src, bmt_dest, bmt_length; + uint32 bmt_alternate; + #define IBM_TIA 1 + #define IBM_TAI 2 + #define IBM_TDD 3 + #define IBM_TII 4 + #define IBM_TIN 5 + + int32 previous_next_user_event; +} HuC6280; + +void HuC6280_Run(int32 cycles); +void HuC6280_ResetTS(void); + +extern HuC6280 HuCPU; +extern uint8 *HuCPUFastMap[0x100]; + +#define N_FLAG 0x80 +#define V_FLAG 0x40 +#define T_FLAG 0x20 +#define B_FLAG 0x10 +#define D_FLAG 0x08 +#define I_FLAG 0x04 +#define Z_FLAG 0x02 +#define C_FLAG 0x01 + +#define NTSC_CPU 1789772.7272727272727272 +#define PAL_CPU 1662607.125 + +#define MDFN_IQIRQ1 0x002 +#define MDFN_IQIRQ2 0x001 +#define MDFN_IQTIMER 0x004 +#define MDFN_IQRESET 0x020 + +void HuC6280_Init(void) MDFN_COLD; +void HuC6280_Reset(void) MDFN_COLD; +void HuC6280_Power(void) MDFN_COLD; + +void HuC6280_IRQBegin(int w); +void HuC6280_IRQEnd(int w); + +int HuC6280_StateAction(StateMem *sm, int load, int data_only); + +static INLINE void HuC6280_StealCycle(void) +{ + HuCPU.timestamp++; +} + +static INLINE uint8 HuC6280_TimerRead(unsigned int A) +{ + #if 0 + return(HuCPU.timer_value | (PCEIODataBuffer & 0x80)); + #endif + + uint8 tvr = HuCPU.timer_value; + + if(HuCPU.timer_next_timestamp == HuCPU.timestamp) + tvr = (tvr - 1) & 0x7F; + + return(tvr | (PCEIODataBuffer & 0x80)); +} + +static INLINE void HuC6280_TimerWrite(unsigned int A, uint8 V) +{ + switch(A & 1) + { + case 0: HuCPU.timer_load = (V & 0x7F); break; + case 1: if(V & 1) // Enable counter + { + if(HuCPU.timer_status == 0) + { + HuCPU.timer_next_timestamp = HuCPU.timestamp + 1024; + HuCPU.timer_value = HuCPU.timer_load; + } + } + HuCPU.timer_status = V & 1; + break; + } +} + +static INLINE uint8 HuC6280_IRQStatusRead(unsigned int A) +{ + if(!(A & 2)) + return(PCEIODataBuffer); + + switch(A & 1) + { + case 0: + HuC6280_IRQEnd(MDFN_IQTIMER); + return(HuCPU.IRQMask ^ 0x7); + case 1: + { + int status = 0; + if(HuCPU.IRQlow & MDFN_IQIRQ1) status |= 2; + if(HuCPU.IRQlow & MDFN_IQIRQ2) status |= 1; + if(HuCPU.IRQlow & MDFN_IQTIMER) status |= 4; + return(status | (PCEIODataBuffer & ~(1 | 2 | 4))); + } + } + return(PCEIODataBuffer); +} + +static INLINE void HuC6280_IRQStatusWrite(unsigned int A, uint8 V) +{ + if(!(A & 2)) return; + switch(A & 1) + { + case 0: HuCPU.IRQMask = (V & 0x7) ^ 0x7; break; + case 1: HuC6280_IRQEnd(MDFN_IQTIMER); break; + } +} + + +}; + +#define _HuC6280H +#endif diff --git a/Mednafen/mednafen/pce_fast/huc6280_ops.inc b/Mednafen/mednafen/pce_fast/huc6280_ops.inc new file mode 100644 index 0000000000..2875ddab79 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/huc6280_ops.inc @@ -0,0 +1,635 @@ +/* Mednafen - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2002 Xodnizel + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define TEST_WEIRD_TFLAG(n) { if(HU_P & T_FLAG) puts("RAWR" n); } + +case 0x00: /* BRK */ + IncPC(); + HU_P &= ~T_FLAG; + PUSH_PC(); + + COMPRESS_FLAGS(); + PUSH(HU_P|B_FLAG); + HU_P|=I_FLAG; + HU_P &= ~D_FLAG; + HU_PI|=I_FLAG; + { + unsigned int npc; + + npc=RdOp(0xFFF6); + npc|=RdOp(0xFFF7)<<8; + + SetPC(npc); + } + break; + +case 0x40: /* RTI */ + HU_P = POP(); + EXPAND_FLAGS(); + /* HU_PI=HU_P; This is probably incorrect, so it's commented out. */ + HU_PI = HU_P; + POP_PC(); + + // T-flag handling here: + TEST_WEIRD_TFLAG("RTI"); + break; + +case 0x60: /* RTS */ + POP_PC_AP(); + break; + +case 0x48: /* PHA */ + PUSH(HU_A); + break; + +case 0x08: /* PHP */ + HU_P &= ~T_FLAG; + COMPRESS_FLAGS(); + PUSH(HU_P|B_FLAG); + break; + +case 0xDA: // PHX 65C02 + PUSH(HU_X); + break; + +case 0x5A: // PHY 65C02 + PUSH(HU_Y); + break; + +case 0x68: /* PLA */ + HU_A = POP(); + X_ZN(HU_A); + break; + +case 0xFA: // PLX 65C02 + HU_X = POP(); + X_ZN(HU_X); + break; + +case 0x7A: // PLY 65C02 + HU_Y = POP(); + X_ZN(HU_Y); + break; + +case 0x28: /* PLP */ + HU_P = POP(); + EXPAND_FLAGS(); + + // T-flag handling here: + TEST_WEIRD_TFLAG("PLP"); + break; + +case 0x4C: + { + unsigned int npc; + + npc = RdAtPC(); + IncPC(); + npc|=RdAtPC() << 8; + + SetPC(npc); + } + break; /* JMP ABSOLUTE */ + +case 0x6C: /* JMP Indirect */ + { + uint32 tmp; + unsigned int npc; + + GetAB(tmp); + + npc=RdMem(tmp); + npc|=RdMem(tmp + 1)<<8; + + SetPC(npc); + } + break; + +case 0x7C: // JMP Indirect X - 65C02 + { + uint32 tmp; + unsigned int npc; + + GetAB(tmp); + tmp += HU_X; + + npc=RdMem(tmp); + npc|=RdMem(tmp + 1)<<8; + + SetPC(npc); + } + break; + +case 0x20: /* JSR */ + { + unsigned int npc; + + npc = RdAtPC(); + + IncPC(); + PUSH_PC(); + + npc |= RdAtPC() <<8; + + SetPC(npc); + } + break; + +case 0xAA: /* TAX */ + HU_X=HU_A; + X_ZN(HU_A); + break; + +case 0x8A: /* TXA */ + HU_A=HU_X; + X_ZN(HU_A); + break; + +case 0xA8: /* TAY */ + HU_Y=HU_A; + X_ZN(HU_A); + break; +case 0x98: /* TYA */ + HU_A=HU_Y; + X_ZN(HU_A); + break; + +case 0xBA: /* TSX */ + HU_X=HU_S; + X_ZN(HU_X); + break; +case 0x9A: /* TXS */ + HU_S=HU_X; + break; + +case 0xCA: /* DEX */ + HU_X--; + X_ZN(HU_X); + break; +case 0x88: /* DEY */ + HU_Y--; + X_ZN(HU_Y); + break; + +case 0xE8: /* INX */ + HU_X++; + X_ZN(HU_X); + break; +case 0xC8: /* INY */ + HU_Y++; + X_ZN(HU_Y); + break; + +case 0x54: CSL; break; +case 0xD4: CSH; break; + +case 0x62: HU_A = 0; break; // CLA +case 0x82: HU_X = 0; break; // CLX +case 0xC2: HU_Y = 0; break; // CLY + +case 0x18: /* CLC */ + HU_P&=~C_FLAG; + break; + +case 0xD8: /* CLD */ + HU_P&=~D_FLAG; + break; + +case 0x58: /* CLI */ + if((HU_P & I_FLAG) && (HU_IRQlow & MDFN_IQIRQ1)) + { + uint8 moo_op = RdAtPC(); + if((moo_op == 0xAC || moo_op == 0xAD || moo_op == 0xAE) && + ((RdOp(GetRealPC() + 1) & 0x3) == 0) && ((RdOp(GetRealPC() + 2) & 0xFC) == 0)) + { + HU_IRQlow |= 0x200; + //puts("CLI/LDA madness!"); + } + } + HU_P&=~I_FLAG; + break; + +case 0xB8: /* CLV */ + HU_P&=~V_FLAG; + break; + +case 0x38: /* SEC */ + HU_P|=C_FLAG; + break; + +case 0xF8: /* SED */ + HU_P|=D_FLAG; + break; + +case 0x78: /* SEI */ + HU_P|=I_FLAG; + break; + +case 0xEA: /* NOP */ + break; + +case 0x0A: RMW_A(ASL); +case 0x06: RMW_ZP(ASL); +case 0x16: RMW_ZPX(ASL); +case 0x0E: RMW_AB(ASL); +case 0x1E: RMW_ABX(ASL); + +case 0x3A: RMW_A(DEC); +case 0xC6: RMW_ZP(DEC); +case 0xD6: RMW_ZPX(DEC); +case 0xCE: RMW_AB(DEC); +case 0xDE: RMW_ABX(DEC); + +case 0x1A: RMW_A(INC); // 65C02 +case 0xE6: RMW_ZP(INC); +case 0xF6: RMW_ZPX(INC); +case 0xEE: RMW_AB(INC); +case 0xFE: RMW_ABX(INC); + +case 0x4A: RMW_A(LSR); +case 0x46: RMW_ZP(LSR); +case 0x56: RMW_ZPX(LSR); +case 0x4E: RMW_AB(LSR); +case 0x5E: RMW_ABX(LSR); + +case 0x2A: RMW_A(ROL); +case 0x26: RMW_ZP(ROL); +case 0x36: RMW_ZPX(ROL); +case 0x2E: RMW_AB(ROL); +case 0x3E: RMW_ABX(ROL); + +case 0x6A: RMW_A(ROR); +case 0x66: RMW_ZP(ROR); +case 0x76: RMW_ZPX(ROR); +case 0x6E: RMW_AB(ROR); +case 0x7E: RMW_ABX(ROR); + +case 0x69: LD_IM(ADC); +case 0x65: LD_ZP(ADC); +case 0x75: LD_ZPX(ADC); +case 0x6D: LD_AB(ADC); +case 0x7D: LD_ABX(ADC); +case 0x79: LD_ABY(ADC); +case 0x72: LD_IND(ADC); +case 0x61: LD_IX(ADC); +case 0x71: LD_IY(ADC); + +case 0x29: LD_IM(AND); +case 0x25: LD_ZP(AND); +case 0x35: LD_ZPX(AND); +case 0x2D: LD_AB(AND); +case 0x3D: LD_ABX(AND); +case 0x39: LD_ABY(AND); +case 0x32: LD_IND(AND); +case 0x21: LD_IX(AND); +case 0x31: LD_IY(AND); + +case 0x89: LD_IM(BIT); +case 0x24: LD_ZP(BIT); +case 0x34: LD_ZPX(BIT); +case 0x2C: LD_AB(BIT); +case 0x3C: LD_ABX(BIT); + +case 0xC9: LD_IM(CMP); +case 0xC5: LD_ZP(CMP); +case 0xD5: LD_ZPX(CMP); +case 0xCD: LD_AB(CMP); +case 0xDD: LD_ABX(CMP); +case 0xD9: LD_ABY(CMP); +case 0xD2: LD_IND(CMP); +case 0xC1: LD_IX(CMP); +case 0xD1: LD_IY(CMP); + +case 0xE0: LD_IM(CPX); +case 0xE4: LD_ZP(CPX); +case 0xEC: LD_AB(CPX); + +case 0xC0: LD_IM(CPY); +case 0xC4: LD_ZP(CPY); +case 0xCC: LD_AB(CPY); + +case 0x49: LD_IM(EOR); +case 0x45: LD_ZP(EOR); +case 0x55: LD_ZPX(EOR); +case 0x4D: LD_AB(EOR); +case 0x5D: LD_ABX(EOR); +case 0x59: LD_ABY(EOR); +case 0x52: LD_IND(EOR); +case 0x41: LD_IX(EOR); +case 0x51: LD_IY(EOR); + +case 0xA9: LD_IM(LDA); +case 0xA5: LD_ZP(LDA); +case 0xB5: LD_ZPX(LDA); +case 0xAD: LD_AB(LDA); +case 0xBD: LD_ABX(LDA); +case 0xB9: LD_ABY(LDA); +case 0xB2: LD_IND(LDA); +case 0xA1: LD_IX(LDA); +case 0xB1: LD_IY(LDA); + +case 0xA2: LD_IM(LDX); +case 0xA6: LD_ZP(LDX); +case 0xB6: LD_ZPY(LDX); +case 0xAE: LD_AB(LDX); +case 0xBE: LD_ABY(LDX); + +case 0xA0: LD_IM(LDY); +case 0xA4: LD_ZP(LDY); +case 0xB4: LD_ZPX(LDY); +case 0xAC: LD_AB(LDY); +case 0xBC: LD_ABX(LDY); + +case 0x09: LD_IM(ORA); +case 0x05: LD_ZP(ORA); +case 0x15: LD_ZPX(ORA); +case 0x0D: LD_AB(ORA); +case 0x1D: LD_ABX(ORA); +case 0x19: LD_ABY(ORA); +case 0x12: LD_IND(ORA); +case 0x01: LD_IX(ORA); +case 0x11: LD_IY(ORA); + +case 0xE9: LD_IM(SBC); +case 0xE5: LD_ZP(SBC); +case 0xF5: LD_ZPX(SBC); +case 0xED: LD_AB(SBC); +case 0xFD: LD_ABX(SBC); +case 0xF9: LD_ABY(SBC); +case 0xF2: LD_IND(SBC); +case 0xE1: LD_IX(SBC); +case 0xF1: LD_IY(SBC); + +case 0x85: ST_ZP(HU_A); +case 0x95: ST_ZPX(HU_A); +case 0x8D: ST_AB(HU_A); +case 0x9D: ST_ABX(HU_A); +case 0x99: ST_ABY(HU_A); +case 0x92: ST_IND(HU_A); +case 0x81: ST_IX(HU_A); +case 0x91: ST_IY(HU_A); + +case 0x86: ST_ZP(HU_X); +case 0x96: ST_ZPY(HU_X); +case 0x8E: ST_AB(HU_X); + +case 0x84: ST_ZP(HU_Y); +case 0x94: ST_ZPX(HU_Y); +case 0x8C: ST_AB(HU_Y); + +/* BBRi */ +case 0x0F: LD_ZP(BBRi(0)); +case 0x1F: LD_ZP(BBRi(1)); +case 0x2F: LD_ZP(BBRi(2)); +case 0x3F: LD_ZP(BBRi(3)); +case 0x4F: LD_ZP(BBRi(4)); +case 0x5F: LD_ZP(BBRi(5)); +case 0x6F: LD_ZP(BBRi(6)); +case 0x7F: LD_ZP(BBRi(7)); + +/* BBSi */ +case 0x8F: LD_ZP(BBSi(0)); +case 0x9F: LD_ZP(BBSi(1)); +case 0xAF: LD_ZP(BBSi(2)); +case 0xBF: LD_ZP(BBSi(3)); +case 0xCF: LD_ZP(BBSi(4)); +case 0xDF: LD_ZP(BBSi(5)); +case 0xEF: LD_ZP(BBSi(6)); +case 0xFF: LD_ZP(BBSi(7)); + +/* BRA */ +case 0x80: BRA; break; + +/* BSR */ +case 0x44: + { + PUSH_PC(); + BRA; + } + break; + +/* BCC */ +case 0x90: JR(!(HU_P&C_FLAG)); break; + +/* BCS */ +case 0xB0: JR(HU_P&C_FLAG); break; + +/* BVC */ +case 0x50: JR(!(HU_P&V_FLAG)); break; + +/* BVS */ +case 0x70: JR(HU_P&V_FLAG); break; + +#ifdef HUC6280_LAZY_FLAGS + + /* BEQ */ + case 0xF0: JR(!(HU_ZNFlags & 0xFF)); break; + + /* BNE */ + case 0xD0: JR((HU_ZNFlags & 0xFF)); break; + + /* BMI */ + case 0x30: JR((HU_ZNFlags & 0x80000000)); break; + + /* BPL */ + case 0x10: JR(!(HU_ZNFlags & 0x80000000)); break; + +#else + + /* BEQ */ + case 0xF0: JR(HU_P&Z_FLAG); break; + + /* BNE */ + case 0xD0: JR(!(HU_P&Z_FLAG)); break; + + /* BMI */ + case 0x30: JR(HU_P&N_FLAG); break; + + /* BPL */ + case 0x10: JR(!(HU_P&N_FLAG)); break; + +#endif + +// RMB 65SC02 +case 0x07: RMW_ZP(RMB(0)); +case 0x17: RMW_ZP(RMB(1)); +case 0x27: RMW_ZP(RMB(2)); +case 0x37: RMW_ZP(RMB(3)); +case 0x47: RMW_ZP(RMB(4)); +case 0x57: RMW_ZP(RMB(5)); +case 0x67: RMW_ZP(RMB(6)); +case 0x77: RMW_ZP(RMB(7)); + +// SMB 65SC02 +case 0x87: RMW_ZP(SMB(0)); +case 0x97: RMW_ZP(SMB(1)); +case 0xa7: RMW_ZP(SMB(2)); +case 0xb7: RMW_ZP(SMB(3)); +case 0xc7: RMW_ZP(SMB(4)); +case 0xd7: RMW_ZP(SMB(5)); +case 0xe7: RMW_ZP(SMB(6)); +case 0xf7: RMW_ZP(SMB(7)); + +// STZ 65C02 +case 0x64: ST_ZP(0); +case 0x74: ST_ZPX(0); +case 0x9C: ST_AB(0); +case 0x9E: ST_ABX(0); + +// TRB 65SC02 +case 0x14: RMW_ZP(TRB); +case 0x1C: RMW_AB(TRB); + +// TSB 65SC02 +case 0x04: RMW_ZP(TSB); +case 0x0C: RMW_AB(TSB); + +// TST +case 0x83: { uint8 zoomhack=RdAtPC(); IncPC(); LD_ZP(TST); } +case 0xA3: { uint8 zoomhack=RdAtPC(); IncPC(); LD_ZPX(TST); } +case 0x93: { uint8 zoomhack=RdAtPC(); IncPC(); LD_AB(TST); } +case 0xB3: { uint8 zoomhack=RdAtPC(); IncPC(); LD_ABX(TST); } + +case 0x22: // SAX(amaphone!) + { + uint8 tmp = HU_X; + HU_X = HU_A; + HU_A = tmp; + } + break; + +case 0x42: // SAY(what?) + { + uint8 tmp = HU_Y; + HU_Y = HU_A; + HU_A = tmp; + } + break; + +case 0x02: // SXY + { + uint8 tmp = HU_X; + HU_X = HU_Y; + HU_Y = tmp; + } + break; + +case 0x73: // TII + LD_BMT(BMT_TII); + +case 0xC3: // TDD + LD_BMT(BMT_TDD); + +case 0xD3: // TIN + LD_BMT(BMT_TIN); + +case 0xE3: // TIA + LD_BMT(BMT_TIA); + +case 0xF3: // TAI + LD_BMT(BMT_TAI); + +case 0x43: // TMAi + LD_IM(TMA); + +case 0x53: // TAMi + LD_IM(TAM); + +case 0x03: // ST0 + LD_IM(ST0); + +case 0x13: // ST1 + LD_IM(ST1); + +case 0x23: // ST2 + LD_IM(ST2); + + +case 0xF4: /* SET */ + { + // AND, EOR, ORA, ADC + uint8 Abackup = HU_A; + + ADDCYC(3); + HU_A = HU_Page1[HU_X]; //PAGE1_R[HU_X]; + + switch(RdAtPC()) + { + default: //puts("Bad SET"); + break; + + case 0x69: IncPC(); LD_IM(ADC); + case 0x65: IncPC(); LD_ZP(ADC); + case 0x75: IncPC(); LD_ZPX(ADC); + case 0x6D: IncPC(); LD_AB(ADC); + case 0x7D: IncPC(); LD_ABX(ADC); + case 0x79: IncPC(); LD_ABY(ADC); + case 0x72: IncPC(); LD_IND(ADC); + case 0x61: IncPC(); LD_IX(ADC); + case 0x71: IncPC(); LD_IY(ADC); + + case 0x29: IncPC(); LD_IM(AND); + case 0x25: IncPC(); LD_ZP(AND); + case 0x35: IncPC(); LD_ZPX(AND); + case 0x2D: IncPC(); LD_AB(AND); + case 0x3D: IncPC(); LD_ABX(AND); + case 0x39: IncPC(); LD_ABY(AND); + case 0x32: IncPC(); LD_IND(AND); + case 0x21: IncPC(); LD_IX(AND); + case 0x31: IncPC(); LD_IY(AND); + + case 0x49: IncPC(); LD_IM(EOR); + case 0x45: IncPC(); LD_ZP(EOR); + case 0x55: IncPC(); LD_ZPX(EOR); + case 0x4D: IncPC(); LD_AB(EOR); + case 0x5D: IncPC(); LD_ABX(EOR); + case 0x59: IncPC(); LD_ABY(EOR); + case 0x52: IncPC(); LD_IND(EOR); + case 0x41: IncPC(); LD_IX(EOR); + case 0x51: IncPC(); LD_IY(EOR); + + case 0x09: IncPC(); LD_IM(ORA); + case 0x05: IncPC(); LD_ZP(ORA); + case 0x15: IncPC(); LD_ZPX(ORA); + case 0x0D: IncPC(); LD_AB(ORA); + case 0x1D: IncPC(); LD_ABX(ORA); + case 0x19: IncPC(); LD_ABY(ORA); + case 0x12: IncPC(); LD_IND(ORA); + case 0x01: IncPC(); LD_IX(ORA); + case 0x11: IncPC(); LD_IY(ORA); + } + HU_Page1[HU_X] /*PAGE1_W[HU_X]*/ = HU_A; + HU_A = Abackup; + } + break; + +case 0xFC: + { + int32 ec_tmp; + ec_tmp = next_event - HuCPU.timestamp; + if(ec_tmp > 0) + { + ADDCYC(ec_tmp); + } + } + break; + +default: //MDFN_printf("Bad %02x at $%04x\n", b1, GetRealPC()); + break; diff --git a/Mednafen/mednafen/pce_fast/input.cpp b/Mednafen/mednafen/pce_fast/input.cpp new file mode 100644 index 0000000000..2bfa54b5f6 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/input.cpp @@ -0,0 +1,322 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include "input.h" +#include "huc.h" +#include + +namespace PCE_Fast +{ + +static int InputTypes[5]; +static uint8 *data_ptr[5]; + +static bool AVPad6Which[5]; // Lower(8 buttons) or higher(4 buttons). + +uint16 pce_jp_data[5]; + +static int64 mouse_last_meow[5]; + +static int32 mouse_x[5], mouse_y[5]; +static uint16 mouse_rel[5]; + +uint8 pce_mouse_button[5]; +uint8 mouse_index[5]; + +static uint8 sel; +static uint8 read_index = 0; + +static bool DisableSR; + +static void SyncSettings(void); + +void PCEINPUT_SettingChanged(const char *name) +{ + SyncSettings(); +} + +void PCEINPUT_Init(void) +{ + SyncSettings(); +} + +void PCEINPUT_SetInput(unsigned port, const char *type, uint8 *ptr) +{ + assert(port < 5); + + if(!strcasecmp(type, "gamepad")) + InputTypes[port] = 1; + else if(!strcasecmp(type, "mouse")) + InputTypes[port] = 2; + else + InputTypes[port] = 0; + data_ptr[port] = (uint8 *)ptr; +} + +void INPUT_TransformInput(void) +{ + for(int x = 0; x < 5; x++) + { + if(InputTypes[x] == 1) + { + if(DisableSR) + { + uint16 tmp = MDFN_de16lsb(data_ptr[x]); + + if((tmp & 0xC) == 0xC) + tmp &= ~0xC; + + MDFN_en16lsb(data_ptr[x], tmp); + } + } + } +} + +void INPUT_Frame(void) +{ + for(int x = 0; x < 5; x++) + { + if(InputTypes[x] == 1) + { + uint16 new_data = data_ptr[x][0] | (data_ptr[x][1] << 8); + pce_jp_data[x] = new_data; + } + else if(InputTypes[x] == 2) + { + mouse_x[x] += (int32)MDFN_de32lsb(data_ptr[x] + 0); + mouse_y[x] += (int32)MDFN_de32lsb(data_ptr[x] + 4); + pce_mouse_button[x] = *(uint8 *)(data_ptr[x] + 8); + } + } +} + +void INPUT_FixTS(void) +{ + for(int x = 0; x < 5; x++) + { + if(InputTypes[x] == 2) + mouse_last_meow[x] -= HuCPU.timestamp; + } +} + +static INLINE bool CheckLM(int n) +{ + if((int64)HuCPU.timestamp - mouse_last_meow[n] > 10000) + { + mouse_last_meow[n] = HuCPU.timestamp; + + int32 rel_x = (int32)((0-mouse_x[n])); + int32 rel_y = (int32)((0-mouse_y[n])); + + if(rel_x < -127) rel_x = -127; + if(rel_x > 127) rel_x = 127; + if(rel_y < -127) rel_y = -127; + if(rel_y > 127) rel_y = 127; + + mouse_rel[n] = ((rel_x & 0xF0) >> 4) | ((rel_x & 0x0F) << 4); + mouse_rel[n] |= (((rel_y & 0xF0) >> 4) | ((rel_y & 0x0F) << 4)) << 8; + + mouse_x[n] += (int32)(rel_x); + mouse_y[n] += (int32)(rel_y); + + return(1); + } + return(0); +} + +uint8 INPUT_Read(unsigned int A) +{ + uint8 ret = 0xF; + int tmp_ri = read_index; + + if(tmp_ri > 4) + ret ^= 0xF; + else + { + if(!InputTypes[tmp_ri]) + ret ^= 0xF; + else if(InputTypes[tmp_ri] == 2) // Mouse + { + if(sel & 1) + { + CheckLM(tmp_ri); + ret ^= 0xF; + ret ^= mouse_rel[tmp_ri] & 0xF; + + mouse_rel[tmp_ri] >>= 4; + } + else + { + if(pce_mouse_button[tmp_ri] & 1) + ret ^= 0x3; //pce_mouse_button[tmp_ri]; + + if(pce_mouse_button[tmp_ri] & 0x2) + ret ^= 0x8; + } + } + else + { + if(InputTypes[tmp_ri] == 1) // Gamepad + { + if(AVPad6Which[tmp_ri] && (pce_jp_data[tmp_ri] & 0x1000)) + { + if(sel & 1) + ret ^= 0x0F; + else + ret ^= (pce_jp_data[tmp_ri] >> 8) & 0x0F; + } + else + { + if(sel & 1) + ret ^= (pce_jp_data[tmp_ri] >> 4) & 0x0F; + else + ret ^= pce_jp_data[tmp_ri] & 0x0F; + } + if(!(sel & 1)) + AVPad6Which[tmp_ri] = !AVPad6Which[tmp_ri]; + } + } + } + + if(!PCE_IsCD) + ret |= 0x80; // Set when CDROM is not attached + + //ret |= 0x40; // PC Engine if set, TG16 if clear. Let's leave it clear, PC Engine games don't seem to mind if it's clear, but TG16 games barf if it's set. + + ret |= 0x30; // Always-set? + + return(ret); +} + +void INPUT_Write(unsigned int A, uint8 V) +{ + if((V & 1) && !(sel & 2) && (V & 2)) + { + read_index = 0; + } + else if((V & 1) && !(sel & 1)) + { + if(read_index < 255) + read_index++; + } + sel = V & 3; +} + +int INPUT_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYB(AVPad6Which, 5), + + SFVARN(mouse_last_meow[0], "mlm_0"), + SFVARN(mouse_last_meow[1], "mlm_1"), + SFVARN(mouse_last_meow[2], "mlm_2"), + SFVARN(mouse_last_meow[3], "mlm_3"), + SFVARN(mouse_last_meow[4], "mlm_4"), + + SFARRAY32(mouse_x, 5), + SFARRAY32(mouse_y, 5), + SFARRAY16(mouse_rel, 5), + SFARRAY(pce_mouse_button, 5), + SFARRAY(mouse_index, 5), + + SFARRAY16(pce_jp_data, 5), + SFVAR(sel), + SFVAR(read_index), + SFEND + }; + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "JOY"); + + return(ret); +} + +static const char* ModeSwitchPositions[] = +{ + gettext_noop("2-button"), + gettext_noop("6-button"), +}; + +static const IDIISG GamepadIDII = +{ + { "i", "I", 12, IDIT_BUTTON_CAN_RAPID, NULL }, + { "ii", "II", 11, IDIT_BUTTON_CAN_RAPID, NULL }, + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "run", "RUN", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "iii", "III", 10, IDIT_BUTTON, NULL }, + { "iv", "IV", 7, IDIT_BUTTON, NULL }, + { "v", "V", 8, IDIT_BUTTON, NULL }, + { "vi", "VI", 9, IDIT_BUTTON, NULL }, + IDIIS_Switch("mode_select", "Mode", 6, ModeSwitchPositions, sizeof(ModeSwitchPositions) / sizeof(ModeSwitchPositions[0])), +}; + +static const IDIISG MouseIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS_REL }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL }, + { "left", "Left Button", 0, IDIT_BUTTON, NULL }, + { "right", "Right Button", 1, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII + }, + + // Mouse + { + "mouse", + "Mouse", + NULL, + MouseIDII + }, + +}; + +const std::vector PCEPortInfo = +{ + { "port1", "Port 1", InputDeviceInfo, "gamepad" }, + { "port2", "Port 2", InputDeviceInfo, "gamepad" }, + { "port3", "Port 3", InputDeviceInfo, "gamepad" }, + { "port4", "Port 4", InputDeviceInfo, "gamepad" }, + { "port5", "Port 5", InputDeviceInfo, "gamepad" }, +}; + +static void SyncSettings(void) +{ + MDFNGameInfo->mouse_sensitivity = MDFN_GetSettingF("pce_fast.mouse_sensitivity"); + DisableSR = MDFN_GetSettingB("pce_fast.disable_softreset"); +} + +}; diff --git a/Mednafen/mednafen/pce_fast/input.h b/Mednafen/mednafen/pce_fast/input.h new file mode 100644 index 0000000000..0cacb725bd --- /dev/null +++ b/Mednafen/mednafen/pce_fast/input.h @@ -0,0 +1,20 @@ +#ifndef __PCE_INPUT_H +#define __PCE_INPUT_H + +namespace PCE_Fast +{ + +void PCEINPUT_Init(void); +void PCEINPUT_SettingChanged(const char *name); +void PCEINPUT_SetInput(unsigned port, const char *type, uint8 *ptr); +uint8 INPUT_Read(unsigned int A); +void INPUT_Write(unsigned int A, uint8 V); +void INPUT_Frame(void); +void INPUT_TransformInput(void); +int INPUT_StateAction(StateMem *sm, int load, int data_only); +extern const std::vector PCEPortInfo; +void INPUT_FixTS(void); + +}; + +#endif diff --git a/Mednafen/mednafen/pce_fast/ioread.inc b/Mednafen/mednafen/pce_fast/ioread.inc new file mode 100644 index 0000000000..6c58c8a5ae --- /dev/null +++ b/Mednafen/mednafen/pce_fast/ioread.inc @@ -0,0 +1,136 @@ + A &= 0x1FFF; + +#if HAVE_COMPUTED_GOTO + const void * const IOReadHandlers[0x20] = + { + &&VDC_00, &&VDC_01, &&VDC_02, &&VDC_03, + &&VCE_00, &&VCE_01, &&VCE_02, &&VCE_03, + &&PSG_00, &&PSG_01, &&PSG_02, &&PSG_03, + &&TIMER_00, &&TIMER_01, &&TIMER_02, &&TIMER_03, + &&INPUT_00, &&INPUT_01, &&INPUT_02, &&INPUT_03, + &&IRQ_00, &&IRQ_01, &&IRQ_02, &&IRQ_03, + &&CDROM_00, &&CDROM_01, &&CDROM_02, &&CDROM_03, + &&EXP_00, &&EXP_01, &&EXP_02, &&EXP_03 + }; + + goto *IOReadHandlers[((A & 0x1C00) >> 8) | (A & 0x3)]; + { + #define PCEF_CASEL(label, caseval) label +#else + #define PCEF_CASEL(label, caseval) case (caseval) + + switch(((A & 0x1C00) >> 8) | (A & 0x3)) + { +#endif +// +// +// + +#if IOREAD_SGX==1 + PCEF_CASEL(VDC_00, 0x00): + PCEF_CASEL(VDC_01, 0x01): + PCEF_CASEL(VDC_02, 0x02): + PCEF_CASEL(VDC_03, 0x03): + HuC6280_StealCycle(); + return(VDC_Read(A & 0x1F, TRUE)); +#else + + PCEF_CASEL(VDC_00, 0x00): + HuC6280_StealCycle(); + return(VDC_Read(0, FALSE)); + + PCEF_CASEL(VDC_01, 0x01): + HuC6280_StealCycle(); + return(VDC_Read(1, FALSE)); + + PCEF_CASEL(VDC_02, 0x02): + HuC6280_StealCycle(); + return(VDC_Read(2, FALSE)); + + PCEF_CASEL(VDC_03, 0x03): + HuC6280_StealCycle(); + return(VDC_Read(3, FALSE)); +#endif + + PCEF_CASEL(VCE_00, 0x04): + PCEF_CASEL(VCE_01, 0x05): + PCEF_CASEL(VCE_02, 0x06): + PCEF_CASEL(VCE_03, 0x07): + HuC6280_StealCycle(); + return(VCE_Read(A)); + + PCEF_CASEL(PSG_00, 0x08): + PCEF_CASEL(PSG_01, 0x09): + PCEF_CASEL(PSG_02, 0x0A): + PCEF_CASEL(PSG_03, 0x0B): + if(HuCPU.in_block_move) + return(0); + return(PCEIODataBuffer); + + + PCEF_CASEL(TIMER_00, 0x0C): + PCEF_CASEL(TIMER_01, 0x0D): + PCEF_CASEL(TIMER_02, 0x0E): + PCEF_CASEL(TIMER_03, 0x0F): + if(HuCPU.in_block_move) + return(0); + { + uint8 ret = HuC6280_TimerRead(A); + PCEIODataBuffer = ret; + return(ret); + } + + PCEF_CASEL(INPUT_00, 0x10): + PCEF_CASEL(INPUT_01, 0x11): + PCEF_CASEL(INPUT_02, 0x12): + PCEF_CASEL(INPUT_03, 0x13): + if(HuCPU.in_block_move) + return(0); + { + uint8 ret = INPUT_Read(A); + PCEIODataBuffer = ret; + return(ret); + } + + PCEF_CASEL(IRQ_00, 0x14): + PCEF_CASEL(IRQ_01, 0x15): + PCEF_CASEL(IRQ_02, 0x16): + PCEF_CASEL(IRQ_03, 0x17): + if(HuCPU.in_block_move) + return(0); + { + uint8 ret = HuC6280_IRQStatusRead(A); + PCEIODataBuffer = ret; + return(ret); + } + + PCEF_CASEL(CDROM_00, 0x18): + PCEF_CASEL(CDROM_01, 0x19): + PCEF_CASEL(CDROM_02, 0x1A): + PCEF_CASEL(CDROM_03, 0x1B): + if(!PCE_IsCD) + return(0xFF); + + if((A & 0x1E00) == 0x1A00) + { + if(arcade_card) + return(arcade_card->Read(A & 0x1FFF)); + else + return(0); + } + else + { + return(PCECD_Read(HuCPU.timestamp * 3, A)); + } + + PCEF_CASEL(EXP_00, 0x1C): + PCEF_CASEL(EXP_01, 0x1D): + PCEF_CASEL(EXP_02, 0x1E): + PCEF_CASEL(EXP_03, 0x1F): + if(IsHES) + return(ReadIBP(A)); + return(0xFF); + + } + #undef PCEF_CASEL + //printf("Meow: %08x, %02x:%04x\n", A, A >> 13, A & 0x1FFF); diff --git a/Mednafen/mednafen/pce_fast/pce.cpp b/Mednafen/mednafen/pce_fast/pce.cpp new file mode 100644 index 0000000000..0a002283d7 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/pce.cpp @@ -0,0 +1,757 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pce.h" +#include +#include "vdc.h" +#include "psg.h" +#include "input.h" +#include "huc.h" +#include "pcecd.h" +#include "pcecd_drive.h" +#include "hes.h" +#include +#include +#include + +extern MDFNGI EmulatedPCE_Fast; + +namespace PCE_Fast +{ + +static std::vector *cdifs = NULL; +static PCEFast_PSG *psg = NULL; +extern ArcadeCard *arcade_card; // Bah, lousy globals. + +static Blip_Buffer* sbuf = NULL; //[2]; + +bool PCE_ACEnabled; + +static bool IsSGX; +static bool IsHES; +int pce_overclocked; + +// Statically allocated for speed...or something. +uint8 ROMSpace[0x88 * 8192 + 8192]; // + 8192 for PC-as-pointer safety padding + +uint8 BaseRAM[32768 + 8192]; // 8KB for PCE, 32KB for Super Grafx // + 8192 for PC-as-pointer safety padding + +uint8 PCEIODataBuffer; +readfunc PCERead[0x100]; +writefunc PCEWrite[0x100]; + +static DECLFR(PCEBusRead) +{ + //printf("BUS Read: %02x %04x\n", A >> 13, A); + return(0xFF); +} + +static DECLFW(PCENullWrite) +{ + //printf("Null Write: %02x, %08x %02x\n", A >> 13, A, V); +} + +static DECLFR(BaseRAMReadSGX) +{ + return((BaseRAM - (0xF8 * 8192))[A]); +} + +static DECLFW(BaseRAMWriteSGX) +{ + (BaseRAM - (0xF8 * 8192))[A] = V; +} + +static DECLFR(BaseRAMRead) +{ + return((BaseRAM - (0xF8 * 8192))[A]); +} + +static DECLFR(BaseRAMRead_Mirrored) +{ + return(BaseRAM[A & 0x1FFF]); +} + +static DECLFW(BaseRAMWrite) +{ + (BaseRAM - (0xF8 * 8192))[A] = V; +} + +static DECLFW(BaseRAMWrite_Mirrored) +{ + BaseRAM[A & 0x1FFF] = V; +} + +static DECLFR(IORead) +{ + #define IOREAD_SGX 0 + #include "ioread.inc" + #undef IOREAD_SGX +} + +static DECLFR(IOReadSGX) +{ + #define IOREAD_SGX 1 + #include "ioread.inc" + #undef IOREAD_SGX +} + +static DECLFW(IOWrite) +{ + A &= 0x1FFF; + + switch(A >> 10) + { + case 0: HuC6280_StealCycle(); + VDC_Write(A, V); + break; + + case 1: HuC6280_StealCycle(); + VCE_Write(A, V); + break; + + case 2: PCEIODataBuffer = V; + psg->Write(HuCPU.timestamp / pce_overclocked, A, V); + break; + + case 3: PCEIODataBuffer = V; + HuC6280_TimerWrite(A, V); + break; + + case 4: PCEIODataBuffer = V; INPUT_Write(A, V); break; + case 5: PCEIODataBuffer = V; HuC6280_IRQStatusWrite(A, V); break; + case 6: + if(!PCE_IsCD) + break; + + if((A & 0x1E00) == 0x1A00) + { + if(arcade_card) + arcade_card->Write(A & 0x1FFF, V); + } + else + { + PCECD_Write(HuCPU.timestamp * 3, A, V); + } + break; + + case 7: break; // Expansion. + } +} + +static void PCECDIRQCB(bool asserted) +{ + if(asserted) + HuC6280_IRQBegin(MDFN_IQIRQ2); + else + HuC6280_IRQEnd(MDFN_IQIRQ2); +} + +void PCE_InitCD(void) +{ + PCECD_Settings cd_settings; + memset(&cd_settings, 0, sizeof(PCECD_Settings)); + + cd_settings.CDDA_Volume = (double)MDFN_GetSettingUI("pce_fast.cddavolume") / 100; + cd_settings.CD_Speed = MDFN_GetSettingUI("pce_fast.cdspeed"); + + cd_settings.ADPCM_Volume = (double)MDFN_GetSettingUI("pce_fast.adpcmvolume") / 100; + cd_settings.ADPCM_LPF = MDFN_GetSettingB("pce_fast.adpcmlp"); + + if(cd_settings.CDDA_Volume != 1.0) + MDFN_printf(_("CD-DA Volume: %d%%\n"), (int)(100 * cd_settings.CDDA_Volume)); + + if(cd_settings.ADPCM_Volume != 1.0) + MDFN_printf(_("ADPCM Volume: %d%%\n"), (int)(100 * cd_settings.ADPCM_Volume)); + + PCECD_Init(&cd_settings, PCECDIRQCB, PCE_MASTER_CLOCK, pce_overclocked, sbuf); +} + + +static void LoadCommon(void); +static void LoadCommonPre(void); + +static bool TestMagic(MDFNFILE *fp) +{ + if(strcasecmp(fp->ext, "hes") && strcasecmp(fp->ext, "pce") && strcasecmp(fp->ext, "sgx")) + return false; + + return true; +} + +static void Cleanup(void) MDFN_COLD; +static void Cleanup(void) +{ + if(IsHES) + HES_Close(); + else + { + HuC_Kill(); + } + + VDC_Close(); + + if(psg) + { + delete psg; + psg = NULL; + } + + if(sbuf) + { + delete[] sbuf; + sbuf = NULL; + } + + cdifs = NULL; +} + +static const struct +{ + uint32 crc; + const char* name; +} sgx_table[] = +{ + { 0xbebfe042, "Darius Plus", }, + { 0x4c2126b0, "Aldynes" }, + { 0x8c4588e2, "1941 - Counter Attack" }, + { 0x1f041166, "Madouou Granzort" }, + { 0xb486a8ed, "Daimakaimura" }, + { 0x3b13af61, "Battle Ace" }, +}; + +static void Load(MDFNFILE *fp) +{ + try + { + uint8 hes_header[4]; + + IsHES = false; + IsSGX = false; + + fp->read(hes_header, 4); + fp->seek(0, SEEK_SET); + + if(!memcmp(hes_header, "HESM", 4)) + IsHES = true; + + LoadCommonPre(); + + for(int x = 0; x < 0x100; x++) + { + PCERead[x] = PCEBusRead; + PCEWrite[x] = PCENullWrite; + } + + if(IsHES) + HES_Load(fp); + else + { + uint32 crc; + + crc = HuC_Load(fp); + + if(!strcasecmp(fp->ext, "sgx")) + IsSGX = true; + else + { + for(auto const& e : sgx_table) + { + if(e.crc == crc) + { + IsSGX = true; + MDFN_printf(_("SuperGrafx: %s\n"), e.name); + break; + } + } + } + } + + LoadCommon(); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void LoadCommonPre(void) +{ + // FIXME: Make these globals less global! + pce_overclocked = MDFN_GetSettingUI("pce_fast.ocmultiplier"); + PCE_ACEnabled = MDFN_GetSettingB("pce_fast.arcadecard"); + + if(pce_overclocked > 1) + MDFN_printf(_("CPU overclock: %dx\n"), pce_overclocked); + + if(MDFN_GetSettingUI("pce_fast.cdspeed") > 1) + MDFN_printf(_("CD-ROM speed: %ux\n"), (unsigned int)MDFN_GetSettingUI("pce_fast.cdspeed")); + + memset(HuCPUFastMap, 0, sizeof(HuCPUFastMap)); + for(int x = 0; x < 0x100; x++) + { + PCERead[x] = PCEBusRead; + PCEWrite[x] = PCENullWrite; + } + + MDFNMP_Init(1024, (1 << 21) / 1024); + + sbuf = new Blip_Buffer[2]; +} + +static void LoadCommon(void) +{ + IsSGX |= MDFN_GetSettingB("pce_fast.forcesgx") ? 1 : 0; + + if(IsHES) + IsSGX = 1; + // Don't modify IsSGX past this point. + + VDC_Init(IsSGX); + + if(IsSGX) + { + MDFN_printf("SuperGrafx Emulation Enabled.\n"); + PCERead[0xF8] = PCERead[0xF9] = PCERead[0xFA] = PCERead[0xFB] = BaseRAMReadSGX; + PCEWrite[0xF8] = PCEWrite[0xF9] = PCEWrite[0xFA] = PCEWrite[0xFB] = BaseRAMWriteSGX; + + for(int x = 0xf8; x < 0xfb; x++) + HuCPUFastMap[x] = BaseRAM - 0xf8 * 8192; + + PCERead[0xFF] = IOReadSGX; + } + else + { + PCERead[0xF8] = BaseRAMRead; + PCERead[0xF9] = PCERead[0xFA] = PCERead[0xFB] = BaseRAMRead_Mirrored; + + PCEWrite[0xF8] = BaseRAMWrite; + PCEWrite[0xF9] = PCEWrite[0xFA] = PCEWrite[0xFB] = BaseRAMWrite_Mirrored; + + for(int x = 0xf8; x < 0xfb; x++) + HuCPUFastMap[x] = BaseRAM - x * 8192; + + PCERead[0xFF] = IORead; + } + + MDFNMP_AddRAM(IsSGX ? 32768 : 8192, 0xf8 * 8192, BaseRAM); + + PCEWrite[0xFF] = IOWrite; + + HuC6280_Init(); + + psg = new PCEFast_PSG(sbuf); + + psg->SetVolume(1.0); + + if(PCE_IsCD) + { + unsigned int cdpsgvolume = MDFN_GetSettingUI("pce_fast.cdpsgvolume"); + + if(cdpsgvolume != 100) + { + MDFN_printf(_("CD PSG Volume: %d%%\n"), cdpsgvolume); + } + + psg->SetVolume(0.678 * cdpsgvolume / 100); + + } + + PCEINPUT_Init(); + + PCE_Power(); + + MDFNGameInfo->LayerNames = IsSGX ? "BG0\0SPR0\0BG1\0SPR1\0" : "Background\0Sprites\0"; + MDFNGameInfo->fps = (uint32)((double)7159090.90909090 / 455 / 263 * 65536 * 256); + + // Clean this up: + if(!MDFN_GetSettingB("pce_fast.correct_aspect")) + MDFNGameInfo->fb_width = 682; + + if(!IsHES) + { + MDFNGameInfo->nominal_width = MDFN_GetSettingB("pce_fast.correct_aspect") ? 288 : 341; + MDFNGameInfo->nominal_height = MDFN_GetSettingUI("pce_fast.slend") - MDFN_GetSettingUI("pce_fast.slstart") + 1; + + MDFNGameInfo->lcm_width = MDFN_GetSettingB("pce_fast.correct_aspect") ? 1024 : 341; + MDFNGameInfo->lcm_height = MDFNGameInfo->nominal_height; + } +} + +static bool TestMagicCD(std::vector *CDInterfaces) +{ + static const uint8 magic_test[0x20] = { 0x82, 0xB1, 0x82, 0xCC, 0x83, 0x76, 0x83, 0x8D, 0x83, 0x4F, 0x83, 0x89, 0x83, 0x80, 0x82, 0xCC, + 0x92, 0x98, 0x8D, 0xEC, 0x8C, 0xA0, 0x82, 0xCD, 0x8A, 0x94, 0x8E, 0xAE, 0x89, 0xEF, 0x8E, 0xD0 + }; + uint8 sector_buffer[2048]; + CDIF *cdiface = (*CDInterfaces)[0]; + CDUtility::TOC toc; + bool ret = FALSE; + + memset(sector_buffer, 0, sizeof(sector_buffer)); + + cdiface->ReadTOC(&toc); + + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1); + + if(!memcmp((char*)sector_buffer, (char *)magic_test, 0x20)) + ret = TRUE; + + // PCE CD BIOS apparently only looks at the first data track. + break; + } + } + + + // If it's a PC-FX CD(Battle Heat), return false. + // This is very kludgy. + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1); + if(!strncmp("PC-FX:Hu_CD-ROM", (char*)sector_buffer, strlen("PC-FX:Hu_CD-ROM"))) + { + return(false); + } + } + } + + + // Now, test for the Games Express CD games. The GE BIOS seems to always look at sector 0x10, but only if the first track is a + // data track. + if(toc.first_track == 1 && (toc.tracks[1].control & 0x4)) + { + if(cdiface->ReadSector(sector_buffer, 0x10, 1)) + { + if(!memcmp((char *)sector_buffer + 0x8, "HACKER CD ROM SYSTEM", 0x14)) + { + ret = TRUE; + } + } + } + + return(ret); +} + +static void LoadCD(std::vector *CDInterfaces) +{ + try + { + std::string bios_path = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS("pce_fast.cdbios")); + + IsHES = 0; + IsSGX = 0; + + LoadCommonPre(); + + HuC_LoadCD(bios_path.c_str()); + + cdifs = CDInterfaces; + PCECD_Drive_SetDisc(true, NULL, true); + + LoadCommon(); + } + catch(...) + { + Cleanup(); + throw; + } +} + + +static void CloseGame(void) +{ + HuC_SaveNV(); + Cleanup(); +} + +static void Emulate(EmulateSpecStruct *espec) +{ + INPUT_Frame(); + + MDFNMP_ApplyPeriodicCheats(); + + #if 0 + { + static bool firstcat = true; + MDFN_PixelFormat nf; + + nf.bpp = 16; + nf.colorspace = MDFN_COLORSPACE_RGB; + nf.Rshift = 11; + nf.Gshift = 5; + nf.Bshift = 0; + nf.Ashift = 16; + + nf.Rprec = 5; + nf.Gprec = 6; + nf.Bprec = 5; + nf.Aprec = 8; + + espec->surface->SetFormat(nf, false); + espec->VideoFormatChanged = firstcat; + firstcat = false; + } + #endif + +#if 0 + static bool firstcat = true; + + MDFN_PixelFormat tmp_pf; + + tmp_pf.Rshift = 0; + tmp_pf.Gshift = 0; + tmp_pf.Bshift = 0; + tmp_pf.Ashift = 8; + + tmp_pf.Rprec = 6; + tmp_pf.Gprec = 6; + tmp_pf.Bprec = 6; + tmp_pf.Aprec = 0; + + tmp_pf.bpp = 8; + tmp_pf.colorspace = MDFN_COLORSPACE_RGB; + + espec->surface->SetFormat(tmp_pf, false); + espec->VideoFormatChanged = firstcat; + firstcat = false; +#endif + + if(espec->VideoFormatChanged) + VDC_SetPixelFormat(espec->surface->format, espec->CustomPalette, espec->CustomPaletteNumEntries); //.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift); + + if(espec->SoundFormatChanged) + { + for(int y = 0; y < 2; y++) + { + sbuf[y].set_sample_rate(espec->SoundRate ? espec->SoundRate : 44100, 50); + sbuf[y].clock_rate((long)(PCE_MASTER_CLOCK / 3)); + sbuf[y].bass_freq(10); + } + } + VDC_RunFrame(espec, IsHES); + + if(PCE_IsCD) + { + PCECD_Run(HuCPU.timestamp * 3); + } + + psg->EndFrame(HuCPU.timestamp / pce_overclocked); + + if(espec->SoundBuf) + { + for(int y = 0; y < 2; y++) + { + sbuf[y].end_frame(HuCPU.timestamp / pce_overclocked); + espec->SoundBufSize = sbuf[y].read_samples(espec->SoundBuf + y, espec->SoundBufMaxSize, 1); + } + } + + espec->MasterCycles = HuCPU.timestamp * 3; + + INPUT_FixTS(); + + HuC6280_ResetTS(); + + if(PCE_IsCD) + PCECD_ResetTS(); + + if(IsHES && !espec->skip) + HES_Draw(espec->surface, &espec->DisplayRect, espec->SoundBuf, espec->SoundBufSize); +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(BaseRAM, IsSGX? 32768 : 8192), + SFVAR(PCEIODataBuffer), + SFEND + }; + + //for(int i = 8192; i < 32768; i++) + // if(BaseRAM[i] != 0xFF) + // printf("%d %02x\n", i, BaseRAM[i]); + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + HuC6280_StateAction(sm, load, data_only); + VDC_StateAction(sm, load, data_only); + psg->StateAction(sm, load, data_only); + INPUT_StateAction(sm, load, data_only); + HuC_StateAction(sm, load, data_only); + + if(load) + { + + } +} + +void PCE_Power(void) +{ + memset(BaseRAM, 0x00, sizeof(BaseRAM)); + + if(!IsSGX) + for(int i = 8192; i < 32768; i++) + BaseRAM[i] = 0xFF; + + PCEIODataBuffer = 0xFF; + + if(IsHES) + HES_Reset(); + + HuC6280_Power(); + VDC_Power(); + psg->Power(HuCPU.timestamp / pce_overclocked); + HuC_Power(); + + if(PCE_IsCD) + { + PCECD_Power(HuCPU.timestamp * 3); + } +} + +static bool SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + const RMD_Layout* rmd = EmulatedPCE_Fast.RMD; + const RMD_Drive* rd = &rmd->Drives[drive_idx]; + const RMD_State* rs = &rd->PossibleStates[state_idx]; + + if(rs->MediaPresent && rs->MediaUsable) + { + PCECD_Drive_SetDisc(false, (*cdifs)[media_idx]); + } + else + { + PCECD_Drive_SetDisc(rs->MediaCanChange, NULL); + } + + return(true); +} + + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_RESET: PCE_Power(); break; + case MDFN_MSC_POWER: PCE_Power(); break; + } +} + +static MDFNSetting PCESettings[] = +{ + { "pce_fast.correct_aspect", MDFNSF_CAT_VIDEO, gettext_noop("Correct the aspect ratio."), NULL, MDFNST_BOOL, "1" }, + { "pce_fast.slstart", MDFNSF_NOFLAGS, gettext_noop("First rendered scanline."), NULL, MDFNST_UINT, "4", "0", "239" }, + { "pce_fast.slend", MDFNSF_NOFLAGS, gettext_noop("Last rendered scanline."), NULL, MDFNST_UINT, "235", "0", "239" }, + { "pce_fast.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Mouse sensitivity."), NULL, MDFNST_FLOAT, "0.50", NULL, NULL, NULL, PCEINPUT_SettingChanged }, + { "pce_fast.disable_softreset", MDFNSF_NOFLAGS, gettext_noop("If set, when RUN+SEL are pressed simultaneously, disable both buttons temporarily."), NULL, MDFNST_BOOL, "0", NULL, NULL, NULL, PCEINPUT_SettingChanged }, + { "pce_fast.forcesgx", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Force SuperGrafx emulation."), NULL, MDFNST_BOOL, "0" }, + { "pce_fast.arcadecard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable Arcade Card emulation."), NULL, MDFNST_BOOL, "1" }, + { "pce_fast.ocmultiplier", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("CPU overclock multiplier."), NULL, MDFNST_UINT, "1", "1", "100"}, + { "pce_fast.cdspeed", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("CD-ROM data transfer speed multiplier."), NULL, MDFNST_UINT, "1", "1", "100" }, + { "pce_fast.nospritelimit", MDFNSF_NOFLAGS, gettext_noop("Remove 16-sprites-per-scanline hardware limit."), NULL, MDFNST_BOOL, "0" }, + + { "pce_fast.cdbios", MDFNSF_EMU_STATE, gettext_noop("Path to the CD BIOS"), NULL, MDFNST_STRING, "syscard3.pce" }, + + { "pce_fast.adpcmlp", MDFNSF_NOFLAGS, gettext_noop("Enable dynamic ADPCM lowpass filter."), NULL, MDFNST_BOOL, "0" }, + { "pce_fast.cdpsgvolume", MDFNSF_NOFLAGS, gettext_noop("PSG volume when playing a CD game."), NULL, MDFNST_UINT, "100", "0", "200" }, + { "pce_fast.cddavolume", MDFNSF_NOFLAGS, gettext_noop("CD-DA volume."), NULL, MDFNST_UINT, "100", "0", "200" }, + { "pce_fast.adpcmvolume", MDFNSF_NOFLAGS, gettext_noop("ADPCM volume."), NULL, MDFNST_UINT, "100", "0", "200" }, + { NULL } +}; + +static uint8 MemRead(uint32 addr) +{ + return(PCERead[(addr / 8192) & 0xFF](addr)); +} + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".pce", gettext_noop("PC Engine ROM Image") }, + { ".hes", gettext_noop("PC Engine Music Rip") }, + { ".sgx", gettext_noop("SuperGrafx ROM Image") }, + { NULL, NULL } +}; + +static const CustomPalette_Spec CPInfo[] = +{ + { gettext_noop("PCE/TG16 9-bit RGB"), NULL, { 512, 1024, 0 } }, + + { NULL, NULL } +}; + +}; + +MDFNGI EmulatedPCE_Fast = +{ + "pce_fast", + "PC Engine (CD)/TurboGrafx 16 (CD)/SuperGrafx", + KnownExtensions, + MODPRIO_INTERNAL_LOW, + NULL, + PCEPortInfo, + Load, + TestMagic, + LoadCD, + TestMagicCD, + CloseGame, + + VDC_SetLayerEnableMask, + NULL, + + NULL, + NULL, + + CPInfo, + 1 << 0, + + NULL, + NULL, + MemRead, + NULL, + false, + StateAction, + Emulate, + INPUT_TransformInput, + PCEINPUT_SetInput, + SetMedia, + DoSimpleCommand, + PCESettings, + MDFN_MASTERCLOCK_FIXED(PCE_MASTER_CLOCK), + 0, + + true, // Multires possible? + + 0, // lcm_width + 0, // lcm_height + NULL, // Dummy + + 288, // Nominal width + 232, // Nominal height + + 512, // Framebuffer width + 242, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/pce_fast/pce.h b/Mednafen/mednafen/pce_fast/pce.h new file mode 100644 index 0000000000..ba7bbef500 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/pce.h @@ -0,0 +1,44 @@ +#ifndef _PCE_H + +#include +#include +#include +#include + +#define PCE_MASTER_CLOCK 21477272.727273 + +#define DECLFR(x) uint8 MDFN_FASTCALL x (uint32 A) +#define DECLFW(x) void MDFN_FASTCALL x (uint32 A, uint8 V) + +namespace PCE_Fast +{ +extern uint8 ROMSpace[0x88 * 8192 + 8192]; + +typedef void (MDFN_FASTCALL *writefunc)(uint32 A, uint8 V); +typedef uint8 (MDFN_FASTCALL *readfunc)(uint32 A); + +extern uint8 PCEIODataBuffer; + +void PCE_InitCD(void) MDFN_COLD; + +}; + +#include "huc6280.h" + +namespace PCE_Fast +{ +extern bool PCE_ACEnabled; // Arcade Card emulation enabled? +void PCE_Power(void) MDFN_COLD; + +extern readfunc PCERead[0x100]; +extern writefunc PCEWrite[0x100]; +extern int pce_overclocked; + +extern uint8 BaseRAM[32768 + 8192]; + +}; + +using namespace PCE_Fast; + +#define _PCE_H +#endif diff --git a/Mednafen/mednafen/pce_fast/pcecd.cpp b/Mednafen/mednafen/pce_fast/pcecd.cpp new file mode 100644 index 0000000000..ad0362a4cd --- /dev/null +++ b/Mednafen/mednafen/pce_fast/pcecd.cpp @@ -0,0 +1,978 @@ +/* Mednafen - Multi-system Emulator + * + * Copyright notice for this file: + * Copyright (C) 2004 Ki + * Copyright (C) 2007-2011 Mednafen Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + PCE_FAST(less accurate, faster, etc.) fork from PCE module "pcecd.cpp". +*/ + +#include +#include +#include +#include + +#include "pcecd_drive.h" +#include "pcecd.h" + +namespace PCE_Fast +{ + +//#define PCECD_DEBUG + +static unsigned int OC_Multiplier; + +static void (*IRQCB)(bool asserted); + +static float CDDAVolumeSetting; // User setting! + +static bool bBRAMEnabled; +static uint8 _Port[15]; +static uint8 ACKStatus; + +static SimpleFIFO SubChannelFIFO(16); + +static Blip_Buffer* sbuf; +static int16 RawPCMVolumeCache[2]; + +static int32 ClearACKDelay; + +static int32 lastts; +static int32 pcecd_drive_ne = 0; + +// ADPCM variables and whatnot +#define ADPCM_DEBUG(x, ...) { /*printf("[Half=%d, End=%d, Playing=%d] "x, ADPCM.HalfReached, ADPCM.EndReached, ADPCM.Playing, ## __VA_ARGS__);*/ } + +typedef Blip_Synth ADSynth; +static ADSynth ADPCMSynth; +static OKIADPCM_Decoder MSM5205; + +static bool ADPCMLP; +typedef struct +{ + uint8 *RAM; // = NULL; //0x10000; + uint16 Addr; + uint16 ReadAddr; + uint16 WriteAddr; + uint16 LengthCount; + + bool HalfReached; + bool EndReached; + bool Playing; + + uint8 LastCmd; + uint32 SampleFreq; + uint32 LPF_SampleFreq; + + uint8 PlayBuffer; + uint8 ReadBuffer; + int32 ReadPending; + int32 WritePending; + uint8 WritePendingValue; + + uint32 PlayNibble; + + + int64 bigdivacc; + int64 bigdiv; + int32 last_pcm; +} ADPCM_t; + +static ADPCM_t ADPCM; + +typedef struct +{ + uint8 Command; + int32 Volume; + + int32 CycleCounter; + uint32 CountValue; // What to reload CycleCounter with when it expires. + bool Clocked; +} FADE_t; + +static FADE_t Fader; +static int32 ADPCMFadeVolume, CDDAFadeVolume; + +static INLINE void Fader_SyncWhich(void) +{ + if(Fader.Command & 0x2) // ADPCM fade + { + ADPCMFadeVolume = Fader.Volume; + CDDAFadeVolume = 65536; + } + else // CD-DA Fade + { + CDDAFadeVolume = Fader.Volume; + ADPCMFadeVolume = 65536; + } + + ADPCMFadeVolume >>= 6; + PCECD_Drive_SetCDDAVolume(0.50f * CDDAFadeVolume * CDDAVolumeSetting); +} + + +static void RedoLPF(int f) +{ + if(sbuf) + { + if(ADPCMLP) + { + if(f >= 14) + { + int rolloff = (int)((((double)32087.5 / (16 - f)) / 2) * 0.70); + ADPCMSynth.treble_eq( blip_eq_t(-1000, rolloff, sbuf[0].sample_rate())); + } + else + { + int rolloff = (int)((((double)32087.5 / (16 - f)) / 2) * 0.80); + ADPCMSynth.treble_eq( blip_eq_t(-1000, rolloff, sbuf[0].sample_rate())); + } + } + else + ADPCMSynth.treble_eq(-8.0); + } +} + +static INLINE int32 ADPCM_ClocksToNextEvent(void) +{ + int32 ret = (ADPCM.bigdiv + 65535) >> 16; + + if(ADPCM.WritePending && ret > ADPCM.WritePending) + ret = ADPCM.WritePending; + + if(ADPCM.ReadPending && ret > ADPCM.ReadPending) + ret = ADPCM.ReadPending; + + return(ret); +} + +static int32 CalcNextEvent(int32 base) +{ + int32 next_event = base; + int32 ADPCM_ctne = ADPCM_ClocksToNextEvent(); + + if(next_event > ADPCM_ctne) + next_event = ADPCM_ctne; + + if(ClearACKDelay > 0 && next_event > ClearACKDelay) + next_event = ClearACKDelay; + + if(next_event > pcecd_drive_ne) + next_event = pcecd_drive_ne; + + if(Fader.Clocked && next_event > Fader.CycleCounter) + next_event = Fader.CycleCounter; + + return(next_event); +} + +static void update_irq_state() +{ + uint8 irq = _Port[2] & _Port[0x3] & (0x4|0x8|0x10|0x20|0x40); + + IRQCB((bool)irq); +} + +static void StuffSubchannel(uint8 meow, int subindex) +{ + uint8 tmp_data = meow & 0x7F; + + if(subindex == -2) + tmp_data = 0x00; + else if(subindex == -1) + tmp_data = 0x80; + + if(SubChannelFIFO.CanWrite()) + SubChannelFIFO.Write(&tmp_data, 1); + + _Port[0x3] |= 0x10; + update_irq_state(); +} + +static void CDIRQ(int type) +{ + #ifdef PCECD_DEBUG + if(type != 0x8000 || _Port[0x3] & 0x60) + printf("CDIRQ: %d\n", type); + #endif + if(type & 0x8000) + { + type &= 0x7FFF; + if(type == PCECD_Drive_IRQ_DATA_TRANSFER_DONE) + _Port[0x3] &= ~0x20; + else if(type == PCECD_Drive_IRQ_DATA_TRANSFER_READY) + _Port[0x3] &= ~0x40; + } + else if(type == PCECD_Drive_IRQ_DATA_TRANSFER_DONE) + { + _Port[0x3] |= 0x20; + } + else if(type == PCECD_Drive_IRQ_DATA_TRANSFER_READY) + { + _Port[0x3] |= 0x40; + } + update_irq_state(); +} + +static void UpdateADPCMIRQState(void) +{ + _Port[0x3] &= ~0xC; + + _Port[0x3] |= ADPCM.HalfReached ? 0x4 : 0x0; + _Port[0x3] |= ADPCM.EndReached ? 0x8 : 0x0; + + update_irq_state(); +} + +static INLINE uint8 read_1808(int32 timestamp) +{ + uint8 ret = PCECD_Drive_GetDB(); + + if(PCECD_Drive_GetREQ() && !PCECD_Drive_GetACK() && !PCECD_Drive_GetCD()) + { + if(PCECD_Drive_GetIO()) + { + PCECD_Drive_SetACK(TRUE); + ACKStatus = TRUE; + pcecd_drive_ne = PCECD_Drive_Run(timestamp); + ClearACKDelay = 15 * 3; + } + } + + return(ret); +} + +bool PCECD_SetSettings(const PCECD_Settings *settings) +{ + if(settings) + { + assert(settings->CDDA_Volume <= 2.0); + assert(settings->ADPCM_Volume <= 2.0); + } + + CDDAVolumeSetting = settings ? settings->CDDA_Volume : 1.0; + Fader_SyncWhich(); + + ADPCMSynth.volume(0.42735f * (settings ? settings->ADPCM_Volume : 1.0)); + ADPCMLP = settings ? settings->ADPCM_LPF : 0; + + PCECD_Drive_SetTransferRate(126000 * (settings ? settings->CD_Speed : 1)); + + return true; +} + +void PCECD_Init(const PCECD_Settings *settings, void (*irqcb)(bool), double master_clock, unsigned int ocm, Blip_Buffer* soundbufs) +{ + lastts = 0; + + OC_Multiplier = ocm; + + IRQCB = irqcb; + + sbuf = soundbufs; + + // Warning: magic number 126000 in PCECD_SetSettings() too + PCECD_Drive_Init(3 * OC_Multiplier, sbuf, 126000 * (settings ? settings->CD_Speed : 1), master_clock * OC_Multiplier, CDIRQ, StuffSubchannel); + + ADPCM.RAM = (uint8 *)MDFN_malloc_T(0x10000, _("PCE ADPCM RAM")); + + PCECD_SetSettings(settings); + + ADPCM.bigdivacc = (int64)((double)master_clock * OC_Multiplier * 65536 / 32087.5); +} + + +void PCECD_Close(void) +{ + if(ADPCM.RAM) + { + MDFN_free(ADPCM.RAM); + ADPCM.RAM = NULL; + } + PCECD_Drive_Close(); +} + + +void PCECD_Power(uint32 timestamp) +{ + if((int32)timestamp != lastts) + (void)PCECD_Run(timestamp); + + IRQCB(0); + + PCECD_Drive_Power(timestamp); + pcecd_drive_ne = 0x7fffffff; + + bBRAMEnabled = FALSE; + memset(_Port, 0, sizeof(_Port)); + ACKStatus = 0; + ClearACKDelay = 0; + + memset(ADPCM.RAM, 0x00, 65536); + + ADPCM.ReadPending = ADPCM.WritePending = 0; + ADPCM.ReadBuffer = 0; + ADPCM.PlayBuffer = 0; + + ADPCM.LastCmd = 0; + MSM5205.SetSample(0x800); + MSM5205.SetSSI(0); + + ADPCM.SampleFreq = 0; + ADPCM.LPF_SampleFreq = 0; + ADPCM.bigdiv = ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); + RedoLPF(ADPCM.LPF_SampleFreq); + + ADPCM.Addr = 0; + ADPCM.ReadAddr = 0; + ADPCM.WriteAddr = 0; + ADPCM.LengthCount = 0; + ADPCM.LastCmd = 0; + + ADPCM.HalfReached = false; + ADPCM.EndReached = false; + ADPCM.Playing = false; + ADPCM.PlayNibble = 0; + + UpdateADPCMIRQState(); + + Fader.Command = 0x00; + Fader.Volume = 0; + Fader.CycleCounter = 0; + Fader.CountValue = 0; + Fader.Clocked = FALSE; +} + +bool PCECD_IsBRAMEnabled(void) +{ + return bBRAMEnabled; +} + +uint8 PCECD_Read(uint32 timestamp, uint32 A) +{ + uint8 ret = 0; + + if((A & 0x18c0) == 0x18c0) + { + switch (A & 0x18cf) + { + case 0x18c1: ret = 0xaa; break; + case 0x18c2: ret = 0x55; break; + case 0x18c3: ret = 0x00; break; + case 0x18c5: ret = 0xaa; break; + case 0x18c6: ret = 0x55; break; + case 0x18c7: ret = 0x03; break; + } + } + else + { + PCECD_Run(timestamp); + + switch(A & 0xf) + { + case 0x0: + ret = 0; + ret |= PCECD_Drive_GetBSY() ? 0x80 : 0x00; + ret |= PCECD_Drive_GetREQ() ? 0x40 : 0x00; + ret |= PCECD_Drive_GetMSG() ? 0x20 : 0x00; + ret |= PCECD_Drive_GetCD() ? 0x10 : 0x00; + ret |= PCECD_Drive_GetIO() ? 0x08 : 0x00; + break; + + case 0x1: ret = PCECD_Drive_GetDB(); + break; + + case 0x2: ret = _Port[2]; + break; + + case 0x3: bBRAMEnabled = FALSE; + + /* switch left/right of digitized cd playback */ + ret = _Port[0x3]; + _Port[0x3] ^= 2; + break; + + case 0x4: ret = _Port[4]; + break; + + case 0x5: if(_Port[0x3] & 0x2) + ret = RawPCMVolumeCache[1] & 0xff; // Right + else + ret = RawPCMVolumeCache[0] & 0xff; // Left + break; + + case 0x6: if(_Port[0x3] & 0x2) + ret = ((uint16)RawPCMVolumeCache[1]) >> 8; // Right + else + ret = ((uint16)RawPCMVolumeCache[0]) >> 8; // Left + break; + + case 0x7: + if(SubChannelFIFO.CanRead() > 0) + ret = SubChannelFIFO.ReadByte(); + else + ret = 0x00; // Not sure if it's 0, 0xFF, the last byte read, or something else. + + if(SubChannelFIFO.CanRead() == 0) + { + _Port[0x3] &= ~0x10; + update_irq_state(); + } + break; + + case 0x8: + ret = read_1808(timestamp); + break; + + case 0xa: + ADPCM_DEBUG("ReadBuffer\n"); + ADPCM.ReadPending = 19 * 3; //24 * 3; + ret = ADPCM.ReadBuffer; + break; + + case 0xb: + ret = _Port[0xb]; + break; + + case 0xc: + //printf("ADPCM Status Read: %d\n", timestamp); + ret = 0x00; + + ret |= (ADPCM.EndReached) ? 0x01 : 0x00; + ret |= (ADPCM.Playing) ? 0x08 : 0x00; + ret |= (ADPCM.WritePending > 0) ? 0x04 : 0x00; + ret |= (ADPCM.ReadPending > 0) ? 0x80 : 0x00; + break; + + case 0xd: + ret = ADPCM.LastCmd; + break; + } + } + + #ifdef PCECD_DEBUG + printf("Read: %04x %02x, %d\n", A, ret, timestamp); + #endif + + return(ret); +} + +static INLINE void Fader_Run(const int32 clocks) +{ + if(Fader.Clocked) + { + Fader.CycleCounter -= clocks; + while(Fader.CycleCounter <= 0) + { + if(Fader.Volume) + Fader.Volume--; + + Fader_SyncWhich(); + + Fader.CycleCounter += Fader.CountValue; + } + } +} + + +void PCECD_Write(uint32 timestamp, uint32 physAddr, uint8 data) +{ + const uint8 V = data; + + #ifdef PCECD_DEBUG + printf("Write: (PC=%04x, t=%6d) %04x %02x; MSG: %d, REQ: %d, ACK: %d, CD: %d, IO: %d, BSY: %d, SEL: %d\n", HuCPU.PC, timestamp, physAddr, data, PCECD_Drive_GetMSG(), PCECD_Drive_GetREQ(), PCECD_Drive_GetACK(), PCECD_Drive_GetCD(), PCECD_Drive_GetIO(), PCECD_Drive_GetBSY(), PCECD_Drive_GetSEL()); + #endif + + PCECD_Run(timestamp); + + switch (physAddr & 0xf) + { + case 0x0: + PCECD_Drive_SetSEL(1); + PCECD_Drive_Run(timestamp); + PCECD_Drive_SetSEL(0); + pcecd_drive_ne = PCECD_Drive_Run(timestamp); + + /* reset irq status */ + _Port[0x3] &= ~(0x20 | 0x40); // TODO: Confirm writing this register really reset these bits. + update_irq_state(); + break; + + case 0x1: // $1801 + _Port[1] = data; + PCECD_Drive_SetDB(data); + pcecd_drive_ne = PCECD_Drive_Run(timestamp); + break; + + case 0x2: // $1802 + #ifdef PCECD_DEBUG + if(!(_Port[0x3] & _Port[2] & 0x40) && (_Port[0x3] & data & 0x40)) + puts("IRQ on waah 0x40"); + if(!(_Port[0x3] & _Port[2] & 0x20) && (_Port[0x3] & data & 0x20)) + puts("IRQ on waah 0x20"); + #endif + + PCECD_Drive_SetACK(data & 0x80); + pcecd_drive_ne = PCECD_Drive_Run(timestamp); + _Port[2] = data; + ACKStatus = (bool)(data & 0x80); + update_irq_state(); + break; + + case 0x3: // read only + break; + + case 0x4: + PCECD_Drive_SetRST(data & 0x2); + pcecd_drive_ne = PCECD_Drive_Run(timestamp); + if(data & 0x2) + { + _Port[0x3] &= ~0x70; + update_irq_state(); + } + _Port[4] = data; + break; + + case 0x5: + case 0x6: + { + int16 left, right; + PCECD_Drive_GetCDDAValues(left, right); + RawPCMVolumeCache[0] = ((int64)abs(left) * CDDAFadeVolume) >> 16; + RawPCMVolumeCache[1] = ((int64)abs(right) * CDDAFadeVolume) >> 16; + } + break; + + case 0x7: // $1807: D7=1 enables backup ram + if (data & 0x80) + { + bBRAMEnabled = TRUE; + } + break; + + case 0x8: // Set ADPCM address low + if(ADPCM.LastCmd & 0x80) + break; + + ADPCM.Addr &= 0xFF00; + ADPCM.Addr |= V; + + ADPCM_DEBUG("SAL: %02x, %d\n", V, timestamp); + + // Length appears to be constantly latched when D4 is set(tested on a real system) + if(ADPCM.LastCmd & 0x10) + { + ADPCM_DEBUG("Set length(crazy way L): %04x\n", ADPCM.Addr); + ADPCM.LengthCount = ADPCM.Addr; + } + break; + + case 0x9: // Set ADPCM address high + if(ADPCM.LastCmd & 0x80) + break; + + ADPCM.Addr &= 0x00FF; + ADPCM.Addr |= V << 8; + + ADPCM_DEBUG("SAH: %02x, %d\n", V, timestamp); + + // Length appears to be constantly latched when D4 is set(tested on a real system) + if(ADPCM.LastCmd & 0x10) + { + ADPCM_DEBUG("Set length(crazy way H): %04x\n", ADPCM.Addr); + ADPCM.LengthCount = ADPCM.Addr; + } + break; + + case 0xa: + //ADPCM_DEBUG("Write: %02x, %d\n", V, timestamp); + ADPCM.WritePending = 3 * 11; + ADPCM.WritePendingValue = data; + break; + + case 0xb: // adpcm dma + ADPCM_DEBUG("DMA: %02x\n", V); + _Port[0xb] = data; + break; + + case 0xc: // read-only + break; + + case 0xd: + ADPCM_DEBUG("Write180D: %02x\n", V); + if(data & 0x80) + { + ADPCM.Addr = 0; + ADPCM.ReadAddr = 0; + ADPCM.WriteAddr = 0; + ADPCM.LengthCount = 0; + ADPCM.LastCmd = 0; + + ADPCM.Playing = false; + ADPCM.HalfReached = false; + ADPCM.EndReached = false; + + ADPCM.PlayNibble = 0; + + UpdateADPCMIRQState(); + + MSM5205.SetSample(0x800); + MSM5205.SetSSI(0); + break; + } + + if(ADPCM.Playing && !(data & 0x20)) + ADPCM.Playing = false; + + if(!ADPCM.Playing && (data & 0x20)) + { + ADPCM.bigdiv = ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); + ADPCM.Playing = true; + ADPCM.HalfReached = false; // Not sure about this. + ADPCM.PlayNibble = 0; + MSM5205.SetSample(0x800); + MSM5205.SetSSI(0); + } + + // Length appears to be constantly latched when D4 is set(tested on a real system) + if(data & 0x10) + { + ADPCM_DEBUG("Set length: %04x\n", ADPCM.Addr); + ADPCM.LengthCount = ADPCM.Addr; + ADPCM.EndReached = false; + } + + // D2 and D3 control read address + if(!(ADPCM.LastCmd & 0x8) && (data & 0x08)) + { + if(data & 0x4) + ADPCM.ReadAddr = ADPCM.Addr; + else + ADPCM.ReadAddr = (ADPCM.Addr - 1) & 0xFFFF; + + ADPCM_DEBUG("Set ReadAddr: %04x, %06x\n", ADPCM.Addr, ADPCM.ReadAddr); + } + + // D0 and D1 control write address + if(!(ADPCM.LastCmd & 0x2) && (data & 0x2)) + { + ADPCM.WriteAddr = ADPCM.Addr; + if(!(data & 0x1)) + ADPCM.WriteAddr = (ADPCM.WriteAddr - 1) & 0xFFFF; + ADPCM_DEBUG("Set WriteAddr: %04x, %06x\n", ADPCM.Addr, ADPCM.WriteAddr); + } + ADPCM.LastCmd = data; + UpdateADPCMIRQState(); + break; + + case 0xe: // Set ADPCM playback rate + { + uint8 freq = V & 0x0F; + + ADPCM.SampleFreq = freq; + + ADPCM_DEBUG("Freq: %02x\n", freq); + } + break; + + case 0xf: + Fader.Command = V; + + #ifdef PCECD_DEBUG + printf("Fade: %02x\n", data); + #endif + + // Cancel fade + if(!(V & 0x8)) + { + Fader.Volume = 65536; + Fader.CycleCounter = 0; + Fader.CountValue = 0; + Fader.Clocked = FALSE; + } + else + { + Fader.CountValue = OC_Multiplier * 3 * ((V & 0x4) ? 273 : 655); // 2.500s : 6.000s; + + if(!Fader.Clocked) + Fader.CycleCounter = Fader.CountValue; + + Fader.Clocked = TRUE; + } + Fader_SyncWhich(); + break; + } +} + +static INLINE void ADPCM_PB_Run(int32 basetime, int32 run_time) +{ + ADPCM.bigdiv -= run_time * 65536; + + while(ADPCM.bigdiv <= 0) + { + ADPCM.bigdiv += ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); + + if(ADPCM.Playing && !ADPCM.PlayNibble) // Do playback sample buffer fetch. + { + ADPCM.HalfReached = (ADPCM.LengthCount < 32768); + if(!ADPCM.LengthCount && !(ADPCM.LastCmd & 0x10)) + { + if(ADPCM.EndReached) + ADPCM.HalfReached = false; + + ADPCM.EndReached = true; + + if(ADPCM.LastCmd & 0x40) + ADPCM.Playing = false; + } + + ADPCM.PlayBuffer = ADPCM.RAM[ADPCM.ReadAddr]; + ADPCM.ReadAddr = (ADPCM.ReadAddr + 1) & 0xFFFF; + + if(ADPCM.LengthCount && !(ADPCM.LastCmd & 0x10)) + ADPCM.LengthCount--; + } + + if(ADPCM.Playing) + { + int32 pcm; + uint8 nibble; + + nibble = (ADPCM.PlayBuffer >> (ADPCM.PlayNibble ^ 4)) & 0x0F; + pcm = MSM5205.Decode(nibble) - 2048; + + ADPCM.PlayNibble ^= 4; + + pcm = (pcm * ADPCMFadeVolume) >> 8; + uint32 synthtime = ((basetime + (ADPCM.bigdiv >> 16))) / (3 * OC_Multiplier); + + if(sbuf) + { + ADPCMSynth.offset(synthtime, pcm - ADPCM.last_pcm, &sbuf[0]); + ADPCMSynth.offset(synthtime, pcm - ADPCM.last_pcm, &sbuf[1]); + } + ADPCM.last_pcm = pcm; + } + } +} + +static INLINE void ADPCM_Run(const int32 clocks, const int32 timestamp) +{ + //printf("ADPCM Run: %d\n", clocks); + ADPCM_PB_Run(timestamp, clocks); + + if(ADPCM.WritePending) + { + ADPCM.WritePending -= clocks; + if(ADPCM.WritePending <= 0) + { + ADPCM.HalfReached = (ADPCM.LengthCount < 32768); + if(!(ADPCM.LastCmd & 0x10) && ADPCM.LengthCount < 0xFFFF) + ADPCM.LengthCount++; + + ADPCM.RAM[ADPCM.WriteAddr++] = ADPCM.WritePendingValue; + ADPCM.WritePending = 0; + } + } + + if(!ADPCM.WritePending) + { + if(_Port[0xb] & 0x3) + { + // Run PCECD_Drive before we examine the signals. + pcecd_drive_ne = PCECD_Drive_Run(timestamp); + + if(!PCECD_Drive_GetCD() && PCECD_Drive_GetIO() && PCECD_Drive_GetREQ() && !PCECD_Drive_GetACK()) + { + ADPCM.WritePendingValue = read_1808(timestamp); + ADPCM.WritePending = 10 * 3; + } + } + } + + if(ADPCM.ReadPending) + { + ADPCM.ReadPending -= clocks; + if(ADPCM.ReadPending <= 0) + { + ADPCM.ReadBuffer = ADPCM.RAM[ADPCM.ReadAddr]; + ADPCM.ReadAddr = (ADPCM.ReadAddr + 1) & 0xFFFF; + ADPCM.ReadPending = 0; + + ADPCM.HalfReached = (ADPCM.LengthCount < 32768); + if(!(ADPCM.LastCmd & 0x10)) + { + if(ADPCM.LengthCount) + ADPCM.LengthCount--; + else + { + ADPCM.EndReached = true; + ADPCM.HalfReached = false; + + if(ADPCM.LastCmd & 0x40) + ADPCM.Playing = false; + } + } + } + } + + UpdateADPCMIRQState(); +} + +void PCECD_Run(uint32 in_timestamp) +{ + int32 clocks = in_timestamp - lastts; + int32 running_ts = lastts; + + //printf("Run Begin: Clocks=%d(%d - %d), cl=%d\n", clocks, in_timestamp, lastts, CalcNextEvent); + //fflush(stdout); + + while(clocks > 0) + { + int32 chunk_clocks = CalcNextEvent(clocks); + + running_ts += chunk_clocks; + + if(ClearACKDelay > 0) + { + ClearACKDelay -= chunk_clocks; + if(ClearACKDelay <= 0) + { + ACKStatus = FALSE; + PCECD_Drive_SetACK(FALSE); + PCECD_Drive_Run(running_ts); + if(PCECD_Drive_GetCD()) + { + _Port[0xb] &= ~1; + #ifdef PCECD_DEBUG + puts("DMA End"); + #endif + } + } + } + + Fader_Run(chunk_clocks); + + ADPCM_Run(chunk_clocks, running_ts); + pcecd_drive_ne = PCECD_Drive_Run(running_ts); + + clocks -= chunk_clocks; + } + + lastts = in_timestamp; +} + +void PCECD_ResetTS(void) +{ + if(ADPCM.SampleFreq != ADPCM.LPF_SampleFreq) + { + ADPCM.LPF_SampleFreq = ADPCM.SampleFreq; + RedoLPF(ADPCM.LPF_SampleFreq); + } + PCECD_Drive_ResetTS(); + lastts = 0; +} + +static int ADPCM_StateAction(StateMem *sm, int load, int data_only) +{ + uint32 ad_sample = MSM5205.GetSample(); + int32 ad_ref_index = MSM5205.GetSSI(); + + SFORMAT StateRegs[] = + { + SFARRAY(ADPCM.RAM, 0x10000), + + SFVAR(ADPCM.bigdiv), + SFVAR(ADPCM.Addr), + SFVAR(ADPCM.ReadAddr), + SFVAR(ADPCM.WriteAddr), + SFVAR(ADPCM.LengthCount), + SFVAR(ADPCM.LastCmd), + SFVAR(ADPCM.SampleFreq), + + SFVAR(ADPCM.ReadPending), + SFVAR(ADPCM.ReadBuffer), + SFVAR(ADPCM.PlayBuffer), + + SFVAR(ADPCM.WritePending), + SFVAR(ADPCM.WritePendingValue), + + SFVAR(ADPCM.HalfReached), + SFVAR(ADPCM.EndReached), + SFVAR(ADPCM.Playing), + + SFVAR(ADPCM.PlayNibble), + + SFVAR(ad_sample), + SFVAR(ad_ref_index), + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "APCM"); + if(load) + { + MSM5205.SetSample(ad_sample); + MSM5205.SetSSI(ad_ref_index); + RedoLPF(ADPCM.SampleFreq); + } + return(ret); +} + +int PCECD_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(bBRAMEnabled), + SFVAR(ACKStatus), + SFVAR(ClearACKDelay), + SFARRAY16(RawPCMVolumeCache, 2), + SFARRAY(_Port, sizeof(_Port)), + + SFVAR(Fader.Command), + SFVAR(Fader.Volume), + SFVAR(Fader.CycleCounter), + SFVAR(Fader.CountValue), + SFVAR(Fader.Clocked), + + SFARRAY(&SubChannelFIFO.data[0], SubChannelFIFO.data.size()), + SFVAR(SubChannelFIFO.read_pos), + SFVAR(SubChannelFIFO.write_pos), + SFVAR(SubChannelFIFO.in_count), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "PECD"); + ret &= PCECD_Drive_StateAction(sm, load, data_only, "CDRM"); + ret &= ADPCM_StateAction(sm, load, data_only); + + if(load) + { + Fader_SyncWhich(); + //PCECD_Drive_SetDB(_Port[1]); + PCECD_Drive_SetACK(ACKStatus); + PCECD_Drive_SetRST(_Port[4] & 0x2); + + SubChannelFIFO.read_pos %= SubChannelFIFO.size; + SubChannelFIFO.write_pos %= SubChannelFIFO.size; + } + return(ret); +} + +} diff --git a/Mednafen/mednafen/pce_fast/pcecd.h b/Mednafen/mednafen/pce_fast/pcecd.h new file mode 100644 index 0000000000..77df67414e --- /dev/null +++ b/Mednafen/mednafen/pce_fast/pcecd.h @@ -0,0 +1,37 @@ +#ifndef __PCE_CDROM_H +#define __PCE_CDROM_H + +#include + +namespace PCE_Fast +{ + +typedef struct +{ + float CDDA_Volume; // Max 2.000... + float ADPCM_Volume; // Max 2.000... + + unsigned int CD_Speed; + + bool ADPCM_LPF; +} PCECD_Settings; + +void PCECD_Run(uint32 in_timestamp); +void PCECD_ResetTS(void); + +void PCECD_Init(const PCECD_Settings *settings, void (*irqcb)(bool), double master_clock, unsigned int ocm, Blip_Buffer* soundbufs) MDFN_COLD; +bool PCECD_SetSettings(const PCECD_Settings *settings) MDFN_COLD; +void PCECD_Close(void) MDFN_COLD; +void PCECD_Power(uint32 timestamp) MDFN_COLD; + + +uint8 PCECD_Read(uint32 timestamp, uint32); +void PCECD_Write(uint32 timestamp, uint32, uint8 data); + +bool PCECD_IsBRAMEnabled(void); + +int PCECD_StateAction(StateMem *sm, int load, int data_only); + +} +#endif + diff --git a/Mednafen/mednafen/pce_fast/pcecd_drive.cpp b/Mednafen/mednafen/pce_fast/pcecd_drive.cpp new file mode 100644 index 0000000000..258986c438 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/pcecd_drive.cpp @@ -0,0 +1,1319 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include "pcecd_drive.h" +#include +#include + +namespace PCE_Fast +{ +//#define SCSIDBG(format, ...) { printf("SCSI: " format "\n", ## __VA_ARGS__); } +//#define SCSIDBG(format, ...) { } + +using namespace CDUtility; + +static uint32 CD_DATA_TRANSFER_RATE; +static uint32 System_Clock; +static void (*CDIRQCallback)(int); +static void (*CDStuffSubchannels)(uint8, int); +static Blip_Buffer* sbuf; + +static CDIF *Cur_CDIF; +static bool TrayOpen; + +// Internal operation to the SCSI CD unit. Only pass 1 or 0 to these macros! +#define SetIOP(mask, set) { cd_bus.signals &= ~mask; if(set) cd_bus.signals |= mask; } + +#define SetBSY(set) SetIOP(PCECD_Drive_BSY_mask, set) +#define SetIO(set) SetIOP(PCECD_Drive_IO_mask, set) +#define SetCD(set) SetIOP(PCECD_Drive_CD_mask, set) +#define SetMSG(set) SetIOP(PCECD_Drive_MSG_mask, set) + +static INLINE void SetREQ(bool set) +{ + if(set && !REQ_signal) + CDIRQCallback(PCECD_Drive_IRQ_MAGICAL_REQ); + + SetIOP(PCECD_Drive_REQ_mask, set); +} + +#define SetkingACK(set) SetIOP(PCECD_Drive_kingACK_mask, set) +#define SetkingRST(set) SetIOP(PCECD_Drive_kingRST_mask, set) +#define SetkingSEL(set) SetIOP(PCECD_Drive_kingSEL_mask, set) + + +enum +{ + QMode_Zero = 0, + QMode_Time = 1, + QMode_MCN = 2, // Media Catalog Number + QMode_ISRC = 3 // International Standard Recording Code +}; + +typedef struct +{ + bool last_RST_signal; + + // The pending message to send(in the message phase) + uint8 message_pending; + + bool status_sent, message_sent; + + // Pending error codes + uint8 key_pending, asc_pending, ascq_pending, fru_pending; + + uint8 command_buffer[256]; + uint8 command_buffer_pos; + uint8 command_size_left; + + // FALSE if not all pending data is in the FIFO, TRUE if it is. + // Used for multiple sector CD reads. + bool data_transfer_done; + + bool DiscChanged; + + uint8 SubQBuf[4][0xC]; // One for each of the 4 most recent q-Modes. + uint8 SubQBuf_Last[0xC]; // The most recent q subchannel data, regardless of q-mode. + + uint8 SubPWBuf[96]; + +} pcecd_drive_t; + +typedef Blip_Synth < blip_good_quality, 1> CDSynth; + +enum +{ + CDDASTATUS_PAUSED = -1, + CDDASTATUS_STOPPED = 0, + CDDASTATUS_PLAYING = 1, +}; + +enum +{ + PLAYMODE_SILENT = 0x00, + PLAYMODE_NORMAL, + PLAYMODE_INTERRUPT, + PLAYMODE_LOOP, +}; + +typedef struct +{ + int32 CDDADivAcc; + uint32 scan_sec_end; + + uint8 PlayMode; + CDSynth CDDASynth; + int32 CDDAVolume; + int16 last_sample[2]; + int16 CDDASectorBuffer[1176]; + uint32 CDDAReadPos; + + int8 CDDAStatus; + uint8 ScanMode; + int32 CDDADiv; + int CDDATimeDiv; +} cdda_t; + +static INLINE void MakeSense(uint8 target[18], uint8 key, uint8 asc, uint8 ascq, uint8 fru) +{ + memset(target, 0, 18); + + target[0] = 0x70; // Current errors and sense data is not SCSI compliant + target[2] = key; + target[7] = 0x0A; + target[12] = asc; // Additional Sense Code + target[13] = ascq; // Additional Sense Code Qualifier + target[14] = fru; // Field Replaceable Unit code +} + +static pcecd_drive_timestamp_t lastts; +static int64 monotonic_timestamp; +static int64 pce_lastsapsp_timestamp; + +static pcecd_drive_t cd; +pcecd_drive_bus_t cd_bus; +static cdda_t cdda; + +static SimpleFIFO din(2048); + +static CDUtility::TOC toc; + +static uint32 read_sec_start; +static uint32 read_sec; +static uint32 read_sec_end; + +static int32 CDReadTimer; +static uint32 SectorAddr; +static uint32 SectorCount; + + +enum +{ + PHASE_BUS_FREE = 0, + PHASE_COMMAND, + PHASE_DATA_IN, + PHASE_STATUS, + PHASE_MESSAGE_IN, +}; + +static unsigned int CurrentPhase; +static void ChangePhase(const unsigned int new_phase); + +static void VirtualReset(void) +{ + din.Flush(); + + cdda.CDDADivAcc = (int64)System_Clock * 65536 / 44100; + CDReadTimer = 0; + + pce_lastsapsp_timestamp = monotonic_timestamp; + + SectorAddr = SectorCount = 0; + read_sec_start = read_sec = 0; + read_sec_end = ~0; + + cdda.PlayMode = PLAYMODE_SILENT; + cdda.CDDAReadPos = 0; + cdda.CDDAStatus = CDDASTATUS_STOPPED; + cdda.CDDADiv = 0; + + cdda.ScanMode = 0; + cdda.scan_sec_end = 0; + + ChangePhase(PHASE_BUS_FREE); +} + +void PCECD_Drive_Power(pcecd_drive_timestamp_t system_timestamp) +{ + memset(&cd, 0, sizeof(pcecd_drive_t)); + memset(&cd_bus, 0, sizeof(pcecd_drive_bus_t)); + + monotonic_timestamp = system_timestamp; + + cd.DiscChanged = false; + + if(Cur_CDIF && !TrayOpen) + Cur_CDIF->ReadTOC(&toc); + + CurrentPhase = PHASE_BUS_FREE; + + VirtualReset(); +} + + +void PCECD_Drive_SetDB(uint8 data) +{ + cd_bus.DB = data; + //printf("Set DB: %02x\n", data); +} + +void PCECD_Drive_SetACK(bool set) +{ + SetkingACK(set); + //printf("Set ACK: %d\n", set); +} + +void PCECD_Drive_SetSEL(bool set) +{ + SetkingSEL(set); + //printf("Set SEL: %d\n", set); +} + +void PCECD_Drive_SetRST(bool set) +{ + SetkingRST(set); + //printf("Set RST: %d\n", set); +} + +static void GenSubQFromSubPW(void) +{ + uint8 SubQBuf[0xC]; + + subq_deinterleave(cd.SubPWBuf, SubQBuf); + + //printf("Real %d/ SubQ %d - ", read_sec, BCD_to_U8(SubQBuf[7]) * 75 * 60 + BCD_to_U8(SubQBuf[8]) * 75 + BCD_to_U8(SubQBuf[9]) - 150); + // Debug code, remove me. + //for(int i = 0; i < 0xC; i++) + // printf("%02x ", SubQBuf[i]); + //printf("\n"); + + if(!subq_check_checksum(SubQBuf)) + { + //SCSIDBG("SubQ checksum error!"); + } + else + { + memcpy(cd.SubQBuf_Last, SubQBuf, 0xC); + + uint8 adr = SubQBuf[0] & 0xF; + + if(adr <= 0x3) + memcpy(cd.SubQBuf[adr], SubQBuf, 0xC); + + //if(adr == 0x02) + //for(int i = 0; i < 12; i++) + // printf("%02x\n", cd.SubQBuf[0x2][i]); + } +} + + +#define STATUS_GOOD 0 +#define STATUS_CHECK_CONDITION 1 + +#define SENSEKEY_NO_SENSE 0x0 +#define SENSEKEY_NOT_READY 0x2 +#define SENSEKEY_MEDIUM_ERROR 0x3 +#define SENSEKEY_HARDWARE_ERROR 0x4 +#define SENSEKEY_ILLEGAL_REQUEST 0x5 +#define SENSEKEY_UNIT_ATTENTION 0x6 +#define SENSEKEY_ABORTED_COMMAND 0xB + +#define ASC_MEDIUM_NOT_PRESENT 0x3A + + +// NEC sub-errors(ASC), no ASCQ. +#define NSE_NO_DISC 0x0B // Used with SENSEKEY_NOT_READY - This condition occurs when tray is closed with no disc present. +#define NSE_TRAY_OPEN 0x0D // Used with SENSEKEY_NOT_READY +#define NSE_SEEK_ERROR 0x15 +#define NSE_HEADER_READ_ERROR 0x16 // Used with SENSEKEY_MEDIUM_ERROR +#define NSE_NOT_AUDIO_TRACK 0x1C // Used with SENSEKEY_MEDIUM_ERROR +#define NSE_NOT_DATA_TRACK 0x1D // Used with SENSEKEY_MEDIUM_ERROR +#define NSE_INVALID_COMMAND 0x20 +#define NSE_INVALID_ADDRESS 0x21 +#define NSE_INVALID_PARAMETER 0x22 +#define NSE_END_OF_VOLUME 0x25 +#define NSE_INVALID_REQUEST_IN_CDB 0x27 +#define NSE_DISC_CHANGED 0x28 // Used with SENSEKEY_UNIT_ATTENTION +#define NSE_AUDIO_NOT_PLAYING 0x2C + +// ASC, ASCQ pair +#define AP_UNRECOVERED_READ_ERROR 0x11, 0x00 +#define AP_LEC_UNCORRECTABLE_ERROR 0x11, 0x05 +#define AP_CIRC_UNRECOVERED_ERROR 0x11, 0x06 + +#define AP_UNKNOWN_MEDIUM_FORMAT 0x30, 0x01 +#define AP_INCOMPAT_MEDIUM_FORMAT 0x30, 0x02 + +static void ChangePhase(const unsigned int new_phase) +{ + //printf("New phase: %d %lld\n", new_phase, monotonic_timestamp); + switch(new_phase) + { + case PHASE_BUS_FREE: + SetBSY(false); + SetMSG(false); + SetCD(false); + SetIO(false); + SetREQ(false); + + CDIRQCallback(0x8000 | PCECD_Drive_IRQ_DATA_TRANSFER_DONE); + break; + + case PHASE_DATA_IN: // Us to them + SetBSY(true); + SetMSG(false); + SetCD(false); + SetIO(true); + //SetREQ(true); + SetREQ(false); + break; + + case PHASE_STATUS: // Us to them + SetBSY(true); + SetMSG(false); + SetCD(true); + SetIO(true); + SetREQ(true); + break; + + case PHASE_MESSAGE_IN: // Us to them + SetBSY(true); + SetMSG(true); + SetCD(true); + SetIO(true); + SetREQ(true); + break; + + case PHASE_COMMAND: // Them to us + SetBSY(true); + SetMSG(false); + SetCD(true); + SetIO(false); + SetREQ(true); + break; + } + CurrentPhase = new_phase; +} + +static void SendStatusAndMessage(uint8 status, uint8 message) +{ + // This should never ever happen, but that doesn't mean it won't. ;) + if(din.CanRead()) + { + printf("BUG: %d bytes still in SCSI CD FIFO\n", din.CanRead()); + din.Flush(); + } + + cd.message_pending = message; + + cd.status_sent = FALSE; + cd.message_sent = FALSE; + + + if(status == STATUS_GOOD) + cd_bus.DB = 0x00; + else + cd_bus.DB = 0x01; + + + ChangePhase(PHASE_STATUS); +} + +static void DoSimpleDataIn(const uint8 *data_in, uint32 len) +{ + din.Write(data_in, len); + + cd.data_transfer_done = true; + + ChangePhase(PHASE_DATA_IN); +} + +void PCECD_Drive_SetDisc(bool new_tray_open, CDIF *cdif, bool no_emu_side_effects) +{ + Cur_CDIF = cdif; + + // Closing the tray. + if(TrayOpen && !new_tray_open) + { + TrayOpen = false; + + if(cdif) + { + cdif->ReadTOC(&toc); + + if(!no_emu_side_effects) + { + memset(cd.SubQBuf, 0, sizeof(cd.SubQBuf)); + memset(cd.SubQBuf_Last, 0, sizeof(cd.SubQBuf_Last)); + cd.DiscChanged = true; + } + } + } + else if(!TrayOpen && new_tray_open) // Opening the tray + { + TrayOpen = true; + } +} + +static void CommandCCError(int key, int asc = 0, int ascq = 0) +{ + //printf("CC Error: %02x %02x %02x\n", key, asc, ascq); + + cd.key_pending = key; + cd.asc_pending = asc; + cd.ascq_pending = ascq; + cd.fru_pending = 0x00; + + SendStatusAndMessage(STATUS_CHECK_CONDITION, 0x00); +} + +static bool ValidateRawDataSector(uint8 *data, const uint32 lba) +{ + if(!edc_lec_check_and_correct(data, false)) + { + MDFN_DispMessage(_("Uncorrectable data at sector %u"), lba); + MDFN_PrintError(_("Uncorrectable data at sector %u"), lba); + + din.Flush(); + cd.data_transfer_done = false; + + CommandCCError(SENSEKEY_MEDIUM_ERROR, AP_LEC_UNCORRECTABLE_ERROR); + return(false); + } + + return(true); +} + +static void DoREADBase(uint32 sa, uint32 sc) +{ + if(sa > toc.tracks[100].lba) // Another one of those off-by-one PC-FX CD bugs. + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + return; + } + + // Case for READ(10) and READ(12) where sc == 0, and sa == toc.tracks[100].lba + if(!sc && sa == toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_HEADER_READ_ERROR); + return; + } + + SectorAddr = sa; + SectorCount = sc; + if(SectorCount) + { + Cur_CDIF->HintReadSector(sa); //, sa + sc); + + CDReadTimer = (uint64)3 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; + } + else + { + CDReadTimer = 0; + SendStatusAndMessage(STATUS_GOOD, 0x00); + } + cdda.CDDAStatus = CDDASTATUS_STOPPED; +} + +// +// +// +static void DoTESTUNITREADY(const uint8 *cdb) +{ + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + +static void DoREQUESTSENSE(const uint8 *cdb) +{ + uint8 data_in[18]; + + MakeSense(data_in, cd.key_pending, cd.asc_pending, cd.ascq_pending, cd.fru_pending); + + DoSimpleDataIn(data_in, 18); + + cd.key_pending = 0; + cd.asc_pending = 0; + cd.ascq_pending = 0; + cd.fru_pending = 0; +} + +/******************************************************** +* * +* SCSI Command 0x08 - READ(6) * +* * +********************************************************/ +static void DoREAD6(const uint8 *cdb) +{ + uint32 sa = ((cdb[1] & 0x1F) << 16) | (cdb[2] << 8) | (cdb[3] << 0); + uint32 sc = cdb[4]; + + // TODO: confirm real PCE does this(PC-FX does at least). + if(!sc) + { + //SCSIDBG("READ(6) with count == 0.\n"); + sc = 256; + } + + DoREADBase(sa, sc); +} + +/******************************************************** +* * +* PC Engine CD Command 0xD8 - SAPSP * +* * +********************************************************/ +static void DoNEC_PCE_SAPSP(const uint8 *cdb) +{ + uint32 new_read_sec_start; + + //printf("Set audio start: %02x %02x %02x %02x %02x %02x %02x\n", cdb[9], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6]); + switch (cdb[9] & 0xc0) + { + default: //SCSIDBG("Unknown SAPSP 9: %02x\n", cdb[9]); + case 0x00: + new_read_sec_start = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + break; + + case 0x40: + new_read_sec_start = AMSF_to_LBA(BCD_to_U8(cdb[2]), BCD_to_U8(cdb[3]), BCD_to_U8(cdb[4])); + break; + + case 0x80: + { + int track = BCD_to_U8(cdb[2]); + + if(!track) + track = 1; + else if(track >= toc.last_track + 1) + track = 100; + new_read_sec_start = toc.tracks[track].lba; + } + break; + } + + //printf("%lld\n", (long long)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock); + if(cdda.CDDAStatus == CDDASTATUS_PLAYING && new_read_sec_start == read_sec_start && ((int64)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock) < 190) + { + pce_lastsapsp_timestamp = monotonic_timestamp; + + SendStatusAndMessage(STATUS_GOOD, 0x00); + CDIRQCallback(PCECD_Drive_IRQ_DATA_TRANSFER_DONE); + return; + } + + pce_lastsapsp_timestamp = monotonic_timestamp; + + read_sec = read_sec_start = new_read_sec_start; + read_sec_end = toc.tracks[100].lba; + + + cdda.CDDAReadPos = 588; + + cdda.CDDAStatus = CDDASTATUS_PAUSED; + cdda.PlayMode = PLAYMODE_SILENT; + + if(cdb[1]) + { + cdda.PlayMode = PLAYMODE_NORMAL; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + } + + if(read_sec < toc.tracks[100].lba) + Cur_CDIF->HintReadSector(read_sec); + + SendStatusAndMessage(STATUS_GOOD, 0x00); + CDIRQCallback(PCECD_Drive_IRQ_DATA_TRANSFER_DONE); +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xD9 - SAPEP * +* * +********************************************************/ +static void DoNEC_PCE_SAPEP(const uint8 *cdb) +{ + uint32 new_read_sec_end; + + //printf("Set audio end: %02x %02x %02x %02x %02x %02x %02x\n", cdb[9], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6]); + + switch (cdb[9] & 0xc0) + { + default: //SCSIDBG("Unknown SAPEP 9: %02x\n", cdb[9]); + + case 0x00: + new_read_sec_end = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; + break; + + case 0x40: + new_read_sec_end = BCD_to_U8(cdb[4]) + 75 * (BCD_to_U8(cdb[3]) + 60 * BCD_to_U8(cdb[2])); + new_read_sec_end -= 150; + break; + + case 0x80: + { + int track = BCD_to_U8(cdb[2]); + + if(!track) + track = 1; + else if(track >= toc.last_track + 1) + track = 100; + new_read_sec_end = toc.tracks[track].lba; + } + break; + } + + read_sec_end = new_read_sec_end; + + switch(cdb[1]) // PCE CD(TODO: Confirm these, and check the mode mask): + { + default: + case 0x03: cdda.PlayMode = PLAYMODE_NORMAL; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + break; + + case 0x02: cdda.PlayMode = PLAYMODE_INTERRUPT; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + break; + + case 0x01: cdda.PlayMode = PLAYMODE_LOOP; + cdda.CDDAStatus = CDDASTATUS_PLAYING; + break; + + case 0x00: cdda.PlayMode = PLAYMODE_SILENT; + cdda.CDDAStatus = CDDASTATUS_STOPPED; + break; + } + + SendStatusAndMessage(STATUS_GOOD, 0x00); +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xDA - Pause * +* * +********************************************************/ +static void DoNEC_PCE_PAUSE(const uint8 *cdb) +{ + if(cdda.CDDAStatus != CDDASTATUS_STOPPED) // Hmm, should we give an error if it tries to pause and it's already paused? + { + cdda.CDDAStatus = CDDASTATUS_PAUSED; + SendStatusAndMessage(STATUS_GOOD, 0x00); + } + else // Definitely give an error if it tries to pause when no track is playing! + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); + } +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xDD - Read Subchannel Q * +* * +********************************************************/ +static void DoNEC_PCE_READSUBQ(const uint8 *cdb) +{ + uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; + uint8 data_in[8192]; + + memset(data_in, 0x00, 10); + + data_in[2] = SubQBuf[1]; // Track + data_in[3] = SubQBuf[2]; // Index + data_in[4] = SubQBuf[3]; // M(rel) + data_in[5] = SubQBuf[4]; // S(rel) + data_in[6] = SubQBuf[5]; // F(rel) + data_in[7] = SubQBuf[7]; // M(abs) + data_in[8] = SubQBuf[8]; // S(abs) + data_in[9] = SubQBuf[9]; // F(abs) + + if(cdda.CDDAStatus == CDDASTATUS_PAUSED) + data_in[0] = 2; // Pause + else if(cdda.CDDAStatus == CDDASTATUS_PLAYING) + data_in[0] = 0; // Playing + else + data_in[0] = 3; // Stopped + + DoSimpleDataIn(data_in, 10); +} + + + +/******************************************************** +* * +* PC Engine CD Command 0xDE - Get Directory Info * +* * +********************************************************/ +static void DoNEC_PCE_GETDIRINFO(const uint8 *cdb) +{ + // Problems: + // Returned data lengths on real PCE are not confirmed. + // Mode 0x03 behavior not tested on real PCE + + uint8 data_in[2048]; + uint32 data_in_size = 0; + + memset(data_in, 0, sizeof(data_in)); + + switch(cdb[1]) + { + default: //MDFN_DispMessage("Unknown GETDIRINFO Mode: %02x", cdb[1]); + //printf("Unknown GETDIRINFO Mode: %02x", cdb[1]); + case 0x0: + data_in[0] = U8_to_BCD(toc.first_track); + data_in[1] = U8_to_BCD(toc.last_track); + + data_in_size = 2; + break; + + case 0x1: + { + uint8 m, s, f; + + LBA_to_AMSF(toc.tracks[100].lba, &m, &s, &f); + + data_in[0] = U8_to_BCD(m); + data_in[1] = U8_to_BCD(s); + data_in[2] = U8_to_BCD(f); + + data_in_size = 3; + } + break; + + case 0x2: + { + uint8 m, s, f; + int track = BCD_to_U8(cdb[2]); + + if(!track) + track = 1; + else if(cdb[2] == 0xAA) + { + track = 100; + } + else if(track > 99) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); + return; + } + + LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); + + data_in[0] = U8_to_BCD(m); + data_in[1] = U8_to_BCD(s); + data_in[2] = U8_to_BCD(f); + data_in[3] = toc.tracks[track].control; + data_in_size = 4; + } + break; + } + + DoSimpleDataIn(data_in, data_in_size); +} + +#define SCF_REQUIRES_MEDIUM 0x01 + +typedef struct +{ + uint8 cmd; + uint8 flags; + void (*func)(const uint8 *cdb); + const char *pretty_name; + const char *format_string; +} SCSICH; + +static const uint8 RequiredCDBLen[16] = +{ + 6, // 0x0n + 6, // 0x1n + 10, // 0x2n + 10, // 0x3n + 10, // 0x4n + 10, // 0x5n + 10, // 0x6n + 10, // 0x7n + 10, // 0x8n + 10, // 0x9n + 12, // 0xAn + 12, // 0xBn + 10, // 0xCn + 10, // 0xDn + 10, // 0xEn + 10, // 0xFn +}; + +static SCSICH PCECommandDefs[] = +{ + { 0x00, SCF_REQUIRES_MEDIUM, DoTESTUNITREADY, "Test Unit Ready" }, + { 0x03, 0, DoREQUESTSENSE, "Request Sense" }, + { 0x08, SCF_REQUIRES_MEDIUM, DoREAD6, "Read(6)" }, + + { 0xD8, SCF_REQUIRES_MEDIUM, DoNEC_PCE_SAPSP, "Set Audio Playback Start Position" }, + { 0xD9, SCF_REQUIRES_MEDIUM, DoNEC_PCE_SAPEP, "Set Audio Playback End Position" }, + { 0xDA, SCF_REQUIRES_MEDIUM, DoNEC_PCE_PAUSE, "Pause" }, + { 0xDD, SCF_REQUIRES_MEDIUM, DoNEC_PCE_READSUBQ, "Read Subchannel Q" }, + { 0xDE, SCF_REQUIRES_MEDIUM, DoNEC_PCE_GETDIRINFO, "Get Dir Info" }, + + { 0xFF, 0, 0, NULL, NULL }, +}; + +void PCECD_Drive_ResetTS(void) +{ + lastts = 0; +} + +void PCECD_Drive_GetCDDAValues(int16 &left, int16 &right) +{ + if(cdda.CDDAStatus) + { + left = cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2]; + right = cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + 1]; + } + else + left = right = 0; +} + +static INLINE void RunCDDA(uint32 system_timestamp, int32 run_time) +{ + if(cdda.CDDAStatus == CDDASTATUS_PLAYING) + { + int32 sample[2]; + + cdda.CDDADiv -= run_time << 16; + + while(cdda.CDDADiv <= 0) + { + const uint32 synthtime = ((system_timestamp + (cdda.CDDADiv >> 16))) / cdda.CDDATimeDiv; + + cdda.CDDADiv += cdda.CDDADivAcc; + + //MDFN_DispMessage("%d %d %d\n", read_sec_start, read_sec, read_sec_end); + + if(cdda.CDDAReadPos == 588) + { + if(read_sec >= read_sec_end) + { + switch(cdda.PlayMode) + { + case PLAYMODE_SILENT: + case PLAYMODE_NORMAL: + cdda.CDDAStatus = CDDASTATUS_STOPPED; + break; + + case PLAYMODE_INTERRUPT: + cdda.CDDAStatus = CDDASTATUS_STOPPED; + CDIRQCallback(PCECD_Drive_IRQ_DATA_TRANSFER_DONE); + break; + + case PLAYMODE_LOOP: + read_sec = read_sec_start; + break; + } + + // If CDDA playback is stopped, break out of our while(CDDADiv ...) loop and don't play any more sound! + if(cdda.CDDAStatus == CDDASTATUS_STOPPED) + break; + } + + // Don't play past the user area of the disc. + if(read_sec >= toc.tracks[100].lba) + { + cdda.CDDAStatus = CDDASTATUS_STOPPED; + break; + } + + if(TrayOpen || !Cur_CDIF) + { + cdda.CDDAStatus = CDDASTATUS_STOPPED; + + #if 0 + cd.data_transfer_done = FALSE; + cd.key_pending = SENSEKEY_NOT_READY; + cd.asc_pending = ASC_MEDIUM_NOT_PRESENT; + cd.ascq_pending = 0x00; + cd.fru_pending = 0x00; + SendStatusAndMessage(STATUS_CHECK_CONDITION, 0x00); + #endif + + break; + } + + + cdda.CDDAReadPos = 0; + + { + uint8 tmpbuf[2352 + 96]; + + Cur_CDIF->ReadRawSector(tmpbuf, read_sec); //, read_sec_end, read_sec_start); + + for(int i = 0; i < 588 * 2; i++) + cdda.CDDASectorBuffer[i] = MDFN_de16lsb(&tmpbuf[i * 2]); + + memcpy(cd.SubPWBuf, tmpbuf + 2352, 96); + } + GenSubQFromSubPW(); + read_sec++; + } // End if(CDDAReadPos == 588) + + // If the last valid sub-Q data decoded indicate that the corresponding sector is a data sector, don't output the + // current sector as audio. + sample[0] = sample[1] = 0; + + if(!(cd.SubQBuf_Last[0] & 0x40) && cdda.PlayMode != PLAYMODE_SILENT) + { + sample[0] = (cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + 0] * cdda.CDDAVolume) >> 16; + sample[1] = (cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + 1] * cdda.CDDAVolume) >> 16; + } + + if(!(cdda.CDDAReadPos % 6)) + { + int subindex = cdda.CDDAReadPos / 6 - 2; + + if(subindex >= 0) + CDStuffSubchannels(cd.SubPWBuf[subindex], subindex); + else // The system-specific emulation code should handle what value the sync bytes are. + CDStuffSubchannels(0x00, subindex); + } + + if(sbuf) + { + cdda.CDDASynth.offset_inline(synthtime, sample[0] - cdda.last_sample[0], &sbuf[0]); + cdda.CDDASynth.offset_inline(synthtime, sample[1] - cdda.last_sample[1], &sbuf[1]); + } + + cdda.last_sample[0] = sample[0]; + cdda.last_sample[1] = sample[1]; + + cdda.CDDAReadPos++; + } + } +} + +static INLINE void RunCDRead(uint32 system_timestamp, int32 run_time) +{ + if(CDReadTimer > 0) + { + CDReadTimer -= run_time; + + if(CDReadTimer <= 0) + { + if(din.CanWrite() < 2048) + { + //printf("Carp: %d %d %d\n", din.CanWrite(), SectorCount, CDReadTimer); + //CDReadTimer = (cd.data_in_size - cd.data_in_pos) * 10; + + CDReadTimer += (uint64) 1 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; + + //CDReadTimer += (uint64) 1 * 128 * System_Clock / CD_DATA_TRANSFER_RATE; + } + else + { + uint8 tmp_read_buf[2352 + 96]; + + if(TrayOpen) + { + din.Flush(); + cd.data_transfer_done = FALSE; + + CommandCCError(SENSEKEY_NOT_READY, NSE_TRAY_OPEN); + } + else if(!Cur_CDIF) + { + CommandCCError(SENSEKEY_NOT_READY, NSE_NO_DISC); + } + else if(SectorAddr >= toc.tracks[100].lba) + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); + } + else if(!Cur_CDIF->ReadRawSector(tmp_read_buf, SectorAddr)) //, SectorAddr + SectorCount)) + { + cd.data_transfer_done = FALSE; + + CommandCCError(SENSEKEY_ILLEGAL_REQUEST); + } + else if(ValidateRawDataSector(tmp_read_buf, SectorAddr)) + { + memcpy(cd.SubPWBuf, tmp_read_buf + 2352, 96); + + if(tmp_read_buf[12 + 3] == 0x2) + din.Write(tmp_read_buf + 24, 2048); + else + din.Write(tmp_read_buf + 16, 2048); + + GenSubQFromSubPW(); + + CDIRQCallback(PCECD_Drive_IRQ_DATA_TRANSFER_READY); + + SectorAddr++; + SectorCount--; + + if(CurrentPhase != PHASE_DATA_IN) + ChangePhase(PHASE_DATA_IN); + + if(SectorCount) + { + cd.data_transfer_done = FALSE; + CDReadTimer += (uint64) 1 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; + } + else + { + cd.data_transfer_done = TRUE; + } + } + } // end else to if(!Cur_CDIF->ReadSector + + } + } +} + + +uint32 PCECD_Drive_Run(pcecd_drive_timestamp_t system_timestamp) +{ + int32 run_time = system_timestamp - lastts; + + if(system_timestamp < lastts) + { + fprintf(stderr, "Meow: %d %d\n", system_timestamp, lastts); + assert(system_timestamp >= lastts); + } + + monotonic_timestamp += run_time; + + lastts = system_timestamp; + + RunCDRead(system_timestamp, run_time); + RunCDDA(system_timestamp, run_time); + + bool ResetNeeded = false; + + if(RST_signal && !cd.last_RST_signal) + ResetNeeded = true; + + cd.last_RST_signal = RST_signal; + + if(ResetNeeded) + { + //puts("RST"); + VirtualReset(); + } + else switch(CurrentPhase) + { + case PHASE_BUS_FREE: + if(SEL_signal) + { + ChangePhase(PHASE_COMMAND); + } + break; + + case PHASE_COMMAND: + if(REQ_signal && ACK_signal) // Data bus is valid nowww + { + //printf("Command Phase Byte I->T: %02x, %d\n", cd_bus.DB, cd.command_buffer_pos); + cd.command_buffer[cd.command_buffer_pos++] = cd_bus.DB; + SetREQ(FALSE); + } + + if(!REQ_signal && !ACK_signal && cd.command_buffer_pos) // Received at least one byte, what should we do? + { + if(cd.command_buffer_pos == RequiredCDBLen[cd.command_buffer[0] >> 4]) + { + const SCSICH* cmd_info_ptr = PCECommandDefs; + + while(cmd_info_ptr->pretty_name && cmd_info_ptr->cmd != cd.command_buffer[0]) + cmd_info_ptr++; + + if(cmd_info_ptr->pretty_name == NULL) // Command not found! + { + CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_COMMAND); + + //SCSIDBG("Bad Command: %02x\n", cd.command_buffer[0]); + + cd.command_buffer_pos = 0; + } + else + { + if(TrayOpen && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) + { + CommandCCError(SENSEKEY_NOT_READY, NSE_TRAY_OPEN); + } + else if(!Cur_CDIF && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) + { + CommandCCError(SENSEKEY_NOT_READY, NSE_NO_DISC); + } + else if(cd.DiscChanged && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) + { + CommandCCError(SENSEKEY_UNIT_ATTENTION, NSE_DISC_CHANGED); + cd.DiscChanged = false; + } + else + { + cmd_info_ptr->func(cd.command_buffer); + } + + cd.command_buffer_pos = 0; + } + } // end if(cd.command_buffer_pos == RequiredCDBLen[cd.command_buffer[0] >> 4]) + else // Otherwise, get more data for the command! + SetREQ(TRUE); + } + break; + + case PHASE_STATUS: + if(REQ_signal && ACK_signal) + { + SetREQ(FALSE); + cd.status_sent = TRUE; + } + + if(!REQ_signal && !ACK_signal && cd.status_sent) + { + // Status sent, so get ready to send the message! + cd.status_sent = FALSE; + cd_bus.DB = cd.message_pending; + + ChangePhase(PHASE_MESSAGE_IN); + } + break; + + case PHASE_DATA_IN: + if(!REQ_signal && !ACK_signal) + { + //puts("REQ and ACK false"); + if(din.CanRead() == 0) // aaand we're done! + { + CDIRQCallback(0x8000 | PCECD_Drive_IRQ_DATA_TRANSFER_READY); + + if(cd.data_transfer_done) + { + SendStatusAndMessage(STATUS_GOOD, 0x00); + cd.data_transfer_done = FALSE; + CDIRQCallback(PCECD_Drive_IRQ_DATA_TRANSFER_DONE); + } + } + else + { + cd_bus.DB = din.ReadByte(); + SetREQ(TRUE); + } + } + if(REQ_signal && ACK_signal) + { + //puts("REQ and ACK true"); + SetREQ(FALSE); + } + break; + + case PHASE_MESSAGE_IN: + if(REQ_signal && ACK_signal) + { + SetREQ(FALSE); + cd.message_sent = TRUE; + } + + if(!REQ_signal && !ACK_signal && cd.message_sent) + { + cd.message_sent = FALSE; + ChangePhase(PHASE_BUS_FREE); + } + break; + } + + int32 next_time = 0x7fffffff; + + if(CDReadTimer > 0 && CDReadTimer < next_time) + next_time = CDReadTimer; + + if(cdda.CDDAStatus == CDDASTATUS_PLAYING) + { + int32 cdda_div_sexytime = (cdda.CDDADiv + 0xFFFF) >> 16; + if(cdda_div_sexytime > 0 && cdda_div_sexytime < next_time) + next_time = cdda_div_sexytime; + } + + assert(next_time >= 0); + + return(next_time); +} + +void PCECD_Drive_SetTransferRate(uint32 TransferRate) +{ + CD_DATA_TRANSFER_RATE = TransferRate; +} + +void PCECD_Drive_Close(void) +{ + +} + +void PCECD_Drive_Init(int cdda_time_div, Blip_Buffer* lrbufs, uint32 TransferRate, uint32 SystemClock, void (*IRQFunc)(int), void (*SSCFunc)(uint8, int)) +{ + Cur_CDIF = NULL; + TrayOpen = true; + + monotonic_timestamp = 0; + lastts = 0; + + //din = new SimpleFIFO(2048); + + cdda.CDDATimeDiv = cdda_time_div; + + cdda.CDDAVolume = 65536; + cdda.CDDASynth.volume(1.0f / 65536); + cdda.CDDASynth.treble_eq(0); + sbuf = lrbufs; + + CD_DATA_TRANSFER_RATE = TransferRate; + System_Clock = SystemClock; + CDIRQCallback = IRQFunc; + CDStuffSubchannels = SSCFunc; +} + +void PCECD_Drive_SetCDDAVolume(unsigned vol) +{ + cdda.CDDAVolume = vol; +} + +int PCECD_Drive_StateAction(StateMem * sm, int load, int data_only, const char *sname) +{ + SFORMAT StateRegs[] = + { + SFVARN(cd_bus.DB, "DB"), + SFVARN(cd_bus.signals, "Signals"), + SFVAR(CurrentPhase), + + SFVARN(cd.last_RST_signal, "last_RST"), + SFVARN(cd.message_pending, "message_pending"), + SFVARN(cd.status_sent, "status_sent"), + SFVARN(cd.message_sent, "message_sent"), + SFVARN(cd.key_pending, "key_pending"), + SFVARN(cd.asc_pending, "asc_pending"), + SFVARN(cd.ascq_pending, "ascq_pending"), + SFVARN(cd.fru_pending, "fru_pending"), + + SFARRAYN(cd.command_buffer, 256, "command_buffer"), + SFVARN(cd.command_buffer_pos, "command_buffer_pos"), + SFVARN(cd.command_size_left, "command_size_left"), + + // Don't save the FIFO's write position, it will be reconstructed from read_pos and in_count + SFARRAYN(&din.data[0], din.data.size(), "din_fifo"), + SFVARN(din.read_pos, "din_read_pos"), + SFVARN(din.in_count, "din_in_count"), + SFVARN(cd.data_transfer_done, "data_transfer_done"), + + SFVARN(cd.DiscChanged, "DiscChanged"), + + SFVAR(cdda.PlayMode), + SFARRAY16(cdda.CDDASectorBuffer, 1176), + SFVAR(cdda.CDDAReadPos), + SFVAR(cdda.CDDAStatus), + SFVAR(cdda.CDDADiv), + SFVAR(read_sec_start), + SFVAR(read_sec), + SFVAR(read_sec_end), + + SFVAR(CDReadTimer), + SFVAR(SectorAddr), + SFVAR(SectorCount), + + SFVAR(cdda.ScanMode), + SFVAR(cdda.scan_sec_end), + + SFARRAYN(&cd.SubQBuf[0][0], sizeof(cd.SubQBuf), "SubQBufs"), + SFARRAYN(cd.SubQBuf_Last, sizeof(cd.SubQBuf_Last), "SubQBufLast"), + SFARRAYN(cd.SubPWBuf, sizeof(cd.SubPWBuf), "SubPWBuf"), + + SFVAR(monotonic_timestamp), + SFVAR(pce_lastsapsp_timestamp), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, sname); + + if(load) + { + din.in_count &= din.size - 1; + din.read_pos &= din.size - 1; + din.write_pos = (din.read_pos + din.in_count) & (din.size - 1); + + if(cdda.CDDADiv <= 0) + cdda.CDDADiv = 1; + //printf("%d %d %d\n", din.in_count, din.read_pos, din.write_pos); + } + + return (ret); +} + +} diff --git a/Mednafen/mednafen/pce_fast/pcecd_drive.h b/Mednafen/mednafen/pce_fast/pcecd_drive.h new file mode 100644 index 0000000000..e7ec80f381 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/pcecd_drive.h @@ -0,0 +1,88 @@ +#ifndef __PCEFAST_PCECD_Drive_H +#define __PCEFAST_PCECD_Drive_H + +#include + +namespace PCE_Fast +{ + +typedef int32 pcecd_drive_timestamp_t; + +struct pcecd_drive_bus_t +{ + // Data bus(FIXME: we should have a variable for the target and the initiator, and OR them together to be truly accurate). + uint8 DB; + + uint32 signals; +}; + +extern pcecd_drive_bus_t cd_bus; // Don't access this structure directly by name outside of pcecd_drive.c, but use the macros below. + +// Signals under our(the "target") control. +#define PCECD_Drive_IO_mask 0x001 +#define PCECD_Drive_CD_mask 0x002 +#define PCECD_Drive_MSG_mask 0x004 +#define PCECD_Drive_REQ_mask 0x008 +#define PCECD_Drive_BSY_mask 0x010 + +// Signals under the control of the initiator(not us!) +#define PCECD_Drive_kingRST_mask 0x020 +#define PCECD_Drive_kingACK_mask 0x040 +#define PCECD_Drive_kingSEL_mask 0x100 + +#define BSY_signal ((const bool)(cd_bus.signals & PCECD_Drive_BSY_mask)) +#define ACK_signal ((const bool)(cd_bus.signals & PCECD_Drive_kingACK_mask)) +#define RST_signal ((const bool)(cd_bus.signals & PCECD_Drive_kingRST_mask)) +#define MSG_signal ((const bool)(cd_bus.signals & PCECD_Drive_MSG_mask)) +#define SEL_signal ((const bool)(cd_bus.signals & PCECD_Drive_kingSEL_mask)) +#define REQ_signal ((const bool)(cd_bus.signals & PCECD_Drive_REQ_mask)) +#define IO_signal ((const bool)(cd_bus.signals & PCECD_Drive_IO_mask)) +#define CD_signal ((const bool)(cd_bus.signals & PCECD_Drive_CD_mask)) + +#define DB_signal ((const uint8)cd_bus.DB) + +#define PCECD_Drive_GetDB() DB_signal +#define PCECD_Drive_GetBSY() BSY_signal +#define PCECD_Drive_GetIO() IO_signal +#define PCECD_Drive_GetCD() CD_signal +#define PCECD_Drive_GetMSG() MSG_signal +#define PCECD_Drive_GetREQ() REQ_signal + +// Should we phase out getting these initiator-driven signals like this(the initiator really should keep track of them itself)? +#define PCECD_Drive_GetACK() ACK_signal +#define PCECD_Drive_GetRST() RST_signal +#define PCECD_Drive_GetSEL() SEL_signal + +void PCECD_Drive_Power(pcecd_drive_timestamp_t system_timestamp); +void PCECD_Drive_SetDB(uint8 data); + +// These PCECD_Drive_Set* functions are kind of misnomers, at least in comparison to the PCECD_Drive_Get* functions... +// They will set/clear the bits corresponding to the KING's side of the bus. +void PCECD_Drive_SetACK(bool set); +void PCECD_Drive_SetSEL(bool set); +void PCECD_Drive_SetRST(bool set); + +uint32 PCECD_Drive_Run(pcecd_drive_timestamp_t); +void PCECD_Drive_ResetTS(void); + +enum +{ + PCECD_Drive_IRQ_DATA_TRANSFER_DONE = 1, + PCECD_Drive_IRQ_DATA_TRANSFER_READY, + PCECD_Drive_IRQ_MAGICAL_REQ, +}; + +void PCECD_Drive_GetCDDAValues(int16 &left, int16 &right); + +void PCECD_Drive_Init(int CDDATimeDiv, Blip_Buffer* lrbufs, uint32 TransferRate, uint32 SystemClock, void (*IRQFunc)(int), void (*SSCFunc)(uint8, int)) MDFN_COLD; +void PCECD_Drive_Close(void) MDFN_COLD; + +void PCECD_Drive_SetTransferRate(uint32 TransferRate); +void PCECD_Drive_SetCDDAVolume(unsigned vol); // vol of 65536 = 1.0 = maximum. +int PCECD_Drive_StateAction(StateMem *sm, int load, int data_only, const char *sname); + +void PCECD_Drive_SetDisc(bool tray_open, CDIF *cdif, bool no_emu_side_effects = false) MDFN_COLD; + +} + +#endif diff --git a/Mednafen/mednafen/pce_fast/psg.cpp b/Mednafen/mednafen/pce_fast/psg.cpp new file mode 100644 index 0000000000..5410b79203 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/psg.cpp @@ -0,0 +1,673 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "psg.h" + +#include +#include +#include + +namespace PCE_Fast +{ + +void PCEFast_PSG::SetVolume(double new_volume) +{ + OutputVolume = new_volume; + + Synth.volume(OutputVolume / 6); +} + +void PCEFast_PSG::UpdateOutput_Norm(const int32 timestamp, psg_channel *ch) +{ + int32 samp[2]; + int sv = ch->dda; + + samp[0] = dbtable[ch->vl[0]][sv]; + samp[1] = dbtable[ch->vl[1]][sv]; + + Synth.offset_inline(timestamp, samp[0] - ch->blip_prev_samp[0], &sbuf[0]); + Synth.offset_inline(timestamp, samp[1] - ch->blip_prev_samp[1], &sbuf[1]); + + ch->blip_prev_samp[0] = samp[0]; + ch->blip_prev_samp[1] = samp[1]; +} + +void PCEFast_PSG::UpdateOutput_Noise(const int32 timestamp, psg_channel *ch) +{ + int32 samp[2]; + int sv = ((ch->lfsr & 1) << 5) - (ch->lfsr & 1); //(ch->lfsr & 0x1) ? 0x1F : 0; + + samp[0] = dbtable[ch->vl[0]][sv]; + samp[1] = dbtable[ch->vl[1]][sv]; + + Synth.offset_inline(timestamp, samp[0] - ch->blip_prev_samp[0], &sbuf[0]); + Synth.offset_inline(timestamp, samp[1] - ch->blip_prev_samp[1], &sbuf[1]); + + ch->blip_prev_samp[0] = samp[0]; + ch->blip_prev_samp[1] = samp[1]; +} + +void PCEFast_PSG::UpdateOutput_Off(const int32 timestamp, psg_channel *ch) +{ + int32 samp[2]; + + samp[0] = samp[1] = 0; + + Synth.offset_inline(timestamp, samp[0] - ch->blip_prev_samp[0], &sbuf[0]); + Synth.offset_inline(timestamp, samp[1] - ch->blip_prev_samp[1], &sbuf[1]); + + ch->blip_prev_samp[0] = samp[0]; + ch->blip_prev_samp[1] = samp[1]; +} + + +void PCEFast_PSG::UpdateOutput_Accum(const int32 timestamp, psg_channel *ch) +{ + int32 samp[2]; + + samp[0] = ((int32)dbtable_volonly[ch->vl[0]] * ((int32)ch->samp_accum - 496)) >> (8 + 5); + samp[1] = ((int32)dbtable_volonly[ch->vl[1]] * ((int32)ch->samp_accum - 496)) >> (8 + 5); + + Synth.offset_inline(timestamp, samp[0] - ch->blip_prev_samp[0], &sbuf[0]); + Synth.offset_inline(timestamp, samp[1] - ch->blip_prev_samp[1], &sbuf[1]); + + ch->blip_prev_samp[0] = samp[0]; + ch->blip_prev_samp[1] = samp[1]; +} + +// This function should always be called after RecalcFreqCache() (it's not called from RecalcFreqCache to avoid redundant code) +void PCEFast_PSG::RecalcUOFunc(int chnum) +{ + psg_channel *ch = &channel[chnum]; + + //printf("UO Update: %d, %02x\n", chnum, ch->control); + + if(!(ch->control & 0xC0)) + ch->UpdateOutput = &PCEFast_PSG::UpdateOutput_Off; + else if(ch->noisectrl & ch->control & 0x80) + ch->UpdateOutput = &PCEFast_PSG::UpdateOutput_Noise; + // If the control for the channel is in waveform play mode, and the (real) playback frequency is too high, and the channel is either not the LFO modulator channel or + // if the LFO trigger bit(which halts the LFO modulator channel's waveform incrementing when set) is clear + else if((ch->control & 0xC0) == 0x80 && ch->freq_cache <= 0xA && (chnum != 1 || !(lfoctrl & 0x80)) ) + ch->UpdateOutput = &PCEFast_PSG::UpdateOutput_Accum; + else + ch->UpdateOutput = &PCEFast_PSG::UpdateOutput_Norm; +} + + +void PCEFast_PSG::RecalcFreqCache(int chnum) +{ + psg_channel *ch = &channel[chnum]; + + if(chnum == 0 && (lfoctrl & 0x03)) + { + const uint32 shift = (((lfoctrl & 0x3) - 1) << 1); + uint8 la = channel[1].dda; + int32 tmp_freq = ((int32)ch->frequency + ((la - 0x10) << shift)) & 0xFFF; + + ch->freq_cache = (tmp_freq ? tmp_freq : 4096) << 1; + } + else + { + ch->freq_cache = (ch->frequency ? ch->frequency : 4096) << 1; + + if(chnum == 1 && (lfoctrl & 0x03)) + ch->freq_cache *= lfofreq ? lfofreq : 256; + } +} + +void PCEFast_PSG::RecalcNoiseFreqCache(int chnum) +{ + psg_channel *ch = &channel[chnum]; + int32 freq = 0x1F - (ch->noisectrl & 0x1F); + + if(!freq) + freq = 0x20; + else + freq <<= 6; + + freq <<= 1; + + ch->noise_freq_cache = freq; +} + +PCEFast_PSG::PCEFast_PSG(Blip_Buffer* bbs) : sbuf(bbs) +{ + Synth.treble_eq(-2.0); + + lastts = 0; + for(int ch = 0; ch < 6; ch++) + { + channel[ch].blip_prev_samp[0] = 0; + channel[ch].blip_prev_samp[1] = 0; + channel[ch].lastts = 0; + } + + SetVolume(1.0); + + for(int vl = 0; vl < 32; vl++) + { + double flub = 1; + + if(vl) + flub /= pow(2, (double)1 / 4 * vl); // ~1.5dB reduction per increment of vl + + if(vl == 0x1F) + flub = 0; + + for(int samp = 0; samp < 32; samp++) + { + int eff_samp = samp * 2 - 0x1F; + + dbtable[vl][samp] = (int32)(flub * eff_samp * 128); + dbtable_volonly[vl] = (int32)(flub * 65536); + } + } + + Power(0); +} + +PCEFast_PSG::~PCEFast_PSG() +{ + + +} + +int32 PCEFast_PSG::GetVL(const int chnum, const int lr) +{ + // Note: Changing the 0x1F(not that there should be) would require changing the channel pseudo-off volume check logic later on. + static const uint8 scale_tab[] = + { + 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, + 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F + }; + + psg_channel *ch = &channel[chnum]; + + const int gbal = 0x1F - scale_tab[(globalbalance >> (lr ? 0 : 4)) & 0xF]; + const int bal = 0x1F - scale_tab[(ch->balance >> (lr ? 0 : 4)) & 0xF]; + const int al = 0x1F - (ch->control & 0x1F); + int vol_reduction; + + vol_reduction = gbal + bal + al; + + if(vol_reduction > 0x1F) + vol_reduction = 0x1F; + + return(vol_reduction); +} + +void PCEFast_PSG::Write(int32 timestamp, uint8 A, uint8 V) +{ + A &= 0x0F; + + if(A == 0x00) + { + select = (V & 0x07); + return; + } + + Update(timestamp); + + psg_channel *ch = &channel[select]; + + //if(A == 0x01 || select == 5) + // printf("Write Ch: %d %04x %02x, %d\n", select, A, V, timestamp); + + switch(A) + { + default: break; + + case 0x01: /* Global sound balance */ + globalbalance = V; + vol_pending = true; + break; + + case 0x02: /* Channel frequency (LSB) */ + if(select > 5) return; // no more than 6 channels, silly game. + + ch->frequency = (ch->frequency & 0x0F00) | V; + RecalcFreqCache(select); + RecalcUOFunc(select); + break; + + case 0x03: /* Channel frequency (MSB) */ + if(select > 5) return; // no more than 6 channels, silly game. + + ch->frequency = (ch->frequency & 0x00FF) | ((V & 0x0F) << 8); + RecalcFreqCache(select); + RecalcUOFunc(select); + break; + + case 0x04: /* Channel enable, DDA, volume */ + if(select > 5) return; // no more than 6 channels, silly game. + + if((ch->control & 0x40) && !(V & 0x40)) + { + ch->waveform_index = 0; + ch->dda = ch->waveform[ch->waveform_index]; + ch->counter = ch->freq_cache; + } + + if(!(ch->control & 0x80) && (V & 0x80)) + { + if(!(V & 0x40)) + { + ch->waveform_index = (ch->waveform_index + 1) & 0x1F; + ch->dda = ch->waveform[ch->waveform_index]; + } + } + + ch->control = V; + RecalcFreqCache(select); + RecalcUOFunc(select); + + vol_pending = true; + break; + + case 0x05: /* Channel balance */ + if(select > 5) return; // no more than 6 channels, silly game. + ch->balance = V; + + vol_pending = true; + break; + + case 0x06: /* Channel waveform data */ + if(select > 5) return; // no more than 6 channels, silly game. + V &= 0x1F; + + if(!(ch->control & 0x40)) + { + ch->samp_accum -= ch->waveform[ch->waveform_index]; + ch->waveform[ch->waveform_index] = V; + ch->samp_accum += ch->waveform[ch->waveform_index]; + } + + if((ch->control & 0xC0) == 0x00) + ch->waveform_index = ((ch->waveform_index + 1) & 0x1F); + + if(ch->control & 0x80) + { + // According to my tests(on SuperGrafx), writing to this channel + // will update the waveform value cache/latch regardless of DDA mode being enabled. + ch->dda = V; + } + break; + + case 0x07: /* Noise enable and frequency */ + if(select > 5) return; // no more than 6 channels, silly game. + if(select >= 4) + { + ch->noisectrl = V; + RecalcNoiseFreqCache(select); + RecalcUOFunc(select); + } + break; + + case 0x08: /* LFO frequency */ + lfofreq = V & 0xFF; + //printf("LFO Freq: %02x\n", V); + break; + + case 0x09: /* LFO trigger and control */ + //printf("LFO Ctrl: %02x\n", V); + if(V & 0x80) + { + channel[1].waveform_index = 0; + channel[1].dda = channel[1].waveform[channel[1].waveform_index]; + channel[1].counter = channel[1].freq_cache; + } + lfoctrl = V; + RecalcFreqCache(0); + RecalcUOFunc(0); + RecalcFreqCache(1); + RecalcUOFunc(1); + break; + } +} + +// Don't use INLINE, which has always_inline in it, due to gcc's inability to cope with the type of recursion +// used in this function. +template +void PCEFast_PSG::RunChannel(int chc, int32 timestamp) +{ + psg_channel *ch = &channel[chc]; + int32 running_timestamp = ch->lastts; + int32 run_time = timestamp - ch->lastts; + + ch->lastts = timestamp; + + if(!run_time) + return; + + (this->*ch->UpdateOutput)(running_timestamp, ch); + + if(chc >= 4) + { + int32 freq = ch->noise_freq_cache; + + ch->noisecount -= run_time; + + #define CLOCK_LFSR(lfsr) { unsigned int newbit = ((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 11) ^ (lfsr >> 12) ^ (lfsr >> 17)) & 1; lfsr = (lfsr >> 1) | (newbit << 17); } + if(&PCEFast_PSG::UpdateOutput_Noise == ch->UpdateOutput) + { + while(ch->noisecount <= 0) + { + CLOCK_LFSR(ch->lfsr); + UpdateOutput_Noise(timestamp + ch->noisecount, ch); + ch->noisecount += freq; + } + } + else + { + while(ch->noisecount <= 0) + { + CLOCK_LFSR(ch->lfsr); + ch->noisecount += freq; + } + } + #undef CLOCK_LFSR + } + + // D7 of control is 0, don't clock the counter at all. + // D7 of lfocontrol is 1(and chc == 1), don't clock the counter at all(not sure about this) + // In DDA mode, don't clock the counter. + // (Noise being enabled isn't handled here since AFAIK it doesn't disable clocking of the waveform portion, its sound just overrides the sound from + // the waveform portion when the noise enable bit is set, which is handled in our RecalcUOFunc). + if(!(ch->control & 0x80) || (chc == 1 && (lfoctrl & 0x80)) || (ch->control & 0x40)) + return; + + ch->counter -= run_time; + + if(!LFO_On && ch->freq_cache <= 0xA) + { + if(ch->counter <= 0) + { + const int32 inc_count = ((0 - ch->counter) / ch->freq_cache) + 1; + + ch->counter += inc_count * ch->freq_cache; + + ch->waveform_index = (ch->waveform_index + inc_count) & 0x1F; + ch->dda = ch->waveform[ch->waveform_index]; + } + } + + while(ch->counter <= 0) + { + ch->waveform_index = (ch->waveform_index + 1) & 0x1F; + ch->dda = ch->waveform[ch->waveform_index]; + + (this->*ch->UpdateOutput)(timestamp + ch->counter, ch); + + if(LFO_On) + { + RunChannel(1, timestamp + ch->counter); + RecalcFreqCache(0); + RecalcUOFunc(0); + + ch->counter += (ch->freq_cache <= 0xA) ? 0xA : ch->freq_cache; // Not particularly accurate, but faster. + } + else + ch->counter += ch->freq_cache; + } +} + +INLINE void PCEFast_PSG::UpdateSubLFO(int32 timestamp) +{ + RunChannel(0, timestamp); + + for(int chc = 1; chc < 6; chc++) + RunChannel(chc, timestamp); +} + +INLINE void PCEFast_PSG::UpdateSubNonLFO(int32 timestamp) +{ + for(int chc = 0; chc < 6; chc++) + RunChannel(chc, timestamp); +} + +//static int32 last_read; +//static int32 last_apply; + +void PCEFast_PSG::Update(int32 timestamp) +{ + int32 run_time = timestamp - lastts; + + if(vol_pending && !vol_update_counter && !vol_update_which) + { + vol_update_counter = 1; + vol_pending = false; + } + + bool lfo_on = (bool)(lfoctrl & 0x03); + + if(lfo_on) + { + if(!(channel[1].control & 0x80) || (lfoctrl & 0x80)) + { + lfo_on = 0; + RecalcFreqCache(0); + RecalcUOFunc(0); + } + } + + int32 clocks = run_time; + int32 running_timestamp = lastts; + + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(vol_update_counter > 0 && chunk_clocks > vol_update_counter) + chunk_clocks = vol_update_counter; + + running_timestamp += chunk_clocks; + clocks -= chunk_clocks; + + if(lfo_on) + UpdateSubLFO(running_timestamp); + else + UpdateSubNonLFO(running_timestamp); + + if(vol_update_counter > 0) + { + vol_update_counter -= chunk_clocks; + if(!vol_update_counter) + { + const int phase = vol_update_which & 1; + const int lr = ((vol_update_which >> 1) & 1) ^ 1; + const int chnum = vol_update_which >> 2; + + if(!phase) + { + //printf("Volume update(Read, %d since last): ch=%d, lr=%d, ts=%d\n", running_timestamp - last_read, chnum, lr, running_timestamp); + + if(chnum < 6) + { + vol_update_vllatch = GetVL(chnum, lr); + } + //last_read = running_timestamp; + } + else + { + // printf("Volume update(Apply): ch=%d, lr=%d, ts=%d\n", chnum, lr, running_timestamp); + if(chnum < 6) + { + channel[chnum].vl[lr] = vol_update_vllatch; + } + //last_apply = running_timestamp; + } + vol_update_which = (vol_update_which + 1) & 0x1F; + + if(vol_update_which) + vol_update_counter = phase ? 1 : 255; + else if(vol_pending) + { + vol_update_counter = phase ? 1 : 255; + vol_pending = false; + } + } + } + + lastts = running_timestamp; + } +} + +void PCEFast_PSG::EndFrame(int32 timestamp) +{ + Update(timestamp); + lastts = 0; + for(int chc = 0; chc < 6; chc++) + channel[chc].lastts = 0; +} + +void PCEFast_PSG::Power(const int32 timestamp) +{ + // Not sure about power-on values, these are mostly just intuitive guesses(with some laziness thrown in). + if(timestamp != lastts) + Update(timestamp); + + memset(&channel, 0, sizeof(channel)); + + select = 0; + globalbalance = 0; + lfofreq = 0; + lfoctrl = 0; + + for(int ch = 0; ch < 6; ch++) + { + channel[ch].frequency = 0; + channel[ch].control = 0x00; + channel[ch].balance = 0; + memset(channel[ch].waveform, 0, 32); + channel[ch].samp_accum = 0; + + channel[ch].waveform_index = 0; + channel[ch].dda = 0x00; + channel[ch].noisectrl = 0x00; + + channel[ch].vl[0] = 0x1F; + channel[ch].vl[1] = 0x1F; + + channel[ch].samp_accum = 0; + + RecalcFreqCache(ch); + RecalcUOFunc(ch); + + channel[ch].counter = channel[ch].freq_cache; + + if(ch >= 4) + { + RecalcNoiseFreqCache(ch); + channel[ch].noisecount = 1; + channel[ch].lfsr = 1; + } + } + + vol_pending = false; + vol_update_counter = 0; + vol_update_which = 0; +} + +int PCEFast_PSG::StateAction(StateMem *sm, int load, int data_only) +{ + int ret = 1; + + for(int ch = 0; ch < 6; ch++) + { + char tmpstr[5] = "SCHx"; + psg_channel *pt = &channel[ch]; + + SFORMAT CH_StateRegs[] = + { + SFVARN(pt->counter, "counter"), + SFVARN(pt->frequency, "frequency"), + SFVARN(pt->control, "control"), + SFVARN(pt->balance, "balance"), + SFARRAYN(pt->waveform, 32, "waveform"), + SFVARN(pt->waveform_index, "waveform_index"), + SFVARN(pt->dda, "dda"), + SFVARN(pt->noisectrl, "noisectrl"), + SFVARN(pt->noisecount, "noisecount"), + SFVARN(pt->lfsr, "lfsr"), + SFARRAY32N(pt->vl, 2, "vl"), // TODO + SFEND + }; + tmpstr[3] = '0' + ch; + ret &= MDFNSS_StateAction(sm, load, data_only, CH_StateRegs, tmpstr); + } + + SFORMAT PSG_StateRegs[] = + { + SFVAR(select), + SFVAR(globalbalance), + SFVAR(lfofreq), + SFVAR(lfoctrl), + + SFVAR(vol_update_counter), + SFVAR(vol_update_which), + SFVAR(vol_pending), + SFEND + }; + + ret &= MDFNSS_StateAction(sm, load, data_only, PSG_StateRegs, "PSG"); + + if(load) + { + vol_update_which &= 0x1F; + + if(!channel[4].lfsr) + channel[4].lfsr = 1; + + if(!channel[5].lfsr) + channel[5].lfsr = 1; + + for(int ch = 0; ch < 6; ch++) + { + channel[ch].samp_accum = 0; + for(int wi = 0; wi < 32; wi++) + { + channel[ch].waveform[wi] &= 0x1F; + channel[ch].samp_accum += channel[ch].waveform[wi]; + } + + for(int lr = 0; lr < 2; lr++) + channel[ch].vl[lr] &= 0x1F; + + if(!channel[ch].noisecount && ch >= 4) + { + printf("ch=%d, noisecount == 0\n", ch); + channel[ch].noisecount = 1; + } + + if(channel[ch].counter <= 0) + { + printf("ch=%d, counter <= 0\n", ch); + channel[ch].counter = 1; + } + + if(ch >= 4) + RecalcNoiseFreqCache(ch); + RecalcFreqCache(ch); + RecalcUOFunc(ch); + } + } + return(ret); +} + +} diff --git a/Mednafen/mednafen/pce_fast/psg.h b/Mednafen/mednafen/pce_fast/psg.h new file mode 100644 index 0000000000..1cf568d562 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/psg.h @@ -0,0 +1,99 @@ +#ifndef _PCEFast_PSG_H +#define _PCEFast_PSG_H + +#include + +namespace PCE_Fast +{ + +class PCEFast_PSG; + +struct psg_channel +{ + uint8 waveform[32]; /* Waveform data */ + uint8 waveform_index; /* Waveform data index */ + uint8 dda; + uint8 control; /* Channel enable, DDA, volume */ + uint8 noisectrl; /* Noise enable/ctrl (channels 4,5 only) */ + + int32 vl[2]; //vll, vlr; + + int32 counter; + + void (PCEFast_PSG::*UpdateOutput)(const int32 timestamp, psg_channel *ch); + + uint32 freq_cache; + uint32 noise_freq_cache; // Channel 4,5 only + int32 noisecount; + uint32 lfsr; + + int32 samp_accum; // The result of adding up all the samples in the waveform buffer(part of an optimization for high-frequency playback). + int32 blip_prev_samp[2]; + int32 lastts; + + uint16 frequency; /* Channel frequency */ + uint8 balance; /* Channel balance */ +}; + +class PCEFast_PSG +{ + public: + + PCEFast_PSG(Blip_Buffer* bbs) MDFN_COLD; + ~PCEFast_PSG() MDFN_COLD; + + int StateAction(StateMem *sm, int load, int data_only) MDFN_COLD; + + void Power(const int32 timestamp) MDFN_COLD; + void Write(int32 timestamp, uint8 A, uint8 V); + + void SetVolume(double new_volume) MDFN_COLD; + + void EndFrame(int32 timestamp); + + private: + + void Update(int32 timestamp); + + void UpdateSubLFO(int32 timestamp); + void UpdateSubNonLFO(int32 timestamp); + + void RecalcUOFunc(int chnum); + void UpdateOutput_Off(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Accum(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Norm(const int32 timestamp, psg_channel *ch); + void UpdateOutput_Noise(const int32 timestamp, psg_channel *ch); + + int32 GetVL(const int chnum, const int lr); + + void RecalcFreqCache(int chnum); + void RecalcNoiseFreqCache(int chnum); + template + void RunChannel(int chc, int32 timestamp); + double OutputVolume; + + uint8 select; /* Selected channel (0-5) */ + uint8 globalbalance; /* Global sound balance */ + uint8 lfofreq; /* LFO frequency */ + uint8 lfoctrl; /* LFO control */ + + int32 vol_update_counter; + int32 vol_update_which; + int32 vol_update_vllatch; + bool vol_pending; + + psg_channel channel[6]; + + int32 lastts; + + Blip_Buffer* const sbuf; + Blip_Synth Synth; + + int32 dbtable_volonly[32]; + + int32 dbtable[32][32]; +}; + +} + +#endif diff --git a/Mednafen/mednafen/pce_fast/vdc.cpp b/Mednafen/mednafen/pce_fast/vdc.cpp new file mode 100644 index 0000000000..047d810449 --- /dev/null +++ b/Mednafen/mednafen/pce_fast/vdc.cpp @@ -0,0 +1,1733 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* VDC and VCE emulation */ + +#include "pce.h" +#include +#include "vdc.h" +#include "huc.h" +#include "pcecd.h" +#include +#include +#include +#include + +namespace PCE_Fast +{ + +static uint32 systemColorMap32[2][512]; // 0 = normal, 1 = strip colorburst +static uint32 amask; // Alpha channel maskaroo +static uint32 userle; // User layer enable. +static uint32 cputest_flags; +static uint32 disabled_layer_color; + +static bool unlimited_sprites; +static bool correct_aspect; + +#define ULE_BG0 1 +#define ULE_SPR0 2 +#define ULE_BG1 4 +#define ULE_SPR1 8 + +static unsigned int VDS; +static unsigned int VSW; +static unsigned int VDW; +static unsigned int VCR; +static unsigned int VBlankFL; + +vce_t vce; + +int VDC_TotalChips = 0; + +vdc_t *vdc_chips[2] = { NULL, NULL }; + +static INLINE void FixPCache(int entry) +{ + const uint32* __restrict__ cm32 = systemColorMap32[vce.CR >> 7]; + + if(!(entry & 0xFF)) + { + for(int x = 0; x < 16; x++) + vce.color_table_cache[(entry & 0x100) + (x << 4)] = cm32[vce.color_table[entry & 0x100]] | amask; + } + + if(entry & 0xF) + { + uint32 color = cm32[vce.color_table[entry]]; + + // For SuperGrafx VPCsprite handling to work + if(entry & 0x100) + color |= amask << 2; + + vce.color_table_cache[entry] = color; + } +} + +static INLINE void FixTileCache(vdc_t *which_vdc, uint16 A) +{ + uint32 charname = (A >> 4); + uint32 y = (A & 0x7); + uint64 *tc = &which_vdc->bg_tile_cache[charname][y]; + + uint32 bitplane01 = which_vdc->VRAM[y + charname * 16]; + uint32 bitplane23 = which_vdc->VRAM[y+ 8 + charname * 16]; + + *tc = 0; + + for(int x = 0; x < 8; x++) + { + uint32 raw_pixel = ((bitplane01 >> x) & 1); + raw_pixel |= ((bitplane01 >> (x + 8)) & 1) << 1; + raw_pixel |= ((bitplane23 >> x) & 1) << 2; + raw_pixel |= ((bitplane23 >> (x + 8)) & 1) << 3; + + #ifdef MSB_FIRST + *tc |= (uint64)raw_pixel << ((x) * 8); + #else + *tc |= (uint64)raw_pixel << ((7 - x) * 8); + #endif + } +} + +static INLINE void CheckFixSpriteTileCache(vdc_t *which_vdc, uint16 no, uint32 special) +{ + if(special != 0x4 && special != 0x5) + special = 0; + + if((special | 0x80) == which_vdc->spr_tile_clean[no]) + return; + + //printf("Oops: %d, %d, %d\n", no, special | 0x100, which_vdc->spr_tile_clean[no]); + if((no * 64) >= VRAM_Size) + { + //printf("Unmapped: %d\n", no); + //VDC_UNDEFINED("Unmapped VRAM sprite tile read"); + // Unnecessary, since we reset the sprite tile cache to 0 on reset/init anyway. + //memset(which_vdc->spr_tile_cache[no], 0x00, 16 * 16 * sizeof(uint16)); + } + else if(special) + { + for(int y = 0; y < 16; y++) + { + uint8 *tc = which_vdc->spr_tile_cache[no][y]; + + uint32 bitplane0 = which_vdc->VRAM[y + 0x00 + no * 0x40 + ((special & 1) << 5)]; + uint32 bitplane1 = which_vdc->VRAM[y + 0x10 + no * 0x40 + ((special & 1) << 5)]; + + for(int x = 0; x < 16; x++) + { + uint32 raw_pixel; + raw_pixel = ((bitplane0 >> x) & 1) << 0; + raw_pixel |= ((bitplane1 >> x) & 1) << 1; + tc[x] = raw_pixel; + } + } + } + else + { + for(int y = 0; y < 16; y++) + { + uint8 *tc = which_vdc->spr_tile_cache[no][y]; + + uint32 bitplane0 = which_vdc->VRAM[y + 0x00 + no * 0x40]; + uint32 bitplane1 = which_vdc->VRAM[y + 0x10 + no * 0x40]; + uint32 bitplane2 = which_vdc->VRAM[y + 0x20 + no * 0x40]; + uint32 bitplane3 = which_vdc->VRAM[y + 0x30 + no * 0x40]; + + for(int x = 0; x < 16; x++) + { + uint32 raw_pixel; + raw_pixel = ((bitplane0 >> x) & 1) << 0; + raw_pixel |= ((bitplane1 >> x) & 1) << 1; + raw_pixel |= ((bitplane2 >> x) & 1) << 2; + raw_pixel |= ((bitplane3 >> x) & 1) << 3; + tc[x] = raw_pixel; + } + } + } + + which_vdc->spr_tile_clean[no] = special | 0x80; +} + + +static INLINE void SetVCECR(uint8 V) +{ + const bool bw_changed = (V ^ vce.CR) & 0x80; + + vce.dot_clock = V & 1; + if(V & 2) + vce.dot_clock = 2; + vce.CR = V; + + if(bw_changed) + { + for(int x = 0; x < 512; x++) + FixPCache(x); + } +} + +static unsigned int frame_counter; +static int32 need_vbi[2] = { 0, 0 }; +static int32 line_leadin1 = 0; +static int32 magical, cyc_tot; + +vpc_t vpc; + +// Some virtual vdc macros to make code simpler to read +#define M_vdc_HSW (vdc->HSR & 0x1F) // Horizontal Synchro Width +#define M_vdc_HDS ((vdc->HSR >> 8) & 0x7F) // Horizontal Display Start +#define M_vdc_HDW (vdc->HDR & 0x7F) // Horizontal Display Width +#define M_vdc_HDE ((vdc->HDR >> 8) & 0x7F) // Horizontal Display End + +#define M_vdc_VSW (vdc->VSR & 0x1F) // Vertical synchro width +#define M_vdc_VDS ((vdc->VSR >> 8) & 0xFF) // Vertical Display Start +#define M_vdc_VDW (vdc->VDR & 0x1FF) // Vertical Display Width(Height? :b) +#define M_vdc_VCR (vdc->VCR & 0xFF) + +#define VDCS_CR 0x01 // Sprite #0 collision interrupt occurred +#define VDCS_OR 0x02 // sprite overflow "" "" +#define VDCS_RR 0x04 // RCR "" "" +#define VDCS_DS 0x08 // VRAM to SAT DMA completion interrupt occurred +#define VDCS_DV 0x10 // VRAM to VRAM DMA completion interrupt occurred +#define VDCS_VD 0x20 // Vertical blank interrupt occurred +#define VDCS_BSY 0x40 // VDC is waiting for a CPU access slot during the active display area?? + +static MDFN_PaletteEntry PalTest[256]; + +static uint8 FindClose(const MDFN_PaletteEntry& pe) MDFN_COLD; +static uint8 FindClose(const MDFN_PaletteEntry& pe) +{ + double rl, gl, bl; + int closest = -1; + double closest_cs = 1000; + + rl = pow((double)pe.r / 255, 2.2 / 1.0); + gl = pow((double)pe.g / 255, 2.2 / 1.0); + bl = pow((double)pe.b / 255, 2.2 / 1.0); + + for(unsigned x = 0; x < 256; x++) + { + double rcl, gcl, bcl; + double cs; + + rcl = pow((double)PalTest[x].r / 255, 2.2 / 1.0); + gcl = pow((double)PalTest[x].g / 255, 2.2 / 1.0); + bcl = pow((double)PalTest[x].b / 255, 2.2 / 1.0); + + cs = fabs(rcl - rl) * 0.2126 + fabs(gcl - gl) * 0.7152 + fabs(bcl - bl) * 0.0722; + if(cs < closest_cs) + { + closest_cs = cs; + closest = x; + } + } + + return(closest); +} + +bool FindMatch(const MDFN_PaletteEntry& pe) +{ + for(unsigned x = 0; x < 256; x++) + { + if(PalTest[x].r == pe.r && PalTest[x].g == pe.g && PalTest[x].b == pe.b) + return(true); + } + return(false); +} + +void VDC_SetPixelFormat(const MDFN_PixelFormat &format, const uint8* CustomColorMap, const uint32 CustomColorMapLen) +{ + amask = 1 << format.Ashift; + + if(format.bpp == 8) + { + unsigned pti = 0; + + memset(PalTest, 0, sizeof(PalTest)); + +#if 1 + for(int i = 0; i < 8; i++) + { + PalTest[pti++] = format.MakePColor(i * 36, i * 36, i * 36); + + if(i) + { + PalTest[pti++] = format.MakePColor(i * 36, 0, 0); + PalTest[pti++] = format.MakePColor(0, i * 36, 0); + PalTest[pti++] = format.MakePColor(0, 0, i * 36); + PalTest[pti++] = format.MakePColor(i * 36, i * 36, 0); + PalTest[pti++] = format.MakePColor(i * 36, 0, i * 36); + PalTest[pti++] = format.MakePColor(0, i * 36, i * 36); + } + } + + for(int r = 0; r < 8; r++) + { + for(int g = 0; g < 8; g++) + { + for(int b = 0; b < 8; b++) + { + MDFN_PaletteEntry pe = format.MakePColor(r * 36, g * 36, b * 36); + + if(FindMatch(pe)) + continue; + + if(g == 6 && b == 6 && r == 5) + goto SkipStuff; + + if(g == 6 && b == 3 && r == 5) + goto SkipStuff; + + if(g == 4 && b == 5 && r == 3) + goto SkipStuff; + + if(!(b & 1)) + continue; + + if(g == (r + 1)) + continue; + + //if(g == 7 && r >= 4 && b < 4) + // continue; + + if(g == (r + 3) && b >= 5) + continue; + + SkipStuff:; + + PalTest[pti++] = pe; + + if(pti == 256) goto EndThingy; + } + } + } + EndThingy:; + //printf("ZOOMBA: %u\n", pti); + //exit(1); +#else + for(int i = 0; i < 8; i++) + PalTest[pti++] = format.MakePColor(0, 0, i * 36); + + for(int r = 0; r < 8; r++) + { + for(int g = 0; g < 8; g++) + { + for(int b = 0; b < 4; b++) + { + MDFN_PaletteEntry pe = format.MakePColor(r * 36, g * 36, b * 72); + + if(FindMatch(pe)) + continue; + + PalTest[pti++] = pe; + if(pti == 256) + goto EndThingy; + printf("%d\n", pti); + } + } + } + EndThingy: ; +#endif + } + + for(int x = 0; x < 512; x++) + { + int r, g, b; + int sc_r, sc_g, sc_b; + + if(CustomColorMap) + { + r = CustomColorMap[x * 3 + 0]; + g = CustomColorMap[x * 3 + 1]; + b = CustomColorMap[x * 3 + 2]; + } + else + { + b = 36 * (x & 0x007); + r = 36 * ((x & 0x038) >> 3); + g = 36 * ((x & 0x1c0) >> 6); + } + + if(CustomColorMap && CustomColorMapLen == 1024) + { + sc_r = CustomColorMap[(512 + x) * 3 + 0]; + sc_g = CustomColorMap[(512 + x) * 3 + 1]; + sc_b = CustomColorMap[(512 + x) * 3 + 2]; + } + else + { + double y; + + y = floor(0.5 + (0.300 * r + 0.589 * g + 0.111 * b)); + + if(y < 0) + y = 0; + + if(y > 255) + y = 255; + + sc_r = sc_g = sc_b = y; + } + + if(format.bpp == 8) + { + systemColorMap32[0][x] = FindClose(format.MakePColor(r, g, b)); + systemColorMap32[1][x] = FindClose(format.MakePColor(sc_r, sc_g, sc_b)); + } + else + { + systemColorMap32[0][x] = format.MakeColor(r, g, b); + systemColorMap32[1][x] = format.MakeColor(sc_r, sc_g, sc_b); + } + } +#if 0 + { + bool usedo[256] = { 0 }; + + for(int x = 0; x < 512; x++) + { + usedo[systemColorMap32[x]] = true; + } + + for(int x = 0; x < 256; x++) + { + if(!usedo[x]) + { + printf("Monkey: %d %d %d\n", PalTest[x].r / 36, PalTest[x].g / 36, PalTest[x].b / 36); + } + } + } +#endif + // I know the temptation is there, but don't combine these two loops just + // because they loop 512 times ;) + for(int x = 0; x < 512; x++) + FixPCache(x); + + disabled_layer_color = format.MakeColor(0x00, 0xFE, 0x00); +} + +DECLFR(VCE_Read) +{ + switch(A & 0x7) + { + case 4: return(vce.color_table[vce.ctaddress]); + case 5: { + uint8 ret = vce.color_table[vce.ctaddress] >> 8; + ret |= 0xFE; + vce.ctaddress = (vce.ctaddress + 1) & 0x1FF; + return(ret); + } + } + return(0xFF); +} + +DECLFW(VCE_Write) +{ + //printf("%04x %02x, %04x\n", A, V, HuCPU.PC); + switch(A&0x7) + { + case 0: SetVCECR(V); break; + case 2: vce.ctaddress &= 0x100; vce.ctaddress |= V; break; + case 3: vce.ctaddress &= 0x0FF; vce.ctaddress |= (V & 1) << 8; break; + case 4: vce.color_table[vce.ctaddress] &= 0x100; + vce.color_table[vce.ctaddress] |= V; + FixPCache(vce.ctaddress); + break; + case 5: vce.color_table[vce.ctaddress] &= 0xFF; + vce.color_table[vce.ctaddress] |= (V & 1) << 8; + FixPCache(vce.ctaddress); + vce.ctaddress = (vce.ctaddress + 1) & 0x1FF; + break; + } +} + + +void VDC_SetLayerEnableMask(uint64 mask) +{ + userle = mask; +} + +DECLFW(VDC_Write_ST) +{ + if(VDC_TotalChips == 2) + A |= vpc.st_mode ? 0x10 : 0; + + //printf("WriteST: %04x %02x\n", A, V); + VDC_Write(A, V); +} + +static void DoDMA(vdc_t *vdc) +{ + // Assuming one cycle for reads, one cycle for write, with DMA? + for(int i = 0; i < 455; i++) + { + if(!vdc->DMAReadWrite) + { + if(vdc->SOUR >= VRAM_Size) + VDC_UNDEFINED("Unmapped VRAM DMA read"); + + vdc->DMAReadBuffer = vdc->VRAM[vdc->SOUR]; + } + else + { + if(vdc->DESR < VRAM_Size) + { + vdc->VRAM[vdc->DESR] = vdc->DMAReadBuffer; + FixTileCache(vdc, vdc->DESR); + vdc->spr_tile_clean[vdc->DESR >> 6] = 0; + } + + //if(vdc->DCR & 0xC) + //printf("Pllal: %02x\n", vdc->DCR); + + vdc->SOUR += (((vdc->DCR & 0x4) >> 1) ^ 2) - 1; + vdc->DESR += (((vdc->DCR & 0x8) >> 2) ^ 2) - 1; + vdc->LENR--; + if(vdc->LENR == 0xFFFF) // DMA is done. + { + vdc->DMARunning = 0; + if(vdc->DCR & 0x02) + { + vdc->status |= VDCS_DV; + HuC6280_IRQBegin(MDFN_IQIRQ1); + VDC_DEBUG("DMA IRQ"); + } + break; + } + } + vdc->DMAReadWrite ^= 1; + } // for() +} + +DECLFW(VDC_Write) +{ + int msb = A & 1; + int chip = 0; + vdc_t *vdc; + + //printf("VDC Write: %04x %02x\n", A, V); + if(VDC_TotalChips == 2) + { + A &= 0x1F; + switch(A) + { + case 0x8: vpc.priority[0] = V; break; + case 0x9: vpc.priority[1] = V; break; + case 0xA: vpc.winwidths[0] &= 0x300; vpc.winwidths[0] |= V; break; + case 0xB: vpc.winwidths[0] &= 0x0FF; vpc.winwidths[0] |= (V & 3) << 8; break; + case 0xC: vpc.winwidths[1] &= 0x300; vpc.winwidths[1] |= V; break; + case 0xD: vpc.winwidths[1] &= 0x0FF; vpc.winwidths[1] |= (V & 3) << 8; break; + case 0xE: vpc.st_mode = V & 1; break; + } + if(A & 0x8) return; + + chip = (A & 0x10) >> 4; + vdc = vdc_chips[chip]; + A &= 0x3; + } + else + { + vdc = vdc_chips[0]; + A &= 0x3; + } + //if((A == 0x2 || A == 0x3) && ((vdc->select & 0x1f) >= 0x09) && ((vdc->select & 0x1f) <= 0x13)) + + //printf("%04x, %02x: %02x, %d\n", A, vdc->select, V, vdc->display_counter); + + switch(A) + { + case 0x0: vdc->select = V & 0x1F; break; + case 0x2: + case 0x3: + switch(vdc->select & 0x1F) + { + case 0x00: REGSETP(vdc->MAWR, V, msb); break; + case 0x01: REGSETP(vdc->MARR, V, msb); + if(msb) + { + if(vdc->MARR >= VRAM_Size) + VDC_UNDEFINED("Unmapped VRAM VRR(MARR set) read"); + + vdc->read_buffer = vdc->VRAM[vdc->MARR]; + } + break; + case 0x02: if(!msb) vdc->write_latch = V; + else + { + if(vdc->MAWR < VRAM_Size) + { + // A hack to fix Crest of Wolf, and maybe others. + while(vdc->DMARunning) + DoDMA(vdc); + + vdc->VRAM[vdc->MAWR] = (V << 8) | vdc->write_latch; + FixTileCache(vdc, vdc->MAWR); + vdc->spr_tile_clean[vdc->MAWR >> 6] = 0; + } + else + { + //VDC_UNDEFINED("Unmapped VRAM write"); + //printf("VROOM: %04x, %02x\n", vdc->MAWR, (vdc->CR >> 11) & 0x3); + } + vdc->MAWR += vram_inc_tab[(vdc->CR >> 11) & 0x3]; + } + break; + case 0x05: REGSETP(vdc->CR, V, msb); break; + case 0x06: REGSETP(vdc->RCR, V, msb); vdc->RCR &= 0x3FF; break; + case 0x07: REGSETP(vdc->BXR, V, msb); vdc->BXR &= 0x3FF; break; + case 0x08: REGSETP(vdc->BYR, V, msb); vdc->BYR &= 0x1FF; + vdc->BG_YOffset = vdc->BYR; // Set it on LSB and MSB writes(only changing on MSB breaks Youkai Douchuuki) + //printf("%04x\n", HuCPU.PC); + break; + case 0x09: REGSETP(vdc->MWR, V, msb); break; + case 0x0a: REGSETP(vdc->HSR, V, msb); break; + case 0x0b: REGSETP(vdc->HDR, V, msb); break; + case 0x0c: REGSETP(vdc->VSR, V, msb); break; + case 0x0d: REGSETP(vdc->VDR, V, msb); break; + case 0x0e: REGSETP(vdc->VCR, V, msb); break; + case 0x0f: REGSETP(vdc->DCR, V, msb); break; + case 0x10: REGSETP(vdc->SOUR, V, msb); break; + case 0x11: REGSETP(vdc->DESR, V, msb); break; + case 0x12: REGSETP(vdc->LENR, V, msb); + if(msb) + { + vdc->DMARunning = 1; + vdc->DMAReadWrite = 0; + if(vdc->burst_mode && !(vdc->DCR & 0x02)) + DoDMA(vdc); // Do one line's worth of DMA transfers + // because Cosmic Fantasy 4 is evil + // and uses timed writes to the DMA + // start register, rather than waiting until + // the machine says we're done, + // which would require cycle-accurate VDC emulation...like that's + // going to happen when I don't even have accurate values + // for HuC6280 instruction timings. :b + } + break; + case 0x13: REGSETP(vdc->SATB, V, msb); vdc->SATBPending = 1; break; +// default: printf("Oops 2: %04x %02x\n", vdc->select, V);break; + } + break; + } +} + + +// 682 + 8 + 128 = 818. +static INLINE void CalcStartEnd(const vdc_t *vdc, uint32 &start, uint32 &end) +{ + //static const unsigned int ClockModeWidths[3] = { 288, 384, 576 }; + static const unsigned int ClockPixelWidths[3] = { 341, 455, 682 }; + + start = (M_vdc_HDS + 1) * 8; + // Semi-hack for Asuka 120% + if(vce.dot_clock == 1 && M_vdc_HDS == 5 && M_vdc_HDE == 6 && M_vdc_HDW == 43 && M_vdc_HSW == 2) + start -= 8; + else if(vce.dot_clock == 0 && M_vdc_HDS == 2 && M_vdc_HDE == 3 && M_vdc_HDW == 33 && M_vdc_HSW == 2) + start -= 4; + // and for Addams Family + else if(vce.dot_clock == 1 && M_vdc_HDS == 4 && M_vdc_HDE == 4 && M_vdc_HDW == 43 && M_vdc_HSW == 9) + start -= 4; + end = start + (M_vdc_HDW + 1) * 8; + + if(start > (ClockPixelWidths[vce.dot_clock])) + start = ClockPixelWidths[vce.dot_clock]; + + if(end > (ClockPixelWidths[vce.dot_clock])) + end = ClockPixelWidths[vce.dot_clock]; + + if(start == end) // In case HDS is way off-screen, REMOVE when we confirm the rest of the code won't flip out + start = end - 8; // when start == end; + + // For: start - (vdc->BG_XOffset & 7) + end += 8; + start += 8; + + // For: alignment space when correct_aspect == 0 + end += 128; + start += 128; + +#if 0 + uint32 display_width; + display_width = (M_vdc_HDW + 1) * 8; + + if(display_width > ClockModeWidths[vce.dot_clock]) + display_width = ClockModeWidths[vce.dot_clock]; + + start = (ClockModeWidths[vce.dot_clock] - display_width) / 2; + + // For: start - (vdc->BG_XOffset & 7) + start += 8; + + // For: alignment space when correct_aspect == 0 + start += 128; + + // Semi-hack for Asuka 120% + if(vce.dot_clock == 1 && M_vdc_HDS == 5 && M_vdc_HDE == 6 && M_vdc_HDW == 43 && M_vdc_HSW == 2) + start += 8; + else if(vce.dot_clock == 0 && M_vdc_HDS == 2 && M_vdc_HDE == 3 && M_vdc_HDW == 33 && M_vdc_HSW == 2) + start += 4; + // and for Addams Family + else if(vce.dot_clock == 1 && M_vdc_HDS == 4 && M_vdc_HDE == 4 && M_vdc_HDW == 43 && M_vdc_HSW == 9) + start += 4; + + //MDFN_DispMessage((UTF8*)"dc: %d, %d %d %d %d; %d %d\n", vce.dot_clock, M_vdc_HDS, M_vdc_HDE, M_vdc_HDW, M_vdc_HSW, start, (M_vdc_HDS + 1) * 8); + + end = start + display_width; + if(end > (ClockModeWidths[vce.dot_clock] + 8 + 128)) + end = ClockModeWidths[vce.dot_clock] + 8 + 128; +#endif +} + +#define CB_EXL(n) (((n) << 4) | ((n) << 12) | ((n) << 20) | ((n) << 28) | ((n) << 36) | ((n) << 44) | ((n) << 52) | ((n) << 60)) +static const uint8 bat_width_shift_tab[4] = { 5, 6, 7, 7 }; +static const uint64 cblock_exlut[16] = { + CB_EXL(0ULL), CB_EXL(1ULL), CB_EXL(2ULL), CB_EXL(3ULL), CB_EXL(4ULL), CB_EXL(5ULL), CB_EXL(6ULL), CB_EXL(7ULL), + CB_EXL(8ULL), CB_EXL(9ULL), CB_EXL(10ULL), CB_EXL(11ULL), CB_EXL(12ULL), CB_EXL(13ULL), CB_EXL(14ULL), CB_EXL(15ULL) + }; + +static void DrawBG(const vdc_t *vdc, const uint32 count, uint8* __restrict__ target) NO_INLINE; +static void DrawBG(const vdc_t *vdc, const uint32 count, uint8* __restrict__ target) +{ + int bat_width_shift = bat_width_shift_tab[(vdc->MWR >> 4) & 3]; + int bat_width_mask = (1U << bat_width_shift) - 1; + int bat_height_mask = 31 + ((vdc->MWR & 0x40) >> 1); + + { + int bat_y = ((vdc->BG_YOffset >> 3) & bat_height_mask) << bat_width_shift; + + int bat_boom = (vdc->BG_XOffset >> 3) & bat_width_mask; + int line_sub = vdc->BG_YOffset & 7; + + const uint16 *BAT_Base = &vdc->VRAM[bat_y]; + const uint64 *CG_Base = &vdc->bg_tile_cache[0][line_sub]; + + if(MDFN_UNLIKELY((vdc->MWR & 0x3) == 0x3)) + { + const uint64 cg_mask = (vdc->MWR & 0x80) ? 0xCCCCCCCCCCCCCCCCULL : 0x3333333333333333ULL; + + for(int x = count - 1; MDFN_LIKELY(x >= 0); x -= 8) + { + const uint16 bat = BAT_Base[bat_boom]; + const uint64 color_or = cblock_exlut[bat >> 12]; + + MDFN_ennsb(target, (CG_Base[(bat & 0xFFF) * 8] & cg_mask) | color_or); + + bat_boom = (bat_boom + 1) & bat_width_mask; + target += 8; + } + } // End 2-bit CG rendering + else + { + for(int x = count - 1; MDFN_LIKELY(x >= 0); x -= 8) + { + const uint16 bat = BAT_Base[bat_boom]; + const uint64 color_or = cblock_exlut[bat >> 12]; + + MDFN_ennsb(target, CG_Base[(bat & 0xFFF) * 8] | color_or); + + bat_boom = (bat_boom + 1) & bat_width_mask; + target += 8; + } + } // End normal CG rendering + } +} + +#define SPRF_PRIORITY 0x00080 +#define SPRF_HFLIP 0x00800 +#define SPRF_VFLIP 0x08000 +#define SPRF_SPRITE0 0x10000 + +static const unsigned int sprite_height_tab[4] = { 16, 32, 64, 64 }; +static const unsigned int sprite_height_no_mask[4] = { ~0U, ~2U, ~6U, ~6U }; + +static INLINE void RebuildSATCache(vdc_t *vdc) +{ + SAT_Cache_t *sat_ptr = vdc->SAT_Cache; + + vdc->SAT_Cache_Valid = 0; + + for(int i = 0; i < 64; i++) + { + const uint16 SATR0 = vdc->SAT[i * 4 + 0x0]; + const uint16 SATR1 = vdc->SAT[i * 4 + 0x1]; + const uint16 SATR2 = vdc->SAT[i * 4 + 0x2]; + const uint16 SATR3 = vdc->SAT[i * 4 + 0x3]; + + int16 y; + uint16 height; + uint16 x; + uint16 no; + uint16 flags; + bool cgmode; + uint32 width; + + y = (int16)(SATR0 & 0x3FF) - 0x40; + x = SATR1 & 0x3FF; + no = (SATR2 >> 1) & 0x3FF; + flags = (SATR3); + cgmode = SATR2 & 0x1; + + width = ((flags >> 8) & 1); + flags &= ~0x100; + + height = sprite_height_tab[(flags >> 12) & 3]; + no &= sprite_height_no_mask[(flags >> 12) & 3]; + + no = ((no & ~width) | 0) ^ ((flags & SPRF_HFLIP) ? width : 0); + + sat_ptr->y = y; + sat_ptr->height = height; + sat_ptr->x = x; + sat_ptr->no = no; + sat_ptr->flags = flags; + sat_ptr->cgmode = cgmode; + + sat_ptr++; + vdc->SAT_Cache_Valid++; + + if(width) + { + no = ((no & ~width) | 1) ^ ((flags & SPRF_HFLIP) ? width : 0); + x += 16; + + *sat_ptr = *(sat_ptr - 1); + + sat_ptr->no = no; + sat_ptr->x = x; + + sat_ptr++; + vdc->SAT_Cache_Valid++; + } + } +} + +static INLINE void DoSATDMA(vdc_t *vdc) +{ + if(vdc->SATB > (VRAM_Size - 0x100)) + VDC_UNDEFINED("Unmapped VRAM SATB DMA read"); + + for(int i = 0; i < 256; i++) + vdc->SAT[i] = vdc->VRAM[(vdc->SATB + i) & 0xFFFF]; + + RebuildSATCache(vdc); +} + + +typedef struct +{ + uint32 x; + uint32 flags; + uint8 palette_index; + uint16 no; + uint16 sub_y; +} SPRLE; + +static const unsigned int spr_hpmask = 0x8000; // High priority bit mask(don't change). + +// DrawSprites will write up to 0x20 units before the start of the pointer it's passed. +static void DrawSprites(vdc_t *vdc, const int32 end, uint16 *spr_linebuf) NO_INLINE; +static void DrawSprites(vdc_t *vdc, const int32 end, uint16 *spr_linebuf) +{ + int active_sprites = 0; + SPRLE SpriteList[64 * 2]; // (see unlimited_sprites option, *2 to accomodate 32-pixel-width sprites ) //16]; + + // First, grab the up to 16(or 128 for unlimited_sprites) sprite units(16xWHATEVER; each 32xWHATEVER sprite counts as 2 sprite units when + // rendering a scanline) for this scanline. + for(int i = 0; i < vdc->SAT_Cache_Valid; i++) + { + const SAT_Cache_t *SATR = &vdc->SAT_Cache[i]; + + int16 y = SATR->y; + uint16 x = SATR->x; + uint16 no = SATR->no; + const uint16 flags = SATR->flags; + const uint8 cgmode = SATR->cgmode; + const uint16 height = SATR->height; + const uint32 palette_index = (flags & 0xF) << 4; + + uint32 y_offset = vdc->RCRCount - y; + if(y_offset < height) + { + if(active_sprites == 16) + { + if(vdc->CR & 0x2) + { + vdc->status |= VDCS_OR; + HuC6280_IRQBegin(MDFN_IQIRQ1); + VDC_DEBUG("Overflow IRQ"); + } + if(!unlimited_sprites) + break; + } + + if(flags & SPRF_VFLIP) + y_offset = height - 1 - y_offset; + + no |= (y_offset & 0x30) >> 3; + + SpriteList[active_sprites].flags = flags; + + //printf("Found: %d %d\n", vdc->RCRCount, x); + SpriteList[active_sprites].x = x; + SpriteList[active_sprites].palette_index = palette_index; + + SpriteList[active_sprites].no = no; + SpriteList[active_sprites].sub_y = (y_offset & 15); + + + CheckFixSpriteTileCache(vdc, no, (vdc->MWR & 0xC) | cgmode); + + SpriteList[active_sprites].flags |= i ? 0 : SPRF_SPRITE0; + + active_sprites++; + } + } + + //if(!active_sprites) + // return; + + //memset(spr_linebuf, 0, sizeof(uint16) * end); + MDFN_FastU32MemsetM8((uint32 *)spr_linebuf, 0, ((end + 3) >> 1) & ~1); + + if(!active_sprites) + return; + + for(int i = (active_sprites - 1) ; MDFN_LIKELY(i >= 0); i--) + { + int32 pos = SpriteList[i].x - 0x20; + uint32 prio_or; + uint16 *dest_pix; + + if(pos > end) + continue; + + dest_pix = &spr_linebuf[pos]; + + prio_or = 0x100 | SpriteList[i].palette_index; + + if(SpriteList[i].flags & SPRF_PRIORITY) + prio_or |= spr_hpmask; + + if(MDFN_UNLIKELY((SpriteList[i].flags & SPRF_SPRITE0) && (vdc->CR & 0x01))) + { + const uint8 *pix_source = vdc->spr_tile_cache[SpriteList[i].no][SpriteList[i].sub_y]; + + if(SpriteList[i].flags & SPRF_HFLIP) + { + for(int32 x = 0; x < 16; x++) + { + const uint32 raw_pixel = pix_source[x]; + if(raw_pixel) + { + if(((uint32)pos + x) >= (uint32)end) // Covers negative and overflowing the right side(to prevent spurious sprite hits) + continue; + + if(dest_pix[x] & 0x100) + { + vdc->status |= VDCS_CR; + VDC_DEBUG("Sprite hit IRQ"); + HuC6280_IRQBegin(MDFN_IQIRQ1); + } + dest_pix[x] = raw_pixel | prio_or; + } + } + } + else + { + for(int32 x = 0; x < 16; x++) + { + const uint32 raw_pixel = pix_source[15 - x]; + if(raw_pixel) + { + if(((uint32)pos + x) >= (uint32)end) // Covers negative and overflowing the right side(to prevent spurious sprite hits) + continue; + + if(dest_pix[x] & 0x100) + { + vdc->status |= VDCS_CR; + VDC_DEBUG("Sprite hit IRQ"); + HuC6280_IRQBegin(MDFN_IQIRQ1); + } + dest_pix[x] = raw_pixel | prio_or; + } + } + } + } // End sprite0 handling + else // No sprite0 hit: + { + const uint8 *pix_source = vdc->spr_tile_cache[SpriteList[i].no][SpriteList[i].sub_y]; + + // x must be signed, for "pos + x" to not be promoted to unsigned, which will cause a stack overflow. + if(SpriteList[i].flags & SPRF_HFLIP) + { + for(int32 x = 0; x < 16; x++) + { + const uint32 raw_pixel = pix_source[x]; + if(raw_pixel) + dest_pix[x] = raw_pixel | prio_or; + } + } + else + { + pix_source += 15; + for(int32 x = 0; x < 16; x++) + { + const uint32 raw_pixel = pix_source[-x]; + if(raw_pixel) + dest_pix[x] = raw_pixel | prio_or; + } + } + + } // End no sprite0 hit + } +} + +template +static void MixBGSPR(const uint32 count, const uint8* __restrict__ bg_linebuf, const uint16* __restrict__ spr_linebuf, T* __restrict__ target) +{ +#ifdef ARCH_X86 + bg_linebuf += count; + spr_linebuf += count; + target += count; + #if SIZEOF_VOID_P == 8 + uint64 x = -(uint64)count; + #else + uint32 x = -count; + #endif + + #ifdef __x86_64__ + if(1) + #else + if(cputest_flags & CPUTEST_FLAG_CMOV) + #endif + { + do + { +#if SIZEOF_VOID_P == 8 + uint64 pixel = bg_linebuf[x]; +#else + uint32 pixel = bg_linebuf[x]; +#endif + uint32 spr_pixel = spr_linebuf[x]; + + asm volatile( + "testl $15, %%eax\n\t" + "bt $15, %%ebx\n\t" + + "cmovbe %%ebx, %%eax\n\t" + "andl $511, %%eax\n\t" + : "=a"(pixel) + : "a"(pixel), "b"(spr_pixel) + : "cc" ); + + target[x] = vce.color_table_cache[pixel]; + } while(MDFN_LIKELY(++x)); + } + else + { + do + { + uint32 pixel = bg_linebuf[x]; + uint32 spr_pixel = spr_linebuf[x]; + + asm volatile( + "testl $15, %%eax\n\t" + "bt $15, %%ebx\n\t" + + "jnbe 1f\n\t" + "movl %%ebx, %%eax\n\t" + "andl $511, %%eax\n\t" + "1:\n\t" + : "=a"(pixel) + : "a"(pixel), "b"(spr_pixel) + : "cc" ); + + target[x] = vce.color_table_cache[pixel]; + } while(MDFN_LIKELY(++x)); + } +#else + uint32 x = 0; + + do + { + uint32 pixel = bg_linebuf[x] | (spr_linebuf[x] << 16); + + if((int32)(pixel & 0x8000000F) <= 0) + pixel >>= 16; + + target[x] = vce.color_table_cache[pixel & 0x1FF]; + } while(MDFN_LIKELY(++x != count)); +#endif +} + +template +static void MixBGOnly(const uint32 count, const uint8* __restrict__ bg_linebuf, T* __restrict__ target) +{ + for(unsigned int x = 0; x < count; x++) + target[x] = vce.color_table_cache[bg_linebuf[x]]; +} + +template +static void MixSPROnly(const uint32 count, const uint16* __restrict__ spr_linebuf, T* __restrict__ target) +{ + for(unsigned int x = 0; x < count; x++) + target[x] = vce.color_table_cache[(spr_linebuf[x] | 0x100) & 0x1FF]; +} + +template +static void MixNone(const uint32 count, T* __restrict__ target) +{ + uint32 bg_color = vce.color_table_cache[0x000]; + + for(unsigned int x = 0; x < count; x++) + target[x] = bg_color; +} + +//static void MixVPC(const uint32 count, const uint32 *lb0, const uint32 *lb1, uint32 *target) NO_INLINE; + +template +static void MixVPC(const uint32 count, const uint32* __restrict__ lb0, const uint32* __restrict__ lb1, T* __restrict__ target) +{ + static const int prio_select[4] = { 1, 1, 0, 0 }; + static const int prio_shift[4] = { 4, 0, 4, 0 }; + + // Windowing disabled. + if(MDFN_LIKELY(vpc.winwidths[0] <= 0x40 && vpc.winwidths[1] <= 0x40)) + { + const uint8 pb = (vpc.priority[prio_select[0]] >> prio_shift[0]) & 0xF; + + switch(pb) + { + default: + //printf("%02x\n", pb); + for(int x = 0; MDFN_LIKELY(x < (int)count); x++) + { + #include "vpc_mix_inner.inc" + } + break; + + case 0x3: + for(int x = 0; MDFN_LIKELY(x < (int)count); x++) + { + #include "vpc_mix_inner.inc" + } + break; + + case 0x7: + for(int x = 0; MDFN_LIKELY(x < (int)count); x++) + { + #include "vpc_mix_inner.inc" + } + break; + + case 0xB: + for(int x = 0; MDFN_LIKELY(x < (int)count); x++) + { + #include "vpc_mix_inner.inc" + } + break; + + case 0xF: + for(int x = 0; MDFN_LIKELY(x < (int)count); x++) + { + #include "vpc_mix_inner.inc" + } + break; + } + + //switch(pb & 0xF) + //{ + // case 0x0: for(int x = 0; x < (int)count; x++) + // { + // #include "vpc_mix_inner.inc" + // } + // break; + //} + } + else for(int x = 0; x < (int)count; x++) + { + int in_window = 0; + + if(x < (vpc.winwidths[0] - 0x40)) + in_window |= 1; + + if(x < (vpc.winwidths[1] - 0x40)) + in_window |= 2; + + uint8 pb = (vpc.priority[prio_select[in_window]] >> prio_shift[in_window]) & 0xF; + + #include "vpc_mix_inner.inc" + } +} + +template +static void DrawOverscan(const vdc_t *vdc, T *target, const MDFN_Rect *lw, const bool full = true, const int32 vpl = 0, const int32 vpr = 0) +{ + uint32 os_color = vce.color_table_cache[0x100]; + + //printf("%d %d\n", lw->x, lw->w); + + if(full) + { + // Fill in entire viewport(horizontally!) with overscan color + for(int x = lw->x; x < lw->x + lw->w; x++) + target[x] = os_color; + } + else + { + // Fill in viewport to the left of HDW with overscan color. + for(int x = lw->x; x < vpl; x++) + target[x] = os_color; + + // Fill in viewport to the right of HDW with overscan color. + for(int x = vpr; x < lw->x + lw->w; x++) + target[x] = os_color; + } +} + +template +static void BigDrawThingy(EmulateSpecStruct *espec, bool IsHES) NO_INLINE; + +template +static void BigDrawThingy(EmulateSpecStruct *espec, bool IsHES) +{ + vdc_t *vdc = vdc_chips[0]; + int max_dc = 0; + MDFN_Surface *surface = espec->surface; + MDFN_Rect *DisplayRect = &espec->DisplayRect; + int32 *LineWidths = espec->LineWidths; + bool skip = espec->skip || IsHES; + + // x and w should be overwritten in the big loop + + if(!skip) + { + if(surface->palette) + memcpy(surface->palette, PalTest, sizeof(PalTest)); + + DisplayRect->x = 0; + DisplayRect->w = 256; + + DisplayRect->y = MDFN_GetSettingUI("pce_fast.slstart"); + DisplayRect->h = MDFN_GetSettingUI("pce_fast.slend") - DisplayRect->y + 1; + + // Hack for the input latency-reduction hack, part 1. + for(int y = DisplayRect->y; y < DisplayRect->y + DisplayRect->h; y++) + LineWidths[y] = 0; + } + + do + { + vdc = vdc_chips[0]; + + if(frame_counter == 0) + { + VDS = M_vdc_VDS; + VSW = M_vdc_VSW; + VDW = M_vdc_VDW; + VCR = M_vdc_VCR; + VBlankFL = VDS + VSW + VDW + 1; + + if(VBlankFL > 261) + VBlankFL = 261; + } + + need_vbi[0] = need_vbi[1] = 0; + + #if 1 + line_leadin1 = 0; + + magical = M_vdc_HDS + (M_vdc_HDW + 1) + M_vdc_HDE; + magical = (magical + 2) & ~1; + magical -= M_vdc_HDW + 1; + cyc_tot = magical * 8; //ClockPixelWidths[vce.dot_clock] - magical * 8; + cyc_tot-=2; + switch(vce.dot_clock) + { + case 0: cyc_tot = 4 * cyc_tot / 3; break; + case 1: break; + case 2: cyc_tot = 2 * cyc_tot / 3; break; + } + + if(cyc_tot < 0) cyc_tot = 0; + line_leadin1 = cyc_tot; + #endif + + #if 0 + { + int vdc_to_master = 4; + + line_leadin1 = 1365 - ((M_vdc_HDW + 1) * 8 - 4 + 6) * vdc_to_master; + + if(line_leadin1 < 0) + { + line_leadin1 = 0; + puts("Eep"); + } + + if(M_vdc_HDS > 2) + line_leadin1 += 2; + + line_leadin1 = line_leadin1 / 3; + } + + if(line_leadin1 < 0) + line_leadin1 = 0; + else if(line_leadin1 > 400) + line_leadin1 = 400; + #endif + + //printf("%d\n", line_leadin1); + if(max_dc < vce.dot_clock) + max_dc = vce.dot_clock; + + if(!skip) + { + static const int ws[2][3] = { + { 341, 341, 682 }, + { 256, 341, 512 } + }; + + DisplayRect->x = 0; + DisplayRect->w = ws[correct_aspect][vce.dot_clock]; + } + + for(unsigned chip = 0; chip < TCT; chip++) + { + vdc = vdc_chips[chip]; + if(frame_counter == 0) + { + vdc->display_counter = 0; + vdc->burst_mode = !(vdc->CR & 0xC0); + } + + if(vdc->display_counter == (VDS + VSW)) + { + vdc->burst_mode = !(vdc->CR & 0xC0); + vdc->RCRCount = 0; + } + int have_free_time = 1; + + if(!vdc->burst_mode && vdc->display_counter >= (VDS + VSW) && vdc->display_counter < (VDS + VSW + VDW + 1)) + have_free_time = 0; + + if(have_free_time) // We're outside of the active display area. Weehee + { + if(vdc->DMARunning) + DoDMA(vdc); + } + + if(vdc->display_counter == VBlankFL) + { + need_vbi[chip] = 1; + if(vdc->SATBPending || (vdc->DCR & 0x10)) + { + vdc->SATBPending = 0; + vdc->sat_dma_slcounter = 2; + + DoSATDMA(vdc); + } + } + if((int)vdc->RCRCount == ((int)vdc->RCR - 0x40) && (vdc->CR & 0x04)) + { + VDC_DEBUG("RCR IRQ"); + vdc->status |= VDCS_RR; + HuC6280_IRQBegin(MDFN_IQIRQ1); + } + } + + HuC6280_Run(line_leadin1); + + // + // + // + alignas(8) uint32 line_buffer[2][(TCT == 2) ? 1024 : 0]; // For super grafx emulation + alignas(8) uint8 bg_linebuf[8 + 1024]; + alignas(8) uint16 spr_linebuf[16 + 1024]; + + const bool SHOULD_DRAW = (!skip && (int)frame_counter >= (DisplayRect->y + 14) && (int)frame_counter < (DisplayRect->y + DisplayRect->h + 14)); + const bool fc_vrm = (frame_counter >= 14 && frame_counter < (14 + 242)); + + for(unsigned chip = 0; chip < TCT; chip++) + { + U* target_ptr; + + vdc = vdc_chips[chip]; + + if(TCT == 2) + target_ptr = (U*)line_buffer[chip]; + else + target_ptr = (U*)surface->pix() + (frame_counter - 14) * surface->pitchinpix; + + if(fc_vrm && !skip) + LineWidths[frame_counter - 14] = DisplayRect->w; + + if(vdc->burst_mode) + { + if(fc_vrm && SHOULD_DRAW) + { + DrawOverscan(vdc, target_ptr, DisplayRect); + } + } + else if(vdc->display_counter >= (VDS + VSW) && vdc->display_counter < (VDS + VSW + VDW + 1)) + { + if(vdc->display_counter == (VDS + VSW)) + vdc->BG_YOffset = vdc->BYR; + else + vdc->BG_YOffset++; + vdc->BG_XOffset = vdc->BXR; + + if(fc_vrm) + { + uint32 start, end; + + CalcStartEnd(vdc, start, end); + + if((vdc->CR & 0x80) && SHOULD_DRAW) + { + if(userle & (chip ? ULE_BG1 : ULE_BG0)) + DrawBG(vdc, end - start + (vdc->BG_XOffset & 7), bg_linebuf); + else + memset(bg_linebuf, 0, end - start + (vdc->BG_XOffset & 7)); + } + + if((vdc->CR & 0x40) && (SHOULD_DRAW || (vdc->CR & 0x03))) // Don't skip sprite drawing if we can generate sprite #0 or sprite overflow IRQs. + { + if((userle & (chip ? ULE_SPR1 : ULE_SPR0)) || (vdc->CR & 0x03)) + DrawSprites(vdc, end - start, spr_linebuf + 0x20); + + if(!(userle & (chip ? ULE_SPR1 : ULE_SPR0))) + memset(spr_linebuf + 0x20, 0, sizeof(uint16) * (end - start)); + } + + if(SHOULD_DRAW) + { + static const int xs[2][3] = { + { 24 - 43, 38, 96 - 43 * 2 }, + { 24, 38, 96 } + }; + + int32 width = end - start; + int32 source_offset = 0; + int32 target_offset = start - (128 + 8 + xs[correct_aspect][vce.dot_clock]); + + if(target_offset < 0) + { + width += target_offset; + source_offset += 0 - target_offset; + target_offset = 0; + } + + if((target_offset + width) > DisplayRect->w) + width = (int32)DisplayRect->w - target_offset; + + //if(vdc->display_counter == 50) + // MDFN_DispMessage("soffset=%d, toffset=%d, width=%d", source_offset, target_offset, width); + + if(width > 0) + { + switch(vdc->CR & 0xC0) + { + case 0xC0: MixBGSPR(width, bg_linebuf + (vdc->BG_XOffset & 7) + source_offset, spr_linebuf + 0x20 + source_offset, target_ptr + target_offset); + break; + + case 0x80: MixBGOnly(width, bg_linebuf + (vdc->BG_XOffset & 7) + source_offset, target_ptr + target_offset); + break; + + case 0x40: MixSPROnly(width, spr_linebuf + 0x20 + source_offset, target_ptr + target_offset); + break; + + case 0x00: MixNone(width, target_ptr + target_offset); + break; + } + } + + DrawOverscan(vdc, target_ptr, DisplayRect, false, target_offset, target_offset + width); + } // end if(SHOULD_DRAW) + } + } + else if(SHOULD_DRAW && fc_vrm) // Hmm, overscan... + { + DrawOverscan(vdc, target_ptr, DisplayRect); + } + } + + if(TCT == 2 && SHOULD_DRAW && fc_vrm) + { + MixVPC(DisplayRect->w, line_buffer[0], line_buffer[1], surface->pix() + (frame_counter - 14) * surface->pitchinpix); + } + + if(SHOULD_DRAW && fc_vrm) + { + MDFN_MidLineUpdate(espec, frame_counter - 14); + } + // + // + // + + for(unsigned chip = 0; chip < TCT; chip++) + if((vdc_chips[chip]->CR & 0x08) && need_vbi[chip]) + vdc_chips[chip]->status |= VDCS_VD; + + HuC6280_Run(2); + + for(unsigned chip = 0; chip < TCT; chip++) + if(vdc_chips[chip]->status & VDCS_VD) + { + VDC_DEBUG("VBlank IRQ"); + HuC6280_IRQBegin(MDFN_IQIRQ1); + } + + HuC6280_Run(455 - line_leadin1 - 2); + + if(PCE_IsCD) + { + PCECD_Run(HuCPU.timestamp * 3); + } + + for(unsigned chip = 0; chip < TCT; chip++) + { + vdc = vdc_chips[chip]; + vdc->RCRCount++; + + //vdc->BG_YOffset = (vdc->BG_YOffset + 1); + vdc->display_counter++; + + if(vdc->sat_dma_slcounter) + { + vdc->sat_dma_slcounter--; + if(!vdc->sat_dma_slcounter) + { + if(vdc->DCR & 0x01) + { + VDC_DEBUG("Sprite DMA IRQ"); + vdc->status |= VDCS_DS; + HuC6280_IRQBegin(MDFN_IQIRQ1); + } + } + } + + if(vdc->display_counter == (VDS + VSW + VDW + VCR + 3)) + { + vdc->display_counter = 0; + } + } + + frame_counter = (frame_counter + 1) % ((vce.CR & 0x04) ? 263 : 262); + } while(frame_counter != VBlankFL); // big frame loop! + + // Hack for the input latency-reduction hack, part 2. + if(!skip) + { + for(int y = DisplayRect->y; y < DisplayRect->y + DisplayRect->h; y++) + { + if(!LineWidths[y]) + { + LineWidths[y] = DisplayRect->w; + + DrawOverscan(vdc_chips[0], surface->pix() + y * surface->pitchinpix, DisplayRect); + + MDFN_MidLineUpdate(espec, y); + } + } + } +} + +void VDC_RunFrame(EmulateSpecStruct *espec, bool IsHES) +{ + if(VDC_TotalChips == 2) + { + switch(espec->surface ? espec->surface->format.bpp : 32) + { + case 8: BigDrawThingy<2, uint8, uint32>(espec, IsHES); break; + case 16: BigDrawThingy<2, uint16, uint32>(espec, IsHES); break; + case 32: BigDrawThingy<2, uint32, uint32>(espec, IsHES); break; + } + } + else + { + switch(espec->surface ? espec->surface->format.bpp : 32) + { + case 8: BigDrawThingy<1, uint8, uint8>(espec, IsHES); break; + case 16: BigDrawThingy<1, uint16, uint16>(espec, IsHES); break; + case 32: BigDrawThingy<1, uint32, uint32>(espec, IsHES); break; + } + } +} + +void VDC_Reset(void) +{ + vdc_chips[0]->read_buffer = 0xFFFF; + + vpc.priority[0] = vpc.priority[1] = 0x11; + + vdc_chips[0]->HSR = vdc_chips[0]->HDR = vdc_chips[0]->VSR = vdc_chips[0]->VDR = vdc_chips[0]->VCR = 0xFF; // Needed for Body Conquest 2 + + if(vdc_chips[1]) + { + vdc_chips[1]->read_buffer = 0xFFFF; + vdc_chips[1]->HSR = vdc_chips[1]->HDR = vdc_chips[1]->VSR = vdc_chips[1]->VDR = vdc_chips[1]->VCR = 0xFF; // and for HES playback to not go bonkers + } + frame_counter = 0; +} + +void VDC_Power(void) +{ + for(int chip = 0; chip < VDC_TotalChips; chip++) + memset(vdc_chips[chip], 0, sizeof(vdc_t)); + VDC_Reset(); +} + +void VDC_Init(int sgx) +{ + unlimited_sprites = MDFN_GetSettingB("pce_fast.nospritelimit"); + correct_aspect = MDFN_GetSettingB("pce_fast.correct_aspect"); + userle = ~0; + + VDC_TotalChips = sgx ? 2 : 1; + + for(int chip = 0; chip < VDC_TotalChips; chip++) + { + vdc_chips[chip] = (vdc_t *)MDFN_malloc_T(sizeof(vdc_t), "VDC"); + } + + cputest_flags = 0; +#ifdef ARCH_X86 + cputest_flags = cputest_get_flags(); +#endif +} + +void VDC_Close(void) +{ + for(int chip = 0; chip < VDC_TotalChips; chip++) + { + if(vdc_chips[chip]) + MDFN_free(vdc_chips[chip]); + vdc_chips[chip] = NULL; + } + VDC_TotalChips = 0; +} + +void VDC_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT VCE_StateRegs[] = + { + SFVARN(vce.CR, "VCECR"), + SFVARN(vce.dot_clock, "dot clock"), + SFVARN(vce.ctaddress, "ctaddress"), + SFARRAY16N(vce.color_table, 0x200, "color_table"), + SFEND + }; + + + MDFNSS_StateAction(sm, load, data_only, VCE_StateRegs, "VCE"); + + int max_chips = VDC_TotalChips; + + if(VDC_TotalChips == 2) + { + SFORMAT VPC_StateRegs[] = + { + SFVARN(vpc.st_mode, "st_mode"), + SFARRAYN(vpc.priority, 2, "priority"), + SFARRAY16N(vpc.winwidths, 2, "winwidths"), + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, VPC_StateRegs, "VPC"); + } + + for(int chip = 0; chip < max_chips; chip++) + { + vdc_t *vdc = vdc_chips[chip]; + SFORMAT VDC_StateRegs[] = + { + SFVARN(vdc->display_counter, "display_counter"), + SFVARN(vdc->sat_dma_slcounter, "sat_dma_slcounter"), + + SFVARN(vdc->select, "select"), + SFVARN(vdc->MAWR, "MAWR"), + SFVARN(vdc->MARR, "MARR"), + SFVARN(vdc->CR, "CR"), + SFVARN(vdc->RCR, "RCR"), + SFVARN(vdc->BXR, "BXR"), + SFVARN(vdc->BYR, "BYR"), + SFVARN(vdc->MWR, "MWR"), + + SFVARN(vdc->HSR, "HSR"), + SFVARN(vdc->HDR, "HDR"), + SFVARN(vdc->VSR, "VSR"), + SFVARN(vdc->VDR, "VDR"), + + SFVARN(vdc->VCR, "VCR"), + SFVARN(vdc->DCR, "DCR"), + SFVARN(vdc->SOUR, "SOUR"), + SFVARN(vdc->DESR, "DESR"), + SFVARN(vdc->LENR, "LENR"), + SFVARN(vdc->SATB, "SATB"), + + SFVARN(vdc->RCRCount, "RCRCount"), + + + SFVARN(vdc->read_buffer, "read_buffer"), + SFVARN(vdc->write_latch, "write_latch"), + SFVARN(vdc->status, "status"), + + SFARRAY16N(vdc->SAT, 0x100, "SAT"), + + SFARRAY16N(vdc->VRAM, VRAM_Size, "VRAM"), + SFVARN(vdc->DMAReadBuffer, "DMAReadBuffer"), + SFVARN(vdc->DMAReadWrite, "DMAReadWrite"), + SFVARN(vdc->DMARunning, "DMARunning"), + SFVARN(vdc->SATBPending, "SATBPending"), + SFVARN(vdc->burst_mode, "burst_mode"), + + SFVARN(vdc->BG_YOffset, "BG_YOffset"), + SFVARN(vdc->BG_XOffset, "BG_XOffset"), + SFVAR(frame_counter), + SFVARN(VDS, "VDS_cache"), + SFVARN(VSW, "VSW_cache"), + SFVARN(VDW, "VDW_cache"), + SFVARN(VCR, "VCR_cache"), + SFVARN(VBlankFL, "VBlankFL_cache"), + + SFARRAY32(need_vbi, 2), + SFVAR(line_leadin1), + SFVAR(magical), + SFVAR(cyc_tot), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, VDC_StateRegs, chip ? "VDC1" : "VDC0"); + + if(load) + { + vce.ctaddress &= 0x1FF; + + for(int x = 0; x < VRAM_Size; x++) + { + FixTileCache(vdc, x); + vdc->spr_tile_clean[x >> 6] = 0; + } + for(int x = 0; x < 512; x++) + FixPCache(x); + RebuildSATCache(vdc); + } + } +} + +}; diff --git a/Mednafen/mednafen/pce_fast/vdc.h b/Mednafen/mednafen/pce_fast/vdc.h new file mode 100644 index 0000000000..1881f2332f --- /dev/null +++ b/Mednafen/mednafen/pce_fast/vdc.h @@ -0,0 +1,208 @@ +#ifndef _PCE_VDC_H +#define _PCE_VDC_H + +namespace PCE_Fast +{ + +#define REGSETP(_reg, _data, _msb) { _reg &= 0xFF << ((_msb) ? 0 : 8); _reg |= (_data) << ((_msb) ? 8 : 0); } +#define REGGETP(_reg, _msb) ((_reg >> ((_msb) ? 8 : 0)) & 0xFF) + +#define VDC_DEBUG(x) +//printf("%s: %d\n", x, vdc->display_counter); +#define VDC_UNDEFINED(x) { } +//{ printf("%s: %d\n", x, vdc->display_counter); } + +static const uint8 vram_inc_tab[4] = { 1, 32, 64, 128 }; + +typedef struct +{ + uint8 priority[2]; + uint16 winwidths[2]; + uint8 st_mode; +} vpc_t; + +extern vpc_t vpc; + +static const int VRAM_Size = 0x8000; +static const int VRAM_SizeMask = VRAM_Size - 1; //0x7FFF; +static const int VRAM_BGTileNoMask = VRAM_SizeMask / 16; //0x7FF; + +typedef struct +{ + uint8 CR; + uint8 dot_clock; // Dot Clock(5, 7, or 10 MHz = 0, 1, 2) + uint16 ctaddress; // 9 bits + + uint16 color_table[0x200]; + uint32 color_table_cache[0x200]; +} vce_t; + +extern vce_t vce; + +typedef struct +{ + int16 y; + uint16 height; + uint16 x; + uint16 no; + uint16 flags; + bool cgmode; +} SAT_Cache_t; + +typedef struct +{ + uint32 display_counter; + + int32 sat_dma_slcounter; + + uint8 select; + uint8 status; + + uint16 MAWR; // Memory Address Write Register + uint16 MARR; // Memory Address Read Register + + uint16 CR; // Control Register + uint16 RCR; // Raster Compare Register + uint16 BXR; // Background X-Scroll Register + uint16 BYR; // Background Y-Scroll Register + uint16 MWR; // Memory Width Register + + uint16 HSR; // Horizontal Sync Register + uint16 HDR; // Horizontal Display Register + uint16 VSR; + uint16 VDR; + + uint16 VCR; + uint16 DCR; + uint16 SOUR; + uint16 DESR; + uint16 LENR; + uint16 SATB; + + uint32 RCRCount; + + uint16 read_buffer; + uint8 write_latch; + + uint16 DMAReadBuffer; + bool DMAReadWrite; + bool DMARunning; + bool SATBPending; + bool burst_mode; + + uint32 BG_YOffset; + uint32 BG_XOffset; + + int SAT_Cache_Valid; // 64 through 128, depending on the number of 32-pixel-wide sprites. + SAT_Cache_t SAT_Cache[128]; //64]; + + uint16 SAT[0x100]; + + uint16 VRAM[65536]; //VRAM_Size]; + uint64 bg_tile_cache[65536][8]; // Tile, y, x + uint8 spr_tile_cache[1024][16][16]; // Tile, y, x + uint8 spr_tile_clean[1024]; //VRAM_Size / 64]; +} vdc_t; + +extern vdc_t *vdc_chips[2]; +extern int VDC_TotalChips; + + +void VDC_SetPixelFormat(const MDFN_PixelFormat &format, const uint8* CustomColorMap, const uint32 CustomColorMapLen) MDFN_COLD; +void VDC_RunFrame(EmulateSpecStruct *espec, bool IsHES); +void VDC_SetLayerEnableMask(uint64 mask); + +DECLFW(VDC_Write); +DECLFW(VDC_Write_ST); + +DECLFR(VCE_Read); + +static INLINE uint8 VDC_Read(unsigned int A, bool SGX) +{ + uint8 ret = 0; + int msb = A & 1; + int chip = 0; + vdc_t *vdc; + + if(SGX) + { + A &= 0x1F; + switch(A) + { + case 0x8: return(vpc.priority[0]); + case 0x9: return(vpc.priority[1]); + case 0xA: return(vpc.winwidths[0]); + case 0xB: return(vpc.winwidths[0] >> 8); + case 0xC: return(vpc.winwidths[1]); + case 0xD: return(vpc.winwidths[1] >> 8); + case 0xE: return(0); + } + if(A & 0x8) return(0); + chip = (A & 0x10) >> 4; + vdc = vdc_chips[chip]; + A &= 0x3; + } + else + { + vdc = vdc_chips[0]; + A &= 0x3; + } + + switch(A) + { + case 0x0: ret = vdc->status; + + vdc->status &= ~0x3F; + + if(SGX) + { + if(!(vdc_chips[0]->status & 0x3F) && !(vdc_chips[1]->status & 0x3F)) + HuC6280_IRQEnd(MDFN_IQIRQ1); + } + else + HuC6280_IRQEnd(MDFN_IQIRQ1); // Clear VDC IRQ line + + break; + + case 0x2: + case 0x3: + ret = REGGETP(vdc->read_buffer, msb); + if(vdc->select == 0x2) // VRR - VRAM Read Register + { + if(msb) + { + vdc->MARR += vram_inc_tab[(vdc->CR >> 11) & 0x3]; + + if(vdc->MARR >= VRAM_Size) + VDC_UNDEFINED("Unmapped VRAM VRR read"); + + vdc->read_buffer = vdc->VRAM[vdc->MARR & VRAM_SizeMask]; + } + } + break; + } + + //if(HuCPU.isopread && (A == 1 || A == 3)) //(A == 2 || A == 3)) // && A == 1) + if(A == 1) + { + //if(vdc->display_counter >= (VDS + VSW) && vdc->display_counter < (VDS + VSW + VDW + 1) && vce.dot_clock > 0) + if(vce.dot_clock > 0) + ret = 0x40; + //printf("%d %d %02x\n", vdc->display_counter, vce.dot_clock, ret); + //ret = 0x40; + } + return(ret); +} + +DECLFW(VCE_Write); + +void VDC_Init(int sgx) MDFN_COLD; +void VDC_Close(void) MDFN_COLD; +void VDC_Reset(void) MDFN_COLD; +void VDC_Power(void) MDFN_COLD; + +void VDC_StateAction(StateMem *sm, int load, int data_only); + +}; + +#endif diff --git a/Mednafen/mednafen/pce_fast/vpc_mix_inner.inc b/Mednafen/mednafen/pce_fast/vpc_mix_inner.inc new file mode 100644 index 0000000000..fe61258cbc --- /dev/null +++ b/Mednafen/mednafen/pce_fast/vpc_mix_inner.inc @@ -0,0 +1,34 @@ + + uint32 vdc2_pixel, vdc1_pixel; + + vdc2_pixel = vdc1_pixel = vce.color_table_cache[0]; + + if(pb & 1) + vdc1_pixel = lb0[x]; + + if(pb & 2) + vdc2_pixel = lb1[x]; + + /* Dai MakaiMura uses setting 1, and expects VDC #2 sprites in front of VDC #1 background, but + behind VDC #1's sprites. + */ + switch(pb >> 2) + { + case 1: + //if((vdc2_pixel & (amask << 2)) && !(vdc1_pixel & (amask << 2))) + // vdc1_pixel |= amask; + vdc1_pixel |= (((vdc2_pixel ^ vdc1_pixel) & vdc2_pixel) >> 2) & amask; + break; + + case 2: + //if((vdc1_pixel & (amask << 2)) && !(vdc2_pixel & (amask << 2)) && !(vdc2_pixel & amask)) + // vdc1_pixel |= amask; + // TODO: Verify that this is correct logic. + { + const uint32 intermediate = ((vdc1_pixel ^ vdc2_pixel) & vdc1_pixel) >> 2; + vdc1_pixel |= (intermediate ^ vdc2_pixel) & intermediate & amask; + } + break; + } + target[x] = (vdc1_pixel & amask) ? vdc2_pixel : vdc1_pixel; + diff --git a/Mednafen/mednafen/pcfx/Makefile.am b/Mednafen/mednafen/pcfx/Makefile.am new file mode 100644 index 0000000000..aea2fb16ce --- /dev/null +++ b/Mednafen/mednafen/pcfx/Makefile.am @@ -0,0 +1,12 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libpcfx.a +libpcfx_a_SOURCES = king.cpp soundbox.cpp pcfx.cpp interrupt.cpp input.cpp timer.cpp rainbow.cpp jrevdct.cpp huc6273.cpp fxscsi.cpp + +libpcfx_a_SOURCES += input/gamepad.cpp input/mouse.cpp + +if WANT_DEBUGGER +libpcfx_a_SOURCES += debug.cpp +endif diff --git a/Mednafen/mednafen/pcfx/Makefile.in b/Mednafen/mednafen/pcfx/Makefile.in new file mode 100644 index 0000000000..381467c3f1 --- /dev/null +++ b/Mednafen/mednafen/pcfx/Makefile.in @@ -0,0 +1,714 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = debug.cpp +subdir = src/pcfx +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libpcfx_a_AR = $(AR) $(ARFLAGS) +libpcfx_a_LIBADD = +am__libpcfx_a_SOURCES_DIST = king.cpp soundbox.cpp pcfx.cpp \ + interrupt.cpp input.cpp timer.cpp rainbow.cpp jrevdct.cpp \ + huc6273.cpp fxscsi.cpp input/gamepad.cpp input/mouse.cpp \ + debug.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@WANT_DEBUGGER_TRUE@am__objects_1 = debug.$(OBJEXT) +am_libpcfx_a_OBJECTS = king.$(OBJEXT) soundbox.$(OBJEXT) \ + pcfx.$(OBJEXT) interrupt.$(OBJEXT) input.$(OBJEXT) \ + timer.$(OBJEXT) rainbow.$(OBJEXT) jrevdct.$(OBJEXT) \ + huc6273.$(OBJEXT) fxscsi.$(OBJEXT) input/gamepad.$(OBJEXT) \ + input/mouse.$(OBJEXT) $(am__objects_1) +libpcfx_a_OBJECTS = $(am_libpcfx_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libpcfx_a_SOURCES) +DIST_SOURCES = $(am__libpcfx_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libpcfx.a +libpcfx_a_SOURCES = king.cpp soundbox.cpp pcfx.cpp interrupt.cpp \ + input.cpp timer.cpp rainbow.cpp jrevdct.cpp huc6273.cpp \ + fxscsi.cpp input/gamepad.cpp input/mouse.cpp $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/pcfx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/pcfx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +input/$(am__dirstamp): + @$(MKDIR_P) input + @: > input/$(am__dirstamp) +input/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) input/$(DEPDIR) + @: > input/$(DEPDIR)/$(am__dirstamp) +input/gamepad.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/mouse.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) + +libpcfx.a: $(libpcfx_a_OBJECTS) $(libpcfx_a_DEPENDENCIES) $(EXTRA_libpcfx_a_DEPENDENCIES) + $(AM_V_at)-rm -f libpcfx.a + $(AM_V_AR)$(libpcfx_a_AR) libpcfx.a $(libpcfx_a_OBJECTS) $(libpcfx_a_LIBADD) + $(AM_V_at)$(RANLIB) libpcfx.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f input/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fxscsi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huc6273.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interrupt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jrevdct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/king.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcfx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rainbow.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/soundbox.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/gamepad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/mouse.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f input/$(DEPDIR)/$(am__dirstamp) + -rm -f input/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/pcfx/debug.cpp b/Mednafen/mednafen/pcfx/debug.cpp new file mode 100644 index 0000000000..82d1b25231 --- /dev/null +++ b/Mednafen/mednafen/pcfx/debug.cpp @@ -0,0 +1,1027 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcfx.h" + +#include +#include +#include +#include + +#include "debug.h" +#include +#include "interrupt.h" +#include "timer.h" +#include "king.h" +#include "rainbow.h" +#include "input.h" +#include + +static void (*CPUHook)(uint32, bool bpoint) = NULL; +static bool CPUHookContinuous = false; +static void (*LogFunc)(const char *, const char *); +static iconv_t sjis_ict = (iconv_t)-1; +bool PCFX_LoggingOn = FALSE; + +typedef struct __PCFX_BPOINT { + uint32 A[2]; + int type; + bool logical; +} PCFX_BPOINT; + +static std::vector BreakPointsPC, BreakPointsRead, BreakPointsWrite, BreakPointsIORead, BreakPointsIOWrite; +static std::vector BreakPointsAux0Read, BreakPointsAux0Write; +static bool FoundBPoint = 0; + +struct BTEntry +{ + uint32 from; + uint32 to; + uint32 branch_count; + uint32 ecode; +}; + +#define NUMBT 24 +static bool BTEnabled = false; +static BTEntry BTEntries[NUMBT]; +static int BTIndex = 0; + +static void AddBranchTrace(uint32 from, uint32 to, uint32 ecode) +{ + BTEntry *prevbt = &BTEntries[(BTIndex + NUMBT - 1) % NUMBT]; + + //if(BTEntries[(BTIndex - 1) & 0xF] == PC) return; + + if(prevbt->from == from && prevbt->to == to && prevbt->ecode == ecode && prevbt->branch_count < 0xFFFFFFFF) + prevbt->branch_count++; + else + { + BTEntries[BTIndex].from = from; + BTEntries[BTIndex].to = to; + BTEntries[BTIndex].ecode = ecode; + BTEntries[BTIndex].branch_count = 1; + + BTIndex = (BTIndex + 1) % NUMBT; + } +} + +void PCFXDBG_EnableBranchTrace(bool enable) +{ + BTEnabled = enable; + if(!enable) + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + } +} + +std::vector PCFXDBG_GetBranchTrace(void) +{ + BranchTraceResult tmp; + std::vector ret; + + for(int x = 0; x < NUMBT; x++) + { + const BTEntry *bt = &BTEntries[(x + BTIndex) % NUMBT]; + + tmp.count = bt->branch_count; + trio_snprintf(tmp.from, sizeof(tmp.from), "%08x", bt->from); + trio_snprintf(tmp.to, sizeof(tmp.to), "%08x", bt->to); + + tmp.code[0] = 0; + + if(bt->ecode >= 0xFFA0 && bt->ecode <= 0xFFBF) // TRAP + { + trio_snprintf(tmp.code, sizeof(tmp.code), "TRAP"); + } + else if(bt->ecode >= 0xFE00 && bt->ecode <= 0xFEFF) + { + trio_snprintf(tmp.code, sizeof(tmp.code), "INT%d", (bt->ecode >> 4) & 0xF); + } + else switch(bt->ecode) + { + case 0: break; + default: trio_snprintf(tmp.code, sizeof(tmp.code), "e"); + break; + + case 0xFFF0: // Reset + trio_snprintf(tmp.code, sizeof(tmp.code), "R"); + break; + + case 0xFFD0: // NMI + trio_snprintf(tmp.code, sizeof(tmp.code), "NMI"); + break; + + case 0xFFC0: // Address trap + trio_snprintf(tmp.code, sizeof(tmp.code), "ADTR"); + break; + + case 0xFF90: // Illegal/invalid instruction code + trio_snprintf(tmp.code, sizeof(tmp.code), "ILL"); + break; + + case 0xFF80: // Zero division + trio_snprintf(tmp.code, sizeof(tmp.code), "ZD"); + break; + + case 0xFF70: + trio_snprintf(tmp.code, sizeof(tmp.code), "FIV"); // FIV + break; + + case 0xFF68: + trio_snprintf(tmp.code, sizeof(tmp.code), "FZD"); // FZD + break; + + case 0xFF64: + trio_snprintf(tmp.code, sizeof(tmp.code), "FOV"); // FOV + break; + + case 0xFF62: + trio_snprintf(tmp.code, sizeof(tmp.code), "FUD"); // FUD + break; + + case 0xFF61: + trio_snprintf(tmp.code, sizeof(tmp.code), "FPR"); // FPR + break; + + case 0xFF60: + trio_snprintf(tmp.code, sizeof(tmp.code), "FRO"); // FRO + break; + } + + ret.push_back(tmp); + } + return(ret); +} + +template +static void SimuVDC(bool which_vdc, bool addr, unsigned value = 0) +{ + VDC_SimulateResult result; + + if(write) + fx_vdc_chips[which_vdc]->SimulateWrite16(addr, value, &result); + else + fx_vdc_chips[which_vdc]->SimulateRead16(addr, &result); + + if(result.ReadCount) + PCFXDBG_CheckBP(BPOINT_AUX_READ, 0x80000 | (which_vdc << 16) | result.ReadStart, 0, result.ReadCount); + + if(result.WriteCount) + PCFXDBG_CheckBP(BPOINT_AUX_WRITE, 0x80000 | (which_vdc << 16) | result.WriteStart, 0/*FIXME(HOW? :b)*/, result.WriteCount); + + if(result.RegReadDone) + PCFXDBG_CheckBP(BPOINT_AUX_READ, 0xA0000 | (which_vdc << 16) | result.RegRWIndex, 0, 1); + + if(result.RegWriteDone) + PCFXDBG_CheckBP(BPOINT_AUX_WRITE, 0xA0000 | (which_vdc << 16) | result.RegRWIndex, 0, 1); +} + +void PCFXDBG_CheckBP(int type, uint32 address, uint32 value, unsigned int len) +{ + std::vector::iterator bpit, bpit_end; + + if(type == BPOINT_READ) + { + bpit = BreakPointsRead.begin(); + bpit_end = BreakPointsRead.end(); + + if(MDFN_UNLIKELY(address >= 0xA4000000 && address <= 0xABFFFFFF)) + { + SimuVDC((bool)(address & 0x8000000), 1); + } + } + else if(type == BPOINT_WRITE) + { + bpit = BreakPointsWrite.begin(); + bpit_end = BreakPointsWrite.end(); + + if(MDFN_UNLIKELY(address >= 0xB4000000 && address <= 0xBBFFFFFF)) + { + SimuVDC((bool)(address & 0x8000000), 1, value); + } + } + else if(type == BPOINT_IO_READ) + { + bpit = BreakPointsIORead.begin(); + bpit_end = BreakPointsIORead.end(); + + if(address >= 0x400 && address <= 0x5FF) + { + SimuVDC((bool)(address & 0x100), (bool)(address & 4)); + } + } + else if(type == BPOINT_IO_WRITE) + { + bpit = BreakPointsIOWrite.begin(); + bpit_end = BreakPointsIOWrite.end(); + + if(address >= 0x400 && address <= 0x5FF) + { + SimuVDC((bool)(address & 0x100), (bool)(address & 4), value); + } + } + else if(type == BPOINT_AUX_READ) + { + bpit = BreakPointsAux0Read.begin(); + bpit_end = BreakPointsAux0Read.end(); + } + else if(type == BPOINT_AUX_WRITE) + { + bpit = BreakPointsAux0Write.begin(); + bpit_end = BreakPointsAux0Write.end(); + } + else + return; + + for(; bpit != bpit_end; bpit++) + { + uint32 tmp_address = address; + uint32 tmp_len = len; + + while(tmp_len--) + { + if(tmp_address >= bpit->A[0] && tmp_address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + tmp_address++; + } + } +} + +enum +{ + SVT_NONE = 0, + SVT_PTR, + SVT_STRINGPTR, + SVT_INT, + SVT_UCHAR, + SVT_LONG, + SVT_ULONG, +}; + +typedef struct +{ + unsigned int number; + const char *name; + int arguments; + int argument_types[16]; +} syscall_t; + +static const syscall_t SysDefs[] = +{ + { 0, "fsys_init", 3, { SVT_PTR, SVT_PTR, SVT_PTR} }, + { 1, "fsys_mount", 2, { SVT_PTR, SVT_PTR } }, + { 2, "fsys_ctrl", 4, { SVT_STRINGPTR, SVT_INT, SVT_PTR, SVT_INT } }, + { 3, "fsys_getfsys", 1, { SVT_PTR } }, + { 4, "fsys_format", 2, { SVT_PTR, SVT_PTR } }, + { 5, "fsys_diskfree", 1, { SVT_STRINGPTR } }, + { 6, "fsys_getblocks", 1, { SVT_PTR } }, + { 7, "fsys_open", 2, { SVT_STRINGPTR, SVT_INT } }, + { 8, "fsys_read", 3, { SVT_INT, SVT_PTR, SVT_INT } }, + { 9, "fsys_write", 3, { SVT_INT, SVT_PTR, SVT_INT } }, + { 10, "fsys_seek", 3, { SVT_INT, SVT_LONG, SVT_INT } }, + { 11, "fsys_htime", 2, { SVT_INT, SVT_LONG} }, + { 12, "fsys_close", 1, { SVT_INT } }, + { 13, "fsys_delete", 1, { SVT_STRINGPTR } }, + { 14, "fsys_rename", 2, { SVT_STRINGPTR } }, + { 15, "fsys_mkdir", 1, { SVT_STRINGPTR } }, + { 16, "fsys_rmdir", 1, { SVT_STRINGPTR } }, + { 17, "fsys_chdir", 1, { SVT_STRINGPTR } }, + { 18, "fsys_curdir", 1, { SVT_PTR } }, + { 19, "fsys_ffiles", 2, { SVT_PTR, SVT_PTR } }, + { 20, "fsys_nfiles", 1, { SVT_PTR } }, + { 21, "fsys_efiles", 1, { SVT_PTR } }, + { 22, "fsys_datetime", 1, { SVT_ULONG } }, + { 23, "fsys_m_init", 2, { SVT_PTR, SVT_PTR } }, + { 24, "fsys_malloc", 1, { SVT_INT } }, + { 25, "fsys_free", 1, { SVT_INT } }, + { 26, "fsys_setblock", 2, { SVT_PTR, SVT_INT } }, +}; + +static void DoSyscallLog(void) +{ + uint32 ws = 0; + unsigned int which = 0; + unsigned int nargs = 0; + const char *func_name = ""; + char argsbuffer[2048]; + + for(unsigned int i = 0; i < sizeof(SysDefs) / sizeof(syscall_t); i++) + { + if(SysDefs[i].number == PCFX_V810.GetPR(10)) + { + nargs = SysDefs[i].arguments; + func_name = SysDefs[i].name; + which = i; + break; + } + } + + { + char *pos = argsbuffer; + + argsbuffer[0] = 0; + + pos += trio_sprintf(pos, "("); + for(unsigned int i = 0; i < nargs; i++) + { + if(SysDefs[which].argument_types[i] == SVT_STRINGPTR) + { + uint8 quickiebuf[64 + 1]; + int qbuf_index = 0; + bool error_thing = FALSE; + + do + { + uint32 A = PCFX_V810.GetPR(6 + i) + qbuf_index; + + quickiebuf[qbuf_index] = 0; + + if(A >= 0x80000000 && A < 0xF0000000) + { + error_thing = TRUE; + break; + } + + quickiebuf[qbuf_index] = mem_peekbyte(ws, A); + } while(quickiebuf[qbuf_index] && ++qbuf_index < 64); + + if(qbuf_index == 64) + error_thing = TRUE; + + quickiebuf[64] = 0; + + if(error_thing) + pos += trio_sprintf(pos, "0x%08x, ", PCFX_V810.GetPR(6 + i)); + else + { + uint8 quickiebuf_utf8[64 * 6 + 1]; + char *in_ptr, *out_ptr; + size_t ibl, obl; + + ibl = qbuf_index; + obl = sizeof(quickiebuf_utf8) - 1; + + in_ptr = (char *)quickiebuf; + out_ptr = (char *)quickiebuf_utf8; + + if(iconv(sjis_ict, (ICONV_CONST char **)&in_ptr, &ibl, &out_ptr, &obl) == (size_t) -1) + { + pos += trio_sprintf(pos, "0x%08x, ", PCFX_V810.GetPR(6 + i)); + } + else + { + *out_ptr = 0; + pos += trio_sprintf(pos, "@0x%08x=\"%s\", ", PCFX_V810.GetPR(6 + i), quickiebuf_utf8); + } + } + } + else + pos += trio_sprintf(pos, "0x%08x, ", PCFX_V810.GetPR(6 + i)); + } + + // Get rid of the trailing comma and space + if(nargs) + pos-=2; + + trio_sprintf(pos, ");"); + } + + PCFXDBG_DoLog("SYSCALL", "0x%02x, %s: %s", PCFX_V810.GetPR(10), func_name, argsbuffer); +} + +static void CPUHandler(const v810_timestamp_t timestamp, uint32 PC) +{ + std::vector::iterator bpit; + + for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) + { + if(PC >= bpit->A[0] && PC <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + + fx_vdc_chips[0]->ResetSimulate(); + fx_vdc_chips[1]->ResetSimulate(); + + PCFX_V810.CheckBreakpoints(PCFXDBG_CheckBP, mem_peekhword, NULL); // FIXME: mem_peekword + + if(PCFX_LoggingOn) + { + // FIXME: There is a little race condition if a user turns on logging right between jump instruction and the first + // instruction at 0xFFF0000C, in which case the call-from address will be wrong. + static uint32 lastPC = ~0; + + if(PC == 0xFFF0000C) + { + static const char *font_sizes[6] = + { + "KANJI16x16", "KANJI12x12", "ANK8x16", "ANK6x12", "ANK8x8", "ANK8x12" + }; + + // FIXME, overflow possible and speed + PCFXDBG_DoLog("ROMFONT", "0x%08x->0xFFF0000C, PR7=0x%08x=%s, PR6=0x%04x = %s", lastPC, PCFX_V810.GetPR(7), (PCFX_V810.GetPR(7) > 5) ? "?" : font_sizes[PCFX_V810.GetPR(7)], PCFX_V810.GetPR(6) & 0xFFFF, PCFXDBG_ShiftJIS_to_UTF8(PCFX_V810.GetPR(6) & 0xFFFF)); + setvbuf(stdout, NULL, _IONBF, 0); + printf("%s", PCFXDBG_ShiftJIS_to_UTF8(PCFX_V810.GetPR(6) & 0xFFFF)); + } + else if(PC == 0xFFF00008) + DoSyscallLog(); + + lastPC = PC; + } + + CPUHookContinuous |= FoundBPoint; + + if(CPUHookContinuous && CPUHook) + { + ForceEventUpdates(timestamp); + CPUHook(PC, FoundBPoint); + } + + FoundBPoint = false; +} + +static void RedoCPUHook(void) +{ + bool HappyTest; + + HappyTest = CPUHook || PCFX_LoggingOn || BreakPointsPC.size() || BreakPointsRead.size() || BreakPointsWrite.size() || + BreakPointsIOWrite.size() || BreakPointsIORead.size() || BreakPointsAux0Read.size() || BreakPointsAux0Write.size(); + + PCFX_V810.SetCPUHook(HappyTest ? CPUHandler : NULL, BTEnabled ? AddBranchTrace : NULL); +} + +static void PCFXDBG_FlushBreakPoints(int type) +{ + std::vector::iterator bpit; + + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_IO_READ) + BreakPointsIORead.clear(); + else if(type == BPOINT_IO_WRITE) + BreakPointsIOWrite.clear(); + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.clear(); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.clear(); + else if(type == BPOINT_PC) + BreakPointsPC.clear(); + + RedoCPUHook(); + KING_NotifyOfBPE(BreakPointsAux0Read.size(), BreakPointsAux0Write.size()); +} + +static void PCFXDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + PCFX_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type = type; + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_IO_READ) + BreakPointsIORead.push_back(tmp); + else if(type == BPOINT_IO_WRITE) + BreakPointsIOWrite.push_back(tmp); + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.push_back(tmp); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.push_back(tmp); + else if(type == BPOINT_PC) + BreakPointsPC.push_back(tmp); + + RedoCPUHook(); + KING_NotifyOfBPE(BreakPointsAux0Read.size(), BreakPointsAux0Write.size()); +} + +static uint16 dis_readhw(uint32 A) +{ + return(mem_peekhword(0, A)); +} + +static void PCFXDBG_Disassemble(uint32 &a, uint32 SpecialA, char *TextBuf) +{ + return(v810_dis(a, 1, TextBuf, dis_readhw)); +} + +static uint32 PCFXDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ret = 0; + uint32 ws = 0; + + for(unsigned int i = 0; i < bsize; i++) + { + A &= 0xFFFFFFFF; + ret |= mem_peekbyte(ws, A) << (i * 8); + A++; + } + + return(ret); +} + +static uint32 PCFXDBG_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + switch(id >> 16) + { + case 0: return PCFX_V810.GetRegister(id & 0xFFFF, special, special_len); + case 1: return PCFXIRQ_GetRegister(id & 0xFFFF, special, special_len); + case 2: return FXTIMER_GetRegister(id & 0xFFFF, special, special_len); + case 3: return FXINPUT_GetRegister(id & 0xFFFF, special, special_len); + } + + return 0xDEADBEEF; +} + +static void PCFXDBG_SetRegister(const unsigned int id, uint32 value) +{ + switch(id >> 16) + { + case 0: PCFX_V810.SetRegister(id & 0xFFFF, value); break; + case 1: PCFXIRQ_SetRegister(id & 0xFFFF, value); break; + case 2: FXTIMER_SetRegister(id & 0xFFFF, value); break; + case 3: FXINPUT_SetRegister(id & 0xFFFF, value); break; + } +} + +static void PCFXDBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + CPUHook = callb; + CPUHookContinuous = continuous; + RedoCPUHook(); +} + +void PCFXDBG_DoLog(const char *type, const char *format, ...) +{ + if(LogFunc) + { + char *temp; + + va_list ap; + va_start(ap, format); + + temp = trio_vaprintf(format, ap); + LogFunc(type, temp); + free(temp); + + va_end(ap); + } +} + +void PCFXDBG_SetLogFunc(void (*func)(const char *, const char *)) +{ + LogFunc = func; + + PCFX_LoggingOn = func ? TRUE : FALSE; + SCSICD_SetLog(func ? PCFXDBG_DoLog : NULL); + KING_SetLogFunc(func ? PCFXDBG_DoLog : NULL); + + if(PCFX_LoggingOn) + { + if(sjis_ict == (iconv_t)-1) + sjis_ict = iconv_open("UTF-8", "shift_jis"); + } + else + { + if(sjis_ict != (iconv_t)-1) + { + iconv_close(sjis_ict); + sjis_ict = (iconv_t)-1; + } + } + RedoCPUHook(); +} + +char *PCFXDBG_ShiftJIS_to_UTF8(const uint16 sjc) +{ + static char ret[16]; + char inbuf[3]; + char *in_ptr, *out_ptr; + size_t ibl, obl; + + if(sjc < 256) + { + inbuf[0] = sjc; + inbuf[1] = 0; + ibl = 1; + } + else + { + inbuf[0] = sjc >> 8; + inbuf[1] = sjc >> 0; + inbuf[2] = 0; + ibl = 2; + } + + in_ptr = inbuf; + out_ptr = ret; + obl = 16; + + iconv(sjis_ict, (ICONV_CONST char **)&in_ptr, &ibl, &out_ptr, &obl); + + *out_ptr = 0; + + return(ret); +} + +static RegType PCFXRegs0[] = +{ + { V810::GSREG_PC, "PC", "Program Counter", 4 }, + { V810::GSREG_PR + 1, "PR1", "Program Register 1", 4 }, + { V810::GSREG_PR + 2, "HSP", "Program Register 2(Handler Stack Pointer)", 4 }, + { V810::GSREG_PR + 3, "SP", "Program Register 3(Stack Pointer)", 4 }, + { V810::GSREG_PR + 4, "GP", "Program Register 4(Global Pointer)", 4 }, + { V810::GSREG_PR + 5, "TP", "Program Register 5(Text Pointer)", 4 }, + { V810::GSREG_PR + 6, "PR6", "Program Register 6", 4 }, + { V810::GSREG_PR + 7, "PR7", "Program Register 7", 4 }, + { V810::GSREG_PR + 8, "PR8", "Program Register 8", 4 }, + { V810::GSREG_PR + 9, "PR9", "Program Register 9", 4 }, + { V810::GSREG_PR + 10, "PR10", "Program Register 10", 4 }, + { V810::GSREG_PR + 11, "PR11", "Program Register 11", 4 }, + { V810::GSREG_PR + 12, "PR12", "Program Register 12", 4 }, + { V810::GSREG_PR + 13, "PR13", "Program Register 13", 4 }, + { V810::GSREG_PR + 14, "PR14", "Program Register 14", 4 }, + { V810::GSREG_PR + 15, "PR15", "Program Register 15", 4 }, + { V810::GSREG_PR + 16, "PR16", "Program Register 16", 4 }, + { V810::GSREG_PR + 17, "PR17", "Program Register 17", 4 }, + { V810::GSREG_PR + 18, "PR18", "Program Register 18", 4 }, + { V810::GSREG_PR + 19, "PR19", "Program Register 19", 4 }, + { V810::GSREG_PR + 20, "PR20", "Program Register 20", 4 }, + { V810::GSREG_PR + 21, "PR21", "Program Register 21", 4 }, + { V810::GSREG_PR + 22, "PR22", "Program Register 22", 4 }, + { V810::GSREG_PR + 23, "PR23", "Program Register 23", 4 }, + { V810::GSREG_PR + 24, "PR24", "Program Register 24", 4 }, + { V810::GSREG_PR + 25, "PR25", "Program Register 25", 4 }, + { V810::GSREG_PR + 26, "PR26", "Program Register 26(String Dest Bit Offset)", 4 }, + { V810::GSREG_PR + 27, "PR27", "Program Register 27(String Source Bit Offset)", 4 }, + { V810::GSREG_PR + 28, "PR28", "Program Register 28(String Length)", 4 }, + { V810::GSREG_PR + 29, "PR29", "Program Register 29(String Dest)", 4 }, + { V810::GSREG_PR + 30, "PR30", "Program Register 30(String Source)", 4 }, + { V810::GSREG_PR + 31, "LP", "Program Register 31(Link Pointer)", 4 }, + + { V810::GSREG_SR + 0, "SR0", "Exception/Interrupt PC", 4 }, + { V810::GSREG_SR + 1, "SR1", "Exception/Interrupt PSW", 4 }, + { V810::GSREG_SR + 2, "SR2", "Fatal Error PC", 4 }, + { V810::GSREG_SR + 3, "SR3", "Fatal Error PSW", 4 }, + { V810::GSREG_SR + 4, "SR4", "Exception Cause Register", 4 }, + { V810::GSREG_SR + 5, "SR5", "Program Status Word", 4 }, + { V810::GSREG_SR + 6, "SR6", "Processor ID Register", 4 }, + { V810::GSREG_SR + 7, "SR7", "Task Control Word", 4 }, + { V810::GSREG_SR + 24, "SR24", "Cache Control Word", 4 }, + { V810::GSREG_SR + 25, "SR25", "Address Trap Register", 4 }, + + { (1 << 16) | PCFXIRQ_GSREG_IPEND, "IPEND", "Interrupts Pending", 2 }, + { (1 << 16) | PCFXIRQ_GSREG_IMASK, "IMASK", "Interrupt Mask", 2 }, + { (1 << 16) | PCFXIRQ_GSREG_IPRIO0, "IPRIO0", "Interrupt Priority Register 0", 2 }, + { (1 << 16) | PCFXIRQ_GSREG_IPRIO1, "IPRIO1", "Interrupt Priority Register 1", 2 }, + + { (2 << 16) | FXTIMER_GSREG_TCTRL, "TCTRL", "Timer Control", 2 }, + { (2 << 16) | FXTIMER_GSREG_TPRD, "TPRD", "Timer Period", 2 }, + { (2 << 16) | FXTIMER_GSREG_TCNTR, "TCNTR", "Timer Counter", 3 }, + + { (3 << 16) | FXINPUT_GSREG_KPCTRL0, "KPCTRL0", "Keyport 0 Control", 1 }, + { (3 << 16) | FXINPUT_GSREG_KPCTRL1, "KPCTRL1", "Keyport 1 Control", 1 }, + + { V810::GSREG_TIMESTAMP, "TStamp", "Timestamp", 3 }, + { 0, "", "", 0 }, +}; + +static RegType KINGRegs0[] = +{ + { KING_GSREG_AR, "AR", "Active Register", 1 }, + { KING_GSREG_MPROGADDR, "MPROGADDR", "Micro-program Address", 2 }, + { KING_GSREG_MPROGCTRL, "MPROGCTRL", "Micro-program Control", 2 }, + + { KING_GSREG_PAGESET, "PAGESET", "KRAM Page Settings", 2 }, + { KING_GSREG_RTCTRL, "RTCTRL", "Rainbow Transfer Control", 2 }, + { KING_GSREG_RKRAMA, "RKRAMA", "Rainbow Transfer K-RAM Address", 3}, + { KING_GSREG_RSTART, "RSTART", "Rainbow Transfer Start Position", 2}, + { KING_GSREG_RCOUNT, "RCOUNT", "Rainbow Transfer Block Count", 2 }, + { KING_GSREG_RIRQLINE, "RIRQLINE", "Raster IRQ Line", 2 }, + { KING_GSREG_KRAMWA, "KRAMWA", "K-RAM Write Address", 4 }, + { KING_GSREG_KRAMRA, "KRAMRA", "K-RAM Read Address", 4 }, + { KING_GSREG_DMATA, "DMATA", "DMA Transfer Address", 3 }, + { KING_GSREG_DMATS, "DMATS", "DMA Transfer Size", 4 }, + { KING_GSREG_DMASTT, "DMASTT", "DMA Status", 2 }, + { KING_GSREG_ADPCMCTRL, "ADPCMCTRL", "ADPCM Control", 2 }, + { KING_GSREG_ADPCMBM0, "ADPCMBM0", "ADPCM Buffer Mode Ch0", 2 }, + { KING_GSREG_ADPCMBM1, "ADPCMBM1", "ADPCM Buffer Mode Ch1", 2 }, + { KING_GSREG_ADPCMPA0, "ADPCMPA0", "ADPCM PlayAddress Ch0", 0x100 | 18 }, + { KING_GSREG_ADPCMPA1, "ADPCMPA1", "ADPCM PlayAddress Ch1", 0x100 | 18 }, + { KING_GSREG_ADPCMSA0, "ADPCMSA0", "ADPCM Start Address Ch0", 2 }, + { KING_GSREG_ADPCMSA1, "ADPCMSA1", "ADPCM Start Address Ch1", 2 }, + { KING_GSREG_ADPCMIA0, "ADPCMIA0", "ADPCM Intermediate Address Ch0", 2 }, + { KING_GSREG_ADPCMIA1, "ADPCMIA1", "ADPCM Intermediate Address Ch1", 2 }, + { KING_GSREG_ADPCMEA0, "ADPCMEA0", "ADPCM End Address Ch0", 0x100 | 18 }, + { KING_GSREG_ADPCMEA1, "ADPCMEA1", "ADPCM End Address Ch1", 0x100 | 18 }, + { KING_GSREG_ADPCMStat, "ADPCMStat", "ADPCM Status Register", 1 }, + { KING_GSREG_Reg01, "Reg01", "KING Register 0x01", 1 }, + { KING_GSREG_Reg02, "Reg02", "KING Register 0x02", 1 }, + { KING_GSREG_Reg03, "Reg03", "KING Register 0x03", 1 }, + { KING_GSREG_SUBCC, "SUBCC", "Sub-channel Control", 1 }, + { 0, "------", "", 0xFFFF }, + { KING_GSREG_DB, "DB", "SCSI Data Bus", 0x100 | 8 }, + { KING_GSREG_BSY, "BSY", "SCSI BSY", 0x100 | 1 }, + { KING_GSREG_REQ, "REQ", "SCSI REQ", 0x100 | 1 }, + { KING_GSREG_ACK, "ACK", "SCSI ACK", 0x100 | 1 }, + { KING_GSREG_MSG, "MSG", "SCSI MSG", 0x100 | 1 }, + { KING_GSREG_IO, "IO", "SCSI IO", 0x100 | 1 }, + { KING_GSREG_CD, "CD", "SCSI CD", 0x100 | 1 }, + { KING_GSREG_SEL, "SEL", "SCSI SEL", 0x100 | 1 }, + + { 0, "", "", 0 }, +}; + +static RegType KINGRegs1[] = +{ + { 0, "-KING BG-", "", 0xFFFF }, + + { KING_GSREG_BGMODE, "Mode", "Background Mode", 2 }, + { KING_GSREG_BGPRIO, "Prio", "Background Priority", 2 }, + { KING_GSREG_BGSCRM, "ScrM", "Background Scroll Mode", 2 }, + + { 0, "--KBG0:--", "", 0xFFFF }, + { KING_GSREG_BGSIZ0, "Size", "Background 0 Size", 2 }, + { KING_GSREG_BGBAT0, "BAT", "Background 0 BAT Address", 1 }, + { KING_GSREG_BGCG0, "CG", "Background 0 CG Address", 1 }, + { KING_GSREG_BGBATS, "SubBAT", "Background 0 SUB BAT Address", 1 }, + { KING_GSREG_BGCGS, "SubCG", "Background 0 SUB CG Address", 1 }, + { KING_GSREG_BGXSC0, "XScr", "Background 0 X Scroll", 0x100 | 11 }, + { KING_GSREG_BGYSC0, "YScr", "Background 0 Y Scroll", 0x100 | 11 }, + + { 0, "--KBG1:--", "", 0xFFFF }, + { KING_GSREG_BGSIZ1, "Size", "Background 1 Size", 1 }, + { KING_GSREG_BGBAT1, "BAT", "Background 1 BAT Address", 1 }, + { KING_GSREG_BGCG1, "CG", "Background 1 CG Address", 1 }, + { KING_GSREG_BGXSC1, "XScr", "Background 1 X Scroll", 0x100 | 10 }, + { KING_GSREG_BGYSC1, "YScr", "Background 1 Y Scroll", 0x100 | 10 }, + + { 0, "--KBG2:--", "", 0xFFFF }, + { KING_GSREG_BGSIZ2, "Size", "Background 2 Size", 1 }, + { KING_GSREG_BGBAT2, "BAT", "Background 2 BAT Address", 1 }, + { KING_GSREG_BGCG2, "CG", "Background 2 CG Address", 1 }, + { KING_GSREG_BGXSC2, "XScr", "Background 2 X Scroll", 0x100 | 10 }, + { KING_GSREG_BGYSC2, "YScr", "Background 2 Y Scroll", 0x100 | 10 }, + + { 0, "--KBG3:--", "", 0xFFFF }, + { KING_GSREG_BGSIZ3, "Size", "Background 3 Size", 1 }, + { KING_GSREG_BGBAT3, "BAT", "Background 3 BAT Address", 1 }, + { KING_GSREG_BGCG3, "CG", "Background 3 CG Address", 1 }, + { KING_GSREG_BGXSC3, "XScr", "Background 3 X Scroll", 0x100 | 10 }, + { KING_GSREG_BGYSC3, "YScr", "Background 3 Y Scroll", 0x100 | 10 }, + + + { 0, "--AFFIN:--", "", 0xFFFF }, + { KING_GSREG_AFFINA, "A", "Background Affin Coefficient A", 2 }, + { KING_GSREG_AFFINB, "B", "Background Affin Coefficient B", 2 }, + { KING_GSREG_AFFINC, "C", "Background Affin Coefficient C", 2 }, + { KING_GSREG_AFFIND, "D", "Background Affin Coefficient D", 2 }, + { KING_GSREG_AFFINX, "X", "Background Affin Center X", 2 }, + { KING_GSREG_AFFINY, "Y", "Background Affin Center Y", 2 }, + + { 0, "--MPROG:--", "", 0xFFFF }, + { KING_GSREG_MPROG0, "0", "Micro-program", 2}, + { KING_GSREG_MPROG1, "1", "Micro-program", 2}, + { KING_GSREG_MPROG2, "2", "Micro-program", 2}, + { KING_GSREG_MPROG3, "3", "Micro-program", 2}, + { KING_GSREG_MPROG4, "4", "Micro-program", 2}, + { KING_GSREG_MPROG5, "5", "Micro-program", 2}, + { KING_GSREG_MPROG6, "6", "Micro-program", 2}, + { KING_GSREG_MPROG7, "7", "Micro-program", 2}, + { KING_GSREG_MPROG8, "8", "Micro-program", 2}, + { KING_GSREG_MPROG9, "9", "Micro-program", 2}, + { KING_GSREG_MPROGA, "A", "Micro-program", 2}, + { KING_GSREG_MPROGB, "B", "Micro-program", 2}, + { KING_GSREG_MPROGC, "C", "Micro-program", 2}, + { KING_GSREG_MPROGD, "D", "Micro-program", 2}, + { KING_GSREG_MPROGE, "E", "Micro-program", 2}, + { KING_GSREG_MPROGF, "F", "Micro-program", 2}, + + { 0, "", "", 0 }, +}; + +static uint32 GetRegister_VCERAINBOW(const unsigned int id, char *special, const uint32 special_len) +{ + if(id >> 16) + return RAINBOW_GetRegister(id & 0xFFFF, special, special_len); + else + return FXVCE_GetRegister(id & 0xFFFF, special, special_len); +} + +static void SetRegister_VCERAINBOW(const unsigned int id, uint32 value) +{ + if(id >> 16) + RAINBOW_SetRegister(id & 0xFFFF, value); + else + FXVCE_SetRegister(id & 0xFFFF, value); +} + +static RegType VCERAINBOWRegs[] = +{ + { 0, "--VCE--", "", 0xFFFF }, + { FXVCE_GSREG_Line, "Line", "VCE Frame Counter", 0x100 | 9 }, + { FXVCE_GSREG_PRIO0, "PRIO0", "VCE Priority 0", 0x100 | 12 }, + { FXVCE_GSREG_PRIO1, "PRIO1", "VCE Priority 1", 2 }, + { FXVCE_GSREG_PICMODE, "PICMODE", "VCE Picture Mode", 2}, + { FXVCE_GSREG_PALRWOF, "PALRWOF", "VCE Palette R/W Offset", 2 }, + { FXVCE_GSREG_PALRWLA, "PALRWLA", "VCE Palette R/W Latch", 2 }, + { FXVCE_GSREG_PALOFS0, "PALOFS0", "VCE Palette Offset 0", 2 } , + { FXVCE_GSREG_PALOFS1, "PALOFS1", "VCE Palette Offset 1", 2 }, + { FXVCE_GSREG_PALOFS2, "PALOFS2", "VCE Palette Offset 2", 2 }, + { FXVCE_GSREG_PALOFS3, "PALOFS3", "VCE Palette Offset 3", 1 }, + { FXVCE_GSREG_CCR, "CCR", "VCE Fixed Color Register", 2 }, + { FXVCE_GSREG_BLE, "BLE", "VCE Cellophane Setting Register", 2 }, + { FXVCE_GSREG_SPBL, "SPBL", "VCE Sprite Cellophane Setting Register", 2 }, + { FXVCE_GSREG_COEFF0, "COEFF0", "VCE Cellophane Coefficient 0(1A)", 0x100 | 12 }, + { FXVCE_GSREG_COEFF1, "COEFF1", "VCE Cellophane Coefficient 1(1B)", 0x100 | 12 }, + { FXVCE_GSREG_COEFF2, "COEFF2", "VCE Cellophane Coefficient 2(2A)", 0x100 | 12 }, + { FXVCE_GSREG_COEFF3, "COEFF3", "VCE Cellophane Coefficient 3(2B)", 0x100 | 12 }, + { FXVCE_GSREG_COEFF4, "COEFF4", "VCE Cellophane Coefficient 4(3A)", 0x100 | 12 }, + { FXVCE_GSREG_COEFF5, "COEFF5", "VCE Cellophane Coefficient 5(3B)", 0x100 | 12 }, + { FXVCE_GSREG_CKeyY, "CKeyY", "VCE Chroma Key Y", 2 }, + { FXVCE_GSREG_CKeyU, "CKeyU", "VCE Chroma Key U", 2 }, + { FXVCE_GSREG_CKeyV, "CKeyV", "VCE Chroma Key V", 2 }, + + { 0, "---------", "", 0xFFFF }, + { 0, "-RAINBOW-", "", 0xFFFF }, + + { (1 << 16) | RAINBOW_GSREG_RSCRLL, "RSCRLL", "Rainbow Horizontal Scroll", 2 }, + { (1 << 16) | RAINBOW_GSREG_RCTRL, "RCTRL", "Rainbow Control", 2 }, + { (1 << 16) | RAINBOW_GSREG_RHSYNC, "RHSYNC", "Rainbow HSync?", 1 }, + { (1 << 16) | RAINBOW_GSREG_RNRY, "RNRY", "Rainbow Null Run Y", 2 }, + { (1 << 16) | RAINBOW_GSREG_RNRU, "RNRU", "Rainbow Null Run U", 2 }, + { (1 << 16) | RAINBOW_GSREG_RNRV, "RNRV", "Rainbow Null Run V", 2 }, + + { 0, "", "", 0 }, +}; + +static uint32 GetRegister_VDC(const unsigned int id, char *special, const uint32 special_len) +{ + return(fx_vdc_chips[(id >> 15) & 1]->GetRegister(id &~0x8000, special, special_len)); +} + +static void SetRegister_VDC(const unsigned int id, uint32 value) +{ + fx_vdc_chips[(id >> 15) & 1]->SetRegister(id &~0x8000, value); +} + + +static RegType VDCRegs[] = +{ + { 0, "--VDC-A--", "", 0xFFFF }, + + { VDC::GSREG_SELECT, "Select", "Register Select, VDC-A", 1 }, + { VDC::GSREG_STATUS, "Status", "Status, VDC-A", 1 }, + + { VDC::GSREG_MAWR, "MAWR", "Memory Write Address, VDC-A", 2 }, + { VDC::GSREG_MARR, "MARR", "Memory Read Address, VDC-A", 2 }, + { VDC::GSREG_CR, "CR", "Control, VDC-A", 2 }, + { VDC::GSREG_RCR, "RCR", "Raster Counter, VDC-A", 2 }, + { VDC::GSREG_BXR, "BXR", "X Scroll, VDC-A", 2 }, + { VDC::GSREG_BYR, "BYR", "Y Scroll, VDC-A", 2 }, + { VDC::GSREG_MWR, "MWR", "Memory Width, VDC-A", 2 }, + + { VDC::GSREG_HSR, "HSR", "HSR, VDC-A", 2 }, + { VDC::GSREG_HDR, "HDR", "HDR, VDC-A", 2 }, + { VDC::GSREG_VSR, "VSR", "VSR, VDC-A", 2 }, + { VDC::GSREG_VDR, "VDR", "VDR, VDC-A", 2 }, + + { VDC::GSREG_VCR, "VCR", "VCR, VDC-A", 2 }, + { VDC::GSREG_DCR, "DCR", "DMA Control, VDC-A", 2 }, + { VDC::GSREG_SOUR, "SOUR", "VRAM DMA Source Address, VDC-A", 2 }, + { VDC::GSREG_DESR, "DESR", "VRAM DMA Dest Address, VDC-A", 2 }, + { VDC::GSREG_LENR, "LENR", "VRAM DMA Length, VDC-A", 2 }, + { VDC::GSREG_DVSSR, "DVSSR", "DVSSR Update Address, VDC-A", 2 }, + { 0, "------", "", 0xFFFF }, + + { 0, "--VDC-B--", "", 0xFFFF }, + + { 0x8000 | VDC::GSREG_SELECT, "Select", "Register Select, VDC-B", 1 }, + { 0x8000 | VDC::GSREG_STATUS, "Status", "Status, VDC-B", 1 }, + + { 0x8000 | VDC::GSREG_MAWR, "MAWR", "Memory Write Address, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_MARR, "MARR", "Memory Read Address, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_CR, "CR", "Control, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_RCR, "RCR", "Raster Counter, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_BXR, "BXR", "X Scroll, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_BYR, "BYR", "Y Scroll, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_MWR, "MWR", "Memory Width, VDC-B", 2 }, + + { 0x8000 | VDC::GSREG_HSR, "HSR", "HSR, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_HDR, "HDR", "HDR, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_VSR, "VSR", "VSR, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_VDR, "VDR", "VDR, VDC-B", 2 }, + + { 0x8000 | VDC::GSREG_VCR, "VCR", "VCR, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_DCR, "DCR", "DMA Control, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_SOUR, "SOUR", "VRAM DMA Source Address, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_DESR, "DESR", "VRAM DMA Dest Address, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_LENR, "LENR", "VRAM DMA Length, VDC-B", 2 }, + { 0x8000 | VDC::GSREG_DVSSR, "DVSSR", "DVSSR Update Address, VDC-B", 2 }, + + { 0, "", "", 0 }, +}; + +static RegGroupType PCFXRegs0Group = +{ + NULL, + PCFXRegs0, + PCFXDBG_GetRegister, + PCFXDBG_SetRegister, +}; + +static RegGroupType KINGRegs0Group = +{ + NULL, + KINGRegs0, + KING_GetRegister, + KING_SetRegister +}; + +static RegGroupType KINGRegs1Group = +{ + NULL, + KINGRegs1, + KING_GetRegister, + KING_SetRegister +}; + +static RegGroupType VCERAINBOWRegsGroup = +{ + NULL, + VCERAINBOWRegs, + GetRegister_VCERAINBOW, + SetRegister_VCERAINBOW +}; + +static RegGroupType VDCRegsGroup = +{ + NULL, + VDCRegs, + GetRegister_VDC, + SetRegister_VDC +}; + +void PCFXDBG_Init(void) +{ + MDFNDBG_AddRegGroup(&PCFXRegs0Group); + MDFNDBG_AddRegGroup(&VCERAINBOWRegsGroup); + MDFNDBG_AddRegGroup(&VDCRegsGroup); + MDFNDBG_AddRegGroup(&KINGRegs1Group); + MDFNDBG_AddRegGroup(&KINGRegs0Group); +} + +static void ForceIRQ(int level) +{ + //v810_int(level); +} + +DebuggerInfoStruct PCFXDBGInfo = +{ + "shift_jis", + 4, + 2, // Instruction alignment(bytes) + 32, + 32, + 0x00000000, + ~0U, + + PCFXDBG_MemPeek, + PCFXDBG_Disassemble, + NULL, + ForceIRQ, + NULL, + PCFXDBG_FlushBreakPoints, + PCFXDBG_AddBreakPoint, + PCFXDBG_SetCPUCallback, + PCFXDBG_EnableBranchTrace, + PCFXDBG_GetBranchTrace, + KING_SetGraphicsDecode, + PCFXDBG_SetLogFunc, +}; + diff --git a/Mednafen/mednafen/pcfx/debug.h b/Mednafen/mednafen/pcfx/debug.h new file mode 100644 index 0000000000..48b123572b --- /dev/null +++ b/Mednafen/mednafen/pcfx/debug.h @@ -0,0 +1,21 @@ +#ifndef __PCFX_DEBUG_H +#define __PCFX_DEBUG_H + +#ifdef WANT_DEBUGGER + +void PCFXDBG_CheckBP(int type, uint32 address, uint32 value, unsigned int len); + +void PCFXDBG_SetLogFunc(void (*func)(const char *, const char *)); + +void PCFXDBG_DoLog(const char *type, const char *format, ...); +char *PCFXDBG_ShiftJIS_to_UTF8(const uint16 sjc); + + +extern bool PCFX_LoggingOn; + +void PCFXDBG_Init(void); +extern DebuggerInfoStruct PCFXDBGInfo; + +#endif + +#endif diff --git a/Mednafen/mednafen/pcfx/fxscsi.cpp b/Mednafen/mednafen/pcfx/fxscsi.cpp new file mode 100644 index 0000000000..95a992c552 --- /dev/null +++ b/Mednafen/mednafen/pcfx/fxscsi.cpp @@ -0,0 +1,38 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcfx.h" +#include "fxscsi.h" + +bool FXSCSI_Init(void) +{ + + return true; +} + +uint8 FXSCSI_CtrlRead(uint32 A) +{ + uint8 ret = 0; //rand(); + //printf("FXSCSI: %08x(ret=%02x)\n", A, ret); + return(ret); +} + + +void FXSCSI_CtrlWrite(uint32 A, uint8 V) +{ + printf("FXSCSI Write: %08x %02x\n", A, V); +} diff --git a/Mednafen/mednafen/pcfx/fxscsi.h b/Mednafen/mednafen/pcfx/fxscsi.h new file mode 100644 index 0000000000..09d2f6cc25 --- /dev/null +++ b/Mednafen/mednafen/pcfx/fxscsi.h @@ -0,0 +1,8 @@ +#ifndef __MDFN_FXSCSI_H +#define __MDFN_FXSCSI_H + +bool FXSCSI_Init(void); +uint8 FXSCSI_CtrlRead(uint32 A); +void FXSCSI_CtrlWrite(uint32 A, uint8 V); + +#endif diff --git a/Mednafen/mednafen/pcfx/gamedb.inc b/Mednafen/mednafen/pcfx/gamedb.inc new file mode 100644 index 0000000000..20a4db091b --- /dev/null +++ b/Mednafen/mednafen/pcfx/gamedb.inc @@ -0,0 +1,1731 @@ +// Names taken from http://pcecp.com/ and http://www.necstasy.net/ + +{ + "Aa! Megami Sama", + "ああっ女神さまっ", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 10504 }, + { 3, CDGE_FORMAT_DATA, 10890 }, + { -1, -1, 240939 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 10163 }, + { 3, CDGE_FORMAT_DATA, 10890 }, + { -1, -1, 211853 }, + } + } +}, + +{ + "Akazukin Cha Cha", + "赤ずきんちゃちゃ ーお騒かせ!パニックレース!ー", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5088 }, + { 3, CDGE_FORMAT_AUDIO, 203157 }, + { 4, CDGE_FORMAT_AUDIO, 207261 }, + { 5, CDGE_FORMAT_AUDIO, 209849 }, + { 6, CDGE_FORMAT_AUDIO, 216868 }, + { -1, -1, 220342 }, + } + } +}, + +{ + "All Japan Female Pro Wrestle - Queen of Queens", + "全日本女子プロレス Queen of Queens", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2368 }, + { -1, -1, 254165 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2368 }, + { -1, -1, 326478 }, + } + } +}, + +{ + "Angelique Special", + "アンジェリークスペシャル", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 4829 }, + { 4, CDGE_FORMAT_DATA, 8963 }, + { 5, CDGE_FORMAT_DATA, 66446 }, + { 6, CDGE_FORMAT_AUDIO, 194334 }, + { -1, -1, 198505 }, + } + } +}, + +{ + "Angelique Special 2", + "アンジェリークスペシャル2", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 4737 }, + { -1, -1, 313941 }, + } + } +}, + +{ + "Angelique Tenkuu No Requim", + "アンジェリーク天空のレクイエム", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 4737 }, + { 4, CDGE_FORMAT_DATA, 110846 }, + { -1, -1, 263180 }, + } + } +}, + +{ + "Anime Freak FX Volume 1", + "アニメフリークFX Vol.1", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5140 }, + { -1, -1, 323367 }, + } + } +}, + +{ + "Anime Freak FX Volume 2", + "アニメフリークFX Vol.2", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1523 }, + { -1, -1, 306483 }, + } + } +}, + +{ + "Anime Freak FX Volume 2 (Sample)", + NULL, + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5140 }, + { -1, -1, 309756 }, + } + } +}, + +{ + "Anime Freak FX Volume 3", + "アニメフリークFX Vol.3", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1964 }, + { -1, -1, 322351 }, + } + } +}, + +{ + "Anime Freak FX Volume 4", + "アニメフリークFX Vol.4", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 3286 }, + { -1, -1, 312713 }, + } + } +}, + +{ + "Anime Freak FX Volume 5", + "アニメフリークFX Vol.5", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2943 }, + { -1, -1, 231075 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5268 }, + { -1, -1, 267842 }, + } + } +}, + +{ + "Anime Freak FX Volume 6", + "アニメフリークFX Vol.6", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4732 }, + { -1, -1, 290461 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 17408 }, + { -1, -1, 306629 }, + } + } +}, + +{ + "Aruberea's Maiden", + "アルバレアの乙女", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2381 }, + { 3, CDGE_FORMAT_DATA, 3729 }, + { 4, CDGE_FORMAT_DATA, 11919 }, + { 5, CDGE_FORMAT_DATA, 67010 }, + { 6, CDGE_FORMAT_DATA, 68706 }, + { 7, CDGE_FORMAT_DATA, 69119 }, + { 8, CDGE_FORMAT_DATA, 69538 }, + { 9, CDGE_FORMAT_DATA, 69958 }, + { 10, CDGE_FORMAT_DATA, 70425 }, + { 11, CDGE_FORMAT_DATA, 72558 }, + { 12, CDGE_FORMAT_DATA, 74956 }, + { 13, CDGE_FORMAT_DATA, 77246 }, + { 14, CDGE_FORMAT_DATA, 83332 }, + { 15, CDGE_FORMAT_DATA, 101273 }, + { 16, CDGE_FORMAT_DATA, 113096 }, + { 17, CDGE_FORMAT_DATA, 125676 }, + { 18, CDGE_FORMAT_DATA, 144119 }, + { 19, CDGE_FORMAT_DATA, 163556 }, + { -1, -1, 234498 }, + } + } +}, + +{ + "Battle Heat", + "バトルヒート", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 6253 }, + { 4, CDGE_FORMAT_AUDIO, 16083 }, + { 5, CDGE_FORMAT_DATA, 35549 }, + { 6, CDGE_FORMAT_DATA, 39544 }, + { 7, CDGE_FORMAT_DATA, 40834 }, + { 8, CDGE_FORMAT_DATA, 101620 }, + { 9, CDGE_FORMAT_DATA, 120156 }, + { 10, CDGE_FORMAT_DATA, 142691 }, + { 11, CDGE_FORMAT_DATA, 154690 }, + { 12, CDGE_FORMAT_DATA, 164535 }, + { 13, CDGE_FORMAT_DATA, 178064 }, + { 14, CDGE_FORMAT_DATA, 194891 }, + { 15, CDGE_FORMAT_DATA, 205807 }, + { 16, CDGE_FORMAT_DATA, 216414 }, + { 17, CDGE_FORMAT_DATA, 234950 }, + { 18, CDGE_FORMAT_DATA, 257485 }, + { 19, CDGE_FORMAT_DATA, 269642 }, + { 20, CDGE_FORMAT_DATA, 280175 }, + { 21, CDGE_FORMAT_DATA, 293704 }, + { 22, CDGE_FORMAT_DATA, 310531 }, + { -1, -1, 311822 }, + } + } +}, + +{ + "Blue Breaker", + "ブルーブレイカー 剣よりも微笑みを", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5804 }, + { -1, -1, 314954 }, + } + } +}, + +{ + "Blue Chicago Blues", + "J.B. Harold ブルーシカゴブルース", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 241908 }, + { -1, -1, 242250 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 308890 }, + { 3, CDGE_FORMAT_AUDIO, 322135 }, + { -1, -1, 322477 }, + } + } +}, + +{ + "Boundary Gate - Daughter of Kingdom", + "バウンダリーゲート Daughter of Kingdom", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 31797 }, + { 4, CDGE_FORMAT_AUDIO, 34840 }, + { 5, CDGE_FORMAT_AUDIO, 38383 }, + { 6, CDGE_FORMAT_AUDIO, 38898 }, + { 7, CDGE_FORMAT_AUDIO, 40365 }, + { 8, CDGE_FORMAT_AUDIO, 41223 }, + { 9, CDGE_FORMAT_AUDIO, 41543 }, + { 10, CDGE_FORMAT_AUDIO, 44293 }, + { 11, CDGE_FORMAT_AUDIO, 47722 }, + { 12, CDGE_FORMAT_AUDIO, 48042 }, + { 13, CDGE_FORMAT_AUDIO, 50396 }, + { 14, CDGE_FORMAT_AUDIO, 50716 }, + { 15, CDGE_FORMAT_AUDIO, 51078 }, + { 16, CDGE_FORMAT_AUDIO, 51477 }, + { 17, CDGE_FORMAT_AUDIO, 52240 }, + { 18, CDGE_FORMAT_AUDIO, 53430 }, + { 19, CDGE_FORMAT_AUDIO, 54573 }, + { 20, CDGE_FORMAT_AUDIO, 56949 }, + { 21, CDGE_FORMAT_AUDIO, 59248 }, + { 22, CDGE_FORMAT_AUDIO, 61753 }, + { 23, CDGE_FORMAT_AUDIO, 62577 }, + { 24, CDGE_FORMAT_AUDIO, 63746 }, + { 25, CDGE_FORMAT_AUDIO, 64827 }, + { 26, CDGE_FORMAT_AUDIO, 66673 }, + { 27, CDGE_FORMAT_AUDIO, 69156 }, + { 28, CDGE_FORMAT_AUDIO, 71742 }, + { 29, CDGE_FORMAT_AUDIO, 74427 }, + { 30, CDGE_FORMAT_AUDIO, 76953 }, + { 31, CDGE_FORMAT_AUDIO, 78144 }, + { 32, CDGE_FORMAT_AUDIO, 78464 }, + { 33, CDGE_FORMAT_AUDIO, 83018 }, + { 34, CDGE_FORMAT_AUDIO, 83528 }, + { 35, CDGE_FORMAT_AUDIO, 87939 }, + { 36, CDGE_FORMAT_AUDIO, 88861 }, + { 37, CDGE_FORMAT_AUDIO, 91647 }, + { 38, CDGE_FORMAT_AUDIO, 92172 }, + { 39, CDGE_FORMAT_AUDIO, 94556 }, + { 40, CDGE_FORMAT_AUDIO, 97820 }, + { 41, CDGE_FORMAT_AUDIO, 98140 }, + { 42, CDGE_FORMAT_AUDIO, 98614 }, + { 43, CDGE_FORMAT_AUDIO, 98951 }, + { 44, CDGE_FORMAT_AUDIO, 99691 }, + { 45, CDGE_FORMAT_AUDIO, 100379 }, + { 46, CDGE_FORMAT_AUDIO, 100699 }, + { 47, CDGE_FORMAT_AUDIO, 101019 }, + { 48, CDGE_FORMAT_AUDIO, 101339 }, + { 49, CDGE_FORMAT_AUDIO, 103185 }, + { 50, CDGE_FORMAT_AUDIO, 103500 }, + { 51, CDGE_FORMAT_AUDIO, 107791 }, + { 52, CDGE_FORMAT_AUDIO, 108111 }, + { 53, CDGE_FORMAT_AUDIO, 108583 }, + { 54, CDGE_FORMAT_AUDIO, 109161 }, + { 55, CDGE_FORMAT_AUDIO, 113732 }, + { 56, CDGE_FORMAT_AUDIO, 114657 }, + { 57, CDGE_FORMAT_AUDIO, 115080 }, + { 58, CDGE_FORMAT_AUDIO, 115645 }, + { 59, CDGE_FORMAT_AUDIO, 115996 }, + { 60, CDGE_FORMAT_AUDIO, 117096 }, + { 61, CDGE_FORMAT_AUDIO, 117649 }, + { 62, CDGE_FORMAT_AUDIO, 117969 }, + { 63, CDGE_FORMAT_AUDIO, 118832 }, + { 64, CDGE_FORMAT_AUDIO, 120283 }, + { 65, CDGE_FORMAT_AUDIO, 122653 }, + { 66, CDGE_FORMAT_AUDIO, 122973 }, + { 67, CDGE_FORMAT_AUDIO, 123340 }, + { 68, CDGE_FORMAT_AUDIO, 123676 }, + { 69, CDGE_FORMAT_AUDIO, 123996 }, + { 70, CDGE_FORMAT_AUDIO, 126275 }, + { 71, CDGE_FORMAT_AUDIO, 130217 }, + { 72, CDGE_FORMAT_AUDIO, 137425 }, + { 73, CDGE_FORMAT_AUDIO, 143256 }, + { 74, CDGE_FORMAT_AUDIO, 145854 }, + { 75, CDGE_FORMAT_AUDIO, 149728 }, + { 76, CDGE_FORMAT_AUDIO, 151589 }, + { 77, CDGE_FORMAT_AUDIO, 151909 }, + { 78, CDGE_FORMAT_AUDIO, 152356 }, + { 79, CDGE_FORMAT_AUDIO, 156214 }, + { 80, CDGE_FORMAT_AUDIO, 158157 }, + { 81, CDGE_FORMAT_AUDIO, 159612 }, + { 82, CDGE_FORMAT_AUDIO, 162307 }, + { 83, CDGE_FORMAT_AUDIO, 163569 }, + { 84, CDGE_FORMAT_AUDIO, 166452 }, + { 85, CDGE_FORMAT_AUDIO, 169513 }, + { 86, CDGE_FORMAT_AUDIO, 174406 }, + { 87, CDGE_FORMAT_AUDIO, 191526 }, + { 88, CDGE_FORMAT_AUDIO, 197689 }, + { 89, CDGE_FORMAT_AUDIO, 197990 }, + { 90, CDGE_FORMAT_AUDIO, 198291 }, + { 91, CDGE_FORMAT_AUDIO, 201334 }, + { -1, -1, 201636 }, + } + } +}, + +{ + "Can Can Bunny Extra DX", + "きゃんきゃんバニーエクストラDX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2936 }, + { 3, CDGE_FORMAT_DATA, 3322 }, + { 4, CDGE_FORMAT_AUDIO, 279473 }, + { 5, CDGE_FORMAT_AUDIO, 291019 }, + { 6, CDGE_FORMAT_AUDIO, 303173 }, + { 7, CDGE_FORMAT_AUDIO, 309557 }, + { -1, -1, 316447 }, + } + } +}, + +{ + "Chip Chan Kick", + "チップきゃんキイーック", + CDGE_FLAG_ACCURATE_V810, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5128 }, + { 3, CDGE_FORMAT_AUDIO, 66911 }, + { 4, CDGE_FORMAT_AUDIO, 68734 }, + { 5, CDGE_FORMAT_AUDIO, 73420 }, + { 6, CDGE_FORMAT_AUDIO, 78046 }, + { 7, CDGE_FORMAT_AUDIO, 83671 }, + { 8, CDGE_FORMAT_AUDIO, 103981 }, + { 9, CDGE_FORMAT_AUDIO, 123333 }, + { 10, CDGE_FORMAT_AUDIO, 139735 }, + { 11, CDGE_FORMAT_AUDIO, 143207 }, + { 12, CDGE_FORMAT_AUDIO, 145857 }, + { 13, CDGE_FORMAT_AUDIO, 158775 }, + { 14, CDGE_FORMAT_AUDIO, 177806 }, + { 15, CDGE_FORMAT_AUDIO, 194978 }, + { 16, CDGE_FORMAT_AUDIO, 195667 }, + { 17, CDGE_FORMAT_AUDIO, 197608 }, + { 18, CDGE_FORMAT_AUDIO, 198320 }, + { 19, CDGE_FORMAT_AUDIO, 203445 }, + { 20, CDGE_FORMAT_AUDIO, 221182 }, + { 21, CDGE_FORMAT_AUDIO, 237322 }, + { 22, CDGE_FORMAT_AUDIO, 256767 }, + { 23, CDGE_FORMAT_AUDIO, 257949 }, + { -1, -1, 274921 }, + } + } +}, + +{ + "Comic Road", + "こみっくろーど", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4232 }, + { 3, CDGE_FORMAT_DATA, 5258 }, + { -1, -1, 330932 }, + } + } +}, + +{ + "Cutey Honey FX", + "キューテイーハニー FX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { -1, -1, 283315 }, + } + } +}, + +{ + "Deep Blue Fleet", + "紺碧の艦隊", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2284 }, + { 3, CDGE_FORMAT_AUDIO, 183701 }, + { 4, CDGE_FORMAT_AUDIO, 184477 }, + { 5, CDGE_FORMAT_AUDIO, 191254 }, + { 6, CDGE_FORMAT_AUDIO, 197407 }, + { 7, CDGE_FORMAT_AUDIO, 206666 }, + { 8, CDGE_FORMAT_AUDIO, 211927 }, + { 9, CDGE_FORMAT_AUDIO, 217685 }, + { 10, CDGE_FORMAT_AUDIO, 225936 }, + { 11, CDGE_FORMAT_AUDIO, 229784 }, + { -1, -1, 230085 }, + } + } +}, + +{ + "Der Langrisser FX", + "デアラングリッサーFX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1971 }, + { 3, CDGE_FORMAT_AUDIO, 323127 }, + { -1, -1, 330256 }, + } + } +}, + +{ + "Doukyusei II", + "同級生2", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 4909 }, + { 4, CDGE_FORMAT_DATA, 5941 }, + { 5, CDGE_FORMAT_DATA, 42059 }, + { 6, CDGE_FORMAT_AUDIO, 220795 }, + { 7, CDGE_FORMAT_AUDIO, 225646 }, + { 8, CDGE_FORMAT_AUDIO, 235498 }, + { -1, -1, 246680 }, + } + } +}, + +{ + "Dragon Knight IV", + "ドラゴンナイト4", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 177212 }, + { 4, CDGE_FORMAT_AUDIO, 196193 }, + { -1, -1, 218037 }, + } + } +}, + +{ + "Farland Story FX", + "ファーランドストーリー", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 232538 }, + { 4, CDGE_FORMAT_AUDIO, 236403 }, + { 5, CDGE_FORMAT_AUDIO, 238396 }, + { -1, -1, 242433 }, + } + } +}, + +{ + "Fire Woman Matoi-gumi", + "ファイアーウーマン纏組", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5119 }, + { -1, -1, 257764 }, + } + } +}, + +{ + "First Kiss Monogatari", + "ファーストKiss物語", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1356 }, + { 3, CDGE_FORMAT_AUDIO, 318011 }, + { 4, CDGE_FORMAT_AUDIO, 324526 }, + { -1, -1, 325039 }, + } + } +}, + +{ + "Fushigi No Kuni No Angelique", + "ふしぎの国のアンジェリーク", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 4829 }, + { 4, CDGE_FORMAT_DATA, 5202 }, + { 5, CDGE_FORMAT_DATA, 7172 }, + { 6, CDGE_FORMAT_DATA, 53781 }, + { -1, -1, 142498 }, + } + } +}, + +{ + "Ginga Ojousama Densetsu Yuna FX", + "銀河お嬢様伝説ユナFX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2276 }, + { -1, -1, 301707 }, + } + } +}, + +{ + "Ginga Ojousama Densetsu Yuna FX Special Edition", + "銀河お嬢様伝説ユナFX Special Edition", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 52049 }, + { -1, -1, 61102 }, + } + } +}, + +{ + "Graduation REAL", + "卒業R Graduation Real", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 5165 }, + { -1, -1, 213907 }, + } + } +}, + +{ + "Kishin Douji Zenki FX", + "鬼神童子 ZENKI FX", + CDGE_FLAG_ACCURATE_V810, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 7171 }, + { 3, CDGE_FORMAT_AUDIO, 107872 }, + { 4, CDGE_FORMAT_AUDIO, 110438 }, + { 5, CDGE_FORMAT_AUDIO, 112940 }, + { 6, CDGE_FORMAT_AUDIO, 131362 }, + { 7, CDGE_FORMAT_AUDIO, 147425 }, + { 8, CDGE_FORMAT_AUDIO, 163839 }, + { 9, CDGE_FORMAT_AUDIO, 174752 }, + { 10, CDGE_FORMAT_AUDIO, 190392 }, + { 11, CDGE_FORMAT_AUDIO, 201880 }, + { 12, CDGE_FORMAT_AUDIO, 220717 }, + { 13, CDGE_FORMAT_AUDIO, 230587 }, + { 14, CDGE_FORMAT_AUDIO, 247515 }, + { 15, CDGE_FORMAT_AUDIO, 263803 }, + { 16, CDGE_FORMAT_AUDIO, 265987 }, + { 17, CDGE_FORMAT_AUDIO, 272735 }, + { 18, CDGE_FORMAT_AUDIO, 290382 }, + { 19, CDGE_FORMAT_AUDIO, 305690 }, + { 20, CDGE_FORMAT_AUDIO, 322430 }, + { -1, -1, 329141 }, + } + } +}, + +{ + "Kokuu Hyouryuu Nirgends", + "虚空漂流ニルゲンツ", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4492 }, + { -1, -1, 330162 }, + } + } +}, + + +{ + "Last Imperial Prince", + "ラストインペリアルプリンス", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 10187 }, + { 4, CDGE_FORMAT_AUDIO, 24124 }, + { 5, CDGE_FORMAT_AUDIO, 40686 }, + { 6, CDGE_FORMAT_AUDIO, 56583 }, + { 7, CDGE_FORMAT_AUDIO, 63025 }, + { 8, CDGE_FORMAT_AUDIO, 69646 }, + { 9, CDGE_FORMAT_AUDIO, 75144 }, + { 10, CDGE_FORMAT_AUDIO, 81208 }, + { 11, CDGE_FORMAT_AUDIO, 86132 }, + { 12, CDGE_FORMAT_AUDIO, 101745 }, + { 13, CDGE_FORMAT_AUDIO, 107871 }, + { 14, CDGE_FORMAT_AUDIO, 121487 }, + { 15, CDGE_FORMAT_AUDIO, 134835 }, + { 16, CDGE_FORMAT_AUDIO, 148385 }, + { 17, CDGE_FORMAT_AUDIO, 163372 }, + { 18, CDGE_FORMAT_AUDIO, 176996 }, + { 19, CDGE_FORMAT_AUDIO, 216456 }, + { 20, CDGE_FORMAT_AUDIO, 238672 }, + { 21, CDGE_FORMAT_AUDIO, 241036 }, + { 22, CDGE_FORMAT_AUDIO, 242389 }, + { 23, CDGE_FORMAT_DATA, 246767 }, + { 24, CDGE_FORMAT_DATA, 277470 }, + { -1, -1, 290164 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 10187 }, + { 4, CDGE_FORMAT_AUDIO, 24124 }, + { 5, CDGE_FORMAT_AUDIO, 40686 }, + { 6, CDGE_FORMAT_AUDIO, 56583 }, + { 7, CDGE_FORMAT_AUDIO, 63025 }, + { 8, CDGE_FORMAT_AUDIO, 69646 }, + { 9, CDGE_FORMAT_AUDIO, 75144 }, + { 10, CDGE_FORMAT_AUDIO, 81208 }, + { 11, CDGE_FORMAT_AUDIO, 86132 }, + { 12, CDGE_FORMAT_AUDIO, 100599 }, + { 13, CDGE_FORMAT_AUDIO, 114101 }, + { 14, CDGE_FORMAT_AUDIO, 128505 }, + { 15, CDGE_FORMAT_AUDIO, 142903 }, + { 16, CDGE_FORMAT_AUDIO, 156648 }, + { 17, CDGE_FORMAT_AUDIO, 170424 }, + { 18, CDGE_FORMAT_AUDIO, 188071 }, + { 19, CDGE_FORMAT_AUDIO, 230603 }, + { 20, CDGE_FORMAT_AUDIO, 254521 }, + { 21, CDGE_FORMAT_AUDIO, 259922 }, + { 22, CDGE_FORMAT_DATA, 262475 }, + { -1, -1, 318842 }, + } + } +}, + +{ + "Lunatic Dawn", + "ルナテイックドーンFX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 69072 }, + { 4, CDGE_FORMAT_AUDIO, 73053 }, + { 5, CDGE_FORMAT_AUDIO, 81372 }, + { 6, CDGE_FORMAT_AUDIO, 95658 }, + { 7, CDGE_FORMAT_AUDIO, 107310 }, + { 8, CDGE_FORMAT_AUDIO, 113597 }, + { 9, CDGE_FORMAT_AUDIO, 123146 }, + { 10, CDGE_FORMAT_AUDIO, 133358 }, + { 11, CDGE_FORMAT_AUDIO, 144357 }, + { 12, CDGE_FORMAT_AUDIO, 154059 }, + { 13, CDGE_FORMAT_AUDIO, 164189 }, + { 14, CDGE_FORMAT_AUDIO, 172197 }, + { 15, CDGE_FORMAT_AUDIO, 182157 }, + { 16, CDGE_FORMAT_AUDIO, 186336 }, + { 17, CDGE_FORMAT_AUDIO, 192222 }, + { 18, CDGE_FORMAT_AUDIO, 202203 }, + { 19, CDGE_FORMAT_AUDIO, 208274 }, + { 20, CDGE_FORMAT_AUDIO, 212338 }, + { 21, CDGE_FORMAT_AUDIO, 220499 }, + { 22, CDGE_FORMAT_AUDIO, 229850 }, + { 23, CDGE_FORMAT_AUDIO, 240178 }, + { 24, CDGE_FORMAT_AUDIO, 241376 }, + { 25, CDGE_FORMAT_AUDIO, 242050 }, + { 26, CDGE_FORMAT_AUDIO, 246855 }, + { 27, CDGE_FORMAT_AUDIO, 253026 }, + { 28, CDGE_FORMAT_AUDIO, 260509 }, + { 29, CDGE_FORMAT_AUDIO, 260844 }, + { 30, CDGE_FORMAT_AUDIO, 261554 }, + { 31, CDGE_FORMAT_AUDIO, 262591 }, + { -1, -1, 263219 }, + } + } +}, + +{ + "Mahjong Goku Tenjiku", + "麻雀悟空天竺", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 8376 }, + { 4, CDGE_FORMAT_AUDIO, 11607 }, + { 5, CDGE_FORMAT_AUDIO, 19873 }, + { 6, CDGE_FORMAT_AUDIO, 24171 }, + { 7, CDGE_FORMAT_AUDIO, 29994 }, + { 8, CDGE_FORMAT_AUDIO, 34978 }, + { 9, CDGE_FORMAT_AUDIO, 41359 }, + { 10, CDGE_FORMAT_AUDIO, 47803 }, + { 11, CDGE_FORMAT_AUDIO, 54204 }, + { 12, CDGE_FORMAT_AUDIO, 60619 }, + { 13, CDGE_FORMAT_AUDIO, 67006 }, + { 14, CDGE_FORMAT_AUDIO, 73397 }, + { 15, CDGE_FORMAT_AUDIO, 79790 }, + { 16, CDGE_FORMAT_AUDIO, 86179 }, + { 17, CDGE_FORMAT_AUDIO, 92574 }, + { 18, CDGE_FORMAT_AUDIO, 115478 }, + { 19, CDGE_FORMAT_AUDIO, 138537 }, + { 20, CDGE_FORMAT_AUDIO, 161434 }, + { 21, CDGE_FORMAT_AUDIO, 184314 }, + { 22, CDGE_FORMAT_AUDIO, 197815 }, + { 23, CDGE_FORMAT_AUDIO, 216216 }, + { 24, CDGE_FORMAT_AUDIO, 230140 }, + { 25, CDGE_FORMAT_AUDIO, 239554 }, + { 26, CDGE_FORMAT_AUDIO, 240045 }, + { 27, CDGE_FORMAT_AUDIO, 240661 }, + { 28, CDGE_FORMAT_AUDIO, 241040 }, + { 29, CDGE_FORMAT_AUDIO, 241632 }, + { 30, CDGE_FORMAT_AUDIO, 242579 }, + { 31, CDGE_FORMAT_AUDIO, 243054 }, + { 32, CDGE_FORMAT_AUDIO, 243354 }, + { 33, CDGE_FORMAT_AUDIO, 243796 }, + { 34, CDGE_FORMAT_AUDIO, 245294 }, + { 35, CDGE_FORMAT_AUDIO, 247298 }, + { 36, CDGE_FORMAT_AUDIO, 249208 }, + { 37, CDGE_FORMAT_AUDIO, 250388 }, + { 38, CDGE_FORMAT_AUDIO, 251862 }, + { 39, CDGE_FORMAT_AUDIO, 253227 }, + { 40, CDGE_FORMAT_AUDIO, 254796 }, + { 41, CDGE_FORMAT_AUDIO, 256032 }, + { -1, -1, 264625 }, + } + } +}, + +{ + "Makeruna! Makendou Z", + "負けるな!魔剣道Z", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 5165 }, + { 4, CDGE_FORMAT_DATA, 5677 }, + { 5, CDGE_FORMAT_DATA, 6477 }, + { 6, CDGE_FORMAT_DATA, 7645 }, + { 7, CDGE_FORMAT_DATA, 8157 }, + { 8, CDGE_FORMAT_DATA, 16349 }, + { 9, CDGE_FORMAT_DATA, 52294 }, + { 10, CDGE_FORMAT_AUDIO, 174749 }, + { 11, CDGE_FORMAT_DATA, 191888 }, + { -1, -1, 192401 }, + } + } +}, + +{ + "Megami Paradise II", + "女神天国II", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 3381 }, + { 3, CDGE_FORMAT_AUDIO, 296237 }, + { 4, CDGE_FORMAT_DATA, 306322 }, + { -1, -1, 306835 }, + } + } +}, + +{ + "Minimum Nanonic", + "みにまむなのにっく", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 208813 }, + { 4, CDGE_FORMAT_AUDIO, 227341 }, + { 5, CDGE_FORMAT_AUDIO, 245834 }, + { -1, -1, 250005 }, + } + } +}, + +{ + "Miraculum: The Last Revelation", + "ミラークルム ーサ・ラスト・レベレーションー", + 0, //CDGE_FLAG_ACCURATE_V810, // 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { -1, -1, 315726 }, + } + } +}, + +{ + "Nnyuu", + NULL, + CDGE_FLAG_FXGA, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 13517 }, + { 4, CDGE_FORMAT_AUDIO, 25819 }, + { 5, CDGE_FORMAT_AUDIO, 32862 }, + { 6, CDGE_FORMAT_AUDIO, 42340 }, + { 7, CDGE_FORMAT_AUDIO, 51288 }, + { 8, CDGE_FORMAT_AUDIO, 63538 }, + { 9, CDGE_FORMAT_AUDIO, 72521 }, + { 10, CDGE_FORMAT_AUDIO, 83392 }, + { -1, -1, 91836 }, + }, + { + { 1, CDGE_FORMAT_DATA, 0 }, + { -1, -1, 9495 }, + } + } +}, + +{ + "Ojousama Sousamou", + "お嬢様捜査網", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 9083 }, + { 3, CDGE_FORMAT_DATA, 10935 }, + { 4, CDGE_FORMAT_DATA, 12489 }, + { 5, CDGE_FORMAT_DATA, 13054 }, + { 6, CDGE_FORMAT_DATA, 38195 }, + { 7, CDGE_FORMAT_AUDIO, 120164 }, + { 8, CDGE_FORMAT_AUDIO, 127204 }, + { 9, CDGE_FORMAT_AUDIO, 134263 }, + { 10, CDGE_FORMAT_AUDIO, 134597 }, + { 11, CDGE_FORMAT_AUDIO, 136291 }, + { 12, CDGE_FORMAT_AUDIO, 137881 }, + { 13, CDGE_FORMAT_AUDIO, 143424 }, + { 14, CDGE_FORMAT_AUDIO, 150212 }, + { 15, CDGE_FORMAT_AUDIO, 156807 }, + { 16, CDGE_FORMAT_AUDIO, 163988 }, + { 17, CDGE_FORMAT_AUDIO, 170768 }, + { 18, CDGE_FORMAT_AUDIO, 177616 }, + { 19, CDGE_FORMAT_AUDIO, 183555 }, + { 20, CDGE_FORMAT_AUDIO, 185138 }, + { 21, CDGE_FORMAT_AUDIO, 185557 }, + { 22, CDGE_FORMAT_AUDIO, 187160 }, + { 23, CDGE_FORMAT_AUDIO, 187507 }, + { 24, CDGE_FORMAT_AUDIO, 188122 }, + { 25, CDGE_FORMAT_AUDIO, 196158 }, + { 26, CDGE_FORMAT_AUDIO, 204161 }, + { 27, CDGE_FORMAT_AUDIO, 206297 }, + { 28, CDGE_FORMAT_AUDIO, 224106 }, + { 29, CDGE_FORMAT_AUDIO, 227826 }, + { 30, CDGE_FORMAT_AUDIO, 235934 }, + { 31, CDGE_FORMAT_AUDIO, 237516 }, + { -1, -1, 244557 }, + } + } +}, + +{ + "Pachio-kun FX", + "パチ夫くんFX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 5037 }, + { 4, CDGE_FORMAT_DATA, 7830 }, + { 5, CDGE_FORMAT_DATA, 157279 }, + { 6, CDGE_FORMAT_DATA, 158364 }, + { 7, CDGE_FORMAT_DATA, 180499 }, + { 8, CDGE_FORMAT_AUDIO, 205401 }, + { 9, CDGE_FORMAT_AUDIO, 206401 }, + { 10, CDGE_FORMAT_AUDIO, 219890 }, + { 11, CDGE_FORMAT_AUDIO, 224061 }, + { 12, CDGE_FORMAT_AUDIO, 228389 }, + { 13, CDGE_FORMAT_AUDIO, 232550 }, + { 14, CDGE_FORMAT_AUDIO, 239291 }, + { -1, -1, 253825 }, + } + } +}, + +{ + "PCE Fan Special CD-Rom Vol. 2", + "PC Engine Fan Special CDROM Vol.2", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2938 }, + { 3, CDGE_FORMAT_DATA, 4778 }, + { 4, CDGE_FORMAT_DATA, 62548 }, + { 5, CDGE_FORMAT_DATA, 125244 }, + { 6, CDGE_FORMAT_AUDIO, 144311 }, + { 7, CDGE_FORMAT_AUDIO, 150877 }, + { 8, CDGE_FORMAT_AUDIO, 210027 }, + { 9, CDGE_FORMAT_AUDIO, 213928 }, + { 10, CDGE_FORMAT_AUDIO, 217629 }, + { 11, CDGE_FORMAT_AUDIO, 220644 }, + { 12, CDGE_FORMAT_AUDIO, 224512 }, + { 13, CDGE_FORMAT_AUDIO, 231187 }, + { 14, CDGE_FORMAT_AUDIO, 234309 }, + { 15, CDGE_FORMAT_AUDIO, 239072 }, + { -1, -1, 240786 }, + } + } +}, + +{ + "PCE Fan Special CD-Rom Vol. 3", + "PC Engine Fan Special CDROM Vol.3", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1831 }, + { 3, CDGE_FORMAT_DATA, 5239 }, + { 4, CDGE_FORMAT_DATA, 12377 }, + { 5, CDGE_FORMAT_AUDIO, 25381 }, + { 6, CDGE_FORMAT_AUDIO, 29358 }, + { 7, CDGE_FORMAT_AUDIO, 35924 }, + { 8, CDGE_FORMAT_AUDIO, 93272 }, + { 9, CDGE_FORMAT_DATA, 144485 }, + { -1, -1, 146604 }, + } + } +}, + +{ + "Pia Carrot He Youkoso", + "PIAキャロットへようこそ!!", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 6923 }, + { 3, CDGE_FORMAT_AUDIO, 294030 }, + { 4, CDGE_FORMAT_AUDIO, 300770 }, + { 5, CDGE_FORMAT_AUDIO, 307627 }, + { -1, -1, 314486 }, + } + } +}, + +{ + "Power Dolls FX", + "パワードールFX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 5165 }, + { 4, CDGE_FORMAT_DATA, 5507 }, + { 5, CDGE_FORMAT_DATA, 6279 }, + { 6, CDGE_FORMAT_DATA, 6647 }, + { 7, CDGE_FORMAT_DATA, 7079 }, + { 8, CDGE_FORMAT_DATA, 9480 }, + { 9, CDGE_FORMAT_DATA, 9854 }, + { 10, CDGE_FORMAT_DATA, 10366 }, + { 11, CDGE_FORMAT_DATA, 11184 }, + { 12, CDGE_FORMAT_DATA, 11952 }, + { 13, CDGE_FORMAT_DATA, 12499 }, + { 14, CDGE_FORMAT_AUDIO, 33090 }, + { 15, CDGE_FORMAT_AUDIO, 47464 }, + { 16, CDGE_FORMAT_DATA, 67672 }, + { 17, CDGE_FORMAT_DATA, 68440 }, + { 18, CDGE_FORMAT_DATA, 73582 }, + { 19, CDGE_FORMAT_AUDIO, 74650 }, + { 20, CDGE_FORMAT_AUDIO, 86120 }, + { 21, CDGE_FORMAT_AUDIO, 115719 }, + { 22, CDGE_FORMAT_AUDIO, 130093 }, + { 23, CDGE_FORMAT_AUDIO, 143954 }, + { 24, CDGE_FORMAT_AUDIO, 162477 }, + { 25, CDGE_FORMAT_AUDIO, 180206 }, + { 26, CDGE_FORMAT_AUDIO, 192167 }, + { 27, CDGE_FORMAT_AUDIO, 208417 }, + { 28, CDGE_FORMAT_AUDIO, 218607 }, + { 29, CDGE_FORMAT_AUDIO, 238590 }, + { 30, CDGE_FORMAT_AUDIO, 258179 }, + { -1, -1, 258734 }, + } + } +}, + +{ + "Return to Zork", + "Return to Zork", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { -1, -1, 166265 }, + } + } +}, + +{ + "Ruruli Ra Rura", + "ルルリ・ラ・ルラ", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 3230 }, + { 3, CDGE_FORMAT_AUDIO, 158649 }, + { 4, CDGE_FORMAT_AUDIO, 169395 }, + { 5, CDGE_FORMAT_AUDIO, 184829 }, + { 6, CDGE_FORMAT_AUDIO, 197368 }, + { 7, CDGE_FORMAT_AUDIO, 210123 }, + { 8, CDGE_FORMAT_AUDIO, 223314 }, + { 9, CDGE_FORMAT_AUDIO, 237257 }, + { 10, CDGE_FORMAT_AUDIO, 251315 }, + { 11, CDGE_FORMAT_AUDIO, 266763 }, + { 12, CDGE_FORMAT_AUDIO, 281719 }, + { 13, CDGE_FORMAT_AUDIO, 295240 }, + { 14, CDGE_FORMAT_AUDIO, 295721 }, + { 15, CDGE_FORMAT_AUDIO, 296390 }, + { 16, CDGE_FORMAT_AUDIO, 297080 }, + { 17, CDGE_FORMAT_AUDIO, 297655 }, + { 18, CDGE_FORMAT_AUDIO, 298209 }, + { 19, CDGE_FORMAT_AUDIO, 301612 }, + { 20, CDGE_FORMAT_AUDIO, 303020 }, + { 21, CDGE_FORMAT_AUDIO, 303964 }, + { -1, -1, 322241 }, + } + } +}, + +{ + "Same Game FX", + NULL, + CDGE_FLAG_FXGA, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 3270 }, + { -1, -1, 3859 }, + } + } +}, + +{ + "Shanghai: The Great Wall", + "上海 万里の長城", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 9611 }, + { 4, CDGE_FORMAT_AUDIO, 15872 }, + { 5, CDGE_FORMAT_AUDIO, 21570 }, + { 6, CDGE_FORMAT_AUDIO, 27001 }, + { 7, CDGE_FORMAT_AUDIO, 32506 }, + { 8, CDGE_FORMAT_AUDIO, 38675 }, + { 9, CDGE_FORMAT_AUDIO, 44503 }, + { 10, CDGE_FORMAT_AUDIO, 49867 }, + { 11, CDGE_FORMAT_AUDIO, 55328 }, + { 12, CDGE_FORMAT_AUDIO, 61187 }, + { 13, CDGE_FORMAT_AUDIO, 66669 }, + { 14, CDGE_FORMAT_AUDIO, 72147 }, + { 15, CDGE_FORMAT_AUDIO, 77654 }, + { 16, CDGE_FORMAT_AUDIO, 83325 }, + { 17, CDGE_FORMAT_AUDIO, 89000 }, + { 18, CDGE_FORMAT_AUDIO, 94305 }, + { 19, CDGE_FORMAT_AUDIO, 97879 }, + { 20, CDGE_FORMAT_AUDIO, 103439 }, + { 21, CDGE_FORMAT_AUDIO, 108929 }, + { 22, CDGE_FORMAT_AUDIO, 114689 }, + { 23, CDGE_FORMAT_AUDIO, 115109 }, + { 24, CDGE_FORMAT_AUDIO, 115553 }, + { 25, CDGE_FORMAT_AUDIO, 117222 }, + { 26, CDGE_FORMAT_AUDIO, 117672 }, + { 27, CDGE_FORMAT_AUDIO, 122812 }, + { 28, CDGE_FORMAT_AUDIO, 123948 }, + { 29, CDGE_FORMAT_AUDIO, 124631 }, + { -1, -1, 130162 }, + } + } +}, + +{ + "Neo Generation II FX", + "卒業II FX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 13481 }, + { 3, CDGE_FORMAT_AUDIO, 209349 }, + { 4, CDGE_FORMAT_AUDIO, 215587 }, + { 5, CDGE_FORMAT_AUDIO, 227412 }, + { 6, CDGE_FORMAT_AUDIO, 239413 }, + { 7, CDGE_FORMAT_AUDIO, 243045 }, + { -1, -1, 243387 }, + } + } +}, + +{ + "Sparkling Feather", + "スパークリングフェザー", + CDGE_FLAG_ACCURATE_V810, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1661 }, + { 3, CDGE_FORMAT_DATA, 182640 }, + { 4, CDGE_FORMAT_DATA, 183177 }, + { 5, CDGE_FORMAT_DATA, 183670 }, + { 6, CDGE_FORMAT_DATA, 184717 }, + { 7, CDGE_FORMAT_DATA, 185671 }, + { 8, CDGE_FORMAT_DATA, 187043 }, + { 9, CDGE_FORMAT_DATA, 187983 }, + { 10, CDGE_FORMAT_DATA, 188881 }, + { 11, CDGE_FORMAT_DATA, 189642 }, + { 12, CDGE_FORMAT_DATA, 194036 }, + { 13, CDGE_FORMAT_DATA, 195380 }, + { 14, CDGE_FORMAT_DATA, 196675 }, + { 15, CDGE_FORMAT_DATA, 197976 }, + { 16, CDGE_FORMAT_DATA, 199266 }, + { 17, CDGE_FORMAT_DATA, 200580 }, + { 18, CDGE_FORMAT_DATA, 201926 }, + { 19, CDGE_FORMAT_DATA, 203260 }, + { 20, CDGE_FORMAT_DATA, 204619 }, + { 21, CDGE_FORMAT_DATA, 206050 }, + { 22, CDGE_FORMAT_DATA, 209018 }, + { 23, CDGE_FORMAT_DATA, 211978 }, + { 24, CDGE_FORMAT_DATA, 214198 }, + { 25, CDGE_FORMAT_DATA, 215837 }, + { 26, CDGE_FORMAT_DATA, 217272 }, + { -1, -1, 218870 }, + } + } +}, + +{ + "Super PCE Fan Deluxe Special CD-Rom Vol. 1", + "SUPER PCエンジンファン DELUXE VOL.1", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 52049 }, + { 4, CDGE_FORMAT_DATA, 61101 }, + { 5, CDGE_FORMAT_DATA, 62381 }, + { 6, CDGE_FORMAT_DATA, 156844 }, + { 7, CDGE_FORMAT_DATA, 228449 }, + { 8, CDGE_FORMAT_DATA, 249299 }, + { 9, CDGE_FORMAT_DATA, 254167 }, + { 10, CDGE_FORMAT_DATA, 266033 }, + { 11, CDGE_FORMAT_DATA, 276018 }, + { 12, CDGE_FORMAT_DATA, 282558 }, + { 13, CDGE_FORMAT_AUDIO, 299212 }, + { -1, -1, 305779 }, + } + } +}, + +{ + "Super PCE Fan Deluxe Special CD-Rom Vol. 2", + "SUPER PCエンジンファン DELUXE VOL.2", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 10251 }, + { 4, CDGE_FORMAT_DATA, 26494 }, + { 5, CDGE_FORMAT_DATA, 51756 }, + { 6, CDGE_FORMAT_DATA, 57179 }, + { 7, CDGE_FORMAT_DATA, 68238 }, + { 8, CDGE_FORMAT_DATA, 76683 }, + { 9, CDGE_FORMAT_DATA, 82991 }, + { 10, CDGE_FORMAT_DATA, 89072 }, + { 11, CDGE_FORMAT_DATA, 96938 }, + { 12, CDGE_FORMAT_DATA, 104587 }, + { 13, CDGE_FORMAT_DATA, 115120 }, + { 14, CDGE_FORMAT_DATA, 137766 }, + { 15, CDGE_FORMAT_DATA, 169372 }, + { 16, CDGE_FORMAT_DATA, 191451 }, + { 17, CDGE_FORMAT_AUDIO, 193018 }, + { 18, CDGE_FORMAT_AUDIO, 206955 }, + { 19, CDGE_FORMAT_AUDIO, 223517 }, + { 20, CDGE_FORMAT_AUDIO, 229959 }, + { 21, CDGE_FORMAT_AUDIO, 236580 }, + { 22, CDGE_FORMAT_AUDIO, 242078 }, + { 23, CDGE_FORMAT_AUDIO, 247002 }, + { 24, CDGE_FORMAT_DATA, 260851 }, + { 25, CDGE_FORMAT_DATA, 273544 }, + { 26, CDGE_FORMAT_AUDIO, 304547 }, + { -1, -1, 311114 }, + } + } +}, + +{ + "Super Power League FX", + "スーパーパワーリーグFX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 3590 }, + { 3, CDGE_FORMAT_DATA, 4344 }, + { 4, CDGE_FORMAT_AUDIO, 14637 }, + { 5, CDGE_FORMAT_DATA, 102512 }, + { -1, -1, 166532 }, + } + } +}, + +{ + "Super Real Mahjong P V FX", + "スーパーリアル麻雀P5", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2590 }, + { 3, CDGE_FORMAT_DATA, 2976 }, + { 4, CDGE_FORMAT_DATA, 3350 }, + { 5, CDGE_FORMAT_DATA, 89885 }, + { 6, CDGE_FORMAT_DATA, 90695 }, + { 7, CDGE_FORMAT_AUDIO, 94331 }, + { 8, CDGE_FORMAT_AUDIO, 105090 }, + { 9, CDGE_FORMAT_AUDIO, 114148 }, + { 10, CDGE_FORMAT_AUDIO, 125335 }, + { 11, CDGE_FORMAT_AUDIO, 136932 }, + { 12, CDGE_FORMAT_AUDIO, 147480 }, + { 13, CDGE_FORMAT_AUDIO, 160406 }, + { 14, CDGE_FORMAT_AUDIO, 171875 }, + { 15, CDGE_FORMAT_AUDIO, 178636 }, + { 16, CDGE_FORMAT_AUDIO, 180766 }, + { -1, -1, 183547 }, + } + } +}, + + +{ + "Team Innocent", + "チームイノセント The point of no return", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 218041 }, + { 4, CDGE_FORMAT_AUDIO, 241208 }, + { 5, CDGE_FORMAT_AUDIO, 247705 }, + { 6, CDGE_FORMAT_AUDIO, 254586 }, + { 7, CDGE_FORMAT_AUDIO, 260797 }, + { 8, CDGE_FORMAT_AUDIO, 267971 }, + { 9, CDGE_FORMAT_AUDIO, 275080 }, + { 10, CDGE_FORMAT_AUDIO, 285655 }, + { 11, CDGE_FORMAT_AUDIO, 289111 }, + { 12, CDGE_FORMAT_AUDIO, 300772 }, + { 13, CDGE_FORMAT_AUDIO, 305057 }, + { 14, CDGE_FORMAT_AUDIO, 317734 }, + { -1, -1, 324695 }, + } + } +}, + +{ + "Tekipaki Working Love", + "はたらく☆少女 てきぱきワーキンラブ FX", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 2474 }, + { 3, CDGE_FORMAT_DATA, 3500 }, + { 4, CDGE_FORMAT_AUDIO, 181612 }, + { 5, CDGE_FORMAT_AUDIO, 194776 }, + { -1, -1, 211869 }, + }, + } +}, + +{ + "Tenchi Muyo FX", + "天地無用! 魎皇鬼 FX", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4135 }, + { -1, -1, 301916 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4621 }, + { -1, -1, 74055 }, + } + } +}, + +{ + "Tengai Makyou Karakuri Kakutouden", + "天外魔境電脳結繰格闘伝", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 9515 }, + { 4, CDGE_FORMAT_DATA, 27125 }, + { 5, CDGE_FORMAT_DATA, 49259 }, + { 6, CDGE_FORMAT_DATA, 74712 }, + { 7, CDGE_FORMAT_DATA, 101125 }, + { 8, CDGE_FORMAT_DATA, 129079 }, + { 9, CDGE_FORMAT_DATA, 156743 }, + { 10, CDGE_FORMAT_DATA, 192741 }, + { 11, CDGE_FORMAT_DATA, 215240 }, + { 12, CDGE_FORMAT_DATA, 240217 }, + { 13, CDGE_FORMAT_DATA, 260898 }, + { -1, -1, 279663 }, + } + } +}, + +{ + "Tokimeki Card Paradise", + "ときめきカードパラダイス", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_AUDIO, 9731 }, + { 4, CDGE_FORMAT_AUDIO, 10223 }, + { 5, CDGE_FORMAT_AUDIO, 10676 }, + { 6, CDGE_FORMAT_AUDIO, 11182 }, + { 7, CDGE_FORMAT_AUDIO, 11813 }, + { 8, CDGE_FORMAT_AUDIO, 12472 }, + { 9, CDGE_FORMAT_AUDIO, 18522 }, + { 10, CDGE_FORMAT_AUDIO, 31943 }, + { 11, CDGE_FORMAT_AUDIO, 45364 }, + { 12, CDGE_FORMAT_AUDIO, 58258 }, + { 13, CDGE_FORMAT_AUDIO, 69409 }, + { 14, CDGE_FORMAT_AUDIO, 80560 }, + { 15, CDGE_FORMAT_AUDIO, 91711 }, + { 16, CDGE_FORMAT_AUDIO, 95691 }, + { 17, CDGE_FORMAT_DATA, 99896 }, + { 18, CDGE_FORMAT_DATA, 105396 }, + { 19, CDGE_FORMAT_DATA, 106280 }, + { 20, CDGE_FORMAT_DATA, 107391 }, + { 21, CDGE_FORMAT_DATA, 108375 }, + { 22, CDGE_FORMAT_DATA, 109360 }, + { 23, CDGE_FORMAT_DATA, 110659 }, + { 24, CDGE_FORMAT_DATA, 111616 }, + { 25, CDGE_FORMAT_DATA, 113281 }, + { 26, CDGE_FORMAT_DATA, 113745 }, + { 27, CDGE_FORMAT_DATA, 115386 }, + { 28, CDGE_FORMAT_DATA, 119952 }, + { 29, CDGE_FORMAT_DATA, 121377 }, + { 30, CDGE_FORMAT_DATA, 123944 }, + { 31, CDGE_FORMAT_DATA, 125477 }, + { 32, CDGE_FORMAT_DATA, 126472 }, + { 33, CDGE_FORMAT_DATA, 127545 }, + { 34, CDGE_FORMAT_DATA, 128993 }, + { 35, CDGE_FORMAT_DATA, 130345 }, + { 36, CDGE_FORMAT_DATA, 132774 }, + { 37, CDGE_FORMAT_DATA, 133299 }, + { 38, CDGE_FORMAT_DATA, 134847 }, + { 39, CDGE_FORMAT_DATA, 139225 }, + { 40, CDGE_FORMAT_DATA, 142224 }, + { 41, CDGE_FORMAT_DATA, 143967 }, + { 42, CDGE_FORMAT_DATA, 145100 }, + { 43, CDGE_FORMAT_DATA, 146002 }, + { 44, CDGE_FORMAT_DATA, 147556 }, + { 45, CDGE_FORMAT_DATA, 148650 }, + { 46, CDGE_FORMAT_DATA, 150461 }, + { 47, CDGE_FORMAT_DATA, 151891 }, + { 48, CDGE_FORMAT_DATA, 152514 }, + { 49, CDGE_FORMAT_DATA, 153988 }, + { 50, CDGE_FORMAT_DATA, 157541 }, + { 51, CDGE_FORMAT_DATA, 158440 }, + { 52, CDGE_FORMAT_DATA, 161036 }, + { 53, CDGE_FORMAT_DATA, 162032 }, + { 54, CDGE_FORMAT_DATA, 162793 }, + { 55, CDGE_FORMAT_DATA, 164308 }, + { 56, CDGE_FORMAT_DATA, 165420 }, + { 57, CDGE_FORMAT_DATA, 167152 }, + { 58, CDGE_FORMAT_DATA, 168284 }, + { 59, CDGE_FORMAT_DATA, 169303 }, + { 60, CDGE_FORMAT_DATA, 169718 }, + { 61, CDGE_FORMAT_DATA, 173432 }, + { 62, CDGE_FORMAT_DATA, 177351 }, + { 63, CDGE_FORMAT_DATA, 178477 }, + { 64, CDGE_FORMAT_DATA, 179599 }, + { 65, CDGE_FORMAT_DATA, 180174 }, + { 66, CDGE_FORMAT_DATA, 181222 }, + { 67, CDGE_FORMAT_DATA, 182108 }, + { 68, CDGE_FORMAT_DATA, 182838 }, + { 69, CDGE_FORMAT_DATA, 183745 }, + { 70, CDGE_FORMAT_DATA, 184759 }, + { 71, CDGE_FORMAT_DATA, 185526 }, + { -1, -1, 186254 }, + } + } +}, + +{ + "Tonari no Princess Rolfee", + "となりのプリンセス ロルフィー", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1431 }, + { -1, -1, 330127 }, + } + } +}, + +{ + "Tyoushin Heiki Zeroigar", + "超神兵器セロイガー", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 1982 }, + { 3, CDGE_FORMAT_AUDIO, 180819 }, + { 4, CDGE_FORMAT_AUDIO, 193570 }, + { 5, CDGE_FORMAT_AUDIO, 213671 }, + { -1, -1, 269144 }, + } + } +}, + + +{ + "Voice Paradise", + "ボイスパラダイス", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 5165 }, + { 4, CDGE_FORMAT_DATA, 19592 }, + { 5, CDGE_FORMAT_AUDIO, 149410 }, + { 6, CDGE_FORMAT_AUDIO, 159592 }, + { 7, CDGE_FORMAT_AUDIO, 164141 }, + { 8, CDGE_FORMAT_AUDIO, 180174 }, + { 9, CDGE_FORMAT_AUDIO, 195993 }, + { 10, CDGE_FORMAT_AUDIO, 212538 }, + { 11, CDGE_FORMAT_AUDIO, 217086 }, + { 12, CDGE_FORMAT_AUDIO, 232175 }, + { 13, CDGE_FORMAT_AUDIO, 253002 }, + { 14, CDGE_FORMAT_AUDIO, 268287 }, + { 15, CDGE_FORMAT_AUDIO, 283159 }, + { 16, CDGE_FORMAT_AUDIO, 284331 }, + { 17, CDGE_FORMAT_AUDIO, 285878 }, + { 18, CDGE_FORMAT_AUDIO, 300515 }, + { -1, -1, 300890 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { 3, CDGE_FORMAT_DATA, 5165 }, + { 4, CDGE_FORMAT_DATA, 19592 }, + { 5, CDGE_FORMAT_AUDIO, 153285 }, + { 6, CDGE_FORMAT_AUDIO, 163467 }, + { 7, CDGE_FORMAT_AUDIO, 168016 }, + { 8, CDGE_FORMAT_AUDIO, 184049 }, + { 9, CDGE_FORMAT_AUDIO, 199868 }, + { 10, CDGE_FORMAT_AUDIO, 216413 }, + { 11, CDGE_FORMAT_AUDIO, 220961 }, + { 12, CDGE_FORMAT_AUDIO, 236050 }, + { 13, CDGE_FORMAT_AUDIO, 256877 }, + { 14, CDGE_FORMAT_AUDIO, 272162 }, + { 15, CDGE_FORMAT_AUDIO, 287034 }, + { 16, CDGE_FORMAT_AUDIO, 288206 }, + { 17, CDGE_FORMAT_AUDIO, 289753 }, + { 18, CDGE_FORMAT_AUDIO, 304390 }, + { -1, -1, 304765 }, + } + } +}, + +{ + "Wakusei-koukitai Little Cats", + "惑星攻機隊りとるキャッツ", + 0, + 1, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 5163 }, + { 3, CDGE_FORMAT_DATA, 5933 }, + { 4, CDGE_FORMAT_DATA, 95878 }, + { 5, CDGE_FORMAT_AUDIO, 209401 }, + { 6, CDGE_FORMAT_AUDIO, 213777 }, + { 7, CDGE_FORMAT_AUDIO, 219527 }, + { 8, CDGE_FORMAT_AUDIO, 225871 }, + { 9, CDGE_FORMAT_AUDIO, 232693 }, + { 10, CDGE_FORMAT_AUDIO, 242452 }, + { 11, CDGE_FORMAT_AUDIO, 248960 }, + { 12, CDGE_FORMAT_AUDIO, 255249 }, + { 13, CDGE_FORMAT_AUDIO, 265891 }, + { 14, CDGE_FORMAT_AUDIO, 268646 }, + { 15, CDGE_FORMAT_AUDIO, 282287 }, + { 16, CDGE_FORMAT_AUDIO, 282743 }, + { -1, -1, 283044 }, + } + } +}, + +{ + "Zoku Hakutoi Monogatari", + "続初恋物語", + 0, + 2, + { + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { -1, -1, 332106 }, + }, + { + { 1, CDGE_FORMAT_AUDIO, 0 }, + { 2, CDGE_FORMAT_DATA, 4395 }, + { -1, -1, 333025 }, + } + } +}, + diff --git a/Mednafen/mednafen/pcfx/huc6273.cpp b/Mednafen/mednafen/pcfx/huc6273.cpp new file mode 100644 index 0000000000..1ff3ea488b --- /dev/null +++ b/Mednafen/mednafen/pcfx/huc6273.cpp @@ -0,0 +1,252 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Emulation for HuC6273, FXGA 3D chip */ +/* Definitions: + CMT = Command Macro Table +*/ + +enum +{ + OP_NOP = 0x00, + OP_TRIANGLE_STRIP = 0x01, + OP_TRIANGLE_LIST = 0x02, + OP_POLY_LINE = 0x03, + OP_LINE_LIST = 0x04, + OP_RESERVED0 = 0x05, + OP_PUT_IMAGE = 0x06, + OP_READ_PIXEL = 0x07, + OP_WRITE_TE_REGISTERS = 0x08, + OP_WRITE_PE_REGISTERS = 0x09, + OP_MISC = 0x0A, + OP_RESERVED1 = 0x0B, + OP_READ_TE_REGISTERS = 0x0C, + OP_READ_PE_REGISTERS = 0x0D, + OP_WRITE_LUT = 0x0E, + OP_READ_LUT = 0x0F, +}; + +#include "pcfx.h" +#include "huc6273.h" + +enum +{ + INT_RHIT = 15, // Raster Hit + INT_HBL = 14, // H blank + INT_VBL = 13, // V blank + INT_HSY = 12, // H sync + INT_VSY = 11, // V sync + INT_RBDONE = 10, // Read back done + INT_TESYNC = 9, // TE Sync + INT_SPDONE = 8, // Sprite done + INT_CMDONE = 7, // Command macro done + INT_PESYNC = 6, // PE sync + INT_AEMP = 5, // Almost empty + INT_CSE = 4, // Command sync error + INT_AFL = 3, // Almost full + INT_OVF = 2, // Overflow + INT_FSY = 1, // Frame sync +}; + +static uint16 FIFO[0x20]; +static uint8 InFIFO; +#define AFW (0x20 - InFIFO) + +#define AEMPWD ((FIFOControl >> 4) & 0xFF) +#define AFLWD (FIFOControl & 0xF) +static uint16 FIFOControl; // 0x00004 + +static uint8 CMTBankSelect; +static uint16 CMTStartAddress; +static uint16 CMTByteCount; + +static uint16 InterruptMask; +static uint16 InterruptStatus; + +static uint16 ReadBack; + +static uint16 HorizontalTiming, VerticalTiming; + +static uint16 SCTAddressHi; +static uint16 SpriteControl; +static uint16 CDResult[2]; +static uint16 SPWindowX[2]; // left and right +static uint16 SPWindowY[2]; // top and bottom +static uint16 MiscStatus; +static uint16 ErrorStatus; // Read only! +static uint16 DisplayControl; +static uint16 StatusControl; +static uint16 Config; + +static uint16 RasterHit; + + +static uint16 Results[0x10]; + +static void CheckIRQ(void) +{ + //uint16 MaskedResults = InterruptStatus & InterruptMask; + + + +} + + +static void ProcessFIFO(void) +{ + uint8 length = FIFO[0] & 0xFF; + + if(length > 0x20) + { + length = 0x20; + puts("Length too long"); + } + + if(InFIFO >= length) + { + int opcode = FIFO[0] >> 12; + int option = (FIFO[0] >> 8) & 0x0F; + + printf("Op: %02x, option: %02x\n", opcode, option); + + InFIFO -= length; + for(int i = 0; i < InFIFO; i++) + FIFO[i] = FIFO[length + i]; + } +} + + +static void StoreInFIFO(uint16 V) +{ + if(AFW > 0) + { + FIFO[InFIFO] = V; + InFIFO++; + + ProcessFIFO(); + } +} + +uint8 HuC6273_Read8(uint32 A) +{ + puts("73 Read8"); + return(0); +} + +uint16 HuC6273_Read16(uint32 A) +{ + A &= 0xfffff; + + printf("HuC6273 Read: %04x\n", A); + + switch(A) + { + case 0x00000: + case 0x00002: return(AFW); // Command FIFO status + + case 0x00004: return(FIFOControl); + case 0x00006: return(CMTBankSelect); + case 0x00008: return(CMTStartAddress); + case 0x0000A: return(CMTByteCount); + case 0x0000C: return(InterruptMask); + case 0x0000E: return(0); + case 0x00010: return(InterruptStatus); + case 0x00012: return(ReadBack); + case 0x00014: return(HorizontalTiming); + case 0x00016: return(VerticalTiming); + case 0x00018: return(SCTAddressHi); + case 0x0001A: return(SpriteControl); + case 0x0001C: return(CDResult[0]); + case 0x0001E: return(CDResult[1]); + case 0x00020: return(SPWindowX[0]); + case 0x00022: return(SPWindowY[0]); + case 0x00024: return(SPWindowX[1]); + case 0x00026: return(SPWindowY[1]); + case 0x00028: return(MiscStatus); + case 0x0002A: return(ErrorStatus); + case 0x0002C: return(DisplayControl); + case 0x0002E: return(Config); + } + if(A >= 0x00060 && A <= 0x0007E) + { + return(Results[(A >> 1) & 0xF]); + } + return(0); +} + + +void HuC6273_Write16(uint32 A, uint16 V) +{ + A &= 0xfffff; + + printf("HuC6273 Write: %04x:%04x\n", A, V); + + switch(A) + { + case 0x00000: + case 0x00002: StoreInFIFO(V); break; + + case 0x00004: FIFOControl = V; break; + case 0x00006: CMTBankSelect = V & 0x1F; break; + case 0x00008: CMTStartAddress = V & 0xFFFE; break; + case 0x0000A: CMTByteCount = V & 0xFFFE; break; + case 0x0000C: InterruptMask = V; + CheckIRQ(); + break; + case 0x0000E: // Interrupt Clear + CheckIRQ(); + break; + case 0x00010: InterruptStatus = V; + CheckIRQ(); + break; + case 0x00012: ReadBack = V; break; + case 0x00014: HorizontalTiming = V; break; + case 0x00016: VerticalTiming = V; break; + case 0x00018: SCTAddressHi = V; break; + case 0x0001A: SpriteControl = V; break; + case 0x0001C: CDResult[0] = V; break; + case 0x0001E: CDResult[1] = V; break; + case 0x00020: SPWindowX[0] = V; break; // X Left + case 0x00022: SPWindowY[0] = V; break; // Y Top + case 0x00024: SPWindowX[1] = V; break; // X Right + case 0x00026: SPWindowY[1] = V; break; // Y Bottom + case 0x00028: MiscStatus = V; break; + case 0x0002C: DisplayControl = V; break; + case 0x0002E: StatusControl = V; break; + + case 0x0003C: RasterHit = V; break; + } +} + +void HuC6273_Write8(uint32 A, uint8 V) +{ + puts("73 Write8"); +} + +void HuC6273_Reset(void) +{ + InFIFO = 0; + FIFOControl = 0x5 | (0x20 << 4); +} + + + +bool HuC6273_Init(void) +{ + + return(TRUE); +} diff --git a/Mednafen/mednafen/pcfx/huc6273.h b/Mednafen/mednafen/pcfx/huc6273.h new file mode 100644 index 0000000000..d29e8c825c --- /dev/null +++ b/Mednafen/mednafen/pcfx/huc6273.h @@ -0,0 +1,13 @@ +#ifndef __PCFX_HUC6273_H +#define __PCFX_HUC6273_H + +bool HuC6273_Init(void); + +uint8 HuC6273_Read8(uint32 A); +uint16 HuC6273_Read16(uint32 A); +void HuC6273_Write16(uint32 A, uint16 V); +void HuC6273_Write8(uint32 A, uint8 V); +void HuC6273_Reset(void); + + +#endif diff --git a/Mednafen/mednafen/pcfx/input.cpp b/Mednafen/mednafen/pcfx/input.cpp new file mode 100644 index 0000000000..77b4930797 --- /dev/null +++ b/Mednafen/mednafen/pcfx/input.cpp @@ -0,0 +1,441 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcfx.h" +#include "interrupt.h" +#include "input.h" + +#include "input/gamepad.h" +#include "input/mouse.h" + +#include + +#define PCFX_PORTS 2 +#define TOTAL_PORTS 8 + +#define TAP_PORTS 4 + +static const int TapMap[2][TAP_PORTS] = +{ + { 0, 2, 3, 4 }, + { 1, 5, 6, 7 }, +}; + + +static void RemakeDevices(int which = -1); +static uint8 MultiTapEnabled; +static bool DisableSR; + +// Mednafen-specific input type numerics +enum +{ + FXIT_NONE = 0, + FXIT_GAMEPAD = 1, + FXIT_MOUSE = 2, +}; + +PCFX_Input_Device::~PCFX_Input_Device() +{ + +} + +uint32 PCFX_Input_Device::ReadTransferTime(void) +{ + return(1536); +} + +uint32 PCFX_Input_Device::WriteTransferTime(void) +{ + return(1536); +} + +uint32 PCFX_Input_Device::Read(void) +{ + return(0); +} + +void PCFX_Input_Device::Write(uint32 data) +{ + + +} + +void PCFX_Input_Device::Power(void) +{ + +} + +void PCFX_Input_Device::TransformInput(uint8* data, const bool DisableSR_L) +{ + + +} + +void PCFX_Input_Device::Frame(const void *data) +{ + +} + +void PCFX_Input_Device::StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_name) +{ +} + +static PCFX_Input_Device *devices[TOTAL_PORTS] = { NULL }; + + +// D0 = TRG, trigger bit +// D1 = MOD, multi-tap clear mode? +// D2 = IOS, data direction. 0 = output, 1 = input + +static uint8 TapCounter[PCFX_PORTS]; +static uint8 control[PCFX_PORTS]; +static bool latched[PCFX_PORTS]; +static int32 LatchPending[PCFX_PORTS]; + +static int InputTypes[TOTAL_PORTS]; +static void *data_ptr[TOTAL_PORTS]; +static uint32 data_latch[TOTAL_PORTS]; + +static void SyncSettings(void); + +void FXINPUT_Init(void) +{ + SyncSettings(); + RemakeDevices(); +} + +void FXINPUT_SettingChanged(const char *name) +{ + SyncSettings(); +} + + +#ifdef WANT_DEBUGGER +uint32 FXINPUT_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case FXINPUT_GSREG_KPCTRL0: + case FXINPUT_GSREG_KPCTRL1: + value = control[id == FXINPUT_GSREG_KPCTRL1]; + if(special) + { + trio_snprintf(special, special_len, "Trigger: %d, MOD: %d, IOS: %s", value & 0x1, value & 0x2, (value & 0x4) ? "Input" : "Output"); + } + break; + } + + return value; +} + +void FXINPUT_SetRegister(const unsigned int id, uint32 value) +{ + + +} + +#endif + +static INLINE int32 min(int32 a, int32 b, int32 c) +{ + int32 ret = a; + + if(b < ret) + ret = b; + if(c < ret) + ret = c; + + return(ret); +} + +static INLINE int32 CalcNextEventTS(const v810_timestamp_t timestamp) +{ + return(min(LatchPending[0] > 0 ? (timestamp + LatchPending[0]) : PCFX_EVENT_NONONO, LatchPending[1] > 0 ? (timestamp + LatchPending[1]) : PCFX_EVENT_NONONO, PCFX_EVENT_NONONO)); +} + +static void RemakeDevices(int which) +{ + int s = 0; + int e = TOTAL_PORTS; + + if(which != -1) + { + s = which; + e = which + 1; + } + + for(int i = s; i < e; i++) + { + if(devices[i]) + delete devices[i]; + devices[i] = NULL; + + switch(InputTypes[i]) + { + default: + case FXIT_NONE: devices[i] = new PCFX_Input_Device(); break; + case FXIT_GAMEPAD: devices[i] = PCFXINPUT_MakeGamepad(); break; + case FXIT_MOUSE: devices[i] = PCFXINPUT_MakeMouse(i); break; + } + } +} + +void FXINPUT_SetInput(unsigned port, const char *type, uint8 *ptr) +{ + data_ptr[port] = ptr; + + if(!strcasecmp(type, "mouse")) + { + InputTypes[port] = FXIT_MOUSE; + } + else if(!strcasecmp(type, "gamepad")) + InputTypes[port] = FXIT_GAMEPAD; + else + InputTypes[port] = FXIT_NONE; + RemakeDevices(port); +} + +uint8 FXINPUT_Read8(uint32 A, const v810_timestamp_t timestamp) +{ + //printf("Read8: %04x\n", A); + + return(FXINPUT_Read16(A &~1, timestamp) >> ((A & 1) * 8)); +} + +uint16 FXINPUT_Read16(uint32 A, const v810_timestamp_t timestamp) +{ + FXINPUT_Update(timestamp); + + uint16 ret = 0; + + A &= 0xC2; + + //printf("Read: %04x\n", A); + + if(A == 0x00 || A == 0x80) + { + int w = (A & 0x80) >> 7; + + if(latched[w]) + ret = 0x8; + else + ret = 0x0; + } + else + { + int which = (A >> 7) & 1; + + ret = data_latch[which] >> ((A & 2) ? 16 : 0); + + // Which way is correct? Clear on low reads, or both? Official docs only say low... + if(!(A & 0x2)) + latched[which] = FALSE; + } + + if(!latched[0] && !latched[1]) + PCFXIRQ_Assert(PCFXIRQ_SOURCE_INPUT, FALSE); + + return(ret); +} + +void FXINPUT_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp) +{ + FXINPUT_Update(timestamp); + + //printf("Write16: %04x:%02x, %d\n", A, V, timestamp / 1365); + + //PCFXIRQ_Assert(PCFXIRQ_SOURCE_INPUT, FALSE); + //if(V != 7 && V != 5) + //printf("PAD Write16: %04x %04x %d\n", A, V, timestamp); + + switch(A & 0xC0) + { + case 0x80: + case 0x00: + { + int w = (A & 0x80) >> 7; + + if((V & 0x1) && !(control[w] & 0x1)) + { + //printf("Start: %d\n", w); + if(MultiTapEnabled & (1 << w)) + { + if(V & 0x2) + TapCounter[w] = 0; + } + LatchPending[w] = 1536; + PCFX_SetEvent(PCFX_EVENT_PAD, CalcNextEventTS(timestamp)); + } + control[w] = V & 0x7; + } + break; + } +} + +void FXINPUT_Write8(uint32 A, uint8 V, const v810_timestamp_t timestamp) +{ + FXINPUT_Write16(A, V, timestamp); +} + +void FXINPUT_Frame(void) +{ + for(int i = 0; i < TOTAL_PORTS; i++) + { + devices[i]->Frame(data_ptr[i]); + } +} + +void FXINPUT_TransformInput(void) +{ + for(int i = 0; i < TOTAL_PORTS; i++) + { + devices[i]->TransformInput((uint8*)data_ptr[i], DisableSR); + } +} + +static v810_timestamp_t lastts; + +v810_timestamp_t FXINPUT_Update(const v810_timestamp_t timestamp) +{ + int32 run_time = timestamp - lastts; + + for(int i = 0; i < 2; i++) + { + if(LatchPending[i] > 0) + { + LatchPending[i] -= run_time; + if(LatchPending[i] <= 0) + { + //printf("Update: %d, %d\n", i, timestamp / 1365); + + if(MultiTapEnabled & (1 << i)) + { + if(TapCounter[i] >= TAP_PORTS) + data_latch[i] = FX_SIG_TAP << 28; + else + { + data_latch[i] = devices[TapMap[i][TapCounter[i]]]->Read(); + } + } + else + { + data_latch[i] = devices[i]->Read(); + } + // printf("Moo: %d, %d, %08x\n", i, TapCounter[i], data_latch[i]); + latched[i] = TRUE; + control[i] &= ~1; + PCFXIRQ_Assert(PCFXIRQ_SOURCE_INPUT, TRUE); + + if(MultiTapEnabled & (1 << i)) + { + if(TapCounter[i] < TAP_PORTS) + { + TapCounter[i]++; + } + } + + } + } + } + + lastts = timestamp; + + return(CalcNextEventTS(timestamp)); +} + +void FXINPUT_ResetTS(int32 ts_base) +{ + lastts = ts_base; +} + + +void FXINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(TapCounter, 2), + SFARRAY32(LatchPending, 2), + SFARRAY(control, 2), + SFARRAYB(latched, 2), + SFARRAY32(data_latch, 2), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPUT"); + + for(int i = 0; i < TOTAL_PORTS; i++) + { + char sname[256]; + trio_snprintf(sname, 256, "INPUT%d:%d", i, InputTypes[i]); + devices[i]->StateAction(sm, load, data_only, sname); + } + + if(load) + { + + } +} + +static const std::vector InputDeviceInfo = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty, + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + PCFX_GamepadIDII, + }, + + // Mouse + { + "mouse", + "Mouse", + NULL, + PCFX_MouseIDII + } +}; + +const std::vector PCFXPortInfo = +{ + { "port1", "Port 1", InputDeviceInfo, "gamepad" }, + { "port2", "Port 2", InputDeviceInfo, "gamepad" }, + { "port3", "Port 3", InputDeviceInfo, "gamepad" }, + { "port4", "Port 4", InputDeviceInfo, "gamepad" }, + { "port5", "Port 5", InputDeviceInfo, "gamepad" }, + { "port6", "Port 6", InputDeviceInfo, "gamepad" }, + { "port7", "Port 7", InputDeviceInfo, "gamepad" }, + { "port8", "Port 8", InputDeviceInfo, "gamepad" }, +}; + +static void SyncSettings(void) +{ + DisableSR = MDFN_GetSettingB("pcfx.disable_softreset"); + MDFNGameInfo->mouse_sensitivity = MDFN_GetSettingF("pcfx.mouse_sensitivity"); + MultiTapEnabled = MDFN_GetSettingB("pcfx.input.port1.multitap"); + MultiTapEnabled |= MDFN_GetSettingB("pcfx.input.port2.multitap") << 1; +} + diff --git a/Mednafen/mednafen/pcfx/input.h b/Mednafen/mednafen/pcfx/input.h new file mode 100644 index 0000000000..6ff32f2b5f --- /dev/null +++ b/Mednafen/mednafen/pcfx/input.h @@ -0,0 +1,65 @@ +#ifndef __PCFX_PAD_H +#define __PCFX_PAD_H + +enum +{ + FX_SIG_MOUSE = 0xD, + FX_SIG_TAP = 0xE, + FX_SIG_PAD = 0xF +}; + +class PCFX_Input_Device +{ + public: +// PCFX_Input_Device(int which); // "which" is advisory and only should be used in status messages. + + virtual ~PCFX_Input_Device(); + + virtual uint32 ReadTransferTime(void); + virtual uint32 WriteTransferTime(void); + + virtual uint32 Read(void); + virtual void Write(uint32 data); + + + virtual void Power(void); + + virtual void TransformInput(uint8* data, const bool DisableSR); + virtual void Frame(const void *data); + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_name); +}; + + +void FXINPUT_Init(void); +void FXINPUT_SettingChanged(const char *name); + +void FXINPUT_TransformInput(void); +void FXINPUT_SetInput(unsigned port, const char *type, uint8 *ptr); + +uint16 FXINPUT_Read16(uint32 A, const v810_timestamp_t timestamp); +uint8 FXINPUT_Read8(uint32 A, const v810_timestamp_t timestamp); + +void FXINPUT_Write8(uint32 A, uint8 V, const v810_timestamp_t timestamp); +void FXINPUT_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp); + +void FXINPUT_Frame(void); +void FXINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +v810_timestamp_t FXINPUT_Update(const v810_timestamp_t timestamp); +void FXINPUT_ResetTS(int32 ts_base); + +extern const std::vector PCFXPortInfo; + +#ifdef WANT_DEBUGGER + +enum +{ + FXINPUT_GSREG_KPCTRL0 = 0, + FXINPUT_GSREG_KPCTRL1 +}; + +uint32 FXINPUT_GetRegister(const unsigned int id, char *special, const uint32 special_len); +void FXINPUT_SetRegister(const unsigned int id, uint32 value); +#endif + +#endif diff --git a/Mednafen/mednafen/pcfx/input/gamepad.cpp b/Mednafen/mednafen/pcfx/input/gamepad.cpp new file mode 100644 index 0000000000..907eae9a4d --- /dev/null +++ b/Mednafen/mednafen/pcfx/input/gamepad.cpp @@ -0,0 +1,125 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../pcfx.h" +#include "../input.h" +#include "gamepad.h" + +class PCFX_Input_Gamepad : public PCFX_Input_Device +{ + public: + PCFX_Input_Gamepad() + { + buttons = 0; + } + + virtual ~PCFX_Input_Gamepad() override + { + + } + + virtual uint32 ReadTransferTime(void) override + { + return(1536); + } + + virtual uint32 WriteTransferTime(void) override + { + return(1536); + } + + virtual uint32 Read(void) override + { + return(buttons | (FX_SIG_PAD << 28)); + } + + virtual void Write(uint32 data) override + { + + } + + + virtual void Power(void) override + { + buttons = 0; + } + + virtual void TransformInput(uint8* data, const bool DisableSR) override + { + if(DisableSR) + { + uint16 tmp = MDFN_de16lsb(data); + + if((tmp & 0xC0) == 0xC0) + tmp &= ~0xC0; + + MDFN_en16lsb(data, tmp); + } + } + + virtual void Frame(const void *data) override + { + buttons = MDFN_de16lsb((uint8 *)data); + } + + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_name) override + { + SFORMAT StateRegs[] = + { + SFVAR(buttons), + SFEND + }; + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + } + + private: + + uint16 buttons; +}; + +static const char* ModeSwitchPositions[] = +{ + "A", + "B", +}; + +const IDIISG PCFX_GamepadIDII = +{ + { "i", "I", 11, IDIT_BUTTON, NULL }, + { "ii", "II", 10, IDIT_BUTTON, NULL }, + { "iii", "III", 9, IDIT_BUTTON, NULL }, + { "iv", "IV", 6, IDIT_BUTTON, NULL }, + { "v", "V", 7, IDIT_BUTTON, NULL }, + { "vi", "VI", 8, IDIT_BUTTON, NULL }, + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "run", "RUN", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + + IDIIS_Switch("mode1", "MODE 1", 12, ModeSwitchPositions, sizeof(ModeSwitchPositions) / sizeof(ModeSwitchPositions[0])), + { NULL, "empty", 0, IDIT_BUTTON }, + IDIIS_Switch("mode2", "MODE 2", 13, ModeSwitchPositions, sizeof(ModeSwitchPositions) / sizeof(ModeSwitchPositions[0])), +}; + +PCFX_Input_Device *PCFXINPUT_MakeGamepad(void) +{ + return(new PCFX_Input_Gamepad()); +} diff --git a/Mednafen/mednafen/pcfx/input/gamepad.h b/Mednafen/mednafen/pcfx/input/gamepad.h new file mode 100644 index 0000000000..7aedd8ac01 --- /dev/null +++ b/Mednafen/mednafen/pcfx/input/gamepad.h @@ -0,0 +1,9 @@ +#ifndef __PCFX_INPUT_GAMEPAD_H +#define __PCFX_INPUT_GAMEPAD_H + +extern const IDIISG PCFX_GamepadIDII; +extern const IDIISG PCFX_GamepadIDII_DSR; + +PCFX_Input_Device *PCFXINPUT_MakeGamepad(void); + +#endif diff --git a/Mednafen/mednafen/pcfx/input/mouse.cpp b/Mednafen/mednafen/pcfx/input/mouse.cpp new file mode 100644 index 0000000000..698504635a --- /dev/null +++ b/Mednafen/mednafen/pcfx/input/mouse.cpp @@ -0,0 +1,121 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../pcfx.h" +#include "../input.h" +#include "mouse.h" + +class PCFX_Input_Mouse : public PCFX_Input_Device +{ + public: + PCFX_Input_Mouse(int which) + { + x = 0; + y = 0; + button = 0; + } + + virtual ~PCFX_Input_Mouse() override + { + + } + + virtual uint32 ReadTransferTime(void) override + { + return(1536); + } + + virtual uint32 WriteTransferTime(void) override + { + return(1536); + } + + virtual uint32 Read(void) override + { + uint32 moo = FX_SIG_MOUSE << 28; + int32 rel_x = (int32)(x); + int32 rel_y = (int32)(y); + + if(rel_x < -127) rel_x = -127; + if(rel_x > 127) rel_x = 127; + if(rel_y < -127) rel_y = -127; + if(rel_y > 127) rel_y = 127; + + moo |= ((rel_x & 0xFF) << 8) | ((rel_y & 0xFF) << 0); + + x += (int32)(0 - rel_x); + y += (int32)(0 - rel_y); + + moo |= button << 16; + + return(moo); + } + + virtual void Write(uint32 data) override + { + + } + + + virtual void Power(void) override + { + button = 0; + x = 0; + y = 0; + } + + virtual void Frame(const void *data) override + { + x += (int32)MDFN_de32lsb((uint8 *)data + 0); + y += (int32)MDFN_de32lsb((uint8 *)data + 4); + button = *(uint8 *)((uint8 *)data + 8); + } + + virtual void StateAction(StateMem *sm, const unsigned load, const bool data_only, const char *section_name) override + { + SFORMAT StateRegs[] = + { + SFVAR(x), + SFVAR(y), + SFVAR(button), + SFEND + }; + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + } + + private: + + + int32 x, y; + uint8 button; +}; + +PCFX_Input_Device *PCFXINPUT_MakeMouse(int which) +{ + return(new PCFX_Input_Mouse(which)); +} + +const IDIISG PCFX_MouseIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS_REL }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL }, + { "left", "Left Button", 0, IDIT_BUTTON, NULL }, + { "right", "Right Button", 1, IDIT_BUTTON, NULL }, +}; + diff --git a/Mednafen/mednafen/pcfx/input/mouse.h b/Mednafen/mednafen/pcfx/input/mouse.h new file mode 100644 index 0000000000..cc2ef0638a --- /dev/null +++ b/Mednafen/mednafen/pcfx/input/mouse.h @@ -0,0 +1,8 @@ +#ifndef __PCFX_INPUT_MOUSE_H +#define __PCFX_INPUT_MOUSE_H + +extern const IDIISG PCFX_MouseIDII; + +PCFX_Input_Device *PCFXINPUT_MakeMouse(int which); + +#endif diff --git a/Mednafen/mednafen/pcfx/interrupt.cpp b/Mednafen/mednafen/pcfx/interrupt.cpp new file mode 100644 index 0000000000..92174b8999 --- /dev/null +++ b/Mednafen/mednafen/pcfx/interrupt.cpp @@ -0,0 +1,221 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcfx.h" +#include "interrupt.h" +#include + +static uint16 InterruptAsserted; +static uint16 InterruptMask; +static uint16 InterruptPriority[2]; + +static void BuildInterruptCache(void) +{ + uint32 iwithmask = InterruptAsserted &~ InterruptMask; + int InterruptCache = -1; + int last_prio = -1; + + for(int level = 8; level < 16; level++) + if(iwithmask & (1 << (15 - level))) + { + int tmp_prio; + + if(level >= 12) + tmp_prio = (InterruptPriority[0] >> ((15 - level) * 3)) & 0x7; + else + tmp_prio = (InterruptPriority[1] >> ((11 - level) * 3)) & 0x7; + + if(tmp_prio >= last_prio) + { + if(tmp_prio == last_prio) + { + FXDBG("Undefined IRQ behavior: %d, %d\n", level, tmp_prio); + } + InterruptCache = 8 + tmp_prio; + last_prio = tmp_prio; + } + } + + PCFX_V810.SetInt(InterruptCache); +} + +void PCFXIRQ_Assert(int source, bool assert) +{ + assert(source >= 0 && source <= 7); + + InterruptAsserted &= ~(1 << (7 - source)); + + if(assert) + InterruptAsserted |= (1 << (7 - source)); + + BuildInterruptCache(); +} + + +uint16 PCFXIRQ_Read16(uint32 A) +{ + uint32 ret = 0x00; + + switch(A & 0xC0) + { + case 0x00: ret = InterruptAsserted; break; + case 0x40: ret = InterruptMask; break; + case 0x80: ret = InterruptPriority[0]; break; + case 0xC0: ret = InterruptPriority[1]; break; + } + + return(ret); +} + +uint8 PCFXIRQ_Read8(uint32 A) +{ + return(PCFXIRQ_Read16(A&~1) >> ((A & 1) * 8)); +} + +void PCFXIRQ_Write16(uint32 A, uint16 V) +{ +// printf("IRQ Controller Write: %08x %04x\n", A, V); + switch(A & 0xC0) + { + case 0x00: puts("Address error clear"); + break; + + case 0x40: InterruptMask = V & 0x7F; + BuildInterruptCache(); + break; + + case 0x80: if(InterruptMask == 0x7F) + { + InterruptPriority[0] = V & 0xFFF; + BuildInterruptCache(); + } + break; + + case 0xC0: if(InterruptMask == 0x7F) + { + InterruptPriority[1] = V & 0x1FF; + BuildInterruptCache(); + } + break; + } +} + +void PCFXIRQ_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(InterruptAsserted), + SFVAR(InterruptMask), + SFARRAY16(InterruptPriority, 2), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "IRQ"); + + if(load) + BuildInterruptCache(); +} + +void PCFXIRQ_SetRegister(const unsigned int id, uint32 value) +{ + switch(id) + { + case PCFXIRQ_GSREG_IMASK: + InterruptMask = value & 0x7F; + BuildInterruptCache(); + break; + + case PCFXIRQ_GSREG_IPRIO0: + InterruptPriority[0] = value & 0xFFF; + BuildInterruptCache(); + break; + + case PCFXIRQ_GSREG_IPRIO1: + InterruptPriority[1] = value & 0x1FF; + BuildInterruptCache(); + break; + + case PCFXIRQ_GSREG_IPEND: + InterruptAsserted = value; + BuildInterruptCache(); + break; + } +} + +uint32 PCFXIRQ_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case PCFXIRQ_GSREG_IMASK: + value = InterruptMask; + if(special) + { + trio_snprintf(special, special_len, "IRQ Allowed; HuC6273: %s, HuC6270-B: %s, HuC6272: %s, HuC6270-A: %s, Pad: %s, Timer: %s, Reset: %s", + (InterruptMask & (1 << 0)) ? "No" : "Yes", (InterruptMask & (1 << 1)) ? "No" : "Yes", + (InterruptMask & (1 << 2)) ? "No" : "Yes", (InterruptMask & (1 << 3)) ? "No" : "Yes", + (InterruptMask & (1 << 4)) ? "No" : "Yes", (InterruptMask & (1 << 6)) ? "No" : "Yes", + (InterruptMask & (1 << 7)) ? "No" : "Yes"); + } + break; + + case PCFXIRQ_GSREG_IPRIO0: + value = InterruptPriority[0]; + if(special) + { + trio_snprintf(special, special_len, "HuC6273: %d, HuC6270-B: %d, HuC6272: %d, HuC6270-A: %d", + (InterruptPriority[0] >> 0) & 0x7, (InterruptPriority[0] >> 3) & 0x7, + (InterruptPriority[0] >> 6) & 0x7, (InterruptPriority[0] >> 9) & 0x7); + } + break; + + case PCFXIRQ_GSREG_IPRIO1: + value = InterruptPriority[1]; + if(special) + { + trio_snprintf(special, special_len, "Pad: %d, ??: %d, Timer: %d, Reset: %d", + (InterruptPriority[1] >> 0) & 0x7, (InterruptPriority[1] >> 3) & 0x7, + (InterruptPriority[1] >> 6) & 0x7, (InterruptPriority[1] >> 9) & 0x7); + } + break; + + case PCFXIRQ_GSREG_IPEND: + value = InterruptAsserted; + if(special) + { + trio_snprintf(special, special_len, "HuC6273: %d, HuC6270-B: %d, HuC6272: %d, HuC6270-A: %d, Pad: %d, ??: %d, Timer: %d, Reset: %d", (int)(bool)(value & 0x01), (int)(bool)(value & 0x02), + (int)(bool)(value & 0x04), (int)(bool)(value & 0x08), (int)(bool)(value & 0x10), (int)(bool)(value & 0x20), + (int)(bool)(value & 0x40), (int)(bool)(value & 0x80)); + } + break; + } + + return value; +} + +void PCFXIRQ_Reset(void) +{ + InterruptAsserted = 0; + InterruptMask = 0xFFFF; + + InterruptPriority[0] = 0; + InterruptPriority[1] = 0; + + BuildInterruptCache(); +} + diff --git a/Mednafen/mednafen/pcfx/interrupt.h b/Mednafen/mednafen/pcfx/interrupt.h new file mode 100644 index 0000000000..80854a0e7c --- /dev/null +++ b/Mednafen/mednafen/pcfx/interrupt.h @@ -0,0 +1,31 @@ +#ifndef __PCFX_INTERRUPT_H +#define __PCFX_INTERRUPT_H + +#define PCFXIRQ_SOURCE_TIMER 1 +#define PCFXIRQ_SOURCE_EX 2 +#define PCFXIRQ_SOURCE_INPUT 3 +#define PCFXIRQ_SOURCE_VDCA 4 +#define PCFXIRQ_SOURCE_KING 5 +#define PCFXIRQ_SOURCE_VDCB 6 +#define PCFXIRQ_SOURCE_HUC6273 7 + +void PCFXIRQ_Assert(int source, bool assert); +void PCFXIRQ_Write16(uint32 A, uint16 V); +uint16 PCFXIRQ_Read16(uint32 A); +uint8 PCFXIRQ_Read8(uint32 A); +void PCFXIRQ_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +void PCFXIRQ_Reset(void); + +enum +{ + PCFXIRQ_GSREG_IMASK = 0, + PCFXIRQ_GSREG_IPRIO0, + PCFXIRQ_GSREG_IPRIO1, + PCFXIRQ_GSREG_IPEND +}; + +uint32 PCFXIRQ_GetRegister(const unsigned int id, char *special, const uint32 special_len); +void PCFXIRQ_SetRegister(const unsigned int id, uint32 value); + +#endif diff --git a/Mednafen/mednafen/pcfx/io-handler.inc b/Mednafen/mednafen/pcfx/io-handler.inc new file mode 100644 index 0000000000..58bd16790d --- /dev/null +++ b/Mednafen/mednafen/pcfx/io-handler.inc @@ -0,0 +1,290 @@ +static uint8 MDFN_FASTCALL port_rbyte(v810_timestamp_t ×tamp, uint32 A) +{ + if(A >= 0x000 && A <= 0x0FF) + return(FXINPUT_Read8(A, timestamp)); + else if(A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy + { + timestamp += 4; + } + else if(A >= 0x200 && A <= 0x2FF) // RAINBOW dummy + { + timestamp += 4; + } + else if(A >= 0x300 && A <= 0x3FF) // FXVCE + { + timestamp += 4; + return(FXVCE_Read16(A)); + } + else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 4; + return(fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); + } + else if(A >= 0x600 && A <= 0x6FF) + { + timestamp += 4; + return(KING_Read8(timestamp, A)); + } + else if(A >= 0x700 && A <= 0x7FF) + { + if(!(A & 1)) + { + FXDBG("ExBusReset B Read"); + return(ExBusReset); + } + return(0); + } + else if(A >= 0xc00 && A <= 0xCFF) // Backup memory control + { + switch(A & 0xC0) + { + case 0x80: return(BackupControl); + case 0x00: return(Last_VDC_AR[0]); + case 0x40: return(Last_VDC_AR[1]); + } + } + else if(A >= 0xe00 && A <= 0xeff) + { + return(PCFXIRQ_Read8(A)); + } + else if(A >= 0xf00 && A <= 0xfff) + { + return(FXTIMER_Read8(A, timestamp)); + } + else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if(WantHuC6273) + return(HuC6273_Read8(A)); + } + else if(FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) + { + return(FXSCSIROM[A & 0x7FFFF]); + } + else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + return(FXSCSI_CtrlRead(A)); + } + FXDBG("Unknown 8-bit port read: %08x", A); + + return(0x00); +} + +static uint16 MDFN_FASTCALL port_rhword(v810_timestamp_t ×tamp, uint32 A) +{ + if(A >= 0x000 && A <= 0x0FF) + return(FXINPUT_Read16(A, timestamp)); + else if(A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy + { + timestamp += 4; + } + else if(A >= 0x200 && A <= 0x2FF) // RAINBOW dummy + { + timestamp += 4; + } + else if(A >= 0x300 && A <= 0x3FF) + { + timestamp += 4; + return(FXVCE_Read16(A)); + } + else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 4; + return(fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); + } + else if(A >= 0x600 && A <= 0x6FF) + { + timestamp += 4; + return(KING_Read16(timestamp, A)); + } + else if(A >= 0x700 && A <= 0x7FF) + { + FXDBG("ExBusReset H Read"); + + return(ExBusReset); + } + else if(A >= 0xc00 && A <= 0xCFF) // Backup memory control + { + switch(A & 0xC0) + { + case 0x80: return(BackupControl); + case 0x00: return(Last_VDC_AR[0]); + case 0x40: return(Last_VDC_AR[1]); + } + } + else if(A >= 0xe00 && A <= 0xeff) + { + return(PCFXIRQ_Read16(A)); + } + else if(A >= 0xf00 && A <= 0xfff) + { + return(FXTIMER_Read16(A, timestamp)); + } + else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if(WantHuC6273) + return(HuC6273_Read16(A)); + } + else if(FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) + { + return MDFN_de16lsb(&FXSCSIROM[A & 0x7FFFF]); + } + else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + puts("FXSCSI 16-bit:"); + return(FXSCSI_CtrlRead(A)); + } + + FXDBG("Unknown 16-bit port read: %08x", A); + + return(0x00); +} + +static void MDFN_FASTCALL port_wbyte(v810_timestamp_t ×tamp, uint32 A, uint8 V) +{ + if(A >= 0x000 && A <= 0x0FF) + FXINPUT_Write8(A, V, timestamp); + else if(A >= 0x100 && A <= 0x1FF) + { + timestamp += 2; + SoundBox_Write(A, V, timestamp); + } + else if(A >= 0x200 && A <= 0x2FF) + { + timestamp += 2; + RAINBOW_Write8(A, V); + } + else if(A >= 0x300 && A <= 0x3FF) // FXVCE + { + timestamp += 2; + FXVCE_Write16(A, V); + } + else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 2; + + if(!(A & 4)) + Last_VDC_AR[(A >> 8) & 0x1] = V; + + fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); + } + else if(A >= 0x600 && A <= 0x6FF) + { + timestamp += 2; + KING_Write8(timestamp, A, V); + } + else if(A >= 0x700 && A <= 0x7FF) + { + if(!(A & 1)) + { + FXDBG("ExBusReset B Write: %02x", V & 1); + ExBusReset = V & 1; + } + } + else if(A >= 0xc00 && A <= 0xCFF) + { + switch(A & 0xC1) + { + case 0x80: BackupControl = V & 0x3; + break; + + default: FXDBG("Port 8-bit write: %08x %02x", A, V); + break; + } + } + else if(A >= 0xe00 && A <= 0xeff) + { + FXDBG("IRQ write8: %08x %02x", A, V); + PCFXIRQ_Write16(A, V); + } + else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if(WantHuC6273) + HuC6273_Write16(A, V); + } + else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + FXSCSI_CtrlWrite(A, V); + } + else + { + FXDBG("Port 8-bit write: %08x %02x", A, V); + } +} + +static void MDFN_FASTCALL port_whword(v810_timestamp_t ×tamp, uint32 A, uint16 V) +{ + if(A >= 0x000 && A <= 0x0FF) + FXINPUT_Write16(A, V, timestamp); + else if(A >= 0x100 && A <= 0x1FF) + { + timestamp += 2; + SoundBox_Write(A, V, timestamp); + } + else if(A >= 0x200 && A <= 0x2FF) + { + timestamp += 2; + RAINBOW_Write16(A, V); + } + else if(A >= 0x300 && A <= 0x3FF) + { + timestamp += 2; + FXVCE_Write16(A, V); + } + else if(A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B + { + timestamp += 2; + + if(!(A & 4)) + Last_VDC_AR[(A >> 8) & 0x1] = V; + + fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); + } + else if(A >= 0x600 && A <= 0x6FF) + { + timestamp += 2; + KING_Write16(timestamp, A, V); + } + else if(A >= 0x700 && A <= 0x7FF) + { + ExBusReset = V & 1; + FXDBG("ExBusReset H Write: %04x", V); + } + else if(A >= 0x800 && A <= 0x8FF) // ?? LIP writes here + { + FXDBG("Port 16-bit write: %08x %04x", A, V); + } + else if(A >= 0xc00 && A <= 0xCFF) + { + switch(A & 0xC0) + { + case 0x80: BackupControl = V & 0x3; + break; + + default: FXDBG("Port 16-bit write: %08x %04x", A, V); + break; + } + } + else if(A >= 0xe00 && A <= 0xeff) + { + PCFXIRQ_Write16(A, V); + } + else if(A >= 0xF00 && A <= 0xFFF) + { + FXTIMER_Write16(A, V, timestamp); + } + else if((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) + { + if(WantHuC6273) + HuC6273_Write16(A, V); + } + else if(FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) + { + puts("FXSCSI 16-bit:"); + FXSCSI_CtrlWrite(A, V); + } + else + { + FXDBG("Port 16-bit write: %08x %04x", A, V); + } +} + diff --git a/Mednafen/mednafen/pcfx/jrevdct.cpp b/Mednafen/mednafen/pcfx/jrevdct.cpp new file mode 100644 index 0000000000..ff220243de --- /dev/null +++ b/Mednafen/mednafen/pcfx/jrevdct.cpp @@ -0,0 +1,280 @@ +/* + * jrevdct.c + * + * Copyright (C) 1991, 1992, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the basic inverse-DCT transformation subroutine. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +/* Modified 2007 for usage in Mednafen */ + +#include +#include "jrevdct.h" + +/* + * This routine is specialized to the case DCTSIZE = 8. + */ +#define DCTSIZE 8 + +/* + * A 2-D IDCT can be done by 1-D IDCT on each row followed by 1-D IDCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * The poop on this scaling stuff is as follows: + * + * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) + * larger than the true IDCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D IDCT, + * because the y0 and y4 inputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data further, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#define CONST_BITS 13 +#define PASS1_BITS 2 + +#if ((8 + CONST_BITS + PASS1_BITS) > 26) + #error "Too many bits1!" +#endif + +#define ONE ((INT32) 1) + +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) +#define MULTIPLY(var,const) ((var) * (const)) + + +/* + * Perform the inverse DCT on one block of coefficients. + */ + +void j_rev_dct(DCTBLOCK data) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + register DCTELEM *dataptr; + int rowctr; + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) + { + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) dataptr[2]; + z3 = (INT32) dataptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + tmp0 = ((INT32) dataptr[0] + (INT32) dataptr[4]) << CONST_BITS; + tmp1 = ((INT32) dataptr[0] - (INT32) dataptr[4]) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) dataptr[7]; + tmp1 = (INT32) dataptr[5]; + tmp2 = (INT32) dataptr[3]; + tmp3 = (INT32) dataptr[1]; + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + dataptr = data; + for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) { + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) dataptr[DCTSIZE*2]; + z3 = (INT32) dataptr[DCTSIZE*6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + tmp0 = ((INT32) dataptr[DCTSIZE*0] + (INT32) dataptr[DCTSIZE*4]) << CONST_BITS; + tmp1 = ((INT32) dataptr[DCTSIZE*0] - (INT32) dataptr[DCTSIZE*4]) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) dataptr[DCTSIZE*7]; + tmp1 = (INT32) dataptr[DCTSIZE*5]; + tmp2 = (INT32) dataptr[DCTSIZE*3]; + tmp3 = (INT32) dataptr[DCTSIZE*1]; + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS+PASS1_BITS+1); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS+PASS1_BITS+1); + + dataptr++; /* advance pointer to next column */ + } +} diff --git a/Mednafen/mednafen/pcfx/jrevdct.h b/Mednafen/mednafen/pcfx/jrevdct.h new file mode 100644 index 0000000000..bb2c77f4fc --- /dev/null +++ b/Mednafen/mednafen/pcfx/jrevdct.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_JREVDCT_H +#define __MDFN_JREVDCT_H + +typedef int32* DCTBLOCK; +typedef int32 DCTELEM; + +void j_rev_dct(DCTBLOCK data); + +typedef int32 INT32; + +#endif diff --git a/Mednafen/mednafen/pcfx/king-bgfast-blit.inc b/Mednafen/mednafen/pcfx/king-bgfast-blit.inc new file mode 100644 index 0000000000..5dc6859058 --- /dev/null +++ b/Mednafen/mednafen/pcfx/king-bgfast-blit.inc @@ -0,0 +1,103 @@ + switch(bgmode & 0x7) + { + case 0x01: // 4 color, 1/4 byte per pixel :b + sexy_y_pos >>= 3; + for(int x = 0; x < 256 + 8; x+= 8) + { + DRAWBG8x1_LPRE(); + const uint16 *cgptr; + uint32 pbn = 0; + + if(BGFAST_BATMODE) + { + uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; + pbn = (bat >> 12) << 2; + bat &= 0x0FFF; + cgptr = &king_cg_base[(cg_offset + (bat * 8) + ysmall) & 0x1FFFF]; + } + else + cgptr = &king_cg_base[(cg_offset + (bat_x * 1) + sexy_y_pos) & 0x1FFFF]; + + DRAWBG8x1_4(target + x, cgptr, palette_ptr + pbn, layer_or); + DRAWBG8x1_LPOST(); + } + break; + case 0x02: // 16 color, 1/2 byte per pixel + sexy_y_pos >>= 2; + for(int x = 0; x < 256 + 8; x+= 8) + { + DRAWBG8x1_LPRE(); + const uint16 *cgptr; + uint32 pbn = 0; + + if(BGFAST_BATMODE) + { + uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; + pbn = ((bat >> 12) << 4); + bat &= 0x0FFF; + cgptr = &king_cg_base[(cg_offset + (bat * 16) + ysmall * 2) & 0x1FFFF]; + } + else + cgptr = &king_cg_base[(cg_offset + (bat_x * 2) + sexy_y_pos) & 0x1FFFF]; + + DRAWBG8x1_16(target + x, cgptr, palette_ptr + pbn, layer_or); + DRAWBG8x1_LPOST(); + } + break; + case 0x03: // 256 color, 1 byte per pixel palettized - OK + sexy_y_pos >>= 1; + for(int x = 0; x < 256 + 8; x+= 8) + { + DRAWBG8x1_LPRE(); + const uint16 *cgptr; + + if(BGFAST_BATMODE) + { + uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; + cgptr = &king_cg_base[(cg_offset + (bat * 32) + ysmall * 4) & 0x1FFFF]; + } + else + cgptr = &king_cg_base[(cg_offset + (bat_x * 4) + sexy_y_pos) & 0x1FFFF]; + + DRAWBG8x1_256(target + x, cgptr, palette_ptr, layer_or); + DRAWBG8x1_LPOST(); + } + break; + + case 0x04: // 64K color, 2 bytes per pixel - OK + for(int x = 0; x < 256 + 8; x+=8) + { + DRAWBG8x1_LPRE(); + const uint16 *cgptr; + + if(BGFAST_BATMODE) + { + uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; + cgptr = &king_cg_base[(cg_offset + (bat * 64) + ysmall * 8) & 0x1FFFF]; + } + else + cgptr = &king_cg_base[(cg_offset + (bat_x * 8) + sexy_y_pos) & 0x1FFFF]; + + DRAWBG8x1_64K(target + x, cgptr, palette_ptr, layer_or); + DRAWBG8x1_LPOST(); + } + break; + + case 0x05: // 16M color, 2 bytes per pixel - OK + for(int x = 0; x < 256 + 8; x+=8) + { + DRAWBG8x1_LPRE(); + const uint16 *cgptr; + if(BGFAST_BATMODE) + { + uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; + cgptr = &king_cg_base[(cg_offset + (bat * 64) + ysmall * 8) & 0x1FFFF]; + } + else + cgptr = &king_cg_base[(cg_offset + (bat_x * 8) + sexy_y_pos) & 0x1FFFF]; + + DRAWBG8x1_16M(target + x, cgptr, palette_ptr, layer_or); + DRAWBG8x1_LPOST(); + } + break; + } diff --git a/Mednafen/mednafen/pcfx/king-bgfast.inc b/Mednafen/mednafen/pcfx/king-bgfast.inc new file mode 100644 index 0000000000..62af0e07f8 --- /dev/null +++ b/Mednafen/mednafen/pcfx/king-bgfast.inc @@ -0,0 +1,249 @@ +// Loop prefix non-endless +#define DRAWBG8x1_LPRE() if(bat_x < bat_width) { + +// Loop postfix non-endless +#define DRAWBG8x1_LPOST() } bat_x = (bat_x + 1) & bat_width_mask; + +#define CDBG_REASON(format, ...) +//printf("BG%d Reason: " format "\n", n, ## __VA_ARGS__); +static bool CanDrawBG_Fast(int n) +{ + static const int cg_per_mode[0x8] = + { + 0, // Invalid mode + 1, // 2-bit mode + 2, // 4-bit mode + 4, // 8-bit mode + 8, // 16-bit mode + 8, // 16-bit mode + 8, // 16-bit mode + 8, // 16-bit mode + }; + + const unsigned int bgmode = (king->bgmode >> (n * 4)) & 0xF; + const uint32 bat_offset = king->BGBATAddr[n] * 1024; + const uint32 cg_offset = king->BGCGAddr[n] * 1024; + const uint32 bg_width = (king->BGSize[n] & 0xF0) >> 4; + const uint32 bg_height = king->BGSize[n] & 0x0F; + + // If the bgmode is 0, or 6/7(EXT DOT modes), abort. + if(!(bgmode & 0x7) || ((bgmode & 0x7) >= 6)) + { + CDBG_REASON("Mode %02x out of range", bgmode); + return(FALSE); + } + + // BG width out of range? + if(bg_width < 0x3 || bg_width > 0xA) + { + CDBG_REASON("Width %02x out of range", bg_width); + return(FALSE); + } + + // BG height out of range? + if(bg_height < 0x3 || bg_height > 0xA) + { + CDBG_REASON("Height %02x out of range", bg_height); + return(FALSE); + } + + // Time for very stringent checks for BG0! Don't draw if the sub-screen is a different size than the main screen, + // or the subscreen CG base != the main screen CG base, or the subscreen BAT base != main screen BAT base(when bgmode & 0x8 is TRUE) + if(!n) + { + if(king->priority & 0x1000) + { + CDBG_REASON("Affine transform enabled"); + return(FALSE); + } + + if((king->BGSize[0] & 0xFF) != (king->BGSize[0] >> 8)) + { + CDBG_REASON("Main Screen/Sub Screen Size Mismatch"); + return(FALSE); + } + + // Since we already made sure the main screen/sub screen sizes match, we only + // care if BG base or CG base don't match if endless/repeat scrolling is enabled. + // Otherwise, the subscreen won't show at all. + if(king->BGScrollMode & 0x1) + { + if(king->BGCGAddr[0] != king->BG0SubCGAddr) + { + CDBG_REASON("Main Screen/Sub Screen CG base mismatch"); + return(FALSE); + } + + if(bgmode & 0x8) + { + if(king->BGBATAddr[0] != king->BG0SubBATAddr) + { + CDBG_REASON("Main Screen/Sub Screen BAT base mismatch"); + return(FALSE); + } + } + } + } + + + // If microprogram fetching is disabled, abort. + if(!(king->MPROGControl & 0x1)) + { + CDBG_REASON("Microprogram disabled"); + return(FALSE); + } + else + { + int remap_thing = 0; + bool bat_fetch = FALSE; + + for(int x = 0; x < 16; x++) + { + uint16 mpd; + + // Forcing CG and BAT to 0 if the affine bit != rotate_mode is not technically correct. + // If there is a mismatch, it's more likely the effective CG and BAT address for the pixel/segment + // being drawn won't be calculated correctly, likely being just the initial offsets. + + mpd = king->MPROGData[x]; + + // Fetching for this BG number? + if(((mpd >> 6) & 0x3) != n) + continue; + + // NOP + if(mpd & 0x100) + continue; + + // Affine bit. + if(mpd & 0x20) + { + CDBG_REASON("Affine bit set"); + return(FALSE); + } + + // BAT fetch + if(mpd & 0x10) + { + if(((bat_offset & 0x20000) >> 14) != (x & 8)) + { + CDBG_REASON("BAT MPROG/base bank mismatch"); + return(FALSE); + } + + bat_fetch = TRUE; + } + else // CG fetch: + { + // CG offset/bank mismatch... + if(((cg_offset & 0x20000) >> 14) != (x & 8)) + { + CDBG_REASON("CG MPROG/base bank mismatch"); + return(FALSE); + } + + // Mismatch between CG fetch type and BG mode! + if((mpd & 0x8) != (bgmode & 0x8)) + { + CDBG_REASON("Mismatch between CG fetch type and bg mode"); + return(FALSE); + } + + // Skewed CG fetch order + if((mpd & 0x7) != remap_thing) + { + CDBG_REASON("Skewed CG fetch order"); + return(FALSE); + } + remap_thing++; + } + } + + // CG fetch count mismatch + if(remap_thing != cg_per_mode[bgmode & 0x7]) + { + CDBG_REASON("CG fetch count mismatch"); + return(FALSE); + } + + // BG mode demands a BAT fetch, but we don't have one! + if((bgmode & 0x8) && !bat_fetch) + { + CDBG_REASON("Missing BAT fetch"); + return(FALSE); + } + } + + + return(TRUE); +} + +static void DrawBG_Fast(uint32 *target, int n) +{ + const uint16 bgmode = (king->bgmode >> (n * 4)) & 0xF; + const bool endless = (king->BGScrollMode >> n) & 0x1; + const uint32 XScroll = sign_x_to_s32((n ? 10 : 11), king->BGXScroll[n]); + const uint32 YScroll = sign_x_to_s32((n ? 10 : 11), king->BGYScroll[n]); + const uint32 bat_offset = king->BGBATAddr[n] * 1024; + const uint32 cg_offset = king->BGCGAddr[n] * 1024; + const uint32 bat_and_cg_page = (king->PageSetting & 0x0010) ? 1 : 0; + + const uint32 YOffset = (YScroll + (fx_vce.raster_counter - 22)) & 0xFFFF; + const uint32 layer_or = (LAYER_BG0 + n) << 28; + const int ysmall = YOffset & 0x7; + + const unsigned int bat_width_shift = (king->BGSize[n] & 0xF0) >> 4; + const unsigned int bat_width = (1 << bat_width_shift) >> 3; + const unsigned int bat_width_mask = endless ? (bat_width - 1) : ((((1 << 0xA) * 2) / 8) - 1); + + const int bat_height_shift = king->BGSize[n] & 0x0F; + const int bat_height = (1 << bat_height_shift) >> 3; + const int bat_height_mask = endless ? (bat_height - 1) : ((((1 << 0xA) * 2) / 8) - 1); + + // We don't need to &= cg_offset and bat_offset with 0x1ffff after here, as the effective addresses + // calculated with them are anded with 0x1ffff in the rendering code already. + const uint16 * const king_cg_base = &king->KRAM[bat_and_cg_page][cg_offset & 0x20000]; + const uint16 * const king_bat_base = &king->KRAM[bat_and_cg_page][bat_offset & 0x20000]; + + int bat_y = (YOffset >> 3) & bat_height_mask; + uint32 bat_x = (XScroll >> 3) & bat_width_mask; + + target += 8 - (XScroll & 0x7); + + // If we're in non-endless scroll mode, and we've scrolled past our visible area in the vertical direction, so return. + if(!endless && bat_y >= bat_height) // Draw this line as transparency and return? + { + return; + } + + // Adjust/corrupt bat_y to be faster in our blitting code + bat_y = (bat_y << bat_width_shift) >> 3; + + const uint32 palette_offset = ((vce_rendercache.palette_offset[1 + (n >> 1)] >> ((n & 1) ? 8 : 0)) << 1) & 0x1FF; + const uint32 * const palette_ptr = &vce_rendercache.palette_table_cache[palette_offset]; + + { + int wmul = (1 << bat_width_shift), wmask = (1 << bat_height_shift) - 1; + int sexy_y_pos = (YOffset & wmask) * wmul; + + #if 0 + #define BGFAST_BATMODE (bgmode & 0x8) + #include "king-bgfast-blit.inc" + + #else + if(bgmode & 0x8) + { + #define BGFAST_BATMODE 1 + #include "king-bgfast-blit.inc" + #undef BGFAST_BATMODE + } + else + { + #define BGFAST_BATMODE 0 + #include "king-bgfast-blit.inc" + #undef BGFAST_BATMODE + } + #endif + } +} + diff --git a/Mednafen/mednafen/pcfx/king.cpp b/Mednafen/mednafen/pcfx/king.cpp new file mode 100644 index 0000000000..5c798069fc --- /dev/null +++ b/Mednafen/mednafen/pcfx/king.cpp @@ -0,0 +1,4065 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* Emulation for HuC6261(descendant of the VCE) and the HuC6272(KING) */ +/* Note: Some technical comments may be outdated */ + +/* + Current issues: + VCE "natural" priorities for the layers when their priorities are the same(technically an illegal condition) are probably not correct. A game test case: "Miraculum" erroneously sets + up the priority registers like this after exiting the airship(I believe). + + SCSI RST interrupt timing is guessed(and with nothing to go on), so it definitely needs to be tested on the real thing. + + The data bus is not handled/asserted properly. Excluding pseudo-DMA and DMA modes(which I'd need to test), the data bus will only be asserted if the lower bit of register 0x1 is set, and the + phase match bits must match the state of the C/D, I/O, and MSG signals(IE there isn't a bus mismatch state). + + Raw subchannel reading timing is probably wrong. + + KRAM mode register is not emulated(I'm not even sure what it does exactly). +*/ + +#include "pcfx.h" +#include "king.h" +#include +#include "interrupt.h" +#include "rainbow.h" +#include "soundbox.h" +#include "input.h" +#include "timer.h" +#include "debug.h" +#include +#include +#include +#include + +#ifdef __MMX__ +#include +#endif + +#define KINGDBG(format, ...) (void)0 +//#define KINGDBG FXDBG +#define KING_UNDEF FXDBG +#define ADPCMDBG(format, ...) (void)0 +//FXDBG + +/* + SCSI Questions(this list needs to be revised more and merged into the issues list at the beginning of the file): + + What happens when there is no more data to transfer during DMA and the status SCSI bus phase is entered(before the DMA count reaches 0)? + + Why is the "sequential DMA" bit needed? + + Which SCSI registers return the values of the SCSI bus, and which return latched values(from previous writes or pseudo-DMA)? + + Is real DMA layered on top of pseudo-DMA? Reading the developer documents, it looks that way. + + What triggers the setting of ACK during pseudo-DMA? A timer? Reading from the upper 16-bits of KING register 0x05? The lower bits(in which case, + the value would be latched..)? + +*/ + +// 16 bit YUV format: upper 8 bits Y, next 4 bits U, lower 4 bits V, transformed to 8-bit U and 8-bit V by shifting in 0 in lower bits. + +typedef struct +{ + uint8 AR; + + uint16 priority[2]; /* uint16 0: + bit 3-0: Legacy VDC BG priority? + bit 7-4: Legacy VDC SPR priority? + bit 11-8: RAINBOW(MJPEG) priority + uint16 1: + bit 3-0: KING BG0 priority + bit 7-4: KING BG1 priority + bit 11-8: KING BG2 priority + bit 15-12: KING BG3 priority + */ + + bool odd_field; /* TRUE if interlaced mode is enabled and we're in the odd field, FALSE otherwise. */ + + bool in_hblank; /* TRUE if we're in H-blank */ + bool in_vdc_hsync; + + bool frame_interlaced; + + uint16 picture_mode; + + bool dot_clock; // Cached from picture_mode in hblank + uint32 dot_clock_ratio; // Cached from picture mode in hblank + int32 clock_divider; + + int32 vdc_event[2]; + + + uint32 raster_counter; + + uint16 palette_rw_offset; // Read/write offset + uint16 palette_rw_latch; + + uint16 palette_offset[4]; // + // BMG1 and BMG 0 in [1](BMG1 in upper 8 bits, BMG0 in lower), BMG2 and 3 in [2] + // RAINBOW in lower(?) 8 bits of [3]? + + uint16 palette_table[512]; // The YUV palette, woohoo! + + // Chroma keys, minimum value in lower 8 bits, maximum value in upper 8 bits + uint16 ChromaKeyY; // Register 0xA + uint16 ChromaKeyU; // Register 0xB + uint16 ChromaKeyV; // register 0xC + + uint16 CCR; // Register 0x0D, fixed color register, 16-bit YUV + uint16 BLE; // Register 0x0E, cellophane setting register + // 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 + // F/B |E/D | IDU |CTRL BMG3|CTRL BMG2|CTRL BMG1|CTRL BMG0| VDP SP | VDP BG + // IDU is AKA Rainbow + // F/B + // 0 = Back cellophane. + // 1 = Front cellophane. + // E/D + // 0 = Back/Front cellophane off + // 1 = Back/Front cellophane on + // Ctrl format: + // 00 = Cellophane disabled. + // 01 = Cellophane with 1A/1B(Coeffs 0, 1?) + // 02 = Cellophane with 2A/2B(Coeffs 2, 3?) + // 03 = Cellophane with 3A/3B(Coeffs 4, 5?) + + uint16 SPBL; // Register 0x0F, Sprite cellophane setting register + // Specifies a color palette bank for which cellophane will always be disabled. + + uint16 coefficients[6]; // Cellophane coefficients, YUV, 4-bits each, on the least-significant end(xxxxYYYYUUUUVVVV). + // Valid settings: 0(cellophane disabled for layer), 1-8. 9-F are "unsupported". +} fx_vce_t; + +fx_vce_t fx_vce; + +// +// VCE render cache, including registers cached at hblank +// +typedef struct +{ + uint16 priority[2]; + uint16 picture_mode; + + uint16 palette_offset[4]; + uint32 palette_table_cache[512 * 2]; // 24-bit YUV cache for SPEED(HAH), * 2 to remove need for & 0x1FF in rendering code + + uint16 ChromaKeyY; + uint16 ChromaKeyU; + uint16 ChromaKeyV; + + uint16 CCR; + uint16 BLE; + + uint16 SPBL; + + uint16 coefficients[6]; + + uint8 coefficient_mul_table_y[16][256]; + int8 coefficient_mul_table_uv[16][256]; + + uint32 LayerPriority[8]; // [LAYER_n] = ordered_priority_for_n(real priority 0-15 mapped to 1-7) + // priority = 0, layer is disabled(via the layer enable bit not being set) +} vce_rendercache_t; + +static vce_rendercache_t vce_rendercache; + +static int32 scsicd_ne; + +enum +{ + HPHASE_ACTIVE = 0, + HPHASE_HBLANK_PART1, + HPHASE_HBLANK_PART3, + HPHASE_HBLANK_PART4, + HPHASE_COUNT +}; + +static int32 HPhase; +static int32 HPhaseCounter; +static int32 vdc_lb_pos; + +alignas(8) static uint16 vdc_linebuffers[2][512]; +alignas(8) static uint32 vdc_linebuffer[512]; +alignas(8) static uint32 vdc_linebuffer_yuved[512]; +alignas(8) static uint32 rainbow_linebuffer[256]; + +// 8 * 2 for left + right padding for scrolling +alignas(8) static uint32 bg_linebuffer[256 + 8 + 8]; + + + +// Don't change these enums, there are some hardcoded values still used(particularly, LAYER_NONE). +enum +{ + LAYER_NONE = 0, + LAYER_BG0, + LAYER_BG1, + LAYER_BG2, + LAYER_BG3, + LAYER_VDC_BG, + LAYER_VDC_SPR, + LAYER_RAINBOW +}; + +static uint8 VCEPrioMap[8][8][8][4]; // [n][n][n][3] is dummy, for padding to a power of 2. + +static void BuildCMT(void) +{ + for(int coeff = 0; coeff < 16; coeff++) + { + for(int value = 0; value < 256; value++) + { + vce_rendercache.coefficient_mul_table_y[coeff][value] = (value * coeff / 8); // Y + vce_rendercache.coefficient_mul_table_uv[coeff][value] = ((value - 128) * coeff / 8); // UV + } + } + +} + +static INLINE void RebuildLayerPrioCache(void) +{ + vce_rendercache_t *vr = &vce_rendercache; + + vr->LayerPriority[LAYER_NONE] = 0; + + for(int n = 0; n < 4; n++) + { + if(((fx_vce.picture_mode >> (10 + n)) & 1)) + { + vr->LayerPriority[LAYER_BG0 + n] = (((vce_rendercache.priority[1] >> (n * 4)) & 0xF) + 1); + if(vr->LayerPriority[LAYER_BG0 + n] > 8) + { + printf("KING BG%d Priority Too Large: %d\n", n, vr->LayerPriority[LAYER_BG0 + n] - 1); + vr->LayerPriority[LAYER_BG0 + n] = 0; + } + } + else + vr->LayerPriority[LAYER_BG0 + n] = 0; + } + + if(fx_vce.picture_mode & 0x0100) + { + vr->LayerPriority[LAYER_VDC_BG] = ((vce_rendercache.priority[0] & 0xF) + 1); + if(vr->LayerPriority[LAYER_VDC_BG] > 8) + { + printf("VDC BG Priority Too Large: %d\n", vr->LayerPriority[LAYER_VDC_BG] - 1); + vr->LayerPriority[LAYER_VDC_BG] = 0; + } + } + else + vr->LayerPriority[LAYER_VDC_BG] = 0; + + if(fx_vce.picture_mode & 0x0200) + { + vr->LayerPriority[LAYER_VDC_SPR] = (((vce_rendercache.priority[0] >> 4) & 0xF) + 1); + if(vr->LayerPriority[LAYER_VDC_SPR] > 8) + { + printf("VDC SPR Priority Too Large: %d\n", vr->LayerPriority[LAYER_VDC_SPR] - 1); + vr->LayerPriority[LAYER_VDC_SPR] = 0; + } + } + else + vr->LayerPriority[LAYER_VDC_SPR] = 0; + + if(fx_vce.picture_mode & 0x4000) + { + vr->LayerPriority[LAYER_RAINBOW] = (((vce_rendercache.priority[0] >> 8) & 0xF) + 1); + if(vr->LayerPriority[LAYER_RAINBOW] > 8) + { + printf("RAINBOW Priority Too Large: %d\n", vr->LayerPriority[LAYER_RAINBOW] - 1); + vr->LayerPriority[LAYER_RAINBOW] = 0; + } + } + else + vr->LayerPriority[LAYER_RAINBOW] = 0; + + + // At this point, all entries in vr->LayerPriority should be one of 0 through 8(inclusive). + + int RemapPriority = 1; + bool Done[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + for(unsigned int i = 1; i < (1 + 8); i++) + { + for(int n = 0; n < 4; n++) + { + if(vr->LayerPriority[LAYER_BG0 + n] == i && !Done[LAYER_BG0 + n]) + { + vr->LayerPriority[LAYER_BG0 + n] = RemapPriority++; + Done[LAYER_BG0 + n] = true; + } + } + + if(vr->LayerPriority[LAYER_VDC_BG] == i && !Done[LAYER_VDC_BG]) + { + vr->LayerPriority[LAYER_VDC_BG] = RemapPriority++; + Done[LAYER_VDC_BG] = true; + } + + if(vr->LayerPriority[LAYER_VDC_SPR] == i && !Done[LAYER_VDC_SPR]) + { + vr->LayerPriority[LAYER_VDC_SPR] = RemapPriority++; + Done[LAYER_VDC_SPR] = true; + } + + if(vr->LayerPriority[LAYER_RAINBOW] == i && !Done[LAYER_RAINBOW]) + { + vr->LayerPriority[LAYER_RAINBOW] = RemapPriority++; + Done[LAYER_RAINBOW] = true; + } + } + assert(RemapPriority <= 8); + + //if(fx_vce.raster_counter == 50) + // MDFN_DispMessage("%d BG0: %d %d %d %d, VBG: %d, VSPR: %d, RAIN: %d", vr->LayerPriority[0], vr->LayerPriority[1], vr->LayerPriority[2], vr->LayerPriority[3], + // vr->LayerPriority[4], vr->LayerPriority[5], vr->LayerPriority[6], vr->LayerPriority[7]); +} + +// Call this function in FX VCE hblank(or at the end/immediate start of active display) +static void DoHBlankVCECaching(void) +{ + const fx_vce_t *source = &fx_vce; + vce_rendercache_t *dest = &vce_rendercache; + + dest->picture_mode = source->picture_mode; + + fx_vce.dot_clock = (bool)(fx_vce.picture_mode & 0x08); + fx_vce.dot_clock_ratio = (fx_vce.picture_mode & 0x08) ? 3 : 4; + + for(int i = 0; i < 2; i++) + dest->priority[i] = source->priority[i]; + + + for(int i = 0; i < 4; i++) + dest->palette_offset[i] = source->palette_offset[i]; + + dest->ChromaKeyY = source->ChromaKeyY; + dest->ChromaKeyU = source->ChromaKeyU; + dest->ChromaKeyV = source->ChromaKeyV; + + dest->CCR = source->CCR; + dest->BLE = source->BLE; + dest->SPBL = source->SPBL; + + for(int i = 0; i < 6; i++) + dest->coefficients[i] = source->coefficients[i]; + + RebuildLayerPrioCache(); +} + +static INLINE void RedoPaletteCache(int n) +{ + uint32 YUV = fx_vce.palette_table[n]; + uint8 Y = (YUV >> 8) & 0xFF; + uint8 U = (YUV & 0xF0); + uint8 V = (YUV & 0x0F) << 4; + + vce_rendercache.palette_table_cache[n] = + vce_rendercache.palette_table_cache[0x200 | n] = (Y << 16) | (U << 8) | (V << 0); +} + +enum +{ + BGMODE_INVALID = 0, + BGMODE_4 = 1, + BGMODE_16 = 2, + BGMODE_256 = 3, + BGMODE_64K = 4, + BGMODE_16M = 5, + BGMODE_64K_EXTDOT = 6, + BGMODE_16M_EXTDOT = 7, +}; + +typedef struct +{ + uint8 AR; + + uint32 KRAMRA, KRAMWA; + uint8 KRAM_Mode; + + uint32 PageSetting; + uint16 *RainbowPagePtr, *DMAPagePtr; // Calculated off of PageSetting + + uint16 bgmode; // 4 bits each BG: 3333 2222 1111 0000 + /* Possible settings: + 0x0: Invalid? + 0x1: 4-color palette, 1 byte for 4 pixels, transparent on entry 0 + 0x2: 16-color palette, 1 byte for 2 pixels, transparent on entry 0 + 0x3: 256-color palette, 1 byte for 1 pixel, transparent on entry 0 + 0x4: 64K color(Y-8, U-4, V-4), 1 halfword for 1 pixel, transparent on Y=0 + 0x5: 16M colors(Y-8, Y-8, U-8, V-8, 4 bytes for 2 pixels), transparent on Y=0 + + If & 8, enable palette bank mode(only for 4 and 16-colors)??? + BAT format would be PPPPCCCCCCCCCCCC in this mode. + 4 color: 00PPPPnn 16 color: PPPPnnnn, where "n" is the 2 or 4-bit pixel data + */ + uint16 priority; + + uint16 BGScrollMode; // Register 0x16 + uint16 BGSize[4]; + + uint8 BGBATAddr[4]; + uint8 BGCGAddr[4]; + uint8 BG0SubBATAddr, BG0SubCGAddr; + + uint16 BGXScroll[4]; + uint16 BGYScroll[4]; + + uint16 BGAffinA, BGAffinB, BGAffinC, BGAffinD; + uint16 BGAffinCenterX, BGAffinCenterY; + + uint16 ADPCMControl; + uint16 ADPCMBufferMode[2]; + + uint16 ADPCMSAL[2]; + + uint32 ADPCMEndAddress[2]; + uint32 ADPCMPlayAddress[2]; + uint16 ADPCMIntermediateAddress[2]; + uint16 ADPCMStatus[2]; // Register 0x53, a bit maimed :) + bool ADPCMIRQPending; + + uint16 RAINBOWTransferControl; // Register 0x40 + uint32 RAINBOWKRAMA; // Register 0x41 + uint16 RAINBOWTransferStartPosition; // Register 0x42, line number(0-262) + uint16 RAINBOWTransferBlockCount; // Register 0x43 + + + bool RAINBOWStartPending; + int32 RAINBOWBusyCount, RAINBOWBlockCount; + + uint16 RasterIRQLine; // Register 0x44 + bool RasterIRQPending; + + uint32 RAINBOWKRAMReadPos; + + bool DMATransferFlipFlop; + uint32 DMATransferAddr; // Register 0x09 + uint32 DMATransferSize; // Register 0x0A + uint16 DMAStatus; // Register 0x0B + uint8 DMALatch; + + + uint16 MPROGControl; // register 0x15 + uint16 MPROGControlCache; + uint16 MPROGAddress; + uint16 MPROGData[0x10]; + + bool DMAInterrupt; + uint8 Reg00; + uint8 Reg01; + uint8 Reg02; + uint8 Reg03; + + + uint8 SubChannelControl; + + bool CDInterrupt, SubChannelInterrupt; + uint8 SubChannelBuf; + uint8 data_cache; + + bool DRQ; + bool dma_receive_active; + bool dma_send_active; + int32 dma_cycle_counter; + int32 lastts; + + + uint16 KRAM[2][262144]; + + #define KING_MAGIC_INTERVAL 10 //4 //32 //10 +} king_t; + +static king_t *king = NULL; + +static uint8 BGLayerDisable; +static bool RAINBOWLayerDisable; + +static void RedoKINGIRQCheck(void); + +static INLINE void REGSETP(uint16 ®, const uint8 data, const bool msb) +{ + reg &= 0xFF << (msb ? 0 : 8); + reg |= data << (msb ? 8 : 0); +} + +#ifdef WANT_DEBUGGER +static bool KRAMReadBPE = FALSE; +static bool KRAMWriteBPE = FALSE; + +void KING_NotifyOfBPE(bool read, bool write) +{ + KRAMReadBPE = read; + KRAMWriteBPE = write; + + //FXVDC_SetAux0BPBpase(fx_vdc_chips[0], (read || write) ? 0x80000 : ~0); + //FXVDC_SetAux0BPBpase(fx_vdc_chips[1], (read || write) ? 0x90000 : ~0); +} + +static void (*KINGLog)(const char *, const char *, ...) = NULL; +void KING_SetLogFunc(void (*logfunc)(const char *, const char *, ...)) +{ + KINGLog = logfunc; +} + +static MDFN_Surface *GfxDecode_Buf = NULL; +static int GfxDecode_Line = -1; +static int GfxDecode_Layer = 0; +static int GfxDecode_Scroll = 0; +static int GfxDecode_PBN = 0; +static void DoGfxDecode(void); + +uint8 KING_MemPeek(uint32 A) +{ + uint8 ret = king->KRAM[(A & 0x80000) ? 1 : 0][A >> 1] >> ((A & 1) * 8); + + return(ret); +} + +static void Do16BitGet(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + int wc = 0; + + if(!strcmp(name, "vdcvram0")) + wc = 0; + else if(!strcmp(name, "vdcvram1")) + wc = 1; + + while(Length) + { + uint16 data; + + data = fx_vdc_chips[wc & 1]->PeekVRAM((Address >> 1) & 0xFFFF); + + if((Address & 1) || Length == 1) + { + *Buffer = data >> ((Address & 1) << 3); + Buffer++; + Address++; + Length--; + } + else + { + Buffer[0] = data & 0xFF; + Buffer[1] = data >> 8; + + Buffer += 2; + Address += 2; + Length -= 2; + } + } +} + +static void Do16BitPut(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + int wc = 0; + + if(!strcmp(name, "vdcvram0")) + wc = 0; + else if(!strcmp(name, "vdcvram1")) + wc = 1; + + while(Length) + { + uint16 data; + int inc_amount; + + if((Address & 1) || Length == 1) + { + data = fx_vdc_chips[wc & 1]->PeekVRAM((Address >> 1) & 0xFFFF); + + data &= ~(0xFF << ((Address & 1) << 3)); + data |= *Buffer << ((Address & 1) << 3); + + inc_amount = 1; + } + else + { + data = Buffer[0] | (Buffer[1] << 8); + inc_amount = 2; + } + + fx_vdc_chips[wc & 1]->PokeVRAM((Address >> 1) & 0xFFFF, data); + + Buffer += inc_amount; + Address += inc_amount; + Length -= inc_amount; + } +} + +static void KING_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "kram0") || !strcmp(name, "kram1")) + { + int wk = name[4] - '0'; + + while(Length--) + { + *Buffer = king->KRAM[wk][(Address >> 1) & 0x3ffff] >> ((Address & 1) * 8); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "vce")) + { + while(Length--) + { + Address &= 0x3FF; + *Buffer = fx_vce.palette_table[Address >> 1] >> ((Address & 1) * 8); + Address++; + Buffer++; + } + } +} + +static void KING_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "kram0") || !strcmp(name, "kram1")) + { + int wk = name[4] - '0'; + + while(Length--) + { + REGSETP(king->KRAM[wk][(Address >> 1) & 0x3ffff], *Buffer, Address & 1); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "vce")) + { + while(Length--) + { + Address &= 0x3FF; + REGSETP(fx_vce.palette_table[Address >> 1], *Buffer, Address & 1); + RedoPaletteCache(Address >> 1); + Address++; + Buffer++; + } + } +} +#endif + +static void RecalcKRAMPagePtrs(void) +{ + king->RainbowPagePtr = king->KRAM[(king->PageSetting & 0x1000) ? 1 : 0]; + king->DMAPagePtr = king->KRAM[king->PageSetting & 1]; +} + +uint8 KING_RB_Fetch(void) +{ + uint8 ret = king->RainbowPagePtr[(king->RAINBOWKRAMReadPos >> 1) & 0x3FFFF] >> ((king->RAINBOWKRAMReadPos & 1) * 8); + + king->RAINBOWKRAMReadPos = ((king->RAINBOWKRAMReadPos + 1) & 0x3FFFF) | (king->RAINBOWKRAMReadPos & 0x40000); + + return(ret); +} + +static void DoRealDMA(uint8 db) +{ + if(!king->DMATransferFlipFlop) + king->DMALatch = db; + else + { + king->DMAPagePtr[king->DMATransferAddr & 0x3FFFF] = king->DMALatch | (db << 8); + king->DMATransferAddr = ((king->DMATransferAddr + 1) & 0x1FFFF) | (king->DMATransferAddr & 0x20000); + king->DMATransferSize = (king->DMATransferSize - 2) & 0x3FFFF; + if(!king->DMATransferSize) + { + KINGDBG("DMA Done\n"); + king->DMAInterrupt = TRUE; + RedoKINGIRQCheck(); + king->DMAStatus &= ~1; + return; + } + } + king->DMATransferFlipFlop ^= 1; +} + +uint16 FXVCE_Read16(uint32 A) +{ + // bit 4-0: Register number + // bit 13-5: Raster counter + // bit 14: In interlace mode and when on odd fields set bit. + // bit 15: "0" during blanking(h or v), "1" during active screen area + // Raster counter increments a few cycles after the start of hblank. + + if(!(A & 0x4)) + { + uint16 fullret = 0; + + fullret |= fx_vce.AR; + fullret |= fx_vce.odd_field ? 0x4000 : 0x0000; + fullret |= fx_vce.raster_counter << 5; + + if(fx_vce.in_hblank || fx_vce.raster_counter < 22 || fx_vce.raster_counter == 262) + fullret |= 0 << 15; // Clear on blanking + else + fullret |= 1 << 15; // Set on active display. + + return(fullret); + } + else + { + switch(fx_vce.AR) // No idea which registers are readable, so make them all readable :b + { + default: break; + case 0x00: return(fx_vce.picture_mode); + case 0x01: return(fx_vce.palette_rw_offset); + case 0x03: // Boundary Gate reads from 0x03 expecting palette data... + case 0x02: + { + uint16 ret = fx_vce.palette_rw_latch; + fx_vce.palette_rw_offset = (fx_vce.palette_rw_offset + 1) & 0x1FF; + fx_vce.palette_rw_latch = fx_vce.palette_table[fx_vce.palette_rw_offset]; + return(ret); + } + case 0x04: return(fx_vce.palette_offset[0]); + case 0x05: return(fx_vce.palette_offset[1]); + case 0x06: return(fx_vce.palette_offset[2]); + case 0x07: return(fx_vce.palette_offset[3]); + case 0x08: return(fx_vce.priority[0]); + case 0x09: return(fx_vce.priority[1]); + case 0x0a: return(fx_vce.ChromaKeyY); + case 0x0b: return(fx_vce.ChromaKeyU); + case 0x0c: return(fx_vce.ChromaKeyV); + + case 0x0d: return(fx_vce.CCR); + case 0x0e: return(fx_vce.BLE); + case 0x0f: return(fx_vce.SPBL); + case 0x10: return(fx_vce.coefficients[0]); + case 0x11: return(fx_vce.coefficients[1]); + + case 0x12: return(fx_vce.coefficients[2]); + case 0x13: return(fx_vce.coefficients[3]); + + case 0x14: return(fx_vce.coefficients[4]); + case 0x15: return(fx_vce.coefficients[5]); + } + } + + return(0); +} + +void FXVCE_Write16(uint32 A, uint16 V) +{ + if(!(A & 0x4)) + { + fx_vce.AR = V & 0x1F; + } + else + { + switch(fx_vce.AR) + { + case 0x00: fx_vce.picture_mode = V; + break; + + case 0x01: fx_vce.palette_rw_offset = V & 0x1FF; + fx_vce.palette_rw_latch = fx_vce.palette_table[fx_vce.palette_rw_offset]; + break; + + case 0x02: fx_vce.palette_rw_latch = V; + fx_vce.palette_table[fx_vce.palette_rw_offset] = fx_vce.palette_rw_latch; + RedoPaletteCache(fx_vce.palette_rw_offset); + fx_vce.palette_rw_offset = (fx_vce.palette_rw_offset + 1) & 0x1FF; + break; + + case 0x04: fx_vce.palette_offset[0] = V; break; + case 0x05: fx_vce.palette_offset[1] = V; break; + case 0x06: fx_vce.palette_offset[2] = V; break; + case 0x07: fx_vce.palette_offset[3] = V & 0x00FF; break; + case 0x08: fx_vce.priority[0] = V & 0x0777; break; + case 0x09: fx_vce.priority[1] = V & 0x7777; break; + + case 0x0a: fx_vce.ChromaKeyY = V; break; + case 0x0b: fx_vce.ChromaKeyU = V; break; + case 0x0c: fx_vce.ChromaKeyV = V; break; + + case 0x0d: fx_vce.CCR = V; break; + case 0x0e: fx_vce.BLE = V; break; + case 0x0f: fx_vce.SPBL = V; break; + + case 0x10: fx_vce.coefficients[0] = V & 0xFFF; break; + case 0x11: fx_vce.coefficients[1] = V & 0xFFF; break; + + case 0x12: fx_vce.coefficients[2] = V & 0xFFF; break; + case 0x13: fx_vce.coefficients[3] = V & 0xFFF; break; + + case 0x14: fx_vce.coefficients[4] = V & 0xFFF; break; + case 0x15: fx_vce.coefficients[5] = V & 0xFFF; break; + } + } +} + +static void RedoKINGIRQCheck(void) +{ + bool asserted = 0; + + if(king->ADPCMIRQPending) + { + asserted = 1; + } + + if(king->DMAInterrupt && (king->DMAStatus & 0x2)) + { + asserted = 1; + } + + if(king->CDInterrupt) + { + asserted = 1; + } + + if(king->SubChannelInterrupt) + asserted = 1; + + if(king->RasterIRQPending) + asserted = 1; + + PCFXIRQ_Assert(PCFXIRQ_SOURCE_KING, asserted); +} + +void KING_CDIRQ(int type) +{ + if(type == SCSICD_IRQ_MAGICAL_REQ) + { + if(king->Reg02 & 0x2) + { + if(SCSICD_GetIO() != ((king->Reg03 >> 0) & 1) || + SCSICD_GetCD() != ((king->Reg03 >> 1) & 1) || + SCSICD_GetMSG() != ((king->Reg03 >> 2) & 1)) + { + KINGDBG("Phase mismatch interrupt asserted.\n"); + king->CDInterrupt = TRUE; + RedoKINGIRQCheck(); + } + } + } +} + +void KING_StuffSubchannels(uint8 subchannels, int subindex) +{ + if(king->SubChannelControl & 0x1) + { + if(subindex == -2) + king->SubChannelBuf = 0x00; + else if(subindex == -1) + king->SubChannelBuf = 0x80; + else + king->SubChannelBuf = (subchannels & 0x7F); + + if(king->SubChannelControl & 0x2) + { + king->SubChannelInterrupt = TRUE; + RedoKINGIRQCheck(); + } + } + + +} + +uint8 KING_Read8(const v810_timestamp_t timestamp, uint32 A) +{ + uint8 ret = KING_Read16(timestamp, A & ~1) >> ((A & 1) * 8); + + //printf("Read8: %04x\n", A); + return(ret); +} + +void KING_EndFrame(v810_timestamp_t timestamp) +{ + PCFX_SetEvent(PCFX_EVENT_KING, KING_Update(timestamp)); + scsicd_ne = SCSICD_Run(timestamp); +} + +void KING_ResetTS(v810_timestamp_t ts_base) +{ + SCSICD_ResetTS(ts_base); + + king->lastts = ts_base; + + if(king->dma_cycle_counter & 0x40000000) + { + king->dma_cycle_counter = 0x7FFFFFFF; + } +} + +//static INLINE void StartKingMagic(void) +//{ +// king->lastts = v810_timestamp; +// king->dma_cycle_counter = KING_MAGIC_INTERVAL; +// PCFX_SetEvent(PCFX_EVENT_KING, KING_MAGIC_INTERVAL); +//} + +static INLINE int32 CalcNextEvent(int32 next_event) +{ + if(king->dma_cycle_counter < next_event) + next_event = king->dma_cycle_counter; + + if(scsicd_ne < next_event) + next_event = scsicd_ne; + + return(next_event); +} + +static int32 CalcNextExternalEvent(int32 next_event) +{ + // 100 = Hack to make the emulator go faster during CD DMA transfers. + if(king->dma_cycle_counter < next_event) + next_event = 100; //king->dma_cycle_counter; + + if(scsicd_ne < next_event) + next_event = scsicd_ne; + + if(next_event > HPhaseCounter) + next_event = HPhaseCounter; + + //printf("KING: %d %d %d; %d\n", king->dma_cycle_counter, scsicd_ne, HPhaseCounter, next_event); + + for(int chip = 0; chip < 2; chip++) + { + int fwoom = (fx_vce.vdc_event[chip] * fx_vce.dot_clock_ratio - fx_vce.clock_divider); + + if(fwoom < 1) + fwoom = 1; + + if(next_event > fwoom) + next_event = fwoom; + } + + return(next_event); +} + +static void MDFN_FASTCALL KING_RunGfx(int32 clocks); + +v810_timestamp_t MDFN_FASTCALL KING_Update(const v810_timestamp_t timestamp) +{ + int32 clocks = timestamp - king->lastts; + uint32 running_timestamp = king->lastts; + + //printf("KING Run for: %d\n", clocks); + + king->lastts = timestamp; + + KING_RunGfx(clocks); + + while(clocks > 0) + { + int32 chunk_clocks = CalcNextEvent(clocks); + + running_timestamp += chunk_clocks; + clocks -= chunk_clocks; + + scsicd_ne -= chunk_clocks; + if(scsicd_ne <= 0) + scsicd_ne = SCSICD_Run(running_timestamp); + + king->dma_cycle_counter -= chunk_clocks; + if(king->dma_cycle_counter <= 0) + { + //assert(king->dma_receive_active || king->dma_send_active); + king->dma_cycle_counter += KING_MAGIC_INTERVAL; + if(king->dma_receive_active) + { + if(!SCSICD_GetCD() && SCSICD_GetIO()) + { + if(SCSICD_GetREQ() && !SCSICD_GetACK()) + { + if(!king->DRQ) + { + king->DRQ = TRUE; + king->data_cache = SCSICD_GetDB(); + //SCSICD_SetACK(TRUE); + //PCFX_SetEvent(PCFX_EVENT_SCSI, SCSICD_Run(timestamp)); + + if(king->DMAStatus & 0x1) + { + king->DRQ = FALSE; + DoRealDMA(king->data_cache); + SCSICD_SetACK(TRUE); + scsicd_ne = SCSICD_Run(running_timestamp); + } + } + } + else if(SCSICD_GetACK() && !SCSICD_GetREQ()) + { + SCSICD_SetACK(FALSE); + scsicd_ne = SCSICD_Run(running_timestamp); + } + } + } + else if(king->dma_send_active) + { + if(!SCSICD_GetIO()) + { + if(SCSICD_GetREQ() && !SCSICD_GetACK()) + { + if(!king->DRQ) + { + //KINGDBG("Did write: %02x\n", king->data_cache); + SCSICD_SetDB(king->data_cache); + SCSICD_SetACK(TRUE); + scsicd_ne = SCSICD_Run(running_timestamp); + king->DRQ = TRUE; + } + } + else if(SCSICD_GetACK() && !SCSICD_GetREQ()) + { + SCSICD_SetACK(FALSE); + scsicd_ne = SCSICD_Run(running_timestamp); + } + } + } + } + } // end while(clocks > 0) + + return(timestamp + CalcNextExternalEvent(0x4FFFFFFF)); +} + +uint16 KING_Read16(const v810_timestamp_t timestamp, uint32 A) +{ + int msh = A & 2; + uint16 ret = 0; + + KING_Update(timestamp); + + //printf("KRead16: %08x, %d; %04x\n", A, timestamp, king->AR); + + switch(A & 0x704) + { + case 0x600: // ?CDSRP?? AAAAAAAA + // C = 0x4000, SCSI interrupt + // D = 0x2000, DMA IRQ + // S = 0x1000, CD Subchannel IRQ? + // R = 0x0800, Raster IRQ + // P = 0x0400, ADPCM IRQ + + if(!msh) + { + ret = king->AR; + + if(king->ADPCMIRQPending) + ret |= 0x400; + + if(king->SubChannelInterrupt) + ret |= 0x1000; + + // Gaaah, this is probably a hack...Anime Freak FX Vol 4 gets confused and crashes + // if both bits are set at once. + if(king->DMAInterrupt && (king->DMAStatus & 0x2)) + ret |= 0x2000; + else if(king->CDInterrupt) + ret |= 0x4000; + + if(king->RasterIRQPending) + ret |= 0x800; + + king->SubChannelInterrupt = FALSE; + king->RasterIRQPending = FALSE; + RedoKINGIRQCheck(); + } + else + { + ret |= SCSICD_GetSEL() ? 0x02: 0x00; + ret |= SCSICD_GetIO() ? 0x04 : 0x00; + ret |= SCSICD_GetCD() ? 0x08 : 0x00; + ret |= SCSICD_GetMSG() ? 0x10 : 0x00; + ret |= SCSICD_GetREQ() ? 0x20 : 0x00; + ret |= SCSICD_GetBSY() ? 0x40 : 0x00; + ret |= SCSICD_GetRST() ? 0x80 : 0x00; + + ret |= king->SubChannelBuf << 8; + } + break; // status... + + case 0x604: switch(king->AR) + { + default: + KINGDBG("Unknown 16-bit register read: %02x\n", king->AR); + break; + + case 0x00: + ret = SCSICD_GetDB(); + break; + + case 0x01: + ret = REGGETHW(king->Reg01, msh); + break; + + case 0x02: + ret = REGGETHW(king->Reg02, msh); + break; + + case 0x03: + ret = REGGETHW(king->Reg03, msh); + break; + + case 0x04: + if(!msh) + { + ret |= SCSICD_GetSEL() ? 0x02: 0x00; + ret |= SCSICD_GetIO() ? 0x04 : 0x00; + ret |= SCSICD_GetCD() ? 0x08 : 0x00; + ret |= SCSICD_GetMSG() ? 0x10 : 0x00; + ret |= SCSICD_GetREQ() ? 0x20 : 0x00; + ret |= SCSICD_GetBSY() ? 0x40 : 0x00; + ret |= SCSICD_GetRST() ? 0x80 : 0x00; + } + break; + + case 0x05: + if(king->Reg01 & 0x80) + { + ret = 0x00; + break; + } + + if(msh) + { + ret = king->data_cache; + //printf("Fooball: %02x\n", ret); + if(king->dma_receive_active) + { + king->DRQ = FALSE; + SCSICD_SetACK(TRUE); + scsicd_ne = 1; + } + } + else + { + ret |= SCSICD_GetACK() ? 0x01 : 0x00; + ret |= SCSICD_GetATN() ? 0x02 : 0x00; + + if(king->dma_receive_active || king->dma_send_active) + if(king->DRQ) + ret |= 0x40; + + // Gaaah, this is probably a hack...Anime Freak FX Vol 4 gets confused and crashes + // if both bits are set at once. + if(!king->DMAInterrupt) + ret |= king->CDInterrupt ? 0x10 : 0x00; + + if(SCSICD_GetIO() == ((king->Reg03 >> 0) & 1) && + SCSICD_GetCD() == ((king->Reg03 >> 1) & 1) && + SCSICD_GetMSG() == ((king->Reg03 >> 2) & 1)) + { + ret |= 0x8; // Phase match + } + } + break; + + case 0x06: // SCSI Input Data Register, same value returned as reading D16-D23 of register 0x05? + KINGDBG("Input data for...?\n"); + ret = king->data_cache; + break; + + case 0x07: + // SCSI IRQ acknowledge/reset + KINGDBG("SCSI IRQ acknowledge\n"); + king->CDInterrupt = FALSE; + RedoKINGIRQCheck(); + ret = 0xFF; + break; + + case 0x08: // Sub-channel data + if(!msh) + { + ret = king->SubChannelBuf; + king->SubChannelBuf = 0; + //puts("Sub-channel data read."); + } + break; + + case 0x09: + ret = REGGETHW(king->DMATransferAddr, msh); + break; + + case 0x0A: + ret = REGGETHW(king->DMATransferSize, msh); + break; + + case 0x0B: // Value read in the BIOS always seems to be discarded... DMA IRQ acknowledge? + if(!msh) + { + ret = king->DMAInterrupt ? 1 : 0; + KINGDBG("DMA IRQ Acknowledge: %d\n", ret); + king->DMAInterrupt = 0; + RedoKINGIRQCheck(); + } + break; + + case 0x0C: + ret = REGGETHW(king->KRAMRA, msh); + break; + + case 0x0D: + ret = REGGETHW(king->KRAMWA, msh); + break; + + case 0x0E: + { + unsigned int page = (king->KRAMRA & 0x80000000) ? 1 : 0; + int32 inc_amount = ((int32)((king->KRAMRA & (0x3FF << 18)) << 4)) >> 22; // Convert from 10-bit signed 2's complement + + ret = king->KRAM[page][king->KRAMRA & 0x3FFFF]; + + #ifdef WANT_DEBUGGER + if(KRAMReadBPE) + PCFXDBG_CheckBP(BPOINT_AUX_READ, (king->KRAMRA & 0x3FFFF) | (page ? 0x40000 : 0), 0, 1); + #endif + + king->KRAMRA = (king->KRAMRA &~ 0x1FFFF) | ((king->KRAMRA + inc_amount) & 0x1FFFF); + } + break; + + case 0x0F: ret = king->PageSetting; + break; + + case 0x10: ret = REGGETHW(king->bgmode, msh); + break; + + case 0x15: ret = king->MPROGControl; + break; + + //case 0x40: break; // Super Power League FX reads this, but I think it's write-only. + + case 0x53: + { + ret = king->ADPCMStatus[0] | (king->ADPCMStatus[1] << 2); + + king->ADPCMStatus[0] = king->ADPCMStatus[1] = 0; + king->ADPCMIRQPending = 0; + + RedoKINGIRQCheck(); + + ADPCMDBG("Status read: %02x\n", ret); + } + break; + } + break; + + } + + PCFX_SetEvent(PCFX_EVENT_KING, timestamp + CalcNextExternalEvent(0x4FFFFFFF)); // TODO: Optimize this to only be called when necessary. + + return(ret); +} + +void KING_Write8(const v810_timestamp_t timestamp, uint32 A, uint8 V) +{ + KING_Write16(timestamp, A & 0x706, V << ((A & 1) ? 8 : 0)); +} + +static INLINE void SCSI_Reg0_Write(const v810_timestamp_t timestamp, uint8 V, bool delay_run = 0) +{ + king->Reg00 = V; + SCSICD_SetDB(V); + + KINGDBG("WriteDB: %02x\n", V); + + if(!delay_run) + { + scsicd_ne = 1; //SCSICD_Run(timestamp); + } +} + +static INLINE void SCSI_Reg2_Write(const v810_timestamp_t timestamp, uint8 V, bool delay_run = 0) +{ + KINGDBG("SCSI Mode: %04x\n", V); + + /* SCSI Mode Register + D0 = SED: When using with sequential DMA mode, you use. + (It sets the normal DMA mode time to "0".) + Sequential DMA, the number of transfer data bytes which are set to the SCSI device (m) HuC6272 (REG.A) the number + of transfer bytes (n) it sets more largely, abbreviates the status message command phase after the n byte + transferring and being something which makes the transfer after the n + 1 byte possible, it is possible to + increase the transfer performance from the slow SCSI device of CD-ROM and the like. + Sequential DMA cannot use with imitation DMA. When this bit is designated as 1, because -ACK the signal + mandatorily ネゲート it is done, other than the stipulated sequence please do not use. + + D1 = DMA Mode: + When using the SCSI control section with normal DMA mode, "1" is set. + */ + if(!(V & 0x2) && (king->Reg02 & 0x2)) + { + + { // HACK(probably) + king->CDInterrupt = FALSE; + RedoKINGIRQCheck(); + } + + SCSICD_SetACK(0); + + if(!delay_run) + { + scsicd_ne = 1; //SCSICD_Run(timestamp); + } + king->DRQ = FALSE; + + king->dma_receive_active = FALSE; + king->dma_send_active = FALSE; + king->dma_cycle_counter = 0x7FFFFFFF; + } + + king->Reg02 = V; +} + +static INLINE void SCSI_Reg3_Write(const v810_timestamp_t timestamp, uint8 V, bool delay_run = 0) +{ + KINGDBG("Set phase match SCSI bus bits: IO: %d, CD: %d, MSG: %d\n", (int)(bool)(V & 1), (int)(bool)(V & 2), (int)(bool)(V & 4)); + king->Reg03 = V & 0x7; + + if(!delay_run) + { + scsicd_ne = 1; //SCSICD_Run(timestamp); + } +} + +void KING_Write16(const v810_timestamp_t timestamp, uint32 A, uint16 V) +{ + int msh = A & 0x2; + + //printf("Write16: %08x %04x\n", A, V); + + + if(!(A & 0x4)) + { + if(!msh) + king->AR = V & 0x7F; + } + else + { + //if(king->AR != 0x0E) + // printf("KING: %02x %04x, %d\n", king->AR, V, fx_vce.raster_counter); + KING_Update(timestamp); + + if(king->AR >= 0x50 && king->AR <= 0x5E) + { + //ADPCMDBG("Write: %02x(%d), %04x", king->AR, msh, V); + } + + switch(king->AR) + { + default: + KINGDBG("Unknown 16-bit register write: %02x %04x %d\n", king->AR, V, msh); + break; + + case 0x00: if(king->Reg01 & 0x80) + break; + + if(!msh) + { + SCSI_Reg0_Write(timestamp, V); + } + break; + + case 0x01: if(!msh) + { + KINGDBG("Set SCSI BUS bits; Assert DB: %d, ATN: %d, SEL: %d, ACK: %d, RST: %d, %02x\n", + (int)(bool)(V & 1), (int)(bool)(V & 2), (int)(bool)(V & 4), + (int)(bool)(V & 0x10), (int)(bool)(V &0x80), SCSICD_GetDB()); + + if(V & 0x80) // RST, silly KING, resets SCSI internal control registers too! + { + if(!(king->Reg01 & 0x80)) + { + SCSI_Reg0_Write(timestamp, 0, TRUE); + SCSI_Reg2_Write(timestamp, 0, TRUE); + SCSI_Reg3_Write(timestamp, 0, TRUE); + king->data_cache = 0x00; + + //king->CDInterrupt = true; + //RedoKINGIRQCheck(); + //puts("KING RST IRQ"); + } + + king->Reg01 = V & 0x80; // Only this bit remains...how lonely. + } + else + { + king->Reg01 = V & (1 | 2 | 4 | 0x10 | 0x80); + + SCSICD_SetATN(V & 2); + SCSICD_SetSEL(V & 4); + SCSICD_SetACK(V & 0x10); + } + SCSICD_SetRST(V & 0x80); + scsicd_ne = 1; + } + break; + + case 0x02: if(king->Reg01 & 0x80) + break; + + if(!msh) + { + SCSI_Reg2_Write(timestamp, V); + } + break; + + case 0x03: if(king->Reg01 & 0x80) + break; + + if(!msh) + { + SCSI_Reg3_Write(timestamp, V); + } + break; + + case 0x05: if(king->Reg01 & 0x80) + break; + + if(!msh) // Start DMA target receive + { + KINGDBG("DMA target receive: %04x, %d\n", V, msh); + king->dma_receive_active = FALSE; + king->dma_send_active = TRUE; + king->DRQ = TRUE; + //StartKingMagic(); + king->dma_cycle_counter = KING_MAGIC_INTERVAL; + } + else + { + if(king->dma_send_active && king->DRQ) + { + //KINGDBG("%02x\n", V); + king->data_cache = V; + king->DRQ = FALSE; + } + } + break; + + case 0x06: break; // Not used for writes? + + case 0x07: if(king->Reg01 & 0x80) + break; + + KINGDBG("Start DMA initiator receive: %04x\n", V); + + if(king->Reg02 & 0x2) + { + king->dma_receive_active = TRUE; + king->dma_send_active = FALSE; + //StartKingMagic(); + king->dma_cycle_counter = KING_MAGIC_INTERVAL; + } + break; + + case 0x08: // Sub-channel control + KINGDBG("Sub-channel control: %02x\n", V); + + king->SubChannelControl = V & 0x3; + king->SubChannelInterrupt = FALSE; + RedoKINGIRQCheck(); + break; + + case 0x09: REGSETHW(king->DMATransferAddr, V, msh); king->DMATransferAddr &= 0x3FFFF; break; + case 0x0A: REGSETHW(king->DMATransferSize, V, msh); king->DMATransferSize &= 0x3FFFE; king->DMATransferFlipFlop = 0; break; + case 0x0B: REGSETHW(king->DMAStatus, V, msh); + king->DMAStatus &= 0x3; + king->DMAInterrupt = 0; + RedoKINGIRQCheck(); + + king->DMATransferFlipFlop = 0; + + KINGDBG("SCSI DMA: %04x, dest=%06x, page=%d, size=%06x(16-bit words)\n", V, king->DMATransferAddr, king->PageSetting & 1, king->DMATransferSize >> 1); + + #ifdef WANT_DEBUGGER + if(KINGLog) + { + //if(V & 1) + // KINGLog("KING", "SCSI DMA: dest=%06x, page=%d, size=%06x(16-bit words)", king->DMATransferAddr, king->PageSetting & 1, king->DMATransferSize >> 1); + } + #endif + break; + case 0x0C: REGSETHW(king->KRAMRA, V, msh); break; + case 0x0D: REGSETHW(king->KRAMWA, V, msh); break; + case 0x0E: + { + unsigned int page = (king->KRAMWA & 0x80000000) ? 1 : 0; + int32 inc_amount = ((int32)((king->KRAMWA & (0x3FF << 18)) << 4)) >> 22; // Convert from 10-bit signed 2's complement + + #ifdef WANT_DEBUGGER + if(KRAMWriteBPE) + PCFXDBG_CheckBP(BPOINT_AUX_WRITE, (king->KRAMWA & 0x3FFFF) | (page ? 0x40000 : 0), V, 1); + #endif + + king->KRAM[page][king->KRAMWA & 0x3FFFF] = V; + king->KRAMWA = (king->KRAMWA &~ 0x1FFFF) | ((king->KRAMWA + inc_amount) & 0x1FFFF); + } + break; + + + // Page settings(0/1) for BG, DMA, ADPCM, and RAINBOW transfers. + case 0x0F: REGSETHW(king->PageSetting, V, msh); + RecalcKRAMPagePtrs(); + break; + + + // Background Modes + case 0x10: REGSETHW(king->bgmode, V, msh); + break; + + + // Background priorities and affine transform master enable. + case 0x12: if(!msh) + { + king->priority = V; + if(king->priority & ~0x1FFF) + { + KING_UNDEF("Invalid priority bits set: %04x\n", king->priority); + } + } + break; + + + // Microprogram Address + case 0x13: if(!msh) + { + king->MPROGAddress = V & 0xF; + } + break; + + + // Microprogram Data Port + case 0x14: if(!msh) + { + king->MPROGData[king->MPROGAddress] = V; + king->MPROGAddress = (king->MPROGAddress + 1) & 0xF; + } + break; + + case 0x15: REGSETHW(king->MPROGControl, V, msh); king->MPROGControl &= 0x1; break; + + case 0x16: REGSETHW(king->BGScrollMode, V, msh); king->BGScrollMode &= 0xF; break; + + case 0x20: REGSETHW(king->BGBATAddr[0], V, msh); break; + case 0x21: REGSETHW(king->BGCGAddr[0], V, msh); break; + case 0x22: REGSETHW(king->BG0SubBATAddr, V, msh); break; + case 0x23: REGSETHW(king->BG0SubCGAddr, V, msh); break; + + case 0x24: REGSETHW(king->BGBATAddr[1], V, msh); break; + case 0x25: REGSETHW(king->BGCGAddr[1], V, msh); break; + case 0x28: REGSETHW(king->BGBATAddr[2], V, msh); break; + case 0x29: REGSETHW(king->BGCGAddr[2], V, msh); break; + case 0x2A: REGSETHW(king->BGBATAddr[3], V, msh); break; + case 0x2B: REGSETHW(king->BGCGAddr[3], V, msh); break; + + case 0x2C: REGSETHW(king->BGSize[0], V, msh); break; + case 0x2D: REGSETHW(king->BGSize[1], V, msh); king->BGSize[1] &= 0x00FF; break; + case 0x2E: REGSETHW(king->BGSize[2], V, msh); king->BGSize[2] &= 0x00FF; break; + case 0x2F: REGSETHW(king->BGSize[3], V, msh); king->BGSize[3] &= 0x00FF; break; + + case 0x30: REGSETHW(king->BGXScroll[0], V, msh); king->BGXScroll[0] &= 0x7FF; break; + case 0x31: REGSETHW(king->BGYScroll[0], V, msh); king->BGYScroll[0] &= 0x7FF; break; + + case 0x32: REGSETHW(king->BGXScroll[1], V, msh); king->BGXScroll[1] &= 0x3FF; break; + case 0x33: REGSETHW(king->BGYScroll[1], V, msh); king->BGYScroll[1] &= 0x3FF; break; + + case 0x34: REGSETHW(king->BGXScroll[2], V, msh); king->BGXScroll[2] &= 0x3FF; break; + case 0x35: REGSETHW(king->BGYScroll[2], V, msh); king->BGYScroll[2] &= 0x3FF; break; + + case 0x36: REGSETHW(king->BGXScroll[3], V, msh); king->BGXScroll[3] &= 0x3FF; break; + case 0x37: REGSETHW(king->BGYScroll[3], V, msh); king->BGYScroll[3] &= 0x3FF; break; + + + case 0x38: REGSETHW(king->BGAffinA, V, msh); break; + case 0x39: REGSETHW(king->BGAffinB, V, msh); break; + case 0x3a: REGSETHW(king->BGAffinC, V, msh); break; + case 0x3b: REGSETHW(king->BGAffinD, V, msh); break; + case 0x3c: REGSETHW(king->BGAffinCenterX, V, msh); break; + case 0x3d: REGSETHW(king->BGAffinCenterY, V, msh); break; + + + case 0x40: // ------IE + // I = 1, interrupt enable?? + // E = 1, rainbow transfer enable + if(!msh) + { + king->RAINBOWTransferControl = V & 0x3; + if(!(V & 1)) + { + //if(king->RAINBOWBusyCount || king->RAINBOWBlockCount) + // puts("RAINBOW transfer reset"); + // Not sure if this is completely correct or not. Test cases: "Tonari no Princess Rolfee", (others?) + //king->RAINBOWBusyCount = 0; + //king->RAINBOWBlockCount = 0; + //RAINBOW_ForceTransferReset(); + king->RAINBOWBlockCount = 0; + } + } + king->RasterIRQPending = FALSE; + RedoKINGIRQCheck(); + //printf("Transfer Control: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWTransferControl); + break; + + // Rainbow transfer address + case 0x41: REGSETHW(king->RAINBOWKRAMA, V, msh); + king->RAINBOWKRAMA &= 0x3FFFF; + //printf("KRAM Transfer Addr: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWKRAMA); + break; + + // 0-262 + case 0x42: if(!msh) + { + king->RAINBOWTransferStartPosition = V & 0x1FF; + //fprintf(stderr, "%d\n", king->RAINBOWTransferStartPosition); + //printf("RAINBOW Start Line: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWTransferStartPosition); + } + break; + + case 0x43: REGSETHW(king->RAINBOWTransferBlockCount, V, msh); + king->RAINBOWTransferBlockCount &= 0x1F; + //printf("KRAM Transfer Block Count: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWTransferBlockCount); + break; + + // Raster IRQ line + case 0x44: if(!msh) + { + king->RasterIRQLine = V & 0x1FF; + //printf("Raster IRQ scanline: %d, %08x\n", fx_vce.raster_counter, king->RasterIRQLine); + } + break; + + case 0x50: + if(!msh) + { + for(int ch = 0; ch < 2; ch++) + { + if(!(king->ADPCMControl & (1 << ch)) && (V & (1 << ch))) + { + king->ADPCMPlayAddress[ch] = king->ADPCMSAL[ch] * 256; + } + } + king->ADPCMControl = V; + RedoKINGIRQCheck(); + SoundBox_SetKINGADPCMControl(king->ADPCMControl); + } + break; + + case 0x51: REGSETHW(king->ADPCMBufferMode[0], V, msh); + RedoKINGIRQCheck(); + break; + + case 0x52: REGSETHW(king->ADPCMBufferMode[1], V, msh); + RedoKINGIRQCheck(); + break; + + case 0x58: REGSETHW(king->ADPCMSAL[0], V, msh); king->ADPCMSAL[0] &= 0x3FF; break; + case 0x59: REGSETHW(king->ADPCMEndAddress[0], V, msh); king->ADPCMEndAddress[0] &= 0x3FFFF; break; + case 0x5A: REGSETHW(king->ADPCMIntermediateAddress[0], V, msh); king->ADPCMIntermediateAddress[0] &= 0xFFF; break; + + case 0x5C: REGSETHW(king->ADPCMSAL[1], V, msh); king->ADPCMSAL[1] &= 0x3FF; break; + case 0x5D: REGSETHW(king->ADPCMEndAddress[1], V, msh); king->ADPCMEndAddress[1] &= 0x3FFFF; break; + case 0x5E: REGSETHW(king->ADPCMIntermediateAddress[1], V, msh); king->ADPCMIntermediateAddress[1] &= 0xFFF; break; + + + case 0x61: if(king->KRAM_Mode ^ V) + { + KINGDBG("KRAM Mode Change To: %02x\n", V & 1); + king->KRAM_Mode = V & 0x1; + } + break; + } + + PCFX_SetEvent(PCFX_EVENT_KING, timestamp + CalcNextExternalEvent(0x4FFFFFFF)); // TODO: Optimize this to only be called when necessary. + } +} + +uint16 KING_GetADPCMHalfWord(int ch) +{ + int page = (king->PageSetting & 0x0100) ? 1 : 0; + uint16 ret = king->KRAM[page][king->ADPCMPlayAddress[ch] & 0x3FFFF]; + + king->ADPCMPlayAddress[ch] = (king->ADPCMPlayAddress[ch] & 0x20000) | ((king->ADPCMPlayAddress[ch] + 1) & 0x1FFFF); + + if(!(king->ADPCMPlayAddress[ch] & 0x1FFFF)) + { + ADPCMDBG("Ch %d Wrapped", ch); + } + + if(king->ADPCMPlayAddress[ch] == (((king->ADPCMEndAddress[ch] + 1) & 0x1FFFF) | (king->ADPCMEndAddress[ch] & 0x20000)) ) + { + ADPCMDBG("Ch %d End", ch); + + if(!(king->ADPCMBufferMode[ch] & 1)) + { + king->ADPCMControl &= ~(1 << ch); + SoundBox_SetKINGADPCMControl(king->ADPCMControl); + } + else + { + king->ADPCMPlayAddress[ch] = king->ADPCMSAL[ch] << 8; + } + + king->ADPCMStatus[ch] |= 1; + + if(king->ADPCMBufferMode[ch] & (0x1 << 1)) + { + king->ADPCMIRQPending = TRUE; + RedoKINGIRQCheck(); + } + } + else if(king->ADPCMPlayAddress[ch] == ((uint32)king->ADPCMIntermediateAddress[ch] << 6) ) + { + ADPCMDBG("Ch %d Intermediate", ch); + king->ADPCMStatus[ch] |= 2; + + if(king->ADPCMBufferMode[ch] & (0x2 << 1)) + { + king->ADPCMIRQPending = TRUE; + RedoKINGIRQCheck(); + } + } + + return(ret); +} + +static uint32 HighDotClockWidth; +extern RavenBuffer* FXCDDABufs[2]; // FIXME, externals are evil! + +static void Cleanup(void) +{ + if(king) + { + free(king); + king = NULL; + } + + SCSICD_Close(); +} + +void KING_Init(void) +{ + try + { + king = (king_t*)MDFN_calloc_T(1, sizeof(king_t), _("KING Data")); + + king->lastts = 0; + + HighDotClockWidth = MDFN_GetSettingUI("pcfx.high_dotclock_width"); + BGLayerDisable = 0; + + BuildCMT(); + + // Build VCE priority map. + // Don't change this unless you know what you're doing! + // There may appear to be a bug in the pixel mixing + // code elsewhere, because it accesses this array like [vdc][bg][rainbow], but it's not a bug. + // This multi-dimensional array has no concept of bg, vdc, rainbow, or their orders per-se, it just + // contains priority information for 3 different layers. + + for(int bg_prio = 0; bg_prio < 8; bg_prio++) + for(int vdc_prio = 0; vdc_prio < 8; vdc_prio++) + for(int rainbow_prio = 0; rainbow_prio < 8; rainbow_prio++) + { + int bg_prio_test = bg_prio ? bg_prio : 0x10; + int vdc_prio_test = vdc_prio ? vdc_prio : 0x10; + int rainbow_prio_test = rainbow_prio ? rainbow_prio : 0x10; + + if(bg_prio_test >= 8) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 3; + else + { + if(bg_prio_test < vdc_prio_test && bg_prio_test < rainbow_prio_test) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 0; + else if(bg_prio_test > vdc_prio_test && bg_prio_test > rainbow_prio_test) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 2; + else + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 1; + } + + if(vdc_prio_test >= 8) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 3; + else + { + if(vdc_prio_test < bg_prio_test && vdc_prio_test < rainbow_prio_test) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 0; + else if(vdc_prio_test > bg_prio_test && vdc_prio_test > rainbow_prio_test) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 2; + else + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 1; + } + + if(rainbow_prio_test >= 8) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 3; + else + { + if(rainbow_prio_test < bg_prio_test && rainbow_prio_test < vdc_prio_test) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 0; + else if(rainbow_prio_test > bg_prio_test && rainbow_prio_test > vdc_prio_test) + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 2; + else + VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 1; + } + } + + #ifdef WANT_DEBUGGER + ASpace_Add(KING_GetAddressSpaceBytes, KING_PutAddressSpaceBytes, "kram0", "KRAM Page 0", 19); + ASpace_Add(KING_GetAddressSpaceBytes, KING_PutAddressSpaceBytes, "kram1", "KRAM Page 1", 19); + ASpace_Add(Do16BitGet, Do16BitPut, "vdcvram0", "VDC-A VRAM", 17); + ASpace_Add(Do16BitGet, Do16BitPut, "vdcvram1", "VDC-B VRAM", 17); + ASpace_Add(KING_GetAddressSpaceBytes, KING_PutAddressSpaceBytes, "vce", "VCE Palette RAM", 10); + #endif + + SCSICD_Init(SCSICD_PCFX, 3, FXCDDABufs[0]->Buf(), FXCDDABufs[1]->Buf(), 153600 * MDFN_GetSettingUI("pcfx.cdspeed"), 21477273, KING_CDIRQ, KING_StuffSubchannels); + } + catch(...) + { + Cleanup(); + throw; + } +} + +void KING_Close(void) +{ + Cleanup(); +} + + +void KING_Reset(const v810_timestamp_t timestamp) +{ + KING_Update(timestamp); + + memset(&fx_vce, 0, sizeof(fx_vce)); + + int32 ltssave = king->lastts; + memset(king, 0, sizeof(king_t)); + king->lastts = ltssave; + + king->Reg00 = 0; + king->Reg01 = 0; + king->Reg02 = 0; + king->Reg03 = 0; + king->dma_receive_active = FALSE; + king->dma_send_active = FALSE; + king->dma_cycle_counter = 0x7FFFFFFF; + + + RecalcKRAMPagePtrs(); + + HPhase = HPHASE_HBLANK_PART1; + HPhaseCounter = 1; + vdc_lb_pos = 0; + + memset(vdc_linebuffers, 0, sizeof(vdc_linebuffers)); + memset(vdc_linebuffer, 0, sizeof(vdc_linebuffer)); + memset(vdc_linebuffer_yuved, 0, sizeof(vdc_linebuffer_yuved)); + memset(rainbow_linebuffer, 0, sizeof(rainbow_linebuffer)); + memset(bg_linebuffer, 0, sizeof(bg_linebuffer)); + + + king->dma_cycle_counter = 0x7FFFFFFF; + scsicd_ne = 1; // FIXME + + RedoKINGIRQCheck(); + + for(unsigned int x = 0; x < 0x200; x++) + RedoPaletteCache(x); + + DoHBlankVCECaching(); + + SoundBox_SetKINGADPCMControl(0); + + SCSICD_Power(timestamp); + + memset(king->KRAM, 0xFF, sizeof(king->KRAM)); +} + + +static INLINE void DRAWBG8x1_4(uint32 *target, const uint16 *cg, const uint32 *palette_ptr, const uint32 layer_or) +{ + if(*cg >> 14) target[0] = palette_ptr[(*cg >> 14)] | layer_or; + if((*cg >> 12) & 0x3) target[1] = palette_ptr[((*cg >> 12) & 0x3)] | layer_or; + if((*cg >> 10) & 0x3) target[2] = palette_ptr[((*cg >> 10) & 0x3)] | layer_or; + if((*cg >> 8) & 0x3) target[3] = palette_ptr[((*cg >> 8) & 0x3)] | layer_or; + if((*cg >> 6) & 0x3) target[4] = palette_ptr[((*cg >> 6) & 0x3)] | layer_or; + if((*cg >> 4) & 0x3) target[5] = palette_ptr[((*cg >> 4) & 0x3)] | layer_or; + if((*cg >> 2) & 0x3) target[6] = palette_ptr[((*cg >> 2) & 0x3)] | layer_or; + if((*cg >> 0) & 0x3) target[7] = palette_ptr[((*cg >> 0) & 0x3)] | layer_or; +} + +static INLINE void DRAWBG8x1_16(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) +{ + if(cgptr[0] >> 12) target[0] = palette_ptr[((cgptr[0] >> 12))] | layer_or; + if((cgptr[0] >> 8) & 0xF) target[1] = palette_ptr[(((cgptr[0] >> 8) & 0xF))] | layer_or; + if((cgptr[0] >> 4) & 0xF) target[2] = palette_ptr[(((cgptr[0] >> 4) & 0xF))] | layer_or; + if((cgptr[0] >> 0) & 0xF) target[3] = palette_ptr[(((cgptr[0] >> 0) & 0xF))] | layer_or; + + if(cgptr[1] >> 12) target[4] = palette_ptr[((cgptr[1] >> 12))] | layer_or; + if((cgptr[1] >> 8) & 0xF) target[5] = palette_ptr[(((cgptr[1] >> 8) & 0xF))] | layer_or; + if((cgptr[1] >> 4) & 0xF) target[6] = palette_ptr[(((cgptr[1] >> 4) & 0xF))] | layer_or; + if((cgptr[1] >> 0) & 0xF) target[7] = palette_ptr[(((cgptr[1] >> 0) & 0xF))] | layer_or; +} + +static INLINE void DRAWBG8x1_256(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) +{ + if(cgptr[0] >> 8) target[0] = palette_ptr[(cgptr[0] >> 0x8)] | layer_or; + if(cgptr[0] & 0xFF) target[1] = palette_ptr[(cgptr[0] & 0xFF)] | layer_or; + if(cgptr[1] >> 8) target[2] = palette_ptr[(cgptr[1] >> 0x8)] | layer_or; + if(cgptr[1] & 0xFF) target[3] = palette_ptr[(cgptr[1] & 0xFF)] | layer_or; + if(cgptr[2] >> 8) target[4] = palette_ptr[(cgptr[2] >> 0x8)] | layer_or; + if(cgptr[2] & 0xFF) target[5] = palette_ptr[(cgptr[2] & 0xFF)] | layer_or; + if(cgptr[3] >> 8) target[6] = palette_ptr[(cgptr[3] >> 0x8)] | layer_or; + if(cgptr[3] & 0xFF) target[7] = palette_ptr[(cgptr[3] & 0xFF)] | layer_or; +} + +static INLINE void DRAWBG8x1_64K(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) +{ + if(cgptr[0] & 0xFF00) target[0] = ((cgptr[0x0] & 0x00F0) << 8) | ((cgptr[0] & 0x000F)<<4) | ((cgptr[0] & 0xFF00) << 8) | layer_or; + if(cgptr[1] & 0xFF00) target[1] = ((cgptr[0x1] & 0x00F0) << 8) | ((cgptr[1] & 0x000F)<<4) | ((cgptr[1] & 0xFF00) << 8) | layer_or; + if(cgptr[2] & 0xFF00) target[2] = ((cgptr[0x2] & 0x00F0) << 8) | ((cgptr[2] & 0x000F)<<4) | ((cgptr[2] & 0xFF00) << 8) | layer_or; + if(cgptr[3] & 0xFF00) target[3] = ((cgptr[0x3] & 0x00F0) << 8) | ((cgptr[3] & 0x000F)<<4) | ((cgptr[3] & 0xFF00) << 8) | layer_or; + if(cgptr[4] & 0xFF00) target[4] = ((cgptr[0x4] & 0x00F0) << 8) | ((cgptr[4] & 0x000F)<<4) | ((cgptr[4] & 0xFF00) << 8) | layer_or; + if(cgptr[5] & 0xFF00) target[5] = ((cgptr[0x5] & 0x00F0) << 8) | ((cgptr[5] & 0x000F)<<4) | ((cgptr[5] & 0xFF00) << 8) | layer_or; + if(cgptr[6] & 0xFF00) target[6] = ((cgptr[0x6] & 0x00F0) << 8) | ((cgptr[6] & 0x000F)<<4) | ((cgptr[6] & 0xFF00) << 8) | layer_or; + if(cgptr[7] & 0xFF00) target[7] = ((cgptr[0x7] & 0x00F0) << 8) | ((cgptr[7] & 0x000F)<<4) | ((cgptr[7] & 0xFF00) << 8) | layer_or; +} + +static INLINE void DRAWBG8x1_16M(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) +{ + if(cgptr[0] >> 8) target[0] = ((cgptr[0x0] & 0xFF00) << 8) | (cgptr[1] & 0xFF00) | (cgptr[1] & 0xFF) | layer_or; + if(cgptr[0] & 0xFF) target[1] = ((cgptr[0x0] & 0x00FF) << 16) | (cgptr[1] & 0xFF00) | (cgptr[1] & 0xFF) | layer_or; + if(cgptr[2] >> 8) target[2] = ((cgptr[0x2] & 0xFF00) << 8) | (cgptr[3] & 0xFF00) | (cgptr[3] & 0xFF) | layer_or; + if(cgptr[2] & 0xFF) target[3] = ((cgptr[0x2] & 0x00FF) << 16) | (cgptr[3] & 0xFF00) | (cgptr[3] & 0xFF) | layer_or; + if(cgptr[4] >> 8) target[4] = ((cgptr[0x4] & 0xFF00) << 8) | (cgptr[5] & 0xFF00) | (cgptr[5] & 0xFF) | layer_or; + if(cgptr[4] & 0xFF) target[5] = ((cgptr[0x4] & 0x00FF) << 16) | (cgptr[5] & 0xFF00) | (cgptr[5] & 0xFF) | layer_or; + if(cgptr[6] >> 8) target[6] = ((cgptr[0x6] & 0xFF00) << 8) | (cgptr[7] & 0xFF00) | (cgptr[7] & 0xFF) | layer_or; + if(cgptr[6] & 0xFF) target[7] = ((cgptr[0x6] & 0x00FF) << 16) | (cgptr[7] & 0xFF00) | (cgptr[7] & 0xFF) | layer_or; +} + +static bool bgmode_warning = 0; // Debug + +#include "king-bgfast.inc" + +static INLINE int32 max(int32 a, int32 b) +{ + if(a > b) + return(a); + + return(b); +} + +static void DrawBG(uint32 *target, int n, bool sub) +{ + // Size out-of-bounds behaves as if the size is at its minimum, with caveats(TO BE INVESTIGATED). + const uint32 bg_ss_table[0x10] = + { + 0x3, 0x3, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x3, 0x3, 0x3, 0x3, 0x3 + }; + + const bool bg_ss_invalid_table[0x10] = + { + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 + }; + +#if 0 + const uint32 cg_per_mode[0x8] = + { + 0, // Invalid mode + 1, // 2-bit mode + 2, // 4-bit mode + 4, // 8-bit mode + 8, // 16-bit mode + 8, // 16-bit mode + 8, // 16-bit mode + 8, // 16-bit mode + }; +#endif + const uint32 layer_or = (LAYER_BG0 + n) << 28; + + const uint32 palette_offset = ((fx_vce.palette_offset[1 + (n >> 1)] >> ((n & 1) ? 8 : 0)) << 1) & 0x1FF; + const uint32 *palette_ptr = &vce_rendercache.palette_table_cache[palette_offset]; + const uint32 bat_and_cg_page = (king->PageSetting & 0x0010) ? 1 : 0; + + const uint16 bgmode = (king->bgmode >> (n * 4)) & 0xF; + const bool endless = (king->BGScrollMode >> n) & 0x1; + const uint32 XScroll = sign_x_to_s32((n ? 10 : 11), king->BGXScroll[n]); + const uint32 YScroll = sign_x_to_s32((n ? 10 : 11), king->BGYScroll[n]); + + const uint32 YOffset = (YScroll + (fx_vce.raster_counter - 22)) & 0xFFFF; + + const uint32 bat_offset = king->BGBATAddr[n] * 1024; + const uint32 bat_sub_offset = n ? bat_offset : (king->BG0SubBATAddr * 1024); + const uint16 *bat_base = &king->KRAM[bat_and_cg_page][bat_offset & 0x20000]; + const uint16 *bat_sub_base = &king->KRAM[bat_and_cg_page][bat_sub_offset & 0x20000]; + + const uint32 cg_offset = king->BGCGAddr[n] * 1024; + const uint32 cg_sub_offset = n ? cg_offset : (king->BG0SubCGAddr * 1024); + const uint16 *cg_base = &king->KRAM[bat_and_cg_page][cg_offset & 0x20000]; + const uint16 *cg_sub_base = &king->KRAM[bat_and_cg_page][cg_sub_offset & 0x20000]; + + const int bat_bitsize_mask = 0x7FF >> 3; + + const uint32 bat_width_shift = bg_ss_table[(king->BGSize[n] & 0xF0) >> 4]; + const bool bat_width_invalid = bg_ss_invalid_table[(king->BGSize[n] & 0xF0) >> 4]; + const uint32 bat_width = (1 << bat_width_shift) >> 3; + + const int32 bat_height_shift = bg_ss_table[king->BGSize[n] & 0x0F]; + //const bool bat_height_invalid = bg_ss_invalid_table[king->BGSize[n] & 0x0F]; + const int32 bat_height = (1 << bat_height_shift) >> 3; + + const bool bat_sub_width_invalid = n ? bat_width_invalid : bg_ss_invalid_table[(king->BGSize[n] & 0xF000) >> 12]; + const uint32 bat_sub_width_shift = n ? bat_width_shift : bg_ss_table[(king->BGSize[n] & 0xF000) >> 12]; + const uint32 bat_sub_width = (1 << bat_sub_width_shift) >> 3; + const uint32 bat_sub_width_mask = bat_sub_width - 1; + const uint32 bat_sub_width_test = endless ? (bat_bitsize_mask + 1) : max(bat_width, bat_sub_width); + + const int32 bat_sub_height_shift = n ? bat_height_shift : bg_ss_table[(king->BGSize[n] & 0x0F00) >> 8]; + const int32 bat_sub_height = (1 << bat_sub_height_shift) >> 3; + const int32 bat_sub_height_mask = bat_sub_height - 1; + const int32 bat_sub_height_test = endless ? (bat_bitsize_mask + 1) : max(bat_height, bat_sub_height); + + uint16 cg_mask[8]; + uint16 cg_remap[8]; + bool cg_ofbat[8]; + + uint16 cg_sub_mask[8]; + uint16 cg_sub_remap[8]; + bool cg_sub_ofbat[8]; + + bool BATFetchCycle = FALSE; + bool BATSubFetchCycle = FALSE; + + const bool rotate_mode = (n == 0) && (king->priority & 0x1000); + + // If the bg mode is invalid, don't draw this layer, duuhhhh + if(!(bgmode & 0x7)) + return; + + if((bgmode & 0x7) >= 6) + { + if(!bgmode_warning) + { + printf("Unsupported KING BG Mode for KING BG %d: %02x\n", n, bgmode); + bgmode_warning = TRUE; + } + return; + } + + memset(cg_mask, 0, sizeof(cg_mask)); + memset(cg_remap, 0, sizeof(cg_remap)); + memset(cg_ofbat, 0, sizeof(cg_ofbat)); + memset(cg_sub_mask, 0, sizeof(cg_sub_mask)); + memset(cg_sub_remap, 0, sizeof(cg_sub_remap)); + memset(cg_sub_ofbat, 0, sizeof(cg_sub_ofbat)); + + if(king->MPROGControl & 0x1) + { + int remap_thing = 0; + int remap_sub_thing = 0; + + for(int x = 0; x < 8; x++) + { + uint16 mpd; + + // Forcing CG and BAT to 0 if the affine bit != rotate_mode is not technically correct. + // If there is a mismatch, it's more likely the effective CG and BAT address for the pixel/segment + // being drawn won't be calculated correctly, likely being just the initial offsets. + + mpd = king->MPROGData[((cg_offset & 0x20000) ? 0x8 : 0x0) + x]; + if(((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && !(mpd & 0x010)) + { + cg_mask[remap_thing] = 0xFFFF; + cg_remap[remap_thing] = mpd & 0x7; + cg_ofbat[remap_thing] = mpd & 0x8; + + if((bool)(mpd & 0x20) != rotate_mode) + { + KINGDBG("Affine bit != rotate_mode?"); + cg_mask[remap_thing] = 0; + } + remap_thing++; + } + + mpd = king->MPROGData[((cg_sub_offset & 0x20000) ? 0x8 : 0x0) + x]; + if(((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && !(mpd & 0x010)) + { + cg_sub_mask[remap_sub_thing] = 0xFFFF; + cg_sub_remap[remap_sub_thing] = mpd & 0x7; + cg_sub_ofbat[remap_sub_thing] = mpd & 0x8; + + if((bool)(mpd & 0x20) != rotate_mode) + { + KINGDBG("Affine bit != rotate_mode? (SUB)"); + cg_sub_mask[remap_sub_thing] = 0; + } + remap_sub_thing++; + } + } + + for(int x = 0; x < 8; x++) + { + uint16 mpd; + + mpd = king->MPROGData[((bat_offset & 0x20000) ? 0x8 : 0x0) + x]; + if(((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && (mpd & 0x010) && (bool)(mpd & 0x020) == rotate_mode) + BATFetchCycle = TRUE; + + mpd = king->MPROGData[((bat_sub_offset & 0x20000) ? 0x8 : 0x0) + x]; + if(((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && (mpd & 0x010) && (bool)(mpd & 0x020) == rotate_mode) + BATSubFetchCycle = TRUE; + } + } + + int bat_y = (YOffset >> 3) & bat_bitsize_mask; + uint32 bat_x = (XScroll >> 3) & bat_bitsize_mask; + int ysmall = YOffset & 0x7; + + const uint32 bat_invalid_y_mask = bat_width_invalid ? 0 : 0xFFFFFFFF; + const uint32 bat_invalid_sub_y_mask = bat_sub_width_invalid ? 0 : 0xFFFFFFFF; + + if(rotate_mode) + target += 8; + else + target += 8 - (XScroll & 0x7); + + + { + int32 wmul = (1 << bat_width_shift), wmask = ((1 << bat_height_shift) - 1) & bat_invalid_y_mask; + int32 sexy_y_pos = (YOffset & wmask) * wmul; + + int32 wmul_sub = (1 << bat_sub_width_shift), wmask_sub = ((1 << bat_sub_height_shift) - 1) & bat_invalid_sub_y_mask; + int32 sexy_y_sub_pos = (YOffset & wmask_sub) * wmul_sub; + + + #define ROTCODE_PRE \ + const int32 bat_width_mask = endless ? (bat_width - 1) : 0xFFFF; \ + const int32 bat_height_mask = endless ? (bat_height - 1) : 0xFFFF; \ + int32 a, b, c, d; \ + int32 raw_x_coord = (int32)sign_11_to_s16(XScroll) - (int16)king->BGAffinCenterX; \ + int32 raw_y_coord = fx_vce.raster_counter + (int32)sign_11_to_s16(YScroll) - 22 - (int16)king->BGAffinCenterY; \ + int32 xaccum; \ + int32 yaccum; \ + \ + a = (int16)king->BGAffinA; \ + b = (int16)king->BGAffinB; \ + c = (int16)king->BGAffinC; \ + d = (int16)king->BGAffinD; \ + \ + xaccum = raw_x_coord * a + raw_y_coord * b; \ + yaccum = raw_y_coord * d + raw_x_coord * c; \ + xaccum += (int16)king->BGAffinCenterX << 8; \ + yaccum += (int16)king->BGAffinCenterY << 8; \ + + #define ROTCODE_LOOP_PRE \ + for(int x = 0; x < 256; x++) \ + { \ + uint16 new_x = (xaccum >> 8); \ + uint16 new_y = (yaccum >> 8); \ + const uint16 *cgptr; \ + bat_x = (new_x >> 3) & bat_width_mask; \ + bat_y = (new_y >> 3) & bat_height_mask; \ + ysmall = new_y & 0x7; + + #define ROTCODE_LOOP_POST \ + xaccum += a; \ + yaccum += c; \ + } + + if((bgmode & 0x7) == BGMODE_4 && rotate_mode) + { + ROTCODE_PRE; + + ROTCODE_LOOP_PRE; + uint32 pbn = 0; + if(bgmode & 0x8) + { + uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3) )) & 0x1FFFF]; + pbn = ((bat >> 12) << 2); + bat &= 0x0FFF; + cgptr = &cg_base[(cg_offset + (bat * 8) + ysmall) & 0x1FFFF]; + } + else + { + cgptr = &cg_base[(cg_offset + bat_x + ((new_y & wmask) * wmul / 8)) & 0x1FFFF]; + } + uint8 ze_cg = (cgptr[0] >> ((7 - (new_x & 7)) << 1)) & 0x03; + + if(endless || (bat_x < bat_width && bat_y < bat_height)) + { + if(ze_cg) target[x] = palette_ptr[pbn + ze_cg] | layer_or; + } + ROTCODE_LOOP_POST; + } + else if((bgmode & 0x7) == BGMODE_16 && rotate_mode) + { + ROTCODE_PRE; + + ROTCODE_LOOP_PRE; + uint32 pbn = 0; + + if(bgmode & 0x8) + { + uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3) )) & 0x1FFFF]; + pbn = ((bat >> 12) << 4); + bat &= 0x0FFF; + cgptr = &cg_base[(cg_offset + (bat * 16) + ysmall * 2) & 0x1FFFF]; + } + else + { + cgptr = &cg_base[(cg_offset + (bat_x * 2) + ((new_y & wmask) * wmul / 4)) & 0x1FFFF]; + } + uint8 ze_cg = (cgptr[(new_x >> 2) & 0x1] >> ((3 - (new_x & 3)) << 2)) & 0x0F; + + if(endless || (bat_x < bat_width && bat_y < bat_height)) + { + if(ze_cg) target[x] = palette_ptr[pbn + ze_cg] | layer_or; + } + ROTCODE_LOOP_POST; + } + else if((bgmode & 0x7) == BGMODE_256 && rotate_mode) + { + ROTCODE_PRE; + + ROTCODE_LOOP_PRE; + if(bgmode & 0x8) + { + uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3) )) & 0x1FFFF]; + cgptr = &cg_base[(cg_offset + (bat * 32) + ysmall * 4) & 0x1FFFF]; + } + else + { + cgptr = &cg_base[(cg_offset + (bat_x * 4) + ((new_y & wmask) * wmul / 2)) & 0x1FFFF]; + } + uint8 ze_cg = cgptr[(new_x >> 1) & 0x3] >> (((new_x & 1) ^ 1) << 3); + + if(endless || (bat_x < bat_width && bat_y < bat_height)) + { + if(ze_cg) target[x] = palette_ptr[ze_cg] | layer_or; + } + ROTCODE_LOOP_POST; + } + else if((bgmode & 0x7) == BGMODE_64K && rotate_mode) + { + ROTCODE_PRE; + ROTCODE_LOOP_PRE; + if(bgmode & 0x8) + { + uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3) )) & 0x1FFFF]; + cgptr = &cg_base[(cg_offset + (bat * 64) + ysmall * 8) & 0x1FFFF]; + } + else + { + cgptr = &cg_base[(cg_offset + (bat_x * 8) + ((new_y & wmask) * wmul)) & 0x1FFFF]; + } + uint16 ze_cg = cgptr[new_x & 0x7]; + + if(endless || (bat_x < bat_width && bat_y < bat_height)) + { + if(ze_cg >> 8) target[x] = ((ze_cg & 0x00F0) << 8) | ((ze_cg & 0x000F)<<4) | ((ze_cg & 0xFF00) << 8) | layer_or; + } + ROTCODE_LOOP_POST; + } + else switch(bgmode & 0x7) + { +#define DRAWBG8x1_MAC(cg_needed, blit_suffix, pbn_arg) \ + for(int x = 0; x < 256 + 8; x+= 8) \ + { \ + if(bat_x < bat_width && bat_y < bat_height) \ + { \ + uint32 eff_bat_loc = bat_offset; \ + uint16 bat = 0; \ + uint16 pbn MDFN_NOWARN_UNUSED = 0; \ + const uint16 *cgptr[2]; \ + uint16 cg[cg_needed]; \ + \ + if(bgmode & 0x8) \ + eff_bat_loc += bat_x + (((bat_y & bat_invalid_y_mask) << bat_width_shift) >> 3); \ + \ + eff_bat_loc &= 0x1FFFF; \ + \ + if(BATFetchCycle) \ + bat = bat_base[eff_bat_loc]; \ + \ + if(bgmode & 0x08) \ + pbn = bat >> 12; \ + bat &= 0xFFF; \ + \ + cgptr[0] = &cg_base[(cg_offset + (bat_x * cg_needed) + sexy_y_pos) \ + & 0x1FFFF]; \ + cgptr[1] = &cg_base[(cg_offset + (bat * 8 * cg_needed) + ysmall * cg_needed) \ + & 0x1FFFF]; \ + \ + for(int cow = 0; cow < cg_needed; cow++) \ + cg[cow] = cgptr[cg_ofbat[cow]][cg_remap[cow]] & cg_mask[cow]; \ + \ + DRAWBG8x1_##blit_suffix(target + x, cg, palette_ptr + pbn_arg, layer_or); \ + } \ + else if(bat_x < bat_sub_width_test && bat_y < bat_sub_height_test) \ + { \ + uint32 eff_bat_loc = bat_sub_offset; \ + uint16 bat = 0; \ + uint16 pbn MDFN_NOWARN_UNUSED = 0; \ + const uint16 *cgptr[2]; \ + uint16 cg[cg_needed]; \ + \ + if(bgmode & 0x8) \ + eff_bat_loc += (bat_x & bat_sub_width_mask) + (((bat_y & bat_invalid_sub_y_mask & bat_sub_height_mask) << bat_sub_width_shift) >> 3); \ + \ + eff_bat_loc &= 0x1FFFF; \ + \ + if(BATSubFetchCycle) \ + bat = bat_sub_base[eff_bat_loc]; \ + \ + if(bgmode & 0x08) \ + pbn = bat >> 12; \ + bat &= 0xFFF; \ + \ + cgptr[0] = &cg_sub_base[(cg_sub_offset + ((bat_x & bat_sub_width_mask) * cg_needed) + sexy_y_sub_pos) \ + & 0x1FFFF]; \ + cgptr[1] = &cg_sub_base[(cg_sub_offset + (bat * 8 * cg_needed) + ysmall * cg_needed) \ + & 0x1FFFF]; \ + \ + for(int cow = 0; cow < cg_needed; cow++) \ + cg[cow] = cgptr[cg_sub_ofbat[cow]][cg_sub_remap[cow]] & cg_sub_mask[cow]; \ + \ + DRAWBG8x1_##blit_suffix(target + x, cg, palette_ptr + pbn_arg, layer_or); \ + } \ + bat_x = (bat_x + 1) & bat_bitsize_mask; \ + } + + + case 0x01: // 4 color, 1/4 byte per pixel :b + sexy_y_pos >>= 3; + sexy_y_sub_pos >>= 3; + + DRAWBG8x1_MAC(1, 4, (pbn << 2)); + break; + + case 0x02: // 16 color, 1/2 byte per pixel + sexy_y_pos >>= 2; + sexy_y_sub_pos >>= 2; + + DRAWBG8x1_MAC(2, 16, (pbn << 4)); + break; + + case 0x03: // 256 color, 1 byte per pixel palettized - OK + sexy_y_pos >>= 1; + sexy_y_sub_pos >>= 1; + + DRAWBG8x1_MAC(4, 256, 0); + break; + + case 0x04: // 64K color, 2 bytes per pixel - OK + DRAWBG8x1_MAC(8, 64K, 0); + break; + + case 0x05: // 16M color, 2 bytes per pixel - OK + DRAWBG8x1_MAC(8, 16M, 0); + break; + #if 0 + case BGMODE_64K_EXTDOT: + break; + + case BGMODE_16M_EXTDOT: + { + uint32 fat_bat = ((YOffset & ((1 << bat_height_shift) - 1)) << bat_width_shift) + (((XScroll & ~ 7) & ((1 << bat_width_shift) - 1)); + } + break; + #endif + } + } +} + +static int16 UVLUT[65536][3]; +static uint8 RGBDeflower[1152]; // 0 is at 384 +static uint32 CbCrLUT[65536]; + +static void RebuildUVLUT(const MDFN_PixelFormat &format) +{ + for(int ur = 0; ur < 256; ur++) + { + for(int vr = 0; vr < 256; vr++) + { + int r, g, b; + int u, v; + + u = ur - 128; + v = vr - 128; + + // FIXME: Use lrint() ? + r = (int)(0 - 0.000039457070707 * u + 1.139827967171717 * v); + g = (int)(0 - 0.394610164141414 * u - 0.580500315656566 * v); + b = (int)(0 + 2.031999684343434 * u - 0.000481376262626 * v); + + UVLUT[vr + ur * 256][0] = r; + UVLUT[vr + ur * 256][1] = g; + UVLUT[vr + ur * 256][2] = b; + + CbCrLUT[vr + ur * 256] = clamp_to_u8(128 + ((r * -9699 + g * -19071 + b * 28770) >> 16)) << format.Cbshift; + CbCrLUT[vr + ur * 256] |= clamp_to_u8(128 + ((r * 28770 + g * -24117 + b * -4653) >> 16)) << format.Crshift; + + //printf("%d %d %d, %08x\n", r, g, b, CbCrLUT[vr + ur * 256]); + } + } + for(int x = 0; x < 1152; x++) + { + if(x < 384) RGBDeflower[x] = 0; + else if(x > (384 + 255)) RGBDeflower[x] = 255; + else + RGBDeflower[x] = x - 384; + } +} + +// FIXME +static int rs, gs, bs; +static uint32 INLINE YUV888_TO_RGB888(uint32 yuv) +{ + int32 r, g, b; + uint8 y = yuv >> 16; + + r = y + UVLUT[yuv & 0xFFFF][0]; + g = y + UVLUT[yuv & 0xFFFF][1]; + b = y + UVLUT[yuv & 0xFFFF][2]; + + r = clamp_to_u8(r); + g = clamp_to_u8(g); + b = clamp_to_u8(b); + + return((r << rs) | (g << gs) | (b << bs)); +} + +static uint32 INLINE YUV888_TO_PF(const uint32 yuv, const MDFN_PixelFormat &pf, const uint8 a = 0x00) +{ + const uint8 y = yuv >> 16; + uint8 r, g, b; + + r = clamp_to_u8((int32)(y + UVLUT[yuv & 0xFFFF][0])); + g = clamp_to_u8((int32)(y + UVLUT[yuv & 0xFFFF][1])); + b = clamp_to_u8((int32)(y + UVLUT[yuv & 0xFFFF][2])); + + return pf.MakeColor(r, g, b, a); +} + +static uint32 INLINE YUV888_TO_YCbCr888(uint32 yuv) +{ + uint32 y; + + y = 16 + ((((yuv >> 16) & 0xFF) * 220) >> 8); + + return(y | CbCrLUT[yuv & 0xFFFF]); +} + +// FIXME: +//static unsigned int lines_per_frame; //= (fx_vce.picture_mode & 0x1) ? 262 : 263; +static VDC **vdc_chips; +static MDFN_Surface *surface; +static MDFN_Rect *DisplayRect; +static int32 *LineWidths; +static int skip; + +void KING_StartFrame(VDC **arg_vdc_chips, EmulateSpecStruct *espec) +{ + ::vdc_chips = arg_vdc_chips; + ::surface = espec->surface; + ::DisplayRect = &espec->DisplayRect; + ::LineWidths = espec->LineWidths; + ::skip = espec->skip; + + //MDFN_DispMessage("P0:%06x P1:%06x; I0: %06x I1: %06x", king->ADPCMPlayAddress[0], king->ADPCMPlayAddress[1], king->ADPCMIntermediateAddress[0] << 6, king->ADPCMIntermediateAddress[1] << 6); + //MDFN_DispMessage("%d %d\n", SCSICD_GetACK(), SCSICD_GetREQ()); + + // For the case of interlaced mode(clear ~0 state) + LineWidths[0] = 0; + + // These 2 should be overwritten in the big loop below. + DisplayRect->x = 0; + DisplayRect->w = 256; + + DisplayRect->y = MDFN_GetSettingUI("pcfx.slstart"); + DisplayRect->h = MDFN_GetSettingUI("pcfx.slend") - DisplayRect->y + 1; + + if(fx_vce.frame_interlaced) + { + skip = false; + + espec->InterlaceOn = true; + espec->InterlaceField = fx_vce.odd_field; + DisplayRect->y *= 2; + DisplayRect->h *= 2; + } +} + +static int rb_type; +// unsigned int width = (fx_vce.picture_mode & 0x08) ? 341 : 256; + +static void DrawActive(void) +{ + rb_type = -1; + + #ifdef WANT_DEBUGGER + if(GfxDecode_Buf && GfxDecode_Line == (int32)fx_vce.raster_counter) + DoGfxDecode(); + #endif + + if(fx_vce.raster_counter == king->RAINBOWTransferStartPosition && (king->RAINBOWTransferControl & 1)) + { + king->RAINBOWStartPending = TRUE; + + //printf("Rainbow start pending: line=%d, busycount=%d, blockcount=%d\n", fx_vce.raster_counter, king->RAINBOWBusyCount, king->RAINBOWBlockCount); + + //if(fx_vce.raster_counter == 262) + // puts("MOOO"); + } + + if(fx_vce.raster_counter < 262) + { + if(king->RAINBOWBusyCount) + { + king->RAINBOWBusyCount--; + if(!king->RAINBOWBusyCount) + RAINBOW_SwapBuffers(); + } + + if(!king->RAINBOWBusyCount) + { + bool WantDecode = FALSE; + bool FirstDecode = FALSE; + + if(!king->RAINBOWBlockCount && king->RAINBOWStartPending) + { + //printf("Rainbow start real: %d %d\n", fx_vce.raster_counter, king->RAINBOWTransferBlockCount); + king->RAINBOWBlockCount = king->RAINBOWTransferBlockCount; + if(king->RAINBOWBlockCount) + { + king->RAINBOWKRAMReadPos = king->RAINBOWKRAMA << 1; + FirstDecode = TRUE; + } + } + + if(king->RAINBOWBlockCount) + { + king->RAINBOWBlockCount--; + WantDecode = TRUE; + } + + if(WantDecode) + { + king->RAINBOWBusyCount = 16; + + if(fx_vce.raster_counter == 262) + king->RAINBOWBusyCount++; + + // If we ever change the emulation time range from the current 0 through 262/263, we will need to readjust this + // statement to prevent the previous frame's skip value to mess up the current frame's graphics data, since + // RAINBOW data is delayed by 16 scanlines from when it's decoded(16 + 15 maximum delay). + RAINBOW_DecodeBlock(FirstDecode, skip && fx_vce.raster_counter < 246); + } + } + + rb_type = RAINBOW_FetchRaster(skip ? NULL : rainbow_linebuffer, LAYER_RAINBOW << 28, &vce_rendercache.palette_table_cache[((fx_vce.palette_offset[3] >> 0) & 0xFF) << 1]); + + king->RAINBOWStartPending = FALSE; + } // end if(fx_vce.raster_counter < 262) + + if(fx_vce.raster_counter >= 22 && fx_vce.raster_counter < 262) + { + if(!skip) + { + if(rb_type == 1) // YUV + { + // Only chroma key when we're not in 7.16MHz pixel mode + if(!(fx_vce.picture_mode & 0x08)) + { + const unsigned int ymin = fx_vce.ChromaKeyY & 0xFF; + const unsigned int ymax = fx_vce.ChromaKeyY >> 8; + const unsigned int umin = fx_vce.ChromaKeyU & 0xFF; + const unsigned int umax = fx_vce.ChromaKeyU >> 8; + const unsigned int vmin = fx_vce.ChromaKeyV & 0xFF; + const unsigned int vmax = fx_vce.ChromaKeyV >> 8; + + if((fx_vce.ChromaKeyY | fx_vce.ChromaKeyU | fx_vce.ChromaKeyV) == 0) + { + //puts("Opt: 0 chroma key"); + for(int x = 0; x < 256; x++) + { + if(!(rainbow_linebuffer[x] & 0xFFFFFF)) + rainbow_linebuffer[x] = 0; + } + } + else if(ymin == ymax && umin == umax && vmin == vmax) + { + const uint32 compare_color = (ymin << 16) | (umin << 8) | (vmin << 0); + + //puts("Opt: Single color chroma key"); + + for(int x = 0; x < 256; x++) + { + if((rainbow_linebuffer[x] & 0xFFFFFF) == compare_color) + rainbow_linebuffer[x] = 0; + } + } + else if(ymin <= ymax && umin <= umax && vmin <= vmax) + { + const uint32 yv_min_sub = (ymin << 16) | vmin; + const uint32 u_min_sub = umin << 8; + const uint32 yv_max_add = ((0xFF - ymax) << 16) | (0xFF - vmax); + const uint32 u_max_add = (0xFF - umax) << 8; + + for(int x = 0; x < 256; x++) + { + const uint32 pixel = rainbow_linebuffer[x]; + const uint32 yv = pixel & 0xFF00FF; + const uint32 u = pixel & 0x00FF00; + uint32 testie; + + testie = ((yv - yv_min_sub) | (yv + yv_max_add)) & 0xFF00FF00; + testie |= ((u - u_min_sub) | (u + u_max_add)) & 0x00FF00FF; + + if(!testie) + rainbow_linebuffer[x] = 0; + } + } + else + { + //puts("Opt: color keying off\n"); + } + } + } + + /* + 4 = Foremost + 1 = Hindmost + 0 = Hidden + */ + + MDFN_FastU32MemsetM8(bg_linebuffer + 8, 0, 256); + + // Only bother to draw the BGs if the microprogram is enabled. + if(king->MPROGControl & 0x1) + { + for(int prio = 1; prio <= 7; prio++) + { + for(int x = 0; x < 4; x++) + { + int thisprio = (king->priority >> (x * 3)) & 0x7; + + if(BGLayerDisable & (1 << x)) continue; + + if(thisprio == prio) + { + //if(fx_vce.raster_counter == 50) + // CanDrawBG_Fast(x); + + // TODO/FIXME: TEST MORE + if(CanDrawBG_Fast(x)) // && (rand() & 1)) + DrawBG_Fast(bg_linebuffer, x); + else + DrawBG(bg_linebuffer, x, 0); + } + } + } + } + + } // end if(!skip) + } // end if(fx_vce.raster_counter >= 22 && fx_vce.raster_counter < 262) +} + +static INLINE void VDC_PIXELMIX(bool SPRCOMBO_ON, bool BGCOMBO_ON) +{ + static const uint32 vdc_layer_num[2] = { LAYER_VDC_BG << 28, LAYER_VDC_SPR << 28}; + const uint32 vdc_poffset[2] = { + (((uint32)fx_vce.palette_offset[0] >> 0) & 0xFF) << 1, // BG + (((uint32)fx_vce.palette_offset[0] >> 8) & 0xFF) << 1 // SPR + }; + + const int width = fx_vce.dot_clock ? 342 : 256; // 342, not 341, to prevent garbage pixels in high dot clock mode. + + for(int x = 0; x < width; x++) + { + const uint32 zort[2] = { vdc_linebuffers[0][x], vdc_linebuffers[1][x] }; + uint32 tmp_pixel; + + /* SPR combination */ + if(SPRCOMBO_ON && (zort[1] & 0x18F) > 0x180) + tmp_pixel = (zort[1] & 0xF) | ((zort[0] & 0xF) << 4) | 0x100; + /* BG combination */ + else if(BGCOMBO_ON && ((zort[1] ^ 0x100) & 0x18F) > 0x180) + tmp_pixel = (zort[1] & 0xF) | ((zort[0] & 0xF) << 4); + else + tmp_pixel = (zort[1] & 0xF) ? zort[1] : zort[0]; + + vdc_linebuffer[x] = tmp_pixel; + vdc_linebuffer_yuved[x] = 0; + if(tmp_pixel & 0xF) + vdc_linebuffer_yuved[x] = vce_rendercache.palette_table_cache[(tmp_pixel & 0xFF) + vdc_poffset[(tmp_pixel >> 8) & 1]] | vdc_layer_num[(tmp_pixel >> 8) & 1]; + } +} + +static void MixVDC(void) NO_INLINE; +static void MixVDC(void) +{ + // Optimization for when both layers are disabled in the VCE. + if(!vce_rendercache.LayerPriority[LAYER_VDC_BG] && !vce_rendercache.LayerPriority[LAYER_VDC_SPR]) + { + MDFN_FastU32MemsetM8(vdc_linebuffer_yuved, 0, 512); + } + else switch(fx_vce.picture_mode & 0xC0) + { + case 0x00: VDC_PIXELMIX(0, 0); break; // None on + case 0x40: VDC_PIXELMIX(0, 1); break; // BG combo on + case 0x80: VDC_PIXELMIX(1, 0); break; // SPR combo on + case 0xC0: VDC_PIXELMIX(1, 1); break; // Both on + } +} + + +static void MixLayers(void) +{ + uint32 *pXBuf = surface->pixels; + + // Now we have to mix everything together... I'm scared, mommy. + // We have, vdc_linebuffer[0] and bg_linebuffer + // Which layer is specified in bits 28-31(check the enum earlier on) + uint32 priority_remap[8]; + uint32 ble_cache[8]; + bool ble_cache_any = FALSE; + + for(int n = 0; n < 8; n++) + { + priority_remap[n] = vce_rendercache.LayerPriority[n]; + //printf("%d: %d\n", n, priority_remap[n]); + } + + // Rainbow layer disabled? + if(rb_type == -1 || RAINBOWLayerDisable) + priority_remap[LAYER_RAINBOW] = 0; + + ble_cache[LAYER_NONE] = 0; + for(int x = 0; x < 4; x++) + ble_cache[LAYER_BG0 + x] = (vce_rendercache.BLE >> (4 + x * 2)) & 0x3; + + ble_cache[LAYER_VDC_BG] = (vce_rendercache.BLE >> 0) & 0x3; + ble_cache[LAYER_VDC_SPR] = (vce_rendercache.BLE >> 2) & 0x3; + ble_cache[LAYER_RAINBOW] = (vce_rendercache.BLE >> 12) & 0x3; + + for(int x = 0; x < 8; x++) + if(ble_cache[x]) + { + ble_cache_any = TRUE; + break; + } + + uint8 *coeff_cache_y_back[3]; + int8 *coeff_cache_u_back[3], *coeff_cache_v_back[3]; + uint8 *coeff_cache_y_fore[3]; + int8 *coeff_cache_u_fore[3], *coeff_cache_v_fore[3]; + + for(int x = 0; x < 3; x++) + { + coeff_cache_y_fore[x] = vce_rendercache.coefficient_mul_table_y[(vce_rendercache.coefficients[x * 2 + 0] >> 8) & 0xF]; + coeff_cache_u_fore[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 0] >> 4) & 0xF]; + coeff_cache_v_fore[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 0] >> 0) & 0xF]; + + coeff_cache_y_back[x] = vce_rendercache.coefficient_mul_table_y[(vce_rendercache.coefficients[x * 2 + 1] >> 8) & 0xF]; + coeff_cache_u_back[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 1] >> 4) & 0xF]; + coeff_cache_v_back[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 1] >> 0) & 0xF]; + } + + uint32 *target; + uint32 BPC_Cache = (LAYER_NONE << 28); // Backmost pixel color(cache) + + if(fx_vce.frame_interlaced) + target = pXBuf + surface->pitch32 * ((fx_vce.raster_counter - 22) * 2 + fx_vce.odd_field); + else + target = pXBuf + surface->pitch32 * (fx_vce.raster_counter - 22); + + + // If at least one layer is enabled with the HuC6261, hindmost color is palette[0] + // If no layers are on, this color is black. + // If front cellophane is enabled, this color is forced to black(TODO: Confirm on a real system. Black or from CCR). + // If back cellophane is enabled, this color is forced to the value in CCR + // (back and front conditions are handled closer to the pixel mixing loops down below) + // TODO: Test on a real PC-FX to see if CCR is used or not if back cellophane is enabled even if all layers are disabled in the HuC6261, + // or if it just outputs black. + // TODO: See if enabling front/back cellophane in high dot-clock mode will set the hindmost color, even though the cellophane color mixing + // is disabled in high dot-clock mode. + if(vce_rendercache.picture_mode & 0x7F00) + BPC_Cache |= vce_rendercache.palette_table_cache[0]; + else + BPC_Cache |= 0x008080; + +#define DOCELLO(pixpoo) \ + if((pixel[pixpoo] >> 28) != LAYER_VDC_SPR || ((vce_rendercache.SPBL >> ((vdc_linebuffer[x] & 0xF0)>> 4)) & 1)) \ + { \ + int which_co = (ble_cache[pixel[pixpoo] >> 28] - 1); \ + uint8 back_y = coeff_cache_y_back[which_co][(zeout >> 16) & 0xFF]; \ + int8 back_u = coeff_cache_u_back[which_co][(zeout >> 8) & 0xFF]; \ + int8 back_v = coeff_cache_v_back[which_co][(zeout >> 0) & 0xFF]; \ + uint8 fore_y = coeff_cache_y_fore[which_co][(pixel[pixpoo] >> 16) & 0xFF]; \ + int8 fore_u = coeff_cache_u_fore[which_co][(pixel[pixpoo] >> 8) & 0xFF]; \ + int8 fore_v = coeff_cache_v_fore[which_co][(pixel[pixpoo] >> 0) & 0xFF]; \ + zeout = (pixel[pixpoo] & 0xFF000000) | ((RGBDeflower + 384)[back_y + fore_y] << 16) | ((RGBDeflower + 384)[back_u + fore_u + 128] << 8) | ((RGBDeflower + 384)[back_v + fore_v + 128] << 0); \ + } else zeout = pixel[pixpoo]; \ + +#define DOCELLOSPECIALFRONT() \ + { \ + uint8 y = coeff_cache_y_back[0][(zeout >> 16) & 0xFF]; \ + int8 u = coeff_cache_u_back[0][(zeout >> 8) & 0xFF]; \ + int8 v = coeff_cache_v_back[0][(zeout >> 0) & 0xFF]; \ + zeout = (zeout & 0xFF000000) | ((RGBDeflower + 384)[CCR_Y_front + y] << 16) | ((RGBDeflower + 384)[CCR_U_front + u + 128] << 8) | \ + ((RGBDeflower + 384)[CCR_V_front + v + 128] << 0); \ + } + +#define LAYER_MIX_BODY(index_256, index_341) \ + { uint32 pixel[4]; \ + uint32 prio[3]; \ + uint32 zeout = BPC_Cache; \ + prio[0] = priority_remap[vdc_linebuffer_yuved[index_341] >> 28]; \ + prio[1] = priority_remap[(bg_linebuffer + 8)[index_256] >> 28]; \ + prio[2] = priority_remap[rainbow_linebuffer[index_256] >> 28]; \ + pixel[0] = 0; \ + pixel[1] = 0; \ + pixel[2] = 0; \ + { \ + uint8 pi0 = VCEPrioMap[prio[0]][prio[1]][prio[2]][0]; \ + uint8 pi1 = VCEPrioMap[prio[0]][prio[1]][prio[2]][1]; \ + uint8 pi2 = VCEPrioMap[prio[0]][prio[1]][prio[2]][2]; \ + /*assert(pi0 == 3 || !pixel[pi0]);*/ pixel[pi0] = vdc_linebuffer_yuved[index_341]; \ + /*assert(pi1 == 3 || !pixel[pi1]);*/ pixel[pi1] = (bg_linebuffer + 8)[index_256]; \ + /*assert(pi2 == 3 || !pixel[pi2]);*/ pixel[pi2] = rainbow_linebuffer[index_256]; \ + } + +#define LAYER_MIX_FINAL_NOCELLO \ + if(pixel[0]) \ + zeout = pixel[0]; \ + if(pixel[1]) \ + zeout = pixel[1]; \ + if(pixel[2]) \ + zeout = pixel[2]; \ + target[x] = YUV888_TO_xxx(zeout); \ + } + +// For back cellophane, the hindmost pixel is always a valid pixel to mix with, a "layer" in its own right, +// so we don't need to check the current pixel value before mixing. +#define LAYER_MIX_FINAL_BACK_CELLO \ + if(pixel[0]) \ + { \ + if(ble_cache[pixel[0] >> 28]) \ + { \ + DOCELLO(0); \ + } \ + else \ + zeout = pixel[0]; \ + } \ + if(pixel[1]) \ + { \ + if(ble_cache[pixel[1] >> 28]) \ + { \ + DOCELLO(1); \ + } \ + else \ + zeout = pixel[1]; \ + } \ + if(pixel[2]) \ + { \ + if(ble_cache[pixel[2] >> 28]) \ + { \ + DOCELLO(2); \ + } \ + else \ + zeout = pixel[2]; \ + } \ + target[x] = YUV888_TO_xxx(zeout); \ + } + +// ..however, for front and "normal" cellophane, we need to make sure that the +// layer is indeed a real layer(KBG, VDC, RAINBOW) before mixing. +// Note: We need to check the upper 4 bits in determining whether the previous pixel is from a real layer or not, because the default +// hindmost non-layer color in front cellophane and normal cellophane modes is black, and black is represented in YUV as non-zero. We COULD bias/XOR each of U/V +// by 0x80 in the rendering code so that it would work if we just tested for the non-zeroness of the previous pixel, and adjust the YUV->RGB +// to compensate...TODO as a future possible optimization(MAYBE, it would obfuscate things more than they already are). +// +// Also, since the hindmost real layer pixel will never mix with anything behind it, we can leave +// out a few checks for the first possible hindmost real pixel. +// +// Also, the front cellophane effect itself doesn't need to check if the effective pixel output is a real layer (TODO: Confirm on real hardware!) +// +#define LAYER_MIX_FINAL_FRONT_CELLO \ + if(pixel[0]) \ + zeout = pixel[0]; \ + if(pixel[1]) \ + { \ + if(ble_cache[pixel[1] >> 28] && (zeout & (0xF << 28))) \ + { \ + DOCELLO(1); \ + } \ + else \ + zeout = pixel[1]; \ + } \ + if(pixel[2]) \ + { \ + if(ble_cache[pixel[2] >> 28] && (zeout & (0xF << 28))) \ + { \ + DOCELLO(2); \ + } \ + else \ + zeout = pixel[2]; \ + } \ + DOCELLOSPECIALFRONT(); \ + target[x] = YUV888_TO_xxx(zeout); \ + } + +#define LAYER_MIX_FINAL_CELLO \ + if(pixel[0]) \ + zeout = pixel[0]; \ + if(pixel[1]) \ + { \ + if(ble_cache[pixel[1] >> 28] && (zeout & (0xF << 28))) \ + { \ + DOCELLO(1); \ + } \ + else \ + zeout = pixel[1]; \ + } \ + if(pixel[2]) \ + { \ + if(ble_cache[pixel[2] >> 28] && (zeout & (0xF << 28))) \ + { \ + DOCELLO(2); \ + } \ + else \ + zeout = pixel[2]; \ + } \ + target[x] = YUV888_TO_xxx(zeout); \ + } + + if(surface->format.colorspace == MDFN_COLORSPACE_YCbCr) + { + #define YUV888_TO_xxx YUV888_TO_YCbCr888 + #include "king_mix_body.inc" + #undef YUV888_TO_xxx + } + else + { + #define YUV888_TO_xxx YUV888_TO_RGB888 + #include "king_mix_body.inc" + #undef YUV888_TO_xxx + } + DisplayRect->w = fx_vce.dot_clock ? HighDotClockWidth : 256; + DisplayRect->x = 0; + + // FIXME + if(fx_vce.frame_interlaced) + LineWidths[(fx_vce.raster_counter - 22) * 2 + fx_vce.odd_field] = DisplayRect->w; + else + LineWidths[fx_vce.raster_counter - 22] = DisplayRect->w; +} + +static INLINE void RunVDCs(const int master_cycles, uint16 *pixels0, uint16 *pixels1) +{ + int32 div_clocks; + + fx_vce.clock_divider += master_cycles; + div_clocks = fx_vce.clock_divider / fx_vce.dot_clock_ratio; + fx_vce.clock_divider -= div_clocks * fx_vce.dot_clock_ratio; + + if(pixels0) + pixels0 += vdc_lb_pos; + + if(pixels1) + pixels1 += vdc_lb_pos; + + assert((vdc_lb_pos + div_clocks) <= 512); + + fx_vce.vdc_event[0] = vdc_chips[0]->Run(div_clocks, pixels0, pixels0 ? false : true); + fx_vce.vdc_event[1] = vdc_chips[1]->Run(div_clocks, pixels1, pixels1 ? false : true); + + vdc_lb_pos += div_clocks; + +// printf("%d\n", vdc_lb_pos); +// if(fx_vce.dot_clock) +// assert(vdc_lb_pos <= 342); +// else +// assert(vdc_lb_pos <= 257); +} + +static void MDFN_FASTCALL KING_RunGfx(int32 clocks) +{ + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(chunk_clocks > HPhaseCounter) + chunk_clocks = HPhaseCounter; + + clocks -= chunk_clocks; + HPhaseCounter -= chunk_clocks; + + if(skip) + RunVDCs(chunk_clocks, NULL, NULL); + else if(fx_vce.in_hblank) + { + static uint16 dummybuf[1024]; + RunVDCs(chunk_clocks, dummybuf, dummybuf); + } + else + { + RunVDCs(chunk_clocks, vdc_linebuffers[0], vdc_linebuffers[1]); + } + + assert(HPhaseCounter >= 0); + + while(HPhaseCounter <= 0) + { + HPhase = (HPhase + 1) % HPHASE_COUNT; + switch(HPhase) + { + case HPHASE_ACTIVE: vdc_lb_pos = 0; + fx_vce.in_hblank = false; + DoHBlankVCECaching(); + DrawActive(); + HPhaseCounter += 1024; + break; + + case HPHASE_HBLANK_PART1: + if(!skip) + { + if(fx_vce.raster_counter >= 22 && fx_vce.raster_counter < 262) + { + MixVDC(); + MixLayers(); + } + } + fx_vce.in_hblank = true; + fx_vce.in_vdc_hsync = true; + + for(int chip = 0; chip < 2; chip++) + vdc_chips[chip]->HSync(true); + + HPhaseCounter += 48; + break; + + case HPHASE_HBLANK_PART3: + fx_vce.raster_counter = (fx_vce.raster_counter + 1) % ((fx_vce.picture_mode & 0x1) ? 262 : 263); //lines_per_frame; + + if(fx_vce.raster_counter == 0) + for(int chip = 0; chip < 2; chip++) + vdc_chips[chip]->VSync(true); + + if(fx_vce.raster_counter == 3) + for(int chip = 0; chip < 2; chip++) + vdc_chips[chip]->VSync(false); + + if(!fx_vce.raster_counter) + { + bool previous_interlaced = fx_vce.frame_interlaced; + + fx_vce.frame_interlaced = fx_vce.picture_mode & 2; + + if(fx_vce.frame_interlaced && previous_interlaced) + fx_vce.odd_field ^= 1; + + if(!fx_vce.frame_interlaced) + fx_vce.odd_field = 0; + + PCFX_V810.Exit(); + } + + if(fx_vce.raster_counter == king->RasterIRQLine && (king->RAINBOWTransferControl & 0x2)) + { + //printf("Wovely: %d, %d, %d\n", fx_vce.raster_counter, king->RAINBOWRasterCounter, king->RAINBOWTransferControl); + + //if(fx_vce.raster_counter == 262) + //{ + // printf("Rainbow raster IRQ on line 262?\n"); + //} + //else + { + king->RasterIRQPending = TRUE; + RedoKINGIRQCheck(); + } + } + + // This -18(and +18) may or may not be correct in regards to how a real PC-FX adjusts the VDC layer horizontal position + // versus the KING and RAINBOW layers. + + if(fx_vce.dot_clock) + HPhaseCounter += 173 - 18; + else + HPhaseCounter += 165; + break; + + case HPHASE_HBLANK_PART4: + fx_vce.in_vdc_hsync = false; + for(int chip = 0; chip < 2; chip++) + vdc_chips[chip]->HSync(false); + + if(fx_vce.dot_clock) + HPhaseCounter += 120 + 18; + else + HPhaseCounter += 128; + break; + + } // end: switch(HPhase) + } // end: while(HPhaseCounter <= 0) + } // end: while(clocks > 0) +} // end KING_RunGfx() + +void KING_SetPixelFormat(const MDFN_PixelFormat &format) +{ + rs = format.Rshift; + gs = format.Gshift; + bs = format.Bshift; + RebuildUVLUT(format); +} + +void KING_SetLayerEnableMask(uint64 mask) +{ + uint64 ms = mask; + // "BG0\0BG1\0BG2\0BG3\0VDC-A BG\0VDC-A SPR\0VDC-B BG\0VDC-B SPR\0RAINBOW\0", + + BGLayerDisable = (~ms) & 0xF; + ms >>= 4; + + for(unsigned chip = 0; chip < 2; chip++) + { + fx_vdc_chips[chip]->SetLayerEnableMask(ms & 0x3); + ms >>= 2; + } + + RAINBOWLayerDisable = (~ms) & 0x1; + ms >>= 1; + +#if 0 + if(which < 4) + { + BGLayerDisable ^= 1 << which; + return( !((BGLayerDisable >> which) & 1)); + } + else if(which == 4 || which == 5) + { + return(fx_vdc_chips[0]->ToggleLayer(which - 4)); + } + else if(which == 6 || which == 7) + { + return(fx_vdc_chips[1]->ToggleLayer(which - 6)); + } + else if(which == 8) + { + RAINBOWLayerDisable = !RAINBOWLayerDisable; + return(!RAINBOWLayerDisable); + } + else + return(0); +#endif +} + + +void KING_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT KINGStateRegs[] = + { + SFVARN(king->AR, "AR"), + SFARRAY16N(king->KRAM[0], 262144, "KRAM0"), + SFARRAY16N(king->KRAM[1], 262144, "KRAM1"), + SFVARN(king->KRAMWA, "KRAMWA"), + SFVARN(king->KRAMRA, "KRAMRA"), + SFVARN(king->KRAM_Mode, "KRAM_Mode"), + SFVARN(king->PageSetting, "PageSetting"), + SFVARN(king->bgmode, "bgmode"), + SFVARN(king->priority, "priority"), + SFVARN(king->BGScrollMode, "BGScrollMode"), + SFARRAY16N(king->BGSize, 4, "BGSize"), + + SFARRAYN(king->BGBATAddr, 4, "BGBATAddr"), + SFARRAYN(king->BGCGAddr, 4, "BGCGAddr"), + SFVARN(king->BG0SubBATAddr, "BG0SubBATAddr"), + SFVARN(king->BG0SubCGAddr, "BG0SubCGAddr"), + + SFARRAY16N(king->BGXScroll, 4, "BGXScroll"), + SFARRAY16N(king->BGYScroll, 4, "BGYScroll"), + SFVARN(king->BGAffinA, "BGAffinA"), + SFVARN(king->BGAffinB, "BGAffinB"), + SFVARN(king->BGAffinC, "BGAffinC"), + SFVARN(king->BGAffinD, "BGAffinD"), + SFVARN(king->BGAffinCenterX, "BGAffinCenterX"), + SFVARN(king->BGAffinCenterY, "BGAffinCenterY"), + + SFVARN(king->ADPCMControl, "ADPCMControl"), + SFARRAY16N(king->ADPCMBufferMode, 2, "ADPCMBufferMode"), + SFARRAY16N(king->ADPCMSAL, 2, "ADPCMSAL"), + SFARRAY32N(king->ADPCMEndAddress, 2, "ADPCMEndAddress"), + SFARRAY32N(king->ADPCMPlayAddress, 2, "ADPCMPlayAddress"), + SFARRAY16N(king->ADPCMIntermediateAddress, 2, "ADPCMIntermediateAddress"), + SFARRAY16N(king->ADPCMStatus, 2, "ADPCMStatus"), + SFVARN(king->ADPCMIRQPending, "ADPCMIRQPending"), + SFVARN(king->RAINBOWTransferControl, "RAINBOWTransferControl"), + SFVARN(king->RAINBOWKRAMA, "RAINBOWKRAMA"), + SFVARN(king->RAINBOWTransferStartPosition, "RAINBOWTransferStartPosition"), + SFVARN(king->RAINBOWTransferBlockCount, "RAINBOWTransferBlockCount"), + + SFVARN(king->RAINBOWStartPending, "RAINBOWStartPending"), + SFVARN(king->RAINBOWBusyCount, "RAINBOWBusyCount"), + SFVARN(king->RAINBOWBlockCount, "RAINBOWBlockCount"), + + SFVARN(king->RasterIRQLine, "RasterIRQLine"), + SFVARN(king->RasterIRQPending, "RasterIRQPending"), + SFVARN(king->RAINBOWKRAMReadPos, "RAINBOWKRAMReadPos"), + SFVARN(king->DMATransferFlipFlop, "DMATransferFlipFlop"), + SFVARN(king->DMATransferAddr, "DMATransferAddr"), + SFVARN(king->DMATransferSize, "DMATransferSize"), + SFVARN(king->DMAStatus, "DMAStatus"), + SFVARN(king->DMAInterrupt, "DMAInterrupt"), + SFVARN(king->DMALatch, "DMALatch"), + SFVARN(king->MPROGControl, "MPROGControl"), + SFVARN(king->MPROGAddress, "MPROGAddress"), + SFARRAY16N(king->MPROGData, 16, "MPROGData"), + SFVARN(king->Reg00, "Port00"), + SFVARN(king->Reg01, "Port01"), + SFVARN(king->Reg02, "Port02"), + SFVARN(king->Reg03, "Port03"), + SFVARN(king->CDInterrupt, "CDInterrupt"), + SFVARN(king->data_cache, "data_cache"), + SFVARN(king->DRQ, "DRQ"), + SFVARN(king->dma_receive_active, "dma_receive_active"), + SFVARN(king->dma_send_active, "dma_send_active"), + SFVARN(king->dma_cycle_counter, "dma_cycle_counter"), + + SFVARN(king->SubChannelBuf, "SubChannelBuf"), + SFVARN(king->SubChannelInterrupt, "SubChannelInterrupt"), + SFVARN(king->SubChannelControl, "SubChannelControl"), + + SFVAR(scsicd_ne), + // scsicd_ne here?? + SFEND + }; + + SFORMAT VCEStateRegs[] = + { + SFVARN(fx_vce.AR, "AR"), + SFARRAY16N(fx_vce.priority, 2, "priority"), + SFVARN(fx_vce.odd_field, "odd_field"), + SFVARN(fx_vce.in_hblank, "in_hblank"), + SFVARN(fx_vce.in_vdc_hsync, "in_vdc_hsync"), + SFVARN(fx_vce.picture_mode, "picture_mode"), + + SFVARN(HPhase, "HPhase"), + SFVARN(HPhaseCounter, "HPhaseCounter"), + SFVAR(vdc_lb_pos), + + SFVARN(fx_vce.dot_clock, "dot_clock"), + SFVARN(fx_vce.clock_divider, "clock_divider"), + + SFARRAY32N(fx_vce.vdc_event, 2, "vdc_event"), + + SFVARN(fx_vce.raster_counter, "raster_counter"), + SFVARN(fx_vce.palette_rw_offset, "palette_rw_offset"), + SFVARN(fx_vce.palette_rw_latch, "palette_rw_latch"), + SFARRAY16N(fx_vce.palette_offset, 4, "palette_offset"), + SFARRAY16N(fx_vce.palette_table, 512, "palette_table"), + SFVARN(fx_vce.ChromaKeyY, "ChromaKeyY"), + SFVARN(fx_vce.ChromaKeyU, "ChromaKeyU"), + SFVARN(fx_vce.ChromaKeyV, "ChromaKeyV"), + SFVARN(fx_vce.CCR, "CCR"), + SFVARN(fx_vce.BLE, "BLE"), + SFVARN(fx_vce.SPBL, "SPBL"), + SFARRAY16N(fx_vce.coefficients, 6, "coefficients"), + + + // HB render cache: + // FIXME + SFARRAY16N(vce_rendercache.priority, 2, "rc_priority"), + SFVARN(vce_rendercache.picture_mode, "rc_picture_mode"), + SFARRAY16N(vce_rendercache.palette_offset, 4, "rc_palette_offset"), + SFVARN(vce_rendercache.ChromaKeyY, "rc_ChromaKeyY"), + SFVARN(vce_rendercache.ChromaKeyU, "rc_ChromaKeyU"), + SFVARN(vce_rendercache.ChromaKeyV, "rc_ChromaKeyV"), + SFVARN(vce_rendercache.CCR, "rc_CCR"), + SFVARN(vce_rendercache.BLE, "rc_BLE"), + SFVARN(vce_rendercache.SPBL, "rc_SPBL"), + SFARRAY16N(vce_rendercache.coefficients, 6, "rc_coefficients"), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, KINGStateRegs, "KING"); + + MDFNSS_StateAction(sm, load, data_only, VCEStateRegs, "VCE"); + + if(load) + { + RecalcKRAMPagePtrs(); + + fx_vce.dot_clock_ratio = fx_vce.dot_clock ? 3 : 4; + + fx_vce.palette_rw_offset &= 0x1FF; + fx_vce.palette_offset[3] &= 0x00FF; + fx_vce.priority[0] &= 0x0777; + fx_vce.priority[1] &= 0x7777; + + for(int x = 0; x < 6; x++) + fx_vce.coefficients[x] &= 0x0FFF; + + for(int x = 0; x < 0x200; x++) + RedoPaletteCache(x); + + vdc_lb_pos &= 0x1FF; // FIXME: Better checks(in case we remove the assert() elsewhere)? + + RedoKINGIRQCheck(); + SoundBox_SetKINGADPCMControl(king->ADPCMControl); + } +} + +#ifdef WANT_DEBUGGER +void KING_SetRegister(const unsigned int id, uint32 value) +{ + if(id == KING_GSREG_AR) + king->AR = value & 0x7F; + else if(id == KING_GSREG_MPROGADDR) + king->MPROGAddress = value & 0xF; + else if(id == KING_GSREG_MPROGCTRL) + king->MPROGControl = value & 0x1; + else if(id == KING_GSREG_MPROG0 || id == KING_GSREG_MPROG1 || id == KING_GSREG_MPROG2 || id == KING_GSREG_MPROG3 || id == KING_GSREG_MPROG4 || id == KING_GSREG_MPROG5 || id == KING_GSREG_MPROG6 || id == KING_GSREG_MPROG7 || + id == KING_GSREG_MPROG8 || id == KING_GSREG_MPROG9 || id == KING_GSREG_MPROGA || id == KING_GSREG_MPROGB || id == KING_GSREG_MPROGC || id == KING_GSREG_MPROGD || id == KING_GSREG_MPROGE || id == KING_GSREG_MPROGF) + { + king->MPROGData[id - KING_GSREG_MPROG0] = value; + } + else if(id == KING_GSREG_PAGESET) + { + king->PageSetting = value; + RecalcKRAMPagePtrs(); + } + else if(id == KING_GSREG_BGMODE) + { + king->bgmode = value; + } + else if(id == KING_GSREG_BGPRIO) + { + king->priority = value; + } + else if(id == KING_GSREG_BGSCRM) + { + king->BGScrollMode = value; + } + else if(id == KING_GSREG_BGSIZ0) + king->BGSize[0] = value; + else if(id == KING_GSREG_BGSIZ1) + king->BGSize[1] = value & 0x00FF; + else if(id == KING_GSREG_BGSIZ2) + king->BGSize[2] = value & 0x00FF; + else if(id == KING_GSREG_BGSIZ3) + king->BGSize[3] = value & 0x00FF; + else if(id == KING_GSREG_BGXSC0) + king->BGXScroll[0] = value & 0x7FF; + else if(id == KING_GSREG_BGXSC1) + king->BGXScroll[1] = value & 0x3FF; + else if(id == KING_GSREG_BGXSC2) + king->BGXScroll[2] = value & 0x3FF; + else if(id == KING_GSREG_BGXSC3) + king->BGXScroll[3] = value & 0x3FF; + else if(id == KING_GSREG_BGYSC0) + king->BGYScroll[0] = value & 0x7FF; + else if(id == KING_GSREG_BGYSC1) + king->BGYScroll[1] = value & 0x3FF; + else if(id == KING_GSREG_BGYSC2) + king->BGYScroll[2] = value & 0x3FF; + else if(id == KING_GSREG_BGYSC3) + king->BGYScroll[3] = value & 0x3FF; + else if(id == KING_GSREG_AFFINA) + king->BGAffinA = value; + else if(id == KING_GSREG_AFFINB) + king->BGAffinB = value; + else if(id == KING_GSREG_AFFINC) + king->BGAffinC = value; + else if(id == KING_GSREG_AFFIND) + king->BGAffinD = value; + else if(id == KING_GSREG_AFFINX) + king->BGAffinCenterX = value; + else if(id == KING_GSREG_AFFINY) + king->BGAffinCenterY = value; + else if(id == KING_GSREG_BGBATS || id == KING_GSREG_BGBAT0 || id == KING_GSREG_BGBAT1 || id == KING_GSREG_BGBAT2 || id == KING_GSREG_BGBAT3) + { + if(id == KING_GSREG_BGBATS) + king->BG0SubBATAddr = value; + else + king->BGBATAddr[id - KING_GSREG_BGBAT0] = value; + } + else if(id == KING_GSREG_BGCGS || id == KING_GSREG_BGCG0 || id == KING_GSREG_BGCG1 || id == KING_GSREG_BGCG2 || id == KING_GSREG_BGCG3) + { + if(id == KING_GSREG_BGCGS) + king->BG0SubCGAddr = value; + else + king->BGCGAddr[id - KING_GSREG_BGCG0] = value; + } + else if(id == KING_GSREG_RTCTRL) + king->RAINBOWTransferControl = value & 0x3; + else if(id == KING_GSREG_RKRAMA) + king->RAINBOWKRAMA = value & 0x3FFFF; + else if(id == KING_GSREG_RSTART) + king->RAINBOWTransferStartPosition = value & 0x1FF; + else if(id == KING_GSREG_RCOUNT) + king->RAINBOWTransferBlockCount = value & 0x1F; + else if(id == KING_GSREG_RIRQLINE) + king->RasterIRQLine = value; + else if(id == KING_GSREG_KRAMRA) + { + king->KRAMRA = value; + } + else if(id == KING_GSREG_KRAMWA) + { + king->KRAMWA = value; + } + else if(id == KING_GSREG_DMATA) + king->DMATransferAddr = value; + else if(id == KING_GSREG_DMATS) + king->DMATransferSize = value; + else if(id == KING_GSREG_DMASTT) + king->DMAStatus = value; + else if(id == KING_GSREG_ADPCMCTRL) + { + king->ADPCMControl = value; + SoundBox_SetKINGADPCMControl(king->ADPCMControl); + } + else if(id == KING_GSREG_ADPCMBM0 || id == KING_GSREG_ADPCMBM1) + { + king->ADPCMBufferMode[id - KING_GSREG_ADPCMBM0] = value; + } + else if(id == KING_GSREG_ADPCMPA0 || id == KING_GSREG_ADPCMPA1) + { + king->ADPCMPlayAddress[id - KING_GSREG_ADPCMPA0] = value; + } + else if(id == KING_GSREG_ADPCMSA0 || id == KING_GSREG_ADPCMSA1) + { + king->ADPCMSAL[id - KING_GSREG_ADPCMSA0] = value; + } + else if(id == KING_GSREG_ADPCMIA0 || id == KING_GSREG_ADPCMIA1) + { + king->ADPCMIntermediateAddress[id - KING_GSREG_ADPCMIA0] = value; + } + else if(id == KING_GSREG_ADPCMEA0 || id == KING_GSREG_ADPCMEA1) + { + king->ADPCMEndAddress[id - KING_GSREG_ADPCMEA0] = value; + } + else if(id == KING_GSREG_ADPCMStat) + { + + } + else if(id == KING_GSREG_Reg01) + { + king->Reg01 = value; + } + else if(id == KING_GSREG_Reg02) + { + king->Reg02 = value; + } + else if(id == KING_GSREG_Reg03) + { + king->Reg03 = value; + } + else if(id == KING_GSREG_SUBCC) + { + king->SubChannelControl = value & 0x3; + } +} + +uint32 KING_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + if(id == KING_GSREG_AR) + { + value = king->AR; + } + else if(id == KING_GSREG_MPROGADDR) + value = king->MPROGAddress; + else if(id == KING_GSREG_MPROGCTRL) + { + value = king->MPROGControl; + } + else if(id == KING_GSREG_MPROG0 || id == KING_GSREG_MPROG1 || id == KING_GSREG_MPROG2 || id == KING_GSREG_MPROG3 || id == KING_GSREG_MPROG4 || id == KING_GSREG_MPROG5 || id == KING_GSREG_MPROG6 || id == KING_GSREG_MPROG7 || + id == KING_GSREG_MPROG8 || id == KING_GSREG_MPROG9 || id == KING_GSREG_MPROGA || id == KING_GSREG_MPROGB || id == KING_GSREG_MPROGC || id == KING_GSREG_MPROGD || id == KING_GSREG_MPROGE || id == KING_GSREG_MPROGF) + { + value = king->MPROGData[id - KING_GSREG_MPROG0]; + + if(special) + { + static const char *atypes[4] = { "CG", "CG of BAT", "BAT", "???" }; + + trio_snprintf(special, special_len, "Offset: %d, Access Type: %s, Rotation: %d, BG Number: %d, NOP: %d", + value & 0x7, atypes[(value >> 3) & 0x3], (int)(bool)(value & 0x20), + (value >> 6) & 0x3, (int)(bool)(value & 0x100)); + } + + } + else if(id == KING_GSREG_PAGESET) + { + value = king->PageSetting; + + if(special) + { + trio_snprintf(special, special_len, "SCSI: %d, BG: %d, ADPCM: %d, RAINBOW: %d", (int)(bool)(value & 0x1), (int)(bool)(value & 0x10), (int)(bool)(value & 0x100), (int)(bool)(value & 0x1000)); + } + } + else if(id == KING_GSREG_BGMODE) + { + value = king->bgmode; + if(special) + { + static const char *bgmodes[16] = { "Disabled", "4-color", "16-color", "256-color", "64K-color", "16M-color", "Undefined", "Undefined", + "Disabled", "4-color w/BAT", "16-color w/BAT", "256-color w/BAT", "64K-color w/BAT", "16M-color w/BAT", "Undefined", "Undefined" + }; + trio_snprintf(special, special_len, "BG0: %2d(%s), BG1: %2d(%s), BG2: %2d(%s), BG3: %2d(%s)", value & 0xF, bgmodes[value & 0xF], (value >> 4) & 0xF, bgmodes[(value >> 4) & 0xF], (value >> 8) & 0xF, bgmodes[(value >> 8) & 0xf], (value >> 12) & 0xF, bgmodes[(value >> 12) & 0xf]); + } + } + else if(id == KING_GSREG_BGPRIO) + { + value = king->priority; + if(special) + { + trio_snprintf(special, special_len, "Affine enable: %s - BG0: %2d, BG1: %2d, BG2: %2d, BG3: %2d", (value & (1 << 12)) ? "Yes" : "No", value & 0x7, (value >> 3) & 0x7, (value >> 6) & 0x7, (value >> 9) & 0x7); + } + } + else if(id == KING_GSREG_BGSCRM) + { + value = king->BGScrollMode; + if(special) + { + trio_snprintf(special, special_len, "BG0: %s, BG1: %s, BG2: %s, BG3: %s", (value & 1) ? "Endless" : "Non-endless",(value & 2) ? "Endless" : "Non-endless", + (value & 4) ? "Endless" : "Non-endless", (value & 8) ? "Endless" : "Non-endless"); + } + } + else if(id == KING_GSREG_BGSIZ0 || id == KING_GSREG_BGSIZ1 || id == KING_GSREG_BGSIZ2 || id == KING_GSREG_BGSIZ3) + { + value = king->BGSize[id - KING_GSREG_BGSIZ0]; + } + else if(id == KING_GSREG_BGXSC0) + value = king->BGXScroll[0]; + else if(id == KING_GSREG_BGXSC1) + value = king->BGXScroll[1]; + else if(id == KING_GSREG_BGXSC2) + value = king->BGXScroll[2]; + else if(id == KING_GSREG_BGXSC3) + value = king->BGXScroll[3]; + + else if(id == KING_GSREG_BGYSC0) + value = king->BGYScroll[0]; + else if(id == KING_GSREG_BGYSC1) + value = king->BGYScroll[1]; + else if(id == KING_GSREG_BGYSC2) + value = king->BGYScroll[2]; + else if(id == KING_GSREG_BGYSC3) + value = king->BGYScroll[3]; + else if(id == KING_GSREG_AFFINA || id == KING_GSREG_AFFINB || id == KING_GSREG_AFFINC || id == KING_GSREG_AFFIND) + { + const uint16 *coeffs[4] = { &king->BGAffinA, &king->BGAffinB, &king->BGAffinC, &king->BGAffinD }; + value = *coeffs[id - KING_GSREG_AFFINA]; + if(special) + { + trio_snprintf(special, special_len, "%f", (double)(int16)value / 256); + } + } + else if(id == KING_GSREG_AFFINX) + value = king->BGAffinCenterX; + else if(id == KING_GSREG_AFFINY) + value = king->BGAffinCenterY; + else if(id == KING_GSREG_BGBATS || id == KING_GSREG_BGBAT0 || id == KING_GSREG_BGBAT1 || id == KING_GSREG_BGBAT2 || id == KING_GSREG_BGBAT3) + { + if(id == KING_GSREG_BGBATS) + value = king->BG0SubBATAddr; + else + value = king->BGBATAddr[id - KING_GSREG_BGBAT0]; + + if(special) + { + trio_snprintf(special, special_len, "0x%04x * 1024 = 0x%05x", value, (value * 1024) & 0x3FFFF); + } + } + else if(id == KING_GSREG_BGCGS || id == KING_GSREG_BGCG0 || id == KING_GSREG_BGCG1 || id == KING_GSREG_BGCG2 || id == KING_GSREG_BGCG3) + { + if(id == KING_GSREG_BGCGS) + value = king->BG0SubCGAddr; + else + value = king->BGCGAddr[id - KING_GSREG_BGCG0]; + if(special) + { + trio_snprintf(special, special_len, "0x%04x * 1024 = 0x%05x", value, (value * 1024) & 0x3FFFF); + } + } + else if(id == KING_GSREG_RTCTRL) + { + value = king->RAINBOWTransferControl; + if(special) + { + trio_snprintf(special, special_len, "Raster Interrupt: %s, Rainbow Transfer: %s", (value & 2) ? "On" : "Off", (value & 1) ? "On" : "Off"); + } + } + else if(id == KING_GSREG_RKRAMA) + value = king->RAINBOWKRAMA; + else if(id == KING_GSREG_RSTART) + value = king->RAINBOWTransferStartPosition; + else if(id == KING_GSREG_RCOUNT) + value = king->RAINBOWTransferBlockCount; + else if(id == KING_GSREG_RIRQLINE) + value = king->RasterIRQLine; + else if(id == KING_GSREG_KRAMRA) + { + value = king->KRAMRA; + } + else if(id == KING_GSREG_KRAMWA) + { + value = king->KRAMWA; + } + else if(id == KING_GSREG_DMATA) + value = king->DMATransferAddr; + else if(id == KING_GSREG_DMATS) + value = king->DMATransferSize; + else if(id == KING_GSREG_DMASTT) + value = king->DMAStatus; + else if(id == KING_GSREG_ADPCMCTRL) + { + value = king->ADPCMControl; + + } + else if(id == KING_GSREG_ADPCMBM0 || id == KING_GSREG_ADPCMBM1) + { + value = king->ADPCMBufferMode[id - KING_GSREG_ADPCMBM0]; + } + else if(id == KING_GSREG_ADPCMPA0 || id == KING_GSREG_ADPCMPA1) + { + value = king->ADPCMPlayAddress[id - KING_GSREG_ADPCMPA0]; + } + else if(id == KING_GSREG_ADPCMSA0 || id == KING_GSREG_ADPCMSA1) + { + value = king->ADPCMSAL[id - KING_GSREG_ADPCMSA0]; + } + else if(id == KING_GSREG_ADPCMIA0 || id == KING_GSREG_ADPCMIA1) + { + value = king->ADPCMIntermediateAddress[id - KING_GSREG_ADPCMIA0]; + + if(special) + { + trio_snprintf(special, special_len, "0x%03x * 64 = 0x%08x", value, value << 6); + } + } + else if(id == KING_GSREG_ADPCMEA0 || id == KING_GSREG_ADPCMEA1) + { + value = king->ADPCMEndAddress[id - KING_GSREG_ADPCMEA0]; + } + else if(id == KING_GSREG_ADPCMStat) + { + value = king->ADPCMStatus[0] | (king->ADPCMStatus[1] << 2); + if(special) + { + trio_snprintf(special, special_len, "Ch0 End: %d, Ch0 Intermediate: %d, Ch1 End: %d, Ch1 Intermediate: %d", (int)(bool)(value & 0x1), + (int)(bool)(value & 0x2), + (int)(bool)(value & 0x4), + (int)(bool)(value & 0x8)); + } + } + else if(id == KING_GSREG_Reg01) + { + value = king->Reg01; + if(special) + { + trio_snprintf(special, special_len, "BSY: %d, ATN: %d, SEL: %d, ACK: %d, RST: %d", (int)(bool)(value & 1), (int)(bool)(value & 2), (int)(bool)(value & 4), + (int)(bool)(value & 0x10), (int)(bool)(value & 0x80)); + } + } + else if(id == KING_GSREG_Reg02) + { + value = king->Reg02; + } + else if(id == KING_GSREG_Reg03) + { + value = king->Reg03; + if(special) + { + + trio_snprintf(special, special_len, "I/O: %d, C/D: %d, MSG: %d", (int)(bool)(value & 1), (int)(bool)(value & 2), (int)(bool)(value & 4)); + } + } + else if(id == KING_GSREG_SUBCC) + { + value = king->SubChannelControl; + if(special) + { + + trio_snprintf(special, special_len, "Subchannel reading: %s, Subchannel read IRQ: %s", (value & 0x1) ? "Enabled" : "Disabled", (value & 0x2) ? "On" : "Off"); + } + } + else if(id == KING_GSREG_DB) + value = SCSICD_GetDB(); + else if(id == KING_GSREG_BSY) + value = SCSICD_GetBSY(); + else if(id == KING_GSREG_REQ) + value = SCSICD_GetREQ(); + else if(id == KING_GSREG_ACK) + value = SCSICD_GetACK(); + else if(id == KING_GSREG_MSG) + value = SCSICD_GetMSG(); + else if(id == KING_GSREG_CD) + value = SCSICD_GetCD(); + else if(id == KING_GSREG_IO) + value = SCSICD_GetIO(); + else if(id == KING_GSREG_SEL) + value = SCSICD_GetSEL(); + + return(value); +} + +void FXVCE_SetRegister(const unsigned int id, uint32 value) +{ + if(id == FXVCE_GSREG_PRIO0) + { + fx_vce.priority[0] = value & 0x0777; + } + else if(id == FXVCE_GSREG_PRIO1) + { + fx_vce.priority[1] = value & 0x7777; + } + else if(id == FXVCE_GSREG_PICMODE) + { + fx_vce.picture_mode = value; + } + else if(id == FXVCE_GSREG_PALRWOF) + { + fx_vce.palette_rw_offset = value; + fx_vce.palette_rw_offset &= 0x1FF; + } + else if(id == FXVCE_GSREG_PALRWLA) + fx_vce.palette_rw_latch = value; + else if(id == FXVCE_GSREG_PALOFS0) + fx_vce.palette_offset[0] = value; + else if(id == FXVCE_GSREG_PALOFS1) + fx_vce.palette_offset[1] = value; + else if(id == FXVCE_GSREG_PALOFS2) + fx_vce.palette_offset[2] = value; + else if(id == FXVCE_GSREG_PALOFS3) + { + fx_vce.palette_offset[3] = value; + fx_vce.palette_offset[3] &= 0x00FF; + } + else if(id == FXVCE_GSREG_CKeyY) + fx_vce.ChromaKeyY = value; + else if(id == FXVCE_GSREG_CKeyU) + fx_vce.ChromaKeyU = value; + else if(id == FXVCE_GSREG_CKeyV) + fx_vce.ChromaKeyV = value; + else if(id == FXVCE_GSREG_CCR) + fx_vce.CCR = value; + else if(id == FXVCE_GSREG_BLE) + fx_vce.BLE = value; + else if(id == FXVCE_GSREG_SPBL) + fx_vce.SPBL = value; + else if(id == FXVCE_GSREG_COEFF0 || id == FXVCE_GSREG_COEFF1 || id == FXVCE_GSREG_COEFF2 || id == FXVCE_GSREG_COEFF3 || id == FXVCE_GSREG_COEFF4 || id == FXVCE_GSREG_COEFF5) + fx_vce.coefficients[id - FXVCE_GSREG_COEFF0] = value & 0xFFF; +} + +uint32 FXVCE_GetRegister(const unsigned int id, char* special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + if(id == FXVCE_GSREG_PRIO0) + { + value = fx_vce.priority[0]; + if(special) + { + trio_snprintf(special, special_len, "VDC BG: %2d, VDC SPR: %2d, RAINBOW: %2d", value & 0xF, (value >> 4) & 0xF, (value >> 8) & 0xF); + } + } + else if(id == FXVCE_GSREG_PRIO1) + { + value = fx_vce.priority[1]; + if(special) + { + trio_snprintf(special, special_len, "BG0: %2d, BG1: %2d, BG2: %2d, BG3: %2d", value & 0xF, (value >> 4) & 0xF, (value >> 8) & 0xF, (value >> 12) & 0xF); + } + } + else if(id == FXVCE_GSREG_PICMODE) + { + value = fx_vce.picture_mode; + if(special) + { + static const char *DCCModes[4] = + { + "263 lines/frame", "262 lines/frame", "Interlaced", "Interlaced+1/2 dot shift" + }; + + trio_snprintf(special, special_len, "BG0: %s, BG1: %s, BG2: %s, BG3: %s, VDC BG: %s%s, VDC SPR: %s%s, RAINBOW: %s, VDC Clk: %sMHz, %s", + (value & (1 << 10)) ? "On" : "Off", (value & (1 << 11)) ? "On": "Off", + (value & (1 << 12)) ? "On" : "Off", (value & (1 << 13)) ? "On": "Off", + (value & 0x0100) ? "On" : "Off", (value & 0x0040) ? "+merge mode" : "", (value & 0x0200) ? "On" : "Off", (value & 0x0080) ? "+merge mode" : "", + (value & 0x4000) ? "On" : "Off", (value & 0x0008) ? "7.16":"5.37", DCCModes[value & 0x3]); + } + } + else if(id == FXVCE_GSREG_Line) + value = fx_vce.raster_counter; + else if(id == FXVCE_GSREG_PALRWOF) + value = fx_vce.palette_rw_offset; + else if(id == FXVCE_GSREG_PALRWLA) + value = fx_vce.palette_rw_latch; + else if(id == FXVCE_GSREG_PALOFS0) + value = fx_vce.palette_offset[0]; + else if(id == FXVCE_GSREG_PALOFS1) + value = fx_vce.palette_offset[1]; + else if(id == FXVCE_GSREG_PALOFS2) + value = fx_vce.palette_offset[2]; + else if(id == FXVCE_GSREG_PALOFS3) + value = fx_vce.palette_offset[3]; + else if(id == FXVCE_GSREG_CKeyY) + value = fx_vce.ChromaKeyY; + else if(id == FXVCE_GSREG_CKeyU) + value = fx_vce.ChromaKeyU; + else if(id == FXVCE_GSREG_CKeyV) + value = fx_vce.ChromaKeyV; + + else if(id == FXVCE_GSREG_CCR) + value = fx_vce.CCR; + else if(id == FXVCE_GSREG_BLE) + { + value = fx_vce.BLE; + if(special) + { + trio_snprintf(special, special_len, "%s(%s), Rainbow: %d, BG3: %d, BG2: %d, BG1: %d, BG0: %d, VDC SP: %d, VDC BG: %d", (value & 0x8000) ? "Front" : "Back", (value & 0x4000) ? "On" : "Off", (value >> 12) & 0x3, + (value >> 10) & 3, (value >> 8) & 3, (value >> 6) & 3, (value >> 4) & 3, (value >> 2) & 3, value & 3); + } + } + else if(id == FXVCE_GSREG_SPBL) + value = fx_vce.SPBL; + else if(id == FXVCE_GSREG_COEFF0 || id == FXVCE_GSREG_COEFF1 || id == FXVCE_GSREG_COEFF2 || id == FXVCE_GSREG_COEFF3 || id == FXVCE_GSREG_COEFF4 || id == FXVCE_GSREG_COEFF5) + { + value = fx_vce.coefficients[id - FXVCE_GSREG_COEFF0]; + + if(special) + { + trio_snprintf(special, special_len, "Y: %1d, U: %1d, V: %1d", (value >> 8) & 0xF, (value >> 4) & 0xf, value & 0xf); + } + } + + return(value); +} + +void KING_SetGraphicsDecode(MDFN_Surface *decode_surface, int line, int which, int xscroll, int yscroll, int pbn) +{ + GfxDecode_Buf = decode_surface; + GfxDecode_Line = line; + GfxDecode_Layer = which; + GfxDecode_Scroll = yscroll; + GfxDecode_PBN = pbn; + + if(GfxDecode_Buf && GfxDecode_Line == -1) + DoGfxDecode(); +} + +static void DoGfxDecode(void) +{ + int pbn = GfxDecode_PBN; + + if(GfxDecode_Layer >= 4 && GfxDecode_Layer <= 7) + { + uint32 palette_offset = fx_vce.palette_offset[0] >> (((GfxDecode_Layer - 4) & 1) * 8); + palette_offset <<= 1; + palette_offset &= 0x1FF; + uint32 *palette_ptr = &vce_rendercache.palette_table_cache[palette_offset]; + uint32 neo_palette[16]; + + if(pbn == -1) + { + for(int x = 0; x < 16; x++) + { + int ccval = (int)(255 * pow((double)x / 15, 1.0f / 2.2)); + neo_palette[x] = GfxDecode_Buf->MakeColor(ccval, ccval, ccval, 0xFF); + } + } + else + { + pbn &= 0x0F; + palette_ptr += pbn * 16; + + for(int x = 0; x < 16; x++) + neo_palette[x] = YUV888_TO_PF(palette_ptr[x], GfxDecode_Buf->format, 0xFF); + } + + fx_vdc_chips[(GfxDecode_Layer - 4) / 2]->DoGfxDecode(GfxDecode_Buf->pixels, neo_palette, GfxDecode_Buf->MakeColor(0, 0, 0, 0xFF), (GfxDecode_Layer - 4) & 1, GfxDecode_Buf->w, GfxDecode_Buf->h, GfxDecode_Scroll); + } + else if(GfxDecode_Layer < 4) + { + int n = GfxDecode_Layer; + uint16 bgmode = (king->bgmode >> (n * 4)) & 0xF; + uint32 cg_offset = king->BGCGAddr[n] * 1024; + uint32 bat_and_cg_page = (king->PageSetting & 0x0010) ? 1 : 0; + uint32 *target = GfxDecode_Buf->pixels; + uint32 layer_or = 0; + uint32 page_addr_or = bat_and_cg_page ? 0x40000 : 0x00000; + uint32 palette_offset = fx_vce.palette_offset[1 + (n >> 1)] >> ((n & 1) ? 8 : 0); + palette_offset <<= 1; + palette_offset &= 0x1FF; + uint32 *palette_ptr = &vce_rendercache.palette_table_cache[palette_offset]; + int tile_width = 8; + int tile_height = 8; + + if(!(bgmode & 0x8)) + { + int shiftmoo = (king->BGSize[n] & 0xF0) >> 4; + if(shiftmoo < 3) shiftmoo = 3; + if(shiftmoo > 0xA) shiftmoo = 0xA; + tile_width = 1 << shiftmoo; + + shiftmoo = (king->BGSize[n] & 0x0F); + if(shiftmoo < 3) shiftmoo = 3; + if(shiftmoo > 0xA) shiftmoo = 0xA; + tile_height = 1 << shiftmoo; + + if(tile_width > GfxDecode_Buf->w) tile_width = GfxDecode_Buf->w; + if(tile_height > GfxDecode_Buf->h) tile_height = GfxDecode_Buf->h; + } + + switch(bgmode & 0x7) + { + default: memset(target, 0, GfxDecode_Buf->w * GfxDecode_Buf->h * sizeof(uint32) * 3); + break; + + case 0x01: // 4 + { + pbn *= 4; + pbn &= 0x1FF; + + for(int y = 0; y < GfxDecode_Buf->h; y++) + { + for(int x = 0; x < GfxDecode_Buf->w; x+=8) + { + int which_tile = (x / 8) + (GfxDecode_Scroll + (y / 8)) * (GfxDecode_Buf->w / 8); + uint16 cg = king->KRAM[bat_and_cg_page][(cg_offset + (which_tile * 8) + (y & 0x7)) & 0x3FFFF]; + + target[x + 0] = target[x + 1] = target[x + 2] = target[x + 3] = + target[x + 4] = target[x + 5] = target[x + 6] = target[x + 7] = 0x008080; // For transparent pixels + + DRAWBG8x1_4(target + x, &cg, palette_ptr + pbn, layer_or); + + target[x + GfxDecode_Buf->w * 2 + 0] = target[x + GfxDecode_Buf->w * 2 + 1] = target[x + GfxDecode_Buf->w * 2 + 2] = target[x + GfxDecode_Buf->w * 2 + 3] = + target[x + GfxDecode_Buf->w * 2 + 4] = target[x + GfxDecode_Buf->w * 2 + 5] = target[x + GfxDecode_Buf->w * 2 + 6] = target[x + GfxDecode_Buf->w * 2 + 7] = ((cg_offset + (which_tile * 8)) & 0x3FFFF) | page_addr_or; + + target[x + GfxDecode_Buf->w*1 + 0]=target[x + GfxDecode_Buf->w*1 + 1]=target[x + GfxDecode_Buf->w*1 + 2]=target[x + GfxDecode_Buf->w*1 + 3] = + target[x + GfxDecode_Buf->w*1 + 4]=target[x + GfxDecode_Buf->w*1 + 5]=target[x + GfxDecode_Buf->w*1 + 6]=target[x + GfxDecode_Buf->w*1 + 7] = which_tile; + } + for(int x = 0; x < GfxDecode_Buf->w; x++) + target[x] = YUV888_TO_PF(target[x], GfxDecode_Buf->format, 0xFF); + target += GfxDecode_Buf->w * 3; + } + } + break; + + case 0x02: // 16 + { + pbn *= 8; + pbn &= 0x1FF; + for(int y = 0; y < GfxDecode_Buf->h; y++) + { + for(int x = 0; x < GfxDecode_Buf->w; x+=8) + { + int which_tile = (x / 8) + (GfxDecode_Scroll + (y / 8)) * (GfxDecode_Buf->w / 8); + uint16 *cgptr = &king->KRAM[bat_and_cg_page][(cg_offset + (which_tile * 16) + (y & 0x7) * 2) & 0x3FFFF]; + + target[x + 0] = target[x + 1] = target[x + 2] = target[x + 3] = + target[x + 4] = target[x + 5] = target[x + 6] = target[x + 7] = 0x008080; // For transparent pixels + + DRAWBG8x1_16(target + x, cgptr, palette_ptr + pbn, layer_or); + + target[x + GfxDecode_Buf->w*2 + 0] = target[x + GfxDecode_Buf->w*2 + 1] = target[x + GfxDecode_Buf->w*2 + 2] = target[x + GfxDecode_Buf->w*2 + 3] = + target[x + GfxDecode_Buf->w*2 + 4] = target[x + GfxDecode_Buf->w*2 + 5] = target[x + GfxDecode_Buf->w*2 + 6] = target[x + GfxDecode_Buf->w*2 + 7] = ((cg_offset + (which_tile * 16)) & 0x3FFFF) | page_addr_or; + + target[x + GfxDecode_Buf->w*1 + 0]=target[x + GfxDecode_Buf->w*1 + 1]=target[x + GfxDecode_Buf->w*1 + 2]=target[x + GfxDecode_Buf->w*1 + 3] = + target[x + GfxDecode_Buf->w*1 + 4]=target[x + GfxDecode_Buf->w*1 + 5]=target[x + GfxDecode_Buf->w*1 + 6]=target[x + GfxDecode_Buf->w*1 + 7] = which_tile; + } + for(int x = 0; x < GfxDecode_Buf->w; x++) + target[x] = YUV888_TO_PF(target[x], GfxDecode_Buf->format, 0xFF); + target += GfxDecode_Buf->w * 3; + } + } + break; + + case 0x03: // 256 + { + for(int y = 0; y < GfxDecode_Buf->h; y++) + { + for(int x = 0; x < GfxDecode_Buf->w; x+=8) + { + int which_tile = (x / 8) + (GfxDecode_Scroll + (y / 8)) * (GfxDecode_Buf->w / 8); + uint16 *cgptr = &king->KRAM[bat_and_cg_page][(cg_offset + (which_tile * 32) + (y & 0x7) * 4) & 0x3FFFF]; + + target[x + 0] = target[x + 1] = target[x + 2] = target[x + 3] = + target[x + 4] = target[x + 5] = target[x + 6] = target[x + 7] = 0x008080; // For transparent pixels + + DRAWBG8x1_256(target + x, cgptr, palette_ptr, layer_or); + + target[x + GfxDecode_Buf->w*2 + 0] = target[x + GfxDecode_Buf->w*2 + 1] = target[x + GfxDecode_Buf->w*2 + 2] = target[x + GfxDecode_Buf->w*2 + 3] = + target[x + GfxDecode_Buf->w*2 + 4] = target[x + GfxDecode_Buf->w*2 + 5] = target[x + GfxDecode_Buf->w*2 + 6] = target[x + GfxDecode_Buf->w*2 + 7] = ((cg_offset + (which_tile * 32)) & 0x3FFFF) | page_addr_or; + + target[x + GfxDecode_Buf->w*1 + 0]=target[x + GfxDecode_Buf->w*1 + 1]=target[x + GfxDecode_Buf->w*1 + 2]=target[x + GfxDecode_Buf->w*1 + 3] = + target[x + GfxDecode_Buf->w*1 + 4]=target[x + GfxDecode_Buf->w*1 + 5]=target[x + GfxDecode_Buf->w*1 + 6]=target[x + GfxDecode_Buf->w*1 + 7] = which_tile; + } + + for(int x = 0; x < GfxDecode_Buf->w; x++) + target[x] = YUV888_TO_PF(target[x], GfxDecode_Buf->format, 0xFF); + + target += GfxDecode_Buf->w * 3; + } + } + break; + + case 0x04: // 64K + for(int y = 0; y < GfxDecode_Buf->h; y++) + { + for(int x = 0; x < GfxDecode_Buf->w; x+=8) + { + int which_tile = (x / 8) + (GfxDecode_Scroll + (y / 8)) * (GfxDecode_Buf->w / 8); + uint16 *cgptr = &king->KRAM[bat_and_cg_page][(cg_offset + (which_tile * 64) + (y & 0x7) * 8) & 0x3FFFF]; + + target[x + 0] = target[x + 1] = target[x + 2] = target[x + 3] = + target[x + 4] = target[x + 5] = target[x + 6] = target[x + 7] = 0x008080; // For transparent pixels + + DRAWBG8x1_64K(target + x, cgptr, palette_ptr, layer_or); + } + + for(int x = 0; x < GfxDecode_Buf->w; x++) + target[x] = YUV888_TO_PF(target[x], GfxDecode_Buf->format, 0xFF); + + target += GfxDecode_Buf->w * 3; + } + break; + + case 0x05: // 16M + for(int y = 0; y < GfxDecode_Buf->h; y++) + { + for(int x = 0; x < GfxDecode_Buf->w; x+=8) + { + int which_tile = (x / 8) + (GfxDecode_Scroll + (y / 8)) * (GfxDecode_Buf->w / 8); + uint16 *cgptr = &king->KRAM[bat_and_cg_page][(cg_offset + (which_tile * 64) + (y & 0x7) * 8) & 0x3FFFF]; + + target[x + 0] = target[x + 1] = target[x + 2] = target[x + 3] = + target[x + 4] = target[x + 5] = target[x + 6] = target[x + 7] = 0x008080; // For transparent pixels + + DRAWBG8x1_16M(target + x, cgptr, palette_ptr, layer_or); + } + + for(int x = 0; x < GfxDecode_Buf->w; x++) + target[x] = YUV888_TO_PF(target[x], GfxDecode_Buf->format, 0xFF); + + target += GfxDecode_Buf->w * 3; + } + break; + + } + } + else + memset(GfxDecode_Buf->pixels, 0, GfxDecode_Buf->w * GfxDecode_Buf->h * sizeof(uint32) * 3); +} + +#endif diff --git a/Mednafen/mednafen/pcfx/king.h b/Mednafen/mednafen/pcfx/king.h new file mode 100644 index 0000000000..f0294e2d10 --- /dev/null +++ b/Mednafen/mednafen/pcfx/king.h @@ -0,0 +1,190 @@ +#ifndef __PCFX_KING_H +#define __PCFX_KING_H + +// +// Be sure to keep the numbered/lettered *_GSREG_* registers(MPROG0*, AFFIN*, etc.) here in contiguous sequential order(since we do stuff like "- KING_GSREG_MPROG0" +// in king.cpp. +// + +void KING_StartFrame(VDC **, EmulateSpecStruct *espec); +void KING_SetPixelFormat(const MDFN_PixelFormat &format); +uint16 FXVCE_Read16(uint32 A); +void FXVCE_Write16(uint32 A, uint16 V); + +#ifdef WANT_DEBUGGER +enum +{ + FXVCE_GSREG_Line = 0, + + FXVCE_GSREG_PRIO0, + FXVCE_GSREG_PRIO1, + + FXVCE_GSREG_PICMODE, + FXVCE_GSREG_PALRWOF, + FXVCE_GSREG_PALRWLA, + + FXVCE_GSREG_PALOFS0, + FXVCE_GSREG_PALOFS1, + FXVCE_GSREG_PALOFS2, + FXVCE_GSREG_PALOFS3, + + FXVCE_GSREG_CCR, + FXVCE_GSREG_BLE, + FXVCE_GSREG_SPBL, + + FXVCE_GSREG_COEFF0, + FXVCE_GSREG_COEFF1, + FXVCE_GSREG_COEFF2, + FXVCE_GSREG_COEFF3, + FXVCE_GSREG_COEFF4, + FXVCE_GSREG_COEFF5, + + FXVCE_GSREG_CKeyY, + FXVCE_GSREG_CKeyU, + FXVCE_GSREG_CKeyV +}; + +uint32 FXVCE_GetRegister(const unsigned int id, char* special, const uint32 special_len); +void FXVCE_SetRegister(const unsigned int id, uint32 value); +#endif + +uint8 KING_Read8(const v810_timestamp_t timestamp, uint32 A); +uint16 KING_Read16(const v810_timestamp_t timestamp, uint32 A); + +void KING_Write8(const v810_timestamp_t timestamp, uint32 A, uint8 V); +void KING_Write16(const v810_timestamp_t timestamp, uint32 A, uint16 V); +void KING_Init(void); +void KING_Close(void); +void KING_Reset(const v810_timestamp_t timestamp); + +uint16 KING_GetADPCMHalfWord(int ch); + +uint8 KING_MemPeek(uint32 A); + +uint8 KING_RB_Fetch(); + +void KING_SetLayerEnableMask(uint64 mask); + +void KING_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +#ifdef WANT_DEBUGGER +enum +{ + KING_GSREG_AR = 0, + KING_GSREG_MPROGADDR, + KING_GSREG_MPROGCTRL, + + KING_GSREG_PAGESET, + KING_GSREG_RTCTRL, + KING_GSREG_RKRAMA, + KING_GSREG_RSTART, + KING_GSREG_RCOUNT, + KING_GSREG_RIRQLINE, + KING_GSREG_KRAMWA, + KING_GSREG_KRAMRA, + KING_GSREG_DMATA, + KING_GSREG_DMATS, + KING_GSREG_DMASTT, + KING_GSREG_ADPCMCTRL, + + KING_GSREG_ADPCMBM0, + KING_GSREG_ADPCMBM1, + + KING_GSREG_ADPCMPA0, + KING_GSREG_ADPCMPA1, + + KING_GSREG_ADPCMSA0, + KING_GSREG_ADPCMSA1, + + KING_GSREG_ADPCMIA0, + KING_GSREG_ADPCMIA1, + + KING_GSREG_ADPCMEA0, + KING_GSREG_ADPCMEA1, + + KING_GSREG_ADPCMStat, + KING_GSREG_Reg01, + KING_GSREG_Reg02, + KING_GSREG_Reg03, + KING_GSREG_SUBCC, + KING_GSREG_DB, + KING_GSREG_BSY, + KING_GSREG_REQ, + KING_GSREG_ACK, + KING_GSREG_MSG, + KING_GSREG_IO, + KING_GSREG_CD, + KING_GSREG_SEL, + + KING_GSREG_BGMODE, + KING_GSREG_BGPRIO, + KING_GSREG_BGSCRM, + + KING_GSREG_BGSIZ0, + KING_GSREG_BGSIZ1, + KING_GSREG_BGSIZ2, + KING_GSREG_BGSIZ3, + + KING_GSREG_BGXSC0, + KING_GSREG_BGXSC1, + KING_GSREG_BGXSC2, + KING_GSREG_BGXSC3, + + KING_GSREG_BGYSC0, + KING_GSREG_BGYSC1, + KING_GSREG_BGYSC2, + KING_GSREG_BGYSC3, + + KING_GSREG_BGBATS, + KING_GSREG_BGBAT0, + KING_GSREG_BGBAT1, + KING_GSREG_BGBAT2, + KING_GSREG_BGBAT3, + + KING_GSREG_BGCGS, + KING_GSREG_BGCG0, + KING_GSREG_BGCG1, + KING_GSREG_BGCG2, + KING_GSREG_BGCG3, + + KING_GSREG_AFFINA, + KING_GSREG_AFFINB, + KING_GSREG_AFFINC, + KING_GSREG_AFFIND, + + KING_GSREG_AFFINX, + KING_GSREG_AFFINY, + + KING_GSREG_MPROG0, + KING_GSREG_MPROG1, + KING_GSREG_MPROG2, + KING_GSREG_MPROG3, + KING_GSREG_MPROG4, + KING_GSREG_MPROG5, + KING_GSREG_MPROG6, + KING_GSREG_MPROG7, + KING_GSREG_MPROG8, + KING_GSREG_MPROG9, + KING_GSREG_MPROGA, + KING_GSREG_MPROGB, + KING_GSREG_MPROGC, + KING_GSREG_MPROGD, + KING_GSREG_MPROGE, + KING_GSREG_MPROGF +}; + +uint32 KING_GetRegister(const unsigned int id, char* special, const uint32 special_len); +void KING_SetRegister(const unsigned int id, uint32 value); +#endif + +void KING_SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn); + +void KING_NotifyOfBPE(bool read, bool write); + +void KING_SetLogFunc(void (*logfunc)(const char *, const char *, ...)); + +void KING_EndFrame(v810_timestamp_t timestamp); +void KING_ResetTS(v810_timestamp_t ts_base); + +v810_timestamp_t MDFN_FASTCALL KING_Update(const v810_timestamp_t timestamp); +#endif diff --git a/Mednafen/mednafen/pcfx/king_mix_body.inc b/Mednafen/mednafen/pcfx/king_mix_body.inc new file mode 100644 index 0000000000..686ef8ebea --- /dev/null +++ b/Mednafen/mednafen/pcfx/king_mix_body.inc @@ -0,0 +1,62 @@ + if(fx_vce.dot_clock) // No cellophane in 7.16MHz pixel mode + { + if(HighDotClockWidth == 341) + for(unsigned int x = 0; x < 341; x++) + { + LAYER_MIX_BODY(x * 256 / 341, x); + LAYER_MIX_FINAL_NOCELLO; + } + else if(HighDotClockWidth == 256) + for(unsigned int x = 0; x < 256; x++) + { + LAYER_MIX_BODY(x, x * 341 / 256); + LAYER_MIX_FINAL_NOCELLO; + } + else + for(unsigned int x = 0; x < 1024; x++) + { + LAYER_MIX_BODY(x / 4, x / 3); + LAYER_MIX_FINAL_NOCELLO; + } + } + else if((vce_rendercache.BLE & 0xC000) == 0xC000) // Front cellophane + { + uint8 CCR_Y_front = vce_rendercache.coefficient_mul_table_y[(vce_rendercache.coefficients[0] >> 8) & 0xF][(vce_rendercache.CCR >> 8) & 0xFF]; + int8 CCR_U_front = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[0] >> 4) & 0xF][(vce_rendercache.CCR & 0xF0)]; + int8 CCR_V_front = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[0] >> 0) & 0xF][(vce_rendercache.CCR << 4) & 0xF0]; + + BPC_Cache = 0x008080 | (LAYER_NONE << 28); + + for(unsigned int x = 0; x < 256; x++) + { + LAYER_MIX_BODY(x, x); + LAYER_MIX_FINAL_FRONT_CELLO; + } + } + else if((vce_rendercache.BLE & 0xC000) == 0x4000) // Back cellophane + { + BPC_Cache = ((vce_rendercache.CCR & 0xFF00) << 8) | ((vce_rendercache.CCR & 0xF0) << 8) | ((vce_rendercache.CCR & 0x0F) << 4) | (LAYER_NONE << 28); + + for(unsigned int x = 0; x < 256; x++) + { + LAYER_MIX_BODY(x, x); + LAYER_MIX_FINAL_BACK_CELLO; + } + } + else if(ble_cache_any) // No front/back cello, but cellophane on at least 1 layer + { + for(unsigned int x = 0; x < 256; x++) + { + LAYER_MIX_BODY(x, x); + LAYER_MIX_FINAL_CELLO + } + } + else // No cellophane at all + { + for(unsigned int x = 0; x < 256; x++) + { + LAYER_MIX_BODY(x, x); + LAYER_MIX_FINAL_NOCELLO + } + } + diff --git a/Mednafen/mednafen/pcfx/mem-handler.inc b/Mednafen/mednafen/pcfx/mem-handler.inc new file mode 100644 index 0000000000..eb7b4a13d8 --- /dev/null +++ b/Mednafen/mednafen/pcfx/mem-handler.inc @@ -0,0 +1,333 @@ +uint8 MDFN_FASTCALL mem_peekbyte(const v810_timestamp_t timestamp, const uint32 A) +{ + if(A <= 0x001FFFFF) + return(RAM[A]); + else if(A <= 0x00FFFFFF) + return(0xFF); + else if(A >= 0xF0000000) + return(BIOSROM[A & 0xFFFFF]); + else if(FXSCSIROM && A >= 0x80780000 && A <= 0x807FFFFF) + { + return(FXSCSIROM[A & 0x7FFFF]); + } + return(0xFF); +} + +uint16 MDFN_FASTCALL mem_peekhword(const v810_timestamp_t timestamp, const uint32 A) // TODO: Full memory map peeking. +{ + if(A <= 0x001FFFFF) + return MDFN_de16lsb(&RAM[A]); + else if(A <= 0x00FFFFFF) + return 0xFFFF; + else if(A >= 0xF0000000) + return MDFN_de16lsb(&BIOSROM[A & 0xFFFFF]); + else if(FXSCSIROM && A >= 0x80780000 && A <= 0x807FFFFF) + return MDFN_de16lsb(&FXSCSIROM[A & 0x7FFFF]); + + return 0xFFFF; +} + +static uint8 MDFN_FASTCALL mem_rbyte(v810_timestamp_t ×tamp, uint32 A) +{ + if(A <= 0x001FFFFF) + { + RAMLPCHECK; + return(RAM[A]); + } + else if(A <= 0x00FFFFFF) + { + RAMLPCHECK; + return(0xFF); + } + else if(A >= 0xF0000000) // BIOS ROM mirrored throughout 0xF0000000-0xFFFFFFFF, the "official" location + // is at 0xFFF00000(what about on a PC-FXGA??) + { + timestamp += 2; + return(BIOSROM[A & 0xFFFFF]); + } + else if(A >= 0xE0000000 && A <= 0xE7FFFFFF && !(A & 1)) + { + if(BRAMDisabled) + return(0xFF); + + //printf("%d\n", (A - 0xE0000000) >> 1); + return(BackupRAM[(A & 0xFFFF) >> 1]); + } + else if(A >= 0xE8000000 && A <= 0xE9FFFFFF) + { + if(BRAMDisabled) + return(0xFF); + + if(!(BackupControl & 0x2)) + { + FXDBG("Read8 from external BRAM when not enabled."); + } + + return(ExBackupRAM[(A & 0xFFFF) >> 1]); + } + else if(A >= 0x80000000 && A <= 0x807FFFFF) + { + //FXDBG("Mem->IO B Read Translation: %08x -> %08x", A, A & 0x7FFFFF); + return(port_rbyte(timestamp, A & 0x7FFFFF)); + } + FXDBG("Unknown byte read: %08x", A); + return(0xFF); +} + +static uint16 MDFN_FASTCALL mem_rhword(v810_timestamp_t ×tamp, uint32 A) +{ + if(A <= 0x001FFFFF) + { + RAMLPCHECK; + return MDFN_de16lsb(&RAM[A]); + } + else if(A <= 0x00FFFFFF) + { + RAMLPCHECK; + return(0xFFFF); + } + else if(A >= 0xF0000000) // BIOS ROM mirrored throughout 0xF0000000-0xFFFFFFFF, the "official" location + // is at 0xFFF00000 + { + timestamp += 2; + return MDFN_de16lsb(&BIOSROM[A & 0xFFFFF]); + } + else if(A >= 0xA0000000 && A <= 0xA3FFFFFF) + { + timestamp += 4; + return(FXVCE_Read16(0x4)); + } + else if(A >= 0xA4000000 && A <= 0xA7FFFFFF) + { + timestamp += 4; + return(fx_vdc_chips[0]->Read16(1)); + } + else if(A >= 0xA8000000 && A <= 0xABFFFFFF) + { + timestamp += 4; + return(fx_vdc_chips[1]->Read16(1)); + } + else if(A >= 0xAC000000 && A <= 0xAFFFFFFF) + { + timestamp += 4; + return(KING_Read16(timestamp, 0x604)); + } + else if(A >= 0xB0000000 && A <= 0xBFFFFFFF) // Write only + { + return(0); + } + else if(A >= 0xE0000000 && A <= 0xE7FFFFFF) + { + if(BRAMDisabled) + return(0xFFFF); + + //printf("%d\n", (A - 0xE0000000) >> 1); + return(BackupRAM[(A & 0xFFFF) >> 1]); + } + else if(A >= 0xE8000000 && A <= 0xE9FFFFFF) + { + if(BRAMDisabled) + return(0xFFFF); + + if(!(BackupControl & 0x2)) + { + FXDBG("Read16 from external BRAM when not enabled."); + } + + return(ExBackupRAM[(A & 0xFFFF) >> 1]); + } + else if(A >= 0xF8000000 && A <= 0xFFEFFFFF) // PIO + { + FXDBG("PIO H Read: %08x", A); + + return(0x00); + } + else if(A >= 0x80000000 && A <= 0x807FFFFF) + { + //FXDBG("Mem->IO H Read Translation: %08x -> %08x", A, A & 0x7FFFFF); + + return(port_rhword(timestamp, A & 0x7FFFFF)); + } + FXDBG("Unknown hword read: %08x", A); + + return(0xFFFF); +} + +static uint32 MDFN_FASTCALL mem_rword(v810_timestamp_t ×tamp, uint32 A) +{ + if(A <= 0x001FFFFF) + { + RAMLPCHECK; + return MDFN_de32lsb(&RAM[A]); + } + else if(A <= 0x00FFFFFF) + { + RAMLPCHECK; + return(0xFFFFFFFF); + } + else if(A >= 0xB0000000 && A <= 0xBFFFFFFF) // Write only + { + return(0); + } + else + { + uint32 ret; + + FXDBG("Warning: mem_rword() called for 16-bit bus access: %08x", A); + + ret = mem_rhword(timestamp, A); + ret |= mem_rhword(timestamp, A | 2) << 16; + + return(ret); + } + + FXDBG("Unknown word read: %08x", A); + + return(0xFFFFFFFF); +} + +static void MDFN_FASTCALL mem_wbyte(v810_timestamp_t ×tamp, uint32 A, uint8 V) +{ + if(A <= 0x001FFFFF) + { + RAMLPCHECK; + RAM[A] = V; + } + else if(A <= 0x00FFFFFF) + { + RAMLPCHECK; + } + else if(A >= 0xE0000000 && A <= 0xE7FFFFFF && !(A & 1)) + { + if(BRAMDisabled) + return; + + if(BackupControl & 0x1) + { + BackupSignalDirty |= (BackupRAM[(A & 0xFFFF) >> 1] != V); + BackupRAM[(A & 0xFFFF) >> 1] = V; + } + } + else if(A >= 0xE8000000 && A <= 0xE9FFFFFF) + { + //printf("ExWrite: %08x", A); + if(BRAMDisabled) + return; + + if(BackupControl & 0x2) + { + BackupSignalDirty |= (ExBackupRAM[(A & 0xFFFF) >> 1] != V); + ExBackupRAM[(A & 0xFFFF) >> 1] = V; + } + } + else if(A >= 0xF8000000 && A <= 0xFFEFFFFF) + { + FXDBG("PIO B Write: %08x %02x", A, V); + + // PIO? + } + else if(A >= 0x80000000 && A <= 0x807FFFFF) + { + //FXDBG("Mem->IO B Write Translation: %08x %02x -> %08x", A, V, A & 0x7FFFFF); + port_wbyte(timestamp, A & 0x7FFFFF, V); + } +} + +static void MDFN_FASTCALL mem_whword(v810_timestamp_t ×tamp, uint32 A, uint16 V) +{ + if(A <= 0x001FFFFF) + { + RAMLPCHECK; + MDFN_en16lsb(&RAM[A], V); + } + else if(A <= 0x00FFFFFF) + { + RAMLPCHECK; + } + else if(A >= 0xE0000000 && A <= 0xE7FFFFFF) + { + if(BRAMDisabled) + return; + + if(BackupControl & 0x1) + { + BackupSignalDirty |= (BackupRAM[(A & 0xFFFF) >> 1] != (uint8)V); + BackupRAM[(A & 0xFFFF) >> 1] = (uint8)V; + } + } + else if(A >= 0xE8000000 && A <= 0xE9FFFFFF) + { + //printf("ExWrite16: %08x", A); + if(BRAMDisabled) + return; + + if(BackupControl & 0x2) + { + BackupSignalDirty |= (ExBackupRAM[(A & 0xFFFF) >> 1] != (uint8)V); + ExBackupRAM[(A & 0xFFFF) >> 1] = (uint8)V; + } + } + else if(A >= 0xF8000000 && A <= 0xFFEFFFFF) + { + FXDBG("PIO H Write: %08x %04x", A, V); + + // PIO? + } + else if(A >= 0xA0000000 && A <= 0xAFFFFFFF) // Read only + { + + } + else if(A >= 0xB0000000 && A <= 0xB3FFFFFF) + { + timestamp += 2; + FXVCE_Write16(0x4, V); + } + else if(A >= 0xB4000000 && A <= 0xB7FFFFFF) + { + timestamp += 2; + fx_vdc_chips[0]->Write16(1, V); + } + else if(A >= 0xB8000000 && A <= 0xBBFFFFFF) + { + timestamp += 2; + fx_vdc_chips[1]->Write16(1, V); + } + else if(A >= 0xBC000000 && A <= 0xBFFFFFFF) + { + timestamp += 2; + KING_Write16(timestamp, 0x604, V); + } + else if(A >= 0x80000000 && A <= 0x807FFFFF) + { + //FXDBG("Mem->IO H Write Translation: %08x %04x -> %08x", A, V, A & 0x7FFFFF); + + port_whword(timestamp, A & 0x7FFFFF, V); + } + else + { + FXDBG("Unknown hword write: %08x %04x", A, V); + } +} + +static void MDFN_FASTCALL mem_wword(v810_timestamp_t ×tamp, uint32 A, uint32 V) +{ + if(A <= 0x001FFFFF) + { + RAMLPCHECK; + MDFN_en32lsb(&RAM[A], V); + } + else if(A <= 0x00FFFFFF) + { + RAMLPCHECK; + } + else if(A >= 0xA0000000 && A <= 0xAFFFFFFF) // Read only + { + + } + else + { + FXDBG("Warning: mem_wword() called for 16-bit bus access: %08x", A); + mem_whword(timestamp, A, V); + mem_whword(timestamp, A | 2, V >> 16); + } +} diff --git a/Mednafen/mednafen/pcfx/notes/GAME_NOTES b/Mednafen/mednafen/pcfx/notes/GAME_NOTES new file mode 100644 index 0000000000..9c5343cce4 --- /dev/null +++ b/Mednafen/mednafen/pcfx/notes/GAME_NOTES @@ -0,0 +1,140 @@ +------------------------- +Hardware scaling+rotation +------------------------- + +All Japan Female Pro Wrestling + Crazy zoom effects in the intro. + +Anime Freak FX Vol. 1 + Staff List text special effects. + +Anime Freak FX Vol. 2 + Crazy zoom effects in the intro. + +Anime Freak FX Vol. 3 + Staff List text special effects. + +Chip Chan Kick + Name entry screen. + +Cutey Honey FX + Map zoomin/zoomout. + +Der Langrisser FX + Progress/Map(?) when starting a new scenario. + +First Kiss Monogatari + Billboard current-day transition screen. + +Kishin Douji Zenki Vajura Fight FX + Screen blorping after defeating Marubasu. Outside level where you fight the + possessed frog for effects on one of the backgrounds. (Other places too???) + +Kokuu Hyouryuu Nirgends + While flying. + +Konpeki no Kantai + Overhead map screen. + +Last Imperial Prince + Title screen is flipped into place. + +Lunatic Dawn + Map screen. + +Megami Paradise II + Area transitions. + +Miraculum + Title screen, and in the air ship. + +Return to Zork + Background scaling. + +Super Power League FX + Baseball field. + +Tonari no Princess Rolfee + Scene transitions(sometimes). + +Tyoushin Heiki Zeroigar + Second stage boss. + + + +------------------ +256 color VDC mode +------------------ + +Angelique Tenkuu no Requim + +Angelique Special 2 + +Chip Chan Kick + Cybertech Custom screen, cutscenes. + +Ojousama Sousamou + +Tokimeki Card Paradise + + + +--------------- +Back cellophane +--------------- + +Last Imperial Prince + Screen darkening during dialogue, and upper/lower screen greenish tint bug afterwards...uses a non-black CCR value! + +Lunatic Dawn + Background fadeouts. + +PCE Fan Special CDROM Vol 2 + Fadeouts and fadeins. + +Sotsuguyou 2 + Fadeouts and fadeins. + +Team Innocent + Background fadeins. + + + +------------------------------------------------ +Bitstring Hardware I/O Map Mirrors in Memory Map +------------------------------------------------ + +Boundary Gate + +Super Power League FX + + + +---------------------------------- +KING BG mode/microprogram mismatch +---------------------------------- + +Megami Paradise II + +Tonari no Princess Rolfee + + + +------------------ +KING BG0 Subscreen +------------------ + +Angelique Special + Overhead map(probably a coding error on the game developers' part, but it's still + used to the extent that if it's not emulated, the map won't show). + + + +---------- +BIOS Notes +---------- + +CD+G Playback + Pausing/unpausing playback when playing a CD+G disc will cause corruption of the CD+G graphics. + + Using the scan forward/reverse when playing a CD+G disc will cause massive corruption of the CD+G graphics. diff --git a/Mednafen/mednafen/pcfx/pcfx.cpp b/Mednafen/mednafen/pcfx/pcfx.cpp new file mode 100644 index 0000000000..a4516a5961 --- /dev/null +++ b/Mednafen/mednafen/pcfx/pcfx.cpp @@ -0,0 +1,1167 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcfx.h" +#include "soundbox.h" +#include "input.h" +#include "king.h" +#include "timer.h" +#include "interrupt.h" +#include "debug.h" +#include "rainbow.h" +#include "huc6273.h" +#include "fxscsi.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +extern MDFNGI EmulatedPCFX; + +/* FIXME: soundbox, vce, vdc, rainbow, and king store wait states should be 4, not 2, but V810 has write buffers which can mask wait state penalties. + This is a hack to somewhat address the issue, but to really fix it, we need to handle write buffer emulation in the V810 emulation core itself. +*/ +static std::vector *cdifs = NULL; + +V810 PCFX_V810; + +static uint8 *BIOSROM = NULL; // 1MB +static uint8 *RAM = NULL; // 2MB +static uint8 *FXSCSIROM = NULL; // 512KiB + +static uint32 RAM_LPA; // Last page access + +static const int RAM_PageSize = 2048; +static const int RAM_PageNOTMask = ~(RAM_PageSize - 1); + +static uint16 Last_VDC_AR[2]; + +static bool WantHuC6273 = FALSE; + +//static +VDC *fx_vdc_chips[2]; + +static uint16 BackupControl; +static uint8 BackupRAM[0x8000], ExBackupRAM[0x8000]; +static uint8 ExBusReset; // I/O Register at 0x0700 + +static bool BRAMDisabled; // Cached at game load, don't remove this caching behavior or save game loss may result(if we ever get a GUI). + +// +// Set BackupSignalDirty to true on writes to BackupRAM[] and ExBackupRAM[], and on save state load. +// Set to false on save game load, and on periodic evaluation during emulation. +// +// Set BackupSaveDelay to 0 on save game load. +// +static bool BackupSignalDirty; +static uint32 BackupSaveDelay; + +static void SaveBackupMemory(void); + +// Checks to see if this main-RAM-area access +// is in the same DRAM page as the last access. +#define RAMLPCHECK \ +{ \ + if((A & RAM_PageNOTMask) != RAM_LPA) \ + { \ + timestamp += 3; \ + RAM_LPA = A & RAM_PageNOTMask; \ + } \ +} + +static v810_timestamp_t next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts; + +void PCFX_FixNonEvents(void) +{ + if(next_pad_ts & 0x40000000) + next_pad_ts = PCFX_EVENT_NONONO; + + if(next_timer_ts & 0x40000000) + next_timer_ts = PCFX_EVENT_NONONO; + + if(next_adpcm_ts & 0x40000000) + next_adpcm_ts = PCFX_EVENT_NONONO; + + if(next_king_ts & 0x40000000) + next_king_ts = PCFX_EVENT_NONONO; +} + +void PCFX_Event_Reset(void) +{ + next_pad_ts = PCFX_EVENT_NONONO; + next_timer_ts = PCFX_EVENT_NONONO; + next_adpcm_ts = PCFX_EVENT_NONONO; + next_king_ts = PCFX_EVENT_NONONO; +} + +static INLINE uint32 CalcNextTS(void) +{ + v810_timestamp_t next_timestamp = next_king_ts; + + if(next_timestamp > next_pad_ts) + next_timestamp = next_pad_ts; + + if(next_timestamp > next_timer_ts) + next_timestamp = next_timer_ts; + + if(next_timestamp > next_adpcm_ts) + next_timestamp = next_adpcm_ts; + + return(next_timestamp); +} + +static void RebaseTS(const v810_timestamp_t timestamp, const v810_timestamp_t new_base_timestamp) +{ + assert(next_pad_ts > timestamp); + assert(next_timer_ts > timestamp); + assert(next_adpcm_ts > timestamp); + assert(next_king_ts > timestamp); + + next_pad_ts -= (timestamp - new_base_timestamp); + next_timer_ts -= (timestamp - new_base_timestamp); + next_adpcm_ts -= (timestamp - new_base_timestamp); + next_king_ts -= (timestamp - new_base_timestamp); + + //printf("RTS: %d %d %d %d\n", next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts); +} + + +void PCFX_SetEvent(const int type, const v810_timestamp_t next_timestamp) +{ + //assert(next_timestamp > PCFX_V810.v810_timestamp); + + if(type == PCFX_EVENT_PAD) + next_pad_ts = next_timestamp; + else if(type == PCFX_EVENT_TIMER) + next_timer_ts = next_timestamp; + else if(type == PCFX_EVENT_ADPCM) + next_adpcm_ts = next_timestamp; + else if(type == PCFX_EVENT_KING) + next_king_ts = next_timestamp; + + if(next_timestamp < PCFX_V810.GetEventNT()) + PCFX_V810.SetEventNT(next_timestamp); +} + +int32 MDFN_FASTCALL pcfx_event_handler(const v810_timestamp_t timestamp) +{ + if(timestamp >= next_king_ts) + next_king_ts = KING_Update(timestamp); + + if(timestamp >= next_pad_ts) + next_pad_ts = FXINPUT_Update(timestamp); + + if(timestamp >= next_timer_ts) + next_timer_ts = FXTIMER_Update(timestamp); + + if(timestamp >= next_adpcm_ts) + next_adpcm_ts = SoundBox_ADPCMUpdate(timestamp); + +#if 1 + assert(next_king_ts > timestamp); + assert(next_pad_ts > timestamp); + assert(next_timer_ts > timestamp); + assert(next_adpcm_ts > timestamp); +#endif + return(CalcNextTS()); +} + +// Called externally from debug.cpp +void ForceEventUpdates(const uint32 timestamp) +{ + next_king_ts = KING_Update(timestamp); + next_pad_ts = FXINPUT_Update(timestamp); + next_timer_ts = FXTIMER_Update(timestamp); + next_adpcm_ts = SoundBox_ADPCMUpdate(timestamp); + + //printf("Meow: %d\n", CalcNextTS()); + PCFX_V810.SetEventNT(CalcNextTS()); + + //printf("FEU: %d %d %d %d\n", next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts); +} + +#include "io-handler.inc" +#include "mem-handler.inc" + +typedef struct +{ + int8 tracknum; + int8 format; + uint32 lba; +} CDGameEntryTrack; + +typedef struct +{ + const char *name; + const char *name_original; // Original non-Romanized text. + const uint32 flags; // Emulation flags. + const unsigned int discs; // Number of discs for this game. + CDGameEntryTrack tracks[2][100]; // 99 tracks and 1 leadout track +} CDGameEntry; + +#define CDGE_FORMAT_AUDIO 0 +#define CDGE_FORMAT_DATA 1 + +#define CDGE_FLAG_ACCURATE_V810 0x01 +#define CDGE_FLAG_FXGA 0x02 + +static uint32 EmuFlags; + +static CDGameEntry GameList[] = +{ + #include "gamedb.inc" +}; + + +static void Emulate(EmulateSpecStruct *espec) +{ + //printf("%d\n", PCFX_V810.v810_timestamp); + + FXINPUT_Frame(); + + MDFNMP_ApplyPeriodicCheats(); + + if(espec->VideoFormatChanged) + KING_SetPixelFormat(espec->surface->format); //.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift); + + if(espec->SoundFormatChanged) + SoundBox_SetSoundRate(espec->SoundRate); + + + KING_StartFrame(fx_vdc_chips, espec); //espec->surface, &espec->DisplayRect, espec->LineWidths, espec->skip); + + v810_timestamp_t v810_timestamp; + v810_timestamp = PCFX_V810.Run(pcfx_event_handler); + + + PCFX_FixNonEvents(); + + // Call before resetting v810_timestamp + ForceEventUpdates(v810_timestamp); + + // + // Call KING_EndFrame() before SoundBox_Flush(), otherwise CD-DA audio distortion will occur due to sound data being updated + // after it was needed instead of before. + // + KING_EndFrame(v810_timestamp); + + // + // new_base_ts is guaranteed to be <= v810_timestamp + // + v810_timestamp_t new_base_ts; + espec->SoundBufSize = SoundBox_Flush(v810_timestamp, &new_base_ts, espec->SoundBuf, espec->SoundBufMaxSize, espec->NeedSoundReverse); + espec->NeedSoundReverse = false; + + KING_ResetTS(new_base_ts); + FXTIMER_ResetTS(new_base_ts); + FXINPUT_ResetTS(new_base_ts); + SoundBox_ResetTS(new_base_ts); + + // Call this AFTER all the EndFrame/Flush/ResetTS stuff + RebaseTS(v810_timestamp, new_base_ts); + + espec->MasterCycles = v810_timestamp - new_base_ts; + + PCFX_V810.ResetTS(new_base_ts); + + // + // + // + if(BackupSignalDirty) + { + BackupSaveDelay = 120; + BackupSignalDirty = false; + } + else if(BackupSaveDelay) + { + BackupSaveDelay--; + + if(!BackupSaveDelay) + { + //puts("SAVE"); + try + { + SaveBackupMemory(); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Error saving save-game memory: %s"), e.what()); + MDFN_DispMessage(_("Error saving save-game memory: %s"), e.what()); + BackupSaveDelay = 60 * 60; // Try it again in about 60 seconds emulated time(unless more writes occur to the backup memory before then, then the regular delay + // will be used from that time). + } + } + } +} + +static void PCFX_Reset(void) +{ + const uint32 timestamp = PCFX_V810.v810_timestamp; + + //printf("Reset: %d\n", timestamp); + + // Make sure all devices are synched to current timestamp before calling their Reset()/Power()(though devices should already do this sort of thing on their + // own, but it's not implemented for all of them yet, and even if it was all implemented this is also INSURANCE). + ForceEventUpdates(timestamp); + + PCFX_Event_Reset(); + + RAM_LPA = 0; + + ExBusReset = 0; + BackupControl = 0; + + Last_VDC_AR[0] = 0; + Last_VDC_AR[1] = 0; + + memset(RAM, 0x00, 2048 * 1024); + + for(int i = 0; i < 2; i++) + { + int32 dummy_ne MDFN_NOWARN_UNUSED; + + dummy_ne = fx_vdc_chips[i]->Reset(); + } + + KING_Reset(timestamp); // SCSICD_Power() is called from KING_Reset() + SoundBox_Reset(timestamp); + RAINBOW_Reset(); + + if(WantHuC6273) + HuC6273_Reset(); + + PCFXIRQ_Reset(); + FXTIMER_Reset(); + PCFX_V810.Reset(); + + // Force device updates so we can get new next event timestamp values. + ForceEventUpdates(timestamp); +} + +static void PCFX_Power(void) +{ + PCFX_Reset(); +} + +#ifdef WANT_DEBUGGER + +static uint8 GAS_SectorCache[2048]; +static int32 GAS_SectorCacheWhich = -1; // disc num is |'d in after << 24 + +static void PCFXDBG_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + int32 ws = 0; + + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFFFFFF; + *Buffer = mem_rbyte(ws, Address); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= 2048 * 1024 - 1; + *Buffer = RAM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "backup")) + { + while(Length--) + { + Address &= 0x7FFF; + *Buffer = BackupRAM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "exbackup")) + { + while(Length--) + { + Address &= 0x7FFF; + *Buffer = ExBackupRAM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "bios")) + { + while(Length--) + { + Address &= 1024 * 1024 - 1; + *Buffer = BIOSROM[Address]; + Address++; + Buffer++; + } + } + else if(!strncmp(name, "track", strlen("track"))) + { + int disc = 0, track = 0, sector_base = 0; + + trio_sscanf(name, "track%d-%d-%d", &disc, &track, §or_base); + + while(Length--) + { + int32 sector = (Address / 2048) + sector_base; + int32 sector_offset = Address % 2048; + + if((sector | (disc << 24)) != GAS_SectorCacheWhich) + { + if(!(*cdifs)[disc]->ReadSector(GAS_SectorCache, sector, 1)) + memset(GAS_SectorCache, 0, 2048); + + GAS_SectorCacheWhich = sector | (disc << 24); + } + + *Buffer = GAS_SectorCache[sector_offset]; + + Address++; + Buffer++; + } + } +} + +static void PCFXDBG_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFFFFFF; + if(Address >= 0xFFF00000 && Address <= 0xFFFFFFFF) + { + BIOSROM[Address & 0xFFFFF] = *Buffer; + } + else if(Address <= 0x1FFFFF) + { + RAM[Address & 0x1FFFFF] = *Buffer; + } + else if(Address >= 0xE0000000 && Address <= 0xE7FFFFFF) + { + if(!(Address & 1)) + { + BackupSignalDirty |= (BackupRAM[(Address & 0xFFFF) >> 1] != *Buffer); + BackupRAM[(Address & 0xFFFF) >> 1] = *Buffer; + } + } + else if(Address >= 0xE8000000 && Address <= 0xE9FFFFFF) + { + if(!(Address & 1)) + { + BackupSignalDirty |= (ExBackupRAM[(Address & 0xFFFF) >> 1] != *Buffer); + ExBackupRAM[(Address & 0xFFFF) >> 1] = *Buffer; + } + } + Address++; + Buffer++; + } + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= 2048 * 1024 - 1; + RAM[Address] = *Buffer; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "backup")) + { + while(Length--) + { + Address &= 0x7FFF; + BackupSignalDirty |= (BackupRAM[Address] != *Buffer); + BackupRAM[Address] = *Buffer; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "exbackup")) + { + while(Length--) + { + Address &= 0x7FFF; + BackupSignalDirty |= (ExBackupRAM[Address] != *Buffer); + ExBackupRAM[Address] = *Buffer; + Address++; + Buffer++; + } + } + + else if(!strcmp(name, "bios")) + { + while(Length--) + { + Address &= 1024 * 1024 - 1; + BIOSROM[Address] = *Buffer; + Address++; + Buffer++; + } + } + +} +#endif + +static void VDCA_IRQHook(bool asserted) +{ + PCFXIRQ_Assert(PCFXIRQ_SOURCE_VDCA, asserted); +} + +static void VDCB_IRQHook(bool asserted) +{ + PCFXIRQ_Assert(PCFXIRQ_SOURCE_VDCB, asserted); +} + +static void Cleanup(void) +{ + for(int i = 0; i < 2; i++) + { + if(fx_vdc_chips[i]) + { + delete fx_vdc_chips[i]; + fx_vdc_chips[i] = NULL; + } + } + + RAINBOW_Close(); + KING_Close(); + SoundBox_Kill(); + PCFX_V810.Kill(); + + // The allocated memory RAM and BIOSROM is free'd in V810_Kill() + RAM = NULL; + BIOSROM = NULL; +} + +static void LoadCommon(std::vector *CDInterfaces) +{ + V810_Emu_Mode cpu_mode; + + #ifdef WANT_DEBUGGER + PCFXDBG_Init(); + #endif + + cpu_mode = (V810_Emu_Mode)MDFN_GetSettingI("pcfx.cpu_emulation"); + if(cpu_mode == _V810_EMU_MODE_COUNT) + { + cpu_mode = (EmuFlags & CDGE_FLAG_ACCURATE_V810) ? V810_EMU_MODE_ACCURATE : V810_EMU_MODE_FAST; + } + + if(EmuFlags & CDGE_FLAG_FXGA) + { + //WantHuC6273 = TRUE; + } + + MDFN_printf(_("V810 Emulation Mode: %s\n"), (cpu_mode == V810_EMU_MODE_ACCURATE) ? _("Accurate") : _("Fast")); + PCFX_V810.Init(cpu_mode, false); + + uint32 RAM_Map_Addresses[1] = { 0x00000000 }; + uint32 BIOSROM_Map_Addresses[1] = { 0xFFF00000 }; + + RAM = PCFX_V810.SetFastMap(RAM_Map_Addresses, 0x00200000, 1, _("RAM")); + BIOSROM = PCFX_V810.SetFastMap(BIOSROM_Map_Addresses, 0x00100000, 1, _("BIOS ROM")); + + { + std::string biospath = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS("pcfx.bios")); + MDFNFILE BIOSFile(biospath.c_str(), NULL, "BIOS"); + + if(BIOSFile.size() != 1024 * 1024) + throw MDFN_Error(0, _("BIOS ROM file is incorrect size.\n")); + + BIOSFile.read(BIOSROM, 1024 * 1024); + BIOSFile.Close(); + } + + { + std::string fxscsi_path = MDFN_GetSettingS("pcfx.fxscsi"); // For developers only, so don't make it convenient. + + if(fxscsi_path != "0" && fxscsi_path != "" && fxscsi_path != "none") + { + FileStream FXSCSIFile(fxscsi_path, FileStream::MODE_READ); + uint32 FXSCSI_Map_Addresses[1] = { 0x80780000 }; + + FXSCSIROM = PCFX_V810.SetFastMap(FXSCSI_Map_Addresses, 0x0080000, 1, _("FX-SCSI ROM")); + + FXSCSIFile.read(FXSCSIROM, 1024 * 512); + } + } + + #ifdef WANT_DEBUGGER + ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, "cpu", "CPU Physical", 32); + ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, "ram", "RAM", 21); + ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, "backup", "Internal Backup Memory", 15); + ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, "exbackup", "External Backup Memory", 15); + ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, "bios", "BIOS ROM", 20); + #endif + + for(int i = 0; i < 2; i++) + { + fx_vdc_chips[i] = new VDC(MDFN_GetSettingB("pcfx.nospritelimit"), 65536); + fx_vdc_chips[i]->SetWSHook(NULL); + fx_vdc_chips[i]->SetIRQHook(i ? VDCB_IRQHook : VDCA_IRQHook); + + //fx_vdc_chips[0] = FXVDC_Init(PCFXIRQ_SOURCE_VDCA, MDFN_GetSettingB("pcfx.nospritelimit")); + //fx_vdc_chips[1] = FXVDC_Init(PCFXIRQ_SOURCE_VDCB, MDFN_GetSettingB("pcfx.nospritelimit")); + } + + SoundBox_Init(MDFN_GetSettingB("pcfx.adpcm.emulate_buggy_codec"), MDFN_GetSettingB("pcfx.adpcm.suppress_channel_reset_clicks")); + RAINBOW_Init(MDFN_GetSettingB("pcfx.rainbow.chromaip")); + FXINPUT_Init(); + FXTIMER_Init(); + + if(WantHuC6273) + HuC6273_Init(); + + KING_Init(); + + SCSICD_SetDisc(true, NULL, true); + + #ifdef WANT_DEBUGGER + for(unsigned disc = 0; disc < CDInterfaces->size(); disc++) + { + CDUtility::TOC toc; + + (*CDInterfaces)[disc]->ReadTOC(&toc); + + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + char tmpn[256], tmpln[256]; + uint32 sectors; + + trio_snprintf(tmpn, 256, "track%d-%d-%d", disc, track, toc.tracks[track].lba); + trio_snprintf(tmpln, 256, "CD - Disc %d/%d - Track %d/%d", disc + 1, (int)CDInterfaces->size(), track, toc.last_track - toc.first_track + 1); + + sectors = toc.tracks[(track == toc.last_track) ? 100 : track + 1].lba - toc.tracks[track].lba; + ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, tmpn, tmpln, 0, sectors * 2048); + } + } + } + #endif + + + MDFNGameInfo->fps = (uint32)((double)7159090.90909090 / 455 / 263 * 65536 * 256); + + MDFNGameInfo->nominal_height = MDFN_GetSettingUI("pcfx.slend") - MDFN_GetSettingUI("pcfx.slstart") + 1; + + // Emulation raw framebuffer image should always be of 256 width when the pcfx.high_dotclock_width setting is set to "256", + // but it could be either 256 or 341 when the setting is set to "341", so stay with 1024 in that case so we won't have + // a messed up aspect ratio in our recorded QuickTime movies. + MDFNGameInfo->lcm_width = (MDFN_GetSettingUI("pcfx.high_dotclock_width") == 256) ? 256 : 1024; + MDFNGameInfo->lcm_height = MDFNGameInfo->nominal_height; + + MDFNMP_Init(1024 * 1024, ((uint64)1 << 32) / (1024 * 1024)); + MDFNMP_AddRAM(2048 * 1024, 0x00000000, RAM); + + + BackupSignalDirty = false; + BackupSaveDelay = 0; + + BRAMDisabled = MDFN_GetSettingB("pcfx.disable_bram"); + + if(BRAMDisabled) + MDFN_printf(_("Warning: BRAM is disabled per pcfx.disable_bram setting. This is simulating a malfunction.\n")); + + if(!BRAMDisabled) + { + // Initialize backup RAM + memset(BackupRAM, 0, sizeof(BackupRAM)); + memset(ExBackupRAM, 0, sizeof(ExBackupRAM)); + + static const uint8 BRInit00[] = { 0x24, 0x8A, 0xDF, 0x50, 0x43, 0x46, 0x58, 0x53, 0x72, 0x61, 0x6D, 0x80, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0xF9, 0x03, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + static const uint8 BRInit80[] = { 0xF9, 0xFF, 0xFF }; + + memcpy(BackupRAM + 0x00, BRInit00, sizeof(BRInit00)); + memcpy(BackupRAM + 0x80, BRInit80, sizeof(BRInit80)); + + + static const uint8 ExBRInit00[] = { 0x24, 0x8A, 0xDF, 0x50, 0x43, 0x46, 0x58, 0x43, 0x61, 0x72, 0x64, 0x80, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0xF9, 0x03, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + static const uint8 ExBRInit80[] = { 0xF9, 0xFF, 0xFF }; + + memcpy(ExBackupRAM + 0x00, ExBRInit00, sizeof(ExBRInit00)); + memcpy(ExBackupRAM + 0x80, ExBRInit80, sizeof(ExBRInit80)); + + try + { + std::string save_path = MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"); + GZFileStream savefp(save_path, GZFileStream::MODE::READ); + const uint64 fp_size_tmp = savefp.size(); + + if(fp_size_tmp != 65536) + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu bytes."), save_path.c_str(), (unsigned long long)fp_size_tmp, (unsigned long long)65536); + + savefp.read(BackupRAM, 0x8000); + savefp.read(ExBackupRAM, 0x8000); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } + + // Default to 16-bit bus. + for(int i = 0; i < 256; i++) + { + PCFX_V810.SetMemReadBus32(i, FALSE); + PCFX_V810.SetMemWriteBus32(i, FALSE); + } + + // 16MiB RAM area. + PCFX_V810.SetMemReadBus32(0, TRUE); + PCFX_V810.SetMemWriteBus32(0, TRUE); + + // Bitstring read range + for(int i = 0xA0; i <= 0xAF; i++) + { + PCFX_V810.SetMemReadBus32(i, FALSE); // Reads to the read range are 16-bit, and + PCFX_V810.SetMemWriteBus32(i, TRUE); // writes are 32-bit. + } + + // Bitstring write range + for(int i = 0xB0; i <= 0xBF; i++) + { + PCFX_V810.SetMemReadBus32(i, TRUE); // Reads to the write range are 32-bit, + PCFX_V810.SetMemWriteBus32(i, FALSE); // but writes are 16-bit! + } + + // BIOS area + for(int i = 0xF0; i <= 0xFF; i++) + { + PCFX_V810.SetMemReadBus32(i, FALSE); + PCFX_V810.SetMemWriteBus32(i, FALSE); + } + + PCFX_V810.SetMemReadHandlers(mem_rbyte, mem_rhword, mem_rword); + PCFX_V810.SetMemWriteHandlers(mem_wbyte, mem_whword, mem_wword); + + PCFX_V810.SetIOReadHandlers(port_rbyte, port_rhword, NULL); + PCFX_V810.SetIOWriteHandlers(port_wbyte, port_whword, NULL); +} + +static void DoMD5CDVoodoo(std::vector *CDInterfaces) +{ + const CDGameEntry *found_entry = NULL; + CDUtility::TOC toc; + + #if 0 + puts("{"); + puts(" ,"); + puts(" ,"); + puts(" 0,"); + puts(" 1,"); + puts(" {"); + puts(" {"); + + for(int i = CDIF_GetFirstTrack(); i <= CDIF_GetLastTrack(); i++) + { + CDIF_Track_Format tf; + + CDIF_GetTrackFormat(i, tf); + + printf(" { %d, %s, %d },\n", i, (tf == CDIF_FORMAT_AUDIO) ? "CDIF_FORMAT_AUDIO" : "CDIF_FORMAT_MODE1", CDIF_GetTrackStartPositionLBA(i)); + } + printf(" { -1, (CDIF_Track_Format)-1, %d },\n", CDIF_GetSectorCountLBA()); + puts(" }"); + puts(" }"); + puts("},"); + //exit(1); + #endif + + for(unsigned if_disc = 0; if_disc < CDInterfaces->size(); if_disc++) + { + (*CDInterfaces)[if_disc]->ReadTOC(&toc); + + if(toc.first_track == 1) + { + for(unsigned int g = 0; g < sizeof(GameList) / sizeof(CDGameEntry); g++) + { + const CDGameEntry *entry = &GameList[g]; + + assert(entry->discs == 1 || entry->discs == 2); + + for(unsigned int disc = 0; disc < entry->discs; disc++) + { + const CDGameEntryTrack *et = entry->tracks[disc]; + bool GameFound = TRUE; + + while(et->tracknum != -1 && GameFound) + { + assert(et->tracknum > 0 && et->tracknum < 100); + + if(toc.tracks[et->tracknum].lba != et->lba) + GameFound = FALSE; + + if( ((et->format == CDGE_FORMAT_DATA) ? 0x4 : 0x0) != (toc.tracks[et->tracknum].control & 0x4)) + GameFound = FALSE; + + et++; + } + + if(et->tracknum == -1) + { + if((et - 1)->tracknum != toc.last_track) + GameFound = FALSE; + + if(et->lba != toc.tracks[100].lba) + GameFound = FALSE; + } + + if(GameFound) + { + found_entry = entry; + goto FoundIt; + } + } // End disc count loop + } + } + + FoundIt: ; + + if(found_entry) + { + EmuFlags = found_entry->flags; + + if(found_entry->discs > 1) + { + const char *hash_prefix = "Mednafen PC-FX Multi-Game Set"; + md5_context md5_gameset; + + md5_gameset.starts(); + + md5_gameset.update_string(hash_prefix); + + for(unsigned int disc = 0; disc < found_entry->discs; disc++) + { + const CDGameEntryTrack *et = found_entry->tracks[disc]; + + while(et->tracknum) + { + md5_gameset.update_u32_as_lsb(et->tracknum); + md5_gameset.update_u32_as_lsb((uint32)et->format); + md5_gameset.update_u32_as_lsb(et->lba); + + if(et->tracknum == -1) + break; + et++; + } + } + md5_gameset.finish(MDFNGameInfo->GameSetMD5); + MDFNGameInfo->GameSetMD5Valid = TRUE; + } + //printf("%s\n", found_entry->name); + MDFNGameInfo->name = strdup(found_entry->name); + break; + } + } // end: for(unsigned if_disc = 0; if_disc < CDInterfaces->size(); if_disc++) + + MDFN_printf(_("CD Layout MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + if(MDFNGameInfo->GameSetMD5Valid) + MDFN_printf(_("GameSet MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->GameSetMD5, 0).c_str()); +} + +// PC-FX BIOS will look at all data tracks(not just the first one), in contrast to the PCE CD BIOS, which only looks +// at the first data track. +static bool TestMagicCD(std::vector *CDInterfaces) +{ + CDIF *cdiface = (*CDInterfaces)[0]; + CDUtility::TOC toc; + uint8 sector_buffer[2048]; + + memset(sector_buffer, 0, sizeof(sector_buffer)); + + cdiface->ReadTOC(&toc); + + for(int32 track = toc.first_track; track <= toc.last_track; track++) + { + if(toc.tracks[track].control & 0x4) + { + cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1); + if(!strncmp("PC-FX:Hu_CD-ROM", (char*)sector_buffer, strlen("PC-FX:Hu_CD-ROM"))) + { + return(TRUE); + } + + if(!strncmp((char *)sector_buffer + 64, "PPPPHHHHOOOOTTTTOOOO____CCCCDDDD", 32)) + return(true); + } + } + return(FALSE); +} + +static void LoadCD(std::vector *CDInterfaces) +{ + try + { + EmuFlags = 0; + + cdifs = CDInterfaces; + + DoMD5CDVoodoo(CDInterfaces); + + LoadCommon(CDInterfaces); + + MDFN_printf(_("Emulated CD-ROM drive speed: %ux\n"), (unsigned int)MDFN_GetSettingUI("pcfx.cdspeed")); + + PCFX_Power(); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static bool SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + const RMD_Layout* rmd = EmulatedPCFX.RMD; + const RMD_Drive* rd = &rmd->Drives[drive_idx]; + const RMD_State* rs = &rd->PossibleStates[state_idx]; + + if(rs->MediaPresent && rs->MediaUsable) + { + SCSICD_SetDisc(false, (*cdifs)[media_idx]); + } + else + { + SCSICD_SetDisc(rs->MediaCanChange, NULL); + } + + return(true); +} + +static void SaveBackupMemory(void) +{ + if(!BRAMDisabled) + { + FileStream fp(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), FileStream::MODE_WRITE_INPLACE); + + fp.write(BackupRAM, 0x8000); + fp.write(ExBackupRAM, 0x8000); + + fp.truncate(fp.tell()); + fp.close(); + } +} + +static void CloseGame(void) +{ + try + { + SaveBackupMemory(); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Error saving save-game memory: %s"), e.what()); + } + + Cleanup(); +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_RESET: PCFX_Reset(); break; + case MDFN_MSC_POWER: PCFX_Power(); break; + } +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + const v810_timestamp_t timestamp = PCFX_V810.v810_timestamp; + + SFORMAT StateRegs[] = + { + SFARRAY(RAM, 0x200000), + SFARRAY16(Last_VDC_AR, 2), + SFVAR(BackupControl), + SFVAR(ExBusReset), + SFARRAY(BackupRAM, BRAMDisabled ? 0 : 0x8000), + SFARRAY(ExBackupRAM, BRAMDisabled ? 0 : 0x8000), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + for(int i = 0; i < 2; i++) + fx_vdc_chips[i]->StateAction(sm, load, data_only, i ? "VDC1" : "VDC0"); + + FXINPUT_StateAction(sm, load, data_only); + PCFXIRQ_StateAction(sm, load, data_only); + KING_StateAction(sm, load, data_only); + PCFX_V810.StateAction(sm, load, data_only); + FXTIMER_StateAction(sm, load, data_only); + SoundBox_StateAction(sm, load, data_only); + SCSICD_StateAction(sm, load, data_only, "CDRM"); + RAINBOW_StateAction(sm, load, data_only); + + if(load) + { + // + // Rather than bothering to store next event timestamp deltas in save states, we'll just recalculate next event times on save state load as a side effect + // of this call. + // + ForceEventUpdates(timestamp); + + if(!BRAMDisabled) + BackupSignalDirty = true; + } + + //printf("0x%08x, %d %d %d %d\n", load, next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts); +} + +static const MDFNSetting_EnumList V810Mode_List[] = +{ + { "fast", (int)V810_EMU_MODE_FAST, gettext_noop("Fast Mode"), gettext_noop("Fast mode trades timing accuracy, cache emulation, and executing from hardware registers and RAM not intended for code use for performance.")}, + { "accurate", (int)V810_EMU_MODE_ACCURATE, gettext_noop("Accurate Mode"), gettext_noop("Increased timing accuracy, though not perfect, along with cache emulation, at the cost of decreased performance. Additionally, even the pipeline isn't correctly and fully emulated in this mode.") }, + { "auto", (int)_V810_EMU_MODE_COUNT, gettext_noop("Auto Mode"), gettext_noop("Selects \"fast\" or \"accurate\" automatically based on an internal database. If the CD image is not recognized, defaults to \"fast\".") }, + { NULL, 0 }, +}; + + +static const MDFNSetting_EnumList HDCWidthList[] = +{ + { "256", 256, "256 pixels", gettext_noop("This value will cause heavy pixel distortion.") }, + { "341", 341, "341 pixels", gettext_noop("This value will cause moderate pixel distortion.") }, + { "1024", 1024, "1024 pixels", gettext_noop("This value will cause no pixel distortion as long as interpolation is enabled on the video output device and the resolution is sufficiently high, but it will use a lot of CPU time.") }, + { NULL, 0 }, +}; + +static MDFNSetting PCFXSettings[] = +{ + { "pcfx.input.port1.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on PC-FX port 1."), gettext_noop("EXPERIMENTAL emulation of the unreleased multitap. Enables ports 3 4 5."), MDFNST_BOOL, "0", NULL, NULL }, + { "pcfx.input.port2.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on PC-FX port 2."), gettext_noop("EXPERIMENTAL emulation of the unreleased multitap. Enables ports 6 7 8."), MDFNST_BOOL, "0", NULL, NULL }, + + + { "pcfx.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Mouse sensitivity."), NULL, MDFNST_FLOAT, "1.25", NULL, NULL }, + { "pcfx.disable_softreset", MDFNSF_NOFLAGS, gettext_noop("When RUN+SEL are pressed simultaneously, disable both buttons temporarily."), NULL, MDFNST_BOOL, "0", NULL, NULL, NULL, FXINPUT_SettingChanged }, + + { "pcfx.cpu_emulation", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("CPU emulation mode."), NULL, MDFNST_ENUM, "auto", NULL, NULL, NULL, NULL, V810Mode_List }, + { "pcfx.bios", MDFNSF_EMU_STATE, gettext_noop("Path to the ROM BIOS"), NULL, MDFNST_STRING, "pcfx.rom" }, + { "pcfx.fxscsi", MDFNSF_EMU_STATE, gettext_noop("Path to the FX-SCSI ROM"), gettext_noop("Intended for developers only."), MDFNST_STRING, "0" }, + { "pcfx.disable_bram", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Disable internal and external BRAM."), gettext_noop("It is intended for viewing games' error screens that may be different from simple BRAM full and uninitialized BRAM error screens, though it can cause the game to crash outright."), MDFNST_BOOL, "0" }, + { "pcfx.cdspeed", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulated CD-ROM speed."), gettext_noop("Setting the value higher than 2, the default, will decrease loading times in most games by some degree."), MDFNST_UINT, "2", "2", "10" }, + + { "pcfx.nospritelimit", MDFNSF_NOFLAGS, gettext_noop("Remove 16-sprites-per-scanline hardware limit."), NULL, MDFNST_BOOL, "0" }, + { "pcfx.high_dotclock_width", MDFNSF_NOFLAGS, gettext_noop("Emulated width for 7.16MHz dot-clock mode."), gettext_noop("Lower values are faster, but will cause some degree of pixel distortion."), MDFNST_ENUM, "1024", NULL, NULL, NULL, NULL, HDCWidthList }, + + { "pcfx.slstart", MDFNSF_NOFLAGS, gettext_noop("First rendered scanline."), NULL, MDFNST_UINT, "4", "0", "239" }, + { "pcfx.slend", MDFNSF_NOFLAGS, gettext_noop("Last rendered scanline."), NULL, MDFNST_UINT, "235", "0", "239" }, + + { "pcfx.rainbow.chromaip", MDFNSF_NOFLAGS, gettext_noop("Enable bilinear interpolation on the chroma channel of RAINBOW YUV output."), gettext_noop("This is an enhancement-related setting. Enabling it may cause graphical glitches with some games."), MDFNST_BOOL, "0" }, + + { "pcfx.adpcm.suppress_channel_reset_clicks", MDFNSF_NOFLAGS, gettext_noop("Hack to suppress clicks caused by forced channel resets."), NULL, MDFNST_BOOL, "1" }, + + // Hack that emulates the codec a buggy ADPCM encoder used for some games' ADPCM. Not enabled by default because it makes some games(with + //correctly-encoded ADPCM?) sound worse + { "pcfx.adpcm.emulate_buggy_codec", MDFNSF_NOFLAGS, gettext_noop("Hack that emulates the codec a buggy ADPCM encoder used for some games' ADPCM."), NULL, MDFNST_BOOL, "0" }, + + { "pcfx.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("Sound quality."), gettext_noop("Higher values correspond to better SNR and better preservation of higher frequencies(\"brightness\"), at the cost of increased computational complexity and a negligible increase in latency."), MDFNST_INT, "3", "0", "5" }, + { "pcfx.resamp_rate_error", MDFNSF_NOFLAGS, gettext_noop("Output rate tolerance."), gettext_noop("Lower values correspond to better matching of the output rate of the resampler to the actual desired output rate, at the expense of increased RAM usage and poorer CPU cache utilization."), MDFNST_FLOAT, "0.0000009", "0.0000001", "0.0000350" }, + + { NULL } +}; + + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + //{ ".ex", gettext_noop("PC-FX HuEXE") }, + { NULL, NULL } +}; + +MDFNGI EmulatedPCFX = +{ + "pcfx", + "PC-FX", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &PCFXDBGInfo, + #else + NULL, + #endif + PCFXPortInfo, + NULL, + NULL, + LoadCD, + TestMagicCD, + CloseGame, + + KING_SetLayerEnableMask, + "BG0\0BG1\0BG2\0BG3\0VDC-A BG\0VDC-A SPR\0VDC-B BG\0VDC-B SPR\0RAINBOW\0", + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + FXINPUT_TransformInput, + FXINPUT_SetInput, + SetMedia, + DoSimpleCommand, + PCFXSettings, + MDFN_MASTERCLOCK_FIXED(PCFX_MASTER_CLOCK), + 0, + TRUE, // Multires possible? + + 0, // lcm_width + 0, // lcm_height + NULL, // Dummy + + 288, // Nominal width + 240, // Nominal height + + 1024, // Framebuffer width + 512, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/pcfx/pcfx.h b/Mednafen/mednafen/pcfx/pcfx.h new file mode 100644 index 0000000000..4ef0dc2f56 --- /dev/null +++ b/Mednafen/mednafen/pcfx/pcfx.h @@ -0,0 +1,45 @@ +#ifndef __PCFX_PCFX_H +#define __PCFX_PCFX_H + +#include +#include +#include +#include +#include + +#define PCFX_MASTER_CLOCK 21477272.72 + +#if 0 + #define FXDBG(format, ...) MDFN_DebugPrint(format, ## __VA_ARGS__) +#else + #define FXDBG(format, ...) ((void)0) +#endif + +extern V810 PCFX_V810; + +uint8 MDFN_FASTCALL mem_peekbyte(const v810_timestamp_t timestamp, const uint32 A); +uint16 MDFN_FASTCALL mem_peekhword(const v810_timestamp_t timestamp, const uint32 A); + +int32 MDFN_FASTCALL pcfx_event_handler(const v810_timestamp_t timestamp); + +void ForceEventUpdates(const uint32 timestamp); + +extern VDC *fx_vdc_chips[2]; + +#define REGSETHW(_reg, _data, _msh) { _reg &= 0xFFFF << (_msh ? 0 : 16); _reg |= _data << (_msh ? 16 : 0); } +#define REGGETHW(_reg, _msh) ((_reg >> (_msh ? 16 : 0)) & 0xFFFF) + +enum +{ + PCFX_EVENT_PAD = 0, + PCFX_EVENT_TIMER, + PCFX_EVENT_KING, + PCFX_EVENT_ADPCM +}; + +#define PCFX_EVENT_NONONO 0x7fffffff + +void PCFX_SetEvent(const int type, const v810_timestamp_t next_timestamp); + + +#endif diff --git a/Mednafen/mednafen/pcfx/rainbow.cpp b/Mednafen/mednafen/pcfx/rainbow.cpp new file mode 100644 index 0000000000..800c98d938 --- /dev/null +++ b/Mednafen/mednafen/pcfx/rainbow.cpp @@ -0,0 +1,1074 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* MJPEG-ish decoder based on the algorithm and huffman data tables provided by David Michel of MagicEngine and MagicEngine-FX */ + +#include "pcfx.h" +#include "rainbow.h" +#include "king.h" +#include "interrupt.h" +#include "jrevdct.h" + +static bool ChromaIP; // Bilinearly interpolate chroma channel + +/* Y = luminance/luma, UV = chrominance/chroma */ + +typedef struct +{ + const uint8 *base; + const uint8 *codes; + const uint32 *minimum; + const uint32 *maximum; +} HuffmanTable; + +typedef struct +{ + uint8 *lut; // LUT for getting the code. + uint8 *lut_bits; // Bit count for the code +} HuffmanQuickLUT; + +/* Luma DC Huffman tables */ +static const uint8 dc_y_base[17] = +{ + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x09, + 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 +}; + +static const uint8 dc_y_codes[27] = +{ + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x01, + 0x08, 0x09, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, + 0x1D, 0x1E, 0x1F +}; + +static const uint32 dc_y_minimum[17] = +{ + 0x0000, 0x0000, 0x0000, 0x0000, 0x000E, 0x0000, 0x003C, 0x007A, + 0x0000, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000 +}; + +static const uint32 dc_y_maximum[17] = +{ + 0xFFFF, 0xFFFF, 0xFFFF, 0x0006, 0x000E, 0xFFFF, 0x003C, 0x007B, + 0xFFFF, 0x01FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF +}; + +static const HuffmanTable dc_y_table = +{ + dc_y_base, + dc_y_codes, + dc_y_minimum, + dc_y_maximum +}; + +/* Chroma DC Huffman tables */ + +static const uint8 dc_uv_base[17] = +{ + 0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 +}; + +static const uint8 dc_uv_codes[10] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09 +}; + +static const uint32 dc_uv_minimum[17] = +{ + 0x0000, 0x0000, 0x0000, 0x0006, 0x000E, 0x001E, 0x003E, 0x007E, + 0x00FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000 +}; + +static const uint32 dc_uv_maximum[17] = +{ + 0xFFFF, 0xFFFF, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x007E, + 0x00FF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF +}; + +static const HuffmanTable dc_uv_table = +{ + dc_uv_base, + dc_uv_codes, + dc_uv_minimum, + dc_uv_maximum +}; + +/* Luma AC Huffman tables */ +static const uint8 ac_y_base[17] = +{ + 0x00, 0x00, 0x00, 0x02, 0x03, 0x05, 0x09, 0x0D, + 0x00, 0x10, 0x00, 0x12, 0x22, 0x00, 0x00, 0x00, + 0x00 +}; + +static const uint8 ac_y_codes[146] = +{ + 0x01, 0x02, 0x03, 0x04, 0x11, 0x05, 0x12, 0x21, + 0x00, 0x06, 0x31, 0x41, 0x51, 0x13, 0x22, 0x61, + 0x07, 0x71, 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, + 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, + 0xE9, 0xF9, 0x08, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x52, 0x53, 0x54, 0x55, + 0x56, 0x57, 0x58, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, + 0xA8, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, + 0xB8, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, + 0xD8, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, + 0xE8, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0x10 +}; + +static const uint32 ac_y_minimum[17] = +{ + 0x0000, 0x0000, 0x0000, 0x0004, 0x000A, 0x0018, 0x0036, 0x0074, + 0x0000, 0x01DC, 0x0000, 0x0778, 0x0F10, 0x0000, 0x0000, 0x0000, + 0x0000 +}; + +static const uint32 ac_y_maximum[17] = +{ + 0xFFFF, 0xFFFF, 0x0001, 0x0004, 0x000B, 0x001A, 0x0039, 0x0076, + 0xFFFF, 0x01DD, 0xFFFF, 0x0787, 0x0F7F, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF +}; + +static const HuffmanTable ac_y_table = +{ + ac_y_base, + ac_y_codes, + ac_y_minimum, + ac_y_maximum +}; + +/* Chroma AC Huffman tables */ +static const uint8 ac_uv_base[17] = +{ + 0x00, 0x00, 0x00, 0x02, 0x03, 0x05, 0x0A, 0x0B, + 0x00, 0x10, 0x00, 0x12, 0x22, 0x00, 0x00, 0x00, + 0x00 +}; + +static const uint8 ac_uv_codes[146] = +{ + 0x01, 0x02, 0x11, 0x03, 0x21, 0x04, 0x12, 0x31, + 0x41, 0x00, 0x51, 0x05, 0x13, 0x22, 0x61, 0x71, + 0x32, 0x81, 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, + 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, + 0xE9, 0xF9, 0x06, 0x07, 0x08, 0x14, 0x15, 0x16, + 0x17, 0x18, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x42, 0x43, + 0x44, 0x45, 0x46, 0x47, 0x48, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x62, 0x63, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, + 0xA8, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, + 0xB8, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, + 0xD8, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, + 0xE8, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0x10 +}; + +static const uint32 ac_uv_minimum[17] = +{ + 0x0000, 0x0000, 0x0000, 0x0004, 0x000A, 0x0018, 0x0038, 0x0072, + 0x0000, 0x01DC, 0x0000, 0x0778, 0x0F10, 0x0000, 0x0000, 0x0000, + 0x0000 +}; + +static const uint32 ac_uv_maximum[17] = +{ + 0xFFFF, 0xFFFF, 0x0001, 0x0004, 0x000B, 0x001B, 0x0038, 0x0076, + 0xFFFF, 0x01DD, 0xFFFF, 0x0787, 0x0F7F, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF +}; + +static const HuffmanTable ac_uv_table = +{ + ac_uv_base, + ac_uv_codes, + ac_uv_minimum, + ac_uv_maximum +}; + +static const uint8 zigzag[63] = +{ + 0x01, 0x08, 0x10, 0x09, 0x02, 0x03, 0x0A, 0x11, + 0x18, 0x20, 0x19, 0x12, 0x0B, 0x04, 0x05, 0x0C, + 0x13, 0x1A, 0x21, 0x28, 0x30, 0x29, 0x22, 0x1B, + 0x14, 0x0D, 0x06, 0x07, 0x0E, 0x15, 0x1C, 0x23, + 0x2A, 0x31, 0x38, 0x39, 0x32, 0x2B, 0x24, 0x1D, + 0x16, 0x0F, 0x17, 0x1E, 0x25, 0x2C, 0x33, 0x3A, + 0x3B, 0x34, 0x2D, 0x26, 0x1F, 0x27, 0x2E, 0x35, + 0x3C, 0x3D, 0x36, 0x2F, 0x37, 0x3E, 0x3F +}; + +static HuffmanQuickLUT dc_y_qlut = { NULL }, dc_uv_qlut = { NULL}, ac_y_qlut = { NULL }, ac_uv_qlut = { NULL }; + +static void KillHuffmanLUT(HuffmanQuickLUT *qlut) +{ + if(qlut->lut) + MDFN_free(qlut->lut); + + if(qlut->lut_bits) + MDFN_free(qlut->lut_bits); + + qlut->lut = NULL; + qlut->lut_bits = NULL; +} + +static void BuildHuffmanLUT(const HuffmanTable *table, HuffmanQuickLUT *qlut, const int bitmax) +{ + // TODO: Allocate only (1 << bitmax) entries. + // TODO: What should we set invalid bitsequences/entries to? 0? ~0? Something else? + + qlut->lut = (uint8 *)MDFN_calloc_T(1 << 12, 1, _("Huffman LUT")); + qlut->lut_bits = (uint8 *)MDFN_calloc_T(1 << 12, 1, _("Huffman LUT")); + + for(int numbits = 2; numbits <= 12; numbits++) + { + if(table->maximum[numbits] != 0xFFFF) + { + for(unsigned int i = table->minimum[numbits]; i <= table->maximum[numbits]; i++) + { + for(int b = 0; b < (1 << (bitmax - numbits)); b++) + { + int lut_index = (i << (bitmax - numbits)) + b; + + assert(lut_index < (1 << bitmax)); + + qlut->lut[lut_index] = table->codes[table->base[numbits] + (i - table->minimum[numbits])]; + qlut->lut_bits[lut_index] = numbits; + } + } + } + } + + //printf("\n\n%d\n", bitmax); + for(int i = 0; i < (1 << bitmax); i++) + { + //if(!qlut->lut_bits[i]) + // printf("%d %d\n", i, qlut->lut_bits[i]); + } +} + + +static uint8 *DecodeBuffer[2] = { NULL, NULL }; +static int32 DecodeFormat[2]; // The format each buffer is in(-1 = invalid, 0 = palettized 8-bit, 1 = YUV) +static uint32 QuantTables[2][64], QuantTablesBase[2][64]; // 0 = Y, 1 = UV + +static uint32 DecodeBufferWhichRead; + +static int32 RasterReadPos; +static uint16 Control; +static uint16 NullRunY, NullRunU, NullRunV, HSync; +static uint16 HScroll; + +static uint32 bits_buffer; +static uint32 bits_buffered_bits; +static int32 bits_bytes_left; + +static void InitBits(int32 bcount) +{ + bits_bytes_left = bcount; + bits_buffer = 0; + bits_buffered_bits = 0; +} + +static INLINE uint8 FetchWidgywabbit(void) +{ + if(bits_bytes_left <= 0) + return(0); + + uint8 ret = KING_RB_Fetch(); + if(ret == 0xFF) + KING_RB_Fetch(); + + bits_bytes_left--; + + return(ret); +} + +enum +{ + MDFNBITS_PEEK = 1, + MDFNBITS_FUNNYSIGN = 2, +}; + +static INLINE uint32 GetBits(const unsigned int count, const unsigned int how = 0) +{ + uint32 ret; + + while(bits_buffered_bits < count) + { + bits_buffer <<= 8; + bits_buffer |= FetchWidgywabbit(); + bits_buffered_bits += 8; + } + + ret = (bits_buffer >> (bits_buffered_bits - count)) & ((1 << count) - 1); + + if(!(how & MDFNBITS_PEEK)) + bits_buffered_bits -= count; + + if((how & MDFNBITS_FUNNYSIGN) && count) + { + if(ret < (1U << (count - 1))) + ret += 1 - (1 << count); + } + + return(ret); +} + +// Note: SkipBits is intended to be called right after GetBits() with "how" MDFNBITS_PEEK, +// and the count pass to SkipBits must be less than or equal to the count passed to GetBits(). +static INLINE void SkipBits(const unsigned int count) +{ + bits_buffered_bits -= count; +} + + +static uint32 HappyColor; // Cached, calculated from null run yuv registers; +static void CalcHappyColor(void) +{ + uint8 y_c = (int16)NullRunY + 0x80; + uint8 u_c = (int16)NullRunU + 0x80; + uint8 v_c = (int16)NullRunV + 0x80; + + HappyColor = (y_c << 16) | (u_c << 8) | (v_c << 0); +} + +static uint32 get_ac_coeff(const HuffmanQuickLUT *table, int32 *zeroes) +{ + unsigned int numbits; + uint32 rawbits; + uint32 code; + + rawbits = GetBits(12, MDFNBITS_PEEK); + if((rawbits & 0xF80) == 0xF80) + //if(rawbits >= 0xF80) + { + SkipBits(5); + *zeroes = 0; + return(0); + } + + if(!table->lut_bits[rawbits]) + { + FXDBG("Invalid AC bit sequence: %03x\n", rawbits); + } + + code = table->lut[rawbits]; + SkipBits(table->lut_bits[rawbits]); + + numbits = code & 0xF; + *zeroes = code >> 4; + + return(GetBits(numbits, MDFNBITS_FUNNYSIGN)); +} + +static uint32 get_dc_coeff(const HuffmanQuickLUT *table, int32 *zeroes, int maxbits) +{ + uint32 code; + + for(;;) + { + uint32 rawbits = GetBits(maxbits, MDFNBITS_PEEK); + + if(!table->lut_bits[rawbits]) + { + FXDBG("Invalid DC bit sequence: %03x\n", rawbits); + } + + code = table->lut[rawbits]; + SkipBits(table->lut_bits[rawbits]); + + if(code < 0xF) + { + *zeroes = 0; + return(GetBits(code, MDFNBITS_FUNNYSIGN)); + } + else if(code == 0xF) + { + get_ac_coeff(&ac_y_qlut, zeroes); + (*zeroes)++; + return(0); + } + else if(code >= 0x10) + { + code -= 0x10; + + for(int i = 0; i < 64; i++) + { + // Y + uint32 coeff = (QuantTablesBase[0][i] * code) >> 2; + + if(coeff < 1) + coeff = 1; + else if(coeff > 0xFE) + coeff = 0xFE; + + QuantTables[0][i] = coeff; + + // UV + if(i) + coeff = (QuantTablesBase[1][i] * code) >> 2; + else + coeff = (QuantTablesBase[1][i]) >> 2; + + if(coeff < 1) + coeff = 1; + else if(coeff > 0xFE) + coeff = 0xFE; + + QuantTables[1][i] = coeff; + } + + } + } + +} + +static INLINE uint32 get_dc_y_coeff(int32 *zeroes) +{ + return(get_dc_coeff(&dc_y_qlut, zeroes, 9)); +} + +static uint32 get_dc_uv_coeff(void) +{ + const HuffmanQuickLUT *table = &dc_uv_qlut; + uint32 code; + uint32 rawbits = GetBits(8, MDFNBITS_PEEK); + + code = table->lut[rawbits]; + SkipBits(table->lut_bits[rawbits]); + + return(GetBits(code, MDFNBITS_FUNNYSIGN)); +} + + +static void decode(int32 *dct, const uint32 *QuantTable, const int32 dc, const HuffmanQuickLUT *table) +{ + int32 coeff; + int zeroes; + int count; + int index; + + dct[0] = (int16)(QuantTable[0] * dc); + count = 0; + + do + { + coeff = get_ac_coeff(table, &zeroes); + if(!coeff) + { + if(!zeroes) + { + while(count < 63) + { + dct[zigzag[count++]] = 0; + } + break; + } + else if(zeroes == 1) + zeroes = 0xF; + } + + while(zeroes-- && count < 63) + { + dct[zigzag[count++]] = 0; + } + zeroes = 0; + if(count < 63) + { + index = zigzag[count++]; + dct[index] = (int16)(QuantTable[index] * coeff); + } + } while(count < 63); + +} + +#ifdef WANT_DEBUGGER +uint32 RAINBOW_GetRegister(const unsigned int id, char* special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + if(id == RAINBOW_GSREG_RSCRLL) + value = HScroll; + else if(id == RAINBOW_GSREG_RCTRL) + value = Control; + else if(id == RAINBOW_GSREG_RNRY) + value = NullRunY; + else if(id == RAINBOW_GSREG_RNRU) + value = NullRunU; + else if(id == RAINBOW_GSREG_RNRV) + value = NullRunV; + else if(id == RAINBOW_GSREG_RHSYNC) + value = HSync; + + return(value); +} + +void RAINBOW_SetRegister(const unsigned int id, uint32 value) +{ + if(id == RAINBOW_GSREG_RSCRLL) + HScroll = value & 0x1FF; + else if(id == RAINBOW_GSREG_RCTRL) + Control = value; + else if(id == RAINBOW_GSREG_RNRY) + NullRunY = value; + else if(id == RAINBOW_GSREG_RNRU) + NullRunU = value; + else if(id == RAINBOW_GSREG_RNRV) + NullRunV = value; +} +#endif + +static uint32 LastLine[256]; +static bool FirstDecode; +static bool GarbageData; + +static void Cleanup(void) +{ + for(int i = 0; i < 2; i++) + if(DecodeBuffer[i]) + { + free(DecodeBuffer[i]); + DecodeBuffer[i] = NULL; + } + + KillHuffmanLUT(&dc_y_qlut); + KillHuffmanLUT(&dc_uv_qlut); + KillHuffmanLUT(&ac_y_qlut); + KillHuffmanLUT(&ac_uv_qlut); +} + +void RAINBOW_Init(bool arg_ChromaIP) +{ + try + { + ChromaIP = arg_ChromaIP; + + for(int i = 0; i < 2; i++) + { + DecodeBuffer[i] = (uint8*)MDFN_malloc_T(0x2000 * 4, _("RAINBOW buffer RAM")); + memset(DecodeBuffer[i], 0, 0x2000 * 4); + } + + BuildHuffmanLUT(&dc_y_table, &dc_y_qlut, 9); + BuildHuffmanLUT(&dc_uv_table, &dc_uv_qlut, 8); + BuildHuffmanLUT(&ac_y_table, &ac_y_qlut, 12); + BuildHuffmanLUT(&ac_uv_table, &ac_uv_qlut, 12); + + DecodeFormat[0] = DecodeFormat[1] = -1; + DecodeBufferWhichRead = 0; + GarbageData = FALSE; + FirstDecode = TRUE; + RasterReadPos = 0; + } + catch(...) + { + Cleanup(); + throw; + } +} + +void RAINBOW_Close(void) +{ + Cleanup(); +} + +// RAINBOW base I/O port address: 0x200 + +#define REGSETBOFW(_reg, _data, _wb) { (_reg) &= ~(0xFF << ((_wb) * 8)); (_reg) |= (_data) << ((_wb) * 8); } +#define REGSETBOFH REGSETBOFW + +// The horizontal scroll register is set up kind of weird...D0-D7 of writes to $200 set the lower byte, D0-D7 of writes to $202 set the upper byte + +void RAINBOW_Write8(uint32 A, uint8 V) +{ + //printf("RAINBOW Wr8: %08x %02x\n", A, V); + switch(A & 0x1C) + { + case 0x00: REGSETBOFH(HScroll, V, (A & 0x2) >> 1); HScroll &= 0x1FF; break; + case 0x04: REGSETBOFH(Control, V, A & 0x3); break; + case 0x08: REGSETBOFH(NullRunY, V, A & 0x3); CalcHappyColor(); break; + case 0x0C: REGSETBOFH(NullRunU, V, A & 0x3); CalcHappyColor(); break; + case 0x10: REGSETBOFH(NullRunV, V, A & 0x3); CalcHappyColor(); break; + case 0x14: REGSETBOFH(HSync, V, A & 0x3); break; + } +} + +void RAINBOW_Write16(uint32 A, uint16 V) +{ + int msh = A & 0x2; + + //printf("RAINBOW Wr16: %08x %04x\n", A, V); + switch(A & 0x1C) + { + case 0x00: REGSETBOFH(HScroll, V & 0xFF, (A & 0x2) >> 1); HScroll &= 0x1FF; break; + case 0x04: REGSETHW(Control, V, msh); break; + case 0x08: REGSETHW(NullRunY, V, msh); CalcHappyColor(); break; + case 0x0C: REGSETHW(NullRunU, V, msh); CalcHappyColor(); break; + case 0x10: REGSETHW(NullRunV, V, msh); CalcHappyColor(); break; + case 0x14: REGSETHW(HSync, V, msh); break; + } +} + +void RAINBOW_ForceTransferReset(void) +{ + RasterReadPos = 0; + DecodeFormat[0] = DecodeFormat[1] = -1; +} + +void RAINBOW_SwapBuffers(void) +{ + DecodeBufferWhichRead ^= 1; + RasterReadPos = 0; +} + +void RAINBOW_DecodeBlock(bool arg_FirstDecode, bool Skip) +{ + uint8 block_type; + int32 block_size; + int icount; + int which_buffer = DecodeBufferWhichRead ^ 1; + + if(!(Control & 0x01)) + { + puts("Rainbow decode when disabled!!"); + return; + } + + if(arg_FirstDecode) + { + FirstDecode = TRUE; + GarbageData = FALSE; + } + + if(GarbageData) + icount = 0; + else + icount = 0x200; + + do + { + do + { + while(KING_RB_Fetch() != 0xFF && icount > 0) + icount--; + + block_type = KING_RB_Fetch(); + //if(icount > 0 && block_type != 0xF0 && block_type != 0xF1 && block_type != 0xF2 && block_type != 0xF3 && block_type != 0xF8 && block_type != 0xFF) + //if(icount > 0 && block_type == 0x11) + // printf("%02x\n", block_type); + icount--; + } while(block_type != 0xF0 && block_type != 0xF1 && block_type != 0xF2 && block_type != 0xF3 && block_type != 0xF8 && block_type != 0xFF && icount > 0); + + { + uint16 tmp; + + tmp = KING_RB_Fetch() << 8; + tmp |= KING_RB_Fetch() << 0; + + block_size = (int16)tmp; + } + + block_size -= 2; + if(block_type == 0xFF && block_size <= 0) + for(int i = 0; i < 128; i++,icount--) KING_RB_Fetch(); + + //fprintf(stderr, "Block: %d\n", block_size); + } while(block_size <= 0 && icount > 0); + + //if(!GarbageData && icount < 500) + //{ + // FXDBG("Partial garbage data. %d", icount); + //} + + //printf("%d\n", icount); + if(icount <= 0) + { + FXDBG("Garbage data."); + GarbageData = TRUE; + //printf("Dooom: %d\n"); + DecodeFormat[which_buffer] = 0; + memset(DecodeBuffer[which_buffer], 0, 0x2000); + goto BufferNoDecode; + } + + if(block_type == 0xf8 || block_type == 0xff) + DecodeFormat[which_buffer] = 1; + else + DecodeFormat[which_buffer] = 0; + + if(block_type == 0xF8 || block_type == 0xFF) + { + if(block_type == 0xFF) + { + for(int q = 0; q < 2; q++) + for(int i = 0; i < 64; i++) + { + uint8 meow = KING_RB_Fetch(); + + QuantTables[q][i] = meow; + QuantTablesBase[q][i] = meow; + } + block_size -= 128; + } + + InitBits(block_size); + + int32 dc_y = 0, dc_u = 0, dc_v = 0; + uint32 *dest_base = (uint32 *)DecodeBuffer[which_buffer]; + for(int column = 0; column < 16; column++) + { + uint32 *dest_base_column = &dest_base[column * 16]; + int zeroes = 0; + + dc_y += get_dc_y_coeff(&zeroes); + + if(zeroes) // If set, clear the number of columns + { + do + { + if(column < 16) + { + dest_base_column = &dest_base[column * 16]; + + for(int y = 0; y < 16; y++) + for(int x = 0; x < 16; x++) + dest_base_column[y * 256 + x] = HappyColor; + } + column++; + zeroes--; + } while(zeroes); + column--; // Fix for the column autoincrement in the while(zeroes) loop + dc_y = dc_u = dc_v = 0; + } + else + { + int32 dct_y[256]; + int32 dct_u[64]; + int32 dct_v[64]; + + // Y/Luma, 16x16 components + // --------- + // | A | C | + // |-------| + // | B | D | + // --------- + // A (0, 0) + decode(&dct_y[0x00], QuantTables[0], dc_y, &ac_y_qlut); + + // B (0, 1) + dc_y += get_dc_y_coeff(&zeroes); + decode(&dct_y[0x40], QuantTables[0], dc_y, &ac_y_qlut); + + // C (1, 0) + dc_y += get_dc_y_coeff(&zeroes); + decode(&dct_y[0x80], QuantTables[0], dc_y, &ac_y_qlut); + + // D (1, 1) + dc_y += get_dc_y_coeff(&zeroes); + decode(&dct_y[0xC0], QuantTables[0], dc_y, &ac_y_qlut); + + // U, 8x8 components + dc_u += get_dc_uv_coeff(); + decode(&dct_u[0x00], QuantTables[1], dc_u, &ac_uv_qlut); + + // V, 8x8 components + dc_v += get_dc_uv_coeff(); + decode(&dct_v[0x00], QuantTables[1], dc_v, &ac_uv_qlut); + + if(Skip) + continue; + + j_rev_dct(&dct_y[0x00]); + j_rev_dct(&dct_y[0x40]); + j_rev_dct(&dct_y[0x80]); + j_rev_dct(&dct_y[0xC0]); + j_rev_dct(&dct_u[0x00]); + j_rev_dct(&dct_v[0x00]); + + for(int y = 0; y < 16; y++) + for(int x = 0; x < 16; x++) + dest_base_column[y * 256 + x] = clamp_to_u8(dct_y[y * 8 + (x & 0x7) + ((x & 0x8) << 4)] + 0x80) << 16; + + if(!ChromaIP) + { + for(int y = 0; y < 8; y++) + { + for(int x = 0; x < 8; x++) + { + uint32 component_uv = (clamp_to_u8(dct_u[y * 8 + x] + 0x80) << 8) | clamp_to_u8(dct_v[y * 8 + x] + 0x80); + dest_base_column[y * 512 + (256 * 0) + x * 2 + 0] |= component_uv; + dest_base_column[y * 512 + (256 * 0) + x * 2 + 1] |= component_uv; + dest_base_column[y * 512 + (256 * 1) + x * 2 + 0] |= component_uv; + dest_base_column[y * 512 + (256 * 1) + x * 2 + 1] |= component_uv; + } + } + } + else + { + for(int y = 0; y < 8; y++) + { + for(int x = 0; x < 8; x++) + { + uint32 component_uv = (clamp_to_u8(dct_u[y * 8 + x] + 0x80) << 8) | clamp_to_u8(dct_v[y * 8 + x] + 0x80); + dest_base_column[y * 512 + (256 * 1) + x * 2 + 0] |= component_uv; + } + } + } + } + } + + // Do bilinear interpolation on the chroma channels: + if(!Skip && ChromaIP) + { + for(int y = 0; y < 16; y+= 2) + { + uint32 *linebase = &dest_base[y * 256]; + uint32 *linebase1 = &dest_base[(y + 1) * 256]; + + for(int x = 0; x < 254; x += 2) + { + unsigned int u, v; + + u = (((linebase1[x] >> 8) & 0xFF) + ((linebase1[x + 2] >> 8) & 0xFF)) >> 1; + v = (((linebase1[x] >> 0) & 0xFF) + ((linebase1[x + 2] >> 0) & 0xFF)) >> 1; + + linebase1[x + 1] = (linebase1[x + 1] & ~ 0xFFFF) | (u << 8) | v; + } + + linebase1[0xFF] = (linebase1[0xFF] & ~ 0xFFFF) | (linebase1[0xFE] & 0xFFFF); + + if(FirstDecode) + { + for(int x = 0; x < 256; x++) linebase[x] = (linebase[x] & ~ 0xFFFF) | (linebase1[x] & 0xFFFF); + FirstDecode = 0; + } + else + for(int x = 0; x < 256; x++) + { + unsigned int u, v; + + u = (((LastLine[x] >> 8) & 0xFF) + ((linebase1[x] >> 8) & 0xFF)) >> 1; + v = (((LastLine[x] >> 0) & 0xFF) + ((linebase1[x] >> 0) & 0xFF)) >> 1; + + linebase[x] = (linebase[x] & ~ 0xFFFF) | (u << 8) | v; + } + + memcpy(LastLine, linebase1, 256 * 4); + } + } // End chroma interpolation + } // end jpeg-like decoding + else + { + // Earlier code confines the set to F0,F1,F2, and F3. + // F0 = (4, 0xF), F1 = (3, 0x7), F2 = (0x2, 0x3), F3 = 0x1, 0x1) + const unsigned int plt_shift = 4 - (block_type & 0x3); + const unsigned int crl_mask = (1 << plt_shift) - 1; + int x = 0; + + while(block_size > 0) + { + uint8 boot; + unsigned int rle_count; + + boot = KING_RB_Fetch(); + block_size--; + + if(boot == 0xFF) + { + KING_RB_Fetch(); + block_size--; + } + + if(!(boot & crl_mask)) // Expand mode? + { + rle_count = KING_RB_Fetch(); + block_size--; + if(rle_count == 0xFF) + { + KING_RB_Fetch(); + block_size--; + } + rle_count++; + } + else + rle_count = boot & crl_mask; + + for(unsigned int i = 0; i < rle_count; i++) + { + if(x >= 0x2000) + { + //puts("Oops"); + break; // Don't overflow our decode buffer! + } + DecodeBuffer[which_buffer][x] = (boot >> plt_shift); + x++; + } + } + } // end RLE decoding + + //for(int i = 0; i < 8 + block_size; i++) + // KING_RB_Fetch(); + + BufferNoDecode: ; +} + +void KING_Moo(void); + +// NOTE: layer_or and palette_ptr are optimizations, the real RAINBOW chip knows not of such things. +int RAINBOW_FetchRaster(uint32 *linebuffer, uint32 layer_or, uint32 *palette_ptr) +{ + int ret; + + ret = DecodeFormat[DecodeBufferWhichRead]; + + if(linebuffer) + { + if(DecodeFormat[DecodeBufferWhichRead] == -1) // None + { + if(linebuffer) + MDFN_FastU32MemsetM8(linebuffer, 0, 256); + } + else if(DecodeFormat[DecodeBufferWhichRead] == 1) // YUV + { + uint32 *in_ptr = (uint32*)&DecodeBuffer[DecodeBufferWhichRead][RasterReadPos * 256 * 4]; + + if(Control & 0x2) // Endless scroll mode: + { + uint8 tmpss = HScroll; + + for(int x = 0; x < 256; x++) + { + linebuffer[x] = in_ptr[tmpss] | layer_or; + tmpss++; + } + } + else // Non-endless + { + uint16 tmpss = HScroll & 0x1FF; + + for(int x = 0; x < 256; x++) + { + linebuffer[x] = (tmpss < 256) ? (in_ptr[tmpss] | layer_or) : 0; + tmpss = (tmpss + 1) & 0x1FF; + } + } + MDFN_FastU32MemsetM8(in_ptr, 0, 256); + } + else if(DecodeFormat[DecodeBufferWhichRead] == 0) // Palette + { + uint8 *in_ptr = &DecodeBuffer[DecodeBufferWhichRead][RasterReadPos * 256]; + + if(Control & 0x2) // Endless scroll mode: + { + uint8 tmpss = HScroll; + + for(int x = 0; x < 256; x++) + { + linebuffer[x] = in_ptr[tmpss] ? (palette_ptr[in_ptr[tmpss]] | layer_or) : 0; + tmpss++; + } + } + else // Non-endless + { + uint16 tmpss = HScroll & 0x1FF; + + for(int x = 0; x < 256; x++) + { + linebuffer[x] = (tmpss < 256 && in_ptr[tmpss]) ? (palette_ptr[in_ptr[tmpss]] | layer_or) : 0; + tmpss = (tmpss + 1) & 0x1FF; + } + } + //MDFN_FastU32MemsetM8((uint32 *)in_ptr, 0, 256 / 4); + } + } + + RasterReadPos = (RasterReadPos + 1) & 0xF; + + if(!RasterReadPos) + DecodeFormat[DecodeBufferWhichRead] = -1; // Invalidate this buffer. + + //printf("Fetch: %d, buffer: %d\n", RasterReadPos, DecodeBufferWhichRead); + return(ret); +} + +void RAINBOW_Reset(void) +{ + Control = 0; + NullRunY = NullRunU = NullRunV = 0; + HScroll = 0; + RasterReadPos = 0; + DecodeBufferWhichRead = 0; + + memset(QuantTables, 0, sizeof(QuantTables)); + memset(QuantTablesBase, 0, sizeof(QuantTablesBase)); + DecodeFormat[0] = DecodeFormat[1] = -1; + + CalcHappyColor(); +} + + +void RAINBOW_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(HScroll), + SFVAR(Control), + SFVAR(RasterReadPos), + SFVAR(DecodeBufferWhichRead), + SFVAR(NullRunY), + SFVAR(NullRunU), + SFVAR(NullRunV), + SFVAR(HSync), + SFARRAY32(DecodeFormat, 2), + // if(!(DecodeBuffer[i] = (uint8*)MDFN_malloc(0x2000 * 4, _("RAINBOW buffer RAM")))) + SFARRAY(DecodeBuffer[0], 0x2000 * 4), + SFARRAY(DecodeBuffer[1], 0x2000 * 4), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "RBOW"); + + if(load) + { + RasterReadPos &= 0xF; + CalcHappyColor(); + } +} + diff --git a/Mednafen/mednafen/pcfx/rainbow.h b/Mednafen/mednafen/pcfx/rainbow.h new file mode 100644 index 0000000000..7216273c45 --- /dev/null +++ b/Mednafen/mednafen/pcfx/rainbow.h @@ -0,0 +1,32 @@ +#ifndef __PCFX_RAINBOW_H +#define __PCFX_RAINBOW_H + +void RAINBOW_Write8(uint32 A, uint8 V); +void RAINBOW_Write16(uint32 A, uint16 V); + +void RAINBOW_ForceTransferReset(void); +void RAINBOW_SwapBuffers(void); +void RAINBOW_DecodeBlock(bool arg_FirstDecode, bool Skip); + +int RAINBOW_FetchRaster(uint32 *, uint32 layer_or, uint32 *palette_ptr); +void RAINBOW_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +void RAINBOW_Init(bool arg_ChromaIP); +void RAINBOW_Close(void); +void RAINBOW_Reset(void); + +#ifdef WANT_DEBUGGER +enum +{ + RAINBOW_GSREG_RSCRLL, + RAINBOW_GSREG_RCTRL, + RAINBOW_GSREG_RNRY, + RAINBOW_GSREG_RNRU, + RAINBOW_GSREG_RNRV, + RAINBOW_GSREG_RHSYNC, +}; +uint32 RAINBOW_GetRegister(const unsigned int id, char* special, const uint32 special_len); +void RAINBOW_SetRegister(const unsigned int id, uint32 value); +#endif + +#endif diff --git a/Mednafen/mednafen/pcfx/soundbox.cpp b/Mednafen/mednafen/pcfx/soundbox.cpp new file mode 100644 index 0000000000..de61c37788 --- /dev/null +++ b/Mednafen/mednafen/pcfx/soundbox.cpp @@ -0,0 +1,758 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "pcfx.h" +#include "soundbox.h" +#include "king.h" +#include +#include +#include + +#include +#include +#include + +static const int StepSizes[49] = +{ + 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, + 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, + 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, + 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552 +}; + +static const int StepIndexDeltas[16] = +{ + -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8 +}; + +static OwlResampler* FXres = NULL; +static OwlBuffer* FXsbuf[2] = { NULL, NULL }; +RavenBuffer* FXCDDABufs[2] = { NULL, NULL }; // Used in the CDROM code + +static PCE_PSG *pce_psg = NULL; + +static bool SoundEnabled; +static uint32 adpcm_lastts; + +struct SoundBox +{ + uint16 ADPCMControl; + uint8 ADPCMVolume[2][2]; // ADPCMVolume[channel(0 or 1)][left(0) or right(1)] + uint8 CDDAVolume[2]; + int32 bigdiv; + int32 smalldiv; + + int64 ResetAntiClick[2]; + double VolumeFiltered[2][2]; + double vf_xv[2][2][1+1], vf_yv[2][2][1+1]; + + int32 ADPCMDelta[2]; + int32 ADPCMHaveDelta[2]; + + int32 ADPCMPredictor[2]; + int32 StepSizeIndex[2]; + + uint32 ADPCMWhichNibble[2]; + uint16 ADPCMHalfWord[2]; + bool ADPCMHaveHalfWord[2]; + + int32 ADPCM_last[2][2]; +}; + +static SoundBox sbox; +static double ADPCMVolTable[0x40]; + +static bool EmulateBuggyCodec; // If true, emulate the buggy codec/algorithm used by an official PC-FX ADPCM encoder, rather than how the + // hardware actually works. +static bool ResetAntiClickEnabled; // = true; + + +#ifdef WANT_DEBUGGER + + +enum +{ + GSREG_ADPCM_CTRL = _PSG_GSREG_COUNT, + GSREG_ADPCM0_LVOL, + GSREG_ADPCM0_RVOL, + + GSREG_ADPCM1_LVOL, + GSREG_ADPCM1_RVOL, + + GSREG_ADPCM0_CUR, + GSREG_ADPCM1_CUR, + + GSREG_CDDA_LVOL, + GSREG_CDDA_RVOL +}; + +#define CHPDMOO(n) \ + { 0, "--CH"#n"--:", "", 0xFFFF }, \ + { PSG_GSREG_CH0_FREQ | (n << 8), "Freq", "PSG Ch"#n" Frequency(Period)", 2 }, \ + { PSG_GSREG_CH0_CTRL | (n << 8), "Ctrl", "PSG Ch"#n" Control", 1 }, \ + { PSG_GSREG_CH0_BALANCE | (n << 8), "Balance", "PSG Ch"#n" Balance", 1 }, \ + { PSG_GSREG_CH0_WINDEX | (n << 8), "WIndex", "PSG Ch"#n" Waveform Index", 1}, \ + { PSG_GSREG_CH0_SCACHE | (n << 8), "SCache", "PSG Ch"#n" Sample Cache", 1 } + +static RegType SBoxRegs[] = +{ + { PSG_GSREG_SELECT, "Select", "PSG Channel Select", 1 }, + { PSG_GSREG_GBALANCE, "GBal", "PSG Global Balance", 1 }, + { PSG_GSREG_LFOFREQ, "LFOFreq", "PSG LFO Freq", 1 }, + { PSG_GSREG_LFOCTRL, "LFOCtrl", "PSG LFO Control", 1 }, + + CHPDMOO(0), + CHPDMOO(1), + CHPDMOO(2), + CHPDMOO(3), + CHPDMOO(4), + { PSG_GSREG_CH4_NCTRL, "NCtrl", "PSG Ch4 Noise Control", 1 }, + { PSG_GSREG_CH4_LFSR, "LFSR", "PSG Ch4 Noise LFSR", 2 }, + CHPDMOO(5), + { PSG_GSREG_CH5_NCTRL, "NCtrl", "PSG Ch5 Noise Control", 1 }, + { PSG_GSREG_CH5_LFSR, "LFSR", "PSG Ch5 Noise LFSR", 2 }, + + { 0, "--ADPCM:--", "", 0xFFFF }, + + { GSREG_ADPCM_CTRL, "Ctrl", "ADPCM Control", 2 }, + { GSREG_ADPCM0_LVOL, "CH0LVol", "ADPCM Ch0 Left Volume", 1 }, + { GSREG_ADPCM0_RVOL, "CH0RVol", "ADPCM Ch0 Right Volume", 1 }, + { GSREG_ADPCM1_LVOL, "CH1LVol", "ADPCM Ch1 Left Volume", 1 }, + { GSREG_ADPCM1_RVOL, "CH1RVol", "ADPCM Ch1 Right Volume", 1 }, + + { GSREG_ADPCM0_CUR, "CH0Prc", "ADPCM Ch0 Predictor Value", 2 }, + { GSREG_ADPCM1_CUR, "CH1Prc", "ADPCM Ch1 Predictor Value", 2 }, + + { 0, "--CD-DA:--", "", 0xFFFF }, + { GSREG_CDDA_LVOL, "CDLVol", "CD-DA Left Volume", 1 }, + { GSREG_CDDA_RVOL, "CDRVol", "CD-DA Right Volume", 1 }, + { 0, "", "", 0 }, +}; + +static uint32 SBoxDBG_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case GSREG_ADPCM_CTRL: + value = sbox.ADPCMControl; + if(special) + { + int tmp_freq = 32 / (1 << (value & 0x3)); + trio_snprintf(special, special_len, "Frequency: ~%dKHz, Ch0 Interpolation: %s, Ch1 Interpolation: %s, Ch0 Reset: %d, Ch1 Reset: %d", tmp_freq, (value & 0x4) ? "On" : "Off", (value & 0x8) ? "On":"Off", + (int)(bool)(value & 0x10), (int)(bool)(value & 0x20)); + } + break; + + case GSREG_ADPCM0_LVOL: + value = sbox.ADPCMVolume[0][0]; + break; + + case GSREG_ADPCM0_RVOL: + value = sbox.ADPCMVolume[0][1]; + break; + + case GSREG_ADPCM1_LVOL: + value = sbox.ADPCMVolume[1][0]; + break; + + case GSREG_ADPCM1_RVOL: + value = sbox.ADPCMVolume[1][1]; + break; + + case GSREG_CDDA_LVOL: + value = sbox.CDDAVolume[0]; + break; + + case GSREG_CDDA_RVOL: + value = sbox.CDDAVolume[1]; + break; + + case GSREG_ADPCM0_CUR: + value = sbox.ADPCMPredictor[0] + 0x4000; + break; + + case GSREG_ADPCM1_CUR: + value = sbox.ADPCMPredictor[1] + 0x4000; + break; + + default: + value = pce_psg->GetRegister(id, special, special_len); + break; + } + return(value); +} + +static void SBoxDBG_SetRegister(const unsigned int id, uint32 value) +{ + if(id < _PSG_GSREG_COUNT) + pce_psg->SetRegister(id, value); + else switch(id) + { + case GSREG_ADPCM_CTRL: + sbox.ADPCMControl = value & 0xFFFF; + break; + + case GSREG_ADPCM0_LVOL: + sbox.ADPCMVolume[0][0] = value & 0x3F; + break; + + case GSREG_ADPCM0_RVOL: + sbox.ADPCMVolume[0][1] = value & 0x3F; + break; + + case GSREG_ADPCM1_LVOL: + sbox.ADPCMVolume[1][0] = value & 0x3F; + break; + + case GSREG_ADPCM1_RVOL: + sbox.ADPCMVolume[1][1] = value & 0x3F; + break; + + case GSREG_CDDA_LVOL: + sbox.CDDAVolume[0] = value & 0x3F; + SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); + break; + + case GSREG_CDDA_RVOL: + sbox.CDDAVolume[1] = value & 0x3F; + SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); + break; + + case GSREG_ADPCM0_CUR: + sbox.ADPCMPredictor[0] = ((int32)value & 0x7FFF) - 0x4000; + break; + + case GSREG_ADPCM1_CUR: + sbox.ADPCMPredictor[1] = ((int32)value & 0x7FFF) - 0x4000; + break; + } +} + +static RegGroupType SBoxRegsGroup = +{ + "SndBox", + SBoxRegs, + SBoxDBG_GetRegister, + SBoxDBG_SetRegister +}; + + +#endif + +static void RedoVolume(void) +{ + pce_psg->SetVolume(0.681); //0.227 * 0.50); + //ADPCMSynth.volume(0.50); +} + +bool SoundBox_SetSoundRate(uint32 rate) +{ + SoundEnabled = (bool)rate; + + if(FXres) + { + delete FXres; + FXres = NULL; + } + + if(rate > 0) + { + FXres = new OwlResampler(PCFX_MASTER_CLOCK / 12, rate, MDFN_GetSettingF("pcfx.resamp_rate_error"), 20, MDFN_GetSettingUI("pcfx.resamp_quality")); + + for(unsigned i = 0; i < 2; i++) + FXres->ResetBufResampState(FXsbuf[i]); + } + + RedoVolume(); + + return(TRUE); +} + +static void Cleanup(void) +{ + if(pce_psg) + { + delete pce_psg; + pce_psg = NULL; + } + + for(unsigned i = 0; i < 2; i++) + { + if(FXsbuf[i]) + { + delete FXsbuf[i]; + FXsbuf[i] = NULL; + } + if(FXCDDABufs[i]) + { + delete FXCDDABufs[i]; + FXCDDABufs[i] = NULL; + } + } + + if(FXres) + { + delete FXres; + FXres = NULL; + } +} + +void SoundBox_Init(bool arg_EmulateBuggyCodec, bool arg_ResetAntiClickEnabled) +{ + try + { + adpcm_lastts = 0; + SoundEnabled = false; + + EmulateBuggyCodec = arg_EmulateBuggyCodec; + ResetAntiClickEnabled = arg_ResetAntiClickEnabled; + + for(unsigned i = 0; i < 2; i++) + { + FXsbuf[i] = new OwlBuffer(); + FXCDDABufs[i] = new RavenBuffer(); + } + + pce_psg = new PCE_PSG(FXsbuf[0]->Buf(), FXsbuf[1]->Buf(), PCE_PSG::REVISION_HUC6280A); + + #ifdef WANT_DEBUGGER + MDFNDBG_AddRegGroup(&SBoxRegsGroup); + #endif + + memset(&sbox, 0, sizeof(sbox)); + + // Build ADPCM volume table, 1.5dB per step, ADPCM volume settings of 0x0 through 0x1B result in silence. + for(int x = 0; x < 0x40; x++) + { + double flub = 1; + int vti = 0x3F - x; + + if(x) + flub /= pow(2, (double)1 / 4 * x); + + if(vti <= 0x1B) + ADPCMVolTable[vti] = 0; + else + ADPCMVolTable[vti] = flub; + } + } + catch(...) + { + Cleanup(); + throw; + } +} + +void SoundBox_Kill(void) +{ + Cleanup(); +} + +/* Macro to access currently selected PSG channel */ +void SoundBox_Write(uint32 A, uint16 V, const v810_timestamp_t timestamp) +{ + A &= 0x3F; + + if(A < 0x20) + { + pce_psg->Write(timestamp / 3, A >> 1, V); + } + else + { + //printf("%04x %04x %d\n", A, V, timestamp); + switch(A & 0x3F) + { + //default: printf("HARUM: %04x %04x\n", A, V); break; + case 0x20: SoundBox_ADPCMUpdate(timestamp); + for(int ch = 0; ch < 2; ch++) + { + if(!(sbox.ADPCMControl & (0x10 << ch)) && (V & (0x10 << ch))) + { + //printf("Reset: %d\n", ch); + + if(ResetAntiClickEnabled) + { + sbox.ResetAntiClick[ch] += (int64)sbox.ADPCMPredictor[ch] << 32; + if(sbox.ResetAntiClick[ch] > ((int64)0x3FFF << 32)) + sbox.ResetAntiClick[ch] = (int64)0x3FFF << 32; + if(sbox.ResetAntiClick[ch] < ((int64)-0x4000 << 32)) + sbox.ResetAntiClick[ch] = (int64)-0x4000 << 32; + } + + sbox.ADPCMPredictor[ch] = 0; + sbox.StepSizeIndex[ch] = 0; + } + } + sbox.ADPCMControl = V; + break; + + case 0x22: SoundBox_ADPCMUpdate(timestamp); + sbox.ADPCMVolume[0][0] = V & 0x3F; + break; + + case 0x24: SoundBox_ADPCMUpdate(timestamp); + sbox.ADPCMVolume[0][1] = V & 0x3F; + break; + + case 0x26: SoundBox_ADPCMUpdate(timestamp); + sbox.ADPCMVolume[1][0] = V & 0x3F; + break; + + case 0x28: SoundBox_ADPCMUpdate(timestamp); + sbox.ADPCMVolume[1][1] = V & 0x3F; + break; + + case 0x2A: sbox.CDDAVolume[0] = V & 0x3F; + SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); + break; + + case 0x2C: sbox.CDDAVolume[1] = V & 0x3F; + SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); + break; + } + } +} + +static uint32 KINGADPCMControl; + +void SoundBox_SetKINGADPCMControl(uint32 value) +{ + KINGADPCMControl = value; +} + +/* Digital filter designed by mkfilter/mkshape/gencode A.J. Fisher + Command line: /www/usr/fisher/helpers/mkfilter -Bu -Lp -o 1 -a 1.5888889125e-04 0.0000000000e+00 -l */ +static void DoVolumeFilter(int ch, int lr) +{ + sbox.vf_xv[ch][lr][0] = sbox.vf_xv[ch][lr][1]; + sbox.vf_xv[ch][lr][1] = (double)ADPCMVolTable[sbox.ADPCMVolume[ch][lr]] / 2.004348738e+03; + + sbox.vf_yv[ch][lr][0] = sbox.vf_yv[ch][lr][1]; + sbox.vf_yv[ch][lr][1] = (sbox.vf_xv[ch][lr][0] + sbox.vf_xv[ch][lr][1]) + ( 0.9990021696 * sbox.vf_yv[ch][lr][0]); + sbox.VolumeFiltered[ch][lr] = sbox.vf_yv[ch][lr][1]; +} + +static const int16 ADPCM_PhaseFilter[8][7] = +{ + /* 0 */ { 40, 283, 654, 683, 331, 56, 1 }, // 2048 + /* 1 */ { 28, 238, 618, 706, 381, 75, 2 }, // 2048 + /* 2 */ { 19, 197, 577, 720, 432, 99, 4 }, // 2048 + /* 3 */ { 12, 160, 532, 726, 483, 128, 7 }, // 2048 + /* 4 */ { 7, 128, 483, 726, 532, 160, 12 }, // 2048 + /* 5 */ { 4, 99, 432, 720, 577, 197, 19 }, // 2048 + /* 6 */ { 2, 75, 381, 706, 618, 238, 28 }, // 2048 + /* 7 */ { 1, 56, 331, 683, 654, 283, 40 }, // 2048 +}; + +v810_timestamp_t SoundBox_ADPCMUpdate(const v810_timestamp_t timestamp) +{ + int32 run_time = timestamp - adpcm_lastts; + + adpcm_lastts = timestamp; + + sbox.bigdiv -= run_time * 2; + + while(sbox.bigdiv <= 0) + { + sbox.smalldiv--; + while(sbox.smalldiv <= 0) + { + sbox.smalldiv += 1 << ((KINGADPCMControl >> 2) & 0x3); + for(int ch = 0; ch < 2; ch++) + { + // Keep playing our last halfword fetched even if KING ADPCM is disabled + if(sbox.ADPCMHaveHalfWord[ch] || KINGADPCMControl & (1 << ch)) + { + if(!sbox.ADPCMWhichNibble[ch]) + { + sbox.ADPCMHalfWord[ch] = KING_GetADPCMHalfWord(ch); + sbox.ADPCMHaveHalfWord[ch] = TRUE; + } + + // If the channel's reset bit is set, don't update its ADPCM state. + if(sbox.ADPCMControl & (0x10 << ch)) + { + sbox.ADPCMDelta[ch] = 0; + } + else + { + uint8 nibble = (sbox.ADPCMHalfWord[ch] >> (sbox.ADPCMWhichNibble[ch])) & 0xF; + int32 BaseStepSize = StepSizes[sbox.StepSizeIndex[ch]]; + + //if(!ch) + //printf("Nibble: %02x\n", nibble); + + if(EmulateBuggyCodec) + { + if(BaseStepSize == 1552) + BaseStepSize = 1522; + + sbox.ADPCMDelta[ch] = BaseStepSize * ((nibble & 0x7) + 1) * 2; + } + else + sbox.ADPCMDelta[ch] = BaseStepSize * ((nibble & 0x7) + 1); + + // Linear interpolation turned on? + if(sbox.ADPCMControl & (0x4 << ch)) + sbox.ADPCMDelta[ch] >>= (KINGADPCMControl >> 2) & 0x3; + + if(nibble & 0x8) + sbox.ADPCMDelta[ch] = -sbox.ADPCMDelta[ch]; + + sbox.StepSizeIndex[ch] += StepIndexDeltas[nibble]; + + if(sbox.StepSizeIndex[ch] < 0) + sbox.StepSizeIndex[ch] = 0; + + if(sbox.StepSizeIndex[ch] > 48) + sbox.StepSizeIndex[ch] = 48; + } + sbox.ADPCMHaveDelta[ch] = 1; + + // Linear interpolation turned on? + if(sbox.ADPCMControl & (0x4 << ch)) + sbox.ADPCMHaveDelta[ch] = 1 << ((KINGADPCMControl >> 2) & 0x3); + + sbox.ADPCMWhichNibble[ch] = (sbox.ADPCMWhichNibble[ch] + 4) & 0xF; + + if(!sbox.ADPCMWhichNibble[ch]) + sbox.ADPCMHaveHalfWord[ch] = FALSE; + } + } // for(int ch...) + } // while(sbox.smalldiv <= 0) + + const uint32 synthtime42 = (timestamp << 1) + sbox.bigdiv; + const uint32 synthtime14 = synthtime42 / 3; + const uint32 synthtime = synthtime14 >> 3; + const unsigned synthtime_phase = synthtime14 & 7; + + //printf("Phase: %d, %d\n", synthtime42 % 24, (synthtime42 / 3) & 7); + + for(int ch = 0; ch < 2; ch++) + { + //if(!ch) + //{ + // printf("%d\n", synthtime - last_synthtime); + // last_synthtime = synthtime; + //} + + if(sbox.ADPCMHaveDelta[ch]) + { + sbox.ADPCMPredictor[ch] += sbox.ADPCMDelta[ch]; + + sbox.ADPCMHaveDelta[ch]--; + + if(sbox.ADPCMPredictor[ch] > 0x3FFF) { sbox.ADPCMPredictor[ch] = 0x3FFF; /*printf("Overflow: %d\n", ch);*/ } + if(sbox.ADPCMPredictor[ch] < -0x4000) { sbox.ADPCMPredictor[ch] = -0x4000; /*printf("Underflow: %d\n", ch);*/ } + } + else + { + + } + + if(SoundEnabled) + { + int32 samp[2]; + + if(EmulateBuggyCodec) + { + samp[0] = (int32)(((sbox.ADPCMPredictor[ch] >> 1) + (sbox.ResetAntiClick[ch] >> 33)) * sbox.VolumeFiltered[ch][0]); + samp[1] = (int32)(((sbox.ADPCMPredictor[ch] >> 1) + (sbox.ResetAntiClick[ch] >> 33)) * sbox.VolumeFiltered[ch][1]); + } + else + { + samp[0] = (int32)((sbox.ADPCMPredictor[ch] + (sbox.ResetAntiClick[ch] >> 32)) * sbox.VolumeFiltered[ch][0]); + samp[1] = (int32)((sbox.ADPCMPredictor[ch] + (sbox.ResetAntiClick[ch] >> 32)) * sbox.VolumeFiltered[ch][1]); + } +#if 0 + printf("%d, %f %f\n", ch, sbox.VolumeFiltered[ch][0], sbox.VolumeFiltered[ch][1]); + + { + static int inv = 0x1FFF; + + samp[0] = samp[1] = inv; + + if(ch == 1) + inv = -inv; + } +#endif + for(unsigned y = 0; y < 2; y++) + { + const int32 delta = samp[y] - sbox.ADPCM_last[ch][y]; + int32* tb = FXsbuf[y]->Buf() + (synthtime & 0xFFFF); + const int16* coeffs = ADPCM_PhaseFilter[synthtime_phase]; + + for(unsigned c = 0; c < 7; c++) + { + int32 tmp = delta * coeffs[c]; + + tb[c] += tmp; + } + } + + sbox.ADPCM_last[ch][0] = samp[0]; + sbox.ADPCM_last[ch][1] = samp[1]; + } + } + + for(int ch = 0; ch < 2; ch++) + { + sbox.ResetAntiClick[ch] -= sbox.ResetAntiClick[ch] >> 8; + //if(ch) + // MDFN_DispMessage("%d", (int)(sbox.ResetAntiClick[ch] >> 32)); + } + + for(int ch = 0; ch < 2; ch++) + for(int lr = 0; lr < 2; lr++) + { + DoVolumeFilter(ch, lr); + } + sbox.bigdiv += 1365 * 2 / 2; + } + + return(timestamp + (sbox.bigdiv + 1) / 2); +} + +int32 SoundBox_Flush(const v810_timestamp_t end_timestamp, v810_timestamp_t* new_base_timestamp, int16 *SoundBuf, const int32 MaxSoundFrames, const bool reverse) +{ + const uint32 end_timestamp_div3 = end_timestamp / 3; + const uint32 end_timestamp_div12 = end_timestamp / 12; + const uint32 end_timestamp_mod12 = end_timestamp % 12; + const unsigned rsc = std::min(65536, end_timestamp_div12); + int32 FrameCount = 0; + + *new_base_timestamp = end_timestamp_mod12; + + pce_psg->Update(end_timestamp_div3); + + for(unsigned y = 0; y < 2; y++) + { + if(SoundEnabled && FXres) + { + FXsbuf[y]->Integrate(rsc, 0, 0, FXCDDABufs[y]); + FrameCount = FXres->Resample(FXsbuf[y], rsc, SoundBuf + y, MaxSoundFrames, reverse); + } + else + FXsbuf[y]->ResampleSkipped(rsc); + + FXCDDABufs[y]->Finish(rsc); + } + + return(FrameCount); +} + +void SoundBox_ResetTS(const v810_timestamp_t ts_base) +{ + pce_psg->ResetTS(ts_base / 3); + adpcm_lastts = ts_base; +} + +void SoundBox_Reset(const v810_timestamp_t timestamp) +{ + SoundBox_ADPCMUpdate(timestamp); + pce_psg->Power(timestamp / 3); + + sbox.ADPCMControl = 0; + + memset(&sbox.vf_xv, 0, sizeof(sbox.vf_xv)); + memset(&sbox.vf_yv, 0, sizeof(sbox.vf_yv)); + + for(int lr = 0; lr < 2; lr++) + { + for(int ch = 0; ch < 2; ch++) + { + sbox.ADPCMVolume[ch][lr] = 0; + sbox.VolumeFiltered[ch][lr] = 0; + } + + sbox.CDDAVolume[lr] = 0; + } + + for(int ch = 0; ch < 2; ch++) + { + sbox.ADPCMPredictor[ch] = 0; + sbox.StepSizeIndex[ch] = 0; + } + + memset(sbox.ADPCMWhichNibble, 0, sizeof(sbox.ADPCMWhichNibble)); + memset(sbox.ADPCMHalfWord, 0, sizeof(sbox.ADPCMHalfWord)); + memset(sbox.ADPCMHaveHalfWord, 0, sizeof(sbox.ADPCMHaveHalfWord)); + + SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); + + sbox.bigdiv = 2; // TODO: KING->SBOX ADPCM Synch //(1365 - 85 * 4) * 2; //1365 * 2 / 2; + sbox.smalldiv = 0; +} + +void SoundBox_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + pce_psg->StateAction(sm, load, data_only); + + SFORMAT SoundBox_StateRegs[] = + { + SFVARN(sbox.ADPCMControl, "ADPCMControl"), + SFARRAYN(&sbox.ADPCMVolume[0][0], 2 * 2, "ADPCMVolume"), + SFARRAYN(sbox.CDDAVolume, 2, "CDDAVolume"), + SFVARN(sbox.bigdiv, "bigdiv"), + SFVARN(sbox.smalldiv, "smalldiv"), + + SFARRAY64N(&sbox.ResetAntiClick[0], 2, "ResetAntiClick"), + SFARRAYDN(&sbox.VolumeFiltered[0][0], 2 * 2, "VolumeFiltered"), + SFARRAYDN(&sbox.vf_xv[0][0][0], 2 * 2 * (1 + 1), "vf_xv"), + SFARRAYDN(&sbox.vf_yv[0][0][0], 2 * 2 * (1 + 1), "vf_yv"), + + SFARRAY32N(sbox.ADPCMDelta, 2, "ADPCMDelta"), + SFARRAY32N(sbox.ADPCMHaveDelta, 2, "ADPCMHaveDelta"), + + SFARRAY32N(&sbox.ADPCMPredictor[0], 2, "ADPCMPredictor"), + SFARRAY32N(&sbox.StepSizeIndex[0], 2, "ADPCMStepSizeIndex"), + + SFARRAY32N(sbox.ADPCMWhichNibble, 2, "ADPCMWNibble"), + SFARRAY16N(sbox.ADPCMHalfWord, 2, "ADPCMHalfWord"), + SFARRAYBN(sbox.ADPCMHaveHalfWord, 2, "ADPCMHHW"), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, SoundBox_StateRegs, "SBOX"); + + if(load) + { + for(int ch = 0; ch < 2; ch++) + { + clamp(&sbox.ADPCMPredictor[ch], -0x4000, 0x3FFF); + clamp(&sbox.ResetAntiClick[ch], (int64)-0x4000 << 32, (int64)0x3FFF << 32); + + if(!ResetAntiClickEnabled) + sbox.ResetAntiClick[ch] = 0; + + clamp(&sbox.StepSizeIndex[ch], 0, 48); + + clamp(&sbox.bigdiv, 1, 1365); + clamp(&sbox.smalldiv, 1, 8); + + for(int lr = 0; lr < 2; lr++) + { + + } + } + SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); + } +} diff --git a/Mednafen/mednafen/pcfx/soundbox.h b/Mednafen/mednafen/pcfx/soundbox.h new file mode 100644 index 0000000000..f1507eff59 --- /dev/null +++ b/Mednafen/mednafen/pcfx/soundbox.h @@ -0,0 +1,22 @@ +#ifndef _PCFX_SOUNDBOX_H +#define _PCFX_SOUNDBOX_H + +bool SoundBox_SetSoundRate(uint32 rate); +int32 SoundBox_Flush(const v810_timestamp_t timestamp, v810_timestamp_t* new_base_timestamp, int16 *SoundBuf, const int32 MaxSoundFrames, const bool reverse); +void SoundBox_Write(uint32 A, uint16 V, const v810_timestamp_t timestamp); +void SoundBox_Init(bool arg_EmulateBuggyCodec, bool arg_ResetAntiClickEnabled); +void SoundBox_Kill(void); + +void SoundBox_Reset(const v810_timestamp_t timestamp); + +void SoundBox_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +void SoundBox_SetKINGADPCMControl(uint32); + +v810_timestamp_t SoundBox_ADPCMUpdate(const v810_timestamp_t timestamp); + +void SoundBox_ResetTS(const v810_timestamp_t ts_base); + +#include +#include +#endif diff --git a/Mednafen/mednafen/pcfx/timer.cpp b/Mednafen/mednafen/pcfx/timer.cpp new file mode 100644 index 0000000000..b8b458af49 --- /dev/null +++ b/Mednafen/mednafen/pcfx/timer.cpp @@ -0,0 +1,186 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + TODO: Determine if the interrupt request bit can be manually set even if timer enable and/or timer int enable bits are 0. +*/ + + +#include "pcfx.h" +#include "interrupt.h" +#include "timer.h" +#include + +static uint16 control; +static uint16 period; +static int32 counter; + +static int32 lastts; + +static INLINE v810_timestamp_t CalcNextEventTS(const v810_timestamp_t timestamp) +{ + return((control & 0x2) ? (timestamp + counter) : PCFX_EVENT_NONONO); +} + +#define EFF_PERIOD ((period ? period : 0x10000) * 15) + +v810_timestamp_t FXTIMER_Update(const v810_timestamp_t timestamp) +{ + if(control & 0x2) + { + int32 cycles = timestamp - lastts; + counter -= cycles; + while(counter <= 0) + { + counter += EFF_PERIOD; + if(control & 0x1) + { + control |= 0x4; + PCFXIRQ_Assert(PCFXIRQ_SOURCE_TIMER, TRUE); + } + } + } + + lastts = timestamp; + + return(CalcNextEventTS(timestamp)); +} + +void FXTIMER_ResetTS(int32 ts_base) +{ + lastts = ts_base; +} + +uint16 FXTIMER_Read16(uint32 A, const v810_timestamp_t timestamp) +{ + FXTIMER_Update(timestamp); + switch(A & 0xFC0) + { + default: return(0); + + case 0xF00: return(control); + + case 0xF80: return(period); + + case 0xFC0: return((counter + 14) / 15); + } + return(0); +} + +uint8 FXTIMER_Read8(uint32 A, const v810_timestamp_t timestamp) +{ + FXTIMER_Update(timestamp); + return(FXTIMER_Read16(A&~1, timestamp) >> ((A & 1) * 8)); +} + +void FXTIMER_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp) +{ + FXTIMER_Update(timestamp); + + switch(A & 0xFC0) + { + default: break; + + case 0xF00: if(!(control & 0x2) && (V & 0x2)) + counter = EFF_PERIOD; + control = V & 0x7; + + if(V & 0x4) + FXDBG("Timer control write with D2 set?"); + + PCFXIRQ_Assert(PCFXIRQ_SOURCE_TIMER, (bool)(control & 0x4)); + PCFX_SetEvent(PCFX_EVENT_TIMER, CalcNextEventTS(timestamp)); + break; + + case 0xF80: period = V; + PCFX_SetEvent(PCFX_EVENT_TIMER, CalcNextEventTS(timestamp)); + break; + } +} + +void FXTIMER_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(counter), + SFVAR(period), + SFVAR(control), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "TIMR"); + + if(load) + { + + } +} + + + +uint32 FXTIMER_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 value = 0xDEADBEEF; + + switch(id) + { + case FXTIMER_GSREG_TCTRL: + value = control; + if(special) + { + trio_snprintf(special, special_len, "Counting Enabled: %d, IRQ Enabled: %d, IRQ Asserted: %d", (int)(bool)(control & 2), (int)(bool)(control & 1), (int)(bool)(control & 4)); + } + break; + + case FXTIMER_GSREG_TPRD: + value = period; + if(special) + { + trio_snprintf(special, special_len, "Effective Period: %d; 21477272 / %d = %fHz", EFF_PERIOD, EFF_PERIOD, (double)21477272 / (EFF_PERIOD)); + } + break; + + case FXTIMER_GSREG_TCNTR: + value = counter; + if(special) + { + //trio_snprintf(buf, 256, "Pad: %d, ??: %d, Timer: %d, Reset: %d", + //*special = std::string(buf); + } + break; + } + + return value; +} + +void FXTIMER_SetRegister(const unsigned int id, uint32 value) +{ + + +} + +void FXTIMER_Reset(void) +{ + control = 0; + period = 0; + counter = 0; +} + +void FXTIMER_Init(void) +{ + lastts = 0; + FXTIMER_Reset(); +} diff --git a/Mednafen/mednafen/pcfx/timer.h b/Mednafen/mednafen/pcfx/timer.h new file mode 100644 index 0000000000..24e60b7ba5 --- /dev/null +++ b/Mednafen/mednafen/pcfx/timer.h @@ -0,0 +1,26 @@ +#ifndef __PCFX_TIMER_H +#define __PCFX_TIMER_H + +void FXTIMER_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp); +uint16 FXTIMER_Read16(uint32 A, const v810_timestamp_t timestamp); +uint8 FXTIMER_Read8(uint32 A, const v810_timestamp_t timestamp); +v810_timestamp_t FXTIMER_Update(const v810_timestamp_t timestamp); +void FXTIMER_ResetTS(int32 ts_base); +void FXTIMER_Reset(void); + +void FXTIMER_Init(void); + +void FXTIMER_StateAction(StateMem *sm, const unsigned load, const bool data_only); + + +enum +{ + FXTIMER_GSREG_TCTRL = 0, + FXTIMER_GSREG_TPRD, + FXTIMER_GSREG_TCNTR +}; + +uint32 FXTIMER_GetRegister(const unsigned int id, char *special, const uint32 special_len); +void FXTIMER_SetRegister(const unsigned int id, uint32 value); + +#endif diff --git a/Mednafen/mednafen/player.cpp b/Mednafen/mednafen/player.cpp new file mode 100644 index 0000000000..fe09dd7f9b --- /dev/null +++ b/Mednafen/mednafen/player.cpp @@ -0,0 +1,197 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include +#include + +#include "video.h" +#include "player.h" + +static std::string AlbumName, Artist, Copyright; +static std::vector SongNames; +static int TotalSongs; + +static INLINE void FastDrawLine(MDFN_Surface *surface, uint32 color, uint32 bmatch, uint32 breplace, const int xs, const int ys, const int ydelta) +{ + uint32* buf = surface->pixels; + int y = ys; + int y_inc = (ydelta < 0) ? -1 : 1; + unsigned i_bound = abs(ydelta); // No +1, or we'll overflow our buffer(we compensate in our calculation of half_point). + unsigned half_point = (i_bound + 1) >> 1; + + for(unsigned i = 0; i <= half_point; i++, y += y_inc) + { + if(bmatch != ~0U) + { + uint32 tmpcolor = color; + + if(buf[xs + y * surface->pitch32] == bmatch) + tmpcolor = breplace; + + if(buf[xs + y * surface->pitch32] != breplace) + buf[xs + y * surface->pitch32] = tmpcolor; + } + else + buf[xs + y * surface->pitch32] = color; + } + y -= y_inc; + for(unsigned i = half_point; i < i_bound; i++, y += y_inc) + { + if(bmatch != ~0U) + { + uint32 tmpcolor = color; + + if(buf[xs + 1 + y * surface->pitch32] == bmatch) + tmpcolor = breplace; + + if(buf[xs + 1+ y * surface->pitch32] != breplace) + buf[xs + 1 + y * surface->pitch32] = tmpcolor; + } + else + buf[xs + 1 + y * surface->pitch32] = color; + } +} + +int Player_Init(int tsongs, const std::string &album, const std::string &artist, const std::string ©right, const std::vector &snames) +{ + AlbumName = album; + Artist = artist; + Copyright = copyright; + SongNames = snames; + + TotalSongs = tsongs; + + MDFNGameInfo->nominal_width = 384; + MDFNGameInfo->nominal_height = 240; + + MDFNGameInfo->fb_width = 384; + MDFNGameInfo->fb_height = 240; + + MDFNGameInfo->lcm_width = 384; + MDFNGameInfo->lcm_height = 240; + + MDFNGameInfo->GameType = GMT_PLAYER; + + return(1); +} + +int Player_Init(int tsongs, const std::string &album, const std::string &artist, const std::string ©right, char **snames) +{ + std::vector tmpvec; + + if(snames) + { + for(int i = 0; i < tsongs; i++) + tmpvec.push_back(snames[i] ? snames[i] : ""); + } + + return Player_Init(tsongs, album, artist, copyright, tmpvec); +} + +void Player_Draw(MDFN_Surface *surface, MDFN_Rect *dr, int CurrentSong, int16 *samples, int32 sampcount) +{ + uint32 *XBuf = surface->pixels; + //MDFN_Rect *dr = &MDFNGameInfo->DisplayRect; + const uint32 text_color = surface->MakeColor(0xE8, 0xE8, 0xE8); + const uint32 text_shadow_color = surface->MakeColor(0x00, 0x18, 0x10); + const uint32 bg_color = surface->MakeColor(0x20, 0x00, 0x08); + const uint32 left_color = surface->MakeColor(0x80, 0x80, 0xFF); + const uint32 right_color = surface->MakeColor(0x80, 0xff, 0x80); + const uint32 center_color = surface->MakeColor(0x80, 0xCC, 0xCC); + + dr->x = 0; + dr->y = 0; + dr->w = 384; + dr->h = 240; + + // Draw the background color + for(int y = 0; y < dr->h; y++) + MDFN_FastU32MemsetM8(&XBuf[y * surface->pitch32], bg_color, dr->w); + + // Now we draw the waveform data. It should be centered vertically, and extend the screen horizontally from left to right. + if(sampcount) + { + const int32 x_scale = (sampcount << 8) / dr->w;; + const int32 y_scale = -dr->h; + int lastX, lastY; + + + for(int wc = 0; wc < MDFNGameInfo->soundchan; wc++) + { + uint32 color = wc ? right_color : left_color; //MK_COLOR(0x80, 0xff, 0x80) : MK_COLOR(0x80, 0x80, 0xFF); + + if(MDFNGameInfo->soundchan == 1) + color = center_color; //MK_COLOR(0x80, 0xc0, 0xc0); + + lastX = -1; + lastY = 0; + + for(int x = 0; x < dr->w; x++) + { + const int32 samp = samples[wc + (x * x_scale >> 8) * MDFNGameInfo->soundchan]; + int ypos; + + ypos = (dr->h / 2) + ((samp * y_scale + 0x4000) >> 15); + //ypos = (rand() & 0xFFF) - 0x800; + + if(ypos < 0) + ypos = 0; + + if(ypos >= dr->h) + ypos = dr->h - 1; + + if(lastX >= 0) + FastDrawLine(surface, color, wc ? left_color : ~0, center_color, lastX, lastY, ypos - lastY); + lastX = x; + lastY = ypos; + } + } + } + + XBuf += 2 * surface->pitch32; + DrawTextTransShadow(XBuf, surface->pitch32 * sizeof(uint32), dr->w, AlbumName, text_color, text_shadow_color, 1); + + XBuf += (13 + 2) * surface->pitch32; + DrawTextTransShadow(XBuf, surface->pitch32 * sizeof(uint32), dr->w, Artist, text_color, text_shadow_color, 1); + + XBuf += (13 + 2) * surface->pitch32; + DrawTextTransShadow(XBuf, surface->pitch32 * sizeof(uint32), dr->w, Copyright, text_color, text_shadow_color, 1); + + XBuf += (13 * 2) * surface->pitch32; + + // If each song has an individual name, show this song's name. + { + std::string tmpsong = ""; + + if((unsigned int)CurrentSong < SongNames.size()) + tmpsong = SongNames[CurrentSong]; + + if(tmpsong == "" && TotalSongs > 1) + tmpsong = std::string(_("Song:")); + + DrawTextTransShadow(XBuf, surface->pitch32 * sizeof(uint32), dr->w, tmpsong, text_color, text_shadow_color, 1); + } + + XBuf += (13 + 2) * surface->pitch32; + if(TotalSongs > 1) + { + char snbuf[32]; + trio_snprintf(snbuf, 32, "<%d/%d>", CurrentSong + 1, TotalSongs); + DrawTextTransShadow(XBuf, surface->pitch32 * sizeof(uint32), dr->w, snbuf, text_color, text_shadow_color, 1); + } +} diff --git a/Mednafen/mednafen/player.h b/Mednafen/mednafen/player.h new file mode 100644 index 0000000000..d2050c7d67 --- /dev/null +++ b/Mednafen/mednafen/player.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_PLAYER_H +#define __MDFN_PLAYER_H + +int Player_Init(int tsongs, const std::string &album, const std::string &artist, const std::string ©right,const std::vector &snames = std::vector()); +int Player_Init(int tsongs, const std::string &album, const std::string &artist, const std::string ©right, char **snames); + +void Player_Draw(MDFN_Surface *surface, MDFN_Rect *dr, int CurrentSong, int16 *samples, int32 sampcount); + +#endif diff --git a/Mednafen/mednafen/psx/FastFIFO.h b/Mednafen/mednafen/psx/FastFIFO.h new file mode 100644 index 0000000000..65cb33943e --- /dev/null +++ b/Mednafen/mednafen/psx/FastFIFO.h @@ -0,0 +1,76 @@ +#ifndef __MDFN_FASTFIFO_H +#define __MDFN_FASTFIFO_H + +// size should be a power of 2. +template +class FastFIFO +{ + public: + + FastFIFO() + { + memset(data, 0, sizeof(data)); + read_pos = 0; + write_pos = 0; + in_count = 0; + } + + INLINE ~FastFIFO() + { + + } + + INLINE void SaveStatePostLoad(void) + { + read_pos %= size; + write_pos %= size; + in_count %= (size + 1); + } + + INLINE uint32 CanRead(void) + { + return(in_count); + } + + INLINE uint32 CanWrite(void) + { + return(size - in_count); + } + + INLINE T Peek(void) + { + return data[read_pos]; + } + + INLINE T Read(void) + { + T ret = data[read_pos]; + + read_pos = (read_pos + 1) & (size - 1); + in_count--; + + return(ret); + } + + INLINE void Write(const T& wr_data) + { + data[write_pos] = wr_data; + write_pos = (write_pos + 1) & (size - 1); + in_count++; + } + + INLINE void Flush(void) + { + read_pos = 0; + write_pos = 0; + in_count = 0; + } + + T data[size]; + uint32 read_pos; // Read position + uint32 write_pos; // Write position + uint32 in_count; // Number of units in the FIFO +}; + + +#endif diff --git a/Mednafen/mednafen/psx/Makefile.am b/Mednafen/mednafen/psx/Makefile.am new file mode 100644 index 0000000000..8e816d778e --- /dev/null +++ b/Mednafen/mednafen/psx/Makefile.am @@ -0,0 +1,12 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @MMX_CFLAGS@ @SSE_CFLAGS@ @SSE2_CFLAGS@ -funroll-loops +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libpsx.a +libpsx_a_SOURCES = psx.cpp irq.cpp timer.cpp dma.cpp frontio.cpp sio.cpp cpu.cpp gte.cpp dis.cpp cdc.cpp spu.cpp mdec.cpp +libpsx_a_SOURCES += gpu.cpp gpu_polygon.cpp gpu_line.cpp gpu_sprite.cpp +libpsx_a_SOURCES += input/gamepad.cpp input/dualanalog.cpp input/dualshock.cpp input/memcard.cpp input/multitap.cpp input/mouse.cpp input/negcon.cpp input/guncon.cpp input/justifier.cpp + +if WANT_DEBUGGER +libpsx_a_SOURCES += debug.cpp +endif diff --git a/Mednafen/mednafen/psx/Makefile.in b/Mednafen/mednafen/psx/Makefile.in new file mode 100644 index 0000000000..b0e141a7d5 --- /dev/null +++ b/Mednafen/mednafen/psx/Makefile.in @@ -0,0 +1,753 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = debug.cpp +subdir = src/psx +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libpsx_a_AR = $(AR) $(ARFLAGS) +libpsx_a_LIBADD = +am__libpsx_a_SOURCES_DIST = psx.cpp irq.cpp timer.cpp dma.cpp \ + frontio.cpp sio.cpp cpu.cpp gte.cpp dis.cpp cdc.cpp spu.cpp \ + mdec.cpp gpu.cpp gpu_polygon.cpp gpu_line.cpp gpu_sprite.cpp \ + input/gamepad.cpp input/dualanalog.cpp input/dualshock.cpp \ + input/memcard.cpp input/multitap.cpp input/mouse.cpp \ + input/negcon.cpp input/guncon.cpp input/justifier.cpp \ + debug.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@WANT_DEBUGGER_TRUE@am__objects_1 = debug.$(OBJEXT) +am_libpsx_a_OBJECTS = psx.$(OBJEXT) irq.$(OBJEXT) timer.$(OBJEXT) \ + dma.$(OBJEXT) frontio.$(OBJEXT) sio.$(OBJEXT) cpu.$(OBJEXT) \ + gte.$(OBJEXT) dis.$(OBJEXT) cdc.$(OBJEXT) spu.$(OBJEXT) \ + mdec.$(OBJEXT) gpu.$(OBJEXT) gpu_polygon.$(OBJEXT) \ + gpu_line.$(OBJEXT) gpu_sprite.$(OBJEXT) \ + input/gamepad.$(OBJEXT) input/dualanalog.$(OBJEXT) \ + input/dualshock.$(OBJEXT) input/memcard.$(OBJEXT) \ + input/multitap.$(OBJEXT) input/mouse.$(OBJEXT) \ + input/negcon.$(OBJEXT) input/guncon.$(OBJEXT) \ + input/justifier.$(OBJEXT) $(am__objects_1) +libpsx_a_OBJECTS = $(am_libpsx_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libpsx_a_SOURCES) +DIST_SOURCES = $(am__libpsx_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @MMX_CFLAGS@ @SSE_CFLAGS@ @SSE2_CFLAGS@ -funroll-loops +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libpsx.a +libpsx_a_SOURCES = psx.cpp irq.cpp timer.cpp dma.cpp frontio.cpp \ + sio.cpp cpu.cpp gte.cpp dis.cpp cdc.cpp spu.cpp mdec.cpp \ + gpu.cpp gpu_polygon.cpp gpu_line.cpp gpu_sprite.cpp \ + input/gamepad.cpp input/dualanalog.cpp input/dualshock.cpp \ + input/memcard.cpp input/multitap.cpp input/mouse.cpp \ + input/negcon.cpp input/guncon.cpp input/justifier.cpp \ + $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/psx/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/psx/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +input/$(am__dirstamp): + @$(MKDIR_P) input + @: > input/$(am__dirstamp) +input/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) input/$(DEPDIR) + @: > input/$(DEPDIR)/$(am__dirstamp) +input/gamepad.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/dualanalog.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/dualshock.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/memcard.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/multitap.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/mouse.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/negcon.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/guncon.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) +input/justifier.$(OBJEXT): input/$(am__dirstamp) \ + input/$(DEPDIR)/$(am__dirstamp) + +libpsx.a: $(libpsx_a_OBJECTS) $(libpsx_a_DEPENDENCIES) $(EXTRA_libpsx_a_DEPENDENCIES) + $(AM_V_at)-rm -f libpsx.a + $(AM_V_AR)$(libpsx_a_AR) libpsx.a $(libpsx_a_OBJECTS) $(libpsx_a_LIBADD) + $(AM_V_at)$(RANLIB) libpsx.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f input/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dis.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dma.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frontio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_line.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_polygon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu_sprite.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gte.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/irq.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/dualanalog.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/dualshock.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/gamepad.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/guncon.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/justifier.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/memcard.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/mouse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/multitap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@input/$(DEPDIR)/negcon.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f input/$(DEPDIR)/$(am__dirstamp) + -rm -f input/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) input/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/psx/cdc.cpp b/Mednafen/mednafen/psx/cdc.cpp new file mode 100644 index 0000000000..8910227489 --- /dev/null +++ b/Mednafen/mednafen/psx/cdc.cpp @@ -0,0 +1,2465 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Games to test after changing code affecting CD reading and buffering: + Bedlam + Rise 2 + +*/ + +// TODO: async command counter and async command phase? +/* + + TODO: + Implement missing commands. + + SPU CD-DA and CD-XA streaming semantics. +*/ + +/* + After eject(doesn't appear to occur when drive is in STOP state): + * Does not appear to occur in STOP state. + * Does not appear to occur in PAUSE state. + * DOES appear to occur in STANDBY state. (TODO: retest) + +% Result 0: 16 +% Result 1: 08 +% IRQ Result: e5 +% 19 e0 + + Command abortion tests(NOP tested): + Does not appear to occur when in STOP or PAUSE states(STOP or PAUSE command just executed). + + DOES occur after a ReadTOC completes, if ReadTOC is not followed by a STOP or PAUSE. Odd. +*/ + +#include "psx.h" +#include "cdc.h" +#include "spu.h" + +using namespace CDUtility; + +namespace MDFN_IEN_PSX +{ + +PS_CDC::PS_CDC() : DMABuffer(4096) +{ + IsPSXDisc = false; + Cur_CDIF = NULL; + + DriveStatus = DS_STOPPED; + PendingCommandPhase = 0; +} + +PS_CDC::~PS_CDC() +{ + +} + +void PS_CDC::DMForceStop(void) +{ + PSRCounter = 0; + + if((DriveStatus != DS_PAUSED && DriveStatus != DS_STOPPED) || PendingCommandPhase >= 2) + { + PendingCommand = 0x00; + PendingCommandCounter = 0; + PendingCommandPhase = 0; + } + + HeaderBufValid = false; + DriveStatus = DS_STOPPED; + ClearAIP(); + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; +} + +void PS_CDC::SetDisc(bool tray_open, CDIF *cdif, const char *disc_id) +{ + if(tray_open) + cdif = NULL; + + Cur_CDIF = cdif; + IsPSXDisc = false; + memset(DiscID, 0, sizeof(DiscID)); + + if(!Cur_CDIF) + { + DMForceStop(); + } + else + { + HeaderBufValid = false; + DiscStartupDelay = (int64)1000 * 33868800 / 1000; + DiscChanged = true; + + Cur_CDIF->ReadTOC(&toc); + + if(disc_id) + { + strncpy((char *)DiscID, disc_id, 4); + IsPSXDisc = true; + } + } +} + +int32 PS_CDC::CalcNextEvent(void) +{ + int32 next_event = SPUCounter; + + if(PSRCounter > 0 && next_event > PSRCounter) + next_event = PSRCounter; + + if(PendingCommandCounter > 0 && next_event > PendingCommandCounter) + next_event = PendingCommandCounter; + + if(!(IRQBuffer & 0xF)) + { + if(CDCReadyReceiveCounter > 0 && next_event > CDCReadyReceiveCounter) + next_event = CDCReadyReceiveCounter; + } + + if(DiscStartupDelay > 0 && next_event > DiscStartupDelay) + next_event = DiscStartupDelay; + + //fprintf(stderr, "%d %d %d %d --- %d\n", PSRCounter, PendingCommandCounter, CDCReadyReceiveCounter, DiscStartupDelay, next_event); + + return(next_event); +} + +void PS_CDC::SoftReset(void) +{ + ClearAudioBuffers(); + + // Not sure about initial volume state + Pending_DecodeVolume[0][0] = 0x80; + Pending_DecodeVolume[0][1] = 0x00; + Pending_DecodeVolume[1][0] = 0x00; + Pending_DecodeVolume[1][1] = 0x80; + memcpy(DecodeVolume, Pending_DecodeVolume, sizeof(DecodeVolume)); + + RegSelector = 0; + memset(ArgsBuf, 0, sizeof(ArgsBuf)); + ArgsWP = ArgsRP = 0; + + memset(ResultsBuffer, 0, sizeof(ResultsBuffer)); + ResultsWP = 0; + ResultsRP = 0; + ResultsIn = 0; + + CDCReadyReceiveCounter = 0; + + IRQBuffer = 0; + IRQOutTestMask = 0; + RecalcIRQ(); + + DMABuffer.Flush(); + SB_In = 0; + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + memset(SubQBuf, 0, sizeof(SubQBuf)); + memset(SubQBuf_Safe, 0, sizeof(SubQBuf_Safe)); + SubQChecksumOK = false; + + memset(HeaderBuf, 0, sizeof(HeaderBuf)); + + + FilterFile = 0; + FilterChan = 0; + + PendingCommand = 0; + PendingCommandPhase = 0; + PendingCommandCounter = 0; + + Mode = 0x20; + + HeaderBufValid = false; + DriveStatus = DS_STOPPED; + ClearAIP(); + StatusAfterSeek = DS_STOPPED; + SeekRetryCounter = 0; + + Forward = false; + Backward = false; + Muted = false; + + PlayTrackMatch = 0; + + PSRCounter = 0; + + CurSector = 0; + + ClearAIP(); + + SeekTarget = 0; + + CommandLoc = 0; + CommandLoc_Dirty = true; + + DiscChanged = true; +} + +void PS_CDC::Power(void) +{ + SPU->Power(); + + SoftReset(); + + DiscStartupDelay = 0; + + SPUCounter = SPU->UpdateFromCDC(0); + lastts = 0; +} + +void PS_CDC::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(DiscChanged), + SFVAR(DiscStartupDelay), + + SFARRAY16(&AudioBuffer.Samples[0][0], sizeof(AudioBuffer.Samples) / sizeof(AudioBuffer.Samples[0][0])), + SFVAR(AudioBuffer.Size), + SFVAR(AudioBuffer.Freq), + SFVAR(AudioBuffer.ReadPos), + + SFARRAY(&Pending_DecodeVolume[0][0], 2 * 2), + SFARRAY(&DecodeVolume[0][0], 2 * 2), + + SFARRAY16(&ADPCM_ResampBuf[0][0], sizeof(ADPCM_ResampBuf) / sizeof(ADPCM_ResampBuf[0][0])), + SFVAR(ADPCM_ResampCurPhase), + SFVAR(ADPCM_ResampCurPos), + + + + SFVAR(RegSelector), + SFARRAY(ArgsBuf, 16), + SFVAR(ArgsWP), + SFVAR(ArgsRP), + + SFVAR(ArgsReceiveLatch), + SFARRAY(ArgsReceiveBuf, 32), + SFVAR(ArgsReceiveIn), + + SFARRAY(ResultsBuffer, 16), + SFVAR(ResultsIn), + SFVAR(ResultsWP), + SFVAR(ResultsRP), + + // + // + // + SFARRAY(&DMABuffer.data[0], DMABuffer.data.size()), + SFVAR(DMABuffer.read_pos), + SFVAR(DMABuffer.write_pos), + SFVAR(DMABuffer.in_count), + // + // + // + + SFARRAY(SB, sizeof(SB) / sizeof(SB[0])), + SFVAR(SB_In), + + SFARRAY(&SectorPipe[0][0], sizeof(SectorPipe) / sizeof(SectorPipe[0][0])), + SFVAR(SectorPipe_Pos), + SFVAR(SectorPipe_In), + + SFARRAY(SubQBuf, sizeof(SubQBuf) / sizeof(SubQBuf[0])), + SFARRAY(SubQBuf_Safe, sizeof(SubQBuf_Safe) / sizeof(SubQBuf_Safe[0])), + + SFVAR(SubQChecksumOK), + + SFVAR(HeaderBufValid), + SFARRAY(HeaderBuf, sizeof(HeaderBuf) / sizeof(HeaderBuf[0])), + + SFVAR(IRQBuffer), + SFVAR(IRQOutTestMask), + SFVAR(CDCReadyReceiveCounter), + + + SFVAR(FilterFile), + SFVAR(FilterChan), + + SFVAR(PendingCommand), + SFVAR(PendingCommandPhase), + SFVAR(PendingCommandCounter), + + SFVAR(SPUCounter), + + SFVAR(Mode), + SFVAR(DriveStatus), + SFVAR(StatusAfterSeek), + SFVAR(Forward), + SFVAR(Backward), + SFVAR(Muted), + + SFVAR(PlayTrackMatch), + + SFVAR(PSRCounter), + + SFVAR(CurSector), + SFVAR(SectorsRead), + + SFVAR(AsyncIRQPending), + SFARRAY(AsyncResultsPending, sizeof(AsyncResultsPending) / sizeof(AsyncResultsPending[0])), + SFVAR(AsyncResultsPendingCount), + + SFVAR(SeekTarget), + SFVAR(SeekRetryCounter), + + // FIXME: Save TOC stuff? +#if 0 + CDUtility::TOC toc; + bool IsPSXDisc; + uint8 DiscID[4]; +#endif + + SFVAR(CommandLoc), + SFVAR(CommandLoc_Dirty), + SFARRAY16(&xa_previous[0][0], sizeof(xa_previous) / sizeof(xa_previous[0][0])), + + SFVAR(xa_cur_set), + SFVAR(xa_cur_file), + SFVAR(xa_cur_chan), + + SFVAR(ReportLastF), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CDC"); + + if(load) + { + DMABuffer.SaveStatePostLoad(); + SectorPipe_Pos %= SectorPipe_Count; + + // + // Handle pre-0.9.37 state loading, and maliciously-constructed/corrupted save states. + if(!Cur_CDIF) + DMForceStop(); + } +} + +void PS_CDC::ResetTS(void) +{ + lastts = 0; +} + +void PS_CDC::RecalcIRQ(void) +{ + IRQ_Assert(IRQ_CD, (bool)(IRQBuffer & (IRQOutTestMask & 0x1F))); +} + +//static int32 doom_ts; +void PS_CDC::WriteIRQ(uint8 V) +{ + assert(CDCReadyReceiveCounter <= 0); + assert(!(IRQBuffer & 0xF)); + + //PSX_WARNING("[CDC] ***IRQTHINGY: 0x%02x -- %u", V, doom_ts); + + CDCReadyReceiveCounter = 2000; //1024; + + IRQBuffer = (IRQBuffer & 0x10) | V; + RecalcIRQ(); +} + +void PS_CDC::BeginResults(void) +{ + //if(ResultsIn) + // { + // printf("Cleared %d results. IRQBuffer=0x%02x\n", ResultsIn, IRQBuffer); + //} + + ResultsIn = 0; + ResultsWP = 0; + ResultsRP = 0; + + memset(ResultsBuffer, 0x00, sizeof(ResultsBuffer)); +} + +void PS_CDC::WriteResult(uint8 V) +{ + ResultsBuffer[ResultsWP] = V; + ResultsWP = (ResultsWP + 1) & 0xF; + ResultsIn = (ResultsIn + 1) & 0x1F; + + if(!ResultsIn) + PSX_WARNING("[CDC] Results buffer overflow!"); +} + +uint8 PS_CDC::ReadResult(void) +{ + uint8 ret = ResultsBuffer[ResultsRP]; + + if(!ResultsIn) + PSX_WARNING("[CDC] Results buffer underflow!"); + + ResultsRP = (ResultsRP + 1) & 0xF; + ResultsIn = (ResultsIn - 1) & 0x1F; + + return ret; +} + +uint8 PS_CDC::MakeStatus(bool cmd_error) +{ + uint8 ret = 0; + + // Are these bit positions right? + + if(DriveStatus == DS_PLAYING) + ret |= 0x80; + + // Probably will want to be careful with this HeaderBufValid versus seek/read bit business in the future as it is a bit fragile; + // "Gran Turismo 1"'s music(or erroneous lack of) is a good test case. + if(DriveStatus == DS_READING) + { + if(!HeaderBufValid) + ret |= 0x40; + else + ret |= 0x20; + } + else if(DriveStatus == DS_SEEKING || DriveStatus == DS_SEEKING_LOGICAL) + ret |= 0x40; + + if(!Cur_CDIF || DiscChanged) + ret |= 0x10; + + if(DriveStatus != DS_STOPPED) + ret |= 0x02; + + if(cmd_error) + ret |= 0x01; + + DiscChanged = false; // FIXME: Only do it on NOP command execution? + + return(ret); +} + +bool PS_CDC::DecodeSubQ(uint8 *subpw) +{ + uint8 tmp_q[0xC]; + + memset(tmp_q, 0, 0xC); + + for(int i = 0; i < 96; i++) + tmp_q[i >> 3] |= ((subpw[i] & 0x40) >> 6) << (7 - (i & 7)); + + if((tmp_q[0] & 0xF) == 1) + { + memcpy(SubQBuf, tmp_q, 0xC); + SubQChecksumOK = subq_check_checksum(tmp_q); + + if(SubQChecksumOK) + { + memcpy(SubQBuf_Safe, tmp_q, 0xC); + return(true); + } + } + + return(false); +} + +static const int16 CDADPCMImpulse[7][25] = +{ + { 0, -5, 17, -35, 70, -23, -68, 347, -839, 2062, -4681, 15367, 21472, -5882, 2810, -1352, 635, -235, 26, 43, -35, 16, -8, 2, 0, }, /* 0 */ + { 0, -2, 10, -34, 65, -84, 52, 9, -266, 1024, -2680, 9036, 26516, -6016, 3021, -1571, 848, -365, 107, 10, -16, 17, -8, 3, -1, }, /* 1 */ + { -2, 0, 3, -19, 60, -75, 162, -227, 306, -67, -615, 3229, 29883, -4532, 2488, -1471, 882, -424, 166, -27, 5, 6, -8, 3, -1, }, /* 2 */ + { -1, 3, -2, -5, 31, -74, 179, -402, 689, -926, 1272, -1446, 31033, -1446, 1272, -926, 689, -402, 179, -74, 31, -5, -2, 3, -1, }, /* 3 */ + { -1, 3, -8, 6, 5, -27, 166, -424, 882, -1471, 2488, -4532, 29883, 3229, -615, -67, 306, -227, 162, -75, 60, -19, 3, 0, -2, }, /* 4 */ + { -1, 3, -8, 17, -16, 10, 107, -365, 848, -1571, 3021, -6016, 26516, 9036, -2680, 1024, -266, 9, 52, -84, 65, -34, 10, -2, 0, }, /* 5 */ + { 0, 2, -8, 16, -35, 43, 26, -235, 635, -1352, 2810, -5882, 21472, 15367, -4681, 2062, -839, 347, -68, -23, 70, -35, 17, -5, 0, }, /* 6 */ +}; + +void PS_CDC::ReadAudioBuffer(int32 samples[2]) +{ + samples[0] = AudioBuffer.Samples[0][AudioBuffer.ReadPos]; + samples[1] = AudioBuffer.Samples[1][AudioBuffer.ReadPos]; + + AudioBuffer.ReadPos++; +} + +INLINE void PS_CDC::ApplyVolume(int32 samples[2]) +{ + // + // Take care not to alter samples[] before we're done calculating the new output samples! + // + int32 left_out = ((samples[0] * DecodeVolume[0][0]) >> 7) + ((samples[1] * DecodeVolume[1][0]) >> 7); + int32 right_out = ((samples[0] * DecodeVolume[0][1]) >> 7) + ((samples[1] * DecodeVolume[1][1]) >> 7); + + clamp(&left_out, -32768, 32767); + clamp(&right_out, -32768, 32767); + + if(Muted) + { + left_out = 0; + right_out = 0; + } + + samples[0] = left_out; + samples[1] = right_out; +} + +// +// This function must always set samples[0] and samples[1], even if just to 0; range of samples[n] shall be restricted to -32768 through 32767. +// +void PS_CDC::GetCDAudio(int32 samples[2]) +{ + const unsigned freq = (AudioBuffer.ReadPos < AudioBuffer.Size) ? AudioBuffer.Freq : 0; + + samples[0] = 0; + samples[1] = 0; + + if(!freq) + return; + + if(freq == 7 || freq == 14) + { + ReadAudioBuffer(samples); + if(freq == 14) + ReadAudioBuffer(samples); + } + else + { + int32 out_tmp[2] = { 0, 0 }; + + for(unsigned i = 0; i < 2; i++) + { + const int16* imp = CDADPCMImpulse[ADPCM_ResampCurPhase]; + int16* wf = &ADPCM_ResampBuf[i][(ADPCM_ResampCurPos + 32 - 25) & 0x1F]; + + for(unsigned s = 0; s < 25; s++) + { + out_tmp[i] += imp[s] * wf[s]; + } + + out_tmp[i] >>= 15; + clamp(&out_tmp[i], -32768, 32767); + samples[i] = out_tmp[i]; + } + + ADPCM_ResampCurPhase += freq; + + if(ADPCM_ResampCurPhase >= 7) + { + int32 raw[2] = { 0, 0 }; + + ADPCM_ResampCurPhase -= 7; + ReadAudioBuffer(raw); + + for(unsigned i = 0; i < 2; i++) + { + ADPCM_ResampBuf[i][ADPCM_ResampCurPos + 0] = + ADPCM_ResampBuf[i][ADPCM_ResampCurPos + 32] = raw[i]; + } + ADPCM_ResampCurPos = (ADPCM_ResampCurPos + 1) & 0x1F; + } + } + + // + // Algorithmically, volume is applied after resampling for CD-XA ADPCM playback, per PS1 tests(though when "mute" is applied wasn't tested). + // + ApplyVolume(samples); +} + + +struct XA_Subheader +{ + uint8 file; + uint8 channel; + uint8 submode; + uint8 coding; + + uint8 file_dup; + uint8 channel_dup; + uint8 submode_dup; + uint8 coding_dup; +} __attribute__((__packed__)); + +struct XA_SoundGroup +{ + uint8 params[16]; + uint8 samples[112]; +} __attribute__((__packed__)); + +#define XA_SUBMODE_EOF 0x80 +#define XA_SUBMODE_REALTIME 0x40 +#define XA_SUBMODE_FORM 0x20 +#define XA_SUBMODE_TRIGGER 0x10 +#define XA_SUBMODE_DATA 0x08 +#define XA_SUBMODE_AUDIO 0x04 +#define XA_SUBMODE_VIDEO 0x02 +#define XA_SUBMODE_EOR 0x01 + +#define XA_CODING_EMPHASIS 0x40 + +//#define XA_CODING_BPS_MASK 0x30 +//#define XA_CODING_BPS_4BIT 0x00 +//#define XA_CODING_BPS_8BIT 0x10 +//#define XA_CODING_SR_MASK 0x0C +//#define XA_CODING_SR_378 0x00 +//#define XA_CODING_SR_ + +#define XA_CODING_8BIT 0x10 +#define XA_CODING_189 0x04 +#define XA_CODING_STEREO 0x01 + +// Special regression prevention test cases: +// Um Jammer Lammy (start doing poorly) +// Yarudora Series Vol.1 - Double Cast (non-FMV speech) + +bool PS_CDC::XA_Test(const uint8 *sdata) +{ + const XA_Subheader *sh = (const XA_Subheader *)&sdata[12 + 4]; + + if(!(Mode & MODE_STRSND)) + return false; + + if(!(sh->submode & XA_SUBMODE_AUDIO)) + return false; + + //printf("Test File: 0x%02x 0x%02x - Channel: 0x%02x 0x%02x - Submode: 0x%02x 0x%02x - Coding: 0x%02x 0x%02x - \n", sh->file, sh->file_dup, sh->channel, sh->channel_dup, sh->submode, sh->submode_dup, sh->coding, sh->coding_dup); + + if((Mode & MODE_SF) && (sh->file != FilterFile || sh->channel != FilterChan)) + return false; + + if(!xa_cur_set || (Mode & MODE_SF)) + { + xa_cur_set = true; + xa_cur_file = sh->file; + xa_cur_chan = sh->channel; + } + else if(sh->file != xa_cur_file || sh->channel != xa_cur_chan) + return false; + + if(sh->submode & XA_SUBMODE_EOF) + { + //puts("YAY"); + xa_cur_set = false; + xa_cur_file = 0; + xa_cur_chan = 0; + } + + return true; +} + +void PS_CDC::ClearAudioBuffers(void) +{ + memset(&AudioBuffer, 0, sizeof(AudioBuffer)); + memset(xa_previous, 0, sizeof(xa_previous)); + + xa_cur_set = false; + xa_cur_file = 0; + xa_cur_chan = 0; + + memset(ADPCM_ResampBuf, 0, sizeof(ADPCM_ResampBuf)); + ADPCM_ResampCurPhase = 0; + ADPCM_ResampCurPos = 0; +} + +// +// output should be readable at -2 and -1 +static void DecodeXAADPCM(const uint8 *input, int16 *output, const unsigned shift, const unsigned weight) +{ + // Weights copied over from SPU channel ADPCM playback code, may not be entirely the same for CD-XA ADPCM, we need to run tests. + static const int32 Weights[16][2] = + { + // s-1 s-2 + { 0, 0 }, + { 60, 0 }, + { 115, -52 }, + { 98, -55 }, + { 122, -60 }, + }; + + for(int i = 0; i < 28; i++) + { + int32 sample; + + sample = (int16)(input[i] << 8); + sample >>= shift; + + sample += ((output[i - 1] * Weights[weight][0]) >> 6) + ((output[i - 2] * Weights[weight][1]) >> 6); + + if(sample < -32768) + sample = -32768; + + if(sample > 32767) + sample = 32767; + + output[i] = sample; + } +} + +void PS_CDC::XA_ProcessSector(const uint8 *sdata, CD_Audio_Buffer *ab) +{ + const XA_Subheader *sh = (const XA_Subheader *)&sdata[12 + 4]; + const unsigned unit_index_shift = (sh->coding & XA_CODING_8BIT) ? 0 : 1; + + //printf("File: 0x%02x 0x%02x - Channel: 0x%02x 0x%02x - Submode: 0x%02x 0x%02x - Coding: 0x%02x 0x%02x - \n", sh->file, sh->file_dup, sh->channel, sh->channel_dup, sh->submode, sh->submode_dup, sh->coding, sh->coding_dup); + ab->ReadPos = 0; + ab->Size = 18 * (4 << unit_index_shift) * 28; + + if(sh->coding & XA_CODING_STEREO) + ab->Size >>= 1; + + ab->Freq = (sh->coding & XA_CODING_189) ? 3 : 6; + + //fprintf(stderr, "Coding: %02x %02x\n", sh->coding, sh->coding_dup); + + for(unsigned group = 0; group < 18; group++) + { + const XA_SoundGroup *sg = (const XA_SoundGroup *)&sdata[12 + 4 + 8 + group * 128]; + + for(unsigned unit = 0; unit < (4U << unit_index_shift); unit++) + { + const uint8 param = sg->params[(unit & 3) | ((unit & 4) << 1)]; + const uint8 param_copy = sg->params[4 | (unit & 3) | ((unit & 4) << 1)]; + uint8 ibuffer[28]; + int16 obuffer[2 + 28]; + + if(param != param_copy) + { + PSX_WARNING("[CDC] CD-XA param != param_copy --- %d %02x %02x\n", unit, param, param_copy); + } + + for(unsigned i = 0; i < 28; i++) + { + uint8 tmp = sg->samples[i * 4 + (unit >> unit_index_shift)]; + + if(unit_index_shift) + { + tmp <<= (unit & 1) ? 0 : 4; + tmp &= 0xf0; + } + + ibuffer[i] = tmp; + } + + const bool ocn = (bool)(unit & 1) && (sh->coding & XA_CODING_STEREO); + + obuffer[0] = xa_previous[ocn][0]; + obuffer[1] = xa_previous[ocn][1]; + + DecodeXAADPCM(ibuffer, &obuffer[2], param & 0x0F, param >> 4); + + xa_previous[ocn][0] = obuffer[28]; + xa_previous[ocn][1] = obuffer[29]; + + if(param != param_copy) + memset(obuffer, 0, sizeof(obuffer)); + + if(sh->coding & XA_CODING_STEREO) + { + for(unsigned s = 0; s < 28; s++) + { + ab->Samples[ocn][group * (2 << unit_index_shift) * 28 + (unit >> 1) * 28 + s] = obuffer[2 + s]; + } + } + else + { + for(unsigned s = 0; s < 28; s++) + { + ab->Samples[0][group * (4 << unit_index_shift) * 28 + unit * 28 + s] = obuffer[2 + s]; + ab->Samples[1][group * (4 << unit_index_shift) * 28 + unit * 28 + s] = obuffer[2 + s]; + } + } + } + } + +#if 0 + // Test + for(unsigned i = 0; i < ab->Size; i++) + { + static unsigned counter = 0; + + ab->Samples[0][i] = (counter & 2) ? -0x6000 : 0x6000; + ab->Samples[1][i] = rand(); + counter++; + } +#endif +} + +void PS_CDC::ClearAIP(void) +{ + AsyncResultsPendingCount = 0; + AsyncIRQPending = 0; +} + +void PS_CDC::CheckAIP(void) +{ + if(AsyncIRQPending && CDCReadyReceiveCounter <= 0) + { + BeginResults(); + + for(unsigned i = 0; i < AsyncResultsPendingCount; i++) + WriteResult(AsyncResultsPending[i]); + + WriteIRQ(AsyncIRQPending); + + ClearAIP(); + } +} + +void PS_CDC::SetAIP(unsigned irq, unsigned result_count, uint8 *r) +{ + if(AsyncIRQPending) + { + PSX_WARNING("***WARNING*** Previous notification skipped: CurSector=%d, old_notification=0x%02x", CurSector, AsyncIRQPending); + } + ClearAIP(); + + AsyncResultsPendingCount = result_count; + + for(unsigned i = 0; i < result_count; i++) + AsyncResultsPending[i] = r[i]; + + AsyncIRQPending = irq; + + CheckAIP(); +} + +void PS_CDC::SetAIP(unsigned irq, uint8 result0) +{ + uint8 tr[1] = { result0 }; + SetAIP(irq, 1, tr); +} + +void PS_CDC::SetAIP(unsigned irq, uint8 result0, uint8 result1) +{ + uint8 tr[2] = { result0, result1 }; + SetAIP(irq, 2, tr); +} + + +void PS_CDC::EnbufferizeCDDASector(const uint8 *buf) +{ + CD_Audio_Buffer *ab = &AudioBuffer; + + ab->Freq = 7 * ((Mode & MODE_SPEED) ? 2 : 1); + ab->Size = 588; + + if(SubQBuf_Safe[0] & 0x40) + { + for(int i = 0; i < 588; i++) + { + ab->Samples[0][i] = 0; + ab->Samples[1][i] = 0; + } + } + else + { + for(int i = 0; i < 588; i++) + { + ab->Samples[0][i] = (int16)MDFN_de16lsb(&buf[i * sizeof(int16) * 2 + 0]); + ab->Samples[1][i] = (int16)MDFN_de16lsb(&buf[i * sizeof(int16) * 2 + 2]); + } + } + + ab->ReadPos = 0; +} + +void PS_CDC::HandlePlayRead(void) +{ + uint8 read_buf[2352 + 96]; + + //PSX_WARNING("Read sector: %d", CurSector); + + if(CurSector >= ((int32)toc.tracks[100].lba + 300) && CurSector >= (75 * 60 * 75 - 150)) + { + PSX_WARNING("[CDC] Read/Play position waaay too far out(%u), forcing STOP", CurSector); + DriveStatus = DS_STOPPED; + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + return; + } + + if(CurSector >= (int32)toc.tracks[100].lba) + { + PSX_WARNING("[CDC] In leadout area: %u", CurSector); + } + + Cur_CDIF->ReadRawSector(read_buf, CurSector); // FIXME: error out on error. + DecodeSubQ(read_buf + 2352); + + if(SubQBuf_Safe[1] == 0xAA && (DriveStatus == DS_PLAYING || (!(SubQBuf_Safe[0] & 0x40) && (Mode & MODE_CDDA)))) + { + HeaderBufValid = false; + + PSX_WARNING("[CDC] CD-DA leadout reached: %u", CurSector); + + // Status in this end-of-disc context here should be generated after we're in the pause state. + DriveStatus = DS_PAUSED; + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + SetAIP(CDCIRQ_DATA_END, MakeStatus()); + + return; + } + + if(DriveStatus == DS_PLAYING) + { + // Note: Some game(s) start playing in the pregap of a track(so don't replace this with a simple subq index == 0 check for autopause). + if(PlayTrackMatch == -1 && SubQChecksumOK) + PlayTrackMatch = SubQBuf_Safe[0x1]; + + if((Mode & MODE_AUTOPAUSE) && PlayTrackMatch != -1 && SubQBuf_Safe[0x1] != PlayTrackMatch) + { + // Status needs to be taken before we're paused(IE it should still report playing). + SetAIP(CDCIRQ_DATA_END, MakeStatus()); + + DriveStatus = DS_PAUSED; + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + PSRCounter = 0; + return; + } + + if((Mode & MODE_REPORT) && (((SubQBuf_Safe[0x9] >> 4) != ReportLastF) || Forward || Backward) && SubQChecksumOK) + { + uint8 tr[8]; +#if 0 + uint16 abs_lev_max = 0; + bool abs_lev_chselect = SubQBuf_Safe[0x8] & 0x01; + + for(int i = 0; i < 588; i++) + abs_lev_max = std::max(abs_lev_max, std::min(abs((int16)MDFN_de16lsb(&read_buf[i * 4 + (abs_lev_chselect * 2)])), 32767)); + abs_lev_max |= abs_lev_chselect << 15; +#endif + + ReportLastF = SubQBuf_Safe[0x9] >> 4; + + tr[0] = MakeStatus(); + tr[1] = SubQBuf_Safe[0x1]; // Track + tr[2] = SubQBuf_Safe[0x2]; // Index + + if(SubQBuf_Safe[0x9] & 0x10) + { + tr[3] = SubQBuf_Safe[0x3]; // R M + tr[4] = SubQBuf_Safe[0x4] | 0x80; // R S + tr[5] = SubQBuf_Safe[0x5]; // R F + } + else + { + tr[3] = SubQBuf_Safe[0x7]; // A M + tr[4] = SubQBuf_Safe[0x8]; // A S + tr[5] = SubQBuf_Safe[0x9]; // A F + } + + tr[6] = 0; //abs_lev_max >> 0; + tr[7] = 0; //abs_lev_max >> 8; + + SetAIP(CDCIRQ_DATA_READY, 8, tr); + } + } + + if(SectorPipe_In >= SectorPipe_Count) + { + uint8* buf = SectorPipe[SectorPipe_Pos]; + SectorPipe_In--; + + if(DriveStatus == DS_READING) + { + if(SubQBuf_Safe[0] & 0x40) //) || !(Mode & MODE_CDDA)) + { + memcpy(HeaderBuf, buf + 12, 12); + HeaderBufValid = true; + + if((Mode & MODE_STRSND) && (buf[12 + 3] == 0x2) && ((buf[12 + 6] & 0x64) == 0x64)) + { + if(XA_Test(buf)) + { + if(AudioBuffer.ReadPos < AudioBuffer.Size) + { + PSX_WARNING("[CDC] CD-XA ADPCM sector skipped - readpos=0x%04x, size=0x%04x", AudioBuffer.ReadPos, AudioBuffer.Size); + } + else + { + XA_ProcessSector(buf, &AudioBuffer); + } + } + } + else + { + // maybe if(!(Mode & 0x30)) too? + if(!(buf[12 + 6] & 0x20)) + { + if(!edc_lec_check_and_correct(buf, true)) + { + MDFN_DispMessage("Bad sector? - %d", CurSector); + } + } + + if(!(Mode & 0x30) && (buf[12 + 6] & 0x20)) + PSX_WARNING("[CDC] BORK: %d", CurSector); + + int32 offs = (Mode & 0x20) ? 0 : 12; + int32 size = (Mode & 0x20) ? 2340 : 2048; + + if(Mode & 0x10) + { + offs = 12; + size = 2328; + } + + memcpy(SB, buf + 12 + offs, size); + SB_In = size; + SetAIP(CDCIRQ_DATA_READY, MakeStatus()); + } + } + } + + if(!(SubQBuf_Safe[0] & 0x40) && ((Mode & MODE_CDDA) || DriveStatus == DS_PLAYING)) + { + if(AudioBuffer.ReadPos < AudioBuffer.Size) + { + PSX_WARNING("[CDC] BUG CDDA buffer full"); + } + else + { + EnbufferizeCDDASector(buf); + } + } + } + + memcpy(SectorPipe[SectorPipe_Pos], read_buf, 2352); + SectorPipe_Pos = (SectorPipe_Pos + 1) % SectorPipe_Count; + SectorPipe_In++; + + PSRCounter += 33868800 / (75 * ((Mode & MODE_SPEED) ? 2 : 1)); + + if(DriveStatus == DS_PLAYING) + { + // FIXME: What's the real fast-forward and backward speed? + if(Forward) + CurSector += 12; + else if(Backward) + { + CurSector -= 12; + + if(CurSector < 0) // FIXME: How does a real PS handle this condition? + CurSector = 0; + } + else + CurSector++; + } + else + CurSector++; + + SectorsRead++; +} + +pscpu_timestamp_t PS_CDC::Update(const pscpu_timestamp_t timestamp) +{ + int32 clocks = timestamp - lastts; + + //doom_ts = timestamp; + + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(PSRCounter > 0 && chunk_clocks > PSRCounter) + chunk_clocks = PSRCounter; + + if(PendingCommandCounter > 0 && chunk_clocks > PendingCommandCounter) + chunk_clocks = PendingCommandCounter; + + if(chunk_clocks > SPUCounter) + chunk_clocks = SPUCounter; + + if(DiscStartupDelay > 0) + { + if(chunk_clocks > DiscStartupDelay) + chunk_clocks = DiscStartupDelay; + + DiscStartupDelay -= chunk_clocks; + + if(DiscStartupDelay <= 0) + { + DriveStatus = DS_PAUSED; // or is it supposed to be DS_STANDBY? + } + } + + //MDFN_DispMessage("%02x %d -- %d %d -- %02x", IRQBuffer, CDCReadyReceiveCounter, PSRCounter, PendingCommandCounter, PendingCommand); + + if(!(IRQBuffer & 0xF)) + { + if(CDCReadyReceiveCounter > 0 && chunk_clocks > CDCReadyReceiveCounter) + chunk_clocks = CDCReadyReceiveCounter; + + if(CDCReadyReceiveCounter > 0) + CDCReadyReceiveCounter -= chunk_clocks; + } + + CheckAIP(); + + if(PSRCounter > 0) + { + uint8 pwbuf[96]; + + PSRCounter -= chunk_clocks; + + if(PSRCounter <= 0) + { + if(DriveStatus == DS_RESETTING) + { + SetAIP(CDCIRQ_COMPLETE, MakeStatus()); + + Muted = false; // Does it get reset here? + ClearAudioBuffers(); + + SB_In = 0; + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + Mode = 0x20; // Confirmed(and see "This Is Football 2"). + CurSector = 0; + CommandLoc = 0; + + DriveStatus = DS_PAUSED; // or DS_STANDBY? + ClearAIP(); + } + else if(DriveStatus == DS_SEEKING) + { + CurSector = SeekTarget; + + // + // CurSector + x for "Tomb Raider"'s sake, as it relies on behavior that we can't emulate very well without a more accurate CD drive + // emulation model. + // + for(int x = -1; x >= -16; x--) + { + //printf("%d\n", CurSector + x); + Cur_CDIF->ReadRawSectorPWOnly(pwbuf, CurSector + x, false); + if(DecodeSubQ(pwbuf)) + break; + } + + DriveStatus = StatusAfterSeek; + + if(DriveStatus != DS_PAUSED && DriveStatus != DS_STANDBY) + { + PSRCounter = 33868800 / (75 * ((Mode & MODE_SPEED) ? 2 : 1)); + } + } + else if(DriveStatus == DS_SEEKING_LOGICAL) + { + CurSector = SeekTarget; + Cur_CDIF->ReadRawSectorPWOnly(pwbuf, CurSector, false); + DecodeSubQ(pwbuf); + + if(!(Mode & MODE_CDDA) && !(SubQBuf_Safe[0] & 0x40)) + { + if(!SeekRetryCounter) + { + DriveStatus = DS_STANDBY; + SetAIP(CDCIRQ_DISC_ERROR, MakeStatus() | 0x04, 0x04); + } + else + { + SeekRetryCounter--; + PSRCounter = 33868800 / 75; + } + } + else + { + DriveStatus = StatusAfterSeek; + + if(DriveStatus != DS_PAUSED && DriveStatus != DS_STANDBY) + { + PSRCounter = 33868800 / (75 * ((Mode & MODE_SPEED) ? 2 : 1)); + } + } + } + else if(DriveStatus == DS_READING || DriveStatus == DS_PLAYING) + { + HandlePlayRead(); + } + } + } + + if(PendingCommandCounter > 0) + { + PendingCommandCounter -= chunk_clocks; + + if(PendingCommandCounter <= 0 && CDCReadyReceiveCounter > 0) + { + PendingCommandCounter = CDCReadyReceiveCounter; //256; + } + //else if(PendingCommandCounter <= 0 && PSRCounter > 0 && PSRCounter < 2000) + //{ + // PendingCommandCounter = PSRCounter + 1; + //} + else if(PendingCommandCounter <= 0) + { + int32 next_time = 0; + + if(PendingCommandPhase == -1) + { + if(ArgsRP != ArgsWP) + { + ArgsReceiveLatch = ArgsBuf[ArgsRP & 0x0F]; + ArgsRP = (ArgsRP + 1) & 0x1F; + PendingCommandPhase += 1; + next_time = 1815; + } + else + { + PendingCommandPhase += 2; + next_time = 8500; + } + } + else if(PendingCommandPhase == 0) // Command phase 0 + { + if(ArgsReceiveIn < 32) + ArgsReceiveBuf[ArgsReceiveIn++] = ArgsReceiveLatch; + + if(ArgsRP != ArgsWP) + { + ArgsReceiveLatch = ArgsBuf[ArgsRP & 0x0F]; + ArgsRP = (ArgsRP + 1) & 0x1F; + next_time = 1815; + } + else + { + PendingCommandPhase++; + next_time = 8500; + } + } + else if(PendingCommandPhase >= 2) // Command phase 2+ + { + BeginResults(); + + const CDC_CTEntry *command = &Commands[PendingCommand]; + + next_time = (this->*(command->func2))(); + } + else // Command phase 1 + { + if(PendingCommand >= 0x20 || !Commands[PendingCommand].func) + { + BeginResults(); + + PSX_WARNING("[CDC] Unknown command: 0x%02x", PendingCommand); + + WriteResult(MakeStatus(true)); + WriteResult(ERRCODE_BAD_COMMAND); + WriteIRQ(CDCIRQ_DISC_ERROR); + } + else if(ArgsReceiveIn < Commands[PendingCommand].args_min || ArgsReceiveIn > Commands[PendingCommand].args_max) + { + BeginResults(); + + PSX_DBG(PSX_DBG_WARNING, "[CDC] Bad number(%d) of args(first check) for command 0x%02x", ArgsReceiveIn, PendingCommand); + for(unsigned int i = 0; i < ArgsReceiveIn; i++) + PSX_DBG(PSX_DBG_WARNING, " 0x%02x", ArgsReceiveBuf[i]); + PSX_DBG(PSX_DBG_WARNING, "\n"); + + WriteResult(MakeStatus(true)); + WriteResult(ERRCODE_BAD_NUMARGS); + WriteIRQ(CDCIRQ_DISC_ERROR); + } + else + { + BeginResults(); + + const CDC_CTEntry *command = &Commands[PendingCommand]; + + PSX_DBG(PSX_DBG_SPARSE, "[CDC] Command: %s --- ", command->name); + for(unsigned int i = 0; i < ArgsReceiveIn; i++) + PSX_DBG(PSX_DBG_SPARSE, " 0x%02x", ArgsReceiveBuf[i]); + PSX_DBG(PSX_DBG_SPARSE, "\n"); + + next_time = (this->*(command->func))(ArgsReceiveIn, ArgsReceiveBuf); + PendingCommandPhase = 2; + } + ArgsReceiveIn = 0; + } // end command phase 1 + + if(!next_time) + PendingCommandCounter = 0; + else + PendingCommandCounter += next_time; + } + } + + SPUCounter = SPU->UpdateFromCDC(chunk_clocks); + + clocks -= chunk_clocks; + } // end while(clocks > 0) + + lastts = timestamp; + + return(timestamp + CalcNextEvent()); +} + +void PS_CDC::Write(const pscpu_timestamp_t timestamp, uint32 A, uint8 V) +{ + A &= 0x3; + + //printf("Write: %08x %02x\n", A, V); + + if(A == 0x00) + { + RegSelector = V & 0x3; + } + else + { + const unsigned reg_index = ((RegSelector & 0x3) * 3) + (A - 1); + + Update(timestamp); + //PSX_WARNING("[CDC] Write to register 0x%02x: 0x%02x @ %d --- 0x%02x 0x%02x\n", reg_index, V, timestamp, DMABuffer.CanRead(), IRQBuffer); + + switch(reg_index) + { + default: + PSX_WARNING("[CDC] Unknown write to register 0x%02x: 0x%02x\n", reg_index, V); + break; + + case 0x00: + if(PendingCommandCounter > 0) + { + PSX_WARNING("[CDC] WARNING: Interrupting command 0x%02x, phase=%d, timeleft=%d with command=0x%02x", PendingCommand, PendingCommandPhase, + PendingCommandCounter, V); + } + + if(IRQBuffer & 0xF) + { + PSX_WARNING("[CDC] Attempting to start command(0x%02x) while IRQBuffer(0x%02x) is not clear.", V, IRQBuffer); + } + + if(ResultsIn > 0) + { + PSX_WARNING("[CDC] Attempting to start command(0x%02x) while command results(count=%d) still in buffer.", V, ResultsIn); + } + + PendingCommandCounter = 10500 + PSX_GetRandU32(0, 3000) + 1815; + PendingCommand = V; + PendingCommandPhase = -1; + ArgsReceiveIn = 0; + break; + + case 0x01: + ArgsBuf[ArgsWP & 0xF] = V; + ArgsWP = (ArgsWP + 1) & 0x1F; + + if(!((ArgsWP - ArgsRP) & 0x0F)) + { + PSX_WARNING("[CDC] Argument buffer overflow"); + } + break; + + case 0x02: + if(V & 0x80) + { + if(!DMABuffer.CanRead()) + { + if(!SB_In) + { + PSX_WARNING("[CDC] Data read begin when no data to read!"); + + DMABuffer.Write(SB, 2340); + + while(DMABuffer.CanWrite()) + DMABuffer.WriteByte(0x00); + } + else + { + DMABuffer.Write(SB, SB_In); + SB_In = 0; + } + } + else + { + //PSX_WARNING("[CDC] Attempt to start data transfer via 0x80->1803 when %d bytes still in buffer", DMABuffer.CanRead()); + } + } + else if(V & 0x40) // Something CD-DA related(along with & 0x20 ???)? + { + for(unsigned i = 0; i < 4 && DMABuffer.CanRead(); i++) + DMABuffer.ReadByte(); + } + else + { + DMABuffer.Flush(); + } + + if(V & 0x20) + { + PSX_WARNING("[CDC] Mystery IRQ trigger bit set."); + IRQBuffer |= 0x10; + RecalcIRQ(); + } + break; + + case 0x04: + IRQOutTestMask = V; + RecalcIRQ(); + break; + + case 0x05: + if((IRQBuffer &~ V) != IRQBuffer && ResultsIn) + { + // To debug icky race-condition related problems in "Psychic Detective", and to see if any games suffer from the same potential issue + // (to know what to test when we emulate CPU more accurately in regards to pipeline stalls and timing, which could throw off our kludge + // for this issue) + PSX_WARNING("[CDC] Acknowledged IRQ(wrote 0x%02x, before_IRQBuffer=0x%02x) while %u bytes in results buffer.", V, IRQBuffer, ResultsIn); + } + + IRQBuffer &= ~V; + RecalcIRQ(); + + if(V & 0x80) // Forced CD hardware reset of some kind(interface, controller, and drive?) Seems to take a while(relatively speaking) to complete. + { + PSX_WARNING("[CDC] Soft Reset"); + SoftReset(); + } + + if(V & 0x40) // Does it clear more than arguments buffer? Doesn't appear to clear results buffer. + { + ArgsWP = ArgsRP = 0; + } + break; + + case 0x07: + Pending_DecodeVolume[0][0] = V; + break; + + case 0x08: + Pending_DecodeVolume[0][1] = V; + break; + + case 0x09: + Pending_DecodeVolume[1][1] = V; + break; + + case 0x0A: + Pending_DecodeVolume[1][0] = V; + break; + + case 0x0B: + if(V & 0x20) + { + memcpy(DecodeVolume, Pending_DecodeVolume, sizeof(DecodeVolume)); + + for(int i = 0; i < 2; i++) + { + for(int o = 0; o < 2; o++) + { + //fprintf(stderr, "Input Channel %d, Output Channel %d -- Volume=%d\n", i, o, DecodeVolume[i][o]); + } + } + } + break; + } + PSX_SetEventNT(PSX_EVENT_CDC, timestamp + CalcNextEvent()); + } +} + +uint8 PS_CDC::Read(const pscpu_timestamp_t timestamp, uint32 A) +{ + uint8 ret = 0; + + A &= 0x03; + + //printf("Read %08x\n", A); + + if(A == 0x00) + { + ret = RegSelector & 0x3; + + if(ArgsWP == ArgsRP) + ret |= 0x08; // Args FIFO empty. + + if(!((ArgsWP - ArgsRP) & 0x10)) + ret |= 0x10; // Args FIFO has room. + + if(ResultsIn) + ret |= 0x20; + + if(DMABuffer.CanRead()) + ret |= 0x40; + + if(PendingCommandCounter > 0 && PendingCommandPhase <= 1) + ret |= 0x80; + } + else + { + switch(A & 0x3) + { + case 0x01: + ret = ReadResult(); + break; + + case 0x02: + //PSX_WARNING("[CDC] DMA Buffer manual read"); + if(DMABuffer.CanRead()) + ret = DMABuffer.ReadByte(); + else + { + PSX_WARNING("[CDC] CD data transfer port read, but no data present!"); + } + break; + + case 0x03: + if(RegSelector & 0x1) + { + ret = 0xE0 | IRQBuffer; + } + else + { + ret = 0xFF; + } + break; + } + } + + return(ret); +} + + +bool PS_CDC::DMACanRead(void) +{ + return(DMABuffer.CanRead()); +} + +uint32 PS_CDC::DMARead(void) +{ + uint32 data = 0; + + for(int i = 0; i < 4; i++) + { + if(DMABuffer.CanRead()) + data |= DMABuffer.ReadByte() << (i * 8); + else + { + PSX_WARNING("[CDC] DMA read buffer underflow!"); + } + } + + return(data); +} + +bool PS_CDC::CommandCheckDiscPresent(void) +{ + if(!Cur_CDIF || DiscStartupDelay > 0) + { + WriteResult(MakeStatus(true)); + WriteResult(ERRCODE_NOT_READY); + + WriteIRQ(CDCIRQ_DISC_ERROR); + + return(false); + } + + return(true); +} + +int32 PS_CDC::Command_Nop(const int arg_count, const uint8 *args) +{ + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_Setloc(const int arg_count, const uint8 *args) +{ + uint8 m, s, f; + + if((args[0] & 0x0F) > 0x09 || args[0] > 0x99 || + (args[1] & 0x0F) > 0x09 || args[1] > 0x59 || + (args[2] & 0x0F) > 0x09 || args[2] > 0x74) + { + WriteResult(MakeStatus(true)); + WriteResult(ERRCODE_BAD_ARGVAL); + WriteIRQ(CDCIRQ_DISC_ERROR); + return(0); + } + + m = BCD_to_U8(args[0]); + s = BCD_to_U8(args[1]); + f = BCD_to_U8(args[2]); + + CommandLoc = f + 75 * s + 75 * 60 * m - 150; + CommandLoc_Dirty = true; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::CalcSeekTime(int32 initial, int32 target, bool motor_on, bool paused) +{ + int32 ret = 0; + + if(!motor_on) + { + initial = 0; + ret += 33868800; + } + + ret += std::max((int64)abs(initial - target) * 33868800 * 1000 / (72 * 60 * 75) / 1000, 20000); + + if(abs(initial - target) >= 2250) + ret += (int64)33868800 * 300 / 1000; + else if(paused) + { + // The delay to restart from a Pause state is...very....WEIRD. The time it takes is related to the amount of time that has passed since the pause, and + // where on the disc the laser head is, with generally more time passed = longer to resume, except that there's a window of time where it takes a + // ridiculous amount of time when not much time has passed. + // + // What we have here will be EXTREMELY simplified. + + // + // + + //if(time_passed >= 67737) + //{ + //} + //else + { + // Take twice as long for 1x mode. + ret += 1237952 * ((Mode & MODE_SPEED) ? 1 : 2); + } + } + //else if(target < initial) + // ret += 1000000; + + ret += PSX_GetRandU32(0, 25000); + + PSX_DBG(PSX_DBG_SPARSE, "[CDC] CalcSeekTime() %d->%d = %d\n", initial, target, ret); + + return(ret); +} + +#if 0 +void PS_CDC::BeginSeek(uint32 target, int after_seek) +{ + SeekTarget = target; + StatusAfterSeek = after_seek; + + PSRCounter = CalcSeekTime(CurSector, SeekTarget, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); +} +#endif + +// Remove this function when we have better seek emulation; it's here because the Rockman complete works games(at least 2 and 4) apparently have finicky fubared CD +// access code. +void PS_CDC::PreSeekHack(int32 target) +{ + uint8 pwbuf[96]; + int max_try = 32; + + CurSector = target; // If removing/changing this, take into account how it will affect ReadN/ReadS/Play/etc command calls that interrupt a seek. + SeekRetryCounter = 128; + + // If removing this SubQ reading bit, think about how it will interact with a Read command of data(or audio :b) sectors when Mode bit0 is 1. + do + { + Cur_CDIF->ReadRawSectorPWOnly(pwbuf, target++, true); + } while(!DecodeSubQ(pwbuf) && --max_try > 0); +} + +/* + Play command with a track argument that's not a valid BCD quantity causes interesting half-buggy behavior on an actual PS1(unlike some of the other commands, + an error doesn't seem to be generated for a bad BCD argument). +*/ +int32 PS_CDC::Command_Play(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + ClearAIP(); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + Forward = Backward = false; + + if(arg_count && args[0]) + { + int track = BCD_to_U8(args[0]); + + if(track < toc.first_track) + { + PSX_WARNING("[CDC] Attempt to play track before first track."); + track = toc.first_track; + } + else if(track > toc.last_track) + { + PSX_WARNING("[CDC] Attempt to play track after last track."); + track = toc.last_track; + } + + ClearAudioBuffers(); + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + PlayTrackMatch = track; + + PSX_WARNING("[CDC] Play track: %d", track); + + SeekTarget = toc.tracks[track].lba; + PSRCounter = CalcSeekTime(CurSector, SeekTarget, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); + HeaderBufValid = false; + PreSeekHack(SeekTarget); + + ReportLastF = 0xFF; + + DriveStatus = DS_SEEKING; + StatusAfterSeek = DS_PLAYING; + } + else if(CommandLoc_Dirty || DriveStatus != DS_PLAYING) + { + ClearAudioBuffers(); + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + if(CommandLoc_Dirty) + SeekTarget = CommandLoc; + else + SeekTarget = CurSector; + + PlayTrackMatch = -1; + + PSRCounter = CalcSeekTime(CurSector, SeekTarget, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); + HeaderBufValid = false; + PreSeekHack(SeekTarget); + + ReportLastF = 0xFF; + + DriveStatus = DS_SEEKING; + StatusAfterSeek = DS_PLAYING; + } + + CommandLoc_Dirty = false; + return(0); +} + +int32 PS_CDC::Command_Forward(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + Backward = false; + Forward = true; + + return(0); +} + +int32 PS_CDC::Command_Backward(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + Backward = true; + Forward = false; + + return(0); +} + + +void PS_CDC::ReadBase(void) +{ + if(!CommandCheckDiscPresent()) + return; + + if(!IsPSXDisc) + { + WriteResult(MakeStatus(true)); + WriteResult(ERRCODE_BAD_COMMAND); + + WriteIRQ(CDCIRQ_DISC_ERROR); + return; + } + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + if(DriveStatus == DS_SEEKING_LOGICAL && SeekTarget == CommandLoc && StatusAfterSeek == DS_READING) + { + CommandLoc_Dirty = false; + return; + } + + if(CommandLoc_Dirty || DriveStatus != DS_READING) + { + // Don't flush the DMABuffer here; see CTR course selection screen. + ClearAIP(); + ClearAudioBuffers(); + SB_In = 0; + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + // TODO: separate motor start from seek phase? + + if(CommandLoc_Dirty) + SeekTarget = CommandLoc; + else + SeekTarget = CurSector; + + PSRCounter = /*903168 * 1.5 +*/ CalcSeekTime(CurSector, SeekTarget, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); + HeaderBufValid = false; + PreSeekHack(SeekTarget); + + DriveStatus = DS_SEEKING_LOGICAL; + StatusAfterSeek = DS_READING; + } + + CommandLoc_Dirty = false; +} + +int32 PS_CDC::Command_ReadN(const int arg_count, const uint8 *args) +{ + ReadBase(); + return 0; +} + +int32 PS_CDC::Command_ReadS(const int arg_count, const uint8 *args) +{ + ReadBase(); + return 0; +} + +int32 PS_CDC::Command_Stop(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + if(DriveStatus == DS_STOPPED) + { + return(5000); + } + else + { + ClearAudioBuffers(); + ClearAIP(); + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + DriveStatus = DS_STOPPED; + HeaderBufValid = false; + + return(33868); // FIXME, should be much higher. + } +} + +int32 PS_CDC::Command_Stop_Part2(void) +{ + PSRCounter = 0; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_COMPLETE); + + return(0); +} + +int32 PS_CDC::Command_Standby(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + if(DriveStatus != DS_STOPPED) + { + WriteResult(MakeStatus(true)); + WriteResult(0x20); + WriteIRQ(CDCIRQ_DISC_ERROR); + return(0); + } + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + ClearAudioBuffers(); + ClearAIP(); + SectorPipe_Pos = SectorPipe_In = 0; + SectorsRead = 0; + + DriveStatus = DS_STANDBY; + + return((int64)33868800 * 100 / 1000); // No idea, FIXME. +} + +int32 PS_CDC::Command_Standby_Part2(void) +{ + PSRCounter = 0; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_COMPLETE); + + return(0); +} + +int32 PS_CDC::Command_Pause(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + if(DriveStatus == DS_PAUSED || DriveStatus == DS_STOPPED) + { + return(5000); + } + else + { + CurSector -= std::min(4, SectorsRead); // See: Bedlam, Rise 2 + SectorsRead = 0; + + // "Viewpoint" flips out and crashes if reading isn't stopped (almost?) immediately. + //ClearAudioBuffers(); + SectorPipe_Pos = SectorPipe_In = 0; + ClearAIP(); + DriveStatus = DS_PAUSED; + + // An approximation. + return((1124584 + ((int64)CurSector * 42596 / (75 * 60))) * ((Mode & MODE_SPEED) ? 1 : 2)); + } +} + +int32 PS_CDC::Command_Pause_Part2(void) +{ + PSRCounter = 0; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_COMPLETE); + + return(0); +} + +int32 PS_CDC::Command_Reset(const int arg_count, const uint8 *args) +{ + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + if(DriveStatus != DS_RESETTING) + { + HeaderBufValid = false; + DriveStatus = DS_RESETTING; + PSRCounter = 1136000; + } + + return(0); +} + +int32 PS_CDC::Command_Mute(const int arg_count, const uint8 *args) +{ + Muted = true; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_Demute(const int arg_count, const uint8 *args) +{ + Muted = false; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_Setfilter(const int arg_count, const uint8 *args) +{ + FilterFile = args[0]; + FilterChan = args[1]; + + //PSX_WARNING("[CDC] Setfilter: %02x %02x", args[0], args[1]); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_Setmode(const int arg_count, const uint8 *args) +{ + Mode = args[0]; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_Getparam(const int arg_count, const uint8 *args) +{ + WriteResult(MakeStatus()); + WriteResult(Mode); + WriteResult(0x00); + WriteResult(FilterFile); + WriteResult(FilterChan); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + + return(0); +} + +int32 PS_CDC::Command_GetlocL(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + if(!HeaderBufValid) + { + WriteResult(MakeStatus(true)); + WriteResult(0x80); + WriteIRQ(CDCIRQ_DISC_ERROR); + return(0); + } + + for(unsigned i = 0; i < 8; i++) + { + //printf("%d %d: %02x\n", DriveStatus, i, HeaderBuf[i]); + WriteResult(HeaderBuf[i]); + } + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_GetlocP(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + //printf("%2x:%2x %2x:%2x:%2x %2x:%2x:%2x\n", SubQBuf_Safe[0x1], SubQBuf_Safe[0x2], SubQBuf_Safe[0x3], SubQBuf_Safe[0x4], SubQBuf_Safe[0x5], SubQBuf_Safe[0x7], SubQBuf_Safe[0x8], SubQBuf_Safe[0x9]); + + WriteResult(SubQBuf_Safe[0x1]); // Track + WriteResult(SubQBuf_Safe[0x2]); // Index + WriteResult(SubQBuf_Safe[0x3]); // R M + WriteResult(SubQBuf_Safe[0x4]); // R S + WriteResult(SubQBuf_Safe[0x5]); // R F + WriteResult(SubQBuf_Safe[0x7]); // A M + WriteResult(SubQBuf_Safe[0x8]); // A S + WriteResult(SubQBuf_Safe[0x9]); // A F + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_ReadT(const int arg_count, const uint8 *args) +{ + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(44100 * 768 / 1000); +} + +int32 PS_CDC::Command_ReadT_Part2(void) +{ + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_COMPLETE); + + return(0); +} + +int32 PS_CDC::Command_GetTN(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteResult(U8_to_BCD(toc.first_track)); + WriteResult(U8_to_BCD(toc.last_track)); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_GetTD(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + int track; + uint8 m, s, f; + + if(!args[0]) + track = 100; + else + { + track = BCD_to_U8(args[0]); + + if(!BCD_is_valid(args[0]) || track < toc.first_track || track > toc.last_track) // Error + { + WriteResult(MakeStatus(true)); + WriteResult(ERRCODE_BAD_ARGVAL); + WriteIRQ(CDCIRQ_DISC_ERROR); + return(0); + } + } + + LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); + + WriteResult(MakeStatus()); + WriteResult(U8_to_BCD(m)); + WriteResult(U8_to_BCD(s)); + //WriteResult(U8_to_BCD(f)); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(0); +} + +int32 PS_CDC::Command_SeekL(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + SeekTarget = CommandLoc; + + PSRCounter = (33868800 / (75 * ((Mode & MODE_SPEED) ? 2 : 1))) + CalcSeekTime(CurSector, SeekTarget, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); + HeaderBufValid = false; + PreSeekHack(SeekTarget); + DriveStatus = DS_SEEKING_LOGICAL; + StatusAfterSeek = DS_STANDBY; + ClearAIP(); + + return(PSRCounter); +} + +int32 PS_CDC::Command_SeekP(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + SeekTarget = CommandLoc; + + PSRCounter = CalcSeekTime(CurSector, SeekTarget, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); + HeaderBufValid = false; + PreSeekHack(SeekTarget); + DriveStatus = DS_SEEKING; + StatusAfterSeek = DS_STANDBY; + ClearAIP(); + + return(PSRCounter); +} + +int32 PS_CDC::Command_Seek_PartN(void) +{ + if(DriveStatus == DS_STANDBY) + { + BeginResults(); + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_COMPLETE); + + return(0); + } + else + { + return(std::max(PSRCounter, 256)); + } +} + +int32 PS_CDC::Command_Test(const int arg_count, const uint8 *args) +{ + //PSX_WARNING("[CDC] Test command sub-operation: 0x%02x", args[0]); + + switch(args[0]) + { + default: + PSX_WARNING("[CDC] Unknown Test command sub-operation: 0x%02x", args[0]); + WriteResult(MakeStatus(true)); + WriteResult(0x10); + WriteIRQ(CDCIRQ_DISC_ERROR); + break; + + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + PSX_WARNING("[CDC] Unknown Test command sub-operation: 0x%02x", args[0]); + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + break; + +#if 0 + case 0x50: // *Need to retest this test command, it takes additional arguments??? Or in any case, it generates a different error code(0x20) than most other Test + // sub-commands that generate an error code(0x10). + break; + + // Same with 0x60, 0x71-0x76 + +#endif + + case 0x51: // *Need to retest this test command + PSX_WARNING("[CDC] Unknown Test command sub-operation: 0x%02x", args[0]); + WriteResult(0x01); + WriteResult(0x00); + WriteResult(0x00); + break; + + case 0x75: // *Need to retest this test command + PSX_WARNING("[CDC] Unknown Test command sub-operation: 0x%02x", args[0]); + WriteResult(0x00); + WriteResult(0xC0); + WriteResult(0x00); + WriteResult(0x00); + break; + + // + // SCEx counters not reset by command 0x0A. + // + + case 0x04: // Reset SCEx counters + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + break; + + case 0x05: // Read SCEx counters + WriteResult(0x00); // Number of TOC/leadin reads? (apparently increases by 1 or 2 per ReadTOC, even on non-PSX music CD) + WriteResult(0x00); // Number of SCEx strings received? (Stays at zero on music CD) + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + break; + + case 0x20: + { + WriteResult(0x97); + WriteResult(0x01); + WriteResult(0x10); + WriteResult(0xC2); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + } + break; + + case 0x21: // *Need to retest this test command. + { + WriteResult(0x01); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + } + break; + + case 0x22: + { + static const uint8 td[7] = { 0x66, 0x6f, 0x72, 0x20, 0x55, 0x2f, 0x43 }; + + for(unsigned i = 0; i < 7; i++) + WriteResult(td[i]); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + } + break; + + case 0x23: + case 0x24: + { + static const uint8 td[8] = { 0x43, 0x58, 0x44, 0x32, 0x35, 0x34, 0x35, 0x51 }; + + for(unsigned i = 0; i < 8; i++) + WriteResult(td[i]); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + } + break; + + case 0x25: + { + static const uint8 td[8] = { 0x43, 0x58, 0x44, 0x31, 0x38, 0x31, 0x35, 0x51 }; + + for(unsigned i = 0; i < 8; i++) + WriteResult(td[i]); + + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + } + break; + } + return(0); +} + +int32 PS_CDC::Command_ID(const int arg_count, const uint8 *args) +{ + if(!CommandCheckDiscPresent()) + return(0); + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + return(33868); +} + +int32 PS_CDC::Command_ID_Part2(void) +{ + if(IsPSXDisc) + { + WriteResult(MakeStatus()); + WriteResult(0x00); + WriteResult(0x20); + WriteResult(0x00); + } + else + { + WriteResult(MakeStatus() | 0x08); + WriteResult(0x90); + WriteResult(toc.disc_type); + WriteResult(0x00); + } + + if(IsPSXDisc) + { + WriteResult(DiscID[0]); + WriteResult(DiscID[1]); + WriteResult(DiscID[2]); + WriteResult(DiscID[3]); + } + else + { + WriteResult(0xff); + WriteResult(0); + WriteResult(0); + WriteResult(0); + } + + if(IsPSXDisc) + WriteIRQ(CDCIRQ_COMPLETE); + else + WriteIRQ(CDCIRQ_DISC_ERROR); + + return(0); +} + +int32 PS_CDC::Command_Init(const int arg_count, const uint8 *args) +{ + return(0); +} + +int32 PS_CDC::Command_ReadTOC(const int arg_count, const uint8 *args) +{ + int32 ret_time; + + HeaderBufValid = false; + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + + // ReadTOC doesn't error out if the tray is open, and it completes rather quickly in that case. + // + if(!CommandCheckDiscPresent()) + return(26000); + + + + // A gross approximation. + // The penalty for the drive being stopped seems to be rather high(higher than what CalcSeekTime() currently introduces), although + // that should be investigated further. + // + // ...and not to mention the time taken varies from disc to disc even! + ret_time = 30000000 + CalcSeekTime(CurSector, 0, DriveStatus != DS_STOPPED, DriveStatus == DS_PAUSED); + + DriveStatus = DS_PAUSED; // Ends up in a pause state when the command is finished. Maybe we should add DS_READTOC or something... + ClearAIP(); + + return ret_time; +} + +int32 PS_CDC::Command_ReadTOC_Part2(void) +{ + //if(!CommandCheckDiscPresent()) + // DriveStatus = DS_PAUSED; + + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_COMPLETE); + + return(0); +} + +int32 PS_CDC::Command_0x1d(const int arg_count, const uint8 *args) +{ + WriteResult(MakeStatus()); + WriteIRQ(CDCIRQ_ACKNOWLEDGE); + return(0); +} + +PS_CDC::CDC_CTEntry PS_CDC::Commands[0x20] = +{ + { /* 0x00, */ 0, 0, NULL, NULL, NULL }, + { /* 0x01, */ 0, 0, "Nop", &PS_CDC::Command_Nop, NULL }, + { /* 0x02, */ 3, 3, "Setloc", &PS_CDC::Command_Setloc, NULL }, + { /* 0x03, */ 0, 1, "Play", &PS_CDC::Command_Play, NULL }, + { /* 0x04, */ 0, 0, "Forward", &PS_CDC::Command_Forward, NULL }, + { /* 0x05, */ 0, 0, "Backward", &PS_CDC::Command_Backward, NULL }, + { /* 0x06, */ 0, 0, "ReadN", &PS_CDC::Command_ReadN, NULL }, + { /* 0x07, */ 0, 0, "Standby", &PS_CDC::Command_Standby, &PS_CDC::Command_Standby_Part2 }, + { /* 0x08, */ 0, 0, "Stop", &PS_CDC::Command_Stop, &PS_CDC::Command_Stop_Part2 }, + { /* 0x09, */ 0, 0, "Pause", &PS_CDC::Command_Pause, &PS_CDC::Command_Pause_Part2 }, + { /* 0x0A, */ 0, 0, "Reset", &PS_CDC::Command_Reset, NULL }, + { /* 0x0B, */ 0, 0, "Mute", &PS_CDC::Command_Mute, NULL }, + { /* 0x0C, */ 0, 0, "Demute", &PS_CDC::Command_Demute, NULL }, + { /* 0x0D, */ 2, 2, "Setfilter", &PS_CDC::Command_Setfilter, NULL }, + { /* 0x0E, */ 1, 1, "Setmode", &PS_CDC::Command_Setmode, NULL }, + { /* 0x0F, */ 0, 0, "Getparam", &PS_CDC::Command_Getparam, NULL }, + { /* 0x10, */ 0, 0, "GetlocL", &PS_CDC::Command_GetlocL, NULL }, + { /* 0x11, */ 0, 0, "GetlocP", &PS_CDC::Command_GetlocP, NULL }, + { /* 0x12, */ 1, 1, "ReadT", &PS_CDC::Command_ReadT, &PS_CDC::Command_ReadT_Part2 }, + { /* 0x13, */ 0, 0, "GetTN", &PS_CDC::Command_GetTN, NULL }, + { /* 0x14, */ 1, 1, "GetTD", &PS_CDC::Command_GetTD, NULL }, + { /* 0x15, */ 0, 0, "SeekL", &PS_CDC::Command_SeekL, &PS_CDC::Command_Seek_PartN }, + { /* 0x16, */ 0, 0, "SeekP", &PS_CDC::Command_SeekP, &PS_CDC::Command_Seek_PartN }, + + { /* 0x17, */ 0, 0, NULL, NULL, NULL }, + { /* 0x18, */ 0, 0, NULL, NULL, NULL }, + + { /* 0x19, */ 1, 1/* ??? */, "Test", &PS_CDC::Command_Test, NULL }, + { /* 0x1A, */ 0, 0, "ID", &PS_CDC::Command_ID, &PS_CDC::Command_ID_Part2 }, + { /* 0x1B, */ 0, 0, "ReadS", &PS_CDC::Command_ReadS, NULL }, + { /* 0x1C, */ 0, 0, "Init", &PS_CDC::Command_Init, NULL }, + { /* 0x1D, */ 2, 2, "Unknown 0x1D", &PS_CDC::Command_0x1d, NULL }, + { /* 0x1E, */ 0, 0, "ReadTOC", &PS_CDC::Command_ReadTOC, &PS_CDC::Command_ReadTOC_Part2 }, + { /* 0x1F, */ 0, 0, NULL, NULL, NULL }, +}; + + +} diff --git a/Mednafen/mednafen/psx/cdc.h b/Mednafen/mednafen/psx/cdc.h new file mode 100644 index 0000000000..fb996dc053 --- /dev/null +++ b/Mednafen/mednafen/psx/cdc.h @@ -0,0 +1,277 @@ +#ifndef __MDFN_PSX_CDC_H +#define __MDFN_PSX_CDC_H + +#include +#include + +namespace MDFN_IEN_PSX +{ + +struct CD_Audio_Buffer +{ + int16 Samples[2][0x1000]; // [0][...] = l, [1][...] = r + int32 Size; + uint32 Freq; + int32 ReadPos; +}; + +class PS_CDC +{ + public: + + PS_CDC(); + ~PS_CDC(); + + void SetDisc(bool tray_open, CDIF *cdif, const char disc_id[4]); + + void Power(void); + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + void ResetTS(void); + + int32 CalcNextEvent(void); // Returns in master cycles to next event. + + pscpu_timestamp_t Update(const pscpu_timestamp_t timestamp); + + void Write(const pscpu_timestamp_t timestamp, uint32 A, uint8 V); + uint8 Read(const pscpu_timestamp_t timestamp, uint32 A); + + bool DMACanRead(void); + uint32 DMARead(void); + void SoftReset(void); + + void GetCDAudio(int32 samples[2]); + + private: + CDIF *Cur_CDIF; + bool DiscChanged; + int32 DiscStartupDelay; + + CD_Audio_Buffer AudioBuffer; + + uint8 Pending_DecodeVolume[2][2], DecodeVolume[2][2]; // [data_source][output_port] + + int16 ADPCM_ResampBuf[2][32 * 2]; + uint8 ADPCM_ResampCurPos; + uint8 ADPCM_ResampCurPhase; + + void ApplyVolume(int32 samples[2]); + void ReadAudioBuffer(int32 samples[2]); + + void ClearAudioBuffers(void); + + + // + // + // + + + uint8 RegSelector; + uint8 ArgsBuf[16]; + uint8 ArgsWP; // 5-bit(0 ... 31) + uint8 ArgsRP; // 5-bit(0 ... 31) + + uint8 ArgsReceiveLatch; + uint8 ArgsReceiveBuf[32]; + uint8 ArgsReceiveIn; + + uint8 ResultsBuffer[16]; + uint8 ResultsIn; // 5-bit(0 ... 31) + uint8 ResultsWP; // Write position, 4 bit(0 ... 15). + uint8 ResultsRP; // Read position, 4 bit(0 ... 15). + + SimpleFIFO DMABuffer; + uint8 SB[2340]; + uint32 SB_In; + + enum { SectorPipe_Count = 2 }; + uint8 SectorPipe[SectorPipe_Count][2352]; + uint8 SectorPipe_Pos; + uint8 SectorPipe_In; + + uint8 SubQBuf[0xC]; + uint8 SubQBuf_Safe[0xC]; + bool SubQChecksumOK; + + bool HeaderBufValid; + uint8 HeaderBuf[12]; + + void RecalcIRQ(void); + enum + { + CDCIRQ_NONE = 0, + CDCIRQ_DATA_READY = 1, + CDCIRQ_COMPLETE = 2, + CDCIRQ_ACKNOWLEDGE = 3, + CDCIRQ_DATA_END = 4, + CDCIRQ_DISC_ERROR = 5 + }; + + // Names are just guessed for these based on what conditions cause them: + enum + { + ERRCODE_BAD_ARGVAL = 0x10, + ERRCODE_BAD_NUMARGS = 0x20, + ERRCODE_BAD_COMMAND = 0x40, + ERRCODE_NOT_READY = 0x80, // 0x80 (happens with getlocl when drive isn't reading, pause when tray is open, and MAYBE when trying to run an async + // command while another async command is currently in its asynch phase being executed[pause when in readtoc, todo test more]) + }; + + uint8 IRQBuffer; + uint8 IRQOutTestMask; + int32 CDCReadyReceiveCounter; // IRQBuffer being non-zero prevents new results and new IRQ from coming in and erasing the current results, + // but apparently at least one CONFOUNDED game is clearing the IRQ state BEFORE reading the results, so we need to have a delay + // between IRQBuffer being cleared to when we allow new results to come in. (The real thing should be like this too, + // but the mechanism is probably more nuanced and complex and ugly and I like anchovy pizza) + + void BeginResults(void); + void WriteIRQ(uint8); + void WriteResult(uint8); + uint8 ReadResult(void); + + uint8 FilterFile; + uint8 FilterChan; + + + uint8 PendingCommand; + int PendingCommandPhase; + int32 PendingCommandCounter; + + int32 SPUCounter; + + enum { MODE_SPEED = 0x80 }; + enum { MODE_STRSND = 0x40 }; + enum { MODE_SIZE = 0x20 }; + enum { MODE_SIZE2 = 0x10 }; + enum { MODE_SF = 0x08 }; + enum { MODE_REPORT = 0x04 }; + enum { MODE_AUTOPAUSE = 0x02 }; + enum { MODE_CDDA = 0x01 }; + uint8 Mode; + + enum + { + DS_STANDBY = -2, + DS_PAUSED = -1, + DS_STOPPED = 0, + DS_SEEKING, + DS_SEEKING_LOGICAL, + DS_PLAY_SEEKING, + DS_PLAYING, + DS_READING, + DS_RESETTING + }; + int DriveStatus; + int StatusAfterSeek; + bool Forward; + bool Backward; + bool Muted; + + int32 PlayTrackMatch; + + int32 PSRCounter; + + int32 CurSector; + uint32 SectorsRead; // Reset to 0 on Read*/Play command start; used in the rough simulation of PS1 SetLoc->Read->Pause->Read behavior. + + unsigned AsyncIRQPending; + uint8 AsyncResultsPending[16]; + uint8 AsyncResultsPendingCount; + + int32 CalcSeekTime(int32 initial, int32 target, bool motor_on, bool paused); + + void ClearAIP(void); + void CheckAIP(void); + void SetAIP(unsigned irq, unsigned result_count, uint8 *r); + void SetAIP(unsigned irq, uint8 result0); + void SetAIP(unsigned irq, uint8 result0, uint8 result1); + + int32 SeekTarget; + uint32 SeekRetryCounter; + + pscpu_timestamp_t lastts; + + CDUtility::TOC toc; + bool IsPSXDisc; + uint8 DiscID[4]; + + int32 CommandLoc; + bool CommandLoc_Dirty; + + uint8 MakeStatus(bool cmd_error = false); + bool DecodeSubQ(uint8 *subpw); + bool CommandCheckDiscPresent(void); + void DMForceStop(); + + void EnbufferizeCDDASector(const uint8 *buf); + bool XA_Test(const uint8 *sdata); + void XA_ProcessSector(const uint8 *sdata, CD_Audio_Buffer *ab); + int16 xa_previous[2][2]; + bool xa_cur_set; + uint8 xa_cur_file; + uint8 xa_cur_chan; + + uint8 ReportLastF; + + void HandlePlayRead(void); + + struct CDC_CTEntry + { + uint8 args_min; + uint8 args_max; + const char *name; + int32 (PS_CDC::*func)(const int arg_count, const uint8 *args); + int32 (PS_CDC::*func2)(void); + }; + + void PreSeekHack(int32 target); + void ReadBase(void); + + static CDC_CTEntry Commands[0x20]; + + int32 Command_Nop(const int arg_count, const uint8 *args); + int32 Command_Setloc(const int arg_count, const uint8 *args); + int32 Command_Play(const int arg_count, const uint8 *args); + int32 Command_Forward(const int arg_count, const uint8 *args); + int32 Command_Backward(const int arg_count, const uint8 *args); + int32 Command_ReadN(const int arg_count, const uint8 *args); + int32 Command_Standby(const int arg_count, const uint8 *args); + int32 Command_Standby_Part2(void); + int32 Command_Stop(const int arg_count, const uint8 *args); + int32 Command_Stop_Part2(void); + int32 Command_Pause(const int arg_count, const uint8 *args); + int32 Command_Pause_Part2(void); + int32 Command_Reset(const int arg_count, const uint8 *args); + int32 Command_Mute(const int arg_count, const uint8 *args); + int32 Command_Demute(const int arg_count, const uint8 *args); + int32 Command_Setfilter(const int arg_count, const uint8 *args); + int32 Command_Setmode(const int arg_count, const uint8 *args); + int32 Command_Getparam(const int arg_count, const uint8 *args); + int32 Command_GetlocL(const int arg_count, const uint8 *args); + int32 Command_GetlocP(const int arg_count, const uint8 *args); + + int32 Command_ReadT(const int arg_count, const uint8 *args); + int32 Command_ReadT_Part2(void); + + int32 Command_GetTN(const int arg_count, const uint8 *args); + int32 Command_GetTD(const int arg_count, const uint8 *args); + int32 Command_SeekL(const int arg_count, const uint8 *args); + int32 Command_SeekP(const int arg_count, const uint8 *args); + int32 Command_Seek_PartN(void); + + int32 Command_Test(const int arg_count, const uint8 *args); + + int32 Command_ID(const int arg_count, const uint8 *args); + int32 Command_ID_Part2(void); + + int32 Command_ReadS(const int arg_count, const uint8 *args); + int32 Command_Init(const int arg_count, const uint8 *args); + + int32 Command_ReadTOC(const int arg_count, const uint8 *args); + int32 Command_ReadTOC_Part2(void); + + int32 Command_0x1d(const int arg_count, const uint8 *args); +}; + +} + +#endif diff --git a/Mednafen/mednafen/psx/cpu.cpp b/Mednafen/mednafen/psx/cpu.cpp new file mode 100644 index 0000000000..c7a3507ca4 --- /dev/null +++ b/Mednafen/mednafen/psx/cpu.cpp @@ -0,0 +1,2749 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "cpu.h" + +#if 0 + #define EXP_ILL_CHECK(n) {n;} +#else + #define EXP_ILL_CHECK(n) {} +#endif + +/* TODO + Make sure load delays are correct. + + Consider preventing IRQs being taken while in a branch delay slot, to prevent potential problems with games that like to be too clever and perform + un-restartable sequences of instructions. +*/ + +#define BIU_ENABLE_ICACHE_S1 0x00000800 // Enable I-cache, set 1 +#define BIU_ENABLE_DCACHE 0x00000080 // Enable D-cache +#define BIU_TAG_TEST_MODE 0x00000004 // Enable TAG test mode(IsC must be set to 1 as well presumably?) +#define BIU_INVALIDATE_MODE 0x00000002 // Enable Invalidate mode(IsC must be set to 1 as well presumably?) +#define BIU_LOCK 0x00000001 // Enable Lock mode(IsC must be set to 1 as well presumably?) + // Does lock mode prevent the actual data payload from being modified, while allowing tags to be modified/updated??? + +namespace MDFN_IEN_PSX +{ + + +PS_CPU::PS_CPU() +{ + Halted = false; + + memset(FastMap, 0, sizeof(FastMap)); + memset(DummyPage, 0xFF, sizeof(DummyPage)); // 0xFF to trigger an illegal instruction exception, so we'll know what's up when debugging. + + for(uint64 a = 0x00000000; a < (1ULL << 32); a += FAST_MAP_PSIZE) + SetFastMap(DummyPage, a, FAST_MAP_PSIZE); + + CPUHook = NULL; + ADDBT = NULL; + + GTE_Init(); + + for(unsigned i = 0; i < 24; i++) + { + uint8 v = 7; + + if(i < 12) + v += 4; + + if(i < 21) + v += 3; + + MULT_Tab24[i] = v; + } +} + +PS_CPU::~PS_CPU() +{ + + +} + +void PS_CPU::SetFastMap(void *region_mem, uint32 region_address, uint32 region_size) +{ + // FAST_MAP_SHIFT + // FAST_MAP_PSIZE + + for(uint64 A = region_address; A < (uint64)region_address + region_size; A += FAST_MAP_PSIZE) + { + FastMap[A >> FAST_MAP_SHIFT] = ((uint8 *)region_mem - region_address); + } +} + +INLINE void PS_CPU::RecalcIPCache(void) +{ + IPCache = 0; + + if((CP0.SR & CP0.CAUSE & 0xFF00) && (CP0.SR & 1)) + IPCache = 0x80; + + if(Halted) + IPCache = 0x80; +} + +void PS_CPU::SetHalt(bool status) +{ + Halted = status; + RecalcIPCache(); +} + +void PS_CPU::Power(void) +{ + assert(sizeof(ICache) == sizeof(ICache_Bulk)); + + memset(GPR, 0, sizeof(GPR)); + memset(&CP0, 0, sizeof(CP0)); + LO = 0; + HI = 0; + + gte_ts_done = 0; + muldiv_ts_done = 0; + + BACKED_PC = 0xBFC00000; + BACKED_new_PC = 4; + BACKED_new_PC_mask = ~0U; + + BACKED_LDWhich = 0x20; + BACKED_LDValue = 0; + LDAbsorb = 0; + memset(ReadAbsorb, 0, sizeof(ReadAbsorb)); + ReadAbsorbWhich = 0; + ReadFudge = 0; + + //WriteAbsorb = 0; + //WriteAbsorbCount = 0; + //WriteAbsorbMonkey = 0; + + CP0.SR |= (1 << 22); // BEV + CP0.SR |= (1 << 21); // TS + + CP0.PRID = 0x2; + + RecalcIPCache(); + + + BIU = 0; + + memset(ScratchRAM.data8, 0, 1024); + + // Not quite sure about these poweron/reset values: + for(unsigned i = 0; i < 1024; i++) + { + ICache[i].TV = 0x2 | ((BIU & 0x800) ? 0x0 : 0x1); + ICache[i].Data = 0; + } + + GTE_Power(); +} + +void PS_CPU::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY32(GPR, 32), + SFVAR(LO), + SFVAR(HI), + SFVAR(BACKED_PC), + SFVAR(BACKED_new_PC), + SFVAR(BACKED_new_PC_mask), + + SFVAR(IPCache), + SFVAR(Halted), + + SFVAR(BACKED_LDWhich), + SFVAR(BACKED_LDValue), + SFVAR(LDAbsorb), + + SFVAR(next_event_ts), + SFVAR(gte_ts_done), + SFVAR(muldiv_ts_done), + + SFVAR(BIU), + SFARRAY32(ICache_Bulk, 2048), + + SFARRAY32(CP0.Regs, 32), + + SFARRAY(ReadAbsorb, 0x20), + SFVARN(ReadAbsorb[0x20], "ReadAbsorbDummy"), + SFVAR(ReadAbsorbWhich), + SFVAR(ReadFudge), + + SFARRAY(ScratchRAM.data8, 1024), + + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CPU"); + + GTE_StateAction(sm, load, data_only); + + if(load) + { + + } +} + +void PS_CPU::AssertIRQ(unsigned which, bool asserted) +{ + assert(which <= 5); + + CP0.CAUSE &= ~(1 << (10 + which)); + + if(asserted) + CP0.CAUSE |= 1 << (10 + which); + + RecalcIPCache(); +} + +void PS_CPU::SetBIU(uint32 val) +{ + const uint32 old_BIU = BIU; + + BIU = val & ~(0x440); + + if((BIU ^ old_BIU) & 0x800) + { + if(BIU & 0x800) // ICache enabled + { + for(unsigned i = 0; i < 1024; i++) + ICache[i].TV &= ~0x1; + } + else // ICache disabled + { + for(unsigned i = 0; i < 1024; i++) + ICache[i].TV |= 0x1; + } + } + + PSX_DBG(PSX_DBG_SPARSE, "[CPU] Set BIU=0x%08x\n", BIU); +} + +uint32 PS_CPU::GetBIU(void) +{ + return BIU; +} + +static const uint32 addr_mask[8] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + 0x7FFFFFFF, 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + +template +INLINE T PS_CPU::PeekMemory(uint32 address) +{ + T ret; + address &= addr_mask[address >> 29]; + + if(address >= 0x1F800000 && address <= 0x1F8003FF) + return ScratchRAM.Read(address & 0x3FF); + + //assert(!(CP0.SR & 0x10000)); + + if(sizeof(T) == 1) + ret = PSX_MemPeek8(address); + else if(sizeof(T) == 2) + ret = PSX_MemPeek16(address); + else + ret = PSX_MemPeek32(address); + + return(ret); +} + +template +void PS_CPU::PokeMemory(uint32 address, T value) +{ + address &= addr_mask[address >> 29]; + + if(address >= 0x1F800000 && address <= 0x1F8003FF) + return ScratchRAM.Write(address & 0x3FF, value); + + if(sizeof(T) == 1) + PSX_MemPoke8(address, value); + else if(sizeof(T) == 2) + PSX_MemPoke16(address, value); + else + PSX_MemPoke32(address, value); +} + +template +INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool DS24, bool LWC_timing) +{ + T ret; + + //WriteAbsorb >>= WriteAbsorbMonkey * 8; + //WriteAbsorbCount -= WriteAbsorbMonkey; + //WriteAbsorbMonkey = WriteAbsorbCount; + + ReadAbsorb[ReadAbsorbWhich] = 0; + ReadAbsorbWhich = 0; + + address &= addr_mask[address >> 29]; + + if(address >= 0x1F800000 && address <= 0x1F8003FF) + { + LDAbsorb = 0; + + if(DS24) + return ScratchRAM.ReadU24(address & 0x3FF); + else + return ScratchRAM.Read(address & 0x3FF); + } + + timestamp += (ReadFudge >> 4) & 2; + + //assert(!(CP0.SR & 0x10000)); + + pscpu_timestamp_t lts = timestamp; + + if(sizeof(T) == 1) + ret = PSX_MemRead8(lts, address); + else if(sizeof(T) == 2) + ret = PSX_MemRead16(lts, address); + else + { + if(DS24) + ret = PSX_MemRead24(lts, address) & 0xFFFFFF; + else + ret = PSX_MemRead32(lts, address); + } + + if(LWC_timing) + lts += 1; + else + lts += 2; + + LDAbsorb = (lts - timestamp); + timestamp = lts; + + return(ret); +} + +template +INLINE void PS_CPU::WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24) +{ + if(MDFN_LIKELY(!(CP0.SR & 0x10000))) + { + address &= addr_mask[address >> 29]; + + if(address >= 0x1F800000 && address <= 0x1F8003FF) + { + if(DS24) + ScratchRAM.WriteU24(address & 0x3FF, value); + else + ScratchRAM.Write(address & 0x3FF, value); + + return; + } + + //if(WriteAbsorbCount == 4) + //{ + // WriteAbsorb >>= 8; + // WriteAbsorbCount--; + // + // if(WriteAbsorbMonkey) + // WriteAbsorbMonkey--; + //} + //timestamp += 3; + //WriteAbsorb |= (3U << (WriteAbsorbCount * 8)); + //WriteAbsorbCount++; + + if(sizeof(T) == 1) + PSX_MemWrite8(timestamp, address, value); + else if(sizeof(T) == 2) + PSX_MemWrite16(timestamp, address, value); + else + { + if(DS24) + PSX_MemWrite24(timestamp, address, value); + else + PSX_MemWrite32(timestamp, address, value); + } + } + else + { + if(BIU & 0x800) // Instruction cache is enabled/active + { + if(BIU & 0x4) // TAG test mode. + { + // TODO: Respect written value. + __ICache *ICI = &ICache[((address & 0xFF0) >> 2)]; + const uint8 valid_bits = 0x00; + + ICI[0].TV = ((valid_bits & 0x01) ? 0x00 : 0x02) | ((BIU & 0x800) ? 0x0 : 0x1); + ICI[1].TV = ((valid_bits & 0x02) ? 0x00 : 0x02) | ((BIU & 0x800) ? 0x0 : 0x1); + ICI[2].TV = ((valid_bits & 0x04) ? 0x00 : 0x02) | ((BIU & 0x800) ? 0x0 : 0x1); + ICI[3].TV = ((valid_bits & 0x08) ? 0x00 : 0x02) | ((BIU & 0x800) ? 0x0 : 0x1); + } + else if(!(BIU & 0x1)) + { + ICache[(address & 0xFFC) >> 2].Data = value << ((address & 0x3) * 8); + } + } + + if((BIU & 0x081) == 0x080) // Writes to the scratchpad(TODO test) + { + if(DS24) + ScratchRAM.WriteU24(address & 0x3FF, value); + else + ScratchRAM.Write(address & 0x3FF, value); + } + //printf("IsC WRITE%d 0x%08x 0x%08x -- CP0.SR=0x%08x\n", (int)sizeof(T), address, value, CP0.SR); + } +} + +uint32 NO_INLINE PS_CPU::Exception(uint32 code, uint32 PC, const uint32 NP, const uint32 NPM, const uint32 instr) +{ + const bool AfterBranchInstr = !(NPM & 0x1); + const bool BranchTaken = !(NPM & 0x3); + uint32 handler = 0x80000080; + + assert(code < 16); + + if(code != EXCEPTION_INT && code != EXCEPTION_BP && code != EXCEPTION_SYSCALL) + { + static const char* exmne[16] = + { + "INT", "MOD", "TLBL", "TLBS", "ADEL", "ADES", "IBE", "DBE", "SYSCALL", "BP", "RI", "COPU", "OV", NULL, NULL, NULL + }; + + PSX_DBG(PSX_DBG_WARNING, "[CPU] Exception %s(0x%02x) @ PC=0x%08x(NP=0x%08x, NPM=0x%08x), Instr=0x%08x, IPCache=0x%02x, CAUSE=0x%08x, SR=0x%08x, IRQC_Status=0x%04x, IRQC_Mask=0x%04x\n", + exmne[code], code, PC, NP, NPM, instr, IPCache, CP0.CAUSE, CP0.SR, IRQ_GetRegister(IRQ_GSREG_STATUS, NULL, 0), IRQ_GetRegister(IRQ_GSREG_MASK, NULL, 0)); + } + + if(CP0.SR & (1 << 22)) // BEV + handler = 0xBFC00180; + + CP0.EPC = PC; + if(AfterBranchInstr) + { + CP0.EPC -= 4; + CP0.TAR = (PC & (NPM | 3)) + NP; + } + + if(ADDBT) + ADDBT(PC, handler, true); + + // "Push" IEc and KUc(so that the new IEc and KUc are 0) + CP0.SR = (CP0.SR & ~0x3F) | ((CP0.SR << 2) & 0x3F); + + // Setup cause register + CP0.CAUSE &= 0x0000FF00; + CP0.CAUSE |= code << 2; + + // If EPC was adjusted -= 4 because we are after a branch instruction, set bit 31. + CP0.CAUSE |= AfterBranchInstr << 31; + CP0.CAUSE |= BranchTaken << 30; + CP0.CAUSE |= (instr << 2) & (0x3 << 28); // CE + + RecalcIPCache(); + + return(handler); +} + +#define BACKING_TO_ACTIVE \ + PC = BACKED_PC; \ + new_PC = BACKED_new_PC; \ + new_PC_mask = BACKED_new_PC_mask; \ + LDWhich = BACKED_LDWhich; \ + LDValue = BACKED_LDValue; + +#define ACTIVE_TO_BACKING \ + BACKED_PC = PC; \ + BACKED_new_PC = new_PC; \ + BACKED_new_PC_mask = new_PC_mask; \ + BACKED_LDWhich = LDWhich; \ + BACKED_LDValue = LDValue; + +// +// Should come before DO_LDS() so the EXP_ILL_CHECK() emulator debugging macro in GPR_DEP() will work properly. +// +#define GPR_DEPRES_BEGIN { uint8 back = ReadAbsorb[0]; +#define GPR_DEP(n) { unsigned tn = (n); ReadAbsorb[tn] = 0; EXP_ILL_CHECK(if(LDWhich > 0 && LDWhich < 0x20 && LDWhich == tn) { PSX_DBG(PSX_DBG_WARNING, "[CPU] Instruction at PC=0x%08x in load delay slot has dependency on load target register(0x%02x): SR=0x%08x\n", PC, LDWhich, CP0.SR); }) } +#define GPR_RES(n) { unsigned tn = (n); ReadAbsorb[tn] = 0; } +#define GPR_DEPRES_END ReadAbsorb[0] = back; } + +template +pscpu_timestamp_t PS_CPU::RunReal(pscpu_timestamp_t timestamp_in) +{ + register pscpu_timestamp_t timestamp = timestamp_in; + + register uint32 PC; + register uint32 new_PC; + register uint32 new_PC_mask; + register uint32 LDWhich; + register uint32 LDValue; + + //printf("%d %d\n", gte_ts_done, muldiv_ts_done); + + gte_ts_done += timestamp; + muldiv_ts_done += timestamp; + + BACKING_TO_ACTIVE; + + do + { + //printf("Running: %d %d\n", timestamp, next_event_ts); + while(MDFN_LIKELY(timestamp < next_event_ts)) + { + uint32 instr; + uint32 opf; + + // Zero must be zero...until the Master Plan is enacted. + GPR[0] = 0; + + if(DebugMode && CPUHook) + { + ACTIVE_TO_BACKING; + + // For save states in step mode. + gte_ts_done -= timestamp; + muldiv_ts_done -= timestamp; + + CPUHook(timestamp, PC); + + // For save states in step mode. + gte_ts_done += timestamp; + muldiv_ts_done += timestamp; + + BACKING_TO_ACTIVE; + } + + if(BIOSPrintMode) + { + if(PC == 0xB0) + { + if(MDFN_UNLIKELY(GPR[9] == 0x3D)) + { + PSX_DBG_BIOS_PUTC(GPR[4]); + } + } + } + + // We can't fold this into the ICache[] != PC handling, since the lower 2 bits of TV + // are already used for cache management purposes and it assumes that the lower 2 bits of PC will be 0. + if(MDFN_UNLIKELY(PC & 0x3)) + { + // This will block interrupt processing, but since we're going more for keeping broken homebrew/hacks from working + // than super-duper-accurate pipeline emulation, it shouldn't be a problem. + CP0.BADVA = PC; + new_PC = Exception(EXCEPTION_ADEL, PC, new_PC, new_PC_mask, 0); + new_PC_mask = 0; + goto OpDone; + } + + instr = ICache[(PC & 0xFFC) >> 2].Data; + + if(ICache[(PC & 0xFFC) >> 2].TV != PC) + { + //WriteAbsorb = 0; + //WriteAbsorbCount = 0; + //WriteAbsorbMonkey = 0; + ReadAbsorb[ReadAbsorbWhich] = 0; + ReadAbsorbWhich = 0; + + // FIXME: Handle executing out of scratchpad. + if(PC >= 0xA0000000 || !(BIU & 0x800)) + { + instr = MDFN_de32lsb(&FastMap[PC >> FAST_MAP_SHIFT][PC]); + timestamp += 4; // Approximate best-case cache-disabled time, per PS1 tests(executing out of 0xA0000000+); it can be 5 in *some* sequences of code(like a lot of sequential "nop"s, probably other simple instructions too). + } + else + { + __ICache *ICI = &ICache[((PC & 0xFF0) >> 2)]; + const uint8 *FMP = &FastMap[(PC &~ 0xF) >> FAST_MAP_SHIFT][PC &~ 0xF]; + + // | 0x2 to simulate (in)validity bits. + ICI[0x00].TV = (PC &~ 0xF) | 0x00 | 0x2; + ICI[0x01].TV = (PC &~ 0xF) | 0x04 | 0x2; + ICI[0x02].TV = (PC &~ 0xF) | 0x08 | 0x2; + ICI[0x03].TV = (PC &~ 0xF) | 0x0C | 0x2; + + timestamp += 3; + + switch(PC & 0xC) + { + case 0x0: + timestamp++; + ICI[0x00].TV &= ~0x2; + ICI[0x00].Data = MDFN_de32lsb(&FMP[0x0]); + case 0x4: + timestamp++; + ICI[0x01].TV &= ~0x2; + ICI[0x01].Data = MDFN_de32lsb(&FMP[0x4]); + case 0x8: + timestamp++; + ICI[0x02].TV &= ~0x2; + ICI[0x02].Data = MDFN_de32lsb(&FMP[0x8]); + case 0xC: + timestamp++; + ICI[0x03].TV &= ~0x2; + ICI[0x03].Data = MDFN_de32lsb(&FMP[0xC]); + break; + } + instr = ICache[(PC & 0xFFC) >> 2].Data; + } + } + + //printf("PC=%08x, SP=%08x - op=0x%02x - funct=0x%02x - instr=0x%08x\n", PC, GPR[29], instr >> 26, instr & 0x3F, instr); + //for(int i = 0; i < 32; i++) + // printf("%02x : %08x\n", i, GPR[i]); + //printf("\n"); + + opf = instr & 0x3F; + + if(instr & (0x3F << 26)) + opf = 0x40 | (instr >> 26); + + opf |= IPCache; + +#if 0 + { + uint32 tmp = (ReadAbsorb[ReadAbsorbWhich] + 0x7FFFFFFF) >> 31; + ReadAbsorb[ReadAbsorbWhich] -= tmp; + timestamp = timestamp + 1 - tmp; + } +#else + if(ReadAbsorb[ReadAbsorbWhich]) + ReadAbsorb[ReadAbsorbWhich]--; + //else if((uint8)WriteAbsorb) + //{ + // WriteAbsorb--; + // if(!WriteAbsorb) + // { + // WriteAbsorbCount--; + // if(WriteAbsorbMonkey) + // WriteAbsorbMonkey--; + // WriteAbsorb >>= 8; + // } + //} + else + timestamp++; +#endif + + #define DO_LDS() { GPR[LDWhich] = LDValue; ReadAbsorb[LDWhich] = LDAbsorb; ReadFudge = LDWhich; ReadAbsorbWhich |= LDWhich & 0x1F; LDWhich = 0x20; } + #define BEGIN_OPF(name) { op_##name: + #define END_OPF goto OpDone; } + + #define DO_BRANCH(arg_cond, arg_offset, arg_mask, arg_dolink, arg_linkreg)\ + { \ + const bool cond = (arg_cond); \ + const uint32 offset = (arg_offset); \ + const uint32 mask = (arg_mask); \ + const uint32 old_PC = PC; \ + \ + EXP_ILL_CHECK(if(!(new_PC_mask & 0x03)) { PSX_DBG(PSX_DBG_WARNING, "[CPU] Branch instruction at PC=0x%08x in branch delay slot: SR=0x%08x\n", PC, CP0.SR);}) \ + \ + PC = (PC & new_PC_mask) + new_PC; \ + \ + /* Clear lower bit to signify being after a branch instruction (overloaded behavior for performance). */ \ + new_PC_mask = ~1U; \ + new_PC = 4; \ + \ + if(arg_dolink) \ + GPR[(arg_linkreg)] = PC + 4; \ + \ + if(cond) \ + { \ + if(ILHMode) \ + { \ + if(old_PC == ((PC & mask) + offset)) \ + { \ + if(MDFN_densb(&FastMap[PC >> FAST_MAP_SHIFT][PC]) == 0) \ + { \ + if(next_event_ts > timestamp) /* Necessary since next_event_ts might be set to something like "0" to force a call to the event handler. */ \ + { \ + timestamp = next_event_ts; \ + } \ + } \ + } \ + } \ + \ + /* Lower bits of new_PC_mask being clear signifies being in a branch delay slot. (overloaded behavior for performance) */ \ + new_PC = offset; \ + new_PC_mask = mask & ~3; \ + \ + if(DebugMode && ADDBT) \ + { \ + ADDBT(PC, (PC & new_PC_mask) + new_PC, false); \ + } \ + } \ + goto SkipNPCStuff; \ + } + + #define ITYPE uint32 rs MDFN_NOWARN_UNUSED = (instr >> 21) & 0x1F; uint32 rt MDFN_NOWARN_UNUSED = (instr >> 16) & 0x1F; uint32 immediate = (int32)(int16)(instr & 0xFFFF); /*printf(" rs=%02x(%08x), rt=%02x(%08x), immediate=(%08x) ", rs, GPR[rs], rt, GPR[rt], immediate);*/ + #define ITYPE_ZE uint32 rs MDFN_NOWARN_UNUSED = (instr >> 21) & 0x1F; uint32 rt MDFN_NOWARN_UNUSED = (instr >> 16) & 0x1F; uint32 immediate = instr & 0xFFFF; /*printf(" rs=%02x(%08x), rt=%02x(%08x), immediate=(%08x) ", rs, GPR[rs], rt, GPR[rt], immediate);*/ + #define JTYPE uint32 target = instr & ((1 << 26) - 1); /*printf(" target=(%08x) ", target);*/ + #define RTYPE uint32 rs MDFN_NOWARN_UNUSED = (instr >> 21) & 0x1F; uint32 rt MDFN_NOWARN_UNUSED = (instr >> 16) & 0x1F; uint32 rd MDFN_NOWARN_UNUSED = (instr >> 11) & 0x1F; uint32 shamt MDFN_NOWARN_UNUSED = (instr >> 6) & 0x1F; /*printf(" rs=%02x(%08x), rt=%02x(%08x), rd=%02x(%08x) ", rs, GPR[rs], rt, GPR[rt], rd, GPR[rd]);*/ + +#if HAVE_COMPUTED_GOTO + #define CGBEGIN static const void *const op_goto_table[256] = { + #define CGE(l) &&l, + #define CGEND }; goto *op_goto_table[opf]; +#else + /* (uint8) cast for cheaper alternative to generated branch+compare bounds check instructions, but still more + expensive than computed goto which needs no masking nor bounds checking. + */ + #define CGBEGIN { enum { CGESB = 1 + __COUNTER__ }; switch((uint8)opf) { + #define CGE(l) case __COUNTER__ - CGESB: goto l; + #define CGEND } } +#endif + + CGBEGIN + CGE(op_SLL) CGE(op_ILL) CGE(op_SRL) CGE(op_SRA) CGE(op_SLLV) CGE(op_ILL) CGE(op_SRLV) CGE(op_SRAV) + CGE(op_JR) CGE(op_JALR) CGE(op_ILL) CGE(op_ILL) CGE(op_SYSCALL) CGE(op_BREAK) CGE(op_ILL) CGE(op_ILL) + CGE(op_MFHI) CGE(op_MTHI) CGE(op_MFLO) CGE(op_MTLO) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_MULT) CGE(op_MULTU) CGE(op_DIV) CGE(op_DIVU) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_ADD) CGE(op_ADDU) CGE(op_SUB) CGE(op_SUBU) CGE(op_AND) CGE(op_OR) CGE(op_XOR) CGE(op_NOR) + CGE(op_ILL) CGE(op_ILL) CGE(op_SLT) CGE(op_SLTU) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + + CGE(op_ILL) CGE(op_BCOND) CGE(op_J) CGE(op_JAL) CGE(op_BEQ) CGE(op_BNE) CGE(op_BLEZ) CGE(op_BGTZ) + CGE(op_ADDI) CGE(op_ADDIU) CGE(op_SLTI) CGE(op_SLTIU) CGE(op_ANDI) CGE(op_ORI) CGE(op_XORI) CGE(op_LUI) + CGE(op_COP0) CGE(op_COP13) CGE(op_COP2) CGE(op_COP13) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_LB) CGE(op_LH) CGE(op_LWL) CGE(op_LW) CGE(op_LBU) CGE(op_LHU) CGE(op_LWR) CGE(op_ILL) + CGE(op_SB) CGE(op_SH) CGE(op_SWL) CGE(op_SW) CGE(op_ILL) CGE(op_ILL) CGE(op_SWR) CGE(op_ILL) + CGE(op_LWC013) CGE(op_LWC013) CGE(op_LWC2) CGE(op_LWC013) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + CGE(op_SWC013) CGE(op_SWC013) CGE(op_SWC2) CGE(op_SWC013) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) CGE(op_ILL) + + // Interrupt portion of this table is constructed so that an interrupt won't be taken when the PC is pointing to a GTE instruction, + // to avoid problems caused by pipeline vs coprocessor nuances that aren't emulated. + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + + CGE(op_ILL) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_COP2) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) CGE(op_INTERRUPT) + CGEND + + { + BEGIN_OPF(ILL); + PSX_WARNING("[CPU] Unknown instruction @%08x = %08x, op=%02x, funct=%02x", PC, instr, instr >> 26, (instr & 0x3F)); + DO_LDS(); + new_PC = Exception(EXCEPTION_RI, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + END_OPF; + + // + // ADD - Add Word + // + BEGIN_OPF(ADD); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] + GPR[rt]; + bool ep = ((~(GPR[rs] ^ GPR[rt])) & (GPR[rs] ^ result)) & 0x80000000; + + DO_LDS(); + + if(MDFN_UNLIKELY(ep)) + { + new_PC = Exception(EXCEPTION_OV, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + GPR[rd] = result; + + END_OPF; + + // + // ADDI - Add Immediate Word + // + BEGIN_OPF(ADDI); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = GPR[rs] + immediate; + bool ep = ((~(GPR[rs] ^ immediate)) & (GPR[rs] ^ result)) & 0x80000000; + + DO_LDS(); + + if(MDFN_UNLIKELY(ep)) + { + new_PC = Exception(EXCEPTION_OV, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + GPR[rt] = result; + + END_OPF; + + // + // ADDIU - Add Immediate Unsigned Word + // + BEGIN_OPF(ADDIU); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = GPR[rs] + immediate; + + DO_LDS(); + + GPR[rt] = result; + + END_OPF; + + // + // ADDU - Add Unsigned Word + // + BEGIN_OPF(ADDU); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] + GPR[rt]; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + // + // AND - And + // + BEGIN_OPF(AND); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] & GPR[rt]; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + // + // ANDI - And Immediate + // + BEGIN_OPF(ANDI); + ITYPE_ZE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = GPR[rs] & immediate; + + DO_LDS(); + + GPR[rt] = result; + + END_OPF; + + // + // BEQ - Branch on Equal + // + BEGIN_OPF(BEQ); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + const bool result = (GPR[rs] == GPR[rt]); + + DO_LDS(); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + END_OPF; + + // Bah, why does MIPS encoding have to be funky like this. :( + // Handles BGEZ, BGEZAL, BLTZ, BLTZAL + BEGIN_OPF(BCOND); + const uint32 tv = GPR[(instr >> 21) & 0x1F]; + const uint32 riv = (instr >> 16) & 0x1F; + const uint32 immediate = (int32)(int16)(instr & 0xFFFF); + const bool result = (int32)(tv ^ (riv << 31)) < 0; + const uint32 link = ((riv & 0x1E) == 0x10) ? 31 : 0; + + GPR_DEPRES_BEGIN + GPR_DEP((instr >> 21) & 0x1F); + GPR_RES(link); + GPR_DEPRES_END + + DO_LDS(); + + DO_BRANCH(result, (immediate << 2), ~0U, true, link); + END_OPF; + + + // + // BGTZ - Branch on Greater than Zero + // + BEGIN_OPF(BGTZ); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + const bool result = (int32)GPR[rs] > 0; + + DO_LDS(); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + END_OPF; + + // + // BLEZ - Branch on Less Than or Equal to Zero + // + BEGIN_OPF(BLEZ); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + const bool result = (int32)GPR[rs] <= 0; + + DO_LDS(); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + END_OPF; + + // + // BNE - Branch on Not Equal + // + BEGIN_OPF(BNE); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + const bool result = GPR[rs] != GPR[rt]; + + DO_LDS(); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + END_OPF; + + // + // BREAK - Breakpoint + // + BEGIN_OPF(BREAK); + DO_LDS(); + new_PC = Exception(EXCEPTION_BP, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + END_OPF; + + // Cop "instructions": CFCz(no CP0), COPz, CTCz(no CP0), LWCz(no CP0), MFCz, MTCz, SWCz(no CP0) + // + // COP0 instructions + // + BEGIN_OPF(COP0); + const uint32 sub_op = (instr >> 21) & 0x1F; + const uint32 rt = (instr >> 16) & 0x1F; + const uint32 rd = (instr >> 11) & 0x1F; + const uint32 val = GPR[rt]; + + switch(sub_op) + { + default: + DO_LDS(); + break; + + case 0x02: + case 0x06: + DO_LDS(); + new_PC = Exception(EXCEPTION_RI, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + break; + + case 0x00: // MFC0 - Move from Coprocessor + switch(rd) + { + case 0x00: + case 0x01: + case 0x02: + case 0x04: + case 0x0A: + DO_LDS(); + new_PC = Exception(EXCEPTION_RI, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + break; + + case 0x03: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0B: + case 0x0C: + case 0x0D: + case 0x0E: + case 0x0F: + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + LDAbsorb = 0; + LDWhich = rt; + LDValue = CP0.Regs[rd]; + break; + + default: + // Tested to be rather NOPish + DO_LDS(); + PSX_DBG(PSX_DBG_WARNING, "[CPU] MFC0 from unmapped CP0 register %u.\n", rd); + break; + } + break; + + case 0x04: // MTC0 - Move to Coprocessor + DO_LDS(); + switch(rd) + { + case 0x00: + case 0x01: + case 0x02: + case 0x04: + case 0x0A: + new_PC = Exception(EXCEPTION_RI, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + break; + + case CP0REG_BPC: + CP0.BPC = val; + break; + + case CP0REG_BDA: + CP0.BDA = val; + break; + + case CP0REG_DCIC: + if(val) + { + PSX_DBG(PSX_DBG_WARNING, "[CPU] Non-zero write to DCIC: 0x%08x\n", val); + } + CP0.DCIC = val & 0xFF80003F; + break; + + case CP0REG_BDAM: + CP0.BDAM = val; + break; + + case CP0REG_BPCM: + CP0.BPCM = val; + break; + + case CP0REG_CAUSE: + CP0.CAUSE &= ~(0x3 << 8); + CP0.CAUSE |= val & (0x3 << 8); + RecalcIPCache(); + break; + + case CP0REG_SR: + if((CP0.SR ^ val) & 0x10000) + PSX_DBG(PSX_DBG_SPARSE, "[CPU] IsC %u->%u\n", (bool)(CP0.SR & (1U << 16)), (bool)(val & (1U << 16))); + + CP0.SR = val & ~( (0x3 << 26) | (0x3 << 23) | (0x3 << 6)); + RecalcIPCache(); + break; + } + break; + + case 0x08: // BC + case 0x0C: + DO_LDS(); + { + const uint32 immediate = (int32)(int16)(instr & 0xFFFF); + const bool result = (false == (bool)(instr & (1U << 16))); + + PSX_DBG(PSX_DBG_WARNING, "[CPU] BC0x instruction(0x%08x) @ PC=0x%08x\n", instr, PC); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + } + break; + + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: + DO_LDS(); + { + const uint32 cp0_op = instr & 0x1F; // Not 0x3F + + if(MDFN_LIKELY(cp0_op == 0x10)) // RFE + { + // "Pop" + CP0.SR = (CP0.SR & ~0x0F) | ((CP0.SR >> 2) & 0x0F); + RecalcIPCache(); + } + else if(cp0_op == 0x01 || cp0_op == 0x02 || cp0_op == 0x06 || cp0_op == 0x08) // TLBR, TLBWI, TLBWR, TLBP + { + new_PC = Exception(EXCEPTION_RI, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + } + break; + } + END_OPF; + + // + // COP2 + // + BEGIN_OPF(COP2); + const uint32 sub_op = (instr >> 21) & 0x1F; + const uint32 rt = (instr >> 16) & 0x1F; + const uint32 rd = (instr >> 11) & 0x1F; + const uint32 val = GPR[rt]; + + if(MDFN_UNLIKELY(!(CP0.SR & (1U << (28 + 2))))) + { + DO_LDS(); + new_PC = Exception(EXCEPTION_COPU, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else switch(sub_op) + { + default: + DO_LDS(); + break; + + case 0x00: // MFC2 - Move from Coprocessor + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + if(timestamp < gte_ts_done) + { + LDAbsorb = gte_ts_done - timestamp; + timestamp = gte_ts_done; + } + else + LDAbsorb = 0; + + LDWhich = rt; + LDValue = GTE_ReadDR(rd); + break; + + case 0x04: // MTC2 - Move to Coprocessor + DO_LDS(); + + if(timestamp < gte_ts_done) + timestamp = gte_ts_done; + + GTE_WriteDR(rd, val); + break; + + case 0x02: // CFC2 + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + if(timestamp < gte_ts_done) + { + LDAbsorb = gte_ts_done - timestamp; + timestamp = gte_ts_done; + } + else + LDAbsorb = 0; + + LDWhich = rt; + LDValue = GTE_ReadCR(rd); + break; + + case 0x06: // CTC2 + DO_LDS(); + + if(timestamp < gte_ts_done) + timestamp = gte_ts_done; + + GTE_WriteCR(rd, val); + break; + + case 0x08: + case 0x0C: + DO_LDS(); + { + const uint32 immediate = (int32)(int16)(instr & 0xFFFF); + const bool result = (false == (bool)(instr & (1U << 16))); + + PSX_DBG(PSX_DBG_WARNING, "[CPU] BC2x instruction(0x%08x) @ PC=0x%08x\n", instr, PC); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + } + break; + + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: + DO_LDS(); + + if(timestamp < gte_ts_done) + timestamp = gte_ts_done; + gte_ts_done = timestamp + GTE_Instruction(instr); + break; + } + END_OPF; + + // + // COP1, COP3 + // + BEGIN_OPF(COP13); + DO_LDS(); + + if(!(CP0.SR & (1U << (28 + ((instr >> 26) & 0x3))))) + { + new_PC = Exception(EXCEPTION_COPU, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + const uint32 sub_op = (instr >> 21) & 0x1F; + + PSX_DBG(PSX_DBG_WARNING, "[CPU] COP%u instruction(0x%08x) @ PC=0x%08x\n", (instr >> 26) & 0x3, instr, PC); + + if(sub_op == 0x08 || sub_op == 0x0C) + { + const uint32 immediate = (int32)(int16)(instr & 0xFFFF); + const bool result = (false == (bool)(instr & (1U << 16))); + + DO_BRANCH(result, (immediate << 2), ~0U, false, 0); + } + } + END_OPF; + + // + // LWC0, LWC1, LWC3 + // + BEGIN_OPF(LWC013); + ITYPE; + const uint32 address = GPR[rs] + immediate; + + DO_LDS(); + + if(!(CP0.SR & (1U << (28 + ((instr >> 26) & 0x3))))) + { + new_PC = Exception(EXCEPTION_COPU, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(MDFN_UNLIKELY(address & 3)) + { + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADEL, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + PSX_DBG(PSX_DBG_WARNING, "[CPU] LWC%u instruction(0x%08x) @ PC=0x%08x\n", (instr >> 26) & 0x3, instr, PC); + + ReadMemory(timestamp, address, false, true); + } + } + END_OPF; + + // + // LWC2 + // + BEGIN_OPF(LWC2); + ITYPE; + const uint32 address = GPR[rs] + immediate; + + DO_LDS(); + + if(MDFN_UNLIKELY(address & 3)) + { + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADEL, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(timestamp < gte_ts_done) + timestamp = gte_ts_done; + + GTE_WriteDR(rt, ReadMemory(timestamp, address, false, true)); + } + // GTE stuff here + END_OPF; + + // + // SWC0, SWC1, SCW3 + // + BEGIN_OPF(SWC013); + ITYPE; + const uint32 address = GPR[rs] + immediate; + + DO_LDS(); + + if(!(CP0.SR & (1U << (28 + ((instr >> 26) & 0x3))))) + { + new_PC = Exception(EXCEPTION_COPU, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(MDFN_UNLIKELY(address & 0x3)) + { + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADES, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + PSX_DBG(PSX_DBG_WARNING, "[CPU] SWC%u instruction(0x%08x) @ PC=0x%08x\n", (instr >> 26) & 0x3, instr, PC); + //WriteMemory(timestamp, address, SOMETHING); + } + } + END_OPF; + + // + // SWC2 + // + BEGIN_OPF(SWC2); + ITYPE; + const uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(address & 0x3)) + { + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADES, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(timestamp < gte_ts_done) + timestamp = gte_ts_done; + + WriteMemory(timestamp, address, GTE_ReadDR(rt)); + } + DO_LDS(); + END_OPF; + + // + // DIV - Divide Word + // + BEGIN_OPF(DIV); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + if(!GPR[rt]) + { + if(GPR[rs] & 0x80000000) + LO = 1; + else + LO = 0xFFFFFFFF; + + HI = GPR[rs]; + } + else if(GPR[rs] == 0x80000000 && GPR[rt] == 0xFFFFFFFF) + { + LO = 0x80000000; + HI = 0; + } + else + { + LO = (int32)GPR[rs] / (int32)GPR[rt]; + HI = (int32)GPR[rs] % (int32)GPR[rt]; + } + muldiv_ts_done = timestamp + 37; + + DO_LDS(); + + END_OPF; + + + // + // DIVU - Divide Unsigned Word + // + BEGIN_OPF(DIVU); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + if(!GPR[rt]) + { + LO = 0xFFFFFFFF; + HI = GPR[rs]; + } + else + { + LO = GPR[rs] / GPR[rt]; + HI = GPR[rs] % GPR[rt]; + } + muldiv_ts_done = timestamp + 37; + + DO_LDS(); + END_OPF; + + // + // J - Jump + // + BEGIN_OPF(J); + JTYPE; + + DO_LDS(); + + DO_BRANCH(true, target << 2, 0xF0000000, false, 0); + END_OPF; + + // + // JAL - Jump and Link + // + BEGIN_OPF(JAL); + JTYPE; + + //GPR_DEPRES_BEGIN + GPR_RES(31); + //GPR_DEPRES_END + + DO_LDS(); + + DO_BRANCH(true, target << 2, 0xF0000000, true, 31); + END_OPF; + + // + // JALR - Jump and Link Register + // + BEGIN_OPF(JALR); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 tmp = GPR[rs]; + + DO_LDS(); + + DO_BRANCH(true, tmp, 0, true, rd); + END_OPF; + + // + // JR - Jump Register + // + BEGIN_OPF(JR); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 bt = GPR[rs]; + + DO_LDS(); + + DO_BRANCH(true, bt, 0, false, 0); + END_OPF; + + // + // LUI - Load Upper Immediate + // + BEGIN_OPF(LUI); + ITYPE_ZE; // Actually, probably would be sign-extending...if we were emulating a 64-bit MIPS chip :b + + GPR_DEPRES_BEGIN + GPR_RES(rt); + GPR_DEPRES_END + + DO_LDS(); + + GPR[rt] = immediate << 16; + + END_OPF; + + // + // MFHI - Move from HI + // + BEGIN_OPF(MFHI); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_RES(rd); + GPR_DEPRES_END + + DO_LDS(); + + if(timestamp < muldiv_ts_done) + { + if(timestamp == muldiv_ts_done - 1) + muldiv_ts_done--; + else + { + do + { + if(ReadAbsorb[ReadAbsorbWhich]) + ReadAbsorb[ReadAbsorbWhich]--; + timestamp++; + } while(timestamp < muldiv_ts_done); + } + } + + GPR[rd] = HI; + + END_OPF; + + + // + // MFLO - Move from LO + // + BEGIN_OPF(MFLO); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_RES(rd); + GPR_DEPRES_END + + DO_LDS(); + + if(timestamp < muldiv_ts_done) + { + if(timestamp == muldiv_ts_done - 1) + muldiv_ts_done--; + else + { + do + { + if(ReadAbsorb[ReadAbsorbWhich]) + ReadAbsorb[ReadAbsorbWhich]--; + timestamp++; + } while(timestamp < muldiv_ts_done); + } + } + + GPR[rd] = LO; + + END_OPF; + + + // + // MTHI - Move to HI + // + BEGIN_OPF(MTHI); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + HI = GPR[rs]; + + DO_LDS(); + + END_OPF; + + // + // MTLO - Move to LO + // + BEGIN_OPF(MTLO); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + LO = GPR[rs]; + + DO_LDS(); + + END_OPF; + + + // + // MULT - Multiply Word + // + BEGIN_OPF(MULT); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint64 result; + + result = (int64)(int32)GPR[rs] * (int32)GPR[rt]; + muldiv_ts_done = timestamp + MULT_Tab24[MDFN_lzcount32((GPR[rs] ^ ((int32)GPR[rs] >> 31)) | 0x400)]; + DO_LDS(); + + LO = result; + HI = result >> 32; + + END_OPF; + + // + // MULTU - Multiply Unsigned Word + // + BEGIN_OPF(MULTU); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint64 result; + + result = (uint64)GPR[rs] * GPR[rt]; + muldiv_ts_done = timestamp + MULT_Tab24[MDFN_lzcount32(GPR[rs] | 0x400)]; + DO_LDS(); + + LO = result; + HI = result >> 32; + + END_OPF; + + + // + // NOR - NOR + // + BEGIN_OPF(NOR); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = ~(GPR[rs] | GPR[rt]); + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + // + // OR - OR + // + BEGIN_OPF(OR); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] | GPR[rt]; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // ORI - OR Immediate + // + BEGIN_OPF(ORI); + ITYPE_ZE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = GPR[rs] | immediate; + + DO_LDS(); + + GPR[rt] = result; + + END_OPF; + + + // + // SLL - Shift Word Left Logical + // + BEGIN_OPF(SLL); // SLL + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rt] << shamt; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SLLV - Shift Word Left Logical Variable + // + BEGIN_OPF(SLLV); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rt] << (GPR[rs] & 0x1F); + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + // + // SLT - Set on Less Than + // + BEGIN_OPF(SLT); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = (bool)((int32)GPR[rs] < (int32)GPR[rt]); + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SLTI - Set on Less Than Immediate + // + BEGIN_OPF(SLTI); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = (bool)((int32)GPR[rs] < (int32)immediate); + + DO_LDS(); + + GPR[rt] = result; + + END_OPF; + + + // + // SLTIU - Set on Less Than Immediate, Unsigned + // + BEGIN_OPF(SLTIU); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = (bool)(GPR[rs] < (uint32)immediate); + + DO_LDS(); + + GPR[rt] = result; + + END_OPF; + + + // + // SLTU - Set on Less Than, Unsigned + // + BEGIN_OPF(SLTU); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = (bool)(GPR[rs] < GPR[rt]); + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SRA - Shift Word Right Arithmetic + // + BEGIN_OPF(SRA); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = ((int32)GPR[rt]) >> shamt; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SRAV - Shift Word Right Arithmetic Variable + // + BEGIN_OPF(SRAV); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = ((int32)GPR[rt]) >> (GPR[rs] & 0x1F); + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SRL - Shift Word Right Logical + // + BEGIN_OPF(SRL); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rt] >> shamt; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + // + // SRLV - Shift Word Right Logical Variable + // + BEGIN_OPF(SRLV); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rt] >> (GPR[rs] & 0x1F); + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SUB - Subtract Word + // + BEGIN_OPF(SUB); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] - GPR[rt]; + bool ep = (((GPR[rs] ^ GPR[rt])) & (GPR[rs] ^ result)) & 0x80000000; + + DO_LDS(); + + if(MDFN_UNLIKELY(ep)) + { + new_PC = Exception(EXCEPTION_OV, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + GPR[rd] = result; + + END_OPF; + + + // + // SUBU - Subtract Unsigned Word + // + BEGIN_OPF(SUBU); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] - GPR[rt]; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + + // + // SYSCALL + // + BEGIN_OPF(SYSCALL); + DO_LDS(); + + new_PC = Exception(EXCEPTION_SYSCALL, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + END_OPF; + + + // + // XOR + // + BEGIN_OPF(XOR); + RTYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_RES(rd); + GPR_DEPRES_END + + uint32 result = GPR[rs] ^ GPR[rt]; + + DO_LDS(); + + GPR[rd] = result; + + END_OPF; + + // + // XORI - Exclusive OR Immediate + // + BEGIN_OPF(XORI); + ITYPE_ZE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_RES(rt); + GPR_DEPRES_END + + uint32 result = GPR[rs] ^ immediate; + + DO_LDS(); + + GPR[rt] = result; + END_OPF; + + // + // Memory access instructions(besides the coprocessor ones) follow: + // + + // + // LB - Load Byte + // + BEGIN_OPF(LB); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + LDWhich = rt; + LDValue = (int32)ReadMemory(timestamp, address); + END_OPF; + + // + // LBU - Load Byte Unsigned + // + BEGIN_OPF(LBU); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + LDWhich = rt; + LDValue = ReadMemory(timestamp, address); + END_OPF; + + // + // LH - Load Halfword + // + BEGIN_OPF(LH); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(address & 1)) + { + DO_LDS(); + + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADEL, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + LDWhich = rt; + LDValue = (int32)ReadMemory(timestamp, address); + } + END_OPF; + + // + // LHU - Load Halfword Unsigned + // + BEGIN_OPF(LHU); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(address & 1)) + { + DO_LDS(); + + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADEL, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + LDWhich = rt; + LDValue = ReadMemory(timestamp, address); + } + END_OPF; + + + // + // LW - Load Word + // + BEGIN_OPF(LW); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(address & 3)) + { + DO_LDS(); + + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADEL, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + { + if(MDFN_UNLIKELY(LDWhich == rt)) + LDWhich = 0; + + DO_LDS(); + + LDWhich = rt; + LDValue = ReadMemory(timestamp, address); + } + END_OPF; + + // + // SB - Store Byte + // + BEGIN_OPF(SB); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + WriteMemory(timestamp, address, GPR[rt]); + + DO_LDS(); + END_OPF; + + // + // SH - Store Halfword + // + BEGIN_OPF(SH); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(address & 0x1)) + { + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADES, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + WriteMemory(timestamp, address, GPR[rt]); + + DO_LDS(); + END_OPF; + + // + // SW - Store Word + // + BEGIN_OPF(SW); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + if(MDFN_UNLIKELY(address & 0x3)) + { + CP0.BADVA = address; + new_PC = Exception(EXCEPTION_ADES, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + else + WriteMemory(timestamp, address, GPR[rt]); + + DO_LDS(); + END_OPF; + + // LWL and LWR load delay slot tomfoolery appears to apply even to MFC0! (and probably MFCn and CFCn as well, though they weren't explicitly tested) + + // + // LWL - Load Word Left + // + BEGIN_OPF(LWL); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + //GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + uint32 v = GPR[rt]; + + if(LDWhich == rt) + { + v = LDValue; + ReadFudge = 0; + } + else + { + DO_LDS(); + } + + LDWhich = rt; + switch(address & 0x3) + { + case 0: LDValue = (v & ~(0xFF << 24)) | (ReadMemory(timestamp, address & ~3) << 24); + break; + + case 1: LDValue = (v & ~(0xFFFF << 16)) | (ReadMemory(timestamp, address & ~3) << 16); + break; + + case 2: LDValue = (v & ~(0xFFFFFF << 8)) | (ReadMemory(timestamp, address & ~3, true) << 8); + break; + + case 3: LDValue = (v & ~(0xFFFFFFFF << 0)) | (ReadMemory(timestamp, address & ~3) << 0); + break; + } + END_OPF; + + // + // SWL - Store Word Left + // + BEGIN_OPF(SWL); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + switch(address & 0x3) + { + case 0: WriteMemory(timestamp, address & ~3, GPR[rt] >> 24); + break; + + case 1: WriteMemory(timestamp, address & ~3, GPR[rt] >> 16); + break; + + case 2: WriteMemory(timestamp, address & ~3, GPR[rt] >> 8, true); + break; + + case 3: WriteMemory(timestamp, address & ~3, GPR[rt] >> 0); + break; + } + DO_LDS(); + + END_OPF; + + // + // LWR - Load Word Right + // + BEGIN_OPF(LWR); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + //GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + uint32 v = GPR[rt]; + + if(LDWhich == rt) + { + v = LDValue; + ReadFudge = 0; + } + else + { + DO_LDS(); + } + + LDWhich = rt; + switch(address & 0x3) + { + case 0: LDValue = (v & ~(0xFFFFFFFF)) | ReadMemory(timestamp, address); + break; + + case 1: LDValue = (v & ~(0xFFFFFF)) | ReadMemory(timestamp, address, true); + break; + + case 2: LDValue = (v & ~(0xFFFF)) | ReadMemory(timestamp, address); + break; + + case 3: LDValue = (v & ~(0xFF)) | ReadMemory(timestamp, address); + break; + } + END_OPF; + + // + // SWR - Store Word Right + // + BEGIN_OPF(SWR); + ITYPE; + + GPR_DEPRES_BEGIN + GPR_DEP(rs); + GPR_DEP(rt); + GPR_DEPRES_END + + uint32 address = GPR[rs] + immediate; + + switch(address & 0x3) + { + case 0: WriteMemory(timestamp, address, GPR[rt]); + break; + + case 1: WriteMemory(timestamp, address, GPR[rt], true); + break; + + case 2: WriteMemory(timestamp, address, GPR[rt]); + break; + + case 3: WriteMemory(timestamp, address, GPR[rt]); + break; + } + + DO_LDS(); + + END_OPF; + + // + // Mednafen special instruction + // + BEGIN_OPF(INTERRUPT); + if(Halted) + { + goto SkipNPCStuff; + } + else + { + DO_LDS(); + + new_PC = Exception(EXCEPTION_INT, PC, new_PC, new_PC_mask, instr); + new_PC_mask = 0; + } + END_OPF; + } + + OpDone: ; + + PC = (PC & new_PC_mask) + new_PC; + new_PC_mask = ~0U; + new_PC = 4; + + SkipNPCStuff: ; + + //printf("\n"); + } + } while(MDFN_LIKELY(PSX_EventHandler(timestamp))); + + if(gte_ts_done > 0) + gte_ts_done -= timestamp; + + if(muldiv_ts_done > 0) + muldiv_ts_done -= timestamp; + + ACTIVE_TO_BACKING; + + return(timestamp); +} + +pscpu_timestamp_t PS_CPU::Run(pscpu_timestamp_t timestamp_in, bool BIOSPrintMode, bool ILHMode) +{ + if(CPUHook || ADDBT) + return(RunReal(timestamp_in)); + else + { + if(ILHMode) + return(RunReal(timestamp_in)); + else + { + if(BIOSPrintMode) + return(RunReal(timestamp_in)); + else + return(RunReal(timestamp_in)); + } + } +} + +void PS_CPU::SetCPUHook(void (*cpuh)(const pscpu_timestamp_t timestamp, uint32 pc), void (*addbt)(uint32 from, uint32 to, bool exception)) +{ + ADDBT = addbt; + CPUHook = cpuh; +} + +uint32 PS_CPU::GetRegister(unsigned int which, char *special, const uint32 special_len) +{ + uint32 ret = 0; + + if(which >= GSREG_GPR && which < (GSREG_GPR + 32)) + ret = GPR[which]; + else switch(which) + { + case GSREG_PC: + ret = BACKED_PC; + break; + + case GSREG_PC_NEXT: + ret = BACKED_new_PC; + break; + + case GSREG_IN_BD_SLOT: + ret = !(BACKED_new_PC_mask & 3); + break; + + case GSREG_LO: + ret = LO; + break; + + case GSREG_HI: + ret = HI; + break; + + case GSREG_SR: + ret = CP0.SR; + break; + + case GSREG_CAUSE: + ret = CP0.CAUSE; + break; + + case GSREG_EPC: + ret = CP0.EPC; + break; + + } + + return(ret); +} + +void PS_CPU::SetRegister(unsigned int which, uint32 value) +{ + if(which >= GSREG_GPR && which < (GSREG_GPR + 32)) + { + if(which != (GSREG_GPR + 0)) + GPR[which] = value; + } + else switch(which) + { + case GSREG_PC: + BACKED_PC = value & ~0x3; // Remove masking if we ever add proper misaligned PC exception + break; + + case GSREG_LO: + LO = value; + break; + + case GSREG_HI: + HI = value; + break; + + case GSREG_SR: + CP0.SR = value; // TODO: mask + break; + + case GSREG_CAUSE: + CP0.CAUSE = value; + break; + + case GSREG_EPC: + CP0.EPC = value & ~0x3U; + break; + + + } +} + +bool PS_CPU::PeekCheckICache(uint32 PC, uint32 *iw) +{ + if(ICache[(PC & 0xFFC) >> 2].TV == PC) + { + *iw = ICache[(PC & 0xFFC) >> 2].Data; + return(true); + } + + return(false); +} + + +uint8 PS_CPU::PeekMem8(uint32 A) +{ + return PeekMemory(A); +} + +uint16 PS_CPU::PeekMem16(uint32 A) +{ + return PeekMemory(A); +} + +uint32 PS_CPU::PeekMem32(uint32 A) +{ + return PeekMemory(A); +} + +void PS_CPU::PokeMem8(uint32 A, uint8 V) +{ + PokeMemory(A, V); +} + +void PS_CPU::PokeMem16(uint32 A, uint16 V) +{ + PokeMemory(A, V); +} + +void PS_CPU::PokeMem32(uint32 A, uint32 V) +{ + PokeMemory(A, V); +} + +#undef BEGIN_OPF +#undef END_OPF +#undef MK_OPF + +#define MK_OPF(op, funct) ((op) ? (0x40 | (op)) : (funct)) +#define BEGIN_OPF(op, funct) case MK_OPF(op, funct): { +#define END_OPF } break; + +// FIXME: should we breakpoint on an illegal address? And with LWC2/SWC2 if CP2 isn't enabled? +void PS_CPU::CheckBreakpoints(void (*callback)(bool write, uint32 address, unsigned int len), uint32 instr) +{ + uint32 opf; + + opf = instr & 0x3F; + + if(instr & (0x3F << 26)) + opf = 0x40 | (instr >> 26); + + + switch(opf) + { + default: + break; + + // + // LB - Load Byte + // + BEGIN_OPF(0x20, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(false, address, 1); + END_OPF; + + // + // LBU - Load Byte Unsigned + // + BEGIN_OPF(0x24, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(false, address, 1); + END_OPF; + + // + // LH - Load Halfword + // + BEGIN_OPF(0x21, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(false, address, 2); + END_OPF; + + // + // LHU - Load Halfword Unsigned + // + BEGIN_OPF(0x25, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(false, address, 2); + END_OPF; + + + // + // LW - Load Word + // + BEGIN_OPF(0x23, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(false, address, 4); + END_OPF; + + // + // SB - Store Byte + // + BEGIN_OPF(0x28, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(true, address, 1); + END_OPF; + + // + // SH - Store Halfword + // + BEGIN_OPF(0x29, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(true, address, 2); + END_OPF; + + // + // SW - Store Word + // + BEGIN_OPF(0x2B, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(true, address, 4); + END_OPF; + + // + // LWL - Load Word Left + // + BEGIN_OPF(0x22, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + do + { + callback(false, address, 1); + } while((address--) & 0x3); + + END_OPF; + + // + // SWL - Store Word Left + // + BEGIN_OPF(0x2A, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + do + { + callback(true, address, 1); + } while((address--) & 0x3); + + END_OPF; + + // + // LWR - Load Word Right + // + BEGIN_OPF(0x26, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + do + { + callback(false, address, 1); + } while((++address) & 0x3); + + END_OPF; + + // + // SWR - Store Word Right + // + BEGIN_OPF(0x2E, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + do + { + callback(true, address, 1); + } while((++address) & 0x3); + + END_OPF; + + // + // LWC2 + // + BEGIN_OPF(0x32, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(false, address, 4); + END_OPF; + + // + // SWC2 + // + BEGIN_OPF(0x3A, 0); + ITYPE; + uint32 address = GPR[rs] + immediate; + + callback(true, address, 4); + END_OPF; + + } +} + + +} diff --git a/Mednafen/mednafen/psx/cpu.h b/Mednafen/mednafen/psx/cpu.h new file mode 100644 index 0000000000..c6d3596cc7 --- /dev/null +++ b/Mednafen/mednafen/psx/cpu.h @@ -0,0 +1,260 @@ +#ifndef __MDFN_PSX_CPU_H +#define __MDFN_PSX_CPU_H + +/* + Load delay notes: + + // Takes 1 less + ".set noreorder\n\t" + ".set nomacro\n\t" + "lw %0, 0(%2)\n\t" + "nop\n\t" + "nop\n\t" + "or %0, %1, %1\n\t" + + // cycle than this: + ".set noreorder\n\t" + ".set nomacro\n\t" + "lw %0, 0(%2)\n\t" + "nop\n\t" + "or %0, %1, %1\n\t" + "nop\n\t" + + + // Both of these + ".set noreorder\n\t" + ".set nomacro\n\t" + "lw %0, 0(%2)\n\t" + "nop\n\t" + "nop\n\t" + "or %1, %0, %0\n\t" + + // take same...(which is kind of odd). + ".set noreorder\n\t" + ".set nomacro\n\t" + "lw %0, 0(%2)\n\t" + "nop\n\t" + "or %1, %0, %0\n\t" + "nop\n\t" +*/ + +#include "gte.h" + +namespace MDFN_IEN_PSX +{ + +#define PS_CPU_EMULATE_ICACHE 1 + +class PS_CPU +{ + public: + + PS_CPU() MDFN_COLD; + ~PS_CPU() MDFN_COLD; + + // FAST_MAP_* enums are in BYTES(8-bit), not in 32-bit units("words" in MIPS context), but the sizes + // will always be multiples of 4. + enum { FAST_MAP_SHIFT = 16 }; + enum { FAST_MAP_PSIZE = 1 << FAST_MAP_SHIFT }; + + void SetFastMap(void *region_mem, uint32 region_address, uint32 region_size); + + INLINE void SetEventNT(const pscpu_timestamp_t next_event_ts_arg) + { + next_event_ts = next_event_ts_arg; + } + + pscpu_timestamp_t Run(pscpu_timestamp_t timestamp_in, bool BIOSPrintMode, bool ILHMode); + + void Power(void) MDFN_COLD; + + // which ranges 0-5, inclusive + void AssertIRQ(unsigned which, bool asserted); + + void SetHalt(bool status); + + // TODO eventually: factor BIU address decoding directly in the CPU core somehow without hurting speed. + void SetBIU(uint32 val); + uint32 GetBIU(void); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + private: + + uint32 GPR[32 + 1]; // GPR[32] Used as dummy in load delay simulation(indexing past the end of real GPR) + + uint32 LO; + uint32 HI; + + + uint32 BACKED_PC; + uint32 BACKED_new_PC; + uint32 BACKED_new_PC_mask; + + uint32 IPCache; + void RecalcIPCache(void); + bool Halted; + + uint32 BACKED_LDWhich; + uint32 BACKED_LDValue; + uint32 LDAbsorb; + + pscpu_timestamp_t next_event_ts; + pscpu_timestamp_t gte_ts_done; + pscpu_timestamp_t muldiv_ts_done; + + uint32 BIU; + + struct __ICache + { + uint32 TV; + uint32 Data; + }; + + union + { + __ICache ICache[1024]; + uint32 ICache_Bulk[2048]; + }; + + enum + { + CP0REG_BPC = 3, // PC breakpoint address. + CP0REG_BDA = 5, // Data load/store breakpoint address. + CP0REG_TAR = 6, // Target address(???) + CP0REG_DCIC = 7, // Cache control + CP0REG_BADVA = 8, + CP0REG_BDAM = 9, // Data load/store address mask. + CP0REG_BPCM = 11, // PC breakpoint address mask. + CP0REG_SR = 12, + CP0REG_CAUSE = 13, + CP0REG_EPC = 14, + CP0REG_PRID = 15 // Product ID + }; + + struct + { + union + { + uint32 Regs[32]; + struct + { + uint32 Unused00; + uint32 Unused01; + uint32 Unused02; + uint32 BPC; // RW + uint32 Unused04; + uint32 BDA; // RW + uint32 TAR; // R + uint32 DCIC; // RW + uint32 BADVA; // R + uint32 BDAM; // R/W + uint32 Unused0A; + uint32 BPCM; // R/W + uint32 SR; // R/W + uint32 CAUSE; // R/W(partial) + uint32 EPC; // R + uint32 PRID; // R + }; + }; + } CP0; + +#if 1 + //uint32 WrAbsorb; + //uint8 WrAbsorbShift; + + // On read: + //WrAbsorb = 0; + //WrAbsorbShift = 0; + + // On write: + //WrAbsorb >>= (WrAbsorbShift >> 2) & 8; + //WrAbsorbShift -= (WrAbsorbShift >> 2) & 8; + + //WrAbsorb |= (timestamp - pre_write_timestamp) << WrAbsorbShift; + //WrAbsorbShift += 8; +#endif + + uint8 ReadAbsorb[0x20 + 1]; + uint8 ReadAbsorbWhich; + uint8 ReadFudge; + + //uint32 WriteAbsorb; + //uint8 WriteAbsorbCount; + //uint8 WriteAbsorbMonkey; + uint8 MULT_Tab24[24]; + + MultiAccessSizeMem<1024, false> ScratchRAM; + + //PS_GTE GTE; + + uint8 *FastMap[1 << (32 - FAST_MAP_SHIFT)]; + uint8 DummyPage[FAST_MAP_PSIZE]; + + enum + { + EXCEPTION_INT = 0, + EXCEPTION_MOD = 1, + EXCEPTION_TLBL = 2, + EXCEPTION_TLBS = 3, + EXCEPTION_ADEL = 4, // Address error on load + EXCEPTION_ADES = 5, // Address error on store + EXCEPTION_IBE = 6, // Instruction bus error + EXCEPTION_DBE = 7, // Data bus error + EXCEPTION_SYSCALL = 8, // System call + EXCEPTION_BP = 9, // Breakpoint + EXCEPTION_RI = 10, // Reserved instruction + EXCEPTION_COPU = 11, // Coprocessor unusable + EXCEPTION_OV = 12 // Arithmetic overflow + }; + + uint32 Exception(uint32 code, uint32 PC, const uint32 NP, const uint32 NPM, const uint32 instr) MDFN_WARN_UNUSED_RESULT; + + template pscpu_timestamp_t RunReal(pscpu_timestamp_t timestamp_in) NO_INLINE; + + template T PeekMemory(uint32 address) MDFN_COLD; + template void PokeMemory(uint32 address, T value) MDFN_COLD; + template T ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool DS24 = false, bool LWC_timing = false); + template void WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24 = false); + + + // + // Mednafen debugger stuff follows: + // + public: + void SetCPUHook(void (*cpuh)(const pscpu_timestamp_t timestamp, uint32 pc), void (*addbt)(uint32 from, uint32 to, bool exception)); + void CheckBreakpoints(void (*callback)(bool write, uint32 address, unsigned int len), uint32 instr); + + enum + { + GSREG_GPR = 0, + GSREG_PC = 32, + GSREG_PC_NEXT, + GSREG_IN_BD_SLOT, + GSREG_LO, + GSREG_HI, + GSREG_SR, + GSREG_CAUSE, + GSREG_EPC, + }; + + uint32 GetRegister(unsigned int which, char *special, const uint32 special_len); + void SetRegister(unsigned int which, uint32 value); + bool PeekCheckICache(uint32 PC, uint32 *iw); + + uint8 PeekMem8(uint32 A); + uint16 PeekMem16(uint32 A); + uint32 PeekMem32(uint32 A); + + void PokeMem8(uint32 A, uint8 V); + void PokeMem16(uint32 A, uint16 V); + void PokeMem32(uint32 A, uint32 V); + + private: + void (*CPUHook)(const pscpu_timestamp_t timestamp, uint32 pc); + void (*ADDBT)(uint32 from, uint32 to, bool exception); +}; + +} + +#endif diff --git a/Mednafen/mednafen/psx/debug.cpp b/Mednafen/mednafen/psx/debug.cpp new file mode 100644 index 0000000000..b75a89e56c --- /dev/null +++ b/Mednafen/mednafen/psx/debug.cpp @@ -0,0 +1,680 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "timer.h" +#include "cdc.h" +#include "spu.h" + +namespace MDFN_IEN_PSX +{ + +extern PS_GPU *GPU; +extern PS_SPU *SPU; + +static void RedoCPUHook(void); + +static void (*CPUHook)(uint32, bool) = NULL; +static bool CPUHookContinuous = false; + +struct PSX_BPOINT +{ + uint32 A[2]; + int type; +}; + +static std::vector BreakPointsPC, BreakPointsRead, BreakPointsWrite; +static bool FoundBPoint; + +static bool BTEnabled; +static int BTIndex; + +struct BTEntry +{ + uint32 from; + uint32 to; + uint32 branch_count; + bool exception; + bool valid; +}; + +#define NUMBT 24 +static BTEntry BTEntries[NUMBT]; + +void DBG_Break(void) +{ + FoundBPoint = true; +} + +static void AddBranchTrace(uint32 from, uint32 to, bool exception) +{ + BTEntry *prevbt = &BTEntries[(BTIndex + NUMBT - 1) % NUMBT]; + + //if(BTEntries[(BTIndex - 1) & 0xF] == PC) return; + + if(prevbt->from == from && prevbt->to == to && prevbt->exception == exception && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid) + prevbt->branch_count++; + else + { + BTEntries[BTIndex].from = from; + BTEntries[BTIndex].to = to; + BTEntries[BTIndex].exception = exception; + BTEntries[BTIndex].branch_count = 1; + BTEntries[BTIndex].valid = true; + + BTIndex = (BTIndex + 1) % NUMBT; + } +} + +static void EnableBranchTrace(bool enable) +{ + BTEnabled = enable; + if(!enable) + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + } + RedoCPUHook(); +} + +static std::vector GetBranchTrace(void) +{ + BranchTraceResult tmp; + std::vector ret; + + for(int x = 0; x < NUMBT; x++) + { + const BTEntry *bt = &BTEntries[(x + BTIndex) % NUMBT]; + + tmp.count = bt->branch_count; + trio_snprintf(tmp.from, sizeof(tmp.from), "%08x", bt->from); + trio_snprintf(tmp.to, sizeof(tmp.to), "%08x", bt->to); + trio_snprintf(tmp.code, sizeof(tmp.code), "%s", bt->exception ? "e" : ""); + + ret.push_back(tmp); + } + return(ret); +} + +void CheckCPUBPCallB(bool write, uint32 address, unsigned int len) +{ + std::vector::iterator bpit; + std::vector::iterator bpit_end; + + if(write) + { + bpit = BreakPointsWrite.begin(); + bpit_end = BreakPointsWrite.end(); + } + else + { + bpit = BreakPointsRead.begin(); + bpit_end = BreakPointsRead.end(); + } + + while(bpit != bpit_end) + { + if(address >= bpit->A[0] && address <= bpit->A[1]) + { + FoundBPoint = true; + break; + } + bpit++; + } +} + +static void CPUHandler(const pscpu_timestamp_t timestamp, uint32 PC) +{ + std::vector::iterator bpit; + + for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) + { + if(PC >= bpit->A[0] && PC <= bpit->A[1]) + { + FoundBPoint = true; + break; + } + } + + CPU->CheckBreakpoints(CheckCPUBPCallB, CPU->PeekMem32(PC)); + + CPUHookContinuous |= FoundBPoint; + + if(CPUHookContinuous && CPUHook) + { + ForceEventUpdates(timestamp); + CPUHook(PC, FoundBPoint); + } + + FoundBPoint = false; +} + + +static void RedoCPUHook(void) +{ + const bool HappyTest = CPUHook || BreakPointsPC.size() || BreakPointsRead.size() || BreakPointsWrite.size(); + + CPU->SetCPUHook(HappyTest ? CPUHandler : NULL, BTEnabled ? AddBranchTrace : NULL); +} + +static void FlushBreakPoints(int type) +{ + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_PC) + BreakPointsPC.clear(); + + RedoCPUHook(); +} + +static void AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + PSX_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type = type; + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_PC) + BreakPointsPC.push_back(tmp); + + RedoCPUHook(); +} + +static void SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + CPUHook = callb; + CPUHookContinuous = continuous; + RedoCPUHook(); +} + +static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFFFFFF; + *Buffer = CPU->PeekMem8(Address); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= 0x1FFFFF; + *Buffer = CPU->PeekMem8(Address); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "spu")) + { + while(Length--) + { + Address &= 0x7FFFF; + *Buffer = SPU->PeekSPURAM(Address >> 1) >> ((Address & 1) * 8); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "gpu")) + { + while(Length--) + { + Address &= 0xFFFFF; + *Buffer = GPU->PeekRAM(Address >> 1) >> ((Address & 1) * 8); + Address++; + Buffer++; + } + } +} + + +static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + while(Length--) + { + Address &= 0xFFFFFFFF; + CPU->PokeMem8(Address, *Buffer); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= 0x1FFFFF; + CPU->PokeMem8(Address, *Buffer); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "gpu")) + { + while(Length--) + { + Address &= 0xFFFFF; + + uint16 peeko = GPU->PeekRAM(Address >> 1); + + GPU->PokeRAM(Address >> 1, (*Buffer << ((Address & 1) * 8)) | (peeko & (0xFF00 >> ((Address & 1) * 8))) ); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "spu")) + { + while(Length--) + { + Address &= 0x7FFFF; + + uint16 peeko = SPU->PeekSPURAM(Address >> 1); + + SPU->PokeSPURAM(Address >> 1, (*Buffer << ((Address & 1) * 8)) | (peeko & (0xFF00 >> ((Address & 1) * 8))) ); + Address++; + Buffer++; + } + } + +} + +static uint32 MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ret = 0; + + for(unsigned int i = 0; i < bsize; i++) + ret |= CPU->PeekMem8(A + i) << (i * 8); + + return(ret); +} + +static void Disassemble(uint32 &A, uint32 SpecialA, char *TextBuf) +{ + assert(!(A & 0x3)); + + uint32 instr = CPU->PeekMem32(A); + + CPU->PeekCheckICache(A, &instr); + + strncpy(TextBuf, DisassembleMIPS(A, instr).c_str(), 256); + TextBuf[255] = 0; + +// trio_snprintf(TextBuf, 256, "0x%08x", instr); + + A += 4; +} + +static MDFN_Surface *GfxDecode_Buf = NULL; +static int GfxDecode_Line = -1; +static int GfxDecode_Layer = 0; +static int GfxDecode_Scroll = 0; +static int GfxDecode_PBN = 0; + +static void DoGfxDecode(void) +{ + if(GfxDecode_Buf) + { + for(int sy = 0; sy < GfxDecode_Buf->h; sy++) + { + for(int sx = 0; sx < GfxDecode_Buf->w; sx++) + { + unsigned fb_x = ((sx % GfxDecode_Buf->w) + ((sy + GfxDecode_Scroll) / GfxDecode_Buf->w * GfxDecode_Buf->w)) & 1023; + unsigned fb_y = (((sy + GfxDecode_Scroll) % GfxDecode_Buf->w) + ((((sx % GfxDecode_Buf->w) + ((sy + GfxDecode_Scroll) / GfxDecode_Buf->w * GfxDecode_Buf->w)) / 1024) * GfxDecode_Buf->w)) & 511; + + uint16 pixel = GPU->PeekRAM(fb_y * 1024 + fb_x); + + GfxDecode_Buf->pixels[(sy * GfxDecode_Buf->w * 3) + sx] = GfxDecode_Buf->MakeColor(((pixel >> 0) & 0x1F) * 255 / 31, + ((pixel >> 5) & 0x1F) * 255 / 31, + ((pixel >> 10) & 0x1F) * 255 / 31, 0xFF); + } + } + } +} + + +void DBG_GPUScanlineHook(unsigned scanline) +{ + if((int)scanline == GfxDecode_Line) + { + DoGfxDecode(); + } +} + + +static void SetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn) +{ + GfxDecode_Buf = surface; + GfxDecode_Line = line; + GfxDecode_Layer = which; + GfxDecode_Scroll = yscroll; + GfxDecode_PBN = pbn; + + if(GfxDecode_Buf && GfxDecode_Line == -1) + DoGfxDecode(); +} + +DebuggerInfoStruct PSX_DBGInfo = +{ + "shift_jis", + 4, // Max instruction byte size + 4, // Instruction alignment(bytes) + 32, // Logical address bits + 32, // Physical address bits + 0x00000000, // Default watch addr + ~0U, // ZP addr + + MemPeek, + Disassemble, + NULL, + NULL, //ForceIRQ, + NULL, //NESDBG_GetVector, + FlushBreakPoints, + AddBreakPoint, + SetCPUCallback, + EnableBranchTrace, + GetBranchTrace, + SetGraphicsDecode, + NULL, //PCFXDBG_SetLogFunc, +}; + +static RegType Regs_Misc[] = +{ + { TIMER_GSREG_COUNTER0, "COUNT0", "Counter 0", 2 }, + { TIMER_GSREG_MODE0, "MODE0", "Mode 0", 2 }, + { TIMER_GSREG_TARGET0, "TARGET0", "Target 0", 2 }, + + { 0, "------", "", 0xFFFF }, + + + { TIMER_GSREG_COUNTER1, "COUNT1", "Counter 1", 2 }, + { TIMER_GSREG_MODE1, "MODE1", "Mode 1", 2 }, + { TIMER_GSREG_TARGET1, "TARGET1", "Target 1", 2 }, + + { 0, "------", "", 0xFFFF }, + + { TIMER_GSREG_COUNTER2, "COUNT2", "Counter 2", 2 }, + { TIMER_GSREG_MODE2, "MODE2", "Mode 2", 2 }, + { TIMER_GSREG_TARGET2, "TARGET2", "Target 2", 2 }, + + { 0, "------", "", 0xFFFF }, + { 0, "------", "", 0xFFFF }, + + { 0x10000 | IRQ_GSREG_ASSERTED, "ASSERTD", "IRQ Asserted", 2 }, + { 0x10000 | IRQ_GSREG_STATUS, "STATUS", "IRQ Status", 2 }, + { 0x10000 | IRQ_GSREG_MASK, "MASK", "IRQ Mask", 2 }, + + { 0, "", "", 0 } +}; + + +static uint32 GetRegister_Misc(const unsigned int id, char *special, const uint32 special_len) +{ + if(id & 0x10000) + return(IRQ_GetRegister(id & 0xFFFF, special, special_len)); + else + return(TIMER_GetRegister(id & 0xFFFF, special, special_len)); +} + +static void SetRegister_Misc(const unsigned int id, uint32 value) +{ + if(id & 0x10000) + IRQ_SetRegister(id & 0xFFFF, value); + else + TIMER_SetRegister(id & 0xFFFF, value); +} + +static RegGroupType MiscRegsGroup = +{ + NULL, + Regs_Misc, + GetRegister_Misc, + SetRegister_Misc +}; + +static RegType Regs_SPU[] = +{ + { PS_SPU::GSREG_SPUCONTROL, "SPUCTRL", "SPU Control", 2 }, + + { PS_SPU::GSREG_FM_ON, "FMOn", "FM Enable", 3 }, + { PS_SPU::GSREG_NOISE_ON, "NoiseOn", "Noise Enable", 3 }, + { PS_SPU::GSREG_REVERB_ON, "ReverbOn", "Reverb Enable", 3 }, + + { PS_SPU::GSREG_CDVOL_L, "CDVolL", "CD Volume Left", 2 }, + { PS_SPU::GSREG_CDVOL_R, "CDVolR", "CD Volume Right", 2 }, + + { PS_SPU::GSREG_RVBVOL_L, "RvbVolL", "Reverb Volume Left", 2 }, + { PS_SPU::GSREG_RVBVOL_R, "RvbVolR", "Reverb Volume Right", 2 }, + + { PS_SPU::GSREG_MAINVOL_CTRL_L, "MainVolCL", "Main Volume Control Left", 2 }, + { PS_SPU::GSREG_MAINVOL_CTRL_R, "MainVolCR", "Main Volume Control Right", 2 }, + + { PS_SPU::GSREG_MAINVOL_L, "MainVolL", "Dry Volume Left", 2 }, + { PS_SPU::GSREG_MAINVOL_R, "MainVolR", "Dry Volume Right", 2 }, + + { PS_SPU::GSREG_RWADDR, "RWAddr", "SPURAM Read/Write Address", 3 }, + + { PS_SPU::GSREG_IRQADDR, "IRQAddr", "IRQ Compare Address", 3 }, + + { PS_SPU::GSREG_REVERBWA, "ReverbWA", "Reverb Work Area(Raw)", 2 }, + + { PS_SPU::GSREG_VOICEON, "VoiceOn", "Voice On", 3 }, + { PS_SPU::GSREG_VOICEOFF, "VoiceOff", "Voice Off", 3 }, + { PS_SPU::GSREG_BLOCKEND, "BlockEnd", "Block End", 3 }, + + + { 0, "------", "", 0xFFFF }, + + { PS_SPU::GSREG_FB_SRC_A, "FB_SRC_A", "", 2 }, + { PS_SPU::GSREG_FB_SRC_B, "FB_SRC_B", "", 2 }, + { PS_SPU::GSREG_IIR_ALPHA, "IIR_ALPHA", "", 2 }, + { PS_SPU::GSREG_ACC_COEF_A, "ACC_COEF_A", "", 2 }, + { PS_SPU::GSREG_ACC_COEF_B, "ACC_COEF_B", "", 2 }, + { PS_SPU::GSREG_ACC_COEF_C, "ACC_COEF_C", "", 2 }, + { PS_SPU::GSREG_ACC_COEF_D, "ACC_COEF_D", "", 2 }, + { PS_SPU::GSREG_IIR_COEF, "IIR_COEF", "", 2 }, + { PS_SPU::GSREG_FB_ALPHA, "FB_ALPHA", "", 2 }, + { PS_SPU::GSREG_FB_X, "FB_X", "", 2 }, + { PS_SPU::GSREG_IIR_DEST_A0, "IIR_DST_A0", "", 2 }, + { PS_SPU::GSREG_IIR_DEST_A1, "IIR_DST_A1", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_A0, "ACC_SRC_A0", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_A1, "ACC_SRC_A1", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_B0, "ACC_SRC_B0", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_B1, "ACC_SRC_B1", "", 2 }, + { PS_SPU::GSREG_IIR_SRC_A0, "IIR_SRC_A0", "", 2 }, + { PS_SPU::GSREG_IIR_SRC_A1, "IIR_SRC_A1", "", 2 }, + { PS_SPU::GSREG_IIR_DEST_B0, "IIR_DST_B0", "", 2 }, + { PS_SPU::GSREG_IIR_DEST_B1, "IIR_DST_B1", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_C0, "ACC_SRC_C0", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_C1, "ACC_SRC_C1", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_D0, "ACC_SRC_D0", "", 2 }, + { PS_SPU::GSREG_ACC_SRC_D1, "ACC_SRC_D1", "", 2 }, + { PS_SPU::GSREG_IIR_SRC_B1, "IIR_SRC_B1", "", 2 }, + { PS_SPU::GSREG_IIR_SRC_B0, "IIR_SRC_B0", "", 2 }, + { PS_SPU::GSREG_MIX_DEST_A0, "MIX_DST_A0", "", 2 }, + { PS_SPU::GSREG_MIX_DEST_A1, "MIX_DST_A1", "", 2 }, + { PS_SPU::GSREG_MIX_DEST_B0, "MIX_DST_B0", "", 2 }, + { PS_SPU::GSREG_MIX_DEST_B1, "MIX_DST_B1", "", 2 }, + { PS_SPU::GSREG_IN_COEF_L, "IN_COEF_L", "", 2 }, + { PS_SPU::GSREG_IN_COEF_R, "IN_COEF_R", "", 2 }, + + { 0, "", "", 0 }, +}; + +#define VOICE_HELPER(v) \ + { 0, "--V"#v"--", "", 0xFFFF }, \ + { PS_SPU:: GSREG_V0_VOL_CTRL_L + v * 256, "VolCL", "Volume Control Left", 2 }, \ + { PS_SPU:: GSREG_V0_VOL_CTRL_R + v * 256, "VolCR", "Volume Control Right", 2 }, \ + { PS_SPU:: GSREG_V0_VOL_L + v * 256, "VolL", "Volume Left", 2 }, \ + { PS_SPU:: GSREG_V0_VOL_R + v * 256, "VolR", "Volume Right", 2 }, \ + { PS_SPU:: GSREG_V0_PITCH + v * 256, "Pitch", "Pitch", 2 }, \ + { PS_SPU:: GSREG_V0_STARTADDR + v * 256, "SAddr", "Start Address", 3 }, \ + { PS_SPU:: GSREG_V0_ADSR_CTRL + v * 256, "ADSRCTRL", "ADSR Control", 4 }, \ + { PS_SPU:: GSREG_V0_ADSR_LEVEL + v * 256, "ADSRLev", "ADSR Level", 2 }, \ + { PS_SPU:: GSREG_V0_LOOP_ADDR + v * 256, "LAddr", "Loop Address", 3 }, \ + { PS_SPU:: GSREG_V0_READ_ADDR + v * 256, "RAddr", "Read Address", 3 } + + +static RegType Regs_SPU_Voices[] = +{ +#if 1 + VOICE_HELPER(0), + VOICE_HELPER(1), + VOICE_HELPER(2), + VOICE_HELPER(3), +#else + VOICE_HELPER(9), + VOICE_HELPER(12), + VOICE_HELPER(17), + VOICE_HELPER(22), + + //VOICE_HELPER(20), + //VOICE_HELPER(21), + //VOICE_HELPER(22), + //VOICE_HELPER(23), +#endif + { 0, "", "", 0 }, +}; + + +static uint32 GetRegister_SPU(const unsigned int id, char *special, const uint32 special_len) +{ + return(SPU->GetRegister(id, special, special_len)); +} + +static void SetRegister_SPU(const unsigned int id, uint32 value) +{ + SPU->SetRegister(id, value); +} + +static RegGroupType SPURegsGroup = +{ + NULL, + Regs_SPU, + GetRegister_SPU, + SetRegister_SPU +}; + + +static RegGroupType SPUVoicesRegsGroup = +{ + NULL, + Regs_SPU_Voices, + GetRegister_SPU, + SetRegister_SPU +}; + +static RegType Regs_CPU[] = +{ + { PS_CPU::GSREG_PC, "PC", "PC", 4 }, + { PS_CPU::GSREG_PC_NEXT, "NPC", "Next PC", 4 }, + { PS_CPU::GSREG_IN_BD_SLOT, "INBD", "In Branch Delay Slot", 1 }, + { 0, "------", "", 0xFFFF }, + { PS_CPU::GSREG_GPR + 1, "at", "Assembler Temporary", 4 }, + { PS_CPU::GSREG_GPR + 2, "v0", "Return Value 0", 4 }, + { PS_CPU::GSREG_GPR + 3, "v1", "Return Value 1", 4 }, + { PS_CPU::GSREG_GPR + 4, "a0", "Argument 0", 4 }, + { PS_CPU::GSREG_GPR + 5, "a1", "Argument 1", 4 }, + { PS_CPU::GSREG_GPR + 6, "a2", "Argument 2", 4 }, + { PS_CPU::GSREG_GPR + 7, "a3", "Argument 3", 4 }, + { PS_CPU::GSREG_GPR + 8, "t0", "Temporary 0", 4 }, + { PS_CPU::GSREG_GPR + 9, "t1", "Temporary 1", 4 }, + { PS_CPU::GSREG_GPR + 10, "t2", "Temporary 2", 4 }, + { PS_CPU::GSREG_GPR + 11, "t3", "Temporary 3", 4 }, + { PS_CPU::GSREG_GPR + 12, "t4", "Temporary 4", 4 }, + { PS_CPU::GSREG_GPR + 13, "t5", "Temporary 5", 4 }, + { PS_CPU::GSREG_GPR + 14, "t6", "Temporary 6", 4 }, + { PS_CPU::GSREG_GPR + 15, "t7", "Temporary 7", 4 }, + { PS_CPU::GSREG_GPR + 16, "s0", "Subroutine Reg Var 0", 4 }, + { PS_CPU::GSREG_GPR + 17, "s1", "Subroutine Reg Var 1", 4 }, + { PS_CPU::GSREG_GPR + 18, "s2", "Subroutine Reg Var 2", 4 }, + { PS_CPU::GSREG_GPR + 19, "s3", "Subroutine Reg Var 3", 4 }, + { PS_CPU::GSREG_GPR + 20, "s4", "Subroutine Reg Var 4", 4 }, + { PS_CPU::GSREG_GPR + 21, "s5", "Subroutine Reg Var 5", 4 }, + { PS_CPU::GSREG_GPR + 22, "s6", "Subroutine Reg Var 6", 4 }, + { PS_CPU::GSREG_GPR + 23, "s7", "Subroutine Reg Var 7", 4 }, + { PS_CPU::GSREG_GPR + 24, "t8", "Temporary 8", 4 }, + { PS_CPU::GSREG_GPR + 25, "t9", "Temporary 9", 4 }, + { PS_CPU::GSREG_GPR + 26, "k0", "Interrupt/Trap Handler Reg 0", 4 }, + { PS_CPU::GSREG_GPR + 27, "k1", "Interrupt/Trap Handler Reg 1", 4 }, + { PS_CPU::GSREG_GPR + 28, "gp", "Global Pointer", 4 }, + { PS_CPU::GSREG_GPR + 29, "sp", "Stack Pointer", 4 }, + { PS_CPU::GSREG_GPR + 30, "s8", "Subroutine Reg Var 8/Frame Pointer", 4 }, + { PS_CPU::GSREG_GPR + 31, "ra", "Return Address", 4 }, + { 0, "------", "", 0xFFFF }, + + { PS_CPU::GSREG_SR, "SR", "Status Register", 4 }, + { PS_CPU::GSREG_CAUSE, "CAU","Cause Register", 4 }, + { PS_CPU::GSREG_EPC, "EPC", "EPC Register", 4 }, + { 0, "", "", 0 } +}; + +static uint32 GetRegister_CPU(const unsigned int id, char *special, const uint32 special_len) +{ + return(CPU->GetRegister(id, special, special_len)); +} + +static void SetRegister_CPU(const unsigned int id, uint32 value) +{ + CPU->SetRegister(id, value); +} + +static RegGroupType CPURegsGroup = +{ + NULL, + Regs_CPU, + GetRegister_CPU, + SetRegister_CPU +}; + + +bool DBG_Init(void) +{ + CPUHook = NULL; + CPUHookContinuous = false; + FoundBPoint = false; + + BTEnabled = false; + BTIndex = false; + memset(BTEntries, 0, sizeof(BTEntries)); + + MDFNDBG_AddRegGroup(&CPURegsGroup); + MDFNDBG_AddRegGroup(&MiscRegsGroup); + MDFNDBG_AddRegGroup(&SPURegsGroup); + MDFNDBG_AddRegGroup(&SPUVoicesRegsGroup); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "cpu", "CPU Physical", 32); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ram", "CPU Main RAM", 21); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "spu", "SPU RAM", 19); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "gpu", "GPU RAM", 20); + return(true); +} + + + +} + diff --git a/Mednafen/mednafen/psx/debug.h b/Mednafen/mednafen/psx/debug.h new file mode 100644 index 0000000000..18035d66b9 --- /dev/null +++ b/Mednafen/mednafen/psx/debug.h @@ -0,0 +1,21 @@ +#ifndef __MDFN_PSX_DEBUG_H +#define __MDFN_PSX_DEBUG_H + +#ifdef WANT_DEBUGGER + +namespace MDFN_IEN_PSX +{ + +extern DebuggerInfoStruct PSX_DBGInfo; + +bool DBG_Init(void); + +void DBG_Break(void); + +void DBG_GPUScanlineHook(unsigned scanline); + +} + +#endif + +#endif diff --git a/Mednafen/mednafen/psx/dis.cpp b/Mednafen/mednafen/psx/dis.cpp new file mode 100644 index 0000000000..f36d7c1d0b --- /dev/null +++ b/Mednafen/mednafen/psx/dis.cpp @@ -0,0 +1,417 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" + +namespace MDFN_IEN_PSX +{ + +struct OpEntry +{ + uint32 mask; + uint32 value; + const char *mnemonic; + const char *format; +}; + +#define MASK_OP (0x3FU << 26) +#define MASK_FUNC (0x3FU) +#define MASK_RS (0x1FU << 21) +#define MASK_RT (0x1FU << 16) +#define MASK_RD (0x1FU << 11) +#define MASK_SA (0x1FU << 6) + +#define MK_OP(mnemonic, format, op, func, extra_mask) { MASK_OP | (op ? 0 : MASK_FUNC) | extra_mask, ((unsigned)op << 26) | func, mnemonic, format } + +#define MK_OP_REGIMM(mnemonic, regop_mask, regop) { MASK_OP | (regop_mask << 16), (0x01U << 26) | (regop << 16), mnemonic, "s, p" } + + +#define MK_COPZ(z) { MASK_OP | (0x1U << 25), (0x1U << 25) | ((0x10U | z) << 26), "cop" #z, "F" } +#define MK_COP0_FUNC(mnemonic, func) { MASK_OP | (0x1U << 25) | MASK_FUNC, (0x10U << 26) | (0x1U << 25) | func, mnemonic, "" } + +#define MK_COPZ_XFER(z, mnemonic, format, xf) { MASK_OP | (0x1FU << 21), ((0x10U | z) << 26) | (xf << 21), mnemonic, format } +#define MK_COPZ_BCzx(z, x) { MASK_OP | (0x1BU << 21) | (0x01 << 16), ((0x10U | z) << 26) | (0x08 << 21) | (x << 16), (x ? "bc" #z "t" : "bc" #z "f"), "p" } +#define MK_COPZ_BC(z) MK_COPZ_BCzx(z, 0), MK_COPZ_BCzx(z, 1) + +#define MK_GTE(mnemonic, format, func) { MASK_OP | (0x1U << 25) | MASK_FUNC, (0x1U << 25) | (0x12U << 26) | func, mnemonic, format } + +static OpEntry ops[] = +{ + MK_OP("nop", "", 0, 0, MASK_RT | MASK_RD | MASK_SA), + + // + // + // + MK_OP("sll", "d, t, a", 0, 0, 0), + MK_OP("srl", "d, t, a", 0, 2, 0), + MK_OP("sra", "d, t, a", 0, 3, 0), + + MK_OP("sllv", "d, t, s", 0, 4, 0), + MK_OP("srlv", "d, t, s", 0, 6, 0), + MK_OP("srav", "d, t, s", 0, 7, 0), + + MK_OP("jr", "s", 0, 8, 0), + MK_OP("jalr", "d, s", 0, 9, 0), + + MK_OP("syscall", "", 0, 12, 0), // TODO + MK_OP("break", "", 0, 13, 0), // TODO + + MK_OP("mfhi", "d", 0, 16, 0), + MK_OP("mthi", "s", 0, 17, 0), + MK_OP("mflo", "d", 0, 18, 0), + MK_OP("mtlo", "s", 0, 19, 0), + + MK_OP("mult", "s, t", 0, 24, 0), + MK_OP("multu", "s, t", 0, 25, 0), + MK_OP("div", "s, t", 0, 26, 0), + MK_OP("divu", "s, t", 0, 27, 0), + + MK_OP("add", "d, s, t", 0, 32, 0), + MK_OP("addu", "d, s, t", 0, 33, 0), + MK_OP("sub", "d, s, t", 0, 34, 0), + MK_OP("subu", "d, s, t", 0, 35, 0), + MK_OP("and", "d, s, t", 0, 36, 0), + MK_OP("or", "d, s, t", 0, 37, 0), + MK_OP("xor", "d, s, t", 0, 38, 0), + MK_OP("nor", "d, s, t", 0, 39, 0), + MK_OP("slt", "d, s, t", 0, 42, 0), + MK_OP("sltu", "d, s, t", 0, 43, 0), + + // keep *al before the non-linking versions, due to mask setup. + MK_OP_REGIMM("bgezal", 0x1F, 0x11), + MK_OP_REGIMM("bltzal", 0x1F, 0x10), + + MK_OP_REGIMM("bgez", 0x01, 0x01), + MK_OP_REGIMM("bltz", 0x00, 0x00), + + + MK_OP("j", "P", 2, 0, 0), + MK_OP("jal", "P", 3, 0, 0), + + MK_OP("beq", "s, t, p", 4, 0, 0), + MK_OP("bne", "s, t, p", 5, 0, 0), + MK_OP("blez", "s, p", 6, 0, 0), + MK_OP("bgtz", "s, p", 7, 0, 0), + + MK_OP("addi", "t, s, i", 8, 0, 0), + MK_OP("addiu", "t, s, i", 9, 0, 0), + MK_OP("slti", "t, s, i", 10, 0, 0), + MK_OP("sltiu", "t, s, i", 11, 0, 0), + + MK_OP("andi", "t, s, z", 12, 0, 0), + + MK_OP("ori", "t, s, z", 13, 0, 0), + MK_OP("xori", "t, s, z", 14, 0, 0), + MK_OP("lui", "t, z", 15, 0, 0), + + MK_COPZ_XFER(0, "mfc0", "t, 0", 0x00), + MK_COPZ_XFER(1, "mfc1", "t, ?", 0x00), + MK_COPZ_XFER(2, "mfc2", "t, g", 0x00), + MK_COPZ_XFER(3, "mfc3", "t, ?", 0x00), + + MK_COPZ_XFER(0, "mtc0", "t, 0", 0x04), + MK_COPZ_XFER(1, "mtc1", "t, ?", 0x04), + MK_COPZ_XFER(2, "mtc2", "t, g", 0x04), + MK_COPZ_XFER(3, "mtc3", "t, ?", 0x04), + + MK_COPZ_XFER(0, "cfc0", "t, ?", 0x02), + MK_COPZ_XFER(1, "cfc1", "t, ?", 0x02), + MK_COPZ_XFER(2, "cfc2", "t, G", 0x02), + MK_COPZ_XFER(3, "cfc3", "t, ?", 0x02), + + MK_COPZ_XFER(0, "ctc0", "t, ?", 0x06), + MK_COPZ_XFER(1, "ctc1", "t, ?", 0x06), + MK_COPZ_XFER(2, "ctc2", "t, G", 0x06), + MK_COPZ_XFER(3, "ctc3", "t, ?", 0x06), + + MK_COPZ_BC(0), + MK_COPZ_BC(1), + MK_COPZ_BC(2), + MK_COPZ_BC(3), + + // COP0 stuff here + MK_COP0_FUNC("rfe", 0x10), + + MK_OP("lwc0", "?, i(s)", 0x30, 0, 0), + MK_OP("lwc1", "?, i(s)", 0x31, 0, 0), + MK_OP("lwc2", "h, i(s)", 0x32, 0, 0), + MK_OP("lwc3", "?, i(s)", 0x33, 0, 0), + + MK_OP("swc0", "?, i(s)", 0x38, 0, 0), + MK_OP("swc1", "?, i(s)", 0x39, 0, 0), + MK_OP("swc2", "h, i(s)", 0x3A, 0, 0), + MK_OP("swc3", "?, i(s)", 0x3B, 0, 0), + + MK_OP("lb", "t, i(s)", 0x20, 0, 0), + MK_OP("lh", "t, i(s)", 0x21, 0, 0), + MK_OP("lwl", "t, i(s)", 0x22, 0, 0), + MK_OP("lw", "t, i(s)", 0x23, 0, 0), + MK_OP("lbu", "t, i(s)", 0x24, 0, 0), + MK_OP("lhu", "t, i(s)", 0x25, 0, 0), + MK_OP("lwr", "t, i(s)", 0x26, 0, 0), + + MK_OP("sb", "t, i(s)", 0x28, 0, 0), + MK_OP("sh", "t, i(s)", 0x29, 0, 0), + MK_OP("swl", "t, i(s)", 0x2A, 0, 0), + MK_OP("sw", "t, i(s)", 0x2B, 0, 0), + MK_OP("swr", "t, i(s)", 0x2E, 0, 0), + + // + // GTE specific instructions + // + // sf mx v cv lm + // + MK_GTE("rtps", "#sf# #lm#", 0x00), + MK_GTE("rtps", "#sf# #lm#", 0x01), + MK_GTE("nclip", "", 0x06), + MK_GTE("op", "#sf# #lm#", 0x0C), + + MK_GTE("dpcs", "#sf# #lm#", 0x10), + MK_GTE("intpl", "#sf# #lm#", 0x11), + MK_GTE("mvmva", "#sf# #mx# #v# #cv# #lm#", 0x12), + MK_GTE("ncds", "#sf# #lm#", 0x13), + MK_GTE("cdp", "#sf# #lm#", 0x14), + MK_GTE("ncdt", "#sf# #lm#", 0x16), + MK_GTE("dcpl", "#sf# #lm#", 0x1A), + MK_GTE("nccs", "#sf# #lm#", 0x1B), + MK_GTE("cc", "#sf# #lm#", 0x1C), + MK_GTE("ncs", "#sf# #lm#", 0x1E), + MK_GTE("nct", "#sf# #lm#", 0x20), + MK_GTE("sqr", "#sf# #lm#", 0x28), + MK_GTE("dcpl", "#sf# #lm#", 0x29), + MK_GTE("dpct", "#sf# #lm#", 0x2A), + MK_GTE("avsz3", "", 0x2D), + MK_GTE("avsz4", "", 0x2E), + MK_GTE("rtpt", "#sf# #lm#", 0x30), + MK_GTE("gpf", "#sf# #lm#", 0x3D), + MK_GTE("gpl", "#sf# #lm#", 0x3E), + MK_GTE("ncct", "#sf# #lm#", 0x3F), + + + // + // + // + MK_COPZ(0), + MK_COPZ(1), + MK_COPZ(2), + MK_COPZ(3), + + { 0, 0, NULL, NULL } +}; + +std::string DisassembleMIPS(uint32 PC, uint32 instr) +{ + std::string ret = "UNKNOWN"; + unsigned int rs = (instr >> 21) & 0x1F; + unsigned int rt = (instr >> 16) & 0x1F; + unsigned int rd = (instr >> 11) & 0x1F; + unsigned int shamt = (instr >> 6) & 0x1F; + unsigned int immediate = (int32)(int16)(instr & 0xFFFF); + unsigned int immediate_ze = (instr & 0xFFFF); + unsigned int jt = instr & ((1 << 26) - 1); + + static const char *gpr_names[32] = + { + "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra" + }; + + static const char *cop0_names[32] = + { + "CPR0", "CPR1", "CPR2", "BPC", "CPR4", "BDA", "TAR", "DCIC", "BADVA", "BDAM", "CPR10", "BPCM", "SR", "CAUSE", "EPC", "PRID", + "CPR16", "CPR17", "CPR18", "CPR19", "CPR20", "CPR21", "CPR22", "CPR23", "CPR24", "CPR25", "CPR26", "CPR27", "CPR28", "CPR29", "CPR30", "CPR31" + }; + + static const char *gte_cr_names[32] = + { + "R11R12", "R13R21", "R22R23", "R31R32", "R33", "TRX", "TRY", "TRZ", "L11L12", "L13L21", "L22L23", "L31L32", "L33", "RBK", "GBK", "BBK", + "LR1LR2", "LR3LG1", "LG2LG3", "LB1LB2", "LB3", "RFC", "GFC", "BFC", "OFX", "OFY", "H", "DQA", "DQB", "ZSF3", "ZSF4", "FLAG" + }; + + static const char *gte_dr_names[32] = + { + "VXY0", "VZ0", "VXY1", "VZ1", "VXY2", "VZ2", "RGB", "OTZ", "IR0", "IR1", "IR2", "IR3", "SXY0", "SXY1", "SXY2", "SXYP", + "SZ0", "SZ1", "SZ2", "SZ3", "RGB0", "RGB1", "RGB2", "RES1", "MAC0", "MAC1", "MAC2", "MAC3", "IRGB", "ORGB", "LZCS", "LZCR" + }; + + OpEntry *op = ops; + + while(op->mnemonic) + { + if((instr & op->mask) == op->value) + { + // a = shift amount + // s = rs + // t = rt + // d = rd + // i = immediate + // z = immediate, zero-extended + // p = PC + 4 + immediate + // P = ((PC + 4) & 0xF0000000) | (26bitval << 2) + // + // 0 = rd(cop0 registers) + // c = rd(copz data registers) + // C = rd(copz control registers) + // g = rd(GTE data registers) + // G = rd(GTE control registers) + // h = rt(GTE data registers) + + char s_a[16]; + char s_i[16]; + char s_z[16]; + char s_p[16]; + char s_P[16]; + char s_c[16]; + char s_C[16]; + + trio_snprintf(s_a, sizeof(s_a), "%d", shamt); + + if(immediate < 0) + trio_snprintf(s_i, sizeof(s_i), "%d", immediate); + else + trio_snprintf(s_i, sizeof(s_i), "0x%04x", (uint32)immediate); + + trio_snprintf(s_z, sizeof(s_z), "0x%04x", immediate_ze); + + trio_snprintf(s_p, sizeof(s_p), "0x%08x", PC + 4 + (immediate << 2)); + + trio_snprintf(s_P, sizeof(s_P), "0x%08x", ((PC + 4) & 0xF0000000) | (jt << 2)); + + trio_snprintf(s_c, sizeof(s_c), "CPR%d", rd); + trio_snprintf(s_C, sizeof(s_C), "CCR%d", rd); + + ret = std::string(op->mnemonic); + ret.append(10 - ret.size(), ' '); + + for(unsigned int i = 0; i < strlen(op->format); i++) + { + switch(op->format[i]) + { + case '#': + // sf mx v cv lm + { + char as[16]; + + as[0] = 0; + if(!strncmp(&op->format[i], "#sf#", 4)) + { + i += 3; + trio_snprintf(as, 16, "sf=%d", (int)(bool)(instr & (1 << 19))); + } + else if(!strncmp(&op->format[i], "#mx#", 4)) + { + i += 3; + trio_snprintf(as, 16, "mx=%d", (instr >> 17) & 0x3); + } + else if(!strncmp(&op->format[i], "#v#", 3)) + { + i += 2; + trio_snprintf(as, 16, "v=%d", (instr >> 15) & 0x3); + } + else if(!strncmp(&op->format[i], "#cv#", 4)) + { + i += 3; + trio_snprintf(as, 16, "cv=%d", (instr >> 13) & 0x3); + } + else if(!strncmp(&op->format[i], "#lm#", 4)) + { + i += 3; + trio_snprintf(as, 16, "lm=%d", (int)(bool)(instr & (1 << 10))); + } + ret.append(as); + } + break; + case 'F': + { + char s_F[16]; + + trio_snprintf(s_F, 16, "0x%07x", instr & 0x1FFFFFF); + ret.append(s_F); + } + break; + + case 'h': + ret.append(gte_dr_names[rt]); + break; + + case 'g': + ret.append(gte_dr_names[rd]); + break; + + case 'G': + ret.append(gte_cr_names[rd]); + break; + + case '0': + ret.append(cop0_names[rd]); + break; + + case 'c': + ret.append(s_c); + break; + + case 'C': + ret.append(s_C); + break; + + case 'a': + ret.append(s_a); + break; + + case 'i': + ret.append(s_i); + break; + + case 'z': + ret.append(s_z); + break; + + case 'p': + ret.append(s_p); + break; + + case 'P': + ret.append(s_P); + break; + + case 's': + ret.append(gpr_names[rs]); + break; + + case 't': + ret.append(gpr_names[rt]); + break; + + case 'd': + ret.append(gpr_names[rd]); + break; + + default: + ret.append(1, op->format[i]); + break; + } + } + break; + } + op++; + } + + return(ret); +} + +} + diff --git a/Mednafen/mednafen/psx/dis.h b/Mednafen/mednafen/psx/dis.h new file mode 100644 index 0000000000..d264894952 --- /dev/null +++ b/Mednafen/mednafen/psx/dis.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_PSX_DIS_H +#define __MDFN_PSX_DIS_H + +namespace MDFN_IEN_PSX +{ + +std::string DisassembleMIPS(uint32 PC, uint32 instr); + +} + +#endif diff --git a/Mednafen/mednafen/psx/dma.cpp b/Mednafen/mednafen/psx/dma.cpp new file mode 100644 index 0000000000..ebe3f27000 --- /dev/null +++ b/Mednafen/mednafen/psx/dma.cpp @@ -0,0 +1,796 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "mdec.h" +#include "cdc.h" +#include "spu.h" + +/* Notes: + + Channel 4(SPU): + Write: + Doesn't seem to work properly with CHCR=0x01000001 + Hung when CHCR=0x11000601 + + Channel 6: + DMA hangs if D28 of CHCR is 0? + D1 did not have an apparent effect. + +*/ + +enum +{ + CH_MDEC_IN = 0, + CH_MDEC_OUT = 1, + CH_GPU = 2, + CH_CDC = 3, + CH_SPU = 4, + CH_FIVE = 5, + CH_OT = 6, +}; + + +// RunChannels(128 - whatevercounter); +// +// GPU next event, std::max<128, wait_time>, or something similar, for handling FIFO. + +namespace MDFN_IEN_PSX +{ + +static int32 DMACycleCounter; + +static uint32 DMAControl; +static uint32 DMAIntControl; +static uint8 DMAIntStatus; +static bool IRQOut; + +struct Channel +{ + uint32 BaseAddr; + uint32 BlockControl; + uint32 ChanControl; + + // + // + // + uint32 CurAddr; + uint16 WordCounter; + + // + // + int32 ClockCounter; +}; + +static Channel DMACH[7]; +static pscpu_timestamp_t lastts; + + +// static const char *PrettyChannelNames[7] = { "MDEC IN", "MDEC OUT", "GPU", "CDC", "SPU", "PIO", "OTC" }; + +void DMA_Init(void) +{ + +} + +void DMA_Kill(void) +{ + +} + +static INLINE void RecalcIRQOut(void) +{ + bool irqo; + + irqo = (bool)DMAIntStatus; + irqo &= (DMAIntControl >> 23) & 1; + irqo |= (DMAIntControl >> 15) & 1; + + IRQOut = irqo; + IRQ_Assert(IRQ_DMA, irqo); +} + +void DMA_ResetTS(void) +{ + lastts = 0; +} + +void DMA_Power(void) +{ + lastts = 0; + + memset(DMACH, 0, sizeof(DMACH)); + + DMACycleCounter = 128; + + DMAControl = 0; + DMAIntControl = 0; + DMAIntStatus = 0; + RecalcIRQOut(); +} + +static INLINE bool ChCan(const unsigned ch, const uint32 CRModeCache) +{ + switch(ch) + { + default: + abort(); + + case CH_MDEC_IN: + return(MDEC_DMACanWrite()); + + case CH_MDEC_OUT: + return(MDEC_DMACanRead()); + + case CH_GPU: + if(CRModeCache & 0x1) + return(GPU->DMACanWrite()); + else + return(true); + + case CH_CDC: + return(true); + + case CH_SPU: + return(true); + + case CH_FIVE: + return(false); + + case CH_OT: + return((bool)(DMACH[ch].ChanControl & (1U << 28))); + } +} + +static void RecalcHalt(void) +{ + bool Halt = false; + unsigned ch = 0; + + for(ch = 0; ch < 7; ch++) + { + if(DMACH[ch].ChanControl & (1U << 24)) + { + if(!(DMACH[ch].ChanControl & (7U << 8))) + { + if(DMACH[ch].WordCounter > 0) + { + Halt = true; + break; + } + } + +#if 0 + if(DMACH[ch].ChanControl & 0x100) // DMA doesn't hog the bus when this bit is set, though the DMA takes longer. + continue; + + if(ch == 4 || ch == 5) // Not sure if these channels will typically hog the bus or not...investigate. + continue; + + if(!(DMACH[ch].ChanControl & (1U << 10))) // Not sure about HOGGERYNESS with linked-list mode, and it likely wouldn't work well either in regards + // to GPU commands due to the rather large DMA update granularity. + { + if((DMACH[ch].WordCounter > 0) || ChCan(ch, DMACH[ch].ChanControl & 0x1)) + { + Halt = true; + break; + } + } +#endif + } + } + +#if 0 + if((DMACH[0].WordCounter || (DMACH[0].ChanControl & (1 << 24))) && (DMACH[0].ChanControl & 0x200) /*&& MDEC_DMACanWrite()*/) + Halt = true; + + if((DMACH[1].WordCounter || (DMACH[1].ChanControl & (1 << 24))) && (DMACH[1].ChanControl & 0x200) && (DMACH[1].WordCounter || MDEC_DMACanRead())) + Halt = true; + + if((DMACH[2].WordCounter || (DMACH[2].ChanControl & (1 << 24))) && (DMACH[2].ChanControl & 0x200) && ((DMACH[2].ChanControl & 0x1) && (DMACH[2].WordCounter || GPU->DMACanWrite()))) + Halt = true; + + if((DMACH[3].WordCounter || (DMACH[3].ChanControl & (1 << 24))) && !(DMACH[3].ChanControl & 0x100)) + Halt = true; + + if(DMACH[6].WordCounter || (DMACH[6].ChanControl & (1 << 24))) + Halt = true; +#endif + + //printf("Halt: %d\n", Halt); + + if(!Halt && (DMACH[2].ChanControl & (1U << 24)) && ((DMACH[2].ChanControl & 0x700) == 0x200) && ChCan(2, DMACH[2].ChanControl)) + { + unsigned tmp = DMACH[2].BlockControl & 0xFFFF; + + if(tmp > 0) + tmp--; + + PSX_SetDMACycleSteal(tmp); + } + else + PSX_SetDMACycleSteal(0); + + CPU->SetHalt(Halt); +} + + +static INLINE void ChRW(const unsigned ch, const uint32 CRModeCache, uint32 *V, uint32 *offset) +{ + unsigned extra_cyc_overhead = 0; + + switch(ch) + { + default: + abort(); + break; + + case CH_MDEC_IN: + if(CRModeCache & 0x1) + MDEC_DMAWrite(*V); + else + *V = 0; + break; + + case CH_MDEC_OUT: + if(CRModeCache & 0x1) + { + } + else + *V = MDEC_DMARead(offset); + break; + + case CH_GPU: + if(CRModeCache & 0x1) + GPU->WriteDMA(*V); + else + *V = GPU->ReadDMA(); + break; + + case CH_CDC: + // 0x1f801018 affects CDC DMA timing. +#if 0 + if(CRModeCache & 0x100) // For CDC DMA(at least): When this bit is set, DMA controller doesn't appear to hog the (RAM?) bus. + { + if(CRModeCache & 0x00400000) // For CDC DMA(at least): When this bit is set, DMA controller appears to get even less bus time(or has a lower priority??) + { + DMACH[ch].ClockCounter -= 44 * 20 / 12; + } + else + { + DMACH[ch].ClockCounter -= 29 * 20 / 12; + } + } + else + { + DMACH[ch].ClockCounter -= 23 * 20 / 12; // (23 + 1) = 24. (Though closer to 24.5 or 24.4 on average per tests on a PS1) + } +#endif + if(CRModeCache & 0x1) + { + } + else + { + extra_cyc_overhead = 8; // FIXME: Test. + *V = CDC->DMARead(); // Note: Legend of Mana's opening movie is sensitive to DMA timing, including CDC. + } + break; + + case CH_SPU: + // 0x1f801014 affects SPU DMA timing. + // Wild conjecture about 0x1f801014: + // + // & 0x0000000F + // & 0x000001E0 --- Used if (& 0x20000000) == 0? + // & 0x00001000 --- Double total bus cycle time if value == 0? + // & 0x0f000000 --- (value << 1) 33MHz cycles, bus cycle extension(added to 4?)? + // & 0x20000000 --- + // + // + // TODO?: SPU DMA will "complete" much faster if there's a mismatch between the CHCR read/write mode bit and the SPU control register DMA mode. + // + // + // Investigate: SPU DMA doesn't seem to work right if the value written to 0x1F801DAA doesn't have the upper bit set to 1(0x8000) on a PS1. + + extra_cyc_overhead = 47; // Should be closer to 69, average, but actual timing is...complicated. + + if(CRModeCache & 0x1) + SPU->WriteDMA(*V); + else + *V = SPU->ReadDMA(); + break; + + case CH_FIVE: + if(CRModeCache & 0x1) + { + } + else + { + *V = 0; + } + break; + + case CH_OT: + if(DMACH[ch].WordCounter == 1) + *V = 0xFFFFFF; + else + *V = (DMACH[ch].CurAddr - 4) & 0x1FFFFF; + break; + } + + // GROSS APPROXIMATION, shoehorning multiple effects together, TODO separate(especially SPU and CDC) + DMACH[ch].ClockCounter -= std::max(extra_cyc_overhead, (CRModeCache & 0x100) ? 7 : 0); +} + +// +// Remember to handle an end condition on the same iteration of the while(DMACH[ch].ClockCounter > 0) loop that caused it, +// otherwise RecalcHalt() might take the CPU out of a halted state before the end-of-DMA is signaled(especially a problem considering our largeish +// DMA update timing granularity). +// +static INLINE void RunChannelI(const unsigned ch, const uint32 CRModeCache, int32 clocks) +{ + //const uint32 dc = (DMAControl >> (ch * 4)) & 0xF; + + DMACH[ch].ClockCounter += clocks; + + while(MDFN_LIKELY(DMACH[ch].ClockCounter > 0)) + { + if(DMACH[ch].WordCounter == 0) // Begin WordCounter reload. + { + if(!(DMACH[ch].ChanControl & (1 << 24))) // Needed for the forced-DMA-stop kludge(see DMA_Write()). + break; + + if(!ChCan(ch, CRModeCache)) + break; + + DMACH[ch].CurAddr = DMACH[ch].BaseAddr; + + if(CRModeCache & (1U << 10)) + { + uint32 header; + + if(MDFN_UNLIKELY(DMACH[ch].CurAddr & 0x800000)) + { + DMACH[ch].ChanControl &= ~(0x11 << 24); + DMAIntControl |= 0x8000; + RecalcIRQOut(); + break; + } + + header = MainRAM.ReadU32(DMACH[ch].CurAddr & 0x1FFFFC); + DMACH[ch].CurAddr = (DMACH[ch].CurAddr + 4) & 0xFFFFFF; + + DMACH[ch].WordCounter = header >> 24; + DMACH[ch].BaseAddr = header & 0xFFFFFF; + + // printf to debug Soul Reaver ;) + //if(DMACH[ch].WordCounter > 0x10) + // printf("What the lala? 0x%02x @ 0x%08x\n", DMACH[ch].WordCounter, DMACH[ch].CurAddr - 4); + + if(DMACH[ch].WordCounter) + DMACH[ch].ClockCounter -= 15; + else + DMACH[ch].ClockCounter -= 10; + + goto SkipPayloadStuff; // 3 cheers for gluten-free spaghetticode(necessary because the newly-loaded WordCounter might be 0, and we actually + // want 0 to mean 0 and not 65536 in this context)! + } + else + { + DMACH[ch].WordCounter = DMACH[ch].BlockControl & 0xFFFF; + + if(CRModeCache & (1U << 9)) + { + if(ch == 2) // Technically should apply to all channels, but since we don't implement CPU read penalties for channels other than 2 yet, it's like this to avoid making DMA longer than what games can handle. + DMACH[ch].ClockCounter -= 7; + + DMACH[ch].BlockControl = (DMACH[ch].BlockControl & 0xFFFF) | ((DMACH[ch].BlockControl - (1U << 16)) & 0xFFFF0000); + } + } + } // End WordCounter reload. + else if(CRModeCache & 0x100) // BLARGH BLARGH FISHWHALE + { + //printf("LoadWC: %u(oldWC=%u)\n", DMACH[ch].BlockControl & 0xFFFF, DMACH[ch].WordCounter); + //MDFN_DispMessage("SPOOOON\n"); + DMACH[ch].CurAddr = DMACH[ch].BaseAddr; + DMACH[ch].WordCounter = DMACH[ch].BlockControl & 0xFFFF; + } + + // + // Do the payload read/write + // + { + uint32 vtmp; + uint32 voffs = 0; + + if(MDFN_UNLIKELY(DMACH[ch].CurAddr & 0x800000)) + { + DMACH[ch].ChanControl &= ~(0x11 << 24); + DMAIntControl |= 0x8000; + RecalcIRQOut(); + break; + } + + if(CRModeCache & 0x1) + vtmp = MainRAM.ReadU32(DMACH[ch].CurAddr & 0x1FFFFC); + + ChRW(ch, CRModeCache, &vtmp, &voffs); + + if(!(CRModeCache & 0x1)) + MainRAM.WriteU32((DMACH[ch].CurAddr + (voffs << 2)) & 0x1FFFFC, vtmp); + } + + if(CRModeCache & 0x2) + DMACH[ch].CurAddr = (DMACH[ch].CurAddr - 4) & 0xFFFFFF; + else + DMACH[ch].CurAddr = (DMACH[ch].CurAddr + 4) & 0xFFFFFF; + + DMACH[ch].WordCounter--; + DMACH[ch].ClockCounter--; + + SkipPayloadStuff: ; + + if(CRModeCache & 0x100) // BLARGH BLARGH WHALEFISH + { + DMACH[ch].BaseAddr = DMACH[ch].CurAddr; + DMACH[ch].BlockControl = (DMACH[ch].BlockControl & 0xFFFF0000) | DMACH[ch].WordCounter; + //printf("SaveWC: %u\n", DMACH[ch].WordCounter); + } + + // + // Handle channel end condition: + // + if(DMACH[ch].WordCounter == 0) + { + bool ChannelEndTC = false; + + if(!(DMACH[ch].ChanControl & (1 << 24))) // Needed for the forced-DMA-stop kludge(see DMA_Write()). + break; + + switch((CRModeCache >> 9) & 0x3) + { + case 0x0: + ChannelEndTC = true; + break; + + case 0x1: + DMACH[ch].BaseAddr = DMACH[ch].CurAddr; + if((DMACH[ch].BlockControl >> 16) == 0) + ChannelEndTC = true; + break; + + case 0x2: + case 0x3: // Not sure about 0x3. + if(DMACH[ch].BaseAddr == 0xFFFFFF) + ChannelEndTC = true; + break; + } + + if(ChannelEndTC) + { + DMACH[ch].ChanControl &= ~(0x11 << 24); + if(DMAIntControl & (1U << (16 + ch))) + { + DMAIntStatus |= 1U << ch; + RecalcIRQOut(); + } + break; + } + } + } + + if(DMACH[ch].ClockCounter > 0) + DMACH[ch].ClockCounter = 0; +} + +static INLINE void RunChannel(pscpu_timestamp_t timestamp, int32 clocks, int ch) +{ + // Mask out the bits that the DMA controller will modify during the course of operation. + const uint32 CRModeCache = DMACH[ch].ChanControl &~(0x11 << 24); + + switch(ch) + { + default: abort(); + + case 0: + if(MDFN_LIKELY(CRModeCache == 0x00000201)) + RunChannelI(0, 0x00000201, clocks); + else + RunChannelI(0, CRModeCache, clocks); + break; + + case 1: + if(MDFN_LIKELY(CRModeCache == 0x00000200)) + RunChannelI(1, 0x00000200, clocks); + else + RunChannelI(1, CRModeCache, clocks); + break; + + case 2: + if(MDFN_LIKELY(CRModeCache == 0x00000401)) + RunChannelI(2, 0x00000401, clocks); + else if(MDFN_LIKELY(CRModeCache == 0x00000201)) + RunChannelI(2, 0x00000201, clocks); + else if(MDFN_LIKELY(CRModeCache == 0x00000200)) + RunChannelI(2, 0x00000200, clocks); + else + RunChannelI(2, CRModeCache, clocks); + break; + + case 3: + if(MDFN_LIKELY(CRModeCache == 0x00000000)) + RunChannelI(3, 0x00000000, clocks); + else if(MDFN_LIKELY(CRModeCache == 0x00000100)) + RunChannelI(3, 0x00000100, clocks); + else + RunChannelI(3, CRModeCache, clocks); + break; + + case 4: + if(MDFN_LIKELY(CRModeCache == 0x00000201)) + RunChannelI(4, 0x00000201, clocks); + else if(MDFN_LIKELY(CRModeCache == 0x00000200)) + RunChannelI(4, 0x00000200, clocks); + else + RunChannelI(4, CRModeCache, clocks); + break; + + case 5: + RunChannelI(5, CRModeCache, clocks); + break; + + case 6: + if(MDFN_LIKELY(CRModeCache == 0x00000002)) + RunChannelI(6, 0x00000002, clocks); + else + RunChannelI(6, CRModeCache, clocks); + break; + } +} + +static INLINE int32 CalcNextEvent(int32 next_event) +{ + if(DMACycleCounter < next_event) + next_event = DMACycleCounter; + + return(next_event); +} + +pscpu_timestamp_t DMA_Update(const pscpu_timestamp_t timestamp) +{ +// uint32 dc = (DMAControl >> (ch * 4)) & 0xF; + int32 clocks = timestamp - lastts; + lastts = timestamp; + + GPU->Update(timestamp); + MDEC_Run(clocks); + + RunChannel(timestamp, clocks, 0); + RunChannel(timestamp, clocks, 1); + RunChannel(timestamp, clocks, 2); + RunChannel(timestamp, clocks, 3); + RunChannel(timestamp, clocks, 4); + RunChannel(timestamp, clocks, 6); + + DMACycleCounter -= clocks; + while(DMACycleCounter <= 0) + DMACycleCounter += 128; + + RecalcHalt(); + + return(timestamp + CalcNextEvent(0x10000000)); +} + +#if 0 +static void CheckLinkedList(uint32 addr) +{ + std::map zoom; + + do + { + if(zoom[addr]) + { + printf("Bad linked list: 0x%08x\n", addr); + break; + } + zoom[addr] = 1; + + uint32 header = MainRAM.ReadU32(addr & 0x1FFFFC); + + addr = header & 0xFFFFFF; + + } while(addr != 0xFFFFFF && !(addr & 0x800000)); +} +#endif + +void DMA_Write(const pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + int ch = (A & 0x7F) >> 4; + + //if(ch == 2 || ch == 7) + //PSX_WARNING("[DMA] Write: %08x %08x, DMAIntStatus=%08x", A, V, DMAIntStatus); + + // FIXME if we ever have "accurate" bus emulation + V <<= (A & 3) * 8; + + DMA_Update(timestamp); + + if(ch == 7) + { + switch(A & 0xC) + { + case 0x0: //fprintf(stderr, "Global DMA control: 0x%08x\n", V); + DMAControl = V; + RecalcHalt(); + break; + + case 0x4: + DMAIntControl = V & 0x00ff803f; + DMAIntStatus &= ~(V >> 24); + RecalcIRQOut(); + break; + + default: PSX_WARNING("[DMA] Unknown write: %08x %08x", A, V); + break; + } + return; + } + switch(A & 0xC) + { + case 0x0: DMACH[ch].BaseAddr = V & 0xFFFFFF; + break; + + case 0x4: DMACH[ch].BlockControl = V; + break; + + case 0xC: + case 0x8: + { + uint32 OldCC = DMACH[ch].ChanControl; + + //printf("CHCR: %u, %08x --- 0x%08x\n", ch, V, DMACH[ch].BlockControl); + // + // Kludge for DMA timing granularity and other issues. Needs to occur before setting all bits of ChanControl to the new value, to accommodate the + // case of a game cancelling DMA and changing the type of DMA(read/write, etc.) at the same time. + // + if((DMACH[ch].ChanControl & (1 << 24)) && !(V & (1 << 24))) + { + DMACH[ch].ChanControl &= ~(1 << 24); // Clear bit before RunChannel(), so it will only finish the block it's on at most. + RunChannel(timestamp, 128 * 16, ch); + DMACH[ch].WordCounter = 0; + +#if 0 // TODO(maybe, need to work out worst-case performance for abnormally/brokenly large block sizes) + DMACH[ch].ClockCounter = (1 << 30); + RunChannel(timestamp, 1, ch); + DMACH[ch].ClockCounter = 0; +#endif + PSX_WARNING("[DMA] Forced stop for channel %d -- scanline=%d", ch, GPU->GetScanlineNum()); + //MDFN_DispMessage("[DMA] Forced stop for channel %d", ch); + } + + if(ch == 6) + DMACH[ch].ChanControl = (V & 0x51000000) | 0x2; + else + DMACH[ch].ChanControl = V & 0x71770703; + + if(!(OldCC & (1 << 24)) && (V & (1 << 24))) + { + //if(ch == 0 || ch == 1) + // PSX_WARNING("[DMA] Started DMA for channel=%d --- CHCR=0x%08x --- BCR=0x%08x --- scanline=%d", ch, DMACH[ch].ChanControl, DMACH[ch].BlockControl, GPU->GetScanlineNum()); + + DMACH[ch].WordCounter = 0; + DMACH[ch].ClockCounter = 0; + + // + // Viewpoint starts a short MEM->GPU LL DMA and apparently has race conditions that can cause a crash if it doesn't finish almost immediately( + // or at least very quickly, which the current DMA granularity has issues with, so run the channel ahead a bit to take of this issue and potentially + // games with similar issues). + // + // Though, Viewpoint isn't exactly a good game, so maybe we shouldn't bother? ;) + // + // Also, it's needed for RecalcHalt() to work with some semblance of workiness. + // + RunChannel(timestamp, 64, ch); //std::max(128 - DMACycleCounter, 1)); //64); //1); //128 - DMACycleCounter); + } + + RecalcHalt(); + } + break; + } + PSX_SetEventNT(PSX_EVENT_DMA, timestamp + CalcNextEvent(0x10000000)); +} + +uint32 DMA_Read(const pscpu_timestamp_t timestamp, uint32 A) +{ + int ch = (A & 0x7F) >> 4; + uint32 ret = 0; + + if(ch == 7) + { + switch(A & 0xC) + { + default: PSX_WARNING("[DMA] Unknown read: %08x", A); + break; + + case 0x0: ret = DMAControl; + break; + + case 0x4: ret = DMAIntControl | (DMAIntStatus << 24) | (IRQOut << 31); + break; + } + } + else switch(A & 0xC) + { + case 0x0: ret = DMACH[ch].BaseAddr; + break; + + case 0x4: ret = DMACH[ch].BlockControl; + break; + + case 0xC: + case 0x8: ret = DMACH[ch].ChanControl; + break; + + } + + ret >>= (A & 3) * 8; + + //PSX_WARNING("[DMA] Read: %08x %08x", A, ret); + + return(ret); +} + + +void DMA_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(DMACycleCounter), + SFVAR(DMAControl), + SFVAR(DMAIntControl), + SFVAR(DMAIntStatus), + SFVAR(IRQOut), + +#define SFDMACH(n) SFVARN(DMACH[n].BaseAddr, #n "BaseAddr"), \ + SFVARN(DMACH[n].BlockControl, #n "BlockControl"), \ + SFVARN(DMACH[n].ChanControl, #n "ChanControl"), \ + SFVARN(DMACH[n].CurAddr, #n "CurAddr"), \ + SFVARN(DMACH[n].WordCounter, #n "WordCounter"), \ + SFVARN(DMACH[n].ClockCounter, #n "ClockCounter") + + SFDMACH(0), + SFDMACH(1), + SFDMACH(2), + SFDMACH(3), + SFDMACH(4), + SFDMACH(5), + SFDMACH(6), + +#undef SFDMACH + + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, StateRegs, "DMA"); + + if(load) + { + + } +} + + +} diff --git a/Mednafen/mednafen/psx/dma.h b/Mednafen/mednafen/psx/dma.h new file mode 100644 index 0000000000..e5bcdf52da --- /dev/null +++ b/Mednafen/mednafen/psx/dma.h @@ -0,0 +1,22 @@ +#ifndef __MDFN_PSX_DMA_H +#define __MDFN_PSX_DMA_H + +namespace MDFN_IEN_PSX +{ + +pscpu_timestamp_t DMA_Update(const pscpu_timestamp_t timestamp); +void DMA_Write(const pscpu_timestamp_t timestamp, uint32 A, uint32 V); +uint32 DMA_Read(const pscpu_timestamp_t timestamp, uint32 A); + +void DMA_ResetTS(void); + +void DMA_Power(void) MDFN_COLD; + +void DMA_Init(void) MDFN_COLD; +void DMA_Kill(void) MDFN_COLD; + +void DMA_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +} + +#endif diff --git a/Mednafen/mednafen/psx/frontio.cpp b/Mednafen/mednafen/psx/frontio.cpp new file mode 100644 index 0000000000..3b6979e5fc --- /dev/null +++ b/Mednafen/mednafen/psx/frontio.cpp @@ -0,0 +1,1056 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "frontio.h" + +#include "input/gamepad.h" +#include "input/dualanalog.h" +#include "input/dualshock.h" +#include "input/mouse.h" +#include "input/negcon.h" +#include "input/guncon.h" +#include "input/justifier.h" + +#include "input/memcard.h" + +#include "input/multitap.h" + +#define PSX_FIODBGINFO(format, ...) { /* printf(format " -- timestamp=%d -- PAD temp\n", ## __VA_ARGS__, timestamp); */ } + +namespace MDFN_IEN_PSX +{ + +InputDevice::InputDevice() : chair_r(0), chair_g(0), chair_b(0), draw_chair(0), chair_x(-1000), chair_y(-1000) +{ +} + +InputDevice::~InputDevice() +{ +} + +void InputDevice::Power(void) +{ +} + +void InputDevice::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + +} + + +void InputDevice::Update(const pscpu_timestamp_t timestamp) +{ + +} + +void InputDevice::ResetTS(void) +{ + +} + +void InputDevice::SetAMCT(bool) +{ + +} + +void InputDevice::SetCrosshairsColor(uint32 color) +{ + chair_r = (color >> 16) & 0xFF; + chair_g = (color >> 8) & 0xFF; + chair_b = (color >> 0) & 0xFF; + + draw_chair = (color != (1 << 24)); +} + +void InputDevice::DrawCrosshairs(uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock) +{ + if(draw_chair && chair_y >= -8 && chair_y <= 8) + { + int32 ic; + int32 x_start, x_bound; + + if(chair_y == 0) + ic = pix_clock / 762925; + else + ic = 0; + + x_start = std::max(0, chair_x - ic); + x_bound = std::min(width, chair_x + ic + 1); + + for(int32 x = x_start; x < x_bound; x++) + { + int r, g, b, a; + int nr, ng, nb; + + format->DecodeColor(pixels[x], r, g, b, a); + + nr = (r + chair_r * 3) >> 2; + ng = (g + chair_g * 3) >> 2; + nb = (b + chair_b * 3) >> 2; + + if((int)((abs(r - nr) - 0x40) & (abs(g - ng) - 0x40) & (abs(b - nb) - 0x40)) < 0) + { + if((nr | ng | nb) & 0x80) + { + nr >>= 1; + ng >>= 1; + nb >>= 1; + } + else + { + nr ^= 0x80; + ng ^= 0x80; + nb ^= 0x80; + } + } + + pixels[x] = format->MakeColor(nr, ng, nb, a); + } + } +} + +bool InputDevice::RequireNoFrameskip(void) +{ + return(false); +} + +pscpu_timestamp_t InputDevice::GPULineHook(const pscpu_timestamp_t timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) +{ + return(PSX_EVENT_MAXTS); +} + + +void InputDevice::UpdateInput(const void *data) +{ +} + + +void InputDevice::SetDTR(bool new_dtr) +{ + +} + +bool InputDevice::GetDSR(void) +{ + return(0); +} + +bool InputDevice::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + dsr_pulse_delay = 0; + + return(1); +} + +uint32 InputDevice::GetNVSize(void) const +{ + return(0); +} + +const uint8* InputDevice::ReadNV(void) const +{ + return NULL; +} + +void InputDevice::WriteNV(const uint8 *buffer, uint32 offset, uint32 count) +{ + +} + +uint64 InputDevice::GetNVDirtyCount(void) const +{ + return(0); +} + +void InputDevice::ResetNVDirtyCount(void) +{ + +} + +static unsigned EP_to_MP(bool emulate_multitap[2], unsigned ep) +{ + if(!emulate_multitap[0] && emulate_multitap[1]) + { + if(ep == 0 || ep >= 5) + return(0); + else + return(1); + } + else + return(ep >= 4); +} + +static INLINE unsigned EP_to_SP(bool emulate_multitap[2], unsigned ep) +{ + if(!emulate_multitap[0] && emulate_multitap[1]) + { + if(ep == 0) + return(0); + else if(ep < 5) + return(ep - 1); + else + return(ep - 4); + } + else + return(ep & 0x3); +} + +void FrontIO::MapDevicesToPorts(void) +{ + if(emulate_multitap[0] && emulate_multitap[1]) + { + for(unsigned i = 0; i < 2; i++) + { + Ports[i] = PossibleMultitaps[i].get(); + MCPorts[i] = PossibleNone.get(); + } + } + else if(!emulate_multitap[0] && emulate_multitap[1]) + { + Ports[0] = Devices[0]; + MCPorts[0] = MCDevices[0]; + + Ports[1] = PossibleMultitaps[1].get(); + MCPorts[1] = PossibleNone.get(); + } + else if(emulate_multitap[0] && !emulate_multitap[1]) + { + Ports[0] = PossibleMultitaps[0].get(); + MCPorts[0] = PossibleNone.get(); + + Ports[1] = Devices[4]; + MCPorts[1] = MCDevices[4]; + } + else + { + for(unsigned i = 0; i < 2; i++) + { + Ports[i] = Devices[i]; + MCPorts[i] = MCDevices[i]; + } + } + + //printf("\n"); + for(unsigned i = 0; i < 8; i++) + { + unsigned mp = EP_to_MP(emulate_multitap, i); + + if(emulate_multitap[mp]) + PossibleMultitaps[mp]->SetSubDevice(EP_to_SP(emulate_multitap, i), Devices[i], MCDevices[i]); + else + PossibleMultitaps[mp]->SetSubDevice(EP_to_SP(emulate_multitap, i), PossibleNone.get(), PossibleNone.get()); + + //printf("%d-> multitap: %d, sub-port: %d\n", i, mp, EP_to_SP(emulate_multitap, i)); + } +} + +FrontIO::FrontIO() +{ + PossibleNone.reset(new InputDevice()); + + for(unsigned i = 0; i < 8; i++) + { + PossibleDevices[i].Memcard.reset(Device_Memcard_Create()); + PossibleDevices[i].Gamepad.reset(Device_Gamepad_Create()); + PossibleDevices[i].DualAnalog.reset(Device_DualAnalog_Create(false)); + PossibleDevices[i].AnalogJoy.reset(Device_DualAnalog_Create(true)); + PossibleDevices[i].DualShock.reset(Device_DualShock_Create()); + PossibleDevices[i].Mouse.reset(Device_Mouse_Create()); + PossibleDevices[i].neGcon.reset(Device_neGcon_Create()); + PossibleDevices[i].GunCon.reset(Device_GunCon_Create()); + PossibleDevices[i].Justifier.reset(Device_Justifier_Create()); + } + + for(unsigned i = 0; i < 8; i++) + { + Devices[i] = PossibleNone.get(); + DeviceData[i] = NULL; + MCDevices[i] = PossibleNone.get(); + chair_colors[i] = 1 << 24; + Devices[i]->SetCrosshairsColor(chair_colors[i]); + } + + for(unsigned i = 0; i < 2; i++) + { + PossibleMultitaps[i].reset(new InputDevice_Multitap()); + } + + MapDevicesToPorts(); +} + +void FrontIO::SetMultitap(unsigned int pport, bool enabled) +{ + assert(pport < 2); + + if(emulate_multitap[pport] != enabled) + { + emulate_multitap[pport] = enabled; + MapDevicesToPorts(); + PossibleMultitaps[pport]->Power(); + } +} + +void FrontIO::SetAMCT(bool enabled) +{ + for(unsigned i = 0; i < 8; i++) + { + Devices[i]->SetAMCT(enabled); + } + amct_enabled = enabled; +} + +void FrontIO::SetCrosshairsColor(unsigned port, uint32 color) +{ + assert(port < 8); + + chair_colors[port] = color; + Devices[port]->SetCrosshairsColor(color); +} + +FrontIO::~FrontIO() +{ + +} + +pscpu_timestamp_t FrontIO::CalcNextEventTS(pscpu_timestamp_t timestamp, int32 next_event) +{ + pscpu_timestamp_t ret; + + if(ClockDivider > 0 && ClockDivider < next_event) + next_event = ClockDivider; + + for(int i = 0; i < 4; i++) + if(dsr_pulse_delay[i] > 0 && next_event > dsr_pulse_delay[i]) + next_event = dsr_pulse_delay[i]; + + ret = timestamp + next_event; + + if(irq10_pulse_ts[0] < ret) + ret = irq10_pulse_ts[0]; + + if(irq10_pulse_ts[1] < ret) + ret = irq10_pulse_ts[1]; + + return(ret); +} + +static const uint8 ScaleShift[4] = { 0, 0, 4, 6 }; + +void FrontIO::CheckStartStopPending(pscpu_timestamp_t timestamp, bool skip_event_set) +{ + //const bool prior_ReceiveInProgress = ReceiveInProgress; + //const bool prior_TransmitInProgress = TransmitInProgress; + bool trigger_condition = false; + + trigger_condition = (ReceivePending && (Control & 0x4)) || (TransmitPending && (Control & 0x1)); + + if(trigger_condition) + { + if(ReceivePending) + { + ReceivePending = false; + ReceiveInProgress = true; + ReceiveBufferAvail = false; + ReceiveBuffer = 0; + ReceiveBitCounter = 0; + } + + if(TransmitPending) + { + TransmitPending = false; + TransmitInProgress = true; + TransmitBitCounter = 0; + } + + ClockDivider = std::max(0x20, (Baudrate << ScaleShift[Mode & 0x3]) & ~1); // Minimum of 0x20 is an emulation sanity check to prevent severe performance degradation. + //printf("CD: 0x%02x\n", ClockDivider); + } + + if(!(Control & 0x5)) + { + ReceiveInProgress = false; + TransmitInProgress = false; + } + + if(!ReceiveInProgress && !TransmitInProgress) + ClockDivider = 0; + + if(!(skip_event_set)) + PSX_SetEventNT(PSX_EVENT_FIO, CalcNextEventTS(timestamp, 0x10000000)); +} + +// DSR IRQ bit setting appears(from indirect tests on real PS1) to be level-sensitive, not edge-sensitive +INLINE void FrontIO::DoDSRIRQ(void) +{ + if(Control & 0x1000) + { + PSX_FIODBGINFO("[DSR] IRQ"); + istatus = true; + IRQ_Assert(IRQ_SIO, true); + } +} + + +void FrontIO::Write(pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + PSX_FIODBGINFO("[FIO] Write: %08x %08x", A, V); + + V <<= (A & 1) * 8; + + Update(timestamp); + + switch(A & 0xE) + { + case 0x0: + case 0x2: + V <<= (A & 2) * 8; + TransmitBuffer = V; + TransmitPending = true; + TransmitInProgress = false; + break; + + case 0x8: + Mode = V & 0x013F; + break; + + case 0xa: + if(ClockDivider > 0 && ((V & 0x2000) != (Control & 0x2000)) && ((Control & 0x2) == (V & 0x2)) ) + PSX_DBG(PSX_DBG_WARNING, "FIO device selection changed during comm %04x->%04x\n", Control, V); + + //printf("Control: %d, %04x\n", timestamp, V); + Control = V & 0x3F2F; + + if(V & 0x10) + { + istatus = false; + IRQ_Assert(IRQ_SIO, false); + } + + if(V & 0x40) // Reset + { + istatus = false; + IRQ_Assert(IRQ_SIO, false); + + ClockDivider = 0; + ReceivePending = false; + TransmitPending = false; + + ReceiveInProgress = false; + TransmitInProgress = false; + + ReceiveBufferAvail = false; + + TransmitBuffer = 0; + ReceiveBuffer = 0; + + ReceiveBitCounter = 0; + TransmitBitCounter = 0; + + Mode = 0; + Control = 0; + Baudrate = 0; + } + + Ports[0]->SetDTR((Control & 0x2) && !(Control & 0x2000)); + MCPorts[0]->SetDTR((Control & 0x2) && !(Control & 0x2000)); + Ports[1]->SetDTR((Control & 0x2) && (Control & 0x2000)); + MCPorts[1]->SetDTR((Control & 0x2) && (Control & 0x2000)); + +#if 1 +if(!((Control & 0x2) && !(Control & 0x2000))) +{ + dsr_pulse_delay[0] = 0; + dsr_pulse_delay[2] = 0; + dsr_active_until_ts[0] = -1; + dsr_active_until_ts[2] = -1; +} + +if(!((Control & 0x2) && (Control & 0x2000))) +{ + dsr_pulse_delay[1] = 0; + dsr_pulse_delay[3] = 0; + dsr_active_until_ts[1] = -1; + dsr_active_until_ts[3] = -1; +} + +#endif + // TODO: Uncomment out in the future once our CPU emulation is a bit more accurate with timing, to prevent causing problems with games + // that may clear the IRQ in an unsafe pattern that only works because its execution was slow enough to allow DSR to go inactive. (Whether or not + // such games even exist though is unknown!) + //if(timestamp < dsr_active_until_ts[0] || timestamp < dsr_active_until_ts[1] || timestamp < dsr_active_until_ts[2] || timestamp < dsr_active_until_ts[3]) + // DoDSRIRQ(); + + break; + + case 0xe: + Baudrate = V; + //printf("%02x\n", V); + //MDFN_DispMessage("%02x\n", V); + break; + } + + CheckStartStopPending(timestamp, false); +} + + +uint32 FrontIO::Read(pscpu_timestamp_t timestamp, uint32 A) +{ + uint32 ret = 0; + + Update(timestamp); + + switch(A & 0xE) + { + case 0x0: + case 0x2: + //printf("FIO Read: 0x%02x\n", ReceiveBuffer); + ret = ReceiveBuffer | (ReceiveBuffer << 8) | (ReceiveBuffer << 16) | (ReceiveBuffer << 24); + ReceiveBufferAvail = false; + ReceivePending = true; + ReceiveInProgress = false; + CheckStartStopPending(timestamp, false); + ret >>= (A & 2) * 8; + break; + + case 0x4: + ret = 0; + + if(!TransmitPending && !TransmitInProgress) + ret |= 0x1; + + if(ReceiveBufferAvail) + ret |= 0x2; + + if(timestamp < dsr_active_until_ts[0] || timestamp < dsr_active_until_ts[1] || timestamp < dsr_active_until_ts[2] || timestamp < dsr_active_until_ts[3]) + ret |= 0x80; + + if(istatus) + ret |= 0x200; + + break; + + case 0x8: + ret = Mode; + break; + + case 0xa: + ret = Control; + break; + + case 0xe: + ret = Baudrate; + break; + } + + ret >>= (A & 1) * 8; + + if((A & 0xF) != 0x4) + PSX_FIODBGINFO("[FIO] Read: %08x %08x", A, ret); + + return(ret); +} + +pscpu_timestamp_t FrontIO::Update(pscpu_timestamp_t timestamp) +{ + int32 clocks = timestamp - lastts; + bool need_start_stop_check = false; + + for(int i = 0; i < 4; i++) + if(dsr_pulse_delay[i] > 0) + { + dsr_pulse_delay[i] -= clocks; + if(dsr_pulse_delay[i] <= 0) + { + dsr_active_until_ts[i] = timestamp + 32 + dsr_pulse_delay[i]; + DoDSRIRQ(); + } + } + + for(int i = 0; i < 2; i++) + { + if(timestamp >= irq10_pulse_ts[i]) + { + //printf("Yay: %d %u\n", i, timestamp); + irq10_pulse_ts[i] = PSX_EVENT_MAXTS; + IRQ_Assert(IRQ_PIO, true); + IRQ_Assert(IRQ_PIO, false); + } + } + + if(ClockDivider > 0) + { + ClockDivider -= clocks; + + while(ClockDivider <= 0) + { + if(ReceiveInProgress || TransmitInProgress) + { + bool rxd = 0, txd = 0; + const uint32 BCMask = 0x07; + + if(TransmitInProgress) + { + txd = (TransmitBuffer >> TransmitBitCounter) & 1; + TransmitBitCounter = (TransmitBitCounter + 1) & BCMask; + if(!TransmitBitCounter) + { + need_start_stop_check = true; + PSX_FIODBGINFO("[FIO] Data transmitted: %08x", TransmitBuffer); + TransmitInProgress = false; + + if(Control & 0x400) + { + istatus = true; + IRQ_Assert(IRQ_SIO, true); + } + } + } + + rxd = Ports[0]->Clock(txd, dsr_pulse_delay[0]) & Ports[1]->Clock(txd, dsr_pulse_delay[1]) & + MCPorts[0]->Clock(txd, dsr_pulse_delay[2]) & MCPorts[1]->Clock(txd, dsr_pulse_delay[3]); + + if(ReceiveInProgress) + { + ReceiveBuffer &= ~(1 << ReceiveBitCounter); + ReceiveBuffer |= rxd << ReceiveBitCounter; + + ReceiveBitCounter = (ReceiveBitCounter + 1) & BCMask; + + if(!ReceiveBitCounter) + { + need_start_stop_check = true; + PSX_FIODBGINFO("[FIO] Data received: %08x", ReceiveBuffer); + + ReceiveInProgress = false; + ReceiveBufferAvail = true; + + if(Control & 0x800) + { + istatus = true; + IRQ_Assert(IRQ_SIO, true); + } + } + } + ClockDivider += std::max(0x20, (Baudrate << ScaleShift[Mode & 0x3]) & ~1); // Minimum of 0x20 is an emulation sanity check to prevent severe performance degradation. + } + else + break; + } + } + + + lastts = timestamp; + + + if(need_start_stop_check) + { + CheckStartStopPending(timestamp, true); + } + + return(CalcNextEventTS(timestamp, 0x10000000)); +} + +void FrontIO::ResetTS(void) +{ + for(unsigned i = 0; i < 2; i++) + { + Ports[i]->Update(lastts); // Maybe eventually call Update() from FrontIO::Update() and remove this(but would hurt speed)? + Ports[i]->ResetTS(); + + MCPorts[i]->Update(lastts); // Maybe eventually call Update() from FrontIO::Update() and remove this(but would hurt speed)? + MCPorts[i]->ResetTS(); + } + + for(int i = 0; i < 2; i++) + { + if(irq10_pulse_ts[i] != PSX_EVENT_MAXTS) + irq10_pulse_ts[i] -= lastts; + } + + for(int i = 0; i < 4; i++) + { + if(dsr_active_until_ts[i] >= 0) + { + dsr_active_until_ts[i] -= lastts; + //printf("SPOOONY: %d %d\n", i, dsr_active_until_ts[i]); + } + } + lastts = 0; +} + + +void FrontIO::Reset(bool powering_up) +{ + for(int i = 0; i < 4; i++) + { + dsr_pulse_delay[i] = 0; + dsr_active_until_ts[i] = -1; + } + + for(int i = 0; i < 2; i++) + { + irq10_pulse_ts[i] = PSX_EVENT_MAXTS; + } + + lastts = 0; + + // + // + + ClockDivider = 0; + + ReceivePending = false; + TransmitPending = false; + + ReceiveInProgress = false; + TransmitInProgress = false; + + ReceiveBufferAvail = false; + + TransmitBuffer = 0; + ReceiveBuffer = 0; + + ReceiveBitCounter = 0; + TransmitBitCounter = 0; + + Mode = 0; + Control = 0; + Baudrate = 0; + + if(powering_up) + { + for(unsigned i = 0; i < 2; i++) + { + Ports[i]->Power(); + MCPorts[i]->Power(); + } + } + + istatus = false; +} + +void FrontIO::UpdateInput(void) +{ + for(unsigned i = 0; i < 8; i++) + Devices[i]->UpdateInput(DeviceData[i]); +} + +// Take care to call ->Power() only if the device actually changed. +void FrontIO::SetInput(unsigned int port, const char *type, uint8 *ptr) +{ + InputDevice* nd = PossibleNone.get(); + + if(!strcmp(type, "gamepad") || !strcmp(type, "dancepad")) + nd = PossibleDevices[port].Gamepad.get(); + else if(!strcmp(type, "dualanalog")) + nd = PossibleDevices[port].DualAnalog.get(); + else if(!strcmp(type, "analogjoy")) + nd = PossibleDevices[port].AnalogJoy.get(); + else if(!strcmp(type, "dualshock")) + nd = PossibleDevices[port].DualShock.get(); + else if(!strcmp(type, "mouse")) + nd = PossibleDevices[port].Mouse.get(); + else if(!strcmp(type, "negcon")) + nd = PossibleDevices[port].neGcon.get(); + else if(!strcmp(type, "guncon")) + nd = PossibleDevices[port].GunCon.get(); + else if(!strcmp(type, "justifier")) + nd = PossibleDevices[port].Justifier.get(); + else if(strcmp(type, "none")) + abort(); + + if(Devices[port] != nd) + { + if(port < 2) + irq10_pulse_ts[port] = PSX_EVENT_MAXTS; + + Devices[port] = nd; +// ResetTS? + Devices[port]->Power(); + Devices[port]->SetAMCT(amct_enabled); + Devices[port]->SetCrosshairsColor(chair_colors[port]); + DeviceData[port] = ptr; + + MapDevicesToPorts(); + } +} + +// Take care to call ->Power() only if the device actually changed. +void FrontIO::SetMemcard(unsigned int port, bool enabled) +{ + assert(port < 8); + InputDevice* nd = enabled ? PossibleDevices[port].Memcard.get() : PossibleNone.get(); + + if(MCDevices[port] != nd) + { + MCDevices[port] = nd; + MCDevices[port]->Power(); + MapDevicesToPorts(); + } +} + +// +// The memcard functions here should access PossibleDevices[which].Memcard, and NOT MCDevices, so that dynamically disabling/enabling +// memory cards will work properly and not cause data loss(when we add the feature in the future). +// +uint64 FrontIO::GetMemcardDirtyCount(unsigned int which) +{ + assert(which < 8); + + return(PossibleDevices[which].Memcard->GetNVDirtyCount()); +} + +void FrontIO::LoadMemcard(unsigned int which, const std::string& path) +{ + assert(which < 8); + + try + { + if(PossibleDevices[which].Memcard->GetNVSize()) + { + FileStream mf(path, FileStream::MODE_READ); + std::vector tmpbuf; + + tmpbuf.resize(PossibleDevices[which].Memcard->GetNVSize()); + + if(mf.size() != tmpbuf.size()) + throw(MDFN_Error(0, _("Memory card file \"%s\" is an incorrect size(%d bytes). The correct size is %d bytes."), path.c_str(), (int)mf.size(), (int)tmpbuf.size())); + + mf.read(&tmpbuf[0], tmpbuf.size()); + + PossibleDevices[which].Memcard->WriteNV(&tmpbuf[0], 0, tmpbuf.size()); + PossibleDevices[which].Memcard->ResetNVDirtyCount(); // There's no need to rewrite the file if it's the same data. + } + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw(e); + } +} + +void FrontIO::SaveMemcard(unsigned int which, const std::string& path) +{ + assert(which < 8); + + if(PossibleDevices[which].Memcard->GetNVSize() && PossibleDevices[which].Memcard->GetNVDirtyCount()) + { + FileStream mf(path, FileStream::MODE_WRITE_INPLACE); + + mf.write(PossibleDevices[which].Memcard->ReadNV(), PossibleDevices[which].Memcard->GetNVSize()); + mf.close(); // Call before resetting the NV dirty count! + + PossibleDevices[which].Memcard->ResetNVDirtyCount(); + } +} + +void FrontIO::StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(ClockDivider), + + SFVAR(ReceivePending), + SFVAR(TransmitPending), + + SFVAR(ReceiveInProgress), + SFVAR(TransmitInProgress), + + SFVAR(ReceiveBufferAvail), + + SFVAR(ReceiveBuffer), + SFVAR(TransmitBuffer), + + SFVAR(ReceiveBitCounter), + SFVAR(TransmitBitCounter), + + SFVAR(Mode), + SFVAR(Control), + SFVAR(Baudrate), + + SFVAR(istatus), + + // FIXME: Step mode save states. + SFARRAY32(irq10_pulse_ts, sizeof(irq10_pulse_ts) / sizeof(irq10_pulse_ts[0])), + SFARRAY32(dsr_pulse_delay, sizeof(dsr_pulse_delay) / sizeof(dsr_pulse_delay[0])), + SFARRAY32(dsr_active_until_ts, sizeof(dsr_active_until_ts) / sizeof(dsr_active_until_ts[0])), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "FIO"); + + for(unsigned i = 0; i < 2; i++) + { + char tmpbuf[32]; + + trio_snprintf(tmpbuf, sizeof(tmpbuf), "FIOP%u", i); + Ports[i]->StateAction(sm, load, data_only, tmpbuf); + } + + for(unsigned i = 0; i < 2; i++) + { + char tmpbuf[32]; + + trio_snprintf(tmpbuf, sizeof(tmpbuf), "FIOMC%u", i); + MCPorts[i]->StateAction(sm, load, data_only, tmpbuf); + } + + if(load) + { + IRQ_Assert(IRQ_SIO, istatus); + } +} + +bool FrontIO::RequireNoFrameskip(void) +{ + bool ret = false; + + for(unsigned i = 0; i < 2; i++) + { + ret |= Ports[i]->RequireNoFrameskip(); + } + + return(ret); +} + +void FrontIO::GPULineHook(const pscpu_timestamp_t timestamp, const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) +{ + Update(timestamp); + + for(unsigned i = 0; i < 2; i++) + { + pscpu_timestamp_t plts = Ports[i]->GPULineHook(line_timestamp, vsync, pixels, format, width, pix_clock_offset, pix_clock, pix_clock_divider); + + irq10_pulse_ts[i] = plts; + + if(irq10_pulse_ts[i] <= timestamp) + { + irq10_pulse_ts[i] = PSX_EVENT_MAXTS; + IRQ_Assert(IRQ_PIO, true); + IRQ_Assert(IRQ_PIO, false); + } + } + + // + // Draw crosshairs in a separate pass so the crosshairs won't mess up the color evaluation of later lightun GPULineHook()s. + // + if(pixels && pix_clock) + { + for(unsigned i = 0; i < 2; i++) + { + Ports[i]->DrawCrosshairs(pixels, format, width, pix_clock); + } + } + + PSX_SetEventNT(PSX_EVENT_FIO, CalcNextEventTS(timestamp, 0x10000000)); +} + +static const std::vector InputDeviceInfoPSXPort = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad(SCPH-1080) + { + "gamepad", + "Digital Gamepad", + "PlayStation digital gamepad; SCPH-1080.", + Device_Gamepad_IDII, + }, + + // Dual Shock Gamepad(SCPH-1200) + { + "dualshock", + "DualShock", + "DualShock gamepad; SCPH-1200. Emulation in Mednafen includes the analog mode toggle button. Rumble is emulated, but currently only supported on Linux, and MS Windows via the XInput API and XInput-compatible gamepads/joysticks. If you're having trouble getting rumble to work on Linux, see if Mednafen is printing out error messages during startup regarding /dev/input/event*, and resolve the issue(s) as necessary.", + Device_DualShock_IDII, + }, + + // Dual Analog Gamepad(SCPH-1180), forced to analog mode. + { + "dualanalog", + "Dual Analog", + "Dual Analog gamepad; SCPH-1180. It is the predecessor/prototype to the more advanced DualShock. Emulated in Mednafen as forced to analog mode, and without rumble.", + Device_DualAnalog_IDII, + }, + + + // Analog joystick(SCPH-1110), forced to analog mode - emulated through a tweak to dual analog gamepad emulation. + { + "analogjoy", + "Analog Joystick", + "Flight-game-oriented dual-joystick controller; SCPH-1110. Emulated in Mednafen as forced to analog mode.", + Device_AnalogJoy_IDII, + }, + + { + "mouse", + "Mouse", + NULL, + Device_Mouse_IDII, + }, + + { + "negcon", + "neGcon", + "Namco's unconventional twisty racing-game-oriented gamepad; NPC-101.", + Device_neGcon_IDII, + }, + + { + "guncon", + "GunCon", + "Namco's light gun; NPC-103.", + Device_GunCon_IDII, + }, + + { + "justifier", + "Konami Justifier", + "Konami's light gun; SLUH-00017. Rumored to be wrought of the coagulated rage of all who tried to shoot The Dog. If the game you want to play supports the \"GunCon\", you should use that instead. NOTE: Currently does not work properly when on any of ports 1B-1D and 2B-2D.", + Device_Justifier_IDII, + }, + + { + "dancepad", + "Dance Pad", + "Dingo Dingo Rodeo!", + Device_Dancepad_IDII, + }, + +}; + +const std::vector FIO_PortInfo = +{ + { "port1", "Virtual Port 1", InputDeviceInfoPSXPort, "gamepad" }, + { "port2", "Virtual Port 2", InputDeviceInfoPSXPort, "gamepad" }, + { "port3", "Virtual Port 3", InputDeviceInfoPSXPort, "gamepad" }, + { "port4", "Virtual Port 4", InputDeviceInfoPSXPort, "gamepad" }, + { "port5", "Virtual Port 5", InputDeviceInfoPSXPort, "gamepad" }, + { "port6", "Virtual Port 6", InputDeviceInfoPSXPort, "gamepad" }, + { "port7", "Virtual Port 7", InputDeviceInfoPSXPort, "gamepad" }, + { "port8", "Virtual Port 8", InputDeviceInfoPSXPort, "gamepad" }, +}; + +} diff --git a/Mednafen/mednafen/psx/frontio.h b/Mednafen/mednafen/psx/frontio.h new file mode 100644 index 0000000000..513907b410 --- /dev/null +++ b/Mednafen/mednafen/psx/frontio.h @@ -0,0 +1,178 @@ +#ifndef __MDFN_PSX_FRONTIO_H +#define __MDFN_PSX_FRONTIO_H + +#include + +namespace MDFN_IEN_PSX +{ + +class InputDevice_Multitap; + +class InputDevice +{ + public: + + InputDevice(); + virtual ~InputDevice(); + + virtual void Power(void); + virtual void UpdateInput(const void *data); + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix); + + virtual bool RequireNoFrameskip(void); + + // Divide mouse X coordinate by pix_clock_divider in the lightgun code to get the coordinate in pixel(clocks). + virtual pscpu_timestamp_t GPULineHook(const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider); + + virtual void Update(const pscpu_timestamp_t timestamp); // Partially-implemented, don't rely on for timing any more fine-grained than a video frame for now. + virtual void ResetTS(void); + + virtual void DrawCrosshairs(uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock); // Virtual for multitap chaining. + // + // + // + virtual void SetAMCT(bool enabled); + virtual void SetCrosshairsColor(uint32 color); + + // + // + // + virtual void SetDTR(bool new_dtr); + virtual bool GetDSR(void); // Currently unused. + + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay); + + // + // + virtual uint32 GetNVSize(void) const; + virtual const uint8* ReadNV(void) const; // Pointer returned should be considered temporary and assumed invalidated upon further calls to non-const functions on the object. + virtual void WriteNV(const uint8 *buffer, uint32 offset, uint32 count); + + // + // Dirty count should be incremented on each call to a method this class that causes at least 1 write to occur to the + // nonvolatile memory(IE Clock() in the correct command phase, and WriteNV()). + // + virtual uint64 GetNVDirtyCount(void) const; + virtual void ResetNVDirtyCount(void); + + private: + unsigned chair_r, chair_g, chair_b; + bool draw_chair; + protected: + int32 chair_x, chair_y; +}; + +class FrontIO +{ + public: + + FrontIO(); + ~FrontIO(); + + void Reset(bool powering_up); + void Write(pscpu_timestamp_t timestamp, uint32 A, uint32 V); + uint32 Read(pscpu_timestamp_t timestamp, uint32 A); + pscpu_timestamp_t CalcNextEventTS(pscpu_timestamp_t timestamp, int32 next_event); + pscpu_timestamp_t Update(pscpu_timestamp_t timestamp); + void ResetTS(void); + + bool RequireNoFrameskip(void); + void GPULineHook(const pscpu_timestamp_t timestamp, const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider); + + void UpdateInput(void); + void SetInput(unsigned int port, const char *type, uint8 *ptr); + void SetMultitap(unsigned int pport, bool enabled); + void SetMemcard(unsigned int port, bool enabled); + void SetAMCT(bool enabled); + void SetCrosshairsColor(unsigned port, uint32 color); + + uint64 GetMemcardDirtyCount(unsigned int which); + void LoadMemcard(unsigned int which, const std::string& path); + void SaveMemcard(unsigned int which, const std::string& path); //, bool force_save = false); + + void StateAction(StateMem* sm, const unsigned load, const bool data_only); + + private: + + void DoDSRIRQ(void); + void CheckStartStopPending(pscpu_timestamp_t timestamp, bool skip_event_set = false); + + void MapDevicesToPorts(void); + + bool emulate_multitap[2] = { false, false }; + + // + // Configurable pointers to the various pre-allocated devices, and associated configuration data. + // + + // Physical ports + InputDevice *Ports[2]; + InputDevice *MCPorts[2]; + + // Mednafen virtual ports + InputDevice *Devices[8]; + void *DeviceData[8]; + InputDevice *MCDevices[8]; + + // + // Actual pre-allocated devices below: + // + std::unique_ptr PossibleNone; + std::unique_ptr PossibleMultitaps[2]; + + struct + { + std::unique_ptr Memcard; + std::unique_ptr Gamepad; + std::unique_ptr DualAnalog; + std::unique_ptr AnalogJoy; + std::unique_ptr DualShock; + std::unique_ptr Mouse; + std::unique_ptr neGcon; + std::unique_ptr GunCon; + std::unique_ptr Justifier; + } PossibleDevices[8]; + + // + // + // + + int32 ClockDivider; + + bool ReceivePending; + bool TransmitPending; + + bool ReceiveInProgress; + bool TransmitInProgress; + + bool ReceiveBufferAvail; + + uint8 ReceiveBuffer; + uint8 TransmitBuffer; + + int32 ReceiveBitCounter; + int32 TransmitBitCounter; + + uint16 Mode; + uint16 Control; + uint16 Baudrate; + + + bool istatus; + // + // + pscpu_timestamp_t irq10_pulse_ts[2]; + + int32 dsr_pulse_delay[4]; + int32 dsr_active_until_ts[4]; + int32 lastts; + // + // + bool amct_enabled; + uint32 chair_colors[8]; +}; + +extern const std::vector FIO_PortInfo; + +} +#endif diff --git a/Mednafen/mednafen/psx/gpu.cpp b/Mednafen/mednafen/psx/gpu.cpp new file mode 100644 index 0000000000..a02dcb0792 --- /dev/null +++ b/Mednafen/mednafen/psx/gpu.cpp @@ -0,0 +1,1660 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "timer.h" + +/* + GPU display timing master clock is nominally 53.693182 MHz for NTSC PlayStations, and 53.203425 MHz for PAL PlayStations. + + Non-interlaced NTSC mode line timing notes(real-world times calculated via PS1 timer and math with nominal CPU clock value): + + 263 lines per frame + + ~16714.85 us per frame, average. + ~63.55456 us per line, average. + + Multiplying the results of counter 0 in pixel clock mode by the clock divider of the current dot clock mode/width gives a result that's slightly less + than expected; the dot clock divider is probably being reset each scanline. + + Non-interlaced PAL mode(but with an NTSC source clock in an NTSC PS1; calculated same way as NTSC values): + + 314 lines per frame + + ~19912.27 us per frame, average. + ~63.41486 us per line, average. + + FB X and Y display positions can be changed during active display; and Y display position appears to be treated as an offset to the current Y readout + position that gets reset around vblank time. + +*/ + +/* + November 29, 2012 notes: + + PAL mode can be turned on, and then off again, mid-frame(creates a neat effect). + + Pixel clock can be changed mid-frame with effect(the effect is either instantaneous, or cached at some point in the scanline, not tested to see which); + interestingly, alignment is off on a PS1 when going 5MHz->10MHz>5MHz with a grid image. + + Vertical start and end can be changed during active display, with effect(though it needs to be vs0->ve0->vs1->ve1->..., vs0->vs1->ve0 doesn't apparently do anything + different from vs0->ve0. +*/ + +namespace MDFN_IEN_PSX +{ + +static const int8 dither_table[4][4] = +{ + { -4, 0, -3, 1 }, + { 2, -2, 3, -1 }, + { -3, 1, -4, 0 }, + { 3, -1, 2, -2 }, +}; + +PS_GPU::PS_GPU(bool pal_clock_and_tv, int sls, int sle, bool show_h_overscan) +{ + HardwarePALType = pal_clock_and_tv; + + hide_hoverscan = !show_h_overscan; + + for(int y = 0; y < 4; y++) + for(int x = 0; x < 4; x++) + for(int v = 0; v < 512; v++) + { + int value = v + dither_table[y][x]; + + value >>= 3; + + if(value < 0) + value = 0; + + if(value > 0x1F) + value = 0x1F; + + DitherLUT[y][x][v] = value; + } + + if(HardwarePALType == false) // NTSC clock + { + GPUClockRatio = 103896; // 65536 * 53693181.818 / (44100 * 768) + hmc_to_visible = 520; + } + else // PAL clock + { + GPUClockRatio = 102948; // 65536 * 53203425 / (44100 * 768) + hmc_to_visible = 560; + } + + LineVisFirst = sls; + LineVisLast = sle; + + + memcpy(&Commands[0x00], Commands_00_1F, sizeof(Commands_00_1F)); + memcpy(&Commands[0x20], Commands_20_3F, sizeof(Commands_20_3F)); + memcpy(&Commands[0x40], Commands_40_5F, sizeof(Commands_40_5F)); + memcpy(&Commands[0x60], Commands_60_7F, sizeof(Commands_60_7F)); + memcpy(&Commands[0x80], Commands_80_FF, sizeof(Commands_80_FF)); +} + +PS_GPU::~PS_GPU() +{ + +} + +void PS_GPU::FillVideoParams(MDFNGI* gi) +{ + if(HardwarePALType) + { + gi->lcm_width = hide_hoverscan ? 2640 : 2800; + gi->lcm_height = (LineVisLast + 1 - LineVisFirst) * 2; //576; + + gi->nominal_width = hide_hoverscan ? 363 : 384; // More like 385.stuff according to calculations derived from BT.601, but 384 is a nicer number. :p + gi->nominal_height = LineVisLast + 1 - LineVisFirst; //288; + + gi->fb_width = 768; + gi->fb_height = 576; + + gi->fps = 836203078; + + gi->VideoSystem = VIDSYS_PAL; + } + else + { + gi->lcm_width = hide_hoverscan ? 2640 : 2800; + gi->lcm_height = (LineVisLast + 1 - LineVisFirst) * 2; //480; + + gi->nominal_width = (hide_hoverscan ? 302 : 320); + gi->nominal_height = LineVisLast + 1 - LineVisFirst; //240; + + gi->fb_width = 768; + gi->fb_height = 480; + + gi->fps = 1005643085; + + gi->VideoSystem = VIDSYS_NTSC; + } + + + // + // For Justifier and Guncon. + // + gi->mouse_scale_x = (float)gi->lcm_width / gi->nominal_width; + gi->mouse_offs_x = (float)(2800 - gi->lcm_width) / 2; + + gi->mouse_scale_y = 1.0; + gi->mouse_offs_y = LineVisFirst; +} + +void PS_GPU::SoftReset(void) // Control command 0x00 +{ + IRQPending = false; + IRQ_Assert(IRQ_GPU, IRQPending); + + InvalidateCache(); + + DMAControl = 0; + + if(DrawTimeAvail < 0) + DrawTimeAvail = 0; + + BlitterFIFO.Flush(); + DataReadBufferEx = 0; + InCmd = INCMD_NONE; + + DisplayOff = 1; + DisplayFB_XStart = 0; + DisplayFB_YStart = 0; + + DisplayMode = 0; + + HorizStart = 0x200; + HorizEnd = 0xC00; + + VertStart = 0x10; + VertEnd = 0x100; + + // + TexPageX = 0; + TexPageY = 0; + + SpriteFlip = 0; + + abr = 0; + TexMode = 0; + + dtd = 0; + dfe = 0; + + // + tww = 0; + twh = 0; + twx = 0; + twy = 0; + + RecalcTexWindowStuff(); + + // + ClipX0 = 0; + ClipY0 = 0; + + // + ClipX1 = 0; + ClipY1 = 0; + + // + OffsX = 0; + OffsY = 0; + + // + MaskSetOR = 0; + MaskEvalAND = 0; + + TexDisable = false; + TexDisableAllowChange = false; +} + +void PS_GPU::Power(void) +{ + memset(GPURAM, 0, sizeof(GPURAM)); + + memset(CLUT_Cache, 0, sizeof(CLUT_Cache)); + CLUT_Cache_VB = ~0U; + + memset(TexCache, 0xFF, sizeof(TexCache)); + + DMAControl = 0; + + ClipX0 = 0; + ClipY0 = 0; + ClipX1 = 0; + ClipY1 = 0; + + OffsX = 0; + OffsY = 0; + + dtd = false; + dfe = false; + + MaskSetOR = 0; + MaskEvalAND = 0; + + TexDisable = false; + TexDisableAllowChange = false; + + tww = 0; + twh = 0; + twx = 0; + twy = 0; + + TexPageX = 0; + TexPageY = 0; + SpriteFlip = 0; + + abr = 0; + TexMode = 0; + + RecalcTexWindowStuff(); + + BlitterFIFO.Flush(); + DataReadBuffer = 0; // Don't reset in SoftReset() + DataReadBufferEx = 0; + InCmd = INCMD_NONE; + FBRW_X = 0; + FBRW_Y = 0; + FBRW_W = 0; + FBRW_H = 0; + FBRW_CurY = 0; + FBRW_CurX = 0; + + DisplayMode = 0; + DisplayOff = 1; + DisplayFB_XStart = 0; + DisplayFB_YStart = 0; + + HorizStart = 0; + HorizEnd = 0; + + VertStart = 0; + VertEnd = 0; + + // + // + // + DisplayFB_CurYOffset = 0; + DisplayFB_CurLineYReadout = 0; + InVBlank = true; + + // TODO: factor out in a separate function. + LinesPerField = 263; + + // + // + // + scanline = 0; + field = 0; + field_ram_readout = 0; + PhaseChange = 0; + + // + // + // + DotClockCounter = 0; + GPUClockCounter = 0; + LineClockCounter = 3412 - 200; + LinePhase = 0; + + DrawTimeAvail = 0; + + lastts = 0; + + SoftReset(); + + IRQ_Assert(IRQ_VBLANK, InVBlank); + TIMER_SetVBlank(InVBlank); +} + +void PS_GPU::ResetTS(void) +{ + lastts = 0; +} + +#include "gpu_common.inc" + +// Special RAM write mode(16 pixels at a time), does *not* appear to use mask drawing environment settings. +INLINE void PS_GPU::Command_FBFill(const uint32 *cb) +{ + int32 r = cb[0] & 0xFF; + int32 g = (cb[0] >> 8) & 0xFF; + int32 b = (cb[0] >> 16) & 0xFF; + const uint16 fill_value = ((r >> 3) << 0) | ((g >> 3) << 5) | ((b >> 3) << 10); + + int32 destX = (cb[1] >> 0) & 0x3F0; + int32 destY = (cb[1] >> 16) & 0x3FF; + + int32 width = (((cb[2] >> 0) & 0x3FF) + 0xF) & ~0xF; + int32 height = (cb[2] >> 16) & 0x1FF; + + //printf("[GPU] FB Fill %d:%d w=%d, h=%d\n", destX, destY, width, height); + DrawTimeAvail -= 46; // Approximate + + for(int32 y = 0; y < height; y++) + { + const int32 d_y = (y + destY) & 511; + + if(LineSkipTest(d_y)) + continue; + + DrawTimeAvail -= (width >> 3) + 9; + + for(int32 x = 0; x < width; x++) + { + const int32 d_x = (x + destX) & 1023; + + GPURAM[d_y][d_x] = fill_value; + } + } +} + +INLINE void PS_GPU::Command_FBCopy(const uint32 *cb) +{ + int32 sourceX = (cb[1] >> 0) & 0x3FF; + int32 sourceY = (cb[1] >> 16) & 0x3FF; + int32 destX = (cb[2] >> 0) & 0x3FF; + int32 destY = (cb[2] >> 16) & 0x3FF; + + int32 width = (cb[3] >> 0) & 0x3FF; + int32 height = (cb[3] >> 16) & 0x1FF; + + if(!width) + width = 0x400; + + if(!height) + height = 0x200; + + InvalidateTexCache(); + //printf("FB Copy: %d %d %d %d %d %d\n", sourceX, sourceY, destX, destY, width, height); + + DrawTimeAvail -= (width * height) * 2; + + for(int32 y = 0; y < height; y++) + { + for(int32 x = 0; x < width; x += 128) + { + const int32 chunk_x_max = std::min(width - x, 128); + uint16 tmpbuf[128]; // TODO: Check and see if the GPU is actually (ab)using the texture cache(doesn't seem to be affecting CLUT cache...). + + for(int32 chunk_x = 0; chunk_x < chunk_x_max; chunk_x++) + { + int32 s_y = (y + sourceY) & 511; + int32 s_x = (x + chunk_x + sourceX) & 1023; + + tmpbuf[chunk_x] = GPURAM[s_y][s_x]; + } + + for(int32 chunk_x = 0; chunk_x < chunk_x_max; chunk_x++) + { + int32 d_y = (y + destY) & 511; + int32 d_x = (x + chunk_x + destX) & 1023; + + if(!(GPURAM[d_y][d_x] & MaskEvalAND)) + GPURAM[d_y][d_x] = tmpbuf[chunk_x] | MaskSetOR; + } + } + } +} + +INLINE void PS_GPU::Command_FBWrite(const uint32 *cb) +{ + assert(InCmd == INCMD_NONE); + + FBRW_X = (cb[1] >> 0) & 0x3FF; + FBRW_Y = (cb[1] >> 16) & 0x3FF; + + FBRW_W = (cb[2] >> 0) & 0x3FF; + FBRW_H = (cb[2] >> 16) & 0x1FF; + + if(!FBRW_W) + FBRW_W = 0x400; + + if(!FBRW_H) + FBRW_H = 0x200; + + FBRW_CurX = FBRW_X; + FBRW_CurY = FBRW_Y; + + InvalidateTexCache(); + + if(FBRW_W != 0 && FBRW_H != 0) + InCmd = INCMD_FBWRITE; +} + +// +// FBRead: PS1 GPU in SCPH-5501 gives odd, inconsistent results when raw_height == 0, or +// raw_height != 0x200 && (raw_height & 0x1FF) == 0 +// +INLINE void PS_GPU::Command_FBRead(const uint32 *cb) +{ + assert(InCmd == INCMD_NONE); + + FBRW_X = (cb[1] >> 0) & 0x3FF; + FBRW_Y = (cb[1] >> 16) & 0x3FF; + + FBRW_W = (cb[2] >> 0) & 0x3FF; + FBRW_H = (cb[2] >> 16) & 0x3FF; + + if(!FBRW_W) + FBRW_W = 0x400; + + if(FBRW_H > 0x200) + FBRW_H &= 0x1FF; + + FBRW_CurX = FBRW_X; + FBRW_CurY = FBRW_Y; + + InvalidateTexCache(); + + if(FBRW_W != 0 && FBRW_H != 0) + InCmd = INCMD_FBREAD; +} + +/* +INLINE void PS_GPU::RecalcTexPageStuff(uint32 tpage) +{ + + +} +*/ + +INLINE void PS_GPU::SetTPage(const uint32 cmdw) +{ + const unsigned NewTexPageX = (cmdw & 0xF) * 64; + const unsigned NewTexPageY = (cmdw & 0x10) * 16; + const unsigned NewTexMode = (cmdw >> 7) & 0x3; + + abr = (cmdw >> 5) & 0x3; + + if(!NewTexMode != !TexMode || NewTexPageX != TexPageX || NewTexPageY != TexPageY) + { + InvalidateTexCache(); + } + + if(TexDisableAllowChange) + { + bool NewTexDisable = (cmdw >> 11) & 1; + + if(NewTexDisable != TexDisable) + InvalidateTexCache(); + + TexDisable = NewTexDisable; + //printf("TexDisable: %02x\n", TexDisable); + } + + TexPageX = NewTexPageX; + TexPageY = NewTexPageY; + TexMode = NewTexMode; + + // + // + RecalcTexWindowStuff(); +} + +INLINE void PS_GPU::Command_DrawMode(const uint32 *cb) +{ + const uint32 cmdw = *cb; + + SetTPage(cmdw); + + SpriteFlip = cmdw & 0x3000; + dtd = (cmdw >> 9) & 1; + dfe = (cmdw >> 10) & 1; + + //printf("*******************DFE: %d -- scanline=%d\n", dfe, scanline); +} + +INLINE void PS_GPU::Command_TexWindow(const uint32 *cb) +{ + tww = (*cb & 0x1F); + twh = ((*cb >> 5) & 0x1F); + twx = ((*cb >> 10) & 0x1F); + twy = ((*cb >> 15) & 0x1F); + + RecalcTexWindowStuff(); +} + +INLINE void PS_GPU::Command_Clip0(const uint32 *cb) +{ + ClipX0 = *cb & 1023; + ClipY0 = (*cb >> 10) & 1023; + + //fprintf(stderr, "[GPU] Clip0: x=%d y=%d, raw=0x%08x --- %d\n", ClipX0, ClipY0, *cb, scanline); +} + +INLINE void PS_GPU::Command_Clip1(const uint32 *cb) +{ + ClipX1 = *cb & 1023; + ClipY1 = (*cb >> 10) & 1023; + + //fprintf(stderr, "[GPU] Clip1: x=%d y=%d, raw=0x%08x --- %d\n", ClipX1, ClipY1, *cb, scanline); +} + +INLINE void PS_GPU::Command_DrawingOffset(const uint32 *cb) +{ + OffsX = sign_x_to_s32(11, (*cb & 2047)); + OffsY = sign_x_to_s32(11, ((*cb >> 11) & 2047)); + + //fprintf(stderr, "[GPU] Drawing offset: x=%d y=%d, raw=0x%08x --- %d\n", OffsX, OffsY, *cb, scanline); +} + +INLINE void PS_GPU::Command_MaskSetting(const uint32 *cb) +{ + //printf("Mask setting: %08x\n", *cb); + MaskSetOR = (*cb & 1) ? 0x8000 : 0x0000; + MaskEvalAND = (*cb & 2) ? 0x8000 : 0x0000; +} + +INLINE void PS_GPU::InvalidateTexCache(void) +{ + for(auto& c : TexCache) + c.Tag = ~0U; +} + +void PS_GPU::InvalidateCache(void) +{ + CLUT_Cache_VB = ~0U; + + InvalidateTexCache(); +} + +INLINE void PS_GPU::Command_ClearCache(const uint32 *cb) +{ + InvalidateCache(); +} + +INLINE void PS_GPU::Command_IRQ(const uint32 *cb) +{ + IRQPending = true; + IRQ_Assert(IRQ_GPU, IRQPending); +} + +// +// C-style function wrappers so our command table isn't so ginormous(in memory usage). +// +static void G_Command_ClearCache(PS_GPU* g, const uint32 *cb) +{ + g->Command_ClearCache(cb); +} + +static void G_Command_IRQ(PS_GPU* g, const uint32 *cb) +{ + g->Command_IRQ(cb); +} + +static void G_Command_FBFill(PS_GPU* g, const uint32 *cb) +{ + g->Command_FBFill(cb); +} + +static void G_Command_FBCopy(PS_GPU* g, const uint32 *cb) +{ + g->Command_FBCopy(cb); +} + +static void G_Command_FBWrite(PS_GPU* g, const uint32 *cb) +{ + g->Command_FBWrite(cb); +} + +static void G_Command_FBRead(PS_GPU* g, const uint32 *cb) +{ + g->Command_FBRead(cb); +} + +static void G_Command_DrawMode(PS_GPU* g, const uint32 *cb) +{ + g->Command_DrawMode(cb); +} + +static void G_Command_TexWindow(PS_GPU* g, const uint32 *cb) +{ + g->Command_TexWindow(cb); +} + +static void G_Command_Clip0(PS_GPU* g, const uint32 *cb) +{ + g->Command_Clip0(cb); +} + +static void G_Command_Clip1(PS_GPU* g, const uint32 *cb) +{ + g->Command_Clip1(cb); +} + +static void G_Command_DrawingOffset(PS_GPU* g, const uint32 *cb) +{ + g->Command_DrawingOffset(cb); +} + +static void G_Command_MaskSetting(PS_GPU* g, const uint32 *cb) +{ + g->Command_MaskSetting(cb); +} + +CTEntry PS_GPU::Commands[0x100]; + +const CTEntry PS_GPU::Commands_00_1F[0x20] = +{ + /* 0x00 */ + NULLCMD(), + OTHER_HELPER(1, 2, false, G_Command_ClearCache), + OTHER_HELPER(3, 3, false, G_Command_FBFill), + + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), + + /* 0x10 */ + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), + + /* 0x1F */ + OTHER_HELPER(1, 1, false, G_Command_IRQ) +}; + +const CTEntry PS_GPU::Commands_80_FF[0x80] = +{ + /* 0x80 ... 0x9F */ + OTHER_HELPER_X32(4, 2, false, G_Command_FBCopy), + + /* 0xA0 ... 0xBF */ + OTHER_HELPER_X32(3, 2, false, G_Command_FBWrite), + + /* 0xC0 ... 0xDF */ + OTHER_HELPER_X32(3, 2, false, G_Command_FBRead), + + /* 0xE0 */ + + NULLCMD(), + OTHER_HELPER(1, 2, false, G_Command_DrawMode), + OTHER_HELPER(1, 2, false, G_Command_TexWindow), + OTHER_HELPER(1, 1, true, G_Command_Clip0), + OTHER_HELPER(1, 1, true, G_Command_Clip1), + OTHER_HELPER(1, 1, true, G_Command_DrawingOffset), + OTHER_HELPER(1, 2, false, G_Command_MaskSetting), + + NULLCMD(), + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), + + /* 0xF0 */ + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), + NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD(), NULLCMD() +}; + +void PS_GPU::ProcessFIFO(void) +{ + if(!BlitterFIFO.CanRead()) + return; + + switch(InCmd) + { + default: + abort(); + break; + + case INCMD_NONE: + break; + + case INCMD_FBREAD: + PSX_WARNING("[GPU] Command FIFO not empty while in FB Read?!"); + return; + + case INCMD_FBWRITE: + { + uint32 InData = BlitterFIFO.Read(); + + for(int i = 0; i < 2; i++) + { + if(!(GPURAM[FBRW_CurY & 511][FBRW_CurX & 1023] & MaskEvalAND)) + GPURAM[FBRW_CurY & 511][FBRW_CurX & 1023] = InData | MaskSetOR; + + FBRW_CurX++; + if(FBRW_CurX == (FBRW_X + FBRW_W)) + { + FBRW_CurX = FBRW_X; + FBRW_CurY++; + if(FBRW_CurY == (FBRW_Y + FBRW_H)) + { + InCmd = INCMD_NONE; + break; // Break out of the for() loop. + } + } + InData >>= 16; + } + return; + } + break; + + case INCMD_QUAD: + { + if(DrawTimeAvail < 0) + return; + + const uint32 cc = InCmd_CC; + const CTEntry *command = &Commands[cc]; + unsigned vl = 1 + (bool)(cc & 0x4) + (bool)(cc & 0x10); + uint32 CB[3]; + + if(BlitterFIFO.CanRead() >= vl) + { + for(unsigned i = 0; i < vl; i++) + { + CB[i] = BlitterFIFO.Read(); + } + + command->func[abr][TexMode | (MaskEvalAND ? 0x4 : 0x0)](this, CB); + } + return; + } + break; + + case INCMD_PLINE: + { + if(DrawTimeAvail < 0) + return; + + const uint32 cc = InCmd_CC; + const CTEntry *command = &Commands[cc]; + unsigned vl = 1 + (bool)(InCmd_CC & 0x10); + uint32 CB[2]; + + if((BlitterFIFO.Peek() & 0xF000F000) == 0x50005000) + { + BlitterFIFO.Read(); + InCmd = INCMD_NONE; + return; + } + + if(BlitterFIFO.CanRead() >= vl) + { + for(unsigned i = 0; i < vl; i++) + { + CB[i] = BlitterFIFO.Read(); + } + + command->func[abr][TexMode | (MaskEvalAND ? 0x4 : 0x0)](this, CB); + } + return; + } + break; + } + + const uint32 cc = BlitterFIFO.Peek() >> 24; + const CTEntry *command = &Commands[cc]; + + if(DrawTimeAvail < 0 && !command->ss_cmd) + return; + + if(BlitterFIFO.CanRead() >= command->len) + { + uint32 CB[0x10]; + + for(unsigned i = 0; i < command->len; i++) + CB[i] = BlitterFIFO.Read(); + + if(!command->ss_cmd) + DrawTimeAvail -= 2; + +#if 0 + PSX_WARNING("[GPU] Command: %08x %s %d %d %d", CB[0], command->name, command->len, scanline, DrawTimeAvail); + if(1) + { + printf("[GPU] "); + for(unsigned i = 0; i < command->len; i++) + printf("0x%08x ", CB[i]); + printf("\n"); + } +#endif + // A very very ugly kludge to support texture mode specialization. fixme/cleanup/SOMETHING in the future. + if(cc >= 0x20 && cc <= 0x3F && (cc & 0x4)) + { + // + // Don't alter SpriteFlip here. + // + SetTPage(CB[4 + ((cc >> 4) & 0x1)] >> 16); + } + + if(!command->func[abr][TexMode]) + { + if(CB[0]) + PSX_WARNING("[GPU] Unknown command: %08x, %d", CB[0], scanline); + } + else + { + command->func[abr][TexMode | (MaskEvalAND ? 0x4 : 0x0)](this, CB); + } + } +} + +INLINE void PS_GPU::WriteCB(uint32 InData) +{ + if(BlitterFIFO.CanRead() >= 0x10 && (InCmd != INCMD_NONE || (BlitterFIFO.CanRead() - 0x10) >= Commands[BlitterFIFO.Peek() >> 24].fifo_fb_len)) + { + PSX_DBG(PSX_DBG_WARNING, "GPU FIFO overflow!!!\n"); + return; + } + + BlitterFIFO.Write(InData); + ProcessFIFO(); +} + +void PS_GPU::Write(const pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + V <<= (A & 3) * 8; + + if(A & 4) // GP1 ("Control") + { + uint32 command = V >> 24; + + V &= 0x00FFFFFF; + + //PSX_WARNING("[GPU] Control command: %02x %06x %d", command, V, scanline); + + switch(command) + { + /* + 0x40-0xFF do NOT appear to be mirrors, at least not on my PS1's GPU. + */ + default: PSX_WARNING("[GPU] Unknown control command %02x - %06x", command, V); + break; + + case 0x00: // Reset GPU + //printf("\n\n************ Soft Reset %u ********* \n\n", scanline); + SoftReset(); + break; + + case 0x01: // Reset command buffer + if(DrawTimeAvail < 0) + DrawTimeAvail = 0; + BlitterFIFO.Flush(); + InCmd = INCMD_NONE; + break; + + case 0x02: // Acknowledge IRQ + IRQPending = false; + IRQ_Assert(IRQ_GPU, IRQPending); + break; + + case 0x03: // Display enable + DisplayOff = V & 1; + break; + + case 0x04: // DMA Setup + DMAControl = V & 0x3; + break; + + case 0x05: // Start of display area in framebuffer + DisplayFB_XStart = V & 0x3FE; // Lower bit is apparently ignored. + DisplayFB_YStart = (V >> 10) & 0x1FF; + break; + + case 0x06: // Horizontal display range + HorizStart = V & 0xFFF; + HorizEnd = (V >> 12) & 0xFFF; + break; + + case 0x07: + VertStart = V & 0x3FF; + VertEnd = (V >> 10) & 0x3FF; + break; + + case 0x08: + //printf("\n\nDISPLAYMODE SET: 0x%02x, %u *************************\n\n\n", V & 0xFF, scanline); + DisplayMode = V & 0xFF; + break; + + case 0x09: + TexDisableAllowChange = V & 1; + break; + + case 0x10: // GPU info(?) + switch(V & 0xF) + { + // DataReadBuffer must remain unchanged for any unhandled GPU info index. + default: break; + + case 0x2: DataReadBufferEx &= 0xFFF00000; + DataReadBufferEx |= (tww << 0) | (twh << 5) | (twx << 10) | (twy << 15); + DataReadBuffer = DataReadBufferEx; + break; + + case 0x3: DataReadBufferEx &= 0xFFF00000; + DataReadBufferEx |= (ClipY0 << 10) | ClipX0; + DataReadBuffer = DataReadBufferEx; + break; + + case 0x4: DataReadBufferEx &= 0xFFF00000; + DataReadBufferEx |= (ClipY1 << 10) | ClipX1; + DataReadBuffer = DataReadBufferEx; + break; + + case 0x5: DataReadBufferEx &= 0xFFC00000; + DataReadBufferEx |= (OffsX & 2047) | ((OffsY & 2047) << 11); + DataReadBuffer = DataReadBufferEx; + break; + + case 0x7: DataReadBufferEx = 2; + DataReadBuffer = DataReadBufferEx; + break; + + case 0x8: DataReadBufferEx = 0; + DataReadBuffer = DataReadBufferEx; + break; + } + //fprintf(stderr, "[GPU] CC 0x10:0x%02x, DRB=0x%02x\n", V & 0xF, DataReadBuffer); + break; + + } + } + else // GP0 ("Data") + { + //uint32 command = V >> 24; + //printf("Meow command: %02x\n", command); + //assert(!(DMAControl & 2)); + WriteCB(V); + } +} + + +void PS_GPU::WriteDMA(uint32 V) +{ + WriteCB(V); +} + +INLINE uint32 PS_GPU::ReadData(void) +{ + if(InCmd == INCMD_FBREAD) + { + DataReadBufferEx = 0; + for(int i = 0; i < 2; i++) + { + DataReadBufferEx |= GPURAM[FBRW_CurY & 511][FBRW_CurX & 1023] << (i * 16); + + FBRW_CurX++; + if(FBRW_CurX == (FBRW_X + FBRW_W)) + { + if((FBRW_CurY + 1) == (FBRW_Y + FBRW_H)) + { + InCmd = INCMD_NONE; + } + else + { + FBRW_CurY++; + FBRW_CurX = FBRW_X; + } + } + } + + return DataReadBufferEx; + } + + return DataReadBuffer; +} + +uint32 PS_GPU::ReadDMA(void) +{ + return ReadData(); +} + +uint32 PS_GPU::Read(const pscpu_timestamp_t timestamp, uint32 A) +{ + uint32 ret = 0; + + if(A & 4) // Status + { + ret = (((DisplayMode << 1) & 0x7F) | ((DisplayMode >> 6) & 1)) << 16; + + ret |= (DisplayMode & 0x80) << 7; + + ret |= DMAControl << 29; + + ret |= (DisplayFB_CurLineYReadout & 1) << 31; + + ret |= (!field) << 13; + + if(DMAControl & 0x02) + ret |= 1 << 25; + + ret |= IRQPending << 24; + + ret |= DisplayOff << 23; + + if(InCmd == INCMD_NONE && DrawTimeAvail >= 0 && BlitterFIFO.CanRead() == 0x00) // GPU idle bit. + ret |= 1 << 26; + + if(InCmd == INCMD_FBREAD) // Might want to more accurately emulate this in the future? + ret |= (1 << 27); + + ret |= CalcFIFOReadyBit() << 28; // FIFO has room bit? (kinda). + + // + // + ret |= TexPageX >> 6; + ret |= TexPageY >> 4; + ret |= abr << 5; + ret |= TexMode << 7; + + ret |= dtd << 9; + ret |= dfe << 10; + + if(MaskSetOR) + ret |= 1 << 11; + + if(MaskEvalAND) + ret |= 1 << 12; + + ret |= TexDisable << 15; + } + else // "Data" + ret = ReadData(); + + if(DMAControl & 2) + { + //PSX_WARNING("[GPU READ WHEN (DMACONTROL&2)] 0x%08x - ret=0x%08x, scanline=%d", A, ret, scanline); + } + + return(ret >> ((A & 3) * 8)); +} + +#if 0 +static INLINE uint32 MDFN_NOWARN_UNUSED ShiftHelper(uint32 val, int shamt, uint32 mask) +{ + if(shamt < 0) + return((val >> (-shamt)) & mask); + else + return((val << shamt) & mask); +} +#endif + +#pragma GCC push_options +#pragma GCC optimize("no-unroll-loops,no-peel-loops,no-crossjumping") +INLINE void PS_GPU::ReorderRGB_Var(uint32 out_Rshift, uint32 out_Gshift, uint32 out_Bshift, bool bpp24, const uint16 *src, uint32 *dest, const int32 dx_start, const int32 dx_end, int32 fb_x) +{ + if(bpp24) // 24bpp + { + for(int32 x = dx_start; MDFN_LIKELY(x < dx_end); x++) + { + uint32 srcpix; + + srcpix = src[(fb_x >> 1) + 0] | (src[((fb_x >> 1) + 1) & 0x7FF] << 16); + srcpix >>= (fb_x & 1) * 8; + + dest[x] = (((srcpix >> 0) << out_Rshift) & (0xFF << out_Rshift)) | (((srcpix >> 8) << out_Gshift) & (0xFF << out_Gshift)) | + (((srcpix >> 16) << out_Bshift) & (0xFF << out_Bshift)); + + fb_x = (fb_x + 3) & 0x7FF; + } + } // 15bpp + else + { + for(int32 x = dx_start; MDFN_LIKELY(x < dx_end); x++) + { + uint32 srcpix = src[fb_x >> 1]; + +#if 1 + dest[x] = OutputLUT[(uint8)srcpix] | (OutputLUT + 256)[(srcpix >> 8) & 0x7F]; +#else + dest[x] = ShiftHelper(srcpix, out_Rshift + 3 - 0, (0xF8 << out_Rshift)) | + ShiftHelper(srcpix, out_Gshift + 3 - 5, (0xF8 << out_Gshift)) | + ShiftHelper(srcpix, out_Bshift + 3 - 10, (0xF8 << out_Bshift)); +#endif + fb_x = (fb_x + 2) & 0x7FF; + } + } + +} + +template +void NO_INLINE PS_GPU::ReorderRGB(bool bpp24, const uint16 *src, uint32 *dest, const int32 dx_start, const int32 dx_end, int32 fb_x) +{ + ReorderRGB_Var(out_Rshift, out_Gshift, out_Bshift, bpp24, src, dest, dx_start, dx_end, fb_x); +} +#pragma GCC pop_options + +pscpu_timestamp_t PS_GPU::Update(const pscpu_timestamp_t sys_timestamp) +{ + static const uint32 DotClockRatios[5] = { 10, 8, 5, 4, 7 }; + const uint32 dmc = (DisplayMode & 0x40) ? 4 : (DisplayMode & 0x3); + const uint32 dmw = 2800 / DotClockRatios[dmc]; // Must be <= (768 - 32) + const uint32 dmpa = (2800 - (hide_hoverscan ? 2640 : 2800)) / DotClockRatios[dmc] / 2; // Must be <= 32 + const uint32 drxbo = 32; + + int32 sys_clocks = sys_timestamp - lastts; + int32 gpu_clocks; + + //printf("GPUISH: %d\n", sys_timestamp - lastts); + + if(!sys_clocks) + goto TheEnd; + + DrawTimeAvail += sys_clocks << 1; + + if(DrawTimeAvail > 256) + DrawTimeAvail = 256; + + ProcessFIFO(); + + //puts("GPU Update Start"); + + GPUClockCounter += (uint64)sys_clocks * GPUClockRatio; + + gpu_clocks = GPUClockCounter >> 16; + GPUClockCounter -= gpu_clocks << 16; + + while(gpu_clocks > 0) + { + int32 chunk_clocks = gpu_clocks; + int32 dot_clocks; + + if(chunk_clocks > LineClockCounter) + { + //printf("Chunk: %u, LCC: %u\n", chunk_clocks, LineClockCounter); + chunk_clocks = LineClockCounter; + } + + gpu_clocks -= chunk_clocks; + LineClockCounter -= chunk_clocks; + + DotClockCounter += chunk_clocks; + dot_clocks = DotClockCounter / DotClockRatios[DisplayMode & 0x3]; + DotClockCounter -= dot_clocks * DotClockRatios[DisplayMode & 0x3]; + + TIMER_AddDotClocks(dot_clocks); + + + if(!LineClockCounter) + { + PSX_SetEventNT(PSX_EVENT_TIMER, TIMER_Update(sys_timestamp)); // We could just call this at the top of GPU_Update(), but do it here for slightly less CPU usage(presumably). + + LinePhase = (LinePhase + 1) & 1; + + if(LinePhase) + { + TIMER_SetHRetrace(true); + LineClockCounter = 200; + TIMER_ClockHRetrace(); + } + else + { + const unsigned int FirstVisibleLine = LineVisFirst + (HardwarePALType ? 20 : 16); + const unsigned int VisibleLineCount = LineVisLast + 1 - LineVisFirst; //HardwarePALType ? 288 : 240; + + TIMER_SetHRetrace(false); + + if(DisplayMode & 0x08) + LineClockCounter = 3405 - 200; + else + LineClockCounter = 3412 + PhaseChange - 200; + + scanline = (scanline + 1) % LinesPerField; + PhaseChange = !PhaseChange; + +#ifdef WANT_DEBUGGER + DBG_GPUScanlineHook(scanline); +#endif + + // + // + // + if(scanline == (HardwarePALType ? 308 : 256)) // Will need to be redone if we ever allow for visible vertical overscan with NTSC. + { + if(sl_zero_reached) + { + //printf("Req Exit(visible fallthrough case): %u\n", scanline); + PSX_RequestMLExit(); + } + } + + if(scanline == (LinesPerField - 1)) + { + if(sl_zero_reached) + { + //printf("Req Exit(final fallthrough case): %u\n", scanline); + PSX_RequestMLExit(); + } + + if(DisplayMode & 0x20) + field = !field; + else + field = 0; + } + + if(scanline == 0) + { + assert(sl_zero_reached == false); + sl_zero_reached = true; + + if(DisplayMode & 0x20) + { + skip = false; + + if(DisplayMode & 0x08) // PAL + LinesPerField = 313 - field; + else // NTSC + LinesPerField = 263 - field; + } + else + { + field = 0; // May not be the correct place for this? + + if(DisplayMode & 0x08) // PAL + LinesPerField = 314; + else // NTSC + LinesPerField = 263; + } + + if(espec) + { + if((bool)(DisplayMode & 0x08) != HardwarePALType) + { + const uint32 black = surface->MakeColor(0, 0, 0); + + DisplayRect->x = 0; + DisplayRect->y = 0; + DisplayRect->w = 384; + DisplayRect->h = VisibleLineCount; + + for(int32 y = 0; y < DisplayRect->h; y++) + { + uint32 *dest = surface->pixels + y * surface->pitch32; + + LineWidths[y] = 384; + + for(int32 x = 0; x < 384; x++) + { + dest[x] = black; + } + } + + if(!DisplayOff) + { + char buffer[256]; + trio_snprintf(buffer, sizeof(buffer), _("VIDEO STANDARD MISMATCH")); + DrawTextTrans(surface->pixels + ((DisplayRect->h / 2) - (13 / 2)) * surface->pitch32, surface->pitch32 << 2, DisplayRect->w, buffer, + surface->MakeColor(0x00, 0xFF, 0x00), true, MDFN_FONT_6x13_12x13); + } + } + else + { + const uint32 black = surface->MakeColor(0, 0, 0); + + espec->InterlaceOn = (bool)(DisplayMode & 0x20); + espec->InterlaceField = (bool)(DisplayMode & 0x20) && field; + +#pragma message "test to fix x offset" + DisplayRect->x = drxbo; + // DisplayRect->x = 0; + DisplayRect->y = 0; + DisplayRect->w = 0; + DisplayRect->h = VisibleLineCount << (bool)(DisplayMode & 0x20); + + // Clear ~0 state. + LineWidths[0] = 0; + + for(int i = 0; i < (DisplayRect->y + DisplayRect->h); i++) + { + surface->pixels[i * surface->pitch32 + 0] = + surface->pixels[i * surface->pitch32 + 1] = black; + LineWidths[i] = 2; + } + } + } + } + + // + // Don't mess with the order of evaluation of these scanline == VertXXX && (InVblankwhatever) if statements and the following IRQ/timer vblank stuff + // unless you know what you're doing!!! (IE you've run further tests to refine the behavior) + // + if(scanline == VertEnd && !InVBlank) + { + if(sl_zero_reached) + { + // Gameplay in Descent(NTSC) has vblank at scanline 236 + // + // Mikagura Shoujo Tanteidan has vblank at scanline 192 during intro + // FMV(which we don't handle here because low-latency in that case is not so important). + // + if(scanline >= (HardwarePALType ? 260 : 232)) + { + //printf("Req Exit(vblank case): %u\n", scanline); + PSX_RequestMLExit(); + } + else + { + //printf("VBlank too early, chickening out early exit: %u!\n", scanline); + } + } + + //printf("VBLANK: %u\n", scanline); + InVBlank = true; + + DisplayFB_CurYOffset = 0; + + if((DisplayMode & 0x24) == 0x24) + field_ram_readout = !field; + else + field_ram_readout = 0; + } + + if(scanline == VertStart && InVBlank) + { + InVBlank = false; + + // Note to self: X-Men Mutant Academy relies on this being set on the proper scanline in 480i mode(otherwise it locks up on startup). + //if(HeightMode) + // DisplayFB_CurYOffset = field; + } + + IRQ_Assert(IRQ_VBLANK, InVBlank); + TIMER_SetVBlank(InVBlank); + // + // + // + + // Needs to occur even in vblank. + // Not particularly confident about the timing of this in regards to vblank and the upper bit(ODE) of the GPU status port, though the test that + // showed an oddity was pathological in that VertEnd < VertStart in it. + if((DisplayMode & 0x24) == 0x24) + DisplayFB_CurLineYReadout = (DisplayFB_YStart + (DisplayFB_CurYOffset << 1) + (InVBlank ? 0 : field_ram_readout)) & 0x1FF; + else + DisplayFB_CurLineYReadout = (DisplayFB_YStart + DisplayFB_CurYOffset) & 0x1FF; + + if((bool)(DisplayMode & 0x08) == HardwarePALType && scanline >= FirstVisibleLine && scanline < (FirstVisibleLine + VisibleLineCount) && !skip && espec) + { + uint32 *dest; + int32 dest_line; + int32 fb_x = DisplayFB_XStart * 2; + int32 dx_start = HorizStart, dx_end = HorizEnd; + + dest_line = ((scanline - FirstVisibleLine) << espec->InterlaceOn) + espec->InterlaceField; + dest = surface->pixels + (drxbo - dmpa) + dest_line * surface->pitch32; + + if(dx_end < dx_start) + dx_end = dx_start; + + dx_start = dx_start / DotClockRatios[dmc]; + dx_end = dx_end / DotClockRatios[dmc]; + + dx_start -= hmc_to_visible / DotClockRatios[dmc]; + dx_end -= hmc_to_visible / DotClockRatios[dmc]; + dx_start += 7; + dx_end += 7; + + if(dx_start < 0) + { + fb_x -= dx_start * ((DisplayMode & 0x10) ? 3 : 2); + fb_x &= 0x7FF; //0x3FF; + dx_start = 0; + } + + if((uint32)dx_end > dmw) + dx_end = dmw; + + if(InVBlank || DisplayOff) + dx_start = dx_end = 0; + + LineWidths[dest_line] = dmw - dmpa * 2; + + { + const uint16 *src = GPURAM[DisplayFB_CurLineYReadout]; + const uint32 black = surface->MakeColor(0, 0, 0); + + for(int32 x = 0; x < dx_start; x++) + dest[x] = black; + + //printf("%d %d %d - %d %d\n", scanline, dx_start, dx_end, HorizStart, HorizEnd); + if(surface->format.Rshift == 0 && surface->format.Gshift == 8 && surface->format.Bshift == 16) + ReorderRGB<0, 8, 16>(DisplayMode & 0x10, src, dest, dx_start, dx_end, fb_x); + else if(surface->format.Rshift == 8 && surface->format.Gshift == 16 && surface->format.Bshift == 24) + ReorderRGB<8, 16, 24>(DisplayMode & 0x10, src, dest, dx_start, dx_end, fb_x); + else if(surface->format.Rshift == 16 && surface->format.Gshift == 8 && surface->format.Bshift == 0) + ReorderRGB<16, 8, 0>(DisplayMode & 0x10, src, dest, dx_start, dx_end, fb_x); + else if(surface->format.Rshift == 24 && surface->format.Gshift == 16 && surface->format.Bshift == 8) + ReorderRGB<24, 16, 8>(DisplayMode & 0x10, src, dest, dx_start, dx_end, fb_x); + else + ReorderRGB_Var(surface->format.Rshift, surface->format.Gshift, surface->format.Bshift, DisplayMode & 0x10, src, dest, dx_start, dx_end, fb_x); + + for(uint32 x = dx_end; x < dmw; x++) + dest[x] = black; + } + + //if(scanline == 64) + // printf("%u\n", sys_timestamp - ((uint64)gpu_clocks * 65536) / GPUClockRatio); + + PSX_GPULineHook(sys_timestamp, sys_timestamp - ((uint64)gpu_clocks * 65536) / GPUClockRatio, scanline == 0, dest, &surface->format, dmw, (hmc_to_visible - 220) / DotClockRatios[dmc], (HardwarePALType ? 53203425 : 53693182) / DotClockRatios[dmc], DotClockRatios[dmc]); + } + else + { + PSX_GPULineHook(sys_timestamp, sys_timestamp - ((uint64)gpu_clocks * 65536) / GPUClockRatio, scanline == 0, NULL, &surface->format, 0, 0, 0, 0); + } + + if(!InVBlank) + { + DisplayFB_CurYOffset = (DisplayFB_CurYOffset + 1) & 0x1FF; + } + } + PSX_SetEventNT(PSX_EVENT_TIMER, TIMER_Update(sys_timestamp)); // Mostly so the next event time gets recalculated properly in regards to our calls + // to TIMER_SetVBlank() and TIMER_SetHRetrace(). + } // end if(!LineClockCounter) + } // end while(gpu_clocks > 0) + + //puts("GPU Update End"); + + TheEnd: + lastts = sys_timestamp; + + { + int32 next_dt = LineClockCounter; + + next_dt = (((int64)next_dt << 16) - GPUClockCounter + GPUClockRatio - 1) / GPUClockRatio; + + next_dt = std::max(1, next_dt); + next_dt = std::min(128, next_dt); + + //printf("%d\n", next_dt); + + return(sys_timestamp + next_dt); + } +} + +void PS_GPU::StartFrame(EmulateSpecStruct *espec_arg) +{ + sl_zero_reached = false; + + if(!espec_arg) + { + espec = NULL; + surface = NULL; + DisplayRect = NULL; + LineWidths = NULL; + skip = true; + return; + } + + espec = espec_arg; + + surface = espec->surface; + DisplayRect = &espec->DisplayRect; + LineWidths = espec->LineWidths; + skip = espec->skip; + + if(espec->VideoFormatChanged) + { + const auto& f = surface->format; + + for(int rc = 0; rc < 0x8000; rc++) + { + const uint8 a = rc; + const uint8 b = rc >> 8; + + (OutputLUT + 0)[a] = ((a & 0x1F) << (3 + f.Rshift)) | ((a >> 5) << (3 + f.Gshift)); + (OutputLUT + 256)[b] = ((b & 0x3) << (6 + f.Gshift)) | (((b >> 2) & 0x1F) << (3 + f.Bshift)); + } + } +} + +void PS_GPU::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + uint32 TexCache_Tag[256]; + uint16 TexCache_Data[256][4]; + + for(unsigned i = 0; i < 256; i++) + { + TexCache_Tag[i] = TexCache[i].Tag; + + for(unsigned j = 0; j < 4; j++) + TexCache_Data[i][j] = TexCache[i].Data[j]; + } + + SFORMAT StateRegs[] = + { + SFARRAY16(&GPURAM[0][0], sizeof(GPURAM) / sizeof(GPURAM[0][0])), + + SFARRAY16(&CLUT_Cache[0], sizeof(CLUT_Cache) / sizeof(CLUT_Cache[0])), + SFVAR(CLUT_Cache_VB), + + SFARRAY32(TexCache_Tag, sizeof(TexCache_Tag) / sizeof(TexCache_Tag[0])), + SFARRAY16(&TexCache_Data[0][0], sizeof(TexCache_Data) / sizeof(TexCache_Data[0][0])), + + SFVAR(DMAControl), + + SFVAR(ClipX0), + SFVAR(ClipY0), + SFVAR(ClipX1), + SFVAR(ClipY1), + + SFVAR(OffsX), + SFVAR(OffsY), + + SFVAR(dtd), + SFVAR(dfe), + + SFVAR(MaskSetOR), + SFVAR(MaskEvalAND), + + SFVAR(TexDisable), + SFVAR(TexDisableAllowChange), + + SFVAR(tww), + SFVAR(twh), + SFVAR(twx), + SFVAR(twy), + + SFVAR(TexPageX), + SFVAR(TexPageY), + + SFVAR(SpriteFlip), + + SFVAR(abr), + SFVAR(TexMode), + + SFARRAY32(&BlitterFIFO.data[0], sizeof(BlitterFIFO.data) / sizeof(BlitterFIFO.data[0])), + SFVAR(BlitterFIFO.read_pos), + SFVAR(BlitterFIFO.write_pos), + SFVAR(BlitterFIFO.in_count), + + SFVAR(DataReadBuffer), + SFVAR(DataReadBufferEx), + + SFVAR(IRQPending), + + SFVAR(InCmd), + SFVAR(InCmd_CC), + +#define TVHELPER(n) SFVAR(n.x), SFVAR(n.y), SFVAR(n.u), SFVAR(n.v), SFVAR(n.r), SFVAR(n.g), SFVAR(n.b) + TVHELPER(InQuad_F3Vertices[0]), + TVHELPER(InQuad_F3Vertices[1]), + TVHELPER(InQuad_F3Vertices[2]), +#undef TVHELPER + + SFVAR(InPLine_PrevPoint.x), + SFVAR(InPLine_PrevPoint.y), + SFVAR(InPLine_PrevPoint.r), + SFVAR(InPLine_PrevPoint.g), + SFVAR(InPLine_PrevPoint.b), + + SFVAR(FBRW_X), + SFVAR(FBRW_Y), + SFVAR(FBRW_W), + SFVAR(FBRW_H), + SFVAR(FBRW_CurY), + SFVAR(FBRW_CurX), + + SFVAR(DisplayMode), + SFVAR(DisplayOff), + SFVAR(DisplayFB_XStart), + SFVAR(DisplayFB_YStart), + + SFVAR(HorizStart), + SFVAR(HorizEnd), + + SFVAR(VertStart), + SFVAR(VertEnd), + + SFVAR(DisplayFB_CurYOffset), + SFVAR(DisplayFB_CurLineYReadout), + + SFVAR(InVBlank), + + SFVAR(LinesPerField), + SFVAR(scanline), + SFVAR(field), + SFVAR(field_ram_readout), + SFVAR(PhaseChange), + + SFVAR(DotClockCounter), + + SFVAR(GPUClockCounter), + SFVAR(LineClockCounter), + SFVAR(LinePhase), + + SFVAR(DrawTimeAvail), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "GPU"); + + if(load) + { + for(unsigned i = 0; i < 256; i++) + { + TexCache[i].Tag = TexCache_Tag[i]; + + for(unsigned j = 0; j < 4; j++) + TexCache[i].Data[j] = TexCache_Data[i][j]; + } + + RecalcTexWindowStuff(); + BlitterFIFO.SaveStatePostLoad(); + + HorizStart &= 0xFFF; + HorizEnd &= 0xFFF; + + IRQ_Assert(IRQ_GPU, IRQPending); + } +} + +} diff --git a/Mednafen/mednafen/psx/gpu.h b/Mednafen/mednafen/psx/gpu.h new file mode 100644 index 0000000000..c315fc95ab --- /dev/null +++ b/Mednafen/mednafen/psx/gpu.h @@ -0,0 +1,334 @@ +// WARNING WARNING WARNING: ONLY use CanRead() method of BlitterFIFO, and NOT CanWrite(), since the FIFO is larger than the actual PS1 GPU FIFO to accommodate +// our lack of fancy superscalarish command sequencer. + +#ifndef __MDFN_PSX_GPU_H +#define __MDFN_PSX_GPU_H + +#include "FastFIFO.h" + +namespace MDFN_IEN_PSX +{ + +class PS_GPU; + +struct CTEntry +{ + void (*func[4][8])(PS_GPU* g, const uint32 *cb); + uint8 len; + uint8 fifo_fb_len; + bool ss_cmd; +}; + +struct tri_vertex +{ + int32 x, y; + int32 u, v; + int32 r, g, b; +}; + +struct i_group; +struct i_deltas; + +struct line_point +{ + int32 x, y; + uint8 r, g, b; +}; + +class PS_GPU +{ + public: + + PS_GPU(bool pal_clock_and_tv, int sls, int sle, bool show_h_overscan) MDFN_COLD; + ~PS_GPU() MDFN_COLD; + + void FillVideoParams(MDFNGI* gi) MDFN_COLD; + + void Power(void) MDFN_COLD; + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + void ResetTS(void); + + void StartFrame(EmulateSpecStruct *espec); + + pscpu_timestamp_t Update(const pscpu_timestamp_t timestamp); + + void Write(const pscpu_timestamp_t timestamp, uint32 A, uint32 V); + + INLINE bool CalcFIFOReadyBit(void) + { + if(InCmd & (INCMD_PLINE | INCMD_QUAD)) + return(false); + + if(BlitterFIFO.CanRead() == 0) + return(true); + + if(InCmd & (INCMD_FBREAD | INCMD_FBWRITE)) + return(false); + + if(BlitterFIFO.CanRead() >= Commands[BlitterFIFO.Peek() >> 24].fifo_fb_len) + return(false); + + return(true); + } + + INLINE bool DMACanWrite(void) + { + return CalcFIFOReadyBit(); + } + + void WriteDMA(uint32 V); + uint32 ReadDMA(void); + + uint32 Read(const pscpu_timestamp_t timestamp, uint32 A); + + inline int32 GetScanlineNum(void) + { + return(scanline); + } + + INLINE uint16 PeekRAM(uint32 A) + { + return(GPURAM[(A >> 10) & 0x1FF][A & 0x3FF]); + } + + INLINE void PokeRAM(uint32 A, uint16 V) + { + GPURAM[(A >> 10) & 0x1FF][A & 0x3FF] = V; + } + + private: + + uint16 CLUT_Cache[256]; + uint32 CLUT_Cache_VB; // Don't try to be clever and reduce it to 16 bits... ~0U is value for invalidated state. + + template + void Update_CLUT_Cache(uint16 raw_clut); + + struct // Speedup-cache varibles, derived from other variables; shouldn't be saved in save states. + { + // TW*_* variables derived from tww, twh, twx, twy, TexPageX, TexPageY + uint32 TWX_AND; + uint32 TWX_ADD; + + uint32 TWY_AND; + uint32 TWY_ADD; + } SUCV; + void RecalcTexWindowStuff(void); + + struct + { + uint16 Data[4]; + uint32 Tag; + } TexCache[256]; + + void InvalidateTexCache(void); + void InvalidateCache(void); + + void SetTPage(uint32); + + void ProcessFIFO(void); + void WriteCB(uint32 data); + uint32 ReadData(void); + void SoftReset(void); + + uint32 DMAControl; + + // + // Drawing stuff + // + //int32 TexPageX; // 0, 64, 128, 192, etc up to 960 + //int32 TexPageY; // 0 or 256 + //uint32 abr; // Semi-transparency mode(0~3) + //bool dtd; // Dithering enable + + int32 ClipX0; + int32 ClipY0; + int32 ClipX1; + int32 ClipY1; + + int32 OffsX; + int32 OffsY; + + bool dtd; + bool dfe; + + uint32 MaskSetOR; + uint32 MaskEvalAND; + + bool TexDisable; + bool TexDisableAllowChange; + + uint8 tww, twh, twx, twy; + + uint32 TexPageX; + uint32 TexPageY; + + uint32 SpriteFlip; + + uint32 abr; + uint32 TexMode; + + uint8 DitherLUT[4][4][512]; // Y, X, 8-bit source value(256 extra for saturation) + + bool LineSkipTest(unsigned y); + + template + void PlotPixel(uint32 x, uint32 y, uint16 pix); + + template + uint16 GetTexel(uint32 u, uint32 v); + + uint16 ModTexel(uint16 texel, int32 r, int32 g, int32 b, const int32 dither_x, const int32 dither_y); + + template + void DrawSpan(int y, const int32 x_start, const int32 x_bound, i_group ig, const i_deltas &idl); + + template + void DrawTriangle(tri_vertex *vertices); + + template + void DrawSprite(int32 x_arg, int32 y_arg, int32 w, int32 h, uint8 u_arg, uint8 v_arg, uint32 color); + + template + void DrawLine(line_point *vertices); + + + public: + template + void Command_DrawPolygon(const uint32 *cb); + + template + void Command_DrawSprite(const uint32 *cb); + + template + void Command_DrawLine(const uint32 *cb); + + void Command_ClearCache(const uint32 *cb); + void Command_IRQ(const uint32 *cb); + + void Command_FBFill(const uint32 *cb); + void Command_FBCopy(const uint32 *cb); + void Command_FBWrite(const uint32 *cb); + void Command_FBRead(const uint32 *cb); + + void Command_DrawMode(const uint32 *cb); + void Command_TexWindow(const uint32 *cb); + void Command_Clip0(const uint32 *cb); + void Command_Clip1(const uint32 *cb); + void Command_DrawingOffset(const uint32 *cb); + void Command_MaskSetting(const uint32 *cb); + + private: + static CTEntry Commands[256]; + static const CTEntry Commands_00_1F[0x20]; + static const CTEntry Commands_20_3F[0x20]; + static const CTEntry Commands_40_5F[0x20]; + static const CTEntry Commands_60_7F[0x20]; + static const CTEntry Commands_80_FF[0x80]; + + FastFIFO BlitterFIFO; // 0x10 on actual PS1 GPU, 0x20 here(see comment at top of gpu.h) + uint32 DataReadBuffer; + uint32 DataReadBufferEx; + + bool IRQPending; + // + // + // + // Powers of 2 for faster multiple equality testing(just for multi-testing; InCmd itself will only contain 0, or a power of 2). + enum + { + INCMD_NONE = 0, + INCMD_PLINE = (1 << 0), + INCMD_QUAD = (1 << 1), + INCMD_FBWRITE = (1 << 2), + INCMD_FBREAD = (1 << 3) + }; + uint8 InCmd; + uint8 InCmd_CC; + + tri_vertex InQuad_F3Vertices[3]; + + line_point InPLine_PrevPoint; + + uint32 FBRW_X; + uint32 FBRW_Y; + uint32 FBRW_W; + uint32 FBRW_H; + uint32 FBRW_CurY; + uint32 FBRW_CurX; + + // + // Display Parameters + // + uint32 DisplayMode; + + bool DisplayOff; + uint32 DisplayFB_XStart; + uint32 DisplayFB_YStart; + + uint32 HorizStart; + uint32 HorizEnd; + + uint32 VertStart; + uint32 VertEnd; + + // + // Display work vars + // + uint32 DisplayFB_CurYOffset; + uint32 DisplayFB_CurLineYReadout; + + bool InVBlank; + + // + // + // + uint32 LinesPerField; + uint32 scanline; + bool field; + bool field_ram_readout; + bool PhaseChange; + + uint32 DotClockCounter; + + uint64 GPUClockCounter; + uint32 GPUClockRatio; + int32 LineClockCounter; + int32 LinePhase; + + int32 DrawTimeAvail; + + pscpu_timestamp_t lastts; + + // Y, X + uint16 GPURAM[512][1024]; + + // + // + // + int32 hmc_to_visible; + bool hide_hoverscan; + + bool sl_zero_reached; + // + // + + EmulateSpecStruct *espec; + MDFN_Surface *surface; + MDFN_Rect *DisplayRect; + int32 *LineWidths; + bool skip; + bool HardwarePALType; + int LineVisFirst, LineVisLast; + + uint32 OutputLUT[384]; + void ReorderRGB_Var(uint32 out_Rshift, uint32 out_Gshift, uint32 out_Bshift, bool bpp24, const uint16 *src, uint32 *dest, const int32 dx_start, const int32 dx_end, int32 fb_x); + + template + void ReorderRGB(bool bpp24, const uint16 *src, uint32 *dest, const int32 dx_start, const int32 dx_end, int32 fb_x) NO_INLINE; +}; + +} +#endif diff --git a/Mednafen/mednafen/psx/gpu_common.inc b/Mednafen/mednafen/psx/gpu_common.inc new file mode 100644 index 0000000000..181295a14c --- /dev/null +++ b/Mednafen/mednafen/psx/gpu_common.inc @@ -0,0 +1,318 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +template +INLINE void PS_GPU::PlotPixel(uint32 x, uint32 y, uint16 fore_pix) +{ + y &= 511; // More Y precision bits than GPU RAM installed in (non-arcade, at least) Playstation hardware. + + if(BlendMode >= 0 && (fore_pix & 0x8000)) + { + uint16 bg_pix = GPURAM[y][x]; // Don't use bg_pix for mask evaluation, it's modified in blending code paths. + uint16 pix; // = fore_pix & 0x8000; + +/* + static const int32 tab[4][2] = + { + { 2, 2 }, + { 4, 4 }, + { 4, -4 }, + { 4, 1 } + }; +*/ + // Efficient 15bpp pixel math algorithms from blargg + switch(BlendMode) + { + case 0: + bg_pix |= 0x8000; + pix = ((fore_pix + bg_pix) - ((fore_pix ^ bg_pix) & 0x0421)) >> 1; + break; + + case 1: + { + bg_pix &= ~0x8000; + + uint32 sum = fore_pix + bg_pix; + uint32 carry = (sum - ((fore_pix ^ bg_pix) & 0x8421)) & 0x8420; + + pix = (sum - carry) | (carry - (carry >> 5)); + } + break; + + case 2: + { + bg_pix |= 0x8000; + fore_pix &= ~0x8000; + + uint32 diff = bg_pix - fore_pix + 0x108420; + uint32 borrow = (diff - ((bg_pix ^ fore_pix) & 0x108420)) & 0x108420; + + pix = (diff - borrow) & (borrow - (borrow >> 5)); + } + break; + + case 3: + { + bg_pix &= ~0x8000; + fore_pix = ((fore_pix >> 2) & 0x1CE7) | 0x8000; + + uint32 sum = fore_pix + bg_pix; + uint32 carry = (sum - ((fore_pix ^ bg_pix) & 0x8421)) & 0x8420; + + pix = (sum - carry) | (carry - (carry >> 5)); + } + break; + } + + if(!MaskEval_TA || !(GPURAM[y][x] & 0x8000)) + GPURAM[y][x] = (textured ? pix : (pix & 0x7FFF)) | MaskSetOR; + } + else + { + if(!MaskEval_TA || !(GPURAM[y][x] & 0x8000)) + GPURAM[y][x] = (textured ? fore_pix : (fore_pix & 0x7FFF)) | MaskSetOR; + } +} + +INLINE uint16 PS_GPU::ModTexel(uint16 texel, int32 r, int32 g, int32 b, const int32 dither_x, const int32 dither_y) +{ + uint16 ret = texel & 0x8000; + + ret |= DitherLUT[dither_y][dither_x][(((texel & 0x1F) * r) >> (5 - 1))] << 0; + ret |= DitherLUT[dither_y][dither_x][(((texel & 0x3E0) * g) >> (10 - 1))] << 5; + ret |= DitherLUT[dither_y][dither_x][(((texel & 0x7C00) * b) >> (15 - 1))] << 10; + + return(ret); +} + +template +INLINE void PS_GPU::Update_CLUT_Cache(uint16 raw_clut) +{ + if(TexMode_TA < 2) + { + const uint32 new_ccvb = ((raw_clut & 0x7FFF) | (TexMode_TA << 16)); // Confirmed upper bit of raw_clut is ignored(at least on SCPH-5501's GPU). + + if(CLUT_Cache_VB != new_ccvb) + { + uint16* const gpulp = GPURAM[(raw_clut >> 6) & 0x1FF]; + const uint32 cxo = (raw_clut & 0x3F) << 4; + const uint32 count = (TexMode_TA ? 256 : 16); + + DrawTimeAvail -= count; + + for(unsigned i = 0; i < count; i++) + { + CLUT_Cache[i] = gpulp[(cxo + i) & 0x3FF]; + } + + CLUT_Cache_VB = new_ccvb; + } + } +} + +#if 0 + TexWindowX_AND = ~(tww << 3); + TexWindowX_ADD = ((twx & tww) << 3; + + TexWindowY_AND = ~(twh << 3); + TexWindowY_OR = (twy & twh) << 3; + + uint32 u = (u_arg & TexWindowX_AND) TexWindowX_OR; + uint32 v = (v_arg & TexWindowY_AND) | TexWindowY_OR; + uint32 fbtex_x = TexPageX + (u >> (2 - TexMode_TA)); + uint32 fbtex_y = TexPageY + v; + uint16 fbw = GPURAM[fbtex_y][fbtex_x & 1023]; + + if(TexMode_TA != 2) + { + if(TexMode_TA == 0) + fbw = (fbw >> ((u & 3) * 4)) & 0xF; + else + fbw = (fbw >> ((u & 1) * 8)) & 0xFF; + + fbw = CLUT_Cache[fbw]; + } +#endif + +INLINE void PS_GPU::RecalcTexWindowStuff(void) +{ + SUCV.TWX_AND = ~(tww << 3); + SUCV.TWX_ADD = ((twx & tww) << 3) + (TexPageX << (2 - std::min(2, TexMode))); + + SUCV.TWY_AND = ~(twh << 3); + SUCV.TWY_ADD = ((twy & twh) << 3) + TexPageY; +} + +template +INLINE uint16 PS_GPU::GetTexel(uint32 u_arg, uint32 v_arg) +{ + static_assert(TexMode_TA <= 2, "TexMode_TA must be <= 2"); + + uint32 u_ext = ((u_arg & SUCV.TWX_AND) + SUCV.TWX_ADD); + uint32 fbtex_x = ((u_ext >> (2 - TexMode_TA))) & 1023; + uint32 fbtex_y = (v_arg & SUCV.TWY_AND) + SUCV.TWY_ADD; + uint32 gro = fbtex_y * 1024U + fbtex_x; + + decltype(&TexCache[0]) c; + + switch(TexMode_TA) + { + case 0: c = &TexCache[((gro >> 2) & 0x3) | ((gro >> 8) & 0xFC)]; break; // 64x64 + case 1: c = &TexCache[((gro >> 2) & 0x7) | ((gro >> 7) & 0xF8)]; break; // 64x32 (NOT 32x64!) + case 2: c = &TexCache[((gro >> 2) & 0x7) | ((gro >> 7) & 0xF8)]; break; // 32x32 + } + + if(MDFN_UNLIKELY(c->Tag != (gro &~ 0x3))) + { + // SCPH-1001 old revision GPU is like(for sprites at least): (20 + 4) + // SCPH-5501 new revision GPU is like(for sprites at least): (12 + 4) + // + // We'll be conservative and just go with 4 for now, until we can run some tests with triangles too. + // + DrawTimeAvail -= 4; + c->Data[0] = (&GPURAM[0][0])[gro &~ 0x3]; + c->Data[1] = (&GPURAM[0][1])[gro &~ 0x3]; + c->Data[2] = (&GPURAM[0][2])[gro &~ 0x3]; + c->Data[3] = (&GPURAM[0][3])[gro &~ 0x3]; + c->Tag = (gro &~ 0x3); + } + + uint16 fbw = c->Data[gro & 0x3]; + + if(TexMode_TA != 2) + { + if(TexMode_TA == 0) + fbw = (fbw >> ((u_ext & 3) * 4)) & 0xF; + else + fbw = (fbw >> ((u_ext & 1) * 8)) & 0xFF; + + fbw = CLUT_Cache[fbw]; + } + + return(fbw); +} + +INLINE bool PS_GPU::LineSkipTest(unsigned y) +{ + //DisplayFB_XStart >= OffsX && DisplayFB_YStart >= OffsY && + // ((y & 1) == (DisplayFB_CurLineYReadout & 1)) + + if((DisplayMode & 0x24) != 0x24) + return false; + + if(!dfe && ((y & 1) == ((DisplayFB_YStart + field_ram_readout) & 1))/* && !DisplayOff*/) //&& (y >> 1) >= DisplayFB_YStart && (y >> 1) < (DisplayFB_YStart + (VertEnd - VertStart))) + return true; + + return false; +} + + +// +// Command table generation macros follow: +// + +//#define BM_HELPER(fg) { fg(0), fg(1), fg(2), fg(3) } + +#define POLY_HELPER_SUB(bm, cv, tm, mam) \ + G_Command_DrawPolygon<3 + ((cv & 0x8) >> 3), ((cv & 0x10) >> 4), ((cv & 0x4) >> 2), ((cv & 0x2) >> 1) ? bm : -1, ((cv & 1) ^ 1) & ((cv & 0x4) >> 2), tm, mam > + +#define POLY_HELPER_FG(bm, cv) \ + { \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 0 : 0), 0), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 1 : 0), 0), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 0), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 0), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 0 : 0), 1), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 1 : 0), 1), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 1), \ + POLY_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 1), \ + } + +#define POLY_HELPER(cv) \ + { \ + { POLY_HELPER_FG(0, cv), POLY_HELPER_FG(1, cv), POLY_HELPER_FG(2, cv), POLY_HELPER_FG(3, cv) }, \ + 1 + (3 /*+ ((cv & 0x8) >> 3)*/) * ( 1 + ((cv & 0x4) >> 2) + ((cv & 0x10) >> 4) ) - ((cv & 0x10) >> 4), \ + 1, \ + false \ + } + +// +// + +#define SPR_HELPER_SUB(bm, cv, tm, mam) G_Command_DrawSprite<(cv >> 3) & 0x3, ((cv & 0x4) >> 2), ((cv & 0x2) >> 1) ? bm : -1, ((cv & 1) ^ 1) & ((cv & 0x4) >> 2), tm, mam> + +#define SPR_HELPER_FG(bm, cv) \ + { \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 0 : 0), 0), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 1 : 0), 0), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 0), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 0), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 0 : 0), 1), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 1 : 0), 1), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 1), \ + SPR_HELPER_SUB(bm, cv, ((cv & 0x4) ? 2 : 0), 1), \ + } + + +#define SPR_HELPER(cv) \ + { \ + { SPR_HELPER_FG(0, cv), SPR_HELPER_FG(1, cv), SPR_HELPER_FG(2, cv), SPR_HELPER_FG(3, cv) }, \ + 2 + ((cv & 0x4) >> 2) + ((cv & 0x18) ? 0 : 1), \ + 2 | ((cv & 0x4) >> 2) | ((cv & 0x18) ? 0 : 1), /* |, not +, for this */ \ + false \ + } + +// +// + +#define LINE_HELPER_SUB(bm, cv, mam) G_Command_DrawLine<((cv & 0x08) >> 3), ((cv & 0x10) >> 4), ((cv & 0x2) >> 1) ? bm : -1, mam> + +#define LINE_HELPER_FG(bm, cv) \ + { \ + LINE_HELPER_SUB(bm, cv, 0), \ + LINE_HELPER_SUB(bm, cv, 0), \ + LINE_HELPER_SUB(bm, cv, 0), \ + LINE_HELPER_SUB(bm, cv, 0), \ + LINE_HELPER_SUB(bm, cv, 1), \ + LINE_HELPER_SUB(bm, cv, 1), \ + LINE_HELPER_SUB(bm, cv, 1), \ + LINE_HELPER_SUB(bm, cv, 1) \ + } + +#define LINE_HELPER(cv) \ + { \ + { LINE_HELPER_FG(0, cv), LINE_HELPER_FG(1, cv), LINE_HELPER_FG(2, cv), LINE_HELPER_FG(3, cv) }, \ + 3 + ((cv & 0x10) >> 4), \ + 1, \ + false \ + } + +// +// + + +#define OTHER_HELPER_FG(bm, arg_ptr) { arg_ptr, arg_ptr, arg_ptr, arg_ptr, arg_ptr, arg_ptr, arg_ptr, arg_ptr } +#define OTHER_HELPER(arg_cs, arg_fbcs, arg_ss, arg_ptr) { { OTHER_HELPER_FG(0, arg_ptr), OTHER_HELPER_FG(1, arg_ptr), OTHER_HELPER_FG(2, arg_ptr), OTHER_HELPER_FG(3, arg_ptr) }, arg_cs, arg_fbcs, arg_ss } +#define OTHER_HELPER_X2(arg_cs, arg_fbcs, arg_ss, arg_ptr) OTHER_HELPER(arg_cs, arg_fbcs, arg_ss, arg_ptr), OTHER_HELPER(arg_cs, arg_fbcs, arg_ss, arg_ptr) +#define OTHER_HELPER_X4(arg_cs, arg_fbcs, arg_ss, arg_ptr) OTHER_HELPER_X2(arg_cs, arg_fbcs, arg_ss, arg_ptr), OTHER_HELPER_X2(arg_cs, arg_fbcs, arg_ss, arg_ptr) +#define OTHER_HELPER_X8(arg_cs, arg_fbcs, arg_ss, arg_ptr) OTHER_HELPER_X4(arg_cs, arg_fbcs, arg_ss, arg_ptr), OTHER_HELPER_X4(arg_cs, arg_fbcs, arg_ss, arg_ptr) +#define OTHER_HELPER_X16(arg_cs, arg_fbcs, arg_ss, arg_ptr) OTHER_HELPER_X8(arg_cs, arg_fbcs, arg_ss, arg_ptr), OTHER_HELPER_X8(arg_cs, arg_fbcs, arg_ss, arg_ptr) +#define OTHER_HELPER_X32(arg_cs, arg_fbcs, arg_ss, arg_ptr) OTHER_HELPER_X16(arg_cs, arg_fbcs, arg_ss, arg_ptr), OTHER_HELPER_X16(arg_cs, arg_fbcs, arg_ss, arg_ptr) + +#define NULLCMD_FG(bm) { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } +#define NULLCMD() { { NULLCMD_FG(0), NULLCMD_FG(1), NULLCMD_FG(2), NULLCMD_FG(3) }, 1, 1, true } + diff --git a/Mednafen/mednafen/psx/gpu_line.cpp b/Mednafen/mednafen/psx/gpu_line.cpp new file mode 100644 index 0000000000..e74b226b59 --- /dev/null +++ b/Mednafen/mednafen/psx/gpu_line.cpp @@ -0,0 +1,300 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "gpu.h" + +namespace MDFN_IEN_PSX +{ +#include "gpu_common.inc" + +struct line_fxp_coord +{ + uint64 x, y; + uint32 r, g, b; +}; + +struct line_fxp_step +{ + int64 dx_dk, dy_dk; + int32 dr_dk, dg_dk, db_dk; +}; + +enum { Line_XY_FractBits = 32 }; +enum { Line_RGB_FractBits = 12 }; + +template +static INLINE void LinePointToFXPCoord(const line_point &point, const line_fxp_step &step, line_fxp_coord &coord) +{ + coord.x = ((uint64)point.x << Line_XY_FractBits) | (1ULL << (Line_XY_FractBits - 1)); + coord.y = ((uint64)point.y << Line_XY_FractBits) | (1ULL << (Line_XY_FractBits - 1)); + + coord.x -= 1024; + + if(step.dy_dk < 0) + coord.y -= 1024; + + if(goraud) + { + coord.r = (point.r << Line_RGB_FractBits) | (1 << (Line_RGB_FractBits - 1)); + coord.g = (point.g << Line_RGB_FractBits) | (1 << (Line_RGB_FractBits - 1)); + coord.b = (point.b << Line_RGB_FractBits) | (1 << (Line_RGB_FractBits - 1)); + } +} + +static INLINE int64 LineDivide(int64 delta, int32 dk) +{ + delta = (uint64)delta << Line_XY_FractBits; + + if(delta < 0) + delta -= dk - 1; + if(delta > 0) + delta += dk - 1; + + return(delta / dk); +} + +template +static INLINE void LinePointsToFXPStep(const line_point &point0, const line_point &point1, const int32 dk, line_fxp_step &step) +{ + if(!dk) + { + step.dx_dk = 0; + step.dy_dk = 0; + + if(goraud) + { + step.dr_dk = 0; + step.dg_dk = 0; + step.db_dk = 0; + } + return; + } + + step.dx_dk = LineDivide(point1.x - point0.x, dk); + step.dy_dk = LineDivide(point1.y - point0.y, dk); + + if(goraud) + { + step.dr_dk = (int32)((uint32)(point1.r - point0.r) << Line_RGB_FractBits) / dk; + step.dg_dk = (int32)((uint32)(point1.g - point0.g) << Line_RGB_FractBits) / dk; + step.db_dk = (int32)((uint32)(point1.b - point0.b) << Line_RGB_FractBits) / dk; + } +} + +template +static INLINE void AddLineStep(line_fxp_coord &point, const line_fxp_step &step) +{ + point.x += step.dx_dk; + point.y += step.dy_dk; + + if(goraud) + { + point.r += step.dr_dk; + point.g += step.dg_dk; + point.b += step.db_dk; + } +} + +template +void PS_GPU::DrawLine(line_point *points) +{ + int32 i_dx; + int32 i_dy; + int32 k; + line_fxp_coord cur_point; + line_fxp_step step; + + i_dx = abs(points[1].x - points[0].x); + i_dy = abs(points[1].y - points[0].y); + k = (i_dx > i_dy) ? i_dx : i_dy; + + if(i_dx >= 1024) + return; + + if(i_dy >= 512) + return; + + if(points[0].x >= points[1].x && k) + { + line_point tmp = points[1]; + + points[1] = points[0]; + points[0] = tmp; + } + + DrawTimeAvail -= k * 2; + + // + // + // + + LinePointsToFXPStep(points[0], points[1], k, step); + LinePointToFXPCoord(points[0], step, cur_point); + + // + // + // + for(int32 i = 0; i <= k; i++) // <= is not a typo. + { + // Sign extension is not necessary here for x and y, due to the maximum values that ClipX1 and ClipY1 can contain. + const int32 x = (cur_point.x >> Line_XY_FractBits) & 2047; + const int32 y = (cur_point.y >> Line_XY_FractBits) & 2047; + uint16 pix = 0x8000; + + if(!LineSkipTest(y)) + { + uint8 r, g, b; + + if(goraud) + { + r = cur_point.r >> Line_RGB_FractBits; + g = cur_point.g >> Line_RGB_FractBits; + b = cur_point.b >> Line_RGB_FractBits; + } + else + { + r = points[0].r; + g = points[0].g; + b = points[0].b; + } + + if(dtd) + { + pix |= DitherLUT[y & 3][x & 3][r] << 0; + pix |= DitherLUT[y & 3][x & 3][g] << 5; + pix |= DitherLUT[y & 3][x & 3][b] << 10; + } + else + { + pix |= (r >> 3) << 0; + pix |= (g >> 3) << 5; + pix |= (b >> 3) << 10; + } + + // FIXME: There has to be a faster way than checking for being inside the drawing area for each pixel. + if(x >= ClipX0 && x <= ClipX1 && y >= ClipY0 && y <= ClipY1) + PlotPixel(x, y, pix); + } + + AddLineStep(cur_point, step); + } +} + +template +INLINE void PS_GPU::Command_DrawLine(const uint32 *cb) +{ + const uint8 cc = cb[0] >> 24; // For pline handling later. + line_point points[2]; + + DrawTimeAvail -= 16; // FIXME, correct time. + + if(polyline && InCmd == INCMD_PLINE) + { + //printf("PLINE N\n"); + points[0] = InPLine_PrevPoint; + } + else + { + points[0].r = (*cb >> 0) & 0xFF; + points[0].g = (*cb >> 8) & 0xFF; + points[0].b = (*cb >> 16) & 0xFF; + cb++; + + points[0].x = sign_x_to_s32(11, ((*cb >> 0) & 0xFFFF)) + OffsX; + points[0].y = sign_x_to_s32(11, ((*cb >> 16) & 0xFFFF)) + OffsY; + cb++; + } + + if(goraud) + { + points[1].r = (*cb >> 0) & 0xFF; + points[1].g = (*cb >> 8) & 0xFF; + points[1].b = (*cb >> 16) & 0xFF; + cb++; + } + else + { + points[1].r = points[0].r; + points[1].g = points[0].g; + points[1].b = points[0].b; + } + + points[1].x = sign_x_to_s32(11, ((*cb >> 0) & 0xFFFF)) + OffsX; + points[1].y = sign_x_to_s32(11, ((*cb >> 16) & 0xFFFF)) + OffsY; + cb++; + + if(polyline) + { + InPLine_PrevPoint = points[1]; + + if(InCmd != INCMD_PLINE) + { + InCmd = INCMD_PLINE; + InCmd_CC = cc; + } + } + + DrawLine(points); +} + +// +// C-style function wrappers so our command table isn't so ginormous(in memory usage). +// +template +static void G_Command_DrawLine(PS_GPU* g, const uint32 *cb) +{ + g->Command_DrawLine(cb); +} + +const CTEntry PS_GPU::Commands_40_5F[0x20] = +{ + LINE_HELPER(0x40), + LINE_HELPER(0x41), + LINE_HELPER(0x42), + LINE_HELPER(0x43), + LINE_HELPER(0x44), + LINE_HELPER(0x45), + LINE_HELPER(0x46), + LINE_HELPER(0x47), + LINE_HELPER(0x48), + LINE_HELPER(0x49), + LINE_HELPER(0x4a), + LINE_HELPER(0x4b), + LINE_HELPER(0x4c), + LINE_HELPER(0x4d), + LINE_HELPER(0x4e), + LINE_HELPER(0x4f), + LINE_HELPER(0x50), + LINE_HELPER(0x51), + LINE_HELPER(0x52), + LINE_HELPER(0x53), + LINE_HELPER(0x54), + LINE_HELPER(0x55), + LINE_HELPER(0x56), + LINE_HELPER(0x57), + LINE_HELPER(0x58), + LINE_HELPER(0x59), + LINE_HELPER(0x5a), + LINE_HELPER(0x5b), + LINE_HELPER(0x5c), + LINE_HELPER(0x5d), + LINE_HELPER(0x5e), + LINE_HELPER(0x5f) +}; + +} diff --git a/Mednafen/mednafen/psx/gpu_polygon.cpp b/Mednafen/mednafen/psx/gpu_polygon.cpp new file mode 100644 index 0000000000..de83b7a79b --- /dev/null +++ b/Mednafen/mednafen/psx/gpu_polygon.cpp @@ -0,0 +1,637 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#pragma GCC optimize ("no-unroll-loops,no-peel-loops") + +#include "psx.h" +#include "gpu.h" + +namespace MDFN_IEN_PSX +{ +#include "gpu_common.inc" + +#define COORD_FBS 12 +#define COORD_MF_INT(n) ((n) << COORD_FBS) +#define COORD_POST_PADDING 12 + +struct i_group +{ + uint32 u, v; + uint32 r, g, b; +}; + +struct i_deltas +{ + uint32 du_dx, dv_dx; + uint32 dr_dx, dg_dx, db_dx; + + uint32 du_dy, dv_dy; + uint32 dr_dy, dg_dy, db_dy; +}; + +static INLINE int64 MakePolyXFP(uint32 x) +{ + return ((uint64)x << 32) + ((1ULL << 32) - (1 << 11)); +} + +static INLINE int64 MakePolyXFPStep(int32 dx, int32 dy) +{ + int64 ret; + int64 dx_ex = (uint64)dx << 32; + + if(dx_ex < 0) + dx_ex -= dy - 1; + + if(dx_ex > 0) + dx_ex += dy - 1; + + ret = dx_ex / dy; + + return(ret); +} + +static INLINE int32 GetPolyXFP_Int(int64 xfp) +{ + return(xfp >> 32); +} + +#define CALCIS(x,y) (((B.x - A.x) * (C.y - B.y)) - ((C.x - B.x) * (B.y - A.y))) +template +static INLINE bool CalcIDeltas(i_deltas &idl, const tri_vertex &A, const tri_vertex &B, const tri_vertex &C) +{ + int32 denom = CALCIS(x, y); + + if(!denom) + return(false); + + if(goraud) + { + idl.dr_dx = (uint32)(CALCIS(r, y) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + idl.dr_dy = (uint32)(CALCIS(x, r) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + + idl.dg_dx = (uint32)(CALCIS(g, y) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + idl.dg_dy = (uint32)(CALCIS(x, g) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + + idl.db_dx = (uint32)(CALCIS(b, y) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + idl.db_dy = (uint32)(CALCIS(x, b) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + } + + if(textured) + { + idl.du_dx = (uint32)(CALCIS(u, y) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + idl.du_dy = (uint32)(CALCIS(x, u) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + + idl.dv_dx = (uint32)(CALCIS(v, y) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + idl.dv_dy = (uint32)(CALCIS(x, v) * (1 << COORD_FBS) / denom) << COORD_POST_PADDING; + } + + return(true); +} +#undef CALCIS + +template +static INLINE void AddIDeltas_DX(i_group &ig, const i_deltas &idl, uint32 count = 1) +{ + if(textured) + { + ig.u += idl.du_dx * count; + ig.v += idl.dv_dx * count; + } + + if(goraud) + { + ig.r += idl.dr_dx * count; + ig.g += idl.dg_dx * count; + ig.b += idl.db_dx * count; + } +} + +template +static INLINE void AddIDeltas_DY(i_group &ig, const i_deltas &idl, uint32 count = 1) +{ + if(textured) + { + ig.u += idl.du_dy * count; + ig.v += idl.dv_dy * count; + } + + if(goraud) + { + ig.r += idl.dr_dy * count; + ig.g += idl.dg_dy * count; + ig.b += idl.db_dy * count; + } +} + +template +INLINE void PS_GPU::DrawSpan(int y, const int32 x_start, const int32 x_bound, i_group ig, const i_deltas &idl) +{ + if(LineSkipTest(y)) + return; + + int32 x_ig_adjust = x_start; + int32 w = x_bound - x_start; + int32 x = sign_x_to_s32(11, x_start); + + if(x < ClipX0) + { + int32 delta = ClipX0 - x; + x_ig_adjust += delta; + x += delta; + w -= delta; + } + + if((x + w) > (ClipX1 + 1)) + w = ClipX1 + 1 - x; + + if(w <= 0) + return; + + //printf("%d %d %d %d\n", x, w, ClipX0, ClipX1); + + AddIDeltas_DX(ig, idl, x_ig_adjust); + AddIDeltas_DY(ig, idl, y); + + if(goraud || textured) + DrawTimeAvail -= w * 2; + else if((BlendMode >= 0) || MaskEval_TA) + DrawTimeAvail -= w + ((w + 1) >> 1); + else + DrawTimeAvail -= w; + + do + { + const uint32 r = ig.r >> (COORD_FBS + COORD_POST_PADDING); + const uint32 g = ig.g >> (COORD_FBS + COORD_POST_PADDING); + const uint32 b = ig.b >> (COORD_FBS + COORD_POST_PADDING); + + //assert(x >= ClipX0 && x <= ClipX1); + + if(textured) + { + uint16 fbw = GetTexel(ig.u >> (COORD_FBS + COORD_POST_PADDING), ig.v >> (COORD_FBS + COORD_POST_PADDING)); + + if(fbw) + { + if(TexMult) + { + uint32 dither_x = x & 3; + uint32 dither_y = y & 3; + + if(!dtd) + { + dither_x = 3; + dither_y = 2; + } + + fbw = ModTexel(fbw, r, g, b, dither_x, dither_y); + } + PlotPixel(x, y, fbw); + } + } + else + { + uint16 pix = 0x8000; + + if(goraud && dtd) + { + pix |= DitherLUT[y & 3][x & 3][r] << 0; + pix |= DitherLUT[y & 3][x & 3][g] << 5; + pix |= DitherLUT[y & 3][x & 3][b] << 10; + } + else + { + pix |= (r >> 3) << 0; + pix |= (g >> 3) << 5; + pix |= (b >> 3) << 10; + } + + PlotPixel(x, y, pix); + } + + x++; + AddIDeltas_DX(ig, idl); + } while(MDFN_LIKELY(--w > 0)); +} + +template +INLINE void PS_GPU::DrawTriangle(tri_vertex *vertices) +{ + i_deltas idl; + unsigned core_vertex; + + // + // Calculate the "core" vertex based on the unsorted input vertices, and sort vertices by Y. + // + { + unsigned cvtemp = 0; + + if(vertices[1].x <= vertices[0].x) + { + if(vertices[2].x <= vertices[1].x) + cvtemp = (1 << 2); + else + cvtemp = (1 << 1); + } + else if(vertices[2].x < vertices[0].x) + cvtemp = (1 << 2); + else + cvtemp = (1 << 0); + + if(vertices[2].y < vertices[1].y) + { + std::swap(vertices[2], vertices[1]); + cvtemp = ((cvtemp >> 1) & 0x2) | ((cvtemp << 1) & 0x4) | (cvtemp & 0x1); + } + + if(vertices[1].y < vertices[0].y) + { + std::swap(vertices[1], vertices[0]); + cvtemp = ((cvtemp >> 1) & 0x1) | ((cvtemp << 1) & 0x2) | (cvtemp & 0x4); + } + + if(vertices[2].y < vertices[1].y) + { + std::swap(vertices[2], vertices[1]); + cvtemp = ((cvtemp >> 1) & 0x2) | ((cvtemp << 1) & 0x4) | (cvtemp & 0x1); + } + + core_vertex = cvtemp >> 1; + } + + // + // 0-height, abort out. + // + if(vertices[0].y == vertices[2].y) + return; + + if((vertices[2].y - vertices[0].y) >= 512) + { + //PSX_WARNING("[GPU] Triangle height too large: %d", (vertices[2].y - vertices[0].y)); + return; + } + + if(abs(vertices[2].x - vertices[0].x) >= 1024 || + abs(vertices[2].x - vertices[1].x) >= 1024 || + abs(vertices[1].x - vertices[0].x) >= 1024) + { + //PSX_WARNING("[GPU] Triangle width too large: %d %d %d", abs(vertices[2].x - vertices[0].x), abs(vertices[2].x - vertices[1].x), abs(vertices[1].x - vertices[0].x)); + return; + } + + if(!CalcIDeltas(idl, vertices[0], vertices[1], vertices[2])) + return; + + // [0] should be top vertex, [2] should be bottom vertex, [1] should be off to the side vertex. + // + // + int64 base_coord; + int64 base_step; + + int64 bound_coord_us; + int64 bound_coord_ls; + + bool right_facing; + i_group ig; + + if(textured) + { + ig.u = (COORD_MF_INT(vertices[core_vertex].u) + (1 << (COORD_FBS - 1))) << COORD_POST_PADDING; + ig.v = (COORD_MF_INT(vertices[core_vertex].v) + (1 << (COORD_FBS - 1))) << COORD_POST_PADDING; + } + + ig.r = (COORD_MF_INT(vertices[core_vertex].r) + (1 << (COORD_FBS - 1))) << COORD_POST_PADDING; + ig.g = (COORD_MF_INT(vertices[core_vertex].g) + (1 << (COORD_FBS - 1))) << COORD_POST_PADDING; + ig.b = (COORD_MF_INT(vertices[core_vertex].b) + (1 << (COORD_FBS - 1))) << COORD_POST_PADDING; + + AddIDeltas_DX(ig, idl, -vertices[core_vertex].x); + AddIDeltas_DY(ig, idl, -vertices[core_vertex].y); + + base_coord = MakePolyXFP(vertices[0].x); + base_step = MakePolyXFPStep((vertices[2].x - vertices[0].x), (vertices[2].y - vertices[0].y)); + + // + // + // + + if(vertices[1].y == vertices[0].y) + { + bound_coord_us = 0; + right_facing = (bool)(vertices[1].x > vertices[0].x); + } + else + { + bound_coord_us = MakePolyXFPStep((vertices[1].x - vertices[0].x), (vertices[1].y - vertices[0].y)); + right_facing = (bool)(bound_coord_us > base_step); + } + + if(vertices[2].y == vertices[1].y) + bound_coord_ls = 0; + else + bound_coord_ls = MakePolyXFPStep((vertices[2].x - vertices[1].x), (vertices[2].y - vertices[1].y)); + + // + // Left side draw order + // + // core_vertex == 0 + // Left(base): vertices[0] -> (?vertices[1]?) -> vertices[2] + // + // core_vertex == 1: + // Left(base): vertices[1] -> vertices[2], vertices[1] -> vertices[0] + // + // core_vertex == 2: + // Left(base): vertices[2] -> (?vertices[1]?) -> vertices[0] + //printf("%d %d\n", core_vertex, right_facing); + struct + { + uint64 x_coord[2]; + uint64 x_step[2]; + + int32 y_coord; + int32 y_bound; + + bool dec_mode; + } tripart[2]; + +#if 0 + switch(core_vertex) + { + case 0: + tripart[0].dec_mode = tripart[1].dec_mode = false; + + tripart[0].y_coord = vertices[0].y; + tripart[0].y_bound = vertices[1].y; + if(vertices[0].y != vertices[1].y) + { + tripart[0].x_coord[0] = MakePolyXFP(vertices[0].x); + tripart[0].x_step[0] = + + tripart[0].x_coord[1] = MakePolyXFP(vertices[0].x); + tripart[0].x_step[1] = + } + break; + + case 1: + break; + + case 2: + break; + } +#endif + + unsigned vo = 0; + unsigned vp = 0; + + if(core_vertex) + vo = 1; + + if(core_vertex == 2) + vp = 3; + + { + auto* tp = &tripart[vo]; + + tp->y_coord = vertices[0 ^ vo].y; + tp->y_bound = vertices[1 ^ vo].y; + tp->x_coord[right_facing] = MakePolyXFP(vertices[0 ^ vo].x); + tp->x_step[right_facing] = bound_coord_us; + tp->x_coord[!right_facing] = base_coord + ((vertices[vo].y - vertices[0].y) * base_step); + tp->x_step[!right_facing] = base_step; + tp->dec_mode = vo; + } + + { + auto* tp = &tripart[vo ^ 1]; + + tp->y_coord = vertices[1 ^ vp].y; + tp->y_bound = vertices[2 ^ vp].y; + tp->x_coord[right_facing] = MakePolyXFP(vertices[1 ^ vp].x); + tp->x_step[right_facing] = bound_coord_ls; + tp->x_coord[!right_facing] = base_coord + ((vertices[1 ^ vp].y - vertices[0].y) * base_step); //base_coord + ((vertices[1].y - vertices[0].y) * base_step); + tp->x_step[!right_facing] = base_step; + tp->dec_mode = vp; + } + + for(unsigned i = 0; i < 2; i++) //2; i++) + { + int32 yi = tripart[i].y_coord; + int32 yb = tripart[i].y_bound; + + uint64 lc = tripart[i].x_coord[0]; + uint64 ls = tripart[i].x_step[0]; + + uint64 rc = tripart[i].x_coord[1]; + uint64 rs = tripart[i].x_step[1]; + + if(tripart[i].dec_mode) + { + while(MDFN_LIKELY(yi > yb)) + { + yi--; + lc -= ls; + rc -= rs; + // + // + // + int32 y = sign_x_to_s32(11, yi); + + if(y < ClipY0) + break; + + if(y > ClipY1) + { + DrawTimeAvail -= 2; + continue; + } + + DrawSpan(yi, GetPolyXFP_Int(lc), GetPolyXFP_Int(rc), ig, idl); + } + } + else + { + while(MDFN_LIKELY(yi < yb)) + { + int32 y = sign_x_to_s32(11, yi); + + if(y > ClipY1) + break; + + if(y < ClipY0) + { + DrawTimeAvail -= 2; + goto skipit; + } + + DrawSpan(yi, GetPolyXFP_Int(lc), GetPolyXFP_Int(rc), ig, idl); + // + // + // + skipit: ; + yi++; + lc += ls; + rc += rs; + } + } + } + +#if 0 + printf("[GPU] Vertices: %d:%d(r=%d, g=%d, b=%d) -> %d:%d(r=%d, g=%d, b=%d) -> %d:%d(r=%d, g=%d, b=%d)\n\n\n", vertices[0].x, vertices[0].y, + vertices[0].r, vertices[0].g, vertices[0].b, + vertices[1].x, vertices[1].y, + vertices[1].r, vertices[1].g, vertices[1].b, + vertices[2].x, vertices[2].y, + vertices[2].r, vertices[2].g, vertices[2].b); +#endif +} + +template +INLINE void PS_GPU::Command_DrawPolygon(const uint32 *cb) +{ + const unsigned cb0 = cb[0]; + tri_vertex vertices[3]; + unsigned sv = 0; + //uint32 tpage = 0; + + // Base timing is approximate, and could be improved. + if(numvertices == 4 && InCmd == INCMD_QUAD) + DrawTimeAvail -= (28 + 18); + else + DrawTimeAvail -= (64 + 18); + + if(goraud && textured) + DrawTimeAvail -= 150 * 3; + else if(goraud) + DrawTimeAvail -= 96 * 3; + else if(textured) + DrawTimeAvail -= 60 * 3; + + if(numvertices == 4) + { + if(InCmd == INCMD_QUAD) + { + memcpy(&vertices[0], &InQuad_F3Vertices[1], 2 * sizeof(tri_vertex)); + sv = 2; + } + } + //else + // memset(vertices, 0, sizeof(vertices)); + + for(unsigned v = sv; v < 3; v++) + { + if(v == 0 || goraud) + { + uint32 raw_color = (*cb & 0xFFFFFF); + + vertices[v].r = raw_color & 0xFF; + vertices[v].g = (raw_color >> 8) & 0xFF; + vertices[v].b = (raw_color >> 16) & 0xFF; + + cb++; + } + else + { + vertices[v].r = vertices[0].r; + vertices[v].g = vertices[0].g; + vertices[v].b = vertices[0].b; + } + + vertices[v].x = sign_x_to_s32(11, ((int16)(*cb & 0xFFFF))) + OffsX; + vertices[v].y = sign_x_to_s32(11, ((int16)(*cb >> 16))) + OffsY; + cb++; + + if(textured) + { + vertices[v].u = (*cb & 0xFF); + vertices[v].v = (*cb >> 8) & 0xFF; + + if(v == 0) + { + Update_CLUT_Cache((*cb >> 16) & 0xFFFF); + } + + cb++; + } + } + + if(numvertices == 4) + { + if(InCmd == INCMD_QUAD) + { + InCmd = INCMD_NONE; + } + else + { + InCmd = INCMD_QUAD; + InCmd_CC = cb0 >> 24; + memcpy(&InQuad_F3Vertices[0], &vertices[0], sizeof(tri_vertex) * 3); + } + } + + DrawTriangle(vertices); +} + +#undef COORD_POST_PADDING +#undef COORD_FBS +#undef COORD_MF_INT + +// +// C-style function wrappers so our command table isn't so ginormous(in memory usage). +// +template +static void G_Command_DrawPolygon(PS_GPU* g, const uint32 *cb) +{ + g->Command_DrawPolygon(cb); +} + +const CTEntry PS_GPU::Commands_20_3F[0x20] = +{ + /* 0x20 */ + POLY_HELPER(0x20), + POLY_HELPER(0x21), + POLY_HELPER(0x22), + POLY_HELPER(0x23), + POLY_HELPER(0x24), + POLY_HELPER(0x25), + POLY_HELPER(0x26), + POLY_HELPER(0x27), + POLY_HELPER(0x28), + POLY_HELPER(0x29), + POLY_HELPER(0x2a), + POLY_HELPER(0x2b), + POLY_HELPER(0x2c), + POLY_HELPER(0x2d), + POLY_HELPER(0x2e), + POLY_HELPER(0x2f), + POLY_HELPER(0x30), + POLY_HELPER(0x31), + POLY_HELPER(0x32), + POLY_HELPER(0x33), + POLY_HELPER(0x34), + POLY_HELPER(0x35), + POLY_HELPER(0x36), + POLY_HELPER(0x37), + POLY_HELPER(0x38), + POLY_HELPER(0x39), + POLY_HELPER(0x3a), + POLY_HELPER(0x3b), + POLY_HELPER(0x3c), + POLY_HELPER(0x3d), + POLY_HELPER(0x3e), + POLY_HELPER(0x3f) +}; + +} diff --git a/Mednafen/mednafen/psx/gpu_sprite.cpp b/Mednafen/mednafen/psx/gpu_sprite.cpp new file mode 100644 index 0000000000..9994ec467c --- /dev/null +++ b/Mednafen/mednafen/psx/gpu_sprite.cpp @@ -0,0 +1,276 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "gpu.h" + +namespace MDFN_IEN_PSX +{ +#include "gpu_common.inc" + +template +void PS_GPU::DrawSprite(int32 x_arg, int32 y_arg, int32 w, int32 h, uint8 u_arg, uint8 v_arg, uint32 color) +{ + const int32 r = color & 0xFF; + const int32 g = (color >> 8) & 0xFF; + const int32 b = (color >> 16) & 0xFF; + const uint16 fill_color = 0x8000 | ((r >> 3) << 0) | ((g >> 3) << 5) | ((b >> 3) << 10); + + int32 x_start, x_bound; + int32 y_start, y_bound; + uint8 u, v; + int v_inc = 1, u_inc = 1; + + //printf("[GPU] Sprite: x=%d, y=%d, w=%d, h=%d\n", x_arg, y_arg, w, h); + + x_start = x_arg; + x_bound = x_arg + w; + + y_start = y_arg; + y_bound = y_arg + h; + + if(textured) + { + u = u_arg; + v = v_arg; + + //if(FlipX || FlipY || (u & 1) || (v & 1) || ((TexMode_TA == 0) && ((u & 3) || (v & 3)))) + // fprintf(stderr, "Flippy: %d %d 0x%02x 0x%02x\n", FlipX, FlipY, u, v); + + if(FlipX) + { + u_inc = -1; + u |= 1; + } + // FIXME: Something weird happens when lower bit of u is set and we're not doing horizontal flip, but I'm not sure what it is exactly(needs testing) + // It may only happen to the first pixel, so look for that case too during testing. + //else + // u = (u + 1) & ~1; + + if(FlipY) + { + v_inc = -1; + } + } + + if(x_start < ClipX0) + { + if(textured) + u += (ClipX0 - x_start) * u_inc; + + x_start = ClipX0; + } + + if(y_start < ClipY0) + { + if(textured) + v += (ClipY0 - y_start) * v_inc; + + y_start = ClipY0; + } + + if(x_bound > (ClipX1 + 1)) + x_bound = ClipX1 + 1; + + if(y_bound > (ClipY1 + 1)) + y_bound = ClipY1 + 1; + + //HeightMode && !dfe && ((y & 1) == ((DisplayFB_YStart + !field_atvs) & 1)) && !DisplayOff + //printf("%d:%d, %d, %d ---- heightmode=%d displayfb_ystart=%d field_atvs=%d displayoff=%d\n", w, h, scanline, dfe, HeightMode, DisplayFB_YStart, field_atvs, DisplayOff); + + for(int32 y = y_start; MDFN_LIKELY(y < y_bound); y++) + { + uint8 u_r; + + if(textured) + u_r = u; + + if(!LineSkipTest(y)) + { + if(MDFN_LIKELY(x_bound > x_start)) + { + // + // TODO: From tests on a PS1, even a 0-width sprite takes up time to "draw" proportional to its height. + // + int32 suck_time = /*8 +*/ (x_bound - x_start); + + if((BlendMode >= 0) || MaskEval_TA) + suck_time += (((x_bound + 1) & ~1) - (x_start & ~1)) >> 1; + + DrawTimeAvail -= suck_time; + } + + for(int32 x = x_start; MDFN_LIKELY(x < x_bound); x++) + { + if(textured) + { + uint16 fbw = GetTexel(u_r, v); + + if(fbw) + { + if(TexMult) + { + fbw = ModTexel(fbw, r, g, b, 3, 2); + } + PlotPixel(x, y, fbw); + } + } + else + PlotPixel(x, y, fill_color); + + if(textured) + u_r += u_inc; + } + } + if(textured) + v += v_inc; + } +} + +template +INLINE void PS_GPU::Command_DrawSprite(const uint32 *cb) +{ + int32 x, y; + int32 w, h; + uint8 u = 0, v = 0; + uint32 color = 0; + + DrawTimeAvail -= 16; // FIXME, correct time. + + color = *cb & 0x00FFFFFF; + cb++; + + x = sign_x_to_s32(11, (*cb & 0xFFFF)); + y = sign_x_to_s32(11, (*cb >> 16)); + cb++; + + if(textured) + { + u = *cb & 0xFF; + v = (*cb >> 8) & 0xFF; + Update_CLUT_Cache((*cb >> 16) & 0xFFFF); + cb++; + } + + switch(raw_size) + { + default: + case 0: + w = (*cb & 0x3FF); + h = (*cb >> 16) & 0x1FF; + cb++; + break; + + case 1: + w = 1; + h = 1; + break; + + case 2: + w = 8; + h = 8; + break; + + case 3: + w = 16; + h = 16; + break; + } + + //printf("SPRITE: %d %d %d -- %d %d\n", raw_size, x, y, w, h); + + x = sign_x_to_s32(11, x + OffsX); + y = sign_x_to_s32(11, y + OffsY); + + switch(SpriteFlip & 0x3000) + { + case 0x0000: + if(!TexMult || color == 0x808080) + DrawSprite(x, y, w, h, u, v, color); + else + DrawSprite(x, y, w, h, u, v, color); + break; + + case 0x1000: + if(!TexMult || color == 0x808080) + DrawSprite(x, y, w, h, u, v, color); + else + DrawSprite(x, y, w, h, u, v, color); + break; + + case 0x2000: + if(!TexMult || color == 0x808080) + DrawSprite(x, y, w, h, u, v, color); + else + DrawSprite(x, y, w, h, u, v, color); + break; + + case 0x3000: + if(!TexMult || color == 0x808080) + DrawSprite(x, y, w, h, u, v, color); + else + DrawSprite(x, y, w, h, u, v, color); + break; + } +} + +// +// C-style function wrappers so our command table isn't so ginormous(in memory usage). +// +template +static void G_Command_DrawSprite(PS_GPU* g, const uint32 *cb) +{ + g->Command_DrawSprite(cb); +} + +const CTEntry PS_GPU::Commands_60_7F[0x20] = +{ + SPR_HELPER(0x60), + SPR_HELPER(0x61), + SPR_HELPER(0x62), + SPR_HELPER(0x63), + SPR_HELPER(0x64), + SPR_HELPER(0x65), + SPR_HELPER(0x66), + SPR_HELPER(0x67), + SPR_HELPER(0x68), + SPR_HELPER(0x69), + SPR_HELPER(0x6a), + SPR_HELPER(0x6b), + SPR_HELPER(0x6c), + SPR_HELPER(0x6d), + SPR_HELPER(0x6e), + SPR_HELPER(0x6f), + SPR_HELPER(0x70), + SPR_HELPER(0x71), + SPR_HELPER(0x72), + SPR_HELPER(0x73), + SPR_HELPER(0x74), + SPR_HELPER(0x75), + SPR_HELPER(0x76), + SPR_HELPER(0x77), + SPR_HELPER(0x78), + SPR_HELPER(0x79), + SPR_HELPER(0x7a), + SPR_HELPER(0x7b), + SPR_HELPER(0x7c), + SPR_HELPER(0x7d), + SPR_HELPER(0x7e), + SPR_HELPER(0x7f) +}; + +} diff --git a/Mednafen/mednafen/psx/gte.cpp b/Mednafen/mednafen/psx/gte.cpp new file mode 100644 index 0000000000..a7863c9f40 --- /dev/null +++ b/Mednafen/mednafen/psx/gte.cpp @@ -0,0 +1,1697 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PSXDEV_GTE_TESTING +#include "psx.h" +#include "gte.h" +#endif + +/* Notes: + + AVSZ3/AVSZ4: + OTZ is MAC0 >> 12 + OTZ overflow/underflow flag is set in an overflow condition even if MAC0 == 0. + sf field bit has no effect? + + FLAG register: + Bits present mask: 0xfffff000 + + Checksum bit can't be directly set, it's apparently calculated like (bool)(FLAGS & 0x7f87e000) + + Instructions effectively clear it 0 at start. (todo: test "invalid" instructions) + + X/Y FIFO [3] register write pushes a copy down to [2] + +*/ + +#ifndef PSXDEV_GTE_TESTING +namespace MDFN_IEN_PSX +{ +#endif + +typedef struct +{ + int16 MX[3][3]; + int16 dummy; +} __attribute__((__packed__)) gtematrix; + +typedef struct +{ + union + { + struct + { + uint8 R; + uint8 G; + uint8 B; + uint8 CD; + }; + uint8 Raw8[4]; + }; +} gtergb; + +typedef struct +{ + int16 X; + int16 Y; +} gtexy; + +static uint32 CR[32]; +static uint32 FLAGS; // Temporary for instruction execution, copied into CR[31] at end of instruction execution. + +typedef union +{ + gtematrix All[4]; + int32 Raw[4][5]; // Don't read from this(Raw[][]), only write(and when writing, if running on a big-endian platform, swap the upper 16-bits with the lower 16-bits) + int16 Raw16[4][10]; + + struct + { + gtematrix Rot; + gtematrix Light; + gtematrix Color; + gtematrix AbbyNormal; + }; +} Matrices_t; + +static Matrices_t Matrices; + +static union +{ + int32 All[4][4]; // Really only [4][3], but [4] to ease address calculation. + + struct + { + int32 T[4]; + int32 B[4]; + int32 FC[4]; + int32 Null[4]; + }; +} CRVectors; + +static int32 OFX; +static int32 OFY; +static uint16 H; +static int16 DQA; +static int32 DQB; + +static int16 ZSF3; +static int16 ZSF4; + + +// Begin DR +static int16 Vectors[3][4]; +static gtergb RGB; +static uint16 OTZ; + +static int16 IR[4]; + +#define IR0 IR[0] +#define IR1 IR[1] +#define IR2 IR[2] +#define IR3 IR[3] + +static gtexy XY_FIFO[4]; +static uint16 Z_FIFO[4]; +static gtergb RGB_FIFO[3]; +static int32 MAC[4]; +static uint32 LZCS; +static uint32 LZCR; + +static uint32 Reg23; +// end DR + +static INLINE uint8 Sat5(int16 cc) +{ + if(cc < 0) + cc = 0; + if(cc > 0x1F) + cc = 0x1F; + return(cc); +} + +// +// Newton-Raphson division table. (Initialized at startup; do NOT save in save states!) +// +static uint8 DivTable[0x100 + 1]; +static INLINE uint32 CalcRecip(uint16 divisor) +{ + int32 x = (0x101 + DivTable[(((divisor & 0x7FFF) + 0x40) >> 7)]); + int32 tmp = (((int32)divisor * -x) + 0x80) >> 8; + int32 tmp2 = ((x * (131072 + tmp)) + 0x80) >> 8; + + return(tmp2); +} + +void GTE_Init(void) +{ + for(uint32_t divisor = 0x8000; divisor < 0x10000; divisor += 0x80) + { + uint32_t xa = 512; + + for(unsigned i = 1; i < 5; i++) + { + xa = (xa * (1024 * 512 - ((divisor >> 7) * xa))) >> 18; + } + + DivTable[(divisor >> 7) & 0xFF] = ((xa + 1) >> 1) - 0x101; + //printf("%04x, %02x\n", divisor, ((xa + 1) >> 1) - 0x101); + } + + // + // To avoid a bounds limiting if statement in the emulation code: + DivTable[0x100] = DivTable[0xFF]; +} + +void GTE_Power(void) +{ + memset(CR, 0, sizeof(CR)); + //memset(DR, 0, sizeof(DR)); + + memset(Matrices.All, 0, sizeof(Matrices.All)); + memset(CRVectors.All, 0, sizeof(CRVectors.All)); + OFX = 0; + OFY = 0; + H = 0; + DQA = 0; + DQB = 0; + ZSF3 = 0; + ZSF4 = 0; + + + memset(Vectors, 0, sizeof(Vectors)); + memset(&RGB, 0, sizeof(RGB)); + OTZ = 0; + IR0 = 0; + IR1 = 0; + IR2 = 0; + IR3 = 0; + + memset(XY_FIFO, 0, sizeof(XY_FIFO)); + memset(Z_FIFO, 0, sizeof(Z_FIFO)); + memset(RGB_FIFO, 0, sizeof(RGB_FIFO)); + memset(MAC, 0, sizeof(MAC)); + LZCS = 0; + LZCR = 0; + + Reg23 = 0; +} + +// TODO: Don't save redundant state, regarding CR cache variables +void GTE_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY32(CR, 32), + SFVAR(FLAGS), + + SFARRAY16(&Matrices.Raw16[0][0], 4 * 10), + + SFARRAY32(&CRVectors.All[0][0], 4 * 4), + + SFVAR(OFX), + SFVAR(OFY), + SFVAR(H), + SFVAR(DQA), + SFVAR(DQB), + + SFVAR(ZSF3), + SFVAR(ZSF4), + SFARRAY16(&Vectors[0][0], 3 * 4), + + SFARRAY(RGB.Raw8, 4), + SFVAR(OTZ), + SFARRAY16(IR, 4), + + SFVAR(XY_FIFO[0].X), + SFVAR(XY_FIFO[0].Y), + SFVAR(XY_FIFO[1].X), + SFVAR(XY_FIFO[1].Y), + SFVAR(XY_FIFO[2].X), + SFVAR(XY_FIFO[2].Y), + SFVAR(XY_FIFO[3].X), + SFVAR(XY_FIFO[3].Y), + + SFARRAY16(Z_FIFO, 4), + + SFARRAY(RGB_FIFO[0].Raw8, 4), + SFARRAY(RGB_FIFO[1].Raw8, 4), + SFARRAY(RGB_FIFO[2].Raw8, 4), + + SFARRAY32(MAC, 4), + + SFVAR(LZCS), + SFVAR(LZCR), + SFVAR(Reg23), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "GTE"); + + if(load) + { + + } +} + + +void GTE_WriteCR(unsigned int which, uint32 value) +{ + static const uint32 mask_table[32] = { + /* 0x00 */ + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + + /* 0x08 */ + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + + /* 0x10 */ + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, + + /* 0x18 */ + 0xFFFFFFFF, 0xFFFFFFFF, 0x0000FFFF, 0x0000FFFF, 0xFFFFFFFF, 0x0000FFFF, 0x0000FFFF, 0xFFFFFFFF + }; + + //PSX_WARNING("[GTE] Write CR %d, 0x%08x", which, value); + + value &= mask_table[which]; + + CR[which] = value | (CR[which] & ~mask_table[which]); + + if(which < 24) + { + int we = which >> 3; + which &= 0x7; + + if(which >= 5) + CRVectors.All[we][which - 5] = value; + else + { + #ifdef MSB_FIRST + Matrices.Raw[we][which] = (value << 16) | (value >> 16); + #else + Matrices.Raw[we][which] = value; + #endif + } + return; + } + + switch(which) + { + case 24: + OFX = value; + break; + + case 25: + OFY = value; + break; + + case 26: + H = value; + break; + + case 27: + DQA = value; + break; + + case 28: + DQB = value; + break; + + case 29: + ZSF3 = value; + break; + + case 30: + ZSF4 = value; + break; + + case 31: + CR[31] = (value & 0x7ffff000) | ((value & 0x7f87e000) ? (1 << 31) : 0); + break; + } +} + +uint32 GTE_ReadCR(unsigned int which) +{ + uint32 ret = 0; + + switch(which) + { + default: + ret = CR[which]; + if(which == 4 || which == 12 || which == 20) + ret = (int16)ret; + break; + + case 24: + ret = OFX; + break; + + case 25: + ret = OFY; + break; + + case 26: + ret = (int16)H; + break; + + case 27: + ret = (int16)DQA; + break; + + case 28: + ret = DQB; + break; + + case 29: + ret = (int16)ZSF3; + break; + + case 30: + ret = (int16)ZSF4; + break; + + case 31: + ret = CR[31]; + break; + } + + return(ret); +} + +void GTE_WriteDR(unsigned int which, uint32 value) +{ + switch(which & 0x1F) + { + case 0: + Vectors[0][0] = value; + Vectors[0][1] = value >> 16; + break; + + case 1: + Vectors[0][2] = value; + break; + + case 2: + Vectors[1][0] = value; + Vectors[1][1] = value >> 16; + break; + + case 3: + Vectors[1][2] = value; + break; + + case 4: + Vectors[2][0] = value; + Vectors[2][1] = value >> 16; + break; + + case 5: + Vectors[2][2] = value; + break; + + case 6: + RGB.R = value >> 0; + RGB.G = value >> 8; + RGB.B = value >> 16; + RGB.CD = value >> 24; + break; + + case 7: + OTZ = value; + break; + + case 8: + IR0 = value; + break; + + case 9: + IR1 = value; + break; + + case 10: + IR2 = value; + break; + + case 11: + IR3 = value; + break; + + case 12: + XY_FIFO[0].X = value; + XY_FIFO[0].Y = value >> 16; + break; + + case 13: + XY_FIFO[1].X = value; + XY_FIFO[1].Y = value >> 16; + break; + + case 14: + XY_FIFO[2].X = value; + XY_FIFO[2].Y = value >> 16; + XY_FIFO[3].X = value; + XY_FIFO[3].Y = value >> 16; + break; + + case 15: + XY_FIFO[3].X = value; + XY_FIFO[3].Y = value >> 16; + + XY_FIFO[0] = XY_FIFO[1]; + XY_FIFO[1] = XY_FIFO[2]; + XY_FIFO[2] = XY_FIFO[3]; + break; + + case 16: + Z_FIFO[0] = value; + break; + + case 17: + Z_FIFO[1] = value; + break; + + case 18: + Z_FIFO[2] = value; + break; + + case 19: + Z_FIFO[3] = value; + break; + + case 20: + RGB_FIFO[0].R = value; + RGB_FIFO[0].G = value >> 8; + RGB_FIFO[0].B = value >> 16; + RGB_FIFO[0].CD = value >> 24; + break; + + case 21: + RGB_FIFO[1].R = value; + RGB_FIFO[1].G = value >> 8; + RGB_FIFO[1].B = value >> 16; + RGB_FIFO[1].CD = value >> 24; + break; + + case 22: + RGB_FIFO[2].R = value; + RGB_FIFO[2].G = value >> 8; + RGB_FIFO[2].B = value >> 16; + RGB_FIFO[2].CD = value >> 24; + break; + + case 23: + Reg23 = value; + break; + + case 24: + MAC[0] = value; + break; + + case 25: + MAC[1] = value; + break; + + case 26: + MAC[2] = value; + break; + + case 27: + MAC[3] = value; + break; + + case 28: + IR1 = ((value >> 0) & 0x1F) << 7; + IR2 = ((value >> 5) & 0x1F) << 7; + IR3 = ((value >> 10) & 0x1F) << 7; + break; + + case 29: // Read-only + break; + + case 30: + LZCS = value; + { + uint32 test = value & 0x80000000; + LZCR = 0; + + while((value & 0x80000000) == test && LZCR < 32) + { + LZCR++; + value <<= 1; + } + } + break; + + case 31: // Read-only + break; + } +} + +uint32 GTE_ReadDR(unsigned int which) +{ + uint32 ret = 0; + + switch(which & 0x1F) + { + case 0: + ret = (uint16)Vectors[0][0] | ((uint16)Vectors[0][1] << 16); + break; + + case 1: + ret = (int16)Vectors[0][2]; + break; + + case 2: + ret = (uint16)Vectors[1][0] | ((uint16)Vectors[1][1] << 16); + break; + + case 3: + ret = (int16)Vectors[1][2]; + break; + + case 4: + ret = (uint16)Vectors[2][0] | ((uint16)Vectors[2][1] << 16); + break; + + case 5: + ret = (int16)Vectors[2][2]; + break; + + case 6: + ret = RGB.R | (RGB.G << 8) | (RGB.B << 16) | (RGB.CD << 24); + break; + + case 7: + ret = (uint16)OTZ; + break; + + case 8: + ret = (int16)IR0; + break; + + case 9: + ret = (int16)IR1; + break; + + case 10: + ret = (int16)IR2; + break; + + case 11: + ret = (int16)IR3; + break; + + case 12: + ret = (uint16)XY_FIFO[0].X | ((uint16)XY_FIFO[0].Y << 16); + break; + + case 13: + ret = (uint16)XY_FIFO[1].X | ((uint16)XY_FIFO[1].Y << 16); + break; + + case 14: + ret = (uint16)XY_FIFO[2].X | ((uint16)XY_FIFO[2].Y << 16); + break; + + case 15: + ret = (uint16)XY_FIFO[3].X | ((uint16)XY_FIFO[3].Y << 16); + break; + + case 16: + ret = (uint16)Z_FIFO[0]; + break; + + case 17: + ret = (uint16)Z_FIFO[1]; + break; + + case 18: + ret = (uint16)Z_FIFO[2]; + break; + + case 19: + ret = (uint16)Z_FIFO[3]; + break; + + case 20: + ret = RGB_FIFO[0].R | (RGB_FIFO[0].G << 8) | (RGB_FIFO[0].B << 16) | (RGB_FIFO[0].CD << 24); + break; + + case 21: + ret = RGB_FIFO[1].R | (RGB_FIFO[1].G << 8) | (RGB_FIFO[1].B << 16) | (RGB_FIFO[1].CD << 24); + break; + + case 22: + ret = RGB_FIFO[2].R | (RGB_FIFO[2].G << 8) | (RGB_FIFO[2].B << 16) | (RGB_FIFO[2].CD << 24); + break; + + case 23: + ret = Reg23; + break; + + case 24: + ret = MAC[0]; + break; + + case 25: + ret = MAC[1]; + break; + + case 26: + ret = MAC[2]; + break; + + case 27: + ret = MAC[3]; + break; + + case 28: + case 29: + ret = Sat5(IR1 >> 7) | (Sat5(IR2 >> 7) << 5) | (Sat5(IR3 >> 7) << 10); + break; + + case 30: + ret = LZCS; + break; + + case 31: + ret = LZCR; + break; + } + return(ret); +} + +#define sign_x_to_s64(_bits, _value) (((int64)((uint64)(_value) << (64 - _bits))) >> (64 - _bits)) +static INLINE int64 A_MV(unsigned which, int64 value) +{ + if(value >= (1LL << 43)) + FLAGS |= 1 << (30 - which); + + if(value < -(1LL << 43)) + FLAGS |= 1 << (27 - which); + + return sign_x_to_s64(44, value); +} + +static INLINE int64 F(int64 value) +{ + if(value < -2147483648LL) + { + // flag set here + FLAGS |= 1 << 15; + } + + if(value > 2147483647LL) + { + // flag set here + FLAGS |= 1 << 16; + } + return(value); +} + + +static INLINE int16 Lm_B(unsigned int which, int32 value, int lm) +{ + int32 tmp = lm << 15; + + if(value < (-32768 + tmp)) + { + // set flag here + FLAGS |= 1 << (24 - which); + value = -32768 + tmp; + } + + if(value > 32767) + { + // Set flag here + FLAGS |= 1 << (24 - which); + value = 32767; + } + + return(value); +} + + +static INLINE int16 Lm_B_PTZ(unsigned int which, int32 value, int32 ftv_value, int lm) +{ + int32 tmp = lm << 15; + + if(ftv_value < -32768) + { + FLAGS |= 1 << (24 - which); + } + + if(ftv_value > 32767) + { + FLAGS |= 1 << (24 - which); + } + + if(value < (-32768 + tmp)) + { + value = -32768 + tmp; + } + + if(value > 32767) + { + value = 32767; + } + + return(value); +} + +static INLINE uint8 Lm_C(unsigned int which, int32 value) +{ + if(value & ~0xFF) + { + // Set flag here + FLAGS |= 1 << (21 - which); // Tested with GPF + + if(value < 0) + value = 0; + + if(value > 255) + value = 255; + } + + return(value); +} + +static INLINE int32 Lm_D(int32 value, int unchained) +{ + // Not sure if we should have it as int64, or just chain on to and special case when the F flags are set. + if(!unchained) + { + if(FLAGS & (1 << 15)) + { + FLAGS |= 1 << 18; + return(0); + } + + if(FLAGS & (1 << 16)) + { + FLAGS |= 1 << 18; + return(0xFFFF); + } + } + + if(value < 0) + { + // Set flag here + value = 0; + FLAGS |= 1 << 18; // Tested with AVSZ3 + } + else if(value > 65535) + { + // Set flag here. + value = 65535; + FLAGS |= 1 << 18; // Tested with AVSZ3 + } + + return(value); +} + +static INLINE int32 Lm_G(unsigned int which, int32 value) +{ + if(value < -1024) + { + // Set flag here + value = -1024; + FLAGS |= 1 << (14 - which); + } + + if(value > 1023) + { + // Set flag here. + value = 1023; + FLAGS |= 1 << (14 - which); + } + + return(value); +} + +// limit to 4096, not 4095 +static INLINE int32 Lm_H(int32 value) +{ + if(value < 0) + { + value = 0; + FLAGS |= 1 << 12; + } + + if(value > 4096) + { + value = 4096; + FLAGS |= 1 << 12; + } + + return(value); +} + +static INLINE void MAC_to_RGB_FIFO(void) +{ + RGB_FIFO[0] = RGB_FIFO[1]; + RGB_FIFO[1] = RGB_FIFO[2]; + RGB_FIFO[2].R = Lm_C(0, MAC[1] >> 4); + RGB_FIFO[2].G = Lm_C(1, MAC[2] >> 4); + RGB_FIFO[2].B = Lm_C(2, MAC[3] >> 4); + RGB_FIFO[2].CD = RGB.CD; +} + + +static INLINE void MAC_to_IR(int lm) +{ + IR1 = Lm_B(0, MAC[1], lm); + IR2 = Lm_B(1, MAC[2], lm); + IR3 = Lm_B(2, MAC[3], lm); +} + +static INLINE void MultiplyMatrixByVector(const gtematrix *matrix, const int16 *v, const int32 *crv, uint32 sf, int lm) +{ + unsigned i; + + for(i = 0; i < 3; i++) + { + int64 tmp; + int32 mulr[3]; + + tmp = (uint64)(int64)crv[i] << 12; + + if(matrix == &Matrices.AbbyNormal) + { + if(i == 0) + { + mulr[0] = -((RGB.R << 4) * v[0]); + mulr[1] = (RGB.R << 4) * v[1]; + mulr[2] = IR0 * v[2]; + } + else + { + mulr[0] = (int16)CR[i] * v[0]; + mulr[1] = (int16)CR[i] * v[1]; + mulr[2] = (int16)CR[i] * v[2]; + } + } + else + { + mulr[0] = matrix->MX[i][0] * v[0]; + mulr[1] = matrix->MX[i][1] * v[1]; + mulr[2] = matrix->MX[i][2] * v[2]; + } + + tmp = A_MV(i, tmp + mulr[0]); + if(crv == CRVectors.FC) + { + Lm_B(i, tmp >> sf, FALSE); + tmp = 0; + } + + tmp = A_MV(i, tmp + mulr[1]); + tmp = A_MV(i, tmp + mulr[2]); + + MAC[1 + i] = tmp >> sf; + } + + + MAC_to_IR(lm); +} + + +static INLINE void MultiplyMatrixByVector_PT(const gtematrix *matrix, const int16 *v, const int32 *crv, uint32 sf, int lm) +{ + int64 tmp[3]; + unsigned i; + + for(i = 0; i < 3; i++) + { + int32 mulr[3]; + + tmp[i] = (uint64)(int64)crv[i] << 12; + + mulr[0] = matrix->MX[i][0] * v[0]; + mulr[1] = matrix->MX[i][1] * v[1]; + mulr[2] = matrix->MX[i][2] * v[2]; + + tmp[i] = A_MV(i, tmp[i] + mulr[0]); + tmp[i] = A_MV(i, tmp[i] + mulr[1]); + tmp[i] = A_MV(i, tmp[i] + mulr[2]); + + MAC[1 + i] = tmp[i] >> sf; + } + + IR1 = Lm_B(0, MAC[1], lm); + IR2 = Lm_B(1, MAC[2], lm); + //printf("FTV: %08x %08x\n", crv[2], (uint32)(tmp[2] >> 12)); + IR3 = Lm_B_PTZ(2, MAC[3], tmp[2] >> 12, lm); + + Z_FIFO[0] = Z_FIFO[1]; + Z_FIFO[1] = Z_FIFO[2]; + Z_FIFO[2] = Z_FIFO[3]; + Z_FIFO[3] = Lm_D(tmp[2] >> 12, TRUE); +} + + +#define DECODE_FIELDS \ + const uint32 sf MDFN_NOWARN_UNUSED = (instr & (1 << 19)) ? 12 : 0; \ + const uint32 mx MDFN_NOWARN_UNUSED = (instr >> 17) & 0x3; \ + const uint32 v_i = (instr >> 15) & 0x3; \ + const int32* cv MDFN_NOWARN_UNUSED = CRVectors.All[(instr >> 13) & 0x3]; \ + const int lm MDFN_NOWARN_UNUSED = (instr >> 10) & 1; \ + int16 v[3] MDFN_NOWARN_UNUSED; \ + if(v_i == 3) \ + { \ + v[0] = IR1; \ + v[1] = IR2; \ + v[2] = IR3; \ + } \ + else \ + { \ + v[0] = Vectors[v_i][0]; \ + v[1] = Vectors[v_i][1]; \ + v[2] = Vectors[v_i][2]; \ + } + + +static int32 SQR(uint32 instr) +{ + DECODE_FIELDS; + + MAC[1] = ((IR1 * IR1) >> sf); + MAC[2] = ((IR2 * IR2) >> sf); + MAC[3] = ((IR3 * IR3) >> sf); + + MAC_to_IR(lm); + + return(5); +} + + +static int32 MVMVA(uint32 instr) +{ + DECODE_FIELDS; + + MultiplyMatrixByVector(&Matrices.All[mx], v, cv, sf, lm); + + return(8); +} + +static INLINE unsigned CountLeadingZeroU16(uint16 val) +{ + unsigned ret = 0; + + while(!(val & 0x8000) && ret < 16) + { + val <<= 1; + ret++; + } + + return ret; +} + +static INLINE uint32 Divide(uint32 dividend, uint32 divisor) +{ + //if((Z_FIFO[3] * 2) > H) + if((divisor * 2) > dividend) + { + unsigned shift_bias = CountLeadingZeroU16(divisor); + + dividend <<= shift_bias; + divisor <<= shift_bias; + + return std::min(0x1FFFF, ((uint64)dividend * CalcRecip(divisor | 0x8000) + 32768) >> 16); + } + else + { + FLAGS |= 1 << 17; + return 0x1FFFF; + } +} + +static INLINE void TransformXY(int64 h_div_sz) +{ + MAC[0] = F((int64)OFX + IR1 * h_div_sz) >> 16; + XY_FIFO[3].X = Lm_G(0, MAC[0]); + + MAC[0] = F((int64)OFY + IR2 * h_div_sz) >> 16; + XY_FIFO[3].Y = Lm_G(1, MAC[0]); + + XY_FIFO[0] = XY_FIFO[1]; + XY_FIFO[1] = XY_FIFO[2]; + XY_FIFO[2] = XY_FIFO[3]; +} + +static INLINE void TransformDQ(int64 h_div_sz) +{ + MAC[0] = F((int64)DQB + DQA * h_div_sz); + IR0 = Lm_H(((int64)DQB + DQA * h_div_sz) >> 12); +} + +static int32 RTPS(uint32 instr) +{ + DECODE_FIELDS; + int64 h_div_sz; + + MultiplyMatrixByVector_PT(&Matrices.Rot, Vectors[0], CRVectors.T, sf, lm); + h_div_sz = Divide(H, Z_FIFO[3]); + + TransformXY(h_div_sz); + TransformDQ(h_div_sz); + + return(15); +} + +static int32 RTPT(uint32 instr) +{ + DECODE_FIELDS; + int i; + + for(i = 0; i < 3; i++) + { + int64 h_div_sz; + + MultiplyMatrixByVector_PT(&Matrices.Rot, Vectors[i], CRVectors.T, sf, lm); + h_div_sz = Divide(H, Z_FIFO[3]); + + TransformXY(h_div_sz); + + if(i == 2) + TransformDQ(h_div_sz); + } + + return(23); +} + +static INLINE void NormColor(uint32 sf, int lm, uint32 v) +{ + int16 tmp_vector[3]; + + MultiplyMatrixByVector(&Matrices.Light, Vectors[v], CRVectors.Null, sf, lm); + + tmp_vector[0] = IR1; tmp_vector[1] = IR2; tmp_vector[2] = IR3; + MultiplyMatrixByVector(&Matrices.Color, tmp_vector, CRVectors.B, sf, lm); + + MAC_to_RGB_FIFO(); +} + +static int32 NCS(uint32 instr) +{ + DECODE_FIELDS; + + NormColor(sf, lm, 0); + + return(14); +} + +static int32 NCT(uint32 instr) +{ + DECODE_FIELDS; + int i; + + for(i = 0; i < 3; i++) + NormColor(sf, lm, i); + + return(30); +} + +static INLINE void NormColorColor(uint32 v, uint32 sf, int lm) +{ + int16 tmp_vector[3]; + + MultiplyMatrixByVector(&Matrices.Light, Vectors[v], CRVectors.Null, sf, lm); + + tmp_vector[0] = IR1; tmp_vector[1] = IR2; tmp_vector[2] = IR3; + MultiplyMatrixByVector(&Matrices.Color, tmp_vector, CRVectors.B, sf, lm); + + MAC[1] = ((RGB.R << 4) * IR1) >> sf; + MAC[2] = ((RGB.G << 4) * IR2) >> sf; + MAC[3] = ((RGB.B << 4) * IR3) >> sf; + + MAC_to_IR(lm); + + MAC_to_RGB_FIFO(); +} + +static int32 NCCS(uint32 instr) +{ + DECODE_FIELDS; + + NormColorColor(0, sf, lm); + return(17); +} + + +static int32 NCCT(uint32 instr) +{ + int i; + DECODE_FIELDS; + + for(i = 0; i < 3; i++) + NormColorColor(i, sf, lm); + + return(39); +} + +static INLINE void DepthCue(int mult_IR123, int RGB_from_FIFO, uint32 sf, int lm) +{ + int32 RGB_temp[3]; + int32 IR_temp[3] = { IR1, IR2, IR3 }; + int i; + + //assert(sf); + + if(RGB_from_FIFO) + { + RGB_temp[0] = RGB_FIFO[0].R << 4; + RGB_temp[1] = RGB_FIFO[0].G << 4; + RGB_temp[2] = RGB_FIFO[0].B << 4; + } + else + { + RGB_temp[0] = RGB.R << 4; + RGB_temp[1] = RGB.G << 4; + RGB_temp[2] = RGB.B << 4; + } + + if(mult_IR123) + { + for(i = 0; i < 3; i++) + { + MAC[1 + i] = A_MV(i, ((int64)((uint64)(int64)CRVectors.FC[i] << 12) - RGB_temp[i] * IR_temp[i])) >> sf; + MAC[1 + i] = A_MV(i, (RGB_temp[i] * IR_temp[i] + IR0 * Lm_B(i, MAC[1 + i], FALSE))) >> sf; + } + } + else + { + for(i = 0; i < 3; i++) + { + MAC[1 + i] = A_MV(i, ((int64)((uint64)(int64)CRVectors.FC[i] << 12) - (int32)((uint32)RGB_temp[i] << 12))) >> sf; + MAC[1 + i] = A_MV(i, ((int64)((uint64)(int64)RGB_temp[i] << 12) + IR0 * Lm_B(i, MAC[1 + i], FALSE))) >> sf; + } + } + + MAC_to_IR(lm); + + MAC_to_RGB_FIFO(); +} + + +static int32 DCPL(uint32 instr) +{ + DECODE_FIELDS; + + DepthCue(TRUE, FALSE, sf, lm); + + return(8); +} + + +static int32 DPCS(uint32 instr) +{ + DECODE_FIELDS; + + DepthCue(FALSE, FALSE, sf, lm); + + return(8); +} + +static int32 DPCT(uint32 instr) +{ + int i; + DECODE_FIELDS; + + for(i = 0; i < 3; i++) + { + DepthCue(FALSE, TRUE, sf, lm); + } + + return(17); +} + +static int32 INTPL(uint32 instr) +{ + DECODE_FIELDS; + + MAC[1] = A_MV(0, ((int64)((uint64)(int64)CRVectors.FC[0] << 12) - (int32)((uint32)(int32)IR1 << 12))) >> sf; + MAC[2] = A_MV(1, ((int64)((uint64)(int64)CRVectors.FC[1] << 12) - (int32)((uint32)(int32)IR2 << 12))) >> sf; + MAC[3] = A_MV(2, ((int64)((uint64)(int64)CRVectors.FC[2] << 12) - (int32)((uint32)(int32)IR3 << 12))) >> sf; + + MAC[1] = A_MV(0, ((int64)((uint64)(int64)IR1 << 12) + IR0 * Lm_B(0, MAC[1], FALSE)) >> sf); + MAC[2] = A_MV(1, ((int64)((uint64)(int64)IR2 << 12) + IR0 * Lm_B(1, MAC[2], FALSE)) >> sf); + MAC[3] = A_MV(2, ((int64)((uint64)(int64)IR3 << 12) + IR0 * Lm_B(2, MAC[3], FALSE)) >> sf); + + MAC_to_IR(lm); + + MAC_to_RGB_FIFO(); + + return(8); +} + + +static INLINE void NormColorDepthCue(uint32 v, uint32 sf, int lm) +{ + int16 tmp_vector[3]; + + MultiplyMatrixByVector(&Matrices.Light, Vectors[v], CRVectors.Null, sf, lm); + + tmp_vector[0] = IR1; tmp_vector[1] = IR2; tmp_vector[2] = IR3; + MultiplyMatrixByVector(&Matrices.Color, tmp_vector, CRVectors.B, sf, lm); + + DepthCue(TRUE, FALSE, sf, lm); +} + +static int32 NCDS(uint32 instr) +{ + DECODE_FIELDS; + + NormColorDepthCue(0, sf, lm); + + return(19); +} + +static int32 NCDT(uint32 instr) +{ + int i; + DECODE_FIELDS; + + for(i = 0; i < 3; i++) + { + NormColorDepthCue(i, sf, lm); + } + + return(44); +} + +static int32 CC(uint32 instr) +{ + DECODE_FIELDS; + int16 tmp_vector[3]; + + tmp_vector[0] = IR1; tmp_vector[1] = IR2; tmp_vector[2] = IR3; + MultiplyMatrixByVector(&Matrices.Color, tmp_vector, CRVectors.B, sf, lm); + + MAC[1] = ((RGB.R << 4) * IR1) >> sf; + MAC[2] = ((RGB.G << 4) * IR2) >> sf; + MAC[3] = ((RGB.B << 4) * IR3) >> sf; + + MAC_to_IR(lm); + + MAC_to_RGB_FIFO(); + + return(11); +} + +static int32 CDP(uint32 instr) +{ + DECODE_FIELDS; + int16 tmp_vector[3]; + + tmp_vector[0] = IR1; tmp_vector[1] = IR2; tmp_vector[2] = IR3; + MultiplyMatrixByVector(&Matrices.Color, tmp_vector, CRVectors.B, sf, lm); + + DepthCue(TRUE, FALSE, sf, lm); + + return(13); +} + +static int32 NCLIP(uint32 instr) +{ + DECODE_FIELDS; + + MAC[0] = F( (int64)(XY_FIFO[0].X * (XY_FIFO[1].Y - XY_FIFO[2].Y)) + (XY_FIFO[1].X * (XY_FIFO[2].Y - XY_FIFO[0].Y)) + (XY_FIFO[2].X * (XY_FIFO[0].Y - XY_FIFO[1].Y)) + ); + + return(8); +} + +static int32 AVSZ3(uint32 instr) +{ + DECODE_FIELDS; + + MAC[0] = F(((int64)ZSF3 * (Z_FIFO[1] + Z_FIFO[2] + Z_FIFO[3]))); + + OTZ = Lm_D(MAC[0] >> 12, FALSE); + + return(5); +} + +static int32 AVSZ4(uint32 instr) +{ + DECODE_FIELDS; + + MAC[0] = F(((int64)ZSF4 * (Z_FIFO[0] + Z_FIFO[1] + Z_FIFO[2] + Z_FIFO[3]))); + + OTZ = Lm_D(MAC[0] >> 12, FALSE); + + return(5); +} + + +// -32768 * -32768 - 32767 * -32768 = 2147450880 +// (2 ^ 31) - 1 = 2147483647 +static int32 OP(uint32 instr) +{ + DECODE_FIELDS; + + MAC[1] = ((Matrices.Rot.MX[1][1] * IR3) - (Matrices.Rot.MX[2][2] * IR2)) >> sf; + MAC[2] = ((Matrices.Rot.MX[2][2] * IR1) - (Matrices.Rot.MX[0][0] * IR3)) >> sf; + MAC[3] = ((Matrices.Rot.MX[0][0] * IR2) - (Matrices.Rot.MX[1][1] * IR1)) >> sf; + + MAC_to_IR(lm); + + return(6); +} + +static int32 GPF(uint32 instr) +{ + DECODE_FIELDS; + + MAC[1] = (IR0 * IR1) >> sf; + MAC[2] = (IR0 * IR2) >> sf; + MAC[3] = (IR0 * IR3) >> sf; + + MAC_to_IR(lm); + + MAC_to_RGB_FIFO(); + + return(5); +} + +static int32 GPL(uint32 instr) +{ + DECODE_FIELDS; + + MAC[1] = A_MV(0, (int64)((uint64)(int64)MAC[1] << sf) + (IR0 * IR1)) >> sf; + MAC[2] = A_MV(1, (int64)((uint64)(int64)MAC[2] << sf) + (IR0 * IR2)) >> sf; + MAC[3] = A_MV(2, (int64)((uint64)(int64)MAC[3] << sf) + (IR0 * IR3)) >> sf; + + MAC_to_IR(lm); + + MAC_to_RGB_FIFO(); + + return(5); +} + +/* + +--------------------------------------------------------------------------------------------- +| 24 23 22 21 20 | 19 | 18 17 | 16 15 | 14 13 | 12 11 | 10 | 9 8 7 6 | 5 4 3 2 1 0 | +|-------------------------------------------------------------------------------------------| +| (unused) | sf | mx | v | cv |(unused)| lm | (unused) | opcode | +--------------------------------------------------------------------------------------------- + (unused) = unused, ignored + + sf = shift 12 + + mx = matrix selection + + v = source vector + + cv = add vector(translation/back/far color(bugged)/none) + + (unused) = unused, ignored + + lm = limit negative results to 0 + + (unused) = unused, ignored + + opcode = operation code +*/ + +int32 GTE_Instruction(uint32 instr) +{ + const unsigned code = instr & 0x3F; + int32 ret = 1; + + FLAGS = 0; + + switch(code) + { + default: +#ifndef PSXDEV_GTE_TESTING + PSX_WARNING("[GTE] Unknown instruction code: 0x%02x", code); +#endif + break; + + case 0x00: // alternate? + case 0x01: + ret = RTPS(instr); + break; + +/* + case 0x02: // UNSTABLE? + break; + + case 0x03: // UNSTABLE? + break; + + case 0x04: // Probably simple with v,cv,sf,mx,lm ignored. Same calculation as 0x3B? + break; + + case 0x05: // UNSTABLE? + break; +*/ + + case 0x06: + ret = NCLIP(instr); + break; + +/* + case 0x07: // UNSTABLE? + break; + + case 0x08: // UNSTABLE? + break; + + case 0x09: // UNSTABLE? + break; + + case 0x0A: // UNSTABLE? + break; + + case 0x0B: // UNSTABLE? + break; + +*/ + + case 0x0C: + ret = OP(instr); + break; + +/* + case 0x0D: // UNSTABLE? + break; + + case 0x0E: // UNSTABLE? + break; + + case 0x0F: // UNSTABLE? + break; +*/ + + case 0x10: + ret = DPCS(instr); + break; + + case 0x11: + ret = INTPL(instr); + break; + + case 0x12: + ret = MVMVA(instr); + break; + + case 0x13: + ret = NCDS(instr); + break; + + case 0x14: + ret = CDP(instr); + break; + + +/* + case 0x15: // does one push on RGB FIFO, what else... + break; +*/ + + case 0x16: + ret = NCDT(instr); + break; + +/* + case 0x17: // PARTIALLY UNSTABLE(depending on sf or v or cv or mx or lm???), similar behavior under some conditions to 0x16? + break; + + case 0x18: + break; + + case 0x19: + break; +*/ + + case 0x1A: // Alternate for 0x29? + ret = DCPL(instr); + break; + + case 0x1B: + ret = NCCS(instr); + break; + + case 0x1C: + ret = CC(instr); + break; + +/* + case 0x1D: + break; +*/ + + case 0x1E: + ret = NCS(instr); + break; + +/* + case 0x1F: + break; +*/ + + case 0x20: + ret = NCT(instr); + break; +/* + case 0x21: + break; + + case 0x22: // UNSTABLE? + break; + + case 0x23: + break; + + case 0x24: + break; + + case 0x25: + break; + + case 0x26: + break; + + case 0x27: + break; +*/ + + case 0x28: + ret = SQR(instr); + break; + + case 0x29: + ret = DCPL(instr); + break; + + case 0x2A: + ret = DPCT(instr); + break; + +/* + case 0x2B: + break; + + case 0x2C: + break; +*/ + + case 0x2D: + ret = AVSZ3(instr); + break; + + case 0x2E: + ret = AVSZ4(instr); + break; + +/* + case 0x2F: // UNSTABLE? + break; +*/ + + case 0x30: + ret = RTPT(instr); + break; + +/* + case 0x31: // UNSTABLE? + break; + + case 0x32: // UNSTABLE? + break; + + case 0x33: // UNSTABLE? + break; + + case 0x34: // UNSTABLE? + break; + + case 0x35: // UNSTABLE? + break; + + case 0x36: // UNSTABLE? + break; + + case 0x37: // UNSTABLE? + break; + + case 0x38: + break; + + case 0x39: // Probably simple with v,cv,sf,mx,lm ignored. + break; + + case 0x3A: // Probably simple with v,cv,sf,mx,lm ignored. + break; + + case 0x3B: // Probably simple with v,cv,sf,mx,lm ignored. Same calculation as 0x04? + break; + + case 0x3C: // UNSTABLE? + break; +*/ + + case 0x3D: + ret = GPF(instr); + break; + + case 0x3E: + ret = GPL(instr); + break; + + case 0x3F: + ret = NCCT(instr); + break; + } + + if(FLAGS & 0x7f87e000) + FLAGS |= 1 << 31; + + CR[31] = FLAGS; + + return(ret - 1); +} + +#ifndef PSXDEV_GTE_TESTING +} +#endif diff --git a/Mednafen/mednafen/psx/gte.h b/Mednafen/mednafen/psx/gte.h new file mode 100644 index 0000000000..81ec458682 --- /dev/null +++ b/Mednafen/mednafen/psx/gte.h @@ -0,0 +1,22 @@ +#ifndef __MDFN_PSX_GTE_H +#define __MDFN_PSX_GTE_H + +namespace MDFN_IEN_PSX +{ + +void GTE_Init(void) MDFN_COLD; +void GTE_Power(void) MDFN_COLD; +void GTE_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +int32 GTE_Instruction(uint32 instr); + +void GTE_WriteCR(unsigned int which, uint32 value); +void GTE_WriteDR(unsigned int which, uint32 value); + +uint32 GTE_ReadCR(unsigned int which); +uint32 GTE_ReadDR(unsigned int which); + + +} + +#endif diff --git a/Mednafen/mednafen/psx/input/dualanalog.cpp b/Mednafen/mednafen/psx/input/dualanalog.cpp new file mode 100644 index 0000000000..736806f19e --- /dev/null +++ b/Mednafen/mednafen/psx/input/dualanalog.cpp @@ -0,0 +1,323 @@ +#include "../psx.h" +#include "../frontio.h" +#include "dualanalog.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_DualAnalog final : public InputDevice +{ + public: + + InputDevice_DualAnalog(bool joystick_mode_); + virtual ~InputDevice_DualAnalog() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + virtual void UpdateInput(const void *data) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + bool joystick_mode; + bool dtr; + + uint8 buttons[2]; + uint8 axes[2][2]; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[8]; + uint32 transmit_pos; + uint32 transmit_count; +}; + +InputDevice_DualAnalog::InputDevice_DualAnalog(bool joystick_mode_) : joystick_mode(joystick_mode_) +{ + Power(); +} + +InputDevice_DualAnalog::~InputDevice_DualAnalog() +{ + +} + +void InputDevice_DualAnalog::Power(void) +{ + dtr = 0; + + buttons[0] = buttons[1] = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; +} + +void InputDevice_DualAnalog::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(dtr), + + SFARRAY(buttons, sizeof(buttons)), + SFARRAY(&axes[0][0], sizeof(axes)), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_DualAnalog", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +void InputDevice_DualAnalog::UpdateInput(const void *data) +{ + uint8 *d8 = (uint8 *)data; + + buttons[0] = d8[0]; + buttons[1] = d8[1]; + + for(int stick = 0; stick < 2; stick++) + { + for(int axis = 0; axis < 2; axis++) + { + const uint8* aba = &d8[2] + stick * 8 + axis * 4; + int32 tmp; + + tmp = 32768 + MDFN_de16lsb(&aba[0]) - ((int32)MDFN_de16lsb(&aba[2]) * 32768 / 32767); + tmp >>= 8; + + axes[stick][axis] = tmp; + } + } + + //printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); +} + + +void InputDevice_DualAnalog::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + + dtr = new_dtr; +} + +bool InputDevice_DualAnalog::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_DualAnalog::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + transmit_buffer[0] = joystick_mode ? 0x53 : 0x73; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + //if(command != 0x42) + // fprintf(stderr, "Gamepad unhandled command: 0x%02x\n", command); + + if(command == 0x42) + { + transmit_buffer[1] = 0xFF ^ buttons[0]; + transmit_buffer[2] = 0xFF ^ buttons[1]; + transmit_buffer[3] = axes[0][0]; + transmit_buffer[4] = axes[0][1]; + transmit_buffer[5] = axes[1][0]; + transmit_buffer[6] = axes[1][1]; + transmit_pos = 0; + transmit_count = 7; + } + else + { + command_phase = -1; + transmit_buffer[1] = 0; + transmit_buffer[2] = 0; + transmit_pos = 0; + transmit_count = 0; + } + break; + case 2: + //if(receive_buffer) + // printf("%d: %02x\n", 7 - transmit_count, receive_buffer); + break; + } + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 0x40; //0x100; + + return(ret); +} + +InputDevice *Device_DualAnalog_Create(bool joystick_mode) +{ + return new InputDevice_DualAnalog(joystick_mode); +} + + +IDIISG Device_DualAnalog_IDII = +{ + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "l3", "Left Stick, Button(L3)", 18, IDIT_BUTTON, NULL }, + { "r3", "Right stick, Button(R3)", 23, IDIT_BUTTON, NULL }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "D-Pad UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "D-Pad RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "D-Pad DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "D-Pad LEFT ←", 2, IDIT_BUTTON, "right" }, + + { "l2", "L2 (rear left shoulder)", 11, IDIT_BUTTON, NULL }, + { "r2", "R2 (rear right shoulder)", 13, IDIT_BUTTON, NULL }, + { "l1", "L1 (front left shoulder)", 10, IDIT_BUTTON, NULL }, + { "r1", "R1 (front right shoulder)", 12, IDIT_BUTTON, NULL }, + + { "triangle", "△ (upper)", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "circle", "○ (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "cross", "x (lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "square", "□ (left)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "rstick_right", "Right Stick RIGHT →", 22, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_left", "Right Stick LEFT ←", 21, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_down", "Right Stick DOWN ↓", 20, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_up", "Right Stick UP ↑", 19, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + + { "lstick_right", "Left Stick RIGHT →", 17, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_left", "Left Stick LEFT ←", 16, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_down", "Left Stick DOWN ↓", 15, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_up", "Left Stick UP ↑", 14, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + +}; + +// Not sure if all these buttons are named correctly! +IDIISG Device_AnalogJoy_IDII = +{ + { "select", "SELECT", 8, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + { "start", "START", 9, IDIT_BUTTON, NULL }, + { "up", "Thumbstick UP ↑", 14, IDIT_BUTTON, "down" }, + { "right", "Thumbstick RIGHT →", 17, IDIT_BUTTON, "left" }, + { "down", "Thumbstick DOWN ↓", 15, IDIT_BUTTON, "up" }, + { "left", "Thumbstick LEFT ←", 16, IDIT_BUTTON, "right" }, + + { "l2", "Left stick, Trigger", 2, IDIT_BUTTON, NULL }, + { "r2", "Left stick, Pinky", 3, IDIT_BUTTON, NULL }, + { "l1", "Left stick, L-thumb", 0, IDIT_BUTTON, NULL }, + { "r1", "Left stick, R-thumb", 1, IDIT_BUTTON, NULL }, + + { "triangle", "Right stick, Pinky", 13, IDIT_BUTTON, NULL }, + { "circle", "Right stick, R-thumb", 11, IDIT_BUTTON, NULL }, + { "cross", "Right stick, L-thumb", 10, IDIT_BUTTON, NULL }, + { "square", "Right stick, Trigger", 12, IDIT_BUTTON, NULL }, + + { "rstick_right", "Right Stick, RIGHT →", 21, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_left", "Right Stick, LEFT ←", 20, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_down", "Right Stick, BACK ↓", 19, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_up", "Right Stick, FORE ↑", 18, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + + { "lstick_right", "Left Stick, RIGHT →", 7, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_left", "Left Stick, LEFT ←", 6, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_down", "Left Stick, BACK ↓", 5, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_up", "Left Stick, FORE ↑", 4, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + +}; + + +} diff --git a/Mednafen/mednafen/psx/input/dualanalog.h b/Mednafen/mednafen/psx/input/dualanalog.h new file mode 100644 index 0000000000..3e307ba7fb --- /dev/null +++ b/Mednafen/mednafen/psx/input/dualanalog.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_PSX_INPUT_DUALANALOG_H +#define __MDFN_PSX_INPUT_DUALANALOG_H + +namespace MDFN_IEN_PSX +{ + +InputDevice *Device_DualAnalog_Create(bool joystick_mode); +extern IDIISG Device_DualAnalog_IDII; +extern IDIISG Device_AnalogJoy_IDII; +} +#endif diff --git a/Mednafen/mednafen/psx/input/dualshock.cpp b/Mednafen/mednafen/psx/input/dualshock.cpp new file mode 100644 index 0000000000..5e52e50988 --- /dev/null +++ b/Mednafen/mednafen/psx/input/dualshock.cpp @@ -0,0 +1,1111 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../psx.h" +#include "../frontio.h" +#include "dualshock.h" + +/* + TODO: + If we ever call Update() more than once per video frame(IE 50/60Hz), we'll need to add debounce logic to the analog mode button evaluation code. +*/ + +/* Notes: + + Both DA and DS style rumblings work in both analog and digital modes. + + Regarding getting Dual Shock style rumble working, Sony is evil and/or mean. The owl tells me to burn Sony with boiling oil. + + To enable Dual Shock-style rumble, the game has to at least enter MAD MUNCHKINS MODE with command 0x43, and send the appropriate data(not the actual rumble type data per-se) + with command 0x4D. + + DualAnalog-style rumble support seems to be borked until power loss if MAD MUNCHKINS MODE is even entered once...investigate further. + + Command 0x44 in MAD MUNCHKINS MODE can turn on/off analog mode(and the light with it). + + Command 0x42 in MAD MUNCHKINS MODE will return the analog mode style gamepad data, even when analog mode is off. In combination with command 0x44, this could hypothetically + be used for using the light in the gamepad as some kind of game mechanic). + + Dual Analog-style rumble notes(some of which may apply to DS too): + Rumble appears to stop if you hold DTR active(TODO: for how long? instant?). (TODO: investigate if it's still stopped even if a memory card device number is sent. It may be, since rumble may + cause excessive current draw in combination with memory card access) + + Rumble will work even if you interrupt the communication process after you've sent the rumble data(via command 0x42). + Though if you interrupt it when you've only sent partial rumble data, dragons will eat you and I don't know(seems to have timing-dependent or random effects or something; + based on VERY ROUGH testing). +*/ + +namespace MDFN_IEN_PSX +{ + +class InputDevice_DualShock final : public InputDevice +{ + public: + + InputDevice_DualShock(); + virtual ~InputDevice_DualShock() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + + virtual void Update(const pscpu_timestamp_t timestamp) override; + virtual void ResetTS(void) override; + virtual void UpdateInput(const void *data) override; + + virtual void SetAMCT(bool enabled) override; + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + void CheckManualAnaModeChange(void); + + // + // + bool cur_ana_button_state; + bool prev_ana_button_state; + int64 combo_anatoggle_counter; + // + + bool da_rumble_compat; + + bool analog_mode; + bool analog_mode_locked; + + bool mad_munchkins; + uint8 rumble_magic[6]; + + uint8 rumble_param[2]; + + bool dtr; + + uint8 buttons[2]; + uint8 axes[2][2]; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[8]; + uint32 transmit_pos; + uint32 transmit_count; + + // + // + // + pscpu_timestamp_t lastts; + + // + // + bool amct_enabled; +}; + +InputDevice_DualShock::InputDevice_DualShock() +{ + Power(); + amct_enabled = false; +} + +InputDevice_DualShock::~InputDevice_DualShock() +{ + +} + +void InputDevice_DualShock::Update(const pscpu_timestamp_t timestamp) +{ + lastts = timestamp; +} + +void InputDevice_DualShock::ResetTS(void) +{ + //printf("%lld\n", combo_anatoggle_counter); + if(combo_anatoggle_counter >= 0) + combo_anatoggle_counter += lastts; + lastts = 0; +} + +void InputDevice_DualShock::SetAMCT(bool enabled) +{ + amct_enabled = enabled; +} + +// +// This simulates the behavior of the actual DualShock(analog toggle button evaluation is suspended while DTR is active). +// Call in Update(), and whenever dtr goes inactive in the port access code. +void InputDevice_DualShock::CheckManualAnaModeChange(void) +{ + if(!dtr) + { + bool need_mode_toggle = false; + + if(amct_enabled) + { + if(buttons[0] == 0x09 && buttons[1] == 0x0f) + { + if(combo_anatoggle_counter == -1) + combo_anatoggle_counter = 0; + else if(combo_anatoggle_counter >= (44100 * 768)) + { + need_mode_toggle = true; + combo_anatoggle_counter = -2; + } + } + else + combo_anatoggle_counter = -1; + } + else + { + combo_anatoggle_counter = -1; + if(cur_ana_button_state && (cur_ana_button_state != prev_ana_button_state)) + { + need_mode_toggle = true; + } + } + + if(need_mode_toggle) + { + if(!analog_mode_locked) + analog_mode = !analog_mode; + } + + prev_ana_button_state = cur_ana_button_state; // Don't move this outside of the if(!dtr) block! + } +} + +void InputDevice_DualShock::Power(void) +{ + combo_anatoggle_counter = -2; + lastts = 0; + // + // + + dtr = 0; + + buttons[0] = buttons[1] = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; + + analog_mode = false; + analog_mode_locked = false; + + mad_munchkins = false; + memset(rumble_magic, 0xFF, sizeof(rumble_magic)); + memset(rumble_param, 0, sizeof(rumble_param)); + + da_rumble_compat = true; + + prev_ana_button_state = false; +} + +void InputDevice_DualShock::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(cur_ana_button_state), + SFVAR(prev_ana_button_state), + SFVAR(combo_anatoggle_counter), + + SFVAR(da_rumble_compat), + + SFVAR(analog_mode), + SFVAR(analog_mode_locked), + + SFVAR(mad_munchkins), + SFARRAY(rumble_magic, sizeof(rumble_magic)), + + SFARRAY(rumble_param, sizeof(rumble_param)), + + SFVAR(dtr), + + SFARRAY(buttons, sizeof(buttons)), + SFARRAY(&axes[0][0], sizeof(axes)), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_DualShock", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +void InputDevice_DualShock::UpdateInput(const void *data) +{ + uint8 *d8 = (uint8 *)data; + uint8* const rumb_dp = &d8[3 + 16]; + + buttons[0] = d8[0]; + buttons[1] = d8[1]; + //printf("Buttons: %d %d\n", buttons[0], buttons[1]); + cur_ana_button_state = d8[2] & 0x01; + + for(int stick = 0; stick < 2; stick++) + { + for(int axis = 0; axis < 2; axis++) + { + const uint8* aba = &d8[3] + stick * 8 + axis * 4; + int32 tmp; + + tmp = 32767 + MDFN_de16lsb(&aba[0]) - MDFN_de16lsb(&aba[2]); + tmp = (tmp * 0x100) / 0xFFFF; + + axes[stick][axis] = tmp; + } + } + + //printf("%3d:%3d, %3d:%3d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); + + //printf("RUMBLE: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", rumble_magic[0], rumble_magic[1], rumble_magic[2], rumble_magic[3], rumble_magic[4], rumble_magic[5]); + //printf("%d, 0x%02x 0x%02x\n", da_rumble_compat, rumble_param[0], rumble_param[1]); + + if(da_rumble_compat == false) + { + uint8 sneaky_weaky = 0; + + if(rumble_param[0] == 0x01) + sneaky_weaky = 0xFF; + + MDFN_en16lsb(rumb_dp, (sneaky_weaky << 0) | (rumble_param[1] << 8)); + } + else + { + uint8 sneaky_weaky = 0; + + if(((rumble_param[0] & 0xC0) == 0x40) && ((rumble_param[1] & 0x01) == 0x01)) + sneaky_weaky = 0xFF; + + MDFN_en16lsb(rumb_dp, sneaky_weaky << 0); + } + + //printf("%d %d %d %d\n", axes[0][0], axes[0][1], axes[1][0], axes[1][1]); + + // + // + // + CheckManualAnaModeChange(); + + // + // Encode analog mode state last. + // + d8[2] &= ~0x6; + d8[2] |= (analog_mode ? 0x02 : 0x00); + d8[2] |= (analog_mode_locked ? 0x04 : 0x00); +} + + +void InputDevice_DualShock::SetDTR(bool new_dtr) +{ + const bool old_dtr = dtr; + dtr = new_dtr; // Set it to new state before we call CheckManualAnaModeChange(). + + if(!old_dtr && dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(old_dtr && !dtr) + { + CheckManualAnaModeChange(); + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } +} + +bool InputDevice_DualShock::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_DualShock::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //if(command == 0x44) + //if(command == 0x4D) //mad_munchkins) // || command == 0x43) + // fprintf(stderr, "[PAD] Receive: %02x -- command=%02x, command_phase=%d, transmit_pos=%d\n", receive_buffer, command, command_phase, transmit_pos); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + if(mad_munchkins) + { + transmit_buffer[0] = 0xF3; + transmit_pos = 0; + transmit_count = 1; + command_phase = 101; + } + else + { + transmit_buffer[0] = analog_mode ? 0x73 : 0x41; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + } + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + //fprintf(stderr, "Gamepad command: 0x%02x\n", command); + //if(command != 0x42 && command != 0x43) + // fprintf(stderr, "Gamepad unhandled command: 0x%02x\n", command); + + if(command == 0x42) + { + transmit_buffer[0] = 0x5A; + transmit_pos = 0; + transmit_count = 1; + command_phase = (command << 8) | 0x00; + } + else if(command == 0x43) + { + transmit_pos = 0; + if(analog_mode) + { + transmit_buffer[1] = 0xFF ^ buttons[0]; + transmit_buffer[2] = 0xFF ^ buttons[1]; + transmit_buffer[3] = axes[0][0]; + transmit_buffer[4] = axes[0][1]; + transmit_buffer[5] = axes[1][0]; + transmit_buffer[6] = axes[1][1]; + transmit_count = 7; + } + else + { + transmit_buffer[1] = 0xFF ^ buttons[0]; + transmit_buffer[2] = 0xFF ^ buttons[1]; + transmit_count = 3; + } + } + else + { + command_phase = -1; + transmit_buffer[1] = 0; + transmit_buffer[2] = 0; + transmit_pos = 0; + transmit_count = 0; + } + break; + + case 2: + { + if(command == 0x43 && transmit_pos == 2 && (receive_buffer == 0x01)) + { + //fprintf(stderr, "Mad Munchkins mode entered!\n"); + mad_munchkins = true; + + if(da_rumble_compat) + { + rumble_param[0] = 0; + rumble_param[1] = 0; + da_rumble_compat = false; + } + command_phase = -1; + } + } + break; + + case 101: + command = receive_buffer; + + //fprintf(stderr, "Mad Munchkins DualShock command: 0x%02x\n", command); + + if(command >= 0x40 && command <= 0x4F) + { + transmit_buffer[0] = 0x5A; + transmit_pos = 0; + transmit_count = 1; + command_phase = (command << 8) | 0x00; + } + else + { + transmit_count = 0; + command_phase = -1; + } + break; + + /************************/ + /* MMMode 1, Command 0x40 */ + /************************/ + case 0x4000: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4001: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + + /************************/ + /* MMMode 1, Command 0x41 */ + /************************/ + case 0x4100: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4101: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /**************************/ + /* MMMode 0&1, Command 0x42 */ + /**************************/ + case 0x4200: + transmit_pos = 0; + if(analog_mode || mad_munchkins) + { + transmit_buffer[0] = 0xFF ^ buttons[0]; + transmit_buffer[1] = 0xFF ^ buttons[1]; + transmit_buffer[2] = axes[0][0]; + transmit_buffer[3] = axes[0][1]; + transmit_buffer[4] = axes[1][0]; + transmit_buffer[5] = axes[1][1]; + transmit_count = 6; + } + else + { + transmit_buffer[0] = 0xFF ^ buttons[0]; + transmit_buffer[1] = 0xFF ^ buttons[1]; + transmit_count = 2; + + if(!(rumble_magic[2] & 0xFE)) + { + transmit_buffer[transmit_count++] = 0x00; + transmit_buffer[transmit_count++] = 0x00; + } + } + command_phase++; + break; + + case 0x4201: // Weak(in DS mode) + if(da_rumble_compat) + rumble_param[0] = receive_buffer; + // Dualshock weak + else if(rumble_magic[0] == 0x00 && rumble_magic[2] != 0x00 && rumble_magic[3] != 0x00 && rumble_magic[4] != 0x00 && rumble_magic[5] != 0x00) + rumble_param[0] = receive_buffer; + command_phase++; + break; + + case 0x4202: + if(da_rumble_compat) + rumble_param[1] = receive_buffer; + else if(rumble_magic[1] == 0x01) // DualShock strong + rumble_param[1] = receive_buffer; + else if(rumble_magic[1] == 0x00 && rumble_magic[2] != 0x00 && rumble_magic[3] != 0x00 && rumble_magic[4] != 0x00 && rumble_magic[5] != 0x00) // DualShock weak + rumble_param[0] = receive_buffer; + + command_phase++; + break; + + case 0x4203: + if(da_rumble_compat) + { + + } + else if(rumble_magic[1] == 0x00 && rumble_magic[2] == 0x01) + rumble_param[1] = receive_buffer; // DualShock strong. + command_phase++; // Nowhere here we come! + break; + + /************************/ + /* MMMode 1, Command 0x43 */ + /************************/ + case 0x4300: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4301: + if(receive_buffer == 0x00) + { + //fprintf(stderr, "Mad Munchkins mode left!\n"); + mad_munchkins = false; + } + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x44 */ + /************************/ + case 0x4400: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4401: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase++; + + // Ignores locking state. + switch(receive_buffer) + { + case 0x00: + analog_mode = false; + //fprintf(stderr, "Analog mode disabled\n"); + break; + + case 0x01: + analog_mode = true; + //fprintf(stderr, "Analog mode enabled\n"); + break; + } + break; + + case 0x4402: + switch(receive_buffer) + { + case 0x02: + analog_mode_locked = false; + break; + + case 0x03: + analog_mode_locked = true; + break; + } + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x45 */ + /************************/ + case 0x4500: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0x01; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4501: + transmit_buffer[0] = 0x02; + transmit_buffer[1] = analog_mode ? 0x01 : 0x00; + transmit_buffer[2] = 0x02; + transmit_buffer[3] = 0x01; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + + /************************/ + /* MMMode 1, Command 0x46 */ + /************************/ + case 0x4600: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4601: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x01; + transmit_buffer[2] = 0x02; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x0A; + } + else if(receive_buffer == 0x01) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x01; + transmit_buffer[2] = 0x01; + transmit_buffer[3] = 0x01; + transmit_buffer[4] = 0x14; + } + else + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + } + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x47 */ + /************************/ + case 0x4700: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4701: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x02; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x01; + transmit_buffer[4] = 0x00; + } + else + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + } + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x48 */ + /************************/ + case 0x4800: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4801: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x01; + transmit_buffer[4] = rumble_param[0]; + } + else if(receive_buffer == 0x01) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x01; + transmit_buffer[4] = rumble_param[1]; + } + else + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + } + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x49 */ + /************************/ + case 0x4900: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4901: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x4A */ + /************************/ + case 0x4A00: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4A01: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x4B */ + /************************/ + case 0x4B00: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4B01: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x4C */ + /************************/ + case 0x4C00: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4C01: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x04; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + } + else if(receive_buffer == 0x01) + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x07; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + } + else + { + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + } + + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + /************************/ + /* MMMode 1, Command 0x4D */ + /************************/ + case 0x4D00: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = rumble_magic[0]; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4D01: + case 0x4D02: + case 0x4D03: + case 0x4D04: + case 0x4D05: + case 0x4D06: + { + unsigned index = command_phase - 0x4D01; + + if(index < 5) + { + transmit_buffer[0] = rumble_magic[1 + index]; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + else + command_phase = -1; + + rumble_magic[index] = receive_buffer; + } + break; + + /************************/ + /* MMMode 1, Command 0x4E */ + /************************/ + case 0x4E00: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4E01: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + + + /************************/ + /* MMMode 1, Command 0x4F */ + /************************/ + case 0x4F00: + if(receive_buffer == 0x00) + { + transmit_buffer[0] = 0; /**/ transmit_pos = 0; transmit_count = 1; /**/ + command_phase++; + } + else + command_phase = -1; + break; + + case 0x4F01: + transmit_buffer[0] = 0x00; + transmit_buffer[1] = 0x00; + transmit_buffer[2] = 0x00; + transmit_buffer[3] = 0x00; + transmit_buffer[4] = 0x00; + transmit_pos = 0; + transmit_count = 5; + command_phase = -1; + break; + } + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 0x40; //0x100; + + return(ret); +} + +InputDevice *Device_DualShock_Create(void) +{ + return new InputDevice_DualShock(); +} + +static const IDIIS_StatusState AM_SS[] = +{ + { "off_unlocked", gettext_noop("Off(unlocked)") }, + { "on_unlocked", gettext_noop("On(unlocked)") }, + + { "off_locked", gettext_noop("Off(locked)") }, + { "on_locked", gettext_noop("On(locked)") }, +}; + + +const IDIISG Device_DualShock_IDII = +{ + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "l3", "Left Stick, Button(L3)", 18, IDIT_BUTTON, NULL }, + { "r3", "Right stick, Button(R3)", 23, IDIT_BUTTON, NULL }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "D-Pad UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "D-Pad RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "D-Pad DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "D-Pad LEFT ←", 2, IDIT_BUTTON, "right" }, + + { "l2", "L2 (rear left shoulder)", 11, IDIT_BUTTON, NULL }, + { "r2", "R2 (rear right shoulder)", 13, IDIT_BUTTON, NULL }, + { "l1", "L1 (front left shoulder)", 10, IDIT_BUTTON, NULL }, + { "r1", "R1 (front right shoulder)", 12, IDIT_BUTTON, NULL }, + + { "triangle", "△ (upper)", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "circle", "○ (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "cross", "x (lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "square", "□ (left)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, + + { "analog", "Analog(mode toggle)", 24, IDIT_BUTTON, NULL }, + + IDIIS_Status("amstatus", "Analog Mode", AM_SS, sizeof(AM_SS) / sizeof(AM_SS[0])), + + { "rstick_right", "Right Stick RIGHT →", 22, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_left", "Right Stick LEFT ←", 21, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_down", "Right Stick DOWN ↓", 20, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "rstick_up", "Right Stick UP ↑", 19, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + + { "lstick_right", "Left Stick RIGHT →", 17, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_left", "Left Stick LEFT ←", 16, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_down", "Left Stick DOWN ↓", 15, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + { "lstick_up", "Left Stick UP ↑", 14, IDIT_BUTTON_ANALOG, NULL, { NULL, NULL, NULL }, IDIT_BUTTON_ANALOG_FLAG_SQLR }, + + { "rumble", "RUMBLE MONSTER RUMBA", 100, IDIT_RUMBLE }, +}; + +} diff --git a/Mednafen/mednafen/psx/input/dualshock.h b/Mednafen/mednafen/psx/input/dualshock.h new file mode 100644 index 0000000000..781ecef457 --- /dev/null +++ b/Mednafen/mednafen/psx/input/dualshock.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_PSX_INPUT_DUALSHOCK_H +#define __MDFN_PSX_INPUT_DUALSHOCK_H + +namespace MDFN_IEN_PSX +{ +InputDevice *Device_DualShock_Create(void); +extern const IDIISG Device_DualShock_IDII; +} +#endif diff --git a/Mednafen/mednafen/psx/input/gamepad.cpp b/Mednafen/mednafen/psx/input/gamepad.cpp new file mode 100644 index 0000000000..faed15b8cc --- /dev/null +++ b/Mednafen/mednafen/psx/input/gamepad.cpp @@ -0,0 +1,277 @@ +#include "../psx.h" +#include "../frontio.h" +#include "gamepad.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_Gamepad final : public InputDevice +{ + public: + + InputDevice_Gamepad(); + virtual ~InputDevice_Gamepad() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + virtual void UpdateInput(const void *data) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + bool dtr; + + uint8 buttons[2]; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[3]; + uint32 transmit_pos; + uint32 transmit_count; +}; + +InputDevice_Gamepad::InputDevice_Gamepad() +{ + Power(); +} + +InputDevice_Gamepad::~InputDevice_Gamepad() +{ + +} + +void InputDevice_Gamepad::Power(void) +{ + dtr = 0; + + buttons[0] = buttons[1] = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; +} + +void InputDevice_Gamepad::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(dtr), + + SFARRAY(buttons, sizeof(buttons)), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_Gamepad", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +void InputDevice_Gamepad::UpdateInput(const void *data) +{ + uint8 *d8 = (uint8 *)data; + + buttons[0] = d8[0]; + buttons[1] = d8[1]; +} + + +void InputDevice_Gamepad::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + + dtr = new_dtr; +} + +bool InputDevice_Gamepad::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_Gamepad::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + transmit_buffer[0] = 0x41; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + //if(command != 0x42) + // fprintf(stderr, "Gamepad unhandled command: 0x%02x\n", command); + //assert(command == 0x42); + if(command == 0x42) + { + //printf("PAD COmmand 0x42, sl=%u\n", GPU->GetScanlineNum()); + + transmit_buffer[1] = 0xFF ^ buttons[0]; + transmit_buffer[2] = 0xFF ^ buttons[1]; + transmit_pos = 0; + transmit_count = 3; + } + else + { + command_phase = -1; + transmit_buffer[1] = 0; + transmit_buffer[2] = 0; + transmit_pos = 0; + transmit_count = 0; + } + break; + + } + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 0x40; //0x100; + + return(ret); +} + +InputDevice *Device_Gamepad_Create(void) +{ + return new InputDevice_Gamepad(); +} + + +IDIISG Device_Gamepad_IDII = +{ + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + + { "l2", "L2 (rear left shoulder)", 11, IDIT_BUTTON, NULL }, + { "r2", "R2 (rear right shoulder)", 13, IDIT_BUTTON, NULL }, + { "l1", "L1 (front left shoulder)", 10, IDIT_BUTTON, NULL }, + { "r1", "R1 (front right shoulder)", 12, IDIT_BUTTON, NULL }, + + { "triangle", "△ (upper)", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "circle", "○ (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "cross", "x (lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "square", "□ (left)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, +}; + +IDIISG Device_Dancepad_IDII = +{ + { "select", "SELECT", 0, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON }, + { NULL, "empty", 0, IDIT_BUTTON }, + { "start", "START", 1, IDIT_BUTTON, NULL }, + + { "up", "UP ↑", 3, IDIT_BUTTON, NULL }, + { "right", "RIGHT →", 6, IDIT_BUTTON, NULL }, + { "down", "DOWN ↓", 8, IDIT_BUTTON, NULL }, + { "left", "LEFT ←", 5, IDIT_BUTTON, NULL }, + + { NULL, "empty", 0, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON, NULL }, + { NULL, "empty", 0, IDIT_BUTTON, NULL }, + + { "triangle", "△ (lower left)", 7, IDIT_BUTTON, NULL }, + { "circle", "○ (upper right)", 4, IDIT_BUTTON, NULL }, + { "cross", "x (upper left)", 2, IDIT_BUTTON, NULL }, + { "square", "□ (lower right)", 9, IDIT_BUTTON, NULL }, +}; + + +} diff --git a/Mednafen/mednafen/psx/input/gamepad.h b/Mednafen/mednafen/psx/input/gamepad.h new file mode 100644 index 0000000000..ac45369568 --- /dev/null +++ b/Mednafen/mednafen/psx/input/gamepad.h @@ -0,0 +1,12 @@ +#ifndef __MDFN_PSX_INPUT_GAMEPAD_H +#define __MDFN_PSX_INPUT_GAMEPAD_H + +namespace MDFN_IEN_PSX +{ + +InputDevice *Device_Gamepad_Create(void); +extern IDIISG Device_Gamepad_IDII; +extern IDIISG Device_Dancepad_IDII; + +} +#endif diff --git a/Mednafen/mednafen/psx/input/guncon.cpp b/Mednafen/mednafen/psx/input/guncon.cpp new file mode 100644 index 0000000000..df13044556 --- /dev/null +++ b/Mednafen/mednafen/psx/input/guncon.cpp @@ -0,0 +1,384 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../psx.h" +#include "../frontio.h" +#include "guncon.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_GunCon final : public InputDevice +{ + public: + + InputDevice_GunCon(void); + virtual ~InputDevice_GunCon() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + virtual void UpdateInput(const void *data) override; + virtual bool RequireNoFrameskip(void) override; + virtual pscpu_timestamp_t GPULineHook(const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + bool dtr; + + uint8 buttons; + bool trigger_eff; + bool trigger_noclear; + uint16 hit_x, hit_y; + + int16 nom_x, nom_y; + int32 os_shot_counter; + bool prev_oss; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[16]; + uint32 transmit_pos; + uint32 transmit_count; + + // + // Video timing stuff + bool prev_vsync; + int line_counter; +}; + +InputDevice_GunCon::InputDevice_GunCon(void) +{ + Power(); +} + +InputDevice_GunCon::~InputDevice_GunCon() +{ + +} + +void InputDevice_GunCon::Power(void) +{ + dtr = 0; + + buttons = 0; + trigger_eff = 0; + trigger_noclear = 0; + hit_x = 0; + hit_y = 0; + + nom_x = 0; + nom_y = 0; + + os_shot_counter = 0; + prev_oss = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; + + prev_vsync = 0; + line_counter = 0; +} + +void InputDevice_GunCon::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(dtr), + + SFVAR(buttons), + SFVAR(trigger_eff), + SFVAR(trigger_noclear), + SFVAR(hit_x), + SFVAR(hit_y), + + SFVAR(nom_x), + SFVAR(nom_y), + SFVAR(os_shot_counter), + SFVAR(prev_oss), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFVAR(prev_vsync), + SFVAR(line_counter), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_GunCon", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +void InputDevice_GunCon::UpdateInput(const void *data) +{ + uint8 *d8 = (uint8 *)data; + + nom_x = (int16)MDFN_de16lsb(&d8[0]); + nom_y = (int16)MDFN_de16lsb(&d8[2]); + + trigger_noclear = (bool)(d8[4] & 0x1); + trigger_eff |= trigger_noclear; + + buttons = d8[4] >> 1; + + if(os_shot_counter > 0) // FIXME if UpdateInput() is ever called more than once per video frame(at ~50 or ~60Hz). + os_shot_counter--; + + if((d8[4] & 0x8) && !prev_oss && os_shot_counter == 0) + os_shot_counter = 4; + prev_oss = d8[4] & 0x8; + + //MDFN_DispMessage("%08x %08x", nom_x, nom_y); +} + +bool InputDevice_GunCon::RequireNoFrameskip(void) +{ + return(true); +} + +pscpu_timestamp_t InputDevice_GunCon::GPULineHook(const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, + const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) +{ + if(vsync && !prev_vsync) + line_counter = 0; + + if(pixels && pix_clock) + { + const int avs = 16; // Not 16 for PAL, fixme. + int32 gx; + int32 gy; + + gx = (nom_x * 2 + pix_clock_divider) / (pix_clock_divider * 2); + gy = nom_y; + + for(int32 ix = gx; ix < (gx + (int32)(pix_clock / 762925)); ix++) + { + if(ix >= 0 && ix < (int)width && line_counter >= (avs + gy) && line_counter < (avs + gy + 8)) + { + int r, g, b, a; + + format->DecodeColor(pixels[ix], r, g, b, a); + + if((r + g + b) >= 0x40) // Wrong, but not COMPLETELY ABSOLUTELY wrong, at least. ;) + { + hit_x = (int64)(ix + pix_clock_offset) * 8000000 / pix_clock; // GunCon has what appears to be an 8.00MHz ceramic resonator in it. + hit_y = line_counter; + } + } + } + + chair_x = gx; + chair_y = (avs + gy) - line_counter; + } + + line_counter++; + + return(PSX_EVENT_MAXTS); +} + +void InputDevice_GunCon::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + + dtr = new_dtr; +} + +bool InputDevice_GunCon::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_GunCon::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + transmit_buffer[0] = 0x63; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + break; + + case 2: + //if(receive_buffer) + // printf("%02x\n", receive_buffer); + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + //puts("MOO"); + //if(command != 0x42) + // fprintf(stderr, "GunCon unhandled command: 0x%02x\n", command); + //assert(command == 0x42); + if(command == 0x42) + { + transmit_buffer[1] = 0xFF ^ ((buttons & 0x01) << 3); + transmit_buffer[2] = 0xFF ^ (trigger_eff << 5) ^ ((buttons & 0x02) << 5); + + if(os_shot_counter > 0) + { + hit_x = 0x01; + hit_y = 0x0A; + transmit_buffer[2] |= (1 << 5); + if(os_shot_counter == 2 || os_shot_counter == 3) + { + transmit_buffer[2] &= ~(1 << 5); + } + } + + MDFN_en16lsb(&transmit_buffer[3], hit_x); + MDFN_en16lsb(&transmit_buffer[5], hit_y); + + hit_x = 0x01; + hit_y = 0x0A; + + transmit_pos = 0; + transmit_count = 7; + + trigger_eff = trigger_noclear; + } + else + { + command_phase = -1; + transmit_buffer[1] = 0; + transmit_buffer[2] = 0; + transmit_pos = 0; + transmit_count = 0; + } + break; + + } + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 100; //0x80; //0x40; + + return(ret); +} + +InputDevice *Device_GunCon_Create(void) +{ + return new InputDevice_GunCon(); +} + + +IDIISG Device_GunCon_IDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS }, + + { "trigger", "Trigger", 0, IDIT_BUTTON, NULL }, + + { "a", "A", 1, IDIT_BUTTON, NULL }, + { "b", "B", 2, IDIT_BUTTON, NULL }, + + { "offscreen_shot", "Offscreen Shot(Simulated)", 3, IDIT_BUTTON, NULL }, // Useful for "Judge Dredd", and probably not much else. +}; + + + +} diff --git a/Mednafen/mednafen/psx/input/guncon.h b/Mednafen/mednafen/psx/input/guncon.h new file mode 100644 index 0000000000..db9253e3c8 --- /dev/null +++ b/Mednafen/mednafen/psx/input/guncon.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_PSX_INPUT_GUNCON_H +#define __MDFN_PSX_INPUT_GUNCON_H + +namespace MDFN_IEN_PSX +{ + +InputDevice *Device_GunCon_Create(void); +extern IDIISG Device_GunCon_IDII; + +} +#endif diff --git a/Mednafen/mednafen/psx/input/justifier.cpp b/Mednafen/mednafen/psx/input/justifier.cpp new file mode 100644 index 0000000000..ebd7c875d6 --- /dev/null +++ b/Mednafen/mednafen/psx/input/justifier.cpp @@ -0,0 +1,389 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../psx.h" +#include "../frontio.h" +#include "justifier.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_Justifier final : public InputDevice +{ + public: + + InputDevice_Justifier(void); + virtual ~InputDevice_Justifier() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + virtual void UpdateInput(const void *data) override; + virtual bool RequireNoFrameskip(void) override; + virtual pscpu_timestamp_t GPULineHook(const pscpu_timestamp_t timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + bool dtr; + + uint8 buttons; + bool trigger_eff; + bool trigger_noclear; + + bool need_hit_detect; + + int16 nom_x, nom_y; + int32 os_shot_counter; + bool prev_oss; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[16]; + uint32 transmit_pos; + uint32 transmit_count; + + // + // Video timing stuff + bool prev_vsync; + int line_counter; +}; + +InputDevice_Justifier::InputDevice_Justifier(void) +{ + Power(); +} + +InputDevice_Justifier::~InputDevice_Justifier() +{ + +} + +void InputDevice_Justifier::Power(void) +{ + dtr = 0; + + buttons = 0; + trigger_eff = 0; + trigger_noclear = 0; + + need_hit_detect = false; + + nom_x = 0; + nom_y = 0; + + os_shot_counter = 0; + prev_oss = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; + + prev_vsync = 0; + line_counter = 0; +} + +void InputDevice_Justifier::UpdateInput(const void *data) +{ + uint8 *d8 = (uint8 *)data; + + nom_x = (int16)MDFN_de16lsb(&d8[0]); + nom_y = (int16)MDFN_de16lsb(&d8[2]); + + trigger_noclear = (bool)(d8[4] & 0x1); + trigger_eff |= trigger_noclear; + + buttons = (d8[4] >> 1) & 0x3; + + if(os_shot_counter > 0) // FIXME if UpdateInput() is ever called more than once per video frame(at ~50 or ~60Hz). + os_shot_counter--; + + if((d8[4] & 0x8) && !prev_oss && os_shot_counter == 0) + os_shot_counter = 10; + prev_oss = d8[4] & 0x8; +} + +void InputDevice_Justifier::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(dtr), + + SFVAR(buttons), + SFVAR(trigger_eff), + SFVAR(trigger_noclear), + + SFVAR(need_hit_detect), + + SFVAR(nom_x), + SFVAR(nom_y), + SFVAR(os_shot_counter), + SFVAR(prev_oss), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFVAR(prev_vsync), + SFVAR(line_counter), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_Justifier", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +bool InputDevice_Justifier::RequireNoFrameskip(void) +{ + return(true); +} + +pscpu_timestamp_t InputDevice_Justifier::GPULineHook(const pscpu_timestamp_t timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, + const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) +{ + pscpu_timestamp_t ret = PSX_EVENT_MAXTS; + + if(vsync && !prev_vsync) + line_counter = 0; + + if(pixels && pix_clock) + { + const int avs = 16; // Not 16 for PAL, fixme. + int32 gx; + int32 gy; + int32 gxa; + + gx = (nom_x * 2 + pix_clock_divider) / (pix_clock_divider * 2); + gy = nom_y; + gxa = gx; // - (pix_clock / 400000); + //if(gxa < 0 && gx >= 0) + // gxa = 0; + + if(!os_shot_counter && need_hit_detect) + { + for(int32 ix = gxa; ix < (gxa + (int32)(pix_clock / 762925)); ix++) + { + if(ix >= 0 && ix < (int)width && line_counter >= (avs + gy - 6) && line_counter <= (avs + gy + 6)) + { + int r, g, b, a; + + format->DecodeColor(pixels[ix], r, g, b, a); + + if((r + g + b) >= 0x40) // Wrong, but not COMPLETELY ABSOLUTELY wrong, at least. ;) + { + ret = timestamp + (int64)(ix + pix_clock_offset) * (44100 * 768) / pix_clock - 177; + break; + } + } + } + } + + chair_x = gx; + chair_y = (avs + gy) - line_counter; + } + + line_counter++; + + return(ret); +} + +void InputDevice_Justifier::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + + dtr = new_dtr; +} + +bool InputDevice_Justifier::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_Justifier::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + transmit_buffer[0] = 0x31; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + break; + + case 2: + //if(receive_buffer) + // printf("%02x\n", receive_buffer); + command_phase++; + break; + + case 3: + need_hit_detect = receive_buffer & 0x10; // TODO, see if it's (val&0x10) == 0x10, or some other mask value. + command_phase++; + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + //if(command != 0x42) + // fprintf(stderr, "Justifier unhandled command: 0x%02x\n", command); + //assert(command == 0x42); + if(command == 0x42) + { + transmit_buffer[1] = 0xFF ^ ((buttons & 2) << 2); + transmit_buffer[2] = 0xFF ^ (trigger_eff << 7) ^ ((buttons & 1) << 6); + + if(os_shot_counter > 0) + { + transmit_buffer[2] |= (1 << 7); + if(os_shot_counter == 6 || os_shot_counter == 5) + { + transmit_buffer[2] &= ~(1 << 7); + } + } + + transmit_pos = 0; + transmit_count = 3; + + trigger_eff = trigger_noclear; + } + else + { + command_phase = -1; + transmit_buffer[1] = 0; + transmit_buffer[2] = 0; + transmit_pos = 0; + transmit_count = 0; + } + break; + + } + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 200; + + return(ret); +} + +InputDevice *Device_Justifier_Create(void) +{ + return new InputDevice_Justifier(); +} + + +IDIISG Device_Justifier_IDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS }, + + { "trigger", "Trigger", 0, IDIT_BUTTON, NULL }, + + { "o", "O", 1, IDIT_BUTTON, NULL }, + { "start", "Start", 2, IDIT_BUTTON, NULL }, + + { "offscreen_shot", "Offscreen Shot(Simulated)", 3, IDIT_BUTTON, NULL }, +}; + + + +} diff --git a/Mednafen/mednafen/psx/input/justifier.h b/Mednafen/mednafen/psx/input/justifier.h new file mode 100644 index 0000000000..bd6669299f --- /dev/null +++ b/Mednafen/mednafen/psx/input/justifier.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_PSX_INPUT_JUSTIFIER_H +#define __MDFN_PSX_INPUT_JUSTIFIER_H + +namespace MDFN_IEN_PSX +{ + +InputDevice *Device_Justifier_Create(void); +extern IDIISG Device_Justifier_IDII; + +} +#endif diff --git a/Mednafen/mednafen/psx/input/memcard.cpp b/Mednafen/mednafen/psx/input/memcard.cpp new file mode 100644 index 0000000000..cadd853e27 --- /dev/null +++ b/Mednafen/mednafen/psx/input/memcard.cpp @@ -0,0 +1,532 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// I could find no other commands than 'R', 'W', and 'S' (not sure what 'S' is for, however) + +#include "../psx.h" +#include "../frontio.h" +#include "memcard.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_Memcard final : public InputDevice +{ + public: + + InputDevice_Memcard(); + virtual ~InputDevice_Memcard() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + // + // + virtual uint32 GetNVSize(void) const override; + virtual const uint8* ReadNV(void) const override; + virtual void WriteNV(const uint8 *buffer, uint32 offset, uint32 size) override; + + virtual uint64 GetNVDirtyCount(void) const override; + virtual void ResetNVDirtyCount(void) override; + + private: + + void Format(void); + + bool presence_new; + + uint8 card_data[1 << 17]; + uint8 rw_buffer[128]; + uint8 write_xor; + + // + // Used to avoid saving unused memory cards' card data in save states. + // Set to false on object initialization, set to true when data is written to card_data that differs + // from existing data(either from loading a memory card saved to disk, or from a game writing to the memory card). + // + // Save and load its state to/from save states. + // + bool data_used; + + // + // Do not save dirty_count in save states! + // + uint64 dirty_count; + + bool dtr; + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + uint16 addr; + uint8 calced_xor; + + uint8 transmit_buffer; + uint32 transmit_count; +}; + +void InputDevice_Memcard::Format(void) +{ + memset(card_data, 0x00, sizeof(card_data)); + + card_data[0x00] = 0x4D; + card_data[0x01] = 0x43; + card_data[0x7F] = 0x0E; + + for(unsigned int A = 0x80; A < 0x800; A += 0x80) + { + card_data[A + 0x00] = 0xA0; + card_data[A + 0x08] = 0xFF; + card_data[A + 0x09] = 0xFF; + card_data[A + 0x7F] = 0xA0; + } + + for(unsigned int A = 0x0800; A < 0x1200; A += 0x80) + { + card_data[A + 0x00] = 0xFF; + card_data[A + 0x01] = 0xFF; + card_data[A + 0x02] = 0xFF; + card_data[A + 0x03] = 0xFF; + card_data[A + 0x08] = 0xFF; + card_data[A + 0x09] = 0xFF; + } +} + +InputDevice_Memcard::InputDevice_Memcard() +{ + Power(); + + data_used = false; + dirty_count = 0; + + // Init memcard as formatted. + assert(sizeof(card_data) == (1 << 17)); + Format(); +} + +InputDevice_Memcard::~InputDevice_Memcard() +{ + +} + +void InputDevice_Memcard::Power(void) +{ + dtr = 0; + + //buttons[0] = buttons[1] = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + transmit_buffer = 0; + + transmit_count = 0; + + addr = 0; + + presence_new = true; +} + +void InputDevice_Memcard::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + // Don't save dirty_count. + SFORMAT StateRegs[] = + { + SFVAR(presence_new), + + SFARRAY(rw_buffer, sizeof(rw_buffer)), + SFVAR(write_xor), + + SFVAR(dtr), + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + SFVAR(addr), + SFVAR(calced_xor), + + SFVAR(transmit_buffer), + SFVAR(transmit_count), + + SFVAR(data_used), + + SFEND + }; + + SFORMAT CD_StateRegs[] = + { + SFARRAY(card_data, sizeof(card_data)), + SFEND + }; + + // + // Use sname_prefix directly here for backwards compatibility with < 0.9.36.* + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, sname_prefix, true) && load) + Power(); // We should technically also Format() here too for state consistency reasons, but I don't want to be murdered by an angry mob so we won't. + else + { + if(data_used) + { + char aux_section_name[32]; + + trio_snprintf(aux_section_name, sizeof(aux_section_name), "%s_DT", sname_prefix); + MDFNSS_StateAction(sm, load, data_only, CD_StateRegs, aux_section_name); + } + + if(load) + { + if(data_used) + dirty_count++; + else + { + //printf("Format: %s\n", section_name); + Format(); + } + } + } +} + + +void InputDevice_Memcard::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + if(command_phase > 0) + PSX_WARNING("[MCR] Communication aborted on phase %d", command_phase); + } + dtr = new_dtr; +} + +bool InputDevice_Memcard::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_Memcard::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //if(command_phase > 0 || transmit_count) + // printf("[MCRDATA] Received_data=0x%02x, Sent_data=0x%02x\n", receive_buffer, transmit_buffer); + + if(transmit_count) + { + transmit_count--; + } + + + if(command_phase == 0) + { + if(receive_buffer != 0x81) + command_phase = -1; + else + { + //printf("[MCR] Device selected\n"); + transmit_buffer = presence_new ? 0x08 : 0x00; + transmit_count = 1; + command_phase++; + } + } + else if(command_phase == 1) + { + command = receive_buffer; + //printf("[MCR] Command received: %c\n", command); + if(command == 'R' || command == 'W') + { + command_phase++; + transmit_buffer = 0x5A; + transmit_count = 1; + } + else + { + if(command == 'S') + { + PSX_WARNING("[MCR] Memcard S command unsupported."); + } + + command_phase = -1; + transmit_buffer = 0; + transmit_count = 0; + } + } + else if(command_phase == 2) + { + transmit_buffer = 0x5D; + transmit_count = 1; + command_phase++; + } + else if(command_phase == 3) + { + transmit_buffer = 0x00; + transmit_count = 1; + if(command == 'R') + command_phase = 1000; + else if(command == 'W') + command_phase = 2000; + } + // + // Read + // + else if(command_phase == 1000) + { + addr = receive_buffer << 8; + transmit_buffer = receive_buffer; + transmit_count = 1; + command_phase++; + } + else if(command_phase == 1001) + { + addr |= receive_buffer & 0xFF; + transmit_buffer = '\\'; + transmit_count = 1; + command_phase++; + } + else if(command_phase == 1002) + { + PSX_DBG(PSX_DBG_SPARSE, "[MCR] Read Command: 0x%04x\n", addr); + if(addr >= (sizeof(card_data) >> 7)) + addr = 0xFFFF; + + calced_xor = 0; + transmit_buffer = ']'; + transmit_count = 1; + command_phase++; + + // TODO: enable this code(or something like it) when CPU instruction timing is a bit better. + // + //dsr_pulse_delay = 32000; + //goto SkipDPD; + // + } + else if(command_phase == 1003) + { + transmit_buffer = addr >> 8; + calced_xor ^= transmit_buffer; + transmit_count = 1; + command_phase++; + } + else if(command_phase == 1004) + { + transmit_buffer = addr & 0xFF; + calced_xor ^= transmit_buffer; + + if(addr == 0xFFFF) + { + transmit_count = 1; + command_phase = -1; + } + else + { + transmit_count = 1; + command_phase = 1024; + } + } + // Transmit actual 128 bytes data + else if(command_phase >= (1024 + 0) && command_phase <= (1024 + 128 - 1)) + { + transmit_buffer = card_data[(addr << 7) + (command_phase - 1024)]; + calced_xor ^= transmit_buffer; + transmit_count = 1; + command_phase++; + } + // XOR + else if(command_phase == (1024 + 128)) + { + transmit_buffer = calced_xor; + transmit_count = 1; + command_phase++; + } + // End flag + else if(command_phase == (1024 + 129)) + { + transmit_buffer = 'G'; + transmit_count = 1; + command_phase = -1; + } + // + // Write + // + else if(command_phase == 2000) + { + calced_xor = receive_buffer; + addr = receive_buffer << 8; + transmit_buffer = receive_buffer; + transmit_count = 1; + command_phase++; + } + else if(command_phase == 2001) + { + calced_xor ^= receive_buffer; + addr |= receive_buffer & 0xFF; + PSX_DBG(PSX_DBG_SPARSE, "[MCR] Write command: 0x%04x\n", addr); + transmit_buffer = receive_buffer; + transmit_count = 1; + command_phase = 2048; + } + else if(command_phase >= (2048 + 0) && command_phase <= (2048 + 128 - 1)) + { + calced_xor ^= receive_buffer; + rw_buffer[command_phase - 2048] = receive_buffer; + + transmit_buffer = receive_buffer; + transmit_count = 1; + command_phase++; + } + else if(command_phase == (2048 + 128)) // XOR + { + write_xor = receive_buffer; + transmit_buffer = '\\'; + transmit_count = 1; + command_phase++; + } + else if(command_phase == (2048 + 129)) + { + transmit_buffer = ']'; + transmit_count = 1; + command_phase++; + } + else if(command_phase == (2048 + 130)) // End flag + { + //MDFN_DispMessage("%02x %02x", calced_xor, write_xor); + //printf("[MCR] Write End. Actual_XOR=0x%02x, CW_XOR=0x%02x\n", calced_xor, write_xor); + + if(calced_xor != write_xor) + { + transmit_buffer = 'N'; + PSX_WARNING("[MCR] Write end, calced_xor(0x%02x) != written_xor(0x%02x)", calced_xor, write_xor); + } + else if(addr >= (sizeof(card_data) >> 7)) + { + transmit_buffer = 0xFF; + PSX_WARNING("[MCR] Attempt to write to invalid block 0x%04x", addr); + } + else + { + transmit_buffer = 'G'; + presence_new = false; + + // If the current data is different from the data to be written, increment the dirty count. + // memcpy()'ing over to card_data is also conditionalized here for a slight optimization. + if(memcmp(&card_data[addr << 7], rw_buffer, 128)) + { + memcpy(&card_data[addr << 7], rw_buffer, 128); + dirty_count++; + data_used = true; + } + } + + transmit_count = 1; + command_phase = -1; + } + + //if(command_phase != -1 || transmit_count) + // printf("[MCR] Receive: 0x%02x, Send: 0x%02x -- %d\n", receive_buffer, transmit_buffer, command_phase); + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 0x100; + + //SkipDPD: ; + + return(ret); +} + +uint32 InputDevice_Memcard::GetNVSize(void) const +{ + return(sizeof(card_data)); +} + +const uint8* InputDevice_Memcard::ReadNV(void) const +{ + return card_data; +} + +void InputDevice_Memcard::WriteNV(const uint8 *buffer, uint32 offset, uint32 size) +{ + if(size) + { + dirty_count++; + } + + while(size--) + { + if(card_data[offset & (sizeof(card_data) - 1)] != *buffer) + data_used = true; + + card_data[offset & (sizeof(card_data) - 1)] = *buffer; + buffer++; + offset++; + } +} + +uint64 InputDevice_Memcard::GetNVDirtyCount(void) const +{ + return(dirty_count); +} + +void InputDevice_Memcard::ResetNVDirtyCount(void) +{ + dirty_count = 0; +} + + +InputDevice *Device_Memcard_Create(void) +{ + return new InputDevice_Memcard(); +} + +} diff --git a/Mednafen/mednafen/psx/input/memcard.h b/Mednafen/mednafen/psx/input/memcard.h new file mode 100644 index 0000000000..05627661c4 --- /dev/null +++ b/Mednafen/mednafen/psx/input/memcard.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_PSX_INPUT_MEMCARD_H +#define __MDFN_PSX_INPUT_MEMCARD_H + +namespace MDFN_IEN_PSX +{ + +InputDevice *Device_Memcard_Create(void); + +} + +#endif diff --git a/Mednafen/mednafen/psx/input/mouse.cpp b/Mednafen/mednafen/psx/input/mouse.cpp new file mode 100644 index 0000000000..1f75a78837 --- /dev/null +++ b/Mednafen/mednafen/psx/input/mouse.cpp @@ -0,0 +1,294 @@ +#include "../psx.h" +#include "../frontio.h" +#include "mouse.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_Mouse final : public InputDevice +{ + public: + + InputDevice_Mouse(); + virtual ~InputDevice_Mouse() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + virtual void UpdateInput(const void *data) override; + + virtual void Update(const pscpu_timestamp_t timestamp) override; + virtual void ResetTS(void) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + int32 lastts; + int32 clear_timeout; + + bool dtr; + + uint8 button; + uint8 button_post_mask; + int32 accum_xdelta; + int32 accum_ydelta; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[5]; + uint32 transmit_pos; + uint32 transmit_count; +}; + +InputDevice_Mouse::InputDevice_Mouse() +{ + Power(); +} + +InputDevice_Mouse::~InputDevice_Mouse() +{ + +} + +void InputDevice_Mouse::Update(const pscpu_timestamp_t timestamp) +{ + int32 cycles = timestamp - lastts; + + clear_timeout += cycles; + if(clear_timeout >= (33868800 / 4)) + { + //puts("Mouse timeout\n"); + clear_timeout = 0; + accum_xdelta = 0; + accum_ydelta = 0; + button &= button_post_mask; + } + + lastts = timestamp; +} + +void InputDevice_Mouse::ResetTS(void) +{ + lastts = 0; +} + +void InputDevice_Mouse::Power(void) +{ + lastts = 0; + clear_timeout = 0; + + dtr = 0; + + button = 0; + button_post_mask = 0; + accum_xdelta = 0; + accum_ydelta = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; +} + +void InputDevice_Mouse::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(clear_timeout), + + SFVAR(dtr), + + SFVAR(button), + SFVAR(button_post_mask), + SFVAR(accum_xdelta), + SFVAR(accum_ydelta), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_Mouse", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +void InputDevice_Mouse::UpdateInput(const void *data) +{ + accum_xdelta += (int32)MDFN_de32lsb((uint8*)data + 0); + accum_ydelta += (int32)MDFN_de32lsb((uint8*)data + 4); + + if(accum_xdelta > 30 * 127) accum_xdelta = 30 * 127; + if(accum_xdelta < 30 * -128) accum_xdelta = 30 * -128; + + if(accum_ydelta > 30 * 127) accum_ydelta = 30 * 127; + if(accum_ydelta < 30 * -128) accum_ydelta = 30 * -128; + + button |= *((uint8 *)data + 8); + button_post_mask = *((uint8 *)data + 8); + + //if(button) + // MDFN_DispMessage("Button\n"); + //printf("%d %d\n", accum_xdelta, accum_ydelta); +} + + +void InputDevice_Mouse::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + + dtr = new_dtr; +} + +bool InputDevice_Mouse::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + transmit_buffer[0] = 0x12; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + } + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + if(command == 0x42) + { + int32 xdelta = accum_xdelta; + int32 ydelta = accum_ydelta; + + if(xdelta < -128) xdelta = -128; + if(xdelta > 127) xdelta = 127; + + if(ydelta < -128) ydelta = -128; + if(ydelta > 127) ydelta = 127; + + transmit_buffer[1] = 0xFF; + transmit_buffer[2] = 0xFC ^ (button << 2); + transmit_buffer[3] = xdelta; + transmit_buffer[4] = ydelta; + + accum_xdelta -= xdelta; + accum_ydelta -= ydelta; + + button &= button_post_mask; + + transmit_pos = 0; + transmit_count = 5; + + clear_timeout = 0; + } + else + { + command_phase = -1; + transmit_pos = 0; + transmit_count = 0; + } + break; + + } + } + + if(!bitpos && transmit_count) + dsr_pulse_delay = 0x40; //0x100; + + return(ret); +} + +InputDevice *Device_Mouse_Create(void) +{ + return new InputDevice_Mouse(); +} + + +IDIISG Device_Mouse_IDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS_REL }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL }, + { "right", "Right Button", 1, IDIT_BUTTON, NULL }, + { "left", "Left Button", 0, IDIT_BUTTON, NULL }, +}; + + + +} diff --git a/Mednafen/mednafen/psx/input/mouse.h b/Mednafen/mednafen/psx/input/mouse.h new file mode 100644 index 0000000000..a7e1ef8d69 --- /dev/null +++ b/Mednafen/mednafen/psx/input/mouse.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_PSX_INPUT_MOUSE_H +#define __MDFN_PSX_INPUT_MOUSE_H + +namespace MDFN_IEN_PSX +{ + +InputDevice *Device_Mouse_Create(void); +extern IDIISG Device_Mouse_IDII; + +} +#endif diff --git a/Mednafen/mednafen/psx/input/multitap.cpp b/Mednafen/mednafen/psx/input/multitap.cpp new file mode 100644 index 0000000000..cae62cc12d --- /dev/null +++ b/Mednafen/mednafen/psx/input/multitap.cpp @@ -0,0 +1,509 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../psx.h" +#include "../frontio.h" +#include "multitap.h" + +/* + TODO: PS1 multitap appears to have some internal knowledge of controller IDs, so it won't get "stuck" waiting for data from a controller that'll never + come. We currently sort of "cheat" due to how the dsr_pulse_delay stuff works, but in the future we should try to emulate this multitap functionality. + + Also, full-mode read startup and subport controller ID read timing isn't quite right, so we should fix that too. +*/ + +/* + Notes from tests on real thing(not necessarily emulated the same way here): + + Manual port selection read mode: + Write 0x01-0x04 instead of 0x01 as first byte, selects port(1=A,2=B,3=C,4=D) to access. + + Ports that don't exist(0x00, 0x05-0xFF) or don't have a device plugged in will not respond(no DSR pulse). + + Full read mode: + Bit0 of third byte(from-zero-index=0x02) should be set to 1 to enter full read mode, on subsequent reads. + + Appears to require a controller to be plugged into the port specified by the first byte as per manual port selection read mode, + to write the byte necessary to enter full-read mode; but once the third byte with the bit set has been written, no controller in + that port is required for doing full reads(and the manual port selection is ignored when doing a full read). + + However, if there are no controllers plugged in, the returned data will be short: + % 0: 0xff + % 1: 0x80 + % 2: 0x5a + + Example full-read bytestream(with controllers plugged into port A, port B, and port C, with port D empty): + % 0: 0xff + % 1: 0x80 + % 2: 0x5a + + % 3: 0x73 (Port A controller data start) + % 4: 0x5a + % 5: 0xff + % 6: 0xff + % 7: 0x80 + % 8: 0x8c + % 9: 0x79 + % 10: 0x8f + + % 11: 0x53 (Port B controller data start) + % 12: 0x5a + % 13: 0xff + % 14: 0xff + % 15: 0x80 + % 16: 0x80 + % 17: 0x75 + % 18: 0x8e + + % 19: 0x41 (Port C controller data start) + % 20: 0x5a + % 21: 0xff + % 22: 0xff + % 23: 0xff + % 24: 0xff + % 25: 0xff + % 26: 0xff + + % 27: 0xff (Port D controller data start) + % 28: 0xff + % 29: 0xff + % 30: 0xff + % 31: 0xff + % 32: 0xff + % 33: 0xff + % 34: 0xff + +*/ + +namespace MDFN_IEN_PSX +{ + +InputDevice_Multitap::InputDevice_Multitap() +{ + for(int i = 0; i < 4; i++) + { + pad_devices[i] = NULL; + mc_devices[i] = NULL; + } + Power(); +} + +InputDevice_Multitap::~InputDevice_Multitap() +{ +} + +void InputDevice_Multitap::SetSubDevice(unsigned int sub_index, InputDevice *device, InputDevice *mc_device) +{ + assert(sub_index < 4); + + //printf("%d\n", sub_index); + + pad_devices[sub_index] = device; + mc_devices[sub_index] = mc_device; +} + + +void InputDevice_Multitap::Power(void) +{ + selected_device = -1; + bit_counter = 0; + receive_buffer = 0; + byte_counter = 0; + + mc_mode = false; + full_mode = false; + full_mode_setting = false; + + prev_fm_success = false; + memset(sb, 0, sizeof(sb)); + + fm_dp = 0; + memset(fm_buffer, 0, sizeof(fm_buffer)); + fm_command_error = false; + + for(int i = 0; i < 4; i++) + { + if(pad_devices[i]) + pad_devices[i]->Power(); + + if(mc_devices[i]) + mc_devices[i]->Power(); + } +} + +void InputDevice_Multitap::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(dtr), + + SFVAR(selected_device), + SFVAR(full_mode_setting), + + SFVAR(full_mode), + SFVAR(mc_mode), + + SFVAR(prev_fm_success), + + SFVAR(fm_dp), + SFARRAY(&fm_buffer[0][0], sizeof(fm_buffer) / sizeof(fm_buffer[0][0])), + SFARRAY(&sb[0][0], sizeof(sb) / sizeof(sb[0][0])), + + SFVAR(fm_command_error), + + SFVAR(command), + SFVAR(receive_buffer), + SFVAR(bit_counter), + SFVAR(byte_counter), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_MT", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + + } + + for(unsigned i = 0; i < 4; i++) + { + char tmpbuf[32]; + + trio_snprintf(tmpbuf, sizeof(tmpbuf), "%sP%u", section_name, i); + pad_devices[i]->StateAction(sm, load, data_only, tmpbuf); + } + + for(unsigned i = 0; i < 4; i++) + { + char tmpbuf[32]; + + trio_snprintf(tmpbuf, sizeof(tmpbuf), "%sMC%u", section_name, i); + mc_devices[i]->StateAction(sm, load, data_only, tmpbuf); + } +} + +void InputDevice_Multitap::Update(const pscpu_timestamp_t timestamp) +{ + for(unsigned i = 0; i < 4; i++) + { + pad_devices[i]->Update(timestamp); + mc_devices[i]->Update(timestamp); + } +} + +void InputDevice_Multitap::ResetTS(void) +{ + for(unsigned i = 0; i < 4; i++) + { + pad_devices[i]->ResetTS(); + mc_devices[i]->ResetTS(); + } +} + + +bool InputDevice_Multitap::RequireNoFrameskip(void) +{ + bool ret = false; + + for(unsigned i = 0; i < 4; i++) + ret |= pad_devices[i]->RequireNoFrameskip(); + + return(ret); +} + +pscpu_timestamp_t InputDevice_Multitap::GPULineHook(const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) +{ + pscpu_timestamp_t ret = PSX_EVENT_MAXTS; + + for(unsigned i = 0; i < 4; i++) + { + pscpu_timestamp_t tmp = pad_devices[i]->GPULineHook(line_timestamp, vsync, pixels, format, width, pix_clock_offset, pix_clock, pix_clock_divider); + + if(i == 0) // FIXME; though the problems the design flaw causes(multitap issues with justifier) are documented at least. + ret = tmp; + } + + return(ret); +} + +void InputDevice_Multitap::DrawCrosshairs(uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock) +{ + for(unsigned i = 0; i < 4; i++) + pad_devices[i]->DrawCrosshairs(pixels, format, width, pix_clock); +} + + + +void InputDevice_Multitap::SetDTR(bool new_dtr) +{ + bool old_dtr = dtr; + dtr = new_dtr; + + if(!dtr) + { + if(old_dtr) + { + //printf("Multitap stop.\n"); + } + + bit_counter = 0; + receive_buffer = 0; + selected_device = -1; + mc_mode = false; + full_mode = false; + } + + if(!old_dtr && dtr) + { + full_mode = full_mode_setting; + + if(!prev_fm_success) + { + memset(sb, 0, sizeof(sb)); + for(unsigned i = 0; i < 4; i++) + sb[i][0] = 0x42; + } + + prev_fm_success = false; + + byte_counter = 0; + + //if(full_mode) + // printf("Multitap start: %d\n", full_mode); + } + + for(int i = 0; i < 4; i++) + { + pad_devices[i]->SetDTR(dtr); + mc_devices[i]->SetDTR(dtr); + } +} + +bool InputDevice_Multitap::GetDSR(void) +{ + return(0); +} + +bool InputDevice_Multitap::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + if(!dtr) + return(1); + + bool ret = 1; + int32 tmp_pulse_delay[2][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }; + + //printf("Receive bit: %d\n", TxD); + //printf("TxD %d\n", TxD); + + receive_buffer &= ~ (1 << bit_counter); + receive_buffer |= TxD << bit_counter; + + if(1) + { + if(byte_counter == 0) + { + bool mangled_txd = TxD; + + if(bit_counter < 4) + mangled_txd = (0x01 >> bit_counter) & 1; + + for(unsigned i = 0; i < 4; i++) + { + pad_devices[i]->Clock(mangled_txd, tmp_pulse_delay[0][i]); + mc_devices[i]->Clock(mangled_txd, tmp_pulse_delay[1][i]); + } + } + else + { + if(full_mode) + { + if(byte_counter == 1) + ret = (0x80 >> bit_counter) & 1; + else if(byte_counter == 2) + ret = (0x5A >> bit_counter) & 1; + else if(byte_counter >= 0x03 && byte_counter < 0x03 + 0x08 * 4) + { + if(!fm_command_error && byte_counter < (0x03 + 0x08)) + { + for(unsigned i = 0; i < 4; i++) + { + fm_buffer[i][byte_counter - 0x03] &= (pad_devices[i]->Clock((sb[i][byte_counter - 0x03] >> bit_counter) & 1, tmp_pulse_delay[0][i]) << bit_counter) | (~(1U << bit_counter)); + } + } + ret &= ((&fm_buffer[0][0])[byte_counter - 0x03] >> bit_counter) & 1; + } + } + else // to if(full_mode) + { + if((unsigned)selected_device < 4) + { + ret &= pad_devices[selected_device]->Clock(TxD, tmp_pulse_delay[0][selected_device]); + ret &= mc_devices[selected_device]->Clock(TxD, tmp_pulse_delay[1][selected_device]); + } + } + } // end else to if(byte_counter == 0) + } + + // + // + // + + bit_counter = (bit_counter + 1) & 0x7; + if(bit_counter == 0) + { + //printf("MT Receive: 0x%02x\n", receive_buffer); + if(byte_counter == 0) + { + mc_mode = (bool)(receive_buffer & 0xF0); + if(mc_mode) + full_mode = false; + + //printf("Zoomba: 0x%02x\n", receive_buffer); + //printf("Full mode: %d %d %d\n", full_mode, bit_counter, byte_counter); + + if(full_mode) + { + memset(fm_buffer, 0xFF, sizeof(fm_buffer)); + selected_device = 0; + } + else + { + //printf("Device select: %02x\n", receive_buffer); + selected_device = ((receive_buffer & 0xF) - 1) & 0xFF; + } + } + + if(byte_counter == 1) + { + command = receive_buffer; + + //printf("Multitap sub-command: %02x\n", command); + + if(full_mode) + { + if(command != 0x42) + fm_command_error = true; + else + fm_command_error = false; + } + else + { + fm_command_error = false; + } + } + + if((!mc_mode || full_mode) && byte_counter == 2) + { + //printf("Full mode setting: %02x\n", receive_buffer); + full_mode_setting = receive_buffer & 0x01; + } + + if(full_mode) + { + if(byte_counter >= 3 + 8 * 0 && byte_counter < (3 + 8 * 4)) + { + const unsigned adjbi = byte_counter - 3; + + sb[adjbi >> 3][adjbi & 0x7] = receive_buffer; + } + + if(byte_counter == 33) + prev_fm_success = true; + } + + // Handle DSR stuff + if(full_mode) + { + if(byte_counter == 0) // Next byte: 0x80 + { + dsr_pulse_delay = 1000; + + fm_dp = 0; + for(unsigned i = 0; i < 4; i++) + fm_dp |= (((bool)(tmp_pulse_delay[0][i])) << i); + } + else if(byte_counter == 1) // Next byte: 0x5A + dsr_pulse_delay = 0x40; + else if(byte_counter == 2) // Next byte(typically, controller-dependent): 0x41 + { + if(fm_dp) + dsr_pulse_delay = 0x40; + else + { + byte_counter = 255; + dsr_pulse_delay = 0; + } + } + else if(byte_counter >= 3 && byte_counter < 34) // Next byte when byte_counter==3 (typically, controller-dependent): 0x5A + { + if(byte_counter < 10) + { + int d = 0x40; + + for(unsigned i = 0; i < 4; i++) + { + int32 tpd = tmp_pulse_delay[0][i]; + + if(byte_counter == 3 && (fm_dp & (1U << i)) && tpd == 0) + { + //printf("SNORG: %u %02x\n", i, sb[i][0]); + fm_command_error = true; + } + + if(tpd > d) + d = tpd; + } + + dsr_pulse_delay = d; + } + else + dsr_pulse_delay = 0x20; + + if(byte_counter == 3 && fm_command_error) + { + byte_counter = 255; + dsr_pulse_delay = 0; + } + } + } // end if(full_mode) + else + { + if((unsigned)selected_device < 4) + { + dsr_pulse_delay = std::max(tmp_pulse_delay[0][selected_device], tmp_pulse_delay[1][selected_device]); + } + } + + + // + // + // + + //printf("Byte Counter Increment\n"); + if(byte_counter < 255) + byte_counter++; + } + + + + return(ret); +} + +} diff --git a/Mednafen/mednafen/psx/input/multitap.h b/Mednafen/mednafen/psx/input/multitap.h new file mode 100644 index 0000000000..7db23ef8aa --- /dev/null +++ b/Mednafen/mednafen/psx/input/multitap.h @@ -0,0 +1,61 @@ +#ifndef __MDFN_PSX_INPUT_MULTITAP_H +#define __MDFN_PSX_INPUT_MULTITAP_H + +namespace MDFN_IEN_PSX +{ + +class InputDevice_Multitap final : public InputDevice +{ + public: + + InputDevice_Multitap(); + virtual ~InputDevice_Multitap() override; + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + + virtual void Update(const pscpu_timestamp_t timestamp) override; + virtual void ResetTS(void) override; + + virtual bool RequireNoFrameskip(void) override; + virtual pscpu_timestamp_t GPULineHook(const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) override; + virtual void DrawCrosshairs(uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock) override; + + void SetSubDevice(unsigned int sub_index, InputDevice *device, InputDevice *mc_device); + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + InputDevice *pad_devices[4]; + InputDevice *mc_devices[4]; + + bool dtr; + + int selected_device; + bool full_mode_setting; + + bool full_mode; + bool mc_mode; + bool prev_fm_success; + + uint8 fm_dp; // Device-present. + uint8 fm_buffer[4][8]; + + uint8 sb[4][8]; + + bool fm_command_error; + + uint8 command; + uint8 receive_buffer; + uint8 bit_counter; + uint8 byte_counter; +}; + +} + +#endif diff --git a/Mednafen/mednafen/psx/input/negcon.cpp b/Mednafen/mednafen/psx/input/negcon.cpp new file mode 100644 index 0000000000..2626be0623 --- /dev/null +++ b/Mednafen/mednafen/psx/input/negcon.cpp @@ -0,0 +1,298 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../psx.h" +#include "../frontio.h" +#include "negcon.h" + +namespace MDFN_IEN_PSX +{ + +class InputDevice_neGcon final : public InputDevice +{ + public: + + InputDevice_neGcon(void); + virtual ~InputDevice_neGcon() override; + + virtual void Power(void) override; + virtual void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) override; + virtual void UpdateInput(const void *data) override; + + // + // + // + virtual void SetDTR(bool new_dtr) override; + virtual bool GetDSR(void) override; + virtual bool Clock(bool TxD, int32 &dsr_pulse_delay) override; + + private: + + bool dtr; + + uint8 buttons[2]; + uint8 twist; + uint8 anabuttons[3]; + + int32 command_phase; + uint32 bitpos; + uint8 receive_buffer; + + uint8 command; + + uint8 transmit_buffer[8]; + uint32 transmit_pos; + uint32 transmit_count; +}; + +InputDevice_neGcon::InputDevice_neGcon(void) +{ + Power(); +} + +InputDevice_neGcon::~InputDevice_neGcon() +{ + +} + +void InputDevice_neGcon::Power(void) +{ + dtr = 0; + + buttons[0] = buttons[1] = 0; + twist = 0; + anabuttons[0] = 0; + anabuttons[1] = 0; + anabuttons[2] = 0; + + command_phase = 0; + + bitpos = 0; + + receive_buffer = 0; + + command = 0; + + memset(transmit_buffer, 0, sizeof(transmit_buffer)); + + transmit_pos = 0; + transmit_count = 0; +} + +void InputDevice_neGcon::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix) +{ + SFORMAT StateRegs[] = + { + SFVAR(dtr), + + SFARRAY(buttons, sizeof(buttons)), + SFVAR(twist), + SFARRAY(anabuttons, sizeof(anabuttons)), + + SFVAR(command_phase), + SFVAR(bitpos), + SFVAR(receive_buffer), + + SFVAR(command), + + SFARRAY(transmit_buffer, sizeof(transmit_buffer)), + SFVAR(transmit_pos), + SFVAR(transmit_count), + + SFEND + }; + char section_name[32]; + trio_snprintf(section_name, sizeof(section_name), "%s_neGcon", sname_prefix); + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, section_name, true) && load) + Power(); + else if(load) + { + if((transmit_pos + transmit_count) > sizeof(transmit_buffer)) + { + transmit_pos = 0; + transmit_count = 0; + } + } +} + + +void InputDevice_neGcon::UpdateInput(const void *data) +{ + uint8 *d8 = (uint8 *)data; + + buttons[0] = d8[0]; + buttons[1] = d8[1]; + + twist = ((32768 + MDFN_de16lsb((const uint8 *)data + 2) - (((int32)MDFN_de16lsb((const uint8 *)data + 4) * 32768 + 16383) / 32767)) * 255 + 32767) / 65535; + + anabuttons[0] = (MDFN_de16lsb((const uint8 *)data + 6) * 255 + 16383) / 32767; + anabuttons[1] = (MDFN_de16lsb((const uint8 *)data + 8) * 255 + 16383) / 32767; + anabuttons[2] = (MDFN_de16lsb((const uint8 *)data + 10) * 255 + 16383) / 32767; + + //printf("%02x %02x %02x %02x\n", twist, anabuttons[0], anabuttons[1], anabuttons[2]); +} + + +void InputDevice_neGcon::SetDTR(bool new_dtr) +{ + if(!dtr && new_dtr) + { + command_phase = 0; + bitpos = 0; + transmit_pos = 0; + transmit_count = 0; + } + else if(dtr && !new_dtr) + { + //if(bitpos || transmit_count) + // printf("[PAD] Abort communication!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + } + + dtr = new_dtr; +} + +bool InputDevice_neGcon::GetDSR(void) +{ + if(!dtr) + return(0); + + if(!bitpos && transmit_count) + return(1); + + return(0); +} + +bool InputDevice_neGcon::Clock(bool TxD, int32 &dsr_pulse_delay) +{ + bool ret = 1; + + dsr_pulse_delay = 0; + + if(!dtr) + return(1); + + if(transmit_count) + ret = (transmit_buffer[transmit_pos] >> bitpos) & 1; + + receive_buffer &= ~(1 << bitpos); + receive_buffer |= TxD << bitpos; + bitpos = (bitpos + 1) & 0x7; + + if(!bitpos) + { + //printf("[PAD] Receive: %02x -- command_phase=%d\n", receive_buffer, command_phase); + + if(transmit_count) + { + transmit_pos++; + transmit_count--; + } + + + switch(command_phase) + { + case 0: + if(receive_buffer != 0x01) + command_phase = -1; + else + { + transmit_buffer[0] = 0x23; + transmit_pos = 0; + transmit_count = 1; + command_phase++; + dsr_pulse_delay = 256; + } + break; + + case 1: + command = receive_buffer; + command_phase++; + + transmit_buffer[0] = 0x5A; + + //if(command != 0x42) + // fprintf(stderr, "Gamepad unhandled command: 0x%02x\n", command); + + if(command == 0x42) + { + transmit_buffer[1] = 0xFF ^ buttons[0]; + transmit_buffer[2] = 0xFF ^ buttons[1]; + transmit_buffer[3] = twist; // Twist, 0x00 through 0xFF, 0x80 center. + transmit_buffer[4] = anabuttons[0]; // Analog button I, 0x00 through 0xFF, 0x00 = no pressing, 0xFF = max. + transmit_buffer[5] = anabuttons[1]; // Analog button II, "" + transmit_buffer[6] = anabuttons[2]; // Left shoulder analog button, "" + transmit_pos = 0; + transmit_count = 7; + dsr_pulse_delay = 256; + } + else + { + command_phase = -1; + transmit_buffer[1] = 0; + transmit_buffer[2] = 0; + transmit_pos = 0; + transmit_count = 0; + } + break; + + case 2: + if(transmit_count > 0) + dsr_pulse_delay = 128; + break; + } + } + + return(ret); +} + +InputDevice *Device_neGcon_Create(void) +{ + return new InputDevice_neGcon(); +} + + +IDIISG Device_neGcon_IDII = +{ + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { "start", "START", 4, IDIT_BUTTON, NULL }, + { "up", "D-Pad UP ↑", 0, IDIT_BUTTON, "down" }, + { "right", "D-Pad RIGHT →", 3, IDIT_BUTTON, "left" }, + { "down", "D-Pad DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "D-Pad LEFT ←", 2, IDIT_BUTTON, "right" }, + + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { "r", "Right Shoulder", 12, IDIT_BUTTON }, + + { "b", "B", 9, IDIT_BUTTON, NULL }, + { "a", "A", 10, IDIT_BUTTON, NULL }, + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + { NULL, "empty", -1, IDIT_BUTTON, NULL }, + + { "twist_cwise", "Twist ↓|↑ (Analog, Turn Right)", 6, IDIT_BUTTON_ANALOG }, + { "twist_ccwise", "Twist ↑|↓ (Analog, Turn Left)", 5, IDIT_BUTTON_ANALOG }, + { "i", "I (Analog)", 8, IDIT_BUTTON_ANALOG }, + { "ii", "II (Analog)", 7, IDIT_BUTTON_ANALOG }, + + { "l", "Left Shoulder (Analog)", 11, IDIT_BUTTON_ANALOG }, +}; + +} diff --git a/Mednafen/mednafen/psx/input/negcon.h b/Mednafen/mednafen/psx/input/negcon.h new file mode 100644 index 0000000000..2ba464dfb4 --- /dev/null +++ b/Mednafen/mednafen/psx/input/negcon.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_PSX_INPUT_NEGCON_H +#define __MDFN_PSX_INPUT_NEGCON_H + +namespace MDFN_IEN_PSX +{ + InputDevice *Device_neGcon_Create(void); + extern IDIISG Device_neGcon_IDII; +} +#endif diff --git a/Mednafen/mednafen/psx/irq.cpp b/Mednafen/mednafen/psx/irq.cpp new file mode 100644 index 0000000000..c6d7872efc --- /dev/null +++ b/Mednafen/mednafen/psx/irq.cpp @@ -0,0 +1,170 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" + +namespace MDFN_IEN_PSX +{ + +static uint16 Asserted; +static uint16 Mask; +static uint16 Status; + +static INLINE void Recalc(void) +{ + CPU->AssertIRQ(0, (bool)(Status & Mask)); +} + +void IRQ_Assert(int which, bool status) +{ + uint32 old_Asserted = Asserted; + //PSX_WARNING("[IRQ] Assert: %d %d", which, status); + + //if(which == IRQ_SPU && status && (Asserted & (1 << which))) + // MDFN_DispMessage("SPU IRQ glitch??"); + + Asserted &= ~(1 << which); + + if(status) + { + Asserted |= 1 << which; + //Status |= 1 << which; + Status |= (old_Asserted ^ Asserted) & Asserted; + } + + Recalc(); +} + + +void IRQ_Write(uint32 A, uint32 V) +{ + // FIXME if we ever have "accurate" bus emulation + V <<= (A & 3) * 8; + + //printf("[IRQ] Write: 0x%08x 0x%08x --- PAD TEMP\n", A, V); + + if(A & 4) + Mask = V; + else + { + Status &= V; + //Status |= Asserted; + } + + Recalc(); +} + + +uint32 IRQ_Read(uint32 A) +{ + uint32 ret = 0; + + if(A & 4) + ret = Mask; + else + ret = Status; + + // FIXME: Might want to move this out to psx.cpp eventually. + ret |= 0x1F800000; + ret >>= (A & 3) * 8; + + + //printf("[IRQ] Read: 0x%08x 0x%08x --- PAD TEMP\n", A, ret); + + return(ret); +} + +void IRQ_Power(void) +{ + Asserted = 0; + Status = 0; + Mask = 0; + + Recalc(); +} + +void IRQ_Reset(void) +{ + Asserted = 0; + Status = 0; + Mask = 0; + + Recalc(); +} + +void IRQ_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Asserted), + SFVAR(Mask), + SFVAR(Status), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "IRQ"); + + if(load) + { + Recalc(); + } +} + +uint32 IRQ_GetRegister(unsigned int which, char *special, const uint32 special_len) +{ + uint32 ret = 0; + + switch(which) + { + case IRQ_GSREG_ASSERTED: + ret = Asserted; + break; + + case IRQ_GSREG_STATUS: + ret = Status; + break; + + case IRQ_GSREG_MASK: + ret = Mask; + break; + } + return(ret); +} + +void IRQ_SetRegister(unsigned int which, uint32 value) +{ + switch(which) + { + case IRQ_GSREG_ASSERTED: + Asserted = value; + Recalc(); + break; + + case IRQ_GSREG_STATUS: + Status = value; + Recalc(); + break; + + case IRQ_GSREG_MASK: + Mask = value; + Recalc(); + break; + } +} + + +} diff --git a/Mednafen/mednafen/psx/irq.h b/Mednafen/mednafen/psx/irq.h new file mode 100644 index 0000000000..3b54850849 --- /dev/null +++ b/Mednafen/mednafen/psx/irq.h @@ -0,0 +1,43 @@ +#ifndef __MDFN_PSX_IRQ_H +#define __MDFN_PSX_IRQ_H + +namespace MDFN_IEN_PSX +{ + + +enum +{ + IRQ_VBLANK = 0, + IRQ_GPU = 1, + IRQ_CD = 2, + IRQ_DMA = 3, // Probably + IRQ_TIMER_0 = 4, + IRQ_TIMER_1 = 5, + IRQ_TIMER_2 = 6, + IRQ_SIO = 7, + IRQ_SPU = 9, + IRQ_PIO = 10, // Probably +}; + +void IRQ_Power(void) MDFN_COLD; +void IRQ_Assert(int which, bool asserted); + +void IRQ_Write(uint32 A, uint32 V); +uint32 IRQ_Read(uint32 A); + + +enum +{ + IRQ_GSREG_ASSERTED = 0, + IRQ_GSREG_STATUS = 1, + IRQ_GSREG_MASK = 2 +}; + +uint32 IRQ_GetRegister(unsigned int which, char *special, const uint32 special_len); +void IRQ_SetRegister(unsigned int which, uint32 value); + +void IRQ_StateAction(StateMem *sm, const unsigned load, const bool data_only); +}; + + +#endif diff --git a/Mednafen/mednafen/psx/masmem.h b/Mednafen/mednafen/psx/masmem.h new file mode 100644 index 0000000000..13e238b93b --- /dev/null +++ b/Mednafen/mednafen/psx/masmem.h @@ -0,0 +1,102 @@ +#ifndef __MDFN_PSX_MASMEM_H +#define __MDFN_PSX_MASMEM_H + +#include + +// address must not be >= size specified by template parameter, and address must be a multiple of the byte-size of the +// unit(1,2,4) being read(except for Read/WriteU24, which only needs to be byte-aligned). +// + +template //, unsigned pre_padding_count, unsigned post_padding_count> +struct MultiAccessSizeMem +{ + //uint8 pre_padding[pre_padding_count ? pre_padding_count : 1]; + + union + { + uint8 data8[size]; + uint64 alignment_dummy[1]; + }; + + //uint8 post_padding[post_padding_count ? post_padding_count : 1]; + + template + INLINE T Read(uint32 address) + { + return MDFN_deXsb(data8 + address); + } + + template + INLINE void Write(uint32 address, T value) + { + MDFN_enXsb(data8 + address, value); + } + + INLINE uint8 ReadU8(uint32 address) + { + return Read(address); + } + + INLINE uint16 ReadU16(uint32 address) + { + return Read(address); + } + + INLINE uint32 ReadU32(uint32 address) + { + return Read(address); + } + + INLINE uint32 ReadU24(uint32 address) + { + uint32 ret; + + if(!big_endian) + { + ret = ReadU8(address) << 0; + ret |= ReadU8(address + 1) << 8; + ret |= ReadU8(address + 2) << 16; + } + else + { + ret = ReadU8(address) << 16; + ret |= ReadU8(address + 1) << 8; + ret |= ReadU8(address + 2) << 0; + } + return(ret); + } + + + INLINE void WriteU8(uint32 address, uint8 value) + { + Write(address, value); + } + + INLINE void WriteU16(uint32 address, uint16 value) + { + Write(address, value); + } + + INLINE void WriteU32(uint32 address, uint32 value) + { + Write(address, value); + } + + INLINE void WriteU24(uint32 address, uint32 value) + { + if(!big_endian) + { + WriteU8(address + 0, value >> 0); + WriteU8(address + 1, value >> 8); + WriteU8(address + 2, value >> 16); + } + else + { + WriteU8(address + 0, value >> 16); + WriteU8(address + 1, value >> 8); + WriteU8(address + 2, value >> 0); + } + } +}; + +#endif diff --git a/Mednafen/mednafen/psx/mdec.cpp b/Mednafen/mednafen/psx/mdec.cpp new file mode 100644 index 0000000000..c957dadf59 --- /dev/null +++ b/Mednafen/mednafen/psx/mdec.cpp @@ -0,0 +1,819 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + MDEC_READ_FIFO(tfr) vs InCounter vs MDEC_DMACanRead() is a bit fragile right now. Actually, the entire horrible state machine monstrosity is fragile. + + TODO: OutFIFOReady, so <16bpp works right. + + TODO CODE: + + bool InFIFOReady; + + if(InFIFO.CanWrite()) + { + InFIFO.Write(V); + + if(InCommand) + { + if(InCounter != 0xFFFF) + { + InCounter--; + + // This condition when InFIFO.CanWrite() != 0 is a bit buggy on real hardware, decoding loop *seems* to be reading too + // much and pulling garbage from the FIFO. + if(InCounter == 0xFFFF) + InFIFOReady = true; + } + + if(InFIFO.CanWrite() == 0) + InFIFOReady = true; + } + } +*/ + +// Good test-case games: +// Dragon Knight 4(bad disc?) +// Final Fantasy 7 intro movie. +// GameShark Version 4.0 intro movie; (clever) abuse of DMA channel 0. +// SimCity 2000 startup. + + +#include "psx.h" +#include "mdec.h" +#include "FastFIFO.h" + +#include + +#if defined(__SSE2__) +#include +#include +#endif + +#if defined(ARCH_POWERPC_ALTIVEC) && defined(HAVE_ALTIVEC_H) + #include +#endif + +namespace MDFN_IEN_PSX +{ + +static int32 ClockCounter; +static unsigned MDRPhase; +static FastFIFO InFIFO; +static FastFIFO OutFIFO; + +static int8 block_y[8][8]; +static int8 block_cb[8][8]; // [y >> 1][x >> 1] +static int8 block_cr[8][8]; // [y >> 1][x >> 1] + +static uint32 Control; +static uint32 Command; +static bool InCommand; + +static uint8 QMatrix[2][64]; +static uint32 QMIndex; + +alignas(16) static int16 IDCTMatrix[64]; +static uint32 IDCTMIndex; + +static uint8 QScale; + +alignas(16) static int16 Coeff[64]; +static uint32 CoeffIndex; +static uint32 DecodeWB; + +static union +{ + uint32 pix32[48]; + uint16 pix16[96]; + uint8 pix8[192]; +} PixelBuffer; +static uint32 PixelBufferReadOffset; +static uint32 PixelBufferCount32; + +static uint16 InCounter; + +static uint8 RAMOffsetY; +static uint8 RAMOffsetCounter; +static uint8 RAMOffsetWWS; + +static const uint8 ZigZag[64] = +{ + 0x00, 0x08, 0x01, 0x02, 0x09, 0x10, 0x18, 0x11, + 0x0a, 0x03, 0x04, 0x0b, 0x12, 0x19, 0x20, 0x28, + 0x21, 0x1a, 0x13, 0x0c, 0x05, 0x06, 0x0d, 0x14, + 0x1b, 0x22, 0x29, 0x30, 0x38, 0x31, 0x2a, 0x23, + 0x1c, 0x15, 0x0e, 0x07, 0x0f, 0x16, 0x1d, 0x24, + 0x2b, 0x32, 0x39, 0x3a, 0x33, 0x2c, 0x25, 0x1e, + 0x17, 0x1f, 0x26, 0x2d, 0x34, 0x3b, 0x3c, 0x35, + 0x2e, 0x27, 0x2f, 0x36, 0x3d, 0x3e, 0x37, 0x3f, +}; + +void MDEC_Power(void) +{ + ClockCounter = 0; + MDRPhase = 0; + + InFIFO.Flush(); + OutFIFO.Flush(); + + memset(block_y, 0, sizeof(block_y)); + memset(block_cb, 0, sizeof(block_cb)); + memset(block_cr, 0, sizeof(block_cr)); + + Control = 0; + Command = 0; + InCommand = false; + + memset(QMatrix, 0, sizeof(QMatrix)); + QMIndex = 0; + + memset(IDCTMatrix, 0, sizeof(IDCTMatrix)); + IDCTMIndex = 0; + + QScale = 0; + + memset(Coeff, 0, sizeof(Coeff)); + CoeffIndex = 0; + DecodeWB = 0; + + memset(PixelBuffer.pix32, 0, sizeof(PixelBuffer.pix32)); + PixelBufferReadOffset = 0; + PixelBufferCount32 = 0; + + InCounter = 0; + + RAMOffsetY = 0; + RAMOffsetCounter = 0; + RAMOffsetWWS = 0; +} + +void MDEC_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(ClockCounter), + SFVAR(MDRPhase), + +#define SFFIFO32(fifoobj) SFARRAY32(&fifoobj.data[0], sizeof(fifoobj.data) / sizeof(fifoobj.data[0])), \ + SFVAR(fifoobj.read_pos), \ + SFVAR(fifoobj.write_pos), \ + SFVAR(fifoobj.in_count) + + SFFIFO32(InFIFO), + SFFIFO32(OutFIFO), +#undef SFFIFO + + SFARRAY(&block_y[0][0], sizeof(block_y) / sizeof(block_y[0][0])), + SFARRAY(&block_cb[0][0], sizeof(block_cb) / sizeof(block_cb[0][0])), + SFARRAY(&block_cr[0][0], sizeof(block_cr) / sizeof(block_cr[0][0])), + + SFVAR(Control), + SFVAR(Command), + SFVAR(InCommand), + + SFARRAY(&QMatrix[0][0], sizeof(QMatrix) / sizeof(QMatrix[0][0])), + SFVAR(QMIndex), + + SFARRAY16(&IDCTMatrix[0], sizeof(IDCTMatrix) / sizeof(IDCTMatrix[0])), + SFVAR(IDCTMIndex), + + SFVAR(QScale), + + SFARRAY16(&Coeff[0], sizeof(Coeff) / sizeof(Coeff[0])), + SFVAR(CoeffIndex), + SFVAR(DecodeWB), + + SFARRAY32(&PixelBuffer.pix32[0], sizeof(PixelBuffer.pix32) / sizeof(PixelBuffer.pix32[0])), + SFVAR(PixelBufferReadOffset), + SFVAR(PixelBufferCount32), + + SFVAR(InCounter), + + SFVAR(RAMOffsetY), + SFVAR(RAMOffsetCounter), + SFVAR(RAMOffsetWWS), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MDEC"); + + if(load) + { + InFIFO.SaveStatePostLoad(); + OutFIFO.SaveStatePostLoad(); + } +} + +static INLINE int8 Mask9ClampS8(int32 v) +{ + v = sign_x_to_s32(9, v); + + if(v < -128) + v = -128; + + if(v > 127) + v = 127; + + return v; +} + +template +static void IDCT_1D_Multi(int16 *in_coeff, T *out_coeff) +{ +#if defined(__SSE2__) +{ + for(unsigned col = 0; col < 8; col++) + { + __m128i c = _mm_load_si128((__m128i *)&in_coeff[(col * 8)]); + + for(unsigned x = 0; x < 8; x++) + { + __m128i sum; + __m128i m; + alignas(16) int32 tmp[4]; + + m = _mm_load_si128((__m128i *)&IDCTMatrix[(x * 8)]); + sum = _mm_madd_epi16(m, c); + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, (3 << 0) | (2 << 2) | (1 << 4) | (0 << 6))); + sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, (1 << 0) | (0 << 2))); + + //_mm_store_ss((float *)&tmp[0], (__m128)sum); + _mm_store_si128((__m128i*)tmp, sum); + + if(sizeof(T) == 1) + out_coeff[(col * 8) + x] = Mask9ClampS8((tmp[0] + 0x4000) >> 15); + else + out_coeff[(x * 8) + col] = (tmp[0] + 0x4000) >> 15; + } + } +} +#else + for(unsigned col = 0; col < 8; col++) + { + for(unsigned x = 0; x < 8; x++) + { + int32 sum = 0; + + for(unsigned u = 0; u < 8; u++) + { + sum += (in_coeff[(col * 8) + u] * IDCTMatrix[(x * 8) + u]); + } + + if(sizeof(T) == 1) + out_coeff[(col * 8) + x] = Mask9ClampS8((sum + 0x4000) >> 15); + else + out_coeff[(x * 8) + col] = (sum + 0x4000) >> 15; + } + } +#endif +} + +static void IDCT(int16 *in_coeff, int8 *out_coeff) NO_INLINE; +static void IDCT(int16 *in_coeff, int8 *out_coeff) +{ + alignas(16) int16 tmpbuf[64]; + + IDCT_1D_Multi(in_coeff, tmpbuf); + IDCT_1D_Multi(tmpbuf, out_coeff); +} + +static INLINE void YCbCr_to_RGB(const int8 y, const int8 cb, const int8 cr, int &r, int &g, int &b) +{ + // + // The formula for green is still a bit off(precision/rounding issues when both cb and cr are non-zero). + // + + r = Mask9ClampS8(y + (((359 * cr) + 0x80) >> 8)); + //g = Mask9ClampS8(y + (((-88 * cb) + (-183 * cr) + 0x80) >> 8)); + g = Mask9ClampS8(y + ((((-88 * cb) &~ 0x1F) + ((-183 * cr) &~ 0x07) + 0x80) >> 8)); + b = Mask9ClampS8(y + (((454 * cb) + 0x80) >> 8)); + + r ^= 0x80; + g ^= 0x80; + b ^= 0x80; +} + +static INLINE uint16 RGB_to_RGB555(uint8 r, uint8 g, uint8 b) +{ + r = (r + 4) >> 3; + g = (g + 4) >> 3; + b = (b + 4) >> 3; + + if(r > 0x1F) + r = 0x1F; + + if(g > 0x1F) + g = 0x1F; + + if(b > 0x1F) + b = 0x1F; + + return((r << 0) | (g << 5) | (b << 10)); +} + +static void EncodeImage(const unsigned ybn) +{ + //printf("ENCODE, %d\n", (Command & 0x08000000) ? 256 : 384); + + PixelBufferCount32 = 0; + + switch((Command >> 27) & 0x3) + { + case 0: // 4bpp + { + const uint8 us_xor = (Command & (1U << 26)) ? 0x00 : 0x88; + uint8* pix_out = PixelBuffer.pix8; + + for(int y = 0; y < 8; y++) + { + for(int x = 0; x < 8; x += 2) + { + uint8 p0 = std::min(127, block_y[y][x + 0] + 8); + uint8 p1 = std::min(127, block_y[y][x + 1] + 8); + + *pix_out = ((p0 >> 4) | (p1 & 0xF0)) ^ us_xor; + pix_out++; + } + } + PixelBufferCount32 = 8; + } + break; + + + case 1: // 8bpp + { + const uint8 us_xor = (Command & (1U << 26)) ? 0x00 : 0x80; + uint8* pix_out = PixelBuffer.pix8; + + for(int y = 0; y < 8; y++) + { + for(int x = 0; x < 8; x++) + { + *pix_out = (uint8)block_y[y][x] ^ us_xor; + pix_out++; + } + } + PixelBufferCount32 = 16; + } + break; + + case 2: // 24bpp + { + const uint8 rgb_xor = (Command & (1U << 26)) ? 0x80 : 0x00; + uint8* pix_out = PixelBuffer.pix8; + + for(int y = 0; y < 8; y++) + { + const int8* by = &block_y[y][0]; + const int8* cb = &block_cb[(y >> 1) | ((ybn & 2) << 1)][(ybn & 1) << 2]; + const int8* cr = &block_cr[(y >> 1) | ((ybn & 2) << 1)][(ybn & 1) << 2]; + + for(int x = 0; x < 8; x++) + { + int r, g, b; + + YCbCr_to_RGB(by[x], cb[x >> 1], cr[x >> 1], r, g, b); + + pix_out[0] = r ^ rgb_xor; + pix_out[1] = g ^ rgb_xor; + pix_out[2] = b ^ rgb_xor; + pix_out += 3; + } + } + PixelBufferCount32 = 48; + } + break; + + case 3: // 16bpp + { + uint16 pixel_xor = ((Command & 0x02000000) ? 0x8000 : 0x0000) | ((Command & (1U << 26)) ? 0x4210 : 0x0000); + uint16* pix_out = PixelBuffer.pix16; + + for(int y = 0; y < 8; y++) + { + const int8* by = &block_y[y][0]; + const int8* cb = &block_cb[(y >> 1) | ((ybn & 2) << 1)][(ybn & 1) << 2]; + const int8* cr = &block_cr[(y >> 1) | ((ybn & 2) << 1)][(ybn & 1) << 2]; + + for(int x = 0; x < 8; x++) + { + int r, g, b; + + YCbCr_to_RGB(by[x], cb[x >> 1], cr[x >> 1], r, g, b); + + MDFN_en16lsb(pix_out, pixel_xor ^ RGB_to_RGB555(r, g, b)); + pix_out++; + } + } + PixelBufferCount32 = 32; + } + break; + + } +} + +static INLINE void WriteImageData(uint16 V, int32* eat_cycles) +{ + const uint32 qmw = (bool)(DecodeWB < 2); + + //printf("MDEC DMA SubWrite: %04x, %d\n", V, CoeffIndex); + + if(!CoeffIndex) + { + if(V == 0xFE00) + { + //printf("FE00 @ %u\n", DecodeWB); + return; + } + + QScale = V >> 10; + + { + int q = QMatrix[qmw][0]; // No QScale here! + int ci = sign_10_to_s16(V & 0x3FF); + int tmp; + + if(q != 0) + tmp = (int32)((uint32)(ci * q) << 4) + (ci ? ((ci < 0) ? 8 : -8) : 0); + else + tmp = (uint32)(ci * 2) << 4; + + // Not sure if it should be 0x3FFF or 0x3FF0 or maybe 0x3FF8? + Coeff[ZigZag[0]] = std::min(0x3FFF, std::max(-0x4000, tmp)); + CoeffIndex++; + } + } + else + { + if(V == 0xFE00) + { + while(CoeffIndex < 64) + Coeff[ZigZag[CoeffIndex++]] = 0; + } + else + { + uint32 rlcount = V >> 10; + + for(uint32 i = 0; i < rlcount && CoeffIndex < 64; i++) + { + Coeff[ZigZag[CoeffIndex]] = 0; + CoeffIndex++; + } + + if(CoeffIndex < 64) + { + int q = QScale * QMatrix[qmw][CoeffIndex]; + int ci = sign_10_to_s16(V & 0x3FF); + int tmp; + + if(q != 0) + tmp = (int32)((uint32)((ci * q) >> 3) << 4) + (ci ? ((ci < 0) ? 8 : -8) : 0); + else + tmp = (uint32)(ci * 2) << 4; + + // Not sure if it should be 0x3FFF or 0x3FF0 or maybe 0x3FF8? + Coeff[ZigZag[CoeffIndex]] = std::min(0x3FFF, std::max(-0x4000, tmp)); + CoeffIndex++; + } + } + } + + if(CoeffIndex == 64) + { + CoeffIndex = 0; + + //printf("Block %d finished\n", DecodeWB); + + switch(DecodeWB) + { + case 0: IDCT(Coeff, &block_cr[0][0]); break; + case 1: IDCT(Coeff, &block_cb[0][0]); break; + case 2: IDCT(Coeff, &block_y[0][0]); break; + case 3: IDCT(Coeff, &block_y[0][0]); break; + case 4: IDCT(Coeff, &block_y[0][0]); break; + case 5: IDCT(Coeff, &block_y[0][0]); break; + } + + // + // Timing in the actual PS1 MDEC is complex due to (apparent) pipelining, but the average when decoding a large number of blocks is + // about 512. We'll go with a lower value here to be conservative due to timing granularity and other timing deficiencies in Mednafen. BUT, don't + // go lower than 460, or Parasite Eve 2's 3D models will stutter like crazy during FMV-background sequences. + // + *eat_cycles += 474; + + if(DecodeWB >= 2) + { + EncodeImage((DecodeWB + 4) % 6); + } + + DecodeWB++; + if(DecodeWB == (((Command >> 27) & 2) ? 6 : 3)) + { + DecodeWB = ((Command >> 27) & 2) ? 0 : 2; + } + } +} + +#if 1 + +// +// +// +#define MDEC_WAIT_COND(n) { case __COUNTER__: if(!(n)) { MDRPhase = __COUNTER__ - MDRPhaseBias - 1; return; } } + +#define MDEC_WRITE_FIFO(n) { MDEC_WAIT_COND(OutFIFO.CanWrite()); OutFIFO.Write(n); } +#define MDEC_READ_FIFO(n) { MDEC_WAIT_COND(InFIFO.CanRead()); n = InFIFO.Read(); } +#define MDEC_EAT_CLOCKS(n) { ClockCounter -= (n); MDEC_WAIT_COND(ClockCounter > 0); } + +void MDEC_Run(int32 clocks) +{ + static const unsigned MDRPhaseBias = __COUNTER__ + 1; + + //MDFN_DispMessage("%u", OutFIFO.CanRead()); + + ClockCounter += clocks; + + if(ClockCounter > 128) + { + //if(MDRPhase != 0) + // printf("SNORT: %d\n", ClockCounter); + ClockCounter = 128; + } + + switch(MDRPhase + MDRPhaseBias) + { + for(;;) + { + InCommand = false; + MDEC_READ_FIFO(Command); // This must be the first MDEC_* macro used! + InCommand = true; + MDEC_EAT_CLOCKS(1); + + //printf("****************** Command: %08x, %02x\n", Command, Command >> 29); + + // + // + // + if(((Command >> 29) & 0x7) == 1) + { + InCounter = Command & 0xFFFF; + OutFIFO.Flush(); + //OutBuffer.Flush(); + + PixelBufferCount32 = 0; + CoeffIndex = 0; + + if((Command >> 27) & 2) + DecodeWB = 0; + else + DecodeWB = 2; + + switch((Command >> 27) & 0x3) + { + case 0: + case 1: RAMOffsetWWS = 0; break; + case 2: RAMOffsetWWS = 6; break; + case 3: RAMOffsetWWS = 4; break; + } + RAMOffsetY = 0; + RAMOffsetCounter = RAMOffsetWWS; + + InCounter--; + do + { + uint32 tfr; + int32 need_eat; // = 0; + + MDEC_READ_FIFO(tfr); + InCounter--; + +// printf("KA: %04x %08x\n", InCounter, tfr); + + need_eat = 0; + PixelBufferCount32 = 0; + WriteImageData(tfr, &need_eat); + WriteImageData(tfr >> 16, &need_eat); + + MDEC_EAT_CLOCKS(need_eat); + + PixelBufferReadOffset = 0; + while(PixelBufferReadOffset != PixelBufferCount32) + { + MDEC_WRITE_FIFO((MDFN_de32lsb(&PixelBuffer.pix32[PixelBufferReadOffset++]))); + } + } while(InCounter != 0xFFFF); + } + // + // + // + else if(((Command >> 29) & 0x7) == 2) + { + QMIndex = 0; + InCounter = 0x10 + ((Command & 0x1) ? 0x10 : 0x00); + + InCounter--; + do + { + uint32 tfr; + + MDEC_READ_FIFO(tfr); + InCounter--; + + //printf("KA: %04x %08x\n", InCounter, tfr); + + for(int i = 0; i < 4; i++) + { + QMatrix[QMIndex >> 6][QMIndex & 0x3F] = (uint8)tfr; + QMIndex = (QMIndex + 1) & 0x7F; + tfr >>= 8; + } + } while(InCounter != 0xFFFF); + } + // + // + // + else if(((Command >> 29) & 0x7) == 3) + { + IDCTMIndex = 0; + InCounter = 0x20; + + InCounter--; + do + { + uint32 tfr; + + MDEC_READ_FIFO(tfr); + InCounter--; + + for(unsigned i = 0; i < 2; i++) + { + IDCTMatrix[((IDCTMIndex & 0x7) << 3) | ((IDCTMIndex >> 3) & 0x7)] = (int16)(tfr & 0xFFFF) >> 3; + IDCTMIndex = (IDCTMIndex + 1) & 0x3F; + + tfr >>= 16; + } + } while(InCounter != 0xFFFF); + } + else + { + InCounter = Command & 0xFFFF; + } + } // end for(;;) + } +} +#endif + +void MDEC_DMAWrite(uint32 V) +{ + if(InFIFO.CanWrite()) + { + InFIFO.Write(V); + MDEC_Run(0); + } + else + { + PSX_DBG(PSX_DBG_WARNING, "[MDEC] DMA write when input FIFO is full!!\n"); + } +} + +uint32 MDEC_DMARead(uint32* offs) +{ + uint32 V = 0; + + *offs = 0; + + if(MDFN_LIKELY(OutFIFO.CanRead())) + { + V = OutFIFO.Read(); + + *offs = (RAMOffsetY & 0x7) * RAMOffsetWWS; + + if(RAMOffsetY & 0x08) + { + *offs = (*offs - RAMOffsetWWS*7); + } + + RAMOffsetCounter--; + if(!RAMOffsetCounter) + { + RAMOffsetCounter = RAMOffsetWWS; + RAMOffsetY++; + } + + MDEC_Run(0); + } + else + { + PSX_DBG(PSX_DBG_WARNING, "[MDEC] DMA read when output FIFO is empty!\n"); + } + + return(V); +} + +bool MDEC_DMACanWrite(void) +{ + return((InFIFO.CanWrite() >= 0x20) && (Control & (1U << 30)) && InCommand && InCounter != 0xFFFF); +} + +bool MDEC_DMACanRead(void) +{ + return((OutFIFO.CanRead() >= 0x20) && (Control & (1U << 29))); +} + +void MDEC_Write(const pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + //PSX_WARNING("[MDEC] Write: 0x%08x 0x%08x, %d --- %u %u", A, V, timestamp, InFIFO.CanRead(), OutFIFO.CanRead()); + if(A & 4) + { + if(V & 0x80000000) // Reset? + { + MDRPhase = 0; + InCounter = 0; + Command = 0; + InCommand = false; + + PixelBufferCount32 = 0; + ClockCounter = 0; + QMIndex = 0; + IDCTMIndex = 0; + + QScale = 0; + + memset(Coeff, 0, sizeof(Coeff)); + CoeffIndex = 0; + DecodeWB = 0; + + InFIFO.Flush(); + OutFIFO.Flush(); + } + Control = V & 0x7FFFFFFF; + } + else + { + if(InFIFO.CanWrite()) + { + InFIFO.Write(V); + + if(!InCommand) + { + if(ClockCounter < 1) + ClockCounter = 1; + } + MDEC_Run(0); + } + else + { + PSX_DBG(PSX_DBG_WARNING, "MDEC manual write FIFO overflow?!\n"); + } + } +} + +uint32 MDEC_Read(const pscpu_timestamp_t timestamp, uint32 A) +{ + uint32 ret = 0; + + if(A & 4) + { + ret = 0; + + ret |= (OutFIFO.CanRead() == 0) << 31; + ret |= (InFIFO.CanWrite() == 0) << 30; + ret |= InCommand << 29; + + ret |= MDEC_DMACanWrite() << 28; + ret |= MDEC_DMACanRead() << 27; + + ret |= ((Command >> 25) & 0xF) << 23; + + // Needs refactoring elsewhere to work right: ret |= ((DecodeWB + 4) % 6) << 16; + + ret |= InCounter & 0xFFFF; + } + else + { + if(OutFIFO.CanRead()) + ret = OutFIFO.Read(); + } + + //PSX_WARNING("[MDEC] Read: 0x%08x 0x%08x -- %d %d", A, ret, InputBuffer.CanRead(), InCounter); + + return(ret); +} + +} diff --git a/Mednafen/mednafen/psx/mdec.h b/Mednafen/mednafen/psx/mdec.h new file mode 100644 index 0000000000..21f6602163 --- /dev/null +++ b/Mednafen/mednafen/psx/mdec.h @@ -0,0 +1,24 @@ +#ifndef __MDFN_PSX_MDEC_H +#define __MDFN_PSX_MDEC_H + +namespace MDFN_IEN_PSX +{ + +void MDEC_DMAWrite(uint32 V); + +uint32 MDEC_DMARead(uint32* offs); + +void MDEC_Write(const pscpu_timestamp_t timestamp, uint32 A, uint32 V); +uint32 MDEC_Read(const pscpu_timestamp_t timestamp, uint32 A); + + +void MDEC_Power(void) MDFN_COLD; + +bool MDEC_DMACanWrite(void); +bool MDEC_DMACanRead(void); +void MDEC_Run(int32 clocks); + +void MDEC_StateAction(StateMem *sm, const unsigned load, const bool data_only); +} + +#endif diff --git a/Mednafen/mednafen/psx/notes/MULTITAP b/Mednafen/mednafen/psx/notes/MULTITAP new file mode 100644 index 0000000000..88224b8cf9 --- /dev/null +++ b/Mednafen/mednafen/psx/notes/MULTITAP @@ -0,0 +1,10 @@ +Atari Collection 2 = Port 1 (and have to enable 4-player mode in a menu in Gauntlet; multitap technically also works on port 2, but not very conveniently) (but having multitap on port 1 breaks 2-player Marble Madness, ARGH) +Capcom Generations 4 = Port 1 or 2 (3-player) +Captain Commando = Port 1 or 2 (3-player) +Crash Bash = Port 1 +Crash Team Racing = Port 1 +Need for Speed - P.U. = Port 1 +Quake II = Port 1 +Rampage - Through Time = Port 2? (3-player) +Tales of Phantasia = Port 1 or 2 +Tales of Destiny II = Port 1 or 2 diff --git a/Mednafen/mednafen/psx/notes/PROBLEMATIC-GAMES b/Mednafen/mednafen/psx/notes/PROBLEMATIC-GAMES new file mode 100644 index 0000000000..9f6c8d28bc --- /dev/null +++ b/Mednafen/mednafen/psx/notes/PROBLEMATIC-GAMES @@ -0,0 +1,130 @@ +------------------------------------------------------------------------------------------------------------------------- +List of games that have been historically problematic and are likely to break easily on emulation model changes/screwups: +------------------------------------------------------------------------------------------------------------------------- + +Captain Commando + First stage's boss' graphics are all kinds of corrupt if CD sector buffering is incorrect(particularly in relation of GetLocL vs GetLocP vs raw + sector data time fields). + +Tekken 2 + Requires emulation of coprocessor(GTE)->CPU transfer delay slots, or else severe graphical glitching. + +Skullmonkeys + Requires correct load delay slot handling. + +Next Tetris + Requires proper GPU CLUT wrapping. + +Threads of Fate + Requires correctish CPU branch delay slot emulation(it has branch instructions in previous branch instructions' delay slots), otherwise lockups + and graphical glitches. + +Shadow Master + Branches in branch delay slots. + +Legacy of Kain - Soul Reaver + Uses clever DMA tricks, including linked-list DMA with blocks larger than the GPU FIFO size. + +Final Fantasy 7 +Final Fantasy 9 +Chrono Cross +Dragon Quest 7 + Pause/resume linked-list DMA. + +Battle Arena Toshinden +NBA Jam Extreme +Zero Divide + Run too fast if CPU and(/or?) GPU operations execute too fast. Probably not an issue anymore, but still + listed here for reference. + +iS: Internal Section +Arcade Party Pak (Toobin) +Next Tetris, The + Extremely sensitive about interlacing semantics, especially in regards to the high bit of the GPU status register when entering + interlaced 480-height mode. + +X-Men Mutant Academy + Sensitive to interlacing semantics and timing. + +Ballblazer Champions + Excessively sensitive to timing issues; might lock up during startup sometimes. + +FIFA - Road to Worldcup 98 (USA) + Used to lock up during startup; probably CPU instruction timing-related, or MDEC timing related, + or CDC timing related, or DMA timing related, or maybe the moon phase is to blame! + + [CDC] WARNING: Interrupting command 0x02, phase=0, timeleft=1195 with command=0x02 + [CDC] Bad number(5) of args(first check) for command 0x02 + 0x39 0x23 0x22 0x41 0x67 + +Freestyle Motocross: McGrath vs. Pastrana + Used to suffer from random fairly long(but finite) freezes during gameplay. Possibly CPU instruction-timing + related. Possibly CDC-timing related. + + [CDC] Command: ReadN --- + [CDC] Command: Standby --- + [CDC] Command: Nop --- + [CDC] Command: Setmode --- 0xa0 + [CDC] Command: Setloc --- 0x08 0x13 0x53 + [CDC] Command: ReadN --- + 20076 + [CDC] Command: Standby --- + [CDC] Command: Nop --- + [CDC] Command: Setmode --- 0xa0 + [CDC] Command: Setloc --- 0x08 0x13 0x61 + 0x800668B8 + +Resident Evil 2 + Lockup on second disc in a certain place; probably related to seek timing. Seems to be fixed now, but still listed + here for reference. + +Nightmare Creatures + Shoddy CD reading code that's unreasonably sensitive to CD access timings. It's a wonder it even ever works on an actual + PS1(my copy of it certainly doesn't). + +Capcom games(MMX4, MMX5, etc) + Sensitive about CD access and XA ADPCM timing(XA ADPCM early cutoff problems in early versions of Mednafen's PS1 emulation). + +Viewpoint + Extra-sensitive about GPU LL DMA timing. (It was generating exceptions for some timings...) + +Valkyrie Profile + Battle scenes will go all kaka with no graphics updates if GPU LL DMA completes too soon. + +Pro Pinball (series) + Sensitive to correct interlace and draw line skipping emulation. + +Dukes of Hazzard: Racing For Home + Sensitive about the GPU busy status flag being set long enough; double-check if we ever make CPU emulation + more timing-accurate(the fix will likely just involve reducing the timing granularity for DMA and GPU updates). + +Resident Evil - Director's Cut(non-Dual Shock-version) + Controller configuration screen pops up on some screen transitions if timing is too far off and we're unlucky(all-timing issue, particularly + CPU instruction timing and MDEC decode timing). + +Parasite Eve II + Early 3D-models-on-top-of-FMV sequence with police cars outside building is a jerky mess if MDEC timing/overall throughput is too far off. + +Wing Commander 3 and 4 + Will quasi-randomly lock up during FMVs if SeekL completes too fast. + +Cybersled (Japan) + Reads too many bytes from CDC results FIFO, causing wraparound(and will lock up if the "wrong" values are present in the FIFO's memory). + +This Is Football 2 + Relies on resetting Mode parameter to correct value on Reset CDC command execution. + +Harukanaru Toki no Naka de - Banjou Yuugi (Japan) + Locks up if GetLocL vs ReadS isn't emulated properly. + +Gran Turismo + No music if GetLocL vs ReadS vs Reading/Seeking status bits aren't emulated properly. + +MLB 99 + Crashes during startup in 0.9.37.1, started working in 0.9.38; possibly CD Read*/Seek timing related? + +Wu-Tang - Shaolin Style + Requires proper handling of the case of CD-DA playing into the leadout area. + +Tomb Raider + Relies on low-level CD drive behavior in regards to Q subchannel data(read via GetlocP) after a SeekP. diff --git a/Mednafen/mednafen/psx/notes/PSX-TODO b/Mednafen/mednafen/psx/notes/PSX-TODO new file mode 100644 index 0000000000..f7b3f51378 --- /dev/null +++ b/Mednafen/mednafen/psx/notes/PSX-TODO @@ -0,0 +1,94 @@ +***Major issues*** + +Cyberwar (Japan) + Locks up during startup(SPU status bits issue). + +Monkey Hero + Locks up shortly after title screen. It's straddling a framebuffer write command's parameters across two linked-list + blocks(2 words at the end of the first block, and 1 word at the beginning of the next block). AFAIK, this construct will only + work on the real thing under *very* strict timing constraints. Probably explains why it reportedly doesn't work on the PS2. + It's as easy to fix as changing a certain 2 to a 3 in the GPU command table, and probably won't break anything, + but I'm still reluctant to do it... + +Simple 1500 Series Vol. 057 - The Maze + Locks up during startup; looks to be poorly programmed and extremely sensitive to seek timing. + +Transformers - Beast Wars Transmetals + Locks up during loading screen. (CD timing issue) + It looks like a terrible game though, at least. + +---------------------------------------------------------------------------------------------- + +***Medium issues*** + +Championship Motocross 2001 + Invisible driver. GHOSTRIDER~ The palette data in RAM is apparently being selectively zero'd out between + the DMA from CDC and the DMA to GPU for some reason. Timing issue related maybe? (Probably CPU instruction timing issue) + +International Moto X (Japan) + Flickering/Missing graphics on racer selection screen. + +Nicktoons Racing + Totally fubared sound effects. Likely CPU instruction timing-related(decreasing the IPC fixes this problem), or perhaps timing + related to SPU RAM writes? + +----------------------------------------------------------------------------------------------- + +***Lesser issues*** + +Vigilante 8 + Has weird red and green(and a few blue) garbage pixels in patches sometimes during gameplay. + +Sangokushi Eiketsuden + Many animations go far too fast(It *looks* like the GPU's drawing speed dictates the animation speed! That means the animation speed is going + to be different on early PS1s compared to later PS1s...). + +Final Fantasy 7 + "Sony Computer blah blah" game startup image is a bit glitchy; interlacing-related glitch. That part is really sensitive to CPU, GPU, DMA, + and RAM timing... + +Nightmare Creatures + BIOS reverb sound excessively contaminates beginning of game. + +WipeOut 3 + Music stops playing after a long while; maybe it's supposed to do that? + +Rascal + Flickering/missing graphics in menus. + +T'ai Fu - Wrath of the Tiger + Sometimes locks up when starting a new game. + +----------------------------------------------------------------------------------------------- + +Differentiate between power-on and reset-button events more accurately(e.g. in CPU and GTE code). + +Handle D28 of DMA CHCR properly. + +Rewrite CPU emulation to properly emulate the pipeline and all its quirks(might be too computationally-expensive, though). Related TODOs +dependent on this: + Audit GTE instruction cycle counts. + Test IRQ and COP0 latencies; PSX IRQ controller latency, software IRQ bit latency, latency of both relevant COP0 IRQ enable bits. + Test IRQ with LWC2. + Test IRQ with COP0 instructions(interrupted execution or not?). + +CDC status bit 4(seek error/disc change/something something) semantics aren't entirely correct; run tests to see under what conditions +the bit is cleared(e.g. what commands will clear it). + +Add a means of grabbing and passing CIRC data, when using a physical CD, from Mednafen core to the PSX module so that the correct +subheader fields can be chosen when there is a mismatch between the two instances of each field during XA ADPCM playback. + +Ensure(long-term, IE a note to the FUTURE) that input device state is latched in independent variables at the start of the +input device's handling of a state read command, so that when games are reading device state across an MDFNI_Emulate() boundary, the +data won't change in the middle, which could hypothetically cause problems in some rare circumstances(and make entering +button combos in games more finicky). + +Respect device(GPU, SPU, etc.) DMA mode/memory access mode bits(more for homebrew's sake than commercial games'). + +Test if Dual Analog vibration compatibility mode can be restored with DualShock after using DualShock extended features if the "Analog" +mode button on the gamepad is pressed after the extended features are used. + +The SPU in the PS1 might sometimes drop voice-on events when playing an ADPCM block that loops to itself(and was also the first and only +ADPCM block, at least in the test program I noticed the issue in); investigate further. + +Ensure debugger COPn disassembly is correct(no typos or whatnot). diff --git a/Mednafen/mednafen/psx/notes/SOURCES b/Mednafen/mednafen/psx/notes/SOURCES new file mode 100644 index 0000000000..b346463784 --- /dev/null +++ b/Mednafen/mednafen/psx/notes/SOURCES @@ -0,0 +1,63 @@ +Sources of helpful information used in PS1 emulation(though some of it, especially older compiled information, +is wrong to some degree or incomplete, but it's still useful): + +----------- + Books +----------- + MIPS RISC Architecture - Gerry Kane (1st and 2nd editions) + MIPS Programmer's Handbook, The + + +----------- + Source code +----------- + PCSX(and derivatives/forks) + MAME/MESS ~ http://www.mess.org/ + P.E.Op.S ~ http://www.pbernert.com/index.htm + LR333x0 development header files + cdrdao ~ http://cdrdao.sourceforge.net/ + dvdisaster + + +----------- + Documents +----------- + doomed's PSX documents + bITmASTER's document + Neill Corlett's SPU documents + T.Fujita's SIO documents + jac's CD-XA document + "The PlayStation 1 Video (STR) Format" - M. Sabin + no$psx technical documentation + SCSI-3 Multimedia Commands Revision 10A + ECMA-130 + + +----------- + Homebrew +----------- + Blade Lib + psxsdk ~ https://code.google.com/p/psxsdk/ + + +----------- + Misc. +----------- + AmiDog's PS1 test programs ~ http://psx.amidog.se/doku.php + ePSXe v.1.7.0 compatibility list ~ http://www.epforums.org/showthread.php?73805-New-ePSXe-v-1-7-0-compatibility-list-thread + pSX compatibility list ~ http://psx.silvanthalas.com/psx.html + shalma's forum posts/changelogs ~ http://ngemu.com/threads/peops-dsound-1-09-repair.140191/ + smf's blog ~ http://smf.mameworld.info/ + drhell's site ~ http://drhell.web.fc2.com/ps1/ + + +----------- + People (bother them at your own peril ;) ) +----------- + ChrlyMac + Exophase + mizvekov + notaz + pSXAuthor + + diff --git a/Mednafen/mednafen/psx/notes/SPU-IRQ b/Mednafen/mednafen/psx/notes/SPU-IRQ new file mode 100644 index 0000000000..1eb58d6529 --- /dev/null +++ b/Mednafen/mednafen/psx/notes/SPU-IRQ @@ -0,0 +1,16 @@ +Castlevania Chronicles - Music. +Chrono Cross - FMV. +Dance Dance Revolution - Gameplay music. +Dance Dance Revolution: Disney Mix - Gameplay music. +Eithea - Sneaky evil usage, along with manual loop address override abuse. +Final Fantasy 8 - Some FMV +Koudelka +Legend of Mana - FMV(really finicky about DMA timing). +Medal of Honor +Misadventures of Tron Bonne - Dialogue. +Nicktoons Racing - FMV, gameplay music. +Tales of Destiny - Battle voices. Japanese version 1.0 is particularly sensitive to how SPU IRQs are emulated, and tends to lock up after Mary's "Moushuuken" is used if emulated improperly. +Thousand Arms - Dialogue. +Um Jammer Lammy +Valkyrie Profile - Used extensively for dialogue, in-battle and out. +Wing Commander 4 - FMV. diff --git a/Mednafen/mednafen/psx/notes/tristep.cpp b/Mednafen/mednafen/psx/notes/tristep.cpp new file mode 100644 index 0000000000..1ff9a8608e --- /dev/null +++ b/Mednafen/mednafen/psx/notes/tristep.cpp @@ -0,0 +1,89 @@ +#include +#include +#include + +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; + +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; + +#define INLINE inline + +static INLINE int64 MakePolyXFP(int32 x) +{ + return ((int64)x << 32) + ((1LL << 32) - (1 << 11)); +} + +static INLINE int64 MakePolyXFPStep(int32 dx, int32 dy) +{ + int64 ret; + int64 dx_ex = (int64)dx << 32; + + if(dx_ex < 0) + dx_ex -= dy - 1; + + if(dx_ex > 0) + dx_ex += dy - 1; + + ret = dx_ex / dy; + + return(ret); +} + +static INLINE int32 GetPolyXFP_Int(int64 xfp) +{ + return(xfp >> 32); +} + + +// Test X delta of -1023 ... 1023 +// Test Y delta of 1 ... 511 +int main() +{ + for(int xbase = -1; xbase < 1025; xbase += 1025) + { + for(int dx = -1023; dx <= 1023; dx++) + { + for(int dy = 1; dy <= 511; dy++) + { + int64 x_coord, x_step; + int32 alt_x_coord; + int32 alt_x_error; + + x_coord = MakePolyXFP(xbase); + x_step = MakePolyXFPStep(dx, dy); + + alt_x_coord = xbase; + + if(dx >= 0) + alt_x_error = dy - 1; + else + alt_x_error = 0; + + for(int step = 0; step < dy; step++) + { + if(GetPolyXFP_Int(x_coord) != alt_x_coord) + { + printf("xbase=%d, dx=%d, dy=%d, step=%d --- xfpx=%d, altx=%d\n", xbase, dx, dy, step, GetPolyXFP_Int(x_coord), alt_x_coord); + } + x_coord += x_step; + + alt_x_error += abs(dx); + while(alt_x_error >= dy) + { + if(dx < 0) + alt_x_coord--; + else + alt_x_coord++; + alt_x_error -= dy; + } + } + } + } + } +} diff --git a/Mednafen/mednafen/psx/psx.cpp b/Mednafen/mednafen/psx/psx.cpp new file mode 100644 index 0000000000..7f4bf07444 --- /dev/null +++ b/Mednafen/mednafen/psx/psx.cpp @@ -0,0 +1,2508 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "mdec.h" +#include "frontio.h" +#include "timer.h" +#include "sio.h" +#include "cdc.h" +#include "spu.h" +#include +#include +#include +#include + +#include +#include + +#include + +extern MDFNGI EmulatedPSX; + +namespace MDFN_IEN_PSX +{ + +#if PSX_DBGPRINT_ENABLE +static unsigned psx_dbg_level = 0; + +void PSX_DBG_BIOS_PUTC(uint8 c) noexcept +{ + if(psx_dbg_level >= PSX_DBG_BIOS_PRINT) + { + if(c == 0x1B) + return; + + fputc(c, stdout); + + //if(c == '\n') + //{ + // fputc('%', stdout); + // fputc(' ', stdout); + //} + fflush(stdout); + } +} + +void PSX_DBG(unsigned level, const char *format, ...) noexcept +{ + if(psx_dbg_level >= level) + { + va_list ap; + + va_start(ap, format); + + trio_vprintf(format, ap); + + va_end(ap); + } +} +#else +static unsigned const psx_dbg_level = 0; +#endif + + +struct MDFN_PseudoRNG // Based off(but not the same as) public-domain "JKISS" PRNG. +{ + MDFN_PseudoRNG() + { + ResetState(); + } + + uint32 RandU32(void) + { + uint64 t; + + x = 314527869 * x + 1234567; + y ^= y << 5; y ^= y >> 7; y ^= y << 22; + t = 4294584393ULL * z + c; c = t >> 32; z = t; + lcgo = (19073486328125ULL * lcgo) + 1; + + return (x + y + z) ^ (lcgo >> 16); + } + + uint32 RandU32(uint32 mina, uint32 maxa) + { + const uint32 range_m1 = maxa - mina; + uint32 range_mask; + uint32 tmp; + + range_mask = range_m1; + range_mask |= range_mask >> 1; + range_mask |= range_mask >> 2; + range_mask |= range_mask >> 4; + range_mask |= range_mask >> 8; + range_mask |= range_mask >> 16; + + do + { + tmp = RandU32() & range_mask; + } while(tmp > range_m1); + + return(mina + tmp); + } + + void ResetState(void) // Must always reset to the same state. + { + x = 123456789; + y = 987654321; + z = 43219876; + c = 6543217; + lcgo = 0xDEADBEEFCAFEBABEULL; + } + + uint32 x,y,z,c; + uint64 lcgo; +}; + +static MDFN_PseudoRNG PSX_PRNG; + +uint32 PSX_GetRandU32(uint32 mina, uint32 maxa) +{ + return PSX_PRNG.RandU32(mina, maxa); +} + + +class PSF1Loader : public PSFLoader +{ + public: + + PSF1Loader(Stream *fp); + virtual ~PSF1Loader() override; + + virtual void HandleEXE(Stream* fp, bool ignore_pcsp = false) override; + + PSFTags tags; +}; + +enum +{ + REGION_JP = 0, + REGION_NA = 1, + REGION_EU = 2, +}; + +static const MDFNSetting_EnumList Region_List[] = +{ + { "jp", REGION_JP, gettext_noop("Japan") }, + { "na", REGION_NA, gettext_noop("North America") }, + { "eu", REGION_EU, gettext_noop("Europe") }, + { NULL, 0 }, +}; + +static const struct +{ + const char* version; + char hwrev; // Ostensibly, not sure where this information originally came from or if it has any use(considering it doesn't reflect all hardware changes). + unsigned region; + bool bad; + sha256_digest sd; +} BIOS_DB[] = +{ + // 1.0J, 2.2D, 4.1A(W): + // Tolerant with regards to ISO-9660 system-area contents + // + + { "1.0J", 'A', REGION_JP, false, "cfc1fc38eb442f6f80781452119e931bcae28100c1c97e7e6c5f2725bbb0f8bb"_sha256 }, + + { "1.1J", 'B', REGION_JP, false, "5eb3aee495937558312b83b54323d76a4a015190decd4051214f1b6df06ac34b"_sha256 }, + + { "2.0A", 'X', REGION_NA, false, "42e4124be7623e2e28b1db0d8d426539646faee49d74b71166d8ba5bd7c472ed"_sha256 }, // DTL + { "2.0E", 'B', REGION_EU, false, "0af2be3468d30b6018b3c3b0d98b8b64347e255e16d874d55f0363648973dbf0"_sha256 }, + + { "2.1J", 'B', REGION_JP, false, "6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989"_sha256 }, + { "2.1A", 'X', REGION_NA, false, "6ad5521d105a6b86741f1af8da2e6ea1c732d34459940618c70305a105e8ec10"_sha256 }, // DTL + { "2.1E", 'B', REGION_EU, false, "1efb0cfc5db8a8751a884c5312e9c6265ca1bc580dc0c2663eb2dea3bde9fcf7"_sha256 }, + + { "2.2J", 'B', REGION_JP, false, "0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197"_sha256 }, + { "2.2J", 'B', REGION_JP, true, "8e0383171e67b33e60d5df6394c58843f3b11c7a0b97f3bfcc4319ac2d1f9d18"_sha256 }, // BAD! ! ! ! + { "2.2A", 'B', REGION_NA, false, "71af94d1e47a68c11e8fdb9f8368040601514a42a5a399cda48c7d3bff1e99d3"_sha256 }, + { "2.2E", 'B', REGION_EU, false, "3d06d2c469313c2a2128d24fe2e0c71ff99bc2032be89a829a62337187f500b7"_sha256 }, + { "2.2D", 'X', REGION_JP, false, "4018749b3698b8694387beebcbabfb48470513066840f9441459ee4c9f0f39bc"_sha256 }, // DTL + + { "3.0J", 'C', REGION_JP, false, "9c0421858e217805f4abe18698afea8d5aa36ff0727eb8484944e00eb5e7eadb"_sha256 }, + { "3.0A", 'C', REGION_NA, false, "11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef"_sha256 }, + { "3.0E", 'C', REGION_EU, false, "1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09"_sha256 }, + { "3.0E", 'C', REGION_EU, true, "9e1f8fb4fa356a5ac29d7c7209626dcc1b3038c0e5a85b0e99d1db96926647ca"_sha256 }, // BAD! ! ! ! + + { "4.0J", 'C', REGION_JP, false, "e900504d1755f021f861b82c8258c5e6658c7b592f800cccd91f5d32ea380d28"_sha256 }, + + { "4.1A(W)",'C',REGION_JP,false, "b3aa63cf30c81e0a40641740f4a43e25fda0b21b792fa9aaef60ce1675761479"_sha256 }, // Weird + { "4.1A", 'C', REGION_NA, false, "39dcc1a0717036c9b6ac52fefd1ee7a57d3808e8cfbc755879fa685a0a738278"_sha256 }, + { "4.1E", 'C', REGION_EU, false, "5e84a94818cf5282f4217591fefd88be36b9b174b3cc7cb0bcd75199beb450f1"_sha256 }, + + { "4.3J", 'C', REGION_JP, false, "b29b4b5fcddef369bd6640acacda0865e0366fcf7ea54e40b2f1a8178004f89a"_sha256}, + + { "4.4E", 'C', REGION_EU, false, "5c0166da24e27deaa82246de8ff0108267fe4bb59f6df0fdec50e05e62448ca4"_sha256 }, + + { "4.5A", 'C', REGION_NA, false, "aca9cbfa974b933646baad6556a867eca9b81ce65d8af343a7843f7775b9ffc8"_sha256 }, + { "4.5E", 'C', REGION_EU, false, "42244b0c650821519751b7e77ad1d3222a0125e75586df2b4e84ba693b9809dc"_sha256 }, +}; + +static sha256_digest BIOS_SHA256; // SHA-256 hash of the currently-loaded BIOS; used for save state sanity checks. +static PSF1Loader *psf_loader = NULL; +static std::vector *cdifs = NULL; +static std::vector cdifs_scex_ids; + +static uint64 Memcard_PrevDC[8]; +static int64 Memcard_SaveDelay[8]; + +PS_CPU *CPU = NULL; +PS_SPU *SPU = NULL; +PS_GPU *GPU = NULL; +PS_CDC *CDC = NULL; +FrontIO *FIO = NULL; + +static MultiAccessSizeMem<512 * 1024, false> *BIOSROM = NULL; +static MultiAccessSizeMem<65536, false> *PIOMem = NULL; + +MultiAccessSizeMem<2048 * 1024, false> MainRAM; + +static uint32 TextMem_Start; +static std::vector TextMem; + +static const uint32 SysControl_Mask[9] = { 0x00ffffff, 0x00ffffff, 0xffffffff, 0x2f1fffff, + 0xffffffff, 0x2f1fffff, 0x2f1fffff, 0xffffffff, + 0x0003ffff }; + +static const uint32 SysControl_OR[9] = { 0x1f000000, 0x1f000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000 }; + +static struct +{ + union + { + struct + { + uint32 PIO_Base; // 0x1f801000 // BIOS Init: 0x1f000000, Writeable bits: 0x00ffffff(assumed, verify), FixedOR = 0x1f000000 + uint32 Unknown0; // 0x1f801004 // BIOS Init: 0x1f802000, Writeable bits: 0x00ffffff, FixedOR = 0x1f000000 + uint32 Unknown1; // 0x1f801008 // BIOS Init: 0x0013243f, ???? + uint32 Unknown2; // 0x1f80100c // BIOS Init: 0x00003022, Writeable bits: 0x2f1fffff, FixedOR = 0x00000000 + + uint32 BIOS_Mapping; // 0x1f801010 // BIOS Init: 0x0013243f, ???? + uint32 SPU_Delay; // 0x1f801014 // BIOS Init: 0x200931e1, Writeable bits: 0x2f1fffff, FixedOR = 0x00000000 - Affects bus timing on access to SPU + uint32 CDC_Delay; // 0x1f801018 // BIOS Init: 0x00020843, Writeable bits: 0x2f1fffff, FixedOR = 0x00000000 + uint32 Unknown4; // 0x1f80101c // BIOS Init: 0x00070777, ???? + uint32 Unknown5; // 0x1f801020 // BIOS Init: 0x00031125(but rewritten with other values often), Writeable bits: 0x0003ffff, FixedOR = 0x00000000 -- Possibly CDC related + }; + uint32 Regs[9]; + }; +} SysControl; + +static unsigned DMACycleSteal = 0; // Doesn't need to be saved in save states, since it's recalculated in the ForceEventUpdates() call chain. + +void PSX_SetDMACycleSteal(unsigned stealage) +{ + if(stealage > 200) // Due to 8-bit limitations in the CPU core. + stealage = 200; + + DMACycleSteal = stealage; +} + + +// +// Event stuff +// + +static pscpu_timestamp_t Running; // Set to -1 when not desiring exit, and 0 when we are. + +struct event_list_entry +{ + uint32 which; + pscpu_timestamp_t event_time; + event_list_entry *prev; + event_list_entry *next; +}; + +static event_list_entry events[PSX_EVENT__COUNT]; + +static void EventReset(void) +{ + for(unsigned i = 0; i < PSX_EVENT__COUNT; i++) + { + events[i].which = i; + + if(i == PSX_EVENT__SYNFIRST) + events[i].event_time = 0; + else if(i == PSX_EVENT__SYNLAST) + events[i].event_time = 0x7FFFFFFF; + else + events[i].event_time = PSX_EVENT_MAXTS; + + events[i].prev = (i > 0) ? &events[i - 1] : NULL; + events[i].next = (i < (PSX_EVENT__COUNT - 1)) ? &events[i + 1] : NULL; + } +} + +//static void RemoveEvent(event_list_entry *e) +//{ +// e->prev->next = e->next; +// e->next->prev = e->prev; +//} + +static void RebaseTS(const pscpu_timestamp_t timestamp) +{ + for(unsigned i = 0; i < PSX_EVENT__COUNT; i++) + { + if(i == PSX_EVENT__SYNFIRST || i == PSX_EVENT__SYNLAST) + continue; + + assert(events[i].event_time > timestamp); + events[i].event_time -= timestamp; + } + + CPU->SetEventNT(events[PSX_EVENT__SYNFIRST].next->event_time); +} + +void PSX_SetEventNT(const int type, const pscpu_timestamp_t next_timestamp) +{ + event_list_entry *e = &events[type]; + + if(next_timestamp < e->event_time) + { + event_list_entry *fe = e; + + do + { + fe = fe->prev; + } + while(next_timestamp < fe->event_time); + + // Remove this event from the list, temporarily of course. + e->prev->next = e->next; + e->next->prev = e->prev; + + // Insert into the list, just after "fe". + e->prev = fe; + e->next = fe->next; + fe->next->prev = e; + fe->next = e; + + e->event_time = next_timestamp; + } + else if(next_timestamp > e->event_time) + { + event_list_entry *fe = e; + + do + { + fe = fe->next; + } while(next_timestamp > fe->event_time); + + // Remove this event from the list, temporarily of course + e->prev->next = e->next; + e->next->prev = e->prev; + + // Insert into the list, just BEFORE "fe". + e->prev = fe->prev; + e->next = fe; + fe->prev->next = e; + fe->prev = e; + + e->event_time = next_timestamp; + } + + CPU->SetEventNT(events[PSX_EVENT__SYNFIRST].next->event_time & Running); +} + +// Called from debug.cpp too. +void ForceEventUpdates(const pscpu_timestamp_t timestamp) +{ + PSX_SetEventNT(PSX_EVENT_GPU, GPU->Update(timestamp)); + PSX_SetEventNT(PSX_EVENT_CDC, CDC->Update(timestamp)); + + PSX_SetEventNT(PSX_EVENT_TIMER, TIMER_Update(timestamp)); + + PSX_SetEventNT(PSX_EVENT_DMA, DMA_Update(timestamp)); + + PSX_SetEventNT(PSX_EVENT_FIO, FIO->Update(timestamp)); + + CPU->SetEventNT(events[PSX_EVENT__SYNFIRST].next->event_time); +} + +bool MDFN_FASTCALL PSX_EventHandler(const pscpu_timestamp_t timestamp) +{ + event_list_entry *e = events[PSX_EVENT__SYNFIRST].next; + + while(timestamp >= e->event_time) // If Running = 0, PSX_EventHandler() may be called even if there isn't an event per-se, so while() instead of do { ... } while + { + event_list_entry *prev = e->prev; + pscpu_timestamp_t nt; + + switch(e->which) + { + default: abort(); + + case PSX_EVENT_GPU: + nt = GPU->Update(e->event_time); + break; + + case PSX_EVENT_CDC: + nt = CDC->Update(e->event_time); + break; + + case PSX_EVENT_TIMER: + nt = TIMER_Update(e->event_time); + break; + + case PSX_EVENT_DMA: + nt = DMA_Update(e->event_time); + break; + + case PSX_EVENT_FIO: + nt = FIO->Update(e->event_time); + break; + } +#if PSX_EVENT_SYSTEM_CHECKS + assert(nt > e->event_time); +#endif + + PSX_SetEventNT(e->which, nt); + + // Order of events can change due to calling PSX_SetEventNT(), this prev business ensures we don't miss an event due to reordering. + e = prev->next; + } + + return(Running); +} + + +void PSX_RequestMLExit(void) +{ + Running = 0; + CPU->SetEventNT(0); +} + + +// +// End event stuff +// + +// Remember to update MemPeek<>() and MemPoke<>() when we change address decoding in MemRW() +template static INLINE void MemRW(pscpu_timestamp_t ×tamp, uint32 A, uint32 &V) +{ + #if 0 + if(IsWrite) + printf("Write%d: %08x(orig=%08x), %08x\n", (int)(sizeof(T) * 8), A & mask[A >> 29], A, V); + else + printf("Read%d: %08x(orig=%08x)\n", (int)(sizeof(T) * 8), A & mask[A >> 29], A); + #endif + + if(!IsWrite) + timestamp += DMACycleSteal; + + if(A < 0x00800000) + { + if(IsWrite) + { + //timestamp++; // Best-case timing. + } + else + { + timestamp += 3; + } + + if(Access24) + { + if(IsWrite) + MainRAM.WriteU24(A & 0x1FFFFF, V); + else + V = MainRAM.ReadU24(A & 0x1FFFFF); + } + else + { + if(IsWrite) + MainRAM.Write(A & 0x1FFFFF, V); + else + V = MainRAM.Read(A & 0x1FFFFF); + } + + return; + } + + if(A >= 0x1FC00000 && A <= 0x1FC7FFFF) + { + if(!IsWrite) + { + if(Access24) + V = BIOSROM->ReadU24(A & 0x7FFFF); + else + V = BIOSROM->Read(A & 0x7FFFF); + } + + return; + } + + if(timestamp >= events[PSX_EVENT__SYNFIRST].next->event_time) + PSX_EventHandler(timestamp); + + if(A >= 0x1F801000 && A <= 0x1F802FFF) + { + //if(IsWrite) + // printf("HW Write%d: %08x %08x\n", (unsigned int)(sizeof(T)*8), (unsigned int)A, (unsigned int)V); + //else + // printf("HW Read%d: %08x\n", (unsigned int)(sizeof(T)*8), (unsigned int)A); + + if(A >= 0x1F801C00 && A <= 0x1F801FFF) // SPU + { + if(sizeof(T) == 4 && !Access24) + { + if(IsWrite) + { + //timestamp += 15; + + //if(timestamp >= events[PSX_EVENT__SYNFIRST].next->event_time) + // PSX_EventHandler(timestamp); + + SPU->Write(timestamp, A | 0, V); + SPU->Write(timestamp, A | 2, V >> 16); + } + else + { + timestamp += 36; + + if(timestamp >= events[PSX_EVENT__SYNFIRST].next->event_time) + PSX_EventHandler(timestamp); + + V = SPU->Read(timestamp, A); + V |= SPU->Read(timestamp, A | 2) << 16; + } + } + else + { + if(IsWrite) + { + //timestamp += 8; + + //if(timestamp >= events[PSX_EVENT__SYNFIRST].next->event_time) + // PSX_EventHandler(timestamp); + + SPU->Write(timestamp, A & ~1, V); + } + else + { + timestamp += 16; // Just a guess, need to test. + + if(timestamp >= events[PSX_EVENT__SYNFIRST].next->event_time) + PSX_EventHandler(timestamp); + + V = SPU->Read(timestamp, A & ~1); + } + } + return; + } // End SPU + + + // CDC: TODO - 8-bit access. + if(A >= 0x1f801800 && A <= 0x1f80180F) + { + if(!IsWrite) + { + timestamp += 6 * sizeof(T); //24; + } + + if(IsWrite) + CDC->Write(timestamp, A & 0x3, V); + else + V = CDC->Read(timestamp, A & 0x3); + + return; + } + + if(A >= 0x1F801810 && A <= 0x1F801817) + { + if(!IsWrite) + timestamp++; + + if(IsWrite) + GPU->Write(timestamp, A, V); + else + V = GPU->Read(timestamp, A); + + return; + } + + if(A >= 0x1F801820 && A <= 0x1F801827) + { + if(!IsWrite) + timestamp++; + + if(IsWrite) + MDEC_Write(timestamp, A, V); + else + V = MDEC_Read(timestamp, A); + + return; + } + + if(A >= 0x1F801000 && A <= 0x1F801023) + { + unsigned index = (A & 0x1F) >> 2; + + if(!IsWrite) + timestamp++; + + //if(A == 0x1F801014 && IsWrite) + // fprintf(stderr, "%08x %08x\n",A,V); + + if(IsWrite) + { + V <<= (A & 3) * 8; + SysControl.Regs[index] = V & SysControl_Mask[index]; + } + else + { + V = SysControl.Regs[index] | SysControl_OR[index]; + V >>= (A & 3) * 8; + } + return; + } + + if(A >= 0x1F801040 && A <= 0x1F80104F) + { + if(!IsWrite) + timestamp++; + + if(IsWrite) + FIO->Write(timestamp, A, V); + else + V = FIO->Read(timestamp, A); + return; + } + + if(A >= 0x1F801050 && A <= 0x1F80105F) + { + if(!IsWrite) + timestamp++; + +#if 0 + if(IsWrite) + { + PSX_WARNING("[SIO] Write: 0x%08x 0x%08x %u", A, V, (unsigned)sizeof(T)); + } + else + { + PSX_WARNING("[SIO] Read: 0x%08x", A); + } +#endif + + if(IsWrite) + SIO_Write(timestamp, A, V); + else + V = SIO_Read(timestamp, A); + return; + } + +#if 0 + if(A >= 0x1F801060 && A <= 0x1F801063) + { + if(IsWrite) + { + + } + else + { + + } + + return; + } +#endif + + if(A >= 0x1F801070 && A <= 0x1F801077) // IRQ + { + if(!IsWrite) + timestamp++; + + if(IsWrite) + IRQ_Write(A, V); + else + V = IRQ_Read(A); + return; + } + + if(A >= 0x1F801080 && A <= 0x1F8010FF) // DMA + { + if(!IsWrite) + timestamp++; + + if(IsWrite) + DMA_Write(timestamp, A, V); + else + V = DMA_Read(timestamp, A); + + return; + } + + if(A >= 0x1F801100 && A <= 0x1F80113F) // Root counters + { + if(!IsWrite) + timestamp++; + + if(IsWrite) + TIMER_Write(timestamp, A, V); + else + V = TIMER_Read(timestamp, A); + + return; + } + } + + + if(A >= 0x1F000000 && A <= 0x1F7FFFFF) + { + if(!IsWrite) + { + //if((A & 0x7FFFFF) <= 0x84) + //PSX_WARNING("[PIO] Read%d from 0x%08x at time %d", (int)(sizeof(T) * 8), A, timestamp); + + V = ~0U; // A game this affects: Tetris with Cardcaptor Sakura + + if(PIOMem) + { + if((A & 0x7FFFFF) < 65536) + { + if(Access24) + V = PIOMem->ReadU24(A & 0x7FFFFF); + else + V = PIOMem->Read(A & 0x7FFFFF); + } + else if((A & 0x7FFFFF) < (65536 + TextMem.size())) + { + if(Access24) + V = MDFN_de24lsb(&TextMem[(A & 0x7FFFFF) - 65536]); + else switch(sizeof(T)) + { + case 1: V = TextMem[(A & 0x7FFFFF) - 65536]; break; + case 2: V = MDFN_de16lsb(&TextMem[(A & 0x7FFFFF) - 65536]); break; + case 4: V = MDFN_de32lsb(&TextMem[(A & 0x7FFFFF) - 65536]); break; + } + } + } + } + return; + } + + if(A == 0xFFFE0130) // Per tests on PS1, ignores the access(sort of, on reads the value is forced to 0 if not aligned) if not aligned to 4-bytes. + { + if(!IsWrite) + V = CPU->GetBIU(); + else + CPU->SetBIU(V); + + return; + } + + if(IsWrite) + { + PSX_WARNING("[MEM] Unknown write%d to %08x at time %d, =%08x(%d)", (int)(sizeof(T) * 8), A, timestamp, V, V); + } + else + { + V = 0; + PSX_WARNING("[MEM] Unknown read%d from %08x at time %d", (int)(sizeof(T) * 8), A, timestamp); + } +} + +void MDFN_FASTCALL PSX_MemWrite8(pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + MemRW(timestamp, A, V); +} + +void MDFN_FASTCALL PSX_MemWrite16(pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + MemRW(timestamp, A, V); +} + +void MDFN_FASTCALL PSX_MemWrite24(pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + MemRW(timestamp, A, V); +} + +void MDFN_FASTCALL PSX_MemWrite32(pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + MemRW(timestamp, A, V); +} + +uint8 MDFN_FASTCALL PSX_MemRead8(pscpu_timestamp_t ×tamp, uint32 A) +{ + uint32 V; + + MemRW(timestamp, A, V); + + return(V); +} + +uint16 MDFN_FASTCALL PSX_MemRead16(pscpu_timestamp_t ×tamp, uint32 A) +{ + uint32 V; + + MemRW(timestamp, A, V); + + return(V); +} + +uint32 MDFN_FASTCALL PSX_MemRead24(pscpu_timestamp_t ×tamp, uint32 A) +{ + uint32 V; + + MemRW(timestamp, A, V); + + return(V); +} + +uint32 MDFN_FASTCALL PSX_MemRead32(pscpu_timestamp_t ×tamp, uint32 A) +{ + uint32 V; + + MemRW(timestamp, A, V); + + return(V); +} + +template static INLINE uint32 MemPeek(pscpu_timestamp_t timestamp, uint32 A) +{ + if(A < 0x00800000) + { + if(Access24) + return(MainRAM.ReadU24(A & 0x1FFFFF)); + else + return(MainRAM.Read(A & 0x1FFFFF)); + } + + if(A >= 0x1FC00000 && A <= 0x1FC7FFFF) + { + if(Access24) + return(BIOSROM->ReadU24(A & 0x7FFFF)); + else + return(BIOSROM->Read(A & 0x7FFFF)); + } + + if(A >= 0x1F801000 && A <= 0x1F802FFF) + { + if(A >= 0x1F801C00 && A <= 0x1F801FFF) // SPU + { + // TODO + + } // End SPU + + + // CDC: TODO - 8-bit access. + if(A >= 0x1f801800 && A <= 0x1f80180F) + { + // TODO + + } + + if(A >= 0x1F801810 && A <= 0x1F801817) + { + // TODO + + } + + if(A >= 0x1F801820 && A <= 0x1F801827) + { + // TODO + + } + + if(A >= 0x1F801000 && A <= 0x1F801023) + { + unsigned index = (A & 0x1F) >> 2; + return((SysControl.Regs[index] | SysControl_OR[index]) >> ((A & 3) * 8)); + } + + if(A >= 0x1F801040 && A <= 0x1F80104F) + { + // TODO + + } + + if(A >= 0x1F801050 && A <= 0x1F80105F) + { + // TODO + + } + + + if(A >= 0x1F801070 && A <= 0x1F801077) // IRQ + { + // TODO + + } + + if(A >= 0x1F801080 && A <= 0x1F8010FF) // DMA + { + // TODO + + } + + if(A >= 0x1F801100 && A <= 0x1F80113F) // Root counters + { + // TODO + + } + } + + + if(A >= 0x1F000000 && A <= 0x1F7FFFFF) + { + if(PIOMem) + { + if((A & 0x7FFFFF) < 65536) + { + if(Access24) + return(PIOMem->ReadU24(A & 0x7FFFFF)); + else + return(PIOMem->Read(A & 0x7FFFFF)); + } + else if((A & 0x7FFFFF) < (65536 + TextMem.size())) + { + if(Access24) + return(MDFN_de24lsb(&TextMem[(A & 0x7FFFFF) - 65536])); + else switch(sizeof(T)) + { + case 1: return(TextMem[(A & 0x7FFFFF) - 65536]); break; + case 2: return(MDFN_de16lsb(&TextMem[(A & 0x7FFFFF) - 65536])); break; + case 4: return(MDFN_de32lsb(&TextMem[(A & 0x7FFFFF) - 65536])); break; + } + } + } + return(~0U); + } + + if(A == 0xFFFE0130) + return CPU->GetBIU(); + + return(0); +} + +uint8 PSX_MemPeek8(uint32 A) +{ + return MemPeek(0, A); +} + +uint16 PSX_MemPeek16(uint32 A) +{ + return MemPeek(0, A); +} + +uint32 PSX_MemPeek32(uint32 A) +{ + return MemPeek(0, A); +} + +template static INLINE void MemPoke(pscpu_timestamp_t timestamp, uint32 A, T V) +{ + if(A < 0x00800000) + { + if(Access24) + MainRAM.WriteU24(A & 0x1FFFFF, V); + else + MainRAM.Write(A & 0x1FFFFF, V); + + return; + } + + if(A >= 0x1FC00000 && A <= 0x1FC7FFFF) + { + if(Access24) + BIOSROM->WriteU24(A & 0x7FFFF, V); + else + BIOSROM->Write(A & 0x7FFFF, V); + + return; + } + + if(A >= 0x1F801000 && A <= 0x1F802FFF) + { + if(A >= 0x1F801000 && A <= 0x1F801023) + { + unsigned index = (A & 0x1F) >> 2; + SysControl.Regs[index] = (V << ((A & 3) * 8)) & SysControl_Mask[index]; + return; + } + } + + if(A == 0xFFFE0130) + { + CPU->SetBIU(V); + return; + } +} + +void PSX_MemPoke8(uint32 A, uint8 V) +{ + MemPoke(0, A, V); +} + +void PSX_MemPoke16(uint32 A, uint16 V) +{ + MemPoke(0, A, V); +} + +void PSX_MemPoke32(uint32 A, uint32 V) +{ + MemPoke(0, A, V); +} + + +static void PSX_Reset(bool powering_up) +{ + PSX_PRNG.ResetState(); // Should occur first! + + memset(MainRAM.data8, 0, 2048 * 1024); + + for(unsigned i = 0; i < 9; i++) + SysControl.Regs[i] = 0; + + CPU->Power(); + + EventReset(); + + TIMER_Power(); + + DMA_Power(); + + FIO->Reset(powering_up); + SIO_Power(); + + MDEC_Power(); + CDC->Power(); + GPU->Power(); + //SPU->Power(); // Called from CDC->Power() + IRQ_Power(); + + ForceEventUpdates(0); +} + + +void PSX_GPULineHook(const pscpu_timestamp_t timestamp, const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider) +{ + FIO->GPULineHook(timestamp, line_timestamp, vsync, pixels, format, width, pix_clock_offset, pix_clock, pix_clock_divider); +} + +} + +using namespace MDFN_IEN_PSX; + + +static void Emulate(EmulateSpecStruct *espec) +{ + pscpu_timestamp_t timestamp = 0; + + if(FIO->RequireNoFrameskip()) + { + //puts("MEOW"); + espec->skip = false; //TODO: Save here, and restore at end of Emulate() ? + } + + MDFNGameInfo->mouse_sensitivity = MDFN_GetSettingF("psx.input.mouse_sensitivity"); + + MDFNMP_ApplyPeriodicCheats(); + + + espec->MasterCycles = 0; + espec->SoundBufSize = 0; + + FIO->UpdateInput(); + GPU->StartFrame(psf_loader ? NULL : espec); + SPU->StartFrame(espec->SoundRate, MDFN_GetSettingUI("psx.spu.resamp_quality")); + + Running = -1; + timestamp = CPU->Run(timestamp, psf_loader == NULL && psx_dbg_level >= PSX_DBG_BIOS_PRINT, psf_loader != NULL); + + assert(timestamp); + + ForceEventUpdates(timestamp); + if(GPU->GetScanlineNum() < 100) + PSX_DBG(PSX_DBG_ERROR, "[BUUUUUUUG] Frame timing end glitch; scanline=%u, st=%u\n", GPU->GetScanlineNum(), timestamp); + + //printf("scanline=%u, st=%u\n", GPU->GetScanlineNum(), timestamp); + + espec->SoundBufSize = SPU->EndFrame(espec->SoundBuf, espec->NeedSoundReverse); + espec->NeedSoundReverse = false; + + CDC->ResetTS(); + TIMER_ResetTS(); + DMA_ResetTS(); + GPU->ResetTS(); + FIO->ResetTS(); + + RebaseTS(timestamp); + + espec->MasterCycles = timestamp; + + if(psf_loader) + { + if(!espec->skip) + { + espec->LineWidths[0] = ~0; + Player_Draw(espec->surface, &espec->DisplayRect, 0, espec->SoundBuf, espec->SoundBufSize); + } + } + + // Save memcards if dirty. + for(int i = 0; i < 8; i++) + { + uint64 new_dc = FIO->GetMemcardDirtyCount(i); + + if(new_dc > Memcard_PrevDC[i]) + { + Memcard_PrevDC[i] = new_dc; + Memcard_SaveDelay[i] = 0; + } + + if(Memcard_SaveDelay[i] >= 0) + { + Memcard_SaveDelay[i] += timestamp; + if(Memcard_SaveDelay[i] >= (33868800 * 2)) // Wait until about 2 seconds of no new writes. + { + PSX_DBG(PSX_DBG_SPARSE, "Saving memcard %d...\n", i); + try + { + char ext[64]; + trio_snprintf(ext, sizeof(ext), "%d.mcr", i); + FIO->SaveMemcard(i, MDFN_MakeFName(MDFNMKF_SAV, 0, ext)); + Memcard_SaveDelay[i] = -1; + Memcard_PrevDC[i] = 0; + } + catch(std::exception &e) + { + MDFN_PrintError("Memcard %d save error: %s", i, e.what()); + MDFN_DispMessage("Memcard %d save error: %s", i, e.what()); + } + } + } + } +} + +static bool CalcRegion_By_SYSTEMCNF(CDIF *c, unsigned *rr) +{ + try + { + uint8 pvd[2048]; + unsigned pvd_search_count = 0; + std::unique_ptr fp(c->MakeStream(0, ~0U)); + + fp->seek(0x8000, SEEK_SET); + + do + { + if((pvd_search_count++) == 32) + throw MDFN_Error(0, "PVD search count limit met."); + + fp->read(pvd, 2048); + + if(memcmp(&pvd[1], "CD001", 5)) + throw MDFN_Error(0, "Not ISO-9660"); + + if(pvd[0] == 0xFF) + throw MDFN_Error(0, "Missing Primary Volume Descriptor"); + } while(pvd[0] != 0x01); + //[156 ... 189], 34 bytes + uint32 rdel = MDFN_de32lsb(&pvd[0x9E]); + uint32 rdel_len = MDFN_de32lsb(&pvd[0xA6]); + + if(rdel_len >= (1024 * 1024 * 10)) // Arbitrary sanity check. + throw MDFN_Error(0, "Root directory table too large"); + + fp->seek((int64)rdel * 2048, SEEK_SET); + //printf("%08x, %08x\n", rdel * 2048, rdel_len); + while(fp->tell() < (((uint64)rdel * 2048) + rdel_len)) + { + uint8 len_dr = fp->get_u8(); + uint8 dr[256 + 1]; + + memset(dr, 0xFF, sizeof(dr)); + + if(!len_dr) + break; + + memset(dr, 0, sizeof(dr)); + dr[0] = len_dr; + fp->read(dr + 1, len_dr - 1); + + uint8 len_fi = dr[0x20]; + + if(len_fi == 12 && !memcmp(&dr[0x21], "SYSTEM.CNF;1", 12)) + { + uint32 file_lba = MDFN_de32lsb(&dr[0x02]); + //uint32 file_len = MDFN_de32lsb(&dr[0x0A]); + uint8 fb[2048 + 1]; + char *bootpos; + + memset(fb, 0, sizeof(fb)); + fp->seek(file_lba * 2048, SEEK_SET); + fp->read(fb, 2048); + + bootpos = strstr((char*)fb, "BOOT") + 4; + while(*bootpos == ' ' || *bootpos == '\t') bootpos++; + if(*bootpos == '=') + { + bootpos++; + while(*bootpos == ' ' || *bootpos == '\t') bootpos++; + if(!strncasecmp(bootpos, "cdrom:", 6)) + { + bootpos += 6; + + while(*bootpos == '\\') + bootpos++; + + char *tmp; + + if((tmp = strchr(bootpos, '_'))) *tmp = 0; + if((tmp = strchr(bootpos, '.'))) *tmp = 0; + if((tmp = strchr(bootpos, ';'))) *tmp = 0; + //puts(bootpos); + + if(strlen(bootpos) == 4 && toupper(bootpos[0]) == 'S' && (toupper(bootpos[1]) == 'C' || toupper(bootpos[1]) == 'L' || toupper(bootpos[1]) == 'I')) + { + switch(toupper(bootpos[2])) + { + case 'E': *rr = REGION_EU; + return(true); + + case 'U': *rr = REGION_NA; + return(true); + + case 'K': // Korea? + case 'B': + case 'P': *rr = REGION_JP; + return(true); + } + } + } + } + } + } + } + catch(std::exception &e) + { + //puts(e.what()); + } + catch(...) + { + + } + + return(false); +} + +static bool CalcRegion_By_SA(const uint8 buf[2048 * 8], unsigned* region) +{ + uint8 fbuf[2048 + 1]; + unsigned ipos, opos; + + memset(fbuf, 0, sizeof(fbuf)); + + for(ipos = 0, opos = 0; ipos < 0x48; ipos++) + { + if(buf[ipos] > 0x20 && buf[ipos] < 0x80) + { + fbuf[opos++] = tolower(buf[ipos]); + } + } + + fbuf[opos++] = 0; + + PSX_DBG(PSX_DBG_SPARSE, "License string: %s\n", (char *)fbuf); + + if(strstr((char *)fbuf, "licensedby") != NULL) + { + if(strstr((char *)fbuf, "america") != NULL) + { + *region = REGION_NA; + return(true); + } + else if(strstr((char *)fbuf, "europe") != NULL) + { + *region = REGION_EU; + return(true); + } + else if(strstr((char *)fbuf, "japan") != NULL) + { + *region = REGION_JP; + return(true); + } + else if(strstr((char *)fbuf, "sonycomputerentertainmentinc.") != NULL) + { + *region = REGION_JP; + return(true); + } + } + + return(false); +} + + +// +// Returns true if constraint applied(*region changed), false otherwise. +// +static bool ConstrainRegion_By_SA(const uint8 buf[2048 * 8], unsigned* region) +{ + // + // If we're going with Japanese region, + // make sure the licensed-by string is correct(Japanese BIOS is kinda strict). + // + if(*region == REGION_JP) + { + static const char tv[2][0x41] = { + { 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 105, 99, 101, 110, 115, + 101, 100, 32, 32, 98, 121, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 83, 111, 110, 121, 32, 67, 111, 109, 112, 117, 116, 101, 114, 32, 69, 110, + 116, 101, 114, 116, 97, 105, 110, 109, 101, 110, 116, 32, 73, 110, 99, 46, + 0 + }, + { 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 105, 99, 101, 110, 115, + 101, 100, 32, 32, 98, 121, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 83, 111, 110, 121, 32, 67, 111, 109, 112, 117, 116, 101, 114, 32, 69, 110, + 116, 101, 114, 116, 97, 105, 110, 109, 101, 110, 116, 32, 73, 110, 99, 46, + 10 + }, + }; + bool jp_incompatible = false; + + if(memcmp(&buf[0], &tv[0][0], 0x41) && memcmp(&buf[0], &tv[1][0], 0x41)) + jp_incompatible = true; + + if(crc32(0, &buf[0x800], 0x3278) != 0x0069c087) + jp_incompatible = true; + + if(jp_incompatible) + { + // + // Doesn't match, so default to most similar region, NA. + // + *region = REGION_NA; + return(true); + } + } + + return(false); +} + +static const char* Region_To_SCEx(const unsigned region) +{ + switch(region) + { + default: + abort(); + + case REGION_JP: + return("SCEI"); + + case REGION_NA: + return("SCEA"); + + case REGION_EU: + return("SCEE"); + } +} + +static bool TestMagic(MDFNFILE *fp) +{ + if(PSFLoader::TestMagic(0x01, fp->stream())) + return(true); + + fp->rewind(); + + uint8 exe_header[0x800]; + if(fp->read(exe_header, 0x800, false) == 0x800 && !memcmp(exe_header, "PS-X EXE", 8)) + return true; + + return false; +} + +static bool TestMagicCD(std::vector *CDInterfaces) +{ + std::unique_ptr buf(new uint8[2048 * 8]); + + if((*CDInterfaces)[0]->ReadSector(&buf[0], 4, 8, true) != 0x2) + return(false); + + if(strncmp((char *)&buf[10], "Licensed by", strlen("Licensed by")) && crc32(0, &buf[0x800], 0x3278) != 0x0069c087) + return(false); + + return(true); +} + + +static unsigned CalcDiscSCEx(void) +{ + const unsigned region_default = MDFN_GetSettingI("psx.region_default"); + bool found_ps1_disc = false; + bool did_constraint = false; + unsigned ret_region = region_default; + unsigned region = region_default; + + cdifs_scex_ids.clear(); + + for(unsigned i = 0; i < (cdifs ? cdifs->size() : 0); i++) + { + std::unique_ptr buf(new uint8[2048 * 8]); + bool is_ps1_disc = true; + + // + // Read the PS1 system area. + // + if((*cdifs)[i]->ReadSector(buf.get(), 4, 8) == 0x2) + { + if(!CalcRegion_By_SYSTEMCNF((*cdifs)[i], ®ion)) + { + if(!CalcRegion_By_SA(buf.get(), ®ion)) + { + if(strncmp((char *)buf.get() + 10, "Licensed by", strlen("Licensed by")) && crc32(0, &buf[0x800], 0x3278) != 0x0069c087) + { + // + // Last-ditch effort before deciding the disc isn't a PS1 disc. + // + uint8 pvd[2048]; + + if((*cdifs)[i]->ReadSector(pvd, 16, 1) != 0x2 || memcmp(&pvd[0], "\x01" "CD001", 6) || memcmp(&pvd[8], "PLAYSTATION", 11)) + is_ps1_disc = false; + } + } + } + } + else + is_ps1_disc = false; + + // + // If PS1 disc, apply any constraints and change the region as necessary(e.g. Japanese PS1 BIOS is strict about the structure of the system area); + // especially necessary for homebrew that failed automatic region detection above. + // + if(is_ps1_disc) + { + if(!found_ps1_disc || did_constraint) + { + if(ConstrainRegion_By_SA(buf.get(), ®ion)) + did_constraint = true; + } + } + + // + // Determine what sort of PS1 to emulate based on the first PS1 disc in the set. + // + if(!found_ps1_disc) + ret_region = region; + + found_ps1_disc |= is_ps1_disc; + cdifs_scex_ids.push_back(is_ps1_disc ? Region_To_SCEx(region) : NULL); + } + + if(cdifs_scex_ids.size()) + { + MDFN_printf(_("Emulated Disc SCEx IDs:\n")); + { + MDFN_AutoIndent aind(1); + + for(size_t x = 0; x < cdifs_scex_ids.size(); x++) + { + MDFN_printf(_("Disc %zu: %s\n"), x + 1, (cdifs_scex_ids[x] ? cdifs_scex_ids[x] : _("(Not recognized as a PS1 disc)"))); + } + } + } + + return ret_region; +} + +static void DiscSanityChecks(void) +{ + if(!cdifs) + return; + + assert(cdifs->size() == cdifs_scex_ids.size()); + + for(size_t i = 0; i < cdifs_scex_ids.size(); i++) + { + // + // Sanity check to ensure Q subchannel timing data relative to mode1/mode2 header timing data is as we expect it to be for a PS1 disc. + // + if(cdifs_scex_ids[i]) + { + bool did_check = false; + + for(int32 lba = -8; lba < 16; lba++) + { + uint8 rawbuf[2352 + 96]; + + if((*cdifs)[i]->ReadRawSector(rawbuf, lba)) + { + uint8 qbuf[12]; + + CDUtility::subq_deinterleave(rawbuf + 2352, qbuf); + if(CDUtility::subq_check_checksum(qbuf) && (qbuf[0] & 0xF) == CDUtility::ADR_CURPOS) + { + uint8 qm = qbuf[7]; + uint8 qs = qbuf[8]; + uint8 qf = qbuf[9]; + + uint8 hm = rawbuf[12]; + uint8 hs = rawbuf[13]; + uint8 hf = rawbuf[14]; + + uint8 lm, ls, lf; + + CDUtility::LBA_to_AMSF(lba, &lm, &ls, &lf); + lm = CDUtility::U8_to_BCD(lm); + ls = CDUtility::U8_to_BCD(ls); + lf = CDUtility::U8_to_BCD(lf); + + if(qm != hm || qs != hs || qf != hf) + { + throw MDFN_Error(0, _("Disc %zu of %zu: Q-subchannel versus sector header absolute time mismatch at lba=%d; Q subchannel: %02x:%02x:%02x, Sector header: %02x:%02x:%02x"), + i + 1, cdifs->size(), + lba, + qm, qs, qf, + hm, hs, hf); + } + + if(lm != hm || ls != hs || lf != hf) + { + throw MDFN_Error(0, _("Disc %zu of %zu: Sector header absolute time broken at lba=%d(%02x:%02x:%02x); Sector header: %02x:%02x:%02x"), + i + 1, cdifs->size(), + lba, + lm, ls, lf, + hm, hs, hf); + } + + if(lba >= 0) + did_check = true; + } + } + } + + if(!did_check) + { + throw MDFN_Error(0, _("Disc %zu of %zu: No valid Q subchannel ADR_CURPOS data present at lba 0-15?!"), i + 1, cdifs->size()); + } + } + } +} + +static void InitCommon(std::vector *CDInterfaces, const bool EmulateMemcards = true, const bool WantPIOMem = false) +{ + unsigned region; + int sls, sle; + +#if PSX_DBGPRINT_ENABLE + psx_dbg_level = MDFN_GetSettingUI("psx.dbg_level"); +#endif + + cdifs = CDInterfaces; + region = CalcDiscSCEx(); + if(MDFN_GetSettingB("psx.cd_sanity")) + DiscSanityChecks(); + else + MDFN_printf(_("WARNING: CD (image) sanity checks disabled.")); + + if(!MDFN_GetSettingB("psx.region_autodetect")) + region = MDFN_GetSettingI("psx.region_default"); + + MDFN_printf("\n"); + + for(auto const* rle = Region_List; rle->string; rle++) + { + if((unsigned)rle->number == region) + { + MDFN_printf(_("Region: %s\n"), rle->description); + break; + } + } + + sls = MDFN_GetSettingI((region == REGION_EU) ? "psx.slstartp" : "psx.slstart"); + sle = MDFN_GetSettingI((region == REGION_EU) ? "psx.slendp" : "psx.slend"); + + if(sls > sle) + { + int tmp = sls; + sls = sle; + sle = tmp; + } + + CPU = new PS_CPU(); + SPU = new PS_SPU(); + GPU = new PS_GPU(region == REGION_EU, sls, sle, MDFN_GetSettingB("psx.h_overscan")); + CDC = new PS_CDC(); + FIO = new FrontIO(); + + MDFN_printf("\n"); + for(unsigned pp = 0; pp < 2; pp++) + { + char buf[64]; + bool sv; + + trio_snprintf(buf, sizeof(buf), "psx.input.pport%u.multitap", pp + 1); + sv = MDFN_GetSettingB(buf); + FIO->SetMultitap(pp, sv); + + MDFN_printf(_("Multitap on PSX Port %u: %s\n"), pp + 1, sv ? _("Enabled") : _("Disabled")); + } + + FIO->SetAMCT(MDFN_GetSettingB("psx.input.analog_mode_ct")); + for(unsigned i = 0; i < 8; i++) + { + char buf[64]; + + trio_snprintf(buf, sizeof(buf), "psx.input.port%u.gun_chairs", i + 1); + FIO->SetCrosshairsColor(i, MDFN_GetSettingUI(buf)); + + { + bool mcsv; + + trio_snprintf(buf, sizeof(buf), "psx.input.port%u.memcard", i + 1); + mcsv = EmulateMemcards && MDFN_GetSettingB(buf); + FIO->SetMemcard(i, mcsv); + + //MDFN_printf(_("Memcard on Virtual Port %u: %s\n"), i + 1, mcsv ? _("Enabled") : _("Disabled")); + } + } + + DMA_Init(); + + GPU->FillVideoParams(&EmulatedPSX); + + CDC->SetDisc(true, NULL, NULL); + + BIOSROM = new MultiAccessSizeMem<512 * 1024, false>(); + + if(WantPIOMem) + PIOMem = new MultiAccessSizeMem<65536, false>(); + else + PIOMem = NULL; + + for(uint32 ma = 0x00000000; ma < 0x00800000; ma += 2048 * 1024) + { + CPU->SetFastMap(MainRAM.data8, 0x00000000 + ma, 2048 * 1024); + CPU->SetFastMap(MainRAM.data8, 0x80000000 + ma, 2048 * 1024); + CPU->SetFastMap(MainRAM.data8, 0xA0000000 + ma, 2048 * 1024); + } + + CPU->SetFastMap(BIOSROM->data8, 0x1FC00000, 512 * 1024); + CPU->SetFastMap(BIOSROM->data8, 0x9FC00000, 512 * 1024); + CPU->SetFastMap(BIOSROM->data8, 0xBFC00000, 512 * 1024); + + if(PIOMem) + { + CPU->SetFastMap(PIOMem->data8, 0x1F000000, 65536); + CPU->SetFastMap(PIOMem->data8, 0x9F000000, 65536); + CPU->SetFastMap(PIOMem->data8, 0xBF000000, 65536); + } + + + MDFNMP_Init(1024, ((uint64)1 << 29) / 1024); + MDFNMP_AddRAM(2048 * 1024, 0x00000000, MainRAM.data8); + //MDFNMP_AddRAM(1024, 0x1F800000, ScratchRAM.data8); + + // + // + // + const char *biospath_sname; + + if(region == REGION_JP) + biospath_sname = "psx.bios_jp"; + else if(region == REGION_EU) + biospath_sname = "psx.bios_eu"; + else if(region == REGION_NA) + biospath_sname = "psx.bios_na"; + else + abort(); + + { + std::string biospath = MDFN_MakeFName(MDFNMKF_FIRMWARE, 0, MDFN_GetSettingS(biospath_sname)); + FileStream BIOSFile(biospath, FileStream::MODE_READ); + + if(BIOSFile.size() != 524288) + throw MDFN_Error(0, _("BIOS file \"%s\" is of an incorrect size."), biospath.c_str()); + + BIOSFile.read(BIOSROM->data8, 512 * 1024); + BIOS_SHA256 = sha256(BIOSROM->data8, 512 * 1024); + + if(MDFN_GetSettingB("psx.bios_sanity")) + { + bool bios_recognized = false; + + for(auto const& dbe : BIOS_DB) + { + if(BIOS_SHA256 == dbe.sd) + { + if(dbe.bad) + throw MDFN_Error(0, _("BIOS file \"%s\" is a known bad dump."), biospath.c_str()); + + if(dbe.region != region) + throw MDFN_Error(0, _("BIOS file \"%s\" is not the proper BIOS for the region of PS1 being emulated."), biospath.c_str()); + + bios_recognized = true; + break; + } + } + + if(!bios_recognized) + MDFN_printf(_("Warning: Unrecognized BIOS.\n")); + } + else + MDFN_printf(_("WARNING: BIOS ROM sanity checks disabled.\n")); + } + + for(int i = 0; i < 8; i++) + { + char ext[64]; + trio_snprintf(ext, sizeof(ext), "%d.mcr", i); + FIO->LoadMemcard(i, MDFN_MakeFName(MDFNMKF_SAV, 0, ext)); + } + + for(int i = 0; i < 8; i++) + { + Memcard_PrevDC[i] = FIO->GetMemcardDirtyCount(i); + Memcard_SaveDelay[i] = -1; + } + + + #ifdef WANT_DEBUGGER + DBG_Init(); + #endif + + PSX_Reset(true); +} + +static void LoadEXE(Stream* fp, bool ignore_pcsp = false) +{ + uint8 raw_header[0x800]; + uint32 PC; + uint32 SP; + uint32 TextStart; + uint32 TextSize; + + fp->read(raw_header, sizeof(raw_header)); + + PC = MDFN_de32lsb(&raw_header[0x10]); + SP = MDFN_de32lsb(&raw_header[0x30]); + TextStart = MDFN_de32lsb(&raw_header[0x18]); + TextSize = MDFN_de32lsb(&raw_header[0x1C]); + + if(ignore_pcsp) + MDFN_printf("TextStart=0x%08x\nTextSize=0x%08x\n", TextStart, TextSize); + else + MDFN_printf("PC=0x%08x\nSP=0x%08x\nTextStart=0x%08x\nTextSize=0x%08x\n", PC, SP, TextStart, TextSize); + + TextStart &= 0x1FFFFF; + + if(TextSize > 2048 * 1024) + { + throw(MDFN_Error(0, "Text section too large")); + } + + //if(TextSize > (size - 0x800)) + // throw(MDFN_Error(0, "Text section recorded size is larger than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800)); + + //if(TextSize < (size - 0x800)) + // throw(MDFN_Error(0, "Text section recorded size is smaller than data available in file. Header=0x%08x, Available=0x%08x", TextSize, size - 0x800)); + + if(!TextMem.size()) + { + TextMem_Start = TextStart; + TextMem.resize(TextSize); + } + + if(TextStart < TextMem_Start) + { + uint32 old_size = TextMem.size(); + + //printf("RESIZE: 0x%08x\n", TextMem_Start - TextStart); + + TextMem.resize(old_size + TextMem_Start - TextStart); + memmove(&TextMem[TextMem_Start - TextStart], &TextMem[0], old_size); + + TextMem_Start = TextStart; + } + + if(TextMem.size() < (TextStart - TextMem_Start + TextSize)) + TextMem.resize(TextStart - TextMem_Start + TextSize); + + fp->read(&TextMem[TextStart - TextMem_Start], TextSize); + + { + uint64 extra_data = fp->read_discard(); + + if(extra_data > 0) + throw MDFN_Error(0, _("0x%08llx bytes of extra data after EXE text section."), (unsigned long long)extra_data); + } + + // + // + // + + // BIOS patch + BIOSROM->WriteU32(0x6990, (3 << 26) | ((0xBF001000 >> 2) & ((1 << 26) - 1))); +// BIOSROM->WriteU32(0x691C, (3 << 26) | ((0xBF001000 >> 2) & ((1 << 26) - 1))); + +// printf("INSN: 0x%08x\n", BIOSROM->ReadU32(0x6990)); +// exit(1); + uint8 *po; + + po = &PIOMem->data8[0x0800]; + + MDFN_en32lsb(po, (0x0 << 26) | (31 << 21) | (0x8 << 0)); // JR + po += 4; + MDFN_en32lsb(po, 0); // NOP(kinda) + po += 4; + + po = &PIOMem->data8[0x1000]; + + // Load cacheable-region target PC into r2 + MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (0x9F001010 >> 16)); // LUI + po += 4; + MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (0x9F001010 & 0xFFFF)); // ORI + po += 4; + + // Jump to r2 + MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0)); // JR + po += 4; + MDFN_en32lsb(po, 0); // NOP(kinda) + po += 4; + + // + // 0x9F001010: + // + + // Load source address into r8 + uint32 sa = 0x9F000000 + 65536; + MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (sa >> 16)); // LUI + po += 4; + MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (8 << 16) | (sa & 0xFFFF)); // ORI + po += 4; + + // Load dest address into r9 + MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (TextMem_Start >> 16)); // LUI + po += 4; + MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (9 << 16) | (TextMem_Start & 0xFFFF)); // ORI + po += 4; + + // Load size into r10 + MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (TextMem.size() >> 16)); // LUI + po += 4; + MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (10 << 16) | (TextMem.size() & 0xFFFF)); // ORI + po += 4; + + // + // Loop begin + // + + MDFN_en32lsb(po, (0x24 << 26) | (8 << 21) | (1 << 16)); // LBU to r1 + po += 4; + + MDFN_en32lsb(po, (0x08 << 26) | (10 << 21) | (10 << 16) | 0xFFFF); // Decrement size + po += 4; + + MDFN_en32lsb(po, (0x28 << 26) | (9 << 21) | (1 << 16)); // SB from r1 + po += 4; + + MDFN_en32lsb(po, (0x08 << 26) | (8 << 21) | (8 << 16) | 0x0001); // Increment source addr + po += 4; + + MDFN_en32lsb(po, (0x05 << 26) | (0 << 21) | (10 << 16) | (-5 & 0xFFFF)); + po += 4; + MDFN_en32lsb(po, (0x08 << 26) | (9 << 21) | (9 << 16) | 0x0001); // Increment dest addr + po += 4; + + // + // Loop end + // + + // Load SP into r29 + if(ignore_pcsp) + { + po += 16; + } + else + { + MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (SP >> 16)); // LUI + po += 4; + MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (29 << 16) | (SP & 0xFFFF)); // ORI + po += 4; + + // Load PC into r2 + MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | ((PC >> 16) | 0x8000)); // LUI + po += 4; + MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (PC & 0xFFFF)); // ORI + po += 4; + } + + // Half-assed instruction cache flush. ;) + for(unsigned i = 0; i < 1024; i++) + { + MDFN_en32lsb(po, 0); + po += 4; + } + + + + // Jump to r2 + MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0)); // JR + po += 4; + MDFN_en32lsb(po, 0); // NOP(kinda) + po += 4; +} + +PSF1Loader::PSF1Loader(Stream *fp) +{ + tags = Load(0x01, 2033664, fp); +} + +PSF1Loader::~PSF1Loader() +{ + +} + +void PSF1Loader::HandleEXE(Stream* fp, bool ignore_pcsp) +{ + LoadEXE(fp, ignore_pcsp); +} + +static void Cleanup(void); +static void Load(MDFNFILE *fp) +{ + try + { + const bool IsPSF = PSFLoader::TestMagic(0x01, fp->stream()); + + if(!TestMagic(fp)) + throw MDFN_Error(0, _("File format is unknown to module \"%s\"."), MDFNGameInfo->shortname); + + fp->rewind(); + + if(MDFN_GetSettingS("psx.dbg_exe_cdpath") != "") // For testing/debug purposes. + { + RMD_Drive dr; + + dr.Name = std::string("Virtual CD Drive"); + dr.PossibleStates.push_back(RMD_State({"Tray Open", false, false, true})); + dr.PossibleStates.push_back(RMD_State({"Tray Closed (Empty)", false, false, false})); + dr.PossibleStates.push_back(RMD_State({"Tray Closed", true, true, false})); + dr.CompatibleMedia.push_back(0); + dr.MediaMtoPDelay = 2000; + + MDFNGameInfo->RMD->Drives.push_back(dr); + MDFNGameInfo->RMD->MediaTypes.push_back(RMD_MediaType({"CD"})); + MDFNGameInfo->RMD->Media.push_back(RMD_Media({"Test CD", 0})); + + static std::vector CDInterfaces; + CDInterfaces.push_back(CDIF_Open(MDFN_GetSettingS("psx.dbg_exe_cdpath").c_str(), false)); + InitCommon(&CDInterfaces, !IsPSF, true); + } + else + InitCommon(NULL, !IsPSF, true); + + TextMem.resize(0); + + if(IsPSF) + { + psf_loader = new PSF1Loader(fp->stream()); + + std::vector SongNames; + + SongNames.push_back(psf_loader->tags.GetTag("title")); + + Player_Init(1, psf_loader->tags.GetTag("game"), psf_loader->tags.GetTag("artist"), psf_loader->tags.GetTag("copyright"), SongNames); + } + else + LoadEXE(fp->stream()); + } + catch(std::exception &e) + { + Cleanup(); + throw; + } +} + +static void LoadCD(std::vector *CDInterfaces) +{ + try + { + InitCommon(CDInterfaces); + } + catch(std::exception &e) + { + Cleanup(); + throw; + } +} + +static void Cleanup(void) +{ + TextMem.resize(0); + + if(psf_loader) + { + delete psf_loader; + psf_loader = NULL; + } + + if(CDC) + { + delete CDC; + CDC = NULL; + } + + if(SPU) + { + delete SPU; + SPU = NULL; + } + + if(GPU) + { + delete GPU; + GPU = NULL; + } + + if(CPU) + { + delete CPU; + CPU = NULL; + } + + if(FIO) + { + delete FIO; + FIO = NULL; + } + + DMA_Kill(); + + if(BIOSROM) + { + delete BIOSROM; + BIOSROM = NULL; + } + + if(PIOMem) + { + delete PIOMem; + PIOMem = NULL; + } + + cdifs = NULL; +} + +static void CloseGame(void) +{ + if(!psf_loader) + { + for(int i = 0; i < 8; i++) + { + // If there's an error saving one memcard, don't skip trying to save the other, since it might succeed and + // we can reduce potential data loss! + try + { + char ext[64]; + trio_snprintf(ext, sizeof(ext), "%d.mcr", i); + + FIO->SaveMemcard(i, MDFN_MakeFName(MDFNMKF_SAV, 0, ext)); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + } + } + + Cleanup(); +} + + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + if(psf_loader) + FIO->SetInput(port, "none", NULL); + else + FIO->SetInput(port, type, ptr); +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + if(!data_only) + { + sha256_digest sr_dig = BIOS_SHA256; + + SFORMAT SRDStateRegs[] = + { + SFARRAY(sr_dig.data(), sr_dig.size()), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, SRDStateRegs, "BIOS_HASH", true); + + if(load && sr_dig != BIOS_SHA256) + throw MDFN_Error(0, _("BIOS hash mismatch(save state created under a different BIOS)!")); + } + + + SFORMAT StateRegs[] = + { + SFARRAY(MainRAM.data8, 1024 * 2048), + SFARRAY32(SysControl.Regs, 9), + + SFVAR(PSX_PRNG.lcgo), + SFVAR(PSX_PRNG.x), + SFVAR(PSX_PRNG.y), + SFVAR(PSX_PRNG.z), + SFVAR(PSX_PRNG.c), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + CPU->StateAction(sm, load, data_only); + DMA_StateAction(sm, load, data_only); + TIMER_StateAction(sm, load, data_only); + SIO_StateAction(sm, load, data_only); + + CDC->StateAction(sm, load, data_only); + MDEC_StateAction(sm, load, data_only); + GPU->StateAction(sm, load, data_only); + SPU->StateAction(sm, load, data_only); + + FIO->StateAction(sm, load, data_only); + + IRQ_StateAction(sm, load, data_only); // Do it last. + + if(load) + { + ForceEventUpdates(0); // FIXME to work with debugger step mode. + } +} + +static bool SetMedia(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{ + const RMD_Layout* rmd = EmulatedPSX.RMD; + const RMD_Drive* rd = &rmd->Drives[drive_idx]; + const RMD_State* rs = &rd->PossibleStates[state_idx]; + + //printf("%d %d %d %d\n", drive_idx, state_idx, media_idx, orientation_idx); + + if(rs->MediaPresent && rs->MediaUsable) + { + CDC->SetDisc(false, (*cdifs)[media_idx], cdifs_scex_ids[media_idx]); + } + else + { + CDC->SetDisc(rs->MediaCanChange, NULL, NULL); + } + + return(true); +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_RESET: PSX_Reset(false); break; + case MDFN_MSC_POWER: PSX_Reset(true); break; + } +} + +static void GSCondCode(MemoryPatch* patch, const char* cc, const unsigned len, const uint32 addr, const uint16 val) +{ + char tmp[256]; + + if(patch->conditions.size() > 0) + patch->conditions.append(", "); + + if(len == 2) + trio_snprintf(tmp, 256, "%u L 0x%08x %s 0x%04x", len, addr, cc, val & 0xFFFFU); + else + trio_snprintf(tmp, 256, "%u L 0x%08x %s 0x%02x", len, addr, cc, val & 0xFFU); + + patch->conditions.append(tmp); +} + +static bool DecodeGS(const std::string& cheat_string, MemoryPatch* patch) +{ + uint64 code = 0; + unsigned nybble_count = 0; + + for(unsigned i = 0; i < cheat_string.size(); i++) + { + if(cheat_string[i] == ' ' || cheat_string[i] == '-' || cheat_string[i] == ':') + continue; + + nybble_count++; + code <<= 4; + + if(cheat_string[i] >= '0' && cheat_string[i] <= '9') + code |= cheat_string[i] - '0'; + else if(cheat_string[i] >= 'a' && cheat_string[i] <= 'f') + code |= cheat_string[i] - 'a' + 0xA; + else if(cheat_string[i] >= 'A' && cheat_string[i] <= 'F') + code |= cheat_string[i] - 'A' + 0xA; + else + { + if(cheat_string[i] & 0x80) + throw MDFN_Error(0, _("Invalid character in GameShark code.")); + else + throw MDFN_Error(0, _("Invalid character in GameShark code: %c"), cheat_string[i]); + } + } + + if(nybble_count != 12) + throw MDFN_Error(0, _("GameShark code is of an incorrect length.")); + + const uint8 code_type = code >> 40; + const uint64 cl = code & 0xFFFFFFFFFFULL; + + patch->bigendian = false; + patch->compare = 0; + + if(patch->type == 'T') + { + if(code_type != 0x80) + throw MDFN_Error(0, _("Unrecognized GameShark code type for second part to copy bytes code.")); + + patch->addr = cl >> 16; + return(false); + } + + switch(code_type) + { + default: + throw MDFN_Error(0, _("GameShark code type 0x%02X is currently not supported."), code_type); + + return(false); + + // + // + // TODO: + case 0x10: // 16-bit increment + patch->length = 2; + patch->type = 'A'; + patch->addr = cl >> 16; + patch->val = cl & 0xFFFF; + return(false); + + case 0x11: // 16-bit decrement + patch->length = 2; + patch->type = 'A'; + patch->addr = cl >> 16; + patch->val = (0 - cl) & 0xFFFF; + return(false); + + case 0x20: // 8-bit increment + patch->length = 1; + patch->type = 'A'; + patch->addr = cl >> 16; + patch->val = cl & 0xFF; + return(false); + + case 0x21: // 8-bit decrement + patch->length = 1; + patch->type = 'A'; + patch->addr = cl >> 16; + patch->val = (0 - cl) & 0xFF; + return(false); + // + // + // + + case 0x30: // 8-bit constant + patch->length = 1; + patch->type = 'R'; + patch->addr = cl >> 16; + patch->val = cl & 0xFF; + return(false); + + case 0x80: // 16-bit constant + patch->length = 2; + patch->type = 'R'; + patch->addr = cl >> 16; + patch->val = cl & 0xFFFF; + return(false); + + case 0x50: // Repeat thingy + { + const uint8 wcount = (cl >> 24) & 0xFF; + const uint8 addr_inc = (cl >> 16) & 0xFF; + const uint8 val_inc = (cl >> 0) & 0xFF; + + patch->mltpl_count = wcount; + patch->mltpl_addr_inc = addr_inc; + patch->mltpl_val_inc = val_inc; + } + return(true); + + case 0xC2: // Copy + { + const uint16 ccount = cl & 0xFFFF; + + patch->type = 'T'; + patch->val = 0; + patch->length = 1; + + patch->copy_src_addr = cl >> 16; + patch->copy_src_addr_inc = 1; + + patch->mltpl_count = ccount; + patch->mltpl_addr_inc = 1; + patch->mltpl_val_inc = 0; + } + return(true); + + case 0xD0: // 16-bit == condition + GSCondCode(patch, "==", 2, cl >> 16, cl); + return(true); + + case 0xD1: // 16-bit != condition + GSCondCode(patch, "!=", 2, cl >> 16, cl); + return(true); + + case 0xD2: // 16-bit < condition + GSCondCode(patch, "<", 2, cl >> 16, cl); + return(true); + + case 0xD3: // 16-bit > condition + GSCondCode(patch, ">", 2, cl >> 16, cl); + return(true); + + + + case 0xE0: // 8-bit == condition + GSCondCode(patch, "==", 1, cl >> 16, cl); + return(true); + + case 0xE1: // 8-bit != condition + GSCondCode(patch, "!=", 1, cl >> 16, cl); + return(true); + + case 0xE2: // 8-bit < condition + GSCondCode(patch, "<", 1, cl >> 16, cl); + return(true); + + case 0xE3: // 8-bit > condition + GSCondCode(patch, ">", 1, cl >> 16, cl); + return(true); + + } +} + +static CheatFormatStruct CheatFormats[] = +{ + { "GameShark", gettext_noop("Sharks with lamprey eels for eyes."), DecodeGS }, +}; + +static CheatFormatInfoStruct CheatFormatInfo = +{ + 1, + CheatFormats +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".psf", gettext_noop("PSF1 Rip") }, + { ".minipsf", gettext_noop("MiniPSF1 Rip") }, + { ".psx", gettext_noop("PS-X Executable") }, + { ".exe", gettext_noop("PS-X Executable") }, + { NULL, NULL } +}; + +static MDFNSetting PSXSettings[] = +{ + { "psx.input.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Emulated mouse sensitivity."), NULL, MDFNST_FLOAT, "1.00", NULL, NULL }, + + { "psx.input.analog_mode_ct", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable analog mode combo-button alternate toggle."), gettext_noop("When enabled, instead of the configured Analog mode toggle button for the emulated DualShock, use a combination of buttons to toggle it instead. When Select, Start, and all four shoulder buttons are held down for about 1 second, the mode will toggle."), MDFNST_BOOL, "0", NULL, NULL }, + + { "psx.input.pport1.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on PSX port 1."), gettext_noop("Makes 3 more virtual ports available.\n\nNOTE: Enabling multitap in games that don't fully support it may cause deleterious effects."), MDFNST_BOOL, "0", NULL, NULL }, //MDFNST_ENUM, "auto", NULL, NULL, NULL, NULL, MultiTap_List }, + { "psx.input.pport2.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on PSX port 2."), gettext_noop("Makes 3 more virtual ports available.\n\nNOTE: Enabling multitap in games that don't fully support it may cause deleterious effects."), MDFNST_BOOL, "0", NULL, NULL }, + + { "psx.input.port1.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 1."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port2.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 2."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port3.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 3."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port4.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 4."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port5.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 5."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port6.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 6."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port7.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 7."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + { "psx.input.port8.memcard", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Emulate memory card on virtual port 8."), NULL, MDFNST_BOOL, "1", NULL, NULL, }, + + + { "psx.input.port1.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 1."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0xFF0000", "0x000000", "0x1000000" }, + { "psx.input.port2.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 2."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0x00FF00", "0x000000", "0x1000000" }, + { "psx.input.port3.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 3."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0xFF00FF", "0x000000", "0x1000000" }, + { "psx.input.port4.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 4."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0xFF8000", "0x000000", "0x1000000" }, + { "psx.input.port5.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 5."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0xFFFF00", "0x000000", "0x1000000" }, + { "psx.input.port6.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 6."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0x00FFFF", "0x000000", "0x1000000" }, + { "psx.input.port7.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 7."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0x0080FF", "0x000000", "0x1000000" }, + { "psx.input.port8.gun_chairs", MDFNSF_NOFLAGS, gettext_noop("Crosshairs color for lightgun on virtual port 8."), gettext_noop("A value of 0x1000000 disables crosshair drawing."), MDFNST_UINT, "0x8000FF", "0x000000", "0x1000000" }, + + { "psx.region_autodetect", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Attempt to auto-detect region of game."), NULL, MDFNST_BOOL, "1" }, + { "psx.region_default", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Default region to use."), gettext_noop("Used if region autodetection fails or is disabled."), MDFNST_ENUM, "jp", NULL, NULL, NULL, NULL, Region_List }, + + { "psx.bios_jp", MDFNSF_EMU_STATE, gettext_noop("Path to the Japan SCPH-5500/v3.0J ROM BIOS"), gettext_noop("SHA-256 9c0421858e217805f4abe18698afea8d5aa36ff0727eb8484944e00eb5e7eadb"), MDFNST_STRING, "scph5500.bin" }, + { "psx.bios_na", MDFNSF_EMU_STATE, gettext_noop("Path to the North America SCPH-5501/v3.0A ROM BIOS"), gettext_noop("SHA-256 11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef"), MDFNST_STRING, "scph5501.bin" }, + { "psx.bios_eu", MDFNSF_EMU_STATE, gettext_noop("Path to the Europe SCPH-5502/v3.0E ROM BIOS"), gettext_noop("SHA-256 1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09"), MDFNST_STRING, "scph5502.bin" }, + + { "psx.bios_sanity", MDFNSF_NOFLAGS, gettext_noop("Enable BIOS ROM image sanity checks."), NULL, MDFNST_BOOL, "1" }, + { "psx.cd_sanity", MDFNSF_NOFLAGS, gettext_noop("Enable CD (image) sanity checks."), gettext_noop("Sanity checks are only performed on discs detected(via heuristics) to be PS1 discs. The checks primarily consist of ensuring that Q subchannel data is as expected for a typical commercially-released PS1 disc."), MDFNST_BOOL, "1" }, + + { "psx.spu.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("SPU output resampler quality."), + gettext_noop("0 is lowest quality and CPU usage, 10 is highest quality and CPU usage. The resampler that this setting refers to is used for converting from 44.1KHz to the sampling rate of the host audio device Mednafen is using. Changing Mednafen's output rate, via the \"sound.rate\" setting, to \"44100\" may bypass the resampler, which can decrease CPU usage by Mednafen, and can increase or decrease audio quality, depending on various operating system and hardware factors."), MDFNST_UINT, "5", "0", "10" }, + + + { "psx.slstart", MDFNSF_NOFLAGS, gettext_noop("First displayed scanline in NTSC mode."), NULL, MDFNST_INT, "0", "0", "239" }, + { "psx.slend", MDFNSF_NOFLAGS, gettext_noop("Last displayed scanline in NTSC mode."), NULL, MDFNST_INT, "239", "0", "239" }, + + { "psx.slstartp", MDFNSF_NOFLAGS, gettext_noop("First displayed scanline in PAL mode."), NULL, MDFNST_INT, "0", "0", "287" }, // 14 + { "psx.slendp", MDFNSF_NOFLAGS, gettext_noop("Last displayed scanline in PAL mode."), NULL, MDFNST_INT, "287", "0", "287" }, // 275 + + { "psx.h_overscan", MDFNSF_NOFLAGS, gettext_noop("Show horizontal overscan area."), NULL, MDFNST_BOOL, "1" }, + +#if PSX_DBGPRINT_ENABLE + { "psx.dbg_level", MDFNSF_NOFLAGS, gettext_noop("Debug printf verbosity level."), NULL, MDFNST_UINT, "0", "0", "4" }, +#endif + + { "psx.dbg_exe_cdpath", MDFNSF_SUPPRESS_DOC, gettext_noop("CD image to use with .PSX/.EXE loading."), NULL, MDFNST_STRING, "" }, + + { NULL }, +}; + +// Note for the future: If we ever support PSX emulation with non-8-bit RGB color components, or add a new linear RGB colorspace to MDFN_PixelFormat, we'll need +// to buffer the intermediate 24-bit non-linear RGB calculation into an array and pass that into the GPULineHook stuff, otherwise netplay could break when +// an emulated GunCon is used. +MDFNGI EmulatedPSX = +{ + "psx", + "Sony PlayStation", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &PSX_DBGInfo, + #else + NULL, + #endif + FIO_PortInfo, + Load, + TestMagic, + LoadCD, + TestMagicCD, + CloseGame, + + NULL, //ToggleLayer, + "GPU\0", //"Background Scroll\0Foreground Scroll\0Sprites\0", + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + &CheatFormatInfo, + false, + StateAction, + Emulate, + NULL, + SetInput, + SetMedia, + DoSimpleCommand, + PSXSettings, + MDFN_MASTERCLOCK_FIXED(33868800), + 0, + + true, // Multires possible? + + // + // Note: Following video settings will be overwritten during game load. + // + 0, // lcm_width + 0, // lcm_height + NULL, // Dummy + + 320, // Nominal width + 240, // Nominal height + + 0, // Framebuffer width + 0, // Framebuffer height + // + // + // + + 2, // Number of output sound channels + +}; diff --git a/Mednafen/mednafen/psx/psx.h b/Mednafen/mednafen/psx/psx.h new file mode 100644 index 0000000000..02128cca17 --- /dev/null +++ b/Mednafen/mednafen/psx/psx.h @@ -0,0 +1,121 @@ +#ifndef __MDFN_PSX_PSX_H +#define __MDFN_PSX_PSX_H + +#include +#include +#include +#include + +#include + +#include "masmem.h" + +// +// Comment out these 2 defines for extra speeeeed. +// +#define PSX_DBGPRINT_ENABLE 1 +#define PSX_EVENT_SYSTEM_CHECKS 1 + +// +// It's highly unlikely the user will want these if they're intentionally compiling without the debugger. +#ifndef WANT_DEBUGGER + #undef PSX_DBGPRINT_ENABLE + #undef PSX_EVENT_SYSTEM_CHECKS +#endif +// +// +// + +namespace MDFN_IEN_PSX +{ + #define PSX_DBG_ERROR 0 // Emulator-level error. + #define PSX_DBG_WARNING 1 // Warning about game doing questionable things/hitting stuff that might not be emulated correctly. + #define PSX_DBG_BIOS_PRINT 2 // BIOS printf/putchar output. + #define PSX_DBG_SPARSE 3 // Sparse(relatively) information debug messages(CDC commands). + #define PSX_DBG_FLOOD 4 // Heavy informational debug messages(GPU commands; TODO). + +#if PSX_DBGPRINT_ENABLE + void PSX_DBG(unsigned level, const char *format, ...) noexcept MDFN_COLD MDFN_FORMATSTR(gnu_printf, 2, 3); + void PSX_DBG_BIOS_PUTC(uint8 c) noexcept; + + #define PSX_WARNING(format, ...) { PSX_DBG(PSX_DBG_WARNING, format "\n", ## __VA_ARGS__); } + #define PSX_DBGINFO(format, ...) { } +#else + static INLINE void PSX_DBG(unsigned level, const char* format, ...) { } + static INLINE void PSX_DBG_BIOS_PUTC(uint8 c) { } + static INLINE void PSX_WARNING(const char* format, ...) { } + static INLINE void PSX_DBGINFO(const char* format, ...) { } +#endif + + typedef int32 pscpu_timestamp_t; + + bool MDFN_FASTCALL PSX_EventHandler(const pscpu_timestamp_t timestamp); + + void MDFN_FASTCALL PSX_MemWrite8(pscpu_timestamp_t timestamp, uint32 A, uint32 V); + void MDFN_FASTCALL PSX_MemWrite16(pscpu_timestamp_t timestamp, uint32 A, uint32 V); + void MDFN_FASTCALL PSX_MemWrite24(pscpu_timestamp_t timestamp, uint32 A, uint32 V); + void MDFN_FASTCALL PSX_MemWrite32(pscpu_timestamp_t timestamp, uint32 A, uint32 V); + + uint8 MDFN_FASTCALL PSX_MemRead8(pscpu_timestamp_t ×tamp, uint32 A); + uint16 MDFN_FASTCALL PSX_MemRead16(pscpu_timestamp_t ×tamp, uint32 A); + uint32 MDFN_FASTCALL PSX_MemRead24(pscpu_timestamp_t ×tamp, uint32 A); + uint32 MDFN_FASTCALL PSX_MemRead32(pscpu_timestamp_t ×tamp, uint32 A); + + uint8 PSX_MemPeek8(uint32 A); + uint16 PSX_MemPeek16(uint32 A); + uint32 PSX_MemPeek32(uint32 A); + + // Should write to WO-locations if possible + void PSX_MemPoke8(uint32 A, uint8 V); + void PSX_MemPoke16(uint32 A, uint16 V); + void PSX_MemPoke32(uint32 A, uint32 V); + + void PSX_RequestMLExit(void); + void ForceEventUpdates(const pscpu_timestamp_t timestamp); + + enum + { + PSX_EVENT__SYNFIRST = 0, + PSX_EVENT_GPU, + PSX_EVENT_CDC, + //PSX_EVENT_SPU, + PSX_EVENT_TIMER, + PSX_EVENT_DMA, + PSX_EVENT_FIO, + PSX_EVENT__SYNLAST, + PSX_EVENT__COUNT, + }; + + #define PSX_EVENT_MAXTS 0x20000000 + void PSX_SetEventNT(const int type, const pscpu_timestamp_t next_timestamp); + + void PSX_SetDMACycleSteal(unsigned stealage); + + void PSX_GPULineHook(const pscpu_timestamp_t timestamp, const pscpu_timestamp_t line_timestamp, bool vsync, uint32 *pixels, const MDFN_PixelFormat* const format, const unsigned width, const unsigned pix_clock_offset, const unsigned pix_clock, const unsigned pix_clock_divider); + + uint32 PSX_GetRandU32(uint32 mina, uint32 maxa); +}; + + +#include "dis.h" +#include "cpu.h" +#include "irq.h" +#include "gpu.h" +#include "dma.h" +//#include "sio.h" +#include "debug.h" + +namespace MDFN_IEN_PSX +{ + class PS_CDC; + class PS_SPU; + + extern PS_CPU *CPU; + extern PS_GPU *GPU; + extern PS_CDC *CDC; + extern PS_SPU *SPU; + extern MultiAccessSizeMem<2048 * 1024, false> MainRAM; +}; + + +#endif diff --git a/Mednafen/mednafen/psx/sio.cpp b/Mednafen/mednafen/psx/sio.cpp new file mode 100644 index 0000000000..b7c6c1f382 --- /dev/null +++ b/Mednafen/mednafen/psx/sio.cpp @@ -0,0 +1,127 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "sio.h" + +namespace MDFN_IEN_PSX +{ + +// Dummy implementation. + +static uint16 Status; +static uint16 Mode; +static uint16 Control; +static uint16 BaudRate; +static uint32 DataBuffer; + +void SIO_Power(void) +{ + Status = 0; + Mode = 0; + Control = 0; + BaudRate = 0; + DataBuffer = 0; +} + +uint32 SIO_Read(pscpu_timestamp_t timestamp, uint32 A) +{ + uint32 ret = 0; + + switch(A & 0xE) + { + default: + PSX_WARNING("[SIO] Unknown read: 0x%08x -- %d\n", A, timestamp); + break; + + case 0x0: + //case 0x2: + ret = DataBuffer >> ((A & 2) * 8); + break; + + case 0x4: + ret = Status; + break; + + case 0x8: + ret = Mode; + break; + + case 0xA: + ret = Control; + break; + + case 0xE: + ret = BaudRate; + break; + } + + return(ret >> ((A & 1) * 8)); +} + +void SIO_Write(pscpu_timestamp_t timestamp, uint32 A, uint32 V) +{ + V <<= (A & 1) * 8; + + switch(A & 0xE) + { + default: + PSX_WARNING("[SIO] Unknown write: 0x%08x 0x%08x -- %d\n", A, V, timestamp); + break; + + case 0x0: + //case 0x2: + V <<= (A & 2) * 8; + DataBuffer = V; + break; + + case 0x8: + Mode = V; + break; + + case 0xA: + Control = V; + break; + + case 0xE: + BaudRate = V; + break; + } +} + +void SIO_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(Status), + SFVAR(Mode), + SFVAR(Control), + SFVAR(BaudRate), + SFVAR(DataBuffer), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "SIO"); + + if(load) + { + + } +} + +} diff --git a/Mednafen/mednafen/psx/sio.h b/Mednafen/mednafen/psx/sio.h new file mode 100644 index 0000000000..1cec5eb72a --- /dev/null +++ b/Mednafen/mednafen/psx/sio.h @@ -0,0 +1,15 @@ +#ifndef __MDFN_PSX_SIO_H +#define __MDFN_PSX_SIO_H + +namespace MDFN_IEN_PSX +{ + +void SIO_Write(pscpu_timestamp_t timestamp, uint32 A, uint32 V); +uint32 SIO_Read(pscpu_timestamp_t timestamp, uint32 A); +void SIO_Power(void); + +void SIO_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +} + +#endif diff --git a/Mednafen/mednafen/psx/spu.cpp b/Mednafen/mednafen/psx/spu.cpp new file mode 100644 index 0000000000..77e420b7b2 --- /dev/null +++ b/Mednafen/mednafen/psx/spu.cpp @@ -0,0 +1,1612 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* TODO: + Note to self: Emulating the SPU at more timing accuracy than sample, and emulating the whole SPU RAM write port FIFO thing and hypothetical periodic FIFO commit to + SPU RAM(maybe every 32 CPU cycles, with exceptions?) will likely necessitate a much more timing-accurate CPU core, and emulation of the SPU delay register(or at least the + effects of the standard value written to it), to avoid game glitches. Probably more trouble than it's worth.... + + SPU IRQ emulation isn't totally correct, behavior is kind of complex; run more tests on PS1. + + Test reverb upsampler on the real thing. + + Alter reverb algorithm to process in the pattern of L,R,L,R,L,R on each input sample, instead of doing both L and R on every 2 input samples(make + sure the real thing does it this way too, I think it at least runs the downsampler this way). + + Alter reverb algorithm to perform saturation more often, as occurs on the real thing. + + See if sample flag & 0x8 does anything weird, like suppressing the program-readable block end flag setting. + + Determine the actual purpose of global register 0x2C(is it REALLY an address multiplier? And if so, does it affect the reverb offsets too?) + + For ADSR and volume sweep, should the divider be reset to 0 on &0x8000 == true, or should the upper bit be cleared? + + Should shift occur on all stages of ADPCM sample decoding, or only at the end? + + On the real thing, there's some kind of weirdness with ADSR when you voice on when attack_rate(raw) = 0x7F; the envelope level register is repeatedly + reset to 0, which you can see by manual writes to the envelope level register. Normally in the attack phase when attack_rate = 0x7F, enveloping is effectively stuck/paused such that the value you write is sticky and won't be replaced or reset. Note that after you voice on, you can write a new attack_rate < 0x7F, and enveloping will work "normally" again shortly afterwards. You can even write an attack_rate of 0x7F at that point to pause enveloping clocking. I doubt any games rely on this, but it's something to keep in mind if we ever need greater insight as to how the SPU functions at a low-level in order to emulate it at cycle granularity rather than sample granularity, and it may not be a bad idea to investigate this oddity further and emulate it in the future regardless. + + Voice 1 and 3 waveform output writes to SPURAM might not be correct(noted due to problems reading this area of SPU RAM on the real thing + based on my expectations of how this should work). +*/ + +/* + Notes: + All addresses(for 16-bit access, at least) within the SPU address space appear to be fully read/write as if they were RAM, though + values at some addresses(like the envelope current value) will be "overwritten" by the sound processing at certain times. + + 32-bit and 8-bit reads act as if it were RAM(not tested with all addresses, but a few, assuming the rest are the same), but 8-bit writes + to odd addresses appear to be ignored, and 8-bit writes to even addresses are treated as 16-bit writes(most likely, but, need to code custom assembly to + fully test the upper 8 bits). NOTE: the preceding information doesn't necessarily cover accesses with side effects, they still need to be tested; and it + of course covers reads/writes from the point of view of software running on the CPU. + + It doesn't appear to be possible to enable FM on the first channel/voice(channel/voice 0). + + Lower bit of channel start address appears to be masked out to 0(such that ADPCM block decoding is always 8 16-bit units, 16 bytes, aligned), as far as + block-decoding and flag-set program-readable loop address go. +*/ + +/* + Update() isn't called on Read and Writes for performance reasons, it's called with sufficient granularity from the event + system, though this will obviously need to change if we ever emulate the SPU with better precision than per-sample(pair). +*/ + +#define SPUIRQ_DBG(format, ...) { printf("[SPUIRQDBG] " format " -- Voice 22 CA=0x%06x,LA=0x%06x\n", ## __VA_ARGS__, Voices[22].CurAddr, Voices[22].LoopAddr); } + +#include "psx.h" +#include "cdc.h" +#include "spu.h" + +namespace MDFN_IEN_PSX +{ + +static const int16 FIR_Table[256][4] = +{ + #include "spu_fir_table.inc" +}; + +PS_SPU::PS_SPU() +{ + last_rate = -1; + last_quality = ~0U; + + IntermediateBufferPos = 0; + memset(IntermediateBuffer, 0, sizeof(IntermediateBuffer)); + + resampler = NULL; +} + +PS_SPU::~PS_SPU() +{ + if(resampler) + { + speex_resampler_destroy(resampler); + resampler = NULL; + } +} + +void PS_SPU::Power(void) +{ + clock_divider = 768; + + memset(SPURAM, 0, sizeof(SPURAM)); + + for(int i = 0; i < 24; i++) + { + memset(Voices[i].DecodeBuffer, 0, sizeof(Voices[i].DecodeBuffer)); + Voices[i].DecodeM2 = 0; + Voices[i].DecodeM1 = 0; + + Voices[i].DecodePlayDelay = 0; + Voices[i].DecodeWritePos = 0; + Voices[i].DecodeReadPos = 0; + Voices[i].DecodeAvail = 0; + + Voices[i].DecodeShift = 0; + Voices[i].DecodeWeight = 0; + Voices[i].DecodeFlags = 0; + + Voices[i].IgnoreSampLA = false; + + Voices[i].Sweep[0].Power(); + Voices[i].Sweep[1].Power(); + + Voices[i].Pitch = 0; + Voices[i].CurPhase = 0; + + Voices[i].StartAddr = 0; + + Voices[i].CurAddr = 0; + + Voices[i].ADSRControl = 0; + + Voices[i].LoopAddr = 0; + + Voices[i].PreLRSample = 0; + + memset(&Voices[i].ADSR, 0, sizeof(SPU_ADSR)); + } + + GlobalSweep[0].Power(); + GlobalSweep[1].Power(); + + NoiseDivider = 0; + NoiseCounter = 0; + LFSR = 0; + + FM_Mode = 0; + Noise_Mode = 0; + Reverb_Mode = 0; + ReverbWA = 0; + + ReverbVol[0] = ReverbVol[1] = 0; + + CDVol[0] = CDVol[1] = 0; + + ExternVol[0] = ExternVol[1] = 0; + + IRQAddr = 0; + + RWAddr = 0; + + SPUControl = 0; + + VoiceOn = 0; + VoiceOff = 0; + + BlockEnd = 0; + + CWA = 0; + + memset(Regs, 0, sizeof(Regs)); + + memset(RDSB, 0, sizeof(RDSB)); + memset(RUSB, 0, sizeof(RUSB)); + RvbResPos = 0; + + ReverbCur = ReverbWA; + + IRQAsserted = false; +} + +static INLINE void CalcVCDelta(const uint8 zs, uint8 speed, bool log_mode, bool dec_mode, bool inv_increment, int16 Current, int &increment, int &divinco) +{ + increment = (7 - (speed & 0x3)); + + if(inv_increment) + increment = ~increment; + + divinco = 32768; + + if(speed < 0x2C) + increment = (unsigned)increment << ((0x2F - speed) >> 2); + + if(speed >= 0x30) + divinco >>= (speed - 0x2C) >> 2; + + if(log_mode) + { + if(dec_mode) // Log decrement mode + increment = (Current * increment) >> 15; + else // Log increment mode + { + if((Current & 0x7FFF) >= 0x6000) + { + if(speed < 0x28) + increment >>= 2; + else if(speed >= 0x2C) + divinco >>= 2; + else // 0x28 ... 0x2B + { + increment >>= 1; + divinco >>= 1; + } + } + } + } // end if(log_mode) + + if(divinco == 0 && speed < zs) //0x7F) + divinco = 1; +} + + +INLINE void SPU_Sweep::Power(void) +{ + Control = 0; + Current = 0; + Divider = 0; +} + +INLINE void SPU_Sweep::WriteControl(uint16 value) +{ + Control = value; +} + +INLINE int16 SPU_Sweep::ReadVolume(void) +{ + return((int16)Current); +} + +void SPU_Sweep::Clock(void) +{ + if(!(Control & 0x8000)) + { + Current = (Control & 0x7FFF) << 1; + return; + } + + if(Control & 0x8000) // Sweep enabled + { + const bool log_mode = (bool)(Control & 0x4000); + const bool dec_mode = (bool)(Control & 0x2000); + const bool inv_mode = (bool)(Control & 0x1000); + const bool inv_increment = (dec_mode ^ inv_mode) | (dec_mode & log_mode); + const uint16 vc_cv_xor = (inv_mode & !(dec_mode & log_mode)) ? 0xFFFF : 0x0000; + const uint16 TestInvert = inv_mode ? 0xFFFF : 0x0000; + int increment; + int divinco; + + CalcVCDelta(0x7F, Control & 0x7F, log_mode, dec_mode, inv_increment, (int16)(Current ^ vc_cv_xor), increment, divinco); + //printf("%d %d\n", divinco, increment); + + if((dec_mode & !(inv_mode & log_mode)) && ((Current & 0x8000) == (inv_mode ? 0x0000 : 0x8000) || (Current == 0))) + { + // + // Not sure if this condition should stop the Divider adding or force the increment value to 0. + // + Current = 0; + } + else + { + Divider += divinco; + + if(Divider & 0x8000) + { + Divider = 0; + + if(dec_mode || ((Current ^ TestInvert) != 0x7FFF)) + { + uint16 PrevCurrent = Current; + Current = Current + increment; + + //printf("%04x %04x\n", PrevCurrent, Current); + + if(!dec_mode && ((Current ^ PrevCurrent) & 0x8000) && ((Current ^ TestInvert) & 0x8000)) + Current = 0x7FFF ^ TestInvert; + } + } + } + } +} + +INLINE void SPU_Sweep::WriteVolume(int16 value) +{ + Current = value; +} + + +// +// Take care not to trigger SPU IRQ for the next block before its decoding start. +// +void PS_SPU::RunDecoder(SPU_Voice *voice) +{ + // 5 through 0xF appear to be 0 on the real thing. + static const int32 Weights[16][2] = + { + // s-1 s-2 + { 0, 0 }, + { 60, 0 }, + { 115, -52 }, + { 98, -55 }, + { 122, -60 }, + }; + + if(voice->DecodeAvail >= 11) + { + if(SPUControl & 0x40) + { + unsigned test_addr = (voice->CurAddr - 1) & 0x3FFFF; + if(IRQAddr == test_addr || IRQAddr == (test_addr & 0x3FFF8)) + { + //SPUIRQ_DBG("SPU IRQ (VDA): 0x%06x", addr); + IRQAsserted = true; + IRQ_Assert(IRQ_SPU, IRQAsserted); + } + } + return; + } + + if((voice->CurAddr & 0x7) == 0) + { + // + // Handle delayed flags from the previously-decoded block. + // + // NOTE: The timing of setting the BlockEnd bit here, and forcing ADSR envelope volume to 0, is a bit late. (And I'm not sure if it should be done once + // per decoded block, or more than once, but that's probably not something games would rely on, but we should test it anyway). + // + // Correctish timing can be achieved by moving this block of code up above voice->DecodeAvail >= 11, and sticking it inside an: if(voice->DecodeAvail <= 12), + // though more tests are needed on the ADPCM decoding process as a whole before we should actually make such a change. Additionally, we'd probably + // have to separate the CurAddr = LoopAddr logic, so we don't generate spurious early SPU IRQs. + // + if(voice->DecodeFlags & 0x1) + { + voice->CurAddr = voice->LoopAddr & ~0x7; + + BlockEnd |= 1 << (voice - Voices); + + if(!(voice->DecodeFlags & 0x2)) // Force enveloping to 0 if not "looping". TODO: Should we reset the ADSR divider counter too? + { + if(!(Noise_Mode & (1 << (voice - Voices)))) + { + voice->ADSR.Phase = ADSR_RELEASE; + voice->ADSR.EnvLevel = 0; + } + } + } + } + + //for(int z = 0; z < 4; z++) + { + if(SPUControl & 0x40) + { + unsigned test_addr = voice->CurAddr & 0x3FFFF; + if(IRQAddr == test_addr || IRQAddr == (test_addr & 0x3FFF8)) + { + //SPUIRQ_DBG("SPU IRQ: 0x%06x", addr); + IRQAsserted = true; + IRQ_Assert(IRQ_SPU, IRQAsserted); + } + } + + if((voice->CurAddr & 0x7) == 0) + { + const uint16 CV = SPURAM[voice->CurAddr]; + + voice->DecodeShift = CV & 0xF; + voice->DecodeWeight = (CV >> 4) & 0xF; + voice->DecodeFlags = (CV >> 8) & 0xFF; + + if(voice->DecodeFlags & 0x4) + { + if(!voice->IgnoreSampLA) + { + voice->LoopAddr = voice->CurAddr; + } + else + { + if(voice->LoopAddr != voice->CurAddr) + { + PSX_DBG(PSX_DBG_FLOOD, "[SPU] Ignore: LoopAddr=0x%08x, SampLA=0x%08x\n", voice->LoopAddr, voice->CurAddr); + } + } + } + voice->CurAddr = (voice->CurAddr + 1) & 0x3FFFF; + } + + // + // Don't else this block; we need to ALWAYS decode 4 samples per call to RunDecoder() if DecodeAvail < 11, or else sample playback + // at higher rates will fail horribly. + // + { + const int32 weight_m1 = Weights[voice->DecodeWeight][0]; + const int32 weight_m2 = Weights[voice->DecodeWeight][1]; + uint16 CV; + unsigned shift; + uint32 coded; + int16 *tb = &voice->DecodeBuffer[voice->DecodeWritePos]; + + CV = SPURAM[voice->CurAddr]; + shift = voice->DecodeShift; + + if(MDFN_UNLIKELY(shift > 12)) + { + //PSX_DBG(PSX_DBG_FLOOD, "[SPU] Buggy/Illegal ADPCM block shift value on voice %u: %u\n", (unsigned)(voice - Voices), shift); + + shift = 8; + CV &= 0x8888; + } + + coded = (uint32)CV << 12; + + for(int i = 0; i < 4; i++) + { + int32 sample = (int16)(coded & 0xF000) >> shift; + + sample += ((voice->DecodeM2 * weight_m2) >> 6); + sample += ((voice->DecodeM1 * weight_m1) >> 6); + + clamp(&sample, -32768, 32767); + + tb[i] = sample; + voice->DecodeM2 = voice->DecodeM1; + voice->DecodeM1 = sample; + coded >>= 4; + } + voice->DecodeWritePos = (voice->DecodeWritePos + 4) & 0x1F; + voice->DecodeAvail += 4; + voice->CurAddr = (voice->CurAddr + 1) & 0x3FFFF; + } + } +} + +void PS_SPU::CacheEnvelope(SPU_Voice *voice) +{ + uint32 raw = voice->ADSRControl; + SPU_ADSR *ADSR = &voice->ADSR; + int32 Sl, Dr, Ar, Rr, Sr; + + Sl = (raw >> 0) & 0x0F; + Dr = (raw >> 4) & 0x0F; + Ar = (raw >> 8) & 0x7F; + + Rr = (raw >> 16) & 0x1F; + Sr = (raw >> 22) & 0x7F; + + + ADSR->AttackExp = (bool)(raw & (1 << 15)); + ADSR->ReleaseExp = (bool)(raw & (1 << 21)); + ADSR->SustainExp = (bool)(raw & (1 << 31)); + ADSR->SustainDec = (bool)(raw & (1 << 30)); + + ADSR->AttackRate = Ar; + ADSR->DecayRate = Dr << 2; + ADSR->SustainRate = Sr; + ADSR->ReleaseRate = Rr << 2; + + ADSR->SustainLevel = (Sl + 1) << 11; +} + +void PS_SPU::ResetEnvelope(SPU_Voice *voice) +{ + SPU_ADSR *ADSR = &voice->ADSR; + + ADSR->EnvLevel = 0; + ADSR->Divider = 0; + ADSR->Phase = ADSR_ATTACK; +} + +void PS_SPU::ReleaseEnvelope(SPU_Voice *voice) +{ + SPU_ADSR *ADSR = &voice->ADSR; + + ADSR->Divider = 0; + ADSR->Phase = ADSR_RELEASE; +} + + +void PS_SPU::RunEnvelope(SPU_Voice *voice) +{ + SPU_ADSR *ADSR = &voice->ADSR; + int increment; + int divinco; + int16 uoflow_reset; + + if(ADSR->Phase == ADSR_ATTACK && ADSR->EnvLevel == 0x7FFF) + ADSR->Phase++; + + //static INLINE void CalcVCDelta(const uint8 zs, uint8 speed, bool log_mode, bool decrement, bool inv_increment, int16 Current, int &increment, int &divinco) + switch(ADSR->Phase) + { + default: // Won't happen, but helps shut up gcc warnings. + case ADSR_ATTACK: + CalcVCDelta(0x7F, ADSR->AttackRate, ADSR->AttackExp, false, false, (int16)ADSR->EnvLevel, increment, divinco); + uoflow_reset = 0x7FFF; + break; + + case ADSR_DECAY: + CalcVCDelta(0x1F << 2, ADSR->DecayRate, true, true, true, (int16)ADSR->EnvLevel, increment, divinco); + uoflow_reset = 0; + break; + + case ADSR_SUSTAIN: + CalcVCDelta(0x7F, ADSR->SustainRate, ADSR->SustainExp, ADSR->SustainDec, ADSR->SustainDec, (int16)ADSR->EnvLevel, increment, divinco); + uoflow_reset = ADSR->SustainDec ? 0 : 0x7FFF; + break; + + case ADSR_RELEASE: + CalcVCDelta(0x1F << 2, ADSR->ReleaseRate, ADSR->ReleaseExp, true, true, (int16)ADSR->EnvLevel, increment, divinco); + uoflow_reset = 0; + break; + } + + ADSR->Divider += divinco; + if(ADSR->Divider & 0x8000) + { + const uint16 prev_level = ADSR->EnvLevel; + + ADSR->Divider = 0; + ADSR->EnvLevel += increment; + + if(ADSR->Phase == ADSR_ATTACK) + { + // If previous the upper bit was 0, but now it's 1, handle overflow. + if(((prev_level ^ ADSR->EnvLevel) & ADSR->EnvLevel) & 0x8000) + ADSR->EnvLevel = uoflow_reset; + } + else + { + if(ADSR->EnvLevel & 0x8000) + ADSR->EnvLevel = uoflow_reset; + } + if(ADSR->Phase == ADSR_DECAY && (uint16)ADSR->EnvLevel < ADSR->SustainLevel) + ADSR->Phase++; + } +} + +INLINE void PS_SPU::CheckIRQAddr(uint32 addr) +{ + if(SPUControl & 0x40) + { + if(IRQAddr == addr) + { + //SPUIRQ_DBG("SPU IRQ (ALT): 0x%06x", addr); + IRQAsserted = true; + IRQ_Assert(IRQ_SPU, IRQAsserted); + } + } +} + +INLINE void PS_SPU::WriteSPURAM(uint32 addr, uint16 value) +{ + CheckIRQAddr(addr); + + SPURAM[addr] = value; +} + +INLINE uint16 PS_SPU::ReadSPURAM(uint32 addr) +{ + CheckIRQAddr(addr); + return(SPURAM[addr]); +} + +#include "spu_reverb.inc" + +INLINE void PS_SPU::RunNoise(void) +{ + const unsigned rf = ((SPUControl >> 8) & 0x3F); + uint32 NoiseDividerInc = (2 << (rf >> 2)); + uint32 NoiseCounterInc = 4 + (rf & 0x3); + + if(rf >= 0x3C) + { + NoiseDividerInc = 0x8000; + NoiseCounterInc = 8; + } + + NoiseDivider += NoiseDividerInc; + if(NoiseDivider & 0x8000) + { + NoiseDivider = 0; + + NoiseCounter += NoiseCounterInc; + if(NoiseCounter & 0x8) + { + NoiseCounter &= 0x7; + LFSR = (LFSR << 1) | (((LFSR >> 15) ^ (LFSR >> 12) ^ (LFSR >> 11) ^ (LFSR >> 10) ^ 1) & 1); + } + } +} + +int32 PS_SPU::UpdateFromCDC(int32 clocks) +//pscpu_timestamp_t PS_SPU::Update(const pscpu_timestamp_t timestamp) +{ + //int32 clocks = timestamp - lastts; + int32 sample_clocks = 0; + //lastts = timestamp; + + clock_divider -= clocks; + + while(clock_divider <= 0) + { + clock_divider += 768; + sample_clocks++; + } + + while(sample_clocks > 0) + { + // xxx[0] = left, xxx[1] = right + + // Accumulated sound output. + int32 accum[2] = { 0, 0 }; + + // Accumulated sound output for reverb input + int32 accum_fv[2] = { 0, 0 }; + + // Output of reverb processing. + int32 reverb[2] = { 0, 0 }; + + // Final output. + int32 output[2] = { 0, 0 }; + + const uint32 PhaseModCache = FM_Mode & ~ 1; +/* +** +** 0x1F801DAE Notes and Conjecture: +** ------------------------------------------------------------------------------------- +** | 15 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 4 3 2 1 0 | +** | ? | *13| ? | ba | *10 | wrr|rdr| df | is | c | +** ------------------------------------------------------------------------------------- +** +** c - Appears to be delayed copy of lower 6 bits from 0x1F801DAA. +** +** is - Interrupt asserted out status. (apparently not instantaneous status though...) +** +** df - Related to (c & 0x30) == 0x20 or (c & 0x30) == 0x30, at least. +** 0 = DMA busy(FIFO not empty when in DMA write mode?)? +** 1 = DMA ready? Something to do with the FIFO? +** +** rdr - Read(DMA read?) Ready? +** +** wrr - Write(DMA write?) Ready? +** +** *10 - Unknown. Some sort of (FIFO?) busy status?(BIOS tests for this bit in places) +** +** ba - Alternates between 0 and 1, even when SPUControl bit15 is 0; might be related to CD audio and voice 1 and 3 writing to SPU RAM. +** +** *13 - Unknown, was set to 1 when testing with an SPU delay system reg value of 0x200921E1(test result might not be reliable, re-run). +*/ + SPUStatus = SPUControl & 0x3F; + SPUStatus |= IRQAsserted ? 0x40 : 0x00; + + if(Regs[0xD6] == 0x4) // TODO: Investigate more(case 0x2C in global regs r/w handler) + SPUStatus |= (CWA & 0x100) ? 0x800 : 0x000; + + for(int voice_num = 0; voice_num < 24; voice_num++) + { + SPU_Voice *voice = &Voices[voice_num]; + int32 voice_pvs; + + voice->PreLRSample = 0; + + //PSX_WARNING("[SPU] Voice %d CurPhase=%08x, pitch=%04x, CurAddr=%08x", voice_num, voice->CurPhase, voice->Pitch, voice->CurAddr); + + // + // Decode new samples if necessary. + // + RunDecoder(voice); + + + // + // + // + int l, r; + + if(Noise_Mode & (1 << voice_num)) + voice_pvs = (int16)LFSR; + else + { + const int si = voice->DecodeReadPos; + const int pi = ((voice->CurPhase & 0xFFF) >> 4); + + voice_pvs = ((voice->DecodeBuffer[(si + 0) & 0x1F] * FIR_Table[pi][0]) + + (voice->DecodeBuffer[(si + 1) & 0x1F] * FIR_Table[pi][1]) + + (voice->DecodeBuffer[(si + 2) & 0x1F] * FIR_Table[pi][2]) + + (voice->DecodeBuffer[(si + 3) & 0x1F] * FIR_Table[pi][3])) >> 15; + } + + voice_pvs = (voice_pvs * (int16)voice->ADSR.EnvLevel) >> 15; + voice->PreLRSample = voice_pvs; + + if(voice_num == 1 || voice_num == 3) + { + int index = voice_num >> 1; + + WriteSPURAM(0x400 | (index * 0x200) | CWA, voice_pvs); + } + + + l = (voice_pvs * voice->Sweep[0].ReadVolume()) >> 15; + r = (voice_pvs * voice->Sweep[1].ReadVolume()) >> 15; + + accum[0] += l; + accum[1] += r; + + if(Reverb_Mode & (1 << voice_num)) + { + accum_fv[0] += l; + accum_fv[1] += r; + } + + // Run sweep + for(int lr = 0; lr < 2; lr++) + voice->Sweep[lr].Clock(); + + // Increment stuff + if(!voice->DecodePlayDelay) + { + unsigned phase_inc; + + // Run enveloping + RunEnvelope(voice); + + if(PhaseModCache & (1 << voice_num)) + { + // This old formula: phase_inc = (voice->Pitch * ((voice - 1)->PreLRSample + 0x8000)) >> 15; + // is incorrect, as it does not handle carrier pitches >= 0x8000 properly. + phase_inc = voice->Pitch + (((int16)voice->Pitch * ((voice - 1)->PreLRSample)) >> 15); + } + else + phase_inc = voice->Pitch; + + if(phase_inc > 0x3FFF) + phase_inc = 0x3FFF; + + { + const uint32 tmp_phase = voice->CurPhase + phase_inc; + const unsigned used = tmp_phase >> 12; + + voice->CurPhase = tmp_phase & 0xFFF; + voice->DecodeAvail -= used; + voice->DecodeReadPos = (voice->DecodeReadPos + used) & 0x1F; + } + } + else + voice->DecodePlayDelay--; + + if(VoiceOff & (1U << voice_num)) + { + if(voice->ADSR.Phase != ADSR_RELEASE) + { + ReleaseEnvelope(voice); + } + } + + if(VoiceOn & (1U << voice_num)) + { + //printf("Voice On: %u\n", voice_num); + + ResetEnvelope(voice); + + voice->DecodeFlags = 0; + voice->DecodeWritePos = 0; + voice->DecodeReadPos = 0; + voice->DecodeAvail = 0; + voice->DecodePlayDelay = 4; + + BlockEnd &= ~(1 << voice_num); + + // + // Weight/filter previous value initialization: + // + voice->DecodeM2 = 0; + voice->DecodeM1 = 0; + + voice->CurPhase = 0; + voice->CurAddr = voice->StartAddr & ~0x7; + voice->IgnoreSampLA = false; + } + + if(!(SPUControl & 0x8000)) + { + voice->ADSR.Phase = ADSR_RELEASE; + voice->ADSR.EnvLevel = 0; + } + } + + VoiceOff = 0; + VoiceOn = 0; + + // "Mute" control doesn't seem to affect CD audio(though CD audio reverb wasn't tested...) + // TODO: If we add sub-sample timing accuracy, see if it's checked for every channel at different times, or just once. + if(!(SPUControl & 0x4000)) + { + accum[0] = 0; + accum[1] = 0; + accum_fv[0] = 0; + accum_fv[1] = 0; + } + + // Get CD-DA + { + int32 cda_raw[2]; + int32 cdav[2]; + + CDC->GetCDAudio(cda_raw); // PS_CDC::GetCDAudio() guarantees the variables passed by reference will be set to 0, + // and that their range shall be -32768 through 32767. + + WriteSPURAM(CWA | 0x000, cda_raw[0]); + WriteSPURAM(CWA | 0x200, cda_raw[1]); + + for(unsigned i = 0; i < 2; i++) + cdav[i] = (cda_raw[i] * CDVol[i]) >> 15; + + if(SPUControl & 0x0001) + { + accum[0] += cdav[0]; + accum[1] += cdav[1]; + + if(SPUControl & 0x0004) // TODO: Test this bit(and see if it is really dependent on bit0) + { + accum_fv[0] += cdav[0]; + accum_fv[1] += cdav[1]; + } + } + } + + CWA = (CWA + 1) & 0x1FF; + + RunNoise(); + + for(unsigned lr = 0; lr < 2; lr++) + clamp(&accum_fv[lr], -32768, 32767); + + RunReverb(accum_fv, reverb); + + for(unsigned lr = 0; lr < 2; lr++) + { + accum[lr] += ((reverb[lr] * ReverbVol[lr]) >> 15); + clamp(&accum[lr], -32768, 32767); + output[lr] = (accum[lr] * GlobalSweep[lr].ReadVolume()) >> 15; + clamp(&output[lr], -32768, 32767); + } + + if(IntermediateBufferPos < 4096) // Overflow might occur in some debugger use cases. + { + // 75%, for some (resampling) headroom. + for(unsigned lr = 0; lr < 2; lr++) + IntermediateBuffer[IntermediateBufferPos][lr] = (output[lr] * 3 + 2) >> 2; + + IntermediateBufferPos++; + } + + sample_clocks--; + + // Clock global sweep + for(unsigned lr = 0; lr < 2; lr++) + GlobalSweep[lr].Clock(); + } + + //assert(clock_divider < 768); + + return clock_divider; +} + +void PS_SPU::WriteDMA(uint32 V) +{ + //SPUIRQ_DBG("DMA Write, RWAddr after=0x%06x", RWAddr); + WriteSPURAM(RWAddr, V); + RWAddr = (RWAddr + 1) & 0x3FFFF; + + WriteSPURAM(RWAddr, V >> 16); + RWAddr = (RWAddr + 1) & 0x3FFFF; + + + CheckIRQAddr(RWAddr); +} + +uint32 PS_SPU::ReadDMA(void) +{ + uint32 ret; + + ret = (uint16)ReadSPURAM(RWAddr); + RWAddr = (RWAddr + 1) & 0x3FFFF; + + ret |= (uint32)(uint16)ReadSPURAM(RWAddr) << 16; + RWAddr = (RWAddr + 1) & 0x3FFFF; + + CheckIRQAddr(RWAddr); + + //SPUIRQ_DBG("DMA Read, RWAddr after=0x%06x", RWAddr); + + return(ret); +} + +void PS_SPU::Write(pscpu_timestamp_t timestamp, uint32 A, uint16 V) +{ + //if((A & 0x3FF) < 0x180) + // PSX_WARNING("[SPU] Write: %08x %04x", A, V); + + A &= 0x3FF; + + if(A >= 0x200) + { + //printf("Write: %08x %04x\n", A, V); + if(A < 0x260) + { + SPU_Voice *voice = &Voices[(A - 0x200) >> 2]; + voice->Sweep[(A & 2) >> 1].WriteVolume(V); + } + else if(A < 0x280) + AuxRegs[(A & 0x1F) >> 1] = V; + + return; + } + + if(A < 0x180) + { + SPU_Voice *voice = &Voices[A >> 4]; + + switch(A & 0xF) + { + case 0x00: + case 0x02: + voice->Sweep[(A & 2) >> 1].WriteControl(V); + break; + + case 0x04: voice->Pitch = V; + break; + + case 0x06: voice->StartAddr = (V << 2) & 0x3FFFF; + break; + + case 0x08: voice->ADSRControl &= 0xFFFF0000; + voice->ADSRControl |= V; + CacheEnvelope(voice); + break; + + case 0x0A: voice->ADSRControl &= 0x0000FFFF; + voice->ADSRControl |= V << 16; + CacheEnvelope(voice); + break; + + case 0x0C: voice->ADSR.EnvLevel = V; + break; + + case 0x0E: voice->LoopAddr = (V << 2) & 0x3FFFF; + voice->IgnoreSampLA = true; + //if((voice - Voices) == 22) + //{ + // SPUIRQ_DBG("Manual loop address setting for voice %d: %04x", (int)(voice - Voices), V); + //} + break; + } + } + else + { + switch(A & 0x7F) + { + case 0x00: + case 0x02: GlobalSweep[(A & 2) >> 1].WriteControl(V); + break; + + case 0x04: ReverbVol[0] = (int16)V; + break; + + case 0x06: ReverbVol[1] = (int16)V; + break; + + // Voice ON: + case 0x08: VoiceOn &= 0xFFFF0000; + VoiceOn |= V << 0; + break; + + case 0x0a: VoiceOn &= 0x0000FFFF; + VoiceOn |= (V & 0xFF) << 16; + break; + + // Voice OFF: + case 0x0c: VoiceOff &= 0xFFFF0000; + VoiceOff |= V << 0; + break; + + case 0x0e: VoiceOff &= 0x0000FFFF; + VoiceOff |= (V & 0xFF) << 16; + break; + + case 0x10: FM_Mode &= 0xFFFF0000; + FM_Mode |= V << 0; + break; + + case 0x12: FM_Mode &= 0x0000FFFF; + FM_Mode |= (V & 0xFF) << 16; + break; + + case 0x14: Noise_Mode &= 0xFFFF0000; + Noise_Mode |= V << 0; + break; + + case 0x16: Noise_Mode &= 0x0000FFFF; + Noise_Mode |= (V & 0xFF) << 16; + break; + + case 0x18: Reverb_Mode &= 0xFFFF0000; + Reverb_Mode |= V << 0; + break; + + case 0x1A: Reverb_Mode &= 0x0000FFFF; + Reverb_Mode |= (V & 0xFF) << 16; + break; + + case 0x1C: BlockEnd &= 0xFFFF0000; + BlockEnd |= V << 0; + break; + + case 0x1E: BlockEnd &= 0x0000FFFF; + BlockEnd |= V << 16; + break; + + case 0x22: ReverbWA = (V << 2) & 0x3FFFF; + ReverbCur = ReverbWA; + //PSX_WARNING("[SPU] Reverb WA set: 0x%04x", V); + break; + + case 0x24: IRQAddr = (V << 2) & 0x3FFFF; + CheckIRQAddr(RWAddr); + //SPUIRQ_DBG("Set IRQAddr=0x%06x", IRQAddr); + break; + + case 0x26: RWAddr = (V << 2) & 0x3FFFF; + CheckIRQAddr(RWAddr); + //SPUIRQ_DBG("Set RWAddr=0x%06x", RWAddr); + break; + + case 0x28: WriteSPURAM(RWAddr, V); + RWAddr = (RWAddr + 1) & 0x3FFFF; + CheckIRQAddr(RWAddr); + break; + + case 0x2A: //if((SPUControl & 0x80) && !(V & 0x80)) + // printf("\n\n\n\n ************** REVERB PROCESSING DISABLED\n\n\n\n"); + + SPUControl = V; + //SPUIRQ_DBG("Set SPUControl=0x%04x -- IRQA=%06x, RWA=%06x", V, IRQAddr, RWAddr); + //printf("SPU control write: %04x\n", V); + if(!(V & 0x40)) + { + IRQAsserted = false; + IRQ_Assert(IRQ_SPU, IRQAsserted); + } + CheckIRQAddr(RWAddr); + break; + + case 0x2C: PSX_WARNING("[SPU] Global reg 0x2c set: 0x%04x", V); + break; + + case 0x30: CDVol[0] = V; + break; + + case 0x32: CDVol[1] = V; + break; + + case 0x34: ExternVol[0] = V; + break; + + case 0x36: ExternVol[1] = V; + break; + + case 0x38: + case 0x3A: GlobalSweep[(A & 2) >> 1].WriteVolume(V); + break; + } + } + + Regs[(A & 0x1FF) >> 1] = V; +} + +uint16 PS_SPU::Read(pscpu_timestamp_t timestamp, uint32 A) +{ + A &= 0x3FF; + + PSX_DBGINFO("[SPU] Read: %08x", A); + + if(A >= 0x200) + { + if(A < 0x260) + { + SPU_Voice *voice = &Voices[(A - 0x200) >> 2]; + + //printf("Read: %08x %04x\n", A, voice->Sweep[(A & 2) >> 1].ReadVolume()); + + return voice->Sweep[(A & 2) >> 1].ReadVolume(); + } + else if(A < 0x280) + return(AuxRegs[(A & 0x1F) >> 1]); + + return(0xFFFF); + } + + + if(A < 0x180) + { + SPU_Voice *voice = &Voices[A >> 4]; + + switch(A & 0xF) + { + case 0x0C: return(voice->ADSR.EnvLevel); + case 0x0E: return(voice->LoopAddr >> 2); + } + } + else + { + switch(A & 0x7F) + { + case 0x1C: return(BlockEnd); + case 0x1E: return(BlockEnd >> 16); + + case 0x26: //PSX_WARNING("[SPU] RWADDR Read"); + break; + + case 0x28: PSX_WARNING("[SPU] SPURAM Read port(?) Read"); + + { + uint16 ret = ReadSPURAM(RWAddr); + + RWAddr = (RWAddr + 1) & 0x3FFFF; + CheckIRQAddr(RWAddr); + + return(ret); + } + + case 0x2a: + return(SPUControl); + +/* FIXME: What is this used for? */ + case 0x3C: + //PSX_WARNING("[SPU] Read Unknown: %08x", A); + return(0); + + case 0x38: + case 0x3A: return(GlobalSweep[(A & 2) >> 1].ReadVolume()); + } + } + + return(Regs[(A & 0x1FF) >> 1]); +} + + +void PS_SPU::StartFrame(double rate, uint32 quality) +{ + if((int)rate != last_rate || quality != last_quality) + { + int err = 0; + + if(resampler) + { + speex_resampler_destroy(resampler); + resampler = NULL; + } + + if((int)rate && (int)rate != 44100) + { + resampler = speex_resampler_init(2, 44100, (int)rate, quality, &err); + } + + last_rate = (int)rate; + last_quality = quality; + } + +} + +int32 PS_SPU::EndFrame(int16 *SoundBuf, bool reverse) +{ + if(reverse) + { + for(unsigned lr = 0; lr < 2; lr++) + { + int16* p0 = &IntermediateBuffer[0][lr]; + int16* p1 = &IntermediateBuffer[IntermediateBufferPos - 1][lr]; + unsigned count = IntermediateBufferPos >> 1; + + while(MDFN_LIKELY(count--)) + { + int16 tmp; + + tmp = *p0; + *p0 = *p1; + *p1 = tmp; + p0 += 2; + p1 -= 2; + } + } + } + + if(last_rate == 44100) + { + int32 ret = IntermediateBufferPos; + + memcpy(SoundBuf, IntermediateBuffer, IntermediateBufferPos * 2 * sizeof(int16)); + IntermediateBufferPos = 0; + + return(ret); + } + else if(resampler) + { + spx_uint32_t in_len; // "Number of input samples in the input buffer. Returns the number of samples processed. This is all per-channel." + spx_uint32_t out_len; // "Size of the output buffer. Returns the number of samples written. This is all per-channel." + + in_len = IntermediateBufferPos; + out_len = 524288; //8192; // FIXME, real size. + + speex_resampler_process_interleaved_int(resampler, (const spx_int16_t *)IntermediateBuffer, &in_len, (spx_int16_t *)SoundBuf, &out_len); + + assert(in_len <= IntermediateBufferPos); + + if((IntermediateBufferPos - in_len) > 0) + memmove(IntermediateBuffer, IntermediateBuffer + in_len, (IntermediateBufferPos - in_len) * sizeof(int16) * 2); + + IntermediateBufferPos -= in_len; + + return(out_len); + } + else + { + IntermediateBufferPos = 0; + return 0; + } +} + +void PS_SPU::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { +#define SFSWEEP(r) SFVAR((r).Control), \ + SFVAR((r).Current), \ + SFVAR((r).Divider) + +#define SFVOICE(n) SFARRAY16(&Voices[n].DecodeBuffer[0], sizeof(Voices[n].DecodeBuffer) / sizeof(Voices[n].DecodeBuffer[0])), \ + SFVAR(Voices[n].DecodeM2), \ + SFVAR(Voices[n].DecodeM1), \ + SFVAR(Voices[n].DecodePlayDelay), \ + SFVAR(Voices[n].DecodeWritePos), \ + SFVAR(Voices[n].DecodeReadPos), \ + SFVAR(Voices[n].DecodeAvail), \ + SFVAR(Voices[n].DecodeShift), \ + SFVAR(Voices[n].DecodeWeight), \ + SFVAR(Voices[n].DecodeFlags), \ + SFVAR(Voices[n].IgnoreSampLA), \ + \ + SFSWEEP(Voices[n].Sweep[0]), \ + SFSWEEP(Voices[n].Sweep[1]), \ + \ + SFVAR(Voices[n].Pitch), \ + SFVAR(Voices[n].CurPhase), \ + \ + SFVAR(Voices[n].StartAddr), \ + SFVAR(Voices[n].CurAddr), \ + SFVAR(Voices[n].ADSRControl), \ + SFVAR(Voices[n].LoopAddr), \ + SFVAR(Voices[n].PreLRSample), \ + \ + SFVAR(Voices[n].ADSR.EnvLevel), \ + SFVAR(Voices[n].ADSR.Divider), \ + SFVAR(Voices[n].ADSR.Phase), \ + \ + SFVAR(Voices[n].ADSR.AttackExp), \ + SFVAR(Voices[n].ADSR.SustainExp), \ + SFVAR(Voices[n].ADSR.SustainDec), \ + SFVAR(Voices[n].ADSR.ReleaseExp), \ + \ + SFVAR(Voices[n].ADSR.AttackRate), \ + SFVAR(Voices[n].ADSR.DecayRate), \ + SFVAR(Voices[n].ADSR.SustainRate), \ + SFVAR(Voices[n].ADSR.ReleaseRate), \ + \ + SFVAR(Voices[n].ADSR.SustainLevel) + + SFVOICE(0), + SFVOICE(1), + SFVOICE(2), + SFVOICE(3), + SFVOICE(4), + SFVOICE(5), + SFVOICE(6), + SFVOICE(7), + SFVOICE(8), + SFVOICE(9), + SFVOICE(10), + SFVOICE(11), + SFVOICE(12), + SFVOICE(13), + SFVOICE(14), + SFVOICE(15), + SFVOICE(16), + SFVOICE(17), + SFVOICE(18), + SFVOICE(19), + SFVOICE(20), + SFVOICE(21), + SFVOICE(22), + SFVOICE(23), +#undef SFVOICE + + SFVAR(NoiseDivider), + SFVAR(NoiseCounter), + SFVAR(LFSR), + + SFVAR(FM_Mode), + SFVAR(Noise_Mode), + SFVAR(Reverb_Mode), + + SFVAR(ReverbWA), + + SFSWEEP(GlobalSweep[0]), + SFSWEEP(GlobalSweep[1]), + + SFARRAY32(ReverbVol, sizeof(ReverbVol) / sizeof(ReverbVol[0])), + + SFARRAY32(CDVol, sizeof(CDVol) / sizeof(CDVol[0])), + SFARRAY32(ExternVol, sizeof(ExternVol) / sizeof(ExternVol[0])), + + SFVAR(IRQAddr), + + SFVAR(RWAddr), + + SFVAR(SPUControl), + + SFVAR(VoiceOn), + SFVAR(VoiceOff), + + SFVAR(BlockEnd), + + SFVAR(CWA), + + SFARRAY16(Regs, sizeof(Regs) / sizeof(Regs[0])), + SFARRAY16(AuxRegs, sizeof(AuxRegs) / sizeof(AuxRegs[0])), + + SFARRAY16(&RDSB[0][0], sizeof(RDSB) / sizeof(RDSB[0][0])), + SFVAR(RvbResPos), + + SFARRAY16(&RUSB[0][0], sizeof(RUSB) / sizeof(RUSB[0][0])), + + SFVAR(ReverbCur), + SFVAR(IRQAsserted), + + SFVAR(clock_divider), + + SFARRAY16(SPURAM, 524288 / sizeof(uint16)), + SFEND + }; +#undef SFSWEEP + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "SPU"); + + if(load) + { + for(unsigned i = 0; i < 24; i++) + { + Voices[i].DecodeReadPos &= 0x1F; + Voices[i].DecodeWritePos &= 0x1F; + } + + RvbResPos &= 0x3F; + + IRQ_Assert(IRQ_SPU, IRQAsserted); + } +} + +uint16 PS_SPU::PeekSPURAM(uint32 address) +{ + return(SPURAM[address & 0x3FFFF]); +} + +void PS_SPU::PokeSPURAM(uint32 address, uint16 value) +{ + SPURAM[address & 0x3FFFF] = value; +} + +uint32 PS_SPU::GetRegister(unsigned int which, char *special, const uint32 special_len) +{ + uint32 ret = 0xDEADBEEF; + + if(which >= 0x8000) + { + unsigned int v = (which - 0x8000) >> 8; + + switch((which & 0xFF) | 0x8000) + { + case GSREG_V0_VOL_CTRL_L: + ret = Regs[v * 8 + 0x0]; + break; + + case GSREG_V0_VOL_CTRL_R: + ret = Regs[v * 8 + 0x1]; + break; + + case GSREG_V0_VOL_L: + ret = Voices[v].Sweep[0].ReadVolume() & 0xFFFF; + break; + + case GSREG_V0_VOL_R: + ret = Voices[v].Sweep[1].ReadVolume() & 0xFFFF; + break; + + case GSREG_V0_PITCH: + ret = Voices[v].Pitch; + break; + + case GSREG_V0_STARTADDR: + ret = Voices[v].StartAddr; + break; + + case GSREG_V0_ADSR_CTRL: + ret = Voices[v].ADSRControl; + break; + + case GSREG_V0_ADSR_LEVEL: + ret = Voices[v].ADSR.EnvLevel; + break; + + case GSREG_V0_LOOP_ADDR: + ret = Voices[v].LoopAddr; + break; + + case GSREG_V0_READ_ADDR: + ret = Voices[v].CurAddr; + break; + } + } + else if(which >= GSREG_FB_SRC_A && which <= GSREG_IN_COEF_R) + { + ret = ReverbRegs[which - GSREG_FB_SRC_A]; + } + else switch(which) + { + case GSREG_SPUCONTROL: + ret = SPUControl; + break; + + case GSREG_FM_ON: + ret = FM_Mode; + break; + + case GSREG_NOISE_ON: + ret = Noise_Mode; + break; + + case GSREG_REVERB_ON: + ret = Reverb_Mode; + break; + + case GSREG_CDVOL_L: + ret = (uint16)CDVol[0]; + break; + + case GSREG_CDVOL_R: + ret = (uint16)CDVol[1]; + break; + + case GSREG_MAINVOL_CTRL_L: + ret = Regs[0xC0]; + break; + + case GSREG_MAINVOL_CTRL_R: + ret = Regs[0xC1]; + break; + + case GSREG_MAINVOL_L: + ret = GlobalSweep[0].ReadVolume() & 0xFFFF; + break; + + case GSREG_MAINVOL_R: + ret = GlobalSweep[1].ReadVolume() & 0xFFFF; + break; + + case GSREG_RVBVOL_L: + ret = (uint16)ReverbVol[0]; + break; + + case GSREG_RVBVOL_R: + ret = (uint16)ReverbVol[1]; + break; + + case GSREG_RWADDR: + ret = RWAddr; + break; + + case GSREG_IRQADDR: + ret = IRQAddr; + break; + + case GSREG_REVERBWA: + ret = ReverbWA >> 2; + break; + + case GSREG_VOICEON: + ret = VoiceOn; + break; + + case GSREG_VOICEOFF: + ret = VoiceOff; + break; + + case GSREG_BLOCKEND: + ret = BlockEnd; + break; + } + + return(ret); +} + +void PS_SPU::SetRegister(unsigned int which, uint32 value) +{ + if(which >= GSREG_FB_SRC_A && which <= GSREG_IN_COEF_R) + { + ReverbRegs[which - GSREG_FB_SRC_A] = value; + } + else switch(which) + { + case GSREG_SPUCONTROL: + SPUControl = value; + break; + + case GSREG_FM_ON: + FM_Mode = value & 0xFFFFFF; + break; + + case GSREG_NOISE_ON: + Noise_Mode = value & 0xFFFFFF; + break; + + case GSREG_REVERB_ON: + Reverb_Mode = value & 0xFFFFFF; + break; + + case GSREG_CDVOL_L: + CDVol[0] = (int16)value; + break; + + case GSREG_CDVOL_R: + CDVol[1] = (int16)value; + break; + + case GSREG_MAINVOL_CTRL_L: + Regs[0xC0] = value; + GlobalSweep[0].WriteControl(value); + //GlobalSweep[0].Control = value; + break; + + case GSREG_MAINVOL_CTRL_R: + Regs[0xC1] = value; + GlobalSweep[1].WriteControl(value); + //GlobalSweep[1].Control = value; + break; + + case GSREG_MAINVOL_L: + GlobalSweep[0].WriteVolume(value); + break; + + case GSREG_MAINVOL_R: + GlobalSweep[1].WriteVolume(value); + break; + + case GSREG_RVBVOL_L: + ReverbVol[0] = (int16)value; + break; + + case GSREG_RVBVOL_R: + ReverbVol[1] = (int16)value; + break; + + case GSREG_RWADDR: + RWAddr = value & 0x3FFFF; + break; + + case GSREG_IRQADDR: + IRQAddr = value & 0x3FFFC; + break; + + // + // REVERB_WA + // + + case GSREG_VOICEON: + VoiceOn = value & 0xFFFFFF; + break; + + case GSREG_VOICEOFF: + VoiceOff = value & 0xFFFFFF; + break; + + case GSREG_BLOCKEND: + BlockEnd = value & 0xFFFFFF; + break; + } +} + + + +} diff --git a/Mednafen/mednafen/psx/spu.h b/Mednafen/mednafen/psx/spu.h new file mode 100644 index 0000000000..53ffdfec99 --- /dev/null +++ b/Mednafen/mednafen/psx/spu.h @@ -0,0 +1,345 @@ +#ifndef __MDFN_PSX_SPU_H +#define __MDFN_PSX_SPU_H + +#include + +namespace MDFN_IEN_PSX +{ + +enum +{ + ADSR_ATTACK = 0, + ADSR_DECAY = 1, + ADSR_SUSTAIN = 2, + ADSR_RELEASE = 3 +}; + +struct SPU_ADSR +{ + uint16 EnvLevel; // We typecast it to (int16) in several places, but keep it here as (uint16) to prevent signed overflow/underflow, which compilers + // may not treat consistently. + uint32 Divider; + uint32 Phase; + + bool AttackExp; + bool SustainExp; + bool SustainDec; + bool ReleaseExp; + + int32 AttackRate; // Ar + int32 DecayRate; // Dr * 4 + int32 SustainRate; // Sr + int32 ReleaseRate; // Rr * 4 + + int32 SustainLevel; // (Sl + 1) << 11 +}; + +class PS_SPU; +class SPU_Sweep +{ + friend class PS_SPU; // For save states - FIXME(remove in future?) + + public: + SPU_Sweep() { } + ~SPU_Sweep() { } + + void Power(void); + + void WriteControl(uint16 value); + int16 ReadVolume(void); + + void WriteVolume(int16 value); + + void Clock(void); + + private: + uint16 Control; + uint16 Current; // We typecast it to (int16) in several places, but keep it here as (uint16) to prevent signed overflow/underflow, which compilers + // may not treat consistently. + uint32 Divider; +}; + +struct SPU_Voice +{ + int16 DecodeBuffer[0x20]; + int16 DecodeM2; + int16 DecodeM1; + + uint32 DecodePlayDelay; + uint32 DecodeWritePos; + uint32 DecodeReadPos; + uint32 DecodeAvail; + + uint8 DecodeShift; + uint8 DecodeWeight; + uint8 DecodeFlags; + + bool IgnoreSampLA; + + SPU_Sweep Sweep[2]; + + uint16 Pitch; + uint32 CurPhase; + + uint32 StartAddr; + + uint32 CurAddr; + + uint32 ADSRControl; + + uint32 LoopAddr; + + int32 PreLRSample; // After enveloping, but before L/R volume. Range of -32768 to 32767 + + SPU_ADSR ADSR; +}; + +class PS_SPU +{ + public: + + PS_SPU() MDFN_COLD; + ~PS_SPU() MDFN_COLD; + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + void Power(void) MDFN_COLD; + void Write(pscpu_timestamp_t timestamp, uint32 A, uint16 V); + uint16 Read(pscpu_timestamp_t timestamp, uint32 A); + + void WriteDMA(uint32 V); + uint32 ReadDMA(void); + + void StartFrame(double rate, uint32 quality); + int32 EndFrame(int16 *SoundBuf, bool reverse); + + int32 UpdateFromCDC(int32 clocks); + //pscpu_timestamp_t Update(pscpu_timestamp_t timestamp); + + private: + + void CheckIRQAddr(uint32 addr); + void WriteSPURAM(uint32 addr, uint16 value); + uint16 ReadSPURAM(uint32 addr); + + void RunDecoder(SPU_Voice *voice); + + void CacheEnvelope(SPU_Voice *voice); + void ResetEnvelope(SPU_Voice *voice); + void ReleaseEnvelope(SPU_Voice *voice); + void RunEnvelope(SPU_Voice *voice); + + + void RunReverb(const int32* in, int32* out); + void RunNoise(void); + bool GetCDAudio(int32 &l, int32 &r); + + SPU_Voice Voices[24]; + + uint32 NoiseDivider; + uint32 NoiseCounter; + uint16 LFSR; + + uint32 FM_Mode; + uint32 Noise_Mode; + uint32 Reverb_Mode; + + uint32 ReverbWA; + + SPU_Sweep GlobalSweep[2]; // Doesn't affect reverb volume! + + int32 ReverbVol[2]; + + int32 CDVol[2]; + int32 ExternVol[2]; + + uint32 IRQAddr; + + uint32 RWAddr; + + uint16 SPUControl; + + uint32 VoiceOn; + uint32 VoiceOff; + + uint32 BlockEnd; + + uint32 CWA; + + union + { + uint16 Regs[0x100]; + struct + { + uint16 VoiceRegs[0xC0]; + union + { + uint16 GlobalRegs[0x20]; + struct + { + uint16 _Global0[0x17]; + uint16 SPUStatus; + uint16 _Global1[0x08]; + }; + }; + union + { + uint16 ReverbRegs[0x20]; + + struct + { + uint16 FB_SRC_A; + uint16 FB_SRC_B; + int16 IIR_ALPHA; + int16 ACC_COEF_A; + int16 ACC_COEF_B; + int16 ACC_COEF_C; + int16 ACC_COEF_D; + int16 IIR_COEF; + int16 FB_ALPHA; + int16 FB_X; + uint16 IIR_DEST_A0; + uint16 IIR_DEST_A1; + uint16 ACC_SRC_A0; + uint16 ACC_SRC_A1; + uint16 ACC_SRC_B0; + uint16 ACC_SRC_B1; + uint16 IIR_SRC_A0; + uint16 IIR_SRC_A1; + uint16 IIR_DEST_B0; + uint16 IIR_DEST_B1; + uint16 ACC_SRC_C0; + uint16 ACC_SRC_C1; + uint16 ACC_SRC_D0; + uint16 ACC_SRC_D1; + uint16 IIR_SRC_B1; + uint16 IIR_SRC_B0; + uint16 MIX_DEST_A0; + uint16 MIX_DEST_A1; + uint16 MIX_DEST_B0; + uint16 MIX_DEST_B1; + int16 IN_COEF_L; + int16 IN_COEF_R; + }; + }; + }; + }; + + uint16 AuxRegs[0x10]; + + int16 RDSB[2][128]; + int16 RUSB[2][64]; + int32 RvbResPos; + + uint32 ReverbCur; + + uint32 Get_Reverb_Offset(uint32 offset); + int16 RD_RVB(uint16 raw_offs, int32 extra_offs = 0); + void WR_RVB(uint16 raw_offs, int16 sample); + + bool IRQAsserted; + + //pscpu_timestamp_t lastts; + int32 clock_divider; + + uint16 SPURAM[524288 / sizeof(uint16)]; + + int last_rate; + uint32 last_quality; + SpeexResamplerState *resampler; + + // Buffers 44.1KHz samples, should have enough for two(worst-case scenario) video frames(2* ~735 frames NTSC, 2* ~882 PAL) plus jitter plus enough for the resampler leftovers. + // We'll just go with 4096 because powers of 2 are AWESOME and such. + uint32 IntermediateBufferPos; + int16 IntermediateBuffer[4096][2]; + + public: + enum + { + GSREG_SPUCONTROL = 0, + + GSREG_FM_ON, + GSREG_NOISE_ON, + GSREG_REVERB_ON, + + GSREG_CDVOL_L, + GSREG_CDVOL_R, + + GSREG_MAINVOL_CTRL_L, + GSREG_MAINVOL_CTRL_R, + + GSREG_MAINVOL_L, + GSREG_MAINVOL_R, + + GSREG_RVBVOL_L, + GSREG_RVBVOL_R, + + GSREG_RWADDR, + + GSREG_IRQADDR, + + GSREG_REVERBWA, + + GSREG_VOICEON, + GSREG_VOICEOFF, + GSREG_BLOCKEND, + + // Note: the order of these should match the reverb reg array + GSREG_FB_SRC_A, + GSREG_FB_SRC_B, + GSREG_IIR_ALPHA, + GSREG_ACC_COEF_A, + GSREG_ACC_COEF_B, + GSREG_ACC_COEF_C, + GSREG_ACC_COEF_D, + GSREG_IIR_COEF, + GSREG_FB_ALPHA, + GSREG_FB_X, + GSREG_IIR_DEST_A0, + GSREG_IIR_DEST_A1, + GSREG_ACC_SRC_A0, + GSREG_ACC_SRC_A1, + GSREG_ACC_SRC_B0, + GSREG_ACC_SRC_B1, + GSREG_IIR_SRC_A0, + GSREG_IIR_SRC_A1, + GSREG_IIR_DEST_B0, + GSREG_IIR_DEST_B1, + GSREG_ACC_SRC_C0, + GSREG_ACC_SRC_C1, + GSREG_ACC_SRC_D0, + GSREG_ACC_SRC_D1, + GSREG_IIR_SRC_B1, + GSREG_IIR_SRC_B0, + GSREG_MIX_DEST_A0, + GSREG_MIX_DEST_A1, + GSREG_MIX_DEST_B0, + GSREG_MIX_DEST_B1, + GSREG_IN_COEF_L, + GSREG_IN_COEF_R, + + + // Multiply v * 256 for each extra voice + GSREG_V0_VOL_CTRL_L = 0x8000, + GSREG_V0_VOL_CTRL_R, + GSREG_V0_VOL_L, + GSREG_V0_VOL_R, + GSREG_V0_PITCH, + GSREG_V0_STARTADDR, + GSREG_V0_ADSR_CTRL, + GSREG_V0_ADSR_LEVEL, + GSREG_V0_LOOP_ADDR, + GSREG_V0_READ_ADDR + }; + + uint32 GetRegister(unsigned int which, char *special, const uint32 special_len); + void SetRegister(unsigned int which, uint32 value); + + uint16 PeekSPURAM(uint32 address); + void PokeSPURAM(uint32 address, uint16 value); +}; + + +} + +#endif diff --git a/Mednafen/mednafen/psx/spu_fir_table.inc b/Mednafen/mednafen/psx/spu_fir_table.inc new file mode 100644 index 0000000000..dabee3cb18 --- /dev/null +++ b/Mednafen/mednafen/psx/spu_fir_table.inc @@ -0,0 +1,256 @@ + { (int16)0x12c7, (int16)0x59b3, (int16)0x1307, (int16)0xffff }, + { (int16)0x1288, (int16)0x59b2, (int16)0x1347, (int16)0xffff }, + { (int16)0x1249, (int16)0x59b0, (int16)0x1388, (int16)0xffff }, + { (int16)0x120b, (int16)0x59ad, (int16)0x13c9, (int16)0xffff }, + { (int16)0x11cd, (int16)0x59a9, (int16)0x140b, (int16)0xffff }, + { (int16)0x118f, (int16)0x59a4, (int16)0x144d, (int16)0xffff }, + { (int16)0x1153, (int16)0x599e, (int16)0x1490, (int16)0xffff }, + { (int16)0x1116, (int16)0x5997, (int16)0x14d4, (int16)0xffff }, + { (int16)0x10db, (int16)0x598f, (int16)0x1517, (int16)0xffff }, + { (int16)0x109f, (int16)0x5986, (int16)0x155c, (int16)0xffff }, + { (int16)0x1065, (int16)0x597c, (int16)0x15a0, (int16)0xffff }, + { (int16)0x102a, (int16)0x5971, (int16)0x15e6, (int16)0xffff }, + { (int16)0x0ff1, (int16)0x5965, (int16)0x162c, (int16)0xffff }, + { (int16)0x0fb7, (int16)0x5958, (int16)0x1672, (int16)0xffff }, + { (int16)0x0f7f, (int16)0x5949, (int16)0x16b9, (int16)0xffff }, + { (int16)0x0f46, (int16)0x593a, (int16)0x1700, (int16)0xffff }, + { (int16)0x0f0f, (int16)0x592a, (int16)0x1747, (int16)0x0000 }, + { (int16)0x0ed7, (int16)0x5919, (int16)0x1790, (int16)0x0000 }, + { (int16)0x0ea1, (int16)0x5907, (int16)0x17d8, (int16)0x0000 }, + { (int16)0x0e6b, (int16)0x58f4, (int16)0x1821, (int16)0x0000 }, + { (int16)0x0e35, (int16)0x58e0, (int16)0x186b, (int16)0x0000 }, + { (int16)0x0e00, (int16)0x58cb, (int16)0x18b5, (int16)0x0000 }, + { (int16)0x0dcb, (int16)0x58b5, (int16)0x1900, (int16)0x0000 }, + { (int16)0x0d97, (int16)0x589e, (int16)0x194b, (int16)0x0001 }, + { (int16)0x0d63, (int16)0x5886, (int16)0x1996, (int16)0x0001 }, + { (int16)0x0d30, (int16)0x586d, (int16)0x19e2, (int16)0x0001 }, + { (int16)0x0cfd, (int16)0x5853, (int16)0x1a2e, (int16)0x0001 }, + { (int16)0x0ccb, (int16)0x5838, (int16)0x1a7b, (int16)0x0002 }, + { (int16)0x0c99, (int16)0x581c, (int16)0x1ac8, (int16)0x0002 }, + { (int16)0x0c68, (int16)0x57ff, (int16)0x1b16, (int16)0x0002 }, + { (int16)0x0c38, (int16)0x57e2, (int16)0x1b64, (int16)0x0003 }, + { (int16)0x0c07, (int16)0x57c3, (int16)0x1bb3, (int16)0x0003 }, + { (int16)0x0bd8, (int16)0x57a3, (int16)0x1c02, (int16)0x0003 }, + { (int16)0x0ba9, (int16)0x5782, (int16)0x1c51, (int16)0x0004 }, + { (int16)0x0b7a, (int16)0x5761, (int16)0x1ca1, (int16)0x0004 }, + { (int16)0x0b4c, (int16)0x573e, (int16)0x1cf1, (int16)0x0005 }, + { (int16)0x0b1e, (int16)0x571b, (int16)0x1d42, (int16)0x0005 }, + { (int16)0x0af1, (int16)0x56f6, (int16)0x1d93, (int16)0x0006 }, + { (int16)0x0ac4, (int16)0x56d1, (int16)0x1de5, (int16)0x0007 }, + { (int16)0x0a98, (int16)0x56ab, (int16)0x1e37, (int16)0x0007 }, + { (int16)0x0a6c, (int16)0x5684, (int16)0x1e89, (int16)0x0008 }, + { (int16)0x0a40, (int16)0x565b, (int16)0x1edc, (int16)0x0009 }, + { (int16)0x0a16, (int16)0x5632, (int16)0x1f2f, (int16)0x0009 }, + { (int16)0x09eb, (int16)0x5609, (int16)0x1f82, (int16)0x000a }, + { (int16)0x09c1, (int16)0x55de, (int16)0x1fd6, (int16)0x000b }, + { (int16)0x0998, (int16)0x55b2, (int16)0x202a, (int16)0x000c }, + { (int16)0x096f, (int16)0x5585, (int16)0x207f, (int16)0x000d }, + { (int16)0x0946, (int16)0x5558, (int16)0x20d4, (int16)0x000e }, + { (int16)0x091e, (int16)0x5529, (int16)0x2129, (int16)0x000f }, + { (int16)0x08f7, (int16)0x54fa, (int16)0x217f, (int16)0x0010 }, + { (int16)0x08d0, (int16)0x54ca, (int16)0x21d5, (int16)0x0011 }, + { (int16)0x08a9, (int16)0x5499, (int16)0x222c, (int16)0x0012 }, + { (int16)0x0883, (int16)0x5467, (int16)0x2282, (int16)0x0013 }, + { (int16)0x085d, (int16)0x5434, (int16)0x22da, (int16)0x0015 }, + { (int16)0x0838, (int16)0x5401, (int16)0x2331, (int16)0x0016 }, + { (int16)0x0813, (int16)0x53cc, (int16)0x2389, (int16)0x0018 }, + { (int16)0x07ef, (int16)0x5397, (int16)0x23e1, (int16)0x0019 }, + { (int16)0x07cb, (int16)0x5361, (int16)0x2439, (int16)0x001b }, + { (int16)0x07a7, (int16)0x532a, (int16)0x2492, (int16)0x001c }, + { (int16)0x0784, (int16)0x52f3, (int16)0x24eb, (int16)0x001e }, + { (int16)0x0762, (int16)0x52ba, (int16)0x2545, (int16)0x0020 }, + { (int16)0x0740, (int16)0x5281, (int16)0x259e, (int16)0x0021 }, + { (int16)0x071e, (int16)0x5247, (int16)0x25f8, (int16)0x0023 }, + { (int16)0x06fd, (int16)0x520c, (int16)0x2653, (int16)0x0025 }, + { (int16)0x06dc, (int16)0x51d0, (int16)0x26ad, (int16)0x0027 }, + { (int16)0x06bb, (int16)0x5194, (int16)0x2708, (int16)0x0029 }, + { (int16)0x069b, (int16)0x5156, (int16)0x2763, (int16)0x002c }, + { (int16)0x067c, (int16)0x5118, (int16)0x27be, (int16)0x002e }, + { (int16)0x065c, (int16)0x50da, (int16)0x281a, (int16)0x0030 }, + { (int16)0x063e, (int16)0x509a, (int16)0x2876, (int16)0x0033 }, + { (int16)0x061f, (int16)0x505a, (int16)0x28d2, (int16)0x0035 }, + { (int16)0x0601, (int16)0x5019, (int16)0x292e, (int16)0x0038 }, + { (int16)0x05e4, (int16)0x4fd7, (int16)0x298b, (int16)0x003a }, + { (int16)0x05c7, (int16)0x4f95, (int16)0x29e7, (int16)0x003d }, + { (int16)0x05aa, (int16)0x4f52, (int16)0x2a44, (int16)0x0040 }, + { (int16)0x058e, (int16)0x4f0e, (int16)0x2aa1, (int16)0x0043 }, + { (int16)0x0572, (int16)0x4ec9, (int16)0x2aff, (int16)0x0046 }, + { (int16)0x0556, (int16)0x4e84, (int16)0x2b5c, (int16)0x0049 }, + { (int16)0x053b, (int16)0x4e3e, (int16)0x2bba, (int16)0x004d }, + { (int16)0x0520, (int16)0x4df7, (int16)0x2c18, (int16)0x0050 }, + { (int16)0x0506, (int16)0x4db0, (int16)0x2c76, (int16)0x0054 }, + { (int16)0x04ec, (int16)0x4d68, (int16)0x2cd4, (int16)0x0057 }, + { (int16)0x04d2, (int16)0x4d20, (int16)0x2d33, (int16)0x005b }, + { (int16)0x04b9, (int16)0x4cd7, (int16)0x2d91, (int16)0x005f }, + { (int16)0x04a0, (int16)0x4c8d, (int16)0x2df0, (int16)0x0063 }, + { (int16)0x0488, (int16)0x4c42, (int16)0x2e4f, (int16)0x0067 }, + { (int16)0x0470, (int16)0x4bf7, (int16)0x2eae, (int16)0x006b }, + { (int16)0x0458, (int16)0x4bac, (int16)0x2f0d, (int16)0x006f }, + { (int16)0x0441, (int16)0x4b5f, (int16)0x2f6c, (int16)0x0074 }, + { (int16)0x042a, (int16)0x4b13, (int16)0x2fcc, (int16)0x0078 }, + { (int16)0x0413, (int16)0x4ac5, (int16)0x302b, (int16)0x007d }, + { (int16)0x03fc, (int16)0x4a77, (int16)0x308b, (int16)0x0082 }, + { (int16)0x03e7, (int16)0x4a29, (int16)0x30ea, (int16)0x0087 }, + { (int16)0x03d1, (int16)0x49d9, (int16)0x314a, (int16)0x008c }, + { (int16)0x03bc, (int16)0x498a, (int16)0x31aa, (int16)0x0091 }, + { (int16)0x03a7, (int16)0x493a, (int16)0x3209, (int16)0x0096 }, + { (int16)0x0392, (int16)0x48e9, (int16)0x3269, (int16)0x009c }, + { (int16)0x037e, (int16)0x4898, (int16)0x32c9, (int16)0x00a1 }, + { (int16)0x036a, (int16)0x4846, (int16)0x3329, (int16)0x00a7 }, + { (int16)0x0356, (int16)0x47f4, (int16)0x3389, (int16)0x00ad }, + { (int16)0x0343, (int16)0x47a1, (int16)0x33e9, (int16)0x00b3 }, + { (int16)0x0330, (int16)0x474e, (int16)0x3449, (int16)0x00ba }, + { (int16)0x031d, (int16)0x46fa, (int16)0x34a9, (int16)0x00c0 }, + { (int16)0x030b, (int16)0x46a6, (int16)0x3509, (int16)0x00c7 }, + { (int16)0x02f9, (int16)0x4651, (int16)0x3569, (int16)0x00cd }, + { (int16)0x02e7, (int16)0x45fc, (int16)0x35c9, (int16)0x00d4 }, + { (int16)0x02d6, (int16)0x45a6, (int16)0x3629, (int16)0x00db }, + { (int16)0x02c4, (int16)0x4550, (int16)0x3689, (int16)0x00e3 }, + { (int16)0x02b4, (int16)0x44fa, (int16)0x36e8, (int16)0x00ea }, + { (int16)0x02a3, (int16)0x44a3, (int16)0x3748, (int16)0x00f2 }, + { (int16)0x0293, (int16)0x444c, (int16)0x37a8, (int16)0x00fa }, + { (int16)0x0283, (int16)0x43f4, (int16)0x3807, (int16)0x0101 }, + { (int16)0x0273, (int16)0x439c, (int16)0x3867, (int16)0x010a }, + { (int16)0x0264, (int16)0x4344, (int16)0x38c6, (int16)0x0112 }, + { (int16)0x0255, (int16)0x42eb, (int16)0x3926, (int16)0x011b }, + { (int16)0x0246, (int16)0x4292, (int16)0x3985, (int16)0x0123 }, + { (int16)0x0237, (int16)0x4239, (int16)0x39e4, (int16)0x012c }, + { (int16)0x0229, (int16)0x41df, (int16)0x3a43, (int16)0x0135 }, + { (int16)0x021b, (int16)0x4185, (int16)0x3aa2, (int16)0x013f }, + { (int16)0x020d, (int16)0x412a, (int16)0x3b00, (int16)0x0148 }, + { (int16)0x0200, (int16)0x40d0, (int16)0x3b5f, (int16)0x0152 }, + { (int16)0x01f2, (int16)0x4074, (int16)0x3bbd, (int16)0x015c }, + { (int16)0x01e5, (int16)0x4019, (int16)0x3c1b, (int16)0x0166 }, + { (int16)0x01d9, (int16)0x3fbd, (int16)0x3c79, (int16)0x0171 }, + { (int16)0x01cc, (int16)0x3f62, (int16)0x3cd7, (int16)0x017b }, + { (int16)0x01c0, (int16)0x3f05, (int16)0x3d35, (int16)0x0186 }, + { (int16)0x01b4, (int16)0x3ea9, (int16)0x3d92, (int16)0x0191 }, + { (int16)0x01a8, (int16)0x3e4c, (int16)0x3def, (int16)0x019c }, + { (int16)0x019c, (int16)0x3def, (int16)0x3e4c, (int16)0x01a8 }, + { (int16)0x0191, (int16)0x3d92, (int16)0x3ea9, (int16)0x01b4 }, + { (int16)0x0186, (int16)0x3d35, (int16)0x3f05, (int16)0x01c0 }, + { (int16)0x017b, (int16)0x3cd7, (int16)0x3f62, (int16)0x01cc }, + { (int16)0x0171, (int16)0x3c79, (int16)0x3fbd, (int16)0x01d9 }, + { (int16)0x0166, (int16)0x3c1b, (int16)0x4019, (int16)0x01e5 }, + { (int16)0x015c, (int16)0x3bbd, (int16)0x4074, (int16)0x01f2 }, + { (int16)0x0152, (int16)0x3b5f, (int16)0x40d0, (int16)0x0200 }, + { (int16)0x0148, (int16)0x3b00, (int16)0x412a, (int16)0x020d }, + { (int16)0x013f, (int16)0x3aa2, (int16)0x4185, (int16)0x021b }, + { (int16)0x0135, (int16)0x3a43, (int16)0x41df, (int16)0x0229 }, + { (int16)0x012c, (int16)0x39e4, (int16)0x4239, (int16)0x0237 }, + { (int16)0x0123, (int16)0x3985, (int16)0x4292, (int16)0x0246 }, + { (int16)0x011b, (int16)0x3926, (int16)0x42eb, (int16)0x0255 }, + { (int16)0x0112, (int16)0x38c6, (int16)0x4344, (int16)0x0264 }, + { (int16)0x010a, (int16)0x3867, (int16)0x439c, (int16)0x0273 }, + { (int16)0x0101, (int16)0x3807, (int16)0x43f4, (int16)0x0283 }, + { (int16)0x00fa, (int16)0x37a8, (int16)0x444c, (int16)0x0293 }, + { (int16)0x00f2, (int16)0x3748, (int16)0x44a3, (int16)0x02a3 }, + { (int16)0x00ea, (int16)0x36e8, (int16)0x44fa, (int16)0x02b4 }, + { (int16)0x00e3, (int16)0x3689, (int16)0x4550, (int16)0x02c4 }, + { (int16)0x00db, (int16)0x3629, (int16)0x45a6, (int16)0x02d6 }, + { (int16)0x00d4, (int16)0x35c9, (int16)0x45fc, (int16)0x02e7 }, + { (int16)0x00cd, (int16)0x3569, (int16)0x4651, (int16)0x02f9 }, + { (int16)0x00c7, (int16)0x3509, (int16)0x46a6, (int16)0x030b }, + { (int16)0x00c0, (int16)0x34a9, (int16)0x46fa, (int16)0x031d }, + { (int16)0x00ba, (int16)0x3449, (int16)0x474e, (int16)0x0330 }, + { (int16)0x00b3, (int16)0x33e9, (int16)0x47a1, (int16)0x0343 }, + { (int16)0x00ad, (int16)0x3389, (int16)0x47f4, (int16)0x0356 }, + { (int16)0x00a7, (int16)0x3329, (int16)0x4846, (int16)0x036a }, + { (int16)0x00a1, (int16)0x32c9, (int16)0x4898, (int16)0x037e }, + { (int16)0x009c, (int16)0x3269, (int16)0x48e9, (int16)0x0392 }, + { (int16)0x0096, (int16)0x3209, (int16)0x493a, (int16)0x03a7 }, + { (int16)0x0091, (int16)0x31aa, (int16)0x498a, (int16)0x03bc }, + { (int16)0x008c, (int16)0x314a, (int16)0x49d9, (int16)0x03d1 }, + { (int16)0x0087, (int16)0x30ea, (int16)0x4a29, (int16)0x03e7 }, + { (int16)0x0082, (int16)0x308b, (int16)0x4a77, (int16)0x03fc }, + { (int16)0x007d, (int16)0x302b, (int16)0x4ac5, (int16)0x0413 }, + { (int16)0x0078, (int16)0x2fcc, (int16)0x4b13, (int16)0x042a }, + { (int16)0x0074, (int16)0x2f6c, (int16)0x4b5f, (int16)0x0441 }, + { (int16)0x006f, (int16)0x2f0d, (int16)0x4bac, (int16)0x0458 }, + { (int16)0x006b, (int16)0x2eae, (int16)0x4bf7, (int16)0x0470 }, + { (int16)0x0067, (int16)0x2e4f, (int16)0x4c42, (int16)0x0488 }, + { (int16)0x0063, (int16)0x2df0, (int16)0x4c8d, (int16)0x04a0 }, + { (int16)0x005f, (int16)0x2d91, (int16)0x4cd7, (int16)0x04b9 }, + { (int16)0x005b, (int16)0x2d33, (int16)0x4d20, (int16)0x04d2 }, + { (int16)0x0057, (int16)0x2cd4, (int16)0x4d68, (int16)0x04ec }, + { (int16)0x0054, (int16)0x2c76, (int16)0x4db0, (int16)0x0506 }, + { (int16)0x0050, (int16)0x2c18, (int16)0x4df7, (int16)0x0520 }, + { (int16)0x004d, (int16)0x2bba, (int16)0x4e3e, (int16)0x053b }, + { (int16)0x0049, (int16)0x2b5c, (int16)0x4e84, (int16)0x0556 }, + { (int16)0x0046, (int16)0x2aff, (int16)0x4ec9, (int16)0x0572 }, + { (int16)0x0043, (int16)0x2aa1, (int16)0x4f0e, (int16)0x058e }, + { (int16)0x0040, (int16)0x2a44, (int16)0x4f52, (int16)0x05aa }, + { (int16)0x003d, (int16)0x29e7, (int16)0x4f95, (int16)0x05c7 }, + { (int16)0x003a, (int16)0x298b, (int16)0x4fd7, (int16)0x05e4 }, + { (int16)0x0038, (int16)0x292e, (int16)0x5019, (int16)0x0601 }, + { (int16)0x0035, (int16)0x28d2, (int16)0x505a, (int16)0x061f }, + { (int16)0x0033, (int16)0x2876, (int16)0x509a, (int16)0x063e }, + { (int16)0x0030, (int16)0x281a, (int16)0x50da, (int16)0x065c }, + { (int16)0x002e, (int16)0x27be, (int16)0x5118, (int16)0x067c }, + { (int16)0x002c, (int16)0x2763, (int16)0x5156, (int16)0x069b }, + { (int16)0x0029, (int16)0x2708, (int16)0x5194, (int16)0x06bb }, + { (int16)0x0027, (int16)0x26ad, (int16)0x51d0, (int16)0x06dc }, + { (int16)0x0025, (int16)0x2653, (int16)0x520c, (int16)0x06fd }, + { (int16)0x0023, (int16)0x25f8, (int16)0x5247, (int16)0x071e }, + { (int16)0x0021, (int16)0x259e, (int16)0x5281, (int16)0x0740 }, + { (int16)0x0020, (int16)0x2545, (int16)0x52ba, (int16)0x0762 }, + { (int16)0x001e, (int16)0x24eb, (int16)0x52f3, (int16)0x0784 }, + { (int16)0x001c, (int16)0x2492, (int16)0x532a, (int16)0x07a7 }, + { (int16)0x001b, (int16)0x2439, (int16)0x5361, (int16)0x07cb }, + { (int16)0x0019, (int16)0x23e1, (int16)0x5397, (int16)0x07ef }, + { (int16)0x0018, (int16)0x2389, (int16)0x53cc, (int16)0x0813 }, + { (int16)0x0016, (int16)0x2331, (int16)0x5401, (int16)0x0838 }, + { (int16)0x0015, (int16)0x22da, (int16)0x5434, (int16)0x085d }, + { (int16)0x0013, (int16)0x2282, (int16)0x5467, (int16)0x0883 }, + { (int16)0x0012, (int16)0x222c, (int16)0x5499, (int16)0x08a9 }, + { (int16)0x0011, (int16)0x21d5, (int16)0x54ca, (int16)0x08d0 }, + { (int16)0x0010, (int16)0x217f, (int16)0x54fa, (int16)0x08f7 }, + { (int16)0x000f, (int16)0x2129, (int16)0x5529, (int16)0x091e }, + { (int16)0x000e, (int16)0x20d4, (int16)0x5558, (int16)0x0946 }, + { (int16)0x000d, (int16)0x207f, (int16)0x5585, (int16)0x096f }, + { (int16)0x000c, (int16)0x202a, (int16)0x55b2, (int16)0x0998 }, + { (int16)0x000b, (int16)0x1fd6, (int16)0x55de, (int16)0x09c1 }, + { (int16)0x000a, (int16)0x1f82, (int16)0x5609, (int16)0x09eb }, + { (int16)0x0009, (int16)0x1f2f, (int16)0x5632, (int16)0x0a16 }, + { (int16)0x0009, (int16)0x1edc, (int16)0x565b, (int16)0x0a40 }, + { (int16)0x0008, (int16)0x1e89, (int16)0x5684, (int16)0x0a6c }, + { (int16)0x0007, (int16)0x1e37, (int16)0x56ab, (int16)0x0a98 }, + { (int16)0x0007, (int16)0x1de5, (int16)0x56d1, (int16)0x0ac4 }, + { (int16)0x0006, (int16)0x1d93, (int16)0x56f6, (int16)0x0af1 }, + { (int16)0x0005, (int16)0x1d42, (int16)0x571b, (int16)0x0b1e }, + { (int16)0x0005, (int16)0x1cf1, (int16)0x573e, (int16)0x0b4c }, + { (int16)0x0004, (int16)0x1ca1, (int16)0x5761, (int16)0x0b7a }, + { (int16)0x0004, (int16)0x1c51, (int16)0x5782, (int16)0x0ba9 }, + { (int16)0x0003, (int16)0x1c02, (int16)0x57a3, (int16)0x0bd8 }, + { (int16)0x0003, (int16)0x1bb3, (int16)0x57c3, (int16)0x0c07 }, + { (int16)0x0003, (int16)0x1b64, (int16)0x57e2, (int16)0x0c38 }, + { (int16)0x0002, (int16)0x1b16, (int16)0x57ff, (int16)0x0c68 }, + { (int16)0x0002, (int16)0x1ac8, (int16)0x581c, (int16)0x0c99 }, + { (int16)0x0002, (int16)0x1a7b, (int16)0x5838, (int16)0x0ccb }, + { (int16)0x0001, (int16)0x1a2e, (int16)0x5853, (int16)0x0cfd }, + { (int16)0x0001, (int16)0x19e2, (int16)0x586d, (int16)0x0d30 }, + { (int16)0x0001, (int16)0x1996, (int16)0x5886, (int16)0x0d63 }, + { (int16)0x0001, (int16)0x194b, (int16)0x589e, (int16)0x0d97 }, + { (int16)0x0000, (int16)0x1900, (int16)0x58b5, (int16)0x0dcb }, + { (int16)0x0000, (int16)0x18b5, (int16)0x58cb, (int16)0x0e00 }, + { (int16)0x0000, (int16)0x186b, (int16)0x58e0, (int16)0x0e35 }, + { (int16)0x0000, (int16)0x1821, (int16)0x58f4, (int16)0x0e6b }, + { (int16)0x0000, (int16)0x17d8, (int16)0x5907, (int16)0x0ea1 }, + { (int16)0x0000, (int16)0x1790, (int16)0x5919, (int16)0x0ed7 }, + { (int16)0x0000, (int16)0x1747, (int16)0x592a, (int16)0x0f0f }, + { (int16)0xffff, (int16)0x1700, (int16)0x593a, (int16)0x0f46 }, + { (int16)0xffff, (int16)0x16b9, (int16)0x5949, (int16)0x0f7f }, + { (int16)0xffff, (int16)0x1672, (int16)0x5958, (int16)0x0fb7 }, + { (int16)0xffff, (int16)0x162c, (int16)0x5965, (int16)0x0ff1 }, + { (int16)0xffff, (int16)0x15e6, (int16)0x5971, (int16)0x102a }, + { (int16)0xffff, (int16)0x15a0, (int16)0x597c, (int16)0x1065 }, + { (int16)0xffff, (int16)0x155c, (int16)0x5986, (int16)0x109f }, + { (int16)0xffff, (int16)0x1517, (int16)0x598f, (int16)0x10db }, + { (int16)0xffff, (int16)0x14d4, (int16)0x5997, (int16)0x1116 }, + { (int16)0xffff, (int16)0x1490, (int16)0x599e, (int16)0x1153 }, + { (int16)0xffff, (int16)0x144d, (int16)0x59a4, (int16)0x118f }, + { (int16)0xffff, (int16)0x140b, (int16)0x59a9, (int16)0x11cd }, + { (int16)0xffff, (int16)0x13c9, (int16)0x59ad, (int16)0x120b }, + { (int16)0xffff, (int16)0x1388, (int16)0x59b0, (int16)0x1249 }, + { (int16)0xffff, (int16)0x1347, (int16)0x59b2, (int16)0x1288 }, + { (int16)0xffff, (int16)0x1307, (int16)0x59b3, (int16)0x12c7 }, diff --git a/Mednafen/mednafen/psx/spu_reverb.inc b/Mednafen/mednafen/psx/spu_reverb.inc new file mode 100644 index 0000000000..bf96701d4a --- /dev/null +++ b/Mednafen/mednafen/psx/spu_reverb.inc @@ -0,0 +1,195 @@ +static int16 ReverbSat(int32 samp) MDFN_WARN_UNUSED_RESULT; +static INLINE int16 ReverbSat(int32 samp) +{ + if(samp > 32767) + samp = 32767; + + if(samp < -32768) + samp = -32768; + + return(samp); +} + + +INLINE uint32 PS_SPU::Get_Reverb_Offset(uint32 in_offset) +{ + uint32 offset = ReverbCur + (in_offset & 0x3FFFF); + + offset += ReverbWA & ((int32)(offset << 13) >> 31); + offset &= 0x3FFFF; + + // For debugging in case there are any problems with games misprogramming the reverb registers in a race-conditiony manner that + // causes important data in SPU RAM to be trashed: + //if(offset < ReverbWA) + // printf("BARF: offset=%05x reverbwa=%05x reverbcur=%05x in_offset=%05x\n", offset, ReverbWA, ReverbCur, in_offset & 0x3FFFF); + + return(offset); +} + +int16 NO_INLINE PS_SPU::RD_RVB(uint16 raw_offs, int32 extra_offs) +{ + return ReadSPURAM(Get_Reverb_Offset((raw_offs << 2) + extra_offs)); +} + +void NO_INLINE PS_SPU::WR_RVB(uint16 raw_offs, int16 sample) +{ + WriteSPURAM(Get_Reverb_Offset(raw_offs << 2), sample); +} + +// +// Zeroes optimized out; middle removed too(it's 16384) +static const int16 ResampTable[20] = +{ + -1, 2, -10, 35, -103, 266, -616, 1332, -2960, 10246, 10246, -2960, 1332, -616, 266, -103, 35, -10, 2, -1, +}; + +static INLINE int32 Reverb4422(const int16 *src) +{ + int32 out = 0; // 32-bits is adequate(it won't overflow) + + for(unsigned i = 0; i < 20; i++) + out += ResampTable[i] * src[i * 2]; + + // Middle non-zero + out += 0x4000 * src[19]; + + out >>= 15; + + clamp(&out, -32768, 32767); + + return(out); +} + +template +static INLINE int32 Reverb2244(const int16 *src) +{ + int32 out; // 32-bits is adequate(it won't overflow) + + if(phase) + { + // Middle non-zero + out = src[9]; + } + else + { + out = 0; + + for(unsigned i = 0; i < 20; i++) + out += ResampTable[i] * src[i]; + + out >>= 14; + + clamp(&out, -32768, 32767); + } + + return(out); +} + +static int32 IIASM(const int16 IIR_ALPHA, const int16 insamp) +{ + if(MDFN_UNLIKELY(IIR_ALPHA == -32768)) + { + //const int32 iai_adj = sign_x_to_s32(17, (32768 - IIR_ALPHA)); + //tmp = iai_adj * in_samp + + if(insamp == -32768) + return 0; + else + return insamp * -65536; + } + else + return insamp * (32768 - IIR_ALPHA); +} + +// +// Take care to thoroughly test the reverb resampling code when modifying anything that uses RvbResPos. +// +void PS_SPU::RunReverb(const int32* in, int32* out) +{ + int32 upsampled[2] = { 0, 0 }; + + for(unsigned lr = 0; lr < 2; lr++) + { + RDSB[lr][RvbResPos | 0x00] = in[lr]; + RDSB[lr][RvbResPos | 0x40] = in[lr]; // So we don't have to &/bounds check in our MAC loop + } + + if(RvbResPos & 1) + { + int32 downsampled[2]; + + for(unsigned lr = 0; lr < 2; lr++) + downsampled[lr] = Reverb4422(&RDSB[lr][(RvbResPos - 39) & 0x3F]); + + // + // Run algorithm + /// + if(SPUControl & 0x80) + { + int16 IIR_INPUT_A0, IIR_INPUT_A1, IIR_INPUT_B0, IIR_INPUT_B1; + int16 IIR_A0, IIR_A1, IIR_B0, IIR_B1; + int16 ACC0, ACC1; + int16 FB_A0, FB_A1, FB_B0, FB_B1; + + IIR_INPUT_A0 = ReverbSat(((RD_RVB(IIR_SRC_A0) * IIR_COEF) >> 15) + ((downsampled[0] * IN_COEF_L) >> 15)); + IIR_INPUT_A1 = ReverbSat(((RD_RVB(IIR_SRC_A1) * IIR_COEF) >> 15) + ((downsampled[1] * IN_COEF_R) >> 15)); + IIR_INPUT_B0 = ReverbSat(((RD_RVB(IIR_SRC_B0) * IIR_COEF) >> 15) + ((downsampled[0] * IN_COEF_L) >> 15)); + IIR_INPUT_B1 = ReverbSat(((RD_RVB(IIR_SRC_B1) * IIR_COEF) >> 15) + ((downsampled[1] * IN_COEF_R) >> 15)); + + IIR_A0 = ReverbSat((((IIR_INPUT_A0 * IIR_ALPHA) >> 14) + (IIASM(IIR_ALPHA, RD_RVB(IIR_DEST_A0, -1)) >> 14)) >> 1); + IIR_A1 = ReverbSat((((IIR_INPUT_A1 * IIR_ALPHA) >> 14) + (IIASM(IIR_ALPHA, RD_RVB(IIR_DEST_A1, -1)) >> 14)) >> 1); + IIR_B0 = ReverbSat((((IIR_INPUT_B0 * IIR_ALPHA) >> 14) + (IIASM(IIR_ALPHA, RD_RVB(IIR_DEST_B0, -1)) >> 14)) >> 1); + IIR_B1 = ReverbSat((((IIR_INPUT_B1 * IIR_ALPHA) >> 14) + (IIASM(IIR_ALPHA, RD_RVB(IIR_DEST_B1, -1)) >> 14)) >> 1); + + WR_RVB(IIR_DEST_A0, IIR_A0); + WR_RVB(IIR_DEST_A1, IIR_A1); + WR_RVB(IIR_DEST_B0, IIR_B0); + WR_RVB(IIR_DEST_B1, IIR_B1); + + ACC0 = ReverbSat((((RD_RVB(ACC_SRC_A0) * ACC_COEF_A) >> 14) + + ((RD_RVB(ACC_SRC_B0) * ACC_COEF_B) >> 14) + + ((RD_RVB(ACC_SRC_C0) * ACC_COEF_C) >> 14) + + ((RD_RVB(ACC_SRC_D0) * ACC_COEF_D) >> 14)) >> 1); + + ACC1 = ReverbSat((((RD_RVB(ACC_SRC_A1) * ACC_COEF_A) >> 14) + + ((RD_RVB(ACC_SRC_B1) * ACC_COEF_B) >> 14) + + ((RD_RVB(ACC_SRC_C1) * ACC_COEF_C) >> 14) + + ((RD_RVB(ACC_SRC_D1) * ACC_COEF_D) >> 14)) >> 1); + + FB_A0 = RD_RVB(MIX_DEST_A0 - FB_SRC_A); + FB_A1 = RD_RVB(MIX_DEST_A1 - FB_SRC_A); + FB_B0 = RD_RVB(MIX_DEST_B0 - FB_SRC_B); + FB_B1 = RD_RVB(MIX_DEST_B1 - FB_SRC_B); + + WR_RVB(MIX_DEST_A0, ReverbSat(ACC0 - ((FB_A0 * FB_ALPHA) >> 15))); + WR_RVB(MIX_DEST_A1, ReverbSat(ACC1 - ((FB_A1 * FB_ALPHA) >> 15))); + + WR_RVB(MIX_DEST_B0, ReverbSat(((FB_ALPHA * ACC0) >> 15) - ((FB_A0 * (int16)(0x8000 ^ FB_ALPHA)) >> 15) - ((FB_B0 * FB_X) >> 15))); + WR_RVB(MIX_DEST_B1, ReverbSat(((FB_ALPHA * ACC1) >> 15) - ((FB_A1 * (int16)(0x8000 ^ FB_ALPHA)) >> 15) - ((FB_B1 * FB_X) >> 15))); + } + + // + // Get output samples + // + RUSB[0][(RvbResPos >> 1) | 0x20] = RUSB[0][RvbResPos >> 1] = (RD_RVB(MIX_DEST_A0) + RD_RVB(MIX_DEST_B0)) >> 1; + RUSB[1][(RvbResPos >> 1) | 0x20] = RUSB[1][RvbResPos >> 1] = (RD_RVB(MIX_DEST_A1) + RD_RVB(MIX_DEST_B1)) >> 1; + + ReverbCur = (ReverbCur + 1) & 0x3FFFF; + if(!ReverbCur) + ReverbCur = ReverbWA; + + for(unsigned lr = 0; lr < 2; lr++) + upsampled[lr] = Reverb2244(&RUSB[lr][((RvbResPos - 39) & 0x3F) >> 1]); + } + else + { + for(unsigned lr = 0; lr < 2; lr++) + upsampled[lr] = Reverb2244(&RUSB[lr][((RvbResPos - 39) & 0x3F) >> 1]); + } + + RvbResPos = (RvbResPos + 1) & 0x3F; + + for(unsigned lr = 0; lr < 2; lr++) + out[lr] = upsampled[lr]; +} + diff --git a/Mednafen/mednafen/psx/timer.cpp b/Mednafen/mednafen/psx/timer.cpp new file mode 100644 index 0000000000..78e0d9639d --- /dev/null +++ b/Mednafen/mednafen/psx/timer.cpp @@ -0,0 +1,538 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "psx.h" +#include "timer.h" + +/* + Notes(some of it may be incomplete or wrong in subtle ways) + + Control bits: + Lower 3 bits of mode, for timer1(when mode is | 0x100): + 0x1 = don't count while in vblank(except that the first count while in vblank does go through) + 0x3 = vblank going inactive triggers timer reset, then some interesting behavior where counting again is delayed... + 0x5 = vblank going inactive triggers timer reset, and only count within vblank. + 0x7 = Wait until vblank goes active then inactive, then start counting? + For timer2: + 0x1 = timer stopped(TODO: confirm on real system) + + Target match counter reset enable 0x008 + Target match IRQ enable 0x010 + Overflow IRQ enable 0x020 + IRQ evaluation auto-reset 0x040 + --unknown-- 0x080 + Clock selection 0x100 + Divide by 8(timer 2 only?) 0x200 + + Counter: + Reset to 0 on writes to the mode/status register. + + Status flags: + Current IRQ line status? 0x0400 + Compare flag 0x0800 + Cleared on mode/status read. + Set repeatedly while counter == target. + + Overflow/Carry flag 0x1000 + Cleared on mode/status read. + Set when counter overflows from 0xFFFF->0. + + Hidden flags: + IRQ done + Cleared on writes to the mode/status register, on writes to the count register, and apparently automatically when the counter + increments if (Mode & 0x40) [Note: If target mode is enabled, and target is 0, IRQ done flag won't be automatically reset] + + There seems to be a brief period(edge condition?) where, if target match reset mode is enabled, you can (sometimes?) read the target value in the count + register before it's reset to 0. Currently not emulated; I doubt any games rely on this, but who knows. Maybe a PSX equivalent + of the PC Engine "Battle Royale"? ;) + + A timer is somewhat unreliable when target match reset mode is enabled and the 33MHz clock is used. Average 2.4 counts seem to be + skipped for that timer every target match reset, but oddly subtracting only 2 from the desired target match value seems to effectively + negate the loss...wonder if my test program is faulty in some way. Currently not emulated. + + Counters using GPU clock sources(hretrace,dot clock) reportedly will with a low probability return wrong count values on an actual PS1, + so keep this in mind when writing test programs(IE keep reading the count value until two consecutive reads return the same value). + Currently not emulated. +*/ + +/* + FIXME: Clock appropriately(and update events) when using SetRegister() via the debugger. + + TODO: If we ever return randomish values to "simulate" open bus, remember to change the return type and such of the TIMER_Read() function to full 32-bit too. +*/ + +namespace MDFN_IEN_PSX +{ + +struct Timer +{ + uint32 Mode; + uint32 Counter; // Only 16-bit, but 32-bit here for detecting counting past target. + uint32 Target; + + uint32 Div8Counter; + + bool IRQDone; + int32 DoZeCounting; +}; + +static bool vblank; +static bool hretrace; +static Timer Timers[3]; +static pscpu_timestamp_t lastts; + +static uint32 CalcNextEvent(void) +{ + uint32 next_event = 1024; // + + for(unsigned i = 0; i < 3; i++) + { + if(!(Timers[i].Mode & 0x30)) // If IRQ is disabled, abort for this timer(don't look at IRQDone for this test, or things will break since its resetting is deferred!). + continue; + + if((Timers[i].Mode & 0x8) && (Timers[i].Counter == 0) && (Timers[i].Target == 0) && !Timers[i].IRQDone) + { + next_event = 1; + continue; + } + + // + // + if((i == 0 || i == 1) && (Timers[i].Mode & 0x100)) // If clocked by GPU, abort for this timer(will result in poor granularity for pixel-clock-derived timer IRQs, but whatever). + continue; + + if(Timers[i].DoZeCounting <= 0) + continue; + + if((i == 0x2) && (Timers[i].Mode & 0x1)) + continue; + + // + // + // + const uint32 target = ((Timers[i].Mode & 0x18) && (Timers[i].Counter < Timers[i].Target)) ? Timers[i].Target : 0x10000; + const uint32 count_delta = target - Timers[i].Counter; + uint32 tmp_clocks; + + if((i == 0x2) && (Timers[i].Mode & 0x200)) + tmp_clocks = (count_delta * 8) - Timers[i].Div8Counter; + else + tmp_clocks = count_delta; + + if(next_event > tmp_clocks) + next_event = tmp_clocks; + } + + return(next_event); +} + +static bool TimerMatch(unsigned i) +{ + bool irq_exact = false; + + Timers[i].Mode |= 0x0800; + + if(Timers[i].Mode & 0x008) + Timers[i].Counter %= std::max(1, Timers[i].Target); + + if((Timers[i].Mode & 0x10) && !Timers[i].IRQDone) + { + if(Timers[i].Counter == 0 || Timers[i].Counter == Timers[i].Target) + irq_exact = true; + +#if 1 + { + const uint16 lateness = (Timers[i].Mode & 0x008) ? Timers[i].Counter : (Timers[i].Counter - Timers[i].Target); + + if(lateness > ((i == 1 && (Timers[i].Mode & 0x100)) ? 0 : 3)) + PSX_DBG(PSX_DBG_WARNING, "[TIMER] Timer %d match IRQ trigger late: %u\n", i, lateness); + } +#endif + + Timers[i].IRQDone = true; + IRQ_Assert(IRQ_TIMER_0 + i, true); + IRQ_Assert(IRQ_TIMER_0 + i, false); + } + + return irq_exact; +} + +static bool TimerOverflow(unsigned i) +{ + bool irq_exact = false; + + Timers[i].Mode |= 0x1000; + Timers[i].Counter &= 0xFFFF; + + if((Timers[i].Mode & 0x20) && !Timers[i].IRQDone) + { + if(Timers[i].Counter == 0) + irq_exact = true; + +#if 1 + if(Timers[i].Counter > ((i == 1 && (Timers[i].Mode & 0x100)) ? 0 : 3)) + PSX_DBG(PSX_DBG_WARNING, "[TIMER] Timer %d overflow IRQ trigger late: %u\n", i, Timers[i].Counter); +#endif + + Timers[i].IRQDone = true; + IRQ_Assert(IRQ_TIMER_0 + i, true); + IRQ_Assert(IRQ_TIMER_0 + i, false); + } + + return irq_exact; +} + +static void ClockTimer(int i, uint32 clocks) +{ + if(Timers[i].DoZeCounting <= 0) + clocks = 0; + + if(i == 0x2) + { + uint32 d8_clocks; + + Timers[i].Div8Counter += clocks; + d8_clocks = Timers[i].Div8Counter >> 3; + Timers[i].Div8Counter &= 0x7; + + if(Timers[i].Mode & 0x200) // Divide by 8, at least for timer 0x2 + clocks = d8_clocks; + + if(Timers[i].Mode & 1) + clocks = 0; + } + + if((Timers[i].Mode & 0x008) && Timers[i].Target == 0 && Timers[i].Counter == 0) + TimerMatch(i); + else if(clocks) + { + uint32 before = Timers[i].Counter; + + Timers[i].Counter += clocks; + + if(Timers[i].Mode & 0x40) + Timers[i].IRQDone = false; + + bool irq_exact = false; + + // + // Target match handling + // + if((before < Timers[i].Target && Timers[i].Counter >= Timers[i].Target) || (Timers[i].Counter >= Timers[i].Target + 0x10000)) + irq_exact |= TimerMatch(i); + + // + // Overflow handling + // + if(Timers[i].Counter >= 0x10000) + irq_exact |= TimerOverflow(i); + + // + if((Timers[i].Mode & 0x40) && !irq_exact) + Timers[i].IRQDone = false; + } +} + +void TIMER_SetVBlank(bool status) +{ + switch(Timers[1].Mode & 0x7) + { + case 0x1: + Timers[1].DoZeCounting = !status; + break; + + case 0x3: + if(vblank && !status) + { + Timers[1].Counter = 0; + if(Timers[1].Counter == Timers[1].Target) + TimerMatch(1); + } + break; + + case 0x5: + Timers[1].DoZeCounting = status; + if(vblank && !status) + { + Timers[1].Counter = 0; + if(Timers[1].Counter == Timers[1].Target) + TimerMatch(1); + } + break; + + case 0x7: + if(Timers[1].DoZeCounting == -1) + { + if(!vblank && status) + Timers[1].DoZeCounting = 0; + } + else if(Timers[1].DoZeCounting == 0) + { + if(vblank && !status) + Timers[1].DoZeCounting = 1; + } + break; + } + vblank = status; +} + +void TIMER_SetHRetrace(bool status) +{ + if(hretrace && !status) + { + if((Timers[0].Mode & 0x7) == 0x3) + { + Timers[0].Counter = 0; + + if(Timers[0].Counter == Timers[0].Target) + TimerMatch(0); + } + } + + hretrace = status; +} + +void TIMER_AddDotClocks(uint32 count) +{ + if(Timers[0].Mode & 0x100) + ClockTimer(0, count); +} + +void TIMER_ClockHRetrace(void) +{ + if(Timers[1].Mode & 0x100) + ClockTimer(1, 1); +} + +pscpu_timestamp_t TIMER_Update(const pscpu_timestamp_t timestamp) +{ + int32 cpu_clocks = timestamp - lastts; + + for(int i = 0; i < 3; i++) + { + uint32 timer_clocks = cpu_clocks; + + if(Timers[i].Mode & 0x100) + continue; + + ClockTimer(i, timer_clocks); + } + + lastts = timestamp; + + return(timestamp + CalcNextEvent()); +} + +static void CalcCountingStart(unsigned which) +{ + Timers[which].DoZeCounting = true; + + switch(which) + { + case 1: + switch(Timers[which].Mode & 0x07) + { + case 0x1: + Timers[which].DoZeCounting = !vblank; + break; + + case 0x5: + Timers[which].DoZeCounting = vblank; + break; + + case 0x7: + Timers[which].DoZeCounting = -1; + break; + } + break; + + + } +} + +void TIMER_Write(const pscpu_timestamp_t timestamp, uint32 A, uint16 V) +{ + TIMER_Update(timestamp); + + int which = (A >> 4) & 0x3; + + V <<= (A & 3) * 8; + + PSX_DBGINFO("[TIMER] Write: %08x %04x\n", A, V); + + if(which >= 3) + return; + + switch(A & 0xC) + { + case 0x0: Timers[which].IRQDone = false; + Timers[which].Counter = V & 0xFFFF; + break; + + case 0x4: Timers[which].Mode = (V & 0x3FF) | (Timers[which].Mode & 0x1C00); + Timers[which].IRQDone = false; + Timers[which].Counter = 0; + + CalcCountingStart(which); // Call after setting .Mode + break; + + case 0x8: Timers[which].Target = V & 0xFFFF; + break; + + case 0xC: // Open bus + break; + } + + if(Timers[which].Counter == Timers[which].Target) + TimerMatch(which); + + PSX_SetEventNT(PSX_EVENT_TIMER, timestamp + CalcNextEvent()); +} + +uint16 TIMER_Read(const pscpu_timestamp_t timestamp, uint32 A) +{ + uint16 ret = 0; + int which = (A >> 4) & 0x3; + + if(which >= 3) + { + PSX_WARNING("[TIMER] Open Bus Read: 0x%08x", A); + + return(ret >> ((A & 3) * 8)); + } + + TIMER_Update(timestamp); + + switch(A & 0xC) + { + case 0x0: ret = Timers[which].Counter; + break; + + case 0x4: ret = Timers[which].Mode; + Timers[which].Mode &= ~0x1000; + if(Timers[which].Counter != Timers[which].Target) + Timers[which].Mode &= ~0x0800; + break; + + case 0x8: ret = Timers[which].Target; + break; + + case 0xC: PSX_WARNING("[TIMER] Open Bus Read: 0x%08x", A); + break; + } + + return(ret >> ((A & 3) * 8)); +} + + +void TIMER_ResetTS(void) +{ + lastts = 0; +} + + +void TIMER_Power(void) +{ + lastts = 0; + + hretrace = false; + vblank = false; + memset(Timers, 0, sizeof(Timers)); +} + +void TIMER_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { +#define SFTIMER(n) SFVARN(Timers[n].Mode, #n "Mode"), \ + SFVARN(Timers[n].Counter, #n "Counter"), \ + SFVARN(Timers[n].Target, #n "Target"), \ + SFVARN(Timers[n].Div8Counter, #n "Div8Counter"), \ + SFVARN(Timers[n].IRQDone, #n "IRQDone"), \ + SFVARN(Timers[n].DoZeCounting, #n "DoZeCounting") + SFTIMER(0), + SFTIMER(1), + SFTIMER(2), +#undef SFTIMER + + SFVAR(vblank), + SFVAR(hretrace), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "TIMER"); + + if(load) + { + for(unsigned n = 0; n < 3; n++) + { + Timers[n].Counter &= 0xFFFF; + Timers[n].Target &= 0xFFFF; + Timers[n].Div8Counter &= 0x7; + } + } +} + +uint32 TIMER_GetRegister(unsigned int which, char *special, const uint32 special_len) +{ + int tw = (which >> 4) & 0x3; + uint32 ret = 0; + + switch(which & 0xF) + { + case TIMER_GSREG_COUNTER0: + ret = Timers[tw].Counter; + break; + + case TIMER_GSREG_MODE0: + ret = Timers[tw].Mode; + break; + + case TIMER_GSREG_TARGET0: + ret = Timers[tw].Target; + break; + } + + return(ret); +} + +void TIMER_SetRegister(unsigned int which, uint32 value) +{ + int tw = (which >> 4) & 0x3; + + switch(which & 0xF) + { + case TIMER_GSREG_COUNTER0: + Timers[tw].Counter = value & 0xFFFF; + break; + + case TIMER_GSREG_MODE0: + Timers[tw].Mode = value & 0xFFFF; + break; + + case TIMER_GSREG_TARGET0: + Timers[tw].Target = value & 0xFFFF; + break; + } + + if(Timers[tw].Counter == Timers[tw].Target) + TimerMatch(tw); +} + + +} diff --git a/Mednafen/mednafen/psx/timer.h b/Mednafen/mednafen/psx/timer.h new file mode 100644 index 0000000000..e7ae995258 --- /dev/null +++ b/Mednafen/mednafen/psx/timer.h @@ -0,0 +1,42 @@ +#ifndef __MDFN_PSX_TIMER_H +#define __MDFN_PSX_TIMER_H + +namespace MDFN_IEN_PSX +{ + +enum +{ + TIMER_GSREG_COUNTER0 = 0x00, + TIMER_GSREG_MODE0, + TIMER_GSREG_TARGET0, + + TIMER_GSREG_COUNTER1 = 0x10, + TIMER_GSREG_MODE1, + TIMER_GSREG_TARGET1, + + TIMER_GSREG_COUNTER2 = 0x20, + TIMER_GSREG_MODE2, + TIMER_GSREG_TARGET2, +}; + +uint32 TIMER_GetRegister(unsigned int which, char *special, const uint32 special_len); +void TIMER_SetRegister(unsigned int which, uint32 value); + + +void TIMER_Write(const pscpu_timestamp_t timestamp, uint32 A, uint16 V); +uint16 TIMER_Read(const pscpu_timestamp_t timestamp, uint32 A); + +void TIMER_AddDotClocks(uint32 count); +void TIMER_ClockHRetrace(void); +void TIMER_SetHRetrace(bool status); +void TIMER_SetVBlank(bool status); + +pscpu_timestamp_t TIMER_Update(const pscpu_timestamp_t); +void TIMER_ResetTS(void); + +void TIMER_Power(void) MDFN_COLD; +void TIMER_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +} + +#endif diff --git a/Mednafen/mednafen/qtrecord.cpp b/Mednafen/mednafen/qtrecord.cpp new file mode 100644 index 0000000000..8c198990c5 --- /dev/null +++ b/Mednafen/mednafen/qtrecord.cpp @@ -0,0 +1,1093 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include "endian.h" +#include "qtrecord.h" +#include "compress/minilzo.h" +#include "video/png.h" + +#include +#include + +void QTRecord::w16(uint16 val) +{ + uint8 buf[2]; + + MDFN_en16msb(buf, val); + + qtfile.write(buf, sizeof(buf)); +} + +void QTRecord::w32(uint32 val) +{ + uint8 buf[4]; + + MDFN_en32msb(buf, val); + + qtfile.write(buf, sizeof(buf)); +} + +void QTRecord::w32s(const char *str) +{ + uint8 buf[4]; + + memset(buf, 0x20, sizeof(buf)); + + for(unsigned int i = 0; i < sizeof(buf); i++) + { + if(!str[i]) + break; + + buf[i] = str[i]; + } + + qtfile.write(buf, sizeof(buf)); +} + +void QTRecord::w64s(const char *str) +{ + uint8 buf[8]; + + memset(buf, 0x20, sizeof(buf)); + + for(unsigned int i = 0; i < sizeof(buf); i++) + { + if(!str[i]) + break; + + buf[i] = str[i]; + } + + qtfile.write(buf, sizeof(buf)); +} + + +void QTRecord::w64(uint64 val) +{ + uint8 buf[8]; + + MDFN_en64msb(buf, val); + + qtfile.write(buf, sizeof(buf)); +} + +// fixed_len doesn't include the leading 1-byte count +void QTRecord::wps(const char *str, uint8 fixed_len) +{ + uint8 slen = std::min(255, strlen(str)); + uint8 count = (fixed_len ? fixed_len : slen); + char buf[1 + 255]; + + memset(buf, 0, sizeof(buf)); + buf[0] = count; + memcpy(&buf[1], str, std::min(slen, count)); + + qtfile.write(buf, 1 + count); +} + +void QTRecord::vardata_begin(void) +{ + vardata_foffsets.push_back(qtfile.tell()); + + w32(0); // Overwritten in vardata_end() +} + +void QTRecord::vardata_end(void) +{ + uint64 cur_offset = qtfile.tell(); + uint64 start_offset = vardata_foffsets.back(); + + vardata_foffsets.pop_back(); + + qtfile.seek(start_offset, SEEK_SET); + w32(cur_offset - start_offset); + + //printf("%d\n", cur_offset - start_offset); + + qtfile.seek(cur_offset, SEEK_SET); +} + +void QTRecord::atom_begin(uint32 type, bool small_atom) +{ + //small_atom = true; // DEBUG, REMOVE ME + + atom_foffsets.push_back(qtfile.tell()); + atom_smalls.push_back(small_atom); + + if(small_atom) + { + w32(0); + w32(type); + } + else + { + w32(0x00000001); + w32(type); + w64(0); + } +} + + +void QTRecord::atom_begin(const char *type, bool small_atom) +{ + uint32 type_num = 0; + + for(int i = 0; i < 4; i++) + { + if(!type[i]) + break; + + type_num |= (uint32)type[i] << ((3 - i) * 8); + } + atom_begin(type_num, small_atom); +} + +void QTRecord::atom_end(void) +{ + uint64 cur_offset = qtfile.tell(); + uint64 start_offset = atom_foffsets.back(); + bool small_atom = atom_smalls.back(); + + atom_foffsets.pop_back(); + atom_smalls.pop_back(); + + if(small_atom) + { + qtfile.seek(start_offset, SEEK_SET); + w32(cur_offset - start_offset); + } + else + { + qtfile.seek(start_offset + 8, SEEK_SET); + + w64(cur_offset - start_offset); + } + + qtfile.seek(cur_offset, SEEK_SET); +} + +QTRecord::QTRecord(const std::string& path, const VideoSpec &spec) : qtfile(path, FileStream::MODE_WRITE_SAFE), resampler(NULL) +{ + Finished = false; + + SoundFramesWritten = 0; + + SoundRate = spec.SoundRate; + SoundChan = spec.SoundChan; + + // If we change the rate threshold for resampling here, remember to change the std::min in the informational printf in + // mednafen.cpp + if(SoundRate > 64000) + { + int err = 0; + + ResampInRate = spec.SoundRate; + SoundRate = 64000; + if(!(resampler = speex_resampler_init(spec.SoundChan, spec.SoundRate, SoundRate, 5, &err))) + { + throw MDFN_Error(0, _("Error initializing audio resampler.")); + } + //printf("%f ms\n", 1000.0 * speex_resampler_get_input_latency(resampler) / spec.SoundRate); + } + else + resampler = NULL; + + ResampInBufferFramesInCount = 0; + ResampInBuffer.resize(0); + ResampOutBuffer.resize(0); + + //ResampInBuffer.resize((uint32)((100 * spec.SoundRate + 999) / 1000) * SoundChan); + //ResampOutBuffer.resize((uint32)((100 * SoundRate + 999) / 1000) * SoundChan); + + //printf("%u %u\n", ResampInBuffer.size(), ReampOutBuffer.size()); + + TimeIndex = 0; + if(SoundRate && SoundChan) + { + TimeScale = SoundRate; + } + else + { + TimeScale = 10000; + MC = spec.MasterClock; + MCAccum = 0; + } + + QTVideoWidth = spec.VideoWidth; + QTVideoHeight = spec.VideoHeight; + + A = 65536 * spec.AspectXAdjust; + D = 65536 * spec.AspectYAdjust; + + VideoCodec = spec.VideoCodec; + + if(VideoCodec == VCODEC_PNG) + RawVideoBuffer.resize((1 + QTVideoWidth * 3) * QTVideoHeight); + else + RawVideoBuffer.resize(QTVideoWidth * QTVideoHeight * 3); + + if(VideoCodec == VCODEC_CSCD) + CompressedVideoBuffer.resize((RawVideoBuffer.size() * 110 + 99 ) / 100); // 1.10 + else if(VideoCodec == VCODEC_PNG) + CompressedVideoBuffer.resize(compressBound(RawVideoBuffer.size())); + + { + int64 unixy_time = time(NULL); + uint32 appley_time; + + //if(unixy_time == (time_t)-1) // TODO: handle error + + //printf("%d\n", unixy_time); + + appley_time = unixy_time + 2082844800; + + CreationTS = appley_time; + ModificationTS = appley_time; + } + + Write_ftyp(); + + atom_begin("mdat", false); +} + + +void QTRecord::WriteFrame(const MDFN_Surface *surface, const MDFN_Rect &DisplayRect, const int32 *LineWidths, + const int16 *SoundBuf, const int32 SoundBufSize, const int64 MasterCycles) +{ + QTChunk qts; + + memset(&qts, 0, sizeof(qts)); + + if(DisplayRect.h <= 0) + { + fprintf(stderr, "[BUG] qtrecord.cpp: DisplayRect.h <= 0\n"); + return; + } + + + qts.video_foffset = qtfile.tell(); + + // Write video here + { + uint32 dest_y = 0; + int yscale_factor = QTVideoHeight / DisplayRect.h; + + for(int y = DisplayRect.y; y < DisplayRect.y + DisplayRect.h; y++) + { + int x_start; + int width; + int xscale_factor; + uint32 dest_x; + uint32 *src_ptr; + uint8 *dest_line; + + if(dest_y >= QTVideoHeight) + break; + + if(VideoCodec == VCODEC_CSCD) + dest_line = &RawVideoBuffer[(QTVideoHeight - 1 - dest_y) * QTVideoWidth * 3]; + else if(VideoCodec == VCODEC_PNG) + dest_line = &RawVideoBuffer[dest_y * (QTVideoWidth * 3 + 1)]; + else + dest_line = &RawVideoBuffer[dest_y * QTVideoWidth * 3]; + + x_start = DisplayRect.x; + + if(LineWidths[0] == ~0) + width = DisplayRect.w; + else + width = LineWidths[y]; + + xscale_factor = QTVideoWidth / width; + + dest_x = 0; + + src_ptr = surface->pixels + y * surface->pitchinpix + x_start; + + if(VideoCodec == VCODEC_PNG) + { + *dest_line = 0; + dest_line++; + } + +#if 0 + while(dest_x < ((QTVideoWidth - (xscale_factor * width)) / 2)) + { + dest_line[dest_x * 3 + 0] = 0; + dest_line[dest_x * 3 + 1] = 0; + dest_line[dest_x * 3 + 2] = 0; + + dest_x++; + } +#endif + + for(int x = x_start; x < x_start + width; x++) + { + for(int sub_x = 0; sub_x < xscale_factor; sub_x++) + { + if(dest_x < QTVideoWidth) + { + int r, g, b, a; + + surface->DecodeColor(*src_ptr, r, g, b, a); + + if(VideoCodec == VCODEC_CSCD) + { + dest_line[dest_x * 3 + 0] = b; + dest_line[dest_x * 3 + 1] = g; + dest_line[dest_x * 3 + 2] = r; + } + else + { + dest_line[dest_x * 3 + 0] = r; + dest_line[dest_x * 3 + 1] = g; + dest_line[dest_x * 3 + 2] = b; + } + + dest_x++; + } + } + src_ptr++; + } + + while(dest_x < QTVideoWidth) + { + dest_line[dest_x * 3 + 0] = 0; + dest_line[dest_x * 3 + 1] = 0; + dest_line[dest_x * 3 + 2] = 0; + + dest_x++; + } + + for(int sub_y = 1; sub_y < yscale_factor; sub_y++) + { + if((dest_y + sub_y) >= QTVideoHeight) + break; + + if(VideoCodec == VCODEC_CSCD) + memcpy(&RawVideoBuffer[(QTVideoHeight - 1 - (dest_y + sub_y)) * QTVideoWidth * 3], dest_line, QTVideoWidth * 3); + else if(VideoCodec == VCODEC_PNG) + memcpy(&RawVideoBuffer[(dest_y + sub_y) * (QTVideoWidth * 3 + 1)], dest_line - 1, QTVideoWidth * 3 + 1); + else + memcpy(&RawVideoBuffer[(dest_y + sub_y) * QTVideoWidth * 3], dest_line, QTVideoWidth * 3); + } + + dest_y += yscale_factor; + } // end for(int y = DisplayRect.y; y < DisplayRect.y + DisplayRect.h; y++) + } + + if(VideoCodec == VCODEC_CSCD) + { + static uint8 workmem[LZO1X_1_MEM_COMPRESS]; + lzo_uint dst_len = CompressedVideoBuffer.size(); + uint8 tmp[2]; + + tmp[0] = (0 << 1) | 0x1; + tmp[1] = 0; + + qtfile.write(tmp, 2); + + lzo1x_1_compress(&RawVideoBuffer[0], RawVideoBuffer.size(), &CompressedVideoBuffer[0], &dst_len, workmem); + + qtfile.write(&CompressedVideoBuffer[0], dst_len); + } + else if(VideoCodec == VCODEC_RAW) + qtfile.write(&RawVideoBuffer[0], RawVideoBuffer.size()); + else if(VideoCodec == VCODEC_PNG) + { + //PNGWrite(qtfile, surface, DisplayRect, LineWidths); + static const uint8 png_sig[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; + uint8 IHDR[13]; + uLongf compress_buffer_size; + + qtfile.write(png_sig, sizeof(png_sig)); + + MDFN_en32msb(&IHDR[0], QTVideoWidth); + MDFN_en32msb(&IHDR[4], QTVideoHeight); + + IHDR[8] = 8; // 8 bits per color component + IHDR[9] = 2; // Color type: RGB triplet(no alpha) + IHDR[10] = 0; // Compression: deflate + IHDR[11] = 0; // Basic adaptive filter set + IHDR[12] = 0; // No interlace + + + PNGWrite::WriteChunk(qtfile, 13, "IHDR", IHDR); + + compress_buffer_size = CompressedVideoBuffer.size(); + + compress(&CompressedVideoBuffer[0], &compress_buffer_size, &RawVideoBuffer[0], RawVideoBuffer.size()); + + PNGWrite::WriteChunk(qtfile, compress_buffer_size, "IDAT", &CompressedVideoBuffer[0]); + + PNGWrite::WriteChunk(qtfile, 0, "IEND", 0); + } + + + + qts.video_byte_size = qtfile.tell() - qts.video_foffset; + + + + qts.audio_foffset = qtfile.tell(); + + // Write audio here + // + // + int32 SoundBufROSize; + + if(resampler) + { + spx_uint32_t in_len; + spx_uint32_t out_len; + + if((ResampInBuffer.size() - (ResampInBufferFramesInCount * SoundChan)) < SoundBufSize * SoundChan) + ResampInBuffer.resize((ResampInBufferFramesInCount + SoundBufSize) * SoundChan); + + for(unsigned i = 0; i < SoundBufSize * SoundChan; i++) + ResampInBuffer[ResampInBufferFramesInCount * SoundChan + i] = SoundBuf[i]; + + ResampInBufferFramesInCount += SoundBufSize; + + { + // *2 for padding for potential precision issues related to the resampling ratio. + size_t needed_out_size = (uint64_t)ResampInBuffer.size() / SoundChan * 2 * SoundRate / ResampInRate * SoundChan; + + //printf("Zoom: %u %u\n", (unsigned)ResampInBuffer.size(), (unsigned)needed_out_size); + + if(ResampOutBuffer.size() < needed_out_size) + ResampOutBuffer.resize(needed_out_size); + + // Very crude, but works because we're only downsampling. TODO make it more precise? + //if(ResampOutBuffer.size() < ResampInBuffer.size()) + // ResampOutBuffer.resize(ResampInBuffer.size()); + } + + in_len = ResampInBufferFramesInCount; + out_len = ResampOutBuffer.size() / SoundChan; + + speex_resampler_process_interleaved_int(resampler, (const spx_int16_t *)&ResampInBuffer[0], &in_len, (spx_int16_t *)&ResampOutBuffer[0], &out_len); + + if((ResampInBufferFramesInCount - in_len) > 0) // Shouldn't happen, unless there's not enough room in the output buffer. + { + printf("%u\n", ResampInBufferFramesInCount - in_len); + memmove(&ResampInBuffer[0], &ResampInBuffer[in_len * SoundChan], (ResampInBufferFramesInCount - in_len) * sizeof(int16) * SoundChan); + } + + ResampInBufferFramesInCount -= in_len; + SoundBufROSize = out_len; + + for(unsigned i = 0; i < SoundBufROSize * SoundChan; i++) + MDFN_en16msb((uint8 *)&ResampOutBuffer[i], ResampOutBuffer[i]); + } + else + { + SoundBufROSize = SoundBufSize; + + if(ResampOutBuffer.size() < SoundBufSize * SoundChan) + ResampOutBuffer.resize(SoundBufSize * SoundChan); + + for(unsigned i = 0; i < SoundBufROSize * SoundChan; i++) + MDFN_en16msb((uint8 *)&ResampOutBuffer[i], SoundBuf[i]); + } + + qtfile.write(&ResampOutBuffer[0], sizeof(int16) * SoundBufROSize * SoundChan); + // + // + // + qts.audio_byte_size = qtfile.tell() - qts.audio_foffset; + + SoundFramesWritten += SoundBufROSize; + + if(SoundRate && SoundChan) + { + qts.time_length = qts.audio_byte_size / SoundChan / sizeof(int16); + TimeIndex += SoundBufROSize; + } + else + { + uint64 tnt; + + MCAccum += (uint64)MasterCycles * TimeScale; + tnt = MCAccum / (MC >> 32); + MCAccum %= (MC >> 32); + + //printf("%u\n", tnt); + + qts.time_length = tnt; + TimeIndex += tnt; + } + + QTChunks.push_back(qts); +} + +void QTRecord::Write_ftyp(void) // Leaf +{ + atom_begin("ftyp"); + + w32s("qt "); // Major brand + + w32(0x20070900); // Minor_Version + + w32s("qt "); // Compatible brand + + // Placeholders to get the mdat start at 0x20 for prettiness(and libquicktime does it, I don't know if it has another reason). + w32(0); + w32(0); + w32(0); + + atom_end(); +} + +void QTRecord::Write_mvhd(void) // Leaf +{ + atom_begin("mvhd"); + + w32(0); // Version/flags + w32(CreationTS); // Created Mac date + w32(ModificationTS); // Modified Mac date + w32(TimeScale); // Time scale + + w32(TimeIndex); // Duration + w32(65536 * 1); // Preferred rate + w16(256 * 1); // Preferred volume + + for(int i = 0; i < 5; i++) + w16(0); // Reserved(5 * 2 = 10) + + w32(65536 * 1); // A + w32(0); // B + w32(0); // U + w32(0); // C + w32(65536 * 1); // D + w32(0); // V + w32(0); // X + w32(0); // Y + w32(1 << 30); // W + + w32(0); // Preview time + w32(0); // Preview duration + + w32(0); // Poster time + + w32(0); // Selection time. + w32(TimeIndex); // Selection duration. + + w32(0); // Current time + + // Next track id + if(SoundRate && SoundChan) + w32(3); + else + w32(2); + + atom_end(); +} + +void QTRecord::Write_tkhd(void) // Leaf +{ + atom_begin("tkhd"); + + w32(0xF); // Version and flags + + w32(CreationTS); // Created mac date + w32(ModificationTS); // Modified mac date + + if(OnAudioTrack) + w32(2); + else + w32(1); // Track id + + w32(0); // Reserved + + w32(TimeIndex); // Duration + + w64(0); // Reserved + + w16(0); // Video layer. + w16(0); // Alternate/other + w16(256); // Track audio volume + w16(0); // Reserved + + w32(A); // A + w32(0); // B + w32(0); // U + w32(0); // C + w32(D); // D + w32(0); // V + w32(0); // X + w32(0); // Y + w32(1 << 30); // W + + w32(65536 * QTVideoWidth); + w32(65536 * QTVideoHeight); + + atom_end(); +} + +// Sample description +void QTRecord::Write_stsd(void) // Leaf +{ + atom_begin("stsd"); + + w32(0); // Version and flags + + w32(1); // Number of sample descriptions + + if(OnAudioTrack) // Audio track + { + vardata_begin(); // w32(36) + + w32s("twos"); // Data format + + w32(0); // Reserved + w16(0); // Reserved + + w16(1); // dref index? + + w16(0); // Version + w16(0); // Revision level + + w32s("MDFN"); // Vendor + + w16(SoundChan); // Number of sound channels + w16(16); // Sample size + w16(0); // Audio compression ID + w16(0); // Audio packet rate + w32(SoundRate * 65536); // Audio sample rate + + vardata_end(); + } + else // Video track + { + vardata_begin(); // w32(86 + 12); // Description length (+12 for gama) + + if(VideoCodec == VCODEC_CSCD) + w32s("CSCD"); // Data format + else if(VideoCodec == VCODEC_PNG) + w32s("png "); + else + w32s("raw "); // Data format + + w32(0); // Reserved + w16(0); // Reserved + + w16(1); // dref index? + + w16(0); // Version + w16(0); // Revision level + + w32s("MDFN"); // Vendor + + w32(1024); // Video temporal quality + w32(1024); // Video spatial quality + + w16(QTVideoWidth); // Width of source image + w16(QTVideoHeight); // Height of source image + + w32(48 * 65536); // Horizontal PPI(FIXME) + + w32(48 * 65536); // Vertical PPI(FIXME) + + w32(0); // Data size must be set to 0 + + w16(1); // Frame count(per sample) + + wps("Mednafen " MEDNAFEN_VERSION, 31); // Video encoder + + w16(24); // Depth + + w16(0xFFFF); // Color table ID + + atom_begin("gama"); + w32(65536 * 2.2); + atom_end(); + + vardata_end(); + } + + atom_end(); +} + +// Time-to-sample +void QTRecord::Write_stts(void) // Leaf +{ + atom_begin("stts"); + + w32(0); // Version and flags + + if(OnAudioTrack) + { + w32(1); // Number of entries + + // Entry + w32(SoundFramesWritten); + w32(1); + } + else + { + w32(QTChunks.size()); // number of entries + + for(uint32 i = 0; i < QTChunks.size(); i++) + { + w32(1); + w32(QTChunks[i].time_length); + } + } + + atom_end(); +} + +// Sample-to-chunk +void QTRecord::Write_stsc(void) // Leaf +{ + atom_begin("stsc"); + + w32(0); // Version and flags + + if(OnAudioTrack) + { + w32(QTChunks.size()); // Number of entries + for(uint32 i = 0; i < QTChunks.size(); i++) + { + w32(1 + i); // First chunk number using this entry + w32(QTChunks[i].audio_byte_size / SoundChan / sizeof(int16)); // Samples per chunk + w32(1); // Sample description ID(references stsd) + } + } + else + { + w32(1); // Number of entries + w32(1); // First chunk + w32(1); // Samples per chunk + w32(1); // Sample description ID(references data in stsd) + } + + atom_end(); +} + +void QTRecord::Write_stsz(void) // Leaf +{ + atom_begin("stsz"); + + w32(0); // Version and flags + + if(OnAudioTrack) + { + w32(1); + w32(SoundFramesWritten); + } + else + { + w32(0); // Sample size + + w32(QTChunks.size()); // Number of entries + + for(uint32 i = 0; i < QTChunks.size(); i++) + { + if(OnAudioTrack) + w32(QTChunks[i].audio_byte_size); + else + w32(QTChunks[i].video_byte_size); + } + } + + atom_end(); +} + +// Chunk offset atom(64-bit style) +void QTRecord::Write_co64(void) // Leaf +{ + atom_begin("co64"); + + w32(0); // Version and flags + + w32(QTChunks.size()); // Number of entries + + for(uint32 i = 0; i < QTChunks.size(); i++) + { + if(OnAudioTrack) + w64(QTChunks[i].audio_foffset); + else + w64(QTChunks[i].video_foffset); + } + + atom_end(); +} + +void QTRecord::Write_stco(void) // Leaf +{ + atom_begin("stco"); + + w32(0); // Version and flags + + w32(QTChunks.size()); // Number of entries + + for(uint32 i = 0; i < QTChunks.size(); i++) + { + if(OnAudioTrack) + w32(QTChunks[i].audio_foffset); + else + w32(QTChunks[i].video_foffset); + } + + atom_end(); +} + +void QTRecord::Write_stbl(void) +{ + atom_begin("stbl"); + + Write_stsd(); + + Write_stts(); + + Write_stsc(); + + Write_stsz(); + + bool need64bit_offset = false; + + if(OnAudioTrack && QTChunks.back().audio_foffset >= ((uint64)1 << 32)) + need64bit_offset = true; + + if(!OnAudioTrack && QTChunks.back().video_foffset >= ((uint64)1 << 32)) + need64bit_offset = true; + + if(need64bit_offset) + Write_co64(); + else + Write_stco(); + + atom_end(); +} + +// Media header atom +void QTRecord::Write_mdhd(void) // Leaf +{ + atom_begin("mdhd"); + + w32(0); // Version/flags + w32(CreationTS); // Creation date + w32(ModificationTS); // Modification date + w32(TimeScale); // Time scale + w32(TimeIndex); // Duration + + w16(0); // Language + w16(0); // Quality + + atom_end(); +} + +// Sound media information header +void QTRecord::Write_smhd(void) // Leaf +{ + atom_begin("smhd"); + w32(0x1); // Version/flags + w16(0); // Balance + w16(0); // Reserved + + atom_end(); +} + +// Video media information header +void QTRecord::Write_vmhd(void) // Leaf +{ + atom_begin("vmhd"); + + w32(0x1); // Version/flags + + w16(0); // Quickdraw graphics mode (Simple Copy, no dither) + + // RGB values(unused I guess in simple copy?) + w16(0x8000); + w16(0x8000); + w16(0x8000); + + atom_end(); +} + +void QTRecord::Write_hdlr(const char *str, const char *comp_name) // Leaf +{ + atom_begin("hdlr"); + + w32(0); // Version/flags + + w64s(str); + + w32(0); // Reserved + + w32(0); // reserved + + w32(0); // Reserved + + wps(comp_name, 0); + + atom_end(); +} + +void QTRecord::Write_dinf(void) +{ + atom_begin("dinf"); + + atom_begin("dref"); + + w32(0); // Version/flags + w32(1); // Number of references + + atom_begin("alis"); + w32(0x00000001); // Version/flags + atom_end(); + + atom_end(); + + atom_end(); +} + +void QTRecord::Write_minf(void) +{ + atom_begin("minf"); + + if(OnAudioTrack) + Write_smhd(); + else + Write_vmhd(); + + Write_hdlr("dhlralis", "Mednafen Alias Data Handler"); + + Write_dinf(); + + Write_stbl(); + + atom_end(); +} + +void QTRecord::Write_mdia(void) +{ + atom_begin("mdia"); + + Write_mdhd(); + + if(OnAudioTrack) + Write_hdlr("mhlrsoun", "Mednafen Sound Media Handler"); + else + Write_hdlr("mhlrvide", "Mednafen Video Media Handler"); + + Write_minf(); + + atom_end(); +} + +void QTRecord::Write_edts(void) +{ + atom_begin("edts"); + + atom_begin("elst"); + w32(0); // version/flags + w32(1); // Number of edits + w32(TimeIndex); // Duration + w32(0); // start time + w32(65536 * 1); // Rate + atom_end(); + + atom_end(); +} + +void QTRecord::Write_trak(void) +{ + atom_begin("trak"); + + Write_tkhd(); + + Write_edts(); + + Write_mdia(); + + atom_end(); +} + +void QTRecord::Write_udta(void) +{ + atom_begin("udta"); + + atom_begin("@fmt"); + + qtfile.put_string("Computer-generated via an emulator."); + + atom_end(); + + atom_begin("@swr"); + + qtfile.put_string("Mednafen " MEDNAFEN_VERSION); + + atom_end(); + + atom_end(); +} + +void QTRecord::Write_moov(void) +{ + atom_begin("moov"); + + Write_mvhd(); + + OnAudioTrack = false; + Write_trak(); + + if(SoundRate && SoundChan) + { + OnAudioTrack = true; + Write_trak(); + } + + Write_udta(); + + atom_end(); +} + +void QTRecord::Finish(void) +{ + if(Finished) + return; + + Finished = true; + + atom_end(); + + Write_moov(); + + qtfile.close(); +} + +QTRecord::~QTRecord(void) +{ + try + { + Finish(); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } + + if(resampler) + { + speex_resampler_destroy(resampler); + resampler = NULL; + } +} diff --git a/Mednafen/mednafen/qtrecord.h b/Mednafen/mednafen/qtrecord.h new file mode 100644 index 0000000000..3511788d43 --- /dev/null +++ b/Mednafen/mednafen/qtrecord.h @@ -0,0 +1,132 @@ +#ifndef __MDFN_QTRECORD_H +#define __MDFN_QTRECORD_H + +#include "mednafen.h" +#include +#include "resampler/resampler.h" + +#include +#include + +class QTRecord +{ + public: + + enum + { + VCODEC_RAW = 0, + VCODEC_CSCD, + VCODEC_PNG + }; + + struct VideoSpec + { + uint32 SoundRate; + uint32 SoundChan; // Number of sound channels + + uint32 VideoWidth; + uint32 VideoHeight; + + double AspectXAdjust; + double AspectYAdjust; + + int64 MasterClock; // Fixed-point, 32.32, should be used when SoundRate == 0 + + int VideoCodec; + }; + + QTRecord(const std::string& path, const VideoSpec &spec_arg); + void Finish(); + ~QTRecord(); + + void WriteFrame(const MDFN_Surface *surface, const MDFN_Rect &DisplayRect, const int32 *LineWidths, + const int16 *SoundBuf, const int32 SoundBufSize, const int64 MasterCycles); + private: + + void w8(uint8 val); + void w16(uint16 val); + void w32(uint32 val); + void w32s(const char *str); + void w64s(const char *str); + void w64(uint64 val); + void wps(const char *str, uint8 fixed_len = 0); + void atom_begin(uint32 type, bool small_atom = true); + void atom_begin(const char *type, bool small_atom = true); + void atom_end(void); + + void vardata_begin(void); + void vardata_end(void); + + void Write_ftyp(void); + void Write_mvhd(void); + void Write_tkhd(void); + void Write_stsd(void); + void Write_stts(void); + void Write_stsc(void); + void Write_stsz(void); + void Write_co64(void); + void Write_stco(void); + void Write_stbl(void); + void Write_mdhd(void); + void Write_smhd(void); + void Write_vmhd(void); + void Write_hdlr(const char *str, const char *comp_name); + void Write_dinf(void); + void Write_minf(void); + void Write_mdia(void); + void Write_edts(void); + void Write_trak(void); + void Write_udta(void); + void Write_moov(void); + + + FileStream qtfile; + + std::vector RawVideoBuffer; + std::vector CompressedVideoBuffer; + + std::list atom_smalls; + std::list atom_foffsets; + std::list vardata_foffsets; + bool OnAudioTrack; // Yay spaghetti code power. + + struct QTChunk + { + uint64 video_foffset; + uint64 video_byte_size; + + uint64 audio_foffset; + uint64 audio_byte_size; + + uint32 time_length; + }; + + int VideoCodec; + uint32 QTVideoWidth; + uint32 QTVideoHeight; + uint32 SoundRate; + uint32 SoundChan; + uint32 A; + uint32 D; + + uint32 CreationTS; + uint32 ModificationTS; + + std::vector QTChunks; + uint64 SoundFramesWritten; + + uint32 TimeScale; + uint64 TimeIndex; + uint64 MCAccum; + uint64 MC; + + bool Finished; + + SpeexResamplerState *resampler; + uint32 ResampInRate; + std::vector ResampInBuffer; + uint32 ResampInBufferFramesInCount; + std::vector ResampOutBuffer; +}; + +#endif diff --git a/Mednafen/mednafen/quicklz/Makefile.am b/Mednafen/mednafen/quicklz/Makefile.am new file mode 100644 index 0000000000..f75a95ea54 --- /dev/null +++ b/Mednafen/mednafen/quicklz/Makefile.am @@ -0,0 +1,8 @@ +AM_CFLAGS = @AM_CFLAGS@ -fno-strict-aliasing -Wno-shadow -Wno-unused-but-set-variable +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -fno-strict-aliasing +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnquicklz.a + +libmdfnquicklz_a_SOURCES = quicklz.c diff --git a/Mednafen/mednafen/quicklz/Makefile.in b/Mednafen/mednafen/quicklz/Makefile.in new file mode 100644 index 0000000000..f36366580c --- /dev/null +++ b/Mednafen/mednafen/quicklz/Makefile.in @@ -0,0 +1,676 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/quicklz +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnquicklz_a_AR = $(AR) $(ARFLAGS) +libmdfnquicklz_a_LIBADD = +am_libmdfnquicklz_a_OBJECTS = quicklz.$(OBJEXT) +libmdfnquicklz_a_OBJECTS = $(am_libmdfnquicklz_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libmdfnquicklz_a_SOURCES) +DIST_SOURCES = $(libmdfnquicklz_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ -fno-strict-aliasing -Wno-shadow -Wno-unused-but-set-variable +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -fno-strict-aliasing +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnquicklz.a +libmdfnquicklz_a_SOURCES = quicklz.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/quicklz/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/quicklz/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libmdfnquicklz.a: $(libmdfnquicklz_a_OBJECTS) $(libmdfnquicklz_a_DEPENDENCIES) $(EXTRA_libmdfnquicklz_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnquicklz.a + $(AM_V_AR)$(libmdfnquicklz_a_AR) libmdfnquicklz.a $(libmdfnquicklz_a_OBJECTS) $(libmdfnquicklz_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnquicklz.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quicklz.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/quicklz/quicklz.c b/Mednafen/mednafen/quicklz/quicklz.c new file mode 100644 index 0000000000..56ffdccf79 --- /dev/null +++ b/Mednafen/mednafen/quicklz/quicklz.c @@ -0,0 +1,888 @@ +// QuickLZ data compression library +// Copyright (C) 2006-2008 Lasse Mikkel Reinhold +// lar@quicklz.com +// +// QuickLZ can be used for free under the GPL-1 or GPL-2 license (where anything +// released into public must be open source) or under a commercial license if such +// has been acquired (see http://www.quicklz.com/order.html). The commercial license +// does not cover derived or ported versions created by third parties under GPL. + +#include "quicklz.h" + +int qlz_get_setting(int setting) +{ + switch (setting) + { + case 0: return QLZ_COMPRESSION_LEVEL; + case 1: return QLZ_SCRATCH_COMPRESS; + case 2: return QLZ_SCRATCH_DECOMPRESS; + case 3: return QLZ_STREAMING_MODE_VALUE; +#ifdef test_rle + case 4: return 1; +#else + case 4: return 0; +#endif +#ifdef speedup_incompressible + case 5: return 1; +#else + case 5: return 0; +#endif +#ifdef memory_safe + case 6: return 1; +#else + case 6: return 0; +#endif + case 7: return QLZ_VERSION_MAJOR; + case 8: return QLZ_VERSION_MINOR; + case 9: return QLZ_VERSION_REVISION; + } + return -1; +} + +static unsigned int hash_func(unsigned int i) +{ + return ((i >> 12) ^ i) & 0x0fff; +} + +static unsigned int fast_read(void const *src, unsigned int bytes) +{ +#ifndef X86X64 + unsigned char *p = (unsigned char*)src; + switch (bytes) + { + case 4: + return(*p | *(p + 1) << 8 | *(p + 2) << 16 | *(p + 3) << 24); + case 3: + return(*p | *(p + 1) << 8 | *(p + 2) << 16); + case 2: + return(*p | *(p + 1) << 8); + case 1: + return(*p); + } + return 0; +#else + if (bytes >= 1 && bytes <= 4) + return *((unsigned int*)src); + else + return 0; +#endif +} + +static void fast_write(unsigned int f, void *dst, unsigned int bytes) +{ +#ifndef X86X64 + unsigned char *p = (unsigned char*)dst; + + switch (bytes) + { + case 4: + *p = (unsigned char)f; + *(p + 1) = (unsigned char)(f >> 8); + *(p + 2) = (unsigned char)(f >> 16); + *(p + 3) = (unsigned char)(f >> 24); + return; + case 3: + *p = (unsigned char)f; + *(p + 1) = (unsigned char)(f >> 8); + *(p + 2) = (unsigned char)(f >> 16); + return; + case 2: + *p = (unsigned char)f; + *(p + 1) = (unsigned char)(f >> 8); + return; + case 1: + *p = (unsigned char)f; + return; + } +#else + switch (bytes) + { + case 4: + *((unsigned int*)dst) = f; + return; + case 3: + *((unsigned int*)dst) = f; + return; + case 2: +#if QLZ_COMPRESSION_LEVEL == 0 +// 2 byte writes are common in level 0 + *((unsigned short int*)dst) = (unsigned short int)f; +#else + *((unsigned int*)dst) = f; +#endif + return; + case 1: + *((unsigned char*)dst) = (unsigned char)f; + return; + } +#endif +} + +static void memcpy_up(unsigned char *dst, const unsigned char *src, unsigned int n) +{ + // cannot be replaced by overlap handling of memmove() due to LZSS algorithm +#ifndef X86X64 + + if(n > 8 && src + n < dst) + memcpy(dst, src, n); + else + { + unsigned char *end = dst + n; + while(dst < end) + { + *dst = *src; + dst++; + src++; + } + } +#else + if (n < 5) + *((unsigned int*)dst) = *((unsigned int*)src); + else + { + unsigned char *end = dst + n; + while(dst < end) + { + *((unsigned int*)dst) = *((unsigned int*)src); + dst = dst + 4; + src = src + 4; + } + } +#endif +} + +static unsigned int fast_read_safe(void const *src, unsigned int bytes, const unsigned char *invalid) +{ +#ifdef memory_safe + if ((const unsigned char *)src + 4 > (const unsigned char *)invalid) + return 0xffffffff; +#endif + invalid = invalid; + return fast_read(src, bytes); +} + +unsigned int qlz_compress_core(const void *source, unsigned char *destination, unsigned int size, const unsigned char *hashtable[][AND + 1], const unsigned char *first_valid, unsigned char *hash_counter) +{ + const unsigned char *source_c = (const unsigned char*)source; + unsigned char *destination_c = (unsigned char*)destination; + const unsigned char *last_byte = source_c + size - 1; + const unsigned char *src = source_c; + unsigned char *cword_ptr = destination_c; + unsigned char *dst = destination_c + 4; + unsigned int cword_val = 1U << 31; + const unsigned char *guarantee_uncompressed = last_byte - 8; + +#ifdef speedup_incompressible + unsigned char *prev_dst = dst; + const unsigned char *prev_src = src; +#endif + + hash_counter = hash_counter; + first_valid = first_valid; + + // save first 4 bytes uncompressed + while(src < source_c + 4 && src < guarantee_uncompressed) + { + cword_val = (cword_val >> 1); + *dst = *src; + dst++; + src++; + } + + while(src < guarantee_uncompressed) + { + unsigned int fetch; + if ((cword_val & 1) == 1) + { + // check if destinationc pointer could exceed destination buffer + if (dst > destination_c + size) + return 0; + + // store control word + fast_write((cword_val >> 1) | (1U << 31), cword_ptr, 4); + cword_ptr = dst; + dst += 4; + cword_val = 1U << 31; + +#ifdef speedup_incompressible + // check if source chunk is compressible + if (dst - prev_dst > src - prev_src && src > source_c + 1000) + { + int q; + for(q = 0; q < 30 && src + 31 < guarantee_uncompressed && dst + 35 < destination_c + size; q++) + { + +#if(QLZ_COMPRESSION_LEVEL == 0) + int w; + for(w = 0; w < 31; w++) + { + fetch = fast_read(src + w, 4); + *(unsigned int*)&hashtable[hash_func(fetch)][0] = fast_read(src + w, 4); + hashtable[hash_func(fetch)][1] = src + w; + } +#endif + fast_write((1U << 31), dst - 4, 4); + memcpy(dst, src, 31); + + dst += 4*8 - 1 + 4; + src += 4*8 - 1; + prev_src = src; + prev_dst = dst; + cword_ptr = dst - 4; + } + } +#endif + } +#ifdef test_rle + // check for rle sequence + if (fast_read(src, 4) == fast_read(src + 1, 4)) + { + const unsigned char *orig_src; + fetch = fast_read(src, 4); + orig_src = src; + do src = src + 4; while (src <= guarantee_uncompressed - 4 && fetch == fast_read(src, 4)); + if((src - orig_src) <= 2047) + { + fast_write(((fetch & 0xff) << 16) | (unsigned int)((src - orig_src) << 4) | 15, dst, 4); + dst = dst + 3; + } + else + { + fast_write(((fetch & 0xff) << 16) | 15, dst, 4); + fast_write((unsigned int)(src - orig_src), dst + 3, 4); + dst = dst + 7; + } + cword_val = (cword_val >> 1) | (1 << 31); + } + else +#endif + { + const unsigned char *o; + unsigned int hash, matchlen; + +#if(QLZ_COMPRESSION_LEVEL < 2) + unsigned int cached; + + fetch = fast_read(src, 4); + hash = hash_func(fetch); + + cached = fetch ^ *(unsigned int*)&hashtable[hash][0]; + *(unsigned int*)&hashtable[hash][0] = fetch; + + o = hashtable[hash][1]; + hashtable[hash][1] = src; + +#else + unsigned char c; + unsigned int k, m; + const unsigned char *offset2 = 0; + + fetch = fast_read(src, 4); + hash = hash_func(fetch); + + matchlen = 0; + c = hash_counter[hash]; + for(k = 0; k < AND + 1; k++) + { + o = hashtable[hash][(c - k) & AND]; + if(o > first_valid && o < src - 3 && *(src + matchlen) == *(o + matchlen) && (fast_read(o, 3) & 0xffffff) == (fetch & 0xffffff) && src - o < 131071) + { + size_t remaining; + remaining = guarantee_uncompressed - src; + m = 3; + if (fast_read(o, 4) == fetch) + { + while(*(o + m) == *(src + m) && m < remaining) + m++; + } + if (m > matchlen) + { + matchlen = m; + offset2 = o; + } + } + } + o = offset2; + c = (hash_counter[hash] + 1) & AND; + hash_counter[hash] = c; + hashtable[hash][c] = src; +#endif + +#if(QLZ_COMPRESSION_LEVEL == 0) + if (o != 0 && (cached & 0xffffff) == 0 && src - o > 3) +#elif(QLZ_COMPRESSION_LEVEL == 1) + if ((cached & 0xffffff) == 0 && o > first_valid && o < src - 3 && ((fast_read(o, 3) ^ fast_read(src, 3)) & 0xffffff) == 0 && src - o < 131071) +#elif(QLZ_COMPRESSION_LEVEL > 1) + if(matchlen == 3) +#endif + { + unsigned int offset; + offset = (unsigned int)(src - o); + +#if(QLZ_COMPRESSION_LEVEL < 2) + if (cached & 0xffffffff) +#endif + { +#if (QLZ_COMPRESSION_LEVEL > 2) + unsigned int u; + for(u = 1; u < 3; u++) + { + hash = hash_func(fast_read(src + u, 4)); + c = (hash_counter[hash] + 1) & AND; + hash_counter[hash] = c; + hashtable[hash][c] = src + u; + } +#endif + +#if (QLZ_COMPRESSION_LEVEL == 0) + cword_val = (cword_val >> 1) | (1U << 31); + fast_write(3 | (hash << 4), dst, 2); + src += 3; + dst += 2; +#else + + if(offset <= 63) + { + // encode lz match + *dst = (unsigned char)(offset << 2); + cword_val = (cword_val >> 1) | (1U << 31); + src += 3; + dst++; + } + else if (offset <= 16383) + { + // encode lz match + unsigned int f = (offset << 2) | 1; + fast_write(f, dst, 2); + cword_val = (cword_val >> 1) | (1U << 31); + src += 3; + dst += 2; + } + else + { + // encode literal + *dst = *src; + src++; + dst++; + cword_val = (cword_val >> 1); + } +#endif + } +#if(QLZ_COMPRESSION_LEVEL > 1) + } + else if(matchlen > 3) + { +#elif(QLZ_COMPRESSION_LEVEL < 2) + else +#endif + { + // encode lz match + unsigned int offset; + +#if(QLZ_COMPRESSION_LEVEL < 2) + const unsigned char *old_src = src; + offset = (unsigned int)(src - o); + cword_val = (cword_val >> 1) | (1U << 31); + + src += 3; + while(*(o + (src - old_src)) == *src && src < guarantee_uncompressed) + src++; + matchlen = (unsigned int)(src - old_src); +#else + unsigned int u; + offset = (unsigned int)(src - o); + cword_val = (cword_val >> 1) | (1U << 31); + +#if (QLZ_COMPRESSION_LEVEL > 2) + for(u = 1; u < matchlen; u++) +#else + for(u = 1; u < matchlen && u < 5; u++) +#endif + { + hash = hash_func(fast_read(src + u, 4)); + c = (hash_counter[hash] + 1) & AND; + hash_counter[hash] = c; + hashtable[hash][c] = src + u; + } + src += matchlen; +#endif + +#if (QLZ_COMPRESSION_LEVEL == 0) + if (matchlen < 15) + { + fast_write(matchlen | (hash << 4), dst, 2); + dst += 2; + } + else if (matchlen < 255) + { + fast_write(hash << 4, dst, 2); + *(dst + 2) = (unsigned char)matchlen; + dst += 3; + } + else + { + fast_write(hash << 4, dst, 2); + *(dst + 2) = 0; + fast_write(matchlen, dst + 3, 4); + dst += 7; + } +#else + if (matchlen <= 18 && offset <= 1023) + { + unsigned int f = ((matchlen - 3) << 2) | (offset << 6) | 2; + fast_write(f, dst, 2); + dst += 2; + } + + else if(matchlen <= 34 && offset <= 65535) + { + unsigned int f = ((matchlen - 3) << 3) | (offset << 8) | 3; + fast_write(f, dst, 3); + dst += 3; + } + else if (matchlen >= 3) + { + if (matchlen <= 2050) + { + unsigned int f = ((matchlen - 3) << 4) | (offset << 15) | 7; + fast_write(f, dst, 4); + dst += 4; + } + else + { + fast_write(7, dst, 4); + fast_write(matchlen, dst + 4, 4); + fast_write(offset, dst + 8, 4); + dst += 12; + } + } +#endif + } + } + + else + { + // encode literal + *dst = *src; + src++; + dst++; + cword_val = (cword_val >> 1); + } + } + } + +// save last source bytes as literals + while (src <= last_byte) + { + if ((cword_val & 1) == 1) + { + fast_write((cword_val >> 1) | (1U << 31), cword_ptr, 4); + cword_ptr = dst; + dst += 4; + cword_val = 1U << 31; + } + + if (src < last_byte - 2 && src > source_c + 3) + { + hashtable[hash_func(fast_read(src, 4))][1] = src; + *(unsigned int*)&hashtable[hash_func(fast_read(src, 4))][0] = fast_read(src, 4); + } + *dst = *src; + src++; + dst++; + + cword_val = (cword_val >> 1); + } + + while((cword_val & 1) != 1) + cword_val = (cword_val >> 1); + + fast_write((cword_val >> 1) | (1U << 31), cword_ptr, 4); + + // min. size must be 9 bytes so that the qlz_size functions can take 9 bytes as argument + if (dst - destination_c < 9) + return 9; + else + return (unsigned int)(dst - destination_c); +} + +size_t qlz_decompress_core(const unsigned char *source, void *destination, size_t size, size_t source_size, unsigned char *first_valid, const unsigned char *hashtable[]) +{ + const unsigned char *source_c = (const unsigned char*)source; + unsigned char *destination_c = (unsigned char*)destination; + const unsigned char *src = source_c; + unsigned char *dst = destination_c; + const unsigned char* last_byte_successor = destination_c + size; + unsigned int cword_val = 1; + const unsigned int bitlut[16] = {4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0}; + const unsigned char *guaranteed_uncompressed = last_byte_successor - 4; + unsigned char *last_hashed = destination_c + 3; + + first_valid = first_valid; + last_hashed = last_hashed; + hashtable = hashtable; + + // prevent spurious memory read on a source with size < 4 + if (dst >= guaranteed_uncompressed) + { + src += 4; + while(dst < last_byte_successor) + { + *dst = *src; + dst++; + src++; + } + + return (unsigned int)(dst - destination_c); + } + + + for(;;) + { + unsigned int fetch; + + if (cword_val == 1) + { + // fetch control word + cword_val = fast_read_safe(src, 4, source_c + source_size) | (1U << 31); + src += 4; + } + + fetch = fast_read_safe(src, 4, source_c + source_size); + + // check if we must decode lz match + if ((cword_val & 1) == 1) + { + unsigned int matchlen; + +#if(QLZ_COMPRESSION_LEVEL == 0) + unsigned int hash; + const unsigned char *offset2; + + cword_val = cword_val >> 1; + + if((fetch & 0xf) != 15) + { + hash = (fetch >> 4) & 0xfff; + offset2 = hashtable[hash]; + + if((fetch & 0xf) != 0) + { + matchlen = (fetch & 0xf); + src += 2; + } + else if((fetch & 0x00ff0000) != 0) + { + matchlen = *(src + 2); + src += 3; + } + else + { + matchlen = fast_read(src + 3, 4); + src += 7; + } + memcpy_up(dst, offset2, matchlen); + while(last_hashed < dst) + { + last_hashed++; + hashtable[hash_func(fast_read(last_hashed, 4))] = last_hashed; + } + dst += matchlen; + last_hashed = dst - 1; + } + +#else + unsigned int offset; + cword_val = cword_val >> 1; + + if ((fetch & 3) == 0) + { + offset = (fetch & 0xff) >> 2; +#ifdef memory_safe + if (3 > (unsigned int)(guaranteed_uncompressed - dst) || offset > (unsigned int)(dst - first_valid)) + return 0; +#endif + memcpy_up(dst, dst - offset, 3); + dst += 3; + src++; + } + else if ((fetch & 2) == 0) + { + offset = (fetch & 0xffff) >> 2; +#ifdef memory_safe + if (3 > (unsigned int)(guaranteed_uncompressed - dst) || offset > (unsigned int)(dst - first_valid)) + return 0; +#endif + memcpy_up(dst, dst - offset, 3); + dst += 3; + src += 2; + } + else if ((fetch & 1) == 0) + { + offset = (fetch & 0xffff) >> 6; + matchlen = ((fetch >> 2) & 15) + 3; +#ifdef memory_safe + if (matchlen > (unsigned int)(guaranteed_uncompressed - dst) || offset > (unsigned int)(dst - first_valid)) + return 0; +#endif + memcpy_up(dst, dst - offset, matchlen); + src += 2; + dst += matchlen; + } + else if ((fetch & 4) == 0) + { + offset = (fetch & 0xffffff) >> 8; + matchlen = ((fetch >> 3) & 31) + 3; +#ifdef memory_safe + if (matchlen > (unsigned int)(guaranteed_uncompressed - dst) || offset > (unsigned int)(dst - first_valid)) + return 0; +#endif + memcpy_up(dst, dst - offset, matchlen); + src += 3; + dst += matchlen; + } + else if ((fetch & 8) == 0) + { + offset = (fetch >> 15); + if (offset != 0) + { + matchlen = ((fetch >> 4) & 2047) + 3; + src += 4; + } + else + { + matchlen = fast_read_safe(src + 4, 4, source_c + source_size); + offset = fast_read_safe(src + 8, 4, source_c + source_size); + src += 12; + } +#ifdef memory_safe + if (matchlen > (unsigned int)(guaranteed_uncompressed - dst) || offset > (unsigned int)(dst - first_valid)) + return 0; +#endif + memcpy_up(dst, dst - offset, matchlen); + dst += matchlen; + } +#endif + else + { + // decode rle sequence + unsigned char rle_char; + rle_char = (unsigned char)(fetch >> 16); + matchlen = ((fetch >> 4) & 0xfff); + + if(matchlen != 0) + src += 3; + else + { + matchlen = fast_read_safe(src + 3, 4, source_c + source_size); + src += 7; + } + +#ifdef memory_safe + if(matchlen > (unsigned int)(guaranteed_uncompressed - dst)) + return 0; +#endif + memset(dst, rle_char, matchlen); + +#if(QLZ_COMPRESSION_LEVEL == 0) + while(last_hashed < dst - 1) + { + last_hashed++; + hashtable[hash_func(fast_read(last_hashed, 4))] = last_hashed; + } + last_hashed = dst - 1 + matchlen; +#endif + dst += matchlen; + } + } + else + { + // decode literal +#ifdef memory_safe + if (4 > destination_c + size - dst || src > source_c + source_size + 4) + return 0; +#endif + memcpy_up(dst, src, 4); + + dst += bitlut[cword_val & 0xf]; + src += bitlut[cword_val & 0xf]; + cword_val = cword_val >> (bitlut[cword_val & 0xf]); + +#if(QLZ_COMPRESSION_LEVEL == 0) + while(last_hashed < dst - 3) + { + last_hashed++; + hashtable[hash_func(fast_read(last_hashed, 4))] = last_hashed; + } +#endif + if (dst >= guaranteed_uncompressed) + { + // decode last literals and exit + while(dst < last_byte_successor) + { + if (cword_val == 1) + { + src += 4; + cword_val = 1U << 31; + } + if (1 > destination_c + size - dst) + return 0; + + *dst = *src; + dst++; + src++; + cword_val = cword_val >> 1; + } + +#if(QLZ_COMPRESSION_LEVEL == 0) + while(last_hashed < last_byte_successor - 4) + { + last_hashed++; + hashtable[hash_func(fast_read(last_hashed, 4))] = last_hashed; + } +#endif + if((src - 1) - source_c > 8) // 8 bytes comp. size excessive len is ok + return 0; + else if(dst - destination_c - size == 0) + return size; + else + return 0; + } + } + } +} + +size_t qlz_size_decompressed(const char *source) +{ + unsigned int n, r; + n = (((*source) & 2) == 2) ? 4 : 1; + r = fast_read(source + 1 + n, n); + r = r & (0xffffffff >> ((4 - n)*8)); + return r; +} + +size_t qlz_size_compressed(const char *source) +{ + unsigned int n, r; + n = (((*source) & 2) == 2) ? 4 : 1; + r = fast_read(source + 1, n); + r = r & (0xffffffff >> ((4 - n)*8)); + return r; +} + +size_t qlz_compress(const void *source, char *destination, size_t size, char *scratch) +{ + // 1-8 bytes for aligning (not 0-7!); 8 bytes for buffersize (padds on 32 bit cpu); QLZ_HASH_SIZE hash table; QLZ_STREAMING_MODE_ROUNDED bytes streambuffer; optional QLZ_HASH_ENTRIES byte hash counter + unsigned char *buffer_aligned = (unsigned char *)scratch + 8 - (((size_t)scratch) % 8); + const unsigned char *(*hashtable)[AND + 1] = (const unsigned char *(*)[AND + 1])(buffer_aligned + 8); + size_t *buffersize = (size_t *)buffer_aligned; + unsigned char *streambuffer = buffer_aligned + 8 + QLZ_HASH_SIZE; + unsigned int r; + unsigned int compressed, base; + unsigned char *hash_counter = streambuffer + QLZ_STREAMING_MODE_ROUNDED; + + if(size == 0 || size > 0xffffffff) + return 0; + +#if (QLZ_COMPRESSION_LEVEL == 0 && QLZ_STREAMING_MODE_ROUNDED == 0) + memset((void *)hashtable, 0, QLZ_HASH_SIZE); +#endif + + if(size < 216) + base = 3; + else + base = 9; + +// if not QLZ_STREAMING_MODE, then QLZ_STREAMING_MODE_ROUNDED == 0 and first case (streaming buffer full) is executed unconditionally, functioning as block comp. + if (*buffersize + size - 1 >= QLZ_STREAMING_MODE_ROUNDED) + { +#if (QLZ_COMPRESSION_LEVEL == 0 && QLZ_STREAMING_MODE_ROUNDED != 0) + memset((void *)hashtable, 0, QLZ_HASH_SIZE); +#endif + + r = base + qlz_compress_core(source, (unsigned char*)destination + base, (unsigned int)size, hashtable, (const unsigned char*)source, hash_counter); +#if (QLZ_COMPRESSION_LEVEL == 0 && QLZ_STREAMING_MODE_ROUNDED != 0) + memset((void *)hashtable, 0, QLZ_HASH_SIZE); +#endif + + if(r == base) + { + memcpy(destination + base, source, size); + r = (unsigned int)size + base; + compressed = 0; + } + else + compressed = 1; + *buffersize = 0; + } + else + { + memcpy(streambuffer + *buffersize, source, size); + r = base + qlz_compress_core(streambuffer + *buffersize, (unsigned char*)destination + base, (unsigned int)size, hashtable, streambuffer, hash_counter); + + if(r == base) + { + memcpy(destination + base, streambuffer + *buffersize, size); + r = (unsigned int)size + base; + compressed = 0; + + memset((void*)hashtable, 0, QLZ_HASH_SIZE); + } + else + compressed = 1; + *buffersize += size; + } + + if(base == 3) + { + *destination = (unsigned char)(0 | compressed); + *(destination + 1) = (unsigned char)r; + *(destination + 2) = (unsigned char)size; + } + else + { + *destination = (unsigned char)(2 | compressed); + fast_write(r, destination + 1, 4); + fast_write((unsigned int)size, destination + 5, 4); + } + +#if (QLZ_COMPRESSION_LEVEL == 0) + *destination = (*destination) | 4; +#endif + + return (size_t)r; +} + + + +size_t qlz_decompress(const char *source, void *destination, char *scratch) +{ + // 1-8 bytes for aligning (not 0-7!); 8 bytes for buffersize (padds on 32bit cpu); QLZ_STREAMING_MODE_ROUNDED streambuffer; QLZ_HASH_SIZE hash table + unsigned char *buffer_aligned = (unsigned char *)scratch + 8 - (((size_t)scratch) % 8); + size_t *buffersize = (size_t *)buffer_aligned; + unsigned int headerlen = 2*((((*source) & 2) == 2) ? 4 : 1) + 1; // get header len + + unsigned char *streambuffer = buffer_aligned + 8; + const unsigned char **hashtable = (const unsigned char **)(streambuffer + QLZ_STREAMING_MODE_ROUNDED); + + size_t dsiz = qlz_size_decompressed((char *)source); + size_t csiz = qlz_size_compressed((char *)source); + if (*buffersize + qlz_size_decompressed((char *)source) - 1 >= QLZ_STREAMING_MODE_ROUNDED) + { + if((*source & 1) == 1) + qlz_decompress_core((const unsigned char *)source + headerlen, destination, dsiz, csiz, (unsigned char*)destination, hashtable); + else + memcpy(destination, source + headerlen, dsiz); + *buffersize = 0; + } + else + { + if((*source & 1) == 1) + qlz_decompress_core((const unsigned char *)source + headerlen, streambuffer + *buffersize, dsiz, csiz, streambuffer, hashtable); + else + memcpy(streambuffer + *buffersize, source + headerlen, dsiz); + memcpy(destination, streambuffer + *buffersize, dsiz); + *buffersize += dsiz; + } + return dsiz; +} diff --git a/Mednafen/mednafen/quicklz/quicklz.h b/Mednafen/mednafen/quicklz/quicklz.h new file mode 100644 index 0000000000..bf32a40e8d --- /dev/null +++ b/Mednafen/mednafen/quicklz/quicklz.h @@ -0,0 +1,82 @@ +#ifndef QLZ_HEADER +#define QLZ_HEADER + +// Version 1.31 final +#define QLZ_VERSION_MAJOR 1 +#define QLZ_VERSION_MINOR 3 +#define QLZ_VERSION_REVISION 1 + +// Set following flags according to the manual +#define QLZ_COMPRESSION_LEVEL 0 +//#define QLZ_STREAMING_MODE 2000000 +#define test_rle +#define speedup_incompressible +//#define memory_safe + +// Public functions of QuickLZ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +size_t qlz_decompress(const char *source, void *destination, char *scratch); +size_t qlz_compress(const void *source, char *destination, size_t size, char *scratch); +size_t qlz_size_decompressed(const char *source); +size_t qlz_size_compressed(const char *source); +int qlz_get_setting(int setting); + +#if (defined(__X86__) || defined(__i386__) || defined(i386) || defined(_M_IX86) || defined(__386__) || defined(__x86_64__) || defined(_M_X64)) + #define X86X64 +#endif + +// Compute QLZ_SCRATCH_COMPRESS, QLZ_SCRATCH_DECOMPRESS and constants used internally +#if QLZ_COMPRESSION_LEVEL == 0 && defined(memory_safe) + #error memory_safe flag cannot be used with QLZ_COMPRESSION_LEVEL 0 +#endif + +#define QLZ_HASH_ENTRIES 4096 + +#if (QLZ_COMPRESSION_LEVEL == 0 || QLZ_COMPRESSION_LEVEL == 1 || QLZ_COMPRESSION_LEVEL == 2) + #define AND 1 +#elif (QLZ_COMPRESSION_LEVEL == 3) + #define AND 0x7 +#else + #error QLZ_COMPRESSION_LEVEL must be 0, 1, 2 or 3 +#endif + +#define QLZ_HASH_SIZE (AND + 1)*QLZ_HASH_ENTRIES*sizeof(unsigned char *) + +#ifdef QLZ_STREAMING_MODE + #define QLZ_STREAMING_MODE_VALUE QLZ_STREAMING_MODE +#else + #define QLZ_STREAMING_MODE_VALUE 0 +#endif + +#define QLZ_STREAMING_MODE_ROUNDED ((QLZ_STREAMING_MODE_VALUE >> 3) << 3) + +#if (QLZ_COMPRESSION_LEVEL > 1) + #define QLZ_SCRATCH_COMPRESS QLZ_HASH_SIZE + QLZ_STREAMING_MODE_VALUE + 16 + QLZ_HASH_ENTRIES +#else + #define QLZ_SCRATCH_COMPRESS QLZ_HASH_SIZE + QLZ_STREAMING_MODE_VALUE + 16 +#endif + +#if (QLZ_COMPRESSION_LEVEL == 0) + #define QLZ_SCRATCH_DECOMPRESS QLZ_HASH_ENTRIES*sizeof(unsigned char *) + 16 + QLZ_STREAMING_MODE_VALUE +#else + #define QLZ_SCRATCH_DECOMPRESS 16 + QLZ_STREAMING_MODE_VALUE +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif + + + + + diff --git a/Mednafen/mednafen/resampler/Makefile.am.inc b/Mednafen/mednafen/resampler/Makefile.am.inc new file mode 100644 index 0000000000..3d01319722 --- /dev/null +++ b/Mednafen/mednafen/resampler/Makefile.am.inc @@ -0,0 +1 @@ +mednafen_SOURCES += resampler/resample.c diff --git a/Mednafen/mednafen/resampler/arch.h b/Mednafen/mednafen/resampler/arch.h new file mode 100644 index 0000000000..d38c36ce7c --- /dev/null +++ b/Mednafen/mednafen/resampler/arch.h @@ -0,0 +1,239 @@ +/* Copyright (C) 2003 Jean-Marc Valin */ +/** + @file arch.h + @brief Various architecture definitions Speex +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef ARCH_H +#define ARCH_H + +#ifndef SPEEX_VERSION +#define SPEEX_MAJOR_VERSION 1 /**< Major Speex version. */ +#define SPEEX_MINOR_VERSION 1 /**< Minor Speex version. */ +#define SPEEX_MICRO_VERSION 15 /**< Micro Speex version. */ +#define SPEEX_EXTRA_VERSION "" /**< Extra Speex version. */ +#define SPEEX_VERSION "speex-1.2beta3" /**< Speex version string. */ +#endif + +/* A couple test to catch stupid option combinations */ +#ifdef FIXED_POINT + +#ifdef FLOATING_POINT +#error You cannot compile as floating point and fixed point at the same time +#endif +#ifdef _USE_SSE +#error SSE is only for floating-point +#endif +#if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) +#error Make up your mind. What CPU do you have? +#endif +#ifdef VORBIS_PSYCHO +#error Vorbis-psy model currently not implemented in fixed-point +#endif + +#else + +#ifndef FLOATING_POINT +#error You now need to define either FIXED_POINT or FLOATING_POINT +#endif +#if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) +#error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? +#endif +#ifdef FIXED_POINT_DEBUG +#error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" +#endif + + +#endif + +#ifndef OUTSIDE_SPEEX +#include "speex/speex_types.h" +#endif + +#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ +#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ +#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ +#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ +#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ +#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ +#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ + +#ifdef FIXED_POINT + +typedef spx_int16_t spx_word16_t; +typedef spx_int32_t spx_word32_t; +typedef spx_word32_t spx_mem_t; +typedef spx_word16_t spx_coef_t; +typedef spx_word16_t spx_lsp_t; +typedef spx_word32_t spx_sig_t; + +#define Q15ONE 32767 + +#define LPC_SCALING 8192 +#define SIG_SCALING 16384 +#define LSP_SCALING 8192. +#define GAMMA_SCALING 32768. +#define GAIN_SCALING 64 +#define GAIN_SCALING_1 0.015625 + +#define LPC_SHIFT 13 +#define LSP_SHIFT 13 +#define SIG_SHIFT 14 +#define GAIN_SHIFT 6 + +#define VERY_SMALL 0 +#define VERY_LARGE32 ((spx_word32_t)2147483647) +#define VERY_LARGE16 ((spx_word16_t)32767) +#define Q15_ONE ((spx_word16_t)32767) + + +#ifdef FIXED_DEBUG +#include "fixed_debug.h" +#else + +#include "fixed_generic.h" + +#ifdef ARM5E_ASM +#include "fixed_arm5e.h" +#elif defined (ARM4_ASM) +#include "fixed_arm4.h" +#elif defined (BFIN_ASM) +#include "fixed_bfin.h" +#endif + +#endif + + +#else + +typedef float spx_mem_t; +typedef float spx_coef_t; +typedef float spx_lsp_t; +typedef float spx_sig_t; +typedef float spx_word16_t; +typedef float spx_word32_t; + +#define Q15ONE 1.0f +#define LPC_SCALING 1.f +#define SIG_SCALING 1.f +#define LSP_SCALING 1.f +#define GAMMA_SCALING 1.f +#define GAIN_SCALING 1.f +#define GAIN_SCALING_1 1.f + + +#define VERY_SMALL 1e-15f +#define VERY_LARGE32 1e15f +#define VERY_LARGE16 1e15f +#define Q15_ONE ((spx_word16_t)1.f) + +#define QCONST16(x,bits) (x) +#define QCONST32(x,bits) (x) + +#define NEG16(x) (-(x)) +#define NEG32(x) (-(x)) +#define EXTRACT16(x) (x) +#define EXTEND32(x) (x) +#define SHR16(a,shift) (a) +#define SHL16(a,shift) (a) +#define SHR32(a,shift) (a) +#define SHL32(a,shift) (a) +#define PSHR16(a,shift) (a) +#define PSHR32(a,shift) (a) +#define VSHR32(a,shift) (a) +#define SATURATE16(x,a) (x) +#define SATURATE32(x,a) (x) + +#define PSHR(a,shift) (a) +#define SHR(a,shift) (a) +#define SHL(a,shift) (a) +#define SATURATE(x,a) (x) + +#define ADD16(a,b) ((a)+(b)) +#define SUB16(a,b) ((a)-(b)) +#define ADD32(a,b) ((a)+(b)) +#define SUB32(a,b) ((a)-(b)) +#define MULT16_16_16(a,b) ((a)*(b)) +#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) +#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) + +#define MULT16_32_Q11(a,b) ((a)*(b)) +#define MULT16_32_Q13(a,b) ((a)*(b)) +#define MULT16_32_Q14(a,b) ((a)*(b)) +#define MULT16_32_Q15(a,b) ((a)*(b)) +#define MULT16_32_P15(a,b) ((a)*(b)) + +#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) +#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) + +#define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) +#define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) +#define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) +#define MULT16_16_Q11_32(a,b) ((a)*(b)) +#define MULT16_16_Q13(a,b) ((a)*(b)) +#define MULT16_16_Q14(a,b) ((a)*(b)) +#define MULT16_16_Q15(a,b) ((a)*(b)) +#define MULT16_16_P15(a,b) ((a)*(b)) +#define MULT16_16_P13(a,b) ((a)*(b)) +#define MULT16_16_P14(a,b) ((a)*(b)) + +#define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) +#define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) +#define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) +#define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) + + +#endif + + +#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) + +/* 2 on TI C5x DSP */ +#define BYTES_PER_CHAR 2 +#define BITS_PER_CHAR 16 +#define LOG2_BITS_PER_CHAR 4 + +#else + +#define BYTES_PER_CHAR 1 +#define BITS_PER_CHAR 8 +#define LOG2_BITS_PER_CHAR 3 + +#endif + + + +#ifdef FIXED_DEBUG +extern long long spx_mips; +#endif + + +#endif diff --git a/Mednafen/mednafen/resampler/fixed_generic.h b/Mednafen/mednafen/resampler/fixed_generic.h new file mode 100644 index 0000000000..3fb096ed90 --- /dev/null +++ b/Mednafen/mednafen/resampler/fixed_generic.h @@ -0,0 +1,106 @@ +/* Copyright (C) 2003 Jean-Marc Valin */ +/** + @file fixed_generic.h + @brief Generic fixed-point operations +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef FIXED_GENERIC_H +#define FIXED_GENERIC_H + +#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) +#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) + +#define NEG16(x) (-(x)) +#define NEG32(x) (-(x)) +#define EXTRACT16(x) ((spx_word16_t)(x)) +#define EXTEND32(x) ((spx_word32_t)(x)) +#define SHR16(a,shift) ((a) >> (shift)) +#define SHL16(a,shift) ((a) << (shift)) +#define SHR32(a,shift) ((a) >> (shift)) +#define SHL32(a,shift) ((a) << (shift)) +#define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) +#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) +#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) +#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) +#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) + +#define SHR(a,shift) ((a) >> (shift)) +#define SHL(a,shift) ((spx_word32_t)(a) << (shift)) +#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) +#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) + + +#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) +#define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) +#define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) +#define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) + + +/* result fits in 16 bits */ +#define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) + +/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ +#define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) + +#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) +#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) +#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) +#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) + +#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) +#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) + +#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) +#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) +#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) + + +#define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) +#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) +#define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) + +#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) +#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) +#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) +#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) + +#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) +#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) +#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) + +#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15)) + +#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) +#define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))) +#define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) +#define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b))) + +#endif diff --git a/Mednafen/mednafen/resampler/resample.c b/Mednafen/mednafen/resampler/resample.c new file mode 100644 index 0000000000..c47fef5d0d --- /dev/null +++ b/Mednafen/mednafen/resampler/resample.c @@ -0,0 +1,1158 @@ +/* Copyright (C) 2007-2008 Jean-Marc Valin + Copyright (C) 2008 Thorvald Natvig + + File: resample.c + Arbitrary resampling code + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + The design goals of this code are: + - Very fast algorithm + - SIMD-friendly algorithm + - Low memory requirement + - Good *perceptual* quality (and not best SNR) + + Warning: This resampler is relatively new. Although I think I got rid of + all the major bugs and I don't expect the API to change anymore, there + may be something I've missed. So use with caution. + + This algorithm is based on this original resampling algorithm: + Smith, Julius O. Digital Audio Resampling Home Page + Center for Computer Research in Music and Acoustics (CCRMA), + Stanford University, 2007. + Web published at http://www-ccrma.stanford.edu/~jos/resample/. + + There is one main difference, though. This resampler uses cubic + interpolation instead of linear interpolation in the above paper. This + makes the table much smaller and makes it possible to compute that table + on a per-stream basis. In turn, being able to tweak the table for each + stream makes it possible to both reduce complexity on simple ratios + (e.g. 2/3), and get rid of the rounding operations in the inner loop. + The latter both reduces CPU time and makes the algorithm more SIMD-friendly. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Begin Mednafen modifications */ + +#ifdef ARCH_X86_64 +#define _USE_SSE +#define _USE_SSE2 +#endif + +#ifdef EXPORT + #undef EXPORT +#endif + +#define EXPORT + +#ifdef FIXED_POINT + #undef FIXED_POINT +#endif + +//#define FIXED_POINT 1 +#define FLOATING_POINT 1 + +#define OUTSIDE_SPEEX + +/* End Mednafen modifications */ + +#ifdef OUTSIDE_SPEEX +#include +static void *speex_alloc (int size) {return calloc(size,1);} +static void *speex_realloc (void *ptr, int size) {return realloc(ptr, size);} +static void speex_free (void *ptr) {free(ptr);} + +/* Begin Mednafen modifications */ +#include "resampler.h" +/* End Mednafen modifications */ +#include "arch.h" +#else /* OUTSIDE_SPEEX */ + +#include "speex/speex_resampler.h" +#include "arch.h" +#include "os_support.h" +#endif /* OUTSIDE_SPEEX */ + +#include "stack_alloc.h" +#include + +#ifndef M_PI +#define M_PI 3.14159263 +#endif + +#ifdef FIXED_POINT +#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x))) +#else +#define WORD2INT(x) ((x) < -32767.5f ? -32768 : ((x) > 32766.5f ? 32767 : floor(.5+(x)))) +#endif + +#define IMAX(a,b) ((a) > (b) ? (a) : (b)) +#define IMIN(a,b) ((a) < (b) ? (a) : (b)) + +#ifndef NULL +#define NULL 0 +#endif + +#ifdef _USE_SSE +#include "resample_sse.h" +#endif + +/* Numer of elements to allocate on the stack */ +#ifdef VAR_ARRAYS +#define FIXED_STACK_ALLOC 8192 +#else +#define FIXED_STACK_ALLOC 1024 +#endif + +typedef int (*resampler_basic_func)(SpeexResamplerState *, spx_uint32_t , const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *); + +struct SpeexResamplerState_ { + spx_uint32_t in_rate; + spx_uint32_t out_rate; + spx_uint32_t num_rate; + spx_uint32_t den_rate; + + int quality; + spx_uint32_t nb_channels; + spx_uint32_t filt_len; + spx_uint32_t mem_alloc_size; + spx_uint32_t buffer_size; + int int_advance; + int frac_advance; + float cutoff; + spx_uint32_t oversample; + int initialised; + int started; + + /* These are per-channel */ + spx_int32_t *last_sample; + spx_uint32_t *samp_frac_num; + spx_uint32_t *magic_samples; + + spx_word16_t *mem; + spx_word16_t *sinc_table; + spx_uint32_t sinc_table_length; + resampler_basic_func resampler_ptr; + + int in_stride; + int out_stride; +} ; + +static double kaiser12_table[68] = { + 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076, + 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014, + 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601, + 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014, + 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490, + 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546, + 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178, + 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947, + 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058, + 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438, + 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734, + 0.00001000, 0.00000000}; +/* +static double kaiser12_table[36] = { + 0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741, + 0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762, + 0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274, + 0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466, + 0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291, + 0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000}; +*/ +static double kaiser10_table[36] = { + 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446, + 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347, + 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962, + 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451, + 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739, + 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000}; + +static double kaiser8_table[36] = { + 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200, + 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126, + 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272, + 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758, + 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490, + 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000}; + +static double kaiser6_table[36] = { + 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003, + 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565, + 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561, + 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058, + 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600, + 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000}; + +struct FuncDef { + double *table; + int oversample; +}; + +static struct FuncDef _KAISER12 = {kaiser12_table, 64}; +#define KAISER12 (&_KAISER12) +/*static struct FuncDef _KAISER12 = {kaiser12_table, 32}; +#define KAISER12 (&_KAISER12)*/ +static struct FuncDef _KAISER10 = {kaiser10_table, 32}; +#define KAISER10 (&_KAISER10) +static struct FuncDef _KAISER8 = {kaiser8_table, 32}; +#define KAISER8 (&_KAISER8) +static struct FuncDef _KAISER6 = {kaiser6_table, 32}; +#define KAISER6 (&_KAISER6) + +struct QualityMapping { + int base_length; + int oversample; + float downsample_bandwidth; + float upsample_bandwidth; + struct FuncDef *window_func; +}; + + +/* This table maps conversion quality to internal parameters. There are two + reasons that explain why the up-sampling bandwidth is larger than the + down-sampling bandwidth: + 1) When up-sampling, we can assume that the spectrum is already attenuated + close to the Nyquist rate (from an A/D or a previous resampling filter) + 2) Any aliasing that occurs very close to the Nyquist rate will be masked + by the sinusoids/noise just below the Nyquist rate (guaranteed only for + up-sampling). +*/ +static const struct QualityMapping quality_map[11] = { + { 8, 4, 0.830f, 0.860f, KAISER6 }, /* Q0 */ + { 16, 4, 0.850f, 0.880f, KAISER6 }, /* Q1 */ + { 32, 4, 0.882f, 0.910f, KAISER6 }, /* Q2 */ /* 82.3% cutoff ( ~60 dB stop) 6 */ + { 48, 8, 0.895f, 0.917f, KAISER8 }, /* Q3 */ /* 84.9% cutoff ( ~80 dB stop) 8 */ + { 64, 8, 0.921f, 0.940f, KAISER8 }, /* Q4 */ /* 88.7% cutoff ( ~80 dB stop) 8 */ + { 80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 */ /* 89.1% cutoff (~100 dB stop) 10 */ + { 96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 */ /* 91.5% cutoff (~100 dB stop) 10 */ + {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 */ /* 93.1% cutoff (~100 dB stop) 10 */ + {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 */ /* 94.5% cutoff (~100 dB stop) 10 */ + {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 */ /* 95.5% cutoff (~100 dB stop) 10 */ + {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 */ /* 96.6% cutoff (~100 dB stop) 10 */ +}; +/*8,24,40,56,80,104,128,160,200,256,320*/ +static double compute_func(float x, struct FuncDef *func) +{ + float y, frac; + double interp[4]; + int ind; + y = x*func->oversample; + ind = (int)floor(y); + frac = (y-ind); + /* CSE with handle the repeated powers */ + interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac); + interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac); + /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ + interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac); + /* Just to make sure we don't have rounding problems */ + interp[1] = 1.f-interp[3]-interp[2]-interp[0]; + + /*sum = frac*accum[1] + (1-frac)*accum[2];*/ + return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3]; +} + +#if 0 +#include +int main(int argc, char **argv) +{ + int i; + for (i=0;i<256;i++) + { + printf ("%f\n", compute_func(i/256., KAISER12)); + } + return 0; +} +#endif + +#ifdef FIXED_POINT +/* The slow way of computing a sinc for the table. Should improve that some day */ +static spx_word16_t sinc(float cutoff, float x, int N, struct FuncDef *window_func) +{ + /*fprintf (stderr, "%f ", x);*/ + float xx = x * cutoff; + if (fabs(x)<1e-6f) + return WORD2INT(32768.*cutoff); + else if (fabs(x) > .5f*N) + return 0; + /*FIXME: Can it really be any slower than this? */ + return WORD2INT(32768.*cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func)); +} +#else +/* The slow way of computing a sinc for the table. Should improve that some day */ +static spx_word16_t sinc(float cutoff, float x, int N, struct FuncDef *window_func) +{ + /*fprintf (stderr, "%f ", x);*/ + float xx = x * cutoff; + if (fabs(x)<1e-6) + return cutoff; + else if (fabs(x) > .5*N) + return 0; + /*FIXME: Can it really be any slower than this? */ + return cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func); +} +#endif + +#ifdef FIXED_POINT +static void cubic_coef(spx_word16_t x, spx_word16_t interp[4]) +{ + /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation + but I know it's MMSE-optimal on a sinc */ + spx_word16_t x2, x3; + x2 = MULT16_16_P15(x, x); + x3 = MULT16_16_P15(x, x2); + interp[0] = PSHR32(MULT16_16(QCONST16(-0.16667f, 15),x) + MULT16_16(QCONST16(0.16667f, 15),x3),15); + interp[1] = EXTRACT16(EXTEND32(x) + SHR32(SUB32(EXTEND32(x2),EXTEND32(x3)),1)); + interp[3] = PSHR32(MULT16_16(QCONST16(-0.33333f, 15),x) + MULT16_16(QCONST16(.5f,15),x2) - MULT16_16(QCONST16(0.16667f, 15),x3),15); + /* Just to make sure we don't have rounding problems */ + interp[2] = Q15_ONE-interp[0]-interp[1]-interp[3]; + if (interp[2]<32767) + interp[2]+=1; +} +#else +static void cubic_coef(spx_word16_t frac, spx_word16_t interp[4]) +{ + /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation + but I know it's MMSE-optimal on a sinc */ + interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac; + interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac; + /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ + interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac; + /* Just to make sure we don't have rounding problems */ + interp[2] = 1.-interp[0]-interp[1]-interp[3]; +} +#endif + +static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const spx_word16_t *sinc_table = st->sinc_table; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + spx_word32_t sum; + int j; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *sinc = & sinc_table[samp_frac_num*N]; + const spx_word16_t *iptr = & in[last_sample]; + +#ifndef OVERRIDE_INNER_PRODUCT_SINGLE + float accum[4] = {0,0,0,0}; + + for(j=0;j= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} + +#ifdef FIXED_POINT +#else +/* This is the same as the previous function, except with a double-precision accumulator */ +static int resampler_basic_direct_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const spx_word16_t *sinc_table = st->sinc_table; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + double sum; + int j; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *sinc = & sinc_table[samp_frac_num*N]; + const spx_word16_t *iptr = & in[last_sample]; + +#ifndef OVERRIDE_INNER_PRODUCT_DOUBLE + double accum[4] = {0,0,0,0}; + + for(j=0;j= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} +#endif + +static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + int j; + spx_word32_t sum; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *iptr = & in[last_sample]; + + const int offset = samp_frac_num*st->oversample/st->den_rate; +#ifdef FIXED_POINT + const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); +#else + const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; +#endif + spx_word16_t interp[4]; + + +#ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE + spx_word32_t accum[4] = {0,0,0,0}; + + for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); + accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); + accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); + accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); + } + + cubic_coef(frac, interp); + sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); +#else + cubic_coef(frac, interp); + sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); +#endif + + out[out_stride * out_sample++] = PSHR32(sum,15); + last_sample += int_advance; + samp_frac_num += frac_advance; + if (samp_frac_num >= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} + +#ifdef FIXED_POINT +#else +/* This is the same as the previous function, except with a double-precision accumulator */ +static int resampler_basic_interpolate_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + const int N = st->filt_len; + int out_sample = 0; + int last_sample = st->last_sample[channel_index]; + spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; + const int out_stride = st->out_stride; + const int int_advance = st->int_advance; + const int frac_advance = st->frac_advance; + const spx_uint32_t den_rate = st->den_rate; + int j; + spx_word32_t sum; + + while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) + { + const spx_word16_t *iptr = & in[last_sample]; + + const int offset = samp_frac_num*st->oversample/st->den_rate; +#ifdef FIXED_POINT + const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); +#else + const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; +#endif + spx_word16_t interp[4]; + + +#ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE + double accum[4] = {0,0,0,0}; + + for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); + accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); + accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); + accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); + } + + cubic_coef(frac, interp); + sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); +#else + cubic_coef(frac, interp); + sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); +#endif + + out[out_stride * out_sample++] = PSHR32(sum,15); + last_sample += int_advance; + samp_frac_num += frac_advance; + if (samp_frac_num >= den_rate) + { + samp_frac_num -= den_rate; + last_sample++; + } + } + + st->last_sample[channel_index] = last_sample; + st->samp_frac_num[channel_index] = samp_frac_num; + return out_sample; +} +#endif + +static void update_filter(SpeexResamplerState *st) +{ + spx_uint32_t old_length; + + old_length = st->filt_len; + st->oversample = quality_map[st->quality].oversample; + st->filt_len = quality_map[st->quality].base_length; + + if (st->num_rate > st->den_rate) + { + /* down-sampling */ + st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate; + /* FIXME: divide the numerator and denominator by a certain amount if they're too large */ + st->filt_len = st->filt_len*st->num_rate / st->den_rate; + /* Round down to make sure we have a multiple of 4 */ + st->filt_len &= (~0x3); + if (2*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (4*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (8*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (16*st->den_rate < st->num_rate) + st->oversample >>= 1; + if (st->oversample < 1) + st->oversample = 1; + } else { + /* up-sampling */ + st->cutoff = quality_map[st->quality].upsample_bandwidth; + } + + /* Choose the resampling type that requires the least amount of memory */ + if (st->den_rate <= st->oversample) + { + spx_uint32_t i; + if (!st->sinc_table) + st->sinc_table = (spx_word16_t *)speex_alloc(st->filt_len*st->den_rate*sizeof(spx_word16_t)); + else if (st->sinc_table_length < st->filt_len*st->den_rate) + { + st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,st->filt_len*st->den_rate*sizeof(spx_word16_t)); + st->sinc_table_length = st->filt_len*st->den_rate; + } + for (i=0;iden_rate;i++) + { + spx_int32_t j; + for (j=0;jfilt_len;j++) + { + st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); + } + } +#ifdef FIXED_POINT + st->resampler_ptr = resampler_basic_direct_single; +#else + if (st->quality>8) + st->resampler_ptr = resampler_basic_direct_double; + else + st->resampler_ptr = resampler_basic_direct_single; +#endif + /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff);*/ + } else { + spx_int32_t i; + if (!st->sinc_table) + st->sinc_table = (spx_word16_t *)speex_alloc((st->filt_len*st->oversample+8)*sizeof(spx_word16_t)); + else if (st->sinc_table_length < st->filt_len*st->oversample+8) + { + st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,(st->filt_len*st->oversample+8)*sizeof(spx_word16_t)); + st->sinc_table_length = st->filt_len*st->oversample+8; + } + for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++) + st->sinc_table[i+4] = sinc(st->cutoff,(i/(float)st->oversample - st->filt_len/2), st->filt_len, quality_map[st->quality].window_func); +#ifdef FIXED_POINT + st->resampler_ptr = resampler_basic_interpolate_single; +#else + if (st->quality>8) + st->resampler_ptr = resampler_basic_interpolate_double; + else + st->resampler_ptr = resampler_basic_interpolate_single; +#endif + /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff);*/ + } + st->int_advance = st->num_rate/st->den_rate; + st->frac_advance = st->num_rate%st->den_rate; + + + /* Here's the place where we update the filter memory to take into account + the change in filter length. It's probably the messiest part of the code + due to handling of lots of corner cases. */ + if (!st->mem) + { + spx_uint32_t i; + st->mem_alloc_size = st->filt_len-1 + st->buffer_size; + st->mem = (spx_word16_t*)speex_alloc(st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t)); + for (i=0;inb_channels*st->mem_alloc_size;i++) + st->mem[i] = 0; + /*speex_warning("init filter");*/ + } else if (!st->started) + { + spx_uint32_t i; + st->mem_alloc_size = st->filt_len-1 + st->buffer_size; + st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t)); + for (i=0;inb_channels*st->mem_alloc_size;i++) + st->mem[i] = 0; + /*speex_warning("reinit filter");*/ + } else if (st->filt_len > old_length) + { + spx_int32_t i; + /* Increase the filter length */ + /*speex_warning("increase filter size");*/ + int old_alloc_size = st->mem_alloc_size; + if ((st->filt_len-1 + st->buffer_size) > st->mem_alloc_size) + { + st->mem_alloc_size = st->filt_len-1 + st->buffer_size; + st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t)); + } + for (i=st->nb_channels-1;i>=0;i--) + { + spx_int32_t j; + spx_uint32_t olen = old_length; + /*if (st->magic_samples[i])*/ + { + /* Try and remove the magic samples as if nothing had happened */ + + /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */ + olen = old_length + 2*st->magic_samples[i]; + for (j=old_length-2+st->magic_samples[i];j>=0;j--) + st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j]; + for (j=0;jmagic_samples[i];j++) + st->mem[i*st->mem_alloc_size+j] = 0; + st->magic_samples[i] = 0; + } + if (st->filt_len > olen) + { + /* If the new filter length is still bigger than the "augmented" length */ + /* Copy data going backward */ + for (j=0;jmem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)]; + /* Then put zeros for lack of anything better */ + for (;jfilt_len-1;j++) + st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0; + /* Adjust last_sample */ + st->last_sample[i] += (st->filt_len - olen)/2; + } else { + /* Put back some of the magic! */ + st->magic_samples[i] = (olen - st->filt_len)/2; + for (j=0;jfilt_len-1+st->magic_samples[i];j++) + st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; + } + } + } else if (st->filt_len < old_length) + { + spx_uint32_t i; + /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic" + samples so they can be used directly as input the next time(s) */ + for (i=0;inb_channels;i++) + { + spx_uint32_t j; + spx_uint32_t old_magic = st->magic_samples[i]; + st->magic_samples[i] = (old_length - st->filt_len)/2; + /* We must copy some of the memory that's no longer used */ + /* Copy data going backward */ + for (j=0;jfilt_len-1+st->magic_samples[i]+old_magic;j++) + st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; + st->magic_samples[i] += old_magic; + } + } + +} + +EXPORT SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) +{ + return speex_resampler_init_frac(nb_channels, in_rate, out_rate, in_rate, out_rate, quality, err); +} + +EXPORT SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) +{ + spx_uint32_t i; + SpeexResamplerState *st; + if (quality > 10 || quality < 0) + { + if (err) + *err = RESAMPLER_ERR_INVALID_ARG; + return NULL; + } + st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState)); + st->initialised = 0; + st->started = 0; + st->in_rate = 0; + st->out_rate = 0; + st->num_rate = 0; + st->den_rate = 0; + st->quality = -1; + st->sinc_table_length = 0; + st->mem_alloc_size = 0; + st->filt_len = 0; + st->mem = 0; + st->resampler_ptr = 0; + + st->cutoff = 1.f; + st->nb_channels = nb_channels; + st->in_stride = 1; + st->out_stride = 1; + +#ifdef FIXED_POINT + st->buffer_size = 160; +#else + st->buffer_size = 160; +#endif + + /* Per channel data */ + st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(int)); + st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int)); + st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int)); + for (i=0;ilast_sample[i] = 0; + st->magic_samples[i] = 0; + st->samp_frac_num[i] = 0; + } + + speex_resampler_set_quality(st, quality); + speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate); + + + update_filter(st); + + st->initialised = 1; + if (err) + *err = RESAMPLER_ERR_SUCCESS; + + return st; +} + +EXPORT void speex_resampler_destroy(SpeexResamplerState *st) +{ + speex_free(st->mem); + speex_free(st->sinc_table); + speex_free(st->last_sample); + speex_free(st->magic_samples); + speex_free(st->samp_frac_num); + speex_free(st); +} + +static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) +{ + int j=0; + const int N = st->filt_len; + int out_sample = 0; + spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; + spx_uint32_t ilen; + + st->started = 1; + + /* Call the right resampler through the function ptr */ + out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len); + + if (st->last_sample[channel_index] < (spx_int32_t)*in_len) + *in_len = st->last_sample[channel_index]; + *out_len = out_sample; + st->last_sample[channel_index] -= *in_len; + + ilen = *in_len; + + for(j=0;jmagic_samples[channel_index]; + spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; + const int N = st->filt_len; + + speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len); + + st->magic_samples[channel_index] -= tmp_in_len; + + /* If we couldn't process all "magic" input samples, save the rest for next time */ + if (st->magic_samples[channel_index]) + { + spx_uint32_t i; + for (i=0;imagic_samples[channel_index];i++) + mem[N-1+i]=mem[N-1+i+tmp_in_len]; + } + *out += out_len*st->out_stride; + return out_len; +} + +#ifdef FIXED_POINT +EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) +#else +EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) +#endif +{ + int j; + spx_uint32_t ilen = *in_len; + spx_uint32_t olen = *out_len; + spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; + const int filt_offs = st->filt_len - 1; + const spx_uint32_t xlen = st->mem_alloc_size - filt_offs; + const int istride = st->in_stride; + + if (st->magic_samples[channel_index]) + olen -= speex_resampler_magic(st, channel_index, &out, olen); + if (! st->magic_samples[channel_index]) { + while (ilen && olen) { + spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; + spx_uint32_t ochunk = olen; + + if (in) { + for(j=0;jout_stride; + if (in) + in += ichunk * istride; + } + } + *in_len -= ilen; + *out_len -= olen; + return RESAMPLER_ERR_SUCCESS; +} + +#ifdef FIXED_POINT +EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) +#else +EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) +#endif +{ + int j; + const int istride_save = st->in_stride; + const int ostride_save = st->out_stride; + spx_uint32_t ilen = *in_len; + spx_uint32_t olen = *out_len; + spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; + const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1); +#ifdef VAR_ARRAYS + const unsigned int ylen = (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC; + VARDECL(spx_word16_t *ystack); + ALLOC(ystack, ylen, spx_word16_t); +#else + const unsigned int ylen = FIXED_STACK_ALLOC; + spx_word16_t ystack[FIXED_STACK_ALLOC]; +#endif + + st->out_stride = 1; + + while (ilen && olen) { + spx_word16_t *y = ystack; + spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; + spx_uint32_t ochunk = (olen > ylen) ? ylen : olen; + spx_uint32_t omagic = 0; + + if (st->magic_samples[channel_index]) { + omagic = speex_resampler_magic(st, channel_index, &y, ochunk); + ochunk -= omagic; + olen -= omagic; + } + if (! st->magic_samples[channel_index]) { + if (in) { + for(j=0;jfilt_len-1]=WORD2INT(in[j*istride_save]); +#else + x[j+st->filt_len-1]=in[j*istride_save]; +#endif + } else { + for(j=0;jfilt_len-1]=0; + } + + speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk); + } else { + ichunk = 0; + ochunk = 0; + } + + for (j=0;jout_stride = ostride_save; + *in_len -= ilen; + *out_len -= olen; + + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) +{ + spx_uint32_t i; + int istride_save, ostride_save; + spx_uint32_t bak_len = *out_len; + istride_save = st->in_stride; + ostride_save = st->out_stride; + st->in_stride = st->out_stride = st->nb_channels; + for (i=0;inb_channels;i++) + { + *out_len = bak_len; + if (in != NULL) + speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len); + else + speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len); + } + st->in_stride = istride_save; + st->out_stride = ostride_save; + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) +{ + spx_uint32_t i; + int istride_save, ostride_save; + spx_uint32_t bak_len = *out_len; + istride_save = st->in_stride; + ostride_save = st->out_stride; + st->in_stride = st->out_stride = st->nb_channels; + for (i=0;inb_channels;i++) + { + *out_len = bak_len; + if (in != NULL) + speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len); + else + speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len); + } + st->in_stride = istride_save; + st->out_stride = ostride_save; + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate) +{ + return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate); +} + +EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate) +{ + *in_rate = st->in_rate; + *out_rate = st->out_rate; +} + +EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate) +{ + spx_uint32_t fact; + spx_uint32_t old_den; + spx_uint32_t i; + if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den) + return RESAMPLER_ERR_SUCCESS; + + old_den = st->den_rate; + st->in_rate = in_rate; + st->out_rate = out_rate; + st->num_rate = ratio_num; + st->den_rate = ratio_den; + /* FIXME: This is terribly inefficient, but who cares (at least for now)? */ + for (fact=2;fact<=IMIN(st->num_rate, st->den_rate);fact++) + { + while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0)) + { + st->num_rate /= fact; + st->den_rate /= fact; + } + } + + if (old_den > 0) + { + for (i=0;inb_channels;i++) + { + st->samp_frac_num[i]=st->samp_frac_num[i]*st->den_rate/old_den; + /* Safety net */ + if (st->samp_frac_num[i] >= st->den_rate) + st->samp_frac_num[i] = st->den_rate-1; + } + } + + if (st->initialised) + update_filter(st); + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den) +{ + *ratio_num = st->num_rate; + *ratio_den = st->den_rate; +} + +EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality) +{ + if (quality > 10 || quality < 0) + return RESAMPLER_ERR_INVALID_ARG; + if (st->quality == quality) + return RESAMPLER_ERR_SUCCESS; + st->quality = quality; + if (st->initialised) + update_filter(st); + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality) +{ + *quality = st->quality; +} + +EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride) +{ + st->in_stride = stride; +} + +EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride) +{ + *stride = st->in_stride; +} + +EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride) +{ + st->out_stride = stride; +} + +EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride) +{ + *stride = st->out_stride; +} + +EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st) +{ + return st->filt_len / 2; +} + +EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st) +{ + return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate; +} + +EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st) +{ + spx_uint32_t i; + for (i=0;inb_channels;i++) + st->last_sample[i] = st->filt_len/2; + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st) +{ + spx_uint32_t i; + for (i=0;inb_channels*(st->filt_len-1);i++) + st->mem[i] = 0; + return RESAMPLER_ERR_SUCCESS; +} + +EXPORT const char *speex_resampler_strerror(int err) +{ + switch (err) + { + case RESAMPLER_ERR_SUCCESS: + return "Success."; + case RESAMPLER_ERR_ALLOC_FAILED: + return "Memory allocation failed."; + case RESAMPLER_ERR_BAD_STATE: + return "Bad resampler state."; + case RESAMPLER_ERR_INVALID_ARG: + return "Invalid argument."; + case RESAMPLER_ERR_PTR_OVERLAP: + return "Input and output buffers overlap."; + default: + return "Unknown error. Bad error code or strange version mismatch."; + } +} diff --git a/Mednafen/mednafen/resampler/resample_sse.h b/Mednafen/mednafen/resampler/resample_sse.h new file mode 100644 index 0000000000..4bd35a2d03 --- /dev/null +++ b/Mednafen/mednafen/resampler/resample_sse.h @@ -0,0 +1,128 @@ +/* Copyright (C) 2007-2008 Jean-Marc Valin + * Copyright (C) 2008 Thorvald Natvig + */ +/** + @file resample_sse.h + @brief Resampler functions (SSE version) +*/ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#define OVERRIDE_INNER_PRODUCT_SINGLE +static inline float inner_product_single(const float *a, const float *b, unsigned int len) +{ + int i; + float ret; + __m128 sum = _mm_setzero_ps(); + for (i=0;i +#define OVERRIDE_INNER_PRODUCT_DOUBLE + +static inline double inner_product_double(const float *a, const float *b, unsigned int len) +{ + int i; + double ret; + __m128d sum = _mm_setzero_pd(); + __m128 t; + for (i=0;i +# else +# ifdef HAVE_ALLOCA_H +# include +# else +# include +# endif +# endif +#endif + +/** + * @def ALIGN(stack, size) + * + * Aligns the stack to a 'size' boundary + * + * @param stack Stack + * @param size New size boundary + */ + +/** + * @def PUSH(stack, size, type) + * + * Allocates 'size' elements of type 'type' on the stack + * + * @param stack Stack + * @param size Number of elements + * @param type Type of element + */ + +/** + * @def VARDECL(var) + * + * Declare variable on stack + * + * @param var Variable to declare + */ + +/** + * @def ALLOC(var, size, type) + * + * Allocate 'size' elements of 'type' on stack + * + * @param var Name of variable to allocate + * @param size Number of elements + * @param type Type of element + */ + +#ifdef ENABLE_VALGRIND + +#include + +#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) + +#define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) + +#else + +#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) + +#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) + +#endif + +#if defined(VAR_ARRAYS) +#define VARDECL(var) +#define ALLOC(var, size, type) type var[size] +#elif defined(USE_ALLOCA) +#define VARDECL(var) var +#define ALLOC(var, size, type) var = alloca(sizeof(type)*(size)) +#else +#define VARDECL(var) var +#define ALLOC(var, size, type) var = PUSH(stack, size, type) +#endif + + +#endif diff --git a/Mednafen/mednafen/settings-common.h b/Mednafen/mednafen/settings-common.h new file mode 100644 index 0000000000..aa36513a08 --- /dev/null +++ b/Mednafen/mednafen/settings-common.h @@ -0,0 +1,84 @@ +/* + Notes about MDFNST_FLOAT: + The default value should ideally not be equal(numerically) to the minimum or maximum values. + If it must be equal, then the default string should be exactly the same as the minimum/maximum string, to work around + potential libc strtod() bugs. +*/ + +#ifndef _MDFN_SETTINGS_COMMON_H +#define _MDFN_SETTINGS_COMMON_H +typedef enum +{ + // Actual base types + MDFNST_INT = 0, // (signed), int8, int16, int32, int64(saved as) + MDFNST_UINT, // uint8, uint16, uint32, uint64(saved as) + MDFNST_BOOL, // bool. bool. bool! + MDFNST_FLOAT, // float, double(saved as). + MDFNST_STRING, + MDFNST_ENUM, // Handled like a string, but validated against the enumeration list, and MDFN_GetSettingUI() returns the number in the enumeration list. + + MDFNST_ALIAS +} MDFNSettingType; + + +//#define MDFNST_EX_DRIVER = (1 << 16), // If this is not set, the setting is assumed to be internal. This...should probably be set automatically? + +#define MDFNSF_NOFLAGS 0 // Always 0, makes setting definitions prettier...maybe. + +// TODO(cats) +#define MDFNSF_CAT_INPUT (1 << 8) +#define MDFNSF_CAT_SOUND (1 << 9) +#define MDFNSF_CAT_VIDEO (1 << 10) +#define MDFNSF_CAT_INPUT_MAPPING (1 << 11) // User-configurable physical->virtual button/axes and hotkey mappings(driver-side code category mainly). + +#define MDFNSF_EMU_STATE (1 << 17) // If the setting affects emulation from the point of view of the emulated program +#define MDFNSF_UNTRUSTED_SAFE (1 << 18) // If it's safe for an untrusted source to modify it, probably only used in conjunction with + // MDFNST_EX_EMU_STATE and network play + +#define MDFNSF_SUPPRESS_DOC (1 << 19) // Suppress documentation generation for this setting. +#define MDFNSF_COMMON_TEMPLATE (1 << 20) // Auto-generated common template setting(like nes.xscale, pce.xscale, vb.xscale, nes.enable, pce.enable, vb.enable) +// TODO: +// #define MDFNSF_WILL_BREAK_GAMES (1 << ) // If changing the value of the setting from the default value will break games/programs that would otherwise work. + +// TODO(in progress): +#define MDFNSF_REQUIRES_RELOAD (1 << 24) // If a game reload is required for the setting to take effect. +#define MDFNSF_REQUIRES_RESTART (1 << 25) // If Mednafen restart is required for the setting to take effect. + +typedef struct +{ + const char *string; + int number; + const char *description; // Short + const char *description_extra; // Extra verbose text appended to the short description. +} MDFNSetting_EnumList; + +typedef struct +{ + const char *name; + uint32 flags; + const char *description; // Short + const char *description_extra; + + MDFNSettingType type; + const char *default_value; + const char *minimum; + const char *maximum; + bool (*validate_func)(const char *name, const char *value); + void (*ChangeNotification)(const char *name); + const MDFNSetting_EnumList *enum_list; +} MDFNSetting; + +typedef struct __MDFNCS +{ + char *name; + char *value; + char *game_override; // per-game setting override(netplay_override > game_override > value, in precedence) + char *netplay_override; // "value" override for network play. + + const MDFNSetting *desc; + void (*ChangeNotification)(const char *name); + + uint32 name_hash; +} MDFNCS; + +#endif diff --git a/Mednafen/mednafen/settings-driver.h b/Mednafen/mednafen/settings-driver.h new file mode 100644 index 0000000000..e5ae356eca --- /dev/null +++ b/Mednafen/mednafen/settings-driver.h @@ -0,0 +1,27 @@ +#ifndef _MDFN_SETTINGS_DRIVER_H +#define _MDFN_SETTINGS_DRIVER_H + +#include "settings-common.h" + +// +// Due to how the per-module(and in the future, per-game) settings overrides work, we should +// take care not to call MDFNI_SetSetting*() unless the setting has actually changed due to a user action. +// I.E. do NOT call SetSetting*() unconditionally en-masse at emulator exit/game close to synchronize certain things like input mappings. +// +bool MDFNI_SetSetting(const char *name, const char *value, bool NetplayOverride = false); +static INLINE bool MDFNI_SetSetting(const char *name, const std::string& value, bool NetplayOverride = false) { return MDFNI_SetSetting(name, value.c_str(), NetplayOverride); } +static INLINE bool MDFNI_SetSetting(const std::string& name, const std::string& value, bool NetplayOverride = false) { return MDFNI_SetSetting(name.c_str(), value.c_str(), NetplayOverride); } + +bool MDFNI_SetSettingB(const char *name, bool value); +static INLINE bool MDFNI_SetSettingB(const std::string& name, bool value) { return MDFNI_SetSettingB(name.c_str(), value); } + +bool MDFNI_SetSettingUI(const char *name, uint64 value); +static INLINE bool MDFNI_SetSettingUI(const std::string& name, uint64 value) { return MDFNI_SetSettingUI(name.c_str(), value); } + +bool MDFNI_DumpSettingsDef(const char *path); + +#include + +const std::multimap *MDFNI_GetSettings(void); + +#endif diff --git a/Mednafen/mednafen/settings.cpp b/Mednafen/mednafen/settings.cpp new file mode 100644 index 0000000000..9ca30f69e2 --- /dev/null +++ b/Mednafen/mednafen/settings.cpp @@ -0,0 +1,886 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + TODO: Setting changed callback on override setting loading/clearing. +*/ + +#include "mednafen.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "settings.h" +#include "string/escape.h" +#include "string/trim.h" +#include "FileStream.h" +#include "MemoryStream.h" + +#include + +typedef struct +{ + char *name; + char *value; +} UnknownSetting_t; + +std::multimap CurrentSettings; +std::vector UnknownSettings; + +static MDFNCS *FindSetting(const char *name, bool deref_alias = true, bool dont_freak_out_on_fail = false); + + +static bool TranslateSettingValueUI(const char *value, unsigned long long &tlated_value) +{ + char *endptr = NULL; + + if(value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) + tlated_value = strtoull(value + 2, &endptr, 16); + else + tlated_value = strtoull(value, &endptr, 10); + + if(!endptr || *endptr != 0) + { + return(false); + } + return(true); +} + +static bool TranslateSettingValueI(const char *value, long long &tlated_value) +{ + char *endptr = NULL; + + if(value[0] == '0' && (value[1] == 'x' || value[1] == 'X')) + tlated_value = strtoll(value + 2, &endptr, 16); + else + tlated_value = strtoll(value, &endptr, 10); + + if(!endptr || *endptr != 0) + { + return(false); + } + return(true); +} + +// +// This function is a ticking time bomb of (semi-non-reentrant) wrong, but it's OUR ticking time bomb. +// +// Note to self: test it with something like: LANG="fr_FR.UTF-8" ./mednafen +// +static bool MR_StringToDouble(const char* string_value, double* dvalue) NO_INLINE; // noinline for *potential* x87 FPU extra precision weirdness in regards to optimizations. +static bool MR_StringToDouble(const char* string_value, double* dvalue) +{ + static char MR_Radix = 0; + const unsigned slen = strlen(string_value); + char cpi_array[256 + 1]; + std::unique_ptr cpi_heap; + char* cpi = cpi_array; + char* endptr = NULL; + + if(slen > 256) + { + cpi_heap.reset(new char[slen + 1]); + cpi = cpi_heap.get(); + } + + if(!MR_Radix) + { + char buf[64]; // Use extra-large buffer since we're using sprintf() instead of snprintf() for portability reasons. //4]; + // Use libc snprintf() and not trio_snprintf() here for out little abomination. + //snprintf(buf, 4, "%.1f", (double)1); + sprintf(buf, "%.1f", (double)1); + if(buf[0] == '1' && buf[2] == '0' && buf[3] == 0) + { + MR_Radix = buf[1]; + } + else + { + lconv* l = localeconv(); + assert(l != NULL); + MR_Radix = *(l->decimal_point); + } + } + + for(unsigned i = 0; i < slen; i++) + { + char c = string_value[i]; + + if(c == '.' || c == ',') + c = MR_Radix; + + cpi[i] = c; + } + cpi[slen] = 0; + + *dvalue = strtod(cpi, &endptr); + + if(endptr == NULL || *endptr != 0) + return(false); + + return(true); +} + +static void ValidateSetting(const char *value, const MDFNSetting *setting) +{ + MDFNSettingType base_type = setting->type; + + if(base_type == MDFNST_UINT) + { + unsigned long long ullvalue; + + if(!TranslateSettingValueUI(value, ullvalue)) + { + throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not set to a valid unsigned integer."), setting->name, value); + } + if(setting->minimum) + { + unsigned long long minimum; + + TranslateSettingValueUI(setting->minimum, minimum); + if(ullvalue < minimum) + { + throw MDFN_Error(0, _("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); + } + } + if(setting->maximum) + { + unsigned long long maximum; + + TranslateSettingValueUI(setting->maximum, maximum); + if(ullvalue > maximum) + { + throw MDFN_Error(0, _("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); + } + } + } + else if(base_type == MDFNST_INT) + { + long long llvalue; + + if(!TranslateSettingValueI(value, llvalue)) + { + throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not set to a valid signed integer."), setting->name, value); + } + if(setting->minimum) + { + long long minimum; + + TranslateSettingValueI(setting->minimum, minimum); + if(llvalue < minimum) + { + throw MDFN_Error(0, _("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); + } + } + if(setting->maximum) + { + long long maximum; + + TranslateSettingValueI(setting->maximum, maximum); + if(llvalue > maximum) + { + throw MDFN_Error(0, _("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); + } + } + } + else if(base_type == MDFNST_FLOAT) + { + double dvalue; + + if(!MR_StringToDouble(value, &dvalue)) + { + throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not set to a floating-point(real) number."), setting->name, value); + } + if(setting->minimum) + { + double minimum; + + assert(MR_StringToDouble(setting->minimum, &minimum) == true); + + if(dvalue < minimum) + { + throw MDFN_Error(0, _("Setting \"%s\" is set too small(\"%s\"); the minimum acceptable value is \"%s\"."), setting->name, value, setting->minimum); + } + } + if(setting->maximum) + { + double maximum; + + assert(MR_StringToDouble(setting->maximum, &maximum) == true); + + if(dvalue > maximum) + { + throw MDFN_Error(0, _("Setting \"%s\" is set too large(\"%s\"); the maximum acceptable value is \"%s\"."), setting->name, value, setting->maximum); + } + } + } + else if(base_type == MDFNST_BOOL) + { + if(strlen(value) != 1 || (value[0] != '0' && value[0] != '1')) + { + throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not a valid boolean value."), setting->name, value); + } + } + else if(base_type == MDFNST_ENUM) + { + const MDFNSetting_EnumList *enum_list = setting->enum_list; + bool found = false; + std::string valid_string_list; + + assert(enum_list); + + while(enum_list->string) + { + if(!strcasecmp(value, enum_list->string)) + { + found = true; + break; + } + + if(enum_list->description) // Don't list out undocumented and deprecated values. + valid_string_list = valid_string_list + (enum_list == setting->enum_list ? "" : " ") + std::string(enum_list->string); + + enum_list++; + } + + if(!found) + { + throw MDFN_Error(0, _("Setting \"%s\", value \"%s\", is not a recognized string. Recognized strings: %s"), setting->name, value, valid_string_list.c_str()); + } + } + + + if(setting->validate_func && !setting->validate_func(setting->name, value)) + { + if(base_type == MDFNST_STRING) + throw MDFN_Error(0, _("Setting \"%s\" is not set to a valid string: \"%s\""), setting->name, value); + else + throw MDFN_Error(0, _("Setting \"%s\" is not set to a valid unsigned integer: \"%s\""), setting->name, value); + } +} + +static uint32 MakeNameHash(const char *name) +{ + uint32 name_hash; + + name_hash = crc32(0, (const Bytef *)name, strlen(name)); + + return(name_hash); +} + +static void ParseSettingLine(std::string &linebuf, size_t* valid_count, size_t* unknown_count, bool IsOverrideSetting = false) +{ + MDFNCS *zesetting; + size_t spacepos; + + // + // Comment + // + if(linebuf[0] == ';' || linebuf[0] == '#') + return; + + spacepos = linebuf.find(' '); + + // No name(key) + if(spacepos == 0) + return; + + // No space present?! + if(spacepos == std::string::npos) + { + //if(linebuf.size() != 0) + // spacepos = linebuf.size() - 1; + //else + return; + } + else + linebuf[spacepos] = 0; + + zesetting = FindSetting(linebuf.c_str(), true, true); + + if(zesetting) + { + char *nv = strdup(linebuf.c_str() + spacepos + 1); + + if(IsOverrideSetting) + { + if(zesetting->game_override) + free(zesetting->game_override); + + zesetting->game_override = nv; + } + else + { + if(zesetting->value) + free(zesetting->value); + + zesetting->value = nv; + } + + ValidateSetting(nv, zesetting->desc); // TODO: Validate later(so command line options can override invalid setting file data correctly) + (*valid_count)++; + } + else + { + if(!IsOverrideSetting) + { + UnknownSetting_t unks; + + unks.name = strdup(linebuf.c_str()); + unks.value = strdup(linebuf.c_str() + spacepos + 1); + + UnknownSettings.push_back(unks); + } + (*unknown_count)++; + } +} + +static void LoadSettings(Stream *fp, size_t* valid_count, size_t* unknown_count, bool override) +{ + std::string linebuf; + + linebuf.reserve(1024); + + while(fp->get_line(linebuf) >= 0) + ParseSettingLine(linebuf, valid_count, unknown_count, override); +} + +void MDFN_LoadSettings(const std::string& path, bool override) +{ + if(!override) + MDFN_printf(_("Loading settings from \"%s\"...\n"), path.c_str()); + else + MDFN_printf(_("Loading override settings from \"%s\"...\n"), path.c_str()); + + MDFN_AutoIndent aind(1); + + try + { + MemoryStream mp(new FileStream(path, FileStream::MODE_READ)); + size_t valid_count = 0; + size_t unknown_count = 0; + + //uint32 st = MDFND_GetTime(); + LoadSettings(&mp, &valid_count, &unknown_count, override); + //printf("%u\n", MDFND_GetTime() - st); + + if(override) + MDFN_printf(_("Loaded %zu valid settings and ignored %zu unknown settings.\n"), valid_count, unknown_count); + else + MDFN_printf(_("Loaded %zu valid settings and %zu unknown settings.\n"), valid_count, unknown_count); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() == ENOENT) + { + MDFN_printf(_("Failed: %s\n"), e.what()); + return; + } + else + { + throw MDFN_Error(0, _("Failed to load settings from \"%s\": %s"), path.c_str(), e.what()); + } + } + catch(std::exception &e) + { + throw MDFN_Error(0, _("Failed to load settings from \"%s\": %s"), path.c_str(), e.what()); + } +} + +static bool compare_sname(MDFNCS *first, MDFNCS *second) +{ + return(strcmp(first->name, second->name) < 0); +} + +static void SaveSettings(Stream *fp) +{ + std::multimap ::iterator sit; + std::list SortedList; + std::list::iterator lit; + + fp->print_format(";VERSION %s\n", MEDNAFEN_VERSION); + + fp->print_format(_(";Edit this file at your own risk!\n")); + fp->print_format(_(";File format: \n\n")); + + for(sit = CurrentSettings.begin(); sit != CurrentSettings.end(); sit++) + SortedList.push_back(&sit->second); + + SortedList.sort(compare_sname); + + for(lit = SortedList.begin(); lit != SortedList.end(); lit++) + { + if((*lit)->desc->type == MDFNST_ALIAS) + continue; + + fp->print_format(";%s\n%s %s\n\n", _((*lit)->desc->description), (*lit)->name, (*lit)->value); + } + + if(UnknownSettings.size()) + { + fp->print_format("\n;\n;Unrecognized settings follow:\n;\n\n"); + for(unsigned int i = 0; i < UnknownSettings.size(); i++) + { + fp->print_format("%s %s\n\n", UnknownSettings[i].name, UnknownSettings[i].value); + } + } + + fp->close(); +} + +bool MDFN_SaveSettings(const std::string& path) +{ + try + { + FileStream fp(path, FileStream::MODE_WRITE); + SaveSettings(&fp); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + return(0); + } + + return(1); +} + + +static INLINE void MergeSettingSub(const MDFNSetting *setting) +{ + MDFNCS TempSetting; + uint32 name_hash; + + assert(setting->name); + assert(setting->default_value); + + if(FindSetting(setting->name, false, true) != NULL) + { + printf("Duplicate setting name %s\n", setting->name); + abort(); + } + + name_hash = MakeNameHash(setting->name); + + TempSetting.name = strdup(setting->name); + TempSetting.value = strdup(setting->default_value); + TempSetting.name_hash = name_hash; + TempSetting.desc = setting; + TempSetting.ChangeNotification = setting->ChangeNotification; + TempSetting.game_override = NULL; + TempSetting.netplay_override = NULL; + + CurrentSettings.insert(std::pair(name_hash, TempSetting)); //[name_hash] = TempSetting; +} + + +bool MDFN_MergeSettings(const MDFNSetting *setting) +{ + while(setting->name != NULL) + { + MergeSettingSub(setting); + setting++; + } + return(1); +} + +bool MDFN_MergeSettings(const std::vector &setting) +{ + for(unsigned int x = 0; x < setting.size(); x++) + MergeSettingSub(&setting[x]); + + return(1); +} + +void MDFN_ClearAllOverrideSettings(void) +{ + for(auto& sit : CurrentSettings) + { + if(sit.second.desc->type == MDFNST_ALIAS) + continue; + + if(sit.second.game_override) + { + free(sit.second.game_override); + sit.second.game_override = NULL; + } + + if(sit.second.netplay_override) + { + free(sit.second.netplay_override); + sit.second.netplay_override = NULL; + } + } +} + +void MDFN_KillSettings(void) +{ + for(auto& sit : CurrentSettings) + { + if(sit.second.desc->type == MDFNST_ALIAS) + continue; + + free(sit.second.name); + free(sit.second.value); + + if(sit.second.game_override) + free(sit.second.game_override); + + if(sit.second.netplay_override) + free(sit.second.netplay_override); + } + + if(UnknownSettings.size()) + { + for(unsigned int i = 0; i < UnknownSettings.size(); i++) + { + free(UnknownSettings[i].name); + free(UnknownSettings[i].value); + } + } + CurrentSettings.clear(); // Call after the list is all handled + UnknownSettings.clear(); +} + +static MDFNCS *FindSetting(const char *name, bool dref_alias, bool dont_freak_out_on_fail) +{ + MDFNCS *ret = NULL; + uint32 name_hash; + + //printf("Find: %s\n", name); + + name_hash = MakeNameHash(name); + + std::pair::iterator, std::multimap ::iterator> sit_pair; + std::multimap ::iterator sit; + + sit_pair = CurrentSettings.equal_range(name_hash); + + for(sit = sit_pair.first; sit != sit_pair.second; sit++) + { + //printf("Found: %s\n", sit->second.name); + if(!strcmp(sit->second.name, name)) + { + if(dref_alias && sit->second.desc->type == MDFNST_ALIAS) + return(FindSetting(sit->second.value, dref_alias, dont_freak_out_on_fail)); + + ret = &sit->second; + } + } + + if(!ret && !dont_freak_out_on_fail) + { + printf("\n\nINCONCEIVABLE! Setting not found: %s\n\n", name); + exit(1); + } + return(ret); +} + +static const char *GetSetting(const MDFNCS *setting) +{ + const char *value; + + if(setting->netplay_override) + value = setting->netplay_override; + else if(setting->game_override) + value = setting->game_override; + else + value = setting->value; + + return(value); +} + +static int GetEnum(const MDFNCS *setting, const char *value) +{ + const MDFNSetting_EnumList *enum_list = setting->desc->enum_list; + int ret = 0; + bool found = false; + + assert(enum_list); + + while(enum_list->string) + { + if(!strcasecmp(value, enum_list->string)) + { + found = true; + ret = enum_list->number; + break; + } + enum_list++; + } + + assert(found); + return(ret); +} + +uint64 MDFN_GetSettingUI(const char *name) +{ + const MDFNCS *setting = FindSetting(name); + const char *value = GetSetting(setting); + + if(setting->desc->type == MDFNST_ENUM) + return(GetEnum(setting, value)); + else + { + unsigned long long ret; + TranslateSettingValueUI(value, ret); + return(ret); + } +} + +int64 MDFN_GetSettingI(const char *name) +{ + const MDFNCS *setting = FindSetting(name); + const char *value = GetSetting(FindSetting(name)); + + + if(setting->desc->type == MDFNST_ENUM) + return(GetEnum(setting, value)); + else + { + long long ret; + TranslateSettingValueI(value, ret); + return(ret); + } +} + +double MDFN_GetSettingF(const char *name) +{ + double ret; + + MR_StringToDouble(GetSetting(FindSetting(name)), &ret); + + return ret; +} + +bool MDFN_GetSettingB(const char *name) +{ + return((bool)MDFN_GetSettingUI(name)); +} + +std::string MDFN_GetSettingS(const char *name) +{ + const MDFNCS *setting = FindSetting(name); + const char *value = GetSetting(setting); + + // Even if we're getting the string value of an enum instead of the associated numeric value, we still need + // to make sure it's a valid enum + // (actually, not really, since it's handled in other places where the setting is actually set) + //if(setting->desc->type == MDFNST_ENUM) + // GetEnum(setting, value); + + return(std::string(value)); +} + +const std::multimap *MDFNI_GetSettings(void) +{ + return(&CurrentSettings); +} + +bool MDFNI_SetSetting(const char *name, const char *value, bool NetplayOverride) +{ + MDFNCS *zesetting = FindSetting(name, true, true); + + if(zesetting) + { + try + { + ValidateSetting(value, zesetting->desc); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + return(0); + } + + // TODO: When NetplayOverride is set, make sure the setting is an emulation-related setting, + // and that it is safe to change it(changing paths to BIOSes and such is not safe :b). + if(NetplayOverride) + { + if(zesetting->netplay_override) + free(zesetting->netplay_override); + zesetting->netplay_override = strdup(value); + } + else + { + // Overriding the per-game override. Poetic. Though not really. + if(zesetting->game_override) + { + free(zesetting->game_override); + zesetting->game_override = NULL; + } + + if(zesetting->value) + free(zesetting->value); + zesetting->value = strdup(value); + } + + // TODO, always call driver notification function, regardless of whether a game is loaded. + if(zesetting->ChangeNotification) + { + if(MDFNGameInfo) + zesetting->ChangeNotification(name); + } + return(true); + } + else + { + MDFN_PrintError(_("Unknown setting \"%s\""), name); + return(false); + } +} + +#if 0 +// TODO after a game is loaded, but should we? +void MDFN_CallSettingsNotification(void) +{ + for(unsigned int x = 0; x < CurrentSettings.size(); x++) + { + if(CurrentSettings[x].ChangeNotification) + { + // TODO, always call driver notification function, regardless of whether a game is loaded. + if(MDFNGameInfo) + CurrentSettings[x].ChangeNotification(CurrentSettings[x].name); + } + } +} +#endif + +bool MDFNI_SetSettingB(const char *name, bool value) +{ + char tmpstr[2]; + tmpstr[0] = value ? '1' : '0'; + tmpstr[1] = 0; + + return(MDFNI_SetSetting(name, tmpstr, FALSE)); +} + +bool MDFNI_SetSettingUI(const char *name, uint64 value) +{ + char tmpstr[32]; + + trio_snprintf(tmpstr, 32, "%llu", (unsigned long long)value); + return(MDFNI_SetSetting(name, tmpstr, FALSE)); +} + +void MDFNI_DumpSettingsDef(const char *path) +{ + FileStream fp(path, FileStream::MODE_WRITE); + + std::multimap ::iterator sit; + std::list SortedList; + std::list::iterator lit; + std::map tts; + std::mapfts; + + tts[MDFNST_INT] = "MDFNST_INT"; + tts[MDFNST_UINT] = "MDFNST_UINT"; + tts[MDFNST_BOOL] = "MDFNST_BOOL"; + tts[MDFNST_FLOAT] = "MDFNST_FLOAT"; + tts[MDFNST_STRING] = "MDFNST_STRING"; + tts[MDFNST_ENUM] = "MDFNST_ENUM"; + + fts[MDFNSF_CAT_INPUT] = "MDFNSF_CAT_INPUT"; + fts[MDFNSF_CAT_SOUND] = "MDFNSF_CAT_SOUND"; + fts[MDFNSF_CAT_VIDEO] = "MDFNSF_CAT_VIDEO"; + + fts[MDFNSF_EMU_STATE] = "MDFNSF_EMU_STATE"; + fts[MDFNSF_UNTRUSTED_SAFE] = "MDFNSF_UNTRUSTED_SAFE"; + + fts[MDFNSF_SUPPRESS_DOC] = "MDFNSF_SUPPRESS_DOC"; + fts[MDFNSF_COMMON_TEMPLATE] = "MDFNSF_COMMON_TEMPLATE"; + + fts[MDFNSF_REQUIRES_RELOAD] = "MDFNSF_REQUIRES_RELOAD"; + fts[MDFNSF_REQUIRES_RESTART] = "MDFNSF_REQUIRES_RESTART"; + + + for(sit = CurrentSettings.begin(); sit != CurrentSettings.end(); sit++) + SortedList.push_back(&sit->second); + + SortedList.sort(compare_sname); + + for(lit = SortedList.begin(); lit != SortedList.end(); lit++) + { + const MDFNSetting *setting = (*lit)->desc; + char *desc_escaped; + char *desc_extra_escaped; + + if(setting->type == MDFNST_ALIAS) + continue; + + fp.print_format("%s\n", setting->name); + + for(unsigned int i = 0; i < 32; i++) + { + if(setting->flags & (1 << i)) + fp.print_format("%s ", fts[1 << i]); + } + fp.print_format("\n"); + + desc_escaped = escape_string(setting->description ? setting->description : ""); + desc_extra_escaped = escape_string(setting->description_extra ? setting->description_extra : ""); + + + fp.print_format("%s\n", desc_escaped); + fp.print_format("%s\n", desc_extra_escaped); + + free(desc_escaped); + free(desc_extra_escaped); + + fp.print_format("%s\n", tts[setting->type]); + fp.print_format("%s\n", setting->default_value ? setting->default_value : ""); + fp.print_format("%s\n", setting->minimum ? setting->minimum : ""); + fp.print_format("%s\n", setting->maximum ? setting->maximum : ""); + + if(!setting->enum_list) + fp.print_format("0\n"); + else + { + const MDFNSetting_EnumList *el = setting->enum_list; + int count = 0; + + while(el->string) + { + count++; + el++; + } + + fp.print_format("%d\n", count); + + el = setting->enum_list; + while(el->string) + { + desc_escaped = escape_string(el->description ? el->description : ""); + desc_extra_escaped = escape_string(el->description_extra ? el->description_extra : ""); + + fp.print_format("%s\n", el->string); + fp.print_format("%s\n", desc_escaped); + fp.print_format("%s\n", desc_extra_escaped); + + free(desc_escaped); + free(desc_extra_escaped); + + el++; + } + } + } + + fp.close(); +} diff --git a/Mednafen/mednafen/settings.h b/Mednafen/mednafen/settings.h new file mode 100644 index 0000000000..8aa3f92ade --- /dev/null +++ b/Mednafen/mednafen/settings.h @@ -0,0 +1,30 @@ +#ifndef MDFN_SETTINGS_H +#define MDFN_SETTINGS_H + +#include + +#include "settings-common.h" + +void MDFN_LoadSettings(const std::string& path, bool override = false); +bool MDFN_MergeSettings(const MDFNSetting *); +bool MDFN_MergeSettings(const std::vector &); +bool MDFN_SaveSettings(const std::string& path); + +void MDFN_ClearAllOverrideSettings(void); +void MDFN_KillSettings(void); // Free any resources acquired. + +// This should assert() or something if the setting isn't found, since it would +// be a totally tubular error! +uint64 MDFN_GetSettingUI(const char *name); +int64 MDFN_GetSettingI(const char *name); +double MDFN_GetSettingF(const char *name); +bool MDFN_GetSettingB(const char *name); +std::string MDFN_GetSettingS(const char *name); + +static INLINE uint64 MDFN_GetSettingUI(const std::string& name) { return MDFN_GetSettingUI(name.c_str()); } +static INLINE int64 MDFN_GetSettingI(const std::string& name) { return MDFN_GetSettingI(name.c_str()); } +static INLINE double MDFN_GetSettingF(const std::string& name) { return MDFN_GetSettingF(name.c_str()); } +static INLINE bool MDFN_GetSettingB(const std::string& name) { return MDFN_GetSettingB(name.c_str()); } +static INLINE std::string MDFN_GetSettingS(const std::string& name) { return MDFN_GetSettingS(name.c_str()); } + +#endif diff --git a/Mednafen/mednafen/sexyal/COPYING b/Mednafen/mednafen/sexyal/COPYING new file mode 100644 index 0000000000..78159e6331 --- /dev/null +++ b/Mednafen/mednafen/sexyal/COPYING @@ -0,0 +1,22 @@ +SexyAL - Simple audio abstraction library. + +Copyright (c) 2005-2007 Mednafen Team + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Mednafen/mednafen/sexyal/Makefile.am b/Mednafen/mednafen/sexyal/Makefile.am new file mode 100644 index 0000000000..2e0b94e9ca --- /dev/null +++ b/Mednafen/mednafen/sexyal/Makefile.am @@ -0,0 +1,38 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @SDL_CFLAGS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libsexyal.a + +libsexyal_a_SOURCES = sexyal.cpp convert.cpp drivers/dummy.cpp + +if HAVE_DIRECTSOUND +TMP_DIRECTSOUND = drivers/dsound.cpp +endif + +if HAVE_WASAPI +TMP_WASAPI = drivers/wasapi.cpp drivers/wasapish.cpp +endif + +if HAVE_OSSDSP +TMP_OSSDSP = drivers/oss.cpp +endif + +if HAVE_JACK +TMP_JACK = drivers/jack.cpp +endif + +if HAVE_SDL +TMP_SDL = drivers/sdl.cpp +libsexyal_a_CFLAGS = @SDL_CFLAGS@ +endif + +if HAVE_ALSA +TMP_ALSA = drivers/alsa.cpp +endif + +if DOS +TMP_DOS = drivers/dos_common.cpp drivers/cmi8738.cpp drivers/es1370.cpp drivers/es1371.cpp drivers/sb.cpp +endif + +libsexyal_a_SOURCES += $(TMP_DIRECTSOUND) $(TMP_WASAPI) $(TMP_OSSDSP) $(TMP_JACK) $(TMP_SDL) $(TMP_ALSA) $(TMP_DOS) diff --git a/Mednafen/mednafen/sexyal/Makefile.in b/Mednafen/mednafen/sexyal/Makefile.in new file mode 100644 index 0000000000..4b30ee4ed2 --- /dev/null +++ b/Mednafen/mednafen/sexyal/Makefile.in @@ -0,0 +1,756 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/sexyal +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp COPYING \ + README +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libsexyal_a_AR = $(AR) $(ARFLAGS) +libsexyal_a_LIBADD = +am__libsexyal_a_SOURCES_DIST = sexyal.cpp convert.cpp \ + drivers/dummy.cpp drivers/dsound.cpp drivers/wasapi.cpp \ + drivers/wasapish.cpp drivers/oss.cpp drivers/jack.cpp \ + drivers/sdl.cpp drivers/alsa.cpp drivers/dos_common.cpp \ + drivers/cmi8738.cpp drivers/es1370.cpp drivers/es1371.cpp \ + drivers/sb.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@HAVE_DIRECTSOUND_TRUE@am__objects_1 = drivers/dsound.$(OBJEXT) +@HAVE_WASAPI_TRUE@am__objects_2 = drivers/wasapi.$(OBJEXT) \ +@HAVE_WASAPI_TRUE@ drivers/wasapish.$(OBJEXT) +@HAVE_OSSDSP_TRUE@am__objects_3 = drivers/oss.$(OBJEXT) +@HAVE_JACK_TRUE@am__objects_4 = drivers/jack.$(OBJEXT) +@HAVE_SDL_TRUE@am__objects_5 = drivers/sdl.$(OBJEXT) +@HAVE_ALSA_TRUE@am__objects_6 = drivers/alsa.$(OBJEXT) +@DOS_TRUE@am__objects_7 = drivers/dos_common.$(OBJEXT) \ +@DOS_TRUE@ drivers/cmi8738.$(OBJEXT) drivers/es1370.$(OBJEXT) \ +@DOS_TRUE@ drivers/es1371.$(OBJEXT) drivers/sb.$(OBJEXT) +am_libsexyal_a_OBJECTS = sexyal.$(OBJEXT) convert.$(OBJEXT) \ + drivers/dummy.$(OBJEXT) $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_6) $(am__objects_7) +libsexyal_a_OBJECTS = $(am_libsexyal_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libsexyal_a_SOURCES) +DIST_SOURCES = $(am__libsexyal_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @SDL_CFLAGS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libsexyal.a +libsexyal_a_SOURCES = sexyal.cpp convert.cpp drivers/dummy.cpp \ + $(TMP_DIRECTSOUND) $(TMP_WASAPI) $(TMP_OSSDSP) $(TMP_JACK) \ + $(TMP_SDL) $(TMP_ALSA) $(TMP_DOS) +@HAVE_DIRECTSOUND_TRUE@TMP_DIRECTSOUND = drivers/dsound.cpp +@HAVE_WASAPI_TRUE@TMP_WASAPI = drivers/wasapi.cpp drivers/wasapish.cpp +@HAVE_OSSDSP_TRUE@TMP_OSSDSP = drivers/oss.cpp +@HAVE_JACK_TRUE@TMP_JACK = drivers/jack.cpp +@HAVE_SDL_TRUE@TMP_SDL = drivers/sdl.cpp +@HAVE_SDL_TRUE@libsexyal_a_CFLAGS = @SDL_CFLAGS@ +@HAVE_ALSA_TRUE@TMP_ALSA = drivers/alsa.cpp +@DOS_TRUE@TMP_DOS = drivers/dos_common.cpp drivers/cmi8738.cpp drivers/es1370.cpp drivers/es1371.cpp drivers/sb.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/sexyal/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/sexyal/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +drivers/$(am__dirstamp): + @$(MKDIR_P) drivers + @: > drivers/$(am__dirstamp) +drivers/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) drivers/$(DEPDIR) + @: > drivers/$(DEPDIR)/$(am__dirstamp) +drivers/dummy.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/dsound.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/wasapi.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/wasapish.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/oss.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/jack.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/sdl.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/alsa.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/dos_common.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/cmi8738.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/es1370.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/es1371.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) +drivers/sb.$(OBJEXT): drivers/$(am__dirstamp) \ + drivers/$(DEPDIR)/$(am__dirstamp) + +libsexyal.a: $(libsexyal_a_OBJECTS) $(libsexyal_a_DEPENDENCIES) $(EXTRA_libsexyal_a_DEPENDENCIES) + $(AM_V_at)-rm -f libsexyal.a + $(AM_V_AR)$(libsexyal_a_AR) libsexyal.a $(libsexyal_a_OBJECTS) $(libsexyal_a_LIBADD) + $(AM_V_at)$(RANLIB) libsexyal.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f drivers/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convert.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sexyal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/alsa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/cmi8738.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/dos_common.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/dsound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/dummy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/es1370.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/es1371.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/jack.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/oss.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/sb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/sdl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/wasapi.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@drivers/$(DEPDIR)/wasapish.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f drivers/$(DEPDIR)/$(am__dirstamp) + -rm -f drivers/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) drivers/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) drivers/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/sexyal/README b/Mednafen/mednafen/sexyal/README new file mode 100644 index 0000000000..4dba680897 --- /dev/null +++ b/Mednafen/mednafen/sexyal/README @@ -0,0 +1,15 @@ +SexyAL current bugs and limitations: + + Only supports one input sample format right now: SEXYAL_FMT_PCMS16 + + Does not perform sample-rate conversion. + + The SDL driver is intended to be integrated in an application that already uses SDL, and calls SDL_Init() + before a SexyAL device is opened, and SDL_Quit() after it is closed(the SexyAL SDL sound driver will handle + initializing any SDL subsystems it needs if they're not already initialized, however). + If you want to use it in an application that otherwise does not use SDL, you will need to set the environment + variable "SEXYAL_SDL_STANDALONE" to a non-zero positive integer value before you open the SexyAL device. + + Pause() and Clear() are not completely implemented in drivers yet. + + CanWrite() semantics can be weird, read the comment in "sexyal.h". diff --git a/Mednafen/mednafen/sexyal/convert.cpp b/Mednafen/mednafen/sexyal/convert.cpp new file mode 100644 index 0000000000..0a32c91b40 --- /dev/null +++ b/Mednafen/mednafen/sexyal/convert.cpp @@ -0,0 +1,269 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "sexyal.h" + +#include +#include +#include +#include "convert.h" +#include + +static inline uint32_t ConvertRandU32(void) +{ + static uint32_t x = 123456789; + static uint32_t y = 987654321; + static uint32_t z = 43219876; + static uint32_t c = 6543217; + uint64_t t; + + x = 314527869 * x + 1234567; + y ^= y << 5; y ^= y >> 7; y ^= y << 22; + t = 4294584393ULL * z + c; c = t >> 32; z = t; + + return(x + y + z); +} + +static inline uint16_t FLIP16(uint16_t b) +{ + return((b<<8)|((b>>8)&0xFF)); +} + +static inline uint32_t FLIP32(uint32_t b) +{ + return( (b<<24) | ((b>>8)&0xFF00) | ((b<<8)&0xFF0000) | ((b>>24)&0xFF) ); +} + + +template +static inline dsf_t SAMP_CONVERT(int16_t in_sample) +{ + if(dsf == SEXYAL_FMT_PCMU8) + { + int tmp = (in_sample + 32768 + (uint8_t)(ConvertRandU32() & 0xFF)) >> 8; + + if(tmp < 0) + tmp = 0; + + if(tmp > 255) + tmp = 255; + + return(tmp); + } + + if(dsf == SEXYAL_FMT_PCMS8) + { + int tmp = (in_sample + (uint8_t)(ConvertRandU32() & 0xFF)) >> 8; + + if(tmp < -128) + tmp = -128; + + if(tmp > 127) + tmp = 127; + + return(tmp); + } + + if(dsf == SEXYAL_FMT_PCMU16) + return(in_sample + 32768); + + if(dsf == SEXYAL_FMT_PCMS16) + return(in_sample); + + if(dsf == SEXYAL_FMT_PCMU24) + return((in_sample + 32768) << 8); + + if(dsf == SEXYAL_FMT_PCMS24) + return(in_sample << 8); + + if(dsf == SEXYAL_FMT_PCMU32) + return((uint32_t)(in_sample + 32768) << 16); + + if(dsf == SEXYAL_FMT_PCMS32) + return(in_sample << 16); + + if(dsf == SEXYAL_FMT_PCMFLOAT) + return((float)in_sample / 32768); +} + + +template +static void ConvertLoop(const int16_t *src, dsf_t *dest, const int src_chan, const int dest_chan, const bool dest_noninterleaved, int32_t frames) +{ + if(src_chan == 1 && dest_chan == 1) + { + for(int i = 0; i < frames; i++) + { + dest[0] = SAMP_CONVERT(src[0]); + src++; + dest++; + } + } + else if(src_chan == 2 && dest_chan == 1) + { + for(int i = 0; i < frames; i++) + { + int32_t mt = (src[0] + src[1]) >> 1; + + dest[0] = SAMP_CONVERT(mt); + src += 2; + dest += 1; + } + } + else if(src_chan == 1 && dest_chan >= 2) + { + if(dest_noninterleaved) + { + for(int i = 0; i < frames; i++) + { + dsf_t temp = SAMP_CONVERT(*src); + + dest[0 * frames] = temp; + dest[1 * frames] = temp; + + src += 1; + dest += 1; + + for(int padc = 2; padc < dest_chan; padc++) + dest[padc * frames] = SAMP_CONVERT(0); + } + } + else + { + for(int i = 0; i < frames; i++) + { + dsf_t temp = SAMP_CONVERT(*src); + dest[0] = temp; + dest[1] = temp; + src += 1; + dest += 2; + + for(int padc = 2; padc < dest_chan; padc++) + *dest++ = SAMP_CONVERT(0); + } + } + } + else //if(src_chan == 2 && dest_chan >= 2) + { + if(dest_noninterleaved) + { + for(int i = 0; i < frames; i++) + { + dest[0 * frames] = SAMP_CONVERT(src[0]); + dest[1 * frames] = SAMP_CONVERT(src[1]); + src += 2; + dest += 1; + } + + for(int padc = 2; padc < dest_chan; padc++) + dest[padc * frames] = SAMP_CONVERT(0); + } + else + { + for(int i = 0; i < frames; i++) + { + dest[0] = SAMP_CONVERT(src[0]); + dest[1] = SAMP_CONVERT(src[1]); + src += 2; + dest += 2; + + for(int padc = 2; padc < dest_chan; padc++) + *dest++ = SAMP_CONVERT(0); + } + } + } +} + + +/* Only supports one input sample format right now: SEXYAL_FMT_PCMS16 */ +void SexiALI_Convert(const SexyAL_format *srcformat, const SexyAL_format *destformat, const void *vsrc, void *vdest, uint32_t frames) +{ + const int16_t *src = (int16_t *)vsrc; + + assert(srcformat->noninterleaved == false); + + if(destformat->sampformat == srcformat->sampformat) + if(destformat->channels == srcformat->channels) + if(destformat->revbyteorder == srcformat->revbyteorder) + if(destformat->noninterleaved == srcformat->noninterleaved) + { + memcpy(vdest, vsrc, frames * (destformat->sampformat >> 4) * destformat->channels); + return; + } + + switch(destformat->sampformat) + { + case SEXYAL_FMT_PCMU8: + ConvertLoop(src, (uint8_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMS8: + ConvertLoop(src, (int8_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMU16: + ConvertLoop(src, (uint16_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMS16: + ConvertLoop(src, (int16_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMU24: + ConvertLoop(src, (uint32_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMS24: + ConvertLoop(src, (int32_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMU32: + ConvertLoop(src, (uint32_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMS32: + ConvertLoop(src, (int32_t*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + + case SEXYAL_FMT_PCMFLOAT: + ConvertLoop(src, (float*)vdest, srcformat->channels, destformat->channels, destformat->noninterleaved, frames); + break; + } + + if(destformat->revbyteorder != srcformat->revbyteorder) + { + if((destformat->sampformat >> 4) == 2) + { + uint16_t *dest = (uint16_t *)vdest; + for(uint32_t x = 0; x < frames * destformat->channels; x++) + { + *dest = FLIP16(*dest); + dest++; + } + } + else if((destformat->sampformat >> 4) == 4) + { + uint32_t *dest = (uint32_t *)vdest; + for(uint32_t x = 0; x < frames * destformat->channels; x++) + { + *dest = FLIP32(*dest); + dest++; + } + } + + } +} diff --git a/Mednafen/mednafen/sexyal/convert.h b/Mednafen/mednafen/sexyal/convert.h new file mode 100644 index 0000000000..e890e8ac78 --- /dev/null +++ b/Mednafen/mednafen/sexyal/convert.h @@ -0,0 +1,2 @@ +void SexiALI_Convert(const SexyAL_format *srcformat, const SexyAL_format *destformat, const void *vsrc, void *vdest, uint32_t frames); + diff --git a/Mednafen/mednafen/sexyal/drivers/alsa.cpp b/Mednafen/mednafen/sexyal/drivers/alsa.cpp new file mode 100644 index 0000000000..23a11122c6 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/alsa.cpp @@ -0,0 +1,487 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +typedef struct +{ + snd_pcm_t *alsa_pcm; + + uint32_t period_size; + //bool heavy_sync; +} ADStruct; + + +// TODO: +SexyAL_enumdevice *SexyALI_ALSA_EnumerateDevices(void) +{ + return(NULL); +} + +static int Pause(SexyAL_device *device, int state) +{ + if(0) + snd_pcm_pause(((ADStruct *)device->private_data)->alsa_pcm, state); + else + { + snd_pcm_drop(((ADStruct *)device->private_data)->alsa_pcm); + } + return(0); +} + +static int Clear(SexyAL_device *device) +{ + snd_pcm_drop(((ADStruct *)device->private_data)->alsa_pcm); + + return(1); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + ADStruct *ads = (ADStruct *)device->private_data; + uint32_t ret; + snd_pcm_sframes_t avail; + + + while(/*(ads->heavy_sync && snd_pcm_hwsync(ads->alsa_pcm) < 0) ||*/ (avail = snd_pcm_avail_update(ads->alsa_pcm)) < 0) + { + // If the call to snd_pcm_avail() fails, try to figure out the status of the PCM stream and take the best action. + switch(snd_pcm_state(ads->alsa_pcm)) + { + // This shouldn't happen, but in case it does... + default: //puts("What1?"); + *can_write = device->buffering.buffer_size * (device->format.sampformat >> 4) * device->format.channels; + return(1); + + //default: break; + //case SND_PCM_STATE_RUNNING: break; + //case SND_PCM_STATE_PREPARED: break; + + case SND_PCM_STATE_PAUSED: + case SND_PCM_STATE_DRAINING: + case SND_PCM_STATE_OPEN: + case SND_PCM_STATE_DISCONNECTED: *can_write = device->buffering.buffer_size * (device->format.sampformat >> 4) * device->format.channels; + return(1); + + case SND_PCM_STATE_SETUP: + case SND_PCM_STATE_SUSPENDED: + case SND_PCM_STATE_XRUN: + //puts("XRun1"); + snd_pcm_prepare(ads->alsa_pcm); + *can_write = device->buffering.buffer_size * (device->format.sampformat >> 4) * device->format.channels; + return(1); + } + } + + ret = avail * (device->format.sampformat >> 4) * device->format.channels; + + if(ret < 0) + ret = 0; + + *can_write = ret; + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + ADStruct *ads = (ADStruct *)device->private_data; + + //printf("%u\n", len); + + #if 0 + RawCanWrite(device); + #endif + + + //if(ads->heavy_sync) + //{ + // uint32_t cw; + // while(RawCanWrite(device, &cw) > 0 && ((int)cw) < len) usleep(750); + //} + + while(len > 0) + { + int snore = 0; + + do + { + if(device->format.noninterleaved == false) + snore = snd_pcm_writei(ads->alsa_pcm, data, len / (device->format.sampformat>>4) / device->format.channels); + else + { + void *foodata[device->format.channels]; + + for(unsigned ch = 0; ch < device->format.channels; ch++) + foodata[ch] = (uint8_t*)data + ch * (len / device->format.channels); + + snore = snd_pcm_writen(ads->alsa_pcm, foodata, len / (device->format.sampformat>>4) / device->format.channels); + } + + if(snore <= 0) + { + switch(snd_pcm_state(ads->alsa_pcm)) + { + // This shouldn't happen, but if it does, and there was an error, exit out of the loopie. + default: //puts("What2"); + if(snore < 0) + snore = len / (device->format.sampformat>>4) / device->format.channels; + break; + + // Don't unplug your sound card, silly human! ;) + case SND_PCM_STATE_OPEN: + case SND_PCM_STATE_DISCONNECTED: snore = len / (device->format.sampformat>>4) / device->format.channels; + //usleep(1000); + break; + + case SND_PCM_STATE_SETUP: + case SND_PCM_STATE_SUSPENDED: + case SND_PCM_STATE_XRUN: //puts("XRun2"); + snd_pcm_prepare(ads->alsa_pcm); + break; + } + } + + } while(snore <= 0); + + if(device->format.noninterleaved == false) + data = (const uint8_t*)data + snore * (device->format.sampformat>>4) * device->format.channels; + else + data = (const uint8_t*)data + snore * (device->format.sampformat>>4); + + len -= snore * (device->format.sampformat>>4) * device->format.channels; + + if(snd_pcm_state(ads->alsa_pcm) == SND_PCM_STATE_PREPARED) + snd_pcm_start(ads->alsa_pcm); + } + + return(1); +} + +static int RawClose(SexyAL_device *device) +{ + if(device) + { + if(device->private_data) + { + ADStruct *ads = (ADStruct *)device->private_data; + snd_pcm_close(ads->alsa_pcm); + free(device->private_data); + } + free(device); + return(1); + } + return(0); +} + +#define ALSA_INIT_CLEANUP \ + if(hw_params) snd_pcm_hw_params_free(hw_params); \ + if(alsa_pcm) snd_pcm_close(alsa_pcm); \ + if(ads) free(ads); \ + if(device) free(device); + +#define ALSA_TRY(func) { \ + int error; \ + error = func; \ + if(error < 0) \ + { \ + printf("ALSA Error: %s %s\n", #func, snd_strerror(error)); \ + ALSA_INIT_CLEANUP \ + return(0); \ + } } + +typedef struct +{ + int sexyal; + bool sexyal_revbyteorder; + snd_pcm_format_t alsa; +} ALSA_SAL_FMAP; + +#ifdef LSB_FIRST + #define FMAP_ENTRY_EPAIR(sal, bf) { sal, false, bf##_LE }, { sal, true, bf##_BE }, +#else + #define FMAP_ENTRY_EPAIR(sal, bf) { sal, false, bf##_BE }, { sal, true, bf##_LE }, +#endif + +static ALSA_SAL_FMAP FormatMap[] = +{ + { SEXYAL_FMT_PCMU8, false, SND_PCM_FORMAT_U8 }, + { SEXYAL_FMT_PCMS8, false, SND_PCM_FORMAT_S8 }, + + + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMU16, SND_PCM_FORMAT_U16) + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMS16, SND_PCM_FORMAT_S16) + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMFLOAT, SND_PCM_FORMAT_FLOAT) + + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMU24, SND_PCM_FORMAT_U24) + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMS24, SND_PCM_FORMAT_S24) + + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMU32, SND_PCM_FORMAT_U32) + FMAP_ENTRY_EPAIR(SEXYAL_FMT_PCMS32, SND_PCM_FORMAT_S32) +}; + +static int Format_ALSA_to_SexyAL(const snd_pcm_format_t alsa_format, bool *revbyteorder) +{ + for(unsigned int i = 0; i < sizeof(FormatMap) / sizeof(ALSA_SAL_FMAP); i++) + { + if(FormatMap[i].alsa == alsa_format) + { + if(revbyteorder) + *revbyteorder = FormatMap[i].sexyal_revbyteorder; + return(FormatMap[i].sexyal); + } + } + printf("ALSA->SexyAL format not found: %d\n", alsa_format); + return(-1); +} + +static snd_pcm_format_t Format_SexyAL_to_ALSA(const int sexyal_format) +{ + for(unsigned int i = 0; i < sizeof(FormatMap) / sizeof(ALSA_SAL_FMAP); i++) + { + if(FormatMap[i].sexyal == sexyal_format) + return(FormatMap[i].alsa); + } + printf("SexyAL->ALSA format not found: %d\n", sexyal_format); + return(SND_PCM_FORMAT_UNKNOWN); +} + + +SexyAL_device *SexyALI_ALSA_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + ADStruct *ads = NULL; + SexyAL_device *device = NULL; + snd_pcm_t *alsa_pcm = NULL; + snd_pcm_hw_params_t *hw_params = NULL; + snd_pcm_sw_params_t *sw_params = NULL; + int desired_pt; // Desired period time, in MICROseconds. + int desired_buffertime; // Desired buffer time, in milliseconds + //bool heavy_sync = FALSE; + snd_pcm_format_t sampformat; + + + desired_pt = buffering->period_us ? buffering->period_us : 1250; // 1.25 milliseconds + desired_buffertime = buffering->ms ? buffering->ms : 32; // 32 milliseconds + + // Try to force at least 2 channels... + if(format->channels < 2) + format->channels = 2; + + //...and at least >= 16-bit samples. Doing so will allow us to achieve lower period sizes(since minimum period sizes in the ALSA core + // are expressed in bytes). + if(format->sampformat == SEXYAL_FMT_PCMU8 || format->sampformat == SEXYAL_FMT_PCMS8) + format->sampformat = SEXYAL_FMT_PCMS16; + + sampformat = Format_SexyAL_to_ALSA(format->sampformat); + + ALSA_TRY(snd_pcm_open(&alsa_pcm, id ? id : "hw:0", SND_PCM_STREAM_PLAYBACK, 0)); + ALSA_TRY(snd_pcm_hw_params_malloc(&hw_params)); + ALSA_TRY(snd_pcm_sw_params_malloc(&sw_params)); + + ALSA_TRY(snd_pcm_hw_params_any(alsa_pcm, hw_params)); + ALSA_TRY(snd_pcm_hw_params_set_periods_integer(alsa_pcm, hw_params)); + + format->noninterleaved = false; + if(snd_pcm_hw_params_set_access(alsa_pcm, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) + { + puts("Interleaved format not supported, trying non-interleaved instead. :("); + ALSA_TRY(snd_pcm_hw_params_set_access(alsa_pcm, hw_params, SND_PCM_ACCESS_RW_NONINTERLEAVED)); + format->noninterleaved = true; + } + + if(snd_pcm_hw_params_set_format(alsa_pcm, hw_params, sampformat) < 0) + { + int try_format; + #define NUM_TRY_FORMATS (7 * 2 + 2) + +#ifdef LSB_FIRST + #define TRYF_EPAIR(bf) bf##_LE, bf##_BE, +#else + #define TRYF_EPAIR(bf) bf##_BE, bf##_LE, +#endif + static const snd_pcm_format_t TryFormats[NUM_TRY_FORMATS] = + { + TRYF_EPAIR(SND_PCM_FORMAT_S16) + TRYF_EPAIR(SND_PCM_FORMAT_U16) + TRYF_EPAIR(SND_PCM_FORMAT_S24) + TRYF_EPAIR(SND_PCM_FORMAT_U24) + TRYF_EPAIR(SND_PCM_FORMAT_S32) + TRYF_EPAIR(SND_PCM_FORMAT_U32) + TRYF_EPAIR(SND_PCM_FORMAT_FLOAT) + + SND_PCM_FORMAT_U8, + SND_PCM_FORMAT_S8 + }; + #undef TRYF_EPAIR + + printf("Desired sample format not supported, trying others...\n"); + + for(try_format = 0; try_format < NUM_TRY_FORMATS; try_format++) + { + // Don't retry the original format! + if(TryFormats[try_format] == sampformat) + continue; + + if(snd_pcm_hw_params_set_format(alsa_pcm, hw_params, TryFormats[try_format]) >= 0) + { + sampformat = TryFormats[try_format]; + format->sampformat = Format_ALSA_to_SexyAL(TryFormats[try_format], &format->revbyteorder); + break; + } + } + + if(try_format == NUM_TRY_FORMATS) + { + // TODO: Perhaps we should concatenate all the errors for all the formats tried? + printf("No tried formats supported?!\n"); + ALSA_INIT_CLEANUP + return(0); + } + } + + #if SND_LIB_VERSION >= 0x10009 + ALSA_TRY(snd_pcm_hw_params_set_rate_resample(alsa_pcm, hw_params, 0)); + #endif + + unsigned int rrate = format->rate; + ALSA_TRY(snd_pcm_hw_params_set_rate_near(alsa_pcm, hw_params, &rrate, 0)); + format->rate = rrate; + + // + // Set number of channels + // + { + unsigned int rchan = format->channels; + unsigned int maxchan; + unsigned int minchan; + + maxchan = 8; + ALSA_TRY(snd_pcm_hw_params_set_channels_max(alsa_pcm, hw_params, &maxchan)); + + if(format->channels > 1 && maxchan > 1) + { + minchan = 2; + ALSA_TRY(snd_pcm_hw_params_set_channels_min(alsa_pcm, hw_params, &minchan)); + } + + ALSA_TRY(snd_pcm_hw_params_set_channels_near(alsa_pcm, hw_params, &rchan)); + + assert(rchan <= 8 && rchan > 0); + format->channels = rchan; + } + + // Limit desired_buffertime to what the sound card is capable of at this playback rate. + { + unsigned int btm = 0; + int dir = 0; + ALSA_TRY(snd_pcm_hw_params_get_buffer_time_max(hw_params, &btm, &dir)); + + // btm > 32 may be unnecessary, but it's there in case ALSA returns a bogus value far too small... + if(btm > 32 && desired_buffertime > btm) + desired_buffertime = btm; + + //printf("BTM: %d\n", btm); + } + { + int dir = 0; + unsigned int max_periods; + + ALSA_TRY(snd_pcm_hw_params_get_periods_max(hw_params, &max_periods, &dir)); + if(((int64_t)desired_pt * max_periods) < ((int64_t)1000 * desired_buffertime)) + { + //puts("\nHRMMM. max_periods is not large enough to meet desired buffering size at desired period time.\n"); + desired_pt = 1000 * desired_buffertime / max_periods; + + if(desired_pt > 5400) + desired_pt = 5400; + } + //printf("Max Periods: %d\n", max_periods); + } + + { + snd_pcm_uframes_t tmpps = (int64_t)desired_pt * format->rate / (1000 * 1000); + int dir = 0; + + snd_pcm_hw_params_set_period_size_near(alsa_pcm, hw_params, &tmpps, &dir); + } + + snd_pcm_uframes_t tmp_uft; + tmp_uft = desired_buffertime * format->rate / 1000; + ALSA_TRY(snd_pcm_hw_params_set_buffer_size_near(alsa_pcm, hw_params, &tmp_uft)); + + ALSA_TRY(snd_pcm_hw_params(alsa_pcm, hw_params)); + snd_pcm_uframes_t buffer_size, period_size; + unsigned int periods; + + ALSA_TRY(snd_pcm_hw_params_get_period_size(hw_params, &period_size, NULL)); + ALSA_TRY(snd_pcm_hw_params_get_periods(hw_params, &periods, NULL)); + snd_pcm_hw_params_free(hw_params); + + ALSA_TRY(snd_pcm_sw_params_current(alsa_pcm, sw_params)); + + #if 0 + ALSA_TRY(snd_pcm_sw_params_set_xrun_mode(alsa_pcm, sw_params, SND_PCM_XRUN_NONE)); + #endif + + ALSA_TRY(snd_pcm_sw_params(alsa_pcm, sw_params)); + snd_pcm_sw_params_free(sw_params); + + buffer_size = period_size * periods; + + buffering->period_size = period_size; + buffering->buffer_size = buffer_size; + buffering->latency = buffering->buffer_size; + + device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)); + ads = (ADStruct *)calloc(1, sizeof(ADStruct)); + + ads->alsa_pcm = alsa_pcm; + ads->period_size = period_size; + //ads->heavy_sync = heavy_sync; + + device->private_data = ads; + device->RawWrite = RawWrite; + device->RawCanWrite = RawCanWrite; + device->RawClose = RawClose; + device->Pause = Pause; + device->Clear = Clear; + + memcpy(&device->buffering,buffering,sizeof(SexyAL_buffering)); + memcpy(&device->format,format,sizeof(SexyAL_format)); + + ALSA_TRY(snd_pcm_prepare(alsa_pcm)); + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/cmi8738.cpp b/Mednafen/mednafen/sexyal/drivers/cmi8738.cpp new file mode 100644 index 0000000000..64383bf9bb --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/cmi8738.cpp @@ -0,0 +1,445 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Notes: + hard-coded 16-bit stereo support to minimize buffer position timing granularity, and to simplify stuff +*/ + +#include "dos_common.h" +#include + +/* +static const int CMI_DMAFIFO_BYTESIZE = 0; +static const int CMI_DMAFIFO_FETCHBYTESIZE = 0; +*/ + +typedef struct +{ + uint16_t bdf; + uint32_t base_addr; + + _go32_dpmi_seginfo dmabuf; + + uint64_t read_counter; // In frames, not bytes. + uint64_t write_counter; // In frames, not bytes. + + uint16_t prev_dmacounter; + bool paused; +} CMI8738_Driver_t; + +static void wrdm32(CMI8738_Driver_t* ds, uint32_t offset, uint32_t value) +{ + outportl(ds->base_addr + offset, value); + //printf("wrdm32() %02x:%08x ;;; %08x\n", offset, value, inportl(ds->base_addr + offset)); +} + +static uint32_t rddm32(CMI8738_Driver_t* ds, uint32_t offset) +{ + return inportl(ds->base_addr + offset); +} + +static void wrdm16(CMI8738_Driver_t* ds, uint32_t offset, uint16_t value) +{ + outportw(ds->base_addr + offset, value); +} + +static uint16_t rddm16(CMI8738_Driver_t* ds, uint32_t offset) +{ + return inportw(ds->base_addr + offset); +} + +static void wrdm8(CMI8738_Driver_t* ds, uint32_t offset, uint8_t value) +{ + outportb(ds->base_addr + offset, value); +} + +static uint8_t rddm8(CMI8738_Driver_t* ds, uint32_t offset) +{ + return inportb(ds->base_addr + offset); +} + +static void wrmix(CMI8738_Driver_t* ds, uint8_t offset, uint8_t value) +{ + wrdm8(ds, 0x23, offset); + wrdm8(ds, 0x22, value); +} + +static uint8_t rdmix(CMI8738_Driver_t* ds, uint8_t offset) +{ + wrdm8(ds, 0x23, offset); + + return rddm8(ds, 0x22); +} + +static uint16_t GetDMACounter(CMI8738_Driver_t* ds) +{ + uint32_t a, b; + + do + { + a = rddm32(ds, 0x80); + b = rddm32(ds, 0x80); + } while(a != b); + + //printf("%08x %08x\n", rddm32(ds, 0x80), rddm32(ds, 0x84)); + //printf("ALT: %08x %08x\n", rddm32(ds, 0x88), rddm32(ds, 0x8C)); + + return((a - (ds->dmabuf.rm_segment << 4)) >> 2); +} + +static void UpdateReadCounter(CMI8738_Driver_t* ds) +{ + uint16_t cur_dmacounter = GetDMACounter(ds); + + ds->read_counter -= ds->prev_dmacounter; + ds->read_counter += cur_dmacounter; + + if(cur_dmacounter < ds->prev_dmacounter) + ds->read_counter += (ds->dmabuf.size << 4) >> 2; + + ds->prev_dmacounter = cur_dmacounter; +} + + +static int Pause(SexyAL_device *device, int state) +{ + CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data; + + wrdm32(ds, 0x00, (rddm32(ds, 0x00) &~ (3U << 2)) | ((bool)state << 2) | ((bool)state << 3) ); + //printf("PA: 0x%08x\n", rddm32(ds, 0x00)); + + ds->paused = state; + + return(state); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data; + + UpdateReadCounter(ds); + + // Handle underflow. + if(ds->write_counter < ds->read_counter) + ds->write_counter = ds->read_counter; + + *can_write = (device->buffering.buffer_size - (ds->write_counter - ds->read_counter)) << 2; + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data; + uint32_t pl_0, pl_1; + const uint8_t* data_d8 = (uint8_t*)data; + + do + { + uint32_t cw; + uint32_t i_len; + uint32_t writepos; + + if(!RawCanWrite(device, &cw)) // Caution: RawCanWrite() will modify ds->write_counter on underflow. + return(0); + + writepos = (ds->write_counter << 2) % (ds->dmabuf.size << 4); + i_len = std::min(cw, len); + + pl_0 = std::min(i_len, (ds->dmabuf.size << 4) - writepos); + pl_1 = i_len - pl_0; + + if(pl_0) + _dosmemputb(data_d8, pl_0, (ds->dmabuf.rm_segment << 4) + writepos); + + if(pl_1) + _dosmemputb(data_d8 + pl_0, pl_1, (ds->dmabuf.rm_segment << 4)); + + ds->write_counter += i_len >> 2; + + data_d8 += i_len; + len -= i_len; + + if(ds->paused) + Pause(device, false); + } while(len > 0); + + return(1); +} + +static int Clear(SexyAL_device *device) +{ + CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data; + const uint32_t base = ds->dmabuf.rm_segment << 4; + const uint32_t siz = ds->dmabuf.size << 4; + + Pause(device, true); + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + + UpdateReadCounter(ds); + ds->write_counter = ds->read_counter; + + return(1); +} + +static void Cleanup(CMI8738_Driver_t* ds) +{ + if(ds->dmabuf.size != 0) + { + _go32_dpmi_free_dos_memory(&ds->dmabuf); + ds->dmabuf.size = 0; + } + + if(ds->base_addr != 0) + { + wrdm32(ds, 0x00, (1U << 18)); + } +} + +static int RawClose(SexyAL_device *device) +{ + CMI8738_Driver_t *ds = (CMI8738_Driver_t *)device->private_data; + + if(ds) + { + Cleanup(ds); + free(ds); + device->private_data = NULL; + } + + return(1); +} + +pci_vd_pair SexyAL_DOS_CMI8738_PCI_IDs[] = +{ + { 0x13F6, 0x0100 }, // CMI8338A + { 0x13F6, 0x0101 }, // CMI8338B + + { 0x13F6, 0x0111 }, // CMI8738 + { 0x13F6, 0x0112 }, // CMI8738B + + { 0x10B9, 0x0111 }, // ? (from Linux kernel + + { 0 } +}; + +bool SexyALI_DOS_CMI8738_Avail(void) +{ + uint16_t bdf; + + if(!pci_bios_present()) + return(false); + + if(!pci_find_device(SexyAL_DOS_CMI8738_PCI_IDs, 0, &bdf)) + return(false); + + return(true); +} + +#define CMI8738_INIT_CLEANUP \ + if(device) free(device); \ + if(ds) { Cleanup(ds); free(ds); } \ + if(pis != -1) { __dpmi_get_and_set_virtual_interrupt_state(pis); pis = -1; } + +SexyAL_device *SexyALI_DOS_CMI8738_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device = NULL; + CMI8738_Driver_t *ds = NULL; + int pis = -1; + + if(!(device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)))) + { + CMI8738_INIT_CLEANUP + return(NULL); + } + + if(!(ds = (CMI8738_Driver_t *)calloc(1, sizeof(CMI8738_Driver_t)))) + { + CMI8738_INIT_CLEANUP + return(NULL); + } + + device->private_data = ds; + + //pis = __dpmi_get_and_disable_virtual_interrupt_state(); + + if(!pci_bios_present()) + { + fprintf(stderr, "CMI8738: PCI BIOS not detected!\n"); + CMI8738_INIT_CLEANUP + return(NULL); + } + + if(!pci_find_device(SexyAL_DOS_CMI8738_PCI_IDs, id ? atoi(id) : 0, &ds->bdf)) + { + fprintf(stderr, "CMI8738: Device not found!\n"); + CMI8738_INIT_CLEANUP + return(NULL); + } + + // Grab base address of port I/O stuff. + ds->base_addr = pci_read_config_u32(ds->bdf, 0x10) &~ 1; + //printf("BASSSSE: %08x %08x\n", ds->base_addr, pci_read_config_u32(ds->bdf, 0x10)); + + // + // + // + format->channels = 2; + format->sampformat = SEXYAL_FMT_PCMS16; + format->revbyteorder = false; + format->noninterleaved = false; + + if(!buffering->ms) + buffering->ms = 24; + + buffering->period_size = 0; //CMI_DMAFIFO_FETCHBYTESIZE >> 2; // Sorta-kinda. + + int dsfc = 0; + { + int err = 1U << 30; + int rate = 0; + + for(unsigned trydsfc = 0; trydsfc < 8; trydsfc++) + { + static const int rate_tab[8] = { 5512, 11025, 22050, 44100, 8000, 16000, 32000, 48000 }; + int tmprate; + int tmperr; + + tmprate = rate_tab[trydsfc]; + tmperr = abs(tmprate - format->rate); + + if(tmperr < err || (tmperr == err && tmprate > rate)) + { + err = tmperr; + rate = tmprate; + dsfc = trydsfc; + } + } + format->rate = rate; + } + //printf("DSCFC: %02x\n", dsfc); + + buffering->buffer_size = buffering->ms * format->rate / 1000; + + // 0x10000 = maximum DMA frame size thingy in frames. + // * 2 so we can detect wraparound reliably. + // + if((buffering->buffer_size * 2) > 0x10000) + buffering->buffer_size = 0x10000 / 2; + + buffering->latency = buffering->buffer_size; // + (CMI_DMAFIFO_BYTESIZE >> 2); + + memset(&ds->dmabuf, 0, sizeof(ds->dmabuf)); + ds->dmabuf.size = (((buffering->buffer_size * 2) << 2) + 15) / 16; + if(_go32_dpmi_allocate_dos_memory(&ds->dmabuf) != 0) + { + fprintf(stderr, "CMI8738: error allocating DMA memory."); + CMI8738_INIT_CLEANUP + return(NULL); + } + + // + // Clear DMA buffer memory. + // + { + const uint32_t base = ds->dmabuf.rm_segment << 4; + const uint32_t siz = ds->dmabuf.size << 4; + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + } + + // + // We're using CH0. + // + + wrdm32(ds, 0x00, (1U << 19) | (1U << 18)); + wrdm32(ds, 0x00, 0); + + wrdm32(ds, 0x18, (1U << 30)); + wrdm32(ds, 0x18, 0); + + wrdm32(ds, 0x1C, 0); + wrdm8(ds, 0x20, 0); + wrdm8(ds, 0x21, 0); + wrdm8(ds, 0x24, 1 << 7); + wrdm8(ds, 0x25, 3 << 4); + wrdm8(ds, 0x26, 0); + wrdm8(ds, 0x27, 0); + + + wrdm32(ds, 0x04, (dsfc << 13) | (dsfc << 10)); + wrdm32(ds, 0x08, (0x3 << 0)); + wrdm32(ds, 0x0C, 0); + wrdm32(ds, 0x10, 0); + wrdm32(ds, 0x14, 0); + wrdm32(ds, 0x18, (1U << 27) /*| (1U << 26) | (1U << 23)*/); + + + ds->prev_dmacounter = 0; + ds->read_counter = 0; + ds->write_counter = 0; + wrdm32(ds, 0x80, ds->dmabuf.rm_segment << 4); + wrdm32(ds, 0x84, (((ds->dmabuf.size << 4) >> 2) - 1) | ((((ds->dmabuf.size << 4) >> 2) - 1) << 16)); + wrdm32(ds, 0x88, ds->dmabuf.rm_segment << 4); + wrdm32(ds, 0x8C, (((ds->dmabuf.size << 4) >> 2) - 1) | ((((ds->dmabuf.size << 4) >> 2) - 1) << 16)); + + wrdm32(ds, 0x04, (dsfc << 13) | (dsfc << 10) | (1U << 4) | (1U << 1)); + wrdm32(ds, 0x00, (/*1U*/0 << 17) | (1U << 16) | (1U << 3) | (1U << 2) | (0 << 1) | (0 << 0)); + ds->paused = true; + + // + // Mixer + // + wrmix(ds, 0x00, 0x00); + wrmix(ds, 0x04, 0xFF); + wrmix(ds, 0x0A, 0x00); + wrmix(ds, 0x22, 0xFF); + wrmix(ds, 0x26, 0x00); + wrmix(ds, 0x28, 0x00); + wrmix(ds, 0x2E, 0x00); + wrmix(ds, 0x3B, 0x00); + wrmix(ds, 0xF0, 0x00); + + // + // End mixer init + // + + printf("DMABUF addr=0x%08x, size=0x%08x\n", ds->dmabuf.rm_segment << 4, ds->dmabuf.size << 4); + printf("CMI8738 init done.\n"); + + memcpy(&device->format, format, sizeof(SexyAL_format)); + memcpy(&device->buffering, buffering, sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + + if(pis != -1) + __dpmi_get_and_set_virtual_interrupt_state(pis); + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/dos_common.cpp b/Mednafen/mednafen/sexyal/drivers/dos_common.cpp new file mode 100644 index 0000000000..6c293ade8e --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/dos_common.cpp @@ -0,0 +1,221 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "dos_common.h" + +/* + PCI Notes: + + PCI BIOS routines nominally require 1024 bytes of stack space; DPMI only best-case-guarantees 512 bytes, + so we should allocate our own stack. +*/ + +enum { PCI_FUNCTION_ID = 0xB1 }; // AH + +enum // AL +{ + PCI_BIOS_PRESENT = 0x01, + FIND_PCI_DEVICE = 0x02, + FIND_PCI_CLASS_CODE = 0x03, + GENERATE_SPECIAL_CYCLE = 0x06, + + READ_CONFIG_BYTE = 0x08, + READ_CONFIG_WORD = 0x09, + READ_CONFIG_DWORD = 0x0A, + + WRITE_CONFIG_BYTE = 0x0B, + WRITE_CONFIG_WORD = 0x0C, + WRITE_CONFIG_DWORD = 0x0D, + + GET_IRQ_ROUTING_OPTIONS = 0x0E, + SET_PCI_IRQ = 0x0F +}; + +enum +{ + PCI_SUCCESSFUL = 0x00, + PCI_FUNC_NOT_SUPPORTED = 0x81, + PCI_BAD_VENDOR_ID = 0x83, + PCI_DEVICE_NOT_FOUND = 0x86, + PCI_BAD_REGISTER_NUMBER = 0x87, + PCI_SET_FAILED = 0x88, + PCI_BUFFER_TOO_SMALL = 0x89 +}; + +static void bch(unsigned fn, _go32_dpmi_registers* r) +{ + static const unsigned pci_stack_size = 2048; + _go32_dpmi_seginfo si; + int go32_ec; + + assert(pci_stack_size <= 65536); + + r->h.ah = PCI_FUNCTION_ID; + r->h.al = fn; + + memset(&si, 0, sizeof(si)); + si.size = (pci_stack_size + 15) / 16; + go32_ec = _go32_dpmi_allocate_dos_memory(&si); + if(go32_ec != 0) + { + fprintf(stderr, "DOS memory allocation failed: %d\n", go32_ec); + abort(); + } + r->x.ss = si.rm_segment; + r->x.sp = pci_stack_size; + + + go32_ec = _go32_dpmi_simulate_int(0x1A, r); + if(go32_ec != 0) + { + _go32_dpmi_free_dos_memory(&si); + fprintf(stderr, "Simulate int failed: %d\n", go32_ec); + abort(); + } + _go32_dpmi_free_dos_memory(&si); +} + +bool pci_bios_present(void) +{ + _go32_dpmi_registers r; + memset(&r, 0, sizeof(r)); + + bch(PCI_BIOS_PRESENT, &r); + if(r.d.edx == (('P' << 0) | ('C' << 8) | ('I' << 16) | (' ' << 24)) && r.h.ah == PCI_SUCCESSFUL) + return(true); + + return(false); +} + +bool pci_find_device(uint16_t vend_id, uint16_t dev_id, uint16_t index, uint16_t* bdf) +{ + _go32_dpmi_registers r; + memset(&r, 0, sizeof(r)); + + r.x.cx = dev_id; + r.x.dx = vend_id; + r.x.si = index; + + bch(FIND_PCI_DEVICE, &r); + if(r.h.ah != PCI_SUCCESSFUL) + { + if(r.h.ah == PCI_DEVICE_NOT_FOUND) + return(false); + + fprintf(stderr, "FIND_PCI_DEVICE 0x%04x:0x%04x 0x%04x failed: %u\n", vend_id, dev_id, index, r.h.ah); + abort(); + } + + *bdf = r.x.bx; + + return(true); +} + +pci_vd_pair* pci_find_device(pci_vd_pair* pci_ids, uint32_t index, uint16_t* bdf) +{ + uint32_t i = 0; + + while(pci_ids->vendor || pci_ids->device) + { + uint16_t bdf_try; + + for(uint16_t idx_try = 0; pci_find_device(pci_ids->vendor, pci_ids->device, idx_try, &bdf_try); idx_try++) + { + if(i == index) + { + *bdf = bdf_try; + return(pci_ids); + } + i++; + } + + pci_ids++; + } + + return(NULL); +} + +uint8_t pci_read_config_u8(uint16_t bdf, unsigned index) +{ + _go32_dpmi_registers r; + memset(&r, 0, sizeof(r)); + + r.x.bx = bdf; + r.x.di = index; + + bch(READ_CONFIG_BYTE, &r); + if(r.h.ah != PCI_SUCCESSFUL) + { + fprintf(stderr, "READ_CONFIG_BYTE 0x%08x 0x%08x failed: %u\n", bdf, index, r.h.ah); + abort(); + } + + return(r.h.cl); +} + +uint16_t pci_read_config_u16(uint16_t bdf, unsigned index) +{ + _go32_dpmi_registers r; + memset(&r, 0, sizeof(r)); + + r.x.bx = bdf; + r.x.di = index; + + bch(READ_CONFIG_WORD, &r); + if(r.h.ah != PCI_SUCCESSFUL) + { + fprintf(stderr, "READ_CONFIG_WORD 0x%08x 0x%08x failed: %u\n", bdf, index, r.h.ah); + abort(); + } + + return(r.x.cx); +} + +uint32_t pci_read_config_u32(uint16_t bdf, unsigned index) +{ + _go32_dpmi_registers r; + memset(&r, 0, sizeof(r)); + + r.x.bx = bdf; + r.x.di = index; + + bch(READ_CONFIG_DWORD, &r); + if(r.h.ah != PCI_SUCCESSFUL) + { + fprintf(stderr, "READ_CONFIG_DWORD 0x%08x 0x%08x failed: %u\n", bdf, index, r.h.ah); + abort(); + } + + return(r.d.ecx); +} + +void pci_write_config_u8(uint16_t bdf, unsigned index, uint8_t value) +{ + abort(); +} + +void pci_write_config_u16(uint16_t bdf, unsigned index, uint16_t value) +{ + abort(); +} + +void pci_write_config_u32(uint16_t bdf, unsigned index, uint32_t value) +{ + abort(); +} + + diff --git a/Mednafen/mednafen/sexyal/drivers/dos_common.h b/Mednafen/mednafen/sexyal/drivers/dos_common.h new file mode 100644 index 0000000000..f0e9841908 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/dos_common.h @@ -0,0 +1,55 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __SEXYAL_DRIVERS_DOS_COMMON_H +#define __SEXYAL_DRIVERS_DOS_COMMON_H + +#include "../sexyal.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; + +struct pci_vd_pair +{ + uint16_t vendor; + uint16_t device; +}; + +bool pci_bios_present(void); +bool pci_find_device(uint16_t vend_id, uint16_t dev_id, uint16_t index, uint16_t* bdf); +pci_vd_pair* pci_find_device(pci_vd_pair* pci_ids, uint32_t index, uint16_t* bdf); // Terminate list with { 0 } + +uint8_t pci_read_config_u8(uint16_t bdf, unsigned index); +uint16_t pci_read_config_u16(uint16_t bdf, unsigned index); +uint32_t pci_read_config_u32(uint16_t bdf, unsigned index); + +void pci_write_config_u8(uint16_t bdf, unsigned index, uint8_t value); +void pci_write_config_u16(uint16_t bdf, unsigned index, uint16_t value); +void pci_write_config_u32(uint16_t bdf, unsigned index, uint32_t value); + +#endif diff --git a/Mednafen/mednafen/sexyal/drivers/dsound.cpp b/Mednafen/mednafen/sexyal/drivers/dsound.cpp new file mode 100644 index 0000000000..281191a26f --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/dsound.cpp @@ -0,0 +1,395 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../sexyal.h" + +#include +#include +#include + +#undef WINNT +#define NONAMELESSUNION + +#define DIRECTSOUND_VERSION 0x0300 + +#include + +typedef struct +{ + LPDIRECTSOUND ppDS; /* DirectSound interface object. */ + LPDIRECTSOUNDBUFFER ppbuf; /* Primary buffer. */ + LPDIRECTSOUNDBUFFER ppbufsec; /* Secondary buffer. */ + LPDIRECTSOUNDBUFFER ppbufw; /* Buffer to do writes to. */ + WAVEFORMATEX wf; /* Format of the primary and secondary buffers. */ + long DSBufferSize; /* The size of the buffer that we can write to, in bytes. */ + + long BufHowMuch; /* How many bytes of buffering we sync/wait to. */ + long BufHowMuchOBM; /* How many bytes of buffering we actually do(at least temporarily). */ + + DWORD ToWritePos; /* Position which the next write to the buffer + should write to. + */ +} DSFobby; + + +static int Close(SexyAL_device *device); +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write); +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len); + +static int CheckStatus(DSFobby *tmp) +{ + DWORD status = 0; + + if(IDirectSoundBuffer_GetStatus(tmp->ppbufw, &status) != DS_OK) + return(0); + + if(status & DSBSTATUS_BUFFERLOST) + IDirectSoundBuffer_Restore(tmp->ppbufw); + + if(!(status&DSBSTATUS_PLAYING)) + { + tmp->ToWritePos = 0; + IDirectSoundBuffer_SetCurrentPosition(tmp->ppbufsec, 0); + IDirectSoundBuffer_SetFormat(tmp->ppbufw, &tmp->wf); + IDirectSoundBuffer_Play(tmp->ppbufw, 0, 0, DSBPLAY_LOOPING); + } + + return(1); +} + +static int Pause(SexyAL_device *device, int state) +{ + return(0); +} + + + +SexyAL_device *SexyALI_DSound_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *dev; + DSFobby *fobby; + + DSBUFFERDESC DSBufferDesc; + DSCAPS dscaps; + //DSBCAPS dsbcaps; + + dev = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)); + fobby = (DSFobby *)calloc(1, sizeof(DSFobby)); + + memset(&fobby->wf,0,sizeof(WAVEFORMATEX)); + fobby->wf.wFormatTag = WAVE_FORMAT_PCM; + fobby->wf.nChannels = format->channels; + fobby->wf.nSamplesPerSec = format->rate; + + if(DirectSoundCreate(0,&fobby->ppDS,0) != DS_OK) + { + free(dev); + free(fobby); + return(0); + } + + { + //HWND hWnd = GetForegroundWindow(); // Ugly. + //if(!hWnd) + //{ hWnd=GetDesktopWindow(); exit(1); } + HWND hWnd; + hWnd = GetDesktopWindow(); + IDirectSound_SetCooperativeLevel(fobby->ppDS, hWnd, DSSCL_PRIORITY); + } + memset(&dscaps,0x00,sizeof(dscaps)); + dscaps.dwSize=sizeof(dscaps); + IDirectSound_GetCaps(fobby->ppDS,&dscaps); + IDirectSound_Compact(fobby->ppDS); + + /* Create primary buffer */ + memset(&DSBufferDesc,0x00,sizeof(DSBUFFERDESC)); + DSBufferDesc.dwSize=sizeof(DSBufferDesc); + DSBufferDesc.dwFlags=DSBCAPS_PRIMARYBUFFER; + + if(IDirectSound_CreateSoundBuffer(fobby->ppDS,&DSBufferDesc,&fobby->ppbuf,0) != DS_OK) + { + IDirectSound_Release(fobby->ppDS); + free(dev); + free(fobby); + return(0); + } + + /* Set primary buffer format. */ + if(format->sampformat == SEXYAL_FMT_PCMU8) + fobby->wf.wBitsPerSample=8; + else // if(format->sampformat == SEXYAL_FMT_PCMS16) + { + fobby->wf.wBitsPerSample=16; + format->sampformat=SEXYAL_FMT_PCMS16; + } + + fobby->wf.nBlockAlign = fobby->wf.nChannels * (fobby->wf.wBitsPerSample / 8); + fobby->wf.nAvgBytesPerSec=fobby->wf.nSamplesPerSec*fobby->wf.nBlockAlign; + if(IDirectSoundBuffer_SetFormat(fobby->ppbuf,&fobby->wf) != DS_OK) + { + IDirectSound_Release(fobby->ppbuf); + IDirectSound_Release(fobby->ppDS); + free(dev); + free(fobby); + return(0); + } + + // + // Buffers yay! + // + if(!buffering->ms) + { + buffering->ms = 52; + } + else if(buffering->overhead_kludge) + { + buffering->ms += 20; + } + + buffering->buffer_size = (int64_t)format->rate * buffering->ms / 1000; + + fobby->BufHowMuch = buffering->buffer_size * format->channels * (format->sampformat >> 4); + fobby->BufHowMuchOBM = fobby->BufHowMuch + ((30 * format->rate + 999) / 1000) * format->channels * (format->sampformat >> 4); + + buffering->latency = buffering->buffer_size; // TODO: Add estimated WaveOut latency when using an emulated DirectSound device. + buffering->period_size = 0; + + /* Create secondary sound buffer */ + { + int64_t padding_extra = (((int64_t)format->rate * 200 + 999) / 1000) * format->channels * (format->sampformat >> 4); + + if(padding_extra < (fobby->BufHowMuchOBM * 2)) + padding_extra = fobby->BufHowMuchOBM * 2; + + fobby->DSBufferSize = SexyAL_rupow2(fobby->BufHowMuchOBM + padding_extra); + + //printf("Bufferbytesizenomnom: %u --- BufHowMuch: %u, BufHowMuchOBM: %u\n", fobby->DSBufferSize, fobby->BufHowMuch, fobby->BufHowMuchOBM); + + if(fobby->DSBufferSize < 65536) + fobby->DSBufferSize = 65536; + } + IDirectSoundBuffer_GetFormat(fobby->ppbuf,&fobby->wf,sizeof(WAVEFORMATEX),0); + memset(&DSBufferDesc,0x00,sizeof(DSBUFFERDESC)); + DSBufferDesc.dwSize=sizeof(DSBufferDesc); + DSBufferDesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2; + DSBufferDesc.dwFlags|=DSBCAPS_GLOBALFOCUS; + DSBufferDesc.dwBufferBytes = fobby->DSBufferSize; + DSBufferDesc.lpwfxFormat=&fobby->wf; + if(IDirectSound_CreateSoundBuffer(fobby->ppDS, &DSBufferDesc, &fobby->ppbufsec, 0) != DS_OK) + { + IDirectSound_Release(fobby->ppbuf); + IDirectSound_Release(fobby->ppDS); + free(dev); + free(fobby); + return(0); + } + + IDirectSoundBuffer_SetCurrentPosition(fobby->ppbufsec,0); + fobby->ppbufw=fobby->ppbufsec; + + memcpy(&dev->format, format, sizeof(SexyAL_format)); + + //printf("%d\n",fobby->BufHowMuch); + //fflush(stdout); + + dev->private_data=fobby; + timeBeginPeriod(1); + + dev->RawWrite = RawWrite; + dev->RawCanWrite = RawCanWrite; + dev->RawClose = Close; + dev->Pause = Pause; + + return(dev); +} + +static int RawCanWriteInternal(SexyAL_device *device, uint32_t *can_write, const bool OBM, const bool signal_nega = false) +{ + DSFobby *tmp = (DSFobby *)device->private_data; + DWORD CurWritePos, CurPlayPos = 0; + + if(!CheckStatus(tmp)) + return(0); + + CurWritePos=0; + + if(IDirectSoundBuffer_GetCurrentPosition(tmp->ppbufw,&CurPlayPos,&CurWritePos)==DS_OK) + { + //MDFN_DispMessage("%d",CurWritePos-CurPlayPos); + } + + CurWritePos = (CurPlayPos + tmp->BufHowMuchOBM) % tmp->DSBufferSize; + + /* If the current write pos is >= half the buffer size less than the to write pos, + assume DirectSound has wrapped around. + */ + if(((int32_t)tmp->ToWritePos-(int32_t)CurWritePos) >= (tmp->DSBufferSize/2)) + { + CurWritePos += tmp->DSBufferSize; + //printf("Fixit: %d,%d,%d\n",tmp->ToWritePos,CurWritePos,CurWritePos-tmp->DSBufferSize); + } + + if(tmp->ToWritePos < CurWritePos) + { + int32_t howmuch = (int32_t)CurWritePos - (int32_t)tmp->ToWritePos; + + //printf(" HM: %u\n", howmuch); + + // Handle (probably severe) buffer-underflow condition. + if(howmuch > tmp->BufHowMuchOBM) + { + //printf("Underrun: %d %d --- %d --- CWP=%d, TWP=%d\n", howmuch, tmp->BufHowMuchOBM, OBM, CurWritePos, tmp->ToWritePos); + + howmuch = tmp->BufHowMuchOBM; + tmp->ToWritePos = (CurWritePos + tmp->DSBufferSize - tmp->BufHowMuchOBM) % tmp->DSBufferSize; + } + + if(false == OBM) + howmuch -= tmp->BufHowMuchOBM - tmp->BufHowMuch; + + if(howmuch < 0) + { + if(signal_nega) + howmuch = ~0U; + else + howmuch = 0; + } + + *can_write = howmuch; + } + else + *can_write = 0; + + return(1); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + return RawCanWriteInternal(device, can_write, false); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + DSFobby *tmp = (DSFobby *)device->private_data; + + //printf("Pre: %d\n",SexyALI_DSound_RawCanWrite(device)); + //fflush(stdout); + + if(!CheckStatus(tmp)) + return(0); + + /* In this block, we write as much data as we can, then we write + the rest of it in >=1ms chunks. + */ + while(len) + { + VOID *LockPtr[2]={0,0}; + DWORD LockLen[2]={0,0}; + uint32_t curlen; + int rcw_rv; + + while((rcw_rv = RawCanWriteInternal(device, &curlen, true)) && !curlen) + { + //puts("WAITER1"); + Sleep(1); + } + + // If RawCanWrite() failed, RawWrite must fail~ + if(!rcw_rv) + return(0); + + if(curlen > len) + curlen = len; + + if(IDirectSoundBuffer_Lock(tmp->ppbufw, tmp->ToWritePos, curlen, &LockPtr[0], &LockLen[0], &LockPtr[1], &LockLen[1], 0) != DS_OK) + { + return(0); + } + + if(LockPtr[1] != 0 && LockPtr[1] != LockPtr[0]) + { + memcpy(LockPtr[0], data, LockLen[0]); + memcpy(LockPtr[1], (uint8_t *)data + LockLen[0], len - LockLen[0]); + } + else if(LockPtr[0]) + { + memcpy(LockPtr[0], data, curlen); + } + + IDirectSoundBuffer_Unlock(tmp->ppbufw, LockPtr[0], LockLen[0], LockPtr[1], LockLen[1]); + + tmp->ToWritePos = (tmp->ToWritePos + curlen) % tmp->DSBufferSize; + + len -= curlen; + data = (uint8_t *)data + curlen; + + if(len) + Sleep(1); + } // end while(len) loop + + + // Synchronize to effective buffer size. + { + uint32_t curlen; + int rcw_rv; + + while((rcw_rv = RawCanWriteInternal(device, &curlen, false, true)) && (curlen == ~0U)) + { + //puts("WAITER2"); + Sleep(1); + } + // If RawCanWrite() failed, RawWrite must fail~ + if(!rcw_rv) + return(0); + } + + + return(1); +} + + + +static int Close(SexyAL_device *device) +{ + if(device) + { + if(device->private_data) + { + DSFobby *tmp = (DSFobby *)device->private_data; + if(tmp->ppbufsec) + { + IDirectSoundBuffer_Stop(tmp->ppbufsec); + IDirectSoundBuffer_Release(tmp->ppbufsec); + } + if(tmp->ppbuf) + { + IDirectSoundBuffer_Stop(tmp->ppbuf); + IDirectSoundBuffer_Release(tmp->ppbuf); + } + if(tmp->ppDS) + { + IDirectSound_Release(tmp->ppDS); + } + free(device->private_data); + } + free(device); + timeEndPeriod(1); + return(1); + } + return(0); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/dummy.cpp b/Mednafen/mednafen/sexyal/drivers/dummy.cpp new file mode 100644 index 0000000000..679dd2cc22 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/dummy.cpp @@ -0,0 +1,196 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include +#include + + +// FIXME? +#ifdef WIN32 +#include +#include +#endif + + +typedef struct +{ + int paused; + int64_t paused_time; + + int64_t buffering_us; + + int64_t data_written_to; + +} Dummy_Driver_t; + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + Dummy_Driver_t *dstate = (Dummy_Driver_t *)device->private_data; + uint32_t ret; + int64_t curtime = SexyAL_Time64(); + + if(dstate->paused) + curtime = dstate->paused_time; + + if(curtime < dstate->data_written_to) + { + ret = 0; + //printf("%ld\n", curtime - dstate->data_written_to); + } + else + ret = (curtime - dstate->data_written_to) / 1000 * device->format.rate / 1000; + + if(ret > device->buffering.buffer_size) + { + ret = device->buffering.buffer_size; + dstate->data_written_to = curtime - dstate->buffering_us; + } + + *can_write = ret * device->format.channels * (device->format.sampformat >> 4); + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + Dummy_Driver_t *dstate = (Dummy_Driver_t *)device->private_data; + + while(len) + { + uint32_t can_write = 0; + + RawCanWrite(device, &can_write); + + if(can_write > len) + can_write = len; + + dstate->data_written_to += can_write / (device->format.channels * (device->format.sampformat >> 4)) * 1000000 / device->format.rate; + + len -= can_write; + + if(len) + { + #ifdef HAVE_USLEEP + usleep(1000); + #elif defined(WIN32) + Sleep(1); + #endif + } + } + + return(1); +} + +static int Pause(SexyAL_device *device, int state) +{ + Dummy_Driver_t *dstate = (Dummy_Driver_t *)device->private_data; + + if(state != dstate->paused) + { + dstate->paused = state; + + if(state) + { + dstate->paused_time = SexyAL_Time64(); + } + else + { + dstate->data_written_to = SexyAL_Time64() - (dstate->paused_time - dstate->data_written_to); + } + } + + return(dstate->paused); +} + +static int Clear(SexyAL_device *device) +{ + Dummy_Driver_t *dstate = (Dummy_Driver_t *)device->private_data; + int64_t curtime = SexyAL_Time64(); + + if(dstate->paused) + curtime = dstate->paused_time; + + dstate->data_written_to = curtime - dstate->buffering_us; + + return(1); +} + +static int RawClose(SexyAL_device *device) +{ + Dummy_Driver_t *dstate = (Dummy_Driver_t *)device->private_data; + + if(dstate) + { + free(dstate); + device->private_data = NULL; + } + + return(1); +} + + +#define DUMMY_INIT_CLEANUP \ + if(device) free(device); \ + if(dstate) free(dstate); + +SexyAL_device *SexyALI_Dummy_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device = NULL; + Dummy_Driver_t *dstate = NULL; + + if(!(device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)))) + { + DUMMY_INIT_CLEANUP + return(NULL); + } + + if(!(dstate = (Dummy_Driver_t *)calloc(1, sizeof(Dummy_Driver_t)))) + { + DUMMY_INIT_CLEANUP + return(NULL); + } + + device->private_data = dstate; + + if(!buffering->ms) + buffering->ms = 32; + + buffering->buffer_size = buffering->ms * format->rate / 1000; + buffering->ms = buffering->buffer_size * 1000 / format->rate; + buffering->latency = buffering->buffer_size; + + dstate->buffering_us = (int64_t)buffering->buffer_size * 1000 * 1000 / format->rate; + + memcpy(&device->format, format, sizeof(SexyAL_format)); + memcpy(&device->buffering, buffering, sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/es1370.cpp b/Mednafen/mednafen/sexyal/drivers/es1370.cpp new file mode 100644 index 0000000000..b6bc5a8c29 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/es1370.cpp @@ -0,0 +1,468 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Notes: + hard-coded 16-bit stereo support to minimize buffer position timing granularity, and to simplify stuff + + tried to use the sample count register for better granularity, but I couldn't get it to stop counting(important during init!), and it was just being a + headache overall + + noticed a bug in stereo mode that might have been related to making use of P2_PAUSE in an earlier revision of the code...or maybe the sample + count register not behaving how I thought it did was to blame for writing to the wrong position in the DMA buffer and making sound sound horrible. +*/ + +#include "dos_common.h" +#include + +static const int ES_DMAFIFO_BYTESIZE = 64; +static const int ES_DMAFIFO_FETCHBYTESIZE = 32; + +typedef struct +{ + uint16_t bdf; + uint32_t base_addr; + + _go32_dpmi_seginfo dmabuf; + _go32_dpmi_seginfo garbagebuf; // Used in preventing errant writes(reported es1370 bug). + + uint64_t read_counter; // In frames, not bytes. + uint64_t write_counter; // In frames, not bytes. + + uint16_t prev_dmacounter; + bool paused; +} ES1370_Driver_t; + +static void wrdm32(ES1370_Driver_t* ds, uint32_t offset, uint32_t value) +{ + outportl(ds->base_addr + offset, value); + //printf("wrdm32() %02x:%08x ;;; %08x\n", offset, value, inportl(ds->base_addr + offset)); +} + +static uint32_t rddm32(ES1370_Driver_t* ds, uint32_t offset) +{ + return inportl(ds->base_addr + offset); +} + +static void wrdm16(ES1370_Driver_t* ds, uint32_t offset, uint16_t value) +{ + outportw(ds->base_addr + offset, value); + //printf("wrdm16() %02x:%04x ;;; %04x\n", offset, value, inportw(ds->base_addr + offset)); +} + +static uint16_t rddm16(ES1370_Driver_t* ds, uint32_t offset) +{ + return inportw(ds->base_addr + offset); +} + +static void wresmem32(ES1370_Driver_t* ds, uint32_t offset, uint32_t value) +{ + wrdm32(ds, 0x0C, offset >> 4); + wrdm32(ds, 0x30 + (offset & 0xF), value); +} + +static uint32_t rdesmem32(ES1370_Driver_t* ds, uint32_t offset) +{ + wrdm32(ds, 0x0C, offset >> 4); + return rddm32(ds, 0x30 + (offset & 0xF)); +} + + +static void wrcodec(ES1370_Driver_t* ds, uint8 addr, uint8 value, bool dobusywait = true) +{ + while(rddm32(ds, 0x04) & (1U << 8)); + wrdm32(ds, 0x10, (addr << 8) | value); + while(rddm32(ds, 0x04) & (1U << 8)); + + if(dobusywait) + while(rddm32(ds, 0x04) & (1U << 9)); +} + + +static uint16_t GetDMACounter(ES1370_Driver_t* ds) +{ + uint32_t a, b; + unsigned counter = 0; + + do + { + a = rdesmem32(ds, 0xCC); + b = rdesmem32(ds, 0xCC); + } while(a != b); + + if(counter > 1) + printf("DMA MOO: %d\n", counter); + + return(a >> 16); +} + +static void UpdateReadCounter(ES1370_Driver_t* ds) +{ + uint16_t cur_dmacounter = GetDMACounter(ds); + + ds->read_counter -= ds->prev_dmacounter; + ds->read_counter += cur_dmacounter; + + if(cur_dmacounter < ds->prev_dmacounter) + ds->read_counter += (ds->dmabuf.size << 4) >> 2; + + ds->prev_dmacounter = cur_dmacounter; +} + + +static int Pause(SexyAL_device *device, int state) +{ + ES1370_Driver_t *ds = (ES1370_Driver_t *)device->private_data; + + wrdm32(ds, 0x00, (rddm32(ds, 0x00) &~ (1U << 5)) | ((!state) << 5) ); + + ds->paused = state; + + return(state); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + ES1370_Driver_t *ds = (ES1370_Driver_t *)device->private_data; + + UpdateReadCounter(ds); + + // Handle underflow. + if(ds->write_counter < ds->read_counter) + ds->write_counter = ds->read_counter; + + *can_write = (device->buffering.buffer_size - (ds->write_counter - ds->read_counter)) << 2; + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + ES1370_Driver_t *ds = (ES1370_Driver_t *)device->private_data; + uint32_t pl_0, pl_1; + const uint8_t* data_d8 = (uint8_t*)data; + + do + { + uint32_t cw; + uint32_t i_len; + uint32_t writepos; + + if(!RawCanWrite(device, &cw)) // Caution: RawCanWrite() will modify ds->write_counter on underflow. + return(0); + + writepos = (ds->write_counter << 2) % (ds->dmabuf.size << 4); + i_len = std::min(cw, len); + + pl_0 = std::min(i_len, (ds->dmabuf.size << 4) - writepos); + pl_1 = i_len - pl_0; + + if(pl_0) + _dosmemputb(data_d8, pl_0, (ds->dmabuf.rm_segment << 4) + writepos); + + if(pl_1) + _dosmemputb(data_d8 + pl_0, pl_1, (ds->dmabuf.rm_segment << 4)); + + ds->write_counter += i_len >> 2; + + data_d8 += i_len; + len -= i_len; + + if(ds->paused) + Pause(device, false); + } while(len > 0); + + return(1); +} + +static int Clear(SexyAL_device *device) +{ + ES1370_Driver_t *ds = (ES1370_Driver_t *)device->private_data; + const uint32_t base = ds->dmabuf.rm_segment << 4; + const uint32_t siz = ds->dmabuf.size << 4; + + Pause(device, true); + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + + UpdateReadCounter(ds); + ds->write_counter = ds->read_counter; + + return(1); +} + +static void Cleanup(ES1370_Driver_t* ds) +{ + if(ds->dmabuf.size != 0) + { + _go32_dpmi_free_dos_memory(&ds->dmabuf); + ds->dmabuf.size = 0; + } + + if(ds->garbagebuf.size != 0) + { + _go32_dpmi_free_dos_memory(&ds->garbagebuf); + ds->garbagebuf.size = 0; + } + + if(ds->base_addr != 0) + { + wrdm32(ds, 0x00, (1 << 31) | (1 << 0)); + } +} + +static int RawClose(SexyAL_device *device) +{ + ES1370_Driver_t *ds = (ES1370_Driver_t *)device->private_data; + + if(ds) + { + Cleanup(ds); + free(ds); + device->private_data = NULL; + } + + return(1); +} + +pci_vd_pair SexyAL_DOS_ES1370_PCI_IDs[] = +{ + { 0x1274, 0x5000 }, + { 0 } +}; + +bool SexyALI_DOS_ES1370_Avail(void) +{ + uint16_t bdf; + + if(!pci_bios_present()) + return(false); + + if(!pci_find_device(SexyAL_DOS_ES1370_PCI_IDs, 0, &bdf)) + return(false); + + return(true); +} + +#define ES1370_INIT_CLEANUP \ + if(device) free(device); \ + if(ds) { Cleanup(ds); free(ds); } \ + if(pis != -1) { __dpmi_get_and_set_virtual_interrupt_state(pis); pis = -1; } + +SexyAL_device *SexyALI_DOS_ES1370_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device = NULL; + ES1370_Driver_t *ds = NULL; + int pis = -1; + + if(!(device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)))) + { + ES1370_INIT_CLEANUP + return(NULL); + } + + if(!(ds = (ES1370_Driver_t *)calloc(1, sizeof(ES1370_Driver_t)))) + { + ES1370_INIT_CLEANUP + return(NULL); + } + + device->private_data = ds; + + //pis = __dpmi_get_and_disable_virtual_interrupt_state(); + + if(!pci_bios_present()) + { + fprintf(stderr, "ES1370: PCI BIOS not detected!\n"); + ES1370_INIT_CLEANUP + return(NULL); + } + + if(!pci_find_device(SexyAL_DOS_ES1370_PCI_IDs, id ? atoi(id) : 0, &ds->bdf)) + { + fprintf(stderr, "ES1370: Device not found!\n"); + ES1370_INIT_CLEANUP + return(NULL); + } + + // Grab base address of port I/O stuff. + ds->base_addr = pci_read_config_u32(ds->bdf, 0x10) &~ 1; + //printf("BASSSSE: %08x %08x\n", ds->base_addr, pci_read_config_u32(ds->bdf, 0x10)); + + // + // + // + format->channels = 2; + format->sampformat = SEXYAL_FMT_PCMS16; + format->revbyteorder = false; + format->noninterleaved = false; + + if(!buffering->ms) + buffering->ms = 24; + + buffering->period_size = ES_DMAFIFO_FETCHBYTESIZE >> 2; // Sorta-kinda. + + // + // We're going to use DAC2(codec). + // + // Interestingly, according to the AK4531 datasheet, CODEC-DAC has better stopband attenuation than the FM-DAC, + // but worse passband ripple. + // + + // From ALSA(re PCLKDIV): + // #define ES_1370_SRCLOCK 1411200 + // #define ES_1370_SRTODIV(x) (ES_1370_SRCLOCK/(x)-2) + // + // 1411200 + + int pclkdiv = (int)floor(0.5 + 1411200.0 / format->rate) - 2; + + if(pclkdiv < 27) // 48662 + pclkdiv = 27; + + if(pclkdiv > 350) // 4009 + pclkdiv = 350; + + format->rate = (unsigned)floor(0.5 + 1411200.0 / (pclkdiv + 2)); // TODO: take out round, use double for format->rate + + buffering->buffer_size = buffering->ms * format->rate / 1000; + + // 0x10000 = maximum DMA frame size thingy in longwords(=frames since we're hardcoded to stereo 16-bit) + // * 2 so we can detect wraparound reliably. + // + if((buffering->buffer_size * 2) > 0x10000) + buffering->buffer_size = 0x10000 / 2; + + buffering->latency = buffering->buffer_size + (ES_DMAFIFO_BYTESIZE >> 2) + 14; + + memset(&ds->dmabuf, 0, sizeof(ds->dmabuf)); + ds->dmabuf.size = (((buffering->buffer_size * 2) << 2) + 15) / 16; + if(_go32_dpmi_allocate_dos_memory(&ds->dmabuf) != 0) + { + fprintf(stderr, "ES1370: error allocating DMA memory."); + ES1370_INIT_CLEANUP + return(NULL); + } + + memset(&ds->garbagebuf, 0, sizeof(ds->garbagebuf)); + ds->garbagebuf.size = (4 + 15) / 16; + if(_go32_dpmi_allocate_dos_memory(&ds->dmabuf) != 0) + { + fprintf(stderr, "ES1370: error allocating garbage memory."); + ES1370_INIT_CLEANUP + return(NULL); + } + + // + // Clear DMA buffer memory. + // + { + const uint32_t base = ds->dmabuf.rm_segment << 4; + const uint32_t siz = ds->dmabuf.size << 4; + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + } + + + // 0x00: + // ADC stopped, pclkdiv, other stuff disabled, codec enabled. + wrdm32(ds, 0x00, (1 << 31) | (pclkdiv << 16) | (1 << 1) | (1 << 0)); + + // 0x20: + // P2_END_INC = 2, P2_ST_INC = 0, P2_LOOP_SEL=0(loop mode), P2_PAUSE=0, P2_INTR_EN=0, P2_DAC_SEN=0, P2 16-bit 2-channel mode + wrdm32(ds, 0x20, (2 << 19) | (0 << 16) | (0 << 14) | (0 << 12) | (0 << 9) | 0xC); + ds->paused = true; + wrdm32(ds, 0x28, 0); // DAC2 Sample count register(we don't use it anymore because it's evil, EVIL I SAY) + + ds->prev_dmacounter = 0; + ds->read_counter = 0; + ds->write_counter = 0; + + // + // + wresmem32(ds, 0xC8, ds->dmabuf.rm_segment << 4); // Buffer physical address. + wresmem32(ds, 0xCC, ((ds->dmabuf.size << 4) >> 2) - 1); // Buffer size(lower 16-bits). + + + wresmem32(ds, 0xD0, ds->garbagebuf.rm_segment << 4); + wresmem32(ds, 0xD4, 0); + wresmem32(ds, 0xD8, ds->garbagebuf.rm_segment << 4); + wresmem32(ds, 0xDC, 0); + + // 0x00: + // ADC stopped, pclkdiv, XCTL0=1(possibly needed for CT4700 cards?), DAC2 playback disabled, joystick enabled, codec enabled, SERR disabled + wrdm32(ds, 0x00, (1 << 31) | (pclkdiv << 16) | (1 << 8) | (0 << 5) | (1 << 2) | (1 << 1) | (1 << 0)); + + // + // Initialize AK4531 stuff + // + + // Reset + wrcodec(ds, 0x16, 0x02, false); // Reset, no power down. + for(unsigned i = 0; i < 1000; i++) // Needs at least 150ns? + rddm32(ds, 0x10); + wrcodec(ds, 0x16, 0x03); // No reset, no power down. + + wrcodec(ds, 0x17, 0x00); // Clock select. + + wrcodec(ds, 0x00, 0x00); // Master L, 0dB attenuation. + wrcodec(ds, 0x01, 0x00); // Master R, 0dB attenuation. + wrcodec(ds, 0x02, 0x06); // Voice L, 0dB gain. + wrcodec(ds, 0x03, 0x06); // Voice R, 0dB gain. + + // MUTE and -50dB the rest + for(unsigned i = 0x04; i < 0x0F; i++) + wrcodec(ds, i, 0x80); + + wrcodec(ds, 0x0F, 0x87); // Mono-out, mute and -28dB. + + wrcodec(ds, 0x10, 0x00); // Output mixer SW1 + wrcodec(ds, 0x11, 0x03 << 2); // Output mixer SW2(VoiceL and VoiceR enabled). + + // Disable inputs. + wrcodec(ds, 0x12, 0x00); + wrcodec(ds, 0x13, 0x00); + wrcodec(ds, 0x14, 0x00); + wrcodec(ds, 0x15, 0x00); + + // + // End AK4531 init + // + + printf("DMABUF addr=0x%08x, size=0x%08x\n", ds->dmabuf.rm_segment << 4, ds->dmabuf.size << 4); + printf("ES1370 init done.\n"); + + memcpy(&device->format, format, sizeof(SexyAL_format)); + memcpy(&device->buffering, buffering, sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + + if(pis != -1) + __dpmi_get_and_set_virtual_interrupt_state(pis); + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/es1371.cpp b/Mednafen/mednafen/sexyal/drivers/es1371.cpp new file mode 100644 index 0000000000..22db864140 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/es1371.cpp @@ -0,0 +1,537 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Hard-coded to 16-bit stereo to minimize buffer position timing granularity, and to simplify stuff. +*/ + +#include "dos_common.h" +#include + +static const int ES_DMAFIFO_BYTESIZE = 64; +static const int ES_DMAFIFO_FETCHBYTESIZE = 32; + +typedef struct +{ + uint16_t bdf; + uint32_t base_addr; + + _go32_dpmi_seginfo dmabuf; + + uint64_t read_counter; // In frames, not bytes. + uint64_t write_counter; // In frames, not bytes. + + uint16_t prev_dmacounter; + bool paused; +} ES1371_Driver_t; + +static void wrdm32(ES1371_Driver_t* ds, uint32_t offset, uint32_t value) +{ + outportl(ds->base_addr + offset, value); + //printf("wrdm32() %02x:%08x ;;; %08x\n", offset, value, inportl(ds->base_addr + offset)); +} + +static uint32_t rddm32(ES1371_Driver_t* ds, uint32_t offset) +{ + return inportl(ds->base_addr + offset); +} + +static void wrdm16(ES1371_Driver_t* ds, uint32_t offset, uint16_t value) +{ + outportw(ds->base_addr + offset, value); + //printf("wrdm16() %02x:%04x ;;; %04x\n", offset, value, inportw(ds->base_addr + offset)); +} + +static uint16_t rddm16(ES1371_Driver_t* ds, uint32_t offset) +{ + return inportw(ds->base_addr + offset); +} + +static void wresmem32(ES1371_Driver_t* ds, uint32_t offset, uint32_t value) +{ + wrdm32(ds, 0x0C, offset >> 4); + wrdm32(ds, 0x30 + (offset & 0xF), value); +} + +static uint32_t rdesmem32(ES1371_Driver_t* ds, uint32_t offset) +{ + wrdm32(ds, 0x0C, offset >> 4); + return rddm32(ds, 0x30 + (offset & 0xF)); +} + + +static void wrcodec(ES1371_Driver_t* ds, uint8 addr, uint16 value) +{ + while(rddm32(ds, 0x14) & (1U << 30)); + wrdm32(ds, 0x14, (1 << 26) | (0 << 23) | (addr << 16) | (value << 0)); + while(rddm32(ds, 0x14) & (1U << 30)); +} + +static uint16 rdcodec(ES1371_Driver_t* ds, uint8 addr) // BUG: Appears to hang with EV1938 +{ + uint32 tmp; + uint32 i = 0; + + while(rddm32(ds, 0x14) & (1U << 30)); + wrdm32(ds, 0x14, (1 << 26) | (1 << 23) | (addr << 16)); + + do + { + tmp = rddm32(ds, 0x14); + i++; + } while(i < 200 || !(tmp & (1U << 31)) || (tmp & (1U << 30))); + + return(tmp & 0xFFFF); +} + +static void wrsrc(ES1371_Driver_t* ds, uint8_t addr, uint16_t value) +{ + uint32_t tow; + + //printf("WRSRC: %02x %04x\n", addr, value); + + while(rddm32(ds, 0x10) & (1U << 23)); + tow = (addr << 25) | (1U << 24) | (rddm32(ds, 0x10) & (0xFFU << 16)) | (value << 0); + wrdm32(ds, 0x10, tow); + + for(unsigned i = 0; i < 8 || (rddm32(ds, 0x10) & (1U << 23)); i++); +} + +static uint16_t rdsrc(ES1371_Driver_t* ds, uint8_t addr) +{ + uint32_t tow; + uint32_t tmp; + + while(rddm32(ds, 0x10) & (1U << 23)); + tow = (addr << 25) | (0U << 24) | (rddm32(ds, 0x10) & (0xFFU << 16)); + wrdm32(ds, 0x10, tow); + + for(unsigned i = 0; i < 8 || ((tmp = rddm32(ds, 0x10)) & (1U << 23)); i++); + + return(tmp & 0xFFFF); +} + +static uint16_t GetDMACounter(ES1371_Driver_t* ds) +{ + uint32_t a, b; + unsigned counter = 0; + + do + { + a = rdesmem32(ds, 0xCC); + b = rdesmem32(ds, 0xCC); + } while(a != b); + + if(counter > 1) + printf("DMA MOO: %d\n", counter); + + return(a >> 16); +} + +static void UpdateReadCounter(ES1371_Driver_t* ds) +{ + uint16_t cur_dmacounter = GetDMACounter(ds); + + ds->read_counter -= ds->prev_dmacounter; + ds->read_counter += cur_dmacounter; + + if(cur_dmacounter < ds->prev_dmacounter) + ds->read_counter += (ds->dmabuf.size << 4) >> 2; + + ds->prev_dmacounter = cur_dmacounter; +} + + +static int Pause(SexyAL_device *device, int state) +{ + ES1371_Driver_t *ds = (ES1371_Driver_t *)device->private_data; + + wrdm32(ds, 0x00, (rddm32(ds, 0x00) &~ (1U << 5)) | ((!state) << 5) ); + + ds->paused = state; + + return(state); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + ES1371_Driver_t *ds = (ES1371_Driver_t *)device->private_data; + + UpdateReadCounter(ds); + + // Handle underflow. + if(ds->write_counter < ds->read_counter) + ds->write_counter = ds->read_counter; + + *can_write = (device->buffering.buffer_size - (ds->write_counter - ds->read_counter)) << 2; + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + ES1371_Driver_t *ds = (ES1371_Driver_t *)device->private_data; + uint32_t pl_0, pl_1; + const uint8_t* data_d8 = (uint8_t*)data; + + do + { + uint32_t cw; + uint32_t i_len; + uint32_t writepos; + + if(!RawCanWrite(device, &cw)) // Caution: RawCanWrite() will modify ds->write_counter on underflow. + return(0); + + //printf("%08x %08x\n", cw, rdesmem32(ds, 0xCC)); + + writepos = (ds->write_counter << 2) % (ds->dmabuf.size << 4); + i_len = std::min(cw, len); + + pl_0 = std::min(i_len, (ds->dmabuf.size << 4) - writepos); + pl_1 = i_len - pl_0; + + if(pl_0) + _dosmemputb(data_d8, pl_0, (ds->dmabuf.rm_segment << 4) + writepos); + + if(pl_1) + _dosmemputb(data_d8 + pl_0, pl_1, (ds->dmabuf.rm_segment << 4)); + + ds->write_counter += i_len >> 2; + + data_d8 += i_len; + len -= i_len; + + if(ds->paused) + Pause(device, false); + } while(len > 0); + + return(1); +} + +static int Clear(SexyAL_device *device) +{ + ES1371_Driver_t *ds = (ES1371_Driver_t *)device->private_data; + const uint32_t base = ds->dmabuf.rm_segment << 4; + const uint32_t siz = ds->dmabuf.size << 4; + + Pause(device, true); + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + + UpdateReadCounter(ds); + ds->write_counter = ds->read_counter; + + return(1); +} + +static void Cleanup(ES1371_Driver_t* ds) +{ + if(ds->dmabuf.size != 0) + { + _go32_dpmi_free_dos_memory(&ds->dmabuf); + ds->dmabuf.size = 0; + } + + if(ds->base_addr != 0) + { + wrdm32(ds, 0x00, (1 << 13)); + wrdm32(ds, 0x04, 0); + wrdm32(ds, 0x18, 0); + } +} + +static int RawClose(SexyAL_device *device) +{ + ES1371_Driver_t *ds = (ES1371_Driver_t *)device->private_data; + + if(ds) + { + Cleanup(ds); + free(ds); + device->private_data = NULL; + } + + return(1); +} + +pci_vd_pair SexyAL_DOS_ES1371_PCI_IDs[] = +{ + { 0x1274, 0x1371 }, + { 0x1274, 0x5880 }, + { 0x1102, 0x8938 }, + + { 0 } +}; + +bool SexyALI_DOS_ES1371_Avail(void) +{ + uint16_t bdf; + + if(!pci_bios_present()) + return(false); + + if(!pci_find_device(SexyAL_DOS_ES1371_PCI_IDs, 0, &bdf)) + return(false); + + return(true); +} + +#define ES1371_INIT_CLEANUP \ + if(device) free(device); \ + if(ds) { Cleanup(ds); free(ds); } \ + if(pis != -1) { __dpmi_get_and_set_virtual_interrupt_state(pis); pis = -1; } + +SexyAL_device *SexyALI_DOS_ES1371_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device = NULL; + ES1371_Driver_t *ds = NULL; + pci_vd_pair *cur_pciid = NULL; + int pis = -1; + + if(!(device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)))) + { + ES1371_INIT_CLEANUP + return(NULL); + } + + if(!(ds = (ES1371_Driver_t *)calloc(1, sizeof(ES1371_Driver_t)))) + { + ES1371_INIT_CLEANUP + return(NULL); + } + + device->private_data = ds; + + //pis = __dpmi_get_and_disable_virtual_interrupt_state(); + + if(!pci_bios_present()) + { + fprintf(stderr, "ES1371: PCI BIOS not detected!\n"); + ES1371_INIT_CLEANUP + return(NULL); + } + + if(!(cur_pciid = pci_find_device(SexyAL_DOS_ES1371_PCI_IDs, id ? atoi(id) : 0, &ds->bdf))) + { + fprintf(stderr, "ES1371: Device not found!\n"); + ES1371_INIT_CLEANUP + return(NULL); + } + + // Grab base address of port I/O stuff. + ds->base_addr = pci_read_config_u32(ds->bdf, 0x10) &~ 1; + //printf("BASSSSE: %08x %08x\n", ds->base_addr, pci_read_config_u32(ds->bdf, 0x10)); + + printf("ES1371 Revision: 0x%02x\n", pci_read_config_u8(ds->bdf, 0x08) & 0xFF); + + // + // + // + format->rate = 48000; // Hard-coded to 48KHz, at least until we can figure out how to make the resampler not be horrible at other rates. + format->channels = 2; + format->sampformat = SEXYAL_FMT_PCMS16; + format->revbyteorder = false; + format->noninterleaved = false; + + // + // We're going to use DAC2. + // + + // 0x00: + // SYNC_RES=0, ADC_STOP=1. + wrdm32(ds, 0x00, (0 << 14) | (1 << 13)); + bool support_src_bypass = ((rddm32(ds, 0x00) >> 29) == 0); + + //printf("Support SRC bypass: %d\n", (int)support_src_bypass); + + // + // AC-97 reset for CT5880(how necessary is it?) + // + wrdm32(ds, 0x04, (1 << 29)); + for(unsigned i = 0; i < 660000; i++) + rddm32(ds, 0x04); + wrdm32(ds, 0x04, (0 << 29)); + + + // 0x00: + // SYNC_RES=1, ADC_STOP=1. + wrdm32(ds, 0x00, (1 << 14) | (1 << 13)); + + + // 0x20: + // P2_END_INC = 2, P2_ST_INC = 0, P2_LOOP_SEL=0(loop mode), P2_PAUSE=0, P2_INTR_EN=0, P2_DAC_SEN=0, P2 16-bit 2-channel mode + wrdm32(ds, 0x20, (2 << 19) | (0 << 16) | (0 << 14) | (0 << 12) | (0 << 9) | 0xC); + ds->paused = true; + wrdm32(ds, 0x28, 0); // DAC2 Sample count register(we don't use it anymore because it's evil, EVIL I SAY) + + + // + // Program SRC(poorly-documented!) stuff + // + + { + uint32_t tmp_freq; + + //printf("Program SRC\n"); + + if(format->rate > 48000) + format->rate = 48000; + + if(format->rate < 4000) + format->rate = 4000; + + tmp_freq = ((format->rate << 15) + 1500) / 3000; + format->rate = (tmp_freq * 3000 + (1U << 14)) / (1U << 15); + // format->rate = (double)(tmp_freq * 3000) / (1U << 15); // TODO for future. + + // Disable SRC + wrdm32(ds, 0x10, (1 << 22) | (1 << 21) | (1 << 20) | (1 << 19)); + + for(unsigned i = 0; i < 0x80; i++) + wrsrc(ds, i, 0x0000); + + // + // Set SMF=1 when our rate is 48KHz, as it seems to partially bypass the sucky(horrible passband ripple) resampler. + // + // ...although it is possible that the suckiness is from programming the resampler improperly, as the ES1371 SRC parameters + // are very poorly documented. :/ + // + wrsrc(ds, 0x74 + 0x00, ((format->rate == 48000) ? 0x8000 : 0) | (16 << 4)); // atoi(getenv("SPOON"))); //0x8000 | (16 << 4)); // SMF, TRUNC_START, N, HSTART (wtf?) + wrsrc(ds, 0x74 + 0x01, ((tmp_freq >> 15) << 10) | (0 << 0)); // VF.I and AC.I + wrsrc(ds, 0x74 + 0x02, 0x0000); // AC.F + wrsrc(ds, 0x74 + 0x03, tmp_freq & 0x7FFF); // VF.F + + // Prevent chip lockup. + wrsrc(ds, 0x70 + 0x00, 16 << 4); + wrsrc(ds, 0x70 + 0x01, 16 << 10); + wrsrc(ds, 0x78 + 0x00, 16 << 4); + wrsrc(ds, 0x78 + 0x01, 16 << 10); + + + // P2 volume + wrsrc(ds, 0x7E, 1U << 12); + wrsrc(ds, 0x7F, 1U << 12); + + // Enable SRC + wrdm32(ds, 0x10, (0 << 22) | (1 << 21) | (0 << 20) | (1 << 19)); + } + + // + // End SRC + // + + if(!buffering->ms) + buffering->ms = 24; + + buffering->period_size = ES_DMAFIFO_FETCHBYTESIZE >> 2; // Sorta-kinda. + buffering->buffer_size = buffering->ms * format->rate / 1000; + + // 0x10000 = maximum DMA frame size thingy in longwords(=frames since we're hardcoded to stereo 16-bit) + // * 2 so we can detect wraparound reliably. + // + if((buffering->buffer_size * 2) > 0x10000) + buffering->buffer_size = 0x10000 / 2; + + // SRC latency is a bit of a guess. + // TODO: codec latency. + buffering->latency = buffering->buffer_size + (ES_DMAFIFO_BYTESIZE >> 2) + ((format->rate != 48000 || !support_src_bypass) ? 8 : 0); + + memset(&ds->dmabuf, 0, sizeof(ds->dmabuf)); + ds->dmabuf.size = (((buffering->buffer_size * 2) << 2) + 15) / 16; + if(_go32_dpmi_allocate_dos_memory(&ds->dmabuf) != 0) + { + fprintf(stderr, "ES1371: error allocating DMA memory."); + ES1371_INIT_CLEANUP + return(NULL); + } + + // + // Clear DMA buffer memory. + // + { + const uint32_t base = ds->dmabuf.rm_segment << 4; + const uint32_t siz = ds->dmabuf.size << 4; + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + } + + ds->prev_dmacounter = 0; + ds->read_counter = 0; + ds->write_counter = 0; + + // + // + wresmem32(ds, 0xC8, ds->dmabuf.rm_segment << 4); // Buffer physical address. + wresmem32(ds, 0xCC, ((ds->dmabuf.size << 4) >> 2) - 1); // Buffer size(lower 16-bits). + + // + // Legacy + // Fast joystick timing, + wrdm32(ds, 0x18, (1 << 31)); + + // 0x00: + // BYPASS_P2=1(ES1373), joyport at 0x200, SYNC_RES=0, ADC_STOP=1, joystick enabled. + wrdm32(ds, 0x00, ((format->rate == 48000) ? (1U << 30) : 0) | (0 << 24) | (0 << 14) | (1 << 13) | (1 << 2)); + + + // + // Program AC97 codec. + // + printf("Program AC97\n"); + { + //uint32_t codec_vendor = (rdcodec(ds, 0x7C) << 16) | rdcodec(ds, 0x7E); + //printf("AC97 Codec Vendor ID: 0x%08x %c%c%c%c\n", codec_vendor, (codec_vendor >> 24) & 0xFF, (codec_vendor >> 16) & 0xFF, (codec_vendor >> 8) & 0xFF, (codec_vendor >> 0) & 0xFF); + + wrcodec(ds, 0x00, 0x0001); // Reset(non-zero value required by AK4540). + wrcodec(ds, 0x0A, 0x8000); // Mute PC BEEEEEEEP to prevent a spurious tone at 48KHz from getting into the signal(at least with my Audio PCI board). + + wrcodec(ds, 0x02, 0x0000); // Master volume, 0dB attenuation + wrcodec(ds, 0x04, 0x0000); // AUX out, 0dB attenuation + + //if(cur_pciid->vendor == 0x1102 && cur_pciid->device == 0x8938) // Check for EV1938 + //{ + // printf("EV1938 Meow\n"); + // wrcodec(ds, 0x18, (0xC << 8) | 0xC); // PCM out volume. + //} + //else + { + wrcodec(ds, 0x18, (8 << 8) | 8); // PCM out volume, eeeeeeeiiight, 0dB gain. + } + } + //printf("DMABUF addr=0x%08x, size=0x%08x\n", ds->dmabuf.rm_segment << 4, ds->dmabuf.size << 4); + //printf("ES1371 init done.\n"); + + memcpy(&device->format, format, sizeof(SexyAL_format)); + memcpy(&device->buffering, buffering, sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + if(pis != -1) + __dpmi_get_and_set_virtual_interrupt_state(pis); + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/jack.cpp b/Mednafen/mednafen/sexyal/drivers/jack.cpp new file mode 100644 index 0000000000..f862ba830e --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/jack.cpp @@ -0,0 +1,462 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static int64_t Time64(void) +{ + return(jack_get_time()); +} + +typedef struct +{ + jack_port_t *output_port[2]; + jack_client_t *client; + jack_ringbuffer_t *tmpbuf[2]; + int BufferSize; + int RealBufferSize; + + int EPMaxVal; // Extra precision max value, in frames. + + // Written to in process(), read from in the main program thread. + jack_ringbuffer_t *timebuf; + + // Read/written to in the main program thread. + int64_t last_time; + int32_t write_space; + + int closed; + + uint64_t underrun_frames; + uint64_t underrun_chunks; + + bool NeedActivate; +} JACKWrap; + +static int RawClose(SexyAL_device *device); + + +static bool DoActivate(SexyAL_device *device) +{ + JACKWrap *jw = (JACKWrap *)device->private_data; + const char **ports; + + if(!jw->NeedActivate) + return(1); + + jw->NeedActivate = 0; + + jw->last_time = Time64(); + jw->write_space = jw->RealBufferSize * sizeof(float); + + if(jack_activate(jw->client)) + { + RawClose(device); + return(0); + } + + if(!(ports = jack_get_ports(jw->client, NULL, NULL, JackPortIsPhysical | JackPortIsInput))) + { + RawClose(device); + return(0); + } + jack_connect(jw->client, jack_port_name(jw->output_port[0]), ports[0]); + + if(device->format.channels == 2) + jack_connect(jw->client, jack_port_name(jw->output_port[1]), ports[1]); + else + jack_connect(jw->client, jack_port_name(jw->output_port[0]), ports[1]); + + free(ports); + + //printf("%d\n", (int)jack_port_get_total_latency(jw->client, jw->output_port[0])); + + return(1); +} + +static int process(jack_nframes_t nframes, void *arg) +{ + JACKWrap *jw = (JACKWrap *)arg; + int tch = 1; + int ch; + int canread = jack_ringbuffer_read_space(jw->tmpbuf[0]) / sizeof(jack_default_audio_sample_t); + + if(jw->tmpbuf[1]) + tch = 2; + + if(tch == 2) + { + int canread2 = jack_ringbuffer_read_space(jw->tmpbuf[1]) / sizeof(jack_default_audio_sample_t); + + if(canread2 < canread) canread = canread2; + } + + if(canread > (int)nframes) + canread = nframes; + + for(ch = 0; ch < tch; ch++) + { + jack_default_audio_sample_t *out = (jack_default_audio_sample_t *) jack_port_get_buffer(jw->output_port[ch], nframes); + + jack_ringbuffer_read(jw->tmpbuf[ch], (char *)out,canread * sizeof(jack_default_audio_sample_t)); + + if((int)nframes - canread) /* Buffer underrun. Hmm. */ + { + for(int i = 0; i < (int)nframes - canread; i++) + out[i + canread] = 0; //rand() & 1; + //printf("%d\n", nframes); + } + } + + jw->underrun_frames += nframes - canread; + + if(nframes - canread) + jw->underrun_chunks++; + + { + int64_t buf[2]; + + buf[0] = Time64(); + buf[1] = jw->RealBufferSize * sizeof(float) - (int64_t)jack_ringbuffer_read_space(jw->tmpbuf[0]); + + if(jack_ringbuffer_write(jw->timebuf, (const char *)buf, sizeof(buf)) != sizeof(buf)) + { + puts("oops"); + } + } + //printf("%d\n", nframes); + // Return success(0) + return(0); +} + +static int Get_RCW(SexyAL_device *device, uint32_t *can_write, bool want_nega = false) +{ + JACKWrap *jw = (JACKWrap *)device->private_data; + int32_t cw; + size_t can_read; + int64_t buf[2]; + int32_t extra_precision; + + DoActivate(device); + + if(jw->closed) + return(0); + + can_read = jack_ringbuffer_read_space(jw->timebuf); + + can_read &= ~(sizeof(buf) - 1); + + if(can_read) + { + if(can_read - sizeof(buf)) + jack_ringbuffer_read_advance(jw->timebuf, can_read - sizeof(buf)); + + jack_ringbuffer_read(jw->timebuf, (char *)buf, sizeof(buf)); + + jw->last_time = buf[0]; + jw->write_space = buf[1]; + + //printf("%lld %lld\n", jw->last_time, jw->write_space); + } + + cw = jw->write_space - (jw->RealBufferSize - jw->BufferSize) * sizeof(float); + + extra_precision = ((Time64() - jw->last_time) / 1000 * device->format.rate / 1000); + + if(extra_precision < 0) // Shouldn't happen...maybe if jack is forced to use gettimeofday() instead of clock_gettime() it will + { + //printf("extra_precision < 0: %d\n", extra_precision); + extra_precision = 0; + } + else if(extra_precision > jw->EPMaxVal) // May happen if jackd freezes or system is heavily loaded. + { + extra_precision = jw->EPMaxVal; + //printf("extra_precision > EPMaxVal: %d %d\n", extra_precision, jw->EPMaxVal); + } + + cw += extra_precision * sizeof(float); + + if(cw < 0) + { + if(want_nega) + cw = ~0U; + else + cw = 0; + + *can_write = cw; + + return(1); + } + else if((uint32_t)cw > jw->RealBufferSize * sizeof(float)) + cw = jw->RealBufferSize * sizeof(float); + + *can_write = cw * device->format.channels; + + return(1); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + return(Get_RCW(device, can_write, false)); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + JACKWrap *jw = (JACKWrap *)device->private_data; + uint8_t *data8 = (uint8_t*)data; + DoActivate(device); + + if(jw->closed) + return(0); + + //printf("%u %u\n", len / 2, jack_ringbuffer_write_space(jw->tmpbuf[0])); + + while(len) + { + uint32_t sublen = len / device->format.channels; + + for(unsigned int ch = 0; ch < device->format.channels; ch++) + { + // Avoid causing a float misalignment issue... + size_t ws = jack_ringbuffer_write_space(jw->tmpbuf[ch]) / sizeof(float) * sizeof(float); + + if(sublen > ws) + { + sublen = ws; + //printf("SPOOOON: %u %u\n", ch, sublen); + } + } + + for(unsigned ch = 0; ch < device->format.channels; ch++) + { + if(jack_ringbuffer_write(jw->tmpbuf[ch], (const char *)data8 + (ch * sublen), sublen) != sublen) + { + puts("JACK ringbuffer write failure?"); + return(0); + } + } + + jw->write_space -= sublen; + data8 += sublen; + len -= sublen * device->format.channels; + + if(len) + usleep(1000); + } // end while(len) + + uint32_t cw_tmp; + + while(Get_RCW(device, &cw_tmp, true) && cw_tmp == ~0U) + { + usleep(1000); + } + + return(1); +} + +// TODO: How should be implement this without causing race conditions? +static int Clear(SexyAL_device *device) +{ + //JACKWrap *jw = (JACKWrap *)device->private_data; + + DoActivate(device); + + return(1); +} + +static int RawClose(SexyAL_device *device) +{ + if(device) + { + if(device->private_data) + { + JACKWrap *jw = (JACKWrap *)device->private_data; + + if(jw->client) + jack_deactivate(jw->client); + + if(jw->tmpbuf[0]) + { + jack_ringbuffer_free(jw->tmpbuf[0]); + } + + if(jw->tmpbuf[1]) + { + jack_ringbuffer_free(jw->tmpbuf[1]); + } + + if(jw->timebuf) + jack_ringbuffer_free(jw->timebuf); + + if(jw->client && !jw->closed) + jack_client_close(jw->client); + + printf("\n%llu underrun frames in %llu chunks.\n", (unsigned long long)jw->underrun_frames, (unsigned long long)jw->underrun_chunks); + free(device->private_data); + } + free(device); + return(1); + } + return(0); +} + +static void DeadSound(void *arg) +{ + JACKWrap *jw = (JACKWrap *)arg; + + jw->closed = 1; + jw->NeedActivate = 0; + + puts("AGH! Sound server hates us! Let's go on a rampage."); +} + +// TODO +static int Pause(SexyAL_device *device, int state) +{ + //JACKWrap *jw = (JACKWrap *)device->private_data; + + DoActivate(device); + + return(0); +} + +SexyAL_device *SexyALI_JACK_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device; + JACKWrap *jw; + + jw = (JACKWrap *)calloc(1, sizeof(JACKWrap)); + + device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)); + + device->private_data = jw; + + if(!(jw->client = jack_client_open("Mednafen", (jack_options_t)(JackServerName | JackNoStartServer), NULL, id ? id : "default"))) + { + RawClose(device); + return(0); + } + + jack_set_process_callback(jw->client, process, jw); + jack_on_shutdown(jw->client, DeadSound, jw); + + format->rate = jack_get_sample_rate(jw->client); + format->sampformat = SEXYAL_FMT_PCMFLOAT; + + if(!(jw->output_port[0] = jack_port_register(jw->client, "output", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))) + { + RawClose(device); + return(0); + } + + format->noninterleaved = false; + if(format->channels == 2) + { + format->noninterleaved = true; + if(!(jw->output_port[1] = jack_port_register(jw->client, "output-right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0))) + { + RawClose(device); + return(0); + } + } + + + if(!buffering->ms) + buffering->ms = 40; + + if(buffering->ms > 1000) + buffering->ms = 1000; + + // about 50ms extra precision, maximum. + jw->EPMaxVal = (50 * format->rate + 999) / 1000; + + jw->BufferSize = format->rate * buffering->ms / 1000; + + jw->RealBufferSize = SexyAL_rupow2(jw->BufferSize + jw->EPMaxVal + ((30 * format->rate + 999) / 1000)); + + buffering->buffer_size = jw->BufferSize; + + if(!(jw->tmpbuf[0] = jack_ringbuffer_create(jw->RealBufferSize * sizeof(jack_default_audio_sample_t)))) + { + RawClose(device); + return(0); + } + + if(format->channels == 2) + { + if(!(jw->tmpbuf[1] = jack_ringbuffer_create(jw->RealBufferSize * sizeof(jack_default_audio_sample_t)))) + { + RawClose(device); + return(0); + } + //format->split_stereo = 1; + } + //else + //format->split_stereo = 0; + + // Overkill size, to be on the safe side. :3 + if(!(jw->timebuf = jack_ringbuffer_create(sizeof(int64_t) * 8192))) + { + RawClose(device); + return(0); + } + + jw->NeedActivate = 1; + + buffering->latency = jw->BufferSize; // FIXME, jw->BufferSize + jack_port_get_latency_range() ??? + buffering->period_size = 0; + + memcpy(&device->format,format,sizeof(SexyAL_format)); + memcpy(&device->buffering,buffering,sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + +#if 0 + // + DoActivate(device); + // + { + jack_latency_range_t rn; + + memset(&rn, 0, sizeof(rn)); + jack_port_get_latency_range(jw->output_port[0], JackPlaybackLatency, &rn); + + //printf("%d\n", (int)jack_port_get_total_latency(jw->client, jw->output_port[0])); + buffering->latency = jw->BufferSize + rn.max; + } +#endif + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/oss.cpp b/Mednafen/mednafen/sexyal/drivers/oss.cpp new file mode 100644 index 0000000000..3f47e66ef3 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/oss.cpp @@ -0,0 +1,414 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +typedef struct +{ + int fd; + bool alsa_workaround; // TRUE if we're using any OSS older than version 4, which includes ALSA(which conforms to 3.x). + // Applying the workaround on non-ALSA where it's not needed will not hurt too much, it'll + // just make the stuttering due to buffer underruns a little more severe. + // (The workaround is to fix a bug which affects, at least, ALSA 1.0.20 when used with a CS46xx card) + uint8_t *dummy_data; + uint32_t dummy_data_len; +} OSS_Wrap; + + +SexyAL_enumdevice *SexyALI_OSS_EnumerateDevices(void) +{ + SexyAL_enumdevice *ret,*tmp,*last; + struct stat buf; + char fn[64]; + char numstring[64]; + unsigned int n; + + n = 0; + + ret = tmp = last = 0; + + for(;;) + { + snprintf(numstring, 64, "%d", n); + snprintf(fn, 64, "/dev/dsp%s", numstring); + + if(stat(fn,&buf)!=0) break; + + tmp = (SexyAL_enumdevice *)calloc(1, sizeof(SexyAL_enumdevice)); + + tmp->name = strdup(fn); + tmp->id = strdup(numstring); + + if(!ret) ret = tmp; + if(last) last->next = tmp; + + last = tmp; + n++; + } + return(ret); +} + +unsigned int Log2(unsigned int value) +{ + int x=0; + + value>>=1; + while(value) + { + value>>=1; + x++; + } + return(x?x:1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + OSS_Wrap *ossw = (OSS_Wrap *)device->private_data; + const uint8_t *datau8 = (const uint8_t *)data; + + while(len) + { + ssize_t bytes = write(ossw->fd, datau8, len); + + if(bytes < 0) + { + if(errno == EINTR) + continue; + + fprintf(stderr, "OSS: %d, %m\n", errno); + return(0); + } + else if(bytes > len) + { + fprintf(stderr, "OSS: written bytes > len ???\n"); + bytes = len; + } + len -= bytes; + datau8 += bytes; + } + + return(1); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + OSS_Wrap *ossw = (OSS_Wrap *)device->private_data; + struct audio_buf_info ai; + + TryAgain: + + if(!ioctl(ossw->fd, SNDCTL_DSP_GETOSPACE, &ai)) + { + if(ai.bytes < 0) + ai.bytes = 0; // ALSA is weird + + if(ossw->alsa_workaround && (unsigned int)ai.bytes >= (device->buffering.buffer_size * (device->format.sampformat >> 4) * device->format.channels)) + { + //puts("Underflow fix"); + //fprintf(stderr, "%d\n",ai.bytes); + if(!RawWrite(device, ossw->dummy_data, ossw->dummy_data_len)) + return(0); + goto TryAgain; + } + + *can_write = ai.bytes; + + return(1); + } + else + { + puts("Error"); + return(0); + } + return(1); +} + +static int Pause(SexyAL_device *device, int state) +{ + return(0); +} + +static int Clear(SexyAL_device *device) +{ + OSS_Wrap *ossw = (OSS_Wrap *)device->private_data; + + ioctl(ossw->fd, SNDCTL_DSP_RESET, 0); + return(1); +} + +static int RawClose(SexyAL_device *device) +{ + if(device) + { + if(device->private_data) + { + OSS_Wrap *ossw = (OSS_Wrap *)device->private_data; + + if(ossw->fd != -1) + { + close(ossw->fd); + ossw->fd = -1; + } + free(device->private_data); + } + free(device); + return(1); + } + return(0); +} + +#define OSS_INIT_ERROR_CLEANUP \ + if(fd != -1) \ + { \ + close(fd); \ + fd = -1; \ + } \ + if(ossw) \ + { \ + free(ossw); \ + } \ + if(device) \ + { \ + free(device); \ + device = NULL; \ + } + +SexyAL_device *SexyALI_OSS_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device = NULL; + int fd = -1; + unsigned int temp, try_format; + OSS_Wrap *ossw = NULL; + int version = 0; + bool alsa_workaround = FALSE; + int desired_pt; // Desired period time, in MICROseconds. + int desired_buffertime; // Desired buffer time, in milliseconds + + desired_pt = buffering->period_us ? buffering->period_us : 1250; // 1.25 milliseconds + desired_buffertime = buffering->ms ? buffering->ms : 32; // 32 milliseconds + + if((fd = open(id ? id : "/dev/dsp", O_WRONLY)) == -1) + { + puts(strerror(errno)); + return(0); + } + + if(ioctl(fd, OSS_GETVERSION, &version) == -1 || version < 0x040000) + { + puts("\nALSA SNDCTL_DSP_GETOSPACE internal-state-corruption bug workaround mode used."); + alsa_workaround = TRUE; + } + + // Try to force at least 16-bit output and 2 channels so we can get lower period sizes(assuming the low-level device driver + // expresses minimum period size in bytes). + if(format->channels < 2) + format->channels = 2; + if(format->sampformat == SEXYAL_FMT_PCMU8 || format->sampformat == SEXYAL_FMT_PCMS8) + format->sampformat = SEXYAL_FMT_PCMS16; + + /* Set sample format. */ + /* TODO: Handle devices with byte order different from native byte order. */ + /* TODO: Fix fragment size calculation to work well with lower/higher playback rates, + as reported by OSS. + */ + + if(format->sampformat == SEXYAL_FMT_PCMU8) + try_format = AFMT_U8; + else if(format->sampformat == SEXYAL_FMT_PCMS8) + try_format = AFMT_S8; + else if(format->sampformat == SEXYAL_FMT_PCMU16) + try_format = AFMT_U16_LE; + else + try_format = AFMT_S16_NE; + + format->revbyteorder = 0; + + temp = try_format; + if(ioctl(fd, SNDCTL_DSP_SETFMT, &temp) == -1 && temp == try_format) + { + puts(strerror(errno)); + close(fd); + return(0); + } + + switch(temp) + { + case AFMT_U8: format->sampformat = SEXYAL_FMT_PCMU8; + break; + + case AFMT_S8: format->sampformat = SEXYAL_FMT_PCMS8; + break; + + case AFMT_U16_LE: + #ifndef LSB_FIRST + format->revbyteorder=1; + #endif + format->sampformat = SEXYAL_FMT_PCMU16; + break; + + case AFMT_U16_BE: + #ifdef LSB_FIRST + format->revbyteorder=1; + #endif + format->sampformat = SEXYAL_FMT_PCMU16; + break; + + case AFMT_S16_LE: + #ifndef LSB_FIRST + format->revbyteorder=1; + #endif + format->sampformat = SEXYAL_FMT_PCMS16; + break; + + case AFMT_S16_BE: + #ifdef LSB_FIRST + format->revbyteorder=1; + #endif + format->sampformat = SEXYAL_FMT_PCMS16; + break; + + default: close(fd); + return(0); + } + + /* Set number of channels. */ + temp=format->channels; + if(ioctl(fd,SNDCTL_DSP_CHANNELS,&temp)==-1) + { + close(fd); + return(0); + } + + if(temp < 1 || temp > 2) + { + close(fd); + return(0); + } + + format->channels = temp; + + /* Set frame rate. */ + temp = format->rate; + if(ioctl(fd,SNDCTL_DSP_SPEED,&temp)==-1) + { + close(fd); + return(0); + } + format->rate = temp; + + device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)); + memcpy(&device->format,format,sizeof(SexyAL_format)); + memcpy(&device->buffering,buffering,sizeof(SexyAL_buffering)); + + int fragcount = 16; + int fragsize = SexyAL_rnearestpow2((int64_t)desired_pt * format->rate / (1000 * 1000), FALSE); //128; //256; + + // Going lower than this is unlikely to work, and since we use this value to calculate the number of fragments, we'll get + // a buffer far larger than we wanted, unless the OSS implementation is nice and adjusts the fragment count when it can't get set fragment size + // specified. + if(fragsize < 16) + fragsize = 16; + + if(fragsize > 512) + fragsize = 512; + + { + int64_t tc; + + /* 2*, >>1, |1 for crude rounding(it will always round 0.5 up, so it is a bit biased). */ + + tc=2 * desired_buffertime * format->rate / 1000 / fragsize; + fragcount=(tc>>1)+(tc&1); //1<sampformat>>4)*format->channels); + + temp|=fragcount<<16; + + ioctl(fd,SNDCTL_DSP_SETFRAGMENT,&temp); + + { + audio_buf_info info; + ioctl(fd,SNDCTL_DSP_GETOSPACE,&info); + + fragsize=info.fragsize/(format->sampformat>>4)/format->channels; + fragcount=info.fragments; + + buffering->buffer_size=fragsize * fragcount; + buffering->period_size = fragsize; + } + + if(!(ossw = (OSS_Wrap *)calloc(1, sizeof(OSS_Wrap)))) + { + OSS_INIT_ERROR_CLEANUP + return(NULL); + } + + ossw->dummy_data_len = (format->sampformat >> 4) * format->channels * (format->rate / 128); + if(!(ossw->dummy_data = (uint8_t *)calloc(1, ossw->dummy_data_len))) + { + OSS_INIT_ERROR_CLEANUP + return(NULL); + } + + if(format->sampformat == SEXYAL_FMT_PCMU8 || format->sampformat == SEXYAL_FMT_PCMU16) + memset(ossw->dummy_data, 0x80, ossw->dummy_data_len); + else + memset(ossw->dummy_data, 0, ossw->dummy_data_len); + + ossw->fd = fd; + + ossw->alsa_workaround = alsa_workaround; + + device->private_data = ossw; + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + + buffering->latency = buffering->buffer_size; + + memcpy(&device->buffering,buffering,sizeof(SexyAL_buffering)); + memcpy(&device->format,format,sizeof(SexyAL_format)); + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/sb.cpp b/Mednafen/mednafen/sexyal/drivers/sb.cpp new file mode 100644 index 0000000000..2d897bb00f --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/sb.cpp @@ -0,0 +1,1218 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + DSP versus output capabilities(from Creative's manual): + + 4.xx: 16-bit, mono and stereo + 5000 to 44100 Hz + + 3.xx: 8-bit, mono and stereo + mono, 4000 to 23000 Hz + mono(HS), 23000 to 44100 Hz + stereo(HS), 11025 and 22050 Hz + + 2.01: 8-bit, mono + mono, 4000 to 23000 Hz + mono(HS), 23000 to 44100 Hz + + 1.xx-2.00: 8-bit, mono + mono, 4000 to 23000 Hz +*/ + +#include "dos_common.h" +#include + +/* + Interrupts *MUST* be disabled when calling the dma_*() and irq_*() functions. +*/ + +static const struct +{ + uint8 addr; + uint8 count; + uint8 page; +} dma_ch_ports[8] = +{ + { 0x00, 0x01, 0x87 }, // 0 + { 0x02, 0x03, 0x83 }, // 1 + { 0x04, 0x05, 0x81 }, // 2 + { 0x06, 0x07, 0x82 }, // 3 + + { 0xC0, 0xC2, 0x8F }, // 4 + { 0xC4, 0xC6, 0x8B }, // 5 + { 0xC8, 0xCA, 0x89 }, // 6 + { 0xCC, 0xCE, 0x8A }, // 7 +}; + +static const struct +{ + uint8 stat_cmd; + uint8 req; + uint8 mask_bit; + uint8 mode; + uint8 clear_ff; + uint8 master_disable; + uint8 clear_mask; + uint8 write_all_mask; +} dma_con_ports[2] = +{ + { 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }, + { 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE }, +}; + +static void dma_wr_base_addr(uint8_t ch, uint16_t value) +{ + outportb(dma_con_ports[ch >> 2].clear_ff, 0); + outportb(dma_ch_ports[ch].addr, value >> 0); + outportb(dma_ch_ports[ch].addr, value >> 8); +} + +static void dma_wr_count(uint8_t ch, uint16_t value) +{ + outportb(dma_con_ports[ch >> 2].clear_ff, 0); + outportb(dma_ch_ports[ch].count, value >> 0); + outportb(dma_ch_ports[ch].count, value >> 8); +} + +static uint16_t dma_rd_cur_addr(uint8_t ch) +{ + uint16_t a; + uint16_t b; + + outportb(dma_con_ports[ch >> 2].clear_ff, 0); + + do + { + a = inportb(dma_ch_ports[ch].addr); + a |= inportb(dma_ch_ports[ch].addr) << 8; + b = inportb(dma_ch_ports[ch].addr); + b |= inportb(dma_ch_ports[ch].addr) << 8; + } while((uint16_t)(b - a) > 8); //a != b); + + return(b); +} + +static void dma_wr_page(uint8_t ch, uint8_t value) +{ + outportb(dma_ch_ports[ch].page, value); +} + + +#define DMA_MODE_TYPE_DEMAND (0 << 6) +#define DMA_MODE_TYPE_SINGLE (1 << 6) +#define DMA_MODE_TYPE_BLOCK (2 << 6) +#define DMA_MODE_TYPE_CASCADE (3 << 6) + +#define DMA_MODE_AIS_INCREMENT (0 << 5) +#define DMA_MODE_AIS_DECREMENT (1 << 5) + +#define DMA_MODE_AUTOINIT_OFF (0 << 4) +#define DMA_MODE_AUTOINIT_ON (1 << 4) + +#define DMA_MODE_TT_VERIFY (0 << 2) +#define DMA_MODE_TT_WRITE (1 << 2) +#define DMA_MODE_TT_READ (2 << 2) +#define DMA_MODE_TT_KABOOM (3 << 2) + +static void dma_ch_set_buffer(uint8_t ch, uint32_t addr, uint32_t size) +{ + const uint8_t page = (addr >> 16) & ((ch >= 4) ? 0xFE : 0xFF); // Mask out the lower bit with 16-bit DMA in case any motherboards use it for A24. + + assert(addr < (1U << 24)); + + //printf("DMA Set Buffer: ch=%d phys_addr=0x%08x byte_size=0x%08x\n", ch, addr, size); + + if(ch >= 4) + { + assert(!(addr & 1)); + assert(!(size & 1)); + + addr >>= 1; + size >>= 1; + + assert(((addr & 0xFFFF) + size) <= 0x10000); + } + + dma_wr_base_addr(ch, addr & 0xFFFF); + dma_wr_page(ch, page); + dma_wr_count(ch, size - 1); +} + +static void dma_ch_set_mode(uint8_t ch, uint8_t value) +{ + //printf("DMA Set Mode: %d 0x%02x\n", ch, value); + + outportb(dma_con_ports[ch >> 2].mode, (ch & 0x3) | (value &~ 0x3)); +} + +static void dma_ch_on(uint8_t ch) +{ + outportb(dma_con_ports[ch >> 2].mask_bit, (ch & 0x3) | (0 << 2)); +} + +static void dma_ch_off(uint8_t ch) +{ + outportb(dma_con_ports[ch >> 2].mask_bit, (ch & 0x3) | (1 << 2)); +} + +static bool irq_fonof(uint8_t irq, bool on) +{ + const uint8_t pnum = ((irq >= 8) ? 0xA1 : 0x21); + const uint8_t old_status = inportb(pnum); + uint8_t tmp = old_status; + + tmp &= ~(1 << (irq & 0x7)); + tmp |= (!on) << (irq & 0x7); + + outportb(pnum, tmp); + + return !((old_status >> (irq & 0x7)) & 1); +} + +static void irq_eoi(uint8_t irq) // Specific EOI; don't change it to non-specific! +{ + if(irq >= 8) + { + outportb(0xA0, 0x60 + (irq & 0x7)); + outportb(0x20, 0x60 + 2); + } + else + { + outportb(0x20, 0x60 + (irq & 0x7)); + } +} + +struct SB_Driver_t +{ + uint16_t dsp_version; // 0x100, 0x200, 0x201, etc. + + unsigned base; // I/O base, typically 0x220 or 0x240 + unsigned dma; + unsigned irq; + + bool hs_mode; + + int save_istate; + int save_pic_ion; + uint8_t save_mixer[0x40]; + bool save_mixer_valid; + + _go32_dpmi_seginfo dmabuf; + uint32 dmabuf_eff_paddr; + uint32 dmabuf_eff_size; + + uint64_t read_counter; // In frames, not bytes. + uint64_t write_counter; // In frames, not bytes. + + uint16_t prev_dmacounter; + bool paused; +}; + +static bool dsp_reset(SB_Driver_t* ds) +{ + outportb(ds->base + 0x6, 1); + + for(unsigned i = 0; i < 50 * 10; i++) + inportb(ds->base + 0xE); + + outportb(ds->base + 0x6, 0); + + for(unsigned i = 0; i < 65536; i++) + inportb(ds->base + 0xE); + + if(!(inportb(ds->base + 0xE) & 0x80) || (inportb(ds->base + 0xA) != 0xAA)) + return(false); + + return(true); +} + +static void dsp_write(SB_Driver_t* ds, uint8_t value) +{ + while(inportb(ds->base + 0xC) & 0x80); + + outportb(ds->base + 0xC, value); + + //printf("DSP Write: 0x%02x\n", value); +} + +static uint8_t dsp_read(SB_Driver_t* ds) +{ + while(!(inportb(ds->base + 0xE) & 0x80)); + + return inportb(ds->base + 0xA); +} + +static void dsp_command(SB_Driver_t* ds, uint8_t cmd) +{ + dsp_write(ds, cmd); +} + +static void dsp_command(SB_Driver_t* ds, uint8_t cmd, uint8_t arg0) +{ + dsp_write(ds, cmd); + dsp_write(ds, arg0); +} + +static void dsp_command(SB_Driver_t* ds, uint8_t cmd, uint8_t arg0, uint8_t arg1) +{ + dsp_write(ds, cmd); + dsp_write(ds, arg0); + dsp_write(ds, arg1); +} + +static void dsp_command(SB_Driver_t* ds, uint8_t cmd, uint8_t arg0, uint8_t arg1, uint8_t arg2) +{ + dsp_write(ds, cmd); + dsp_write(ds, arg0); + dsp_write(ds, arg1); + dsp_write(ds, arg2); +} + +static void dsp_command(SB_Driver_t* ds, uint8_t cmd, uint8_t arg0, uint8_t arg1, uint8_t arg2, uint8_t arg3) +{ + dsp_write(ds, cmd); + dsp_write(ds, arg0); + dsp_write(ds, arg1); + dsp_write(ds, arg2); + dsp_write(ds, arg3); +} + +static void mixer_write(SB_Driver_t* ds, uint8_t addr, uint8_t value) +{ + outportb(ds->base + 0x4, addr); + outportb(ds->base + 0x5, value); +} + +static uint8_t mixer_read(SB_Driver_t* ds, uint8_t addr) +{ + outportb(ds->base + 0x4, addr); + return inportb(ds->base + 0x5); +} + +static uint16_t GetDMACounter(SexyAL_device* device) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + const uint32_t lb = (ds->dmabuf_eff_paddr >> ((ds->dma >= 4) ? 1 : 0)) & 0xFFFF; + const uint32_t ls = (ds->dmabuf_eff_size >> ((ds->dma >= 4) ? 1 : 0)); + uint32_t tmp; + int pis; + + // For EMU10K DOS SB emulator, so it doesn't stop playback and cause the sound code to freeze up. + inportb(ds->base + 0xE); + inportb(ds->base + 0xF); + + + pis = __dpmi_get_and_disable_virtual_interrupt_state(); + tmp = dma_rd_cur_addr(ds->dma); + __dpmi_get_and_set_virtual_interrupt_state(pis); + +#if 0 + printf("TMP: 0x%04x 0x%08x\n", tmp, ds->dmabuf_eff_paddr); +#endif + + if(tmp < lb) + tmp = lb; + + tmp -= lb; + tmp %= ls; + tmp /= device->format.channels * ((ds->dma >= 4) ? 1 : (device->format.sampformat >> 4)); + + return(tmp); +} + +static void UpdateReadCounter(SexyAL_device* device) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + const unsigned ftob = (device->format.sampformat >> 4) * device->format.channels; + uint16_t cur_dmacounter = GetDMACounter(device); + +#if 0 + { + static uint16_t prev = 0; + + if(prev != cur_dmacounter) + { + printf("0x%04x\n", cur_dmacounter); + prev = cur_dmacounter; + } + } +#endif + + ds->read_counter -= ds->prev_dmacounter; + ds->read_counter += cur_dmacounter; + + if(cur_dmacounter < ds->prev_dmacounter) + ds->read_counter += ds->dmabuf_eff_size / ftob; + + ds->prev_dmacounter = cur_dmacounter; +} + + +static int Pause(SexyAL_device *device, int state) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + + // TODO; should we just mask off the DMA channel temporarily? or will that break things horribly? + + ds->paused = state; + + return(state); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + const unsigned ftob = (device->format.sampformat >> 4) * device->format.channels; + + UpdateReadCounter(device); + + // Handle underflow. + if(ds->write_counter < ds->read_counter) + ds->write_counter = ds->read_counter; + + *can_write = (device->buffering.buffer_size - (ds->write_counter - ds->read_counter)) * ftob; + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + uint32_t pl_0, pl_1; + const uint8_t* data_d8 = (uint8_t*)data; + const unsigned ftob = (device->format.sampformat >> 4) * device->format.channels; + + do + { + uint32_t cw; + uint32_t i_len; + uint32_t writepos; + + if(!RawCanWrite(device, &cw)) // Caution: RawCanWrite() will modify ds->write_counter on underflow. + return(0); + + writepos = (ds->write_counter * ftob) % ds->dmabuf_eff_size; + i_len = std::min(cw, len); + + pl_0 = std::min(i_len, ds->dmabuf_eff_size - writepos); + pl_1 = i_len - pl_0; + + if(pl_0) + _dosmemputb(data_d8, pl_0, ds->dmabuf_eff_paddr + writepos); + + if(pl_1) + _dosmemputb(data_d8 + pl_0, pl_1, ds->dmabuf_eff_paddr); + + ds->write_counter += i_len / ftob; + + data_d8 += i_len; + len -= i_len; + + if(ds->paused) + Pause(device, false); + } while(len > 0); + + return(1); +} + +static int Clear(SexyAL_device *device) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + const uint32_t base = ds->dmabuf_eff_paddr; + const uint32_t siz = ds->dmabuf_eff_size; + + Pause(device, true); + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, 0); + + UpdateReadCounter(device); + ds->write_counter = ds->read_counter; + + return(1); +} + +static void Cleanup(SB_Driver_t* ds) +{ + int tmp_istate = -1; + + if(ds->dsp_version > 0) + { + if(ds->hs_mode) + dsp_reset(ds); + + dsp_reset(ds); + + dsp_reset(ds); // Make sure the last DSP reset command is done(IE we don't want the hardware to trigger any spurious IRQs that will be left pending) + + // Acknowledge any 16-bit SB DSP interrupts(in case a DSP reset didn't ack them). + inportb(ds->base + 0xF); + + if(ds->save_mixer_valid) + { + for(int i = 0x01; i < 0x40; i++) + { + // Only necessary if we count down instead of up with i. + //if((ds->dsp_version >= 0x400) && i == 0x04 || i == 0x0A || i == 0x22 || i == 0x26 || i == 0x28 || i == 0x2E) + // continue; + mixer_write(ds, i, ds->save_mixer[i]); + } + ds->save_mixer_valid = false; + } + + ds->dsp_version = 0; + } + + tmp_istate = __dpmi_get_and_disable_virtual_interrupt_state(); + + if(ds->dma != ~0U) + { + dma_ch_off(ds->dma); + ds->dma = ~0U; + } + + if(ds->irq != ~0U) + { + // Clear any pending SB IRQ so we don't cause the next program to use the SB to spaz out. (might not be necessary since we have the IRQ masked away?) + irq_eoi(ds->irq); + + if(ds->save_pic_ion != -1) + { + irq_fonof(ds->irq, ds->save_pic_ion); + ds->save_pic_ion = -1; + } + + ds->irq = ~0U; + } + + if(ds->dmabuf.size != 0) + { + _go32_dpmi_free_dos_memory(&ds->dmabuf); + ds->dmabuf.size = 0; + } + + __dpmi_get_and_set_virtual_interrupt_state((ds->save_istate != -1) ? ds->save_istate : tmp_istate); + ds->save_istate = -1; +} + +static int RawClose(SexyAL_device *device) +{ + SB_Driver_t *ds = (SB_Driver_t *)device->private_data; + + if(ds) + { + Cleanup(ds); + free(ds); + device->private_data = NULL; + } + + return(1); +} + + +// AKA the "I have no idea what it's doing but at least it's doing something and it's small" hash. +static uint64_t DunnoHash(uint64_t ht, uint8_t v) +{ + ht ^= 104707; + for(unsigned i = 0; i < 8; i++) + { + ht = (((ht * 33) + v) ^ (ht % ((v ^ (ht >> 19)) + 1))) + ((ht >> 1) * (v * 123456789)); + v = (v >> 3) | (v << 5); + } + ht ^= 104707; + return(ht); +} + +/* + Aztech 2320 reaaally didn't like it when we wrote to regs at 0x40-0x7F. + + Fingerprinting is currently only used for DSP version >= 4.13. +*/ +static uint64_t SaveFPAndResetMixer(SB_Driver_t* ds) +{ + uint64_t fip = 0; + uint8_t all_savemixer[0x100]; + + // + // Save mixer params. + // + for(unsigned i = 0; i < 0x100; i++) + { + uint8_t tmp = mixer_read(ds, i); + + if(i < 0x40) + ds->save_mixer[i] = mixer_read(ds, i); + + all_savemixer[i] = tmp; + //printf("0x%02x: 0x%02x\n", i, tmp); + } + ds->save_mixer_valid = true; + + // + // + // + if(ds->dsp_version < 0x40D) + goto SkipFP; + + // + // Reset mixer and hash initial state of registers + // + for(unsigned i = 0x01; i < 0x80; i++) + mixer_write(ds, i, 0); + mixer_write(ds, 0x00, 0); + + for(unsigned i = 0x01; i < 0x80; i++) + fip = DunnoHash(fip, mixer_read(ds, i)); + + + for(unsigned i = 0x01; i < 0x80; i++) + mixer_write(ds, i, 0xFF); + mixer_write(ds, 0x00, 0); + + for(unsigned i = 0x01; i < 0x80; i++) + fip = DunnoHash(fip, mixer_read(ds, i)); + + + // + // Clear registers to 0, and hash state of registers. + // + for(unsigned i = 0x01; i < 0x80; i++) + mixer_write(ds, i, 0); + + for(unsigned i = 0x01; i < 0x80; i++) + fip = DunnoHash(fip, mixer_read(ds, i)); + + // + // Go through setting each bit of each byte individually(0x40 * 8 iterations) + // (note: should occur after the clear-to-0 step. + // + for(unsigned bigi = 0; bigi < 0x80 * 8; bigi++) + { + if((bigi >> 3) == 0) + continue; + + mixer_write(ds, bigi >> 3, 1 << (bigi & 0x7)); + + for(unsigned i = 0x01; i < 0x80; i++) + fip = DunnoHash(fip, mixer_read(ds, i)); + + mixer_write(ds, bigi >> 3, 0); + } + + // + // Set registers to 0xFF, and hash state of registers. + // + for(unsigned i = 0x01; i < 0x80; i++) + mixer_write(ds, i, 0xFF); + + for(unsigned i = 0x01; i < 0x80; i++) + fip = DunnoHash(fip, mixer_read(ds, i)); + + +#if 0 + // + // Go through clearing each bit of each byte individually(0x80 * 8 iterations) + // (note: should occur after the set-to-0xFF step. + // + for(unsigned bigi = 0; bigi < 0x80 * 8; bigi++) + { + if((bigi >> 3) == 0) + continue; + + mixer_write(ds, bigi >> 3, 0xFF ^ (1 << (bigi & 0x7))); + + for(unsigned i = 0x01; i < 0x80; i++) + fip = DunnoHash(fip, mixer_read(ds, i)); + + mixer_write(ds, bigi >> 3, 0xFF); + } +#endif + + // + // Reset + // + for(unsigned i = 0x01; i < 0x100; i++) + mixer_write(ds, i, all_savemixer[i]); + + SkipFP: ; + + mixer_write(ds, 0x00, 0); + + return(fip); +} + +bool SexyALI_DOS_SB_Avail(void) +{ + if(getenv("BLASTER") != NULL) + return(true); + + return(false); +} + +#define SB_INIT_CLEANUP \ + if(device) free(device); \ + if(ds) { Cleanup(ds); free(ds); } + +SexyAL_device *SexyALI_DOS_SB_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device = NULL; + SB_Driver_t *ds = NULL; + + if(!(device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)))) + { + SB_INIT_CLEANUP + return(NULL); + } + + if(!(ds = (SB_Driver_t *)calloc(1, sizeof(SB_Driver_t)))) + { + SB_INIT_CLEANUP + return(NULL); + } + + ds->base = ~0U; + ds->dma = ~0U; + ds->irq = ~0U; + ds->save_istate = -1; + ds->save_pic_ion = -1; + ds->save_mixer_valid = false; + + device->private_data = ds; + + // + // Read BLASTER environment variable. + // + { + const char* eblast = getenv("BLASTER"); + unsigned eblast_len; + unsigned lbp = 0; + unsigned eb_base = 0; + unsigned eb_dma8 = 0; + unsigned eb_irq = 0; + + bool found_base = false; + bool found_dma8 = false; + bool found_irq = false; + + if(!eblast) + { + fprintf(stderr, "SB: \"BLASTER\" environment variable not found!\n"); + SB_INIT_CLEANUP + return(NULL); + } + + eblast_len = strlen(eblast); + for(unsigned i = 0; i < eblast_len + 1; i++) + { + char c = eblast[i]; + + if(c <= 0x20) + { + if(lbp < i) + { + char t = eblast[lbp]; + + switch(t) + { + case 'A': + if(sscanf(&eblast[lbp + 1], "%x", &eb_base) != 1) + { + fprintf(stderr, "SB: Malformed base address specifier in \"BLASTER\" environment variable!\n"); + SB_INIT_CLEANUP + return(NULL); + } + found_base = true; + break; + + case 'I': + if(sscanf(&eblast[lbp + 1], "%u", &eb_irq) != 1) + { + fprintf(stderr, "SB: Malformed IRQ specifier in \"BLASTER\" environment variable!\n"); + SB_INIT_CLEANUP + return(NULL); + } + found_irq = true; + break; + + case 'D': + if(sscanf(&eblast[lbp + 1], "%u", &eb_dma8) != 1) + { + fprintf(stderr, "SB: Malformed 8-bit DMA specifier in \"BLASTER\" environment variable!\n"); + SB_INIT_CLEANUP + return(NULL); + } + found_dma8 = true; + break; + } + } + lbp = i + 1; + } + } + + if(found_base) + { + if((eb_base &~ 0xF0) != 0x200) + { + fprintf(stderr, "SB: Bad base address specified by \"BLASTER\" environment variable: 0x%04X\n", eb_base); + SB_INIT_CLEANUP + return(NULL); + } + ds->base = eb_base; + } + else + { + fprintf(stderr, "SB: Missing base address specifier in \"BLASTER\" environment variable!\n"); + SB_INIT_CLEANUP + return(NULL); + } + + if(found_irq) + { + if(eb_irq < 3 || eb_irq > 15) + { + fprintf(stderr, "SB: Bad IRQ: %u\n", eb_irq); + SB_INIT_CLEANUP + return(NULL); + } + ds->irq = eb_irq; + } + else + { + fprintf(stderr, "SB: Missing IRQ specifier in \"BLASTER\" environment variable!\n"); + SB_INIT_CLEANUP + return(NULL); + } + + if(found_dma8) + { + if(eb_dma8 > 4 || eb_dma8 == 2) + { + fprintf(stderr, "SB: Bad 8-bit DMA channel: %u\n", eb_dma8); + SB_INIT_CLEANUP + return(NULL); + } + ds->dma = eb_dma8; + } + else + { + fprintf(stderr, "SB: Missing 8-bit DMA specifier in \"BLASTER\" environment variable!\n"); + SB_INIT_CLEANUP + return(NULL); + } + } + // + // End BLASTER parsing. + // + + if(!dsp_reset(ds)) + { + fprintf(stderr, "SB: Error resetting DSP(SB not found, or misconfigured).\n"); + SB_INIT_CLEANUP + return(NULL); + } + + // + // Get DSP version. + // + dsp_command(ds, 0xE1); + ds->dsp_version = dsp_read(ds) << 8; + ds->dsp_version |= dsp_read(ds) << 0; + + if(ds->dsp_version < 0x200) + { + fprintf(stderr, "SB: DSP versions earlier than 2.00 are not supported.\n"); + SB_INIT_CLEANUP + return(NULL); + } + + // + // Make sure SB IRQ is masked off in the IRQ controller. + // + ds->save_istate = __dpmi_get_and_disable_virtual_interrupt_state(); + ds->save_pic_ion = irq_fonof(ds->irq, false); + __dpmi_get_and_set_virtual_interrupt_state(ds->save_istate); + ds->save_istate = -1; + + // + // Save and fingerprint and reset mixer state + // + printf("\n"); + uint64_t mixer_fp = SaveFPAndResetMixer(ds); + dsp_reset(ds); // Work around fingerprinting-triggered bug in Sound Blaster PCI SB emulation code. + + + // + // + // + if(ds->dsp_version >= 0x400) + { + uint8 conf_dmabf = mixer_read(ds, 0x81); + + if(conf_dmabf & (1 << 0)) + ds->dma = 0; + else if(conf_dmabf & (1 << 1)) + ds->dma = 1; + else if(conf_dmabf & (1 << 3)) + ds->dma = 3; + + if((format->sampformat >> 4) >= 2) + { + if(conf_dmabf & (1 << 5)) + ds->dma = 5; + else if(conf_dmabf & (1 << 6)) + ds->dma = 6; + else if(conf_dmabf & (1 << 7)) + ds->dma = 7; + } + } + + { +#if 0 + static struct + { + uint16_t dsp_version; + uint64_t mixer_fp; + const char *name; + } card_table[] = + { + { 0x40D, 0xffc8998833d57773ULL, "Creative Sound Blaster PCI Legacy Driver" }, +// { 0x302, 0xULL, "Creative Labs Sound Blaster Pro 2" }, + + { 0x301, 0x7cbc1f28b011ef2bULL, "Aztech 2320" }, + +// { 0x301, 0xULL, "Yamaha YMF715" }, + + { 0, 0, NULL }, + }; +#endif + printf("Sound Blaster Information:\n"); +#if 0 + for(unsigned i = 0; card_table[i].name; i++) + { + if(card_table[i].dsp_version == ds->dsp_version && card_table[i].mixer_fp == mixer_fp) + { + printf(" Implementation(guessed): %s\n", card_table[i].name); + break; + } + } +#endif + printf(" DSP version: %d.%d\n", (ds->dsp_version >> 8), (ds->dsp_version & 0xFF)); + printf(" IRQ: %u\n", ds->irq); + printf(" DMA: %u\n", ds->dma); + if(mixer_fp != 0) + printf(" Mixer fingerprint: 0x%016llx\n", mixer_fp); + } + + // + // + // + format->revbyteorder = false; + format->noninterleaved = false; + + if(!buffering->ms) + buffering->ms = 24; + + buffering->period_size = 0; + buffering->bt_gran = 1; + + if(ds->dsp_version < 0x300) + format->channels = 1; + else if(format->channels > 2) + format->channels = 2; + + if((format->sampformat >> 4) >= 2) + { + if(ds->dsp_version < 0x400) + { + format->sampformat = SEXYAL_FMT_PCMU8; + } + else if((format->sampformat >> 4) > 2) + { + format->sampformat = SEXYAL_FMT_PCMS16; + } + } + else if(ds->dsp_version < 0x400) + { + format->sampformat = SEXYAL_FMT_PCMU8; + } + + if(ds->dsp_version < 0x201) + { + format->channels = 1; + } + + // + // Program rate. + // + if(ds->dsp_version < 0x400) + { + signed tc; + + tc = 256 - ((1000000 + (format->channels * format->rate / 2)) / (format->channels * format->rate)); + + if(ds->dsp_version < 0x201) + { + if(tc > 211) + tc = 211; + } + else + { + if(tc > 234) + tc = 234; + + if(format->channels == 2 && tc < 211) + tc = 211; + } + + if(tc < 56) + tc = 56; + + //if(getenv("SBTC")) + // tc = atoi(getenv("SBTC")); + + format->rate = (1000000 + (256 - tc) * format->channels / 2) / ((256 - tc) * format->channels); + ds->hs_mode = ((tc > 211) || format->channels == 2); + + // command 0x40 + dsp_command(ds, 0x40, tc); + } + else + { + if(mixer_fp == 0x79912aba874f4ad3ULL) // Fingerprint from EMU10K SB emulator(hopefully real SB16 hardware doesn't have the same fingerprint >_>) + { + if(format->rate < 5000) + format->rate = 5000; + + if(format->rate > 65535) + format->rate = 64000; + } + else + { + // Sound output sampling rate, hardcoded to 44100 since I'm not sure about the sample rate accuracy, especially on clone cards...but are there SB16 clone + // cards? + format->rate = 44100; + } + ds->hs_mode = false; + + dsp_command(ds, 0x41, format->rate >> 8, format->rate >> 0); + } + + buffering->buffer_size = buffering->ms * format->rate / 1000; + + // + // 65536 bytes maximum size for 8-bit DMA, / 2 since we need DMA buffer size *2 buffer size for reliable wraparound detection. + // + // Don't bother having a higher limit for 16-bit DMA, since it'd use too much conventional memory to be useful when taking into consideration + // allocation alignment overhead needed to prevent the buffer from straddling a 64K/128K boundary. + if((buffering->buffer_size * (format->sampformat >> 4) * format->channels) > 32768) + buffering->buffer_size = 32768 / (format->channels * (format->sampformat >> 4)); + + buffering->latency = buffering->buffer_size; // TODO: SB FIFO length. + + memset(&ds->dmabuf, 0, sizeof(ds->dmabuf)); + ds->dmabuf.size = (((buffering->buffer_size * 2 * 2) * (format->sampformat >> 4) * format->channels) + 15) / 16; + if(_go32_dpmi_allocate_dos_memory(&ds->dmabuf) != 0) + { + fprintf(stderr, "SB: error allocating DMA memory."); + SB_INIT_CLEANUP + return(NULL); + } + + { + uint32 tmp_mask; + + if(ds->dma >= 4) + tmp_mask = ~(131072 - 1); + else + tmp_mask = ~(65536 - 1); + + ds->dmabuf_eff_paddr = ds->dmabuf.rm_segment << 4; + ds->dmabuf_eff_size = (ds->dmabuf.size << 4) / 2; + + if((ds->dmabuf_eff_paddr & tmp_mask) != ((ds->dmabuf_eff_paddr + ds->dmabuf_eff_size - 1) & tmp_mask)) + ds->dmabuf_eff_paddr = (ds->dmabuf_eff_paddr + (~tmp_mask)) & tmp_mask; + } + + // + // Clear DMA buffer memory. + // + { + const uint32_t base = ds->dmabuf_eff_paddr; + const uint32_t siz = ds->dmabuf_eff_size; + uint32_t wv = 0; + + if(format->sampformat == SEXYAL_FMT_PCMU8) + wv = 0x80808080U; + else if(format->sampformat == SEXYAL_FMT_PCMU16) + wv = 0x80008000U; + + _farsetsel(_dos_ds); + for(unsigned i = 0; i < siz; i += 4) + _farnspokel(base + i, wv); + } + + // + // Program mixer parameters. + // + + if(ds->dsp_version < 0x300) // SB + { + mixer_write(ds, 0x02, 7 << 1); // Master volume, 0dB + mixer_write(ds, 0x06, 0); // MIDI volume, -46dB + mixer_write(ds, 0x08, 0); // CD volume, -46dB + mixer_write(ds, 0x0A, 3 << 1); // Voice volume, 0dB + } + else if(ds->dsp_version < 0x400) // SB Pro + { + // + // 0xFF for volume in some spots for the benefit of some clone cards. + // + mixer_write(ds, 0x04, 0xFF); //(0x7 << 5) | (0x7 << 1)); // Voice L and R, 0dB + mixer_write(ds, 0x0A, 0); // Mic, -46dB + mixer_write(ds, 0x0C, 0x8); // Input settings. + + mixer_write(ds, 0x0E, ((format->channels == 2) ? 0x2 : 0) | ((format->rate >= 20000 || format->channels == 2) ? 0x20 : 0x00)); // Output switches. + + mixer_write(ds, 0x22, 0xFF); //(0x7 << 5) | (0x7 << 1)); // Master L and R, 0dB + mixer_write(ds, 0x26, 0); // MIDI L and R, -46dB + mixer_write(ds, 0x28, 0); // CD L and R, -46dB + mixer_write(ds, 0x2E, 0); // Line L and R, -46dB + } + else // SB 16 + { + // Master volume, 0dB + mixer_write(ds, 0x30, 0xFF); + mixer_write(ds, 0x31, 0xFF); + + // Voice volume, 0dB + mixer_write(ds, 0x32, 0xFF); + mixer_write(ds, 0x33, 0xFF); + + // MIDI, -62dB + mixer_write(ds, 0x34, 0); + mixer_write(ds, 0x35, 0); + } + + // + // Speaker On + // + dsp_command(ds, 0xD1); + + + // + // Start DMA + // + ds->save_istate = __dpmi_get_and_disable_virtual_interrupt_state(); + dma_ch_off(ds->dma); + dma_ch_set_mode(ds->dma, DMA_MODE_TYPE_SINGLE | DMA_MODE_AIS_INCREMENT | DMA_MODE_AUTOINIT_ON | DMA_MODE_TT_READ); + dma_ch_set_buffer(ds->dma, ds->dmabuf_eff_paddr, ds->dmabuf_eff_size); + dma_ch_on(ds->dma); + __dpmi_get_and_set_virtual_interrupt_state(ds->save_istate); + ds->save_istate = -1; + + if(ds->dsp_version < 0x400) + { + /* + Since we're not making use of IRQs, specify the block size as "1"(wbs = 1 - 1 = 0) to prevent period clicking and popping noises + with some waveforms(on an SB Pro 2 at least) due to what's likely hardware design flaws. + (In mono mode for example, broadband distortion was noted about every 256 samples AND about every 'wbs' samples) + */ + /* + SCRATCH THAT. Doing that messes with the sample playback rate(about 2/3 of what it should be), and the DSP isn't accepting larger time constants + than 234(would be needed to compensate). + + Playback rate with various raw block sizes: + 0 = 2/3 + 1 = 4/5 + 2 = 0.8577 with SEVERE distortion. + 3 = 0.8894 + 255 = 0.9986 with some distortion + */ + /* + TODO? (still need to test stuff with raw block sizes >= 256) + (NOTE: Pseudocode below requires fractional/floating point precision) + actual_rate = 1000000 / (256 - raw_time_constant + 11 / (raw_block_size + 1)) + */ + uint16_t wbs = 0xFFFF; //0; + + dsp_command(ds, 0x48, wbs >> 0, wbs >> 8); + + if(ds->hs_mode) + dsp_command(ds, 0x90); + else + dsp_command(ds, 0x1C); + } + else + { + uint8_t digi_cmd; + uint8_t digi_mode; + uint16_t wlen = 0xFFFF; + + digi_cmd = 0xB0 | (0 << 3) | (1 << 2) | (1 << 1); + + if((format->sampformat >> 4) == 1) + digi_cmd += 0x10; + + digi_mode = ((format->sampformat == SEXYAL_FMT_PCMS8 || format->sampformat == SEXYAL_FMT_PCMS16) ? 0x10 : 0x00) | ((format->channels == 2) ? 0x20 : 0x00); + + dsp_command(ds, digi_cmd, digi_mode, wlen >> 0, wlen >> 8); + } + +#if 0 + printf("Timing transfer rate....\n"); + { + uint64_t tick_counter = 0; + uint8_t ct; + int prev_ct = -1; + + ds->save_istate = __dpmi_get_and_disable_virtual_interrupt_state(); + + for(;;) + { + ct = inportb(0x40); + if(prev_ct != -1) + { + if( + } + prev_ct = ct; + + UpdateReadCounter(ds); + } + __dpmi_get_and_set_virtual_interrupt_state(ds->save_istate); + ds->save_istate = -1; + } +#endif + printf("SB INIT DONE!\n"); + + ds->prev_dmacounter = 0; + ds->read_counter = 0; + ds->write_counter = 0; + + memcpy(&device->format, format, sizeof(SexyAL_format)); + memcpy(&device->buffering, buffering, sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/sdl.cpp b/Mednafen/mednafen/sexyal/drivers/sdl.cpp new file mode 100644 index 0000000000..164f5a2d1a --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/sdl.cpp @@ -0,0 +1,426 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Note: SDL (incorrectly, one could argue) uses the word "sample" to refer both to monophonic sound samples and + stereo L/R sample pairs. +*/ + + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include + +#include + +#include + +static int64_t Time64(void) +{ + // Don't use gettimeofday(), it's not monotonic. + // (SDL will use gettimeofday() on UNIXy systems if clock_gettime() is not available, however...) + int64_t ret; + + ret = (int64_t)SDL_GetTicks() * 1000; + + return(ret); +} + +typedef struct +{ + void *Buffer; + int32_t BufferSize; + int32_t RealBufferSize; + + int EPMaxVal; // Extra precision max value, in frames. + + + int32_t BufferSize_Raw; + int32_t RealBufferSize_Raw; + int32_t BufferRead; + int32_t BufferWrite; + int32_t BufferIn; + int32_t BufferGranularity; + + int StartPaused; + int ProgPaused; + + int StandAlone; + + int64_t last_time; +} SDLWrap; + +#ifdef WIN32 +static void fillaudio(void *udata, uint8_t *stream, int len) __attribute__((force_align_arg_pointer)); +#endif +static void fillaudio(void *udata, uint8_t *stream, int len) +{ + SexyAL_device *device = (SexyAL_device *)udata; + SDLWrap *sw = (SDLWrap *)device->private_data; + int tocopy = len; + + sw->last_time = Time64(); + + if(tocopy > sw->BufferIn) + tocopy = sw->BufferIn; + + //printf("%d\n", len); + + while(len) + { + if(tocopy > 0) + { + int maxcopy = tocopy; + + if((maxcopy + sw->BufferRead) > sw->RealBufferSize_Raw) + maxcopy = sw->RealBufferSize_Raw - sw->BufferRead; + + memcpy(stream, (char *)sw->Buffer + sw->BufferRead, maxcopy); + + sw->BufferRead = (sw->BufferRead + maxcopy) % sw->RealBufferSize_Raw; + + sw->BufferIn -= maxcopy; + + stream += maxcopy; + tocopy -= maxcopy; + len -= maxcopy; + } + else + { + //printf("Underrun by: %d\n", len); + + // Set "stream" to center position. Signed is easy, we can just memset + // the entire buffer to 0. Unsigned 8-bit is easy as well, but we need to take care with unsigned 16-bit to + // take into account any byte-order reversal. + if(SEXYAL_FMT_PCMU8 == device->format.sampformat) + { + memset(stream, 0x80, len); + } + else if(SEXYAL_FMT_PCMU16 == device->format.sampformat) + { + uint16_t fill_value = 0x8000; + + if(device->format.revbyteorder) // Is byte-order reversed from native? + fill_value = 0x0080; + + for(int i = 0; i < len; i += 2) + *(uint16_t *)(stream + i) = fill_value; + } + else + memset(stream, 0, len); + + stream += len; + len = 0; + } + } +} + +static int Get_RCW(SexyAL_device *device, uint32_t *can_write, bool want_nega = false) +{ + SDLWrap *sw = (SDLWrap *)device->private_data; + int64_t curtime; + int32_t cw; + int32_t extra_precision; + + SDL_LockAudio(); + + curtime = Time64(); + + cw = sw->BufferSize_Raw - sw->BufferIn; + + extra_precision = ((curtime - sw->last_time) / 1000 * device->format.rate / 1000); + + if(extra_precision < 0) + { + //printf("extra_precision < 0: %d\n", extra_precision); + extra_precision = 0; + } + else if(extra_precision > sw->EPMaxVal) + { + //printf("extra_precision > EPMaxVal: %d %d\n", extra_precision, sw->EPMaxVal); + extra_precision = sw->EPMaxVal; + } + + cw += extra_precision * device->format.channels * (device->format.sampformat >> 4); + + if(cw < 0) + { + if(want_nega) + *can_write = (uint32_t)(int32_t)cw; + else + *can_write = 0; + } + else if(cw > sw->BufferSize_Raw) + { + *can_write = sw->BufferSize_Raw; + } + else + *can_write = cw; + + SDL_UnlockAudio(); + + return(1); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + return(Get_RCW(device, can_write, false)); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + SDLWrap *sw = (SDLWrap *)device->private_data; + const uint8_t *data_u8 = (const uint8_t *)data; + + //printf("Write: %u, %u %u\n", len, sw->BufferIn, sw->RealBufferSize_Raw); + + SDL_LockAudio(); + while(len) + { + int maxcopy = len; + + if((maxcopy + sw->BufferWrite) > sw->RealBufferSize_Raw) + maxcopy = sw->RealBufferSize_Raw - sw->BufferWrite; + + if((maxcopy + sw->BufferIn) > sw->RealBufferSize_Raw) + { + maxcopy = sw->RealBufferSize_Raw - sw->BufferIn; + if(!maxcopy) + { + SDL_UnlockAudio(); + SDL_Delay(1); + //puts("BJORK"); + SDL_LockAudio(); + continue; + } + } + memcpy((char*)sw->Buffer + sw->BufferWrite, data_u8, maxcopy); + + sw->BufferWrite = (sw->BufferWrite + maxcopy) % sw->RealBufferSize_Raw; + sw->BufferIn += maxcopy; + + data_u8 += maxcopy; + len -= maxcopy; + } + SDL_UnlockAudio(); + + if(sw->StartPaused) + { + sw->StartPaused = 0; + SDL_PauseAudio(sw->ProgPaused); + } + + uint32_t cw_tmp; + + while(Get_RCW(device, &cw_tmp, true) && (int32_t)cw_tmp < 0) + { + //int64_t tt = (int64_t)(int32_t)cw_tmp * -1 * 1000 * 1000 * 1000 / (device->format.channels * (device->format.sampformat >> 4) * device->format.rate); + //usleep(tt / 1000); + //printf("%f\n", (double)tt / 1000 / 1000 / 1000); + SDL_Delay(1); + } + + return(1); +} + +static int Pause(SexyAL_device *device, int state) +{ + SDLWrap *sw = (SDLWrap *)device->private_data; + + sw->ProgPaused = state?1:0; + SDL_PauseAudio(sw->ProgPaused | sw->StartPaused); + + return(sw->ProgPaused); +} + +static int Clear(SexyAL_device *device) +{ + SDLWrap *sw = (SDLWrap *)device->private_data; + SDL_LockAudio(); + + SDL_PauseAudio(1); + sw->StartPaused = 1; + sw->BufferRead = sw->BufferWrite = sw->BufferIn = 0; + + SDL_UnlockAudio(); + return(1); +} + +static int RawClose(SexyAL_device *device) +{ + if(device) + { + if(device->private_data) + { + SDLWrap *sw = (SDLWrap *)device->private_data; + if(sw->Buffer) + free(sw->Buffer); + SDL_CloseAudio(); + free(device->private_data); + + if(sw->StandAlone) + { + SDL_Quit(); + //puts("SDL quit"); + } + } + free(device); + return(1); + } + return(0); +} + +SexyAL_device *SexyALI_SDL_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *device; + SDLWrap *sw; + SDL_AudioSpec desired, obtained; + const char *env_standalone; + int iflags; + int StandAlone = 0; + + env_standalone = getenv("SEXYAL_SDL_STANDALONE"); + if(env_standalone && atoi(env_standalone)) + { + StandAlone = 1; + //puts("Standalone"); + } + + iflags = SDL_INIT_AUDIO | SDL_INIT_TIMER; + + #ifdef SDL_INIT_EVENTTHREAD + iflags |= SDL_INIT_EVENTTHREAD; + #endif + + if(StandAlone) + { + if(SDL_Init(iflags) < 0) + { + puts(SDL_GetError()); + return(0); + } + } + else + { + //printf("%08x %08x %08x\n", iflags, SDL_WasInit(iflags), SDL_WasInit(iflags) ^ iflags); + if(SDL_InitSubSystem(SDL_WasInit(iflags) ^ iflags) < 0) + { + puts(SDL_GetError()); + return(0); + } + } + + sw = (SDLWrap *)calloc(1, sizeof(SDLWrap)); + + sw->StandAlone = StandAlone; + + device = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)); + device->private_data = sw; + + memset(&desired, 0, sizeof(SDL_AudioSpec)); + memset(&obtained, 0, sizeof(SDL_AudioSpec)); + + int desired_pt = buffering->period_us ? buffering->period_us : 5333; + int psize = SexyAL_rnearestpow2((int64_t)desired_pt * format->rate / (1000 * 1000), false); + + desired.freq = format->rate; + desired.format = AUDIO_S16; + desired.channels = format->channels; + desired.callback = fillaudio; + desired.userdata = (void *)device; + desired.samples = psize; + + if(SDL_OpenAudio(&desired, &obtained) < 0) + { + puts(SDL_GetError()); + RawClose(device); + return(0); + } + + format->channels = obtained.channels; + format->rate = obtained.freq; + + if(obtained.format == AUDIO_U8) + format->sampformat = SEXYAL_FMT_PCMU8; + else if(obtained.format == AUDIO_S8) + format->sampformat = SEXYAL_FMT_PCMS8; + else if(obtained.format == AUDIO_S16LSB || obtained.format == AUDIO_S16MSB) + { + format->sampformat = SEXYAL_FMT_PCMS16; + + if(obtained.format != AUDIO_S16SYS) + format->revbyteorder = 1; + } + else if(obtained.format == AUDIO_U16LSB || obtained.format == AUDIO_U16MSB) + { + format->sampformat = SEXYAL_FMT_PCMU16; + + if(obtained.format != AUDIO_U16SYS) + format->revbyteorder = 1; + } + + if(!buffering->ms) + buffering->ms = 100; + else if(buffering->ms > 1000) + buffering->ms = 1000; + + sw->EPMaxVal = obtained.samples; + + sw->BufferSize = (format->rate * buffering->ms / 1000); + + if(sw->BufferSize < obtained.samples) + sw->BufferSize = obtained.samples; + + //printf("%d\n", sw->BufferSize); + + // *2 for safety room, and 30ms extra. + sw->RealBufferSize = SexyAL_rupow2(sw->BufferSize + sw->EPMaxVal * 2 + ((30 * format->rate + 999) / 1000) ); + + sw->BufferIn = sw->BufferRead = sw->BufferWrite = 0; + + buffering->buffer_size = sw->BufferSize; + + buffering->latency = sw->BufferSize + obtained.samples; + buffering->period_size = obtained.samples; + buffering->bt_gran = 1; + + //printf("%d\n", buffering->latency); + + sw->BufferSize_Raw = sw->BufferSize * format->channels * (format->sampformat >> 4); + sw->RealBufferSize_Raw = sw->RealBufferSize * format->channels * (format->sampformat >> 4); + + sw->Buffer = malloc(sw->RealBufferSize_Raw); + + memcpy(&device->format, format, sizeof(SexyAL_format)); + memcpy(&device->buffering, buffering, sizeof(SexyAL_buffering)); + + device->RawCanWrite = RawCanWrite; + device->RawWrite = RawWrite; + device->RawClose = RawClose; + device->Clear = Clear; + device->Pause = Pause; + + sw->StartPaused = 1; + //SDL_PauseAudio(0); + return(device); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/wasapi.cpp b/Mednafen/mednafen/sexyal/drivers/wasapi.cpp new file mode 100644 index 0000000000..77b0c7ef9b --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/wasapi.cpp @@ -0,0 +1,643 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// TODO: Memory fences and/or atomic types if we want this code to work properly on non-x86 Windows. + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#undef _WIN32_WINNT +//#define _WIN32_WINNT 0x600 +//#include + +static const CLSID LV_CLSID_MMDeviceEnumerator = { 0xbcde0395, 0xe52f, 0x467c, { 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e} }; //__uuidof(MMDeviceEnumerator); +static const IID LV_IID_IMMDeviceEnumerator = { 0xa95664d2, 0x9614, 0x4f35, {0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6} }; //__uuidof(IMMDeviceEnumerator); +static const IID LV_IID_IAudioClient = { 0x1cb9ad4c, 0xdbfa, 0x4c32, {0xb1,0x78, 0xc2,0xf5,0x68,0xa7,0x03,0xb2} }; //__uuidof(IAudioClient); +static const IID LV_IID_IAudioRenderClient = {0xf294acfc, 0x3146, 0x4483, {0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2} }; //__uuidof(IAudioRenderClient); +static const GUID LV_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; + +static const PROPERTYKEY LV_PKEY_Device_FriendlyName = { { 0xa45c254e, 0xdf1c, 0x4efd, { 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0 } }, 14 }; +static const PROPERTYKEY LV_PKEY_DeviceInterface_FriendlyName = { { 0x026e516e, 0xb814, 0x414b, { 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22 } }, 2 }; + +struct WASWrap +{ + IMMDevice *immdev; + IAudioClient *ac; + IAudioRenderClient *arc; + HMODULE avrt_dll; + HANDLE WINAPI (*p_AvSetMmThreadCharacteristicsA)(LPCSTR TaskName, LPDWORD TaskIndex); + BOOL WINAPI (*p_AvRevertMmThreadCharacteristics)(HANDLE); + HANDLE evt; + HANDLE AThread; + UINT32 bfc; + + volatile uint8_t* Buffer; + uint32_t BufferBPF; + uint32_t BufferReadBytePos; + uint32_t BufferWriteBytePos; + uint32_t BufferFrameSize; + uint32_t BufferFrameSizeSuper; + uint32_t BufferByteSize; + uint32_t BufferByteSizeSuper; + + // Ostensibly atomic: + volatile uint32_t BufferRBC; // In audio thread: uint32 tc = BufferWriteCounter - BufferReadCounter; + volatile uint32_t BufferWBC; // In main thread: uint32 tc = SOMETHING - (BufferWriteCounter - BufferReadCounter); + + volatile char AThreadRunning; + HANDLE BufferReadEvent; +}; + + +static int Close(SexyAL_device *device); +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write); +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len); + +static int Pause(SexyAL_device *device, int state) +{ + return(0); +} + +#define TRYHR(n) { HRESULT hrtmp = (n); if(FAILED(hrtmp)) { printf("HRTMP: %u\n", (unsigned int)hrtmp); assert(0); throw(1); } } + +static DWORD WINAPI AThreadMain(LPVOID param) +{ + SexyAL_device *dev = (SexyAL_device*)param; + WASWrap *w = (WASWrap*)dev->private_data; + BYTE *bd; + DWORD task_index = 0; + HANDLE avh; + + if((avh = w->p_AvSetMmThreadCharacteristicsA("Pro Audio", &task_index)) == 0) + { + abort(); + } + + if(w->arc->GetBuffer(w->bfc, &bd) != S_OK) + { + abort(); + goto Cleanup; + } + + memset(bd, 0, w->bfc * w->BufferBPF); + w->arc->ReleaseBuffer(w->bfc, 0); + + if(w->ac->Start() != S_OK) + { + abort(); + goto Cleanup; + } + + while(w->AThreadRunning) + { + HRESULT tmp; + if(WaitForSingleObject(w->evt, 100) != WAIT_OBJECT_0) + { + HRESULT st; + + st = w->ac->Start(); + + if(st == AUDCLNT_E_DEVICE_INVALIDATED) + goto Cleanup; + + //printf("HuhBluh? 0x%08x\n", st); + + //continue; + } + + UINT32 paddie = 0; + unsigned itercount = 1; + + // Necessary(confounded MSDN documentation suggests otherwise. :/), at least on an old PCI X-Fi card, to avoid nastiness on sound buffer underrun. + // + // Note: Before, we tried calling GetBuffer() with a length of w->bfc * 2 - paddie, but that would randomly cause WASAPI and/or the sound card + // driver to flip out and break. So to play it safe, only call it with a length of w->bfc, and call it multiple times if necessary. + if((tmp = w->ac->GetCurrentPadding(&paddie)) == S_OK) + { + if(paddie < w->bfc) + { + //printf("BRAINS IN THE CUPBOARD!!! %u\n", paddie); + itercount = 2; + } + } + //else + // printf("HARSHIE: 0x%08x\n", tmp); + + while(itercount--) + { + // FIXME: Proper integer typecasting for std::min stuff. + if((tmp = w->arc->GetBuffer(w->bfc, &bd)) == S_OK) + { + int32_t to_copy = std::min(w->bfc * w->BufferBPF, w->BufferWBC - w->BufferRBC); + int32_t max_bs_copy = w->BufferByteSizeSuper - w->BufferReadBytePos; + + assert(to_copy >= 0); + + #if 0 + static int sawie = 0; + for(int i = 0; i < w->bfc; i++) + { + ((uint16_t*)bd)[i * 2 + 0] = sawie; + ((uint16_t*)bd)[i * 2 + 1] = sawie; + sawie += 128; + } + #else + memcpy(bd, (void*)(w->Buffer + w->BufferReadBytePos), std::min(to_copy, max_bs_copy)); + memcpy(bd + max_bs_copy, (void*)(w->Buffer), std::max(0, to_copy - max_bs_copy)); + memset(bd + to_copy, 0, (w->bfc * w->BufferBPF) - to_copy); + #endif + w->arc->ReleaseBuffer(w->bfc, 0); + + w->BufferReadBytePos = (w->BufferReadBytePos + to_copy) % w->BufferByteSizeSuper; + w->BufferRBC += to_copy; + SetEvent(w->BufferReadEvent); // Call AFTER adding to BufferRBC. + } + //else + // printf("GOOBLES: %u 0x%08x\n", w->bfc, tmp); + } + } + + Cleanup: ; + w->ac->Stop(); + + if(avh != NULL) + { + w->p_AvRevertMmThreadCharacteristics(avh); + avh = NULL; + } + + w->AThreadRunning = false; + return(0); +} + +bool SexyALI_WASAPI_Avail(void) +{ + IMMDeviceEnumerator *imd = NULL; + HRESULT hr; + + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if(hr != S_OK && hr != S_FALSE) + return(false); + + hr = CoCreateInstance(LV_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, LV_IID_IMMDeviceEnumerator, (void**)&imd); + if(FAILED(hr)) + return(false); + + imd->Release(); + + return(true); +} + +SexyAL_device *SexyALI_WASAPI_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *dev; + WASWrap *w; + IMMDeviceEnumerator *immdeven = NULL; + WAVEFORMATEXTENSIBLE wfe; + HRESULT hr; + const bool exclusive_mode = true; + + dev = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)); + timeBeginPeriod(1); + + w = (WASWrap *)calloc(1, sizeof(WASWrap)); + dev->private_data = w; + // + // + // + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if(hr != S_OK && hr != S_FALSE) + assert(0); + + //printf("NOODLES: 0x%08x 0x%08x\n", LV_CLSID_MMDeviceEnumerator.Data1, LV_IID_IMMDeviceEnumerator.Data1); + + TRYHR(CoCreateInstance(LV_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, LV_IID_IMMDeviceEnumerator, (void**)&immdeven)); + + if(id == NULL) + { + TRYHR(immdeven->GetDefaultAudioEndpoint(eRender, eConsole, &w->immdev)); + } + else + { + IMMDeviceCollection *devcoll = NULL; + UINT numdevs = 0; + wchar_t *id16 = (wchar_t *)calloc(strlen(id) + 1, sizeof(wchar_t)); + + w->immdev = NULL; + + MultiByteToWideChar(CP_UTF8, 0, id, -1, id16, strlen(id) + 1); + + TRYHR(immdeven->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &devcoll)); + TRYHR(devcoll->GetCount(&numdevs)); + + for(UINT i = 0; i < numdevs && w->immdev == NULL; i++) + { + IMMDevice *tmpdev = NULL; + IPropertyStore *props = NULL; + PROPVARIANT prop_fname; + + PropVariantInit(&prop_fname); + + TRYHR(devcoll->Item(i, &tmpdev)); + TRYHR(tmpdev->OpenPropertyStore(STGM_READ, &props)); + TRYHR(props->GetValue(LV_PKEY_Device_FriendlyName, &prop_fname)); + + printf("Device: %S\n", prop_fname.pwszVal); + + if(!wcscmp(id16, prop_fname.pwszVal)) + w->immdev = tmpdev; + else + { + tmpdev->Release(); + tmpdev = NULL; + } + + PropVariantClear(&prop_fname); + + if(props != NULL) + { + props->Release(); + props = NULL; + } + } + + if(id16 != NULL) + { + free(id16); + id16 = NULL; + } + + if(devcoll != NULL) + { + devcoll->Release(); + devcoll = NULL; + } + + if(w->immdev == NULL) + { + puts("Device not found!"); + return(NULL); + } + } + + TRYHR(w->immdev->Activate(LV_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&w->ac)); + + if(exclusive_mode == false) + { + WAVEFORMATEX *mf = NULL; + + TRYHR(w->ac->GetMixFormat(&mf)); + +#if 0 + printf("wFormatTag: 0x%08x\n", mf->wFormatTag); + printf("nChannels: 0x%08x\n", mf->nChannels); + printf("nSamplesPerSec: 0x%08x\n", mf->nSamplesPerSec); + printf("wBitsPerSample: 0x%08x\n", mf->wBitsPerSample); + printf("nBlockAlign: 0x%08x\n", mf->nBlockAlign); + printf("cbSize: 0x%08x\n", mf->cbSize); + fflush(stdout); +#endif + + memset(&wfe, 0, sizeof(wfe)); + wfe.Format.wFormatTag = WAVE_FORMAT_PCM; + wfe.Format.nChannels = format->channels; + wfe.Format.nSamplesPerSec = mf->nSamplesPerSec; + wfe.Format.wBitsPerSample = 16; + wfe.Format.nBlockAlign = (wfe.Format.nChannels * wfe.Format.wBitsPerSample) / 8; + wfe.Format.nAvgBytesPerSec = wfe.Format.nSamplesPerSec * wfe.Format.nBlockAlign; + wfe.Format.cbSize = 0; + + CoTaskMemFree(mf); + + goto SuppFormatFound; + } + else + { + const uint32_t rates[7] = { format->rate, 48000, 96000, 192000, 44100, 88200, 22050 }; + const uint32_t chans[4] = { format->channels, 2, 1, 8 }; + const int bits[3] = { 16, 32, 8 }; + + for(int chantry = 0; chantry < 4; chantry++) + { + for(int ratetry = 0; ratetry < 7; ratetry++) + { + for(int bittry = 0; bittry < 3; bittry++) + { + for(int vbtry = (bits[bittry] == 32) ? 32 : 16; vbtry >= 16; vbtry--) + { + memset(&wfe, 0, sizeof(wfe)); + + wfe.Format.wFormatTag = WAVE_FORMAT_PCM; + wfe.Format.nChannels = chans[chantry]; + wfe.Format.nSamplesPerSec = rates[ratetry]; + wfe.Format.wBitsPerSample = SexyAL_rupow2(bits[bittry]); + + wfe.Format.nBlockAlign = (wfe.Format.nChannels * wfe.Format.wBitsPerSample) / 8; + wfe.Format.nAvgBytesPerSec = wfe.Format.nSamplesPerSec * wfe.Format.nBlockAlign; + wfe.Format.cbSize = 0; + + if(bits[bittry] > 16) + { + wfe.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wfe.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + + wfe.Samples.wValidBitsPerSample = vbtry; + + if(wfe.Format.nChannels >= 2) + wfe.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + else + wfe.dwChannelMask = SPEAKER_FRONT_CENTER; + + wfe.SubFormat = LV_KSDATAFORMAT_SUBTYPE_PCM; + } + + if(w->ac->IsFormatSupported(AUDCLNT_SHAREMODE_EXCLUSIVE, (WAVEFORMATEX*)&wfe, NULL) == S_OK) + { + goto SuppFormatFound; + } + } + } + } + } + } + + // No supported format found. :( + assert(0); //throw(1); + + SuppFormatFound: ; + + format->rate = wfe.Format.nSamplesPerSec; + format->sampformat = ((wfe.Format.wBitsPerSample >> 3) << 4) | 1; + + if(wfe.Format.wBitsPerSample == 32) + format->sampformat |= 2; + + format->channels = wfe.Format.nChannels; + format->revbyteorder = false; + format->noninterleaved = false; + + if(exclusive_mode == false) + { + REFERENCE_TIME periodicity; + + TRYHR(w->ac->GetDevicePeriod(&periodicity, NULL)); // Default periodicity for a shared-mode stream. + + TRYHR(w->ac->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, periodicity, 0, (WAVEFORMATEX*)&wfe, NULL)); + + TRYHR(w->ac->GetBufferSize(&w->bfc)); + } + else + { + REFERENCE_TIME periodicity; + + TRYHR(w->ac->GetDevicePeriod(NULL, &periodicity)); + + if(buffering->period_us > 0 && ((int64_t)buffering->period_us * 10) >= periodicity) // >= rather than > so the else-if doesn't run for < 2ms minimum case + periodicity = buffering->period_us * 10; + else if(periodicity < 20000) // Don't use a periodicity smaller than 2ms unless the user specifically asks for it(handled above). + periodicity = 20000; + + //printf("PERIODICITYYYY: %d\n", (int)periodicity); + + hr = w->ac->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, periodicity, periodicity, (WAVEFORMATEX*)&wfe, NULL); + if(hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) + { + UINT32 tmp_bs; + + TRYHR(w->ac->GetBufferSize(&tmp_bs)); + periodicity = ((int64_t)tmp_bs * 10000 * 1000 + (wfe.Format.nSamplesPerSec >> 1)) / wfe.Format.nSamplesPerSec; + //printf("PERIODICITYYYY(AGAIAIAAAIN): %d\n", (int)periodicity); + + w->ac->Release(); + w->ac = NULL; + + TRYHR(w->immdev->Activate(LV_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&w->ac)); + TRYHR(w->ac->Initialize(AUDCLNT_SHAREMODE_EXCLUSIVE, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, periodicity, periodicity, (WAVEFORMATEX*)&wfe, NULL)); + } + else + { + TRYHR(hr); + } + } + + // + // + // + { + REFERENCE_TIME raw_ac_latency; + + TRYHR(w->ac->GetBufferSize(&w->bfc)); + TRYHR(w->ac->GetStreamLatency(&raw_ac_latency)); + + //printf("MOOMOOOOO: %u\n", (unsigned)raw_ac_latency); + + int32_t dtbfs = (int64_t)(buffering->ms ? buffering->ms : 32) * wfe.Format.nSamplesPerSec / 1000; + int32_t des_local_bufsize = std::max(dtbfs, w->bfc); + int32_t des_local_bufsize_super = des_local_bufsize + ((30 * wfe.Format.nSamplesPerSec + 999) / 1000); + + w->BufferRBC = 0; + w->BufferWBC = 0; + w->BufferReadBytePos = 0; + w->BufferWriteBytePos = 0; + + w->Buffer = (uint8_t*)calloc(wfe.Format.wBitsPerSample / 8 * wfe.Format.nChannels, des_local_bufsize_super); + w->BufferBPF = wfe.Format.wBitsPerSample / 8 * wfe.Format.nChannels; + w->BufferFrameSize = des_local_bufsize; + w->BufferFrameSizeSuper = des_local_bufsize_super; + w->BufferByteSize = w->BufferFrameSize * w->BufferBPF; + w->BufferByteSizeSuper = w->BufferFrameSizeSuper * w->BufferBPF; + + buffering->buffer_size = des_local_bufsize; + buffering->period_size = w->bfc; + buffering->latency = des_local_bufsize + w->bfc; + buffering->bt_gran = 0; + } + + w->evt = CreateEvent(NULL, FALSE, FALSE, NULL); + if(w->evt == NULL) + assert(0); //throw(1); + + w->BufferReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if(w->evt == NULL) + assert(0); + + if(!(w->avrt_dll = LoadLibrary("avrt.dll"))) + assert(0); + + if(!(w->p_AvSetMmThreadCharacteristicsA = (HANDLE WINAPI (*)(LPCSTR, LPDWORD))(GetProcAddress(w->avrt_dll, "AvSetMmThreadCharacteristicsA")))) + assert(0); + + if(!(w->p_AvRevertMmThreadCharacteristics = (BOOL WINAPI (*)(HANDLE))(GetProcAddress(w->avrt_dll, "AvRevertMmThreadCharacteristics")))) + assert(0); + + TRYHR(w->ac->SetEventHandle(w->evt)); + + TRYHR(w->ac->GetService(LV_IID_IAudioRenderClient, (void**)&w->arc)); + + memcpy(&dev->buffering, buffering, sizeof(SexyAL_buffering)); + memcpy(&dev->format, format, sizeof(SexyAL_format)); + dev->RawWrite = RawWrite; + dev->RawCanWrite = RawCanWrite; + dev->RawClose = Close; + dev->Pause = Pause; + + w->AThreadRunning = true; + if(!(w->AThread = CreateThread(NULL, 0, AThreadMain, dev, 0, NULL))) + assert(0); + + return(dev); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + WASWrap *w = (WASWrap *)device->private_data; + int32_t bytes_in = w->BufferWBC - w->BufferRBC; + + assert(bytes_in >= 0); + + *can_write = std::max(0, (int32_t)w->BufferByteSize - bytes_in); + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + WASWrap *w = (WASWrap *)device->private_data; + const uint8_t* data8 = (uint8_t*)data; + + while(len > 0) + { + int32_t bytes_in = w->BufferWBC - w->BufferRBC; + int32_t cwt = w->BufferByteSizeSuper - bytes_in; + int32_t to_copy = std::min(cwt, len); + int32_t max_bs_copy = w->BufferByteSizeSuper - w->BufferWriteBytePos; + + //printf("%u - %d %d %d %d --- %08x %08x, %08x\n", len, bytes_in, cwt, to_copy, max_bs_copy, w->BufferWBC, w->BufferRBC, w->BufferByteSizeSuper); + assert(bytes_in >= 0); + assert(to_copy >= 0); + + memcpy((void*)(w->Buffer + w->BufferWriteBytePos), data8, std::min(to_copy, max_bs_copy)); + memcpy((void*)(w->Buffer), data8 + max_bs_copy, std::max(0, to_copy - max_bs_copy)); + + w->BufferWriteBytePos = (w->BufferWriteBytePos + to_copy) % w->BufferByteSizeSuper; + w->BufferWBC += to_copy; + data8 += to_copy; + len -= to_copy; + + if(len) + { + if(!w->AThreadRunning) + return(0); + + WaitForSingleObject(w->BufferReadEvent, 20); + } + } + + for(;;) + { + int32_t bytes_in = w->BufferWBC - w->BufferRBC; + int32_t tcw = (int32_t)w->BufferByteSize - bytes_in; + + assert(bytes_in >= 0); + + if(tcw >= 0) + break; + + if(!w->AThreadRunning) + return(0); + + WaitForSingleObject(w->BufferReadEvent, 20); + } + + return(1); +} + + + +static int Close(SexyAL_device *device) +{ + if(device) + { + if(device->private_data) + { + WASWrap *w = (WASWrap *)device->private_data; + + w->AThreadRunning = false; + if(w->AThread) + { + WaitForSingleObject(w->AThread, INFINITE); + CloseHandle(w->AThread); + w->AThread = NULL; + } + + if(w->immdev) + { + w->immdev->Release(); + w->immdev = NULL; + } + + if(w->ac) + { + w->ac->Release(); + w->ac = NULL; + } + + if(w->arc) + { + w->arc->Release(); + w->arc = NULL; + } + + if(w->evt != NULL) + { + CloseHandle(w->evt); + w->evt = NULL; + } + + if(w->BufferReadEvent != NULL) + { + CloseHandle(w->BufferReadEvent); + w->BufferReadEvent = NULL; + } + + if(w->avrt_dll != NULL) + { + FreeLibrary(w->avrt_dll); + w->avrt_dll = NULL; + } + + free(device->private_data); + } + + timeEndPeriod(1); + free(device); + + return(1); + } + return(0); +} + diff --git a/Mednafen/mednafen/sexyal/drivers/wasapish.cpp b/Mednafen/mednafen/sexyal/drivers/wasapish.cpp new file mode 100644 index 0000000000..7535c38914 --- /dev/null +++ b/Mednafen/mednafen/sexyal/drivers/wasapish.cpp @@ -0,0 +1,556 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../sexyal.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const CLSID LV_CLSID_MMDeviceEnumerator = { 0xbcde0395, 0xe52f, 0x467c, { 0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e} }; //__uuidof(MMDeviceEnumerator); +static const IID LV_IID_IMMDeviceEnumerator = { 0xa95664d2, 0x9614, 0x4f35, {0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6} }; //__uuidof(IMMDeviceEnumerator); +static const IID LV_IID_IAudioClient = { 0x1cb9ad4c, 0xdbfa, 0x4c32, {0xb1,0x78, 0xc2,0xf5,0x68,0xa7,0x03,0xb2} }; //__uuidof(IAudioClient); +static const IID LV_IID_IAudioRenderClient = {0xf294acfc, 0x3146, 0x4483, {0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2} }; //__uuidof(IAudioRenderClient); +static const GUID LV_KSDATAFORMAT_SUBTYPE_PCM = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; + +static const PROPERTYKEY LV_PKEY_Device_FriendlyName = { { 0xa45c254e, 0xdf1c, 0x4efd, { 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0 } }, 14 }; +static const PROPERTYKEY LV_PKEY_DeviceInterface_FriendlyName = { { 0x026e516e, 0xb814, 0x414b, { 0x83, 0xcd, 0x85, 0x6d, 0x6f, 0xef, 0x48, 0x22 } }, 2 }; + +struct WASWrap +{ + IMMDevice *immdev; + IAudioClient *ac; + IAudioRenderClient *arc; + HMODULE avrt_dll; + HANDLE WINAPI (*p_AvSetMmThreadCharacteristicsA)(LPCSTR TaskName, LPDWORD TaskIndex); + BOOL WINAPI (*p_AvRevertMmThreadCharacteristics)(HANDLE); + HANDLE evt; + HANDLE AThread; + UINT32 bfc; + + CRITICAL_SECTION crit; + + uint32_t BufferBPF; + + UINT32 recent_pad; + LARGE_INTEGER recent_time; + uint32_t written_since; + + LARGE_INTEGER qpc_freq; + + volatile char AThreadRunning; +}; + + +static int Close(SexyAL_device *device); +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write); +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len); + +static int Pause(SexyAL_device *device, int state) +{ + return(0); +} + +static DWORD WINAPI AThreadMain(LPVOID param) +{ + SexyAL_device *dev = (SexyAL_device*)param; + WASWrap *w = (WASWrap*)dev->private_data; + DWORD task_index = 0; + HANDLE avh = NULL; + + SetThreadPriority(w->AThread, THREAD_PRIORITY_TIME_CRITICAL); + + if(w->p_AvSetMmThreadCharacteristicsA) + avh = w->p_AvSetMmThreadCharacteristicsA("Pro Audio", &task_index); + + while(w->AThreadRunning) + { + UINT32 paddie = 0; + LARGE_INTEGER ct; + + if(WaitForSingleObject(w->evt, 100) == WAIT_OBJECT_0) + { + if(QueryPerformanceCounter(&ct) != 0) + { + EnterCriticalSection(&w->crit); + if(w->ac->GetCurrentPadding(&paddie) == S_OK) + { + w->recent_pad = paddie; + w->recent_time = ct; + w->written_since = 0; + } + LeaveCriticalSection(&w->crit); + } + } + } + + if(avh != NULL) + { + w->p_AvRevertMmThreadCharacteristics(avh); + avh = NULL; + } + + w->AThreadRunning = false; + return(0); +} + +static void Cleanup(SexyAL_device* device) +{ + if(device) + { + if(device->private_data) + { + WASWrap *w = (WASWrap *)device->private_data; + + w->AThreadRunning = false; + if(w->AThread) + { + WaitForSingleObject(w->AThread, INFINITE); + CloseHandle(w->AThread); + DeleteCriticalSection(&w->crit); + w->AThread = NULL; + } + + if(w->immdev) + { + w->immdev->Release(); + w->immdev = NULL; + } + + if(w->ac) + { + w->ac->Release(); + w->ac = NULL; + } + + if(w->arc) + { + w->arc->Release(); + w->arc = NULL; + } + + if(w->evt != NULL) + { + CloseHandle(w->evt); + w->evt = NULL; + } + + if(w->avrt_dll != NULL) + { + FreeLibrary(w->avrt_dll); + w->avrt_dll = NULL; + } + + free(device->private_data); + } + + timeEndPeriod(1); + free(device); + } +} + +bool SexyALI_WASAPISH_Avail(void) +{ + IMMDeviceEnumerator *imd = NULL; + HRESULT hr; + + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if(hr != S_OK && hr != S_FALSE) + return(false); + + hr = CoCreateInstance(LV_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, LV_IID_IMMDeviceEnumerator, (void**)&imd); + if(FAILED(hr)) + return(false); + + imd->Release(); + + return(true); +} + +#define TRYHR(n) { HRESULT hrtmp = (n); if(FAILED(hrtmp)) { printf(#n " failed: 0x%08x\n", (unsigned)hrtmp); Cleanup(dev); return(NULL); } } +SexyAL_device *SexyALI_WASAPISH_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering) +{ + SexyAL_device *dev; + WASWrap *w; + IMMDeviceEnumerator *immdeven = NULL; + WAVEFORMATEXTENSIBLE wfe; + HRESULT hr; + + if(!(dev = (SexyAL_device *)calloc(1, sizeof(SexyAL_device)))) + { + printf("calloc failed.\n"); + return(NULL); + } + timeBeginPeriod(1); + + w = (WASWrap *)calloc(1, sizeof(WASWrap)); + dev->private_data = w; + if(!w) + { + printf("calloc failed.\n"); + Cleanup(dev); + return(NULL); + } + + // + // + // + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if(hr != S_OK && hr != S_FALSE) + { + printf("CoInitializeEx() failed: 0x%08x\n", (unsigned)hr); + Cleanup(dev); + return(NULL); + } + + //printf("NOODLES: 0x%08x 0x%08x\n", LV_CLSID_MMDeviceEnumerator.Data1, LV_IID_IMMDeviceEnumerator.Data1); + + TRYHR(CoCreateInstance(LV_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, LV_IID_IMMDeviceEnumerator, (void**)&immdeven)); + + if(id == NULL) + { + TRYHR(immdeven->GetDefaultAudioEndpoint(eRender, eConsole, &w->immdev)); + } + else + { + IMMDeviceCollection *devcoll = NULL; + UINT numdevs = 0; + wchar_t *id16 = (wchar_t *)calloc(strlen(id) + 1, sizeof(wchar_t)); + + w->immdev = NULL; + + MultiByteToWideChar(CP_UTF8, 0, id, -1, id16, strlen(id) + 1); + + TRYHR(immdeven->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &devcoll)); + TRYHR(devcoll->GetCount(&numdevs)); + + for(UINT i = 0; i < numdevs && w->immdev == NULL; i++) + { + IMMDevice *tmpdev = NULL; + IPropertyStore *props = NULL; + PROPVARIANT prop_fname; + + PropVariantInit(&prop_fname); + + TRYHR(devcoll->Item(i, &tmpdev)); + TRYHR(tmpdev->OpenPropertyStore(STGM_READ, &props)); + TRYHR(props->GetValue(LV_PKEY_Device_FriendlyName, &prop_fname)); + + printf("Device: %S\n", prop_fname.pwszVal); + + if(!wcscmp(id16, prop_fname.pwszVal)) + w->immdev = tmpdev; + else + { + tmpdev->Release(); + tmpdev = NULL; + } + + PropVariantClear(&prop_fname); + + if(props != NULL) + { + props->Release(); + props = NULL; + } + } + + if(id16 != NULL) + { + free(id16); + id16 = NULL; + } + + if(devcoll != NULL) + { + devcoll->Release(); + devcoll = NULL; + } + + if(w->immdev == NULL) + { + puts("Device not found!"); + Cleanup(dev); + return(NULL); + } + } + + TRYHR(w->immdev->Activate(LV_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&w->ac)); + + { + WAVEFORMATEX *mf = NULL; + + TRYHR(w->ac->GetMixFormat(&mf)); + + memcpy(&wfe, mf, std::min(sizeof(WAVEFORMATEXTENSIBLE), sizeof(WAVEFORMATEX) + mf->cbSize)); + if(wfe.Format.cbSize > 22) + wfe.Format.cbSize = 22; + + wfe.Format.wBitsPerSample = 16; + wfe.Format.nBlockAlign = (wfe.Format.nChannels * wfe.Format.wBitsPerSample) / 8; + wfe.Format.nAvgBytesPerSec = wfe.Format.nSamplesPerSec * wfe.Format.nBlockAlign; + + if(wfe.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE) + { + wfe.Samples.wValidBitsPerSample = wfe.Format.wBitsPerSample; + wfe.SubFormat = LV_KSDATAFORMAT_SUBTYPE_PCM; + } + else + { + wfe.Format.wFormatTag = WAVE_FORMAT_PCM; + } + + CoTaskMemFree(mf); + } + + format->rate = wfe.Format.nSamplesPerSec; + format->sampformat = ((wfe.Format.wBitsPerSample >> 3) << 4) | 1; + + if(wfe.Format.wBitsPerSample == 32) + format->sampformat |= 2; + + format->channels = wfe.Format.nChannels; + format->revbyteorder = false; + format->noninterleaved = false; + + // + // + // + { + REFERENCE_TIME raw_ac_latency; + int32_t des_effbuftime = buffering->ms ? buffering->ms : 52; + int32_t des_effbufsize = (int64_t)des_effbuftime * wfe.Format.nSamplesPerSec / 1000; + int32_t des_realbuftime = des_effbuftime + 40; + + //printf("%u\n", wfe.Format.wFormatTag); + //printf("%u\n", wfe.Format.nChannels); + //printf("%u\n", wfe.Format.nSamplesPerSec); + + //printf("%u\n", wfe.Format.wBitsPerSample); + //printf("%u\n", wfe.Format.nBlockAlign); + //printf("%u\n", wfe.Format.nAvgBytesPerSec); + + TRYHR(w->ac->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_EVENTCALLBACK, (REFERENCE_TIME)des_realbuftime * 10000, 0, (WAVEFORMATEX*)&wfe, NULL)); + + TRYHR(w->ac->GetBufferSize(&w->bfc)); + + TRYHR(w->ac->GetStreamLatency(&raw_ac_latency)); + + w->BufferBPF = wfe.Format.wBitsPerSample / 8 * wfe.Format.nChannels; + + buffering->buffer_size = std::min(des_effbufsize, w->bfc); + buffering->period_size = 0; + buffering->latency = buffering->buffer_size + (((int64_t)raw_ac_latency * format->rate + 5000000) / 10000000); + buffering->bt_gran = 0; + } + + if(!(w->evt = CreateEvent(NULL, FALSE, FALSE, NULL))) + { + printf("Error creating event.\n"); + Cleanup(dev); + return(NULL); + } + + if((w->avrt_dll = LoadLibrary("avrt.dll")) != NULL) + { + if(!(w->p_AvSetMmThreadCharacteristicsA = (HANDLE WINAPI (*)(LPCSTR, LPDWORD))(GetProcAddress(w->avrt_dll, "AvSetMmThreadCharacteristicsA")))) + { + printf("Error getting pointer to AvSetMmThreadCharacteristicsA.\n"); + Cleanup(dev); + return(NULL); + } + + if(!(w->p_AvRevertMmThreadCharacteristics = (BOOL WINAPI (*)(HANDLE))(GetProcAddress(w->avrt_dll, "AvRevertMmThreadCharacteristics")))) + { + printf("Error getting pointer to AvRevertMmThreadCharacteristics.\n"); + Cleanup(dev); + return(NULL); + } + } + + TRYHR(w->ac->SetEventHandle(w->evt)); + + TRYHR(w->ac->GetService(LV_IID_IAudioRenderClient, (void**)&w->arc)); + + memcpy(&dev->buffering, buffering, sizeof(SexyAL_buffering)); + memcpy(&dev->format, format, sizeof(SexyAL_format)); + dev->RawWrite = RawWrite; + dev->RawCanWrite = RawCanWrite; + dev->RawClose = Close; + dev->Pause = Pause; + + // + // Clear buffer. + // + { + BYTE *bd; + + TRYHR(w->arc->GetBuffer(w->bfc, &bd)); + + memset(bd, 0, w->bfc * w->BufferBPF); + + w->arc->ReleaseBuffer(w->bfc, 0); + } + +#if 0 + { + UINT32 paddie = 0; + + printf("buffer_size=%u\n", buffering->buffer_size); + printf("bfc=%u\n", w->bfc); + w->ac->GetCurrentPadding(&paddie); + printf("paddie=%u\n", paddie); + printf("snoo=%d\n", (int)buffering->buffer_size - paddie); + } +#endif + + TRYHR(w->ac->Start()); + + if(QueryPerformanceFrequency(&w->qpc_freq) == 0) + { + printf("QueryPerformanceFrequency() failed.\n"); + Cleanup(dev); + return(NULL); + } + + //printf("qpc_freq=%f\n", (double)w->qpc_freq.QuadPart); + + w->AThreadRunning = true; + if(!(w->AThread = CreateThread(NULL, 0, AThreadMain, dev, CREATE_SUSPENDED, NULL))) + { + printf("Error creating thread.\n"); + Cleanup(dev); + return(NULL); + } + InitializeCriticalSection(&w->crit); + ResumeThread(w->AThread); + + return(dev); +} + +static inline int64_t MooCowGoesMoo(SexyAL_device *device) +{ + WASWrap *w = (WASWrap *)device->private_data; + UINT32 local_recent_pad; + LARGE_INTEGER local_recent_time; + LARGE_INTEGER current_time; + uint32_t local_written_since; + int64_t extra_prec; + + current_time.QuadPart = 0; + + // + EnterCriticalSection(&w->crit); + + local_recent_pad = w->recent_pad; + local_recent_time = w->recent_time; + local_written_since = w->written_since; + + LeaveCriticalSection(&w->crit); + // + + QueryPerformanceCounter(¤t_time); + + if(current_time.QuadPart < local_recent_time.QuadPart) + current_time.QuadPart = local_recent_time.QuadPart; + +#if 1 + extra_prec = (int64_t)(((double)(current_time.QuadPart - local_recent_time.QuadPart) / w->qpc_freq.QuadPart) * device->format.rate) - local_written_since; +#else + w->ac->GetCurrentPadding(&local_recent_pad); + extra_prec = 0; +#endif + + return std::min(device->buffering.buffer_size, ((int64_t)device->buffering.buffer_size - local_recent_pad) + extra_prec); +} + +static int RawCanWrite(SexyAL_device *device, uint32_t *can_write) +{ + WASWrap *w = (WASWrap *)device->private_data; + + *can_write = std::max(0, w->BufferBPF * MooCowGoesMoo(device)); + + return(1); +} + +static int RawWrite(SexyAL_device *device, const void *data, uint32_t len) +{ + WASWrap *w = (WASWrap *)device->private_data; + const uint8_t* data8 = (uint8_t*)data; + + while(len > 0) + { + HRESULT hr; + UINT32 paddie = 0; + UINT32 toget; + BYTE *bd; + + if(w->ac->GetCurrentPadding(&paddie) != S_OK) + return(0); + + toget = std::min(w->bfc - paddie, (len / w->BufferBPF)); + + EnterCriticalSection(&w->crit); + if((hr = w->arc->GetBuffer(toget, &bd)) == S_OK) + { + memcpy(bd, data8, toget * w->BufferBPF); + w->arc->ReleaseBuffer(toget, 0); + w->written_since += toget; + } + LeaveCriticalSection(&w->crit); + + if(hr != S_OK) + return(0); + + data8 += toget * w->BufferBPF; + len -= toget * w->BufferBPF; + + if(len > 0) + Sleep(1); + } + + for(;;) + { + int64_t milk = MooCowGoesMoo(device); + + if(milk >= -(int64_t)(device->format.rate / 2000)) + break; + + Sleep(std::max(1, -milk * 1000 / device->format.rate)); + } + + return(1); +} + + + +static int Close(SexyAL_device *device) +{ + if(device) + { + Cleanup(device); + return(1); + } + return(0); +} + diff --git a/Mednafen/mednafen/sexyal/sexyal.cpp b/Mednafen/mednafen/sexyal/sexyal.cpp new file mode 100644 index 0000000000..bb75cf7a41 --- /dev/null +++ b/Mednafen/mednafen/sexyal/sexyal.cpp @@ -0,0 +1,436 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "sexyal.h" + +#include +#include +#include // For debugging +#include + +#ifdef HAVE_GETTIMEOFDAY +#include +#endif + +#include +#include + +#include "convert.h" + +/* kludge. yay. */ +SexyAL_enumdevice *SexyALI_OSS_EnumerateDevices(void); +SexyAL_device *SexyALI_OSS_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_JACK_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_SDL_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_DSound_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); + +#if HAVE_WASAPI +SexyAL_device *SexyALI_WASAPI_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_WASAPISH_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); + +bool SexyALI_WASAPI_Avail(void); +bool SexyALI_WASAPISH_Avail(void); +#endif + +#ifdef HAVE_ALSA +SexyAL_enumdevice *SexyALI_ALSA_EnumerateDevices(void); +SexyAL_device *SexyALI_ALSA_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +#endif + +#ifdef DOS +SexyAL_device *SexyALI_DOS_SB_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_DOS_ES1370_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_DOS_ES1371_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); +SexyAL_device *SexyALI_DOS_CMI8738_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); + +// +// Doing it this way results in questionable semantics with multiple sound cards of the same type coupled with user-configured non-default device selection, +// but it'll suffice for now. +bool SexyALI_DOS_SB_Avail(void); +bool SexyALI_DOS_ES1370_Avail(void); +bool SexyALI_DOS_ES1371_Avail(void); +bool SexyALI_DOS_CMI8738_Avail(void); +#endif + +SexyAL_device *SexyALI_Dummy_Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); + + +static uint32_t FtoB(const SexyAL_format *format, uint32_t frames) +{ + return(frames*format->channels*(format->sampformat>>4)); +} + +static uint32_t BtoF(const SexyAL_format *format, uint32_t bytes) +{ + return(bytes / (format->channels * (format->sampformat>>4))); +} + +static uint32_t CanWrite(SexyAL_device *device) +{ + uint32_t bytes; + + if(!device->RawCanWrite(device, &bytes)) + return(0); + + return(BtoF(&device->format, bytes)); +} + +static int Write(SexyAL_device *device, void *data, uint32_t frames) +{ + assert(device->srcformat.noninterleaved == false); + + if(device->srcformat.sampformat == device->format.sampformat && + device->srcformat.channels == device->format.channels && + device->srcformat.rate == device->format.rate && + device->srcformat.revbyteorder == device->format.revbyteorder && + device->srcformat.noninterleaved == device->format.noninterleaved) + { + if(!device->RawWrite(device, data, FtoB(&device->format, frames))) + return(0); + } + else + { + const uint8_t *data_in = (const uint8_t *)data; + + while(frames) + { + uint32_t convert_this_iteration; + + convert_this_iteration = frames; + + if(convert_this_iteration > device->convert_buffer_fsize) + convert_this_iteration = device->convert_buffer_fsize; + + SexiALI_Convert(&device->srcformat, &device->format, data_in, device->convert_buffer, convert_this_iteration); + + if(!device->RawWrite(device, device->convert_buffer, FtoB(&device->format, convert_this_iteration))) + return(0); + + frames -= convert_this_iteration; + data_in += FtoB(&device->srcformat, convert_this_iteration); + } + } + + return(1); +} + +static int Close(SexyAL_device *device) +{ + if(device->convert_buffer) + { + free(device->convert_buffer); + device->convert_buffer = NULL; + } + + return(device->RawClose(device)); +} + +int SetConvert(struct __SexyAL_device *device, SexyAL_format *format) +{ + memcpy(&device->srcformat,format,sizeof(SexyAL_format)); + return(1); +} + +struct SexyAL_driver +{ + int type; + const char *name; + const char *short_name; + + SexyAL_device * (*Open)(const char *id, SexyAL_format *format, SexyAL_buffering *buffering); + SexyAL_enumdevice *(*EnumerateDevices)(void); + bool (*Avail)(void); // Optional. Returns true if API/layer is available, false if not. +}; + +static SexyAL_driver drivers[] = +{ + #if HAVE_ALSA + { SEXYAL_TYPE_ALSA, "ALSA", "alsa", SexyALI_ALSA_Open, SexyALI_ALSA_EnumerateDevices }, + #endif + + #if HAVE_OSSDSP + { SEXYAL_TYPE_OSSDSP, "OSS(/dev/dsp*)", "oss", SexyALI_OSS_Open, SexyALI_OSS_EnumerateDevices }, + #endif + + // + // WASAPISH should have higher priority(comes before in this array) than dsound. + // + #if HAVE_WASAPI + { SEXYAL_TYPE_WASAPISH, "WASAPI(Shared mode)", "wasapish", SexyALI_WASAPISH_Open, NULL, SexyALI_WASAPISH_Avail }, + #endif + + #if HAVE_DIRECTSOUND + { SEXYAL_TYPE_DIRECTSOUND, "DirectSound", "dsound", SexyALI_DSound_Open, NULL }, + #endif + + #if HAVE_WASAPI + { SEXYAL_TYPE_WASAPI, "WASAPI(Exclusive mode)", "wasapi", SexyALI_WASAPI_Open, NULL, SexyALI_WASAPI_Avail }, + #endif + + #ifdef DOS + // + // List SB first, to try to prevent fubaring a PCI sound card's active Sound Blaster emulation(if present) by directly programming its PCI registers. + // + { SEXYAL_TYPE_DOS_SB, "Sound Blaster 2.0/Pro/16", "sb", SexyALI_DOS_SB_Open, NULL, SexyALI_DOS_SB_Avail }, + { SEXYAL_TYPE_DOS_ES1370, "Ensoniq ES1370", "es1370", SexyALI_DOS_ES1370_Open, NULL, SexyALI_DOS_ES1370_Avail }, + { SEXYAL_TYPE_DOS_ES1371, "Ensoniq ES1371", "es1371", SexyALI_DOS_ES1371_Open, NULL, SexyALI_DOS_ES1371_Avail }, + { SEXYAL_TYPE_DOS_CMI8738, "CMI8738", "cmi8738", SexyALI_DOS_CMI8738_Open, NULL, SexyALI_DOS_CMI8738_Avail }, + #endif + + // + // Keep SDL higher priority than JACK. + // + #if HAVE_SDL + { SEXYAL_TYPE_SDL, "SDL", "sdl", SexyALI_SDL_Open, NULL }, + #endif + + #if HAVE_JACK + { SEXYAL_TYPE_JACK, "JACK", "jack", SexyALI_JACK_Open, NULL }, + #endif + + { SEXYAL_TYPE_DUMMY, "Dummy", "dummy", SexyALI_Dummy_Open, NULL }, + + { 0, NULL, NULL, NULL, NULL } +}; + +static SexyAL_driver *FindDriver(int type) +{ + int x = 0; + + while(drivers[x].name) + { + if(drivers[x].type == type) + return(&drivers[x]); + + x++; + } + return(0); +} + +SexyAL_device *SexyAL::Open(const char *id, SexyAL_format *format, SexyAL_buffering *buffering, int type) +{ + SexyAL_device *ret; + SexyAL_driver *driver; + + driver = ::FindDriver(type); + if(!driver) + return(0); + + if(id && id[0] == 0) // Set pointer to NULL on empty string. + id = NULL; + + if(id) + { + if(!strcmp(id, "default")) + id = NULL; + else if(!strncmp(id, "sexyal-literal-", strlen("sexyal-literal-"))) + id += strlen("sexyal-literal-"); + } + + assert(format->rate >= 8192 && format->rate <= (1024 * 1024)); + assert(format->channels == 1 || format->channels == 2); + assert(0 == format->noninterleaved); + assert(0 == format->revbyteorder); + + assert(0 == buffering->buffer_size); + assert(0 == buffering->period_size); + assert(0 == buffering->latency); + assert(0 == buffering->bt_gran); + + if(!(ret = driver->Open(id, format, buffering))) + return(0); + + assert(0 != buffering->buffer_size); + //assert(0 != buffering->period_size); + assert(0 != buffering->latency); + + buffering->ms = (uint64_t)buffering->buffer_size * 1000 / format->rate; + buffering->period_us = (uint64_t)buffering->period_size * (1000 * 1000) / format->rate; + + ret->convert_buffer_fsize = (25 * format->rate + 999) / 1000; + if(!(ret->convert_buffer = calloc(format->channels * (format->sampformat >> 4), ret->convert_buffer_fsize))) + { + ret->RawClose(ret); + return(0); + } + + ret->Write = Write; + ret->Close = Close; + ret->CanWrite = CanWrite; + ret->SetConvert = SetConvert; + + return(ret); +} + +std::vector SexyAL::GetDriverList(void) +{ + std::vector ret; + + for(int x = 0; drivers[x].name; x++) + { + SexyAL_DriverInfo di; + + di.short_name = drivers[x].short_name; + di.name = drivers[x].name; + di.type = drivers[x].type; + + ret.push_back(di); + } + + return(ret); +} + +bool SexyAL::FindDriver(SexyAL_DriverInfo* out_di, const char* name) +{ + bool need_default = ((name == NULL) || !strcasecmp(name, "default")); + + for(int x = 0; drivers[x].name; x++) + { + if(need_default) + { + if(drivers[x].Avail && !drivers[x].Avail()) + continue; + } + else if(strcasecmp(drivers[x].short_name, name)) + continue; + + out_di->short_name = drivers[x].short_name; + out_di->name = drivers[x].name; + out_di->type = drivers[x].type; + + return(true); + } + + return(false); +} + +SexyAL_enumdevice* SexyAL::EnumerateDevices(int type) +{ + SexyAL_driver *driver; + + driver = ::FindDriver(type); + + if(!driver) + return(0); + + if(driver->EnumerateDevices) + return(driver->EnumerateDevices()); + + return(0); +} + +SexyAL::SexyAL() +{ + +} + +SexyAL::~SexyAL() +{ + +} + +// Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 +// Rounds up to the nearest power of 2. +uint32_t SexyAL_rupow2(uint32_t v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + + v += (v == 0); + + return(v); +} + +int32_t SexyAL_rnearestpow2(int32_t v, bool round_halfway_up) +{ + int32_t upper, lower; + int32_t diff_upper, diff_lower; + + upper = SexyAL_rupow2(v); + lower = upper >> 1; + + if(!lower) + lower = 1; + + diff_upper = abs(v - upper); + diff_lower = abs(v - lower); + + if(diff_upper == diff_lower) + { + return(round_halfway_up ? upper : lower); + } + else if(diff_upper < diff_lower) + return(upper); + + return(lower); +} + +// Returns (preferably-monotonic) time in microseconds. +int64_t SexyAL_Time64(void) +{ + static bool cgt_fail_warning = 0; + + #if HAVE_CLOCK_GETTIME && ( _POSIX_MONOTONIC_CLOCK > 0 || defined(CLOCK_MONOTONIC)) + struct timespec tp; + + if(clock_gettime(CLOCK_MONOTONIC, &tp) == -1) + { + if(!cgt_fail_warning) + printf("clock_gettime() failed: %s\n", strerror(errno)); + cgt_fail_warning = 1; + } + else + { + static bool res_test = 0; + struct timespec res; + + if(!res_test && clock_getres(CLOCK_MONOTONIC, &res) != -1) + { + printf("%lld %ld\n", (long long)res.tv_sec, (long)res.tv_nsec); + res_test = 1; + } + + return((int64_t)tp.tv_sec * (1000 * 1000) + tp.tv_nsec / 1000); + } + #else + #warning "SexyAL: clock_gettime() with CLOCK_MONOTONIC not available" + #endif + + + #if HAVE_GETTIMEOFDAY + // Warning: gettimeofday() is not guaranteed to be monotonic!! + struct timeval tv; + + if(gettimeofday(&tv, NULL) == -1) + { + puts("gettimeofday() error"); + return(0); + } + + return((int64_t)tv.tv_sec * 1000000 + tv.tv_usec); + #else + #warning "SexyAL: gettimeofday() not available!!!" + #endif + + // Yeaaah, this isn't going to work so well. + return((int64_t)time(NULL) * 1000000); +} diff --git a/Mednafen/mednafen/sexyal/sexyal.h b/Mednafen/mednafen/sexyal/sexyal.h new file mode 100644 index 0000000000..fdbd902f5e --- /dev/null +++ b/Mednafen/mednafen/sexyal/sexyal.h @@ -0,0 +1,219 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +struct SexyAL_DriverInfo +{ + // Pointers to statically-allocated strings, DO NOT FREE. + const char* short_name; + const char* name; + int type; +}; + +typedef struct +{ + uint32_t sampformat; + uint32_t channels; /* 1 = mono, 2 = stereo (actual device output channels will be 1<=ch<=8, however, + source format MUST be 1 or 2, since the converter can't handle other numbers of source + channels) */ + uint32_t rate; /* Number of frames per second, 22050, 44100, etc. */ + bool revbyteorder; /* 0 = Native(to CPU), 1 = Reversed. PDP can go to hell. */ + bool noninterleaved; /* 0 = Interleaved multichannel audio(stereo), 1 = Non-Interleaved */ +} SexyAL_format; + +typedef struct +{ + /* Inputs(requested) and Outputs(obtained; dev-note: ms and period_us outputs calculated by core SexyAL code, not sound device interface/driver code) */ + uint32_t ms; /* Desired buffer size, in milliseconds. */ + uint32_t period_us; /* Desired period size, in MICROseconds */ + bool overhead_kludge; /* If true, and ms is non-zero, and we're using driver "dsound", add 20 to ms when calculating the buffer size. + + Implemented this way to preserve "sound.buffer_time" setting semantics from older versions of Mednafen. + */ + + /* Outputs Only(obtained) */ + uint32_t buffer_size; /* Buffer size(as in the maximum value returned by CanWrite()). In frames. */ + uint32_t period_size; /* Period/Fragment size. In frames. */ + uint32_t latency; /* Estimated total latency(between first Write() and actual sound output; essentially equal to the maximum value of + CanWrite() plus any additional internal or external buffering). In frames. */ + + uint32_t bt_gran; /* Buffer timing granularity(RawWrite() blocking, RawCanWrite() granularity), best-case. In frames. + If 0, period_size is the granularity. */ + + //uint32_t ms; /* Milliseconds of buffering, approximate(application code should set this value to control buffer size). */ + //uint32_t period_time; /* If non-zero, specifies the desired period/fragment size, in frames. */ + //uint32_t size; /* Shouldn't be filled in by application code. */ + //uint32_t latency; /* Estimated latency between Write() and sound output, in frames. */ +} SexyAL_buffering; + + +// Bits 4 through 7 should reflect the byte count for each sample. +// If the format is integer PCM, bit 0 should be 0 if unsigned, 1 if signed. +enum +{ + SEXYAL_FMT_PCMU8 = 0x10, + SEXYAL_FMT_PCMS8 = 0x11, + SEXYAL_FMT_PCMU16 = 0x20, + SEXYAL_FMT_PCMS16 = 0x21, + + SEXYAL_FMT_PCMU24 = 0x40, + SEXYAL_FMT_PCMS24 = 0x41, + + SEXYAL_FMT_PCMU32 = 0x42, + SEXYAL_FMT_PCMS32 = 0x43, + + SEXYAL_FMT_PCMFLOAT = 0x4F // 32-bit floating point +}; + +#if 0 +class SexyAL_Device +{ + public: + + SexyAL_Device(); + + virtual ~SexyAL_Device() + { + Close(); + } + + virtual int Open(const char *id, const SexyAL_format *format, const SexyAL_buffering *buffering, + SexyAL_format *got_format, SexyAL_buffering *got_buffering); + + virtual int Close(void); + + virtual int Pause(int state); + virtual int Clear(void); + + virtual int RawWrite(uint32_t bytes); + virtual int RawCanWrite(uint32_t *can_write); + + protected: + SexyAL_format format; + SexyAL_buffering buffering; +}; +#endif + +typedef struct __SexyAL_device +{ + int (*SetConvert)(struct __SexyAL_device *, SexyAL_format *); + int (*Write)(struct __SexyAL_device *, void *data, uint32_t frames); + + + // Returns the number of frames that can be written via Write() without blocking. + // This number may be partially estimated for some drivers, and it may be higher than the actual + // amount of data that can be written without blocking. Additionally, it will not be higher + // than the buffer size(unless there's a bug somewhere ;) ). + // So, try to use this function for advisory timing purposes only. + uint32_t (*CanWrite)(struct __SexyAL_device *); + + int (*Close)(struct __SexyAL_device *); + + // Returns 1 on success, 0 on failure(failure if the new pause state equals the old pause state, or another + // problem occurs). + int (*Pause)(struct __SexyAL_device *, int state); + + // Clears all audio data pending play on the output device. + // Returns 1 on success, 0 on failure. + int (*Clear)(struct __SexyAL_device *); + + // Writes "bytes" bytes of data from "data" to the device, blocking if necessary. + // Returns 1 on success, 0 on failure(probably fatal). + int (*RawWrite)(struct __SexyAL_device *, const void *data, uint32_t bytes); + + // Sets *count to the number of bytes that can be written to the device without blocking. + // Returns 1 on success, 0 on failure(probably fatal). + int (*RawCanWrite)(struct __SexyAL_device *, uint32_t *can_write); + + // Closes the device. + // Returns 1 on success, 0 on failure(failure should indicate some resources may be left open/allocated due to + // an erro, but calling RawClose() again is illegal). + int (*RawClose)(struct __SexyAL_device *); + + SexyAL_format format; + SexyAL_format srcformat; + SexyAL_buffering buffering; + void *private_data; + + void *convert_buffer; + uint32_t convert_buffer_fsize; +} SexyAL_device; + +typedef struct __SexyAL_enumdevice +{ + char *name; + char *id; + struct __SexyAL_enumdevice *next; +} SexyAL_enumdevice; + +enum +{ + SEXYAL_TYPE_OSSDSP = 0x001, + SEXYAL_TYPE_ALSA = 0x002, + + SEXYAL_TYPE_DIRECTSOUND = 0x010, + SEXYAL_TYPE_WASAPI = 0x011, + SEXYAL_TYPE_WASAPISH = 0x012, + + SEXYAL_OSX_COREAUDIO = 0x030, /* TODO */ + + SEXYAL_TYPE_ESOUND = 0x100, + SEXYAL_TYPE_JACK = 0x101, + SEXYAL_TYPE_SDL = 0x102, + + SEXYAL_TYPE_DOS_SB = 0x180, + SEXYAL_TYPE_DOS_ES1370 = 0x181, + SEXYAL_TYPE_DOS_ES1371 = 0x182, + SEXYAL_TYPE_DOS_CMI8738 = 0x183, + + SEXYAL_TYPE_DUMMY = 0x1FF +}; + +class SexyAL +{ + public: + + SexyAL(); + ~SexyAL(); + + SexyAL_device* Open(const char *id, SexyAL_format *, SexyAL_buffering *buffering, int type); + + SexyAL_enumdevice* EnumerateDevices(int type); + + // + // Returns a list(vector :p) describing drivers that are compiled-in. + // + std::vector GetDriverList(void); + + // + // To find the default driver, set name to NULL or "default" + // + bool FindDriver(SexyAL_DriverInfo* out_di, const char* name); +}; + +/* Utility functions: */ +uint32_t SexyAL_rupow2(uint32_t v); +int32_t SexyAL_rnearestpow2(int32_t v, bool round_halfway_up = true); +int64_t SexyAL_Time64(void); diff --git a/Mednafen/mednafen/sms/Makefile.am b/Mednafen/mednafen/sms/Makefile.am new file mode 100644 index 0000000000..91b34dcb9e --- /dev/null +++ b/Mednafen/mednafen/sms/Makefile.am @@ -0,0 +1,10 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libsms.a + +sms_SOURCES = cart.cpp memz80.cpp pio.cpp render.cpp romdb.cpp sms.cpp sound.cpp system.cpp tms.cpp vdp.cpp + +libsms_a_SOURCES = $(sms_SOURCES) + diff --git a/Mednafen/mednafen/sms/Makefile.in b/Mednafen/mednafen/sms/Makefile.in new file mode 100644 index 0000000000..e6a54097a8 --- /dev/null +++ b/Mednafen/mednafen/sms/Makefile.in @@ -0,0 +1,689 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/sms +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libsms_a_AR = $(AR) $(ARFLAGS) +libsms_a_LIBADD = +am__objects_1 = cart.$(OBJEXT) memz80.$(OBJEXT) pio.$(OBJEXT) \ + render.$(OBJEXT) romdb.$(OBJEXT) sms.$(OBJEXT) sound.$(OBJEXT) \ + system.$(OBJEXT) tms.$(OBJEXT) vdp.$(OBJEXT) +am_libsms_a_OBJECTS = $(am__objects_1) +libsms_a_OBJECTS = $(am_libsms_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libsms_a_SOURCES) +DIST_SOURCES = $(libsms_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libsms.a +sms_SOURCES = cart.cpp memz80.cpp pio.cpp render.cpp romdb.cpp sms.cpp sound.cpp system.cpp tms.cpp vdp.cpp +libsms_a_SOURCES = $(sms_SOURCES) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/sms/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/sms/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libsms.a: $(libsms_a_OBJECTS) $(libsms_a_DEPENDENCIES) $(EXTRA_libsms_a_DEPENDENCIES) + $(AM_V_at)-rm -f libsms.a + $(AM_V_AR)$(libsms_a_AR) libsms.a $(libsms_a_OBJECTS) $(libsms_a_LIBADD) + $(AM_V_at)$(RANLIB) libsms.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memz80.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/romdb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sms.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/system.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tms.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vdp.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/sms/cart.cpp b/Mednafen/mednafen/sms/cart.cpp new file mode 100644 index 0000000000..733e49fcbf --- /dev/null +++ b/Mednafen/mednafen/sms/cart.cpp @@ -0,0 +1,306 @@ +/* + Copyright (C) 1998-2004 Charles MacDonald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "shared.h" +#include "romdb.h" +#include "cart.h" +#include +#include + +#include + +namespace MDFN_IEN_SMS +{ + +static uint8 *rom = NULL; +static uint8 pages; +static uint32 page_mask8; +static uint32 page_mask16; +static uint32 rom_mask; +static uint32 crc; +static int mapper; +static uint8 *sram = NULL; + +static uint8 fcr[4]; +static uint8 BankAdd; + +static uint8 CodeMasters_Bank[3]; + +static uint8 *CastleRAM = NULL; + +static void writemem_mapper_sega(uint16 A, uint8 V) +{ + if(A >= 0xFFFC) + { + fcr[A & 0x3] = V; + if(A >= 0xFFFD) + { + static const int BankAddoo[4] = { 0x00, 0x18, 0x10, 0x08 }; + BankAdd = BankAddoo[fcr[0] & 0x3]; + } + } + if(fcr[0] & 0x3) + printf("%02x\n", fcr[0] & 0x3); +} + +static void writemem_mapper_codies(uint16 A, uint8 V) +{ + if(A < 0xC000) + { + if((CodeMasters_Bank[1] & 0x80) && (A >= 0xA000)) + sram[A & 0x1FFF] = V; + else + CodeMasters_Bank[A >> 14] = V; + } +} + +void Cart_Reset(void) +{ + CodeMasters_Bank[0] = 0; + CodeMasters_Bank[1] = 0; + CodeMasters_Bank[2] = 0; + + fcr[0] = 0x00; + fcr[1] = 0x00; + fcr[2] = 0x01; + fcr[3] = 0x02; + + BankAdd = 0x00; +} + +static const char *sms_mapper_string_table[] = +{ + "None", + "Sega", + "CodeMasters", + "32KiB ROM + 8KiB RAM", +}; + +void Cart_Init(MDFNFILE* fp) +{ + uint64 size = fp->size(); + + if(size & 512) + { + size &= ~512; + fp->seek(512, SEEK_SET); + } + + if(size > 1024 * 1024) + throw MDFN_Error(0, _("SMS/GG ROM image is too large.")); + + rom = (uint8*)MDFN_malloc_T(std::max(size, 0x2000), _("Cart ROM")); + if(size < 0x2000) + memset(rom + size, 0xFF, 0x2000 - size); + fp->read(rom, size); + + pages = size / 0x2000; + page_mask8 = round_up_pow2(pages) - 1; + page_mask16 = page_mask8 >> 1; + rom_mask = (round_up_pow2(pages) * 8192) - 1; + + crc = crc32(0, rom, size); + + md5_context md5; + md5.starts(); + md5.update(rom, size); + md5.finish(MDFNGameInfo->MD5); + + if(size <= 40960) + mapper = MAPPER_NONE; + else + mapper = MAPPER_SEGA; + + const rominfo_t *romi; + + if((romi = find_rom_in_db(crc))) + { + mapper = romi->mapper; + sms.display = romi->display; + sms.territory = romi->territory; + if(romi->system != -1) + sms.console = romi->system; + } + + if(mapper == MAPPER_CASTLE) + { + CastleRAM = (uint8 *)MDFN_calloc_T(1, 8192, _("Castle RAM")); + } + + sram = (uint8 *)MDFN_calloc_T(1, 0x8000, _("Cart SRAM")); + + MDFN_printf(_("ROM: %uKiB\n"), (unsigned)((size + 1023) / 1024)); + MDFN_printf(_("ROM CRC32: 0x%08x\n"), crc); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + MDFN_printf(_("Mapper: %s\n"), sms_mapper_string_table[mapper]); + MDFN_printf(_("Territory: %s\n"), (sms.territory == TERRITORY_DOMESTIC) ? _("Domestic") : _("Export")); +} + +void Cart_LoadNV(void) +{ + // Load battery-backed RAM, if any. + if(sram) + { + try + { + std::unique_ptr savegame_fp = MDFN_AmbigGZOpenHelper(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), std::vector({ 0x8000 })); + + savegame_fp->read(sram, 0x8000); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } +} + +void Cart_SaveNV(void) +{ + if(sram) + { + for(int i = 0; i < 0x8000; i++) + { + if(sram[i] != 0x00) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), sram, 0x8000, true); + break; + } + } + } +} + +void Cart_Close(void) +{ + if(rom) + { + MDFN_free(rom); + rom = NULL; + } + + if(CastleRAM) + { + MDFN_free(CastleRAM); + CastleRAM = NULL; + } + + if(sram) + { + MDFN_free(sram); + sram = NULL; + } +} + +void Cart_Write(uint16 A, uint8 V) +{ + if(mapper == MAPPER_CODIES) + writemem_mapper_codies(A, V); + else if(mapper == MAPPER_SEGA) + { + if(A >= 0x8000 && A < 0xC000) + { + if(fcr[0] & 0x8) + sram[((fcr[0] & 0x4) ? 0x4000 : 0x0000) + (A & 0x3FFF)] = V; + } + else + writemem_mapper_sega(A, V); + } + else if(mapper == MAPPER_CASTLE) + { + if(A >= 0x8000 && A <= 0xBFFF) + CastleRAM[A & 0x1FFF] = V; + } + else if(A < 0xc000) + printf("Bah: %04x %02x\n", A, V); +} + +uint8 Cart_Read(uint16 A) +{ + if(mapper == MAPPER_CODIES) + { + if(A < 0x4000) // 0 - 0x3fff + { + return(rom[(A & 0x3FFF) + ((CodeMasters_Bank[0] & page_mask16) << 14)]); + } + else if(A < 0x8000) // 0x4000 - 0x7FFF + { + return(rom[(A & 0x3FFF) + ((CodeMasters_Bank[1] & page_mask16) << 14)]); + } + else if(A < 0xC000) // 0x8000 - 0xBFFF + { + if((CodeMasters_Bank[1] & 0x80) && (A >= 0xA000)) + return(sram[A & 0x1FFF]); + + return(rom[(A & 0x3FFF) + ((CodeMasters_Bank[2] & page_mask16) << 14)]); + } + } + else if(mapper == MAPPER_SEGA) + { + if(A < 0x4000) + { + if(A < 0x0400) + return(rom[A]); + else + return(rom[(A & 0x3FFF) + (((fcr[1] + BankAdd) & page_mask16) << 14) ]); + } + else if(A < 0x8000) + { + return(rom[(A & 0x3FFF) + (((fcr[2] + BankAdd) & page_mask16) << 14) ]); + } + else if(A < 0xC000) + { + if(fcr[0] & 0x8) + return(sram[((fcr[0] & 0x4) ? 0x4000 : 0x0000) + (A & 0x3FFF)]); + else + return(rom[(A & 0x3FFF) + (((fcr[3] + BankAdd) & page_mask16) << 14) ]); + } + } + else if(mapper == MAPPER_CASTLE) + { + if(A >= 0x8000 && A <= 0xBFFF) + return(CastleRAM[A & 0x1FFF]); + else + return(rom[A & rom_mask]); + } + else + { + return(rom[A & rom_mask]); + } + return((((A >> 8) | data_bus_pullup) & ~data_bus_pulldown)); +} + +int Cart_StateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(sram, 0x8000), + SFARRAY(fcr, 4), + SFVAR(BankAdd), + SFARRAY(CodeMasters_Bank, 3), + SFARRAY(CastleRAM, CastleRAM ? 8192 : 0), + SFEND + }; + + int ret = 1; + + ret &= MDFNSS_StateAction(sm, load, data_only, StateRegs, "CART"); + + return(ret); +} + +} diff --git a/Mednafen/mednafen/sms/cart.h b/Mednafen/mednafen/sms/cart.h new file mode 100644 index 0000000000..131d4bd34a --- /dev/null +++ b/Mednafen/mednafen/sms/cart.h @@ -0,0 +1,21 @@ +#ifndef __SMS_CART_H +#define __SMS_CART_H + +namespace MDFN_IEN_SMS +{ + +void Cart_Init(MDFNFILE *fp); +void Cart_Close(void); + +void Cart_Reset(void); + +void Cart_LoadNV(void); +void Cart_SaveNV(void); + +void Cart_Write(uint16 A, uint8 V); +uint8 Cart_Read(uint16 A); + +int Cart_StateAction(StateMem *sm, int load, int data_only); + +} +#endif diff --git a/Mednafen/mednafen/sms/docs/changelog b/Mednafen/mednafen/sms/docs/changelog new file mode 100644 index 0000000000..cb575123fe --- /dev/null +++ b/Mednafen/mednafen/sms/docs/changelog @@ -0,0 +1,108 @@ + + Change log + + [1.2] + + - Fixed smptab allocation error. + - Various source code cleanups. + - Minor tweaks to sync with Mac source changes. + - New sound update code from Richard Bannister. + - Added more support for PAL hardware. + - Added partial support for Codemasters games. + - Fixed some aspects of ROM loading. + - Fixed SRAM restore bug in save states. + - Fixed viewport size check when going from extended to normal mode, which + fixes Fantastic Dizzy opening screen and V counter test program. + - Split up VDP emulation into SMS/GG/MD specific parts. + - Added support for different port I/O port memory maps. + - Fixed mapper restore bug in save states. + - Fixed UI key management in dos/main.c + - Improved HV counter emulation. + - Added dump VRAM keyboard shortcut. (Alt+V) + - Split up DOS code into different modules. + - Fixed EXT connector and related I/O port 2 behavior. + - Added GG I/O register emulation. + - Changed SRAM management. + - Modified use of reset/poweron/poweroff functions. + - Added configuration via CRC for some Codemasters games. + - Fixed implementation of GG input port. + - Added cycle counter feature to Z80 emulator. + - Added shutdown functions to other modules. + - Mapped 2nd player inputs to keyboard numeric pad in dos/main.c + - Fixed reset button handling in dos/main.c + - Moved Z80 port handlers to memz80.c + - Fixed console type assign in loadrom.c (removed TYPE_* defines) + - Added support for I/O chip disable control. + - Rewrote I/O chip emulation. + - Fixed pixel LUT to handle sprite collision behind high priority BG tiles. + - Added emulation of sprite overflow status flag. + - Added 'granularity' member to bitmap struct and fixed DOS blur code. + - Fixed FM sound restore on state load / FM emulator change. + - Corrected screen blanking width. + - Removed sprite limit disable feature. + - Added support for extended display modes. + - Added partial support for PAL display timing. + - Removed BMP_* macros, replaced with bitmap.viewport.* variables. + - Removed Y's (J) rendering hack that was problematic in other games. + - Added error logging routines. + - Removed Game Gear specific rendering speedups. + - Replaced cart.type with sms.console, replaced access with IS_GG macro. + - Renamed INPUT_SOFT_RESET to INPUT_RESET. Use for SMS games only. + - Removed INPUT_HARD_RESET, use system_reset() instead. + - Modified vdp_ctrl_w() to update address register LSB during leading write. + - Changed path length in wram/state/snap routines to PATH_MAX in DOS code. + - Added define to specify message length in DOS code. + - Added r/w handlers for FM detection latch access, renamed fm* -> fmunit* + - Added territory/console members to struct sms (removed sms.country). + Removed TYPE_* and replaced with TERRITORY_* enums. + - Fixed FM register restore during state load when sound is disabled. + - Updated memory system to support 1K pages. + - Updated zlib to 1.2.1 and unzip.c to 1.0 + - Moved sound management out of system.c into sound/sound.c,fmintf.c + - Moved state management out of system.c into state.c + - Rearranged header file include order in system.h + - Added support for MAME YM2413 emulator + - Abstracted FM sound chip interface to support both YM2413 emulators + - Updated timeline in dos/main.c and system.c + - Removed SSL logging + - Fixed path length in loadrom.c to MAX_PATH from limits.h + - Added library version display option to dos/main.c + - Moved file I/O code to fileio.c + - Fixed loadrom.c to support 16K ROM images + - Updated documentation and porting instructions + - Modified EMU2413 to have update function for 2-channel output + - Modified dos\config.c to ensure parameters are left during option parsing + - Modified YM2413 emulator to check for NULL pointer during shutdown + - Cleaned up variable names in snd struct + - Added default mixer callback + - Made sound_shutdown() free memory + - Modified sound_init() to allow re-initialization + - Cleaned up system.h, sms.h, vdp.h + - Optimized color expansion for paletteized 8-bit format in render.c + - Added Maxim's SN76489 emulator, removed the old one + - Added YM2413 context management + - Fixed PSG/FM state save/load behavior + + [0.9.4b] + + - Removed calls to text_mode() and changed textprintf() to textprintf_ex(). + for compatability with Allegro v4.1.11 (WIP). + - Removed VERSION from shared.h and add APP_NAME, APP_VERSION to system.h. + - Changed TYPE_OVERSEAS to TYPE_EXPORT in sms.h. + - Renamed dos.c/dos.h to main.c/main.h. + - Fixed FPS meter state display. + - Moved 1P buttons from ALT/LCTRL keys to S/A keys. + - Added work RAM dump feature (Alt+W). + - Added mostly complete HV counter tables to hvc.h. + - Rewrote VDP frame and line interrupt handling. + - Added ID and version number to state files. + - Removed vdp_run(), renamed sms_run() to system_run() in system.c. + - Merged cpu_reset() with sms_reset(). + - Consolidated parts of the ROM file loading routines. + - Increased resolution of GG palette (Mean Bean Machine intro). + - Fixed GG palette write handling (RoboCop 3 intro). + - Rewrote and optimized tile caching routines. + - Made SMS/GG palette brighter. + - Fixed leftmost column drawing in SMS mode. + - Upgraded Z80 CPU emulator from V2.7 to V3.3. + diff --git a/Mednafen/mednafen/sms/docs/compatability.txt b/Mednafen/mednafen/sms/docs/compatability.txt new file mode 100644 index 0000000000..7be90d9c63 --- /dev/null +++ b/Mednafen/mednafen/sms/docs/compatability.txt @@ -0,0 +1,14 @@ + + Cool Spot + + Menu area has gap after the screen blanking part. + Caused by new interrupt handling code. + + F16 Fighting Falcon, Rozetta no Shouzou + + Uses TMS9918 display modes which are not supported yet. + + Y's (J) + + Uses specific features of SMS 1 VDP. + diff --git a/Mednafen/mednafen/sms/docs/license b/Mednafen/mednafen/sms/docs/license new file mode 100644 index 0000000000..60549be514 --- /dev/null +++ b/Mednafen/mednafen/sms/docs/license @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Mednafen/mednafen/sms/docs/porting.txt b/Mednafen/mednafen/sms/docs/porting.txt new file mode 100644 index 0000000000..f281b2f1cb --- /dev/null +++ b/Mednafen/mednafen/sms/docs/porting.txt @@ -0,0 +1,454 @@ + + When you release a port, please include YOUR contact information for users + to report bugs and other problems. + + I get a ton of e-mails about a color problem in the Nokia P900 port of SMS + Plus because the author apparently included my e-mail address (please link + to my webpage instead) and listed NO contact information for him/herself. + + Also, let me know when you release a port, so I can forward these types + of e-mails appropriately. + + ---------------------------------------------------------------------------- + + What's changed for SMS Plus v1.2 + + I haven't finished up the porting notes so some things aren't covered yet; + look at the DOS source for an example. + + After calling system_init(), use the following functions: + + system_poweron() - Call once, can run game afterwards + system_reset() - Can call during gameplay if user wants a hard reset + system_poweroff() - Call once when done with a game. + + When loading multiple ROMs in a single session, you'd call poweroff() when + done with a game, then poweron() after the next one was loaded. + + SRAM is loaded when poweron() or reset() is called. + SRAM is saved when poweroff() is called. + + The SRAM management function has changed: + + void system_manage_sram(uint8 *sram, int slot, int mode); + + 'mode' is either SRAM_SAVE or SRAM_LOAD. + The slot parameter is ignored for now. + If there was SRAM to load, set sms.save = 1; + Otherwise, clear SRAM to zero. + See the DOS code for an implementation of this function. + + Sound emulation + + The following structure holds sound related information: + + struct { + + /* Input parameters */ + int sample_rate; + int fps; + uint32 psg_clock; + uint32 fm_clock; + int fm_which; + void (*mixer_callback)(int16 **stream, int16 **output, int length); + + /* Working data */ + int16 *stream[STREAM_MAX]; + int16 *output[2]; + + /* Outputs */ + int enabled; + int buffer_size; + int sample_count; + } snd; + + Normally you would set up this structure before calling system_init(). + You can change the input parameters and call sound_init() again to change + them. Here are how the parameters should be used: + + snd.sample_rate Set to the desired sample rate, e.g. 22050, 44100. + Set to 0 to disable sound emulation. + + snd.fps Set to 50 (PAL) or 60 (NTSC) to specify the emulated + sound replay rate. PAL consoles are not completely + supported yet, I would advise leaving this at 60. + + snd.psg_clock Set to the SN76489 clock speed. + Normally this is 3579545. (3.58 MHz) + + snd.fm_clock Set to the YM2413 clock speed. + Normally this is 3579545. (3.58 MHz) + + snd.fm_which Set to SND_EMU2413 or SND_YM2413 depending on the FM + sound chip emulator you want to use. You can change + this and call sound_init() again for realtime switching. + + snd.mixer_callback Set to NULL to use the default stream mixing routine, + or point it to your own. + + Calling sound_init() will return 0 if sound emulation was disabled or an + error occured, or 1 if initialization was successful. The following + variables will be valid for use afterwards: + + snd.enabled Set to 1 if sound emulation is enabled, 0 if disabled. + + snd.buffer_size Size of sample buffer in bytes. + + snd.sample_count Length of sample buffer in samples. + + snd.stream Sound streams for the built-in mixer function or a user + supplied one to use. + + snd.output Mixed audio generated by the built-in mixer function + that can be output to a sound device. Updated after each + call to system_frame(). + + An example of setup and use is as follows: + + // Init code + snd.sample_rate = 44100; + snd.fps = 60; + snd.psg_clock = 3579545; + snd.fm_clock = 3579545; + snd.fm_which = SND_EMU2413; + snd.mixer_callback = NULL; + system_init(); + + // Change some parameter later on + snd.fm_which = SND_YM2413; + sound_init(); + + // Update code + system_frame(); + osd_play_stream_stereo( snd.output, snd.buffer_size ); + + Custom mixing + + You can provide your own mixing routine to combine audio streams. Some + uses might include: + + - Per-stream volume adjustment, filtering, effects. + - Stereo output of YM2413 sound. + - Bass-boost on YM2413 rhythm output. + - Can take advantage of in-hardware playback/mixing (console ports, etc.) + + There are four sound streams available: + + STREAM_PSG_L SN76489 left channel output + STREAM_PSG_R SN76489 right channel output + STREAM_FM_MO YM2413 melody channel output + STREAM_FM_RO YM2413 rhythm channel output + + The two YM2413 outputs are mixed together, along with the PSG output, for + a single monoaural channel in all versions of the SMS and related hardware + that support FM sound. + + Synopsis of audio features by console: + + FM sound Stereo PSG Output + Mark III No No Mono + Mark III+FM Yes No Mono + SMS 1 No No Mono + SMS 2 No No Mono + SMS 1 (J) Yes No Mono + Game Gear No Yes Stereo (headphone jack) Mono (speaker) + + Audio from the YM2413 emulator has a lower volume than EMU2413 and will + need to be adjusted. + + See the default mixer routine in 'sound.c' for an example. + + ---------------------------------------------------------------------------- + Porting notes for earlier 0.9.x versions + ---------------------------------------------------------------------------- + + You can check out the DOS specific code to get an idea of + how to port SMS Plus. + + 0.) Machine dependant issues + ---------------------------- + + Everything should compile fine for big-endian platforms, however + I'm not sure the 8-bit pixel to 16-bit pixel conversion function + in 'render.c' is endian safe. + + You need to either define or not define 'LSB_FIRST' in your makefile, + depending on your needs. + + 1.) Graphics + ------------ + + The emulated display can be shown in either 8-bit or 16-bit color. + The following structure is used by the rendering routines to + draw the display, and you need to set it up prior to running the + emulation. + + typedef struct + { + uint8 *data; + int width; + int height; + int pitch; + int depth; + struct + { + uint8 color[PALETTE_MAX][3]; + uint8 dirty[PALETTE_MAX]; + uint8 update; + }pal; + }t_bitmap; + + 'data' - Pointer to a linear chunk of memory. This should be at least + 256x192 pixels in size. You can modify this pointer between + frames for double buffering (if it's pointed into memory mapped + video RAM), or point it to system memory so further changes + can be made. (like special effects, or for converting the + graphics data to 24 or 32-bit format) + 'width' - Width of the bitmap, in pixels. + 'height' - Height of the bitmap, in pixels. + 'pitch' - Width of the bitmap, in *bytes*. + 'depth' - Color depth. Must be 8 or 16. + 'color' - An array of 32 RGB values, each scaled up to eight bits. + 'dirty' - Each entry is nonzero if the color has been modified. + 'update' - Nonzero if one or more colors have been modified. + + If you are using 8-bit color, please note that each pixel drawn to + the bitmap uses some extra unused bits during the rendering process. + You can either mask out these bits using the PIXEL_MASK constant + from 'system.h', or set palette ranges 20-3F, 40-5F to the same + values as 00-1F. + + If you are using 16-bit color, you can ignore the members of the 'pal' + structure. Remember to adjust the MAKE_PIXEL macro in 'render.h' to + whatever format your display uses. By default it will make a 16-bit + pixel in RGB 5:6:5 format. + + The macros BMP_X_OFFSET, BMP_Y_OFFSET, give the offset into the + bitmap. This is because the SMS display takes up the entire bitmap, + while the GG display is centered in the middle. These macros provide + a convenient way to get the right offset. + + The PALETTE_MAX constant returns the size of the palette. + This is currently set to 32 entries. + + 2.) Sound + --------- + + Sound emulation is handled through the following structure: + + typedef struct + { + int fps; /* Set to 50 or 60 FPS for PAL or NTSC games */ + int sample_rate; /* Set between 8000 and 48000 */ + int enabled; /* 1= Init OK, 0= Sound disabled or error */ + int sample_count; /* Length of buffer in samples */ + int buffer_size; /* Size of buffer in bytes */ + int16 *output[2]; /* Left and right channels */ + } snd_t; + + You must call 'system_init()' and pass the desired sample rate as an + parameter to enable sound emulation. You can set the sample rate to + zero if you do not want sound emulation. Remember that 'snd.enabled' + will be set afterwards to indicate if any errors occured. + + You also must call 'system_shutdown()' when you are done running + the virtual console emulation, so some memory used by the sound + emulation code can be freed. + + 3.) Input + --------- + + Input is handled through the following structure: + + typedef struct + { + int pad[2]; + int system; + }t_input; + + 'pad[]' - Corresponds to joystick one and joystick two. + 'system' - System buttons, specifically pause, start, and reset. + + During each frame, you should clear members of this structure to zero, + then update each one using the INPUT_* constants in 'system.h'. + + 4.) Game Images + --------------- + + Game images are handled through the following structure: + + typedef struct + { + uint8 *rom; + uint8 pages; + uint8 type; + }t_cart; + + 'rom' - Pointer to the ROM image. + 'pages' - ROM size divided by 16k. + 'type' - Set to either TYPE_SMS or TYPE_GG. + + Games can be identified by their extension, which is usually '.sms' + or '.gg'. Some games have an optional 512-byte header which you must + remove. Remember to adjust the file size accordingly. + + 5.) Battery backed RAM + ---------------------- + + Some game cartridges can have up to 32k of battery backed RAM present. + There are two variables relating to this: + + typedef struct + { + uint8 sram[0x8000]; + uint8 save; + }t_sms; + + 'sram' - This is the data that should be saved and loaded. + 'save' - This is nonzero if the contents of sram[] should be saved. + + It's impossible to know if a game will use battery backed RAM, so the + emulation code waits until a game tries to read or write it, and then + sets the 'save' flag meaning the data needs to be saved. + + The basic way to deal with this is: + + 1. Load a game file + 2. If a file with the same name, and the extension .sav exists, + then load that data into 'sram' and set the 'save' flag. + 3. When exiting, check if the 'save' flag is nonzero, and if so, + write the contents of sram[] to a file with the extension .sav + and the same filename as the game file loaded. + + Note that when system_reset() is called, the function 'system_load_sram' + which has a prototype in 'system.h' will be called. You *must* implement + this function. All it has to do is see if any saved battery backed RAM + is present, and update the save/sram[] members accordingly. + + 6.) Miscellaneous + ----------------- + + Before running the virtual console emulation, you can set up + these two variables: + + sms.use_fm : 0= No YM2413 sound, 1= YM2413 sound + sms.country : Set to TYPE_DOMESTIC (Japan), TYPE_OVERSEAS + + Some games will display different text depending on the country + setting. The default value is TYPE_OVERSEAS. This is suitable for every + country but Japan. + + Some games have different music if the YM2413 sound chip is present. + If the 'fm_enable' value is set to one, then games can detect it. + + If you want to use FM sound, you must ensure that 'use_fm' is nonzero + before loading a game, since this variable controls if games can detect + the YM2413 chip as well as actual YM2413 output. + + Some games will only enable YM2413 sound if the country type is + also set to TYPE_DOMESTIC. One such example is Wonderboy 3. + + Both of these variables are preserved when system_reset() is called. + + You can call load_state/save_state to save and restore the current state + of the virtual console emulation. You need to pass a file handle as + a parameter to these functions. Therefore, you are responsible for ensuring + the file exists, and the file name. The naming convention is that all + state files are named '.st0' up to '.st9'. + + 7.) Function reference + ---------------------- + + void system_init(int sound_rate); + + You must set up the 'bitmap' and 'cart' structures prior to calling this + function. If you want sound emulation, pass the desired sample rate + (8000..44100). Afterwards, check the members of the 'snd' structure to see + if you can use sound emulation. You can now call system_frame() and the like. + + void system_shutdown(void); + + Call this when you're done with the emulation. Not terribly important + as it only frees some memory allocated by the sound emulation routines... + + void system_reset(void) + + Reset the virtual console emulation. This is called internally when + the INPUT_HARD_RESET flag for 'input.system' is set. + + void system_load_sram(void); + + Refresh the 'sms.sram[]' and 'sms.save' variables. + You must impelement this function yourself. + + void system_frame(int skip); + + You need to call this function 60 times a second. Pass zero as the + parameter to draw the current frame, otherwise pass one to omit + the drawing process. (ideal for frame skipping) Afterwards, + the 'bitmap' and 'snd' structures will be updated with the current + graphics and sound data. You should set up the 'input' structure + before calling this function. + + 8.) Example + ----------- + + Here's a brief overview of how to use all this: + + - do machine dependant initialization (audio, video, init input, etc.) + - set up bitmap structure + - set up cart structure (load game) + - call system_init() + - if snd.enabled is set, we can use sound + - load sram data if it exists for the game + in a loop: + - update input structure based on gamepad/keyboard + - call system_frame() + - play sound using 'snd.buffer' + - copy 'bitmap.data' to the video display + - quit if needed + - save sram data if the game used it + - call system_shutdown() + + 9.) Other notes on porting + -------------------------- + + - Please read the license first. + + - You must release the source code to your port in accordance with the GPL. + + If you have made *no* changes to the main source code, meaning everything + in the root directory, and the cpu and dos directories, then you + do not have to include those files. No point in wasting space. + + Otherwise, you must include those files with the changes clearly stated. + If the changes are the kind that could benefit other ports (like a bug + fix), then just let me know so I can update the main distribution, and + don't bother releasing those files. But let me know before you release + your port, however. + + If you are using some commercial libraries to take care of items like + audio output, or if you have developed some routines which you do not want + made public (i.e. an assembly optimized blitter, or some custom joypad + polling functions), then you do not have to include those files. + + I prefer it where anybody can download a port of SMS Plus and compile it + themselves, but I realize this isn't always possible. + + It would be nice, and is not required, that you could organize the + source in the same way I have it set up. For instance, maintaining the + same directory structure, but adding an '/myport' directory with your + specific files, and an appropriate makefile. + + - You must clearly state in the executable that you are the porter, + and that I wrote the program. Include YOUR contact information (e-mail + address, website URL). This is so users will not ask me questions on how + to use a specific port, which I know nothing about. + + - You need to provide documentation. Please remember to mention + the licensing stuff pertaining to SMS Plus and the MAME code that's + mentioned (for example) in the original 'readme' I wrote. Or just + include my documentation and make some additions. + + Please link to my website in the documentation, so people will know + where to get the original source code. diff --git a/Mednafen/mednafen/sms/docs/readme.txt b/Mednafen/mednafen/sms/docs/readme.txt new file mode 100644 index 0000000000..77bb8e72f2 --- /dev/null +++ b/Mednafen/mednafen/sms/docs/readme.txt @@ -0,0 +1,310 @@ + ---------------------------------------------------------------------------- + SMS Plus + ---------------------------------------------------------------------------- + + A free, open-source Sega Master System and Game Gear emulator. + + Version 1.2 + by Charles MacDonald + + What's New + ---------- + + [Version 1.2] + + - Fixed smptab allocation error. + - Various source code cleanups. + - Minor tweaks to sync with Mac source changes. + - Added more support for PAL hardware. + - Added partial support for Codemasters games. + - Fixed some aspects of ROM loading. + - Fixed SRAM restore bug in save states. + - Fixed viewport size check when going from extended to normal mode, which + fixes Fantastic Dizzy opening screen and V counter test program. + - Split up VDP emulation into SMS/GG/MD specific parts. + - Added support for different port I/O port memory maps. + - Fixed mapper restore bug in save states. + - Fixed UI key management in dos/main.c + - Improved HV counter emulation. + - Added dump VRAM keyboard shortcut. (Alt+V) + - Split up DOS code into different modules. + - Fixed EXT connector and related I/O port 2 behavior. + - Added GG I/O register emulation. + - Changed SRAM management. + - Modified use of reset/poweron/poweroff functions. + - Added configuration via CRC for some Codemasters games. + - Fixed implementation of GG input port. + - Added cycle counter feature to Z80 emulator. + - Added shutdown functions to other modules. + - Mapped 2nd player inputs to keyboard numeric pad in dos/main.c + - Fixed reset button handling in dos/main.c + - Moved Z80 port handlers to memz80.c + - Fixed console type assign in loadrom.c (removed TYPE_* defines) + - Added support for I/O chip disable control. + - Rewrote I/O chip emulation. + - Fixed pixel LUT to handle sprite collision behind high priority BG tiles. + - Added emulation of sprite overflow status flag. + - Added 'granularity' member to bitmap struct and fixed DOS blur code. + - Fixed FM sound restore on state load / FM emulator change. + - Corrected screen blanking width. + - Removed sprite limit disable feature. + - Added support for extended display modes. + - Added partial support for PAL display timing. + - Removed BMP_* macros, replaced with bitmap.viewport.* variables. + - Removed Y's (J) rendering hack that was problematic in other games. + - Added error logging routines. + - Removed Game Gear specific rendering speedups. + - Replaced cart.type with sms.console, replaced access with IS_GG macro. + - Renamed INPUT_SOFT_RESET to INPUT_RESET. Use for SMS games only. + - Removed INPUT_HARD_RESET, use system_reset() instead. + - Modified vdp_ctrl_w() to update address register LSB during leading write. + - Changed path length in wram/state/snap routines to PATH_MAX in DOS code. + - Added define to specify message length in DOS code. + - Added r/w handlers for FM detection latch access, renamed fm* -> fmunit* + - Added territory/console members to struct sms (removed sms.country). + Removed TYPE_* and replaced with TERRITORY_* enums. + - Fixed FM register restore during state load when sound is disabled. + - Updated memory system to support 1K pages. + - Updated zlib to 1.2.1 and unzip.c to 1.0 + - Moved sound management out of system.c into sound/sound.c,fmintf.c + - Moved state management out of system.c into state.c + - Rearranged header file include order in system.h + - Added support for MAME YM2413 emulator + - Abstracted FM sound chip interface to support both YM2413 emulators + - Updated timeline in dos/main.c and system.c + - Removed SSL logging + - Fixed path length in loadrom.c to MAX_PATH from limits.h + - Added library version display option to dos/main.c + - Moved file I/O code to fileio.c + - Fixed loadrom.c to support 16K ROM images + - Updated documentation and porting instructions + - Modified EMU2413 to have update function for 2-channel output + - Modified dos\config.c to ensure parameters are left during option parsing + - Modified YM2413 emulator to check for NULL pointer during shutdown + - Cleaned up variable names in snd struct + - Added default mixer callback + - Made sound_shutdown() free memory + - Modified sound_init() to allow re-initialization + - Cleaned up system.h, sms.h, vdp.h + - Optimized color expansion for paletteized 8-bit format in render.c + - Added Maxim's SN76489 emulator, removed the old one + - Added YM2413 context management + - Fixed PSG/FM state save/load behavior + + * Save state format has changed in this release, and will probably change + in future updates. Old states from version 0.9.x are not interchangable + with the new version 1.x states. + + [Version 0.9.4b] + + - Made a few minor changes to the source code. + - Added keyboard shortcut to dump work RAM. + - Fixed FPS state display. + - Fixed GG palette handling. + - Improved tile caching. + - Made SMS/GG palette brighter. + - Updated Z80 CPU emulator. + + [Version 0.9.4a] + + - A few cleanups so SMS Plus compiles with no errors or warnings. + - Use of MMX code is now automatic but can still be disabled manually. + - Replaced FM sound emulation with Mitsutaka Okazaki's EMU2413 library. + - Fixed parts of the VDP emulation. + - Removed support for PSX port. + + [Version 0.9.3] + + - Stereo Game Gear sound. + - Save states, 10 per game. + - Sound logging, output is .GYM compatible. + - Optimized memory access for improved speed. + - Screen snapshots in PCX format. + - Stereo swap option for left and right speakers. + - Added FPS meter. + - Added some option toggle keys for in-game configuration. + - Definable video driver. + - Tweaked display modes for full-screen gameplay. + - More of the usual internal changes and bug fixes. + + [Version 0.9.2] + + - Digital YM2413 FM sound emulation. Drums sound real good, too. + - System territory switch, default is overseas (Europe / USA) + - Made some internal changes and clean-ups to the source code. + - Revised document on porting to be actually useful. + - Adjusted version number to stay in sync with the Macintosh port. + - Support for ZIPped game images and games with 512-byte headers. + - Screen expansion now works for 16-bit displays. + - Fixed some centering problems with screen expansion on GG games. + - Sound output using SEAL should be a bit clearer. + - Configuration file support. + + [Version 0.9] + + Everything has been rewritten from scratch. The emulation is much more + accurate, as a result compatability has improved greatly. + + The DOS port has a lot of nice features added, including 16-bit color, + display blurring, digital sound emulation, and scanlines, which were the + most requested items. + + Also new is a Sony Playstation port, though it's highly experimental + and has some serious performance issues. + + SMS Plus is now free software; the source code is available for anyone + to use as they see fit, and is distributed under the terms of the GNU + General Public License. + + Usage + ----- + + (DOS) + + You'll need at least a Pentium 133, a VGA compatible display card, + and optionally a joystick and sound card. + + Controls are as follows: + + Arrow Keys - Directional pad + a - Button II + s - Button I + Enter - Start (GG) / PAUSE (SMS) + Tab - Soft reset (SMS) / Hard reset (GG) + Delete - Hard reset + Esc/End - Exit program + 0-9 - Select save state slot + Alt+W - Dump work RAM + ~ - Switch between EMU2413 and YM2413 FM sound chip emulators. + + F1-F4 - Set frameskip level (F1 = no skip ... F4 = skip 3 frames) + F5 - Save state file from current slot + F6 - Cycle through state slots (0-9) + F7 - Save state file to current slot + F8 - Make PCX screen snapshot + F9 - Toggle VSync + F10 - Toggle speed throttling + F11 - Toggle FPS meter + + You can only support a second player if you are using a joystick driver + that supports more than one joystick. (e.g. Sidewinder, dual pads, etc.) + + Type 'sp -help' on the command line for a list of useful options. + + -res set the display resolution. + -vdriver specify video driver. + -depth specify color depth. (8, 16) + -blur blur display. (16-bit color only) + -scanlines use scanlines effect. + -tweak force tweaked 256x192 or 160x144 8-bit display. + -scale scale display to full resolution. (slow) + -expand force 512x384 or 400x300 zoomed display. + -nommx disable use of MMX instructions. + -novga disable use of VGA vertical scaling with '-expand'. + -vsync wait for vertical sync before blitting. + -throttle limit updates to 60 frames per second. + -fps show FPS meter. + -sound enable sound. (force speed throttling) + -sndrate specify sound rate. (8000, 11025, 22050, 44100) + -sndcard specify sound card. (0-7) + -swap swap left and right stereo output. + -joy specify joystick type. + -jp use Japanese console type. + -fm required to enable YM2413 sound. + -info show library versions. + -codies force Codemasters mapper + + Here is a list of all the video drivers you can pass as a parameter + to the '-vdriver' option: + + auto, safe, vga, modex, vesa2l, vesa3, vbeaf + + Here is a list of all the joystick drivers you can pass as a parameter + to the '-joy' option: + + auto, none, standard, 2pads, 4button, 6button, 8button, fspro, wingex, + sidewinder, gamepadpro, grip, grip4, sneslpt1, sneslpt2, sneslpt3, + psxlpt1, psxlpt2, psxlpt3, n64lpt1, n64lpt2, n64lpt3, db9lpt1, db9lpt2, + db9lpt3, tglpt1, tglpt2, tglpt3, wingwar, segaisa, segapci, segapci2 + + If you use the expand option without scanlines, and the display looks + squashed vertically, then also use the '-novga' switch. + + You can disable MMX use with the '-nommx' switch. + + You can put any commandline option into a plain text file which should + be called "sp.cfg". Put one option per line, please. Command line options + will override anything in the configuration file. + + Battery back-up RAM and save states are saved to the same directory as the + game you loaded. This means running games off write-only media will not + work. These files are named after the name of the image itself, not the + name of the zipfile archive in the case of zip loading. + + Currently the zip loading code can manage a zipfile where the game + image is the first thing in it. If you try to open a huge archive of + games, only the first will be played. + + Credits and Acknowledgments + --------------------------- + + Dedicated to Chris MacDonald. + + Thanks to: + + All Allegro contributors, Bero, Carlos Hasan, Dave, Eric Quinn, + Frank Hughes, Flavio Morsoletto, Gilles Volant, Hiromitsu Shioya, Jon, + Jean-loup Gailly, James McKay, Jarek Burczynski, Kreed, Mark Adler, + Micheal Cunanan, Marcel de Kogel, Marat Fayzullin, Mitsutaka Okazaki, + Maxim, Nyef, Nick Jacobson, Omar Cornut, Paul Leaman, Ricardo Bittencourt, + Richard Mitton, Richard Talbot-Watkins, Sean Young, Tatsuyuki Satoh, + the MAME team, and the S8-DEV forum members. + + Richard Bannister for the Macintosh port. (www.bannister.org) + Richard Teather for the Win32 port. (smsplus.vintagegaming.com) + Caz Jones for the BeOS port. (http://www.infernal.currantbun.com) + Cyx for the SDL port. (http://membres.lycos.fr/cyxdown/smssdl/) + Ulrich Hecht for the Linux port. (http://www.emulinks.de/emus/) + ss_teven for the Sega Dreamcast port. (no homepage URL) + Dagolar for the Sega Saturn port. (http://phemusat.tripod.com/) + Aj0 for the GP32 port. (http://ajo.thinknerd.com/gp32/sms32/files/) + ? for the X-Box port. (http://xport.xb-power.com/smsplus.html) + ? for the Sony Playstation 2 port. (http://nik.napalm-x.com/) + + All of those responsible for many console, mobile phone, and PDA ports + of SMS Plus. + + The artists who worked on Red Zone and Sub Terrania for the cool font + used in previous DOS ports. + + I'd also like to thank everybody who contributed information, bug reports, + and gave their comments and ideas. + + Contact + ------- + + Charles MacDonald + E-mail: cgfm2 at hotmail dot com + WWW: http://cgfm2.emuviews.com + + Legal + ----- + + SMS Plus is Copyright (C) 1998-2004 Charles MacDonald + + The source code is distributed under the terms of the GNU General Public + License. + + The SN76489 emulator is written by Maxim. + (http://mwos.cjb.net) + + The EMU2413 emulator is written by Mitsutaka Okazaki. + (http://www.angel.ne.jp/~okazaki/ym2413/) + + The Z80 CPU and YM2413 emulator, and SEAL interface code are taken from the + MAME project, and terms of their use are covered under the MAME license. + (http://www.mame.net) + + The blur code is based on the 'CTV' sources from Dave's DGen emulator. + (http://www.dtmnt.com) + diff --git a/Mednafen/mednafen/sms/hvc.inc b/Mednafen/mednafen/sms/hvc.inc new file mode 100644 index 0000000000..ff580642ea --- /dev/null +++ b/Mednafen/mednafen/sms/hvc.inc @@ -0,0 +1,158 @@ +#ifndef _HVC_H_ +#define _HVC_H_ + +uint8 vc_ntsc_192[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, + 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, +}; + +uint8 vc_ntsc_224[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, + 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, +}; + +uint8 vc_ntsc_256[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 +}; + +uint8 vc_pal_192[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, + 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, +}; + +uint8 vc_pal_224[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, + 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, +}; + +uint8 vc_pal_256[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, + 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, + 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, + 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF, +}; + +uint8 *vc_table[2][4] = +{ + { + vc_ntsc_192, + vc_ntsc_224, + vc_ntsc_256, + vc_ntsc_192, + }, + { + vc_pal_192, + vc_pal_224, + vc_pal_256, + vc_pal_192, + } +}; + +#endif /* _HVC_H_ */ + diff --git a/Mednafen/mednafen/sms/memz80.cpp b/Mednafen/mednafen/sms/memz80.cpp new file mode 100644 index 0000000000..08b0237cdd --- /dev/null +++ b/Mednafen/mednafen/sms/memz80.cpp @@ -0,0 +1,353 @@ +/* + memz80.c -- + Z80 port handlers. +*/ +#include "shared.h" + +namespace MDFN_IEN_SMS +{ + +/* Pull-up resistors on data bus */ +uint8 data_bus_pullup = 0x00; +uint8 data_bus_pulldown = 0x00; + +/* Read unmapped memory */ +uint8 z80_read_unmapped(void) +{ + int pc = z80_getpc(); + uint8 data; + pc = (pc - 1) & 0xFFFF; + data = sms_readbyte(pc); + + return ((data | data_bus_pullup) & ~data_bus_pulldown); +} + +void memctrl_w(uint8 data) +{ + sms.memctrl = data; +} + +/*--------------------------------------------------------------------------*/ +/* Sega Master System port handlers */ +/*--------------------------------------------------------------------------*/ + +void sms_port_w(uint16 port, uint8 data) +{ + switch(port & 0xC1) + { + case 0x00: + memctrl_w(data); + return; + + case 0x01: + ioctrl_w(data); + return; + + case 0x40: + case 0x41: + psg_write(data); + return; + + case 0x80: + case 0x81: + vdp_write(port, data); + return; + + case 0xC0: + case 0xC1: + return; + } +} + +uint8 sms_port_r(uint16 port) +{ + switch(port & 0xC0) + { + case 0x00: + return z80_read_unmapped(); + + case 0x40: + return vdp_counter_r(port); + + case 0x80: + return vdp_read(port); + + case 0xC0: + return input_r(port); + } + + /* Just to please the compiler */ + return -1; +} + + +/*--------------------------------------------------------------------------*/ +/* Sega Master System (J) port handlers */ +/*--------------------------------------------------------------------------*/ + +void smsj_port_w(uint16 port, uint8 data) +{ + port &= 0xFF; + + if(port >= 0xF0) + { + switch(port) + { + case 0xF0: + fmunit_write(0, data); + return; + + case 0xF1: + fmunit_write(1, data); + return; + + case 0xF2: + fmunit_detect_w(data); + return; + } + } + + switch(port & 0xC1) + { + case 0x00: + memctrl_w(data); + return; + + case 0x01: + ioctrl_w(data); + return; + + case 0x40: + case 0x41: + psg_write(data); + return; + + case 0x80: + case 0x81: + vdp_write(port, data); + return; + + case 0xC0: + case 0xC1: + return; + } +} + +uint8 smsj_port_r(uint16 port) +{ + port &= 0xFF; + + if(port == 0xF2) // && !(sms.memctrl & 4)) + return fmunit_detect_r(); + + switch(port & 0xC0) + { + case 0x00: + return z80_read_unmapped(); + + case 0x40: + return vdp_counter_r(port); + + case 0x80: + return vdp_read(port); + + case 0xC0: + return input_r(port); + } + + /* Just to please the compiler */ + return -1; +} + + + +/*--------------------------------------------------------------------------*/ +/* Game Gear port handlers */ +/*--------------------------------------------------------------------------*/ + +void gg_port_w(uint16 port, uint8 data) +{ + port &= 0xFF; + + if(port <= 0x06) { + sio_w(port, data); + return; + } + + switch(port & 0xC1) + { + case 0x00: + memctrl_w(data); + return; + + case 0x01: + ioctrl_w(data); + return; + + case 0x40: + case 0x41: + psg_write(data); + return; + + case 0x80: + case 0x81: + gg_vdp_write(port, data); + return; + } +} + + +uint8 gg_port_r(uint16 port) +{ + port &= 0xFF; + + if(port <= 0x06) + return sio_r(port); + + switch(port & 0xC0) + { + case 0x00: + return z80_read_unmapped(); + + case 0x40: + return vdp_counter_r(port); + + case 0x80: + return vdp_read(port); + + case 0xC0: + switch(port) + { + case 0xC0: + case 0xC1: + case 0xDC: + case 0xDD: + return input_r(port); + } + return z80_read_unmapped(); + } + + /* Just to please the compiler */ + return -1; +} + +/*--------------------------------------------------------------------------*/ +/* Game Gear (MS) port handlers */ +/*--------------------------------------------------------------------------*/ + +void ggms_port_w(uint16 port, uint8 data) +{ + port &= 0xFF; + + switch(port & 0xC1) + { + case 0x00: + memctrl_w(data); + return; + + case 0x01: + ioctrl_w(data); + return; + + case 0x40: + case 0x41: + psg_write(data); + return; + + case 0x80: + case 0x81: + vdp_write(port, data); + return; + } +} + +uint8 ggms_port_r(uint16 port) +{ + port &= 0xFF; + + switch(port & 0xC0) + { + case 0x00: + return z80_read_unmapped(); + + case 0x40: + return vdp_counter_r(port); + + case 0x80: + return vdp_read(port); + + case 0xC0: + switch(port) + { + case 0xC0: + case 0xC1: + case 0xDC: + case 0xDD: + return input_r(port); + } + return z80_read_unmapped(); + } + + /* Just to please the compiler */ + return -1; +} + +/*--------------------------------------------------------------------------*/ +/* MegaDrive / Genesis port handlers */ +/*--------------------------------------------------------------------------*/ + +void md_port_w(uint16 port, uint8 data) +{ + switch(port & 0xC1) + { + case 0x00: + /* No memory control register */ + return; + + case 0x01: + ioctrl_w(data); + return; + + case 0x40: + case 0x41: + psg_write(data); + return; + + case 0x80: + case 0x81: + md_vdp_write(port, data); + return; + } +} + + +uint8 md_port_r(uint16 port) +{ + switch(port & 0xC0) + { + case 0x00: + return z80_read_unmapped(); + + case 0x40: + return vdp_counter_r(port); + + case 0x80: + return vdp_read(port); + + case 0xC0: + switch(port) + { + case 0xC0: + case 0xC1: + case 0xDC: + case 0xDD: + return input_r(port); + } + return z80_read_unmapped(); + } + + /* Just to please the compiler */ + return -1; +} + +} diff --git a/Mednafen/mednafen/sms/memz80.h b/Mednafen/mednafen/sms/memz80.h new file mode 100644 index 0000000000..29095c2811 --- /dev/null +++ b/Mednafen/mednafen/sms/memz80.h @@ -0,0 +1,27 @@ + +#ifndef _MEMZ80_H_ +#define _MEMZ80_H_ + +namespace MDFN_IEN_SMS +{ + +/* Global data */ +extern uint8 data_bus_pullup; +extern uint8 data_bus_pulldown; + +/* Function prototypes */ +uint8 z80_read_unmapped(void); +void gg_port_w(uint16 port, uint8 data); +uint8 gg_port_r(uint16 port); +void ggms_port_w(uint16 port, uint8 data); +uint8 ggms_port_r(uint16 port); +void sms_port_w(uint16 port, uint8 data); +uint8 sms_port_r(uint16 port); +void smsj_port_w(uint16 port, uint8 data); +uint8 smsj_port_r(uint16 port); +void md_port_w(uint16 port, uint8 data); +uint8 md_port_r(uint16 port); + +} + +#endif /* _MEMZ80_H_ */ diff --git a/Mednafen/mednafen/sms/pio.cpp b/Mednafen/mednafen/sms/pio.cpp new file mode 100644 index 0000000000..869e99b484 --- /dev/null +++ b/Mednafen/mednafen/sms/pio.cpp @@ -0,0 +1,289 @@ +/* + pio.c -- + I/O chip and peripheral emulation. +*/ +#include "shared.h" + +namespace MDFN_IEN_SMS +{ + +static io_state io_lut[2][256]; +static const io_state *io_current; + +void pio_init(void) +{ + int i, j; + + /* Make pin state LUT */ + for(j = 0; j < 2; j++) + { + for(i = 0; i < 0x100; i++) + { + /* Common control: pin direction */ + io_lut[j][i].tr_dir[0] = (i & 0x01) ? PIN_DIR_IN : PIN_DIR_OUT; + io_lut[j][i].th_dir[0] = (i & 0x02) ? PIN_DIR_IN : PIN_DIR_OUT; + io_lut[j][i].tr_dir[1] = (i & 0x04) ? PIN_DIR_IN : PIN_DIR_OUT; + io_lut[j][i].th_dir[1] = (i & 0x08) ? PIN_DIR_IN : PIN_DIR_OUT; + + if(j == 1) + { + /* Programmable output state (Export machines only) */ + io_lut[j][i].tr_level[0] = (i & 0x01) ? PIN_LVL_HI : (i & 0x10) ? PIN_LVL_HI : PIN_LVL_LO; + io_lut[j][i].th_level[0] = (i & 0x02) ? PIN_LVL_HI : (i & 0x20) ? PIN_LVL_HI : PIN_LVL_LO; + io_lut[j][i].tr_level[1] = (i & 0x04) ? PIN_LVL_HI : (i & 0x40) ? PIN_LVL_HI : PIN_LVL_LO; + io_lut[j][i].th_level[1] = (i & 0x08) ? PIN_LVL_HI : (i & 0x80) ? PIN_LVL_HI : PIN_LVL_LO; + } + else + { + /* Fixed output state (Domestic machines only) */ + io_lut[j][i].tr_level[0] = (i & 0x01) ? PIN_LVL_HI : PIN_LVL_LO; + io_lut[j][i].th_level[0] = (i & 0x02) ? PIN_LVL_HI : PIN_LVL_LO; + io_lut[j][i].tr_level[1] = (i & 0x04) ? PIN_LVL_HI : PIN_LVL_LO; + io_lut[j][i].th_level[1] = (i & 0x08) ? PIN_LVL_HI : PIN_LVL_LO; + } + } + } + + // hack dos code doesn't call system_reset + pio_reset(); +} + + +void pio_reset(void) +{ + /* GG SIO power-on defaults */ + sms.sio.pdr = 0x7F; + sms.sio.ddr = 0xFF; + sms.sio.txdata = 0x00; + sms.sio.rxdata = 0xFF; + sms.sio.sctrl = 0x00; + + /* SMS I/O power-on defaults */ + ioctrl_w(0xFF); +} + + +void pio_shutdown(void) +{ + /* Nothing to do */ +} + + +void system_assign_device(int port, int type) +{ + sms.device[port].type = type; +} + +void ioctrl_w(uint8 data) +{ + sms.ioctrl = data; + io_current = &io_lut[sms.territory][data]; +} + +uint8 device_r(int offset) +{ + uint8 temp = 0x7F; + + switch(sms.device[offset].type) + { + case DEVICE_NONE: + break; + case DEVICE_PAD2B: + break; + case DEVICE_PADDLE: + break; + } + + return temp; +} + +uint8 input_r(int offset) +{ + uint8 temp = 0xFF; + + /* + If I/O chip is disabled, reads return last byte of instruction that + read the I/O port. + */ + if(sms.memctrl & 0x04) + return z80_read_unmapped(); + + offset &= 1; + if(offset == 0) + { + /* Input port #0 */ + + if(input.pad[0] & INPUT_UP) temp &= ~0x01; /* D0 */ + if(input.pad[0] & INPUT_DOWN) temp &= ~0x02; /* D1 */ + if(input.pad[0] & INPUT_LEFT) temp &= ~0x04; /* D2 */ + if(input.pad[0] & INPUT_RIGHT) temp &= ~0x08; /* D3 */ + if(input.pad[0] & INPUT_BUTTON2) temp &= ~0x10; /* TL */ + if(input.pad[0] & INPUT_BUTTON1) temp &= ~0x20; /* TR */ + + if(sms.console == CONSOLE_GG) + { + uint8 state = sio_r(0x01); + temp = (temp & 0x3F) | (state & 0x03) << 6; /* Insert D1,D0 */ + } + else + { + if(input.pad[1] & INPUT_UP) temp &= ~0x40; /* D0 */ + if(input.pad[1] & INPUT_DOWN) temp &= ~0x80; /* D1 */ + } + + /* Adjust TR state if it is an output */ + if(io_current->tr_dir[0] == PIN_DIR_OUT) { + temp &= ~0x20; + temp |= (io_current->tr_level[0] == PIN_LVL_HI) ? 0x20 : 0x00; + } + } + else + { + /* Input port #1 */ + if(sms.console == CONSOLE_GG) + { + uint8 state = sio_r(0x01); + temp = (temp & 0xF0) | ((state & 0x3C) >> 2); /* Insert TR,TL,D3,D2 */ + temp = (temp & 0x7F) | ((state & 0x40) << 1); /* Insert TH */ + } + else + { + if(input.pad[1] & INPUT_LEFT) temp &= ~0x01; /* D2 */ + if(input.pad[1] & INPUT_RIGHT) temp &= ~0x02; /* D3 */ + if(input.pad[1] & INPUT_BUTTON2) temp &= ~0x04; /* TL */ + if(input.pad[1] & INPUT_BUTTON1) temp &= ~0x08; /* TR */ + + /* Adjust TR state if it is an output */ + if(io_current->tr_dir[1] == PIN_DIR_OUT) { + temp &= ~0x08; + temp |= (io_current->tr_level[1] == PIN_LVL_HI) ? 0x08 : 0x00; + } + + /* Adjust TH state if it is an output */ + if(io_current->th_dir[1] == PIN_DIR_OUT) { + temp &= ~0x80; + temp |= (io_current->th_level[1] == PIN_LVL_HI) ? 0x80 : 0x00; + } + + if(input.system & INPUT_RESET) temp &= ~0x10; + } + + /* /CONT fixed at '1' for SMS/SMS2/GG */ + /* /CONT fixed at '0' for GEN/MD */ + if(IS_MD) temp &= ~0x20; + + /* Adjust TH state if it is an output */ + if(io_current->th_dir[0] == PIN_DIR_OUT) { + temp &= ~0x40; + temp |= (io_current->th_level[0] == PIN_LVL_HI) ? 0x40 : 0x00; + } + } + return temp; +} + +uint8 sio_r(int offset) +{ + uint8 temp; + + switch(offset & 0xFF) + { + case 0: /* Input port #2 */ + temp = 0xE0; + if(input.system & INPUT_START) temp &= ~0x80; + if(sms.territory == TERRITORY_DOMESTIC) temp &= ~0x40; + if(sms.display == DISPLAY_NTSC) temp &= ~0x20; + return temp; + + case 1: /* Parallel data register */ + temp = 0x00; + temp |= (sms.sio.ddr & 0x01) ? 0x01 : (sms.sio.pdr & 0x01); + temp |= (sms.sio.ddr & 0x02) ? 0x02 : (sms.sio.pdr & 0x02); + temp |= (sms.sio.ddr & 0x04) ? 0x04 : (sms.sio.pdr & 0x04); + temp |= (sms.sio.ddr & 0x08) ? 0x08 : (sms.sio.pdr & 0x08); + temp |= (sms.sio.ddr & 0x10) ? 0x10 : (sms.sio.pdr & 0x10); + temp |= (sms.sio.ddr & 0x20) ? 0x20 : (sms.sio.pdr & 0x20); + temp |= (sms.sio.ddr & 0x40) ? 0x40 : (sms.sio.pdr & 0x40); + temp |= (sms.sio.pdr & 0x80); + return temp; + + case 2: /* Data direction register and NMI enable */ + return sms.sio.ddr; + + case 3: /* Transmit data buffer */ + return sms.sio.txdata; + + case 4: /* Receive data buffer */ + return sms.sio.rxdata; + + case 5: /* Serial control */ + return sms.sio.sctrl; + + case 6: /* Stereo sound control */ + return 0xFF; + } + + /* Just to please compiler */ + return -1; +} + +void sio_w(int offset, int data) +{ + switch(offset & 0xFF) + { + case 0: /* Input port #2 (read-only) */ + return; + + case 1: /* Parallel data register */ + sms.sio.pdr = data; + return; + + case 2: /* Data direction register and NMI enable */ + sms.sio.ddr = data; + return; + + case 3: /* Transmit data buffer */ + sms.sio.txdata = data; + return; + + case 4: /* Receive data buffer */ + return; + + case 5: /* Serial control */ + sms.sio.sctrl = data & 0xF8; + return; + + case 6: /* Stereo output control */ + psg_stereo_w(data); + return; + } +} + +int SMS_PIOStateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(sms.sio.pdr), + SFVAR(sms.sio.ddr), + SFVAR(sms.sio.txdata), + SFVAR(sms.sio.rxdata), + SFVAR(sms.sio.sctrl), + SFVAR(sms.ioctrl), + + + SFEND + }; + + + int ret; + + ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "PIO"); + + if(load) + { + io_current = &io_lut[sms.territory][sms.ioctrl]; + } + + return(ret); +} + +} diff --git a/Mednafen/mednafen/sms/pio.h b/Mednafen/mednafen/sms/pio.h new file mode 100644 index 0000000000..41bd3093d0 --- /dev/null +++ b/Mednafen/mednafen/sms/pio.h @@ -0,0 +1,60 @@ +#ifndef _PIO_H_ +#define _PIO_H_ + +namespace MDFN_IEN_SMS +{ + +#define SIO_TXFL (1 << 0) /* 1= Transmit buffer full */ +#define SIO_RXRD (1 << 1) /* 1= Receive buffer full */ +#define SIO_FRER (1 << 2) /* 1= Framing error occured */ + +#define MAX_DEVICE 2 +#define DEVICE_D0 (1 << 0) +#define DEVICE_D1 (1 << 1) +#define DEVICE_D2 (1 << 2) +#define DEVICE_D3 (1 << 3) +#define DEVICE_TL (1 << 4) +#define DEVICE_TR (1 << 5) +#define DEVICE_TH (1 << 6) +#define DEVICE_ALL (DEVICE_D0 | DEVICE_D1 | DEVICE_D2 | DEVICE_D3 | DEVICE_TL | DEVICE_TR | DEVICE_TH) + +#define PIN_LVL_LO 0 /* Pin outputs 0V */ +#define PIN_LVL_HI 1 /* Pin outputs +5V */ +#define PIN_DIR_OUT 0 /* Pin is is an active driving output */ +#define PIN_DIR_IN 1 /* Pin is in active-low input mode */ + +enum { + PORT_A = 0, /* I/O port A */ + PORT_B = 1 /* I/O port B */ +}; + +enum { + DEVICE_NONE = 0, /* No peripheral */ + DEVICE_PAD2B = 1, /* Standard 2-button digital joystick/gamepad */ + DEVICE_PADDLE = 2 /* Paddle controller; rotary dial with fire button */ +}; + +typedef struct { + uint8 tr_level[2]; /* TR pin output level */ + uint8 th_level[2]; /* TH pin output level */ + uint8 tr_dir[2]; /* TR pin direction */ + uint8 th_dir[2]; /* TH pin direction */ +} io_state; + +/* Function prototypes */ +void pio_init(void); +void pio_reset(void); +void pio_shutdown(void); +void system_assign_device(int port, int type); + +int SMS_PIOStateAction(StateMem *sm, int load, int data_only); + +void io_lut_init(void); +void ioctrl_w(uint8 data); +uint8 input_r(int offset); +void sio_w(int offset, int data); +uint8 sio_r(int offset); + +} + +#endif /* _PIO_H_ */ diff --git a/Mednafen/mednafen/sms/render.cpp b/Mednafen/mednafen/sms/render.cpp new file mode 100644 index 0000000000..dc256226aa --- /dev/null +++ b/Mednafen/mednafen/sms/render.cpp @@ -0,0 +1,587 @@ +/* + render.c -- + Display rendering. +*/ + +#include "shared.h" + +namespace MDFN_IEN_SMS +{ + +static const uint8 tms_crom[] = +{ + 0x00, 0x00, 0x08, 0x0C, + 0x10, 0x30, 0x01, 0x3C, + 0x02, 0x03, 0x05, 0x0F, + 0x04, 0x33, 0x15, 0x3F +}; + +static void remap_8_to_32(int line); + +/* Background drawing function */ +void (*render_bg)(int line) = NULL; +void (*render_obj)(int line) = NULL; + +/* Pointer to output buffer */ +uint8 *linebuf; + +/* Internal buffer for drawing non 8-bit displays */ +uint8 internal_buffer[0x100]; + +/* Precalculated pixel table */ +uint32 pixel[PALETTE_SIZE]; + +/* Dirty pattern info */ +uint8 bg_name_dirty[0x200]; /* 1= This pattern is dirty */ +uint16 bg_name_list[0x200]; /* List of modified pattern indices */ +uint16 bg_list_index; /* # of modified patterns in list */ +uint8 bg_pattern_cache[0x20000];/* Cached and flipped patterns */ + +/* Pixel look-up table */ +uint8 lut[0x10000]; + +/* Bitplane to packed pixel LUT */ +uint32 bp_lut[0x10000]; + + +void render_shutdown(void) +{ +} + +/* Initialize the rendering data */ +void render_init(void) +{ + int i, j; + int bx, sx, b, s, bp, bf, sf, c; + + make_tms_tables(); + + /* Generate 64k of data for the look up table */ + for(bx = 0; bx < 0x100; bx++) + { + for(sx = 0; sx < 0x100; sx++) + { + /* Background pixel */ + b = (bx & 0x0F); + + /* Background priority */ + bp = (bx & 0x20) ? 1 : 0; + + /* Full background pixel + priority + sprite marker */ + bf = (bx & 0x7F); + + /* Sprite pixel */ + s = (sx & 0x0F); + + /* Full sprite pixel, w/ palette and marker bits added */ + sf = (sx & 0x0F) | 0x10 | 0x40; + + /* Overwriting a sprite pixel ? */ + if(bx & 0x40) + { + /* Return the input */ + c = bf; + } + else + { + /* Work out priority and transparency for both pixels */ + if(bp) + { + /* Underlying pixel is high priority */ + if(b) + { + c = bf | 0x40; + } + else + { + + if(s) + { + c = sf; + } + else + { + c = bf; + } + } + } + else + { + /* Underlying pixel is low priority */ + if(s) + { + c = sf; + } + else + { + c = bf; + } + } + } + + /* Store result */ + lut[(bx << 8) | (sx)] = c; + } + } + + /* Make bitplane to pixel lookup table */ + for(i = 0; i < 0x100; i++) + for(j = 0; j < 0x100; j++) + { + int x; + uint32 out = 0; + for(x = 0; x < 8; x++) + { + out |= (j & (0x80 >> x)) ? (uint32)(8 << (x << 2)) : 0; + out |= (i & (0x80 >> x)) ? (uint32)(4 << (x << 2)) : 0; + } +#if LSB_FIRST + bp_lut[(j << 8) | (i)] = out; +#else + bp_lut[(i << 8) | (j)] = out; +#endif + } + + render_reset(); + +} + + +/* Reset the rendering data */ +void render_reset(void) +{ + int i; + + /* Clear palette */ + for(i = 0; i < PALETTE_SIZE; i++) + { + palette_sync(i, 1); + } + + /* Invalidate pattern cache */ + memset(bg_name_dirty, 0, sizeof(bg_name_dirty)); + memset(bg_name_list, 0, sizeof(bg_name_list)); + bg_list_index = 0; + memset(bg_pattern_cache, 0, sizeof(bg_pattern_cache)); + + /* Pick render routine */ + render_bg = render_bg_sms; + render_obj = render_obj_sms; +} + + +/* Draw a line of the display */ +void render_line(int line, int skip) +{ + int meow_line = 0xFFFF; + // printf("%02x\n", vdp.extended); + switch(vdp.extended) + { + case 0: if(line < (192 + 24)) + meow_line = 24 + line; + else if(line >= (vdp.lines_per_frame - 24)) + meow_line = line - (vdp.lines_per_frame - 24); + break; + + case 1: if(line < (224 + 8)) + meow_line = 8 + line; + else if(line >= (vdp.lines_per_frame - 8)) + meow_line = line - (vdp.lines_per_frame - 8); + + break; + case 2: if(line < 240) + meow_line = line; + break; + } + + /* Ensure we're within the viewport range */ + if(line >= vdp.height) + { + if(meow_line < 240) + { + memset(linebuf, BACKDROP_COLOR, 256); + remap_8_to_32(meow_line); + } + return; + } + + /* Point to current line in output buffer */ + linebuf = internal_buffer; + + /* Update pattern cache */ + update_bg_pattern_cache(); + + /* Blank line (full width) */ + if(!(vdp.reg[1] & 0x40)) + { + memset(linebuf, BACKDROP_COLOR, 256); + } + else + { + /* Draw background */ + if(render_bg != NULL) + render_bg(line); + + /* Draw sprites */ + if(render_obj != NULL) + render_obj(line); + + /* Blank leftmost column of display */ + if(vdp.reg[0] & 0x20) + { + memset(linebuf, BACKDROP_COLOR, 8); + } + } + + remap_8_to_32(meow_line); +} + + +/* Draw the Master System background */ +void render_bg_sms(int line) +{ + int locked = 0; + int yscroll_mask = (vdp.extended) ? 256 : 224; + int v_line = (line + vdp.reg[9]) % yscroll_mask; + int v_row = (v_line & 7) << 3; + int hscroll = ((vdp.reg[0] & 0x40) && (line < 0x10)) ? 0 : (0x100 - vdp.reg[8]); + int column = 0; + uint16 attr; + uint8 *nt = &vdp.vram[vdp.ntab + (((v_line >> 3) << 6) & ((((vdp.reg[2] & 1) | vdp.quirk_disabled) << 10) | (~0U ^ (1 << 10)) ) )]; + int nt_scroll = (hscroll >> 3); + int shift = (hscroll & 7); + uint8 atex_mask; + + uint8 *cache_ptr; + uint8 *linebuf_ptr = &linebuf[0 - shift]; + + /* Draw first column (clipped) */ + if(shift) + { + int x; + + for(x = shift; x < 8; x++) + linebuf[(0 - shift) + (x)] = 0; + + column++; + } + + /* Draw a line of the background */ + for(; column < 32; column++) + { + /* Stop vertical scrolling for leftmost eight columns */ + if((vdp.reg[0] & 0x80) && (!locked) && (column >= 24)) + { + locked = 1; + v_row = (line & 7) << 3; + nt = &vdp.vram[((vdp.reg[2] << 10) & 0x3800) + ((line >> 3) << 6)]; + } + + /* Get name table attribute word */ + attr = nt[(((column + nt_scroll) & 0x1F) << 1) | 0] | (nt[(((column + nt_scroll) & 0x1F) << 1) | 1] << 8); + + /* Expand priority and palette bits */ + atex_mask = (attr >> 7) & 0x30; + + /* Point to a line of pattern data in cache */ + cache_ptr = &bg_pattern_cache[((attr & 0x7FF) << 6) | (v_row)]; + + for(int i = 0; i < 8; i++) + { + linebuf_ptr[column * 8 + i] = cache_ptr[i] | atex_mask; + } + } + + /* Draw last column (clipped) */ + if(shift) + { + int x, c, a; + + uint8 *p = &linebuf[(0 - shift)+(column << 3)]; + + attr = nt[(((column + nt_scroll) & 0x1F) << 1) | 0] | (nt[(((column + nt_scroll) & 0x1F) << 1) | 1] << 8); + + a = (attr >> 7) & 0x30; + + for(x = 0; x < shift; x++) + { + c = bg_pattern_cache[((attr & 0x7FF) << 6) | (v_row) | (x)]; + p[x] = ((c) | (a)); + } + } +} + + + + +/* Draw sprites */ +void render_obj_sms(int line) +{ + int i; + uint8 collision_buffer = 0; + + /* Sprite count for current line (8 max.) */ + int count = 0; + + /* Sprite dimensions */ + int width = 8; + int height = (vdp.reg[1] & 0x02) ? 16 : 8; + + /* Pointer to sprite attribute table */ + uint8 *st = (uint8 *)&vdp.vram[vdp.satb]; + + /* Adjust dimensions for double size sprites */ + if(vdp.reg[1] & 0x01) + { + width *= 2; + height *= 2; + } + + /* Draw sprites in front-to-back order */ + for(i = 0; i < 64; i++) + { + /* Sprite Y position */ + int yp = st[i]; + + /* Found end of sprite list marker for non-extended modes? */ + if(vdp.extended == 0 && yp == 208) + goto end; + + /* Actual Y position is +1 */ + yp++; + + /* Wrap Y coordinate for sprites > 240 */ + if(yp > 240) yp -= 256; + + /* Check if sprite falls on current line */ + if((line >= yp) && (line < (yp + height))) + { + uint8 *linebuf_ptr; + + /* Width of sprite */ + int start = 0; + int end = width; + + /* Sprite X position */ + int xp = st[0x80 + (i << 1)]; + + /* Pattern name */ + int n = st[0x81 + (i << 1)]; + + /* Bump sprite count */ + count++; + + /* Too many sprites on this line ? */ + if(count == 9) + { + vdp.status |= 0x40; + goto end; + } + + /* X position shift */ + if(vdp.reg[0] & 0x08) xp -= 8; + + /* Add MSB of pattern name */ + if(vdp.reg[6] & 0x04) n |= 0x0100; + + /* Mask LSB for 8x16 sprites */ + if(vdp.reg[1] & 0x02) n &= 0x01FE; + + /* Point to offset in line buffer */ + linebuf_ptr = (uint8 *)&linebuf[xp]; + + /* Clip sprites on left edge */ + if(xp < 0) + { + start = (0 - xp); + } + + /* Clip sprites on right edge */ + if((xp + width) > 256) + { + end = (256 - xp); + } + + /* Draw double size sprite */ + if(vdp.reg[1] & 0x01) + { + int x; + uint8 *cache_ptr = (uint8 *)&bg_pattern_cache[(n << 6) | (((line - yp) >> 1) << 3)]; + + /* Draw sprite line */ + for(x = start; x < end; x++) + { + /* Source pixel from cache */ + uint8 sp = cache_ptr[(x >> 1)]; + + /* Only draw opaque sprite pixels */ + if(sp) + { + /* Background pixel from line buffer */ + uint8 bg = linebuf_ptr[x]; + + /* Look up result */ + linebuf_ptr[x] = lut[(bg << 8) | (sp)]; + + /* Update collision buffer */ + collision_buffer |= bg; + } + } + } + else /* Regular size sprite (8x8 / 8x16) */ + { + int x; + uint8 *cache_ptr = (uint8 *)&bg_pattern_cache[(n << 6) | ((line - yp) << 3)]; + + /* Draw sprite line */ + for(x = start; x < end; x++) + { + /* Source pixel from cache */ + uint8 sp = cache_ptr[x]; + + /* Only draw opaque sprite pixels */ + if(sp) + { + /* Background pixel from line buffer */ + uint8 bg = linebuf_ptr[x]; + + /* Look up result */ + linebuf_ptr[x] = lut[(bg << 8) | (sp)]; + + /* Update collision buffer */ + collision_buffer |= bg; + } + } + } + } + } +end: + /* Set sprite collision flag */ + if(collision_buffer & 0x40) + vdp.status |= 0x20; +} + + + +void update_bg_pattern_cache(void) +{ + int i; + uint8 x, y; + uint16 name; + + if(!bg_list_index) return; + + for(i = 0; i < bg_list_index; i++) + { + name = bg_name_list[i]; + bg_name_list[i] = 0; + + for(y = 0; y < 8; y++) + { + if(bg_name_dirty[name] & (1 << y)) + { + uint8 *dst = &bg_pattern_cache[name << 6]; + + uint16 bp01 = vdp.vram16[(name << 4) | (y << 1) | (0)]; + uint16 bp23 = vdp.vram16[(name << 4) | (y << 1) | (1)]; + uint32 temp = (bp_lut[bp01] >> 2) | (bp_lut[bp23]); + + for(x = 0; x < 8; x++) + { + uint8 c = (temp >> (x << 2)) & 0x0F; + dst[0x00000 | (y << 3) | (x)] = (c); + dst[0x08000 | (y << 3) | (x ^ 7)] = (c); + dst[0x10000 | ((y ^ 7) << 3) | (x)] = (c); + dst[0x18000 | ((y ^ 7) << 3) | (x ^ 7)] = (c); + } + } + } + bg_name_dirty[name] = 0; + } + bg_list_index = 0; +} + +static uint32 SystemColorMap[4096]; + +/* Update a palette entry */ +void palette_sync(int index, int force) +{ + uint32 color; + + if(IS_GG) + color = SystemColorMap[(vdp.cram[(index << 1) | 0] | (vdp.cram[(index << 1) | 1] << 8)) & 4095]; + else + { + if(!(vdp.reg[0] & 0x4)) + { + color = SystemColorMap[tms_crom[index & 0x0F] & 0x3F]; + } + else + color = SystemColorMap[vdp.cram[index] & 0x3F]; + } + pixel[index] = color; +} + +static void remap_8_to_32(int line) +{ + int i; + uint32 *p = (uint32 *)&bitmap.data[(line * bitmap.pitch)]; + + for(i = 0; i < 256; i++) + { + p[i] = pixel[ internal_buffer[i] & PIXEL_MASK ]; + } +} + +void SMS_VDPSetPixelFormat(const MDFN_PixelFormat &format, const uint8* CustomPalette) +{ + int r, g, b; + + if(IS_GG) + { + for(int i = 0; i < 4096; i++) + { + if(CustomPalette) + { + r = CustomPalette[i * 3 + 0]; + g = CustomPalette[i * 3 + 1]; + b = CustomPalette[i * 3 + 2]; + } + else + { + /* ----BBBBGGGGRRRR */ + r = (i & 0xF) * 17; + g = ((i >> 4) & 0xF) * 17; + b = ((i >> 8) & 0xF) * 17; + } + + SystemColorMap[i] = format.MakeColor(r, g, b); + } + } + else + { + for(int i = 0; i < 64; i++) + { + if(CustomPalette) + { + r = CustomPalette[i * 3 + 0]; + g = CustomPalette[i * 3 + 1]; + b = CustomPalette[i * 3 + 2]; + } + else + { + /* --BBGGRR */ + r = (i & 0x3) * 85; + g = ((i >> 2) & 0x3) * 85; + b = ((i >> 4) & 0x3) * 85; + } + + SystemColorMap[i] = format.MakeColor(r, g, b); + } + } + + for(int i = 0; i < PALETTE_SIZE; i++) + palette_sync(i, 1); +} + +} diff --git a/Mednafen/mednafen/sms/render.h b/Mednafen/mednafen/sms/render.h new file mode 100644 index 0000000000..8225df8cd5 --- /dev/null +++ b/Mednafen/mednafen/sms/render.h @@ -0,0 +1,38 @@ + +#ifndef _RENDER_H_ +#define _RENDER_H_ + +namespace MDFN_IEN_SMS +{ + +/* Used for blanking a line in whole or in part */ +#define BACKDROP_COLOR (0x10 | (vdp.reg[7] & 0x0F)) + +extern void (*render_bg)(int line); +extern void (*render_obj)(int line); +extern uint8 *linebuf; +extern uint8 internal_buffer[0x100]; +extern uint32 pixel[]; +extern uint8 bg_name_dirty[0x200]; +extern uint16 bg_name_list[0x200]; +extern uint16 bg_list_index; +extern uint8 bg_pattern_cache[0x20000]; +extern uint8 tms_lookup[16][256][2]; +extern uint8 mc_lookup[16][256][8]; +extern uint8 txt_lookup[256][2]; +extern uint8 bp_expand[256][8]; +extern uint8 lut[0x10000]; +extern uint32 bp_lut[0x10000]; + +void render_shutdown(void); +void render_init(void); +void render_reset(void); +void render_line(int line, int skip); +void render_bg_sms(int line); +void render_obj_sms(int line); +void update_bg_pattern_cache(void); +void palette_sync(int index, int force); + +} + +#endif /* _RENDER_H_ */ diff --git a/Mednafen/mednafen/sms/romdb.cpp b/Mednafen/mednafen/sms/romdb.cpp new file mode 100644 index 0000000000..a71b96b0d8 --- /dev/null +++ b/Mednafen/mednafen/sms/romdb.cpp @@ -0,0 +1,41 @@ +#include "shared.h" +#include "romdb.h" + +namespace MDFN_IEN_SMS +{ + +static const rominfo_t game_list[] = { + { 0x29822980, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Cosmic Spacehead" }, + { 0xB9664AE1, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Fantastic Dizzy" }, + { 0xA577CE46, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Micro Machines" }, + { 0x8813514B, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Excellent Dizzy (Proto)" }, + { 0xAA140C9C, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Excellent Dizzy (Proto - GG)" }, + { 0xea5c3a6f, MAPPER_CODIES, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Dinobasher Starring Bignose the Caveman (Proto)" }, + { 0xa109a6fe, MAPPER_SEGA, DISPLAY_PAL, TERRITORY_EXPORT, -1, "Power Strike II" }, + + // Game Gear + {0xd9a7f170, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, -1, "S.S. Lucifer" }, + + {0x5e53c7f7, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, -1, "Ernie Els Golf" }, + {0xc888222b, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, CONSOLE_SMS, "Fantastic Dizzy" }, +/* Not working?*/ {0x152f0dcc, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, -1, "Drop Zone" }, +/* Not working?*/ {0x8813514b, MAPPER_CODIES, DISPLAY_NTSC, TERRITORY_EXPORT, -1, "Excellent Dizzy Collection" }, + + // SG-1000 + { 0x092f29d6, MAPPER_CASTLE, DISPLAY_NTSC, TERRITORY_DOMESTIC, -1, "The Castle" }, + { (uint32)-1, -1 , -1 , -1 , -1, NULL}, +}; + +const rominfo_t *find_rom_in_db(uint32 crc) +{ + /* Look up mapper in game list */ + for(int i = 0; game_list[i].name != NULL; i++) + { + if(crc == game_list[i].crc) + return(&game_list[i]); + } + + return(NULL); +} + +} diff --git a/Mednafen/mednafen/sms/romdb.h b/Mednafen/mednafen/sms/romdb.h new file mode 100644 index 0000000000..ed8a2d19a2 --- /dev/null +++ b/Mednafen/mednafen/sms/romdb.h @@ -0,0 +1,20 @@ +#ifndef __ROMDB_H +#define __ROMDB_H + +namespace MDFN_IEN_SMS +{ + +typedef struct { + uint32 crc; + int mapper; + int display; + int territory; + int system; + const char *name; +} rominfo_t; + +const rominfo_t *find_rom_in_db(uint32 crc); + +} + +#endif diff --git a/Mednafen/mednafen/sms/shared.h b/Mednafen/mednafen/sms/shared.h new file mode 100644 index 0000000000..3784853b1d --- /dev/null +++ b/Mednafen/mednafen/sms/shared.h @@ -0,0 +1,18 @@ +#ifndef _SHARED_H_ +#define _SHARED_H_ + +#include +#include +#include "sms.h" +#include "pio.h" +#include "memz80.h" +#include "vdp.h" +#include "render.h" +#include "sound.h" +#include "system.h" +#include "tms.h" +#include "cart.h" + +using namespace MDFN_IEN_SMS; + +#endif /* _SHARED_H_ */ diff --git a/Mednafen/mednafen/sms/sms.cpp b/Mednafen/mednafen/sms/sms.cpp new file mode 100644 index 0000000000..911c3045bc --- /dev/null +++ b/Mednafen/mednafen/sms/sms.cpp @@ -0,0 +1,117 @@ +/* + sms.c -- + Sega Master System console emulation. +*/ +#include "shared.h" + +namespace MDFN_IEN_SMS +{ + +/* SMS context */ +sms_t sms; + +void sms_writebyte(uint16 A, uint8 V) +{ + if(A >= 0xC000) + sms.wram[A & 0x1FFF] = V; + + Cart_Write(A, V); +} + +uint8 sms_readbyte(uint16 A) +{ + uint8 ret; + + if(A >= 0xC000) + ret = sms.wram[A & 0x1FFF]; + else + ret = Cart_Read(A); + + return(ret); +} + +void sms_init(void) +{ + z80_init(); + + /* Default: open bus */ + data_bus_pullup = 0x00; + data_bus_pulldown = 0x00; + + z80_writebyte = sms_writebyte; + z80_readbyte = sms_readbyte; + + /* Force SMS (J) console type if FM sound enabled */ + if(sms.use_fm) + { + sms.console = CONSOLE_SMSJ; + sms.territory = TERRITORY_DOMESTIC; + sms.display = DISPLAY_NTSC; + } + + /* Initialize selected console emulation */ + switch(sms.console) + { + case CONSOLE_SMS: + z80_writeport = sms_port_w; + z80_readport = sms_port_r; + break; + + case CONSOLE_SMSJ: + z80_writeport = smsj_port_w; + z80_readport = smsj_port_r; + break; + + case CONSOLE_SMS2: + z80_writeport = sms_port_w; + z80_readport = sms_port_r; + data_bus_pullup = 0xFF; + break; + + case CONSOLE_GG: + z80_writeport = gg_port_w; + z80_readport = gg_port_r; + data_bus_pullup = 0xFF; + break; + + case CONSOLE_GGMS: + z80_writeport = ggms_port_w; + z80_readport = ggms_port_r; + data_bus_pullup = 0xFF; + break; + + case CONSOLE_GEN: + case CONSOLE_MD: + z80_writeport = md_port_w; + z80_readport = md_port_r; + break; + + case CONSOLE_GENPBC: + case CONSOLE_MDPBC: + z80_writeport = md_port_w; + z80_readport = md_port_r; + data_bus_pullup = 0xFF; + break; + } +} + +void sms_shutdown(void) +{ + /* Nothing to do */ +} + +void sms_reset(void) +{ + z80_reset(); + + /* Clear SMS context */ + memset(sms.wram, 0, sizeof(sms.wram)); + + sms.paused = 0x00; + sms.save = 0x00; + sms.fm_detect = 0x00; + sms.memctrl = 0xAB; + sms.ioctrl = 0xFF; +} + +} diff --git a/Mednafen/mednafen/sms/sms.h b/Mednafen/mednafen/sms/sms.h new file mode 100644 index 0000000000..f9574e2780 --- /dev/null +++ b/Mednafen/mednafen/sms/sms.h @@ -0,0 +1,99 @@ + +#ifndef _SMS_H_ +#define _SMS_H_ + +namespace MDFN_IEN_SMS +{ + +enum { + SLOT_BIOS = 0, + SLOT_CARD = 1, + SLOT_CART = 2, + SLOT_EXP = 3 +}; + +enum { + MAPPER_NONE = 0, + MAPPER_SEGA = 1, + MAPPER_CODIES = 2, + MAPPER_CASTLE = 3, +}; + +enum { + DISPLAY_NTSC = 0, + DISPLAY_PAL = 1 +}; + +enum { + CLOCK_NTSC = 3579545, + CLOCK_PAL = 3546893 +}; + +enum { + CONSOLE_SMS = 0x20, + CONSOLE_SMSJ = 0x21, + CONSOLE_SMS2 = 0x22, + + CONSOLE_GG = 0x40, + CONSOLE_GGMS = 0x41, + + CONSOLE_MD = 0x80, + CONSOLE_MDPBC = 0x81, + CONSOLE_GEN = 0x82, + CONSOLE_GENPBC = 0x83 +}; + +#define HWTYPE_SMS CONSOLE_SMS +#define HWTYPE_GG CONSOLE_GG +#define HWTYPE_MD CONSOLE_MD + +#define IS_SMS (sms.console & HWTYPE_SMS) +#define IS_GG (sms.console & HWTYPE_GG) +#define IS_MD (sms.console & HWTYPE_MD) + +enum { + TERRITORY_DOMESTIC = 0, + TERRITORY_EXPORT = 1 +}; + +/* SMS context */ +typedef struct +{ + uint8 wram[0x2000]; + uint8 paused; + uint8 save; + uint8 territory; + uint8 console; + uint8 display; + uint8 fm_detect; + uint8 use_fm; + uint8 memctrl; + uint8 ioctrl; + struct { + uint8 pdr; /* Parallel data register */ + uint8 ddr; /* Data direction register */ + uint8 txdata; /* Transmit data buffer */ + uint8 rxdata; /* Receive data buffer */ + uint8 sctrl; /* Serial mode control and status */ + } sio; + struct { + int type; + } device[2]; + + uint32 timestamp; + int32 cycle_counter; +} sms_t; + +/* Global data */ +extern sms_t sms; + +/* Function prototypes */ +uint8 sms_readbyte(uint16 A); +void sms_init(void); +void sms_reset(void); +void sms_shutdown(void); +void sms_mapper_w(int address, int data); +int sms_irq_callback(int param); + +} +#endif /* _SMS_H_ */ diff --git a/Mednafen/mednafen/sms/sound.cpp b/Mednafen/mednafen/sms/sound.cpp new file mode 100644 index 0000000000..f192c89892 --- /dev/null +++ b/Mednafen/mednafen/sms/sound.cpp @@ -0,0 +1,213 @@ +/* + Copyright (C) 1998-2004 Charles MacDonald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "shared.h" +#include +#include + +#include +#include + +namespace MDFN_IEN_SMS +{ + +static Sms_Apu apu; +static Stereo_Buffer zebuf; +typedef Blip_Synth FMSynth_t; +static FMSynth_t fmsynth; +static EMU2413 *FMThing = NULL; +static uint32 SoundClock; + +/*--------------------------------------------------------------------------*/ +/* Sound chip access handlers */ +/*--------------------------------------------------------------------------*/ + +void psg_stereo_w(int data) +{ + apu.write_ggstereo(sms.timestamp, data); +} + +void psg_write(int data) +{ + //printf("Write: %d, %02x\n", sms.timestamp, data); + apu.write_data(sms.timestamp, data); +} + +/*--------------------------------------------------------------------------*/ +/* Mark III FM Unit / Master System (J) built-in FM handlers */ +/*--------------------------------------------------------------------------*/ + +int fmunit_detect_r(void) +{ + //printf("Detect_r: %02x\n", sms.fm_detect); + return sms.fm_detect; +} + +void fmunit_detect_w(int data) +{ + //printf("Detect_w: %02x\n", data); + sms.fm_detect = data; +} + +static int16 fm_last_value; +static int32 fm_last_timestamp; +static int32 fm_div; + +static void UpdateFM(void) +{ + int32 cycles = sms.timestamp - fm_last_timestamp; + + fm_div -= cycles; + while(fm_div <= 0) + { + int32 new_value; + + new_value = EMU2413_calc(FMThing); + + //if(new_value > 32767) { printf("MOO0: %d\n", new_value); new_value = 32767; } + //else if(new_value < -32768) { printf("MOO1: %d\n", new_value); new_value = -32768; } + + //if(abs(new_value) > 95) + //{ + // printf("new=%d, last=%d\n", new_value, fm_last_value); + // if(new_value < -) new_value = -95; + // else new_value = 95; + //} + + fmsynth.offset(sms.timestamp + fm_div, new_value - fm_last_value, zebuf.left()); + fmsynth.offset(sms.timestamp + fm_div, new_value - fm_last_value, zebuf.right()); + fm_last_value = new_value; + fm_div += 72; + } + + fm_last_timestamp = sms.timestamp; +} + +void fmunit_write(int offset, int data) +{ + //printf("FM Write: %d %d\n", offset, data); + if(FMThing) + { + UpdateFM(); + EMU2413_writeIO(FMThing, offset, data); + } +} + +void SMS_SoundReset(void) +{ + apu.reset(); + if(FMThing) + EMU2413_reset(FMThing); +} + + +int32 SMS_SoundFlush(int16 *SoundBuf, int32 MaxSoundFrames) +{ + int32 FrameCount = 0; + + if(FMThing) + UpdateFM(); + + apu.end_frame(sms.timestamp); + + zebuf.end_frame(sms.timestamp); + + if(SoundBuf) + FrameCount = zebuf.read_samples(SoundBuf, MaxSoundFrames * 2) / 2; + else + zebuf.clear(); + + fm_last_timestamp = 0; + + return(FrameCount); +} + +static void RedoVolume(void) +{ + apu.output(zebuf.center(), zebuf.left(), zebuf.right()); + apu.volume(0.50); + fmsynth.volume(1.0 / 16384); //32768); //1.0 / 256); // / 65536); //0.15 / 8192); +} + +void SMS_SoundInit(uint32 clock, bool WantFM) +{ + SoundClock = clock; + + SMS_SetSoundRate(0); + zebuf.clock_rate((long)(SoundClock)); + + RedoVolume(); + zebuf.bass_freq(20); + + if(WantFM) + FMThing = EMU2413_new(3579545); +} + +void SMS_SoundClose(void) +{ + if(FMThing) + { + EMU2413_delete(FMThing); + FMThing = NULL; + } + +} + +bool SMS_SetSoundRate(uint32 rate) +{ + zebuf.set_sample_rate(rate ? rate : 44100, 60); + + return(TRUE); +} + + +int SMS_SoundStateAction(StateMem *sm, int load, int data_only) +{ + Sms_ApuState sn_state; + int ret = 1; + + memset(&sn_state, 0, sizeof(Sms_ApuState)); + + if(!load) + { + apu.save_state(&sn_state); + } + + SFORMAT StateRegs[] = + { + SFARRAY32N(sn_state.volume, 4, "Volume"), + SFARRAY32N(sn_state.sq_period, 3, "SQPeriod"), + SFARRAY32N(sn_state.sq_phase, 3, "SQPhase"), + SFVARN(sn_state.noise_period, "NPeriod"), + SFVARN(sn_state.noise_shifter, "NShifter"), + SFVARN(sn_state.noise_feedback, "NFeedback"), + SFVARN(sn_state.latch, "Latch"), + SFVARN(sn_state.ggstereo, "GGStereo"), + SFEND + }; + + if(!MDFNSS_StateAction(sm, load, data_only, StateRegs, "PSG")) + ret = 0; + else if(load) + { + apu.load_state(&sn_state); + } + return(ret); +} + +} diff --git a/Mednafen/mednafen/sms/sound.h b/Mednafen/mednafen/sms/sound.h new file mode 100644 index 0000000000..822fbca99f --- /dev/null +++ b/Mednafen/mednafen/sms/sound.h @@ -0,0 +1,22 @@ +#ifndef __SMS_SOUND_H +#define __SMS_SOUND_H + +namespace MDFN_IEN_SMS +{ + +/* Function prototypes */ +void psg_write(int data); +void psg_stereo_w(int data); +int fmunit_detect_r(void); +void fmunit_detect_w(int data); +void fmunit_write(int offset, int data); + +void SMS_SoundClose(void); +int32 SMS_SoundFlush(int16 *SoundBuf, int32 MaxSoundFrames); +void SMS_SoundReset(void); +bool SMS_SetSoundRate(uint32 rate); +int SMS_SoundStateAction(StateMem *sm, int load, int data_only); +void SMS_SoundInit(uint32 clock, bool WantFM); + +} +#endif diff --git a/Mednafen/mednafen/sms/system.cpp b/Mednafen/mednafen/sms/system.cpp new file mode 100644 index 0000000000..0e415f6d66 --- /dev/null +++ b/Mednafen/mednafen/sms/system.cpp @@ -0,0 +1,518 @@ +/* + Copyright (C) 1998-2004 Charles MacDonald + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "shared.h" +#include + +namespace MDFN_IEN_SMS +{ + +bitmap_t bitmap; +input_t input; +static int32 SoftResetCount; + +/* Run the virtual console emulation for one frame */ +void system_frame(int skip_render) +{ + /* Debounce pause key */ + if(input.system & INPUT_PAUSE) + { + if(!sms.paused) + { + sms.paused = 1; + + z80_nmi(); + } + } + else + { + sms.paused = 0; + } + + if(SoftResetCount) + { + SoftResetCount--; + if(!SoftResetCount) + input.system &= ~INPUT_RESET; + } + SMS_VDPRunFrame(skip_render); +} + + +void system_reset(void) +{ + SoftResetCount = 0; + + Cart_Reset(); + + sms_reset(); + pio_reset(); + vdp_reset(); + render_reset(); + SMS_SoundReset(); +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(SoftResetCount), + SFVAR(sms.cycle_counter), + SFARRAYN(sms.wram, 0x2000, "RAM"), + + SFVAR(sms.paused), + + SFVAR(input.pad[0]), + SFVAR(input.pad[1]), + + SFVAR(input.analog[0]), + SFVAR(input.analog[1]), + + SFVAR(input.system), + + SFVAR(sms.fm_detect), + SFVAR(sms.memctrl), + + //SFVAR(z80_runtime), + //SFARRAY(CPUExRAM, 16384), + //SFVAR(FlashStatusEnable), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + z80_state_action(sm, load, data_only, "Z80"); + Cart_StateAction(sm, load, data_only); + SMS_PIOStateAction(sm, load, data_only); + SMS_SoundStateAction(sm, load, data_only); + SMS_VDPStateAction(sm, load, data_only); + + if(load) + { + if(sms.cycle_counter > 1000) + { + sms.cycle_counter = 1000; + puts("sms.cycle_counter sanity failed"); + } + } +} + +static uint8 *InputPtrs[2]; + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + InputPtrs[port] = (uint8 *)ptr; +} + +static void Emulate(EmulateSpecStruct *espec) +{ + if(espec->VideoFormatChanged) + SMS_VDPSetPixelFormat(espec->surface->format, espec->CustomPalette); + + if(espec->SoundFormatChanged) + SMS_SetSoundRate(espec->SoundRate); + + + sms.timestamp = 0; + + input.pad[0] = *InputPtrs[0] & 0x3F; + + if(IS_SMS) + { + input.pad[1] = *InputPtrs[1] & 0x3F; + + if((*InputPtrs[0] | *InputPtrs[1]) & 0x40) + input.system |= INPUT_PAUSE; + else + input.system &= ~INPUT_PAUSE; + } + else // GG: + { + if(*InputPtrs[0] & 0x40) + { + input.system |= INPUT_START; + } + else + input.system &= ~INPUT_START; + } + + //NGPJoyLatch = *chee; + + MDFNMP_ApplyPeriodicCheats(); + + if(sms.console == CONSOLE_GG) + { + espec->DisplayRect.x = 48; + espec->DisplayRect.y = 48; + espec->DisplayRect.w = 160; + espec->DisplayRect.h = 144; + } + else + { + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.w = 256; + espec->DisplayRect.h = 240; + } + + bitmap.data = (uint8*)espec->surface->pixels; + bitmap.width = 256; + bitmap.height = 240; + bitmap.pitch = 256 * sizeof(uint32); + + system_frame(espec->skip); + + espec->MasterCycles = sms.timestamp; + espec->SoundBufSize = SMS_SoundFlush(espec->SoundBuf, espec->SoundBufMaxSize); +} + +static void Cleanup(void) +{ + Cart_Close(); + sms_shutdown(); + pio_shutdown(); + vdp_shutdown(); + render_shutdown(); + SMS_SoundClose(); +} + +static void CloseGame(void) +{ + try + { + Cart_SaveNV(); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + + Cleanup(); +} + +static void LoadCommon(MDFNFILE *fp) +{ + try + { + /* Assign default settings (US NTSC machine) */ + sms.display = DISPLAY_NTSC; + + sms.territory = MDFN_GetSettingI("sms.territory"); + sms.use_fm = FALSE; + + Cart_Init(fp); + Cart_LoadNV(); + + if(IS_SMS && sms.territory == TERRITORY_DOMESTIC) + sms.use_fm = MDFN_GetSettingB("sms.fm"); + + MDFNMP_Init(1024, 65536 / 1024); + + system_assign_device(PORT_A, DEVICE_PAD2B); + system_assign_device(PORT_B, DEVICE_PAD2B); + + MDFNMP_AddRAM(8192, 0xC000, sms.wram); + + sms_init(); + pio_init(); + vdp_init(IS_SMS && sms.territory == TERRITORY_DOMESTIC); + render_init(); + + MDFNGameInfo->GameSetMD5Valid = FALSE; + + uint32 sndclk; + + if(sms.display == DISPLAY_PAL) + { + sndclk = 3546893; + MDFNGameInfo->fps = (uint32)((uint64)65536 * 256 * sndclk / 313 / 228); //6144000 * 65536 * 256 / 515 / 198); // 3072000 * 2 * 10000 / 515 / 198 + } + else + { + sndclk = 3579545; + MDFNGameInfo->fps = (uint32)((uint64)65536 * 256 * sndclk / 262 / 228); //6144000 * 65536 * 256 / 515 / 198); // 3072000 * 2 * 10000 / 515 / 198 + } + + MDFNGameInfo->MasterClock = MDFN_MASTERCLOCK_FIXED(sndclk); + + SMS_SoundInit(sndclk, sms.use_fm); + + sms.save = 0; + + system_reset(); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static bool TestMagicSMS(MDFNFILE *fp) +{ + if(strcasecmp(fp->ext, "sms") && strcasecmp(fp->ext, "sg") && strcasecmp(fp->ext, "sc")) + return(FALSE); + + return(TRUE); +} + +static bool TestMagicGG(MDFNFILE *fp) +{ + if(strcasecmp(fp->ext, "gg")) + return(FALSE); + + return(TRUE); +} + + +static void LoadSMS(MDFNFILE *fp) +{ + sms.console = CONSOLE_SMS; + + LoadCommon(fp); +} + +static void LoadGG(MDFNFILE *fp) +{ + sms.console = CONSOLE_GG; + + LoadCommon(fp); +} + +} + +static const IDIISG GGGamepadIDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "button1", "Button 1", 4, IDIT_BUTTON_CAN_RAPID, NULL }, + { "button2", "Button 2", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + { "Start", "Start", 6, IDIT_BUTTON, NULL }, +}; + +static const IDIISG SMSGamepadIDII = +{ + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "fire1", "Fire 1/Start", 4, IDIT_BUTTON_CAN_RAPID, NULL }, + { "fire2", "Fire 2", 5, IDIT_BUTTON_CAN_RAPID, NULL }, + { "pause", "Pause", 6, IDIT_BUTTON, NULL }, +}; + +static const std::vector GGInputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + GGGamepadIDII, + } +}; + +static const std::vector SMSInputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + SMSGamepadIDII, + } +}; + +static const std::vector GGPortInfo = +{ + { "builtin", "Built-In", GGInputDeviceInfo, "gamepad" }, +}; + +static const std::vector SMSPortInfo = +{ + { "port1", "Port 1", SMSInputDeviceInfo, "gamepad" }, + { "port2", "Port 2", SMSInputDeviceInfo, "gamepad" } +}; + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: system_reset(); break; + case MDFN_MSC_RESET: if(IS_SMS) + { + input.system |= INPUT_RESET; + SoftResetCount = 20; + } + else + system_reset(); + break; + } +} + +static MDFNSetting_EnumList Territory_List[] = +{ + { "domestic", TERRITORY_DOMESTIC, gettext_noop("Domestic(Japanese)") }, + { "export", TERRITORY_EXPORT, gettext_noop("Export(World)") }, + { NULL, 0 }, +}; + +static MDFNSetting SMSSettings[] = +{ + { "sms.territory", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("System territory/region."), NULL, MDFNST_ENUM, "export", NULL, NULL, NULL, NULL, Territory_List }, + { "sms.fm", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable FM sound emulation when playing domestic/Japan-region games."), NULL, MDFNST_BOOL, "1" }, + { NULL } +}; + +static MDFNSetting GGSettings[] = +{ + { NULL } +}; + + +static const FileExtensionSpecStruct SMSKnownExtensions[] = +{ + { ".sms", gettext_noop("Sega Master System ROM Image") }, + { NULL, NULL } +}; + +static const FileExtensionSpecStruct GGKnownExtensions[] = +{ + { ".gg", gettext_noop("Game Gear ROM Image") }, + { NULL, NULL } +}; + +static const CustomPalette_Spec SMSCPInfo[] = +{ + { gettext_noop("SMS 6-bit RGB"), NULL, { 64, 0 } }, + + { NULL, NULL } +}; + +static const CustomPalette_Spec GGCPInfo[] = +{ + { gettext_noop("GG 12-bit RGB"), NULL, { 4096, 0 } }, + + { NULL, NULL } +}; + + +MDFNGI EmulatedSMS = +{ + "sms", + "Sega Master System", + SMSKnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, + SMSPortInfo, + LoadSMS, + TestMagicSMS, + NULL, + NULL, + CloseGame, + + NULL, //ToggleLayer, + NULL, //"Hi\0Ho\0Mo\0", //"Background Scroll\0Foreground Scroll\0Sprites\0", + + NULL, + NULL, + + SMSCPInfo, + 1 << 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + SMSSettings, + 0, + 0, + FALSE, // Multires possible? + + 256, // lcm_width + 240, // lcm_height + NULL, // Dummy + + 256, // Nominal width + 240, // Nominal height + + 256, // Framebuffer width + 256, // Framebuffer height + + 2, // Number of output sound channels +}; + +MDFNGI EmulatedGG = +{ + "gg", + "Sega Game Gear", + GGKnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, + GGPortInfo, + LoadGG, + TestMagicGG, + NULL, + NULL, + CloseGame, + + NULL, //ToggleLayer, + NULL, //"Hi\0Ho\0Mo\0", //"Background Scroll\0Foreground Scroll\0Sprites\0", + + NULL, + NULL, + + GGCPInfo, + 1 << 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + GGSettings, + 0, + 0, + FALSE, // Multires possible? + + 160, // lcm_width + 144, // lcm_height + NULL, // Dummy + + + 160, // nominal width + 144, // nominal height + + 256, // Framebuffer width + 256, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/sms/system.h b/Mednafen/mednafen/sms/system.h new file mode 100644 index 0000000000..542f773b80 --- /dev/null +++ b/Mednafen/mednafen/sms/system.h @@ -0,0 +1,68 @@ + +#ifndef _SYSTEM_H_ +#define _SYSTEM_H_ + +namespace MDFN_IEN_SMS +{ + +#define APP_NAME "SMS Plus" +#define APP_VERSION "1.2" + +#define PALETTE_SIZE 0x20 + +/* Mask for removing unused pixel data */ +#define PIXEL_MASK 0x1F + +/* These can be used for 'input.pad[]' */ +#define INPUT_UP 0x00000001 +#define INPUT_DOWN 0x00000002 +#define INPUT_LEFT 0x00000004 +#define INPUT_RIGHT 0x00000008 +#define INPUT_BUTTON2 0x00000010 +#define INPUT_BUTTON1 0x00000020 + +/* These can be used for 'input.system' */ +#define INPUT_START 0x00000001 /* Game Gear only */ +#define INPUT_PAUSE 0x00000002 /* Master System only */ +#define INPUT_RESET 0x00000004 /* Master System only */ + +enum { + SRAM_SAVE = 0, + SRAM_LOAD = 1 +}; + + +/* User input structure */ +typedef struct +{ + uint32 pad[2]; + uint8 analog[2]; + uint32 system; +} input_t; + +/* Bitmap structure */ +typedef struct +{ + unsigned char *data; + int width; + int height; + int pitch; +} bitmap_t; + +/* Global variables */ +extern bitmap_t bitmap; /* Display bitmap */ +extern input_t input; /* Controller input */ + +/* Function prototypes */ +void system_frame(int skip_render); +void system_init(void); +void system_reset(void); +void system_manage_sram(uint8 *sram, int slot, int mode); +void system_poweron(void); +void system_poweroff(void); + +} + +#endif /* _SYSTEM_H_ */ + + diff --git a/Mednafen/mednafen/sms/tms.cpp b/Mednafen/mednafen/sms/tms.cpp new file mode 100644 index 0000000000..4e7b106af4 --- /dev/null +++ b/Mednafen/mednafen/sms/tms.cpp @@ -0,0 +1,521 @@ +/* + tms.c -- + TMS9918 and legacy video mode support. +*/ +#include "shared.h" + +namespace MDFN_IEN_SMS +{ + +int text_counter; /* Text offset counter */ +uint8 tms_lookup[16][256][2]; /* Expand BD, PG data into 8-bit pixels (G1,G2) */ +uint8 mc_lookup[16][256][8]; /* Expand BD, PG data into 8-bit pixels (MC) */ +uint8 txt_lookup[256][2]; /* Expand BD, PG data into 8-bit pixels (TX) */ +uint8 bp_expand[256][8]; /* Expand PG data into 8-bit pixels */ +uint8 tms_obj_lut[16*256]; /* Look up priority between SG and display pixels */ + +static const uint8 diff_mask[] = {0x07, 0x07, 0x0F, 0x0F}; +static const uint8 name_mask[] = {0xFF, 0xFF, 0xFC, 0xFC}; +static const uint8 diff_shift[] = {0, 1, 0, 1}; +static const uint8 size_tab[] = {8, 16, 16, 32}; + +/* Internally latched sprite data in the VDP */ +typedef struct { + int xpos; + uint8 attr; + uint8 sg[2]; +} tms_sprite; + +tms_sprite sprites[4]; +int sprites_found; + +void parse_line(int line) +{ + int yp, i; + int mode = vdp.reg[1] & 3; + int size = size_tab[mode]; + int diff, name; + uint8 *sa, *sg; + tms_sprite *p; + + /* Reset # of sprites found */ + sprites_found = 0; + + /* Parse sprites */ + for(i = 0; i < 32; i++) + { + /* Point to current sprite in SA and our current sprite record */ + p = &sprites[sprites_found]; + sa = &vdp.vram[vdp.sa + (i << 2)]; + + /* Fetch Y coordinate */ + yp = sa[0]; + + /* Check for end marker */ + if(yp == 0xD0) + goto parse_end; + + /* Wrap Y position */ + if(yp > 0xE0) + yp -= 256; + + /* Check if sprite falls on following line */ + if(line >= yp && line < (yp + size)) + { + /* Sprite overflow on this line */ + if(sprites_found == 4) + { + /* Set 5S and abort parsing */ + vdp.status |= 0x40; + goto parse_end; + } + + /* Fetch X position */ + p->xpos = sa[1]; + + /* Fetch name */ + name = sa[2] & name_mask[mode]; + + /* Load attribute into attribute storage */ + p->attr = sa[3]; + + /* Apply early clock bit */ + if(p->attr & 0x80) + p->xpos -= 32; + + /* Calculate offset in pattern */ + diff = ((line - yp) >> diff_shift[mode]) & diff_mask[mode]; + + /* Insert additional name bit for 16-pixel tall sprites */ + if(diff & 8) + name |= 1; + + /* Fetch SG data */ + sg = &vdp.vram[vdp.sg | (name << 3) | (diff & 7)]; + p->sg[0] = sg[0x00]; + p->sg[1] = sg[0x10]; + + /* Bump found sprite count */ + ++sprites_found; + } + } +parse_end: + + /* Insert number of last sprite entry processed */ + vdp.status = (vdp.status & 0xE0) | (i & 0x1F); +} + +void render_obj_tms(int line) +{ + int i, x = 0; + int size, start, end, mode; + uint8 *lb, *obj_lut, *ex[2]; + tms_sprite *p; + + mode = vdp.reg[1] & 3; + size = size_tab[mode]; + + /* Render sprites */ + for(i = 0; i < sprites_found; i++) + { + p = &sprites[i]; + lb = &linebuf[p->xpos]; + obj_lut = &tms_obj_lut[(p->attr & 0x0F) << 8]; + + /* Point to expanded PG data */ + ex[0] = bp_expand[p->sg[0]]; + ex[1] = bp_expand[p->sg[1]]; + + /* Clip left edge */ + if(p->xpos < 0) + start = 0 - p->xpos; + else + start = 0; + + /* Clip right edge */ + if(p->xpos > 256 - size) + end = 256 - p->xpos; + else + end = size; + + /* Render sprite line */ + switch(mode) + { + case 0: /* 8x8 */ + for(x = start; x < end; x++) { + if(ex[0][x]) + lb[x] = obj_lut[lb[x]]; + } + break; + + case 1: /* 8x8 zoomed */ + for(x = start; x < end; x++) { + if(ex[0][x >> 1]) + lb[x] = obj_lut[lb[x]]; + } + break; + + case 2: /* 16x16 */ + for(x = start; x < end; x++) { + if(ex[(x >> 3) & 1][x & 7]) + lb[x] = obj_lut[lb[x]]; + } + break; + + case 3: /* 16x16 zoomed */ + for(x = start; x < end; x++) { + if(ex[(x >> 4) & 1][(x >> 1) & 7]) + lb[x] = obj_lut[lb[x]]; + } + break; + } + } +} + +/**** +1.) NOTE: xpos can be negative, but the 'start' value that is added + to xpos will ensure it is positive. + + For an EC sprite that is offscreen, 'start' will be larger + than 'end' and the for-loop used for rendering will abort + on the first pass. +***/ + + +#define RENDER_TX_LINE \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; + +#define RENDER_TX_BORDER \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; \ + *lb++ = 0x10 | clut[0]; + +#define RENDER_GR_LINE \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; \ + *lb++ = 0x10 | clut[ *bpex++ ]; + +#define RENDER_MC_LINE \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; \ + *lb++ = 0x10 | *mcex++; + +void make_tms_tables(void) +{ + int i, j, x; + int bd, pg, ct; + int sx, bx; + + for(sx = 0; sx < 16; sx++) + { + for(bx = 0; bx < 256; bx++) + { +// uint8 bd = (bx & 0x0F); + uint8 bs = (bx & 0x40); +// uint8 bt = (bd == 0) ? 1 : 0; + uint8 sd = (sx & 0x0F); +// uint8 st = (sd == 0) ? 1 : 0; + + // opaque sprite pixel, choose 2nd pal and set sprite marker + if(sd && !bs) + { + tms_obj_lut[(sx<<8)|(bx)] = sd | 0x10 | 0x40; + } + else + if(sd && bs) + { + // writing over a sprite + tms_obj_lut[(sx<<8)|(bx)] = bx; + } + else + { + tms_obj_lut[(sx<<8)|(bx)] = bx; + } + } + } + + + /* Text lookup table */ + for(bd = 0; bd < 256; bd++) + { + uint8 bg = (bd >> 0) & 0x0F; + uint8 fg = (bd >> 4) & 0x0F; + + /* If foreground is transparent, use background color */ + if(fg == 0) fg = bg; + + txt_lookup[bd][0] = bg; + txt_lookup[bd][1] = fg; + } + + /* Multicolor lookup table */ + for(bd = 0; bd < 16; bd++) + { + for(pg = 0; pg < 256; pg++) + { + int l = (pg >> 4) & 0x0F; + int r = (pg >> 0) & 0x0F; + + /* If foreground is transparent, use background color */ + if(l == 0) l = bd; + if(r == 0) r = bd; + + /* Unpack 2 nibbles across eight pixels */ + for(x = 0; x < 8; x++) + { + int c = (x & 4) ? r : l; + + mc_lookup[bd][pg][x] = c; + } + } + } + + /* Make bitmap data expansion table */ + memset(bp_expand, 0, sizeof(bp_expand)); + for(i = 0; i < 256; i++) + { + for(j = 0; j < 8; j++) + { + int c = (i >> (j ^ 7)) & 1; + bp_expand[i][j] = c; + } + } + + /* Graphics I/II lookup table */ + for(bd = 0; bd < 0x10; bd++) + { + for(ct = 0; ct < 0x100; ct++) + { + int backdrop = (bd & 0x0F); + int background = (ct >> 0) & 0x0F; + int foreground = (ct >> 4) & 0x0F; + + /* If foreground is transparent, use background color */ + if(background == 0) background = backdrop; + if(foreground == 0) foreground = backdrop; + + tms_lookup[bd][ct][0] = background; + tms_lookup[bd][ct][1] = foreground; + } + } +} + + +void render_bg_tms(int line) +{ + switch(vdp.mode & 7) + { + case 0: /* Graphics I */ + render_bg_m0(line); + break; + + case 1: /* Text */ + render_bg_m1(line); + break; + + case 2: /* Graphics II */ + render_bg_m2(line); + break; + + case 3: /* Text (Extended PG) */ + render_bg_m1x(line); + break; + + case 4: /* Multicolor */ + render_bg_m3(line); + break; + + case 5: /* Invalid (1+3) */ + render_bg_inv(line); + break; + + case 6: /* Multicolor (Extended PG) */ + render_bg_m3x(line); + break; + + case 7: /* Invalid (1+2+3) */ + render_bg_inv(line); + break; + } +} + +/* Graphics I */ +void render_bg_m0(int line) +{ + int v_row = (line & 7); + int column; + int name; + + uint8 *clut; + uint8 *bpex; + uint8 *lb = &linebuf[0]; + uint8 *pn = &vdp.vram[vdp.pn + ((line >> 3) << 5)]; + uint8 *ct = &vdp.vram[vdp.ct]; + uint8 *pg = &vdp.vram[vdp.pg | (v_row)]; + + for(column = 0; column < 32; column++) + { + name = pn[column]; + clut = &tms_lookup[vdp.bd][ct[name >> 3]][0]; + bpex = &bp_expand[pg[name << 3]][0]; + RENDER_GR_LINE + } +} + +/* Text */ +void render_bg_m1(int line) +{ + int v_row = (line & 7); + int column; + + uint8 *clut; + uint8 *bpex; + uint8 *lb = &linebuf[0]; +// uint8 *pn = &vdp.vram[vdp.pn + ((line >> 3) * 40)]; + + uint8 *pn = &vdp.vram[vdp.pn + text_counter]; + + uint8 *pg = &vdp.vram[vdp.pg | (v_row)]; + uint8 bk = vdp.reg[7]; + + clut = &txt_lookup[bk][0]; + + for(column = 0; column < 40; column++) + { + bpex = &bp_expand[pg[pn[column] << 3]][0]; + RENDER_TX_LINE + } + + /* V3 */ + if((vdp.line & 7) == 7) + text_counter += 40; + + RENDER_TX_BORDER +} + +/* Text + extended PG */ +void render_bg_m1x(int line) +{ + int v_row = (line & 7); + int column; + + uint8 *clut; + uint8 *bpex; + uint8 *lb = &linebuf[0]; + uint8 *pn = &vdp.vram[vdp.pn + ((line >> 3) * 40)]; + uint8 *pg = &vdp.vram[vdp.pg + (v_row) + ((line & 0xC0) << 5)]; + uint8 bk = vdp.reg[7]; + + clut = &tms_lookup[0][bk][0]; + + for(column = 0; column < 40; column++) + { + bpex = &bp_expand[pg[pn[column] << 3]][0]; + RENDER_TX_LINE + } + RENDER_TX_BORDER +} + +/* Invalid (2+3/1+2+3) */ +void render_bg_inv(int line) +{ + int column; + uint8 *clut; + uint8 *bpex; + uint8 *lb = &linebuf[0]; + uint8 bk = vdp.reg[7]; + + clut = &txt_lookup[bk][0]; + + for(column = 0; column < 40; column++) + { + bpex = &bp_expand[0xF0][0]; + RENDER_TX_LINE + } +} + +/* Multicolor */ +void render_bg_m3(int line) +{ + int column; + uint8 *mcex; + uint8 *lb = &linebuf[0]; + + uint8 *pn = &vdp.vram[vdp.pn + ((line >> 3) << 5)]; + uint8 *pg = &vdp.vram[vdp.pg + ((line >> 2) & 7)]; + + for(column = 0; column < 32; column++) + { + mcex = &mc_lookup[vdp.bd][pg[pn[column]<<3]][0]; + RENDER_MC_LINE + } +} + +/* Multicolor + extended PG */ +void render_bg_m3x(int line) +{ + int column; + uint8 *mcex; + uint8 *lb = &linebuf[0]; + uint8 *pn = &vdp.vram[vdp.pn + ((line >> 3) << 5)]; + uint8 *pg = &vdp.vram[vdp.pg + ((line >> 2) & 7) + ((line & 0xC0) << 5)]; + + for(column = 0; column < 32; column++) + { + mcex = &mc_lookup[vdp.bd][pg[pn[column]<<3]][0]; + RENDER_MC_LINE + } +} + +/* Graphics II */ +void render_bg_m2(int line) +{ + int v_row = (line & 7); + int column; + int name; + + uint8 *clut; + uint8 *bpex; + uint8 *lb = &linebuf[0]; + uint8 *pn = &vdp.vram[vdp.pn | ((line & 0xF8) << 2)]; + uint8 *ct = &vdp.vram[(vdp.ct & 0x2000) | (v_row) | ((line & 0xC0) << 5)]; + uint8 *pg = &vdp.vram[(vdp.pg & 0x2000) | (v_row) | ((line & 0xC0) << 5)]; + + for(column = 0; column < 32; column++) + { + name = pn[column] << 3; + clut = &tms_lookup[vdp.bd][ct[name]][0]; + bpex = &bp_expand[pg[name]][0]; + RENDER_GR_LINE + } +} + +} diff --git a/Mednafen/mednafen/sms/tms.h b/Mednafen/mednafen/sms/tms.h new file mode 100644 index 0000000000..353e4e9b0d --- /dev/null +++ b/Mednafen/mednafen/sms/tms.h @@ -0,0 +1,24 @@ +#ifndef _TMS_H_ +#define _TMS_H_ + +namespace MDFN_IEN_SMS +{ + +extern int text_counter; + + +void make_tms_tables(void); +void render_bg_tms(int line); +void render_bg_m0(int line); +void render_bg_m1(int line); +void render_bg_m1x(int line); +void render_bg_inv(int line); +void render_bg_m3(int line); +void render_bg_m3x(int line); +void render_bg_m2(int line); +void render_obj_tms(int line); +void parse_line(int line); + +} + +#endif /* _TMS_H_ */ diff --git a/Mednafen/mednafen/sms/vdp.cpp b/Mednafen/mednafen/sms/vdp.cpp new file mode 100644 index 0000000000..9c9743ff4f --- /dev/null +++ b/Mednafen/mednafen/sms/vdp.cpp @@ -0,0 +1,656 @@ +/* + vdp.c -- + Video Display Processor (VDP) emulation. +*/ +#include "shared.h" +#include "hvc.inc" + +namespace MDFN_IEN_SMS +{ + +/* Mark a pattern as dirty */ +#define MARK_BG_DIRTY(addr) \ +{ \ + int name = (addr >> 5) & 0x1FF; \ + if(bg_name_dirty[name] == 0) \ + { \ + bg_name_list[bg_list_index] = name; \ + bg_list_index++; \ + } \ + bg_name_dirty[name] |= (1 << ((addr >> 2) & 7)); \ +} + + +/* VDP context */ +vdp_t vdp; + + +/* Initialize VDP emulation */ +void vdp_init(bool want_quirk) +{ + memset(&vdp, 0, sizeof(vdp_t)); + + vdp.lines_per_frame = (sms.display == DISPLAY_NTSC) ? 262 : 313; + vdp.quirk_disabled = !want_quirk; + + vdp_reset(); +} + +void vdp_shutdown(void) +{ + /* Nothing to do */ +} + + +/* Reset VDP emulation */ +void vdp_reset(void) +{ + memset(vdp.vram, 0, sizeof(vdp.vram)); + memset(vdp.cram, 0, sizeof(vdp.cram)); + memset(vdp.reg, 0, sizeof(vdp.reg)); + vdp.status = 0; + vdp.latch = 0; + vdp.pending = 0; + vdp.buffer = 0; + vdp.code = 0; + vdp.addr = 0; + + vdp.pn = 0; + vdp.ct = 0; + vdp.pg = 0; + vdp.sa = 0; + vdp.sg = 0; + vdp.ntab = 0; + vdp.satb = 0; + vdp.line = 0; + vdp.left = 0; + vdp.height = 192; + vdp.extended = 0; + vdp.mode = 0; + vdp.vint_pending = 0; + vdp.hint_pending = 0; + vdp.hc_latch = 0; + vdp.cram_latch = 0; + vdp.bd = 0; +} + +void vdp_hclatch(void) +{ + unsigned int pixel_pos = ((sms.timestamp % CYCLES_PER_LINE) * 3) >> 1; + + if(pixel_pos >= 0x128) + pixel_pos += 0xAA; + + vdp.hc_latch = pixel_pos >> 1; +} + +static void viewport_check(void) +{ + int i; + + int m1 = (vdp.reg[1] >> 4) & 1; + int m3 = (vdp.reg[1] >> 3) & 1; + int m2 = (vdp.reg[0] >> 1) & 1; + int m4 = (vdp.reg[0] >> 2) & 1; + + vdp.mode = (m4 << 3 | m3 << 2 | m2 << 1 | m1 << 0); + + // check if this is switching out of tms + if(!IS_GG) + { + for(i = 0; i < PALETTE_SIZE; i++) + palette_sync(i, 1); + } + + /* Check for extended modes when M4 and M2 are set */ + if((vdp.reg[0] & 0x06) == 0x06) + { + /* Examine M1 and M3 to determine selected mode */ + switch(vdp.reg[1] & 0x18) + { + case 0x00: /* 192 */ + case 0x18: /* 192 */ + vdp.height = 192; + vdp.extended = 0; + vdp.ntab = (vdp.reg[2] << 10) & 0x3800; + break; + + case 0x08: /* 240 */ + vdp.height = 240; + vdp.extended = 2; + vdp.ntab = ((vdp.reg[2] << 10) & 0x3000) | 0x0700; + break; + + case 0x10: /* 224 */ + vdp.height = 224; + vdp.extended = 1; + vdp.ntab = ((vdp.reg[2] << 10) & 0x3000) | 0x0700; + break; + + } + } + else + { + vdp.height = 192; + vdp.extended = 0; + vdp.ntab = (vdp.reg[2] << 10) & 0x3800; + } + + vdp.pn = (vdp.reg[2] << 10) & 0x3C00; + vdp.ct = (vdp.reg[3] << 6) & 0x3FC0; + vdp.pg = (vdp.reg[4] << 11) & 0x3800; + vdp.sa = (vdp.reg[5] << 7) & 0x3F80; + vdp.sg = (vdp.reg[6] << 11) & 0x3800; + + render_bg = (vdp.mode & 8) ? render_bg_sms : render_bg_tms; + render_obj = (vdp.mode & 8) ? render_obj_sms : render_obj_tms; +} + + +static void vdp_reg_w(uint8 r, uint8 d) +{ + /* Store register data */ + vdp.reg[r] = d; + + switch(r) + { + case 0x00: /* Mode Control No. 1 */ + if(vdp.hint_pending) + { + if(d & 0x10) + z80_set_interrupt(TRUE); + else + z80_set_interrupt(FALSE); + } + viewport_check(); + break; + + case 0x01: /* Mode Control No. 2 */ + if(vdp.vint_pending) + { + if(d & 0x20) + z80_set_interrupt(TRUE); + else + z80_set_interrupt(FALSE); + } + viewport_check(); + break; + + case 0x02: /* Name Table A Base Address */ + vdp.ntab = (vdp.reg[2] << 10) & 0x3800; + vdp.pn = (vdp.reg[2] << 10) & 0x3C00; + viewport_check(); + break; + + case 0x03: + vdp.ct = (vdp.reg[3] << 6) & 0x3FC0; + break; + + case 0x04: + vdp.pg = (vdp.reg[4] << 11) & 0x3800; + break; + + case 0x05: /* Sprite Attribute Table Base Address */ + vdp.satb = (vdp.reg[5] << 7) & 0x3F00; + vdp.sa = (vdp.reg[5] << 7) & 0x3F80; + break; + + case 0x06: + vdp.sg = (vdp.reg[6] << 11) & 0x3800; + break; + + case 0x07: + vdp.bd = (vdp.reg[7] & 0x0F); + break; + } +} + + +void vdp_write(int offset, uint8 data) +{ + int index; + + switch(offset & 1) + { + case 0: /* Data port */ + + vdp.pending = 0; + + switch(vdp.code) + { + case 0: /* VRAM write */ + case 1: /* VRAM write */ + case 2: /* VRAM write */ + index = (vdp.addr & 0x3FFF); + if(data != vdp.vram[index]) + { + vdp.vram[index] = data; + MARK_BG_DIRTY(vdp.addr); + } + break; + + case 3: /* CRAM write */ + index = (vdp.addr & 0x1F); + if(data != vdp.cram[index]) + { + vdp.cram[index] = data; + palette_sync(index, 0); + } + break; + } + vdp.addr = (vdp.addr + 1) & 0x3FFF; + return; + + case 1: /* Control port */ + if(vdp.pending == 0) + { + vdp.addr = (vdp.addr & 0x3F00) | (data & 0xFF); + vdp.latch = data; + vdp.pending = 1; + } + else + { + vdp.pending = 0; + vdp.code = (data >> 6) & 3; + vdp.addr = (data << 8 | vdp.latch) & 0x3FFF; + + if(vdp.code == 0) + { + vdp.buffer = vdp.vram[vdp.addr & 0x3FFF]; + vdp.addr = (vdp.addr + 1) & 0x3FFF; + } + + if(vdp.code == 2) + { + int r = (data & 0x0F); + int d = vdp.latch; + vdp_reg_w(r, d); + } + } + return; + } +} + +uint8 vdp_read(int offset) +{ + uint8 temp; + + switch(offset & 1) + { + case 0: /* CPU <-> VDP data buffer */ + vdp.pending = 0; + temp = vdp.buffer; + vdp.buffer = vdp.vram[vdp.addr & 0x3FFF]; + vdp.addr = (vdp.addr + 1) & 0x3FFF; + return temp; + + case 1: /* Status flags */ + temp = vdp.status; + vdp.pending = 0; + vdp.status = 0; + vdp.vint_pending = 0; + vdp.hint_pending = 0; + z80_set_interrupt(FALSE); + return temp; + } + + /* Just to please the compiler */ + return -1; +} + +uint8 vdp_counter_r(int offset) +{ + switch(offset & 1) + { + case 0: /* V Counter */ + return vc_table[sms.display][vdp.extended][vdp.line & 0x1FF]; + + case 1: /* H Counter */ + vdp_hclatch(); // FIXME, call from pio.cpp under right conditions instead. + return vdp.hc_latch; + } + + /* Just to please the compiler */ + return -1; +} + + +/*--------------------------------------------------------------------------*/ +/* Game Gear VDP handlers */ +/*--------------------------------------------------------------------------*/ + +void gg_vdp_write(int offset, uint8 data) +{ + int index; + + switch(offset & 1) + { + case 0: /* Data port */ + vdp.pending = 0; + switch(vdp.code) + { + case 0: /* VRAM write */ + case 1: /* VRAM write */ + case 2: /* VRAM write */ + index = (vdp.addr & 0x3FFF); + if(data != vdp.vram[index]) + { + vdp.vram[index] = data; + MARK_BG_DIRTY(vdp.addr); + } + break; + + case 3: /* CRAM write */ + if(vdp.addr & 1) + { + vdp.cram_latch = (vdp.cram_latch & 0x00FF) | ((data & 0xFF) << 8); + vdp.cram[(vdp.addr & 0x3E) | (0)] = (vdp.cram_latch >> 0) & 0xFF; + vdp.cram[(vdp.addr & 0x3E) | (1)] = (vdp.cram_latch >> 8) & 0xFF; + palette_sync((vdp.addr >> 1) & 0x1F, 0); + } + else + { + vdp.cram_latch = (vdp.cram_latch & 0xFF00) | ((data & 0xFF) << 0); + } + break; + } + vdp.addr = (vdp.addr + 1) & 0x3FFF; + return; + + case 1: /* Control port */ + if(vdp.pending == 0) + { + vdp.addr = (vdp.addr & 0x3F00) | (data & 0xFF); + vdp.latch = data; + vdp.pending = 1; + } + else + { + vdp.pending = 0; + vdp.code = (data >> 6) & 3; + vdp.addr = (data << 8 | vdp.latch) & 0x3FFF; + + if(vdp.code == 0) + { + vdp.buffer = vdp.vram[vdp.addr & 0x3FFF]; + vdp.addr = (vdp.addr + 1) & 0x3FFF; + } + + if(vdp.code == 2) + { + int r = (data & 0x0F); + int d = vdp.latch; + vdp_reg_w(r, d); + } + } + return; + } +} + +/*--------------------------------------------------------------------------*/ +/* MegaDrive / Genesis VDP handlers */ +/*--------------------------------------------------------------------------*/ + +void md_vdp_write(int offset, uint8 data) +{ + int index; + + switch(offset & 1) + { + case 0: /* Data port */ + + vdp.pending = 0; + + switch(vdp.code) + { + case 0: /* VRAM write */ + case 1: /* VRAM write */ + index = (vdp.addr & 0x3FFF); + if(data != vdp.vram[index]) + { + vdp.vram[index] = data; + MARK_BG_DIRTY(vdp.addr); + } + break; + + case 2: /* CRAM write */ + case 3: /* CRAM write */ + index = (vdp.addr & 0x1F); + if(data != vdp.cram[index]) + { + vdp.cram[index] = data; + palette_sync(index, 0); + } + break; + } + vdp.addr = (vdp.addr + 1) & 0x3FFF; + return; + + case 1: /* Control port */ + if(vdp.pending == 0) + { + vdp.latch = data; + vdp.pending = 1; + } + else + { + vdp.pending = 0; + vdp.code = (data >> 6) & 3; + vdp.addr = (data << 8 | vdp.latch) & 0x3FFF; + + if(vdp.code == 0) + { + vdp.buffer = vdp.vram[vdp.addr & 0x3FFF]; + vdp.addr = (vdp.addr + 1) & 0x3FFF; + } + + if(vdp.code == 2) + { + int r = (data & 0x0F); + int d = vdp.latch; + vdp_reg_w(r, d); + } + } + return; + } +} + +/*--------------------------------------------------------------------------*/ +/* TMS9918 VDP handlers */ +/*--------------------------------------------------------------------------*/ + +void tms_write(int offset, int data) +{ + int index; + + switch(offset & 1) + { + case 0: /* Data port */ + + vdp.pending = 0; + + switch(vdp.code) + { + case 0: /* VRAM write */ + case 1: /* VRAM write */ + case 2: /* VRAM write */ + case 3: /* VRAM write */ + index = (vdp.addr & 0x3FFF); + if(data != vdp.vram[index]) + { + vdp.vram[index] = data; + MARK_BG_DIRTY(vdp.addr); + } + break; + } + vdp.addr = (vdp.addr + 1) & 0x3FFF; + return; + + case 1: /* Control port */ + if(vdp.pending == 0) + { + vdp.latch = data; + vdp.pending = 1; + } + else + { + vdp.pending = 0; + vdp.code = (data >> 6) & 3; + vdp.addr = (data << 8 | vdp.latch) & 0x3FFF; + + if(vdp.code == 0) + { + vdp.buffer = vdp.vram[vdp.addr & 0x3FFF]; + vdp.addr = (vdp.addr + 1) & 0x3FFF; + } + + if(vdp.code == 2) + { + int r = (data & 0x07); + int d = vdp.latch; + vdp_reg_w(r, d); + } + } + return; + } +} + +static INLINE void ExecuteCycles(int32 count) +{ + sms.cycle_counter += count; + + while(sms.cycle_counter > 0) + { + //printf("PC: %04x\n", z80_getpc()); + + int32 temp = z80_do_opcode(); + sms.timestamp += temp; + sms.cycle_counter -= temp; + } +} + + +void SMS_VDPRunFrame(int skip_render) +{ + static const int iline_table[] = {0xC0, 0xE0, 0xF0}; + int iline; + + text_counter = 0; + + /* End of frame, parse sprites for line 0 on line 261 (VCount=$FF) */ + if(vdp.mode <= 7) + parse_line(0); + + for(vdp.line = 0; vdp.line < vdp.lines_per_frame;) + { + int moohack = CYCLES_PER_LINE; + + ExecuteCycles(228 - 32); + moohack -= 228 - 32; + + iline = iline_table[vdp.extended]; + + render_line(vdp.line, skip_render); + + if(vdp.line <= iline) + { + vdp.left -= 1; + if(vdp.left == -1) + { + vdp.left = vdp.reg[0x0A]; + vdp.hint_pending = 1; + + ExecuteCycles(16); + moohack -= 16; + + if(vdp.reg[0x00] & 0x10) + { + z80_set_interrupt(TRUE); + } + } + } + else + { vdp.left = vdp.reg[0x0A]; + } + + if(vdp.line == iline) + { + vdp.status |= 0x80; + vdp.vint_pending = 1; + + ExecuteCycles(16); + moohack -= 16; + if(vdp.reg[0x01] & 0x20) + { + z80_set_interrupt(TRUE); + } + } + + if(moohack) + ExecuteCycles(moohack); + + ++vdp.line; + + if(vdp.mode <= 7) + parse_line(vdp.line); + } +} + +int SMS_VDPStateAction(StateMem *sm, int load, int data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYN(vdp.vram, 0x4000, "vram"), + SFARRAYN(vdp.cram, 0x40, "cram"), + SFARRAYN(vdp.reg, 0x10, "reg"), + + SFVARN(vdp.status, "status"), + SFVARN(vdp.latch, "latch"), + SFVARN(vdp.pending, "pending"), + SFVARN(vdp.buffer, "buffer"), + SFVARN(vdp.code, "code"), + SFVARN(vdp.addr, "addr"), + + SFVARN(vdp.pn, "pn"), + SFVARN(vdp.ct, "ct"), + SFVARN(vdp.pg, "pg"), + SFVARN(vdp.sa, "sa"), + SFVARN(vdp.sg, "sg"), + SFVARN(vdp.ntab, "ntab"), + SFVARN(vdp.satb, "satb"), + SFVARN(vdp.line, "line"), + SFVARN(vdp.left, "left"), + SFVARN(vdp.height, "height"), + SFVARN(vdp.extended, "extended"), + SFVARN(vdp.mode, "mode"), + SFVARN(vdp.vint_pending, "vint_pending"), + SFVARN(vdp.hint_pending, "hint_pending"), + SFVARN(vdp.hc_latch, "hc_latch"), + SFVARN(vdp.cram_latch, "cram_latch"), + SFVARN(vdp.bd, "bd"), + + SFEND + }; + + int ret = MDFNSS_StateAction(sm, load, data_only, StateRegs, "VDP"); + + if(load) + { + /* Force full pattern cache update */ + bg_list_index = 0x200; + for(int i = 0; i < 0x200; i++) + { + bg_name_list[i] = i; + bg_name_dirty[i] = -1; + } + + /* Restore palette */ + for(int i = 0; i < PALETTE_SIZE; i++) + palette_sync(i, 1); + } + + return(ret); +} + + +} diff --git a/Mednafen/mednafen/sms/vdp.h b/Mednafen/mednafen/sms/vdp.h new file mode 100644 index 0000000000..e7dc7ef804 --- /dev/null +++ b/Mednafen/mednafen/sms/vdp.h @@ -0,0 +1,85 @@ + +#ifndef _VDP_H_ +#define _VDP_H_ + +namespace MDFN_IEN_SMS +{ + +/* + vdp1 + + mode 4 when m4 set and m1 reset + + vdp2 + + mode 4 when m4 set and m2,m1 != 1,0 + + +*/ + +/* Display timing (NTSC) */ + +#define MASTER_CLOCK 3579545 +#define LINES_PER_FRAME 262 +#define CYCLES_PER_LINE 228 + +/* VDP context */ +typedef struct +{ + union + { + uint8 vram[0x4000]; + uint16 vram16[0x2000]; + }; + + uint8 cram[0x40]; + uint8 reg[0x10]; + uint8 status; + uint8 latch; + uint8 pending; + uint8 buffer; + uint8 code; + uint16 addr; + int pn, ct, pg, sa, sg; + int ntab; + int satb; + int line; + int left; + uint8 height; + uint8 extended; + uint8 mode; + uint8 vint_pending; + uint8 hint_pending; + uint8 hc_latch; + uint16 cram_latch; + uint8 bd; + + int lines_per_frame; + int rshift, gshift, bshift; + bool quirk_disabled; +} vdp_t; + +/* Global data */ +extern vdp_t vdp; + +/* Function prototypes */ +void vdp_init(bool want_quirk); +void vdp_shutdown(void); +void vdp_reset(void); +uint8 vdp_counter_r(int offset); +uint8 vdp_read(int offset); +void vdp_write(int offset, uint8 data); +void gg_vdp_write(int offset, uint8 data); +void md_vdp_write(int offset, uint8 data); +void tms_write(int offset, int data); +void vdp_hclatch(void); + + +void SMS_VDPRunFrame(int skip_render); +void SMS_VDPSetPixelFormat(const MDFN_PixelFormat &format, const uint8* CustomPalette); +int SMS_VDPStateAction(StateMem *sm, int load, int data_only); + +} + +#endif /* _VDP_H_ */ + diff --git a/Mednafen/mednafen/snes/Makefile.am b/Mednafen/mednafen/snes/Makefile.am new file mode 100644 index 0000000000..52b33daa7c --- /dev/null +++ b/Mednafen/mednafen/snes/Makefile.am @@ -0,0 +1,72 @@ +AM_CFLAGS = @AM_CFLAGS@ @SNES_EXTRA_FLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ @SNES_EXTRA_FLAGS@ @SNES_EXTRA_CXXFLAGS@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -DNOMINMAX +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl -I$(srcdir)/src/lib + +noinst_LIBRARIES = libsnes.a + +meow = interface.cpp + + +meow += src/lib/libco/libco.c + +################# +### utilities ### +################# + +meow += src/cartridge/cartridge.cpp src/cheat/cheat.cpp + +############## +### memory ### +############## + +meow += src/memory/memory.cpp src/memory/smemory/smemory.cpp + +########### +### cpu ### +########### + +meow += src/cpu/cpu.cpp src/cpu/core/core.cpp src/cpu/scpu/scpu.cpp + +########### +### smp ### +########### + +meow += src/smp/smp.cpp + +########### +### dsp ### +########### + +meow += src/sdsp/sdsp.cpp + +########### +### ppu ### +########### + +meow += src/ppu/ppu.cpp + +############## +### system ### +############## + +meow += src/system/system.cpp + +##################### +### special chips ### +##################### + +meow += src/chip/sa1/sa1.cpp src/chip/bsx/bsx.cpp src/chip/srtc/srtc.cpp src/chip/sdd1/sdd1.cpp +meow += src/chip/spc7110/spc7110.cpp src/chip/cx4/cx4.cpp + +meow += src/chip/dsp1/dsp1.cpp src/chip/dsp2/dsp2.cpp src/chip/dsp3/dsp3.cpp src/chip/dsp4/dsp4.cpp + +meow += src/chip/obc1/obc1.cpp + +meow += src/chip/st010/st010.cpp + +meow += src/chip/superfx/superfx.cpp + +libsnes_a_SOURCES = $(meow) + diff --git a/Mednafen/mednafen/snes/Makefile.in b/Mednafen/mednafen/snes/Makefile.in new file mode 100644 index 0000000000..e2f4946765 --- /dev/null +++ b/Mednafen/mednafen/snes/Makefile.in @@ -0,0 +1,1078 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/snes +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libsnes_a_AR = $(AR) $(ARFLAGS) +libsnes_a_LIBADD = +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = interface.$(OBJEXT) src/lib/libco/libco.$(OBJEXT) \ + src/cartridge/cartridge.$(OBJEXT) src/cheat/cheat.$(OBJEXT) \ + src/memory/memory.$(OBJEXT) \ + src/memory/smemory/smemory.$(OBJEXT) src/cpu/cpu.$(OBJEXT) \ + src/cpu/core/core.$(OBJEXT) src/cpu/scpu/scpu.$(OBJEXT) \ + src/smp/smp.$(OBJEXT) src/sdsp/sdsp.$(OBJEXT) \ + src/ppu/ppu.$(OBJEXT) src/system/system.$(OBJEXT) \ + src/chip/sa1/sa1.$(OBJEXT) src/chip/bsx/bsx.$(OBJEXT) \ + src/chip/srtc/srtc.$(OBJEXT) src/chip/sdd1/sdd1.$(OBJEXT) \ + src/chip/spc7110/spc7110.$(OBJEXT) src/chip/cx4/cx4.$(OBJEXT) \ + src/chip/dsp1/dsp1.$(OBJEXT) src/chip/dsp2/dsp2.$(OBJEXT) \ + src/chip/dsp3/dsp3.$(OBJEXT) src/chip/dsp4/dsp4.$(OBJEXT) \ + src/chip/obc1/obc1.$(OBJEXT) src/chip/st010/st010.$(OBJEXT) \ + src/chip/superfx/superfx.$(OBJEXT) +am_libsnes_a_OBJECTS = $(am__objects_1) +libsnes_a_OBJECTS = $(am_libsnes_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libsnes_a_SOURCES) +DIST_SOURCES = $(libsnes_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ @SNES_EXTRA_FLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ @SNES_EXTRA_FLAGS@ @SNES_EXTRA_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -DNOMINMAX +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl -I$(srcdir)/src/lib +noinst_LIBRARIES = libsnes.a + +################# +### utilities ### +################# + +############## +### memory ### +############## + +########### +### cpu ### +########### + +########### +### smp ### +########### + +########### +### dsp ### +########### + +########### +### ppu ### +########### + +############## +### system ### +############## + +##################### +### special chips ### +##################### +meow = interface.cpp src/lib/libco/libco.c src/cartridge/cartridge.cpp \ + src/cheat/cheat.cpp src/memory/memory.cpp \ + src/memory/smemory/smemory.cpp src/cpu/cpu.cpp \ + src/cpu/core/core.cpp src/cpu/scpu/scpu.cpp src/smp/smp.cpp \ + src/sdsp/sdsp.cpp src/ppu/ppu.cpp src/system/system.cpp \ + src/chip/sa1/sa1.cpp src/chip/bsx/bsx.cpp \ + src/chip/srtc/srtc.cpp src/chip/sdd1/sdd1.cpp \ + src/chip/spc7110/spc7110.cpp src/chip/cx4/cx4.cpp \ + src/chip/dsp1/dsp1.cpp src/chip/dsp2/dsp2.cpp \ + src/chip/dsp3/dsp3.cpp src/chip/dsp4/dsp4.cpp \ + src/chip/obc1/obc1.cpp src/chip/st010/st010.cpp \ + src/chip/superfx/superfx.cpp +libsnes_a_SOURCES = $(meow) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/snes/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/snes/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +src/lib/libco/$(am__dirstamp): + @$(MKDIR_P) src/lib/libco + @: > src/lib/libco/$(am__dirstamp) +src/lib/libco/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/lib/libco/$(DEPDIR) + @: > src/lib/libco/$(DEPDIR)/$(am__dirstamp) +src/lib/libco/libco.$(OBJEXT): src/lib/libco/$(am__dirstamp) \ + src/lib/libco/$(DEPDIR)/$(am__dirstamp) +src/cartridge/$(am__dirstamp): + @$(MKDIR_P) src/cartridge + @: > src/cartridge/$(am__dirstamp) +src/cartridge/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cartridge/$(DEPDIR) + @: > src/cartridge/$(DEPDIR)/$(am__dirstamp) +src/cartridge/cartridge.$(OBJEXT): src/cartridge/$(am__dirstamp) \ + src/cartridge/$(DEPDIR)/$(am__dirstamp) +src/cheat/$(am__dirstamp): + @$(MKDIR_P) src/cheat + @: > src/cheat/$(am__dirstamp) +src/cheat/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cheat/$(DEPDIR) + @: > src/cheat/$(DEPDIR)/$(am__dirstamp) +src/cheat/cheat.$(OBJEXT): src/cheat/$(am__dirstamp) \ + src/cheat/$(DEPDIR)/$(am__dirstamp) +src/memory/$(am__dirstamp): + @$(MKDIR_P) src/memory + @: > src/memory/$(am__dirstamp) +src/memory/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/memory/$(DEPDIR) + @: > src/memory/$(DEPDIR)/$(am__dirstamp) +src/memory/memory.$(OBJEXT): src/memory/$(am__dirstamp) \ + src/memory/$(DEPDIR)/$(am__dirstamp) +src/memory/smemory/$(am__dirstamp): + @$(MKDIR_P) src/memory/smemory + @: > src/memory/smemory/$(am__dirstamp) +src/memory/smemory/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/memory/smemory/$(DEPDIR) + @: > src/memory/smemory/$(DEPDIR)/$(am__dirstamp) +src/memory/smemory/smemory.$(OBJEXT): \ + src/memory/smemory/$(am__dirstamp) \ + src/memory/smemory/$(DEPDIR)/$(am__dirstamp) +src/cpu/$(am__dirstamp): + @$(MKDIR_P) src/cpu + @: > src/cpu/$(am__dirstamp) +src/cpu/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cpu/$(DEPDIR) + @: > src/cpu/$(DEPDIR)/$(am__dirstamp) +src/cpu/cpu.$(OBJEXT): src/cpu/$(am__dirstamp) \ + src/cpu/$(DEPDIR)/$(am__dirstamp) +src/cpu/core/$(am__dirstamp): + @$(MKDIR_P) src/cpu/core + @: > src/cpu/core/$(am__dirstamp) +src/cpu/core/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cpu/core/$(DEPDIR) + @: > src/cpu/core/$(DEPDIR)/$(am__dirstamp) +src/cpu/core/core.$(OBJEXT): src/cpu/core/$(am__dirstamp) \ + src/cpu/core/$(DEPDIR)/$(am__dirstamp) +src/cpu/scpu/$(am__dirstamp): + @$(MKDIR_P) src/cpu/scpu + @: > src/cpu/scpu/$(am__dirstamp) +src/cpu/scpu/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/cpu/scpu/$(DEPDIR) + @: > src/cpu/scpu/$(DEPDIR)/$(am__dirstamp) +src/cpu/scpu/scpu.$(OBJEXT): src/cpu/scpu/$(am__dirstamp) \ + src/cpu/scpu/$(DEPDIR)/$(am__dirstamp) +src/smp/$(am__dirstamp): + @$(MKDIR_P) src/smp + @: > src/smp/$(am__dirstamp) +src/smp/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/smp/$(DEPDIR) + @: > src/smp/$(DEPDIR)/$(am__dirstamp) +src/smp/smp.$(OBJEXT): src/smp/$(am__dirstamp) \ + src/smp/$(DEPDIR)/$(am__dirstamp) +src/sdsp/$(am__dirstamp): + @$(MKDIR_P) src/sdsp + @: > src/sdsp/$(am__dirstamp) +src/sdsp/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/sdsp/$(DEPDIR) + @: > src/sdsp/$(DEPDIR)/$(am__dirstamp) +src/sdsp/sdsp.$(OBJEXT): src/sdsp/$(am__dirstamp) \ + src/sdsp/$(DEPDIR)/$(am__dirstamp) +src/ppu/$(am__dirstamp): + @$(MKDIR_P) src/ppu + @: > src/ppu/$(am__dirstamp) +src/ppu/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ppu/$(DEPDIR) + @: > src/ppu/$(DEPDIR)/$(am__dirstamp) +src/ppu/ppu.$(OBJEXT): src/ppu/$(am__dirstamp) \ + src/ppu/$(DEPDIR)/$(am__dirstamp) +src/system/$(am__dirstamp): + @$(MKDIR_P) src/system + @: > src/system/$(am__dirstamp) +src/system/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/system/$(DEPDIR) + @: > src/system/$(DEPDIR)/$(am__dirstamp) +src/system/system.$(OBJEXT): src/system/$(am__dirstamp) \ + src/system/$(DEPDIR)/$(am__dirstamp) +src/chip/sa1/$(am__dirstamp): + @$(MKDIR_P) src/chip/sa1 + @: > src/chip/sa1/$(am__dirstamp) +src/chip/sa1/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/sa1/$(DEPDIR) + @: > src/chip/sa1/$(DEPDIR)/$(am__dirstamp) +src/chip/sa1/sa1.$(OBJEXT): src/chip/sa1/$(am__dirstamp) \ + src/chip/sa1/$(DEPDIR)/$(am__dirstamp) +src/chip/bsx/$(am__dirstamp): + @$(MKDIR_P) src/chip/bsx + @: > src/chip/bsx/$(am__dirstamp) +src/chip/bsx/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/bsx/$(DEPDIR) + @: > src/chip/bsx/$(DEPDIR)/$(am__dirstamp) +src/chip/bsx/bsx.$(OBJEXT): src/chip/bsx/$(am__dirstamp) \ + src/chip/bsx/$(DEPDIR)/$(am__dirstamp) +src/chip/srtc/$(am__dirstamp): + @$(MKDIR_P) src/chip/srtc + @: > src/chip/srtc/$(am__dirstamp) +src/chip/srtc/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/srtc/$(DEPDIR) + @: > src/chip/srtc/$(DEPDIR)/$(am__dirstamp) +src/chip/srtc/srtc.$(OBJEXT): src/chip/srtc/$(am__dirstamp) \ + src/chip/srtc/$(DEPDIR)/$(am__dirstamp) +src/chip/sdd1/$(am__dirstamp): + @$(MKDIR_P) src/chip/sdd1 + @: > src/chip/sdd1/$(am__dirstamp) +src/chip/sdd1/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/sdd1/$(DEPDIR) + @: > src/chip/sdd1/$(DEPDIR)/$(am__dirstamp) +src/chip/sdd1/sdd1.$(OBJEXT): src/chip/sdd1/$(am__dirstamp) \ + src/chip/sdd1/$(DEPDIR)/$(am__dirstamp) +src/chip/spc7110/$(am__dirstamp): + @$(MKDIR_P) src/chip/spc7110 + @: > src/chip/spc7110/$(am__dirstamp) +src/chip/spc7110/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/spc7110/$(DEPDIR) + @: > src/chip/spc7110/$(DEPDIR)/$(am__dirstamp) +src/chip/spc7110/spc7110.$(OBJEXT): src/chip/spc7110/$(am__dirstamp) \ + src/chip/spc7110/$(DEPDIR)/$(am__dirstamp) +src/chip/cx4/$(am__dirstamp): + @$(MKDIR_P) src/chip/cx4 + @: > src/chip/cx4/$(am__dirstamp) +src/chip/cx4/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/cx4/$(DEPDIR) + @: > src/chip/cx4/$(DEPDIR)/$(am__dirstamp) +src/chip/cx4/cx4.$(OBJEXT): src/chip/cx4/$(am__dirstamp) \ + src/chip/cx4/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp1/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp1 + @: > src/chip/dsp1/$(am__dirstamp) +src/chip/dsp1/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp1/$(DEPDIR) + @: > src/chip/dsp1/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp1/dsp1.$(OBJEXT): src/chip/dsp1/$(am__dirstamp) \ + src/chip/dsp1/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp2/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp2 + @: > src/chip/dsp2/$(am__dirstamp) +src/chip/dsp2/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp2/$(DEPDIR) + @: > src/chip/dsp2/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp2/dsp2.$(OBJEXT): src/chip/dsp2/$(am__dirstamp) \ + src/chip/dsp2/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp3/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp3 + @: > src/chip/dsp3/$(am__dirstamp) +src/chip/dsp3/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp3/$(DEPDIR) + @: > src/chip/dsp3/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp3/dsp3.$(OBJEXT): src/chip/dsp3/$(am__dirstamp) \ + src/chip/dsp3/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp4/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp4 + @: > src/chip/dsp4/$(am__dirstamp) +src/chip/dsp4/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/dsp4/$(DEPDIR) + @: > src/chip/dsp4/$(DEPDIR)/$(am__dirstamp) +src/chip/dsp4/dsp4.$(OBJEXT): src/chip/dsp4/$(am__dirstamp) \ + src/chip/dsp4/$(DEPDIR)/$(am__dirstamp) +src/chip/obc1/$(am__dirstamp): + @$(MKDIR_P) src/chip/obc1 + @: > src/chip/obc1/$(am__dirstamp) +src/chip/obc1/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/obc1/$(DEPDIR) + @: > src/chip/obc1/$(DEPDIR)/$(am__dirstamp) +src/chip/obc1/obc1.$(OBJEXT): src/chip/obc1/$(am__dirstamp) \ + src/chip/obc1/$(DEPDIR)/$(am__dirstamp) +src/chip/st010/$(am__dirstamp): + @$(MKDIR_P) src/chip/st010 + @: > src/chip/st010/$(am__dirstamp) +src/chip/st010/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/st010/$(DEPDIR) + @: > src/chip/st010/$(DEPDIR)/$(am__dirstamp) +src/chip/st010/st010.$(OBJEXT): src/chip/st010/$(am__dirstamp) \ + src/chip/st010/$(DEPDIR)/$(am__dirstamp) +src/chip/superfx/$(am__dirstamp): + @$(MKDIR_P) src/chip/superfx + @: > src/chip/superfx/$(am__dirstamp) +src/chip/superfx/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/chip/superfx/$(DEPDIR) + @: > src/chip/superfx/$(DEPDIR)/$(am__dirstamp) +src/chip/superfx/superfx.$(OBJEXT): src/chip/superfx/$(am__dirstamp) \ + src/chip/superfx/$(DEPDIR)/$(am__dirstamp) + +libsnes.a: $(libsnes_a_OBJECTS) $(libsnes_a_DEPENDENCIES) $(EXTRA_libsnes_a_DEPENDENCIES) + $(AM_V_at)-rm -f libsnes.a + $(AM_V_AR)$(libsnes_a_AR) libsnes.a $(libsnes_a_OBJECTS) $(libsnes_a_LIBADD) + $(AM_V_at)$(RANLIB) libsnes.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/cartridge/*.$(OBJEXT) + -rm -f src/cheat/*.$(OBJEXT) + -rm -f src/chip/bsx/*.$(OBJEXT) + -rm -f src/chip/cx4/*.$(OBJEXT) + -rm -f src/chip/dsp1/*.$(OBJEXT) + -rm -f src/chip/dsp2/*.$(OBJEXT) + -rm -f src/chip/dsp3/*.$(OBJEXT) + -rm -f src/chip/dsp4/*.$(OBJEXT) + -rm -f src/chip/obc1/*.$(OBJEXT) + -rm -f src/chip/sa1/*.$(OBJEXT) + -rm -f src/chip/sdd1/*.$(OBJEXT) + -rm -f src/chip/spc7110/*.$(OBJEXT) + -rm -f src/chip/srtc/*.$(OBJEXT) + -rm -f src/chip/st010/*.$(OBJEXT) + -rm -f src/chip/superfx/*.$(OBJEXT) + -rm -f src/cpu/*.$(OBJEXT) + -rm -f src/cpu/core/*.$(OBJEXT) + -rm -f src/cpu/scpu/*.$(OBJEXT) + -rm -f src/lib/libco/*.$(OBJEXT) + -rm -f src/memory/*.$(OBJEXT) + -rm -f src/memory/smemory/*.$(OBJEXT) + -rm -f src/ppu/*.$(OBJEXT) + -rm -f src/sdsp/*.$(OBJEXT) + -rm -f src/smp/*.$(OBJEXT) + -rm -f src/system/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cartridge/$(DEPDIR)/cartridge.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cheat/$(DEPDIR)/cheat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/bsx/$(DEPDIR)/bsx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/cx4/$(DEPDIR)/cx4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/dsp1/$(DEPDIR)/dsp1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/dsp2/$(DEPDIR)/dsp2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/dsp3/$(DEPDIR)/dsp3.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/dsp4/$(DEPDIR)/dsp4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/obc1/$(DEPDIR)/obc1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/sa1/$(DEPDIR)/sa1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/sdd1/$(DEPDIR)/sdd1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/spc7110/$(DEPDIR)/spc7110.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/srtc/$(DEPDIR)/srtc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/st010/$(DEPDIR)/st010.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/chip/superfx/$(DEPDIR)/superfx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cpu/$(DEPDIR)/cpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cpu/core/$(DEPDIR)/core.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/cpu/scpu/$(DEPDIR)/scpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/lib/libco/$(DEPDIR)/libco.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/memory/$(DEPDIR)/memory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/memory/smemory/$(DEPDIR)/smemory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ppu/$(DEPDIR)/ppu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/sdsp/$(DEPDIR)/sdsp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/smp/$(DEPDIR)/smp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/system/$(DEPDIR)/system.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f src/cartridge/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cartridge/$(am__dirstamp) + -rm -f src/cheat/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cheat/$(am__dirstamp) + -rm -f src/chip/bsx/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/bsx/$(am__dirstamp) + -rm -f src/chip/cx4/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/cx4/$(am__dirstamp) + -rm -f src/chip/dsp1/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/dsp1/$(am__dirstamp) + -rm -f src/chip/dsp2/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/dsp2/$(am__dirstamp) + -rm -f src/chip/dsp3/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/dsp3/$(am__dirstamp) + -rm -f src/chip/dsp4/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/dsp4/$(am__dirstamp) + -rm -f src/chip/obc1/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/obc1/$(am__dirstamp) + -rm -f src/chip/sa1/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/sa1/$(am__dirstamp) + -rm -f src/chip/sdd1/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/sdd1/$(am__dirstamp) + -rm -f src/chip/spc7110/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/spc7110/$(am__dirstamp) + -rm -f src/chip/srtc/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/srtc/$(am__dirstamp) + -rm -f src/chip/st010/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/st010/$(am__dirstamp) + -rm -f src/chip/superfx/$(DEPDIR)/$(am__dirstamp) + -rm -f src/chip/superfx/$(am__dirstamp) + -rm -f src/cpu/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cpu/$(am__dirstamp) + -rm -f src/cpu/core/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cpu/core/$(am__dirstamp) + -rm -f src/cpu/scpu/$(DEPDIR)/$(am__dirstamp) + -rm -f src/cpu/scpu/$(am__dirstamp) + -rm -f src/lib/libco/$(DEPDIR)/$(am__dirstamp) + -rm -f src/lib/libco/$(am__dirstamp) + -rm -f src/memory/$(DEPDIR)/$(am__dirstamp) + -rm -f src/memory/$(am__dirstamp) + -rm -f src/memory/smemory/$(DEPDIR)/$(am__dirstamp) + -rm -f src/memory/smemory/$(am__dirstamp) + -rm -f src/ppu/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ppu/$(am__dirstamp) + -rm -f src/sdsp/$(DEPDIR)/$(am__dirstamp) + -rm -f src/sdsp/$(am__dirstamp) + -rm -f src/smp/$(DEPDIR)/$(am__dirstamp) + -rm -f src/smp/$(am__dirstamp) + -rm -f src/system/$(DEPDIR)/$(am__dirstamp) + -rm -f src/system/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) src/cartridge/$(DEPDIR) src/cheat/$(DEPDIR) src/chip/bsx/$(DEPDIR) src/chip/cx4/$(DEPDIR) src/chip/dsp1/$(DEPDIR) src/chip/dsp2/$(DEPDIR) src/chip/dsp3/$(DEPDIR) src/chip/dsp4/$(DEPDIR) src/chip/obc1/$(DEPDIR) src/chip/sa1/$(DEPDIR) src/chip/sdd1/$(DEPDIR) src/chip/spc7110/$(DEPDIR) src/chip/srtc/$(DEPDIR) src/chip/st010/$(DEPDIR) src/chip/superfx/$(DEPDIR) src/cpu/$(DEPDIR) src/cpu/core/$(DEPDIR) src/cpu/scpu/$(DEPDIR) src/lib/libco/$(DEPDIR) src/memory/$(DEPDIR) src/memory/smemory/$(DEPDIR) src/ppu/$(DEPDIR) src/sdsp/$(DEPDIR) src/smp/$(DEPDIR) src/system/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) src/cartridge/$(DEPDIR) src/cheat/$(DEPDIR) src/chip/bsx/$(DEPDIR) src/chip/cx4/$(DEPDIR) src/chip/dsp1/$(DEPDIR) src/chip/dsp2/$(DEPDIR) src/chip/dsp3/$(DEPDIR) src/chip/dsp4/$(DEPDIR) src/chip/obc1/$(DEPDIR) src/chip/sa1/$(DEPDIR) src/chip/sdd1/$(DEPDIR) src/chip/spc7110/$(DEPDIR) src/chip/srtc/$(DEPDIR) src/chip/st010/$(DEPDIR) src/chip/superfx/$(DEPDIR) src/cpu/$(DEPDIR) src/cpu/core/$(DEPDIR) src/cpu/scpu/$(DEPDIR) src/lib/libco/$(DEPDIR) src/memory/$(DEPDIR) src/memory/smemory/$(DEPDIR) src/ppu/$(DEPDIR) src/sdsp/$(DEPDIR) src/smp/$(DEPDIR) src/system/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/snes/VERSION.BSNES b/Mednafen/mednafen/snes/VERSION.BSNES new file mode 100644 index 0000000000..e14f947e7a --- /dev/null +++ b/Mednafen/mednafen/snes/VERSION.BSNES @@ -0,0 +1,5 @@ +bsnes v0.059 + Cx4 Op10 fix patch + blargg_libco_ppc64-5 + a few minor timing/scheduler related changes for Mednafen + LOTS OF OTHER CRAZY STUFF + +for ALT Linux: +strlcat->nall_strlcat +strlcpy->nall_strlcpy diff --git a/Mednafen/mednafen/snes/interface.cpp b/Mednafen/mednafen/snes/interface.cpp new file mode 100644 index 0000000000..372156b3e4 --- /dev/null +++ b/Mednafen/mednafen/snes/interface.cpp @@ -0,0 +1,1469 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "src/base.hpp" + +extern MDFNGI EmulatedSNES; + +static void Cleanup(void); + +static SpeexResamplerState *resampler = NULL; +static int32 ResampInPos; +static int16 ResampInBuffer[2048][2]; +static bool PrevFrameInterlaced; +static int PrevLine; + +static bSNES_v059::Interface Interface; +static SNSFLoader *snsf_loader = NULL; + +static bool InProperEmu; +static bool SoundOn; +static double SoundLastRate = 0; + +static int32 CycleCounter; +static MDFN_Surface *tsurf = NULL; +static int32 *tlw = NULL; +static MDFN_Rect *tdr = NULL; +static EmulateSpecStruct *es = NULL; + +static int InputType[2]; +static uint8 *InputPtr[8] = { NULL }; +static uint16 PadLatch[8]; +static bool MultitapEnabled[2]; +static bool HasPolledThisFrame; + +static int16 MouseXLatch[2]; +static int16 MouseYLatch[2]; +static uint8 MouseBLatch[2]; + +static int16 ScopeXLatch[2]; +static int16 ScopeYLatch[2]; +static uint8 ScopeBLatch[2]; +static uint8 ScopeOSCounter[2]; +static const uint8 ScopeOSCounter_StartVal = 10; +static const uint8 ScopeOSCounter_TriggerStartThresh = 6; +static const uint8 ScopeOSCounter_TriggerEndThresh = 2; + +static std::vector ColorMap; // [32768] + +static void BuildColorMap(MDFN_PixelFormat &format, uint8* CustomColorMap) +{ + for(int x = 0; x < 32768; x++) + { + int r, g, b; + + r = (x & (0x1F << 0)) << 3; + g = (x & (0x1F << 5)) >> (5 - 3); + b = (x & (0x1F << 10)) >> (5 * 2 - 3); + + //r = ((((x >> 0) & 0x1F) * 255 + 15) / 31); + //g = ((((x >> 5) & 0x1F) * 255 + 15) / 31); + //b = ((((x >> 10) & 0x1F) * 255 + 15) / 31); + + if(CustomColorMap) + { + r = CustomColorMap[x * 3 + 0]; + g = CustomColorMap[x * 3 + 1]; + b = CustomColorMap[x * 3 + 2]; + } + + ColorMap[x] = format.MakeColor(r, g, b); + } +} + +static CustomPalette_Spec CPInfo[] = +{ + { gettext_noop("SNES 15-bit RGB colormap"), NULL, { 32768, 0 } }, + + { NULL, NULL } +}; + +static void BlankMissingLines(int ystart, int ybound, const bool interlaced, const bool field) +{ + for(int y = ystart; y < ybound; y++) + { + //printf("Blanked: %d\n", y); + uint32 *dest_line = tsurf->pixels + (field * tsurf->pitch32) + (y * tsurf->pitch32); + dest_line[0] = tsurf->MakeColor(0, 0/*rand() & 0xFF*/, 0); + tlw[(y << interlaced) + field] = 1; + } +} + +void bSNES_v059::Interface::video_scanline(uint16_t *data, unsigned line, unsigned width, unsigned height, bool interlaced, bool field) +{ + const int ppline = PrevLine; + + //if(rand() & 1) + // return; + + if((int)line <= PrevLine || (PrevLine == -1 && line > 32)) // Second part for PAL 224 line mode + return; + + PrevLine = line; + PrevFrameInterlaced = interlaced; + + if(snsf_loader) + return; + + if(!tsurf || !tlw || !tdr) + return; + + if(es->skip && !interlaced) + return; + + if(!interlaced) + field = 0; + + + BlankMissingLines(ppline + 1, line, interlaced, field); + //if(line == 0) + // printf("ZOOM: 0x%04x, %d %d, %d\n", data[0], interlaced, field, width); + + const unsigned y = line; + const uint16 *source_line = data; + uint32 *dest_line = tsurf->pixels + (field * tsurf->pitch32) + ((y << interlaced) * tsurf->pitch32); + + //if(rand() & 1) + { + tlw[(y << interlaced) + field] = width; + } + + if(width == 512 && (source_line[0] & 0x8000)) + { + tlw[(y << interlaced) + field] = 256; + for(int x = 0; x < 256; x++) + { + uint16 p1 = source_line[(x << 1) | 0] & 0x7FFF; + uint16 p2 = source_line[(x << 1) | 1] & 0x7FFF; + dest_line[x] = ColorMap[(p1 + p2 - ((p1 ^ p2) & 0x0421)) >> 1]; + } + } + else + { + for(int x = 0; x < width; x++) + dest_line[x] = ColorMap[source_line[x] & 0x7FFF]; + } + + tdr->w = width; + tdr->h = height << interlaced; + + es->InterlaceOn = interlaced; + es->InterlaceField = (interlaced && field); + + MDFN_MidLineUpdate(es, (y << interlaced) + field); +} + +void bSNES_v059::Interface::audio_sample(uint16_t l_sample, uint16_t r_sample) +{ + CycleCounter++; + + if(!SoundOn) + return; + + if(ResampInPos < 2048) + { + //l_sample = (rand() & 0x7FFF) - 0x4000; + //r_sample = (rand() & 0x7FFF) - 0x4000; + ResampInBuffer[ResampInPos][0] = (int16)l_sample; + ResampInBuffer[ResampInPos][1] = (int16)r_sample; + ResampInPos++; + } + else + { + MDFN_DispMessage("Buffer overflow?"); + } +} + +#if 0 +class Input { +public: + enum Device { + DeviceNone, + DeviceJoypad, + DeviceMultitap, + DeviceMouse, + DeviceSuperScope, + DeviceJustifier, + DeviceJustifiers, + }; + + enum JoypadID { + JoypadB = 0, JoypadY = 1, + JoypadSelect = 2, JoypadStart = 3, + JoypadUp = 4, JoypadDown = 5, + JoypadLeft = 6, JoypadRight = 7, + JoypadA = 8, JoypadX = 9, + JoypadL = 10, JoypadR = 11, + }; +#endif + +void bSNES_v059::Interface::input_poll() +{ + if(!InProperEmu) + return; + + HasPolledThisFrame = true; + + for(int port = 0; port < 2; port++) + { + switch(InputType[port]) + { + case bSNES_v059::Input::DeviceJoypad: + PadLatch[port] = MDFN_de16lsb(InputPtr[port]); + break; + + case bSNES_v059::Input::DeviceMultitap: + for(int index = 0; index < 4; index++) + { + if(!index) + PadLatch[port] = MDFN_de16lsb(InputPtr[port]); + else + { + int pi = 2 + 3 * (port ^ 1) + (index - 1); + PadLatch[pi] = MDFN_de16lsb(InputPtr[pi]); + } + } + break; + + case bSNES_v059::Input::DeviceMouse: + MouseXLatch[port] = (int32)MDFN_de32lsb(InputPtr[port] + 0); + MouseYLatch[port] = (int32)MDFN_de32lsb(InputPtr[port] + 4); + MouseBLatch[port] = *(uint8 *)(InputPtr[port] + 8); + break; + + case bSNES_v059::Input::DeviceSuperScope: + { + bool old_ost = (ScopeBLatch[port] & 0x02); + + ScopeXLatch[port] = (int16)MDFN_de16lsb(InputPtr[port] + 0); + ScopeYLatch[port] = (int16)MDFN_de16lsb(InputPtr[port] + 2); + ScopeBLatch[port] = *(uint8 *)(InputPtr[port] + 4); + + if(!old_ost && (ScopeBLatch[port] & 0x02)) + ScopeOSCounter[port] = ScopeOSCounter_StartVal; + } + break; + } + } +} + +static INLINE int16 sats32tos16(int32 val) +{ + if(val > 32767) + val = 32767; + if(val < -32768) + val = -32768; + + return(val); +} + +int16_t bSNES_v059::Interface::input_poll(bool port, unsigned device, unsigned index, unsigned id) +{ + if(!HasPolledThisFrame) + printf("input_poll(...) before input_poll() for frame, %d %d %d %d\n", port, device, index, id); + + switch(device) + { + case bSNES_v059::Input::DeviceJoypad: + { + return((PadLatch[port] >> id) & 1); + } + break; + + case bSNES_v059::Input::DeviceMultitap: + { + if(!index) + return((PadLatch[port] >> id) & 1); + else + return((PadLatch[2 + 3 * (port ^ 1) + (index - 1)] >> id) & 1); + } + break; + + case bSNES_v059::Input::DeviceMouse: + { + assert(port < 2); + switch(id) + { + case bSNES_v059::Input::MouseX: + return(sats32tos16(MouseXLatch[port])); + break; + + case bSNES_v059::Input::MouseY: + return(sats32tos16(MouseYLatch[port])); + break; + + case bSNES_v059::Input::MouseLeft: + return((int)(bool)(MouseBLatch[port] & 1)); + break; + + case bSNES_v059::Input::MouseRight: + return((int)(bool)(MouseBLatch[port] & 2)); + break; + } + } + break; + + case bSNES_v059::Input::DeviceSuperScope: + { + assert(port < 2); + switch(id) + { + case bSNES_v059::Input::SuperScopeX: + return(ScopeOSCounter[port] ? 1000 : ScopeXLatch[port]); + break; + + case bSNES_v059::Input::SuperScopeY: + return(ScopeOSCounter[port] ? 1000 : ScopeYLatch[port]); + break; + + case bSNES_v059::Input::SuperScopeTrigger: + { + bool trigo = (bool)(ScopeBLatch[port] & 0x01); + + if(ScopeOSCounter[port] >= ScopeOSCounter_TriggerEndThresh) + trigo = 1; + + if(ScopeOSCounter[port] >= ScopeOSCounter_TriggerStartThresh) + trigo = 0; + + return(trigo); + } + break; + + case bSNES_v059::Input::SuperScopeCursor: + return((bool)(ScopeBLatch[port] & 0x10)); + break; + + case bSNES_v059::Input::SuperScopeTurbo: + return((bool)(ScopeBLatch[port] & 0x08)); + break; + + case bSNES_v059::Input::SuperScopePause: + return((bool)(ScopeBLatch[port] & 0x04)); + break; + } + } + break; + } + + return(0); +} + +#if 0 +void bSNES_v059::Interface::init() +{ + + +} + +void bSNES_v059::Interface::term() +{ + + +} +#endif + +#if 0 + +namespace memory { + extern MappedRAM cartrom, cartram, cartrtc; + extern MappedRAM bsxflash, bsxram, bsxpram; + extern MappedRAM stArom, stAram; + extern MappedRAM stBrom, stBram; + extern MappedRAM gbrom, gbram; +}; + +#endif + +static void SaveMemorySub(bool load, const char *extension, bSNES_v059::MappedRAM *memoryA, bSNES_v059::MappedRAM *memoryB = NULL) +{ + const std::string path = MDFN_MakeFName(MDFNMKF_SAV, 0, extension); + const size_t total_size = ((memoryA && memoryA->size() != 0 && memoryA->size() != -1U) ? memoryA->size() : 0) + + ((memoryB && memoryB->size() != 0 && memoryB->size() != -1U) ? memoryB->size() : 0); + + + if(!total_size) + return; + + if(load) + { + try + { + std::unique_ptr gp = MDFN_AmbigGZOpenHelper(path, std::vector({ total_size })); + + if(memoryA && memoryA->size() != 0 && memoryA->size() != -1U) + { + gp->read(memoryA->data(), memoryA->size()); + } + + if(memoryB && memoryB->size() != 0 && memoryB->size() != -1U) + { + gp->read(memoryB->data(), memoryB->size()); + } + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } + else + { + std::vector MemToSave; + + if(memoryA && memoryA->size() != 0 && memoryA->size() != -1U) + MemToSave.push_back(PtrLengthPair(memoryA->data(), memoryA->size())); + + if(memoryB && memoryB->size() != 0 && memoryB->size() != -1U) + MemToSave.push_back(PtrLengthPair(memoryB->data(), memoryB->size())); + + MDFN_DumpToFile(path, MemToSave, true); + } +} + +static void SaveLoadMemory(bool load) +{ + if(bSNES_v059::cartridge.loaded() == false) + return; + + switch(bSNES_v059::cartridge.mode()) + { + case bSNES_v059::Cartridge::ModeNormal: + case bSNES_v059::Cartridge::ModeBsxSlotted: + { + SaveMemorySub(load, "srm", &bSNES_v059::memory::cartram); + SaveMemorySub(load, "rtc", &bSNES_v059::memory::cartrtc); + } + break; + + case bSNES_v059::Cartridge::ModeBsx: + { + SaveMemorySub(load, "srm", &bSNES_v059::memory::bsxram ); + SaveMemorySub(load, "psr", &bSNES_v059::memory::bsxpram); + } + break; + + case bSNES_v059::Cartridge::ModeSufamiTurbo: + { + SaveMemorySub(load, "srm", &bSNES_v059::memory::stAram, &bSNES_v059::memory::stBram); + } + break; + + case bSNES_v059::Cartridge::ModeSuperGameBoy: + { + SaveMemorySub(load, "sav", &bSNES_v059::memory::gbram); + SaveMemorySub(load, "rtc", &bSNES_v059::memory::gbrtc); + } + break; + } +} + + +static bool TestMagic(MDFNFILE *fp) +{ + if(PSFLoader::TestMagic(0x23, fp->stream())) + return(true); + + if(strcasecmp(fp->ext, "smc") && strcasecmp(fp->ext, "swc") && strcasecmp(fp->ext, "sfc") && strcasecmp(fp->ext, "fig") && + strcasecmp(fp->ext, "bs") && strcasecmp(fp->ext, "st")) + { + return(false); + } + + return(true); +} + +static void SetupMisc(bool PAL) +{ + PrevFrameInterlaced = false; + + bSNES_v059::video.set_mode(PAL ? bSNES_v059::Video::ModePAL : bSNES_v059::Video::ModeNTSC); + + // Nominal FPS values are a bit off, FIXME(and contemplate the effect on netplay sound buffer overruns/underruns) + MDFNGameInfo->fps = PAL ? 838977920 : 1008307711; + MDFNGameInfo->MasterClock = MDFN_MASTERCLOCK_FIXED(32040.5); + + if(!snsf_loader) + { + MDFNGameInfo->nominal_width = MDFN_GetSettingB("snes.correct_aspect") ? (PAL ? 344/*354*/ : 292) : 256; + MDFNGameInfo->nominal_height = PAL ? 239 : 224; + MDFNGameInfo->lcm_height = MDFNGameInfo->nominal_height * 2; + + // + // SuperScope coordinate translation stuff: + // + MDFNGameInfo->mouse_scale_x = 256.0 / MDFNGameInfo->nominal_width; + MDFNGameInfo->mouse_scale_y = 1.0; + MDFNGameInfo->mouse_offs_x = 0.0; + MDFNGameInfo->mouse_offs_y = 0.0; + } + + ResampInPos = 0; + SoundLastRate = 0; +} + +static void LoadSNSF(MDFNFILE *fp) +{ + bool PAL = false; + + bSNES_v059::system.init(&Interface); + + MultitapEnabled[0] = false; + MultitapEnabled[1] = false; + + std::vector SongNames; + + snsf_loader = new SNSFLoader(fp->stream()); + { + uint8 *export_ptr; + + export_ptr = new uint8[8192 * 1024]; + memset(export_ptr, 0x00, 8192 * 1024); + assert(snsf_loader->ROM_Data.size() <= 8192 * 1024); + snsf_loader->ROM_Data.read(export_ptr, snsf_loader->ROM_Data.size()); + bSNES_v059::memory::cartrom.map(export_ptr, snsf_loader->ROM_Data.size()); + snsf_loader->ROM_Data.close(); + + bSNES_v059::cartridge.load(bSNES_v059::Cartridge::ModeNormal); + } + SongNames.push_back(snsf_loader->tags.GetTag("title")); + + Player_Init(1, snsf_loader->tags.GetTag("game"), snsf_loader->tags.GetTag("artist"), snsf_loader->tags.GetTag("copyright"), SongNames); + + bSNES_v059::system.power(); + PAL = (bSNES_v059::system.region() == bSNES_v059::System::PAL); + + SetupMisc(PAL); +} + +static void Cleanup(void) +{ + bSNES_v059::memory::cartrom.map(NULL, 0); // So it delete[]s the pointer it took ownership of. + + if(snsf_loader) + { + delete snsf_loader; + snsf_loader = NULL; + } + + ColorMap.resize(0); + + if(resampler) + { + speex_resampler_destroy(resampler); + resampler = NULL; + } +} + +static const unsigned cheat_page_size = 1024; +template +static void CheatMap(bool uics, uint32 addr, T& mr, uint32 offset) +{ + assert((offset + cheat_page_size) <= mr.size()); + MDFNMP_AddRAM(cheat_page_size, addr, mr.data() + offset, uics); +} + +// Intended only for the MapLinear type. +template +static void CheatMap(bool uics, uint8 bank_lo, uint8 bank_hi, uint16 addr_lo, uint16 addr_hi, T& mr, uint32 offset = 0, uint32 size = 0) +{ + assert(bank_lo <= bank_hi); + assert(addr_lo <= addr_hi); + if((int)mr.size() < cheat_page_size) + { + if((int)mr.size() > 0) + printf("Boop: %d\n", mr.size()); + return; + } + + uint8 page_lo = addr_lo / cheat_page_size; + uint8 page_hi = addr_hi / cheat_page_size; + unsigned index = 0; + + for(unsigned bank = bank_lo; bank <= bank_hi; bank++) + { + for(unsigned page = page_lo; page <= page_hi; page++) + { + if(size) + { + if(index >= size) + uics = false; + index %= size; + } + + if((offset + index) >= mr.size()) + uics = false; + + CheatMap(uics, (bank << 16) + (page * cheat_page_size), mr, bSNES_v059::bus.mirror(offset + index, mr.size())); + index += cheat_page_size; + } + } +} + +static void Load(MDFNFILE *fp) +{ + bool PAL = FALSE; + + CycleCounter = 0; + + try + { + if(PSFLoader::TestMagic(0x23, fp->stream())) + { + LoadSNSF(fp); + return; + } + + bSNES_v059::system.init(&Interface); + + // Allocate 8MiB of space regardless of actual ROM image size, to prevent malformed or corrupted ROM images + // from crashing the bsnes cart loading code. + { + static const uint64 max_rom_size = 8192 * 1024; + const uint64 raw_size = fp->size(); + const unsigned header_adjust = (((raw_size & 0x7FFF) == 512) ? 512 : 0); + const uint64 size = raw_size - header_adjust; + md5_context md5; + md5.starts(); + + if(size > max_rom_size) + throw MDFN_Error(0, _("SNES ROM image is too large.")); + + if(header_adjust) + { + uint8 header_tmp[512]; + fp->read(header_tmp, 512); + md5.update(header_tmp, 512); // For Mednafen backwards compat + } + + std::unique_ptr export_ptr(new uint8[max_rom_size]); + memset(export_ptr.get(), 0x00, max_rom_size); + fp->read(export_ptr.get(), size); + + md5.update(export_ptr.get(), size); + md5.finish(MDFNGameInfo->MD5); + + // + // Mirror up to an 8MB boundary so we can implement HAPPY FUNTIME YAAAAAAAY optimizations(like with SuperFX). + // + for(uint32 a = (size + 255) &~255; a < max_rom_size; a += 256) + { + const uint32 oa = bSNES_v059::bus.mirror(a, size); + //printf("%08x->%08x\n",a, oa); + memcpy(&export_ptr[a], &export_ptr[oa], 256); + } + bSNES_v059::memory::cartrom.map(export_ptr.release(), size); + bSNES_v059::cartridge.load(bSNES_v059::Cartridge::ModeNormal); + } + + bSNES_v059::system.power(); + + PAL = (bSNES_v059::system.region() == bSNES_v059::System::PAL); + + SetupMisc(PAL); + + MultitapEnabled[0] = MDFN_GetSettingB("snes.input.port1.multitap"); + MultitapEnabled[1] = MDFN_GetSettingB("snes.input.port2.multitap"); + + SaveLoadMemory(true); + + //printf(" %d %d\n", FSettings.SndRate, resampler.max_write()); + + MDFNMP_Init(cheat_page_size, (1U << 24) / cheat_page_size); + + // + // Should more-or-less match what's in: src/memory/smemory/generic.cpp + // + if((int)bSNES_v059::memory::cartram.size() > 0 && (bSNES_v059::memory::cartram.size() % cheat_page_size) == 0) + { + if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::SuperFXROM) + { + + } + else if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::SA1ROM) + { + CheatMap(true, 0x00, 0x3f, 0x3000, 0x37ff, bSNES_v059::memory::iram); //cpuiram); + CheatMap(false, 0x00, 0x3f, 0x6000, 0x7fff, bSNES_v059::memory::cartram); //cc1bwram); + CheatMap(true, 0x40, 0x4f, 0x0000, 0xffff, bSNES_v059::memory::cartram); //cc1bwram); + CheatMap(false, 0x80, 0xbf, 0x3000, 0x37ff, bSNES_v059::memory::iram); //cpuiram); + CheatMap(false, 0x80, 0xbf, 0x6000, 0x7fff, bSNES_v059::memory::cartram); //cc1bwram); + } + else if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::SPC7110ROM) + { + + } + else if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::BSXROM) + { + + } + else if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::BSCLoROM) + { + + } + else if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::BSCHiROM) + { + + } + else if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::STROM) + { + + } + else + { + if((int)bSNES_v059::memory::cartram.size() > 0) + { + CheatMap(false, 0x20, 0x3f, 0x6000, 0x7fff, bSNES_v059::memory::cartram); + CheatMap(false, 0xa0, 0xbf, 0x6000, 0x7fff, bSNES_v059::memory::cartram); + + //research shows only games with very large ROM/RAM sizes require MAD-1 memory mapping of RAM + //otherwise, default to safer, larger RAM address window + uint16 addr_hi = (bSNES_v059::memory::cartrom.size() > 0x200000 || bSNES_v059::memory::cartram.size() > 32 * 1024) ? 0x7fff : 0xffff; + const bool meowmeowmoocow = bSNES_v059::memory::cartram.size() <= ((addr_hi + 1) * 14) || bSNES_v059::cartridge.mapper() != bSNES_v059::Cartridge::LoROM; + + CheatMap(meowmeowmoocow, 0x70, 0x7f, 0x0000, addr_hi, bSNES_v059::memory::cartram); + + if(bSNES_v059::cartridge.mapper() == bSNES_v059::Cartridge::LoROM) + CheatMap(!meowmeowmoocow, 0xf0, 0xff, 0x0000, addr_hi, bSNES_v059::memory::cartram); + } + } + } + + // + // System(WRAM) mappings should be done last, as they'll partially overwrite some of the cart mappings above, matching bsnes' internal semantics. + // + + CheatMap(false, 0x00, 0x3f, 0x0000, 0x1fff, bSNES_v059::memory::wram, 0x000000, 0x002000); + CheatMap(false, 0x80, 0xbf, 0x0000, 0x1fff, bSNES_v059::memory::wram, 0x000000, 0x002000); + CheatMap(true, 0x7e, 0x7f, 0x0000, 0xffff, bSNES_v059::memory::wram); + + ColorMap.resize(32768); + } + catch(std::exception &e) + { + Cleanup(); + throw; + } +} + +static void CloseGame(void) +{ + if(!snsf_loader) + { + try + { + SaveLoadMemory(false); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + } + Cleanup(); +} + +static void Emulate(EmulateSpecStruct *espec) +{ + tsurf = espec->surface; + tlw = espec->LineWidths; + tdr = &espec->DisplayRect; + es = espec; + + for(unsigned i = 0; i < 2; i++) + ScopeOSCounter[i] -= (bool)ScopeOSCounter[i]; + + PrevLine = -1; + + if(!snsf_loader) + { + if(!espec->skip && tsurf && tlw) + { + tdr->x = 0; + tdr->y = 0; + tdr->w = 1; + tdr->h = 1; + tlw[0] = 0; // Mark line widths as valid(ie != ~0; since field == 1 would skip it). + } + + if(espec->VideoFormatChanged) + BuildColorMap(espec->surface->format, espec->CustomPalette); + } + + if(SoundLastRate != espec->SoundRate) + { + if(resampler) + { + speex_resampler_destroy(resampler); + resampler = NULL; + } + int err = 0; + int quality = MDFN_GetSettingUI("snes.apu.resamp_quality"); + + resampler = speex_resampler_init_frac(2, 64081, 2 * (int)(espec->SoundRate ? espec->SoundRate : 48000), + 32040.5, (int)(espec->SoundRate ? espec->SoundRate : 48000), quality, &err); + SoundLastRate = espec->SoundRate; + + //printf("%f ms\n", 1000.0 * speex_resampler_get_input_latency(resampler) / 32040.5); + } + + if(!snsf_loader) + { + MDFNMP_ApplyPeriodicCheats(); + } + + // Make sure to trash any leftover samples, generated from system.runtosave() in save state saving, if sound is now disabled. + if(SoundOn && !espec->SoundBuf) + { + ResampInPos = 0; + } + + SoundOn = espec->SoundBuf ? true : false; + + HasPolledThisFrame = false; + InProperEmu = TRUE; + + // More aggressive frameskipping disabled until we can rule out undesirable side-effects and interactions. + //bSNES_v059::ppu.enable_renderer(!espec->skip || PrevFrameInterlaced); + bSNES_v059::system.run_mednafen_custom(); + bSNES_v059::ppu.enable_renderer(true); + + + // + // Blank out any missed lines(for e.g. display height change with PAL emulation) + // + if(!snsf_loader && !es->skip && tsurf && tlw) + { + //printf("%d\n", PrevLine + 1); + BlankMissingLines(PrevLine + 1, tdr->h >> es->InterlaceOn, es->InterlaceOn, es->InterlaceField); + } + + tsurf = NULL; + tlw = NULL; + tdr = NULL; + es = NULL; + InProperEmu = FALSE; + + espec->MasterCycles = CycleCounter; + CycleCounter = 0; + + //if(!espec->MasterCycles) + //{ + // puts("BOGUS GNOMES"); + // espec->MasterCycles = 1; + //} + //printf("%d\n", espec->MasterCycles); + + if(espec->SoundBuf) + { + spx_uint32_t in_len; // "Number of input samples in the input buffer. Returns the number of samples processed. This is all per-channel." + spx_uint32_t out_len; // "Size of the output buffer. Returns the number of samples written. This is all per-channel." + + // Hrm, still crackly with some games(like MMX) when rewinding... + if(espec->NeedSoundReverse) + { + for(unsigned lr = 0; lr < 2; lr++) + { + int16* p0 = &ResampInBuffer[0][lr]; + int16* p1 = &ResampInBuffer[ResampInPos - 1][lr]; + unsigned count = ResampInPos >> 1; + + while(MDFN_LIKELY(count--)) + { + int16 tmp; + + tmp = *p0; + *p0 = *p1; + *p1 = tmp; + p0 += 2; + p1 -= 2; + } + } + espec->NeedSoundReverse = false; + } + + //printf("%d\n", ResampInPos); + in_len = ResampInPos; + out_len = 524288; //8192; // FIXME, real size. + + speex_resampler_process_interleaved_int(resampler, (const spx_int16_t *)ResampInBuffer, &in_len, (spx_int16_t *)espec->SoundBuf, &out_len); + + assert(in_len <= ResampInPos); + + if((ResampInPos - in_len) > 0) + memmove(ResampInBuffer, ResampInBuffer + in_len, (ResampInPos - in_len) * sizeof(int16) * 2); + + ResampInPos -= in_len; + + espec->SoundBufSize = out_len; + } + + MDFNGameInfo->mouse_sensitivity = MDFN_GetSettingF("snes.mouse_sensitivity"); + + if(snsf_loader) + { + if(!espec->skip) + { + espec->LineWidths[0] = ~0; + Player_Draw(espec->surface, &espec->DisplayRect, 0, espec->SoundBuf, espec->SoundBufSize); + } + } + + +#if 0 + { + static int skipframe = 3; + + if(skipframe) + skipframe--; + else + { + static unsigned fc = 0; + static uint64 cc = 0; + static uint64 cc2 = 0; + + fc++; + cc += espec->MasterCycles; + cc2 += espec->SoundBufSize; + + printf("%f %f\n", (double)fc / ((double)cc / 32040.5), (double)fc / ((double)cc2 / espec->SoundRate)); + } + } +#endif +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + const uint32 length = bSNES_v059::system.serialize_size(); + bSNES_v059::Input* inpp = &bSNES_v059::input; + + SFORMAT ExtraStateRegs[] = + { + SFARRAY16(PadLatch, 8), + + SFARRAY16(MouseXLatch, 2), + SFARRAY16(MouseYLatch, 2), + SFARRAY(MouseBLatch, 2), + + SFARRAY16(ScopeXLatch, 2), + SFARRAY16(ScopeYLatch, 2), + SFARRAY(ScopeBLatch, 2), + SFARRAY(ScopeOSCounter, 2), + + SFVAR(inpp->latchx), + SFVAR(inpp->latchy), +#define INPP_HELPER(n) \ + SFVAR(inpp->port[n].counter0), \ + SFVAR(inpp->port[n].counter1), \ + SFVAR(inpp->port[n].superscope.x), \ + SFVAR(inpp->port[n].superscope.y), \ + SFVAR(inpp->port[n].superscope.trigger), \ + SFVAR(inpp->port[n].superscope.cursor), \ + SFVAR(inpp->port[n].superscope.turbo), \ + SFVAR(inpp->port[n].superscope.pause), \ + SFVAR(inpp->port[n].superscope.offscreen), \ + SFVAR(inpp->port[n].superscope.turbolock), \ + SFVAR(inpp->port[n].superscope.triggerlock), \ + SFVAR(inpp->port[n].superscope.pauselock) + + INPP_HELPER(0), + INPP_HELPER(1), + +#undef INPP_HELPER + + SFEND + }; + + if(load) + { + std::unique_ptr ptr(new uint8[length]); + + SFORMAT StateRegs[] = + { + SFARRAYN(ptr.get(), length, "OmniCat"), + { ExtraStateRegs, ~0U, 0, NULL }, + SFEND + }; + + MDFNSS_StateAction(sm, 1, data_only, StateRegs, "DATA"); + + //srand(99); + //for(int i = 16; i < length; i++) + // ptr[i] = rand() & 0x3; + + serializer state(ptr.get(), length); + + if(!bSNES_v059::system.unserialize(state)) + throw MDFN_Error(0, _("bSNES core unserializer error.")); + } + else // save: + { + if(bSNES_v059::scheduler.sync != bSNES_v059::Scheduler::SyncAll) + bSNES_v059::system.runtosave(); + + serializer state(length); + + bSNES_v059::system.serialize(state); + + assert(state.size() == length); + + uint8 *ptr = const_cast(state.data()); + + SFORMAT StateRegs[] = + { + SFARRAYN(ptr, length, "OmniCat"), + { ExtraStateRegs, ~0U, 0, NULL }, + SFEND + }; + + MDFNSS_StateAction(sm, 0, data_only, StateRegs, "DATA"); + } +} + +struct StrToBSIT_t +{ + const char *str; + const int id; +}; + +static const StrToBSIT_t StrToBSIT[] = +{ + { "none", bSNES_v059::Input::DeviceNone }, + { "gamepad", bSNES_v059::Input::DeviceJoypad }, + { "multitap", bSNES_v059::Input::DeviceMultitap }, + { "mouse", bSNES_v059::Input::DeviceMouse }, + { "superscope", bSNES_v059::Input::DeviceSuperScope }, + { "justifier", bSNES_v059::Input::DeviceJustifier }, + { "justifiers", bSNES_v059::Input::DeviceJustifiers }, + { NULL, -1 }, +}; + + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + assert(port < 8); + + if(port < 2) + { + const StrToBSIT_t *sb = StrToBSIT; + int id = -1; + + if(MultitapEnabled[port] && !strcmp(type, "gamepad")) + type = "multitap"; + + while(sb->str && id == -1) + { + if(!strcmp(type, sb->str)) + id = sb->id; + sb++; + } + assert(id != -1); + + InputType[port] = id; + + if(port) + bSNES_v059::config.controller_port2 = id; + else + bSNES_v059::config.controller_port1 = id; + + bSNES_v059::input.port_set_device(port, id); + +#if 0 + switch(config().input.port1) { default: + case ControllerPort1::None: mapper().port1 = 0; break; + case ControllerPort1::Gamepad: mapper().port1 = &Controllers::gamepad1; break; + case ControllerPort1::Asciipad: mapper().port1 = &Controllers::asciipad1; break; + case ControllerPort1::Multitap: mapper().port1 = &Controllers::multitap1; break; + case ControllerPort1::Mouse: mapper().port1 = &Controllers::mouse1; break; + } + + switch(config().input.port2) { default: + case ControllerPort2::None: mapper().port2 = 0; break; + case ControllerPort2::Gamepad: mapper().port2 = &Controllers::gamepad2; break; + case ControllerPort2::Asciipad: mapper().port2 = &Controllers::asciipad2; break; + case ControllerPort2::Multitap: mapper().port2 = &Controllers::multitap2; break; + case ControllerPort2::Mouse: mapper().port2 = &Controllers::mouse2; break; + case ControllerPort2::SuperScope: mapper().port2 = &Controllers::superscope; break; + case ControllerPort2::Justifier: mapper().port2 = &Controllers::justifier1; break; + case ControllerPort2::Justifiers: mapper().port2 = &Controllers::justifiers; break; + } +#endif + + } + + + InputPtr[port] = (uint8 *)ptr; +} + +static void SetLayerEnableMask(uint64 mask) +{ + +} + + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_RESET: bSNES_v059::system.reset(); break; + case MDFN_MSC_POWER: bSNES_v059::system.power(); break; + } +} + +static const IDIISG GamepadIDII = +{ + { "b", "B (center, lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "y", "Y (left)", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "a", "A (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "x", "X (center, upper)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, + { "l", "Left Shoulder", 10, IDIT_BUTTON, NULL }, + { "r", "Right Shoulder", 11, IDIT_BUTTON, NULL }, +}; + +static const IDIISG MouseIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS_REL }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS_REL }, + { "left", "Left Button", 0, IDIT_BUTTON, NULL }, + { "right", "Right Button", 1, IDIT_BUTTON, NULL }, +}; + +static const IDIISG SuperScopeIDII = +{ + { "x_axis", "X Axis", -1, IDIT_X_AXIS }, + { "y_axis", "Y Axis", -1, IDIT_Y_AXIS }, + + { "trigger", "Trigger", 0, IDIT_BUTTON, NULL }, + { "offscreen_shot", "Offscreen Shot(Simulated)", 1, IDIT_BUTTON, NULL }, + { "pause", "Pause", 2, IDIT_BUTTON, NULL }, + { "turbo", "Turbo", 3, IDIT_BUTTON, NULL }, + { "cursor", "Cursor", 4, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfoSNESPort1 = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII + }, + + // Mouse + { + "mouse", + "Mouse", + NULL, + MouseIDII + }, +}; + +static const std::vector InputDeviceInfoSNESPort2 = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII + }, + + // Mouse + { + "mouse", + "Mouse", + NULL, + MouseIDII + }, + + // Super Scope + { + "superscope", + "Super Scope", + gettext_noop("Monkey!"), + SuperScopeIDII + }, +}; + + +static const std::vector InputDeviceInfoTapPort = +{ + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII, + }, +}; + + +static const std::vector PortInfo = +{ + { "port1", "Port 1/1A", InputDeviceInfoSNESPort1, "gamepad" }, + { "port2", "Port 2/2A", InputDeviceInfoSNESPort2, "gamepad" }, + { "port3", "Port 2B", InputDeviceInfoTapPort, "gamepad" }, + { "port4", "Port 2C", InputDeviceInfoTapPort, "gamepad" }, + { "port5", "Port 2D", InputDeviceInfoTapPort, "gamepad" }, + { "port6", "Port 1B", InputDeviceInfoTapPort, "gamepad" }, + { "port7", "Port 1C", InputDeviceInfoTapPort, "gamepad" }, + { "port8", "Port 1D", InputDeviceInfoTapPort, "gamepad" }, +}; + +static void InstallReadPatch(uint32 address, uint8 value, int compare) +{ + bSNES_v059::CheatCode tc; + + tc.addr = address; + tc.data = value; + tc.compare = compare; + + //printf("%08x %02x %d\n", address, value, compare); + + bSNES_v059::cheat.enable(true); + bSNES_v059::cheat.install_read_patch(tc); +} + +static void RemoveReadPatches(void) +{ + bSNES_v059::cheat.enable(false); + bSNES_v059::cheat.remove_read_patches(); +} + + +static const MDFNSetting SNESSettings[] = +{ + { "snes.input.port1.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on SNES port 1."), NULL, MDFNST_BOOL, "0", NULL, NULL }, + { "snes.input.port2.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on SNES port 2."), NULL, MDFNST_BOOL, "0", NULL, NULL }, + + { "snes.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Emulated mouse sensitivity."), NULL, MDFNST_FLOAT, "0.50", NULL, NULL, NULL }, + + { "snes.correct_aspect", MDFNSF_CAT_VIDEO, gettext_noop("Correct the aspect ratio."), gettext_noop("Note that regardless of this setting's value, \"512\" and \"256\" width modes will be scaled to the same dimensions for display."), MDFNST_BOOL, "0" }, + + { "snes.apu.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("APU output resampler quality."), gettext_noop("0 is lowest quality and latency and CPU usage, 10 is highest quality and latency and CPU usage.\n\nWith a Mednafen sound output rate of about 32041Hz or higher: Quality \"0\" resampler has approximately 0.125ms of latency, quality \"5\" resampler has approximately 1.25ms of latency, and quality \"10\" resampler has approximately 3.99ms of latency."), MDFNST_UINT, "5", "0", "10" }, + + { NULL } +}; + + +static bool DecodeGG(const std::string& cheat_string, MemoryPatch* patch) +{ + if(cheat_string.size() != 8 && cheat_string.size() != 9) + throw MDFN_Error(0, _("Game Genie code is of an incorrect length.")); + + if(cheat_string.size() == 9 && (cheat_string[4] != '-' && cheat_string[4] != '_' && cheat_string[4] != ' ')) + throw MDFN_Error(0, _("Game Genie code is malformed.")); + + uint32 ev = 0; + + for(unsigned i = 0; i < 8; i++) + { + int c = cheat_string[(i >= 4 && cheat_string.size() == 9) ? (i + 1) : i]; + static const uint8 subst_table[16] = { 0x4, 0x6, 0xD, 0xE, 0x2, 0x7, 0x8, 0x3, + 0xB, 0x5, 0xC, 0x9, 0xA, 0x0, 0xF, 0x1 }; + ev <<= 4; + + if(c >= '0' && c <= '9') + ev |= subst_table[c - '0']; + else if(c >= 'a' && c <= 'f') + ev |= subst_table[c - 'a' + 0xA]; + else if(c >= 'A' && c <= 'F') + ev |= subst_table[c - 'A' + 0xA]; + else + { + if(c & 0x80) + throw MDFN_Error(0, _("Invalid character in Game Genie code.")); + else + throw MDFN_Error(0, _("Invalid character in Game Genie code: %c"), c); + } + } + + uint32 addr = 0; + uint8 val = 0;; + static const uint8 bm[24] = + { + 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x0e, 0x0f, 0x00, 0x01, 0x14, 0x15, 0x16, 0x17, 0x02, 0x03, 0x04, 0x05, 0x0a, 0x0b, 0x0c, 0x0d + }; + + + val = ev >> 24; + for(unsigned i = 0; i < 24; i++) + addr |= ((ev >> bm[i]) & 1) << i; + + patch->addr = addr; + patch->val = val; + patch->length = 1; + patch->type = 'S'; + + //printf("%08x %02x\n", addr, val); + + return(false); +} + +static bool DecodePAR(const std::string& cheat_string, MemoryPatch* patch) +{ + uint32 addr; + uint8 val; + + if(cheat_string.size() != 8 && cheat_string.size() != 9) + throw MDFN_Error(0, _("Pro Action Replay code is of an incorrect length.")); + + if(cheat_string.size() == 9 && (cheat_string[6] != ':' && cheat_string[6] != ';' && cheat_string[6] != ' ')) + throw MDFN_Error(0, _("Pro Action Replay code is malformed.")); + + + uint32 ev = 0; + + for(unsigned i = 0; i < 8; i++) + { + int c = cheat_string[(i >= 6 && cheat_string.size() == 9) ? (i + 1) : i]; + + ev <<= 4; + + if(c >= '0' && c <= '9') + ev |= c - '0'; + else if(c >= 'a' && c <= 'f') + ev |= c - 'a' + 0xA; + else if(c >= 'A' && c <= 'F') + ev |= c - 'A' + 0xA; + else + { + if(c & 0x80) + throw MDFN_Error(0, _("Invalid character in Pro Action Replay code.")); + else + throw MDFN_Error(0, _("Invalid character in Pro Action Replay code: %c"), c); + } + } + + patch->addr = ev >> 8; + patch->val = ev & 0xFF; + patch->length = 1; + patch->type = 'R'; + + return(false); +} + +static CheatFormatStruct CheatFormats[] = +{ + { "Game Genie", "", DecodeGG }, + { "Pro Action Replay", "", DecodePAR }, +}; + +static CheatFormatInfoStruct CheatFormatInfo = +{ + 2, + CheatFormats +}; + + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".smc", "Super Magicom ROM Image" }, + { ".swc", "Super Wildcard ROM Image" }, + { ".sfc", "Cartridge ROM Image" }, + { ".fig", "Cartridge ROM Image" }, + + { ".bs", "BS-X EEPROM Image" }, + { ".st", "Sufami Turbo Cartridge ROM Image" }, + + { NULL, NULL } +}; + +MDFNGI EmulatedSNES = +{ + "snes", + "Super Nintendo Entertainment System/Super Famicom", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + NULL, // Debugger + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + SetLayerEnableMask, + NULL, // Layer names, null-delimited + NULL, + NULL, + + CPInfo, + 1 << 0, + + InstallReadPatch, + RemoveReadPatches, + NULL, //MemRead, + &CheatFormatInfo, + true, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + SNESSettings, + 0, + 0, + FALSE, // Multires + + 512, // lcm_width + 480, // lcm_height (replaced in game load) + NULL, // Dummy + + 256, // Nominal width (replaced in game load) + 240, // Nominal height (replaced in game load) + + 512, // Framebuffer width + 512, // Framebuffer height + + 2, // Number of output sound channels +}; + + diff --git a/Mednafen/mednafen/snes/src/base.hpp b/Mednafen/mednafen/snes/src/base.hpp new file mode 100755 index 0000000000..10c7ddc6d8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/base.hpp @@ -0,0 +1,45 @@ +static const char bsnesVersion[] = "0.059"; +static const char bsnesTitle[] = "bsnes"; +static const unsigned bsnesSerializerVersion = 4; + +//S-DSP can be encapsulated into a state machine using #define magic +//this avoids ~2.048m co_switch() calls per second (~5% speedup) +#define DSP_STATE_MACHINE + +//game genie + pro action replay code support (~2% speed hit) +#define CHEAT_SYSTEM + +//enable debugging extensions (~15% speed hit) +//#define DEBUGGER +#undef DEBUGGER + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace nall_v059; + +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; + +#include "interface.hpp" diff --git a/Mednafen/mednafen/snes/src/cartridge/cartridge.cpp b/Mednafen/mednafen/snes/src/cartridge/cartridge.cpp new file mode 100755 index 0000000000..f5f4190404 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cartridge/cartridge.cpp @@ -0,0 +1,128 @@ +#include <../base.hpp> +#include + +#define CARTRIDGE_CPP +namespace bSNES_v059 { + +#include "header.cpp" +#include "gameboyheader.cpp" +#include "serialization.cpp" + +namespace memory { + MappedRAM cartrom, cartram, cartrtc; + MappedRAM bsxflash, bsxram, bsxpram; + MappedRAM stArom, stAram; + MappedRAM stBrom, stBram; + MappedRAM gbrom, gbram, gbrtc; +}; + +Cartridge cartridge; + +void Cartridge::load(Mode cartridge_mode) { + mode = cartridge_mode; + read_header(memory::cartrom.data(), memory::cartrom.size()); + + if(ram_size > 0) { + memory::cartram.map(allocate(ram_size, 0xff), ram_size); + } + + if(has_srtc || has_spc7110rtc) { + memory::cartrtc.map(allocate(20, 0xff), 20); + } + + if(mode == ModeBsx) { + memory::bsxram.map (allocate( 32 * 1024, 0xff), 32 * 1024); + memory::bsxpram.map(allocate(512 * 1024, 0xff), 512 * 1024); + } + + if(mode == ModeSufamiTurbo) { + if(memory::stArom.data()) memory::stAram.map(allocate(128 * 1024, 0xff), 128 * 1024); + if(memory::stBrom.data()) memory::stBram.map(allocate(128 * 1024, 0xff), 128 * 1024); + } + + if(mode == ModeSuperGameBoy) { + if(memory::gbrom.data()) { + unsigned ram_size = gameboy_ram_size(); + unsigned rtc_size = gameboy_rtc_size(); + + if(ram_size) memory::gbram.map(allocate(ram_size, 0xff), ram_size); + if(rtc_size) memory::gbrtc.map(allocate(rtc_size, 0x00), rtc_size); + } + } + + memory::cartrom.write_protect(true); + memory::cartram.write_protect(false); + memory::cartrtc.write_protect(false); + memory::bsxflash.write_protect(true); + memory::bsxram.write_protect(false); + memory::bsxpram.write_protect(false); + memory::stArom.write_protect(true); + memory::stAram.write_protect(false); + memory::stBrom.write_protect(true); + memory::stBram.write_protect(false); + memory::gbrom.write_protect(true); + memory::gbram.write_protect(false); + memory::gbrtc.write_protect(false); + + unsigned checksum = ~0; + for(unsigned n = 0; n < memory::cartrom.size(); n++) checksum = crc32_adjust(checksum, memory::cartrom[n]); + if(memory::bsxflash.size() != 0 && memory::bsxflash.size() != ~0) + for(unsigned n = 0; n < memory::bsxflash.size(); n++) checksum = crc32_adjust(checksum, memory::bsxflash[n]); + if(memory::stArom.size() != 0 && memory::stArom.size() != ~0) + for(unsigned n = 0; n < memory::stArom.size(); n++) checksum = crc32_adjust(checksum, memory::stArom[n]); + if(memory::stBrom.size() != 0 && memory::stBrom.size() != ~0) + for(unsigned n = 0; n < memory::stBrom.size(); n++) checksum = crc32_adjust(checksum, memory::stBrom[n]); + if(memory::gbrom.size() != 0 && memory::gbrom.size() != ~0) + for(unsigned n = 0; n < memory::gbrom.size(); n++) checksum = crc32_adjust(checksum, memory::gbrom[n]); + crc32 = ~checksum; + +#if 0 + fprintf(stdout, "crc32 = %.8x\n", (unsigned)crc32); + + sha256_ctx sha; + uint8_t shahash[32]; + sha256_init(&sha); + sha256_chunk(&sha, memory::cartrom.data(), memory::cartrom.size()); + sha256_final(&sha); + sha256_hash(&sha, shahash); + + fprintf(stdout, "sha256 = "); + for(unsigned i = 0; i < 32; i++) fprintf(stdout, "%.2x", shahash[i]); + fprintf(stdout, "\n"); +#endif + + bus.load_cart(); + system.serialize_init(); + loaded = true; +} + +void Cartridge::unload() { + memory::cartrom.reset(); + memory::cartram.reset(); + memory::cartrtc.reset(); + memory::bsxflash.reset(); + memory::bsxram.reset(); + memory::bsxpram.reset(); + memory::stArom.reset(); + memory::stAram.reset(); + memory::stBrom.reset(); + memory::stBram.reset(); + memory::gbrom.reset(); + memory::gbram.reset(); + memory::gbrtc.reset(); + + if(loaded == false) return; + bus.unload_cart(); + loaded = false; +} + +Cartridge::Cartridge() { + loaded = false; + unload(); +} + +Cartridge::~Cartridge() { + unload(); +} + +} diff --git a/Mednafen/mednafen/snes/src/cartridge/cartridge.hpp b/Mednafen/mednafen/snes/src/cartridge/cartridge.hpp new file mode 100755 index 0000000000..5804b41539 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cartridge/cartridge.hpp @@ -0,0 +1,115 @@ +class Cartridge : property { +public: + enum Mode { + ModeNormal, + ModeBsxSlotted, + ModeBsx, + ModeSufamiTurbo, + ModeSuperGameBoy, + }; + + enum Type { + TypeNormal, + TypeBsxSlotted, + TypeBsxBios, + TypeBsx, + TypeSufamiTurboBios, + TypeSufamiTurbo, + TypeSuperGameBoy1Bios, + TypeSuperGameBoy2Bios, + TypeGameBoy, + TypeUnknown, + }; + + enum Region { + NTSC, + PAL, + }; + + enum MemoryMapper { + LoROM, + HiROM, + ExLoROM, + ExHiROM, + SuperFXROM, + SA1ROM, + SPC7110ROM, + BSCLoROM, + BSCHiROM, + BSXROM, + STROM, + }; + + enum DSP1MemoryMapper { + DSP1Unmapped, + DSP1LoROM1MB, + DSP1LoROM2MB, + DSP1HiROM, + }; + + readonly loaded; //is a base cartridge inserted? + readonly crc32; //crc32 of all cartridges (base+slot(s)) + + readonly mode; + readonly type; + readonly region; + readonly mapper; + readonly dsp1_mapper; + + readonly has_bsx_slot; + readonly has_superfx; + readonly has_sa1; + readonly has_srtc; + readonly has_sdd1; + readonly has_spc7110; + readonly has_spc7110rtc; + readonly has_cx4; + readonly has_dsp1; + readonly has_dsp2; + readonly has_dsp3; + readonly has_dsp4; + readonly has_obc1; + readonly has_st010; + readonly has_st011; + readonly has_st018; + + void load(Mode); + void unload(); + + void serialize(serializer&); + Cartridge(); + ~Cartridge(); + +private: + enum HeaderField { + CartName = 0x00, + Mapper = 0x15, + RomType = 0x16, + RomSize = 0x17, + RamSize = 0x18, + CartRegion = 0x19, + Company = 0x1a, + Version = 0x1b, + Complement = 0x1c, //inverse checksum + Checksum = 0x1e, + ResetVector = 0x3c, + }; + + unsigned ram_size; + void read_header(const uint8_t *data, unsigned size); + unsigned find_header(const uint8_t *data, unsigned size) const; + unsigned score_header(const uint8_t *data, unsigned size, unsigned addr) const; + + unsigned gameboy_ram_size() const; + unsigned gameboy_rtc_size() const; +}; + +namespace memory { + extern MappedRAM cartrom, cartram, cartrtc; + extern MappedRAM bsxflash, bsxram, bsxpram; + extern MappedRAM stArom, stAram; + extern MappedRAM stBrom, stBram; + extern MappedRAM gbrom, gbram, gbrtc; +}; + +extern Cartridge cartridge; diff --git a/Mednafen/mednafen/snes/src/cartridge/gameboyheader.cpp b/Mednafen/mednafen/snes/src/cartridge/gameboyheader.cpp new file mode 100755 index 0000000000..2bc9f8ff70 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cartridge/gameboyheader.cpp @@ -0,0 +1,22 @@ +#ifdef CARTRIDGE_CPP + +unsigned Cartridge::gameboy_ram_size() const { + if(memory::gbrom.size() < 512) return 0; + switch(memory::gbrom[0x0149]) { + case 0x00: return 0 * 1024; + case 0x01: return 8 * 1024; + case 0x02: return 8 * 1024; + case 0x03: return 32 * 1024; + case 0x04: return 128 * 1024; + case 0x05: return 128 * 1024; + default: return 128 * 1024; + } +} + +unsigned Cartridge::gameboy_rtc_size() const { + if(memory::gbrom.size() < 512) return 0; + if(memory::gbrom[0x0147] == 0x0f || memory::gbrom[0x0147] == 0x10) return 4; + return 0; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cartridge/header.cpp b/Mednafen/mednafen/snes/src/cartridge/header.cpp new file mode 100755 index 0000000000..805029adc4 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cartridge/header.cpp @@ -0,0 +1,321 @@ +#ifdef CARTRIDGE_CPP + +void Cartridge::read_header(const uint8_t *data, unsigned size) { + type = TypeUnknown; + mapper = LoROM; + dsp1_mapper = DSP1Unmapped; + region = NTSC; + ram_size = 0; + + has_bsx_slot = false; + has_superfx = false; + has_sa1 = false; + has_srtc = false; + has_sdd1 = false; + has_spc7110 = false; + has_spc7110rtc = false; + has_cx4 = false; + has_dsp1 = false; + has_dsp2 = false; + has_dsp3 = false; + has_dsp4 = false; + has_obc1 = false; + has_st010 = false; + has_st011 = false; + has_st018 = false; + + //===================== + //detect Game Boy carts + //===================== + + if(size >= 0x0140) { + if(data[0x0104] == 0xce && data[0x0105] == 0xed && data[0x0106] == 0x66 && data[0x0107] == 0x66 + && data[0x0108] == 0xcc && data[0x0109] == 0x0d && data[0x010a] == 0x00 && data[0x010b] == 0x0b) { + type = TypeGameBoy; + return; + } + } + + const unsigned index = find_header(data, size); + const uint8 mapperid = data[index + Mapper]; + const uint8 rom_type = data[index + RomType]; + const uint8 rom_size = data[index + RomSize]; + const uint8 company = data[index + Company]; + const uint8 regionid = data[index + CartRegion] & 0x7f; + + ram_size = 1024 << (data[index + RamSize] & 7); + if(ram_size == 1024) ram_size = 0; //no RAM present + + //0, 1, 13 = NTSC; 2 - 12 = PAL + region = (regionid <= 1 || regionid >= 13) ? NTSC : PAL; + + //======================= + //detect BS-X flash carts + //======================= + + if(data[index + 0x13] == 0x00 || data[index + 0x13] == 0xff) { + if(data[index + 0x14] == 0x00) { + const uint8_t n15 = data[index + 0x15]; + if(n15 == 0x00 || n15 == 0x80 || n15 == 0x84 || n15 == 0x9c || n15 == 0xbc || n15 == 0xfc) { + if(data[index + 0x1a] == 0x33 || data[index + 0x1a] == 0xff) { + type = TypeBsx; + mapper = BSXROM; + region = NTSC; //BS-X only released in Japan + return; + } + } + } + } + + //========================= + //detect Sufami Turbo carts + //========================= + + if(!memcmp(data, "BANDAI SFC-ADX", 14)) { + if(!memcmp(data + 16, "SFC-ADX BACKUP", 14)) { + type = TypeSufamiTurboBios; + } else { + type = TypeSufamiTurbo; + } + mapper = STROM; + region = NTSC; //Sufami Turbo only released in Japan + return; //RAM size handled outside this routine + } + + //========================== + //detect Super Game Boy BIOS + //========================== + + if(!memcmp(data + index, "Super GAMEBOY2", 14)) { + type = TypeSuperGameBoy2Bios; + return; + } + + if(!memcmp(data + index, "Super GAMEBOY", 13)) { + type = TypeSuperGameBoy1Bios; + return; + } + + //===================== + //detect standard carts + //===================== + + //detect presence of BS-X flash cartridge connector (reads extended header information) + if(data[index - 14] == 'Z') { + if(data[index - 11] == 'J') { + uint8 n13 = data[index - 13]; + if((n13 >= 'A' && n13 <= 'Z') || (n13 >= '0' && n13 <= '9')) { + if(company == 0x33 || (data[index - 10] == 0x00 && data[index - 4] == 0x00)) { + has_bsx_slot = true; + } + } + } + } + + if(has_bsx_slot) { + if(!memcmp(data + index, "Satellaview BS-X ", 21)) { + //BS-X base cart + type = TypeBsxBios; + mapper = BSXROM; + region = NTSC; //BS-X only released in Japan + return; //RAM size handled internally by load_cart_bsx() -> BSXCart class + } else { + type = TypeBsxSlotted; + mapper = (index == 0x7fc0 ? BSCLoROM : BSCHiROM); + region = NTSC; //BS-X slotted cartridges only released in Japan + } + } else { + //standard cart + type = TypeNormal; + + if(index == 0x7fc0 && size >= 0x401000) { + mapper = ExLoROM; + } else if(index == 0x7fc0 && mapperid == 0x32) { + mapper = ExLoROM; + } else if(index == 0x7fc0) { + mapper = LoROM; + } else if(index == 0xffc0) { + mapper = HiROM; + } else { //index == 0x40ffc0 + mapper = ExHiROM; + } + } + + if(mapperid == 0x20 && (rom_type == 0x13 || rom_type == 0x14 || rom_type == 0x15 || rom_type == 0x1a)) { + has_superfx = true; + mapper = SuperFXROM; + ram_size = 1024 << (data[index - 3] & 7); + if(ram_size == 1024) ram_size = 0; + } + + if(mapperid == 0x23 && (rom_type == 0x32 || rom_type == 0x34 || rom_type == 0x35)) { + has_sa1 = true; + mapper = SA1ROM; + } + + if(mapperid == 0x35 && rom_type == 0x55) { + has_srtc = true; + } + + if(mapperid == 0x32 && (rom_type == 0x43 || rom_type == 0x45)) { + has_sdd1 = true; + } + + if(mapperid == 0x3a && (rom_type == 0xf5 || rom_type == 0xf9)) { + has_spc7110 = true; + has_spc7110rtc = (rom_type == 0xf9); + mapper = SPC7110ROM; + } + + if(mapperid == 0x20 && rom_type == 0xf3) { + has_cx4 = true; + } + + if((mapperid == 0x20 || mapperid == 0x21) && rom_type == 0x03) { + has_dsp1 = true; + } + + if(mapperid == 0x30 && rom_type == 0x05 && company != 0xb2) { + has_dsp1 = true; + } + + if(mapperid == 0x31 && (rom_type == 0x03 || rom_type == 0x05)) { + has_dsp1 = true; + } + + if(has_dsp1 == true) { + if((mapperid & 0x2f) == 0x20 && size <= 0x100000) { + dsp1_mapper = DSP1LoROM1MB; + } else if((mapperid & 0x2f) == 0x20) { + dsp1_mapper = DSP1LoROM2MB; + } else if((mapperid & 0x2f) == 0x21) { + dsp1_mapper = DSP1HiROM; + } + } + + if(mapperid == 0x20 && rom_type == 0x05) { + has_dsp2 = true; + } + + if(mapperid == 0x30 && rom_type == 0x05 && company == 0xb2) { + has_dsp3 = true; + } + + if(mapperid == 0x30 && rom_type == 0x03) { + has_dsp4 = true; + } + + if(mapperid == 0x30 && rom_type == 0x25) { + has_obc1 = true; + } + + if(mapperid == 0x30 && rom_type == 0xf6 && rom_size >= 10) { + has_st010 = true; + } + + if(mapperid == 0x30 && rom_type == 0xf6 && rom_size < 10) { + has_st011 = true; + } + + if(mapperid == 0x30 && rom_type == 0xf5) { + has_st018 = true; + } +} + +unsigned Cartridge::find_header(const uint8_t *data, unsigned size) const { + unsigned score_lo = score_header(data, size, 0x007fc0); + unsigned score_hi = score_header(data, size, 0x00ffc0); + unsigned score_ex = score_header(data, size, 0x40ffc0); + if(score_ex) score_ex += 4; //favor ExHiROM on images > 32mbits + + if(score_lo >= score_hi && score_lo >= score_ex) { + return 0x007fc0; + } else if(score_hi >= score_ex) { + return 0x00ffc0; + } else { + return 0x40ffc0; + } +} + +unsigned Cartridge::score_header(const uint8_t *data, unsigned size, unsigned addr) const { + if(size < addr + 64) return 0; //image too small to contain header at this location? + int score = 0; + + uint16 resetvector = data[addr + ResetVector] | (data[addr + ResetVector + 1] << 8); + uint16 checksum = data[addr + Checksum ] | (data[addr + Checksum + 1] << 8); + uint16 complement = data[addr + Complement ] | (data[addr + Complement + 1] << 8); + + uint8 resetop = data[(addr & ~0x7fff) | (resetvector & 0x7fff)]; //first opcode executed upon reset + uint8 mapper = data[addr + Mapper] & ~0x10; //mask off irrelevent FastROM-capable bit + + //$00:[000-7fff] contains uninitialized RAM and MMIO. + //reset vector must point to ROM at $00:[8000-ffff] to be considered valid. + if(resetvector < 0x8000) return 0; + + //some images duplicate the header in multiple locations, and others have completely + //invalid header information that cannot be relied upon. + //below code will analyze the first opcode executed at the specified reset vector to + //determine the probability that this is the correct header. + + //most likely opcodes + if(resetop == 0x78 //sei + || resetop == 0x18 //clc (clc; xce) + || resetop == 0x38 //sec (sec; xce) + || resetop == 0x9c //stz $nnnn (stz $4200) + || resetop == 0x4c //jmp $nnnn + || resetop == 0x5c //jml $nnnnnn + ) score += 8; + + //plausible opcodes + if(resetop == 0xc2 //rep #$nn + || resetop == 0xe2 //sep #$nn + || resetop == 0xad //lda $nnnn + || resetop == 0xae //ldx $nnnn + || resetop == 0xac //ldy $nnnn + || resetop == 0xaf //lda $nnnnnn + || resetop == 0xa9 //lda #$nn + || resetop == 0xa2 //ldx #$nn + || resetop == 0xa0 //ldy #$nn + || resetop == 0x20 //jsr $nnnn + || resetop == 0x22 //jsl $nnnnnn + ) score += 4; + + //implausible opcodes + if(resetop == 0x40 //rti + || resetop == 0x60 //rts + || resetop == 0x6b //rtl + || resetop == 0xcd //cmp $nnnn + || resetop == 0xec //cpx $nnnn + || resetop == 0xcc //cpy $nnnn + ) score -= 4; + + //least likely opcodes + if(resetop == 0x00 //brk #$nn + || resetop == 0x02 //cop #$nn + || resetop == 0xdb //stp + || resetop == 0x42 //wdm + || resetop == 0xff //sbc $nnnnnn,x + ) score -= 8; + + //at times, both the header and reset vector's first opcode will match ... + //fallback and rely on info validity in these cases to determine more likely header. + + //a valid checksum is the biggest indicator of a valid header. + if((checksum + complement) == 0xffff && (checksum != 0) && (complement != 0)) score += 4; + + if(addr == 0x007fc0 && mapper == 0x20) score += 2; //0x20 is usually LoROM + if(addr == 0x00ffc0 && mapper == 0x21) score += 2; //0x21 is usually HiROM + if(addr == 0x007fc0 && mapper == 0x22) score += 2; //0x22 is usually ExLoROM + if(addr == 0x40ffc0 && mapper == 0x25) score += 2; //0x25 is usually ExHiROM + + if(data[addr + Company] == 0x33) score += 2; //0x33 indicates extended header + if(data[addr + RomType] < 0x08) score++; + if(data[addr + RomSize] < 0x10) score++; + if(data[addr + RamSize] < 0x08) score++; + if(data[addr + CartRegion] < 14) score++; + + if(score < 0) score = 0; + return score; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cartridge/serialization.cpp b/Mednafen/mednafen/snes/src/cartridge/serialization.cpp new file mode 100755 index 0000000000..847b235455 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cartridge/serialization.cpp @@ -0,0 +1,37 @@ +#ifdef CARTRIDGE_CPP + +void Cartridge::serialize(serializer &s) { + if(memory::cartram.size() != 0 && memory::cartram.size() != ~0) { + s.array(memory::cartram.data(), memory::cartram.size()); + } + + if(memory::cartrtc.size() != 0 && memory::cartrtc.size() != ~0) { + s.array(memory::cartrtc.data(), memory::cartrtc.size()); + } + + if(memory::bsxram.size() != 0 && memory::bsxram.size() != ~0) { + s.array(memory::bsxram.data(), memory::bsxram.size()); + } + + if(memory::bsxpram.size() != 0 && memory::bsxpram.size() != ~0) { + s.array(memory::bsxpram.data(), memory::bsxpram.size()); + } + + if(memory::stAram.size() != 0 && memory::stAram.size() != ~0) { + s.array(memory::stAram.data(), memory::stAram.size()); + } + + if(memory::stBram.size() != 0 && memory::stBram.size() != ~0) { + s.array(memory::stBram.data(), memory::stBram.size()); + } + + if(memory::gbram.size() != 0 && memory::gbram.size() != ~0) { + s.array(memory::gbram.data(), memory::gbram.size()); + } + + if(memory::gbrtc.size() != 0 && memory::gbrtc.size() != ~0) { + s.array(memory::gbrtc.data(), memory::gbrtc.size()); + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cheat/cheat-inline.hpp b/Mednafen/mednafen/snes/src/cheat/cheat-inline.hpp new file mode 100755 index 0000000000..c5666db5f3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cheat/cheat-inline.hpp @@ -0,0 +1,2 @@ +bool Cheat::active() const { return system_enabled; } +bool Cheat::exists(unsigned addr) const { return bitmask[addr >> 3] & 1 << (addr & 7); } diff --git a/Mednafen/mednafen/snes/src/cheat/cheat.cpp b/Mednafen/mednafen/snes/src/cheat/cheat.cpp new file mode 100755 index 0000000000..f82bde50c8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cheat/cheat.cpp @@ -0,0 +1,133 @@ +#include <../base.hpp> + +#define CHEAT_CPP +namespace bSNES_v059 { + +Cheat cheat; + +bool Cheat::enabled() const { + return system_enabled; +} + +void Cheat::enable(bool state) { + system_enabled = state; +} + +void Cheat::remove_read_patches(void) +{ + memset(bitmask, 0x00, sizeof(bitmask)); + resize(0); +} + +void Cheat::install_read_patch(const CheatCode& code) +{ + add(code); + + unsigned addr = code.addr; + bitmask[addr >> 3] |= 1 << (addr & 7); +} + + +void Cheat::read(unsigned addr, uint8 &data) const { + for(unsigned i = 0; i < size(); i++) { + const CheatCode &code = operator[](i); + + if(addr == code.addr && (code.compare < 0 || data == code.compare)) { + data = code.data; + break; + } + } +} + +Cheat::Cheat() { + system_enabled = false; + memset(bitmask, 0x00, sizeof(bitmask)); +} + +#if 0 +//=============== +//encode / decode +//=============== + +bool Cheat::decode(const char *s, unsigned &addr, uint8 &data, Type &type) { + string t = s; + strlower(t); + + #define ischr(n) ((n >= '0' && n <= '9') || (n >= 'a' && n <= 'f')) + + if(strlen(t) == 8 || (strlen(t) == 9 && t[6] == ':')) { + //strip ':' + if(strlen(t) == 9 && t[6] == ':') t = string() << substr(t, 0, 6) << substr(t, 7); + //validate input + for(unsigned i = 0; i < 8; i++) if(!ischr(t[i])) return false; + + type = ProActionReplay; + unsigned r = strhex((const char*)t); + addr = r >> 8; + data = r & 0xff; + return true; + } else if(strlen(t) == 9 && t[4] == '-') { + //strip '-' + t = string() << substr(t, 0, 4) << substr(t, 5); + //validate input + for(unsigned i = 0; i < 8; i++) if(!ischr(t[i])) return false; + + type = GameGenie; + strtr(t, "df4709156bc8a23e", "0123456789abcdef"); + unsigned r = strhex((const char*)t); + //8421 8421 8421 8421 8421 8421 + //abcd efgh ijkl mnop qrst uvwx + //ijkl qrst opab cduv wxef ghmn + addr = (!!(r & 0x002000) << 23) | (!!(r & 0x001000) << 22) + | (!!(r & 0x000800) << 21) | (!!(r & 0x000400) << 20) + | (!!(r & 0x000020) << 19) | (!!(r & 0x000010) << 18) + | (!!(r & 0x000008) << 17) | (!!(r & 0x000004) << 16) + | (!!(r & 0x800000) << 15) | (!!(r & 0x400000) << 14) + | (!!(r & 0x200000) << 13) | (!!(r & 0x100000) << 12) + | (!!(r & 0x000002) << 11) | (!!(r & 0x000001) << 10) + | (!!(r & 0x008000) << 9) | (!!(r & 0x004000) << 8) + | (!!(r & 0x080000) << 7) | (!!(r & 0x040000) << 6) + | (!!(r & 0x020000) << 5) | (!!(r & 0x010000) << 4) + | (!!(r & 0x000200) << 3) | (!!(r & 0x000100) << 2) + | (!!(r & 0x000080) << 1) | (!!(r & 0x000040) << 0); + data = r >> 24; + return true; + } else { + return false; + } + + #undef ischr +} + +bool Cheat::encode(string &s, unsigned addr, uint8 data, Type type) { + char t[16]; + + if(type == ProActionReplay) { + sprintf(t, "%.6x%.2x", addr, data); + s = t; + return true; + } else if(type == GameGenie) { + unsigned r = addr; + addr = (!!(r & 0x008000) << 23) | (!!(r & 0x004000) << 22) + | (!!(r & 0x002000) << 21) | (!!(r & 0x001000) << 20) + | (!!(r & 0x000080) << 19) | (!!(r & 0x000040) << 18) + | (!!(r & 0x000020) << 17) | (!!(r & 0x000010) << 16) + | (!!(r & 0x000200) << 15) | (!!(r & 0x000100) << 14) + | (!!(r & 0x800000) << 13) | (!!(r & 0x400000) << 12) + | (!!(r & 0x200000) << 11) | (!!(r & 0x100000) << 10) + | (!!(r & 0x000008) << 9) | (!!(r & 0x000004) << 8) + | (!!(r & 0x000002) << 7) | (!!(r & 0x000001) << 6) + | (!!(r & 0x080000) << 5) | (!!(r & 0x040000) << 4) + | (!!(r & 0x020000) << 3) | (!!(r & 0x010000) << 2) + | (!!(r & 0x000800) << 1) | (!!(r & 0x000400) << 0); + sprintf(t, "%.2x%.2x-%.4x", data, addr >> 16, addr & 0xffff); + strtr(t, "0123456789abcdef", "df4709156bc8a23e"); + s = t; + return true; + } else { + return false; + } +} +#endif + +} diff --git a/Mednafen/mednafen/snes/src/cheat/cheat.hpp b/Mednafen/mednafen/snes/src/cheat/cheat.hpp new file mode 100755 index 0000000000..2d4a08ace5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cheat/cheat.hpp @@ -0,0 +1,27 @@ +struct CheatCode { + unsigned addr; + uint8 data; + signed compare; +}; + +class Cheat : public vector { +public: + bool enabled() const; + void enable(bool); + void synchronize(); + void read(unsigned, uint8&) const; + + inline bool active() const; + inline bool exists(unsigned addr) const; + + Cheat(); + + void remove_read_patches(void); + void install_read_patch(const CheatCode& c); + +private: + uint8 bitmask[0x200000]; + bool system_enabled; +}; + +extern Cheat cheat; diff --git a/Mednafen/mednafen/snes/src/chip/bsx/bsx.cpp b/Mednafen/mednafen/snes/src/chip/bsx/bsx.cpp new file mode 100755 index 0000000000..4e4e11d7b1 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/bsx/bsx.cpp @@ -0,0 +1,10 @@ +#include <../base.hpp> + +#define BSX_CPP +namespace bSNES_v059 { + +#include "bsx_base.cpp" +#include "bsx_cart.cpp" +#include "bsx_flash.cpp" +}; + diff --git a/Mednafen/mednafen/snes/src/chip/bsx/bsx.hpp b/Mednafen/mednafen/snes/src/chip/bsx/bsx.hpp new file mode 100755 index 0000000000..4e06b64cda --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/bsx/bsx.hpp @@ -0,0 +1,71 @@ +class BSXBase : public MMIO { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 mmio_read(unsigned addr); + void mmio_write(unsigned addr, uint8 data); + +private: + struct { + uint8 r2188, r2189, r218a, r218b; + uint8 r218c, r218d, r218e, r218f; + uint8 r2190, r2191, r2192, r2193; + uint8 r2194, r2195, r2196, r2197; + uint8 r2198, r2199, r219a, r219b; + uint8 r219c, r219d, r219e, r219f; + + uint8 r2192_counter; + uint8 r2192_hour, r2192_minute, r2192_second; + } regs; +}; + +class BSXCart : public MMIO { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 mmio_read(unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + BSXCart(); + ~BSXCart(); + +private: + struct { + uint8 r[16]; + } regs; + + void update_memory_map(); +}; + +class BSXFlash : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + unsigned size() const; + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + +private: + struct { + unsigned command; + uint8 write_old; + uint8 write_new; + + bool flash_enable; + bool read_enable; + bool write_enable; + } regs; +}; + +extern BSXBase bsxbase; +extern BSXCart bsxcart; +extern BSXFlash bsxflash; diff --git a/Mednafen/mednafen/snes/src/chip/bsx/bsx_base.cpp b/Mednafen/mednafen/snes/src/chip/bsx/bsx_base.cpp new file mode 100755 index 0000000000..2272c17411 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/bsx/bsx_base.cpp @@ -0,0 +1,140 @@ +#ifdef BSX_CPP + +BSXBase bsxbase; + +void BSXBase::init() { +} + +void BSXBase::enable() { + for(uint16 i = 0x2188; i <= 0x219f; i++) memory::mmio.map(i, *this); +} + +void BSXBase::power() { + reset(); +} + +void BSXBase::reset() { + memset(®s, 0x00, sizeof regs); +} + +uint8 BSXBase::mmio_read(unsigned addr) { + addr &= 0xffff; + + switch(addr) { + case 0x2188: return regs.r2188; + case 0x2189: return regs.r2189; + case 0x218a: return regs.r218a; + case 0x218c: return regs.r218c; + case 0x218e: return regs.r218e; + case 0x218f: return regs.r218f; + case 0x2190: return regs.r2190; + + case 0x2192: { + unsigned counter = regs.r2192_counter++; + if(regs.r2192_counter >= 18) regs.r2192_counter = 0; + + if(counter == 0) { + time_t rawtime; + time(&rawtime); + tm *t = localtime(&rawtime); + + regs.r2192_hour = t->tm_hour; + regs.r2192_minute = t->tm_min; + regs.r2192_second = t->tm_sec; + } + + switch(counter) { + case 0: return 0x00; //??? + case 1: return 0x00; //??? + case 2: return 0x00; //??? + case 3: return 0x00; //??? + case 4: return 0x00; //??? + case 5: return 0x01; + case 6: return 0x01; + case 7: return 0x00; + case 8: return 0x00; + case 9: return 0x00; + case 10: return regs.r2192_second; + case 11: return regs.r2192_minute; + case 12: return regs.r2192_hour; + case 13: return 0x00; //??? + case 14: return 0x00; //??? + case 15: return 0x00; //??? + case 16: return 0x00; //??? + case 17: return 0x00; //??? + } + } break; + + case 0x2193: return regs.r2193 & ~0x0c; + case 0x2194: return regs.r2194; + case 0x2196: return regs.r2196; + case 0x2197: return regs.r2197; + case 0x2199: return regs.r2199; + } + + return cpu.regs.mdr; +} + +void BSXBase::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + switch(addr) { + case 0x2188: { + regs.r2188 = data; + } break; + + case 0x2189: { + regs.r2189 = data; + } break; + + case 0x218a: { + regs.r218a = data; + } break; + + case 0x218b: { + regs.r218b = data; + } break; + + case 0x218c: { + regs.r218c = data; + } break; + + case 0x218e: { + regs.r218e = data; + } break; + + case 0x218f: { + regs.r218e >>= 1; + regs.r218e = regs.r218f - regs.r218e; + regs.r218f >>= 1; + } break; + + case 0x2191: { + regs.r2191 = data; + regs.r2192_counter = 0; + } break; + + case 0x2192: { + regs.r2190 = 0x80; + } break; + + case 0x2193: { + regs.r2193 = data; + } break; + + case 0x2194: { + regs.r2194 = data; + } break; + + case 0x2197: { + regs.r2197 = data; + } break; + + case 0x2199: { + regs.r2199 = data; + } break; + } +} + +#endif + diff --git a/Mednafen/mednafen/snes/src/chip/bsx/bsx_cart.cpp b/Mednafen/mednafen/snes/src/chip/bsx/bsx_cart.cpp new file mode 100755 index 0000000000..92d6ead6ec --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/bsx/bsx_cart.cpp @@ -0,0 +1,97 @@ +#ifdef BSX_CPP + +BSXCart bsxcart; + +void BSXCart::init() { +} + +void BSXCart::enable() { + for(uint16 i = 0x5000; i <= 0x5fff; i++) memory::mmio.map(i, *this); +} + +void BSXCart::power() { + reset(); +} + +void BSXCart::reset() { + for(unsigned i = 0; i < 16; i++) regs.r[i] = 0x00; + regs.r[0x07] = 0x80; + regs.r[0x08] = 0x80; + + update_memory_map(); +} + +void BSXCart::update_memory_map() { + Memory &cart = (regs.r[0x01] & 0x80) == 0x00 ? (Memory&)bsxflash : (Memory&)memory::bsxpram; + + if((regs.r[0x02] & 0x80) == 0x00) { + //LoROM mapping + bus.map(Bus::MapLinear, 0x00, 0x7d, 0x8000, 0xffff, cart); + bus.map(Bus::MapLinear, 0x80, 0xff, 0x8000, 0xffff, cart); + } else { + //HiROM mapping + bus.map(Bus::MapShadow, 0x00, 0x3f, 0x8000, 0xffff, cart); + bus.map(Bus::MapLinear, 0x40, 0x7d, 0x0000, 0xffff, cart); + bus.map(Bus::MapShadow, 0x80, 0xbf, 0x8000, 0xffff, cart); + bus.map(Bus::MapLinear, 0xc0, 0xff, 0x0000, 0xffff, cart); + } + + if(regs.r[0x03] & 0x80) { + bus.map(Bus::MapLinear, 0x60, 0x6f, 0x0000, 0xffff, memory::bsxpram); + //bus.map(Bus::MapLinear, 0x70, 0x77, 0x0000, 0xffff, memory::bsxpram); + } + + if((regs.r[0x05] & 0x80) == 0x00) { + bus.map(Bus::MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::bsxpram); + } + + if((regs.r[0x06] & 0x80) == 0x00) { + bus.map(Bus::MapLinear, 0x50, 0x5f, 0x0000, 0xffff, memory::bsxpram); + } + + if(regs.r[0x07] & 0x80) { + bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom); + } + + if(regs.r[0x08] & 0x80) { + bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom); + } + + bus.map(Bus::MapShadow, 0x20, 0x3f, 0x6000, 0x7fff, memory::bsxpram); + bus.map(Bus::MapLinear, 0x70, 0x77, 0x0000, 0xffff, memory::bsxpram); +} + +uint8 BSXCart::mmio_read(unsigned addr) { + if((addr & 0xf0ffff) == 0x005000) { //$[00-0f]:5000 MMIO + uint8 n = (addr >> 16) & 15; + return regs.r[n]; + } + + if((addr & 0xf8f000) == 0x105000) { //$[10-17]:[5000-5fff] SRAM + return memory::bsxram.read(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff)); + } + + return 0x00; +} + +void BSXCart::mmio_write(unsigned addr, uint8 data) { + if((addr & 0xf0ffff) == 0x005000) { //$[00-0f]:5000 MMIO + uint8 n = (addr >> 16) & 15; + regs.r[n] = data; + if(n == 0x0e && data & 0x80) update_memory_map(); + return; + } + + if((addr & 0xf8f000) == 0x105000) { //$[10-17]:[5000-5fff] SRAM + return memory::bsxram.write(((addr >> 16) & 7) * 0x1000 + (addr & 0xfff), data); + } +} + +BSXCart::BSXCart() { +} + +BSXCart::~BSXCart() { +} + +#endif + diff --git a/Mednafen/mednafen/snes/src/chip/bsx/bsx_flash.cpp b/Mednafen/mednafen/snes/src/chip/bsx/bsx_flash.cpp new file mode 100755 index 0000000000..dfd7eadf8d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/bsx/bsx_flash.cpp @@ -0,0 +1,119 @@ +#ifdef BSX_CPP + +BSXFlash bsxflash; + +void BSXFlash::init() {} +void BSXFlash::enable() {} + +void BSXFlash::power() { + reset(); +} + +void BSXFlash::reset() { + regs.command = 0; + regs.write_old = 0x00; + regs.write_new = 0x00; + + regs.flash_enable = false; + regs.read_enable = false; + regs.write_enable = false; + memory::bsxflash.write_protect(!regs.write_enable); +} + +unsigned BSXFlash::size() const { + return memory::bsxflash.size(); +} + +uint8 BSXFlash::read(unsigned addr) { + if(addr == 0x0002) { + if(regs.flash_enable) return 0x80; + } + + if(addr == 0x5555) { + if(regs.flash_enable) return 0x80; + } + + if(regs.read_enable && addr >= 0xff00 && addr <= 0xff13) { + //read flash cartridge vendor information + switch(addr - 0xff00) { + case 0x00: return 0x4d; + case 0x01: return 0x00; + case 0x02: return 0x50; + case 0x03: return 0x00; + case 0x04: return 0x00; + case 0x05: return 0x00; + case 0x06: return 0x2a; //0x2a = 8mbit, 0x2b = 16mbit (not known to exist, though BIOS recognizes ID) + case 0x07: return 0x00; + default: return 0x00; + } + } + + return memory::bsxflash.read(addr); +} + +void BSXFlash::write(unsigned addr, uint8 data) { + //there exist both read-only and read-write BS-X flash cartridges ... + //unfortunately, the vendor info is not stored inside memory dumps + //of BS-X flashcarts, so it is impossible to determine whether a + //given flashcart is writeable. + //however, it has been observed that LoROM-mapped BS-X carts always + //use read-write flashcarts, and HiROM-mapped BS-X carts always use + //read-only flashcarts. + //below is an unfortunately necessary workaround to this problem. + if(cartridge.mapper() == Cartridge::BSCHiROM) return; + + if((addr & 0xff0000) == 0) { + regs.write_old = regs.write_new; + regs.write_new = data; + + if(regs.write_enable && regs.write_old == regs.write_new) { + return memory::bsxflash.write(addr, data); + } + } else { + if(regs.write_enable) { + return memory::bsxflash.write(addr, data); + } + } + + if(addr == 0x0000) { + regs.command <<= 8; + regs.command |= data; + + if((regs.command & 0xffff) == 0x38d0) { + regs.flash_enable = true; + regs.read_enable = true; + } + } + + if(addr == 0x2aaa) { + regs.command <<= 8; + regs.command |= data; + } + + if(addr == 0x5555) { + regs.command <<= 8; + regs.command |= data; + + if((regs.command & 0xffffff) == 0xaa5570) { + regs.write_enable = false; + } + + if((regs.command & 0xffffff) == 0xaa55a0) { + regs.write_old = 0x00; + regs.write_new = 0x00; + regs.flash_enable = true; + regs.write_enable = true; + } + + if((regs.command & 0xffffff) == 0xaa55f0) { + regs.flash_enable = false; + regs.read_enable = false; + regs.write_enable = false; + } + + memory::bsxflash.write_protect(!regs.write_enable); + } +} + +#endif + diff --git a/Mednafen/mednafen/snes/src/chip/chip.hpp b/Mednafen/mednafen/snes/src/chip/chip.hpp new file mode 100755 index 0000000000..d51e641e4d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/chip.hpp @@ -0,0 +1,13 @@ +#include "superfx/superfx.hpp" +#include "sa1/sa1.hpp" +#include "bsx/bsx.hpp" +#include "srtc/srtc.hpp" +#include "sdd1/sdd1.hpp" +#include "spc7110/spc7110.hpp" +#include "cx4/cx4.hpp" +#include "dsp1/dsp1.hpp" +#include "dsp2/dsp2.hpp" +#include "dsp3/dsp3.hpp" +#include "dsp4/dsp4.hpp" +#include "obc1/obc1.hpp" +#include "st010/st010.hpp" diff --git a/Mednafen/mednafen/snes/src/chip/cx4/cx4.cpp b/Mednafen/mednafen/snes/src/chip/cx4/cx4.cpp new file mode 100755 index 0000000000..3240b313ec --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/cx4.cpp @@ -0,0 +1,210 @@ +//============= +//Cx4 emulation +//============= +//Used in Rockman X2/X3 (Megaman X2/X3) +//Portions (c) anomie, Overload, zsKnight, Nach, byuu + +#include <../base.hpp> + +#define CX4_CPP +namespace bSNES_v059 { + +Cx4 cx4; + +#include "serialization.cpp" +#include "data.cpp" +#include "functions.cpp" +#include "oam.cpp" +#include "opcodes.cpp" + +void Cx4::init() { +} + +void Cx4::enable() { + bus.map(Bus::MapDirect, 0x00, 0x3f, 0x6000, 0x7fff, *this); + bus.map(Bus::MapDirect, 0x80, 0xbf, 0x6000, 0x7fff, *this); +} + +uint32 Cx4::ldr(uint8 r) { + uint16 addr = 0x0080 + (r * 3); + return (reg[addr + 0] << 0) + | (reg[addr + 1] << 8) + | (reg[addr + 2] << 16); +} + +void Cx4::str(uint8 r, uint32 data) { + uint16 addr = 0x0080 + (r * 3); + reg[addr + 0] = (data >> 0); + reg[addr + 1] = (data >> 8); + reg[addr + 2] = (data >> 16); +} + +void Cx4::mul(uint32 x, uint32 y, uint32 &rl, uint32 &rh) { + int64 rx = x & 0xffffff; + int64 ry = y & 0xffffff; + if(rx & 0x800000)rx |= ~0x7fffff; + if(ry & 0x800000)ry |= ~0x7fffff; + + rx *= ry; + + rl = (rx) & 0xffffff; + rh = (rx >> 24) & 0xffffff; +} + +uint32 Cx4::sin(uint32 rx) { + r0 = rx & 0x1ff; + if(r0 & 0x100)r0 ^= 0x1ff; + if(r0 & 0x080)r0 ^= 0x0ff; + if(rx & 0x100) { + return sin_table[r0 + 0x80]; + } else { + return sin_table[r0]; + } +} + +uint32 Cx4::cos(uint32 rx) { + return sin(rx + 0x080); +} + +void Cx4::immediate_reg(uint32 start) { + r0 = ldr(0); + for(uint32 i = start; i < 48; i++) { + if((r0 & 0x0fff) < 0x0c00) { + ram[r0 & 0x0fff] = immediate_data[i]; + } + r0++; + } + str(0, r0); +} + +void Cx4::transfer_data() { + uint32 src; + uint16 dest, count; + + src = (reg[0x40]) | (reg[0x41] << 8) | (reg[0x42] << 16); + count = (reg[0x43]) | (reg[0x44] << 8); + dest = (reg[0x45]) | (reg[0x46] << 8); + + for(uint32 i=0;i> 2; + return; + } + + switch(data) { + case 0x00: op00(); break; + case 0x01: op01(); break; + case 0x05: op05(); break; + case 0x0d: op0d(); break; + case 0x10: op10(); break; + case 0x13: op13(); break; + case 0x15: op15(); break; + case 0x1f: op1f(); break; + case 0x22: op22(); break; + case 0x25: op25(); break; + case 0x2d: op2d(); break; + case 0x40: op40(); break; + case 0x54: op54(); break; + case 0x5c: op5c(); break; + case 0x5e: op5e(); break; + case 0x60: op60(); break; + case 0x62: op62(); break; + case 0x64: op64(); break; + case 0x66: op66(); break; + case 0x68: op68(); break; + case 0x6a: op6a(); break; + case 0x6c: op6c(); break; + case 0x6e: op6e(); break; + case 0x70: op70(); break; + case 0x72: op72(); break; + case 0x74: op74(); break; + case 0x76: op76(); break; + case 0x78: op78(); break; + case 0x7a: op7a(); break; + case 0x7c: op7c(); break; + case 0x89: op89(); break; + } + } +} + +void Cx4::writeb(uint16 addr, uint8 data) { + write(addr, data); +} + +void Cx4::writew(uint16 addr, uint16 data) { + write(addr + 0, data >> 0); + write(addr + 1, data >> 8); +} + +void Cx4::writel(uint16 addr, uint32 data) { + write(addr + 0, data >> 0); + write(addr + 1, data >> 8); + write(addr + 2, data >> 16); +} + +uint8 Cx4::read(unsigned addr) { + addr &= 0x1fff; + + if(addr < 0x0c00) { + return ram[addr]; + } + + if(addr >= 0x1f00) { + return reg[addr & 0xff]; + } + + return cpu.regs.mdr; +} + +uint8 Cx4::readb(uint16 addr) { + return read(addr); +} + +uint16 Cx4::readw(uint16 addr) { + return read(addr) | (read(addr + 1) << 8); +} + +uint32 Cx4::readl(uint16 addr) { + return read(addr) | (read(addr + 1) << 8) + (read(addr + 2) << 16); +} + +void Cx4::power() { + reset(); +} + +void Cx4::reset() { + memset(ram, 0, 0x0c00); + memset(reg, 0, 0x0100); +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/cx4/cx4.hpp b/Mednafen/mednafen/snes/src/chip/cx4/cx4.hpp new file mode 100755 index 0000000000..f971f44d71 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/cx4.hpp @@ -0,0 +1,95 @@ +class Cx4 : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + void serialize(serializer&); + +private: + uint8 ram[0x0c00]; + uint8 reg[0x0100]; + uint32 r0, r1, r2, r3, r4, r5, r6, r7, + r8, r9, r10, r11, r12, r13, r14, r15; + + static const uint8 immediate_data[48]; + static const uint16 wave_data[40]; + static const uint32 sin_table[256]; + + static const int16 SinTable[512]; + static const int16 CosTable[512]; + + int16 C4WFXVal, C4WFYVal, C4WFZVal, C4WFX2Val, C4WFY2Val, C4WFDist, C4WFScale; + int16 C41FXVal, C41FYVal, C41FAngleRes, C41FDist, C41FDistVal; + + void C4TransfWireFrame(); + void C4TransfWireFrame2(); + void C4CalcWireFrame(); + void C4DrawLine(int32 X1, int32 Y1, int16 Z1, int32 X2, int32 Y2, int16 Z2, uint8 Color); + void C4DrawWireFrame(); + void C4DoScaleRotate(int row_padding); + +public: + uint32 ldr(uint8 r); + void str(uint8 r, uint32 data); + void mul(uint32 x, uint32 y, uint32 &rl, uint32 &rh); + uint32 sin(uint32 rx); + uint32 cos(uint32 rx); + + void transfer_data(); + void immediate_reg(uint32 num); + + void op00_00(); + void op00_03(); + void op00_05(); + void op00_07(); + void op00_08(); + void op00_0b(); + void op00_0c(); + + void op00(); + void op01(); + void op05(); + void op0d(); + void op10(); + void op13(); + void op15(); + void op1f(); + void op22(); + void op25(); + void op2d(); + void op40(); + void op54(); + void op5c(); + void op5e(); + void op60(); + void op62(); + void op64(); + void op66(); + void op68(); + void op6a(); + void op6c(); + void op6e(); + void op70(); + void op72(); + void op74(); + void op76(); + void op78(); + void op7a(); + void op7c(); + void op89(); + + uint8 readb(uint16 addr); + uint16 readw(uint16 addr); + uint32 readl(uint16 addr); + + void writeb(uint16 addr, uint8 data); + void writew(uint16 addr, uint16 data); + void writel(uint16 addr, uint32 data); +}; + +extern Cx4 cx4; diff --git a/Mednafen/mednafen/snes/src/chip/cx4/data.cpp b/Mednafen/mednafen/snes/src/chip/cx4/data.cpp new file mode 100755 index 0000000000..8538f6026d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/data.cpp @@ -0,0 +1,187 @@ +#ifdef CX4_CPP + +const uint8 Cx4::immediate_data[48] = { + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0xff, 0x7f, + 0x00, 0x80, 0x00, 0xff, 0x7f, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0xff, + 0x00, 0x00, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x01, 0x00, 0xff, 0xfe, 0x00 +}; + +const uint16 Cx4::wave_data[40] = { + 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, + 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020a, 0x020c, 0x020e, + 0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040a, 0x040c, 0x040e, + 0x0600, 0x0602, 0x0604, 0x0606, 0x0608, 0x060a, 0x060c, 0x060e, + 0x0800, 0x0802, 0x0804, 0x0806, 0x0808, 0x080a, 0x080c, 0x080e +}; + +const uint32 Cx4::sin_table[256] = { + 0x000000, 0x000324, 0x000648, 0x00096c, 0x000c8f, 0x000fb2, 0x0012d5, 0x0015f6, + 0x001917, 0x001c37, 0x001f56, 0x002273, 0x002590, 0x0028aa, 0x002bc4, 0x002edb, + 0x0031f1, 0x003505, 0x003817, 0x003b26, 0x003e33, 0x00413e, 0x004447, 0x00474d, + 0x004a50, 0x004d50, 0x00504d, 0x005347, 0x00563e, 0x005931, 0x005c22, 0x005f0e, + 0x0061f7, 0x0064dc, 0x0067bd, 0x006a9b, 0x006d74, 0x007049, 0x007319, 0x0075e5, + 0x0078ad, 0x007b70, 0x007e2e, 0x0080e7, 0x00839c, 0x00864b, 0x0088f5, 0x008b9a, + 0x008e39, 0x0090d3, 0x009368, 0x0095f6, 0x00987f, 0x009b02, 0x009d7f, 0x009ff6, + 0x00a267, 0x00a4d2, 0x00a736, 0x00a994, 0x00abeb, 0x00ae3b, 0x00b085, 0x00b2c8, + 0x00b504, 0x00b73a, 0x00b968, 0x00bb8f, 0x00bdae, 0x00bfc7, 0x00c1d8, 0x00c3e2, + 0x00c5e4, 0x00c7de, 0x00c9d1, 0x00cbbb, 0x00cd9f, 0x00cf7a, 0x00d14d, 0x00d318, + 0x00d4db, 0x00d695, 0x00d848, 0x00d9f2, 0x00db94, 0x00dd2d, 0x00debe, 0x00e046, + 0x00e1c5, 0x00e33c, 0x00e4aa, 0x00e60f, 0x00e76b, 0x00e8bf, 0x00ea09, 0x00eb4b, + 0x00ec83, 0x00edb2, 0x00eed8, 0x00eff5, 0x00f109, 0x00f213, 0x00f314, 0x00f40b, + 0x00f4fa, 0x00f5de, 0x00f6ba, 0x00f78b, 0x00f853, 0x00f912, 0x00f9c7, 0x00fa73, + 0x00fb14, 0x00fbac, 0x00fc3b, 0x00fcbf, 0x00fd3a, 0x00fdab, 0x00fe13, 0x00fe70, + 0x00fec4, 0x00ff0e, 0x00ff4e, 0x00ff84, 0x00ffb1, 0x00ffd3, 0x00ffec, 0x00fffb, + 0x000000, 0xfffcdb, 0xfff9b7, 0xfff693, 0xfff370, 0xfff04d, 0xffed2a, 0xffea09, + 0xffe6e8, 0xffe3c8, 0xffe0a9, 0xffdd8c, 0xffda6f, 0xffd755, 0xffd43b, 0xffd124, + 0xffce0e, 0xffcafa, 0xffc7e8, 0xffc4d9, 0xffc1cc, 0xffbec1, 0xffbbb8, 0xffb8b2, + 0xffb5af, 0xffb2af, 0xffafb2, 0xffacb8, 0xffa9c1, 0xffa6ce, 0xffa3dd, 0xffa0f1, + 0xff9e08, 0xff9b23, 0xff9842, 0xff9564, 0xff928b, 0xff8fb6, 0xff8ce6, 0xff8a1a, + 0xff8752, 0xff848f, 0xff81d1, 0xff7f18, 0xff7c63, 0xff79b4, 0xff770a, 0xff7465, + 0xff71c6, 0xff6f2c, 0xff6c97, 0xff6a09, 0xff6780, 0xff64fd, 0xff6280, 0xff6009, + 0xff5d98, 0xff5b2d, 0xff58c9, 0xff566b, 0xff5414, 0xff51c4, 0xff4f7a, 0xff4d37, + 0xff4afb, 0xff48c5, 0xff4697, 0xff4470, 0xff4251, 0xff4038, 0xff3e27, 0xff3c1e, + 0xff3a1b, 0xff3821, 0xff362e, 0xff3444, 0xff3260, 0xff3085, 0xff2eb2, 0xff2ce7, + 0xff2b24, 0xff296a, 0xff27b7, 0xff260d, 0xff246b, 0xff22d2, 0xff2141, 0xff1fb9, + 0xff1e3a, 0xff1cc3, 0xff1b55, 0xff19f0, 0xff1894, 0xff1740, 0xff15f6, 0xff14b4, + 0xff137c, 0xff124d, 0xff1127, 0xff100a, 0xff0ef6, 0xff0dec, 0xff0ceb, 0xff0bf4, + 0xff0b05, 0xff0a21, 0xff0945, 0xff0874, 0xff07ac, 0xff06ed, 0xff0638, 0xff058d, + 0xff04eb, 0xff0453, 0xff03c4, 0xff0340, 0xff02c5, 0xff0254, 0xff01ec, 0xff018f, + 0xff013b, 0xff00f1, 0xff00b1, 0xff007b, 0xff004e, 0xff002c, 0xff0013, 0xff0004 +}; + +const int16 Cx4::SinTable[512] = { + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, + 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, + 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, + 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, + 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, + 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, + 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, + 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, + 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, + 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, + 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, + 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, + 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, + 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, + 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765, + 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, + 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, + 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, + 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, + 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, + 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, + 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, + 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, + 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, + 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, + 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, + 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, + 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, + 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, + 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, + 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, + 0, -402, -804, -1206, -1607, -2009, -2410, -2811, + -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, + -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, + -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, + -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, + -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, + -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, + -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, + -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, + -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, + -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, + -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, + -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, + -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, + -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, + -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, + -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, + -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, + -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, + -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, + -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, + -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, + -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, + -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, + -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, + -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, + -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, + -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, + -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, + -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, + -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, + -3211, -2811, -2410, -2009, -1607, -1206, -804, -402 +}; + +const int16 Cx4::CosTable[512] = { + 32767, 32765, 32758, 32745, 32728, 32706, 32679, 32647, + 32610, 32568, 32521, 32469, 32413, 32351, 32285, 32214, + 32138, 32057, 31971, 31881, 31785, 31685, 31581, 31471, + 31357, 31237, 31114, 30985, 30852, 30714, 30572, 30425, + 30273, 30117, 29956, 29791, 29621, 29447, 29269, 29086, + 28898, 28707, 28511, 28310, 28106, 27897, 27684, 27466, + 27245, 27020, 26790, 26557, 26319, 26077, 25832, 25583, + 25330, 25073, 24812, 24547, 24279, 24007, 23732, 23453, + 23170, 22884, 22594, 22301, 22005, 21706, 21403, 21097, + 20787, 20475, 20159, 19841, 19519, 19195, 18868, 18537, + 18204, 17869, 17530, 17189, 16846, 16499, 16151, 15800, + 15446, 15090, 14732, 14372, 14010, 13645, 13278, 12910, + 12539, 12167, 11793, 11416, 11039, 10659, 10278, 9896, + 9512, 9126, 8739, 8351, 7961, 7571, 7179, 6786, + 6392, 5997, 5602, 5205, 4808, 4409, 4011, 3611, + 3211, 2811, 2410, 2009, 1607, 1206, 804, 402, + 0, -402, -804, -1206, -1607, -2009, -2410, -2811, + -3211, -3611, -4011, -4409, -4808, -5205, -5602, -5997, + -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126, + -9512, -9896, -10278, -10659, -11039, -11416, -11793, -12167, + -12539, -12910, -13278, -13645, -14010, -14372, -14732, -15090, + -15446, -15800, -16151, -16499, -16846, -17189, -17530, -17869, + -18204, -18537, -18868, -19195, -19519, -19841, -20159, -20475, + -20787, -21097, -21403, -21706, -22005, -22301, -22594, -22884, + -23170, -23453, -23732, -24007, -24279, -24547, -24812, -25073, + -25330, -25583, -25832, -26077, -26319, -26557, -26790, -27020, + -27245, -27466, -27684, -27897, -28106, -28310, -28511, -28707, + -28898, -29086, -29269, -29447, -29621, -29791, -29956, -30117, + -30273, -30425, -30572, -30714, -30852, -30985, -31114, -31237, + -31357, -31471, -31581, -31685, -31785, -31881, -31971, -32057, + -32138, -32214, -32285, -32351, -32413, -32469, -32521, -32568, + -32610, -32647, -32679, -32706, -32728, -32745, -32758, -32765, + -32767, -32765, -32758, -32745, -32728, -32706, -32679, -32647, + -32610, -32568, -32521, -32469, -32413, -32351, -32285, -32214, + -32138, -32057, -31971, -31881, -31785, -31685, -31581, -31471, + -31357, -31237, -31114, -30985, -30852, -30714, -30572, -30425, + -30273, -30117, -29956, -29791, -29621, -29447, -29269, -29086, + -28898, -28707, -28511, -28310, -28106, -27897, -27684, -27466, + -27245, -27020, -26790, -26557, -26319, -26077, -25832, -25583, + -25330, -25073, -24812, -24547, -24279, -24007, -23732, -23453, + -23170, -22884, -22594, -22301, -22005, -21706, -21403, -21097, + -20787, -20475, -20159, -19841, -19519, -19195, -18868, -18537, + -18204, -17869, -17530, -17189, -16846, -16499, -16151, -15800, + -15446, -15090, -14732, -14372, -14010, -13645, -13278, -12910, + -12539, -12167, -11793, -11416, -11039, -10659, -10278, -9896, + -9512, -9126, -8739, -8351, -7961, -7571, -7179, -6786, + -6392, -5997, -5602, -5205, -4808, -4409, -4011, -3611, + -3211, -2811, -2410, -2009, -1607, -1206, -804, -402, + 0, 402, 804, 1206, 1607, 2009, 2410, 2811, + 3211, 3611, 4011, 4409, 4808, 5205, 5602, 5997, + 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126, + 9512, 9896, 10278, 10659, 11039, 11416, 11793, 12167, + 12539, 12910, 13278, 13645, 14010, 14372, 14732, 15090, + 15446, 15800, 16151, 16499, 16846, 17189, 17530, 17869, + 18204, 18537, 18868, 19195, 19519, 19841, 20159, 20475, + 20787, 21097, 21403, 21706, 22005, 22301, 22594, 22884, + 23170, 23453, 23732, 24007, 24279, 24547, 24812, 25073, + 25330, 25583, 25832, 26077, 26319, 26557, 26790, 27020, + 27245, 27466, 27684, 27897, 28106, 28310, 28511, 28707, + 28898, 29086, 29269, 29447, 29621, 29791, 29956, 30117, + 30273, 30425, 30572, 30714, 30852, 30985, 31114, 31237, + 31357, 31471, 31581, 31685, 31785, 31881, 31971, 32057, + 32138, 32214, 32285, 32351, 32413, 32469, 32521, 32568, + 32610, 32647, 32679, 32706, 32728, 32745, 32758, 32765 +}; + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/cx4/functions.cpp b/Mednafen/mednafen/snes/src/chip/cx4/functions.cpp new file mode 100755 index 0000000000..7466ffb81e --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/functions.cpp @@ -0,0 +1,251 @@ +#ifdef CX4_CPP + +#include +#define Tan(a) (CosTable[a] ? ((((int32)SinTable[a]) << 16) / CosTable[a]) : 0x80000000) +#define sar(b, n) ((b) >> (n)) +#ifdef PI +#undef PI +#endif +#define PI 3.1415926535897932384626433832795 + +//Wireframe Helpers +void Cx4::C4TransfWireFrame() { + double c4x = (double)C4WFXVal; + double c4y = (double)C4WFYVal; + double c4z = (double)C4WFZVal - 0x95; + double tanval, c4x2, c4y2, c4z2; + + //Rotate X + tanval = -(double)C4WFX2Val * PI * 2 / 128; + c4y2 = c4y * ::cos(tanval) - c4z * ::sin(tanval); + c4z2 = c4y * ::sin(tanval) + c4z * ::cos(tanval); + + //Rotate Y + tanval = -(double)C4WFY2Val * PI * 2 / 128; + c4x2 = c4x * ::cos(tanval) + c4z2 * ::sin(tanval); + c4z = c4x * -::sin(tanval) + c4z2 * ::cos(tanval); + + //Rotate Z + tanval = -(double)C4WFDist * PI * 2 / 128; + c4x = c4x2 * ::cos(tanval) - c4y2 * ::sin(tanval); + c4y = c4x2 * ::sin(tanval) + c4y2 * ::cos(tanval); + + //Scale + C4WFXVal = (int16)(c4x * C4WFScale / (0x90 * (c4z + 0x95)) * 0x95); + C4WFYVal = (int16)(c4y * C4WFScale / (0x90 * (c4z + 0x95)) * 0x95); +} + +void Cx4::C4CalcWireFrame() { + C4WFXVal = C4WFX2Val - C4WFXVal; + C4WFYVal = C4WFY2Val - C4WFYVal; + + if(abs(C4WFXVal) > abs(C4WFYVal)) { + C4WFDist = abs(C4WFXVal) + 1; + C4WFYVal = (256 * (long)C4WFYVal) / abs(C4WFXVal); + C4WFXVal = (C4WFXVal < 0) ? -256 : 256; + } else if(C4WFYVal != 0) { + C4WFDist = abs(C4WFYVal) + 1; + C4WFXVal = (256 * (long)C4WFXVal) / abs(C4WFYVal); + C4WFYVal = (C4WFYVal < 0) ? -256 : 256; + } else { + C4WFDist = 0; + } +} + +void Cx4::C4TransfWireFrame2() { + double c4x = (double)C4WFXVal; + double c4y = (double)C4WFYVal; + double c4z = (double)C4WFZVal; + double tanval, c4x2, c4y2, c4z2; + + //Rotate X + tanval = -(double)C4WFX2Val * PI * 2 / 128; + c4y2 = c4y * ::cos(tanval) - c4z * ::sin(tanval); + c4z2 = c4y * ::sin(tanval) + c4z * ::cos(tanval); + + //Rotate Y + tanval = -(double)C4WFY2Val * PI * 2 / 128; + c4x2 = c4x * ::cos(tanval) + c4z2 * ::sin(tanval); + c4z = c4x * -::sin(tanval) + c4z2 * ::cos(tanval); + + //Rotate Z + tanval = -(double)C4WFDist * PI * 2 / 128; + c4x = c4x2 * ::cos(tanval) - c4y2 * ::sin(tanval); + c4y = c4x2 * ::sin(tanval) + c4y2 * ::cos(tanval); + + //Scale + C4WFXVal = (int16)(c4x * C4WFScale / 0x100); + C4WFYVal = (int16)(c4y * C4WFScale / 0x100); +} + +void Cx4::C4DrawWireFrame() { + uint32 line = readl(0x1f80); + uint32 point1, point2; + int16 X1, Y1, Z1; + int16 X2, Y2, Z2; + uint8 Color; + + for(int32 i = ram[0x0295]; i > 0; i--, line += 5) { + if(bus.read(line) == 0xff && bus.read(line + 1) == 0xff) { + int32 tmp = line - 5; + while(bus.read(tmp + 2) == 0xff && bus.read(tmp + 3) == 0xff && (tmp + 2) >= 0) { tmp -= 5; } + point1 = (read(0x1f82) << 16) | (bus.read(tmp + 2) << 8) | bus.read(tmp + 3); + } else { + point1 = (read(0x1f82) << 16) | (bus.read(line) << 8) | bus.read(line + 1); + } + point2 = (read(0x1f82) << 16) | (bus.read(line + 2) << 8) | bus.read(line + 3); + + X1=(bus.read(point1 + 0) << 8) | bus.read(point1 + 1); + Y1=(bus.read(point1 + 2) << 8) | bus.read(point1 + 3); + Z1=(bus.read(point1 + 4) << 8) | bus.read(point1 + 5); + X2=(bus.read(point2 + 0) << 8) | bus.read(point2 + 1); + Y2=(bus.read(point2 + 2) << 8) | bus.read(point2 + 3); + Z2=(bus.read(point2 + 4) << 8) | bus.read(point2 + 5); + Color = bus.read(line + 4); + C4DrawLine(X1, Y1, Z1, X2, Y2, Z2, Color); + } +} + +void Cx4::C4DrawLine(int32 X1, int32 Y1, int16 Z1, int32 X2, int32 Y2, int16 Z2, uint8 Color) { + //Transform coordinates + C4WFXVal = (int16)X1; + C4WFYVal = (int16)Y1; + C4WFZVal = Z1; + C4WFScale = read(0x1f90); + C4WFX2Val = read(0x1f86); + C4WFY2Val = read(0x1f87); + C4WFDist = read(0x1f88); + C4TransfWireFrame2(); + X1 = (C4WFXVal + 48) << 8; + Y1 = (C4WFYVal + 48) << 8; + + C4WFXVal = (int16)X2; + C4WFYVal = (int16)Y2; + C4WFZVal = Z2; + C4TransfWireFrame2(); + X2 = (C4WFXVal + 48) << 8; + Y2 = (C4WFYVal + 48) << 8; + + //Get line info + C4WFXVal = (int16)(X1 >> 8); + C4WFYVal = (int16)(Y1 >> 8); + C4WFX2Val = (int16)(X2 >> 8); + C4WFY2Val = (int16)(Y2 >> 8); + C4CalcWireFrame(); + X2 = (int16)C4WFXVal; + Y2 = (int16)C4WFYVal; + + //Render line + for(int32 i = C4WFDist ? C4WFDist : 1; i > 0; i--) { + if(X1 > 0xff && Y1 > 0xff && X1 < 0x6000 && Y1 < 0x6000) { + uint16 addr = (((Y1 >> 8) >> 3) << 8) - (((Y1 >> 8) >> 3) << 6) + (((X1 >> 8) >> 3) << 4) + ((Y1 >> 8) & 7) * 2; + uint8 bit = 0x80 >> ((X1 >> 8) & 7); + ram[addr + 0x300] &= ~bit; + ram[addr + 0x301] &= ~bit; + if(Color & 1) ram[addr + 0x300] |= bit; + if(Color & 2) ram[addr + 0x301] |= bit; + } + X1 += X2; + Y1 += Y2; + } +} + +void Cx4::C4DoScaleRotate(int row_padding) { + int16 A, B, C, D; + + //Calculate matrix + int32 XScale = readw(0x1f8f); + int32 YScale = readw(0x1f92); + + if(XScale & 0x8000)XScale = 0x7fff; + if(YScale & 0x8000)YScale = 0x7fff; + + if(readw(0x1f80) == 0) { //no rotation + A = (int16)XScale; + B = 0; + C = 0; + D = (int16)YScale; + } else if(readw(0x1f80) == 128) { //90 degree rotation + A = 0; + B = (int16)(-YScale); + C = (int16)XScale; + D = 0; + } else if(readw(0x1f80) == 256) { //180 degree rotation + A = (int16)(-XScale); + B = 0; + C = 0; + D = (int16)(-YScale); + } else if(readw(0x1f80) == 384) { //270 degree rotation + A = 0; + B = (int16)YScale; + C = (int16)(-XScale); + D = 0; + } else { + A = (int16) sar(CosTable[readw(0x1f80) & 0x1ff] * XScale, 15); + B = (int16)(-sar(SinTable[readw(0x1f80) & 0x1ff] * YScale, 15)); + C = (int16) sar(SinTable[readw(0x1f80) & 0x1ff] * XScale, 15); + D = (int16) sar(CosTable[readw(0x1f80) & 0x1ff] * YScale, 15); + } + + //Calculate Pixel Resolution + uint8 w = read(0x1f89) & ~7; + uint8 h = read(0x1f8c) & ~7; + + //Clear the output RAM + memset(ram, 0, (w + row_padding / 4) * h / 2); + + int32 Cx = (int16)readw(0x1f83); + int32 Cy = (int16)readw(0x1f86); + + //Calculate start position (i.e. (Ox, Oy) = (0, 0)) + //The low 12 bits are fractional, so (Cx<<12) gives us the Cx we want in + //the function. We do Cx*A etc normally because the matrix parameters + //already have the fractional parts. + int32 LineX = (Cx << 12) - Cx * A - Cx * B; + int32 LineY = (Cy << 12) - Cy * C - Cy * D; + + //Start loop + uint32 X, Y; + uint8 byte; + int32 outidx = 0; + uint8 bit = 0x80; + + for(int32 y = 0; y < h; y++) { + X = LineX; + Y = LineY; + for(int32 x = 0; x < w; x++) { + if((X >> 12) >= w || (Y >> 12) >= h) { + byte = 0; + } else { + uint32 addr = (Y >> 12) * w + (X >> 12); + byte = read(0x600 + (addr >> 1)); + if(addr & 1) { byte >>= 4; } + } + + //De-bitplanify + if(byte & 1) ram[outidx ] |= bit; + if(byte & 2) ram[outidx + 1] |= bit; + if(byte & 4) ram[outidx + 16] |= bit; + if(byte & 8) ram[outidx + 17] |= bit; + + bit >>= 1; + if(!bit) { + bit = 0x80; + outidx += 32; + } + + X += A; //Add 1 to output x => add an A and a C + Y += C; + } + outidx += 2 + row_padding; + if(outidx & 0x10) { + outidx &= ~0x10; + } else { + outidx -= w * 4 + row_padding; + } + LineX += B; //Add 1 to output y => add a B and a D + LineY += D; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/cx4/oam.cpp b/Mednafen/mednafen/snes/src/chip/cx4/oam.cpp new file mode 100755 index 0000000000..dcda69e455 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/oam.cpp @@ -0,0 +1,228 @@ +#ifdef CX4_CPP + +//Build OAM +void Cx4::op00_00() { + uint32 oamptr = ram[0x626] << 2; + for(int32 i = 0x1fd; i > oamptr && i >= 0; i -= 4) { + //clear oam-to-be + if(i >= 0) ram[i] = 0xe0; + } + + uint16 globalx, globaly; + uint32 oamptr2; + int16 sprx, spry; + uint8 sprname, sprattr; + uint8 sprcount; + + globalx = readw(0x621); + globaly = readw(0x623); + oamptr2 = 0x200 + (ram[0x626] >> 2); + + if(!ram[0x620]) return; + + sprcount = 128 - ram[0x626]; + uint8 offset = (ram[0x626] & 3) * 2; + uint32 srcptr = 0x220; + + for(int i = ram[0x620]; i > 0 && sprcount > 0; i--, srcptr += 16) { + sprx = readw(srcptr) - globalx; + spry = readw(srcptr + 2) - globaly; + sprname = ram[srcptr + 5]; + sprattr = ram[srcptr + 4] | ram[srcptr + 6]; + + uint32 spraddr = readl(srcptr + 7); + if(bus.read(spraddr)) { + int16 x, y; + for(int sprcnt = bus.read(spraddr++); sprcnt > 0 && sprcount > 0; sprcnt--, spraddr += 4) { + x = (int8)bus.read(spraddr + 1); + if(sprattr & 0x40) { + x = -x - ((bus.read(spraddr) & 0x20) ? 16 : 8); + } + x += sprx; + if(x >= -16 && x <= 272) { + y = (int8)bus.read(spraddr + 2); + if(sprattr & 0x80) { + y = -y - ((bus.read(spraddr) & 0x20) ? 16 : 8); + } + y += spry; + if(y >= -16 && y <= 224) { + ram[oamptr ] = (uint8)x; + ram[oamptr + 1] = (uint8)y; + ram[oamptr + 2] = sprname + bus.read(spraddr + 3); + ram[oamptr + 3] = sprattr ^ (bus.read(spraddr) & 0xc0); + ram[oamptr2] &= ~(3 << offset); + if(x & 0x100) ram[oamptr2] |= 1 << offset; + if(bus.read(spraddr) & 0x20) ram[oamptr2] |= 2 << offset; + oamptr += 4; + sprcount--; + offset = (offset + 2) & 6; + if(!offset)oamptr2++; + } + } + } + } else if(sprcount > 0) { + ram[oamptr ] = (uint8)sprx; + ram[oamptr + 1] = (uint8)spry; + ram[oamptr + 2] = sprname; + ram[oamptr + 3] = sprattr; + ram[oamptr2] &= ~(3 << offset); + if(sprx & 0x100) ram[oamptr2] |= 3 << offset; + else ram[oamptr2] |= 2 << offset; + oamptr += 4; + sprcount--; + offset = (offset + 2) & 6; + if(!offset) oamptr2++; + } + } +} + +//Scale and Rotate +void Cx4::op00_03() { + C4DoScaleRotate(0); +} + +//Transform Lines +void Cx4::op00_05() { + C4WFX2Val = read(0x1f83); + C4WFY2Val = read(0x1f86); + C4WFDist = read(0x1f89); + C4WFScale = read(0x1f8c); + +//Transform Vertices +uint32 ptr = 0; + for(int32 i = readw(0x1f80); i > 0; i--, ptr += 0x10) { + C4WFXVal = readw(ptr + 1); + C4WFYVal = readw(ptr + 5); + C4WFZVal = readw(ptr + 9); + C4TransfWireFrame(); + + //Displace + writew(ptr + 1, C4WFXVal + 0x80); + writew(ptr + 5, C4WFYVal + 0x50); + } + + writew(0x600, 23); + writew(0x602, 0x60); + writew(0x605, 0x40); + writew(0x600 + 8, 23); + writew(0x602 + 8, 0x60); + writew(0x605 + 8, 0x40); + + ptr = 0xb02; + uint32 ptr2 = 0; + + for(int32 i = readw(0xb00); i > 0; i--, ptr += 2, ptr2 += 8) { + C4WFXVal = readw((read(ptr + 0) << 4) + 1); + C4WFYVal = readw((read(ptr + 0) << 4) + 5); + C4WFX2Val = readw((read(ptr + 1) << 4) + 1); + C4WFY2Val = readw((read(ptr + 1) << 4) + 5); + C4CalcWireFrame(); + writew(ptr2 + 0x600, C4WFDist ? C4WFDist : 1); + writew(ptr2 + 0x602, C4WFXVal); + writew(ptr2 + 0x605, C4WFYVal); + } +} + +//Scale and Rotate +void Cx4::op00_07() { + C4DoScaleRotate(64); +} + +//Draw Wireframe +void Cx4::op00_08() { + C4DrawWireFrame(); +} + +//Disintegrate +void Cx4::op00_0b() { + uint8 width, height; + uint32 startx, starty; + uint32 srcptr; + uint32 x, y; + int32 scalex, scaley; + int32 cx, cy; + int32 i, j; + + width = read(0x1f89); + height = read(0x1f8c); + cx = readw(0x1f80); + cy = readw(0x1f83); + + scalex = (int16)readw(0x1f86); + scaley = (int16)readw(0x1f8f); + startx = -cx * scalex + (cx << 8); + starty = -cy * scaley + (cy << 8); + srcptr = 0x600; + + for(i = 0; i < (width * height) >> 1; i++) { + write(i, 0); + } + + for(y = starty, i = 0;i < height; i++, y += scaley) { + for(x = startx, j = 0;j < width; j++, x += scalex) { + if((x >> 8) < width && (y >> 8) < height && (y >> 8) * width + (x >> 8) < 0x2000) { + uint8 pixel = (j & 1) ? (ram[srcptr] >> 4) : (ram[srcptr]); + int32 index = (y >> 11) * width * 4 + (x >> 11) * 32 + ((y >> 8) & 7) * 2; + uint8 mask = 0x80 >> ((x >> 8) & 7); + + if(pixel & 1) ram[index ] |= mask; + if(pixel & 2) ram[index + 1] |= mask; + if(pixel & 4) ram[index + 16] |= mask; + if(pixel & 8) ram[index + 17] |= mask; + } + if(j & 1) srcptr++; + } + } +} + +//Bitplane Wave +void Cx4::op00_0c() { + uint32 destptr = 0; + uint32 waveptr = read(0x1f83); + uint16 mask1 = 0xc0c0; + uint16 mask2 = 0x3f3f; + + for(int j = 0; j < 0x10; j++) { + do { + int16 height = -((int8)read(waveptr + 0xb00)) - 16; + for(int i = 0; i < 40; i++) { + uint16 temp = readw(destptr + wave_data[i]) & mask2; + if(height >= 0) { + if(height < 8) { + temp |= mask1 & readw(0xa00 + height * 2); + } else { + temp |= mask1 & 0xff00; + } + } + writew(destptr + wave_data[i], temp); + height++; + } + waveptr = (waveptr + 1) & 0x7f; + mask1 = (mask1 >> 2) | (mask1 << 6); + mask2 = (mask2 >> 2) | (mask2 << 6); + } while(mask1 != 0xc0c0); + destptr += 16; + + do { + int16 height = -((int8)read(waveptr + 0xb00)) - 16; + for(int i = 0; i < 40; i++) { + uint16 temp = readw(destptr + wave_data[i]) & mask2; + if(height >= 0) { + if(height < 8) { + temp |= mask1 & readw(0xa10 + height * 2); + } else { + temp |= mask1 & 0xff00; + } + } + writew(destptr + wave_data[i], temp); + height++; + } + waveptr = (waveptr + 1) & 0x7f; + mask1 = (mask1 >> 2) | (mask1 << 6); + mask2 = (mask2 >> 2) | (mask2 << 6); + } while(mask1 != 0xc0c0); + destptr += 16; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/cx4/opcodes.cpp b/Mednafen/mednafen/snes/src/chip/cx4/opcodes.cpp new file mode 100755 index 0000000000..745f2084b8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/opcodes.cpp @@ -0,0 +1,229 @@ +#ifdef CX4_CPP + +//Sprite Functions +void Cx4::op00() { + switch(reg[0x4d]) { + case 0x00: op00_00(); break; + case 0x03: op00_03(); break; + case 0x05: op00_05(); break; + case 0x07: op00_07(); break; + case 0x08: op00_08(); break; + case 0x0b: op00_0b(); break; + case 0x0c: op00_0c(); break; + } +} + +//Draw Wireframe +void Cx4::op01() { + memset(ram + 0x300, 0, 2304); + C4DrawWireFrame(); +} + +//Propulsion +void Cx4::op05() { + int32 temp = 0x10000; + if(readw(0x1f83)) { + temp = sar((temp / readw(0x1f83)) * readw(0x1f81), 8); + } + writew(0x1f80, temp); +} + +//Set Vector length +void Cx4::op0d() { + C41FXVal = readw(0x1f80); + C41FYVal = readw(0x1f83); + C41FDistVal = readw(0x1f86); + double tanval = sqrt(((double)C41FYVal) * ((double)C41FYVal) + ((double)C41FXVal) * ((double)C41FXVal)); + tanval = (double)C41FDistVal / tanval; + C41FYVal = (int16)(((double)C41FYVal * tanval) * 0.99); + C41FXVal = (int16)(((double)C41FXVal * tanval) * 0.98); + writew(0x1f89, C41FXVal); + writew(0x1f8c, C41FYVal); +} + +//Triangle +void Cx4::op10() { + r0 = ldr(0); + r1 = ldr(1); + + r4 = r0 & 0x1ff; + + if(r1 & 0x8000)r1 |= ~0x7fff; + else r1 &= 0x7fff; + + mul(cos(r4), r1, r5, r2); + r5 = (r5 >> 16) & 0xff; + r2 = (r2 << 8) + r5; + + mul(sin(r4), r1, r5, r3); + r5 = (r5 >> 16) & 0xff; + r3 = (r3 << 8) + r5; + + str(0, r0); + str(1, r1); + str(2, r2); + str(3, r3); + str(4, r4); + str(5, r5); +} + +//Triangle +void Cx4::op13() { + r0 = ldr(0); + r1 = ldr(1); + + r4 = r0 & 0x1ff; + + mul(cos(r4), r1, r5, r2); + r5 = (r5 >> 8) & 0xffff; + r2 = (r2 << 16) + r5; + + mul(sin(r4), r1, r5, r3); + r5 = (r5 >> 8) & 0xffff; + r3 = (r3 << 16) + r5; + + str(0, r0); + str(1, r1); + str(2, r2); + str(3, r3); + str(4, r4); + str(5, r5); +} + +//Pythagorean +void Cx4::op15() { + C41FXVal = readw(0x1f80); + C41FYVal = readw(0x1f83); + C41FDist = (int16)sqrt((double)C41FXVal * (double)C41FXVal + (double)C41FYVal * (double)C41FYVal); + writew(0x1f80, C41FDist); +} + +//Calculate distance +void Cx4::op1f() { + C41FXVal = readw(0x1f80); + C41FYVal = readw(0x1f83); + if(!C41FXVal) { + C41FAngleRes = (C41FYVal > 0) ? 0x080 : 0x180; + } else { + double tanval = ((double)C41FYVal) / ((double)C41FXVal); + C41FAngleRes = (short)(atan(tanval) / (PI * 2) * 512); + C41FAngleRes = C41FAngleRes; + if(C41FXVal < 0) { + C41FAngleRes += 0x100; + } + C41FAngleRes &= 0x1ff; + } + writew(0x1f86, C41FAngleRes); +} + +//Trapezoid +void Cx4::op22() { + int16 angle1 = readw(0x1f8c) & 0x1ff; + int16 angle2 = readw(0x1f8f) & 0x1ff; + int32 tan1 = Tan(angle1); + int32 tan2 = Tan(angle2); + int16 y = readw(0x1f83) - readw(0x1f89); + int16 left, right; + + for(int32 j = 0; j < 225; j++, y++) { + if(y >= 0) { + left = sar((int32)tan1 * y, 16) - readw(0x1f80) + readw(0x1f86); + right = sar((int32)tan2 * y, 16) - readw(0x1f80) + readw(0x1f86) + readw(0x1f93); + + if(left < 0 && right < 0) { + left = 1; + right = 0; + } else if(left < 0) { + left = 0; + } else if(right < 0) { + right = 0; + } + + if(left > 255 && right > 255) { + left = 255; + right = 254; + } else if(left > 255) { + left = 255; + } else if(right > 255) { + right = 255; + } + } else { + left = 1; + right = 0; + } + ram[j + 0x800] = (uint8)left; + ram[j + 0x900] = (uint8)right; + } +} + +//Multiply +void Cx4::op25() { + r0 = ldr(0); + r1 = ldr(1); + mul(r0, r1, r0, r1); + str(0, r0); + str(1, r1); +} + +//Transform Coords +void Cx4::op2d() { + C4WFXVal = readw(0x1f81); + C4WFYVal = readw(0x1f84); + C4WFZVal = readw(0x1f87); + C4WFX2Val = read (0x1f89); + C4WFY2Val = read (0x1f8a); + C4WFDist = read (0x1f8b); + C4WFScale = readw(0x1f90); + C4TransfWireFrame2(); + writew(0x1f80, C4WFXVal); + writew(0x1f83, C4WFYVal); +} + +//Sum +void Cx4::op40() { + r0 = 0; + for(uint32 i=0;i<0x800;i++) { + r0 += ram[i]; + } + str(0, r0); +} + +//Square +void Cx4::op54() { + r0 = ldr(0); + mul(r0, r0, r1, r2); + str(1, r1); + str(2, r2); +} + +//Immediate Register +void Cx4::op5c() { + str(0, 0x000000); + immediate_reg(0); +} + +//Immediate Register (Multiple) +void Cx4::op5e() { immediate_reg( 0); } +void Cx4::op60() { immediate_reg( 3); } +void Cx4::op62() { immediate_reg( 6); } +void Cx4::op64() { immediate_reg( 9); } +void Cx4::op66() { immediate_reg(12); } +void Cx4::op68() { immediate_reg(15); } +void Cx4::op6a() { immediate_reg(18); } +void Cx4::op6c() { immediate_reg(21); } +void Cx4::op6e() { immediate_reg(24); } +void Cx4::op70() { immediate_reg(27); } +void Cx4::op72() { immediate_reg(30); } +void Cx4::op74() { immediate_reg(33); } +void Cx4::op76() { immediate_reg(36); } +void Cx4::op78() { immediate_reg(39); } +void Cx4::op7a() { immediate_reg(42); } +void Cx4::op7c() { immediate_reg(45); } + +//Immediate ROM +void Cx4::op89() { + str(0, 0x054336); + str(1, 0xffffff); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/cx4/serialization.cpp b/Mednafen/mednafen/snes/src/chip/cx4/serialization.cpp new file mode 100755 index 0000000000..1b36a4eb38 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/cx4/serialization.cpp @@ -0,0 +1,39 @@ +#ifdef CX4_CPP + +void Cx4::serialize(serializer &s) { + s.array(ram); + s.array(reg); + + s.integer(r0); + s.integer(r1); + s.integer(r2); + s.integer(r3); + s.integer(r4); + s.integer(r5); + s.integer(r6); + s.integer(r7); + s.integer(r8); + s.integer(r9); + s.integer(r10); + s.integer(r11); + s.integer(r12); + s.integer(r13); + s.integer(r14); + s.integer(r15); + + s.integer(C4WFXVal); + s.integer(C4WFYVal); + s.integer(C4WFZVal); + s.integer(C4WFX2Val); + s.integer(C4WFY2Val); + s.integer(C4WFDist); + s.integer(C4WFScale); + + s.integer(C41FXVal); + s.integer(C41FYVal); + s.integer(C41FAngleRes); + s.integer(C41FDist); + s.integer(C41FDistVal); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp1/dsp1.cpp b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1.cpp new file mode 100755 index 0000000000..9d16d53b6b --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1.cpp @@ -0,0 +1,83 @@ +#include <../base.hpp> + +#define DSP1_CPP +namespace bSNES_v059 { + +DSP1 dsp1; + +#include "serialization.cpp" +#include "dsp1emu.cpp" + +void DSP1::init() { +} + +void DSP1::enable() { + switch(cartridge.dsp1_mapper()) { + case Cartridge::DSP1LoROM1MB: { + bus.map(Bus::MapDirect, 0x20, 0x3f, 0x8000, 0xffff, *this); + bus.map(Bus::MapDirect, 0xa0, 0xbf, 0x8000, 0xffff, *this); + } break; + + case Cartridge::DSP1LoROM2MB: { + bus.map(Bus::MapDirect, 0x60, 0x6f, 0x0000, 0x7fff, *this); + bus.map(Bus::MapDirect, 0xe0, 0xef, 0x0000, 0x7fff, *this); + } break; + + case Cartridge::DSP1HiROM: { + bus.map(Bus::MapDirect, 0x00, 0x1f, 0x6000, 0x7fff, *this); + bus.map(Bus::MapDirect, 0x80, 0x9f, 0x6000, 0x7fff, *this); + } break; + } +} + +void DSP1::power() { + reset(); +} + +void DSP1::reset() { + dsp1.reset(); +} + +/***** + * addr_decode() + * determine whether address is accessing + * data register (DR) or status register (SR) + * -- 0 (false) = DR + * -- 1 (true ) = SR + * + * note: there is no need to bounds check addresses, + * as memory mapper will not allow DSP1 accesses outside + * of expected ranges + *****/ +bool DSP1::addr_decode(uint16 addr) { + switch(cartridge.dsp1_mapper()) { + case Cartridge::DSP1LoROM1MB: { + //$[20-3f]:[8000-bfff] = DR, $[20-3f]:[c000-ffff] = SR + return (addr >= 0xc000); + } + + case Cartridge::DSP1LoROM2MB: { + //$[60-6f]:[0000-3fff] = DR, $[60-6f]:[4000-7fff] = SR + return (addr >= 0x4000); + } + + case Cartridge::DSP1HiROM: { + //$[00-1f]:[6000-6fff] = DR, $[00-1f]:[7000-7fff] = SR + return (addr >= 0x7000); + } + } + + return 0; +} + +uint8 DSP1::read(unsigned addr) { + return (addr_decode(addr) == 0) ? dsp1.getDr() : dsp1.getSr(); +} + +void DSP1::write(unsigned addr, uint8 data) { + if(addr_decode(addr) == 0) { + dsp1.setDr(data); + } +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/dsp1/dsp1.hpp b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1.hpp new file mode 100755 index 0000000000..474c098c3c --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1.hpp @@ -0,0 +1,20 @@ +#include "dsp1emu.hpp" + +class DSP1 : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + void serialize(serializer&); + +private: + Dsp1 dsp1; + bool addr_decode(uint16 addr); +}; + +extern DSP1 dsp1; diff --git a/Mednafen/mednafen/snes/src/chip/dsp1/dsp1emu.cpp b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1emu.cpp new file mode 100755 index 0000000000..d933b11ced --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1emu.cpp @@ -0,0 +1,1625 @@ +#ifdef DSP1_CPP + +// DSP-1's emulation code +// +// Based on research by Overload, The Dumper, Neviksti and Andreas Naive +// Date: June 2006 + +////////////////////////////////////////////////////////////////// + +Dsp1::Dsp1() +{ + reset(); +} + +////////////////////////////////////////////////////////////////// + +uint8 Dsp1::getSr() +{ + mSrLowByteAccess = ~mSrLowByteAccess; + if (mSrLowByteAccess) + return 0; + else + return mSr; +} + +////////////////////////////////////////////////////////////////// + +uint8 Dsp1::getDr() +{ + uint8 oDr; + + fsmStep(true, oDr); + return oDr; +} + +////////////////////////////////////////////////////////////////// + +void Dsp1::setDr(uint8 iDr) +{ + fsmStep(false, iDr); +} + +////////////////////////////////////////////////////////////////// + +void Dsp1::reset() +{ + mSr = DRC|RQM; + mSrLowByteAccess = false; + mDr = 0x0080; // Only a supposition. Is this correct? + mFreeze = false; + mFsmMajorState = WAIT_COMMAND; + memset(&shared, 0, sizeof(SharedData)); // another supposition +} + +////////////////////////////////////////////////////////////////// + +// Though the DSP-1 is unaware of the type of operation (read or write) +// we need to know what is being done by the program, as the class +// is responsible for maintaining the binding between the +// "external" and "internal" representations of the DR (data register). + +void Dsp1::fsmStep(bool read, uint8 &data) +{ + if (0 == (mSr&RQM)) return; + // Now RQM would be cleared; however, as this code is not to be used in + // a multithread environment, we will simply fake RQM operation. + // (The only exception would be Op1A's freeze.) + + // binding + if (read) + { + if (mSr&DRS) + data = static_cast(mDr>>8); + else + data = static_cast(mDr); + } + else + { + if (mSr&DRS) + { + mDr &= 0x00ff; + mDr |= data<<8; + } + else + { + mDr &= 0xff00; + mDr |= data; + } + } + + + switch (mFsmMajorState) + { + case WAIT_COMMAND: + mCommand = static_cast(mDr); + if (!(mCommand & 0xc0)) // valid command? + { + switch(mCommand) + { + // freeze cases + case 0x1a: + case 0x2a: + case 0x3a: + mFreeze = true; + break; + // normal cases + default: + mDataCounter=0; + mFsmMajorState = READ_DATA; + mSr &= ~DRC; + break; + } + } + break; + case READ_DATA: + mSr ^= DRS; + if (!(mSr&DRS)) + { + mReadBuffer[mDataCounter++] = static_cast(mDr); + if (mDataCounter >= mCommandTable[mCommand].reads) + { + (this->*mCommandTable[mCommand].callback)(mReadBuffer, mWriteBuffer); + if (0 != mCommandTable[mCommand].writes) // any output? + { + mDataCounter = 0; + mDr = static_cast(mWriteBuffer[mDataCounter]); + mFsmMajorState = WRITE_DATA; + } + else + { + mDr = 0x0080; // valid command completion + mFsmMajorState = WAIT_COMMAND; + mSr |= DRC; + } + } + } + break; + case WRITE_DATA: + mSr ^= DRS; + if (!(mSr&DRS)) + { + ++mDataCounter; + if (mDataCounter >= mCommandTable[mCommand].writes) + { + if ((mCommand == 0x0a)&&(mDr != 0x8000)) + { + // works in continuous mode + mReadBuffer[0]++; // next raster line + (this->*mCommandTable[mCommand].callback)(mReadBuffer, mWriteBuffer); + mDataCounter = 0; + mDr = static_cast(mWriteBuffer[mDataCounter]); + } + else + { + mDr = 0x0080; // valid command completion + mFsmMajorState = WAIT_COMMAND; + mSr |= DRC; + } + } + else + { + mDr = static_cast(mWriteBuffer[mDataCounter]); + } + } + break; + } + + + + // Now RQM would be set (except when executing Op1A -command equals 0x1a, 0x2a or 0x3a-). + if (mFreeze) + mSr &= ~RQM; +} + +////////////////////////////////////////////////////////////////// + +// The info on this table follows Overload's docs. + +const Dsp1::Command Dsp1::mCommandTable[0x40] = { + {&Dsp1::multiply, 2, 1}, //0x00 + {&Dsp1::attitudeA, 4, 0}, //0x01 + {&Dsp1::parameter, 7, 4}, //0x02 + {&Dsp1::subjectiveA, 3, 3}, //0x03 + {&Dsp1::triangle, 2, 2}, //0x04 + {&Dsp1::attitudeA, 4, 0}, //0x01 + {&Dsp1::project, 3, 3}, //0x06 + {&Dsp1::memoryTest, 1, 1}, //0x0f + {&Dsp1::radius, 3, 2}, //0x08 + {&Dsp1::objectiveA, 3, 3}, //0x0d + {&Dsp1::raster, 1, 4}, // 0x0a. This will normally work in continuous mode + {&Dsp1::scalarA, 3, 1}, //0x0b + {&Dsp1::rotate, 3, 2}, //0x0c + {&Dsp1::objectiveA, 3, 3}, //0x0d + {&Dsp1::target, 2, 2}, //0x0e + {&Dsp1::memoryTest, 1, 1}, //0x0f + + {&Dsp1::inverse, 2, 2}, //0x10 + {&Dsp1::attitudeB, 4, 0}, //0x11 + {&Dsp1::parameter, 7, 4}, //0x02 + {&Dsp1::subjectiveB, 3, 3}, //0x13 + {&Dsp1::gyrate, 6, 3}, //0x14 + {&Dsp1::attitudeB, 4, 0}, //0x11 + {&Dsp1::project, 3, 3}, //0x06 + {&Dsp1::memoryDump, 1, 1024}, //0x1f + {&Dsp1::range, 4, 1}, //0x18 + {&Dsp1::objectiveB, 3, 3}, //0x1d + {0, 0, 0}, // 0x1a; the chip freezes + {&Dsp1::scalarB, 3, 1}, //0x1b + {&Dsp1::polar, 6, 3}, //0x1c + {&Dsp1::objectiveB, 3, 3}, //0x1d + {&Dsp1::target, 2, 2}, //0x0e + {&Dsp1::memoryDump, 1, 1024}, //0x1f + + {&Dsp1::multiply2, 2, 1}, //0x20 + {&Dsp1::attitudeC, 4, 0}, //0x21 + {&Dsp1::parameter, 7, 4}, //0x02 + {&Dsp1::subjectiveC, 3, 3}, //0x23 + {&Dsp1::triangle, 2, 2}, //0x04 + {&Dsp1::attitudeC, 4, 0}, //0x21 + {&Dsp1::project, 3, 3}, //0x06 + {&Dsp1::memorySize, 1, 1}, //0x2f + {&Dsp1::distance, 3, 1}, //0x28 + {&Dsp1::objectiveC, 3, 3}, //0x2d + {0, 0, 0}, // 0x1a; the chip freezes + {&Dsp1::scalarC, 3, 1}, //0x2b + {&Dsp1::rotate, 3, 2}, //0x0c + {&Dsp1::objectiveC, 3, 3}, //0x2d + {&Dsp1::target, 2, 2}, //0x0e + {&Dsp1::memorySize, 1, 1}, //0x2f + + {&Dsp1::inverse, 2, 2}, //0x10 + {&Dsp1::attitudeA, 4, 0}, //0x01 + {&Dsp1::parameter, 7, 4}, //0x02 + {&Dsp1::subjectiveA, 3, 3}, //0x03 + {&Dsp1::gyrate, 6, 3}, //0x14 + {&Dsp1::attitudeA, 4, 0}, //0x01 + {&Dsp1::project, 3, 3}, //0x06 + {&Dsp1::memoryDump, 1, 1024}, //0x1f + {&Dsp1::range2, 4, 1}, //0x38 + {&Dsp1::objectiveA, 3, 3}, //0x0d + {0, 0, 0}, // 0x1a; the chip freezes + {&Dsp1::scalarA, 3, 1}, //0x0b + {&Dsp1::polar, 6, 3}, //0x1c + {&Dsp1::objectiveA, 3, 3}, //0x0d + {&Dsp1::target, 2, 2}, //0x0e + {&Dsp1::memoryDump, 1, 1024}, //0x1f +}; + +////////////////////////////////////////////////////////////////// + +void Dsp1::memoryTest(int16 *input, int16 *output) +{ + int16& Size = input[0]; + int16& Result = output[0]; + + Result = 0x0000; +} + +////////////////////////////////////////////////////////////////// + +void Dsp1::memoryDump(int16 *input, int16 *output) +{ + memcpy(output, DataRom, 1024); +} + +////////////////////////////////////////////////////////////////// + +void Dsp1::memorySize(int16 *input, int16 *output) +{ + int16& Size = output[0]; + + Size = 0x0100; +} + +////////////////////////////////////////////////////////////////// + +// 16-bit multiplication + +void Dsp1::multiply(int16 *input, int16 *output) +{ + int16& Multiplicand = input[0]; + int16& Multiplier = input[1]; + int16& Product = output[0]; + + Product = Multiplicand * Multiplier >> 15; +} + +////////////////////////////////////////////////////////////////// + +// 16-bit multiplication. 'Alternative' method. Can anyone check this carefully? + +void Dsp1::multiply2(int16 *input, int16 *output) +{ + int16& Multiplicand = input[0]; + int16& Multiplier = input[1]; + int16& Product = output[0]; + + Product = (Multiplicand * Multiplier >> 15)+1; +} + +////////////////////////////////////////////////////////////////// + +// This command determines the inverse of a floating point decimal number. + +void Dsp1::inverse(int16 *input, int16 *output) +{ + int16& Coefficient = input[0]; + int16& Exponent = input[1]; + int16& iCoefficient = output[0]; + int16& iExponent = output[1]; + + inverse(Coefficient, Exponent, iCoefficient, iExponent); +} + +////////////////////////////////////////////////////////////////// + +// Vector component calculation. Determines the X and Y components for a +// two-dimensional vector whose size and direction is known. +// Y = Radius * sin(Angle) +// X = Radius * cos(Angle) + +void Dsp1::triangle(int16 *input, int16 *output) +{ + int16& Angle = input[0]; + int16& Radius = input[1]; + int16& Y = output[0]; + int16& X = output[1]; + + Y = sin(Angle) * Radius >> 15; + X = cos(Angle) * Radius >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Determines the squared norm of a vector (X,Y,Z) +// The output is Radius = X^2+Y^2+Z^2 (double integer) + +void Dsp1::radius(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& RadiusLow = output[0]; + int16& RadiusHigh = output[1]; + + int32 Radius; + + Radius = (X * X + Y * Y + Z * Z) << 1; + RadiusLow = static_cast(Radius); + RadiusHigh = static_cast(Radius>>16); +} + +////////////////////////////////////////////////////////////////// + +// Vector size comparison. This command compares the size of the vector (X,Y,Z) and the distance (R) +// from a particular point, and so may be used to determine if a point is within the sphere or radius R. +// The output is D = X^2+Y^2+Z^2-R^2 + +void Dsp1::range(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& Radius = input[3]; + int16& Range = output[0]; + + Range = (X * X + Y * Y + Z * Z - Radius * Radius) >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Vector size comparison. 'Alternative' method. + +void Dsp1::range2(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& Radius = input[3]; + int16& Range = output[0]; + + Range = ((X * X + Y * Y + Z * Z - Radius * Radius) >> 15) + 1; +} + +////////////////////////////////////////////////////////////////// + +// This command calculates the norm of a (X,Y,Z) vector, or the distance from +// the point (X,Y,Z) to (0,0,0), as you prefer to see it. +// Distance = sqrt(X^2+Y^2+Z^2) +// The square root of a number 'a' is calculated by doing this: you +// write 'a' as b*2^2n, with 'b' between 1/4 and 1; then, you calculate +// c=sqrt(b) by using lineal interpolation between points of a +// look-up table and, finally, you output the result as c*2^n. + +void Dsp1::distance(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& Distance = output[0]; + + int32 Radius = X * X + Y * Y + Z * Z; + + if (Radius == 0) Distance = 0; + else + { + int16 C, E; + normalizeDouble(Radius, C, E); + if (E & 1) C = C * 0x4000 >> 15; + + int16 Pos = C * 0x0040 >> 15; + + int16 Node1 = DataRom[0x00d5 + Pos]; + int16 Node2 = DataRom[0x00d6 + Pos]; + + Distance = ((Node2 - Node1) * (C & 0x1ff) >> 9) + Node1; + +#if DSP1_VERSION < 0x0102 + if (Pos & 1) Distance -= (Node2 - Node1); +#endif + Distance >>= (E >> 1); + } +} + +////////////////////////////////////////////////////////////////// + +// Determines the (X2, Y2) coordinates obtained by rotating (X1, Y1) +// clockwise for an angle 'Angle'. The official documentation says +// 'counterclockwise', but it's obviously wrong (surprise! :P) +// +// In matrix notation: +// |X2| |cos(Angle) sin(Angle)| |X1| +// | | = | | | | +// |Y2| |-sin(Angle cos(Angle)| |Y1| + +void Dsp1::rotate(int16 *input, int16 *output) +{ + int16& Angle = input[0]; + int16& X1 = input[1]; + int16& Y1 = input[2]; + int16& X2 = output[0]; + int16& Y2 = output[1]; + + X2 = (Y1 * sin(Angle) >> 15) + (X1 * cos(Angle) >> 15); + Y2 = (Y1 * cos(Angle) >> 15) - (X1 * sin(Angle) >> 15); +} + +////////////////////////////////////////////////////////////////// + +// Calculate the coordinates (X2, Y2, Z2) obtained when rotating (X1, Y1, Z1) +// three-dimensionally. Rotation is done in the order of Az around the Z axis, +// Ay around the Y axis and Ax around the X axis. As occur with the "attitude" commands +// (see comments in the "gyrate" command), this doesn't match what explained in +// the official documentation, but it's coherent with what it is done in the "attitude" +// command (but not with the "gyrate" command). +// +// In matrix notation: +// |X2| |1 0 0 | |cosRy 0 -sinRy| | cosRz sinRz 0| |X1| +// |Y2| = |0 cosRx sinRx| | 0 1 0 | |-sinRz cosRz 0| |Y1| +// |Z2| |0 -sinRx cosRx| |sinRy 0 cosRy| | 0 0 1| |Z1| + +void Dsp1::polar(int16 *input, int16 *output) +{ + int16& Az = input[0]; + int16& Ay = input[1]; + int16& Ax = input[2]; + int16& X1 = input[3]; + int16& Y1 = input[4]; + int16& Z1 = input[5]; + int16& X2 = output[0]; + int16& Y2 = output[1]; + int16& Z2 = output[2]; + + int16 X, Y, Z; + + // Rotate Around Z + X = (Y1 * sin(Az) >> 15) + (X1 * cos(Az) >> 15); + Y = (Y1 * cos(Az) >> 15) - (X1 * sin(Az) >> 15); + X1 = X; Y1 = Y; + + // Rotate Around Y + Z = (X1 * sin(Ay) >> 15) + (Z1 * cos(Ay) >> 15); + X = (X1 * cos(Ay) >> 15) - (Z1 * sin(Ay) >> 15); + X2 = X; Z1 = Z; + + // Rotate Around X + Y = (Z1 * sin(Ax) >> 15) + (Y1 * cos(Ax) >> 15); + Z = (Z1 * cos(Ax) >> 15) - (Y1 * sin(Ax) >> 15); + Y2 = Y; Z2 = Z; +} + +////////////////////////////////////////////////////////////////// + +// Set up the elements of an "attitude matrix" (there are other ones): +// S | cosRz sinRz 0| |cosRy 0 -sinRy| |1 0 0 | +// MatrixA = - |-sinRz cosRz 0| | 0 1 0 | |0 cosRx sinRx| +// 2 | 0 0 1| |sinRy 0 cosRy| |0 -sinRx cosRx| +// This matrix is thought to be used within the following framework: +// let's suppose we define positive rotations around a system of orthogonal axes in this manner: +// a rotation of +90 degrees around axis3 converts axis2 into axis1 +// a rotation of +90 degrees around axis2 converts axis1 into axis3 +// a rotation of +90 degrees around axis1 converts axis3 into axis2 +// and let's suppose that we have defined a new orthonormal axes system (FLU) +// by doing the following operations about the standard one (XYZ): +// first rotating the XYZ system around Z by an angle Rz (obtaining X'Y'Z'), +// then rotating the resulting system around Y by an angle Ry (obtaining X''Y''Z'') +// and, finally, rotating the resulting system around X by an angle Rx (obtaining FLU) +// This FLU (forward/left/up) system represents an "attitude" and, then, the matrix here defined +// is the change of coordinates matrix that transform coordinates in the FLU +// system (the "object coordinates") into the standard XYZ system (the "global coordinates"), +// multiplied by a scale factor S/2, that is: +// |x| S |f| +// |y| * - = MatrixA * |l| +// |z| 2 |u| +// In a similar way, if we use the transpose of the matrix, we can transform global coordinates +// into object coordinates: +// |f| S |x| +// |l| * - = MatrixA_transposed * |y| +// |u| 2 |z| +// +// input[0]: S +// input[1]: Rz +// input[2]: Ry +// input[3]: Rx + +void Dsp1::attitudeA(int16 *input, int16 *output) +{ + int16& S = input[0]; + int16& Rz = input[1]; + int16& Ry = input[2]; + int16& Rx = input[3]; + + int16 SinRz = sin(Rz); + int16 CosRz = cos(Rz); + int16 SinRy = sin(Ry); + int16 CosRy = cos(Ry); + int16 SinRx = sin(Rx); + int16 CosRx = cos(Rx); + + S >>= 1; + + shared.MatrixA[0][0] = (S * CosRz >> 15) * CosRy >> 15; + shared.MatrixA[0][1] = ((S * SinRz >> 15) * CosRx >> 15) + (((S * CosRz >> 15) * SinRx >> 15) * SinRy >> 15); + shared.MatrixA[0][2] = ((S * SinRz >> 15) * SinRx >> 15) - (((S * CosRz >> 15) * CosRx >> 15) * SinRy >> 15); + + shared.MatrixA[1][0] = -((S * SinRz >> 15) * CosRy >> 15); + shared.MatrixA[1][1] = ((S * CosRz >> 15) * CosRx >> 15) - (((S * SinRz >> 15) * SinRx >> 15) * SinRy >> 15); + shared.MatrixA[1][2] = ((S * CosRz >> 15) * SinRx >> 15) + (((S * SinRz >> 15) * CosRx >> 15) * SinRy >> 15); + + shared.MatrixA[2][0] = S * SinRy >> 15; + shared.MatrixA[2][1] = -((S * SinRx >> 15) * CosRy >> 15); + shared.MatrixA[2][2] = (S * CosRx >> 15) * CosRy >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Same than 'attitudeA', but with a difference attitude matrix (matrixB) + +void Dsp1::attitudeB(int16 *input, int16 *output) +{ + int16& S = input[0]; + int16& Rz = input[1]; + int16& Ry = input[2]; + int16& Rx = input[3]; + + int16 SinRz = sin(Rz); + int16 CosRz = cos(Rz); + int16 SinRy = sin(Ry); + int16 CosRy = cos(Ry); + int16 SinRx = sin(Rx); + int16 CosRx = cos(Rx); + + S >>= 1; + + shared.MatrixB[0][0] = (S * CosRz >> 15) * CosRy >> 15; + shared.MatrixB[0][1] = ((S * SinRz >> 15) * CosRx >> 15) + (((S * CosRz >> 15) * SinRx >> 15) * SinRy >> 15); + shared.MatrixB[0][2] = ((S * SinRz >> 15) * SinRx >> 15) - (((S * CosRz >> 15) * CosRx >> 15) * SinRy >> 15); + + shared.MatrixB[1][0] = -((S * SinRz >> 15) * CosRy >> 15); + shared.MatrixB[1][1] = ((S * CosRz >> 15) * CosRx >> 15) - (((S * SinRz >> 15) * SinRx >> 15) * SinRy >> 15); + shared.MatrixB[1][2] = ((S * CosRz >> 15) * SinRx >> 15) + (((S * SinRz >> 15) * CosRx >> 15) * SinRy >> 15); + + shared.MatrixB[2][0] = S * SinRy >> 15; + shared.MatrixB[2][1] = -((S * SinRx >> 15) * CosRy >> 15); + shared.MatrixB[2][2] = (S * CosRx >> 15) * CosRy >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Same than 'attitudeA', but with a difference attitude matrix (matrixC) + +void Dsp1::attitudeC(int16 *input, int16 *output) +{ + int16& S = input[0]; + int16& Rz = input[1]; + int16& Ry = input[2]; + int16& Rx = input[3]; + + int16 SinRz = sin(Rz); + int16 CosRz = cos(Rz); + int16 SinRy = sin(Ry); + int16 CosRy = cos(Ry); + int16 SinRx = sin(Rx); + int16 CosRx = cos(Rx); + + S >>= 1; + + shared.MatrixC[0][0] = (S * CosRz >> 15) * CosRy >> 15; + shared.MatrixC[0][1] = ((S * SinRz >> 15) * CosRx >> 15) + (((S * CosRz >> 15) * SinRx >> 15) * SinRy >> 15); + shared.MatrixC[0][2] = ((S * SinRz >> 15) * SinRx >> 15) - (((S * CosRz >> 15) * CosRx >> 15) * SinRy >> 15); + + shared.MatrixC[1][0] = -((S * SinRz >> 15) * CosRy >> 15); + shared.MatrixC[1][1] = ((S * CosRz >> 15) * CosRx >> 15) - (((S * SinRz >> 15) * SinRx >> 15) * SinRy >> 15); + shared.MatrixC[1][2] = ((S * CosRz >> 15) * SinRx >> 15) + (((S * SinRz >> 15) * CosRx >> 15) * SinRy >> 15); + + shared.MatrixC[2][0] = S * SinRy >> 15; + shared.MatrixC[2][1] = -((S * SinRx >> 15) * CosRy >> 15); + shared.MatrixC[2][2] = (S * CosRx >> 15) * CosRy >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Convert global coordinates (X,Y,Z) to object coordinates (F,L,U) +// See the comment in "attitudeA" for a explanation about the calculation. +// +// input[0]: X ; input[1]: Y ; input[2]: Z +// output[0]: F ; output[1]: L ; output[2]: U + +void Dsp1::objectiveA(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& F = output[0]; + int16& L = output[1]; + int16& U = output[2]; + + F = (shared.MatrixA[0][0] * X >> 15) + (shared.MatrixA[1][0] * Y >> 15) + (shared.MatrixA[2][0] * Z >> 15); + L = (shared.MatrixA[0][1] * X >> 15) + (shared.MatrixA[1][1] * Y >> 15) + (shared.MatrixA[2][1] * Z >> 15); + U = (shared.MatrixA[0][2] * X >> 15) + (shared.MatrixA[1][2] * Y >> 15) + (shared.MatrixA[2][2] * Z >> 15); +} + +////////////////////////////////////////////////////////////////// + +// Same than 'objectiveA', but for the 'B' attitude + +void Dsp1::objectiveB(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& F = output[0]; + int16& L = output[1]; + int16& U = output[2]; + + F = (shared.MatrixB[0][0] * X >> 15) + (shared.MatrixB[1][0] * Y >> 15) + (shared.MatrixB[2][0] * Z >> 15); + L = (shared.MatrixB[0][1] * X >> 15) + (shared.MatrixB[1][1] * Y >> 15) + (shared.MatrixB[2][1] * Z >> 15); + U = (shared.MatrixB[0][2] * X >> 15) + (shared.MatrixB[1][2] * Y >> 15) + (shared.MatrixB[2][2] * Z >> 15); +} + +////////////////////////////////////////////////////////////////// + +// Same than 'objectiveA', but for the 'C' attitude + +void Dsp1::objectiveC(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& F = output[0]; + int16& L = output[1]; + int16& U = output[2]; + + F = (shared.MatrixC[0][0] * X >> 15) + (shared.MatrixC[1][0] * Y >> 15) + (shared.MatrixC[2][0] * Z >> 15); + L = (shared.MatrixC[0][1] * X >> 15) + (shared.MatrixC[1][1] * Y >> 15) + (shared.MatrixC[2][1] * Z >> 15); + U = (shared.MatrixC[0][2] * X >> 15) + (shared.MatrixC[1][2] * Y >> 15) + (shared.MatrixC[2][2] * Z >> 15); +} + +////////////////////////////////////////////////////////////////// + +// Convert object coordinates (F,L,U) to object coordinates (X,Y,Z) +// See the comment in "attitudeA" for a explanation about the calculation. +// +// input[0]: F ; input[1]: L ; input[2]: U +// output[0]: X ; output[1]: Y ; output[2]: Z + +void Dsp1::subjectiveA(int16 *input, int16 *output) +{ + int16& F = input[0]; + int16& L = input[1]; + int16& U = input[2]; + int16& X = output[0]; + int16& Y = output[1]; + int16& Z = output[2]; + + X = (shared.MatrixA[0][0] * F >> 15) + (shared.MatrixA[0][1] * L >> 15) + (shared.MatrixA[0][2] * U >> 15); + Y = (shared.MatrixA[1][0] * F >> 15) + (shared.MatrixA[1][1] * L >> 15) + (shared.MatrixA[1][2] * U >> 15); + Z = (shared.MatrixA[2][0] * F >> 15) + (shared.MatrixA[2][1] * L >> 15) + (shared.MatrixA[2][2] * U >> 15); +} + +////////////////////////////////////////////////////////////////// + +// Same than 'subjectiveA', but for the 'B' attitude + +void Dsp1::subjectiveB(int16 *input, int16 *output) +{ + int16& F = input[0]; + int16& L = input[1]; + int16& U = input[2]; + int16& X = output[0]; + int16& Y = output[1]; + int16& Z = output[2]; + + X = (shared.MatrixB[0][0] * F >> 15) + (shared.MatrixB[0][1] * L >> 15) + (shared.MatrixB[0][2] * U >> 15); + Y = (shared.MatrixB[1][0] * F >> 15) + (shared.MatrixB[1][1] * L >> 15) + (shared.MatrixB[1][2] * U >> 15); + Z = (shared.MatrixB[2][0] * F >> 15) + (shared.MatrixB[2][1] * L >> 15) + (shared.MatrixB[2][2] * U >> 15); +} + +////////////////////////////////////////////////////////////////// + +// Same than 'subjectiveA', but for the 'C' attitude + +void Dsp1::subjectiveC(int16 *input, int16 *output) +{ + int16& F = input[0]; + int16& L = input[1]; + int16& U = input[2]; + int16& X = output[0]; + int16& Y = output[1]; + int16& Z = output[2]; + + X = (shared.MatrixC[0][0] * F >> 15) + (shared.MatrixC[0][1] * L >> 15) + (shared.MatrixC[0][2] * U >> 15); + Y = (shared.MatrixC[1][0] * F >> 15) + (shared.MatrixC[1][1] * L >> 15) + (shared.MatrixC[1][2] * U >> 15); + Z = (shared.MatrixC[2][0] * F >> 15) + (shared.MatrixC[2][1] * L >> 15) + (shared.MatrixC[2][2] * U >> 15); +} + +////////////////////////////////////////////////////////////////// + +// This command calculates the inner product (S) of a vector (X,Y,Z) and +// the first column of MatrixA. It should be noted that that first column +// represent the global coordinates of an unity vector in the forward +// direction in the object coordinate system (coordinates (1,0,0) in the FLU +// axes system). +// +// input[0]: X ; input[1]: Y ; input[2]: Z +// output[0]: S + +void Dsp1::scalarA(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& S = output[0]; + + S = (X * shared.MatrixA[0][0] + Y * shared.MatrixA[1][0] + Z * shared.MatrixA[2][0]) >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Same than 'scalarA', but for the 'B' attitude + +void Dsp1::scalarB(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& S = output[0]; + + S = (X * shared.MatrixB[0][0] + Y * shared.MatrixB[1][0] + Z * shared.MatrixB[2][0]) >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Same than 'scalarA', but for the 'C' attitude + +void Dsp1::scalarC(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& S = output[0]; + + S = (X * shared.MatrixC[0][0] + Y * shared.MatrixC[1][0] + Z * shared.MatrixC[2][0]) >> 15; +} + +////////////////////////////////////////////////////////////////// + +// This command determines the final attitude angles after the body with attitude angles (Ax, Ay, Az) with +// respect to the global coordinates is rotated by the minor angular displacements (DeltaF, DeltaL, DeltaU). +// It means that the XYZ axes are rotated by (Ax, Ay, Az) to obtain the FLU axes and, then, these +// are rotated by (DeltaF, DeltaL, DeltaU). The command calculates and return the new FLU angles respect to the +// XYZ system (Rx, Ry, Rz) +// The formulae are: +// Rx = Ax + (DeltaU*sin(Ay)+DeltaF*cos(Ay)) +// Ry = Ay + DeltaL - tan(Ax)*(DeltaU*cos(Ay)+DeltaF*sin(Ay)) +// Rz = Az + sec(Ax)*(DeltaU*cos(Ay)-DeltaF*sin(Ay)) +// +// Now the discussion: according to the official documentation, as described in various commands, you pass from +// XYZ to FLU by doing the rotations in the order Y, X, Z. In this command, the formulae are coherent with the +// fact that Y is the first axis to do a rotation around it. However, in the "attitude" command, while the official +// document describe it that way, we have discovered, when reverse engineering the command, that the calculated +// matrix do the rotation around Y in the second place. This incoherent behaviour of various commands is, in my +// opinion, a pretty severe implementation error. However, if you only use small "minor displacements", the error term +// introduced by that incoherence should be almost negligible. + +void Dsp1::gyrate(int16 *input, int16 *output) +{ + int16& Az = input[0]; + int16& Ax = input[1]; + int16& Ay = input[2]; + int16& U = input[3]; + int16& F = input[4]; + int16& L = input[5]; + int16& Rz = output[0]; + int16& Rx = output[1]; + int16& Ry = output[2]; + + int16 CSec, ESec, CSin, C, E; + int16 SinAy = sin(Ay); + int16 CosAy = cos(Ay); + + inverse(cos(Ax), 0, CSec, ESec); + + // Rotation Around Z + normalizeDouble(U * CosAy - F * SinAy, C, E); + + E = ESec - E; + + normalize(C * CSec >> 15, C, E); + + Rz = Az + denormalizeAndClip(C, E); + + // Rotation Around X + Rx = Ax + (U * SinAy >> 15) + (F * CosAy >> 15); + + // Rotation Around Y + normalizeDouble(U * CosAy + F * SinAy, C, E); + + E = ESec - E; + + normalize(sin(Ax), CSin, E); + + normalize(-(C * (CSec * CSin >> 15) >> 15), C, E); + + Ry = Ay + denormalizeAndClip(C, E) + L; +} + +////////////////////////////////////////////////////////////////// + +const int16 Dsp1::MaxAZS_Exp[16] = { + 0x38b4, 0x38b7, 0x38ba, 0x38be, 0x38c0, 0x38c4, 0x38c7, 0x38ca, + 0x38ce, 0x38d0, 0x38d4, 0x38d7, 0x38da, 0x38dd, 0x38e0, 0x38e4 +}; + +////////////////////////////////////////////////////////////////// + + +// Set-up the projection framework. Besides returning some values, it store in RAM some values that +// will be used by the other three projection commands (raster, target an project) +// Input: +// (Fx, Fy, Fz)-> coordinates of base point (global coordinates) +// Lfe-> distance between the base point and the viewpoint (center of projection) +// Les-> distance between the base point and the screen +// Aas-> azimuth angle (0 degrees is east; 90 degrees is north) +// Azs-> zenith angle (0 degrees is zenith) +// Output: +// Vof-> raster line of imaginary center (whatever it means ;) ) +// Vva-> raster line representing the horizon line +// (Cx, Cy)-> coordinates of the projection of the center of the screen over the ground (ground coordinates) + +void Dsp1::parameter(int16 *input, int16 *output) +{ + int16& Fx = input[0]; + int16& Fy = input[1]; + int16& Fz = input[2]; + int16& Lfe = input[3]; + int16& Les = input[4]; + int16& Aas = input[5]; + int16& Azs = input[6]; + int16& Vof = output[0]; + int16& Vva = output[1]; + int16& Cx = output[2]; + int16& Cy = output[3]; + + int16 CSec, C, E; + int16 LfeNx, LfeNy, LfeNz; + int16 LesNx, LesNy, LesNz; + + // Copy Zenith angle for clipping + int16 AZS = Azs; + + // Store Les and his coefficient and exponent when normalized + shared.Les = Les; + shared.E_Les=0; + normalize(Les, shared.C_Les, shared.E_Les); + + // Store Sine and Cosine of Azimuth and Zenith angle + shared.SinAas = sin(Aas); + shared.CosAas = cos(Aas); + shared.SinAzs = sin(Azs); + shared.CosAzs = cos(Azs); + + // normal vector to the screen (norm 1, points toward the center of projection) + shared.Nx = shared.SinAzs * -shared.SinAas >> 15; + shared.Ny = shared.SinAzs * shared.CosAas >> 15; + shared.Nz = shared.CosAzs * 0x7fff >> 15; + + // horizontal vector of the screen (Hz=0, norm 1, points toward the right of the screen) + shared.Hx = shared.CosAas*0x7fff>>15; + shared.Hy = shared.SinAas*0x7fff>>15; + + // vertical vector of the screen (norm 1, points toward the top of the screen) + shared.Vx = shared.CosAzs*-shared.SinAas>>15; + shared.Vy = shared.CosAzs*shared.CosAas>>15; + shared.Vz = -shared.SinAzs*0x7fff>>15; + + LfeNx = Lfe*shared.Nx>>15; + LfeNy = Lfe*shared.Ny>>15; + LfeNz = Lfe*shared.Nz>>15; + + // Center of Projection + shared.CentreX = Fx+LfeNx; + shared.CentreY = Fy+LfeNy; + shared.CentreZ = Fz+LfeNz; + + LesNx = Les*shared.Nx>>15; + LesNy = Les*shared.Ny>>15; + LesNz = Les*shared.Nz>>15; + + // center of the screen (global coordinates) + shared.Gx=shared.CentreX-LesNx; + shared.Gy=shared.CentreY-LesNy; + shared.Gz=shared.CentreZ-LesNz; + + + E = 0; + normalize(shared.CentreZ, C, E); + + shared.CentreZ_C = C; + shared.CentreZ_E = E; + + // Determine clip boundary and clip Zenith angle if necessary + // (Why to clip? Maybe to avoid the screen can only show sky with no ground? Only a guess...) + int16 MaxAZS = MaxAZS_Exp[-E]; + + if (AZS < 0) { + MaxAZS = -MaxAZS; + if (AZS < MaxAZS + 1) AZS = MaxAZS + 1; + } else { + if (AZS > MaxAZS) AZS = MaxAZS; + } + + // Store Sine and Cosine of clipped Zenith angle + shared.SinAZS = sin(AZS); + shared.CosAZS = cos(AZS); + + // calculate the separation of (cx, cy) from the projection of + // the 'centre of projection' over the ground... (CentreZ*tg(AZS)) + inverse(shared.CosAZS, 0, shared.SecAZS_C1, shared.SecAZS_E1); + normalize(C * shared.SecAZS_C1 >> 15, C, E); + E += shared.SecAZS_E1; + C = denormalizeAndClip(C, E) * shared.SinAZS >> 15; + + // ... and then take into account the position of the centre of + // projection and the azimuth angle + shared.CentreX += C * shared.SinAas >> 15; + shared.CentreY -= C * shared.CosAas >> 15; + + Cx = shared.CentreX; + Cy = shared.CentreY; + + // Raster number of imaginary center and horizontal line + Vof = 0; + + if ((Azs != AZS) || (Azs == MaxAZS)) + { + // correct vof and vva when Azs is outside the 'non-clipping interval' + // we have only some few Taylor coefficients, so we cannot guess which ones + // are the approximated functions and, what is worse, we don't know why + // the own clipping stuff (and, particularly, this correction) is done + if (Azs == -32768) Azs = -32767; + + C = Azs - MaxAZS; + if (C >= 0) C--; + int16 Aux = ~(C << 2); + + // Vof += x+(1/3)*x^3, where x ranges from 0 to PI/4 when Azs-MaxAZS goes from 0 to 0x2000 + C = Aux * DataRom[0x0328] >> 15; + C = (C * Aux >> 15) + DataRom[0x0327]; + Vof -= (C * Aux >> 15) * Les >> 15; + + // CosAZS *= 1+(1/2)*x^2+(5/24)*x^24, where x ranges from 0 to PI/4 when Azs-MaxAZS goes from 0 to 0x2000 + C = Aux * Aux >> 15; + Aux = (C * DataRom[0x0324] >> 15) + DataRom[0x0325]; + shared.CosAZS += (C * Aux >> 15) * shared.CosAZS >> 15; + } + + // vertical offset of the screen with regard to the horizontal plane + // containing the centre of projection + shared.VOffset = Les * shared.CosAZS >> 15; + + // The horizon line (the line in the screen that is crossed by the horizon plane + // -the horizontal plane containing the 'centre of projection'-), + // will be at distance Les*cotg(AZS) from the centre of the screen. This is difficult + // to explain but easily seen in a graph. To better see it, consider it in this way: + // Les*tg(AZS-90), draw some lines and apply basic trigonometry. ;) + inverse(shared.SinAZS, 0, CSec, E); + normalize(shared.VOffset, C, E); + normalize(C * CSec >> 15, C, E); + + if (C == -32768) { C >>= 1; E++; } + + Vva = denormalizeAndClip(-C, E); + + // Store Secant of clipped Zenith angle + inverse(shared.CosAZS, 0, shared.SecAZS_C2, shared.SecAZS_E2); +} + +////////////////////////////////////////////////////////////////// + +// Calculates the matrix which transform an object situated on a raster line (Vs) into +// his projection over the ground. The modified SecAZS is used here, so +// i don't understand the fine details, but, basically, it's done +// this way: The vertical offset between the point of projection and the +// raster line is calculated (Vs*SinAzs>>15)+VOffset, then the height of +// the center of projection is measured in that units (*CentreZ_C). If, now +// you consider the "reference case" (center of projection at an unit of height), +// the projection of a thin strip containing the raster line will have the same +// width (as the raster line would be on the ground in this case, but will suffer a +// change of scale in height (as the ground and the vertical axis would form an angle of 180-Azs degrees). +// This scale factor, when the angle 'center of screen-center of projection-raster line' is small, +// can be aproximated by the one of the center of the screen, 1/cos(Azs).(**) (Here is when it's used +// SecAZS). By last, you have to consider the effect of the azimuth angle Aas, and you are done. +// +// Using matrix notation: +// |A B| Centre_ZS | cos(Aas) -sin(Aas)| |1 0| +// ProjectionMatrix = | | = ----------- * | | * | | +// |C D| Vs*sin(Azs) |sin(Aas) cos(Aas)| |0 sec(Azs)| +// +// (**) +// If Les=1, the vertical offset between the center +// of projection and the center of the screen is Cos(Azs); then, if the vertical +// offset is 1, the ratio of the projection over the ground respect to the +// line on the screen is 1/cos(Azs). + +void Dsp1::raster(int16 *input, int16 *output) +{ + int16& Vs = input[0]; + int16& An = output[0]; + int16& Bn = output[1]; + int16& Cn = output[2]; + int16& Dn = output[3]; + + int16 C, E, C1, E1; + + inverse((Vs * shared.SinAzs >> 15) + shared.VOffset, 7, C, E); + + E += shared.CentreZ_E; + C1 = C * shared.CentreZ_C >> 15; + + E1 = E + shared.SecAZS_E2; + + normalize(C1, C, E); + C = denormalizeAndClip(C, E); + + An = C * shared.CosAas >> 15; + Cn = C * shared.SinAas >> 15; + + normalize(C1 * shared.SecAZS_C2 >> 15, C, E1); + C = denormalizeAndClip(C, E1); + + Bn = C * -shared.SinAas >> 15; + Dn = C * shared.CosAas >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Calculate the projection over the ground of a selected point of screen +// It simply apply the projection matrix described in the "Raster" command +// to the vector (H,V) transposed, and add the result to the position of +// the centre of projection. +// The only special point to take into account is the directions on the screen: +// H is positive rightward, but V is positive downward; this is why +// the signs take that configuration + +void Dsp1::target(int16 *input, int16 *output) +{ + int16& H = input[0]; + int16& V = input[1]; + int16& X = output[0]; + int16& Y = output[1]; + + int16 C, E, C1, E1; + + inverse((V * shared.SinAzs >> 15) + shared.VOffset, 8, C, E); + + E += shared.CentreZ_E; + C1 = C * shared.CentreZ_C >> 15; + + E1 = E + shared.SecAZS_E1; + + H <<= 8; + normalize(C1, C, E); + C = denormalizeAndClip(C, E) * H >> 15; + + X = shared.CentreX + (C * shared.CosAas >> 15); + Y = shared.CentreY - (C * shared.SinAas >> 15); + + V <<= 8; + normalize(C1 * shared.SecAZS_C1 >> 15, C, E1); + C = denormalizeAndClip(C, E1) * V >> 15; + + X += C * -shared.SinAas >> 15; + Y += C * shared.CosAas >> 15; +} + +////////////////////////////////////////////////////////////////// + +// Calculation of the projection over the screen (H,V) of an object (X,Y,Z) and his +// 'enlargement ratio' (M). The positive directions on the screen are as described +// in the targe command. M is scaled down by 2^-7, that is, M==0x0100 means ratio 1:1 + + void Dsp1::project(int16 *input, int16 *output) +{ + int16& X = input[0]; + int16& Y = input[1]; + int16& Z = input[2]; + int16& H = output[0]; + int16& V = output[1]; + int16& M = output[2]; + + int32 aux, aux4; + int16 E, E2, E3, E4, E5, refE, E6, E7; + int16 C2, C4, C6, C8, C9, C10, C11, C12, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25, C26; + int16 Px, Py, Pz; + + E4=E3=E2=E=E5=0; + + normalizeDouble(int32(X)-shared.Gx, Px, E4); + normalizeDouble(int32(Y)-shared.Gy, Py, E); + normalizeDouble(int32(Z)-shared.Gz, Pz, E3); + Px>>=1; E4--; // to avoid overflows when calculating the scalar products + Py>>=1; E--; + Pz>>=1; E3--; + + refE = (E>15); + C8=- (Py*shared.Ny>>15); + C9=- (Pz*shared.Nz>>15); + C12=C11+C8+C9; // this cannot overflow! + + aux4=C12; // de-normalization with 32-bits arithmetic + refE = 16-refE; // refE can be up to 3 + if (refE>=0) + aux4 <<=(refE); + else + aux4 >>=-(refE); + if (aux4==-1) aux4 = 0; // why? + aux4>>=1; + + aux = static_cast(shared.Les) + aux4; // Les - the scalar product of P with the normal vector of the screen + normalizeDouble(aux, C10, E2); + E2 = 15-E2; + + inverse(C10, 0, C4, E4); + C2=C4*shared.C_Les>>15; // scale factor + + + // H + E7=0; + C16= (Px*shared.Hx>>15); + C20= (Py*shared.Hy>>15); + C17=C16+C20; // scalar product of P with the normalized horizontal vector of the screen... + + C18=C17*C2>>15; // ... multiplied by the scale factor + normalize(C18, C19, E7); + H=denormalizeAndClip(C19, shared.E_Les-E2+refE+E7); + + // V + E6=0; + C21 = Px*shared.Vx>>15; + C22 = Py*shared.Vy>>15; + C23 = Pz*shared.Vz>>15; + C24=C21+C22+C23; // scalar product of P with the normalized vertical vector of the screen... + + C26=C24*C2>>15; // ... multiplied by the scale factor + normalize(C26, C25, E6); + V=denormalizeAndClip(C25, shared.E_Les-E2+refE+E6); + + // M + normalize(C2, C6, E4); + M=denormalizeAndClip(C6, E4+shared.E_Les-E2-7); // M is the scale factor divided by 2^7 +} + +////////////////////////////////////////////////////////////////// + +// Calculate the sine of the input parameter +// this is done by linear interpolation between +// the points of a look-up table + +int16 Dsp1::sin(int16 Angle) +{ + if (Angle < 0) { + if (Angle == -32768) return 0; + return -sin(-Angle); + } + int32 S = SinTable[Angle >> 8] + (MulTable[Angle & 0xff] * SinTable[0x40 + (Angle >> 8)] >> 15); + if (S > 32767) S = 32767; + return (int16) S; +} + +////////////////////////////////////////////////////////////////// + +// Calculate the cosine of the input parameter. +// It's used the same method than in sin(int16) + +int16 Dsp1::cos(int16 Angle) +{ + if (Angle < 0) { + if (Angle == -32768) return -32768; + Angle = -Angle; + } + int32 S = SinTable[0x40 + (Angle >> 8)] - (MulTable[Angle & 0xff] * SinTable[Angle >> 8] >> 15); + if (S < -32768) S = -32767; + return (int16) S; +} + +////////////////////////////////////////////////////////////////// + +// Determines the inverse of a floating point decimal number +// iCoefficient*2^iExponent = 1/(Coefficient*2^Exponent), with the output +// normalized (iCoefficient represents a number whose absolute value is between 1/2 and 1) +// To invert 'Coefficient' a first initial guess is taken from a look-up table +// and, then, two iterations of the Newton method (applied to the function +// f(x)=1/(2*x)-Coefficient) are done. This results in a close approximation (iCoefficient) to a number 'y' +// that verify Coefficient*y=1/2. This is why you have to correct the exponent by one +// unit at the end. + +void Dsp1::inverse(int16 Coefficient, int16 Exponent, int16 &iCoefficient, int16 &iExponent) +{ + // Step One: Division by Zero + if (Coefficient == 0x0000) + { + iCoefficient = 0x7fff; + iExponent = 0x002f; + } + else + { + int16 Sign = 1; + + // Step Two: Remove Sign + if (Coefficient < 0) + { + if (Coefficient < -32767) Coefficient = -32767; + Coefficient = -Coefficient; + Sign = -1; + } + + // Step Three: Normalize + while (Coefficient < 0x4000) + { + Coefficient <<= 1; + Exponent--; + } + + // Step Four: Special Case + if (Coefficient == 0x4000) + if (Sign == 1) iCoefficient = 0x7fff; + else { + iCoefficient = -0x4000; + Exponent--; + } + else { + // Step Five: Initial Guess + int16 i = DataRom[((Coefficient - 0x4000) >> 7) + 0x0065]; + + // Step Six: Iterate Newton's Method + i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; + i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; + + iCoefficient = i * Sign; + } + + iExponent = 1 - Exponent; + } +} + +////////////////////////////////////////////////////////////////// + +int16 Dsp1::denormalizeAndClip(int16 C, int16 E) +{ + if (E > 0) { + if (C > 0) return 32767; else if (C < 0) return -32767; + } else { + if (E < 0) return C * DataRom[0x0031 + E] >> 15; + } + return C; +} + +////////////////////////////////////////////////////////////////// + +// Normalize the input number (m), understood as ranging from -1 to 1, +// to the form: Coefficient*2^Exponent, +// where the absolute value of Coefficient is >= 1/2 +// (Coefficient>=0x4000 or Coefficient <= (int16)0xc001) + +void Dsp1::normalize(int16 m, int16 &Coefficient, int16 &Exponent) +{ + int16 i = 0x4000; + int16 e = 0; + + if (m < 0) + while ((m & i) && i) + { + i >>= 1; + e++; + } + else + while (!(m & i) && i) + { + i >>= 1; + e++; + } + + if (e > 0) + Coefficient = m * DataRom[0x21 + e] << 1; + else + Coefficient = m; + + Exponent -= e; +} + +////////////////////////////////////////////////////////////////// + +// Same than 'normalize' but with an int32 input + +void Dsp1::normalizeDouble(int32 Product, int16 &Coefficient, int16 &Exponent) +{ + int16 n = Product & 0x7fff; + int16 m = Product >> 15; + int16 i = 0x4000; + int16 e = 0; + + if (m < 0) + while ((m & i) && i) + { + i >>= 1; + e++; + } + else + while (!(m & i) && i) + { + i >>= 1; + e++; + } + + if (e > 0) + { + Coefficient = m * DataRom[0x0021 + e] << 1; + + if (e < 15) + Coefficient += n * DataRom[0x0040 - e] >> 15; + else + { + i = 0x4000; + + if (m < 0) + while ((n & i) && i) + { + i >>= 1; + e++; + } + else + while (!(n & i) && i) + { + i >>= 1; + e++; + } + + if (e > 15) + Coefficient = n * DataRom[0x0012 + e] << 1; + else + Coefficient += n; + } + } + else + Coefficient = m; + + Exponent = e; +} + +////////////////////////////////////////////////////////////////// + +// Shift to the right + +int16 Dsp1::shiftR(int16 C, int16 E) +{ + return (C * DataRom[0x0031 + E] >> 15); +} + +////////////////////////////////////////////////////////////////// + +// this is, indeed, only part of the Data ROM +const int16 Dsp1::SinTable[256] = { + 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, + 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, + 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, + 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, + 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, + 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, + 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, + 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, + 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, + 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, + 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, + 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, + -0x0000, -0x0324, -0x0647, -0x096a, -0x0c8b, -0x0fab, -0x12c8, -0x15e2, + -0x18f8, -0x1c0b, -0x1f19, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, + -0x30fb, -0x33de, -0x36ba, -0x398c, -0x3c56, -0x3f17, -0x41ce, -0x447a, + -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, + -0x5a82, -0x5cb4, -0x5ed7, -0x60ec, -0x62f2, -0x64e8, -0x66cf, -0x68a6, + -0x6a6d, -0x6c24, -0x6dca, -0x6f5f, -0x70e2, -0x7255, -0x73b5, -0x7504, + -0x7641, -0x776c, -0x7884, -0x798a, -0x7a7d, -0x7b5d, -0x7c29, -0x7ce3, + -0x7d8a, -0x7e1d, -0x7e9d, -0x7f09, -0x7f62, -0x7fa7, -0x7fd8, -0x7ff6, + -0x7fff, -0x7ff6, -0x7fd8, -0x7fa7, -0x7f62, -0x7f09, -0x7e9d, -0x7e1d, + -0x7d8a, -0x7ce3, -0x7c29, -0x7b5d, -0x7a7d, -0x798a, -0x7884, -0x776c, + -0x7641, -0x7504, -0x73b5, -0x7255, -0x70e2, -0x6f5f, -0x6dca, -0x6c24, + -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f2, -0x60ec, -0x5ed7, -0x5cb4, + -0x5a82, -0x5842, -0x55f5, -0x539b, -0x5133, -0x4ebf, -0x4c3f, -0x49b4, + -0x471c, -0x447a, -0x41ce, -0x3f17, -0x3c56, -0x398c, -0x36ba, -0x33de, + -0x30fb, -0x2e11, -0x2b1f, -0x2826, -0x2528, -0x2223, -0x1f19, -0x1c0b, + -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324}; + + ////////////////////////////////////////////////////////////////// + +// Optimised for Performance + const int16 Dsp1::MulTable[256] = { + 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015, + 0x0019, 0x001c, 0x001f, 0x0022, 0x0025, 0x0028, 0x002b, 0x002f, + 0x0032, 0x0035, 0x0038, 0x003b, 0x003e, 0x0041, 0x0045, 0x0048, + 0x004b, 0x004e, 0x0051, 0x0054, 0x0057, 0x005b, 0x005e, 0x0061, + 0x0064, 0x0067, 0x006a, 0x006d, 0x0071, 0x0074, 0x0077, 0x007a, + 0x007d, 0x0080, 0x0083, 0x0087, 0x008a, 0x008d, 0x0090, 0x0093, + 0x0096, 0x0099, 0x009d, 0x00a0, 0x00a3, 0x00a6, 0x00a9, 0x00ac, + 0x00af, 0x00b3, 0x00b6, 0x00b9, 0x00bc, 0x00bf, 0x00c2, 0x00c5, + 0x00c9, 0x00cc, 0x00cf, 0x00d2, 0x00d5, 0x00d8, 0x00db, 0x00df, + 0x00e2, 0x00e5, 0x00e8, 0x00eb, 0x00ee, 0x00f1, 0x00f5, 0x00f8, + 0x00fb, 0x00fe, 0x0101, 0x0104, 0x0107, 0x010b, 0x010e, 0x0111, + 0x0114, 0x0117, 0x011a, 0x011d, 0x0121, 0x0124, 0x0127, 0x012a, + 0x012d, 0x0130, 0x0133, 0x0137, 0x013a, 0x013d, 0x0140, 0x0143, + 0x0146, 0x0149, 0x014d, 0x0150, 0x0153, 0x0156, 0x0159, 0x015c, + 0x015f, 0x0163, 0x0166, 0x0169, 0x016c, 0x016f, 0x0172, 0x0175, + 0x0178, 0x017c, 0x017f, 0x0182, 0x0185, 0x0188, 0x018b, 0x018e, + 0x0192, 0x0195, 0x0198, 0x019b, 0x019e, 0x01a1, 0x01a4, 0x01a8, + 0x01ab, 0x01ae, 0x01b1, 0x01b4, 0x01b7, 0x01ba, 0x01be, 0x01c1, + 0x01c4, 0x01c7, 0x01ca, 0x01cd, 0x01d0, 0x01d4, 0x01d7, 0x01da, + 0x01dd, 0x01e0, 0x01e3, 0x01e6, 0x01ea, 0x01ed, 0x01f0, 0x01f3, + 0x01f6, 0x01f9, 0x01fc, 0x0200, 0x0203, 0x0206, 0x0209, 0x020c, + 0x020f, 0x0212, 0x0216, 0x0219, 0x021c, 0x021f, 0x0222, 0x0225, + 0x0228, 0x022c, 0x022f, 0x0232, 0x0235, 0x0238, 0x023b, 0x023e, + 0x0242, 0x0245, 0x0248, 0x024b, 0x024e, 0x0251, 0x0254, 0x0258, + 0x025b, 0x025e, 0x0261, 0x0264, 0x0267, 0x026a, 0x026e, 0x0271, + 0x0274, 0x0277, 0x027a, 0x027d, 0x0280, 0x0284, 0x0287, 0x028a, + 0x028d, 0x0290, 0x0293, 0x0296, 0x029a, 0x029d, 0x02a0, 0x02a3, + 0x02a6, 0x02a9, 0x02ac, 0x02b0, 0x02b3, 0x02b6, 0x02b9, 0x02bc, + 0x02bf, 0x02c2, 0x02c6, 0x02c9, 0x02cc, 0x02cf, 0x02d2, 0x02d5, + 0x02d8, 0x02db, 0x02df, 0x02e2, 0x02e5, 0x02e8, 0x02eb, 0x02ee, + 0x02f1, 0x02f5, 0x02f8, 0x02fb, 0x02fe, 0x0301, 0x0304, 0x0307, + 0x030b, 0x030e, 0x0311, 0x0314, 0x0317, 0x031a, 0x031d, 0x0321}; + +////////////////////////////////////////////////////////////////// + +// Data ROM, as logged from a DSP-1B with the 0x1f command; +// it contains the tables and constants used by the commands. +// The tables used are: two shift tables (0x022-0x031 and 0x031-0x040 -this last one +// with an error in 0x03c which has survived to all the DSP-1 revisions-); a inverse +// table (used as initial guess) at 0x065-0x0e4; a square root table (used also +// as initial guess) at 0x0e5-0x115; two sin and cos tables (used as nodes to construct +// a interpolation curve) at, respectively, 0x116-0x197 and 0x196-0x215. +// As a curiosity, in the positions 0x21c-0x31c it's contained a +// 257-points arccos table that, apparently, have been not used anywhere +// (maybe for the MaxAZS_Exp table?). + const uint16 Dsp1::DataRom[1024] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, + 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, + 0x4000, 0x7fff, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, + 0x0100, 0x0080, 0x0040, 0x0020, 0x0001, 0x0008, 0x0004, 0x0002, + 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x8000, 0xffe5, 0x0100, 0x7fff, 0x7f02, 0x7e08, + 0x7d12, 0x7c1f, 0x7b30, 0x7a45, 0x795d, 0x7878, 0x7797, 0x76ba, + 0x75df, 0x7507, 0x7433, 0x7361, 0x7293, 0x71c7, 0x70fe, 0x7038, + 0x6f75, 0x6eb4, 0x6df6, 0x6d3a, 0x6c81, 0x6bca, 0x6b16, 0x6a64, + 0x69b4, 0x6907, 0x685b, 0x67b2, 0x670b, 0x6666, 0x65c4, 0x6523, + 0x6484, 0x63e7, 0x634c, 0x62b3, 0x621c, 0x6186, 0x60f2, 0x6060, + 0x5fd0, 0x5f41, 0x5eb5, 0x5e29, 0x5d9f, 0x5d17, 0x5c91, 0x5c0c, + 0x5b88, 0x5b06, 0x5a85, 0x5a06, 0x5988, 0x590b, 0x5890, 0x5816, + 0x579d, 0x5726, 0x56b0, 0x563b, 0x55c8, 0x5555, 0x54e4, 0x5474, + 0x5405, 0x5398, 0x532b, 0x52bf, 0x5255, 0x51ec, 0x5183, 0x511c, + 0x50b6, 0x5050, 0x4fec, 0x4f89, 0x4f26, 0x4ec5, 0x4e64, 0x4e05, + 0x4da6, 0x4d48, 0x4cec, 0x4c90, 0x4c34, 0x4bda, 0x4b81, 0x4b28, + 0x4ad0, 0x4a79, 0x4a23, 0x49cd, 0x4979, 0x4925, 0x48d1, 0x487f, + 0x482d, 0x47dc, 0x478c, 0x473c, 0x46ed, 0x469f, 0x4651, 0x4604, + 0x45b8, 0x456c, 0x4521, 0x44d7, 0x448d, 0x4444, 0x43fc, 0x43b4, + 0x436d, 0x4326, 0x42e0, 0x429a, 0x4255, 0x4211, 0x41cd, 0x4189, + 0x4146, 0x4104, 0x40c2, 0x4081, 0x4040, 0x3fff, 0x41f7, 0x43e1, + 0x45bd, 0x478d, 0x4951, 0x4b0b, 0x4cbb, 0x4e61, 0x4fff, 0x5194, + 0x5322, 0x54a9, 0x5628, 0x57a2, 0x5914, 0x5a81, 0x5be9, 0x5d4a, + 0x5ea7, 0x5fff, 0x6152, 0x62a0, 0x63ea, 0x6530, 0x6672, 0x67b0, + 0x68ea, 0x6a20, 0x6b53, 0x6c83, 0x6daf, 0x6ed9, 0x6fff, 0x7122, + 0x7242, 0x735f, 0x747a, 0x7592, 0x76a7, 0x77ba, 0x78cb, 0x79d9, + 0x7ae5, 0x7bee, 0x7cf5, 0x7dfa, 0x7efe, 0x7fff, 0x0000, 0x0324, + 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, + 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, + 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, + 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, + 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, + 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, + 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, + 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, + 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, + 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, + 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, + 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, + 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, + 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, + 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, + 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x7fff, 0x7ff6, + 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, + 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, + 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, + 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, + 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, + 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, + 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, + 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, + 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, + 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, + 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, + 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, + 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, + 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, + 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, + 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x6488, 0x0080, + 0x03ff, 0x0116, 0x0002, 0x0080, 0x4000, 0x3fd7, 0x3faf, 0x3f86, + 0x3f5d, 0x3f34, 0x3f0c, 0x3ee3, 0x3eba, 0x3e91, 0x3e68, 0x3e40, + 0x3e17, 0x3dee, 0x3dc5, 0x3d9c, 0x3d74, 0x3d4b, 0x3d22, 0x3cf9, + 0x3cd0, 0x3ca7, 0x3c7f, 0x3c56, 0x3c2d, 0x3c04, 0x3bdb, 0x3bb2, + 0x3b89, 0x3b60, 0x3b37, 0x3b0e, 0x3ae5, 0x3abc, 0x3a93, 0x3a69, + 0x3a40, 0x3a17, 0x39ee, 0x39c5, 0x399c, 0x3972, 0x3949, 0x3920, + 0x38f6, 0x38cd, 0x38a4, 0x387a, 0x3851, 0x3827, 0x37fe, 0x37d4, + 0x37aa, 0x3781, 0x3757, 0x372d, 0x3704, 0x36da, 0x36b0, 0x3686, + 0x365c, 0x3632, 0x3609, 0x35df, 0x35b4, 0x358a, 0x3560, 0x3536, + 0x350c, 0x34e1, 0x34b7, 0x348d, 0x3462, 0x3438, 0x340d, 0x33e3, + 0x33b8, 0x338d, 0x3363, 0x3338, 0x330d, 0x32e2, 0x32b7, 0x328c, + 0x3261, 0x3236, 0x320b, 0x31df, 0x31b4, 0x3188, 0x315d, 0x3131, + 0x3106, 0x30da, 0x30ae, 0x3083, 0x3057, 0x302b, 0x2fff, 0x2fd2, + 0x2fa6, 0x2f7a, 0x2f4d, 0x2f21, 0x2ef4, 0x2ec8, 0x2e9b, 0x2e6e, + 0x2e41, 0x2e14, 0x2de7, 0x2dba, 0x2d8d, 0x2d60, 0x2d32, 0x2d05, + 0x2cd7, 0x2ca9, 0x2c7b, 0x2c4d, 0x2c1f, 0x2bf1, 0x2bc3, 0x2b94, + 0x2b66, 0x2b37, 0x2b09, 0x2ada, 0x2aab, 0x2a7c, 0x2a4c, 0x2a1d, + 0x29ed, 0x29be, 0x298e, 0x295e, 0x292e, 0x28fe, 0x28ce, 0x289d, + 0x286d, 0x283c, 0x280b, 0x27da, 0x27a9, 0x2777, 0x2746, 0x2714, + 0x26e2, 0x26b0, 0x267e, 0x264c, 0x2619, 0x25e7, 0x25b4, 0x2581, + 0x254d, 0x251a, 0x24e6, 0x24b2, 0x247e, 0x244a, 0x2415, 0x23e1, + 0x23ac, 0x2376, 0x2341, 0x230b, 0x22d6, 0x229f, 0x2269, 0x2232, + 0x21fc, 0x21c4, 0x218d, 0x2155, 0x211d, 0x20e5, 0x20ad, 0x2074, + 0x203b, 0x2001, 0x1fc7, 0x1f8d, 0x1f53, 0x1f18, 0x1edd, 0x1ea1, + 0x1e66, 0x1e29, 0x1ded, 0x1db0, 0x1d72, 0x1d35, 0x1cf6, 0x1cb8, + 0x1c79, 0x1c39, 0x1bf9, 0x1bb8, 0x1b77, 0x1b36, 0x1af4, 0x1ab1, + 0x1a6e, 0x1a2a, 0x19e6, 0x19a1, 0x195c, 0x1915, 0x18ce, 0x1887, + 0x183f, 0x17f5, 0x17ac, 0x1761, 0x1715, 0x16c9, 0x167c, 0x162e, + 0x15df, 0x158e, 0x153d, 0x14eb, 0x1497, 0x1442, 0x13ec, 0x1395, + 0x133c, 0x12e2, 0x1286, 0x1228, 0x11c9, 0x1167, 0x1104, 0x109e, + 0x1036, 0x0fcc, 0x0f5f, 0x0eef, 0x0e7b, 0x0e04, 0x0d89, 0x0d0a, + 0x0c86, 0x0bfd, 0x0b6d, 0x0ad6, 0x0a36, 0x098d, 0x08d7, 0x0811, + 0x0736, 0x063e, 0x0519, 0x039a, 0x0000, 0x7fff, 0x0100, 0x0080, + 0x021d, 0x00c8, 0x00ce, 0x0048, 0x0a26, 0x277a, 0x00ce, 0x6488, + 0x14ac, 0x0001, 0x00f9, 0x00fc, 0x00ff, 0x00fc, 0x00f9, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; + +////////////////////////////////////////////////////////////////// + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp1/dsp1emu.hpp b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1emu.hpp new file mode 100755 index 0000000000..9ae313acd8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp1/dsp1emu.hpp @@ -0,0 +1,129 @@ +// DSP-1's emulation code +// +// Based on research by Overload, The Dumper, Neviksti and Andreas Naive +// Date: June 2006 + +#ifndef __DSP1EMUL_H +#define __DSP1EMUL_H + +#define DSP1_VERSION 0x0102 + +class Dsp1 +{ + public: + // The DSP-1 status register has 16 bits, but only + // the upper 8 bits can be accessed from an external device, so all these + // positions are referred to the upper byte (bits D8 to D15) + enum SrFlags {DRC=0x04, DRS=0x10, RQM=0x80}; + + // According to Overload's docs, these are the meanings of the flags: + // DRC: The Data Register Control (DRC) bit specifies the data transfer length to and from the host CPU. + // 0: Data transfer to and from the DSP-1 is 16 bits. + // 1: Data transfer to and from the DSP-1 is 8 bits. + // DRS: The Data Register Status (DRS) bit indicates the data transfer status in the case of transfering 16-bit data. + // 0: Data transfer has terminated. + // 1: Data transfer in progress. + // RQM: The Request for Master (RQM) indicates that the DSP1 is requesting host CPU for data read/write. + // 0: Internal Data Register Transfer. + // 1: External Data Register Transfer. + + Dsp1(); + uint8 getSr(); // return the status register's high byte + uint8 getDr(); + void setDr(uint8 iDr); + void reset(); + + void serialize(serializer&); + + private: + enum FsmMajorState {WAIT_COMMAND, READ_DATA, WRITE_DATA}; + enum MaxDataAccesses {MAX_READS=7, MAX_WRITES=1024}; + + struct Command { + void (Dsp1::*callback)(int16 *, int16 *); + unsigned int reads; + unsigned int writes; + }; + + static const Command mCommandTable[]; + static const int16 MaxAZS_Exp[16]; + static const int16 SinTable[]; + static const int16 MulTable[]; + static const uint16 DataRom[]; + + struct SharedData { // some RAM variables shared between commands + int16 MatrixA[3][3]; // attitude matrix A + int16 MatrixB[3][3]; + int16 MatrixC[3][3]; + int16 CentreX, CentreY, CentreZ; // center of projection + int16 CentreZ_C, CentreZ_E; + int16 VOffset; // vertical offset of the screen with regard to the centre of projection + int16 Les, C_Les, E_Les; + int16 SinAas, CosAas; + int16 SinAzs, CosAzs; + int16 SinAZS, CosAZS; + int16 SecAZS_C1, SecAZS_E1; + int16 SecAZS_C2, SecAZS_E2; + int16 Nx, Ny, Nz; // normal vector to the screen (norm 1, points toward the center of projection) + int16 Gx, Gy, Gz; // center of the screen (global coordinates) + int16 Hx, Hy; // horizontal vector of the screen (Hz=0, norm 1, points toward the right of the screen) + int16 Vx, Vy, Vz; // vertical vector of the screen (norm 1, points toward the top of the screen) + + } shared; + + uint8 mSr; // status register + int mSrLowByteAccess; + uint16 mDr; // "internal" representation of the data register + unsigned mFsmMajorState; // current major state of the FSM + uint8 mCommand; // current command processed by the FSM + uint8 mDataCounter; // #uint16 read/writes counter used by the FSM + int16 mReadBuffer[MAX_READS]; + int16 mWriteBuffer[MAX_WRITES]; + bool mFreeze; // need explanation? ;) + + void fsmStep(bool read, uint8 &data); // FSM logic + + // commands + void memoryTest(int16 *input, int16 *output); + void memoryDump(int16 *input, int16 *output); + void memorySize(int16 *input, int16 *output); + void multiply(int16* input, int16* output); + void multiply2(int16* input, int16* output); + void inverse(int16 *input, int16 *output); + void triangle(int16 *input, int16 *output); + void radius(int16 *input, int16 *output); + void range(int16 *input, int16 *output); + void range2(int16 *input, int16 *output); + void distance(int16 *input, int16 *output); + void rotate(int16 *input, int16 *output); + void polar(int16 *input, int16 *output); + void attitudeA(int16 *input, int16 *output); + void attitudeB(int16 *input, int16 *output); + void attitudeC(int16 *input, int16 *output); + void objectiveA(int16 *input, int16 *output); + void objectiveB(int16 *input, int16 *output); + void objectiveC(int16 *input, int16 *output); + void subjectiveA(int16 *input, int16 *output); + void subjectiveB(int16 *input, int16 *output); + void subjectiveC(int16 *input, int16 *output); + void scalarA(int16 *input, int16 *output); + void scalarB(int16 *input, int16 *output); + void scalarC(int16 *input, int16 *output); + void gyrate(int16 *input, int16 *output); + void parameter(int16 *input, int16 *output); + void raster(int16 *input, int16 *output); + void target(int16 *input, int16 *output); + void project(int16 *input, int16 *output); + + // auxiliar functions + int16 sin(int16 Angle); + int16 cos(int16 Angle); + void inverse(int16 Coefficient, int16 Exponent, int16 &iCoefficient, int16 &iExponent); + int16 denormalizeAndClip(int16 C, int16 E); + void normalize(int16 m, int16 &Coefficient, int16 &Exponent); + void normalizeDouble(int32 Product, int16 &Coefficient, int16 &Exponent); + int16 shiftR(int16 C, int16 E); +}; + +#endif + diff --git a/Mednafen/mednafen/snes/src/chip/dsp1/serialization.cpp b/Mednafen/mednafen/snes/src/chip/dsp1/serialization.cpp new file mode 100755 index 0000000000..f7edb38187 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp1/serialization.cpp @@ -0,0 +1,56 @@ +#ifdef DSP1_CPP + +void DSP1::serialize(serializer &s) { + dsp1.serialize(s); +} + +void Dsp1::serialize(serializer &s) { + for(unsigned i = 0; i < 3; i++) { + s.array(shared.MatrixA[i]); + s.array(shared.MatrixB[i]); + s.array(shared.MatrixC[i]); + } + + s.integer(shared.CentreX); + s.integer(shared.CentreY); + s.integer(shared.CentreZ); + s.integer(shared.CentreZ_C); + s.integer(shared.CentreZ_E); + s.integer(shared.VOffset); + s.integer(shared.Les); + s.integer(shared.C_Les); + s.integer(shared.E_Les); + s.integer(shared.SinAas); + s.integer(shared.CosAas); + s.integer(shared.SinAzs); + s.integer(shared.CosAzs); + s.integer(shared.SinAZS); + s.integer(shared.CosAZS); + s.integer(shared.SecAZS_C1); + s.integer(shared.SecAZS_E1); + s.integer(shared.SecAZS_C2); + s.integer(shared.SecAZS_E2); + s.integer(shared.Nx); + s.integer(shared.Ny); + s.integer(shared.Nz); + s.integer(shared.Gx); + s.integer(shared.Gy); + s.integer(shared.Gz); + s.integer(shared.Hx); + s.integer(shared.Hy); + s.integer(shared.Vx); + s.integer(shared.Vy); + s.integer(shared.Vz); + + s.integer(mSr); + s.integer(mSrLowByteAccess); + s.integer(mDr); + s.integer(mFsmMajorState); + s.integer(mCommand); + s.integer(mDataCounter); + s.array(mReadBuffer); + s.array(mWriteBuffer); + s.integer(mFreeze); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp2/dsp2.cpp b/Mednafen/mednafen/snes/src/chip/dsp2/dsp2.cpp new file mode 100755 index 0000000000..a619ba4645 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp2/dsp2.cpp @@ -0,0 +1,149 @@ +#include <../base.hpp> + +#define DSP2_CPP +namespace bSNES_v059 { + +DSP2 dsp2; + +#include "serialization.cpp" +#include "opcodes.cpp" + +void DSP2::init() { +} + +void DSP2::enable() { + bus.map(Bus::MapDirect, 0x20, 0x3f, 0x6000, 0x6fff, *this); + bus.map(Bus::MapDirect, 0x20, 0x3f, 0x8000, 0xbfff, *this); + bus.map(Bus::MapDirect, 0xa0, 0xbf, 0x6000, 0x6fff, *this); + bus.map(Bus::MapDirect, 0xa0, 0xbf, 0x8000, 0xbfff, *this); +} + +void DSP2::power() { + reset(); +} + +void DSP2::reset() { + status.waiting_for_command = true; + status.in_count = 0; + status.in_index = 0; + status.out_count = 0; + status.out_index = 0; + + status.op05transparent = 0; + status.op05haslen = false; + status.op05len = 0; + status.op06haslen = false; + status.op06len = 0; + status.op09word1 = 0; + status.op09word2 = 0; + status.op0dhaslen = false; + status.op0doutlen = 0; + status.op0dinlen = 0; +} + +uint8 DSP2::read(unsigned addr) { + uint8 r = 0xff; + if(status.out_count) { + r = status.output[status.out_index++]; + status.out_index &= 511; + if(status.out_count == status.out_index) { + status.out_count = 0; + } + } + return r; +} + +void DSP2::write(unsigned addr, uint8 data) { + if(status.waiting_for_command) { + status.command = data; + status.in_index = 0; + status.waiting_for_command = false; + + switch(data) { + case 0x01: status.in_count = 32; break; + case 0x03: status.in_count = 1; break; + case 0x05: status.in_count = 1; break; + case 0x06: status.in_count = 1; break; + case 0x07: break; + case 0x08: break; + case 0x09: status.in_count = 4; break; + case 0x0d: status.in_count = 2; break; + case 0x0f: status.in_count = 0; break; + } + } else { + status.parameters[status.in_index++] = data; + status.in_index &= 511; + } + + if(status.in_count == status.in_index) { + status.waiting_for_command = true; + status.out_index = 0; + switch(status.command) { + case 0x01: { + status.out_count = 32; + op01(); + } break; + + case 0x03: { + op03(); + } break; + + case 0x05: { + if(status.op05haslen) { + status.op05haslen = false; + status.out_count = status.op05len; + op05(); + } else { + status.op05len = status.parameters[0]; + status.in_index = 0; + status.in_count = status.op05len * 2; + status.op05haslen = true; + if(data)status.waiting_for_command = false; + } + } break; + + case 0x06: { + if(status.op06haslen) { + status.op06haslen = false; + status.out_count = status.op06len; + op06(); + } else { + status.op06len = status.parameters[0]; + status.in_index = 0; + status.in_count = status.op06len; + status.op06haslen = true; + if(data)status.waiting_for_command = false; + } + } break; + + case 0x07: break; + case 0x08: break; + + case 0x09: { + op09(); + } break; + + case 0x0d: { + if(status.op0dhaslen) { + status.op0dhaslen = false; + status.out_count = status.op0doutlen; + op0d(); + } else { + status.op0dinlen = status.parameters[0]; + status.op0doutlen = status.parameters[1]; + status.in_index = 0; + status.in_count = (status.op0dinlen + 1) >> 1; + status.op0dhaslen = true; + if(data)status.waiting_for_command = false; + } + } break; + + case 0x0f: break; + } + } +} + +DSP2::DSP2() {} +DSP2::~DSP2() {} +}; + diff --git a/Mednafen/mednafen/snes/src/chip/dsp2/dsp2.hpp b/Mednafen/mednafen/snes/src/chip/dsp2/dsp2.hpp new file mode 100755 index 0000000000..10a6a238ca --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp2/dsp2.hpp @@ -0,0 +1,45 @@ +class DSP2 : public Memory { +public: + struct { + bool waiting_for_command; + unsigned command; + unsigned in_count, in_index; + unsigned out_count, out_index; + + uint8 parameters[512]; + uint8 output[512]; + + uint8 op05transparent; + bool op05haslen; + int op05len; + bool op06haslen; + int op06len; + uint16 op09word1; + uint16 op09word2; + bool op0dhaslen; + int op0doutlen; + int op0dinlen; + } status; + + void init(); + void enable(); + void power(); + void reset(); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + void serialize(serializer&); + DSP2(); + ~DSP2(); + +protected: + void op01(); + void op03(); + void op05(); + void op06(); + void op09(); + void op0d(); +}; + +extern DSP2 dsp2; diff --git a/Mednafen/mednafen/snes/src/chip/dsp2/opcodes.cpp b/Mednafen/mednafen/snes/src/chip/dsp2/opcodes.cpp new file mode 100755 index 0000000000..f015ac32ca --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp2/opcodes.cpp @@ -0,0 +1,177 @@ +#ifdef DSP2_CPP + +//convert bitmap to bitplane tile +void DSP2::op01() { +//op01 size is always 32 bytes input and output +//the hardware does strange things if you vary the size + +unsigned char c0, c1, c2, c3; +unsigned char *p1 = status.parameters; +unsigned char *p2a = status.output; +unsigned char *p2b = status.output + 16; //halfway + +//process 8 blocks of 4 bytes each + for(int j = 0; j < 8; j++) { + c0 = *p1++; + c1 = *p1++; + c2 = *p1++; + c3 = *p1++; + + *p2a++ = (c0 & 0x10) << 3 | + (c0 & 0x01) << 6 | + (c1 & 0x10) << 1 | + (c1 & 0x01) << 4 | + (c2 & 0x10) >> 1 | + (c2 & 0x01) << 2 | + (c3 & 0x10) >> 3 | + (c3 & 0x01); + + *p2a++ = (c0 & 0x20) << 2 | + (c0 & 0x02) << 5 | + (c1 & 0x20) | + (c1 & 0x02) << 3 | + (c2 & 0x20) >> 2 | + (c2 & 0x02) << 1 | + (c3 & 0x20) >> 4 | + (c3 & 0x02) >> 1; + + *p2b++ = (c0 & 0x40) << 1 | + (c0 & 0x04) << 4 | + (c1 & 0x40) >> 1 | + (c1 & 0x04) << 2 | + (c2 & 0x40) >> 3 | + (c2 & 0x04) | + (c3 & 0x40) >> 5 | + (c3 & 0x04) >> 2; + + *p2b++ = (c0 & 0x80) | + (c0 & 0x08) << 3 | + (c1 & 0x80) >> 2 | + (c1 & 0x08) << 1 | + (c2 & 0x80) >> 4 | + (c2 & 0x08) >> 1 | + (c3 & 0x80) >> 6 | + (c3 & 0x08) >> 3; + } +} + +//set transparent color +void DSP2::op03() { + status.op05transparent = status.parameters[0]; +} + +//replace bitmap using transparent color +void DSP2::op05() { +uint8 color; +// Overlay bitmap with transparency. +// Input: +// +// Bitmap 1: i[0] <=> i[size-1] +// Bitmap 2: i[size] <=> i[2*size-1] +// +// Output: +// +// Bitmap 3: o[0] <=> o[size-1] +// +// Processing: +// +// Process all 4-bit pixels (nibbles) in the bitmap +// +// if ( BM2_pixel == transparent_color ) +// pixelout = BM1_pixel +// else +// pixelout = BM2_pixel + +// The max size bitmap is limited to 255 because the size parameter is a byte +// I think size=0 is an error. The behavior of the chip on size=0 is to +// return the last value written to DR if you read DR on Op05 with +// size = 0. I don't think it's worth implementing this quirk unless it's +// proven necessary. + +unsigned char c1, c2; +unsigned char *p1 = status.parameters; +unsigned char *p2 = status.parameters + status.op05len; +unsigned char *p3 = status.output; + + color = status.op05transparent & 0x0f; + + for(int n = 0; n < status.op05len; n++) { + c1 = *p1++; + c2 = *p2++; + *p3++ = ( ((c2 >> 4) == color ) ? c1 & 0xf0 : c2 & 0xf0 ) | + ( ((c2 & 0x0f) == color ) ? c1 & 0x0f : c2 & 0x0f ); + } +} + +//reverse bitmap +void DSP2::op06() { +// Input: +// size +// bitmap + +int i, j; + for(i = 0, j = status.op06len - 1; i < status.op06len; i++, j--) { + status.output[j] = (status.parameters[i] << 4) | (status.parameters[i] >> 4); + } +} + +//multiply +void DSP2::op09() { + status.out_count = 4; + + status.op09word1 = status.parameters[0] | (status.parameters[1] << 8); + status.op09word2 = status.parameters[2] | (status.parameters[3] << 8); + +uint32 r; + r = status.op09word1 * status.op09word2; + status.output[0] = r; + status.output[1] = r >> 8; + status.output[2] = r >> 16; + status.output[3] = r >> 24; +} + +//scale bitmap +void DSP2::op0d() { +// Bit accurate hardware algorithm - uses fixed point math +// This should match the DSP2 Op0D output exactly +// I wouldn't recommend using this unless you're doing hardware debug. +// In some situations it has small visual artifacts that +// are not readily apparent on a TV screen but show up clearly +// on a monitor. Use Overload's scaling instead. +// This is for hardware verification testing. +// +// One note: the HW can do odd byte scaling but since we divide +// by two to get the count of bytes this won't work well for +// odd byte scaling (in any of the current algorithm implementations). +// So far I haven't seen Dungeon Master use it. +// If it does we can adjust the parameters and code to work with it + +uint32 multiplier; // Any size int >= 32-bits +uint32 pixloc; // match size of multiplier +int i, j; +uint8 pixelarray[512]; + if(status.op0dinlen <= status.op0doutlen) { + multiplier = 0x10000; // In our self defined fixed point 0x10000 == 1 + } else { + multiplier = (status.op0dinlen << 17) / ((status.op0doutlen << 1) + 1); + } + + pixloc = 0; + for(i = 0; i < status.op0doutlen * 2; i++) { + j = pixloc >> 16; + + if(j & 1) { + pixelarray[i] = (status.parameters[j >> 1] & 0x0f); + } else { + pixelarray[i] = (status.parameters[j >> 1] & 0xf0) >> 4; + } + + pixloc += multiplier; + } + + for(i = 0; i < status.op0doutlen; i++) { + status.output[i] = (pixelarray[i << 1] << 4) | pixelarray[(i << 1) + 1]; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp2/serialization.cpp b/Mednafen/mednafen/snes/src/chip/dsp2/serialization.cpp new file mode 100755 index 0000000000..d089b0fe0e --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp2/serialization.cpp @@ -0,0 +1,26 @@ +#ifdef DSP2_CPP + +void DSP2::serialize(serializer &s) { + s.integer(status.waiting_for_command); + s.integer(status.command); + s.integer(status.in_count); + s.integer(status.in_index); + s.integer(status.out_count); + s.integer(status.out_index); + + s.array(status.parameters); + s.array(status.output); + + s.integer(status.op05transparent); + s.integer(status.op05haslen); + s.integer(status.op05len); + s.integer(status.op06haslen); + s.integer(status.op06len); + s.integer(status.op09word1); + s.integer(status.op09word2); + s.integer(status.op0dhaslen); + s.integer(status.op0doutlen); + s.integer(status.op0dinlen); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp3/dsp3.cpp b/Mednafen/mednafen/snes/src/chip/dsp3/dsp3.cpp new file mode 100755 index 0000000000..122be4748f --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp3/dsp3.cpp @@ -0,0 +1,42 @@ +#include <../base.hpp> + +#define DSP3_CPP +namespace bSNES_v059 { + +DSP3 dsp3; + +namespace DSP3i { + #define bool8 uint8 + #include "dsp3emu.c" + #undef bool8 +}; + +void DSP3::init() { +} + +void DSP3::enable() { + bus.map(Bus::MapDirect, 0x20, 0x3f, 0x8000, 0xffff, *this); + bus.map(Bus::MapDirect, 0xa0, 0xbf, 0x8000, 0xffff, *this); +} + +void DSP3::power() { + reset(); +} + +void DSP3::reset() { + DSP3i::DSP3_Reset(); +} + +uint8 DSP3::read(unsigned addr) { + DSP3i::dsp3_address = addr & 0xffff; + DSP3i::DSP3GetByte(); + return DSP3i::dsp3_byte; +} + +void DSP3::write(unsigned addr, uint8 data) { + DSP3i::dsp3_address = addr & 0xffff; + DSP3i::dsp3_byte = data; + DSP3i::DSP3SetByte(); +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/dsp3/dsp3.hpp b/Mednafen/mednafen/snes/src/chip/dsp3/dsp3.hpp new file mode 100755 index 0000000000..b3353e3342 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp3/dsp3.hpp @@ -0,0 +1,12 @@ +class DSP3 : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 read (unsigned addr); + void write(unsigned addr, uint8 data); +}; + +extern DSP3 dsp3; diff --git a/Mednafen/mednafen/snes/src/chip/dsp3/dsp3emu.c b/Mednafen/mednafen/snes/src/chip/dsp3/dsp3emu.c new file mode 100755 index 0000000000..9e6567764a --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp3/dsp3emu.c @@ -0,0 +1,1146 @@ +#ifdef DSP3_CPP + +//DSP-3 emulator code +//Copyright (c) 2003-2006 John Weidman, Kris Bleakley, Lancer, z80 gaiden + +uint16 DSP3_DataROM[1024] = { + 0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, + 0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001, + 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, + 0x0000, 0x000f, 0x0400, 0x0200, 0x0140, 0x0400, 0x0200, 0x0040, + 0x007d, 0x007e, 0x007e, 0x007b, 0x007c, 0x007d, 0x007b, 0x007c, + 0x0002, 0x0020, 0x0030, 0x0000, 0x000d, 0x0019, 0x0026, 0x0032, + 0x003e, 0x004a, 0x0056, 0x0062, 0x006d, 0x0079, 0x0084, 0x008e, + 0x0098, 0x00a2, 0x00ac, 0x00b5, 0x00be, 0x00c6, 0x00ce, 0x00d5, + 0x00dc, 0x00e2, 0x00e7, 0x00ec, 0x00f1, 0x00f5, 0x00f8, 0x00fb, + 0x00fd, 0x00ff, 0x0100, 0x0100, 0x0100, 0x00ff, 0x00fd, 0x00fb, + 0x00f8, 0x00f5, 0x00f1, 0x00ed, 0x00e7, 0x00e2, 0x00dc, 0x00d5, + 0x00ce, 0x00c6, 0x00be, 0x00b5, 0x00ac, 0x00a2, 0x0099, 0x008e, + 0x0084, 0x0079, 0x006e, 0x0062, 0x0056, 0x004a, 0x003e, 0x0032, + 0x0026, 0x0019, 0x000d, 0x0000, 0xfff3, 0xffe7, 0xffdb, 0xffce, + 0xffc2, 0xffb6, 0xffaa, 0xff9e, 0xff93, 0xff87, 0xff7d, 0xff72, + 0xff68, 0xff5e, 0xff54, 0xff4b, 0xff42, 0xff3a, 0xff32, 0xff2b, + 0xff25, 0xff1e, 0xff19, 0xff14, 0xff0f, 0xff0b, 0xff08, 0xff05, + 0xff03, 0xff01, 0xff00, 0xff00, 0xff00, 0xff01, 0xff03, 0xff05, + 0xff08, 0xff0b, 0xff0f, 0xff13, 0xff18, 0xff1e, 0xff24, 0xff2b, + 0xff32, 0xff3a, 0xff42, 0xff4b, 0xff54, 0xff5d, 0xff67, 0xff72, + 0xff7c, 0xff87, 0xff92, 0xff9e, 0xffa9, 0xffb5, 0xffc2, 0xffce, + 0xffda, 0xffe7, 0xfff3, 0x002b, 0x007f, 0x0020, 0x00ff, 0xff00, + 0xffbe, 0x0000, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffc1, 0x0001, 0x0002, 0x0045, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc5, 0x0003, 0x0004, 0x0005, 0x0047, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffca, 0x0006, 0x0007, 0x0008, + 0x0009, 0x004a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffd0, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x004e, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd7, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0x0053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffdf, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0x0059, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffe8, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0x0060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfff2, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, + 0x002b, 0x002c, 0x0068, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfffd, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0071, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc7, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, + 0x003e, 0x003f, 0x0040, 0x0041, 0x007b, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd4, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffe2, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, + 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0050, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfff1, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffcb, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, + 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0x006b, 0x0000, 0x0000, 0x0000, 0xffdc, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0044, 0x0000, 0x0000, + 0xffee, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, + 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0054, 0x0000, 0xffee, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, + 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0065, + 0xffbe, 0x0000, 0xfeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffc1, 0x0001, 0x0002, 0xfead, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc5, 0x0003, 0x0004, 0x0005, 0xfeaf, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffca, 0x0006, 0x0007, 0x0008, + 0x0009, 0xfeb2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffd0, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0xfeb6, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd7, 0x000f, 0x0010, 0x0011, + 0x0012, 0x0013, 0x0014, 0xfebb, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffdf, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, + 0xfec1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffe8, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, 0xfec8, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xfff2, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, + 0x002b, 0x002c, 0xfed0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfffd, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0xfed9, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffc7, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, + 0x003e, 0x003f, 0x0040, 0x0041, 0xfee3, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xffd4, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0xfeac, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffe2, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, + 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0xfeb8, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xfff1, 0x0019, 0x001a, 0x001b, + 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0xfec5, 0x0000, 0x0000, 0x0000, 0x0000, + 0xffcb, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, + 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, + 0xfed3, 0x0000, 0x0000, 0x0000, 0xffdc, 0x0000, 0x0001, 0x0002, + 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, + 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0xfeac, 0x0000, 0x0000, + 0xffee, 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, + 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, + 0x001f, 0x0020, 0xfebc, 0x0000, 0xffee, 0x0021, 0x0022, 0x0023, + 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, + 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0xfecd, + 0x0154, 0x0218, 0x0110, 0x00b0, 0x00cc, 0x00b0, 0x0088, 0x00b0, + 0x0044, 0x00b0, 0x0000, 0x00b0, 0x00fe, 0xff07, 0x0002, 0x00ff, + 0x00f8, 0x0007, 0x00fe, 0x00ee, 0x07ff, 0x0200, 0x00ef, 0xf800, + 0x0700, 0x00ee, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0001, + 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, + 0xffff, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, + 0x0000, 0xffff, 0xffff, 0x0000, 0xffff, 0x0001, 0x0000, 0x0001, + 0x0001, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0x0000, + 0xffff, 0x0001, 0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0xffff, + 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0044, 0x0088, 0x00cc, + 0x0110, 0x0154, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + +void (*SetDSP3)(); +void DSP3_Command(); + +uint16 DSP3_DR; +uint16 DSP3_SR; +uint16 DSP3_MemoryIndex; + +void DSP3_Reset() +{ + DSP3_DR = 0x0080; + DSP3_SR = 0x0084; + SetDSP3 = &DSP3_Command; +} + +void DSP3_MemorySize() +{ + DSP3_DR = 0x0300; + SetDSP3 = &DSP3_Reset; +} + +void DSP3_TestMemory() +{ + DSP3_DR = 0x0000; + SetDSP3 = &DSP3_Reset; +} + +void DSP3_DumpDataROM() +{ + DSP3_DR = DSP3_DataROM[DSP3_MemoryIndex++]; + if (DSP3_MemoryIndex == 1024) + SetDSP3 = &DSP3_Reset; +} + +void DSP3_MemoryDump() +{ + DSP3_MemoryIndex = 0; + SetDSP3 = &DSP3_DumpDataROM; + DSP3_DumpDataROM(); +} + +int16 DSP3_WinLo; +int16 DSP3_WinHi; + +void DSP3_OP06() +{ + DSP3_WinLo = (uint8)(DSP3_DR); + DSP3_WinHi = (uint8)(DSP3_DR >> 8); + DSP3_Reset(); +} + +void DSP3_OP03() +{ + int16 Lo = (uint8)(DSP3_DR); + int16 Hi = (uint8)(DSP3_DR >> 8); + int16 Ofs = (DSP3_WinLo * Hi << 1) + (Lo << 1); + DSP3_DR = Ofs >> 1; + SetDSP3 = &DSP3_Reset; +} + +int16 DSP3_AddLo; +int16 DSP3_AddHi; + +void DSP3_OP07_B() +{ + int16 Ofs = (DSP3_WinLo * DSP3_AddHi << 1) + (DSP3_AddLo << 1); + DSP3_DR = Ofs >> 1; + SetDSP3 = &DSP3_Reset; +} + +void DSP3_OP07_A() +{ + int16 Lo = (uint8)(DSP3_DR); + int16 Hi = (uint8)(DSP3_DR >> 8); + + if (Lo & 1) Hi += (DSP3_AddLo & 1); + + DSP3_AddLo += Lo; + DSP3_AddHi += Hi; + + if (DSP3_AddLo < 0) + DSP3_AddLo += DSP3_WinLo; + else + if (DSP3_AddLo >= DSP3_WinLo) + DSP3_AddLo -= DSP3_WinLo; + + if (DSP3_AddHi < 0) + DSP3_AddHi += DSP3_WinHi; + else + if (DSP3_AddHi >= DSP3_WinHi) + DSP3_AddHi -= DSP3_WinHi; + + DSP3_DR = DSP3_AddLo | (DSP3_AddHi << 8) | ((DSP3_AddHi >> 8) & 0xff); + SetDSP3 = &DSP3_OP07_B; +} + +void DSP3_OP07() +{ + uint32 dataOfs = ((DSP3_DR << 1) + 0x03b2) & 0x03ff; + + DSP3_AddHi = DSP3_DataROM[dataOfs]; + DSP3_AddLo = DSP3_DataROM[dataOfs + 1]; + + SetDSP3 = &DSP3_OP07_A; + DSP3_SR = 0x0080; +} + +uint16 DSP3_Codewords; +uint16 DSP3_Outwords; +uint16 DSP3_Symbol; +uint16 DSP3_BitCount; +uint16 DSP3_Index; +uint16 DSP3_Codes[512]; +uint16 DSP3_BitsLeft; +uint16 DSP3_ReqBits; +uint16 DSP3_ReqData; +uint16 DSP3_BitCommand; +uint8 DSP3_BaseLength; +uint16 DSP3_BaseCodes; +uint16 DSP3_BaseCode; +uint8 DSP3_CodeLengths[8]; +uint16 DSP3_CodeOffsets[8]; +uint16 DSP3_LZCode; +uint8 DSP3_LZLength; + +uint16 DSP3_X; +uint16 DSP3_Y; + +void DSP3_Coordinate() +{ + DSP3_Index++; + + switch (DSP3_Index) + { + case 3: + { + if (DSP3_DR == 0xffff) + DSP3_Reset(); + break; + } + case 4: + { + DSP3_X = DSP3_DR; + break; + } + case 5: + { + DSP3_Y = DSP3_DR; + DSP3_DR = 1; + break; + } + case 6: + { + DSP3_DR = DSP3_X; + break; + } + case 7: + { + DSP3_DR = DSP3_Y; + DSP3_Index = 0; + break; + } + } +} + +uint8 DSP3_Bitmap[8]; +uint8 DSP3_Bitplane[8]; +uint16 DSP3_BMIndex; +uint16 DSP3_BPIndex; +uint16 DSP3_Count; + +void DSP3_Convert_A() +{ + if (DSP3_BMIndex < 8) + { + DSP3_Bitmap[DSP3_BMIndex++] = (uint8) (DSP3_DR); + DSP3_Bitmap[DSP3_BMIndex++] = (uint8) (DSP3_DR >> 8); + + if (DSP3_BMIndex == 8) + { + short i, j; + for (i=0; i < 8; i++) + for (j=0; j < 8; j++) + { + DSP3_Bitplane[j] <<= 1; + DSP3_Bitplane[j] |= (DSP3_Bitmap[i] >> j) & 1; + } + + DSP3_BPIndex = 0; + DSP3_Count--; + } + } + + if (DSP3_BMIndex == 8) + { + if (DSP3_BPIndex == 8) + { + if (!DSP3_Count) DSP3_Reset(); + DSP3_BMIndex = 0; + } + else + { + DSP3_DR = DSP3_Bitplane[DSP3_BPIndex++]; + DSP3_DR |= DSP3_Bitplane[DSP3_BPIndex++] << 8; + } + } +} + +void DSP3_Convert() +{ + DSP3_Count = DSP3_DR; + DSP3_BMIndex = 0; + SetDSP3 = &DSP3_Convert_A; +} + +bool DSP3_GetBits(uint8 Count) +{ + if (!DSP3_BitsLeft) + { + DSP3_BitsLeft = Count; + DSP3_ReqBits = 0; + } + + do { + if (!DSP3_BitCount) + { + DSP3_SR = 0xC0; + return false; + } + + DSP3_ReqBits <<= 1; + if (DSP3_ReqData & 0x8000) DSP3_ReqBits++; + DSP3_ReqData <<= 1; + + DSP3_BitCount--; + DSP3_BitsLeft--; + + } while (DSP3_BitsLeft); + + return true; +} + +void DSP3_Decode_Data() +{ + if (!DSP3_BitCount) + { + if (DSP3_SR & 0x40) + { + DSP3_ReqData = DSP3_DR; + DSP3_BitCount += 16; + } + else + { + DSP3_SR = 0xC0; + return; + } + } + + if (DSP3_LZCode == 1) + { + if (!DSP3_GetBits(1)) + return; + + if (DSP3_ReqBits) + DSP3_LZLength = 12; + else + DSP3_LZLength = 8; + + DSP3_LZCode++; + } + + if (DSP3_LZCode == 2) + { + if (!DSP3_GetBits(DSP3_LZLength)) + return; + + DSP3_LZCode = 0; + DSP3_Outwords--; + if (!DSP3_Outwords) SetDSP3 = &DSP3_Reset; + + DSP3_SR = 0x80; + DSP3_DR = DSP3_ReqBits; + return; + } + + if (DSP3_BaseCode == 0xffff) + { + if (!DSP3_GetBits(DSP3_BaseLength)) + return; + + DSP3_BaseCode = DSP3_ReqBits; + } + + if (!DSP3_GetBits(DSP3_CodeLengths[DSP3_BaseCode])) + return; + + DSP3_Symbol = DSP3_Codes[DSP3_CodeOffsets[DSP3_BaseCode] + DSP3_ReqBits]; + DSP3_BaseCode = 0xffff; + + if (DSP3_Symbol & 0xff00) + { + DSP3_Symbol += 0x7f02; + DSP3_LZCode++; + } + else + { + DSP3_Outwords--; + if (!DSP3_Outwords) + SetDSP3 = &DSP3_Reset; + } + + DSP3_SR = 0x80; + DSP3_DR = DSP3_Symbol; +} + +void DSP3_Decode_Tree() +{ + if (!DSP3_BitCount) + { + DSP3_ReqData = DSP3_DR; + DSP3_BitCount += 16; + } + + if (!DSP3_BaseCodes) + { + DSP3_GetBits(1); + if (DSP3_ReqBits) + { + DSP3_BaseLength = 3; + DSP3_BaseCodes = 8; + } + else + { + DSP3_BaseLength = 2; + DSP3_BaseCodes = 4; + } + } + + while (DSP3_BaseCodes) + { + if (!DSP3_GetBits(3)) + return; + + DSP3_ReqBits++; + + DSP3_CodeLengths[DSP3_Index] = (uint8) DSP3_ReqBits; + DSP3_CodeOffsets[DSP3_Index] = DSP3_Symbol; + DSP3_Index++; + + DSP3_Symbol += 1 << DSP3_ReqBits; + DSP3_BaseCodes--; + } + + DSP3_BaseCode = 0xffff; + DSP3_LZCode = 0; + + SetDSP3 = &DSP3_Decode_Data; + if (DSP3_BitCount) DSP3_Decode_Data(); +} + +void DSP3_Decode_Symbols() +{ + DSP3_ReqData = DSP3_DR; + DSP3_BitCount += 16; + + do { + + if (DSP3_BitCommand == 0xffff) + { + if (!DSP3_GetBits(2)) return; + DSP3_BitCommand = DSP3_ReqBits; + } + + switch (DSP3_BitCommand) + { + case 0: + { + if (!DSP3_GetBits(9)) return; + DSP3_Symbol = DSP3_ReqBits; + break; + } + case 1: + { + DSP3_Symbol++; + break; + } + case 2: + { + if (!DSP3_GetBits(1)) return; + DSP3_Symbol += 2 + DSP3_ReqBits; + break; + } + case 3: + { + if (!DSP3_GetBits(4)) return; + DSP3_Symbol += 4 + DSP3_ReqBits; + break; + } + } + + DSP3_BitCommand = 0xffff; + + DSP3_Codes[DSP3_Index++] = DSP3_Symbol; + DSP3_Codewords--; + + } while (DSP3_Codewords); + + DSP3_Index = 0; + DSP3_Symbol = 0; + DSP3_BaseCodes = 0; + + SetDSP3 = &DSP3_Decode_Tree; + if (DSP3_BitCount) DSP3_Decode_Tree(); +} + +void DSP3_Decode_A() +{ + DSP3_Outwords = DSP3_DR; + SetDSP3 = &DSP3_Decode_Symbols; + DSP3_BitCount = 0; + DSP3_BitsLeft = 0; + DSP3_Symbol = 0; + DSP3_Index = 0; + DSP3_BitCommand = 0xffff; + DSP3_SR = 0xC0; +} + +void DSP3_Decode() +{ + DSP3_Codewords = DSP3_DR; + SetDSP3 = &DSP3_Decode_A; +} + + +// Opcodes 1E/3E bit-perfect to 'dsp3-intro' log +// src: adapted from SD Gundam X/G-Next + +int16 op3e_x; +int16 op3e_y; + +int16 op1e_terrain[0x2000]; +int16 op1e_cost[0x2000]; +int16 op1e_weight[0x2000]; + +int16 op1e_cell; +int16 op1e_turn; +int16 op1e_search; + +int16 op1e_x; +int16 op1e_y; + +int16 op1e_min_radius; +int16 op1e_max_radius; + +int16 op1e_max_search_radius; +int16 op1e_max_path_radius; + +int16 op1e_lcv_radius; +int16 op1e_lcv_steps; +int16 op1e_lcv_turns; + +void DSP3_OP3E() +{ + op3e_x = (uint8)(DSP3_DR & 0x00ff); + op3e_y = (uint8)((DSP3_DR & 0xff00)>>8); + + DSP3_OP03(); + + op1e_terrain[ DSP3_DR ] = 0x00; + op1e_cost[ DSP3_DR ] = 0xff; + op1e_weight[ DSP3_DR ] = 0; + + op1e_max_search_radius = 0; + op1e_max_path_radius = 0; +} + +void DSP3_OP1E_A(); +void DSP3_OP1E_A1(); +void DSP3_OP1E_A2(); +void DSP3_OP1E_A3(); + +void DSP3_OP1E_B(); +void DSP3_OP1E_B1(); +void DSP3_OP1E_B2(); + +void DSP3_OP1E_C(); +void DSP3_OP1E_C1(); +void DSP3_OP1E_C2(); + +void DSP3_OP1E_D( int16, int16 *, int16 * ); +void DSP3_OP1E_D1( int16 move, int16 *lo, int16 *hi ); + +void DSP3_OP1E() +{ + int lcv; + + op1e_min_radius = (uint8)(DSP3_DR & 0x00ff); + op1e_max_radius = (uint8)((DSP3_DR & 0xff00)>>8); + + if( op1e_min_radius == 0 ) + op1e_min_radius++; + + if( op1e_max_search_radius >= op1e_min_radius ) + op1e_min_radius = op1e_max_search_radius+1; + + if( op1e_max_radius > op1e_max_search_radius ) + op1e_max_search_radius = op1e_max_radius; + + op1e_lcv_radius = op1e_min_radius; + op1e_lcv_steps = op1e_min_radius; + + op1e_lcv_turns = 6; + op1e_turn = 0; + + op1e_x = op3e_x; + op1e_y = op3e_y; + + for( lcv = 0; lcv < op1e_min_radius; lcv++ ) + DSP3_OP1E_D( op1e_turn, &op1e_x, &op1e_y ); + + DSP3_OP1E_A(); +} + +void DSP3_OP1E_A() +{ + int lcv; + + if( op1e_lcv_steps == 0 ) { + op1e_lcv_radius++; + + op1e_lcv_steps = op1e_lcv_radius; + + op1e_x = op3e_x; + op1e_y = op3e_y; + + for( lcv = 0; lcv < op1e_lcv_radius; lcv++ ) + DSP3_OP1E_D( op1e_turn, &op1e_x, &op1e_y ); + } + + if( op1e_lcv_radius > op1e_max_radius ) { + op1e_turn++; + op1e_lcv_turns--; + + op1e_lcv_radius = op1e_min_radius; + op1e_lcv_steps = op1e_min_radius; + + op1e_x = op3e_x; + op1e_y = op3e_y; + + for( lcv = 0; lcv < op1e_min_radius; lcv++ ) + DSP3_OP1E_D( op1e_turn, &op1e_x, &op1e_y ); + } + + if( op1e_lcv_turns == 0 ) { + DSP3_DR = 0xffff; + DSP3_SR = 0x0080; + SetDSP3 = &DSP3_OP1E_B; + return; + } + + DSP3_DR = (uint8)(op1e_x) | ((uint8)(op1e_y)<<8); + DSP3_OP03(); + + op1e_cell = DSP3_DR; + + DSP3_SR = 0x0080; + SetDSP3 = &DSP3_OP1E_A1; +} + +void DSP3_OP1E_A1() +{ + DSP3_SR = 0x0084; + SetDSP3 = &DSP3_OP1E_A2; +} + +void DSP3_OP1E_A2() +{ + op1e_terrain[ op1e_cell ] = (uint8)(DSP3_DR & 0x00ff); + + DSP3_SR = 0x0084; + SetDSP3 = &DSP3_OP1E_A3; +} + +void DSP3_OP1E_A3() +{ + op1e_cost[ op1e_cell ] = (uint8)(DSP3_DR & 0x00ff); + + if( op1e_lcv_radius == 1 ) { + if( op1e_terrain[ op1e_cell ] & 1 ) { + op1e_weight[ op1e_cell ] = 0xff; + } else { + op1e_weight[ op1e_cell ] = op1e_cost[ op1e_cell ]; + } + } + else { + op1e_weight[ op1e_cell ] = 0xff; + } + + DSP3_OP1E_D( (int16)(op1e_turn+2), &op1e_x, &op1e_y ); + op1e_lcv_steps--; + + DSP3_SR = 0x0080; + DSP3_OP1E_A(); +} + + +void DSP3_OP1E_B() +{ + op1e_x = op3e_x; + op1e_y = op3e_y; + op1e_lcv_radius = 1; + + op1e_search = 0; + + DSP3_OP1E_B1(); + + SetDSP3 = &DSP3_OP1E_C; +} + + +void DSP3_OP1E_B1() +{ + while( op1e_lcv_radius < op1e_max_radius ) { + op1e_y--; + + op1e_lcv_turns = 6; + op1e_turn = 5; + + while( op1e_lcv_turns ) { + op1e_lcv_steps = op1e_lcv_radius; + + while( op1e_lcv_steps ) { + DSP3_OP1E_D1( op1e_turn, &op1e_x, &op1e_y ); + + if( 0 <= op1e_y && op1e_y < DSP3_WinHi && + 0 <= op1e_x && op1e_x < DSP3_WinLo ) { + DSP3_DR = (uint8)(op1e_x) | ((uint8)(op1e_y)<<8); + DSP3_OP03(); + + op1e_cell = DSP3_DR; + if( op1e_cost[ op1e_cell ] < 0x80 && + op1e_terrain[ op1e_cell ] < 0x40 ) { + DSP3_OP1E_B2(); + } // end cell perimeter + } + + op1e_lcv_steps--; + } // end search line + + op1e_turn--; + if( op1e_turn == 0 ) op1e_turn = 6; + + op1e_lcv_turns--; + } // end circle search + + op1e_lcv_radius++; + } // end radius search +} + + +void DSP3_OP1E_B2() +{ + int16 cell; + int16 path; + int16 x,y; + int16 lcv_turns; + + path = 0xff; + lcv_turns = 6; + + while( lcv_turns ) { + x = op1e_x; + y = op1e_y; + + DSP3_OP1E_D1( lcv_turns, &x, &y ); + + DSP3_DR = (uint8)(x) | ((uint8)(y)<<8); + DSP3_OP03(); + + cell = DSP3_DR; + + if( 0 <= y && y < DSP3_WinHi && + 0 <= x && x < DSP3_WinLo ) { + + if( op1e_terrain[ cell ] < 0x80 || op1e_weight[ cell ] == 0 ) { + if( op1e_weight[ cell ] < path ) { + path = op1e_weight[ cell ]; + } + } + } // end step travel + + lcv_turns--; + } // end while turns + + if( path != 0xff ) { + op1e_weight[ op1e_cell ] = path + op1e_cost[ op1e_cell ]; + } +} + + +void DSP3_OP1E_C() +{ + int lcv; + + op1e_min_radius = (uint8)(DSP3_DR & 0x00ff); + op1e_max_radius = (uint8)((DSP3_DR & 0xff00)>>8); + + if( op1e_min_radius == 0 ) + op1e_min_radius++; + + if( op1e_max_path_radius >= op1e_min_radius ) + op1e_min_radius = op1e_max_path_radius+1; + + if( op1e_max_radius > op1e_max_path_radius ) + op1e_max_path_radius = op1e_max_radius; + + op1e_lcv_radius = op1e_min_radius; + op1e_lcv_steps = op1e_min_radius; + + op1e_lcv_turns = 6; + op1e_turn = 0; + + op1e_x = op3e_x; + op1e_y = op3e_y; + + for( lcv = 0; lcv < op1e_min_radius; lcv++ ) + DSP3_OP1E_D( op1e_turn, &op1e_x, &op1e_y ); + + DSP3_OP1E_C1(); +} + + +void DSP3_OP1E_C1() +{ + int lcv; + + if( op1e_lcv_steps == 0 ) { + op1e_lcv_radius++; + + op1e_lcv_steps = op1e_lcv_radius; + + op1e_x = op3e_x; + op1e_y = op3e_y; + + for( lcv = 0; lcv < op1e_lcv_radius; lcv++ ) + DSP3_OP1E_D( op1e_turn, &op1e_x, &op1e_y ); + } + + if( op1e_lcv_radius > op1e_max_radius ) { + op1e_turn++; + op1e_lcv_turns--; + + op1e_lcv_radius = op1e_min_radius; + op1e_lcv_steps = op1e_min_radius; + + op1e_x = op3e_x; + op1e_y = op3e_y; + + for( lcv = 0; lcv < op1e_min_radius; lcv++ ) + DSP3_OP1E_D( op1e_turn, &op1e_x, &op1e_y ); + } + + if( op1e_lcv_turns == 0 ) { + DSP3_DR = 0xffff; + DSP3_SR = 0x0080; + SetDSP3 = &DSP3_Reset; + return; + } + + DSP3_DR = (uint8)(op1e_x) | ((uint8)(op1e_y)<<8); + DSP3_OP03(); + + op1e_cell = DSP3_DR; + + DSP3_SR = 0x0080; + SetDSP3 = &DSP3_OP1E_C2; +} + + +void DSP3_OP1E_C2() +{ + DSP3_DR = op1e_weight[ op1e_cell ]; + + DSP3_OP1E_D( (int16)(op1e_turn+2), &op1e_x, &op1e_y ); + op1e_lcv_steps--; + + DSP3_SR = 0x0084; + SetDSP3 = &DSP3_OP1E_C1; +} + + +void DSP3_OP1E_D( int16 move, int16 *lo, int16 *hi ) +{ + uint32 dataOfs = ((move << 1) + 0x03b2) & 0x03ff; + int16 Lo; + int16 Hi; + + DSP3_AddHi = DSP3_DataROM[dataOfs]; + DSP3_AddLo = DSP3_DataROM[dataOfs + 1]; + + Lo = (uint8)(*lo); + Hi = (uint8)(*hi); + + if (Lo & 1) Hi += (DSP3_AddLo & 1); + + DSP3_AddLo += Lo; + DSP3_AddHi += Hi; + + if (DSP3_AddLo < 0) + DSP3_AddLo += DSP3_WinLo; + else + if (DSP3_AddLo >= DSP3_WinLo) + DSP3_AddLo -= DSP3_WinLo; + + if (DSP3_AddHi < 0) + DSP3_AddHi += DSP3_WinHi; + else + if (DSP3_AddHi >= DSP3_WinHi) + DSP3_AddHi -= DSP3_WinHi; + + *lo = DSP3_AddLo; + *hi = DSP3_AddHi; +} + + +void DSP3_OP1E_D1( int16 move, int16 *lo, int16 *hi ) +{ + //uint32 dataOfs = ((move << 1) + 0x03b2) & 0x03ff; + int16 Lo; + int16 Hi; + + const unsigned short HiAdd[] = { + 0x00, 0xFF, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x00 + }; + const unsigned short LoAdd[] = { + 0x00, 0x00, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x00 + }; + + if( (*lo) & 1 ) + DSP3_AddHi = HiAdd[ move + 8 ]; + else + DSP3_AddHi = HiAdd[ move + 0 ]; + DSP3_AddLo = LoAdd[ move ]; + + Lo = (uint8)(*lo); + Hi = (uint8)(*hi); + + if (Lo & 1) Hi += (DSP3_AddLo & 1); + + DSP3_AddLo += Lo; + DSP3_AddHi += Hi; + + *lo = DSP3_AddLo; + *hi = DSP3_AddHi; +} + + +void DSP3_OP10() +{ + if( DSP3_DR == 0xffff ) { + DSP3_Reset(); + } else { + // absorb 2 bytes + DSP3_DR = DSP3_DR; + } +} + + +void DSP3_OP0C_A() +{ + // absorb 2 bytes + + DSP3_DR = 0; + SetDSP3 = &DSP3_Reset; +} + + +void DSP3_OP0C() +{ + // absorb 2 bytes + + DSP3_DR = 0; + //SetDSP3 = &DSP3_OP0C_A; + SetDSP3 = &DSP3_Reset; +} + + +void DSP3_OP1C_C() +{ + // return 2 bytes + DSP3_DR = 0; + SetDSP3 = &DSP3_Reset; +} + + +void DSP3_OP1C_B() +{ + // absorb 2 bytes + + // return 2 bytes + DSP3_DR = 0; + SetDSP3 = &DSP3_OP1C_C; +} + + +void DSP3_OP1C_A() +{ + // absorb 2 bytes + + SetDSP3 = &DSP3_OP1C_B; +} + + +void DSP3_OP1C() +{ + // absorb 2 bytes + + SetDSP3 = &DSP3_OP1C_A; +} + + +void DSP3_Command() +{ + if (DSP3_DR < 0x40) + { + switch (DSP3_DR) + { + case 0x02: SetDSP3 = &DSP3_Coordinate; break; + case 0x03: SetDSP3 = &DSP3_OP03; break; + case 0x06: SetDSP3 = &DSP3_OP06; break; + case 0x07: SetDSP3 = &DSP3_OP07; return; + case 0x0c: SetDSP3 = &DSP3_OP0C; break; + case 0x0f: SetDSP3 = &DSP3_TestMemory; break; + case 0x10: SetDSP3 = &DSP3_OP10; break; + case 0x18: SetDSP3 = &DSP3_Convert; break; + case 0x1c: SetDSP3 = &DSP3_OP1C; break; + case 0x1e: SetDSP3 = &DSP3_OP1E; break; + case 0x1f: SetDSP3 = &DSP3_MemoryDump; break; + case 0x38: SetDSP3 = &DSP3_Decode; break; + case 0x3e: SetDSP3 = &DSP3_OP3E; break; + default: + return; + } + DSP3_SR = 0x0080; + DSP3_Index = 0; + } +} + +uint8 dsp3_byte; +uint16 dsp3_address; + +void DSP3SetByte() +{ + if (dsp3_address < 0xC000) + { + if (DSP3_SR & 0x04) + { + DSP3_DR = (DSP3_DR & 0xff00) + dsp3_byte; + (*SetDSP3)(); + } + else + { + DSP3_SR ^= 0x10; + + if (DSP3_SR & 0x10) + DSP3_DR = (DSP3_DR & 0xff00) + dsp3_byte; + else + { + DSP3_DR = (DSP3_DR & 0x00ff) + (dsp3_byte << 8); + (*SetDSP3)(); + } + } + } +} + +void DSP3GetByte() +{ + if (dsp3_address < 0xC000) + { + if (DSP3_SR & 0x04) + { + dsp3_byte = (uint8) DSP3_DR; + (*SetDSP3)(); + } + else + { + DSP3_SR ^= 0x10; + + if (DSP3_SR & 0x10) + dsp3_byte = (uint8) (DSP3_DR); + else + { + dsp3_byte = (uint8) (DSP3_DR >> 8); + (*SetDSP3)(); + } + } + + } + else + { + dsp3_byte = (uint8) DSP3_SR; + } +} + +void InitDSP3() +{ + DSP3_Reset(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp4/dsp4.cpp b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4.cpp new file mode 100755 index 0000000000..70def2741d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4.cpp @@ -0,0 +1,62 @@ +#include <../base.hpp> + +#define DSP4_CPP +namespace bSNES_v059 { + +DSP4 dsp4; + +void DSP4::init() { +} + +void DSP4::enable() { + bus.map(Bus::MapDirect, 0x30, 0x3f, 0x8000, 0xffff, *this); + bus.map(Bus::MapDirect, 0xb0, 0xbf, 0x8000, 0xffff, *this); +} + +namespace DSP4i { + inline uint16 READ_WORD(uint8 *addr) { + return (addr[0]) + (addr[1] << 8); + } + + inline uint32 READ_DWORD(uint8 *addr) { + return (addr[0]) + (addr[1] << 8) + (addr[2] << 16) + (addr[3] << 24); + } + + inline void WRITE_WORD(uint8 *addr, uint16 data) { + addr[0] = data; + addr[1] = data >> 8; + } + + #define bool8 uint8 + #include "dsp4emu.c" + #undef bool8 +}; + +void DSP4::power() { + reset(); +} + +void DSP4::reset() { + DSP4i::InitDSP4(); +} + +uint8 DSP4::read(unsigned addr) { + addr &= 0xffff; + if(addr < 0xc000) { + DSP4i::dsp4_address = addr; + DSP4i::DSP4GetByte(); + return DSP4i::dsp4_byte; + } + return 0x80; +} + +void DSP4::write(unsigned addr, uint8 data) { + addr &= 0xffff; + if(addr < 0xc000) { + DSP4i::dsp4_address = addr; + DSP4i::dsp4_byte = data; + DSP4i::DSP4SetByte(); + } +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/dsp4/dsp4.hpp b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4.hpp new file mode 100755 index 0000000000..7a261192e6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4.hpp @@ -0,0 +1,12 @@ +class DSP4 : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 read (unsigned addr); + void write(unsigned addr, uint8 data); +}; + +extern DSP4 dsp4; diff --git a/Mednafen/mednafen/snes/src/chip/dsp4/dsp4emu.c b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4emu.c new file mode 100755 index 0000000000..73c1ec3d69 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4emu.c @@ -0,0 +1,2150 @@ +#ifdef DSP4_CPP + +//DSP-4 emulator code +//Copyright (c) 2004-2006 Dreamer Nom, John Weidman, Kris Bleakley, Nach, z80 gaiden + +/* +Due recognition and credit are given on Overload's DSP website. +Thank those contributors for their hard work on this chip. + + +Fixed-point math reminder: + +[sign, integer, fraction] +1.15.00 * 1.15.00 = 2.30.00 -> 1.30.00 (DSP) -> 1.31.00 (LSB is '0') +1.15.00 * 1.00.15 = 2.15.15 -> 1.15.15 (DSP) -> 1.15.16 (LSB is '0') +*/ + +#include "dsp4emu.h" + +struct DSP4_t DSP4; +struct DSP4_vars_t DSP4_vars; + +////////////////////////////////////////////////////////////// + +// input protocol + +static int16 DSP4_READ_WORD() +{ + int16 out; + + out = READ_WORD(DSP4.parameters + DSP4.in_index); + DSP4.in_index += 2; + + return out; +} + +static int32 DSP4_READ_DWORD() +{ + int32 out; + + out = READ_DWORD(DSP4.parameters + DSP4.in_index); + DSP4.in_index += 4; + + return out; +} + + +////////////////////////////////////////////////////////////// + +// output protocol + +#define DSP4_CLEAR_OUT() \ +{ DSP4.out_count = 0; DSP4.out_index = 0; } + +#define DSP4_WRITE_BYTE( d ) \ +{ WRITE_WORD( DSP4.output + DSP4.out_count, ( d ) ); DSP4.out_count++; } + +#define DSP4_WRITE_WORD( d ) \ +{ WRITE_WORD( DSP4.output + DSP4.out_count, ( d ) ); DSP4.out_count += 2; } + +#ifndef MSB_FIRST +#define DSP4_WRITE_16_WORD( d ) \ +{ memcpy(DSP4.output + DSP4.out_count, ( d ), 32); DSP4.out_count += 32; } +#else +#define DSP4_WRITE_16_WORD( d ) \ +{ int16 *p = ( d ), *end = ( d )+16; \ + for (; p != end; p++) \ + { \ + WRITE_WORD( DSP4.output + DSP4.out_count, *p ); \ + } \ + DSP4.out_count += 32; \ +} +#endif + +#ifdef PRINT_OP +#define DSP4_WRITE_DEBUG( x, d ) \ + WRITE_WORD( nop + x, d ); +#endif + +#ifdef DEBUG_DSP +#define DSP4_WRITE_DEBUG( x, d ) \ + WRITE_WORD( nop + x, d ); +#endif + +////////////////////////////////////////////////////////////// + +// used to wait for dsp i/o + +#define DSP4_WAIT( x ) \ + DSP4.in_index = 0; DSP4_vars.DSP4_Logic = x; return; + +////////////////////////////////////////////////////////////// + +// 1.7.8 -> 1.15.16 +#define SEX78( a ) ( ( (int32) ( (int16) (a) ) ) << 8 ) + +// 1.15.0 -> 1.15.16 +#define SEX16( a ) ( ( (int32) ( (int16) (a) ) ) << 16 ) + +#ifdef PRINT_OP +#define U16( a ) ( (uint16) ( a ) ) +#endif + +#ifdef DEBUG_DSP +#define U16( a ) ( (uint16) ( a ) ) +#endif + +////////////////////////////////////////////////////////////// + +// Attention: This lookup table is not verified +static const uint16 div_lut[64] = { 0x0000, 0x8000, 0x4000, 0x2aaa, 0x2000, 0x1999, 0x1555, 0x1249, 0x1000, 0x0e38, + 0x0ccc, 0x0ba2, 0x0aaa, 0x09d8, 0x0924, 0x0888, 0x0800, 0x0787, 0x071c, 0x06bc, + 0x0666, 0x0618, 0x05d1, 0x0590, 0x0555, 0x051e, 0x04ec, 0x04bd, 0x0492, 0x0469, + 0x0444, 0x0421, 0x0400, 0x03e0, 0x03c3, 0x03a8, 0x038e, 0x0375, 0x035e, 0x0348, + 0x0333, 0x031f, 0x030c, 0x02fa, 0x02e8, 0x02d8, 0x02c8, 0x02b9, 0x02aa, 0x029c, + 0x028f, 0x0282, 0x0276, 0x026a, 0x025e, 0x0253, 0x0249, 0x023e, 0x0234, 0x022b, + 0x0222, 0x0219, 0x0210, 0x0208, }; +int16 DSP4_Inverse(int16 value) +{ + // saturate bounds + if (value < 0) + { + value = 0; + } + if (value > 63) + { + value = 63; + } + + return div_lut[value]; +} + +////////////////////////////////////////////////////////////// + +// Prototype +void DSP4_OP0B(bool8 *draw, int16 sp_x, int16 sp_y, int16 sp_attr, bool8 size, bool8 stop); + +////////////////////////////////////////////////////////////// + +// OP00 +void DSP4_Multiply(int16 Multiplicand, int16 Multiplier, int32 *Product) +{ + *Product = (Multiplicand * Multiplier << 1) >> 1; +} + +////////////////////////////////////////////////////////////// + + +void DSP4_OP01() +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + case 3: + goto resume3; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + DSP4_vars.world_y = DSP4_READ_DWORD(); + DSP4_vars.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4_vars.viewport_bottom = DSP4_READ_WORD(); + DSP4_vars.world_x = DSP4_READ_DWORD(); + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4_vars.world_yofs = DSP4_READ_WORD(); + DSP4_vars.world_dy = DSP4_READ_DWORD(); + DSP4_vars.world_dx = DSP4_READ_DWORD(); + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4_vars.world_xenv = DSP4_READ_DWORD(); + DSP4_vars.world_ddy = DSP4_READ_WORD(); + DSP4_vars.world_ddx = DSP4_READ_WORD(); + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // initial (x,y,offset) at starting DSP4_vars.raster line + DSP4_vars.view_x1 = (int16)((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16); + DSP4_vars.view_y1 = (int16)(DSP4_vars.world_y >> 16); + DSP4_vars.view_xofs1 = (int16)(DSP4_vars.world_x >> 16); + DSP4_vars.view_yofs1 = DSP4_vars.world_yofs; + DSP4_vars.view_turnoff_x = 0; + DSP4_vars.view_turnoff_dx = 0; + + // first DSP4_vars.raster line + DSP4_vars.poly_raster[0][0] = DSP4_vars.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // perspective projection of world (x,y,scroll) points + // based on the current projection lines + DSP4_vars.view_x2 = (int16)(( ( ( DSP4_vars.world_x + DSP4_vars.world_xenv ) >> 16 ) * DSP4_vars.distance >> 15 ) + ( DSP4_vars.view_turnoff_x * DSP4_vars.distance >> 15 )); + DSP4_vars.view_y2 = (int16)((DSP4_vars.world_y >> 16) * DSP4_vars.distance >> 15); + DSP4_vars.view_xofs2 = DSP4_vars.view_x2; + DSP4_vars.view_yofs2 = (DSP4_vars.world_yofs * DSP4_vars.distance >> 15) + DSP4_vars.poly_bottom[0][0] - DSP4_vars.view_y2; + + + // 1. World x-location before transformation + // 2. Viewer x-position at the next + // 3. World y-location before perspective projection + // 4. Viewer y-position below the horizon + // 5. Number of DSP4_vars.raster lines drawn in this iteration + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((uint16)((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16)); + DSP4_WRITE_WORD(DSP4_vars.view_x2); + DSP4_WRITE_WORD((uint16)(DSP4_vars.world_y >> 16)); + DSP4_WRITE_WORD(DSP4_vars.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of DSP4_vars.raster lines used + DSP4_vars.segments = DSP4_vars.poly_raster[0][0] - DSP4_vars.view_y2; + + // prevent overdraw + if (DSP4_vars.view_y2 >= DSP4_vars.poly_raster[0][0]) + DSP4_vars.segments = 0; + else + DSP4_vars.poly_raster[0][0] = DSP4_vars.view_y2; + + // don't draw outside the window + if (DSP4_vars.view_y2 < DSP4_vars.poly_top[0][0]) + { + DSP4_vars.segments = 0; + + // flush remaining DSP4_vars.raster lines + if (DSP4_vars.view_y1 >= DSP4_vars.poly_top[0][0]) + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4_vars.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4_vars.view_xofs2 - DSP4_vars.view_xofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + py_dy = (DSP4_vars.view_yofs2 - DSP4_vars.view_yofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4_vars.poly_cx[0][0] + DSP4_vars.view_xofs1); + y_scroll = SEX16(-DSP4_vars.viewport_bottom + DSP4_vars.view_yofs1 + DSP4_vars.view_yofsenv + DSP4_vars.poly_cx[1][0] - DSP4_vars.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < DSP4_vars.segments; DSP4_vars.lcv++) + { + // 1. HDMA memory pointer (bg1) + // 2. vertical scroll offset ($210E) + // 3. horizontal scroll offset ($210D) + + DSP4_WRITE_WORD(DSP4_vars.poly_ptr[0][0]); + DSP4_WRITE_WORD((uint16)((y_scroll + 0x8000) >> 16)); + DSP4_WRITE_WORD((uint16)((x_scroll + 0x8000) >> 16)); + + + // update memory address + DSP4_vars.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + //////////////////////////////////////////////////// + // Post-update + + // update new viewer (x,y,scroll) to last DSP4_vars.raster line drawn + DSP4_vars.view_x1 = DSP4_vars.view_x2; + DSP4_vars.view_y1 = DSP4_vars.view_y2; + DSP4_vars.view_xofs1 = DSP4_vars.view_xofs2; + DSP4_vars.view_yofs1 = DSP4_vars.view_yofs2; + + // add deltas for projection lines + DSP4_vars.world_dx += SEX78(DSP4_vars.world_ddx); + DSP4_vars.world_dy += SEX78(DSP4_vars.world_ddy); + + // update projection lines + DSP4_vars.world_x += (DSP4_vars.world_dx + DSP4_vars.world_xenv); + DSP4_vars.world_y += DSP4_vars.world_dy; + + // update road turnoff position + DSP4_vars.view_turnoff_x += DSP4_vars.view_turnoff_dx; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1) resume1 : + + // check for termination + DSP4_vars.distance = DSP4_READ_WORD(); + if (DSP4_vars.distance == -0x8000) + break; + + // road turnoff + if( (uint16) DSP4_vars.distance == 0x8001 ) + { + DSP4.in_count = 6; + DSP4_WAIT(2) resume2: + + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_vars.view_turnoff_x = DSP4_READ_WORD(); + DSP4_vars.view_turnoff_dx = DSP4_READ_WORD(); + + // factor in new changes + DSP4_vars.view_x1 += ( DSP4_vars.view_turnoff_x * DSP4_vars.distance >> 15 ); + DSP4_vars.view_xofs1 += ( DSP4_vars.view_turnoff_x * DSP4_vars.distance >> 15 ); + + // update stepping values + DSP4_vars.view_turnoff_x += DSP4_vars.view_turnoff_dx; + + DSP4.in_count = 2; + DSP4_WAIT(1) + } + + // already have 2 bytes read + DSP4.in_count = 6; + DSP4_WAIT(3) resume3 : + + // inspect inputs + DSP4_vars.world_ddy = DSP4_READ_WORD(); + DSP4_vars.world_ddx = DSP4_READ_WORD(); + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // no envelope here + DSP4_vars.world_xenv = 0; + } + while (1); + + // terminate op + DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + + +void DSP4_OP03() +{ + DSP4_vars.OAM_RowMax = 33; + memset(DSP4_vars.OAM_Row, 0, 64); +} + + +////////////////////////////////////////////////////////////// + + +void DSP4_OP05() +{ + DSP4_vars.OAM_index = 0; + DSP4_vars.OAM_bits = 0; + memset(DSP4_vars.OAM_attr, 0, 32); + DSP4_vars.sprite_count = 0; +} + + +////////////////////////////////////////////////////////////// + +void DSP4_OP06() +{ + DSP4_CLEAR_OUT(); + DSP4_WRITE_16_WORD(DSP4_vars.OAM_attr); +} + +////////////////////////////////////////////////////////////// + + +void DSP4_OP07() +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + } + + //////////////////////////////////////////////////// + // sort inputs + + DSP4_vars.world_y = DSP4_READ_DWORD(); + DSP4_vars.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4_vars.viewport_bottom = DSP4_READ_WORD(); + DSP4_vars.world_x = DSP4_READ_DWORD(); + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4_vars.world_yofs = DSP4_READ_WORD(); + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_vars.view_y2 = DSP4_READ_WORD(); + DSP4_vars.view_dy = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_x2 = DSP4_READ_WORD(); + DSP4_vars.view_dx = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // initial (x,y,offset) at starting DSP4_vars.raster line + DSP4_vars.view_x1 = (int16)(DSP4_vars.world_x >> 16); + DSP4_vars.view_y1 = (int16)(DSP4_vars.world_y >> 16); + DSP4_vars.view_xofs1 = DSP4_vars.view_x1; + DSP4_vars.view_yofs1 = DSP4_vars.world_yofs; + + // first DSP4_vars.raster line + DSP4_vars.poly_raster[0][0] = DSP4_vars.poly_bottom[0][0]; + + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // add shaping + DSP4_vars.view_x2 += DSP4_vars.view_dx; + DSP4_vars.view_y2 += DSP4_vars.view_dy; + + // vertical scroll calculation + DSP4_vars.view_xofs2 = DSP4_vars.view_x2; + DSP4_vars.view_yofs2 = (DSP4_vars.world_yofs * DSP4_vars.distance >> 15) + DSP4_vars.poly_bottom[0][0] - DSP4_vars.view_y2; + + // 1. Viewer x-position at the next + // 2. Viewer y-position below the horizon + // 3. Number of DSP4_vars.raster lines drawn in this iteration + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(DSP4_vars.view_x2); + DSP4_WRITE_WORD(DSP4_vars.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of DSP4_vars.raster lines used + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.view_y2; + + // prevent overdraw + if (DSP4_vars.view_y2 >= DSP4_vars.poly_raster[0][0]) + DSP4_vars.segments = 0; + else + DSP4_vars.poly_raster[0][0] = DSP4_vars.view_y2; + + // don't draw outside the window + if (DSP4_vars.view_y2 < DSP4_vars.poly_top[0][0]) + { + DSP4_vars.segments = 0; + + // flush remaining DSP4_vars.raster lines + if (DSP4_vars.view_y1 >= DSP4_vars.poly_top[0][0]) + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4_vars.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4_vars.view_xofs2 - DSP4_vars.view_xofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + py_dy = (DSP4_vars.view_yofs2 - DSP4_vars.view_yofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4_vars.poly_cx[0][0] + DSP4_vars.view_xofs1); + y_scroll = SEX16(-DSP4_vars.viewport_bottom + DSP4_vars.view_yofs1 + DSP4_vars.view_yofsenv + DSP4_vars.poly_cx[1][0] - DSP4_vars.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < DSP4_vars.segments; DSP4_vars.lcv++) + { + // 1. HDMA memory pointer (bg2) + // 2. vertical scroll offset ($2110) + // 3. horizontal scroll offset ($210F) + + DSP4_WRITE_WORD(DSP4_vars.poly_ptr[0][0]); + DSP4_WRITE_WORD((uint16)((y_scroll + 0x8000) >> 16)); + DSP4_WRITE_WORD((uint16)((x_scroll + 0x8000) >> 16)); + + // update memory address + DSP4_vars.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + ///////////////////////////////////////////////////// + // Post-update + + // update new viewer (x,y,scroll) to last DSP4_vars.raster line drawn + DSP4_vars.view_x1 = DSP4_vars.view_x2; + DSP4_vars.view_y1 = DSP4_vars.view_y2; + DSP4_vars.view_xofs1 = DSP4_vars.view_xofs2; + DSP4_vars.view_yofs1 = DSP4_vars.view_yofs2; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1) resume1 : + + // check for opcode termination + DSP4_vars.distance = DSP4_READ_WORD(); + if (DSP4_vars.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 10; + DSP4_WAIT(2) resume2 : + + // inspect inputs + DSP4_vars.view_y2 = DSP4_READ_WORD(); + DSP4_vars.view_dy = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_x2 = DSP4_READ_WORD(); + DSP4_vars.view_dx = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + } + while (1); + + DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + +void DSP4_OP08() +{ + int16 win_left, win_right; + int16 view_x[2], view_y[2]; + int16 envelope[2][2]; + + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs for two polygons + + // clip values + DSP4_vars.poly_clipRt[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_clipRt[0][1] = DSP4_READ_WORD(); + DSP4_vars.poly_clipRt[1][0] = DSP4_READ_WORD(); + DSP4_vars.poly_clipRt[1][1] = DSP4_READ_WORD(); + + DSP4_vars.poly_clipLf[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_clipLf[0][1] = DSP4_READ_WORD(); + DSP4_vars.poly_clipLf[1][0] = DSP4_READ_WORD(); + DSP4_vars.poly_clipLf[1][1] = DSP4_READ_WORD(); + + // unknown (constant) (ex. 1P/2P = $00A6, $00A6, $00A6, $00A6) + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + + // unknown (constant) (ex. 1P/2P = $00A5, $00A5, $00A7, $00A7) + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + + // polygon centering (left,right) + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[0][1] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][1] = DSP4_READ_WORD(); + + // HDMA pointer locations + DSP4_vars.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[0][1] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[1][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[1][1] = DSP4_READ_WORD(); + + // starting DSP4_vars.raster line below the horizon + DSP4_vars.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_bottom[0][1] = DSP4_READ_WORD(); + DSP4_vars.poly_bottom[1][0] = DSP4_READ_WORD(); + DSP4_vars.poly_bottom[1][1] = DSP4_READ_WORD(); + + // top boundary line to clip + DSP4_vars.poly_top[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[0][1] = DSP4_READ_WORD(); + DSP4_vars.poly_top[1][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[1][1] = DSP4_READ_WORD(); + + // unknown + // (ex. 1P = $2FC8, $0034, $FF5C, $0035) + // + // (ex. 2P = $3178, $0034, $FFCC, $0035) + // (ex. 2P = $2FC8, $0034, $FFCC, $0035) + + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + DSP4_READ_WORD(); + + // look at guidelines for both polygon shapes + DSP4_vars.distance = DSP4_READ_WORD(); + view_x[0] = DSP4_READ_WORD(); + view_y[0] = DSP4_READ_WORD(); + view_x[1] = DSP4_READ_WORD(); + view_y[1] = DSP4_READ_WORD(); + + // envelope shaping guidelines (one frame only) + envelope[0][0] = DSP4_READ_WORD(); + envelope[0][1] = DSP4_READ_WORD(); + envelope[1][0] = DSP4_READ_WORD(); + envelope[1][1] = DSP4_READ_WORD(); + + // starting base values to project from + DSP4_vars.poly_start[0] = view_x[0]; + DSP4_vars.poly_start[1] = view_x[1]; + + // starting DSP4_vars.raster lines to begin drawing + DSP4_vars.poly_raster[0][0] = view_y[0]; + DSP4_vars.poly_raster[0][1] = view_y[0]; + DSP4_vars.poly_raster[1][0] = view_y[1]; + DSP4_vars.poly_raster[1][1] = view_y[1]; + + // starting distances + DSP4_vars.poly_plane[0] = DSP4_vars.distance; + DSP4_vars.poly_plane[1] = DSP4_vars.distance; + + // SR = 0x00 + + // re-center coordinates + win_left = DSP4_vars.poly_cx[0][0] - view_x[0] + envelope[0][0]; + win_right = DSP4_vars.poly_cx[0][1] - view_x[0] + envelope[0][1]; + + // saturate offscreen data for polygon #1 + if (win_left < DSP4_vars.poly_clipLf[0][0]) + { + win_left = DSP4_vars.poly_clipLf[0][0]; + } + if (win_left > DSP4_vars.poly_clipRt[0][0]) + { + win_left = DSP4_vars.poly_clipRt[0][0]; + } + if (win_right < DSP4_vars.poly_clipLf[0][1]) + { + win_right = DSP4_vars.poly_clipLf[0][1]; + } + if (win_right > DSP4_vars.poly_clipRt[0][1]) + { + win_right = DSP4_vars.poly_clipRt[0][1]; + } + + // SR = 0x80 + + // initial output for polygon #1 + DSP4_CLEAR_OUT(); + DSP4_WRITE_BYTE(win_left & 0xff); + DSP4_WRITE_BYTE(win_right & 0xff); + + + do + { + int16 polygon; + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1) resume1 : + + // terminate op + DSP4_vars.distance = DSP4_READ_WORD(); + if (DSP4_vars.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 16; + + DSP4_WAIT(2) resume2 : + + // look at guidelines for both polygon shapes + view_x[0] = DSP4_READ_WORD(); + view_y[0] = DSP4_READ_WORD(); + view_x[1] = DSP4_READ_WORD(); + view_y[1] = DSP4_READ_WORD(); + + // envelope shaping guidelines (one frame only) + envelope[0][0] = DSP4_READ_WORD(); + envelope[0][1] = DSP4_READ_WORD(); + envelope[1][0] = DSP4_READ_WORD(); + envelope[1][1] = DSP4_READ_WORD(); + + //////////////////////////////////////////////////// + // projection begins + + // init + DSP4_CLEAR_OUT(); + + + ////////////////////////////////////////////// + // solid polygon renderer - 2 shapes + + for (polygon = 0; polygon < 2; polygon++) + { + int32 left_inc, right_inc; + int16 x1_final, x2_final; + int16 env[2][2]; + int16 poly; + + // SR = 0x00 + + // # DSP4_vars.raster lines to draw + DSP4_vars.segments = DSP4_vars.poly_raster[polygon][0] - view_y[polygon]; + + // prevent overdraw + if (DSP4_vars.segments > 0) + { + // bump drawing cursor + DSP4_vars.poly_raster[polygon][0] = view_y[polygon]; + DSP4_vars.poly_raster[polygon][1] = view_y[polygon]; + } + else + DSP4_vars.segments = 0; + + // don't draw outside the window + if (view_y[polygon] < DSP4_vars.poly_top[polygon][0]) + { + DSP4_vars.segments = 0; + + // flush remaining DSP4_vars.raster lines + if (view_y[polygon] >= DSP4_vars.poly_top[polygon][0]) + DSP4_vars.segments = view_y[polygon] - DSP4_vars.poly_top[polygon][0]; + } + + // SR = 0x80 + + // tell user how many DSP4_vars.raster structures to read in + DSP4_WRITE_WORD(DSP4_vars.segments); + + // normal parameters + poly = polygon; + + ///////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + int32 win_left, win_right; + + // road turnoff selection + if( (uint16) envelope[ polygon ][ 0 ] == (uint16) 0xc001 ) + poly = 1; + else if( envelope[ polygon ][ 1 ] == 0x3fff ) + poly = 1; + + /////////////////////////////////////////////// + // left side of polygon + + // perspective correction on additional shaping parameters + env[0][0] = envelope[polygon][0] * DSP4_vars.poly_plane[poly] >> 15; + env[0][1] = envelope[polygon][0] * DSP4_vars.distance >> 15; + + // project new shapes (left side) + x1_final = view_x[poly] + env[0][0]; + x2_final = DSP4_vars.poly_start[poly] + env[0][1]; + + // interpolate between projected points with shaping + left_inc = (x2_final - x1_final) * DSP4_Inverse(DSP4_vars.segments) << 1; + if (DSP4_vars.segments == 1) + left_inc = -left_inc; + + /////////////////////////////////////////////// + // right side of polygon + + // perspective correction on additional shaping parameters + env[1][0] = envelope[polygon][1] * DSP4_vars.poly_plane[poly] >> 15;; + env[1][1] = envelope[polygon][1] * DSP4_vars.distance >> 15; + + // project new shapes (right side) + x1_final = view_x[poly] + env[1][0]; + x2_final = DSP4_vars.poly_start[poly] + env[1][1]; + + + // interpolate between projected points with shaping + right_inc = (x2_final - x1_final) * DSP4_Inverse(DSP4_vars.segments) << 1; + if (DSP4_vars.segments == 1) + right_inc = -right_inc; + + /////////////////////////////////////////////// + // update each point on the line + + win_left = SEX16(DSP4_vars.poly_cx[polygon][0] - DSP4_vars.poly_start[poly] + env[0][0]); + win_right = SEX16(DSP4_vars.poly_cx[polygon][1] - DSP4_vars.poly_start[poly] + env[1][0]); + + // update DSP4_vars.distance drawn into world + DSP4_vars.poly_plane[polygon] = DSP4_vars.distance; + + // rasterize line + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < DSP4_vars.segments; DSP4_vars.lcv++) + { + int16 x_left, x_right; + + // project new coordinates + win_left += left_inc; + win_right += right_inc; + + // grab integer portion, drop fraction (no rounding) + x_left = (int16)(win_left >> 16); + x_right = (int16)(win_right >> 16); + + // saturate offscreen data + if (x_left < DSP4_vars.poly_clipLf[polygon][0]) + x_left = DSP4_vars.poly_clipLf[polygon][0]; + if (x_left > DSP4_vars.poly_clipRt[polygon][0]) + x_left = DSP4_vars.poly_clipRt[polygon][0]; + if (x_right < DSP4_vars.poly_clipLf[polygon][1]) + x_right = DSP4_vars.poly_clipLf[polygon][1]; + if (x_right > DSP4_vars.poly_clipRt[polygon][1]) + x_right = DSP4_vars.poly_clipRt[polygon][1]; + + // 1. HDMA memory pointer + // 2. Left window position ($2126/$2128) + // 3. Right window position ($2127/$2129) + + DSP4_WRITE_WORD(DSP4_vars.poly_ptr[polygon][0]); + DSP4_WRITE_BYTE(x_left & 0xff); + DSP4_WRITE_BYTE(x_right & 0xff); + + + // update memory pointers + DSP4_vars.poly_ptr[polygon][0] -= 4; + DSP4_vars.poly_ptr[polygon][1] -= 4; + } // end rasterize line + } + + //////////////////////////////////////////////// + // Post-update + + // new projection spot to continue rasterizing from + DSP4_vars.poly_start[polygon] = view_x[poly]; + } // end polygon rasterizer + } + while (1); + + // unknown output + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(0); + + + DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + +void DSP4_OP09() +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + case 3: + goto resume3; break; + case 4: + goto resume4; break; + case 5: + goto resume5; break; + case 6: + goto resume6; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // grab screen information + DSP4_vars.viewport_cx = DSP4_READ_WORD(); + DSP4_vars.viewport_cy = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4_vars.viewport_left = DSP4_READ_WORD(); + DSP4_vars.viewport_right = DSP4_READ_WORD(); + DSP4_vars.viewport_top = DSP4_READ_WORD(); + DSP4_vars.viewport_bottom = DSP4_READ_WORD(); + + // starting DSP4_vars.raster line below the horizon + DSP4_vars.poly_bottom[0][0] = DSP4_vars.viewport_bottom - DSP4_vars.viewport_cy; + DSP4_vars.poly_raster[0][0] = 0x100; + + do + { + //////////////////////////////////////////////////// + // check for new sprites + + DSP4.in_count = 4; + DSP4_WAIT(1) resume1 : + + //////////////////////////////////////////////// + // DSP4_vars.raster overdraw check + + DSP4_vars.raster = DSP4_READ_WORD(); + + // continue updating the DSP4_vars.raster line where overdraw begins + if (DSP4_vars.raster < DSP4_vars.poly_raster[0][0]) + { + DSP4_vars.sprite_clipy = DSP4_vars.viewport_bottom - (DSP4_vars.poly_bottom[0][0] - DSP4_vars.raster); + DSP4_vars.poly_raster[0][0] = DSP4_vars.raster; + } + + ///////////////////////////////////////////////// + // identify sprite + + // op termination + DSP4_vars.distance = DSP4_READ_WORD(); + if (DSP4_vars.distance == -0x8000) + goto terminate; + + + // no sprite + if (DSP4_vars.distance == 0x0000) + { + continue; + } + + //////////////////////////////////////////////////// + // process projection information + + // vehicle sprite + if ((uint16) DSP4_vars.distance == 0x9000) + { + int16 car_left, car_right, car_back; + int16 impact_left, impact_back; + int16 world_spx, world_spy; + int16 view_spx, view_spy; + uint16 energy; + + // we already have 4 bytes we want + DSP4.in_count = 14; + DSP4_WAIT(2) resume2 : + + // filter inputs + energy = DSP4_READ_WORD(); + impact_back = DSP4_READ_WORD(); + car_back = DSP4_READ_WORD(); + impact_left = DSP4_READ_WORD(); + car_left = DSP4_READ_WORD(); + DSP4_vars.distance = DSP4_READ_WORD(); + car_right = DSP4_READ_WORD(); + + // calculate car's world (x,y) values + world_spx = car_right - car_left; + world_spy = car_back; + + // add in collision vector [needs bit-twiddling] + world_spx -= energy * (impact_left - car_left) >> 16; + world_spy -= energy * (car_back - impact_back) >> 16; + + // perspective correction for world (x,y) + view_spx = world_spx * DSP4_vars.distance >> 15; + view_spy = world_spy * DSP4_vars.distance >> 15; + + // convert to screen values + DSP4_vars.sprite_x = DSP4_vars.viewport_cx + view_spx; + DSP4_vars.sprite_y = DSP4_vars.viewport_bottom - (DSP4_vars.poly_bottom[0][0] - view_spy); + + // make the car's (x)-coordinate available + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(world_spx); + + // grab a few remaining vehicle values + DSP4.in_count = 4; + DSP4_WAIT(3) resume3 : + + // add vertical lift factor + DSP4_vars.sprite_y += DSP4_READ_WORD(); + } + // terrain sprite + else + { + int16 world_spx, world_spy; + int16 view_spx, view_spy; + + // we already have 4 bytes we want + DSP4.in_count = 10; + DSP4_WAIT(4) resume4 : + + // sort loop inputs + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_raster[0][1] = DSP4_READ_WORD(); + world_spx = DSP4_READ_WORD(); + world_spy = DSP4_READ_WORD(); + + // compute base DSP4_vars.raster line from the bottom + DSP4_vars.segments = DSP4_vars.poly_bottom[0][0] - DSP4_vars.raster; + + // perspective correction for world (x,y) + view_spx = world_spx * DSP4_vars.distance >> 15; + view_spy = world_spy * DSP4_vars.distance >> 15; + + // convert to screen values + DSP4_vars.sprite_x = DSP4_vars.viewport_cx + view_spx - DSP4_vars.poly_cx[0][0]; + DSP4_vars.sprite_y = DSP4_vars.viewport_bottom - DSP4_vars.segments + view_spy; + } + + // default sprite size: 16x16 + DSP4_vars.sprite_size = 1; + DSP4_vars.sprite_attr = DSP4_READ_WORD(); + + //////////////////////////////////////////////////// + // convert tile data to SNES OAM format + + do + { + uint16 header; + + int16 sp_x, sp_y, sp_attr, sp_dattr; + int16 sp_dx, sp_dy; + int16 pixels; + + bool8 draw; + + DSP4.in_count = 2; + DSP4_WAIT(5) resume5 : + + draw = TRUE; + + // opcode termination + DSP4_vars.raster = DSP4_READ_WORD(); + if (DSP4_vars.raster == -0x8000) + goto terminate; + + // stop code + if (DSP4_vars.raster == 0x0000 && !DSP4_vars.sprite_size) + break; + + // toggle sprite size + if (DSP4_vars.raster == 0x0000) + { + DSP4_vars.sprite_size = !DSP4_vars.sprite_size; + continue; + } + + // check for valid sprite header + header = DSP4_vars.raster; + header >>= 8; + if (header != 0x20 && + header != 0x2e && //This is for attractor sprite + header != 0x40 && + header != 0x60 && + header != 0xa0 && + header != 0xc0 && + header != 0xe0) + break; + + // read in rest of sprite data + DSP4.in_count = 4; + DSP4_WAIT(6) resume6 : + + draw = TRUE; + + ///////////////////////////////////// + // process tile data + + // sprite deltas + sp_dattr = DSP4_vars.raster; + sp_dy = DSP4_READ_WORD(); + sp_dx = DSP4_READ_WORD(); + + // update coordinates to screen space + sp_x = DSP4_vars.sprite_x + sp_dx; + sp_y = DSP4_vars.sprite_y + sp_dy; + + // update sprite nametable/attribute information + sp_attr = DSP4_vars.sprite_attr + sp_dattr; + + // allow partially visibile tiles + pixels = DSP4_vars.sprite_size ? 15 : 7; + + DSP4_CLEAR_OUT(); + + // transparent tile to clip off parts of a sprite (overdraw) + if (DSP4_vars.sprite_clipy - pixels <= sp_y && + sp_y <= DSP4_vars.sprite_clipy && + sp_x >= DSP4_vars.viewport_left - pixels && + sp_x <= DSP4_vars.viewport_right && + DSP4_vars.sprite_clipy >= DSP4_vars.viewport_top - pixels && + DSP4_vars.sprite_clipy <= DSP4_vars.viewport_bottom) + { + DSP4_OP0B(&draw, sp_x, DSP4_vars.sprite_clipy, 0x00EE, DSP4_vars.sprite_size, 0); + } + + + // normal sprite tile + if (sp_x >= DSP4_vars.viewport_left - pixels && + sp_x <= DSP4_vars.viewport_right && + sp_y >= DSP4_vars.viewport_top - pixels && + sp_y <= DSP4_vars.viewport_bottom && + sp_y <= DSP4_vars.sprite_clipy) + { + DSP4_OP0B(&draw, sp_x, sp_y, sp_attr, DSP4_vars.sprite_size, 0); + } + + + // no following OAM data + DSP4_OP0B(&draw, 0, 0x0100, 0, 0, 1); + } + while (1); + } + while (1); + + terminate : DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + +const uint16 OP0A_Values[16] = { 0x0000, 0x0030, 0x0060, 0x0090, 0x00c0, 0x00f0, 0x0120, 0x0150, 0xfe80, + 0xfeb0, 0xfee0, 0xff10, 0xff40, 0xff70, 0xffa0, 0xffd0 }; + +void DSP4_OP0A(int16 n2, int16 *o1, int16 *o2, int16 *o3, int16 *o4) +{ + *o4 = OP0A_Values[(n2 & 0x000f)]; + *o3 = OP0A_Values[(n2 & 0x00f0) >> 4]; + *o2 = OP0A_Values[(n2 & 0x0f00) >> 8]; + *o1 = OP0A_Values[(n2 & 0xf000) >> 12]; +} + +////////////////////////////////////////////////////////////// + +void DSP4_OP0B(bool8 *draw, int16 sp_x, int16 sp_y, int16 sp_attr, bool8 size, bool8 stop) +{ + int16 Row1, Row2; + + // SR = 0x00 + + // align to nearest 8-pixel row + Row1 = (sp_y >> 3) & 0x1f; + Row2 = (Row1 + 1) & 0x1f; + + // check boundaries + if (!((sp_y < 0) || ((sp_y & 0x01ff) < 0x00eb))) + { + *draw = 0; + } + if (size) + { + if (DSP4_vars.OAM_Row[Row1] + 1 >= DSP4_vars.OAM_RowMax) + *draw = 0; + if (DSP4_vars.OAM_Row[Row2] + 1 >= DSP4_vars.OAM_RowMax) + *draw = 0; + } + else + { + if (DSP4_vars.OAM_Row[Row1] >= DSP4_vars.OAM_RowMax) + { + *draw = 0; + } + } + + // emulator fail-safe (unknown if this really exists) + if (DSP4_vars.sprite_count >= 128) + { + *draw = 0; + } + + // SR = 0x80 + + if (*draw) + { + // Row tiles + if (size) + { + DSP4_vars.OAM_Row[Row1] += 2; + DSP4_vars.OAM_Row[Row2] += 2; + } + else + { + DSP4_vars.OAM_Row[Row1]++; + } + + // yield OAM output + DSP4_WRITE_WORD(1); + + // pack OAM data: x,y,name,attr + DSP4_WRITE_BYTE(sp_x & 0xff); + DSP4_WRITE_BYTE(sp_y & 0xff); + DSP4_WRITE_WORD(sp_attr); + + DSP4_vars.sprite_count++; + + // OAM: size,msb data + // save post-oam table data for future retrieval + DSP4_vars.OAM_attr[DSP4_vars.OAM_index] |= ((sp_x <0 || sp_x> 255) << DSP4_vars.OAM_bits); + DSP4_vars.OAM_bits++; + + DSP4_vars.OAM_attr[DSP4_vars.OAM_index] |= (size << DSP4_vars.OAM_bits); + DSP4_vars.OAM_bits++; + + // move to next byte in buffer + if (DSP4_vars.OAM_bits == 16) + { + DSP4_vars.OAM_bits = 0; + DSP4_vars.OAM_index++; + } + } + else if (stop) + { + // yield no OAM output + DSP4_WRITE_WORD(0); + } +} + +////////////////////////////////////////////////////////////// + +void DSP4_OP0D() +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + DSP4_vars.world_y = DSP4_READ_DWORD(); + DSP4_vars.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4_vars.viewport_bottom = DSP4_READ_WORD(); + DSP4_vars.world_x = DSP4_READ_DWORD(); + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4_vars.world_yofs = DSP4_READ_WORD(); + DSP4_vars.world_dy = DSP4_READ_DWORD(); + DSP4_vars.world_dx = DSP4_READ_DWORD(); + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4_vars.world_xenv = SEX78(DSP4_READ_WORD()); + DSP4_vars.world_ddy = DSP4_READ_WORD(); + DSP4_vars.world_ddx = DSP4_READ_WORD(); + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // initial (x,y,offset) at starting DSP4_vars.raster line + DSP4_vars.view_x1 = (int16)((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16); + DSP4_vars.view_y1 = (int16)(DSP4_vars.world_y >> 16); + DSP4_vars.view_xofs1 = (int16)(DSP4_vars.world_x >> 16); + DSP4_vars.view_yofs1 = DSP4_vars.world_yofs; + + // first DSP4_vars.raster line + DSP4_vars.poly_raster[0][0] = DSP4_vars.poly_bottom[0][0]; + + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // perspective projection of world (x,y,scroll) points + // based on the current projection lines + DSP4_vars.view_x2 = (int16)(( ( ( DSP4_vars.world_x + DSP4_vars.world_xenv ) >> 16 ) * DSP4_vars.distance >> 15 ) + ( DSP4_vars.view_turnoff_x * DSP4_vars.distance >> 15 )); + DSP4_vars.view_y2 = (int16)((DSP4_vars.world_y >> 16) * DSP4_vars.distance >> 15); + DSP4_vars.view_xofs2 = DSP4_vars.view_x2; + DSP4_vars.view_yofs2 = (DSP4_vars.world_yofs * DSP4_vars.distance >> 15) + DSP4_vars.poly_bottom[0][0] - DSP4_vars.view_y2; + + // 1. World x-location before transformation + // 2. Viewer x-position at the current + // 3. World y-location before perspective projection + // 4. Viewer y-position below the horizon + // 5. Number of DSP4_vars.raster lines drawn in this iteration + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((uint16)((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16)); + DSP4_WRITE_WORD(DSP4_vars.view_x2); + DSP4_WRITE_WORD((uint16)(DSP4_vars.world_y >> 16)); + DSP4_WRITE_WORD(DSP4_vars.view_y2); + + ////////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of DSP4_vars.raster lines used + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.view_y2; + + // prevent overdraw + if (DSP4_vars.view_y2 >= DSP4_vars.poly_raster[0][0]) + DSP4_vars.segments = 0; + else + DSP4_vars.poly_raster[0][0] = DSP4_vars.view_y2; + + // don't draw outside the window + if (DSP4_vars.view_y2 < DSP4_vars.poly_top[0][0]) + { + DSP4_vars.segments = 0; + + // flush remaining DSP4_vars.raster lines + if (DSP4_vars.view_y1 >= DSP4_vars.poly_top[0][0]) + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4_vars.segments); + + ////////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4_vars.view_xofs2 - DSP4_vars.view_xofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + py_dy = (DSP4_vars.view_yofs2 - DSP4_vars.view_yofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4_vars.poly_cx[0][0] + DSP4_vars.view_xofs1); + y_scroll = SEX16(-DSP4_vars.viewport_bottom + DSP4_vars.view_yofs1 + DSP4_vars.view_yofsenv + DSP4_vars.poly_cx[1][0] - DSP4_vars.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < DSP4_vars.segments; DSP4_vars.lcv++) + { + // 1. HDMA memory pointer (bg1) + // 2. vertical scroll offset ($210E) + // 3. horizontal scroll offset ($210D) + + DSP4_WRITE_WORD(DSP4_vars.poly_ptr[0][0]); + DSP4_WRITE_WORD((uint16)((y_scroll + 0x8000) >> 16)); + DSP4_WRITE_WORD((uint16)((x_scroll + 0x8000) >> 16)); + + + // update memory address + DSP4_vars.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + ///////////////////////////////////////////////////// + // Post-update + + // update new viewer (x,y,scroll) to last DSP4_vars.raster line drawn + DSP4_vars.view_x1 = DSP4_vars.view_x2; + DSP4_vars.view_y1 = DSP4_vars.view_y2; + DSP4_vars.view_xofs1 = DSP4_vars.view_xofs2; + DSP4_vars.view_yofs1 = DSP4_vars.view_yofs2; + + // add deltas for projection lines + DSP4_vars.world_dx += SEX78(DSP4_vars.world_ddx); + DSP4_vars.world_dy += SEX78(DSP4_vars.world_ddy); + + // update projection lines + DSP4_vars.world_x += (DSP4_vars.world_dx + DSP4_vars.world_xenv); + DSP4_vars.world_y += DSP4_vars.world_dy; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(1) resume1 : + + // inspect input + DSP4_vars.distance = DSP4_READ_WORD(); + + // terminate op + if (DSP4_vars.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 6; + DSP4_WAIT(2) resume2: + + // inspect inputs + DSP4_vars.world_ddy = DSP4_READ_WORD(); + DSP4_vars.world_ddx = DSP4_READ_WORD(); + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // no envelope here + DSP4_vars.world_xenv = 0; + } + while (1); + + DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + + +void DSP4_OP0E() +{ + DSP4_vars.OAM_RowMax = 16; + memset(DSP4_vars.OAM_Row, 0, 64); +} + + +////////////////////////////////////////////////////////////// + +void DSP4_OP0F() +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + case 3: + goto resume3; break; + case 4: + goto resume4; break; + } + + //////////////////////////////////////////////////// + // process initial inputs + + // sort inputs + DSP4_READ_WORD(); // 0x0000 + DSP4_vars.world_y = DSP4_READ_DWORD(); + DSP4_vars.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4_vars.viewport_bottom = DSP4_READ_WORD(); + DSP4_vars.world_x = DSP4_READ_DWORD(); + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4_vars.world_yofs = DSP4_READ_WORD(); + DSP4_vars.world_dy = DSP4_READ_DWORD(); + DSP4_vars.world_dx = DSP4_READ_DWORD(); + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_READ_WORD(); // 0x0000 + DSP4_vars.world_xenv = DSP4_READ_DWORD(); + DSP4_vars.world_ddy = DSP4_READ_WORD(); + DSP4_vars.world_ddx = DSP4_READ_WORD(); + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // initial (x,y,offset) at starting DSP4_vars.raster line + DSP4_vars.view_x1 = (int16)((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16); + DSP4_vars.view_y1 = (int16)(DSP4_vars.world_y >> 16); + DSP4_vars.view_xofs1 = (int16)(DSP4_vars.world_x >> 16); + DSP4_vars.view_yofs1 = DSP4_vars.world_yofs; + DSP4_vars.view_turnoff_x = 0; + DSP4_vars.view_turnoff_dx = 0; + + // first DSP4_vars.raster line + DSP4_vars.poly_raster[0][0] = DSP4_vars.poly_bottom[0][0]; + + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // perspective projection of world (x,y,scroll) points + // based on the current projection lines + DSP4_vars.view_x2 = (int16)(((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16) * DSP4_vars.distance >> 15); + DSP4_vars.view_y2 = (int16)((DSP4_vars.world_y >> 16) * DSP4_vars.distance >> 15); + DSP4_vars.view_xofs2 = DSP4_vars.view_x2; + DSP4_vars.view_yofs2 = (DSP4_vars.world_yofs * DSP4_vars.distance >> 15) + DSP4_vars.poly_bottom[0][0] - DSP4_vars.view_y2; + + // 1. World x-location before transformation + // 2. Viewer x-position at the next + // 3. World y-location before perspective projection + // 4. Viewer y-position below the horizon + // 5. Number of DSP4_vars.raster lines drawn in this iteration + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((uint16)((DSP4_vars.world_x + DSP4_vars.world_xenv) >> 16)); + DSP4_WRITE_WORD(DSP4_vars.view_x2); + DSP4_WRITE_WORD((uint16)(DSP4_vars.world_y >> 16)); + DSP4_WRITE_WORD(DSP4_vars.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of DSP4_vars.raster lines used + DSP4_vars.segments = DSP4_vars.poly_raster[0][0] - DSP4_vars.view_y2; + + // prevent overdraw + if (DSP4_vars.view_y2 >= DSP4_vars.poly_raster[0][0]) + DSP4_vars.segments = 0; + else + DSP4_vars.poly_raster[0][0] = DSP4_vars.view_y2; + + // don't draw outside the window + if (DSP4_vars.view_y2 < DSP4_vars.poly_top[0][0]) + { + DSP4_vars.segments = 0; + + // flush remaining DSP4_vars.raster lines + if (DSP4_vars.view_y1 >= DSP4_vars.poly_top[0][0]) + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4_vars.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < 4; DSP4_vars.lcv++) + { + // grab inputs + DSP4.in_count = 4; + DSP4_WAIT(1); + resume1 : + for (;;) + { + int16 distance; + int16 color, red, green, blue; + + distance = DSP4_READ_WORD(); + color = DSP4_READ_WORD(); + + // U1+B5+G5+R5 + red = color & 0x1f; + green = (color >> 5) & 0x1f; + blue = (color >> 10) & 0x1f; + + // dynamic lighting + red = (red * distance >> 15) & 0x1f; + green = (green * distance >> 15) & 0x1f; + blue = (blue * distance >> 15) & 0x1f; + color = red | (green << 5) | (blue << 10); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(color); + break; + } + } + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4_vars.view_xofs2 - DSP4_vars.view_xofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + py_dy = (DSP4_vars.view_yofs2 - DSP4_vars.view_yofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + + + // starting step values + x_scroll = SEX16(DSP4_vars.poly_cx[0][0] + DSP4_vars.view_xofs1); + y_scroll = SEX16(-DSP4_vars.viewport_bottom + DSP4_vars.view_yofs1 + DSP4_vars.view_yofsenv + DSP4_vars.poly_cx[1][0] - DSP4_vars.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < DSP4_vars.segments; DSP4_vars.lcv++) + { + // 1. HDMA memory pointer + // 2. vertical scroll offset ($210E) + // 3. horizontal scroll offset ($210D) + + DSP4_WRITE_WORD(DSP4_vars.poly_ptr[0][0]); + DSP4_WRITE_WORD((uint16)((y_scroll + 0x8000) >> 16)); + DSP4_WRITE_WORD((uint16)((x_scroll + 0x8000) >> 16)); + + // update memory address + DSP4_vars.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + //////////////////////////////////////////////////// + // Post-update + + // update new viewer (x,y,scroll) to last DSP4_vars.raster line drawn + DSP4_vars.view_x1 = DSP4_vars.view_x2; + DSP4_vars.view_y1 = DSP4_vars.view_y2; + DSP4_vars.view_xofs1 = DSP4_vars.view_xofs2; + DSP4_vars.view_yofs1 = DSP4_vars.view_yofs2; + + // add deltas for projection lines + DSP4_vars.world_dx += SEX78(DSP4_vars.world_ddx); + DSP4_vars.world_dy += SEX78(DSP4_vars.world_ddy); + + // update projection lines + DSP4_vars.world_x += (DSP4_vars.world_dx + DSP4_vars.world_xenv); + DSP4_vars.world_y += DSP4_vars.world_dy; + + // update road turnoff position + DSP4_vars.view_turnoff_x += DSP4_vars.view_turnoff_dx; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(2) resume2: + + // check for termination + DSP4_vars.distance = DSP4_READ_WORD(); + if (DSP4_vars.distance == -0x8000) + break; + + // road splice + if( (uint16) DSP4_vars.distance == 0x8001 ) + { + DSP4.in_count = 6; + DSP4_WAIT(3) resume3: + + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_vars.view_turnoff_x = DSP4_READ_WORD(); + DSP4_vars.view_turnoff_dx = DSP4_READ_WORD(); + + // factor in new changes + DSP4_vars.view_x1 += ( DSP4_vars.view_turnoff_x * DSP4_vars.distance >> 15 ); + DSP4_vars.view_xofs1 += ( DSP4_vars.view_turnoff_x * DSP4_vars.distance >> 15 ); + + // update stepping values + DSP4_vars.view_turnoff_x += DSP4_vars.view_turnoff_dx; + + DSP4.in_count = 2; + DSP4_WAIT(2) + } + + // already have 2 bytes in queue + DSP4.in_count = 6; + DSP4_WAIT(4) resume4 : + + // inspect inputs + DSP4_vars.world_ddy = DSP4_READ_WORD(); + DSP4_vars.world_ddx = DSP4_READ_WORD(); + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // no envelope here + DSP4_vars.world_xenv = 0; + } + while (1); + + // terminate op + DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + + +void DSP4_OP10() +{ + DSP4.waiting4command = FALSE; + + // op flow control + switch (DSP4_vars.DSP4_Logic) + { + case 1: + goto resume1; break; + case 2: + goto resume2; break; + case 3: + goto resume3; break; + } + + //////////////////////////////////////////////////// + // sort inputs + + DSP4_READ_WORD(); // 0x0000 + DSP4_vars.world_y = DSP4_READ_DWORD(); + DSP4_vars.poly_bottom[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_top[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_cx[1][0] = DSP4_READ_WORD(); + DSP4_vars.viewport_bottom = DSP4_READ_WORD(); + DSP4_vars.world_x = DSP4_READ_DWORD(); + DSP4_vars.poly_cx[0][0] = DSP4_READ_WORD(); + DSP4_vars.poly_ptr[0][0] = DSP4_READ_WORD(); + DSP4_vars.world_yofs = DSP4_READ_WORD(); + DSP4_vars.distance = DSP4_READ_WORD(); + DSP4_vars.view_y2 = DSP4_READ_WORD(); + DSP4_vars.view_dy = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_x2 = DSP4_READ_WORD(); + DSP4_vars.view_dx = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_yofsenv = DSP4_READ_WORD(); + + // initial (x,y,offset) at starting DSP4_vars.raster line + DSP4_vars.view_x1 = (int16)(DSP4_vars.world_x >> 16); + DSP4_vars.view_y1 = (int16)(DSP4_vars.world_y >> 16); + DSP4_vars.view_xofs1 = DSP4_vars.view_x1; + DSP4_vars.view_yofs1 = DSP4_vars.world_yofs; + + // first DSP4_vars.raster line + DSP4_vars.poly_raster[0][0] = DSP4_vars.poly_bottom[0][0]; + + do + { + //////////////////////////////////////////////////// + // process one iteration of projection + + // add shaping + DSP4_vars.view_x2 += DSP4_vars.view_dx; + DSP4_vars.view_y2 += DSP4_vars.view_dy; + + // vertical scroll calculation + DSP4_vars.view_xofs2 = DSP4_vars.view_x2; + DSP4_vars.view_yofs2 = (DSP4_vars.world_yofs * DSP4_vars.distance >> 15) + DSP4_vars.poly_bottom[0][0] - DSP4_vars.view_y2; + + // 1. Viewer x-position at the next + // 2. Viewer y-position below the horizon + // 3. Number of DSP4_vars.raster lines drawn in this iteration + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(DSP4_vars.view_x2); + DSP4_WRITE_WORD(DSP4_vars.view_y2); + + ////////////////////////////////////////////////////// + + // SR = 0x00 + + // determine # of DSP4_vars.raster lines used + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.view_y2; + + // prevent overdraw + if (DSP4_vars.view_y2 >= DSP4_vars.poly_raster[0][0]) + DSP4_vars.segments = 0; + else + DSP4_vars.poly_raster[0][0] = DSP4_vars.view_y2; + + // don't draw outside the window + if (DSP4_vars.view_y2 < DSP4_vars.poly_top[0][0]) + { + DSP4_vars.segments = 0; + + // flush remaining DSP4_vars.raster lines + if (DSP4_vars.view_y1 >= DSP4_vars.poly_top[0][0]) + DSP4_vars.segments = DSP4_vars.view_y1 - DSP4_vars.poly_top[0][0]; + } + + // SR = 0x80 + + DSP4_WRITE_WORD(DSP4_vars.segments); + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < 4; DSP4_vars.lcv++) + { + // grab inputs + DSP4.in_count = 4; + DSP4_WAIT(1); + resume1 : + for (;;) + { + int16 distance; + int16 color, red, green, blue; + + distance = DSP4_READ_WORD(); + color = DSP4_READ_WORD(); + + // U1+B5+G5+R5 + red = color & 0x1f; + green = (color >> 5) & 0x1f; + blue = (color >> 10) & 0x1f; + + // dynamic lighting + red = (red * distance >> 15) & 0x1f; + green = (green * distance >> 15) & 0x1f; + blue = (blue * distance >> 15) & 0x1f; + color = red | (green << 5) | (blue << 10); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(color); + break; + } + } + } + + ////////////////////////////////////////////////////// + + // scan next command if no SR check needed + if (DSP4_vars.segments) + { + int32 px_dx, py_dy; + int32 x_scroll, y_scroll; + + // SR = 0x00 + + // linear interpolation (lerp) between projected points + px_dx = (DSP4_vars.view_xofs2 - DSP4_vars.view_xofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + py_dy = (DSP4_vars.view_yofs2 - DSP4_vars.view_yofs1) * DSP4_Inverse(DSP4_vars.segments) << 1; + + // starting step values + x_scroll = SEX16(DSP4_vars.poly_cx[0][0] + DSP4_vars.view_xofs1); + y_scroll = SEX16(-DSP4_vars.viewport_bottom + DSP4_vars.view_yofs1 + DSP4_vars.view_yofsenv + DSP4_vars.poly_cx[1][0] - DSP4_vars.world_yofs); + + // SR = 0x80 + + // rasterize line + for (DSP4_vars.lcv = 0; DSP4_vars.lcv < DSP4_vars.segments; DSP4_vars.lcv++) + { + // 1. HDMA memory pointer (bg2) + // 2. vertical scroll offset ($2110) + // 3. horizontal scroll offset ($210F) + + DSP4_WRITE_WORD(DSP4_vars.poly_ptr[0][0]); + DSP4_WRITE_WORD((uint16)((y_scroll + 0x8000) >> 16)); + DSP4_WRITE_WORD((uint16)((x_scroll + 0x8000) >> 16)); + + // update memory address + DSP4_vars.poly_ptr[0][0] -= 4; + + // update screen values + x_scroll += px_dx; + y_scroll += py_dy; + } + } + + ///////////////////////////////////////////////////// + // Post-update + + // update new viewer (x,y,scroll) to last DSP4_vars.raster line drawn + DSP4_vars.view_x1 = DSP4_vars.view_x2; + DSP4_vars.view_y1 = DSP4_vars.view_y2; + DSP4_vars.view_xofs1 = DSP4_vars.view_xofs2; + DSP4_vars.view_yofs1 = DSP4_vars.view_yofs2; + + //////////////////////////////////////////////////// + // command check + + // scan next command + DSP4.in_count = 2; + DSP4_WAIT(2) resume2 : + + // check for opcode termination + DSP4_vars.distance = DSP4_READ_WORD(); + if (DSP4_vars.distance == -0x8000) + break; + + // already have 2 bytes in queue + DSP4.in_count = 10; + DSP4_WAIT(3) resume3 : + + + // inspect inputs + DSP4_vars.view_y2 = DSP4_READ_WORD(); + DSP4_vars.view_dy = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + DSP4_vars.view_x2 = DSP4_READ_WORD(); + DSP4_vars.view_dx = DSP4_READ_WORD() * DSP4_vars.distance >> 15; + } + while (1); + + DSP4.waiting4command = TRUE; +} + +////////////////////////////////////////////////////////////// + +void DSP4_OP11(int16 A, int16 B, int16 C, int16 D, int16 *M) +{ + // 0x155 = 341 = Horizontal Width of the Screen + *M = ((A * 0x0155 >> 2) & 0xf000) | + ((B * 0x0155 >> 6) & 0x0f00) | + ((C * 0x0155 >> 10) & 0x00f0) | + ((D * 0x0155 >> 14) & 0x000f); +} + + + + + +///////////////////////////////////////////////////////////// +//Processing Code +///////////////////////////////////////////////////////////// +uint8 dsp4_byte; +uint16 dsp4_address; + +void InitDSP4() +{ + memset(&DSP4, 0, sizeof(DSP4)); + DSP4.waiting4command = TRUE; +} + +void DSP4SetByte() +{ + // clear pending read + if (DSP4.out_index < DSP4.out_count) + { + DSP4.out_index++; + return; + } + + if (DSP4.waiting4command) + { + if (DSP4.half_command) + { + DSP4.command |= (dsp4_byte << 8); + DSP4.in_index = 0; + DSP4.waiting4command = FALSE; + DSP4.half_command = FALSE; + DSP4.out_count = 0; + DSP4.out_index = 0; + + DSP4_vars.DSP4_Logic = 0; + + + switch (DSP4.command) + { + case 0x0000: + DSP4.in_count = 4; break; + case 0x0001: + DSP4.in_count = 44; break; + case 0x0003: + DSP4.in_count = 0; break; + case 0x0005: + DSP4.in_count = 0; break; + case 0x0006: + DSP4.in_count = 0; break; + case 0x0007: + DSP4.in_count = 34; break; + case 0x0008: + DSP4.in_count = 90; break; + case 0x0009: + DSP4.in_count = 14; break; + case 0x000a: + DSP4.in_count = 6; break; + case 0x000b: + DSP4.in_count = 6; break; + case 0x000d: + DSP4.in_count = 42; break; + case 0x000e: + DSP4.in_count = 0; break; + case 0x000f: + DSP4.in_count = 46; break; + case 0x0010: + DSP4.in_count = 36; break; + case 0x0011: + DSP4.in_count = 8; break; + default: + DSP4.waiting4command = TRUE; + break; + } + } + else + { + DSP4.command = dsp4_byte; + DSP4.half_command = TRUE; + } + } + else + { + DSP4.parameters[DSP4.in_index] = dsp4_byte; + DSP4.in_index++; + } + + if (!DSP4.waiting4command && DSP4.in_count == DSP4.in_index) + { + // Actually execute the command + DSP4.waiting4command = TRUE; + DSP4.out_index = 0; + DSP4.in_index = 0; + + switch (DSP4.command) + { + // 16-bit multiplication + case 0x0000: + { + int16 multiplier, multiplicand; + int32 product; + + multiplier = DSP4_READ_WORD(); + multiplicand = DSP4_READ_WORD(); + + DSP4_Multiply(multiplicand, multiplier, &product); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD((uint16)(product)); + DSP4_WRITE_WORD((uint16)(product >> 16)); + } + break; + + // single-player track projection + case 0x0001: + DSP4_OP01(); break; + + // single-player selection + case 0x0003: + DSP4_OP03(); break; + + // clear OAM + case 0x0005: + DSP4_OP05(); break; + + // transfer OAM + case 0x0006: + DSP4_OP06(); break; + + // single-player track turnoff projection + case 0x0007: + DSP4_OP07(); break; + + // solid polygon projection + case 0x0008: + DSP4_OP08(); break; + + // sprite projection + case 0x0009: + DSP4_OP09(); break; + + // unknown + case 0x000A: + { + int16 in1a = DSP4_READ_WORD(); + int16 in2a = DSP4_READ_WORD(); + int16 in3a = DSP4_READ_WORD(); + int16 out1a, out2a, out3a, out4a; + + DSP4_OP0A(in2a, &out2a, &out1a, &out4a, &out3a); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(out1a); + DSP4_WRITE_WORD(out2a); + DSP4_WRITE_WORD(out3a); + DSP4_WRITE_WORD(out4a); + } + break; + + // set OAM + case 0x000B: + { + int16 sp_x = DSP4_READ_WORD(); + int16 sp_y = DSP4_READ_WORD(); + int16 sp_attr = DSP4_READ_WORD(); + bool8 draw = 1; + + DSP4_CLEAR_OUT(); + + DSP4_OP0B(&draw, sp_x, sp_y, sp_attr, 0, 1); + } + break; + + // multi-player track projection + case 0x000D: + DSP4_OP0D(); break; + + // multi-player selection + case 0x000E: + DSP4_OP0E(); break; + + // single-player track projection with lighting + case 0x000F: + DSP4_OP0F(); break; + + // single-player track turnoff projection with lighting + case 0x0010: + DSP4_OP10(); break; + + // unknown: horizontal mapping command + case 0x0011: + { + int16 a, b, c, d, m; + + + d = DSP4_READ_WORD(); + c = DSP4_READ_WORD(); + b = DSP4_READ_WORD(); + a = DSP4_READ_WORD(); + + DSP4_OP11(a, b, c, d, &m); + + DSP4_CLEAR_OUT(); + DSP4_WRITE_WORD(m); + + break; + } + + default: + break; + } + } +} + +void DSP4GetByte() +{ + if (DSP4.out_count) + { + dsp4_byte = (uint8) DSP4.output[DSP4.out_index&0x1FF]; + DSP4.out_index++; + if (DSP4.out_count == DSP4.out_index) + DSP4.out_count = 0; + } + else + { + dsp4_byte = 0xff; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/dsp4/dsp4emu.h b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4emu.h new file mode 100755 index 0000000000..834b33de4b --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/dsp4/dsp4emu.h @@ -0,0 +1,108 @@ +//DSP-4 emulator code +//Copyright (c) 2004-2006 Dreamer Nom, John Weidman, Kris Bleakley, Nach, z80 gaiden + +#ifndef DSP4EMU_H +#define DSP4EMU_H + +#undef TRUE +#undef FALSE +#define TRUE true +#define FALSE false + +struct DSP4_t +{ + bool8 waiting4command; + bool8 half_command; + uint16 command; + uint32 in_count; + uint32 in_index; + uint32 out_count; + uint32 out_index; + uint8 parameters[512]; + uint8 output[512]; +}; + +extern struct DSP4_t DSP4; + +struct DSP4_vars_t +{ + // op control + int8 DSP4_Logic; // controls op flow + + + // projection format + int16 lcv; // loop-control variable + int16 distance; // z-position into virtual world + int16 raster; // current raster line + int16 segments; // number of raster lines drawn + + // 1.15.16 or 1.15.0 [sign, integer, fraction] + int32 world_x; // line of x-projection in world + int32 world_y; // line of y-projection in world + int32 world_dx; // projection line x-delta + int32 world_dy; // projection line y-delta + int16 world_ddx; // x-delta increment + int16 world_ddy; // y-delta increment + int32 world_xenv; // world x-shaping factor + int16 world_yofs; // world y-vertical scroll + + int16 view_x1; // current viewer-x + int16 view_y1; // current viewer-y + int16 view_x2; // future viewer-x + int16 view_y2; // future viewer-y + int16 view_dx; // view x-delta factor + int16 view_dy; // view y-delta factor + int16 view_xofs1; // current viewer x-vertical scroll + int16 view_yofs1; // current viewer y-vertical scroll + int16 view_xofs2; // future viewer x-vertical scroll + int16 view_yofs2; // future viewer y-vertical scroll + int16 view_yofsenv; // y-scroll shaping factor + int16 view_turnoff_x; // road turnoff data + int16 view_turnoff_dx; // road turnoff delta factor + + + // drawing area + + int16 viewport_cx; // x-center of viewport window + int16 viewport_cy; // y-center of render window + int16 viewport_left; // x-left of viewport + int16 viewport_right; // x-right of viewport + int16 viewport_top; // y-top of viewport + int16 viewport_bottom; // y-bottom of viewport + + + // sprite structure + + int16 sprite_x; // projected x-pos of sprite + int16 sprite_y; // projected y-pos of sprite + int16 sprite_attr; // obj attributes + bool8 sprite_size; // sprite size: 8x8 or 16x16 + int16 sprite_clipy; // visible line to clip pixels off + int16 sprite_count; + + // generic projection variables designed for + // two solid polygons + two polygon sides + + int16 poly_clipLf[2][2]; // left clip boundary + int16 poly_clipRt[2][2]; // right clip boundary + int16 poly_ptr[2][2]; // HDMA structure pointers + int16 poly_raster[2][2]; // current raster line below horizon + int16 poly_top[2][2]; // top clip boundary + int16 poly_bottom[2][2]; // bottom clip boundary + int16 poly_cx[2][2]; // center for left/right points + int16 poly_start[2]; // current projection points + int16 poly_plane[2]; // previous z-plane distance + + + // OAM + int16 OAM_attr[16]; // OAM (size,MSB) data + int16 OAM_index; // index into OAM table + int16 OAM_bits; // offset into OAM table + + int16 OAM_RowMax; // maximum number of tiles per 8 aligned pixels (row) + int16 OAM_Row[32]; // current number of tiles per row +}; + +extern struct DSP4_vars_t DSP4_vars; + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/obc1/obc1.cpp b/Mednafen/mednafen/snes/src/chip/obc1/obc1.cpp new file mode 100755 index 0000000000..3526078c62 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/obc1/obc1.cpp @@ -0,0 +1,84 @@ +#include <../base.hpp> + +#define OBC1_CPP +namespace bSNES_v059 { + +OBC1 obc1; + +#include "serialization.cpp" + +void OBC1::init() { +} + +void OBC1::enable() { + bus.map(Bus::MapDirect, 0x00, 0x3f, 0x6000, 0x7fff, *this); + bus.map(Bus::MapDirect, 0x80, 0xbf, 0x6000, 0x7fff, *this); +} + +void OBC1::power() { + reset(); +} + +void OBC1::reset() { + for(unsigned i = 0x0000; i <= 0x1fff; i++) ram_write(i, 0xff); + + status.baseptr = (ram_read(0x1ff5) & 1) ? 0x1800 : 0x1c00; + status.address = (ram_read(0x1ff6) & 0x7f); + status.shift = (ram_read(0x1ff6) & 3) << 1; +} + +uint8 OBC1::read(unsigned addr) { + addr &= 0x1fff; + if((addr & 0x1ff8) != 0x1ff0) return ram_read(addr); + + switch(addr) { default: //never used, avoids compiler warning + case 0x1ff0: return ram_read(status.baseptr + (status.address << 2) + 0); + case 0x1ff1: return ram_read(status.baseptr + (status.address << 2) + 1); + case 0x1ff2: return ram_read(status.baseptr + (status.address << 2) + 2); + case 0x1ff3: return ram_read(status.baseptr + (status.address << 2) + 3); + case 0x1ff4: return ram_read(status.baseptr + (status.address >> 2) + 0x200); + case 0x1ff5: case 0x1ff6: case 0x1ff7: return ram_read(addr); + } +} + +void OBC1::write(unsigned addr, uint8 data) { + addr &= 0x1fff; + if((addr & 0x1ff8) != 0x1ff0) return ram_write(addr, data); + + switch(addr) { + case 0x1ff0: ram_write(status.baseptr + (status.address << 2) + 0, data); break; + case 0x1ff1: ram_write(status.baseptr + (status.address << 2) + 1, data); break; + case 0x1ff2: ram_write(status.baseptr + (status.address << 2) + 2, data); break; + case 0x1ff3: ram_write(status.baseptr + (status.address << 2) + 3, data); break; + case 0x1ff4: { + uint8 temp = ram_read(status.baseptr + (status.address >> 2) + 0x200); + temp = (temp & ~(3 << status.shift)) | ((data & 3) << status.shift); + ram_write(status.baseptr + (status.address >> 2) + 0x200, temp); + } break; + case 0x1ff5: { + status.baseptr = (data & 1) ? 0x1800 : 0x1c00; + ram_write(addr, data); + } break; + case 0x1ff6: { + status.address = (data & 0x7f); + status.shift = (data & 3) << 1; + ram_write(addr, data); + } break; + case 0x1ff7: { + ram_write(addr, data); + } break; + } +} + +uint8 OBC1::ram_read(unsigned addr) { + return memory::cartram.read(addr & 0x1fff); +} + +void OBC1::ram_write(unsigned addr, uint8 data) { + memory::cartram.write(addr & 0x1fff, data); +} + +OBC1::OBC1() {} +OBC1::~OBC1() {} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/obc1/obc1.hpp b/Mednafen/mednafen/snes/src/chip/obc1/obc1.hpp new file mode 100755 index 0000000000..4b5d44088a --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/obc1/obc1.hpp @@ -0,0 +1,26 @@ +class OBC1 : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + void serialize(serializer&); + OBC1(); + ~OBC1(); + +private: + uint8 ram_read(unsigned addr); + void ram_write(unsigned addr, uint8 data); + + struct { + uint16 address; + uint16 baseptr; + uint16 shift; + } status; +}; + +extern OBC1 obc1; diff --git a/Mednafen/mednafen/snes/src/chip/obc1/serialization.cpp b/Mednafen/mednafen/snes/src/chip/obc1/serialization.cpp new file mode 100755 index 0000000000..3d61aafc38 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/obc1/serialization.cpp @@ -0,0 +1,9 @@ +#ifdef OBC1_CPP + +void OBC1::serialize(serializer &s) { + s.integer(status.address); + s.integer(status.baseptr); + s.integer(status.shift); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sa1/bus/bus.cpp b/Mednafen/mednafen/snes/src/chip/sa1/bus/bus.cpp new file mode 100755 index 0000000000..062328d000 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/bus/bus.cpp @@ -0,0 +1,243 @@ +#ifdef SA1_CPP + +VBRBus vbrbus; +SA1Bus sa1bus; + +namespace memory { + StaticRAM iram(2048); + //accessed by: + VectorSelectionPage vectorsp; //S-CPU + SA-1 + CPUIRAM cpuiram; //S-CPU + SA1IRAM sa1iram; //SA-1 + SA1BWRAM sa1bwram; //SA-1 + CC1BWRAM cc1bwram; //S-CPU + BitmapRAM bitmapram; //SA-1 +} + +//$230c (VDPL), $230d (VDPH) use this bus to read variable-length data. +//this is used both to avoid VBR-reads from accessing MMIO registers, and +//to avoid syncing the S-CPU and SA-1*; as both chips are able to access +//these ports. +//(* eg, memory::cartram is used directly, as memory::sa1bwram syncs to the S-CPU) +void VBRBus::init() { + map(MapDirect, 0x00, 0xff, 0x0000, 0xffff, memory::memory_unmapped); + + map(MapLinear, 0x00, 0x3f, 0x0000, 0x07ff, memory::iram); + map(MapLinear, 0x00, 0x3f, 0x3000, 0x37ff, memory::iram); + map(MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::cartram); + map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::cartram); + map(MapLinear, 0x80, 0xbf, 0x0000, 0x07ff, memory::iram); + map(MapLinear, 0x80, 0xbf, 0x3000, 0x37ff, memory::iram); + map(MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::cartram); + map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); +} + +void SA1Bus::init() { + map(MapDirect, 0x00, 0xff, 0x0000, 0xffff, memory::memory_unmapped); + for(unsigned i = 0x2200; i <= 0x23ff; i++) memory::mmio.map(i, sa1); + + map(MapLinear, 0x00, 0x3f, 0x0000, 0x07ff, memory::sa1iram); + map(MapDirect, 0x00, 0x3f, 0x2200, 0x23ff, memory::mmio); + map(MapLinear, 0x00, 0x3f, 0x3000, 0x37ff, memory::sa1iram); + map(MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::sa1bwram); + map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::sa1bwram); + map(MapLinear, 0x60, 0x6f, 0x0000, 0xffff, memory::bitmapram); + map(MapLinear, 0x80, 0xbf, 0x0000, 0x07ff, memory::sa1iram); + map(MapDirect, 0x80, 0xbf, 0x2200, 0x23ff, memory::mmio); + map(MapLinear, 0x80, 0xbf, 0x3000, 0x37ff, memory::sa1iram); + map(MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::sa1bwram); + map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); + + bus.map(MapLinear, 0x00, 0x3f, 0x3000, 0x37ff, memory::cpuiram); + bus.map(MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::cc1bwram); + bus.map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + bus.map(MapLinear, 0x40, 0x4f, 0x0000, 0xffff, memory::cc1bwram); + bus.map(MapLinear, 0x80, 0xbf, 0x3000, 0x37ff, memory::cpuiram); + bus.map(MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::cc1bwram); + bus.map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + bus.map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); + + memory::vectorsp.sync(); +} + +//=================== +//VectorSelectionPage +//=================== + +//this class maps $00:[ff00-ffff] for the purpose of supporting: +//$2209.d6 IVSW (S-CPU IRQ vector selection) (0 = cart, 1 = SA-1) +//$2209.d4 NVSW (S-CPU NMI vector selection) (0 = cart, 1 = SA-1) +//when set, vector addresses are over-ridden with SA-1 register settings: +//SIV = S-CPU IRQ vector address override +//SNV = S-CPU NMI vector address override +// +//$00:[ffea-ffeb|ffee-ffef] are special cased on read; +//all other addresses return original mapped data. + +uint8 VectorSelectionPage::read(unsigned addr) { + switch(0xff00 | (addr & 0xff)) { + case 0xffea: case 0xffeb: { + if(sa1.mmio.cpu_nvsw == true) return (sa1.mmio.snv >> ((addr & 1) << 3)); + } break; + + case 0xffee: case 0xffef: { + if(sa1.mmio.cpu_ivsw == true) return (sa1.mmio.siv >> ((addr & 1) << 3)); + } break; + } + + return access->read(addr); +} + +void VectorSelectionPage::write(unsigned addr, uint8 data) { + return access->write(addr, data); +} + +//call this whenever bus is remapped. +//note: S-CPU and SA-1 bus always share $00:[ff00-ffff] as cartridge ROM data; +//the SA-1 MMC does not allow mapping these independently between processors. +//this allows this class to be shared for both, caching only ones' access class. +void VectorSelectionPage::sync() { + if(bus.page[0x00ff00 >> 8].access != this) { + //bus was re-mapped, hook access routine + access = bus.page[0x00ff00 >> 8].access; + bus.page[0x00ff00 >> 8].access = this; + sa1bus.page[0x00ff00 >> 8].access = this; + } +} + +//======= +//SA1IRAM +//======= + +unsigned SA1IRAM::size() const { + return memory::iram.size(); +} + +uint8 SA1IRAM::read(unsigned addr) { + scheduler.sync_copcpu(); + return memory::iram.read(addr); +} + +void SA1IRAM::write(unsigned addr, uint8 data) { + scheduler.sync_copcpu(); + memory::iram.write(addr, data); +} + +//======= +//CPUIRAM +//======= + +unsigned CPUIRAM::size() const { + return memory::iram.size(); +} + +uint8 CPUIRAM::read(unsigned addr) { + scheduler.sync_cpucop(); + return memory::iram.read(addr); +} + +void CPUIRAM::write(unsigned addr, uint8 data) { + scheduler.sync_cpucop(); + memory::iram.write(addr, data); +} + +//======== +//SA1BWRAM +//======== + +unsigned SA1BWRAM::size() const { + return memory::cartram.size(); +} + +uint8 SA1BWRAM::read(unsigned addr) { + scheduler.sync_copcpu(); + return memory::cartram.read(addr); +} + +void SA1BWRAM::write(unsigned addr, uint8 data) { + scheduler.sync_copcpu(); + memory::cartram.write(addr, data); +} + +//======== +//CC1BWRAM +//======== + +unsigned CC1BWRAM::size() const { + return memory::cartram.size(); +} + +uint8 CC1BWRAM::read(unsigned addr) { + scheduler.sync_cpucop(); + if(dma) return sa1.dma_cc1_read(addr); + return memory::cartram.read(addr); +} + +void CC1BWRAM::write(unsigned addr, uint8 data) { + scheduler.sync_cpucop(); + memory::cartram.write(addr, data); +} + +//========= +//BitmapRAM +//========= + +unsigned BitmapRAM::size() const { + return 0x100000; +} + +uint8 BitmapRAM::read(unsigned addr) { + scheduler.sync_copcpu(); + + if(sa1.mmio.bbf == 0) { + //4bpp + unsigned shift = addr & 1; + addr = (addr >> 1) & (memory::cartram.size() - 1); + switch(shift) { default: + case 0: return (memory::cartram.read(addr) >> 0) & 15; + case 1: return (memory::cartram.read(addr) >> 4) & 15; + } + } else { + //2bpp + unsigned shift = addr & 3; + addr = (addr >> 2) & (memory::cartram.size() - 1); + switch(shift) { default: + case 0: return (memory::cartram.read(addr) >> 0) & 3; + case 1: return (memory::cartram.read(addr) >> 2) & 3; + case 2: return (memory::cartram.read(addr) >> 4) & 3; + case 3: return (memory::cartram.read(addr) >> 6) & 3; + } + } +} + +void BitmapRAM::write(unsigned addr, uint8 data) { + scheduler.sync_copcpu(); + + if(sa1.mmio.bbf == 0) { + //4bpp + unsigned shift = addr & 1; + addr = (addr >> 1) & (memory::cartram.size() - 1); + switch(shift) { default: + case 0: data = (memory::cartram.read(addr) & 0xf0) | ((data & 15) << 0); break; + case 1: data = (memory::cartram.read(addr) & 0x0f) | ((data & 15) << 4); break; + } + } else { + //2bpp + unsigned shift = addr & 3; + addr = (addr >> 2) & (memory::cartram.size() - 1); + switch(shift) { default: + case 0: data = (memory::cartram.read(addr) & 0xfc) | ((data & 3) << 0); break; + case 1: data = (memory::cartram.read(addr) & 0xf3) | ((data & 3) << 2); break; + case 2: data = (memory::cartram.read(addr) & 0xcf) | ((data & 3) << 4); break; + case 3: data = (memory::cartram.read(addr) & 0x3f) | ((data & 3) << 6); break; + } + } + + memory::cartram.write(addr, data); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sa1/bus/bus.hpp b/Mednafen/mednafen/snes/src/chip/sa1/bus/bus.hpp new file mode 100755 index 0000000000..bec2f82dba --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/bus/bus.hpp @@ -0,0 +1,56 @@ +struct VBRBus : Bus { + void init(); +}; + +struct SA1Bus : Bus { + void init(); +}; + +struct VectorSelectionPage : Memory { + alwaysinline uint8 read(unsigned); + alwaysinline void write(unsigned, uint8); + void sync(); + Memory *access; +}; + +struct CPUIRAM : Memory { + unsigned size() const; + alwaysinline uint8 read(unsigned); + alwaysinline void write(unsigned, uint8); +}; + +struct SA1IRAM : Memory { + unsigned size() const; + alwaysinline uint8 read(unsigned); + alwaysinline void write(unsigned, uint8); +}; + +struct SA1BWRAM : Memory { + unsigned size() const; + alwaysinline uint8 read(unsigned); + alwaysinline void write(unsigned, uint8); +}; + +struct CC1BWRAM : Memory { + unsigned size() const; + alwaysinline uint8 read(unsigned); + alwaysinline void write(unsigned, uint8); + bool dma; +}; + +struct BitmapRAM : Memory { + unsigned size() const; + alwaysinline uint8 read(unsigned); + alwaysinline void write(unsigned, uint8); +}; + +namespace memory { + extern StaticRAM iram; + + extern VectorSelectionPage vectorsp; + extern CPUIRAM cpuiram; + extern SA1IRAM sa1iram; + extern SA1BWRAM sa1bwram; + extern CC1BWRAM cc1bwram; + extern BitmapRAM bitmapram; +}; diff --git a/Mednafen/mednafen/snes/src/chip/sa1/dma/dma.cpp b/Mednafen/mednafen/snes/src/chip/sa1/dma/dma.cpp new file mode 100755 index 0000000000..aecb73585d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/dma/dma.cpp @@ -0,0 +1,139 @@ +#ifdef SA1_CPP + +//==================== +//direct data transfer +//==================== + +void SA1::dma_normal() { + while(mmio.dtc--) { + uint8 data = regs.mdr; + uint32 dsa = mmio.dsa++; + uint32 dda = mmio.dda++; + + //source and destination cannot be the same + if(mmio.sd == DMA::SourceBWRAM && mmio.dd == DMA::DestBWRAM) continue; + if(mmio.sd == DMA::SourceIRAM && mmio.dd == DMA::DestIRAM ) continue; + + switch(mmio.sd) { + case DMA::SourceROM: { + if((dsa & 0x408000) == 0x008000 || (dsa & 0xc00000) == 0xc00000) { + data = sa1bus.read(dsa); + } + } break; + + case DMA::SourceBWRAM: { + if((dsa & 0x40e000) == 0x006000 || (dsa & 0xf00000) == 0x400000) { + data = sa1bus.read(dsa); + } + } break; + + case DMA::SourceIRAM: { + data = memory::iram.read(dsa & 0x07ff); + } break; + } + + switch(mmio.dd) { + case DMA::DestBWRAM: { + if((dda & 0x40e000) == 0x006000 || (dda & 0xf00000) == 0x400000) { + sa1bus.write(dda, data); + } + } break; + + case DMA::DestIRAM: { + memory::iram.write(dda & 0x07ff, data); + } break; + } + } + + mmio.dma_irqfl = true; + if(mmio.dma_irqen) mmio.dma_irqcl = 0; +} + +//((byte & 6) << 3) + (byte & 1) explanation: +//transforms a byte index (0-7) into a planar index: +//result[] = { 0, 1, 16, 17, 32, 33, 48, 49 }; +//works for 2bpp, 4bpp and 8bpp modes + +//=========================== +//type-1 character conversion +//=========================== + +void SA1::dma_cc1() { + memory::cc1bwram.dma = true; + mmio.chdma_irqfl = true; + if(mmio.chdma_irqen) { + mmio.chdma_irqcl = 0; + cpu.regs.irq = 1; + } +} + +uint8 SA1::dma_cc1_read(unsigned addr) { + //16 bytes/char (2bpp); 32 bytes/char (4bpp); 64 bytes/char (8bpp) + unsigned charmask = (1 << (6 - mmio.dmacb)) - 1; + + if((addr & charmask) == 0) { + //buffer next character to I-RAM + unsigned bpp = 2 << (2 - mmio.dmacb); + unsigned bpl = (8 << mmio.dmasize) >> mmio.dmacb; + unsigned bwmask = memory::cartram.size() - 1; + unsigned tile = ((addr - mmio.dsa) & bwmask) >> (6 - mmio.dmacb); + unsigned ty = (tile >> mmio.dmasize); + unsigned tx = tile & ((1 << mmio.dmasize) - 1); + unsigned bwaddr = mmio.dsa + ty * 8 * bpl + tx * bpp; + + for(unsigned y = 0; y < 8; y++) { + uint64 data = 0; + for(unsigned byte = 0; byte < bpp; byte++) { + data |= (uint64)memory::cartram.read((bwaddr + byte) & bwmask) << (byte << 3); + } + bwaddr += bpl; + + uint8 out[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + for(unsigned x = 0; x < 8; x++) { + out[0] |= (data & 1) << (7 - x); data >>= 1; + out[1] |= (data & 1) << (7 - x); data >>= 1; + if(mmio.dmacb == 2) continue; + out[2] |= (data & 1) << (7 - x); data >>= 1; + out[3] |= (data & 1) << (7 - x); data >>= 1; + if(mmio.dmacb == 1) continue; + out[4] |= (data & 1) << (7 - x); data >>= 1; + out[5] |= (data & 1) << (7 - x); data >>= 1; + out[6] |= (data & 1) << (7 - x); data >>= 1; + out[7] |= (data & 1) << (7 - x); data >>= 1; + } + + for(unsigned byte = 0; byte < bpp; byte++) { + unsigned p = mmio.dda + (y << 1) + ((byte & 6) << 3) + (byte & 1); + memory::iram.write(p & 0x07ff, out[byte]); + } + } + } + + return memory::iram.read((mmio.dda + (addr & charmask)) & 0x07ff); +} + +//=========================== +//type-2 character conversion +//=========================== + +void SA1::dma_cc2() { + //select register file index (0-7 or 8-15) + const uint8 *brf = &mmio.brf[(dma.line & 1) << 3]; + unsigned bpp = 2 << (2 - mmio.dmacb); + unsigned addr = mmio.dda & 0x07ff; + addr &= ~((1 << (7 - mmio.dmacb)) - 1); + addr += (dma.line & 8) * bpp; + addr += (dma.line & 7) * 2; + + for(unsigned byte = 0; byte < bpp; byte++) { + uint8 output = 0; + for(unsigned bit = 0; bit < 8; bit++) { + output |= ((brf[bit] >> byte) & 1) << (7 - bit); + } + memory::iram.write(addr + ((byte & 6) << 3) + (byte & 1), output); + } + + dma.line = (dma.line + 1) & 15; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sa1/dma/dma.hpp b/Mednafen/mednafen/snes/src/chip/sa1/dma/dma.hpp new file mode 100755 index 0000000000..4d3cff7f93 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/dma/dma.hpp @@ -0,0 +1,11 @@ +struct DMA { + enum CDEN { DmaNormal = 0, DmaCharConversion = 1 }; + enum SD { SourceROM = 0, SourceBWRAM = 1, SourceIRAM = 2 }; + enum DD { DestIRAM = 0, DestBWRAM = 1 }; + unsigned line; +} dma; + +void dma_normal(); +void dma_cc1(); +uint8 dma_cc1_read(unsigned addr); +void dma_cc2(); diff --git a/Mednafen/mednafen/snes/src/chip/sa1/memory/memory.cpp b/Mednafen/mednafen/snes/src/chip/sa1/memory/memory.cpp new file mode 100755 index 0000000000..b2779a35be --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/memory/memory.cpp @@ -0,0 +1,24 @@ +#ifdef SA1_CPP + +//ROM, I-RAM and MMIO registers are accessed at ~10.74MHz (2 clock ticks) +//BW-RAM is accessed at ~5.37MHz (4 clock ticks) +//tick() == 2 clock ticks +//note: bus conflict delays are not emulated at this time + +void SA1::op_io() { + tick(); +} + +uint8 SA1::op_read(unsigned addr) { + tick(); + if(((addr & 0x40e000) == 0x006000) || ((addr & 0xd00000) == 0x400000)) tick(); + return sa1bus.read(addr); +} + +void SA1::op_write(unsigned addr, uint8 data) { + tick(); + if(((addr & 0x40e000) == 0x006000) || ((addr & 0xd00000) == 0x400000)) tick(); + sa1bus.write(addr, data); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sa1/memory/memory.hpp b/Mednafen/mednafen/snes/src/chip/sa1/memory/memory.hpp new file mode 100755 index 0000000000..d466c41690 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/memory/memory.hpp @@ -0,0 +1,5 @@ +alwaysinline void op_io(); +alwaysinline uint8 op_read(unsigned addr); +alwaysinline void op_write(unsigned addr, uint8 data); + +uint8_t vbr_read(unsigned addr); diff --git a/Mednafen/mednafen/snes/src/chip/sa1/mmio/mmio.cpp b/Mednafen/mednafen/snes/src/chip/sa1/mmio/mmio.cpp new file mode 100755 index 0000000000..eb6832edd0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/mmio/mmio.cpp @@ -0,0 +1,633 @@ +#ifdef SA1_CPP + +//BS-X flash carts, when present, are mapped to 0x400000+ +Memory& SA1::mmio_access(unsigned &addr) { + if(!memory::bsxflash.data()) return memory::cartrom; + if(addr < 0x400000) return memory::cartrom; + addr &= 0x3fffff; + return bsxflash; +} + +//(CCNT) SA-1 control +void SA1::mmio_w2200(uint8 data) { + if(mmio.sa1_resb && !(data & 0x80)) { + //reset SA-1 CPU + regs.pc.w = mmio.crv; + regs.pc.b = 0x00; + } + + mmio.sa1_irq = (data & 0x80); + mmio.sa1_rdyb = (data & 0x40); + mmio.sa1_resb = (data & 0x20); + mmio.sa1_nmi = (data & 0x10); + mmio.smeg = (data & 0x0f); + + if(mmio.sa1_irq) { + mmio.sa1_irqfl = true; + if(mmio.sa1_irqen) mmio.sa1_irqcl = 0; + } + + if(mmio.sa1_nmi) { + mmio.sa1_nmifl = true; + if(mmio.sa1_nmien) mmio.sa1_nmicl = 0; + } +} + +//(SIE) S-CPU interrupt enable +void SA1::mmio_w2201(uint8 data) { + if(!mmio.cpu_irqen && (data & 0x80)) { + if(mmio.cpu_irqfl) { + mmio.cpu_irqcl = 0; + cpu.regs.irq = 1; + } + } + + if(!mmio.chdma_irqen && (data & 0x20)) { + if(mmio.chdma_irqfl) { + mmio.chdma_irqcl = 0; + cpu.regs.irq = 1; + } + } + + mmio.cpu_irqen = (data & 0x80); + mmio.chdma_irqen = (data & 0x20); +} + +//(SIC) S-CPU interrupt clear +void SA1::mmio_w2202(uint8 data) { + mmio.cpu_irqcl = (data & 0x80); + mmio.chdma_irqcl = (data & 0x20); + + if(mmio.cpu_irqcl ) mmio.cpu_irqfl = false; + if(mmio.chdma_irqcl) mmio.chdma_irqfl = false; + + if(!mmio.cpu_irqfl && !mmio.chdma_irqfl) cpu.regs.irq = 0; +} + +//(CRV) SA-1 reset vector +void SA1::mmio_w2203(uint8 data) { mmio.crv = (mmio.crv & 0xff00) | data; } +void SA1::mmio_w2204(uint8 data) { mmio.crv = (data << 8) | (mmio.crv & 0xff); } + +//(CNV) SA-1 NMI vector +void SA1::mmio_w2205(uint8 data) { mmio.cnv = (mmio.cnv & 0xff00) | data; } +void SA1::mmio_w2206(uint8 data) { mmio.cnv = (data << 8) | (mmio.cnv & 0xff); } + +//(CIV) SA-1 IRQ vector +void SA1::mmio_w2207(uint8 data) { mmio.civ = (mmio.civ & 0xff00) | data; } +void SA1::mmio_w2208(uint8 data) { mmio.civ = (data << 8) | (mmio.civ & 0xff); } + +//(SCNT) S-CPU control +void SA1::mmio_w2209(uint8 data) { + mmio.cpu_irq = (data & 0x80); + mmio.cpu_ivsw = (data & 0x40); + mmio.cpu_nvsw = (data & 0x10); + mmio.cmeg = (data & 0x0f); + + if(mmio.cpu_irq) { + mmio.cpu_irqfl = true; + if(mmio.cpu_irqen) { + mmio.cpu_irqcl = 0; + cpu.regs.irq = 1; + } + } +} + +//(CIE) SA-1 interrupt enable +void SA1::mmio_w220a(uint8 data) { + if(!mmio.sa1_irqen && (data & 0x80) && mmio.sa1_irqfl ) mmio.sa1_irqcl = 0; + if(!mmio.timer_irqen && (data & 0x40) && mmio.timer_irqfl) mmio.timer_irqcl = 0; + if(!mmio.dma_irqen && (data & 0x20) && mmio.dma_irqfl ) mmio.dma_irqcl = 0; + if(!mmio.sa1_nmien && (data & 0x10) && mmio.sa1_nmifl ) mmio.sa1_nmicl = 0; + + mmio.sa1_irqen = (data & 0x80); + mmio.timer_irqen = (data & 0x40); + mmio.dma_irqen = (data & 0x20); + mmio.sa1_nmien = (data & 0x10); +} + +//(CIC) SA-1 interrupt clear +void SA1::mmio_w220b(uint8 data) { + mmio.sa1_irqcl = (data & 0x80); + mmio.timer_irqcl = (data & 0x40); + mmio.dma_irqcl = (data & 0x20); + mmio.sa1_nmicl = (data & 0x10); + + if(mmio.sa1_irqcl) mmio.sa1_irqfl = false; + if(mmio.timer_irqcl) mmio.timer_irqfl = false; + if(mmio.dma_irqcl) mmio.dma_irqfl = false; + if(mmio.sa1_nmicl) mmio.sa1_nmifl = false; +} + +//(SNV) S-CPU NMI vector +void SA1::mmio_w220c(uint8 data) { mmio.snv = (mmio.snv & 0xff00) | data; } +void SA1::mmio_w220d(uint8 data) { mmio.snv = (data << 8) | (mmio.snv & 0xff); } + +//(SIV) S-CPU IRQ vector +void SA1::mmio_w220e(uint8 data) { mmio.siv = (mmio.siv & 0xff00) | data; } +void SA1::mmio_w220f(uint8 data) { mmio.siv = (data << 8) | (mmio.siv & 0xff); } + +//(TMC) H/V timer control +void SA1::mmio_w2210(uint8 data) { + mmio.hvselb = (data & 0x80); + mmio.ven = (data & 0x02); + mmio.hen = (data & 0x01); +} + +//(CTR) SA-1 timer restart +void SA1::mmio_w2211(uint8 data) { + status.vcounter = 0; + status.hcounter = 0; +} + +//(HCNT) H-count +void SA1::mmio_w2212(uint8 data) { mmio.hcnt = (mmio.hcnt & 0xff00) | (data << 0); } +void SA1::mmio_w2213(uint8 data) { mmio.hcnt = (mmio.hcnt & 0x00ff) | (data << 8); } + +//(VCNT) V-count +void SA1::mmio_w2214(uint8 data) { mmio.vcnt = (mmio.vcnt & 0xff00) | (data << 0); } +void SA1::mmio_w2215(uint8 data) { mmio.vcnt = (mmio.vcnt & 0x00ff) | (data << 8); } + +//(CXB) Super MMC bank C +void SA1::mmio_w2220(uint8 data) { + mmio.cbmode = (data & 0x80); + mmio.cb = (data & 0x07); + + unsigned addr = mmio.cb << 20; + Memory &access = mmio_access(addr); + + if(mmio.cbmode == 0) { + bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom, 0x000000); + sa1bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom, 0x000000); + } else { + bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0x00, 0x1f, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xc0, 0xcf, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xc0, 0xcf, 0x0000, 0xffff, access, addr); + + memory::vectorsp.sync(); +} + +//(DXB) Super MMC bank D +void SA1::mmio_w2221(uint8 data) { + mmio.dbmode = (data & 0x80); + mmio.db = (data & 0x07); + + unsigned addr = mmio.db << 20; + Memory &access = mmio_access(addr); + + if(mmio.dbmode == 0) { + bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x100000); + sa1bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x100000); + } else { + bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0x20, 0x3f, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xd0, 0xdf, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xd0, 0xdf, 0x0000, 0xffff, access, addr); +} + +//(EXB) Super MMC bank E +void SA1::mmio_w2222(uint8 data) { + mmio.ebmode = (data & 0x80); + mmio.eb = (data & 0x07); + + unsigned addr = mmio.eb << 20; + Memory &access = mmio_access(addr); + + if(mmio.ebmode == 0) { + bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom, 0x200000); + sa1bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom, 0x200000); + } else { + bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0x80, 0x9f, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xe0, 0xef, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xe0, 0xef, 0x0000, 0xffff, access, addr); +} + +//(FXB) Super MMC bank F +void SA1::mmio_w2223(uint8 data) { + mmio.fbmode = (data & 0x80); + mmio.fb = (data & 0x07); + + unsigned addr = mmio.fb << 20; + Memory &access = mmio_access(addr); + + if(mmio.fbmode == 0) { + bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x300000); + sa1bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x300000); + } else { + bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, access, addr); + } + + bus.map(Bus::MapLinear, 0xf0, 0xff, 0x0000, 0xffff, access, addr); + sa1bus.map(Bus::MapLinear, 0xf0, 0xff, 0x0000, 0xffff, access, addr); +} + +//(BMAPS) S-CPU BW-RAM address mapping +void SA1::mmio_w2224(uint8 data) { + mmio.sbm = (data & 0x1f); + + bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::cc1bwram, mmio.sbm * 0x2000, 0x2000); + bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::cc1bwram, mmio.sbm * 0x2000, 0x2000); +} + +//(BMAP) SA-1 BW-RAM address mapping +void SA1::mmio_w2225(uint8 data) { + mmio.sw46 = (data & 0x80); + mmio.cbm = (data & 0x7f); + + if(mmio.sw46 == 0) { + //$[40-43]:[0000-ffff] x 32 projection + sa1bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::sa1bwram, (mmio.cbm & 0x1f) * 0x2000, 0x2000); + sa1bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::sa1bwram, (mmio.cbm & 0x1f) * 0x2000, 0x2000); + } else { + //$[60-6f]:[0000-ffff] x 128 projection + sa1bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::bitmapram, mmio.cbm * 0x2000, 0x2000); + sa1bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::bitmapram, mmio.cbm * 0x2000, 0x2000); + } +} + +//(SWBE) S-CPU BW-RAM write enable +void SA1::mmio_w2226(uint8 data) { + mmio.swen = (data & 0x80); +} + +//(CWBE) SA-1 BW-RAM write enable +void SA1::mmio_w2227(uint8 data) { + mmio.cwen = (data & 0x80); +} + +//(BWPA) BW-RAM write-protected area +void SA1::mmio_w2228(uint8 data) { + mmio.bwp = (data & 0x0f); +} + +//(SIWP) S-CPU I-RAM write protection +void SA1::mmio_w2229(uint8 data) { + mmio.siwp = data; +} + +//(CIWP) SA-1 I-RAM write protection +void SA1::mmio_w222a(uint8 data) { + mmio.ciwp = data; +} + +//(DCNT) DMA control +void SA1::mmio_w2230(uint8 data) { + mmio.dmaen = (data & 0x80); + mmio.dprio = (data & 0x40); + mmio.cden = (data & 0x20); + mmio.cdsel = (data & 0x10); + mmio.dd = (data & 0x04); + mmio.sd = (data & 0x03); + + if(mmio.dmaen == 0) dma.line = 0; +} + +//(CDMA) character conversion DMA parameters +void SA1::mmio_w2231(uint8 data) { + mmio.chdend = (data & 0x80); + mmio.dmasize = (data >> 2) & 7; + mmio.dmacb = (data & 0x03); + + if(mmio.chdend) memory::cc1bwram.dma = false; + if(mmio.dmasize > 5) mmio.dmasize = 5; + if(mmio.dmacb > 2) mmio.dmacb = 2; +} + +//(SDA) DMA source device start address +void SA1::mmio_w2232(uint8 data) { mmio.dsa = (mmio.dsa & 0xffff00) | (data << 0); } +void SA1::mmio_w2233(uint8 data) { mmio.dsa = (mmio.dsa & 0xff00ff) | (data << 8); } +void SA1::mmio_w2234(uint8 data) { mmio.dsa = (mmio.dsa & 0x00ffff) | (data << 16); } + +//(DDA) DMA destination start address +void SA1::mmio_w2235(uint8 data) { + mmio.dda = (mmio.dda & 0xffff00) | (data << 0); +} + +void SA1::mmio_w2236(uint8 data) { + mmio.dda = (mmio.dda & 0xff00ff) | (data << 8); + + if(mmio.dmaen == true) { + if(mmio.cden == 0 && mmio.dd == DMA::DestIRAM) { + dma_normal(); + } else if(mmio.cden == 1 && mmio.cdsel == 1) { + dma_cc1(); + } + } +} + +void SA1::mmio_w2237(uint8 data) { + mmio.dda = (mmio.dda & 0x00ffff) | (data << 16); + + if(mmio.dmaen == true) { + if(mmio.cden == 0 && mmio.dd == DMA::DestBWRAM) { + dma_normal(); + } + } +} + +//(DTC) DMA terminal counter +void SA1::mmio_w2238(uint8 data) { mmio.dtc = (mmio.dtc & 0xff00) | (data << 0); } +void SA1::mmio_w2239(uint8 data) { mmio.dtc = (mmio.dtc & 0x00ff) | (data << 8); } + +//(BBF) BW-RAM bitmap format +void SA1::mmio_w223f(uint8 data) { + mmio.bbf = (data & 0x80); +} + +//(BRF) bitmap register files +void SA1::mmio_w2240(uint8 data) { mmio.brf[ 0] = data; } +void SA1::mmio_w2241(uint8 data) { mmio.brf[ 1] = data; } +void SA1::mmio_w2242(uint8 data) { mmio.brf[ 2] = data; } +void SA1::mmio_w2243(uint8 data) { mmio.brf[ 3] = data; } +void SA1::mmio_w2244(uint8 data) { mmio.brf[ 4] = data; } +void SA1::mmio_w2245(uint8 data) { mmio.brf[ 5] = data; } +void SA1::mmio_w2246(uint8 data) { mmio.brf[ 6] = data; } +void SA1::mmio_w2247(uint8 data) { mmio.brf[ 7] = data; + if(mmio.dmaen == true) { + if(mmio.cden == 1 && mmio.cdsel == 0) { + dma_cc2(); + } + } +} + +void SA1::mmio_w2248(uint8 data) { mmio.brf[ 8] = data; } +void SA1::mmio_w2249(uint8 data) { mmio.brf[ 9] = data; } +void SA1::mmio_w224a(uint8 data) { mmio.brf[10] = data; } +void SA1::mmio_w224b(uint8 data) { mmio.brf[11] = data; } +void SA1::mmio_w224c(uint8 data) { mmio.brf[12] = data; } +void SA1::mmio_w224d(uint8 data) { mmio.brf[13] = data; } +void SA1::mmio_w224e(uint8 data) { mmio.brf[14] = data; } +void SA1::mmio_w224f(uint8 data) { mmio.brf[15] = data; + if(mmio.dmaen == true) { + if(mmio.cden == 1 && mmio.cdsel == 0) { + dma_cc2(); + } + } +} + +//(MCNT) arithmetic control +void SA1::mmio_w2250(uint8 data) { + mmio.acm = (data & 0x02); + mmio.md = (data & 0x01); + + if(mmio.acm) mmio.mr = 0; +} + +//(MAL) multiplicand / dividend low +void SA1::mmio_w2251(uint8 data) { + mmio.ma = (mmio.ma & 0xff00) | data; +} + +//(MAH) multiplicand / dividend high +void SA1::mmio_w2252(uint8 data) { + mmio.ma = (data << 8) | (mmio.ma & 0x00ff); +} + +//(MBL) multiplier / divisor low +void SA1::mmio_w2253(uint8 data) { + mmio.mb = (mmio.mb & 0xff00) | data; +} + +//(MBH) multiplier / divisor high +//multiplication / cumulative sum only resets MB +//division resets both MA and MB +void SA1::mmio_w2254(uint8 data) { + mmio.mb = (data << 8) | (mmio.mb & 0x00ff); + + if(mmio.acm == 0) { + if(mmio.md == 0) { + //signed multiplication + mmio.mr = (int16)mmio.ma * (int16)mmio.mb; + mmio.mb = 0; + } else { + //unsigned division + if(mmio.mb == 0) { + mmio.mr = 0; + } else { + int16 quotient = (int16)mmio.ma / (uint16)mmio.mb; + uint16 remainder = (int16)mmio.ma % (uint16)mmio.mb; + mmio.mr = (remainder << 16) | quotient; + } + mmio.ma = 0; + mmio.mb = 0; + } + } else { + //sigma (accumulative multiplication) + mmio.mr += (int16)mmio.ma * (int16)mmio.mb; + mmio.overflow = (mmio.mr >= (1ULL << 40)); + mmio.mr &= (1ULL << 40) - 1; + mmio.mb = 0; + } +} + +//(VBD) variable-length bit processing +void SA1::mmio_w2258(uint8 data) { + mmio.hl = (data & 0x80); + mmio.vb = (data & 0x0f); + if(mmio.vb == 0) mmio.vb = 16; + + if(mmio.hl == 0) { + //fixed mode + mmio.vbit += mmio.vb; + mmio.va += (mmio.vbit >> 3); + mmio.vbit &= 7; + } +} + +//(VDA) variable-length bit game pak ROM start address +void SA1::mmio_w2259(uint8 data) { mmio.va = (mmio.va & 0xffff00) | (data << 0); } +void SA1::mmio_w225a(uint8 data) { mmio.va = (mmio.va & 0xff00ff) | (data << 8); } +void SA1::mmio_w225b(uint8 data) { mmio.va = (mmio.va & 0x00ffff) | (data << 16); mmio.vbit = 0; } + +//(SFR) S-CPU flag read +uint8 SA1::mmio_r2300() { + uint8 data; + data = mmio.cpu_irqfl << 7; + data |= mmio.cpu_ivsw << 6; + data |= mmio.chdma_irqfl << 5; + data |= mmio.cpu_nvsw << 4; + data |= mmio.cmeg; + return data; +} + +//(CFR) SA-1 flag read +uint8 SA1::mmio_r2301() { + uint8 data; + data = mmio.sa1_irqfl << 7; + data |= mmio.timer_irqfl << 6; + data |= mmio.dma_irqfl << 5; + data |= mmio.sa1_nmifl << 4; + data |= mmio.smeg; + return data; +} + +//(HCR) hcounter read +uint8 SA1::mmio_r2302() { + //latch counters + mmio.hcr = status.hcounter >> 2; + mmio.vcr = status.vcounter; + return mmio.hcr >> 0; } +uint8 SA1::mmio_r2303() { return mmio.hcr >> 8; } + +//(VCR) vcounter read +uint8 SA1::mmio_r2304() { return mmio.vcr >> 0; } +uint8 SA1::mmio_r2305() { return mmio.vcr >> 8; } + +//(MR) arithmetic result +uint8 SA1::mmio_r2306() { return mmio.mr >> 0; } +uint8 SA1::mmio_r2307() { return mmio.mr >> 8; } +uint8 SA1::mmio_r2308() { return mmio.mr >> 16; } +uint8 SA1::mmio_r2309() { return mmio.mr >> 24; } +uint8 SA1::mmio_r230a() { return mmio.mr >> 32; } + +//(OF) arithmetic overflow flag +uint8 SA1::mmio_r230b() { return mmio.overflow << 7; } + +//(VDPL) variable-length data read port low +uint8 SA1::mmio_r230c() { + uint32 data = (vbrbus.read(mmio.va + 0) << 0) + | (vbrbus.read(mmio.va + 1) << 8) + | (vbrbus.read(mmio.va + 2) << 16); + data >>= mmio.vbit; + return data >> 0; +} + +//(VDPH) variable-length data read port high +uint8 SA1::mmio_r230d() { + uint32 data = (vbrbus.read(mmio.va + 0) << 0) + | (vbrbus.read(mmio.va + 1) << 8) + | (vbrbus.read(mmio.va + 2) << 16); + data >>= mmio.vbit; + + if(mmio.hl == 1) { + //auto-increment mode + mmio.vbit += mmio.vb; + mmio.va += (mmio.vbit >> 3); + mmio.vbit &= 7; + } + + return data >> 8; +} + +//(VC) version code register +uint8 SA1::mmio_r230e() { + return 0x01; //true value unknown +} + +uint8 SA1::mmio_read(unsigned addr) { + (co_active() == scheduler.thread_cpu ? scheduler.sync_cpucop() : scheduler.sync_copcpu()); + addr &= 0xffff; + + switch(addr) { + case 0x2300: return mmio_r2300(); + case 0x2301: return mmio_r2301(); + case 0x2302: return mmio_r2302(); + case 0x2303: return mmio_r2303(); + case 0x2304: return mmio_r2304(); + case 0x2305: return mmio_r2305(); + case 0x2306: return mmio_r2306(); + case 0x2307: return mmio_r2307(); + case 0x2308: return mmio_r2308(); + case 0x2309: return mmio_r2309(); + case 0x230a: return mmio_r230a(); + case 0x230b: return mmio_r230b(); + case 0x230c: return mmio_r230c(); + case 0x230d: return mmio_r230d(); + case 0x230e: return mmio_r230e(); + } + + return 0x00; +} + +void SA1::mmio_write(unsigned addr, uint8 data) { + (co_active() == scheduler.thread_cpu ? scheduler.sync_cpucop() : scheduler.sync_copcpu()); + addr &= 0xffff; + + switch(addr) { + case 0x2200: return mmio_w2200(data); + case 0x2201: return mmio_w2201(data); + case 0x2202: return mmio_w2202(data); + case 0x2203: return mmio_w2203(data); + case 0x2204: return mmio_w2204(data); + case 0x2205: return mmio_w2205(data); + case 0x2206: return mmio_w2206(data); + case 0x2207: return mmio_w2207(data); + case 0x2208: return mmio_w2208(data); + case 0x2209: return mmio_w2209(data); + case 0x220a: return mmio_w220a(data); + case 0x220b: return mmio_w220b(data); + case 0x220c: return mmio_w220c(data); + case 0x220d: return mmio_w220d(data); + case 0x220e: return mmio_w220e(data); + case 0x220f: return mmio_w220f(data); + + case 0x2210: return mmio_w2210(data); + case 0x2211: return mmio_w2211(data); + case 0x2212: return mmio_w2212(data); + case 0x2213: return mmio_w2213(data); + case 0x2214: return mmio_w2214(data); + case 0x2215: return mmio_w2215(data); + + case 0x2220: return mmio_w2220(data); + case 0x2221: return mmio_w2221(data); + case 0x2222: return mmio_w2222(data); + case 0x2223: return mmio_w2223(data); + case 0x2224: return mmio_w2224(data); + case 0x2225: return mmio_w2225(data); + case 0x2226: return mmio_w2226(data); + case 0x2227: return mmio_w2227(data); + case 0x2228: return mmio_w2228(data); + case 0x2229: return mmio_w2229(data); + case 0x222a: return mmio_w222a(data); + + case 0x2230: return mmio_w2230(data); + case 0x2231: return mmio_w2231(data); + case 0x2232: return mmio_w2232(data); + case 0x2233: return mmio_w2233(data); + case 0x2234: return mmio_w2234(data); + case 0x2235: return mmio_w2235(data); + case 0x2236: return mmio_w2236(data); + case 0x2237: return mmio_w2237(data); + case 0x2238: return mmio_w2238(data); + case 0x2239: return mmio_w2239(data); + + case 0x223f: return mmio_w223f(data); + case 0x2240: return mmio_w2240(data); + case 0x2241: return mmio_w2241(data); + case 0x2242: return mmio_w2242(data); + case 0x2243: return mmio_w2243(data); + case 0x2244: return mmio_w2244(data); + case 0x2245: return mmio_w2245(data); + case 0x2246: return mmio_w2246(data); + case 0x2247: return mmio_w2247(data); + case 0x2248: return mmio_w2248(data); + case 0x2249: return mmio_w2249(data); + case 0x224a: return mmio_w224a(data); + case 0x224b: return mmio_w224b(data); + case 0x224c: return mmio_w224c(data); + case 0x224d: return mmio_w224d(data); + case 0x224e: return mmio_w224e(data); + case 0x224f: return mmio_w224f(data); + + case 0x2250: return mmio_w2250(data); + case 0x2251: return mmio_w2251(data); + case 0x2252: return mmio_w2252(data); + case 0x2253: return mmio_w2253(data); + case 0x2254: return mmio_w2254(data); + + case 0x2258: return mmio_w2258(data); + case 0x2259: return mmio_w2259(data); + case 0x225a: return mmio_w225a(data); + case 0x225b: return mmio_w225b(data); + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sa1/mmio/mmio.hpp b/Mednafen/mednafen/snes/src/chip/sa1/mmio/mmio.hpp new file mode 100755 index 0000000000..e63ad1fa60 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/mmio/mmio.hpp @@ -0,0 +1,256 @@ +uint8 mmio_read(unsigned addr); +void mmio_write(unsigned addr, uint8 data); +Memory& mmio_access(unsigned &addr); + +struct MMIO { + //$2200 CCNT + bool sa1_irq; + bool sa1_rdyb; + bool sa1_resb; + bool sa1_nmi; + uint8 smeg; + + //$2201 SIE + bool cpu_irqen; + bool chdma_irqen; + + //$2202 SIC + bool cpu_irqcl; + bool chdma_irqcl; + + //$2203,$2204 CRV + uint16 crv; + + //$2205,$2206 CNV + uint16 cnv; + + //$2207,$2208 CIV + uint16 civ; + + //$2209 SCNT + bool cpu_irq; + bool cpu_ivsw; + bool cpu_nvsw; + uint8 cmeg; + + //$220a CIE + bool sa1_irqen; + bool timer_irqen; + bool dma_irqen; + bool sa1_nmien; + + //$220b CIC + bool sa1_irqcl; + bool timer_irqcl; + bool dma_irqcl; + bool sa1_nmicl; + + //$220c,$220d SNV + uint16 snv; + + //$220e,$220f SIV + uint16 siv; + + //$2210 TMC + bool hvselb; + bool ven; + bool hen; + + //$2212,$2213 + uint16 hcnt; + + //$2214,$2215 + uint16 vcnt; + + //$2220 CXB + bool cbmode; + uint8 cb; + + //$2221 DXB + bool dbmode; + uint8 db; + + //$2222 EXB + bool ebmode; + uint8 eb; + + //$2223 FXB + bool fbmode; + uint8 fb; + + //$2224 BMAPS + uint8 sbm; + + //$2225 BMAP + bool sw46; + uint8 cbm; + + //$2226 SBWE + bool swen; + + //$2227 CBWE + bool cwen; + + //$2228 BWPA + uint8 bwp; + + //$2229 SIWP + uint8 siwp; + + //$222a CIWP + uint8 ciwp; + + //$2230 DCNT + bool dmaen; + bool dprio; + bool cden; + bool cdsel; + bool dd; + uint8 sd; + + //$2231 CDMA + bool chdend; + uint8 dmasize; + uint8 dmacb; + + //$2232-$2234 SDA + uint32 dsa; + + //$2235-$2237 DDA + uint32 dda; + + //$2238,$2239 DTC + uint16 dtc; + + //$223f BBF + bool bbf; + + //$2240-224f BRF + uint8 brf[16]; + + //$2250 MCNT + bool acm; + bool md; + + //$2251,$2252 MA + uint16 ma; + + //$2253,$2254 MB + uint16 mb; + + //$2258 VBD + bool hl; + uint8 vb; + + //$2259-$225b VDA + uint32 va; + uint8 vbit; + + //$2300 SFR + bool cpu_irqfl; + bool chdma_irqfl; + + //$2301 CFR + bool sa1_irqfl; + bool timer_irqfl; + bool dma_irqfl; + bool sa1_nmifl; + + //$2302,$2303 HCR + uint16 hcr; + + //$2304,$2305 VCR + uint16 vcr; + + //$2306-230a MR + uint64 mr; + + //$230b OF + bool overflow; +} mmio; + +void mmio_w2200(uint8); //CCNT +void mmio_w2201(uint8); //SIE +void mmio_w2202(uint8); //SIC +void mmio_w2203(uint8); //CRVL +void mmio_w2204(uint8); //CRVH +void mmio_w2205(uint8); //CNVL +void mmio_w2206(uint8); //CNVH +void mmio_w2207(uint8); //CIVL +void mmio_w2208(uint8); //CIVH +void mmio_w2209(uint8); //SCNT +void mmio_w220a(uint8); //CIE +void mmio_w220b(uint8); //CIC +void mmio_w220c(uint8); //SNVL +void mmio_w220d(uint8); //SNVH +void mmio_w220e(uint8); //SIVL +void mmio_w220f(uint8); //SIVH +void mmio_w2210(uint8); //TMC +void mmio_w2211(uint8); //CTR +void mmio_w2212(uint8); //HCNTL +void mmio_w2213(uint8); //HCNTH +void mmio_w2214(uint8); //VCNTL +void mmio_w2215(uint8); //VCNTH +void mmio_w2220(uint8); //CXB +void mmio_w2221(uint8); //DXB +void mmio_w2222(uint8); //EXB +void mmio_w2223(uint8); //FXB +void mmio_w2224(uint8); //BMAPS +void mmio_w2225(uint8); //BMAP +void mmio_w2226(uint8); //SBWE +void mmio_w2227(uint8); //CBWE +void mmio_w2228(uint8); //BWPA +void mmio_w2229(uint8); //SIWP +void mmio_w222a(uint8); //CIWP +void mmio_w2230(uint8); //DCNT +void mmio_w2231(uint8); //CDMA +void mmio_w2232(uint8); //SDAL +void mmio_w2233(uint8); //SDAH +void mmio_w2234(uint8); //SDAB +void mmio_w2235(uint8); //DDAL +void mmio_w2236(uint8); //DDAH +void mmio_w2237(uint8); //DDAB +void mmio_w2238(uint8); //DTCL +void mmio_w2239(uint8); //DTCH +void mmio_w223f(uint8); //BBF +void mmio_w2240(uint8); //BRF0 +void mmio_w2241(uint8); //BRF1 +void mmio_w2242(uint8); //BRF2 +void mmio_w2243(uint8); //BRF3 +void mmio_w2244(uint8); //BRF4 +void mmio_w2245(uint8); //BRF5 +void mmio_w2246(uint8); //BRF6 +void mmio_w2247(uint8); //BRF7 +void mmio_w2248(uint8); //BRF8 +void mmio_w2249(uint8); //BRF9 +void mmio_w224a(uint8); //BRFA +void mmio_w224b(uint8); //BRFB +void mmio_w224c(uint8); //BRFC +void mmio_w224d(uint8); //BRFD +void mmio_w224e(uint8); //BRFE +void mmio_w224f(uint8); //BRFF +void mmio_w2250(uint8); //MCNT +void mmio_w2251(uint8); //MAL +void mmio_w2252(uint8); //MAH +void mmio_w2253(uint8); //MBL +void mmio_w2254(uint8); //MBH +void mmio_w2258(uint8); //VBD +void mmio_w2259(uint8); //VDAL +void mmio_w225a(uint8); //VDAH +void mmio_w225b(uint8); //VDAB + +uint8 mmio_r2300(); //SFR +uint8 mmio_r2301(); //CFR +uint8 mmio_r2302(); //HCRL +uint8 mmio_r2303(); //HCRH +uint8 mmio_r2304(); //VCRL +uint8 mmio_r2305(); //VCRH +uint8 mmio_r2306(); //MR [00-07] +uint8 mmio_r2307(); //MR [08-15] +uint8 mmio_r2308(); //MR [16-23] +uint8 mmio_r2309(); //MR [24-31] +uint8 mmio_r230a(); //MR [32-40] +uint8 mmio_r230b(); //OF +uint8 mmio_r230c(); //VDPL +uint8 mmio_r230d(); //VDPH +uint8 mmio_r230e(); //VC diff --git a/Mednafen/mednafen/snes/src/chip/sa1/sa1.cpp b/Mednafen/mednafen/snes/src/chip/sa1/sa1.cpp new file mode 100755 index 0000000000..fe2dd7cb43 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/sa1.cpp @@ -0,0 +1,327 @@ +#include <../base.hpp> + +#define SA1_CPP +namespace bSNES_v059 { + +SA1 sa1; + +#include "serialization.cpp" +#include "bus/bus.cpp" +#include "dma/dma.cpp" +#include "memory/memory.cpp" +#include "mmio/mmio.cpp" + +void SA1::enter() { + while(true) { + while(scheduler.sync == Scheduler::SyncAll) { + scheduler.exit(Scheduler::SynchronizeEvent); + } + + if(mmio.sa1_rdyb || mmio.sa1_resb) { + //SA-1 co-processor is asleep + tick(); + scheduler.sync_copcpu(); + continue; + } + + if(status.interrupt_pending) { + status.interrupt_pending = false; + interrupt(status.interrupt_vector); + } + + (this->*opcode_table[op_readpc()])(); + } +} + +void SA1::last_cycle() { + if(mmio.sa1_nmi && !mmio.sa1_nmicl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.cnv; + mmio.sa1_nmifl = true; + mmio.sa1_nmicl = 1; + regs.wai = false; + } else if(!regs.p.i) { + if(mmio.timer_irqen && !mmio.timer_irqcl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.civ; + mmio.timer_irqfl = true; + regs.wai = false; + } else if(mmio.dma_irqen && !mmio.dma_irqcl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.civ; + mmio.dma_irqfl = true; + regs.wai = false; + } else if(mmio.sa1_irq && !mmio.sa1_irqcl) { + status.interrupt_pending = true; + status.interrupt_vector = mmio.civ; + mmio.sa1_irqfl = true; + regs.wai = false; + } + } +} + +void SA1::interrupt(uint16 vector) { + op_read(regs.pc.d); + op_io(); + if(!regs.e) op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.e ? (regs.p & ~0x10) : regs.p); + regs.pc.w = vector; + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; +} + +bool SA1::interrupt_pending() { + return status.interrupt_pending; +} + +void SA1::tick() { + scheduler.addclocks_cop(2); + if(++status.tick_counter == 0) scheduler.sync_copcpu(); + + //adjust counters: + //note that internally, status counters are in clocks; + //whereas MMIO register counters are in dots (4 clocks = 1 dot) + if(mmio.hvselb == 0) { + //HV timer + status.hcounter += 2; + if(status.hcounter >= 1364) { + status.hcounter = 0; + if(++status.vcounter >= status.scanlines) status.vcounter = 0; + } + } else { + //linear timer + status.hcounter += 2; + status.vcounter += (status.hcounter >> 11); + status.hcounter &= 0x07ff; + status.vcounter &= 0x01ff; + } + + //test counters for timer IRQ + switch((mmio.ven << 1) + (mmio.hen << 0)) { + case 0: break; + case 1: if(status.hcounter == (mmio.hcnt << 2)) trigger_irq(); break; + case 2: if(status.vcounter == mmio.vcnt && status.hcounter == 0) trigger_irq(); break; + case 3: if(status.vcounter == mmio.hcnt && status.hcounter == (mmio.hcnt << 2)) trigger_irq(); break; + } +} + +void SA1::trigger_irq() { + mmio.timer_irqfl = true; + if(mmio.timer_irqen) mmio.timer_irqcl = 0; +} + +void SA1::init() { +} + +void SA1::enable() { +} + +void SA1::power() { + regs.a = regs.x = regs.y = 0x0000; + regs.s = 0x01ff; + + reset(); +} + +void SA1::reset() { + memory::vectorsp.access = 0; + memory::cc1bwram.dma = false; + for(unsigned addr = 0; addr < memory::iram.size(); addr++) { + memory::iram.write(addr, 0x00); + } + vbrbus.init(); + sa1bus.init(); + + regs.pc.d = 0x000000; + regs.x.h = 0x00; + regs.y.h = 0x00; + regs.s.h = 0x01; + regs.d = 0x0000; + regs.db = 0x00; + regs.p = 0x34; + regs.e = 1; + regs.mdr = 0x00; + regs.wai = false; + CPUcore::update_table(); + + status.tick_counter = 0; + + status.interrupt_pending = false; + status.interrupt_vector = 0x0000; + + status.scanlines = (system.region() == System::NTSC ? 262 : 312); + status.vcounter = 0; + status.hcounter = 0; + + dma.line = 0; + + //$2200 CCNT + mmio.sa1_irq = false; + mmio.sa1_rdyb = false; + mmio.sa1_resb = true; + mmio.sa1_nmi = false; + mmio.smeg = 0; + + //$2201 SIE + mmio.cpu_irqen = false; + mmio.chdma_irqen = false; + + //$2202 SIC + mmio.cpu_irqcl = false; + mmio.chdma_irqcl = false; + + //$2203,$2204 CRV + mmio.crv = 0x0000; + + //$2205,$2206 CNV + mmio.cnv = 0x0000; + + //$2207,$2208 CIV + mmio.civ = 0x0000; + + //$2209 SCNT + mmio.cpu_irq = false; + mmio.cpu_ivsw = false; + mmio.cpu_nvsw = false; + mmio.cmeg = 0; + + //$220a CIE + mmio.sa1_irqen = false; + mmio.timer_irqen = false; + mmio.dma_irqen = false; + mmio.sa1_nmien = false; + + //$220b CIC + mmio.sa1_irqcl = false; + mmio.timer_irqcl = false; + mmio.dma_irqcl = false; + mmio.sa1_nmicl = false; + + //$220c,$220d SNV + mmio.snv = 0x0000; + + //$220e,$220f SIV + mmio.siv = 0x0000; + + //$2210 + mmio.hvselb = false; + mmio.ven = false; + mmio.hen = false; + + //$2212,$2213 HCNT + mmio.hcnt = 0x0000; + + //$2214,$2215 VCNT + mmio.vcnt = 0x0000; + + //$2220-2223 CXB, DXB, EXB, FXB + mmio.cbmode = 0; + mmio.dbmode = 0; + mmio.ebmode = 0; + mmio.fbmode = 0; + + mmio.cb = 0x00; + mmio.db = 0x01; + mmio.eb = 0x02; + mmio.fb = 0x03; + + //$2224 BMAPS + mmio.sbm = 0x00; + + //$2225 BMAP + mmio.sw46 = false; + mmio.cbm = 0x00; + + //$2226 SWBE + mmio.swen = false; + + //$2227 CWBE + mmio.cwen = false; + + //$2228 BWPA + mmio.bwp = 0x0f; + + //$2229 SIWP + mmio.siwp = 0x00; + + //$222a CIWP + mmio.ciwp = 0x00; + + //$2230 DCNT + mmio.dmaen = false; + mmio.dprio = false; + mmio.cden = false; + mmio.cdsel = false; + mmio.dd = 0; + mmio.sd = 0; + + //$2231 CDMA + mmio.chdend = false; + mmio.dmasize = 0; + mmio.dmacb = 0; + + //$2232-$2234 SDA + mmio.dsa = 0x000000; + + //$2235-$2237 DDA + mmio.dda = 0x000000; + + //$2238,$2239 DTC + mmio.dtc = 0x0000; + + //$223f BBF + mmio.bbf = 0; + + //$2240-$224f BRF + for(unsigned i = 0; i < 16; i++) { + mmio.brf[i] = 0x00; + } + + //$2250 MCNT + mmio.acm = 0; + mmio.md = 0; + + //$2251,$2252 MA + mmio.ma = 0x0000; + + //$2253,$2254 MB + mmio.mb = 0x0000; + + //$2258 VBD + mmio.hl = false; + mmio.vb = 16; + + //$2259-$225b + mmio.va = 0x000000; + mmio.vbit = 0; + + //$2300 SFR + mmio.cpu_irqfl = false; + mmio.chdma_irqfl = false; + + //$2301 CFR + mmio.sa1_irqfl = false; + mmio.timer_irqfl = false; + mmio.dma_irqfl = false; + mmio.sa1_nmifl = false; + + //$2302,$2303 HCR + mmio.hcr = 0x0000; + + //$2304,$2305 VCR + mmio.vcr = 0x0000; + + //$2306-$230a MR + mmio.mr = 0; + + //$230b + mmio.overflow = false; +} + +SA1::SA1() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/sa1/sa1.hpp b/Mednafen/mednafen/snes/src/chip/sa1/sa1.hpp new file mode 100755 index 0000000000..83abc93ea8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/sa1.hpp @@ -0,0 +1,38 @@ +#include "bus/bus.hpp" + +class SA1 : public CPUcore, public MMIO { +public: + #include "dma/dma.hpp" + #include "memory/memory.hpp" + #include "mmio/mmio.hpp" + + struct Status { + uint8 tick_counter; + + bool interrupt_pending; + uint16 interrupt_vector; + + uint16 scanlines; + uint16 vcounter; + uint16 hcounter; + } status; + + void enter(); + void interrupt(uint16 vector); + void tick(); + + alwaysinline void trigger_irq(); + alwaysinline void last_cycle(); + alwaysinline bool interrupt_pending(); + + void init(); + void enable(); + void power(); + void reset(); + + void serialize(serializer&); + SA1(); +}; + +extern SA1 sa1; +extern SA1Bus sa1bus; diff --git a/Mednafen/mednafen/snes/src/chip/sa1/serialization.cpp b/Mednafen/mednafen/snes/src/chip/sa1/serialization.cpp new file mode 100755 index 0000000000..9d599c1ca0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sa1/serialization.cpp @@ -0,0 +1,150 @@ +#ifdef SA1_CPP + +void SA1::serialize(serializer &s) { + CPUcore::core_serialize(s); + + //sa1.hpp + s.integer(status.tick_counter); + + s.integer(status.interrupt_pending); + s.integer(status.interrupt_vector); + + s.integer(status.scanlines); + s.integer(status.vcounter); + s.integer(status.hcounter); + + //bus/bus.hpp + s.array(memory::iram.data(), memory::iram.size()); + + memory::vectorsp.sync(); + + s.integer(memory::cc1bwram.dma); + + //dma/dma.hpp + s.integer(dma.line); + + //mmio/mmio.hpp + s.integer(mmio.sa1_irq); + s.integer(mmio.sa1_rdyb); + s.integer(mmio.sa1_resb); + s.integer(mmio.sa1_nmi); + s.integer(mmio.smeg); + + s.integer(mmio.cpu_irqen); + s.integer(mmio.chdma_irqen); + + s.integer(mmio.cpu_irqcl); + s.integer(mmio.chdma_irqcl); + + s.integer(mmio.crv); + + s.integer(mmio.cnv); + + s.integer(mmio.civ); + + s.integer(mmio.cpu_irq); + s.integer(mmio.cpu_ivsw); + s.integer(mmio.cpu_nvsw); + s.integer(mmio.cmeg); + + s.integer(mmio.sa1_irqen); + s.integer(mmio.timer_irqen); + s.integer(mmio.dma_irqen); + s.integer(mmio.sa1_nmien); + + s.integer(mmio.sa1_irqcl); + s.integer(mmio.timer_irqcl); + s.integer(mmio.dma_irqcl); + s.integer(mmio.sa1_nmicl); + + s.integer(mmio.snv); + + s.integer(mmio.siv); + + s.integer(mmio.hvselb); + s.integer(mmio.ven); + s.integer(mmio.hen); + + s.integer(mmio.hcnt); + + s.integer(mmio.vcnt); + + s.integer(mmio.cbmode); + s.integer(mmio.cb); + + s.integer(mmio.dbmode); + s.integer(mmio.db); + + s.integer(mmio.ebmode); + s.integer(mmio.eb); + + s.integer(mmio.fbmode); + s.integer(mmio.fb); + + s.integer(mmio.sbm); + + s.integer(mmio.sw46); + s.integer(mmio.cbm); + + s.integer(mmio.swen); + + s.integer(mmio.cwen); + + s.integer(mmio.bwp); + + s.integer(mmio.siwp); + + s.integer(mmio.ciwp); + + s.integer(mmio.dmaen); + s.integer(mmio.dprio); + s.integer(mmio.cden); + s.integer(mmio.cdsel); + s.integer(mmio.dd); + s.integer(mmio.sd); + + s.integer(mmio.chdend); + s.integer(mmio.dmasize); + s.integer(mmio.dmacb); + + s.integer(mmio.dsa); + + s.integer(mmio.dda); + + s.integer(mmio.dtc); + + s.integer(mmio.bbf); + + s.array(mmio.brf); + + s.integer(mmio.acm); + s.integer(mmio.md); + + s.integer(mmio.ma); + + s.integer(mmio.mb); + + s.integer(mmio.hl); + s.integer(mmio.vb); + + s.integer(mmio.va); + s.integer(mmio.vbit); + + s.integer(mmio.cpu_irqfl); + s.integer(mmio.chdma_irqfl); + + s.integer(mmio.sa1_irqfl); + s.integer(mmio.timer_irqfl); + s.integer(mmio.dma_irqfl); + s.integer(mmio.sa1_nmifl); + + s.integer(mmio.hcr); + + s.integer(mmio.vcr); + + s.integer(mmio.mr); + + s.integer(mmio.overflow); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sdd1/sdd1.cpp b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1.cpp new file mode 100755 index 0000000000..350b9ba115 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1.cpp @@ -0,0 +1,161 @@ +#include <../base.hpp> + +#define SDD1_CPP +namespace bSNES_v059 { + +SDD1 sdd1; + +#include "serialization.cpp" +#include "sdd1emu.cpp" + +void SDD1::init() {} + +void SDD1::enable() { + //hook S-CPU DMA MMIO registers to gather information for struct dma[]; + //buffer address and transfer size information for use in SDD1::read() + for(unsigned i = 0x4300; i <= 0x437f; i++) { + cpu_mmio[i & 0x7f] = memory::mmio.mmio[i - 0x2000]; + memory::mmio.map(i, *this); + } + + //hook S-DD1 MMIO registers + for(unsigned i = 0x4800; i <= 0x4807; i++) { + memory::mmio.map(i, *this); + } +} + +void SDD1::power() { + reset(); +} + +void SDD1::reset() { + sdd1_enable = 0x00; + xfer_enable = 0x00; + + mmc[0] = 0 << 20; + mmc[1] = 1 << 20; + mmc[2] = 2 << 20; + mmc[3] = 3 << 20; + + for(unsigned i = 0; i < 8; i++) { + dma[i].addr = 0; + dma[i].size = 0; + } + + buffer.ready = false; + + bus.map(Bus::MapDirect, 0xc0, 0xff, 0x0000, 0xffff, *this); +} + +uint8 SDD1::mmio_read(unsigned addr) { + addr &= 0xffff; + + if((addr & 0x4380) == 0x4300) { + return cpu_mmio[addr & 0x7f]->mmio_read(addr); + } + + switch(addr) { + case 0x4804: return mmc[0] >> 20; + case 0x4805: return mmc[1] >> 20; + case 0x4806: return mmc[2] >> 20; + case 0x4807: return mmc[3] >> 20; + } + + return cpu.regs.mdr; +} + +void SDD1::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + if((addr & 0x4380) == 0x4300) { + unsigned channel = (addr >> 4) & 7; + switch(addr & 15) { + case 2: dma[channel].addr = (dma[channel].addr & 0xffff00) + (data << 0); break; + case 3: dma[channel].addr = (dma[channel].addr & 0xff00ff) + (data << 8); break; + case 4: dma[channel].addr = (dma[channel].addr & 0x00ffff) + (data << 16); break; + + case 5: dma[channel].size = (dma[channel].size & 0xff00) + (data << 0); break; + case 6: dma[channel].size = (dma[channel].size & 0x00ff) + (data << 8); break; + } + return cpu_mmio[addr & 0x7f]->mmio_write(addr, data); + } + + switch(addr) { + case 0x4800: sdd1_enable = data; break; + case 0x4801: xfer_enable = data; break; + + case 0x4804: mmc[0] = data << 20; break; + case 0x4805: mmc[1] = data << 20; break; + case 0x4806: mmc[2] = data << 20; break; + case 0x4807: mmc[3] = data << 20; break; + } +} + +//SDD1::read() is mapped to $[c0-ff]:[0000-ffff] +//the design is meant to be as close to the hardware design as possible, thus this code +//avoids adding S-DD1 hooks inside S-CPU::DMA emulation. +// +//the real S-DD1 cannot see $420b (DMA enable) writes, as they are not placed on the bus. +//however, $43x0-$43xf writes (DMAx channel settings) most likely do appear on the bus. +//the S-DD1 also requires fixed addresses for transfers, which wouldn't be necessary if +//it could see $420b writes (eg it would know when the transfer should begin.) +// +//the hardware needs a way to distinguish program code after $4801 writes from DMA +//decompression that follows soon after. +// +//the only plausible design for hardware would be for the S-DD1 to spy on DMAx settings, +//and begin spooling decompression on writes to $4801 that activate a channel. after that, +//it feeds decompressed data only when the ROM read address matches the DMA channel address. +// +//the actual S-DD1 transfer can occur on any channel, but it is most likely limited to +//one transfer per $420b write (for spooling purposes). however, this is not known for certain. +uint8 SDD1::read(unsigned addr) { + if(sdd1_enable & xfer_enable) { + //at least one channel has S-DD1 decompression enabled ... + for(unsigned i = 0; i < 8; i++) { + if(sdd1_enable & xfer_enable & (1 << i)) { + //S-DD1 always uses fixed transfer mode, so address will not change during transfer + if(addr == dma[i].addr) { + if(!buffer.ready) { + //first byte read for channel performs full decompression. + //this really should stream byte-by-byte, but it's not necessary since the size is known + buffer.offset = 0; + buffer.size = dma[i].size ? dma[i].size : 65536; + + //sdd1emu calls this function; it needs to access uncompressed data; + //so temporarily disable decompression mode for decompress() call. + uint8 temp = sdd1_enable; + sdd1_enable = false; + sdd1emu.decompress(addr, buffer.size, buffer.data); + sdd1_enable = temp; + + buffer.ready = true; + } + + //fetch a decompressed byte; once buffer is depleted, disable channel and invalidate buffer + uint8 data = buffer.data[(uint16)buffer.offset++]; + if(buffer.offset >= buffer.size) { + buffer.ready = false; + xfer_enable &= ~(1 << i); + } + + return data; + } //address matched + } //channel enabled + } //channel loop + } //S-DD1 decompressor enabled + + //S-DD1 decompression mode inactive; return ROM data + return memory::cartrom.read(mmc[(addr >> 20) & 3] + (addr & 0x0fffff)); +} + +void SDD1::write(unsigned addr, uint8 data) { +} + +SDD1::SDD1() { +} + +SDD1::~SDD1() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/sdd1/sdd1.hpp b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1.hpp new file mode 100755 index 0000000000..fd95f6b914 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1.hpp @@ -0,0 +1,41 @@ +#include "sdd1emu.hpp" + +class SDD1 : public MMIO, public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 mmio_read(unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + void serialize(serializer&); + SDD1(); + ~SDD1(); + +private: + MMIO *cpu_mmio[0x80]; //bus spying hooks to glean information for struct dma[] + + uint8 sdd1_enable; //channel bit-mask + uint8 xfer_enable; //channel bit-mask + unsigned mmc[4]; //memory map controller ROM indices + + struct { + unsigned addr; //$43x2-$43x4 -- DMA transfer address + uint16 size; //$43x5-$43x6 -- DMA transfer size + } dma[8]; + + SDD1emu sdd1emu; + struct { + uint8 data[65536]; //pointer to decompressed S-DD1 data + uint16 offset; //read index into S-DD1 decompression buffer + unsigned size; //length of data buffer; reads decrement counter, set ready to false at 0 + bool ready; //true when data[] is valid; false to invoke sdd1emu.decompress() + } buffer; +}; + +extern SDD1 sdd1; diff --git a/Mednafen/mednafen/snes/src/chip/sdd1/sdd1emu.cpp b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1emu.cpp new file mode 100755 index 0000000000..a7eb364669 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1emu.cpp @@ -0,0 +1,452 @@ +#ifdef SDD1_CPP + +/************************************************************************ + +S-DD1'algorithm emulation code +------------------------------ + +Author: Andreas Naive +Date: August 2003 +Last update: October 2004 + +This code is Public Domain. There is no copyright holded by the author. +Said this, the author wish to explicitly emphasize his inalienable moral rights +over this piece of intelectual work and the previous research that made it +possible, as recognized by most of the copyright laws around the world. + +This code is provided 'as-is', with no warranty, expressed or implied. +No responsability is assumed by the author in connection with it. + +The author is greatly indebted with The Dumper, without whose help and +patience providing him with real S-DD1 data the research would have never been +possible. He also wish to note that in the very beggining of his research, +Neviksti had done some steps in the right direction. By last, the author is +indirectly indebted to all the people that worked and contributed in the +S-DD1 issue in the past. + +An algorithm's documentation is available as a separate document. +The implementation is obvious when the algorithm is +understood. + +************************************************************************/ + +typedef uint8 bool8; +#define SDD1_read(__addr) (sdd1.read(__addr)) + +//////////////////////////////////////////////////// + + +void SDD1_IM::prepareDecomp(uint32 in_buf) { + + byte_ptr=in_buf; + bit_count=4; + +} + +//////////////////////////////////////////////////// + + +uint8 SDD1_IM::getCodeword(uint8 code_len) { + + uint8 codeword; + uint8 comp_count; + + codeword = (SDD1_read(byte_ptr))<>(9-bit_count); + bit_count+=code_len; + } + + if (bit_count & 0x08) { + byte_ptr++; + bit_count&=0x07; + } + + return codeword; + +} + +////////////////////////////////////////////////////// + + +SDD1_GCD::SDD1_GCD(SDD1_IM *associatedIM) : + IM(associatedIM) +{ + +} + +////////////////////////////////////////////////////// + + +void SDD1_GCD::getRunCount(uint8 code_num, uint8 *MPScount, bool8 *LPSind) { + + const uint8 run_count[] = { + 0x00, 0x00, 0x01, 0x00, 0x03, 0x01, 0x02, 0x00, + 0x07, 0x03, 0x05, 0x01, 0x06, 0x02, 0x04, 0x00, + 0x0f, 0x07, 0x0b, 0x03, 0x0d, 0x05, 0x09, 0x01, + 0x0e, 0x06, 0x0a, 0x02, 0x0c, 0x04, 0x08, 0x00, + 0x1f, 0x0f, 0x17, 0x07, 0x1b, 0x0b, 0x13, 0x03, + 0x1d, 0x0d, 0x15, 0x05, 0x19, 0x09, 0x11, 0x01, + 0x1e, 0x0e, 0x16, 0x06, 0x1a, 0x0a, 0x12, 0x02, + 0x1c, 0x0c, 0x14, 0x04, 0x18, 0x08, 0x10, 0x00, + 0x3f, 0x1f, 0x2f, 0x0f, 0x37, 0x17, 0x27, 0x07, + 0x3b, 0x1b, 0x2b, 0x0b, 0x33, 0x13, 0x23, 0x03, + 0x3d, 0x1d, 0x2d, 0x0d, 0x35, 0x15, 0x25, 0x05, + 0x39, 0x19, 0x29, 0x09, 0x31, 0x11, 0x21, 0x01, + 0x3e, 0x1e, 0x2e, 0x0e, 0x36, 0x16, 0x26, 0x06, + 0x3a, 0x1a, 0x2a, 0x0a, 0x32, 0x12, 0x22, 0x02, + 0x3c, 0x1c, 0x2c, 0x0c, 0x34, 0x14, 0x24, 0x04, + 0x38, 0x18, 0x28, 0x08, 0x30, 0x10, 0x20, 0x00, + 0x7f, 0x3f, 0x5f, 0x1f, 0x6f, 0x2f, 0x4f, 0x0f, + 0x77, 0x37, 0x57, 0x17, 0x67, 0x27, 0x47, 0x07, + 0x7b, 0x3b, 0x5b, 0x1b, 0x6b, 0x2b, 0x4b, 0x0b, + 0x73, 0x33, 0x53, 0x13, 0x63, 0x23, 0x43, 0x03, + 0x7d, 0x3d, 0x5d, 0x1d, 0x6d, 0x2d, 0x4d, 0x0d, + 0x75, 0x35, 0x55, 0x15, 0x65, 0x25, 0x45, 0x05, + 0x79, 0x39, 0x59, 0x19, 0x69, 0x29, 0x49, 0x09, + 0x71, 0x31, 0x51, 0x11, 0x61, 0x21, 0x41, 0x01, + 0x7e, 0x3e, 0x5e, 0x1e, 0x6e, 0x2e, 0x4e, 0x0e, + 0x76, 0x36, 0x56, 0x16, 0x66, 0x26, 0x46, 0x06, + 0x7a, 0x3a, 0x5a, 0x1a, 0x6a, 0x2a, 0x4a, 0x0a, + 0x72, 0x32, 0x52, 0x12, 0x62, 0x22, 0x42, 0x02, + 0x7c, 0x3c, 0x5c, 0x1c, 0x6c, 0x2c, 0x4c, 0x0c, + 0x74, 0x34, 0x54, 0x14, 0x64, 0x24, 0x44, 0x04, + 0x78, 0x38, 0x58, 0x18, 0x68, 0x28, 0x48, 0x08, + 0x70, 0x30, 0x50, 0x10, 0x60, 0x20, 0x40, 0x00, + }; + + uint8 codeword=IM->getCodeword(code_num); + + if (codeword & 0x80) { + *LPSind=1; + *MPScount=run_count[codeword>>(code_num^0x07)]; + } + else { + *MPScount=(1<getRunCount(code_num, &MPScount, &LPSind); + + if (MPScount) { + bit=0; + MPScount--; + } + else { + bit=1; + LPSind=0; + } + + if (MPScount || LPSind) (*endOfRun)=0; + else (*endOfRun)=1; + + return bit; + +} + +///////////////////////////////////////////////// + + +SDD1_PEM::SDD1_PEM(SDD1_BG *associatedBG0, SDD1_BG *associatedBG1, + SDD1_BG *associatedBG2, SDD1_BG *associatedBG3, + SDD1_BG *associatedBG4, SDD1_BG *associatedBG5, + SDD1_BG *associatedBG6, SDD1_BG *associatedBG7) { + + BG[0]=associatedBG0; + BG[1]=associatedBG1; + BG[2]=associatedBG2; + BG[3]=associatedBG3; + BG[4]=associatedBG4; + BG[5]=associatedBG5; + BG[6]=associatedBG6; + BG[7]=associatedBG7; + +} + +///////////////////////////////////////////////////////// + + +const SDD1_PEM::state SDD1_PEM::evolution_table[]={ + { 0,25,25}, + { 0, 2, 1}, + { 0, 3, 1}, + { 0, 4, 2}, + { 0, 5, 3}, + { 1, 6, 4}, + { 1, 7, 5}, + { 1, 8, 6}, + { 1, 9, 7}, + { 2,10, 8}, + { 2,11, 9}, + { 2,12,10}, + { 2,13,11}, + { 3,14,12}, + { 3,15,13}, + { 3,16,14}, + { 3,17,15}, + { 4,18,16}, + { 4,19,17}, + { 5,20,18}, + { 5,21,19}, + { 6,22,20}, + { 6,23,21}, + { 7,24,22}, + { 7,24,23}, + { 0,26, 1}, + { 1,27, 2}, + { 2,28, 4}, + { 3,29, 8}, + { 4,30,12}, + { 5,31,16}, + { 6,32,18}, + { 7,24,22} + }; + +////////////////////////////////////////////////////// + + +void SDD1_PEM::prepareDecomp(void) { + + for (uint8 i=0; i<32; i++) { + contextInfo[i].status=0; + contextInfo[i].MPS=0; + } + +} + +///////////////////////////////////////////////////////// + + +uint8 SDD1_PEM::getBit(uint8 context) { + + bool8 endOfRun; + uint8 bit; + + SDD1_ContextInfo *pContInfo=&contextInfo[context]; + uint8 currStatus = pContInfo->status; + const state *pState=&SDD1_PEM::evolution_table[currStatus]; + uint8 currentMPS=pContInfo->MPS; + + bit=(BG[pState->code_num])->getBit(&endOfRun); + + if (endOfRun) + if (bit) { + if (!(currStatus & 0xfe)) (pContInfo->MPS)^=0x01; + (pContInfo->status)=pState->nextIfLPS; + } + else + (pContInfo->status)=pState->nextIfMPS; + + return bit^currentMPS; + +} + +////////////////////////////////////////////////////////////// + + +SDD1_CM::SDD1_CM(SDD1_PEM *associatedPEM) : + PEM(associatedPEM) +{ + +} + +////////////////////////////////////////////////////////////// + + +void SDD1_CM::prepareDecomp(uint32 first_byte) { + + bitplanesInfo = SDD1_read(first_byte) & 0xc0; + contextBitsInfo = SDD1_read(first_byte) & 0x30; + bit_number=0; + for (int i=0; i<8; i++) prevBitplaneBits[i]=0; + switch (bitplanesInfo) { + case 0x00: + currBitplane = 1; + break; + case 0x40: + currBitplane = 7; + break; + case 0x80: + currBitplane = 3; + } + +} + +///////////////////////////////////////////////////////////// + + +uint8 SDD1_CM::getBit(void) { + + uint8 currContext; + uint16 *context_bits; + + switch (bitplanesInfo) { + case 0x00: + currBitplane ^= 0x01; + break; + case 0x40: + currBitplane ^= 0x01; + if (!(bit_number & 0x7f)) currBitplane = ((currBitplane+2) & 0x07); + break; + case 0x80: + currBitplane ^= 0x01; + if (!(bit_number & 0x7f)) currBitplane ^= 0x02; + break; + case 0xc0: + currBitplane = bit_number & 0x07; + } + + context_bits = &prevBitplaneBits[currBitplane]; + + currContext=(currBitplane & 0x01)<<4; + switch (contextBitsInfo) { + case 0x00: + currContext|=((*context_bits & 0x01c0)>>5)|(*context_bits & 0x0001); + break; + case 0x10: + currContext|=((*context_bits & 0x0180)>>5)|(*context_bits & 0x0001); + break; + case 0x20: + currContext|=((*context_bits & 0x00c0)>>5)|(*context_bits & 0x0001); + break; + case 0x30: + currContext|=((*context_bits & 0x0180)>>5)|(*context_bits & 0x0003); + } + + uint8 bit=PEM->getBit(currContext); + + *context_bits <<= 1; + *context_bits |= bit; + + bit_number++; + + return bit; + +} + +////////////////////////////////////////////////// + + +SDD1_OL::SDD1_OL(SDD1_CM *associatedCM) : + CM(associatedCM) +{ + +} + +/////////////////////////////////////////////////// + + +void SDD1_OL::prepareDecomp(uint32 first_byte, uint16 out_len, uint8 *out_buf) { + + bitplanesInfo = SDD1_read(first_byte) & 0xc0; + length=out_len; + buffer=out_buf; + +} + +/////////////////////////////////////////////////// + + +void SDD1_OL::launch(void) { + + uint8 i; + uint8 register1, register2; + + switch (bitplanesInfo) { + case 0x00: + case 0x40: + case 0x80: + i=1; + do { //if length==0, we output 2^16 bytes + if (!i) { + *(buffer++)=register2; + i=~i; + } + else { + for (register1=register2=0, i=0x80; i; i>>=1) { + if (CM->getBit()) register1 |= i; + if (CM->getBit()) register2 |= i; + } + *(buffer++)=register1; + } + } while (--length); + break; + case 0xc0: + do { + for (register1=0, i=0x01; i; i<<=1) { + if (CM->getBit()) register1 |= i; + } + *(buffer++)=register1; + } while (--length); + } + +} + +/////////////////////////////////////////////////////// + + +void SDD1emu::decompress(uint32 in_buf, uint16 out_len, uint8 *out_buf) { + + IM.prepareDecomp(in_buf); + BG0.prepareDecomp(); + BG1.prepareDecomp(); + BG2.prepareDecomp(); + BG3.prepareDecomp(); + BG4.prepareDecomp(); + BG5.prepareDecomp(); + BG6.prepareDecomp(); + BG7.prepareDecomp(); + PEM.prepareDecomp(); + CM.prepareDecomp(in_buf); + OL.prepareDecomp(in_buf, out_len, out_buf); + + OL.launch(); + +} + +//////////////////////////////////////////////////////////// + + +SDD1emu::SDD1emu() : + GCD(&IM), + BG0(&GCD, 0), BG1(&GCD, 1), BG2(&GCD, 2), BG3(&GCD, 3), + BG4(&GCD, 4), BG5(&GCD, 5), BG6(&GCD, 6), BG7(&GCD, 7), + PEM(&BG0, &BG1, &BG2, &BG3, &BG4, &BG5, &BG6, &BG7), + CM(&PEM), + OL(&CM) +{ + +} + +/////////////////////////////////////////////////////////// + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/sdd1/sdd1emu.hpp b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1emu.hpp new file mode 100755 index 0000000000..00187b3cb4 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sdd1/sdd1emu.hpp @@ -0,0 +1,164 @@ +/************************************************************************ + +S-DD1'algorithm emulation code +------------------------------ + +Author: Andreas Naive +Date: August 2003 +Last update: October 2004 + +This code is Public Domain. There is no copyright holded by the author. +Said this, the author wish to explicitly emphasize his inalienable moral rights +over this piece of intelectual work and the previous research that made it +possible, as recognized by most of the copyright laws around the world. + +This code is provided 'as-is', with no warranty, expressed or implied. +No responsability is assumed by the author in connection with it. + +The author is greatly indebted with The Dumper, without whose help and +patience providing him with real S-DD1 data the research would have never been +possible. He also wish to note that in the very beggining of his research, +Neviksti had done some steps in the right direction. By last, the author is +indirectly indebted to all the people that worked and contributed in the +S-DD1 issue in the past. + +An algorithm's documentation is available as a separate document. +The implementation is obvious when the algorithm is +understood. + +************************************************************************/ + +#define bool8 uint8 + +class SDD1_IM { //Input Manager + + public: + SDD1_IM(void) {} + void prepareDecomp(uint32 in_buf); + uint8 getCodeword(const uint8 code_len); + + private: + uint32 byte_ptr; + uint8 bit_count; + +}; + +//////////////////////////////////////////////////// + + +class SDD1_GCD { //Golomb-Code Decoder + + public: + SDD1_GCD(SDD1_IM *associatedIM); + void getRunCount(uint8 code_num, uint8 *MPScount, bool8 *LPSind); + + private: + SDD1_IM *const IM; + +}; + +////////////////////////////////////////////////////// + + +class SDD1_BG { // Bits Generator + + public: + SDD1_BG(SDD1_GCD *associatedGCD, uint8 code); + void prepareDecomp(void); + uint8 getBit(bool8 *endOfRun); + + private: + SDD1_GCD *const GCD; + const uint8 code_num; + uint8 MPScount; + bool8 LPSind; + +}; + +//////////////////////////////////////////////// + + +class SDD1_PEM { //Probability Estimation Module + + public: + SDD1_PEM(SDD1_BG *associatedBG0, SDD1_BG *associatedBG1, + SDD1_BG *associatedBG2, SDD1_BG *associatedBG3, + SDD1_BG *associatedBG4, SDD1_BG *associatedBG5, + SDD1_BG *associatedBG6, SDD1_BG *associatedBG7); + void prepareDecomp(void); + uint8 getBit(uint8 context); + + private: + struct state { + uint8 code_num; + uint8 nextIfMPS; + uint8 nextIfLPS; + }; + static const state evolution_table[]; + struct SDD1_ContextInfo { + uint8 status; + uint8 MPS; + } contextInfo[32]; + SDD1_BG * BG[8]; + +}; + +/////////////////////////////////////////////////// + + +class SDD1_CM { //Context Model + + public: + SDD1_CM(SDD1_PEM *associatedPEM); + void prepareDecomp(uint32 first_byte); + uint8 getBit(void); + + private: + uint8 bitplanesInfo; + uint8 contextBitsInfo; + uint8 bit_number; + uint8 currBitplane; + uint16 prevBitplaneBits[8]; + SDD1_PEM *const PEM; + +}; + +/////////////////////////////////////////////////// + + +class SDD1_OL { //Output Logic + + public: + SDD1_OL(SDD1_CM *associatedCM); + void prepareDecomp(uint32 first_byte, uint16 out_len, uint8 *out_buf); + void launch(void); + + private: + uint8 bitplanesInfo; + uint16 length; + uint8 *buffer; + SDD1_CM *const CM; + +}; + +///////////////////////////////////////////////////////// + + +class SDD1emu { + + public: + SDD1emu(void); + void decompress(uint32 in_buf, uint16 out_len, uint8 *out_buf); + + private: + SDD1_IM IM; + SDD1_GCD GCD; + SDD1_BG BG0; SDD1_BG BG1; SDD1_BG BG2; SDD1_BG BG3; + SDD1_BG BG4; SDD1_BG BG5; SDD1_BG BG6; SDD1_BG BG7; + SDD1_PEM PEM; + SDD1_CM CM; + SDD1_OL OL; + +}; + +#undef bool8 diff --git a/Mednafen/mednafen/snes/src/chip/sdd1/serialization.cpp b/Mednafen/mednafen/snes/src/chip/sdd1/serialization.cpp new file mode 100755 index 0000000000..87da13f3de --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/sdd1/serialization.cpp @@ -0,0 +1,19 @@ +#ifdef SDD1_CPP + +void SDD1::serialize(serializer &s) { + s.integer(sdd1_enable); + s.integer(xfer_enable); + s.array(mmc); + + for(unsigned n = 0; n < 8; n++) { + s.integer(dma[n].addr); + s.integer(dma[n].size); + } + + s.array(buffer.data); + s.integer(buffer.offset); + s.integer(buffer.size); + s.integer(buffer.ready); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/spc7110/decomp.cpp b/Mednafen/mednafen/snes/src/chip/spc7110/decomp.cpp new file mode 100755 index 0000000000..99d4e1b587 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/spc7110/decomp.cpp @@ -0,0 +1,511 @@ +#ifdef SPC7110_CPP + +uint8 SPC7110Decomp::read() { + if(decomp_buffer_length == 0) { + //decompress at least (decomp_buffer_size / 2) bytes to the buffer + switch(decomp_mode) { + case 0: mode0(false); break; + case 1: mode1(false); break; + case 2: mode2(false); break; + default: return 0x00; + } + } + + uint8 data = decomp_buffer[decomp_buffer_rdoffset++]; + decomp_buffer_rdoffset &= decomp_buffer_size - 1; + decomp_buffer_length--; + return data; +} + +void SPC7110Decomp::write(uint8 data) { + decomp_buffer[decomp_buffer_wroffset++] = data; + decomp_buffer_wroffset &= decomp_buffer_size - 1; + decomp_buffer_length++; +} + +uint8 SPC7110Decomp::dataread() { + unsigned size = memory::cartrom.size() - 0x100000; + while(decomp_offset >= size) decomp_offset -= size; + return memory::cartrom.read(0x100000 + decomp_offset++); +} + +void SPC7110Decomp::init(unsigned mode, unsigned offset, unsigned index) { + decomp_mode = mode; + decomp_offset = offset; + + decomp_buffer_rdoffset = 0; + decomp_buffer_wroffset = 0; + decomp_buffer_length = 0; + + //reset context states + for(unsigned i = 0; i < 32; i++) { + context[i].index = 0; + context[i].invert = 0; + } + + switch(decomp_mode) { + case 0: mode0(true); break; + case 1: mode1(true); break; + case 2: mode2(true); break; + } + + //decompress up to requested output data index + while(index--) read(); +} + +// + +void SPC7110Decomp::mode0(bool init) { + static uint8 val, in, span; + static int out, inverts, lps, in_count; + + if(init == true) { + out = inverts = lps = 0; + span = 0xff; + val = dataread(); + in = dataread(); + in_count = 8; + return; + } + + while(decomp_buffer_length < (decomp_buffer_size >> 1)) { + for(unsigned bit = 0; bit < 8; bit++) { + //get context + uint8 mask = (1 << (bit & 3)) - 1; + uint8 con = mask + ((inverts & mask) ^ (lps & mask)); + if(bit > 3) con += 15; + + //get prob and mps + unsigned prob = probability(con); + unsigned mps = (((out >> 15) & 1) ^ context[con].invert); + + //get bit + unsigned flag_lps; + if(val <= span - prob) { //mps + span = span - prob; + out = (out << 1) + mps; + flag_lps = 0; + } else { //lps + val = val - (span - (prob - 1)); + span = prob - 1; + out = (out << 1) + 1 - mps; + flag_lps = 1; + } + + //renormalize + unsigned shift = 0; + while(span < 0x7f) { + shift++; + + span = (span << 1) + 1; + val = (val << 1) + (in >> 7); + + in <<= 1; + if(--in_count == 0) { + in = dataread(); + in_count = 8; + } + } + + //update processing info + lps = (lps << 1) + flag_lps; + inverts = (inverts << 1) + context[con].invert; + + //update context state + if(flag_lps & toggle_invert(con)) context[con].invert ^= 1; + if(flag_lps) context[con].index = next_lps(con); + else if(shift) context[con].index = next_mps(con); + } + + //save byte + write(out); + } +} + +void SPC7110Decomp::mode1(bool init) { + static int pixelorder[4], realorder[4]; + static uint8 in, val, span; + static int out, inverts, lps, in_count; + + if(init == true) { + for(unsigned i = 0; i < 4; i++) pixelorder[i] = i; + out = inverts = lps = 0; + span = 0xff; + val = dataread(); + in = dataread(); + in_count = 8; + return; + } + + while(decomp_buffer_length < (decomp_buffer_size >> 1)) { + for(unsigned pixel = 0; pixel < 8; pixel++) { + //get first symbol context + unsigned a = ((out >> (1 * 2)) & 3); + unsigned b = ((out >> (7 * 2)) & 3); + unsigned c = ((out >> (8 * 2)) & 3); + unsigned con = (a == b) ? (b != c) : (b == c) ? 2 : 4 - (a == c); + + //update pixel order + unsigned m, n; + for(m = 0; m < 4; m++) if(pixelorder[m] == a) break; + for(n = m; n > 0; n--) pixelorder[n] = pixelorder[n - 1]; + pixelorder[0] = a; + + //calculate the real pixel order + for(m = 0; m < 4; m++) realorder[m] = pixelorder[m]; + + //rotate reference pixel c value to top + for(m = 0; m < 4; m++) if(realorder[m] == c) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = c; + + //rotate reference pixel b value to top + for(m = 0; m < 4; m++) if(realorder[m] == b) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = b; + + //rotate reference pixel a value to top + for(m = 0; m < 4; m++) if(realorder[m] == a) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = a; + + //get 2 symbols + for(unsigned bit = 0; bit < 2; bit++) { + //get prob + unsigned prob = probability(con); + + //get symbol + unsigned flag_lps; + if(val <= span - prob) { //mps + span = span - prob; + flag_lps = 0; + } else { //lps + val = val - (span - (prob - 1)); + span = prob - 1; + flag_lps = 1; + } + + //renormalize + unsigned shift = 0; + while(span < 0x7f) { + shift++; + + span = (span << 1) + 1; + val = (val << 1) + (in >> 7); + + in <<= 1; + if(--in_count == 0) { + in = dataread(); + in_count = 8; + } + } + + //update processing info + lps = (lps << 1) + flag_lps; + inverts = (inverts << 1) + context[con].invert; + + //update context state + if(flag_lps & toggle_invert(con)) context[con].invert ^= 1; + if(flag_lps) context[con].index = next_lps(con); + else if(shift) context[con].index = next_mps(con); + + //get next context + con = 5 + (con << 1) + ((lps ^ inverts) & 1); + } + + //get pixel + b = realorder[(lps ^ inverts) & 3]; + out = (out << 2) + b; + } + + //turn pixel data into bitplanes + unsigned data = morton_2x8(out); + write(data >> 8); + write(data >> 0); + } +} + +void SPC7110Decomp::mode2(bool init) { + static int pixelorder[16], realorder[16]; + static uint8 bitplanebuffer[16], buffer_index; + static uint8 in, val, span; + static int out0, out1, inverts, lps, in_count; + + if(init == true) { + for(unsigned i = 0; i < 16; i++) pixelorder[i] = i; + buffer_index = 0; + out0 = out1 = inverts = lps = 0; + span = 0xff; + val = dataread(); + in = dataread(); + in_count = 8; + return; + } + + while(decomp_buffer_length < (decomp_buffer_size >> 1)) { + for(unsigned pixel = 0; pixel < 8; pixel++) { + //get first symbol context + unsigned a = ((out0 >> (0 * 4)) & 15); + unsigned b = ((out0 >> (7 * 4)) & 15); + unsigned c = ((out1 >> (0 * 4)) & 15); + unsigned con = 0; + unsigned refcon = (a == b) ? (b != c) : (b == c) ? 2 : 4 - (a == c); + + //update pixel order + unsigned m, n; + for(m = 0; m < 16; m++) if(pixelorder[m] == a) break; + for(n = m; n > 0; n--) pixelorder[n] = pixelorder[n - 1]; + pixelorder[0] = a; + + //calculate the real pixel order + for(m = 0; m < 16; m++) realorder[m] = pixelorder[m]; + + //rotate reference pixel c value to top + for(m = 0; m < 16; m++) if(realorder[m] == c) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = c; + + //rotate reference pixel b value to top + for(m = 0; m < 16; m++) if(realorder[m] == b) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = b; + + //rotate reference pixel a value to top + for(m = 0; m < 16; m++) if(realorder[m] == a) break; + for(n = m; n > 0; n--) realorder[n] = realorder[n - 1]; + realorder[0] = a; + + //get 4 symbols + for(unsigned bit = 0; bit < 4; bit++) { + //get prob + unsigned prob = probability(con); + + //get symbol + unsigned flag_lps; + if(val <= span - prob) { //mps + span = span - prob; + flag_lps = 0; + } else { //lps + val = val - (span - (prob - 1)); + span = prob - 1; + flag_lps = 1; + } + + //renormalize + unsigned shift = 0; + while(span < 0x7f) { + shift++; + + span = (span << 1) + 1; + val = (val << 1) + (in >> 7); + + in <<= 1; + if(--in_count == 0) { + in = dataread(); + in_count = 8; + } + } + + //update processing info + lps = (lps << 1) + flag_lps; + unsigned invertbit = context[con].invert; + inverts = (inverts << 1) + invertbit; + + //update context state + if(flag_lps & toggle_invert(con)) context[con].invert ^= 1; + if(flag_lps) context[con].index = next_lps(con); + else if(shift) context[con].index = next_mps(con); + + //get next context + con = mode2_context_table[con][flag_lps ^ invertbit] + (con == 1 ? refcon : 0); + } + + //get pixel + b = realorder[(lps ^ inverts) & 0x0f]; + out1 = (out1 << 4) + ((out0 >> 28) & 0x0f); + out0 = (out0 << 4) + b; + } + + //convert pixel data into bitplanes + unsigned data = morton_4x8(out0); + write(data >> 24); + write(data >> 16); + bitplanebuffer[buffer_index++] = data >> 8; + bitplanebuffer[buffer_index++] = data >> 0; + + if(buffer_index == 16) { + for(unsigned i = 0; i < 16; i++) write(bitplanebuffer[i]); + buffer_index = 0; + } + } +} + +// + +const uint8 SPC7110Decomp::evolution_table[53][4] = { +//{ prob, nextlps, nextmps, toggle invert }, + + { 0x5a, 1, 1, 1 }, + { 0x25, 6, 2, 0 }, + { 0x11, 8, 3, 0 }, + { 0x08, 10, 4, 0 }, + { 0x03, 12, 5, 0 }, + { 0x01, 15, 5, 0 }, + + { 0x5a, 7, 7, 1 }, + { 0x3f, 19, 8, 0 }, + { 0x2c, 21, 9, 0 }, + { 0x20, 22, 10, 0 }, + { 0x17, 23, 11, 0 }, + { 0x11, 25, 12, 0 }, + { 0x0c, 26, 13, 0 }, + { 0x09, 28, 14, 0 }, + { 0x07, 29, 15, 0 }, + { 0x05, 31, 16, 0 }, + { 0x04, 32, 17, 0 }, + { 0x03, 34, 18, 0 }, + { 0x02, 35, 5, 0 }, + + { 0x5a, 20, 20, 1 }, + { 0x48, 39, 21, 0 }, + { 0x3a, 40, 22, 0 }, + { 0x2e, 42, 23, 0 }, + { 0x26, 44, 24, 0 }, + { 0x1f, 45, 25, 0 }, + { 0x19, 46, 26, 0 }, + { 0x15, 25, 27, 0 }, + { 0x11, 26, 28, 0 }, + { 0x0e, 26, 29, 0 }, + { 0x0b, 27, 30, 0 }, + { 0x09, 28, 31, 0 }, + { 0x08, 29, 32, 0 }, + { 0x07, 30, 33, 0 }, + { 0x05, 31, 34, 0 }, + { 0x04, 33, 35, 0 }, + { 0x04, 33, 36, 0 }, + { 0x03, 34, 37, 0 }, + { 0x02, 35, 38, 0 }, + { 0x02, 36, 5, 0 }, + + { 0x58, 39, 40, 1 }, + { 0x4d, 47, 41, 0 }, + { 0x43, 48, 42, 0 }, + { 0x3b, 49, 43, 0 }, + { 0x34, 50, 44, 0 }, + { 0x2e, 51, 45, 0 }, + { 0x29, 44, 46, 0 }, + { 0x25, 45, 24, 0 }, + + { 0x56, 47, 48, 1 }, + { 0x4f, 47, 49, 0 }, + { 0x47, 48, 50, 0 }, + { 0x41, 49, 51, 0 }, + { 0x3c, 50, 52, 0 }, + { 0x37, 51, 43, 0 }, +}; + +const uint8 SPC7110Decomp::mode2_context_table[32][2] = { +//{ next 0, next 1 }, + + { 1, 2 }, + + { 3, 8 }, + { 13, 14 }, + + { 15, 16 }, + { 17, 18 }, + { 19, 20 }, + { 21, 22 }, + { 23, 24 }, + { 25, 26 }, + { 25, 26 }, + { 25, 26 }, + { 25, 26 }, + { 25, 26 }, + { 27, 28 }, + { 29, 30 }, + + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + { 31, 31 }, + + { 31, 31 }, +}; + +uint8 SPC7110Decomp::probability (unsigned n) { return evolution_table[context[n].index][0]; } +uint8 SPC7110Decomp::next_lps (unsigned n) { return evolution_table[context[n].index][1]; } +uint8 SPC7110Decomp::next_mps (unsigned n) { return evolution_table[context[n].index][2]; } +bool SPC7110Decomp::toggle_invert(unsigned n) { return evolution_table[context[n].index][3]; } + +unsigned SPC7110Decomp::morton_2x8(unsigned data) { + //reverse morton lookup: de-interleave two 8-bit values + //15, 13, 11, 9, 7, 5, 3, 1 -> 15- 8 + //14, 12, 10, 8, 6, 4, 2, 0 -> 7- 0 + return morton16[0][(data >> 0) & 255] + morton16[1][(data >> 8) & 255]; +} + +unsigned SPC7110Decomp::morton_4x8(unsigned data) { + //reverse morton lookup: de-interleave four 8-bit values + //31, 27, 23, 19, 15, 11, 7, 3 -> 31-24 + //30, 26, 22, 18, 14, 10, 6, 2 -> 23-16 + //29, 25, 21, 17, 13, 9, 5, 1 -> 15- 8 + //28, 24, 20, 16, 12, 8, 4, 0 -> 7- 0 + return morton32[0][(data >> 0) & 255] + morton32[1][(data >> 8) & 255] + + morton32[2][(data >> 16) & 255] + morton32[3][(data >> 24) & 255]; +} + +// + +void SPC7110Decomp::reset() { + //mode 3 is invalid; this is treated as a special case to always return 0x00 + //set to mode 3 so that reading decomp port before starting first decomp will return 0x00 + decomp_mode = 3; + + decomp_buffer_rdoffset = 0; + decomp_buffer_wroffset = 0; + decomp_buffer_length = 0; +} + +SPC7110Decomp::SPC7110Decomp() { + decomp_buffer = new uint8_t[decomp_buffer_size]; + reset(); + + //initialize reverse morton lookup tables + for(unsigned i = 0; i < 256; i++) { + #define map(x, y) (((i >> x) & 1) << y) + //2x8-bit + morton16[1][i] = map(7, 15) + map(6, 7) + map(5, 14) + map(4, 6) + + map(3, 13) + map(2, 5) + map(1, 12) + map(0, 4); + morton16[0][i] = map(7, 11) + map(6, 3) + map(5, 10) + map(4, 2) + + map(3, 9) + map(2, 1) + map(1, 8) + map(0, 0); + //4x8-bit + morton32[3][i] = map(7, 31) + map(6, 23) + map(5, 15) + map(4, 7) + + map(3, 30) + map(2, 22) + map(1, 14) + map(0, 6); + morton32[2][i] = map(7, 29) + map(6, 21) + map(5, 13) + map(4, 5) + + map(3, 28) + map(2, 20) + map(1, 12) + map(0, 4); + morton32[1][i] = map(7, 27) + map(6, 19) + map(5, 11) + map(4, 3) + + map(3, 26) + map(2, 18) + map(1, 10) + map(0, 2); + morton32[0][i] = map(7, 25) + map(6, 17) + map(5, 9) + map(4, 1) + + map(3, 24) + map(2, 16) + map(1, 8) + map(0, 0); + #undef map + } +} + +SPC7110Decomp::~SPC7110Decomp() { + delete[] decomp_buffer; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/spc7110/decomp.hpp b/Mednafen/mednafen/snes/src/chip/spc7110/decomp.hpp new file mode 100755 index 0000000000..2b67605ff0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/spc7110/decomp.hpp @@ -0,0 +1,46 @@ +class SPC7110Decomp { +public: + uint8 read(); + void init(unsigned mode, unsigned offset, unsigned index); + void reset(); + + void serialize(serializer&); + SPC7110Decomp(); + ~SPC7110Decomp(); + +private: + unsigned decomp_mode; + unsigned decomp_offset; + + //read() will spool chunks half the size of decomp_buffer_size + enum { decomp_buffer_size = 64 }; //must be >= 64, and must be a power of two + uint8 *decomp_buffer; + unsigned decomp_buffer_rdoffset; + unsigned decomp_buffer_wroffset; + unsigned decomp_buffer_length; + + void write(uint8 data); + uint8 dataread(); + + void mode0(bool init); + void mode1(bool init); + void mode2(bool init); + + static const uint8 evolution_table[53][4]; + static const uint8 mode2_context_table[32][2]; + + struct ContextState { + uint8 index; + uint8 invert; + } context[32]; + + uint8 probability(unsigned n); + uint8 next_lps(unsigned n); + uint8 next_mps(unsigned n); + bool toggle_invert(unsigned n); + + unsigned morton16[2][256]; + unsigned morton32[4][256]; + unsigned morton_2x8(unsigned data); + unsigned morton_4x8(unsigned data); +}; diff --git a/Mednafen/mednafen/snes/src/chip/spc7110/serialization.cpp b/Mednafen/mednafen/snes/src/chip/spc7110/serialization.cpp new file mode 100755 index 0000000000..2e77d5243b --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/spc7110/serialization.cpp @@ -0,0 +1,81 @@ +#ifdef SPC7110_CPP + +void SPC7110Decomp::serialize(serializer &s) { + s.integer(decomp_mode); + s.integer(decomp_offset); + + s.array(decomp_buffer, decomp_buffer_size); + s.integer(decomp_buffer_rdoffset); + s.integer(decomp_buffer_wroffset); + s.integer(decomp_buffer_length); + + for(unsigned n = 0; n < 32; n++) { + s.integer(context[n].index); + s.integer(context[n].invert); + } +} + +void SPC7110::serialize(serializer &s) { + s.integer(r4801); + s.integer(r4802); + s.integer(r4803); + s.integer(r4804); + s.integer(r4805); + s.integer(r4806); + s.integer(r4807); + s.integer(r4808); + s.integer(r4809); + s.integer(r480a); + s.integer(r480b); + s.integer(r480c); + decomp.serialize(s); + + s.integer(r4811); + s.integer(r4812); + s.integer(r4813); + s.integer(r4814); + s.integer(r4815); + s.integer(r4816); + s.integer(r4817); + s.integer(r4818); + s.integer(r481x); + s.integer(r4814_latch); + s.integer(r4815_latch); + + s.integer(r4820); + s.integer(r4821); + s.integer(r4822); + s.integer(r4823); + s.integer(r4824); + s.integer(r4825); + s.integer(r4826); + s.integer(r4827); + s.integer(r4828); + s.integer(r4829); + s.integer(r482a); + s.integer(r482b); + s.integer(r482c); + s.integer(r482d); + s.integer(r482e); + s.integer(r482f); + + s.integer(r4830); + s.integer(r4831); + s.integer(r4832); + s.integer(r4833); + s.integer(r4834); + + s.integer(dx_offset); + s.integer(ex_offset); + s.integer(fx_offset); + + s.integer(r4840); + s.integer(r4841); + s.integer(r4842); + + s.integer(rtc_state); + s.integer(rtc_mode); + s.integer(rtc_index); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/spc7110/spc7110.cpp b/Mednafen/mednafen/snes/src/chip/spc7110/spc7110.cpp new file mode 100755 index 0000000000..5319c27e44 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/spc7110/spc7110.cpp @@ -0,0 +1,677 @@ +#include <../base.hpp> + +#define SPC7110_CPP +namespace bSNES_v059 { + +SPC7110 spc7110; + +#include "serialization.cpp" +#include "decomp.cpp" + +const unsigned SPC7110::months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + +void SPC7110::init() {} + +void SPC7110::enable() { + uint16_t limit = (cartridge.has_spc7110rtc() ? 0x4842 : 0x483f); + for(uint16_t i = 0x4800; i <= limit; i++) memory::mmio.map(i, *this); +} + +void SPC7110::power() { + reset(); +} + +void SPC7110::reset() { + r4801 = 0x00; + r4802 = 0x00; + r4803 = 0x00; + r4804 = 0x00; + r4805 = 0x00; + r4806 = 0x00; + r4807 = 0x00; + r4808 = 0x00; + r4809 = 0x00; + r480a = 0x00; + r480b = 0x00; + r480c = 0x00; + + decomp.reset(); + + r4811 = 0x00; + r4812 = 0x00; + r4813 = 0x00; + r4814 = 0x00; + r4815 = 0x00; + r4816 = 0x00; + r4817 = 0x00; + r4818 = 0x00; + + r481x = 0x00; + r4814_latch = false; + r4815_latch = false; + + r4820 = 0x00; + r4821 = 0x00; + r4822 = 0x00; + r4823 = 0x00; + r4824 = 0x00; + r4825 = 0x00; + r4826 = 0x00; + r4827 = 0x00; + r4828 = 0x00; + r4829 = 0x00; + r482a = 0x00; + r482b = 0x00; + r482c = 0x00; + r482d = 0x00; + r482e = 0x00; + r482f = 0x00; + + r4830 = 0x00; + mmio_write(0x4831, 0); + mmio_write(0x4832, 1); + mmio_write(0x4833, 2); + r4834 = 0x00; + + r4840 = 0x00; + r4841 = 0x00; + r4842 = 0x00; + + if(cartridge.has_spc7110rtc()) { + rtc_state = RTCS_Inactive; + rtc_mode = RTCM_Linear; + rtc_index = 0; + } +} + +unsigned SPC7110::datarom_addr(unsigned addr) { + unsigned size = memory::cartrom.size() - 0x100000; + while(addr >= size) addr -= size; + return addr + 0x100000; +} + +unsigned SPC7110::data_pointer() { return r4811 + (r4812 << 8) + (r4813 << 16); } +unsigned SPC7110::data_adjust() { return r4814 + (r4815 << 8); } +unsigned SPC7110::data_increment() { return r4816 + (r4817 << 8); } +void SPC7110::set_data_pointer(unsigned addr) { r4811 = addr; r4812 = addr >> 8; r4813 = addr >> 16; } +void SPC7110::set_data_adjust(unsigned addr) { r4814 = addr; r4815 = addr >> 8; } + +void SPC7110::update_time(int offset) { + time_t rtc_time + = (memory::cartrtc.read(16) << 0) + | (memory::cartrtc.read(17) << 8) + | (memory::cartrtc.read(18) << 16) + | (memory::cartrtc.read(19) << 24); + time_t current_time = time(0) - offset; + + //sizeof(time_t) is platform-dependent; though memory::cartrtc needs to be platform-agnostic. + //yet platforms with 32-bit signed time_t will overflow every ~68 years. handle this by + //accounting for overflow at the cost of 1-bit precision (to catch underflow). this will allow + //memory::cartrtc timestamp to remain valid for up to ~34 years from the last update, even if + //time_t overflows. calculation should be valid regardless of number representation, time_t size, + //or whether time_t is signed or unsigned. + time_t diff + = (current_time >= rtc_time) + ? (current_time - rtc_time) + : (std::numeric_limits::max() - rtc_time + current_time + 1); //compensate for overflow + if(diff > std::numeric_limits::max() / 2) diff = 0; //compensate for underflow + + bool update = true; + if(memory::cartrtc.read(13) & 1) update = false; //do not update if CR0 timer disable flag is set + if(memory::cartrtc.read(15) & 3) update = false; //do not update if CR2 timer disable flags are set + + if(diff > 0 && update == true) { + unsigned second = memory::cartrtc.read( 0) + memory::cartrtc.read( 1) * 10; + unsigned minute = memory::cartrtc.read( 2) + memory::cartrtc.read( 3) * 10; + unsigned hour = memory::cartrtc.read( 4) + memory::cartrtc.read( 5) * 10; + unsigned day = memory::cartrtc.read( 6) + memory::cartrtc.read( 7) * 10; + unsigned month = memory::cartrtc.read( 8) + memory::cartrtc.read( 9) * 10; + unsigned year = memory::cartrtc.read(10) + memory::cartrtc.read(11) * 10; + unsigned weekday = memory::cartrtc.read(12); + + day--; + month--; + year += (year >= 90) ? 1900 : 2000; //range = 1990-2089 + + second += diff; + while(second >= 60) { + second -= 60; + + minute++; + if(minute < 60) continue; + minute = 0; + + hour++; + if(hour < 24) continue; + hour = 0; + + day++; + weekday = (weekday + 1) % 7; + unsigned days = months[month % 12]; + if(days == 28) { + bool leapyear = false; + if((year % 4) == 0) { + leapyear = true; + if((year % 100) == 0 && (year % 400) != 0) leapyear = false; + } + if(leapyear) days++; + } + if(day < days) continue; + day = 0; + + month++; + if(month < 12) continue; + month = 0; + + year++; + } + + day++; + month++; + year %= 100; + + memory::cartrtc.write( 0, second % 10); + memory::cartrtc.write( 1, second / 10); + memory::cartrtc.write( 2, minute % 10); + memory::cartrtc.write( 3, minute / 10); + memory::cartrtc.write( 4, hour % 10); + memory::cartrtc.write( 5, hour / 10); + memory::cartrtc.write( 6, day % 10); + memory::cartrtc.write( 7, day / 10); + memory::cartrtc.write( 8, month % 10); + memory::cartrtc.write( 9, month / 10); + memory::cartrtc.write(10, year % 10); + memory::cartrtc.write(11, (year / 10) % 10); + memory::cartrtc.write(12, weekday % 7); + } + + memory::cartrtc.write(16, current_time >> 0); + memory::cartrtc.write(17, current_time >> 8); + memory::cartrtc.write(18, current_time >> 16); + memory::cartrtc.write(19, current_time >> 24); +} + +uint8 SPC7110::mmio_read(unsigned addr) { + addr &= 0xffff; + + switch(addr) { + //================== + //decompression unit + //================== + + case 0x4800: { + uint16 counter = (r4809 + (r480a << 8)); + counter--; + r4809 = counter; + r480a = counter >> 8; + return decomp.read(); + } + case 0x4801: return r4801; + case 0x4802: return r4802; + case 0x4803: return r4803; + case 0x4804: return r4804; + case 0x4805: return r4805; + case 0x4806: return r4806; + case 0x4807: return r4807; + case 0x4808: return r4808; + case 0x4809: return r4809; + case 0x480a: return r480a; + case 0x480b: return r480b; + case 0x480c: { + uint8 status = r480c; + r480c &= 0x7f; + return status; + } + + //============== + //data port unit + //============== + + case 0x4810: { + if(r481x != 0x07) return 0x00; + + unsigned addr = data_pointer(); + unsigned adjust = data_adjust(); + if(r4818 & 8) adjust = (int16)adjust; //16-bit sign extend + + unsigned adjustaddr = addr; + if(r4818 & 2) { + adjustaddr += adjust; + set_data_adjust(adjust + 1); + } + + uint8 data = memory::cartrom.read(datarom_addr(adjustaddr)); + if(!(r4818 & 2)) { + unsigned increment = (r4818 & 1) ? data_increment() : 1; + if(r4818 & 4) increment = (int16)increment; //16-bit sign extend + + if((r4818 & 16) == 0) { + set_data_pointer(addr + increment); + } else { + set_data_adjust(adjust + increment); + } + } + + return data; + } + case 0x4811: return r4811; + case 0x4812: return r4812; + case 0x4813: return r4813; + case 0x4814: return r4814; + case 0x4815: return r4815; + case 0x4816: return r4816; + case 0x4817: return r4817; + case 0x4818: return r4818; + case 0x481a: { + if(r481x != 0x07) return 0x00; + + unsigned addr = data_pointer(); + unsigned adjust = data_adjust(); + if(r4818 & 8) adjust = (int16)adjust; //16-bit sign extend + + uint8 data = memory::cartrom.read(datarom_addr(addr + adjust)); + if((r4818 & 0x60) == 0x60) { + if((r4818 & 16) == 0) { + set_data_pointer(addr + adjust); + } else { + set_data_adjust(adjust + adjust); + } + } + + return data; + } + + //========= + //math unit + //========= + + case 0x4820: return r4820; + case 0x4821: return r4821; + case 0x4822: return r4822; + case 0x4823: return r4823; + case 0x4824: return r4824; + case 0x4825: return r4825; + case 0x4826: return r4826; + case 0x4827: return r4827; + case 0x4828: return r4828; + case 0x4829: return r4829; + case 0x482a: return r482a; + case 0x482b: return r482b; + case 0x482c: return r482c; + case 0x482d: return r482d; + case 0x482e: return r482e; + case 0x482f: { + uint8 status = r482f; + r482f &= 0x7f; + return status; + } + + //=================== + //memory mapping unit + //=================== + + case 0x4830: return r4830; + case 0x4831: return r4831; + case 0x4832: return r4832; + case 0x4833: return r4833; + case 0x4834: return r4834; + + //==================== + //real-time clock unit + //==================== + + case 0x4840: return r4840; + case 0x4841: { + if(rtc_state == RTCS_Inactive || rtc_state == RTCS_ModeSelect) return 0x00; + + r4842 = 0x80; + uint8 data = memory::cartrtc.read(rtc_index); + rtc_index = (rtc_index + 1) & 15; + return data; + } + case 0x4842: { + uint8 status = r4842; + r4842 &= 0x7f; + return status; + } + } + + return cpu.regs.mdr; +} + +void SPC7110::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + switch(addr) { + //================== + //decompression unit + //================== + + case 0x4801: r4801 = data; break; + case 0x4802: r4802 = data; break; + case 0x4803: r4803 = data; break; + case 0x4804: r4804 = data; break; + case 0x4805: r4805 = data; break; + case 0x4806: { + r4806 = data; + + unsigned table = (r4801 + (r4802 << 8) + (r4803 << 16)); + unsigned index = (r4804 << 2); + unsigned length = (r4809 + (r480a << 8)); + unsigned addr = datarom_addr(table + index); + unsigned mode = (memory::cartrom.read(addr + 0)); + unsigned offset = (memory::cartrom.read(addr + 1) << 16) + + (memory::cartrom.read(addr + 2) << 8) + + (memory::cartrom.read(addr + 3) << 0); + + decomp.init(mode, offset, (r4805 + (r4806 << 8)) << mode); + r480c = 0x80; + } break; + + case 0x4807: r4807 = data; break; + case 0x4808: r4808 = data; break; + case 0x4809: r4809 = data; break; + case 0x480a: r480a = data; break; + case 0x480b: r480b = data; break; + + //============== + //data port unit + //============== + + case 0x4811: r4811 = data; r481x |= 0x01; break; + case 0x4812: r4812 = data; r481x |= 0x02; break; + case 0x4813: r4813 = data; r481x |= 0x04; break; + case 0x4814: { + r4814 = data; + r4814_latch = true; + if(!r4815_latch) break; + if(!(r4818 & 2)) break; + if(r4818 & 0x10) break; + + if((r4818 & 0x60) == 0x20) { + unsigned increment = data_adjust() & 0xff; + if(r4818 & 8) increment = (int8)increment; //8-bit sign extend + set_data_pointer(data_pointer() + increment); + } else if((r4818 & 0x60) == 0x40) { + unsigned increment = data_adjust(); + if(r4818 & 8) increment = (int16)increment; //16-bit sign extend + set_data_pointer(data_pointer() + increment); + } + } break; + case 0x4815: { + r4815 = data; + r4815_latch = true; + if(!r4814_latch) break; + if(!(r4818 & 2)) break; + if(r4818 & 0x10) break; + + if((r4818 & 0x60) == 0x20) { + unsigned increment = data_adjust() & 0xff; + if(r4818 & 8) increment = (int8)increment; //8-bit sign extend + set_data_pointer(data_pointer() + increment); + } else if((r4818 & 0x60) == 0x40) { + unsigned increment = data_adjust(); + if(r4818 & 8) increment = (int16)increment; //16-bit sign extend + set_data_pointer(data_pointer() + increment); + } + } break; + case 0x4816: r4816 = data; break; + case 0x4817: r4817 = data; break; + case 0x4818: { + if(r481x != 0x07) break; + + r4818 = data; + r4814_latch = r4815_latch = false; + } break; + + //========= + //math unit + //========= + + case 0x4820: r4820 = data; break; + case 0x4821: r4821 = data; break; + case 0x4822: r4822 = data; break; + case 0x4823: r4823 = data; break; + case 0x4824: r4824 = data; break; + case 0x4825: { + r4825 = data; + + if(r482e & 1) { + //signed 16-bit x 16-bit multiplication + int16 r0 = (int16)(r4824 + (r4825 << 8)); + int16 r1 = (int16)(r4820 + (r4821 << 8)); + + signed result = r0 * r1; + r4828 = result; + r4829 = result >> 8; + r482a = result >> 16; + r482b = result >> 24; + } else { + //unsigned 16-bit x 16-bit multiplication + uint16 r0 = (uint16)(r4824 + (r4825 << 8)); + uint16 r1 = (uint16)(r4820 + (r4821 << 8)); + + unsigned result = r0 * r1; + r4828 = result; + r4829 = result >> 8; + r482a = result >> 16; + r482b = result >> 24; + } + + r482f = 0x80; + } break; + case 0x4826: r4826 = data; break; + case 0x4827: { + r4827 = data; + + if(r482e & 1) { + //signed 32-bit x 16-bit division + int32 dividend = (int32)(r4820 + (r4821 << 8) + (r4822 << 16) + (r4823 << 24)); + int16 divisor = (int16)(r4826 + (r4827 << 8)); + + int32 quotient; + int16 remainder; + + if(divisor) { + quotient = (int32)(dividend / divisor); + remainder = (int32)(dividend % divisor); + } else { + //illegal division by zero + quotient = 0; + remainder = dividend & 0xffff; + } + + r4828 = quotient; + r4829 = quotient >> 8; + r482a = quotient >> 16; + r482b = quotient >> 24; + + r482c = remainder; + r482d = remainder >> 8; + } else { + //unsigned 32-bit x 16-bit division + uint32 dividend = (uint32)(r4820 + (r4821 << 8) + (r4822 << 16) + (r4823 << 24)); + uint16 divisor = (uint16)(r4826 + (r4827 << 8)); + + uint32 quotient; + uint16 remainder; + + if(divisor) { + quotient = (uint32)(dividend / divisor); + remainder = (uint16)(dividend % divisor); + } else { + //illegal division by zero + quotient = 0; + remainder = dividend & 0xffff; + } + + r4828 = quotient; + r4829 = quotient >> 8; + r482a = quotient >> 16; + r482b = quotient >> 24; + + r482c = remainder; + r482d = remainder >> 8; + } + + r482f = 0x80; + } break; + + case 0x482e: { + //reset math unit + r4820 = r4821 = r4822 = r4823 = 0; + r4824 = r4825 = r4826 = r4827 = 0; + r4828 = r4829 = r482a = r482b = 0; + r482c = r482d = 0; + + r482e = data; + } break; + + //=================== + //memory mapping unit + //=================== + + case 0x4830: r4830 = data; break; + + case 0x4831: { + r4831 = data; + dx_offset = datarom_addr(data * 0x100000); + } break; + + case 0x4832: { + r4832 = data; + ex_offset = datarom_addr(data * 0x100000); + } break; + + case 0x4833: { + r4833 = data; + fx_offset = datarom_addr(data * 0x100000); + } break; + + case 0x4834: r4834 = data; break; + + //==================== + //real-time clock unit + //==================== + + case 0x4840: { + r4840 = data; + if(!(r4840 & 1)) { + //disable RTC + rtc_state = RTCS_Inactive; + update_time(); + } else { + //enable RTC + r4842 = 0x80; + rtc_state = RTCS_ModeSelect; + } + } break; + + case 0x4841: { + r4841 = data; + + switch(rtc_state) { + case RTCS_ModeSelect: { + if(data == RTCM_Linear || data == RTCM_Indexed) { + r4842 = 0x80; + rtc_state = RTCS_IndexSelect; + rtc_mode = (RTC_Mode)data; + rtc_index = 0; + } + } break; + + case RTCS_IndexSelect: { + r4842 = 0x80; + rtc_index = data & 15; + if(rtc_mode == RTCM_Linear) rtc_state = RTCS_Write; + } break; + + case RTCS_Write: { + r4842 = 0x80; + + //control register 0 + if(rtc_index == 13) { + //increment second counter + if(data & 2) update_time(+1); + + //round minute counter + if(data & 8) { + update_time(); + + unsigned second = memory::cartrtc.read( 0) + memory::cartrtc.read( 1) * 10; + //clear seconds + memory::cartrtc.write(0, 0); + memory::cartrtc.write(1, 0); + + if(second >= 30) update_time(+60); + } + } + + //control register 2 + if(rtc_index == 15) { + //disable timer and clear second counter + if((data & 1) && !(memory::cartrtc.read(15) & 1)) { + update_time(); + + //clear seconds + memory::cartrtc.write(0, 0); + memory::cartrtc.write(1, 0); + } + + //disable timer + if((data & 2) && !(memory::cartrtc.read(15) & 2)) { + update_time(); + } + } + + memory::cartrtc.write(rtc_index, data & 15); + rtc_index = (rtc_index + 1) & 15; + } break; + } //switch(rtc_state) + } break; + } +} + +uint8 SPC7110::read(unsigned addr) { + //$[00-0f|80-8f]:[8000-ffff], $[c0-cf]:[0000-ffff] mapped directly to memory::cartrom + + if((addr & 0xffe000) == 0x006000 || (addr & 0xffe000) == 0x306000) { + //$[00|30]:[6000-7fff] + return memory::cartram.read(addr & 0x1fff); + } + + if((addr & 0xff0000) == 0x500000) { + //$[50]:[0000-ffff] + return mmio_read(0x4800); + } + + if((addr & 0xf00000) == 0xd00000) { + //$[d0-df]:[0000-ffff] + return memory::cartrom.read(dx_offset + (addr & 0x0fffff)); + } + + if((addr & 0xf00000) == 0xe00000) { + //$[e0-ef]:[0000-ffff] + return memory::cartrom.read(ex_offset + (addr & 0x0fffff)); + } + + if((addr & 0xf00000) == 0xf00000) { + //$[f0-ff]:[0000-ffff] + return memory::cartrom.read(fx_offset + (addr & 0x0fffff)); + } + + return cpu.regs.mdr; +} + +void SPC7110::write(unsigned addr, uint8 data) { + if((addr & 0xffe000) == 0x006000 || (addr & 0xffe000) == 0x306000) { + //$[00|30]:[6000-7fff] + if(r4830 & 0x80) memory::cartram.write(addr & 0x1fff, data); + return; + } +} + +SPC7110::SPC7110() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/spc7110/spc7110.hpp b/Mednafen/mednafen/snes/src/chip/spc7110/spc7110.hpp new file mode 100755 index 0000000000..fa6770f01f --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/spc7110/spc7110.hpp @@ -0,0 +1,136 @@ +/***** + * SPC7110 emulator - version 0.03 (2008-08-10) + * Copyright (c) 2008, byuu and neviksti + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * The software is provided "as is" and the author disclaims all warranties + * with regard to this software including all implied warranties of + * merchantibility and fitness, in no event shall the author be liable for + * any special, direct, indirect, or consequential damages or any damages + * whatsoever resulting from loss of use, data or profits, whether in an + * action of contract, negligence or other tortious action, arising out of + * or in connection with the use or performance of this software. + *****/ + +#include "decomp.hpp" + +class SPC7110 : public MMIO, public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + unsigned datarom_addr(unsigned addr); + + unsigned data_pointer(); + unsigned data_adjust(); + unsigned data_increment(); + void set_data_pointer(unsigned addr); + void set_data_adjust(unsigned addr); + + void update_time(int offset = 0); + time_t create_time(); + + uint8 mmio_read(unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + //spc7110decomp + void decomp_init(); + uint8 decomp_read(); + + void serialize(serializer&); + SPC7110(); + +private: + //================== + //decompression unit + //================== + uint8 r4801; //compression table low + uint8 r4802; //compression table high + uint8 r4803; //compression table bank + uint8 r4804; //compression table index + uint8 r4805; //decompression buffer index low + uint8 r4806; //decompression buffer index high + uint8 r4807; //??? + uint8 r4808; //??? + uint8 r4809; //compression length low + uint8 r480a; //compression length high + uint8 r480b; //decompression control register + uint8 r480c; //decompression status + + SPC7110Decomp decomp; + + //============== + //data port unit + //============== + uint8 r4811; //data pointer low + uint8 r4812; //data pointer high + uint8 r4813; //data pointer bank + uint8 r4814; //data adjust low + uint8 r4815; //data adjust high + uint8 r4816; //data increment low + uint8 r4817; //data increment high + uint8 r4818; //data port control register + + uint8 r481x; + + bool r4814_latch; + bool r4815_latch; + + //========= + //math unit + //========= + uint8 r4820; //16-bit multiplicand B0, 32-bit dividend B0 + uint8 r4821; //16-bit multiplicand B1, 32-bit dividend B1 + uint8 r4822; //32-bit dividend B2 + uint8 r4823; //32-bit dividend B3 + uint8 r4824; //16-bit multiplier B0 + uint8 r4825; //16-bit multiplier B1 + uint8 r4826; //16-bit divisor B0 + uint8 r4827; //16-bit divisor B1 + uint8 r4828; //32-bit product B0, 32-bit quotient B0 + uint8 r4829; //32-bit product B1, 32-bit quotient B1 + uint8 r482a; //32-bit product B2, 32-bit quotient B2 + uint8 r482b; //32-bit product B3, 32-bit quotient B3 + uint8 r482c; //16-bit remainder B0 + uint8 r482d; //16-bit remainder B1 + uint8 r482e; //math control register + uint8 r482f; //math status + + //=================== + //memory mapping unit + //=================== + uint8 r4830; //SRAM write enable + uint8 r4831; //$[d0-df]:[0000-ffff] mapping + uint8 r4832; //$[e0-ef]:[0000-ffff] mapping + uint8 r4833; //$[f0-ff]:[0000-ffff] mapping + uint8 r4834; //??? + + unsigned dx_offset; + unsigned ex_offset; + unsigned fx_offset; + + //==================== + //real-time clock unit + //==================== + uint8 r4840; //RTC latch + uint8 r4841; //RTC index/data port + uint8 r4842; //RTC status + + enum RTC_State { RTCS_Inactive, RTCS_ModeSelect, RTCS_IndexSelect, RTCS_Write }; + enum RTC_Mode { RTCM_Linear = 0x03, RTCM_Indexed = 0x0c }; + unsigned rtc_state; + unsigned rtc_mode; + unsigned rtc_index; + + static const unsigned months[12]; +}; + +extern SPC7110 spc7110; diff --git a/Mednafen/mednafen/snes/src/chip/srtc/serialization.cpp b/Mednafen/mednafen/snes/src/chip/srtc/serialization.cpp new file mode 100755 index 0000000000..538a1bd83d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/srtc/serialization.cpp @@ -0,0 +1,8 @@ +#ifdef SRTC_CPP + +void SRTC::serialize(serializer &s) { + s.integer(rtc_mode); + s.integer(rtc_index); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/srtc/srtc.cpp b/Mednafen/mednafen/snes/src/chip/srtc/srtc.cpp new file mode 100755 index 0000000000..689046da9c --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/srtc/srtc.cpp @@ -0,0 +1,233 @@ +#include <../base.hpp> + +#define SRTC_CPP +namespace bSNES_v059 { + +SRTC srtc; + +#include "serialization.cpp" + +const unsigned SRTC::months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + +void SRTC::init() { +} + +void SRTC::enable() { + memory::mmio.map(0x2800, *this); + memory::mmio.map(0x2801, *this); +} + +void SRTC::power() { + reset(); +} + +void SRTC::reset() { + rtc_mode = RtcRead; + rtc_index = -1; + update_time(); +} + +void SRTC::update_time() { + time_t rtc_time + = (memory::cartrtc.read(16) << 0) + | (memory::cartrtc.read(17) << 8) + | (memory::cartrtc.read(18) << 16) + | (memory::cartrtc.read(19) << 24); + time_t current_time = time(0); + + //sizeof(time_t) is platform-dependent; though memory::cartrtc needs to be platform-agnostic. + //yet platforms with 32-bit signed time_t will overflow every ~68 years. handle this by + //accounting for overflow at the cost of 1-bit precision (to catch underflow). this will allow + //memory::cartrtc timestamp to remain valid for up to ~34 years from the last update, even if + //time_t overflows. calculation should be valid regardless of number representation, time_t size, + //or whether time_t is signed or unsigned. + time_t diff + = (current_time >= rtc_time) + ? (current_time - rtc_time) + : (std::numeric_limits::max() - rtc_time + current_time + 1); //compensate for overflow + if(diff > std::numeric_limits::max() / 2) diff = 0; //compensate for underflow + + if(diff > 0) { + unsigned second = memory::cartrtc.read( 0) + memory::cartrtc.read( 1) * 10; + unsigned minute = memory::cartrtc.read( 2) + memory::cartrtc.read( 3) * 10; + unsigned hour = memory::cartrtc.read( 4) + memory::cartrtc.read( 5) * 10; + unsigned day = memory::cartrtc.read( 6) + memory::cartrtc.read( 7) * 10; + unsigned month = memory::cartrtc.read( 8); + unsigned year = memory::cartrtc.read( 9) + memory::cartrtc.read(10) * 10 + memory::cartrtc.read(11) * 100; + unsigned weekday = memory::cartrtc.read(12); + + day--; + month--; + year += 1000; + + second += diff; + while(second >= 60) { + second -= 60; + + minute++; + if(minute < 60) continue; + minute = 0; + + hour++; + if(hour < 24) continue; + hour = 0; + + day++; + weekday = (weekday + 1) % 7; + unsigned days = months[month % 12]; + if(days == 28) { + bool leapyear = false; + if((year % 4) == 0) { + leapyear = true; + if((year % 100) == 0 && (year % 400) != 0) leapyear = false; + } + if(leapyear) days++; + } + if(day < days) continue; + day = 0; + + month++; + if(month < 12) continue; + month = 0; + + year++; + } + + day++; + month++; + year -= 1000; + + memory::cartrtc.write( 0, second % 10); + memory::cartrtc.write( 1, second / 10); + memory::cartrtc.write( 2, minute % 10); + memory::cartrtc.write( 3, minute / 10); + memory::cartrtc.write( 4, hour % 10); + memory::cartrtc.write( 5, hour / 10); + memory::cartrtc.write( 6, day % 10); + memory::cartrtc.write( 7, day / 10); + memory::cartrtc.write( 8, month); + memory::cartrtc.write( 9, year % 10); + memory::cartrtc.write(10, (year / 10) % 10); + memory::cartrtc.write(11, year / 100); + memory::cartrtc.write(12, weekday % 7); + } + + memory::cartrtc.write(16, current_time >> 0); + memory::cartrtc.write(17, current_time >> 8); + memory::cartrtc.write(18, current_time >> 16); + memory::cartrtc.write(19, current_time >> 24); +} + +//returns day of week for specified date +//eg 0 = Sunday, 1 = Monday, ... 6 = Saturday +//usage: weekday(2008, 1, 1) returns weekday of January 1st, 2008 +unsigned SRTC::weekday(unsigned year, unsigned month, unsigned day) { + unsigned y = 1900, m = 1; //epoch is 1900-01-01 + unsigned sum = 0; //number of days passed since epoch + + year = max(1900, year); + month = max(1, min(12, month)); + day = max(1, min(31, day)); + + while(y < year) { + bool leapyear = false; + if((y % 4) == 0) { + leapyear = true; + if((y % 100) == 0 && (y % 400) != 0) leapyear = false; + } + sum += leapyear ? 366 : 365; + y++; + } + + while(m < month) { + unsigned days = months[m - 1]; + if(days == 28) { + bool leapyear = false; + if((y % 4) == 0) { + leapyear = true; + if((y % 100) == 0 && (y % 400) != 0) leapyear = false; + } + if(leapyear) days++; + } + sum += days; + m++; + } + + sum += day - 1; + return (sum + 1) % 7; //1900-01-01 was a Monday +} + +uint8 SRTC::mmio_read(unsigned addr) { + addr &= 0xffff; + + if(addr == 0x2800) { + if(rtc_mode != RtcRead) return 0x00; + + if(rtc_index < 0) { + update_time(); + rtc_index++; + return 0x0f; + } else if(rtc_index > 12) { + rtc_index = -1; + return 0x0f; + } else { + return memory::cartrtc.read(rtc_index++); + } + } + + return cpu.regs.mdr; +} + +void SRTC::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + if(addr == 0x2801) { + data &= 0x0f; //only the low four bits are used + + if(data == 0x0d) { + rtc_mode = RtcRead; + rtc_index = -1; + return; + } + + if(data == 0x0e) { + rtc_mode = RtcCommand; + return; + } + + if(data == 0x0f) return; //unknown behavior + + if(rtc_mode == RtcWrite) { + if(rtc_index >= 0 && rtc_index < 12) { + memory::cartrtc.write(rtc_index++, data); + + if(rtc_index == 12) { + //day of week is automatically calculated and written + unsigned day = memory::cartrtc.read( 6) + memory::cartrtc.read( 7) * 10; + unsigned month = memory::cartrtc.read( 8); + unsigned year = memory::cartrtc.read( 9) + memory::cartrtc.read(10) * 10 + memory::cartrtc.read(11) * 100; + year += 1000; + + memory::cartrtc.write(rtc_index++, weekday(year, month, day)); + } + } + } else if(rtc_mode == RtcCommand) { + if(data == 0) { + rtc_mode = RtcWrite; + rtc_index = 0; + } else if(data == 4) { + rtc_mode = RtcReady; + rtc_index = -1; + for(unsigned i = 0; i < 13; i++) memory::cartrtc.write(i, 0); + } else { + //unknown behavior + rtc_mode = RtcReady; + } + } + } +} + +SRTC::SRTC() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/srtc/srtc.hpp b/Mednafen/mednafen/snes/src/chip/srtc/srtc.hpp new file mode 100755 index 0000000000..7bbe7f4719 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/srtc/srtc.hpp @@ -0,0 +1,24 @@ +class SRTC : public MMIO { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 mmio_read(unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + void serialize(serializer&); + SRTC(); + +private: + static const unsigned months[12]; + enum RtcMode { RtcReady, RtcCommand, RtcRead, RtcWrite }; + unsigned rtc_mode; + signed rtc_index; + + void update_time(); + unsigned weekday(unsigned year, unsigned month, unsigned day); +}; + +extern SRTC srtc; diff --git a/Mednafen/mednafen/snes/src/chip/st010/serialization.cpp b/Mednafen/mednafen/snes/src/chip/st010/serialization.cpp new file mode 100755 index 0000000000..8c0a67c8cb --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/st010/serialization.cpp @@ -0,0 +1,7 @@ +#ifdef ST010_CPP + +void ST010::serialize(serializer &s) { + s.array(ram); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/st010/st010.cpp b/Mednafen/mednafen/snes/src/chip/st010/st010.cpp new file mode 100755 index 0000000000..054cc606b0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/st010/st010.cpp @@ -0,0 +1,95 @@ +#include <../base.hpp> + +#define ST010_CPP +namespace bSNES_v059 { + +ST010 st010; + +#include "st010_data.hpp" +#include "serialization.cpp" +#include "st010_op.cpp" + +void ST010::init() { +} + +void ST010::enable() { + bus.map(Bus::MapDirect, 0x68, 0x6f, 0x0000, 0x0fff, *this); + bus.map(Bus::MapDirect, 0xe8, 0xef, 0x0000, 0x0fff, *this); +} + +int16 ST010::sin(int16 theta) { + return sin_table[(theta >> 8) & 0xff]; +} + +int16 ST010::cos(int16 theta) { + return sin_table[((theta + 0x4000) >> 8) & 0xff]; +} + +uint8 ST010::readb(uint16 addr) { + return ram[addr & 0xfff]; +} + +uint16 ST010::readw(uint16 addr) { + return (readb(addr + 0) << 0) | + (readb(addr + 1) << 8); +} + +uint32 ST010::readd(uint16 addr) { + return (readb(addr + 0) << 0) | + (readb(addr + 1) << 8) | + (readb(addr + 2) << 16) | + (readb(addr + 3) << 24); +} + +void ST010::writeb(uint16 addr, uint8 data) { + ram[addr & 0xfff] = data; +} + +void ST010::writew(uint16 addr, uint16 data) { + writeb(addr + 0, data >> 0); + writeb(addr + 1, data >> 8); +} + +void ST010::writed(uint16 addr, uint32 data) { + writeb(addr + 0, data >> 0); + writeb(addr + 1, data >> 8); + writeb(addr + 2, data >> 16); + writeb(addr + 3, data >> 24); +} + +// + +void ST010::power() { + reset(); +} + +void ST010::reset() { + memset(ram, 0x00, sizeof ram); +} + +// + +uint8 ST010::read(unsigned addr) { + return readb(addr); +} + +void ST010::write(unsigned addr, uint8 data) { + writeb(addr, data); + + if((addr & 0xfff) == 0x0021 && (data & 0x80)) { + switch(ram[0x0020]) { + case 0x01: op_01(); break; + case 0x02: op_02(); break; + case 0x03: op_03(); break; + case 0x04: op_04(); break; + case 0x05: op_05(); break; + case 0x06: op_06(); break; + case 0x07: op_07(); break; + case 0x08: op_08(); break; + } + + ram[0x0021] &= ~0x80; + } +} + +}; diff --git a/Mednafen/mednafen/snes/src/chip/st010/st010.hpp b/Mednafen/mednafen/snes/src/chip/st010/st010.hpp new file mode 100755 index 0000000000..ab837ca1ca --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/st010/st010.hpp @@ -0,0 +1,44 @@ +class ST010 : public Memory { +public: + void init(); + void enable(); + void power(); + void reset(); + + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + void serialize(serializer&); + +private: + uint8 ram[0x1000]; + static const int16 sin_table[256]; + static const int16 mode7_scale[176]; + static const uint8 arctan[32][32]; + + //interfaces to sin table + int16 sin(int16 theta); + int16 cos(int16 theta); + + //interfaces to ram buffer + uint8 readb (uint16 addr); + uint16 readw (uint16 addr); + uint32 readd (uint16 addr); + void writeb(uint16 addr, uint8 data); + void writew(uint16 addr, uint16 data); + void writed(uint16 addr, uint32 data); + + //opcodes + void op_01(); + void op_02(); + void op_03(); + void op_04(); + void op_05(); + void op_06(); + void op_07(); + void op_08(); + + void op_01(int16 x0, int16 y0, int16 &x1, int16 &y1, int16 &quadrant, int16 &theta); +}; + +extern ST010 st010; diff --git a/Mednafen/mednafen/snes/src/chip/st010/st010_data.hpp b/Mednafen/mednafen/snes/src/chip/st010/st010_data.hpp new file mode 100755 index 0000000000..53f816fc99 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/st010/st010_data.hpp @@ -0,0 +1,126 @@ +const int16 ST010::sin_table[256] = { + 0x0000, 0x0324, 0x0648, 0x096a, 0x0c8c, 0x0fab, 0x12c8, 0x15e2, + 0x18f9, 0x1c0b, 0x1f1a, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, + 0x30fb, 0x33df, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, + 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, + 0x5a82, 0x5cb3, 0x5ed7, 0x60eb, 0x62f1, 0x64e8, 0x66cf, 0x68a6, + 0x6a6d, 0x6c23, 0x6dc9, 0x6f5e, 0x70e2, 0x7254, 0x73b5, 0x7504, + 0x7641, 0x776b, 0x7884, 0x7989, 0x7a7c, 0x7b5c, 0x7c29, 0x7ce3, + 0x7d89, 0x7e1d, 0x7e9c, 0x7f09, 0x7f61, 0x7fa6, 0x7fd8, 0x7ff5, + 0x7fff, 0x7ff5, 0x7fd8, 0x7fa6, 0x7f61, 0x7f09, 0x7e9c, 0x7e1d, + 0x7d89, 0x7ce3, 0x7c29, 0x7b5c, 0x7a7c, 0x7989, 0x7884, 0x776b, + 0x7641, 0x7504, 0x73b5, 0x7254, 0x70e2, 0x6f5e, 0x6dc9, 0x6c23, + 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f1, 0x60eb, 0x5ed7, 0x5cb3, + 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, + 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33df, + 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f1a, 0x1c0b, + 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8c, 0x096a, 0x0648, 0x0324, + 0x0000, -0x0324, -0x0648, -0x096b, -0x0c8c, -0x0fab, -0x12c8, -0x15e2, + -0x18f9, -0x1c0b, -0x1f1a, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, + -0x30fb, -0x33df, -0x36ba, -0x398d, -0x3c56, -0x3f17, -0x41ce, -0x447a, + -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, + -0x5a82, -0x5cb3, -0x5ed7, -0x60ec, -0x62f1, -0x64e8, -0x66cf, -0x68a6, + -0x6a6d, -0x6c23, -0x6dc9, -0x6f5e, -0x70e2, -0x7254, -0x73b5, -0x7504, + -0x7641, -0x776b, -0x7884, -0x7989, -0x7a7c, -0x7b5c, -0x7c29, -0x7ce3, + -0x7d89, -0x7e1d, -0x7e9c, -0x7f09, -0x7f61, -0x7fa6, -0x7fd8, -0x7ff5, + -0x7fff, -0x7ff5, -0x7fd8, -0x7fa6, -0x7f61, -0x7f09, -0x7e9c, -0x7e1d, + -0x7d89, -0x7ce3, -0x7c29, -0x7b5c, -0x7a7c, -0x7989, -0x7883, -0x776b, + -0x7641, -0x7504, -0x73b5, -0x7254, -0x70e2, -0x6f5e, -0x6dc9, -0x6c23, + -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f1, -0x60eb, -0x5ed7, -0x5cb3, + -0x5a82, -0x5842, -0x55f5, -0x539a, -0x5133, -0x4ebf, -0x4c3f, -0x49b3, + -0x471c, -0x447a, -0x41cd, -0x3f17, -0x3c56, -0x398c, -0x36b9, -0x33de, + -0x30fb, -0x2e10, -0x2b1f, -0x2826, -0x2527, -0x2223, -0x1f19, -0x1c0b, + -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324 +}; + +const int16 ST010::mode7_scale[176] = { + 0x0380, 0x0325, 0x02da, 0x029c, 0x0268, 0x023b, 0x0215, 0x01f3, + 0x01d5, 0x01bb, 0x01a3, 0x018e, 0x017b, 0x016a, 0x015a, 0x014b, + 0x013e, 0x0132, 0x0126, 0x011c, 0x0112, 0x0109, 0x0100, 0x00f8, + 0x00f0, 0x00e9, 0x00e3, 0x00dc, 0x00d6, 0x00d1, 0x00cb, 0x00c6, + 0x00c1, 0x00bd, 0x00b8, 0x00b4, 0x00b0, 0x00ac, 0x00a8, 0x00a5, + 0x00a2, 0x009e, 0x009b, 0x0098, 0x0095, 0x0093, 0x0090, 0x008d, + 0x008b, 0x0088, 0x0086, 0x0084, 0x0082, 0x0080, 0x007e, 0x007c, + 0x007a, 0x0078, 0x0076, 0x0074, 0x0073, 0x0071, 0x006f, 0x006e, + 0x006c, 0x006b, 0x0069, 0x0068, 0x0067, 0x0065, 0x0064, 0x0063, + 0x0062, 0x0060, 0x005f, 0x005e, 0x005d, 0x005c, 0x005b, 0x005a, + 0x0059, 0x0058, 0x0057, 0x0056, 0x0055, 0x0054, 0x0053, 0x0052, + 0x0051, 0x0051, 0x0050, 0x004f, 0x004e, 0x004d, 0x004d, 0x004c, + 0x004b, 0x004b, 0x004a, 0x0049, 0x0048, 0x0048, 0x0047, 0x0047, + 0x0046, 0x0045, 0x0045, 0x0044, 0x0044, 0x0043, 0x0042, 0x0042, + 0x0041, 0x0041, 0x0040, 0x0040, 0x003f, 0x003f, 0x003e, 0x003e, + 0x003d, 0x003d, 0x003c, 0x003c, 0x003b, 0x003b, 0x003a, 0x003a, + 0x003a, 0x0039, 0x0039, 0x0038, 0x0038, 0x0038, 0x0037, 0x0037, + 0x0036, 0x0036, 0x0036, 0x0035, 0x0035, 0x0035, 0x0034, 0x0034, + 0x0034, 0x0033, 0x0033, 0x0033, 0x0032, 0x0032, 0x0032, 0x0031, + 0x0031, 0x0031, 0x0030, 0x0030, 0x0030, 0x0030, 0x002f, 0x002f, + 0x002f, 0x002e, 0x002e, 0x002e, 0x002e, 0x002d, 0x002d, 0x002d, + 0x002d, 0x002c, 0x002c, 0x002c, 0x002c, 0x002b, 0x002b, 0x002b +}; + +const uint8 ST010::arctan[32][32] = { + { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }, + { 0x80, 0xa0, 0xad, 0xb3, 0xb6, 0xb8, 0xb9, 0xba, 0xbb, 0xbb, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, + 0xbd, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbf }, + { 0x80, 0x93, 0xa0, 0xa8, 0xad, 0xb0, 0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd }, + { 0x80, 0x8d, 0x98, 0xa0, 0xa6, 0xaa, 0xad, 0xb0, 0xb1, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb7, 0xb8, + 0xb8, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbc }, + { 0x80, 0x8a, 0x93, 0x9a, 0xa0, 0xa5, 0xa8, 0xab, 0xad, 0xaf, 0xb0, 0xb2, 0xb3, 0xb4, 0xb5, 0xb5, + 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xba, 0xba, 0xba, 0xba, 0xba, 0xbb, 0xbb }, + { 0x80, 0x88, 0x90, 0x96, 0x9b, 0xa0, 0xa4, 0xa7, 0xa9, 0xab, 0xad, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xb9, 0xb9 }, + { 0x80, 0x87, 0x8d, 0x93, 0x98, 0x9c, 0xa0, 0xa3, 0xa6, 0xa8, 0xaa, 0xac, 0xad, 0xae, 0xb0, 0xb0, + 0xb1, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8 }, + { 0x80, 0x86, 0x8b, 0x90, 0x95, 0x99, 0x9d, 0xa0, 0xa3, 0xa5, 0xa7, 0xa9, 0xaa, 0xac, 0xad, 0xae, + 0xaf, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb6, 0xb6, 0xb6, 0xb7, 0xb7 }, + { 0x80, 0x85, 0x8a, 0x8f, 0x93, 0x97, 0x9a, 0x9d, 0xa0, 0xa2, 0xa5, 0xa6, 0xa8, 0xaa, 0xab, 0xac, + 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb5 }, + { 0x80, 0x85, 0x89, 0x8d, 0x91, 0x95, 0x98, 0x9b, 0x9e, 0xa0, 0xa0, 0xa4, 0xa6, 0xa7, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4 }, + { 0x80, 0x84, 0x88, 0x8c, 0x90, 0x93, 0x96, 0x99, 0x9b, 0x9e, 0xa0, 0xa2, 0xa4, 0xa5, 0xa7, 0xa8, + 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xaf, 0xb0, 0xb0, 0xb1, 0xb2, 0xb2, 0xb2, 0xb3, 0xb3 }, + { 0x80, 0x84, 0x87, 0x8b, 0x8e, 0x91, 0x94, 0x97, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, 0xa6, + 0xa7, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb1, 0xb1, 0xb2, 0xb2 }, + { 0x80, 0x83, 0x87, 0x8a, 0x8d, 0x90, 0x93, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa3, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1 }, + { 0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x94, 0x96, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa2, 0xa3, + 0xa4, 0xa5, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xac, 0xad, 0xae, 0xae, 0xaf, 0xaf, 0xb0 }, + { 0x80, 0x83, 0x86, 0x89, 0x8b, 0x8e, 0x90, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9d, 0x9e, 0xa0, 0xa1, + 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac, 0xad, 0xad, 0xae, 0xae, 0xaf }, + { 0x80, 0x83, 0x85, 0x88, 0x8b, 0x8d, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9b, 0x9d, 0x9f, 0xa0, + 0xa1, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa, 0xab, 0xab, 0xac, 0xad, 0xad, 0xae }, + { 0x80, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8f, 0x91, 0x93, 0x95, 0x97, 0x99, 0x9a, 0x9c, 0x9d, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xab, 0xac, 0xad }, + { 0x80, 0x82, 0x85, 0x87, 0x89, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x97, 0x99, 0x9b, 0x9c, 0x9d, + 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa, 0xaa, 0xab, 0xac }, + { 0x80, 0x82, 0x85, 0x87, 0x89, 0x8b, 0x8d, 0x8f, 0x91, 0x93, 0x95, 0x96, 0x98, 0x99, 0x9b, 0x9c, + 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab }, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x95, 0x97, 0x98, 0x9a, 0x9b, + 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8, 0xa8, 0xa9, 0xaa }, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x99, 0x9a, + 0x9b, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6, 0xa7, 0xa7, 0xa8, 0xa9 }, + { 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8f, 0x90, 0x92, 0x94, 0x95, 0x97, 0x98, 0x99, + 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8 }, + { 0x80, 0x82, 0x84, 0x86, 0x87, 0x89, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x93, 0x94, 0x96, 0x97, 0x98, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7 }, + { 0x80, 0x82, 0x84, 0x85, 0x87, 0x89, 0x8a, 0x8c, 0x8e, 0x8f, 0x91, 0x92, 0x94, 0x95, 0x96, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5, 0xa6 }, + { 0x80, 0x82, 0x83, 0x85, 0x87, 0x88, 0x8a, 0x8c, 0x8d, 0x8f, 0x90, 0x92, 0x93, 0x94, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa5, 0xa5 }, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4, 0xa4 }, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x88, 0x89, 0x8b, 0x8c, 0x8e, 0x8f, 0x90, 0x92, 0x93, 0x94, 0x95, + 0x96, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa2, 0xa3, 0xa4 }, + { 0x80, 0x82, 0x83, 0x85, 0x86, 0x87, 0x89, 0x8a, 0x8c, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x93, 0x95, + 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa1, 0xa2, 0xa3 }, + { 0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x89, 0x8a, 0x8b, 0x8d, 0x8e, 0x8f, 0x90, 0x92, 0x93, 0x94, + 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9e, 0x9f, 0xa0, 0xa1, 0xa1, 0xa2 }, + { 0x80, 0x81, 0x83, 0x84, 0x86, 0x87, 0x88, 0x8a, 0x8b, 0x8c, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, + 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1, 0xa1 }, + { 0x80, 0x81, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8b, 0x8c, 0x8d, 0x8e, 0x90, 0x91, 0x92, 0x93, + 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0, 0xa1 }, + { 0x80, 0x81, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, + 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, 0xa0 } +}; diff --git a/Mednafen/mednafen/snes/src/chip/st010/st010_op.cpp b/Mednafen/mednafen/snes/src/chip/st010/st010_op.cpp new file mode 100755 index 0000000000..b22a861c7f --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/st010/st010_op.cpp @@ -0,0 +1,261 @@ +#ifdef ST010_CPP + +//ST-010 emulation code - Copyright (C) 2003 The Dumper, Matthew Kendora, Overload, Feather +//bsnes port - Copyright (C) 2007 byuu + +void ST010::op_01(int16 x0, int16 y0, int16 &x1, int16 &y1, int16 &quadrant, int16 &theta) { + if((x0 < 0) && (y0 < 0)) { + x1 = -x0; + y1 = -y0; + quadrant = -0x8000; + } else if(x0 < 0) { + x1 = y0; + y1 = -x0; + quadrant = -0x4000; + } else if(y0 < 0) { + x1 = -y0; + y1 = x0; + quadrant = 0x4000; + } else { + x1 = x0; + y1 = y0; + quadrant = 0x0000; + } + + while((x1 > 0x1f) || (y1 > 0x1f)) { + if(x1 > 1) { x1 >>= 1; } + if(y1 > 1) { y1 >>= 1; } + } + + if(y1 == 0) { quadrant += 0x4000; } + + theta = (arctan[y1][x1] << 8) ^ quadrant; +} + +// + +void ST010::op_01() { + int16 x0 = readw(0x0000); + int16 y0 = readw(0x0002); + int16 x1, y1, quadrant, theta; + + op_01(x0, y0, x1, y1, quadrant, theta); + + writew(0x0000, x1); + writew(0x0002, y1); + writew(0x0004, quadrant); +//writew(0x0006, y0); //Overload's docs note this write occurs, SNES9x disagrees + writew(0x0010, theta); +} + +void ST010::op_02() { + int16 positions = readw(0x0024); + uint16 *places = (uint16*)(ram + 0x0040); + uint16 *drivers = (uint16*)(ram + 0x0080); + + bool sorted; + uint16 temp; + if(positions > 1) { + do { + sorted = true; + for(int i = 0; i < positions - 1; i++) { + if(places[i] < places[i + 1]) { + temp = places[i + 1]; + places[i + 1] = places[i]; + places[i] = temp; + + temp = drivers[i + 1]; + drivers[i + 1] = drivers[i]; + drivers[i] = temp; + + sorted = false; + } + } + positions--; + } while(!sorted); + } +} + +void ST010::op_03() { + int16 x0 = readw(0x0000); + int16 y0 = readw(0x0002); + int16 multiplier = readw(0x0004); + int32 x1, y1; + + x1 = x0 * multiplier << 1; + y1 = y0 * multiplier << 1; + + writed(0x0010, x1); + writed(0x0014, y1); +} + +void ST010::op_04() { + int16 x = readw(0x0000); + int16 y = readw(0x0002); + int16 square; + //calculate the vector length of (x,y) + square = (int16)sqrt((double)(y * y + x * x)); + + writew(0x0010, square); +} + +void ST010::op_05() { + int32 dx, dy; + int16 a1, b1, c1; + uint16 o1; + bool wrap = false; + + //target (x,y) coordinates + int16 ypos_max = readw(0x00c0); + int16 xpos_max = readw(0x00c2); + + //current coordinates and direction + int32 ypos = readd(0x00c4); + int32 xpos = readd(0x00c8); + uint16 rot = readw(0x00cc); + + //physics + uint16 speed = readw(0x00d4); + uint16 accel = readw(0x00d6); + uint16 speed_max = readw(0x00d8); + + //special condition acknowledgement + int16 system = readw(0x00da); + int16 flags = readw(0x00dc); + + //new target coordinates + int16 ypos_new = readw(0x00de); + int16 xpos_new = readw(0x00e0); + + //mask upper bit + xpos_new &= 0x7fff; + + //get the current distance + dx = xpos_max - (xpos >> 16); + dy = ypos_max - (ypos >> 16); + + //quirk: clear and move in9 + writew(0x00d2, 0xffff); + writew(0x00da, 0x0000); + + //grab the target angle + op_01(dy, dx, a1, b1, c1, (int16&)o1); + + //check for wrapping + if(abs(o1 - rot) > 0x8000) { + o1 += 0x8000; + rot += 0x8000; + wrap = true; + } + + uint16 old_speed = speed; + + //special case + if(abs(o1 - rot) == 0x8000) { + speed = 0x100; + } + + //slow down for sharp curves + else if(abs(o1 - rot) >= 0x1000) { + uint32 slow = abs(o1 - rot); + slow >>= 4; //scaling + speed -= slow; + } + + //otherwise accelerate + else { + speed += accel; + if(speed > speed_max) { + speed = speed_max; //clip speed + } + } + + //prevent negative/positive overflow + if(abs(old_speed - speed) > 0x8000) { + if(old_speed < speed) { speed = 0; } + else speed = 0xff00; + } + + //adjust direction by so many degrees + //be careful of negative adjustments + if((o1 > rot && (o1 - rot) > 0x80) || (o1 < rot && (rot - o1) >= 0x80)) { + if(o1 < rot) { rot -= 0x280; } + else if(o1 > rot) { rot += 0x280; } + } + + //turn off wrapping + if(wrap) { rot -= 0x8000; } + + //now check the distances (store for later) + dx = (xpos_max << 16) - xpos; + dy = (ypos_max << 16) - ypos; + dx >>= 16; + dy >>= 16; + + //if we're in so many units of the target, signal it + if((system && (dy <= 6 && dy >= -8) && (dx <= 126 && dx >= -128)) || (!system && (dx <= 6 && dx >= -8) && (dy <= 126 && dy >= -128))) { + //announce our new destination and flag it + xpos_max = xpos_new & 0x7fff; + ypos_max = ypos_new; + flags |= 0x08; + } + + //update position + xpos -= (cos(rot) * 0x400 >> 15) * (speed >> 8) << 1; + ypos -= (sin(rot) * 0x400 >> 15) * (speed >> 8) << 1; + + //quirk: mask upper byte + xpos &= 0x1fffffff; + ypos &= 0x1fffffff; + + writew(0x00c0, ypos_max); + writew(0x00c2, xpos_max); + writed(0x00c4, ypos); + writed(0x00c8, xpos); + writew(0x00cc, rot); + writew(0x00d4, speed); + writew(0x00dc, flags); +} + +void ST010::op_06() { + int16 multiplicand = readw(0x0000); + int16 multiplier = readw(0x0002); + int32 product; + + product = multiplicand * multiplier << 1; + + writed(0x0010, product); +} + +void ST010::op_07() { + int16 theta = readw(0x0000); + + int16 data; + for(int i = 0, offset = 0; i < 176; i++) { + data = mode7_scale[i] * cos(theta) >> 15; + writew(0x00f0 + offset, data); + writew(0x0510 + offset, data); + + data = mode7_scale[i] * sin(theta) >> 15; + writew(0x0250 + offset, data); + if(data) { data = ~data; } + writew(0x03b0 + offset, data); + + offset += 2; + } +} + +void ST010::op_08() { + int16 x0 = readw(0x0000); + int16 y0 = readw(0x0002); + int16 theta = readw(0x0004); + int16 x1, y1; + + x1 = (y0 * sin(theta) >> 15) + (x0 * cos(theta) >> 15); + y1 = (y0 * cos(theta) >> 15) - (x0 * sin(theta) >> 15); + + writew(0x0010, x1); + writew(0x0012, y1); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/bus/bus.cpp b/Mednafen/mednafen/snes/src/chip/superfx/bus/bus.cpp new file mode 100755 index 0000000000..98578fcbba --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/bus/bus.cpp @@ -0,0 +1,174 @@ +#ifdef SUPERFX_CPP + +SuperFXBus superfxbus; + +namespace memory { + SuperFXCPUROM fxrom; + SuperFXCPURAM fxram; +} + +uint8 SuperFXBus::read(uint32 addr) +{ + static const void* cat_table[8] = + { + &&case_0, + &&case_1, + &&case_2, + &&case_3, + &&case_default, &&case_default, &&case_default, &&case_default + }; + + goto *cat_table[addr >> 21]; + + case_0: // 0x00-0x1F + case_1: // 0x20-0x3F + while(!superfx.regs.scmr.ron && scheduler.sync != Scheduler::SyncAll) + { + superfx.add_clocks(6); + scheduler.sync_copcpu(); + } + return rom_ptr[((addr & 0x3F0000) >> 1) | (addr & 0x7FFF)]; + + case_2: // 0x40-0x5F + while(!superfx.regs.scmr.ron && scheduler.sync != Scheduler::SyncAll) + { + superfx.add_clocks(6); + scheduler.sync_copcpu(); + } + return rom_ptr[addr & 0x1FFFFF]; + + case_3: // 0x60-0x7F + while(!superfx.regs.scmr.ran && scheduler.sync != Scheduler::SyncAll) + { + superfx.add_clocks(6); + scheduler.sync_copcpu(); + } + + if(ram_ptr) + return ram_ptr[addr & ram_mask]; + + //puts("ZOO"); + + return(0xFF); + + case_default: + //puts("MOO"); + return 0xFF; +} + +void SuperFXBus::write(uint32 addr, uint8 val) +{ + static const void* cat_table[8] = + { + &&case_0, + &&case_1, + &&case_2, + &&case_3, + &&case_default, &&case_default, &&case_default, &&case_default + }; + + goto *cat_table[addr >> 21]; + + case_0: // 0x00-0x1F + case_1: // 0x20-0x3F + while(!superfx.regs.scmr.ron && scheduler.sync != Scheduler::SyncAll) + { + superfx.add_clocks(6); + scheduler.sync_copcpu(); + } + return; + + case_2: // 0x40-0x5F + while(!superfx.regs.scmr.ron && scheduler.sync != Scheduler::SyncAll) + { + superfx.add_clocks(6); + scheduler.sync_copcpu(); + } + return; + + case_3: // 0x60-0x7F + while(!superfx.regs.scmr.ran && scheduler.sync != Scheduler::SyncAll) + { + superfx.add_clocks(6); + scheduler.sync_copcpu(); + } + + if(ram_ptr) + ram_ptr[addr & ram_mask] = val; + + return; + + case_default: + //puts("MOOW"); + return; +} + +void SuperFXBus::init() +{ + rom_ptr = memory::cartrom.data(); + + if((int)memory::cartram.size() > 0) + { + ram_ptr = memory::cartram.data(); + ram_mask = memory::cartram.size() - 1; + } + else + { + ram_ptr = NULL; + ram_mask = 0; + } + +#if 0 + map(MapDirect, 0x00, 0xff, 0x0000, 0xffff, memory::memory_unmapped); + + map(MapLinear, 0x00, 0x3f, 0x0000, 0x7fff, memory::gsurom); + map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::gsurom); + map(MapLinear, 0x40, 0x5f, 0x0000, 0xffff, memory::gsurom); + map(MapLinear, 0x60, 0x7f, 0x0000, 0xffff, memory::gsuram); +#endif + + bus.map(Bus::MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::fxram, 0x0000, 0x2000); + bus.map(Bus::MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::fxrom); + bus.map(Bus::MapLinear, 0x40, 0x5f, 0x0000, 0xffff, memory::fxrom); + bus.map(Bus::MapLinear, 0x60, 0x7d, 0x0000, 0xffff, memory::fxram); + bus.map(Bus::MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::fxram, 0x0000, 0x2000); + bus.map(Bus::MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::fxrom); + bus.map(Bus::MapLinear, 0xc0, 0xdf, 0x0000, 0xffff, memory::fxrom); + bus.map(Bus::MapLinear, 0xe0, 0xff, 0x0000, 0xffff, memory::fxram); +} + +//ROM / RAM access from the S-CPU + +unsigned SuperFXCPUROM::size() const { + return memory::cartrom.size(); +} + +uint8 SuperFXCPUROM::read(unsigned addr) { + if(superfx.regs.sfr.g && superfx.regs.scmr.ron) { + static const uint8_t data[16] = { + 0x00, 0x01, 0x00, 0x01, 0x04, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x08, 0x01, 0x00, 0x01, 0x0c, 0x01, + }; + return data[addr & 15]; + } + return memory::cartrom.read(addr); +} + +void SuperFXCPUROM::write(unsigned addr, uint8 data) { + memory::cartrom.write(addr, data); +} + +unsigned SuperFXCPURAM::size() const { + return memory::cartram.size(); +} + +uint8 SuperFXCPURAM::read(unsigned addr) { + if(superfx.regs.sfr.g && superfx.regs.scmr.ran) return cpu.regs.mdr; + return memory::cartram.read(addr); +} + +void SuperFXCPURAM::write(unsigned addr, uint8 data) { + memory::cartram.write(addr, data); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/bus/bus.hpp b/Mednafen/mednafen/snes/src/chip/superfx/bus/bus.hpp new file mode 100755 index 0000000000..49adfcdee7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/bus/bus.hpp @@ -0,0 +1,28 @@ +struct SuperFXBus +{ + void init(); + void power(); + void reset(); + uint8 read(uint32 addr); + void write(uint32 addr, uint8 val); + uint8* rom_ptr; + uint8* ram_ptr; + uint32 ram_mask; +}; + +struct SuperFXCPUROM : Memory { + unsigned size() const; + uint8 read(unsigned); + void write(unsigned, uint8); +}; + +struct SuperFXCPURAM : Memory { + unsigned size() const; + uint8 read(unsigned); + void write(unsigned, uint8); +}; + +namespace memory { + extern SuperFXCPUROM fxrom; + extern SuperFXCPURAM fxram; +} diff --git a/Mednafen/mednafen/snes/src/chip/superfx/core/core.cpp b/Mednafen/mednafen/snes/src/chip/superfx/core/core.cpp new file mode 100755 index 0000000000..229ad24e59 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/core/core.cpp @@ -0,0 +1,107 @@ +#ifdef SUPERFX_CPP + +#include "opcodes.cpp" +#include "opcode_table.cpp" + +uint8 SuperFX::color(uint8 source) { + if(regs.por.highnibble) return (regs.colr & 0xf0) | (source >> 4); + if(regs.por.freezehigh) return (regs.colr & 0xf0) | (source & 0x0f); + return source; +} + +void SuperFX::plot(uint8 x, uint8 y) { + uint8 color = regs.colr; + + if(regs.por.dither && regs.scmr.md != 3) { + if((x ^ y) & 1) color >>= 4; + color &= 0x0f; + } + + if(!regs.por.transparent) { + if(regs.scmr.md == 3) { + if(regs.por.freezehigh) { + if((color & 0x0f) == 0) return; + } else { + if(color == 0) return; + } + } else { + if((color & 0x0f) == 0) return; + } + } + + uint16 offset = (y << 5) + (x >> 3); + if(offset != pixelcache[0].offset) { + pixelcache_flush(pixelcache[1]); + pixelcache[1] = pixelcache[0]; + pixelcache[0].bitpend = 0x00; + pixelcache[0].offset = offset; + } + + x = (x & 7) ^ 7; + pixelcache[0].data[x] = color; + pixelcache[0].bitpend |= 1 << x; + if(pixelcache[0].bitpend == 0xff) { + pixelcache_flush(pixelcache[1]); + pixelcache[1] = pixelcache[0]; + pixelcache[0].bitpend = 0x00; + } +} + +uint8 SuperFX::rpix(uint8 x, uint8 y) { + pixelcache_flush(pixelcache[1]); + pixelcache_flush(pixelcache[0]); + + unsigned cn; //character number + switch(regs.por.obj ? 3 : regs.scmr.ht) { + case 0: cn = ((x & 0xf8) << 1) + ((y & 0xf8) >> 3); break; + case 1: cn = ((x & 0xf8) << 1) + ((x & 0xf8) >> 1) + ((y & 0xf8) >> 3); break; + case 2: cn = ((x & 0xf8) << 1) + ((x & 0xf8) << 0) + ((y & 0xf8) >> 3); break; + case 3: cn = ((y & 0x80) << 2) + ((x & 0x80) << 1) + ((y & 0x78) << 1) + ((x & 0x78) >> 3); break; + } + unsigned bpp = 2 << (regs.scmr.md - (regs.scmr.md >> 1)); // = [regs.scmr.md]{ 2, 4, 4, 8 }; + unsigned addr = 0x700000 + (cn * (bpp << 3)) + (regs.scbr << 10) + ((y & 0x07) * 2); + uint8 data = 0x00; + x = (x & 7) ^ 7; + + for(unsigned n = 0; n < bpp; n++) { + unsigned byte = ((n >> 1) << 4) + (n & 1); // = [n]{ 0, 1, 16, 17, 32, 33, 48, 49 }; + add_clocks(memory_access_speed); + data |= ((superfxbus.read(addr + byte) >> x) & 1) << n; + } + + return data; +} + +void SuperFX::pixelcache_flush(pixelcache_t &cache) { + if(cache.bitpend == 0x00) return; + + uint8 x = cache.offset << 3; + uint8 y = cache.offset >> 5; + + unsigned cn; //character number + switch(regs.por.obj ? 3 : regs.scmr.ht) { + case 0: cn = ((x & 0xf8) << 1) + ((y & 0xf8) >> 3); break; + case 1: cn = ((x & 0xf8) << 1) + ((x & 0xf8) >> 1) + ((y & 0xf8) >> 3); break; + case 2: cn = ((x & 0xf8) << 1) + ((x & 0xf8) << 0) + ((y & 0xf8) >> 3); break; + case 3: cn = ((y & 0x80) << 2) + ((x & 0x80) << 1) + ((y & 0x78) << 1) + ((x & 0x78) >> 3); break; + } + unsigned bpp = 2 << (regs.scmr.md - (regs.scmr.md >> 1)); // = [regs.scmr.md]{ 2, 4, 4, 8 }; + unsigned addr = 0x700000 + (cn * (bpp << 3)) + (regs.scbr << 10) + ((y & 0x07) * 2); + + for(unsigned n = 0; n < bpp; n++) { + unsigned byte = ((n >> 1) << 4) + (n & 1); // = [n]{ 0, 1, 16, 17, 32, 33, 48, 49 }; + uint8 data = 0x00; + for(unsigned x = 0; x < 8; x++) data |= ((cache.data[x] >> n) & 1) << x; + if(cache.bitpend != 0xff) { + add_clocks(memory_access_speed); + data &= cache.bitpend; + data |= superfxbus.read(addr + byte) & ~cache.bitpend; + } + add_clocks(memory_access_speed); + superfxbus.write(addr + byte, data); + } + + cache.bitpend = 0x00; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/core/core.hpp b/Mednafen/mednafen/snes/src/chip/superfx/core/core.hpp new file mode 100755 index 0000000000..8b01076ca5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/core/core.hpp @@ -0,0 +1,91 @@ +#include "registers.hpp" + +uint8 color(uint8 source); +void plot(uint8 x, uint8 y); +uint8 rpix(uint8 x, uint8 y); +void pixelcache_flush(pixelcache_t &cache); + +void do_op(unsigned iopv); + +//opcodes.cpp +template void op_adc_i(); +template void op_adc_r(); +template void op_add_i(); +template void op_add_r(); +void op_alt1(); +void op_alt2(); +void op_alt3(); +template void op_and_i(); +template void op_and_r(); +void op_asr(); +void op_bge(); +void op_bcc(); +void op_bcs(); +void op_beq(); +template void op_bic_i(); +template void op_bic_r(); +void op_blt(); +void op_bmi(); +void op_bne(); +void op_bpl(); +void op_bra(); +void op_bvc(); +void op_bvs(); +void op_cache(); +void op_cmode(); +template void op_cmp_r(); +void op_color(); +template void op_dec_r(); +void op_div2(); +void op_fmult(); +template void op_from_r(); +void op_getb(); +void op_getbl(); +void op_getbh(); +void op_getbs(); +void op_getc(); +void op_hib(); +template void op_ibt_r(); +template void op_inc_r(); +template void op_iwt_r(); +template void op_jmp_r(); +template void op_ldb_ir(); +template void op_ldw_ir(); +template void op_link(); +template void op_ljmp_r(); +template void op_lm_r(); +template void op_lms_r(); +void op_lmult(); +void op_lob(); +void op_loop(); +void op_lsr(); +void op_merge(); +template void op_mult_i(); +template void op_mult_r(); +void op_nop(); +void op_not(); +template void op_or_i(); +template void op_or_r(); +void op_plot(); +void op_ramb(); +void op_rol(); +void op_romb(); +void op_ror(); +void op_rpix(); +template void op_sbc_r(); +void op_sbk(); +void op_sex(); +template void op_sm_r(); +template void op_sms_r(); +template void op_stb_ir(); +void op_stop(); +template void op_stw_ir(); +template void op_sub_i(); +template void op_sub_r(); +void op_swap(); +template void op_to_r(); +template void op_umult_i(); +template void op_umult_r(); +template void op_with_r(); +template void op_xor_i(); +template void op_xor_r(); diff --git a/Mednafen/mednafen/snes/src/chip/superfx/core/opcode_table.cpp b/Mednafen/mednafen/snes/src/chip/superfx/core/opcode_table.cpp new file mode 100755 index 0000000000..156e86dec6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/core/opcode_table.cpp @@ -0,0 +1,187 @@ +#ifdef SUPERFX_CPP + +alwaysinline void SuperFX::do_op(unsigned iopv) +{ + #define op4(id, name) \ + op(id+ 0, name< 1>) op(id+ 1, name< 2>) op(id+ 2, name< 3>) op(id+ 3, name< 4>) + + #define op6(id, name) \ + op(id+ 0, name< 8>) op(id+ 1, name< 9>) op(id+ 2, name<10>) op(id+ 3, name<11>) \ + op(id+ 4, name<12>) op(id+ 5, name<13>) + + #define op12(id, name) \ + op(id+ 0, name< 0>) op(id+ 1, name< 1>) op(id+ 2, name< 2>) op(id+ 3, name< 3>) \ + op(id+ 4, name< 4>) op(id+ 5, name< 5>) op(id+ 6, name< 6>) op(id+ 7, name< 7>) \ + op(id+ 8, name< 8>) op(id+ 9, name< 9>) op(id+10, name<10>) op(id+11, name<11>) + + #define op15l(id, name) \ + op(id+ 0, name< 0>) op(id+ 1, name< 1>) op(id+ 2, name< 2>) op(id+ 3, name< 3>) \ + op(id+ 4, name< 4>) op(id+ 5, name< 5>) op(id+ 6, name< 6>) op(id+ 7, name< 7>) \ + op(id+ 8, name< 8>) op(id+ 9, name< 9>) op(id+10, name<10>) op(id+11, name<11>) \ + op(id+12, name<12>) op(id+13, name<13>) op(id+14, name<14>) + + #define op15h(id, name) \ + op(id+ 0, name< 1>) op(id+ 1, name< 2>) op(id+ 2, name< 3>) op(id+ 3, name< 4>) \ + op(id+ 4, name< 5>) op(id+ 5, name< 6>) op(id+ 6, name< 7>) op(id+ 7, name< 8>) \ + op(id+ 8, name< 9>) op(id+ 9, name<10>) op(id+10, name<11>) op(id+11, name<12>) \ + op(id+12, name<13>) op(id+13, name<14>) op(id+14, name<15>) + + #define op16(id, name) \ + op(id+ 0, name< 0>) op(id+ 1, name< 1>) op(id+ 2, name< 2>) op(id+ 3, name< 3>) \ + op(id+ 4, name< 4>) op(id+ 5, name< 5>) op(id+ 6, name< 6>) op(id+ 7, name< 7>) \ + op(id+ 8, name< 8>) op(id+ 9, name< 9>) op(id+10, name<10>) op(id+11, name<11>) \ + op(id+12, name<12>) op(id+13, name<13>) op(id+14, name<14>) op(id+15, name<15>) + + switch(iopv) + { + #define op(id, name) case 0 + id: case 256 + id: case 512 + id: case 768 + id: SuperFX::op_##name(); break; + op (0x00, stop) + op (0x01, nop) + op (0x02, cache) + op (0x03, lsr) + op (0x04, rol) + op (0x05, bra) + op (0x06, blt) + op (0x07, bge) + op (0x08, bne) + op (0x09, beq) + op (0x0a, bpl) + op (0x0b, bmi) + op (0x0c, bcc) + op (0x0d, bcs) + op (0x0e, bvc) + op (0x0f, bvs) + op16 (0x10, to_r) + op16 (0x20, with_r) + + op (0x3c, loop) + op (0x3d, alt1) + op (0x3e, alt2) + op (0x3f, alt3) + + op (0x4d, swap) + + op (0x4f, not) + + op (0x70, merge) + + op (0x90, sbk) + op4 (0x91, link) + + op (0x95, sex) + + op (0x97, ror) + + op (0x9e, lob) + + op16 (0xb0, from_r) + + op (0xc0, hib) + + op15l(0xd0, inc_r) + + op15l(0xe0, dec_r) + #undef op + + //=============== + // ALT0 and ALT2 + //=============== + #define op(id, name) case 0 + id: case 512 + id: SuperFX::op_##name(); break; + op12 (0x30, stw_ir) + op12 (0x40, ldw_ir) + op (0x4c, plot) + op (0x4e, color) + + op (0x96, asr) + op6 (0x98, jmp_r) + op (0x9f, fmult) + #undef op + + //=============== + // ALT1 and ALT3 + //=============== + #define op(id, name) case 256 + id: case 768 + id: SuperFX::op_##name(); break; + op12 (0x30, stb_ir) + op12 (0x40, ldb_ir) + op (0x4c, rpix) + op (0x4e, cmode) + + op (0x96, div2) + op6 (0x98, ljmp_r) + op (0x9f, lmult) + #undef op + + //====== + // ALT0 + //====== + + #define op(id, name) case 0 + id: SuperFX::op_##name(); break; + op16 (0x50, add_r) + op16 (0x60, sub_r) + op15h(0x71, and_r) + op16 (0x80, mult_r) + op16 (0xa0, ibt_r) + op15h(0xc1, or_r) + op (0xdf, getc) + op (0xef, getb) + op16 (0xf0, iwt_r) + #undef op + + //====== + // ALT1 + //====== + + #define op(id, name) case 256 + id: SuperFX::op_##name(); break; + op16 (0x50, adc_r) + op16 (0x60, sbc_r) + op15h(0x71, bic_r) + op16 (0x80, umult_r) + op16 (0xa0, lms_r) + op15h(0xc1, xor_r) + op (0xdf, getc) + op (0xef, getbh) + op16 (0xf0, lm_r) + #undef op + + //====== + // ALT2 + //====== + + #define op(id, name) case 512 + id: SuperFX::op_##name(); break; + op16 (0x50, add_i) + op16 (0x60, sub_i) + op15h(0x71, and_i) + op16 (0x80, mult_i) + op16 (0xa0, sms_r) + op15h(0xc1, or_i) + op (0xdf, ramb) + op (0xef, getbl) + op16 (0xf0, sm_r) + #undef op + + //====== + // ALT3 + //====== + + #define op(id, name) case 768 + id: SuperFX::op_##name(); break; + op16 (0x50, adc_i) + op16 (0x60, cmp_r) + op15h(0x71, bic_i) + op16 (0x80, umult_i) + op16 (0xa0, lms_r) + op15h(0xc1, xor_i) + op (0xdf, romb) + op (0xef, getbs) + op16 (0xf0, lm_r) + #undef op + } + + #undef op4 + #undef op6 + #undef op12 + #undef op15l + #undef op15h + #undef op16 +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/core/opcodes.cpp b/Mednafen/mednafen/snes/src/chip/superfx/core/opcodes.cpp new file mode 100755 index 0000000000..615adededf --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/core/opcodes.cpp @@ -0,0 +1,664 @@ +#ifdef SUPERFX_CPP + +//$00 stop +alwaysinline void SuperFX::op_stop() { + if(regs.cfgr.irq == 0) { + regs.sfr.irq = 1; + cpu.regs.irq = 1; + } + + regs.sfr.g = 0; + regs.pipeline = 0x01; + regs.reset(); +} + +//$01 nop +alwaysinline void SuperFX::op_nop() { + regs.reset(); +} + +//$02 cache +alwaysinline void SuperFX::op_cache() { + if(regs.cbr != (regs.r[15] & 0xfff0)) { + regs.cbr = regs.r[15] & 0xfff0; + cache_flush(); + } + regs.reset(); +} + +//$03 lsr +alwaysinline void SuperFX::op_lsr() { + regs.sfr.cy = (regs.sr() & 1); + regs.dr() = regs.sr() >> 1; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$04 rol +alwaysinline void SuperFX::op_rol() { + bool carry = (regs.sr() & 0x8000); + regs.dr() = (regs.sr() << 1) | regs.sfr.cy; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.cy = carry; + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$05 bra e +alwaysinline void SuperFX::op_bra() { + regs.r[15] += (int8)pipe(); +} + +//$06 blt e +alwaysinline void SuperFX::op_blt() { + int e = (int8)pipe(); + if((regs.sfr.s ^ regs.sfr.ov) == 0) regs.r[15] += e; +} + +//$07 bge e +alwaysinline void SuperFX::op_bge() { + int e = (int8)pipe(); + if((regs.sfr.s ^ regs.sfr.ov) == 1) regs.r[15] += e; +} + +//$08 bne e +alwaysinline void SuperFX::op_bne() { + int e = (int8)pipe(); + if(regs.sfr.z == 0) regs.r[15] += e; +} + +//$09 beq e +alwaysinline void SuperFX::op_beq() { + int e = (int8)pipe(); + if(regs.sfr.z == 1) regs.r[15] += e; +} + +//$0a bpl e +alwaysinline void SuperFX::op_bpl() { + int e = (int8)pipe(); + if(regs.sfr.s == 0) regs.r[15] += e; +} + +//$0b bmi e +alwaysinline void SuperFX::op_bmi() { + int e = (int8)pipe(); + if(regs.sfr.s == 1) regs.r[15] += e; +} + +//$0c bcc e +alwaysinline void SuperFX::op_bcc() { + int e = (int8)pipe(); + if(regs.sfr.cy == 0) regs.r[15] += e; +} + +//$0d bcs e +alwaysinline void SuperFX::op_bcs() { + int e = (int8)pipe(); + if(regs.sfr.cy == 1) regs.r[15] += e; +} + +//$0e bvc e +alwaysinline void SuperFX::op_bvc() { + int e = (int8)pipe(); + if(regs.sfr.ov == 0) regs.r[15] += e; +} + +//$0f bvs e +alwaysinline void SuperFX::op_bvs() { + int e = (int8)pipe(); + if(regs.sfr.ov == 1) regs.r[15] += e; +} + +//$10-1f(b0): to rN +//$10-1f(b1): move rN +template alwaysinline void SuperFX::op_to_r() { + if(regs.sfr.b == 0) { + regs.dreg = n; + } else { + regs.r[n] = regs.sr(); + regs.reset(); + } +} + +//$20-2f: with rN +template alwaysinline void SuperFX::op_with_r() { + regs.sreg = n; + regs.dreg = n; + regs.sfr.b = 1; +} + +//$30-3b(alt0): stw (rN) +template alwaysinline void SuperFX::op_stw_ir() { + regs.ramaddr = regs.r[n]; + rambuffer_write(regs.ramaddr ^ 0, regs.sr() >> 0); + rambuffer_write(regs.ramaddr ^ 1, regs.sr() >> 8); + regs.reset(); +} + +//$30-3b(alt1): stb (rN) +template alwaysinline void SuperFX::op_stb_ir() { + regs.ramaddr = regs.r[n]; + rambuffer_write(regs.ramaddr, regs.sr()); + regs.reset(); +} + +//$3c loop +alwaysinline void SuperFX::op_loop() { + regs.r[12].data--; + regs.sfr.s = (regs.r[12] & 0x8000); + regs.sfr.z = (regs.r[12] == 0); + if(!regs.sfr.z) regs.r[15] = regs.r[13]; + regs.reset(); +} + +//$3d alt1 +alwaysinline void SuperFX::op_alt1() { + regs.sfr.b = 0; + //regs.sfr.alt1 = 1; + regs.sfr.alt |= 1U << 8; +} + +//$3e alt2 +alwaysinline void SuperFX::op_alt2() { + regs.sfr.b = 0; + //regs.sfr.alt2 = 1; + regs.sfr.alt |= 1U << 9; +} + +//$3f alt3 +alwaysinline void SuperFX::op_alt3() { + regs.sfr.b = 0; + regs.sfr.alt |= 0x300; + //regs.sfr.alt1 = 1; + //regs.sfr.alt2 = 1; +} + +//$40-4b(alt0): ldw (rN) +template alwaysinline void SuperFX::op_ldw_ir() { + regs.ramaddr = regs.r[n]; + uint16_t data; + data = rambuffer_read(regs.ramaddr ^ 0) << 0; + data |= rambuffer_read(regs.ramaddr ^ 1) << 8; + regs.dr() = data; + regs.reset(); +} + +//$40-4b(alt1): ldb (rN) +template alwaysinline void SuperFX::op_ldb_ir() { + regs.ramaddr = regs.r[n]; + regs.dr() = rambuffer_read(regs.ramaddr); + regs.reset(); +} + +//$4c(alt0): plot +alwaysinline void SuperFX::op_plot() { + plot(regs.r[1], regs.r[2]); + regs.r[1]++; + regs.reset(); +} + +//$4c(alt1): rpix +alwaysinline void SuperFX::op_rpix() { + regs.dr() = rpix(regs.r[1], regs.r[2]); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$4d: swap +alwaysinline void SuperFX::op_swap() { + regs.dr() = (regs.sr() >> 8) | (regs.sr() << 8); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$4e(alt0): color +alwaysinline void SuperFX::op_color() { + regs.colr = color(regs.sr()); + regs.reset(); +} + +//$4e(alt1): cmode +alwaysinline void SuperFX::op_cmode() { + regs.por = regs.sr(); + regs.reset(); +} + +//$4f: not +alwaysinline void SuperFX::op_not() { + regs.dr() = ~regs.sr(); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$50-5f(alt0): add rN +template alwaysinline void SuperFX::op_add_r() { + int r = regs.sr() + regs.r[n]; + regs.sfr.ov = ~(regs.sr() ^ regs.r[n]) & (regs.r[n] ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0x10000); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$50-5f(alt1): adc rN +template alwaysinline void SuperFX::op_adc_r() { + int r = regs.sr() + regs.r[n] + regs.sfr.cy; + regs.sfr.ov = ~(regs.sr() ^ regs.r[n]) & (regs.r[n] ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0x10000); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$50-5f(alt2): add #N +template alwaysinline void SuperFX::op_add_i() { + int r = regs.sr() + n; + regs.sfr.ov = ~(regs.sr() ^ n) & (n ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0x10000); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$50-5f(alt3): adc #N +template alwaysinline void SuperFX::op_adc_i() { + int r = regs.sr() + n + regs.sfr.cy; + regs.sfr.ov = ~(regs.sr() ^ n) & (n ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0x10000); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$60-6f(alt0): sub rN +template alwaysinline void SuperFX::op_sub_r() { + int r = regs.sr() - regs.r[n]; + regs.sfr.ov = (regs.sr() ^ regs.r[n]) & (regs.sr() ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$60-6f(alt1): sbc rN +template alwaysinline void SuperFX::op_sbc_r() { + int r = regs.sr() - regs.r[n] - !regs.sfr.cy; + regs.sfr.ov = (regs.sr() ^ regs.r[n]) & (regs.sr() ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$60-6f(alt2): sub #N +template alwaysinline void SuperFX::op_sub_i() { + int r = regs.sr() - n; + regs.sfr.ov = (regs.sr() ^ n) & (regs.sr() ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0); + regs.sfr.z = ((uint16_t)r == 0); + regs.dr() = r; + regs.reset(); +} + +//$60-6f(alt3): cmp rN +template alwaysinline void SuperFX::op_cmp_r() { + int r = regs.sr() - regs.r[n]; + regs.sfr.ov = (regs.sr() ^ regs.r[n]) & (regs.sr() ^ r) & 0x8000; + regs.sfr.s = (r & 0x8000); + regs.sfr.cy = (r >= 0); + regs.sfr.z = ((uint16_t)r == 0); + regs.reset(); +} + +//$70: merge +alwaysinline void SuperFX::op_merge() { + regs.dr() = (regs.r[7] & 0xff00) | (regs.r[8] >> 8); + regs.sfr.ov = (regs.dr() & 0xc0c0); + regs.sfr.s = (regs.dr() & 0x8080); + regs.sfr.cy = (regs.dr() & 0xe0e0); + regs.sfr.z = (regs.dr() & 0xf0f0); + regs.reset(); +} + +//$71-7f(alt0): and rN +template alwaysinline void SuperFX::op_and_r() { + regs.dr() = regs.sr() & regs.r[n]; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$71-7f(alt1): bic rN +template alwaysinline void SuperFX::op_bic_r() { + regs.dr() = regs.sr() & ~regs.r[n]; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$71-7f(alt2): and #N +template alwaysinline void SuperFX::op_and_i() { + regs.dr() = regs.sr() & n; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$71-7f(alt3): bic #N +template alwaysinline void SuperFX::op_bic_i() { + regs.dr() = regs.sr() & ~n; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$80-8f(alt0): mult rN +template alwaysinline void SuperFX::op_mult_r() { + regs.dr() = (int8)regs.sr() * (int8)regs.r[n]; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + if(!regs.cfgr.ms0) add_clocks(2); +} + +//$80-8f(alt1): umult rN +template alwaysinline void SuperFX::op_umult_r() { + regs.dr() = (uint8)regs.sr() * (uint8)regs.r[n]; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + if(!regs.cfgr.ms0) add_clocks(2); +} + +//$80-8f(alt2): mult #N +template alwaysinline void SuperFX::op_mult_i() { + regs.dr() = (int8)regs.sr() * (int8)n; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + if(!regs.cfgr.ms0) add_clocks(2); +} + +//$80-8f(alt3): umult #N +template alwaysinline void SuperFX::op_umult_i() { + regs.dr() = (uint8)regs.sr() * (uint8)n; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + if(!regs.cfgr.ms0) add_clocks(2); +} + +//$90: sbk +alwaysinline void SuperFX::op_sbk() { + rambuffer_write(regs.ramaddr ^ 0, regs.sr() >> 0); + rambuffer_write(regs.ramaddr ^ 1, regs.sr() >> 8); + regs.reset(); +} + +//$91-94: link #N +template alwaysinline void SuperFX::op_link() { + regs.r[11].data = regs.r[15] + n; + regs.reset(); +} + +//$95: sex +alwaysinline void SuperFX::op_sex() { + regs.dr() = (int8)regs.sr(); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$96(alt0): asr +alwaysinline void SuperFX::op_asr() { + regs.sfr.cy = (regs.sr() & 1); + regs.dr() = (int16_t)regs.sr() >> 1; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$96(alt1): div2 +alwaysinline void SuperFX::op_div2() { + regs.sfr.cy = (regs.sr() & 1); + regs.dr() = ((int16_t)regs.sr() >> 1) + ((regs.sr() + 1) >> 16); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$97: ror +alwaysinline void SuperFX::op_ror() { + bool carry = (regs.sr() & 1); + regs.dr() = (regs.sfr.cy << 15) | (regs.sr() >> 1); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.cy = carry; + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$98-9d(alt0): jmp rN +template alwaysinline void SuperFX::op_jmp_r() { + regs.r[15] = regs.r[n]; + regs.reset(); +} + +//$98-9d(alt1): ljmp rN +template alwaysinline void SuperFX::op_ljmp_r() { + regs.pbr = regs.r[n] & 0x7f; + regs.r[15] = regs.sr(); + regs.cbr = regs.r[15] & 0xfff0; + cache_flush(); + regs.reset(); +} + +//$9e: lob +alwaysinline void SuperFX::op_lob() { + regs.dr() = regs.sr() & 0xff; + regs.sfr.s = (regs.dr() & 0x80); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$9f(alt0): fmult +alwaysinline void SuperFX::op_fmult() { + uint32_t result = (int16_t)regs.sr() * (int16_t)regs.r[6]; + regs.dr() = result >> 16; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.cy = (result & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + add_clocks(4 + (regs.cfgr.ms0 << 2)); +} + +//$9f(alt1): lmult +alwaysinline void SuperFX::op_lmult() { + uint32_t result = (int16_t)regs.sr() * (int16_t)regs.r[6]; + regs.r[4].data = result; + regs.dr() = result >> 16; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.cy = (result & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + add_clocks(4 + (regs.cfgr.ms0 << 2)); +} + +//$a0-af(alt0): ibt rN,#pp +template alwaysinline void SuperFX::op_ibt_r() { + regs.r[n] = (int8)pipe(); + regs.reset(); +} + +//$a0-af(alt1): lms rN,(yy) +template alwaysinline void SuperFX::op_lms_r() { + regs.ramaddr = pipe() << 1; + uint16_t data; + data = rambuffer_read(regs.ramaddr ^ 0) << 0; + data |= rambuffer_read(regs.ramaddr ^ 1) << 8; + regs.r[n] = data; + regs.reset(); +} + +//$a0-af(alt2): sms (yy),rN +template alwaysinline void SuperFX::op_sms_r() { + regs.ramaddr = pipe() << 1; + rambuffer_write(regs.ramaddr ^ 0, regs.r[n] >> 0); + rambuffer_write(regs.ramaddr ^ 1, regs.r[n] >> 8); + regs.reset(); +} + +//$b0-bf(b0): from rN +//$b0-bf(b1): moves rN +template alwaysinline void SuperFX::op_from_r() { + if(regs.sfr.b == 0) { + regs.sreg = n; + } else { + regs.dr() = regs.r[n]; + regs.sfr.ov = (regs.dr() & 0x80); + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); + } +} + +//$c0: hib +alwaysinline void SuperFX::op_hib() { + regs.dr() = regs.sr() >> 8; + regs.sfr.s = (regs.dr() & 0x80); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$c1-cf(alt0): or rN +template alwaysinline void SuperFX::op_or_r() { + regs.dr() = regs.sr() | regs.r[n]; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$c1-cf(alt1): xor rN +template alwaysinline void SuperFX::op_xor_r() { + regs.dr() = regs.sr() ^ regs.r[n]; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$c1-cf(alt2): or #N +template alwaysinline void SuperFX::op_or_i() { + regs.dr() = regs.sr() | n; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$c1-cf(alt3): xor #N +template alwaysinline void SuperFX::op_xor_i() { + regs.dr() = regs.sr() ^ n; + regs.sfr.s = (regs.dr() & 0x8000); + regs.sfr.z = (regs.dr() == 0); + regs.reset(); +} + +//$d0-de: inc rN +template alwaysinline void SuperFX::op_inc_r() { + regs.r[n]++; + regs.sfr.s = (regs.r[n] & 0x8000); + regs.sfr.z = (regs.r[n] == 0); + regs.reset(); +} + +//$df(alt0): getc +alwaysinline void SuperFX::op_getc() { + regs.colr = color(rombuffer_read()); + regs.reset(); +} + +//$df(alt2): ramb +alwaysinline void SuperFX::op_ramb() { + rambuffer_sync(); + regs.rambr = regs.sr(); + regs.reset(); +} + +//$df(alt3): romb +alwaysinline void SuperFX::op_romb() { + rombuffer_sync(); + regs.rombr = regs.sr() & 0x7f; + regs.reset(); +} + +//$e0-ee: dec rN +template alwaysinline void SuperFX::op_dec_r() { + regs.r[n]--; + regs.sfr.s = (regs.r[n] & 0x8000); + regs.sfr.z = (regs.r[n] == 0); + regs.reset(); +} + +//$ef(alt0): getb +alwaysinline void SuperFX::op_getb() { + regs.dr() = rombuffer_read(); + regs.reset(); +} + +//$ef(alt1): getbh +alwaysinline void SuperFX::op_getbh() { + regs.dr() = (rombuffer_read() << 8) | (regs.sr() & 0x00ff); + regs.reset(); +} + +//$ef(alt2): getbl +alwaysinline void SuperFX::op_getbl() { + regs.dr() = (regs.sr() & 0xff00) | (rombuffer_read() << 0); + regs.reset(); +} + +//$ef(alt3): getbs +alwaysinline void SuperFX::op_getbs() { + regs.dr() = (int8)rombuffer_read(); + regs.reset(); +} + +//$f0-ff(alt0): iwt rN,#xx +template alwaysinline void SuperFX::op_iwt_r() { + uint16_t data; + data = pipe() << 0; + data |= pipe() << 8; + regs.r[n] = data; + regs.reset(); +} + +//$f0-ff(alt1): lm rN,(xx) +template alwaysinline void SuperFX::op_lm_r() { + regs.ramaddr = pipe() << 0; + regs.ramaddr |= pipe() << 8; + uint16_t data; + data = rambuffer_read(regs.ramaddr ^ 0) << 0; + data |= rambuffer_read(regs.ramaddr ^ 1) << 8; + regs.r[n] = data; + regs.reset(); +} + +//$f0-ff(alt2): sm (xx),rN +template alwaysinline void SuperFX::op_sm_r() { + regs.ramaddr = pipe() << 0; + regs.ramaddr |= pipe() << 8; + rambuffer_write(regs.ramaddr ^ 0, regs.r[n] >> 0); + rambuffer_write(regs.ramaddr ^ 1, regs.r[n] >> 8); + regs.reset(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/core/registers.hpp b/Mednafen/mednafen/snes/src/chip/superfx/core/registers.hpp new file mode 100755 index 0000000000..93c3ba9d0a --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/core/registers.hpp @@ -0,0 +1,181 @@ +//accepts a callback binding so r14 writes can trigger ROM buffering transparently +struct reg16_t : noncopyable { + uint16 data; // Don't change to a larger type, especially since we now write 'data' directly in a few places for performance reasons. + void (*on_modify)(uint16); // Only should be used for r14 and r15 + + inline operator unsigned() const { return data; } + inline uint16 assign(uint16 i) { + data = i; + + if(on_modify) + on_modify(i); + + return data; + } + + inline unsigned operator++() { return assign(data + 1); } + inline unsigned operator--() { return assign(data - 1); } + inline unsigned operator++(int) { unsigned r = data; assign(data + 1); return r; } + inline unsigned operator--(int) { unsigned r = data; assign(data - 1); return r; } + inline unsigned operator = (unsigned i) { return assign(i); } + inline unsigned operator |= (unsigned i) { return assign(data | i); } + inline unsigned operator ^= (unsigned i) { return assign(data ^ i); } + inline unsigned operator &= (unsigned i) { return assign(data & i); } + inline unsigned operator <<= (unsigned i) { return assign(data << i); } + inline unsigned operator >>= (unsigned i) { return assign(data >> i); } + inline unsigned operator += (unsigned i) { return assign(data + i); } + inline unsigned operator -= (unsigned i) { return assign(data - i); } + inline unsigned operator *= (unsigned i) { return assign(data * i); } + inline unsigned operator /= (unsigned i) { return assign(data / i); } + inline unsigned operator %= (unsigned i) { return assign(data % i); } + + inline unsigned operator = (const reg16_t& i) { return assign(i); } + + reg16_t() : data(0), on_modify(NULL) {} +}; + +struct sfr_t { + bool irq; //interrupt flag + bool b; //WITH flag + bool ih; //immediate higher 8-bit flag + bool il; //immediate lower 8-bit flag + uint32 alt; //:10; + //bool alt2; //ALT2 mode + //bool alt1; //ALT2 instruction mode + bool r; //ROM r14 read flag + bool g; //GO flag + bool ov; //overflow flag + bool s; //sign flag + bool cy; //carry flag + bool z; //zero flag + + operator unsigned() const { + return (irq << 15) | (b << 12) | (ih << 11) | (il << 10) | alt /*(alt2 << 9) | (alt1 << 8)*/ + | (r << 6) | (g << 5) | (ov << 4) | (s << 3) | (cy << 2) | (z << 1); + } + + sfr_t& operator=(uint16_t data) { + irq = data & 0x8000; + b = data & 0x1000; + ih = data & 0x0800; + il = data & 0x0400; + alt = data & 0x0300; + //alt2 = data & 0x0200; + //alt1 = data & 0x0100; + r = data & 0x0040; + g = data & 0x0020; + ov = data & 0x0010; + s = data & 0x0008; + cy = data & 0x0004; + z = data & 0x0002; + return *this; + } +}; + +struct scmr_t { + unsigned ht; + bool ron; + bool ran; + unsigned md; + + operator unsigned() const { + return ((ht >> 1) << 5) | (ron << 4) | (ran << 3) | ((ht & 1) << 2) | (md); + } + + scmr_t& operator=(uint8 data) { + ht = (bool)(data & 0x20) << 1; + ht |= (bool)(data & 0x04) << 0; + ron = data & 0x10; + ran = data & 0x08; + md = data & 0x03; + return *this; + } +}; + +struct por_t { + bool obj; + bool freezehigh; + bool highnibble; + bool dither; + bool transparent; + + operator unsigned() const { + return (obj << 4) | (freezehigh << 3) | (highnibble << 2) | (dither << 1) | (transparent); + } + + por_t& operator=(uint8 data) { + obj = data & 0x10; + freezehigh = data & 0x08; + highnibble = data & 0x04; + dither = data & 0x02; + transparent = data & 0x01; + return *this; + } +}; + +struct cfgr_t { + bool irq; + bool ms0; + + operator unsigned() const { + return (irq << 7) | (ms0 << 5); + } + + cfgr_t& operator=(uint8 data) { + irq = data & 0x80; + ms0 = data & 0x20; + return *this; + } +}; + +struct regs_t { + uint8 pipeline; + uint16 ramaddr; + + reg16_t r[16]; //general purpose registers + sfr_t sfr; //status flag register + uint8 pbr; //program bank register + uint8 rombr; //game pack ROM bank register + bool rambr; //game pack RAM bank register + uint16 cbr; //cache base register + uint8 scbr; //screen base register + scmr_t scmr; //screen mode register + uint8 colr; //color register + por_t por; //plot option register + bool bramr; //back-up RAM register + uint8 vcr; //version code register + cfgr_t cfgr; //config register + bool clsr; //clock select register + + unsigned romcl; //clock ticks until romdr is valid + uint8 romdr; //ROM buffer data register + + unsigned ramcl; //clock ticks until ramdr is valid + uint16 ramar; //RAM buffer address register + uint8 ramdr; //RAM buffer data register + + unsigned sreg, dreg; + reg16_t& sr() { return r[sreg]; } //source register (from) + reg16_t& dr() { return r[dreg]; } //destination register (to) + + void reset() { + sfr.b = 0; + sfr.alt = 0; + //sfr.alt1 = 0; + //sfr.alt2 = 0; + + sreg = 0; + dreg = 0; + } +} regs; + +struct cache_t { + uint8 buffer[512]; + bool valid[32]; +} cache; + +struct pixelcache_t { + uint16 offset; + uint8 bitpend; + uint8 data[8]; +} pixelcache[2]; diff --git a/Mednafen/mednafen/snes/src/chip/superfx/disasm/disasm.cpp b/Mednafen/mednafen/snes/src/chip/superfx/disasm/disasm.cpp new file mode 100755 index 0000000000..dd029ddaa5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/disasm/disasm.cpp @@ -0,0 +1,282 @@ +#ifdef SUPERFX_CPP + +void SuperFX::disassemble_opcode(char *output) { + *output = 0; + + //if(!regs.sfr.alt2) { + if(!(regs.sfr.alt & 0x200)) { + //if(!regs.sfr.alt1) { + if(!(regs.sfr.alt & 0x100)) { + disassemble_alt0(output); + } else { + disassemble_alt1(output); + } + } else { + //if(!regs.sfr.alt1) { + if(!(regs.sfr.alt & 0x100)) { + disassemble_alt2(output); + } else { + disassemble_alt3(output); + } + } + + unsigned length = strlen(output); + while(length++ < 20) strcat(output, " "); +} + +#define case4(id) \ + case id+ 0: case id+ 1: case id+ 2: case id+ 3 +#define case6(id) \ + case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5 +#define case12(id) \ + case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5: case id+ 6: case id+ 7: \ + case id+ 8: case id+ 9: case id+10: case id+11 +#define case15(id) \ + case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5: case id+ 6: case id+ 7: \ + case id+ 8: case id+ 9: case id+10: case id+11: case id+12: case id+13: case id+14 +#define case16(id) \ + case id+ 0: case id+ 1: case id+ 2: case id+ 3: case id+ 4: case id+ 5: case id+ 6: case id+ 7: \ + case id+ 8: case id+ 9: case id+10: case id+11: case id+12: case id+13: case id+14: case id+15 + +#define op0 regs.pipeline +#define op1 superfxbus.read((regs.pbr << 16) + regs.r[15] + 0) +#define op2 superfxbus.read((regs.pbr << 16) + regs.r[15] + 1) + +void SuperFX::disassemble_alt0(char *output) { + char t[256] = ""; + switch(op0) { + case (0x00): sprintf(t, "stop"); break; + case (0x01): sprintf(t, "nop"); break; + case (0x02): sprintf(t, "cache"); break; + case (0x03): sprintf(t, "lsr"); break; + case (0x04): sprintf(t, "rol"); break; + case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break; + case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break; + case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break; + case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break; + case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break; + case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break; + case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break; + case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break; + case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break; + case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break; + case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break; + case16(0x10): sprintf(t, "to r%u", op0 & 15); break; + case16(0x20): sprintf(t, "with r%u", op0 & 15); break; + case12(0x30): sprintf(t, "stw (r%u)", op0 & 15); break; + case (0x3c): sprintf(t, "loop"); break; + case (0x3d): sprintf(t, "alt1"); break; + case (0x3e): sprintf(t, "alt2"); break; + case (0x3f): sprintf(t, "alt3"); break; + case12(0x40): sprintf(t, "ldw (r%u)", op0 & 15); break; + case (0x4c): sprintf(t, "plot"); break; + case (0x4d): sprintf(t, "swap"); break; + case (0x4e): sprintf(t, "color"); break; + case (0x4f): sprintf(t, "not"); break; + case16(0x50): sprintf(t, "add r%u", op0 & 15); break; + case16(0x60): sprintf(t, "sub r%u", op0 & 15); break; + case (0x70): sprintf(t, "merge"); break; + case15(0x71): sprintf(t, "and r%u", op0 & 15); break; + case16(0x80): sprintf(t, "mult r%u", op0 & 15); break; + case (0x90): sprintf(t, "sbk"); break; + case4 (0x91): sprintf(t, "link #%u", op0 & 15); break; + case (0x95): sprintf(t, "sex"); break; + case (0x96): sprintf(t, "asr"); break; + case (0x97): sprintf(t, "ror"); break; + case6 (0x98): sprintf(t, "jmp r%u", op0 & 15); break; + case (0x9e): sprintf(t, "lob"); break; + case (0x9f): sprintf(t, "fmult"); break; + case16(0xa0): sprintf(t, "ibt r%u,#$%.2x", op0 & 15, op1); break; + case16(0xb0): sprintf(t, "from r%u", op0 & 15); break; + case (0xc0): sprintf(t, "hib"); + case15(0xc1): sprintf(t, "or r%u", op0 & 15); break; + case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break; + case (0xdf): sprintf(t, "getc"); break; + case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break; + case (0xef): sprintf(t, "getb"); break; + case16(0xf0): sprintf(t, "iwt r%u,#$%.2x%.2x", op0 & 15, op2, op1); break; + } + strcat(output, t); +} + +void SuperFX::disassemble_alt1(char *output) { + char t[256] = ""; + switch(op0) { + case (0x00): sprintf(t, "stop"); break; + case (0x01): sprintf(t, "nop"); break; + case (0x02): sprintf(t, "cache"); break; + case (0x03): sprintf(t, "lsr"); break; + case (0x04): sprintf(t, "rol"); break; + case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break; + case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break; + case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break; + case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break; + case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break; + case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break; + case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break; + case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break; + case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break; + case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break; + case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break; + case16(0x10): sprintf(t, "to r%u", op0 & 15); break; + case16(0x20): sprintf(t, "with r%u", op0 & 15); break; + case12(0x30): sprintf(t, "stb (r%u)", op0 & 15); break; + case (0x3c): sprintf(t, "loop"); break; + case (0x3d): sprintf(t, "alt1"); break; + case (0x3e): sprintf(t, "alt2"); break; + case (0x3f): sprintf(t, "alt3"); break; + case12(0x40): sprintf(t, "ldb (r%u)", op0 & 15); break; + case (0x4c): sprintf(t, "rpix"); break; + case (0x4d): sprintf(t, "swap"); break; + case (0x4e): sprintf(t, "cmode"); break; + case (0x4f): sprintf(t, "not"); break; + case16(0x50): sprintf(t, "adc r%u", op0 & 15); break; + case16(0x60): sprintf(t, "sbc r%u", op0 & 15); break; + case (0x70): sprintf(t, "merge"); break; + case15(0x71): sprintf(t, "bic r%u", op0 & 15); break; + case16(0x80): sprintf(t, "umult r%u", op0 & 15); break; + case (0x90): sprintf(t, "sbk"); break; + case4 (0x91): sprintf(t, "link #%u", op0 & 15); break; + case (0x95): sprintf(t, "sex"); break; + case (0x96): sprintf(t, "div2"); break; + case (0x97): sprintf(t, "ror"); break; + case6 (0x98): sprintf(t, "ljmp r%u", op0 & 15); break; + case (0x9e): sprintf(t, "lob"); break; + case (0x9f): sprintf(t, "lmult"); break; + case16(0xa0): sprintf(t, "lms r%u,(#$%.4x)", op0 & 15, op1 << 1); break; + case16(0xb0): sprintf(t, "from r%u", op0 & 15); break; + case (0xc0): sprintf(t, "hib"); break; + case15(0xc1): sprintf(t, "xor r%u", op0 & 15); break; + case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break; + case (0xdf): sprintf(t, "getc"); break; + case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break; + case (0xef): sprintf(t, "getbh"); break; + case16(0xf0): sprintf(t, "lm r%u", op0 & 15); break; + } + strcat(output, t); +} + +void SuperFX::disassemble_alt2(char *output) { + char t[256] = ""; + switch(op0) { + case (0x00): sprintf(t, "stop"); break; + case (0x01): sprintf(t, "nop"); break; + case (0x02): sprintf(t, "cache"); break; + case (0x03): sprintf(t, "lsr"); break; + case (0x04): sprintf(t, "rol"); break; + case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break; + case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break; + case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break; + case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break; + case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break; + case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break; + case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break; + case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break; + case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break; + case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break; + case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break; + case16(0x10): sprintf(t, "to r%u", op0 & 15); break; + case16(0x20): sprintf(t, "with r%u", op0 & 15); break; + case12(0x30): sprintf(t, "stw (r%u)", op0 & 15); break; + case (0x3c): sprintf(t, "loop"); break; + case (0x3d): sprintf(t, "alt1"); break; + case (0x3e): sprintf(t, "alt2"); break; + case (0x3f): sprintf(t, "alt3"); break; + case12(0x40): sprintf(t, "ldw (r%u)", op0 & 15); break; + case (0x4c): sprintf(t, "plot"); break; + case (0x4d): sprintf(t, "swap"); break; + case (0x4e): sprintf(t, "color"); break; + case (0x4f): sprintf(t, "not"); break; + case16(0x50): sprintf(t, "add #%u", op0 & 15); break; + case16(0x60): sprintf(t, "sub #%u", op0 & 15); break; + case (0x70): sprintf(t, "merge"); break; + case15(0x71): sprintf(t, "and #%u", op0 & 15); break; + case16(0x80): sprintf(t, "mult #%u", op0 & 15); break; + case (0x90): sprintf(t, "sbk"); break; + case4 (0x91): sprintf(t, "link #%u", op0 & 15); break; + case (0x95): sprintf(t, "sex"); break; + case (0x96): sprintf(t, "asr"); break; + case (0x97): sprintf(t, "ror"); break; + case6 (0x98): sprintf(t, "jmp r%u", op0 & 15); break; + case (0x9e): sprintf(t, "lob"); break; + case (0x9f): sprintf(t, "fmult"); break; + case16(0xa0): sprintf(t, "sms r%u,(#$%.4x)", op0 & 15, op1 << 1); break; + case16(0xb0): sprintf(t, "from r%u", op0 & 15); break; + case (0xc0): sprintf(t, "hib"); break; + case15(0xc1): sprintf(t, "or #%u", op0 & 15); break; + case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break; + case (0xdf): sprintf(t, "ramb"); break; + case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break; + case (0xef): sprintf(t, "getbl"); break; + case16(0xf0): sprintf(t, "sm r%u", op0 & 15); break; + } + strcat(output, t); +} + +void SuperFX::disassemble_alt3(char *output) { + char t[256] = ""; + switch(op0) { + case (0x00): sprintf(t, "stop"); break; + case (0x01): sprintf(t, "nop"); break; + case (0x02): sprintf(t, "cache"); break; + case (0x03): sprintf(t, "lsr"); break; + case (0x04): sprintf(t, "rol"); break; + case (0x05): sprintf(t, "bra %+d", (int8_t)op1); break; + case (0x06): sprintf(t, "blt %+d", (int8_t)op1); break; + case (0x07): sprintf(t, "bge %+d", (int8_t)op1); break; + case (0x08): sprintf(t, "bne %+d", (int8_t)op1); break; + case (0x09): sprintf(t, "beq %+d", (int8_t)op1); break; + case (0x0a): sprintf(t, "bpl %+d", (int8_t)op1); break; + case (0x0b): sprintf(t, "bmi %+d", (int8_t)op1); break; + case (0x0c): sprintf(t, "bcc %+d", (int8_t)op1); break; + case (0x0d): sprintf(t, "bcs %+d", (int8_t)op1); break; + case (0x0e): sprintf(t, "bvc %+d", (int8_t)op1); break; + case (0x0f): sprintf(t, "bvs %+d", (int8_t)op1); break; + case16(0x10): sprintf(t, "to r%u", op0 & 15); break; + case16(0x20): sprintf(t, "with r%u", op0 & 15); break; + case12(0x30): sprintf(t, "stb (r%u)", op0 & 15); break; + case (0x3c): sprintf(t, "loop"); break; + case (0x3d): sprintf(t, "alt1"); break; + case (0x3e): sprintf(t, "alt2"); break; + case (0x3f): sprintf(t, "alt3"); break; + case12(0x40): sprintf(t, "ldb (r%u)", op0 & 15); break; + case (0x4c): sprintf(t, "rpix"); break; + case (0x4d): sprintf(t, "swap"); break; + case (0x4e): sprintf(t, "cmode"); break; + case (0x4f): sprintf(t, "not"); break; + case16(0x50): sprintf(t, "adc #%u", op0 & 15); break; + case16(0x60): sprintf(t, "cmp r%u", op0 & 15); break; + case (0x70): sprintf(t, "merge"); break; + case15(0x71): sprintf(t, "bic #%u", op0 & 15); break; + case16(0x80): sprintf(t, "umult #%u", op0 & 15); break; + case (0x90): sprintf(t, "sbk"); break; + case4 (0x91): sprintf(t, "link #%u", op0 & 15); break; + case (0x95): sprintf(t, "sex"); break; + case (0x96): sprintf(t, "div2"); break; + case (0x97): sprintf(t, "ror"); break; + case6 (0x98): sprintf(t, "ljmp r%u", op0 & 15); break; + case (0x9e): sprintf(t, "lob"); break; + case (0x9f): sprintf(t, "lmult"); break; + case16(0xa0): sprintf(t, "lms r%u", op0 & 15); break; + case16(0xb0): sprintf(t, "from r%u", op0 & 15); break; + case (0xc0): sprintf(t, "hib"); break; + case15(0xc1): sprintf(t, "xor #%u", op0 & 15); break; + case15(0xd0): sprintf(t, "inc r%u", op0 & 15); break; + case (0xdf): sprintf(t, "romb"); break; + case15(0xe0): sprintf(t, "dec r%u", op0 & 15); break; + case (0xef): sprintf(t, "getbs"); break; + case16(0xf0): sprintf(t, "lm r%u", op0 & 15); break; + } + strcat(output, t); +} + +#undef case4 +#undef case6 +#undef case12 +#undef case15 +#undef case16 +#undef op0 +#undef op1 +#undef op2 + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/disasm/disasm.hpp b/Mednafen/mednafen/snes/src/chip/superfx/disasm/disasm.hpp new file mode 100755 index 0000000000..903615eb78 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/disasm/disasm.hpp @@ -0,0 +1,5 @@ +void disassemble_opcode(char *output); +void disassemble_alt0(char *output); +void disassemble_alt1(char *output); +void disassemble_alt2(char *output); +void disassemble_alt3(char *output); diff --git a/Mednafen/mednafen/snes/src/chip/superfx/memory/memory.cpp b/Mednafen/mednafen/snes/src/chip/superfx/memory/memory.cpp new file mode 100755 index 0000000000..8fb90aa010 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/memory/memory.cpp @@ -0,0 +1,71 @@ +#ifdef SUPERFX_CPP + +uint8 SuperFX::op_read(uint16 addr) { + uint16 offset = addr - regs.cbr; + if(offset < 512) { + if(cache.valid[offset >> 4] == false) { + unsigned dp = offset & 0xfff0; + unsigned sp = (regs.pbr << 16) + ((regs.cbr + dp) & 0xfff0); + for(unsigned n = 0; n < 16; n++) { + add_clocks(memory_access_speed); + cache.buffer[dp++] = superfxbus.read(sp++); + } + cache.valid[offset >> 4] = true; + } else { + add_clocks(cache_access_speed); + } + return cache.buffer[offset]; + } + + if(regs.pbr <= 0x5f) { + //$[00-5f]:[0000-ffff] ROM + rombuffer_sync(); + add_clocks(memory_access_speed); + return superfxbus.read((regs.pbr << 16) + addr); + } else { + //$[60-7f]:[0000-ffff] RAM + rambuffer_sync(); + add_clocks(memory_access_speed); + return superfxbus.read((regs.pbr << 16) + addr); + } +} + +uint8 SuperFX::peekpipe() { + uint8 result = regs.pipeline; + regs.pipeline = op_read(regs.r[15]); + r15_NOT_modified = !false; + return result; +} + +uint8 SuperFX::pipe() { + uint8 result = regs.pipeline; + regs.pipeline = op_read(++regs.r[15].data); + r15_NOT_modified = !false; + return result; +} + +void SuperFX::cache_flush() { + for(unsigned n = 0; n < 32; n++) cache.valid[n] = false; +} + +uint8 SuperFX::cache_mmio_read(uint16 addr) { + addr = (addr + regs.cbr) & 511; + return cache.buffer[addr]; +} + +void SuperFX::cache_mmio_write(uint16 addr, uint8 data) { + addr = (addr + regs.cbr) & 511; + cache.buffer[addr] = data; + if((addr & 15) == 15) cache.valid[addr >> 4] = true; +} + +void SuperFX::memory_reset() { + for(unsigned n = 0; n < 512; n++) cache.buffer[n] = 0x00; + for(unsigned n = 0; n < 32; n++) cache.valid[n] = false; + for(unsigned n = 0; n < 2; n++) { + pixelcache[n].offset = ~0; + pixelcache[n].bitpend = 0x00; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/memory/memory.hpp b/Mednafen/mednafen/snes/src/chip/superfx/memory/memory.hpp new file mode 100755 index 0000000000..3b11a3f9ed --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/memory/memory.hpp @@ -0,0 +1,9 @@ +uint8 op_read(uint16 addr); +alwaysinline uint8 peekpipe(); +alwaysinline uint8 pipe(); + +void cache_flush(); +uint8 cache_mmio_read(uint16 addr); +void cache_mmio_write(uint16 addr, uint8 data); + +void memory_reset(); diff --git a/Mednafen/mednafen/snes/src/chip/superfx/mmio/mmio.cpp b/Mednafen/mednafen/snes/src/chip/superfx/mmio/mmio.cpp new file mode 100755 index 0000000000..3276a40f14 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/mmio/mmio.cpp @@ -0,0 +1,118 @@ +#ifdef SUPERFX_CPP + +uint8 SuperFX::mmio_read(unsigned addr) { + scheduler.sync_cpucop(); + addr &= 0xffff; + + if(addr >= 0x3100 && addr <= 0x32ff) { + return cache_mmio_read(addr - 0x3100); + } + + if(addr >= 0x3000 && addr <= 0x301f) { + return regs.r[(addr >> 1) & 15] >> ((addr & 1) << 3); + } + + switch(addr) { + case 0x3030: { + return regs.sfr >> 0; + } + + case 0x3031: { + uint8 r = regs.sfr >> 8; + regs.sfr.irq = 0; + cpu.regs.irq = 0; + return r; + } + + case 0x3034: { + return regs.pbr; + } + + case 0x3036: { + return regs.rombr; + } + + case 0x303b: { + return regs.vcr; + } + + case 0x303c: { + return regs.rambr; + } + + case 0x303e: { + return regs.cbr >> 0; + } + + case 0x303f: { + return regs.cbr >> 8; + } + } + + return 0x00; +} + +void SuperFX::mmio_write(unsigned addr, uint8 data) { + scheduler.sync_cpucop(); + addr &= 0xffff; + + if(addr >= 0x3100 && addr <= 0x32ff) { + return cache_mmio_write(addr - 0x3100, data); + } + + if(addr >= 0x3000 && addr <= 0x301f) { + unsigned n = (addr >> 1) & 15; + if((addr & 1) == 0) { + regs.r[n] = (regs.r[n] & 0xff00) | data; + } else { + regs.r[n] = (data << 8) | (regs.r[n] & 0xff); + } + + if(addr == 0x301f) regs.sfr.g = 1; + return; + } + + switch(addr) { + case 0x3030: { + bool g = regs.sfr.g; + regs.sfr = (regs.sfr & 0xff00) | (data << 0); + if(g == 1 && regs.sfr.g == 0) { + regs.cbr = 0x0000; + cache_flush(); + } + } break; + + case 0x3031: { + regs.sfr = (data << 8) | (regs.sfr & 0x00ff); + } break; + + case 0x3033: { + regs.bramr = data; + } break; + + case 0x3034: { + regs.pbr = data & 0x7f; + cache_flush(); + } break; + + case 0x3037: { + regs.cfgr = data; + update_speed(); + } break; + + case 0x3038: { + regs.scbr = data; + } break; + + case 0x3039: { + regs.clsr = data; + update_speed(); + } break; + + case 0x303a: { + regs.scmr = data; + } break; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/mmio/mmio.hpp b/Mednafen/mednafen/snes/src/chip/superfx/mmio/mmio.hpp new file mode 100755 index 0000000000..08cc85a9e0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/mmio/mmio.hpp @@ -0,0 +1,2 @@ +uint8 mmio_read(unsigned addr); +void mmio_write(unsigned addr, uint8 data); diff --git a/Mednafen/mednafen/snes/src/chip/superfx/serialization.cpp b/Mednafen/mednafen/snes/src/chip/superfx/serialization.cpp new file mode 100755 index 0000000000..f2aa13452d --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/serialization.cpp @@ -0,0 +1,105 @@ +#ifdef SUPERFX_CPP + +void SuperFX::serialize(serializer &s) { + //superfx.hpp + s.integer(clockmode); + s.integer(instruction_counter); + + //core/registers.hpp + s.integer(regs.pipeline); + s.integer(regs.ramaddr); + + s.integer(regs.r[ 0].data); + s.integer(regs.r[ 1].data); + s.integer(regs.r[ 2].data); + s.integer(regs.r[ 3].data); + s.integer(regs.r[ 4].data); + s.integer(regs.r[ 5].data); + s.integer(regs.r[ 6].data); + s.integer(regs.r[ 7].data); + s.integer(regs.r[ 8].data); + s.integer(regs.r[ 9].data); + s.integer(regs.r[10].data); + s.integer(regs.r[11].data); + s.integer(regs.r[12].data); + s.integer(regs.r[13].data); + s.integer(regs.r[14].data); + s.integer(regs.r[15].data); + + s.integer(regs.sfr.irq); + s.integer(regs.sfr.b); + s.integer(regs.sfr.ih); + s.integer(regs.sfr.il); + + { + bool alt1 = regs.sfr.alt & 0x100; + bool alt2 = regs.sfr.alt & 0x200; + + s.integer(alt2); + s.integer(alt1); + + regs.sfr.alt = (alt1 << 8) | (alt2 << 9); + } + + s.integer(regs.sfr.r); + s.integer(regs.sfr.g); + s.integer(regs.sfr.ov); + s.integer(regs.sfr.s); + s.integer(regs.sfr.cy); + s.integer(regs.sfr.z); + + s.integer(regs.pbr); + s.integer(regs.rombr); + s.integer(regs.rambr); + s.integer(regs.cbr); + s.integer(regs.scbr); + + s.integer(regs.scmr.ht); + s.integer(regs.scmr.ron); + s.integer(regs.scmr.ran); + s.integer(regs.scmr.md); + + s.integer(regs.colr); + + s.integer(regs.por.obj); + s.integer(regs.por.freezehigh); + s.integer(regs.por.highnibble); + s.integer(regs.por.dither); + s.integer(regs.por.transparent); + + s.integer(regs.bramr); + s.integer(regs.vcr); + + s.integer(regs.cfgr.irq); + s.integer(regs.cfgr.ms0); + + s.integer(regs.clsr); + + s.integer(regs.romcl); + s.integer(regs.romdr); + + s.integer(regs.ramcl); + s.integer(regs.ramar); + s.integer(regs.ramdr); + + s.integer(regs.sreg); + s.integer(regs.dreg); + + s.array(cache.buffer); + s.array(cache.valid); + + for(unsigned i = 0; i < 2; i++) { + s.integer(pixelcache[i].offset); + s.integer(pixelcache[i].bitpend); + s.array(pixelcache[i].data); + } + + //timing/timing.hpp + s.integer(cache_access_speed); + s.integer(memory_access_speed); + r15_NOT_modified = !r15_NOT_modified; + s.integer(r15_NOT_modified); + r15_NOT_modified = !r15_NOT_modified; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/superfx.cpp b/Mednafen/mednafen/snes/src/chip/superfx/superfx.cpp new file mode 100755 index 0000000000..2757033bd7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/superfx.cpp @@ -0,0 +1,80 @@ +#include <../base.hpp> + +#define SUPERFX_CPP +namespace bSNES_v059 { + +#include "serialization.cpp" +#include "bus/bus.cpp" +#include "core/core.cpp" +#include "memory/memory.cpp" +#include "mmio/mmio.cpp" +#include "timing/timing.cpp" +#include "disasm/disasm.cpp" + +SuperFX superfx; + +void SuperFX::enter() { + while(true) { + while(scheduler.sync == Scheduler::SyncAll) { + scheduler.exit(Scheduler::SynchronizeEvent); + } + + if(regs.sfr.g == 0) { + add_clocks(6); + scheduler.sync_copcpu(); + continue; + } + + do_op((regs.sfr.alt & 1023) | peekpipe()); + regs.r[15].data += r15_NOT_modified; + + if(++instruction_counter >= 128) { + instruction_counter = 0; + scheduler.sync_copcpu(); + } + } +} + +void SuperFX::init() { + regs.r[14].on_modify = SuperFX_r14_modify; + regs.r[15].on_modify = SuperFX_r15_modify; +} + +void SuperFX::enable() { + for(unsigned i = 0x3000; i <= 0x32ff; i++) memory::mmio.map(i, *this); +} + +void SuperFX::power() { + clockmode = config.superfx.speed; + reset(); +} + +void SuperFX::reset() { + //printf("%d, %d\n", (int)sizeof(reg16_t), (int)((uint8*)®s.r[0] - (uint8*)this)); + + superfxbus.init(); + instruction_counter = 0; + + for(unsigned n = 0; n < 16; n++) regs.r[n] = 0x0000; + regs.sfr = 0x0000; + regs.pbr = 0x00; + regs.rombr = 0x00; + regs.rambr = 0; + regs.cbr = 0x0000; + regs.scbr = 0x00; + regs.scmr = 0x00; + regs.colr = 0x00; + regs.por = 0x00; + regs.bramr = 0; + regs.vcr = 0x04; + regs.cfgr = 0x00; + regs.clsr = 0; + regs.pipeline = 0x01; //nop + regs.ramaddr = 0x0000; + regs.reset(); + + memory_reset(); + timing_reset(); +} + +} diff --git a/Mednafen/mednafen/snes/src/chip/superfx/superfx.hpp b/Mednafen/mednafen/snes/src/chip/superfx/superfx.hpp new file mode 100755 index 0000000000..e1561ea93f --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/superfx.hpp @@ -0,0 +1,26 @@ +#include "bus/bus.hpp" + +class SuperFX : public MMIO { +public: + #include "core/core.hpp" + #include "memory/memory.hpp" + #include "mmio/mmio.hpp" + #include "timing/timing.hpp" + #include "disasm/disasm.hpp" + + void enter(); + + void init(); + void enable(); + void power(); + void reset(); + + void serialize(serializer&); + +private: + unsigned clockmode; + unsigned instruction_counter; +}; + +extern SuperFX superfx; +extern SuperFXBus superfxbus; diff --git a/Mednafen/mednafen/snes/src/chip/superfx/timing/timing.cpp b/Mednafen/mednafen/snes/src/chip/superfx/timing/timing.cpp new file mode 100755 index 0000000000..eb265381aa --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/timing/timing.cpp @@ -0,0 +1,97 @@ +#ifdef SUPERFX_CPP + +void SuperFX::add_clocks(unsigned clocks) { + if(regs.romcl) { + regs.romcl -= min(clocks, regs.romcl); + if(regs.romcl == 0) { + regs.sfr.r = 0; + regs.romdr = superfxbus.read((regs.rombr << 16) + regs.r[14]); + } + } + + if(regs.ramcl) { + regs.ramcl -= min(clocks, regs.ramcl); + if(regs.ramcl == 0) { + superfxbus.write(0x700000 + (regs.rambr << 16) + regs.ramar, regs.ramdr); + } + } + + scheduler.addclocks_cop(clocks); + scheduler.sync_copcpu(); +} + +void SuperFX::rombuffer_sync() { + if(regs.romcl) add_clocks(regs.romcl); +} + +alwaysinline void SuperFX::rombuffer_update() { + regs.sfr.r = 1; + regs.romcl = memory_access_speed; +} + +alwaysinline uint8 SuperFX::rombuffer_read() { + rombuffer_sync(); + return regs.romdr; +} + +void SuperFX::rambuffer_sync() { + if(regs.ramcl) add_clocks(regs.ramcl); +} + +uint8 SuperFX::rambuffer_read(uint16 addr) { + rambuffer_sync(); + return superfxbus.read(0x700000 + (regs.rambr << 16) + addr); +} + +void SuperFX::rambuffer_write(uint16 addr, uint8 data) { + rambuffer_sync(); + regs.ramcl = memory_access_speed; + regs.ramar = addr; + regs.ramdr = data; +} + +static void SuperFX_r14_modify(uint16 data) +{ + superfx.rombuffer_update(); +} + +static void SuperFX_r15_modify(uint16 data) +{ + superfx.r15_NOT_modified = !true; +} + +void SuperFX::update_speed() { + //force SuperFX1 mode? + if(clockmode == 1) { + cache_access_speed = 2; + memory_access_speed = 6; + return; + } + + //force SuperFX2 mode? + if(clockmode == 2) { + cache_access_speed = 1; + memory_access_speed = 5; + regs.cfgr.ms0 = 0; //cannot use high-speed multiplication in 21MHz mode + return; + } + + //default: allow S-CPU to select mode + cache_access_speed = (regs.clsr ? 1 : 2); + memory_access_speed = (regs.clsr ? 5 : 6); + if(regs.clsr) regs.cfgr.ms0 = 0; //cannot use high-speed multiplication in 21MHz mode +} + +void SuperFX::timing_reset() { + update_speed(); + r15_NOT_modified = !false; + + regs.romcl = 0; + regs.romdr = 0; + + regs.ramcl = 0; + regs.ramar = 0; + regs.ramdr = 0; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/chip/superfx/timing/timing.hpp b/Mednafen/mednafen/snes/src/chip/superfx/timing/timing.hpp new file mode 100755 index 0000000000..50184c1487 --- /dev/null +++ b/Mednafen/mednafen/snes/src/chip/superfx/timing/timing.hpp @@ -0,0 +1,19 @@ +unsigned cache_access_speed; +unsigned memory_access_speed; +uint8 r15_NOT_modified; // stores 0 and 1 only. + +void add_clocks(unsigned clocks); + +void rombuffer_sync(); +void rombuffer_update(); +uint8 rombuffer_read(); + +void rambuffer_sync(); +uint8 rambuffer_read(uint16 addr); +void rambuffer_write(uint16 addr, uint8 data); + +void r14_modify(uint16); +void r15_modify(uint16); + +void update_speed(); +void timing_reset(); diff --git a/Mednafen/mednafen/snes/src/cpu/core/algorithms.cpp b/Mednafen/mednafen/snes/src/cpu/core/algorithms.cpp new file mode 100755 index 0000000000..9eba837dd2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/algorithms.cpp @@ -0,0 +1,369 @@ +#ifdef CPUCORE_CPP + +inline void CPUcore::op_adc_b() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.l ) & 15; + uint8 n1 = (regs.a.l >> 4) & 15; + n0 += (rd.l & 15) + regs.p.c; + if(n0 > 9) { + n0 = (n0 - 10) & 15; + n1++; + } + n1 += ((rd.l >> 4) & 15); + if(n1 > 9) { + n1 = (n1 - 10) & 15; + regs.p.c = 1; + } else { + regs.p.c = 0; + } + r = (n1 << 4) | n0; + } else { + r = regs.a.l + rd.l + regs.p.c; + regs.p.c = r > 0xff; + } + regs.p.n = r & 0x80; + regs.p.v = ~(regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80; + regs.p.z = (uint8)r == 0; + regs.a.l = r; +} + +inline void CPUcore::op_adc_w() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.w ) & 15; + uint8 n1 = (regs.a.w >> 4) & 15; + uint8 n2 = (regs.a.w >> 8) & 15; + uint8 n3 = (regs.a.w >> 12) & 15; + n0 += (rd.w & 15) + regs.p.c; + if(n0 > 9) { + n0 = (n0 - 10) & 15; + n1++; + } + n1 += ((rd.w >> 4) & 15); + if(n1 > 9) { + n1 = (n1 - 10) & 15; + n2++; + } + n2 += ((rd.w >> 8) & 15); + if(n2 > 9) { + n2 = (n2 - 10) & 15; + n3++; + } + n3 += ((rd.w >> 12) & 15); + if(n3 > 9) { + n3 = (n3 - 10) & 15; + regs.p.c = 1; + } else { + regs.p.c = 0; + } + r = (n3 << 12) | (n2 << 8) | (n1 << 4) | n0; + } else { + r = regs.a.w + rd.w + regs.p.c; + regs.p.c = r > 0xffff; + } + regs.p.n = r & 0x8000; + regs.p.v = ~(regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000; + regs.p.z = (uint16)r == 0; + regs.a.w = r; +} + +inline void CPUcore::op_and_b() { + regs.a.l &= rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_and_w() { + regs.a.w &= rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_bit_b() { + regs.p.n = rd.l & 0x80; + regs.p.v = rd.l & 0x40; + regs.p.z = (rd.l & regs.a.l) == 0; +} + +inline void CPUcore::op_bit_w() { + regs.p.n = rd.w & 0x8000; + regs.p.v = rd.w & 0x4000; + regs.p.z = (rd.w & regs.a.w) == 0; +} + +inline void CPUcore::op_cmp_b() { + int r = regs.a.l - rd.l; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cmp_w() { + int r = regs.a.w - rd.w; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpx_b() { + int r = regs.x.l - rd.l; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpx_w() { + int r = regs.x.w - rd.w; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpy_b() { + int r = regs.y.l - rd.l; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_cpy_w() { + int r = regs.y.w - rd.w; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; +} + +inline void CPUcore::op_eor_b() { + regs.a.l ^= rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_eor_w() { + regs.a.w ^= rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_lda_b() { + regs.a.l = rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_lda_w() { + regs.a.w = rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_ldx_b() { + regs.x.l = rd.l; + regs.p.n = regs.x.l & 0x80; + regs.p.z = regs.x.l == 0; +} + +inline void CPUcore::op_ldx_w() { + regs.x.w = rd.w; + regs.p.n = regs.x.w & 0x8000; + regs.p.z = regs.x.w == 0; +} + +inline void CPUcore::op_ldy_b() { + regs.y.l = rd.l; + regs.p.n = regs.y.l & 0x80; + regs.p.z = regs.y.l == 0; +} + +inline void CPUcore::op_ldy_w() { + regs.y.w = rd.w; + regs.p.n = regs.y.w & 0x8000; + regs.p.z = regs.y.w == 0; +} + +inline void CPUcore::op_ora_b() { + regs.a.l |= rd.l; + regs.p.n = regs.a.l & 0x80; + regs.p.z = regs.a.l == 0; +} + +inline void CPUcore::op_ora_w() { + regs.a.w |= rd.w; + regs.p.n = regs.a.w & 0x8000; + regs.p.z = regs.a.w == 0; +} + +inline void CPUcore::op_sbc_b() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.l ) & 15; + uint8 n1 = (regs.a.l >> 4) & 15; + n0 -= ((rd.l ) & 15) + !regs.p.c; + n1 -= ((rd.l >> 4) & 15); + if(n0 > 9) { + n0 += 10; + n1--; + } + if(n1 > 9) { + n1 += 10; + regs.p.c = 0; + } else { + regs.p.c = 1; + } + r = (n1 << 4) | (n0); + } else { + r = regs.a.l - rd.l - !regs.p.c; + regs.p.c = r >= 0; + } + regs.p.n = r & 0x80; + regs.p.v = (regs.a.l ^ rd.l) & (regs.a.l ^ r) & 0x80; + regs.p.z = (uint8)r == 0; + regs.a.l = r; +} + +inline void CPUcore::op_sbc_w() { + int r; + if(regs.p.d) { + uint8 n0 = (regs.a.w ) & 15; + uint8 n1 = (regs.a.w >> 4) & 15; + uint8 n2 = (regs.a.w >> 8) & 15; + uint8 n3 = (regs.a.w >> 12) & 15; + n0 -= ((rd.w ) & 15) + !regs.p.c; + n1 -= ((rd.w >> 4) & 15); + n2 -= ((rd.w >> 8) & 15); + n3 -= ((rd.w >> 12) & 15); + if(n0 > 9) { + n0 += 10; + n1--; + } + if(n1 > 9) { + n1 += 10; + n2--; + } + if(n2 > 9) { + n2 += 10; + n3--; + } + if(n3 > 9) { + n3 += 10; + regs.p.c = 0; + } else { + regs.p.c = 1; + } + r = (n3 << 12) | (n2 << 8) | (n1 << 4) | (n0); + } else { + r = regs.a.w - rd.w - !regs.p.c; + regs.p.c = r >= 0; + } + regs.p.n = r & 0x8000; + regs.p.v = (regs.a.w ^ rd.w) & (regs.a.w ^ r) & 0x8000; + regs.p.z = (uint16)r == 0; + regs.a.w = r; +} + +inline void CPUcore::op_inc_b() { + rd.l++; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_inc_w() { + rd.w++; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_dec_b() { + rd.l--; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_dec_w() { + rd.w--; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_asl_b() { + regs.p.c = rd.l & 0x80; + rd.l <<= 1; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_asl_w() { + regs.p.c = rd.w & 0x8000; + rd.w <<= 1; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_lsr_b() { + regs.p.c = rd.l & 1; + rd.l >>= 1; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_lsr_w() { + regs.p.c = rd.w & 1; + rd.w >>= 1; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_rol_b() { + unsigned carry = (unsigned)regs.p.c; + regs.p.c = rd.l & 0x80; + rd.l = (rd.l << 1) | carry; + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_rol_w() { + unsigned carry = (unsigned)regs.p.c; + regs.p.c = rd.w & 0x8000; + rd.w = (rd.w << 1) | carry; + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_ror_b() { + unsigned carry = (unsigned)regs.p.c << 7; + regs.p.c = rd.l & 1; + rd.l = carry | (rd.l >> 1); + regs.p.n = rd.l & 0x80; + regs.p.z = rd.l == 0; +} + +inline void CPUcore::op_ror_w() { + unsigned carry = (unsigned)regs.p.c << 15; + regs.p.c = rd.w & 1; + rd.w = carry | (rd.w >> 1); + regs.p.n = rd.w & 0x8000; + regs.p.z = rd.w == 0; +} + +inline void CPUcore::op_trb_b() { + regs.p.z = (rd.l & regs.a.l) == 0; + rd.l &= ~regs.a.l; +} + +inline void CPUcore::op_trb_w() { + regs.p.z = (rd.w & regs.a.w) == 0; + rd.w &= ~regs.a.w; +} + +inline void CPUcore::op_tsb_b() { + regs.p.z = (rd.l & regs.a.l) == 0; + rd.l |= regs.a.l; +} + +inline void CPUcore::op_tsb_w() { + regs.p.z = (rd.w & regs.a.w) == 0; + rd.w |= regs.a.w; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/core.cpp b/Mednafen/mednafen/snes/src/cpu/core/core.cpp new file mode 100755 index 0000000000..f55d590116 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/core.cpp @@ -0,0 +1,74 @@ +#include <../base.hpp> + +#define CPUCORE_CPP +namespace bSNES_v059 { + +#include "serialization.cpp" +#include "algorithms.cpp" +#include "disassembler/disassembler.cpp" + +#define L last_cycle(); +#define A 0 +#define X 1 +#define Y 2 +#define Z 3 +#define S 4 +#define D 5 +#define call(op) (this->*op)() + +#include "opcode_read.cpp" +#include "opcode_write.cpp" +#include "opcode_rmw.cpp" +#include "opcode_pc.cpp" +#include "opcode_misc.cpp" +#include "table.cpp" + +#undef L +#undef A +#undef X +#undef Y +#undef Z +#undef S +#undef D +#undef call + +//immediate, 2-cycle opcodes with I/O cycle will become bus read +//when an IRQ is to be triggered immediately after opcode completion. +//this affects the following opcodes: +// clc, cld, cli, clv, sec, sed, sei, +// tax, tay, txa, txy, tya, tyx, +// tcd, tcs, tdc, tsc, tsx, txs, +// inc, inx, iny, dec, dex, dey, +// asl, lsr, rol, ror, nop, xce. +alwaysinline void CPUcore::op_io_irq() { + if(interrupt_pending()) { + //modify I/O cycle to bus read cycle, do not increment PC + op_read(regs.pc.d); + } else { + op_io(); + } +} + +alwaysinline void CPUcore::op_io_cond2() { + if(regs.d.l != 0x00) { + op_io(); + } +} + +alwaysinline void CPUcore::op_io_cond4(uint16 x, uint16 y) { + if(!regs.p.x || (x & 0xff00) != (y & 0xff00)) { + op_io(); + } +} + +alwaysinline void CPUcore::op_io_cond6(uint16 addr) { + if(regs.e && (regs.pc.w & 0xff00) != (addr & 0xff00)) { + op_io(); + } +} + +CPUcore::CPUcore() { + initialize_opcode_table(); +} + +}; diff --git a/Mednafen/mednafen/snes/src/cpu/core/core.hpp b/Mednafen/mednafen/snes/src/cpu/core/core.hpp new file mode 100755 index 0000000000..71304ebfa3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/core.hpp @@ -0,0 +1,219 @@ +class CPUcore { +public: + #include "registers.hpp" + #include "memory.hpp" + #include "disassembler/disassembler.hpp" + + regs_t regs; + reg24_t aa, rd; + uint8_t sp, dp; + + virtual void op_io() = 0; + virtual uint8_t op_read(uint32_t addr) = 0; + virtual void op_write(uint32_t addr, uint8_t data) = 0; + virtual void last_cycle() = 0; + virtual bool interrupt_pending() = 0; + + void op_io_irq(); + void op_io_cond2(); + void op_io_cond4(uint16 x, uint16 y); + void op_io_cond6(uint16 addr); + + void op_adc_b(); + void op_adc_w(); + void op_and_b(); + void op_and_w(); + void op_bit_b(); + void op_bit_w(); + void op_cmp_b(); + void op_cmp_w(); + void op_cpx_b(); + void op_cpx_w(); + void op_cpy_b(); + void op_cpy_w(); + void op_eor_b(); + void op_eor_w(); + void op_lda_b(); + void op_lda_w(); + void op_ldx_b(); + void op_ldx_w(); + void op_ldy_b(); + void op_ldy_w(); + void op_ora_b(); + void op_ora_w(); + void op_sbc_b(); + void op_sbc_w(); + + void op_inc_b(); + void op_inc_w(); + void op_dec_b(); + void op_dec_w(); + void op_asl_b(); + void op_asl_w(); + void op_lsr_b(); + void op_lsr_w(); + void op_rol_b(); + void op_rol_w(); + void op_ror_b(); + void op_ror_w(); + void op_trb_b(); + void op_trb_w(); + void op_tsb_b(); + void op_tsb_w(); + + template void op_read_const_b(); + template void op_read_const_w(); + void op_read_bit_const_b(); + void op_read_bit_const_w(); + template void op_read_addr_b(); + template void op_read_addr_w(); + template void op_read_addrx_b(); + template void op_read_addrx_w(); + template void op_read_addry_b(); + template void op_read_addry_w(); + template void op_read_long_b(); + template void op_read_long_w(); + template void op_read_longx_b(); + template void op_read_longx_w(); + template void op_read_dp_b(); + template void op_read_dp_w(); + template void op_read_dpr_b(); + template void op_read_dpr_w(); + template void op_read_idp_b(); + template void op_read_idp_w(); + template void op_read_idpx_b(); + template void op_read_idpx_w(); + template void op_read_idpy_b(); + template void op_read_idpy_w(); + template void op_read_ildp_b(); + template void op_read_ildp_w(); + template void op_read_ildpy_b(); + template void op_read_ildpy_w(); + template void op_read_sr_b(); + template void op_read_sr_w(); + template void op_read_isry_b(); + template void op_read_isry_w(); + + template void op_write_addr_b(); + template void op_write_addr_w(); + template void op_write_addrr_b(); + template void op_write_addrr_w(); + template void op_write_longr_b(); + template void op_write_longr_w(); + template void op_write_dp_b(); + template void op_write_dp_w(); + template void op_write_dpr_b(); + template void op_write_dpr_w(); + void op_sta_idp_b(); + void op_sta_idp_w(); + void op_sta_ildp_b(); + void op_sta_ildp_w(); + void op_sta_idpx_b(); + void op_sta_idpx_w(); + void op_sta_idpy_b(); + void op_sta_idpy_w(); + void op_sta_ildpy_b(); + void op_sta_ildpy_w(); + void op_sta_sr_b(); + void op_sta_sr_w(); + void op_sta_isry_b(); + void op_sta_isry_w(); + + template void op_adjust_imm_b(); + template void op_adjust_imm_w(); + void op_asl_imm_b(); + void op_asl_imm_w(); + void op_lsr_imm_b(); + void op_lsr_imm_w(); + void op_rol_imm_b(); + void op_rol_imm_w(); + void op_ror_imm_b(); + void op_ror_imm_w(); + template void op_adjust_addr_b(); + template void op_adjust_addr_w(); + template void op_adjust_addrx_b(); + template void op_adjust_addrx_w(); + template void op_adjust_dp_b(); + template void op_adjust_dp_w(); + template void op_adjust_dpx_b(); + template void op_adjust_dpx_w(); + + template void op_branch(); + void op_bra(); + void op_brl(); + void op_jmp_addr(); + void op_jmp_long(); + void op_jmp_iaddr(); + void op_jmp_iaddrx(); + void op_jmp_iladdr(); + void op_jsr_addr(); + void op_jsr_long_e(); + void op_jsr_long_n(); + void op_jsr_iaddrx_e(); + void op_jsr_iaddrx_n(); + void op_rti_e(); + void op_rti_n(); + void op_rts(); + void op_rtl_e(); + void op_rtl_n(); + + void op_nop(); + void op_wdm(); + void op_xba(); + template void op_move_b(); + template void op_move_w(); + template void op_interrupt_e(); + template void op_interrupt_n(); + void op_stp(); + void op_wai(); + void op_xce(); + template void op_flag(); + template void op_pflag_e(); + template void op_pflag_n(); + template void op_transfer_b(); + template void op_transfer_w(); + void op_tcs_e(); + void op_tcs_n(); + void op_tsc_e(); + void op_tsc_n(); + void op_tsx_b(); + void op_tsx_w(); + void op_txs_e(); + void op_txs_n(); + template void op_push_b(); + template void op_push_w(); + void op_phd_e(); + void op_phd_n(); + void op_phb(); + void op_phk(); + void op_php(); + template void op_pull_b(); + template void op_pull_w(); + void op_pld_e(); + void op_pld_n(); + void op_plb(); + void op_plp_e(); + void op_plp_n(); + void op_pea_e(); + void op_pea_n(); + void op_pei_e(); + void op_pei_n(); + void op_per_e(); + void op_per_n(); + + void (CPUcore::**opcode_table)(); + void (CPUcore::*op_table[256 * 5])(); + void initialize_opcode_table(); + void update_table(); + + enum { + table_EM = 0, // 8-bit accumulator, 8-bit index (emulation mode) + table_MX = 256, // 8-bit accumulator, 8-bit index + table_Mx = 512, // 8-bit accumulator, 16-bit index + table_mX = 768, //16-bit accumulator, 8-bit index + table_mx = 1024, //16-bit accumulator, 16-bit index + }; + + void core_serialize(serializer&); + CPUcore(); +}; diff --git a/Mednafen/mednafen/snes/src/cpu/core/disassembler/disassembler.cpp b/Mednafen/mednafen/snes/src/cpu/core/disassembler/disassembler.cpp new file mode 100755 index 0000000000..030b3ab512 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/disassembler/disassembler.cpp @@ -0,0 +1,483 @@ +#ifdef CPUCORE_CPP + +uint8 CPUcore::dreadb(uint32 addr) { + if((addr & 0x40ffff) >= 0x2000 && (addr & 0x40ffff) <= 0x5fff) { + //$[00-3f|80-bf]:[2000-5fff] + //do not read MMIO registers within debugger + return 0x00; + } + return bus.read(addr); +} + +uint16 CPUcore::dreadw(uint32 addr) { + uint16 r; + r = dreadb((addr + 0) & 0xffffff) << 0; + r |= dreadb((addr + 1) & 0xffffff) << 8; + return r; +} + +uint32 CPUcore::dreadl(uint32 addr) { + uint32 r; + r = dreadb((addr + 0) & 0xffffff) << 0; + r |= dreadb((addr + 1) & 0xffffff) << 8; + r |= dreadb((addr + 2) & 0xffffff) << 16; + return r; +} + +uint32 CPUcore::decode(uint8 offset_type, uint32 addr) { + uint32 r = 0; + + switch(offset_type) { + case OPTYPE_DP: + r = (regs.d + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_DPX: + r = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_DPY: + r = (regs.d + regs.y + (addr & 0xffff)) & 0xffff; + break; + case OPTYPE_IDP: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr); + break; + case OPTYPE_IDPX: + addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr); + break; + case OPTYPE_IDPY: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr) + regs.y; + break; + case OPTYPE_ILDP: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = dreadl(addr); + break; + case OPTYPE_ILDPY: + addr = (regs.d + (addr & 0xffff)) & 0xffff; + r = dreadl(addr) + regs.y; + break; + case OPTYPE_ADDR: + r = (regs.db << 16) + (addr & 0xffff); + break; + case OPTYPE_ADDR_PC: + r = (regs.pc.b << 16) + (addr & 0xffff); + break; + case OPTYPE_ADDRX: + r = (regs.db << 16) + (addr & 0xffff) + regs.x; + break; + case OPTYPE_ADDRY: + r = (regs.db << 16) + (addr & 0xffff) + regs.y; + break; + case OPTYPE_IADDR_PC: + r = (regs.pc.b << 16) + (addr & 0xffff); + break; + case OPTYPE_IADDRX: + r = (regs.pc.b << 16) + ((addr + regs.x) & 0xffff); + break; + case OPTYPE_ILADDR: + r = addr; + break; + case OPTYPE_LONG: + r = addr; + break; + case OPTYPE_LONGX: + r = (addr + regs.x); + break; + case OPTYPE_SR: + r = (regs.s + (addr & 0xff)) & 0xffff; + break; + case OPTYPE_ISRY: + addr = (regs.s + (addr & 0xff)) & 0xffff; + r = (regs.db << 16) + dreadw(addr) + regs.y; + break; + case OPTYPE_RELB: + r = (regs.pc.b << 16) + ((regs.pc.w + 2) & 0xffff); + r += int8(addr); + break; + case OPTYPE_RELW: + r = (regs.pc.b << 16) + ((regs.pc.w + 3) & 0xffff); + r += int16(addr); + break; + } + + return(r & 0xffffff); +} + +void CPUcore::disassemble_opcode(char *output, uint32 addr) { + static reg24_t pc; + char t[256]; + char *s = output; + + if(false /* in_opcode() == true */) { + strcpy(s, "?????? "); + return; + } + + pc.d = addr; + sprintf(s, "%.6x ", (uint32)pc.d); + + uint8 op = dreadb(pc.d); pc.w++; + uint8 op0 = dreadb(pc.d); pc.w++; + uint8 op1 = dreadb(pc.d); pc.w++; + uint8 op2 = dreadb(pc.d); + + #define op8 ((op0)) + #define op16 ((op0) | (op1 << 8)) + #define op24 ((op0) | (op1 << 8) | (op2 << 16)) + #define a8 (regs.e || regs.p.m) + #define x8 (regs.e || regs.p.x) + + switch(op) { + case 0x00: sprintf(t, "brk #$%.2x ", op8); break; + case 0x01: sprintf(t, "ora ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x02: sprintf(t, "cop #$%.2x ", op8); break; + case 0x03: sprintf(t, "ora $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x04: sprintf(t, "tsb $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x05: sprintf(t, "ora $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x06: sprintf(t, "asl $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x07: sprintf(t, "ora [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x08: sprintf(t, "php "); break; + case 0x09: if(a8)sprintf(t, "ora #$%.2x ", op8); + else sprintf(t, "ora #$%.4x ", op16); break; + case 0x0a: sprintf(t, "asl a "); break; + case 0x0b: sprintf(t, "phd "); break; + case 0x0c: sprintf(t, "tsb $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x0d: sprintf(t, "ora $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x0e: sprintf(t, "asl $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x0f: sprintf(t, "ora $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x10: sprintf(t, "bpl $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x11: sprintf(t, "ora ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x12: sprintf(t, "ora ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x13: sprintf(t, "ora ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x14: sprintf(t, "trb $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x15: sprintf(t, "ora $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x16: sprintf(t, "asl $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x17: sprintf(t, "ora [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x18: sprintf(t, "clc "); break; + case 0x19: sprintf(t, "ora $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x1a: sprintf(t, "inc "); break; + case 0x1b: sprintf(t, "tcs "); break; + case 0x1c: sprintf(t, "trb $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x1d: sprintf(t, "ora $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x1e: sprintf(t, "asl $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x1f: sprintf(t, "ora $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x20: sprintf(t, "jsr $%.4x [%.6x]", op16, decode(OPTYPE_ADDR_PC, op16)); break; + case 0x21: sprintf(t, "and ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x22: sprintf(t, "jsl $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x23: sprintf(t, "and $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x24: sprintf(t, "bit $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x25: sprintf(t, "and $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x26: sprintf(t, "rol $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x27: sprintf(t, "and [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x28: sprintf(t, "plp "); break; + case 0x29: if(a8)sprintf(t, "and #$%.2x ", op8); + else sprintf(t, "and #$%.4x ", op16); break; + case 0x2a: sprintf(t, "rol a "); break; + case 0x2b: sprintf(t, "pld "); break; + case 0x2c: sprintf(t, "bit $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x2d: sprintf(t, "and $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x2e: sprintf(t, "rol $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x2f: sprintf(t, "and $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x30: sprintf(t, "bmi $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x31: sprintf(t, "and ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x32: sprintf(t, "and ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x33: sprintf(t, "and ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x34: sprintf(t, "bit $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x35: sprintf(t, "and $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x36: sprintf(t, "rol $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x37: sprintf(t, "and [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x38: sprintf(t, "sec "); break; + case 0x39: sprintf(t, "and $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x3a: sprintf(t, "dec "); break; + case 0x3b: sprintf(t, "tsc "); break; + case 0x3c: sprintf(t, "bit $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x3d: sprintf(t, "and $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x3e: sprintf(t, "rol $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x3f: sprintf(t, "and $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x40: sprintf(t, "rti "); break; + case 0x41: sprintf(t, "eor ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x42: sprintf(t, "wdm "); break; + case 0x43: sprintf(t, "eor $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x44: sprintf(t, "mvp $%.2x,$%.2x ", op1, op8); break; + case 0x45: sprintf(t, "eor $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x46: sprintf(t, "lsr $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x47: sprintf(t, "eor [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x48: sprintf(t, "pha "); break; + case 0x49: if(a8)sprintf(t, "eor #$%.2x ", op8); + else sprintf(t, "eor #$%.4x ", op16); break; + case 0x4a: sprintf(t, "lsr a "); break; + case 0x4b: sprintf(t, "phk "); break; + case 0x4c: sprintf(t, "jmp $%.4x [%.6x]", op16, decode(OPTYPE_ADDR_PC, op16)); break; + case 0x4d: sprintf(t, "eor $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x4e: sprintf(t, "lsr $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x4f: sprintf(t, "eor $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x50: sprintf(t, "bvc $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x51: sprintf(t, "eor ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x52: sprintf(t, "eor ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x53: sprintf(t, "eor ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x54: sprintf(t, "mvn $%.2x,$%.2x ", op1, op8); break; + case 0x55: sprintf(t, "eor $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x56: sprintf(t, "lsr $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x57: sprintf(t, "eor [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x58: sprintf(t, "cli "); break; + case 0x59: sprintf(t, "eor $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x5a: sprintf(t, "phy "); break; + case 0x5b: sprintf(t, "tcd "); break; + case 0x5c: sprintf(t, "jml $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x5d: sprintf(t, "eor $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x5e: sprintf(t, "lsr $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x5f: sprintf(t, "eor $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x60: sprintf(t, "rts "); break; + case 0x61: sprintf(t, "adc ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x62: sprintf(t, "per $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x63: sprintf(t, "adc $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x64: sprintf(t, "stz $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x65: sprintf(t, "adc $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x66: sprintf(t, "ror $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x67: sprintf(t, "adc [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x68: sprintf(t, "pla "); break; + case 0x69: if(a8)sprintf(t, "adc #$%.2x ", op8); + else sprintf(t, "adc #$%.4x ", op16); break; + case 0x6a: sprintf(t, "ror a "); break; + case 0x6b: sprintf(t, "rtl "); break; + case 0x6c: sprintf(t, "jmp ($%.4x) [%.6x]", op16, decode(OPTYPE_IADDR_PC, op16)); break; + case 0x6d: sprintf(t, "adc $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x6e: sprintf(t, "ror $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x6f: sprintf(t, "adc $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x70: sprintf(t, "bvs $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x71: sprintf(t, "adc ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x72: sprintf(t, "adc ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x73: sprintf(t, "adc ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x74: sprintf(t, "stz $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x75: sprintf(t, "adc $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x76: sprintf(t, "ror $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x77: sprintf(t, "adc [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x78: sprintf(t, "sei "); break; + case 0x79: sprintf(t, "adc $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x7a: sprintf(t, "ply "); break; + case 0x7b: sprintf(t, "tdc "); break; + case 0x7c: sprintf(t, "jmp ($%.4x,x) [%.6x]", op16, decode(OPTYPE_IADDRX, op16)); break; + case 0x7d: sprintf(t, "adc $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x7e: sprintf(t, "ror $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x7f: sprintf(t, "adc $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0x80: sprintf(t, "bra $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x81: sprintf(t, "sta ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0x82: sprintf(t, "brl $%.4x [%.6x]", uint16(decode(OPTYPE_RELW, op16)), decode(OPTYPE_RELW, op16)); break; + case 0x83: sprintf(t, "sta $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0x84: sprintf(t, "sty $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x85: sprintf(t, "sta $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x86: sprintf(t, "stx $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0x87: sprintf(t, "sta [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0x88: sprintf(t, "dey "); break; + case 0x89: if(a8)sprintf(t, "bit #$%.2x ", op8); + else sprintf(t, "bit #$%.4x ", op16); break; + case 0x8a: sprintf(t, "txa "); break; + case 0x8b: sprintf(t, "phb "); break; + case 0x8c: sprintf(t, "sty $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x8d: sprintf(t, "sta $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x8e: sprintf(t, "stx $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x8f: sprintf(t, "sta $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0x90: sprintf(t, "bcc $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0x91: sprintf(t, "sta ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0x92: sprintf(t, "sta ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0x93: sprintf(t, "sta ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0x94: sprintf(t, "sty $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x95: sprintf(t, "sta $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0x96: sprintf(t, "stx $%.2x,y [%.6x]", op8, decode(OPTYPE_DPY, op8)); break; + case 0x97: sprintf(t, "sta [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0x98: sprintf(t, "tya "); break; + case 0x99: sprintf(t, "sta $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0x9a: sprintf(t, "txs "); break; + case 0x9b: sprintf(t, "txy "); break; + case 0x9c: sprintf(t, "stz $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0x9d: sprintf(t, "sta $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x9e: sprintf(t, "stz $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0x9f: sprintf(t, "sta $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0xa0: if(x8)sprintf(t, "ldy #$%.2x ", op8); + else sprintf(t, "ldy #$%.4x ", op16); break; + case 0xa1: sprintf(t, "lda ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0xa2: if(x8)sprintf(t, "ldx #$%.2x ", op8); + else sprintf(t, "ldx #$%.4x ", op16); break; + case 0xa3: sprintf(t, "lda $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0xa4: sprintf(t, "ldy $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xa5: sprintf(t, "lda $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xa6: sprintf(t, "ldx $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xa7: sprintf(t, "lda [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0xa8: sprintf(t, "tay "); break; + case 0xa9: if(a8)sprintf(t, "lda #$%.2x ", op8); + else sprintf(t, "lda #$%.4x ", op16); break; + case 0xaa: sprintf(t, "tax "); break; + case 0xab: sprintf(t, "plb "); break; + case 0xac: sprintf(t, "ldy $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xad: sprintf(t, "lda $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xae: sprintf(t, "ldx $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xaf: sprintf(t, "lda $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0xb0: sprintf(t, "bcs $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0xb1: sprintf(t, "lda ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0xb2: sprintf(t, "lda ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xb3: sprintf(t, "lda ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0xb4: sprintf(t, "ldy $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xb5: sprintf(t, "lda $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xb6: sprintf(t, "ldx $%.2x,y [%.6x]", op8, decode(OPTYPE_DPY, op8)); break; + case 0xb7: sprintf(t, "lda [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0xb8: sprintf(t, "clv "); break; + case 0xb9: sprintf(t, "lda $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xba: sprintf(t, "tsx "); break; + case 0xbb: sprintf(t, "tyx "); break; + case 0xbc: sprintf(t, "ldy $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xbd: sprintf(t, "lda $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xbe: sprintf(t, "ldx $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xbf: sprintf(t, "lda $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0xc0: if(x8)sprintf(t, "cpy #$%.2x ", op8); + else sprintf(t, "cpy #$%.4x ", op16); break; + case 0xc1: sprintf(t, "cmp ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0xc2: sprintf(t, "rep #$%.2x ", op8); break; + case 0xc3: sprintf(t, "cmp $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0xc4: sprintf(t, "cpy $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xc5: sprintf(t, "cmp $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xc6: sprintf(t, "dec $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xc7: sprintf(t, "cmp [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0xc8: sprintf(t, "iny "); break; + case 0xc9: if(a8)sprintf(t, "cmp #$%.2x ", op8); + else sprintf(t, "cmp #$%.4x ", op16); break; + case 0xca: sprintf(t, "dex "); break; + case 0xcb: sprintf(t, "wai "); break; + case 0xcc: sprintf(t, "cpy $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xcd: sprintf(t, "cmp $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xce: sprintf(t, "dec $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xcf: sprintf(t, "cmp $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0xd0: sprintf(t, "bne $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0xd1: sprintf(t, "cmp ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0xd2: sprintf(t, "cmp ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xd3: sprintf(t, "cmp ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0xd4: sprintf(t, "pei ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xd5: sprintf(t, "cmp $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xd6: sprintf(t, "dec $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xd7: sprintf(t, "cmp [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0xd8: sprintf(t, "cld "); break; + case 0xd9: sprintf(t, "cmp $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xda: sprintf(t, "phx "); break; + case 0xdb: sprintf(t, "stp "); break; + case 0xdc: sprintf(t, "jmp [$%.4x] [%.6x]", op16, decode(OPTYPE_ILADDR, op16)); break; + case 0xdd: sprintf(t, "cmp $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xde: sprintf(t, "dec $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xdf: sprintf(t, "cmp $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + case 0xe0: if(x8)sprintf(t, "cpx #$%.2x ", op8); + else sprintf(t, "cpx #$%.4x ", op16); break; + case 0xe1: sprintf(t, "sbc ($%.2x,x) [%.6x]", op8, decode(OPTYPE_IDPX, op8)); break; + case 0xe2: sprintf(t, "sep #$%.2x ", op8); break; + case 0xe3: sprintf(t, "sbc $%.2x,s [%.6x]", op8, decode(OPTYPE_SR, op8)); break; + case 0xe4: sprintf(t, "cpx $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xe5: sprintf(t, "sbc $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xe6: sprintf(t, "inc $%.2x [%.6x]", op8, decode(OPTYPE_DP, op8)); break; + case 0xe7: sprintf(t, "sbc [$%.2x] [%.6x]", op8, decode(OPTYPE_ILDP, op8)); break; + case 0xe8: sprintf(t, "inx "); break; + case 0xe9: if(a8)sprintf(t, "sbc #$%.2x ", op8); + else sprintf(t, "sbc #$%.4x ", op16); break; + case 0xea: sprintf(t, "nop "); break; + case 0xeb: sprintf(t, "xba "); break; + case 0xec: sprintf(t, "cpx $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xed: sprintf(t, "sbc $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xee: sprintf(t, "inc $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xef: sprintf(t, "sbc $%.6x [%.6x]", op24, decode(OPTYPE_LONG, op24)); break; + case 0xf0: sprintf(t, "beq $%.4x [%.6x]", uint16(decode(OPTYPE_RELB, op8)), decode(OPTYPE_RELB, op8)); break; + case 0xf1: sprintf(t, "sbc ($%.2x),y [%.6x]", op8, decode(OPTYPE_IDPY, op8)); break; + case 0xf2: sprintf(t, "sbc ($%.2x) [%.6x]", op8, decode(OPTYPE_IDP, op8)); break; + case 0xf3: sprintf(t, "sbc ($%.2x,s),y [%.6x]", op8, decode(OPTYPE_ISRY, op8)); break; + case 0xf4: sprintf(t, "pea $%.4x [%.6x]", op16, decode(OPTYPE_ADDR, op16)); break; + case 0xf5: sprintf(t, "sbc $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xf6: sprintf(t, "inc $%.2x,x [%.6x]", op8, decode(OPTYPE_DPX, op8)); break; + case 0xf7: sprintf(t, "sbc [$%.2x],y [%.6x]", op8, decode(OPTYPE_ILDPY, op8)); break; + case 0xf8: sprintf(t, "sed "); break; + case 0xf9: sprintf(t, "sbc $%.4x,y [%.6x]", op16, decode(OPTYPE_ADDRY, op16)); break; + case 0xfa: sprintf(t, "plx "); break; + case 0xfb: sprintf(t, "xce "); break; + case 0xfc: sprintf(t, "jsr ($%.4x,x) [%.6x]", op16, decode(OPTYPE_IADDRX, op16)); break; + case 0xfd: sprintf(t, "sbc $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xfe: sprintf(t, "inc $%.4x,x [%.6x]", op16, decode(OPTYPE_ADDRX, op16)); break; + case 0xff: sprintf(t, "sbc $%.6x,x [%.6x]", op24, decode(OPTYPE_LONGX, op24)); break; + } + + #undef op8 + #undef op16 + #undef op24 + #undef a8 + #undef x8 + + strcat(s, t); + strcat(s, " "); + + sprintf(t, "A:%.4x X:%.4x Y:%.4x S:%.4x D:%.4x DB:%.2x ", + regs.a.w, regs.x.w, regs.y.w, regs.s.w, regs.d.w, regs.db); + strcat(s, t); + + if(regs.e) { + sprintf(t, "%c%c%c%c%c%c%c%c", + regs.p.n ? 'N' : 'n', regs.p.v ? 'V' : 'v', + regs.p.m ? '1' : '0', regs.p.x ? 'B' : 'b', + regs.p.d ? 'D' : 'd', regs.p.i ? 'I' : 'i', + regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); + } else { + sprintf(t, "%c%c%c%c%c%c%c%c", + regs.p.n ? 'N' : 'n', regs.p.v ? 'V' : 'v', + regs.p.m ? 'M' : 'm', regs.p.x ? 'X' : 'x', + regs.p.d ? 'D' : 'd', regs.p.i ? 'I' : 'i', + regs.p.z ? 'Z' : 'z', regs.p.c ? 'C' : 'c'); + } + + strcat(s, t); + strcat(s, " "); + + sprintf(t, "V:%3d H:%4d", cpu.vcounter(), cpu.hcounter()); + strcat(s, t); +} + +//opcode_length() retrieves the length of the next opcode +//to be executed. It is used by the debugger to step over, +//disable and proceed cpu opcodes. +// +//5 and 6 are special cases, 5 is used for #consts based on +//the A register size, 6 for the X/Y register size. the +//rest are literal sizes. There's no need to test for +//emulation mode, as regs.p.m/regs.p.x should *always* be +//set in emulation mode. + +uint8 CPUcore::opcode_length() { + uint8 op, len; + static uint8 op_len_tbl[256] = { + //0,1,2,3, 4,5,6,7, 8,9,a,b, c,d,e,f + + 2,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x0n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x1n + 3,2,4,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x2n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x3n + + 1,2,2,2, 3,2,2,2, 1,5,1,1, 3,3,3,4, //0x4n + 2,2,2,2, 3,2,2,2, 1,3,1,1, 4,3,3,4, //0x5n + 1,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x6n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x7n + + 2,2,3,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0x8n + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0x9n + 6,2,6,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xan + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xbn + + 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xcn + 2,2,2,2, 2,2,2,2, 1,3,1,1, 3,3,3,4, //0xdn + 6,2,2,2, 2,2,2,2, 1,5,1,1, 3,3,3,4, //0xen + 2,2,2,2, 3,2,2,2, 1,3,1,1, 3,3,3,4 //0xfn + }; + + if(false /* in_opcode() == true */) { + return 0; + } + + op = dreadb(regs.pc.d); + len = op_len_tbl[op]; + if(len == 5) return (regs.e || regs.p.m) ? 2 : 3; + if(len == 6) return (regs.e || regs.p.x) ? 2 : 3; + return len; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/disassembler/disassembler.hpp b/Mednafen/mednafen/snes/src/cpu/core/disassembler/disassembler.hpp new file mode 100755 index 0000000000..b0ee6f0439 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/disassembler/disassembler.hpp @@ -0,0 +1,30 @@ +enum { + OPTYPE_DP = 0, //dp + OPTYPE_DPX, //dp,x + OPTYPE_DPY, //dp,y + OPTYPE_IDP, //(dp) + OPTYPE_IDPX, //(dp,x) + OPTYPE_IDPY, //(dp),y + OPTYPE_ILDP, //[dp] + OPTYPE_ILDPY, //[dp],y + OPTYPE_ADDR, //addr + OPTYPE_ADDRX, //addr,x + OPTYPE_ADDRY, //addr,y + OPTYPE_IADDRX, //(addr,x) + OPTYPE_ILADDR, //[addr] + OPTYPE_LONG, //long + OPTYPE_LONGX, //long, x + OPTYPE_SR, //sr,s + OPTYPE_ISRY, //(sr,s),y + OPTYPE_ADDR_PC, //pbr:addr + OPTYPE_IADDR_PC, //pbr:(addr) + OPTYPE_RELB, //relb + OPTYPE_RELW, //relw +}; + +void disassemble_opcode(char *output, uint32 addr); +uint8 dreadb(uint32 addr); +uint16 dreadw(uint32 addr); +uint32 dreadl(uint32 addr); +uint32 decode(uint8 offset_type, uint32 addr); +uint8 opcode_length(); diff --git a/Mednafen/mednafen/snes/src/cpu/core/memory.hpp b/Mednafen/mednafen/snes/src/cpu/core/memory.hpp new file mode 100755 index 0000000000..4992657869 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/memory.hpp @@ -0,0 +1,77 @@ +alwaysinline uint8_t op_readpc() { + return op_read((regs.pc.b << 16) + regs.pc.w++); +} + +alwaysinline uint8_t op_readstack() { + regs.e ? regs.s.l++ : regs.s.w++; + return op_read(regs.s.w); +} + +alwaysinline uint8_t op_readstackn() { + return op_read(++regs.s.w); +} + +alwaysinline uint8_t op_readaddr(uint32_t addr) { + return op_read(addr & 0xffff); +} + +alwaysinline uint8_t op_readlong(uint32_t addr) { + return op_read(addr & 0xffffff); +} + +alwaysinline uint8_t op_readdbr(uint32_t addr) { + return op_read(((regs.db << 16) + addr) & 0xffffff); +} + +alwaysinline uint8_t op_readpbr(uint32_t addr) { + return op_read((regs.pc.b << 16) + (addr & 0xffff)); +} + +alwaysinline uint8_t op_readdp(uint32_t addr) { + if(regs.e && regs.d.l == 0x00) { + return op_read((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff)); + } else { + return op_read((regs.d + (addr & 0xffff)) & 0xffff); + } +} + +alwaysinline uint8_t op_readsp(uint32_t addr) { + return op_read((regs.s + (addr & 0xffff)) & 0xffff); +} + +alwaysinline void op_writestack(uint8_t data) { + op_write(regs.s.w, data); + regs.e ? regs.s.l-- : regs.s.w--; +} + +alwaysinline void op_writestackn(uint8_t data) { + op_write(regs.s.w--, data); +} + +alwaysinline void op_writeaddr(uint32_t addr, uint8_t data) { + op_write(addr & 0xffff, data); +} + +alwaysinline void op_writelong(uint32_t addr, uint8_t data) { + op_write(addr & 0xffffff, data); +} + +alwaysinline void op_writedbr(uint32_t addr, uint8_t data) { + op_write(((regs.db << 16) + addr) & 0xffffff, data); +} + +alwaysinline void op_writepbr(uint32_t addr, uint8_t data) { + op_write((regs.pc.b << 16) + (addr & 0xffff), data); +} + +alwaysinline void op_writedp(uint32_t addr, uint8_t data) { + if(regs.e && regs.d.l == 0x00) { + op_write((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff), data); + } else { + op_write((regs.d + (addr & 0xffff)) & 0xffff, data); + } +} + +alwaysinline void op_writesp(uint32_t addr, uint8_t data) { + op_write((regs.s + (addr & 0xffff)) & 0xffff, data); +} diff --git a/Mednafen/mednafen/snes/src/cpu/core/opcode_misc.cpp b/Mednafen/mednafen/snes/src/cpu/core/opcode_misc.cpp new file mode 100755 index 0000000000..354082a5c2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/opcode_misc.cpp @@ -0,0 +1,352 @@ +#ifdef CPUCORE_CPP + +void CPUcore::op_nop() { +L op_io_irq(); +} + +void CPUcore::op_wdm() { +L op_readpc(); +} + +void CPUcore::op_xba() { + op_io(); +L op_io(); + regs.a.l ^= regs.a.h; + regs.a.h ^= regs.a.l; + regs.a.l ^= regs.a.h; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +template void CPUcore::op_move_b() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.l += adjust; + regs.y.l += adjust; +L op_io(); + if(regs.a.w--) regs.pc.w -= 3; +} + +template void CPUcore::op_move_w() { + dp = op_readpc(); + sp = op_readpc(); + regs.db = dp; + rd.l = op_readlong((sp << 16) | regs.x.w); + op_writelong((dp << 16) | regs.y.w, rd.l); + op_io(); + regs.x.w += adjust; + regs.y.w += adjust; +L op_io(); + if(regs.a.w--) regs.pc.w -= 3; +} + +template void CPUcore::op_interrupt_e() { + op_readpc(); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong(vectorE + 0); + regs.pc.b = 0; + regs.p.i = 1; + regs.p.d = 0; +L rd.h = op_readlong(vectorE + 1); + regs.pc.w = rd.w; +} + +template void CPUcore::op_interrupt_n() { + op_readpc(); + op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.p); + rd.l = op_readlong(vectorN + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; +L rd.h = op_readlong(vectorN + 1); + regs.pc.w = rd.w; +} + +void CPUcore::op_stp() { + while(regs.wai = true) { +L op_io(); + } +} + +void CPUcore::op_wai() { + regs.wai = true; + while(regs.wai) { +L op_io(); + } + op_io(); +} + +void CPUcore::op_xce() { +L op_io_irq(); + bool carry = regs.p.c; + regs.p.c = regs.e; + regs.e = carry; + if(regs.e) { + regs.p |= 0x30; + regs.s.h = 0x01; + } + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); +} + +template void CPUcore::op_flag() { +L op_io_irq(); + regs.p = (regs.p & ~mask) | value; +} + +template void CPUcore::op_pflag_e() { + rd.l = op_readpc(); +L op_io(); + regs.p = (mode ? regs.p | rd.l : regs.p & ~rd.l); + regs.p |= 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); +} + +template void CPUcore::op_pflag_n() { + rd.l = op_readpc(); +L op_io(); + regs.p = (mode ? regs.p | rd.l : regs.p & ~rd.l); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); +} + +template void CPUcore::op_transfer_b() { +L op_io_irq(); + regs.r[to].l = regs.r[from].l; + regs.p.n = (regs.r[to].l & 0x80); + regs.p.z = (regs.r[to].l == 0); +} + +template void CPUcore::op_transfer_w() { +L op_io_irq(); + regs.r[to].w = regs.r[from].w; + regs.p.n = (regs.r[to].w & 0x8000); + regs.p.z = (regs.r[to].w == 0); +} + +void CPUcore::op_tcs_e() { +L op_io_irq(); + regs.s.l = regs.a.l; +} + +void CPUcore::op_tcs_n() { +L op_io_irq(); + regs.s.w = regs.a.w; +} + +void CPUcore::op_tsc_e() { +L op_io_irq(); + regs.a.w = regs.s.w; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void CPUcore::op_tsc_n() { +L op_io_irq(); + regs.a.w = regs.s.w; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void CPUcore::op_tsx_b() { +L op_io_irq(); + regs.x.l = regs.s.l; + regs.p.n = (regs.x.l & 0x80); + regs.p.z = (regs.x.l == 0); +} + +void CPUcore::op_tsx_w() { +L op_io_irq(); + regs.x.w = regs.s.w; + regs.p.n = (regs.x.w & 0x8000); + regs.p.z = (regs.x.w == 0); +} + +void CPUcore::op_txs_e() { +L op_io_irq(); + regs.s.l = regs.x.l; +} + +void CPUcore::op_txs_n() { +L op_io_irq(); + regs.s.w = regs.x.w; +} + +template void CPUcore::op_push_b() { + op_io(); +L op_writestack(regs.r[n].l); +} + +template void CPUcore::op_push_w() { + op_io(); + op_writestack(regs.r[n].h); +L op_writestack(regs.r[n].l); +} + +void CPUcore::op_phd_e() { + op_io(); + op_writestackn(regs.d.h); +L op_writestackn(regs.d.l); + regs.s.h = 0x01; +} + +void CPUcore::op_phd_n() { + op_io(); + op_writestackn(regs.d.h); +L op_writestackn(regs.d.l); +} + +void CPUcore::op_phb() { + op_io(); +L op_writestack(regs.db); +} + +void CPUcore::op_phk() { + op_io(); +L op_writestack(regs.pc.b); +} + +void CPUcore::op_php() { + op_io(); +L op_writestack(regs.p); +} + +template void CPUcore::op_pull_b() { + op_io(); + op_io(); +L regs.r[n].l = op_readstack(); + regs.p.n = (regs.r[n].l & 0x80); + regs.p.z = (regs.r[n].l == 0); +} + +template void CPUcore::op_pull_w() { + op_io(); + op_io(); + regs.r[n].l = op_readstack(); +L regs.r[n].h = op_readstack(); + regs.p.n = (regs.r[n].w & 0x8000); + regs.p.z = (regs.r[n].w == 0); +} + +void CPUcore::op_pld_e() { + op_io(); + op_io(); + regs.d.l = op_readstackn(); +L regs.d.h = op_readstackn(); + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); + regs.s.h = 0x01; +} + +void CPUcore::op_pld_n() { + op_io(); + op_io(); + regs.d.l = op_readstackn(); +L regs.d.h = op_readstackn(); + regs.p.n = (regs.d.w & 0x8000); + regs.p.z = (regs.d.w == 0); +} + +void CPUcore::op_plb() { + op_io(); + op_io(); +L regs.db = op_readstack(); + regs.p.n = (regs.db & 0x80); + regs.p.z = (regs.db == 0); +} + +void CPUcore::op_plp_e() { + op_io(); + op_io(); +L regs.p = op_readstack() | 0x30; + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); +} + +void CPUcore::op_plp_n() { + op_io(); + op_io(); +L regs.p = op_readstack(); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + update_table(); +} + +void CPUcore::op_pea_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(aa.h); +L op_writestackn(aa.l); + regs.s.h = 0x01; +} + +void CPUcore::op_pea_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(aa.h); +L op_writestackn(aa.l); +} + +void CPUcore::op_pei_e() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writestackn(aa.h); +L op_writestackn(aa.l); + regs.s.h = 0x01; +} + +void CPUcore::op_pei_n() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writestackn(aa.h); +L op_writestackn(aa.l); +} + +void CPUcore::op_per_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.w = regs.pc.d + (int16)aa.w; + op_writestackn(rd.h); +L op_writestackn(rd.l); + regs.s.h = 0x01; +} + +void CPUcore::op_per_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.w = regs.pc.d + (int16)aa.w; + op_writestackn(rd.h); +L op_writestackn(rd.l); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/opcode_pc.cpp b/Mednafen/mednafen/snes/src/cpu/core/opcode_pc.cpp new file mode 100755 index 0000000000..3b4543f378 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/opcode_pc.cpp @@ -0,0 +1,181 @@ +#ifdef CPUCORE_CPP + +template void CPUcore::op_branch() { + if((bool)(regs.p & bit) != val) { +L rd.l = op_readpc(); + } else { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8)rd.l; + op_io_cond6(aa.w); +L op_io(); + regs.pc.w = aa.w; + } +} + +void CPUcore::op_bra() { + rd.l = op_readpc(); + aa.w = regs.pc.d + (int8)rd.l; + op_io_cond6(aa.w); +L op_io(); + regs.pc.w = aa.w; +} + +void CPUcore::op_brl() { + rd.l = op_readpc(); + rd.h = op_readpc(); +L op_io(); + regs.pc.w = regs.pc.d + (int16)rd.w; +} + +void CPUcore::op_jmp_addr() { + rd.l = op_readpc(); +L rd.h = op_readpc(); + regs.pc.w = rd.w; +} + +void CPUcore::op_jmp_long() { + rd.l = op_readpc(); + rd.h = op_readpc(); +L rd.b = op_readpc(); + regs.pc.d = rd.d & 0xffffff; +} + +void CPUcore::op_jmp_iaddr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readaddr(aa.w + 0); +L rd.h = op_readaddr(aa.w + 1); + regs.pc.w = rd.w; +} + +void CPUcore::op_jmp_iaddrx() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +L rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; +} + +void CPUcore::op_jmp_iladdr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readaddr(aa.w + 0); + rd.h = op_readaddr(aa.w + 1); +L rd.b = op_readaddr(aa.w + 2); + regs.pc.d = rd.d & 0xffffff; +} + +void CPUcore::op_jsr_addr() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + regs.pc.w--; + op_writestack(regs.pc.h); +L op_writestack(regs.pc.l); + regs.pc.w = aa.w; +} + +void CPUcore::op_jsr_long_e() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(regs.pc.b); + op_io(); + aa.b = op_readpc(); + regs.pc.w--; + op_writestackn(regs.pc.h); +L op_writestackn(regs.pc.l); + regs.pc.d = aa.d & 0xffffff; + regs.s.h = 0x01; +} + +void CPUcore::op_jsr_long_n() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writestackn(regs.pc.b); + op_io(); + aa.b = op_readpc(); + regs.pc.w--; + op_writestackn(regs.pc.h); +L op_writestackn(regs.pc.l); + regs.pc.d = aa.d & 0xffffff; +} + +void CPUcore::op_jsr_iaddrx_e() { + aa.l = op_readpc(); + op_writestackn(regs.pc.h); + op_writestackn(regs.pc.l); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +L rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; + regs.s.h = 0x01; +} + +void CPUcore::op_jsr_iaddrx_n() { + aa.l = op_readpc(); + op_writestackn(regs.pc.h); + op_writestackn(regs.pc.l); + aa.h = op_readpc(); + op_io(); + rd.l = op_readpbr(aa.w + regs.x.w + 0); +L rd.h = op_readpbr(aa.w + regs.x.w + 1); + regs.pc.w = rd.w; +} + +void CPUcore::op_rti_e() { + op_io(); + op_io(); + regs.p = op_readstack() | 0x30; + rd.l = op_readstack(); +L rd.h = op_readstack(); + regs.pc.w = rd.w; +} + +void CPUcore::op_rti_n() { + op_io(); + op_io(); + regs.p = op_readstack(); + if(regs.p.x) { + regs.x.h = 0x00; + regs.y.h = 0x00; + } + rd.l = op_readstack(); + rd.h = op_readstack(); +L rd.b = op_readstack(); + regs.pc.d = rd.d & 0xffffff; + update_table(); +} + +void CPUcore::op_rts() { + op_io(); + op_io(); + rd.l = op_readstack(); + rd.h = op_readstack(); +L op_io(); + regs.pc.w = ++rd.w; +} + +void CPUcore::op_rtl_e() { + op_io(); + op_io(); + rd.l = op_readstackn(); + rd.h = op_readstackn(); +L rd.b = op_readstackn(); + regs.pc.b = rd.b; + regs.pc.w = ++rd.w; + regs.s.h = 0x01; +} + +void CPUcore::op_rtl_n() { + op_io(); + op_io(); + rd.l = op_readstackn(); + rd.h = op_readstackn(); +L rd.b = op_readstackn(); + regs.pc.b = rd.b; + regs.pc.w = ++rd.w; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/opcode_read.cpp b/Mednafen/mednafen/snes/src/cpu/core/opcode_read.cpp new file mode 100755 index 0000000000..d539dbc5a3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/opcode_read.cpp @@ -0,0 +1,279 @@ +#ifdef CPUCORE_CPP + +template void CPUcore::op_read_const_b() { +L rd.l = op_readpc(); + call(op); +} + +template void CPUcore::op_read_const_w() { + rd.l = op_readpc(); +L rd.h = op_readpc(); + call(op); +} + +void CPUcore::op_read_bit_const_b() { +L rd.l = op_readpc(); + regs.p.z = ((rd.l & regs.a.l) == 0); +} + +void CPUcore::op_read_bit_const_w() { + rd.l = op_readpc(); +L rd.h = op_readpc(); + regs.p.z = ((rd.w & regs.a.w) == 0); +} + +template void CPUcore::op_read_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +L rd.l = op_readdbr(aa.w); + call(op); +} + +template void CPUcore::op_read_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); +L rd.h = op_readdbr(aa.w + 1); + call(op); +} + +template void CPUcore::op_read_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); +L rd.l = op_readdbr(aa.w + regs.x.w); + call(op); +} + +template void CPUcore::op_read_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.x.w); + rd.l = op_readdbr(aa.w + regs.x.w + 0); +L rd.h = op_readdbr(aa.w + regs.x.w + 1); + call(op); +} + +template void CPUcore::op_read_addry_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); +L rd.l = op_readdbr(aa.w + regs.y.w); + call(op); +} + +template void CPUcore::op_read_addry_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +L rd.h = op_readdbr(aa.w + regs.y.w + 1); + call(op); +} + +template void CPUcore::op_read_long_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +L rd.l = op_readlong(aa.d); + call(op); +} + +template void CPUcore::op_read_long_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + 0); +L rd.h = op_readlong(aa.d + 1); + call(op); +} + +template void CPUcore::op_read_longx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +L rd.l = op_readlong(aa.d + regs.x.w); + call(op); +} + +template void CPUcore::op_read_longx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + rd.l = op_readlong(aa.d + regs.x.w + 0); +L rd.h = op_readlong(aa.d + regs.x.w + 1); + call(op); +} + +template void CPUcore::op_read_dp_b() { + dp = op_readpc(); + op_io_cond2(); +L rd.l = op_readdp(dp); + call(op); +} + +template void CPUcore::op_read_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); +L rd.h = op_readdp(dp + 1); + call(op); +} + +template void CPUcore::op_read_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +L rd.l = op_readdp(dp + regs.r[n].w); + call(op); +} + +template void CPUcore::op_read_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +L rd.l = op_readdp(dp + regs.r[n].w + 0); + rd.h = op_readdp(dp + regs.r[n].w + 1); + call(op); +} + +template void CPUcore::op_read_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +L rd.l = op_readdbr(aa.w); + call(op); +} + +template void CPUcore::op_read_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + rd.l = op_readdbr(aa.w + 0); +L rd.h = op_readdbr(aa.w + 1); + call(op); +} + +template void CPUcore::op_read_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +L rd.l = op_readdbr(aa.w); + call(op); +} + +template void CPUcore::op_read_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + rd.l = op_readdbr(aa.w + 0); +L rd.h = op_readdbr(aa.w + 1); + call(op); +} + +template void CPUcore::op_read_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); +L rd.l = op_readdbr(aa.w + regs.y.w); + call(op); +} + +template void CPUcore::op_read_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io_cond4(aa.w, aa.w + regs.y.w); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +L rd.h = op_readdbr(aa.w + regs.y.w + 1); + call(op); +} + +template void CPUcore::op_read_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +L rd.l = op_readlong(aa.d); + call(op); +} + +template void CPUcore::op_read_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + 0); +L rd.h = op_readlong(aa.d + 1); + call(op); +} + +template void CPUcore::op_read_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +L rd.l = op_readlong(aa.d + regs.y.w); + call(op); +} + +template void CPUcore::op_read_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + rd.l = op_readlong(aa.d + regs.y.w + 0); +L rd.h = op_readlong(aa.d + regs.y.w + 1); + call(op); +} + +template void CPUcore::op_read_sr_b() { + sp = op_readpc(); + op_io(); +L rd.l = op_readsp(sp); + call(op); +} + +template void CPUcore::op_read_sr_w() { + sp = op_readpc(); + op_io(); + rd.l = op_readsp(sp + 0); +L rd.h = op_readsp(sp + 1); + call(op); +} + +template void CPUcore::op_read_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +L rd.l = op_readdbr(aa.w + regs.y.w); + call(op); +} + +template void CPUcore::op_read_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + rd.l = op_readdbr(aa.w + regs.y.w + 0); +L rd.h = op_readdbr(aa.w + regs.y.w + 1); + call(op); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/opcode_rmw.cpp b/Mednafen/mednafen/snes/src/cpu/core/opcode_rmw.cpp new file mode 100755 index 0000000000..fed939e1c3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/opcode_rmw.cpp @@ -0,0 +1,169 @@ +#ifdef CPUCORE_CPP + +template void CPUcore::op_adjust_imm_b() { +L op_io_irq(); + regs.r[n].l += adjust; + regs.p.n = (regs.r[n].l & 0x80); + regs.p.z = (regs.r[n].l == 0); +} + +template void CPUcore::op_adjust_imm_w() { +L op_io_irq(); + regs.r[n].w += adjust; + regs.p.n = (regs.r[n].w & 0x8000); + regs.p.z = (regs.r[n].w == 0); +} + +void CPUcore::op_asl_imm_b() { +L op_io_irq(); + regs.p.c = (regs.a.l & 0x80); + regs.a.l <<= 1; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void CPUcore::op_asl_imm_w() { +L op_io_irq(); + regs.p.c = (regs.a.w & 0x8000); + regs.a.w <<= 1; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void CPUcore::op_lsr_imm_b() { +L op_io_irq(); + regs.p.c = (regs.a.l & 0x01); + regs.a.l >>= 1; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void CPUcore::op_lsr_imm_w() { +L op_io_irq(); + regs.p.c = (regs.a.w & 0x0001); + regs.a.w >>= 1; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void CPUcore::op_rol_imm_b() { +L op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.l & 0x80); + regs.a.l = (regs.a.l << 1) | carry; + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void CPUcore::op_rol_imm_w() { +L op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.w & 0x8000); + regs.a.w = (regs.a.w << 1) | carry; + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +void CPUcore::op_ror_imm_b() { +L op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.l & 0x01); + regs.a.l = (carry << 7) | (regs.a.l >> 1); + regs.p.n = (regs.a.l & 0x80); + regs.p.z = (regs.a.l == 0); +} + +void CPUcore::op_ror_imm_w() { +L op_io_irq(); + bool carry = regs.p.c; + regs.p.c = (regs.a.w & 0x0001); + regs.a.w = (carry << 15) | (regs.a.w >> 1); + regs.p.n = (regs.a.w & 0x8000); + regs.p.z = (regs.a.w == 0); +} + +template void CPUcore::op_adjust_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w); + op_io(); + call(op); +L op_writedbr(aa.w, rd.l); +} + +template void CPUcore::op_adjust_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + rd.l = op_readdbr(aa.w + 0); + rd.h = op_readdbr(aa.w + 1); + op_io(); + call(op); + op_writedbr(aa.w + 1, rd.h); +L op_writedbr(aa.w + 0, rd.l); +} + +template void CPUcore::op_adjust_addrx_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w); + op_io(); + call(op); +L op_writedbr(aa.w + regs.x.w, rd.l); +} + +template void CPUcore::op_adjust_addrx_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + rd.l = op_readdbr(aa.w + regs.x.w + 0); + rd.h = op_readdbr(aa.w + regs.x.w + 1); + op_io(); + call(op); + op_writedbr(aa.w + regs.x.w + 1, rd.h); +L op_writedbr(aa.w + regs.x.w + 0, rd.l); +} + +template void CPUcore::op_adjust_dp_b() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp); + op_io(); + call(op); +L op_writedp(dp, rd.l); +} + +template void CPUcore::op_adjust_dp_w() { + dp = op_readpc(); + op_io_cond2(); + rd.l = op_readdp(dp + 0); + rd.h = op_readdp(dp + 1); + op_io(); + call(op); + op_writedp(dp + 1, rd.h); +L op_writedp(dp + 0, rd.l); +} + +template void CPUcore::op_adjust_dpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w); + op_io(); + call(op); +L op_writedp(dp + regs.x.w, rd.l); +} + +template void CPUcore::op_adjust_dpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + rd.l = op_readdp(dp + regs.x.w + 0); + rd.h = op_readdp(dp + regs.x.w + 1); + op_io(); + call(op); + op_writedp(dp + regs.x.w + 1, rd.h); +L op_writedp(dp + regs.x.w + 0, rd.l); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/opcode_write.cpp b/Mednafen/mednafen/snes/src/cpu/core/opcode_write.cpp new file mode 100755 index 0000000000..de85e672d3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/opcode_write.cpp @@ -0,0 +1,199 @@ +#ifdef CPUCORE_CPP + +template void CPUcore::op_write_addr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); +L op_writedbr(aa.w, regs.r[n]); +} + +template void CPUcore::op_write_addr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_writedbr(aa.w + 0, regs.r[n] >> 0); +L op_writedbr(aa.w + 1, regs.r[n] >> 8); +} + +template void CPUcore::op_write_addrr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); +L op_writedbr(aa.w + regs.r[i], regs.r[n]); +} + +template void CPUcore::op_write_addrr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + op_io(); + op_writedbr(aa.w + regs.r[i] + 0, regs.r[n] >> 0); +L op_writedbr(aa.w + regs.r[i] + 1, regs.r[n] >> 8); +} + +template void CPUcore::op_write_longr_b() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); +L op_writelong(aa.d + regs.r[i], regs.a.l); +} + +template void CPUcore::op_write_longr_w() { + aa.l = op_readpc(); + aa.h = op_readpc(); + aa.b = op_readpc(); + op_writelong(aa.d + regs.r[i] + 0, regs.a.l); +L op_writelong(aa.d + regs.r[i] + 1, regs.a.h); +} + +template void CPUcore::op_write_dp_b() { + dp = op_readpc(); + op_io_cond2(); +L op_writedp(dp, regs.r[n]); +} + +template void CPUcore::op_write_dp_w() { + dp = op_readpc(); + op_io_cond2(); + op_writedp(dp + 0, regs.r[n] >> 0); +L op_writedp(dp + 1, regs.r[n] >> 8); +} + +template void CPUcore::op_write_dpr_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); +L op_writedp(dp + regs.r[i], regs.r[n]); +} + +template void CPUcore::op_write_dpr_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + op_writedp(dp + regs.r[i] + 0, regs.r[n] >> 0); +L op_writedp(dp + regs.r[i] + 1, regs.r[n] >> 8); +} + +void CPUcore::op_sta_idp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); +L op_writedbr(aa.w, regs.a.l); +} + +void CPUcore::op_sta_idp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_writedbr(aa.w + 0, regs.a.l); +L op_writedbr(aa.w + 1, regs.a.h); +} + +void CPUcore::op_sta_ildp_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +L op_writelong(aa.d, regs.a.l); +} + +void CPUcore::op_sta_ildp_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + op_writelong(aa.d + 0, regs.a.l); +L op_writelong(aa.d + 1, regs.a.h); +} + +void CPUcore::op_sta_idpx_b() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); +L op_writedbr(aa.w, regs.a.l); +} + +void CPUcore::op_sta_idpx_w() { + dp = op_readpc(); + op_io_cond2(); + op_io(); + aa.l = op_readdp(dp + regs.x.w + 0); + aa.h = op_readdp(dp + regs.x.w + 1); + op_writedbr(aa.w + 0, regs.a.l); +L op_writedbr(aa.w + 1, regs.a.h); +} + +void CPUcore::op_sta_idpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io(); +L op_writedbr(aa.w + regs.y.w, regs.a.l); +} + +void CPUcore::op_sta_idpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.l); +L op_writedbr(aa.w + regs.y.w + 1, regs.a.h); +} + +void CPUcore::op_sta_ildpy_b() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); +L op_writelong(aa.d + regs.y.w, regs.a.l); +} + +void CPUcore::op_sta_ildpy_w() { + dp = op_readpc(); + op_io_cond2(); + aa.l = op_readdp(dp + 0); + aa.h = op_readdp(dp + 1); + aa.b = op_readdp(dp + 2); + op_writelong(aa.d + regs.y.w + 0, regs.a.l); +L op_writelong(aa.d + regs.y.w + 1, regs.a.h); +} + +void CPUcore::op_sta_sr_b() { + sp = op_readpc(); + op_io(); +L op_writesp(sp, regs.a.l); +} + +void CPUcore::op_sta_sr_w() { + sp = op_readpc(); + op_io(); + op_writesp(sp + 0, regs.a.l); +L op_writesp(sp + 1, regs.a.h); +} + +void CPUcore::op_sta_isry_b() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); +L op_writedbr(aa.w + regs.y.w, regs.a.l); +} + +void CPUcore::op_sta_isry_w() { + sp = op_readpc(); + op_io(); + aa.l = op_readsp(sp + 0); + aa.h = op_readsp(sp + 1); + op_io(); + op_writedbr(aa.w + regs.y.w + 0, regs.a.l); +L op_writedbr(aa.w + regs.y.w + 1, regs.a.h); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/registers.hpp b/Mednafen/mednafen/snes/src/cpu/core/registers.hpp new file mode 100755 index 0000000000..79db4ff840 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/registers.hpp @@ -0,0 +1,92 @@ +struct flag_t { + bool n, v, m, x, d, i, z, c; + + inline operator unsigned() const { + return (n << 7) + (v << 6) + (m << 5) + (x << 4) + + (d << 3) + (i << 2) + (z << 1) + (c << 0); + } + + inline unsigned operator=(uint8 data) { + n = data & 0x80; v = data & 0x40; m = data & 0x20; x = data & 0x10; + d = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01; + return data; + } + + inline unsigned operator|=(unsigned data) { return operator=(operator unsigned() | data); } + inline unsigned operator^=(unsigned data) { return operator=(operator unsigned() ^ data); } + inline unsigned operator&=(unsigned data) { return operator=(operator unsigned() & data); } + + flag_t() : n(0), v(0), m(0), x(0), d(0), i(0), z(0), c(0) {} +}; + +struct reg16_noinit_t { + union { + uint16 w; + struct { uint8 order_lsb2(l, h); }; + }; + + inline operator unsigned() const { return w; } + inline unsigned operator = (unsigned i) { return w = i; } + inline unsigned operator |= (unsigned i) { return w |= i; } + inline unsigned operator ^= (unsigned i) { return w ^= i; } + inline unsigned operator &= (unsigned i) { return w &= i; } + inline unsigned operator <<= (unsigned i) { return w <<= i; } + inline unsigned operator >>= (unsigned i) { return w >>= i; } + inline unsigned operator += (unsigned i) { return w += i; } + inline unsigned operator -= (unsigned i) { return w -= i; } + inline unsigned operator *= (unsigned i) { return w *= i; } + inline unsigned operator /= (unsigned i) { return w /= i; } + inline unsigned operator %= (unsigned i) { return w %= i; } +}; + +struct reg24_t { + union { + uint32 d; + struct { uint16 order_lsb2(w, wh); }; + struct { uint8 order_lsb4(l, h, b, bh); }; + }; + + inline operator unsigned() const { return d; } + inline unsigned operator = (unsigned i) { return d = uclip<24>(i); } + inline unsigned operator |= (unsigned i) { return d = uclip<24>(d | i); } + inline unsigned operator ^= (unsigned i) { return d = uclip<24>(d ^ i); } + inline unsigned operator &= (unsigned i) { return d = uclip<24>(d & i); } + inline unsigned operator <<= (unsigned i) { return d = uclip<24>(d << i); } + inline unsigned operator >>= (unsigned i) { return d = uclip<24>(d >> i); } + inline unsigned operator += (unsigned i) { return d = uclip<24>(d + i); } + inline unsigned operator -= (unsigned i) { return d = uclip<24>(d - i); } + inline unsigned operator *= (unsigned i) { return d = uclip<24>(d * i); } + inline unsigned operator /= (unsigned i) { return d = uclip<24>(d / i); } + inline unsigned operator %= (unsigned i) { return d = uclip<24>(d % i); } + + reg24_t() : d(0) {} +}; + +struct regs_t { + reg24_t pc; + union + { + reg16_noinit_t r[6]; + struct + { + reg16_noinit_t a, x, y, z, s, d; + }; + }; + flag_t p; + uint8 db; + bool e; + + bool irq; //IRQ pin (0 = low, 1 = trigger) + bool wai; //raised during wai, cleared after interrupt triggered + uint8 mdr; //memory data register + + regs_t() : db(0), e(false), irq(false), wai(false), mdr(0) { + r[0] = 0; + r[1] = 0; + r[2] = 0; + r[3] = 0; + r[4] = 0; + r[5] = 0; + z = 0; + } +}; diff --git a/Mednafen/mednafen/snes/src/cpu/core/serialization.cpp b/Mednafen/mednafen/snes/src/cpu/core/serialization.cpp new file mode 100755 index 0000000000..d53a3fd3dd --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/serialization.cpp @@ -0,0 +1,36 @@ +#ifdef CPUCORE_CPP + +void CPUcore::core_serialize(serializer &s) { + s.integer(regs.pc); //.d); + + s.integer(regs.a.w); + s.integer(regs.x.w); + s.integer(regs.y.w); + s.integer(regs.z.w); + s.integer(regs.s.w); + s.integer(regs.d.w); + + s.integer(regs.p.n); + s.integer(regs.p.v); + s.integer(regs.p.m); + s.integer(regs.p.x); + s.integer(regs.p.d); + s.integer(regs.p.i); + s.integer(regs.p.z); + s.integer(regs.p.c); + + s.integer(regs.db); + s.integer(regs.e); + s.integer(regs.irq); + s.integer(regs.wai); + s.integer(regs.mdr); + + s.integer(aa); //.d); + s.integer(rd); //.d); + s.integer(sp); + s.integer(dp); + + update_table(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/core/table.cpp b/Mednafen/mednafen/snes/src/cpu/core/table.cpp new file mode 100755 index 0000000000..2ed22be74d --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/core/table.cpp @@ -0,0 +1,312 @@ +#ifdef CPUCORE_CPP + +void CPUcore::initialize_opcode_table() { + #define opA( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name; + #define opAII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name; + #define opE( id, name ) op_table[table_EM + id] = &CPUcore::op_##name##_e; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n; + #define opEI( id, name, x ) op_table[table_EM + id] = &CPUcore::op_##name##_e; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n; + #define opEII(id, name, x, y ) op_table[table_EM + id] = &CPUcore::op_##name##_e; op_table[table_MX + id] = op_table[table_Mx + id] = op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_n; + #define opM( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w; + #define opMI( id, name, x ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w; + #define opMII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w; + #define opMF( id, name, fn ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>; + #define opMFI(id, name, fn, x) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_Mx + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_mX + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>; + #define opX( id, name ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w; + #define opXI( id, name, x ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w; + #define opXII(id, name, x, y ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w; + #define opXF( id, name, fn ) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w>; + #define opXFI(id, name, fn, x) op_table[table_EM + id] = op_table[table_MX + id] = op_table[table_mX + id] = &CPUcore::op_##name##_b<&CPUcore::op_##fn##_b, x>; op_table[table_Mx + id] = op_table[table_mx + id] = &CPUcore::op_##name##_w<&CPUcore::op_##fn##_w, x>; + + opEII(0x00, interrupt, 0xfffe, 0xffe6) + opMF (0x01, read_idpx, ora) + opEII(0x02, interrupt, 0xfff4, 0xffe4) + opMF (0x03, read_sr, ora) + opMF (0x04, adjust_dp, tsb) + opMF (0x05, read_dp, ora) + opMF (0x06, adjust_dp, asl) + opMF (0x07, read_ildp, ora) + opA (0x08, php) + opMF (0x09, read_const, ora) + opM (0x0a, asl_imm) + opE (0x0b, phd) + opMF (0x0c, adjust_addr, tsb) + opMF (0x0d, read_addr, ora) + opMF (0x0e, adjust_addr, asl) + opMF (0x0f, read_long, ora) + opAII(0x10, branch, 0x80, false) + opMF (0x11, read_idpy, ora) + opMF (0x12, read_idp, ora) + opMF (0x13, read_isry, ora) + opMF (0x14, adjust_dp, trb) + opMFI(0x15, read_dpr, ora, X) + opMF (0x16, adjust_dpx, asl) + opMF (0x17, read_ildpy, ora) + opAII(0x18, flag, 0x01, 0x00) + opMF (0x19, read_addry, ora) + opMII(0x1a, adjust_imm, A, +1) + opE (0x1b, tcs) + opMF (0x1c, adjust_addr, trb) + opMF (0x1d, read_addrx, ora) + opMF (0x1e, adjust_addrx, asl) + opMF (0x1f, read_longx, ora) + opA (0x20, jsr_addr) + opMF (0x21, read_idpx, and) + opE (0x22, jsr_long) + opMF (0x23, read_sr, and) + opMF (0x24, read_dp, bit) + opMF (0x25, read_dp, and) + opMF (0x26, adjust_dp, rol) + opMF (0x27, read_ildp, and) + opE (0x28, plp) + opMF (0x29, read_const, and) + opM (0x2a, rol_imm) + opE (0x2b, pld) + opMF (0x2c, read_addr, bit) + opMF (0x2d, read_addr, and) + opMF (0x2e, adjust_addr, rol) + opMF (0x2f, read_long, and) + opAII(0x30, branch, 0x80, true) + opMF (0x31, read_idpy, and) + opMF (0x32, read_idp, and) + opMF (0x33, read_isry, and) + opMFI(0x34, read_dpr, bit, X) + opMFI(0x35, read_dpr, and, X) + opMF (0x36, adjust_dpx, rol) + opMF (0x37, read_ildpy, and) + opAII(0x38, flag, 0x01, 0x01) + opMF (0x39, read_addry, and) + opMII(0x3a, adjust_imm, A, -1) + opE (0x3b, tsc) + opMF (0x3c, read_addrx, bit) + opMF (0x3d, read_addrx, and) + opMF (0x3e, adjust_addrx, rol) + opMF (0x3f, read_longx, and) + opE (0x40, rti) + opMF (0x41, read_idpx, eor) + opA (0x42, wdm) + opMF (0x43, read_sr, eor) + opXI (0x44, move, -1) + opMF (0x45, read_dp, eor) + opMF (0x46, adjust_dp, lsr) + opMF (0x47, read_ildp, eor) + opMI (0x48, push, A) + opMF (0x49, read_const, eor) + opM (0x4a, lsr_imm) + opA (0x4b, phk) + opA (0x4c, jmp_addr) + opMF (0x4d, read_addr, eor) + opMF (0x4e, adjust_addr, lsr) + opMF (0x4f, read_long, eor) + opAII(0x50, branch, 0x40, false) + opMF (0x51, read_idpy, eor) + opMF (0x52, read_idp, eor) + opMF (0x53, read_isry, eor) + opXI (0x54, move, +1) + opMFI(0x55, read_dpr, eor, X) + opMF (0x56, adjust_dpx, lsr) + opMF (0x57, read_ildpy, eor) + opAII(0x58, flag, 0x04, 0x00) + opMF (0x59, read_addry, eor) + opXI (0x5a, push, Y) + opAII(0x5b, transfer_w, A, D) + opA (0x5c, jmp_long) + opMF (0x5d, read_addrx, eor) + opMF (0x5e, adjust_addrx, lsr) + opMF (0x5f, read_longx, eor) + opA (0x60, rts) + opMF (0x61, read_idpx, adc) + opE (0x62, per) + opMF (0x63, read_sr, adc) + opMI (0x64, write_dp, Z) + opMF (0x65, read_dp, adc) + opMF (0x66, adjust_dp, ror) + opMF (0x67, read_ildp, adc) + opMI (0x68, pull, A) + opMF (0x69, read_const, adc) + opM (0x6a, ror_imm) + opE (0x6b, rtl) + opA (0x6c, jmp_iaddr) + opMF (0x6d, read_addr, adc) + opMF (0x6e, adjust_addr, ror) + opMF (0x6f, read_long, adc) + opAII(0x70, branch, 0x40, true) + opMF (0x71, read_idpy, adc) + opMF (0x72, read_idp, adc) + opMF (0x73, read_isry, adc) + opMII(0x74, write_dpr, Z, X) + opMFI(0x75, read_dpr, adc, X) + opMF (0x76, adjust_dpx, ror) + opMF (0x77, read_ildpy, adc) + opAII(0x78, flag, 0x04, 0x04) + opMF (0x79, read_addry, adc) + opXI (0x7a, pull, Y) + opAII(0x7b, transfer_w, D, A) + opA (0x7c, jmp_iaddrx) + opMF (0x7d, read_addrx, adc) + opMF (0x7e, adjust_addrx, ror) + opMF (0x7f, read_longx, adc) + opA (0x80, bra) + opM (0x81, sta_idpx) + opA (0x82, brl) + opM (0x83, sta_sr) + opXI (0x84, write_dp, Y) + opMI (0x85, write_dp, A) + opXI (0x86, write_dp, X) + opM (0x87, sta_ildp) + opXII(0x88, adjust_imm, Y, -1) + opM (0x89, read_bit_const) + opMII(0x8a, transfer, X, A) + opA (0x8b, phb) + opXI (0x8c, write_addr, Y) + opMI (0x8d, write_addr, A) + opXI (0x8e, write_addr, X) + opMI (0x8f, write_longr, Z) + opAII(0x90, branch, 0x01, false) + opM (0x91, sta_idpy) + opM (0x92, sta_idp) + opM (0x93, sta_isry) + opXII(0x94, write_dpr, Y, X) + opMII(0x95, write_dpr, A, X) + opXII(0x96, write_dpr, X, Y) + opM (0x97, sta_ildpy) + opMII(0x98, transfer, Y, A) + opMII(0x99, write_addrr, A, Y) + opE (0x9a, txs) + opXII(0x9b, transfer, X, Y) + opMI (0x9c, write_addr, Z) + opMII(0x9d, write_addrr, A, X) + opMII(0x9e, write_addrr, Z, X) + opMI (0x9f, write_longr, X) + opXF (0xa0, read_const, ldy) + opMF (0xa1, read_idpx, lda) + opXF (0xa2, read_const, ldx) + opMF (0xa3, read_sr, lda) + opXF (0xa4, read_dp, ldy) + opMF (0xa5, read_dp, lda) + opXF (0xa6, read_dp, ldx) + opMF (0xa7, read_ildp, lda) + opXII(0xa8, transfer, A, Y) + opMF (0xa9, read_const, lda) + opXII(0xaa, transfer, A, X) + opA (0xab, plb) + opXF (0xac, read_addr, ldy) + opMF (0xad, read_addr, lda) + opXF (0xae, read_addr, ldx) + opMF (0xaf, read_long, lda) + opAII(0xb0, branch, 0x01, true) + opMF (0xb1, read_idpy, lda) + opMF (0xb2, read_idp, lda) + opMF (0xb3, read_isry, lda) + opXFI(0xb4, read_dpr, ldy, X) + opMFI(0xb5, read_dpr, lda, X) + opXFI(0xb6, read_dpr, ldx, Y) + opMF (0xb7, read_ildpy, lda) + opAII(0xb8, flag, 0x40, 0x00) + opMF (0xb9, read_addry, lda) + opX (0xba, tsx) + opXII(0xbb, transfer, Y, X) + opXF (0xbc, read_addrx, ldy) + opMF (0xbd, read_addrx, lda) + opXF (0xbe, read_addry, ldx) + opMF (0xbf, read_longx, lda) + opXF (0xc0, read_const, cpy) + opMF (0xc1, read_idpx, cmp) + opEI (0xc2, pflag, 0) + opMF (0xc3, read_sr, cmp) + opXF (0xc4, read_dp, cpy) + opMF (0xc5, read_dp, cmp) + opMF (0xc6, adjust_dp, dec) + opMF (0xc7, read_ildp, cmp) + opXII(0xc8, adjust_imm, Y, +1) + opMF (0xc9, read_const, cmp) + opXII(0xca, adjust_imm, X, -1) + opA (0xcb, wai) + opXF (0xcc, read_addr, cpy) + opMF (0xcd, read_addr, cmp) + opMF (0xce, adjust_addr, dec) + opMF (0xcf, read_long, cmp) + opAII(0xd0, branch, 0x02, false) + opMF (0xd1, read_idpy, cmp) + opMF (0xd2, read_idp, cmp) + opMF (0xd3, read_isry, cmp) + opE (0xd4, pei) + opMFI(0xd5, read_dpr, cmp, X) + opMF (0xd6, adjust_dpx, dec) + opMF (0xd7, read_ildpy, cmp) + opAII(0xd8, flag, 0x08, 0x00) + opMF (0xd9, read_addry, cmp) + opXI (0xda, push, X) + opA (0xdb, stp) + opA (0xdc, jmp_iladdr) + opMF (0xdd, read_addrx, cmp) + opMF (0xde, adjust_addrx, dec) + opMF (0xdf, read_longx, cmp) + opXF (0xe0, read_const, cpx) + opMF (0xe1, read_idpx, sbc) + opEI (0xe2, pflag, 1) + opMF (0xe3, read_sr, sbc) + opXF (0xe4, read_dp, cpx) + opMF (0xe5, read_dp, sbc) + opMF (0xe6, adjust_dp, inc) + opMF (0xe7, read_ildp, sbc) + opXII(0xe8, adjust_imm, X, +1) + opMF (0xe9, read_const, sbc) + opA (0xea, nop) + opA (0xeb, xba) + opXF (0xec, read_addr, cpx) + opMF (0xed, read_addr, sbc) + opMF (0xee, adjust_addr, inc) + opMF (0xef, read_long, sbc) + opAII(0xf0, branch, 0x02, true) + opMF (0xf1, read_idpy, sbc) + opMF (0xf2, read_idp, sbc) + opMF (0xf3, read_isry, sbc) + opE (0xf4, pea) + opMFI(0xf5, read_dpr, sbc, X) + opMF (0xf6, adjust_dpx, inc) + opMF (0xf7, read_ildpy, sbc) + opAII(0xf8, flag, 0x08, 0x08) + opMF (0xf9, read_addry, sbc) + opXI (0xfa, pull, X) + opA (0xfb, xce) + opE (0xfc, jsr_iaddrx) + opMF (0xfd, read_addrx, sbc) + opMF (0xfe, adjust_addrx, inc) + opMF (0xff, read_longx, sbc) + + #undef opA + #undef opAII + #undef opE + #undef opEI + #undef opEII + #undef opM + #undef opMI + #undef opMII + #undef opMF + #undef opMFI + #undef opX + #undef opXI + #undef opXII + #undef opXF + #undef opXFI +} + +void CPUcore::update_table() { + if(regs.e) { + opcode_table = &op_table[table_EM]; + } else if(regs.p.m) { + if(regs.p.x) { + opcode_table = &op_table[table_MX]; + } else { + opcode_table = &op_table[table_Mx]; + } + } else { + if(regs.p.x) { + opcode_table = &op_table[table_mX]; + } else { + opcode_table = &op_table[table_mx]; + } + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/cpu.cpp b/Mednafen/mednafen/snes/src/cpu/cpu.cpp new file mode 100755 index 0000000000..45fb86cb0c --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/cpu.cpp @@ -0,0 +1,29 @@ +#include <../base.hpp> + +#define CPU_CPP +namespace bSNES_v059 { + +#if defined(DEBUGGER) + #include "cpu-debugger.cpp" +#endif + +void CPU::power() { + cpu_version = config.cpu.version; +} + +void CPU::reset() { + PPUcounter::reset(); +} + +void CPU::serialize(serializer &s) { + PPUcounter::serialize(s); + s.integer(cpu_version); +} + +CPU::CPU() { +} + +CPU::~CPU() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/cpu/cpu.hpp b/Mednafen/mednafen/snes/src/cpu/cpu.hpp new file mode 100755 index 0000000000..654c8c6d60 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/cpu.hpp @@ -0,0 +1,27 @@ +#if defined(DEBUGGER) + #include "cpu-debugger.hpp" +#endif + +class CPU : public PPUcounter, public MMIO { +public: + virtual void enter() = 0; + + //CPU version number + //* 1 and 2 are known + //* reported by $4210 + //* affects timing (DRAM refresh, HDMA init, etc) + uint8 cpu_version; + + virtual uint8 pio() = 0; + virtual bool joylatch() = 0; + virtual uint8 port_read(uint8 port) = 0; + virtual void port_write(uint8 port, uint8 value) = 0; + + virtual void scanline() = 0; + virtual void power(); + virtual void reset(); + + virtual void serialize(serializer&); + CPU(); + virtual ~CPU(); +}; diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/debugger/debugger.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/debugger/debugger.cpp new file mode 100755 index 0000000000..5edb61682c --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/debugger/debugger.cpp @@ -0,0 +1,88 @@ +#ifdef SCPU_CPP + +void sCPUDebugger::op_step() { + bool break_event = false; + + usage[regs.pc] &= ~(UsageFlagM | UsageFlagX); + usage[regs.pc] |= UsageExec | (regs.p.m << 1) | (regs.p.x << 0); + opcode_pc = regs.pc; + + if(debugger.step_cpu) { + debugger.break_event = Debugger::CPUStep; + scheduler.exit(Scheduler::DebuggerEvent); + } else { + debugger.breakpoint_test(Debugger::Breakpoint::CPUBus, Debugger::Breakpoint::Exec, regs.pc, 0x00); + } + + if(step_event) step_event(); + sCPU::op_step(); + scheduler.sync_cpusmp(); +} + +uint8 sCPUDebugger::op_read(uint32 addr) { + uint8 data = sCPU::op_read(addr); + usage[addr] |= UsageRead; + debugger.breakpoint_test(Debugger::Breakpoint::CPUBus, Debugger::Breakpoint::Read, addr, data); + return data; +} + +void sCPUDebugger::op_write(uint32 addr, uint8 data) { + sCPU::op_write(addr, data); + usage[addr] |= UsageWrite; + usage[addr] &= ~UsageExec; + debugger.breakpoint_test(Debugger::Breakpoint::CPUBus, Debugger::Breakpoint::Write, addr, data); +} + +sCPUDebugger::sCPUDebugger() { + usage = new uint8[1 << 24](); + opcode_pc = 0x8000; +} + +sCPUDebugger::~sCPUDebugger() { + delete[] usage; +} + +//=========== +//CPUDebugger +//=========== + +//internal +unsigned sCPUDebugger::mdr() { return regs.mdr; } + +//$2181-$2183 +unsigned sCPUDebugger::wram_address() { return status.wram_addr; } + +//$4016 +bool sCPUDebugger::joypad_strobe_latch() { return status.joypad_strobe_latch; } + +//$4200 +bool sCPUDebugger::nmi_enable() { return status.nmi_enabled; } +bool sCPUDebugger::hirq_enable() { return status.hirq_enabled; } +bool sCPUDebugger::virq_enable() { return status.virq_enabled; } +bool sCPUDebugger::auto_joypad_poll() { return status.auto_joypad_poll; } + +//$4201 +unsigned sCPUDebugger::pio_bits() { return status.pio; } + +//$4202 +unsigned sCPUDebugger::multiplicand() { return status.mul_a; } + +//$4203 +unsigned sCPUDebugger::multiplier() { return status.mul_b; } + +//$4204-$4205 +unsigned sCPUDebugger::dividend() { return status.div_a; } + +//$4206 +unsigned sCPUDebugger::divisor() { return status.div_b; } + +//$4207-$4208 +unsigned sCPUDebugger::htime() { return status.hirq_pos; } + +//$4209-$420a +unsigned sCPUDebugger::vtime() { return status.virq_pos; } + +//$420d +bool sCPUDebugger::fastrom_enable() { return status.rom_speed; } + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/debugger/debugger.hpp b/Mednafen/mednafen/snes/src/cpu/scpu/debugger/debugger.hpp new file mode 100755 index 0000000000..c3e1d1e37e --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/debugger/debugger.hpp @@ -0,0 +1,64 @@ +class sCPUDebugger : public sCPU, public CPUDebugger { +public: + function step_event; + + enum Usage { + UsageRead = 0x80, + UsageWrite = 0x40, + UsageExec = 0x20, + UsageFlagM = 0x02, + UsageFlagX = 0x01, + }; + uint8 *usage; + uint32 opcode_pc; //points to the current opcode, used to backtrace on read/write breakpoints + + void op_step(); + uint8 op_read(uint32 addr); + void op_write(uint32 addr, uint8 data); + + sCPUDebugger(); + ~sCPUDebugger(); + + //=========== + //CPUDebugger + //=========== + + //internal + unsigned mdr(); + + //$2181-$2183 + unsigned wram_address(); + + //$4016 + bool joypad_strobe_latch(); + + //$4200 + bool nmi_enable(); + bool hirq_enable(); + bool virq_enable(); + bool auto_joypad_poll(); + + //$4201 + unsigned pio_bits(); + + //$4202 + unsigned multiplicand(); + + //$4203 + unsigned multiplier(); + + //$4204-$4205 + unsigned dividend(); + + //$4206 + unsigned divisor(); + + //$4207-$4208 + unsigned htime(); + + //$4209-$420a + unsigned vtime(); + + //$420d + bool fastrom_enable(); +}; diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/dma/dma.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/dma/dma.cpp new file mode 100755 index 0000000000..02e238fb77 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/dma/dma.cpp @@ -0,0 +1,272 @@ +#ifdef SCPU_CPP + +void sCPU::dma_add_clocks(unsigned clocks) { + status.dma_clocks += clocks; + add_clocks(clocks); + scheduler.sync_cpucop(); + scheduler.sync_cpuppu(); +} + +bool sCPU::dma_addr_valid(uint32 abus) { + //reads from B-bus or S-CPU registers are invalid + if((abus & 0x40ff00) == 0x2100) return false; //$[00-3f|80-bf]:[2100-21ff] + if((abus & 0x40fe00) == 0x4000) return false; //$[00-3f|80-bf]:[4000-41ff] + if((abus & 0x40ffe0) == 0x4200) return false; //$[00-3f|80-bf]:[4200-421f] + if((abus & 0x40ff80) == 0x4300) return false; //$[00-3f|80-bf]:[4300-437f] + return true; +} + +uint8 sCPU::dma_read(uint32 abus) { + if(dma_addr_valid(abus) == false) return 0x00; //does not return S-CPU MDR + return bus.read(abus); +} + +void sCPU::dma_transfer(bool direction, uint8 bbus, uint32 abus) { + if(direction == 0) { + //a->b transfer (to $21xx) + if(bbus == 0x80 && ((abus & 0xfe0000) == 0x7e0000 || (abus & 0x40e000) == 0x0000)) { + //illegal WRAM->WRAM transfer (bus conflict) + //read most likely occurs; no write occurs + //read is irrelevent, as it cannot be observed by software + dma_add_clocks(8); + } else { + dma_add_clocks(4); + uint8 data = dma_read(abus); + dma_add_clocks(4); + bus.write(0x2100 | bbus, data); + } + } else { + //b->a transfer (from $21xx) + if(bbus == 0x80 && ((abus & 0xfe0000) == 0x7e0000 || (abus & 0x40e000) == 0x0000)) { + //illegal WRAM->WRAM transfer (bus conflict) + //no read occurs; write does occur + dma_add_clocks(8); + bus.write(abus, 0x00); //does not write S-CPU MDR + } else { + dma_add_clocks(4); + uint8 data = bus.read(0x2100 | bbus); + dma_add_clocks(4); + if(dma_addr_valid(abus) == true) { + bus.write(abus, data); + } + } + } +} + +/***** + * address calculation functions + *****/ + +uint8 sCPU::dma_bbus(uint8 i, uint8 index) { + switch(channel[i].xfermode) { default: + case 0: return (channel[i].destaddr); //0 + case 1: return (channel[i].destaddr + (index & 1)); //0,1 + case 2: return (channel[i].destaddr); //0,0 + case 3: return (channel[i].destaddr + ((index >> 1) & 1)); //0,0,1,1 + case 4: return (channel[i].destaddr + (index & 3)); //0,1,2,3 + case 5: return (channel[i].destaddr + (index & 1)); //0,1,0,1 + case 6: return (channel[i].destaddr); //0,0 [2] + case 7: return (channel[i].destaddr + ((index >> 1) & 1)); //0,0,1,1 [3] + } +} + +inline uint32 sCPU::dma_addr(uint8 i) { + uint32 r = (channel[i].srcbank << 16) | (channel[i].srcaddr); + + if(channel[i].fixedxfer == false) { + if(channel[i].reversexfer == false) { + channel[i].srcaddr++; + } else { + channel[i].srcaddr--; + } + } + + return r; +} + +inline uint32 sCPU::hdma_addr(uint8 i) { + return (channel[i].srcbank << 16) | (channel[i].hdma_addr++); +} + +inline uint32 sCPU::hdma_iaddr(uint8 i) { + return (channel[i].hdma_ibank << 16) | (channel[i].hdma_iaddr++); +} + +/***** + * DMA functions + *****/ + +uint8 sCPU::dma_enabled_channels() { + uint8 r = 0; + for(unsigned i = 0; i < 8; i++) { + if(channel[i].dma_enabled) r++; + } + return r; +} + +void sCPU::dma_run() { + dma_add_clocks(8); + cycle_edge(); + + for(unsigned i = 0; i < 8; i++) { + if(channel[i].dma_enabled == false) continue; + dma_add_clocks(8); + cycle_edge(); + + unsigned index = 0; + do { + dma_transfer(channel[i].direction, dma_bbus(i, index++), dma_addr(i)); + cycle_edge(); + } while(channel[i].dma_enabled && --channel[i].xfersize); + + channel[i].dma_enabled = false; + } + + status.irq_lock = true; + event.enqueue(2, EventIrqLockRelease); +} + +/***** + * HDMA functions + *****/ + +inline bool sCPU::hdma_active(uint8 i) { + return (channel[i].hdma_enabled && !channel[i].hdma_completed); +} + +inline bool sCPU::hdma_active_after(uint8 i) { + for(unsigned n = i + 1; n < 8; n++) { + if(hdma_active(n) == true) return true; + } + return false; +} + +inline uint8 sCPU::hdma_enabled_channels() { + uint8 r = 0; + for(unsigned i = 0; i < 8; i++) { + if(channel[i].hdma_enabled) r++; + } + return r; +} + +inline uint8 sCPU::hdma_active_channels() { + uint8 r = 0; + for(unsigned i = 0; i < 8; i++) { + if(hdma_active(i) == true) r++; + } + return r; +} + +void sCPU::hdma_update(uint8 i) { + channel[i].hdma_line_counter = dma_read(hdma_addr(i)); + dma_add_clocks(8); + + channel[i].hdma_completed = (channel[i].hdma_line_counter == 0); + channel[i].hdma_do_transfer = !channel[i].hdma_completed; + + if(channel[i].hdma_indirect) { + channel[i].hdma_iaddr = dma_read(hdma_addr(i)) << 8; + dma_add_clocks(8); + + if(!channel[i].hdma_completed || hdma_active_after(i)) { + channel[i].hdma_iaddr >>= 8; + channel[i].hdma_iaddr |= dma_read(hdma_addr(i)) << 8; + dma_add_clocks(8); + } + } +} + +void sCPU::hdma_run() { + dma_add_clocks(8); + + for(unsigned i = 0; i < 8; i++) { + if(hdma_active(i) == false) continue; + channel[i].dma_enabled = false; //HDMA run during DMA will stop DMA mid-transfer + + if(channel[i].hdma_do_transfer) { + static const unsigned transfer_length[8] = { 1, 2, 2, 4, 4, 4, 2, 4 }; + unsigned length = transfer_length[channel[i].xfermode]; + for(unsigned index = 0; index < length; index++) { + unsigned addr = !channel[i].hdma_indirect ? hdma_addr(i) : hdma_iaddr(i); + dma_transfer(channel[i].direction, dma_bbus(i, index), addr); + } + } + } + + for(unsigned i = 0; i < 8; i++) { + if(hdma_active(i) == false) continue; + + channel[i].hdma_line_counter--; + channel[i].hdma_do_transfer = bool(channel[i].hdma_line_counter & 0x80); + if((channel[i].hdma_line_counter & 0x7f) == 0) { + hdma_update(i); + } else { + dma_add_clocks(8); + } + } + + status.irq_lock = true; + event.enqueue(2, EventIrqLockRelease); +} + +void sCPU::hdma_init_reset() { + for(unsigned i = 0; i < 8; i++) { + channel[i].hdma_completed = false; + channel[i].hdma_do_transfer = false; + } +} + +void sCPU::hdma_init() { + dma_add_clocks(8); + + for(unsigned i = 0; i < 8; i++) { + if(!channel[i].hdma_enabled) continue; + channel[i].dma_enabled = false; //HDMA init during DMA will stop DMA mid-transfer + + channel[i].hdma_addr = channel[i].srcaddr; + hdma_update(i); + } + + status.irq_lock = true; + event.enqueue(2, EventIrqLockRelease); +} + +/***** + * power / reset functions + *****/ + +void sCPU::dma_power() { + for(unsigned i = 0; i < 8; i++) { + channel[i].dmap = 0xff; + channel[i].direction = 1; + channel[i].hdma_indirect = true; + channel[i].reversexfer = true; + channel[i].fixedxfer = true; + channel[i].xfermode = 7; + + channel[i].destaddr = 0xff; + + channel[i].srcaddr = 0xffff; + channel[i].srcbank = 0xff; + + channel[i].xfersize = 0xffff; + //channel[i].hdma_iaddr = 0xffff; //union with xfersize + channel[i].hdma_ibank = 0xff; + + channel[i].hdma_addr = 0xffff; + channel[i].hdma_line_counter = 0xff; + channel[i].unknown = 0xff; + } +} + +void sCPU::dma_reset() { + for(unsigned i = 0; i < 8; i++) { + channel[i].dma_enabled = false; + channel[i].hdma_enabled = false; + + channel[i].hdma_completed = false; + channel[i].hdma_do_transfer = false; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/dma/dma.hpp b/Mednafen/mednafen/snes/src/cpu/scpu/dma/dma.hpp new file mode 100755 index 0000000000..5ebfdb0037 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/dma/dma.hpp @@ -0,0 +1,71 @@ + struct { + //$420b + bool dma_enabled; + + //$420c + bool hdma_enabled; + + //$43x0 + uint8 dmap; + bool direction; + bool hdma_indirect; + bool reversexfer; + bool fixedxfer; + uint8 xfermode; + + //$43x1 + uint8 destaddr; + + //$43x2-$43x3 + uint16 srcaddr; + + //$43x4 + uint8 srcbank; + + //$43x5-$43x6 + union { + uint16 xfersize; + uint16 hdma_iaddr; + }; + + //$43x7 + uint8 hdma_ibank; + + //$43x8-$43x9 + uint16 hdma_addr; + + //$43xa + uint8 hdma_line_counter; + + //$43xb/$43xf + uint8 unknown; + + //internal variables + bool hdma_completed; + bool hdma_do_transfer; + } channel[8]; + + void dma_add_clocks(unsigned clocks); + bool dma_addr_valid(uint32 abus); + uint8 dma_read(uint32 abus); + void dma_transfer(bool direction, uint8 bbus, uint32 abus); + + uint8 dma_bbus(uint8 i, uint8 index); + uint32 dma_addr(uint8 i); + uint32 hdma_addr(uint8 i); + uint32 hdma_iaddr(uint8 i); + + uint8 dma_enabled_channels(); + void dma_run(); + + bool hdma_active(uint8 i); + bool hdma_active_after(uint8 i); + uint8 hdma_enabled_channels(); + uint8 hdma_active_channels(); + void hdma_update(uint8 i); + void hdma_run(); + void hdma_init_reset(); + void hdma_init(); + + void dma_power(); + void dma_reset(); diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/memory/memory.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/memory/memory.cpp new file mode 100755 index 0000000000..c3608f98a6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/memory/memory.cpp @@ -0,0 +1,35 @@ +#ifdef SCPU_CPP + +void sCPU::op_io() { + status.clock_count = 6; + cycle_edge(); + add_clocks(6); +} + +uint8 sCPU::op_read(uint32 addr) { + status.clock_count = speed(addr); + cycle_edge(); + add_clocks(status.clock_count - 4); + regs.mdr = bus.read(addr); + add_clocks(4); + return regs.mdr; +} + +void sCPU::op_write(uint32 addr, uint8 data) { + status.clock_count = speed(addr); + cycle_edge(); + add_clocks(status.clock_count); + bus.write(addr, regs.mdr = data); +} + +unsigned sCPU::speed(unsigned addr) const { + if(addr & 0x408000) { + if(addr & 0x800000) return status.rom_speed; + return 8; + } + if((addr + 0x6000) & 0x4000) return 8; + if((addr - 0x4000) & 0x7e00) return 6; + return 12; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/memory/memory.hpp b/Mednafen/mednafen/snes/src/cpu/scpu/memory/memory.hpp new file mode 100755 index 0000000000..43d296d89e --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/memory/memory.hpp @@ -0,0 +1,16 @@ +//============================ +//CPU<>APU communication ports +//============================ + +uint8 apu_port[4]; +uint8 port_read(uint8 port) { return apu_port[port & 3]; } +void port_write(uint8 port, uint8 data) { apu_port[port & 3] = data; } + +//====================== +//core CPU bus functions +//====================== + +void op_io(); +debugvirtual uint8 op_read(uint32 addr); +debugvirtual void op_write(uint32 addr, uint8 data); +alwaysinline unsigned speed(unsigned addr) const; diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/mmio/mmio.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/mmio/mmio.cpp new file mode 100755 index 0000000000..bbd7c34659 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/mmio/mmio.cpp @@ -0,0 +1,539 @@ +#ifdef SCPU_CPP + +uint8 sCPU::pio() { return status.pio; } +bool sCPU::joylatch() { return status.joypad_strobe_latch; } + +//WMDATA +uint8 sCPU::mmio_r2180() { + uint8 r = bus.read(0x7e0000 | status.wram_addr); + status.wram_addr = (status.wram_addr + 1) & 0x01ffff; + return r; +} + +//WMDATA +void sCPU::mmio_w2180(uint8 data) { + bus.write(0x7e0000 | status.wram_addr, data); + status.wram_addr = (status.wram_addr + 1) & 0x01ffff; +} + +//WMADDL +void sCPU::mmio_w2181(uint8 data) { + status.wram_addr = (status.wram_addr & 0xffff00) | (data); + status.wram_addr &= 0x01ffff; +} + +//WMADDM +void sCPU::mmio_w2182(uint8 data) { + status.wram_addr = (status.wram_addr & 0xff00ff) | (data << 8); + status.wram_addr &= 0x01ffff; +} + +//WMADDH +void sCPU::mmio_w2183(uint8 data) { + status.wram_addr = (status.wram_addr & 0x00ffff) | (data << 16); + status.wram_addr &= 0x01ffff; +} + +//JOYSER0 +//bit 0 is shared between JOYSER0 and JOYSER1, therefore +//strobing $4016.d0 affects both controller port latches. +//$4017 bit 0 writes are ignored. +void sCPU::mmio_w4016(uint8 data) { + status.joypad_strobe_latch = !!(data & 1); + + if(status.joypad_strobe_latch == 1) { + input.poll(); + } +} + +//JOYSER0 +//7-2 = MDR +//1-0 = Joypad serial data +// +//TODO: test whether strobe latch of zero returns +//realtime or buffered status of joypadN.b +uint8 sCPU::mmio_r4016() { + uint8 r = regs.mdr & 0xfc; + r |= input.port_read(0) & 3; + //printf("JOYSER0_L2: 0x%02x\n", r & 0x3); + return r; +} + +//JOYSER1 +//7-5 = MDR +//4-2 = Always 1 (pins are connected to GND) +//1-0 = Joypad serial data +uint8 sCPU::mmio_r4017() { + uint8 r = (regs.mdr & 0xe0) | 0x1c; + r |= input.port_read(1) & 3; + //printf("JOYSER1_L2: 0x%02x\n", r & 0x3); + return r; +} + +//NMITIMEN +void sCPU::mmio_w4200(uint8 data) { + status.auto_joypad_poll = !!(data & 0x01); + nmitimen_update(data); +} + +//WRIO +void sCPU::mmio_w4201(uint8 data) { + if((status.pio & 0x80) && !(data & 0x80)) { + ppu.latch_counters(); + } + status.pio = data; +} + +//WRMPYA +void sCPU::mmio_w4202(uint8 data) { + status.mul_a = data; +} + +//WRMPYB +void sCPU::mmio_w4203(uint8 data) { + status.mul_b = data; + status.r4216 = status.mul_a * status.mul_b; + + status.alu_lock = true; + event.enqueue(config.cpu.alu_mul_delay, EventAluLockRelease); +} + +//WRDIVL +void sCPU::mmio_w4204(uint8 data) { + status.div_a = (status.div_a & 0xff00) | (data); +} + +//WRDIVH +void sCPU::mmio_w4205(uint8 data) { + status.div_a = (status.div_a & 0x00ff) | (data << 8); +} + +//WRDIVB +void sCPU::mmio_w4206(uint8 data) { + status.div_b = data; + status.r4214 = (status.div_b) ? status.div_a / status.div_b : 0xffff; + status.r4216 = (status.div_b) ? status.div_a % status.div_b : status.div_a; + + status.alu_lock = true; + event.enqueue(config.cpu.alu_div_delay, EventAluLockRelease); +} + +//HTIMEL +void sCPU::mmio_w4207(uint8 data) { + status.hirq_pos = (status.hirq_pos & ~0xff) | (data); + status.hirq_pos &= 0x01ff; +} + +//HTIMEH +void sCPU::mmio_w4208(uint8 data) { + status.hirq_pos = (status.hirq_pos & 0xff) | (data << 8); + status.hirq_pos &= 0x01ff; +} + +//VTIMEL +void sCPU::mmio_w4209(uint8 data) { + status.virq_pos = (status.virq_pos & ~0xff) | (data); + status.virq_pos &= 0x01ff; +} + +//VTIMEH +void sCPU::mmio_w420a(uint8 data) { + status.virq_pos = (status.virq_pos & 0xff) | (data << 8); + status.virq_pos &= 0x01ff; +} + +//DMAEN +void sCPU::mmio_w420b(uint8 data) { + for(unsigned i = 0; i < 8; i++) { + channel[i].dma_enabled = data & (1 << i); + } + if(data) status.dma_pending = true; +} + +//HDMAEN +void sCPU::mmio_w420c(uint8 data) { + for(unsigned i = 0; i < 8; i++) { + channel[i].hdma_enabled = data & (1 << i); + } +} + +//MEMSEL +void sCPU::mmio_w420d(uint8 data) { + status.rom_speed = (data & 1 ? 6 : 8); +} + +//RDNMI +//7 = NMI acknowledge +//6-4 = MDR +//3-0 = CPU (5a22) version +uint8 sCPU::mmio_r4210() { + uint8 r = (regs.mdr & 0x70); + r |= (uint8)(rdnmi()) << 7; + r |= (cpu_version & 0x0f); + return r; +} + +//TIMEUP +//7 = IRQ acknowledge +//6-0 = MDR +uint8 sCPU::mmio_r4211() { + uint8 r = (regs.mdr & 0x7f); + r |= (uint8)(timeup()) << 7; + return r; +} + +//HVBJOY +//7 = VBLANK acknowledge +//6 = HBLANK acknowledge +//5-1 = MDR +//0 = JOYPAD acknowledge +uint8 sCPU::mmio_r4212() { + uint8 r = (regs.mdr & 0x3e); + uint16 vs = ppu.overscan() == false ? 225 : 240; + + //auto joypad polling + if(vcounter() >= vs && vcounter() <= (vs + 2))r |= 0x01; + + //hblank + if(hcounter() <= 2 || hcounter() >= 1096)r |= 0x40; + + //vblank + if(vcounter() >= vs)r |= 0x80; + + return r; +} + +//RDIO +uint8 sCPU::mmio_r4213() { + return status.pio; +} + +//RDDIVL +uint8 sCPU::mmio_r4214() { + if(status.alu_lock) return 0; + return status.r4214; +} + +//RDDIVH +uint8 sCPU::mmio_r4215() { + if(status.alu_lock) return 0; + return status.r4214 >> 8; +} + +//RDMPYL +uint8 sCPU::mmio_r4216() { + if(status.alu_lock) return 0; + return status.r4216; +} + +//RDMPYH +uint8 sCPU::mmio_r4217() { + if(status.alu_lock) return 0; + return status.r4216 >> 8; +} + +//TODO: handle reads during joypad polling (v=225-227) +uint8 sCPU::mmio_r4218() { /*printf("read joy1l=0x%02x\n", status.joy1l);*/ return status.joy1l; } //JOY1L +uint8 sCPU::mmio_r4219() { /*printf("read joy1h=0x%02x\n", status.joy1h);*/ return status.joy1h; } //JOY1H +uint8 sCPU::mmio_r421a() { return status.joy2l; } //JOY2L +uint8 sCPU::mmio_r421b() { return status.joy2h; } //JOY2H +uint8 sCPU::mmio_r421c() { return status.joy3l; } //JOY3L +uint8 sCPU::mmio_r421d() { return status.joy3h; } //JOY3H +uint8 sCPU::mmio_r421e() { return status.joy4l; } //JOY4L +uint8 sCPU::mmio_r421f() { return status.joy4h; } //JOY4H + +//DMAPx +uint8 sCPU::mmio_r43x0(uint8 i) { + return channel[i].dmap; +} + +//BBADx +uint8 sCPU::mmio_r43x1(uint8 i) { + return channel[i].destaddr; +} + +//A1TxL +uint8 sCPU::mmio_r43x2(uint8 i) { + return channel[i].srcaddr; +} + +//A1TxH +uint8 sCPU::mmio_r43x3(uint8 i) { + return channel[i].srcaddr >> 8; +} + +//A1Bx +uint8 sCPU::mmio_r43x4(uint8 i) { + return channel[i].srcbank; +} + +//DASxL +//union { uint16 xfersize; uint16 hdma_iaddr; }; +uint8 sCPU::mmio_r43x5(uint8 i) { + return channel[i].xfersize; +} + +//DASxH +//union { uint16 xfersize; uint16 hdma_iaddr; }; +uint8 sCPU::mmio_r43x6(uint8 i) { + return channel[i].xfersize >> 8; +} + +//DASBx +uint8 sCPU::mmio_r43x7(uint8 i) { + return channel[i].hdma_ibank; +} + +//A2AxL +uint8 sCPU::mmio_r43x8(uint8 i) { + return channel[i].hdma_addr; +} + +//A2AxH +uint8 sCPU::mmio_r43x9(uint8 i) { + return channel[i].hdma_addr >> 8; +} + +//NTRLx +uint8 sCPU::mmio_r43xa(uint8 i) { + return channel[i].hdma_line_counter; +} + +//??? +uint8 sCPU::mmio_r43xb(uint8 i) { + return channel[i].unknown; +} + +//DMAPx +void sCPU::mmio_w43x0(uint8 i, uint8 data) { + channel[i].dmap = data; + channel[i].direction = !!(data & 0x80); + channel[i].hdma_indirect = !!(data & 0x40); + channel[i].reversexfer = !!(data & 0x10); + channel[i].fixedxfer = !!(data & 0x08); + channel[i].xfermode = data & 7; +} + +//DDBADx +void sCPU::mmio_w43x1(uint8 i, uint8 data) { + channel[i].destaddr = data; +} + +//A1TxL +void sCPU::mmio_w43x2(uint8 i, uint8 data) { + channel[i].srcaddr = (channel[i].srcaddr & 0xff00) | (data); +} + +//A1TxH +void sCPU::mmio_w43x3(uint8 i, uint8 data) { + channel[i].srcaddr = (channel[i].srcaddr & 0x00ff) | (data << 8); +} + +//A1Bx +void sCPU::mmio_w43x4(uint8 i, uint8 data) { + channel[i].srcbank = data; +} + +//DASxL +//union { uint16 xfersize; uint16 hdma_iaddr; }; +void sCPU::mmio_w43x5(uint8 i, uint8 data) { + channel[i].xfersize = (channel[i].xfersize & 0xff00) | (data); +} + +//DASxH +//union { uint16 xfersize; uint16 hdma_iaddr; }; +void sCPU::mmio_w43x6(uint8 i, uint8 data) { + channel[i].xfersize = (channel[i].xfersize & 0x00ff) | (data << 8); +} + +//DASBx +void sCPU::mmio_w43x7(uint8 i, uint8 data) { + channel[i].hdma_ibank = data; +} + +//A2AxL +void sCPU::mmio_w43x8(uint8 i, uint8 data) { + channel[i].hdma_addr = (channel[i].hdma_addr & 0xff00) | (data); +} + +//A2AxH +void sCPU::mmio_w43x9(uint8 i, uint8 data) { + channel[i].hdma_addr = (channel[i].hdma_addr & 0x00ff) | (data << 8); +} + +//NTRLx +void sCPU::mmio_w43xa(uint8 i, uint8 data) { + channel[i].hdma_line_counter = data; +} + +//??? +void sCPU::mmio_w43xb(uint8 i, uint8 data) { + channel[i].unknown = data; +} + +void sCPU::mmio_power() { +} + +void sCPU::mmio_reset() { + //$2181-$2183 + status.wram_addr = 0x000000; + + //$4016-$4017 + status.joypad_strobe_latch = 0; + status.joypad1_bits = ~0; + status.joypad2_bits = ~0; + + //$4200 + status.nmi_enabled = false; + status.hirq_enabled = false; + status.virq_enabled = false; + status.auto_joypad_poll = false; + + //$4201 + status.pio = 0xff; + + //$4202-$4203 + status.mul_a = 0xff; + status.mul_b = 0xff; + + //$4204-$4206 + status.div_a = 0xffff; + status.div_b = 0xff; + + //$4207-$420a + status.hirq_pos = 0x01ff; + status.virq_pos = 0x01ff; + + //$420d + status.rom_speed = 8; + + //$4214-$4217 + status.r4214 = 0x0000; + status.r4216 = 0x0000; + + //$4218-$421f + status.joy1l = 0x00; + status.joy1h = 0x00; + status.joy2l = 0x00; + status.joy2h = 0x00; + status.joy3l = 0x00; + status.joy3h = 0x00; + status.joy4l = 0x00; + status.joy4h = 0x00; +} + +uint8 sCPU::mmio_read(unsigned addr) { + addr &= 0xffff; + + //APU + if((addr & 0xffc0) == 0x2140) { //$2140-$217f + scheduler.sync_cpusmp(); + return smp.port_read(addr & 3); + } + + //DMA + if((addr & 0xff80) == 0x4300) { //$4300-$437f + unsigned i = (addr >> 4) & 7; + switch(addr & 0xf) { + case 0x0: return mmio_r43x0(i); + case 0x1: return mmio_r43x1(i); + case 0x2: return mmio_r43x2(i); + case 0x3: return mmio_r43x3(i); + case 0x4: return mmio_r43x4(i); + case 0x5: return mmio_r43x5(i); + case 0x6: return mmio_r43x6(i); + case 0x7: return mmio_r43x7(i); + case 0x8: return mmio_r43x8(i); + case 0x9: return mmio_r43x9(i); + case 0xa: return mmio_r43xa(i); + case 0xb: return mmio_r43xb(i); + case 0xc: return regs.mdr; //unmapped + case 0xd: return regs.mdr; //unmapped + case 0xe: return regs.mdr; //unmapped + case 0xf: return mmio_r43xb(i); //mirror of $43xb + } + } + + switch(addr) { + case 0x2180: return mmio_r2180(); + case 0x4016: return mmio_r4016(); + case 0x4017: return mmio_r4017(); + case 0x4210: return mmio_r4210(); + case 0x4211: return mmio_r4211(); + case 0x4212: return mmio_r4212(); + case 0x4213: return mmio_r4213(); + case 0x4214: return mmio_r4214(); + case 0x4215: return mmio_r4215(); + case 0x4216: return mmio_r4216(); + case 0x4217: return mmio_r4217(); + case 0x4218: return mmio_r4218(); + case 0x4219: return mmio_r4219(); + case 0x421a: return mmio_r421a(); + case 0x421b: return mmio_r421b(); + case 0x421c: return mmio_r421c(); + case 0x421d: return mmio_r421d(); + case 0x421e: return mmio_r421e(); + case 0x421f: return mmio_r421f(); + } + + return regs.mdr; +} + +void sCPU::mmio_write(unsigned addr, uint8 data) { + addr &= 0xffff; + + //APU + if((addr & 0xffc0) == 0x2140) { //$2140-$217f + scheduler.sync_cpusmp(); + port_write(addr & 3, data); + return; + } + + //DMA + if((addr & 0xff80) == 0x4300) { //$4300-$437f + unsigned i = (addr >> 4) & 7; + switch(addr & 0xf) { + case 0x0: mmio_w43x0(i, data); return; + case 0x1: mmio_w43x1(i, data); return; + case 0x2: mmio_w43x2(i, data); return; + case 0x3: mmio_w43x3(i, data); return; + case 0x4: mmio_w43x4(i, data); return; + case 0x5: mmio_w43x5(i, data); return; + case 0x6: mmio_w43x6(i, data); return; + case 0x7: mmio_w43x7(i, data); return; + case 0x8: mmio_w43x8(i, data); return; + case 0x9: mmio_w43x9(i, data); return; + case 0xa: mmio_w43xa(i, data); return; + case 0xb: mmio_w43xb(i, data); return; + case 0xc: return; //unmapped + case 0xd: return; //unmapped + case 0xe: return; //unmapped + case 0xf: mmio_w43xb(i, data); return; //mirror of $43xb + } + } + + switch(addr) { + case 0x2180: mmio_w2180(data); return; + case 0x2181: mmio_w2181(data); return; + case 0x2182: mmio_w2182(data); return; + case 0x2183: mmio_w2183(data); return; + case 0x4016: mmio_w4016(data); return; + case 0x4017: return; //unmapped + case 0x4200: mmio_w4200(data); return; + case 0x4201: mmio_w4201(data); return; + case 0x4202: mmio_w4202(data); return; + case 0x4203: mmio_w4203(data); return; + case 0x4204: mmio_w4204(data); return; + case 0x4205: mmio_w4205(data); return; + case 0x4206: mmio_w4206(data); return; + case 0x4207: mmio_w4207(data); return; + case 0x4208: mmio_w4208(data); return; + case 0x4209: mmio_w4209(data); return; + case 0x420a: mmio_w420a(data); return; + case 0x420b: mmio_w420b(data); return; + case 0x420c: mmio_w420c(data); return; + case 0x420d: mmio_w420d(data); return; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/mmio/mmio.hpp b/Mednafen/mednafen/snes/src/cpu/scpu/mmio/mmio.hpp new file mode 100755 index 0000000000..4955c4ff75 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/mmio/mmio.hpp @@ -0,0 +1,71 @@ + void mmio_power(); + void mmio_reset(); + uint8 mmio_read(unsigned addr); + void mmio_write(unsigned addr, uint8 data); + + uint8 pio(); + bool joylatch(); + + uint8 mmio_r2180(); + uint8 mmio_r4016(); + uint8 mmio_r4017(); + uint8 mmio_r4210(); + uint8 mmio_r4211(); + uint8 mmio_r4212(); + uint8 mmio_r4213(); + uint8 mmio_r4214(); + uint8 mmio_r4215(); + uint8 mmio_r4216(); + uint8 mmio_r4217(); + uint8 mmio_r4218(); + uint8 mmio_r4219(); + uint8 mmio_r421a(); + uint8 mmio_r421b(); + uint8 mmio_r421c(); + uint8 mmio_r421d(); + uint8 mmio_r421e(); + uint8 mmio_r421f(); + uint8 mmio_r43x0(uint8 i); + uint8 mmio_r43x1(uint8 i); + uint8 mmio_r43x2(uint8 i); + uint8 mmio_r43x3(uint8 i); + uint8 mmio_r43x4(uint8 i); + uint8 mmio_r43x5(uint8 i); + uint8 mmio_r43x6(uint8 i); + uint8 mmio_r43x7(uint8 i); + uint8 mmio_r43x8(uint8 i); + uint8 mmio_r43x9(uint8 i); + uint8 mmio_r43xa(uint8 i); + uint8 mmio_r43xb(uint8 i); + + void mmio_w2180(uint8 data); + void mmio_w2181(uint8 data); + void mmio_w2182(uint8 data); + void mmio_w2183(uint8 data); + void mmio_w4016(uint8 data); + void mmio_w4200(uint8 data); + void mmio_w4201(uint8 data); + void mmio_w4202(uint8 data); + void mmio_w4203(uint8 data); + void mmio_w4204(uint8 data); + void mmio_w4205(uint8 data); + void mmio_w4206(uint8 data); + void mmio_w4207(uint8 data); + void mmio_w4208(uint8 data); + void mmio_w4209(uint8 data); + void mmio_w420a(uint8 data); + void mmio_w420b(uint8 data); + void mmio_w420c(uint8 data); + void mmio_w420d(uint8 data); + void mmio_w43x0(uint8 i, uint8 data); + void mmio_w43x1(uint8 i, uint8 data); + void mmio_w43x2(uint8 i, uint8 data); + void mmio_w43x3(uint8 i, uint8 data); + void mmio_w43x4(uint8 i, uint8 data); + void mmio_w43x5(uint8 i, uint8 data); + void mmio_w43x6(uint8 i, uint8 data); + void mmio_w43x7(uint8 i, uint8 data); + void mmio_w43x8(uint8 i, uint8 data); + void mmio_w43x9(uint8 i, uint8 data); + void mmio_w43xa(uint8 i, uint8 data); + void mmio_w43xb(uint8 i, uint8 data); diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/scpu.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/scpu.cpp new file mode 100755 index 0000000000..b2efefe3d7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/scpu.cpp @@ -0,0 +1,113 @@ +#include <../base.hpp> + +#define SCPU_CPP +namespace bSNES_v059 { + +#if defined(DEBUGGER) + #include "debugger/debugger.cpp" + sCPUDebugger cpu; +#else + sCPU cpu; +#endif + +#include "serialization.cpp" +#include "dma/dma.cpp" +#include "memory/memory.cpp" +#include "mmio/mmio.cpp" +#include "timing/timing.cpp" + +void sCPU::enter() { + while(true) { + while(scheduler.sync == Scheduler::SyncCpu) { + scheduler.sync = Scheduler::SyncAll; + scheduler.exit(Scheduler::SynchronizeEvent); + } + + if(status.interrupt_pending) { + status.interrupt_pending = false; + if(status.nmi_pending) { + status.nmi_pending = false; + status.interrupt_vector = (regs.e == false ? 0xffea : 0xfffa); + op_irq(); + } else if(status.irq_pending) { + status.irq_pending = false; + status.interrupt_vector = (regs.e == false ? 0xffee : 0xfffe); + op_irq(); + } else if(status.reset_pending) { + status.reset_pending = false; + add_clocks(186); + regs.pc.l = bus.read(0xfffc); + regs.pc.h = bus.read(0xfffd); + } + } + + op_step(); + } +} + +void sCPU::op_step() { + (this->*opcode_table[op_readpc()])(); +} + +void sCPU::op_irq() { + op_read(regs.pc.d); + op_io(); + if(!regs.e) op_writestack(regs.pc.b); + op_writestack(regs.pc.h); + op_writestack(regs.pc.l); + op_writestack(regs.e ? (regs.p & ~0x10) : regs.p); + rd.l = op_read(status.interrupt_vector + 0); + regs.pc.b = 0x00; + regs.p.i = 1; + regs.p.d = 0; + rd.h = op_read(status.interrupt_vector + 1); + regs.pc.w = rd.w; +} + +void sCPU::power() { + CPU::power(); + + regs.a = regs.x = regs.y = 0x0000; + regs.s = 0x01ff; + + mmio_power(); + dma_power(); + timing_power(); + + reset(); +} + +void sCPU::reset() { + CPU::reset(); + + //note: some registers are not fully reset by SNES + regs.pc = 0x000000; + regs.x.h = 0x00; + regs.y.h = 0x00; + regs.s.h = 0x01; + regs.d = 0x0000; + regs.db = 0x00; + regs.p = 0x34; + regs.e = 1; + regs.mdr = 0x00; + regs.wai = false; + update_table(); + + mmio_reset(); + dma_reset(); + timing_reset(); + + apu_port[0] = 0x00; + apu_port[1] = 0x00; + apu_port[2] = 0x00; + apu_port[3] = 0x00; +} + +sCPU::sCPU() : event(512, bind(&sCPU::queue_event, this)) { + PPUcounter::scanline = bind(&sCPU::scanline, this); +} + +sCPU::~sCPU() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/scpu.hpp b/Mednafen/mednafen/snes/src/cpu/scpu/scpu.hpp new file mode 100755 index 0000000000..687862e506 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/scpu.hpp @@ -0,0 +1,106 @@ +class sCPU : public CPU, public CPUcore { +public: + void enter(); + debugvirtual void op_step(); + void op_irq(); + bool interrupt_pending() { return status.interrupt_pending; } + + #include "dma/dma.hpp" + #include "memory/memory.hpp" + #include "mmio/mmio.hpp" + #include "timing/timing.hpp" + + priority_queue event; + + struct { + bool interrupt_pending; + uint16 interrupt_vector; + + unsigned clock_count; + unsigned line_clocks; + + //timing + bool irq_lock; + bool alu_lock; + unsigned dram_refresh_position; + + bool nmi_valid; + bool nmi_line; + bool nmi_transition; + bool nmi_pending; + bool nmi_hold; + + bool irq_valid; + bool irq_line; + bool irq_transition; + bool irq_pending; + bool irq_hold; + + bool reset_pending; + + //DMA + bool dma_active; + unsigned dma_counter; + unsigned dma_clocks; + bool dma_pending; + bool hdma_pending; + bool hdma_mode; //0 = init, 1 = run + + //MMIO + + //$2181-$2183 + uint32 wram_addr; + + //$4016-$4017 + bool joypad_strobe_latch; + uint32 joypad1_bits; + uint32 joypad2_bits; + + //$4200 + bool nmi_enabled; + bool hirq_enabled, virq_enabled; + bool auto_joypad_poll; + + //$4201 + uint8 pio; + + //$4202-$4203 + uint8 mul_a, mul_b; + + //$4204-$4206 + uint16 div_a; + uint8 div_b; + + //$4207-$420a + uint16 hirq_pos, virq_pos; + + //$420d + unsigned rom_speed; + + //$4214-$4217 + uint16 r4214; + uint16 r4216; + + //$4218-$421f + uint8 joy1l, joy1h; + uint8 joy2l, joy2h; + uint8 joy3l, joy3h; + uint8 joy4l, joy4h; + } status; + + void power(); + void reset(); + + void serialize(serializer&); + sCPU(); + ~sCPU(); + + friend class sCPUDebug; +}; + +#if defined(DEBUGGER) + #include "debugger/debugger.hpp" + extern sCPUDebugger cpu; +#else + extern sCPU cpu; +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/serialization.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/serialization.cpp new file mode 100755 index 0000000000..c9e2582ef5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/serialization.cpp @@ -0,0 +1,105 @@ +#ifdef SCPU_CPP + +void sCPU::serialize(serializer &s) { + CPU::serialize(s); + CPUcore::core_serialize(s); + + event.serialize(s); + + s.integer(status.interrupt_pending); + s.integer(status.interrupt_vector); + + s.integer(status.clock_count); + s.integer(status.line_clocks); + + s.integer(status.irq_lock); + s.integer(status.alu_lock); + s.integer(status.dram_refresh_position); + + s.integer(status.nmi_valid); + s.integer(status.nmi_line); + s.integer(status.nmi_transition); + s.integer(status.nmi_pending); + s.integer(status.nmi_hold); + + s.integer(status.irq_valid); + s.integer(status.irq_line); + s.integer(status.irq_transition); + s.integer(status.irq_pending); + s.integer(status.irq_hold); + + s.integer(status.reset_pending); + + s.integer(status.dma_active); + s.integer(status.dma_counter); + s.integer(status.dma_clocks); + s.integer(status.dma_pending); + s.integer(status.hdma_pending); + s.integer(status.hdma_mode); + + s.integer(status.wram_addr); + + s.integer(status.joypad_strobe_latch); + s.integer(status.joypad1_bits); + s.integer(status.joypad2_bits); + + s.integer(status.nmi_enabled); + s.integer(status.hirq_enabled); + s.integer(status.virq_enabled); + s.integer(status.auto_joypad_poll); + + s.integer(status.pio); + + s.integer(status.mul_a); + s.integer(status.mul_b); + + s.integer(status.div_a); + s.integer(status.div_b); + + s.integer(status.hirq_pos); + s.integer(status.virq_pos); + + s.integer(status.rom_speed); + + s.integer(status.r4214); + s.integer(status.r4216); + + s.integer(status.joy1l); + s.integer(status.joy1h); + s.integer(status.joy2l); + s.integer(status.joy2h); + s.integer(status.joy3l); + s.integer(status.joy3h); + s.integer(status.joy4l); + s.integer(status.joy4h); + + for(unsigned i = 0; i < 8; i++) { + s.integer(channel[i].dma_enabled); + s.integer(channel[i].hdma_enabled); + s.integer(channel[i].dmap); + s.integer(channel[i].direction); + s.integer(channel[i].hdma_indirect); + s.integer(channel[i].reversexfer); + s.integer(channel[i].fixedxfer); + s.integer(channel[i].xfermode); + s.integer(channel[i].destaddr); + s.integer(channel[i].srcaddr); + s.integer(channel[i].srcbank); + s.integer(channel[i].xfersize); + s.integer(channel[i].hdma_ibank); + s.integer(channel[i].hdma_addr); + s.integer(channel[i].hdma_line_counter); + s.integer(channel[i].unknown); + s.integer(channel[i].hdma_completed); + s.integer(channel[i].hdma_do_transfer); + } + + s.integer(apu_port[0]); + s.integer(apu_port[1]); + s.integer(apu_port[2]); + s.integer(apu_port[3]); + + s.integer(cycle_edge_state); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/timing/event.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/timing/event.cpp new file mode 100755 index 0000000000..82de92478d --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/timing/event.cpp @@ -0,0 +1,35 @@ +#ifdef SCPU_CPP + +void sCPU::queue_event(unsigned id) { + switch(id) { + //interrupts triggered during (H)DMA do not trigger immediately after + case EventIrqLockRelease: { + status.irq_lock = false; + } break; + + //ALU multiplication / division results are not immediately calculated; + //the exact formula for the calculations are unknown, but this lock at least + //allows emulation to avoid returning to fully computed results too soon. + case EventAluLockRelease: { + status.alu_lock = false; + } break; + + //S-CPU WRAM consists of two 64kbyte DRAM chips, which must be refreshed + //once per scanline to avoid memory decay. + case EventDramRefresh: { + add_clocks(40); + } break; + + //HDMA init routine; occurs once per frame + case EventHdmaInit: { + cycle_edge_state |= EventFlagHdmaInit; + } break; + + //HDMA run routine; occurs once per scanline + case EventHdmaRun: { + cycle_edge_state |= EventFlagHdmaRun; + } break; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/timing/irq.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/timing/irq.cpp new file mode 100755 index 0000000000..78664f0c5e --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/timing/irq.cpp @@ -0,0 +1,107 @@ +#ifdef SCPU_CPP + +//called once every four clock cycles; +//as NMI steps by scanlines (divisible by 4) and IRQ by PPU 4-cycle dots. +// +//ppu.(vh)counter(n) returns the value of said counters n-clocks before current time; +//it is used to emulate hardware communication delay between opcode and interrupt units. +void sCPU::poll_interrupts() { + //NMI hold + if(status.nmi_hold) { + status.nmi_hold = false; + if(status.nmi_enabled) status.nmi_transition = true; + } + + //NMI test + bool nmi_valid = (vcounter(2) >= (!ppu.overscan() ? 225 : 240)); + if(!status.nmi_valid && nmi_valid) { + //0->1 edge sensitive transition + status.nmi_line = true; + status.nmi_hold = true; //hold /NMI for four cycles + } else if(status.nmi_valid && !nmi_valid) { + //1->0 edge sensitive transition + status.nmi_line = false; + } + status.nmi_valid = nmi_valid; + + //IRQ hold + status.irq_hold = false; + if(status.irq_line) { + if(status.virq_enabled || status.hirq_enabled) status.irq_transition = true; + } + + //IRQ test + bool irq_valid = (status.virq_enabled || status.hirq_enabled); + if(irq_valid) { + if((status.virq_enabled && vcounter(10) != (status.virq_pos)) + || (status.hirq_enabled && hcounter(10) != (status.hirq_pos + 1) * 4) + || (status.virq_pos && vcounter(6) == 0) //IRQs cannot trigger on last dot of field + ) irq_valid = false; + } + if(!status.irq_valid && irq_valid) { + //0->1 edge sensitive transition + status.irq_line = true; + status.irq_hold = true; //hold /IRQ for four cycles + } + status.irq_valid = irq_valid; +} + +void sCPU::nmitimen_update(uint8 data) { + bool nmi_enabled = status.nmi_enabled; + bool virq_enabled = status.virq_enabled; + bool hirq_enabled = status.hirq_enabled; + status.nmi_enabled = data & 0x80; + status.virq_enabled = data & 0x20; + status.hirq_enabled = data & 0x10; + + //0->1 edge sensitive transition + if(!nmi_enabled && status.nmi_enabled && status.nmi_line) { + status.nmi_transition = true; + } + + //?->1 level sensitive transition + if(status.virq_enabled && !status.hirq_enabled && status.irq_line) { + status.irq_transition = true; + } + + if(!status.virq_enabled && !status.hirq_enabled) { + status.irq_line = false; + status.irq_transition = false; + } + + status.irq_lock = true; + event.enqueue(2, EventIrqLockRelease); +} + +bool sCPU::rdnmi() { + bool result = status.nmi_line; + if(!status.nmi_hold) { + status.nmi_line = false; + } + return result; +} + +bool sCPU::timeup() { + bool result = status.irq_line; + if(!status.irq_hold) { + status.irq_line = false; + status.irq_transition = false; + } + return result; +} + +bool sCPU::nmi_test() { + if(!status.nmi_transition) return false; + status.nmi_transition = false; + regs.wai = false; + return true; +} + +bool sCPU::irq_test() { + if(!status.irq_transition && !regs.irq) return false; + status.irq_transition = false; + regs.wai = false; + return !regs.p.i; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/timing/joypad.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/timing/joypad.cpp new file mode 100755 index 0000000000..84149f5e4d --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/timing/joypad.cpp @@ -0,0 +1,28 @@ +#ifdef SCPU_CPP + +void sCPU::run_auto_joypad_poll() { + uint16 joy1 = 0, joy2 = 0, joy3 = 0, joy4 = 0; + for(unsigned i = 0; i < 16; i++) { + uint8 port0 = input.port_read(0); + uint8 port1 = input.port_read(1); + + joy1 |= (port0 & 1) ? (0x8000 >> i) : 0; + joy2 |= (port1 & 1) ? (0x8000 >> i) : 0; + joy3 |= (port0 & 2) ? (0x8000 >> i) : 0; + joy4 |= (port1 & 2) ? (0x8000 >> i) : 0; + } + + status.joy1l = joy1; + status.joy1h = joy1 >> 8; + + status.joy2l = joy2; + status.joy2h = joy2 >> 8; + + status.joy3l = joy3; + status.joy3h = joy3 >> 8; + + status.joy4l = joy4; + status.joy4h = joy4 >> 8; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/timing/timing.cpp b/Mednafen/mednafen/snes/src/cpu/scpu/timing/timing.cpp new file mode 100755 index 0000000000..cc6ba54f09 --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/timing/timing.cpp @@ -0,0 +1,172 @@ +#ifdef SCPU_CPP + +#include "event.cpp" +#include "irq.cpp" +#include "joypad.cpp" + +unsigned sCPU::dma_counter() { + return (status.dma_counter + hcounter()) & 7; +} + +void sCPU::add_clocks(unsigned clocks) { + event.tick(clocks); + unsigned ticks = clocks >> 1; + while(ticks--) { + tick(); + if(hcounter() & 2) { + input.tick(); + poll_interrupts(); + } + } + scheduler.addclocks_cpu(clocks); +} + +//called by ppu.tick() when Hcounter=0 +void sCPU::scanline() { + status.dma_counter = (status.dma_counter + status.line_clocks) & 7; + status.line_clocks = lineclocks(); + + //forcefully sync S-CPU to other processors, in case chips are not communicating + scheduler.sync_cpuppu(); + scheduler.sync_cpucop(); + scheduler.sync_cpusmp(); + system.scanline(); + + if(vcounter() == 0) { + //hdma init triggers once every frame + event.enqueue(cpu_version == 1 ? 12 + 8 - dma_counter() : 12 + dma_counter(), EventHdmaInit); + } + + //dram refresh occurs once every scanline + if(cpu_version == 2) status.dram_refresh_position = 530 + 8 - dma_counter(); + event.enqueue(status.dram_refresh_position, EventDramRefresh); + + //hdma triggers once every visible scanline + if(vcounter() <= (ppu.overscan() == false ? 224 : 239)) { + event.enqueue(1104, EventHdmaRun); + } + + if(status.auto_joypad_poll == true && vcounter() == (ppu.overscan() == false ? 227 : 242)) { + input.poll(); + run_auto_joypad_poll(); + } +} + +//used to test for H/DMA, which can trigger on the edge of every opcode cycle. +void sCPU::cycle_edge() { + while(cycle_edge_state) { + switch(bit::lowest(cycle_edge_state)) { + case EventFlagHdmaInit: { + hdma_init_reset(); + if(hdma_enabled_channels()) { + status.hdma_pending = true; + status.hdma_mode = 0; + } + } break; + + case EventFlagHdmaRun: { + if(hdma_active_channels()) { + status.hdma_pending = true; + status.hdma_mode = 1; + } + } break; + } + + cycle_edge_state = bit::clear_lowest(cycle_edge_state); + } + + //H/DMA pending && DMA inactive? + //.. Run one full CPU cycle + //.. HDMA pending && HDMA enabled ? DMA sync + HDMA run + //.. DMA pending && DMA enabled ? DMA sync + DMA run + //.... HDMA during DMA && HDMA enabled ? DMA sync + HDMA run + //.. Run one bus CPU cycle + //.. CPU sync + + if(status.dma_active == true) { + if(status.hdma_pending) { + status.hdma_pending = false; + if(hdma_enabled_channels()) { + dma_add_clocks(8 - dma_counter()); + status.hdma_mode == 0 ? hdma_init() : hdma_run(); + if(!dma_enabled_channels()) { + add_clocks(status.clock_count - (status.dma_clocks % status.clock_count)); + status.dma_active = false; + } + } + } + + if(status.dma_pending) { + status.dma_pending = false; + if(dma_enabled_channels()) { + dma_add_clocks(8 - dma_counter()); + dma_run(); + add_clocks(status.clock_count - (status.dma_clocks % status.clock_count)); + status.dma_active = false; + } + } + } + + if(status.dma_active == false) { + if(status.dma_pending || status.hdma_pending) { + status.dma_clocks = 0; + status.dma_active = true; + } + } +} + +//used to test for NMI/IRQ, which can trigger on the edge of every opcode. +//test one cycle early to simulate two-stage pipeline of x816 CPU. +// +//status.irq_lock is used to simulate hardware delay before interrupts can +//trigger during certain events (immediately after DMA, writes to $4200, etc) +void sCPU::last_cycle() { + if(!status.irq_lock) { + status.nmi_pending |= nmi_test(); + status.irq_pending |= irq_test(); + + status.interrupt_pending = (status.nmi_pending || status.irq_pending); + } +} + +void sCPU::timing_power() { +} + +void sCPU::timing_reset() { + event.reset(); + + status.clock_count = 0; + status.line_clocks = lineclocks(); + + status.irq_lock = false; + status.alu_lock = false; + status.dram_refresh_position = (cpu_version == 1 ? 530 : 538); + event.enqueue(status.dram_refresh_position, EventDramRefresh); + + status.nmi_valid = false; + status.nmi_line = false; + status.nmi_transition = false; + status.nmi_pending = false; + status.nmi_hold = false; + + status.irq_valid = false; + status.irq_line = false; + status.irq_transition = false; + status.irq_pending = false; + status.irq_hold = false; + + status.reset_pending = true; + status.interrupt_pending = true; + status.interrupt_vector = 0xfffc; //reset vector address + + status.dma_active = false; + status.dma_counter = 0; + status.dma_clocks = 0; + status.dma_pending = false; + status.hdma_pending = false; + status.hdma_mode = 0; + + cycle_edge_state = 0; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/cpu/scpu/timing/timing.hpp b/Mednafen/mednafen/snes/src/cpu/scpu/timing/timing.hpp new file mode 100755 index 0000000000..476d88e3cf --- /dev/null +++ b/Mednafen/mednafen/snes/src/cpu/scpu/timing/timing.hpp @@ -0,0 +1,40 @@ + enum { + EventNone, + EventIrqLockRelease, + EventAluLockRelease, + EventDramRefresh, + EventHdmaInit, + EventHdmaRun, + + //cycle edge + EventFlagHdmaInit = 1 << 0, + EventFlagHdmaRun = 1 << 1, + }; + unsigned cycle_edge_state; + + //timing.cpp + unsigned dma_counter(); + + void add_clocks(unsigned clocks); + void scanline(); + + alwaysinline void cycle_edge(); + alwaysinline void last_cycle(); + + void timing_power(); + void timing_reset(); + + //irq.cpp + alwaysinline void poll_interrupts(); + void nmitimen_update(uint8 data); + bool rdnmi(); + bool timeup(); + + alwaysinline bool nmi_test(); + alwaysinline bool irq_test(); + + //joypad.cpp + void run_auto_joypad_poll(); + + //event.cpp + void queue_event(unsigned); //priorityqueue callback function diff --git a/Mednafen/mednafen/snes/src/data/documentation.html b/Mednafen/mednafen/snes/src/data/documentation.html new file mode 100755 index 0000000000..6f77261814 --- /dev/null +++ b/Mednafen/mednafen/snes/src/data/documentation.html @@ -0,0 +1,81 @@ + + + + + +

bsnes Usage Documentation


+ +bsnes is a Super Nintendo / Super Famicom emulator that strives to provide the +most faithful hardware emulation possible. It focuses on accuracy and clean +code, rather than speed and special features. It is meant as a reference +emulator to document how the underlying hardware works. It is thus very useful +for development and research. And while it can be used for general purpose +gaming, it will require significantly more powerful hardware than a typical +emulator. +
+ +

Modes of Operation


+ +bsnes is capable of running both in its default multi-user mode, as well as in +single-user mode. +

+ +In multi-user mode, configuration data is stored inside the user's home +directory. On Windows, this is located at "%APPDATA%/.bsnes". On other operating +systems, this is located at "~/.bsnes". +

+ +To enable single-user mode, create a blank "bsnes.cfg" file inside the same +folder as the bsnes executable. bsnes will then use this file to store +configuration data. +
+ +

Supported Filetypes


+ +SFC: SNES cartridge — ROM image.
+BS: Satellaview BS-X flash cartridge — EEPROM image.
+ST: Sufami Turbo cartridge — ROM image.
+SRM, PSR: non-volatile memory, often used to save game data — (P)SRAM image.
+RTC: real-time clock non-volatile memory.
+UPS: patch data, used to dynamically modify cartridge of same base filename upon load.
+CHT: plain-text list of "Game Genie" / "Pro Action Replay" codes. +
+ +

Known Limitations


+ +Satellaview BS-X emulation: this hardware is only partially supported. +This is mostly because the satellite network it used (St. GIGA) has been shut +down. Access to this network would be required to properly reverse engineer much +of the hardware. Working around this would require game-specific hacks, which +are contrary to the design goals of this emulator. As a result, most BS-X +software will not function correctly. +

+ +Netplay: internet multiplay is not currently supported nor planned. +
+ +

Contributors


+• Andreas Naive
+• anomie
+• _Demo_
+• Derrick Sobodash
+• DMV27
+• FirebrandX
+• FitzRoy
+• GIGO
+• Jonas Quinn
+• kode54
+• krom
+• Matthew Callis
+• Nach
+• neviksti
+• Overload
+• RedDwarf
+• Richard Bannister
+• Shay Green
+• tetsuo55
+• TRAC
+• zones
+ + + diff --git a/Mednafen/mednafen/snes/src/data/license.html b/Mednafen/mednafen/snes/src/data/license.html new file mode 100755 index 0000000000..3f3508cbe2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/data/license.html @@ -0,0 +1,77 @@ + + + + + +

GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991

+
+ +

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION


+ +0. +This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

+ +1. +You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

+ +2. +You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

+
    +
  • a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
  • +
  • b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
  • +
  • c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
  • +
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

+ +3. +You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: +
    +
  • a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
  • +
  • b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
  • +
  • c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
  • +
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

+ +4. +You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

+ +5. +You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

+ +6. +Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

+ +7. +If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

+ +8. +If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

+ +9. +The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

+ +10. +If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

+ +NO WARRANTY

+ +11. +BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+ +12. +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ +

END OF TERMS AND CONDITIONS

+ + + diff --git a/Mednafen/mednafen/snes/src/interface.hpp b/Mednafen/mednafen/snes/src/interface.hpp new file mode 100755 index 0000000000..88b1240074 --- /dev/null +++ b/Mednafen/mednafen/snes/src/interface.hpp @@ -0,0 +1,32 @@ +#ifdef DEBUGGER + #define debugvirtual virtual +#else + #define debugvirtual +#endif + +namespace bSNES_v059 { + #include "cheat/cheat.hpp" + #include "memory/memory.hpp" + #include "memory/smemory/smemory.hpp" + + #include "ppu/ppu.hpp" + + #include "cpu/cpu.hpp" + #include "cpu/core/core.hpp" + #include "cpu/scpu/scpu.hpp" + + #include "smp/smp.hpp" + + #include "sdsp/sdsp.hpp" + + #include "system/system.hpp" + #include "chip/chip.hpp" + #include "cartridge/cartridge.hpp" + //#include "cheat/cheat.hpp" + + #include "memory/memory-inline.hpp" + #include "ppu/ppu-inline.hpp" + #include "cheat/cheat-inline.hpp" +}; + +#undef debugvirtual diff --git a/Mednafen/mednafen/snes/src/lib/libco/amd64.c b/Mednafen/mednafen/snes/src/lib/libco/amd64.c new file mode 100755 index 0000000000..5f1cfca97a --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/amd64.c @@ -0,0 +1,104 @@ +/* + libco.amd64 (2009-10-12) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local long long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +static void (*co_swap)(cothread_t, cothread_t) = 0; + +#ifdef _WIN32 + //ABI: Win64 + static unsigned char co_swap_function[] = { + 0x48, 0x89, 0x22, 0x48, 0x8B, 0x21, 0x58, 0x48, 0x89, 0x6A, 0x08, 0x48, 0x89, 0x72, 0x10, 0x48, + 0x89, 0x7A, 0x18, 0x48, 0x89, 0x5A, 0x20, 0x4C, 0x89, 0x62, 0x28, 0x4C, 0x89, 0x6A, 0x30, 0x4C, + 0x89, 0x72, 0x38, 0x4C, 0x89, 0x7A, 0x40, 0x48, 0x81, 0xC2, 0x80, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xE2, 0xF0, 0x0F, 0x29, 0x32, 0x0F, 0x29, 0x7A, 0x10, 0x44, 0x0F, 0x29, 0x42, 0x20, 0x44, 0x0F, + 0x29, 0x4A, 0x30, 0x44, 0x0F, 0x29, 0x52, 0x40, 0x44, 0x0F, 0x29, 0x5A, 0x50, 0x44, 0x0F, 0x29, + 0x62, 0x60, 0x44, 0x0F, 0x29, 0x6A, 0x70, 0x44, 0x0F, 0x29, 0xB2, 0x80, 0x00, 0x00, 0x00, 0x44, + 0x0F, 0x29, 0xBA, 0x90, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x69, 0x08, 0x48, 0x8B, 0x71, 0x10, 0x48, + 0x8B, 0x79, 0x18, 0x48, 0x8B, 0x59, 0x20, 0x4C, 0x8B, 0x61, 0x28, 0x4C, 0x8B, 0x69, 0x30, 0x4C, + 0x8B, 0x71, 0x38, 0x4C, 0x8B, 0x79, 0x40, 0x48, 0x81, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x48, 0x83, + 0xE1, 0xF0, 0x0F, 0x29, 0x31, 0x0F, 0x29, 0x79, 0x10, 0x44, 0x0F, 0x29, 0x41, 0x20, 0x44, 0x0F, + 0x29, 0x49, 0x30, 0x44, 0x0F, 0x29, 0x51, 0x40, 0x44, 0x0F, 0x29, 0x59, 0x50, 0x44, 0x0F, 0x29, + 0x61, 0x60, 0x44, 0x0F, 0x29, 0x69, 0x70, 0x44, 0x0F, 0x29, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x44, + 0x0F, 0x29, 0xB9, 0x90, 0x00, 0x00, 0x00, 0xFF, 0xE0, + }; + + #include + + void co_init() { + DWORD old_privileges; + VirtualProtect(co_swap_function, sizeof co_swap_function, PAGE_EXECUTE_READWRITE, &old_privileges); + } +#else + //ABI: SystemV + static unsigned char co_swap_function[] = { + 0x48, 0x89, 0x26, 0x48, 0x8B, 0x27, 0x58, 0x48, 0x89, 0x6E, 0x08, 0x48, 0x89, 0x5E, 0x10, 0x4C, + 0x89, 0x66, 0x18, 0x4C, 0x89, 0x6E, 0x20, 0x4C, 0x89, 0x76, 0x28, 0x4C, 0x89, 0x7E, 0x30, 0x48, + 0x8B, 0x6F, 0x08, 0x48, 0x8B, 0x5F, 0x10, 0x4C, 0x8B, 0x67, 0x18, 0x4C, 0x8B, 0x6F, 0x20, 0x4C, + 0x8B, 0x77, 0x28, 0x4C, 0x8B, 0x7F, 0x30, 0xFF, 0xE0, + }; + + #include + #include + + void co_init() { + unsigned long long addr = (unsigned long long)co_swap_function; + unsigned long long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long long size = (addr - base) + sizeof co_swap_function; + mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC); + } +#endif + +static void crash() { + assert(0); /* called only if cothread_t entrypoint returns */ +} + +cothread_t co_active() { + if(!co_active_handle) co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) { + cothread_t handle; + if(!co_swap) { + co_init(); + co_swap = (void (*)(cothread_t, cothread_t))co_swap_function; + } + if(!co_active_handle) co_active_handle = &co_active_buffer; + size += 512; /* allocate additional space for storage */ + size &= ~15; /* align stack to 16-byte boundary */ + + if(handle = (cothread_t)malloc(size)) { + long long *p = (long long*)((char*)handle + size); /* seek to top of stack */ + *--p = (long long)crash; /* crash if entrypoint returns */ + *--p = (long long)entrypoint; /* start of function */ + *(long long*)handle = (long long)p; /* stack pointer */ + } + + return handle; +} + +void co_delete(cothread_t handle) { + free(handle); +} + +void co_switch(cothread_t handle) { + register cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/benchmark.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/benchmark.c new file mode 100644 index 0000000000..ea2f899761 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/benchmark.c @@ -0,0 +1,123 @@ +/* Measures absolute and relative performance of co_switch() +versus function call. */ + +#include "libco/libco.h" + +#include +#include +#include +#include +#include "testing.h" + +/* Keep calling this until it returns non-zero value. Result +is number of calls made per second. */ +double calls_per_sec( void ); + +/* Something to do in addition to func call/co_switch */ +static volatile int counter; +#define DO_SOMETHING() counter++ + + +void benchmark_func( void ); + +static double time_func( void ) +{ + int const iter = 100000; + double rate; + while ( !(rate = calls_per_sec()) ) + { + int n; + for ( n = iter / 4; n--; ) + { + benchmark_func(); + benchmark_func(); + benchmark_func(); + benchmark_func(); + } + } + return rate * iter; +} + + +/* co_switch timing */ +static cothread_t main_thread; + +static void thread_func( void ) +{ + while ( 1 ) + { + co_switch( main_thread ); DO_SOMETHING(); + co_switch( main_thread ); DO_SOMETHING(); + co_switch( main_thread ); DO_SOMETHING(); + co_switch( main_thread ); DO_SOMETHING(); + } +} + +static double time_co_switch( void ) +{ + int const iter = 1000; + double rate; + cothread_t thread; + + main_thread = co_active(); + thread = co_create( 16 * 1024, thread_func ); + assert( thread && main_thread ); + + while ( !(rate = calls_per_sec()) ) + { + int n; + for ( n = iter / 4; n--; ) + { + co_switch( thread ); + co_switch( thread ); + co_switch( thread ); + co_switch( thread ); + } + } + return rate * iter; +} + + +/* Time both and compare */ +int main( void ) +{ + double func_rate = time_func(); + double co_rate = time_co_switch(); + + print_libco_opts(); + + printf( "%6.2f M function calls per sec\n", func_rate / 1000000 ); + printf( "%6.2f M co_switch()x2 per sec\n", co_rate / 1000000 ); + + printf( "Function call is %.1fX faster than two co_switch() calls.\n\n", func_rate / co_rate ); + + return 0; +} + + +/* Utility */ +double calls_per_sec( void ) +{ + #define DURATION CLOCKS_PER_SEC + + static clock_t s_end; + static int s_iter; + clock_t const present = clock(); + int const iter = s_iter++; + if ( iter <= 1 ) /* throw away first iteration since it'll be slower due to setup */ + { + if ( CLOCKS_PER_SEC < 10 ) + { + fprintf( stderr, "Not enough clock() resolution\n" ); + exit( EXIT_FAILURE ); + } + while ( clock() == present ) { } + s_end = clock() + DURATION; + } + else if ( present >= s_end ) + { + s_iter = 0; + return (double) (iter - 1) * CLOCKS_PER_SEC / (present - s_end + DURATION); + } + return 0; +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/benchmark_impl.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/benchmark_impl.c new file mode 100644 index 0000000000..46aa8927f8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/benchmark_impl.c @@ -0,0 +1,5 @@ + +/* Function timing */ +void benchmark_func( void ) +{ +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/libco.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/libco.c new file mode 100644 index 0000000000..5567626330 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/libco.c @@ -0,0 +1,23 @@ +/* + libco + auto-selection module + license: public domain +*/ + +#if defined(__GNUC__) && defined(__i386__) + #include "x86.c" +#elif defined(__GNUC__) && defined(__amd64__) + #include "amd64.c" +#elif defined(__GNUC__) && defined(_ARCH_PPC) + #include "ppc.c" +#elif defined(__GNUC__) + #include "sjlj.c" +#elif defined(_MSC_VER) && defined(_M_IX86) + #include "x86.c" +#elif defined(_MSC_VER) && defined(_M_AMD64) + #include "amd64.c" +#elif defined(_MSC_VER) + #include "fiber.c" +#else + #error "libco: unsupported processor, compiler or operating system" +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/libco.h b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/libco.h new file mode 100644 index 0000000000..b1b49a29d6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/libco.h @@ -0,0 +1,34 @@ +/* + libco + version: 0.15 (2009-10-12) + license: public domain +*/ + +#ifndef LIBCO_H +#define LIBCO_H + +#ifdef LIBCO_C + #ifdef LIBCO_MP + #define thread_local __thread + #else + #define thread_local + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* cothread_t; + +cothread_t co_active(); +cothread_t co_create(unsigned int, void (*)(void)); +void co_delete(cothread_t); +void co_switch(cothread_t); + +#ifdef __cplusplus +} +#endif + +/* ifndef LIBCO_H */ +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/ppc.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/ppc.c new file mode 100644 index 0000000000..a6028fdba2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/libco/ppc.c @@ -0,0 +1,407 @@ +/* + libco.ppc (2010-10-17) + author: blargg + license: public domain +*/ + +/* PowerPC 32/64 using embedded or external asm, with optional +floating-point and AltiVec save/restore */ + +#define LIBCO_C +#include "libco.h" +#include +#include +#include + +#define LIBCO_MPROTECT (__unix__ && !LIBCO_PPC_ASM) + +#if LIBCO_MPROTECT + #include + #include +#endif + +/* State format (offsets in 32-bit words) + ++0 Pointer to swap code + Rest of function descriptor for entry function ++8 PC ++10 SP + Special regs + GPRs + FPRs + VRs + stack +*/ + +enum { state_size = 1024 }; +enum { above_stack = 2048 }; +enum { stack_align = 256 }; + +static thread_local cothread_t co_active_handle = 0; + +/**** Determine environment ****/ + +#define LIBCO_PPC64 (_ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__) + +/* Whether function calls are indirect through a descriptor, +or are directly to function */ +#ifndef LIBCO_PPCDESC + #if !_CALL_SYSV && (_CALL_AIX || _CALL_AIXDESC || LIBCO_PPC64) + #define LIBCO_PPCDESC 1 + #endif +#endif + +#ifdef LIBCO_PPC_ASM + + #ifdef __cplusplus + extern "C" + #endif + + /* Swap code is in ppc.S */ + void co_swap_asm( cothread_t, cothread_t ); + #define CO_SWAP_ASM( x, y ) co_swap_asm( x, y ) + +#else + +/* Swap code is here in array. Please leave dieassembly comments, +as they make it easy to see what it does, and reorder instructions +if one wants to see whether that improves performance. */ +static const uint32_t libco_ppc_code [] = { +#if LIBCO_PPC64 + 0x7d000026, /* mfcr r8 */ + 0xf8240028, /* std r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0xf9c40048, /* std r14,72(r4) */ + 0xf9e40050, /* std r15,80(r4) */ + 0xfa040058, /* std r16,88(r4) */ + 0xfa240060, /* std r17,96(r4) */ + 0xfa440068, /* std r18,104(r4) */ + 0xfa640070, /* std r19,112(r4) */ + 0xfa840078, /* std r20,120(r4) */ + 0xfaa40080, /* std r21,128(r4) */ + 0xfac40088, /* std r22,136(r4) */ + 0xfae40090, /* std r23,144(r4) */ + 0xfb040098, /* std r24,152(r4) */ + 0xfb2400a0, /* std r25,160(r4) */ + 0xfb4400a8, /* std r26,168(r4) */ + 0xfb6400b0, /* std r27,176(r4) */ + 0xfb8400b8, /* std r28,184(r4) */ + 0xfba400c0, /* std r29,192(r4) */ + 0xfbc400c8, /* std r30,200(r4) */ + 0xfbe400d0, /* std r31,208(r4) */ + 0xf9240020, /* std r9,32(r4) */ + 0xe8e30020, /* ld r7,32(r3) */ + 0xe8230028, /* ld r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030,/*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0xe9c30048, /* ld r14,72(r3) */ + 0xe9e30050, /* ld r15,80(r3) */ + 0xea030058, /* ld r16,88(r3) */ + 0xea230060, /* ld r17,96(r3) */ + 0xea430068, /* ld r18,104(r3) */ + 0xea630070, /* ld r19,112(r3) */ + 0xea830078, /* ld r20,120(r3) */ + 0xeaa30080, /* ld r21,128(r3) */ + 0xeac30088, /* ld r22,136(r3) */ + 0xeae30090, /* ld r23,144(r3) */ + 0xeb030098, /* ld r24,152(r3) */ + 0xeb2300a0, /* ld r25,160(r3) */ + 0xeb4300a8, /* ld r26,168(r3) */ + 0xeb6300b0, /* ld r27,176(r3) */ + 0xeb8300b8, /* ld r28,184(r3) */ + 0xeba300c0, /* ld r29,192(r3) */ + 0xebc300c8, /* ld r30,200(r3) */ + 0xebe300d0, /* ld r31,208(r3) */ + 0x7ccff120, /* mtcr r6 */ +#else + 0x7d000026, /* mfcr r8 */ + 0x90240028, /* stw r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0x91a4003c, /* stw r13,60(r4) */ + 0x91c40040, /* stw r14,64(r4) */ + 0x91e40044, /* stw r15,68(r4) */ + 0x92040048, /* stw r16,72(r4) */ + 0x9224004c, /* stw r17,76(r4) */ + 0x92440050, /* stw r18,80(r4) */ + 0x92640054, /* stw r19,84(r4) */ + 0x92840058, /* stw r20,88(r4) */ + 0x92a4005c, /* stw r21,92(r4) */ + 0x92c40060, /* stw r22,96(r4) */ + 0x92e40064, /* stw r23,100(r4) */ + 0x93040068, /* stw r24,104(r4) */ + 0x9324006c, /* stw r25,108(r4) */ + 0x93440070, /* stw r26,112(r4) */ + 0x93640074, /* stw r27,116(r4) */ + 0x93840078, /* stw r28,120(r4) */ + 0x93a4007c, /* stw r29,124(r4) */ + 0x93c40080, /* stw r30,128(r4) */ + 0x93e40084, /* stw r31,132(r4) */ + 0x91240020, /* stw r9,32(r4) */ + 0x80e30020, /* lwz r7,32(r3) */ + 0x80230028, /* lwz r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030,/*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0x81a3003c, /* lwz r13,60(r3) */ + 0x81c30040, /* lwz r14,64(r3) */ + 0x81e30044, /* lwz r15,68(r3) */ + 0x82030048, /* lwz r16,72(r3) */ + 0x8223004c, /* lwz r17,76(r3) */ + 0x82430050, /* lwz r18,80(r3) */ + 0x82630054, /* lwz r19,84(r3) */ + 0x82830058, /* lwz r20,88(r3) */ + 0x82a3005c, /* lwz r21,92(r3) */ + 0x82c30060, /* lwz r22,96(r3) */ + 0x82e30064, /* lwz r23,100(r3) */ + 0x83030068, /* lwz r24,104(r3) */ + 0x8323006c, /* lwz r25,108(r3) */ + 0x83430070, /* lwz r26,112(r3) */ + 0x83630074, /* lwz r27,116(r3) */ + 0x83830078, /* lwz r28,120(r3) */ + 0x83a3007c, /* lwz r29,124(r3) */ + 0x83c30080, /* lwz r30,128(r3) */ + 0x83e30084, /* lwz r31,132(r3) */ + 0x7ccff120, /* mtcr r6 */ +#endif + +#ifndef LIBCO_PPC_NOFP + 0xd9c400e0, /* stfd f14,224(r4) */ + 0xd9e400e8, /* stfd f15,232(r4) */ + 0xda0400f0, /* stfd f16,240(r4) */ + 0xda2400f8, /* stfd f17,248(r4) */ + 0xda440100, /* stfd f18,256(r4) */ + 0xda640108, /* stfd f19,264(r4) */ + 0xda840110, /* stfd f20,272(r4) */ + 0xdaa40118, /* stfd f21,280(r4) */ + 0xdac40120, /* stfd f22,288(r4) */ + 0xdae40128, /* stfd f23,296(r4) */ + 0xdb040130, /* stfd f24,304(r4) */ + 0xdb240138, /* stfd f25,312(r4) */ + 0xdb440140, /* stfd f26,320(r4) */ + 0xdb640148, /* stfd f27,328(r4) */ + 0xdb840150, /* stfd f28,336(r4) */ + 0xdba40158, /* stfd f29,344(r4) */ + 0xdbc40160, /* stfd f30,352(r4) */ + 0xdbe40168, /* stfd f31,360(r4) */ + 0xc9c300e0, /* lfd f14,224(r3) */ + 0xc9e300e8, /* lfd f15,232(r3) */ + 0xca0300f0, /* lfd f16,240(r3) */ + 0xca2300f8, /* lfd f17,248(r3) */ + 0xca430100, /* lfd f18,256(r3) */ + 0xca630108, /* lfd f19,264(r3) */ + 0xca830110, /* lfd f20,272(r3) */ + 0xcaa30118, /* lfd f21,280(r3) */ + 0xcac30120, /* lfd f22,288(r3) */ + 0xcae30128, /* lfd f23,296(r3) */ + 0xcb030130, /* lfd f24,304(r3) */ + 0xcb230138, /* lfd f25,312(r3) */ + 0xcb430140, /* lfd f26,320(r3) */ + 0xcb630148, /* lfd f27,328(r3) */ + 0xcb830150, /* lfd f28,336(r3) */ + 0xcba30158, /* lfd f29,344(r3) */ + 0xcbc30160, /* lfd f30,352(r3) */ + 0xcbe30168, /* lfd f31,360(r3) */ +#endif + +#ifdef __ALTIVEC__ + 0x7ca042a6, /* mfvrsave r5 */ + 0x39040180, /* addi r8,r4,384 */ + 0x39240190, /* addi r9,r4,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x90a40034, /* stw r5,52(r4) */ + 0x4182005c, /* beq- 2 */ + 0x7e8041ce, /* stvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea049ce, /* stvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec041ce, /* stvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee049ce, /* stvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0041ce, /* stvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2049ce, /* stvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4041ce, /* stvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6049ce, /* stvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8041ce, /* stvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa049ce, /* stvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc041ce, /* stvx v30,r0,r8 */ + 0x7fe049ce, /* stvx v31,r0,r9 */ + 0x80a30034,/*2:lwz r5,52(r3) */ + 0x39030180, /* addi r8,r3,384 */ + 0x39230190, /* addi r9,r3,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x7ca043a6, /* mtvrsave r5 */ + 0x4d820420, /* beqctr */ + 0x7e8040ce, /* lvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea048ce, /* lvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec040ce, /* lvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee048ce, /* lvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0040ce, /* lvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2048ce, /* lvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4040ce, /* lvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6048ce, /* lvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8040ce, /* lvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa048ce, /* lvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc040ce, /* lvx v30,r0,r8 */ + 0x7fe048ce, /* lvx v31,r0,r9 */ +#endif + + 0x4e800420, /* bctr */ +}; + + #if LIBCO_PPCDESC + /* Function call goes through indirect descriptor */ + #define CO_SWAP_ASM( x, y ) \ + ((void (*)( cothread_t, cothread_t )) (uintptr_t) x)( x, y ) + #else + /* Function call goes directly to code */ + #define CO_SWAP_ASM( x, y ) \ + ((void (*)( cothread_t, cothread_t )) (uintptr_t) libco_ppc_code)( x, y ) + #endif + +#endif + +static uint32_t* co_create_( unsigned size, uintptr_t entry ) +{ + uint32_t* t = (uint32_t*) malloc( size ); + + (void) entry; + + #if LIBCO_PPCDESC + if ( t ) + { + /* Copy entry's descriptor */ + memcpy( t, (void*) entry, sizeof (void*) * 3 ); + + /* Set function pointer to swap routine */ + #ifdef LIBCO_PPC_ASM + *(const void**) t = *(void**) &co_swap_asm; + #else + *(const void**) t = libco_ppc_code; + #endif + } + #endif + + return t; +} + +cothread_t co_create( unsigned int size, void (*entry_)( void ) ) +{ + uintptr_t entry = (uintptr_t) entry_; + uint32_t* t = NULL; + + /* Be sure main thread was successfully allocated */ + if ( co_active() ) + { + size += state_size + above_stack + stack_align; + t = co_create_( size, entry ); + } + + if ( t ) + { + uintptr_t sp; + int shift; + + /* Save current registers into new thread, so that any special ones will + have proper values when thread is begun */ + CO_SWAP_ASM( t, t ); + + #if LIBCO_PPCDESC + /* Get real address */ + entry = (uintptr_t) *(void**) entry; + #endif + + /* Put stack near end of block, and align */ + sp = (uintptr_t) t + size - above_stack; + sp -= sp % stack_align; + + /* On PPC32, we save and restore GPRs as 32 bits. For PPC64, we + save and restore them as 64 bits, regardless of the size the ABI + uses. So, we manually write pointers at the proper size. We always + save and restore at the same address, and since PPC is big-endian, + we must put the low byte first on PPC32. */ + + /* If uintptr_t is 32 bits, >>32 is undefined behavior, so we do two shifts + and don't have to care how many bits uintptr_t is. */ + #if LIBCO_PPC64 + shift = 16; + #else + shift = 0; + #endif + + /* Set up so entry will be called on next swap */ + t [8] = (uint32_t) (entry >> shift >> shift); + t [9] = (uint32_t) entry; + + t [10] = (uint32_t) (sp >> shift >> shift); + t [11] = (uint32_t) sp; + } + + return t; +} + +void co_delete( cothread_t t ) +{ + free( t ); +} + +static void co_init_( void ) +{ + #if LIBCO_MPROTECT + /* TODO: pre- and post-pad PPC code so that this doesn't make other + data executable and writable */ + long page_size = sysconf( _SC_PAGESIZE ); + if ( page_size > 0 ) + { + uintptr_t align = page_size; + uintptr_t begin = (uintptr_t) libco_ppc_code; + uintptr_t end = begin + sizeof libco_ppc_code; + + /* Align beginning and end */ + end += align - 1; + end -= end % align; + begin -= begin % align; + + mprotect( (void*) begin, end - begin, PROT_READ | PROT_WRITE | PROT_EXEC ); + } + #endif + + co_active_handle = co_create_( state_size, (uintptr_t) &co_switch ); +} + +cothread_t co_active() +{ + if ( !co_active_handle ) + co_init_(); + + return co_active_handle; +} + +void co_switch( cothread_t t ) +{ + cothread_t old = co_active_handle; + co_active_handle = t; + + CO_SWAP_ASM( t, old ); +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc.S b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc.S new file mode 100644 index 0000000000..268deb449e --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc.S @@ -0,0 +1,265 @@ +// Core processor state swap function. +// Only used by ppc.c if LIBCO_PPC_ASM is defined. +// Main purpose of this asm file is to allow easy development of improvements. + +// If this isn't available, you can just do -mregnames when compiling +#include "ppc-asm.h" + +.section ".text" +.align 5 +.globl co_swap_asm +.type co_swap_asm, @function + +// Wrap GPR load/stores so that we can use the same code for +// PPC and PPC64. +#if _ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__ + #define STWD std + #define LWZD ld + #define GPR_SIZE 8 +#else + #define LIBCO_PPC32 1 + #define STWD stw + #define LWZD lwz + #define GPR_SIZE 4 +#endif + +// Offsets of values in memory +#define PC_OFF 32 +#define SP_OFF 40 +#define CR_OFF 48 +#define VRSAVE_OFF 52 +#define GPR_OFF 56 +#define FPR_OFF 224 +#define VR_OFF 384 + +// Avoid stupid coding errors by letting the preprocessor +// keep things consistent for us. +#define FPR(n) FPR_OFF - 8*14 + 8*n +#define GPR(n) GPR_OFF - GPR_SIZE*12 + GPR_SIZE*n + +#define FPR_NAME(n) f##n +#define GPR_NAME(n) r##n + +// REG_MEM(FPR,31) turns into f31,FPR_OFF+8*(31-14) +#define REG_MEM( reg, n ) reg##_NAME(n), reg(n) + +// void co_swap_asm( cothread_t new, cothread_t old ) +co_swap_asm: + // We must save current state into old, and load + // new state from new. Might be called with old=new, + // so we must not load a particular register before + // having saved it. I don't think this hurts + // performance, since there are enough instructions + // to mix in. + + // Improve performance by reordering things somewhat. + // Try to keep GPR saves/loads in block, for clarity. + + /* new old + r3 pointer + r4 pointer + r5 flags flags + r6 CR + r7 PC + r8 CR + r9 PC + */ + + mfcr r8 + STWD sp, SP_OFF (r4) + mflr r9 + + // Save GPRs +#if LIBCO_PPC32 + STWD REG_MEM(GPR,13) (r4) +#endif + STWD REG_MEM(GPR,14) (r4) + STWD REG_MEM(GPR,15) (r4) + STWD REG_MEM(GPR,16) (r4) + STWD REG_MEM(GPR,17) (r4) + STWD REG_MEM(GPR,18) (r4) + STWD REG_MEM(GPR,19) (r4) + STWD REG_MEM(GPR,20) (r4) + STWD REG_MEM(GPR,21) (r4) + STWD REG_MEM(GPR,22) (r4) + STWD REG_MEM(GPR,23) (r4) + STWD REG_MEM(GPR,24) (r4) + STWD REG_MEM(GPR,25) (r4) + STWD REG_MEM(GPR,26) (r4) + STWD REG_MEM(GPR,27) (r4) + STWD REG_MEM(GPR,28) (r4) + STWD REG_MEM(GPR,29) (r4) + STWD REG_MEM(GPR,30) (r4) + STWD REG_MEM(GPR,31) (r4) + + STWD r9, PC_OFF (r4) + LWZD r7, PC_OFF (r3) + LWZD sp, SP_OFF (r3) + bl 1f // Crash if entry function returns + trap +1: stw r8, CR_OFF (r4) + lwz r6, CR_OFF (r3) + mtctr r7 + + // Load GPRs +#if LIBCO_PPC32 + LWZD REG_MEM(GPR,13) (r3) +#endif + LWZD REG_MEM(GPR,14) (r3) + LWZD REG_MEM(GPR,15) (r3) + LWZD REG_MEM(GPR,16) (r3) + LWZD REG_MEM(GPR,17) (r3) + LWZD REG_MEM(GPR,18) (r3) + LWZD REG_MEM(GPR,19) (r3) + LWZD REG_MEM(GPR,20) (r3) + LWZD REG_MEM(GPR,21) (r3) + LWZD REG_MEM(GPR,22) (r3) + LWZD REG_MEM(GPR,23) (r3) + LWZD REG_MEM(GPR,24) (r3) + LWZD REG_MEM(GPR,25) (r3) + LWZD REG_MEM(GPR,26) (r3) + LWZD REG_MEM(GPR,27) (r3) + LWZD REG_MEM(GPR,28) (r3) + LWZD REG_MEM(GPR,29) (r3) + LWZD REG_MEM(GPR,30) (r3) + LWZD REG_MEM(GPR,31) (r3) + + mtcr r6 + +#ifndef LIBCO_PPC_NOFP + // Save FPRs + stfd REG_MEM(FPR,14) (r4) + stfd REG_MEM(FPR,15) (r4) + stfd REG_MEM(FPR,16) (r4) + stfd REG_MEM(FPR,17) (r4) + stfd REG_MEM(FPR,18) (r4) + stfd REG_MEM(FPR,19) (r4) + stfd REG_MEM(FPR,20) (r4) + stfd REG_MEM(FPR,21) (r4) + stfd REG_MEM(FPR,22) (r4) + stfd REG_MEM(FPR,23) (r4) + stfd REG_MEM(FPR,24) (r4) + stfd REG_MEM(FPR,25) (r4) + stfd REG_MEM(FPR,26) (r4) + stfd REG_MEM(FPR,27) (r4) + stfd REG_MEM(FPR,28) (r4) + stfd REG_MEM(FPR,29) (r4) + stfd REG_MEM(FPR,30) (r4) + stfd REG_MEM(FPR,31) (r4) + + // Load FPRs + lfd REG_MEM(FPR,14) (r3) + lfd REG_MEM(FPR,15) (r3) + lfd REG_MEM(FPR,16) (r3) + lfd REG_MEM(FPR,17) (r3) + lfd REG_MEM(FPR,18) (r3) + lfd REG_MEM(FPR,19) (r3) + lfd REG_MEM(FPR,20) (r3) + lfd REG_MEM(FPR,21) (r3) + lfd REG_MEM(FPR,22) (r3) + lfd REG_MEM(FPR,23) (r3) + lfd REG_MEM(FPR,24) (r3) + lfd REG_MEM(FPR,25) (r3) + lfd REG_MEM(FPR,26) (r3) + lfd REG_MEM(FPR,27) (r3) + lfd REG_MEM(FPR,28) (r3) + lfd REG_MEM(FPR,29) (r3) + lfd REG_MEM(FPR,30) (r3) + lfd REG_MEM(FPR,31) (r3) +#endif + +#ifdef __ALTIVEC__ + // Performance testing showed that conditionally saving/restoring + // individual registers was worse than just doing them all. + + // Save VRSAVE + mfspr r5, 256 // get VRSAVE + addi r8, r4,VR_OFF + addi r9, r4,VR_OFF + 16 + andi. r0, r5,0x0FFF // see whether anything to save + stw r5, VRSAVE_OFF(r4) + beq 2f // skip if nothing to save + + // Save VRs + + // we use two pointers to avoid stalls + stvx v20,0,r8 + addi r8,r8,32 + + stvx v21,0,r9 + addi r9,r9,32 + + stvx v22,0,r8 + addi r8,r8,32 + + stvx v23,0,r9 + addi r9,r9,32 + + stvx v24,0,r8 + addi r8,r8,32 + + stvx v25,0,r9 + addi r9,r9,32 + + stvx v26,0,r8 + addi r8,r8,32 + + stvx v27,0,r9 + addi r9,r9,32 + + stvx v28,0,r8 + addi r8,r8,32 + + stvx v29,0,r9 + addi r9,r9,32 + + stvx v30,0,r8 + + stvx v31,0,r9 + +2: + // Load VRSAVE + lwz r5, VRSAVE_OFF(r3) + addi r8, r3,VR_OFF + addi r9, r3,VR_OFF + 16 + andi. r0, r5,0x0FFF + mtspr 256,r5 // set VRSAVE + beqctr // return if nothing to restore + + // Load VRs + lvx v20,0,r8 + addi r8,r8,32 + + lvx v21,0,r9 + addi r9,r9,32 + + lvx v22,0,r8 + addi r8,r8,32 + + lvx v23,0,r9 + addi r9,r9,32 + + lvx v24,0,r8 + addi r8,r8,32 + + lvx v25,0,r9 + addi r9,r9,32 + + lvx v26,0,r8 + addi r8,r8,32 + + lvx v27,0,r9 + addi r9,r9,32 + + lvx v28,0,r8 + addi r8,r8,32 + + lvx v29,0,r9 + addi r9,r9,32 + + lvx v30,0,r8 + + lvx v31,0,r9 +#endif + + bctr diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc_regs.S b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc_regs.S new file mode 100644 index 0000000000..2a769eef07 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc_regs.S @@ -0,0 +1,329 @@ +.section ".text" +.align 5 +.globl save_ppc_regs +.globl load_ppc_regs + +.type save_ppc_regs, @function +.type load_ppc_regs, @function + +#if _ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__ + #define STWD std + #define LWZD ld + #define GPR_EXTRA 0 +#else + #define STWD stw + #define LWZD lwz + #define GPR_EXTRA 4 +#endif + +#define VR_OFF 0 +#define FPR_OFF 512 +#define GPR_OFF 768 +#define SPR_OFF 1024 + +#define FPR(n) FPR_OFF + 8*n +#define GPR(n) GPR_OFF + GPR_EXTRA + 8*n +#define SPR(n) SPR_OFF + 4*n + +#define FPR_NAME(n) f##n +#define GPR_NAME(n) r##n + +#define REG_MEM( reg, n ) reg##_NAME(n), reg(n) + +save_ppc_regs: + mfcr r0 + stw r0, SPR(0) (r3) + + mfspr r0,256 /* VRSAVE */ + stw r0, SPR(1) (r3) + + mfctr r0 + stw r0, SPR(2) (r3) + + mfxer r0 + stw r0, SPR(3) (r3) + + STWD REG_MEM(GPR, 0) (r3) + STWD REG_MEM(GPR, 1) (r3) + STWD REG_MEM(GPR, 2) (r3) + STWD REG_MEM(GPR, 3) (r3) + STWD REG_MEM(GPR, 4) (r3) + STWD REG_MEM(GPR, 5) (r3) + STWD REG_MEM(GPR, 6) (r3) + STWD REG_MEM(GPR, 7) (r3) + STWD REG_MEM(GPR, 8) (r3) + STWD REG_MEM(GPR, 9) (r3) + STWD REG_MEM(GPR,10) (r3) + STWD REG_MEM(GPR,11) (r3) + STWD REG_MEM(GPR,12) (r3) + STWD REG_MEM(GPR,13) (r3) + STWD REG_MEM(GPR,14) (r3) + STWD REG_MEM(GPR,15) (r3) + STWD REG_MEM(GPR,16) (r3) + STWD REG_MEM(GPR,17) (r3) + STWD REG_MEM(GPR,18) (r3) + STWD REG_MEM(GPR,19) (r3) + STWD REG_MEM(GPR,20) (r3) + STWD REG_MEM(GPR,21) (r3) + STWD REG_MEM(GPR,22) (r3) + STWD REG_MEM(GPR,23) (r3) + STWD REG_MEM(GPR,24) (r3) + STWD REG_MEM(GPR,25) (r3) + STWD REG_MEM(GPR,26) (r3) + STWD REG_MEM(GPR,27) (r3) + STWD REG_MEM(GPR,28) (r3) + STWD REG_MEM(GPR,29) (r3) + STWD REG_MEM(GPR,30) (r3) + STWD REG_MEM(GPR,31) (r3) + + stfd REG_MEM(FPR, 0) (r3) + stfd REG_MEM(FPR, 1) (r3) + stfd REG_MEM(FPR, 2) (r3) + stfd REG_MEM(FPR, 3) (r3) + stfd REG_MEM(FPR, 4) (r3) + stfd REG_MEM(FPR, 5) (r3) + stfd REG_MEM(FPR, 6) (r3) + stfd REG_MEM(FPR, 7) (r3) + stfd REG_MEM(FPR, 8) (r3) + stfd REG_MEM(FPR, 9) (r3) + stfd REG_MEM(FPR,10) (r3) + stfd REG_MEM(FPR,11) (r3) + stfd REG_MEM(FPR,12) (r3) + stfd REG_MEM(FPR,13) (r3) + stfd REG_MEM(FPR,14) (r3) + stfd REG_MEM(FPR,15) (r3) + stfd REG_MEM(FPR,16) (r3) + stfd REG_MEM(FPR,17) (r3) + stfd REG_MEM(FPR,18) (r3) + stfd REG_MEM(FPR,19) (r3) + stfd REG_MEM(FPR,20) (r3) + stfd REG_MEM(FPR,21) (r3) + stfd REG_MEM(FPR,22) (r3) + stfd REG_MEM(FPR,23) (r3) + stfd REG_MEM(FPR,24) (r3) + stfd REG_MEM(FPR,25) (r3) + stfd REG_MEM(FPR,26) (r3) + stfd REG_MEM(FPR,27) (r3) + stfd REG_MEM(FPR,28) (r3) + stfd REG_MEM(FPR,29) (r3) + stfd REG_MEM(FPR,30) (r3) + stfd REG_MEM(FPR,31) (r3) + + mffs f0 + stfd f0, SPR(4) (r3) + + addi r5, r3, VR_OFF + stvx v0, 0, r5 + addi r5, r5, 16 + stvx v1, 0, r5 + addi r5, r5, 16 + stvx v2, 0, r5 + addi r5, r5, 16 + stvx v3, 0, r5 + addi r5, r5, 16 + stvx v4, 0, r5 + addi r5, r5, 16 + stvx v5, 0, r5 + addi r5, r5, 16 + stvx v6, 0, r5 + addi r5, r5, 16 + stvx v7, 0, r5 + addi r5, r5, 16 + stvx v8, 0, r5 + addi r5, r5, 16 + stvx v9, 0, r5 + addi r5, r5, 16 + stvx v10, 0, r5 + addi r5, r5, 16 + stvx v11, 0, r5 + addi r5, r5, 16 + stvx v12, 0, r5 + addi r5, r5, 16 + stvx v13, 0, r5 + addi r5, r5, 16 + stvx v14, 0, r5 + addi r5, r5, 16 + stvx v15, 0, r5 + addi r5, r5, 16 + stvx v16, 0, r5 + addi r5, r5, 16 + stvx v17, 0, r5 + addi r5, r5, 16 + stvx v18, 0, r5 + addi r5, r5, 16 + stvx v19, 0, r5 + addi r5, r5, 16 + stvx v20, 0, r5 + addi r5, r5, 16 + stvx v21, 0, r5 + addi r5, r5, 16 + stvx v22, 0, r5 + addi r5, r5, 16 + stvx v23, 0, r5 + addi r5, r5, 16 + stvx v24, 0, r5 + addi r5, r5, 16 + stvx v25, 0, r5 + addi r5, r5, 16 + stvx v26, 0, r5 + addi r5, r5, 16 + stvx v27, 0, r5 + addi r5, r5, 16 + stvx v28, 0, r5 + addi r5, r5, 16 + stvx v29, 0, r5 + addi r5, r5, 16 + stvx v30, 0, r5 + addi r5, r5, 16 + stvx v31, 0, r5 + + blr + +load_ppc_regs: + lwz r0, SPR(0) (r3) + mtcr r0 + + lwz r0, SPR(1) (r3) + mtspr 256, r0 + + lwz r0, SPR(2) (r3) + mtctr r0 + + lwz r0, SPR(3) (r3) + mtxer r0 + + lfd f0, SPR(4) (r3) + mtfsf 255, f0 + + LWZD REG_MEM(GPR, 0) (r3) + + + + LWZD REG_MEM(GPR, 4) (r3) + LWZD REG_MEM(GPR, 5) (r3) + LWZD REG_MEM(GPR, 6) (r3) + LWZD REG_MEM(GPR, 7) (r3) + LWZD REG_MEM(GPR, 8) (r3) + LWZD REG_MEM(GPR, 9) (r3) + LWZD REG_MEM(GPR,10) (r3) + LWZD REG_MEM(GPR,11) (r3) + LWZD REG_MEM(GPR,12) (r3) + LWZD REG_MEM(GPR,13) (r3) + LWZD REG_MEM(GPR,14) (r3) + LWZD REG_MEM(GPR,15) (r3) + LWZD REG_MEM(GPR,16) (r3) + LWZD REG_MEM(GPR,17) (r3) + LWZD REG_MEM(GPR,18) (r3) + LWZD REG_MEM(GPR,19) (r3) + LWZD REG_MEM(GPR,20) (r3) + LWZD REG_MEM(GPR,21) (r3) + LWZD REG_MEM(GPR,22) (r3) + LWZD REG_MEM(GPR,23) (r3) + LWZD REG_MEM(GPR,24) (r3) + LWZD REG_MEM(GPR,25) (r3) + LWZD REG_MEM(GPR,26) (r3) + LWZD REG_MEM(GPR,27) (r3) + LWZD REG_MEM(GPR,28) (r3) + LWZD REG_MEM(GPR,29) (r3) + LWZD REG_MEM(GPR,30) (r3) + LWZD REG_MEM(GPR,31) (r3) + + lfd REG_MEM(FPR, 0) (r3) + lfd REG_MEM(FPR, 1) (r3) + lfd REG_MEM(FPR, 2) (r3) + lfd REG_MEM(FPR, 3) (r3) + lfd REG_MEM(FPR, 4) (r3) + lfd REG_MEM(FPR, 5) (r3) + lfd REG_MEM(FPR, 6) (r3) + lfd REG_MEM(FPR, 7) (r3) + lfd REG_MEM(FPR, 8) (r3) + lfd REG_MEM(FPR, 9) (r3) + lfd REG_MEM(FPR,10) (r3) + lfd REG_MEM(FPR,11) (r3) + lfd REG_MEM(FPR,12) (r3) + lfd REG_MEM(FPR,13) (r3) + lfd REG_MEM(FPR,14) (r3) + lfd REG_MEM(FPR,15) (r3) + lfd REG_MEM(FPR,16) (r3) + lfd REG_MEM(FPR,17) (r3) + lfd REG_MEM(FPR,18) (r3) + lfd REG_MEM(FPR,19) (r3) + lfd REG_MEM(FPR,20) (r3) + lfd REG_MEM(FPR,21) (r3) + lfd REG_MEM(FPR,22) (r3) + lfd REG_MEM(FPR,23) (r3) + lfd REG_MEM(FPR,24) (r3) + lfd REG_MEM(FPR,25) (r3) + lfd REG_MEM(FPR,26) (r3) + lfd REG_MEM(FPR,27) (r3) + lfd REG_MEM(FPR,28) (r3) + lfd REG_MEM(FPR,29) (r3) + lfd REG_MEM(FPR,30) (r3) + lfd REG_MEM(FPR,31) (r3) + + addi r5, r3, VR_OFF + lvx v0, 0, r5 + addi r5, r5, 16 + lvx v1, 0, r5 + addi r5, r5, 16 + lvx v2, 0, r5 + addi r5, r5, 16 + lvx v3, 0, r5 + addi r5, r5, 16 + lvx v4, 0, r5 + addi r5, r5, 16 + lvx v5, 0, r5 + addi r5, r5, 16 + lvx v6, 0, r5 + addi r5, r5, 16 + lvx v7, 0, r5 + addi r5, r5, 16 + lvx v8, 0, r5 + addi r5, r5, 16 + lvx v9, 0, r5 + addi r5, r5, 16 + lvx v10, 0, r5 + addi r5, r5, 16 + lvx v11, 0, r5 + addi r5, r5, 16 + lvx v12, 0, r5 + addi r5, r5, 16 + lvx v13, 0, r5 + addi r5, r5, 16 + lvx v14, 0, r5 + addi r5, r5, 16 + lvx v15, 0, r5 + addi r5, r5, 16 + lvx v16, 0, r5 + addi r5, r5, 16 + lvx v17, 0, r5 + addi r5, r5, 16 + lvx v18, 0, r5 + addi r5, r5, 16 + lvx v19, 0, r5 + addi r5, r5, 16 + lvx v20, 0, r5 + addi r5, r5, 16 + lvx v21, 0, r5 + addi r5, r5, 16 + lvx v22, 0, r5 + addi r5, r5, 16 + lvx v23, 0, r5 + addi r5, r5, 16 + lvx v24, 0, r5 + addi r5, r5, 16 + lvx v25, 0, r5 + addi r5, r5, 16 + lvx v26, 0, r5 + addi r5, r5, 16 + lvx v27, 0, r5 + addi r5, r5, 16 + lvx v28, 0, r5 + addi r5, r5, 16 + lvx v29, 0, r5 + addi r5, r5, 16 + lvx v30, 0, r5 + addi r5, r5, 16 + lvx v31, 0, r5 + + blr diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc_regs.h b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc_regs.h new file mode 100644 index 0000000000..8a9cc2754b --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/ppc_regs.h @@ -0,0 +1,32 @@ +/* Saves/loads most user-level PowerPC registers */ + +#ifndef PPC_REGS_H +#define PPC_REGS_H + +#include + +typedef __attribute__((aligned(16))) struct ppc_regs_t +{ + uint64_t vr [32] [2]; + double fpr [32]; + uint64_t gpr [32]; + uint32_t cr; + uint32_t vrsave; + uint32_t ctr; + uint32_t xer; + uint32_t garbage; + uint32_t fpscr; +} ppc_regs_t; + +#ifdef __cplusplus + extern "C" { +#endif + +void save_ppc_regs( ppc_regs_t* ); +void load_ppc_regs( ppc_regs_t const* ); + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/readme.txt b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/readme.txt new file mode 100644 index 0000000000..7e021a3735 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/readme.txt @@ -0,0 +1,34 @@ +Run run_tests to test things fairly well, including the embedded and +separate versions, 32-bit and 64-bit, and with or without FP and vector +support. It will stop on the first error. Verifies that proper registers +are saved/restored, and that no others are modified, and lists incorrect +ones. Runs a bunch of threads and randomly creates/destroys, verifying +that they all switch properly. Then runs benchmark. I'd have included +one of the other portable versions, but they all crash. + +* Supports PowerPC 32-bit and 64-bit. Detects based on compiler +settings. + +* Uses embedded PowerPC code. To use separate ppc.S, define +LIBCO_PPC_ASM. + +* Saves floating-point registers by default. To avoid this and improve +performance, define LIBCO_PPC_NOFP. + +* Saves Altivec registers only if compiler is generating Altivec code. + +* Assembly code merely saves current state to buffer pointed to by r4, +then restores from r3. This eliminates almost all dependency on the ABI, +stack format, etc. and is easier to get right. C code does all the +setup. + +* C code attempts to avoid depending on whether ABI stores pointers as +32-bit or 64-bit (independently from whether it's a 64-bit PPC). + +* Everything outside of libco/ is just for +developing/testing/benchmarking. + +* Code even works on my old Mac OS Classic machine. + +-- +Shay Green diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/run_tests b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/run_tests new file mode 100644 index 0000000000..e4edaeb162 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/run_tests @@ -0,0 +1,41 @@ +#!/bin/bash + +# Enable exit on error and error on use of undefined variables +set -e -u + +echo "32-bit tests" + +# General +gcc -O3 libco/libco.c test_libco.c -mno-powerpc64 -maltivec ; ./a.out + +# Stress +gcc -O3 libco/libco.c test_threads.c -mno-powerpc64 -DLIBCO_PPC_NOFP ; ./a.out +gcc -O3 libco/libco.c test_threads.c -mno-powerpc64 -maltivec ; ./a.out + +# Benchmark +gcc -O3 libco/libco.c benchmark*.c -mno-powerpc64 -DLIBCO_PPC_NOFP ; ./a.out +gcc -O3 libco/libco.c benchmark*.c -mno-powerpc64 ; ./a.out +gcc -O3 libco/libco.c benchmark*.c -mno-powerpc64 -maltivec ; ./a.out + +# Register preservation +gcc -mregnames --omit-frame-pointer libco/libco.c ppc_regs.S test_regs.c -mno-powerpc64 -DLIBCO_PPC_NOFP ; ./a.out +gcc -mregnames --omit-frame-pointer libco/libco.c ppc_regs.S test_regs.c -mno-powerpc64 -D__ALTIVEC__ ; ./a.out + +echo +echo "64-bit tests" + +# General +gcc -O3 libco/libco.c test_libco.c -mpowerpc64 -D__ALTIVEC__ ; ./a.out + +# Stress +gcc -O3 libco/libco.c test_threads.c -mpowerpc64 -DLIBCO_PPC_NOFP ; ./a.out +gcc -O3 libco/libco.c test_threads.c -mpowerpc64 -maltivec ; ./a.out + +# Benchmark +gcc -O3 libco/libco.c benchmark*.c -mpowerpc64 -DLIBCO_PPC_NOFP ; ./a.out +gcc -O3 libco/libco.c benchmark*.c -mpowerpc64 ; ./a.out +gcc -O3 libco/libco.c benchmark*.c -mpowerpc64 -maltivec ; ./a.out + +# Register preservation +gcc -mregnames --omit-frame-pointer libco/libco.c ppc_regs.S test_regs.c -mpowerpc64 -DLIBCO_PPC_NOFP ; ./a.out +gcc -mregnames --omit-frame-pointer libco/libco.c ppc_regs.S test_regs.c -mpowerpc64 -D__ALTIVEC__ ; ./a.out diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/run_tests.txt b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/run_tests.txt new file mode 100644 index 0000000000..b1e23139b7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/run_tests.txt @@ -0,0 +1,106 @@ +$ cat /proc/cpuinfo +processor : 0 +cpu : PPC970, altivec supported +clock : 2000.000000MHz +revision : 2.2 (pvr 0039 0202) + +processor : 1 +cpu : PPC970, altivec supported +clock : 2000.000000MHz +revision : 2.2 (pvr 0039 0202) + +timebase : 33333333 +platform : PowerMac +model : PowerMac7,2 +machine : PowerMac7,2 +motherboard : PowerMac7,2 MacRISC4 Power Macintosh +detected as : 336 (PowerMac G5) +pmac flags : 00000000 +L2 cache : 512K unified +pmac-generation : NewWorld + +$ ./run_tests +32-bit tests +Basic test +PPC32 FP ALTIVEC +Passed + +Thread test +PPC32 +Passed + +Thread test +PPC32 FP ALTIVEC +Passed + +PPC32 +291.30 M function calls per sec + 18.93 M co_switch()x2 per sec +Function call is 15.4X faster than two co_switch() calls. + +PPC32 FP +291.20 M function calls per sec + 12.74 M co_switch()x2 per sec +Function call is 22.9X faster than two co_switch() calls. + +PPC32 FP ALTIVEC +291.90 M function calls per sec + 9.64 M co_switch()x2 per sec +Function call is 30.3X faster than two co_switch() calls. + +Register test +PPC32 +Checking for modified system registers +Checking for unpreserved non-volatiles +Checking for unnecessarily preserved volatiles +Passed + +Register test +PPC32 FP ALTIVEC +Checking for modified system registers +Checking for unpreserved non-volatiles +Checking for unnecessarily preserved volatiles +Passed + + +64-bit tests +Basic test +PPC64 FP ALTIVEC +Passed + +Thread test +PPC64 +Passed + +Thread test +PPC64 FP ALTIVEC +Passed + +PPC64 +291.70 M function calls per sec + 15.25 M co_switch()x2 per sec +Function call is 19.1X faster than two co_switch() calls. + +PPC64 FP +292.00 M function calls per sec + 12.69 M co_switch()x2 per sec +Function call is 23.0X faster than two co_switch() calls. + +PPC64 FP ALTIVEC +291.60 M function calls per sec + 9.57 M co_switch()x2 per sec +Function call is 30.5X faster than two co_switch() calls. + +Register test +PPC64 +Checking for modified system registers +Checking for unpreserved non-volatiles +Checking for unnecessarily preserved volatiles +Passed + +Register test +PPC64 FP ALTIVEC +Checking for modified system registers +Checking for unpreserved non-volatiles +Checking for unnecessarily preserved volatiles +Passed diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_libco.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_libco.c new file mode 100644 index 0000000000..2cbd510517 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_libco.c @@ -0,0 +1,134 @@ +#include "libco/libco.h" + +#include +#include +#include +#include "testing.h" + +/* Verifies co_active() initial behavior */ +static void test_initial( void ) +{ + int n; + + if ( !co_active() ) + assert( 0 ); + + for ( n = 1000; n--; ) + co_switch( co_active() ); +} + +static void thread_func( void ) +{ } + +/* Creates and deletes threads many times to ensure nothing is leaked */ +static void test_leaks( void ) +{ + enum { thread_count = 10 }; + cothread_t threads [thread_count] = { 0 }; + int i = 0; + int n; + + for ( n = 10000; n--; ) + { + if ( threads [i] ) + co_delete( threads [i] ); + + threads [i] = co_create( 256 * 1024, thread_func ); + assert( threads [i] ); + + i = (i + 1) % thread_count; + } + + for ( i = 0; i < thread_count; i++ ) + if ( threads [i] ) + co_delete( threads [i] ); +} + +static cothread_t threads [10]; +static int next; + +static void next_thread( void ) +{ + co_switch( threads [next++] ); +} + +static void preserved_func( void ) +{ + int seed = next; + + #define INIT(type,n) \ + register type type##n = rand(); + + #define CHECK(type,n) \ + assert( type##n == rand() ); + + #define REGS_(type,op,base) \ + op(type,base##0)\ + op(type,base##1)\ + op(type,base##2)\ + op(type,base##3)\ + op(type,base##4)\ + op(type,base##5)\ + op(type,base##6)\ + op(type,base##7)\ + op(type,base##8)\ + op(type,base##9) + + /* Invokes op(type,n), with n going from 00 through 49 */ + #define REGS(type,op) \ + REGS_(type,op,0)\ + REGS_(type,op,1)\ + REGS_(type,op,2)\ + REGS_(type,op,3)\ + REGS_(type,op,4) + + srand(seed); + { + /* Fill int and FP registers with random values */ + REGS(size_t,INIT) + + #if LIBCO_PPC_FP + REGS(double,INIT) + #endif + + /* Run second copy of this func that puts different random values + in registers, and then switches back to us */ + next_thread(); + + /* Verify that registers match random values */ + srand(seed); + + REGS(size_t,CHECK) + + #if LIBCO_PPC_FP + REGS(double,CHECK) + #endif + } + + next_thread(); +} + +/* Verifies that registers are saved and restored by co_switch() */ +static void test_preserved( void ) +{ + threads [0] = co_create( 64 * 1024, preserved_func ); + threads [1] = co_create( 64 * 1024, preserved_func ); + threads [2] = threads [0]; + threads [3] = co_active(); + + next = 0; + next_thread(); +} + +int main( void ) +{ + printf( "Basic test\n" ); + print_libco_opts(); + + test_initial(); + test_leaks(); + test_preserved(); + + printf( "Passed\n\n" ); + return 0; +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_regs.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_regs.c new file mode 100644 index 0000000000..754252eced --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_regs.c @@ -0,0 +1,274 @@ +/* Verifies that correct registers are saved and restored by co_switch(), +that it doesn't unnecessarily preserve volatile registers, and that it +never touches system registers. MUST be compiled with --omit-frame-pointer */ + +#include "libco/libco.h" +#include "ppc_regs.h" + +#include +#include +#include +#include +#include "testing.h" + +enum { + spr_cr = 1 << 0, + spr_xer = 1 << 8, + spr_ctr = 1 << 9, + spr_fpscr = 1 << 10, + spr_vrsave = 1 << 11, +}; + +typedef struct { + unsigned spr; + unsigned gpr; + unsigned fpr; + unsigned vr; +} regmask_t; + +enum { fpscr_mask = ~0x60000800 }; + +/* Single register and range of registers (inclusive) */ +#define REG( b ) (1 << (b)) +#define RANGE( start, end ) ((~0 << (start)) & ~(~0 << (end) << 1)) + +/* Error if modified. FPRs and VRs included here since they shouldn't be +modified or needed during switching. */ +static const regmask_t system_regs = { + spr_fpscr | (spr_vrsave*!LIBCO_PPC_ALTIVEC), + REG(2) | (REG(13)*LIBCO_PPC32), + RANGE(0,LIBCO_PPC_FP ? 12 : 31), + RANGE(0,LIBCO_PPC_ALTIVEC ? 19 : 31) +}; + +/* Error if not saved and restored */ +static const regmask_t switched_regs = { + 0x7E | (spr_vrsave*LIBCO_PPC_ALTIVEC), + REG(1) | RANGE(14-LIBCO_PPC32,31), + RANGE(14,31)*LIBCO_PPC_FP, + RANGE(20,31)*LIBCO_PPC_ALTIVEC +}; + +/* Error if saved and restored; fine if modified */ +static const regmask_t volatile_regs = { + spr_xer | spr_ctr, + RANGE(3,13-LIBCO_PPC32) | REG(0), + 0, + 0 +}; + +#undef RANGE +#undef REG + +/* Everything is broken into a separate function to avoid the compiler loading +addresses into registers between operations, since we clear all registers. */ + +static int zero_enabled; + +static ppc_regs_t regs_saved; +static ppc_regs_t regs_in; +static ppc_regs_t regs_zero; +static ppc_regs_t regs_out; + +static void save_regs_saved() +{ + save_ppc_regs( ®s_saved ); + + /* We must not trash these when restoring registers */ + regs_in.gpr [1] = regs_saved.gpr [1]; + regs_in.gpr [2] = regs_saved.gpr [2]; + + regs_out = regs_in; +} + +static void load_regs_saved() { load_ppc_regs( ®s_saved ); } +static void load_regs_in() { load_ppc_regs( ®s_in ); } +static void load_regs_zero() { load_ppc_regs( ®s_zero ); } +static void save_regs_out() { save_ppc_regs( ®s_out ); } + +static cothread_t main_thread; +static cothread_t test_thread; +static cothread_t zero_thread; + +static void switch_main_thread() { co_switch( main_thread ); } +static void switch_test_thread() { co_switch( test_thread ); } +static void switch_zero_thread() { if ( zero_enabled ) co_switch( zero_thread ); } + +static void test_thread_func() +{ + for ( ;; ) + { + /* Save current registers, load random registers, switch to another + thread which then loads zero into registers and switches back to us, + save our registers to see whether they match, then restore originals. */ + save_regs_saved(); + load_regs_in(); + switch_zero_thread(); + save_regs_out(); + load_regs_saved(); + switch_main_thread(); + } +} + +static void zero_thread_func() +{ + for ( ;; ) + { + load_regs_zero(); + switch_test_thread(); + } +} + +/* Determines which registers are modified by co_switch(). If enable_zero_fill +is true, clears registers between two co_switch() calls. ORs result to +*out. */ +static void find_modified( regmask_t* out, int enable_zero_fill ) +{ + int i; + + zero_enabled = enable_zero_fill; + + for ( i = 0; i < sizeof regs_in; i++ ) + ((unsigned char*) ®s_in) [i] = rand() >> 4; + + switch_test_thread(); + + regs_out.fpscr = (regs_out.fpscr & fpscr_mask) | (regs_in.fpscr & ~fpscr_mask); + + #define SPR( name ) \ + if ( regs_out.name != regs_in.name )\ + out->spr |= spr_##name; + + SPR( xer ); + SPR( ctr ); + SPR( fpscr ); + SPR( vrsave ); + + #undef SPR + + for ( i = 0; i < 8; i++ ) + if ( (regs_out.cr ^ regs_in.cr) >> (i*4) & 0x0F ) + out->spr |= spr_cr << i; + + #define REG( name ) \ + {\ + for ( i = 0; i < 32; i++ )\ + if ( memcmp( ®s_out.name [i], ®s_in.name [i], sizeof regs_in.name [i] ) )\ + out->name |= 1 << i;\ + } + + REG( gpr ); + REG( fpr ); + REG( vr ); + + #undef REG +} + +static void print_diffs( unsigned diff, const char name [] ) +{ + if ( diff ) + { + int i; + + printf( "%s: ", name ); + + for ( i = 0; i < 32; i++ ) + if ( diff >> i & 1 ) + printf( "%d ", i ); + + printf( "\n" ); + } +} + +static unsigned check_regs( regmask_t regs, regmask_t mask, regmask_t cmp ) +{ + unsigned any_diffs = 0; + unsigned diff; + + diff = (regs.spr & mask.spr) ^ cmp.spr; + any_diffs |= diff; + if ( diff ) + { + int i; + for ( i = 0; i < 8; i++ ) + if ( diff >> i & 1 ) + printf( "CR%d ", 7 - i ); + + #define SPR( name ) \ + if ( diff & spr_##name )\ + printf( #name " " ); + + SPR( xer ); + SPR( ctr ); + SPR( fpscr ); + SPR( vrsave ); + + #undef SPR + + printf( "\n" ); + } + + diff = (regs.gpr & mask.gpr) ^ cmp.gpr; + any_diffs |= diff; + print_diffs( diff, "GPR" ); + + diff = (regs.fpr & mask.fpr) ^ cmp.fpr; + any_diffs |= diff; + print_diffs( diff, "FPR" ); + + diff = (regs.vr & mask.vr) ^ cmp.vr; + any_diffs |= diff; + print_diffs( diff, "VR " ); + + return any_diffs; +} + +static void test( void ) +{ + /* Run a bunch of trials and accumulate which registers are modified by co_switch(), + and which aren't swapped by it. */ + regmask_t modified = { 0 }; + regmask_t unswitched = { 0 }; + int n; + + for ( n = 2000; n--; ) + { + find_modified( &modified, 0 ); + find_modified( &unswitched, 1 ); + } + + { + regmask_t zero = { 0 }; + unsigned error = 0; + + printf( "Checking for modified system registers\n" ); + error |= check_regs( modified, system_regs, zero ); + + printf( "Checking for unpreserved non-volatiles\n" ); + error |= check_regs( unswitched, switched_regs, zero ); + + printf( "Checking for unnecessarily preserved volatiles\n" ); + error |= check_regs( unswitched, volatile_regs, volatile_regs ); + + if ( error ) + { + printf( "Failed\n" ); + exit( EXIT_FAILURE ); + } + } +} + +int main( void ) +{ + printf( "Register test\n" ); + print_libco_opts(); + + main_thread = co_active(); + test_thread = co_create( 32 * 1024, test_thread_func ); + zero_thread = co_create( 32 * 1024, zero_thread_func ); + + test(); + + printf( "Passed\n\n" ); + return 0; +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_threads.c b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_threads.c new file mode 100644 index 0000000000..ffa4c2393e --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/test_threads.c @@ -0,0 +1,188 @@ +/* Stress tests cothreads + +Randomly creates, deletes, switches threads, and randomly +shuffles random data between locals and shared globals, +and randomly calls deeper and returns shallower in call +chain of each thread. After running for a while, prints +XOR of all the global data, and verifies that this matches +correct value. + +STRESS_EXCEPTIONS uses C++ exceptions rather than longjmp. +*/ + +#include "libco/libco.h" + +#include +#include +#include +#include +#include +#include "testing.h" + +#if BLARGG_DEV + int const iter = 300; + unsigned const final_data = 0x4E914B5A; +#else + int const iter = 100000; + unsigned const final_data = 0x1FED4BE2; +#endif + +int const stack_size = 256 * 1024; + +enum { max_threads = 16 }; +static cothread_t threads [max_threads]; + +static unsigned shared [16]; + +static unsigned rnd() +{ + static unsigned n = 1; + return n = (n >> 1) ^ (0xEDB88320 & -(n & 1)); +} + +static void run( jmp_buf, int depth ); + +static void entry( void ) +{ + run( NULL, 0 ); +} + +static int max_depth = 0; + +static void run( jmp_buf jb, int depth ) +{ + unsigned local [16]; + memcpy( local, shared, sizeof local ); + + if ( depth > max_depth ) + max_depth = depth; + + while ( 1 ) + { + co_switch( threads [0] ); + + switch ( rnd() & 7 ) + { + case 0: + if ( depth > 0 ) + { + if ( rnd() & 1 ) + #if STRESS_EXCEPTIONS + throw 0; + #else + longjmp( jb, 1 ); + #endif + goto ret; + } + break; + + case 1: + if ( depth < 50 ) + { + #if STRESS_EXCEPTIONS + { + try { + run( jb, depth + 1 ); + } + catch ( ... ) + { } + } + #else + { + jmp_buf jb2; + if ( !setjmp( jb2 ) ) + run( jb2, depth + 1 ); + } + #endif + } + break; + + case 2: { + int i; + for ( i = 0; i < max_threads; i++ ) + { + if ( !threads [i] ) + { + threads [i] = co_create( stack_size, entry ); + assert( threads [i] ); + break; + } + } + break; + } + + case 3: + { + int i = rnd() & (max_threads - 1); + if ( i > 0 && threads [i] && threads [i] != co_active() ) + { + co_delete( threads [i] ); + threads [i] = 0; + } + break; + } + + case 4: + case 5: + case 6: + case 7: { + int n; + for ( n = 10; n--; ) + { + unsigned r; + r = rnd(); local [r & 15] += rnd(); + r = rnd(); shared [r & 15] += rnd(); + r = rnd(); local [r & 15] ^= shared [rnd() & 15]; + r = rnd(); shared [r & 15] ^= local [rnd() & 15]; + } + break; + } + + } + + { + int i = rnd() & (max_threads - 1); + if ( threads [i] && threads [i] != co_active() ) + co_switch( threads [i] ); + } + } +ret:; +} + +int main( void ) +{ + int i, n; + + printf( "Thread test\n" ); + print_libco_opts(); + + threads [0] = co_active(); + threads [1] = co_create( stack_size, entry ); + assert( threads [1] ); + for ( n = 0; n < iter; n++ ) + { + /* + if ( !(n & (n - 1)) ) + printf( "%d\n", n );*/ + + for ( i = 1; i < max_threads; i++ ) + if ( threads [i] ) + co_switch( threads [i] ); + } + + { + unsigned all = 0; + for ( i = 0; i < 16; i++ ) + all ^= shared [i]; + + if ( all != final_data ) + { + printf( "0x%08X\n", all ); + printf( "Incorrect CRC\n" ); + return EXIT_FAILURE; + } + } + + printf( "Passed\n\n" ); + return 0; +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/testing.h b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/testing.h new file mode 100644 index 0000000000..a7d09fdbf7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/blargg_libco_ppc64-5/testing.h @@ -0,0 +1,36 @@ +#if _ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__ + #define LIBCO_PPC32 0 +#else + #define LIBCO_PPC32 1 +#endif + +#ifdef LIBCO_PPC_NOFP + #define LIBCO_PPC_FP 0 +#else + #define LIBCO_PPC_FP 1 +#endif + +#ifdef __ALTIVEC__ + #define LIBCO_PPC_ALTIVEC 1 +#else + #define LIBCO_PPC_ALTIVEC 0 +#endif + +static void print_libco_opts( void ) +{ + #if LIBCO_PPC32 + printf( "PPC32 " ); + #else + printf( "PPC64 " ); + #endif + + #if LIBCO_PPC_FP + printf( "FP " ); + #endif + + #if LIBCO_PPC_ALTIVEC + printf( "ALTIVEC " ); + #endif + + printf( "\n" ); +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/fiber.c b/Mednafen/mednafen/snes/src/lib/libco/fiber.c new file mode 100755 index 0000000000..02ef5bc788 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/fiber.c @@ -0,0 +1,51 @@ +/* + libco.win (2008-01-28) + authors: Nach, byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#define WINVER 0x0400 +#define _WIN32_WINNT 0x0400 +#define WIN32_LEAN_AND_MEAN +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local cothread_t co_active_ = 0; + +static void __stdcall co_thunk(void *coentry) { + ((void (*)(void))coentry)(); +} + +cothread_t co_active() { + if(!co_active_) { + ConvertThreadToFiber(0); + co_active_ = GetCurrentFiber(); + } + return co_active_; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) { + if(!co_active_) { + ConvertThreadToFiber(0); + co_active_ = GetCurrentFiber(); + } + return (cothread_t)CreateFiber(heapsize, co_thunk, (void*)coentry); +} + +void co_delete(cothread_t cothread) { + DeleteFiber(cothread); +} + +void co_switch(cothread_t cothread) { + co_active_ = cothread; + SwitchToFiber(cothread); +} + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/libco.c b/Mednafen/mednafen/snes/src/lib/libco/libco.c new file mode 100755 index 0000000000..5567626330 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/libco.c @@ -0,0 +1,23 @@ +/* + libco + auto-selection module + license: public domain +*/ + +#if defined(__GNUC__) && defined(__i386__) + #include "x86.c" +#elif defined(__GNUC__) && defined(__amd64__) + #include "amd64.c" +#elif defined(__GNUC__) && defined(_ARCH_PPC) + #include "ppc.c" +#elif defined(__GNUC__) + #include "sjlj.c" +#elif defined(_MSC_VER) && defined(_M_IX86) + #include "x86.c" +#elif defined(_MSC_VER) && defined(_M_AMD64) + #include "amd64.c" +#elif defined(_MSC_VER) + #include "fiber.c" +#else + #error "libco: unsupported processor, compiler or operating system" +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/libco.h b/Mednafen/mednafen/snes/src/lib/libco/libco.h new file mode 100755 index 0000000000..b1b49a29d6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/libco.h @@ -0,0 +1,34 @@ +/* + libco + version: 0.15 (2009-10-12) + license: public domain +*/ + +#ifndef LIBCO_H +#define LIBCO_H + +#ifdef LIBCO_C + #ifdef LIBCO_MP + #define thread_local __thread + #else + #define thread_local + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* cothread_t; + +cothread_t co_active(); +cothread_t co_create(unsigned int, void (*)(void)); +void co_delete(cothread_t); +void co_switch(cothread_t); + +#ifdef __cplusplus +} +#endif + +/* ifndef LIBCO_H */ +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/ppc-elf.c b/Mednafen/mednafen/snes/src/lib/libco/ppc-elf.c new file mode 100755 index 0000000000..09fbadb2e0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/ppc-elf.c @@ -0,0 +1,325 @@ +/* + * libco.ppc-elf + * author: Kernigh + * license: public domain + * + * PowerPC 32-bit ELF implementation of libco (for compile with GCC), + * ported from PowerPC Mac OS X implementation (ppc.s) by Vas Crabb. + * This ELF version works for OpenBSD, and might also work for FreeBSD, + * NetBSD and Linux. + * + * Note 1: This implementation does not handle the AltiVec/VMX + * registers, because the ELF ABI does not mention them, + * and my OpenBSD system is not using them. + * + * Note 2: If you want position-independent code, then you must + * define __PIC__. gcc -fpic or -fPIC defines __PIC__, but + * gcc -fpie or -fPIE might not. If you want to use -fpie + * or -fPIE, then you might need a manual definition: + * gcc -fpie -D__PIC__=1 + * gcc -fPIE -D__PIC__=2 + * + * The ELF ABI is "System V Application Binary Interface, PowerPC + * Processor Supplement", which you can get from + * + * (PDF file, hosted by Linux Foundation). + * + * ELF and Mac OS X use similar conventions to allocate the registers, + * and to pass arguments and return values through registers. The main + * differences are that ELF has a slightly different stack format, that + * symbols are different (and without an extra underscore at the start), + * and that the assembly syntax is different. + * + * A function may destroy the values of volatile registers, but must + * preserve the values of nonvolatile registers. So the co_switch() + * function only saves the nonvolatile registers. + * + * [nonvolatile registers in ELF] + * %r1, %r14..%r31 + * %f14..%f31 + * %cr2..%cr4 in cr + * + * [volatile registers in ELF] + * %r0, %r3..%r10 + * %f0..%f13 + * %cr0, %cr1, %cr5..%cr7 in cr + * ctr, lr, xer + * + * lr (link register) is volatile, but it contains the return address, + * so co_switch must save lr. + * + * %r13 is the small data pointer. This is constant across threads, so + * co_switch() does not touch %r13. + * + * %r2 is a reserved register, so co_switch() does not touch %r2. Some + * systems might borrow an idea from the PowerPC Embedded ABI, and might + * use %r2 as a small read-only data pointer, which is constant across + * threads. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void * cothread_t; + +/* + * co_active_context is either in a global offset table (if we are + * compiling -fPIC or -fPIE) or has an absolute position. + */ +static void *co_main_stack_pointer; +static cothread_t co_active_context = &co_main_stack_pointer; + +extern cothread_t co_active() { + return co_active_context; +} + +/* + * Embedded assembly. + * + * We are not using the percent-sign substitution feature, + * so we must write "%r1", not "%%r1". + * + * We always write 'bl malloc@plt', not 'bl malloc'. The '@plt' + * is necessary in position-indepent code and seems to have no + * significant effect in fixed-position code. + * + * We never use the 'lmw' or 'stmw' instructions. The ELF ABI + * mentions that these instructions "are usually slower than + * a sequence of other instructions that have the same effect." + * We instead use sequences of 'lwz' or 'stz' instructions. + */ +__asm__("\n" +"### embedded assembly \n" +".section \".text\" \n" +" .balign 4 \n" +" \n" +/* + * void co_switch(co_thread to %r3) + * + * Allocate our stack frame of 240 bytes: + * Old New Value + * 4(%r1) 244(%r1) return address, used by us + * 0(%r1) 240(%r1) frame pointer + * 232(%r1) %f31 + * 224(%r1) %f30 + * ... + * 96(%r1) %f14 + * 92(%r1) %r31 + * 88(%r1) %r30 + * ... + * 24(%r1) %r14 + * 20(%r1) condition register + * 8(%r1) padding of 12 bytes + * 4(%r1) return address, never used + * 0(%r1) frame pointer + * + * Save our registers in our stack frame. + * Save our stack pointer in 0(%r4). + * Switch to the stack of the other thread. + * Restore registers and return. + */ +" .globl co_switch \n" +" .type co_switch, @function \n" +"co_switch: \n" +" mflr %r0 # %r0 = return address \n" +" mfcr %r9 # %r9 = condition register \n" +" stwu %r1, -240(%r1) # allocate stack frame \n" +" \n" +" stw %r0, 244(%r1) # save return address \n" +" stfd %f31, 232(%r1) # save floating-point regs \n" +" stfd %f30, 224(%r1) \n" +" stfd %f29, 216(%r1) \n" +" stfd %f28, 208(%r1) \n" +" stfd %f27, 200(%r1) \n" +" stfd %f26, 192(%r1) \n" +" stfd %f25, 184(%r1) \n" +" stfd %f24, 176(%r1) \n" +" stfd %f23, 168(%r1) \n" +" stfd %f22, 160(%r1) \n" +" stfd %f21, 152(%r1) \n" +" stfd %f20, 144(%r1) \n" +" stfd %f19, 136(%r1) \n" +" stfd %f18, 128(%r1) \n" +" stfd %f17, 120(%r1) \n" +" stfd %f16, 112(%r1) \n" +" stfd %f16, 104(%r1) \n" +" stfd %f14, 96(%r1) \n" +" stw %r31, 92(%r1) # save general-purpose regs \n" +" stw %r30, 88(%r1) \n" +" stw %r29, 84(%r1) \n" +" stw %r28, 80(%r1) \n" +" stw %r27, 76(%r1) \n" +" stw %r26, 72(%r1) \n" +" stw %r25, 68(%r1) \n" +" stw %r24, 64(%r1) \n" +" stw %r23, 60(%r1) \n" +" stw %r22, 56(%r1) \n" +" stw %r21, 52(%r1) \n" +" stw %r20, 48(%r1) \n" +" stw %r19, 44(%r1) \n" +" stw %r18, 40(%r1) \n" +" stw %r17, 36(%r1) \n" +" stw %r16, 32(%r1) \n" +" stw %r15, 28(%r1) \n" +" stw %r14, 24(%r1) \n" +" stw %r9, 20(%r1) # save condition reg \n" +" \n" +" # save current context, set new context \n" +" # %r4 = co_active_context \n" +" # co_active_context = %r3 \n" +#if __PIC__ == 2 +" # position-independent code, large model (-fPIC) \n" +" bl _GLOBAL_OFFSET_TABLE_@local-4 \n" +" mflr %r8 # %r8 = address of got \n" +" addis %r7, %r8, co_active_context@got@ha \n" +" lwz %r6, co_active_context@got@l(%r7) \n" +" lwz %r4, 0(%r6) \n" +" stw %r3, 0(%r6) \n" +#elif __PIC__ == 1 +" # position-independent code, small model (-fpic) \n" +" bl _GLOBAL_OFFSET_TABLE_@local-4 \n" +" mflr %r8 # %r8 = address of got \n" +" lwz %r7, co_active_context@got(%r8) \n" +" lwz %r4, 0(%r7) \n" +" stw %r3, 0(%r7) \n" +#else +" # fixed-position code \n" +" lis %r8, co_active_context@ha \n" +" lwz %r4, co_active_context@l(%r8) \n" +" stw %r3, co_active_context@l(%r8) \n" +#endif +" \n" +" # save current stack pointer \n" +" stw %r1, 0(%r4) \n" +" # get new stack pointer \n" +" lwz %r1, 0(%r3) \n" +" \n" +" lwz %r0, 244(%r1) # get return address \n" +" lfd %f31, 232(%r1) # restore floating-point regs \n" +" lfd %f30, 224(%r1) \n" +" lfd %f29, 216(%r1) \n" +" lfd %f28, 208(%r1) \n" +" lfd %f27, 200(%r1) \n" +" lfd %f26, 192(%r1) \n" +" lfd %f25, 184(%r1) \n" +" lfd %f24, 176(%r1) \n" +" lfd %f23, 168(%r1) \n" +" lfd %f22, 160(%r1) \n" +" lfd %f21, 152(%r1) \n" +" lfd %f20, 144(%r1) \n" +" lfd %f19, 136(%r1) \n" +" lfd %f18, 128(%r1) \n" +" lfd %f17, 120(%r1) \n" +" lfd %f16, 112(%r1) \n" +" lfd %f16, 104(%r1) \n" +" lfd %f14, 96(%r1) \n" +" lwz %r31, 92(%r1) # restore general-purpose regs \n" +" lwz %r30, 88(%r1) \n" +" lwz %r29, 84(%r1) \n" +" lwz %r28, 80(%r1) \n" +" lwz %r27, 76(%r1) \n" +" lwz %r26, 72(%r1) \n" +" lwz %r25, 68(%r1) \n" +" lwz %r24, 64(%r1) \n" +" lwz %r23, 60(%r1) \n" +" lwz %r22, 56(%r1) \n" +" lwz %r21, 52(%r1) \n" +" lwz %r20, 48(%r1) \n" +" lwz %r19, 44(%r1) \n" +" lwz %r18, 40(%r1) \n" +" lwz %r17, 36(%r1) \n" +" lwz %r16, 32(%r1) \n" +" lwz %r15, 28(%r1) \n" +" lwz %r14, 24(%r1) \n" +" lwz %r9, 20(%r1) # get condition reg \n" +" \n" +" addi %r1, %r1, 240 # free stack frame \n" +" mtlr %r0 # restore return address \n" +" mtcr %r9 # restore condition register \n" +" blr # return \n" +" .size co_switch, . - co_switch \n" +" \n" +/* + * cothread_t %r3 co_create(unsigned int stack_size %r3, + * void (*coentry %r4)()) + * + * Allocate a new stack, such that when you co_switch to that + * stack, then co_switch returns to coentry. + */ +" .globl co_create \n" +" .type co_create, @function \n" +"co_create: \n" +" mflr %r0 # %r0 = return address \n" +" stwu %r1, -16(%r1) # allocate my stack frame \n" +" stw %r0, 20(%r1) # save return address \n" +" stw %r31, 12(%r1) # save %r31 \n" +" stw %r30, 8(%r1) # save %r30 \n" +" \n" +" mr %r30, %r3 # %r30 = stack_size \n" +" mr %r31, %r4 # %r31 = coentry \n" +" \n" +" # Call malloc(stack_size %r3) to allocate stack; \n" +" # malloc() probably uses good alignment. \n" +" # \n" +" bl malloc@plt # returns %r3 = low end \n" +" cmpwi %r3, 0 # if returned NULL, \n" +" beq- 1f # then abort \n" +" \n" +" # we return %r3 = low end of stack \n" +" add %r4, %r3, %r30 # %r4 = high end of stack \n" +" \n" +" # uncomment if malloc() uses wrong alignment \n" +" #rlwinm %r4,%r4,0,0,27 # force 16-byte alignment \n" +" \n" + /* + * Allocate two stack frames: + * 16 bytes for stack frame with return address + * 240 bytes for co_switch stack frame + * + * Old New Value + * -8(%r4) 248(%r5) padding of 8 bytes + * -12(%r4) 244(%r5) return address = coentry + * -16(%r4) 240(%r5) frame pointer = NULL + * 232(%r5) %f31 = 0 + * ... + * 20(%r5) condition register = 0 + * 0(%r5) frame pointer + */ +" li %r9, (240-20)/4+1 \n" +" addi %r5, %r4, -16 # allocate first stack frame \n" +" li %r0, 0 \n" +" stwu %r5, -240(%r5) # allocate second stack frame \n" +" li %r8, 20 \n" +" mtctr %r9 # loop %r9 times \n" +"2: # loop to store zero to 20(%r5) through 240(%r5) \n" +" stwx %r0, %r5, %r8 \n" +" addi %r8, %r8, 4 # index += 4 \n" +" bdnz+ 2b # ctr -= 1, branch if nonzero \n" +" \n" +" stw %r31, 244(%r5) # return address = coentry \n" +" stw %r5, 0(%r3) # save stack pointer \n" +" \n" +" lwz %r0, 20(%r1) # get return address \n" +" lwz %r31, 12(%r1) # restore %r31 \n" +" lwz %r30, 8(%r1) # restore %r30 \n" +" mtlr %r0 # restore return address \n" +" addi %r1, %r1, 16 # free stack frame \n" +" blr # return \n" +" \n" +"1: b abort@plt # branch 1f to abort \n" +" .size co_create, . - co_create \n" +" \n" +/* + * void co_delete(cothread_t) => void free(void *) + */ +" .globl co_delete \n" +" .type co_delete, @function \n" +"co_delete: \n" +" b free@plt \n" +" \n" +); + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/ppc.c b/Mednafen/mednafen/snes/src/lib/libco/ppc.c new file mode 100644 index 0000000000..a6028fdba2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/ppc.c @@ -0,0 +1,407 @@ +/* + libco.ppc (2010-10-17) + author: blargg + license: public domain +*/ + +/* PowerPC 32/64 using embedded or external asm, with optional +floating-point and AltiVec save/restore */ + +#define LIBCO_C +#include "libco.h" +#include +#include +#include + +#define LIBCO_MPROTECT (__unix__ && !LIBCO_PPC_ASM) + +#if LIBCO_MPROTECT + #include + #include +#endif + +/* State format (offsets in 32-bit words) + ++0 Pointer to swap code + Rest of function descriptor for entry function ++8 PC ++10 SP + Special regs + GPRs + FPRs + VRs + stack +*/ + +enum { state_size = 1024 }; +enum { above_stack = 2048 }; +enum { stack_align = 256 }; + +static thread_local cothread_t co_active_handle = 0; + +/**** Determine environment ****/ + +#define LIBCO_PPC64 (_ARCH_PPC64 || __PPC64__ || __ppc64__ || __powerpc64__) + +/* Whether function calls are indirect through a descriptor, +or are directly to function */ +#ifndef LIBCO_PPCDESC + #if !_CALL_SYSV && (_CALL_AIX || _CALL_AIXDESC || LIBCO_PPC64) + #define LIBCO_PPCDESC 1 + #endif +#endif + +#ifdef LIBCO_PPC_ASM + + #ifdef __cplusplus + extern "C" + #endif + + /* Swap code is in ppc.S */ + void co_swap_asm( cothread_t, cothread_t ); + #define CO_SWAP_ASM( x, y ) co_swap_asm( x, y ) + +#else + +/* Swap code is here in array. Please leave dieassembly comments, +as they make it easy to see what it does, and reorder instructions +if one wants to see whether that improves performance. */ +static const uint32_t libco_ppc_code [] = { +#if LIBCO_PPC64 + 0x7d000026, /* mfcr r8 */ + 0xf8240028, /* std r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0xf9c40048, /* std r14,72(r4) */ + 0xf9e40050, /* std r15,80(r4) */ + 0xfa040058, /* std r16,88(r4) */ + 0xfa240060, /* std r17,96(r4) */ + 0xfa440068, /* std r18,104(r4) */ + 0xfa640070, /* std r19,112(r4) */ + 0xfa840078, /* std r20,120(r4) */ + 0xfaa40080, /* std r21,128(r4) */ + 0xfac40088, /* std r22,136(r4) */ + 0xfae40090, /* std r23,144(r4) */ + 0xfb040098, /* std r24,152(r4) */ + 0xfb2400a0, /* std r25,160(r4) */ + 0xfb4400a8, /* std r26,168(r4) */ + 0xfb6400b0, /* std r27,176(r4) */ + 0xfb8400b8, /* std r28,184(r4) */ + 0xfba400c0, /* std r29,192(r4) */ + 0xfbc400c8, /* std r30,200(r4) */ + 0xfbe400d0, /* std r31,208(r4) */ + 0xf9240020, /* std r9,32(r4) */ + 0xe8e30020, /* ld r7,32(r3) */ + 0xe8230028, /* ld r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030,/*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0xe9c30048, /* ld r14,72(r3) */ + 0xe9e30050, /* ld r15,80(r3) */ + 0xea030058, /* ld r16,88(r3) */ + 0xea230060, /* ld r17,96(r3) */ + 0xea430068, /* ld r18,104(r3) */ + 0xea630070, /* ld r19,112(r3) */ + 0xea830078, /* ld r20,120(r3) */ + 0xeaa30080, /* ld r21,128(r3) */ + 0xeac30088, /* ld r22,136(r3) */ + 0xeae30090, /* ld r23,144(r3) */ + 0xeb030098, /* ld r24,152(r3) */ + 0xeb2300a0, /* ld r25,160(r3) */ + 0xeb4300a8, /* ld r26,168(r3) */ + 0xeb6300b0, /* ld r27,176(r3) */ + 0xeb8300b8, /* ld r28,184(r3) */ + 0xeba300c0, /* ld r29,192(r3) */ + 0xebc300c8, /* ld r30,200(r3) */ + 0xebe300d0, /* ld r31,208(r3) */ + 0x7ccff120, /* mtcr r6 */ +#else + 0x7d000026, /* mfcr r8 */ + 0x90240028, /* stw r1,40(r4) */ + 0x7d2802a6, /* mflr r9 */ + 0x91a4003c, /* stw r13,60(r4) */ + 0x91c40040, /* stw r14,64(r4) */ + 0x91e40044, /* stw r15,68(r4) */ + 0x92040048, /* stw r16,72(r4) */ + 0x9224004c, /* stw r17,76(r4) */ + 0x92440050, /* stw r18,80(r4) */ + 0x92640054, /* stw r19,84(r4) */ + 0x92840058, /* stw r20,88(r4) */ + 0x92a4005c, /* stw r21,92(r4) */ + 0x92c40060, /* stw r22,96(r4) */ + 0x92e40064, /* stw r23,100(r4) */ + 0x93040068, /* stw r24,104(r4) */ + 0x9324006c, /* stw r25,108(r4) */ + 0x93440070, /* stw r26,112(r4) */ + 0x93640074, /* stw r27,116(r4) */ + 0x93840078, /* stw r28,120(r4) */ + 0x93a4007c, /* stw r29,124(r4) */ + 0x93c40080, /* stw r30,128(r4) */ + 0x93e40084, /* stw r31,132(r4) */ + 0x91240020, /* stw r9,32(r4) */ + 0x80e30020, /* lwz r7,32(r3) */ + 0x80230028, /* lwz r1,40(r3) */ + 0x48000009, /* bl 1 */ + 0x7fe00008, /* trap */ + 0x91040030,/*1:stw r8,48(r4) */ + 0x80c30030, /* lwz r6,48(r3) */ + 0x7ce903a6, /* mtctr r7 */ + 0x81a3003c, /* lwz r13,60(r3) */ + 0x81c30040, /* lwz r14,64(r3) */ + 0x81e30044, /* lwz r15,68(r3) */ + 0x82030048, /* lwz r16,72(r3) */ + 0x8223004c, /* lwz r17,76(r3) */ + 0x82430050, /* lwz r18,80(r3) */ + 0x82630054, /* lwz r19,84(r3) */ + 0x82830058, /* lwz r20,88(r3) */ + 0x82a3005c, /* lwz r21,92(r3) */ + 0x82c30060, /* lwz r22,96(r3) */ + 0x82e30064, /* lwz r23,100(r3) */ + 0x83030068, /* lwz r24,104(r3) */ + 0x8323006c, /* lwz r25,108(r3) */ + 0x83430070, /* lwz r26,112(r3) */ + 0x83630074, /* lwz r27,116(r3) */ + 0x83830078, /* lwz r28,120(r3) */ + 0x83a3007c, /* lwz r29,124(r3) */ + 0x83c30080, /* lwz r30,128(r3) */ + 0x83e30084, /* lwz r31,132(r3) */ + 0x7ccff120, /* mtcr r6 */ +#endif + +#ifndef LIBCO_PPC_NOFP + 0xd9c400e0, /* stfd f14,224(r4) */ + 0xd9e400e8, /* stfd f15,232(r4) */ + 0xda0400f0, /* stfd f16,240(r4) */ + 0xda2400f8, /* stfd f17,248(r4) */ + 0xda440100, /* stfd f18,256(r4) */ + 0xda640108, /* stfd f19,264(r4) */ + 0xda840110, /* stfd f20,272(r4) */ + 0xdaa40118, /* stfd f21,280(r4) */ + 0xdac40120, /* stfd f22,288(r4) */ + 0xdae40128, /* stfd f23,296(r4) */ + 0xdb040130, /* stfd f24,304(r4) */ + 0xdb240138, /* stfd f25,312(r4) */ + 0xdb440140, /* stfd f26,320(r4) */ + 0xdb640148, /* stfd f27,328(r4) */ + 0xdb840150, /* stfd f28,336(r4) */ + 0xdba40158, /* stfd f29,344(r4) */ + 0xdbc40160, /* stfd f30,352(r4) */ + 0xdbe40168, /* stfd f31,360(r4) */ + 0xc9c300e0, /* lfd f14,224(r3) */ + 0xc9e300e8, /* lfd f15,232(r3) */ + 0xca0300f0, /* lfd f16,240(r3) */ + 0xca2300f8, /* lfd f17,248(r3) */ + 0xca430100, /* lfd f18,256(r3) */ + 0xca630108, /* lfd f19,264(r3) */ + 0xca830110, /* lfd f20,272(r3) */ + 0xcaa30118, /* lfd f21,280(r3) */ + 0xcac30120, /* lfd f22,288(r3) */ + 0xcae30128, /* lfd f23,296(r3) */ + 0xcb030130, /* lfd f24,304(r3) */ + 0xcb230138, /* lfd f25,312(r3) */ + 0xcb430140, /* lfd f26,320(r3) */ + 0xcb630148, /* lfd f27,328(r3) */ + 0xcb830150, /* lfd f28,336(r3) */ + 0xcba30158, /* lfd f29,344(r3) */ + 0xcbc30160, /* lfd f30,352(r3) */ + 0xcbe30168, /* lfd f31,360(r3) */ +#endif + +#ifdef __ALTIVEC__ + 0x7ca042a6, /* mfvrsave r5 */ + 0x39040180, /* addi r8,r4,384 */ + 0x39240190, /* addi r9,r4,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x90a40034, /* stw r5,52(r4) */ + 0x4182005c, /* beq- 2 */ + 0x7e8041ce, /* stvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea049ce, /* stvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec041ce, /* stvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee049ce, /* stvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0041ce, /* stvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2049ce, /* stvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4041ce, /* stvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6049ce, /* stvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8041ce, /* stvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa049ce, /* stvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc041ce, /* stvx v30,r0,r8 */ + 0x7fe049ce, /* stvx v31,r0,r9 */ + 0x80a30034,/*2:lwz r5,52(r3) */ + 0x39030180, /* addi r8,r3,384 */ + 0x39230190, /* addi r9,r3,400 */ + 0x70a00fff, /* andi. r0,r5,4095 */ + 0x7ca043a6, /* mtvrsave r5 */ + 0x4d820420, /* beqctr */ + 0x7e8040ce, /* lvx v20,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ea048ce, /* lvx v21,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7ec040ce, /* lvx v22,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7ee048ce, /* lvx v23,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f0040ce, /* lvx v24,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f2048ce, /* lvx v25,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f4040ce, /* lvx v26,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7f6048ce, /* lvx v27,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7f8040ce, /* lvx v28,r0,r8 */ + 0x39080020, /* addi r8,r8,32 */ + 0x7fa048ce, /* lvx v29,r0,r9 */ + 0x39290020, /* addi r9,r9,32 */ + 0x7fc040ce, /* lvx v30,r0,r8 */ + 0x7fe048ce, /* lvx v31,r0,r9 */ +#endif + + 0x4e800420, /* bctr */ +}; + + #if LIBCO_PPCDESC + /* Function call goes through indirect descriptor */ + #define CO_SWAP_ASM( x, y ) \ + ((void (*)( cothread_t, cothread_t )) (uintptr_t) x)( x, y ) + #else + /* Function call goes directly to code */ + #define CO_SWAP_ASM( x, y ) \ + ((void (*)( cothread_t, cothread_t )) (uintptr_t) libco_ppc_code)( x, y ) + #endif + +#endif + +static uint32_t* co_create_( unsigned size, uintptr_t entry ) +{ + uint32_t* t = (uint32_t*) malloc( size ); + + (void) entry; + + #if LIBCO_PPCDESC + if ( t ) + { + /* Copy entry's descriptor */ + memcpy( t, (void*) entry, sizeof (void*) * 3 ); + + /* Set function pointer to swap routine */ + #ifdef LIBCO_PPC_ASM + *(const void**) t = *(void**) &co_swap_asm; + #else + *(const void**) t = libco_ppc_code; + #endif + } + #endif + + return t; +} + +cothread_t co_create( unsigned int size, void (*entry_)( void ) ) +{ + uintptr_t entry = (uintptr_t) entry_; + uint32_t* t = NULL; + + /* Be sure main thread was successfully allocated */ + if ( co_active() ) + { + size += state_size + above_stack + stack_align; + t = co_create_( size, entry ); + } + + if ( t ) + { + uintptr_t sp; + int shift; + + /* Save current registers into new thread, so that any special ones will + have proper values when thread is begun */ + CO_SWAP_ASM( t, t ); + + #if LIBCO_PPCDESC + /* Get real address */ + entry = (uintptr_t) *(void**) entry; + #endif + + /* Put stack near end of block, and align */ + sp = (uintptr_t) t + size - above_stack; + sp -= sp % stack_align; + + /* On PPC32, we save and restore GPRs as 32 bits. For PPC64, we + save and restore them as 64 bits, regardless of the size the ABI + uses. So, we manually write pointers at the proper size. We always + save and restore at the same address, and since PPC is big-endian, + we must put the low byte first on PPC32. */ + + /* If uintptr_t is 32 bits, >>32 is undefined behavior, so we do two shifts + and don't have to care how many bits uintptr_t is. */ + #if LIBCO_PPC64 + shift = 16; + #else + shift = 0; + #endif + + /* Set up so entry will be called on next swap */ + t [8] = (uint32_t) (entry >> shift >> shift); + t [9] = (uint32_t) entry; + + t [10] = (uint32_t) (sp >> shift >> shift); + t [11] = (uint32_t) sp; + } + + return t; +} + +void co_delete( cothread_t t ) +{ + free( t ); +} + +static void co_init_( void ) +{ + #if LIBCO_MPROTECT + /* TODO: pre- and post-pad PPC code so that this doesn't make other + data executable and writable */ + long page_size = sysconf( _SC_PAGESIZE ); + if ( page_size > 0 ) + { + uintptr_t align = page_size; + uintptr_t begin = (uintptr_t) libco_ppc_code; + uintptr_t end = begin + sizeof libco_ppc_code; + + /* Align beginning and end */ + end += align - 1; + end -= end % align; + begin -= begin % align; + + mprotect( (void*) begin, end - begin, PROT_READ | PROT_WRITE | PROT_EXEC ); + } + #endif + + co_active_handle = co_create_( state_size, (uintptr_t) &co_switch ); +} + +cothread_t co_active() +{ + if ( !co_active_handle ) + co_init_(); + + return co_active_handle; +} + +void co_switch( cothread_t t ) +{ + cothread_t old = co_active_handle; + co_active_handle = t; + + CO_SWAP_ASM( t, old ); +} diff --git a/Mednafen/mednafen/snes/src/lib/libco/ppc.s b/Mednafen/mednafen/snes/src/lib/libco/ppc.s new file mode 100755 index 0000000000..d7f6b75874 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/ppc.s @@ -0,0 +1,478 @@ +;***** +;libco.ppc (2007-11-29) +;author: Vas Crabb +;license: public domain +; +;cross-platform PowerPC implementation of libco +;special thanks to byuu for writing the original version +; +;[ABI compatibility] +;- gcc; mac os x; ppc +; +;[nonvolatile registers] +;- GPR1, GPR13 - GPR31 +;- FPR14 - FPR31 +;- V20 - V31 +;- VRSAVE, CR2 - CR4 +; +;[volatile registers] +;- GPR0, GPR2 - GPR12 +;- FPR0 - FPR13 +;- V0 - V19 +;- LR, CTR, XER, CR0, CR1, CR5 - CR7 +;***** + + +;Declare some target-specific stuff + + .section __TEXT,__text,regular,pure_instructions + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .machine ppc + + +;Constants + + .cstring + .align 2 + +_sysctl_altivec: + .ascii "hw.optional.altivec\0" + + +;Declare space for variables + +.lcomm _co_environ,4,2 ;bit 0 = initialised, bit 1 = have Altivec/VMX +.lcomm _co_primary_buffer,1024,2 ;buffer (will be zeroed by loader) + + .data + .align 2 + +_co_active_context: + .long _co_primary_buffer + + + .text + .align 2 + + +;Declare exported names + +.globl _co_active +.globl _co_create +.globl _co_delete +.globl _co_switch + + +;***** +;extern "C" cothread_t co_active(); +;return = GPR3 +;***** + +_co_active: + mflr r0 ;GPR0 = return address + bcl 20,31,L_co_active$spb +L_co_active$spb: + mflr r2 ;GPR2 set for position-independance + addis r3,r2,ha16(_co_active_context-L_co_active$spb) ;get value in GPR3 + lwz r3,lo16(_co_active_context-L_co_active$spb)(r3) + mtlr r0 ;LR = return address + blr ;return + + +;***** +;extern "C" cothread_t co_create(unsigned int heapsize, void (*coentry)()); +;GPR3 = heapsize +;GPR4 = coentry +;return = GPR3 +;***** + +_co_create: + mflr r0 ;GPR0 = return address + stmw r30,-8(r1) ;save GPR30 and GPR31 + stw r0,8(r1) ;save return address + stwu r1,-(2*4+16+24)(r1) ;allocate 16 bytes for locals/parameters + +;create heap space (stack + register storage) + addi r31,r3,1024-24 ;subtract space for linkage + mr r30,r4 ;GPR30 = coentry + addi r3,r3,1024 ;allocate extra memory for contextual info + bl L_malloc$stub ;GPR3 = malloc(heapsize + 1024) + add r4,r3,r31 ;GPR4 points to top-of-stack + rlwinm r5,r4,0,0,27 ;force 16-byte alignment + +;store thread entry point + registers, so that first call to co_switch will execute coentry + stw r30,8(r5) ;store entry point + addi r6,0,2+19+18*2+12*4+1 ;clear for CR, old GPR1, 19 GPRs, 18 FPRs, 12 VRs, VRSAVE + addi r0,0,0 + addi r7,0,4 ;start at 4(GPR5) + mtctr r6 +L_co_create$clear_loop: + stwx r0,r5,r7 ;clear a word + addi r7,r7,-4 ;increment pointer + bdnz L_co_create$clear_loop ;loop + stwu r5,-448(r5) ;store top of stack + +;initialize context memory heap and return + stw r5,0(r3) ;*cothread_t = stack heap pointer (GPR1) + lwz r1,0(r1) ;deallocate stack frame + lwz r8,8(r1) ;fetch return address + lmw r30,-8(r1) ;restore GPR30 and GPR31 + mtlr r8 ;return address in LR + blr ;return + + +;***** +;extern "C" void co_delete(cothread_t cothread); +;GPR3 = cothread +;***** + +_co_delete: + b L_free$stub ;free(GPR3) + + +;***** +;extern "C" void co_switch(cothread_t cothread); +;GPR3 = cothread +;***** +; +;Frame looks like: +; +;Old New Value +; 8(r1) 456(r1) Saved LR +; 4(r1) 452(r1) Saved CR +; 0(r1) 448(r1) Old GPR1 +; -4(r1) 444(r1) Saved GPR31 +; -8(r1) 440(r1) Saved GPR30 +;... ... ... +; -72(r1) 376(r1) Saved GPR14 +; -76(r1) 372(r1) Saved GPR13 +; -80(r1) 368(r1) Saved VRSAVE +; -84(r1) 364(r1) +++ +; -88(r1) 360(r1) Saved FPR31 +; -92(r1) 356(r1) +++ +; -96(r1) 352(r1) Saved FPR30 +;... ... ... +;-212(r1) 236(r1) +++ +;-216(r1) 232(r1) Saved FPR15 +;-220(r1) 228(r1) +++ +;-224(r1) 224(r1) Saved FPR14 +;-228(r1) 220(r1) +++ value +;-232(r1) 216(r1) +++ len +;-236(r1) 212(r1) +++ +;-240(r1) 208(r1) Saved VR31 +;-244(r1) 204(r1) +++ +;-248(r1) 200(r1) +++ +;-252(r1) 196(r1) +++ +;-256(r1) 192(r1) Saved VR30 +;... ... ... +;-388(r1) 60(r1) +++ +;-392(r1) 56(r1) +++ +;-396(r1) 52(r1) +++ +;-400(r1) 48(r1) Saved VR21 +;-404(r1) 44(r1) +++ +;-408(r1) 40(r1) +++ Param 5 (GPR7) +;-412(r1) 36(r1) +++ Param 4 (GPR6) +;-416(r1) 32(r1) Saved VR20 Param 3 (GPR5) +;-420(r1) 28(r1) - Param 2 (GPR4) +;-424(r1) 24(r1) - Param 1 (GPR3) +;-428(r1) 20(r1) - Reserved +;-432(r1) 16(r1) - Reserved +;-436(r1) 12(r1) - Reserved +;-440(r1) 8(r1) - New LR +;-444(r1) 4(r1) - New CR +;-448(r1) 0(r1) Saved GPR1 + + +_co_switch: + stmw r13,-76(r1) ;save preserved GPRs + stfd f14,-224(r1) ;save preserved FPRs + stfd f15,-216(r1) + stfd f16,-208(r1) + stfd f17,-200(r1) + stfd f18,-192(r1) + stfd f19,-184(r1) + stfd f20,-176(r1) + stfd f21,-168(r1) + stfd f22,-160(r1) + stfd f23,-152(r1) + stfd f24,-144(r1) + stfd f25,-136(r1) + stfd f26,-128(r1) + stfd f27,-120(r1) + stfd f28,-112(r1) + stfd f29,-104(r1) + stfd f30,-96(r1) + stfd f31,-88(r1) + mflr r0 ;save return address + stw r0,8(r1) + mfcr r2 ;save condition codes + stw r2,4(r1) + stwu r1,-448(r1) ;create stack frame (save 19 GPRs, 18 FRPs, 12 VRs, VRSAVE) + + mr r30,r3 ;save new context pointer + bcl 20,31,L_co_switch$spb ;get address of co_active_context +L_co_switch$spb: + mflr r31 + + addis r29,r31,ha16(_co_environ-L_co_switch$spb) ;get environment flags + lwz r8,lo16(_co_environ-L_co_switch$spb)(r29) + andis. r9,r8,0x8000 ;is it initialised? + bne+ L_co_switch$initialised + + addi r0,0,4 ;len = sizeof(int) + stw r0,216(r1) + addis r3,r31,ha16(_sysctl_altivec-L_co_switch$spb) ;GPR3 = "hw.optional.altivec" + addi r3,r3,lo16(_sysctl_altivec-L_co_switch$spb) + addi r4,r1,220 ;GPR4 = &value + addi r5,r1,216 ;GPR5 = &len + addi r6,0,0 ;newp = 0 + addi r7,0,0 ;newlen = 0 + bl L_sysctlbyname$stub ;call sysctlbyname + lwz r2,220(r1) ;fetch result + addis r8,0,0x8000 ;set initialised bit + cmpwi cr5,r3,0 ;assume error means not present + cmpwi cr6,r2,0 ;test result + blt- cr5,L_co_switch$store_environ + beq cr6,L_co_switch$store_environ + oris r8,r8,0x4000 ;set the flag to say we have it! +L_co_switch$store_environ: + stw r8,lo16(_co_environ-L_co_switch$spb)(r29) ;store environment flags +L_co_switch$initialised: + + andis. r10,r8,0x4000 ;do we have Altivec/VMX? + beq L_co_switch$save_no_vmx + mfspr r11,256 ;save VRSAVE + andi. r0,r11,0x0FFF ;short-circuit if it's zero + stw r11,368(r1) + beq L_co_switch$save_no_vmx + andi. r0,r11,0x0800 ;check bit 20 + addi r2,0,32 ;starting index + beq L_co_switch$save_skip_vr20 + stvx v20,r1,r2 ;save VR20 +L_co_switch$save_skip_vr20: + addi r2,r2,16 ;stride + andi. r0,r11,0x0400 ;check bit 21 + beq L_co_switch$save_skip_vr21 + stvx v21,r1,r2 ;save VR21 +L_co_switch$save_skip_vr21: + addi r2,r2,16 ;stride + andi. r0,r11,0x0200 ;check bit 22 + beq L_co_switch$save_skip_vr22 + stvx v22,r1,r2 ;save VR22 +L_co_switch$save_skip_vr22: + addi r2,r2,16 ;stride + andi. r0,r11,0x0100 ;check bit 23 + beq L_co_switch$save_skip_vr23 + stvx v23,r1,r2 ;save VR23 +L_co_switch$save_skip_vr23: + addi r2,r2,16 ;stride + andi. r0,r11,0x0080 ;check bit 24 + beq L_co_switch$save_skip_vr24 + stvx v24,r1,r2 ;save VR24 +L_co_switch$save_skip_vr24: + addi r2,r2,16 ;stride + andi. r0,r11,0x0040 ;check bit 25 + beq L_co_switch$save_skip_vr25 + stvx v25,r1,r2 ;save VR25 +L_co_switch$save_skip_vr25: + addi r2,r2,16 ;stride + andi. r0,r11,0x0020 ;check bit 26 + beq L_co_switch$save_skip_vr26 + stvx v26,r1,r2 ;save VR26 +L_co_switch$save_skip_vr26: + addi r2,r2,16 ;stride + andi. r0,r11,0x0010 ;check bit 27 + beq L_co_switch$save_skip_vr27 + stvx v27,r1,r2 ;save VR27 +L_co_switch$save_skip_vr27: + addi r2,r2,16 ;stride + andi. r0,r11,0x0008 ;check bit 28 + beq L_co_switch$save_skip_vr28 + stvx v28,r1,r2 ;save VR28 +L_co_switch$save_skip_vr28: + addi r2,r2,16 ;stride + andi. r0,r11,0x0004 ;check bit 29 + beq L_co_switch$save_skip_vr29 + stvx v29,r1,r2 ;save VR29 +L_co_switch$save_skip_vr29: + addi r2,r2,16 ;stride + andi. r0,r11,0x0002 ;check bit 30 + beq L_co_switch$save_skip_vr30 + stvx v30,r1,r2 ;save VR30 +L_co_switch$save_skip_vr30: + addi r2,r2,16 ;stride + andi. r0,r11,0x0001 ;check bit 31 + beq L_co_switch$save_skip_vr31 + stvx v31,r1,r2 ;save VR31 +L_co_switch$save_skip_vr31: +L_co_switch$save_no_vmx: + + addis r4,r31,ha16(_co_active_context-L_co_switch$spb) ;save current context + lwz r5,lo16(_co_active_context-L_co_switch$spb)(r4) + stw r30,lo16(_co_active_context-L_co_switch$spb)(r4);set new context + stw r1,0(r5) ;save current stack pointer + lwz r1,0(r30) ;get new stack pointer + + andis. r10,r8,0x4000 ;do we have Altivec/VMX? + beq L_co_switch$restore_no_vmx + lwz r11,368(r1) ;restore VRSAVE + andi. r0,r11,0x0FFF ;short-circuit if it's zero + mtspr 256,r11 + beq L_co_switch$restore_no_vmx + andi. r0,r11,0x0800 ;check bit 20 + addi r2,0,32 ;starting index + beq L_co_switch$restore_skip_vr20 + lvx v20,r1,r2 ;restore VR20 +L_co_switch$restore_skip_vr20: + addi r2,r2,16 ;stride + andi. r0,r11,0x0400 ;check bit 21 + beq L_co_switch$restore_skip_vr21 + lvx v21,r1,r2 ;restore VR21 +L_co_switch$restore_skip_vr21: + addi r2,r2,16 ;stride + andi. r0,r11,0x0200 ;check bit 22 + beq L_co_switch$restore_skip_vr22 + lvx v22,r1,r2 ;restore VR22 +L_co_switch$restore_skip_vr22: + addi r2,r2,16 ;stride + andi. r0,r11,0x0100 ;check bit 23 + beq L_co_switch$restore_skip_vr23 + lvx v23,r1,r2 ;restore VR23 +L_co_switch$restore_skip_vr23: + addi r2,r2,16 ;stride + andi. r0,r11,0x0080 ;check bit 24 + beq L_co_switch$restore_skip_vr24 + lvx v24,r1,r2 ;restore VR24 +L_co_switch$restore_skip_vr24: + addi r2,r2,16 ;stride + andi. r0,r11,0x0040 ;check bit 25 + beq L_co_switch$restore_skip_vr25 + lvx v25,r1,r2 ;restore VR25 +L_co_switch$restore_skip_vr25: + addi r2,r2,16 ;stride + andi. r0,r11,0x0020 ;check bit 26 + beq L_co_switch$restore_skip_vr26 + lvx v26,r1,r2 ;restore VR26 +L_co_switch$restore_skip_vr26: + addi r2,r2,16 ;stride + andi. r0,r11,0x0010 ;check bit 27 + beq L_co_switch$restore_skip_vr27 + lvx v27,r1,r2 ;restore VR27 +L_co_switch$restore_skip_vr27: + addi r2,r2,16 ;stride + andi. r0,r11,0x0008 ;check bit 28 + beq L_co_switch$restore_skip_vr28 + lvx v28,r1,r2 ;restore VR28 +L_co_switch$restore_skip_vr28: + addi r2,r2,16 ;stride + andi. r0,r11,0x0004 ;check bit 29 + beq L_co_switch$restore_skip_vr29 + lvx v29,r1,r2 ;restore VR29 +L_co_switch$restore_skip_vr29: + addi r2,r2,16 ;stride + andi. r0,r11,0x0002 ;check bit 30 + beq L_co_switch$restore_skip_vr30 + lvx v30,r1,r2 ;restore VR30 +L_co_switch$restore_skip_vr30: + addi r2,r2,16 ;stride + andi. r0,r11,0x0001 ;check bit 31 + beq L_co_switch$restore_skip_vr31 + lvx v31,r1,r2 ;restore VR31 +L_co_switch$restore_skip_vr31: +L_co_switch$restore_no_vmx: + + lwz r1,0(r1) ;deallocate stack frame + lwz r6,8(r1) ;return address in GPR6 + lwz r7,4(r1) ;condition codes in GPR7 + addi r0,0,0 ;make thread main crash if it returns + lmw r13,-76(r1) ;restore preserved GPRs + lfd f14,-224(r1) ;restore preserved FPRs + lfd f15,-216(r1) + lfd f16,-208(r1) + lfd f17,-200(r1) + lfd f18,-192(r1) + lfd f19,-184(r1) + lfd f20,-176(r1) + lfd f21,-168(r1) + lfd f22,-160(r1) + lfd f23,-152(r1) + lfd f24,-144(r1) + lfd f25,-136(r1) + lfd f26,-128(r1) + lfd f27,-120(r1) + lfd f28,-112(r1) + lfd f29,-104(r1) + lfd f30,-96(r1) + lfd f31,-88(r1) + mtlr r0 + mtctr r6 ;restore return address + mtcrf 32,r7 ;restore preserved condition codes + mtcrf 16,r7 + mtcrf 8,r7 + bctr ;return + + + +;Import external functions + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_malloc$stub: + .indirect_symbol _malloc + mflr r0 + bcl 20,31,L_malloc$spb +L_malloc$spb: + mflr r11 + addis r11,r11,ha16(L_malloc$lazy_ptr-L_malloc$spb) + mtlr r0 + lwzu r12,lo16(L_malloc$lazy_ptr-L_malloc$spb)(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_malloc$lazy_ptr: + .indirect_symbol _malloc + .long dyld_stub_binding_helper + + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_free$stub: + .indirect_symbol _free + mflr r0 + bcl 20,31,L_free$spb +L_free$spb: + mflr r11 + addis r11,r11,ha16(L_free$lazy_ptr-L_free$spb) + mtlr r0 + lwzu r12,lo16(L_free$lazy_ptr-L_free$spb)(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_free$lazy_ptr: + .indirect_symbol _free + .long dyld_stub_binding_helper + + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_sysctlbyname$stub: + .indirect_symbol _sysctlbyname + mflr r0 + bcl 20,31,L_sysctlbyname$spb +L_sysctlbyname$spb: + mflr r11 + addis r11,r11,ha16(L_sysctlbyname$lazy_ptr-L_sysctlbyname$spb) + mtlr r0 + lwzu r12,lo16(L_sysctlbyname$lazy_ptr-L_sysctlbyname$spb)(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_sysctlbyname$lazy_ptr: + .indirect_symbol _sysctlbyname + .long dyld_stub_binding_helper + + +;This needs to be here! + + .subsections_via_symbols + diff --git a/Mednafen/mednafen/snes/src/lib/libco/ppc64.s b/Mednafen/mednafen/snes/src/lib/libco/ppc64.s new file mode 100755 index 0000000000..2fb048d749 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/ppc64.s @@ -0,0 +1,513 @@ +;***** +;libco.ppc64 (2007-12-05) +;author: Vas Crabb +;license: public domain +; +;cross-platform 64-bit PowerPC implementation of libco +;special thanks to byuu for writing the original version +; +;[ABI compatibility] +;- gcc; mac os x; ppc64 +; +;[nonvolatile registers] +;- GPR1, GPR13 - GPR31 +;- FPR14 - FPR31 +;- V20 - V31 +;- VRSAVE, CR2 - CR4 +; +;[volatile registers] +;- GPR0, GPR2 - GPR12 +;- FPR0 - FPR13 +;- V0 - V19 +;- LR, CTR, XER, CR0, CR1, CR5 - CR7 +;***** + + +;Declare some target-specific stuff + + .section __TEXT,__text,regular,pure_instructions + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .machine ppc64 + + +;Constants + + .cstring + .align 3 + +_sysctl_altivec: + .ascii "hw.optional.altivec\0" + + +;Declare space for variables + +.lcomm _co_environ,4,2 ;bit 0 = initialised, bit 1 = have Altivec/VMX +.lcomm _co_primary_buffer,1024,3 ;buffer (will be zeroed by loader) + + .data + .align 3 + +_co_active_context: + .quad _co_primary_buffer + + + .text + .align 2 + + +;Declare exported names + +.globl _co_active +.globl _co_create +.globl _co_delete +.globl _co_switch + + +;***** +;extern "C" cothread_t co_active(); +;return = GPR3 +;***** + +_co_active: + mflr r0 ;GPR0 = return address + bcl 20,31,L_co_active$spb +L_co_active$spb: + mflr r2 ;GPR2 set for position-independance + addis r3,r2,ha16(_co_active_context-L_co_active$spb) ;get value in GPR3 + ld r3,lo16(_co_active_context-L_co_active$spb)(r3) + mtlr r0 ;LR = return address + blr ;return + + +;***** +;extern "C" cothread_t co_create(unsigned int heapsize, void (*coentry)()); +;GPR3 = heapsize +;GPR4 = coentry +;return = GPR3 +;***** + +_co_create: + mflr r0 ;GPR0 = return address + std r30,-16(r1) ;save GPR30 and GPR31 + std r31,-8(r1) + std r0,16(r1) ;save return address + stdu r1,-(2*8+16+48)(r1) ;allocate 16 bytes for locals/parameters + +;create heap space (stack + register storage) + addi r31,r3,1024-48 ;subtract space for linkage + mr r30,r4 ;GPR30 = coentry + addi r3,r3,1024 ;allocate extra memory for contextual info + bl L_malloc$stub ;GPR3 = malloc(heapsize + 1024) + add r4,r3,r31 ;GPR4 points to top-of-stack + rldicr r5,r4,0,59 ;force 16-byte alignment + +;store thread entry point + registers, so that first call to co_switch will execute coentry + std r30,16(r5) ;store entry point + addi r6,0,2+19+18+12*2+1 ;clear for CR, old GPR1, 19 GPRs, 18 FPRs, 12 VRs, VRSAVE + addi r0,0,0 + addi r7,0,8 ;start at 8(GPR5) + mtctr r6 +L_co_create$clear_loop: + stdx r0,r5,r7 ;clear a double + addi r7,r7,-8 ;increment pointer + bdnz L_co_create$clear_loop ;loop + stdu r5,-544(r5) ;store top of stack + +;initialize context memory heap and return + addis r9,0,0x8000 ;GPR13 not set (system TLS) + std r5,0(r3) ;*cothread_t = stack heap pointer (GPR1) + stw r9,8(r3) ;this is a flag word + ld r1,0(r1) ;deallocate stack frame + ld r8,16(r1) ;fetch return address + ld r30,-16(r1) ;restore GPR30 and GPR31 + ld r31,-8(r1) + mtlr r8 ;return address in LR + blr ;return + + +;***** +;extern "C" void co_delete(cothread_t cothread); +;GPR3 = cothread +;***** + +_co_delete: + b L_free$stub ;free(GPR3) + + +;***** +;extern "C" void co_switch(cothread_t cothread); +;GPR3 = cothread +;***** +; +;Frame looks like: +; +;Old New Value +; 16(r1) 560(r1) Saved LR +; 8(r1) 552(r1) Saved CR +; 0(r1) 544(r1) Old GPR1 +; -8(r1) 536(r1) Saved GPR31 +; -16(r1) 528(r1) Saved GPR30 +;... ... ... +;-144(r1) 400(r1) Saved GPR14 +;-152(r1) 392(r1) Saved GPR13 +;-160(r1) 384(r1) Saved FPR31 +;-168(r1) 376(r1) Saved FPR30 +;... ... ... +;-288(r1) 256(r1) Saved FPR15 +;-296(r1) 248(r1) Saved FPR14 +;-304(r1) 240(r1) Saved VRSAVE +;-312(r1) 232(r1) +++ value +;-320(r1) 224(r1) Saved VR31 len +;-328(r1) 216(r1) +++ +;-336(r1) 208(r1) Saved VR30 +;... ... ... +;-456(r1) 88(r1) +++ +;-464(r1) 80(r1) Saved VR22 Param 5 (GPR7) +;-472(r1) 72(r1) +++ Param 4 (GPR6) +;-480(r1) 64(r1) Saved VR21 Param 3 (GPR5) +;-488(r1) 56(r1) +++ Param 2 (GPR4) +;-496(r1) 48(r1) Saved VR20 Param 1 (GPR3) +;-504(r1) 40(r1) - Reserved +;-512(r1) 32(r1) - Reserved +;-520(r1) 24(r1) - Reserved +;-528(r1) 16(r1) - New LR +;-536(r1) 8(r1) - New CR +;-544(r1) 0(r1) Saved GPR1 + + +_co_switch: + std r13,-152(r1) ;save preserved GPRs + std r14,-144(r1) + std r15,-136(r1) + std r16,-128(r1) + std r17,-120(r1) + std r18,-112(r1) + std r19,-104(r1) + std r20,-96(r1) + std r21,-88(r1) + std r22,-80(r1) + std r23,-72(r1) + std r24,-64(r1) + std r25,-56(r1) + std r26,-48(r1) + std r27,-40(r1) + std r28,-32(r1) + std r29,-24(r1) + std r30,-16(r1) + std r31,-8(r1) + mflr r0 ;save return address + std r0,16(r1) + mfcr r2 ;save condition codes + stw r2,8(r1) + stdu r1,-544(r1) ;create stack frame (save 19 GPRs, 18 FRPs, 12 VRs, VRSAVE) + stfd f14,248(r1) ;save preserved FPRs + stfd f15,256(r1) + stfd f16,264(r1) + stfd f17,272(r1) + stfd f18,280(r1) + stfd f19,288(r1) + stfd f20,296(r1) + stfd f21,304(r1) + stfd f22,312(r1) + stfd f23,320(r1) + stfd f24,328(r1) + stfd f25,336(r1) + stfd f26,344(r1) + stfd f27,352(r1) + stfd f28,360(r1) + stfd f29,368(r1) + stfd f30,376(r1) + stfd f31,384(r1) + + mr r30,r3 ;save new context pointer + bcl 20,31,L_co_switch$spb ;get address of co_active_context +L_co_switch$spb: + mflr r31 + + addis r29,r31,ha16(_co_environ-L_co_switch$spb) ;get environment flags + lwz r8,lo16(_co_environ-L_co_switch$spb)(r29) + andis. r9,r8,0x8000 ;is it initialised? + bne+ L_co_switch$initialised + + addi r0,0,4 ;len = sizeof(int) + std r0,224(r1) + addis r3,r31,ha16(_sysctl_altivec-L_co_switch$spb) ;GPR3 = "hw.optional.altivec" + addi r3,r3,lo16(_sysctl_altivec-L_co_switch$spb) + addi r4,r1,232 ;GPR4 = &value + addi r5,r1,224 ;GPR5 = &len + addi r6,0,0 ;newp = 0 + addi r7,0,0 ;newlen = 0 + bl L_sysctlbyname$stub ;call sysctlbyname + lwz r2,232(r1) ;fetch result + addis r8,0,0x8000 ;set initialised bit + cmpdi cr5,r3,0 ;assume error means not present + cmpwi cr6,r2,0 ;test result + blt- cr5,L_co_switch$store_environ + beq cr6,L_co_switch$store_environ + oris r8,r8,0x4000 ;set the flag to say we have it! +L_co_switch$store_environ: + stw r8,lo16(_co_environ-L_co_switch$spb)(r29) ;store environment flags +L_co_switch$initialised: + + andis. r10,r8,0x4000 ;do we have Altivec/VMX? + beq L_co_switch$save_no_vmx + mfspr r11,256 ;save VRSAVE + andi. r0,r11,0x0FFF ;short-circuit if it's zero + stw r11,240(r1) + beq L_co_switch$save_no_vmx + andi. r0,r11,0x0800 ;check bit 20 + addi r2,0,48 ;starting index + beq L_co_switch$save_skip_vr20 + stvx v20,r1,r2 ;save VR20 +L_co_switch$save_skip_vr20: + addi r2,r2,16 ;stride + andi. r0,r11,0x0400 ;check bit 21 + beq L_co_switch$save_skip_vr21 + stvx v21,r1,r2 ;save VR21 +L_co_switch$save_skip_vr21: + addi r2,r2,16 ;stride + andi. r0,r11,0x0200 ;check bit 22 + beq L_co_switch$save_skip_vr22 + stvx v22,r1,r2 ;save VR22 +L_co_switch$save_skip_vr22: + addi r2,r2,16 ;stride + andi. r0,r11,0x0100 ;check bit 23 + beq L_co_switch$save_skip_vr23 + stvx v23,r1,r2 ;save VR23 +L_co_switch$save_skip_vr23: + addi r2,r2,16 ;stride + andi. r0,r11,0x0080 ;check bit 24 + beq L_co_switch$save_skip_vr24 + stvx v24,r1,r2 ;save VR24 +L_co_switch$save_skip_vr24: + addi r2,r2,16 ;stride + andi. r0,r11,0x0040 ;check bit 25 + beq L_co_switch$save_skip_vr25 + stvx v25,r1,r2 ;save VR25 +L_co_switch$save_skip_vr25: + addi r2,r2,16 ;stride + andi. r0,r11,0x0020 ;check bit 26 + beq L_co_switch$save_skip_vr26 + stvx v26,r1,r2 ;save VR26 +L_co_switch$save_skip_vr26: + addi r2,r2,16 ;stride + andi. r0,r11,0x0010 ;check bit 27 + beq L_co_switch$save_skip_vr27 + stvx v27,r1,r2 ;save VR27 +L_co_switch$save_skip_vr27: + addi r2,r2,16 ;stride + andi. r0,r11,0x0008 ;check bit 28 + beq L_co_switch$save_skip_vr28 + stvx v28,r1,r2 ;save VR28 +L_co_switch$save_skip_vr28: + addi r2,r2,16 ;stride + andi. r0,r11,0x0004 ;check bit 29 + beq L_co_switch$save_skip_vr29 + stvx v29,r1,r2 ;save VR29 +L_co_switch$save_skip_vr29: + addi r2,r2,16 ;stride + andi. r0,r11,0x0002 ;check bit 30 + beq L_co_switch$save_skip_vr30 + stvx v30,r1,r2 ;save VR30 +L_co_switch$save_skip_vr30: + addi r2,r2,16 ;stride + andi. r0,r11,0x0001 ;check bit 31 + beq L_co_switch$save_skip_vr31 + stvx v31,r1,r2 ;save VR31 +L_co_switch$save_skip_vr31: +L_co_switch$save_no_vmx: + + addis r4,r31,ha16(_co_active_context-L_co_switch$spb) ;save current context + ld r5,lo16(_co_active_context-L_co_switch$spb)(r4) + std r30,lo16(_co_active_context-L_co_switch$spb)(r4);set new context + std r1,0(r5) ;save current stack pointer + ld r1,0(r30) ;get new stack pointer + lwz r12,8(r30) ;have we already set GPR13 (system TLS)? + andis. r0,r12,0x8000 + beq+ L_co_switch$gpr13_set + std r13,392(r1) + xoris r12,r12,0x8000 + stw r12,8(r30) +L_co_switch$gpr13_set: + + andis. r10,r8,0x4000 ;do we have Altivec/VMX? + beq L_co_switch$restore_no_vmx + lwz r11,240(r1) ;restore VRSAVE + andi. r0,r11,0x0FFF ;short-circuit if it's zero + mtspr 256,r11 + beq L_co_switch$restore_no_vmx + andi. r0,r11,0x0800 ;check bit 20 + addi r2,0,48 ;starting index + beq L_co_switch$restore_skip_vr20 + lvx v20,r1,r2 ;restore VR20 +L_co_switch$restore_skip_vr20: + addi r2,r2,16 ;stride + andi. r0,r11,0x0400 ;check bit 21 + beq L_co_switch$restore_skip_vr21 + lvx v21,r1,r2 ;restore VR21 +L_co_switch$restore_skip_vr21: + addi r2,r2,16 ;stride + andi. r0,r11,0x0200 ;check bit 22 + beq L_co_switch$restore_skip_vr22 + lvx v22,r1,r2 ;restore VR22 +L_co_switch$restore_skip_vr22: + addi r2,r2,16 ;stride + andi. r0,r11,0x0100 ;check bit 23 + beq L_co_switch$restore_skip_vr23 + lvx v23,r1,r2 ;restore VR23 +L_co_switch$restore_skip_vr23: + addi r2,r2,16 ;stride + andi. r0,r11,0x0080 ;check bit 24 + beq L_co_switch$restore_skip_vr24 + lvx v24,r1,r2 ;restore VR24 +L_co_switch$restore_skip_vr24: + addi r2,r2,16 ;stride + andi. r0,r11,0x0040 ;check bit 25 + beq L_co_switch$restore_skip_vr25 + lvx v25,r1,r2 ;restore VR25 +L_co_switch$restore_skip_vr25: + addi r2,r2,16 ;stride + andi. r0,r11,0x0020 ;check bit 26 + beq L_co_switch$restore_skip_vr26 + lvx v26,r1,r2 ;restore VR26 +L_co_switch$restore_skip_vr26: + addi r2,r2,16 ;stride + andi. r0,r11,0x0010 ;check bit 27 + beq L_co_switch$restore_skip_vr27 + lvx v27,r1,r2 ;restore VR27 +L_co_switch$restore_skip_vr27: + addi r2,r2,16 ;stride + andi. r0,r11,0x0008 ;check bit 28 + beq L_co_switch$restore_skip_vr28 + lvx v28,r1,r2 ;restore VR28 +L_co_switch$restore_skip_vr28: + addi r2,r2,16 ;stride + andi. r0,r11,0x0004 ;check bit 29 + beq L_co_switch$restore_skip_vr29 + lvx v29,r1,r2 ;restore VR29 +L_co_switch$restore_skip_vr29: + addi r2,r2,16 ;stride + andi. r0,r11,0x0002 ;check bit 30 + beq L_co_switch$restore_skip_vr30 + lvx v30,r1,r2 ;restore VR30 +L_co_switch$restore_skip_vr30: + addi r2,r2,16 ;stride + andi. r0,r11,0x0001 ;check bit 31 + beq L_co_switch$restore_skip_vr31 + lvx v31,r1,r2 ;restore VR31 +L_co_switch$restore_skip_vr31: +L_co_switch$restore_no_vmx: + + lfd f14,248(r1) ;restore preserved FPRs + lfd f15,256(r1) + lfd f16,264(r1) + lfd f17,272(r1) + lfd f18,280(r1) + lfd f19,288(r1) + lfd f20,296(r1) + lfd f21,304(r1) + lfd f22,312(r1) + lfd f23,320(r1) + lfd f24,328(r1) + lfd f25,336(r1) + lfd f26,344(r1) + lfd f27,352(r1) + lfd f28,360(r1) + lfd f29,368(r1) + lfd f30,376(r1) + lfd f31,384(r1) + addi r0,0,0 ;make thread main crash if it returns + ld r1,0(r1) ;deallocate stack frame + ld r6,16(r1) ;return address in GPR6 + lwz r7,8(r1) ;condition codes in GPR7 + ld r13,-152(r1) ;restore preserved GPRs + ld r14,-144(r1) + ld r15,-136(r1) + ld r16,-128(r1) + ld r17,-120(r1) + ld r18,-112(r1) + ld r19,-104(r1) + ld r20,-96(r1) + ld r21,-88(r1) + ld r22,-80(r1) + ld r23,-72(r1) + ld r24,-64(r1) + ld r25,-56(r1) + ld r26,-48(r1) + ld r27,-40(r1) + ld r28,-32(r1) + ld r29,-24(r1) + ld r30,-16(r1) + ld r31,-8(r1) + mtlr r0 + mtctr r6 ;restore return address + mtcrf 32,r7 ;restore preserved condition codes + mtcrf 16,r7 + mtcrf 8,r7 + bctr ;return + + + +;Import external functions + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_malloc$stub: + .indirect_symbol _malloc + mflr r0 + bcl 20,31,L_malloc$spb +L_malloc$spb: + mflr r11 + addis r11,r11,ha16(L_malloc$lazy_ptr-L_malloc$spb) + mtlr r0 + ldu r12,lo16(L_malloc$lazy_ptr-L_malloc$spb)(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_malloc$lazy_ptr: + .indirect_symbol _malloc + .quad dyld_stub_binding_helper + + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_free$stub: + .indirect_symbol _free + mflr r0 + bcl 20,31,L_free$spb +L_free$spb: + mflr r11 + addis r11,r11,ha16(L_free$lazy_ptr-L_free$spb) + mtlr r0 + ldu r12,lo16(L_free$lazy_ptr-L_free$spb)(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_free$lazy_ptr: + .indirect_symbol _free + .quad dyld_stub_binding_helper + + + .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 5 +L_sysctlbyname$stub: + .indirect_symbol _sysctlbyname + mflr r0 + bcl 20,31,L_sysctlbyname$spb +L_sysctlbyname$spb: + mflr r11 + addis r11,r11,ha16(L_sysctlbyname$lazy_ptr-L_sysctlbyname$spb) + mtlr r0 + ldu r12,lo16(L_sysctlbyname$lazy_ptr-L_sysctlbyname$spb)(r11) + mtctr r12 + bctr + .lazy_symbol_pointer +L_sysctlbyname$lazy_ptr: + .indirect_symbol _sysctlbyname + .quad dyld_stub_binding_helper + + +;This needs to be here! + + .subsections_via_symbols + diff --git a/Mednafen/mednafen/snes/src/lib/libco/sjlj.c b/Mednafen/mednafen/snes/src/lib/libco/sjlj.c new file mode 100755 index 0000000000..8b72b614e3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/sjlj.c @@ -0,0 +1,102 @@ +/* + libco.sjlj (2008-01-28) + author: Nach + license: public domain +*/ + +/* + * Note this was designed for UNIX systems. Based on ideas expressed in a paper + * by Ralf Engelschall. + * For SJLJ on other systems, one would want to rewrite springboard() and + * co_create() and hack the jmb_buf stack pointer. + */ + +#define LIBCO_C +#include "libco.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + sigjmp_buf context; + void (*coentry)(void); + void *stack; +} cothread_struct; + +static thread_local cothread_struct co_primary; +static thread_local cothread_struct *creating, *co_running = 0; + +static void springboard(int ignored) { + if(sigsetjmp(creating->context, 0)) { + co_running->coentry(); + } +} + +cothread_t co_active() { + if(!co_running) co_running = &co_primary; + return (cothread_t)co_running; +} + +cothread_t co_create(unsigned int size, void (*coentry)(void)) { + if(!co_running) co_running = &co_primary; + + cothread_struct *thread = (cothread_struct*)malloc(sizeof(cothread_struct)); + if(thread) { + struct sigaction handler; + struct sigaction old_handler; + + stack_t stack; + stack_t old_stack; + + thread->coentry = thread->stack = 0; + + stack.ss_flags = 0; + stack.ss_size = size; + thread->stack = stack.ss_sp = malloc(size); + if(stack.ss_sp && !sigaltstack(&stack, &old_stack)) { + handler.sa_handler = springboard; + handler.sa_flags = SA_ONSTACK; + sigemptyset(&handler.sa_mask); + creating = thread; + + if(!sigaction(SIGUSR1, &handler, &old_handler)) { + if(!raise(SIGUSR1)) { + thread->coentry = coentry; + } + sigaltstack(&old_stack, 0); + sigaction(SIGUSR1, &old_handler, 0); + } + } + + if(thread->coentry != coentry) { + co_delete(thread); + thread = 0; + } + } + + return (cothread_t)thread; +} + +void co_delete(cothread_t cothread) { + if(cothread) { + if(((cothread_struct*)cothread)->stack) { + free(((cothread_struct*)cothread)->stack); + } + free(cothread); + } +} + +void co_switch(cothread_t cothread) { + if(!sigsetjmp(co_running->context, 0)) { + co_running = (cothread_struct*)cothread; + siglongjmp(co_running->context, 1); + } +} + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/ucontext.c b/Mednafen/mednafen/snes/src/lib/libco/ucontext.c new file mode 100755 index 0000000000..17472f6bcc --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/ucontext.c @@ -0,0 +1,67 @@ +/* + libco.ucontext (2008-01-28) + author: Nach + license: public domain +*/ + +/* + * WARNING: the overhead of POSIX ucontext is very high, + * assembly versions of libco or libco_sjlj should be much faster + * + * This library only exists for two reasons: + * 1 - as an initial test for the viability of a ucontext implementation + * 2 - to demonstrate the power and speed of libco over existing implementations, + * such as pth (which defaults to wrapping ucontext on unix targets) + * + * Use this library only as a *last resort* + */ + +#define LIBCO_C +#include "libco.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static thread_local ucontext_t co_primary; +static thread_local ucontext_t *co_running = 0; + +cothread_t co_active() { + if(!co_running) co_running = &co_primary; + return (cothread_t)co_running; +} + +cothread_t co_create(unsigned int heapsize, void (*coentry)(void)) { + if(!co_running) co_running = &co_primary; + ucontext_t *thread = (ucontext_t*)malloc(sizeof(ucontext_t)); + if(thread) { + if((!getcontext(thread) && !(thread->uc_stack.ss_sp = 0)) && (thread->uc_stack.ss_sp = malloc(heapsize))) { + thread->uc_link = co_running; + thread->uc_stack.ss_size = heapsize; + makecontext(thread, coentry, 0); + } else { + co_delete((cothread_t)thread); + thread = 0; + } + } + return (cothread_t)thread; +} + +void co_delete(cothread_t cothread) { + if(cothread) { + if(((ucontext_t*)cothread)->uc_stack.ss_sp) { free(((ucontext_t*)cothread)->uc_stack.ss_sp); } + free(cothread); + } +} + +void co_switch(cothread_t cothread) { + ucontext_t *old_thread = co_running; + co_running = (ucontext_t*)cothread; + swapcontext(old_thread, co_running); +} + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/snes/src/lib/libco/x86.c b/Mednafen/mednafen/snes/src/lib/libco/x86.c new file mode 100755 index 0000000000..d8f820b066 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/libco/x86.c @@ -0,0 +1,93 @@ +/* + libco.x86 (2009-10-12) + author: byuu + license: public domain +*/ + +#define LIBCO_C +#include "libco.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_MSC_VER) + #define fastcall __fastcall +#elif defined(__GNUC__) + #define fastcall __attribute__((fastcall)) +#else + #error "libco: please define fastcall macro" +#endif + +static thread_local long co_active_buffer[64]; +static thread_local cothread_t co_active_handle = 0; +static void (fastcall *co_swap)(cothread_t, cothread_t) = 0; + +//ABI: fastcall +static unsigned char co_swap_function[] = { + 0x89, 0x22, 0x8B, 0x21, 0x58, 0x89, 0x6A, 0x04, 0x89, 0x72, 0x08, 0x89, 0x7A, 0x0C, 0x89, 0x5A, + 0x10, 0x8B, 0x69, 0x04, 0x8B, 0x71, 0x08, 0x8B, 0x79, 0x0C, 0x8B, 0x59, 0x10, 0xFF, 0xE0, +}; + +#ifdef _WIN32 + #include + + void co_init() { + DWORD old_privileges; + VirtualProtect(co_swap_function, sizeof co_swap_function, PAGE_EXECUTE_READWRITE, &old_privileges); + } +#else + #include + #include + + void co_init() { + unsigned long addr = (unsigned long)co_swap_function; + unsigned long base = addr - (addr % sysconf(_SC_PAGESIZE)); + unsigned long size = (addr - base) + sizeof co_swap_function; + mprotect((void*)base, size, PROT_READ | PROT_WRITE | PROT_EXEC); + } +#endif + +static void crash() { + assert(0); /* called only if cothread_t entrypoint returns */ +} + +cothread_t co_active() { + if(!co_active_handle) co_active_handle = &co_active_buffer; + return co_active_handle; +} + +cothread_t co_create(unsigned int size, void (*entrypoint)(void)) { + cothread_t handle; + if(!co_swap) { + co_init(); + co_swap = (void (fastcall*)(cothread_t, cothread_t))co_swap_function; + } + if(!co_active_handle) co_active_handle = &co_active_buffer; + size += 256; /* allocate additional space for storage */ + size &= ~15; /* align stack to 16-byte boundary */ + + if(handle = (cothread_t)malloc(size)) { + long *p = (long*)((char*)handle + size); /* seek to top of stack */ + *--p = (long)crash; /* crash if entrypoint returns */ + *--p = (long)entrypoint; /* start of function */ + *(long*)handle = (long)p; /* stack pointer */ + } + + return handle; +} + +void co_delete(cothread_t handle) { + free(handle); +} + +void co_switch(cothread_t handle) { + register cothread_t co_previous_handle = co_active_handle; + co_swap(co_active_handle = handle, co_previous_handle); +} + +#ifdef __cplusplus +} +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/algorithm.hpp b/Mednafen/mednafen/snes/src/lib/nall/algorithm.hpp new file mode 100755 index 0000000000..de197c8386 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/algorithm.hpp @@ -0,0 +1,17 @@ +#ifndef NALL_ALGORITHM_HPP +#define NALL_ALGORITHM_HPP + +#undef min +#undef max + +namespace nall_v059 { + template T min(const T& t, const U& u) { + return t < u ? t : u; + } + + template T max(const T& t, const U& u) { + return t > u ? t : u; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/any.hpp b/Mednafen/mednafen/snes/src/lib/nall/any.hpp new file mode 100755 index 0000000000..3eeca8de30 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/any.hpp @@ -0,0 +1,74 @@ +#ifndef NALL_ANY_HPP +#define NALL_ANY_HPP + +#include +#include +#include + +namespace nall_v059 { + class any { + public: + bool empty() const { return container; } + const std::type_info& type() const { return container ? container->type() : typeid(void); } + + template any& operator=(const T& value_) { + typedef typename static_if< + is_array::value, + typename remove_extent::type>::type*, + T + >::type auto_t; + + if(type() == typeid(auto_t)) { + static_cast*>(container)->value = (auto_t)value_; + } else { + if(container) delete container; + container = new holder((auto_t)value_); + } + + return *this; + } + + any() : container(0) {} + template any(const T& value_) : container(0) { operator=(value_); } + + private: + struct placeholder { + virtual const std::type_info& type() const = 0; + } *container; + + template struct holder : placeholder { + T value; + const std::type_info& type() const { return typeid(T); } + holder(const T& value_) : value(value_) {} + }; + + template friend T any_cast(any&); + template friend T any_cast(const any&); + template friend T* any_cast(any*); + template friend const T* any_cast(const any*); + }; + + template T any_cast(any &value) { + typedef typename remove_reference::type nonref; + if(value.type() != typeid(nonref)) throw; + return static_cast*>(value.container)->value; + } + + template T any_cast(const any &value) { + typedef const typename remove_reference::type nonref; + if(value.type() != typeid(nonref)) throw; + return static_cast*>(value.container)->value; + } + + template T* any_cast(any *value) { + if(!value || value->type() != typeid(T)) return 0; + return &static_cast*>(value->container)->value; + } + + template const T* any_cast(const any *value) { + if(!value || value->type() != typeid(T)) return 0; + return &static_cast*>(value->container)->value; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/array.hpp b/Mednafen/mednafen/snes/src/lib/nall/array.hpp new file mode 100755 index 0000000000..28474d9956 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/array.hpp @@ -0,0 +1,95 @@ +#ifndef NALL_ARRAY_HPP +#define NALL_ARRAY_HPP + +#include +#include +#include +#include + +namespace nall_v059 { + //dynamic vector array + //neither constructor nor destructor is ever invoked; + //thus, this should only be used for POD objects. + template class array { + protected: + T *pool; + unsigned poolsize, buffersize; + + public: + unsigned size() const { return buffersize; } + unsigned capacity() const { return poolsize; } + + void reset() { + if(pool) free(pool); + pool = 0; + poolsize = 0; + buffersize = 0; + } + + void reserve(unsigned newsize) { + if(newsize == poolsize) return; + + pool = (T*)realloc(pool, newsize * sizeof(T)); + poolsize = newsize; + buffersize = min(buffersize, newsize); + } + + void resize(unsigned newsize) { + if(newsize > poolsize) reserve(bit::round(newsize)); //round reserve size up to power of 2 + buffersize = newsize; + } + + T* get(unsigned minsize = 0) { + if(minsize > buffersize) resize(minsize); + if(minsize > buffersize) throw "array[] out of bounds"; + return pool; + } + + void add(const T data) { + operator[](buffersize) = data; + } + + signed find(const T data) { + for(unsigned i = 0; i < size(); i++) if(pool[i] == data) return i; + return -1; //not found + } + + void clear() { + memset(pool, 0, buffersize * sizeof(T)); + } + + array() { + pool = 0; + poolsize = 0; + buffersize = 0; + } + + ~array() { reset(); } + + array(const array &source) : pool(0) { + operator=(source); + } + + array& operator=(const array &source) { + if(pool) free(pool); + buffersize = source.buffersize; + poolsize = source.poolsize; + pool = (T*)malloc(sizeof(T) * poolsize); //allocate entire pool size, + memcpy(pool, source.pool, sizeof(T) * buffersize); //... but only copy used pool objects + return *this; + } + + inline T& operator[](unsigned index) { + if(index >= buffersize) resize(index + 1); + if(index >= buffersize) throw "array[] out of bounds"; + return pool[index]; + } + + inline const T& operator[](unsigned index) const { + if(index >= buffersize) throw "array[] out of bounds"; + return pool[index]; + } + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/bit.hpp b/Mednafen/mednafen/snes/src/lib/nall/bit.hpp new file mode 100755 index 0000000000..9f48dd0fc6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/bit.hpp @@ -0,0 +1,51 @@ +#ifndef NALL_BIT_HPP +#define NALL_BIT_HPP + +namespace nall_v059 { + template inline unsigned uclamp(const unsigned x) { + enum { y = (1U << bits) - 1 }; + return y + ((x - y) & -(x < y)); //min(x, y); + } + + template inline unsigned uclip(const unsigned x) { + enum { m = (1U << bits) - 1 }; + return (x & m); + } + + template inline signed sclamp(const signed x) { + enum { b = 1U << (bits - 1), m = (1U << (bits - 1)) - 1 }; + return (x > m) ? m : (x < -b) ? -b : x; + } + + template inline signed sclip(const signed x) { + enum { b = 1U << (bits - 1), m = (1U << bits) - 1 }; + return ((x & m) ^ b) - b; + } + + namespace bit { + //lowest(0b1110) == 0b0010 + template inline T lowest(const T x) { + return x & -x; + } + + //clear_lowest(0b1110) == 0b1100 + template inline T clear_lowest(const T x) { + return x & (x - 1); + } + + //set_lowest(0b0101) == 0b0111 + template inline T set_lowest(const T x) { + return x | (x + 1); + } + + //round up to next highest single bit: + //round(15) == 16, round(16) == 16, round(17) == 32 + inline unsigned round(unsigned x) { + if((x & (x - 1)) == 0) return x; + while(x & (x - 1)) x &= x - 1; + return x << 1; + } + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/crc32.hpp b/Mednafen/mednafen/snes/src/lib/nall/crc32.hpp new file mode 100755 index 0000000000..e17a0c3ad4 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/crc32.hpp @@ -0,0 +1,66 @@ +#ifndef NALL_CRC32_HPP +#define NALL_CRC32_HPP + +#include + +namespace nall_v059 { + const uint32_t crc32_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d + }; + + inline uint32_t crc32_adjust(uint32_t crc32, uint8_t input) { + return ((crc32 >> 8) & 0x00ffffff) ^ crc32_table[(crc32 ^ input) & 0xff]; + } + + inline uint32_t crc32_calculate(const uint8_t *data, unsigned length) { + uint32_t crc32 = ~0; + for(unsigned i = 0; i < length; i++) { + crc32 = crc32_adjust(crc32, data[i]); + } + return ~crc32; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/detect.hpp b/Mednafen/mednafen/snes/src/lib/nall/detect.hpp new file mode 100755 index 0000000000..b4991aaf62 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/detect.hpp @@ -0,0 +1,30 @@ +#ifndef NALL_DETECT_HPP +#define NALL_DETECT_HPP + +/* Compiler detection */ + +#if defined(__GNUC__) + #define COMPILER_GCC +#elif defined(_MSC_VER) + #define COMPILER_VISUALC +#endif + +/* Platform detection */ + +#if defined(_WIN32) + #define PLATFORM_WIN +#elif defined(__APPLE__) + #define PLATFORM_OSX +#elif defined(linux) || defined(__sun__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + #define PLATFORM_X +#endif + +/* Endian detection */ + +#if defined(__i386__) || defined(__amd64__) || defined(_M_IX86) || defined(_M_AMD64) + #define ARCH_LSB +#elif defined(__powerpc__) || defined(_M_PPC) || defined(__BIG_ENDIAN__) + #define ARCH_MSB +#endif + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/endian.hpp b/Mednafen/mednafen/snes/src/lib/nall/endian.hpp new file mode 100755 index 0000000000..40d15633a2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/endian.hpp @@ -0,0 +1,38 @@ +#ifndef NALL_ENDIAN_HPP +#define NALL_ENDIAN_HPP + +#if !defined(ARCH_MSB) + //little-endian: uint8_t[] { 0x01, 0x02, 0x03, 0x04 } == 0x04030201 + #define order_lsb2(a,b) a,b + #define order_lsb3(a,b,c) a,b,c + #define order_lsb4(a,b,c,d) a,b,c,d + #define order_lsb5(a,b,c,d,e) a,b,c,d,e + #define order_lsb6(a,b,c,d,e,f) a,b,c,d,e,f + #define order_lsb7(a,b,c,d,e,f,g) a,b,c,d,e,f,g + #define order_lsb8(a,b,c,d,e,f,g,h) a,b,c,d,e,f,g,h + #define order_msb2(a,b) b,a + #define order_msb3(a,b,c) c,b,a + #define order_msb4(a,b,c,d) d,c,b,a + #define order_msb5(a,b,c,d,e) e,d,c,b,a + #define order_msb6(a,b,c,d,e,f) f,e,d,c,b,a + #define order_msb7(a,b,c,d,e,f,g) g,f,e,d,c,b,a + #define order_msb8(a,b,c,d,e,f,g,h) h,g,f,e,d,c,b,a +#else + //big-endian: uint8_t[] { 0x01, 0x02, 0x03, 0x04 } == 0x01020304 + #define order_lsb2(a,b) b,a + #define order_lsb3(a,b,c) c,b,a + #define order_lsb4(a,b,c,d) d,c,b,a + #define order_lsb5(a,b,c,d,e) e,d,c,b,a + #define order_lsb6(a,b,c,d,e,f) f,e,d,c,b,a + #define order_lsb7(a,b,c,d,e,f,g) g,f,e,d,c,b,a + #define order_lsb8(a,b,c,d,e,f,g,h) h,g,f,e,d,c,b,a + #define order_msb2(a,b) a,b + #define order_msb3(a,b,c) a,b,c + #define order_msb4(a,b,c,d) a,b,c,d + #define order_msb5(a,b,c,d,e) a,b,c,d,e + #define order_msb6(a,b,c,d,e,f) a,b,c,d,e,f + #define order_msb7(a,b,c,d,e,f,g) a,b,c,d,e,f,g + #define order_msb8(a,b,c,d,e,f,g,h) a,b,c,d,e,f,g,h +#endif + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/function.hpp b/Mednafen/mednafen/snes/src/lib/nall/function.hpp new file mode 100755 index 0000000000..47203d6077 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/function.hpp @@ -0,0 +1,190 @@ +#ifndef NALL_FUNCTION_HPP +#define NALL_FUNCTION_HPP + +#include + +//prologue + +#define TN typename + +namespace nall_v059 { + template class function; +} + +//parameters = 0 + +#define cat(n) n +#define TL typename R +#define PL +#define CL + +#include "function.hpp" + +//parameters = 1 + +#define cat(n) , n +#define TL TN R, TN P1 +#define PL P1 p1 +#define CL p1 + +#include "function.hpp" + +//parameters = 2 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2 +#define PL P1 p1, P2 p2 +#define CL p1, p2 + +#include "function.hpp" + +//parameters = 3 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2, TN P3 +#define PL P1 p1, P2 p2, P3 p3 +#define CL p1, p2, p3 + +#include "function.hpp" + +//parameters = 4 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2, TN P3, TN P4 +#define PL P1 p1, P2 p2, P3 p3, P4 p4 +#define CL p1, p2, p3, p4 + +#include "function.hpp" + +//parameters = 5 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2, TN P3, TN P4, TN P5 +#define PL P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 +#define CL p1, p2, p3, p4, p5 + +#include "function.hpp" + +//parameters = 6 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2, TN P3, TN P4, TN P5, TN P6 +#define PL P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6 +#define CL p1, p2, p3, p4, p5, p6 + +#include "function.hpp" + +//parameters = 7 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2, TN P3, TN P4, TN P5, TN P6, TN P7 +#define PL P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7 +#define CL p1, p2, p3, p4, p5, p6, p7 + +#include "function.hpp" + +//parameters = 8 + +#define cat(n) , n +#define TL TN R, TN P1, TN P2, TN P3, TN P4, TN P5, TN P6, TN P7, TN P8 +#define PL P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8 +#define CL p1, p2, p3, p4, p5, p6, p7, p8 + +#include "function.hpp" + +//epilogue + +#undef TN +#define NALL_FUNCTION_T + +#elif !defined(NALL_FUNCTION_T) + +//function implementation template class + +namespace nall_v059 { + template + class function { + private: + struct base1 { virtual void func1(PL) {} }; + struct base2 { virtual void func2(PL) {} }; + struct derived : base1, virtual base2 {}; + + struct data_t { + R (*fn_call)(const data_t& cat(PL)); + union { + R (*fn_global)(PL); + struct { + R (derived::*fn_member)(PL); + void *object; + }; + }; + } data; + + static R fn_call_global(const data_t &d cat(PL)) { + return d.fn_global(CL); + } + + template + static R fn_call_member(const data_t &d cat(PL)) { + return (((C*)d.object)->*((R (C::*&)(PL))d.fn_member))(CL); + } + + public: + R operator()(PL) const { return data.fn_call(data cat(CL)); } + operator bool() const { return data.fn_call; } + + function() { data.fn_call = 0; } + + function(void *fn) { + data.fn_call = fn ? &fn_call_global : 0; + data.fn_global = (R (*)(PL))fn; + } + + function(R (*fn)(PL)) { + data.fn_call = &fn_call_global; + data.fn_global = fn; + } + + template + function(R (C::*fn)(PL), C *obj) { + data.fn_call = &fn_call_member; + (R (C::*&)(PL))data.fn_member = fn; + assert(sizeof data.fn_member >= sizeof fn); + data.object = obj; + } + + template + function(R (C::*fn)(PL) const, C *obj) { + data.fn_call = &fn_call_member; + (R (C::*&)(PL))data.fn_member = (R (C::*&)(PL))fn; + assert(sizeof data.fn_member >= sizeof fn); + data.object = obj; + } + + function& operator=(void *fn) { return operator=(function(fn)); } + function& operator=(const function &source) { memcpy(&data, &source.data, sizeof(data_t)); return *this; } + function(const function &source) { memcpy(&data, &source.data, sizeof(data_t)); } + }; + + template + function bind(R (*fn)(PL)) { + return function(fn); + } + + template + function bind(R (C::*fn)(PL), C *obj) { + return function(fn, obj); + } + + template + function bind(R (C::*fn)(PL) const, C *obj) { + return function(fn, obj); + } +} + +#undef cat +#undef TL +#undef PL +#undef CL + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/moduloarray.hpp b/Mednafen/mednafen/snes/src/lib/nall/moduloarray.hpp new file mode 100755 index 0000000000..384117deb9 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/moduloarray.hpp @@ -0,0 +1,40 @@ +#ifndef NALL_MODULO_HPP +#define NALL_MODULO_HPP + +#include + +namespace nall_v059 { + template class modulo_array { + public: + inline T operator[](int index) const { + return buffer[size + index]; + } + + inline T read(int index) const { + return buffer[size + index]; + } + + inline void write(unsigned index, const T value) { + buffer[index] = + buffer[index + size] = + buffer[index + size + size] = value; + } + + void serialize(serializer &s) { + s.array(buffer, size * 3); + } + + modulo_array() { + buffer = new T[size * 3](); + } + + ~modulo_array() { + delete[] buffer; + } + + private: + T *buffer; + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/platform.hpp b/Mednafen/mednafen/snes/src/lib/nall/platform.hpp new file mode 100755 index 0000000000..0bd6289563 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/platform.hpp @@ -0,0 +1,77 @@ +#ifndef NALL_PLATFORM_HPP +#define NALL_PLATFORM_HPP + +//========================= +//standard platform headers +//========================= + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_WIN32) + #include + #include + #include + #undef interface +#else + #include + #include + #include +#endif + +//================== +//warning supression +//================== + +//Visual C++ +#if defined(_MSC_VER) + //disable libc "deprecation" warnings + #pragma warning(disable:4996) +#endif + +//================ +//POSIX compliance +//================ + +#if defined(_MSC_VER) + #define PATH_MAX _MAX_PATH + #define va_copy(dest, src) ((dest) = (src)) +#endif + +#if defined(_WIN32) + #define getcwd _getcwd + #define ftruncate _chsize + #define putenv _putenv + #define rmdir _rmdir + #define vsnprintf _vsnprintf + #define usleep(n) Sleep(n / 1000) +#endif + +//================ +//inline expansion +//================ + +#if defined(__GNUC__) + #define noinline __attribute__((noinline)) + #define inline inline + #define alwaysinline inline __attribute__((always_inline)) +#elif defined(_MSC_VER) + #define noinline __declspec(noinline) + #define inline inline + #define alwaysinline inline __forceinline +#else + #define noinline + #define inline inline + #define alwaysinline inline +#endif + +#endif + diff --git a/Mednafen/mednafen/snes/src/lib/nall/priorityqueue.hpp b/Mednafen/mednafen/snes/src/lib/nall/priorityqueue.hpp new file mode 100755 index 0000000000..6a9edd50b5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/priorityqueue.hpp @@ -0,0 +1,153 @@ +#ifndef NALL_PRIORITYQUEUE_HPP +#define NALL_PRIORITYQUEUE_HPP + +#include +#include +#include +#include + +namespace nall_v059 { + template void priority_queue_nocallback(type_t) {} + + //priority queue implementation using binary min-heap array; + //does not require normalize() function. + //O(1) find (tick) + //O(log n) insert (enqueue) + //O(log n) remove (dequeue) + template class priority_queue : noncopyable { + public: + inline void tick(unsigned ticks) { + basecounter += ticks; + while(heapsize && gte(basecounter, heap[0].counter)) callback(dequeue()); + } + + //counter is relative to current time (eg enqueue(64, ...) fires in 64 ticks); + //counter cannot exceed std::numeric_limits::max() >> 1. + void enqueue(unsigned counter, type_t event) { + if(heapsize >= heapcapacity) + { + //puts("IYEEE"); + return; + } + + unsigned child = heapsize++; + counter += basecounter; + + while(child) { + unsigned parent = (child - 1) >> 1; + if(gte(counter, heap[parent].counter)) break; + + heap[child].counter = heap[parent].counter; + heap[child].event = heap[parent].event; + child = parent; + } + + heap[child].counter = counter; + heap[child].event = event; + } + + type_t dequeue() { + type_t event(heap[0].event); + unsigned parent = 0; + unsigned counter = heap[--heapsize].counter; + + while(true) { + unsigned child = (parent << 1) + 1; + if(child >= heapsize) break; + if(child + 1 < heapsize && gte(heap[child].counter, heap[child + 1].counter)) child++; + if(gte(heap[child].counter, counter)) break; + + heap[parent].counter = heap[child].counter; + heap[parent].event = heap[child].event; + parent = child; + } + + heap[parent].counter = counter; + heap[parent].event = heap[heapsize].event; + return event; + } + + void reset() { + basecounter = 0; + heapsize = 0; + } + + void serialize(serializer &s) { + s.integer(basecounter); + s.integer(heapsize); + + for(unsigned n = 0; n < heapcapacity; n++) { + s.integer(heap[n].counter); + s.integer(heap[n].event); + } + + if(s.mode() == serializer::Load) + { + bool error_condition = false; + unsigned prev; + + if(heapsize > heapcapacity) + { + heapsize = 0; // So the loop isn't iterated through below. + error_condition = true; + } + +#if 0 + prev = heap[0].counter - basecounter; + for(unsigned n = 0; n < heapsize; n++) + { + unsigned cur = heap[n].counter - basecounter; + + if(cur > heaptimesanity) + { + error_condition = true; + break; + } + + if(cur < prev) + { + error_condition = true; + break; + } + + prev = cur; + } +#endif + if(error_condition) + { + puts("Priority queue error"); + reset(); + } + } + } + + priority_queue(unsigned size, function callback_ = &priority_queue_nocallback, unsigned time_sanity = (std::numeric_limits::max() >> 1)) + : callback(callback_), heaptimesanity(time_sanity) { + heap = new heap_t[size]; + heapcapacity = size; + reset(); + } + + ~priority_queue() { + delete[] heap; + } + + private: + function callback; + unsigned basecounter; + unsigned heapsize; + unsigned heapcapacity; + unsigned heaptimesanity; + struct heap_t { + unsigned counter; + type_t event; + } *heap; + + //return true if x is greater than or equal to y + inline bool gte(unsigned x, unsigned y) { + return x - y < (std::numeric_limits::max() >> 1); + } + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/property.hpp b/Mednafen/mednafen/snes/src/lib/nall/property.hpp new file mode 100755 index 0000000000..2694aee74c --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/property.hpp @@ -0,0 +1,69 @@ +#ifndef NALL_PROPERTY_HPP +#define NALL_PROPERTY_HPP + +//nall::property implements ownership semantics into container classes +//example: property::readonly implies that only owner has full +//access to type; and all other code has readonly access. +// +//this code relies on extended friend semantics from C++0x to work, as it +//declares a friend class via a template paramter. it also exploits a bug in +//G++ 4.x to work even in C++98 mode. +// +//if compiling elsewhere, simply remove the friend class and private semantics + +//property can be used either of two ways: +//struct foo { +// property::readonly x; +// property::readwrite y; +//}; +//-or- +//struct foo : property { +// readonly x; +// readwrite y; +//}; + +//return types are const T& (byref) instead fo T (byval) to avoid major speed +//penalties for objects with expensive copy constructors + +//operator-> provides access to underlying object type: +//readonly foo; +//foo->bar(); +//... will call Object::bar(); + +//operator='s reference is constant so as to avoid leaking a reference handle +//that could bypass access restrictions + +//both constant and non-constant operators are provided, though it may be +//necessary to cast first, for instance: +//struct foo : property { readonly bar; } object; +//int main() { int value = const_cast(object); } + +//writeonly is useful for objects that have non-const reads, but const writes. +//however, to avoid leaking handles, the interface is very restricted. the only +//way to write is via operator=, which requires conversion via eg copy +//constructor. example: +//struct foo { +// foo(bool value) { ... } +//}; +//writeonly bar; +//bar = true; + +namespace nall_v059 { + template struct property { + template struct traits { typedef T type; }; + + template struct readonly { + const T* operator->() const { return &value; } + const T& operator()() const { return value; } + operator const T&() const { return value; } +// private: + T* operator->() { return &value; } + operator T&() { return value; } + const T& operator=(const T& value_) { return value = value_; } + T value; +// friend class traits::type; + }; + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/serial.hpp b/Mednafen/mednafen/snes/src/lib/nall/serial.hpp new file mode 100755 index 0000000000..b1e30163aa --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/serial.hpp @@ -0,0 +1,80 @@ +#ifndef NALL_SERIAL_HPP +#define NALL_SERIAL_HPP + +#include +#include +#include +#include + +#include + +namespace nall_v059 { + class serial { + public: + //-1 on error, otherwise return bytes read + int read(uint8_t *data, unsigned length) { + if(port_open == false) return -1; + return ::read(port, (void*)data, length); + } + + //-1 on error, otherwise return bytes written + int write(const uint8_t *data, unsigned length) { + if(port_open == false) return -1; + return ::write(port, (void*)data, length); + } + + bool open(const char *portname, unsigned rate) { + close(); + + port = ::open(portname, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); + if(port == -1) return false; + + if(ioctl(port, TIOCEXCL) == -1) { close(); return false; } + if(fcntl(port, F_SETFL, 0) == -1) { close(); return false; } + if(tcgetattr(port, &original_attr) == -1) { close(); return false; } + + termios attr = original_attr; + cfmakeraw(&attr); + cfsetspeed(&attr, rate); + + attr.c_lflag &=~ (ECHO | ECHONL | ISIG | ICANON | IEXTEN); + attr.c_iflag &=~ (BRKINT | PARMRK | INPCK | ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IXANY); + attr.c_iflag |= (IGNBRK | IGNPAR); + attr.c_oflag &=~ (OPOST); + attr.c_cflag &=~ (CSIZE | CSTOPB | PARENB); + attr.c_cflag |= (CS8 | CREAD | CLOCAL); + attr.c_cc[VTIME] = attr.c_cc[VMIN] = 0; + + if(tcsetattr(port, TCSANOW, &attr) == -1) { close(); return false; } + return port_open = true; + } + + void close() { + if(port != -1) { + tcdrain(port); + if(port_open == true) { + tcsetattr(port, TCSANOW, &original_attr); + port_open = false; + } + ::close(port); + port = -1; + } + } + + serial() { + port = -1; + port_open = false; + } + + ~serial() { + close(); + } + + private: + int port; + bool port_open; + termios original_attr; + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/serializer.hpp b/Mednafen/mednafen/snes/src/lib/nall/serializer.hpp new file mode 100755 index 0000000000..cd9f34094e --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/serializer.hpp @@ -0,0 +1,126 @@ +#ifndef NALL_SERIALIZER_HPP +#define NALL_SERIALIZER_HPP + +#include +#include +#include + +namespace nall_v059 { + + //serializer: a class designed to save and restore the state of classes. + // + //benefits: + //- data() will be portable in size (it is not necessary to specify type sizes.) + //- data() will be portable in endianness (always stored internally as little-endian.) + //- one serialize function can both save and restore class states. + // + //caveats: + //- only plain-old-data can be stored. complex classes must provide serialize(serializer&); + //- floating-point usage is not portable across platforms + + class serializer { + public: + enum mode_t { Load, Save, Size }; + + mode_t mode() const { + return imode; + } + + const uint8_t* data() const { + return idata; + } + + unsigned size() const { + return isize; + } + + unsigned capacity() const { + return icapacity; + } + + template void floatingpoint(T &value) { + enum { size = sizeof(T) }; + //this is rather dangerous, and not cross-platform safe; + //but there is no standardized way to export FP-values + uint8_t *p = (uint8_t*)&value; + if(imode == Save) { + for(unsigned n = 0; n < size; n++) idata[isize++] = p[n]; + } else if(imode == Load) { + for(unsigned n = 0; n < size; n++) p[n] = idata[isize++]; + } else { + isize += size; + } + } + + template void integer(T &value) { + enum { size = is_bool::value ? 1 : sizeof(T) }; + if(imode == Save) { + for(unsigned n = 0; n < size; n++) idata[isize++] = (uint64_t)value >> (n << 3); + } else if(imode == Load) { + value = 0; + for(unsigned n = 0; n < size; n++) value |= (uint64_t)idata[isize++] << (n << 3); + } else if(imode == Size) { + isize += size; + } + } + + template void array(T &array) { + enum { size = sizeof(T) / sizeof(typename remove_extent::type) }; + for(unsigned n = 0; n < size; n++) integer(array[n]); + } + + template void array(T array, unsigned size) { + for(unsigned n = 0; n < size; n++) integer(array[n]); + } + + serializer& operator=(const serializer &s) { + if(idata) delete[] idata; + + imode = s.imode; + idata = new uint8_t[s.icapacity]; + isize = s.isize; + icapacity = s.icapacity; + + memcpy(idata, s.idata, s.icapacity); + return *this; + } + + serializer(const serializer &s) : idata(0) { + operator=(s); + } + + serializer() { + imode = Size; + idata = 0; + isize = 0; + } + + serializer(unsigned capacity) { + imode = Save; + idata = new uint8_t[capacity](); + isize = 0; + icapacity = capacity; + } + + serializer(const uint8_t *data, unsigned capacity) { + imode = Load; + idata = new uint8_t[capacity]; + isize = 0; + icapacity = capacity; + memcpy(idata, data, capacity); + } + + ~serializer() { + if(idata) delete[] idata; + } + + private: + mode_t imode; + uint8_t *idata; + unsigned isize; + unsigned icapacity; + }; + +}; + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/static.hpp b/Mednafen/mednafen/snes/src/lib/nall/static.hpp new file mode 100755 index 0000000000..f954e803f7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/static.hpp @@ -0,0 +1,17 @@ +#ifndef NALL_STATIC_HPP +#define NALL_STATIC_HPP + +namespace nall_v059 { + template struct nall_static_assert; + template<> struct nall_static_assert {}; + + template struct static_if { + typedef true_type type; + }; + + template struct static_if { + typedef false_type type; + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/stdint.hpp b/Mednafen/mednafen/snes/src/lib/nall/stdint.hpp new file mode 100755 index 0000000000..872aff7ad6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/stdint.hpp @@ -0,0 +1,44 @@ +#ifndef NALL_STDINT_HPP +#define NALL_STDINT_HPP + +#include + +#if defined(_MSC_VER) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef signed long long int64_t; + typedef int64_t intmax_t; + #if defined(_WIN64) + typedef int64_t intptr_t; + #else + typedef int32_t intptr_t; + #endif + + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + typedef unsigned long long uint64_t; + typedef uint64_t uintmax_t; + #if defined(_WIN64) + typedef uint64_t uintptr_t; + #else + typedef uint32_t uintptr_t; + #endif +#else + #include +#endif + +namespace nall_v059 { + static nall_static_assert int8_t_assert; + static nall_static_assert int16_t_assert; + static nall_static_assert int32_t_assert; + static nall_static_assert int64_t_assert; + + static nall_static_assert uint8_t_assert; + static nall_static_assert uint16_t_assert; + static nall_static_assert uint32_t_assert; + static nall_static_assert uint64_t_assert; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/traits.hpp b/Mednafen/mednafen/snes/src/lib/nall/traits.hpp new file mode 100755 index 0000000000..e0d02409ce --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/traits.hpp @@ -0,0 +1,97 @@ +#ifndef NALL_TRAITS_HPP +#define NALL_TRAITS_HPP + +namespace nall_v059 { + //== + //is + //== + + template struct is_integral { enum { value = false }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + template<> struct is_integral { enum { value = true }; }; + + template struct is_floating_point { enum { value = false }; }; + template<> struct is_floating_point { enum { value = true }; }; + template<> struct is_floating_point { enum { value = true }; }; + template<> struct is_floating_point { enum { value = true }; }; + + template struct is_bool { enum { value = false }; }; + template<> struct is_bool { enum { value = true }; }; + + template struct is_void { enum { value = false }; }; + template<> struct is_void { enum { value = true }; }; + + template struct is_arithmetic { + enum { value = is_integral::value || is_floating_point::value }; + }; + + template struct is_fundamental { + enum { value = is_integral::value || is_floating_point::value || is_void::value }; + }; + + template struct is_compound { + enum { value = !is_fundamental::value }; + }; + + template struct is_array { enum { value = false }; }; + template struct is_array { enum { value = true }; }; + template struct is_array { enum { value = true }; }; + + template struct is_const { enum { value = false }; }; + template struct is_const { enum { value = true }; }; + template struct is_const { enum { value = true }; }; + + template struct is_pointer { enum { value = false }; }; + template struct is_pointer { enum { value = true }; }; + + template struct is_reference { enum { value = false }; }; + template struct is_reference { enum { value = true }; }; + + template struct is_same { enum { value = false }; }; + template struct is_same { enum { value = true }; }; + + //=== + //add + //=== + + template struct add_const { typedef const T type; }; + template struct add_const { typedef const T type; }; + template struct add_const { typedef const T& type; }; + + template struct add_pointer { typedef T* type; }; + template struct add_pointer { typedef T** type; }; + + template struct add_reference { typedef T& type; }; + template struct add_reference { typedef T& type; }; + + //====== + //remove + //====== + + template struct remove_const { typedef T type; }; + template struct remove_const { typedef T type; }; + template struct remove_const { typedef T type; }; + + template struct remove_extent { typedef T type; }; + template struct remove_extent { typedef T type; }; + template struct remove_extent { typedef T type; }; + + template struct remove_pointer { typedef T type; }; + template struct remove_pointer { typedef T type; }; + + template struct remove_reference { typedef T type; }; + template struct remove_reference { typedef T type; }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/utility.hpp b/Mednafen/mednafen/snes/src/lib/nall/utility.hpp new file mode 100755 index 0000000000..031288f545 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/utility.hpp @@ -0,0 +1,36 @@ +#ifndef NALL_UTILITY_HPP +#define NALL_UTILITY_HPP + +namespace nall_v059 { + template + inline void swap(T &x, T &y) { + T temp(x); + x = y; + y = temp; + } + + template + struct base_from_member { + T value; + base_from_member(T value_) : value(value_) {} + }; + + class noncopyable { + protected: + noncopyable() {} + ~noncopyable() {} + + private: + noncopyable(const noncopyable&); + const noncopyable& operator=(const noncopyable&); + }; + + template + inline T* allocate(size_t size, const T &value) { + T *array = new T[size]; + for(size_t i = 0; i < size; i++) array[i] = value; + return array; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/varint.hpp b/Mednafen/mednafen/snes/src/lib/nall/varint.hpp new file mode 100755 index 0000000000..3482e48d86 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/varint.hpp @@ -0,0 +1,92 @@ +#ifndef NALL_VARINT_HPP +#define NALL_VARINT_HPP + +#include +#include +#include + +namespace nall_v059 { + template class uint_t { + private: + enum { bytes = (bits + 7) >> 3 }; //minimum number of bytes needed to store value + typedef typename static_if< + sizeof(int) >= bytes, + unsigned int, + typename static_if< + sizeof(long) >= bytes, + unsigned long, + typename static_if< + sizeof(long long) >= bytes, + unsigned long long, + void + >::type + >::type + >::type T; + nall_static_assert::value> uint_assert; + T data; + + public: + inline operator T() const { return data; } + inline T operator ++(int) { T r = data; data = uclip(data + 1); return r; } + inline T operator --(int) { T r = data; data = uclip(data - 1); return r; } + inline T operator ++() { return data = uclip(data + 1); } + inline T operator --() { return data = uclip(data - 1); } + inline T operator =(const T i) { return data = uclip(i); } + inline T operator |=(const T i) { return data = uclip(data | i); } + inline T operator ^=(const T i) { return data = uclip(data ^ i); } + inline T operator &=(const T i) { return data = uclip(data & i); } + inline T operator<<=(const T i) { return data = uclip(data << i); } + inline T operator>>=(const T i) { return data = uclip(data >> i); } + inline T operator +=(const T i) { return data = uclip(data + i); } + inline T operator -=(const T i) { return data = uclip(data - i); } + inline T operator *=(const T i) { return data = uclip(data * i); } + inline T operator /=(const T i) { return data = uclip(data / i); } + inline T operator %=(const T i) { return data = uclip(data % i); } + + inline uint_t() : data(0) {} + inline uint_t(const T i) : data(uclip(i)) {} + }; + + template class int_t { + private: + enum { bytes = (bits + 7) >> 3 }; //minimum number of bytes needed to store value + typedef typename static_if< + sizeof(int) >= bytes, + signed int, + typename static_if< + sizeof(long) >= bytes, + signed long, + typename static_if< + sizeof(long long) >= bytes, + signed long long, + void + >::type + >::type + >::type T; + nall_static_assert::value> int_assert; + T data; + + public: + inline operator T() const { return data; } + inline T operator ++(int) { T r = data; data = sclip(data + 1); return r; } + inline T operator --(int) { T r = data; data = sclip(data - 1); return r; } + inline T operator ++() { return data = sclip(data + 1); } + inline T operator --() { return data = sclip(data - 1); } + inline T operator =(const T i) { return data = sclip(i); } + inline T operator |=(const T i) { return data = sclip(data | i); } + inline T operator ^=(const T i) { return data = sclip(data ^ i); } + inline T operator &=(const T i) { return data = sclip(data & i); } + inline T operator<<=(const T i) { return data = sclip(data << i); } + inline T operator>>=(const T i) { return data = sclip(data >> i); } + inline T operator +=(const T i) { return data = sclip(data + i); } + inline T operator -=(const T i) { return data = sclip(data - i); } + inline T operator *=(const T i) { return data = sclip(data * i); } + inline T operator /=(const T i) { return data = sclip(data / i); } + inline T operator %=(const T i) { return data = sclip(data % i); } + + inline int_t() : data(0) {} + inline int_t(const T i) : data(sclip(i)) {} + }; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/lib/nall/vector.hpp b/Mednafen/mednafen/snes/src/lib/nall/vector.hpp new file mode 100755 index 0000000000..184c06d5f4 --- /dev/null +++ b/Mednafen/mednafen/snes/src/lib/nall/vector.hpp @@ -0,0 +1,162 @@ +#ifndef NALL_VECTOR_HPP +#define NALL_VECTOR_HPP + +#include +#include +#include +#include + +namespace nall_v059 { + //linear_vector + //memory: O(capacity * 2) + // + //linear_vector uses placement new + manual destructor calls to create a + //contiguous block of memory for all objects. accessing individual elements + //is fast, though resizing the array incurs significant overhead. + //reserve() overhead is reduced from quadratic time to amortized constant time + //by resizing twice as much as requested. + // + //if objects hold memory address references to themselves (introspection), a + //valid copy constructor will be needed to keep pointers valid. + + template class linear_vector : noncopyable { + protected: + T *pool; + unsigned poolsize, objectsize; + + public: + unsigned size() const { return objectsize; } + unsigned capacity() const { return poolsize; } + + void reset() { + if(pool) { + for(unsigned i = 0; i < objectsize; i++) pool[i].~T(); + free(pool); + } + pool = 0; + poolsize = 0; + objectsize = 0; + } + + void reserve(unsigned newsize) { + newsize = bit::round(newsize); //round to nearest power of two (for amortized growth) + + T *poolcopy = (T*)malloc(newsize * sizeof(T)); + for(unsigned i = 0; i < min(objectsize, newsize); i++) new(poolcopy + i) T(pool[i]); + for(unsigned i = 0; i < objectsize; i++) pool[i].~T(); + free(pool); + pool = poolcopy; + poolsize = newsize; + objectsize = min(objectsize, newsize); + } + + void resize(unsigned newsize) { + if(newsize > poolsize) reserve(newsize); + + if(newsize < objectsize) { + //vector is shrinking; destroy excess objects + for(unsigned i = newsize; i < objectsize; i++) pool[i].~T(); + } else if(newsize > objectsize) { + //vector is expanding; allocate new objects + for(unsigned i = objectsize; i < newsize; i++) new(pool + i) T; + } + + objectsize = newsize; + } + + void add(const T data) { + if(objectsize + 1 > poolsize) reserve(objectsize + 1); + new(pool + objectsize++) T(data); + } + + inline T& operator[](unsigned index) { + if(index >= objectsize) resize(index + 1); + return pool[index]; + } + + inline const T& operator[](unsigned index) const { + if(index >= objectsize) throw "vector[] out of bounds"; + return pool[index]; + } + + linear_vector() : pool(0), poolsize(0), objectsize(0) {} + ~linear_vector() { reset(); } + }; + + //pointer_vector + //memory: O(1) + // + //pointer_vector keeps an array of pointers to each vector object. this adds + //significant overhead to individual accesses, but allows for optimal memory + //utilization. + // + //by guaranteeing that the base memory address of each objects never changes, + //this avoids the need for an object to have a valid copy constructor. + + template class pointer_vector : noncopyable { + protected: + T **pool; + unsigned poolsize, objectsize; + + public: + unsigned size() const { return objectsize; } + unsigned capacity() const { return poolsize; } + + void reset() { + if(pool) { + for(unsigned i = 0; i < objectsize; i++) { if(pool[i]) delete pool[i]; } + free(pool); + } + pool = 0; + poolsize = 0; + objectsize = 0; + } + + void reserve(unsigned newsize) { + newsize = bit::round(newsize); //round to nearest power of two (for amortized growth) + + for(unsigned i = newsize; i < objectsize; i++) { + if(pool[i]) { delete pool[i]; pool[i] = 0; } + } + + pool = (T**)realloc(pool, newsize * sizeof(T*)); + for(unsigned i = poolsize; i < newsize; i++) pool[i] = 0; + poolsize = newsize; + objectsize = min(objectsize, newsize); + } + + void resize(unsigned newsize) { + if(newsize > poolsize) reserve(newsize); + + for(unsigned i = newsize; i < objectsize; i++) { + if(pool[i]) { delete pool[i]; pool[i] = 0; } + } + + objectsize = newsize; + } + + void add(const T data) { + if(objectsize + 1 > poolsize) reserve(objectsize + 1); + pool[objectsize++] = new T(data); + } + + inline T& operator[](unsigned index) { + if(index >= objectsize) resize(index + 1); + if(!pool[index]) pool[index] = new T; + return *pool[index]; + } + + inline const T& operator[](unsigned index) const { + if(index >= objectsize || !pool[index]) throw "vector[] out of bounds"; + return *pool[index]; + } + + pointer_vector() : pool(0), poolsize(0), objectsize(0) {} + ~pointer_vector() { reset(); } + }; + + //default vector type + template class vector : public linear_vector {}; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/memory/memory-inline.hpp b/Mednafen/mednafen/snes/src/memory/memory-inline.hpp new file mode 100755 index 0000000000..be0dfafc41 --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/memory-inline.hpp @@ -0,0 +1,72 @@ +//Memory + +unsigned Memory::size() const { return 0; } + +//StaticRAM + +uint8* StaticRAM::data() { return data_; } +unsigned StaticRAM::size() const { return size_; } + +uint8 StaticRAM::read(unsigned addr) { return data_[addr]; } +void StaticRAM::write(unsigned addr, uint8 n) { data_[addr] = n; } +uint8& StaticRAM::operator[](unsigned addr) { return data_[addr]; } +const uint8& StaticRAM::operator[](unsigned addr) const { return data_[addr]; } + +StaticRAM::StaticRAM(unsigned n) : size_(n) { data_ = new uint8[size_]; } +StaticRAM::~StaticRAM() { delete[] data_; } + +//MappedRAM + +void MappedRAM::reset() { + if(data_) { + delete[] data_; + data_ = 0; + } + size_ = -1U; + write_protect_ = false; +} + +void MappedRAM::map(uint8 *source, unsigned length) { + reset(); + data_ = source; + size_ = data_ && length > 0 ? length : -1U; +} + +void MappedRAM::copy(uint8 *data, unsigned size) { + if(!data_) { + size_ = (size & ~255) + ((bool)(size & 255) << 8); + data_ = new uint8[size_](); + } + memcpy(data_, data, min(size_, size)); +} + +void MappedRAM::write_protect(bool status) { write_protect_ = status; } +uint8* MappedRAM::data() { return data_; } +unsigned MappedRAM::size() const { return size_; } + +uint8 MappedRAM::read(unsigned addr) { return data_[addr]; } +void MappedRAM::write(unsigned addr, uint8 n) { if(!write_protect_) data_[addr] = n; } +uint8 MappedRAM::operator[](unsigned addr) const { return data_[addr]; } +MappedRAM::MappedRAM() : data_(0), size_(-1U), write_protect_(false) {} + +//Bus + +uint8 Bus::read(unsigned addr) +{ + Page &p = page[addr >> 8]; + + assert(p.access != NULL); + + return p.access->read(p.offset + addr); +} + +void Bus::write(unsigned addr, uint8 data) { + Page &p = page[addr >> 8]; + return p.access->write(p.offset + addr, data); +} + +bool Bus::load_cart() { return false; } +void Bus::unload_cart() {} + +void Bus::power() {} +void Bus::reset() {} diff --git a/Mednafen/mednafen/snes/src/memory/memory.cpp b/Mednafen/mednafen/snes/src/memory/memory.cpp new file mode 100755 index 0000000000..16965ead7a --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/memory.cpp @@ -0,0 +1,112 @@ +#include <../base.hpp> + +#define MEMORY_CPP +namespace bSNES_v059 { + +namespace memory { + MMIOAccess mmio; + StaticRAM wram(128 * 1024); + StaticRAM apuram(64 * 1024); + StaticRAM vram(64 * 1024); + StaticRAM oam(544); + StaticRAM cgram(512); + + UnmappedMemory memory_unmapped; + UnmappedMMIO mmio_unmapped; +}; + +unsigned UnmappedMemory::size() const { return 16 * 1024 * 1024; } +uint8 UnmappedMemory::read(unsigned) { return cpu.regs.mdr; } +void UnmappedMemory::write(unsigned, uint8) {} + +uint8 UnmappedMMIO::mmio_read(unsigned) { return cpu.regs.mdr; } +void UnmappedMMIO::mmio_write(unsigned, uint8) {} + +void MMIOAccess::map(unsigned addr, MMIO &access) { + //MMIO: $[00-3f]:[2000-5fff] + mmio[(addr - 0x2000) & 0x3fff] = &access; +} + +uint8 MMIOAccess::read(unsigned addr) { + return mmio[(addr - 0x2000) & 0x3fff]->mmio_read(addr); +} + +void MMIOAccess::write(unsigned addr, uint8 data) { + mmio[(addr - 0x2000) & 0x3fff]->mmio_write(addr, data); +} + +unsigned Bus::mirror(unsigned addr, unsigned size) { + unsigned base = 0; + if(size) { + unsigned mask = 1 << 23; + while(addr >= size) { + while(!(addr & mask)) mask >>= 1; + addr -= mask; + if(size > mask) { + size -= mask; + base += mask; + } + mask >>= 1; + } + base += addr; + } + return base; +} + +void Bus::map(unsigned addr, Memory &access, unsigned offset) { + page[addr >> 8].access = &access; + page[addr >> 8].offset = offset - addr; +} + +void Bus::map( + MapMode mode, + uint8 bank_lo, uint8 bank_hi, + uint16 addr_lo, uint16 addr_hi, + Memory &access, unsigned offset, unsigned size +) { + assert(bank_lo <= bank_hi); + assert(addr_lo <= addr_hi); + if(access.size() == -1U) return; + + uint8 page_lo = addr_lo >> 8; + uint8 page_hi = addr_hi >> 8; + unsigned index = 0; + + switch(mode) { + case MapDirect: { + for(unsigned bank = bank_lo; bank <= bank_hi; bank++) { + for(unsigned page = page_lo; page <= page_hi; page++) { + map((bank << 16) + (page << 8), access, (bank << 16) + (page << 8)); + } + } + } break; + + case MapLinear: { + for(unsigned bank = bank_lo; bank <= bank_hi; bank++) { + for(unsigned page = page_lo; page <= page_hi; page++) { + map((bank << 16) + (page << 8), access, mirror(offset + index, access.size())); + index += 256; + if(size) index %= size; + } + } + } break; + + case MapShadow: { + for(unsigned bank = bank_lo; bank <= bank_hi; bank++) { + index += page_lo * 256; + if(size) index %= size; + + for(unsigned page = page_lo; page <= page_hi; page++) { + map((bank << 16) + (page << 8), access, mirror(offset + index, access.size())); + index += 256; + if(size) index %= size; + } + + index += (255 - page_hi) * 256; + if(size) index %= size; + } + } break; + } +} + +}; diff --git a/Mednafen/mednafen/snes/src/memory/memory.hpp b/Mednafen/mednafen/snes/src/memory/memory.hpp new file mode 100755 index 0000000000..1a13fa5c57 --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/memory.hpp @@ -0,0 +1,104 @@ +struct Memory { + virtual inline unsigned size() const; + virtual uint8 read(unsigned addr) = 0; + virtual void write(unsigned addr, uint8 data) = 0; +}; + +struct MMIO { + virtual uint8 mmio_read(unsigned addr) = 0; + virtual void mmio_write(unsigned addr, uint8 data) = 0; +}; + +struct UnmappedMemory : Memory { + unsigned size() const; + uint8 read(unsigned); + void write(unsigned, uint8); +}; + +struct UnmappedMMIO : MMIO { + uint8 mmio_read(unsigned); + void mmio_write(unsigned, uint8); +}; + +struct StaticRAM : Memory { + inline uint8* data(); + inline unsigned size() const; + + inline uint8 read(unsigned addr); + inline void write(unsigned addr, uint8 n); + inline uint8& operator[](unsigned addr); + inline const uint8& operator[](unsigned addr) const; + + inline StaticRAM(unsigned size); + inline ~StaticRAM(); + +private: + uint8 *data_; + unsigned size_; +}; + +struct MappedRAM : Memory { + inline void reset(); + inline void map(uint8*, unsigned); + inline void copy(uint8*, unsigned); + + inline void write_protect(bool status); + inline uint8* data(); + inline unsigned size() const; + + inline uint8 read(unsigned addr); + inline void write(unsigned addr, uint8 n); + inline uint8 operator[](unsigned addr) const; + inline MappedRAM(); + +private: + uint8 *data_; + unsigned size_; + bool write_protect_; +}; + +struct MMIOAccess : Memory { + void map(unsigned addr, MMIO &access); + uint8 read(unsigned addr); + void write(unsigned addr, uint8 data); + + MMIO *mmio[0x4000]; +}; + +struct Bus { + unsigned mirror(unsigned addr, unsigned size); + void map(unsigned addr, Memory &access, unsigned offset); + enum MapMode { MapDirect, MapLinear, MapShadow }; + void map(MapMode mode, + uint8 bank_lo, uint8 bank_hi, + uint16 addr_lo, uint16 addr_hi, + Memory &access, unsigned offset = 0, unsigned size = 0); + + alwaysinline uint8 read(unsigned addr); + alwaysinline void write(unsigned addr, uint8 data); + + virtual inline bool load_cart(); + virtual inline void unload_cart(); + + virtual inline void power(); + virtual inline void reset(); + + struct Page { + Memory *access; + unsigned offset; + } page[65536]; + + virtual void serialize(serializer&) {} +}; + +namespace memory { + extern MMIOAccess mmio; //S-CPU, S-PPU + extern StaticRAM wram; //S-CPU + extern StaticRAM apuram; //S-SMP, S-DSP + extern StaticRAM vram; //S-PPU + extern StaticRAM oam; //S-PPU + extern StaticRAM cgram; //S-PPU + + extern UnmappedMemory memory_unmapped; + extern UnmappedMMIO mmio_unmapped; +}; diff --git a/Mednafen/mednafen/snes/src/memory/smemory/generic.cpp b/Mednafen/mednafen/snes/src/memory/smemory/generic.cpp new file mode 100755 index 0000000000..92c4588303 --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/smemory/generic.cpp @@ -0,0 +1,112 @@ +#ifdef SMEMORY_CPP + +void sBus::map_generic() { + switch(cartridge.mapper()) { + case Cartridge::LoROM: { + map(MapLinear, 0x00, 0x7f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x80, 0xff, 0x8000, 0xffff, memory::cartrom); + map_generic_sram(); + } break; + + case Cartridge::HiROM: { + map(MapShadow, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom); + map(MapShadow, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); + map_generic_sram(); + } break; + + case Cartridge::ExLoROM: { + map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom); + map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom); + map_generic_sram(); + } break; + + case Cartridge::ExHiROM: { + map(MapShadow, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x400000); + map(MapLinear, 0x40, 0x7f, 0x0000, 0xffff, memory::cartrom, 0x400000); + map(MapShadow, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x000000); + map(MapLinear, 0xc0, 0xff, 0x0000, 0xffff, memory::cartrom, 0x000000); + map_generic_sram(); + } break; + + case Cartridge::SuperFXROM: { + //mapped via SuperFXBus::init(); + } break; + + case Cartridge::SA1ROM: { + //mapped via SA1Bus::init(); + } break; + + case Cartridge::SPC7110ROM: { + map(MapDirect, 0x00, 0x00, 0x6000, 0x7fff, spc7110); //save RAM w/custom logic + map(MapShadow, 0x00, 0x0f, 0x8000, 0xffff, memory::cartrom); //program ROM + map(MapDirect, 0x30, 0x30, 0x6000, 0x7fff, spc7110); //save RAM w/custom logic + map(MapDirect, 0x50, 0x50, 0x0000, 0xffff, spc7110); //decompression MMIO port + map(MapShadow, 0x80, 0x8f, 0x8000, 0xffff, memory::cartrom); //program ROM + map(MapLinear, 0xc0, 0xcf, 0x0000, 0xffff, memory::cartrom); //program ROM + map(MapDirect, 0xd0, 0xff, 0x0000, 0xffff, spc7110); //MMC-controlled data ROM + } break; + + case Cartridge::BSXROM: { + //full map is dynamically mapped by: + //src/chip/bsx/bsx_cart.cpp : BSXCart::update_memory_map(); + map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::cartrom); + } break; + + case Cartridge::BSCLoROM: { + map(MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom, 0x000000); + map(MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::cartrom, 0x100000); + map(MapLinear, 0x70, 0x7f, 0x0000, 0x7fff, memory::cartram, 0x000000); + map(MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom, 0x200000); + map(MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, memory::cartrom, 0x100000); + map(MapLinear, 0xc0, 0xef, 0x0000, 0xffff, bsxflash); + map(MapLinear, 0xf0, 0xff, 0x0000, 0x7fff, memory::cartram, 0x000000); + } break; + + case Cartridge::BSCHiROM: { + map(MapShadow, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x20, 0x3f, 0x6000, 0x7fff, memory::cartram); + map(MapShadow, 0x20, 0x3f, 0x8000, 0xffff, bsxflash); + map(MapLinear, 0x40, 0x5f, 0x0000, 0xffff, memory::cartrom); + map(MapLinear, 0x60, 0x7f, 0x0000, 0xffff, bsxflash); + map(MapShadow, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xa0, 0xbf, 0x6000, 0x7fff, memory::cartram); + map(MapShadow, 0xa0, 0xbf, 0x8000, 0xffff, bsxflash); + map(MapLinear, 0xc0, 0xdf, 0x0000, 0xffff, memory::cartrom); + map(MapLinear, 0xe0, 0xff, 0x0000, 0xffff, bsxflash); + } break; + + case Cartridge::STROM: { + map(MapLinear, 0x00, 0x1f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0x20, 0x3f, 0x8000, 0xffff, memory::stArom); + map(MapLinear, 0x40, 0x5f, 0x8000, 0xffff, memory::stBrom); + map(MapLinear, 0x60, 0x63, 0x8000, 0xffff, memory::stAram); + map(MapLinear, 0x70, 0x73, 0x8000, 0xffff, memory::stBram); + map(MapLinear, 0x80, 0x9f, 0x8000, 0xffff, memory::cartrom); + map(MapLinear, 0xa0, 0xbf, 0x8000, 0xffff, memory::stArom); + map(MapLinear, 0xc0, 0xdf, 0x8000, 0xffff, memory::stBrom); + map(MapLinear, 0xe0, 0xe3, 0x8000, 0xffff, memory::stAram); + map(MapLinear, 0xf0, 0xf3, 0x8000, 0xffff, memory::stBram); + } break; + } +} + +void sBus::map_generic_sram() { + if(memory::cartram.size() == 0 || memory::cartram.size() == -1U) { return; } + + map(MapLinear, 0x20, 0x3f, 0x6000, 0x7fff, memory::cartram); + map(MapLinear, 0xa0, 0xbf, 0x6000, 0x7fff, memory::cartram); + + //research shows only games with very large ROM/RAM sizes require MAD-1 memory mapping of RAM + //otherwise, default to safer, larger RAM address window + uint16 addr_hi = (memory::cartrom.size() > 0x200000 || memory::cartram.size() > 32 * 1024) ? 0x7fff : 0xffff; + map(MapLinear, 0x70, 0x7f, 0x0000, addr_hi, memory::cartram); + if(cartridge.mapper() != Cartridge::LoROM) return; + map(MapLinear, 0xf0, 0xff, 0x0000, addr_hi, memory::cartram); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/memory/smemory/serialization.cpp b/Mednafen/mednafen/snes/src/memory/smemory/serialization.cpp new file mode 100755 index 0000000000..0c0ff6aaf8 --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/smemory/serialization.cpp @@ -0,0 +1,11 @@ +#ifdef SMEMORY_CPP + +void sBus::serialize(serializer &s) { + s.array(memory::wram.data(), memory::wram.size()); + s.array(memory::apuram.data(), memory::apuram.size()); + s.array(memory::vram.data(), memory::vram.size()); + s.array(memory::oam.data(), memory::oam.size()); + s.array(memory::cgram.data(), memory::cgram.size()); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/memory/smemory/smemory.cpp b/Mednafen/mednafen/snes/src/memory/smemory/smemory.cpp new file mode 100755 index 0000000000..765c76df88 --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/smemory/smemory.cpp @@ -0,0 +1,38 @@ +#include <../base.hpp> + +#define SMEMORY_CPP +namespace bSNES_v059 { + +sBus bus; + +#include "system.cpp" +#include "generic.cpp" +#include "serialization.cpp" + +void sBus::power() { + for(unsigned i = 0x2000; i <= 0x5fff; i++) memory::mmio.map(i, memory::mmio_unmapped); + for(unsigned i = 0; i < memory::wram.size(); i++) memory::wram[i] = config.cpu.wram_init_value; +} + +void sBus::reset() { +} + +bool sBus::load_cart() { + if(cartridge.loaded() == true) return false; + + map_reset(); + map_generic(); + map_system(); + return true; +} + +void sBus::unload_cart() { +} + +sBus::sBus() { +} + +sBus::~sBus() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/memory/smemory/smemory.hpp b/Mednafen/mednafen/snes/src/memory/smemory/smemory.hpp new file mode 100755 index 0000000000..f7fd3fea0f --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/smemory/smemory.hpp @@ -0,0 +1,35 @@ +class sBus : public Bus { +public: + bool load_cart(); + void unload_cart(); + + void power(); + void reset(); + + inline uint8 read(unsigned addr) + { + uint8 r; + + r = Bus::read(addr); + + #if defined(CHEAT_SYSTEM) + if(cheat.active() && cheat.exists(addr)) { + cheat.read(addr, r); + } + #endif + + return r; + } + + void serialize(serializer&); + sBus(); + ~sBus(); + +private: + void map_reset(); + void map_system(); + void map_generic(); + void map_generic_sram(); +}; + +extern sBus bus; diff --git a/Mednafen/mednafen/snes/src/memory/smemory/system.cpp b/Mednafen/mednafen/snes/src/memory/smemory/system.cpp new file mode 100755 index 0000000000..1612b9feb2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/memory/smemory/system.cpp @@ -0,0 +1,18 @@ +#ifdef SMEMORY_CPP + +void sBus::map_reset() { + map(MapDirect, 0x00, 0xff, 0x0000, 0xffff, memory::memory_unmapped); + for(unsigned i = 0x2000; i <= 0x5fff; i++) memory::mmio.map(i, memory::mmio_unmapped); +} + +void sBus::map_system() { + map(MapDirect, 0x00, 0x3f, 0x2000, 0x5fff, memory::mmio); + map(MapDirect, 0x80, 0xbf, 0x2000, 0x5fff, memory::mmio); + + map(MapLinear, 0x00, 0x3f, 0x0000, 0x1fff, memory::wram, 0x000000, 0x002000); + map(MapLinear, 0x80, 0xbf, 0x0000, 0x1fff, memory::wram, 0x000000, 0x002000); + + map(MapLinear, 0x7e, 0x7f, 0x0000, 0xffff, memory::wram); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/debugger/debugger.cpp b/Mednafen/mednafen/snes/src/ppu/debugger/debugger.cpp new file mode 100755 index 0000000000..67e0f340ee --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/debugger/debugger.cpp @@ -0,0 +1,290 @@ +#ifdef PPU_CPP + +#include "render.cpp" + +uint8 PPUDebugger::vram_mmio_read(uint16 addr) { + uint8 data = PPU::vram_mmio_read(addr); + debugger.breakpoint_test(Debugger::Breakpoint::VRAM, Debugger::Breakpoint::Read, addr, data); + return data; +} + +void PPUDebugger::vram_mmio_write(uint16 addr, uint8 data) { + PPU::vram_mmio_write(addr, data); + debugger.breakpoint_test(Debugger::Breakpoint::VRAM, Debugger::Breakpoint::Write, addr, data); +} + +uint8 PPUDebugger::oam_mmio_read(uint16 addr) { + uint8 data = PPU::oam_mmio_read(addr); + debugger.breakpoint_test(Debugger::Breakpoint::OAM, Debugger::Breakpoint::Read, addr, data); + return data; +} + +void PPUDebugger::oam_mmio_write(uint16 addr, uint8 data) { + PPU::oam_mmio_write(addr, data); + debugger.breakpoint_test(Debugger::Breakpoint::OAM, Debugger::Breakpoint::Write, addr, data); +} + +uint8 PPUDebugger::cgram_mmio_read(uint16 addr) { + uint8 data = PPU::cgram_mmio_read(addr); + debugger.breakpoint_test(Debugger::Breakpoint::CGRAM, Debugger::Breakpoint::Read, addr, data); + return data; +} + +void PPUDebugger::cgram_mmio_write(uint16 addr, uint8 data) { + PPU::cgram_mmio_write(addr, data); + debugger.breakpoint_test(Debugger::Breakpoint::CGRAM, Debugger::Breakpoint::Write, addr, data); +} + +PPUDebugger::PPUDebugger() { + bg1_enabled[0] = bg1_enabled[1] = true; + bg2_enabled[0] = bg2_enabled[1] = true; + bg3_enabled[0] = bg3_enabled[1] = true; + bg4_enabled[0] = bg4_enabled[1] = true; + oam_enabled[0] = oam_enabled[1] = oam_enabled[2] = oam_enabled[3] = true; +} + +//=========== +//PPUDebugger +//=========== + +//internal +unsigned PPUDebugger::ppu1_mdr() { return regs.ppu1_mdr; } +unsigned PPUDebugger::ppu2_mdr() { return regs.ppu2_mdr; } + +//$2100 +bool PPUDebugger::display_disable() { return regs.display_disabled; } +unsigned PPUDebugger::display_brightness() { return regs.display_brightness; } + +//$2101 +unsigned PPUDebugger::oam_base_size() { return regs.oam_basesize; } +unsigned PPUDebugger::oam_name_select() { return regs.oam_nameselect; } +unsigned PPUDebugger::oam_name_base_address() { return regs.oam_tdaddr; } + +//$2102-$2103 +unsigned PPUDebugger::oam_base_address() { return regs.oam_baseaddr; } +bool PPUDebugger::oam_priority() { return regs.oam_priority; } + +//$2105 +bool PPUDebugger::bg1_tile_size() { return regs.bg_tilesize[BG1]; } +bool PPUDebugger::bg2_tile_size() { return regs.bg_tilesize[BG2]; } +bool PPUDebugger::bg3_tile_size() { return regs.bg_tilesize[BG3]; } +bool PPUDebugger::bg4_tile_size() { return regs.bg_tilesize[BG4]; } +bool PPUDebugger::bg3_priority() { return regs.bg3_priority; } +unsigned PPUDebugger::bg_mode() { return regs.bg_mode; } + +//$2106 +unsigned PPUDebugger::mosaic_size() { return regs.mosaic_size; } +bool PPUDebugger::bg1_mosaic_enable() { return regs.mosaic_enabled[BG1]; } +bool PPUDebugger::bg2_mosaic_enable() { return regs.mosaic_enabled[BG2]; } +bool PPUDebugger::bg3_mosaic_enable() { return regs.mosaic_enabled[BG3]; } +bool PPUDebugger::bg4_mosaic_enable() { return regs.mosaic_enabled[BG4]; } + +//$2107 +unsigned PPUDebugger::bg1_screen_address() { return regs.bg_scaddr[BG1]; } +unsigned PPUDebugger::bg1_screen_size() { return regs.bg_scsize[BG1]; } + +//$2108 +unsigned PPUDebugger::bg2_screen_address() { return regs.bg_scaddr[BG2]; } +unsigned PPUDebugger::bg2_screen_size() { return regs.bg_scsize[BG2]; } + +//$2109 +unsigned PPUDebugger::bg3_screen_address() { return regs.bg_scaddr[BG3]; } +unsigned PPUDebugger::bg3_screen_size() { return regs.bg_scsize[BG3]; } + +//$210a +unsigned PPUDebugger::bg4_screen_address() { return regs.bg_scaddr[BG4]; } +unsigned PPUDebugger::bg4_screen_size() { return regs.bg_scsize[BG4]; } + +//$210b +unsigned PPUDebugger::bg1_name_base_address() { return regs.bg_tdaddr[BG1]; } +unsigned PPUDebugger::bg2_name_base_address() { return regs.bg_tdaddr[BG2]; } + +//$210c +unsigned PPUDebugger::bg3_name_base_address() { return regs.bg_tdaddr[BG3]; } +unsigned PPUDebugger::bg4_name_base_address() { return regs.bg_tdaddr[BG4]; } + +//$210d +unsigned PPUDebugger::mode7_hoffset() { return regs.m7_hofs & 0x1fff; } +unsigned PPUDebugger::bg1_hoffset() { return regs.bg_hofs[BG1] & 0x03ff; } + +//$210e +unsigned PPUDebugger::mode7_voffset() { return regs.m7_vofs & 0x1fff; } +unsigned PPUDebugger::bg1_voffset() { return regs.bg_vofs[BG1] & 0x03ff; } + +//$210f +unsigned PPUDebugger::bg2_hoffset() { return regs.bg_hofs[BG2] & 0x03ff; } + +//$2110 +unsigned PPUDebugger::bg2_voffset() { return regs.bg_vofs[BG2] & 0x03ff; } + +//$2111 +unsigned PPUDebugger::bg3_hoffset() { return regs.bg_hofs[BG3] & 0x03ff; } + +//$2112 +unsigned PPUDebugger::bg3_voffset() { return regs.bg_vofs[BG3] & 0x03ff; } + +//$2113 +unsigned PPUDebugger::bg4_hoffset() { return regs.bg_hofs[BG4] & 0x03ff; } + +//$2114 +unsigned PPUDebugger::bg4_voffset() { return regs.bg_vofs[BG4] & 0x03ff; } + +//$2115 +bool PPUDebugger::vram_increment_mode() { return regs.vram_incmode; } +unsigned PPUDebugger::vram_increment_formation() { return regs.vram_mapping; } +unsigned PPUDebugger::vram_increment_size() { return regs.vram_incsize; } + +//$2116-$2117 +unsigned PPUDebugger::vram_address() { return regs.vram_addr; } + +//$211a +unsigned PPUDebugger::mode7_repeat() { return regs.mode7_repeat; } +bool PPUDebugger::mode7_vflip() { return regs.mode7_vflip; } +bool PPUDebugger::mode7_hflip() { return regs.mode7_hflip; } + +//$211b +unsigned PPUDebugger::mode7_a() { return regs.m7a; } + +//$211c +unsigned PPUDebugger::mode7_b() { return regs.m7b; } + +//$211d +unsigned PPUDebugger::mode7_c() { return regs.m7c; } + +//$211e +unsigned PPUDebugger::mode7_d() { return regs.m7d; } + +//$211f +unsigned PPUDebugger::mode7_x() { return regs.m7x; } + +//$2120 +unsigned PPUDebugger::mode7_y() { return regs.m7y; } + +//$2121 +unsigned PPUDebugger::cgram_address() { return regs.cgram_addr; } + +//$2123 +bool PPUDebugger::bg1_window1_enable() { return regs.window1_enabled[BG1]; } +bool PPUDebugger::bg1_window1_invert() { return regs.window1_invert [BG1]; } +bool PPUDebugger::bg1_window2_enable() { return regs.window2_enabled[BG1]; } +bool PPUDebugger::bg1_window2_invert() { return regs.window2_invert [BG1]; } +bool PPUDebugger::bg2_window1_enable() { return regs.window1_enabled[BG2]; } +bool PPUDebugger::bg2_window1_invert() { return regs.window1_invert [BG2]; } +bool PPUDebugger::bg2_window2_enable() { return regs.window2_enabled[BG2]; } +bool PPUDebugger::bg2_window2_invert() { return regs.window2_invert [BG2]; } + +//$2124 +bool PPUDebugger::bg3_window1_enable() { return regs.window1_enabled[BG3]; } +bool PPUDebugger::bg3_window1_invert() { return regs.window1_invert [BG3]; } +bool PPUDebugger::bg3_window2_enable() { return regs.window2_enabled[BG3]; } +bool PPUDebugger::bg3_window2_invert() { return regs.window2_invert [BG3]; } +bool PPUDebugger::bg4_window1_enable() { return regs.window1_enabled[BG4]; } +bool PPUDebugger::bg4_window1_invert() { return regs.window1_invert [BG4]; } +bool PPUDebugger::bg4_window2_enable() { return regs.window2_enabled[BG4]; } +bool PPUDebugger::bg4_window2_invert() { return regs.window2_invert [BG4]; } + +//$2125 +bool PPUDebugger::oam_window1_enable() { return regs.window1_enabled[OAM]; } +bool PPUDebugger::oam_window1_invert() { return regs.window1_invert [OAM]; } +bool PPUDebugger::oam_window2_enable() { return regs.window2_enabled[OAM]; } +bool PPUDebugger::oam_window2_invert() { return regs.window2_invert [OAM]; } +bool PPUDebugger::color_window1_enable() { return regs.window1_enabled[COL]; } +bool PPUDebugger::color_window1_invert() { return regs.window1_invert [COL]; } +bool PPUDebugger::color_window2_enable() { return regs.window2_enabled[COL]; } +bool PPUDebugger::color_window2_invert() { return regs.window2_enabled[COL]; } + +//$2126 +unsigned PPUDebugger::window1_left() { return regs.window1_left; } + +//$2127 +unsigned PPUDebugger::window1_right() { return regs.window1_right; } + +//$2128 +unsigned PPUDebugger::window2_left() { return regs.window2_left; } + +//$2129 +unsigned PPUDebugger::window2_right() { return regs.window2_right; } + +//$212a +unsigned PPUDebugger::bg1_window_mask() { return regs.window_mask[BG1]; } +unsigned PPUDebugger::bg2_window_mask() { return regs.window_mask[BG2]; } +unsigned PPUDebugger::bg3_window_mask() { return regs.window_mask[BG3]; } +unsigned PPUDebugger::bg4_window_mask() { return regs.window_mask[BG4]; } + +//$212b +unsigned PPUDebugger::oam_window_mask() { return regs.window_mask[OAM]; } +unsigned PPUDebugger::color_window_mask() { return regs.window_mask[COL]; } + +//$212c +bool PPUDebugger::bg1_mainscreen_enable() { return regs.bg_enabled[BG1]; } +bool PPUDebugger::bg2_mainscreen_enable() { return regs.bg_enabled[BG2]; } +bool PPUDebugger::bg3_mainscreen_enable() { return regs.bg_enabled[BG3]; } +bool PPUDebugger::bg4_mainscreen_enable() { return regs.bg_enabled[BG4]; } +bool PPUDebugger::oam_mainscreen_enable() { return regs.bg_enabled[OAM]; } + +//$212d +bool PPUDebugger::bg1_subscreen_enable() { return regs.bgsub_enabled[BG1]; } +bool PPUDebugger::bg2_subscreen_enable() { return regs.bgsub_enabled[BG2]; } +bool PPUDebugger::bg3_subscreen_enable() { return regs.bgsub_enabled[BG3]; } +bool PPUDebugger::bg4_subscreen_enable() { return regs.bgsub_enabled[BG4]; } +bool PPUDebugger::oam_subscreen_enable() { return regs.bgsub_enabled[OAM]; } + +//$212e +bool PPUDebugger::bg1_mainscreen_window_enable() { return regs.window_enabled[BG1]; } +bool PPUDebugger::bg2_mainscreen_window_enable() { return regs.window_enabled[BG2]; } +bool PPUDebugger::bg3_mainscreen_window_enable() { return regs.window_enabled[BG3]; } +bool PPUDebugger::bg4_mainscreen_window_enable() { return regs.window_enabled[BG4]; } +bool PPUDebugger::oam_mainscreen_window_enable() { return regs.window_enabled[OAM]; } + +//$212f +bool PPUDebugger::bg1_subscreen_window_enable() { return regs.sub_window_enabled[BG1]; } +bool PPUDebugger::bg2_subscreen_window_enable() { return regs.sub_window_enabled[BG2]; } +bool PPUDebugger::bg3_subscreen_window_enable() { return regs.sub_window_enabled[BG3]; } +bool PPUDebugger::bg4_subscreen_window_enable() { return regs.sub_window_enabled[BG4]; } +bool PPUDebugger::oam_subscreen_window_enable() { return regs.sub_window_enabled[OAM]; } + +//$2130 +unsigned PPUDebugger::color_mainscreen_window_mask() { return regs.color_mask; } +unsigned PPUDebugger::color_subscreen_window_mask() { return regs.colorsub_mask; } +bool PPUDebugger::color_add_subtract_mode() { return regs.addsub_mode; } +bool PPUDebugger::direct_color() { return regs.direct_color; } + +//$2131 +bool PPUDebugger::color_mode() { return regs.color_mode; } +bool PPUDebugger::color_halve() { return regs.color_halve; } +bool PPUDebugger::bg1_color_enable() { return regs.color_enabled[BG1]; } +bool PPUDebugger::bg2_color_enable() { return regs.color_enabled[BG2]; } +bool PPUDebugger::bg3_color_enable() { return regs.color_enabled[BG3]; } +bool PPUDebugger::bg4_color_enable() { return regs.color_enabled[BG4]; } +bool PPUDebugger::oam_color_enable() { return regs.color_enabled[OAM]; } +bool PPUDebugger::back_color_enable() { return regs.color_enabled[BACK]; } + +//$2132 +unsigned PPUDebugger::color_constant_blue() { return regs.color_b; } +unsigned PPUDebugger::color_constant_green() { return regs.color_g; } +unsigned PPUDebugger::color_constant_red() { return regs.color_r; } + +//$2133 +bool PPUDebugger::mode7_extbg() { return regs.mode7_extbg; } +bool PPUDebugger::pseudo_hires() { return regs.pseudo_hires; } +bool PPUDebugger::overscan() { return regs.overscan; } +bool PPUDebugger::oam_interlace() { return regs.oam_interlace; } +bool PPUDebugger::interlace() { return regs.interlace; } + +//$213c +unsigned PPUDebugger::hcounter() { return PPU::hcounter(); } + +//$213d +unsigned PPUDebugger::vcounter() { return PPU::vcounter(); } + +//$213e +bool PPUDebugger::range_over() { return regs.range_over; } +bool PPUDebugger::time_over() { return regs.time_over; } +unsigned PPUDebugger::ppu1_version() { return PPU::ppu1_version; } + +//$213f +bool PPUDebugger::field() { return cpu.field(); } +bool PPUDebugger::region() { return PPU::region; } +unsigned PPUDebugger::ppu2_version() { return PPU::ppu2_version; } + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/debugger/debugger.hpp b/Mednafen/mednafen/snes/src/ppu/debugger/debugger.hpp new file mode 100755 index 0000000000..fd36702a26 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/debugger/debugger.hpp @@ -0,0 +1,272 @@ +class PPUDebugger : public PPU, public PPUDebugger { +public: + bool bg1_enabled[2]; + bool bg2_enabled[2]; + bool bg3_enabled[2]; + bool bg4_enabled[2]; + bool oam_enabled[4]; + + uint8 vram_mmio_read(uint16 addr); + void vram_mmio_write(uint16 addr, uint8 data); + + uint8 oam_mmio_read(uint16 addr); + void oam_mmio_write(uint16 addr, uint8 data); + + uint8 cgram_mmio_read(uint16 addr); + void cgram_mmio_write(uint16 addr, uint8 data); + + void render_line_mode0(); + void render_line_mode1(); + void render_line_mode2(); + void render_line_mode3(); + void render_line_mode4(); + void render_line_mode5(); + void render_line_mode6(); + void render_line_mode7(); + + PPUDebugger(); + + //=========== + //PPUDebugger + //=========== + + //internal + unsigned ppu1_mdr(); + unsigned ppu2_mdr(); + + //$2100 + bool display_disable(); + unsigned display_brightness(); + + //$2101 + unsigned oam_base_size(); + unsigned oam_name_select(); + unsigned oam_name_base_address(); + + //$2102-$2103 + unsigned oam_base_address(); + bool oam_priority(); + + //$2105 + bool bg1_tile_size(); + bool bg2_tile_size(); + bool bg3_tile_size(); + bool bg4_tile_size(); + bool bg3_priority(); + unsigned bg_mode(); + + //$2106 + unsigned mosaic_size(); + bool bg1_mosaic_enable(); + bool bg2_mosaic_enable(); + bool bg3_mosaic_enable(); + bool bg4_mosaic_enable(); + + //$2107 + unsigned bg1_screen_address(); + unsigned bg1_screen_size(); + + //$2108 + unsigned bg2_screen_address(); + unsigned bg2_screen_size(); + + //$2109 + unsigned bg3_screen_address(); + unsigned bg3_screen_size(); + + //$210a + unsigned bg4_screen_address(); + unsigned bg4_screen_size(); + + //$210b + unsigned bg1_name_base_address(); + unsigned bg2_name_base_address(); + + //$210c + unsigned bg3_name_base_address(); + unsigned bg4_name_base_address(); + + //$210d + unsigned mode7_hoffset(); + unsigned bg1_hoffset(); + + //$210e + unsigned mode7_voffset(); + unsigned bg1_voffset(); + + //$210f + unsigned bg2_hoffset(); + + //$2110 + unsigned bg2_voffset(); + + //$2111 + unsigned bg3_hoffset(); + + //$2112 + unsigned bg3_voffset(); + + //$2113 + unsigned bg4_hoffset(); + + //$2114 + unsigned bg4_voffset(); + + //$2115 + bool vram_increment_mode(); + unsigned vram_increment_formation(); + unsigned vram_increment_size(); + + //$2116-$2117 + unsigned vram_address(); + + //$211a + unsigned mode7_repeat(); + bool mode7_vflip(); + bool mode7_hflip(); + + //$211b + unsigned mode7_a(); + + //$211c + unsigned mode7_b(); + + //$211d + unsigned mode7_c(); + + //$211e + unsigned mode7_d(); + + //$211f + unsigned mode7_x(); + + //$2120 + unsigned mode7_y(); + + //$2121 + unsigned cgram_address(); + + //$2123 + bool bg1_window1_enable(); + bool bg1_window1_invert(); + bool bg1_window2_enable(); + bool bg1_window2_invert(); + bool bg2_window1_enable(); + bool bg2_window1_invert(); + bool bg2_window2_enable(); + bool bg2_window2_invert(); + + //$2124 + bool bg3_window1_enable(); + bool bg3_window1_invert(); + bool bg3_window2_enable(); + bool bg3_window2_invert(); + bool bg4_window1_enable(); + bool bg4_window1_invert(); + bool bg4_window2_enable(); + bool bg4_window2_invert(); + + //$2125 + bool oam_window1_enable(); + bool oam_window1_invert(); + bool oam_window2_enable(); + bool oam_window2_invert(); + bool color_window1_enable(); + bool color_window1_invert(); + bool color_window2_enable(); + bool color_window2_invert(); + + //$2126 + unsigned window1_left(); + + //$2127 + unsigned window1_right(); + + //$2128 + unsigned window2_left(); + + //$2129 + unsigned window2_right(); + + //$212a + unsigned bg1_window_mask(); + unsigned bg2_window_mask(); + unsigned bg3_window_mask(); + unsigned bg4_window_mask(); + + //$212b + unsigned oam_window_mask(); + unsigned color_window_mask(); + + //$212c + bool bg1_mainscreen_enable(); + bool bg2_mainscreen_enable(); + bool bg3_mainscreen_enable(); + bool bg4_mainscreen_enable(); + bool oam_mainscreen_enable(); + + //$212d + bool bg1_subscreen_enable(); + bool bg2_subscreen_enable(); + bool bg3_subscreen_enable(); + bool bg4_subscreen_enable(); + bool oam_subscreen_enable(); + + //$212e + bool bg1_mainscreen_window_enable(); + bool bg2_mainscreen_window_enable(); + bool bg3_mainscreen_window_enable(); + bool bg4_mainscreen_window_enable(); + bool oam_mainscreen_window_enable(); + + //$212f + bool bg1_subscreen_window_enable(); + bool bg2_subscreen_window_enable(); + bool bg3_subscreen_window_enable(); + bool bg4_subscreen_window_enable(); + bool oam_subscreen_window_enable(); + + //$2130 + unsigned color_mainscreen_window_mask(); + unsigned color_subscreen_window_mask(); + bool color_add_subtract_mode(); + bool direct_color(); + + //$2131 + bool color_mode(); + bool color_halve(); + bool bg1_color_enable(); + bool bg2_color_enable(); + bool bg3_color_enable(); + bool bg4_color_enable(); + bool oam_color_enable(); + bool back_color_enable(); + + //$2132 + unsigned color_constant_blue(); + unsigned color_constant_green(); + unsigned color_constant_red(); + + //$2133 + bool mode7_extbg(); + bool pseudo_hires(); + bool overscan(); + bool oam_interlace(); + bool interlace(); + + //$213c + unsigned hcounter(); + + //$213d + unsigned vcounter(); + + //$213e + bool range_over(); + bool time_over(); + unsigned ppu1_version(); + + //$213f + bool field(); + bool region(); + unsigned ppu2_version(); +}; diff --git a/Mednafen/mednafen/snes/src/ppu/debugger/render.cpp b/Mednafen/mednafen/snes/src/ppu/debugger/render.cpp new file mode 100755 index 0000000000..5e6ff6e95f --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/debugger/render.cpp @@ -0,0 +1,194 @@ +#ifdef PPU_CPP + +//render_line_modeN() taken from src/ppu/bppu/render/render.cpp +//modified to support layer disable; accomplished by setting priority to zero +//a priority of zero won't override the back layer, effectively nullifying it +//for speed, rendering loop is skipped entirely if all priorities are disabled +// +//note: render_line_(bg|oam|mode7) cannot be virtualized as they are templates + +void PPUDebugger::render_line_mode0() { + unsigned pri0, pri1, pri2, pri3; + + pri0 = bg1_enabled[0] ? 8 : 0; + pri1 = bg1_enabled[1] ? 11 : 0; + if(pri0 | pri1) PPU::render_line_bg<0, BG1, COLORDEPTH_4>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 7 : 0; + pri1 = bg2_enabled[1] ? 10 : 0; + if(pri0 | pri1) PPU::render_line_bg<0, BG2, COLORDEPTH_4>(pri0, pri1); + + pri0 = bg3_enabled[0] ? 2 : 0; + pri1 = bg3_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_bg<0, BG3, COLORDEPTH_4>(pri0, pri1); + + pri0 = bg4_enabled[0] ? 1 : 0; + pri1 = bg4_enabled[1] ? 4 : 0; + if(pri0 | pri1) PPU::render_line_bg<0, BG4, COLORDEPTH_4>(pri0, pri1); + + pri0 = oam_enabled[0] ? 3 : 0; + pri1 = oam_enabled[1] ? 6 : 0; + pri2 = oam_enabled[2] ? 9 : 0; + pri3 = oam_enabled[3] ? 12 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); +} + +void PPUDebugger::render_line_mode1() { + unsigned pri0, pri1, pri2, pri3; + + if(regs.bg3_priority) { + pri0 = bg1_enabled[0] ? 5 : 0; + pri1 = bg1_enabled[1] ? 8 : 0; + if(pri0 | pri1) PPU::render_line_bg<1, BG1, COLORDEPTH_16>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 4 : 0; + pri1 = bg2_enabled[1] ? 7 : 0; + if(pri0 | pri1) PPU::render_line_bg<1, BG2, COLORDEPTH_16>(pri0, pri1); + + pri0 = bg3_enabled[0] ? 1 : 0; + pri1 = bg3_enabled[1] ? 10 : 0; + if(pri0 | pri1) PPU::render_line_bg<1, BG3, COLORDEPTH_4>(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 3 : 0; + pri2 = oam_enabled[2] ? 6 : 0; + pri3 = oam_enabled[3] ? 9 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); + } else { + pri0 = bg1_enabled[0] ? 6 : 0; + pri1 = bg1_enabled[1] ? 9 : 0; + if(pri0 | pri1) PPU::render_line_bg<1, BG1, COLORDEPTH_16>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 5 : 0; + pri1 = bg2_enabled[1] ? 8 : 0; + if(pri0 | pri1) PPU::render_line_bg<1, BG2, COLORDEPTH_16>(pri0, pri1); + + pri0 = bg3_enabled[0] ? 1 : 0; + pri1 = bg3_enabled[1] ? 3 : 0; + if(pri0 | pri1) PPU::render_line_bg<1, BG3, COLORDEPTH_4>(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 4 : 0; + pri2 = oam_enabled[2] ? 7 : 0; + pri3 = oam_enabled[3] ? 10 : 0; + PPU::render_line_oam(pri0, pri1, pri2, pri3); + } +} + +void PPUDebugger::render_line_mode2() { + unsigned pri0, pri1, pri2, pri3; + + pri0 = bg1_enabled[0] ? 3 : 0; + pri1 = bg1_enabled[1] ? 7 : 0; + if(pri0 | pri1) PPU::render_line_bg<2, BG1, COLORDEPTH_16>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 1 : 0; + pri1 = bg2_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_bg<2, BG2, COLORDEPTH_16>(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 4 : 0; + pri2 = oam_enabled[2] ? 6 : 0; + pri3 = oam_enabled[3] ? 8 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); +} + +void PPUDebugger::render_line_mode3() { + unsigned pri0, pri1, pri2, pri3; + + pri0 = bg1_enabled[0] ? 3 : 0; + pri1 = bg1_enabled[1] ? 7 : 0; + if(pri0 | pri1) PPU::render_line_bg<3, BG1, COLORDEPTH_256>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 1 : 0; + pri1 = bg2_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_bg<3, BG2, COLORDEPTH_16>(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 4 : 0; + pri2 = oam_enabled[2] ? 6 : 0; + pri3 = oam_enabled[3] ? 8 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); +} + +void PPUDebugger::render_line_mode4() { + unsigned pri0, pri1, pri2, pri3; + + pri0 = bg1_enabled[0] ? 3 : 0; + pri1 = bg1_enabled[1] ? 7 : 0; + if(pri0 | pri1) PPU::render_line_bg<4, BG1, COLORDEPTH_256>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 1 : 0; + pri1 = bg2_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_bg<4, BG2, COLORDEPTH_4>(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 4 : 0; + pri2 = oam_enabled[2] ? 6 : 0; + pri3 = oam_enabled[3] ? 8 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); +} + +void PPUDebugger::render_line_mode5() { + unsigned pri0, pri1, pri2, pri3; + + pri0 = bg1_enabled[0] ? 3 : 0; + pri1 = bg1_enabled[1] ? 7 : 0; + if(pri0 | pri1) PPU::render_line_bg<5, BG1, COLORDEPTH_16>(pri0, pri1); + + pri0 = bg2_enabled[0] ? 1 : 0; + pri1 = bg2_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_bg<5, BG2, COLORDEPTH_4>(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 4 : 0; + pri2 = oam_enabled[2] ? 6 : 0; + pri3 = oam_enabled[3] ? 8 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); +} + +void PPUDebugger::render_line_mode6() { + unsigned pri0, pri1, pri2, pri3; + + pri0 = bg1_enabled[0] ? 2 : 0; + pri1 = bg1_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_bg<6, BG1, COLORDEPTH_16>(pri0, pri1); + + pri0 = oam_enabled[0] ? 1 : 0; + pri1 = oam_enabled[1] ? 3 : 0; + pri2 = oam_enabled[2] ? 4 : 0; + pri3 = oam_enabled[3] ? 6 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); +} + +void PPUDebugger::render_line_mode7() { + unsigned pri0, pri1, pri2, pri3; + + if(regs.mode7_extbg == false) { + pri0 = bg1_enabled[0] ? 2 : 0; + pri1 = bg1_enabled[1] ? 2 : 0; + if(pri0 | pri1) PPU::render_line_mode7(pri0, pri1); + + pri0 = oam_enabled[0] ? 1 : 0; + pri1 = oam_enabled[1] ? 3 : 0; + pri2 = oam_enabled[2] ? 4 : 0; + pri3 = oam_enabled[3] ? 5 : 0; + if(pri0 | pri1 | pri2 | pri3) PPU::render_line_oam(pri0, pri1, pri2, pri3); + } else { + pri0 = bg1_enabled[0] ? 3 : 0; + pri1 = bg1_enabled[1] ? 3 : 0; + if(pri0 | pri1) PPU::render_line_mode7(pri0, pri1); + + pri0 = bg2_enabled[0] ? 1 : 0; + pri1 = bg2_enabled[1] ? 5 : 0; + if(pri0 | pri1) PPU::render_line_mode7(pri0, pri1); + + pri0 = oam_enabled[0] ? 2 : 0; + pri1 = oam_enabled[1] ? 4 : 0; + pri2 = oam_enabled[2] ? 6 : 0; + pri3 = oam_enabled[3] ? 7 : 0; + PPU::render_line_oam(pri0, pri1, pri2, pri3); + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/memory/memory.cpp b/Mednafen/mednafen/snes/src/ppu/memory/memory.cpp new file mode 100755 index 0000000000..04075c0c97 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/memory/memory.cpp @@ -0,0 +1,173 @@ +#ifdef PPU_CPP + +void PPU::latch_counters() { + regs.hcounter = cpu.hdot(); + regs.vcounter = cpu.vcounter(); + regs.counters_latched = true; +} + +uint16 PPU::get_vram_address() { + uint16 addr = regs.vram_addr; + switch(regs.vram_mapping) { + case 0: break; //direct mapping + case 1: addr = (addr & 0xff00) | ((addr & 0x001f) << 3) | ((addr >> 5) & 7); break; + case 2: addr = (addr & 0xfe00) | ((addr & 0x003f) << 3) | ((addr >> 6) & 7); break; + case 3: addr = (addr & 0xfc00) | ((addr & 0x007f) << 3) | ((addr >> 7) & 7); break; + } + return (addr << 1); +} + +//NOTE: all VRAM writes during active display are invalid. Unlike OAM and CGRAM, they will +//not be written anywhere at all. The below address ranges for where writes are invalid have +//been validated on hardware, as has the edge case where the S-CPU MDR can be written if the +//write occurs during the very last clock cycle of vblank. + +uint8 PPU::vram_mmio_read(uint16 addr) { + uint8 data; + + if(regs.display_disabled == true) { + data = memory::vram[addr]; + } else { + uint16 v = cpu.vcounter(); + uint16 h = cpu.hcounter(); + uint16 ls = ((system.region() == System::NTSC ? 525 : 625) >> 1) - 1; + if(interlace() && !cpu.field()) ls++; + + if(v == ls && h == 1362) { + data = 0x00; + } else if(v < (!overscan() ? 224 : 239)) { + data = 0x00; + } else if(v == (!overscan() ? 224 : 239)) { + if(h == 1362) { + data = memory::vram[addr]; + } else { + data = 0x00; + } + } else { + data = memory::vram[addr]; + } + } + + return data; +} + +void PPU::vram_mmio_write(uint16 addr, uint8 data) { + if(regs.display_disabled == true) { + memory::vram[addr] = data; + } else { + uint16 v = cpu.vcounter(); + uint16 h = cpu.hcounter(); + if(v == 0) { + if(h <= 4) { + memory::vram[addr] = data; + } else if(h == 6) { + memory::vram[addr] = cpu.regs.mdr; + } else { + //no write + } + } else if(v < (!overscan() ? 225 : 240)) { + //no write + } else if(v == (!overscan() ? 225 : 240)) { + if(h <= 4) { + //no write + } else { + memory::vram[addr] = data; + } + } else { + memory::vram[addr] = data; + } + } +} + +//NOTE: OAM accesses during active display are rerouted to 0x0218 ... this can be considered +//a hack. The actual address varies during rendering, as the S-PPU reads in data itself for +//processing. Unfortunately, we have yet to determine how this works. The algorithm cannot be +//reverse engineered using a scanline renderer such as this, and at this time, there does not +//exist a more accurate SNES PPU emulator to work from. The only known game to actually access +//OAM during active display is Uniracers. It expects accesses to map to offset 0x0218. +//It was decided by public consensus to map writes to this address to match Uniracers, primarily +//because it is the only game observed to do this, but also because mapping to this address does +//not contradict any of our findings, because we have no findings whatsoever on this behavior. +//Think of this what you will, I openly admit that this is a hack. But it is more accurate than +//writing to the 'expected' address set by $2102,$2103, and will catch problems in software that +//accidentally accesses OAM during active display by virtue of not returning the expected data. + +uint8 PPU::oam_mmio_read(uint16 addr) { + addr &= 0x03ff; + if(addr & 0x0200) addr &= 0x021f; + uint8 data; + + if(regs.display_disabled == true) { + data = memory::oam[addr]; + } else { + if(cpu.vcounter() < (!overscan() ? 225 : 240)) { + data = memory::oam[0x0218]; + } else { + data = memory::oam[addr]; + } + } + + return data; +} + +void PPU::oam_mmio_write(uint16 addr, uint8 data) { + addr &= 0x03ff; + if(addr & 0x0200) addr &= 0x021f; + + sprite_list_valid = false; + + if(regs.display_disabled == true) { + memory::oam[addr] = data; + } else { + if(cpu.vcounter() < (!overscan() ? 225 : 240)) { + memory::oam[0x0218] = data; + } else { + memory::oam[addr] = data; + } + } +} + +//NOTE: CGRAM writes during hblank are valid. During active display, the actual address the +//data is written to varies, as the S-PPU itself changes the address. Like OAM, we do not know +//the exact algorithm used, but we have zero known examples of any commercial software that +//attempts to do this. Therefore, the addresses are mapped to 0x01ff. There is nothing special +//about this address, it is simply more accurate to invalidate the 'expected' address than not. + +uint8 PPU::cgram_mmio_read(uint16 addr) { + addr &= 0x01ff; + uint8 data; + + if(regs.display_disabled == true) { + data = memory::cgram[addr]; + } else { + uint16 v = cpu.vcounter(); + uint16 h = cpu.hcounter(); + if(v < (!overscan() ? 225 : 240) && h >= 128 && h < 1096) { + data = memory::cgram[0x01ff] & 0x7f; + } else { + data = memory::cgram[addr]; + } + } + + if(addr & 1) data &= 0x7f; + return data; +} + +void PPU::cgram_mmio_write(uint16 addr, uint8 data) { + addr &= 0x01ff; + if(addr & 1) data &= 0x7f; + + if(regs.display_disabled == true) { + memory::cgram[addr] = data; + } else { + uint16 v = cpu.vcounter(); + uint16 h = cpu.hcounter(); + if(v < (!overscan() ? 225 : 240) && h >= 128 && h < 1096) { + memory::cgram[0x01ff] = data & 0x7f; + } else { + memory::cgram[addr] = data; + } + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/memory/memory.hpp b/Mednafen/mednafen/snes/src/ppu/memory/memory.hpp new file mode 100755 index 0000000000..c2979aea83 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/memory/memory.hpp @@ -0,0 +1,10 @@ +uint16 get_vram_address(); + +debugvirtual uint8 vram_mmio_read(uint16 addr); +debugvirtual void vram_mmio_write(uint16 addr, uint8 data); + +debugvirtual uint8 oam_mmio_read(uint16 addr); +debugvirtual void oam_mmio_write(uint16 addr, uint8 data); + +debugvirtual uint8 cgram_mmio_read(uint16 addr); +debugvirtual void cgram_mmio_write(uint16 addr, uint8 data); diff --git a/Mednafen/mednafen/snes/src/ppu/mmio/mmio.cpp b/Mednafen/mednafen/snes/src/ppu/mmio/mmio.cpp new file mode 100755 index 0000000000..81aa69c535 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/mmio/mmio.cpp @@ -0,0 +1,671 @@ +#ifdef PPU_CPP + +//INIDISP +void PPU::mmio_w2100(uint8 value) { + if(regs.display_disabled == true && cpu.vcounter() == (!overscan() ? 225 : 240)) { + regs.oam_addr = regs.oam_baseaddr << 1; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; + } + + regs.display_disabled = !!(value & 0x80); + regs.display_brightness = value & 15; +} + +//OBSEL +void PPU::mmio_w2101(uint8 value) { + regs.oam_basesize = (value >> 5) & 7; + regs.oam_nameselect = (value >> 3) & 3; + regs.oam_tdaddr = (value & 3) << 14; +} + +//OAMADDL +void PPU::mmio_w2102(uint8 data) { + regs.oam_baseaddr = (regs.oam_baseaddr & ~0xff) | (data << 0); + regs.oam_baseaddr &= 0x01ff; + regs.oam_addr = regs.oam_baseaddr << 1; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; +} + +//OAMADDH +void PPU::mmio_w2103(uint8 data) { + regs.oam_priority = !!(data & 0x80); + regs.oam_baseaddr = (regs.oam_baseaddr & 0xff) | (data << 8); + regs.oam_baseaddr &= 0x01ff; + regs.oam_addr = regs.oam_baseaddr << 1; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; +} + +//OAMDATA +void PPU::mmio_w2104(uint8 data) { + if(regs.oam_addr & 0x0200) { + oam_mmio_write(regs.oam_addr, data); + } else if((regs.oam_addr & 1) == 0) { + regs.oam_latchdata = data; + } else { + oam_mmio_write((regs.oam_addr & ~1) + 0, regs.oam_latchdata); + oam_mmio_write((regs.oam_addr & ~1) + 1, data); + } + + regs.oam_addr++; + regs.oam_addr &= 0x03ff; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; +} + +//BGMODE +void PPU::mmio_w2105(uint8 value) { + regs.bg_tilesize[BG4] = !!(value & 0x80); + regs.bg_tilesize[BG3] = !!(value & 0x40); + regs.bg_tilesize[BG2] = !!(value & 0x20); + regs.bg_tilesize[BG1] = !!(value & 0x10); + regs.bg3_priority = !!(value & 0x08); + regs.bg_mode = (value & 7); +} + +//MOSAIC +void PPU::mmio_w2106(uint8 value) { + regs.mosaic_size = (value >> 4) & 15; + regs.mosaic_enabled[BG4] = !!(value & 0x08); + regs.mosaic_enabled[BG3] = !!(value & 0x04); + regs.mosaic_enabled[BG2] = !!(value & 0x02); + regs.mosaic_enabled[BG1] = !!(value & 0x01); +} + +//BG1SC +void PPU::mmio_w2107(uint8 value) { + regs.bg_scaddr[BG1] = (value & 0x7c) << 9; + regs.bg_scsize[BG1] = value & 3; +} + +//BG2SC +void PPU::mmio_w2108(uint8 value) { + regs.bg_scaddr[BG2] = (value & 0x7c) << 9; + regs.bg_scsize[BG2] = value & 3; +} + +//BG3SC +void PPU::mmio_w2109(uint8 value) { + regs.bg_scaddr[BG3] = (value & 0x7c) << 9; + regs.bg_scsize[BG3] = value & 3; +} + +//BG4SC +void PPU::mmio_w210a(uint8 value) { + regs.bg_scaddr[BG4] = (value & 0x7c) << 9; + regs.bg_scsize[BG4] = value & 3; +} + +//BG12NBA +void PPU::mmio_w210b(uint8 value) { + regs.bg_tdaddr[BG1] = (value & 0x07) << 13; + regs.bg_tdaddr[BG2] = (value & 0x70) << 9; +} + +//BG34NBA +void PPU::mmio_w210c(uint8 value) { + regs.bg_tdaddr[BG3] = (value & 0x07) << 13; + regs.bg_tdaddr[BG4] = (value & 0x70) << 9; +} + +//BG1HOFS +void PPU::mmio_w210d(uint8 value) { + regs.m7_hofs = (value << 8) | regs.m7_latch; + regs.m7_latch = value; + + regs.bg_hofs[BG1] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG1] >> 8) & 7); + regs.bg_ofslatch = value; +} + +//BG1VOFS +void PPU::mmio_w210e(uint8 value) { + regs.m7_vofs = (value << 8) | regs.m7_latch; + regs.m7_latch = value; + + regs.bg_vofs[BG1] = (value << 8) | (regs.bg_ofslatch); + regs.bg_ofslatch = value; +} + +//BG2HOFS +void PPU::mmio_w210f(uint8 value) { + regs.bg_hofs[BG2] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG2] >> 8) & 7); + regs.bg_ofslatch = value; +} + +//BG2VOFS +void PPU::mmio_w2110(uint8 value) { + regs.bg_vofs[BG2] = (value << 8) | (regs.bg_ofslatch); + regs.bg_ofslatch = value; +} + +//BG3HOFS +void PPU::mmio_w2111(uint8 value) { + regs.bg_hofs[BG3] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG3] >> 8) & 7); + regs.bg_ofslatch = value; +} + +//BG3VOFS +void PPU::mmio_w2112(uint8 value) { + regs.bg_vofs[BG3] = (value << 8) | (regs.bg_ofslatch); + regs.bg_ofslatch = value; +} + +//BG4HOFS +void PPU::mmio_w2113(uint8 value) { + regs.bg_hofs[BG4] = (value << 8) | (regs.bg_ofslatch & ~7) | ((regs.bg_hofs[BG4] >> 8) & 7); + regs.bg_ofslatch = value; +} + +//BG4VOFS +void PPU::mmio_w2114(uint8 value) { + regs.bg_vofs[BG4] = (value << 8) | (regs.bg_ofslatch); + regs.bg_ofslatch = value; +} + +//VMAIN +void PPU::mmio_w2115(uint8 value) { + regs.vram_incmode = !!(value & 0x80); + regs.vram_mapping = (value >> 2) & 3; + switch(value & 3) { + case 0: regs.vram_incsize = 1; break; + case 1: regs.vram_incsize = 32; break; + case 2: regs.vram_incsize = 128; break; + case 3: regs.vram_incsize = 128; break; + } +} + +//VMADDL +void PPU::mmio_w2116(uint8 value) { + regs.vram_addr = (regs.vram_addr & 0xff00) | value; + uint16 addr = get_vram_address(); + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; +} + +//VMADDH +void PPU::mmio_w2117(uint8 value) { + regs.vram_addr = (value << 8) | (regs.vram_addr & 0x00ff); + uint16 addr = get_vram_address(); + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; +} + +//VMDATAL +void PPU::mmio_w2118(uint8 value) { +uint16 addr = get_vram_address(); + vram_mmio_write(addr, value); + bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; + bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; + bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; + + if(regs.vram_incmode == 0) { + regs.vram_addr += regs.vram_incsize; + } +} + +//VMDATAH +void PPU::mmio_w2119(uint8 value) { +uint16 addr = get_vram_address() + 1; + vram_mmio_write(addr, value); + bg_tiledata_state[TILE_2BIT][(addr >> 4)] = 1; + bg_tiledata_state[TILE_4BIT][(addr >> 5)] = 1; + bg_tiledata_state[TILE_8BIT][(addr >> 6)] = 1; + + if(regs.vram_incmode == 1) { + regs.vram_addr += regs.vram_incsize; + } +} + +//M7SEL +void PPU::mmio_w211a(uint8 value) { + regs.mode7_repeat = (value >> 6) & 3; + regs.mode7_vflip = !!(value & 0x02); + regs.mode7_hflip = !!(value & 0x01); +} + +//M7A +void PPU::mmio_w211b(uint8 value) { + regs.m7a = (value << 8) | regs.m7_latch; + regs.m7_latch = value; +} + +//M7B +void PPU::mmio_w211c(uint8 value) { + regs.m7b = (value << 8) | regs.m7_latch; + regs.m7_latch = value; +} + +//M7C +void PPU::mmio_w211d(uint8 value) { + regs.m7c = (value << 8) | regs.m7_latch; + regs.m7_latch = value; +} + +//M7D +void PPU::mmio_w211e(uint8 value) { + regs.m7d = (value << 8) | regs.m7_latch; + regs.m7_latch = value; +} + +//M7X +void PPU::mmio_w211f(uint8 value) { + regs.m7x = (value << 8) | regs.m7_latch; + regs.m7_latch = value; +} + +//M7Y +void PPU::mmio_w2120(uint8 value) { + regs.m7y = (value << 8) | regs.m7_latch; + regs.m7_latch = value; +} + +//CGADD +void PPU::mmio_w2121(uint8 value) { + regs.cgram_addr = value << 1; +} + +//CGDATA +//note: CGRAM palette data format is 15-bits +//(0,bbbbb,ggggg,rrrrr). Highest bit is ignored, +//as evidenced by $213b CGRAM data reads. +// +//anomie indicates writes to CGDATA work the same +//as writes to OAMDATA's low table. need to verify +//this on hardware. +void PPU::mmio_w2122(uint8 value) { + if(!(regs.cgram_addr & 1)) { + regs.cgram_latchdata = value; + } else { + cgram_mmio_write((regs.cgram_addr & 0x01fe), regs.cgram_latchdata); + cgram_mmio_write((regs.cgram_addr & 0x01fe) + 1, value & 0x7f); + } + regs.cgram_addr++; + regs.cgram_addr &= 0x01ff; +} + +//W12SEL +void PPU::mmio_w2123(uint8 value) { + regs.window2_enabled[BG2] = !!(value & 0x80); + regs.window2_invert [BG2] = !!(value & 0x40); + regs.window1_enabled[BG2] = !!(value & 0x20); + regs.window1_invert [BG2] = !!(value & 0x10); + regs.window2_enabled[BG1] = !!(value & 0x08); + regs.window2_invert [BG1] = !!(value & 0x04); + regs.window1_enabled[BG1] = !!(value & 0x02); + regs.window1_invert [BG1] = !!(value & 0x01); +} + +//W34SEL +void PPU::mmio_w2124(uint8 value) { + regs.window2_enabled[BG4] = !!(value & 0x80); + regs.window2_invert [BG4] = !!(value & 0x40); + regs.window1_enabled[BG4] = !!(value & 0x20); + regs.window1_invert [BG4] = !!(value & 0x10); + regs.window2_enabled[BG3] = !!(value & 0x08); + regs.window2_invert [BG3] = !!(value & 0x04); + regs.window1_enabled[BG3] = !!(value & 0x02); + regs.window1_invert [BG3] = !!(value & 0x01); +} + +//WOBJSEL +void PPU::mmio_w2125(uint8 value) { + regs.window2_enabled[COL] = !!(value & 0x80); + regs.window2_invert [COL] = !!(value & 0x40); + regs.window1_enabled[COL] = !!(value & 0x20); + regs.window1_invert [COL] = !!(value & 0x10); + regs.window2_enabled[OAM] = !!(value & 0x08); + regs.window2_invert [OAM] = !!(value & 0x04); + regs.window1_enabled[OAM] = !!(value & 0x02); + regs.window1_invert [OAM] = !!(value & 0x01); +} + +//WH0 +void PPU::mmio_w2126(uint8 value) { + regs.window1_left = value; +} + +//WH1 +void PPU::mmio_w2127(uint8 value) { + regs.window1_right = value; +} + +//WH2 +void PPU::mmio_w2128(uint8 value) { + regs.window2_left = value; +} + +//WH3 +void PPU::mmio_w2129(uint8 value) { + regs.window2_right = value; +} + +//WBGLOG +void PPU::mmio_w212a(uint8 value) { + regs.window_mask[BG4] = (value >> 6) & 3; + regs.window_mask[BG3] = (value >> 4) & 3; + regs.window_mask[BG2] = (value >> 2) & 3; + regs.window_mask[BG1] = (value ) & 3; +} + +//WOBJLOG +void PPU::mmio_w212b(uint8 value) { + regs.window_mask[COL] = (value >> 2) & 3; + regs.window_mask[OAM] = (value ) & 3; +} + +//TM +void PPU::mmio_w212c(uint8 value) { + regs.bg_enabled[OAM] = !!(value & 0x10); + regs.bg_enabled[BG4] = !!(value & 0x08); + regs.bg_enabled[BG3] = !!(value & 0x04); + regs.bg_enabled[BG2] = !!(value & 0x02); + regs.bg_enabled[BG1] = !!(value & 0x01); +} + +//TS +void PPU::mmio_w212d(uint8 value) { + regs.bgsub_enabled[OAM] = !!(value & 0x10); + regs.bgsub_enabled[BG4] = !!(value & 0x08); + regs.bgsub_enabled[BG3] = !!(value & 0x04); + regs.bgsub_enabled[BG2] = !!(value & 0x02); + regs.bgsub_enabled[BG1] = !!(value & 0x01); +} + +//TMW +void PPU::mmio_w212e(uint8 value) { + regs.window_enabled[OAM] = !!(value & 0x10); + regs.window_enabled[BG4] = !!(value & 0x08); + regs.window_enabled[BG3] = !!(value & 0x04); + regs.window_enabled[BG2] = !!(value & 0x02); + regs.window_enabled[BG1] = !!(value & 0x01); +} + +//TSW +void PPU::mmio_w212f(uint8 value) { + regs.sub_window_enabled[OAM] = !!(value & 0x10); + regs.sub_window_enabled[BG4] = !!(value & 0x08); + regs.sub_window_enabled[BG3] = !!(value & 0x04); + regs.sub_window_enabled[BG2] = !!(value & 0x02); + regs.sub_window_enabled[BG1] = !!(value & 0x01); +} + +//CGWSEL +void PPU::mmio_w2130(uint8 value) { + regs.color_mask = (value >> 6) & 3; + regs.colorsub_mask = (value >> 4) & 3; + regs.addsub_mode = !!(value & 0x02); + regs.direct_color = !!(value & 0x01); +} + +//CGADDSUB +void PPU::mmio_w2131(uint8 value) { + regs.color_mode = !!(value & 0x80); + regs.color_halve = !!(value & 0x40); + regs.color_enabled[BACK] = !!(value & 0x20); + regs.color_enabled[OAM] = !!(value & 0x10); + regs.color_enabled[BG4] = !!(value & 0x08); + regs.color_enabled[BG3] = !!(value & 0x04); + regs.color_enabled[BG2] = !!(value & 0x02); + regs.color_enabled[BG1] = !!(value & 0x01); +} + +//COLDATA +void PPU::mmio_w2132(uint8 value) { + if(value & 0x80) regs.color_b = value & 0x1f; + if(value & 0x40) regs.color_g = value & 0x1f; + if(value & 0x20) regs.color_r = value & 0x1f; + + regs.color_rgb = (regs.color_r) + | (regs.color_g << 5) + | (regs.color_b << 10); +} + +//SETINI +void PPU::mmio_w2133(uint8 value) { + regs.mode7_extbg = !!(value & 0x40); + regs.pseudo_hires = !!(value & 0x08); + regs.overscan = !!(value & 0x04); + regs.oam_interlace = !!(value & 0x02); + regs.interlace = !!(value & 0x01); + + display.overscan = regs.overscan; + sprite_list_valid = false; +} + +//MPYL +uint8 PPU::mmio_r2134() { +uint32 r; + r = ((int16)regs.m7a * (int8)(regs.m7b >> 8)); + regs.ppu1_mdr = r; + return regs.ppu1_mdr; +} + +//MPYM +uint8 PPU::mmio_r2135() { +uint32 r; + r = ((int16)regs.m7a * (int8)(regs.m7b >> 8)); + regs.ppu1_mdr = r >> 8; + return regs.ppu1_mdr; +} + +//MPYH +uint8 PPU::mmio_r2136() { +uint32 r; + r = ((int16)regs.m7a * (int8)(regs.m7b >> 8)); + regs.ppu1_mdr = r >> 16; + return regs.ppu1_mdr; +} + +//SLHV +uint8 PPU::mmio_r2137() { + if(cpu.pio() & 0x80) { + latch_counters(); + } + return cpu.regs.mdr; +} + +//OAMDATAREAD +uint8 PPU::mmio_r2138() { + regs.ppu1_mdr = oam_mmio_read(regs.oam_addr); + + regs.oam_addr++; + regs.oam_addr &= 0x03ff; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; + + return regs.ppu1_mdr; +} + +//VMDATALREAD +uint8 PPU::mmio_r2139() { +uint16 addr = get_vram_address(); + regs.ppu1_mdr = regs.vram_readbuffer; + if(regs.vram_incmode == 0) { + addr &= 0xfffe; + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; + regs.vram_addr += regs.vram_incsize; + } + return regs.ppu1_mdr; +} + +//VMDATAHREAD +uint8 PPU::mmio_r213a() { +uint16 addr = get_vram_address() + 1; + regs.ppu1_mdr = regs.vram_readbuffer >> 8; + if(regs.vram_incmode == 1) { + addr &= 0xfffe; + regs.vram_readbuffer = vram_mmio_read(addr + 0); + regs.vram_readbuffer |= vram_mmio_read(addr + 1) << 8; + regs.vram_addr += regs.vram_incsize; + } + return regs.ppu1_mdr; +} + +//CGDATAREAD +//note: CGRAM palette data is 15-bits (0,bbbbb,ggggg,rrrrr) +//therefore, the high byte read from each color does not +//update bit 7 of the PPU2 MDR. +uint8 PPU::mmio_r213b() { + if(!(regs.cgram_addr & 1)) { + regs.ppu2_mdr = cgram_mmio_read(regs.cgram_addr) & 0xff; + } else { + regs.ppu2_mdr &= 0x80; + regs.ppu2_mdr |= cgram_mmio_read(regs.cgram_addr) & 0x7f; + } + regs.cgram_addr++; + regs.cgram_addr &= 0x01ff; + return regs.ppu2_mdr; +} + +//OPHCT +uint8 PPU::mmio_r213c() { + if(!regs.latch_hcounter) { + regs.ppu2_mdr = regs.hcounter & 0xff; + } else { + regs.ppu2_mdr &= 0xfe; + regs.ppu2_mdr |= (regs.hcounter >> 8) & 1; + } + regs.latch_hcounter ^= 1; + return regs.ppu2_mdr; +} + +//OPVCT +uint8 PPU::mmio_r213d() { + if(!regs.latch_vcounter) { + regs.ppu2_mdr = regs.vcounter & 0xff; + } else { + regs.ppu2_mdr &= 0xfe; + regs.ppu2_mdr |= (regs.vcounter >> 8) & 1; + } + regs.latch_vcounter ^= 1; + return regs.ppu2_mdr; +} + +//STAT77 +uint8 PPU::mmio_r213e() { +uint8 r = 0x00; + r |= (regs.time_over) ? 0x80 : 0x00; + r |= (regs.range_over) ? 0x40 : 0x00; + r |= (regs.ppu1_mdr & 0x10); + r |= (ppu1_version & 0x0f); + regs.ppu1_mdr = r; + return regs.ppu1_mdr; +} + +//STAT78 +uint8 PPU::mmio_r213f() { +uint8 r = 0x00; + regs.latch_hcounter = 0; + regs.latch_vcounter = 0; + + r |= cpu.field() << 7; + if(!(cpu.pio() & 0x80)) { + r |= 0x40; + } else if(regs.counters_latched == true) { + r |= 0x40; + regs.counters_latched = false; + } + r |= (regs.ppu2_mdr & 0x20); + r |= (region << 4); //0 = NTSC, 1 = PAL + r |= (ppu2_version & 0x0f); + regs.ppu2_mdr = r; + return regs.ppu2_mdr; +} + +uint8 PPU::mmio_read(unsigned addr) { + scheduler.sync_cpuppu(); + + switch(addr & 0xffff) { + case 0x2104: + case 0x2105: + case 0x2106: + case 0x2108: + case 0x2109: + case 0x210a: + case 0x2114: + case 0x2115: + case 0x2116: + case 0x2118: + case 0x2119: + case 0x211a: + case 0x2124: + case 0x2125: + case 0x2126: + case 0x2128: + case 0x2129: + case 0x212a: return regs.ppu1_mdr; + case 0x2134: return mmio_r2134(); //MPYL + case 0x2135: return mmio_r2135(); //MPYM + case 0x2136: return mmio_r2136(); //MPYH + case 0x2137: return mmio_r2137(); //SLHV + case 0x2138: return mmio_r2138(); //OAMDATAREAD + case 0x2139: return mmio_r2139(); //VMDATALREAD + case 0x213a: return mmio_r213a(); //VMDATAHREAD + case 0x213b: return mmio_r213b(); //CGDATAREAD + case 0x213c: return mmio_r213c(); //OPHCT + case 0x213d: return mmio_r213d(); //OPVCT + case 0x213e: return mmio_r213e(); //STAT77 + case 0x213f: return mmio_r213f(); //STAT78 + } + + return cpu.regs.mdr; +} + +void PPU::mmio_write(unsigned addr, uint8 data) { + scheduler.sync_cpuppu(); + + switch(addr & 0xffff) { + case 0x2100: return mmio_w2100(data); //INIDISP + case 0x2101: return mmio_w2101(data); //OBSEL + case 0x2102: return mmio_w2102(data); //OAMADDL + case 0x2103: return mmio_w2103(data); //OAMADDH + case 0x2104: return mmio_w2104(data); //OAMDATA + case 0x2105: return mmio_w2105(data); //BGMODE + case 0x2106: return mmio_w2106(data); //MOSAIC + case 0x2107: return mmio_w2107(data); //BG1SC + case 0x2108: return mmio_w2108(data); //BG2SC + case 0x2109: return mmio_w2109(data); //BG3SC + case 0x210a: return mmio_w210a(data); //BG4SC + case 0x210b: return mmio_w210b(data); //BG12NBA + case 0x210c: return mmio_w210c(data); //BG34NBA + case 0x210d: return mmio_w210d(data); //BG1HOFS + case 0x210e: return mmio_w210e(data); //BG1VOFS + case 0x210f: return mmio_w210f(data); //BG2HOFS + case 0x2110: return mmio_w2110(data); //BG2VOFS + case 0x2111: return mmio_w2111(data); //BG3HOFS + case 0x2112: return mmio_w2112(data); //BG3VOFS + case 0x2113: return mmio_w2113(data); //BG4HOFS + case 0x2114: return mmio_w2114(data); //BG4VOFS + case 0x2115: return mmio_w2115(data); //VMAIN + case 0x2116: return mmio_w2116(data); //VMADDL + case 0x2117: return mmio_w2117(data); //VMADDH + case 0x2118: return mmio_w2118(data); //VMDATAL + case 0x2119: return mmio_w2119(data); //VMDATAH + case 0x211a: return mmio_w211a(data); //M7SEL + case 0x211b: return mmio_w211b(data); //M7A + case 0x211c: return mmio_w211c(data); //M7B + case 0x211d: return mmio_w211d(data); //M7C + case 0x211e: return mmio_w211e(data); //M7D + case 0x211f: return mmio_w211f(data); //M7X + case 0x2120: return mmio_w2120(data); //M7Y + case 0x2121: return mmio_w2121(data); //CGADD + case 0x2122: return mmio_w2122(data); //CGDATA + case 0x2123: return mmio_w2123(data); //W12SEL + case 0x2124: return mmio_w2124(data); //W34SEL + case 0x2125: return mmio_w2125(data); //WOBJSEL + case 0x2126: return mmio_w2126(data); //WH0 + case 0x2127: return mmio_w2127(data); //WH1 + case 0x2128: return mmio_w2128(data); //WH2 + case 0x2129: return mmio_w2129(data); //WH3 + case 0x212a: return mmio_w212a(data); //WBGLOG + case 0x212b: return mmio_w212b(data); //WOBJLOG + case 0x212c: return mmio_w212c(data); //TM + case 0x212d: return mmio_w212d(data); //TS + case 0x212e: return mmio_w212e(data); //TMW + case 0x212f: return mmio_w212f(data); //TSW + case 0x2130: return mmio_w2130(data); //CGWSEL + case 0x2131: return mmio_w2131(data); //CGADDSUB + case 0x2132: return mmio_w2132(data); //COLDATA + case 0x2133: return mmio_w2133(data); //SETINI + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/mmio/mmio.hpp b/Mednafen/mednafen/snes/src/ppu/mmio/mmio.hpp new file mode 100755 index 0000000000..ee904c9f4e --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/mmio/mmio.hpp @@ -0,0 +1,198 @@ +struct { + //open bus support + uint8 ppu1_mdr, ppu2_mdr; + + //bg line counters + uint16 bg_y[4]; + + //$2100 + bool display_disabled; + uint8 display_brightness; + + //$2101 + uint8 oam_basesize; + uint8 oam_nameselect; + uint16 oam_tdaddr; + + //$2102-$2103 + uint16 oam_baseaddr; + uint16 oam_addr; + bool oam_priority; + uint8 oam_firstsprite; + + //$2104 + uint8 oam_latchdata; + + //$2105 + bool bg_tilesize[4]; + bool bg3_priority; + uint8 bg_mode; + + //$2106 + uint8 mosaic_size; + bool mosaic_enabled[4]; + uint16 mosaic_countdown; + + //$2107-$210a + uint16 bg_scaddr[4]; + uint8 bg_scsize[4]; + + //$210b-$210c + uint16 bg_tdaddr[4]; + + //$210d-$2114 + uint8 bg_ofslatch; + uint16 m7_hofs, m7_vofs; + uint16 bg_hofs[4]; + uint16 bg_vofs[4]; + + //$2115 + bool vram_incmode; + uint8 vram_mapping; + uint8 vram_incsize; + + //$2116-$2117 + uint16 vram_addr; + + //$211a + uint8 mode7_repeat; + bool mode7_vflip; + bool mode7_hflip; + + //$211b-$2120 + uint8 m7_latch; + uint16 m7a, m7b, m7c, m7d, m7x, m7y; + + //$2121 + uint16 cgram_addr; + + //$2122 + uint8 cgram_latchdata; + + //$2123-$2125 + bool window1_enabled[6]; + bool window1_invert [6]; + bool window2_enabled[6]; + bool window2_invert [6]; + + //$2126-$2129 + uint8 window1_left, window1_right; + uint8 window2_left, window2_right; + + //$212a-$212b + uint8 window_mask[6]; + + //$212c-$212d + bool bg_enabled[5], bgsub_enabled[5]; + + //$212e-$212f + bool window_enabled[5], sub_window_enabled[5]; + + //$2130 + uint8 color_mask, colorsub_mask; + bool addsub_mode; + bool direct_color; + + //$2131 + bool color_mode, color_halve; + bool color_enabled[6]; + + //$2132 + uint8 color_r, color_g, color_b; + uint16 color_rgb; + + //$2133 + //overscan and interlace are checked once per frame to + //determine if entire frame should be interlaced/non-interlace + //and overscan adjusted. therefore, the variables act sort of + //like a buffer, but they do still affect internal rendering + bool mode7_extbg; + bool pseudo_hires; + bool overscan; + uint16 scanlines; + bool oam_interlace; + bool interlace; + + //$2137 + uint16 hcounter, vcounter; + bool latch_hcounter, latch_vcounter; + bool counters_latched; + + //$2139-$213a + uint16 vram_readbuffer; + + //$213e + bool time_over, range_over; + uint16 oam_itemcount, oam_tilecount; +} regs; + +void mmio_w2100(uint8 value); //INIDISP +void mmio_w2101(uint8 value); //OBSEL +void mmio_w2102(uint8 value); //OAMADDL +void mmio_w2103(uint8 value); //OAMADDH +void mmio_w2104(uint8 value); //OAMDATA +void mmio_w2105(uint8 value); //BGMODE +void mmio_w2106(uint8 value); //MOSAIC +void mmio_w2107(uint8 value); //BG1SC +void mmio_w2108(uint8 value); //BG2SC +void mmio_w2109(uint8 value); //BG3SC +void mmio_w210a(uint8 value); //BG4SC +void mmio_w210b(uint8 value); //BG12NBA +void mmio_w210c(uint8 value); //BG34NBA +void mmio_w210d(uint8 value); //BG1HOFS +void mmio_w210e(uint8 value); //BG1VOFS +void mmio_w210f(uint8 value); //BG2HOFS +void mmio_w2110(uint8 value); //BG2VOFS +void mmio_w2111(uint8 value); //BG3HOFS +void mmio_w2112(uint8 value); //BG3VOFS +void mmio_w2113(uint8 value); //BG4HOFS +void mmio_w2114(uint8 value); //BG4VOFS +void mmio_w2115(uint8 value); //VMAIN +void mmio_w2116(uint8 value); //VMADDL +void mmio_w2117(uint8 value); //VMADDH +void mmio_w2118(uint8 value); //VMDATAL +void mmio_w2119(uint8 value); //VMDATAH +void mmio_w211a(uint8 value); //M7SEL +void mmio_w211b(uint8 value); //M7A +void mmio_w211c(uint8 value); //M7B +void mmio_w211d(uint8 value); //M7C +void mmio_w211e(uint8 value); //M7D +void mmio_w211f(uint8 value); //M7X +void mmio_w2120(uint8 value); //M7Y +void mmio_w2121(uint8 value); //CGADD +void mmio_w2122(uint8 value); //CGDATA +void mmio_w2123(uint8 value); //W12SEL +void mmio_w2124(uint8 value); //W34SEL +void mmio_w2125(uint8 value); //WOBJSEL +void mmio_w2126(uint8 value); //WH0 +void mmio_w2127(uint8 value); //WH1 +void mmio_w2128(uint8 value); //WH2 +void mmio_w2129(uint8 value); //WH3 +void mmio_w212a(uint8 value); //WBGLOG +void mmio_w212b(uint8 value); //WOBJLOG +void mmio_w212c(uint8 value); //TM +void mmio_w212d(uint8 value); //TS +void mmio_w212e(uint8 value); //TMW +void mmio_w212f(uint8 value); //TSW +void mmio_w2130(uint8 value); //CGWSEL +void mmio_w2131(uint8 value); //CGADDSUB +void mmio_w2132(uint8 value); //COLDATA +void mmio_w2133(uint8 value); //SETINI + +uint8 mmio_r2134(); //MPYL +uint8 mmio_r2135(); //MPYM +uint8 mmio_r2136(); //MPYH +uint8 mmio_r2137(); //SLHV +uint8 mmio_r2138(); //OAMDATAREAD +uint8 mmio_r2139(); //VMDATALREAD +uint8 mmio_r213a(); //VMDATAHREAD +uint8 mmio_r213b(); //CGDATAREAD +uint8 mmio_r213c(); //OPHCT +uint8 mmio_r213d(); //OPVCT +uint8 mmio_r213e(); //STAT77 +uint8 mmio_r213f(); //STAT78 + +uint8 mmio_read(unsigned addr); +void mmio_write(unsigned addr, uint8 data); + +void latch_counters(); diff --git a/Mednafen/mednafen/snes/src/ppu/ppu-inline.hpp b/Mednafen/mednafen/snes/src/ppu/ppu-inline.hpp new file mode 100755 index 0000000000..489b429e0b --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/ppu-inline.hpp @@ -0,0 +1,85 @@ +//this should only be called by CPU::PPUcounter::tick(); +//keeps track of previous counter positions in history table +void PPUcounter::tick() { + status.hcounter += 2; //increment by smallest unit of time + if(status.hcounter >= 1360 && status.hcounter == lineclocks()) { + status.hcounter = 0; + vcounter_tick(); + } + + history.index = (history.index + 1) & 2047; + history.field [history.index] = status.field; + history.vcounter[history.index] = status.vcounter; + history.hcounter[history.index] = status.hcounter; +} + +//this should only be called by PPU::PPUcounter::tick(n); +//allows stepping by more than the smallest unit of time +void PPUcounter::tick(unsigned clocks) { + status.hcounter += clocks; + if(status.hcounter >= lineclocks()) { + status.hcounter -= lineclocks(); + vcounter_tick(); + } +} + +//internal +void PPUcounter::vcounter_tick() { + if(++status.vcounter == 128) status.interlace = ppu.interlace(); + + if((system.region() == System::NTSC && status.interlace == false && status.vcounter == 262) + || (system.region() == System::NTSC && status.interlace == true && status.vcounter == 263) + || (system.region() == System::NTSC && status.interlace == true && status.vcounter == 262 && status.field == 1) + || (system.region() == System::PAL && status.interlace == false && status.vcounter == 312) + || (system.region() == System::PAL && status.interlace == true && status.vcounter == 313) + || (system.region() == System::PAL && status.interlace == true && status.vcounter == 312 && status.field == 1) + ) { + status.vcounter = 0; + status.field = !status.field; + } + if(scanline) scanline(); +} + +bool PPUcounter::field () const { return status.field; } +uint16 PPUcounter::vcounter() const { return status.vcounter; } +uint16 PPUcounter::hcounter() const { return status.hcounter; } + +bool PPUcounter::field (unsigned offset) const { return history.field [(history.index - (offset >> 1)) & 2047]; } +uint16 PPUcounter::vcounter(unsigned offset) const { return history.vcounter[(history.index - (offset >> 1)) & 2047]; } +uint16 PPUcounter::hcounter(unsigned offset) const { return history.hcounter[(history.index - (offset >> 1)) & 2047]; } + +//one PPU dot = 4 CPU clocks +// +//PPU dots 323 and 327 are 6 CPU clocks long. +//this does not apply to NTSC non-interlace scanline 240 on odd fields. this is +//because the PPU skips one dot to alter the color burst phase of the video signal. +// +//dot 323 range = { 1292, 1294, 1296 } +//dot 327 range = { 1310, 1312, 1314 } + +uint16 PPUcounter::hdot() const { + if(system.region() == System::NTSC && status.interlace == false && vcounter() == 240 && field() == 1) { + return (hcounter() >> 2); + } else { + return (hcounter() - ((hcounter() > 1292) << 1) - ((hcounter() > 1310) << 1)) >> 2; + } +} + +uint16 PPUcounter::lineclocks() const { + if(system.region() == System::NTSC && status.interlace == false && vcounter() == 240 && field() == 1) return 1360; + return 1364; +} + +void PPUcounter::reset() { + status.interlace = false; + status.field = 0; + status.vcounter = 0; + status.hcounter = 0; + history.index = 0; + + for(unsigned i = 0; i < 2048; i++) { + history.field [i] = 0; + history.vcounter[i] = 0; + history.hcounter[i] = 0; + } +} diff --git a/Mednafen/mednafen/snes/src/ppu/ppu.cpp b/Mednafen/mednafen/snes/src/ppu/ppu.cpp new file mode 100755 index 0000000000..d4db9c3fe6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/ppu.cpp @@ -0,0 +1,403 @@ +#include <../base.hpp> + +#define PPU_CPP +namespace bSNES_v059 { + +#if defined(DEBUGGER) + #include "ppu-debugger.cpp" +#endif + +void PPU::enable_renderer(bool r) { status.render_output = r; } +bool PPU::renderer_enabled() { return status.render_output; } + +#if defined(DEBUGGER) + #include "debugger/debugger.cpp" + PPUDebugger ppu; +#else + PPU ppu; +#endif + +#include "memory/memory.cpp" +#include "mmio/mmio.cpp" +#include "render/render.cpp" +#include "serialization.cpp" + +void PPU::enter() { + while(true) { + while(scheduler.sync == Scheduler::SyncAll) { + scheduler.exit(Scheduler::SynchronizeEvent); + } + + //H = 0 (initialize) + scanline(); + add_clocks(10); + + //H = 10 (cache mode7 registers + OAM address reset) + cache.m7_hofs = regs.m7_hofs; + cache.m7_vofs = regs.m7_vofs; + cache.m7a = regs.m7a; + cache.m7b = regs.m7b; + cache.m7c = regs.m7c; + cache.m7d = regs.m7d; + cache.m7x = regs.m7x; + cache.m7y = regs.m7y; + if(vcounter() == (!overscan() ? 225 : 240)) { + if(regs.display_disabled == false) { + regs.oam_addr = regs.oam_baseaddr << 1; + regs.oam_firstsprite = (regs.oam_priority == false) ? 0 : (regs.oam_addr >> 2) & 127; + } + } + add_clocks(502); + + //H = 512 (render) + render_scanline(); + add_clocks(640); + + //H = 1152 (cache OBSEL) + if(cache.oam_basesize != regs.oam_basesize) { + cache.oam_basesize = regs.oam_basesize; + sprite_list_valid = false; + } + cache.oam_nameselect = regs.oam_nameselect; + cache.oam_tdaddr = regs.oam_tdaddr; + add_clocks(lineclocks() - 1152); //seek to start of next scanline + } +} + +void PPU::add_clocks(unsigned clocks) { + tick(clocks); + scheduler.addclocks_ppu(clocks); + scheduler.sync_ppucpu(); +} + +void PPU::scanline() { + line = vcounter(); + + if(line == 0) { + frame(); + + //RTO flag reset + regs.time_over = false; + regs.range_over = false; + } + + if(line == 1) { + //mosaic reset + for(int bg = BG1; bg <= BG4; bg++) regs.bg_y[bg] = 1; + regs.mosaic_countdown = regs.mosaic_size + 1; + regs.mosaic_countdown--; + } else { + for(int bg = BG1; bg <= BG4; bg++) { + if(!regs.mosaic_enabled[bg] || !regs.mosaic_countdown) regs.bg_y[bg] = line; + } + if(!regs.mosaic_countdown) regs.mosaic_countdown = regs.mosaic_size + 1; + regs.mosaic_countdown--; + } +} + +void PPU::render_scanline() { +// #ifdef FAST_FRAMESKIP +// //note: this bypasses RTO status flag calculations, which is observable by software +// if(status.render_output == false) return; +// #endif + + if(line >= 1 && line < (!overscan() ? 225 : 240)) { + render_line_oam_rto(); + if(status.render_output == true) { + render_line(); + } + } + + // + // + // + video.render_scanline(line); +} + +void PPU::frame() { + status.frame_executed = true; + system.frame(); + + if(field() == 0) { + display.interlace = regs.interlace; + regs.scanlines = (regs.overscan == false) ? 224 : 239; + } +} + +void PPU::power() { + ppu1_version = config.ppu1.version; + ppu2_version = config.ppu2.version; + + //PPU::power(); + + for(unsigned i = 0; i < memory::vram.size(); i++) memory::vram[i] = 0x00; + for(unsigned i = 0; i < memory::oam.size(); i++) memory::oam[i] = 0x00; + for(unsigned i = 0; i < memory::cgram.size(); i++) memory::cgram[i] = 0x00; + flush_tiledata_cache(); + + region = (system.region() == System::NTSC ? 0 : 1); //0 = NTSC, 1 = PAL + + //$2100 + regs.display_disabled = true; + regs.display_brightness = 15; + + //$2101 + regs.oam_basesize = 0; + regs.oam_nameselect = 0; + regs.oam_tdaddr = 0x0000; + + cache.oam_basesize = 0; + cache.oam_nameselect = 0; + cache.oam_tdaddr = 0x0000; + + //$2102-$2103 + regs.oam_baseaddr = 0x0000; + regs.oam_addr = 0x0000; + regs.oam_priority = false; + regs.oam_firstsprite = 0; + + //$2104 + regs.oam_latchdata = 0x00; + + //$2105 + regs.bg_tilesize[BG1] = 0; + regs.bg_tilesize[BG2] = 0; + regs.bg_tilesize[BG3] = 0; + regs.bg_tilesize[BG4] = 0; + regs.bg3_priority = 0; + regs.bg_mode = 0; + + //$2106 + regs.mosaic_size = 0; + regs.mosaic_enabled[BG1] = false; + regs.mosaic_enabled[BG2] = false; + regs.mosaic_enabled[BG3] = false; + regs.mosaic_enabled[BG4] = false; + regs.mosaic_countdown = 0; + + //$2107-$210a + regs.bg_scaddr[BG1] = 0x0000; + regs.bg_scaddr[BG2] = 0x0000; + regs.bg_scaddr[BG3] = 0x0000; + regs.bg_scaddr[BG4] = 0x0000; + regs.bg_scsize[BG1] = SC_32x32; + regs.bg_scsize[BG2] = SC_32x32; + regs.bg_scsize[BG3] = SC_32x32; + regs.bg_scsize[BG4] = SC_32x32; + + //$210b-$210c + regs.bg_tdaddr[BG1] = 0x0000; + regs.bg_tdaddr[BG2] = 0x0000; + regs.bg_tdaddr[BG3] = 0x0000; + regs.bg_tdaddr[BG4] = 0x0000; + + //$210d-$2114 + regs.bg_ofslatch = 0x00; + regs.m7_hofs = regs.m7_vofs = 0x0000; + regs.bg_hofs[BG1] = regs.bg_vofs[BG1] = 0x0000; + regs.bg_hofs[BG2] = regs.bg_vofs[BG2] = 0x0000; + regs.bg_hofs[BG3] = regs.bg_vofs[BG3] = 0x0000; + regs.bg_hofs[BG4] = regs.bg_vofs[BG4] = 0x0000; + + //$2115 + regs.vram_incmode = 1; + regs.vram_mapping = 0; + regs.vram_incsize = 1; + + //$2116-$2117 + regs.vram_addr = 0x0000; + + //$211a + regs.mode7_repeat = 0; + regs.mode7_vflip = false; + regs.mode7_hflip = false; + + //$211b-$2120 + regs.m7_latch = 0x00; + regs.m7a = 0x0000; + regs.m7b = 0x0000; + regs.m7c = 0x0000; + regs.m7d = 0x0000; + regs.m7x = 0x0000; + regs.m7y = 0x0000; + + //$2121 + regs.cgram_addr = 0x0000; + + //$2122 + regs.cgram_latchdata = 0x00; + + //$2123-$2125 + regs.window1_enabled[BG1] = false; + regs.window1_enabled[BG2] = false; + regs.window1_enabled[BG3] = false; + regs.window1_enabled[BG4] = false; + regs.window1_enabled[OAM] = false; + regs.window1_enabled[COL] = false; + + regs.window1_invert [BG1] = false; + regs.window1_invert [BG2] = false; + regs.window1_invert [BG3] = false; + regs.window1_invert [BG4] = false; + regs.window1_invert [OAM] = false; + regs.window1_invert [COL] = false; + + regs.window2_enabled[BG1] = false; + regs.window2_enabled[BG2] = false; + regs.window2_enabled[BG3] = false; + regs.window2_enabled[BG4] = false; + regs.window2_enabled[OAM] = false; + regs.window2_enabled[COL] = false; + + regs.window2_invert [BG1] = false; + regs.window2_invert [BG2] = false; + regs.window2_invert [BG3] = false; + regs.window2_invert [BG4] = false; + regs.window2_invert [OAM] = false; + regs.window2_invert [COL] = false; + + //$2126-$2129 + regs.window1_left = 0x00; + regs.window1_right = 0x00; + regs.window2_left = 0x00; + regs.window2_right = 0x00; + + //$212a-$212b + regs.window_mask[BG1] = 0; + regs.window_mask[BG2] = 0; + regs.window_mask[BG3] = 0; + regs.window_mask[BG4] = 0; + regs.window_mask[OAM] = 0; + regs.window_mask[COL] = 0; + + //$212c-$212d + regs.bg_enabled[BG1] = false; + regs.bg_enabled[BG2] = false; + regs.bg_enabled[BG3] = false; + regs.bg_enabled[BG4] = false; + regs.bg_enabled[OAM] = false; + regs.bgsub_enabled[BG1] = false; + regs.bgsub_enabled[BG2] = false; + regs.bgsub_enabled[BG3] = false; + regs.bgsub_enabled[BG4] = false; + regs.bgsub_enabled[OAM] = false; + + //$212e-$212f + regs.window_enabled[BG1] = false; + regs.window_enabled[BG2] = false; + regs.window_enabled[BG3] = false; + regs.window_enabled[BG4] = false; + regs.window_enabled[OAM] = false; + regs.sub_window_enabled[BG1] = false; + regs.sub_window_enabled[BG2] = false; + regs.sub_window_enabled[BG3] = false; + regs.sub_window_enabled[BG4] = false; + regs.sub_window_enabled[OAM] = false; + + //$2130 + regs.color_mask = 0; + regs.colorsub_mask = 0; + regs.addsub_mode = false; + regs.direct_color = false; + + //$2131 + regs.color_mode = 0; + regs.color_halve = false; + regs.color_enabled[BACK] = false; + regs.color_enabled[OAM] = false; + regs.color_enabled[BG4] = false; + regs.color_enabled[BG3] = false; + regs.color_enabled[BG2] = false; + regs.color_enabled[BG1] = false; + + //$2132 + regs.color_r = 0x00; + regs.color_g = 0x00; + regs.color_b = 0x00; + regs.color_rgb = 0x0000; + + //$2133 + regs.mode7_extbg = false; + regs.pseudo_hires = false; + regs.overscan = false; + regs.scanlines = 224; + regs.oam_interlace = false; + regs.interlace = false; + + //$2137 + regs.hcounter = 0; + regs.vcounter = 0; + regs.latch_hcounter = 0; + regs.latch_vcounter = 0; + regs.counters_latched = false; + + //$2139-$213a + regs.vram_readbuffer = 0x0000; + + //$213e + regs.time_over = false; + regs.range_over = false; + + reset(); +} + +void PPU::reset() { + PPUcounter::reset(); + memset(line_output, 0, sizeof(line_output)); + + //PPU::reset(); + PPU::frame(); + + //$2100 + regs.display_disabled = true; + + display.interlace = false; + display.overscan = false; + regs.scanlines = 224; + + memset(sprite_list, 0, sizeof(sprite_list)); + sprite_list_valid = false; + + //open bus support + regs.ppu1_mdr = 0xff; + regs.ppu2_mdr = 0xff; + + //bg line counters + regs.bg_y[0] = 0; + regs.bg_y[1] = 0; + regs.bg_y[2] = 0; + regs.bg_y[3] = 0; +} + +PPU::PPU() { + status.render_output = true; + status.frames_updated = false; + status.frames_rendered = 0; + status.frames_executed = 0; + + alloc_tiledata_cache(); + + for(int l = 0; l < 16; l++) { + for(int i = 0; i < 4096; i++) { + mosaic_table[l][i] = (i / (l + 1)) * (l + 1); + } + } + + for(int l = 0; l < 16; l++) { + double m = (double)l / 15.0; + for(int i = 0; i < 32 * 32; i++) { + int r = (int)((double)((i) & 31) * m + 0.5); + int g = (int)((double)((i >> 5) & 31) * m + 0.5); + r = max(0, min(31, r)); + g = max(0, min(31, g)); + if(i < 32) light_table_b[l][i] = (r << 10); + light_table_gr[l][i] = (g << 5) | (r); + } + } +} + +PPU::~PPU() { + free_tiledata_cache(); +} + +}; diff --git a/Mednafen/mednafen/snes/src/ppu/ppu.hpp b/Mednafen/mednafen/snes/src/ppu/ppu.hpp new file mode 100755 index 0000000000..13147c794b --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/ppu.hpp @@ -0,0 +1,142 @@ +#if defined(DEBUGGER) + #include "ppu-debugger.hpp" +#endif + +//PPUcounter emulates the H/V latch counters of the S-PPU2. +// +//real hardware has the S-CPU maintain its own copy of these counters that are +//updated based on the state of the S-PPU Vblank and Hblank pins. emulating this +//would require full lock-step synchronization for every clock tick. +//to bypass this and allow the two to run out-of-order, both the CPU and PPU +//classes inherit PPUcounter and keep their own counters. +//the timers are kept in sync, as the only differences occur on V=240 and V=261, +//based on interlace. thus, we need only synchronize and fetch interlace at any +//point before this in the frame, which is handled internally by this class at +//V=128. + +class PPUcounter { +public: + alwaysinline void tick(); + alwaysinline void tick(unsigned clocks); + + alwaysinline bool field () const; + alwaysinline uint16 vcounter() const; + alwaysinline uint16 hcounter() const; + inline uint16 hdot() const; + inline uint16 lineclocks() const; + + alwaysinline bool field (unsigned offset) const; + alwaysinline uint16 vcounter(unsigned offset) const; + alwaysinline uint16 hcounter(unsigned offset) const; + + inline void reset(); + function scanline; + void serialize(serializer&); + +private: + inline void vcounter_tick(); + + struct { + bool interlace; + bool field; + uint16 vcounter; + uint16 hcounter; + } status; + + struct { + bool field[2048]; + uint16 vcounter[2048]; + uint16 hcounter[2048]; + + int32 index; + } history; +}; + +class PPU : public PPUcounter, public MMIO { +public: + uint16 line_output[512]; + + struct { + bool render_output; + bool frame_executed; + bool frames_updated; + unsigned frames_rendered; + unsigned frames_executed; + } status; + + //PPU1 version number + //* 1 is known + //* reported by $213e + uint8 ppu1_version; + + //PPU2 version number + //* 1 and 3 are known + //* reported by $213f + uint8 ppu2_version; + + virtual void enable_renderer(bool r); + virtual bool renderer_enabled(); + + #include "memory/memory.hpp" + #include "mmio/mmio.hpp" + #include "render/render.hpp" + + void enter(); + void add_clocks(unsigned clocks); + + uint8 region; + unsigned line; + + enum { NTSC = 0, PAL = 1 }; + enum { BG1 = 0, BG2 = 1, BG3 = 2, BG4 = 3, OAM = 4, BACK = 5, COL = 5 }; + enum { SC_32x32 = 0, SC_64x32 = 1, SC_32x64 = 2, SC_64x64 = 3 }; + + struct { + bool interlace; + bool overscan; + } display; + + struct { + //$2101 + uint8 oam_basesize; + uint8 oam_nameselect; + uint16 oam_tdaddr; + + //$210d-$210e + uint16 m7_hofs, m7_vofs; + + //$211b-$2120 + uint16 m7a, m7b, m7c, m7d, m7x, m7y; + } cache; + + alwaysinline bool interlace() const { return display.interlace; } + alwaysinline bool overscan() const { return display.overscan; } + alwaysinline bool hires() const { return (regs.pseudo_hires || regs.bg_mode == 5 || regs.bg_mode == 6); } + + uint16 light_table_b[16][32]; + uint16 light_table_gr[16][32 * 32]; + uint16 mosaic_table[16][4096]; + void render_line(); + + void update_oam_status(); + //required functions + void run(); + void scanline(); + void render_scanline(); + void frame(); + void power(); + void reset(); + + void serialize(serializer&); + PPU(); + ~PPU(); + + friend class PPUDebug; +}; + +#if defined(DEBUGGER) + #include "debugger/debugger.hpp" + extern PPUDebugger ppu; +#else + extern PPU ppu; +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/addsub.cpp b/Mednafen/mednafen/snes/src/ppu/render/addsub.cpp new file mode 100755 index 0000000000..fc88bad31f --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/addsub.cpp @@ -0,0 +1,25 @@ +#ifdef PPU_CPP + +//color addition / subtraction +//thanks go to blargg for the optimized algorithms +inline uint16 PPU::addsub(uint32 x, uint32 y, bool halve) { + if(!regs.color_mode) { + if(!halve) { + unsigned sum = x + y; + unsigned carry = (sum - ((x ^ y) & 0x0421)) & 0x8420; + return (sum - carry) | (carry - (carry >> 5)); + } else { + return (x + y - ((x ^ y) & 0x0421)) >> 1; + } + } else { + unsigned diff = x - y + 0x8420; + unsigned borrow = (diff - ((x ^ y) & 0x8420)) & 0x8420; + if(!halve) { + return (diff - borrow) & (borrow - (borrow >> 5)); + } else { + return (((diff - borrow) & (borrow - (borrow >> 5))) & 0x7bde) >> 1; + } + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/bg.cpp b/Mednafen/mednafen/snes/src/ppu/render/bg.cpp new file mode 100755 index 0000000000..8612d6c77c --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/bg.cpp @@ -0,0 +1,205 @@ +#ifdef PPU_CPP + +//called once at the start of every rendered scanline +alwaysinline void PPU::update_bg_info() { + const unsigned hires = (regs.bg_mode == 5 || regs.bg_mode == 6); + const unsigned width = (!hires ? 256 : 512); + + for(unsigned bg = 0; bg < 4; bg++) { + bg_info[bg].th = (regs.bg_tilesize[bg] ? 4 : 3); + bg_info[bg].tw = (hires ? 4 : bg_info[bg].th); + + bg_info[bg].mx = (bg_info[bg].th == 4 ? (width << 1) : width); + bg_info[bg].my = bg_info[bg].mx; + if(regs.bg_scsize[bg] & 0x01) bg_info[bg].mx <<= 1; + if(regs.bg_scsize[bg] & 0x02) bg_info[bg].my <<= 1; + bg_info[bg].mx--; + bg_info[bg].my--; + + bg_info[bg].scy = (regs.bg_scsize[bg] & 0x02) ? (32 << 5) : 0; + bg_info[bg].scx = (regs.bg_scsize[bg] & 0x01) ? (32 << 5) : 0; + if(regs.bg_scsize[bg] == 3) bg_info[bg].scy <<= 1; + } +} + +template +uint16 PPU::bg_get_tile(uint16 x, uint16 y) { + x = (x & bg_info[bg].mx) >> bg_info[bg].tw; + y = (y & bg_info[bg].my) >> bg_info[bg].th; + + uint16 pos = ((y & 0x1f) << 5) + (x & 0x1f); + if(y & 0x20) pos += bg_info[bg].scy; + if(x & 0x20) pos += bg_info[bg].scx; + + const uint16 addr = regs.bg_scaddr[bg] + (pos << 1); + return memory::vram[addr] + (memory::vram[addr + 1] << 8); +} + +#define setpixel_main(x) \ + if(pixel_cache[x].pri_main < tile_pri) { \ + pixel_cache[x].pri_main = tile_pri; \ + pixel_cache[x].bg_main = bg; \ + pixel_cache[x].src_main = col; \ + pixel_cache[x].ce_main = false; \ + } + +#define setpixel_sub(x) \ + if(pixel_cache[x].pri_sub < tile_pri) { \ + pixel_cache[x].pri_sub = tile_pri; \ + pixel_cache[x].bg_sub = bg; \ + pixel_cache[x].src_sub = col; \ + pixel_cache[x].ce_sub = false; \ + } + +template +void PPU::render_line_bg(uint8 pri0_pos, uint8 pri1_pos) { + if(regs.bg_enabled[bg] == false && regs.bgsub_enabled[bg] == false) return; + + const bool bg_enabled = regs.bg_enabled[bg]; + const bool bgsub_enabled = regs.bgsub_enabled[bg]; + + const uint16 opt_valid_bit = (bg == BG1) ? 0x2000 : (bg == BG2) ? 0x4000 : 0x0000; + const uint8 bgpal_index = (mode == 0 ? (bg << 5) : 0); + + const uint8 pal_size = 2 << color_depth; //<<2 (*4), <<4 (*16), <<8 (*256) + const uint16 tile_mask = 0x0fff >> color_depth; //0x0fff, 0x07ff, 0x03ff + //4 + color_depth = >>(4-6) -- / {16, 32, 64 } bytes/tile + //index is a tile number count to add to base tile number + const unsigned tiledata_index = regs.bg_tdaddr[bg] >> (4 + color_depth); + + const uint8 *bg_td = bg_tiledata[color_depth]; + const uint8 *bg_td_state = bg_tiledata_state[color_depth]; + + const uint8 tile_width = bg_info[bg].tw; + const uint8 tile_height = bg_info[bg].th; + const uint16 mask_x = bg_info[bg].mx; //screen width mask + const uint16 mask_y = bg_info[bg].my; //screen height mask + + uint16 y = regs.bg_y[bg]; + uint16 hscroll = regs.bg_hofs[bg]; + uint16 vscroll = regs.bg_vofs[bg]; + + const unsigned hires = (mode == 5 || mode == 6); + const unsigned width = (!hires ? 256 : 512); + + if(hires) { + hscroll <<= 1; + if(regs.interlace) y = (y << 1) + field(); + } + + uint16 hval, vval; + uint16 tile_pri, tile_num; + uint8 pal_index, pal_num; + uint16 hoffset, voffset, opt_x, col; + bool mirror_x, mirror_y; + + const uint8 *tile_ptr; + const uint16 *mtable = mosaic_table[regs.mosaic_enabled[bg] ? regs.mosaic_size : 0]; + const bool is_opt_mode = (mode == 2 || mode == 4 || mode == 6); + const bool is_direct_color_mode = (regs.direct_color == true && bg == BG1 && (mode == 3 || mode == 4)); + + build_window_tables(bg); + const uint8 *wt_main = window[bg].main; + const uint8 *wt_sub = window[bg].sub; + + uint16 prev_x = 0xffff, prev_y = 0xffff, prev_optx = 0xffff; + for(uint16 x = 0; x < width; x++) { + hoffset = mtable[x] + hscroll; + voffset = y + vscroll; + + if(is_opt_mode) { + opt_x = (x + (hscroll & 7)); + + //tile 0 is unaffected by OPT mode... + if(opt_x >= 8) { + //cache tile data in hval, vval if possible + if((opt_x >> 3) != (prev_optx >> 3)) { + prev_optx = opt_x; + + hval = bg_get_tile((opt_x - 8) + (regs.bg_hofs[BG3] & ~7), regs.bg_vofs[BG3]); + if(mode != 4) { + vval = bg_get_tile((opt_x - 8) + (regs.bg_hofs[BG3] & ~7), regs.bg_vofs[BG3] + 8); + } + } + + if(mode == 4) { + if(hval & opt_valid_bit) { + if(!(hval & 0x8000)) { + hoffset = opt_x + (hval & ~7); + } else { + voffset = y + hval; + } + } + } else { + if(hval & opt_valid_bit) { + hoffset = opt_x + (hval & ~7); + } + if(vval & opt_valid_bit) { + voffset = y + vval; + } + } + } + } + + hoffset &= mask_x; + voffset &= mask_y; + + if((hoffset >> 3) != prev_x || (voffset >> 3) != prev_y) { + prev_x = (hoffset >> 3); + prev_y = (voffset >> 3); + + tile_num = bg_get_tile(hoffset, voffset); //format = vhopppcc cccccccc + mirror_y = (tile_num & 0x8000); + mirror_x = (tile_num & 0x4000); + tile_pri = (tile_num & 0x2000) ? pri1_pos : pri0_pos; + pal_num = ((tile_num >> 10) & 7); + pal_index = bgpal_index + (pal_num << pal_size); + + if(tile_width == 4) { //16x16 horizontal tile mirroring + if((bool)(hoffset & 8) != mirror_x) tile_num++; + } + + if(tile_height == 4) { //16x16 vertical tile mirroring + if((bool)(voffset & 8) != mirror_y) tile_num += 16; + } + + tile_num &= 0x03ff; + tile_num += tiledata_index; + tile_num &= tile_mask; + + if(bg_td_state[tile_num] == 1) { + render_bg_tile(tile_num); + } + + if(mirror_y) voffset ^= 7; //invert y tile pos + tile_ptr = bg_td + (tile_num * 64) + ((voffset & 7) * 8); + } + + if(mirror_x) hoffset ^= 7; //invert x tile pos + col = *(tile_ptr + (hoffset & 7)); + if(col) { + if(is_direct_color_mode) { + col = get_direct_color(pal_num, col); + } else { + col = get_palette(col + pal_index); + } + + if(!hires) { + if(bg_enabled == true && !wt_main[x]) { setpixel_main(x); } + if(bgsub_enabled == true && !wt_sub[x]) { setpixel_sub(x); } + } else { + int hx = x >> 1; + if(x & 1) { + if(bg_enabled == true && !wt_main[hx]) { setpixel_main(hx); } + } else { + if(bgsub_enabled == true && !wt_sub[hx]) { setpixel_sub(hx); } + } + } + } + } +} + +#undef setpixel_main +#undef setpixel_sub + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/cache.cpp b/Mednafen/mednafen/snes/src/ppu/render/cache.cpp new file mode 100755 index 0000000000..2ca48280f6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/cache.cpp @@ -0,0 +1,147 @@ +#ifdef PPU_CPP + +#define render_bg_tile_line_2bpp(mask) \ + col = !!(d0 & mask) << 0; \ + col += !!(d1 & mask) << 1; \ + *dest++ = col + +#define render_bg_tile_line_4bpp(mask) \ + col = !!(d0 & mask) << 0; \ + col += !!(d1 & mask) << 1; \ + col += !!(d2 & mask) << 2; \ + col += !!(d3 & mask) << 3; \ + *dest++ = col + +#define render_bg_tile_line_8bpp(mask) \ + col = !!(d0 & mask) << 0; \ + col += !!(d1 & mask) << 1; \ + col += !!(d2 & mask) << 2; \ + col += !!(d3 & mask) << 3; \ + col += !!(d4 & mask) << 4; \ + col += !!(d5 & mask) << 5; \ + col += !!(d6 & mask) << 6; \ + col += !!(d7 & mask) << 7; \ + *dest++ = col + +template +void PPU::render_bg_tile(uint16 tile_num) { + uint8 col, d0, d1, d2, d3, d4, d5, d6, d7; + + if(color_depth == COLORDEPTH_4) { + uint8 *dest = (uint8*)bg_tiledata[TILE_2BIT] + tile_num * 64; + unsigned pos = tile_num * 16; + unsigned y = 8; + while(y--) { + d0 = memory::vram[pos ]; + d1 = memory::vram[pos + 1]; + render_bg_tile_line_2bpp(0x80); + render_bg_tile_line_2bpp(0x40); + render_bg_tile_line_2bpp(0x20); + render_bg_tile_line_2bpp(0x10); + render_bg_tile_line_2bpp(0x08); + render_bg_tile_line_2bpp(0x04); + render_bg_tile_line_2bpp(0x02); + render_bg_tile_line_2bpp(0x01); + pos += 2; + } + bg_tiledata_state[TILE_2BIT][tile_num] = 0; + } + + if(color_depth == COLORDEPTH_16) { + uint8 *dest = (uint8*)bg_tiledata[TILE_4BIT] + tile_num * 64; + unsigned pos = tile_num * 32; + unsigned y = 8; + while(y--) { + d0 = memory::vram[pos ]; + d1 = memory::vram[pos + 1]; + d2 = memory::vram[pos + 16]; + d3 = memory::vram[pos + 17]; + render_bg_tile_line_4bpp(0x80); + render_bg_tile_line_4bpp(0x40); + render_bg_tile_line_4bpp(0x20); + render_bg_tile_line_4bpp(0x10); + render_bg_tile_line_4bpp(0x08); + render_bg_tile_line_4bpp(0x04); + render_bg_tile_line_4bpp(0x02); + render_bg_tile_line_4bpp(0x01); + pos += 2; + } + bg_tiledata_state[TILE_4BIT][tile_num] = 0; + } + + if(color_depth == COLORDEPTH_256) { + uint8 *dest = (uint8*)bg_tiledata[TILE_8BIT] + tile_num * 64; + unsigned pos = tile_num * 64; + unsigned y = 8; + while(y--) { + d0 = memory::vram[pos ]; + d1 = memory::vram[pos + 1]; + d2 = memory::vram[pos + 16]; + d3 = memory::vram[pos + 17]; + d4 = memory::vram[pos + 32]; + d5 = memory::vram[pos + 33]; + d6 = memory::vram[pos + 48]; + d7 = memory::vram[pos + 49]; + render_bg_tile_line_8bpp(0x80); + render_bg_tile_line_8bpp(0x40); + render_bg_tile_line_8bpp(0x20); + render_bg_tile_line_8bpp(0x10); + render_bg_tile_line_8bpp(0x08); + render_bg_tile_line_8bpp(0x04); + render_bg_tile_line_8bpp(0x02); + render_bg_tile_line_8bpp(0x01); + pos += 2; + } + bg_tiledata_state[TILE_8BIT][tile_num] = 0; + } +} + +#undef render_bg_tile_line_2bpp +#undef render_bg_tile_line_4bpp +#undef render_bg_tile_line_8bpp + +void PPU::flush_pixel_cache() { + uint16 main = get_palette(0); + uint16 sub = (regs.pseudo_hires || regs.bg_mode == 5 || regs.bg_mode == 6) + ? main + : regs.color_rgb; + + unsigned i = 255; + do { + pixel_cache[i].src_main = main; + pixel_cache[i].src_sub = sub; + pixel_cache[i].bg_main = BACK; + pixel_cache[i].bg_sub = BACK; + pixel_cache[i].ce_main = false; + pixel_cache[i].ce_sub = false; + pixel_cache[i].pri_main = 0; + pixel_cache[i].pri_sub = 0; + } while(i--); +} + +void PPU::alloc_tiledata_cache() { + bg_tiledata[TILE_2BIT] = new uint8_t[262144](); + bg_tiledata[TILE_4BIT] = new uint8_t[131072](); + bg_tiledata[TILE_8BIT] = new uint8_t[ 65536](); + bg_tiledata_state[TILE_2BIT] = new uint8_t[ 4096](); + bg_tiledata_state[TILE_4BIT] = new uint8_t[ 2048](); + bg_tiledata_state[TILE_8BIT] = new uint8_t[ 1024](); +} + +//marks all tiledata cache entries as dirty +void PPU::flush_tiledata_cache() { + for(unsigned i = 0; i < 4096; i++) bg_tiledata_state[TILE_2BIT][i] = 1; + for(unsigned i = 0; i < 2048; i++) bg_tiledata_state[TILE_4BIT][i] = 1; + for(unsigned i = 0; i < 1024; i++) bg_tiledata_state[TILE_8BIT][i] = 1; +} + +void PPU::free_tiledata_cache() { + delete[] bg_tiledata[TILE_2BIT]; + delete[] bg_tiledata[TILE_4BIT]; + delete[] bg_tiledata[TILE_8BIT]; + delete[] bg_tiledata_state[TILE_2BIT]; + delete[] bg_tiledata_state[TILE_4BIT]; + delete[] bg_tiledata_state[TILE_8BIT]; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/line.cpp b/Mednafen/mednafen/snes/src/ppu/render/line.cpp new file mode 100755 index 0000000000..9cf09cb601 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/line.cpp @@ -0,0 +1,130 @@ +#ifdef PPU_CPP + +alwaysinline uint16 PPU::get_palette(uint8 index) { + const unsigned addr = index << 1; + return memory::cgram[addr] + (memory::cgram[addr + 1] << 8); +} + +//p = 00000bgr +//t = BBGGGRRR +//r = 0BBb00GGGg0RRRr0 +alwaysinline uint16 PPU::get_direct_color(uint8 p, uint8 t) { + return ((t & 7) << 2) | ((p & 1) << 1) | + (((t >> 3) & 7) << 7) | (((p >> 1) & 1) << 6) | + ((t >> 6) << 13) | ((p >> 2) << 12); +} + +alwaysinline uint16 PPU::get_pixel_normal(uint32 x) { + pixel_t &p = pixel_cache[x]; + uint16 src_main, src_sub; + uint8 bg_sub; + src_main = p.src_main; + + if(!regs.addsub_mode) { + bg_sub = BACK; + src_sub = regs.color_rgb; + } else { + bg_sub = p.bg_sub; + src_sub = p.src_sub; + } + + if(!window[COL].main[x]) { + if(!window[COL].sub[x]) { + return 0x0000; + } + src_main = 0x0000; + } + + if(!p.ce_main && regs.color_enabled[p.bg_main] && window[COL].sub[x]) { + bool halve = false; + if(regs.color_halve && window[COL].main[x]) { + if(regs.addsub_mode && bg_sub == BACK); + else { + halve = true; + } + } + return addsub(src_main, src_sub, halve); + } + + return src_main; +} + +alwaysinline uint16 PPU::get_pixel_swap(uint32 x) { + pixel_t &p = pixel_cache[x]; + uint16 src_main, src_sub; + uint8 bg_sub; + src_main = p.src_sub; + + if(!regs.addsub_mode) { + bg_sub = BACK; + src_sub = regs.color_rgb; + } else { + bg_sub = p.bg_main; + src_sub = p.src_main; + } + + if(!window[COL].main[x]) { + if(!window[COL].sub[x]) { + return 0x0000; + } + src_main = 0x0000; + } + + if(!p.ce_sub && regs.color_enabled[p.bg_sub] && window[COL].sub[x]) { + bool halve = false; + if(regs.color_halve && window[COL].main[x]) { + if(regs.addsub_mode && bg_sub == BACK); + else { + halve = true; + } + } + return addsub(src_main, src_sub, halve); + } + + return src_main; +} + +alwaysinline void PPU::render_line_output() { + //printf("RLO: %u\n", line); + uint16 *ptr = line_output; + uint16 *luma_b = light_table_b [regs.display_brightness]; + uint16 *luma_gr = light_table_gr[regs.display_brightness]; + uint16 curr; + + if(!regs.pseudo_hires && regs.bg_mode != 5 && regs.bg_mode != 6) { + if(regs.display_brightness == 15) { + for(unsigned x = 0; x < 256; x++) { + *ptr++ = get_pixel_normal(x); + } + } else { + for(unsigned x = 0; x < 256; x++) { + curr = get_pixel_normal(x); + *ptr++ = luma_b[curr >> 10] + luma_gr[curr & 0x3ff]; + } + } + } else { + //printf("%d %d\n", regs.pseudo_hires, regs.bg_mode); + if(regs.display_brightness == 15) { + for(unsigned x = 0, prev = 0; x < 256; x++) { + *ptr++ = get_pixel_swap(x); + *ptr++ = get_pixel_normal(x); + } + } else { + for(unsigned x = 0, prev = 0; x < 256; x++) { + curr = get_pixel_swap(x); + *ptr++ = luma_b[curr >> 10] + luma_gr[curr & 0x3ff]; + + curr = get_pixel_normal(x); + *ptr++ = luma_b[curr >> 10] + luma_gr[curr & 0x3ff]; + } + } + line_output[0] = (line_output[0] & 0x7FFF) | (regs.pseudo_hires ? 0x8000 : 0); + } +} + +alwaysinline void PPU::render_line_clear() { + uint16 width = (!regs.pseudo_hires && regs.bg_mode != 5 && regs.bg_mode != 6) ? 256 : 512; + memset(line_output, 0, width * sizeof(uint16)); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/mode7.cpp b/Mednafen/mednafen/snes/src/ppu/render/mode7.cpp new file mode 100755 index 0000000000..9519492284 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/mode7.cpp @@ -0,0 +1,139 @@ +#ifdef PPU_CPP + +//bsnes mode7 renderer +// +//base algorithm written by anomie +//bsnes implementation written by byuu +// +//supports mode 7 + extbg + rotate + zoom + direct color + scrolling + m7sel + windowing + mosaic +//interlace and pseudo-hires support are automatic via main rendering routine + +//13-bit sign extend +//--s---vvvvvvvvvv -> ssssssvvvvvvvvvv +#define CLIP(x) ( ((x) & 0x2000) ? ( (x) | ~0x03ff) : ((x) & 0x03ff) ) + +template +void PPU::render_line_mode7(uint8 pri0_pos, uint8 pri1_pos) { + if(regs.bg_enabled[bg] == false && regs.bgsub_enabled[bg] == false) return; + + int32 px, py; + int32 tx, ty, tile, palette; + + int32 a = sclip<16>(cache.m7a); + int32 b = sclip<16>(cache.m7b); + int32 c = sclip<16>(cache.m7c); + int32 d = sclip<16>(cache.m7d); + + int32 cx = sclip<13>(cache.m7x); + int32 cy = sclip<13>(cache.m7y); + int32 hofs = sclip<13>(cache.m7_hofs); + int32 vofs = sclip<13>(cache.m7_vofs); + + int _pri, _x; + bool _bg_enabled = regs.bg_enabled[bg]; + bool _bgsub_enabled = regs.bgsub_enabled[bg]; + + build_window_tables(bg); + uint8 *wt_main = window[bg].main; + uint8 *wt_sub = window[bg].sub; + + int32 y = (regs.mode7_vflip == false ? line : 255 - line); + + uint16 *mtable_x, *mtable_y; + if(bg == BG1) { + mtable_x = (uint16*)mosaic_table[(regs.mosaic_enabled[BG1] == true) ? regs.mosaic_size : 0]; + mtable_y = (uint16*)mosaic_table[(regs.mosaic_enabled[BG1] == true) ? regs.mosaic_size : 0]; + } else { //bg == BG2 + //Mode7 EXTBG BG2 uses BG1 mosaic enable to control vertical mosaic, + //and BG2 mosaic enable to control horizontal mosaic... + mtable_x = (uint16*)mosaic_table[(regs.mosaic_enabled[BG2] == true) ? regs.mosaic_size : 0]; + mtable_y = (uint16*)mosaic_table[(regs.mosaic_enabled[BG1] == true) ? regs.mosaic_size : 0]; + } + + int32 psx = ((a * CLIP(hofs - cx)) & ~63) + ((b * CLIP(vofs - cy)) & ~63) + ((b * mtable_y[y]) & ~63) + (cx << 8); + int32 psy = ((c * CLIP(hofs - cx)) & ~63) + ((d * CLIP(vofs - cy)) & ~63) + ((d * mtable_y[y]) & ~63) + (cy << 8); + for(int32 x = 0; x < 256; x++) { + px = psx + (a * mtable_x[x]); + py = psy + (c * mtable_x[x]); + + //mask floating-point bits (low 8 bits) + px >>= 8; + py >>= 8; + + switch(regs.mode7_repeat) { + case 0: //screen repetition outside of screen area + case 1: { //same as case 0 + px &= 1023; + py &= 1023; + tx = ((px >> 3) & 127); + ty = ((py >> 3) & 127); + tile = memory::vram[(ty * 128 + tx) << 1]; + palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; + } break; + case 2: { //palette color 0 outside of screen area + if(px < 0 || px > 1023 || py < 0 || py > 1023) { + palette = 0; + } else { + px &= 1023; + py &= 1023; + tx = ((px >> 3) & 127); + ty = ((py >> 3) & 127); + tile = memory::vram[(ty * 128 + tx) << 1]; + palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; + } + } break; + case 3: { //character 0 repetition outside of screen area + if(px < 0 || px > 1023 || py < 0 || py > 1023) { + tile = 0; + } else { + px &= 1023; + py &= 1023; + tx = ((px >> 3) & 127); + ty = ((py >> 3) & 127); + tile = memory::vram[(ty * 128 + tx) << 1]; + } + palette = memory::vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; + } break; + } + + if(bg == BG1) { + _pri = pri0_pos; + } else { + _pri = (palette >> 7) ? pri1_pos : pri0_pos; + palette &= 0x7f; + } + + if(!palette) continue; + + _x = (regs.mode7_hflip == false) ? (x) : (255 - x); + + uint32 col; + if(regs.direct_color == true && bg == BG1) { + //direct color mode does not apply to bg2, as it is only 128 colors... + col = get_direct_color(0, palette); + } else { + col = get_palette(palette); + } + + if(regs.bg_enabled[bg] == true && !wt_main[_x]) { + if(pixel_cache[_x].pri_main < _pri) { + pixel_cache[_x].pri_main = _pri; + pixel_cache[_x].bg_main = bg; + pixel_cache[_x].src_main = col; + pixel_cache[_x].ce_main = false; + } + } + if(regs.bgsub_enabled[bg] == true && !wt_sub[_x]) { + if(pixel_cache[_x].pri_sub < _pri) { + pixel_cache[_x].pri_sub = _pri; + pixel_cache[_x].bg_sub = bg; + pixel_cache[_x].src_sub = col; + pixel_cache[_x].ce_sub = false; + } + } + } +} + +#undef CLIP + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/oam.cpp b/Mednafen/mednafen/snes/src/ppu/render/oam.cpp new file mode 100755 index 0000000000..a5e7f74b8b --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/oam.cpp @@ -0,0 +1,217 @@ +#ifdef PPU_CPP + +void PPU::build_sprite_list() { + if(sprite_list_valid == true) return; + sprite_list_valid = true; + + const uint8 *tableA = memory::oam.data(); + const uint8 *tableB = memory::oam.data() + 512; + + for(unsigned i = 0; i < 128; i++) { + const bool x = *tableB & (1 << ((i & 3) << 1)); //0x01, 0x04, 0x10, 0x40 + const bool size = *tableB & (2 << ((i & 3) << 1)); //0x02, 0x08, 0x20, 0x80 + + switch(cache.oam_basesize) { + case 0: sprite_list[i].width = (!size) ? 8 : 16; + sprite_list[i].height = (!size) ? 8 : 16; + break; + case 1: sprite_list[i].width = (!size) ? 8 : 32; + sprite_list[i].height = (!size) ? 8 : 32; + break; + case 2: sprite_list[i].width = (!size) ? 8 : 64; + sprite_list[i].height = (!size) ? 8 : 64; + break; + case 3: sprite_list[i].width = (!size) ? 16 : 32; + sprite_list[i].height = (!size) ? 16 : 32; + break; + case 4: sprite_list[i].width = (!size) ? 16 : 64; + sprite_list[i].height = (!size) ? 16 : 64; + break; + case 5: sprite_list[i].width = (!size) ? 32 : 64; + sprite_list[i].height = (!size) ? 32 : 64; + break; + case 6: sprite_list[i].width = (!size) ? 16 : 32; + sprite_list[i].height = (!size) ? 32 : 64; + if(regs.oam_interlace && !size) sprite_list[i].height = 16; + //32x64 height is not affected by oam_interlace setting + break; + case 7: sprite_list[i].width = (!size) ? 16 : 32; + sprite_list[i].height = (!size) ? 32 : 32; + if(regs.oam_interlace && !size) sprite_list[i].height = 16; + break; + } + + sprite_list[i].x = (x << 8) + tableA[0]; + sprite_list[i].y = (tableA[1] + 1) & 0xff; + sprite_list[i].character = tableA[2]; + sprite_list[i].vflip = tableA[3] & 0x80; + sprite_list[i].hflip = tableA[3] & 0x40; + sprite_list[i].priority = (tableA[3] >> 4) & 3; + sprite_list[i].palette = (tableA[3] >> 1) & 7; + sprite_list[i].use_nameselect = tableA[3] & 1; + + tableA += 4; + if((i & 3) == 3) tableB++; + } +} + +alwaysinline bool PPU::is_sprite_on_scanline() { + //if sprite is entirely offscreen and doesn't wrap around to the left side of the screen, + //then it is not counted. this *should* be 256, and not 255, even though dot 256 is offscreen. + sprite_item *spr = &sprite_list[active_sprite]; + if(spr->x > 256 && (spr->x + spr->width - 1) < 512) return false; + + int spr_height = (regs.oam_interlace == false) ? (spr->height) : (spr->height >> 1); + if(line >= spr->y && line < (spr->y + spr_height)) return true; + if((spr->y + spr_height) >= 256 && line < ((spr->y + spr_height) & 255)) return true; + return false; +} + +alwaysinline void PPU::load_oam_tiles() { + sprite_item *spr = &sprite_list[active_sprite]; + uint16 tile_width = spr->width >> 3; + int x = spr->x; + int y = (line - spr->y) & 0xff; + if(regs.oam_interlace == true) { + y <<= 1; + } + + if(spr->vflip == true) { + if(spr->width == spr->height) { + y = (spr->height - 1) - y; + } else { + y = (y < spr->width) ? ((spr->width - 1) - y) : (spr->width + ((spr->width - 1) - (y - spr->width))); + } + } + + if(regs.oam_interlace == true) { + y = (spr->vflip == false) ? (y + field()) : (y - field()); + } + + x &= 511; + y &= 255; + + uint16 tdaddr = cache.oam_tdaddr; + uint16 chrx = (spr->character ) & 15; + uint16 chry = (spr->character >> 4) & 15; + if(spr->use_nameselect == true) { + tdaddr += (256 * 32) + (cache.oam_nameselect << 13); + } + chry += (y >> 3); + chry &= 15; + chry <<= 4; + + for(unsigned tx = 0; tx < tile_width; tx++) { + unsigned sx = (x + (tx << 3)) & 511; + //ignore sprites that are offscreen, x==256 is a special case that loads all tiles in OBJ + if(x != 256 && sx >= 256 && (sx + 7) < 512) continue; + + if(regs.oam_tilecount++ > 34) break; + unsigned n = regs.oam_tilecount - 1; + oam_tilelist[n].x = sx; + oam_tilelist[n].y = y; + oam_tilelist[n].pri = spr->priority; + oam_tilelist[n].pal = 128 + (spr->palette << 4); + oam_tilelist[n].hflip = spr->hflip; + + unsigned mx = (spr->hflip == false) ? tx : ((tile_width - 1) - tx); + unsigned pos = tdaddr + ((chry + ((chrx + mx) & 15)) << 5); + oam_tilelist[n].tile = (pos >> 5) & 0x07ff; + } +} + +void PPU::render_oam_tile(int tile_num) { + oam_tileitem *t = &oam_tilelist[tile_num]; + uint8 *oam_td = (uint8*)bg_tiledata[COLORDEPTH_16]; + uint8 *oam_td_state = (uint8*)bg_tiledata_state[COLORDEPTH_16]; + + if(oam_td_state[t->tile] == 1) { + render_bg_tile(t->tile); + } + + unsigned sx = t->x; + uint8 *tile_ptr = (uint8*)oam_td + (t->tile << 6) + ((t->y & 7) << 3); + for(unsigned x = 0; x < 8; x++) { + sx &= 511; + if(sx < 256) { + unsigned col = *(tile_ptr + ((t->hflip == false) ? x : (7 - x))); + if(col) { + col += t->pal; + oam_line_pal[sx] = col; + oam_line_pri[sx] = t->pri; + } + } + sx++; + } +} + +alwaysinline void PPU::render_line_oam_rto() { + build_sprite_list(); + + regs.oam_itemcount = 0; + regs.oam_tilecount = 0; + memset(oam_line_pri, OAM_PRI_NONE, 256); + memset(oam_itemlist, 0xff, 32); + for(int s = 0; s < 34; s++) oam_tilelist[s].tile = 0xffff; + + for(int s = 0; s < 128; s++) { + active_sprite = (s + regs.oam_firstsprite) & 127; + if(is_sprite_on_scanline() == false) continue; + if(regs.oam_itemcount++ > 32) break; + oam_itemlist[regs.oam_itemcount - 1] = (s + regs.oam_firstsprite) & 127; + } + + for(int s = 31; s >= 0; s--) { + if(oam_itemlist[s] == 0xff) continue; + active_sprite = oam_itemlist[s]; + load_oam_tiles(); + } + + regs.time_over |= (regs.oam_tilecount > 34); + regs.range_over |= (regs.oam_itemcount > 32); +} + +#define setpixel_main(x) \ + if(pixel_cache[x].pri_main < pri) { \ + pixel_cache[x].pri_main = pri; \ + pixel_cache[x].bg_main = OAM; \ + pixel_cache[x].src_main = get_palette(oam_line_pal[x]); \ + pixel_cache[x].ce_main = (oam_line_pal[x] < 192); \ + } +#define setpixel_sub(x) \ + if(pixel_cache[x].pri_sub < pri) { \ + pixel_cache[x].pri_sub = pri; \ + pixel_cache[x].bg_sub = OAM; \ + pixel_cache[x].src_sub = get_palette(oam_line_pal[x]); \ + pixel_cache[x].ce_sub = (oam_line_pal[x] < 192); \ + } + +void PPU::render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos) { + if(regs.bg_enabled[OAM] == false && regs.bgsub_enabled[OAM] == false) return; + + for(unsigned s = 0; s < 34; s++) { + if(oam_tilelist[s].tile == 0xffff) continue; + render_oam_tile(s); + } + + bool bg_enabled = regs.bg_enabled[OAM]; + bool bgsub_enabled = regs.bgsub_enabled[OAM]; + + build_window_tables(OAM); + uint8 *wt_main = window[OAM].main; + uint8 *wt_sub = window[OAM].sub; + + unsigned pri_tbl[4] = { pri0_pos, pri1_pos, pri2_pos, pri3_pos }; + for(int x = 0; x < 256; x++) { + if(oam_line_pri[x] == OAM_PRI_NONE) continue; + + unsigned pri = pri_tbl[oam_line_pri[x]]; + if(bg_enabled == true && !wt_main[x]) { setpixel_main(x); } + if(bgsub_enabled == true && !wt_sub[x]) { setpixel_sub(x); } + } +} + +#undef setpixel_main +#undef setpixel_sub + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/render.cpp b/Mednafen/mednafen/snes/src/ppu/render/render.cpp new file mode 100755 index 0000000000..c185fa0a1e --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/render.cpp @@ -0,0 +1,129 @@ +#ifdef PPU_CPP + +#include "cache.cpp" +#include "windows.cpp" +#include "bg.cpp" +#include "oam.cpp" +#include "mode7.cpp" +#include "addsub.cpp" +#include "line.cpp" + +//Mode 0: -> +// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 +// BG4B, BG3B, OAM0, BG4A, BG3A, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +void PPU::render_line_mode0() { + render_line_bg<0, BG1, COLORDEPTH_4>(8, 11); + render_line_bg<0, BG2, COLORDEPTH_4>(7, 10); + render_line_bg<0, BG3, COLORDEPTH_4>(2, 5); + render_line_bg<0, BG4, COLORDEPTH_4>(1, 4); + render_line_oam(3, 6, 9, 12); +} + +//Mode 1 (pri=1): -> +// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 +// BG3B, OAM0, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3, BG3A +// +//Mode 1 (pri=0): -> +// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 +// BG3B, OAM0, BG3A, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +void PPU::render_line_mode1() { + if(regs.bg3_priority) { + render_line_bg<1, BG1, COLORDEPTH_16>(5, 8); + render_line_bg<1, BG2, COLORDEPTH_16>(4, 7); + render_line_bg<1, BG3, COLORDEPTH_4 >(1, 10); + render_line_oam(2, 3, 6, 9); + } else { + render_line_bg<1, BG1, COLORDEPTH_16>(6, 9); + render_line_bg<1, BG2, COLORDEPTH_16>(5, 8); + render_line_bg<1, BG3, COLORDEPTH_4 >(1, 3); + render_line_oam(2, 4, 7, 10); + } +} + +//Mode 2: -> +// 1, 2, 3, 4, 5, 6, 7, 8 +// BG2B, OAM0, BG1B, OAM1, BG2A, OAM2, BG1A, OAM3 +void PPU::render_line_mode2() { + render_line_bg<2, BG1, COLORDEPTH_16>(3, 7); + render_line_bg<2, BG2, COLORDEPTH_16>(1, 5); + render_line_oam(2, 4, 6, 8); +} + +//Mode 3: -> +// 1, 2, 3, 4, 5, 6, 7, 8 +// BG2B, OAM0, BG1B, OAM1, BG2A, OAM2, BG1A, OAM3 +void PPU::render_line_mode3() { + render_line_bg<3, BG1, COLORDEPTH_256>(3, 7); + render_line_bg<3, BG2, COLORDEPTH_16 >(1, 5); + render_line_oam(2, 4, 6, 8); +} + +//Mode 4: -> +// 1, 2, 3, 4, 5, 6, 7, 8 +// BG2B, OAM0, BG1B, OAM1, BG2A, OAM2, BG1A, OAM3 +void PPU::render_line_mode4() { + render_line_bg<4, BG1, COLORDEPTH_256>(3, 7); + render_line_bg<4, BG2, COLORDEPTH_4 >(1, 5); + render_line_oam(2, 4, 6, 8); +} + +//Mode 5: -> +// 1, 2, 3, 4, 5, 6, 7, 8 +// BG2B, OAM0, BG1B, OAM1, BG2A, OAM2, BG1A, OAM3 +void PPU::render_line_mode5() { + render_line_bg<5, BG1, COLORDEPTH_16>(3, 7); + render_line_bg<5, BG2, COLORDEPTH_4 >(1, 5); + render_line_oam(2, 4, 6, 8); +} + +//Mode 6: -> +// 1, 2, 3, 4, 5, 6 +// OAM0, BG1B, OAM1, OAM2, BG1A, OAM3 +void PPU::render_line_mode6() { + render_line_bg<6, BG1, COLORDEPTH_16>(2, 5); + render_line_oam(1, 3, 4, 6); +} + +//Mode7: -> +// 1, 2, 3, 4, 5 +// OAM0, BG1n, OAM1, OAM2, OAM3 + +//Mode 7 EXTBG: -> +// 1, 2, 3, 4, 5, 6, 7 +// BG2B, OAM0, BG1n, OAM1, BG2A, OAM2, OAM3 +void PPU::render_line_mode7() { + if(regs.mode7_extbg == false) { + render_line_mode7(2, 2); + render_line_oam(1, 3, 4, 5); + } else { + render_line_mode7(3, 3); + render_line_mode7(1, 5); + render_line_oam(2, 4, 6, 7); + } +} + +void PPU::render_line() { + if(regs.display_disabled == true) { + render_line_clear(); + return; + } + + flush_pixel_cache(); + build_window_tables(COL); + update_bg_info(); + + switch(regs.bg_mode) { + case 0: render_line_mode0(); break; + case 1: render_line_mode1(); break; + case 2: render_line_mode2(); break; + case 3: render_line_mode3(); break; + case 4: render_line_mode4(); break; + case 5: render_line_mode5(); break; + case 6: render_line_mode6(); break; + case 7: render_line_mode7(); break; + } + + render_line_output(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/render/render.hpp b/Mednafen/mednafen/snes/src/ppu/render/render.hpp new file mode 100755 index 0000000000..6de43e41f3 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/render.hpp @@ -0,0 +1,97 @@ +//render.cpp +debugvirtual inline void render_line_mode0(); +debugvirtual inline void render_line_mode1(); +debugvirtual inline void render_line_mode2(); +debugvirtual inline void render_line_mode3(); +debugvirtual inline void render_line_mode4(); +debugvirtual inline void render_line_mode5(); +debugvirtual inline void render_line_mode6(); +debugvirtual inline void render_line_mode7(); + +//cache.cpp +enum { COLORDEPTH_4 = 0, COLORDEPTH_16 = 1, COLORDEPTH_256 = 2 }; +enum { TILE_2BIT = 0, TILE_4BIT = 1, TILE_8BIT = 2 }; + +struct pixel_t { + //bgr555 color data for main/subscreen pixels: 0x0000 = transparent / use palette color # 0 + //needs to be bgr555 instead of palette index for direct color mode ($2130 bit 0) to work + uint16 src_main, src_sub; + //indicates source of palette # for main/subscreen (BG1-4, OAM, or back) + uint8 bg_main, bg_sub; + //color_exemption -- true when bg == OAM && palette index >= 192, disables color add/sub effects + uint8 ce_main, ce_sub; + //priority level of src_n. to set src_n, + //the priority of the pixel must be >pri_n + uint8 pri_main, pri_sub; +} pixel_cache[256]; + +uint8 *bg_tiledata[3]; +uint8 *bg_tiledata_state[3]; //0 = valid, 1 = dirty + +template void render_bg_tile(uint16 tile_num); +inline void flush_pixel_cache(); +void alloc_tiledata_cache(); +void flush_tiledata_cache(); +void free_tiledata_cache(); + +//windows.cpp +struct window_t { + uint8 main[256], sub[256]; +} window[6]; + +void build_window_table(uint8 bg, bool mainscreen); +void build_window_tables(uint8 bg); + +//bg.cpp +struct { + uint16 tw, th; //tile width, height + uint16 mx, my; //screen mask x, y + uint16 scx, scy; //sc index offsets +} bg_info[4]; +void update_bg_info(); + +template uint16 bg_get_tile(uint16 x, uint16 y); +template void render_line_bg(uint8 pri0_pos, uint8 pri1_pos); + +//oam.cpp +struct sprite_item { + uint8 width, height; + uint16 x, y; + uint8 character; + bool use_nameselect; + bool vflip, hflip; + uint8 palette; + uint8 priority; +} sprite_list[128]; +bool sprite_list_valid; +unsigned active_sprite; + +uint8 oam_itemlist[32]; +struct oam_tileitem { + uint16 x, y, pri, pal, tile; + bool hflip; +} oam_tilelist[34]; + +enum { OAM_PRI_NONE = 4 }; +uint8 oam_line_pal[256], oam_line_pri[256]; + +void build_sprite_list(); +bool is_sprite_on_scanline(); +void load_oam_tiles(); +void render_oam_tile(int tile_num); +void render_line_oam_rto(); +void render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos); + +//mode7.cpp +template void render_line_mode7(uint8 pri0_pos, uint8 pri1_pos); + +//addsub.cpp +inline uint16 addsub(uint32 x, uint32 y, bool halve); + +//line.cpp +inline uint16 get_palette(uint8 index); +inline uint16 get_direct_color(uint8 p, uint8 t); +inline uint16 get_pixel_normal(uint32 x); +inline uint16 get_pixel_swap(uint32 x); +void render_line_output(); +void render_line_clear(); diff --git a/Mednafen/mednafen/snes/src/ppu/render/windows.cpp b/Mednafen/mednafen/snes/src/ppu/render/windows.cpp new file mode 100755 index 0000000000..d8b4fd1af6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/render/windows.cpp @@ -0,0 +1,70 @@ +#ifdef PPU_CPP + +//screen: 0 = main, 1 = sub +void PPU::build_window_table(uint8 bg, bool screen) { + bool set = 1, clr = 0; + uint8 *table = (screen == 0 ? window[bg].main : window[bg].sub); + + if(bg != COL) { + if(screen == 0 && regs.window_enabled[bg] == false) { + memset(table, 0, 256); + return; + } + if(screen == 1 && regs.sub_window_enabled[bg] == false) { + memset(table, 0, 256); + return; + } + } else { + switch(screen == 0 ? regs.color_mask : regs.colorsub_mask) { + case 0: memset(table, 1, 256); return; //always + case 3: memset(table, 0, 256); return; //never + case 1: set = 1, clr = 0; break; //inside window only + case 2: set = 0, clr = 1; break; //outside window only + } + } + + const uint16 window1_left = regs.window1_left; + const uint16 window1_right = regs.window1_right; + const uint16 window2_left = regs.window2_left; + const uint16 window2_right = regs.window2_right; + + if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == false) { + memset(table, clr, 256); + return; + } + + if(regs.window1_enabled[bg] == true && regs.window2_enabled[bg] == false) { + if(regs.window1_invert[bg] == true) set ^= clr ^= set ^= clr; + for(unsigned x = 0; x < 256; x++) { + table[x] = (x >= window1_left && x <= window1_right) ? set : clr; + } + return; + } + + if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == true) { + if(regs.window2_invert[bg] == true) set ^= clr ^= set ^= clr; + for(unsigned x = 0; x < 256; x++) { + table[x] = (x >= window2_left && x <= window2_right) ? set : clr; + } + return; + } + + for(unsigned x = 0; x < 256; x++) { + bool w1_mask = (x >= window1_left && x <= window1_right) ^ regs.window1_invert[bg]; + bool w2_mask = (x >= window2_left && x <= window2_right) ^ regs.window2_invert[bg]; + + switch(regs.window_mask[bg]) { + case 0: table[x] = (w1_mask | w2_mask) == 1 ? set : clr; break; //or + case 1: table[x] = (w1_mask & w2_mask) == 1 ? set : clr; break; //and + case 2: table[x] = (w1_mask ^ w2_mask) == 1 ? set : clr; break; //xor + case 3: table[x] = (w1_mask ^ w2_mask) == 0 ? set : clr; break; //xnor + } + } +} + +void PPU::build_window_tables(uint8 bg) { + build_window_table(bg, 0); + build_window_table(bg, 1); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/ppu/serialization.cpp b/Mednafen/mednafen/snes/src/ppu/serialization.cpp new file mode 100755 index 0000000000..5801887609 --- /dev/null +++ b/Mednafen/mednafen/snes/src/ppu/serialization.cpp @@ -0,0 +1,205 @@ +#ifdef PPU_CPP + +void PPUcounter::serialize(serializer &s) { + s.integer(status.interlace); + s.integer(status.field); + s.integer(status.vcounter); + s.integer(status.hcounter); + + s.array(history.field); + s.array(history.vcounter); + s.array(history.hcounter); + s.integer(history.index); +} + +void PPU::serialize(serializer &s) { + PPUcounter::serialize(s); + + s.integer(status.render_output); + s.integer(status.frame_executed); + s.integer(status.frames_updated); + s.integer(status.frames_rendered); + s.integer(status.frames_executed); + + s.integer(ppu1_version); + s.integer(ppu2_version); + //PPU::serialize(s); + + s.integer(region); + s.integer(line); + + s.integer(display.interlace); + s.integer(display.overscan); + + s.integer(cache.oam_basesize); + s.integer(cache.oam_nameselect); + s.integer(cache.oam_tdaddr); + + s.integer(regs.ppu1_mdr); + s.integer(regs.ppu2_mdr); + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_y[n]); + + s.integer(regs.display_disabled); + s.integer(regs.display_brightness); + + s.integer(regs.oam_basesize); + s.integer(regs.oam_nameselect); + s.integer(regs.oam_tdaddr); + + s.integer(regs.oam_baseaddr); + s.integer(regs.oam_addr); + s.integer(regs.oam_priority); + s.integer(regs.oam_firstsprite); + + s.integer(regs.oam_latchdata); + + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_tilesize[n]); + s.integer(regs.bg3_priority); + s.integer(regs.bg_mode); + + s.integer(regs.mosaic_size); + for(unsigned n = 0; n < 4; n++) s.integer(regs.mosaic_enabled[n]); + s.integer(regs.mosaic_countdown); + + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_scaddr[n]); + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_scsize[n]); + + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_tdaddr[n]); + + s.integer(regs.bg_ofslatch); + s.integer(regs.m7_hofs); + s.integer(regs.m7_vofs); + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_hofs[n]); + for(unsigned n = 0; n < 4; n++) s.integer(regs.bg_vofs[n]); + + s.integer(regs.vram_incmode); + s.integer(regs.vram_mapping); + s.integer(regs.vram_incsize); + + s.integer(regs.vram_addr); + + s.integer(regs.mode7_repeat); + s.integer(regs.mode7_vflip); + s.integer(regs.mode7_hflip); + + s.integer(regs.m7_latch); + s.integer(regs.m7a); + s.integer(regs.m7b); + s.integer(regs.m7c); + s.integer(regs.m7d); + s.integer(regs.m7x); + s.integer(regs.m7y); + + s.integer(regs.cgram_addr); + + s.integer(regs.cgram_latchdata); + + for(unsigned n = 0; n < 6; n++) s.integer(regs.window1_enabled[n]); + for(unsigned n = 0; n < 6; n++) s.integer(regs.window1_invert [n]); + for(unsigned n = 0; n < 6; n++) s.integer(regs.window2_enabled[n]); + for(unsigned n = 0; n < 6; n++) s.integer(regs.window2_invert [n]); + + s.integer(regs.window1_left); + s.integer(regs.window1_right); + s.integer(regs.window2_left); + s.integer(regs.window2_right); + + for(unsigned n = 0; n < 6; n++) s.integer(regs.window_mask[n]); + for(unsigned n = 0; n < 5; n++) s.integer(regs.bg_enabled[n]); + for(unsigned n = 0; n < 5; n++) s.integer(regs.bgsub_enabled[n]); + for(unsigned n = 0; n < 5; n++) s.integer(regs.window_enabled[n]); + for(unsigned n = 0; n < 5; n++) s.integer(regs.sub_window_enabled[n]); + + s.integer(regs.color_mask); + s.integer(regs.colorsub_mask); + s.integer(regs.addsub_mode); + s.integer(regs.direct_color); + + s.integer(regs.color_mode); + s.integer(regs.color_halve); + for(unsigned n = 0; n < 6; n++) s.integer(regs.color_enabled[n]); + + s.integer(regs.color_r); + s.integer(regs.color_g); + s.integer(regs.color_b); + s.integer(regs.color_rgb); + + s.integer(regs.mode7_extbg); + s.integer(regs.pseudo_hires); + s.integer(regs.overscan); + s.integer(regs.scanlines); + s.integer(regs.oam_interlace); + s.integer(regs.interlace); + + s.integer(regs.hcounter); + s.integer(regs.vcounter); + s.integer(regs.latch_hcounter); + s.integer(regs.latch_vcounter); + s.integer(regs.counters_latched); + + s.integer(regs.vram_readbuffer); + + s.integer(regs.time_over); + s.integer(regs.range_over); + s.integer(regs.oam_itemcount); + s.integer(regs.oam_tilecount); + + for(unsigned n = 0; n < 256; n++) { + s.integer(pixel_cache[n].src_main); + s.integer(pixel_cache[n].src_sub); + s.integer(pixel_cache[n].bg_main); + s.integer(pixel_cache[n].bg_sub); + s.integer(pixel_cache[n].ce_main); + s.integer(pixel_cache[n].ce_sub); + s.integer(pixel_cache[n].pri_main); + s.integer(pixel_cache[n].pri_sub); + } + + //better to just take a small speed hit than store all of bg_tiledata[3][] ... + flush_tiledata_cache(); + + for(unsigned n = 0; n < 6; n++) { + s.array(window[n].main, 256); + s.array(window[n].sub, 256); + } + + for(unsigned n = 0; n < 4; n++) { + s.integer(bg_info[n].tw); + s.integer(bg_info[n].th); + s.integer(bg_info[n].mx); + s.integer(bg_info[n].my); + s.integer(bg_info[n].scx); + s.integer(bg_info[n].scy); + } + + for(unsigned n = 0; n < 128; n++) { + s.integer(sprite_list[n].width); + s.integer(sprite_list[n].height); + s.integer(sprite_list[n].x); + s.integer(sprite_list[n].y); + s.integer(sprite_list[n].character); + s.integer(sprite_list[n].use_nameselect); + s.integer(sprite_list[n].vflip); + s.integer(sprite_list[n].hflip); + s.integer(sprite_list[n].palette); + s.integer(sprite_list[n].priority); + } + s.integer(sprite_list_valid); + s.integer(active_sprite); + + s.array(oam_itemlist, 32); + + for(unsigned n = 0; n < 34; n++) { + s.integer(oam_tilelist[n].x); + s.integer(oam_tilelist[n].y); + s.integer(oam_tilelist[n].pri); + s.integer(oam_tilelist[n].pal); + s.integer(oam_tilelist[n].tile); + s.integer(oam_tilelist[n].hflip); + } + + s.array(oam_line_pal, 256); + s.array(oam_line_pri, 256); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/brr.cpp b/Mednafen/mednafen/snes/src/sdsp/brr.cpp new file mode 100755 index 0000000000..db986edb57 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/brr.cpp @@ -0,0 +1,62 @@ +#ifdef SDSP_CPP + +alwaysinline void sDSP::brr_decode(voice_t &v) { + //state.t_brr_byte = ram[v.brr_addr + v.brr_offset] cached from previous clock cycle + int nybbles = (state.t_brr_byte << 8) + memory::apuram[(uint16)(v.brr_addr + v.brr_offset + 1)]; + + const int filter = (state.t_brr_header >> 2) & 3; + const int scale = (state.t_brr_header >> 4); + + //decode four samples + for(unsigned i = 0; i < 4; i++) { + //bits 12-15 = current nybble; sign extend, then shift right to 4-bit precision + //result: s = 4-bit sign-extended sample value + int s = (int16)nybbles >> 12; + nybbles <<= 4; //slide nybble so that on next loop iteration, bits 12-15 = current nybble + + if(scale <= 12) { + s <<= scale; + s >>= 1; + } else { + s &= ~0x7ff; + } + + //apply IIR filter (2 is the most commonly used) + const int p1 = v.buffer[v.buf_pos - 1]; + const int p2 = v.buffer[v.buf_pos - 2] >> 1; + + switch(filter) { + case 0: break; //no filter + + case 1: { + //s += p1 * 0.46875 + s += p1 >> 1; + s += (-p1) >> 5; + } break; + + case 2: { + //s += p1 * 0.953125 - p2 * 0.46875 + s += p1; + s -= p2; + s += p2 >> 4; + s += (p1 * -3) >> 6; + } break; + + case 3: { + //s += p1 * 0.8984375 - p2 * 0.40625 + s += p1; + s -= p2; + s += (p1 * -13) >> 7; + s += (p2 * 3) >> 4; + } break; + } + + //adjust and write sample + s = sclamp<16>(s); + s = (int16)(s << 1); + v.buffer.write(v.buf_pos++, s); + if(v.buf_pos >= brr_buf_size) v.buf_pos = 0; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/counter.cpp b/Mednafen/mednafen/snes/src/sdsp/counter.cpp new file mode 100755 index 0000000000..577e15f362 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/counter.cpp @@ -0,0 +1,52 @@ +#ifdef SDSP_CPP + +//counter_rate = number of samples per counter event +//all rates are evenly divisible by counter_range (0x7800, 30720, or 2048 * 5 * 3) +//note that rate[0] is a special case, which never triggers + +const uint16 sDSP::counter_rate[32] = { + 0, 2048, 1536, + 1280, 1024, 768, + 640, 512, 384, + 320, 256, 192, + 160, 128, 96, + 80, 64, 48, + 40, 32, 24, + 20, 16, 12, + 10, 8, 6, + 5, 4, 3, + 2, + 1, +}; + +//counter_offset = counter offset from zero +//counters do not appear to be aligned at zero for all rates + +const uint16 sDSP::counter_offset[32] = { + 0, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 0, + 0, +}; + +inline void sDSP::counter_tick() { + state.counter--; + if(state.counter < 0) state.counter = counter_range - 1; +} + +//return true if counter event should trigger + +inline bool sDSP::counter_poll(unsigned rate) { + if(rate == 0) return false; + return (((unsigned)state.counter + counter_offset[rate]) % counter_rate[rate]) == 0; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/echo.cpp b/Mednafen/mednafen/snes/src/sdsp/echo.cpp new file mode 100755 index 0000000000..6a490540fe --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/echo.cpp @@ -0,0 +1,135 @@ +#ifdef SDSP_CPP + +int sDSP::calc_fir(int i, bool channel) { + int s = state.echo_hist[channel][state.echo_hist_pos + i + 1]; + return (s * (int8)REG(fir + i * 0x10)) >> 6; +} + +int sDSP::echo_output(bool channel) { + int output = (int16)((state.t_main_out[channel] * (int8)REG(mvoll + channel * 0x10)) >> 7) + + (int16)((state.t_echo_in [channel] * (int8)REG(evoll + channel * 0x10)) >> 7); + return sclamp<16>(output); +} + +void sDSP::echo_read(bool channel) { + unsigned addr = state.t_echo_ptr + channel * 2; + uint8 lo = memory::apuram[(uint16)(addr + 0)]; + uint8 hi = memory::apuram[(uint16)(addr + 1)]; + int s = (int16)((hi << 8) + lo); + state.echo_hist[channel].write(state.echo_hist_pos, s >> 1); +} + +void sDSP::echo_write(bool channel) { + if(!(state.t_echo_disabled & 0x20)) { + unsigned addr = state.t_echo_ptr + channel * 2; + int s = state.t_echo_out[channel]; + memory::apuram[(uint16)(addr + 0)] = s; + memory::apuram[(uint16)(addr + 1)] = s >> 8; + } + + state.t_echo_out[channel] = 0; +} + +alwaysinline void sDSP::echo_22() { + //history + state.echo_hist_pos++; + if(state.echo_hist_pos >= echo_hist_size) state.echo_hist_pos = 0; + + state.t_echo_ptr = (uint16)((state.t_esa << 8) + state.echo_offset); + echo_read(0); + + //FIR + int l = calc_fir(0, 0); + int r = calc_fir(0, 1); + + state.t_echo_in[0] = l; + state.t_echo_in[1] = r; +} + +alwaysinline void sDSP::echo_23() { + int l = calc_fir(1, 0) + calc_fir(2, 0); + int r = calc_fir(1, 1) + calc_fir(2, 1); + + state.t_echo_in[0] += l; + state.t_echo_in[1] += r; + + echo_read(1); +} + +alwaysinline void sDSP::echo_24() { + int l = calc_fir(3, 0) + calc_fir(4, 0) + calc_fir(5, 0); + int r = calc_fir(3, 1) + calc_fir(4, 1) + calc_fir(5, 1); + + state.t_echo_in[0] += l; + state.t_echo_in[1] += r; +} + +alwaysinline void sDSP::echo_25() { + int l = state.t_echo_in[0] + calc_fir(6, 0); + int r = state.t_echo_in[1] + calc_fir(6, 1); + + l = (int16)l; + r = (int16)r; + + l += (int16)calc_fir(7, 0); + r += (int16)calc_fir(7, 1); + + state.t_echo_in[0] = sclamp<16>(l) & ~1; + state.t_echo_in[1] = sclamp<16>(r) & ~1; +} + +alwaysinline void sDSP::echo_26() { + //left output volumes + //(save sample for next clock so we can output both together) + state.t_main_out[0] = echo_output(0); + + //echo feedback + int l = state.t_echo_out[0] + (int16)((state.t_echo_in[0] * (int8)REG(efb)) >> 7); + int r = state.t_echo_out[1] + (int16)((state.t_echo_in[1] * (int8)REG(efb)) >> 7); + + state.t_echo_out[0] = sclamp<16>(l) & ~1; + state.t_echo_out[1] = sclamp<16>(r) & ~1; +} + +alwaysinline void sDSP::echo_27() { + //output + int outl = state.t_main_out[0]; + int outr = echo_output(1); + state.t_main_out[0] = 0; + state.t_main_out[1] = 0; + + //TODO: global muting isn't this simple + //(turns DAC on and off or something, causing small ~37-sample pulse when first muted) + if(REG(flg) & 0x40) { + outl = 0; + outr = 0; + } + + //output sample to DAC + audio.sample(outl, outr); +} + +alwaysinline void sDSP::echo_28() { + state.t_echo_disabled = REG(flg); +} + +alwaysinline void sDSP::echo_29() { + state.t_esa = REG(esa); + + if(!state.echo_offset) state.echo_length = (REG(edl) & 0x0f) << 11; + + state.echo_offset += 4; + if(state.echo_offset >= state.echo_length) state.echo_offset = 0; + + //write left echo + echo_write(0); + + state.t_echo_disabled = REG(flg); +} + +alwaysinline void sDSP::echo_30() { + //write right echo + echo_write(1); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/envelope.cpp b/Mednafen/mednafen/snes/src/sdsp/envelope.cpp new file mode 100755 index 0000000000..4b9f6258d0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/envelope.cpp @@ -0,0 +1,62 @@ +#ifdef SDSP_CPP + +alwaysinline void sDSP::envelope_run(voice_t &v) { + int env = v.env; + + if(v.env_mode == env_release) { //60% + env -= 0x8; + if(env < 0) env = 0; + v.env = env; + return; + } + + int rate; + int env_data = VREG(adsr1); + if(state.t_adsr0 & 0x80) { //99% ADSR + if(v.env_mode >= env_decay) { //99% + env--; + env -= env >> 8; + rate = env_data & 0x1f; + if(v.env_mode == env_decay) { //1% + rate = ((state.t_adsr0 >> 3) & 0x0e) + 0x10; + } + } else { //env_attack + rate = ((state.t_adsr0 & 0x0f) << 1) + 1; + env += rate < 31 ? 0x20 : 0x400; + } + } else { //GAIN + env_data = VREG(gain); + int mode = env_data >> 5; + if(mode < 4) { //direct + env = env_data << 4; + rate = 31; + } else { + rate = env_data & 0x1f; + if(mode == 4) { //4: linear decrease + env -= 0x20; + } else if(mode < 6) { //5: exponential decrease + env--; + env -= env >> 8; + } else { //6, 7: linear increase + env += 0x20; + if(mode > 6 && (unsigned)v.hidden_env >= 0x600) { + env += 0x8 - 0x20; //7: two-slope linear increase + } + } + } + } + + //sustain level + if((env >> 8) == (env_data >> 5) && v.env_mode == env_decay) v.env_mode = env_sustain; + v.hidden_env = env; + + //unsigned cast because linear decrease underflowing also triggers this + if((unsigned)env > 0x7ff) { + env = (env < 0 ? 0 : 0x7ff); + if(v.env_mode == env_attack) v.env_mode = env_decay; + } + + if(counter_poll(rate) == true) v.env = env; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/gaussian.cpp b/Mednafen/mednafen/snes/src/sdsp/gaussian.cpp new file mode 100755 index 0000000000..a512ff4925 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/gaussian.cpp @@ -0,0 +1,54 @@ +#ifdef SDSP_CPP + +const int16 sDSP::gaussian_table[512] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, + 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, + 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, + 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, + 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, + 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, + 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, + 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, + 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, + 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, + 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, + 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, + 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, + 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, + 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, + 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, + 969, 974, 978, 983, 988, 992, 997, 1001, 1005, 1010, 1014, 1019, 1023, 1027, 1032, 1036, + 1040, 1045, 1049, 1053, 1057, 1061, 1066, 1070, 1074, 1078, 1082, 1086, 1090, 1094, 1098, 1102, + 1106, 1109, 1113, 1117, 1121, 1125, 1128, 1132, 1136, 1139, 1143, 1146, 1150, 1153, 1157, 1160, + 1164, 1167, 1170, 1174, 1177, 1180, 1183, 1186, 1190, 1193, 1196, 1199, 1202, 1205, 1207, 1210, + 1213, 1216, 1219, 1221, 1224, 1227, 1229, 1232, 1234, 1237, 1239, 1241, 1244, 1246, 1248, 1251, + 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1270, 1272, 1274, 1275, 1277, 1279, 1280, + 1282, 1283, 1284, 1286, 1287, 1288, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1297, 1298, + 1299, 1300, 1300, 1301, 1302, 1302, 1303, 1303, 1303, 1304, 1304, 1304, 1304, 1304, 1305, 1305, +}; + +alwaysinline int sDSP::gaussian_interpolate(const voice_t &v) { + //make pointers into gaussian table based on fractional position between samples + int offset = (v.interp_pos >> 4) & 0xff; + const int16 *fwd = gaussian_table + 255 - offset; + const int16 *rev = gaussian_table + offset; //mirror left half of gaussian table + + offset = v.buf_pos + (v.interp_pos >> 12); + int output; + output = (fwd[ 0] * v.buffer[offset + 0]) >> 11; + output += (fwd[256] * v.buffer[offset + 1]) >> 11; + output += (rev[256] * v.buffer[offset + 2]) >> 11; + output = (int16)output; + output += (rev[ 0] * v.buffer[offset + 3]) >> 11; + return sclamp<16>(output) & ~1; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/misc.cpp b/Mednafen/mednafen/snes/src/sdsp/misc.cpp new file mode 100755 index 0000000000..b7174d0ed5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/misc.cpp @@ -0,0 +1,35 @@ +#ifdef SDSP_CPP + +alwaysinline void sDSP::misc_27() { + state.t_pmon = REG(pmon) & ~1; //voice 0 doesn't support PMON +} + +alwaysinline void sDSP::misc_28() { + state.t_non = REG(non); + state.t_eon = REG(eon); + state.t_dir = REG(dir); +} + +alwaysinline void sDSP::misc_29() { + state.every_other_sample ^= 1; + if(state.every_other_sample) { + state.new_kon &= ~state.kon; //clears KON 63 clocks after it was last read + } +} + +alwaysinline void sDSP::misc_30() { + if(state.every_other_sample) { + state.kon = state.new_kon; + state.t_koff = REG(koff); + } + + counter_tick(); + + //noise + if(counter_poll(REG(flg) & 0x1f) == true) { + int feedback = (state.noise << 13) ^ (state.noise << 14); + state.noise = (feedback & 0x4000) ^ (state.noise >> 1); + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/sdsp.cpp b/Mednafen/mednafen/snes/src/sdsp/sdsp.cpp new file mode 100755 index 0000000000..4daa335ba2 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/sdsp.cpp @@ -0,0 +1,338 @@ +//S-DSP emulator +//note: this is basically a C++ cothreaded implementation of Shay Green's (blargg's) S-DSP emulator. +//the actual algorithms, timing information, tables, variable names, etc were all from him. + +#include <../base.hpp> + +#define SDSP_CPP +namespace bSNES_v059 { + +#if defined(DEBUGGER) + #include "debugger/debugger.cpp" + sDSPDebugger dsp; +#else + sDSP dsp; +#endif + +#include "serialization.cpp" + +#define REG(n) state.regs[r_##n] +#define VREG(n) state.regs[v.vidx + v_##n] + +#if !defined(DSP_STATE_MACHINE) + #define phase_start() while(true) { \ + while(scheduler.sync == Scheduler::SyncAll) { \ + scheduler.exit(Scheduler::SynchronizeEvent); \ + } + #define phase(n) + #define tick() scheduler.addclocks_dsp(3 * 8); scheduler.sync_dspsmp() + #define phase_end() } +#else + #define phase_start() switch(phase_index) { + #define phase(n) case n: + #define tick() scheduler.addclocks_dsp(3 * 8); break + #define phase_end() } phase_index = (phase_index + 1) & 31; +#endif + +#include "gaussian.cpp" +#include "counter.cpp" +#include "envelope.cpp" +#include "brr.cpp" +#include "misc.cpp" +#include "voice.cpp" +#include "echo.cpp" + +/* timing */ + +void sDSP::enter() { + phase_start() + + phase(0) + voice_5(voice[0]); + voice_2(voice[1]); + tick(); + + phase(1) + voice_6(voice[0]); + voice_3(voice[1]); + tick(); + + phase(2) + voice_7(voice[0]); + voice_4(voice[1]); + voice_1(voice[3]); + tick(); + + phase(3) + voice_8(voice[0]); + voice_5(voice[1]); + voice_2(voice[2]); + tick(); + + phase(4) + voice_9(voice[0]); + voice_6(voice[1]); + voice_3(voice[2]); + tick(); + + phase(5) + voice_7(voice[1]); + voice_4(voice[2]); + voice_1(voice[4]); + tick(); + + phase(6) + voice_8(voice[1]); + voice_5(voice[2]); + voice_2(voice[3]); + tick(); + + phase(7) + voice_9(voice[1]); + voice_6(voice[2]); + voice_3(voice[3]); + tick(); + + phase(8) + voice_7(voice[2]); + voice_4(voice[3]); + voice_1(voice[5]); + tick(); + + phase(9) + voice_8(voice[2]); + voice_5(voice[3]); + voice_2(voice[4]); + tick(); + + phase(10) + voice_9(voice[2]); + voice_6(voice[3]); + voice_3(voice[4]); + tick(); + + phase(11) + voice_7(voice[3]); + voice_4(voice[4]); + voice_1(voice[6]); + tick(); + + phase(12) + voice_8(voice[3]); + voice_5(voice[4]); + voice_2(voice[5]); + tick(); + + phase(13) + voice_9(voice[3]); + voice_6(voice[4]); + voice_3(voice[5]); + tick(); + + phase(14) + voice_7(voice[4]); + voice_4(voice[5]); + voice_1(voice[7]); + tick(); + + phase(15) + voice_8(voice[4]); + voice_5(voice[5]); + voice_2(voice[6]); + tick(); + + phase(16) + voice_9(voice[4]); + voice_6(voice[5]); + voice_3(voice[6]); + tick(); + + phase(17) + voice_1(voice[0]); + voice_7(voice[5]); + voice_4(voice[6]); + tick(); + + phase(18) + voice_8(voice[5]); + voice_5(voice[6]); + voice_2(voice[7]); + tick(); + + phase(19) + voice_9(voice[5]); + voice_6(voice[6]); + voice_3(voice[7]); + tick(); + + phase(20) + voice_1(voice[1]); + voice_7(voice[6]); + voice_4(voice[7]); + tick(); + + phase(21) + voice_8(voice[6]); + voice_5(voice[7]); + voice_2(voice[0]); + tick(); + + phase(22) + voice_3a(voice[0]); + voice_9(voice[6]); + voice_6(voice[7]); + echo_22(); + tick(); + + phase(23) + voice_7(voice[7]); + echo_23(); + tick(); + + phase(24) + voice_8(voice[7]); + echo_24(); + tick(); + + phase(25) + voice_3b(voice[0]); + voice_9(voice[7]); + echo_25(); + tick(); + + phase(26) + echo_26(); + tick(); + + phase(27) + misc_27(); + echo_27(); + tick(); + + phase(28) + misc_28(); + echo_28(); + tick(); + + phase(29) + misc_29(); + echo_29(); + tick(); + + phase(30) + misc_30(); + voice_3c(voice[0]); + echo_30(); + tick(); + + phase(31) + voice_4(voice[0]); + voice_1(voice[2]); + tick(); + + phase_end() +} + +/* register interface for S-SMP $00f2,$00f3 */ + +uint8 sDSP::read(uint8 addr) { + return state.regs[addr]; +} + +void sDSP::write(uint8 addr, uint8 data) { + state.regs[addr] = data; + + if((addr & 0x0f) == v_envx) { + state.envx_buf = data; + } else if((addr & 0x0f) == v_outx) { + state.outx_buf = data; + } else if(addr == r_kon) { + state.new_kon = data; + } else if(addr == r_endx) { + //always cleared, regardless of data written + state.endx_buf = 0; + state.regs[r_endx] = 0; + } +} + +/* initialization */ + +void sDSP::power() { + memset(&state.regs, 0, sizeof state.regs); + state.echo_hist_pos = 0; + state.every_other_sample = false; + state.kon = 0; + state.noise = 0; + state.counter = 0; + state.echo_offset = 0; + state.echo_length = 0; + state.new_kon = 0; + state.endx_buf = 0; + state.envx_buf = 0; + state.outx_buf = 0; + state.t_pmon = 0; + state.t_non = 0; + state.t_eon = 0; + state.t_dir = 0; + state.t_koff = 0; + state.t_brr_next_addr = 0; + state.t_adsr0 = 0; + state.t_brr_header = 0; + state.t_brr_byte = 0; + state.t_srcn = 0; + state.t_esa = 0; + state.t_echo_disabled = 0; + state.t_dir_addr = 0; + state.t_pitch = 0; + state.t_output = 0; + state.t_looped = 0; + state.t_echo_ptr = 0; + state.t_main_out[0] = state.t_main_out[1] = 0; + state.t_echo_out[0] = state.t_echo_out[1] = 0; + state.t_echo_in[0] = state.t_echo_in[1] = 0; + + for(unsigned i = 0; i < 8; i++) { + voice[i].buf_pos = 0; + voice[i].interp_pos = 0; + voice[i].brr_addr = 0; + voice[i].brr_offset = 1; + voice[i].vbit = 1 << i; + voice[i].vidx = i * 0x10; + voice[i].kon_delay = 0; + voice[i].env_mode = env_release; + voice[i].env = 0; + voice[i].t_envx_out = 0; + voice[i].hidden_env = 0; + } + + reset(); +} + +void sDSP::reset() { + REG(flg) = 0xe0; + + state.noise = 0x4000; + state.echo_hist_pos = 0; + state.every_other_sample = 1; + state.echo_offset = 0; + state.counter = 0; + + phase_index = 0; +} + +sDSP::sDSP() { + nall_static_assert= 32 / 8>(); //int >= 32-bits + nall_static_assert<(int8)0x80 == -0x80>(); //8-bit sign extension + nall_static_assert<(int16)0x8000 == -0x8000>(); //16-bit sign extension + nall_static_assert<(uint16)0xffff0000 == 0>(); //16-bit unsigned clip + nall_static_assert<(-1 >> 1) == -1>(); //arithmetic shift right + + //-0x8000 <= n <= +0x7fff + assert(sclamp<16>(+0x8000) == +0x7fff); + assert(sclamp<16>(-0x8001) == -0x8000); +} + +sDSP::~sDSP() { +} + +}; diff --git a/Mednafen/mednafen/snes/src/sdsp/sdsp.hpp b/Mednafen/mednafen/snes/src/sdsp/sdsp.hpp new file mode 100755 index 0000000000..330d008864 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/sdsp.hpp @@ -0,0 +1,169 @@ +class sDSP { +public: + void enter(); + + uint8 read(uint8 addr); + void write(uint8 addr, uint8 data); + + void power(); + void reset(); + + void serialize(serializer&); + sDSP(); + ~sDSP(); + +private: + //DSP_STATE_MACHINE variable + unsigned phase_index; + + //global registers + enum global_reg_t { + r_mvoll = 0x0c, r_mvolr = 0x1c, + r_evoll = 0x2c, r_evolr = 0x3c, + r_kon = 0x4c, r_koff = 0x5c, + r_flg = 0x6c, r_endx = 0x7c, + r_efb = 0x0d, r_pmon = 0x2d, + r_non = 0x3d, r_eon = 0x4d, + r_dir = 0x5d, r_esa = 0x6d, + r_edl = 0x7d, r_fir = 0x0f, //8 coefficients at 0x0f, 0x1f, ... 0x7f + }; + + //voice registers + enum voice_reg_t { + v_voll = 0x00, v_volr = 0x01, + v_pitchl = 0x02, v_pitchh = 0x03, + v_srcn = 0x04, v_adsr0 = 0x05, + v_adsr1 = 0x06, v_gain = 0x07, + v_envx = 0x08, v_outx = 0x09, + }; + + //internal envelope modes + enum env_mode_t { env_release, env_attack, env_decay, env_sustain }; + + //internal constants + enum { echo_hist_size = 8 }; + enum { brr_buf_size = 12 }; + enum { brr_block_size = 9 }; + + //global state + struct state_t { + uint8 regs[128]; + + modulo_array echo_hist[2]; //echo history keeps most recent 8 samples + int echo_hist_pos; + + bool every_other_sample; //toggles every sample + int kon; //KON value when last checked + int noise; + int counter; + int echo_offset; //offset from ESA in echo buffer + int echo_length; //number of bytes that echo_offset will stop at + + //hidden registers also written to when main register is written to + int new_kon; + int endx_buf; + int envx_buf; + int outx_buf; + + //temporary state between clocks + + //read once per sample + int t_pmon; + int t_non; + int t_eon; + int t_dir; + int t_koff; + + //read a few clocks ahead before used + int t_brr_next_addr; + int t_adsr0; + int t_brr_header; + int t_brr_byte; + int t_srcn; + int t_esa; + int t_echo_disabled; + + //internal state that is recalculated every sample + int t_dir_addr; + int t_pitch; + int t_output; + int t_looped; + int t_echo_ptr; + + //left/right sums + int t_main_out[2]; + int t_echo_out[2]; + int t_echo_in [2]; + } state; + + //voice state + struct voice_t { + modulo_array buffer; //decoded samples + int buf_pos; //place in buffer where next samples will be decoded + int interp_pos; //relative fractional position in sample (0x1000 = 1.0) + int brr_addr; //address of current BRR block + int brr_offset; //current decoding offset in BRR block + int vbit; //bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc + int vidx; //voice channel register index: 0x00 for voice 0, 0x10 for voice 1, etc + int kon_delay; //KON delay/current setup phase + int env_mode; + int env; //current envelope level + int t_envx_out; + int hidden_env; //used by GAIN mode 7, very obscure quirk + } voice[8]; + + //gaussian + static const int16 gaussian_table[512]; + int gaussian_interpolate(const voice_t &v); + + //counter + enum { counter_range = 2048 * 5 * 3 }; //30720 (0x7800) + static const uint16 counter_rate[32]; + static const uint16 counter_offset[32]; + void counter_tick(); + bool counter_poll(unsigned rate); + + //envelope + void envelope_run(voice_t &v); + + //brr + void brr_decode(voice_t &v); + + //misc + void misc_27(); + void misc_28(); + void misc_29(); + void misc_30(); + + //voice + void voice_output(voice_t &v, bool channel); + void voice_1 (voice_t &v); + void voice_2 (voice_t &v); + void voice_3 (voice_t &v); + void voice_3a(voice_t &v); + void voice_3b(voice_t &v); + void voice_3c(voice_t &v); + void voice_4 (voice_t &v); + void voice_5 (voice_t &v); + void voice_6 (voice_t &v); + void voice_7 (voice_t &v); + void voice_8 (voice_t &v); + void voice_9 (voice_t &v); + + //echo + int calc_fir(int i, bool channel); + int echo_output(bool channel); + void echo_read(bool channel); + void echo_write(bool channel); + void echo_22(); + void echo_23(); + void echo_24(); + void echo_25(); + void echo_26(); + void echo_27(); + void echo_28(); + void echo_29(); + void echo_30(); +}; + +extern sDSP dsp; diff --git a/Mednafen/mednafen/snes/src/sdsp/serialization.cpp b/Mednafen/mednafen/snes/src/sdsp/serialization.cpp new file mode 100755 index 0000000000..00710877fc --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/serialization.cpp @@ -0,0 +1,66 @@ +#ifdef SDSP_CPP + +void sDSP::serialize(serializer &s) { + s.integer(phase_index); + + s.array(state.regs, 128); + state.echo_hist[0].serialize(s); + state.echo_hist[1].serialize(s); + s.integer(state.echo_hist_pos); + + s.integer(state.every_other_sample); + s.integer(state.kon); + s.integer(state.noise); + s.integer(state.counter); + s.integer(state.echo_offset); + s.integer(state.echo_length); + + s.integer(state.new_kon); + s.integer(state.endx_buf); + s.integer(state.envx_buf); + s.integer(state.outx_buf); + + s.integer(state.t_pmon); + s.integer(state.t_non); + s.integer(state.t_eon); + s.integer(state.t_dir); + s.integer(state.t_koff); + + s.integer(state.t_brr_next_addr); + s.integer(state.t_adsr0); + s.integer(state.t_brr_header); + s.integer(state.t_brr_byte); + s.integer(state.t_srcn); + s.integer(state.t_esa); + s.integer(state.t_echo_disabled); + + s.integer(state.t_dir_addr); + s.integer(state.t_pitch); + s.integer(state.t_output); + s.integer(state.t_looped); + s.integer(state.t_echo_ptr); + + s.integer(state.t_main_out[0]); + s.integer(state.t_main_out[1]); + s.integer(state.t_echo_out[0]); + s.integer(state.t_echo_out[1]); + s.integer(state.t_echo_in [0]); + s.integer(state.t_echo_in [1]); + + for(unsigned n = 0; n < 8; n++) { + voice[n].buffer.serialize(s); + s.integer(voice[n].buf_pos); + s.integer(voice[n].interp_pos); + s.integer(voice[n].brr_addr); + s.integer(voice[n].brr_offset); + s.integer(voice[n].vbit); + s.integer(voice[n].vidx); + s.integer(voice[n].kon_delay); + s.integer(voice[n].env_mode); + s.integer(voice[n].env); + s.integer(voice[n].t_envx_out); + s.integer(voice[n].hidden_env); + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/sdsp/voice.cpp b/Mednafen/mednafen/snes/src/sdsp/voice.cpp new file mode 100755 index 0000000000..8c7f526483 --- /dev/null +++ b/Mednafen/mednafen/snes/src/sdsp/voice.cpp @@ -0,0 +1,174 @@ +#ifdef SDSP_CPP + +inline void sDSP::voice_output(voice_t &v, bool channel) { + //apply left/right volume + int amp = (state.t_output * (int8)VREG(voll + channel)) >> 7; + + //add to output total + state.t_main_out[channel] += amp; + state.t_main_out[channel] = sclamp<16>(state.t_main_out[channel]); + + //optionally add to echo total + if(state.t_eon & v.vbit) { + state.t_echo_out[channel] += amp; + state.t_echo_out[channel] = sclamp<16>(state.t_echo_out[channel]); + } +} + +void sDSP::voice_1(voice_t &v) { + state.t_dir_addr = (state.t_dir << 8) + (state.t_srcn << 2); + state.t_srcn = VREG(srcn); +} + +void sDSP::voice_2(voice_t &v) { + //read sample pointer (ignored if not needed) + uint16 addr = state.t_dir_addr; + if(!v.kon_delay) addr += 2; + uint8 lo = memory::apuram[(uint16)(addr + 0)]; + uint8 hi = memory::apuram[(uint16)(addr + 1)]; + state.t_brr_next_addr = ((hi << 8) + lo); + + state.t_adsr0 = VREG(adsr0); + + //read pitch, spread over two clocks + state.t_pitch = VREG(pitchl); +} + +void sDSP::voice_3(voice_t &v) { + voice_3a(v); + voice_3b(v); + voice_3c(v); +} + +void sDSP::voice_3a(voice_t &v) { + state.t_pitch += (VREG(pitchh) & 0x3f) << 8; +} + +void sDSP::voice_3b(voice_t &v) { + state.t_brr_byte = memory::apuram[(uint16)(v.brr_addr + v.brr_offset)]; + state.t_brr_header = memory::apuram[(uint16)(v.brr_addr)]; +} + +void sDSP::voice_3c(voice_t &v) { + //pitch modulation using previous voice's output + + if(state.t_pmon & v.vbit) { + state.t_pitch += ((state.t_output >> 5) * state.t_pitch) >> 10; + } + + if(v.kon_delay) { + //get ready to start BRR decoding on next sample + if(v.kon_delay == 5) { + v.brr_addr = state.t_brr_next_addr; + v.brr_offset = 1; + v.buf_pos = 0; + state.t_brr_header = 0; //header is ignored on this sample + } + + //envelope is never run during KON + v.env = 0; + v.hidden_env = 0; + + //disable BRR decoding until last three samples + v.interp_pos = 0; + v.kon_delay--; + if(v.kon_delay & 3) v.interp_pos = 0x4000; + + //pitch is never added during KON + state.t_pitch = 0; + } + + //gaussian interpolation + int output = gaussian_interpolate(v); + + //noise + if(state.t_non & v.vbit) { + output = (int16)(state.noise << 1); + } + + //apply envelope + state.t_output = ((output * v.env) >> 11) & ~1; + v.t_envx_out = v.env >> 4; + + //immediate silence due to end of sample or soft reset + if(REG(flg) & 0x80 || (state.t_brr_header & 3) == 1) { + v.env_mode = env_release; + v.env = 0; + } + + if(state.every_other_sample) { + //KOFF + if(state.t_koff & v.vbit) { + v.env_mode = env_release; + } + + //KON + if(state.kon & v.vbit) { + v.kon_delay = 5; + v.env_mode = env_attack; + } + } + + //run envelope for next sample + if(!v.kon_delay) envelope_run(v); +} + +void sDSP::voice_4(voice_t &v) { + //decode BRR + state.t_looped = 0; + if(v.interp_pos >= 0x4000) { + brr_decode(v); + v.brr_offset += 2; + if(v.brr_offset >= 9) { + //start decoding next BRR block + v.brr_addr = (uint16)(v.brr_addr + 9); + if(state.t_brr_header & 1) { + v.brr_addr = state.t_brr_next_addr; + state.t_looped = v.vbit; + } + v.brr_offset = 1; + } + } + + //apply pitch + v.interp_pos = (v.interp_pos & 0x3fff) + state.t_pitch; + + //keep from getting too far ahead (when using pitch modulation) + if(v.interp_pos > 0x7fff) v.interp_pos = 0x7fff; + + //output left + voice_output(v, 0); +} + +void sDSP::voice_5(voice_t &v) { + //output right + voice_output(v, 1); + + //ENDX, OUTX and ENVX won't update if you wrote to them 1-2 clocks earlier + state.endx_buf = REG(endx) | state.t_looped; + + //clear bit in ENDX if KON just began + if(v.kon_delay == 5) state.endx_buf &= ~v.vbit; +} + +void sDSP::voice_6(voice_t &v) { + state.outx_buf = state.t_output >> 8; +} + +void sDSP::voice_7(voice_t &v) { + //update ENDX + REG(endx) = (uint8)state.endx_buf; + state.envx_buf = v.t_envx_out; +} + +void sDSP::voice_8(voice_t &v) { + //update OUTX + VREG(outx) = (uint8)state.outx_buf; +} + +void sDSP::voice_9(voice_t &v) { + //update ENVX + VREG(envx) = (uint8)state.envx_buf; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/algorithms.cpp b/Mednafen/mednafen/snes/src/smp/core/algorithms.cpp new file mode 100755 index 0000000000..b3e0b899b7 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/algorithms.cpp @@ -0,0 +1,126 @@ +#ifdef SMPCORE_CPP + +uint8 SMP::op_adc(uint8 x, uint8 y) { + int r = x + y + regs.p.c; + regs.p.n = r & 0x80; + regs.p.v = ~(x ^ y) & (x ^ r) & 0x80; + regs.p.h = (x ^ y ^ r) & 0x10; + regs.p.z = (uint8)r == 0; + regs.p.c = r > 0xff; + return r; +} + +uint16 SMP::op_addw(uint16 x, uint16 y) { + uint16 r; + regs.p.c = 0; + r = op_adc(x, y); + r |= op_adc(x >> 8, y >> 8) << 8; + regs.p.z = r == 0; + return r; +} + +uint8 SMP::op_and(uint8 x, uint8 y) { + x &= y; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_cmp(uint8 x, uint8 y) { + int r = x - y; + regs.p.n = r & 0x80; + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; + return x; +} + +uint16 SMP::op_cmpw(uint16 x, uint16 y) { + int r = x - y; + regs.p.n = r & 0x8000; + regs.p.z = (uint16)r == 0; + regs.p.c = r >= 0; + return x; +} + +uint8 SMP::op_eor(uint8 x, uint8 y) { + x ^= y; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_or(uint8 x, uint8 y) { + x |= y; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_sbc(uint8 x, uint8 y) { + int r = x - y - !regs.p.c; + regs.p.n = r & 0x80; + regs.p.v = (x ^ y) & (x ^ r) & 0x80; + regs.p.h = !((x ^ y ^ r) & 0x10); + regs.p.z = (uint8)r == 0; + regs.p.c = r >= 0; + return r; +} + +uint16 SMP::op_subw(uint16 x, uint16 y) { + uint16 r; + regs.p.c = 1; + r = op_sbc(x, y); + r |= op_sbc(x >> 8, y >> 8) << 8; + regs.p.z = r == 0; + return r; +} + +uint8 SMP::op_inc(uint8 x) { + x++; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_dec(uint8 x) { + x--; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_asl(uint8 x) { + regs.p.c = x & 0x80; + x <<= 1; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_lsr(uint8 x) { + regs.p.c = x & 0x01; + x >>= 1; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_rol(uint8 x) { + unsigned carry = (unsigned)regs.p.c; + regs.p.c = x & 0x80; + x = (x << 1) | carry; + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +uint8 SMP::op_ror(uint8 x) { + unsigned carry = (unsigned)regs.p.c << 7; + regs.p.c = x & 0x01; + x = carry | (x >> 1); + regs.p.n = x & 0x80; + regs.p.z = x == 0; + return x; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/core.cpp b/Mednafen/mednafen/snes/src/smp/core/core.cpp new file mode 100755 index 0000000000..5b97413877 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/core.cpp @@ -0,0 +1,27 @@ +//#include <../base.hpp> + +#define SMPCORE_CPP +namespace bSNES_v059 { + +#include "serialization.cpp" +#include "algorithms.cpp" +#include "disassembler/disassembler.cpp" + +#define A 0 +#define X 1 +#define Y 2 +#define SP 3 + +#include "opcode_mov.cpp" +#include "opcode_pc.cpp" +#include "opcode_read.cpp" +#include "opcode_rmw.cpp" +#include "opcode_misc.cpp" +#include "table.cpp" + +#undef A +#undef X +#undef Y +#undef SP + +}; diff --git a/Mednafen/mednafen/snes/src/smp/core/core.hpp b/Mednafen/mednafen/snes/src/smp/core/core.hpp new file mode 100755 index 0000000000..23440b0441 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/core.hpp @@ -0,0 +1,113 @@ + #include "registers.hpp" + #include "memory.hpp" + #include "disassembler/disassembler.hpp" + + regs_t regs; + uint16 dp, sp, rd, wr, bit, ya; + + //void op_io(); + //uint8 op_read(uint16 addr); + //void op_write(uint16 addr, uint8 data); + + uint8 op_adc (uint8 x, uint8 y); + uint16 op_addw(uint16 x, uint16 y); + uint8 op_and (uint8 x, uint8 y); + uint8 op_cmp (uint8 x, uint8 y); + uint16 op_cmpw(uint16 x, uint16 y); + uint8 op_eor (uint8 x, uint8 y); + uint8 op_inc (uint8 x); + uint8 op_dec (uint8 x); + uint8 op_or (uint8 x, uint8 y); + uint8 op_sbc (uint8 x, uint8 y); + uint16 op_subw(uint16 x, uint16 y); + uint8 op_asl (uint8 x); + uint8 op_lsr (uint8 x); + uint8 op_rol (uint8 x); + uint8 op_ror (uint8 x); + + template void op_mov_reg_reg(); + void op_mov_sp_x(); + template void op_mov_reg_const(); + void op_mov_a_ix(); + void op_mov_a_ixinc(); + template void op_mov_reg_dp(); + template void op_mov_reg_dpr(); + template void op_mov_reg_addr(); + template void op_mov_a_addrr(); + void op_mov_a_idpx(); + void op_mov_a_idpy(); + void op_mov_dp_dp(); + void op_mov_dp_const(); + void op_mov_ix_a(); + void op_mov_ixinc_a(); + template void op_mov_dp_reg(); + template void op_mov_dpr_reg(); + template void op_mov_addr_reg(); + template void op_mov_addrr_a(); + void op_mov_idpx_a(); + void op_mov_idpy_a(); + void op_movw_ya_dp(); + void op_movw_dp_ya(); + void op_mov1_c_bit(); + void op_mov1_bit_c(); + + void op_bra(); + template void op_branch(); + template void op_bitbranch(); + void op_cbne_dp(); + void op_cbne_dpx(); + void op_dbnz_dp(); + void op_dbnz_y(); + void op_jmp_addr(); + void op_jmp_iaddrx(); + void op_call(); + void op_pcall(); + template void op_tcall(); + void op_brk(); + void op_ret(); + void op_reti(); + + template void op_read_reg_const(); + template void op_read_a_ix(); + template void op_read_reg_dp(); + template void op_read_a_dpx(); + template void op_read_reg_addr(); + template void op_read_a_addrr(); + template void op_read_a_idpx(); + template void op_read_a_idpy(); + template void op_read_ix_iy(); + template void op_read_dp_dp(); + template void op_read_dp_const(); + template void op_read_ya_dp(); + void op_cmpw_ya_dp(); + template void op_and1_bit(); + void op_eor1_bit(); + void op_not1_bit(); + template void op_or1_bit(); + + template void op_adjust_reg(); + template void op_adjust_dp(); + template void op_adjust_dpx(); + template void op_adjust_addr(); + template void op_adjust_addr_a(); + template void op_adjustw_dp(); + + void op_nop(); + void op_wait(); + void op_xcn(); + void op_daa(); + void op_das(); + template void op_setbit(); + void op_notc(); + template void op_seti(); + template void op_setbit_dp(); + template void op_push_reg(); + void op_push_p(); + template void op_pop_reg(); + void op_pop_p(); + void op_mul_ya(); + void op_div_ya_x(); + + void do_op(uint8 opv); + + void core_serialize(serializer&); diff --git a/Mednafen/mednafen/snes/src/smp/core/disassembler/disassembler.cpp b/Mednafen/mednafen/snes/src/smp/core/disassembler/disassembler.cpp new file mode 100755 index 0000000000..fcaad950e5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/disassembler/disassembler.cpp @@ -0,0 +1,304 @@ +#ifdef SMPCORE_CPP + +uint16 SMP::__relb(int8 offset, int op_len) { + uint16 pc = regs.pc + op_len; + return pc + offset; +} + +void SMP::disassemble_opcode(char *output, uint16 addr) { + char *s, t[512]; + uint8 op, op0, op1; + uint16 opw, opdp0, opdp1; + s = output; + + sprintf(s, "..%.4x ", addr); + + //TODO: read from IPLROM when applicable + op = memory::apuram[(uint16)(addr + 0)]; + op0 = memory::apuram[(uint16)(addr + 1)]; + op1 = memory::apuram[(uint16)(addr + 2)]; + opw = (op0) | (op1 << 8); + opdp0 = ((unsigned)regs.p.p << 8) + op0; + opdp1 = ((unsigned)regs.p.p << 8) + op1; + + strcpy(t, " "); + + switch(op) { + case 0x00: sprintf(t, "nop"); break; + case 0x01: sprintf(t, "tcall 0"); break; + case 0x02: sprintf(t, "set0 $%.3x", opdp0); break; + case 0x03: sprintf(t, "bbs0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x04: sprintf(t, "or a,$%.3x", opdp0); break; + case 0x05: sprintf(t, "or a,$%.4x", opw); break; + case 0x06: sprintf(t, "or a,(x)"); break; + case 0x07: sprintf(t, "or a,($%.3x+x)", opdp0); break; + case 0x08: sprintf(t, "or a,#$%.2x", op0); break; + case 0x09: sprintf(t, "or $%.3x,$%.3x", opdp1, opdp0); break; + case 0x0a: sprintf(t, "or1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x0b: sprintf(t, "asl $%.3x", opdp0); break; + case 0x0c: sprintf(t, "asl $%.4x", opw); break; + case 0x0d: sprintf(t, "push p"); break; + case 0x0e: sprintf(t, "tset $%.4x,a", opw); break; + case 0x0f: sprintf(t, "brk"); break; + case 0x10: sprintf(t, "bpl $%.4x", __relb(op0, 2)); break; + case 0x11: sprintf(t, "tcall 1"); break; + case 0x12: sprintf(t, "clr0 $%.3x", opdp0); break; + case 0x13: sprintf(t, "bbc0 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x14: sprintf(t, "or a,$%.3x+x", opdp0); break; + case 0x15: sprintf(t, "or a,$%.4x+x", opw); break; + case 0x16: sprintf(t, "or a,$%.4x+y", opw); break; + case 0x17: sprintf(t, "or a,($%.3x)+y", opdp0); break; + case 0x18: sprintf(t, "or $%.3x,#$%.2x", opdp1, op0); break; + case 0x19: sprintf(t, "or (x),(y)"); break; + case 0x1a: sprintf(t, "decw $%.3x", opdp0); break; + case 0x1b: sprintf(t, "asl $%.3x+x", opdp0); break; + case 0x1c: sprintf(t, "asl a"); break; + case 0x1d: sprintf(t, "dec x"); break; + case 0x1e: sprintf(t, "cmp x,$%.4x", opw); break; + case 0x1f: sprintf(t, "jmp ($%.4x+x)", opw); break; + case 0x20: sprintf(t, "clrp"); break; + case 0x21: sprintf(t, "tcall 2"); break; + case 0x22: sprintf(t, "set1 $%.3x", opdp0); break; + case 0x23: sprintf(t, "bbs1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x24: sprintf(t, "and a,$%.3x", opdp0); break; + case 0x25: sprintf(t, "and a,$%.4x", opw); break; + case 0x26: sprintf(t, "and a,(x)"); break; + case 0x27: sprintf(t, "and a,($%.3x+x)", opdp0); break; + case 0x28: sprintf(t, "and a,#$%.2x", op0); break; + case 0x29: sprintf(t, "and $%.3x,$%.3x", opdp1, opdp0); break; + case 0x2a: sprintf(t, "or1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x2b: sprintf(t, "rol $%.3x", opdp0); break; + case 0x2c: sprintf(t, "rol $%.4x", opw); break; + case 0x2d: sprintf(t, "push a"); break; + case 0x2e: sprintf(t, "cbne $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x2f: sprintf(t, "bra $%.4x", __relb(op0, 2)); break; + case 0x30: sprintf(t, "bmi $%.4x", __relb(op0, 2)); break; + case 0x31: sprintf(t, "tcall 3"); break; + case 0x32: sprintf(t, "clr1 $%.3x", opdp0); break; + case 0x33: sprintf(t, "bbc1 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x34: sprintf(t, "and a,$%.3x+x", opdp0); break; + case 0x35: sprintf(t, "and a,$%.4x+x", opw); break; + case 0x36: sprintf(t, "and a,$%.4x+y", opw); break; + case 0x37: sprintf(t, "and a,($%.3x)+y", opdp0); break; + case 0x38: sprintf(t, "and $%.3x,#$%.2x", opdp1, op0); break; + case 0x39: sprintf(t, "and (x),(y)"); break; + case 0x3a: sprintf(t, "incw $%.3x", opdp0); break; + case 0x3b: sprintf(t, "rol $%.3x+x", opdp0); break; + case 0x3c: sprintf(t, "rol a"); break; + case 0x3d: sprintf(t, "inc x"); break; + case 0x3e: sprintf(t, "cmp x,$%.3x", opdp0); break; + case 0x3f: sprintf(t, "call $%.4x", opw); break; + case 0x40: sprintf(t, "setp"); break; + case 0x41: sprintf(t, "tcall 4"); break; + case 0x42: sprintf(t, "set2 $%.3x", opdp0); break; + case 0x43: sprintf(t, "bbs2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x44: sprintf(t, "eor a,$%.3x", opdp0); break; + case 0x45: sprintf(t, "eor a,$%.4x", opw); break; + case 0x46: sprintf(t, "eor a,(x)"); break; + case 0x47: sprintf(t, "eor a,($%.3x+x)", opdp0); break; + case 0x48: sprintf(t, "eor a,#$%.2x", op0); break; + case 0x49: sprintf(t, "eor $%.3x,$%.3x", opdp1, opdp0); break; + case 0x4a: sprintf(t, "and1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x4b: sprintf(t, "lsr $%.3x", opdp0); break; + case 0x4c: sprintf(t, "lsr $%.4x", opw); break; + case 0x4d: sprintf(t, "push x"); break; + case 0x4e: sprintf(t, "tclr $%.4x,a", opw); break; + case 0x4f: sprintf(t, "pcall $ff%.2x", op0); break; + case 0x50: sprintf(t, "bvc $%.4x", __relb(op0, 2)); break; + case 0x51: sprintf(t, "tcall 5"); break; + case 0x52: sprintf(t, "clr2 $%.3x", opdp0); break; + case 0x53: sprintf(t, "bbc2 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x54: sprintf(t, "eor a,$%.3x+x", opdp0); break; + case 0x55: sprintf(t, "eor a,$%.4x+x", opw); break; + case 0x56: sprintf(t, "eor a,$%.4x+y", opw); break; + case 0x57: sprintf(t, "eor a,($%.3x)+y", opdp0); break; + case 0x58: sprintf(t, "eor $%.3x,#$%.2x", opdp1, op0); break; + case 0x59: sprintf(t, "eor (x),(y)"); break; + case 0x5a: sprintf(t, "cmpw ya,$%.3x", opdp0); break; + case 0x5b: sprintf(t, "lsr $%.3x+x", opdp0); break; + case 0x5c: sprintf(t, "lsr a"); break; + case 0x5d: sprintf(t, "mov x,a"); break; + case 0x5e: sprintf(t, "cmp y,$%.4x", opw); break; + case 0x5f: sprintf(t, "jmp $%.4x", opw); break; + case 0x60: sprintf(t, "clrc"); break; + case 0x61: sprintf(t, "tcall 6"); break; + case 0x62: sprintf(t, "set3 $%.3x", opdp0); break; + case 0x63: sprintf(t, "bbs3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x64: sprintf(t, "cmp a,$%.3x", opdp0); break; + case 0x65: sprintf(t, "cmp a,$%.4x", opw); break; + case 0x66: sprintf(t, "cmp a,(x)"); break; + case 0x67: sprintf(t, "cmp a,($%.3x+x)", opdp0); break; + case 0x68: sprintf(t, "cmp a,#$%.2x", op0); break; + case 0x69: sprintf(t, "cmp $%.3x,$%.3x", opdp1, opdp0); break; + case 0x6a: sprintf(t, "and1 c,!$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x6b: sprintf(t, "ror $%.3x", opdp0); break; + case 0x6c: sprintf(t, "ror $%.4x", opw); break; + case 0x6d: sprintf(t, "push y"); break; + case 0x6e: sprintf(t, "dbnz $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x6f: sprintf(t, "ret"); break; + case 0x70: sprintf(t, "bvs $%.4x", __relb(op0, 2)); break; + case 0x71: sprintf(t, "tcall 7"); break; + case 0x72: sprintf(t, "clr3 $%.3x", opdp0); break; + case 0x73: sprintf(t, "bbc3 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x74: sprintf(t, "cmp a,$%.3x+x", opdp0); break; + case 0x75: sprintf(t, "cmp a,$%.4x+x", opw); break; + case 0x76: sprintf(t, "cmp a,$%.4x+y", opw); break; + case 0x77: sprintf(t, "cmp a,($%.3x)+y", opdp0); break; + case 0x78: sprintf(t, "cmp $%.3x,#$%.2x", opdp1, op0); break; + case 0x79: sprintf(t, "cmp (x),(y)"); break; + case 0x7a: sprintf(t, "addw ya,$%.3x", opdp0); break; + case 0x7b: sprintf(t, "ror $%.3x+x", opdp0); break; + case 0x7c: sprintf(t, "ror a"); break; + case 0x7d: sprintf(t, "mov a,x"); break; + case 0x7e: sprintf(t, "cmp y,$%.3x", opdp0); break; + case 0x7f: sprintf(t, "reti"); break; + case 0x80: sprintf(t, "setc"); break; + case 0x81: sprintf(t, "tcall 8"); break; + case 0x82: sprintf(t, "set4 $%.3x", opdp0); break; + case 0x83: sprintf(t, "bbs4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x84: sprintf(t, "adc a,$%.3x", opdp0); break; + case 0x85: sprintf(t, "adc a,$%.4x", opw); break; + case 0x86: sprintf(t, "adc a,(x)"); break; + case 0x87: sprintf(t, "adc a,($%.3x+x)", opdp0); break; + case 0x88: sprintf(t, "adc a,#$%.2x", op0); break; + case 0x89: sprintf(t, "adc $%.3x,$%.3x", opdp1, opdp0); break; + case 0x8a: sprintf(t, "eor1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0x8b: sprintf(t, "dec $%.3x", opdp0); break; + case 0x8c: sprintf(t, "dec $%.4x", opw); break; + case 0x8d: sprintf(t, "mov y,#$%.2x", op0); break; + case 0x8e: sprintf(t, "pop p"); break; + case 0x8f: sprintf(t, "mov $%.3x,#$%.2x", opdp1, op0); break; + case 0x90: sprintf(t, "bcc $%.4x", __relb(op0, 2)); break; + case 0x91: sprintf(t, "tcall 9"); break; + case 0x92: sprintf(t, "clr4 $%.3x", opdp0); break; + case 0x93: sprintf(t, "bbc4 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0x94: sprintf(t, "adc a,$%.3x+x", opdp0); break; + case 0x95: sprintf(t, "adc a,$%.4x+x", opw); break; + case 0x96: sprintf(t, "adc a,$%.4x+y", opw); break; + case 0x97: sprintf(t, "adc a,($%.3x)+y", opdp0); break; + case 0x98: sprintf(t, "adc $%.3x,#$%.2x", opdp1, op0); break; + case 0x99: sprintf(t, "adc (x),(y)"); break; + case 0x9a: sprintf(t, "subw ya,$%.3x", opdp0); break; + case 0x9b: sprintf(t, "dec $%.3x+x", opdp0); break; + case 0x9c: sprintf(t, "dec a"); break; + case 0x9d: sprintf(t, "mov x,sp"); break; + case 0x9e: sprintf(t, "div ya,x"); break; + case 0x9f: sprintf(t, "xcn a"); break; + case 0xa0: sprintf(t, "ei"); break; + case 0xa1: sprintf(t, "tcall 10"); break; + case 0xa2: sprintf(t, "set5 $%.3x", opdp0); break; + case 0xa3: sprintf(t, "bbs5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xa4: sprintf(t, "sbc a,$%.3x", opdp0); break; + case 0xa5: sprintf(t, "sbc a,$%.4x", opw); break; + case 0xa6: sprintf(t, "sbc a,(x)"); break; + case 0xa7: sprintf(t, "sbc a,($%.3x+x)", opdp0); break; + case 0xa8: sprintf(t, "sbc a,#$%.2x", op0); break; + case 0xa9: sprintf(t, "sbc $%.3x,$%.3x", opdp1, opdp0); break; + case 0xaa: sprintf(t, "mov1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0xab: sprintf(t, "inc $%.3x", opdp0); break; + case 0xac: sprintf(t, "inc $%.4x", opw); break; + case 0xad: sprintf(t, "cmp y,#$%.2x", op0); break; + case 0xae: sprintf(t, "pop a"); break; + case 0xaf: sprintf(t, "mov (x)+,a"); break; + case 0xb0: sprintf(t, "bcs $%.4x", __relb(op0, 2)); break; + case 0xb1: sprintf(t, "tcall 11"); break; + case 0xb2: sprintf(t, "clr5 $%.3x", opdp0); break; + case 0xb3: sprintf(t, "bbc5 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xb4: sprintf(t, "sbc a,$%.3x+x", opdp0); break; + case 0xb5: sprintf(t, "sbc a,$%.4x+x", opw); break; + case 0xb6: sprintf(t, "sbc a,$%.4x+y", opw); break; + case 0xb7: sprintf(t, "sbc a,($%.3x)+y", opdp0); break; + case 0xb8: sprintf(t, "sbc $%.3x,#$%.2x", opdp1, op0); break; + case 0xb9: sprintf(t, "sbc (x),(y)"); break; + case 0xba: sprintf(t, "movw ya,$%.3x", opdp0); break; + case 0xbb: sprintf(t, "inc $%.3x+x", opdp0); break; + case 0xbc: sprintf(t, "inc a"); break; + case 0xbd: sprintf(t, "mov sp,x"); break; + case 0xbe: sprintf(t, "das a"); break; + case 0xbf: sprintf(t, "mov a,(x)+"); break; + case 0xc0: sprintf(t, "di"); break; + case 0xc1: sprintf(t, "tcall 12"); break; + case 0xc2: sprintf(t, "set6 $%.3x", opdp0); break; + case 0xc3: sprintf(t, "bbs6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xc4: sprintf(t, "mov $%.3x,a", opdp0); break; + case 0xc5: sprintf(t, "mov $%.4x,a", opw); break; + case 0xc6: sprintf(t, "mov (x),a"); break; + case 0xc7: sprintf(t, "mov ($%.3x+x),a", opdp0); break; + case 0xc8: sprintf(t, "cmp x,#$%.2x", op0); break; + case 0xc9: sprintf(t, "mov $%.4x,x", opw); break; + case 0xca: sprintf(t, "mov1 $%.4x:%d,c", opw & 0x1fff, opw >> 13); break; + case 0xcb: sprintf(t, "mov $%.3x,y", opdp0); break; + case 0xcc: sprintf(t, "mov $%.4x,y", opw); break; + case 0xcd: sprintf(t, "mov x,#$%.2x", op0); break; + case 0xce: sprintf(t, "pop x"); break; + case 0xcf: sprintf(t, "mul ya"); break; + case 0xd0: sprintf(t, "bne $%.4x", __relb(op0, 2)); break; + case 0xd1: sprintf(t, "tcall 13"); break; + case 0xd2: sprintf(t, "clr6 $%.3x", opdp0); break; + case 0xd3: sprintf(t, "bbc6 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xd4: sprintf(t, "mov $%.3x+x,a", opdp0); break; + case 0xd5: sprintf(t, "mov $%.4x+x,a", opw); break; + case 0xd6: sprintf(t, "mov $%.4x+y,a", opw); break; + case 0xd7: sprintf(t, "mov ($%.3x)+y,a", opdp0); break; + case 0xd8: sprintf(t, "mov $%.3x,x", opdp0); break; + case 0xd9: sprintf(t, "mov $%.3x+y,x", opdp0); break; + case 0xda: sprintf(t, "movw $%.3x,ya", opdp0); break; + case 0xdb: sprintf(t, "mov $%.3x+x,y", opdp0); break; + case 0xdc: sprintf(t, "dec y"); break; + case 0xdd: sprintf(t, "mov a,y"); break; + case 0xde: sprintf(t, "cbne $%.3x+x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xdf: sprintf(t, "daa a"); break; + case 0xe0: sprintf(t, "clrv"); break; + case 0xe1: sprintf(t, "tcall 14"); break; + case 0xe2: sprintf(t, "set7 $%.3x", opdp0); break; + case 0xe3: sprintf(t, "bbs7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xe4: sprintf(t, "mov a,$%.3x", opdp0); break; + case 0xe5: sprintf(t, "mov a,$%.4x", opw); break; + case 0xe6: sprintf(t, "mov a,(x)"); break; + case 0xe7: sprintf(t, "mov a,($%.3x+x)", opdp0); break; + case 0xe8: sprintf(t, "mov a,#$%.2x", op0); break; + case 0xe9: sprintf(t, "mov x,$%.4x", opw); break; + case 0xea: sprintf(t, "not1 c,$%.4x:%d", opw & 0x1fff, opw >> 13); break; + case 0xeb: sprintf(t, "mov y,$%.3x", opdp0); break; + case 0xec: sprintf(t, "mov y,$%.4x", opw); break; + case 0xed: sprintf(t, "notc"); break; + case 0xee: sprintf(t, "pop y"); break; + case 0xef: sprintf(t, "sleep"); break; + case 0xf0: sprintf(t, "beq $%.4x", __relb(op0, 2)); break; + case 0xf1: sprintf(t, "tcall 15"); break; + case 0xf2: sprintf(t, "clr7 $%.3x", opdp0); break; + case 0xf3: sprintf(t, "bbc7 $%.3x,$%.4x", opdp0, __relb(op1, 3)); break; + case 0xf4: sprintf(t, "mov a,$%.3x+x", opdp0); break; + case 0xf5: sprintf(t, "mov a,$%.4x+x", opw); break; + case 0xf6: sprintf(t, "mov a,$%.4x+y", opw); break; + case 0xf7: sprintf(t, "mov a,($%.3x)+y", opdp0); break; + case 0xf8: sprintf(t, "mov x,$%.3x", opdp0); break; + case 0xf9: sprintf(t, "mov x,$%.3x+y", opdp0); break; + case 0xfa: sprintf(t, "mov $%.3x,$%.3x", opdp1, opdp0); break; + case 0xfb: sprintf(t, "mov y,$%.3x+x", opdp0); break; + case 0xfc: sprintf(t, "inc y"); break; + case 0xfd: sprintf(t, "mov y,a"); break; + case 0xfe: sprintf(t, "dbnz y,$%.4x", __relb(op0, 2)); break; + case 0xff: sprintf(t, "stop"); break; + } + + t[strlen(t)] = ' '; + strcat(s, t); + + sprintf(t, "A:%.2x X:%.2x Y:%.2x SP:01%.2x YA:%.4x ", + regs.a, regs.x, regs.y, regs.sp, (uint16)regs.ya); + strcat(s, t); + + sprintf(t, "%c%c%c%c%c%c%c%c", + regs.p.n ? 'N' : 'n', + regs.p.v ? 'V' : 'v', + regs.p.p ? 'P' : 'p', + regs.p.b ? 'B' : 'b', + regs.p.h ? 'H' : 'h', + regs.p.i ? 'I' : 'i', + regs.p.z ? 'Z' : 'z', + regs.p.c ? 'C' : 'c'); + strcat(s, t); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/disassembler/disassembler.hpp b/Mednafen/mednafen/snes/src/smp/core/disassembler/disassembler.hpp new file mode 100755 index 0000000000..abb8982fd4 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/disassembler/disassembler.hpp @@ -0,0 +1,2 @@ +void disassemble_opcode(char *output, uint16 addr); +inline uint16 __relb(int8 offset, int op_len); diff --git a/Mednafen/mednafen/snes/src/smp/core/memory.hpp b/Mednafen/mednafen/snes/src/smp/core/memory.hpp new file mode 100755 index 0000000000..9af3295653 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/memory.hpp @@ -0,0 +1,27 @@ +alwaysinline uint8_t op_readpc() { + return op_read(regs.pc++); +} + +alwaysinline uint8_t op_readstack() { + return op_read(0x0100 | ++regs.sp); +} + +alwaysinline void op_writestack(uint8_t data) { + op_write(0x0100 | regs.sp--, data); +} + +alwaysinline uint8_t op_readaddr(uint16_t addr) { + return op_read(addr); +} + +alwaysinline void op_writeaddr(uint16_t addr, uint8_t data) { + op_write(addr, data); +} + +alwaysinline uint8_t op_readdp(uint8_t addr) { + return op_read(((unsigned)regs.p.p << 8) + addr); +} + +alwaysinline void op_writedp(uint8_t addr, uint8_t data) { + op_write(((unsigned)regs.p.p << 8) + addr, data); +} diff --git a/Mednafen/mednafen/snes/src/smp/core/opcode_misc.cpp b/Mednafen/mednafen/snes/src/smp/core/opcode_misc.cpp new file mode 100755 index 0000000000..a59b7fae9b --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/opcode_misc.cpp @@ -0,0 +1,148 @@ +#ifdef SMPCORE_CPP + +alwaysinline void SMP::op_nop() { + op_io(); +} + +alwaysinline void SMP::op_wait() { + while(true) { + op_io(); + op_io(); + } +} + +alwaysinline void SMP::op_xcn() { + op_io(); + op_io(); + op_io(); + op_io(); + regs.a = (regs.a >> 4) | (regs.a << 4); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +alwaysinline void SMP::op_daa() { + op_io(); + op_io(); + if(regs.p.c || (regs.a) > 0x99) { + regs.a += 0x60; + regs.p.c = 1; + } + if(regs.p.h || (regs.a & 15) > 0x09) { + regs.a += 0x06; + } + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +alwaysinline void SMP::op_das() { + op_io(); + op_io(); + if(!regs.p.c || (regs.a) > 0x99) { + regs.a -= 0x60; + regs.p.c = 0; + } + if(!regs.p.h || (regs.a & 15) > 0x09) { + regs.a -= 0x06; + } + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +template alwaysinline void SMP::op_setbit() { + op_io(); + regs.p = (regs.p & ~mask) | value; +} + +alwaysinline void SMP::op_notc() { + op_io(); + op_io(); + regs.p.c = !regs.p.c; +} + +template alwaysinline void SMP::op_seti() { + op_io(); + op_io(); + regs.p.i = value; +} + + template alwaysinline void SMP::op_setbit_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = (op ? rd | value : rd & ~value); + op_writedp(dp, rd); +} + + template alwaysinline void SMP::op_push_reg() { + op_io(); + op_io(); + op_writestack(regs.r[n]); +} + + alwaysinline void SMP::op_push_p() { + op_io(); + op_io(); + op_writestack(regs.p); +} + + template alwaysinline void SMP::op_pop_reg() { + op_io(); + op_io(); + regs.r[n] = op_readstack(); +} + + alwaysinline void SMP::op_pop_p() { + op_io(); + op_io(); + regs.p = op_readstack(); +} + + alwaysinline void SMP::op_mul_ya() { + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + ya = regs.y * regs.a; + regs.a = ya; + regs.y = ya >> 8; + //result is set based on y (high-byte) only + regs.p.n = !!(regs.y & 0x80); + regs.p.z = (regs.y == 0); +} + + alwaysinline void SMP::op_div_ya_x() { + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + op_io(); + ya = regs.ya; + //overflow set if quotient >= 256 + regs.p.v = !!(regs.y >= regs.x); + regs.p.h = !!((regs.y & 15) >= (regs.x & 15)); + if(regs.y < (regs.x << 1)) { + //if quotient is <= 511 (will fit into 9-bit result) + regs.a = ya / regs.x; + regs.y = ya % regs.x; + } else { + //otherwise, the quotient won't fit into regs.p.v + regs.a + //this emulates the odd behavior of the S-SMP in this case + regs.a = 255 - (ya - (regs.x << 9)) / (256 - regs.x); + regs.y = regs.x + (ya - (regs.x << 9)) % (256 - regs.x); + } + //result is set based on a (quotient) only + regs.p.n = !!(regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/opcode_mov.cpp b/Mednafen/mednafen/snes/src/smp/core/opcode_mov.cpp new file mode 100755 index 0000000000..fcc51b313e --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/opcode_mov.cpp @@ -0,0 +1,200 @@ +#ifdef SMPCORE_CPP + +template alwaysinline void SMP::op_mov_reg_reg() { + op_io(); + regs.r[to] = regs.r[from]; + regs.p.n = (regs.r[to] & 0x80); + regs.p.z = (regs.r[to] == 0); +} + +alwaysinline void SMP::op_mov_sp_x() { + op_io(); + regs.sp = regs.x; +} + +template alwaysinline void SMP::op_mov_reg_const() { + regs.r[n] = op_readpc(); + regs.p.n = (regs.r[n] & 0x80); + regs.p.z = (regs.r[n] == 0); +} + +alwaysinline void SMP::op_mov_a_ix() { + op_io(); + regs.a = op_readdp(regs.x); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +alwaysinline void SMP::op_mov_a_ixinc() { + op_io(); + regs.a = op_readdp(regs.x++); + op_io(); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +template alwaysinline void SMP::op_mov_reg_dp() { + sp = op_readpc(); + regs.r[n] = op_readdp(sp); + regs.p.n = (regs.r[n] & 0x80); + regs.p.z = (regs.r[n] == 0); +} + +template alwaysinline void SMP::op_mov_reg_dpr() { + sp = op_readpc(); + op_io(); + regs.r[n] = op_readdp(sp + regs.r[i]); + regs.p.n = (regs.r[n] & 0x80); + regs.p.z = (regs.r[n] == 0); +} + +template alwaysinline void SMP::op_mov_reg_addr() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + regs.r[n] = op_readaddr(sp); + regs.p.n = (regs.r[n] & 0x80); + regs.p.z = (regs.r[n] == 0); +} + +template alwaysinline void SMP::op_mov_a_addrr() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + op_io(); + regs.a = op_readaddr(sp + regs.r[i]); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +alwaysinline void SMP::op_mov_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + regs.a = op_readaddr(sp); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +alwaysinline void SMP::op_mov_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + regs.a = op_readaddr(sp + regs.y); + regs.p.n = (regs.a & 0x80); + regs.p.z = (regs.a == 0); +} + +alwaysinline void SMP::op_mov_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + op_writedp(dp, rd); +} + +alwaysinline void SMP::op_mov_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, rd); +} + +alwaysinline void SMP::op_mov_ix_a() { + op_io(); + op_readdp(regs.x); + op_writedp(regs.x, regs.a); +} + +alwaysinline void SMP::op_mov_ixinc_a() { + op_io(); + op_io(); + op_writedp(regs.x++, regs.a); +} + +template alwaysinline void SMP::op_mov_dp_reg() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp, regs.r[n]); +} + +template alwaysinline void SMP::op_mov_dpr_reg() { + dp = op_readpc(); + op_io(); + dp += regs.r[i]; + op_readdp(dp); + op_writedp(dp, regs.r[n]); +} + +template alwaysinline void SMP::op_mov_addr_reg() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.r[n]); +} + +template alwaysinline void SMP::op_mov_addrr_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.r[i]; + op_readaddr(dp); + op_writeaddr(dp, regs.a); +} + +alwaysinline void SMP::op_mov_idpx_a() { + sp = op_readpc(); + op_io(); + sp += regs.x; + dp = op_readdp(sp + 0) << 0; + dp |= op_readdp(sp + 1) << 8; + op_readaddr(dp); + op_writeaddr(dp, regs.a); +} + +alwaysinline void SMP::op_mov_idpy_a() { + sp = op_readpc(); + dp = op_readdp(sp + 0) << 0; + dp |= op_readdp(sp + 1) << 8; + op_io(); + dp += regs.y; + op_readaddr(dp); + op_writeaddr(dp, regs.a); +} + +alwaysinline void SMP::op_movw_ya_dp() { + sp = op_readpc(); + regs.a = op_readdp(sp + 0); + op_io(); + regs.y = op_readdp(sp + 1); + regs.p.n = (regs.ya & 0x8000); + regs.p.z = (regs.ya == 0); +} + +alwaysinline void SMP::op_movw_dp_ya() { + dp = op_readpc(); + op_readdp(dp); + op_writedp(dp + 0, regs.a); + op_writedp(dp + 1, regs.y); +} + +alwaysinline void SMP::op_mov1_c_bit() { + sp = op_readpc() << 0; + sp |= op_readpc() << 8; + bit = sp >> 13; + sp &= 0x1fff; + rd = op_readaddr(sp); + regs.p.c = (rd & (1 << bit)); +} + +alwaysinline void SMP::op_mov1_bit_c() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + (regs.p.c) ? rd |= (1 << bit) : rd &= ~(1 << bit); + op_io(); + op_writeaddr(dp, rd); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/opcode_pc.cpp b/Mednafen/mednafen/snes/src/smp/core/opcode_pc.cpp new file mode 100755 index 0000000000..af43334d1e --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/opcode_pc.cpp @@ -0,0 +1,152 @@ +#ifdef SMPCORE_CPP + +alwaysinline void SMP::op_bra() { + rd = op_readpc(); + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +template alwaysinline void SMP::op_branch() { + rd = op_readpc(); + if((bool)(regs.p & flag) != value) return; + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +template alwaysinline void SMP::op_bitbranch() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if((bool)(sp & mask) != value) return; + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +alwaysinline void SMP::op_cbne_dp() { + dp = op_readpc(); + sp = op_readdp(dp); + rd = op_readpc(); + op_io(); + if(regs.a == sp) return; + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +alwaysinline void SMP::op_cbne_dpx() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + regs.x); + rd = op_readpc(); + op_io(); + if(regs.a == sp) return; + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +alwaysinline void SMP::op_dbnz_dp() { + dp = op_readpc(); + wr = op_readdp(dp); + op_writedp(dp, --wr); + rd = op_readpc(); + if(wr == 0) return; + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +alwaysinline void SMP::op_dbnz_y() { + rd = op_readpc(); + op_io(); + regs.y--; + op_io(); + if(regs.y == 0) return; + op_io(); + op_io(); + regs.pc += (int8)rd; +} + +alwaysinline void SMP::op_jmp_addr() { + rd = op_readpc() << 0; + rd |= op_readpc() << 8; + regs.pc = rd; +} + +alwaysinline void SMP::op_jmp_iaddrx() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + dp += regs.x; + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + regs.pc = rd; +} + +alwaysinline void SMP::op_call() { + rd = op_readpc() << 0; + rd |= op_readpc() << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; +} + +alwaysinline void SMP::op_pcall() { + rd = op_readpc(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = 0xff00 | rd; +} + +template alwaysinline void SMP::op_tcall() { + dp = 0xffde - (n << 1); + rd = op_readaddr(dp + 0) << 0; + rd |= op_readaddr(dp + 1) << 8; + op_io(); + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + regs.pc = rd; +} + +alwaysinline void SMP::op_brk() { + rd = op_readaddr(0xffde) << 0; + rd |= op_readaddr(0xffdf) << 8; + op_io(); + op_io(); + op_writestack(regs.pc >> 8); + op_writestack(regs.pc >> 0); + op_writestack(regs.p); + regs.pc = rd; + regs.p.b = 1; + regs.p.i = 0; +} + +alwaysinline void SMP::op_ret() { + rd = op_readstack() << 0; + rd |= op_readstack() << 8; + op_io(); + op_io(); + regs.pc = rd; +} + +alwaysinline void SMP::op_reti() { + regs.p = op_readstack(); + rd = op_readstack() << 0; + rd |= op_readstack() << 8; + op_io(); + op_io(); + regs.pc = rd; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/opcode_read.cpp b/Mednafen/mednafen/snes/src/smp/core/opcode_read.cpp new file mode 100755 index 0000000000..1bf7d2da6a --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/opcode_read.cpp @@ -0,0 +1,154 @@ +#ifdef SMPCORE_CPP + +template +alwaysinline void SMP::op_read_reg_const() { + rd = op_readpc(); + regs.r[n] = (this->*op)(regs.r[n], rd); +} + +template +alwaysinline void SMP::op_read_a_ix() { + op_io(); + rd = op_readdp(regs.x); + regs.a = (this->*op)(regs.a, rd); +} + +template +alwaysinline void SMP::op_read_reg_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + regs.r[n] = (this->*op)(regs.r[n], rd); +} + +template +alwaysinline void SMP::op_read_a_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + regs.a = (this->*op)(regs.a, rd); +} + +template +alwaysinline void SMP::op_read_reg_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.r[n] = (this->*op)(regs.r[n], rd); +} + +template +alwaysinline void SMP::op_read_a_addrr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + op_io(); + rd = op_readaddr(dp + regs.r[i]); + regs.a = (this->*op)(regs.a, rd); +} + +template +alwaysinline void SMP::op_read_a_idpx() { + dp = op_readpc() + regs.x; + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp); + regs.a = (this->*op)(regs.a, rd); +} + +template +alwaysinline void SMP::op_read_a_idpy() { + dp = op_readpc(); + op_io(); + sp = op_readdp(dp + 0) << 0; + sp |= op_readdp(dp + 1) << 8; + rd = op_readaddr(sp + regs.y); + regs.a = (this->*op)(regs.a, rd); +} + +template +alwaysinline void SMP::op_read_ix_iy() { + op_io(); + rd = op_readdp(regs.y); + wr = op_readdp(regs.x); + wr = (this->*op)(wr, rd); + static uint8 (SMP::*cmp)(uint8, uint8) = &SMP::op_cmp; + (op != cmp) ? op_writedp(regs.x, wr) : op_io(); +} + +template +alwaysinline void SMP::op_read_dp_dp() { + sp = op_readpc(); + rd = op_readdp(sp); + dp = op_readpc(); + wr = op_readdp(dp); + wr = (this->*op)(wr, rd); + static uint8 (SMP::*cmp)(uint8, uint8) = &SMP::op_cmp; + (op != cmp) ? op_writedp(dp, wr) : op_io(); +} + +template +alwaysinline void SMP::op_read_dp_const() { + rd = op_readpc(); + dp = op_readpc(); + wr = op_readdp(dp); + wr = (this->*op)(wr, rd); + static uint8 (SMP::*cmp)(uint8, uint8) = &SMP::op_cmp; + (op != cmp) ? op_writedp(dp, wr) : op_io(); +} + +template +alwaysinline void SMP::op_read_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + op_io(); + rd |= op_readdp(dp + 1) << 8; + regs.ya = (this->*op)(regs.ya, rd); +} + +alwaysinline void SMP::op_cmpw_ya_dp() { + dp = op_readpc(); + rd = op_readdp(dp + 0) << 0; + rd |= op_readdp(dp + 1) << 8; + op_cmpw(regs.ya, rd); +} + +template alwaysinline void SMP::op_and1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + regs.p.c = regs.p.c & ((bool)(rd & (1 << bit)) ^ op); +} + +alwaysinline void SMP::op_eor1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c ^ (bool)(rd & (1 << bit)); +} + +alwaysinline void SMP::op_not1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + rd ^= 1 << bit; + op_writeaddr(dp, rd); +} + +template alwaysinline void SMP::op_or1_bit() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + bit = dp >> 13; + dp &= 0x1fff; + rd = op_readaddr(dp); + op_io(); + regs.p.c = regs.p.c | ((bool)(rd & (1 << bit)) ^ op); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/opcode_rmw.cpp b/Mednafen/mednafen/snes/src/smp/core/opcode_rmw.cpp new file mode 100755 index 0000000000..01a5bc4321 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/opcode_rmw.cpp @@ -0,0 +1,58 @@ +#ifdef SMPCORE_CPP + +template +alwaysinline void SMP::op_adjust_reg() { + op_io(); + regs.r[n] = (this->*op)(regs.r[n]); +} + +template +alwaysinline void SMP::op_adjust_dp() { + dp = op_readpc(); + rd = op_readdp(dp); + rd = (this->*op)(rd); + op_writedp(dp, rd); +} + +template +alwaysinline void SMP::op_adjust_dpx() { + dp = op_readpc(); + op_io(); + rd = op_readdp(dp + regs.x); + rd = (this->*op)(rd); + op_writedp(dp + regs.x, rd); +} + +template +alwaysinline void SMP::op_adjust_addr() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + rd = (this->*op)(rd); + op_writeaddr(dp, rd); +} + +template +alwaysinline void SMP::op_adjust_addr_a() { + dp = op_readpc() << 0; + dp |= op_readpc() << 8; + rd = op_readaddr(dp); + regs.p.n = ((regs.a - rd) & 0x80); + regs.p.z = ((regs.a - rd) == 0); + op_readaddr(dp); + op_writeaddr(dp, (op ? rd | regs.a : rd & ~regs.a)); +} + +template +alwaysinline void SMP::op_adjustw_dp() { + dp = op_readpc(); + rd = op_readdp(dp) << 0; + rd += adjust; + op_writedp(dp++, rd); + rd += op_readdp(dp) << 8; + op_writedp(dp, rd >> 8); + regs.p.n = (rd & 0x8000); + regs.p.z = (rd == 0); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/registers.hpp b/Mednafen/mednafen/snes/src/smp/core/registers.hpp new file mode 100755 index 0000000000..baed447b1e --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/registers.hpp @@ -0,0 +1,44 @@ +struct regya_t { + uint8_t &hi, &lo; + + inline operator uint16_t() const { + return (hi << 8) + lo; + } + + inline regya_t& operator=(uint16_t data) { + hi = data >> 8; + lo = data; + return *this; + } + + regya_t(uint8_t &hi_, uint8_t &lo_) : hi(hi_), lo(lo_) {} +}; + +struct flag_t { + bool n, v, p, b, h, i, z, c; + + inline operator unsigned() const { + return (n << 7) + (v << 6) + (p << 5) + (b << 4) + + (h << 3) + (i << 2) + (z << 1) + (c << 0); + } + + inline unsigned operator=(uint8_t data) { + n = data & 0x80; v = data & 0x40; p = data & 0x20; b = data & 0x10; + h = data & 0x08; i = data & 0x04; z = data & 0x02; c = data & 0x01; + return data; + } + + inline unsigned operator|=(unsigned data) { return operator=(operator unsigned() | data); } + inline unsigned operator^=(unsigned data) { return operator=(operator unsigned() ^ data); } + inline unsigned operator&=(unsigned data) { return operator=(operator unsigned() & data); } + + flag_t() : n(0), v(0), p(0), b(0), h(0), i(0), z(0), c(0) {} +}; + +struct regs_t { + uint16_t pc; + uint8_t r[4], &a, &x, &y, &sp; + regya_t ya; + flag_t p; + regs_t() : a(r[0]), x(r[1]), y(r[2]), sp(r[3]), ya(r[2], r[0]) {} +}; diff --git a/Mednafen/mednafen/snes/src/smp/core/serialization.cpp b/Mednafen/mednafen/snes/src/smp/core/serialization.cpp new file mode 100755 index 0000000000..3b1d2c331d --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/serialization.cpp @@ -0,0 +1,26 @@ +#ifdef SMPCORE_CPP + +void SMP::core_serialize(serializer &s) { + s.integer(regs.pc); + s.integer(regs.a); + s.integer(regs.x); + s.integer(regs.y); + s.integer(regs.sp); + s.integer(regs.p.n); + s.integer(regs.p.v); + s.integer(regs.p.p); + s.integer(regs.p.b); + s.integer(regs.p.h); + s.integer(regs.p.i); + s.integer(regs.p.z); + s.integer(regs.p.c); + + s.integer(dp); + s.integer(sp); + s.integer(rd); + s.integer(wr); + s.integer(bit); + s.integer(ya); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/core/table.cpp b/Mednafen/mednafen/snes/src/smp/core/table.cpp new file mode 100755 index 0000000000..af733f5ec5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/core/table.cpp @@ -0,0 +1,266 @@ +#ifdef SMPCORE_CPP + +alwaysinline void SMP::do_op(uint8 opv) +{ + switch(opv) + { + case 0x00: op_nop(); break; + case 0x01: op_tcall<0>(); break; + case 0x02: op_setbit_dp<1, 0x01>(); break; + case 0x03: op_bitbranch<0x01, true>(); break; + case 0x04: op_read_reg_dp<&SMP::op_or, A>(); break; + case 0x05: op_read_reg_addr<&SMP::op_or, A>(); break; + case 0x06: op_read_a_ix<&SMP::op_or>(); break; + case 0x07: op_read_a_idpx<&SMP::op_or>(); break; + case 0x08: op_read_reg_const<&SMP::op_or, A>(); break; + case 0x09: op_read_dp_dp<&SMP::op_or>(); break; + case 0x0a: op_or1_bit<0>(); break; + case 0x0b: op_adjust_dp<&SMP::op_asl>(); break; + case 0x0c: op_adjust_addr<&SMP::op_asl>(); break; + case 0x0d: op_push_p(); break; + case 0x0e: op_adjust_addr_a<1>(); break; + case 0x0f: op_brk(); break; + case 0x10: op_branch<0x80, false>(); break; + case 0x11: op_tcall<1>(); break; + case 0x12: op_setbit_dp<0, 0x01>(); break; + case 0x13: op_bitbranch<0x01, false>(); break; + case 0x14: op_read_a_dpx<&SMP::op_or>(); break; + case 0x15: op_read_a_addrr<&SMP::op_or, X>(); break; + case 0x16: op_read_a_addrr<&SMP::op_or, Y>(); break; + case 0x17: op_read_a_idpy<&SMP::op_or>(); break; + case 0x18: op_read_dp_const<&SMP::op_or>(); break; + case 0x19: op_read_ix_iy<&SMP::op_or>(); break; + case 0x1a: op_adjustw_dp<-1>(); break; + case 0x1b: op_adjust_dpx<&SMP::op_asl>(); break; + case 0x1c: op_adjust_reg<&SMP::op_asl, A>(); break; + case 0x1d: op_adjust_reg<&SMP::op_dec, X>(); break; + case 0x1e: op_read_reg_addr<&SMP::op_cmp, X>(); break; + case 0x1f: op_jmp_iaddrx(); break; + case 0x20: op_setbit<0x20, 0x00>(); break; + case 0x21: op_tcall<2>(); break; + case 0x22: op_setbit_dp<1, 0x02>(); break; + case 0x23: op_bitbranch<0x02, true>(); break; + case 0x24: op_read_reg_dp<&SMP::op_and, A>(); break; + case 0x25: op_read_reg_addr<&SMP::op_and, A>(); break; + case 0x26: op_read_a_ix<&SMP::op_and>(); break; + case 0x27: op_read_a_idpx<&SMP::op_and>(); break; + case 0x28: op_read_reg_const<&SMP::op_and, A>(); break; + case 0x29: op_read_dp_dp<&SMP::op_and>(); break; + case 0x2a: op_or1_bit<1>(); break; + case 0x2b: op_adjust_dp<&SMP::op_rol>(); break; + case 0x2c: op_adjust_addr<&SMP::op_rol>(); break; + case 0x2d: op_push_reg(); break; + case 0x2e: op_cbne_dp(); break; + case 0x2f: op_bra(); break; + case 0x30: op_branch<0x80, true>(); break; + case 0x31: op_tcall<3>(); break; + case 0x32: op_setbit_dp<0, 0x02>(); break; + case 0x33: op_bitbranch<0x02, false>(); break; + case 0x34: op_read_a_dpx<&SMP::op_and>(); break; + case 0x35: op_read_a_addrr<&SMP::op_and, X>(); break; + case 0x36: op_read_a_addrr<&SMP::op_and, Y>(); break; + case 0x37: op_read_a_idpy<&SMP::op_and>(); break; + case 0x38: op_read_dp_const<&SMP::op_and>(); break; + case 0x39: op_read_ix_iy<&SMP::op_and>(); break; + case 0x3a: op_adjustw_dp<+1>(); break; + case 0x3b: op_adjust_dpx<&SMP::op_rol>(); break; + case 0x3c: op_adjust_reg<&SMP::op_rol, A>(); break; + case 0x3d: op_adjust_reg<&SMP::op_inc, X>(); break; + case 0x3e: op_read_reg_dp<&SMP::op_cmp, X>(); break; + case 0x3f: op_call(); break; + case 0x40: op_setbit<0x20, 0x20>(); break; + case 0x41: op_tcall<4>(); break; + case 0x42: op_setbit_dp<1, 0x04>(); break; + case 0x43: op_bitbranch<0x04, true>(); break; + case 0x44: op_read_reg_dp<&SMP::op_eor, A>(); break; + case 0x45: op_read_reg_addr<&SMP::op_eor, A>(); break; + case 0x46: op_read_a_ix<&SMP::op_eor>(); break; + case 0x47: op_read_a_idpx<&SMP::op_eor>(); break; + case 0x48: op_read_reg_const<&SMP::op_eor, A>(); break; + case 0x49: op_read_dp_dp<&SMP::op_eor>(); break; + case 0x4a: op_and1_bit<0>(); break; + case 0x4b: op_adjust_dp<&SMP::op_lsr>(); break; + case 0x4c: op_adjust_addr<&SMP::op_lsr>(); break; + case 0x4d: op_push_reg(); break; + case 0x4e: op_adjust_addr_a<0>(); break; + case 0x4f: op_pcall(); break; + case 0x50: op_branch<0x40, false>(); break; + case 0x51: op_tcall<5>(); break; + case 0x52: op_setbit_dp<0, 0x04>(); break; + case 0x53: op_bitbranch<0x04, false>(); break; + case 0x54: op_read_a_dpx<&SMP::op_eor>(); break; + case 0x55: op_read_a_addrr<&SMP::op_eor, X>(); break; + case 0x56: op_read_a_addrr<&SMP::op_eor, Y>(); break; + case 0x57: op_read_a_idpy<&SMP::op_eor>(); break; + case 0x58: op_read_dp_const<&SMP::op_eor>(); break; + case 0x59: op_read_ix_iy<&SMP::op_eor>(); break; + case 0x5a: op_cmpw_ya_dp(); break; + case 0x5b: op_adjust_dpx<&SMP::op_lsr>(); break; + case 0x5c: op_adjust_reg<&SMP::op_lsr, A>(); break; + case 0x5d: op_mov_reg_reg(); break; + case 0x5e: op_read_reg_addr<&SMP::op_cmp, Y>(); break; + case 0x5f: op_jmp_addr(); break; + case 0x60: op_setbit<0x01, 0x00>(); break; + case 0x61: op_tcall<6>(); break; + case 0x62: op_setbit_dp<1, 0x08>(); break; + case 0x63: op_bitbranch<0x08, true>(); break; + case 0x64: op_read_reg_dp<&SMP::op_cmp, A>(); break; + case 0x65: op_read_reg_addr<&SMP::op_cmp, A>(); break; + case 0x66: op_read_a_ix<&SMP::op_cmp>(); break; + case 0x67: op_read_a_idpx<&SMP::op_cmp>(); break; + case 0x68: op_read_reg_const<&SMP::op_cmp, A>(); break; + case 0x69: op_read_dp_dp<&SMP::op_cmp>(); break; + case 0x6a: op_and1_bit<1>(); break; + case 0x6b: op_adjust_dp<&SMP::op_ror>(); break; + case 0x6c: op_adjust_addr<&SMP::op_ror>(); break; + case 0x6d: op_push_reg(); break; + case 0x6e: op_dbnz_dp(); break; + case 0x6f: op_ret(); break; + case 0x70: op_branch<0x40, true>(); break; + case 0x71: op_tcall<7>(); break; + case 0x72: op_setbit_dp<0, 0x08>(); break; + case 0x73: op_bitbranch<0x08, false>(); break; + case 0x74: op_read_a_dpx<&SMP::op_cmp>(); break; + case 0x75: op_read_a_addrr<&SMP::op_cmp, X>(); break; + case 0x76: op_read_a_addrr<&SMP::op_cmp, Y>(); break; + case 0x77: op_read_a_idpy<&SMP::op_cmp>(); break; + case 0x78: op_read_dp_const<&SMP::op_cmp>(); break; + case 0x79: op_read_ix_iy<&SMP::op_cmp>(); break; + case 0x7a: op_read_ya_dp<&SMP::op_addw>(); break; + case 0x7b: op_adjust_dpx<&SMP::op_ror>(); break; + case 0x7c: op_adjust_reg<&SMP::op_ror, A>(); break; + case 0x7d: op_mov_reg_reg(); break; + case 0x7e: op_read_reg_dp<&SMP::op_cmp, Y>(); break; + case 0x7f: op_reti(); break; + case 0x80: op_setbit<0x01, 0x01>(); break; + case 0x81: op_tcall<8>(); break; + case 0x82: op_setbit_dp<1, 0x10>(); break; + case 0x83: op_bitbranch<0x10, true>(); break; + case 0x84: op_read_reg_dp<&SMP::op_adc, A>(); break; + case 0x85: op_read_reg_addr<&SMP::op_adc, A>(); break; + case 0x86: op_read_a_ix<&SMP::op_adc>(); break; + case 0x87: op_read_a_idpx<&SMP::op_adc>(); break; + case 0x88: op_read_reg_const<&SMP::op_adc, A>(); break; + case 0x89: op_read_dp_dp<&SMP::op_adc>(); break; + case 0x8a: op_eor1_bit(); break; + case 0x8b: op_adjust_dp<&SMP::op_dec>(); break; + case 0x8c: op_adjust_addr<&SMP::op_dec>(); break; + case 0x8d: op_mov_reg_const(); break; + case 0x8e: op_pop_p(); break; + case 0x8f: op_mov_dp_const(); break; + case 0x90: op_branch<0x01, false>(); break; + case 0x91: op_tcall<9>(); break; + case 0x92: op_setbit_dp<0, 0x10>(); break; + case 0x93: op_bitbranch<0x10, false>(); break; + case 0x94: op_read_a_dpx<&SMP::op_adc>(); break; + case 0x95: op_read_a_addrr<&SMP::op_adc, X>(); break; + case 0x96: op_read_a_addrr<&SMP::op_adc, Y>(); break; + case 0x97: op_read_a_idpy<&SMP::op_adc>(); break; + case 0x98: op_read_dp_const<&SMP::op_adc>(); break; + case 0x99: op_read_ix_iy<&SMP::op_adc>(); break; + case 0x9a: op_read_ya_dp<&SMP::op_subw>(); break; + case 0x9b: op_adjust_dpx<&SMP::op_dec>(); break; + case 0x9c: op_adjust_reg<&SMP::op_dec, A>(); break; + case 0x9d: op_mov_reg_reg(); break; + case 0x9e: op_div_ya_x(); break; + case 0x9f: op_xcn(); break; + case 0xa0: op_seti<1>(); break; + case 0xa1: op_tcall<10>(); break; + case 0xa2: op_setbit_dp<1, 0x20>(); break; + case 0xa3: op_bitbranch<0x20, true>(); break; + case 0xa4: op_read_reg_dp<&SMP::op_sbc, A>(); break; + case 0xa5: op_read_reg_addr<&SMP::op_sbc, A>(); break; + case 0xa6: op_read_a_ix<&SMP::op_sbc>(); break; + case 0xa7: op_read_a_idpx<&SMP::op_sbc>(); break; + case 0xa8: op_read_reg_const<&SMP::op_sbc, A>(); break; + case 0xa9: op_read_dp_dp<&SMP::op_sbc>(); break; + case 0xaa: op_mov1_c_bit(); break; + case 0xab: op_adjust_dp<&SMP::op_inc>(); break; + case 0xac: op_adjust_addr<&SMP::op_inc>(); break; + case 0xad: op_read_reg_const<&SMP::op_cmp, Y>(); break; + case 0xae: op_pop_reg(); break; + case 0xaf: op_mov_ixinc_a(); break; + case 0xb0: op_branch<0x01, true>(); break; + case 0xb1: op_tcall<11>(); break; + case 0xb2: op_setbit_dp<0, 0x20>(); break; + case 0xb3: op_bitbranch<0x20, false>(); break; + case 0xb4: op_read_a_dpx<&SMP::op_sbc>(); break; + case 0xb5: op_read_a_addrr<&SMP::op_sbc, X>(); break; + case 0xb6: op_read_a_addrr<&SMP::op_sbc, Y>(); break; + case 0xb7: op_read_a_idpy<&SMP::op_sbc>(); break; + case 0xb8: op_read_dp_const<&SMP::op_sbc>(); break; + case 0xb9: op_read_ix_iy<&SMP::op_sbc>(); break; + case 0xba: op_movw_ya_dp(); break; + case 0xbb: op_adjust_dpx<&SMP::op_inc>(); break; + case 0xbc: op_adjust_reg<&SMP::op_inc, A>(); break; + case 0xbd: op_mov_sp_x(); break; + case 0xbe: op_das(); break; + case 0xbf: op_mov_a_ixinc(); break; + case 0xc0: op_seti<0>(); break; + case 0xc1: op_tcall<12>(); break; + case 0xc2: op_setbit_dp<1, 0x40>(); break; + case 0xc3: op_bitbranch<0x40, true>(); break; + case 0xc4: op_mov_dp_reg(); break; + case 0xc5: op_mov_addr_reg(); break; + case 0xc6: op_mov_ix_a(); break; + case 0xc7: op_mov_idpx_a(); break; + case 0xc8: op_read_reg_const<&SMP::op_cmp, X>(); break; + case 0xc9: op_mov_addr_reg(); break; + case 0xca: op_mov1_bit_c(); break; + case 0xcb: op_mov_dp_reg(); break; + case 0xcc: op_mov_addr_reg(); break; + case 0xcd: op_mov_reg_const(); break; + case 0xce: op_pop_reg(); break; + case 0xcf: op_mul_ya(); break; + case 0xd0: op_branch<0x02, false>(); break; + case 0xd1: op_tcall<13>(); break; + case 0xd2: op_setbit_dp<0, 0x40>(); break; + case 0xd3: op_bitbranch<0x40, false>(); break; + case 0xd4: op_mov_dpr_reg(); break; + case 0xd5: op_mov_addrr_a(); break; + case 0xd6: op_mov_addrr_a(); break; + case 0xd7: op_mov_idpy_a(); break; + case 0xd8: op_mov_dp_reg(); break; + case 0xd9: op_mov_dpr_reg(); break; + case 0xda: op_movw_dp_ya(); break; + case 0xdb: op_mov_dpr_reg(); break; + case 0xdc: op_adjust_reg<&SMP::op_dec, Y>(); break; + case 0xdd: op_mov_reg_reg(); break; + case 0xde: op_cbne_dpx(); break; + case 0xdf: op_daa(); break; + case 0xe0: op_setbit<0x48, 0x00>(); break; + case 0xe1: op_tcall<14>(); break; + case 0xe2: op_setbit_dp<1, 0x80>(); break; + case 0xe3: op_bitbranch<0x80, true>(); break; + case 0xe4: op_mov_reg_dp(); break; + case 0xe5: op_mov_reg_addr(); break; + case 0xe6: op_mov_a_ix(); break; + case 0xe7: op_mov_a_idpx(); break; + case 0xe8: op_mov_reg_const(); break; + case 0xe9: op_mov_reg_addr(); break; + case 0xea: op_not1_bit(); break; + case 0xeb: op_mov_reg_dp(); break; + case 0xec: op_mov_reg_addr(); break; + case 0xed: op_notc(); break; + case 0xee: op_pop_reg(); break; + case 0xef: op_wait(); break; + case 0xf0: op_branch<0x02, true>(); break; + case 0xf1: op_tcall<15>(); break; + case 0xf2: op_setbit_dp<0, 0x80>(); break; + case 0xf3: op_bitbranch<0x80, false>(); break; + case 0xf4: op_mov_reg_dpr(); break; + case 0xf5: op_mov_a_addrr(); break; + case 0xf6: op_mov_a_addrr(); break; + case 0xf7: op_mov_a_idpy(); break; + case 0xf8: op_mov_reg_dp(); break; + case 0xf9: op_mov_reg_dpr(); break; + case 0xfa: op_mov_dp_dp(); break; + case 0xfb: op_mov_reg_dpr(); break; + case 0xfc: op_adjust_reg<&SMP::op_inc, Y>(); break; + case 0xfd: op_mov_reg_reg(); break; + case 0xfe: op_dbnz_y(); break; + case 0xff: op_wait(); break; + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/smp.cpp b/Mednafen/mednafen/snes/src/smp/smp.cpp new file mode 100755 index 0000000000..cc2125e3c5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/smp.cpp @@ -0,0 +1,50 @@ +#include <../base.hpp> + +#define SMP_CPP +namespace bSNES_v059 { + +//this is the IPLROM for the S-SMP coprocessor. +//the S-SMP does not allow writing to the IPLROM. +//all writes are instead mapped to the extended +//RAM region, accessible when $f1.d7 is clear. + +const uint8_t SMP::iplrom[64] = { +/*ffc0*/ 0xcd, 0xef, //mov x,#$ef +/*ffc2*/ 0xbd, //mov sp,x +/*ffc3*/ 0xe8, 0x00, //mov a,#$00 +/*ffc5*/ 0xc6, //mov (x),a +/*ffc6*/ 0x1d, //dec x +/*ffc7*/ 0xd0, 0xfc, //bne $ffc5 +/*ffc9*/ 0x8f, 0xaa, 0xf4, //mov $f4,#$aa +/*ffcc*/ 0x8f, 0xbb, 0xf5, //mov $f5,#$bb +/*ffcf*/ 0x78, 0xcc, 0xf4, //cmp $f4,#$cc +/*ffd2*/ 0xd0, 0xfb, //bne $ffcf +/*ffd4*/ 0x2f, 0x19, //bra $ffef +/*ffd6*/ 0xeb, 0xf4, //mov y,$f4 +/*ffd8*/ 0xd0, 0xfc, //bne $ffd6 +/*ffda*/ 0x7e, 0xf4, //cmp y,$f4 +/*ffdc*/ 0xd0, 0x0b, //bne $ffe9 +/*ffde*/ 0xe4, 0xf5, //mov a,$f5 +/*ffe0*/ 0xcb, 0xf4, //mov $f4,y +/*ffe2*/ 0xd7, 0x00, //mov ($00)+y,a +/*ffe4*/ 0xfc, //inc y +/*ffe5*/ 0xd0, 0xf3, //bne $ffda +/*ffe7*/ 0xab, 0x01, //inc $01 +/*ffe9*/ 0x10, 0xef, //bpl $ffda +/*ffeb*/ 0x7e, 0xf4, //cmp y,$f4 +/*ffed*/ 0x10, 0xeb, //bpl $ffda +/*ffef*/ 0xba, 0xf6, //movw ya,$f6 +/*fff1*/ 0xda, 0x00, //movw $00,ya +/*fff3*/ 0xba, 0xf4, //movw ya,$f4 +/*fff5*/ 0xc4, 0xf4, //mov $f4,a +/*fff7*/ 0xdd, //mov a,y +/*fff8*/ 0x5d, //mov x,a +/*fff9*/ 0xd0, 0xdb, //bne $ffd6 +/*fffb*/ 0x1f, 0x00, 0x00, //jmp ($0000+x) +/*fffe*/ 0xc0, 0xff //reset vector location ($ffc0) +}; + +}; + +#include "core/core.cpp" +#include "ssmp/ssmp.cpp" diff --git a/Mednafen/mednafen/snes/src/smp/smp.hpp b/Mednafen/mednafen/snes/src/smp/smp.hpp new file mode 100755 index 0000000000..d45ebb5535 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/smp.hpp @@ -0,0 +1,18 @@ +class SMP { +public: + static const uint8_t iplrom[64]; + + #include "core/core.hpp" + #include "ssmp/ssmp.hpp" + + SMP() {} + ~SMP() {} +}; + +#if defined(DEBUGGER) + #include "debugger/debugger.hpp" + extern sSMPDebugger smp; +#else + extern SMP smp; +#endif + diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/debugger/debugger.cpp b/Mednafen/mednafen/snes/src/smp/ssmp/debugger/debugger.cpp new file mode 100755 index 0000000000..6db906cb59 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/debugger/debugger.cpp @@ -0,0 +1,44 @@ +#ifdef SSMP_CPP + +void sSMPDebugger::op_step() { + bool break_event = false; + + usage[regs.pc] |= UsageExec; + opcode_pc = regs.pc; + + if(debugger.step_smp) { + debugger.break_event = Debugger::SMPStep; + scheduler.exit(Scheduler::DebuggerEvent); + } else { + debugger.breakpoint_test(Debugger::Breakpoint::APURAM, Debugger::Breakpoint::Exec, regs.pc, 0x00); + } + + if(step_event) step_event(); + sSMP::op_step(); + scheduler.sync_smpcpu(); +} + +uint8 sSMPDebugger::op_read(uint16 addr) { + uint8 data = sSMP::op_read(addr); + usage[addr] |= UsageRead; + debugger.breakpoint_test(Debugger::Breakpoint::APURAM, Debugger::Breakpoint::Read, addr, data); + return data; +} + +void sSMPDebugger::op_write(uint16 addr, uint8 data) { + sSMP::op_write(addr, data); + usage[addr] |= UsageWrite; + usage[addr] &= ~UsageExec; + debugger.breakpoint_test(Debugger::Breakpoint::APURAM, Debugger::Breakpoint::Write, addr, data); +} + +sSMPDebugger::sSMPDebugger() { + usage = new uint8[1 << 16](); + opcode_pc = 0xffc0; +} + +sSMPDebugger::~sSMPDebugger() { + delete[] usage; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/debugger/debugger.hpp b/Mednafen/mednafen/snes/src/smp/ssmp/debugger/debugger.hpp new file mode 100755 index 0000000000..b67be979bb --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/debugger/debugger.hpp @@ -0,0 +1,19 @@ +class sSMPDebugger : public sSMP { +public: + function step_event; + + enum Usage { + UsageRead = 0x80, + UsageWrite = 0x40, + UsageExec = 0x20, + }; + uint8 *usage; + uint16 opcode_pc; + + void op_step(); + uint8 op_read(uint16 addr); + void op_write(uint16 addr, uint8 data); + + sSMPDebugger(); + ~sSMPDebugger(); +}; diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/memory/memory.cpp b/Mednafen/mednafen/snes/src/smp/ssmp/memory/memory.cpp new file mode 100755 index 0000000000..b14af08e01 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/memory/memory.cpp @@ -0,0 +1,226 @@ +#ifdef SSMP_CPP + +alwaysinline uint8 SMP::ram_read(uint16 addr) { + if(addr < 0xffc0) return memory::apuram[addr]; + if(status.iplrom_enabled == false) return memory::apuram[addr]; + return iplrom[addr & 0x3f]; +} + +alwaysinline void SMP::ram_write(uint16 addr, uint8 data) { + //writes to $ffc0-$ffff always go to spcram, even if the iplrom is enabled + memory::apuram[addr] = data; +} + +// + +uint8 SMP::port_read(uint8 port) { + return memory::apuram[0xf4 + (port & 3)]; +} + +void SMP::port_write(uint8 port, uint8 data) { + memory::apuram[0xf4 + (port & 3)] = data; +} + +// + +alwaysinline uint8 SMP::op_busread(uint16 addr) { + uint8 r; + if((addr & 0xfff0) == 0x00f0) { + //addr >= 0x00f0 && addr <= 0x00ff + switch(addr) { + case 0xf0: { //TEST -- write-only register + r = 0x00; + } break; + + case 0xf1: { //CONTROL -- write-only register + r = 0x00; + } break; + + case 0xf2: { //DSPADDR + r = status.dsp_addr; + } break; + + case 0xf3: { //DSPDATA + //0x80-0xff are read-only mirrors of 0x00-0x7f + r = dsp.read(status.dsp_addr & 0x7f); + } break; + + case 0xf4: //CPUIO0 + case 0xf5: //CPUIO1 + case 0xf6: //CPUIO2 + case 0xf7: { //CPUIO3 + scheduler.sync_smpcpu(); + r = cpu.port_read(addr & 3); + } break; + + case 0xf8: { //??? + r = status.smp_f8; + } break; + + case 0xf9: { //??? + r = status.smp_f9; + } break; + + case 0xfa: //T0TARGET + case 0xfb: //T1TARGET + case 0xfc: { //T2TARGET -- write-only registers + r = 0x00; + } break; + + case 0xfd: { //T0OUT -- 4-bit counter value + r = t0.stage3_ticks & 15; + t0.stage3_ticks = 0; + } break; + + case 0xfe: { //T1OUT -- 4-bit counter value + r = t1.stage3_ticks & 15; + t1.stage3_ticks = 0; + } break; + + case 0xff: { //T2OUT -- 4-bit counter value + r = t2.stage3_ticks & 15; + t2.stage3_ticks = 0; + } break; + } + } else { + r = ram_read(addr); + } + + return r; +} + +alwaysinline void SMP::op_buswrite(uint16 addr, uint8 data) { + if((addr & 0xfff0) == 0x00f0) { + //addr >= 0x00f0 && addr >= 0x00ff + if(status.mmio_disabled == true) return; + + switch(addr) { + case 0xf0: { //TEST + if(regs.p.p) break; //writes only valid when P flag is clear + + //multiplier table may not be 100% accurate, some settings crash + //the processor due to S-SMP <> S-DSP bus access misalignment + //static uint8 clock_speed_tbl[16] = + //{ 3, 5, 9, 17, 4, 6, 10, 18, 6, 8, 12, 20, 10, 12, 16, 24 }; + + //status.clock_speed = 24 * clock_speed_tbl[data >> 4] / 3; + status.mmio_disabled = !!(data & 0x04); + status.ram_writable = !!(data & 0x02); + + //if((data >> 4) != 0) { + //dprintf("* S-SMP critical warning: $00f0 (TEST) clock speed control modified!"); + //dprintf("* S-SMP may crash on hardware as a result!"); + //} + } break; + + case 0xf1: { //CONTROL + status.iplrom_enabled = !!(data & 0x80); + + if(data & 0x30) { + //one-time clearing of APU port read registers, + //emulated by simulating CPU writes of 0x00 + scheduler.sync_smpcpu(); + if(data & 0x20) { + cpu.port_write(2, 0x00); + cpu.port_write(3, 0x00); + } + if(data & 0x10) { + cpu.port_write(0, 0x00); + cpu.port_write(1, 0x00); + } + } + + //0->1 transistion resets timers + if(t2.enabled == false && (data & 0x04)) { + t2.stage2_ticks = 0; + t2.stage3_ticks = 0; + } + t2.enabled = !!(data & 0x04); + + if(t1.enabled == false && (data & 0x02)) { + t1.stage2_ticks = 0; + t1.stage3_ticks = 0; + } + t1.enabled = !!(data & 0x02); + + if(t0.enabled == false && (data & 0x01)) { + t0.stage2_ticks = 0; + t0.stage3_ticks = 0; + } + t0.enabled = !!(data & 0x01); + } break; + + case 0xf2: { //DSPADDR + status.dsp_addr = data; + } break; + + case 0xf3: { //DSPDATA + //0x80-0xff is a read-only mirror of 0x00-0x7f + if(!(status.dsp_addr & 0x80)) { + dsp.write(status.dsp_addr & 0x7f, data); + } + } break; + + case 0xf4: //CPUIO0 + case 0xf5: //CPUIO1 + case 0xf6: //CPUIO2 + case 0xf7: { //CPUIO3 + scheduler.sync_smpcpu(); + port_write(addr & 3, data); + } break; + + case 0xf8: { //??? + status.smp_f8 = data; + } break; + + case 0xf9: { //??? + status.smp_f9 = data; + } break; + + case 0xfa: { //T0TARGET + t0.target = data; + } break; + + case 0xfb: { //T1TARGET + t1.target = data; + } break; + + case 0xfc: { //T2TARGET + t2.target = data; + } break; + + case 0xfd: //T0OUT + case 0xfe: //T1OUT + case 0xff: { //T2OUT -- read-only registers + } break; + } + } + + //all writes, even to MMIO registers, appear on bus + if(status.ram_writable == true) { + ram_write(addr, data); + } +} + +// + +void SMP::op_io() { + add_clocks(24); + tick_timers(); +} + +uint8 SMP::op_read(uint16 addr) { + add_clocks(12); + uint8 r = op_busread(addr); + add_clocks(12); + tick_timers(); + return r; +} + +void SMP::op_write(uint16 addr, uint8 data) { + add_clocks(24); + op_buswrite(addr, data); + tick_timers(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/memory/memory.hpp b/Mednafen/mednafen/snes/src/smp/ssmp/memory/memory.hpp new file mode 100755 index 0000000000..ae16cee0b6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/memory/memory.hpp @@ -0,0 +1,12 @@ +uint8 ram_read(uint16 addr); +void ram_write(uint16 addr, uint8 data); + +uint8 port_read(uint8 port); +void port_write(uint8 port, uint8 data); + +uint8 op_busread(uint16 addr); +void op_buswrite(uint16 addr, uint8 data); + +void op_io(); +debugvirtual uint8 op_read(uint16 addr); +debugvirtual void op_write(uint16 addr, uint8 data); diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/serialization.cpp b/Mednafen/mednafen/snes/src/smp/ssmp/serialization.cpp new file mode 100755 index 0000000000..a3f1d5fdf6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/serialization.cpp @@ -0,0 +1,38 @@ +#ifdef SSMP_CPP + +void SMP::serialize(serializer &s) { + //SMP::serialize(s); + core_serialize(s); + + s.integer(status.opcode); + s.integer(status.in_opcode); + s.integer(status.clock_counter); + s.integer(status.dsp_counter); + s.integer(status.clock_speed); + s.integer(status.mmio_disabled); + s.integer(status.ram_writable); + s.integer(status.iplrom_enabled); + s.integer(status.dsp_addr); + s.integer(status.smp_f8); + s.integer(status.smp_f9); + + s.integer(t0.target); + s.integer(t0.stage1_ticks); + s.integer(t0.stage2_ticks); + s.integer(t0.stage3_ticks); + s.integer(t0.enabled); + + s.integer(t1.target); + s.integer(t1.stage1_ticks); + s.integer(t1.stage2_ticks); + s.integer(t1.stage3_ticks); + s.integer(t1.enabled); + + s.integer(t2.target); + s.integer(t2.stage1_ticks); + s.integer(t2.stage2_ticks); + s.integer(t2.stage3_ticks); + s.integer(t2.enabled); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/ssmp.cpp b/Mednafen/mednafen/snes/src/smp/ssmp/ssmp.cpp new file mode 100755 index 0000000000..ae06a0ef13 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/ssmp.cpp @@ -0,0 +1,90 @@ +//#include <../base.hpp> + +#define SSMP_CPP +namespace bSNES_v059 { + +#if defined(DEBUGGER) + #include "debugger/debugger.cpp" + sSMPDebugger smp; +#else + SMP smp; +#endif + +#include "serialization.cpp" +#include "memory/memory.cpp" +#include "timing/timing.cpp" + +alwaysinline void SMP::op_step() { + do_op(op_readpc()); +} + +void SMP::enter() { + while(true) { + while(scheduler.sync == Scheduler::SyncAll) { + scheduler.exit(Scheduler::SynchronizeEvent); + //if(scheduler.clock.cpusmp >= 0 && scheduler.sync != Scheduler::SyncAll) { + // puts("BLAHBLAH"); + //} + } + + op_step(); + } +} + +void SMP::power() { + //targets not initialized/changed upon reset + t0.target = 0; + t1.target = 0; + t2.target = 0; + + reset(); +} + +void SMP::reset() { + regs.pc = 0xffc0; + regs.a = 0x00; + regs.x = 0x00; + regs.y = 0x00; + regs.sp = 0xef; + regs.p = 0x02; + + for(unsigned i = 0; i < memory::apuram.size(); i++) { + memory::apuram.write(i, 0x00); + } + + status.clock_counter = 0; + status.dsp_counter = 0; + + //$00f0 + status.clock_speed = 24 * 3 / 3; + status.mmio_disabled = false; + status.ram_writable = true; + + //$00f1 + status.iplrom_enabled = true; + + //$00f2 + status.dsp_addr = 0x00; + + //$00f8,$00f9 + status.smp_f8 = 0x00; + status.smp_f9 = 0x00; + + t0.enabled = false; + t1.enabled = false; + t2.enabled = false; + + t0.stage1_ticks = 0; + t1.stage1_ticks = 0; + t2.stage1_ticks = 0; + + t0.stage2_ticks = 0; + t1.stage2_ticks = 0; + t2.stage2_ticks = 0; + + t0.stage3_ticks = 0; + t1.stage3_ticks = 0; + t2.stage3_ticks = 0; +} + +}; diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/ssmp.hpp b/Mednafen/mednafen/snes/src/smp/ssmp/ssmp.hpp new file mode 100755 index 0000000000..8816f898dc --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/ssmp.hpp @@ -0,0 +1,37 @@ + void enter(); + debugvirtual void op_step(); + + #include "memory/memory.hpp" + #include "timing/timing.hpp" + + struct { + + uint8 opcode; + bool in_opcode; + + //timing + uint32 clock_counter; + uint32 dsp_counter; + + //$00f0 + uint8 clock_speed; + bool mmio_disabled; + bool ram_writable; + + //$00f1 + bool iplrom_enabled; + + //$00f2 + uint8 dsp_addr; + + //$00f8,$00f9 + uint8 smp_f8, smp_f9; + } status; + + //ssmp.cpp + void power(); + void reset(); + + void serialize(serializer&); + + friend class sSMPDebug; diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/timing/timing.cpp b/Mednafen/mednafen/snes/src/smp/ssmp/timing/timing.cpp new file mode 100755 index 0000000000..f281e77ff5 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/timing/timing.cpp @@ -0,0 +1,28 @@ +#ifdef SSMP_CPP + +void SMP::add_clocks(unsigned clocks) { + scheduler.addclocks_smp(clocks); + #if !defined(DSP_STATE_MACHINE) + scheduler.sync_smpdsp(); + #else + while(scheduler.clock.smpdsp < 0) dsp.enter(); + #endif + + // Mednafen change. + scheduler.sync_smpcpu(); +} + +void SMP::tick_timers() { + t0.tick(); + t1.tick(); + t2.tick(); + + //forcefully sync S-SMP to S-CPU in case chips are not communicating + //sync if S-SMP is more than 24 samples ahead of S-CPU + //if(scheduler.clock.cpusmp > +(768 * 24 * (int64)24000000)) scheduler.sync_smpcpu(); + + // Mednafen change - Make the check for only about 1 sample ahead. + //if(scheduler.clock.cpusmp > +(768 * 1 * (int64)24000000)) scheduler.sync_smpcpu(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/smp/ssmp/timing/timing.hpp b/Mednafen/mednafen/snes/src/smp/ssmp/timing/timing.hpp new file mode 100755 index 0000000000..9f0781f580 --- /dev/null +++ b/Mednafen/mednafen/snes/src/smp/ssmp/timing/timing.hpp @@ -0,0 +1,34 @@ +template +class sSMPTimer { +public: + uint8 target; + uint8 stage1_ticks, stage2_ticks, stage3_ticks; + bool enabled; + + void tick() { + //stage 1 increment + stage1_ticks++; + if(stage1_ticks < cycle_frequency) return; + + stage1_ticks -= cycle_frequency; + if(enabled == false) return; + + //stage 2 increment + stage2_ticks++; + + if(stage2_ticks != target) return; + + //stage 3 increment + stage2_ticks = 0; + stage3_ticks++; + stage3_ticks &= 15; + } +}; + +sSMPTimer<128> t0; +sSMPTimer<128> t1; +sSMPTimer< 16> t2; + +alwaysinline void add_clocks(unsigned clocks); +alwaysinline void tick_timers(); +uint32 clocks_executed(); diff --git a/Mednafen/mednafen/snes/src/system/audio/audio.cpp b/Mednafen/mednafen/snes/src/system/audio/audio.cpp new file mode 100755 index 0000000000..e2c6ec0787 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/audio/audio.cpp @@ -0,0 +1,90 @@ +#ifdef SYSTEM_CPP + +Audio audio; + +void Audio::coprocessor_enable(bool state) { + coprocessor = state; + + dsp_rdoffset = cop_rdoffset = 0; + dsp_wroffset = cop_wroffset = 0; + dsp_length = cop_length = 0; + + r_sum_l = r_sum_r = 0; +} + +void Audio::coprocessor_frequency(double input_frequency) { + double output_frequency; + if(system.region() == System::NTSC) { + output_frequency = config.smp.ntsc_clock_rate / 768.0; + } else /* (system.region() == System::PAL) */ { + output_frequency = config.smp.pal_clock_rate / 768.0; + } + + r_step = input_frequency / output_frequency; + r_frac = 0; +} + +void Audio::sample(int16 left, int16 right) { + if(coprocessor == false) { + system.interface->audio_sample(left, right); + } else { + dsp_buffer[dsp_wroffset] = ((uint16)left << 0) + ((uint16)right << 16); + dsp_wroffset = (dsp_wroffset + 1) & 32767; + dsp_length = (dsp_length + 1) & 32767; + flush(); + } +} + +void Audio::coprocessor_sample(int16 left, int16 right) { + if(r_frac >= 1.0) { + r_frac -= 1.0; + r_sum_l += left; + r_sum_r += right; + return; + } + + r_sum_l += left * r_frac; + r_sum_r += right * r_frac; + + uint16 output_left = sclamp<16>(int(r_sum_l / r_step)); + uint16 output_right = sclamp<16>(int(r_sum_r / r_step)); + + double first = 1.0 - r_frac; + r_sum_l = left * first; + r_sum_r = right * first; + r_frac = r_step - first; + + cop_buffer[cop_wroffset] = (output_left << 0) + (output_right << 16); + cop_wroffset = (cop_wroffset + 1) & 32767; + cop_length = (cop_length + 1) & 32767; + flush(); +} + +void Audio::init() { +} + +void Audio::flush() { + while(dsp_length > 0 && cop_length > 0) { + uint32 dsp_sample = dsp_buffer[dsp_rdoffset]; + uint32 cop_sample = cop_buffer[cop_rdoffset]; + + dsp_rdoffset = (dsp_rdoffset + 1) & 32767; + cop_rdoffset = (cop_rdoffset + 1) & 32767; + + dsp_length--; + cop_length--; + + int dsp_left = (int16)(dsp_sample >> 0); + int dsp_right = (int16)(dsp_sample >> 16); + + int cop_left = (int16)(cop_sample >> 0); + int cop_right = (int16)(cop_sample >> 16); + + system.interface->audio_sample( + sclamp<16>((dsp_left + cop_left ) / 2), + sclamp<16>((dsp_right + cop_right) / 2) + ); + } +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/audio/audio.hpp b/Mednafen/mednafen/snes/src/system/audio/audio.hpp new file mode 100755 index 0000000000..3cd522fa2d --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/audio/audio.hpp @@ -0,0 +1,22 @@ +class Audio { +public: + void coprocessor_enable(bool state); + void coprocessor_frequency(double frequency); + void sample(int16 left, int16 right); + void coprocessor_sample(int16 left, int16 right); + void init(); + +private: + bool coprocessor; + uint32 dsp_buffer[32768], cop_buffer[32768]; + unsigned dsp_rdoffset, cop_rdoffset; + unsigned dsp_wroffset, cop_wroffset; + unsigned dsp_length, cop_length; + + double r_step, r_frac; + int r_sum_l, r_sum_r; + + void flush(); +}; + +extern Audio audio; diff --git a/Mednafen/mednafen/snes/src/system/config/config.cpp b/Mednafen/mednafen/snes/src/system/config/config.cpp new file mode 100755 index 0000000000..5c6624cc81 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/config/config.cpp @@ -0,0 +1,27 @@ +#ifdef SYSTEM_CPP + +Configuration config; + +Configuration::Configuration() { + controller_port1 = Input::DeviceJoypad; + controller_port2 = Input::DeviceJoypad; + expansion_port = System::ExpansionBSX; + region = System::Autodetect; + + cpu.version = 2; + cpu.ntsc_clock_rate = 21477272; + cpu.pal_clock_rate = 21281370; + cpu.alu_mul_delay = 2; + cpu.alu_div_delay = 2; + cpu.wram_init_value = 0x55; + + smp.ntsc_clock_rate = 24607104; //32040.5 * 768 + smp.pal_clock_rate = 24607104; + + ppu1.version = 1; + ppu2.version = 3; + + superfx.speed = 0; //0 = auto-select, 1 = force 10.74MHz, 2 = force 21.48MHz +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/config/config.hpp b/Mednafen/mednafen/snes/src/system/config/config.hpp new file mode 100755 index 0000000000..d28f892824 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/config/config.hpp @@ -0,0 +1,36 @@ +struct Configuration { + unsigned controller_port1; + unsigned controller_port2; + unsigned expansion_port; + unsigned region; + + struct CPU { + unsigned version; + unsigned ntsc_clock_rate; + unsigned pal_clock_rate; + unsigned alu_mul_delay; + unsigned alu_div_delay; + unsigned wram_init_value; + } cpu; + + struct SMP { + unsigned ntsc_clock_rate; + unsigned pal_clock_rate; + } smp; + + struct PPU1 { + unsigned version; + } ppu1; + + struct PPU2 { + unsigned version; + } ppu2; + + struct SuperFX { + unsigned speed; + } superfx; + + Configuration(); +}; + +extern Configuration config; diff --git a/Mednafen/mednafen/snes/src/system/debugger/debugger.cpp b/Mednafen/mednafen/snes/src/system/debugger/debugger.cpp new file mode 100755 index 0000000000..a1bb2a0eb0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/debugger/debugger.cpp @@ -0,0 +1,107 @@ +#ifdef SYSTEM_CPP + +Debugger debugger; + +void Debugger::breakpoint_test(Debugger::Breakpoint::Source source, Debugger::Breakpoint::Mode mode, unsigned addr, uint8 data) { + for(unsigned i = 0; i < Breakpoints; i++) { + if(breakpoint[i].enabled == false) continue; + + //shadow S-CPU WRAM addresses ($00-3f|80-bf:0000-1fff mirrors $7e:0000-1fff) + if(source == Debugger::Breakpoint::CPUBus && ( + ((breakpoint[i].addr & 0x40e000) == 0x000000) || //$00-3f|80-bf:0000-1fff + ((breakpoint[i].addr & 0xffe000) == 0x7e0000) //$7e:0000-1fff + ) + ) { + if((breakpoint[i].addr & 0x1fff) != (addr & 0x1fff)) continue; + } else { + if(breakpoint[i].addr != addr) continue; + } + + if(breakpoint[i].data != -1 && breakpoint[i].data != data) continue; + if(breakpoint[i].source != source) continue; + if(breakpoint[i].mode != mode) continue; + + breakpoint[i].counter++; + breakpoint_hit = i; + break_event = BreakpointHit; + scheduler.exit(Scheduler::DebuggerEvent); + break; + } +} + +uint8 Debugger::read(Debugger::MemorySource source, unsigned addr) { + switch(source) { + case CPUBus: { + //do not read from memory-mapped registers that could affect program behavior + if(((addr - 0x2000) & 0x40c000) == 0x000000) break; //$00-3f:2000-5fff MMIO + return bus.read(addr & 0xffffff); + } break; + + case APURAM: { + return memory::apuram.read(addr & 0xffff); + } break; + + case VRAM: { + return memory::vram.read(addr & 0xffff); + } break; + + case OAM: { + if(addr & 0x0200) return memory::oam.read(0x0200 + (addr & 0x1f)); + return memory::oam.read(addr & 0x01ff); + } break; + + case CGRAM: { + return memory::cgram.read(addr & 0x01ff); + } break; + } + + return 0x00; +} + +void Debugger::write(Debugger::MemorySource source, unsigned addr, uint8 data) { + switch(source) { + case CPUBus: { + //do not write to memory-mapped registers that could affect program behavior + if(((addr - 0x2000) & 0x40c000) == 0x000000) break; //$00-3f:2000-5fff MMIO + memory::cartrom.write_protect(false); + bus.write(addr & 0xffffff, data); + memory::cartrom.write_protect(true); + } break; + + case APURAM: { + memory::apuram.write(addr & 0xffff, data); + } break; + + case VRAM: { + memory::vram.write(addr & 0xffff, data); + } break; + + case OAM: { + if(addr & 0x0200) memory::oam.write(0x0200 + (addr & 0x1f), data); + else memory::oam.write(addr & 0x01ff, data); + } break; + + case CGRAM: { + memory::cgram.write(addr & 0x01ff, data); + } break; + } +} + +Debugger::Debugger() { + break_event = None; + + for(unsigned n = 0; n < Breakpoints; n++) { + breakpoint[n].enabled = false; + breakpoint[n].addr = 0; + breakpoint[n].data = -1; + breakpoint[n].mode = Breakpoint::Exec; + breakpoint[n].source = Breakpoint::CPUBus; + breakpoint[n].counter = 0; + } + breakpoint_hit = 0; + + step_cpu = false; + step_smp = false; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/debugger/debugger.hpp b/Mednafen/mednafen/snes/src/system/debugger/debugger.hpp new file mode 100755 index 0000000000..f222873471 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/debugger/debugger.hpp @@ -0,0 +1,32 @@ +class Debugger { +public: + enum BreakEvent { + None, + BreakpointHit, + CPUStep, + SMPStep, + } break_event; + + enum { Breakpoints = 8 }; + struct Breakpoint { + bool enabled; + unsigned addr; + signed data; //-1 = unused + enum Mode { Exec, Read, Write } mode; + enum Source { CPUBus, APURAM, VRAM, OAM, CGRAM } source; + unsigned counter; //number of times breakpoint has been hit since being set + } breakpoint[Breakpoints]; + unsigned breakpoint_hit; + void breakpoint_test(Breakpoint::Source source, Breakpoint::Mode mode, unsigned addr, uint8 data); + + bool step_cpu; + bool step_smp; + + enum MemorySource { CPUBus, APURAM, VRAM, OAM, CGRAM }; + uint8 read(MemorySource, unsigned addr); + void write(MemorySource, unsigned addr, uint8 data); + + Debugger(); +}; + +extern Debugger debugger; diff --git a/Mednafen/mednafen/snes/src/system/input/input.cpp b/Mednafen/mednafen/snes/src/system/input/input.cpp new file mode 100755 index 0000000000..04b051a4a6 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/input/input.cpp @@ -0,0 +1,335 @@ +#ifdef SYSTEM_CPP + +Input input; + +uint8 Input::port_read(bool portnumber) { + port_t &p = port[portnumber]; + + switch(p.device) { + case DeviceJoypad: { + if(p.counter0 >= 16) return 1; + return system.interface->input_poll(portnumber, p.device, 0, p.counter0++); + } //case DeviceJoypad + + case DeviceMultitap: { + if(cpu.joylatch()) return 2; //when latch is high -- data2 = 1, data1 = 0 + + unsigned deviceidx, deviceindex0, deviceindex1; + uint8 mask = (portnumber == 0 ? 0x40 : 0x80); + + if(cpu.pio() & mask) { + deviceidx = p.counter0; + if(deviceidx >= 16) return 3; + p.counter0++; + + deviceindex0 = 0; //controller 1 + deviceindex1 = 1; //controller 2 + } else { + deviceidx = p.counter1; + if(deviceidx >= 16) return 3; + p.counter1++; + + deviceindex0 = 2; //controller 3 + deviceindex1 = 3; //controller 4 + } + + return (system.interface->input_poll(portnumber, p.device, deviceindex0, deviceidx) << 0) + | (system.interface->input_poll(portnumber, p.device, deviceindex1, deviceidx) << 1); + } //case DeviceMultitap + + case DeviceMouse: { + if(p.counter0 >= 32) return 1; + + int position_x = system.interface->input_poll(portnumber, p.device, 0, MouseX); //-n = left, 0 = center, +n = right + int position_y = system.interface->input_poll(portnumber, p.device, 0, MouseY); //-n = up, 0 = center, +n = right + + bool direction_x = position_x < 0; //0 = right, 1 = left + bool direction_y = position_y < 0; //0 = down, 1 = up + + if(position_x < 0) position_x = -position_x; //abs(position_x) + if(position_y < 0) position_y = -position_y; //abs(position_x) + + position_x = min(127, position_x); //range = 0 - 127 + position_y = min(127, position_y); //range = 0 - 127 + + switch(p.counter0++) { default: + case 0: return 0; + case 1: return 0; + case 2: return 0; + case 3: return 0; + case 4: return 0; + case 5: return 0; + case 6: return 0; + case 7: return 0; + + case 8: return system.interface->input_poll(portnumber, p.device, 0, MouseRight); + case 9: return system.interface->input_poll(portnumber, p.device, 0, MouseLeft); + case 10: return 0; //speed (0 = slow, 1 = normal, 2 = fast, 3 = unused) + case 11: return 0; // || + + case 12: return 0; //signature + case 13: return 0; // || + case 14: return 0; // || + case 15: return 1; // || + + case 16: return (direction_y) & 1; + case 17: return (position_y >> 6) & 1; + case 18: return (position_y >> 5) & 1; + case 19: return (position_y >> 4) & 1; + case 20: return (position_y >> 3) & 1; + case 21: return (position_y >> 2) & 1; + case 22: return (position_y >> 1) & 1; + case 23: return (position_y >> 0) & 1; + + case 24: return (direction_x) & 1; + case 25: return (position_x >> 6) & 1; + case 26: return (position_x >> 5) & 1; + case 27: return (position_x >> 4) & 1; + case 28: return (position_x >> 3) & 1; + case 29: return (position_x >> 2) & 1; + case 30: return (position_x >> 1) & 1; + case 31: return (position_x >> 0) & 1; + } + } //case DeviceMouse + + case DeviceSuperScope: { + if(portnumber == 0) break; //Super Scope in port 1 not supported ... + if(p.counter0 >= 8) return 1; + + if(p.counter0 == 0) { + //turbo is a switch; toggle is edge sensitive + bool turbo = system.interface->input_poll(portnumber, p.device, 0, SuperScopeTurbo); + if(turbo && !p.superscope.turbolock) { + p.superscope.turbo = !p.superscope.turbo; //toggle state + p.superscope.turbolock = true; + } else if(!turbo) { + p.superscope.turbolock = false; + } + + //trigger is a button + //if turbo is active, trigger is level sensitive; otherwise it is edge sensitive + p.superscope.trigger = false; + bool trigger = system.interface->input_poll(portnumber, p.device, 0, SuperScopeTrigger); + if(trigger && (p.superscope.turbo || !p.superscope.triggerlock)) { + p.superscope.trigger = true; + p.superscope.triggerlock = true; + } else if(!trigger) { + p.superscope.triggerlock = false; + } + + //cursor is a button; it is always level sensitive + p.superscope.cursor = system.interface->input_poll(portnumber, p.device, 0, SuperScopeCursor); + + //pause is a button; it is always edge sensitive + p.superscope.pause = false; + bool pause = system.interface->input_poll(portnumber, p.device, 0, SuperScopePause); + if(pause && !p.superscope.pauselock) { + p.superscope.pause = true; + p.superscope.pauselock = true; + } else if(!pause) { + p.superscope.pauselock = false; + } + + p.superscope.offscreen = + p.superscope.x < 0 || p.superscope.x >= 256 + || p.superscope.y < 0 || p.superscope.y >= (ppu.overscan() ? 240 : 225); + } + + switch(p.counter0++) { + case 0: return p.superscope.trigger; + case 1: return p.superscope.cursor; + case 2: return p.superscope.turbo; + case 3: return p.superscope.pause; + case 4: return 0; + case 5: return 0; + case 6: return p.superscope.offscreen; + case 7: return 0; //noise (1 = yes) + } + } //case DeviceSuperScope + + case DeviceJustifier: + case DeviceJustifiers: { + if(portnumber == 0) break; //Justifier in port 1 not supported ... + if(p.counter0 >= 32) return 1; + + if(p.counter0 == 0) { + p.justifier.trigger1 = system.interface->input_poll(portnumber, p.device, 0, JustifierTrigger); + p.justifier.start1 = system.interface->input_poll(portnumber, p.device, 0, JustifierStart); + + if(p.device == DeviceJustifiers) { + p.justifier.trigger2 = system.interface->input_poll(portnumber, p.device, 1, JustifierTrigger); + p.justifier.start2 = system.interface->input_poll(portnumber, p.device, 1, JustifierStart); + } else { + p.justifier.x2 = -1; + p.justifier.y2 = -1; + + p.justifier.trigger2 = false; + p.justifier.start2 = false; + } + } + + switch(p.counter0++) { + case 0: return 0; + case 1: return 0; + case 2: return 0; + case 3: return 0; + case 4: return 0; + case 5: return 0; + case 6: return 0; + case 7: return 0; + case 8: return 0; + case 9: return 0; + case 10: return 0; + case 11: return 0; + + case 12: return 1; //signature + case 13: return 1; // || + case 14: return 1; // || + case 15: return 0; // || + + case 16: return 0; + case 17: return 1; + case 18: return 0; + case 19: return 1; + case 20: return 0; + case 21: return 1; + case 22: return 0; + case 23: return 1; + + case 24: return p.justifier.trigger1; + case 25: return p.justifier.trigger2; + case 26: return p.justifier.start1; + case 27: return p.justifier.start2; + case 28: return p.justifier.active; + + case 29: return 0; + case 30: return 0; + case 31: return 0; + } + } //case DeviceJustifier(s) + } //switch(p.device) + + //no device connected + return 0; +} + +//scan all input; update cursor positions if needed +void Input::update() { + system.interface->input_poll(); + port_t &p = port[1]; + + switch(p.device) { + case DeviceSuperScope: { + int x = system.interface->input_poll(1, p.device, 0, SuperScopeX); + int y = system.interface->input_poll(1, p.device, 0, SuperScopeY); + + p.superscope.x = max(-16, min(256 + 16, x)); + p.superscope.y = max(-16, min(240 + 16, y)); + + latchx = p.superscope.x; + latchy = p.superscope.y; + } break; + + case DeviceJustifier: + case DeviceJustifiers: { + int x1 = system.interface->input_poll(1, p.device, 0, JustifierX); + int y1 = system.interface->input_poll(1, p.device, 0, JustifierY); + x1 += p.justifier.x1; + y1 += p.justifier.y1; + p.justifier.x1 = max(-16, min(256 + 16, x1)); + p.justifier.y1 = max(-16, min(240 + 16, y1)); + + int x2 = system.interface->input_poll(1, p.device, 1, JustifierX); + int y2 = system.interface->input_poll(1, p.device, 1, JustifierY); + x2 += p.justifier.x2; + y2 += p.justifier.y2; + p.justifier.x2 = max(-16, min(256 + 16, x2)); + p.justifier.y2 = max(-16, min(240 + 16, y2)); + + if(p.justifier.active == 0) { + latchx = p.justifier.x1; + latchy = p.justifier.y1; + } else { + latchx = (p.device == DeviceJustifiers ? p.justifier.x2 : -1); + latchy = (p.device == DeviceJustifiers ? p.justifier.y2 : -1); + } + } break; + } + + if(latchy < 0 || latchy >= (ppu.overscan() ? 240 : 225) || latchx < 0 || latchx >= 256) { + //cursor is offscreen, set to invalid position so counters are not latched + latchx = ~0; + latchy = ~0; + } else { + //cursor is onscreen + latchx += 40; //offset trigger position to simulate hardware latching delay + latchx <<= 2; //dot -> clock conversion + latchx += 2; //align trigger on half-dot ala interrupts (speed optimization for sCPU::add_clocks) + } +} + +void Input::port_set_device(bool portnumber, unsigned device) { + port_t &p = port[portnumber]; + + p.device = device; + p.counter0 = 0; + p.counter1 = 0; + + //set iobit to true if device is capable of latching PPU counters + iobit = port[1].device == DeviceSuperScope + || port[1].device == DeviceJustifier + || port[1].device == DeviceJustifiers; + latchx = -1; + latchy = -1; + + if(device == DeviceSuperScope) { + p.superscope.x = 0; + p.superscope.y = 0; + + p.superscope.trigger = false; + p.superscope.cursor = false; + p.superscope.turbo = false; + p.superscope.pause = false; + p.superscope.offscreen = false; + + p.superscope.turbolock = false; + p.superscope.triggerlock = false; + p.superscope.pauselock = false; + } else if(device == DeviceJustifier) { + p.justifier.active = 0; + p.justifier.x1 = 256 / 2; + p.justifier.y1 = 240 / 2; + p.justifier.x2 = -1; + p.justifier.y2 = -1; + + p.justifier.trigger1 = false; + p.justifier.trigger2 = false; + p.justifier.start1 = false; + p.justifier.start2 = false; + } else if(device == DeviceJustifiers) { + p.justifier.active = 0; + p.justifier.x1 = 256 / 2 - 16; + p.justifier.y1 = 240 / 2; + p.justifier.x2 = 256 / 2 + 16; + p.justifier.y2 = 240 / 2; + + p.justifier.trigger1 = false; + p.justifier.trigger2 = false; + p.justifier.start1 = false; + p.justifier.start2 = false; + } +} + +void Input::poll() { + port[0].counter0 = 0; + port[0].counter1 = 0; + port[1].counter0 = 0; + port[1].counter1 = 0; + + port[1].justifier.active = !port[1].justifier.active; +} + +void Input::init() { +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/input/input.hpp b/Mednafen/mednafen/snes/src/system/input/input.hpp new file mode 100755 index 0000000000..0c92ddca04 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/input/input.hpp @@ -0,0 +1,94 @@ +class Input { +public: + enum Device { + DeviceNone, + DeviceJoypad, + DeviceMultitap, + DeviceMouse, + DeviceSuperScope, + DeviceJustifier, + DeviceJustifiers, + }; + + enum JoypadID { + JoypadB = 0, JoypadY = 1, + JoypadSelect = 2, JoypadStart = 3, + JoypadUp = 4, JoypadDown = 5, + JoypadLeft = 6, JoypadRight = 7, + JoypadA = 8, JoypadX = 9, + JoypadL = 10, JoypadR = 11, + }; + + enum MouseID { + MouseX = 0, MouseY = 1, + MouseLeft = 2, MouseRight = 3, + }; + + enum SuperScopeID { + SuperScopeX = 0, SuperScopeY = 1, + SuperScopeTrigger = 2, SuperScopeCursor = 3, + SuperScopeTurbo = 4, SuperScopePause = 5, + }; + + enum JustifierID { + JustifierX = 0, JustifierY = 1, + JustifierTrigger = 2, JustifierStart = 3, + }; + + uint8 port_read(bool port); + void port_set_device(bool port, unsigned device); + void init(); + void poll(); + void update(); + + //light guns (Super Scope, Justifier(s)) strobe IOBit whenever the CRT + //beam cannon is detected. this needs to be tested at the cycle level + //(hence inlining here for speed) to avoid 'dead space' during DRAM refresh. + //iobit is updated during port_set_device(), + //latchx, latchy are updated during update() (once per frame) + alwaysinline void tick() { + //only test if Super Scope or Justifier is connected + if(iobit && cpu.vcounter() == latchy && cpu.hcounter() == latchx) { + ppu.latch_counters(); + } + } + +//private: + bool iobit; + int16_t latchx, latchy; + + struct port_t { + unsigned device; + unsigned counter0; //read counters + unsigned counter1; + + struct superscope_t { + int x, y; + + bool trigger; + bool cursor; + bool turbo; + bool pause; + bool offscreen; + + bool turbolock; + bool triggerlock; + bool pauselock; + } superscope; + + struct justifier_t { + bool active; + + int x1, x2; + int y1, y2; + + bool trigger1, trigger2; + bool start1, start2; + } justifier; + } port[2]; + + friend class System; + friend class Video; +}; + +extern Input input; diff --git a/Mednafen/mednafen/snes/src/system/interface/interface.hpp b/Mednafen/mednafen/snes/src/system/interface/interface.hpp new file mode 100755 index 0000000000..4243193e1c --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/interface/interface.hpp @@ -0,0 +1,7 @@ +class Interface { +public: + void video_scanline(uint16_t *data, unsigned line, unsigned width, unsigned height, bool interlace, bool field); + void audio_sample(uint16_t l_sample, uint16_t r_sample); + void input_poll(); + int16_t input_poll(bool port, unsigned device, unsigned index, unsigned id); +}; diff --git a/Mednafen/mednafen/snes/src/system/scheduler/scheduler.cpp b/Mednafen/mednafen/snes/src/system/scheduler/scheduler.cpp new file mode 100755 index 0000000000..9c4ddce1bb --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/scheduler/scheduler.cpp @@ -0,0 +1,67 @@ +#ifdef SYSTEM_CPP + +Scheduler scheduler; + +void threadentry_cpu() { cpu.enter(); } +void threadentry_cop() { system.coprocessor_enter(); } +void threadentry_smp() { smp.enter(); } +void threadentry_ppu() { ppu.enter(); } +void threadentry_dsp() { dsp.enter(); } + +void Scheduler::enter() { + co_switch(thread_active); +} + +void Scheduler::exit(ExitReason reason) { + exit_reason_ = reason; + co_switch(thread_snes); +} + +Scheduler::ExitReason Scheduler::exit_reason() const { + return exit_reason_; +} + +void Scheduler::init() { + clock.cpu_freq = system.region() == System::NTSC + ? config.cpu.ntsc_clock_rate + : config.cpu.pal_clock_rate; + clock.smp_freq = system.region() == System::NTSC + ? config.smp.ntsc_clock_rate + : config.smp.pal_clock_rate; + clock.cop_freq = clock.cpu_freq; + + clock.cpucop = 0; + clock.cpuppu = 0; + clock.cpusmp = 0; + clock.smpdsp = 0; + + if(thread_cpu) co_delete(thread_cpu); + if(thread_cop) co_delete(thread_cop); + if(thread_smp) co_delete(thread_smp); + if(thread_ppu) co_delete(thread_ppu); + if(thread_dsp) co_delete(thread_dsp); + + thread_snes = co_active(); + thread_cpu = co_create(65536 * sizeof(void*), threadentry_cpu); + thread_cop = co_create(65536 * sizeof(void*), threadentry_cop); + thread_smp = co_create(65536 * sizeof(void*), threadentry_smp); + thread_ppu = co_create(65536 * sizeof(void*), threadentry_ppu); + thread_dsp = co_create(65536 * sizeof(void*), threadentry_dsp); + + //start execution with S-CPU after reset + thread_active = thread_cpu; +} + +Scheduler::Scheduler() { + thread_snes = 0; + thread_cpu = 0; + thread_cop = 0; + thread_smp = 0; + thread_ppu = 0; + thread_dsp = 0; + thread_active = 0; + + exit_reason_ = UnknownEvent; +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/scheduler/scheduler.hpp b/Mednafen/mednafen/snes/src/system/scheduler/scheduler.hpp new file mode 100755 index 0000000000..ac7b8dfe34 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/scheduler/scheduler.hpp @@ -0,0 +1,142 @@ +//scheduler thread relationships: +//S-PPU <-> S-CPU <-> cartridge co-processor +// <|> +// S-SMP <-> S-DSP + +class Scheduler { +public: + cothread_t thread_snes; + cothread_t thread_cpu; //S-CPU (5a22) + cothread_t thread_cop; //cartridge co-processor (SuperFX, SA-1, ...) + cothread_t thread_smp; //S-SMP (SPC700) + cothread_t thread_ppu; //S-PPU + cothread_t thread_dsp; //S-DSP + cothread_t thread_active; //reference to active thread + + struct { + uint32 cpu_freq; + uint32 cop_freq; + uint32 smp_freq; + + int64 cpucop; + int64 cpuppu; + int64 cpusmp; + int64 smpdsp; + } clock; + + enum sync_t { SyncNone, SyncCpu, SyncAll } sync; + + //========== + //CPU <> COP + //========== + + alwaysinline void sync_cpucop() { + if(clock.cpucop < 0) { + thread_active = thread_cop; + co_switch(thread_cop); + } + } + + alwaysinline void sync_copcpu() { + if(clock.cpucop >= 0 && sync != SyncAll) { + thread_active = thread_cpu; + co_switch(thread_cpu); + } + } + + //========== + //CPU <> PPU + //========== + + alwaysinline void sync_cpuppu() { + if(clock.cpuppu < 0) { + thread_active = thread_ppu; + co_switch(thread_ppu); + } + } + + alwaysinline void sync_ppucpu() { + if(clock.cpuppu >= 0 && sync != SyncAll) { + thread_active = thread_cpu; + co_switch(thread_cpu); + } + } + + //========== + //CPU <> SMP + //========== + + alwaysinline void sync_cpusmp() { + if(clock.cpusmp < 0) { + thread_active = thread_smp; + co_switch(thread_smp); + } + } + + alwaysinline void sync_smpcpu() { + if(clock.cpusmp >= 0 && sync != SyncAll) { + thread_active = thread_cpu; + co_switch(thread_cpu); + } + } + + //========== + //SMP <> DSP + //========== + + alwaysinline void sync_smpdsp() { + if(clock.smpdsp < 0 && sync != SyncAll) { + thread_active = thread_dsp; + co_switch(thread_dsp); + } + } + + alwaysinline void sync_dspsmp() { + if(clock.smpdsp >= 0 && sync != SyncAll) { + thread_active = thread_smp; + co_switch(thread_smp); + } + } + + //========== + //add clocks + //========== + + alwaysinline void addclocks_cpu(unsigned clocks) { + clock.cpucop -= clocks * (uint64)clock.cop_freq; + clock.cpuppu -= clocks; + clock.cpusmp -= clocks * (uint64)clock.smp_freq; + } + + alwaysinline void addclocks_cop(unsigned clocks) { + clock.cpucop += clocks * (uint64)clock.cpu_freq; + } + + alwaysinline void addclocks_ppu(unsigned clocks) { + clock.cpuppu += clocks; + } + + alwaysinline void addclocks_smp(unsigned clocks) { + clock.cpusmp += clocks * (uint64)clock.cpu_freq; + clock.smpdsp -= clocks; + } + + alwaysinline void addclocks_dsp(unsigned clocks) { + clock.smpdsp += clocks; + } + + enum ExitReason { UnknownEvent, FrameEvent, SynchronizeEvent, DebuggerEvent }; + + void enter(); + void exit(ExitReason); + ExitReason exit_reason() const; + + void init(); + + Scheduler(); + +private: + ExitReason exit_reason_; +}; + +extern Scheduler scheduler; diff --git a/Mednafen/mednafen/snes/src/system/serialization.cpp b/Mednafen/mednafen/snes/src/system/serialization.cpp new file mode 100755 index 0000000000..46662a9f9b --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/serialization.cpp @@ -0,0 +1,93 @@ +#ifdef SYSTEM_CPP + +void System::serialize(serializer &s) { + unsigned signature = 0x31545342, version = bsnesSerializerVersion, crc32 = cartridge.crc32(); + char description[512]; + + memset(&description, 0, sizeof description); + + s.integer(signature); + s.integer(version); + s.integer(crc32); + s.array(description); + + serialize_all(s); +} + +bool System::unserialize(serializer &s) { + unsigned signature, version, crc32; + char description[512]; + + s.integer(signature); + s.integer(version); + s.integer(crc32); + s.array(description); + + if(signature != 0x31545342) return false; + if(version != bsnesSerializerVersion) return false; +//if(crc32 != cartridge.crc32()) return false; + scheduler.init(); + + serialize_all(s); + return true; +} + +//======== +//internal +//======== + +void System::serialize_all(serializer &s) { + bus.serialize(s); + cartridge.serialize(s); + + // + // + s.integer((unsigned&)region); + s.integer((unsigned&)expansion); + + s.integer(scheduler.clock.cpu_freq); + s.integer(scheduler.clock.smp_freq); + + s.integer(scheduler.clock.cpucop); + s.integer(scheduler.clock.cpuppu); + s.integer(scheduler.clock.cpusmp); + s.integer(scheduler.clock.smpdsp); + // + // + + cpu.serialize(s); + smp.serialize(s); + ppu.serialize(s); + dsp.serialize(s); + + if(cartridge.has_superfx()) superfx.serialize(s); + if(cartridge.has_sa1()) sa1.serialize(s); + if(cartridge.has_srtc()) srtc.serialize(s); + if(cartridge.has_sdd1()) sdd1.serialize(s); + if(cartridge.has_spc7110()) spc7110.serialize(s); + if(cartridge.has_cx4()) cx4.serialize(s); + if(cartridge.has_dsp1()) dsp1.serialize(s); + if(cartridge.has_dsp2()) dsp2.serialize(s); + if(cartridge.has_obc1()) obc1.serialize(s); + if(cartridge.has_st010()) st010.serialize(s); +} + +//called once upon cartridge load event: perform dry-run state save. +//determines exactly how many bytes are needed to save state for this cartridge, +//as amount varies per game (eg different RAM sizes, special chips, etc.) +void System::serialize_init() { + serializer s; + + unsigned signature = 0, version = 0, crc32 = 0; + char description[512]; + + s.integer(signature); + s.integer(version); + s.integer(crc32); + s.array(description); + + serialize_all(s); + serialize_size = s.size(); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/system.cpp b/Mednafen/mednafen/snes/src/system/system.cpp new file mode 100755 index 0000000000..978b016d17 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/system.cpp @@ -0,0 +1,238 @@ +#include <../base.hpp> + +#define SYSTEM_CPP +namespace bSNES_v059 { + +System system; + +#include "config/config.cpp" +#include "debugger/debugger.cpp" +#include "serialization.cpp" +#include "scheduler/scheduler.cpp" + +#include "video/video.cpp" +#include "audio/audio.cpp" +#include "input/input.cpp" + +void System::coprocessor_enter() { + if(cartridge.has_superfx()) superfx.enter(); + if(cartridge.has_sa1()) sa1.enter(); + + while(true) { + while(scheduler.sync == Scheduler::SyncAll) { + scheduler.exit(Scheduler::SynchronizeEvent); + } + + scheduler.addclocks_cop(64 * 1024 * 1024); + scheduler.sync_copcpu(); + } +} + +void System::run_mednafen_custom() +{ + exit_line_counter = 0; + + //if(scheduler.exit_reason() == Scheduler::FrameEvent) // Commenting this out, causes latency when state rewinding is enabled. + input.update(); + + scheduler.sync = Scheduler::SyncNone; + + scheduler.enter(); + if(scheduler.exit_reason() == Scheduler::FrameEvent) { + //input.update(); + video.update(); + } +} + +void System::run() { + exit_line_counter = 0; + scheduler.sync = Scheduler::SyncNone; + + scheduler.enter(); + if(scheduler.exit_reason() == Scheduler::FrameEvent) { + input.update(); + video.update(); + } +} + +void System::runtosave() { + exit_line_counter = 0; + + scheduler.sync = Scheduler::SyncCpu; + runthreadtosave(); + + scheduler.thread_active = scheduler.thread_cop; + runthreadtosave(); + + scheduler.thread_active = scheduler.thread_smp; + runthreadtosave(); + + scheduler.thread_active = scheduler.thread_ppu; + runthreadtosave(); + + #if !defined(DSP_STATE_MACHINE) + scheduler.thread_active = scheduler.thread_dsp; + runthreadtosave(); + #endif +} + +void System::runthreadtosave() { + while(true) { + scheduler.enter(); + if(scheduler.exit_reason() == Scheduler::SynchronizeEvent) break; + if(scheduler.exit_reason() == Scheduler::FrameEvent) { + input.update(); + video.update(); + } + } +} + +void System::init(Interface *interface_) { + interface = interface_; + assert(interface != 0); + + superfx.init(); + sa1.init(); + bsxbase.init(); + bsxcart.init(); + bsxflash.init(); + srtc.init(); + sdd1.init(); + spc7110.init(); + cx4.init(); + dsp1.init(); + dsp2.init(); + dsp3.init(); + dsp4.init(); + obc1.init(); + st010.init(); + + video.init(); + audio.init(); + input.init(); +} + +void System::term() { +} + +void System::power() { + region = max(0, min(2, config.region)); + expansion = max(0, min(1, config.expansion_port)); + + if(region == Autodetect) { + region = (cartridge.region() == Cartridge::NTSC ? NTSC : PAL); + } + + audio.coprocessor_enable(false); + + scheduler.init(); + bus.power(); + + for(unsigned i = 0x2100; i <= 0x213f; i++) memory::mmio.map(i, ppu); + for(unsigned i = 0x2140; i <= 0x217f; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x2180; i <= 0x2183; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x4016; i <= 0x4017; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x4200; i <= 0x421f; i++) memory::mmio.map(i, cpu); + for(unsigned i = 0x4300; i <= 0x437f; i++) memory::mmio.map(i, cpu); + + if(expansion() == ExpansionBSX) bsxbase.enable(); + if(memory::bsxflash.data()) bsxflash.enable(); + if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.enable(); + + if(cartridge.has_superfx()) superfx.enable(); + if(cartridge.has_sa1()) sa1.enable(); + if(cartridge.has_srtc()) srtc.enable(); + if(cartridge.has_sdd1()) sdd1.enable(); + if(cartridge.has_spc7110()) spc7110.enable(); + if(cartridge.has_cx4()) cx4.enable(); + if(cartridge.has_dsp1()) dsp1.enable(); + if(cartridge.has_dsp2()) dsp2.enable(); + if(cartridge.has_dsp3()) dsp3.enable(); + if(cartridge.has_dsp4()) dsp4.enable(); + if(cartridge.has_obc1()) obc1.enable(); + if(cartridge.has_st010()) st010.enable(); + + if(expansion() == ExpansionBSX) bsxbase.power(); + if(memory::bsxflash.data()) bsxflash.power(); + if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.power(); + + if(cartridge.has_superfx()) superfx.power(); + if(cartridge.has_sa1()) sa1.power(); + if(cartridge.has_srtc()) srtc.power(); + if(cartridge.has_sdd1()) sdd1.power(); + if(cartridge.has_spc7110()) spc7110.power(); + if(cartridge.has_cx4()) cx4.power(); + if(cartridge.has_dsp1()) dsp1.power(); + if(cartridge.has_dsp2()) dsp2.power(); + if(cartridge.has_dsp3()) dsp3.power(); + if(cartridge.has_dsp4()) dsp4.power(); + if(cartridge.has_obc1()) obc1.power(); + if(cartridge.has_st010()) st010.power(); + + cpu.power(); + smp.power(); + dsp.power(); + ppu.power(); + + input.port_set_device(0, config.controller_port1); + input.port_set_device(1, config.controller_port2); + input.update(); + video.update(); +} + +void System::reset() { + scheduler.init(); + + cpu.reset(); + smp.reset(); + dsp.reset(); + ppu.reset(); + bus.reset(); + + if(expansion() == ExpansionBSX) bsxbase.reset(); + if(memory::bsxflash.data()) bsxflash.reset(); + if(cartridge.mode() == Cartridge::ModeBsx) bsxcart.reset(); + + if(cartridge.has_superfx()) superfx.reset(); + if(cartridge.has_sa1()) sa1.reset(); + if(cartridge.has_srtc()) srtc.reset(); + if(cartridge.has_sdd1()) sdd1.reset(); + if(cartridge.has_spc7110()) spc7110.reset(); + if(cartridge.has_cx4()) cx4.reset(); + if(cartridge.has_dsp1()) dsp1.reset(); + if(cartridge.has_dsp2()) dsp2.reset(); + if(cartridge.has_dsp3()) dsp3.reset(); + if(cartridge.has_dsp4()) dsp4.reset(); + if(cartridge.has_obc1()) obc1.reset(); + if(cartridge.has_st010()) st010.reset(); + + input.port_set_device(0, config.controller_port1); + input.port_set_device(1, config.controller_port2); + input.update(); + video.update(); +} + +void System::unload() { +} + +void System::scanline() { + video.scanline(); + exit_line_counter++; + +// if(cpu.vcounter() == 241) scheduler.exit(Scheduler::FrameEvent); + if((cpu.vcounter() == 241 && exit_line_counter > 100) || (!ppu.overscan() && cpu.vcounter() == 226)) // Input latency reduction fun. + { + //printf("Exit: %u\n", cpu.vcounter()); + scheduler.exit(Scheduler::FrameEvent); + } +} + +void System::frame() { +} + +System::System() : interface(0) { + region = NTSC; + expansion = ExpansionNone; +} + +}; diff --git a/Mednafen/mednafen/snes/src/system/system.hpp b/Mednafen/mednafen/snes/src/system/system.hpp new file mode 100755 index 0000000000..1d4e9bfb95 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/system.hpp @@ -0,0 +1,59 @@ +#include "config/config.hpp" +#include "debugger/debugger.hpp" +#include "interface/interface.hpp" +#include "scheduler/scheduler.hpp" + +#include "video/video.hpp" +#include "audio/audio.hpp" +#include "input/input.hpp" + +class System : property { +public: + enum Region { NTSC = 0, PAL = 1 }; + enum RegionAutodetect { Autodetect = 2 }; + enum ExpansionPortDevice { ExpansionNone = 0, ExpansionBSX = 1 }; + + void run_mednafen_custom(); + + void run(); + void runtosave(); + + void init(Interface*); + void term(); + void power(); + void reset(); + void unload(); + + void frame(); + void scanline(); + + //return *active* system information (settings are cached upon power-on) + readonly region; + readonly expansion; + readonly serialize_size; + + void serialize(serializer&); + bool unserialize(serializer&); + + System(); + virtual ~System() {} + +private: + Interface *interface; + void coprocessor_enter(); + void runthreadtosave(); + + void serialize_all(serializer&); + void serialize_init(); + + friend class Cartridge; + friend class Video; + friend class Audio; + friend class Input; + friend class StateManager; + friend void threadentry_cop(); + + unsigned exit_line_counter; +}; + +extern System system; diff --git a/Mednafen/mednafen/snes/src/system/video/video.cpp b/Mednafen/mednafen/snes/src/system/video/video.cpp new file mode 100755 index 0000000000..e5eeba19b1 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/video/video.cpp @@ -0,0 +1,99 @@ +#ifdef SYSTEM_CPP + +Video video; + +const uint8_t Video::cursor[15][16] = { + { 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0 }, + { 0,0,0,0,1,1,2,2,2,1,1,0,0,0,0 }, + { 0,0,0,1,2,2,1,2,1,2,2,1,0,0,0 }, + { 0,0,1,2,1,1,0,1,0,1,1,2,1,0,0 }, + { 0,1,2,1,0,0,0,1,0,0,0,1,2,1,0 }, + { 0,1,2,1,0,0,1,2,1,0,0,1,2,1,0 }, + { 1,2,1,0,0,1,1,2,1,1,0,0,1,2,1 }, + { 1,2,2,1,1,2,2,2,2,2,1,1,2,2,1 }, + { 1,2,1,0,0,1,1,2,1,1,0,0,1,2,1 }, + { 0,1,2,1,0,0,1,2,1,0,0,1,2,1,0 }, + { 0,1,2,1,0,0,0,1,0,0,0,1,2,1,0 }, + { 0,0,1,2,1,1,0,1,0,1,1,2,1,0,0 }, + { 0,0,0,1,2,2,1,2,1,2,2,1,0,0,0 }, + { 0,0,0,0,1,1,2,2,2,1,1,0,0,0,0 }, + { 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0 } +}; + +void Video::draw_cursor(const int rline, const bool hires, const uint16_t color, const int x, const int y) +{ + const int cy = rline - y + 7; + + if(cy < 0 || cy > 14) + return; + + for(int cx = 0; cx < 15; cx++) { + int vx = x + cx - 7; + if(vx < 0 || vx >= 256) continue; //do not draw offscreen + uint8_t pixel = cursor[cy][cx]; + if(pixel == 0) continue; + uint16_t pixelcolor = (pixel == 1) ? 0 : color; + + if(hires == false) { + ppu.line_output[vx] = pixelcolor; + } else { + ppu.line_output[vx * 2 + 0] = pixelcolor; + ppu.line_output[vx * 2 + 1] = pixelcolor; + } + } +} + +void Video::update() { + frame_interlace = false; +} + +void Video::scanline() { + unsigned y = cpu.vcounter(); + if(y >= 240) return; + + if(y == 0) + { + frame_field = cpu.field(); + frame_interlace = ppu.interlace(); + } +} + +void Video::render_scanline(unsigned line) +{ + const bool hires = ppu.hires(); + unsigned yoffset = 1; //scanline 0 is always black, skip this line for video output + unsigned width = (hires ? 512 : 256); + unsigned height; + + switch(input.port[1].device) { + case Input::DeviceSuperScope: draw_cursor(line, hires, 0x001f, input.port[1].superscope.x, input.port[1].superscope.y); break; + case Input::DeviceJustifiers: draw_cursor(line, hires, 0x02e0, input.port[1].justifier.x2, input.port[1].justifier.y2); //fallthrough + case Input::DeviceJustifier: draw_cursor(line, hires, 0x001f, input.port[1].justifier.x1, input.port[1].justifier.y1); break; + } + + if(mode == ModeNTSC && ppu.overscan()) yoffset += 8; //NTSC overscan centers x240 height image + //printf("%u\n", ppu.overscan()); + switch(mode) { + default: + case ModeNTSC: { height = 224; } break; + case ModePAL: { height = 239; } break; + } + + if(line >= yoffset && line < (yoffset + height)) + { + //printf("%d --- %d\n", line, line - yoffset); + system.interface->video_scanline(ppu.line_output, line - yoffset, width, height, frame_interlace, frame_field); + } +} + +void Video::set_mode(Mode mode_) { + mode = mode_; +} + +void Video::init() { + frame_interlace = false; + frame_field = false; + set_mode(ModeNTSC); +} + +#endif diff --git a/Mednafen/mednafen/snes/src/system/video/video.hpp b/Mednafen/mednafen/snes/src/system/video/video.hpp new file mode 100755 index 0000000000..cd437710c0 --- /dev/null +++ b/Mednafen/mednafen/snes/src/system/video/video.hpp @@ -0,0 +1,26 @@ +class Video { +public: + enum Mode { + ModeNTSC, + ModePAL, + }; + void set_mode(Mode); + +private: + Mode mode; + bool frame_interlace; + bool frame_field; + + void update(); + void scanline(); + void render_scanline(unsigned line); + void init(); + + static const uint8_t cursor[15][16]; + void draw_cursor(const int rline, const bool hires, const uint16_t color, const int x, const int y); + + friend class System; + friend class PPU; // Just for render_scanline() +}; + +extern Video video; diff --git a/Mednafen/mednafen/snes_faust/Makefile.am b/Mednafen/mednafen/snes_faust/Makefile.am new file mode 100644 index 0000000000..f54345195e --- /dev/null +++ b/Mednafen/mednafen/snes_faust/Makefile.am @@ -0,0 +1,10 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @MMX_CFLAGS@ @SSE_CFLAGS@ @SSE2_CFLAGS@ -funroll-loops +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libsnes_faust.a +libsnes_faust_a_SOURCES = cpu.cpp snes.cpp apu.cpp cart.cpp input.cpp ppu.cpp + +#if WANT_DEBUGGER +#libsnes_faust_a_SOURCES+= debug.cpp +#endif diff --git a/Mednafen/mednafen/snes_faust/Makefile.in b/Mednafen/mednafen/snes_faust/Makefile.in new file mode 100644 index 0000000000..9174fd0ff8 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/Makefile.in @@ -0,0 +1,686 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/snes_faust +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libsnes_faust_a_AR = $(AR) $(ARFLAGS) +libsnes_faust_a_LIBADD = +am_libsnes_faust_a_OBJECTS = cpu.$(OBJEXT) snes.$(OBJEXT) \ + apu.$(OBJEXT) cart.$(OBJEXT) input.$(OBJEXT) ppu.$(OBJEXT) +libsnes_faust_a_OBJECTS = $(am_libsnes_faust_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libsnes_faust_a_SOURCES) +DIST_SOURCES = $(libsnes_faust_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @MMX_CFLAGS@ @SSE_CFLAGS@ @SSE2_CFLAGS@ -funroll-loops +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libsnes_faust.a +libsnes_faust_a_SOURCES = cpu.cpp snes.cpp apu.cpp cart.cpp input.cpp ppu.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/snes_faust/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/snes_faust/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libsnes_faust.a: $(libsnes_faust_a_OBJECTS) $(libsnes_faust_a_DEPENDENCIES) $(EXTRA_libsnes_faust_a_DEPENDENCIES) + $(AM_V_at)-rm -f libsnes_faust.a + $(AM_V_AR)$(libsnes_faust_a_AR) libsnes_faust.a $(libsnes_faust_a_OBJECTS) $(libsnes_faust_a_LIBADD) + $(AM_V_at)$(RANLIB) libsnes_faust.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cart.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppu.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snes.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +#if WANT_DEBUGGER +#libsnes_faust_a_SOURCES+= debug.cpp +#endif + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/snes_faust/PPU_DESIGN b/Mednafen/mednafen/snes_faust/PPU_DESIGN new file mode 100644 index 0000000000..00006e8924 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/PPU_DESIGN @@ -0,0 +1,71 @@ +////////////////////////// +// Linebuffer pixel format(lower 16-bits): +// +// ssss B000 mmmm B0HC +// +// ssss = subscreen priority +// mmmm = mainscreen priority +// C = Color math enable. +// H = Color half math allow(=1 on all BG and OBJ layers, unless cleared by color window). +// B = backdrop bit +// =1 on backdrop, so bytewise priority testing will work properly(and 16-bit-wise priority testing for subscreen), and for +// hires color math(since we can't use the same optimization as we used for lores color math). +// Note: Color window code as it is now will force the upper copy(0x800) to zero when forcing a pixel to black(but not the lower copy, of course). + +/////////////////// +// All priority: +// +// 0x0 = backdrop +// 0x3 = sprite prio 0 +// 0x6 = sprite prio 1 +// 0x9 = sprite prio 2 +// 0xC = sprite prio 3 +// 0xF = force FixedColor layer on top(part of non-hires color math optimization) +// +/////////////////// +// Mode 0 Priority: +// +// 0x1 = BG3 with prio 0 +// 0x2 = BG2 with prio 0 +// 0x3 = Sprites with prio 0 +// 0x4 = BG3 with prio 1 +// 0x5 = BG2 with prio 1 +// 0x6 = Sprites with prio 1 +// 0x7 = BG1 with prio 0 +// 0x8 = BG0 with prio 0 +// 0x9 = Sprites with prio 2 +// 0xA = BG1 with prio 1 +// 0xB = BG0 with prio 1 +// 0xC = Sprites with prio 3 +// +// +/////////////////// +// Mode 1 Priority: +// +// 0x2 = BG2 with prio 0 +// 0x3 = Sprites with prio 0 +// 0x5 = BG2 with prio 1 && BGMode.D3=0 +// 0x6 = Sprites with prio 1 +// 0x7 = BG1 with prio 0 +// 0x8 = BG0 with prio 0 +// 0x9 = Sprites with prio 2 +// 0xA = BG1 with prio 1 +// 0xB = BG0 with prio 1 +// 0xC = Sprites with prio 3 +// 0xD = BG2 with prio 1 && BGMode.D3=1 +// +// +/////////////////// +// Mode 3 Priority: +// +// 0x2 = BG1 with prio 0 +// 0x3 = Sprites with prio 0 +// 0x4 = BG0 with prio 0 +// 0x6 = Sprites with prio 1 +// 0x8 = BG1 with prio 1 +// 0x9 = Sprites with prio 2 +// 0xA = BG0 with prio 1 +// 0xC = Sprites with prio 3 +// +// + diff --git a/Mednafen/mednafen/snes_faust/apu.cpp b/Mednafen/mednafen/snes_faust/apu.cpp new file mode 100644 index 0000000000..b61bef5201 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/apu.cpp @@ -0,0 +1,428 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "snes.h" +#include "apu.h" + +#include + +namespace MDFN_IEN_SNES_FAUST +{ + +#include "spc700.inc" + +static const uint8 IPL[64] = +{ + 0xcd, 0xef, 0xbd, 0xe8, 0x00, 0xc6, 0x1d, 0xd0, + 0xfc, 0x8f, 0xaa, 0xf4, 0x8f, 0xbb, 0xf5, 0x78, + 0xcc, 0xf4, 0xd0, 0xfb, 0x2f, 0x19, 0xeb, 0xf4, + 0xd0, 0xfc, 0x7e, 0xf4, 0xd0, 0x0b, 0xe4, 0xf5, + 0xcb, 0xf4, 0xd7, 0x00, 0xfc, 0xd0, 0xf3, 0xab, + 0x01, 0x10, 0xef, 0x7e, 0xf4, 0x10, 0xeb, 0xba, + 0xf6, 0xda, 0x00, 0xba, 0xf4, 0xc4, 0xf4, 0xdd, + 0x5d, 0xd0, 0xdb, 0x1f, 0x00, 0x00, 0xc0, 0xff +}; + +static uint8 APURAM[65536]; +static uint8 IOFromSPC700[4]; +static uint8 IOToSPC700[4]; +static SPC700 SPC_CPU; + +static uint8 Control; + +static uint8 WizardRAM[2]; +static uint8 DSPAddr; + +static unsigned T01PreDiv; +static uint8 TTARGET[3]; +static uint8 TCOUNT[3]; +static uint8 TOUT[3]; + +static void TickTimer(unsigned which) +{ + if(Control & (1U << which)) + { + TCOUNT[which]++; + + if(TCOUNT[which] == TTARGET[which]) + { + TCOUNT[which] = 0; + TOUT[which] = (TOUT[which] + 1) & 0xF; + } + } +} + +static INLINE void TickT01PreDiv(void) +{ + T01PreDiv--; + + if(!T01PreDiv) + { + T01PreDiv = 4; + + TickTimer(0); + TickTimer(1); + } +} + +#include "dsp.inc" + +static void (MDFN_FASTCALL *SPC_Page00_WriteTable[256])(uint16, uint8); +static uint8 (MDFN_FASTCALL *SPC_Page00_ReadTable[256])(uint16); +static void (MDFN_FASTCALL *SPC_PageXX_WriteTable[256])(uint16, uint8); +static uint8 (MDFN_FASTCALL *SPC_PageXX_ReadTable[256])(uint16); +static uint8 (MDFN_FASTCALL *SPC_PageFF_ReadTable[256])(uint16); + +template +static uint8 MDFN_FASTCALL SPC_Read(uint16 A) +{ + SPC700_IOHandler(); + // + // + // + uint8 ret = APURAM[A]; + + if(special_base >= 0xFFC0 && special_base <= 0xFFFF) // IPL Area + { + if(MDFN_LIKELY(Control & 0x80)) + ret = (IPL - 0xFFC0)[A]; + } + else if(special_base >= 0x00F0 && special_base <= 0x00FF) + { + ret = 0; + + switch(special_base) + { + case 0xF2: ret = DSPAddr; + break; + + case 0xF3: ret = DSP_Read(DSPAddr); + break; + + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: ret = IOToSPC700[special_base & 0x3]; + break; + + case 0xF8: + case 0xF9: ret = WizardRAM[special_base & 0x1]; + break; + + case 0xFD: + case 0xFE: + case 0xFF: ret = TOUT[special_base - 0xFD]; + TOUT[special_base - 0xFD] = 0; + break; + } + //if(special_base >= 0xF4 && special_base <= 0xF7) + // fprintf(stderr, "[SPC700] Read: %04x %02x (%08x)\n", A, ret, special_base); + } + + return ret; +} + +template +static void MDFN_FASTCALL SPC_Write(uint16 A, uint8 V) +{ + SPC700_IOHandler(); + // + // + // + APURAM[A] = V; + + if(special_base >= 0x00F0 && special_base <= 0x00FF) + { + //if(special_base <= 0xF1 || special_base >= 0xFA) + //if(special_base >= 0xF4 && special_base <= 0xF7) + // fprintf(stderr, "[SPC700] Write: %04x %02x (%08x)\n", A, V, special_base); + + switch(special_base) + { + case 0xF1: for(unsigned t = 0; t < 3; t++) + { + if((Control ^ V) & V & (1U << t)) + { + TCOUNT[t] = 0; + TOUT[t] = 0; + } + } + + if(V & 0x10) + { + IOToSPC700[0] = IOToSPC700[1] = 0x00; + } + + if(V & 0x20) + { + IOToSPC700[2] = IOToSPC700[3] = 0x00; + } + + Control = V & 0x87; + break; + + case 0xF2: DSPAddr = V; + break; + + case 0xF3: DSP_Write(DSPAddr, V); + break; + + case 0xF4: + case 0xF5: + case 0xF6: + case 0xF7: IOFromSPC700[special_base & 0x3] = V; + break; + + case 0xF8: + case 0xF9: WizardRAM[special_base & 0x1] = V; + break; + + case 0xFA: + case 0xFB: + case 0xFC: TTARGET[special_base - 0xFA] = V; + break; + } + } +} + +static uint32 apu_last_master_timestamp; +static unsigned run_count_mod; + +static void MDFN_FASTCALL NO_INLINE APU_Update(uint32 master_timestamp) +{ + // (21477272.727 * 3129) / 65536 / 32 = 32044.594937 + // (21477272.727 / 60) * 3129 = 1120039772.71305 + assert(master_timestamp >= apu_last_master_timestamp); + int32 tmp; + int32 run_count; + + tmp = ((master_timestamp - apu_last_master_timestamp) * 3129) + run_count_mod; + apu_last_master_timestamp = master_timestamp; + run_count_mod = (uint16)tmp; + run_count = tmp >> 16; + + // + // + // + if(MDFN_LIKELY(run_count > 0)) + SPC_CPU.Run(run_count); +} + +static DEFREAD(MainCPU_APUIORead) +{ + CPUM.timestamp += MEMCYC_FAST / 2; + + APU_Update(CPUM.timestamp); + + CPUM.timestamp += MEMCYC_FAST / 2; + + //printf("[MAIN] APU Read: %08x %02x\n", A, IOFromSPC700[A & 0x3]); + + return IOFromSPC700[A & 0x3]; +} + +static DEFWRITE(MainCPU_APUIOWrite) +{ + CPUM.timestamp += MEMCYC_FAST; + + APU_Update(CPUM.timestamp); + + //printf("[MAIN] APU Write: %08x %02x\n", A, V); + + IOToSPC700[A & 0x3] = V; +} + +void APU_Reset(bool powering_up) +{ + memset(IOFromSPC700, 0x00, sizeof(IOFromSPC700)); // See: Mighty Max, Ninja Warriors Again + memset(IOToSPC700, 0x00, sizeof(IOToSPC700)); + + if(powering_up) + memset(APURAM, 0xFF, sizeof(APURAM)); + + Control = 0x80; + + memset(WizardRAM, 0xFF, sizeof(WizardRAM)); + DSPAddr = 0x00; + + T01PreDiv = 4; + memset(TCOUNT, 0, sizeof(TCOUNT)); + memset(TTARGET, 0, sizeof(TTARGET)); + memset(TOUT, 0, sizeof(TOUT)); + + DSP_Reset(powering_up); + SPC_CPU.Reset(powering_up); +} + +void APU_Init(void) +{ + apu_last_master_timestamp = 0; + run_count_mod = 0; + + Set_B_Handlers(0x40, 0x7F, MainCPU_APUIORead, MainCPU_APUIOWrite); // 4 registers mirrored throughout the range. + + DSP_Init(); + + for(unsigned i = 0; i < 256; i++) + { + SPC_Page00_WriteTable[i] = &SPC_Write<~0U>; + SPC_PageXX_WriteTable[i] = &SPC_Write<~0U>; + + SPC_Page00_ReadTable[i] = &SPC_Read<~0U>; + SPC_PageXX_ReadTable[i] = &SPC_Read<~0U>; + + if(i >= 0xC0) + SPC_PageFF_ReadTable[i] = &SPC_Read<0xFFC0>; + else + SPC_PageFF_ReadTable[i] = &SPC_Read<~0U>; + } + + #define P00H(n) SPC_Page00_ReadTable[n] = &SPC_Read; SPC_Page00_WriteTable[n] = &SPC_Write + P00H(0xF0); P00H(0xF1); P00H(0xF2); P00H(0xF3); P00H(0xF4); P00H(0xF5); P00H(0xF6); P00H(0xF7); + P00H(0xF8); P00H(0xF9); P00H(0xFA); P00H(0xFB); P00H(0xFC); P00H(0xFD); P00H(0xFE); P00H(0xFF); + #undef P00H + + for(unsigned i = 0; i < 256; i++) + { + SPC700_ReadMap[i] = SPC_PageXX_ReadTable; + SPC700_WriteMap[i] = SPC_PageXX_WriteTable; + } + + SPC700_ReadMap[0] = SPC_Page00_ReadTable; + SPC700_WriteMap[0] = SPC_Page00_WriteTable; + SPC700_ReadMap[0xFF] = SPC_PageFF_ReadTable; +} + +void APU_SetSPC(SPCReader* s) +{ + const uint8* tr = s->DSPRegs(); + + memcpy(APURAM, s->APURAM(), 65536); + + DSP_Write(GRA_FLG, 0xE0); + + for(unsigned i = 0; i < 256; i++) + SPC700_IOHandler(); + + for(unsigned i = 0; i < 0x80; i++) + { + if(i != GRA_FLG) + DSP_Write(i, tr[i]); + } + + DSP_Write(GRA_KON, 0xFF); + DSP_Write(GRA_KOFF, 0xFF); + + for(unsigned i = 0; i < 256; i++) + SPC700_IOHandler(); + + DSP_Write(GRA_KON, tr[GRA_KON]); + DSP_Write(GRA_KOFF, tr[GRA_KOFF]); + DSP_Write(GRA_FLG, tr[GRA_FLG]); + + Control = APURAM[0xF1] & 0x87; + DSPAddr = APURAM[0xF2]; + + for(unsigned i = 0; i < 4; i++) + { + IOFromSPC700[i] = APURAM[0xF4 + i]; + IOToSPC700[i] = APURAM[0xF4 + i]; + } + + for(unsigned i = 0; i < 2; i++) + WizardRAM[i] = APURAM[0xF8 + i]; + + for(unsigned i = 0; i < 3; i++) + TTARGET[i] = APURAM[0xFA + i]; + + for(unsigned i = 0; i < 3; i++) + TOUT[i] = APURAM[0xFD + i] & 0x0F; + + SPC_CPU.SetRegister(SPC700::GSREG_PC, s->PC()); + SPC_CPU.SetRegister(SPC700::GSREG_A, s->A()); + SPC_CPU.SetRegister(SPC700::GSREG_X, s->X()); + SPC_CPU.SetRegister(SPC700::GSREG_Y, s->Y()); + SPC_CPU.SetRegister(SPC700::GSREG_PSW, s->PSW()); + SPC_CPU.SetRegister(SPC700::GSREG_SP, s->SP()); +} + +void APU_StartFrame(double rate) +{ + DSP_StartFrame(32044.594937, rate); +} + +int32 APU_EndFrame(int16* SoundBuf) +{ +#if 0 // Testing + for(uint32 i = apu_last_master_timestamp; i <= CPUM.timestamp; i++) + APU_Update(i); +#else + APU_Update(CPUM.timestamp); +#endif + +#if 0 + printf("%02x %02x %02x %02x %s\n", APURAM[0x8000], APURAM[0x8001], APURAM[0x8002], APURAM[0x8003], &APURAM[0x8004]); +#endif + apu_last_master_timestamp = 0; + + return DSP_EndFrame(SoundBuf); +} + + +void APU_Kill(void) +{ + DSP_Kill(); +} + + +void APU_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(APURAM, 65536), + SFARRAY(IOFromSPC700, 4), + SFARRAY(IOToSPC700, 4), + + SFVAR(Control), + + SFARRAY(WizardRAM, 2), + SFVAR(DSPAddr), + + SFVAR(T01PreDiv), + SFARRAY(TTARGET, 3), + SFARRAY(TCOUNT, 3), + SFARRAY(TOUT, 3), + + SFVAR(run_count_mod), + + SFEND + }; + + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "APU"); + + if(load) + { + run_count_mod = (uint16)run_count_mod; + } + + SPC_CPU.StateAction(sm, load, data_only); + + DSP_StateAction(sm, load, data_only); +} + +} diff --git a/Mednafen/mednafen/snes_faust/apu.h b/Mednafen/mednafen/snes_faust/apu.h new file mode 100644 index 0000000000..1bca8a8597 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/apu.h @@ -0,0 +1,20 @@ +#ifndef __MDFN_SNES_FAUST_APU_H +#define __MDFN_SNES_FAUST_APU_H + +#include + +namespace MDFN_IEN_SNES_FAUST +{ + +void APU_Init(void); +void APU_Kill(void); +void APU_Reset(bool powering_up); +int32 APU_EndFrame(int16* SoundBuf); +void APU_StartFrame(double rate); +void APU_SetSPC(SPCReader* s); // Call after APU_Reset() + +void APU_StateAction(StateMem* sm, const unsigned load, const bool data_only); + +} + +#endif diff --git a/Mednafen/mednafen/snes_faust/cart.cpp b/Mednafen/mednafen/snes_faust/cart.cpp new file mode 100644 index 0000000000..70e270e478 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/cart.cpp @@ -0,0 +1,347 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "snes.h" +#include "cart.h" + +#include +#include +#include + +#include + +namespace MDFN_IEN_SNES_FAUST +{ +static uint8 CartROM[8192 * 1024]; +static std::vector CartRAM; + +template +static DEFREAD(CartRead_LoROM) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + + return (CartROM + rom_offset)[(A & 0x7FFF) | ((A >> 1) & 0x3F8000)]; +} + +template +static DEFREAD(CartRead_HiROM) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + + return (CartROM + rom_offset)[A & 0x3FFFFF]; +} + +template +static DEFREAD(CartRead_SRAM_LoROM) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + + return CartRAM[((A & 0x7FFF) | ((A >> 1) &~ 0x7FFF)) & (CartRAM.size() - 1)]; +} + +template +static DEFWRITE(CartWrite_SRAM_LoROM) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + + CartRAM[((A & 0x7FFF) | ((A >> 1) &~ 0x7FFF)) & (CartRAM.size() - 1)] = V; +} + + +template +static DEFREAD(CartRead_SRAM_HiROM) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + // + // + const unsigned raw_sram_index = (A & 0x1FFF) | ((A >> 3) & 0x3E000); + + return CartRAM[raw_sram_index & (CartRAM.size() - 1)]; +} + +template +static DEFWRITE(CartWrite_SRAM_HiROM) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + // + // + const unsigned raw_sram_index = (A & 0x1FFF) | ((A >> 3) & 0x3E000); + + CartRAM[raw_sram_index & (CartRAM.size() - 1)] = V; +} + +enum +{ + ROM_LAYOUT_LOROM = 0, + ROM_LAYOUT_HIROM, + ROM_LAYOUT_EXLOROM, + ROM_LAYOUT_EXHIROM, + + ROM_LAYOUT_INVALID = 0xFFFFFFFF +}; + +void CART_Init(Stream* fp, uint8 id[16]) +{ + static const uint64 max_rom_size = 8192 * 1024; + const uint64 raw_size = fp->size(); + const unsigned copier_header_adjust = ((raw_size & 0x7FFF) == 512) ? 512 : 0; + const uint64 size = raw_size - copier_header_adjust; + + //printf("%llu\n", (unsigned long long)size); + + if(size > max_rom_size) + throw MDFN_Error(0, _("SNES ROM image is too large.")); + + fp->seek(copier_header_adjust, SEEK_SET); + fp->read(CartROM, size); + + { + sha1_digest sd = sha1(CartROM, size); + memcpy(id, &sd[0], 16); + } + + for(uint32 s = size, i = 0; s < 8192 * 1024; i++) + { + if(s & (1U << i)) + { + SNES_DBG("[CART] Copy 0x%08x bytes from 0x%08x to 0x%08x\n", 1U << i, s - (1U << i), s); + memcpy(CartROM + s, CartROM + s - (1U << i), 1U << i); + s += (1U << i); + } + } + // + // + // + + unsigned rom_layout = ROM_LAYOUT_INVALID; + unsigned ram_size = 0; + uint8* header = NULL; + + for(unsigned s = 0; s < 2; s++) + { + unsigned char* tmp = &CartROM[s * 0x8000]; + unsigned rv = MDFN_de16lsb(&tmp[0x7FFC]); + + if(rv >= 0x8000) + { + const uint8 header_ram_size = tmp[0x7FD8]; + const uint8 header_rom_size = tmp[0x7FD7]; + const uint8 country_code = tmp[0x7FD9]; + const uint8 header_rom_type = tmp[0x7FD5]; + + if(rom_layout == ROM_LAYOUT_INVALID) + rom_layout = (s ? ROM_LAYOUT_HIROM : ROM_LAYOUT_LOROM); + + if(header_rom_size >= 0x01 && header_rom_size <= 0x0D && header_ram_size >= 0x00 && header_ram_size <= 0x09) + { + if(tmp[0x7FDC] == (tmp[0x7FDE] ^ 0xFF) && tmp[0x7FDD] == (tmp[0x7FDF] ^ 0xFF)) + { + switch(header_rom_type) + { + case 0x30: + case 0x20: + rom_layout = ROM_LAYOUT_LOROM; + break; + + case 0x31: + case 0x21: + rom_layout = ROM_LAYOUT_HIROM; + break; + + case 0x32: + rom_layout = ROM_LAYOUT_EXLOROM; + break; + + case 0x35: + rom_layout = ROM_LAYOUT_EXHIROM; + break; + + default: + if(size >= 4 * 1024 * 1024 + 32768) + rom_layout = s ? ROM_LAYOUT_EXHIROM : ROM_LAYOUT_EXLOROM; + else + rom_layout = s ? ROM_LAYOUT_HIROM : ROM_LAYOUT_LOROM; + break; + } + + ram_size = (header_ram_size ? (0x800 << (header_ram_size - 1)) : 0); + break; + } + } + } + } + + if(rom_layout == ROM_LAYOUT_INVALID) // FIXME: Error out? + rom_layout = ROM_LAYOUT_LOROM; + + SNES_DBG("[CART] rom_layout=%d\n", rom_layout); + //if((rom_type &~ 0x10) == 0x20) + //{ + // assert(raw_ram_size <= 0x09); + //} + //else + //{ + // assert(raw_ram_size <= 0x05); + //} + + CartRAM.resize(ram_size); + + SNES_DBG("[CART] Cart RAM Size: %zu\n", CartRAM.size()); + //printf("%zu\n", CartRAM.size()); +// abort(); + + // + // + // + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + if(bank == 0x7E || bank == 0x7F) + continue; + + readfunc cart_r; + writefunc cart_w; + + if(rom_layout == ROM_LAYOUT_LOROM || rom_layout == ROM_LAYOUT_EXLOROM) + { + if(rom_layout == ROM_LAYOUT_EXLOROM && bank < 0xC0) + cart_r = ((bank >= 0x80) ? CartRead_LoROM<-1, 0x400000> : CartRead_LoROM); + else + cart_r = ((bank >= 0x80) ? CartRead_LoROM<-1> : CartRead_LoROM); + + cart_w = OBWrite_SLOW; + + Set_A_Handlers((bank << 16) | 0x8000, (bank << 16) | 0xFFFF, cart_r, cart_w); + + if(CartRAM.size()) + { + if(bank >= 0x70 && bank <= 0x7D) + Set_A_Handlers((bank << 16) | 0x0000, (bank << 16) | 0x7FFF, CartRead_SRAM_LoROM, CartWrite_SRAM_LoROM); + else if(bank >= 0xF0) + Set_A_Handlers((bank << 16) | 0x0000, (bank << 16) | 0x7FFF, CartRead_SRAM_LoROM<-1>, CartWrite_SRAM_LoROM<-1>); + } + } + else + { + if(rom_layout == ROM_LAYOUT_EXHIROM && bank < 0xC0) + cart_r = ((bank >= 0x80) ? CartRead_HiROM<-1, 0x400000> : CartRead_HiROM); + else + cart_r = ((bank >= 0x80) ? CartRead_HiROM<-1> : CartRead_HiROM); + + cart_w = OBWrite_SLOW; + + uint16 romlb = 0x8000; + if(((bank & 0x7F) >= 0x40 && (bank & 0x7F) <= 0x7D) || bank >= 0xFE) + romlb = 0x0000; + + Set_A_Handlers((bank << 16) | romlb, (bank << 16) | 0xFFFF, cart_r, cart_w); + + if(CartRAM.size()) + { + if((bank & 0x7F) >= 0x20 && (bank & 0x7F) <= 0x3F) + { + Set_A_Handlers((bank << 16) | 0x6000, + (bank << 16) | 0x7FFF, + ((bank & 0x80) ? CartRead_SRAM_HiROM<-1> : CartRead_SRAM_HiROM), + ((bank & 0x80) ? CartWrite_SRAM_HiROM<-1> : CartWrite_SRAM_HiROM)); + } + } + } + } +} + +bool CART_LoadNV(void) +{ + if(CartRAM.size() > 0) + { + try + { + const std::string path = MDFN_MakeFName(MDFNMKF_SAV, 0, "srm"); + FileStream fp(path, FileStream::MODE_READ); + const uint64 fp_size_tmp = fp.size(); + + if(CartRAM.size() != fp_size_tmp) // Check before reading any data. + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu bytes."), path.c_str(), + (unsigned long long)fp_size_tmp, (unsigned long long)CartRAM.size()); + + fp.read(CartRAM.data(), CartRAM.size()); + + return true; + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } + return false; +} + +void CART_SaveNV(void) +{ + if(CartRAM.size() > 0) + { + const std::string path = MDFN_MakeFName(MDFNMKF_SAV, 0, "srm"); + FileStream fp(path, FileStream::MODE_WRITE_INPLACE); + + fp.write(CartRAM.data(), CartRAM.size()); + fp.close(); + } +} + +void CART_Kill(void) +{ + CartRAM.resize(0); +} + +void CART_Reset(bool powering_up) +{ + + +} + + +void CART_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(&CartRAM[0], CartRAM.size()), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CART"); +} + +} diff --git a/Mednafen/mednafen/snes_faust/cart.h b/Mednafen/mednafen/snes_faust/cart.h new file mode 100644 index 0000000000..e20560b421 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/cart.h @@ -0,0 +1,15 @@ +#ifndef __MDFN_SNES_FAUST_CART_H +#define __MDFN_SNES_FAUST_CART_H + +namespace MDFN_IEN_SNES_FAUST +{ + void CART_Init(Stream* fp, uint8 id[16]); + void CART_Kill(void); + void CART_Reset(bool powering_up); + void CART_StateAction(StateMem* sm, const unsigned load, const bool data_only); + + bool CART_LoadNV(void); + void CART_SaveNV(void); +} + +#endif diff --git a/Mednafen/mednafen/snes_faust/cpu.cpp b/Mednafen/mednafen/snes_faust/cpu.cpp new file mode 100644 index 0000000000..4647a91b73 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/cpu.cpp @@ -0,0 +1,2160 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// TODO: attribute packed? + +/* + Emulation mode isn't emulated, since commercially-released SNES games generally don't need it. + + 16-bit DP and stack data read/writes to $00:FFFF may not be emulated correctly(not that it really matters for the SNES). + + IRQ/NMI timing is extremely approximate. +*/ + + + +// +// Stack and direct always use bank 0 +// (note: take care to make sure all address calculations for these wrap around to bank 0 by implicit or explicit (uint16)/&0xFFFF) +// + +// Page boundary crossing; (d),y a,x a,y; "Extra read of invalid address"??? + + +/* + Notes: + REP, SEP, RTI, and PLP instructions change X and M bits. + + 16->8->16-bit accumulator mode switch preserves upper 8 bits. + + 16->8->16-bit index register mode switch zeroes upper 8 bits. + +*/ + +#include +#include "cpu.h" +#include "snes.h" + +namespace MDFN_IEN_SNES_FAUST +{ + +class Core65816 +{ + public: + Core65816() MDFN_COLD; + ~Core65816() MDFN_COLD; + + void Reset(bool powering_up) MDFN_COLD; + + void StateAction(StateMem* sm, const unsigned load, const bool data_only); + + //private: + + enum + { + N_FLAG = 0x80, + V_FLAG = 0x40, + + M_FLAG = 0x20, // Memory/Accumulator(0=16-bit) + X_FLAG = 0x10, // Index(0=16-bit) + + D_FLAG = 0x08, + I_FLAG = 0x04, + Z_FLAG = 0x02, + C_FLAG = 0x01, + }; + + union + { + struct + { +#ifdef MSB_FIRST + uint8 PCPBRDummy; + uint8 PBR; + uint16 PC; +#else + uint16 PC; + uint8 PBR; + uint8 PCPBRDummy; +#endif + }; + uint32 PCPBR; + }; + uint32 DBRSL16; + + uint16 S; + uint16 D; + + union + { + uint16 C; + struct + { +#ifdef MSB_FIRST + uint8 B; + uint8 A; +#else + uint8 A; + uint8 B; +#endif + }; + }; + + template + INLINE T& AC(void) // Clever and/or horrible. + { +/* + if(sizeof(T) == 2) + return (T&)C; + else + return (T&)A; +*/ + return *(T*)((sizeof(T) == 2) ? (void*)&C : (void*)&A); + } + + uint16 X, Y; + uint8 P; + bool E; + + unsigned PIN_Delay; + INLINE void SampleIRQ(void) + { + PIN_Delay = ((P ^ I_FLAG) | 0x01) & CPUM.CombinedNIState; + } + + template + void RunInstruction(void); + + template + void MemWrite(uint32 addr, T val); + + template + T MemRead(uint32 addr); + + void IO(void); + + //private: + + uint8 OpRead(uint32 addr); + + template void SetZN(const T arg); + template void Push(T arg); + template T Pull(void); + + enum + { + ISEQ_COP, + ISEQ_BRK, + ISEQ_ABORT, + ISEQ_NMI, + ISEQ_IRQ + }; + + void ISequence(unsigned which); + + template void Op_ADC(T arg); + template void Op_AND(T arg); + template void Op_BIT(T arg); + template void Op_Compare(T rv, T arg); + template void Op_CMP(T arg); + template void Op_CPX(T arg); + template void Op_CPY(T arg); + template void Op_EOR(T arg); + template void Op_LDA(T arg); + template void Op_LDX(T arg); + template void Op_LDY(T arg); + template void Op_ORA(T arg); + template void Op_SBC(T arg); + + template void Op_ASL(T& arg); + template void Op_DEC(T& arg); + template void Op_INC(T& arg); + template void Op_LSR(T& arg); + template void Op_ROL(T& arg); + template void Op_ROR(T& arg); + template void Op_TRB(T& arg); + template void Op_TSB(T& arg); + + template INLINE T Op_STA(void) { return C; } + template INLINE T Op_STX(void) { return X; } + template INLINE T Op_STY(void) { return Y; } + template INLINE T Op_STZ(void) { return 0; } + + uint32 GetEA_AB(void); + template uint32 GetEA_ABI(uint16 index); + template uint32 GetEA_ABX(void); + template uint32 GetEA_ABY(void); + uint32 GetEA_ABL(void); + uint32 GetEA_ABLX(void); + + uint16 GetEA_DP(void); + uint16 GetEA_DPI(uint16 index); + uint16 GetEA_DPX(void); + uint16 GetEA_DPY(void); + uint32 GetEA_IND(void); + uint32 GetEA_INDL(void); + uint32 GetEA_IX(void); + template uint32 GetEA_IY(void); + uint32 GetEA_ILY(void); + + uint16 GetEA_SR(void); + uint32 GetEA_SRIY(void); + + template void Instr_LD_IM(void (Core65816::*op)(T)); + template void Instr_LD(EAT (Core65816::*eafn)(void), void (Core65816::*op)(T)); + + template void Instr_RMW_A (void (Core65816::*op)(T&)); + template void Instr_RMW(EAT (Core65816::*eafn)(void), void (Core65816::*op)(T&)); + + template void Instr_ST(EAT (Core65816::*eafn)(void), T (Core65816::*op)(void)); + + void Instr_BRK(void); + void Instr_COP(void); + void Instr_NOP(void); + void Instr_STP(void); + void Instr_WAI(void); + void Instr_WDM(void); + + void Instr_Bxx(bool cond); + void Instr_BRL(void); + + void Instr_PEA(void); + void Instr_PEI(void); + void Instr_PER(void); + template void Instr_PHA(void); + void Instr_PHB(void); + void Instr_PHD(void); + void Instr_PHK(void); + void Instr_PHP(void); + template void Instr_PHX(void); + template void Instr_PHY(void); + + template void Instr_PLA(void); + void Instr_PLB(void); + void Instr_PLD(void); + void Instr_PLP(void); + template void Instr_PLX(void); + template void Instr_PLY(void); + + void Instr_REP(void); + void Instr_SEP(void); + + void Instr_JMP(void); + void Instr_JMP_I(void); + void Instr_JMP_II(void); + void Instr_JML(void); + void Instr_JML_I(void); + + void Instr_JSL(void); + void Instr_JSR(void); + void Instr_JSR_II(void); + + void Instr_RTI(void); + void Instr_RTL(void); + void Instr_RTS(void); + + template void Instr_INX(void); + template void Instr_INY(void); + + template void Instr_DEX(void); + template void Instr_DEY(void); + + template void Instr_TAX(void); + template void Instr_TAY(void); + void Instr_TCD(void); + void Instr_TCS(void); + void Instr_TDC(void); + void Instr_TSC(void); + template void Instr_TSX(void); + template void Instr_TXA(void); + void Instr_TXS(void); + template void Instr_TXY(void); + template void Instr_TYA(void); + template void Instr_TYX(void); + void Instr_XBA(void); + void Instr_XCE(void); + template void Instr_CLx(void); + template void Instr_SEx(void); + template void Instr_MVx(void); +}; + +Core65816::Core65816() +{ + PCPBRDummy = 0x00; +} + +Core65816::~Core65816() +{ + + +} + + +template +INLINE void Core65816::MemWrite(uint32 addr, T val) +{ + CPU_Write(addr, val); + + if(sizeof(T) == 2) + { + addr++; + CPU_Write(addr, val >> 8); + } +} + +template +INLINE T Core65816::MemRead(uint32 addr) +{ + T ret; + + ret = CPU_Read(addr); + + if(sizeof(T) == 2) + { + addr++; + ret |= CPU_Read(addr) << 8; + } + + return ret; +} +//static bool popread = false; +INLINE uint8 Core65816::OpRead(uint32 addr) +{ + uint8 ret = MemRead(addr); + + //if(popread) + // SNES_DBG(" %02x\n", ret); + + return ret; +} + +INLINE void Core65816::IO(void) +{ + CPU_IO(); +} + +// +// +// +template +INLINE void Core65816::SetZN(T arg) +{ + P &= ~(Z_FLAG | N_FLAG); + + if(!arg) + P |= Z_FLAG; + + P |= (arg >> ((sizeof(T) - 1) * 8)) & N_FLAG; +} + +template +INLINE void Core65816::Push(T arg) +{ + if(sizeof(T) == 2) + { + MemWrite(S, arg >> 8); + S--; + } + + MemWrite(S, arg); + S--; +} + +template +INLINE T Core65816::Pull(void) +{ + T ret = 0; + + S++; + ret |= MemRead(S); + + if(sizeof(T) == 2) + { + S++; + ret |= MemRead(S) << 8; + } + + return ret; +} + +// ABORT not fully implemented/tested. +INLINE void Core65816::ISequence(unsigned which) +{ + uint16 vecaddr; + + switch(which) + { + case ISEQ_COP: vecaddr = 0xFFE4; break; + case ISEQ_BRK: vecaddr = 0xFFE6; break; + case ISEQ_ABORT: vecaddr = 0xFFE8; break; + case ISEQ_NMI: vecaddr = 0xFFEA; break; + case ISEQ_IRQ: vecaddr = 0xFFEE; break; + } + + Push(PBR); + Push(PC); + Push(P); + + P = (P & ~D_FLAG) | I_FLAG; + PBR = 0x00; + PC = MemRead(vecaddr); + + SNES_DBG("[CPU] ISeq %u: %04x\n", which, PC); +} + +// +// +// + +INLINE void Core65816::Instr_BRK(void) +{ + OpRead(PCPBR); + PC++; + OpRead(PCPBR); + + ISequence(ISEQ_BRK); + SampleIRQ(); +} + +INLINE void Core65816::Instr_COP(void) +{ + OpRead(PCPBR); + PC++; + OpRead(PCPBR); + + ISequence(ISEQ_COP); + SampleIRQ(); +} + +INLINE void Core65816::Instr_NOP(void) +{ + IO(); +} + +INLINE void Core65816::Instr_STP(void) +{ + SNES_DBG("[CPU] STP\n"); + CPUM.halted = CPU_Misc::HALTED_STP; + + if(CPUM.timestamp < CPUM.next_event_ts) + CPUM.timestamp = CPUM.next_event_ts; +} + +INLINE void Core65816::Instr_WAI(void) +{ + SampleIRQ(); // Important(to match games' expectations). + + if(!CPUM.CombinedNIState) + { + CPUM.halted = CPU_Misc::HALTED_WAI; + + if(CPUM.timestamp < CPUM.next_event_ts) + CPUM.timestamp = CPUM.next_event_ts; + } +} + +INLINE void Core65816::Instr_WDM(void) +{ + OpRead(PCPBR); + PC++; +} + +// +// +// +template +INLINE void Core65816::Op_ADC(T arg) +{ + T& AA = AC(); + uint32 tmp; + + if(P & D_FLAG) + { + uint32 a, b, c, d; + + a = (AA & 0x000F) + (arg & 0x000F) + (P & 1); + b = (AA & 0x00F0) + (arg & 0x00F0); + + P &= ~(C_FLAG | V_FLAG); + + if(sizeof(T) == 2) + { + c = (AA & 0x0F00) + (arg & 0x0F00); + d = (AA & 0xF000) + (arg & 0xF000); + + if(a > 0x0009) { b += 0x0010; a += 0x0006; } + if(b > 0x0090) { c += 0x0100; b += 0x0060; } + if(c > 0x0900) { d += 0x1000; c += 0x0600; } + P |= ((~(AA ^ arg) & (AA ^ d)) >> (sizeof(T) * 8 - 7)) & 0x40; // V flag + if(d > 0x9000) { P |= C_FLAG; d += 0x6000; } + + tmp = (a & 0x000F) | (b & 0x00F0) | (c & 0x0F00) | (d & 0xF000); + } + else + { + if(a > 0x0009) { b += 0x0010; a += 0x0006; } + P |= ((~(AA ^ arg) & (AA ^ b)) >> (sizeof(T) * 8 - 7)) & 0x40; // V flag + if(b > 0x0090) { P |= C_FLAG; b += 0x0060; } + + tmp = (a & 0x000F) | (b & 0x00F0); + } + } + else + { + tmp = AA + arg + (P & 1); + + P &= ~(C_FLAG | V_FLAG); + P |= (tmp >> (sizeof(T) * 8)) & 1; // C flag + P |= ((~(AA ^ arg) & (AA ^ tmp)) >> (sizeof(T) * 8 - 7)) & 0x40; // V flag + } + + AA = tmp; + SetZN(AA); +} + +template +INLINE void Core65816::Op_AND(T arg) +{ + T& AA = AC(); + + AA &= arg; + + SetZN(AA); +} + +template +INLINE void Core65816::Op_BIT(T arg) // N and V flags are not modified in the immediate addressing form of BIT. +{ + T& AA = AC(); + + P &= ~Z_FLAG; + + if(!(AA & arg)) + P |= Z_FLAG; + + if(!immediate) + { + P &= ~(N_FLAG | V_FLAG); + P |= (arg >> ((sizeof(T) - 1) * 8)) & (N_FLAG | V_FLAG); + } +} + +template +INLINE void Core65816::Op_Compare(T rv, T arg) +{ + uint32 tmp = rv - arg; + + SetZN(tmp); + + P &= ~C_FLAG; + P |= ((tmp >> (sizeof(T) * 8)) & 1) ^ 1; +} + +template +INLINE void Core65816::Op_CMP(T arg) +{ + Op_Compare(C, arg); +} + +template +INLINE void Core65816::Op_CPX(T arg) +{ + Op_Compare(X, arg); +} + +template +INLINE void Core65816::Op_CPY(T arg) +{ + Op_Compare(Y, arg); +} + +template +INLINE void Core65816::Op_EOR(T arg) +{ + T& AA = AC(); + + AA ^= arg; + + SetZN(AA); +} + +template +INLINE void Core65816::Op_LDA(T arg) +{ + T& AA = AC(); + + AA = arg; + + SetZN(AA); +} + +template +INLINE void Core65816::Op_LDX(T arg) +{ + X = arg; + + SetZN(X); +} + +template +INLINE void Core65816::Op_LDY(T arg) +{ + Y = arg; + + SetZN(Y); +} + +template +INLINE void Core65816::Op_ORA(T arg) +{ + T& AA = AC(); + + AA |= arg; + + SetZN(AA); +} + +template +INLINE void Core65816::Op_SBC(T arg) +{ + T& AA = AC(); + uint32 tmp; + + arg = ~arg; + + if(P & D_FLAG) + { + uint32 a, b, c, d; + + a = (AA & 0x000F) + (arg & 0x000F) + (P & 1); + b = (AA & 0x00F0) + (arg & 0x00F0) + (a & 0x0010); + + P &= ~(C_FLAG | V_FLAG); + + if(sizeof(T) == 2) + { + c = (AA & 0x0F00) + (arg & 0x0F00) + (b & 0x0100); + d = (AA & 0xF000) + (arg & 0xF000) + (c & 0x1000); + + P |= ((d >> (sizeof(T) * 8)) & 1); // C flag + + if(a < 0x00010) { a -= 0x0006; } + if(b < 0x00100) { b -= 0x0060; } + if(c < 0x01000) { c -= 0x0600; } + P |= ((~(AA ^ arg) & (AA ^ d)) >> (sizeof(T) * 8 - 7)) & 0x40; // V flag + if(d < 0x10000) { d -= 0x6000; } + + tmp = (a & 0x000F) | (b & 0x00F0) | (c & 0x0F00) | (d & 0xF000); + } + else + { + P |= ((b >> (sizeof(T) * 8)) & 1); // C flag + + if(a < 0x0010) { a -= 0x0006; } + P |= ((~(AA ^ arg) & (AA ^ b)) >> (sizeof(T) * 8 - 7)) & 0x40; // V flag + if(b < 0x0100) { b -= 0x0060; } + + tmp = (a & 0x000F) | (b & 0x00F0); + } + } + else + { + tmp = AA + arg + (P & 1); + + P &= ~(C_FLAG | V_FLAG); + P |= ((tmp >> (sizeof(T) * 8)) & 1); // C flag + P |= ((~(AA ^ arg) & (AA ^ tmp)) >> (sizeof(T) * 8 - 7)) & 0x40; // V flag + } + + AA = tmp; + SetZN(AA); +} + + +// +// +// +template +INLINE void Core65816::Op_ASL(T& arg) +{ + P &= ~C_FLAG; + P |= arg >> (8 * sizeof(T) - 1); + + arg <<= 1; + + SetZN(arg); +} + +template +INLINE void Core65816::Op_DEC(T& arg) +{ + arg--; + + SetZN(arg); +} + +template +INLINE void Core65816::Op_INC(T& arg) +{ + arg++; + + SetZN(arg); +} + +template +INLINE void Core65816::Op_LSR(T& arg) +{ + P &= ~C_FLAG; + P |= arg & 1; + + arg >>= 1; + + SetZN(arg); +} + +template +INLINE void Core65816::Op_ROL(T& arg) +{ + const bool new_CF = arg >> (sizeof(T) * 8 - 1); + + arg <<= 1; + + arg |= (P & 1); + P &= ~C_FLAG; + P |= new_CF; + + SetZN(arg); +} + +template +INLINE void Core65816::Op_ROR(T& arg) +{ + const bool new_CF = arg & 1; + + arg >>= 1; + + arg |= (P & 1) << (sizeof(T) * 8 - 1); + P &= ~C_FLAG; + P |= new_CF; + + SetZN(arg); +} + +template +INLINE void Core65816::Op_TRB(T& arg) +{ + T& AA = AC(); + + P &= ~Z_FLAG; + if(!(arg & AA)) + P |= Z_FLAG; + + arg &= ~AA; +} + +template +INLINE void Core65816::Op_TSB(T& arg) +{ + T& AA = AC(); + + P &= ~Z_FLAG; + if(!(arg & AA)) + P |= Z_FLAG; + + arg |= AA; +} + +// +// +// +// NOTE: Since we're hardcoding in DBR in GetEA_AB(), don't use it +// to implement JSR/JMP/whatever(at least not without modification). +INLINE uint32 Core65816::GetEA_AB(void) +{ + uint32 ea = DBRSL16; + + ea |= OpRead(PCPBR); + PC++; + + ea |= OpRead(PCPBR) << 8; + PC++; + + return ea; +} + +template +INLINE uint32 Core65816::GetEA_ABI(uint16 index) +{ + uint32 ea; + + ea = GetEA_AB(); + + if(UncondEC || (((ea + index) ^ ea) & 0x100)) + IO(); + + ea = (ea + index) & 0xFFFFFF; + + return ea; +} + +template +INLINE uint32 Core65816::GetEA_ABX(void) +{ + return GetEA_ABI(X); +} + +template +INLINE uint32 Core65816::GetEA_ABY(void) +{ + return GetEA_ABI(Y); +} + +INLINE uint32 Core65816::GetEA_ABL(void) +{ + uint32 ea; + + ea = OpRead(PCPBR); + PC++; + + ea |= OpRead(PCPBR) << 8; + PC++; + + ea |= OpRead(PCPBR) << 16; + PC++; + + return ea; +} + +INLINE uint32 Core65816::GetEA_ABLX(void) +{ + uint32 ea; + + ea = GetEA_ABL(); + ea = (ea + X) & 0xFFFFFF; + + return ea; +} + +INLINE uint16 Core65816::GetEA_DP(void) // d +{ + uint16 ea; + + ea = OpRead(PCPBR); + PC++; + + if(D & 0xFF) + IO(); + + ea = (ea + D); + + return ea; +} + +INLINE uint16 Core65816::GetEA_DPI(uint16 index) +{ + uint16 ea; + + ea = GetEA_DP(); + + IO(); + ea = (ea + index); + + return ea; +} + +INLINE uint16 Core65816::GetEA_DPX(void) // d, X +{ + return GetEA_DPI(X); +} + +INLINE uint16 Core65816::GetEA_DPY(void) // d, Y +{ + return GetEA_DPI(Y); +} + +INLINE uint32 Core65816::GetEA_IND(void) // (d) +{ + uint16 eadp; + uint32 ea = DBRSL16; + + eadp = GetEA_DP(); + + ea |= MemRead(eadp); + eadp++; + + ea |= MemRead(eadp) << 8; + + return ea; +} + +INLINE uint32 Core65816::GetEA_INDL(void) // [d] +{ + uint16 eadp; + uint32 ea; + + eadp = GetEA_DP(); + + ea = MemRead(eadp); + eadp++; + + ea |= MemRead(eadp) << 8; + eadp++; + + ea |= MemRead(eadp) << 16; + + return ea; +} + +INLINE uint32 Core65816::GetEA_IX(void) // (d, X) +{ + uint16 eadp; + uint32 ea = DBRSL16; + + eadp = GetEA_DPX(); + + ea |= MemRead(eadp); + eadp++; + + ea |= MemRead(eadp) << 8; + + return ea; +} + +template +INLINE uint32 Core65816::GetEA_IY(void) // (d), Y +{ + uint32 ea; + + ea = GetEA_IND(); + + if(UncondEC || (((ea + Y) ^ ea) & 0x100)) + IO(); + + ea = (ea + Y) & 0xFFFFFF; + + return ea; +} + +INLINE uint32 Core65816::GetEA_ILY(void) // [d], Y +{ + uint32 ea; + + ea = GetEA_INDL(); + + ea = (ea + Y) & 0xFFFFFF; + + return ea; +} + +INLINE uint16 Core65816::GetEA_SR(void) +{ + uint16 ea; + + ea = OpRead(PCPBR); + PC++; + + IO(); + ea = (ea + S); + + return ea; +} + +INLINE uint32 Core65816::GetEA_SRIY(void) // (whatever, S), Y +{ + uint16 easp; + uint32 ea = DBRSL16; + + easp = GetEA_SR(); + + ea |= MemRead(easp); + easp++; + + ea |= MemRead(easp) << 8; + + IO(); + ea = (ea + Y) & 0xFFFFFF; + + return ea; +} + +// +// +// +template +INLINE void Core65816::Instr_LD_IM(void (Core65816::*op)(T)) +{ + T tmp; + + tmp = OpRead(PCPBR); + PC++; + + if(sizeof(T) == 2) + { + tmp |= OpRead(PCPBR) << 8; + PC++; + } + + (this->*op)(tmp); +} + +template +INLINE void Core65816::Instr_LD(EAT (Core65816::*eafn)(void), void (Core65816::*op)(T)) +{ + EAT ea = (this->*eafn)(); + T tmp = MemRead(ea); + + (this->*op)(tmp); +} + +template +INLINE void Core65816::Instr_RMW_A(void (Core65816::*op)(T&)) +{ + IO(); + (this->*op)(AC()); +} + +template +INLINE void Core65816::Instr_RMW(EAT (Core65816::*eafn)(void), void (Core65816::*op)(T&)) +{ + // For 16-bit: L, H, H, L + EAT ea = (this->*eafn)(); + T tmp = MemRead(ea); + + IO(); + (this->*op)(tmp); + + if(sizeof(T) == 2) + MemWrite(ea + 1, tmp >> 8); + + MemWrite(ea, tmp); +} + +template +INLINE void Core65816::Instr_ST(EAT (Core65816::*eafn)(void), T (Core65816::*op)(void)) +{ + EAT ea = (this->*eafn)(); + T tmp = (this->*op)(); + + MemWrite(ea, tmp); +} + +// +// +// + +// +// +// + +INLINE void Core65816::Instr_Bxx(bool cond) +{ + int8 disp; + + disp = OpRead(PCPBR); + PC++; + + if(cond) + { + IO(); + PC += disp; + } +} + +INLINE void Core65816::Instr_BRL(void) +{ + uint16 disp; + + disp = OpRead(PCPBR); + PC++; + + disp |= OpRead(PCPBR) << 8; + PC++; + + IO(); + PC += disp; +} + +INLINE void Core65816::Instr_JML(void) +{ + uint16 npc; + + npc = OpRead(PCPBR); + PC++; + + npc |= OpRead(PCPBR) << 8; + PC++; + + PBR = OpRead(PCPBR); + + PC = npc; +} + +INLINE void Core65816::Instr_JML_I(void) +{ + uint32 ea = 0; // Bank 0, not DBR! + + ea |= OpRead(PCPBR); + PC++; + + ea |= OpRead(PCPBR) << 8; + + PC = MemRead(ea); + PBR = MemRead((ea + 2) & 0xFFFFFF); +} + +INLINE void Core65816::Instr_JMP(void) +{ + uint16 npc; + + npc = OpRead(PCPBR); + PC++; + + npc |= OpRead(PCPBR) << 8; + + PC = npc; +} + +INLINE void Core65816::Instr_JMP_I(void) +{ + uint32 ea = 0; // Bank 0, not DBR! + + ea |= OpRead(PCPBR); + PC++; + + ea |= OpRead(PCPBR) << 8; + + PC = MemRead(ea); +} + +INLINE void Core65816::Instr_JMP_II(void) +{ + uint32 ea = PBR << 16; // PBR, not DBR! + + ea |= OpRead(PCPBR); + PC++; + + ea |= OpRead(PCPBR) << 8; + IO(); + ea = (ea + X) & 0xFFFFFF; + + PC = MemRead(ea); +} + +INLINE void Core65816::Instr_JSL(void) +{ + uint16 npc; + + npc = OpRead(PCPBR); + PC++; + npc |= OpRead(PCPBR) << 8; + PC++; + + Push(PBR); + + IO(); + + PBR = OpRead(PCPBR); + + Push(PC); + + PC = npc; +} + +INLINE void Core65816::Instr_JSR(void) // Different memory access order from 6502... +{ + uint16 npc; + + npc = OpRead(PCPBR); + PC++; + npc |= OpRead(PCPBR) << 8; + + IO(); + + Push(PC); + PC = npc; +} + +// +// PBR not DBR, and wrap within bank for both + X and reading high byte of PC. +// +INLINE void Core65816::Instr_JSR_II(void) +{ + uint16 ea; + + ea = OpRead(PCPBR); + PC++; + + Push(PC); + + ea |= OpRead(PCPBR) << 8; + IO(); + ea += X; + + PC = MemRead((PBR << 16) | ea); + ea++; + PC |= MemRead((PBR << 16) | ea) << 8; +} + + +INLINE void Core65816::Instr_RTI(void) +{ + IO(); + IO(); + + P = Pull(); + PC = Pull(); + PBR = Pull(); + + if(P & X_FLAG) + { + X = (uint8)X; + Y = (uint8)Y; + } + + SampleIRQ(); +} + +INLINE void Core65816::Instr_RTL(void) +{ + IO(); + IO(); + + PC = Pull() + 1; + PBR = Pull(); +} + +INLINE void Core65816::Instr_RTS(void) +{ + IO(); + IO(); + + PC = Pull() + 1; + + IO(); +} + +// +// +// + +template +INLINE void Core65816::Instr_INX(void) +{ + IO(); + X = (T)(X + 1); + SetZN(X); +} + +template +INLINE void Core65816::Instr_INY(void) +{ + IO(); + Y = (T)(Y + 1); + SetZN(Y); +} + +template +INLINE void Core65816::Instr_DEX(void) +{ + IO(); + X = (T)(X - 1); + SetZN(X); +} + +template +INLINE void Core65816::Instr_DEY(void) +{ + IO(); + Y = (T)(Y - 1); + SetZN(Y); +} + +// +// +// + +template +INLINE void Core65816::Instr_TAX(void) +{ + IO(); + + X = (T)C; + + SetZN(X); +} + +template +INLINE void Core65816::Instr_TAY(void) +{ + IO(); + + Y = (T)C; + + SetZN(Y); +} + +INLINE void Core65816::Instr_TCD(void) +{ + IO(); + + D = C; + + SetZN(D); +} + +INLINE void Core65816::Instr_TCS(void) +{ + IO(); + S = C; +} + +INLINE void Core65816::Instr_TDC(void) +{ + IO(); + C = D; + + SetZN(C); +} + +INLINE void Core65816::Instr_TSC(void) +{ + IO(); + C = S; + + SetZN(C); +} + +template +INLINE void Core65816::Instr_TSX(void) +{ + IO(); + X = (T)S; + + SetZN(X); +} + +template +INLINE void Core65816::Instr_TXA(void) +{ + IO(); + AC() = X; + + SetZN(C); +} + +INLINE void Core65816::Instr_TXS(void) +{ + IO(); + S = X; +} + +template +INLINE void Core65816::Instr_TXY(void) +{ + IO(); + Y = X; + + SetZN(Y); +} + +template +INLINE void Core65816::Instr_TYA(void) +{ + IO(); + AC() = Y; + + SetZN(C); +} + +template +INLINE void Core65816::Instr_TYX(void) +{ + IO(); + X = Y; + + SetZN(X); +} + +INLINE void Core65816::Instr_XBA(void) +{ + uint8 tmp = B; + + IO(); + IO(); + + B = A; + A = tmp; + + SetZN(A); +} + +INLINE void Core65816::Instr_XCE(void) +{ + bool new_E = P & C_FLAG; + + P &= ~C_FLAG; + P |= E; + + E = new_E; + + IO(); + SNES_DBG("[CPU] XCE: %u\n", E); +} + +// +// +// + +template +INLINE void Core65816::Instr_CLx(void) +{ + IO(); + P &= ~TA_Mask; +} + +template +INLINE void Core65816::Instr_SEx(void) +{ + IO(); + P |= TA_Mask; +} + +// +// +// + +template +INLINE void Core65816::Instr_MVx(void) +{ + // opcode, dstbank, srcbank + // + // dstbank is loaded into DBR. + // + // source addr: srcbank, X reg + // dest addr, dstbank, Y reg + // + // Respects X flag, seems to ignore M flag. + uint8 SB; + uint8 tmp; + + DBRSL16 = OpRead(PCPBR) << 16; + PC++; + + SB = OpRead(PCPBR); + PC++; + + // + // + tmp = MemRead((SB << 16) | X); + MemWrite((DBRSL16) | Y, tmp); + // + // + + X = (X_type)(X + increment); + Y = (X_type)(Y + increment); + + IO(); + IO(); + + C--; + if(C != 0xFFFF) + PC -= 3; +} + +INLINE void Core65816::Instr_PEA(void) // Push Effective Absolute Address +{ + uint16 ea = GetEA_AB(); + + Push(ea); +} + +INLINE void Core65816::Instr_PEI(void) // Push Effective Indirect Address +{ + uint16 ea = GetEA_IND(); + + Push(ea); +} + +INLINE void Core65816::Instr_PER(void) // Push Effective PC Relative Indirect Address +{ + uint16 ea = GetEA_AB(); + + IO(); + ea += PC; + + Push(ea); +} + +template +INLINE void Core65816::Instr_PHA(void) +{ + IO(); + Push(AC()); +} + +INLINE void Core65816::Instr_PHB(void) +{ + IO(); + Push(DBRSL16 >> 16); +} + +INLINE void Core65816::Instr_PHD(void) +{ + IO(); + Push(D); +} + +INLINE void Core65816::Instr_PHK(void) +{ + IO(); + Push(PBR); +} + +INLINE void Core65816::Instr_PHP(void) +{ + IO(); + Push(P); +} + +template +INLINE void Core65816::Instr_PHX(void) +{ + IO(); + Push(X); +} + +template +INLINE void Core65816::Instr_PHY(void) +{ + IO(); + Push(Y); +} + +template +INLINE void Core65816::Instr_PLA(void) +{ + IO(); + IO(); + + AC() = Pull(); + SetZN(AC()); +} + +INLINE void Core65816::Instr_PLB(void) +{ + IO(); + IO(); + + uint8 tmp = Pull(); + + SetZN(tmp); + DBRSL16 = tmp << 16; +} + +INLINE void Core65816::Instr_PLD(void) +{ + IO(); + IO(); + + D = Pull(); + SetZN(D); +} + +INLINE void Core65816::Instr_PLP(void) +{ + IO(); + IO(); + + P = Pull(); + + if(P & X_FLAG) + { + X = (uint8)X; + Y = (uint8)Y; + } +} + +template +INLINE void Core65816::Instr_PLX(void) +{ + IO(); + IO(); + + X = Pull(); + SetZN(X); +} + +template +INLINE void Core65816::Instr_PLY(void) +{ + IO(); + IO(); + + Y = Pull(); + SetZN(Y); +} + +INLINE void Core65816::Instr_REP(void) +{ + uint8 tmp; + + tmp = OpRead(PCPBR); + PC++; + + IO(); + P &= ~tmp; +} + +INLINE void Core65816::Instr_SEP(void) +{ + uint8 tmp; + + tmp = OpRead(PCPBR); + PC++; + + IO(); + P |= tmp; + + if(P & X_FLAG) + { + X = (uint8)X; + Y = (uint8)Y; + } +} + + +template +INLINE void Core65816::RunInstruction(void) +{ + switch(opcode) + { + case 0x00: Instr_BRK(); break; // BRK + case 0x02: Instr_COP(); break; // COP + case 0xEA: Instr_NOP(); break; // NOP + case 0xDB: Instr_STP(); break; // STP + case 0xCB: Instr_WAI(); break; // WAI + case 0x42: Instr_WDM(); break; // WDM (effectively 2-byte NOP). + + // + // Block transfer + // + case 0x44: Instr_MVx(); break; // MVP + case 0x54: Instr_MVx(); break; // MVN + + // + // Stack pushing... + // + case 0xF4: Instr_PEA(); break; // PEA + case 0xD4: Instr_PEI(); break; // PEI + case 0x62: Instr_PER(); break; // PER + case 0x48: Instr_PHA(); break; // PHA + case 0x8B: Instr_PHB(); break; // PHB + case 0x0B: Instr_PHD(); break; // PHD + case 0x4B: Instr_PHK(); break; // PHK + case 0x08: Instr_PHP(); break; // PHP + case 0xDA: Instr_PHX(); break; // PHX + case 0x5A: Instr_PHY(); break; // PHY + + // + // ...and pulling. + // + case 0x68: Instr_PLA(); break; // PLA + case 0xAB: Instr_PLB(); break; // PLB + case 0x2B: Instr_PLD(); break; // PLD + case 0x28: Instr_PLP(); break; // PLP + case 0xFA: Instr_PLX(); break; // PLX + case 0x7A: Instr_PLY(); break; // PLY + + case 0x4C: Instr_JMP(); break; // JMP $addr + case 0x6C: Instr_JMP_I(); break; // JMP ($addr) + case 0x7C: Instr_JMP_II(); break; // JMP ($addr, X) + case 0x5C: Instr_JML(); break; // JMP long(aka JML). + case 0xDC: Instr_JML_I(); break; // JMP [long] (aka JML) + + case 0x22: Instr_JSL(); break; // JSR long(aka JSL) + case 0x20: Instr_JSR(); break; // JSR $addr + case 0xFC: Instr_JSR_II(); break; // JSR ($addr, X) + + case 0x40: Instr_RTI(); break; // RTI + case 0x6B: Instr_RTL(); break; // RTL + case 0x60: Instr_RTS(); break; // RTS + + #define INSTR(J, K, L) Instr_##J(&Core65816::GetEA_##K, &Core65816::Op_##L) + // + // ADC + // + case 0x69: Instr_LD_IM (&Core65816::Op_ADC); break; + case 0x65: INSTR(LD, DP, ADC); break; + case 0x75: INSTR(LD, DPX, ADC); break; + case 0x6D: INSTR(LD, AB, ADC); break; + case 0x6F: INSTR(LD, ABL, ADC); break; + case 0x7D: INSTR(LD, ABX, ADC); break; + case 0x7F: INSTR(LD, ABLX, ADC); break; + case 0x79: INSTR(LD, ABY, ADC); break; + case 0x72: INSTR(LD, IND, ADC); break; + case 0x67: INSTR(LD, INDL, ADC); break; + case 0x61: INSTR(LD, IX, ADC); break; + case 0x71: INSTR(LD, IY, ADC); break; + case 0x77: INSTR(LD, ILY, ADC); break; + case 0x63: INSTR(LD, SR, ADC); break; + case 0x73: INSTR(LD, SRIY, ADC); break; + + // + // AND + // + case 0x29: Instr_LD_IM (&Core65816::Op_AND); break; + case 0x25: INSTR(LD, DP, AND); break; + case 0x35: INSTR(LD, DPX, AND); break; + case 0x2D: INSTR(LD, AB, AND); break; + case 0x2F: INSTR(LD, ABL, AND); break; + case 0x3D: INSTR(LD, ABX, AND); break; + case 0x3F: INSTR(LD, ABLX, AND); break; + case 0x39: INSTR(LD, ABY, AND); break; + case 0x32: INSTR(LD, IND, AND); break; + case 0x27: INSTR(LD, INDL, AND); break; + case 0x21: INSTR(LD, IX, AND); break; + case 0x31: INSTR(LD, IY, AND); break; + case 0x37: INSTR(LD, ILY, AND); break; + case 0x23: INSTR(LD, SR, AND); break; + case 0x33: INSTR(LD, SRIY, AND); break; + + // + // CMP + // + case 0xC9: Instr_LD_IM (&Core65816::Op_CMP); break; + case 0xC5: INSTR(LD, DP, CMP); break; + case 0xD5: INSTR(LD, DPX, CMP); break; + case 0xCD: INSTR(LD, AB, CMP); break; + case 0xCF: INSTR(LD, ABL, CMP); break; + case 0xDD: INSTR(LD, ABX, CMP); break; + case 0xDF: INSTR(LD, ABLX, CMP); break; + case 0xD9: INSTR(LD, ABY, CMP); break; + case 0xD2: INSTR(LD, IND, CMP); break; + case 0xC7: INSTR(LD, INDL, CMP); break; + case 0xC1: INSTR(LD, IX, CMP); break; + case 0xD1: INSTR(LD, IY, CMP); break; + case 0xD7: INSTR(LD, ILY, CMP); break; + case 0xC3: INSTR(LD, SR, CMP); break; + case 0xD3: INSTR(LD, SRIY, CMP); break; + + // + // EOR + // + case 0x49: Instr_LD_IM (&Core65816::Op_EOR); break; + case 0x45: INSTR(LD, DP, EOR); break; + case 0x55: INSTR(LD, DPX, EOR); break; + case 0x4D: INSTR(LD, AB, EOR); break; + case 0x4F: INSTR(LD, ABL, EOR); break; + case 0x5D: INSTR(LD, ABX, EOR); break; + case 0x5F: INSTR(LD, ABLX, EOR); break; + case 0x59: INSTR(LD, ABY, EOR); break; + case 0x52: INSTR(LD, IND, EOR); break; + case 0x47: INSTR(LD, INDL, EOR); break; + case 0x41: INSTR(LD, IX, EOR); break; + case 0x51: INSTR(LD, IY, EOR); break; + case 0x57: INSTR(LD, ILY, EOR); break; + case 0x43: INSTR(LD, SR, EOR); break; + case 0x53: INSTR(LD, SRIY, EOR); break; + + // + // LDA + // + case 0xA9: Instr_LD_IM (&Core65816::Op_LDA); break; + case 0xA5: INSTR(LD, DP, LDA); break; + case 0xB5: INSTR(LD, DPX, LDA); break; + case 0xAD: INSTR(LD, AB, LDA); break; + case 0xAF: INSTR(LD, ABL, LDA); break; + case 0xBD: INSTR(LD, ABX, LDA); break; + case 0xBF: INSTR(LD, ABLX, LDA); break; + case 0xB9: INSTR(LD, ABY, LDA); break; + case 0xB2: INSTR(LD, IND, LDA); break; + case 0xA7: INSTR(LD, INDL, LDA); break; + case 0xA1: INSTR(LD, IX, LDA); break; + case 0xB1: INSTR(LD, IY, LDA); break; + case 0xB7: INSTR(LD, ILY, LDA); break; + case 0xA3: INSTR(LD, SR, LDA); break; + case 0xB3: INSTR(LD, SRIY, LDA); break; + + // + // ORA + // + case 0x09: Instr_LD_IM (&Core65816::Op_ORA); break; + case 0x05: INSTR(LD, DP, ORA); break; + case 0x15: INSTR(LD, DPX, ORA); break; + case 0x0D: INSTR(LD, AB, ORA); break; + case 0x0F: INSTR(LD, ABL, ORA); break; + case 0x1D: INSTR(LD, ABX, ORA); break; + case 0x1F: INSTR(LD, ABLX, ORA); break; + case 0x19: INSTR(LD, ABY, ORA); break; + case 0x12: INSTR(LD, IND, ORA); break; + case 0x07: INSTR(LD, INDL, ORA); break; + case 0x01: INSTR(LD, IX, ORA); break; + case 0x11: INSTR(LD, IY, ORA); break; + case 0x17: INSTR(LD, ILY, ORA); break; + case 0x03: INSTR(LD, SR, ORA); break; + case 0x13: INSTR(LD, SRIY, ORA); break; + + // + // SBC + // + case 0xE9: Instr_LD_IM (&Core65816::Op_SBC); break; + case 0xE5: INSTR(LD, DP, SBC); break; + case 0xF5: INSTR(LD, DPX, SBC); break; + case 0xED: INSTR(LD, AB, SBC); break; + case 0xEF: INSTR(LD, ABL, SBC); break; + case 0xFD: INSTR(LD, ABX, SBC); break; + case 0xFF: INSTR(LD, ABLX, SBC); break; + case 0xF9: INSTR(LD, ABY, SBC); break; + case 0xF2: INSTR(LD, IND, SBC); break; + case 0xE7: INSTR(LD, INDL, SBC); break; + case 0xE1: INSTR(LD, IX, SBC); break; + case 0xF1: INSTR(LD, IY, SBC); break; + case 0xF7: INSTR(LD, ILY, SBC); break; + case 0xE3: INSTR(LD, SR, SBC); break; + case 0xF3: INSTR(LD, SRIY, SBC); break; + + // + // STA + // + case 0x85: INSTR(ST, DP, STA); break; + case 0x95: INSTR(ST, DPX, STA); break; + case 0x8D: INSTR(ST, AB, STA); break; + case 0x8F: INSTR(ST, ABL, STA); break; + case 0x9D: INSTR(ST, ABX, STA); break; + case 0x9F: INSTR(ST, ABLX, STA); break; + case 0x99: INSTR(ST, ABY, STA); break; + case 0x92: INSTR(ST, IND, STA); break; + case 0x87: INSTR(ST, INDL, STA); break; + case 0x81: INSTR(ST, IX, STA); break; + case 0x91: INSTR(ST, IY, STA); break; + case 0x97: INSTR(ST, ILY, STA); break; + case 0x83: INSTR(ST, SR, STA); break; + case 0x93: INSTR(ST, SRIY, STA); break; + + // + // BIT + // + case 0x89: Instr_LD_IM(&Core65816::Op_BIT); break; + case 0x24: INSTR(LD, DP, BIT); break; + case 0x34: INSTR(LD, DPX, BIT); break; + case 0x2C: INSTR(LD, AB, BIT); break; + case 0x3C: INSTR(LD, ABX, BIT); break; + + // + // CPX + // + case 0xE0: Instr_LD_IM (&Core65816::Op_CPX); break; + case 0xE4: INSTR(LD, DP, CPX); break; + case 0xEC: INSTR(LD, AB, CPX); break; + + // + // CPY + // + case 0xC0: Instr_LD_IM (&Core65816::Op_CPY); break; + case 0xC4: INSTR(LD, DP, CPY); break; + case 0xCC: INSTR(LD, AB, CPY); break; + + // + // LDX + // + case 0xA2: Instr_LD_IM (&Core65816::Op_LDX); break; + case 0xA6: INSTR(LD, DP, LDX); break; + case 0xB6: INSTR(LD, DPY, LDX); break; + case 0xAE: INSTR(LD, AB, LDX); break; + case 0xBE: INSTR(LD, ABY, LDX); break; + + // + // LDY + // + case 0xA0: Instr_LD_IM (&Core65816::Op_LDY); break; + case 0xA4: INSTR(LD, DP, LDY); break; + case 0xB4: INSTR(LD, DPX, LDY); break; + case 0xAC: INSTR(LD, AB, LDY); break; + case 0xBC: INSTR(LD, ABX, LDY); break; + + // + // STX + // + case 0x86: INSTR(ST, DP, STX); break; + case 0x96: INSTR(ST, DPY, STX); break; + case 0x8E: INSTR(ST, AB, STX); break; + + // + // STY + // + case 0x84: INSTR(ST, DP, STY); break; + case 0x94: INSTR(ST, DPX, STY); break; + case 0x8C: INSTR(ST, AB, STY); break; + + // + // STZ + // + case 0x64: INSTR(ST, DP, STZ); break; + case 0x74: INSTR(ST, DPX, STZ); break; + case 0x9C: INSTR(ST, AB, STZ); break; + case 0x9E: INSTR(ST, ABX, STZ); break; + + // + // + // ASL + // + case 0x0A: Instr_RMW_A(&Core65816::Op_ASL); break; + case 0x06: INSTR(RMW, DP, ASL); break; + case 0x16: INSTR(RMW, DPX, ASL); break; + case 0x0E: INSTR(RMW, AB, ASL); break; + case 0x1E: INSTR(RMW, ABX, ASL); break; + + // + // DEC + // + case 0x3A: Instr_RMW_A(&Core65816::Op_DEC); break; + case 0xC6: INSTR(RMW, DP, DEC); break; + case 0xD6: INSTR(RMW, DPX, DEC); break; + case 0xCE: INSTR(RMW, AB, DEC); break; + case 0xDE: INSTR(RMW, ABX, DEC); break; + + // + // INC + // + case 0x1A: Instr_RMW_A(&Core65816::Op_INC); break; + case 0xE6: INSTR(RMW, DP, INC); break; + case 0xF6: INSTR(RMW, DPX, INC); break; + case 0xEE: INSTR(RMW, AB, INC); break; + case 0xFE: INSTR(RMW, ABX, INC); break; + + // + // LSR + // + case 0x4A: Instr_RMW_A(&Core65816::Op_LSR); break; + case 0x46: INSTR(RMW, DP, LSR); break; + case 0x56: INSTR(RMW, DPX, LSR); break; + case 0x4E: INSTR(RMW, AB, LSR); break; + case 0x5E: INSTR(RMW, ABX, LSR); break; + + // + // ROL + // + case 0x2A: Instr_RMW_A(&Core65816::Op_ROL); break; + case 0x26: INSTR(RMW, DP, ROL); break; + case 0x36: INSTR(RMW, DPX, ROL); break; + case 0x2E: INSTR(RMW, AB, ROL); break; + case 0x3E: INSTR(RMW, ABX, ROL); break; + + // + // ROR + // + case 0x6A: Instr_RMW_A(&Core65816::Op_ROR); break; + case 0x66: INSTR(RMW, DP, ROR); break; + case 0x76: INSTR(RMW, DPX, ROR); break; + case 0x6E: INSTR(RMW, AB, ROR); break; + case 0x7E: INSTR(RMW, ABX, ROR); break; + + // + // TRB + // + case 0x14: INSTR(RMW, DP, TRB); break; + case 0x1C: INSTR(RMW, AB, TRB); break; + + // + // TSB + // + case 0x04: INSTR(RMW, DP, TSB); break; + case 0x0C: INSTR(RMW, AB, TSB); break; + + #undef INSTR + + case 0xE8: Instr_INX(); break; + case 0xC8: Instr_INY(); break; + + case 0xCA: Instr_DEX(); break; + case 0x88: Instr_DEY(); break; + + // + // Branch Instructions + // + case 0x90: Instr_Bxx(!(P & C_FLAG)); break; // BCC + case 0xB0: Instr_Bxx( (P & C_FLAG)); break; // BCS + case 0xF0: Instr_Bxx( (P & Z_FLAG)); break; // BEQ + case 0x30: Instr_Bxx( (P & N_FLAG)); break; // BMI + case 0xD0: Instr_Bxx(!(P & Z_FLAG)); break; // BNE + case 0x10: Instr_Bxx(!(P & N_FLAG)); break; // BPL + case 0x80: Instr_Bxx( true ); break; // BRA + case 0x50: Instr_Bxx(!(P & V_FLAG)); break; // BVC + case 0x70: Instr_Bxx( (P & V_FLAG)); break; // BVS + case 0x82: Instr_BRL(); break; // BRL + + // + // Exchange/Transfer instructions + // + case 0xAA: Instr_TAX(); break; // TAX + case 0xA8: Instr_TAY(); break; // TAY + case 0x5B: Instr_TCD(); break; // TCD + case 0x1B: Instr_TCS(); break; // TCS + case 0x7B: Instr_TDC(); break; // TDC + case 0x3B: Instr_TSC(); break; // TSC + case 0xBA: Instr_TSX(); break; // TSX + case 0x8A: Instr_TXA(); break; // TXA + case 0x9A: Instr_TXS(); break; // TXS + case 0x9B: Instr_TXY(); break; // TXY + case 0x98: Instr_TYA(); break; // TYA + case 0xBB: Instr_TYX(); break; // TYX + case 0xEB: Instr_XBA(); break; // XBA + case 0xFB: Instr_XCE(); break; // XCE + + // + // Simple flag setting and clearing instructions. + // + case 0x18: Instr_CLx(); break; // CLC + case 0xD8: Instr_CLx(); break; // CLD + case 0x58: Instr_CLx(); break; // CLI + case 0xB8: Instr_CLx(); break; // CLV + + case 0x38: Instr_SEx(); break; // SEC + case 0xF8: Instr_SEx(); break; // SED + case 0x78: Instr_SEx(); break; // SEI + + case 0xC2: Instr_REP(); break; // REP (Reset Status Bits) + case 0xE2: Instr_SEP(); break; // SEP (Set Processor Status Bits) + } +} + +void Core65816::Reset(bool powering_up) +{ + E = true; // Oh Tetris Attack, you're so crazy~ + D = 0x0000; + DBRSL16 = 0x00 << 16; + PBR = 0x00; + S = 0x01FD; + P = M_FLAG | X_FLAG | I_FLAG; + + PIN_Delay = 0; + + PC = MemRead(0xFFFC); +} + +static Core65816 core; +CPU_Misc CPUM; + +void CPU_Run(void) +{ + static const void* const LoopTable[4] = + { + &&Loop_0, &&Loop_1, &&Loop_2, &&Loop_3, + }; + Core65816 lc = core; + + CPUM.running_mask = ~0U; + goto *LoopTable[(lc.P >> 4) & 0x3]; + + #define CPULBMX Loop_0 + #define CPULBMTYPE uint16 + #define CPULBXTYPE uint16 + #include "cpu_loop_body.inc" + #undef CPULBXTYPE + #undef CPULBMTYPE + #undef CPULBMX + + #define CPULBMX Loop_1 + #define CPULBMTYPE uint16 + #define CPULBXTYPE uint8 + #include "cpu_loop_body.inc" + #undef CPULBXTYPE + #undef CPULBMTYPE + #undef CPULBMX + + #define CPULBMX Loop_2 + #define CPULBMTYPE uint8 + #define CPULBXTYPE uint16 + #include "cpu_loop_body.inc" + #undef CPULBXTYPE + #undef CPULBMTYPE + #undef CPULBMX + + #define CPULBMX Loop_3 + #define CPULBMTYPE uint8 + #define CPULBXTYPE uint8 + #include "cpu_loop_body.inc" + #undef CPULBXTYPE + #undef CPULBMTYPE + #undef CPULBMX + + + ExitCat: ; + core = lc; +} + +void CPU_Reset(bool powering_up) +{ + CPUM.halted = 0; + CPUM.mdr = 0x00; + + CPUM.CombinedNIState &= ~0x01; + + core.Reset(powering_up); +} + +void CPU_Init(void) +{ + CPUM.PrevNMILineState = false; + CPUM.CombinedNIState = 0x00; + CPUM.NMILineState = false; + CPUM.PrevNMILineState = false; +} + + +void Core65816::StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PC), + SFVAR(PBR), + SFVAR(DBRSL16), + SFVAR(S), + SFVAR(D), + SFVAR(C), + SFVAR(X), + SFVAR(Y), + SFVAR(P), + SFVAR(E), + + SFVAR(PIN_Delay), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CPUCORE"); +}; + +void CPU_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(CPUM.mdr), + SFVAR(CPUM.halted), + SFVAR(CPUM.CombinedNIState), + SFVAR(CPUM.NMILineState), + SFVAR(CPUM.PrevNMILineState), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "CPU"); + + core.StateAction(sm, load, data_only); +} + +} diff --git a/Mednafen/mednafen/snes_faust/cpu.h b/Mednafen/mednafen/snes_faust/cpu.h new file mode 100644 index 0000000000..b46e161cf9 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/cpu.h @@ -0,0 +1,134 @@ +#ifndef __MDFN_SNES_FAUST_CPU_H +#define __MDFN_SNES_FAUST_CPU_H + +namespace MDFN_IEN_SNES_FAUST +{ + +class CPU65816; + +typedef uint8 (MDFN_FASTCALL *readfunc)(uint32 A); +typedef void (MDFN_FASTCALL *writefunc)(uint32 A, uint8 V); + +struct CPU_Misc +{ + uint32 timestamp; + uint32 next_event_ts; + uint32 running_mask; + + enum + { + HALTED_NOT = 0, + HALTED_WAI = 1, + HALTED_STP = 2, + HALTED_DMA = 3 + }; + + uint8 halted; + uint8 mdr; + + uint8 CombinedNIState; + bool NMILineState; + bool PrevNMILineState; + + readfunc ReadFuncs[256]; // A and B bus read handlers + writefunc WriteFuncs[256]; // A and B bus write handlers + + readfunc ReadFuncsA[256]; // A-bus only read handlers + writefunc WriteFuncsA[256]; // A-bus only write handlers + + // Direct, not through RWIndex. + readfunc DM_ReadFuncsB[256]; + writefunc DM_WriteFuncsB[256]; + + // +1 so we can avoid a masking for 16-bit reads/writes(note that this + // may result in the address passed to the read/write handlers being + // 0x1000000 instead of 0x000000 in some cases, so code with that in mind. + uint8 RWIndex[256 * 65536 + 1]; + + INLINE uint8 ReadA(uint32 A) + { + uint8 ret = ReadFuncsA[RWIndex[A]](A); + + mdr = ret; + + return ret; + } + + INLINE void WriteA(uint32 A, uint8 V) + { + mdr = V; + WriteFuncsA[RWIndex[A]](A, V); + } + + INLINE uint8 ReadB(uint8 A) + { + uint8 ret = DM_ReadFuncsB[A](A); + + mdr = ret; + + return ret; + } + + INLINE void WriteB(uint8 A, uint8 V) + { + mdr = V; + DM_WriteFuncsB[A](A, V); + } + + // + // + // + void RunDMA(void); + void EventHandler(void); +}; + +extern CPU_Misc CPUM; + +INLINE uint8 CPU_Read(uint32 A) +{ + uint8 ret = CPUM.ReadFuncs[CPUM.RWIndex[A]](A); + + CPUM.mdr = ret; + + return ret; +} + +INLINE void CPU_Write(uint32 A, uint8 V) +{ + CPUM.mdr = V; + CPUM.WriteFuncs[CPUM.RWIndex[A]](A, V); +} + +INLINE void CPU_IO(void) +{ + CPUM.timestamp += 6; +} + +INLINE void CPU_SetIRQ(bool active) +{ + CPUM.CombinedNIState &= ~0x04; + CPUM.CombinedNIState |= active ? 0x04 : 0x00; +} + +INLINE void CPU_SetNMI(bool active) +{ + if((CPUM.NMILineState ^ active) & active) + CPUM.CombinedNIState |= 0x01; + + CPUM.NMILineState = active; +} + +void CPU_Init(void); +void CPU_Reset(bool powering_up); +void CPU_StateAction(StateMem* sm, const unsigned load, const bool data_only); +void CPU_Run(void); + +INLINE void CPU_Exit(void) +{ + CPUM.running_mask = 0; + CPUM.next_event_ts = 0; +} + +} + +#endif diff --git a/Mednafen/mednafen/snes_faust/cpu_loop_body.inc b/Mednafen/mednafen/snes_faust/cpu_loop_body.inc new file mode 100644 index 0000000000..879e30475e --- /dev/null +++ b/Mednafen/mednafen/snes_faust/cpu_loop_body.inc @@ -0,0 +1,309 @@ +CPULBMX : + +while(MDFN_LIKELY(CPUM.running_mask)) +{ + if(CPUM.halted) + { + if(CPUM.halted == CPU_Misc::HALTED_DMA) + CPUM.RunDMA(); + else + { + lc.SampleIRQ(); + + if(CPUM.halted == CPU_Misc::HALTED_WAI && CPUM.CombinedNIState) + CPUM.halted = CPU_Misc::HALTED_NOT; + else if(CPUM.timestamp < CPUM.next_event_ts) + CPUM.timestamp = CPUM.next_event_ts; + } + } + + while(MDFN_LIKELY(CPUM.timestamp < CPUM.next_event_ts)) + { + uint8 opcode; + + if(MDFN_UNLIKELY(lc.PIN_Delay)) + { + lc.OpRead(lc.PCPBR); + lc.IO(); + + if(MDFN_UNLIKELY(lc.PIN_Delay & 1)) + { + lc.ISequence(Core65816::ISEQ_NMI); + CPUM.CombinedNIState &= ~0x01; + } + else + lc.ISequence(Core65816::ISEQ_IRQ); + } + lc.SampleIRQ(); + +//popread = false; + opcode = lc.OpRead(lc.PCPBR); +//popread = true; +// printf("Instr: %02x:%04x, %02x --- C=0x%04x, X=0x%04x, Y=0x%04x -- S=0x%04x, D=0x%04x --- P=0x%02x\n", lc.PBR, lc.PC, opcode, lc.C, lc.X, lc.Y, lc.S, lc.D, lc.P); + lc.PC++; + + switch(opcode) + { + case 0x00: lc.RunInstruction<0x00, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x01: lc.RunInstruction<0x01, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x02: lc.RunInstruction<0x02, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x03: lc.RunInstruction<0x03, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x04: lc.RunInstruction<0x04, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x05: lc.RunInstruction<0x05, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x06: lc.RunInstruction<0x06, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x07: lc.RunInstruction<0x07, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x08: lc.RunInstruction<0x08, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x09: lc.RunInstruction<0x09, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x0A: lc.RunInstruction<0x0A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x0B: lc.RunInstruction<0x0B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x0C: lc.RunInstruction<0x0C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x0D: lc.RunInstruction<0x0D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x0E: lc.RunInstruction<0x0E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x0F: lc.RunInstruction<0x0F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x10: lc.RunInstruction<0x10, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x11: lc.RunInstruction<0x11, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x12: lc.RunInstruction<0x12, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x13: lc.RunInstruction<0x13, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x14: lc.RunInstruction<0x14, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x15: lc.RunInstruction<0x15, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x16: lc.RunInstruction<0x16, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x17: lc.RunInstruction<0x17, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x18: lc.RunInstruction<0x18, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x19: lc.RunInstruction<0x19, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x1A: lc.RunInstruction<0x1A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x1B: lc.RunInstruction<0x1B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x1C: lc.RunInstruction<0x1C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x1D: lc.RunInstruction<0x1D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x1E: lc.RunInstruction<0x1E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x1F: lc.RunInstruction<0x1F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x20: lc.RunInstruction<0x20, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x21: lc.RunInstruction<0x21, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x22: lc.RunInstruction<0x22, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x23: lc.RunInstruction<0x23, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x24: lc.RunInstruction<0x24, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x25: lc.RunInstruction<0x25, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x26: lc.RunInstruction<0x26, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x27: lc.RunInstruction<0x27, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x28: lc.RunInstruction<0x28, CPULBMTYPE, CPULBXTYPE>(); goto *LoopTable[(lc.P >> 4) & 0x3]; + case 0x29: lc.RunInstruction<0x29, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x2A: lc.RunInstruction<0x2A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x2B: lc.RunInstruction<0x2B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x2C: lc.RunInstruction<0x2C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x2D: lc.RunInstruction<0x2D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x2E: lc.RunInstruction<0x2E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x2F: lc.RunInstruction<0x2F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x30: lc.RunInstruction<0x30, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x31: lc.RunInstruction<0x31, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x32: lc.RunInstruction<0x32, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x33: lc.RunInstruction<0x33, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x34: lc.RunInstruction<0x34, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x35: lc.RunInstruction<0x35, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x36: lc.RunInstruction<0x36, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x37: lc.RunInstruction<0x37, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x38: lc.RunInstruction<0x38, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x39: lc.RunInstruction<0x39, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x3A: lc.RunInstruction<0x3A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x3B: lc.RunInstruction<0x3B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x3C: lc.RunInstruction<0x3C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x3D: lc.RunInstruction<0x3D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x3E: lc.RunInstruction<0x3E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x3F: lc.RunInstruction<0x3F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x40: lc.RunInstruction<0x40, CPULBMTYPE, CPULBXTYPE>(); goto *LoopTable[(lc.P >> 4) & 0x3]; + case 0x41: lc.RunInstruction<0x41, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x42: lc.RunInstruction<0x42, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x43: lc.RunInstruction<0x43, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x44: lc.RunInstruction<0x44, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x45: lc.RunInstruction<0x45, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x46: lc.RunInstruction<0x46, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x47: lc.RunInstruction<0x47, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x48: lc.RunInstruction<0x48, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x49: lc.RunInstruction<0x49, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x4A: lc.RunInstruction<0x4A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x4B: lc.RunInstruction<0x4B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x4C: lc.RunInstruction<0x4C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x4D: lc.RunInstruction<0x4D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x4E: lc.RunInstruction<0x4E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x4F: lc.RunInstruction<0x4F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x50: lc.RunInstruction<0x50, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x51: lc.RunInstruction<0x51, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x52: lc.RunInstruction<0x52, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x53: lc.RunInstruction<0x53, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x54: lc.RunInstruction<0x54, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x55: lc.RunInstruction<0x55, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x56: lc.RunInstruction<0x56, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x57: lc.RunInstruction<0x57, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x58: lc.RunInstruction<0x58, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x59: lc.RunInstruction<0x59, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x5A: lc.RunInstruction<0x5A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x5B: lc.RunInstruction<0x5B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x5C: lc.RunInstruction<0x5C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x5D: lc.RunInstruction<0x5D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x5E: lc.RunInstruction<0x5E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x5F: lc.RunInstruction<0x5F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x60: lc.RunInstruction<0x60, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x61: lc.RunInstruction<0x61, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x62: lc.RunInstruction<0x62, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x63: lc.RunInstruction<0x63, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x64: lc.RunInstruction<0x64, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x65: lc.RunInstruction<0x65, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x66: lc.RunInstruction<0x66, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x67: lc.RunInstruction<0x67, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x68: lc.RunInstruction<0x68, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x69: lc.RunInstruction<0x69, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x6A: lc.RunInstruction<0x6A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x6B: lc.RunInstruction<0x6B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x6C: lc.RunInstruction<0x6C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x6D: lc.RunInstruction<0x6D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x6E: lc.RunInstruction<0x6E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x6F: lc.RunInstruction<0x6F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x70: lc.RunInstruction<0x70, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x71: lc.RunInstruction<0x71, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x72: lc.RunInstruction<0x72, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x73: lc.RunInstruction<0x73, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x74: lc.RunInstruction<0x74, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x75: lc.RunInstruction<0x75, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x76: lc.RunInstruction<0x76, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x77: lc.RunInstruction<0x77, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x78: lc.RunInstruction<0x78, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x79: lc.RunInstruction<0x79, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x7A: lc.RunInstruction<0x7A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x7B: lc.RunInstruction<0x7B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x7C: lc.RunInstruction<0x7C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x7D: lc.RunInstruction<0x7D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x7E: lc.RunInstruction<0x7E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x7F: lc.RunInstruction<0x7F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x80: lc.RunInstruction<0x80, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x81: lc.RunInstruction<0x81, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x82: lc.RunInstruction<0x82, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x83: lc.RunInstruction<0x83, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x84: lc.RunInstruction<0x84, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x85: lc.RunInstruction<0x85, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x86: lc.RunInstruction<0x86, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x87: lc.RunInstruction<0x87, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x88: lc.RunInstruction<0x88, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x89: lc.RunInstruction<0x89, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x8A: lc.RunInstruction<0x8A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x8B: lc.RunInstruction<0x8B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x8C: lc.RunInstruction<0x8C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x8D: lc.RunInstruction<0x8D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x8E: lc.RunInstruction<0x8E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x8F: lc.RunInstruction<0x8F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x90: lc.RunInstruction<0x90, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x91: lc.RunInstruction<0x91, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x92: lc.RunInstruction<0x92, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x93: lc.RunInstruction<0x93, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x94: lc.RunInstruction<0x94, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x95: lc.RunInstruction<0x95, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x96: lc.RunInstruction<0x96, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x97: lc.RunInstruction<0x97, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x98: lc.RunInstruction<0x98, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x99: lc.RunInstruction<0x99, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x9A: lc.RunInstruction<0x9A, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x9B: lc.RunInstruction<0x9B, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x9C: lc.RunInstruction<0x9C, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x9D: lc.RunInstruction<0x9D, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x9E: lc.RunInstruction<0x9E, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0x9F: lc.RunInstruction<0x9F, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA0: lc.RunInstruction<0xA0, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA1: lc.RunInstruction<0xA1, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA2: lc.RunInstruction<0xA2, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA3: lc.RunInstruction<0xA3, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA4: lc.RunInstruction<0xA4, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA5: lc.RunInstruction<0xA5, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA6: lc.RunInstruction<0xA6, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA7: lc.RunInstruction<0xA7, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA8: lc.RunInstruction<0xA8, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xA9: lc.RunInstruction<0xA9, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xAA: lc.RunInstruction<0xAA, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xAB: lc.RunInstruction<0xAB, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xAC: lc.RunInstruction<0xAC, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xAD: lc.RunInstruction<0xAD, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xAE: lc.RunInstruction<0xAE, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xAF: lc.RunInstruction<0xAF, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB0: lc.RunInstruction<0xB0, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB1: lc.RunInstruction<0xB1, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB2: lc.RunInstruction<0xB2, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB3: lc.RunInstruction<0xB3, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB4: lc.RunInstruction<0xB4, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB5: lc.RunInstruction<0xB5, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB6: lc.RunInstruction<0xB6, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB7: lc.RunInstruction<0xB7, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB8: lc.RunInstruction<0xB8, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xB9: lc.RunInstruction<0xB9, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xBA: lc.RunInstruction<0xBA, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xBB: lc.RunInstruction<0xBB, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xBC: lc.RunInstruction<0xBC, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xBD: lc.RunInstruction<0xBD, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xBE: lc.RunInstruction<0xBE, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xBF: lc.RunInstruction<0xBF, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC0: lc.RunInstruction<0xC0, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC1: lc.RunInstruction<0xC1, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC2: lc.RunInstruction<0xC2, CPULBMTYPE, CPULBXTYPE>(); goto *LoopTable[(lc.P >> 4) & 0x3]; + case 0xC3: lc.RunInstruction<0xC3, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC4: lc.RunInstruction<0xC4, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC5: lc.RunInstruction<0xC5, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC6: lc.RunInstruction<0xC6, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC7: lc.RunInstruction<0xC7, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC8: lc.RunInstruction<0xC8, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xC9: lc.RunInstruction<0xC9, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xCA: lc.RunInstruction<0xCA, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xCB: lc.RunInstruction<0xCB, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xCC: lc.RunInstruction<0xCC, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xCD: lc.RunInstruction<0xCD, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xCE: lc.RunInstruction<0xCE, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xCF: lc.RunInstruction<0xCF, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD0: lc.RunInstruction<0xD0, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD1: lc.RunInstruction<0xD1, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD2: lc.RunInstruction<0xD2, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD3: lc.RunInstruction<0xD3, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD4: lc.RunInstruction<0xD4, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD5: lc.RunInstruction<0xD5, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD6: lc.RunInstruction<0xD6, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD7: lc.RunInstruction<0xD7, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD8: lc.RunInstruction<0xD8, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xD9: lc.RunInstruction<0xD9, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xDA: lc.RunInstruction<0xDA, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xDB: lc.RunInstruction<0xDB, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xDC: lc.RunInstruction<0xDC, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xDD: lc.RunInstruction<0xDD, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xDE: lc.RunInstruction<0xDE, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xDF: lc.RunInstruction<0xDF, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE0: lc.RunInstruction<0xE0, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE1: lc.RunInstruction<0xE1, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE2: lc.RunInstruction<0xE2, CPULBMTYPE, CPULBXTYPE>(); goto *LoopTable[(lc.P >> 4) & 0x3]; + case 0xE3: lc.RunInstruction<0xE3, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE4: lc.RunInstruction<0xE4, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE5: lc.RunInstruction<0xE5, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE6: lc.RunInstruction<0xE6, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE7: lc.RunInstruction<0xE7, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE8: lc.RunInstruction<0xE8, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xE9: lc.RunInstruction<0xE9, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xEA: lc.RunInstruction<0xEA, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xEB: lc.RunInstruction<0xEB, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xEC: lc.RunInstruction<0xEC, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xED: lc.RunInstruction<0xED, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xEE: lc.RunInstruction<0xEE, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xEF: lc.RunInstruction<0xEF, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF0: lc.RunInstruction<0xF0, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF1: lc.RunInstruction<0xF1, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF2: lc.RunInstruction<0xF2, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF3: lc.RunInstruction<0xF3, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF4: lc.RunInstruction<0xF4, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF5: lc.RunInstruction<0xF5, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF6: lc.RunInstruction<0xF6, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF7: lc.RunInstruction<0xF7, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF8: lc.RunInstruction<0xF8, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xF9: lc.RunInstruction<0xF9, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xFA: lc.RunInstruction<0xFA, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xFB: lc.RunInstruction<0xFB, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xFC: lc.RunInstruction<0xFC, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xFD: lc.RunInstruction<0xFD, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xFE: lc.RunInstruction<0xFE, CPULBMTYPE, CPULBXTYPE>(); continue; + case 0xFF: lc.RunInstruction<0xFF, CPULBMTYPE, CPULBXTYPE>(); continue; + } + } + + CPUM.EventHandler(); +} + +goto ExitCat; diff --git a/Mednafen/mednafen/snes_faust/dma.inc b/Mednafen/mednafen/snes_faust/dma.inc new file mode 100644 index 0000000000..64be5e0b30 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/dma.inc @@ -0,0 +1,597 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// FIXME: Be careful to reset DMACH[ch].Offset to 0 at appropriate times(like what if HDMA cancels DMA..) + +static uint8 DMAEnable; +static uint8 HDMAEnable; +static uint8 HDMAEnableMask; + +static struct +{ + uint8 Control; // What is bit5? + uint8 BBusAddr; + + uint16 ABusAddr; + uint8 ABusBank; + + uint8 IndirBank; // HDMA + union + { + uint16 Count; + uint16 IndirAddr; // HDMA + }; + + uint16 TableAddr; // HDMA + uint8 LineCounter; // HDMA + + uint8 Unknown; + + // + // + // + uint8 Offset; + bool DoTransfer; +} DMACH[8]; + +static const struct +{ + uint8 mask; + uint8 offsets[4]; +} +TModes[8] = +{ + { 0, { 0 } }, + { 1, { 0, 1 } }, + { 1, { 0, 0 } }, + { 3, { 0, 0, 1, 1 } }, + { 3, { 0, 1, 2, 3 } }, + { 3, { 0, 1, 0, 1 } }, + { 1, { 0, 0 } }, + { 3, { 0, 0, 1, 1 } }, +}; + +// TODO: Warning message when DMA overwrites DMA registers. +void CPU_Misc::RunDMA(void) +{ + for(unsigned ch = 0; ch < 8; ch++) + { + if(DMAEnable & (1U << ch)) + { + const auto& tm = TModes[DMACH[ch].Control & 0x7]; + const int aa_delta = (DMACH[ch].Control & 0x08) ? 0 : ((DMACH[ch].Control & 0x10) ? -1 : 1); + + //printf("CH %u, %02x %02x\n", ch, DMACH[ch].Control, DMACH[ch].BBusAddr); + + do + { + if(timestamp >= next_event_ts) + return; + + const uint32 a_addr = ((DMACH[ch].ABusBank << 16) + DMACH[ch].ABusAddr); + const uint8 b_addr = DMACH[ch].BBusAddr + tm.offsets[DMACH[ch].Offset]; + + if(DMACH[ch].Control & 0x80) // B-bus -> A-bus + { + //printf("ABus: %08x\n", (DMACH[ch].ABusBank << 16) + DMACH[ch].ABusAddr); + //printf("BBus: %02x\n", DMACH[ch].BBusAddr); + uint32 save_timestamp = CPUM.timestamp; + uint8 tmp = ReadB(b_addr); + CPUM.timestamp = save_timestamp; + WriteA(a_addr, tmp); + CPUM.timestamp = save_timestamp + MEMCYC_SLOW; + } + else // A-bus -> B-bus + { + uint32 save_timestamp = CPUM.timestamp; + uint8 tmp = ReadA(a_addr); + CPUM.timestamp = save_timestamp; + WriteB(b_addr, tmp); + CPUM.timestamp = save_timestamp + MEMCYC_SLOW; + } + DMACH[ch].ABusAddr += aa_delta; + DMACH[ch].Offset = (DMACH[ch].Offset + 1) & tm.mask; + } while(--DMACH[ch].Count); + + DMAEnable &= ~1U << ch; + DMACH[ch].Offset = 0; + } + } + + if(DMAEnable == 0) + CPUM.halted = HALTED_NOT; +} + +static uint32 DMA_Update(uint32 timestamp) +{ + if(DMAEnable != 0) + { + //puts("WOOTS"); + CPUM.halted = CPU_Misc::HALTED_DMA; + } + + return SNES_EVENT_MAXTS; +} + +void DMA_InitHDMA(void) +{ + DMAEnable &= ~HDMAEnable; + + if(CPUM.halted == CPU_Misc::HALTED_DMA && DMAEnable == 0) + CPUM.halted = CPU_Misc::HALTED_NOT; + // + // + HDMAEnableMask = 0xFF; + + for(unsigned ch = 0; ch < 8; ch++) + { + DMACH[ch].DoTransfer = false; + + if(HDMAEnable & (1U << ch)) + { + DMACH[ch].TableAddr = DMACH[ch].ABusAddr; + DMACH[ch].LineCounter = CPUM.ReadA((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr); + DMACH[ch].TableAddr++; + + if(!DMACH[ch].LineCounter) + HDMAEnableMask &= ~(1U << ch); + else + { + if(DMACH[ch].Control & 0x40) + { + DMACH[ch].IndirAddr = CPUM.ReadA((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr); + DMACH[ch].TableAddr++; + + DMACH[ch].IndirAddr |= CPUM.ReadA((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr) << 8; + DMACH[ch].TableAddr++; + } + + DMACH[ch].DoTransfer = true; + } + + //printf("[DMA] HDMA %u Init: Control=0x%02x, LineCounter=0x%02x, TableAddr=0x%04x, IndirAddr=0x%04x --- ABank=0x%02x, IndirBank=0x%02x\n", ch, DMACH[ch].Control, DMACH[ch].LineCounter, DMACH[ch].TableAddr, DMACH[ch].IndirAddr, DMACH[ch].ABusBank, DMACH[ch].IndirBank); + } + } +} +extern uint32 scanline; +void DMA_RunHDMA(void) +{ + for(unsigned ch = 0; ch < 8; ch++) + { + if(HDMAEnable & HDMAEnableMask & (1U << ch)) + { + DMAEnable &= ~(1U << ch); + + if(DMACH[ch].DoTransfer) + { + const auto& tm = TModes[DMACH[ch].Control & 0x7]; + + for(DMACH[ch].Offset = 0; DMACH[ch].Offset <= tm.mask; DMACH[ch].Offset++) + { + const uint32 a_addr = (DMACH[ch].Control & 0x40) ? ((DMACH[ch].IndirBank << 16) + DMACH[ch].IndirAddr) : ((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr); + const uint8 b_addr = DMACH[ch].BBusAddr + tm.offsets[DMACH[ch].Offset]; + + if(DMACH[ch].Control & 0x80) // B-bus -> A-bus + { + //printf("ABus: %08x\n", (DMACH[ch].ABusBank << 16) + DMACH[ch].ABusAddr); + //printf("BBus: %02x\n", DMACH[ch].BBusAddr); + uint32 save_timestamp = CPUM.timestamp; + uint8 tmp = CPUM.ReadB(b_addr); + CPUM.timestamp = save_timestamp; + CPUM.WriteA(a_addr, tmp); + CPUM.timestamp = save_timestamp + MEMCYC_SLOW; + } + else // A-bus -> B-bus + { + uint32 save_timestamp = CPUM.timestamp; + uint8 tmp = CPUM.ReadA(a_addr); + CPUM.timestamp = save_timestamp; + //printf("[HDMA] CH %u 0x%08x -> 0x%02x, value=0x%02x --- Control=0x%02x, scanline=%u\n", ch, a_addr, b_addr, tmp, DMACH[ch].Control, scanline); + CPUM.WriteB(b_addr, tmp); + CPUM.timestamp = save_timestamp + MEMCYC_SLOW; + } + + if(DMACH[ch].Control & 0x40) + DMACH[ch].IndirAddr++; + else + DMACH[ch].TableAddr++; + } + DMACH[ch].Offset = 0; + } + // + // + // + + DMACH[ch].LineCounter--; + DMACH[ch].DoTransfer = DMACH[ch].LineCounter & 0x80; + + if(!(DMACH[ch].LineCounter & 0x7F)) + { + DMACH[ch].LineCounter = CPUM.ReadA((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr); + DMACH[ch].TableAddr++; + + //fprintf(stderr, "HDMA %u NewLineCounter=0x%02x --- scanline=%u\n", ch, DMACH[ch].LineCounter, scanline); + + if(DMACH[ch].Control & 0x40) + { + if(!DMACH[ch].LineCounter && !(HDMAEnable & HDMAEnableMask & (0xFEU << ch))) + { + //printf("HDMA Special~ %u\n", ch); + DMACH[ch].IndirAddr = 0; + } + else + { + DMACH[ch].IndirAddr = CPUM.ReadA((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr); + DMACH[ch].TableAddr++; + } + + DMACH[ch].IndirAddr |= CPUM.ReadA((DMACH[ch].ABusBank << 16) + DMACH[ch].TableAddr) << 8; + DMACH[ch].TableAddr++; + //fprintf(stderr, " HDMA %u New IndirAddr=0x%04x --- scanline=%u\n", ch, DMACH[ch].IndirAddr, scanline); + } + + if(!DMACH[ch].LineCounter) + HDMAEnableMask &= ~(1U << ch); + + DMACH[ch].DoTransfer = true; + } // end if(!(DMACH[ch].LineCounter & 0x7F)) + + } + } + + // + // + if(CPUM.halted == CPU_Misc::HALTED_DMA && DMAEnable == 0) + CPUM.halted = CPU_Misc::HALTED_NOT; +} + + +static DEFWRITE(Write_420B) +{ + CPUM.timestamp += MEMCYC_FAST; + +#if 0 + if(V) + fprintf(stderr, "DMA: %02x\n", V); + for(unsigned i = 0; i < 8; i++) + { + if(V & (1 << i)) + { + fprintf(stderr, " %d: Control=0x%02x, BBusAddr=0x%02x, ABusAddr=0x%04x, ABusBank=0x%02x, Count=0x%02x\n", i, DMACH[i].Control, DMACH[i].BBusAddr, DMACH[i].ABusAddr, DMACH[i].ABusBank, DMACH[i].Count); + } + } +#endif + DMAEnable = V; + + if(DMAEnable) + SNES_SetEventNT(SNES_EVENT_DMA_DUMMY, CPUM.timestamp); +} + +static DEFWRITE(Write_420C) +{ + CPUM.timestamp += MEMCYC_FAST; + + HDMAEnable = V; + + //printf("[DMA] HDMAEnable: %02x --- scanline=%u\n", V, scanline); +} + +// +// +static DEFWRITE(Write_43x0) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u Control Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].Control = V; +} + +static DEFREAD(Read_43x0) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].Control; +} +// +// +static DEFWRITE(Write_43x1) +{ + CPUM.timestamp += MEMCYC_FAST; + + //fprintf(stderr, "*** Write BBusAddr, =0x%02x --- scanline=%u\n", V, scanline); + //printf("[DMA] CH %u BBusAddr Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].BBusAddr = V; +} + +static DEFREAD(Read_43x1) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].BBusAddr; +} +// +// +static DEFWRITE(Write_43x2) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u ABusAddrL Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].ABusAddr &= 0xFF00; + DMACH[(A >> 4) & 0x7].ABusAddr |= V << 0; +} + +static DEFREAD(Read_43x2) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].ABusAddr >> 0; +} +// +// +static DEFWRITE(Write_43x3) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u ABusAddrH Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].ABusAddr &= 0x00FF; + DMACH[(A >> 4) & 0x7].ABusAddr |= V << 8; +} + +static DEFREAD(Read_43x3) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].ABusAddr >> 8; +} +// +// +static DEFWRITE(Write_43x4) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u ABusBank Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].ABusBank = V; +} + +static DEFREAD(Read_43x4) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].ABusBank; +} +// +// +static DEFWRITE(Write_43x5) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u IndirAddrL Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].IndirAddr &= 0xFF00; + DMACH[(A >> 4) & 0x7].IndirAddr |= V << 0; +} + +static DEFREAD(Read_43x5) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].IndirAddr >> 0; +} +// +// +static DEFWRITE(Write_43x6) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u IndirAddrH Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].IndirAddr &= 0x00FF; + DMACH[(A >> 4) & 0x7].IndirAddr |= V << 8; +} + +static DEFREAD(Read_43x6) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].IndirAddr >> 8; +} +// +// +static DEFWRITE(Write_43x7) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u IndirBank Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].IndirBank = V; +} + +static DEFREAD(Read_43x7) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].IndirBank; +} +// +// +static DEFWRITE(Write_43x8) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u TableAddrL Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].TableAddr &= 0xFF00; + DMACH[(A >> 4) & 0x7].TableAddr |= V << 0; +} + +static DEFREAD(Read_43x8) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].TableAddr >> 0; +} +// +// +static DEFWRITE(Write_43x9) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u TableAddrH Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].TableAddr &= 0x00FF; + DMACH[(A >> 4) & 0x7].TableAddr |= V << 8; +} + +static DEFREAD(Read_43x9) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].TableAddr >> 8; +} +// +// +static DEFWRITE(Write_43xA) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("[DMA] CH %u LineCounter Write, 0x%02x\n", (A >> 4) & 0x7, V); + + DMACH[(A >> 4) & 0x7].LineCounter = V; +} + +static DEFREAD(Read_43xA) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].LineCounter; +} +// +// +static DEFWRITE(Write_43xB_43xF) +{ + CPUM.timestamp += MEMCYC_FAST; + + DMACH[(A >> 4) & 0x7].Unknown = V; +} + +static DEFREAD(Read_43xB_43xF) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DMACH[(A >> 4) & 0x7].Unknown; +} + +// +// +static void DMA_Reset(bool powering_up) +{ + DMAEnable = 0; + HDMAEnable = 0; + + for(unsigned ch = 0; ch < 8; ch++) + { + if(powering_up) + { + DMACH[ch].Control = 0xFF; + DMACH[ch].BBusAddr = 0xFF; + DMACH[ch].ABusAddr = 0xFFFF; + DMACH[ch].ABusBank = 0xFF; + DMACH[ch].Count = 0xFFFF; + DMACH[ch].IndirBank = 0xFF; + DMACH[ch].TableAddr = 0xFFFF; + DMACH[ch].LineCounter = 0xFF; + DMACH[ch].Unknown = 0xFF; + + DMACH[ch].Offset = 0; + } + } +} + +static void DMA_Init(void) +{ + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + if(bank <= 0x3F || (bank >= 0x80 && bank <= 0xBF)) + { + Set_A_Handlers((bank << 16) | 0x420B, OBRead_FAST, Write_420B); + Set_A_Handlers((bank << 16) | 0x420C, OBRead_FAST, Write_420C); + + for(unsigned ch = 0; ch < 8; ch++) + { + const uint32 chba = (bank << 16) + 0x4300 + (ch << 4); + + Set_A_Handlers(chba + 0x0, Read_43x0, Write_43x0); + Set_A_Handlers(chba + 0x1, Read_43x1, Write_43x1); + Set_A_Handlers(chba + 0x2, Read_43x2, Write_43x2); + Set_A_Handlers(chba + 0x3, Read_43x3, Write_43x3); + Set_A_Handlers(chba + 0x4, Read_43x4, Write_43x4); + Set_A_Handlers(chba + 0x5, Read_43x5, Write_43x5); + Set_A_Handlers(chba + 0x6, Read_43x6, Write_43x6); + Set_A_Handlers(chba + 0x7, Read_43x7, Write_43x7); + Set_A_Handlers(chba + 0x8, Read_43x8, Write_43x8); + Set_A_Handlers(chba + 0x9, Read_43x9, Write_43x9); + Set_A_Handlers(chba + 0xA, Read_43xA, Write_43xA); + Set_A_Handlers(chba + 0xB, Read_43xB_43xF, Write_43xB_43xF); + Set_A_Handlers(chba + 0xF, Read_43xB_43xF, Write_43xB_43xF); + } + } + } +} + +static void DMA_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(DMAEnable), + SFVAR(HDMAEnable), + SFVAR(HDMAEnableMask), + + #define SFDMACH(n) \ + SFVAR(DMACH[n].Control), \ + SFVAR(DMACH[n].BBusAddr), \ + SFVAR(DMACH[n].ABusAddr), \ + SFVAR(DMACH[n].ABusBank), \ + SFVAR(DMACH[n].IndirBank), \ + SFVAR(DMACH[n].Count), \ + SFVAR(DMACH[n].TableAddr), \ + SFVAR(DMACH[n].LineCounter), \ + SFVAR(DMACH[n].Unknown), \ + SFVAR(DMACH[n].Offset), \ + SFVAR(DMACH[n].DoTransfer) + + SFDMACH(0), + SFDMACH(1), + SFDMACH(2), + SFDMACH(3), + SFDMACH(4), + SFDMACH(5), + SFDMACH(6), + SFDMACH(7), + + #undef SFDMACH + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "DMA"); +} + diff --git a/Mednafen/mednafen/snes_faust/dsp.inc b/Mednafen/mednafen/snes_faust/dsp.inc new file mode 100644 index 0000000000..156016beea --- /dev/null +++ b/Mednafen/mednafen/snes_faust/dsp.inc @@ -0,0 +1,1303 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + $x0: VxVOLL + $x1: VxVOLR + $x2: VxPITCHL + $x3: VxPITCHH + $x4: VxSRCN + $x5: VxADSR1 + $x6: VxADSR2 + $x7: VxGAIN + $x8: VxENVX + $x9: VxOUTX + + $0C: MVOLL + $1C: MVOLR + + $2C: EVOLL + $3C: EVOLR + $4C: KON + $5C: KOFF + $6C: FLG + $7C: ENDX + + $0D: EFB + $2D: PMON + $3D: NON + $4D: EON + $5D: DIR + $6D: ESA + $7D: EDL + + $xF: FIRx +*/ + +static INLINE int16 ClampS16(int32 v) +{ + if(v > 32767) + v = 32767; + + if(v < -32768) + v = -32768; + + return v; +} + +static const int16 ResampHalfImp[512] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, + 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, + 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, + 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, + 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, + 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, + 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, + 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, + 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, + 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, + 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, + 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, + 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, + 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, + 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, + 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, + 969, 974, 978, 983, 988, 992, 997, 1001, 1005, 1010, 1014, 1019, 1023, 1027, 1032, 1036, + 1040, 1045, 1049, 1053, 1057, 1061, 1066, 1070, 1074, 1078, 1082, 1086, 1090, 1094, 1098, 1102, + 1106, 1109, 1113, 1117, 1121, 1125, 1128, 1132, 1136, 1139, 1143, 1146, 1150, 1153, 1157, 1160, + 1164, 1167, 1170, 1174, 1177, 1180, 1183, 1186, 1190, 1193, 1196, 1199, 1202, 1205, 1207, 1210, + 1213, 1216, 1219, 1221, 1224, 1227, 1229, 1232, 1234, 1237, 1239, 1241, 1244, 1246, 1248, 1251, + 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1270, 1272, 1274, 1275, 1277, 1279, 1280, + 1282, 1283, 1284, 1286, 1287, 1288, 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1297, 1298, + 1299, 1300, 1300, 1301, 1302, 1302, 1303, 1303, 1303, 1304, 1304, 1304, 1304, 1304, 1305, 1305 +}; + +enum +{ + VRO_VOLL = 0x0, + VRO_VOLR = 0x1, + VRO_PITCHL = 0x2, + VRO_PITCHH = 0x3, + VRO_SRCN = 0x4, + VRO_ADSR1 = 0x5, + VRO_ADSR2 = 0x6, + VRO_GAIN = 0x7, + VRO_ENVX = 0x8, + VRO_OUTX = 0x9 +}; + +enum +{ + GRA_MVOLL = 0x0C, + GRA_MVOLR = 0x1C, + + GRA_EVOLL = 0x2C, + GRA_EVOLR = 0x3C, + GRA_KON = 0x4C, + GRA_KOFF = 0x5C, + GRA_FLG = 0x6C, + GRA_ENDX = 0x7C, + + GRA_EFB = 0x0D, + GRA_PMON = 0x2D, + GRA_NON = 0x3D, + GRA_EON = 0x4D, + GRA_DIR = 0x5D, + GRA_ESA = 0x6D, + GRA_EDL = 0x7D, + + GRA_FIR0 = 0x0F, + GRA_FIR1 = 0x1F, + GRA_FIR2 = 0x2F, + GRA_FIR3 = 0x3F, + GRA_FIR4 = 0x4F, + GRA_FIR5 = 0x5F, + GRA_FIR6 = 0x6F, + GRA_FIR7 = 0x7F, +}; + +static uint8 Regs[0x80]; + +struct DSP_HGS +{ + bool KPollCycle; + + uint16 RateCounter; + // + uint16 NoiseVal; + + // + int16 Accum[2]; + int16 EchoAccum[2]; + // + + uint8 IKON; + + // + + uint8 Pending_ENDX; + + // + + uint8 Latch_IKON; + uint8 Latch_KOFF; + + uint8 Latch_PMON; + uint8 Latch_NON; + uint8 Latch_EON; + uint8 Latch_DIR; + + // + // + bool EchoWriteDisable; + + uint8 Latch_EDL; + uint8 Latch_ESA; + + uint8 Latch_FIR[8]; + + int16 EchoFIROut[2]; + + int16 EchoFIRBuf[2][8]; + uint8 EchoFIRBufPos; + + uint16 EchoBase; + uint16 EchoOffset; + uint16 EchoBound; +}; + +enum +{ + ADSR_PHASE_ATTACK = 0, + ADSR_PHASE_DECAY, + ADSR_PHASE_SUSTAIN, + ADSR_PHASE_RELEASE +}; + +struct DSP_Voice +{ + uint16 BRR_Addr; + uint8 BRR_Offs; // 0, 2, 4, 6 + uint8 BRR_Header; + uint8 BRR_Data[2]; + + int16 RB[12 * 2]; + uint8 RB_Pos; + uint8 RB_In; + + uint8 Latch_SRCN; + uint16 Addr; + + bool StartReload; + bool LoopReload; + + uint8 Latch_ADSR1; + uint8 ADSRPhase; + uint16 ADSRLevel; + bool ADSRBentFastNext; + + uint8 Pending_ENVX; + uint8 Pending_OUTX; + + int16 CurSample; + + unsigned Pitch; + unsigned Phase; +}; + +static DSP_HGS HGS; +static DSP_Voice Voices[8]; + +static int16 OutputL; // To avoid distortion, since L and R aren't updated at the same time(and the emulation frame can end between them). +static unsigned OutputBufPos; +static OwlResampler* Resampler; +static double ResampLastRate; +static OwlBuffer ResampBuf[2]; + +//static uint16 sawthing; + +//static int KONCounter[8] = { 9, 9, 9, 9, 9, 9, 9, 9 }; + +static INLINE bool CheckRC(unsigned rate) +{ + static const uint16 RateMasks[32] = + { + 0x0000, 0xFFE0, 0x3FF8, + 0x1FE7, 0x7FE0, 0x1FF8, + 0x0FE7, 0x3FE0, 0x0FF8, + 0x07E7, 0x1FE0, 0x07F8, + 0x03E7, 0x0FE0, 0x03F8, + 0x01E7, 0x07E0, 0x01F8, + 0x00E7, 0x03E0, 0x00F8, + 0x0067, 0x01E0, 0x0078, + 0x0027, 0x00E0, 0x0038, + 0x0007, 0x0060, 0x0018, + 0x0020, + 0x0000 + }; + + static const uint16 RateXOR[32] = + { + 0xffff, 0x0000, 0x3e08, + 0x1d04, 0x0000, 0x1e08, + 0x0d04, 0x0000, 0x0e08, + 0x0504, 0x0000, 0x0608, + 0x0104, 0x0000, 0x0208, + 0x0104, 0x0000, 0x0008, + 0x0004, 0x0000, 0x0008, + 0x0004, 0x0000, 0x0008, + 0x0004, 0x0000, 0x0008, + 0x0004, 0x0000, 0x0008, + 0x0000, + 0x0000 + }; + + return !((HGS.RateCounter & RateMasks[rate]) ^ RateXOR[rate]); +} + +static INLINE void ResetRC(void) +{ + HGS.RateCounter = 0; +} + +static INLINE void ClockRC(void) +{ + if(!(HGS.RateCounter & 0x7)) + HGS.RateCounter ^= 0x5; + + if(!(HGS.RateCounter & 0x18)) + HGS.RateCounter ^= 0x18; + + HGS.RateCounter -= 0x29; +} + + +static INLINE void RunADSR(const unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + int32 new_env = v->ADSRLevel; + const uint16 ADSR1 = v->Latch_ADSR1; + const uint16 ADSR2 = Regs[(voice_num << 4) | VRO_ADSR2]; + const uint16 GAIN = Regs[(voice_num << 4) | VRO_GAIN]; + int32 sl; + + if(v->ADSRPhase == ADSR_PHASE_RELEASE) + new_env -= 8; + else + { + unsigned rate = 0; + signed delta = 0; + + if(ADSR1 & 0x80) + { + sl = ADSR2 >> 5; + + if(v->ADSRPhase == ADSR_PHASE_ATTACK) + { + rate = ((ADSR1 & 0xF) << 1) + 1; + + if(rate == 0x1F) + delta = 1024; + else + delta = 32; + } + else if(v->ADSRPhase == ADSR_PHASE_DECAY) + { + rate = ((ADSR1 >> 3) & 0xE) | 0x10; + delta = ~((int32)(v->ADSRLevel - 1) >> 8); + } + else if(v->ADSRPhase == ADSR_PHASE_SUSTAIN) + { + rate = ADSR2 & 0x1F; + delta = ~((int32)(v->ADSRLevel - 1) >> 8); + } + } + else + { + sl = GAIN >> 5; + + if(GAIN & 0x80) + { + rate = GAIN & 0x1F; + + switch((GAIN >> 5) & 0x3) + { + case 0: delta = -32; break; + case 1: delta = ~((int32)(v->ADSRLevel - 1) >> 8); break; + case 2: delta = 32; break; + case 3: delta = v->ADSRBentFastNext ? 32 : 8; break; + } + } + else + new_env = (GAIN & 0x7F) << 4; + } + + if(CheckRC(rate)) + new_env += delta; + + if(v->ADSRPhase == ADSR_PHASE_DECAY) + { + if((new_env >> 8) == sl) + v->ADSRPhase = ADSR_PHASE_SUSTAIN; + } + + if(v->ADSRPhase == ADSR_PHASE_ATTACK) + { + if(new_env > 0x7FF) + { + v->ADSRPhase = ADSR_PHASE_DECAY; + } + } + } + v->ADSRBentFastNext = (new_env & 0x7FF) < 0x600; + + if(new_env < 0) + new_env = 0; + + if(new_env > 0x7FF) + new_env = 0x7FF; + + v->ADSRLevel = new_env; + + //if(voice_num == 4 && v->ADSRLevel) + // fprintf(stderr, "Phase=%u, Level=%04x\n", v->ADSRPhase, v->ADSRLevel); +} + +static INLINE void V1(unsigned voice_num) +{ + Voices[voice_num].Latch_SRCN = Regs[(voice_num << 4) | VRO_SRCN]; +} + +static INLINE void V2(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + if(v->StartReload) + { + v->BRR_Addr = (APURAM[((HGS.Latch_DIR << 8) + (v->Latch_SRCN << 2) + 0) & 0xFFFF] << 0) | + (APURAM[((HGS.Latch_DIR << 8) + (v->Latch_SRCN << 2) + 1) & 0xFFFF] << 8); + v->BRR_Offs = 0; + + v->StartReload = false; + } + else if(v->LoopReload) + { + v->BRR_Addr = (APURAM[((HGS.Latch_DIR << 8) + (v->Latch_SRCN << 2) + 2) & 0xFFFF] << 0) | + (APURAM[((HGS.Latch_DIR << 8) + (v->Latch_SRCN << 2) + 3) & 0xFFFF] << 8); + v->BRR_Offs = 0; + + v->LoopReload = false; + } + + v->Pitch = Regs[(voice_num << 4) | VRO_PITCHL]; + + v->Latch_ADSR1 = Regs[(voice_num << 4) | VRO_ADSR1]; +} + +static INLINE void V3a(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + v->Pitch |= (Regs[(voice_num << 4) | VRO_PITCHH] & 0x3F) << 8; + + if(HGS.Latch_PMON & (1U << voice_num) & ~1U) + { + //printf("%d, %d, %d\n", v->Pitch, Voices[voice_num - 1].CurSample, ((Voices[voice_num - 1].CurSample >> 6) * (int32)v->Pitch) >> 10); + v->Pitch += ((Voices[voice_num - 1].CurSample >> 6) * (int32)v->Pitch) >> 10; + //printf(" %d\n", v->Pitch); + } +} + +static INLINE void V3b(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + v->BRR_Header = APURAM[v->BRR_Addr]; + v->BRR_Data[0] = APURAM[(uint16)(v->BRR_Addr + 1 + v->BRR_Offs + 0)]; +} + +static INLINE void V3c(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + { + const int16* const rbp = &v->RB[(v->Phase >> 12) + v->RB_Pos]; + unsigned ph = (v->Phase >> 4) & 0xFF; + int32 tmp; + + tmp = ((rbp[0] * ResampHalfImp[255 - ph]) >> 11) + + ((rbp[1] * ResampHalfImp[511 - ph]) >> 11) + + ((rbp[2] * ResampHalfImp[256 + ph]) >> 11); + + //if(voice_num == 0 && sign_15_to_s16(tmp) != tmp) + //{ + // printf("Phase=0x%04x, RB_Pos=0x%02x --- %d %d %d\n", v->Phase, v->RB_Pos, rbp[0], rbp[1], rbp[2]); + // abort(); + //} + + tmp = sign_15_to_s16(tmp); + + tmp += ((rbp[3] * ResampHalfImp[ 0 + ph]) >> 11); + + if(tmp < -16384) + tmp = -16384; + + if(tmp > 16383) + tmp = 16383; + + v->CurSample = tmp; + + if(HGS.Latch_NON & (1U << voice_num)) + { + v->CurSample = sign_15_to_s16(HGS.NoiseVal); + } + + //if(voice_num == 0 && KONCounter[voice_num] < 9) + // printf("%d, Sample calc; Phase=0x%04x, RB_Pos=0x%02x, Pre Envelope: 0x%04x -- %02x %02x %02x\n", KONCounter[voice_num], v->Phase, v->RB_Pos, (uint16)v->CurSample, rbp[0], rbp[1], rbp[2]); + } + + v->CurSample = ((v->CurSample * v->ADSRLevel) >> 10) &~ 1; + + //if(voice_num == 0 && KONCounter[voice_num] < 9) + // printf("\t post: 0x%04x\n", (uint16)v->CurSample >> 1); + // + // + // + if((v->BRR_Header & 0x3) == 0x01) + { + v->ADSRLevel = 0; + v->ADSRPhase = ADSR_PHASE_RELEASE; + } + + if(HGS.Latch_IKON & (1U << voice_num)) + { + if(!HGS.KPollCycle) + { + //if(voice_num == 5) + // printf("DEBUG Key On: %u\n", voice_num); + v->ADSRPhase = ADSR_PHASE_ATTACK; + v->ADSRLevel = 0; + v->ADSRBentFastNext = true; + } + } + else + { + if((v->RB_In & 0xF) == 12) + RunADSR(voice_num); + + if((HGS.Latch_KOFF & (1U << voice_num)) || (Regs[GRA_FLG] & 0x80)) + { + //if(voice_num == 5 && v->ADSRPhase != ADSR_PHASE_RELEASE) + // printf("DEBUG Key Off: %u\n", voice_num); + + v->ADSRPhase = ADSR_PHASE_RELEASE; + + if(Regs[GRA_FLG] & 0x80) + v->ADSRLevel = 0; + } + } +} + +static void V3(unsigned voice_num) +{ + V3a(voice_num); + V3b(voice_num); + V3c(voice_num); +} + +static void VoiceAccum(unsigned voice_num, unsigned lr) +{ + DSP_Voice* const v = &Voices[voice_num]; + int32 tmp = (v->CurSample * (int8)Regs[(voice_num << 4) | (VRO_VOLL + lr)]) >> 7; + + HGS.Accum[lr] = ClampS16(HGS.Accum[lr] + tmp); + + if(HGS.Latch_EON & (1U << voice_num)) + HGS.EchoAccum[lr] = ClampS16(HGS.EchoAccum[lr] + tmp); +} + +static void V4(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + bool snork = (v->RB_In == 12); + + VoiceAccum(voice_num, 0); + + if(v->Phase & 0x4000) + { + v->Phase &= 0x3FFF; + v->RB_In -= 4; + } + + if(v->RB_In == 28) + v->RB_In = 12; + + if(v->RB_In != 12) + { + v->BRR_Data[1] = APURAM[(uint16)(v->BRR_Addr + 1 + v->BRR_Offs + 1)]; + v->BRR_Offs = (v->BRR_Offs + 2) & 0x6; + if(!v->BRR_Offs) + { + v->BRR_Addr += 9; + + if(v->BRR_Header & 0x01) + v->LoopReload = true; + } + + //if(voice_num == 0) // && KONCounter[voice_num] < 9) + // printf("%d, BRR Decode->%u --- Header=0x%02x, data0=0x%02x, data1=0x%02x\n", KONCounter[voice_num], v->RB_Pos, v->BRR_Header, v->BRR_Data[0], v->BRR_Data[1]); + + { + static const int8 weights[4][2] = + { + // i-2, i-1 + { 0, 0 }, + { 0, 60 }, + { -60, 122 }, + { -52, 115 }, + }; + unsigned filter = (v->BRR_Header >> 2) & 0x3; + unsigned shift = (v->BRR_Header >> 4) & 0xF; + uint16 brrd = (v->BRR_Data[0] << 8) | v->BRR_Data[1]; + + if(shift > 12) + { + brrd &= 0x8888; + brrd |= brrd >> 1; + brrd |= brrd >> 2; + shift = 12; + } + + for(unsigned i = 0; i < 4; i++) + { + int32 s = (int32)((uint32)(int16)(brrd & 0xF000) << shift) >> 13; + + s += (v->RB[(v->RB_Pos + i + 10)] * weights[filter][0]) >> 6; + s += (v->RB[(v->RB_Pos + i + 11)] * weights[filter][1]) >> 6; + + if(s < -32768) + s = -32768; + + if(s > 32767) + s = 32767; + + s = sign_15_to_s16(s); + + //if(voice_num == 0) // && KONCounter[voice_num] < 9) + // printf("\t0x%04x\n", (uint16)s); + + v->RB[v->RB_Pos + 0 + i] = s; + v->RB[v->RB_Pos + 12 + i] = s; + brrd <<= 4; + } + v->RB_Pos = (v->RB_Pos + 4) % 12; + v->RB_In += 4; + } + } + + if(HGS.Latch_IKON & (1U << voice_num)) + { + if(!HGS.KPollCycle) + { + v->Phase = 0; + v->RB_Pos = 0; + v->RB_In = 12; + v->StartReload = true; + v->LoopReload = false; + } + else + { + v->RB_In = 16; + } + } + else if(v->RB_In == 12 && snork) + { + //if(voice_num == 0 && KONCounter[voice_num] < 9) + // printf("%d, Add pitch(phase before add = 0x%04x.\n", KONCounter[voice_num], v->Phase); + + v->Phase += v->Pitch; + if(v->Phase > 0x7FFF) + v->Phase = 0x7FFF; + } +} + +static INLINE void V5(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + VoiceAccum(voice_num, 1); + + HGS.Pending_ENDX = Regs[GRA_ENDX]; + + if((HGS.Latch_IKON & (1U << voice_num)) && !HGS.KPollCycle) + { + HGS.Pending_ENDX &= ~(1U << voice_num); + } + else if(v->LoopReload) + { + HGS.Pending_ENDX |= 1U << voice_num; + } +} + +static INLINE void V6(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + v->Pending_OUTX = v->CurSample >> 8; +} + +static INLINE void V7(unsigned voice_num) +{ + DSP_Voice* const v = &Voices[voice_num]; + + Regs[GRA_ENDX] = HGS.Pending_ENDX; + + Voices[voice_num].Pending_ENVX = v->ADSRLevel >> 4; +} + +static INLINE void V8(unsigned voice_num) +{ + Regs[(voice_num << 4) | VRO_OUTX] = Voices[voice_num].Pending_OUTX; +} + +static INLINE void V9(unsigned voice_num) +{ + Regs[(voice_num << 4) | VRO_ENVX] = Voices[voice_num].Pending_ENVX; +} + +static INLINE void ReadEchoBuffer(unsigned lr) +{ + HGS.EchoFIRBuf[lr][HGS.EchoFIRBufPos] = MDFN_de16lsb(&APURAM[(uint16)(HGS.EchoBase + HGS.EchoOffset) + (lr << 1)]) &~ 1; + + if(lr) + HGS.EchoFIRBufPos = (HGS.EchoFIRBufPos + 1) & 7; +} + +static INLINE void RunFIR(unsigned lr) +{ + int32 accum = 0; + + for(unsigned i = 0; i < 7; i++) + accum += ((int8)HGS.Latch_FIR[i] * HGS.EchoFIRBuf[lr][(HGS.EchoFIRBufPos + i) & 0x7]) >> 7; + + accum = (int16)accum; + accum += ((int8)HGS.Latch_FIR[7] * HGS.EchoFIRBuf[lr][(HGS.EchoFIRBufPos + 7) & 0x7]) >> 7; + accum = ClampS16(accum) &~ 1; + + HGS.EchoFIROut[lr] = accum; +} + +static INLINE void WriteEchoBuffer(unsigned lr) +{ + uint8* const target = &APURAM[(uint16)(HGS.EchoBase + HGS.EchoOffset) + (lr << 1)]; + + // printf("Write: %d, %04x\n", lr, target - APURAM); + MDFN_en16lsb(target, HGS.EchoAccum[lr] &~ 1); +} + +static INLINE int16 CalcOutput(unsigned lr) +{ + int16 m = ClampS16(( HGS.Accum[lr] * (int8)Regs[lr ? GRA_MVOLR : GRA_MVOLL]) >> 7); + int16 e = ClampS16((HGS.EchoFIROut[lr] * (int8)Regs[lr ? GRA_EVOLR : GRA_EVOLL]) >> 7); + int16 ret = ClampS16(m + e); + + if(Regs[GRA_FLG] & 0x40) // Mute + ret = 0; + + return ret; +} + +template +static void DSP_Cycle(void) +{ + switch(which) + { + case 0x00: + V5(0); + V2(1); + + TickT01PreDiv(); + TickTimer(2); + break; + + case 0x01: + V6(0); + V3(1); + break; + + case 0x02: + V7(0); + V4(1); + V1(3); + break; + + case 0x03: + V8(0); + V5(1); + V2(2); + break; + + case 0x04: + V9(0); + V6(1); + V3(2); + break; + + case 0x05: + V7(1); + V4(2); + V1(4); + break; + + case 0x06: + V8(1); + V5(2); + V2(3); + break; + + case 0x07: + V9(1); + V6(2); + V3(3); + break; + + case 0x08: + V7(2); + V4(3); + V1(5); + break; + + case 0x09: + V8(2); + V5(3); + V2(4); + break; + + case 0x0A: + V9(2); + V6(3); + V3(4); + break; + + case 0x0B: + V7(3); + V4(4); + V1(6); + break; + + case 0x0C: + V8(3); + V5(4); + V2(5); + break; + + case 0x0D: + V9(3); + V6(4); + V3(5); + break; + + case 0x0E: + V7(4); + V4(5); + V1(7); + break; + + case 0x0F: + V8(4); + V5(5); + V2(6); + break; + + case 0x10: + V9(4); + V6(5); + V3(6); + + TickTimer(2); + break; + + case 0x11: + V1(0); + V7(5); + V4(6); + break; + + case 0x12: + V8(5); + V5(6); + V2(7); + break; + + case 0x13: + V9(5); + V6(6); + V3(7); + break; + + case 0x14: + V1(1); + V7(6); + V4(7); + break; + + case 0x15: + V2(0); + V8(6); + V5(7); + break; + + case 0x16: // 22 + V3a(0); + V9(6); + V6(7); + // + ReadEchoBuffer(0); + HGS.Latch_FIR[0] = Regs[GRA_FIR0]; + break; + + case 0x17: // 23 + V7(7); + // + ReadEchoBuffer(1); + HGS.Latch_FIR[1] = Regs[GRA_FIR1]; + HGS.Latch_FIR[2] = Regs[GRA_FIR2]; + break; + + case 0x18: // 24 + V8(7); + // + HGS.Latch_FIR[3] = Regs[GRA_FIR3]; + HGS.Latch_FIR[4] = Regs[GRA_FIR4]; + HGS.Latch_FIR[5] = Regs[GRA_FIR5]; + break; + + case 0x19: // 25 + V3b(0); + V9(7); + // + HGS.Latch_FIR[6] = Regs[GRA_FIR6]; + HGS.Latch_FIR[7] = Regs[GRA_FIR7]; + RunFIR(0); + RunFIR(1); + break; + + case 0x1A: // 26 + OutputL = CalcOutput(0); + HGS.Accum[0] = 0; + + HGS.EchoAccum[0] = ClampS16(HGS.EchoAccum[0] + ClampS16((HGS.EchoFIROut[0] * (int8)Regs[GRA_EFB]) >> 7)); + HGS.EchoAccum[1] = ClampS16(HGS.EchoAccum[1] + ClampS16((HGS.EchoFIROut[1] * (int8)Regs[GRA_EFB]) >> 7)); + break; + + case 0x1B: // 27 + HGS.Latch_PMON = Regs[GRA_PMON]; + +#if 0 + (&ResampBuf[0].BufPudding()->f)[OutputBufPos] = (int32)((uint32)(int16)sawthing << 7); + (&ResampBuf[1].BufPudding()->f)[OutputBufPos] = (int32)((uint32)(int16)sawthing << 7); + sawthing += 32768; +#else + (&ResampBuf[0].BufPudding()->f)[OutputBufPos] = /*((int16)rand() >> 1)*/ (int32)((uint32)OutputL << 8); + (&ResampBuf[1].BufPudding()->f)[OutputBufPos] = /*((int16)rand() >> 1)*/ (int32)((uint32)CalcOutput(1) << 8); +#endif + OutputBufPos = (OutputBufPos + 1) & 1023; + HGS.Accum[1] = 0; + break; + + case 0x1C: // 28 + HGS.Latch_NON = Regs[GRA_NON]; + HGS.Latch_EON = Regs[GRA_EON]; + HGS.Latch_DIR = Regs[GRA_DIR]; + + // + // + HGS.EchoWriteDisable = Regs[GRA_FLG] & 0x20; + break; + + case 0x1D: // 29 + HGS.Latch_EDL = Regs[GRA_EDL]; + HGS.Latch_ESA = Regs[GRA_ESA]; + + if(HGS.KPollCycle) + HGS.IKON &= ~HGS.Latch_IKON; + + // + // + if(!HGS.EchoWriteDisable) + WriteEchoBuffer(0); + + HGS.EchoWriteDisable = Regs[GRA_FLG] & 0x20; + break; + + case 0x1E: // 30 + if(!HGS.EchoWriteDisable) + WriteEchoBuffer(1); + HGS.EchoAccum[0] = HGS.EchoAccum[1] = 0; + + //for(unsigned i = 0; i < 8; i++) + //{ + // if(KONCounter[i] < 9) + // KONCounter[i]++; + //} + + if(HGS.KPollCycle) + { + HGS.Latch_KOFF = Regs[GRA_KOFF]; + HGS.Latch_IKON = HGS.IKON; + + //for(unsigned i = 0; i < 8; i++) + //{ + // if(HGS.Latch_IKON & (1U << i)) + // KONCounter[i] = 0; + //} + } + HGS.KPollCycle = !HGS.KPollCycle; + + ClockRC(); + + if(CheckRC(Regs[GRA_FLG] & 0x1F)) + { + HGS.NoiseVal = (HGS.NoiseVal >> 1) | (((HGS.NoiseVal << 14) ^ (HGS.NoiseVal << 13)) & 0x4000); + } + + // + // + // + HGS.EchoBase = HGS.Latch_ESA << 8; + + if(!HGS.EchoOffset) + HGS.EchoBound = (HGS.Latch_EDL & 0xF) << 11; + + HGS.EchoOffset += 4; + if(HGS.EchoOffset >= HGS.EchoBound) + HGS.EchoOffset = 0; + + // + // Order is important.. + // + V3c(0); + break; + + case 0x1F: //31 + V4(0); + V1(2); + break; + } + + SPC700_IOHandler = &DSP_Cycle<(which + 1) & 0x1F>; +} + +static void DSP_Reset(bool powering_up) +{ + SPC700_IOHandler = &DSP_Cycle<0>; + + memset(Regs, 0, sizeof(Regs)); + memset(&HGS, 0, sizeof(HGS)); + memset(Voices, 0, sizeof(Voices)); + + Regs[GRA_FLG] = 0xE0; + HGS.EchoWriteDisable = true; + + OutputBufPos = 0; + + HGS.NoiseVal = 0x4000; + + HGS.KPollCycle = false; + + ResetRC(); +} + +static INLINE uint8 DSP_Read(uint8 A) +{ + return Regs[A & 0x7F]; +} + +static INLINE void DSP_Write(uint8 A, uint8 V) +{ + //if((A & 0xF0) == 0x40 && ((A & 0xF) <= 0x09)) //0x02 || (A & 0xF) == 0x03) + // fprintf(stderr, "DSP Write: 0x%02x 0x%02x\n", A, V); + + if(MDFN_LIKELY(A < 0x80)) + { + if(A == GRA_ENDX) + { + V = 0; + HGS.Pending_ENDX = V; + } + + if(A == GRA_KON) + { + HGS.IKON = V; + } + + if((A & 0xF) == VRO_ENVX) + Voices[A >> 4].Pending_ENVX = V; + + if((A & 0xF) == VRO_OUTX) + Voices[A >> 4].Pending_OUTX = V; + + Regs[A] = V; + } +} + +static void MDFN_COLD DSP_Init(void) +{ + Resampler = NULL; + ResampLastRate = 0; +} + +static void MDFN_COLD DSP_Kill(void) +{ + if(Resampler) + { + delete Resampler; + Resampler = NULL; + } +} + +static void DSP_StartFrame(double dsp_rate, double rate) +{ + if(ResampLastRate != rate) + { + if(Resampler) + { + delete Resampler; + Resampler = NULL; + } + + if(rate) + { + Resampler = new OwlResampler(dsp_rate, rate, MDFN_GetSettingF("snes_faust.resamp_rate_error"), 10, MDFN_GetSettingUI("snes_faust.resamp_quality"), 1.1); + + for(unsigned i = 0; i < 2; i++) + Resampler->ResetBufResampState(&ResampBuf[i]); + } + + ResampLastRate = rate; + } +} + +static int32 DSP_EndFrame(int16* SoundBuf) +{ + int32 ret = 0; + + //printf("%d\n", ret); + if(SoundBuf && Resampler) + { +#if 0 + ret = OutputBufPos; + + for(unsigned i = 0; i < OutputBufPos * 2; i++) + SoundBuf[i] = (int32)(&ResampBuf[i & 1].BufPudding()->f)[i >> 1] >> 8; +#else + for(unsigned i = 0; i < 2; i++) + ret = Resampler->Resample(&ResampBuf[i], OutputBufPos, SoundBuf + i, 0xFFFF); // FIXME 0xFFFF +#endif + //ret = OutputBufPos; + //memcpy(SoundBuf, OutputBuf, OutputBufPos * sizeof(int16) * 2); + //OutputBufPos = 0; + } + else + { + for(unsigned i = 0; i < 2; i++) + ResampBuf[i].ResampleSkipped(OutputBufPos); + } + + OutputBufPos = 0; + + return ret; +} + +static void DSP_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + uint8 DSP_CycPhase = 0; + + #define DSPCPH(n) { if(&DSP_Cycle == SPC700_IOHandler) DSP_CycPhase = n; } + DSPCPH(0x00) + DSPCPH(0x01) + DSPCPH(0x02) + DSPCPH(0x03) + DSPCPH(0x04) + DSPCPH(0x05) + DSPCPH(0x06) + DSPCPH(0x07) + DSPCPH(0x08) + DSPCPH(0x09) + DSPCPH(0x0A) + DSPCPH(0x0B) + DSPCPH(0x0C) + DSPCPH(0x0D) + DSPCPH(0x0E) + DSPCPH(0x0F) + DSPCPH(0x10) + DSPCPH(0x11) + DSPCPH(0x12) + DSPCPH(0x13) + DSPCPH(0x14) + DSPCPH(0x15) + DSPCPH(0x16) + DSPCPH(0x17) + DSPCPH(0x18) + DSPCPH(0x19) + DSPCPH(0x1A) + DSPCPH(0x1B) + DSPCPH(0x1C) + DSPCPH(0x1D) + DSPCPH(0x1E) + DSPCPH(0x1F) + #undef DSPCPH + + SFORMAT StateRegs[] = + { + SFARRAY(Regs, 0x80), + + SFVAR(HGS.KPollCycle), + SFVAR(HGS.RateCounter), + SFVAR(HGS.NoiseVal), + SFARRAY16(HGS.Accum, 2), + SFARRAY16(HGS.EchoAccum, 2), + SFVAR(HGS.IKON), + SFVAR(HGS.Pending_ENDX), + SFVAR(HGS.Latch_IKON), + SFVAR(HGS.Latch_KOFF), + SFVAR(HGS.Latch_PMON), + SFVAR(HGS.Latch_NON), + SFVAR(HGS.Latch_EON), + SFVAR(HGS.Latch_DIR), + SFVAR(HGS.EchoWriteDisable), + SFVAR(HGS.Latch_EDL), + SFVAR(HGS.Latch_ESA), + + SFARRAY(HGS.Latch_FIR, 8), + + SFARRAY16(HGS.EchoFIROut, 2), + + SFARRAY16(&HGS.EchoFIRBuf[0][0], sizeof(HGS.EchoFIRBuf) / sizeof(HGS.EchoFIRBuf[0][0])), + SFVAR(HGS.EchoFIRBufPos), + + SFVAR(HGS.EchoBase), + SFVAR(HGS.EchoOffset), + SFVAR(HGS.EchoBound), + + #define SFVOICE(n) \ + SFVAR(Voices[n].BRR_Addr), \ + SFVAR(Voices[n].BRR_Offs), \ + SFVAR(Voices[n].BRR_Header), \ + SFARRAY(Voices[n].BRR_Data, 2), \ + SFARRAY16(Voices[n].RB, 12 * 2), \ + SFVAR(Voices[n].RB_Pos), \ + SFVAR(Voices[n].RB_In), \ + SFVAR(Voices[n].Latch_SRCN), \ + SFVAR(Voices[n].Addr), \ + SFVAR(Voices[n].StartReload), \ + SFVAR(Voices[n].LoopReload), \ + SFVAR(Voices[n].Latch_ADSR1), \ + SFVAR(Voices[n].ADSRPhase), \ + SFVAR(Voices[n].ADSRLevel), \ + SFVAR(Voices[n].ADSRBentFastNext), \ + SFVAR(Voices[n].Pending_ENVX), \ + SFVAR(Voices[n].Pending_OUTX), \ + SFVAR(Voices[n].CurSample), \ + SFVAR(Voices[n].Pitch), \ + SFVAR(Voices[n].Phase) + + SFVOICE(0), + SFVOICE(1), + SFVOICE(2), + SFVOICE(3), + SFVOICE(4), + SFVOICE(5), + SFVOICE(6), + SFVOICE(7), + #undef SFVOICE + + SFVAR(OutputL), + + SFVAR(DSP_CycPhase), + +// SFVAR(sawthing), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "DSP"); + + if(load) + { + HGS.EchoFIRBufPos &= 0x7; + + for(unsigned n = 0; n < 8; n++) + { + Voices[n].BRR_Offs &= 0x6; + Voices[n].RB_Pos %= 12; + } + + DSP_CycPhase &= 0x1F; + #define DSPCPHS(n) { if(n == DSP_CycPhase) SPC700_IOHandler = &DSP_Cycle; } + DSPCPHS(0x00) + DSPCPHS(0x01) + DSPCPHS(0x02) + DSPCPHS(0x03) + DSPCPHS(0x04) + DSPCPHS(0x05) + DSPCPHS(0x06) + DSPCPHS(0x07) + DSPCPHS(0x08) + DSPCPHS(0x09) + DSPCPHS(0x0A) + DSPCPHS(0x0B) + DSPCPHS(0x0C) + DSPCPHS(0x0D) + DSPCPHS(0x0E) + DSPCPHS(0x0F) + DSPCPHS(0x10) + DSPCPHS(0x11) + DSPCPHS(0x12) + DSPCPHS(0x13) + DSPCPHS(0x14) + DSPCPHS(0x15) + DSPCPHS(0x16) + DSPCPHS(0x17) + DSPCPHS(0x18) + DSPCPHS(0x19) + DSPCPHS(0x1A) + DSPCPHS(0x1B) + DSPCPHS(0x1C) + DSPCPHS(0x1D) + DSPCPHS(0x1E) + DSPCPHS(0x1F) + #undef DSPCPHS + + } + + if(data_only) + { + ResampBuf[0].StateAction(sm, load, data_only, "RESBUF0", OutputBufPos); + ResampBuf[1].StateAction(sm, load, data_only, "RESBUF1", OutputBufPos); + } +} diff --git a/Mednafen/mednafen/snes_faust/input.cpp b/Mednafen/mednafen/snes_faust/input.cpp new file mode 100644 index 0000000000..e188fe1dde --- /dev/null +++ b/Mednafen/mednafen/snes_faust/input.cpp @@ -0,0 +1,319 @@ + +#include "snes.h" +#include "input.h" + +namespace MDFN_IEN_SNES_FAUST +{ + +class InputDevice +{ + public: + + InputDevice(); + virtual ~InputDevice(); + + virtual void Power(void); + + virtual void UpdatePhysicalState(const uint8* data); + + virtual uint8 Read(void); + virtual void SetLatch(bool state); +}; + +InputDevice::InputDevice() +{ + +} + +InputDevice::~InputDevice() +{ + +} + +void InputDevice::Power(void) +{ + + +} + +void InputDevice::UpdatePhysicalState(const uint8* data) +{ + + +} + +uint8 InputDevice::Read(void) +{ + return 0; +} + +void InputDevice::SetLatch(bool state) +{ + + +} + +class InputDevice_Gamepad final : public InputDevice +{ + public: + + InputDevice_Gamepad(); + virtual ~InputDevice_Gamepad(); + + virtual void Power(void); + + virtual void UpdatePhysicalState(const uint8* data); + + virtual uint8 Read(void); + virtual void SetLatch(bool state); + + private: + uint16 buttons; + uint32 latched; + + bool pls; +}; + +InputDevice_Gamepad::InputDevice_Gamepad() +{ + pls = false; + buttons = 0; +} + +InputDevice_Gamepad::~InputDevice_Gamepad() +{ + +} + +void InputDevice_Gamepad::Power(void) +{ + latched = ~0U; +} + +void InputDevice_Gamepad::UpdatePhysicalState(const uint8* data) +{ + buttons = MDFN_de16lsb(data); +} + +uint8 InputDevice_Gamepad::Read(void) +{ + uint8 ret = latched & 1; + + latched = (int32)latched >> 1; + + return ret; +} + +void InputDevice_Gamepad::SetLatch(bool state) +{ + if(pls && !state) + latched = buttons | 0xFFFF0000; + + pls = state; +} + +// +// +// +// +// +static struct +{ + InputDevice none; + InputDevice_Gamepad gamepad; +} PossibleDevices[2]; + +static InputDevice* Devices[2]; +static uint8* DeviceData[2]; +static bool JoyLS; +static uint8 JoyARData[8]; + +static DEFREAD(Read_JoyARData) +{ + CPUM.timestamp += MEMCYC_FAST; + + //printf("Read: %08x\n", A); + + return JoyARData[A & 0x7]; +} + +static DEFREAD(Read_4016) +{ + CPUM.timestamp += MEMCYC_XSLOW; + + uint8 ret = CPUM.mdr & 0xFC; + + ret |= Devices[0]->Read(); + + //printf("Read 4016: %02x\n", ret); + return ret; +} + +static DEFWRITE(Write_4016) +{ + CPUM.timestamp += MEMCYC_XSLOW; + + JoyLS = V & 1; + for(unsigned port = 0; port < 2; port++) + Devices[port]->SetLatch(JoyLS); + + //printf("Write 4016: %02x\n", V); +} + +static DEFREAD(Read_4017) +{ + CPUM.timestamp += MEMCYC_XSLOW; + uint8 ret = (CPUM.mdr & 0xE0) | 0x1C; + + ret |= Devices[1]->Read(); + + //printf("Read 4017: %02x\n", ret); + return ret; +} + +void INPUT_AutoRead(void) +{ + for(unsigned port = 0; port < 2; port++) + { + Devices[port]->SetLatch(true); + Devices[port]->SetLatch(false); + + unsigned ard[2] = { 0 }; + + for(unsigned b = 0; b < 16; b++) + { + uint8 rv = Devices[port]->Read(); + + ard[0] = (ard[0] << 1) | ((rv >> 0) & 1); + ard[1] = (ard[1] << 1) | ((rv >> 1) & 1); + } + + for(unsigned ai = 0; ai < 2; ai++) + MDFN_en16lsb(&JoyARData[port * 2 + ai * 4], ard[ai]); + } + JoyLS = false; +} + +void INPUT_Init(void) +{ + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + if(bank <= 0x3F || (bank >= 0x80 && bank <= 0xBF)) + { + Set_A_Handlers((bank << 16) | 0x4016, Read_4016, Write_4016); + Set_A_Handlers((bank << 16) | 0x4017, Read_4017, OBWrite_XSLOW); + + Set_A_Handlers((bank << 16) | 0x4218, (bank << 16) | 0x421F, Read_JoyARData, OBWrite_FAST); + } + } + + for(unsigned port = 0; port < 2; port++) + { + DeviceData[port] = NULL; + Devices[port] = &PossibleDevices[port].none; + Devices[port]->Power(); + } +} + +void INPUT_Kill(void) +{ + + +} + +void INPUT_Reset(bool powering_up) +{ + if(powering_up) + { + for(unsigned port = 0; port < 2; port++) + Devices[port]->Power(); + } + + JoyLS = false; + for(unsigned port = 0; port < 2; port++) + Devices[port]->SetLatch(JoyLS); +} + +void INPUT_Set(unsigned port, const char* type, uint8* ptr) +{ + InputDevice* nd = &PossibleDevices[port].none; + + DeviceData[port] = ptr; + + if(!strcmp(type, "gamepad")) + nd = &PossibleDevices[port].gamepad; + else if(strcmp(type, "none")) + abort(); + + if(Devices[port] != nd) + { + Devices[port] = nd; + Devices[port]->Power(); + } +} + +void INPUT_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(JoyARData, 8), + SFVAR(JoyLS), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPUT"); + + // FIXME/TODO: + //for(unsigned port = 0; port < 2; port++) + // Devices[port]->StateAction(sm, load, data_only); +} + +void INPUT_UpdatePhysicalState(void) +{ + for(unsigned port = 0; port < 2; port++) + Devices[port]->UpdatePhysicalState(DeviceData[port]); +} + +static const IDIISG GamepadIDII = +{ + { "b", "B (center, lower)", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "y", "Y (left)", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "select", "SELECT", 4, IDIT_BUTTON, NULL }, + { "start", "START", 5, IDIT_BUTTON, NULL }, + { "up", "UP ↑", 0, IDIT_BUTTON, "down" }, + { "down", "DOWN ↓", 1, IDIT_BUTTON, "up" }, + { "left", "LEFT ←", 2, IDIT_BUTTON, "right" }, + { "right", "RIGHT →", 3, IDIT_BUTTON, "left" }, + { "a", "A (right)", 9, IDIT_BUTTON_CAN_RAPID, NULL }, + { "x", "X (center, upper)", 8, IDIT_BUTTON_CAN_RAPID, NULL }, + { "l", "Left Shoulder", 10, IDIT_BUTTON, NULL }, + { "r", "Right Shoulder", 11, IDIT_BUTTON, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + // None + { + "none", + "none", + NULL, + IDII_Empty + }, + + // Gamepad + { + "gamepad", + "Gamepad", + NULL, + GamepadIDII + }, +}; + +const std::vector INPUT_PortInfo = +{ + { "port1", "Port 1", InputDeviceInfo, "gamepad" }, + { "port2", "Port 2", InputDeviceInfo, "gamepad" } +}; + +} diff --git a/Mednafen/mednafen/snes_faust/input.h b/Mednafen/mednafen/snes_faust/input.h new file mode 100644 index 0000000000..7365d35566 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/input.h @@ -0,0 +1,19 @@ +#ifndef __MDFN_SNES_FAUST_INPUT_H +#define __MDFN_SNES_FAUST_INPUT_H + +namespace MDFN_IEN_SNES_FAUST +{ + void INPUT_Init(void); + void INPUT_Kill(void); + void INPUT_Reset(bool powering_up); + void INPUT_StateAction(StateMem* sm, const unsigned load, const bool data_only); + void INPUT_Set(unsigned port, const char* type, uint8* ptr); + void INPUT_UpdatePhysicalState(void); + + + void INPUT_AutoRead(void); + + extern const std::vector INPUT_PortInfo; +} + +#endif diff --git a/Mednafen/mednafen/snes_faust/ppu.cpp b/Mednafen/mednafen/snes_faust/ppu.cpp new file mode 100644 index 0000000000..e9c55dd921 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/ppu.cpp @@ -0,0 +1,2517 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +// +// FIXME: Blank lines properly in es->surface when switching from overscan to non-overscan mode mid-frame. +// +// FIXME: Hires/pseudo-hires color math and color window are all wonky. +// +// FIXME: Add mode 6 emulation +// +// FIXME: Correct handling of lower 3 bits of BGHOFS registers. +// +// FIXME: PAL support +// +// FIXME: Interlaced support. +// +// FIXME: Handle PPU reads open bus. +// +// FIXME: VRAM mirrored or open bus? + +#include "snes.h" +#include "ppu.h" +#include "input.h" + +namespace MDFN_IEN_SNES_FAUST +{ + +static uint32 lastts; + +static uint32 LineStartTS; +static unsigned HLatch, VLatch; +static unsigned HVLatchReadShift; + + +// +// Cheaty registers and state: +static uint8 NMITIMEEN; + +static uint16 HTime; +static uint16 VTime; + +static uint8 HVBJOY; +static uint8 NMIFlag; // 0x00 or 0x80 +static uint8 IRQFlag; // 0x00 or 0x80 +static uint8 JPReadCounter; +// +// + +static bool VBlank; +static uint32 LineCounter; +static bool LinePhase; +/*static*/ uint32 scanline; + +static uint8 BusLatch[2]; +static uint8 Status[2]; // $3E and $3F. + +static uint16 VRAM[32768]; + +static uint8 ScreenMode; // $33 +static uint8 INIDisp; +static uint8 BGMode; +static uint8 Mosaic; +static uint8 MosaicYOffset; + +static uint8 BGSC[4]; + +static uint8 BGNBA[2]; + +static uint8 BGOFSPrev; +static uint16 BGHOFS[4]; +static uint16 BGVOFS[4]; + +static uint16 VRAM_Addr; +static uint16 VRAM_ReadBuffer; +static bool VMAIN_IncMode; +static unsigned VMAIN_AddrInc; +static unsigned VMAIN_AddrTransMaskA; +static unsigned VMAIN_AddrTransShiftB; +static unsigned VMAIN_AddrTransMaskC; + +static uint8 M7Prev; +static uint8 M7SEL; +static int16 M7Matrix[4]; +static int16 M7Center[2]; +static int16 M7HOFS, M7VOFS; + +static bool CGRAM_Toggle; +static uint8 CGRAM_Buffer; +static uint8 CGRAM_Addr; +static uint16 CGRAM[256]; + +static uint8 MSEnable; +static uint8 SSEnable; + +static uint8 WMSettings[3]; +static uint8 WMMainEnable, WMSubEnable; +static uint16 WMLogic; +static uint8 WindowPos[2][2]; +static unsigned WindowPieces[5]; // Derived data, calculated at start of rendering for a scanline. + +static uint8 CGWSEL; +static uint8 CGADSUB; +static uint16 FixedColor; + +static uint8 OBSEL; +static uint8 OAMADDL, OAMADDH; +static uint8 OAM_Buffer; +static uint32 OAM_Addr; +static uint8 OAM[512]; +static uint8 OAMHI[32]; + +static DEFWRITE(Write_ScreenMode) +{ + CPUM.timestamp += MEMCYC_FAST; + // + ScreenMode = V; +} + +static DEFWRITE(Write_2100) +{ + CPUM.timestamp += MEMCYC_FAST; + + if((INIDisp ^ V) & 0x80 & ~V) + OAM_Addr = (OAMADDL | ((OAMADDH & 0x1) << 8)) << 1; + + INIDisp = V; + + //printf("INIDisp = %02x --- scanline=%u\n", V, scanline); +} + +static DEFWRITE(Write_OBSEL) +{ + CPUM.timestamp += MEMCYC_FAST; + // + OBSEL = V; +} + +static DEFWRITE(Write_OAMADDL) +{ + CPUM.timestamp += MEMCYC_FAST; + // + OAMADDL = V; + OAM_Addr = (OAMADDL | ((OAMADDH & 0x1) << 8)) << 1; +} + +static DEFWRITE(Write_OAMADDH) +{ + CPUM.timestamp += MEMCYC_FAST; + // + OAMADDH = V; + OAM_Addr = (OAMADDL | ((OAMADDH & 0x1) << 8)) << 1; +} + +static DEFWRITE(Write_OAMDATA) +{ + CPUM.timestamp += MEMCYC_FAST; + + //fprintf(stderr, "OAMDATA Write: 0x%04x 0x%02x\n", OAM_Addr, V); + // + if(OAM_Addr & 0x200) + OAMHI[OAM_Addr & 0x1F] = V; + else if(OAM_Addr & 1) + { + (OAM - 1)[OAM_Addr] = OAM_Buffer; + (OAM + 0)[OAM_Addr] = V; + } + + if(!(OAM_Addr & 1)) + OAM_Buffer = V; + + OAM_Addr = (OAM_Addr + 1) & 0x3FF; +} + +static DEFREAD(Read_OAMDATAREAD) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret; + + if(OAM_Addr & 0x200) + ret = OAMHI[OAM_Addr & 0x1F]; + else + ret = OAM[OAM_Addr]; + + OAM_Addr = (OAM_Addr + 1) & 0x3FF; + + return ret; +} + +static union +{ + struct + { + int16 x; + uint8 y_offset; + uint8 tilebase; + uint8 paloffs; + uint8 prio; + uint8 w; + uint8 h; + uint8 hfxor; + bool n; + } SpriteList[32]; + + uint32 objbuf[8 + 256 + 8]; +}; + +static struct +{ + uint64 td; // 4bpp->8bpp, |'d with palette offset + 128; 8-bits * 8 + int32 x; + uint32 prio_or; +} SpriteTileList[34]; +unsigned SpriteTileCount; + +static const struct +{ + uint8 w; + uint8 h; +} Sprite_WHTab[8][2] = +{ + { { 8, 8 }, { 16, 16 } }, + { { 8, 8 }, { 32, 32 } }, + { { 8, 8 }, { 64, 64 } }, + + { { 16, 16 }, { 32, 32 } }, + { { 16, 16 }, { 64, 64 } }, + + { { 32, 32 }, { 64, 64 } }, + + { { 16, 32 }, { 32, 64 } }, + { { 16, 32 }, { 32, 32 } }, +}; + +static void FetchSpriteData(signed line_y) +{ + unsigned SpriteIndex = 0; + unsigned SpriteCount = 0; + uint8 whtab[2][2]; + + if(INIDisp & 0x80) + { + SpriteTileCount = 0; + return; + } + + if(OAMADDH & 0x80) + { + if((OAM_Addr & 0x3) == 0x3) + SpriteIndex = ((OAM_Addr >> 2) + line_y) & 0x7F; + else + SpriteIndex = (OAM_Addr >> 2) & 0x7F; + } + + { + const auto* tp = Sprite_WHTab[(OBSEL >> 5) & 0x7]; + + for(unsigned i = 0; i < 2; i++) + { + whtab[i][0] = tp[i].w; + whtab[i][1] = tp[i].h; + } + } + + for(unsigned i = 0; i < 128; i++, SpriteIndex = (SpriteIndex + 1) & 0x7F) + { + const uint8* const oa = &OAM[SpriteIndex << 2]; + const uint8 hob = OAMHI[SpriteIndex >> 2] >> ((SpriteIndex & 0x3) << 1); + const bool sizebit = hob & 0x2; + signed x = sign_x_to_s32(9, oa[0] | ((hob & 1) << 8)); + uint8 y_offset = line_y - oa[1]; + uint8 w = whtab[sizebit][0]; + uint8 h = whtab[sizebit][1]; + + if(y_offset >= h) + continue; + + //printf("Line %d, Sprite: %d:%d, %d:%d\n", line_y, x, y_offset, w, h); + + if(x <= -w) // fixme: x == -256 special case + continue; + + if(SpriteCount == 32) + { + //printf("Sprite count over on %u\n", line_y); + Status[0] |= 0x40; + break; + } + + // + // + // + auto* l = &SpriteList[SpriteCount]; + + if(oa[3] & 0x80) + y_offset ^= (h - 1) & ~w; + + l->x = x; + l->y_offset = y_offset; + l->tilebase = oa[2]; + l->paloffs = 0x80 + ((oa[3] & 0xE) << 3); + l->prio = (oa[3] >> 4) & 0x3; + l->w = w; + l->h = h; + l->hfxor = (oa[3] & 0x40) ? (w - 1) : 0; + l->n = oa[3] & 0x01; + SpriteCount++; + } + + uint16* chrbase[2]; + + for(unsigned i = 0; i < 2; i++) + { + unsigned offs = ((OBSEL & 0x7) << 13); + + if(i) + offs += ((OBSEL & 0x18) + 0x8) << 9; + + chrbase[i] = &VRAM[offs & 0x7000]; + } + + SpriteTileCount = 0; + for(int i = SpriteCount - 1; i >= 0; i--) + { + const auto* const l = &SpriteList[i]; + + for(int ht = 0; ht < (l->w >> 3); ht++) + { + int xo = l->x + (ht << 3); + + if(xo <= -8 || xo >= 256) //rof > (255 + 7)) + continue; + + if(SpriteTileCount == 34) + { + //printf("Sprite tile overflow on %u\n", line_y); + Status[0] |= 0x80; + goto ExitTileLoop; + } + auto* const t = &SpriteTileList[SpriteTileCount++]; + + t->x = xo; + t->prio_or = (l->prio + 1) * 0x3030 | ((l->paloffs & 0x40) >> 6) | 2; + + uint8 wt; + + unsigned rof = ((ht << 3) ^ l->hfxor) >> 3; + + wt = ((l->tilebase & 0xF0) + (l->y_offset << 1)) & 0xF0; + wt |= (l->tilebase + rof) & 0x0F; + + uint16* chr = chrbase[l->n] + (wt << 4) + (l->y_offset & 0x7); + + uint32 bp = chr[0] | (chr[8] << 16); + for(unsigned x = 0; x < 8; x++) + { + uint32 pix; + + pix = ((bp >> 7) & 0x01); + pix |= ((bp >> 14) & 0x02); + pix |= ((bp >> 21) & 0x04); + pix |= ((bp >> 28) & 0x08); + + if(!l->hfxor) + { + t->td >>= 8; + t->td |= (uint64)(pix | l->paloffs) << 56; + } + else + { + t->td <<= 8; + t->td |= pix | l->paloffs; + } + bp <<= 1; + } + } + } + ExitTileLoop: ; +} + +static void DrawSprites(void) +{ + unsigned prio_or_mask = 0xFFFF; + + memset(objbuf + 8, 0, sizeof(objbuf[0]) * 256); + + if(!(CGADSUB & 0x10)) + prio_or_mask &= ~0x0001; + + if(!(SSEnable & 0x10)) + prio_or_mask &= ~0xF000; + + if(!(MSEnable & 0x10)) + prio_or_mask &= ~0x00F0; + + for(unsigned i = 0; i < SpriteTileCount; i++) + { + auto* const t = &SpriteTileList[i]; + uint64 td = t->td; + uint32* tb = objbuf + 8 + t->x; + uint32 prio_or = t->prio_or & prio_or_mask; + + for(unsigned x = 0; x < 8; x++) + { + if(td & 0xF) + { + tb[x] = (CGRAM[(uint8)td] << 16) | prio_or; + } + td >>= 8; + } + } + + SpriteTileCount = 0; +} + + +static DEFWRITE(Write_2105) +{ + CPUM.timestamp += MEMCYC_FAST; + + BGMode = V; +} + +static DEFWRITE(Write_2106) +{ + CPUM.timestamp += MEMCYC_FAST; + + if((Mosaic ^ V) & 0xF0) + MosaicYOffset = 0; + + Mosaic = V; +} + +static DEFWRITE(Write_BGSC) +{ + CPUM.timestamp += MEMCYC_FAST; + // + (BGSC - 0x07)[(uint8)A] = V; +} + +static DEFWRITE(Write_BGNBA) +{ + CPUM.timestamp += MEMCYC_FAST; + // + (BGNBA - 0x0B)[(uint8)A] = V; +} + +template +static DEFWRITE(Write_BGHOFS) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint16* const t = &(BGHOFS - (0x0D >> 1))[(uint8)A >> 1]; + *t = BGOFSPrev | ((V & 0x3) << 8); + BGOFSPrev = V; + + if(bg0) + { + M7HOFS = sign_13_to_s16(M7Prev | ((V & 0x1F) << 8)); + M7Prev = V; + } +} + +template +static DEFWRITE(Write_BGVOFS) +{ + CPUM.timestamp += MEMCYC_FAST; + + // + (BGVOFS - (0x0E >> 1))[(uint8)A >> 1] = BGOFSPrev | ((V & 0x3) << 8); + BGOFSPrev = V; + + if(bg0) + { + M7VOFS = sign_13_to_s16(M7Prev | ((V & 0x1F) << 8)); + M7Prev = V; + } +} + +static uint16 GetVAddr(void) +{ + return (VRAM_Addr & VMAIN_AddrTransMaskA) | ((VRAM_Addr >> VMAIN_AddrTransShiftB) & 0x7) | ((VRAM_Addr << 3) & VMAIN_AddrTransMaskC); +} + +static DEFWRITE(Write_2115) +{ + static const uint8 inctab[4] = { 1, 32, 128, 128 }; + static const uint32 ttab[4][3] = + { + { 0x7FFF, 0, 0 }, + { 0x7F00, 5, 0x0F8 }, + { 0x7E00, 6, 0x1F8 }, + { 0x7C00, 7, 0x3F8 }, + }; + CPUM.timestamp += MEMCYC_FAST; + + + VMAIN_IncMode = V & 0x80; + VMAIN_AddrInc = inctab[V & 0x3]; + + VMAIN_AddrTransMaskA = ttab[(V >> 2) & 0x3][0]; + VMAIN_AddrTransShiftB = ttab[(V >> 2) & 0x3][1]; + VMAIN_AddrTransMaskC = ttab[(V >> 2) & 0x3][2]; +} + +static DEFWRITE(Write_2116) +{ + CPUM.timestamp += MEMCYC_FAST; + + VRAM_Addr &= 0xFF00; + VRAM_Addr |= V << 0; + + VRAM_ReadBuffer = VRAM[GetVAddr()]; +} + +static DEFWRITE(Write_2117) +{ + CPUM.timestamp += MEMCYC_FAST; + + VRAM_Addr &= 0x00FF; + VRAM_Addr |= V << 8; + + VRAM_ReadBuffer = VRAM[GetVAddr()]; +} + +static DEFWRITE(Write_2118) +{ + CPUM.timestamp += MEMCYC_FAST; + // + const unsigned va = GetVAddr(); + + //if(va >= 0x2000 && va < 0x3000) + // fprintf(stderr, "Low: %04x %04x, %02x\n", va, VRAM_Addr, V); + + VRAM[va] &= 0xFF00; + VRAM[va] |= V << 0; + + if(!VMAIN_IncMode) + VRAM_Addr += VMAIN_AddrInc; +} + +static DEFWRITE(Write_2119) +{ + CPUM.timestamp += MEMCYC_FAST; + // + const unsigned va = GetVAddr(); + + //if(va >= 0x2000 && va < 0x3000) + // fprintf(stderr, "High: %04x %04x, %02x\n", va, VRAM_Addr, V); + + VRAM[va] &= 0x00FF; + VRAM[va] |= V << 8; + + if(VMAIN_IncMode) + VRAM_Addr += VMAIN_AddrInc; +} + +static DEFREAD(Read_2139) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = VRAM_ReadBuffer; + + if(!VMAIN_IncMode) + { + VRAM_ReadBuffer = VRAM[GetVAddr()]; + VRAM_Addr += VMAIN_AddrInc; + } + + return ret; +} + +static DEFREAD(Read_213A) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = VRAM_ReadBuffer >> 8; + + if(VMAIN_IncMode) + { + VRAM_ReadBuffer = VRAM[GetVAddr()]; + VRAM_Addr += VMAIN_AddrInc; + } + + return ret; +} + +static DEFWRITE(Write_211A) +{ + CPUM.timestamp += MEMCYC_FAST; + // + + M7SEL = V & 0xC3; +} + +static DEFWRITE(Write_M7Matrix) // $1b-$1e +{ + CPUM.timestamp += MEMCYC_FAST; + // + (M7Matrix - 0x1B)[(uint8)A] = M7Prev | (V << 8); + M7Prev = V; +} + +template +static DEFREAD(Read_M7Multiplier) +{ + CPUM.timestamp += MEMCYC_FAST; + // + + uint32 result = (int16)M7Matrix[0] * (int8)(M7Matrix[1] >> 8); + return result >> shift; +} + +static DEFWRITE(Write_M7Center) +{ + CPUM.timestamp += MEMCYC_FAST; + // + + (M7Center - 0x1F)[(uint8)A] = sign_13_to_s16(M7Prev | ((V & 0x1F) << 8)); + M7Prev = V; +} + +static DEFWRITE(Write_CGADD) +{ + CPUM.timestamp += MEMCYC_FAST; + // + CGRAM_Addr = V; + CGRAM_Toggle = false; +} + +static DEFWRITE(Write_CGDATA) +{ + CPUM.timestamp += MEMCYC_FAST; + + // + if(CGRAM_Toggle) + { + CGRAM[CGRAM_Addr] = ((V & 0x7F) << 8) | CGRAM_Buffer; + CGRAM_Addr++; + } + else + CGRAM_Buffer = V; + + CGRAM_Toggle = !CGRAM_Toggle; +} + +static DEFREAD(Read_CGDATAREAD) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret; + + if(CGRAM_Toggle) + { + ret = CGRAM[CGRAM_Addr] >> 8; + CGRAM_Addr++; + } + else + ret = CGRAM[CGRAM_Addr] >> 0; + + CGRAM_Toggle = !CGRAM_Toggle; + + return ret; +} + +static DEFWRITE(Write_MSEnable) +{ + CPUM.timestamp += MEMCYC_FAST; + // + MSEnable = V & 0x1F; +} + +static DEFWRITE(Write_SSEnable) +{ + CPUM.timestamp += MEMCYC_FAST; + // + SSEnable = V & 0x1F; +} + +static DEFWRITE(Write_WMMainEnable) +{ + CPUM.timestamp += MEMCYC_FAST; + // + WMMainEnable = V; +} + +static DEFWRITE(Write_WMSubEnable) +{ + CPUM.timestamp += MEMCYC_FAST; + // + WMSubEnable = V; +} + +template +static DEFWRITE(Write_WMLogic) +{ + CPUM.timestamp += MEMCYC_FAST; + // + if(msb) + WMLogic = (WMLogic & 0x00FF) | ((V & 0xF) << 8); + else + WMLogic = (WMLogic & 0xFF00) | (V << 0); +} + +static DEFWRITE(Write_WMSettings) +{ + CPUM.timestamp += MEMCYC_FAST; + // + (WMSettings - 0x23)[(uint8)A] = V; +} + + +static DEFWRITE(Write_WindowPos) // $26-$29 +{ + CPUM.timestamp += MEMCYC_FAST; + // + + ((uint8*)WindowPos - 0x26)[(uint8)A] = V; + + //printf("%04x %02x\n", A, V); +} + + +static DEFWRITE(Write_CGWSEL) +{ + CPUM.timestamp += MEMCYC_FAST; + // + CGWSEL = V; +} + +static DEFWRITE(Write_CGADSUB) +{ + CPUM.timestamp += MEMCYC_FAST; + // + CGADSUB = V; +} + +static DEFWRITE(Write_COLDATA) +{ + CPUM.timestamp += MEMCYC_FAST; + // + unsigned cc = V & 0x1F; + + if(V & 0x20) + FixedColor = (FixedColor &~ (0x1F << 0)) | (cc << 0); + + if(V & 0x40) + FixedColor = (FixedColor &~ (0x1F << 5)) | (cc << 5); + + if(V & 0x80) + FixedColor = (FixedColor &~ (0x1F << 10)) | (cc << 10); +} + +static DEFREAD(Read_HVLatchTrigger) +{ + CPUM.timestamp += MEMCYC_FAST; + // + + //printf("Read HVLatchTrigger\n"); + + if(1) + { + // Maximum horribleness. + //PPU_Update(CPUM.timestamp); + + HLatch = (CPUM.timestamp - LineStartTS) >> 2; + VLatch = scanline; + + if(HLatch >= 340) + { + if(HLatch == 340) + HLatch = 339; + else + { + HLatch -= 341; + VLatch = (VLatch + 1) % 262; // FIXME + } + } + + //printf("VL: %d, HL: %d\n", VLatch, HLatch); + + Status[1] |= 0x40; + } + + return 0; // FIXME: open bus +} + +static DEFREAD(Read_HLatch) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = HLatch >> HVLatchReadShift; // FIXME: open bus + + HVLatchReadShift ^= 8; + + return ret; +} + +static DEFREAD(Read_VLatch) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = VLatch >> HVLatchReadShift; // FIXME: open bus + + HVLatchReadShift ^= 8; + + return ret; +} + +static DEFREAD(Read_Status0) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = Status[0]; + + return ret; +} + +static DEFREAD(Read_Status1) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = Status[1]; + + if(1) + Status[1] &= ~0x40; + + HVLatchReadShift = 0; + + return ret; +} + +// +// +// +// +// +// +// +static EmulateSpecStruct* es; + +static struct +{ + uint32 OutputLUT[384]; + union + { + uint32 bg[4][8 + 256 + 16]; // 8(x scroll), 16(tile overflow, mosaic) + uint32 bghr[2][16 + 512 + 32]; // BG modes 5 and 6 + + struct + { + uint32 main[256]; + uint32 dummy[8 + 16 + (8 + 256 + 16)]; + uint32 sub[256]; + }; + }; +} linebuf; + +static_assert(linebuf.main == linebuf.bg[0] && linebuf.main == linebuf.bghr[0] && + linebuf.sub == linebuf.bg[2] && linebuf.sub == linebuf.bghr[1], "linebuf structure malformed."); + + +void PPU_StartFrame(EmulateSpecStruct* espec) +{ + es = espec; + + es->DisplayRect.x = 0; + es->DisplayRect.y = 0; + es->DisplayRect.w = 256; + es->DisplayRect.h = 224; + + if(es->VideoFormatChanged) + { + const auto& f = es->surface->format; + + for(int rc = 0; rc < 0x8000; rc++) + { + const uint8 a = rc; + const uint8 b = rc >> 8; + + (linebuf.OutputLUT + 0)[a] = ((a & 0x1F) << (3 + f.Rshift)) | ((a >> 5) << (3 + f.Gshift)); + (linebuf.OutputLUT + 256)[b] = ((b & 0x3) << (6 + f.Gshift)) | (((b >> 2) & 0x1F) << (3 + f.Bshift)); + } + } +} + +template +static void GetOPTStrip(const unsigned n) +{ + unsigned VOFS = BGVOFS[n]; + unsigned HOFS = BGHOFS[n]; + unsigned tm_w_mask = ((BGSC[n] & 0x1) << 10); + unsigned tm_h_shift = ((BGSC[n] & 0x2) ? ((BGSC[n] & 0x1) ? 3 : 2) : 24); + + uint32 tmbase = (BGSC[n] & 0xFC) << 8; + uint32 tmoffs; + uint32 tmxor; + bool tile_num_offs = false; + + if(size16) + { + tile_num_offs = (HOFS & 0x8); + HOFS >>= 1; + VOFS >>= 1; + } + + tmoffs = (HOFS >> 3) & 0x1F; + tmoffs += (HOFS << 2) & tm_w_mask; + tmoffs += ((VOFS << 2) & 0x3E0) | ((VOFS & 0x100) << tm_h_shift); + + { + unsigned VOFS_Next = BGVOFS[n] + 8; + unsigned tmoffs_next; + + if(size16) + VOFS_Next >>= 1; + + tmoffs_next = (HOFS >> 3) & 0x1F; + tmoffs_next += (HOFS << 2) & tm_w_mask; + tmoffs_next += ((VOFS_Next << 2) & 0x3E0) | ((VOFS_Next & 0x100) << tm_h_shift); + + tmxor = tmoffs ^ tmoffs_next; + } + + for(unsigned i = 0; i < 33; i++) + { + uint32 tmp = VRAM[(tmbase + tmoffs) & 0x7FFF]; + + if(mode4) + { + tmp <<= (tmp & 0x8000) >> 11; + } + else + { + tmp |= (VRAM[(tmbase + (tmoffs ^ tmxor)) & 0x7FFF] << 16); + } + linebuf.bg[2][i] = tmp; + + if(!size16 || tile_num_offs) + { + tmoffs++; + + if(!(tmoffs & 0x1F)) + { + tmoffs -= 0x20; + tmoffs ^= tm_w_mask; + } + } + + if(size16) + tile_num_offs = !tile_num_offs; + } +} + +static INLINE unsigned DirColCvt(unsigned inpix, unsigned palbase = 0) +{ + unsigned ret; + + ret = ((inpix & 0x07) << 2); + ret |= ((inpix & 0x38) << 4); + ret |= ((inpix & 0xC0) << 7); + + ret |= (palbase & 0x8) << 9; + ret |= (palbase & 0x4) << 4; + ret |= (palbase & 0x1) << 1; + + return ret; +} + +template +static void DrawBG(const unsigned n, const unsigned y, uint32 prio_or) +{ + unsigned VOFS = BGVOFS[n] + (y - ((Mosaic & (1U << n)) ? MosaicYOffset : 0)); + unsigned HOFS = BGHOFS[n]; + unsigned tm_w_mask = ((BGSC[n] & 0x1) << 10); + unsigned tm_h_shift = ((BGSC[n] & 0x2) ? ((BGSC[n] & 0x1) ? 3 : 2) : 24); + unsigned tile_y_offs = (VOFS & 0x7); + + //if(scanline == 100 && n == 0) + // MDFN_DispMessage("%d %d --- BGHOFS0=%u BGHOFS1=%u\n", hires, size16, BGHOFS[0], BGHOFS[1]); + + if(hires) + HOFS <<= 1; + + uint32* target; + + if(hires) + target = &linebuf.bghr[n][8]; + else + target = &linebuf.bg[n][8]; + + target -= HOFS & 0x7; + + //printf("%02x %04x\n", BGSC[n], BGVOFS[n]); + + uint32 chrbase = ((BGNBA[n >> 1] >> ((n & 1) * 4)) & 0xF) << 12; + uint32 tmbase = (BGSC[n] & 0xFC) << 8; + uint32 tmoffs; + uint32 tile_num_offs = 0; + + if(hires || size16) + { + tile_num_offs |= ((HOFS & 0x8) >> 3); + HOFS >>= 1; + } + + if(size16) + { + tile_num_offs |= ((VOFS & 0x8) << 1); + VOFS >>= 1; + } + + tmoffs = (HOFS >> 3) & 0x1F; + tmoffs += (HOFS << 2) & tm_w_mask; + tmoffs += ((VOFS << 2) & 0x3E0) | ((VOFS & 0x100) << tm_h_shift); + + for(unsigned i = 0; i < ((hires ? 64 : 32) + 1); i++) + { + const uint32 nte = VRAM[(tmbase + tmoffs) & 0x7FFF]; + const uint32 v_flip_xor = ((int16)nte >> 16) & 0x7; + const bool h_flip = nte & 0x4000; + const uint32 eff_prio_or = ((nte & 0x2000) ? (prio_or >> 16) : (prio_or >> 0)) & 0xFFFF; + const uint32 pal_base = ((nte & 0x1C00) >> 10); + uint32 tno_flipped = 0; + uint32 tile_num; + + if(size16 || hires) + tno_flipped = tile_num_offs ^ h_flip; + + if(size16) + tno_flipped ^= (v_flip_xor << 2) & 0x10; + + tile_num = (nte + tno_flipped) & 0x3FF; + + //printf("%3d, %3d, %04x, %04x --- %04x\n", y, i, tmbase, (tmbase + tmoffs) & 0x7FFF, nte); + + const uint16* const vchr = &VRAM[(chrbase + (tile_y_offs ^ v_flip_xor) + (tile_num * (bpp / 2) * 8) + 0) & 0x7FFF]; + const uint16* const cgr = CGRAM + (bpp == 8 ? 0 : ((pal_base << bpp) + (palbase_n ? (n << 5) : 0))); + uint64 bp; + + bp = vchr[0]; + + if(bpp >= 4) + { + bp |= (uint32)vchr[8] << 16; + + if(bpp >= 8) + { + bp |= (uint64)vchr[16] << 32; + bp |= (uint64)vchr[24] << 48; + } + } + + for(unsigned sub = 0; sub < 8; sub++) + { + unsigned pix; + + pix = ((bp >> 7) & 0x01); + pix |= ((bp >> 14) & 0x02); + + if(bpp >= 4) + { + pix |= ((bp >> 21) & 0x04); + pix |= ((bp >> 28) & 0x08); + + if(bpp >= 8) + { + pix |= ((bp >> 35) & 0x10); + pix |= ((bp >> 42) & 0x20); + pix |= ((bp >> 49) & 0x40); + pix |= ((bp >> 56) & 0x80); + } + } + + //if(hires) pix ^= rand() & 0xFF; + + target[sub ^ (h_flip ? 7 : 0)] = ((dircolor ? DirColCvt(pix, pal_base) : cgr[pix]) << 16) | (pix ? eff_prio_or : 0); + bp <<= 1; + } + + if(!(size16 || hires) || (tile_num_offs & 1)) + { + tmoffs++; + + if(!(tmoffs & 0x1F)) + { + tmoffs -= 0x20; + tmoffs ^= tm_w_mask; + } + } + + if(size16 || hires) + tile_num_offs ^= 1; + + if(opt) + { + unsigned hvo = linebuf.bg[2][i]; + + HOFS = BGHOFS[n]; + if(hvo & (0x2000 << n)) + { + HOFS = (uint16)hvo; + } + + if(hires) + HOFS <<= 1; + + HOFS += ((i + 1) << 3); + + VOFS = BGVOFS[n]; + + if(hvo & (0x20000000 << n)) + VOFS = (uint16)(hvo >> 16); + VOFS += (y - ((Mosaic & (1U << n)) ? MosaicYOffset : 0)); + + tile_y_offs = (VOFS & 0x7); + + tile_num_offs = 0; + + if(hires || size16) + { + tile_num_offs |= ((HOFS & 0x8) >> 3); + HOFS >>= 1; + } + + if(size16) + { + tile_num_offs |= ((VOFS & 0x8) << 1); + VOFS >>= 1; + } + tmoffs = (HOFS >> 3) & 0x1F; + tmoffs += (HOFS << 2) & tm_w_mask; + tmoffs += ((VOFS << 2) & 0x3E0) | ((VOFS & 0x100) << tm_h_shift); + } + + target += 8; + } +} + +static int16 funny(int16 val) +{ + int16 ret = val & 0x3FF; + + if(val & 0x2000) + ret |= ~0x3FF; + + return ret; +} + +static int M7Mul(int16 matval, int16 ov) +{ + return (matval * ov) &~ 0x3F; +} + +// Mode 7, scary cake time! +template +static void DrawMODE7(unsigned line_y, uint16 prio_or, uint32 prio_or_bg1 = 0) +{ + const bool h_flip = M7SEL & 0x01; + const bool v_flip = M7SEL & 0x02; + const bool size = M7SEL & 0x80; + const bool empty_fill = M7SEL & 0x40; + + unsigned x, y; + unsigned xinc, yinc; + + line_y -= ((Mosaic & 0x1) ? MosaicYOffset : 0); + + if(v_flip) + line_y ^= 0xFF; + + int16 hoca = funny(M7HOFS - M7Center[0]); + int16 voca = funny(M7VOFS - M7Center[1]); + + x = M7Mul(M7Matrix[0], hoca) + M7Mul(M7Matrix[1], line_y) + M7Mul(M7Matrix[1], voca) + (M7Center[0] << 8); + y = M7Mul(M7Matrix[2], hoca) + M7Mul(M7Matrix[3], line_y) + M7Mul(M7Matrix[3], voca) + (M7Center[1] << 8); + + xinc = M7Matrix[0]; + yinc = M7Matrix[2]; + + if(h_flip) + { + x += 255 * xinc; + y += 255 * yinc; + + xinc = -xinc; + yinc = -yinc; + } + + for(unsigned i = 0; i < 256; i++) + { + unsigned pix; + unsigned xi = x >> 8; + unsigned yi = y >> 8; + uint8 tilenum, tiledata; + + tilenum = VRAM[(((yi & 0x3FF) >> 3) << 7) | ((xi & 0x3FF) >> 3)]; + tiledata = VRAM[(tilenum << 6) + ((yi & 0x7) << 3) + (xi & 0x7)] >> 8; + + if(size && ((xi | yi) &~ 0x3FF)) + { + tiledata = 0; + if(empty_fill) + tiledata = VRAM[((yi & 0x7) << 3) + (xi & 0x7)] >> 8; + } + + pix = tiledata; + + (linebuf.bg[0] + 8)[i] = ((dircolor ? DirColCvt(pix) : CGRAM[pix]) << 16) | (pix ? prio_or : 0); + if(extbg) + (linebuf.bg[1] + 8)[i] = ((dircolor ? DirColCvt(pix & 0x7F) : CGRAM[pix & 0x7F]) << 16) | ((pix & 0x7F) ? (uint16)(prio_or_bg1 >> ((pix & 0x80) >> 3)) : 0); + + x += xinc; + y += yinc; + } +} + + +// Y mosaic is handled in DrawBG +#pragma GCC push_options +#pragma GCC optimize("no-unroll-loops,no-peel-loops,no-crossjumping") +template +static void NO_INLINE DoXMosaic(unsigned layernum, uint32* __restrict__ buf) +{ + if(!(Mosaic & (1U << layernum))) + return; + + if(!hires && !(Mosaic & 0xF0)) + return; + + if(hires) + { + const unsigned sub_max = Mosaic >> 4; + + for(unsigned x = 0; x < 512;) + { + uint32 b = buf[x]; + for(int sub = sub_max; sub >= 0; sub--, x += 2) + { + buf[x + 0] = b; + buf[x + 1] = b; + } + } + } + else switch(Mosaic >> 4) + { + case 0x1: for(unsigned x = 0; x < 256; x += 0x2) { uint32 b = buf[x]; buf[x + 1] = b; } break; + case 0x2: for(unsigned x = 0; x < 256; x += 0x3) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; } break; + case 0x3: for(unsigned x = 0; x < 256; x += 0x4) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; } break; + case 0x4: for(unsigned x = 0; x < 256; x += 0x5) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; } break; + case 0x5: for(unsigned x = 0; x < 256; x += 0x6) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; } break; + case 0x6: for(unsigned x = 0; x < 256; x += 0x7) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; } break; + case 0x7: for(unsigned x = 0; x < 256; x += 0x8) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; } break; + case 0x8: for(unsigned x = 0; x < 256; x += 0x9) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; } break; + case 0x9: for(unsigned x = 0; x < 256; x += 0xA) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; } break; + case 0xA: for(unsigned x = 0; x < 256; x += 0xB) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; } break; + case 0xB: for(unsigned x = 0; x < 256; x += 0xC) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; } break; + case 0xC: for(unsigned x = 0; x < 256; x += 0xD) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; } break; + case 0xD: for(unsigned x = 0; x < 256; x += 0xE) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; buf[x + 13] = b; } break; + case 0xE: for(unsigned x = 0; x < 256; x += 0xF) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; buf[x + 13] = b; buf[x + 14] = b; } break; + case 0xF: for(unsigned x = 0; x < 256; x += 0x10) { uint32 b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; buf[x + 13] = b; buf[x + 14] = b; buf[x + 15] = b;} break; + } +} +#pragma GCC pop_options + +static INLINE void CalcWindowPieces(void) +{ + WindowPieces[0] = WindowPos[0][0]; + WindowPieces[1] = WindowPos[0][1] + 1; + + if(WindowPieces[0] > WindowPieces[1]) + WindowPieces[0] = WindowPieces[1] = 0; + + WindowPieces[2] = WindowPos[1][0]; + WindowPieces[3] = WindowPos[1][1] + 1; + + if(WindowPieces[2] > WindowPieces[3]) + WindowPieces[2] = WindowPieces[3] = 0; + + if(WindowPieces[0] > WindowPieces[2]) + std::swap(WindowPieces[0], WindowPieces[2]); + + if(WindowPieces[1] > WindowPieces[3]) + std::swap(WindowPieces[1], WindowPieces[3]); + + if(WindowPieces[1] > WindowPieces[2]) + std::swap(WindowPieces[1], WindowPieces[2]); + + WindowPieces[4] = 0x100; +} + +template +static void DoWindow(unsigned layernum, uint32* __restrict__ buf) +{ + const unsigned mask_settings = (WMSettings[layernum >> 1] >> ((layernum & 1) << 2)) & 0xF; + const unsigned mask_logic = (WMLogic >> (layernum * 2)) & 0x3; + uint32 masker[2]; // out, in + bool W0Enabled, W1Enabled; + bool W0Invert, W1Invert; + + static_assert(!cwin || !hires, "DoWindow() template arg error."); + + //if(mask_settings) + // printf("Layer: %u, mask_settings = 0x%02x\n", layernum, mask_settings); + + // mask_settings + // d0 = window1 inversion + // d1 = window1 enable + // d2 = window2 inversion + // d3 = window2 enable + + W0Invert = mask_settings & 0x01; + W0Enabled = mask_settings & 0x02; + + W1Invert = mask_settings & 0x04; + W1Enabled = mask_settings & 0x08; + + if(!W0Enabled && !W1Enabled && !cwin) + return; + + masker[0] = ~0U; + masker[1] = ~0U; + + if(cwin) + { + assert(layernum == 5); + + //puts("Color Window"); + + // ~1, not ~3 (otherwise will break half-color math testing stuff). + switch((CGWSEL >> 4) & 0x3) + { + case 0: break; + case 1: masker[0] &= ~1; break; + case 2: masker[1] &= ~1; break; + case 3: masker[0] &= ~1; masker[1] &= ~1; break; + } + + switch((CGWSEL >> 6) & 0x3) + { + case 0: break; + case 1: masker[0] &= 9; break; + case 2: masker[1] &= 9; break; + case 3: masker[0] &= 9; masker[1] &= 9; break; + } + + if(!masker[0]) + { + SNES_DBG("[PPU] Color Window Masker 0 == 0?!\n"); + //masker[0] = ~0U; + } + + if(!masker[1]) + { + SNES_DBG("[PPU] Color Window Masker 1 == 0?!\n"); + //masker[1] = ~0U; + } + } + else + { + if(WMMainEnable & (1U << layernum)) + { + masker[1] &= ~0x00FF; + } + + if(WMSubEnable & (1U << layernum)) + { + masker[1] &= ~0xFF00; + } + + if(!((WMMainEnable | WMSubEnable) & (1U << layernum))) + return; + } + +#if 0 + if(scanline == 100 || scanline == 140 || scanline == 50) + { + printf("Scanline=%3u, Layer %u window: masker[0]=0x%08x, masker[1]=0x%08x, W0Enabled=%d, W1Enabled=%d, W0Invert=%d, W1Invert=%d, mask_logic=0x%02x, Window0 %u...%u, Window1 %u...%u --- CGWSEL=0x%02x, CGADSUB=0x%02x, MSEnable=0x%02x, SSEnable=0x%02x, BGMode=0x%02x, WMMainEnable=0x%02x, WMSubEnable=0x%02x, WMSettings=0x%02x 0x%02x 0x%02x\n", + scanline, + layernum, + masker[0], masker[1], + W0Enabled, W1Enabled, + W0Invert, W1Invert, + mask_logic, + WindowPos[0][0], WindowPos[0][1], + WindowPos[1][0], WindowPos[1][1], + CGWSEL, + CGADSUB, + MSEnable, + SSEnable, + BGMode, + WMMainEnable, + WMSubEnable, + WMSettings[0], + WMSettings[1], + WMSettings[2]); + } +#endif + +#if 0 + if(cwin && scanline == 100) + { + printf("Color window: masker[0]=0x%08x, masker[1]=0x%08x, W0Enabled=%d, W1Enabled=%d, W0Invert=%d, W1Invert=%d, mask_logic=0x%02x, Window0 %u...%u, Window1 %u...%u\n", masker[0], masker[1], + W0Enabled, W1Enabled, + W0Invert, W1Invert, + mask_logic, + WindowPos[0][0], WindowPos[0][1], + WindowPos[1][0], WindowPos[1][1]); + } +#endif + + { + unsigned i = 0; + + for(unsigned piece = 0; piece < 5; piece++) + { + bool wir[2]; + bool w = false; + + wir[0] = (i >= WindowPos[0][0] && i <= WindowPos[0][1]) ^ W0Invert; + wir[1] = (i >= WindowPos[1][0] && i <= WindowPos[1][1]) ^ W1Invert; + + if(W0Enabled && W1Enabled) + { + switch(mask_logic) + { + case 0: w = wir[0] | wir[1]; break; + case 1: w = wir[0] & wir[1]; break; + case 2: w = wir[0] ^ wir[1]; break; + case 3: w = !(wir[0] ^ wir[1]); break; + } + } + else if(W0Enabled) + w = wir[0]; + else if(W1Enabled) + w = wir[1]; + + //if(scanline == 100) + //{ + // printf(" Apply mask 0x%08x to %u ... %u --- wir[0]=%u, wir[1]=%u, w=%u\n", masker[w], i, WindowPieces[piece], wir[0], wir[1], w); + //} + + for(uint32 eff_mask = masker[w]; MDFN_LIKELY(i < WindowPieces[piece]); i++) + { + if(hires) + { + (buf + 0)[i << 1] &= eff_mask; + (buf + 1)[i << 1] &= eff_mask; + } + else + buf[i] &= eff_mask; + } + } + } +} + + +template +static INLINE void DoBGLayer(unsigned n, uint32 bgprio) +{ + if(bpp == 8 && (CGWSEL & 0x01)) + { + if(BGMode & (0x10 << n)) + DrawBG(n, scanline, bgprio); + else + DrawBG(n, scanline, bgprio); + } + else + { + if(BGMode & (0x10 << n)) + DrawBG(n, scanline, bgprio); + else + DrawBG(n, scanline, bgprio); + } + + if(hires) + { + DoXMosaic(n, &linebuf.bghr[n][8]); + DoWindow(n, &linebuf.bghr[n][8]); + } + else + { + DoXMosaic(n, &linebuf.bg[n][8]); + DoWindow(n, &linebuf.bg[n][8]); + } +} + +template +static uint32 CMath(uint32 tmp, uint32 other_color) +{ + if(half) + { + if(subtract) + { + uint32 diff = tmp - other_color + 0x8420; + uint32 borrow = (diff - ((tmp ^ other_color) & 0x8420)) & 0x8420; + + tmp = (((diff - borrow) & (borrow - (borrow >> 5))) & 0x7BDE) >> 1; + } + else + { + tmp = ((tmp + other_color) - ((tmp ^ other_color) & 0x0421)) >> 1; + } + } + else + { + if(subtract) + { + uint32 diff = tmp - other_color + 0x8420; + uint32 borrow = (diff - ((tmp ^ other_color) & 0x8420)) & 0x8420; + + tmp = (diff - borrow) & (borrow - (borrow >> 5)); + } + else + { + uint32 sum = tmp + other_color; + uint32 carry = (sum - ((tmp ^ other_color) & 0x421)) & 0x8420; + + tmp = (sum - carry) | (carry - (carry >> 5)); + } + } + + return tmp; +} + +static INLINE uint32 ConvertRGB555(uint32 tmp) +{ + return linebuf.OutputLUT[(uint8)tmp] | (linebuf.OutputLUT + 256)[(tmp >> 8) & 0x7F]; +} + +template +static void NO_INLINE MixMainSubSubSubMarine(uint32* __restrict__ target) +{ + //if(scanline == 100) + // fprintf(stderr, "CGWSEL=0x%02x, CGADSUB=0x%02x, WOBJSEL=0x%02x, WMLogic=0x%02x\n", CGWSEL, CGADSUB, WMSettings[2], WMLogic); + + if(any_hires) + { + // FIXME: hires color math. + for(unsigned i = 0; i < 256; i++) + { + uint32 main = linebuf.main[i]; + uint32 sub = linebuf.sub[i]; + unsigned main_color = main >> 16; + unsigned sub_color = sub >> 16; + + if(main & 1) + { + if(hires_cmath_add_subscreen) //CGWSEL & 0x2) + { + if(sub & 0x8) // Is subscreen backdrop? Then no half-math when (CGWSEL & 0x2) + { + main_color = CMath(main_color, FixedColor); + sub_color = CMath(sub_color, FixedColor); + } + else + { + if((cmath_mode & 1) && (main & 2)) // If half math enabled, and main wasn't clipped to 0 by color window, then half math. + { + main_color = CMath(main_color, sub_color); + sub_color = CMath(sub_color, main_color); + } + else + { + main_color = CMath(main_color, sub_color); + sub_color = CMath(sub_color, main_color); + } + } + } + else + { + main_color = CMath(main_color, FixedColor); + sub_color = CMath(sub_color, FixedColor); + } + } + + target[(i << 1) + 0] = ConvertRGB555(sub_color); + target[(i << 1) + 1] = ConvertRGB555(main_color); + } + } + else + { + for(unsigned i = 0; i < 256; i++) + { + uint32 main = linebuf.main[i]; + uint32 sub = linebuf.sub[i]; + uint32 tmp = main >> 16; + + if(main & 1) + { + uint16 other_color = sub >> 16; + + //assert(main != sub); + + if((cmath_mode & 1) && (main & sub & 2)) // Halving mathing + tmp = CMath(tmp, other_color); + else + tmp = CMath(tmp, other_color); + } + + target[i] = ConvertRGB555(tmp); + } + } +} + +template +static INLINE void MixMainSub(uint32* __restrict__ target) +{ + if(any_hires && MDFN_UNLIKELY(CGWSEL & 0x2)) + { + switch((CGADSUB >> 6) & 0x3) + { + case 0: MixMainSubSubSubMarine(target); break; + case 1: MixMainSubSubSubMarine(target); break; + case 2: MixMainSubSubSubMarine(target); break; + case 3: MixMainSubSubSubMarine(target); break; + } + } + else + { + switch((CGADSUB >> 6) & 0x3) + { + case 0: MixMainSubSubSubMarine(target); break; + case 1: MixMainSubSubSubMarine(target); break; + case 2: MixMainSubSubSubMarine(target); break; + case 3: MixMainSubSubSubMarine(target); break; + } + } + + if((INIDisp & 0xF) != 0xF) + { + const uint32 brightmul = (INIDisp & 0xF) * 17; + for(unsigned i = 0; i < (256 << any_hires); i++) + { + const uint32 pix = target[i]; + + target[i] = ((((pix & 0xFF00FF) * brightmul) >> 8) & 0xFF00FF) | ((((pix >> 8) & 0xFF00FF) * brightmul) & 0xFF00FF00); + } + } +} + +#ifdef ARCH_X86 +template +static INLINE void PrioHelper(uint32& main, uint32& sub, uint32 np, uint32 nps = 0) +{ + if(sub_unique) + { + asm("cmpb %%cl, %%al\n\t" "cmovb %%ecx, %%eax\n\t" : "=a"(main), "=b"(sub) : "a"(main), "b"(sub), "c"(np) : "cc"); + asm("cmpb %%dh, %%bh\n\t" "cmovb %%edx, %%ebx\n\t" : "=a"(main), "=b"(sub) : "a"(main), "b"(sub), "d"(nps) : "cc"); + } + else + { + if(w & 1) + { + asm("cmpb %%dl, %%al\n\t" "cmovb %%edx, %%eax\n\t" : "=a"(main), "=b"(sub) : "a"(main), "b"(sub), "d"(np) : "cc"); + asm("cmpb %%dh, %%bh\n\t" "cmovb %%edx, %%ebx\n\t" : "=a"(main), "=b"(sub) : "a"(main), "b"(sub), "d"(np) : "cc"); + } + else + { + asm("cmpb %%cl, %%al\n\t" "cmovb %%ecx, %%eax\n\t" : "=a"(main), "=b"(sub) : "a"(main), "b"(sub), "c"(np) : "cc"); + asm("cmpb %%ch, %%bh\n\t" "cmovb %%ecx, %%ebx\n\t" : "=a"(main), "=b"(sub) : "a"(main), "b"(sub), "c"(np) : "cc"); + } + } +} +#else +template +static INLINE void PrioHelper(uint32& main, uint32& sub, uint32 np, uint32 nps = 0) +{ + if((uint8)np > (uint8)main) + main = np; + + if(sub_unique) + { + if((uint16)nps > (uint16)sub) + sub = nps; + } + else + { + if((uint16)np > (uint16)sub) + sub = np; + } +} +#endif + +// hrop = 1 for modes 5 and 6 hires +// hrop = -1 for pseudo-hires +template +static void MixLayersSub(void) +{ + uint32 main_back, sub_back; + + static_assert(hrop != 1 || (mix_bg0 && mix_bg1 && !mix_bg2 && !mix_bg3), "hrop mix_bg* mismatch."); + + main_back = (CGRAM[0] << 16) | ((CGADSUB >> 5) & 1) | 2 | 0x808; + + // + // Doing the subscreen FixedColor color math optimization doesn't really work out in hires mode... + // + if(hrop) + sub_back = CGRAM[0] << 16; + else + { + sub_back = (FixedColor << 16); + + // If only color mathing with FixedColor and not subscreen per-se, set half-math-allow bit(0x2), and force the priority to be above + // any other layers that might otherwise unintentionally get mixed in. + if(!(CGWSEL & 0x2)) + sub_back |= 0xF002; + } + + sub_back |= 0x808; + + for(unsigned i = 0; i < 256; i++) + { + uint32 main = main_back, sub = sub_back; + + PrioHelper<0, false>(main, sub, (objbuf + 8)[i]); + + if(mix_bg0) + { + if(hrop == 1) + PrioHelper<1, true>(main, sub, (linebuf.bghr[0] + 8 + 1)[i * 2], (linebuf.bghr[0] + 8 + 0)[i * 2]); + else + PrioHelper<1, false>(main, sub, (linebuf.bg[0] + 8)[i]); + } + + if(mix_bg1) + { + if(hrop == 1) + PrioHelper<2, true>(main, sub, (linebuf.bghr[1] + 8 + 1)[i * 2], (linebuf.bghr[1] + 8 + 0)[i * 2]); + else + PrioHelper<2, false>(main, sub, (linebuf.bg[1] + 8)[i]); + } + + if(mix_bg2) + PrioHelper<3, false>(main, sub, (linebuf.bg[2] + 8)[i]); + + if(mix_bg3) + PrioHelper<4, false>(main, sub, (linebuf.bg[3] + 8)[i]); + + linebuf.main[i] = main; + linebuf.sub[i] = sub; + } +} + +template +static INLINE void MixLayers(void) +{ + if(MDFN_UNLIKELY(hires)) + MixLayersSub(); + else if(MDFN_UNLIKELY(ScreenMode & 0x08)) + MixLayersSub(); + else + MixLayersSub(); +} + +static INLINE void GetBGPrioWCMBits(uint32* bgprio, unsigned count) +{ + for(unsigned i = 0; i < count; i++) + { + bgprio[i] |= (((CGADSUB >> i) & 1) * 0x00010001) | 0x00020002; + + if((SSEnable & (1U << i))) + bgprio[i] |= (bgprio[i] & 0x00F000F0) << 8; + + if(!(MSEnable & (1U << i))) + bgprio[i] &= ~0x00F000F0; + } +} + +static INLINE void DrawBGAndMixToMS(void) +{ + if((BGMode & 0x7) == 1) + { + uint32 bgprio[3] = { 0x00B00080, 0x00A00070, 0x00500020 + ((uint32)(BGMode & 0x8) << 20) }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + DoBGLayer<4>(0, bgprio[0]); + DoBGLayer<4>(1, bgprio[1]); + DoBGLayer<2>(2, bgprio[2]); + + MixLayers(); + } + else if((BGMode & 0x7) == 0) + { + uint32 bgprio[4] = { 0x00B00080, 0x00A00070, 0x00500020, 0x00400010}; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + for(unsigned i = 0; i < 4; i++) + DoBGLayer<2, true>(i, bgprio[i]); + + MixLayers(); + } + else if((BGMode & 0x3) == 2) + { + uint32 bgprio[2] = { 0x00A00040, 0x00800020 }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + if(BGMode & (0x10 << 2)) + GetOPTStrip(2); + else + GetOPTStrip(2); + + DoBGLayer<4, false, true>(0, bgprio[0]); + DoBGLayer<4, false, true>(1, bgprio[1]); + + MixLayers(); + } + else if((BGMode & 0x7) == 3) + { + uint32 bgprio[2] = { 0x00A00040, 0x00800020 }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + DoBGLayer<8>(0, bgprio[0]); + DoBGLayer<4>(1, bgprio[1]); + + MixLayers(); + } + else if((BGMode & 0x7) == 4) + { + uint32 bgprio[2] = { 0x00A00040, 0x00800020 }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + if(BGMode & (0x10 << 2)) + GetOPTStrip(2); + else + GetOPTStrip(2); + + DoBGLayer<8, false, true>(0, bgprio[0]); + DoBGLayer<2, false, true>(1, bgprio[1]); + + MixLayers(); + } + + else if((BGMode & 0x7) == 5) + { + uint32 bgprio[2] = { 0x00A00040, 0x00800020 }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + DoBGLayer<4, false, false, true>(0, bgprio[0]); + DoBGLayer<2, false, false, true>(1, bgprio[1]); + + MixLayers(); + } + else if((BGMode & 0x7) == 7) + { + if(MDFN_UNLIKELY(ScreenMode & 0x40)) // "EXTBG" + { + uint32 bgprio[2] = { 0x0040, 0x00800020 }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + if(CGWSEL & 1) + DrawMODE7(scanline, bgprio[0], bgprio[1]); + else + DrawMODE7(scanline, bgprio[0], bgprio[1]); + DoXMosaic(0, &linebuf.bg[0][8]); + DoWindow(0, &linebuf.bg[0][8]); + DoXMosaic(1, &linebuf.bg[1][8]); + DoWindow(1, &linebuf.bg[1][8]); + MixLayers(); + } + else + { + uint32 bgprio[1] = { 0x0040 }; + + GetBGPrioWCMBits(bgprio, sizeof(bgprio) / sizeof(bgprio[0])); + + if(CGWSEL & 1) + DrawMODE7(scanline, bgprio[0]); + else + DrawMODE7(scanline, bgprio[0]); + DoXMosaic(0, &linebuf.bg[0][8]); + DoWindow(0, &linebuf.bg[0][8]); + MixLayers(); + } + } + else + SNES_DBG("[PPU] BGMODE: %02x\n", BGMode); +} + +static void RenderLine(void) +{ + uint32* const out_target = es->surface->pixels + ((scanline - 1) * es->surface->pitchinpix); + + if(INIDisp & 0x80) + { + es->LineWidths[scanline - 1] = 2; + + for(unsigned i = 0; i < 2; i++) + out_target[i] = 0; + + return; + } + + if(scanline == 1) + MosaicYOffset = 0; + else + { + MosaicYOffset++; + if(MosaicYOffset > (Mosaic >> 4)) + MosaicYOffset = 0; + } + + CalcWindowPieces(); + // + // + // + DrawSprites(); + DoWindow(4, &objbuf[8]); + + DrawBGAndMixToMS(); + DoWindow(5, linebuf.main); + + if(MDFN_UNLIKELY((BGMode & 0x7) == 0x5 || (BGMode & 0x7) == 0x6 || (ScreenMode & 0x08))) + { + // Nope, won't work right! + //DoWindow(5, linebuf.sub); // For color window masking to black. Probably should find a more efficient/logical way to do this... + + MixMainSub(out_target); + es->LineWidths[scanline - 1] = 512; + } + else + { + MixMainSub(out_target); + es->LineWidths[scanline - 1] = 256; + } +} + +// +// +// +// +// +// +// +// +static DEFWRITE(Write_NMITIMEEN) // $4200 +{ + CPUM.timestamp += MEMCYC_FAST; + // + NMITIMEEN = V; + + if(!(NMITIMEEN & 0x30)) + IRQFlag = 0x00; + + CPU_SetNMI(NMIFlag & NMITIMEEN & 0x80); + CPU_SetIRQ(IRQFlag); + + SNES_DBG("[SNES] Write NMITIMEEN: 0x%02x --- scanline=%u, LineCounter=%u, LinePhase=%u\n", V, scanline, LineCounter, LinePhase); +} + +static DEFWRITE(Write_HTIME) // $4207 and $4208 +{ + CPUM.timestamp += MEMCYC_FAST; + // + const unsigned shift = (~A & 1) << 3; + unsigned New_HTime = HTime; + + New_HTime &= 0xFF00 >> shift; + New_HTime |= V << shift; + New_HTime &= 0x1FF; + + if(New_HTime != HTime) + SNES_DBG("[SNES] HTIME Changed: new=0x%04x(old=0x%04x) --- scanline=%u, LineCounter=%u, LinePhase=%u\n", New_HTime, HTime, scanline, LineCounter, LinePhase); + + HTime = New_HTime; +} + +static DEFWRITE(Write_VTIME) // $4209 and $420A +{ + CPUM.timestamp += MEMCYC_FAST; + // + const unsigned shift = (~A & 1) << 3; + unsigned New_VTime = VTime; + + New_VTime &= 0xFF00 >> shift; + New_VTime |= V << shift; + New_VTime &= 0x1FF; + + if(New_VTime != VTime) + { + SNES_DBG("[SNES] VTIME Changed: new=0x%04x(old=0x%04x) --- HTIME=0x%04x, scanline=%u, LineCounter=%u, LinePhase=%u -- %u\n", New_VTime, VTime, HTime, scanline, LineCounter, LinePhase, (CPUM.timestamp - LineStartTS)); + +#if 0 + // Kludge for F-1 Grand Prix + if(!LinePhase && LineCounter >= 1088) //(CPUM.timestamp - LineStartTS) < 10) + { + if(!(NMITIMEEN & 0x10) || HTime == 0) + { + if(((NMITIMEEN & 0x20) && scanline == New_VTime) || ((NMITIMEEN & 0x30) == 0x10)) + { + printf("Kludge IRQ: %d\n", scanline); + IRQFlag = 0x80; + CPU_SetIRQ(IRQFlag); + } + } + } +#endif + } + + VTime = New_VTime; +} + +static DEFREAD(Read_4210) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = NMIFlag | 0x01; + + NMIFlag = 0x00; + CPU_SetNMI(false); + + return ret; +} + +static DEFREAD(Read_4211) +{ + CPUM.timestamp += MEMCYC_FAST; + // + uint8 ret = IRQFlag; + + //printf("Read: %04x\n", A); + + IRQFlag = 0x00; + CPU_SetIRQ(false); + + return ret; +} + +static DEFREAD(Read_4212) +{ + CPUM.timestamp += MEMCYC_FAST; + // + return HVBJOY; +} + +static DEFREAD(Read_4213) +{ + CPUM.timestamp += MEMCYC_FAST; + // + SNES_DBG("[PPU] Read 4213\n"); + + return 0; +} +// +// +// +// +// +// +// +// +// + +uint32 PPU_Update(uint32 timestamp) +{ + if(timestamp < lastts) + { + SNES_DBG("[PPU] timestamp goof: timestamp=%u, lastts=%u\n", timestamp, lastts); + assert(timestamp >= lastts); + } + + LineCounter -= (timestamp - lastts); + + if(LineCounter <= 0) + { + LinePhase = !LinePhase; + + if(LinePhase) // HBlank begin + { + // + // + HVBJOY |= 0x40; + // + // + + if(!VBlank) + { + FetchSpriteData(scanline); + DMA_RunHDMA(); + } + + // + LineCounter += 67 * 4; + } + else // HBlank end + { + scanline = (scanline + 1) % 262; + // + LineStartTS = timestamp; + + // + // + // CPUM.timestamp += 40; + HVBJOY &= ~0x40; + + // FIXME, HORRIBLE(and stuff) + if(!(NMITIMEEN & 0x10) || HTime < 340) + { + if(((NMITIMEEN & 0x20) && scanline == VTime) || ((NMITIMEEN & 0x30) == 0x10)) + { + SNES_DBG("[SNES] IRQ: %d\n", scanline); + IRQFlag = 0x80; + CPU_SetIRQ(IRQFlag); + } + } + if(JPReadCounter > 0) + { + if(JPReadCounter == 3) + INPUT_AutoRead(); + + JPReadCounter--; + if(!JPReadCounter) + HVBJOY &= ~0x01; + } + + // + // + + if(VBlank && scanline == 0) // VBlank end + { + VBlank = false; + Status[0] &= ~0xC0; // Reset Time Over and Range Over flags. + + // + // + // + HVBJOY &= ~0x80; + NMIFlag = 0x00; + CPU_SetNMI(false); + + DMA_InitHDMA(); + // + // + // + + // + // + // + es->DisplayRect.y = ((ScreenMode & 0x04) && 1) ? 8 : 0; + es->LineWidths[0] = 0; + } + else if(!VBlank && scanline >= ((ScreenMode & 0x04) ? 0xF0 : 0xE1)) + { + VBlank = true; + + // + // + // + CPUM.running_mask = 0; + + HVBJOY |= 0x80; + NMIFlag = 0x80; + + CPU_SetNMI(NMIFlag & NMITIMEEN & 0x80); + + if(NMITIMEEN & 0x01) + { + JPReadCounter = 3; + HVBJOY |= 0x01; + } + // + // + // + if(!(INIDisp & 0x80)) + OAM_Addr = (OAMADDL | ((OAMADDH & 0x1) << 8)) << 1; + } + + if(!VBlank) + { + if(scanline > 0 && !es->skip) + RenderLine(); + } + + // + LineCounter += 274 * 4; + } + } + + lastts = timestamp; + + return timestamp + LineCounter; +} + +void PPU_ResetTS(void) +{ + LineStartTS -= lastts; + lastts = 0; +} + +void PPU_Init(void) +{ + Set_B_Handlers(0x00, OBRead_FAST, Write_2100); + + Set_B_Handlers(0x01, OBRead_FAST, Write_OBSEL); + Set_B_Handlers(0x02, OBRead_FAST, Write_OAMADDL); + Set_B_Handlers(0x03, OBRead_FAST, Write_OAMADDH); + Set_B_Handlers(0x04, OBRead_FAST, Write_OAMDATA); + + Set_B_Handlers(0x05, OBRead_FAST, Write_2105); + Set_B_Handlers(0x06, OBRead_FAST, Write_2106); + + Set_B_Handlers(0x07, 0x0A, OBRead_FAST, Write_BGSC); + + Set_B_Handlers(0x0B, 0x0C, OBRead_FAST, Write_BGNBA); + + Set_B_Handlers(0x0D, OBRead_FAST, Write_BGHOFS); + Set_B_Handlers(0x0F, OBRead_FAST, Write_BGHOFS); + Set_B_Handlers(0x11, OBRead_FAST, Write_BGHOFS); + Set_B_Handlers(0x13, OBRead_FAST, Write_BGHOFS); + + Set_B_Handlers(0x0E, OBRead_FAST, Write_BGVOFS); + Set_B_Handlers(0x10, OBRead_FAST, Write_BGVOFS); + Set_B_Handlers(0x12, OBRead_FAST, Write_BGVOFS); + Set_B_Handlers(0x14, OBRead_FAST, Write_BGVOFS); + + Set_B_Handlers(0x15, OBRead_FAST, Write_2115); + Set_B_Handlers(0x16, OBRead_FAST, Write_2116); + Set_B_Handlers(0x17, OBRead_FAST, Write_2117); + Set_B_Handlers(0x18, OBRead_FAST, Write_2118); + Set_B_Handlers(0x19, OBRead_FAST, Write_2119); + + Set_B_Handlers(0x1A, OBRead_FAST, Write_211A); + Set_B_Handlers(0x1B, 0x1E, OBRead_FAST, Write_M7Matrix); + + Set_B_Handlers(0x1F, 0x20, OBRead_FAST, Write_M7Center); + + Set_B_Handlers(0x21, OBRead_FAST, Write_CGADD); + Set_B_Handlers(0x22, OBRead_FAST, Write_CGDATA); + + Set_B_Handlers(0x23, 0x25, OBRead_FAST, Write_WMSettings); + + Set_B_Handlers(0x26, 0x29, OBRead_FAST, Write_WindowPos); + Set_B_Handlers(0x2A, OBRead_FAST, Write_WMLogic); + Set_B_Handlers(0x2B, OBRead_FAST, Write_WMLogic); + + Set_B_Handlers(0x2C, OBRead_FAST, Write_MSEnable); + Set_B_Handlers(0x2D, OBRead_FAST, Write_SSEnable); + + Set_B_Handlers(0x2E, OBRead_FAST, Write_WMMainEnable); + Set_B_Handlers(0x2F, OBRead_FAST, Write_WMSubEnable); + + Set_B_Handlers(0x30, OBRead_FAST, Write_CGWSEL); + Set_B_Handlers(0x31, OBRead_FAST, Write_CGADSUB); + + Set_B_Handlers(0x32, OBRead_FAST, Write_COLDATA); + + Set_B_Handlers(0x33, OBRead_FAST, Write_ScreenMode); + + Set_B_Handlers(0x34, Read_M7Multiplier< 0>, OBWrite_FAST); + Set_B_Handlers(0x35, Read_M7Multiplier< 8>, OBWrite_FAST); + Set_B_Handlers(0x36, Read_M7Multiplier<16>, OBWrite_FAST); + + Set_B_Handlers(0x37, Read_HVLatchTrigger, OBWrite_FAST); + + Set_B_Handlers(0x38, Read_OAMDATAREAD, OBWrite_FAST); + + Set_B_Handlers(0x39, Read_2139, OBWrite_FAST); + Set_B_Handlers(0x3A, Read_213A, OBWrite_FAST); + + Set_B_Handlers(0x3B, Read_CGDATAREAD, OBWrite_FAST); + + Set_B_Handlers(0x3C, Read_HLatch, OBWrite_FAST); + Set_B_Handlers(0x3D, Read_VLatch, OBWrite_FAST); + + Set_B_Handlers(0x3E, Read_Status0, OBWrite_FAST); + Set_B_Handlers(0x3F, Read_Status1, OBWrite_FAST); + + Status[0] = 1; + Status[1] = (0 << 4) | 2; + + // + // + // + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + if(bank <= 0x3F || (bank >= 0x80 && bank <= 0xBF)) + { + Set_A_Handlers((bank << 16) | 0x4200, OBRead_FAST, Write_NMITIMEEN); + Set_A_Handlers((bank << 16) | 0x4207, (bank << 16) | 0x4208, OBRead_FAST, Write_HTIME); + Set_A_Handlers((bank << 16) | 0x4209, (bank << 16) | 0x420A, OBRead_FAST, Write_VTIME); + + Set_A_Handlers((bank << 16) | 0x4210, Read_4210, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4211, Read_4211, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4212, Read_4212, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4213, Read_4213, OBWrite_FAST); + } + } +} + +void PPU_Kill(void) +{ + + +} + +void PPU_Reset(bool powering_up) +{ + HLatch = 0; + VLatch = 0; + HVLatchReadShift = 0; + + BusLatch[0] = 0x00; + BusLatch[1] = 0x00; + + Status[0] &= ~0xC0; + Status[1] &= ~0xC0; + + // FIXME? + scanline = 0; + LinePhase = 0; + LineCounter = 1; + + VBlank = false; + + if(powering_up) + memset(VRAM, 0x00, sizeof(VRAM)); + + ScreenMode = 0x00; + INIDisp = 0x00; + BGMode = 0x00; + Mosaic = 0x00; + MosaicYOffset = 0x00; + + memset(BGSC, 0x00, sizeof(BGSC)); + memset(BGNBA, 0x00, sizeof(BGNBA)); + + BGOFSPrev = 0x00; + memset(BGHOFS, 0x00, sizeof(BGHOFS)); + memset(BGVOFS, 0x00, sizeof(BGVOFS)); + + VRAM_Addr = 0x0000; + VRAM_ReadBuffer = 0x0000; + + VMAIN_IncMode = 0x00; + VMAIN_AddrInc = 0; + VMAIN_AddrTransMaskA = 0x7FFF; + VMAIN_AddrTransShiftB = 0; + VMAIN_AddrTransMaskC = 0x0000; + + + M7Prev = 0x00; + M7SEL = 0x00; + memset(M7Matrix, 0x00, sizeof(M7Matrix)); + memset(M7Center, 0x00, sizeof(M7Center)); + M7HOFS = 0x0000; + M7VOFS = 0x0000; + + CGRAM_Toggle = false; + CGRAM_Buffer = 0x00; + CGRAM_Addr = 0x00; + if(powering_up) + memset(CGRAM, 0x00, sizeof(CGRAM)); + + MSEnable = 0x00; + SSEnable = 0x00; + + memset(WMSettings, 0x00, sizeof(WMSettings)); + WMMainEnable = 0x00; + WMSubEnable = 0x00; + WMLogic = 0x0000; + memset(WindowPos, 0x00, sizeof(WindowPos)); + + CGWSEL = 0x00; + CGADSUB = 0x00; + FixedColor = 0x0000; + + OBSEL = 0x00; + OAMADDL = 0x00; + OAMADDH = 0x00; + + OAM_Buffer = 0x00; + OAM_Addr = 0; + if(powering_up) + { + memset(OAM, 0x00, sizeof(OAM)); + memset(OAMHI, 0x00, sizeof(OAMHI)); + } + + // + // + // + if(powering_up) + { + HTime = 0x1FF; + VTime = 0x1FF; + } + + NMIFlag = 0x00; + IRQFlag = 0x00; + NMITIMEEN = 0; + CPU_SetNMI(false); + CPU_SetIRQ(false); +} + +void PPU_StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(LineStartTS), + SFVAR(HLatch), + SFVAR(VLatch), + SFVAR(HVLatchReadShift), + + SFVAR(NMITIMEEN), + + SFVAR(HTime), + SFVAR(VTime), + + SFVAR(HVBJOY), + SFVAR(NMIFlag), + SFVAR(IRQFlag), + SFVAR(JPReadCounter), + + SFVAR(VBlank), + SFVAR(LineCounter), + SFVAR(LinePhase), + SFVAR(scanline), + + SFARRAY(BusLatch, 2), + SFARRAY(Status, 2), + + SFARRAY16(VRAM, 32768), + + SFVAR(ScreenMode), + SFVAR(INIDisp), + SFVAR(BGMode), + SFVAR(Mosaic), + SFVAR(MosaicYOffset), + + SFARRAY(BGSC, 4), + + SFARRAY(BGNBA, 2), + + SFVAR(BGOFSPrev), + SFARRAY16(BGHOFS, 4), + SFARRAY16(BGVOFS, 4), + + SFVAR(VRAM_Addr), + SFVAR(VRAM_ReadBuffer), + SFVAR(VMAIN_IncMode), + SFVAR(VMAIN_AddrInc), + SFVAR(VMAIN_AddrTransMaskA), + SFVAR(VMAIN_AddrTransShiftB), + SFVAR(VMAIN_AddrTransMaskC), + + SFVAR(M7Prev), + SFVAR(M7SEL), + SFARRAY16(M7Matrix, 4), + SFARRAY16(M7Center, 2), + SFVAR(M7HOFS), + SFVAR(M7VOFS), + + SFVAR(CGRAM_Toggle), + SFVAR(CGRAM_Buffer), + SFVAR(CGRAM_Addr), + SFARRAY16(CGRAM, 256), + + SFVAR(MSEnable), + SFVAR(SSEnable), + + SFARRAY(WMSettings, 3), + SFVAR(WMMainEnable), + SFVAR(WMSubEnable), + SFVAR(WMLogic), + SFARRAY(&WindowPos[0][0], sizeof(WindowPos) / sizeof(WindowPos[0][0])), + + SFVAR(CGWSEL), + SFVAR(CGADSUB), + SFVAR(FixedColor), + + SFVAR(OBSEL), + SFVAR(OAMADDL), + SFVAR(OAMADDH), + SFVAR(OAM_Buffer), + SFVAR(OAM_Addr), + SFARRAY(OAM, 512), + SFARRAY(OAMHI, 32), + + SFEND + }; + + // TODO: Might want to save sprite fetch state when we add a debuger(for save states in step mode, which may occur outside of vblank). + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "PPU"); + + if(load) + { + OAM_Addr &= 0x3FF; + VMAIN_AddrTransMaskA &= 0x7FFF; + VMAIN_AddrTransMaskC &= 0x7FFF; + } +} + +} + diff --git a/Mednafen/mednafen/snes_faust/ppu.h b/Mednafen/mednafen/snes_faust/ppu.h new file mode 100644 index 0000000000..e0ca171b2d --- /dev/null +++ b/Mednafen/mednafen/snes_faust/ppu.h @@ -0,0 +1,20 @@ +#ifndef __MDFN_SNES_FAUST_PPU_H +#define __MDFN_SNES_FAUST_PPU_H + +namespace MDFN_IEN_SNES_FAUST +{ + +void PPU_Init(void); +void PPU_Kill(void); +void PPU_Reset(bool powering_up); +void PPU_ResetTS(void); + +void PPU_StateAction(StateMem* sm, const unsigned load, const bool data_only); + +void PPU_StartFrame(EmulateSpecStruct* espec); + +uint32 PPU_Update(uint32 timestamp); + +} + +#endif diff --git a/Mednafen/mednafen/snes_faust/snes.cpp b/Mednafen/mednafen/snes_faust/snes.cpp new file mode 100644 index 0000000000..af0617584f --- /dev/null +++ b/Mednafen/mednafen/snes_faust/snes.cpp @@ -0,0 +1,889 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "snes.h" +#include "input.h" +#include "cart.h" +#include "apu.h" +#include "ppu.h" + +#include +#include +#include +#include +#include + +#include + +extern MDFNGI EmulatedSNES_Faust; + +namespace MDFN_IEN_SNES_FAUST +{ +static bool SpecEx, SpecExSoundToo; +static MemoryStream* SpecExSS = NULL; +static int32 SpecExAudioExpected; + +static void EventReset(void); + + +template +static void SetHandlers(uint32 A1, uint32 A2, readfunc read_handler, writefunc write_handler) +{ + unsigned index = 0; + + assert(read_handler && write_handler); + + while(index < 256 && CPUM.ReadFuncs[index] && CPUM.WriteFuncs[index] && (CPUM.ReadFuncs[index] != read_handler || CPUM.WriteFuncs[index] != write_handler)) + index++; + + assert(index < 256); + + CPUM.ReadFuncs[index] = read_handler; + CPUM.WriteFuncs[index] = write_handler; + CPUM.ReadFuncsA[index] = b_bus ? OBRead_FAST : read_handler; + CPUM.WriteFuncsA[index] = b_bus ? OBWrite_FAST : write_handler; + + if(b_bus) + { + assert(A1 < 256 && A2 < 256); + + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + if(bank <= 0x3F || (bank >= 0x80 && bank <= 0xBF)) + { + for(uint32 baddr = A1; baddr <= A2; baddr++) + { + CPUM.DM_ReadFuncsB[baddr] = read_handler; + CPUM.DM_WriteFuncsB[baddr] = write_handler; + + CPUM.RWIndex[(bank << 16) + 0x2100 + baddr] = index; + } + } + } + } + else + { + for(uint32 addr = A1; addr <= A2; addr++) + { + CPUM.RWIndex[addr] = index; + } + } + + CPUM.RWIndex[256 * 65536] = CPUM.RWIndex[0]; +} + +void Set_A_Handlers(uint32 A1, uint32 A2, readfunc read_handler, writefunc write_handler) +{ + SetHandlers(A1, A2, read_handler, write_handler); +} + +void Set_B_Handlers(uint8 A1, uint8 A2, readfunc read_handler, writefunc write_handler) +{ + SetHandlers(A1, A2, read_handler, write_handler); +} + +bool MemSelect; + +template +static INLINE DEFREAD(OBRead) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + + SNES_DBG("[SNES] Unknown Read: $%02x:%04x\n", A >> 16, A & 0xFFFF); + return CPUM.mdr; +} + +template +static INLINE DEFWRITE(OBWrite) +{ + if(cyc >= 0) + CPUM.timestamp += cyc; + else + CPUM.timestamp += MemSelect ? MEMCYC_FAST : MEMCYC_SLOW; + + SNES_DBG("[SNES] Unknown Write: $%02x:%04x $%02x\n", A >> 16, A & 0xFFFF, V); +} + +DEFREAD(OBRead_XSLOW) { return OBRead(A); } +DEFREAD(OBRead_SLOW) { return OBRead(A); } +DEFREAD(OBRead_FAST) { return OBRead(A); } +DEFREAD(OBRead_VAR) { return OBRead<-1>(A); } + +DEFWRITE(OBWrite_XSLOW) { OBWrite(A, V); } +DEFWRITE(OBWrite_SLOW) { OBWrite(A, V); } +DEFWRITE(OBWrite_FAST) { OBWrite(A, V); } +DEFWRITE(OBWrite_VAR) { OBWrite<-1>(A, V); } + + +static uint8 WRAM[0x20000]; +static std::bitset<0x20000> WRAMWritten; // for debugging + +template +static DEFREAD(WRAMRead) +{ + CPUM.timestamp += MEMCYC_SLOW; + + if(!WRAMWritten[A & mask]) + SNES_DBG("[SNES] Read from uninitialized WRAM at 0x%08x!\n", A & mask); + + return WRAM[A & mask]; +} + +template +static DEFWRITE(WRAMWrite) +{ + CPUM.timestamp += MEMCYC_SLOW; + + WRAM[A & mask] = V; + + WRAMWritten[A & mask] = true; +} + +static uint8 WRIO; + +static uint8 Multiplicand; +static uint16 MultProduct; // Also division remainder. + +static uint16 Dividend; +static uint16 DivQuotient; + +static uint32 WMAddress; + +#include "dma.inc" + +static void ICRegsReset(bool powering_up) +{ + if(powering_up) + { + WRIO = 0xFF; + Multiplicand = 0xFF; + MultProduct = 0xFFFF; + + Dividend = 0xFFFF; + DivQuotient = 0xFFFF; + } + + WMAddress = 0; + + MemSelect = 0; +} + +static DEFWRITE(ICRegsWrite) +{ + CPUM.timestamp += MEMCYC_FAST; + + A &= 0xFFFF; + + switch(A & 0xFFFF) + { + case 0x4201: WRIO = V; + SNES_DBG("[SNES] Write WRIO: %02x\n", V); + break; + + case 0x4202: Multiplicand = V; + break; + + case 0x4203: MultProduct = Multiplicand * V; + break; + + case 0x4204: Dividend = (Dividend & 0xFF00) | (V << 0); + break; + + case 0x4205: Dividend = (Dividend & 0x00FF) | (V << 8); + break; + + case 0x4206: //printf("Divide: 0x%04x / 0x%02x\n", Dividend, V); + + if(!V) + { + DivQuotient = 0xFFFF; + MultProduct = Dividend; + } + else + { + DivQuotient = Dividend / V; + MultProduct = Dividend % V; + } + break; + + case 0x420D: MemSelect = V & 1; + break; + } +} + + +static DEFREAD(Read_4214) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DivQuotient >> 0; +} + +static DEFREAD(Read_4215) +{ + CPUM.timestamp += MEMCYC_FAST; + + return DivQuotient >> 8; +} + +static DEFREAD(Read_4216) +{ + CPUM.timestamp += MEMCYC_FAST; + + return MultProduct >> 0; +} + +static DEFREAD(Read_4217) +{ + CPUM.timestamp += MEMCYC_FAST; + + return MultProduct >> 8; +} + +// +// +// +static DEFWRITE(Write_2180) +{ + CPUM.timestamp += MEMCYC_FAST; + + WRAMWritten[WMAddress] = true; + + WRAM[WMAddress] = V; + WMAddress = (WMAddress + 1) & 0x1FFFF; +} + +static DEFWRITE(Write_2181) +{ + CPUM.timestamp += MEMCYC_FAST; + + WMAddress &= 0xFFFF00; + WMAddress |= V << 0; +} + +static DEFWRITE(Write_2182) +{ + CPUM.timestamp += MEMCYC_FAST; + + WMAddress &= 0xFF00FF; + WMAddress |= V << 8; +} + +static DEFWRITE(Write_2183) +{ + CPUM.timestamp += MEMCYC_FAST; + + WMAddress &= 0x00FFFF; + WMAddress |= (V & 1) << 16; +} + +static DEFREAD(Read_2180) +{ + uint8 ret; + + CPUM.timestamp += MEMCYC_FAST; + + ret = WRAM[WMAddress]; + WMAddress = (WMAddress + 1) & 0x1FFFF; + + return ret; +} + +// +// +// +static SNSFLoader* snsf_loader = NULL; +static SPCReader* spc_reader = NULL; + +static void Reset(bool powering_up) +{ + if(powering_up) + { + for(unsigned i = 0, p = 0xCAFEBEEF; i < sizeof(WRAM); i++, p = (p << 1) | (((p >> 31) ^ (p >> 21) ^ (p >> 1) ^ p) & 1)) + WRAM[i] = ((p + i * 3) % 192) + 32; + + //memset(WRAM, 0x02, sizeof(WRAM)); + //WRAM[0x1D0FF] = 0x0; // lufia 2... + + WRAMWritten.reset(); + } + + ICRegsReset(powering_up); + DMA_Reset(powering_up); + APU_Reset(powering_up); + PPU_Reset(powering_up); + CART_Reset(powering_up); + INPUT_Reset(powering_up); + + if(spc_reader) + APU_SetSPC(spc_reader); + + // + CPU_Reset(powering_up); + + EventReset(); + ForceEventUpdates(0); +} + +// +// +// + +static bool TestMagic(MDFNFILE *fp) +{ + if(!strcasecmp(fp->ext, "sfc") || !strcasecmp(fp->ext, "smc")) + return true; + + if(SNSFLoader::TestMagic(fp->stream())) + return true; + + if(SPCReader::TestMagic(fp->stream())) + return true; + + return false; +} + +static void Cleanup(void) +{ + if(SpecExSS) + { + delete SpecExSS; + SpecExSS = NULL; + } + + if(snsf_loader) + { + delete snsf_loader; + snsf_loader = NULL; + } + + if(spc_reader) + { + delete spc_reader; + spc_reader = NULL; + } + + APU_Kill(); + PPU_Kill(); + INPUT_Kill(); + CART_Kill(); +} + +static void Load(MDFNFILE *fp) +{ + SpecEx = MDFN_GetSettingB("snes_faust.spex"); + SpecExSoundToo = MDFN_GetSettingB("snes_faust.spex.sound"); + SpecExAudioExpected = -1; + + CPU_Init(); + + memset(CPUM.ReadFuncs, 0, sizeof(CPUM.ReadFuncs)); + memset(CPUM.WriteFuncs, 0, sizeof(CPUM.WriteFuncs)); + + memset(CPUM.ReadFuncsA, 0, sizeof(CPUM.ReadFuncsA)); + memset(CPUM.WriteFuncsA, 0, sizeof(CPUM.WriteFuncsA)); + + // + // Map in open bus. + // + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + readfunc ob_cart_r = OBRead_SLOW; + writefunc ob_cart_w = OBWrite_SLOW; + + if(bank >= 0x80) + { + ob_cart_r = OBRead_VAR; + ob_cart_w = OBWrite_VAR; + } + + if(bank <= 0x3F || (bank >= 0x80 && bank <= 0xBF)) + { + Set_A_Handlers((bank << 16) | 0x2000, (bank << 16) | 0x3FFF, OBRead_FAST, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4000, (bank << 16) | 0x41FF, OBRead_XSLOW, OBWrite_XSLOW); + Set_A_Handlers((bank << 16) | 0x4200, (bank << 16) | 0x5FFF, OBRead_FAST, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x6000, (bank << 16) | 0x7FFF, OBRead_SLOW, OBWrite_SLOW); + + Set_A_Handlers((bank << 16) | 0x8000, (bank << 16) | 0xFFFF, ob_cart_r, ob_cart_w); + } + else if(bank != 0x7E && bank != 0x7F) + Set_A_Handlers((bank << 16) | 0x0000, (bank << 16) | 0xFFFF, ob_cart_r, ob_cart_w); + } + Set_B_Handlers(0x00, 0xFF, OBRead_FAST, OBWrite_FAST); + + // + // Map WRAM and CPU registers. + // + Set_A_Handlers(0x7E0000, 0x7FFFFF, WRAMRead<0x1FFFF>, WRAMWrite<0x1FFFF>); + + Set_B_Handlers(0x80, Read_2180, Write_2180); + Set_B_Handlers(0x81, OBRead_FAST, Write_2181); + Set_B_Handlers(0x82, OBRead_FAST, Write_2182); + Set_B_Handlers(0x83, OBRead_FAST, Write_2183); + + for(unsigned bank = 0x00; bank < 0x100; bank++) + { + if(bank <= 0x3F || (bank >= 0x80 && bank <= 0xBF)) + { + Set_A_Handlers((bank << 16) | 0x0000, (bank << 16) | 0x1FFF, WRAMRead<0x1FFF>, WRAMWrite<0x1FFF>); + + Set_A_Handlers((bank << 16) | 0x4201, (bank << 16) | 0x4206, OBRead_FAST, ICRegsWrite); + Set_A_Handlers((bank << 16) | 0x420D, OBRead_FAST, ICRegsWrite); + + Set_A_Handlers((bank << 16) | 0x4214, Read_4214, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4215, Read_4215, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4216, Read_4216, OBWrite_FAST); + Set_A_Handlers((bank << 16) | 0x4217, Read_4217, OBWrite_FAST); + } + } + + if(SPCReader::TestMagic(fp->stream())) + { + spc_reader = new SPCReader(fp->stream()); + Player_Init(1, spc_reader->GameName(), spc_reader->ArtistName(), "", std::vector({ spc_reader->SongName() })); + } + else + { + if(SNSFLoader::TestMagic(fp->stream())) + { + snsf_loader = new SNSFLoader(fp->stream()); + Player_Init(1, snsf_loader->tags.GetTag("game"), snsf_loader->tags.GetTag("artist"), snsf_loader->tags.GetTag("copyright"), std::vector({ snsf_loader->tags.GetTag("title") })); + } + + CART_Init(snsf_loader ? &snsf_loader->ROM_Data : fp->stream(), EmulatedSNES_Faust.MD5); + CART_LoadNV(); + } + + DMA_Init(); + INPUT_Init(); + PPU_Init(); + APU_Init(); + + if(spc_reader) + EmulatedSNES_Faust.fps = (1U << 24) * 75; + + Reset(true); +} + +static void CloseGame(void) +{ + if(!snsf_loader) + { + try + { + CART_SaveNV(); + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + } + Cleanup(); +} + +struct event_list_entry +{ + uint32 which; + uint32 event_time; + event_list_entry *prev; + event_list_entry *next; +}; + +static event_list_entry events[SNES_EVENT__COUNT]; + +static void EventReset(void) +{ + for(unsigned i = 0; i < SNES_EVENT__COUNT; i++) + { + events[i].which = i; + + if(i == SNES_EVENT__SYNFIRST) + events[i].event_time = 0; + else if(i == SNES_EVENT__SYNLAST) + events[i].event_time = 0x7FFFFFFF; + else + events[i].event_time = SNES_EVENT_MAXTS; + + events[i].prev = (i > 0) ? &events[i - 1] : NULL; + events[i].next = (i < (SNES_EVENT__COUNT - 1)) ? &events[i + 1] : NULL; + } +} + +//static void RemoveEvent(event_list_entry *e) +//{ +// e->prev->next = e->next; +// e->next->prev = e->prev; +//} + +static void RebaseTS(const uint32 timestamp) +{ + for(unsigned i = 0; i < SNES_EVENT__COUNT; i++) + { + if(i == SNES_EVENT__SYNFIRST || i == SNES_EVENT__SYNLAST) + continue; + + assert(events[i].event_time > timestamp); + events[i].event_time -= timestamp; + } + + CPUM.next_event_ts = events[SNES_EVENT__SYNFIRST].next->event_time; +} + +void SNES_SetEventNT(const int type, const uint32 next_timestamp) +{ + assert(type > SNES_EVENT__SYNFIRST && type < SNES_EVENT__SYNLAST); + event_list_entry *e = &events[type]; + + if(next_timestamp < e->event_time) + { + event_list_entry *fe = e; + + do + { + fe = fe->prev; + } + while(next_timestamp < fe->event_time); + + // Remove this event from the list, temporarily of course. + e->prev->next = e->next; + e->next->prev = e->prev; + + // Insert into the list, just after "fe". + e->prev = fe; + e->next = fe->next; + fe->next->prev = e; + fe->next = e; + + e->event_time = next_timestamp; + } + else if(next_timestamp > e->event_time) + { + event_list_entry *fe = e; + + do + { + fe = fe->next; + } while(next_timestamp > fe->event_time); + + // Remove this event from the list, temporarily of course + e->prev->next = e->next; + e->next->prev = e->prev; + + // Insert into the list, just BEFORE "fe". + e->prev = fe->prev; + e->next = fe; + fe->prev->next = e; + fe->prev = e; + + e->event_time = next_timestamp; + } + + CPUM.next_event_ts = events[SNES_EVENT__SYNFIRST].next->event_time; // & Running); +} + +// Called from debug.cpp too. +void ForceEventUpdates(const uint32 timestamp) +{ + SNES_SetEventNT(SNES_EVENT_PPU, PPU_Update(timestamp)); + SNES_SetEventNT(SNES_EVENT_DMA_DUMMY, DMA_Update(timestamp)); + + CPUM.next_event_ts = events[SNES_EVENT__SYNFIRST].next->event_time; +} + +void CPU_Misc::EventHandler(void) +{ + event_list_entry *e = events[SNES_EVENT__SYNFIRST].next; + + while(timestamp >= e->event_time) // If Running = 0, SNES_EventHandler() may be called even if there isn't an event per-se, so while() instead of do { ... } while + { + event_list_entry *prev = e->prev; + uint32 nt; + + switch(e->which) + { + default: abort(); + + case SNES_EVENT_PPU: + nt = PPU_Update(e->event_time); + break; + + case SNES_EVENT_DMA_DUMMY: + nt = DMA_Update(e->event_time); + break; + + } +//#if SNES_EVENT_SYSTEM_CHECKS + assert(nt > e->event_time); +//#endif + + SNES_SetEventNT(e->which, nt); + + // Order of events can change due to calling SNES_SetEventNT(), this prev business ensures we don't miss an event due to reordering. + e = prev->next; + } + + //return(Running); +} + +static void NO_INLINE EmulateReal(EmulateSpecStruct* espec) +{ + APU_StartFrame(espec->SoundRate); + + if(spc_reader) + CPUM.timestamp = 286364; + else + { + const bool skip_save = espec->skip; + espec->skip |= snsf_loader != NULL; + + // Call before PPU_StartFrame(), as PPU_StartFrame() may call INPUT_AutoRead(). + INPUT_UpdatePhysicalState(); + + PPU_StartFrame(espec); + + CPU_Run(); + uint32 prev = CPUM.timestamp; + ForceEventUpdates(CPUM.timestamp); + assert(CPUM.timestamp == prev); + + espec->skip = skip_save; + } + + espec->MasterCycles = CPUM.timestamp; + + espec->SoundBufSize = APU_EndFrame(espec->SoundBuf); + if(!spc_reader) + { + PPU_ResetTS(); + RebaseTS(CPUM.timestamp); + } + CPUM.timestamp = 0; +} + +//static sha1_digest doggy; + +static void Emulate(EmulateSpecStruct* espec) +{ + if(!SpecEx || spc_reader || snsf_loader) + EmulateReal(espec); + else + { + EmulateSpecStruct tmp_espec = *espec; + + if(espec->SoundFormatChanged || espec->NeedSoundReverse) + SpecExAudioExpected = -1; + + tmp_espec.skip = true; + tmp_espec.NeedSoundReverse = false; + tmp_espec.VideoFormatChanged = false; + tmp_espec.SoundFormatChanged = false; + + if(!SpecExSS) + SpecExSS = new MemoryStream(524288); + + EmulateReal(&tmp_espec); + + MDFNSS_SaveSM(SpecExSS, true); + SpecExSS->rewind(); + + if(!espec->SoundBuf) + EmulateReal(espec); + else if(!SpecExSoundToo) + { + espec->SoundBuf += tmp_espec.SoundBufSize * 2; + EmulateReal(espec); + espec->SoundBuf -= tmp_espec.SoundBufSize * 2; + espec->SoundBufSize = tmp_espec.SoundBufSize; + } + else + { + const int expected_delta = (SpecExAudioExpected >= 0) ? SpecExAudioExpected - tmp_espec.SoundBufSize : 0; + const int sbo = (expected_delta < 0) ? -expected_delta : 0; + + //if(!expected_delta && doggy != sha1(tmp_espec.SoundBuf, tmp_espec.SoundBufSize * 2 * sizeof(int16))) + // fprintf(stderr, "Oops\n"); + + //if(expected_delta) + // fprintf(stderr, "%d\n", expected_delta); + + memmove(espec->SoundBuf, espec->SoundBuf + (tmp_espec.SoundBufSize - sbo) * 2, sbo * 2 * sizeof(int16)); + espec->SoundBuf += sbo * 2; + + EmulateReal(espec); + //doggy = sha1(espec->SoundBuf, espec->SoundBufSize * 2 * sizeof(int16)); + SpecExAudioExpected = espec->SoundBufSize; + + espec->SoundBuf -= sbo * 2; + espec->SoundBufSize += sbo; + + if(expected_delta > 0 && espec->SoundBufSize >= expected_delta) + { + espec->SoundBufSize -= expected_delta; + memmove(espec->SoundBuf, espec->SoundBuf + expected_delta * 2, espec->SoundBufSize * 2 * sizeof(int16)); + } + } + + MDFNSS_LoadSM(SpecExSS, true); + SpecExSS->rewind(); + } + + if(spc_reader || snsf_loader) + { + espec->LineWidths[0] = ~0; + Player_Draw(espec->surface, &espec->DisplayRect, 0, espec->SoundBuf, espec->SoundBufSize); + } +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: Reset(true); break; + case MDFN_MSC_RESET: Reset(false); break; + } +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + if(spc_reader) + { + APU_StateAction(sm, load, data_only); + return; + } + + SFORMAT StateRegs[] = + { + SFVAR(MemSelect), + SFARRAY(WRAM, 0x20000), + SFVAR(WRIO), + + SFVAR(Multiplicand), + SFVAR(MultProduct), + + SFVAR(Dividend), + SFVAR(DivQuotient), + SFVAR(WMAddress), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "SNES"); + + CPU_StateAction(sm, load, data_only); + DMA_StateAction(sm, load, data_only); + APU_StateAction(sm, load, data_only); + PPU_StateAction(sm, load, data_only); + CART_StateAction(sm, load, data_only); + INPUT_StateAction(sm, load, data_only); + + + if(load) + { + ForceEventUpdates(CPUM.timestamp); + } +} + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".smc", "Super Magicom ROM Image" }, + { ".swc", "Super Wildcard ROM Image" }, + { ".sfc", "SNES/SFC ROM Image" }, + + { NULL, NULL } +}; + +static const MDFNSetting Settings[] = +{ + { "snes_faust.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("Sound quality."), gettext_noop("Higher values correspond to better SNR and better preservation of higher frequencies(\"brightness\"), at the cost of increased computational complexity and a negligible increase in latency.\n\nHigher values will also slightly increase the probability of sample clipping(relevant if Mednafen's volume control settings are set too high), due to increased (time-domain) ringing."), MDFNST_INT, "3", "0", "5" }, + { "snes_faust.resamp_rate_error", MDFNSF_NOFLAGS, gettext_noop("Sound output rate tolerance."), gettext_noop("Lower values correspond to better matching of the output rate of the resampler to the actual desired output rate, at the expense of increased RAM usage and poorer CPU cache utilization."), MDFNST_FLOAT, "0.000035", "0.0000001", "0.0015" }, + + { "snes_faust.spex", MDFNSF_NOFLAGS, gettext_noop("Enable 1-frame speculative execution for video output."), gettext_noop("Hack to reduce input->output video latency by 1 frame. Enabling will increase CPU usage, and may cause video glitches(such as \"jerkiness\") in some oddball games, but most commercially-released games should be fine."), MDFNST_BOOL, "0" }, + { "snes_faust.spex.sound", MDFNSF_NOFLAGS, gettext_noop("Enable speculative execution for sound output too."), gettext_noop("Only has an effect when speculative-execution for video output is enabled. Will cause minor sound glitches in some games."), MDFNST_BOOL, "1" }, + { NULL } +}; + + +} + +using namespace MDFN_IEN_SNES_FAUST; + +MDFNGI EmulatedSNES_Faust = +{ + "snes_faust", + "SNES Faust", + KnownExtensions, + MODPRIO_INTERNAL_LOW, + //#ifdef WANT_DEBUGGER + //&SNES_DBGInfo, + //#else + NULL, + //#endif + INPUT_PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + NULL, //ToggleLayer, + NULL, + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + INPUT_Set, + NULL, + DoSimpleCommand, + Settings, + MDFN_MASTERCLOCK_FIXED(21477272.7), + 0, + + true, // Multires possible? + + // + // Note: Following video settings may be overwritten during game load. + // + 512, // lcm_width + 448, // lcm_height + NULL, // Dummy + + 292, // Nominal width + 224, // Nominal height + + 512, // Framebuffer width + 480, // Framebuffer height + // + // + // + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/snes_faust/snes.h b/Mednafen/mednafen/snes_faust/snes.h new file mode 100644 index 0000000000..5f114efe8d --- /dev/null +++ b/Mednafen/mednafen/snes_faust/snes.h @@ -0,0 +1,71 @@ +#ifndef __MDFN_SNESFAST_SNES_H +#define __MDFN_SNESFAST_SNES_H + +#include + +#define DEFREAD(x) uint8 MDFN_FASTCALL x (uint32 A) +#define DEFWRITE(x) void MDFN_FASTCALL x (uint32 A, uint8 V) + +#define MEMCYC_FAST 6 +#define MEMCYC_SLOW 8 +#define MEMCYC_XSLOW 12 + +#if 0 + #define SNES_DBG(s, ...) printf(s, ## __VA_ARGS__) +#else + static INLINE void SNES_DBG(const char* format, ...) { } +#endif + +#include "cpu.h" + +namespace MDFN_IEN_SNES_FAUST +{ +extern bool MemSelect; + +DEFREAD(OBRead_XSLOW); +DEFREAD(OBRead_SLOW); +DEFREAD(OBRead_FAST); +DEFREAD(OBRead_VAR); + +DEFWRITE(OBWrite_XSLOW); +DEFWRITE(OBWrite_SLOW); +DEFWRITE(OBWrite_FAST); +DEFWRITE(OBWrite_VAR); + +// +// Caution: B bus read/write handlers should ignore the upper 24 bits of the passed-in address +// variable. +// +void Set_B_Handlers(uint8 A1, uint8 A2, readfunc read_handler, writefunc write_handler); +static INLINE void Set_B_Handlers(uint8 A1, readfunc read_handler, writefunc write_handler) +{ + Set_B_Handlers(A1, A1, read_handler, write_handler); +} + +void Set_A_Handlers(uint32 A1, uint32 A2, readfunc read_handler, writefunc write_handler); +static INLINE void Set_A_Handlers(uint32 A1, readfunc read_handler, writefunc write_handler) +{ + Set_A_Handlers(A1, A1, read_handler, write_handler); +} + +void DMA_InitHDMA(void); +void DMA_RunHDMA(void); + +void ForceEventUpdates(const uint32 timestamp); + +enum +{ + SNES_EVENT__SYNFIRST = 0, + SNES_EVENT_PPU, + SNES_EVENT_DMA_DUMMY, + SNES_EVENT__SYNLAST, + SNES_EVENT__COUNT, +}; + +#define SNES_EVENT_MAXTS 0x20000000 +void SNES_SetEventNT(const int type, const uint32 next_timestamp); + + +} + +#endif diff --git a/Mednafen/mednafen/snes_faust/spc700.inc b/Mednafen/mednafen/snes_faust/spc700.inc new file mode 100644 index 0000000000..4bd334ac10 --- /dev/null +++ b/Mednafen/mednafen/snes_faust/spc700.inc @@ -0,0 +1,1861 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +class SPC700 final +{ + public: + + SPC700(); + ~SPC700(); + + void Reset(bool powering_up); + + // count should be > 0. + void Run(int32 count); + + void StateAction(StateMem* sm, const unsigned load, const bool data_only); + + // + // GetRegister() and SetRegister() may not be called while in/under Run() + // + enum + { + GSREG_PC = 0, + GSREG_A, + GSREG_X, + GSREG_Y, + + GSREG_PSW, + GSREG_SP + }; + INLINE unsigned GetRegister(unsigned which) + { + switch(which) + { + case GSREG_PC: return PC; + case GSREG_A: return A; + case GSREG_X: return X; + case GSREG_Y: return Y; + + case GSREG_PSW: return PSW; + case GSREG_SP: return SP; + } + } + + INLINE void SetRegister(unsigned which, unsigned value) + { + switch(which) + { + case GSREG_PC: PC = value; break; + case GSREG_A: A = value; break; + case GSREG_X: X = value; break; + case GSREG_Y: Y = value; break; + + case GSREG_PSW: PSW = value; break; + case GSREG_SP: SP = value; break; + } + } + + private: + + uint16 PC; + uint8 PSW; + uint8 A, X, Y; + uint8 SP; + uint8 Halted; + + int32 opcode_saver; + int32 cycle_counter; + + enum { N_FLAG = 0x80 }; + enum { V_FLAG = 0x40 }; + enum { P_FLAG = 0x20 }; + enum { B_FLAG = 0x10 }; + enum { H_FLAG = 0x08 }; + enum { I_FLAG = 0x04 }; + enum { Z_FLAG = 0x02 }; + enum { C_FLAG = 0x01 }; + + uint8 ReadMem(uint16); + void WriteMem(uint16, uint8); + uint8 ReadAtPC(void); + void IO(void); + + void RunReal(void); + + + // + // + // + uint8 ReadDP(uint8 addr); + void WriteDP(uint8 addr, uint8 val); + + void Push(uint8 val); + uint8 Pop(void); + + void SetZN(uint8 val); + void SetZN16(uint16 val); + // + // + // + uint8 GetEAD_Dir(void); + uint8 GetEAD_DirIdx(const uint8 index); + + uint16 GetEA_IndirIdx(void); + uint16 GetEA_IdxIndir(void); + + uint16 GetEA_Abs(void); + uint16 GetEA_AbsIdx(const uint8 index); + // + // + // + typedef void (SPC700::*gen_op)(uint8* dest, const uint8 src); + + void Op_ADC(uint8* dest, const uint8 src); + void Op_AND(uint8* dest, const uint8 src); + void Op_CMP(uint8* dest, const uint8 src); + void Op_EOR(uint8* dest, const uint8 src); + void Op_MOV(uint8* dest, const uint8 src); + void Op_OR(uint8* dest, const uint8 src); + void Op_SBC(uint8* dest, const uint8 src); + + void Instr_Indir_Indir(gen_op op); + + void Instr_IndirPI_A(gen_op op); + void Instr_Indir_A (gen_op op); + + void Instr_IndirIdx_A(gen_op op); + void Instr_IdxIndir_A(gen_op op); + + void Instr_A_Indir (gen_op op); + void Instr_A_IndirPI(gen_op op); + + void Instr_A_IndirIdx (gen_op op); + void Instr_A_IdxIndir (gen_op op); + + void Instr_Reg_Abs (uint8* dest, gen_op op); + void Instr_Reg_AbsIdx(uint8* dest, const uint8 index, gen_op op); + + void Instr_Reg_Imm (uint8* dest, gen_op op); + void Instr_Reg_Reg (uint8* dest, const uint8 src, gen_op op); + void Instr_Reg_Dir (uint8* dest, gen_op op); + void Instr_Reg_DirIdx(uint8* dest, const uint8 index, gen_op op); + + void Instr_Dir_Dir(gen_op const op); + + void Instr_DirIdx_Reg(const uint8 index, const uint8 src, gen_op op); + + void Instr_Dir_Imm(gen_op op); + void Instr_Dir_Reg(const uint8 src, gen_op op); + + void Instr_AbsIdx_A(const uint8 index, gen_op op); + + void Instr_Abs_Reg(const uint8 src, gen_op op); + // + // + // + typedef void (SPC700::*gen_sarg_op)(uint8* arg); + + void Op_ASL(uint8* arg); + void Op_LSR(uint8* arg); + void Op_ROL(uint8* arg); + void Op_ROR(uint8* arg); + + void Op_DEC(uint8* arg); + void Op_INC(uint8* arg); + + template void Op_CLR1(uint8* arg); + template void Op_SET1(uint8* arg); + + void Op_TCLR1(uint8* arg); + void Op_TSET1(uint8* arg); + + void Instr_Reg(uint8* arg, gen_sarg_op op); + void Instr_Dir(gen_sarg_op op); + void Instr_DirIdx(gen_sarg_op op); + void Instr_Abs(gen_sarg_op op); + + // + // + // + typedef void (SPC700::*mb_op)(bool bv); + + void Op_AND1(bool bv); + void Op_EOR1(bool bv); + void Op_MOV1(bool bv); + void Op_OR1(bool bv); + + uint16 GetEA_MB(unsigned* wb); + + template void Instr_C_MB(mb_op op); + + void Instr_MB_C_MOV1(void); + void Instr_MB_NOT1(void); + // + // + // + typedef void (SPC700::*word_op)(uint16* dest, const uint16 src); + + void Op_ADDW(uint16* dest, const uint16 src); + void Op_CMPW(uint16* dest, const uint16 src); + void Op_MOVW(uint16* dest, const uint16 src); + void Op_SUBW(uint16* dest, const uint16 src); + + void Instr_YA_Dir(word_op op); + void Instr_Dir_YA_MOVW(void); + + template void Instr_DECWINCW(void); + // + // + // + void Instr_DirIdx_Rel_CBNE(void); + void Instr_Dir_Rel_CBNE(void); + void Instr_Y_Rel_DBNZ(void); + void Instr_Dir_Rel_DBNZ(void); + // + // + // + void Instr_Bxx(bool cond); + template void Instr_BBx(void); + + void Instr_BRK(void); + + void Instr_JMP(void); + void Instr_JMPII(void); + + void Instr_CALL(void); + void Instr_PCALL(void); + template void Instr_TCALL(void); + + void Instr_RET(void); + void Instr_RETI(void); + + void Instr_Pop(uint8* reg); + void Instr_Push(const uint8* reg); + // + // + // + void Instr_NOP(void); + void Instr_NOTC(void); + + template void Instr_CLRx(void); + template void Instr_SETx(void); + void Instr_EI(void); + void Instr_DI(void); + + void Instr_XCN(void); + + void Instr_DAA(void); + void Instr_DAS(void); + + void Instr_DIV(void); + void Instr_MUL(void); + + void Instr_SLEEP(void) MDFN_COLD; + void Instr_STOP(void) MDFN_COLD; +}; + +static void (* MDFN_FASTCALL *SPC700_WriteMap[256])(uint16, uint8); +static uint8 (* MDFN_FASTCALL *SPC700_ReadMap[256])(uint16); +static void (*SPC700_IOHandler)(void); + +//static uint8 bazoom; + +INLINE uint8 SPC700::ReadMem(uint16 addr) +{ + //if(addr >= 0xF4 && addr <= 0xF7) + // fprintf(stderr, "%02x\n", bazoom); + + cycle_counter--; + return SPC700_ReadMap[addr >> 8][(uint8)addr](addr); +} + +INLINE void SPC700::WriteMem(uint16 addr, uint8 value) +{ + cycle_counter--; + SPC700_WriteMap[addr >> 8][(uint8)addr](addr, value); +} + +INLINE uint8 SPC700::ReadAtPC(void) +{ + cycle_counter--; + return SPC700_ReadMap[PC >> 8][(uint8)PC](PC); +} + +INLINE void SPC700::IO(void) +{ + cycle_counter--; + SPC700_IOHandler(); +} + +// +// +// + +INLINE uint8 SPC700::ReadDP(uint8 addr) +{ + return ReadMem(((PSW & P_FLAG) << 3) | addr); +} + +INLINE void SPC700::WriteDP(uint8 addr, uint8 val) +{ + WriteMem(((PSW & P_FLAG) << 3) | addr, val); +} + +INLINE void SPC700::Push(uint8 val) +{ + WriteMem((0x01 << 8) | SP, val); + SP--; +} + +INLINE uint8 SPC700::Pop(void) +{ + SP++; + return ReadMem((0x01 << 8) | SP); +} + +INLINE void SPC700::SetZN(uint8 val) +{ + PSW &= ~(Z_FLAG | N_FLAG); + PSW |= val & N_FLAG; + PSW |= ((val - 1) >> 8) & Z_FLAG; +} + +INLINE void SPC700::SetZN16(uint16 val) +{ + PSW &= ~(Z_FLAG | N_FLAG); + PSW |= (val >> 8) & N_FLAG; + PSW |= ((val - 1) >> 16) & Z_FLAG; +} + +// +// +// + +INLINE uint8 SPC700::GetEAD_Dir(void) +{ + uint8 d; + + d = ReadAtPC(); + PC++; + + return d; +} + +INLINE uint8 SPC700::GetEAD_DirIdx(const uint8 index) +{ + uint8 d; + + d = ReadAtPC(); + PC++; + + d += index; + IO(); + + return d; +} + +INLINE uint16 SPC700::GetEA_IndirIdx(void) +{ + uint8 ead = GetEAD_Dir(); + uint16 ea; + + ea = ReadDP(ead); + ead++; + ea |= ReadDP(ead) << 8; + + ea += Y; + IO(); + + return ea; +} + +INLINE uint16 SPC700::GetEA_IdxIndir(void) +{ + uint8 ead = GetEAD_Dir(); + uint16 ea; + + ead += X; + IO(); + + ea = ReadDP(ead); + ead++; + ea |= ReadDP(ead) << 8; + + return ea; +} + + +INLINE uint16 SPC700::GetEA_Abs(void) +{ + uint16 ea; + + ea = ReadAtPC(); + PC++; + + ea |= ReadAtPC() << 8; + PC++; + + return ea; +} + +INLINE uint16 SPC700::GetEA_AbsIdx(uint8 index) +{ + uint16 ea = GetEA_Abs(); + + ea += index; + IO(); + + return ea; +} + +// +// +// +INLINE void SPC700::Op_ADC(uint8* dest, const uint8 src) +{ + unsigned tmp = *dest + src + (PSW & C_FLAG); + + PSW &= ~(C_FLAG | V_FLAG | H_FLAG); + PSW |= (tmp >> 8) & C_FLAG; + PSW |= ((~(*dest ^ src) & (*dest ^ tmp)) >> 1) & V_FLAG; + PSW |= (((*dest ^ src) ^ tmp) >> 1) & H_FLAG; + + *dest = tmp; + SetZN(*dest); +} + +INLINE void SPC700::Op_AND(uint8* dest, const uint8 src) +{ + *dest &= src; + + SetZN(*dest); +} + +INLINE void SPC700::Op_CMP(uint8* dest, const uint8 src) +{ + unsigned tmp = *dest - src; + + PSW &= ~C_FLAG; + PSW |= (~tmp >> 8) & C_FLAG; + + SetZN((uint8)tmp); +} + +INLINE void SPC700::Op_EOR(uint8* dest, const uint8 src) +{ + *dest ^= src; + + SetZN(*dest); +} + +INLINE void SPC700::Op_MOV(uint8* dest, const uint8 src) +{ + *dest = src; + + if(dest == &A || dest == &X || dest == &Y) + SetZN(*dest); +} + +INLINE void SPC700::Op_OR(uint8* dest, const uint8 src) +{ + *dest |= src; + + SetZN(*dest); +} + +INLINE void SPC700::Op_SBC(uint8* dest, const uint8 src) +{ + unsigned tmp = *dest - src - (~PSW & C_FLAG); + + PSW &= ~(C_FLAG | V_FLAG | H_FLAG); + PSW |= (~tmp >> 8) & C_FLAG; + PSW |= (((*dest ^ src) & (*dest ^ tmp)) >> 1) & V_FLAG; + PSW |= (~((*dest ^ src) ^ tmp) >> 1) & H_FLAG; + + *dest = tmp; + SetZN(*dest); +} + +// +// +INLINE void SPC700::Instr_Indir_Indir(gen_op op) +{ + IO(); + + const uint8 src = ReadDP(Y); + uint8 tmp = ReadDP(X); + + (this->*op)(&tmp, src); + + if(op == &SPC700::Op_CMP) + IO(); + else + WriteDP(X, tmp); +} + +INLINE void SPC700::Instr_A_IndirPI(gen_op op) +{ + IO(); + + const uint8 src = ReadDP(X); + (this->*op)(&A, src); + + IO(); + X++; +} + +INLINE void SPC700::Instr_IndirPI_A(gen_op op) +{ + // No RMW. + uint8 tmp; + + IO(); + IO(); + + (this->*op)(&tmp, A); + WriteDP(X, tmp); + X++; +} + +INLINE void SPC700::Instr_A_Indir(gen_op op) +{ + IO(); + + const uint8 src = ReadDP(X); + (this->*op)(&A, src); +} + +INLINE void SPC700::Instr_Indir_A(gen_op op) +{ + IO(); + + uint8 tmp = ReadDP(X); + (this->*op)(&tmp, A); + WriteDP(X, tmp); +} +// +// + +INLINE void SPC700::Instr_IndirIdx_A(gen_op op) +{ + const uint16 ea = GetEA_IndirIdx(); + uint8 tmp; + + tmp = ReadMem(ea); + (this->*op)(&tmp, A); + WriteMem(ea, tmp); +} + +INLINE void SPC700::Instr_IdxIndir_A(gen_op op) +{ + const uint16 ea = GetEA_IdxIndir(); + uint8 tmp; + + tmp = ReadMem(ea); + (this->*op)(&tmp, A); + WriteMem(ea, tmp); +} + +INLINE void SPC700::Instr_A_IndirIdx(gen_op op) +{ + const uint16 ea = GetEA_IndirIdx(); + const uint8 src = ReadMem(ea); + + (this->*op)(&A, src); +} + +INLINE void SPC700::Instr_A_IdxIndir(gen_op op) +{ + const uint16 ea = GetEA_IdxIndir(); + const uint8 src = ReadMem(ea); + + (this->*op)(&A, src); +} + +INLINE void SPC700::Instr_Reg_Abs(uint8* dest, gen_op op) +{ + const uint16 ea = GetEA_Abs(); + const uint8 src = ReadMem(ea); + + (this->*op)(dest, src); +} + +INLINE void SPC700::Instr_Reg_AbsIdx(uint8* dest, const uint8 index, gen_op op) +{ + const uint16 ea = GetEA_AbsIdx(index); + const uint8 src = ReadMem(ea); + + (this->*op)(dest, src); +} + +INLINE void SPC700::Instr_Reg_Imm(uint8* dest, gen_op op) +{ + const uint8 src = ReadAtPC(); + PC++; + + (this->*op)(dest, src); +} + +INLINE void SPC700::Instr_Reg_Reg(uint8* dest, const uint8 src, gen_op op) +{ + IO(); + (this->*op)(dest, src); +} + +INLINE void SPC700::Instr_Reg_Dir(uint8* dest, gen_op op) +{ + const uint8 ead = GetEAD_Dir(); + const uint8 src = ReadDP(ead); + + (this->*op)(dest, src); +} + +INLINE void SPC700::Instr_Reg_DirIdx(uint8* dest, const uint8 index, gen_op op) +{ + const uint8 ead = GetEAD_DirIdx(index); + const uint8 src = ReadDP(ead); + + (this->*op)(dest, src); +} + +INLINE void SPC700::Instr_Dir_Dir(gen_op const op) +{ + uint8 ead; + uint8 tmp; + + ead = GetEAD_Dir(); + const uint8 src = ReadDP(ead); + + ead = GetEAD_Dir(); + + if(op != &SPC700::Op_MOV) + tmp = ReadDP(ead); + + (this->*op)(&tmp, src); + + if(op == &SPC700::Op_CMP) + IO(); + else + WriteDP(ead, tmp); +} + +INLINE void SPC700::Instr_DirIdx_Reg(const uint8 index, const uint8 src, gen_op op) +{ + const uint8 ead = GetEAD_DirIdx(index); + uint8 tmp; + + tmp = ReadDP(ead); + (this->*op)(&tmp, src); + WriteDP(ead, tmp); +} + +INLINE void SPC700::Instr_Dir_Imm(gen_op op) +{ + const uint8 src = ReadAtPC(); + PC++; + + const uint8 ead = GetEAD_Dir(); + uint8 tmp; + + tmp = ReadDP(ead); + (this->*op)(&tmp, src); + + if(op == &SPC700::Op_CMP) + IO(); + else + WriteDP(ead, tmp); +} + +INLINE void SPC700::Instr_Dir_Reg(const uint8 src, gen_op op) +{ + uint8 ead = GetEAD_Dir(); + uint8 tmp; + + tmp = ReadDP(ead); + (this->*op)(&tmp, src); + WriteDP(ead, tmp); +} + +INLINE void SPC700::Instr_AbsIdx_A(const uint8 index, gen_op op) +{ + uint16 ea = GetEA_AbsIdx(index); + uint8 tmp; + + tmp = ReadMem(ea); + (this->*op)(&tmp, A); + WriteMem(ea, tmp); +} + +INLINE void SPC700::Instr_Abs_Reg(const uint8 src, gen_op op) +{ + uint16 ea = GetEA_Abs(); + uint8 tmp; + + tmp = ReadMem(ea); + (this->*op)(&tmp, src); + WriteMem(ea, tmp); +} +// +// +// +INLINE void SPC700::Op_ASL(uint8* arg) +{ + PSW &= ~C_FLAG; + PSW |= *arg >> 7; + + *arg <<= 1; + + SetZN(*arg); +} + +INLINE void SPC700::Op_LSR(uint8* arg) +{ + PSW &= ~C_FLAG; + PSW |= *arg & C_FLAG; + + *arg >>= 1; + + SetZN(*arg); +} + +INLINE void SPC700::Op_ROL(uint8* arg) +{ + uint8 tmp = (*arg << 1) | (PSW & C_FLAG); + + PSW &= ~C_FLAG; + PSW |= *arg >> 7; + + *arg = tmp; + + SetZN(*arg); +} + +INLINE void SPC700::Op_ROR(uint8* arg) +{ + uint8 tmp = (*arg >> 1) | (PSW << 7); + + PSW &= ~C_FLAG; + PSW |= *arg & C_FLAG; + + *arg = tmp; + + SetZN(*arg); +} + +INLINE void SPC700::Op_DEC(uint8* arg) +{ + *arg -= 1; + + SetZN(*arg); +} + +INLINE void SPC700::Op_INC(uint8* arg) +{ + *arg += 1; + + SetZN(*arg); +} + + +template +INLINE void SPC700::Op_CLR1(uint8* arg) +{ + *arg &= ~(1U << wb); +} + +template +INLINE void SPC700::Op_SET1(uint8* arg) +{ + *arg |= 1U << wb; +} + +INLINE void SPC700::Op_TCLR1(uint8* arg) +{ + SetZN(A - *arg); + *arg &= ~A; +} + +INLINE void SPC700::Op_TSET1(uint8* arg) +{ + SetZN(A - *arg); + *arg |= A; +} + + + +INLINE void SPC700::Instr_Reg(uint8* arg, gen_sarg_op op) +{ + (this->*op)(arg); + IO(); +} + +INLINE void SPC700::Instr_Dir(gen_sarg_op op) +{ + uint8 ead = GetEAD_Dir(); + uint8 tmp; + + tmp = ReadDP(ead); + (this->*op)(&tmp); + WriteDP(ead, tmp); +} + +INLINE void SPC700::Instr_DirIdx(gen_sarg_op op) +{ + uint8 ead = GetEAD_DirIdx(X); + uint8 tmp; + + tmp = ReadDP(ead); + (this->*op)(&tmp); + WriteDP(ead, tmp); +} + +INLINE void SPC700::Instr_Abs(gen_sarg_op op) +{ + uint16 ea = GetEA_Abs(); + uint8 tmp; + + tmp = ReadMem(ea); + + if(op == &SPC700::Op_TCLR1 || op == &SPC700::Op_TSET1) + ReadMem(ea); // Discarded dummy read? + + (this->*op)(&tmp); + WriteMem(ea, tmp); +} +// +// +// + +INLINE void SPC700::Op_AND1(bool bv) +{ + PSW &= 0xFE | bv; +} + +INLINE void SPC700::Op_EOR1(bool bv) +{ + PSW ^= bv; +} + +INLINE void SPC700::Op_MOV1(bool bv) +{ + PSW &= ~C_FLAG; + PSW |= bv; +} + +INLINE void SPC700::Op_OR1(bool bv) +{ + PSW |= bv; +} + +INLINE uint16 SPC700::GetEA_MB(unsigned* wb) +{ + uint16 ea; + + ea = ReadAtPC(); + PC++; + + ea |= ReadAtPC() << 8; + PC++; + + *wb = ea >> 13; + ea &= 0x1FFF; + + return ea; +} + +template +INLINE void SPC700::Instr_C_MB(mb_op op) +{ + unsigned wb; + const uint16 ea = GetEA_MB(&wb); + uint8 data = ReadMem(ea); + + if(bwn) + data = ~data; + + (this->*op)((data >> wb) & 1); + + if(op == &SPC700::Op_EOR1 || op == &SPC700::Op_OR1) + IO(); +} + +INLINE void SPC700::Instr_MB_C_MOV1(void) +{ + unsigned wb; + const uint16 ea = GetEA_MB(&wb); + uint8 data = ReadMem(ea); + + data &= ~(1U << wb); + data |= (PSW & C_FLAG) << wb; + + IO(); + + WriteMem(ea, data); +} + +INLINE void SPC700::Instr_MB_NOT1(void) +{ + unsigned wb; + const uint16 ea = GetEA_MB(&wb); + uint8 data = ReadMem(ea); + + data ^= 1U << wb; + + WriteMem(ea, data); +} +// +// +// + +INLINE void SPC700::Op_ADDW(uint16* dest, const uint16 src) +{ + uint32 tmp = *dest + src; + + PSW &= ~(C_FLAG | V_FLAG | H_FLAG); + PSW |= (tmp >> 16) & C_FLAG; + PSW |= ((~(*dest ^ src) & (*dest ^ tmp)) >> 9) & V_FLAG; + PSW |= (((*dest ^ src) ^ tmp) >> 9) & H_FLAG; + + *dest = tmp; + SetZN16(*dest); +} + +INLINE void SPC700::Op_CMPW(uint16* dest, const uint16 src) +{ + uint32 tmp = *dest - src; + + PSW &= ~C_FLAG; + PSW |= (~tmp >> 16) & C_FLAG; + + SetZN16(tmp); +} + +INLINE void SPC700::Op_MOVW(uint16* dest, const uint16 src) +{ + *dest = src; + SetZN16(*dest); +} + +INLINE void SPC700::Op_SUBW(uint16* dest, const uint16 src) +{ + uint32 tmp = *dest - src; + + PSW &= ~(C_FLAG | V_FLAG | H_FLAG); + PSW |= (~tmp >> 16) & C_FLAG; + PSW |= (((*dest ^ src) & (*dest ^ tmp)) >> 9) & V_FLAG; + PSW |= (~((*dest ^ src) ^ tmp) >> 9) & H_FLAG; + + *dest = tmp; + SetZN16(*dest); +} + +INLINE void SPC700::Instr_YA_Dir(word_op op) +{ + uint8 ead = GetEAD_Dir(); + uint16 src; + uint16 ya; + + src = ReadDP(ead); + ead++; + + if(op != &SPC700::Op_CMPW) + IO(); + + src |= ReadDP(ead) << 8; + + ya = (Y << 8) | A; + (this->*op)(&ya, src); + + if(op != &SPC700::Op_CMPW) + { + A = ya; + Y = ya >> 8; + } +} + +INLINE void SPC700::Instr_Dir_YA_MOVW(void) +{ + uint8 ead = GetEAD_Dir(); + + ReadDP(ead); + WriteDP(ead, A); + ead++; + WriteDP(ead, Y); +} + +template +INLINE void SPC700::Instr_DECWINCW(void) +{ + uint8 ead = GetEAD_Dir(); + uint16 tmp; + + tmp = ReadDP(ead); + tmp += delta; + WriteDP(ead, tmp); + ead++; + + tmp += ReadDP(ead) << 8; + WriteDP(ead, tmp >> 8); + + SetZN16(tmp); +} +// +// +// + +INLINE void SPC700::Instr_DirIdx_Rel_CBNE(void) +{ + uint8 ead = GetEAD_DirIdx(X); + uint8 tmp = ReadDP(ead); + int8 r; + + r = ReadAtPC(); + PC++; + + IO(); + + if(A != tmp) + { + IO(); + IO(); + + PC += r; + } +} + +INLINE void SPC700::Instr_Dir_Rel_CBNE(void) +{ + uint8 ead = GetEAD_Dir(); + uint8 tmp = ReadDP(ead); + int8 r; + + r = ReadAtPC(); + PC++; + + IO(); + + if(A != tmp) + { + IO(); + IO(); + + PC += r; + } +} + +INLINE void SPC700::Instr_Y_Rel_DBNZ(void) +{ + int8 r; + + r = ReadAtPC(); + PC++; + + IO(); + IO(); + + Y--; + + if(Y) + { + IO(); + IO(); + + PC += r; + } +} + +INLINE void SPC700::Instr_Dir_Rel_DBNZ(void) +{ + const uint8 ead = GetEAD_Dir(); + uint8 tmp; + int8 r; + + tmp = ReadDP(ead); + tmp--; + WriteDP(ead, tmp); + + r = ReadAtPC(); + PC++; + + if(tmp) + { + IO(); + IO(); + + PC += r; + } +} + +// +// +// +INLINE void SPC700::Instr_Bxx(bool cond) +{ + int8 r; + + r = ReadAtPC(); + PC++; + + if(cond) + { + IO(); + IO(); + + PC += r; + } +} + +template +INLINE void SPC700::Instr_BBx(void) +{ + int8 r; + uint8 d; + uint8 tmp; + + d = ReadAtPC(); + PC++; + + tmp = ReadDP(d); + + r = ReadAtPC(); + PC++; + + IO(); + + if((tmp & (1U << wb)) == (tv << wb)) + { + IO(); + IO(); + + PC += r; + } +} + + +INLINE void SPC700::Instr_BRK(void) +{ + Push(PC >> 8); + Push(PC >> 0); + Push(PSW); + + PC = ReadMem(0xFFDE); + PC |= ReadMem(0xFFDF) << 8; + PSW = (PSW | B_FLAG) & ~I_FLAG; + + IO(); + IO(); +} + +INLINE void SPC700::Instr_JMP(void) +{ + uint16 new_PC; + + new_PC = ReadAtPC(); + PC++; + + new_PC |= ReadAtPC() << 8; + PC++; + + PC = new_PC; +} + +INLINE void SPC700::Instr_JMPII(void) +{ + uint16 addr; + + addr = ReadAtPC(); + PC++; + + addr |= ReadAtPC() << 8; + PC++; + + IO(); + addr += X; + + PC = ReadMem(addr); + addr++; + PC |= ReadMem(addr) << 8; +} + +INLINE void SPC700::Instr_CALL(void) +{ + uint16 new_PC; + + new_PC = ReadAtPC(); + PC++; + + new_PC |= ReadAtPC() << 8; + PC++; + + IO(); + + Push(PC >> 8); + Push(PC >> 0); + + IO(); + IO(); + PC = new_PC; +} + +INLINE void SPC700::Instr_PCALL(void) +{ + uint16 new_PC = 0xFF00; + + new_PC |= ReadAtPC(); + PC++; + + IO(); + IO(); + + Push(PC >> 8); + Push(PC >> 0); + + PC = new_PC; +} + +template +INLINE void SPC700::Instr_TCALL(void) +{ + unsigned vec = 0xFFDE - (which * 2); + + Push(PC >> 8); + Push(PC >> 0); + + IO(); + + PC = ReadMem(vec); + PC |= ReadMem(vec + 1) << 8; + + IO(); + IO(); +} + +INLINE void SPC700::Instr_RET(void) +{ + PC = Pop(); + PC |= Pop() << 8; + IO(); + IO(); +} + +INLINE void SPC700::Instr_RETI(void) +{ + PSW = Pop(); + PC = Pop(); + PC |= Pop() << 8; + IO(); + IO(); +} + +INLINE void SPC700::Instr_Pop(uint8* reg) +{ + IO(); + *reg = Pop(); + IO(); +} + +INLINE void SPC700::Instr_Push(const uint8* reg) +{ + IO(); + Push(*reg); + IO(); +} + +// +// +// +INLINE void SPC700::Instr_XCN(void) +{ + A = (A >> 4) | (A << 4); + SetZN(A); + + IO(); + IO(); + IO(); + IO(); +} + +INLINE void SPC700::Instr_DAA(void) +{ + if(A > 0x99 || (PSW & C_FLAG)) + { + A += 0x60; + PSW |= C_FLAG; + } + + if((A & 0x0F) > 0x09 || (PSW & H_FLAG)) + A += 0x06; + + SetZN(A); + + IO(); + IO(); +} + +INLINE void SPC700::Instr_DAS(void) +{ + if(A > 0x99 || !(PSW & C_FLAG)) + { + A -= 0x60; + PSW &= ~C_FLAG; + } + + if((A & 0x0F) > 0x09 || !(PSW & H_FLAG)) + A -= 0x06; + + SetZN(A); + + IO(); + IO(); +} + +INLINE void SPC700::Instr_DIV(void) +{ + // A = YA / X, Y = YA % X + unsigned divisor_adj = X << 24; + unsigned result = ((Y << 8) | A) << 15; + + PSW &= ~H_FLAG; + PSW |= (~((Y & 0xF) - (X & 0xF)) >> 1) & H_FLAG; + + for(unsigned i = 9; i; i--) + { + bool c = result >> 31; + + result <<= 1; + + if((result >= divisor_adj) ^ c) + result -= divisor_adj - 1; + } + + A = result; + Y = result >> 24; + + SetZN(A); + + PSW &= ~V_FLAG; + PSW |= (result >> 2) & V_FLAG; + + for(unsigned i = 11; i; i--) + IO(); +} + +INLINE void SPC700::Instr_MUL(void) +{ + uint16 result = Y * A; + + A = result; + Y = result >> 8; + + SetZN(Y); + + for(unsigned i = 8; i; i--) + IO(); +} + +INLINE void SPC700::Instr_NOP(void) +{ + IO(); +} + +INLINE void SPC700::Instr_SLEEP(void) +{ + fprintf(stderr, "[SPC700] SLEEP\n"); + Halted = true; +} + +INLINE void SPC700::Instr_STOP(void) +{ + fprintf(stderr, "[SPC700] STOP\n"); + Halted = true; +} + +// +// +// +template +INLINE void SPC700::Instr_CLRx(void) +{ + IO(); + PSW &= ~mask; +} + +template +INLINE void SPC700::Instr_SETx(void) +{ + IO(); + PSW |= mask; +} + +INLINE void SPC700::Instr_NOTC(void) +{ + IO(); + PSW ^= C_FLAG; + IO(); +} + +INLINE void SPC700::Instr_EI(void) +{ + IO(); + PSW |= I_FLAG; + IO(); +} + +INLINE void SPC700::Instr_DI(void) +{ + IO(); + PSW &= ~I_FLAG; + IO(); +} + +#if 0 +static const uint8 CycleCheckTable[256] = +{ + 0x02, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x06, 0x05, 0x04, 0x05, 0x04, 0x06, 0x08, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x05, 0x02, 0x02, 0x04, 0x06, + 0x02, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x06, 0x05, 0x04, 0x05, 0x04, 0x85, 0x04, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x06, 0x05, 0x02, 0x02, 0x03, 0x08, + 0x02, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x06, 0x04, 0x04, 0x05, 0x04, 0x06, 0x06, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x04, 0x05, 0x02, 0x02, 0x04, 0x03, + 0x02, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x06, 0x04, 0x04, 0x05, 0x04, 0x85, 0x05, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x02, 0x02, 0x03, 0x06, + 0x02, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x06, 0x05, 0x04, 0x05, 0x02, 0x04, 0x05, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x02, 0x02, 0x0c, 0x05, + 0x03, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x06, 0x04, 0x04, 0x05, 0x02, 0x04, 0x04, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x02, 0x02, 0x03, 0x04, + 0x03, 0x08, 0x04, 0x85, 0x04, 0x05, 0x04, 0x07, 0x02, 0x05, 0x06, 0x04, 0x05, 0x02, 0x04, 0x09, + 0x82, 0x08, 0x04, 0x85, 0x05, 0x06, 0x06, 0x07, 0x04, 0x05, 0x05, 0x05, 0x02, 0x02, 0x86, 0x03, + 0x02, 0x08, 0x04, 0x85, 0x03, 0x04, 0x03, 0x06, 0x02, 0x04, 0x05, 0x03, 0x04, 0x03, 0x04, 0x00, + 0x82, 0x08, 0x04, 0x85, 0x04, 0x05, 0x05, 0x06, 0x03, 0x04, 0x05, 0x04, 0x02, 0x02, 0x84, 0x00, +}; +#endif + +static const uint8 CycleHackyTable[256] = +{ + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x05, 0x04, 0x03, 0x04, 0x01, 0x05, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x04, 0x01, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x05, 0x04, 0x03, 0x04, 0x01, 0x04, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x05, 0x04, 0x01, 0x01, 0x02, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x05, 0x03, 0x03, 0x04, 0x01, 0x05, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x03, 0x04, 0x01, 0x01, 0x03, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x05, 0x03, 0x03, 0x04, 0x01, 0x04, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x01, 0x01, 0x02, 0x01, + + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x05, 0x04, 0x03, 0x04, 0x01, 0x01, 0x04, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x05, 0x03, 0x03, 0x04, 0x01, 0x01, 0x03, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x01, 0x01, 0x01, 0x03, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x03, 0x06, 0x01, 0x04, 0x05, 0x03, 0x04, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x03, 0x04, 0x04, 0x04, 0x01, 0x01, 0x05, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x02, 0x03, 0x02, 0x05, 0x01, 0x03, 0x04, 0x02, 0x03, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x02, 0x03, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01, +}; + +INLINE void SPC700::RunReal(void) +{ + uint8 opcode; + + if(MDFN_UNLIKELY(Halted)) + { + HaltedBalted: + + while(cycle_counter > 0) + IO(); + + return; + } + + if(MDFN_UNLIKELY(opcode_saver >= 0)) + { + opcode = opcode_saver; + opcode_saver = -1; + goto SkipOpcode; + } + + for(;;) + { + opcode = ReadAtPC(); + //bazoom = opcode; + //fprintf(stderr, "Instr: %04x, %02x --- A=0x%02x, X=0x%02x, Y=0x%02x, PSW=0x%02x, SP=0x%02x\n", PC, opcode, A, X, Y, PSW, SP); + PC++; + + SkipOpcode:; + if(MDFN_UNLIKELY(cycle_counter < CycleHackyTable[opcode])) + { + opcode_saver = opcode; + break; + } + + switch(opcode) + { + case 0x00: Instr_NOP(); break; + + case 0x20: Instr_CLRx(); break; // CLRP + case 0x60: Instr_CLRx(); break; // CLRC + case 0xE0: Instr_CLRx(); break; // CLRV + + case 0x40: Instr_SETx(); break; // SETP + case 0x80: Instr_SETx(); break; // SETC + + case 0xED: Instr_NOTC(); break; + + case 0xA0: Instr_EI(); break; + case 0xC0: Instr_DI(); break; + + case 0x2F: Instr_Bxx( true ); break; // BRA + case 0x10: Instr_Bxx(!(PSW & N_FLAG)); break; // BPL + case 0x30: Instr_Bxx( (PSW & N_FLAG)); break; // BMI + case 0x50: Instr_Bxx(!(PSW & V_FLAG)); break; // BVC + case 0x70: Instr_Bxx( (PSW & V_FLAG)); break; // BVS + case 0x90: Instr_Bxx(!(PSW & C_FLAG)); break; // BCC + case 0xB0: Instr_Bxx( (PSW & C_FLAG)); break; // BCS + case 0xD0: Instr_Bxx(!(PSW & Z_FLAG)); break; // BNE + case 0xF0: Instr_Bxx( (PSW & Z_FLAG)); break; // BEQ + + // BBS + case 0x03: Instr_BBx<0, true>(); break; + case 0x23: Instr_BBx<1, true>(); break; + case 0x43: Instr_BBx<2, true>(); break; + case 0x63: Instr_BBx<3, true>(); break; + case 0x83: Instr_BBx<4, true>(); break; + case 0xA3: Instr_BBx<5, true>(); break; + case 0xC3: Instr_BBx<6, true>(); break; + case 0xE3: Instr_BBx<7, true>(); break; + + // BBC + case 0x13: Instr_BBx<0, false>(); break; + case 0x33: Instr_BBx<1, false>(); break; + case 0x53: Instr_BBx<2, false>(); break; + case 0x73: Instr_BBx<3, false>(); break; + case 0x93: Instr_BBx<4, false>(); break; + case 0xB3: Instr_BBx<5, false>(); break; + case 0xD3: Instr_BBx<6, false>(); break; + case 0xF3: Instr_BBx<7, false>(); break; + + case 0xDE: Instr_DirIdx_Rel_CBNE(); break; + case 0x2E: Instr_Dir_Rel_CBNE(); break; + + case 0xFE: Instr_Y_Rel_DBNZ(); break; + case 0x6E: Instr_Dir_Rel_DBNZ(); break; + + case 0x01: Instr_TCALL<0x0>(); break; + case 0x11: Instr_TCALL<0x1>(); break; + case 0x21: Instr_TCALL<0x2>(); break; + case 0x31: Instr_TCALL<0x3>(); break; + case 0x41: Instr_TCALL<0x4>(); break; + case 0x51: Instr_TCALL<0x5>(); break; + case 0x61: Instr_TCALL<0x6>(); break; + case 0x71: Instr_TCALL<0x7>(); break; + case 0x81: Instr_TCALL<0x8>(); break; + case 0x91: Instr_TCALL<0x9>(); break; + case 0xA1: Instr_TCALL<0xA>(); break; + case 0xB1: Instr_TCALL<0xB>(); break; + case 0xC1: Instr_TCALL<0xC>(); break; + case 0xD1: Instr_TCALL<0xD>(); break; + case 0xE1: Instr_TCALL<0xE>(); break; + case 0xF1: Instr_TCALL<0xF>(); break; + + case 0x3F: Instr_CALL(); break; + case 0x4F: Instr_PCALL(); break; + + case 0x6F: Instr_RET(); break; + case 0x7F: Instr_RETI(); break; + + case 0x0F: Instr_BRK(); break; + + case 0x1F: Instr_JMPII(); break; + case 0x5F: Instr_JMP(); break; + + +#define MATH_BLOCK(base, op) \ + case (base + 0x19): Instr_Indir_Indir(&SPC700::Op_##op); break; \ + case (base + 0x08): Instr_Reg_Imm (&A, &SPC700::Op_##op); break; \ + case (base + 0x06): Instr_A_Indir (&SPC700::Op_##op); break; \ + case (base + 0x17): Instr_A_IndirIdx (&SPC700::Op_##op); break; \ + case (base + 0x07): Instr_A_IdxIndir (&SPC700::Op_##op); break; \ + case (base + 0x04): Instr_Reg_Dir (&A, &SPC700::Op_##op); break; \ + case (base + 0x14): Instr_Reg_DirIdx (&A, X, &SPC700::Op_##op); break; \ + case (base + 0x05): Instr_Reg_Abs (&A, &SPC700::Op_##op); break; \ + case (base + 0x15): Instr_Reg_AbsIdx (&A, X, &SPC700::Op_##op); break; \ + case (base + 0x16): Instr_Reg_AbsIdx (&A, Y, &SPC700::Op_##op); break; \ + case (base + 0x09): Instr_Dir_Dir (&SPC700::Op_##op); break; \ + case (base + 0x18): Instr_Dir_Imm (&SPC700::Op_##op); break; + + MATH_BLOCK(0x00, OR) + MATH_BLOCK(0x20, AND) + MATH_BLOCK(0x40, EOR) + MATH_BLOCK(0x60, CMP) + MATH_BLOCK(0x80, ADC) + MATH_BLOCK(0xA0, SBC) + + // CMP (extra) + case 0xC8: Instr_Reg_Imm(&X, &SPC700::Op_CMP); break; + case 0x3E: Instr_Reg_Dir(&X, &SPC700::Op_CMP); break; + case 0x1E: Instr_Reg_Abs(&X, &SPC700::Op_CMP); break; + + case 0xAD: Instr_Reg_Imm(&Y, &SPC700::Op_CMP); break; + case 0x7E: Instr_Reg_Dir(&Y, &SPC700::Op_CMP); break; + case 0x5E: Instr_Reg_Abs(&Y, &SPC700::Op_CMP); break; + + + // + // MOV + // + case 0xAF: Instr_IndirPI_A(&SPC700::Op_MOV); break; + case 0xC6: Instr_Indir_A (&SPC700::Op_MOV); break; + + case 0xD7: Instr_IndirIdx_A(&SPC700::Op_MOV); break; + case 0xC7: Instr_IdxIndir_A(&SPC700::Op_MOV); break; + + case 0xE8: Instr_Reg_Imm (&A, &SPC700::Op_MOV); break; + case 0xE6: Instr_A_Indir (&SPC700::Op_MOV); break; + case 0xBF: Instr_A_IndirPI(&SPC700::Op_MOV); break; + + case 0xF7: Instr_A_IndirIdx (&SPC700::Op_MOV); break; + case 0xE7: Instr_A_IdxIndir (&SPC700::Op_MOV); break; + + case 0x7D: Instr_Reg_Reg(&A, X, &SPC700::Op_MOV); break; + case 0xDD: Instr_Reg_Reg(&A, Y, &SPC700::Op_MOV); break; + + case 0xE4: Instr_Reg_Dir (&A, &SPC700::Op_MOV); break; + case 0xF4: Instr_Reg_DirIdx(&A, X, &SPC700::Op_MOV); break; + + case 0xE5: Instr_Reg_Abs (&A, &SPC700::Op_MOV); break; + case 0xF5: Instr_Reg_AbsIdx(&A, X, &SPC700::Op_MOV); break; + case 0xF6: Instr_Reg_AbsIdx(&A, Y, &SPC700::Op_MOV); break; + + case 0xBD: Instr_Reg_Reg(&SP, X, &SPC700::Op_MOV); break; + + case 0xCD: Instr_Reg_Imm (&X, &SPC700::Op_MOV); break; + case 0x5D: Instr_Reg_Reg (&X, A, &SPC700::Op_MOV); break; + case 0x9D: Instr_Reg_Reg (&X, SP, &SPC700::Op_MOV); break; + case 0xF8: Instr_Reg_Dir (&X, &SPC700::Op_MOV); break; + case 0xF9: Instr_Reg_DirIdx(&X, Y, &SPC700::Op_MOV); break; + case 0xE9: Instr_Reg_Abs (&X, &SPC700::Op_MOV); break; + + case 0x8D: Instr_Reg_Imm (&Y, &SPC700::Op_MOV); break; + case 0xFD: Instr_Reg_Reg (&Y, A, &SPC700::Op_MOV); break; + case 0xEB: Instr_Reg_Dir (&Y, &SPC700::Op_MOV); break; + case 0xFB: Instr_Reg_DirIdx(&Y, X, &SPC700::Op_MOV); break; + case 0xEC: Instr_Reg_Abs (&Y, &SPC700::Op_MOV); break; + + case 0xFA: Instr_Dir_Dir(&SPC700::Op_MOV); break; + + case 0xD4: Instr_DirIdx_Reg(X, A, &SPC700::Op_MOV); break; + case 0xDB: Instr_DirIdx_Reg(X, Y, &SPC700::Op_MOV); break; + case 0xD9: Instr_DirIdx_Reg(Y, X, &SPC700::Op_MOV); break; + + case 0x8F: Instr_Dir_Imm(&SPC700::Op_MOV); break; + case 0xC4: Instr_Dir_Reg(A, &SPC700::Op_MOV); break; + case 0xD8: Instr_Dir_Reg(X, &SPC700::Op_MOV); break; + case 0xCB: Instr_Dir_Reg(Y, &SPC700::Op_MOV); break; + + case 0xD5: Instr_AbsIdx_A(X, &SPC700::Op_MOV); break; + case 0xD6: Instr_AbsIdx_A(Y, &SPC700::Op_MOV); break; + + case 0xC5: Instr_Abs_Reg(A, &SPC700::Op_MOV); break; + case 0xC9: Instr_Abs_Reg(X, &SPC700::Op_MOV); break; + case 0xCC: Instr_Abs_Reg(Y, &SPC700::Op_MOV); break; + // + // + // + case 0x7A: Instr_YA_Dir(&SPC700::Op_ADDW); break; + case 0x5A: Instr_YA_Dir(&SPC700::Op_CMPW); break; + case 0xBA: Instr_YA_Dir(&SPC700::Op_MOVW); break; + case 0xDA: Instr_Dir_YA_MOVW(); break; + case 0x9A: Instr_YA_Dir(&SPC700::Op_SUBW); break; + + case 0x1A: Instr_DECWINCW<-1>(); break; // DECW + case 0x3A: Instr_DECWINCW< 1>(); break; // INCW + // + // + // + + case 0xAE: Instr_Pop(&A); break; + case 0x8E: Instr_Pop(&PSW); break; + case 0xCE: Instr_Pop(&X); break; + case 0xEE: Instr_Pop(&Y); break; + + case 0x2D: Instr_Push(&A); break; + case 0x0D: Instr_Push(&PSW); break; + case 0x4D: Instr_Push(&X); break; + case 0x6D: Instr_Push(&Y); break; + + // + // + // + + case 0x0A: Instr_C_MB(&SPC700::Op_OR1); break; + case 0x2A: Instr_C_MB (&SPC700::Op_OR1); break; + case 0x4A: Instr_C_MB(&SPC700::Op_AND1); break; + case 0x6A: Instr_C_MB (&SPC700::Op_AND1); break; + case 0x8A: Instr_C_MB(&SPC700::Op_EOR1); break; + case 0xAA: Instr_C_MB(&SPC700::Op_MOV1); break; + + case 0xCA: Instr_MB_C_MOV1(); break; + case 0xEA: Instr_MB_NOT1(); break; + + // ASL + case 0x1C: Instr_Reg (&A, &SPC700::Op_ASL); break; + case 0x0B: Instr_Dir (&SPC700::Op_ASL); break; + case 0x1B: Instr_DirIdx(&SPC700::Op_ASL); break; + case 0x0C: Instr_Abs (&SPC700::Op_ASL); break; + + // ROL + case 0x3C: Instr_Reg (&A, &SPC700::Op_ROL); break; + case 0x2B: Instr_Dir (&SPC700::Op_ROL); break; + case 0x3B: Instr_DirIdx(&SPC700::Op_ROL); break; + case 0x2C: Instr_Abs (&SPC700::Op_ROL); break; + + // LSR + case 0x5C: Instr_Reg (&A, &SPC700::Op_LSR); break; + case 0x4B: Instr_Dir (&SPC700::Op_LSR); break; + case 0x5B: Instr_DirIdx(&SPC700::Op_LSR); break; + case 0x4C: Instr_Abs (&SPC700::Op_LSR); break; + + // ROR + case 0x7C: Instr_Reg (&A, &SPC700::Op_ROR); break; + case 0x6B: Instr_Dir (&SPC700::Op_ROR); break; + case 0x7B: Instr_DirIdx(&SPC700::Op_ROR); break; + case 0x6C: Instr_Abs (&SPC700::Op_ROR); break; + + // DEC + case 0x9C: Instr_Reg (&A, &SPC700::Op_DEC); break; + case 0x1D: Instr_Reg (&X, &SPC700::Op_DEC); break; + case 0xDC: Instr_Reg (&Y, &SPC700::Op_DEC); break; + case 0x8B: Instr_Dir (&SPC700::Op_DEC); break; + case 0x9B: Instr_DirIdx(&SPC700::Op_DEC); break; + case 0x8C: Instr_Abs (&SPC700::Op_DEC); break; + + // INC + case 0xBC: Instr_Reg (&A, &SPC700::Op_INC); break; + case 0x3D: Instr_Reg (&X, &SPC700::Op_INC); break; + case 0xFC: Instr_Reg (&Y, &SPC700::Op_INC); break; + case 0xAB: Instr_Dir (&SPC700::Op_INC); break; + case 0xBB: Instr_DirIdx(&SPC700::Op_INC); break; + case 0xAC: Instr_Abs (&SPC700::Op_INC); break; + + // CLR1 + case 0x12: Instr_Dir(&SPC700::Op_CLR1<0>); break; + case 0x32: Instr_Dir(&SPC700::Op_CLR1<1>); break; + case 0x52: Instr_Dir(&SPC700::Op_CLR1<2>); break; + case 0x72: Instr_Dir(&SPC700::Op_CLR1<3>); break; + case 0x92: Instr_Dir(&SPC700::Op_CLR1<4>); break; + case 0xB2: Instr_Dir(&SPC700::Op_CLR1<5>); break; + case 0xD2: Instr_Dir(&SPC700::Op_CLR1<6>); break; + case 0xF2: Instr_Dir(&SPC700::Op_CLR1<7>); break; + + // SET1 + case 0x02: Instr_Dir(&SPC700::Op_SET1<0>); break; + case 0x22: Instr_Dir(&SPC700::Op_SET1<1>); break; + case 0x42: Instr_Dir(&SPC700::Op_SET1<2>); break; + case 0x62: Instr_Dir(&SPC700::Op_SET1<3>); break; + case 0x82: Instr_Dir(&SPC700::Op_SET1<4>); break; + case 0xA2: Instr_Dir(&SPC700::Op_SET1<5>); break; + case 0xC2: Instr_Dir(&SPC700::Op_SET1<6>); break; + case 0xE2: Instr_Dir(&SPC700::Op_SET1<7>); break; + + case 0x4E: Instr_Abs(&SPC700::Op_TCLR1); break; + case 0x0E: Instr_Abs(&SPC700::Op_TSET1); break; + + // + // + // + case 0x9F: Instr_XCN(); break; + + case 0xDF: Instr_DAA(); break; + case 0xBE: Instr_DAS(); break; + + case 0x9E: Instr_DIV(); break; + case 0xCF: Instr_MUL(); break; + + case 0xEF: Instr_SLEEP(); goto HaltedBalted; + case 0xFF: Instr_STOP(); goto HaltedBalted; + } + +#if 0 + { + int elapsed = counter_before - cycle_counter; + + assert( + (elapsed == (CycleCheckTable[opcode] & 0x7F)) || + ((CycleCheckTable[opcode] & 0x80) && (elapsed == (2 + (CycleCheckTable[opcode] & 0x7F)))) + ); + } +#endif + } +} + +INLINE void SPC700::Run(int32 cycles) +{ + SPC700 l = *this; + l.cycle_counter += cycles; + l.RunReal(); + *this = l; +} + + +void SPC700::Reset(bool powering_up) +{ + PC = 0xFFC0; // FIXME FIXME FIXME, read the vector properly! + A = X = Y = 0; + PSW = I_FLAG; + SP = 0xFF; + + Halted = false; + opcode_saver = -1; + cycle_counter = 0; +} + +void SPC700::StateAction(StateMem* sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PC), + SFVAR(PSW), + SFVAR(A), + SFVAR(X), + SFVAR(Y), + SFVAR(SP), + SFVAR(Halted), + + SFVAR(opcode_saver), + SFVAR(cycle_counter), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "SPC700"); + + if(load) + { + if(cycle_counter < -1000 || cycle_counter > 1000) // Sanity check. + cycle_counter = 0; + } +} + +SPC700::SPC700() +{ + +} + +SPC700::~SPC700() +{ + +} + diff --git a/Mednafen/mednafen/sound/Blip_Buffer.cpp b/Mednafen/mednafen/sound/Blip_Buffer.cpp new file mode 100644 index 0000000000..f04a1fc599 --- /dev/null +++ b/Mednafen/mednafen/sound/Blip_Buffer.cpp @@ -0,0 +1,457 @@ +// Blip_Buffer 0.4.1. http://www.slack.net/~ant/ + +#include "Blip_Buffer.h" + +#include +#include +#include +#include +#include +#include + +/* Copyright (C) 2003-2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#ifdef BLARGG_ENABLE_OPTIMIZER + #include BLARGG_ENABLE_OPTIMIZER +#endif + +int const silent_buf_size = 1; // size used for Silent_Blip_Buffer + +Blip_Buffer::Blip_Buffer() +{ + factor_ = (blip_u64)ULLONG_MAX; + offset_ = 0; + buffer_ = 0; + buffer_size_ = 0; + sample_rate_ = 0; + reader_accum_ = 0; + bass_shift_ = 0; + clock_rate_ = 0; + bass_freq_ = 16; + length_ = 0; + + // assumptions code makes about implementation-defined features + #ifndef NDEBUG + // right shift of negative value preserves sign + buf_t_ i = -0x7FFFFFFE; + assert( (i >> 1) == -0x3FFFFFFF ); + + // casting to short truncates to 16 bits and sign-extends + i = 0x18000; + assert( (short) i == -0x8000 ); + #endif +} + +Blip_Buffer::~Blip_Buffer() +{ + if ( buffer_size_ != silent_buf_size ) + free( buffer_ ); +} + +Silent_Blip_Buffer::Silent_Blip_Buffer() +{ + factor_ = 0; + buffer_ = buf; + buffer_size_ = silent_buf_size; + memset( buf, 0, sizeof buf ); // in case machine takes exception for signed overflow +} + +void Blip_Buffer::clear( int entire_buffer ) +{ + offset_ = 0; + reader_accum_ = 0; + modified_ = 0; + if ( buffer_ ) + { + long count = (entire_buffer ? buffer_size_ : samples_avail()); + memset( buffer_, 0, (count + blip_buffer_extra_) * sizeof (buf_t_) ); + } +} + +Blip_Buffer::blargg_err_t Blip_Buffer::set_sample_rate( long new_rate, int msec ) +{ + if ( buffer_size_ == silent_buf_size ) + { + assert( 0 ); + return "Internal (tried to resize Silent_Blip_Buffer)"; + } + + // start with maximum length that resampled time can represent + blip_s64 new_size = (ULLONG_MAX >> BLIP_BUFFER_ACCURACY) - blip_buffer_extra_ - 64; + + // simple safety check, since code elsewhere may not be safe for sizes approaching (2 ^ 31). + if(new_size > ((1LL << 30) - 1)) + new_size = (1LL << 30) - 1; + + if ( msec != blip_max_length ) + { + blip_s64 s = ((blip_s64)new_rate * (msec + 1) + 999) / 1000; + if ( s < new_size ) + new_size = s; + else + assert( 0 ); // fails if requested buffer length exceeds limit + } + + if ( buffer_size_ != new_size ) + { + void* p = realloc( buffer_, (new_size + blip_buffer_extra_) * sizeof *buffer_ ); + if ( !p ) + return "Out of memory"; + + //if(new_size > buffer_size_) + // memset(buffer_ + buffer_size_, 0, (new_size + blip_buffer_extra_) * sizeof *buffer_ + + buffer_ = (buf_t_*) p; + } + + buffer_size_ = new_size; + assert( buffer_size_ != silent_buf_size ); + + // update things based on the sample rate + sample_rate_ = new_rate; + length_ = new_size * 1000 / new_rate - 1; + if ( msec ) + assert( length_ == msec ); // ensure length is same as that passed in + if ( clock_rate_ ) + clock_rate( clock_rate_ ); + bass_freq( bass_freq_ ); + + clear(); + + return 0; // success +} + +blip_resampled_time_t Blip_Buffer::clock_rate_factor( long rate ) const +{ + double ratio = (double) sample_rate_ / rate; + blip_s64 factor = (blip_s64) floor( ratio * (1LL << BLIP_BUFFER_ACCURACY) + 0.5 ); + assert( factor > 0 || !sample_rate_ ); // fails if clock/output ratio is too large + return (blip_resampled_time_t) factor; +} + +void Blip_Buffer::bass_freq( int freq ) +{ + bass_freq_ = freq; + int shift = 31; + if ( freq > 0 ) + { + shift = 13; + long f = (freq << 16) / sample_rate_; + while ( (f >>= 1) && --shift ) { } + } + bass_shift_ = shift; + //printf("%d\n", bass_shift_); +} + +void Blip_Buffer::end_frame( blip_time_t t ) +{ + offset_ += t * factor_; + assert( samples_avail() <= (long) buffer_size_ ); // time outside buffer length +} + +void Blip_Buffer::remove_silence( long count ) +{ + assert( count <= samples_avail() ); // tried to remove more samples than available + offset_ -= (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY; +} + +long Blip_Buffer::count_samples( blip_time_t t ) const +{ + unsigned long last_sample = resampled_time( t ) >> BLIP_BUFFER_ACCURACY; + unsigned long first_sample = offset_ >> BLIP_BUFFER_ACCURACY; + return (long) (last_sample - first_sample); +} + +blip_time_t Blip_Buffer::count_clocks( long count ) const +{ + if ( !factor_ ) + { + assert( 0 ); // sample rate and clock rates must be set first + return 0; + } + + if ( count > buffer_size_ ) + count = buffer_size_; + blip_resampled_time_t time = (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY; + return (blip_time_t) ((time - offset_ + factor_ - 1) / factor_); +} + +void Blip_Buffer::remove_samples( long count ) +{ + if ( count ) + { + remove_silence( count ); + + // copy remaining samples to beginning and clear old samples + long remain = samples_avail() + blip_buffer_extra_; + memmove( buffer_, buffer_ + count, remain * sizeof *buffer_ ); + memset( buffer_ + remain, 0, count * sizeof *buffer_ ); + } +} + +// Blip_Synth_ + +Blip_Synth_Fast_::Blip_Synth_Fast_() +{ + buf = 0; + last_amp = 0; + delta_factor = 0; +} + +void Blip_Synth_Fast_::volume_unit( double new_unit ) +{ + delta_factor = int (new_unit * (1L << blip_sample_bits) + 0.5); +} + +#if !BLIP_BUFFER_FAST + +Blip_Synth_::Blip_Synth_( short* p, int w ) : + impulses( p ), + width( w ) +{ + volume_unit_ = 0.0; + kernel_unit = 0; + buf = 0; + last_amp = 0; + delta_factor = 0; +} + +#undef PI +#define PI 3.1415926535897932384626433832795029 + +static void gen_sinc( float* out, int count, double oversample, double treble, double cutoff ) +{ + if ( cutoff >= 0.999 ) + cutoff = 0.999; + + if ( treble < -300.0 ) + treble = -300.0; + if ( treble > 5.0 ) + treble = 5.0; + + double const maxh = 4096.0; + double const rolloff = pow( 10.0, 1.0 / (maxh * 20.0) * treble / (1.0 - cutoff) ); + double const pow_a_n = pow( rolloff, maxh - maxh * cutoff ); + double const to_angle = PI / 2 / maxh / oversample; + for ( int i = 0; i < count; i++ ) + { + double angle = ((i - count) * 2 + 1) * to_angle; + double c = rolloff * cos( (maxh - 1.0) * angle ) - cos( maxh * angle ); + double cos_nc_angle = cos( maxh * cutoff * angle ); + double cos_nc1_angle = cos( (maxh * cutoff - 1.0) * angle ); + double cos_angle = cos( angle ); + + c = c * pow_a_n - rolloff * cos_nc1_angle + cos_nc_angle; + double d = 1.0 + rolloff * (rolloff - cos_angle - cos_angle); + double b = 2.0 - cos_angle - cos_angle; + double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle; + + out [i] = (float) ((a * d + c * b) / (b * d)); // a / b + c / d + } +} + +void blip_eq_t::generate( float* out, int count ) const +{ + // lower cutoff freq for narrow kernels with their wider transition band + // (8 points->1.49, 16 points->1.15) + double oversample = blip_res * 2.25 / count + 0.85; + double half_rate = sample_rate * 0.5; + if ( cutoff_freq ) + oversample = half_rate / cutoff_freq; + double cutoff = rolloff_freq * oversample / half_rate; + + gen_sinc( out, count, blip_res * oversample, treble, cutoff ); + + // apply (half of) hamming window + double to_fraction = PI / (count - 1); + for ( int i = count; i--; ) + out [i] *= 0.54f - 0.46f * (float) cos( i * to_fraction ); +} + +void Blip_Synth_::adjust_impulse() +{ + // sum pairs for each phase and add error correction to end of first half + int const size = impulses_size(); + for ( int p = blip_res; p-- >= blip_res / 2; ) + { + int p2 = blip_res - 2 - p; + long error = kernel_unit; + for ( int i = 1; i < size; i += blip_res ) + { + error -= impulses [i + p ]; + error -= impulses [i + p2]; + } + if ( p == p2 ) + error /= 2; // phase = 0.5 impulse uses same half for both sides + impulses [size - blip_res + p] += (short) error; + //printf( "error: %ld\n", error ); + } + + //for ( int i = blip_res; i--; printf( "\n" ) ) + // for ( int j = 0; j < width / 2; j++ ) + // printf( "%5ld,", impulses [j * blip_res + i + 1] ); +} + +void Blip_Synth_::treble_eq( blip_eq_t const& eq ) +{ + float fimpulse [blip_res / 2 * (blip_widest_impulse_ - 1) + blip_res * 2]; + + int const half_size = blip_res / 2 * (width - 1); + eq.generate( &fimpulse [blip_res], half_size ); + + int i; + + // need mirror slightly past center for calculation + for ( i = blip_res; i--; ) + fimpulse [blip_res + half_size + i] = fimpulse [blip_res + half_size - 1 - i]; + + // starts at 0 + for ( i = 0; i < blip_res; i++ ) + fimpulse [i] = 0.0f; + + // find rescale factor + double total = 0.0; + for ( i = 0; i < half_size; i++ ) + total += fimpulse [blip_res + i]; + + //double const base_unit = 44800.0 - 128 * 18; // allows treble up to +0 dB + //double const base_unit = 37888.0; // allows treble to +5 dB + double const base_unit = 32768.0; // necessary for blip_unscaled to work + double rescale = base_unit / 2 / total; + kernel_unit = (long) base_unit; + + // integrate, first difference, rescale, convert to int + double sum = 0.0; + double next = 0.0; + int const impulses_size_local = this->impulses_size(); + for ( i = 0; i < impulses_size_local; i++ ) + { + impulses [i] = (short) floor( (next - sum) * rescale + 0.5 ); + sum += fimpulse [i]; + next += fimpulse [i + blip_res]; + } + adjust_impulse(); + + // volume might require rescaling + double vol = volume_unit_; + if ( vol ) + { + volume_unit_ = 0.0; + volume_unit( vol ); + } +} + +void Blip_Synth_::volume_unit( double new_unit ) +{ + if ( new_unit != volume_unit_ ) + { + // use default eq if it hasn't been set yet + if ( !kernel_unit ) + treble_eq( -8.0 ); + + volume_unit_ = new_unit; + double factor = new_unit * (1L << blip_sample_bits) / kernel_unit; + + if ( factor > 0.0 ) + { + int shift = 0; + + // if unit is really small, might need to attenuate kernel + while ( factor < 2.0 ) + { + shift++; + factor *= 2.0; + } + + if ( shift ) + { + kernel_unit >>= shift; + assert( kernel_unit > 0 ); // fails if volume unit is too low + + // keep values positive to avoid round-towards-zero of sign-preserving + // right shift for negative values + long offset = 0x8000 + (1 << (shift - 1)); + long offset2 = 0x8000 >> shift; + for ( int i = impulses_size(); i--; ) + impulses [i] = (short) (((impulses [i] + offset) >> shift) - offset2); + adjust_impulse(); + } + } + delta_factor = (int) floor( factor + 0.5 ); + //printf( "delta_factor: %d, kernel_unit: %d\n", delta_factor, kernel_unit ); + } +} +#endif + +long Blip_Buffer::read_samples( blip_sample_t* BLIP_RESTRICT out, long max_samples, int stereo ) +{ + long count = samples_avail(); + if ( count > max_samples ) + count = max_samples; + + if ( count ) + { + int const bass = BLIP_READER_BASS( *this ); + BLIP_READER_BEGIN( reader, *this ); + + if ( !stereo ) + { + for ( blip_long n = count; n; --n ) + { + blip_long s = BLIP_READER_READ( reader ); + if ( (blip_sample_t) s != s ) + s = 0x7FFF - (s >> 24); + *out++ = (blip_sample_t) s; + BLIP_READER_NEXT( reader, bass ); + } + } + else + { + for ( blip_long n = count; n; --n ) + { + blip_long s = BLIP_READER_READ( reader ); + if ( (blip_sample_t) s != s ) + s = 0x7FFF - (s >> 24); + *out = (blip_sample_t) s; + out += 2; + BLIP_READER_NEXT( reader, bass ); + } + } + BLIP_READER_END( reader, *this ); + + remove_samples( count ); + } + return count; +} + +void Blip_Buffer::mix_samples( blip_sample_t const* in, long count ) +{ + if ( buffer_size_ == silent_buf_size ) + { + assert( 0 ); + return; + } + + buf_t_* out = buffer_ + (offset_ >> BLIP_BUFFER_ACCURACY) + blip_widest_impulse_ / 2; + + int const sample_shift = blip_sample_bits - 16; + int prev = 0; + while ( count-- ) + { + blip_long s = (blip_long) *in++ << sample_shift; + *out += s - prev; + prev = s; + ++out; + } + *out -= prev; +} + diff --git a/Mednafen/mednafen/sound/Blip_Buffer.h b/Mednafen/mednafen/sound/Blip_Buffer.h new file mode 100644 index 0000000000..a8e90ee053 --- /dev/null +++ b/Mednafen/mednafen/sound/Blip_Buffer.h @@ -0,0 +1,498 @@ +// Band-limited sound synthesis buffer +// Various changes and hacks for use in Mednafen. + +#ifdef __GNUC__ + #define blip_inline inline __attribute__((always_inline)) +#else + #define blip_inline inline +#endif + +#include +#include + +// Blip_Buffer 0.4.1 +#ifndef BLIP_BUFFER_H +#define BLIP_BUFFER_H + +// Internal +typedef int32_t blip_long; +typedef uint32_t blip_ulong; +typedef int64_t blip_s64; +typedef uint64_t blip_u64; + +// Time unit at source clock rate +typedef blip_long blip_time_t; + +// Output samples are 16-bit signed, with a range of -32768 to 32767 +typedef short blip_sample_t; +enum { blip_sample_max = 32767 }; + +class Blip_Buffer { +public: + typedef const char* blargg_err_t; + + // Set output sample rate and buffer length in milliseconds (1/1000 sec, defaults + // to 1/4 second), then clear buffer. Returns NULL on success, otherwise if there + // isn't enough memory, returns error without affecting current buffer setup. + blargg_err_t set_sample_rate( long samples_per_sec, int msec_length = 1000 / 4 ); + + // Set number of source time units per second + void clock_rate( long ); + + // End current time frame of specified duration and make its samples available + // (along with any still-unread samples) for reading with read_samples(). Begins + // a new time frame at the end of the current frame. + void end_frame( blip_time_t time ); + + // Read at most 'max_samples' out of buffer into 'dest', removing them from from + // the buffer. Returns number of samples actually read and removed. If stereo is + // true, increments 'dest' one extra time after writing each sample, to allow + // easy interleving of two channels into a stereo output buffer. + long read_samples( blip_sample_t* dest, long max_samples, int stereo = 0 ); + +// Additional optional features + + // Current output sample rate + long sample_rate() const; + + // Length of buffer, in milliseconds + int length() const; + + // Number of source time units per second + long clock_rate() const; + + // Set frequency high-pass filter frequency, where higher values reduce bass more + void bass_freq( int frequency ); + + // Number of samples delay from synthesis to samples read out + int output_latency() const; + + // Remove all available samples and clear buffer to silence. If 'entire_buffer' is + // false, just clears out any samples waiting rather than the entire buffer. + void clear( int entire_buffer = 1 ); + + // Number of samples available for reading with read_samples() + long samples_avail() const; + + // Remove 'count' samples from those waiting to be read + void remove_samples( long count ); + +// Experimental features + + // Count number of clocks needed until 'count' samples will be available. + // If buffer can't even hold 'count' samples, returns number of clocks until + // buffer becomes full. + blip_time_t count_clocks( long count ) const; + + // Number of raw samples that can be mixed within frame of specified duration. + long count_samples( blip_time_t duration ) const; + + // Mix 'count' samples from 'buf' into buffer. + void mix_samples( blip_sample_t const* buf, long count ); + + // not documented yet + void set_modified() { modified_ = 1; } + int clear_modified() { int b = modified_; modified_ = 0; return b; } + typedef blip_u64 blip_resampled_time_t; + void remove_silence( long count ); + blip_resampled_time_t resampled_duration( int t ) const { return t * factor_; } + blip_resampled_time_t resampled_time( blip_time_t t ) const { return t * factor_ + offset_; } + blip_resampled_time_t clock_rate_factor( long clock_rate ) const; +public: + Blip_Buffer(); + ~Blip_Buffer(); + + // Deprecated + typedef blip_resampled_time_t resampled_time_t; + blargg_err_t sample_rate( long r ) { return set_sample_rate( r ); } + blargg_err_t sample_rate( long r, int msec ) { return set_sample_rate( r, msec ); } +private: + // noncopyable + Blip_Buffer( const Blip_Buffer& ); + Blip_Buffer& operator = ( const Blip_Buffer& ); +public: + typedef blip_time_t buf_t_; + blip_u64 factor_; + blip_resampled_time_t offset_; + buf_t_* buffer_; + blip_long buffer_size_; + blip_long reader_accum_; + int bass_shift_; +private: + long sample_rate_; + long clock_rate_; + int bass_freq_; + int length_; + int modified_; + friend class Blip_Reader; +}; + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#define BLIP_BUFFER_ACCURACY 32 +#define BLIP_PHASE_BITS 8 + +// Number of bits in resample ratio fraction. Higher values give a more accurate ratio +// but reduce maximum buffer size. +//#ifndef BLIP_BUFFER_ACCURACY +// #define BLIP_BUFFER_ACCURACY 16 +//#endif + +// Number bits in phase offset. Fewer than 6 bits (64 phase offsets) results in +// noticeable broadband noise when synthesizing high frequency square waves. +// Affects size of Blip_Synth objects since they store the waveform directly. +//#ifndef BLIP_PHASE_BITS +// #if BLIP_BUFFER_FAST +// #define BLIP_PHASE_BITS 8 +// #else +// #define BLIP_PHASE_BITS 6 +// #endif +//#endif + + // Internal + typedef blip_u64 blip_resampled_time_t; + int const blip_widest_impulse_ = 16; + int const blip_buffer_extra_ = blip_widest_impulse_ + 2; + int const blip_res = 1 << BLIP_PHASE_BITS; + class blip_eq_t; + + class Blip_Synth_Fast_ { + public: + Blip_Buffer* buf; + int last_amp; + int delta_factor; + + void volume_unit( double ); + Blip_Synth_Fast_(); + void treble_eq( blip_eq_t const& ) { } + }; + + class Blip_Synth_ { + public: + Blip_Buffer* buf; + int last_amp; + int delta_factor; + + void volume_unit( double ); + Blip_Synth_( short* impulses, int width ); + void treble_eq( blip_eq_t const& ); + private: + double volume_unit_; + short* const impulses; + int const width; + blip_long kernel_unit; + int impulses_size() const { return blip_res / 2 * width + 1; } + void adjust_impulse(); + }; + +// Quality level. Start with blip_good_quality. +const int blip_med_quality = 8; +const int blip_good_quality = 12; +const int blip_high_quality = 16; + +// Range specifies the greatest expected change in amplitude. Calculate it +// by finding the difference between the maximum and minimum expected +// amplitudes (max - min). +template +class Blip_Synth { +public: + // Set overall volume of waveform + void volume( double v ) { impl.volume_unit( v * (1.0 / (range < 0 ? -range : range)) ); } + + // Configure low-pass filter (see blip_buffer.txt) + void treble_eq( blip_eq_t const& eq ) { impl.treble_eq( eq ); } + + // Get/set Blip_Buffer used for output + Blip_Buffer* output() const { return impl.buf; } + void output( Blip_Buffer* b ) { impl.buf = b; impl.last_amp = 0; } + + // Update amplitude of waveform at given time. Using this requires a separate + // Blip_Synth for each waveform. + void update( blip_time_t time, int amplitude ); + +// Low-level interface + + // Add an amplitude transition of specified delta, optionally into specified buffer + // rather than the one set with output(). Delta can be positive or negative. + // The actual change in amplitude is delta * (volume / range) + void offset( blip_time_t, int delta, Blip_Buffer* ) const; + void offset( blip_time_t t, int delta ) const { offset( t, delta, impl.buf ); } + + // Works directly in terms of fractional output samples. Contact author for more info. + void offset_resampled( blip_resampled_time_t, int delta, Blip_Buffer* ) const; + + // Same as offset(), except code is inlined for higher performance + void offset_inline( blip_time_t t, int delta, Blip_Buffer* buf ) const { + offset_resampled( t * buf->factor_ + buf->offset_, delta, buf ); + } + void offset_inline( blip_time_t t, int delta ) const { + offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf ); + } + +private: +#if BLIP_BUFFER_FAST + Blip_Synth_Fast_ impl; +#else + Blip_Synth_ impl; + typedef short imp_t; + imp_t impulses [blip_res * (quality / 2) + 1]; +public: + Blip_Synth() : impl( impulses, quality ) { } +#endif +}; + +// Low-pass equalization parameters +class blip_eq_t { +public: + // Logarithmic rolloff to treble dB at half sampling rate. Negative values reduce + // treble, small positive values (0 to 5.0) increase treble. + blip_eq_t( double treble_db = 0 ); + + // See blip_buffer.txt + blip_eq_t( double treble, long rolloff_freq, long sample_rate, long cutoff_freq = 0 ); + +private: + double treble; + long rolloff_freq; + long sample_rate; + long cutoff_freq; + void generate( float* out, int count ) const; + friend class Blip_Synth_; +}; + +int const blip_sample_bits = 30; + +// Dummy Blip_Buffer to direct sound output to, for easy muting without +// having to stop sound code. +class Silent_Blip_Buffer : public Blip_Buffer { + buf_t_ buf [blip_buffer_extra_ + 1]; +public: + // The following cannot be used (an assertion will fail if attempted): + blargg_err_t set_sample_rate( long samples_per_sec, int msec_length ); + blip_time_t count_clocks( long count ) const; + void mix_samples( blip_sample_t const* buf, long count ); + + Silent_Blip_Buffer(); +}; + + #if defined (__GNUC__) || _MSC_VER >= 1100 + #define BLIP_RESTRICT __restrict + #else + #define BLIP_RESTRICT + #endif + +// Optimized reading from Blip_Buffer, for use in custom sample output + +// Begin reading from buffer. Name should be unique to the current block. +#define BLIP_READER_BEGIN( name, blip_buffer ) \ + const Blip_Buffer::buf_t_* BLIP_RESTRICT name##_reader_buf = (blip_buffer).buffer_;\ + blip_long name##_reader_accum = (blip_buffer).reader_accum_ + +// Get value to pass to BLIP_READER_NEXT() +#define BLIP_READER_BASS( blip_buffer ) ((blip_buffer).bass_shift_) + +// Constant value to use instead of BLIP_READER_BASS(), for slightly more optimal +// code at the cost of having no bass control +int const blip_reader_default_bass = 9; + +// Current sample +#define BLIP_READER_READ( name ) (name##_reader_accum >> (blip_sample_bits - 16)) + +// Current raw sample in full internal resolution +#define BLIP_READER_READ_RAW( name ) (name##_reader_accum) + +// Advance to next sample +#define BLIP_READER_NEXT( name, bass ) \ + (void) (name##_reader_accum += *name##_reader_buf++ - (name##_reader_accum >> (bass))) + +// End reading samples from buffer. The number of samples read must now be removed +// using Blip_Buffer::remove_samples(). +#define BLIP_READER_END( name, blip_buffer ) \ + (void) ((blip_buffer).reader_accum_ = name##_reader_accum) + + +// Compatibility with older version +const long blip_unscaled = 65535; +const int blip_low_quality = blip_med_quality; +const int blip_best_quality = blip_high_quality; + +// Deprecated; use BLIP_READER macros as follows: +// Blip_Reader r; r.begin( buf ); -> BLIP_READER_BEGIN( r, buf ); +// int bass = r.begin( buf ) -> BLIP_READER_BEGIN( r, buf ); int bass = BLIP_READER_BASS( buf ); +// r.read() -> BLIP_READER_READ( r ) +// r.read_raw() -> BLIP_READER_READ_RAW( r ) +// r.next( bass ) -> BLIP_READER_NEXT( r, bass ) +// r.next() -> BLIP_READER_NEXT( r, blip_reader_default_bass ) +// r.end( buf ) -> BLIP_READER_END( r, buf ) +class Blip_Reader { +public: + int begin( Blip_Buffer& ); + blip_long read() const { return accum >> (blip_sample_bits - 16); } + blip_long read_raw() const { return accum; } + void next( int bass_shift = 9 ) { accum += *buf++ - (accum >> bass_shift); } + void end( Blip_Buffer& b ) { b.reader_accum_ = accum; } + +private: + const Blip_Buffer::buf_t_* buf; + blip_long accum; +}; + +// End of public interface + +#include + +template +blip_inline void Blip_Synth::offset_resampled( blip_resampled_time_t time, + int delta, Blip_Buffer* blip_buf ) const +{ + // Fails if time is beyond end of Blip_Buffer, due to a bug in caller code or the + // need for a longer buffer as set by set_sample_rate(). + assert( (blip_long) (time >> BLIP_BUFFER_ACCURACY) < blip_buf->buffer_size_ ); + delta *= impl.delta_factor; + blip_long* BLIP_RESTRICT buf = blip_buf->buffer_ + (time >> BLIP_BUFFER_ACCURACY); + int phase = (int) (time >> (BLIP_BUFFER_ACCURACY - BLIP_PHASE_BITS) & (blip_res - 1)); + +#if BLIP_BUFFER_FAST + blip_long left = buf [0] + delta; + + // Kind of crappy, but doing shift after multiply results in overflow. + // Alternate way of delaying multiply by delta_factor results in worse + // sub-sample resolution. + blip_long right = (delta >> BLIP_PHASE_BITS) * phase; + left -= right; + right += buf [1]; + + buf [0] = left; + buf [1] = right; +#else + + int const fwd = (blip_widest_impulse_ - quality) / 2; + int const rev = fwd + quality - 2; + int const mid = quality / 2 - 1; + + imp_t const* BLIP_RESTRICT imp = impulses + blip_res - phase; + + #if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \ + defined (__x86_64__) || defined (__ia64__) || defined (__i386__) + + // straight forward implementation resulted in better code on GCC for x86 + + #define ADD_IMP( out, in ) \ + buf [out] += (blip_long) imp [blip_res * (in)] * delta + + #define BLIP_FWD( i ) {\ + ADD_IMP( fwd + i, i );\ + ADD_IMP( fwd + 1 + i, i + 1 );\ + } + #define BLIP_REV( r ) {\ + ADD_IMP( rev - r, r + 1 );\ + ADD_IMP( rev + 1 - r, r );\ + } + + BLIP_FWD( 0 ) + if ( quality > 8 ) BLIP_FWD( 2 ) + if ( quality > 12 ) BLIP_FWD( 4 ) + { + ADD_IMP( fwd + mid - 1, mid - 1 ); + ADD_IMP( fwd + mid , mid ); + imp = impulses + phase; + } + if ( quality > 12 ) BLIP_REV( 6 ) + if ( quality > 8 ) BLIP_REV( 4 ) + BLIP_REV( 2 ) + + ADD_IMP( rev , 1 ); + ADD_IMP( rev + 1, 0 ); + + #else + + // for RISC processors, help compiler by reading ahead of writes + + #define BLIP_FWD( i ) {\ + blip_long t0 = i0 * delta + buf [fwd + i];\ + blip_long t1 = imp [blip_res * (i + 1)] * delta + buf [fwd + 1 + i];\ + i0 = imp [blip_res * (i + 2)];\ + buf [fwd + i] = t0;\ + buf [fwd + 1 + i] = t1;\ + } + #define BLIP_REV( r ) {\ + blip_long t0 = i0 * delta + buf [rev - r];\ + blip_long t1 = imp [blip_res * r] * delta + buf [rev + 1 - r];\ + i0 = imp [blip_res * (r - 1)];\ + buf [rev - r] = t0;\ + buf [rev + 1 - r] = t1;\ + } + + blip_long i0 = *imp; + BLIP_FWD( 0 ) + if ( quality > 8 ) BLIP_FWD( 2 ) + if ( quality > 12 ) BLIP_FWD( 4 ) + { + blip_long t0 = i0 * delta + buf [fwd + mid - 1]; + blip_long t1 = imp [blip_res * mid] * delta + buf [fwd + mid ]; + imp = impulses + phase; + i0 = imp [blip_res * mid]; + buf [fwd + mid - 1] = t0; + buf [fwd + mid ] = t1; + } + if ( quality > 12 ) BLIP_REV( 6 ) + if ( quality > 8 ) BLIP_REV( 4 ) + BLIP_REV( 2 ) + + blip_long t0 = i0 * delta + buf [rev ]; + blip_long t1 = *imp * delta + buf [rev + 1]; + buf [rev ] = t0; + buf [rev + 1] = t1; + #endif + +#endif +} + +#undef BLIP_FWD +#undef BLIP_REV + +template +#if BLIP_BUFFER_FAST + blip_inline +#endif +void Blip_Synth::offset( blip_time_t t, int delta, Blip_Buffer* buf ) const +{ + offset_resampled( t * buf->factor_ + buf->offset_, delta, buf ); +} + +template +#if BLIP_BUFFER_FAST + blip_inline +#endif +void Blip_Synth::update( blip_time_t t, int amp ) +{ + int delta = amp - impl.last_amp; + impl.last_amp = amp; + offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf ); +} + +blip_inline blip_eq_t::blip_eq_t( double t ) : + treble( t ), rolloff_freq( 0 ), sample_rate( 44100 ), cutoff_freq( 0 ) { } +blip_inline blip_eq_t::blip_eq_t( double t, long rf, long sr, long cf ) : + treble( t ), rolloff_freq( rf ), sample_rate( sr ), cutoff_freq( cf ) { } + +blip_inline int Blip_Buffer::length() const { return length_; } +blip_inline long Blip_Buffer::samples_avail() const { return (long) (offset_ >> BLIP_BUFFER_ACCURACY); } +blip_inline long Blip_Buffer::sample_rate() const { return sample_rate_; } +blip_inline int Blip_Buffer::output_latency() const { return blip_widest_impulse_ / 2; } +blip_inline long Blip_Buffer::clock_rate() const { return clock_rate_; } +blip_inline void Blip_Buffer::clock_rate( long cps ) { factor_ = clock_rate_factor( clock_rate_ = cps ); } + +blip_inline int Blip_Reader::begin( Blip_Buffer& blip_buf ) +{ + buf = blip_buf.buffer_; + accum = blip_buf.reader_accum_; + return blip_buf.bass_shift_; +} + +int const blip_max_length = 0; +int const blip_default_length = 250; + +#endif diff --git a/Mednafen/mednafen/sound/Fir_Resampler.cpp b/Mednafen/mednafen/sound/Fir_Resampler.cpp new file mode 100644 index 0000000000..ebaed741a7 --- /dev/null +++ b/Mednafen/mednafen/sound/Fir_Resampler.cpp @@ -0,0 +1,199 @@ +// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/ + +#include "Fir_Resampler.h" + +#include +#include +#include +#include + +/* Copyright (C) 2004-2006 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "fir_blargg_source.h" + +#undef PI +#define PI 3.1415926535897932384626433832795029 + +static void gen_sinc( double rolloff, int width, double offset, double spacing, double scale, + int count, short* out ) +{ + double const maxh = 256; + double const step = PI / maxh * spacing; + double const to_w = maxh * 2 / width; + double const pow_a_n = pow( rolloff, maxh ); + scale /= maxh * 2; + + double angle = (count / 2 - 1 + offset) * -step; + while ( count-- ) + { + *out++ = 0; + double w = angle * to_w; + if ( fabs( w ) < PI ) + { + double rolloff_cos_a = rolloff * cos( angle ); + double num = 1 - rolloff_cos_a - + pow_a_n * cos( maxh * angle ) + + pow_a_n * rolloff * cos( (maxh - 1) * angle ); + double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff; + double sinc = scale * num / den - scale; + + out [-1] = (short) (cos( w ) * sinc + sinc); + } + angle += step; + } +} + +Fir_Resampler_::Fir_Resampler_( int width, sample_t* impulses_ ) : + width_( width ), + write_offset( width * stereo - stereo ), + impulses( impulses_ ) +{ + write_pos = 0; + res = 1; + imp_phase = 0; + skip_bits = 0; + step = stereo; + ratio_ = 1.0; +} + +Fir_Resampler_::~Fir_Resampler_() { } + +void Fir_Resampler_::clear() +{ + imp_phase = 0; + if ( buf.size() ) + { + write_pos = &buf [write_offset]; + memset( buf.begin(), 0, write_offset * sizeof buf [0] ); + } +} + +blargg_err_t Fir_Resampler_::buffer_size( int new_size ) +{ + RETURN_ERR( buf.resize( new_size + write_offset ) ); + clear(); + return 0; +} + +double Fir_Resampler_::time_ratio( double new_factor, double rolloff, double gain ) +{ + ratio_ = new_factor; + + double fstep = 0.0; + { + double least_error = 2; + double pos = 0; + res = -1; + for ( int r = 1; r <= max_res; r++ ) + { + pos += ratio_; + double nearest = floor( pos + 0.5 ); + double error = fabs( pos - nearest ); + if ( error < least_error ) + { + res = r; + fstep = nearest / res; + least_error = error; + } + } + } + + skip_bits = 0; + + step = stereo * (int) floor( fstep ); + + ratio_ = fstep; + fstep = fmod( fstep, 1.0 ); + + double filter = (ratio_ < 1.0) ? 1.0 : 1.0 / ratio_; + double pos = 0.0; + input_per_cycle = 0; + for ( int i = 0; i < res; i++ ) + { + gen_sinc( rolloff, int (width_ * filter + 1) & ~1, pos, filter, + double (0x7FFF * gain * filter), + (int) width_, impulses + i * width_ ); + + pos += fstep; + input_per_cycle += step; + if ( pos >= 0.9999999 ) + { + pos -= 1.0; + skip_bits |= 1 << i; + input_per_cycle++; + } + } + + clear(); + + return ratio_; +} + +int Fir_Resampler_::input_needed( blargg_long output_count ) const +{ + blargg_long input_count = 0; + + unsigned long skip = skip_bits >> imp_phase; + int remain = res - imp_phase; + while ( (output_count -= 2) > 0 ) + { + input_count += step + (skip & 1) * stereo; + skip >>= 1; + if ( !--remain ) + { + skip = skip_bits; + remain = res; + } + output_count -= 2; + } + + long input_extra = input_count - (write_pos - &buf [(width_ - 1) * stereo]); + if ( input_extra < 0 ) + input_extra = 0; + return input_extra; +} + +int Fir_Resampler_::avail_( blargg_long input_count ) const +{ + int cycle_count = input_count / input_per_cycle; + int output_count = cycle_count * res * stereo; + input_count -= cycle_count * input_per_cycle; + + blargg_ulong skip = skip_bits >> imp_phase; + int remain = res - imp_phase; + while ( input_count >= 0 ) + { + input_count -= step + (skip & 1) * stereo; + skip >>= 1; + if ( !--remain ) + { + skip = skip_bits; + remain = res; + } + output_count += 2; + } + return output_count; +} + +int Fir_Resampler_::skip_input( long count ) +{ + int remain = write_pos - buf.begin(); + int max_count = remain - width_ * stereo; + if ( count > max_count ) + count = max_count; + + remain -= count; + write_pos = &buf [remain]; + memmove( buf.begin(), &buf [count], remain * sizeof buf [0] ); + + return count; +} diff --git a/Mednafen/mednafen/sound/Fir_Resampler.h b/Mednafen/mednafen/sound/Fir_Resampler.h new file mode 100644 index 0000000000..ddf7933b80 --- /dev/null +++ b/Mednafen/mednafen/sound/Fir_Resampler.h @@ -0,0 +1,243 @@ +// Finite impulse response (FIR) resampler with adjustable FIR size + +// Game_Music_Emu 0.5.2 +#ifndef FIR_RESAMPLER_H +#define FIR_RESAMPLER_H + +#include "fir_blargg_common.h" +#include + +class Fir_Resampler_ { +public: + + // Use Fir_Resampler (below) + + // Set input/output resampling ratio and optionally low-pass rolloff and gain. + // Returns actual ratio used (rounded to internal precision). + double time_ratio( double factor, double rolloff = 0.999, double gain = 1.0 ); + + // Current input/output ratio + double ratio() const { return ratio_; } + +// Input + + typedef short sample_t; + + // Resize and clear input buffer + blargg_err_t buffer_size( int ); + + // Clear input buffer. At least two output samples will be available after + // two input samples are written. + void clear(); + + // Number of input samples that can be written + int max_write() const { return buf.end() - write_pos; } + + // Pointer to place to write input samples + sample_t* buffer() { return write_pos; } + + // Notify resampler that 'count' input samples have been written + void write( long count ); + + // Number of input samples in buffer + int written() const { return write_pos - &buf [write_offset]; } + + // Skip 'count' input samples. Returns number of samples actually skipped. + int skip_input( long count ); + +// Output + + // Number of extra input samples needed until 'count' output samples are available + int input_needed( blargg_long count ) const; + + // Number of output samples available + int avail() const { return avail_( write_pos - &buf [width_ * stereo] ); } + +public: + ~Fir_Resampler_(); +protected: + enum { stereo = 2 }; + enum { max_res = 32 }; + blargg_vector buf; + sample_t* write_pos; + int res; + int imp_phase; + int const width_; + int const write_offset; + blargg_ulong skip_bits; + int step; + int input_per_cycle; + double ratio_; + sample_t* impulses; + + Fir_Resampler_( int width, sample_t* ); + int avail_( blargg_long input_count ) const; +}; + +// Width is number of points in FIR. Must be even and 4 or more. More points give +// better quality and rolloff effectiveness, and take longer to calculate. +template +class Fir_Resampler : public Fir_Resampler_ { + BOOST_STATIC_ASSERT( width >= 4 && width % 2 == 0 ); + short impulses [max_res] [width]; +public: + Fir_Resampler() : Fir_Resampler_( width, impulses [0] ) { } + + // Read at most 'count' samples. Returns number of samples actually read. + typedef short sample_t; + int read( sample_t* out, blargg_long count ); + + int read_mono_hack( sample_t* out, blargg_long count ); +}; + +// End of public interface + +inline void Fir_Resampler_::write( long count ) +{ + write_pos += count; + assert( write_pos <= buf.end() ); +} + +template +int Fir_Resampler::read( sample_t* out_begin, blargg_long count ) +{ + sample_t* out = out_begin; + const sample_t* in = buf.begin(); + sample_t* end_pos = write_pos; + blargg_ulong skip = skip_bits >> imp_phase; + sample_t const* imp = impulses [imp_phase]; + int remain = res - imp_phase; + int const local_step = this->step; + + count >>= 1; + + if ( end_pos - in >= width * stereo ) + { + end_pos -= width * stereo; + do + { + count--; + + // accumulate in extended precision + blargg_long l = 0; + blargg_long r = 0; + + const sample_t* i = in; + if ( count < 0 ) + break; + + for ( int n = width / 2; n; --n ) + { + int pt0 = imp [0]; + l += pt0 * i [0]; + r += pt0 * i [1]; + int pt1 = imp [1]; + imp += 2; + l += pt1 * i [2]; + r += pt1 * i [3]; + i += 4; + } + + remain--; + + l >>= 15; + r >>= 15; + + in += (skip * stereo) & stereo; + skip >>= 1; + in += local_step; + + if ( !remain ) + { + imp = impulses [0]; + skip = skip_bits; + remain = res; + } + + out [0] = (sample_t) l; + out [1] = (sample_t) r; + out += 2; + } + while ( in <= end_pos ); + } + + imp_phase = res - remain; + + int left = write_pos - in; + write_pos = &buf [left]; + memmove( buf.begin(), in, left * sizeof *in ); + + return out - out_begin; +} +#include +template +int Fir_Resampler::read_mono_hack( sample_t* out_begin, blargg_long count ) +{ + sample_t* out = out_begin; + const sample_t* in = buf.begin(); + sample_t* end_pos = write_pos; + blargg_ulong skip = skip_bits >> imp_phase; + sample_t const* imp = impulses [imp_phase]; + int remain = res - imp_phase; + int const local_step = this->step; + + count >>= 1; + + if ( end_pos - in >= width * stereo ) + { + end_pos -= width * stereo; + do + { + count--; + + // accumulate in extended precision + blargg_long l = 0; + + const sample_t* i = in; + if ( count < 0 ) + break; + + for ( int n = width / 2; n; --n ) + { + int pt0 = imp [0]; + l += pt0 * i [0]; + + int pt1 = imp [1]; + imp += 2; + l += pt1 * i [2]; + + i += 4; + } + + remain--; + + l >>= 15; + + in += (skip * stereo) & stereo; + skip >>= 1; + in += local_step; + + if ( !remain ) + { + imp = impulses [0]; + skip = skip_bits; + remain = res; + } + + *out = (sample_t) l; + out ++; + } + while ( in <= end_pos ); + } + + imp_phase = res - remain; + + int left = write_pos - in; + write_pos = &buf [left]; + memmove( buf.begin(), in, left * sizeof *in ); + + return out - out_begin; +} + + +#endif diff --git a/Mednafen/mednafen/sound/Makefile.am b/Mednafen/mednafen/sound/Makefile.am new file mode 100644 index 0000000000..3d5793d6d3 --- /dev/null +++ b/Mednafen/mednafen/sound/Makefile.am @@ -0,0 +1,11 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libmdfnsound.a + +libmdfnsound_a_SOURCES = Blip_Buffer.cpp Stereo_Buffer.cpp Fir_Resampler.cpp WAVRecord.cpp + +libmdfnsound_a_SOURCES += OwlResampler.cpp + +libmdfnsound_a_SOURCES += okiadpcm.cpp diff --git a/Mednafen/mednafen/sound/Makefile.in b/Mednafen/mednafen/sound/Makefile.in new file mode 100644 index 0000000000..591fab03b7 --- /dev/null +++ b/Mednafen/mednafen/sound/Makefile.in @@ -0,0 +1,684 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/sound +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libmdfnsound_a_AR = $(AR) $(ARFLAGS) +libmdfnsound_a_LIBADD = +am_libmdfnsound_a_OBJECTS = Blip_Buffer.$(OBJEXT) \ + Stereo_Buffer.$(OBJEXT) Fir_Resampler.$(OBJEXT) \ + WAVRecord.$(OBJEXT) OwlResampler.$(OBJEXT) okiadpcm.$(OBJEXT) +libmdfnsound_a_OBJECTS = $(am_libmdfnsound_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libmdfnsound_a_SOURCES) +DIST_SOURCES = $(libmdfnsound_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libmdfnsound.a +libmdfnsound_a_SOURCES = Blip_Buffer.cpp Stereo_Buffer.cpp \ + Fir_Resampler.cpp WAVRecord.cpp OwlResampler.cpp okiadpcm.cpp +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/sound/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/sound/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libmdfnsound.a: $(libmdfnsound_a_OBJECTS) $(libmdfnsound_a_DEPENDENCIES) $(EXTRA_libmdfnsound_a_DEPENDENCIES) + $(AM_V_at)-rm -f libmdfnsound.a + $(AM_V_AR)$(libmdfnsound_a_AR) libmdfnsound.a $(libmdfnsound_a_OBJECTS) $(libmdfnsound_a_LIBADD) + $(AM_V_at)$(RANLIB) libmdfnsound.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Blip_Buffer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Fir_Resampler.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/OwlResampler.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Stereo_Buffer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/WAVRecord.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/okiadpcm.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/sound/OwlResampler.cpp b/Mednafen/mednafen/sound/OwlResampler.cpp new file mode 100644 index 0000000000..52adb46f37 --- /dev/null +++ b/Mednafen/mednafen/sound/OwlResampler.cpp @@ -0,0 +1,1015 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +///* This resampler has only been designed for frequencies 1.5MHz - 2MHz as the input rate, and output rates of +// 22050-192000 in mind, though preferably output rates between 48000 to 96000(inclusive) will be used. +//*/ + +#include +#include +#include +#include +#include +#include "OwlResampler.h" +#include "../cputest/cputest.h" + +#if defined(ARCH_POWERPC_ALTIVEC) && defined(HAVE_ALTIVEC_H) + #include +#endif + +#ifdef __FAST_MATH__ + #error "OwlResampler.cpp not compatible with unsafe math optimizations!" +#endif + +OwlBuffer::OwlBuffer() +{ + assert(sizeof(I32_F_Pudding) == 4); + assert(sizeof(float) == 4); + + memset(HRBuf, 0, sizeof(HRBuf)); + + accum = 0; + filter_state[0] = 0; + filter_state[1] = 0; + + leftover = 0; + + InputIndex = 0; + InputPhase = 0; + + debias = 0; +} + + +OwlBuffer::~OwlBuffer() +{ + + + +} + +void OwlBuffer::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix, const unsigned scount) +{ + unsigned InBuf = scount; + + SFORMAT StateRegs[] = + { + SFVAR(accum), + SFVAR(leftover), + + SFARRAY64(filter_state, 2), + + SFVAR(InputIndex), + + SFVAR(InputPhase), + + SFVAR(debias), + + SFVAR(InBuf), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, sname_prefix); + + if(load) + { + if(leftover < 0) + leftover = 0; + + if(leftover > HRBUF_LEFTOVER_PADDING) + leftover = HRBUF_LEFTOVER_PADDING; + + if(InBuf > 65536) + InBuf = 65536; + } + + char lod_sname[256]; + snprintf(lod_sname, sizeof(lod_sname), "%s_LOD", sname_prefix); + + SFORMAT StateRegs_LOD[] = + { + SFARRAY32(Buf() - leftover, leftover + InBuf + HRBUF_OVERFLOW_PADDING), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs_LOD, lod_sname); +} + +template +static int32 ProcessLoop(unsigned count, int32 a, int32* b, int32* exmix0 = NULL, int32* exmix1 = NULL, unsigned lp_shift = 0, unsigned hp_shift = 0, int64* f_in = NULL) +{ + int64 lp_f; + int64 hp_f; + + if(Lowpass) + { + lp_f = f_in[0]; + } + + if(Highpass) + { + hp_f = f_in[1]; + } + + while(count--) + { + int32 tmp; + + if(Integrate) + { + a += *b; + tmp = a >> IntegrateShift; + } + else + tmp = *b; + + if(Lowpass) + { + lp_f += ((int64)((uint64)(int64)tmp << 16) - lp_f) >> lp_shift; + tmp = lp_f >> 16; + } + + if(Highpass) + { + hp_f += ((int64)((uint64)(int64)tmp << 16) - hp_f) >> hp_shift; + tmp = tmp - (hp_f >> 16); + } + + if(DoExMix >= 1) + { + tmp += *exmix0; + exmix0++; + } + + if(DoExMix >= 2) + { + tmp += *exmix1; + exmix1++; + } + + if(FloatOutput) + *(float*)b = tmp; + else + *b = tmp; + + b++; + } + + if(Lowpass) + f_in[0] = lp_f; + + if(Highpass) + f_in[1] = hp_f; + + return(a); +} + +void OwlBuffer::ResampleSkipped(unsigned count) +{ + memmove(HRBuf, &HRBuf[count], HRBUF_OVERFLOW_PADDING * sizeof(HRBuf[0])); + memset(&HRBuf[HRBUF_OVERFLOW_PADDING], 0, count * sizeof(HRBuf[0])); +} + +void OwlBuffer::Integrate(unsigned count, unsigned lp_shift, unsigned hp_shift, RavenBuffer* mixin0, RavenBuffer* mixin1) +{ + //lp_shift = hp_shift = 0; + if(lp_shift != 0 || hp_shift != 0) + { + if(mixin0 && mixin1) + accum = ProcessLoop<2, true, 3, true, true, true>(count, accum, Buf(), mixin0->Buf(), mixin1->Buf(), lp_shift, hp_shift, filter_state); + else if(mixin0) + accum = ProcessLoop<1, true, 3, true, true, true>(count, accum, Buf(), mixin0->Buf(), NULL, lp_shift, hp_shift, filter_state); + else + accum = ProcessLoop<0, true, 3, true, true, true>(count, accum, Buf(), NULL, NULL, lp_shift, hp_shift, filter_state); + } + else + { + if(mixin0 && mixin1) + accum = ProcessLoop<2, true, 3, false, false, true>(count, accum, Buf(), mixin0->Buf(), mixin1->Buf()); + else if(mixin0) + accum = ProcessLoop<1, true, 3, false, false, true>(count, accum, Buf(), mixin0->Buf()); + else + accum = ProcessLoop<0, true, 3, false, false, true>(count, accum, Buf()); + } + + if(accum >= 32767 * 256 * 8 || accum <= -32767 * 256 * 8) + { + //printf("Possible delta sample loss; accum=%d\n", accum); + } +} + +// +// +// + +RavenBuffer::RavenBuffer() +{ + memset(BB, 0, sizeof(BB)); + + accum = 0; + + filter_state[0] = 0; + filter_state[1] = 0; +} + + +RavenBuffer::~RavenBuffer() +{ + + + +} + + + +void RavenBuffer::Process(unsigned count, bool integrate, unsigned lp_shift) +{ + if(integrate) + { + if(lp_shift != 0) + accum = ProcessLoop<0, true, 3, true, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0, filter_state); + else + accum = ProcessLoop<0, true, 3, false, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0); + } + else + { + if(lp_shift != 0) + accum = ProcessLoop<0, false, 0, true, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0, filter_state); + else + accum = ProcessLoop<0, false, 0, false, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0); + } +} + +void RavenBuffer::Finish(unsigned count) +{ + memmove(BB, &BB[count], OwlBuffer::HRBUF_OVERFLOW_PADDING * sizeof(BB[0])); + memset(&BB[OwlBuffer::HRBUF_OVERFLOW_PADDING], 0, count * sizeof(BB[0])); +} + + + +static void kaiser_window( double* io, int count, double beta ) +{ + int const accuracy = 16; //12; + + double* end = io + count; + + double beta2 = beta * beta * (double) -0.25; + double to_fract = beta2 / ((double) count * count); + double i = 0; + double rescale = 0; // Doesn't need an initializer, to shut up gcc + + for ( ; io < end; ++io, i += 1 ) + { + double x = i * i * to_fract - beta2; + double u = x; + double k = x + 1; + + double n = 2; + do + { + u *= x / (n * n); + n += 1; + k += u; + } + while ( k <= u * (1 << accuracy) ); + + if ( !i ) + rescale = 1 / k; // otherwise values get large + + *io *= k * rescale; + } +} + +static void gen_sinc( double* out, int size, double cutoff, double kaiser ) +{ + assert( size % 2 == 0 ); // size must be enev + + int const half_size = size / 2; + double* const mid = &out [half_size]; + + // Generate right half of sinc + for ( int i = 0; i < half_size; i++ ) + { + double angle = (i * 2 + 1) * (M_PI / 2); + mid [i] = sin( angle * cutoff ) / angle; + } + + kaiser_window( mid, half_size, kaiser ); + + // Mirror for left half + for ( int i = 0; i < half_size; i++ ) + out [i] = mid [half_size - 1 - i]; +} + +static void normalize( double* io, int size, double gain = 1.0 ) +{ + double sum = 0; + for ( int i = 0; i < size; i++ ) + sum += io [i]; + + double scale = gain / sum; + for ( int i = 0; i < size; i++ ) + io [i] *= scale; +} + + +static INLINE void DoMAC(float *wave, float *coeffs, int32 count, int32 *accum_output) +{ + float acc[4] = { 0, 0, 0, 0 }; + + for(int c = 0; c < count; c += 4) + { + acc[0] += wave[c + 0] * coeffs[c + 0]; + acc[1] += wave[c + 1] * coeffs[c + 1]; + acc[2] += wave[c + 2] * coeffs[c + 2]; + acc[3] += wave[c + 3] * coeffs[c + 3]; + } + + *accum_output = (acc[0] + acc[2]) + (acc[1] + acc[3]); +} + + + +#ifdef ARCH_X86 + +#if defined(__x86_64__) && !defined(__ILP32__) +#define X86_REGC "r" +#define X86_REGAT "" +#else +#define X86_REGC "e" +#define X86_REGAT "l" +#endif + +static INLINE void DoMAC_SSE(float *wave, float *coeffs, int32 count, int32 *accum_output) +{ + // Multiplies 16 coefficients at a time. + int dummy; + + //printf("%f\n", adj); +/* + ?di = wave pointer + ?si = coeffs pointer + ecx = count / 16 + edx = 32-bit int output pointer + + +*/ + // Will read 16 bytes of input waveform past end. + asm volatile( +"xorps %%xmm3, %%xmm3\n\t" // For a loop optimization + +"xorps %%xmm4, %%xmm4\n\t" +"xorps %%xmm5, %%xmm5\n\t" +"xorps %%xmm6, %%xmm6\n\t" +"xorps %%xmm7, %%xmm7\n\t" + +"movups 0(%%" X86_REGC "di), %%xmm0\n\t" +"SSE_Loop:\n\t" + +"movups 16(%%" X86_REGC "di), %%xmm1\n\t" +"mulps 0(%%" X86_REGC "si), %%xmm0\n\t" +"addps %%xmm3, %%xmm7\n\t" + +"movups 32(%%" X86_REGC "di), %%xmm2\n\t" +"mulps 16(%%" X86_REGC "si), %%xmm1\n\t" +"addps %%xmm0, %%xmm4\n\t" + +"movups 48(%%" X86_REGC "di), %%xmm3\n\t" +"mulps 32(%%" X86_REGC "si), %%xmm2\n\t" +"addps %%xmm1, %%xmm5\n\t" + +"movups 64(%%" X86_REGC "di), %%xmm0\n\t" +"mulps 48(%%" X86_REGC "si), %%xmm3\n\t" +"addps %%xmm2, %%xmm6\n\t" + +"add" X86_REGAT " $64, %%" X86_REGC "si\n\t" +"add" X86_REGAT " $64, %%" X86_REGC "di\n\t" +"subl $1, %%ecx\n\t" +"jnz SSE_Loop\n\t" + +"addps %%xmm3, %%xmm7\n\t" // For a loop optimization + +// +// Add the four summation xmm regs together into one xmm register, xmm7 +// +"addps %%xmm4, %%xmm5\n\t" +"addps %%xmm6, %%xmm7\n\t" +"addps %%xmm5, %%xmm7\n\t" + +// +// Now for the "fun" horizontal addition... +// +// +"movaps %%xmm7, %%xmm4\n\t" +// (3 * 2^0) + (2 * 2^2) + (1 * 2^4) + (0 * 2^6) = 27 +"shufps $27, %%xmm7, %%xmm4\n\t" +"addps %%xmm4, %%xmm7\n\t" + +// At this point, xmm7: +// (3 + 0), (2 + 1), (1 + 2), (0 + 3) +// +// (1 * 2^0) + (0 * 2^2) = 1 +"movaps %%xmm7, %%xmm4\n\t" +"shufps $1, %%xmm7, %%xmm4\n\t" +"addss %%xmm4, %%xmm7\n\t" // No sense in doing packed addition here. + +"cvtss2si %%xmm7, %%ecx\n\t" +"movl %%ecx, (%%" X86_REGC "dx)\n\t" + : "=D" (dummy), "=S" (dummy), "=c" (dummy) + : "D" (wave), "S" (coeffs), "c" (count >> 4), "d" (accum_output) +#ifdef __SSE__ + : "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "cc", "memory" +#else + : "cc", "memory" +#endif +); +} +#endif + +#ifdef ARCH_POWERPC_ALTIVEC +static INLINE void DoMAC_AltiVec(float* wave, float* coeffs, int32 count, int32* accum_output) +{ + register vector float acc0, acc1, acc2, acc3; + + acc0 = (vector float)vec_splat_u8(0); + acc1 = acc0; + acc2 = acc0; + acc3 = acc0; + + + count >>= 4; + + if(!((uint64)wave & 0xF)) + { + register vector float w, c; + do + { + w = vec_ld(0, wave); + c = vec_ld(0, coeffs); + acc0 = vec_madd(w, c, acc0); + + w = vec_ld(16, wave); + c = vec_ld(16, coeffs); + acc1 = vec_madd(w, c, acc1); + + w = vec_ld(32, wave); + c = vec_ld(32, coeffs); + acc2 = vec_madd(w, c, acc2); + + w = vec_ld(48, wave); + c = vec_ld(48, coeffs); + acc3 = vec_madd(w, c, acc3); + + coeffs += 16; + wave += 16; + } while(--count); + } + else + { + register vector unsigned char lperm; + register vector float loado; + + lperm = vec_lvsl(0, wave); + loado = vec_ld(0, wave); + + do + { + register vector float tl; + register vector float w; + register vector float c; + + tl = vec_ld(15 + 0, wave); + w = vec_perm(loado, tl, lperm); + c = vec_ld(0, coeffs); + loado = tl; + acc0 = vec_madd(w, c, acc0); + + tl = vec_ld(15 + 16, wave); + w = vec_perm(loado, tl, lperm); + c = vec_ld(16, coeffs); + loado = tl; + acc1 = vec_madd(w, c, acc1); + + tl = vec_ld(15 + 32, wave); + w = vec_perm(loado, tl, lperm); + c = vec_ld(32, coeffs); + loado = tl; + acc2 = vec_madd(w, c, acc2); + + tl = vec_ld(15 + 48, wave); + w = vec_perm(loado, tl, lperm); + c = vec_ld(48, coeffs); + loado = tl; + acc3 = vec_madd(w, c, acc3); + + coeffs += 16; + wave += 16; + } while(--count); + } + + { + vector float sum; + vector float sums0; + vector signed int sum_i; + + sum = vec_add(vec_add(acc0, acc1), vec_add(acc2, acc3)); + sums0 = vec_sld(sum, sum, 8); + sum = vec_add(sum, sums0); + sums0 = vec_sld(sum, sum, 4); + sum = vec_add(sum, sums0); + + sum_i = vec_cts(sum, 0); + vec_ste(sum_i, 0, accum_output); + } +} +#endif + +template +static T SDP2(T v) +{ + T tmp; + + tmp = (v >> ((sizeof(T) * 8) - 1)) & (((T)1 << sa) - 1); + + return ((v + tmp) >> sa); +} + +int32 OwlResampler::Resample(OwlBuffer* in, const uint32 in_count, int16* out, const uint32 max_out_count, const bool reverse) +{ + if(reverse) + { + int32* a = in->Buf(); + int32* b = in->Buf() + in_count - 1; + + while(MDFN_LIKELY(a < b)) + { + int32 tmp = *a; + + *a = *b; + *b = tmp; + a++; + b--; + } + } + + // + // + // + uint32 count = 0; + int32 *boobuf = &IntermediateBuffer[0]; + int32 *I32Out = boobuf; + const uint32 in_count_WLO = in->leftover + in_count; + const uint32 max = std::max(0, (int64)in_count_WLO - NumCoeffs); + uint32 InputPhase = in->InputPhase; + uint32 InputIndex = in->InputIndex; + OwlBuffer::I32_F_Pudding* InSamps = in->BufPudding() - in->leftover; + int32 leftover; + + if(MDFN_UNLIKELY(InputPhase >= NumPhases)) + { + fprintf(stderr, "[BUG] InputPhase >= NumPhases\n"); // Save states can also trigger this. + InputPhase = 0; + } + + + if(0) + { + + } +#ifdef ARCH_X86 + else if(cpuext & CPUTEST_FLAG_SSE) + { + //int32* tp = in->Buf(); + //for(unsigned c = 0; c < in_count; c++) + // *(float*)(tp + c) = *(int32*)(tp + c); + + while(InputIndex < max) + { + float* wave = &InSamps[InputIndex].f; + float* coeffs = &FIR_Coeffs[InputPhase][0].f; + int32 coeff_count = NumCoeffs; + + DoMAC_SSE(wave, coeffs, coeff_count, I32Out); + //DoMAC(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + } +#endif + +#ifdef ARCH_POWERPC_ALTIVEC + else if(1) + { + while(InputIndex < max) + { + float* wave = &InSamps[InputIndex].f; + float* coeffs = &FIR_Coeffs[InputPhase][0].f; + int32 coeff_count = NumCoeffs; + + DoMAC_AltiVec(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + } +#endif + else + { + while(InputIndex < max) + { + float* wave = &InSamps[InputIndex].f; + float* coeffs = &FIR_Coeffs[InputPhase][0].f; + int32 coeff_count = NumCoeffs; + + DoMAC(wave, coeffs, coeff_count, I32Out); + + I32Out++; + count++; + + InputPhase = PhaseNext[InputPhase]; + InputIndex += PhaseStep[InputPhase]; + } + } + + if(InputIndex > in_count_WLO) + { + leftover = 0; + InputIndex -= in_count_WLO; + } + else + { + leftover = (int32)in_count_WLO - (int32)InputIndex; + InputIndex = 0; + } + +#if 0 + for(uint32 x = 0; x < count; x++) + { + int s = boobuf[x] >> 8; + + if(s < -32768 || s > 32767) + { + //printf("Flow: %6d\n", s); + if(s < -32768) + s = -32768; + else if(s > 32767) + s = 32767; + } + out[x * 2] = s; + } +#else + { + int64 debias = in->debias; + + for(uint32 x = 0; x < count; x++) + { + int32 sample = boobuf[x]; + int32 s; + + debias += (((int64)((uint64)(int64)sample << 16) - debias) * debias_multiplier) >> 16; + s = SDP2(sample - (debias >> 16)); + if(s < -32768 || s > 32767) + { + //printf("Flow: %6d\n", s); + if(s < -32768) + s = -32768; + else if(s > 32767) + s = 32767; + } + out[x * 2] = s; + } + + in->debias = debias; + } +#endif + memmove(in->Buf() - leftover, + in->Buf() + in_count - leftover, + sizeof(int32) * (leftover + OwlBuffer::HRBUF_OVERFLOW_PADDING)); + + memset(in->Buf() + OwlBuffer::HRBUF_OVERFLOW_PADDING, 0, sizeof(int32) * in_count); + + in->leftover = leftover; + in->InputPhase = InputPhase; + in->InputIndex = InputIndex; + + return(count); +} + +void OwlResampler::ResetBufResampState(OwlBuffer* buf) +{ + memset(buf->HRBuf, 0, sizeof(buf->HRBuf[0]) * OwlBuffer::HRBUF_LEFTOVER_PADDING); + buf->InputPhase = 0; +} + + +OwlResampler::~OwlResampler() +{ + if(PhaseNext) + free(PhaseNext); + + if(PhaseStep) + free(PhaseStep); + + if(PhaseStepSave) + free(PhaseStepSave); + + if(FIR_Coeffs_Real) + { + for(unsigned int i = 0; i < NumPhases; i++) + if(FIR_Coeffs_Real[i]) + free(FIR_Coeffs_Real[i]); + + free(FIR_Coeffs_Real); + } + + if(FIR_Coeffs) + free(FIR_Coeffs); +} + +// +// Flush denormals, and coefficients that could lead to denormals, to zero. +// +static float FilterDenormal(float v) +{ + union + { + float f; + uint32 i; + } cat_pun; + + cat_pun.f = v; + + if(((cat_pun.i >> 23) & 0xFF) <= 24) // Maybe < 24 is more correct? + { + MDFN_printf("Small FP coefficient detected: 0x%08x --- raw_sign=%d, raw_exp=0x%02x, raw_mantissa=0x%06x\n", cat_pun.i, cat_pun.i >> 31, (cat_pun.i >> 23) & 0xFF, cat_pun.i & ((1U << 23) - 1)); + return(0); + } + + return(v); +} + +OwlResampler::OwlResampler(double input_rate, double output_rate, double rate_error, double debias_corner, int quality, double nyq_fudge) +{ + double *FilterBuf = NULL; + double ratio = (double)output_rate / input_rate; + double cutoff; + double required_bandwidth; + double k_beta; + double k_d; + + for(int i = 0; i < 256; i++) + { + int a = SDP2(i); + int b = SDP2(-i); + int c = i / (1 << 3); + + assert(a == -b && a == c); + } + + assert(sizeof(OwlBuffer::I32_F_Pudding) == 4); + + InputRate = input_rate; + OutputRate = output_rate; + RateError = rate_error; + DebiasCorner = debias_corner; + Quality = quality; + + IntermediateBuffer.resize(OutputRate * 4 / 50); // *4 for safety padding, / min(50,60), an approximate calculation + + cpuext = cputest_get_flags(); +//cpuext = 0; + MDFN_printf("OwlResampler.cpp debug info:\n"); + MDFN_indent(1); + + // Get the number of phases required, and adjust ratio. + { + double s_ratio = (double)input_rate / output_rate; + double findo = 0; + uint32 count = 0; + uint32 findo_i; + + do + { + count++; + findo += s_ratio; + } while( fabs(1.0 - ((floor(0.5 + findo) / count) / s_ratio)) > rate_error); + + s_ratio = floor(0.5 + findo) / count; + findo_i = (uint32) floor(0.5 + findo); + ratio = 1 / s_ratio; + NumPhases = count; + + PhaseNext = (uint32 *)malloc(sizeof(uint32) * NumPhases); + PhaseStep = (uint32 *)malloc(sizeof(uint32) * NumPhases); + PhaseStepSave = (uint32 *)malloc(sizeof(uint32) * NumPhases); + + uint32 last_indoo = 0; + for(unsigned int i = 0; i < NumPhases; i++) + { + uint32 index_pos = i * findo_i / NumPhases; + + PhaseNext[i] = (i + 1) % (NumPhases); + PhaseStepSave[i] = PhaseStep[i] = index_pos - last_indoo; + last_indoo = index_pos; + } + PhaseStepSave[0] = PhaseStep[0] = findo_i - last_indoo; + + Ratio_Dividend = findo_i; + Ratio_Divisor = NumPhases; + + MDFN_printf("Phases: %d, Output rate: %f, %d %d\n", NumPhases, input_rate * ratio, Ratio_Dividend, Ratio_Divisor); + + MDFN_printf("Desired maximum rate error: %.10f, Actual rate error: %.10f\n", rate_error, fabs((double)input_rate / output_rate * ratio - 1)); + } + + static const struct + { + double beta; + double d; + double obw; + } QualityTable[7] = + { + { 5.658, 3.62, 0.65 }, + { 6.764, 4.32, 0.70 }, + { 7.865, 5.00, 0.75 }, + { 8.960, 5.70, 0.80 }, + { 10.056, 6.40, 0.85 }, + { 10.056, 6.40, 0.90 }, + + { 10.056, 6.40, 0.9333 }, // 1.0 - (6.40 / 96) + }; + + assert(quality >= 0 && quality <= 6); + + k_beta = QualityTable[quality].beta; + k_d = QualityTable[quality].d; + + + // + // As far as filter frequency response design goes, we clamp the output rate parameter + // to keep PCE CD and PC-FX CD-DA sample amplitudes from going wild since we're not resampling CD-DA totally properly. + // +#define OWLRESAMP_FCALC_RATE_CLAMP 128000.0 //192000.0 //96000.0 //48000.0 + + // A little SOMETHING to widen the transition band a bit to reduce computational complexity with higher output rates. + const double something = std::min(OWLRESAMP_FCALC_RATE_CLAMP, (48000.0 + std::min(OWLRESAMP_FCALC_RATE_CLAMP, output_rate)) / 2 / QualityTable[quality].obw); + + // + // Note: Cutoff calculation is performed again(though slightly differently) down below after the SIMD check. + // + cutoff = QualityTable[quality].obw * (std::min(something, std::min(input_rate, output_rate)) / input_rate); + + required_bandwidth = (std::min(OWLRESAMP_FCALC_RATE_CLAMP, std::min(input_rate, output_rate)) / input_rate) - cutoff; + + NumCoeffs = ceil(k_d / required_bandwidth); + + MDFN_printf("Initial number of coefficients per phase: %u\n", NumCoeffs); + MDFN_printf("Initial nominal cutoff frequency: %f\n", InputRate * cutoff / 2); + + // + // Put this lower limit BEFORE the SIMD stuff, otherwise the NumCoeffs_Padded calculation will be off. + // + if(NumCoeffs < 16) + NumCoeffs = 16; + + if(0) + { + abort(); // The sky is falling AAAAAAAAAAAAA + } + #ifdef ARCH_X86 + else if(cpuext & CPUTEST_FLAG_SSE) + { + MDFN_printf("SIMD: SSE\n"); + +#if 0 //defined(__x86_64__) + // SSE loop does 32 MACs per iteration. + NumCoeffs = (NumCoeffs + 31) &~ 31; +#else + // SSE loop does 16 MACs per iteration. + NumCoeffs = (NumCoeffs + 15) &~ 15; +#endif + NumCoeffs_Padded = NumCoeffs; + } + #endif + #ifdef ARCH_POWERPC_ALTIVEC + else if(1) + { + MDFN_printf("SIMD: AltiVec\n"); + + // AltiVec loop does 16 MACs per iteration. + NumCoeffs = (NumCoeffs + 15) &~ 15; + NumCoeffs_Padded = NumCoeffs; + } + #endif + else + { + // Default loop does 4 MACs per iteration. + NumCoeffs = (NumCoeffs + 3) &~ 3; + NumCoeffs_Padded = NumCoeffs; + } + + #if !defined(ARCH_X86) && !defined(ARCH_POWERPC_ALTIVEC) + #warning "OwlResampler is being compiled without SIMD support." + #endif + + // + // Adjust cutoff now that NumCoeffs may have been increased. + // + cutoff = std::min(QualityTable[quality].obw * something / input_rate, (std::min(input_rate, output_rate) / input_rate - ((double)k_d / NumCoeffs))); + + cutoff *= nyq_fudge; + if(ceil(cutoff) > 1.0) + cutoff = 1.0; + + + MDFN_printf("Adjusted number of coefficients per phase: %u\n", NumCoeffs); + MDFN_printf("Adjusted nominal cutoff frequency: %f\n", InputRate * cutoff / 2); + + assert(NumCoeffs <= OwlBuffer::HRBUF_LEFTOVER_PADDING); + + FIR_Coeffs = (OwlBuffer::I32_F_Pudding **)malloc(sizeof(int32 **) * NumPhases); + FIR_Coeffs_Real = (OwlBuffer::I32_F_Pudding **)malloc(sizeof(int32 **) * NumPhases); + + for(unsigned int i = 0; i < NumPhases; i++) + { + uint8 *tmp_ptr = (uint8 *)calloc(sizeof(int32) * NumCoeffs_Padded + 16, 1); + + FIR_Coeffs_Real[i] = (OwlBuffer::I32_F_Pudding *)tmp_ptr; + tmp_ptr += 0xF; + tmp_ptr -= ((unsigned long long)tmp_ptr & 0xF); + FIR_Coeffs[i] = (OwlBuffer::I32_F_Pudding *)tmp_ptr; + } + + MDFN_printf("Impulse response table memory usage: %d bytes\n", (int)((sizeof(int32) * NumCoeffs_Padded + 16) * NumPhases)); + + + FilterBuf = (double *)malloc(sizeof(double) * NumCoeffs * NumPhases); + gen_sinc(FilterBuf, NumCoeffs * NumPhases, cutoff / NumPhases, k_beta); + normalize(FilterBuf, NumCoeffs * NumPhases); + + #if 0 + for(int i = 0; i < NumCoeffs * NumPhases; i++) + fprintf(stderr, "%.20f\n", FilterBuf[i]); + + #endif + + for(unsigned int phase = 0; phase < NumPhases; phase++) + { + double sum_d = 0; + float sum_f4[4] = { 0, 0, 0, 0 }; + + const unsigned sp = (NumPhases - 1 - (((uint64)phase * Ratio_Dividend) % NumPhases)); + const unsigned tp = phase; + + for(unsigned int i = 0; i < NumCoeffs; i++) + { + double tmpcod = FilterBuf[i * NumPhases + sp] * NumPhases; // Tasty cod. + + FIR_Coeffs[tp][i].f = FilterDenormal(tmpcod); + sum_d += FIR_Coeffs[tp][i].f; + sum_f4[i % 4] += FIR_Coeffs[tp][i].f; + } + +#if 0 + { + double sf4t = (sum_f4[0] + sum_f4[2]) + (sum_f4[1] + sum_f4[3]); + double sd_div_sf4t = sum_d / sf4t; + + MDFN_printf("Phase %4u: sum_d=%.10f, sum_f4t=%.10f, sum_d div sum_f4t=%.10f(*65536=%f, dB=%.8f)\n", sp, sum_d, (double)sf4t, sd_div_sf4t, 65536.0 * sd_div_sf4t, fabs(20 * log10(sum_d / sf4t))); + } +#endif + } + + free(FilterBuf); + FilterBuf = NULL; + + assert(debias_corner < (output_rate / 16)); + debias_multiplier = (uint32)(((uint64)1 << 16) * debias_corner / output_rate); + + MDFN_indent(-1); + + //abort(); +} diff --git a/Mednafen/mednafen/sound/OwlResampler.h b/Mednafen/mednafen/sound/OwlResampler.h new file mode 100644 index 0000000000..59437ecc01 --- /dev/null +++ b/Mednafen/mednafen/sound/OwlResampler.h @@ -0,0 +1,156 @@ +#ifndef __NES_FILTER_H +#define __NES_FILTER_H + +#include + +class OwlResampler; +class RavenBuffer; + +struct StateMem; + +class OwlBuffer +{ + public: + + enum { HRBUF_LEFTOVER_PADDING = 8192 }; + enum { HRBUF_OVERFLOW_PADDING = 32 }; // For deltas and impulse responses and whatnot that are dangling off the end(>= final timestamp) sorta. + + union I32_F_Pudding + { + int32 i32; + float f; + }; + + OwlBuffer(); + ~OwlBuffer(); + + INLINE int32* Buf(void) + { + return &HRBuf[HRBUF_LEFTOVER_PADDING].i32; + } + + INLINE I32_F_Pudding* BufPudding(void) + { + return &HRBuf[HRBUF_LEFTOVER_PADDING]; + } + + void Integrate(unsigned count, unsigned lp_shift = 0, unsigned hp_shift = 0, RavenBuffer* mixin0 = NULL, RavenBuffer* mixin1 = NULL); // Convenience function. + void ResampleSkipped(unsigned count); + + void ZeroLeftover(void); + + void StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix, const unsigned scount); + + private: + + I32_F_Pudding HRBuf[HRBUF_LEFTOVER_PADDING + 65536 + HRBUF_OVERFLOW_PADDING]; + int32 accum; + int64 filter_state[2]; + + // + // Resampler state: + // + int32 leftover; + + // Index into the input buffer + uint32 InputIndex; + + // Current input phase + uint32 InputPhase; + + // DC bias removal filter thingy + int64 debias; + + friend class OwlResampler; +}; + +class RavenBuffer +{ + public: + + RavenBuffer(); + ~RavenBuffer(); + + INLINE int32* Buf(void) + { + return &BB[0]; + } + + void Process(unsigned count, bool integrate = true, uint32 lp_shift = 0); + void Finish(unsigned count); + + friend class OwlBuffer; + + private: + int32 BB[65536 + OwlBuffer::HRBUF_OVERFLOW_PADDING]; + int32 accum; + int64 filter_state[2]; +}; + +class OwlResampler +{ + public: + + // Resamples from input_rate to output_rate, allowing for rate_error(output_rate +/- output_rate*rate_error) + // error in the resample ratio. + // + // debias_corner is the cheap high-pass DC bias removal filter coefficient. Higher values will result in more bias removal(and + // case a high-pass filter effect), while lower values will lower this effect. It should be <= output_rate / 64, to be on the safe side(prevent + // multiplication overflow). A value of 0 will disable its effect. + // + // quality is an arbitrary control of quality(0 for lowest quality, 5 for highest quality) + // + // nyq_fudge may be a tasty sleep drug. + // + OwlResampler(double input_rate, double output_rate, double rate_error, double debias_corner, int quality, double nyq_fudge = 1.0) MDFN_COLD; + OwlResampler(const OwlResampler &resamp) MDFN_COLD; + ~OwlResampler() MDFN_COLD; + + int32 Resample(OwlBuffer* in, const uint32 in_count, int16* out, const uint32 max_out_count, const bool reverse = false); + void ResetBufResampState(OwlBuffer* buf); + + // Get the InputRate / OutputRate ratio, expressed as a / b + void GetRatio(int32 *a, int32 *b) + { + *a = Ratio_Dividend; + *b = Ratio_Divisor; + } + + private: + + // Copy of the parameters passed to the constructor + double InputRate, OutputRate, RateError, DebiasCorner; + int Quality; + + // Number of phases. + uint32 NumPhases; + uint32 NumPhases_Padded; + + // Coefficients(in each phase, not total) + uint32 NumCoeffs; + uint32 NumCoeffs_Padded; + + uint32 *PhaseWhich; + + // In the FIR loop: InputPhase = PhaseNext[InputPhase] + uint32 *PhaseNext; + + // Incrementor for InputIndex. In the FIR loop, after updating InputPhase: InputIndex += PhaseStep[InputPhase] + uint32 *PhaseStep; + uint32 *PhaseStepSave; + + // One pointer for each phase + OwlBuffer::I32_F_Pudding **FIR_Coeffs; + OwlBuffer::I32_F_Pudding **FIR_Coeffs_Real; + + std::vector IntermediateBuffer; //int32 boobuf[8192]; + + uint32 cpuext; + + uint16 debias_multiplier; + + // for GetRatio() + int32 Ratio_Dividend; + int32 Ratio_Divisor; +}; +#endif diff --git a/Mednafen/mednafen/sound/Stereo_Buffer.cpp b/Mednafen/mednafen/sound/Stereo_Buffer.cpp new file mode 100644 index 0000000000..6e65464685 --- /dev/null +++ b/Mednafen/mednafen/sound/Stereo_Buffer.cpp @@ -0,0 +1,146 @@ + +// Blip_Buffer 0.3.0. http://www.slack.net/~ant/nes-emu/ + +#include "Stereo_Buffer.h" + +/* Library Copyright (C) 2004 Shay Green. Blip_Buffer is free software; +you can redistribute it and/or modify it under the terms of the GNU +General Public License as published by the Free Software Foundation; +either version 2 of the License, or (at your option) any later version. +Stereo_Buffer is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU General +Public License along with Stereo_Buffer; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +Stereo_Buffer::Stereo_Buffer() { + stereo_added = false; + was_stereo = false; +} + +Stereo_Buffer::~Stereo_Buffer() { +} + +bool Stereo_Buffer::set_sample_rate( long rate, int msec ) +{ + for ( int i = 0; i < buf_count; i++ ) { + if ( bufs [i].set_sample_rate( rate, msec ) ) + { + return false; + } + } + + return true; +} + +void Stereo_Buffer::clock_rate( long rate ) +{ + for ( int i = 0; i < buf_count; i++ ) + bufs [i].clock_rate( rate ); +} + +void Stereo_Buffer::bass_freq( int bass ) +{ + for ( unsigned i = 0; i < buf_count; i++ ) + bufs [i].bass_freq( bass ); +} + +void Stereo_Buffer::clear() +{ + stereo_added = false; + was_stereo = false; + for ( int i = 0; i < buf_count; i++ ) + bufs [i].clear(); +} + +void Stereo_Buffer::end_frame( blip_time_t clock_count, bool stereo ) +{ + for ( unsigned i = 0; i < buf_count; i++ ) + { + bufs [i].end_frame( clock_count ); + } + stereo_added |= stereo; +} + + + +long Stereo_Buffer::read_samples( blip_sample_t* out, long max_samples ) +{ + long count = bufs [0].samples_avail(); + if ( count > max_samples / 2 ) + count = max_samples / 2; + if ( count ) + { + if ( stereo_added || was_stereo ) + { + mix_stereo( out, count ); + + bufs [0].remove_samples( count ); + bufs [1].remove_samples( count ); + bufs [2].remove_samples( count ); + } + else + { + mix_mono( out, count ); + + bufs [0].remove_samples( count ); + + bufs [1].remove_silence( count ); + bufs [2].remove_silence( count ); + } + + // to do: this might miss opportunities for optimization + if ( !bufs [0].samples_avail() ) { + was_stereo = stereo_added; + stereo_added = false; + } + } + + return count * 2; +} + +void Stereo_Buffer::mix_stereo( blip_sample_t* out, long count ) +{ + Blip_Reader l_left; + Blip_Reader l_right; + Blip_Reader l_center; + + l_left.begin( bufs [1] ); + l_right.begin( bufs [2] ); + int bass = l_center.begin( bufs [0] ); + + while ( count-- ) + { + int c = l_center.read(); + out [0] = c + l_left.read(); + out [1] = c + l_right.read(); + out += 2; + + l_center.next( bass ); + l_left.next( bass ); + l_right.next( bass ); + } + + l_center.end( bufs [0] ); + l_right.end( bufs [2] ); + l_left.end( bufs [1] ); +} + +void Stereo_Buffer::mix_mono( blip_sample_t* out, long count ) +{ + Blip_Reader in; + int bass = in.begin( bufs [0] ); + + while ( count-- ) + { + int sample = in.read(); + out [0] = sample; + out [1] = sample; + out += 2; + in.next( bass ); + } + + in.end( bufs [0] ); +} + diff --git a/Mednafen/mednafen/sound/Stereo_Buffer.h b/Mednafen/mednafen/sound/Stereo_Buffer.h new file mode 100644 index 0000000000..3d907fac54 --- /dev/null +++ b/Mednafen/mednafen/sound/Stereo_Buffer.h @@ -0,0 +1,69 @@ + +// Simple stereo Blip_Buffer for sound emulators whose oscillators output +// either on the left only, center, or right only. + +// Blip_Buffer 0.3.0. Copyright (C) 2003-2004 Shay Green. GNU GPL license. + +#ifndef STEREO_BUFFER_H +#define STEREO_BUFFER_H + +#include "Blip_Buffer.h" + +class Stereo_Buffer { +public: + Stereo_Buffer(); + ~Stereo_Buffer(); + + // Same as in Blip_Buffer (see Blip_Buffer.h) + bool set_sample_rate( long, int msec = 0 ); + void clock_rate( long ); + void bass_freq( int ); + void clear(); + + // Buffers to output synthesis to + Blip_Buffer* left(); + Blip_Buffer* center(); + Blip_Buffer* right(); + + // Same as in Blip_Buffer. For more efficient operation, pass false + // for was_stereo if the left and right buffers had nothing added + // to them for this frame. + void end_frame( blip_time_t, bool was_stereo = true ); + + // Output is stereo with channels interleved, left before right. Counts + // are in samples, *not* pairs. + long samples_avail() const; + long read_samples( blip_sample_t*, long ); + +private: + // noncopyable + Stereo_Buffer( const Stereo_Buffer& ); + Stereo_Buffer& operator = ( const Stereo_Buffer& ); + + enum { buf_count = 3 }; + Blip_Buffer bufs [buf_count]; + bool stereo_added; + bool was_stereo; + + void mix_stereo( blip_sample_t*, long ); + void mix_mono( blip_sample_t*, long ); +}; + + inline Blip_Buffer* Stereo_Buffer::left() { + return &bufs [1]; + } + + inline Blip_Buffer* Stereo_Buffer::center() { + return &bufs [0]; + } + + inline Blip_Buffer* Stereo_Buffer::right() { + return &bufs [2]; + } + + inline long Stereo_Buffer::samples_avail() const { + return bufs [0].samples_avail(); + } + +#endif + diff --git a/Mednafen/mednafen/sound/WAVRecord.cpp b/Mednafen/mednafen/sound/WAVRecord.cpp new file mode 100644 index 0000000000..9c37a7767e --- /dev/null +++ b/Mednafen/mednafen/sound/WAVRecord.cpp @@ -0,0 +1,99 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "WAVRecord.h" +#include + +WAVRecord::WAVRecord(const char *path, double SoundRate_arg, uint32 SoundChan_arg) : wavfile(path, FileStream::MODE_WRITE_SAFE) +{ + Finished = false; + PCMBytesWritten = 0; + + SoundRate = SoundRate_arg; + SoundChan = SoundChan_arg; + + memset(&raw_headers, 0, sizeof(raw_headers)); + + MDFN_en32msb(&raw_headers[0x00], 0x52494646); // "RIFF" + // @ 0x04 = total file size - 8 bytes + MDFN_en32msb(&raw_headers[0x08], 0x57415645); // "WAVE" + + + MDFN_en32msb(&raw_headers[0x0C], 0x666d7420); // "fmt " + MDFN_en32lsb(&raw_headers[0x10], 16); + MDFN_en16lsb(&raw_headers[0x14], 1); // PCM format + MDFN_en16lsb(&raw_headers[0x16], SoundChan); // Number of sound channels + MDFN_en32lsb(&raw_headers[0x18], SoundRate); // Sampling rate + MDFN_en32lsb(&raw_headers[0x1C], SoundRate * SoundChan * sizeof(int16)); //Byte rate + MDFN_en16lsb(&raw_headers[0x20], SoundChan * sizeof(int16)); // Block("audio frame" in Mednafen) alignment + MDFN_en16lsb(&raw_headers[0x22], sizeof(int16) * 8); // Bits per sample. + + MDFN_en32msb(&raw_headers[0x24], 0x64617461); // "data" + // @ 0x28 = bytes of PCM data following + + wavfile.write(raw_headers, sizeof(raw_headers)); +} + +void WAVRecord::WriteSound(const int16 *SoundBuf, uint32 NumSoundFrames) +{ + uint32 NumSoundSamples = NumSoundFrames * SoundChan; + + while(NumSoundSamples > 0) + { + int16 swap_buf[256]; + uint32 s_this_time = std::min((uint32)NumSoundSamples, (uint32)256); + + for(uint32 i = 0; i < s_this_time; i++) + MDFN_en16lsb((uint8 *)&swap_buf[i], SoundBuf[i]); + + wavfile.write(swap_buf, s_this_time * sizeof(int16)); + PCMBytesWritten += s_this_time * sizeof(int16); + NumSoundSamples -= s_this_time; + SoundBuf += s_this_time; + } + +} + + +void WAVRecord::Finish(void) +{ + if(Finished) + return; + + MDFN_en32lsb(&raw_headers[0x04], std::min(wavfile.tell() - 8, 0xFFFFFFFF)); + + MDFN_en32lsb(&raw_headers[0x28], std::min(PCMBytesWritten, 0xFFFFFFFF)); + + wavfile.seek(0, SEEK_SET); + wavfile.write(raw_headers, sizeof(raw_headers)); + wavfile.close(); + + Finished = true; +} + +WAVRecord::~WAVRecord() +{ + try + { + Finish(); + } + catch(std::exception &e) + { + MDFND_PrintError(e.what()); + } +} diff --git a/Mednafen/mednafen/sound/WAVRecord.h b/Mednafen/mednafen/sound/WAVRecord.h new file mode 100644 index 0000000000..1919f11f55 --- /dev/null +++ b/Mednafen/mednafen/sound/WAVRecord.h @@ -0,0 +1,31 @@ +#ifndef __MDFN_WAVRECORD_H +#define __MDFN_WAVRECORD_H + +#include "../mednafen.h" +#include "../FileStream.h" + +class WAVRecord +{ + public: + + WAVRecord(const char *path, double SoundRate, uint32 SoundChan); + + void WriteSound(const int16 *SoundBuf, uint32 NumSoundFrames); + + void Finish(); + + ~WAVRecord(); + + private: + + FileStream wavfile; + bool Finished; + + uint8 raw_headers[0x2C]; + int64 PCMBytesWritten; + uint32 SoundRate; + uint32 SoundChan; +}; + + +#endif diff --git a/Mednafen/mednafen/sound/fir_blargg_common.h b/Mednafen/mednafen/sound/fir_blargg_common.h new file mode 100644 index 0000000000..7fa5c54cca --- /dev/null +++ b/Mednafen/mednafen/sound/fir_blargg_common.h @@ -0,0 +1,175 @@ +// Sets up common environment for Shay Green's libraries. +// To change configuration options, modify blargg_config.h, not this file. + +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +#include +#include +#include +#include + +#undef BLARGG_COMMON_H +// allow blargg_config.h to #include blargg_common.h +#include "fir_blargg_config.h" +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +// STATIC_CAST(T,expr): Used in place of static_cast (expr) +#ifndef STATIC_CAST + #define STATIC_CAST(T,expr) ((T) (expr)) +#endif + +// blargg_err_t (0 on success, otherwise error string) +#ifndef blargg_err_t + typedef const char* blargg_err_t; +#endif + +// blargg_vector - very lightweight vector of POD types (no constructor/destructor) +template +class blargg_vector { + T* begin_; + size_t size_; +public: + blargg_vector() : begin_( 0 ), size_( 0 ) { } + ~blargg_vector() { free( begin_ ); } + size_t size() const { return size_; } + T* begin() const { return begin_; } + T* end() const { return begin_ + size_; } + blargg_err_t resize( size_t n ) + { + void* p = realloc( begin_, n * sizeof (T) ); + if ( !p && n ) + return "Out of memory"; + begin_ = (T*) p; + size_ = n; + return 0; + } + void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); } + T& operator [] ( size_t n ) const + { + assert( n <= size_ ); // <= to allow past-the-end value + return begin_ [n]; + } +}; + +#ifndef BLARGG_DISABLE_NOTHROW + #if __cplusplus < 199711 + #define BLARGG_THROWS( spec ) + #else + #define BLARGG_THROWS( spec ) throw spec + #endif + #define BLARGG_DISABLE_NOTHROW \ + void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\ + void operator delete ( void* p ) { free( p ); } + #define BLARGG_NEW new +#else + #include + #define BLARGG_NEW new (std::nothrow) +#endif + +#define BLARGG_4CHAR( a, b, c, d ) \ + ((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF)) + +// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0. +#ifndef BOOST_STATIC_ASSERT + #ifdef _MSC_VER + // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] ) + #else + // Some other compilers fail when declaring same function multiple times in class, + // so differentiate them by line + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] ) + #endif +#endif + +// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1, +// compiler is assumed to support bool. If undefined, availability is determined. +#ifndef BLARGG_COMPILER_HAS_BOOL + #if defined (__MWERKS__) + #if !__option(bool) + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (_MSC_VER) + #if _MSC_VER < 1100 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (__GNUC__) + // supports bool + #elif __cplusplus < 199711 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif +#endif +#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL + // If you get errors here, modify your blargg_config.h file + typedef int bool; + const bool true = 1; + const bool false = 0; +#endif + +// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough +#include + +#if INT_MAX >= 0x7FFFFFFF + typedef int blargg_long; +#else + typedef long blargg_long; +#endif + +#if UINT_MAX >= 0xFFFFFFFF + typedef unsigned blargg_ulong; +#else + typedef unsigned long blargg_ulong; +#endif + +// BOOST::int8_t etc. + +// HAVE_STDINT_H: If defined, use for int8_t etc. +#if defined (HAVE_STDINT_H) + #include + #define BOOST + +// HAVE_INTTYPES_H: If defined, use for int8_t etc. +#elif defined (HAVE_INTTYPES_H) + #include + #define BOOST + +#else + struct BOOST + { + #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F + typedef signed char int8_t; + typedef unsigned char uint8_t; + #else + // No suitable 8-bit type available + typedef struct see_blargg_common_h int8_t; + typedef struct see_blargg_common_h uint8_t; + #endif + + #if USHRT_MAX == 0xFFFF + typedef short int16_t; + typedef unsigned short uint16_t; + #else + // No suitable 16-bit type available + typedef struct see_blargg_common_h int16_t; + typedef struct see_blargg_common_h uint16_t; + #endif + + #if ULONG_MAX == 0xFFFFFFFF + typedef long int32_t; + typedef unsigned long uint32_t; + #elif UINT_MAX == 0xFFFFFFFF + typedef int int32_t; + typedef unsigned int uint32_t; + #else + // No suitable 32-bit type available + typedef struct see_blargg_common_h int32_t; + typedef struct see_blargg_common_h uint32_t; + #endif + }; +#endif + +#endif +#endif diff --git a/Mednafen/mednafen/sound/fir_blargg_config.h b/Mednafen/mednafen/sound/fir_blargg_config.h new file mode 100644 index 0000000000..9e9c751d67 --- /dev/null +++ b/Mednafen/mednafen/sound/fir_blargg_config.h @@ -0,0 +1,30 @@ +// Library configuration. Modify this file as necessary. + +#ifndef BLARGG_CONFIG_H +#define BLARGG_CONFIG_H + +// Uncomment to use zlib for transparent decompression of gzipped files +//#define HAVE_ZLIB_H + +// Uncomment to support only the listed game music types. See gme_type_list.cpp +// for a list of all types. +//#define GME_TYPE_LIST gme_nsf_type, gme_gbs_type + +// Uncomment to enable platform-specific optimizations +//#define BLARGG_NONPORTABLE 1 + +// Uncomment to use faster, lower quality sound synthesis +//#define BLIP_BUFFER_FAST 1 + +// Uncomment if automatic byte-order determination doesn't work +//#define BLARGG_BIG_ENDIAN 1 + +// Uncomment if you get errors in the bool section of blargg_common.h +//#define BLARGG_COMPILER_HAS_BOOL 1 + +// Use standard config.h if present +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#endif diff --git a/Mednafen/mednafen/sound/fir_blargg_endian.h b/Mednafen/mednafen/sound/fir_blargg_endian.h new file mode 100644 index 0000000000..4eff587ca9 --- /dev/null +++ b/Mednafen/mednafen/sound/fir_blargg_endian.h @@ -0,0 +1,158 @@ +// CPU Byte Order Utilities + +// Game_Music_Emu 0.5.2 +#ifndef BLARGG_ENDIAN +#define BLARGG_ENDIAN + +#include "fir_blargg_common.h" + +// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16) +#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \ + defined (__x86_64__) || defined (__ia64__) || defined (__i386__) + #define BLARGG_CPU_X86 1 + #define BLARGG_CPU_CISC 1 +#endif + +#if defined (__powerpc__) || defined (__ppc__) || defined (__POWERPC__) || defined (__powerc) + #define BLARGG_CPU_POWERPC 1 +#endif + +// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only +// one may be #defined to 1. Only needed if something actually depends on byte order. +#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN) +#ifdef __GLIBC__ + // GCC handles this for us + #include + #if __BYTE_ORDER == __LITTLE_ENDIAN + #define BLARGG_LITTLE_ENDIAN 1 + #elif __BYTE_ORDER == __BIG_ENDIAN + #define BLARGG_BIG_ENDIAN 1 + #endif +#else + +#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \ + (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234) + #define BLARGG_LITTLE_ENDIAN 1 +#endif + +#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \ + defined (__mips__) || defined (__sparc__) || BLARGG_CPU_POWERPC || \ + (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321) + #define BLARGG_BIG_ENDIAN 1 +#else + // No endian specified; assume little-endian, since it's most common + #define BLARGG_LITTLE_ENDIAN 1 +#endif +#endif +#endif + +#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN + #undef BLARGG_LITTLE_ENDIAN + #undef BLARGG_BIG_ENDIAN +#endif + +inline void blargg_verify_byte_order() +{ + #ifndef NDEBUG + #if BLARGG_BIG_ENDIAN + volatile int i = 1; + assert( *(volatile char*) &i == 0 ); + #elif BLARGG_LITTLE_ENDIAN + volatile int i = 1; + assert( *(volatile char*) &i != 0 ); + #endif + #endif +} + +inline unsigned get_le16( void const* p ) { + return ((unsigned char const*) p) [1] * 0x100u + + ((unsigned char const*) p) [0]; +} +inline unsigned get_be16( void const* p ) { + return ((unsigned char const*) p) [0] * 0x100u + + ((unsigned char const*) p) [1]; +} +inline blargg_ulong get_le32( void const* p ) { + return ((unsigned char const*) p) [3] * 0x01000000u + + ((unsigned char const*) p) [2] * 0x00010000u + + ((unsigned char const*) p) [1] * 0x00000100u + + ((unsigned char const*) p) [0]; +} +inline blargg_ulong get_be32( void const* p ) { + return ((unsigned char const*) p) [0] * 0x01000000u + + ((unsigned char const*) p) [1] * 0x00010000u + + ((unsigned char const*) p) [2] * 0x00000100u + + ((unsigned char const*) p) [3]; +} +inline void set_le16( void* p, unsigned n ) { + ((unsigned char*) p) [1] = (unsigned char) (n >> 8); + ((unsigned char*) p) [0] = (unsigned char) n; +} +inline void set_be16( void* p, unsigned n ) { + ((unsigned char*) p) [0] = (unsigned char) (n >> 8); + ((unsigned char*) p) [1] = (unsigned char) n; +} +inline void set_le32( void* p, blargg_ulong n ) { + ((unsigned char*) p) [3] = (unsigned char) (n >> 24); + ((unsigned char*) p) [2] = (unsigned char) (n >> 16); + ((unsigned char*) p) [1] = (unsigned char) (n >> 8); + ((unsigned char*) p) [0] = (unsigned char) n; +} +inline void set_be32( void* p, blargg_ulong n ) { + ((unsigned char*) p) [0] = (unsigned char) (n >> 24); + ((unsigned char*) p) [1] = (unsigned char) (n >> 16); + ((unsigned char*) p) [2] = (unsigned char) (n >> 8); + ((unsigned char*) p) [3] = (unsigned char) n; +} + +#if BLARGG_NONPORTABLE + // Optimized implementation if byte order is known + #if BLARGG_LITTLE_ENDIAN + #define GET_LE16( addr ) (*(BOOST::uint16_t*) (addr)) + #define GET_LE32( addr ) (*(BOOST::uint32_t*) (addr)) + #define SET_LE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) + #define SET_LE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) + #elif BLARGG_BIG_ENDIAN + #define GET_BE16( addr ) (*(BOOST::uint16_t*) (addr)) + #define GET_BE32( addr ) (*(BOOST::uint32_t*) (addr)) + #define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) + #define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) + #endif + + #if BLARGG_CPU_POWERPC && defined (__MWERKS__) + // PowerPC has special byte-reversed instructions + // to do: assumes that PowerPC is running in big-endian mode + // to do: implement for other compilers which don't support these macros + #define GET_LE16( addr ) (__lhbrx( (addr), 0 )) + #define GET_LE32( addr ) (__lwbrx( (addr), 0 )) + #define SET_LE16( addr, data ) (__sthbrx( (data), (addr), 0 )) + #define SET_LE32( addr, data ) (__stwbrx( (data), (addr), 0 )) + #endif +#endif + +#ifndef GET_LE16 + #define GET_LE16( addr ) get_le16( addr ) + #define GET_LE32( addr ) get_le32( addr ) + #define SET_LE16( addr, data ) set_le16( addr, data ) + #define SET_LE32( addr, data ) set_le32( addr, data ) +#endif + +#ifndef GET_BE16 + #define GET_BE16( addr ) get_be16( addr ) + #define GET_BE32( addr ) get_be32( addr ) + #define SET_BE16( addr, data ) set_be16( addr, data ) + #define SET_BE32( addr, data ) set_be32( addr, data ) +#endif + +// auto-selecting versions + +inline void set_le( BOOST::uint16_t* p, unsigned n ) { SET_LE16( p, n ); } +inline void set_le( BOOST::uint32_t* p, blargg_ulong n ) { SET_LE32( p, n ); } +inline void set_be( BOOST::uint16_t* p, unsigned n ) { SET_BE16( p, n ); } +inline void set_be( BOOST::uint32_t* p, blargg_ulong n ) { SET_BE32( p, n ); } +inline unsigned get_le( BOOST::uint16_t* p ) { return GET_LE16( p ); } +inline blargg_ulong get_le( BOOST::uint32_t* p ) { return GET_LE32( p ); } +inline unsigned get_be( BOOST::uint16_t* p ) { return GET_BE16( p ); } +inline blargg_ulong get_be( BOOST::uint32_t* p ) { return GET_BE32( p ); } + +#endif diff --git a/Mednafen/mednafen/sound/fir_blargg_source.h b/Mednafen/mednafen/sound/fir_blargg_source.h new file mode 100644 index 0000000000..945bf34985 --- /dev/null +++ b/Mednafen/mednafen/sound/fir_blargg_source.h @@ -0,0 +1,78 @@ +// Included at the beginning of library source files, after all other #include lines +#ifndef BLARGG_SOURCE_H +#define BLARGG_SOURCE_H + +// If debugging is enabled, abort program if expr is false. Meant for checking +// internal state and consistency. A failed assertion indicates a bug in the module. +// void assert( bool expr ); +#include + +// If debugging is enabled and expr is false, abort program. Meant for checking +// caller-supplied parameters and operations that are outside the control of the +// module. A failed requirement indicates a bug outside the module. +// void require( bool expr ); +#undef require +#define require( expr ) assert( expr ) + +// Like printf() except output goes to debug log file. Might be defined to do +// nothing (not even evaluate its arguments). +// void dprintf( const char* format, ... ); +inline void blargg_dprintf_( const char*, ... ) { } +#undef dprintf +#define dprintf (1) ? (void) 0 : blargg_dprintf_ + +// If enabled, evaluate expr and if false, make debug log entry with source file +// and line. Meant for finding situations that should be examined further, but that +// don't indicate a problem. In all cases, execution continues normally. +#undef check +#define check( expr ) ((void) 0) + +// If expr yields error string, return it from current function, otherwise continue. +#undef RETURN_ERR +#define RETURN_ERR( expr ) do { \ + blargg_err_t blargg_return_err_ = (expr); \ + if ( blargg_return_err_ ) return blargg_return_err_; \ + } while ( 0 ) + +// If ptr is 0, return out of memory error string. +#undef CHECK_ALLOC +#define CHECK_ALLOC( ptr ) do { if ( (ptr) == 0 ) return "Out of memory"; } while ( 0 ) + +// Avoid any macros which evaluate their arguments multiple times +#undef min +#undef max + +// using const references generates crappy code, and I am currenly only using these +// for built-in types, so they take arguments by value + +template +inline T min( T x, T y ) +{ + if ( x < y ) + return x; + return y; +} + +template +inline T max( T x, T y ) +{ + if ( x < y ) + return y; + return x; +} + +// TODO: good idea? bad idea? +#undef byte +#define byte byte_ +typedef unsigned char byte; + +// deprecated +#define BLARGG_CHECK_ALLOC CHECK_ALLOC +#define BLARGG_RETURN_ERR RETURN_ERR + +// BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf and check +#ifdef BLARGG_SOURCE_BEGIN + #include BLARGG_SOURCE_BEGIN +#endif + +#endif diff --git a/Mednafen/mednafen/sound/okiadpcm-deltatable.h b/Mednafen/mednafen/sound/okiadpcm-deltatable.h new file mode 100644 index 0000000000..0b892436c6 --- /dev/null +++ b/Mednafen/mednafen/sound/okiadpcm-deltatable.h @@ -0,0 +1,98 @@ +{ +2, 6, 10, 14, 18, 22, 26, 30, -2, -6, -10, -14, -18, -22, -26, -30 }, +{ +2, 6, 10, 14, 19, 23, 27, 31, -2, -6, -10, -14, -19, -23, -27, -31 }, +{ +2, 6, 11, 15, 21, 25, 30, 34, -2, -6, -11, -15, -21, -25, -30, -34 }, +{ +2, 7, 12, 17, 23, 28, 33, 38, -2, -7, -12, -17, -23, -28, -33, -38 }, +{ +2, 7, 13, 18, 25, 30, 36, 41, -2, -7, -13, -18, -25, -30, -36, -41 }, +{ +3, 9, 15, 21, 28, 34, 40, 46, -3, -9, -15, -21, -28, -34, -40, -46 }, +{ +3, 10, 17, 24, 31, 38, 45, 52, -3, -10, -17, -24, -31, -38, -45, -52 }, +{ +3, 10, 18, 25, 34, 41, 49, 56, -3, -10, -18, -25, -34, -41, -49, -56 }, +{ +4, 12, 21, 29, 38, 46, 55, 63, -4, -12, -21, -29, -38, -46, -55, -63 }, +{ +4, 13, 22, 31, 41, 50, 59, 68, -4, -13, -22, -31, -41, -50, -59, -68 }, +{ +5, 15, 25, 35, 46, 56, 66, 76, -5, -15, -25, -35, -46, -56, -66, -76 }, +{ +5, 16, 27, 38, 50, 61, 72, 83, -5, -16, -27, -38, -50, -61, -72, -83 }, +{ +6, 18, 31, 43, 56, 68, 81, 93, -6, -18, -31, -43, -56, -68, -81, -93 }, +{ +6, 19, 33, 46, 61, 74, 88, 101, -6, -19, -33, -46, -61, -74, -88, -101 }, +{ +7, 22, 37, 52, 67, 82, 97, 112, -7, -22, -37, -52, -67, -82, -97, -112 }, +{ +8, 24, 41, 57, 74, 90, 107, 123, -8, -24, -41, -57, -74, -90, -107, -123 }, +{ +9, 27, 45, 63, 82, 100, 118, 136, -9, -27, -45, -63, -82, -100, -118, -136 }, +{ +10, 30, 50, 70, 90, 110, 130, 150, -10, -30, -50, -70, -90, -110, -130, -150 }, +{ +11, 33, 55, 77, 99, 121, 143, 165, -11, -33, -55, -77, -99, -121, -143, -165 }, +{ +12, 36, 60, 84, 109, 133, 157, 181, -12, -36, -60, -84, -109, -133, -157, -181 }, +{ +13, 39, 66, 92, 120, 146, 173, 199, -13, -39, -66, -92, -120, -146, -173, -199 }, +{ +14, 43, 73, 102, 132, 161, 191, 220, -14, -43, -73, -102, -132, -161, -191, -220 }, +{ +16, 48, 81, 113, 146, 178, 211, 243, -16, -48, -81, -113, -146, -178, -211, -243 }, +{ +17, 52, 88, 123, 160, 195, 231, 266, -17, -52, -88, -123, -160, -195, -231, -266 }, +{ +19, 58, 97, 136, 176, 215, 254, 293, -19, -58, -97, -136, -176, -215, -254, -293 }, +{ +21, 64, 107, 150, 194, 237, 280, 323, -21, -64, -107, -150, -194, -237, -280, -323 }, +{ +23, 70, 118, 165, 213, 260, 308, 355, -23, -70, -118, -165, -213, -260, -308, -355 }, +{ +26, 78, 130, 182, 235, 287, 339, 391, -26, -78, -130, -182, -235, -287, -339, -391 }, +{ +28, 85, 143, 200, 258, 315, 373, 430, -28, -85, -143, -200, -258, -315, -373, -430 }, +{ +31, 94, 157, 220, 284, 347, 410, 473, -31, -94, -157, -220, -284, -347, -410, -473 }, +{ +34, 103, 173, 242, 313, 382, 452, 521, -34, -103, -173, -242, -313, -382, -452, -521 }, +{ +38, 114, 191, 267, 345, 421, 498, 574, -38, -114, -191, -267, -345, -421, -498, -574 }, +{ +42, 126, 210, 294, 379, 463, 547, 631, -42, -126, -210, -294, -379, -463, -547, -631 }, +{ +46, 138, 231, 323, 417, 509, 602, 694, -46, -138, -231, -323, -417, -509, -602, -694 }, +{ +51, 153, 255, 357, 459, 561, 663, 765, -51, -153, -255, -357, -459, -561, -663, -765 }, +{ +56, 168, 280, 392, 505, 617, 729, 841, -56, -168, -280, -392, -505, -617, -729, -841 }, +{ +61, 184, 308, 431, 555, 678, 802, 925, -61, -184, -308, -431, -555, -678, -802, -925 }, +{ +68, 204, 340, 476, 612, 748, 884, 1020, -68, -204, -340, -476, -612, -748, -884, -1020 }, +{ +74, 223, 373, 522, 672, 821, 971, 1120, -74, -223, -373, -522, -672, -821, -971, -1120 }, +{ +82, 246, 411, 575, 740, 904, 1069, 1233, -82, -246, -411, -575, -740, -904, -1069, -1233 }, +{ +90, 271, 452, 633, 814, 995, 1176, 1357, -90, -271, -452, -633, -814, -995, -1176, -1357 }, +{ +99, 298, 497, 696, 895, 1094, 1293, 1492, -99, -298, -497, -696, -895, -1094, -1293, -1492 }, +{ +109, 328, 547, 766, 985, 1204, 1423, 1642, -109, -328, -547, -766, -985, -1204, -1423, -1642 }, +{ +120, 360, 601, 841, 1083, 1323, 1564, 1804, -120, -360, -601, -841, -1083, -1323, -1564, -1804 }, +{ +132, 397, 662, 927, 1192, 1457, 1722, 1987, -132, -397, -662, -927, -1192, -1457, -1722, -1987 }, +{ +145, 436, 728, 1019, 1311, 1602, 1894, 2185, -145, -436, -728, -1019, -1311, -1602, -1894, -2185 }, +{ +160, 480, 801, 1121, 1442, 1762, 2083, 2403, -160, -480, -801, -1121, -1442, -1762, -2083, -2403 }, +{ +176, 528, 881, 1233, 1587, 1939, 2292, 2644, -176, -528, -881, -1233, -1587, -1939, -2292, -2644 }, +{ +194, 582, 970, 1358, 1746, 2134, 2522, 2910, -194, -582, -970, -1358, -1746, -2134, -2522, -2910 }, diff --git a/Mednafen/mednafen/sound/okiadpcm.cpp b/Mednafen/mednafen/sound/okiadpcm.cpp new file mode 100644 index 0000000000..c8b8d904f9 --- /dev/null +++ b/Mednafen/mednafen/sound/okiadpcm.cpp @@ -0,0 +1,49 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "okiadpcm.h" +#include + +const int OKIADPCM_StepSizes[49] = +{ + // These can also be generated like: + // double start = 16; + // for(int x = 0; x < 49; x++) + // { + // printf("%d, ", (int)start); + // start *= 1.1; + // } + 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, + 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, + 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, + 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, +}; + +const int OKIADPCM_StepIndexDeltas[16] = +{ + -1, -1, -1, -1, 2, 4, 6, 8, + -1, -1, -1, -1, 2, 4, 6, 8 +}; + +const int32 OKIADPCM_DeltaTable[49][16] = +{ + #ifndef OKIADPCM_GENERATE_DELTATABLE + #include "okiadpcm-deltatable.h" + #endif +}; + diff --git a/Mednafen/mednafen/sound/okiadpcm.h b/Mednafen/mednafen/sound/okiadpcm.h new file mode 100644 index 0000000000..90b4a31fcd --- /dev/null +++ b/Mednafen/mednafen/sound/okiadpcm.h @@ -0,0 +1,165 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_OKIADPCM_H +#define __MDFN_OKIADPCM_H + +// PC-FX ADPCM decoder not finished! + +typedef enum +{ + OKIADPCM_MSM5205 = 0, + OKIADPCM_MSM5218 = 1, + OKIADPCM_COUNT +} OKIADPCM_Chip; + +extern const int OKIADPCM_StepSizes[49]; +extern const int OKIADPCM_StepIndexDeltas[16]; +extern const int32 OKIADPCM_DeltaTable[49][16]; + +template +class OKIADPCM_Decoder +{ + public: + + OKIADPCM_Decoder() + { + assert(CHIP_TYPE < OKIADPCM_COUNT); + + CurSample = 0x0800; + + StepSizeIndex = 0; + } + ~OKIADPCM_Decoder() + { + + } + + INLINE uint16 GetSample(void) + { + return(CurSample); + } + + INLINE void SetSample(uint16 new_sample) + { + assert(new_sample <= 0xFFF); + CurSample = new_sample; + } + + INLINE uint8 GetSSI(void) + { + return(StepSizeIndex); + } + + INLINE void SetSSI(uint8 new_ssi) + { + assert(new_ssi <= 48); + StepSizeIndex = new_ssi; + } + + // DecodeDelta returns the coded delta for the given nibble and (previous) predictor. + // It will not wrap nor saturate the returned value, and CurSample is not updated. + INLINE int32 DecodeDelta(const uint8 nibble) + { + int32 ret = OKIADPCM_DeltaTable[StepSizeIndex][nibble]; + + StepSizeIndex += OKIADPCM_StepIndexDeltas[nibble]; + + if(StepSizeIndex < 0) + StepSizeIndex = 0; + + if(StepSizeIndex > 48) + StepSizeIndex = 48; + + return(ret); + } + + // This function will return the full 12-bits, it's up to the caller to + // truncate as necessary(MSM5205 only has a 10-bit D/A, MSM5218 has a 12-bit D/A) + INLINE uint16 Decode(const uint8 nibble) + { + CurSample += DecodeDelta(nibble); + + if(CHIP_TYPE == OKIADPCM_MSM5205) + { + CurSample &= 0xFFF; + } + else if(CHIP_TYPE == OKIADPCM_MSM5218) + { + if(CurSample > 0xFFF) + CurSample = 0xFFF; + if(CurSample < 0) + CurSample = 0; + } + return(CurSample); + } + + private: + int32 CurSample; + int32 StepSizeIndex; +}; + +template +class OKIADPCM_Encoder +{ + public: + + OKIADPCM_Encoder() + { + Accum = 0x800; + StepSizeIndex = 0; + } + + ~OKIADPCM_Encoder() + { + + } + + uint8 EncodeSample(uint16 in_sample) + { + uint8 nibble = 0; + int32 sample_delta = in_sample - Accum; + int piece; + + piece = (abs(sample_delta) * 4 / OKIADPCM_StepSizes[StepSizeIndex]); + if(piece > 0x7) + piece = 0x7; + + nibble = ((uint32)(sample_delta >> 31) & 0x8) | piece; + + // Update Accum and StepSizeIndex! + Accum += OKIADPCM_DeltaTable[StepSizeIndex][nibble]; + StepSizeIndex += OKIADPCM_StepIndexDeltas[nibble]; + + if(Accum > 0xFFF) Accum = 0xFFF; + if(Accum < 0) Accum = 0; + + if(StepSizeIndex < 0) + StepSizeIndex = 0; + + if(StepSizeIndex > 48) + StepSizeIndex = 48; + + return(nibble); + } + + private: + int32 Accum; + int32 StepSizeIndex; + OKIADPCM_Chip ChipType; +}; +#endif diff --git a/Mednafen/mednafen/sound/okiadpcm_generate.cpp b/Mednafen/mednafen/sound/okiadpcm_generate.cpp new file mode 100644 index 0000000000..ba2825c2f8 --- /dev/null +++ b/Mednafen/mednafen/sound/okiadpcm_generate.cpp @@ -0,0 +1,78 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* Generates okiadpcm-deltatable.h for okiadpcm.cpp */ +/* WARNING: Not compiled/updated automatically. */ + +#define OKIADPCM_GENERATE_DELTATABLE +#include "okiadpcm.cpp" // EVIL EVIL BE GONE YE EVIL + +static void BuildDeltaTable(int32 DeltaTable[49][16]) +{ + int32 extra_accuracy_mul; + int32 extra_accuracy_div; + + extra_accuracy_mul = 1; + extra_accuracy_div = 1; + + for(int ssi = 0; ssi < 49; ssi++) + { + for(int nibbles = 0; nibbles < 16; nibbles++) + { + int32 ssn = OKIADPCM_StepSizes[ssi]; + int32 delta = 0; + + if(nibbles & 0x4) + delta += ssn * extra_accuracy_mul; + + if(nibbles & 0x2) + delta += ssn * extra_accuracy_mul / 2; + + if(nibbles & 0x1) + delta += ssn * extra_accuracy_mul / 4; + + delta += ssn * extra_accuracy_mul / 8; + + // Divide(or shift right in the future!) before inverting the sign so there won't be any asymmetric rounding issues + // for negative numbers. + delta /= extra_accuracy_div; + + if(nibbles & 8) + delta = -delta; + + DeltaTable[ssi][nibbles] = delta; + } + } +} + +int main(int argc, char *argv[]) +{ + int32 DeltaTable[49][16]; + + BuildDeltaTable(DeltaTable); + + for(int ssi = 0; ssi < 49; ssi++) + { + puts("{"); + for(int nibbles = 0; nibbles < 16; nibbles++) + { + printf((nibbles == 15) ? "%d ":"%d, ", DeltaTable[ssi][nibbles]); + } + puts("},"); + } + + return(0); +} diff --git a/Mednafen/mednafen/state-common.h b/Mednafen/mednafen/state-common.h new file mode 100644 index 0000000000..3bdfd44234 --- /dev/null +++ b/Mednafen/mednafen/state-common.h @@ -0,0 +1,18 @@ +#ifndef __MDFN_STATE_COMMON_H +#define __MDFN_STATE_COMMON_H + +typedef struct +{ + int status[10]; + int current; + int current_movie; // For movies only, status(recording/playback) + + // The most recently-saved-to slot + int recently_saved; + + // R, G, B, R, G, B, R, G, B, ... for w * h * 3 + uint8 *gfx; + uint32 w, h; +} StateStatusStruct; + +#endif diff --git a/Mednafen/mednafen/state-driver.h b/Mednafen/mednafen/state-driver.h new file mode 100644 index 0000000000..771a7fbcee --- /dev/null +++ b/Mednafen/mednafen/state-driver.h @@ -0,0 +1,21 @@ +#ifndef __MDFN_STATE_DRIVER_H +#define __MDFN_STATE_DRIVER_H + +#include "video.h" +#include "state-common.h" + +// +// "fname", when non-NULL, overrides the default save state filename generation. +// "suffix", when non-NULL, just override the default suffix(mc0-mc9). +// +// Returns true on success, false on failure. Error messages outputted via MDFND_PrintError() as usual. +// +bool MDFNI_SaveState(const char *fname, const char *suffix, const MDFN_Surface *surface, const MDFN_Rect *DisplayRect, const int32 *LineWidths) noexcept; +bool MDFNI_LoadState(const char *fname, const char *suffix) noexcept; + +void MDFNI_SelectState(int) noexcept; + +void MDFND_SetStateStatus(StateStatusStruct *status) noexcept; +void MDFND_SetMovieStatus(StateStatusStruct *status) noexcept; + +#endif diff --git a/Mednafen/mednafen/state.cpp b/Mednafen/mednafen/state.cpp new file mode 100644 index 0000000000..f25e257313 --- /dev/null +++ b/Mednafen/mednafen/state.cpp @@ -0,0 +1,797 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" + +#include +#include +#include +#include +#include + +#include +#include "driver.h" +#include "general.h" +#include "state.h" +#include "movie.h" +#include "netplay.h" +#include "video.h" +#include "video/resize.h" + +#include "MemoryStream.h" +#include "compress/GZFileStream.h" +#include + +static void SubWrite(Stream *st, SFORMAT *sf) +{ + while(sf->size || sf->name) // Size can sometimes be zero, so also check for the text name. These two should both be zero only at the end of a struct. + { + if(!sf->size || !sf->v) + { + sf++; + continue; + } + + if(sf->size == (uint32)~0) /* Link to another struct. */ + { + SubWrite(st, (SFORMAT *)sf->v); + + sf++; + continue; + } + + int32 bytesize = sf->size; + char nameo[1 + 255]; + const int slen = strlen(sf->name); + + if(slen > 255) + throw MDFN_Error(0, _("State variable name \"%s\" is too long."), sf->name); + + memcpy(&nameo[1], sf->name, slen); + nameo[0] = slen; + + st->write(nameo, 1 + nameo[0]); + st->put_LE(bytesize); + + // Special case for the evil bool type, to convert bool to 1-byte elements. + if(sf->flags & MDFNSTATE_BOOL) + { + for(int32 bool_monster = 0; bool_monster < bytesize; bool_monster++) + { + uint8 tmp_bool = ((bool *)sf->v)[bool_monster]; + //printf("Bool write: %.31s\n", sf->name); + st->write(&tmp_bool, 1); + } + } + else + { + st->write((uint8 *)sf->v, bytesize); + } + + sf++; + } +} + +struct compare_cstr +{ + bool operator()(const char *s1, const char *s2) const + { + return(strcmp(s1, s2) < 0); + } +}; + +typedef std::map SFMap_t; + +static void MakeSFMap(SFORMAT *sf, SFMap_t &sfmap) +{ + while(sf->size || sf->name) // Size can sometimes be zero, so also check for the text name. These two should both be zero only at the end of a struct. + { + if(!sf->size || !sf->v) + { + sf++; + continue; + } + + if(sf->size == (uint32)~0) /* Link to another SFORMAT structure. */ + MakeSFMap((SFORMAT *)sf->v, sfmap); + else + { + assert(sf->name); + + if(sfmap.find(sf->name) != sfmap.end()) + printf("Duplicate save state variable in internal emulator structures(CLUB THE PROGRAMMERS WITH BREADSTICKS): %s\n", sf->name); + + sfmap[sf->name] = sf; + } + + sf++; + } +} + +static void ReadStateChunk(Stream *st, SFORMAT *sf, uint32 size, const bool svbe) +{ + SFMap_t sfmap; + SFMap_t sfmap_found; // Used for identifying variables that are missing in the save state. + + MakeSFMap(sf, sfmap); + + uint64 temp = st->tell(); + while(st->tell() < (temp + size)) + { + uint32 recorded_size; // In bytes + uint8 toa[1 + 256]; // Don't change to char unless cast toa[0] to unsigned to smem_read() and other places. + + st->read(toa, 1); + st->read(toa + 1, toa[0]); + + toa[1 + toa[0]] = 0; + + recorded_size = st->get_LE(); + + SFMap_t::iterator sfmit; + + sfmit = sfmap.find((char *)toa + 1); + + if(sfmit != sfmap.end()) + { + SFORMAT *tmp = sfmit->second; + uint32 expected_size = tmp->size; // In bytes + + if(recorded_size != expected_size) + { + // Don't error out(throw), but still printf-log it. + printf("Variable in save state wrong size: %s. Need: %u, got: %u\n", toa + 1, expected_size, recorded_size); + st->seek(recorded_size, SEEK_CUR); + } + else + { + sfmap_found[tmp->name] = tmp; + + st->read((uint8 *)tmp->v, expected_size); + + if(tmp->flags & MDFNSTATE_BOOL) + { + // Converting downwards is necessary for the case of sizeof(bool) > 1 + for(int32 bool_monster = expected_size - 1; bool_monster >= 0; bool_monster--) + { + ((bool *)tmp->v)[bool_monster] = ((uint8 *)tmp->v)[bool_monster]; + } + } + else + { + if(svbe) + { + if(tmp->flags & MDFNSTATE_RLSB64) + Endian_A64_NE_BE(tmp->v, expected_size / sizeof(uint64)); + else if(tmp->flags & MDFNSTATE_RLSB32) + Endian_A32_NE_BE(tmp->v, expected_size / sizeof(uint32)); + else if(tmp->flags & MDFNSTATE_RLSB16) + Endian_A16_NE_BE(tmp->v, expected_size / sizeof(uint16)); + else if(tmp->flags & MDFNSTATE_RLSB) + Endian_V_NE_BE(tmp->v, expected_size); + } + else + { + if(tmp->flags & MDFNSTATE_RLSB64) + Endian_A64_NE_LE(tmp->v, expected_size / sizeof(uint64)); + else if(tmp->flags & MDFNSTATE_RLSB32) + Endian_A32_NE_LE(tmp->v, expected_size / sizeof(uint32)); + else if(tmp->flags & MDFNSTATE_RLSB16) + Endian_A16_NE_LE(tmp->v, expected_size / sizeof(uint16)); + else if(tmp->flags & MDFNSTATE_RLSB) + Endian_V_NE_LE(tmp->v, expected_size); + } + } + } + } + else + { + printf("Unknown variable in save state: %s\n", toa + 1); + st->seek(recorded_size, SEEK_CUR); + } + } // while(...) + + for(SFMap_t::const_iterator it = sfmap.begin(); it != sfmap.end(); it++) + { + if(sfmap_found.find(it->second->name) == sfmap_found.end()) + { + printf("Variable of bytesize %u missing from save state: %s\n", it->second->size, it->second->name); + } + } +} + +// +// Fast raw chunk reader/writer. +// +template +static void FastRWChunk(Stream *st, SFORMAT *sf) +{ + while(sf->size || sf->name) // Size can sometimes be zero, so also check for the text name. These two should both be zero only at the end of a struct. + { + if(!sf->size || !sf->v) + { + sf++; + continue; + } + + if(sf->size == (uint32)~0) /* Link to another struct. */ + { + FastRWChunk(st, (SFORMAT *)sf->v); + + sf++; + continue; + } + + int32 bytesize = sf->size; + + // If we're only saving the raw data, and we come across a bool type, we save it as it is in memory, rather than converting it to + // 1-byte. In the SFORMAT structure, the size member for bool entries is the number of bool elements, not the total in-memory size, + // so we adjust it here. + if(sf->flags & MDFNSTATE_BOOL) + bytesize *= sizeof(bool); + + // + // Align large variables(e.g. RAM) to a 16-byte boundary for potentially faster memory copying, before we read/write it. + // + if(bytesize >= 65536) + st->seek((st->tell() + 15) &~ 15, SEEK_SET); + + if(load) + st->read((uint8 *)sf->v, bytesize); + else + st->write((uint8 *)sf->v, bytesize); + sf++; + } +} + +// +// When updating this function make sure to adhere to the guarantees in state.h. +// +bool MDFNSS_StateAction(StateMem *sm, const unsigned load, const bool data_only, SFORMAT *sf, const char *sname, const bool optional) noexcept +{ + //printf("Section: %s %zu\n", sname, strlen(sname)); + + if(MDFN_UNLIKELY(sm->deferred_error)) + { + return(load ? false : true); + } + + try + { + Stream* st = sm->st; + + if(MDFN_LIKELY(data_only)) // Not particularly likely, but it's more important to optimize for this code path... + { + static const uint8 SSFastCanary[8] = { 0x42, 0xA3, 0x10, 0x87, 0xBC, 0x6D, 0xF2, 0x79 }; + char sname_canary[32 + 8]; + + if(load) + { + st->read(sname_canary, 32 + 8); + + if(strncmp(sname_canary, sname, 32)) + throw MDFN_Error(0, _("Section name mismatch in state loading fast path.")); + + if(memcmp(sname_canary + 32, SSFastCanary, 8)) + throw MDFN_Error(0, _("Section canary is a zombie AAAAAAAAAAGH!")); + + FastRWChunk(st, sf); + } + else + { + memset(sname_canary, 0, sizeof(sname_canary)); + strncpy(sname_canary, sname, 32); + memcpy(sname_canary + 32, SSFastCanary, 8); + st->write(sname_canary, 32 + 8); + + FastRWChunk(st, sf); + } + } + else + { + if(load) + { + char sname_tmp[32]; + bool found = false; + uint32 tmp_size; + uint32 total = 0; + + while(st->tell() < sm->sss_bound) + { + st->read(sname_tmp, 32); + tmp_size = st->get_LE(); + + total += tmp_size + 32 + 4; + + // Yay, we found the section + if(!strncmp(sname_tmp, sname, 32)) + { + ReadStateChunk(st, sf, tmp_size, sm->svbe); + found = true; + break; + } + else + { + st->seek(tmp_size, SEEK_CUR); + } + } + + st->seek(-(int64)total, SEEK_CUR); + + if(!found) + { + if(optional) + { + printf("Missing optional section: %.32s\n", sname); + return(false); + } + else + throw MDFN_Error(0, _("Section missing: %.32s"), sname); + } + } + else + { + int64 data_start_pos; + int64 end_pos; + uint8 sname_tmp[32]; + + memset(sname_tmp, 0, sizeof(sname_tmp)); + strncpy((char *)sname_tmp, sname, 32); + + if(strlen(sname) > 32) + printf("Warning: section name is too long: %s\n", sname); + + st->write(sname_tmp, 32); + + st->put_LE(0); // We'll come back and write this later. + + data_start_pos = st->tell(); + SubWrite(st, sf); + end_pos = st->tell(); + + st->seek(data_start_pos - 4, SEEK_SET); + st->put_LE(end_pos - data_start_pos); + st->seek(end_pos, SEEK_SET); + } + } + } + catch(...) + { + sm->deferred_error = std::current_exception(); + return(load ? false : true); + } + return(true); +} + +StateMem::~StateMem(void) +{ + +} + +void StateMem::ThrowDeferred(void) +{ + if(deferred_error) + { + std::exception_ptr te = deferred_error; + deferred_error = nullptr; + std::rethrow_exception(te); + } +} + +void MDFNSS_SaveSM(Stream *st, bool data_only, const MDFN_Surface *surface, const MDFN_Rect *DisplayRect, const int32 *LineWidths) +{ + StateMem sm(st); + + if(data_only) + { + MDFN_StateAction(&sm, 0, true); + sm.ThrowDeferred(); + } + else + { + static const char *header_magic = "MDFNSVST"; + int64 start_pos; + uint8 header[32]; + int neowidth = 0, neoheight = 0; + + memset(header, 0, sizeof(header)); + + if(surface && DisplayRect && LineWidths) + { + bool is_multires = FALSE; + + // We'll want to use the nominal width if the source rectangle is > 25% off on either axis, or the source image has + // multiple horizontal resolutions. + neowidth = MDFNGameInfo->nominal_width; + neoheight = MDFNGameInfo->nominal_height; + + if(LineWidths[0] != ~0) + { + int32 first_w = LineWidths[DisplayRect->y]; + + for(int y = 0; y < DisplayRect->h; y++) + { + if(LineWidths[DisplayRect->y + y] != first_w) + { + //puts("Multires!"); + is_multires = TRUE; + } + } + } + + if(!is_multires) + { + if(((double)DisplayRect->w / MDFNGameInfo->nominal_width) > 0.75 && ((double)DisplayRect->w / MDFNGameInfo->nominal_width) < 1.25) + neowidth = DisplayRect->w; + + if(((double)DisplayRect->h / MDFNGameInfo->nominal_height) > 0.75 && ((double)DisplayRect->h / MDFNGameInfo->nominal_height) < 1.25) + neoheight = DisplayRect->h; + } + } + + memcpy(header, header_magic, 8); + + MDFN_en64lsb(header + 8, time(NULL)); + + MDFN_en32lsb(header + 16, MEDNAFEN_VERSION_NUMERIC); + MDFN_en32lsb(header + 24, neowidth); + MDFN_en32lsb(header + 28, neoheight); + + start_pos = st->tell(); + st->write(header, 32); + + if(surface && DisplayRect && LineWidths) + { + // + // TODO: Make work with 8bpp and 16bpp. + // + MDFN_Surface dest_surface(NULL, neowidth, neoheight, neowidth, surface->format); + MDFN_Rect dest_rect; + + dest_rect.x = 0; + dest_rect.y = 0; + dest_rect.w = neowidth; + dest_rect.h = neoheight; + + MDFN_ResizeSurface(surface, DisplayRect, LineWidths, &dest_surface, &dest_rect); + + { + uint32* previewbuffer = dest_surface.pixels; + uint8* previewbuffer8 = (uint8*)previewbuffer; + + for(int32 a = 0; a < neowidth * neoheight; a++) + { + int nr, ng, nb; + + surface->DecodeColor(previewbuffer[a], nr, ng, nb); + + previewbuffer8[0] = nr; + previewbuffer8[1] = ng; + previewbuffer8[2] = nb; + + previewbuffer8 += 3; + } + } + + st->write((uint8*)dest_surface.pixels, 3 * neowidth * neoheight); + } + + MDFN_StateAction(&sm, 0, data_only); + sm.ThrowDeferred(); + + { + int64 end_pos = st->tell(); + uint32 pv = (end_pos - start_pos) & 0x7FFFFFFF; + + #ifdef MSB_FIRST + pv |= 0x80000000; + #endif + + st->seek(start_pos + 16 + 4, SEEK_SET); + st->put_LE(pv); + st->seek(end_pos, SEEK_SET); // Seek to just beyond end of save state before returning. + } + } +} + +void MDFNSS_LoadSM(Stream *st, bool data_only) +{ + if(MDFN_LIKELY(data_only)) + { + StateMem sm(st); + MDFN_StateAction(&sm, MEDNAFEN_VERSION_NUMERIC, true); + sm.ThrowDeferred(); + } + else + { + uint8 header[32]; + uint32 width, height, preview_len; + uint32 stateversion; + uint32 total_len; + int64 start_pos; + bool svbe; + + start_pos = st->tell(); + st->read(header, 32); + + if(memcmp(header, "MEDNAFENSVESTATE", 16) && memcmp(header, "MDFNSVST", 8)) + throw MDFN_Error(0, _("Missing/Wrong save state header ID.")); + + stateversion = MDFN_de32lsb(header + 16); + total_len = MDFN_de32lsb(header + 20) & 0x7FFFFFFF; + svbe = MDFN_de32lsb(header + 20) & 0x80000000; + width = MDFN_de32lsb(header + 24); + height = MDFN_de32lsb(header + 28); + preview_len = width * height * 3; + + if((int)stateversion < 0x900) // Ensuring that (int)stateversion is > 0 is the most important part. + throw MDFN_Error(0, _("Invalid/Unsupported version in save state header.")); + + st->seek(preview_len, SEEK_CUR); // Skip preview + + StateMem sm(st, start_pos + total_len, svbe); + MDFN_StateAction(&sm, stateversion, false); // Load state data. + sm.ThrowDeferred(); + + st->seek(start_pos + total_len, SEEK_SET); // Seek to just beyond end of save state before returning. + } +} + +// +// +// +static int SaveStateStatus[10]; +static int CurrentState = 0; +static int RecentlySavedState = -1; + +void MDFNSS_CheckStates(void) +{ + time_t last_time = 0; + + if(!MDFNGameInfo->StateAction) + return; + + + for(int ssel = 0; ssel < 10; ssel++) + { + struct stat stat_buf; + + SaveStateStatus[ssel] = false; + //printf("%s\n", MDFN_MakeFName(MDFNMKF_STATE, ssel, 0).c_str()); + if(stat(MDFN_MakeFName(MDFNMKF_STATE, ssel, 0).c_str(), &stat_buf) == 0) + { + SaveStateStatus[ssel] = true; + if(stat_buf.st_mtime > last_time) + { + RecentlySavedState = ssel; + last_time = stat_buf.st_mtime; + } + } + } + + CurrentState = 0; + MDFND_SetStateStatus(NULL); +} + +void MDFNSS_GetStateInfo(const char *filename, StateStatusStruct *status) +{ + uint32 StateShowPBWidth; + uint32 StateShowPBHeight; + uint8 *previewbuffer = NULL; + + try + { + GZFileStream fp(filename, GZFileStream::MODE::READ); + uint8 header[32]; + + fp.read(header, 32); + + uint32 width = MDFN_de32lsb(header + 24); + uint32 height = MDFN_de32lsb(header + 28); + + if(width > 1024) + width = 1024; + + if(height > 1024) + height = 1024; + + previewbuffer = (uint8 *)MDFN_malloc_T(3 * width * height, _("Save state preview buffer")); + fp.read(previewbuffer, 3 * width * height); + + StateShowPBWidth = width; + StateShowPBHeight = height; + } + catch(std::exception &e) + { + if(previewbuffer != NULL) + { + MDFN_free(previewbuffer); + previewbuffer = NULL; + } + + StateShowPBWidth = MDFNGameInfo->nominal_width; + StateShowPBHeight = MDFNGameInfo->nominal_height; + } + + status->gfx = previewbuffer; + status->w = StateShowPBWidth; + status->h = StateShowPBHeight; +} + +void MDFNI_SelectState(int w) noexcept +{ + if(!MDFNGameInfo->StateAction) + return; + + if(w == -1) + { + MDFND_SetStateStatus(NULL); + return; + } + MDFNI_SelectMovie(-1); + + if(w == 666 + 1) + CurrentState = (CurrentState + 1) % 10; + else if(w == 666 - 1) + { + CurrentState--; + + if(CurrentState < 0 || CurrentState > 9) + CurrentState = 9; + } + else + CurrentState = w; + + MDFN_ResetMessages(); + + StateStatusStruct *status = (StateStatusStruct*)MDFN_calloc(1, sizeof(StateStatusStruct), _("Save state status")); + + memcpy(status->status, SaveStateStatus, 10 * sizeof(int)); + + status->current = CurrentState; + status->recently_saved = RecentlySavedState; + + MDFNSS_GetStateInfo(MDFN_MakeFName(MDFNMKF_STATE,CurrentState,NULL).c_str(), status); + MDFND_SetStateStatus(status); +} + +bool MDFNI_SaveState(const char *fname, const char *suffix, const MDFN_Surface *surface, const MDFN_Rect *DisplayRect, const int32 *LineWidths) noexcept +{ + bool ret = true; + + try + { + if(!MDFNGameInfo->StateAction) + { + throw MDFN_Error(0, _("Module \"%s\" doesn't support save states."), MDFNGameInfo->shortname); + } + + if(MDFNnetplay && (MDFNGameInfo->SaveStateAltersState == true)) + { + throw MDFN_Error(0, _("Module %s is not compatible with manual state saving during netplay."), MDFNGameInfo->shortname); + } + + // + // + { + MemoryStream st(65536); + + MDFNSS_SaveSM(&st, false, surface, DisplayRect, LineWidths); + + // + // + // + GZFileStream gp(fname ? std::string(fname) : MDFN_MakeFName(MDFNMKF_STATE,CurrentState,suffix), + GZFileStream::MODE::WRITE, MDFN_GetSettingI("filesys.state_comp_level")); + + gp.write(st.map(), st.size()); + gp.close(); + } + + MDFND_SetStateStatus(NULL); + + if(!fname && !suffix) + { + SaveStateStatus[CurrentState] = true; + RecentlySavedState = CurrentState; + MDFN_DispMessage(_("State %d saved."), CurrentState); + } + } + catch(std::exception &e) + { + if(!fname && !suffix) + MDFN_DispMessage(_("State %d save error: %s"), CurrentState, e.what()); + else + MDFN_PrintError("%s", e.what()); + + if(MDFNnetplay) + MDFND_NetplayText(e.what(), false); + + ret = false; + } + + return(ret); +} + +bool MDFNI_LoadState(const char *fname, const char *suffix) noexcept +{ + bool ret = true; + + try + { + if(!MDFNGameInfo->StateAction) + { + throw MDFN_Error(0, _("Module \"%s\" doesn't support save states."), MDFNGameInfo->shortname); + } + + /* For network play and movies, be load the state locally, and then save the state to a temporary buffer, + and send or record that. This ensures that if an older state is loaded that is missing some + information expected in newer save states, desynchronization won't occur(at least not + from this ;)). + */ + + { + GZFileStream st(fname ? std::string(fname) : MDFN_MakeFName(MDFNMKF_STATE,CurrentState,suffix), GZFileStream::MODE::READ); + uint8 header[32]; + uint32 st_len; + + st.read(header, 32); + + st_len = MDFN_de32lsb(header + 16 + 4) & 0x7FFFFFFF; + + if(st_len < 32) + throw MDFN_Error(0, _("Save state header length field is bad.")); + + MemoryStream sm(st_len, -1); + + memcpy(sm.map(), header, 32); + st.read(sm.map() + 32, st_len - 32); + + MDFNSS_LoadSM(&sm, false); + } + + if(MDFNnetplay) + { + NetplaySendState(); + } + + if(MDFNMOV_IsRecording()) + MDFNMOV_RecordState(); + + MDFND_SetStateStatus(NULL); + + if(!fname && !suffix) + { + SaveStateStatus[CurrentState] = true; + MDFN_DispMessage(_("State %d loaded."), CurrentState); + } + } + catch(std::exception &e) + { + if(!fname && !suffix) + MDFN_DispMessage(_("State %d load error: %s"), CurrentState, e.what()); + else + MDFN_PrintError("%s", e.what()); + + if(MDFNnetplay) + MDFND_NetplayText(e.what(), false); + + ret = false; + } + + return(ret); +} diff --git a/Mednafen/mednafen/state.h b/Mednafen/mednafen/state.h new file mode 100644 index 0000000000..7e22b312a6 --- /dev/null +++ b/Mednafen/mednafen/state.h @@ -0,0 +1,140 @@ +#ifndef __MDFN_STATE_H +#define __MDFN_STATE_H + +#include "video.h" +#include "state-common.h" +#include "Stream.h" + +#include + +void MDFNSS_GetStateInfo(const char *filename, StateStatusStruct *status); + +struct StateMem +{ + StateMem(Stream*s, int64 bnd = 0, bool svbe_ = false) : st(s), sss_bound(bnd), svbe(svbe_) { }; + ~StateMem(); + + Stream* st = NULL; + uint64 sss_bound = 0; // State section search boundary, for state loading only. + bool svbe = false; // State variable data is stored big-endian(for normal-path state loading only). + + std::exception_ptr deferred_error; + void ThrowDeferred(void); +}; + +// +// "st" should be MemoryStream, or FileStream if running in a memory-constrained system. GZFileStream won't work properly due to +// the save state saving code relying on reverse-seeking. +// +// Pass 'true' for data_only to get faster and leaner save states, at the expense of cross-version and cross-platform compatibility(it's mainly intended for +// realtime state rewinding). +// +// On entry, the position of 'st' IS permitted to be greater than 0. +// +// Assuming no errors, and data_only is 'false', the position of 'st' will be just beyond the end of the save state on return. +// +// throws exceptions on errors. +// +void MDFNSS_SaveSM(Stream *st, bool data_only = false, const MDFN_Surface *surface = (MDFN_Surface *)NULL, const MDFN_Rect *DisplayRect = (MDFN_Rect*)NULL, const int32 *LineWidths = (int32*)NULL); +void MDFNSS_LoadSM(Stream *st, bool data_only = false); + +void MDFNSS_CheckStates(void); + +// Flag for a single, >= 1 byte native-endian variable +#define MDFNSTATE_RLSB 0x80000000 + +// 32-bit native-endian elements +#define MDFNSTATE_RLSB32 0x40000000 + +// 16-bit native-endian elements +#define MDFNSTATE_RLSB16 0x20000000 + +// 64-bit native-endian elements +#define MDFNSTATE_RLSB64 0x10000000 + +#define MDFNSTATE_BOOL 0x08000000 + + +//// Array of structures +//#define MDFNSTATE_ARRAYOFS 0x04000000 + +typedef struct { + void *v; // Pointer to the variable/array + uint32 size; // Length, in bytes, of the data to be saved EXCEPT: + // In the case of MDFNSTATE_BOOL, it is the number of bool elements to save(bool is not always 1-byte). + // If 0, the subchunk isn't saved. + uint32 flags; // Flags + const char *name; // Name + //uint32 struct_size; // Only used for MDFNSTATE_ARRAYOFS, sizeof(struct) that members of the linked SFORMAT struct are in. +} SFORMAT; + +static INLINE bool SF_IS_BOOL(bool *) { return(1); } +static INLINE bool SF_IS_BOOL(void *) { return(0); } + +static INLINE uint32 SF_FORCE_AB(bool *) { return(0); } + +static INLINE uint32 SF_FORCE_A8(int8 *) { return(0); } +static INLINE uint32 SF_FORCE_A8(uint8 *) { return(0); } + +static INLINE uint32 SF_FORCE_A16(int16 *) { return(0); } +static INLINE uint32 SF_FORCE_A16(uint16 *) { return(0); } + +static INLINE uint32 SF_FORCE_A32(int32 *) { return(0); } +static INLINE uint32 SF_FORCE_A32(uint32 *) { return(0); } + +static INLINE uint32 SF_FORCE_A64(int64 *) { return(0); } +static INLINE uint32 SF_FORCE_A64(uint64 *) { return(0); } + +static INLINE uint32 SF_FORCE_D(double *) { return(0); } + +template +static INLINE int SF_VAR_OK(const T*) +{ + static_assert(std::is_same::value || sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Bad save state variable."); + return 0; +} + +#define SFVARN(x, n) { &(x), SF_IS_BOOL(&(x)) ? 1U : (uint32)sizeof(x), MDFNSTATE_RLSB | (SF_IS_BOOL(&(x)) ? MDFNSTATE_BOOL : 0) | SF_VAR_OK(&(x)), n } +#define SFVAR(x) SFVARN((x), #x) + +#define SFARRAYN(x, l, n) { (x), (uint32)(l), 0 | SF_FORCE_A8(x), n } +#define SFARRAY(x, l) SFARRAYN((x), (l), #x) + +#define SFARRAYBN(x, l, n) { (x), (uint32)(l), MDFNSTATE_BOOL | SF_FORCE_AB(x), n } +#define SFARRAYB(x, l) SFARRAYBN((x), (l), #x) + +#define SFARRAY16N(x, l, n) { (x), (uint32)((l) * sizeof(uint16)), MDFNSTATE_RLSB16 | SF_FORCE_A16(x), n } +#define SFARRAY16(x, l) SFARRAY16N((x), (l), #x) + +#define SFARRAY32N(x, l, n) { (x), (uint32)((l) * sizeof(uint32)), MDFNSTATE_RLSB32 | SF_FORCE_A32(x), n } +#define SFARRAY32(x, l) SFARRAY32N((x), (l), #x) + +#define SFARRAY64N(x, l, n) { (x), (uint32)((l) * sizeof(uint64)), MDFNSTATE_RLSB64 | SF_FORCE_A64(x), n } +#define SFARRAY64(x, l) SFARRAY64N((x), (l), #x) + +#if SIZEOF_DOUBLE != 8 +#error "sizeof(double) != 8" +#endif + +#define SFARRAYDN(x, l, n) { (x), (uint32)((l) * 8), MDFNSTATE_RLSB64 | SF_FORCE_D(x), n } +#define SFARRAYD(x, l) SFARRAYDN((x), (l), #x) + +#define SFEND { 0, 0, 0, 0 } + +// +// 'load' is 0 on save, and the version numeric contained in the save state on load. +// +// ALWAYS returns 'true' when 'load' is 0(saving), regardless of errors. +// +// When 'load' is non-zero: +// Normally returns true, but if the section was not found and optional was true, returns false. +// +// If an error occurs(such as memory allocation error, stream error, or section-missing error when optional == false), this function +// marks deferred error status in *sm, and that call and all future calls with that particular *sm will return false. +// +// Does NOT throw exceptions, and must NOT throw exceptions, in order to make sure the emulation-module-specific loaded-variable sanitizing code +// is run. +// +bool MDFNSS_StateAction(StateMem *sm, const unsigned load, const bool data_only, SFORMAT *sf, const char *name, const bool optional = false) noexcept; + +#endif diff --git a/Mednafen/mednafen/state_rewind.cpp b/Mednafen/mednafen/state_rewind.cpp new file mode 100644 index 0000000000..3bd9b98133 --- /dev/null +++ b/Mednafen/mednafen/state_rewind.cpp @@ -0,0 +1,264 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mednafen.h" +#include "state.h" +#include "movie.h" +#include "state_rewind.h" + +#include +#include + +#if QLZ_COMPRESSION_LEVEL != 0 + #error "State rewinding code untested with QLZ_COMPRESSION_LEVEL != 0" +#endif + +#include +#include +#include + +struct StateMemPacket +{ + std::unique_ptr data; + uint32 uncompressed_len = 0; // Only non-zero when data is compressed. +}; + +static bool Active = false; +static bool Enabled = false; +static uint32 SRW_AllocHint; +static std::vector bcs; +static size_t bcs_pos; + +static union +{ + char compress[QLZ_SCRATCH_COMPRESS]; + char decompress[QLZ_SCRATCH_DECOMPRESS]; +} qlz_scratch; + +void MDFNSRW_Begin(void) noexcept +{ + if(!Enabled) + return; + + if(!Active) + { + try + { + bcs.resize(std::max(3, MDFN_GetSettingUI("srwframes"))); + bcs_pos = 0; + memset(&qlz_scratch, 0, sizeof(qlz_scratch)); + SRW_AllocHint = 8192; + Active = true; + } + catch(std::exception &e) + { + bcs.clear(); + + MDFN_DispMessage("State rewinding error."); + MDFND_PrintError(e.what()); + } + } +} + +void MDFNSRW_End(void) noexcept +{ + if(Active) + { + bcs.clear(); + + Active = false; + } +} + +bool MDFNSRW_IsRunning(void) noexcept +{ + return(Active); +} + +static INLINE void DoXORFilter(MemoryStream* prev, MemoryStream* cur) noexcept +{ + MDFN_FastMemXOR(prev->map(), cur->map(), std::min(prev->size(), cur->size())); +} + +static INLINE void DoDecompress(StateMemPacket* dp) +{ + std::unique_ptr tmp_buf(new MemoryStream(dp->uncompressed_len, -1)); + + qlz_decompress((char*)dp->data->map(), tmp_buf->map(), qlz_scratch.decompress); + + // + // + // + + delete dp->data.release(); + dp->data = std::move(tmp_buf); + dp->uncompressed_len = 0; +} + +static INLINE void DoCompress(StateMemPacket* dp) +{ + const uint32 uncompressed_len = dp->data->size(); + const uint32 max_compressed_len = (uncompressed_len + 400); + std::unique_ptr tmp_buf(new MemoryStream(max_compressed_len, -1)); + uint32 dst_len; + + dst_len = qlz_compress(dp->data->map(), (char*)tmp_buf->map(), uncompressed_len, qlz_scratch.compress); + tmp_buf->truncate(dst_len); + tmp_buf->shrink_to_fit(); + + // + // + // + + delete dp->data.release(); + dp->data = std::move(tmp_buf); + dp->uncompressed_len = uncompressed_len; +} + +// +// +// +static bool DoRewind(void) +{ + bool ret = false; + + // + // If there's a save state to load, load it. + // + { + StateMemPacket* smp = &bcs[(bcs_pos + bcs.size() - 1) % bcs.size()]; + + if(smp->data) + { + assert(smp->uncompressed_len == 0); + + smp->data->rewind(); + MDFNSS_LoadSM(smp->data.get(), true); + + ret = true; + } + } + + // + // If more than one save state is available, then decompress the save state that comes before the one we just loaded, + // and THEN destroy the save state data we just loaded. + // + { + StateMemPacket* smp = &bcs[(bcs_pos + bcs.size() - 1) % bcs.size()]; + StateMemPacket* smp_nr = &bcs[(bcs_pos + bcs.size() - 2) % bcs.size()]; + + if(smp_nr->data) + { +#if 1 + if(smp_nr->uncompressed_len != 0) + { + DoDecompress(smp_nr); + DoXORFilter(smp_nr->data.get(), smp->data.get()); + } +#endif + // + // + // + *smp = std::move(StateMemPacket()); + bcs_pos = (bcs_pos + bcs.size() - 1) % bcs.size(); + } + } + + return(ret); +} + +// +// +// +static void DoRecord(void) +{ + // + // Save current save state and push it onto the list. + // + { + StateMemPacket smp; + smp.data.reset(new MemoryStream(SRW_AllocHint)); + MDFNSS_SaveSM(smp.data.get(), true); + + if(smp.data->size() > SRW_AllocHint) + SRW_AllocHint = smp.data->size(); + + bcs[bcs_pos] = std::move(smp); + bcs_pos = (bcs_pos + 1) % bcs.size(); + } + + // + // Compress previous save states that need compression(AFTER we push the current state onto the list, for exception-safety). + // +#if 1 + { + for(size_t i = 0; i < bcs.size() - 1; i++) + { + StateMemPacket* smp = &bcs[(bcs_pos + bcs.size() - (1 + i)) % bcs.size()]; + StateMemPacket* smp_nr = &bcs[(bcs_pos + bcs.size() - (2 + i)) % bcs.size()]; + + //printf("%u\n", smp_nr->uncompressed_len); + if(smp_nr->data && smp_nr->uncompressed_len == 0) + { + DoXORFilter(smp_nr->data.get(), smp->data.get()); + try { DoCompress(smp_nr); } catch(...) { DoXORFilter(smp_nr->data.get(), smp->data.get()); } + } + else + break; + } + } +#endif +} + +bool MDFNSRW_Frame(bool rewind) noexcept +{ + if(!Active) + return(false); + + try + { + if(rewind) + { + return DoRewind(); + } + else + { + DoRecord(); + return(false); + } + } + catch(std::exception &e) + { + MDFNSRW_End(); + MDFND_PrintError(e.what()); + MDFN_DispMessage(_("State rewinding error.")); + return(false); + } +} + +bool MDFNI_EnableStateRewind(bool enable) +{ + Enabled = enable; + + if(Enabled) + MDFNSRW_Begin(); + else + MDFNSRW_End(); + + return(Active); +} + diff --git a/Mednafen/mednafen/state_rewind.h b/Mednafen/mednafen/state_rewind.h new file mode 100644 index 0000000000..28e374c8d7 --- /dev/null +++ b/Mednafen/mednafen/state_rewind.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_STATE_REWIND_H +#define __MDFN_STATE_REWIND_H + +bool MDFNSRW_IsRunning(void) noexcept; +void MDFNSRW_Begin(void) noexcept; +void MDFNSRW_End(void) noexcept; +bool MDFNSRW_Frame(bool) noexcept; + +#endif diff --git a/Mednafen/mednafen/string/ConvertUTF.cpp b/Mednafen/mednafen/string/ConvertUTF.cpp new file mode 100644 index 0000000000..64b341a24c --- /dev/null +++ b/Mednafen/mednafen/string/ConvertUTF.cpp @@ -0,0 +1,560 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + + Conversions between UTF32, UTF-16, and UTF-8. Source code file. + Author: Mark E. Davis, 1994. + Rev History: Rick McGowan, fixes & updates May 2001. + Sept 2001: fixed const & error conditions per + mods suggested by S. Parent & A. Lillich. + June 2002: Tim Dodd added detection and handling of incomplete + source sequences, enhanced error detection, added casts + to eliminate compiler warnings. + July 2003: slight mods to back out aggressive FFFE detection. + Jan 2004: updated switches in from-UTF8 conversions. + Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. + + See the header file "ConvertUTF.h" for complete documentation. + +------------------------------------------------------------------------ */ + + +#include "../types.h" +#include "ConvertUTF.h" +#ifdef CVTUTF_DEBUG +#include +#endif + +#include +#include + +static const int halfShift = 10; /* used for shifting by 10 bits */ + +static const UTF32 halfBase = 0x0010000UL; +static const UTF32 halfMask = 0x3FFUL; + +#define UNI_SUR_HIGH_START (UTF32)0xD800 +#define UNI_SUR_HIGH_END (UTF32)0xDBFF +#define UNI_SUR_LOW_START (UTF32)0xDC00 +#define UNI_SUR_LOW_END (UTF32)0xDFFF +#define false 0 +#define true 1 + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF16 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + if (target >= targetEnd) { + result = targetExhausted; break; + } + ch = *source++; + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_LEGAL_UTF32) { + if (flags == strictConversion) { + result = sourceIllegal; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + --source; /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF32 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF32* target = *targetStart; + UTF32 ch, ch2; + while (source < sourceEnd) { + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + if (target >= targetEnd) { + source = oldSource; /* Back up source pointer! */ + result = targetExhausted; break; + } + *target++ = ch; + } + *sourceStart = source; + *targetStart = target; +#ifdef CVTUTF_DEBUG +if (result == sourceIllegal) { + fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); + fflush(stderr); +} +#endif + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Index into the table below with the first byte of a UTF-8 sequence to + * get the number of trailing bytes that are supposed to follow it. + * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is + * left as-is for anyone who may want to do such conversion, which was + * allowed in earlier algorithms. + */ +static const char trailingBytesForUTF8[256] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 +}; + +/* + * Magic values subtracted from a buffer value during UTF8 conversion. + * This table contains as many values as there might be trailing bytes + * in a UTF-8 sequence. + */ +static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, + 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; + +/* + * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed + * into the first byte, depending on how many bytes follow. There are + * as many entries in this table as there are UTF-8 sequence types. + * (I.e., one byte sequence, two byte... etc.). Remember that sequencs + * for *legal* UTF-8 will be 4 or fewer bytes total. + */ +static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +/* --------------------------------------------------------------------- */ + +/* The interface converts a whole buffer to avoid function-call overhead. + * Constants have been gathered. Loops & conditionals have been removed as + * much as possible for efficiency, in favor of drop-through switches. + * (See "Note A" at the bottom of the file for equivalent code.) + * If your compiler supports it, the "isLegalUTF8" call can be turned + * into an inline function. + */ + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF16toUTF8 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF16* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ + ch = *source++; + /* If we have a surrogate pair, convert to UTF32 first. */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { + /* If the 16 bits following the high surrogate are in the source buffer... */ + if (source < sourceEnd) { + UTF32 ch2 = *source; + /* If it's a low surrogate, convert to UTF32. */ + if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { + ch = ((ch - UNI_SUR_HIGH_START) << halfShift) + + (ch2 - UNI_SUR_LOW_START) + halfBase; + ++source; + } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } else { /* We don't have the 16 bits following the high surrogate. */ + --source; /* return to the high surrogate */ + result = sourceExhausted; + break; + } + } else if (flags == strictConversion) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* Figure out how many bytes the result will require */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + } + + target += bytesToWrite; + if (target > targetEnd) { + source = oldSource; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +/* + * Utility routine to tell whether a sequence of bytes is legal UTF-8. + * This must be called with the length pre-determined by the first byte. + * If not calling this from ConvertUTF8to*, then the length can be set by: + * length = trailingBytesForUTF8[*source]+1; + * and the sequence is illegal right away if there aren't that many bytes + * available. + * If presented with a length > 4, this returns false. The Unicode + * definition of UTF-8 goes up to 4-byte sequences. + */ + +static bool isLegalUTF8(const UTF8 *source, int length) { + UTF8 a; + const UTF8 *srcptr = source+length; + switch (length) { + default: return false; + /* Everything else falls through when "true"... */ + case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; + case 2: if ((a = (*--srcptr)) > 0xBF) return false; + + switch (*source) { + /* no fall-through in this inner switch */ + case 0xE0: if (a < 0xA0) return false; break; + case 0xED: if (a > 0x9F) return false; break; + case 0xF0: if (a < 0x90) return false; break; + case 0xF4: if (a > 0x8F) return false; break; + default: if (a < 0x80) return false; + } + + case 1: if (*source >= 0x80 && *source < 0xC2) return false; + } + if (*source > 0xF4) return false; + return true; +} + +/* --------------------------------------------------------------------- */ + +/* + * Exported function to return whether a UTF-8 sequence is legal or not. + * This is not used here; it's just exported. + */ +bool isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { + int length = trailingBytesForUTF8[*source]+1; + if (source+length > sourceEnd) { + return false; + } + return isLegalUTF8(source, length); +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF16 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF16* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = (UTF16)ch; /* normal case */ + } + } else if (ch > UNI_MAX_UTF16) { + if (flags == strictConversion) { + result = sourceIllegal; + source -= (extraBytesToRead+1); /* return to the start */ + break; /* Bail out; shouldn't continue */ + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + /* target is a character in range 0xFFFF - 0x10FFFF. */ + if (target + 1 >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up source pointer! */ + result = targetExhausted; break; + } + ch -= halfBase; + *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); + *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF32toUTF8 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF32* source = *sourceStart; + UTF8* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch; + unsigned short bytesToWrite = 0; + const UTF32 byteMask = 0xBF; + const UTF32 byteMark = 0x80; + ch = *source++; + if (flags == strictConversion ) { + /* UTF-16 surrogate values are illegal in UTF-32 */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + --source; /* return to the illegal value itself */ + result = sourceIllegal; + break; + } + } + /* + * Figure out how many bytes the result will require. Turn any + * illegally large UTF32 things (> Plane 17) into replacement chars. + */ + if (ch < (UTF32)0x80) { bytesToWrite = 1; + } else if (ch < (UTF32)0x800) { bytesToWrite = 2; + } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; + } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; + } else { bytesToWrite = 3; + ch = UNI_REPLACEMENT_CHAR; + result = sourceIllegal; + } + + target += bytesToWrite; + if (target > targetEnd) { + --source; /* Back up source pointer! */ + target -= bytesToWrite; result = targetExhausted; break; + } + switch (bytesToWrite) { /* note: everything falls through. */ + case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; + case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); + } + target += bytesToWrite; + } + *sourceStart = source; + *targetStart = target; + return result; +} + +/* --------------------------------------------------------------------- */ + +ConversionResult ConvertUTF8toUTF32 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { + ConversionResult result = conversionOK; + const UTF8* source = *sourceStart; + UTF32* target = *targetStart; + while (source < sourceEnd) { + UTF32 ch = 0; + unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; + if (source + extraBytesToRead >= sourceEnd) { + result = sourceExhausted; break; + } + /* Do this check whether lenient or strict */ + if (! isLegalUTF8(source, extraBytesToRead+1)) { + result = sourceIllegal; + break; + } + /* + * The cases all fall through. See "Note A" below. + */ + switch (extraBytesToRead) { + case 5: ch += *source++; ch <<= 6; + case 4: ch += *source++; ch <<= 6; + case 3: ch += *source++; ch <<= 6; + case 2: ch += *source++; ch <<= 6; + case 1: ch += *source++; ch <<= 6; + case 0: ch += *source++; + } + ch -= offsetsFromUTF8[extraBytesToRead]; + + if (target >= targetEnd) { + source -= (extraBytesToRead+1); /* Back up the source pointer! */ + result = targetExhausted; break; + } + if (ch <= UNI_MAX_LEGAL_UTF32) { + /* + * UTF-16 surrogate values are illegal in UTF-32, and anything + * over Plane 17 (> 0x10FFFF) is illegal. + */ + if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { + if (flags == strictConversion) { + source -= (extraBytesToRead+1); /* return to the illegal value itself */ + result = sourceIllegal; + break; + } else { + *target++ = UNI_REPLACEMENT_CHAR; + } + } else { + *target++ = ch; + } + } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ + result = sourceIllegal; + *target++ = UNI_REPLACEMENT_CHAR; + } + } + *sourceStart = source; + *targetStart = target; + return result; +} + +UTF32 *MakeUTF32FromUTF8(UTF8 *string) +{ + UTF32 *ret, *tstart; + const UTF8 *tstring = string; + + size_t string_length = strlen((char *)string); + + tstart = ret = (UTF32 *)malloc(string_length * sizeof(UTF32) + 1); + + ConvertUTF8toUTF32(&tstring, &string[string_length], &tstart, &tstart[string_length], lenientConversion); + + *tstart = 0; + + return(ret); +} + + +/* --------------------------------------------------------------------- + + Note A. + The fall-through switches in UTF-8 reading code save a + temp variable, some decrements & conditionals. The switches + are equivalent to the following loop: + { + int tmpBytesToRead = extraBytesToRead+1; + do { + ch += *source++; + --tmpBytesToRead; + if (tmpBytesToRead) ch <<= 6; + } while (tmpBytesToRead > 0); + } + In UTF-8 writing code, the switches on "bytesToWrite" are + similarly unrolled loops. + + --------------------------------------------------------------------- */ diff --git a/Mednafen/mednafen/string/ConvertUTF.h b/Mednafen/mednafen/string/ConvertUTF.h new file mode 100644 index 0000000000..32d80f5789 --- /dev/null +++ b/Mednafen/mednafen/string/ConvertUTF.h @@ -0,0 +1,149 @@ +/* + * Copyright 2001-2004 Unicode, Inc. + * + * Disclaimer + * + * This source code is provided as is by Unicode, Inc. No claims are + * made as to fitness for any particular purpose. No warranties of any + * kind are expressed or implied. The recipient agrees to determine + * applicability of information provided. If this file has been + * purchased on magnetic or optical media from Unicode, Inc., the + * sole remedy for any claim will be exchange of defective media + * within 90 days of receipt. + * + * Limitations on Rights to Redistribute This Code + * + * Unicode, Inc. hereby grants the right to freely use the information + * supplied in this file in the creation of products supporting the + * Unicode Standard, and to make copies of this file in any form + * for internal or external distribution as long as this notice + * remains attached. + */ + +/* --------------------------------------------------------------------- + + Conversions between UTF32, UTF-16, and UTF-8. Header file. + + Several funtions are included here, forming a complete set of + conversions between the three formats. UTF-7 is not included + here, but is handled in a separate source file. + + Each of these routines takes pointers to input buffers and output + buffers. The input buffers are const. + + Each routine converts the text between *sourceStart and sourceEnd, + putting the result into the buffer between *targetStart and + targetEnd. Note: the end pointers are *after* the last item: e.g. + *(sourceEnd - 1) is the last item. + + The return result indicates whether the conversion was successful, + and if not, whether the problem was in the source or target buffers. + (Only the first encountered problem is indicated.) + + After the conversion, *sourceStart and *targetStart are both + updated to point to the end of last text successfully converted in + the respective buffers. + + Input parameters: + sourceStart - pointer to a pointer to the source buffer. + The contents of this are modified on return so that + it points at the next thing to be converted. + targetStart - similarly, pointer to pointer to the target buffer. + sourceEnd, targetEnd - respectively pointers to the ends of the + two buffers, for overflow checking only. + + These conversion functions take a ConversionFlags argument. When this + flag is set to strict, both irregular sequences and isolated surrogates + will cause an error. When the flag is set to lenient, both irregular + sequences and isolated surrogates are converted. + + Whether the flag is strict or lenient, all illegal sequences will cause + an error return. This includes sequences such as: , , + or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code + must check for illegal sequences. + + When the flag is set to lenient, characters over 0x10FFFF are converted + to the replacement character; otherwise (when the flag is set to strict) + they constitute an error. + + Output parameters: + The value "sourceIllegal" is returned from some routines if the input + sequence is malformed. When "sourceIllegal" is returned, the source + value will point to the illegal value that caused the problem. E.g., + in UTF-8 when a sequence is malformed, it points to the start of the + malformed sequence. + + Author: Mark E. Davis, 1994. + Rev History: Rick McGowan, fixes & updates May 2001. + Fixes & updates, Sept 2001. + +------------------------------------------------------------------------ */ + +/* --------------------------------------------------------------------- + The following 4 definitions are compiler-specific. + The C standard does not guarantee that wchar_t has at least + 16 bits, so wchar_t is no less portable than unsigned short! + All should be unsigned values to avoid sign extension during + bit mask & shift operations. +------------------------------------------------------------------------ */ + +/* Some fundamental constants */ +#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD +#define UNI_MAX_BMP (UTF32)0x0000FFFF +#define UNI_MAX_UTF16 (UTF32)0x0010FFFF +#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF +#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF + +typedef enum { + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +} ConversionResult; + +typedef enum { + strictConversion = 0, + lenientConversion +} ConversionFlags; + +/* This is for C++ and does no harm in C */ +#ifdef __cplusplus +extern "C" { +#endif + +ConversionResult ConvertUTF8toUTF16 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF8 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF8toUTF32 ( + const UTF8** sourceStart, const UTF8* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF8 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF16toUTF32 ( + const UTF16** sourceStart, const UTF16* sourceEnd, + UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); + +ConversionResult ConvertUTF32toUTF16 ( + const UTF32** sourceStart, const UTF32* sourceEnd, + UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); + +bool isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); + + +/* Extra Mednafen convenience functions. */ +UTF32 *MakeUTF32FromUTF8(UTF8 *string); + + +#ifdef __cplusplus +} +#endif + +/* --------------------------------------------------------------------- */ diff --git a/Mednafen/mednafen/string/Makefile.am.inc b/Mednafen/mednafen/string/Makefile.am.inc new file mode 100644 index 0000000000..a6a5840ed2 --- /dev/null +++ b/Mednafen/mednafen/string/Makefile.am.inc @@ -0,0 +1,2 @@ +mednafen_SOURCES += string/escape.cpp string/trim.cpp string/ConvertUTF.cpp + diff --git a/Mednafen/mednafen/string/escape.cpp b/Mednafen/mednafen/string/escape.cpp new file mode 100644 index 0000000000..d9cc96d70a --- /dev/null +++ b/Mednafen/mednafen/string/escape.cpp @@ -0,0 +1,157 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "escape.h" + +static unsigned int hex_nibble_to_val(char nibble) +{ + unsigned int ret = 0; + nibble = tolower(nibble); + + if(nibble >= '0' && nibble <= '9') + ret = nibble - '0'; + else + ret = nibble - 'a'; + + return(ret); +} + +void unescape_string(char *string) +{ + char *src = string; + bool inescape = 0; + uint8 hoval = 0; + int inhex = 0; + int inoctal = 0; + + while(*src) + { + if(*src == '\\') + { + inescape = TRUE; + inhex = 0; + inoctal = 0; + } + else if(inhex) + { + if(inhex == 1) + { + hoval = hex_nibble_to_val(*src) << 4; + inhex++; + } + else if(inhex == 2) + { + hoval |= hex_nibble_to_val(*src); + *string = hoval; + string++; + hoval = 0; + inhex = 0; + } + } + else if(inoctal) + { + if(inoctal == 1) + { + hoval = (*src - '0') * 8 * 8; + } + else if(inoctal == 2) + { + hoval += (*src - '0') * 8; + } + else + { + hoval += *src - '0'; + *string = hoval; + string++; + hoval = 0; + inoctal = 0; + } + } + else if(inescape) + { + switch(*src) + { + case 'a': *string = 7; string++; break; + case 'b': *string = 8; string++; break; + case 'f': *string = 12; string++; break; + case 'n': *string = 10; string++; break; + case 'r': *string = 13; string++; break; + case 't': *string = 9; string++; break; + case 'v': *string = 11; string++; break; + + case '\\': *string = '\\'; string++; break; + case '?': *string = '?'; string++; break; + case '\'': *string = '\''; string++; break; + case '"': *string = '"'; string++; break; + + case 'o': inoctal = 1; break; + case 'x': inhex = 1; break; + + + default: *string = *src; string++; break; + } + inescape = 0; + } + else + { + *string = *src; + string++; + } + src++; + } + *string = 0; +} + +char *escape_string(const char *text) +{ + uint32 slen = strlen(text); + char *ret = (char*)malloc(slen * 4 + 1); // \xFF + char *outoo = ret; + + for(uint32 x = 0; x < slen; x++) + { + int c = (uint8)text[x]; + + if(c < 0x20 || c == 0x7F || c == '\\' || c == '\'' || c == '"') + { + *outoo++ = '\\'; + + switch(c) + { + case '\\': *outoo++ = '\\'; break; + case '\'': *outoo++ = '\''; break; + case '"': *outoo++ = '"'; break; + case 7: *outoo++ = 'a'; break; + case 8: *outoo++ = 'b'; break; + case 12: *outoo++ = 'f'; break; + case 10: *outoo++ = 'n'; break; + case 13: *outoo++ = 'r'; break; + case 9: *outoo++ = 't'; break; + case 11: *outoo++ = 'v'; break; + + default: outoo += sprintf(outoo, "x%02x", c); break; + } + } + else + *outoo++ = c; + } + + *outoo = 0; + + return(ret); +} diff --git a/Mednafen/mednafen/string/escape.h b/Mednafen/mednafen/string/escape.h new file mode 100644 index 0000000000..47dc193875 --- /dev/null +++ b/Mednafen/mednafen/string/escape.h @@ -0,0 +1,9 @@ +#ifndef __MDFN_ESCAPE_H +#define __MDFN_ESCAPE_H + +// These functions are safe to call before calling MDFNI_Initialize(). + +void unescape_string(char *string); +char* escape_string(const char *text); + +#endif diff --git a/Mednafen/mednafen/string/trim.cpp b/Mednafen/mednafen/string/trim.cpp new file mode 100644 index 0000000000..8623d3d3b2 --- /dev/null +++ b/Mednafen/mednafen/string/trim.cpp @@ -0,0 +1,154 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "trim.h" + +// Remove whitespace from beginning of string +void MDFN_ltrim(char *string) +{ + int32 di, si; + bool InWhitespace = TRUE; + + di = si = 0; + + while(string[si]) + { + if(InWhitespace && (string[si] == ' ' || string[si] == '\r' || string[si] == '\n' || string[si] == '\t' || string[si] == 0x0b)) + { + + } + else + { + InWhitespace = FALSE; + string[di] = string[si]; + di++; + } + si++; + } + string[di] = 0; +} + +// Remove whitespace from end of string +void MDFN_rtrim(char *string) +{ + int32 len = strlen(string); + + if(len) + { + for(int32 x = len - 1; x >= 0; x--) + { + if(string[x] == ' ' || string[x] == '\r' || string[x] == '\n' || string[x] == '\t' || string[x] == 0x0b) + string[x] = 0; + else + break; + } + } + +} + +void MDFN_trim(char *string) +{ + MDFN_rtrim(string); + MDFN_ltrim(string); +} + + +// Remove whitespace from beginning of string +void MDFN_ltrim(std::string &string) +{ + size_t len = string.length(); + size_t di, si; + bool InWhitespace = TRUE; + + di = si = 0; + + while(si < len) + { + if(InWhitespace && (string[si] == ' ' || string[si] == '\r' || string[si] == '\n' || string[si] == '\t' || string[si] == 0x0b)) + { + + } + else + { + InWhitespace = FALSE; + string[di] = string[si]; + di++; + } + si++; + } + + string.resize(di); +} + +// Remove whitespace from end of string +void MDFN_rtrim(std::string &string) +{ + size_t len = string.length(); + + if(len) + { + size_t x = len; + size_t new_len = len; + + do + { + x--; + + if(!(string[x] == ' ' || string[x] == '\r' || string[x] == '\n' || string[x] == '\t' || string[x] == 0x0b)) + break; + + new_len--; + } while(x); + + string.resize(new_len); + } +} + + +void MDFN_trim(std::string &string) +{ + MDFN_rtrim(string); + MDFN_ltrim(string); +} + + +char *MDFN_RemoveControlChars(char *str) +{ + char *orig = str; + + if(str) + { + while(*str) + { + if((unsigned char)*str < 0x20) + *str = 0x20; + str++; + } + } + + return(orig); +} + +void MDFN_RemoveControlChars(std::string& string) +{ + for(size_t i = 0; i < string.size(); i++) + { + if((unsigned char)string[i] < 0x20) + string[i] = 0x20; + } +} diff --git a/Mednafen/mednafen/string/trim.h b/Mednafen/mednafen/string/trim.h new file mode 100644 index 0000000000..e18e5ce646 --- /dev/null +++ b/Mednafen/mednafen/string/trim.h @@ -0,0 +1,15 @@ +#ifndef __MDFN_STRING_TRIM_H +#define __MDFN_STRING_TRIM_H + +void MDFN_ltrim(char *string); +void MDFN_rtrim(char *string); +void MDFN_trim(char *string); + +void MDFN_ltrim(std::string &string); +void MDFN_rtrim(std::string &string); +void MDFN_trim(std::string &string); + +char *MDFN_RemoveControlChars(char *str); +void MDFN_RemoveControlChars(std::string& string); + +#endif diff --git a/Mednafen/mednafen/tests.cpp b/Mednafen/mednafen/tests.cpp new file mode 100644 index 0000000000..b6ca10129c --- /dev/null +++ b/Mednafen/mednafen/tests.cpp @@ -0,0 +1,1370 @@ +// DO NOT REMOVE/DISABLE THESE MATH AND COMPILER SANITY TESTS. THEY EXIST FOR A REASON. + +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// We really don't want NDEBUG defined ;) +#ifdef HAVE_CONFIG_H +#include +#endif + +#undef NDEBUG + +#include "mednafen.h" +#include "lepacker.h" + +#include +#include + +#include + +#undef NDEBUG +#include +#include + +#include "psx/masmem.h" +#include "general.h" + +#if defined(HAVE_FENV_H) +#include +#endif + +#define FATALME { printf("Math test failed: %s:%d\n", __FILE__, __LINE__); fprintf(stderr, "Math test failed: %s:%d\n", __FILE__, __LINE__); return(0); } + +namespace MDFN_TESTS_CPP +{ + +// Don't define this static, and don't define it const. We want these tests to be done at run time, not compile time(although maybe we should do both...). +typedef struct +{ + int bits; + uint32 negative_one; + uint32 mostneg; + int32 mostnegresult; +} MathTestEntry; + +#define ADD_MTE(_bits) { _bits, ((uint32)1 << _bits) - 1, (uint32)1 << (_bits - 1), (int32)(0 - ((uint32)1 << (_bits - 1))) } + +MathTestEntry math_test_vals[] = +{ + { 9, 0x01FF, 0x0100, -256 }, + { 10, 0x03FF, 0x0200, -512 }, + { 11, 0x07FF, 0x0400, -1024 }, + { 12, 0x0FFF, 0x0800, -2048 }, + { 13, 0x1FFF, 0x1000, -4096 }, + { 14, 0x3FFF, 0x2000, -8192 }, + { 15, 0x7FFF, 0x4000, -16384 }, + + ADD_MTE(17), + ADD_MTE(18), + ADD_MTE(19), + ADD_MTE(20), + ADD_MTE(21), + ADD_MTE(22), + ADD_MTE(23), + ADD_MTE(24), + ADD_MTE(25), + ADD_MTE(26), + ADD_MTE(27), + ADD_MTE(28), + ADD_MTE(29), + ADD_MTE(30), + ADD_MTE(31), + + { 0, 0, 0, 0 }, +}; + +static bool DoSizeofTests(void) +{ + const int SizePairs[][2] = + { + { sizeof(uint8), 1 }, + { sizeof(int8), 1 }, + + { sizeof(uint16), 2 }, + { sizeof(int16), 2 }, + + { sizeof(uint32), 4 }, + { sizeof(int32), 4 }, + + { sizeof(uint64), 8 }, + { sizeof(int64), 8 }, + + { 0, 0 }, + }; + + int i = -1; + + while(SizePairs[++i][0]) + { + if(SizePairs[i][0] != SizePairs[i][1]) + FATALME; + } + + assert(sizeof(char) == 1); + assert(sizeof(int) == 4); + assert(sizeof(long) >= 4); + + assert(sizeof(char) == SIZEOF_CHAR); + assert(sizeof(short) == SIZEOF_SHORT); + assert(sizeof(int) == SIZEOF_INT); + assert(sizeof(long) == SIZEOF_LONG); + assert(sizeof(long long) == SIZEOF_LONG_LONG); + + assert(sizeof(off_t) == SIZEOF_OFF_T); + + return(1); +} + +static void AntiNSOBugTest_Sub1_a(int *array) NO_INLINE; +static void AntiNSOBugTest_Sub1_a(int *array) +{ + for(int value = 0; value < 127; value++) + array[value] += (int8)value * 15; +} + +static void AntiNSOBugTest_Sub1_b(int *array) NO_INLINE; +static void AntiNSOBugTest_Sub1_b(int *array) +{ + for(int value = 127; value < 256; value++) + array[value] += (int8)value * 15; +} + +static void AntiNSOBugTest_Sub2(int *array) NO_INLINE; +static void AntiNSOBugTest_Sub2(int *array) +{ + for(int value = 0; value < 256; value++) + array[value] += (int8)value * 15; +} + +static void AntiNSOBugTest_Sub3(int *array) NO_INLINE; +static void AntiNSOBugTest_Sub3(int *array) +{ + for(int value = 0; value < 256; value++) + { + if(value >= 128) + array[value] = (value - 256) * 15; + else + array[value] = value * 15; + } +} + +static bool DoAntiNSOBugTest(void) +{ + int array1[256], array2[256], array3[256]; + + memset(array1, 0, sizeof(array1)); + memset(array2, 0, sizeof(array2)); + memset(array3, 0, sizeof(array3)); + + AntiNSOBugTest_Sub1_a(array1); + AntiNSOBugTest_Sub1_b(array1); + AntiNSOBugTest_Sub2(array2); + AntiNSOBugTest_Sub3(array3); + + for(int i = 0; i < 256; i++) + { + if((array1[i] != array2[i]) || (array2[i] != array3[i])) + { + printf("%d %d %d %d\n", i, array1[i], array2[i], array3[i]); + FATALME; + } + } + //for(int value = 0; value < 256; value++) + // printf("%d, %d\n", (int8)value, ((int8)value) * 15); + + return(1); +} + +// +// Related: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61741 +// +// Not found to be causing problems in Mednafen(unlike the earlier no-strict-overflow problem and associated test), +// but better safe than sorry. +// +static void DoAntiNSOBugTest2014_SubA(int a) NO_INLINE NO_CLONE; +static void DoAntiNSOBugTest2014_SubA(int a) +{ + char c = 0; + + for(; a; a--) + { + for(; c >= 0; c++) + { + + } + } + + assert(c == -128); +} + +static int ANSOBT_CallCount; +static void DoAntiNSOBugTest2014_SubMx_F(void) NO_INLINE NO_CLONE; +static void DoAntiNSOBugTest2014_SubMx_F(void) +{ + ANSOBT_CallCount++; + + assert(ANSOBT_CallCount < 1000); +} + +static void DoAntiNSOBugTest2014_SubM1(void) NO_INLINE NO_CLONE; +static void DoAntiNSOBugTest2014_SubM1(void) +{ + char a; + + for(a = 127 - 1; a >= 0; a++) + DoAntiNSOBugTest2014_SubMx_F(); +} + +static void DoAntiNSOBugTest2014_SubM3(void) NO_INLINE NO_CLONE; +static void DoAntiNSOBugTest2014_SubM3(void) +{ + char a; + + for(a = 127 - 3; a >= 0; a++) + DoAntiNSOBugTest2014_SubMx_F(); +} + + +static void DoAntiNSOBugTest2014(void) +{ + DoAntiNSOBugTest2014_SubA(1); + + ANSOBT_CallCount = 0; + DoAntiNSOBugTest2014_SubM1(); + assert(ANSOBT_CallCount == 2); + + ANSOBT_CallCount = 0; + DoAntiNSOBugTest2014_SubM3(); + assert(ANSOBT_CallCount == 4); +} + + +bool DoLEPackerTest(void) +{ + MDFN::LEPacker mizer; + static const uint8 correct_result[24] = { 0xed, 0xfe, 0xed, 0xde, 0xaa, 0xca, 0xef, 0xbe, 0xbe, 0xba, 0xfe, 0xca, 0xad, 0xde, 0x01, 0x9a, 0x0c, 0xa7, 0xff, 0x00, 0xff, 0xff, 0x55, 0x7f }; + + uint64 u64_test = 0xDEADCAFEBABEBEEFULL; + uint32 u32_test = 0xDEEDFEED; + uint16 u16_test = 0xCAAA; + uint8 u8_test = 0x55; + int32 s32_test = -5829478; + int16 s16_test = -1; + int8 s8_test = 127; + + bool bool_test0 = 0; + bool bool_test1 = 1; + + mizer ^ u32_test; + mizer ^ u16_test; + mizer ^ u64_test; + mizer ^ bool_test1; + mizer ^ s32_test; + mizer ^ bool_test0; + mizer ^ s16_test; + mizer ^ u8_test; + mizer ^ s8_test; + + if(mizer.size() != 24) + { + printf("Test failed: LEPacker data incorrect size.\n"); + return(FALSE); + } + + for(unsigned int i = 0; i < mizer.size(); i++) + if(mizer[i] != correct_result[i]) + { + printf("Test failed: LEPacker packed data incorrect.\n"); + return(FALSE); + } + + u64_test = 0; + u32_test = 0; + u16_test = 0; + u8_test = 0; + s32_test = 0; + s16_test = 0; + s8_test = 0; + + bool_test0 = 1; + bool_test1 = 0; + + mizer.set_read_mode(TRUE); + + mizer ^ u32_test; + mizer ^ u16_test; + mizer ^ u64_test; + mizer ^ bool_test1; + mizer ^ s32_test; + mizer ^ bool_test0; + mizer ^ s16_test; + mizer ^ u8_test; + mizer ^ s8_test; + + + if(u32_test != 0xDEEDFEED) + { + printf("Test failed: LEPacker u32 unpacking incorrect.\n"); + return(FALSE); + } + + if(u16_test != 0xCAAA) + { + printf("Test failed: LEPacker u16 unpacking incorrect.\n"); + return(FALSE); + } + + if(u64_test != 0xDEADCAFEBABEBEEFULL) + { + printf("%16llx\n", (unsigned long long)u64_test); + printf("Test failed: LEPacker u64 unpacking incorrect.\n"); + return(FALSE); + } + + if(u8_test != 0x55) + { + printf("Test failed: LEPacker u8 unpacking incorrect.\n"); + return(FALSE); + } + + if(s32_test != -5829478) + { + printf("Test failed: LEPacker s32 unpacking incorrect.\n"); + return(FALSE); + } + + if(s16_test != -1) + { + printf("Test failed: LEPacker s16 unpacking incorrect.\n"); + return(FALSE); + } + + if(s8_test != 127) + { + printf("Test failed: LEPacker s8 unpacking incorrect.\n"); + return(FALSE); + } + + if(bool_test0 != 0) + { + printf("Test failed: LEPacker bool unpacking incorrect.\n"); + return(FALSE); + } + + if(bool_test1 != 1) + { + printf("Test failed: LEPacker bool unpacking incorrect.\n"); + return(FALSE); + } + + return(TRUE); +} + +struct MathTestTSOEntry +{ + int32 a; + int32 b; +}; + +// Don't declare as static(though whopr might mess it up anyway) +MathTestTSOEntry MathTestTSOTests[] = +{ + { 0x7FFFFFFF, 2 }, + { 0x7FFFFFFE, 0x7FFFFFFF }, + { 0x7FFFFFFF, 0x7FFFFFFF }, + { 0x7FFFFFFE, 0x7FFFFFFE }, +}; + +volatile int32 MDFNTestsCPP_SLS_Var = (int32)0xDEADBEEF; +volatile int8 MDFNTestsCPP_SLS_Var8 = (int8)0xEF; +volatile int16 MDFNTestsCPP_SLS_Var16 = (int16)0xBEEF; +int32 MDFNTestsCPP_SLS_Var_NT = (int32)0xDEADBEEF; +int32 MDFNTestsCPP_SLS_Var_NT2 = (int32)0x7EADBEEF; + +static uint64 NO_INLINE NO_CLONE Mul_U16U16U32U64_Proper(uint16 a, uint16 b) // For reference +{ + return (uint32)a * (uint32)b; +} + +static uint64 NO_INLINE NO_CLONE Mul_U16U16U32U64(uint16 a, uint16 b) +{ + return (uint32)(a * b); +} + +static void TestSignedOverflow(void) +{ + assert(Mul_U16U16U32U64_Proper(65535, 65535) == 0xfffe0001ULL); + assert(Mul_U16U16U32U64(65535, 65535) == 0xfffe0001ULL); + + for(unsigned int i = 0; i < sizeof(MathTestTSOTests) / sizeof(MathTestTSOEntry); i++) + { + int32 a = MathTestTSOTests[i].a; + int32 b = MathTestTSOTests[i].b; + + assert((a + b) < a && (a + b) < b); + + assert((a + 0x7FFFFFFE) < a); + assert((b + 0x7FFFFFFE) < b); + + assert((a + 0x7FFFFFFF) < a); + assert((b + 0x7FFFFFFF) < b); + + assert((int32)(a + 0x80000000) < a); + assert((int32)(b + 0x80000000) < b); + + assert((int32)(a ^ 0x80000000) < a); + assert((int32)(b ^ 0x80000000) < b); + } + + for(unsigned i = 0; i < 64; i++) + { + MDFNTestsCPP_SLS_Var = (MDFNTestsCPP_SLS_Var << 1) ^ ((MDFNTestsCPP_SLS_Var << 2) + 0x7FFFFFFF) ^ ((MDFNTestsCPP_SLS_Var >> 31) & 0x3); + MDFNTestsCPP_SLS_Var8 = (MDFNTestsCPP_SLS_Var8 << 1) ^ ((MDFNTestsCPP_SLS_Var8 << 2) + 0x7F) ^ ((MDFNTestsCPP_SLS_Var8 >> 7) & 0x3); + MDFNTestsCPP_SLS_Var16 = (MDFNTestsCPP_SLS_Var16 << 1) ^ ((MDFNTestsCPP_SLS_Var16 << 2) + 0x7FFF) ^ ((MDFNTestsCPP_SLS_Var16 >> 15) & 0x3); + } + + { + int8 a = MDFNTestsCPP_SLS_Var8; + int16 b = MDFNTestsCPP_SLS_Var16; + int32 c = MDFNTestsCPP_SLS_Var; + int64 d = (int64)MDFNTestsCPP_SLS_Var * (int64)MDFNTestsCPP_SLS_Var; + int32 e = c; + int64 f = c; + + for(int i = 0; i < 64; i++) + { + a += a * i + b; + b += b * i + c; + c += c * i + d; + d += d * i + a; + + e += e * i + c; + f += f * i + c; + } + //printf("%08x %16llx - %02x %04x %08x %16llx\n", (uint32)e, (uint64)f, (uint8)a, (uint16)b, (uint32)c, (uint64)d); + assert((uint32)e == (uint32)f && (uint32)e == 0x00c37de2 && (uint64)f == 0x5d17261900c37de2); + assert((uint8)a == 0xbf); + assert((uint16)b == 0xb77c); + assert((uint32)c == 0xb4244622U); + assert((uint64)d == 0xa966e02ed95c83fULL); + } + + + //printf("%02x %04x %08x\n", (uint8)MDFNTestsCPP_SLS_Var8, (uint16)MDFNTestsCPP_SLS_Var16, (uint32)MDFNTestsCPP_SLS_Var); + assert((uint8)MDFNTestsCPP_SLS_Var8 == 0x04); + assert((uint16)MDFNTestsCPP_SLS_Var16 == 0xa7d8); + assert((uint32)MDFNTestsCPP_SLS_Var == 0x4ef11a23); + + for(signed i = 1; i != 0; i =~-i); // Not really signed overflow, but meh! + for(signed i = -1; i != 0; i <<= 1); + for(signed i = 1; i >= 0; i *= 3); + + if(MDFNTestsCPP_SLS_Var_NT < 0) + assert((MDFNTestsCPP_SLS_Var_NT << 2) > 0); + + if(MDFNTestsCPP_SLS_Var_NT2 > 0) + assert((MDFNTestsCPP_SLS_Var_NT2 << 2) < 0); +} + +unsigned MDFNTests_OverShiftAmounts[3] = { 8, 16, 32}; +uint32 MDFNTests_OverShiftTV = 0xBEEFD00D; +static void TestDefinedOverShift(void) +{ + //for(unsigned sa = 0; sa < 4; sa++) + { + for(unsigned i = 0; i < 2; i++) + { + uint8 v8 = MDFNTests_OverShiftTV; + uint16 v16 = MDFNTests_OverShiftTV; + uint32 v32 = MDFNTests_OverShiftTV; + + int8 iv8 = MDFNTests_OverShiftTV; + int16 iv16 = MDFNTests_OverShiftTV; + int32 iv32 = MDFNTests_OverShiftTV; + + if(i == 1) + { + v8 >>= MDFNTests_OverShiftAmounts[0]; + v16 >>= MDFNTests_OverShiftAmounts[1]; + v32 = (uint64)v32 >> MDFNTests_OverShiftAmounts[2]; + + iv8 >>= MDFNTests_OverShiftAmounts[0]; + iv16 >>= MDFNTests_OverShiftAmounts[1]; + iv32 = (int64)iv32 >> MDFNTests_OverShiftAmounts[2]; + } + else + { + v8 <<= MDFNTests_OverShiftAmounts[0]; + v16 <<= MDFNTests_OverShiftAmounts[1]; + v32 = (uint64)v32 << MDFNTests_OverShiftAmounts[2]; + + iv8 <<= MDFNTests_OverShiftAmounts[0]; + iv16 <<= MDFNTests_OverShiftAmounts[1]; + iv32 = (int64)iv32 << MDFNTests_OverShiftAmounts[2]; + } + + assert(v8 == 0); + assert(v16 == 0); + assert(v32 == 0); + + assert(iv8 == 0); + assert(iv16 == -(int)i); + assert(iv32 == -(int)i); + } + } +} + +static uint8 BoolConvSupportFunc(void) MDFN_COLD NO_INLINE; +static uint8 BoolConvSupportFunc(void) +{ + return 0xFF; +} + +static bool BoolConv0(void) MDFN_COLD NO_INLINE; +static bool BoolConv0(void) +{ + return BoolConvSupportFunc() & 1; +} + +static void BoolTestThing(unsigned val) MDFN_COLD NO_INLINE; +static void BoolTestThing(unsigned val) +{ + if(val != 1) + printf("%u\n", val); + + assert(val == 1); +} + +static void TestBoolConv(void) +{ + BoolTestThing(BoolConv0()); +} + +static void TestNarrowConstFold(void) NO_INLINE MDFN_COLD; +static void TestNarrowConstFold(void) +{ + unsigned sa = 8; + uint8 za[1] = { 0 }; + int a; + + a = za[0] < (uint8)(1 << sa); + + assert(a == 0); +} + + +unsigned MDFNTests_ModTern_a = 2; +unsigned MDFNTests_ModTern_b = 0; +static void ModTernTestEval(unsigned v) NO_INLINE MDFN_COLD; +static void ModTernTestEval(unsigned v) +{ + assert(v == 0); +} + +static void TestModTern(void) NO_INLINE MDFN_COLD; +static void TestModTern(void) +{ + if(!MDFNTests_ModTern_b) + { + MDFNTests_ModTern_b = MDFNTests_ModTern_a; + + if(1 % (MDFNTests_ModTern_a ? MDFNTests_ModTern_a : 2)) + MDFNTests_ModTern_b = 0; + } + ModTernTestEval(MDFNTests_ModTern_b); +} + +static int TestBWNotMask31GTZ_Sub(int a) NO_INLINE NO_CLONE; +static int TestBWNotMask31GTZ_Sub(int a) +{ + a = (((~a) & 0x80000000LL) > 0) + 1; + return a; +} + +static void TestBWNotMask31GTZ(void) +{ + assert(TestBWNotMask31GTZ_Sub(0) == 2); +} + +int MDFN_tests_TestTernary_val = 0; +static void NO_INLINE NO_CLONE TestTernary_Sub(void) +{ + MDFN_tests_TestTernary_val++; +} + +static void TestTernary(void) +{ + int a = ((MDFN_tests_TestTernary_val++) ? (MDFN_tests_TestTernary_val = 20) : (TestTernary_Sub(), MDFN_tests_TestTernary_val)); + + assert(a == 2); +} + +size_t TestLLVM15470_Counter; +void NO_INLINE NO_CLONE TestLLVM15470_Sub2(size_t x) +{ + assert(x == TestLLVM15470_Counter); + TestLLVM15470_Counter++; +} + +void NO_INLINE NO_CLONE TestLLVM15470_Sub(size_t m) +{ + size_t m2 = ~(size_t)0; + + for(size_t i = 1; i <= 4; i *= m) + m2++; + + for(size_t a = 0; a < 2; a++) + { + for(size_t b = 1; b <= 2; b++) + { + TestLLVM15470_Sub2(a * m2 + b); + } + } +} + +void NO_INLINE NO_CLONE TestLLVM15470(void) +{ + TestLLVM15470_Counter = 1; + TestLLVM15470_Sub(2); +} + +int NO_INLINE NO_CLONE TestGCC60196_Sub(const int16* data, int count) +{ + int ret = 0; + + for(int i = 0; i < count; i++) + ret += i * data[i]; + + return ret; +} + +void NO_INLINE NO_CLONE TestGCC60196(void) +{ + int16 ta[16]; + + for(unsigned i = 0; i < 16; i++) + ta[i] = 1; + + assert(TestGCC60196_Sub(ta, sizeof(ta) / sizeof(ta[0])) == 120); +} + +template +void NO_INLINE NO_CLONE TestSUCompare_Sub(A a, B b) +{ + assert(a < b); +} + +int16 TestSUCompare_x0 = 256; + +void NO_INLINE NO_CLONE TestSUCompare(void) +{ + int8 a = 1; + uint8 b = 255; + int16 c = 1; + uint16 d = 65535; + int32 e = 1; + uint32 f = ~0U; + int64 g = ~(uint32)0; + uint64 h = ~(uint64)0; + + assert(a < b); + assert(c < d); + assert((uint32)e < f); + assert((uint64)g < h); + + TestSUCompare_Sub(1, 255); + TestSUCompare_Sub(1, 65535); + + TestSUCompare_Sub(TestSUCompare_x0, 255); +} + +static void DoAlignmentChecks(void) +{ + uint8 padding0[3]; + alignas(16) uint8 aligned0[7]; + alignas(4) uint8 aligned1[2]; + alignas(16) uint32 aligned2[2]; + uint8 padding1[3]; + + static uint8 g_padding0[3]; + alignas(16) static uint8 g_aligned0[7]; + alignas(4) static uint8 g_aligned1[2]; + alignas(16) static uint32 g_aligned2[2]; + static uint8 g_padding1[3]; + + // Make sure compiler doesn't removing padding vars + assert((&padding0[1] - &padding0[0]) == 1); + assert((&padding1[1] - &padding1[0]) == 1); + assert((&g_padding0[1] - &g_padding0[0]) == 1); + assert((&g_padding1[1] - &g_padding1[0]) == 1); + + + assert( (((unsigned long long)&aligned0[0]) & 0xF) == 0); + assert( (((unsigned long long)&aligned1[0]) & 0x3) == 0); + assert( (((unsigned long long)&aligned2[0]) & 0xF) == 0); + + assert(((uint8 *)&aligned0[1] - (uint8 *)&aligned0[0]) == 1); + assert(((uint8 *)&aligned1[1] - (uint8 *)&aligned1[0]) == 1); + assert(((uint8 *)&aligned2[1] - (uint8 *)&aligned2[0]) == 4); + + + assert( (((unsigned long long)&g_aligned0[0]) & 0xF) == 0); + assert( (((unsigned long long)&g_aligned1[0]) & 0x3) == 0); + assert( (((unsigned long long)&g_aligned2[0]) & 0xF) == 0); + + assert(((uint8 *)&g_aligned0[1] - (uint8 *)&g_aligned0[0]) == 1); + assert(((uint8 *)&g_aligned1[1] - (uint8 *)&g_aligned1[0]) == 1); + assert(((uint8 *)&g_aligned2[1] - (uint8 *)&g_aligned2[0]) == 4); +} + +static uint32 NO_INLINE NO_CLONE RunMASMemTests_DoomAndGloom(uint32 offset) +{ + MultiAccessSizeMem<4, false> mt0; + + mt0.WriteU32(offset, 4); + mt0.WriteU16(offset, 0); + mt0.WriteU32(offset, mt0.ReadU32(offset) + 1); + + return mt0.ReadU32(offset); +} + +static void RunMASMemTests(void) +{ + // Little endian: + { + MultiAccessSizeMem<4, false> mt0; + + mt0.WriteU16(0, 0xDEAD); + mt0.WriteU32(0, 0xCAFEBEEF); + mt0.WriteU16(2, mt0.ReadU16(0)); + mt0.WriteU8(1, mt0.ReadU8(0)); + mt0.WriteU16(2, mt0.ReadU16(0)); + mt0.WriteU32(0, mt0.ReadU32(0) + 0x13121111); + + assert(mt0.ReadU16(0) == 0x0100 && mt0.ReadU16(2) == 0x0302); + assert(mt0.ReadU32(0) == 0x03020100); + + mt0.WriteU32(0, 0xB0B0AA55); + mt0.WriteU24(0, 0xDEADBEEF); + assert(mt0.ReadU32(0) == 0xB0ADBEEF); + assert(mt0.ReadU24(1) == 0x00B0ADBE); + } + + // Big endian: + { + MultiAccessSizeMem<4, true> mt0; + + mt0.WriteU16(2, 0xDEAD); + mt0.WriteU32(0, 0xCAFEBEEF); + mt0.WriteU16(0, mt0.ReadU16(2)); + mt0.WriteU8(2, mt0.ReadU8(3)); + mt0.WriteU16(0, mt0.ReadU16(2)); + mt0.WriteU32(0, mt0.ReadU32(0) + 0x13121111); + + assert(mt0.ReadU16(2) == 0x0100 && mt0.ReadU16(0) == 0x0302); + assert(mt0.ReadU32(0) == 0x03020100); + + mt0.WriteU32(0, 0xB0B0AA55); + mt0.WriteU24(1, 0xDEADBEEF); + assert(mt0.ReadU32(0) == 0xB0ADBEEF); + assert(mt0.ReadU24(0) == 0x00B0ADBE); + } + + assert(RunMASMemTests_DoomAndGloom(0) == 1); +} + +static void NO_INLINE NO_CLONE ExceptionTestSub(int v, int n, int* y) +{ + if(n) + { + if(n & 1) + { + try + { + ExceptionTestSub(v + n, n - 1, y); + } + catch(const std::exception &e) + { + (*y)++; + throw; + } + } + else + ExceptionTestSub(v + n, n - 1, y); + } + else + throw MDFN_Error(v, "%d", v); +} + +static void RunExceptionTests(void) +{ + int y = 0; + int z = 0; + + for(int x = -8; x < 8; x++) + { + try + { + ExceptionTestSub(x, x & 3, &y); + } + catch(const MDFN_Error &e) + { + int epv = x; + + for(unsigned i = x & 3; i; i--) + epv += i; + + z += epv; + + assert(e.GetErrno() == epv); + assert(atoi(e.what()) == epv); + continue; + } + catch(...) + { + abort(); + } + abort(); + } + + assert(y == 16); + assert(z == 32); +} + +std::vector stltests_vec[2]; + +static void NO_INLINE NO_CLONE RunSTLTests_Sub0(int v) +{ + stltests_vec[0].assign(v, v); +} + +static void RunSTLTests(void) +{ + assert(stltests_vec[0] == stltests_vec[1]); + RunSTLTests_Sub0(0); + assert(stltests_vec[0] == stltests_vec[1]); + RunSTLTests_Sub0(1); + RunSTLTests_Sub0(0); + assert(stltests_vec[0] == stltests_vec[1]); +} + +static void LZCount_Test(void) +{ + for(uint32 i = 0, x = 0; i < 33; i++, x = (x << 1) + 1) + { + assert(MDFN_lzcount32(x) == 32 - i); + } + + for(uint32 i = 0, x = 0; i < 33; i++, x = (x ? (x << 1) : 1)) + { + assert(MDFN_lzcount32(x) == 32 - i); + } + + for(uint64 i = 0, x = 0; i < 65; i++, x = (x << 1) + 1) + { + assert(MDFN_lzcount64(x) == 64 - i); + } + + for(uint64 i = 0, x = 0; i < 65; i++, x = (x ? (x << 1) : 1)) + { + assert(MDFN_lzcount64(x) == 64 - i); + } + + uint32 tv = 0; + for(uint32 i = 0, x = 1; i < 200; i++, x = (x * 9) + MDFN_lzcount32(x) + MDFN_lzcount32(x >> (x & 31))) + { + tv += x; + } + assert(tv == 0x397d920f); + + uint64 tv64 = 0; + for(uint64 i = 0, x = 1; i < 200; i++, x = (x * 9) + MDFN_lzcount64(x) + MDFN_lzcount64(x >> (x & 63))) + { + tv64 += x; + } + assert(tv64 == 0x7b8263de01922c29); +} + + +// don't make this static, and don't make it local scope. Whole-program optimization might defeat the purpose of this, though... +unsigned int mdfn_shifty_test[4] = +{ + 0, 8, 16, 32 +}; + + +// Don't make static. +double mdfn_fptest0_sub(double x, double n) MDFN_COLD NO_INLINE; +double mdfn_fptest0_sub(double x, double n) +{ + double u = x / (n * n); + + return(u); +} + +static void fptest0(void) +{ + assert(mdfn_fptest0_sub(36, 2) == 9); +} + +volatile double mdfn_fptest1_v; +static void fptest1(void) +{ + mdfn_fptest1_v = 1.0; + + for(int i = 0; i < 128; i++) + mdfn_fptest1_v *= 2; + + assert(mdfn_fptest1_v == 340282366920938463463374607431768211456.0); +} + +#if defined(HAVE_FENV_H) && defined(HAVE_NEARBYINTF) +// For advisory/debug purposes, don't error out on failure. +static void libc_rounding_test(void) +{ + unsigned old_rm = fegetround(); + float tv = 4118966.75; + float goodres = 4118967.0; + float res; + + fesetround(FE_TONEAREST); + + if((res = nearbyintf(tv)) != goodres) + fprintf(stderr, "\n***** Buggy libc nearbyintf() detected(%f != %f). *****\n\n", res, goodres); + + fesetround(old_rm); +} +#else +static void libc_rounding_test(void) +{ + +} +#endif + +static int pow_test_sub_a(int y, double z) NO_INLINE NO_CLONE; +static int pow_test_sub_a(int y, double z) +{ + return std::min(floor(pow(10, z)), std::min(floor(pow(10, y)), (int)pow(10, y))); +} + +static int pow_test_sub_b(int y) NO_INLINE NO_CLONE; +static int pow_test_sub_b(int y) +{ + return std::min(floor(pow(2, y)), (int)pow(2, y)); +} + +static void pow_test(void) +{ + unsigned muller10 = 1; + unsigned muller2 = 1; + + for(int y = 0; y < 10; y++, muller10 *= 10, muller2 <<= 1) + { + unsigned res10 = pow_test_sub_a(y, y); + unsigned res2 = pow_test_sub_b(y); + + //printf("%u %u\n", res10, res2); + + assert(res10 == muller10); + assert(res2 == muller2); + } +} + +static void RunFPTests(void) +{ + fptest0(); + fptest1(); + + libc_rounding_test(); + pow_test(); +} + +#if 0 +static void NO_CLONE NO_INLINE ThreadSub(int tv) +{ + throw MDFN_Error(tv, "%d\n", tv); +} + + +static int ThreadTestEntry(void* data) +{ + const uint32 st = *(uint32*)data; + + while(MDFND_GetTime() < st) + { + try + { + ThreadSub(rand()); + } + catch(MDFN_Error &e) + { + assert(e.GetErrno() == atoi(e.what())); + } + } + + return 0; +} + + +static void RunThreadTests(void) +{ + MDFN_Thread *a, *b, *c, *d; + uint32 t = MDFND_GetTime() + 5000; + + a = MDFND_CreateThread(ThreadTestEntry, &t); + b = MDFND_CreateThread(ThreadTestEntry, &t); + c = MDFND_CreateThread(ThreadTestEntry, &t); + d = MDFND_CreateThread(ThreadTestEntry, &t); + + MDFND_WaitThread(a, NULL); + MDFND_WaitThread(b, NULL); + MDFND_WaitThread(c, NULL); + MDFND_WaitThread(d, NULL); +} +#endif + +static void zlib_test(void) +{ + auto cfl = zlibCompileFlags(); + + assert((2 << ((cfl >> 0) & 0x3)) == sizeof(uInt)); + assert((2 << ((cfl >> 2) & 0x3)) == sizeof(uLong)); + assert((2 << ((cfl >> 4) & 0x3)) == sizeof(voidpf)); + + #ifdef Z_LARGE64 + if((2 << ((cfl >> 6) & 0x3)) != sizeof(z_off_t)) + { + assert(sizeof(z_off64_t) == 8); + assert(&gztell == &gztell64); + } + #else + assert((2 << ((cfl >> 6) & 0x3)) == sizeof(z_off_t)); + #endif +} + +const char* MDFN_tests_stringA = "AB\0C"; +const char* MDFN_tests_stringB = "AB\0CD"; +const char* MDFN_tests_stringC = "AB\0X"; + +} + +using namespace MDFN_TESTS_CPP; + +bool MDFN_RunMathTests(void) +{ + MathTestEntry *itoo = math_test_vals; + + if(!DoSizeofTests()) + return(0); + + assert(MDFN_tests_stringA != MDFN_tests_stringB && MDFN_tests_stringA[3] == 'C' && MDFN_tests_stringB[4] == 'D'); + assert(MDFN_tests_stringA != MDFN_tests_stringC && MDFN_tests_stringB != MDFN_tests_stringC && MDFN_tests_stringC[3] == 'X'); + + // Make sure the "char" type is signed(pass -fsigned-char to gcc). New code in Mednafen shouldn't be written with the + // assumption that "char" is signed, but there likely is at least some code that does. + { + char tmp = 255; + assert(tmp < 0); + } + + #if 0 + // TODO(except for 32-bit >> 32 test) + { + uint8 test_cow8 = (uint8)0xFF >> mdfn_shifty_test[1]; + uint16 test_cow16 = (uint16)0xFFFF >> mdfn_shifty_test[2]; + uint32 test_cow32 = (uint32)0xFFFFFFFF >> mdfn_shifty_test[3]; + uint32 test_cow32_2 = (uint32)0xFFFFFFFF >> mdfn_shifty_test[0]; + + printf("%08x\n", test_cow32); + + assert(test_cow8 == 0); + assert(test_cow16 == 0); + assert(test_cow32 == 0); + assert(test_cow32_2 == 0xFFFFFFFF); + } + #endif + + { + int32 meow; + + meow = 1; + meow >>= 1; + assert(meow == 0); + + meow = 5; + meow >>= 1; + assert(meow == 2); + + meow = -1; + meow >>= 1; + assert(meow == -1); + + meow = -5; + meow >>= 1; + assert(meow == -3); + + meow = 1; + meow /= 2; + assert(meow == 0); + + meow = 5; + meow /= 2; + assert(meow == 2); + + meow = -1; + meow /= 2; + assert(meow == 0); + + meow = -5; + meow /= 2; + assert(meow == -2); + + meow = -5; + meow = (int32)(meow + ((uint32)meow >> 31)) >> 1; + assert(meow == -2); + + #if 0 + meow = 1 << 30; + meow <<= 1; + assert(meow == -2147483648); + + meow = 1 << 31; + meow <<= 1; + assert(meow == 0); + #endif + } + + + // New tests added May 22, 2010 to detect MSVC compiler(and possibly other compilers) bad code generation. + { + uint32 test_tab[4] = { 0x2000 | 0x1000, 0x2000, 0x1000, 0x0000 }; + const uint32 result_tab[4][2] = { { 0xE, 0x7 }, { 0xE, 0x0 }, { 0x0, 0x7 }, { 0x0, 0x0 } }; + + for(int i = 0; i < 4; i++) + { + uint32 hflip_xor; + uint32 vflip_xor; + uint32 bgsc; + + bgsc = test_tab[i]; + + hflip_xor = ((int32)(bgsc << 18) >> 30) & 0xE; + vflip_xor = ((int32)(bgsc << 19) >> 31) & 0x7; + + assert(hflip_xor == result_tab[i][0]); + assert(vflip_xor == result_tab[i][1]); + + //printf("%d %d\n", hflip_xor, result_tab[i][0]); + //printf("%d %d\n", vflip_xor, result_tab[i][1]); + } + + uint32 lfsr = 1; + + // quick and dirty RNG(to also test non-constant-expression evaluation, at least until compilers are extremely advanced :b) + for(int i = 0; i < 256; i++) + { + int feedback = ((lfsr >> 7) & 1) ^ ((lfsr >> 14) & 1); + lfsr = ((lfsr << 1) & 0x7FFF) | feedback; + + uint32 hflip_xor; + uint32 vflip_xor; + uint32 hflip_xor_alt; + uint32 vflip_xor_alt; + uint32 bgsc; + + bgsc = lfsr; + + hflip_xor = ((int32)(bgsc << 18) >> 30) & 0xE; + vflip_xor = ((int32)(bgsc << 19) >> 31) & 0x7; + + hflip_xor_alt = bgsc & 0x2000 ? 0xE : 0; + vflip_xor_alt = bgsc & 0x1000 ? 0x7 : 0; + + assert(hflip_xor == hflip_xor_alt); + assert(vflip_xor == vflip_xor_alt); + } + + } + + DoAlignmentChecks(); + TestSignedOverflow(); + TestDefinedOverShift(); + TestBoolConv(); + TestNarrowConstFold(); + + TestGCC60196(); + + TestModTern(); + TestBWNotMask31GTZ(); + TestTernary(); + TestLLVM15470(); + + TestSUCompare(); + + if(sign_9_to_s16(itoo->negative_one) != -1 || sign_9_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_10_to_s16(itoo->negative_one) != -1 || sign_10_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_11_to_s16(itoo->negative_one) != -1 || sign_11_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_12_to_s16(itoo->negative_one) != -1 || sign_12_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_13_to_s16(itoo->negative_one) != -1 || sign_13_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_14_to_s16(itoo->negative_one) != -1 || sign_14_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_15_to_s16(itoo->negative_one) != -1 || sign_15_to_s16(itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(17, itoo->negative_one) != -1 || sign_x_to_s32(17, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(18, itoo->negative_one) != -1 || sign_x_to_s32(18, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(19, itoo->negative_one) != -1 || sign_x_to_s32(19, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(20, itoo->negative_one) != -1 || sign_x_to_s32(20, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(21, itoo->negative_one) != -1 || sign_x_to_s32(21, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(22, itoo->negative_one) != -1 || sign_x_to_s32(22, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(23, itoo->negative_one) != -1 || sign_x_to_s32(23, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(24, itoo->negative_one) != -1 || sign_x_to_s32(24, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(25, itoo->negative_one) != -1 || sign_x_to_s32(25, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(26, itoo->negative_one) != -1 || sign_x_to_s32(26, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(27, itoo->negative_one) != -1 || sign_x_to_s32(27, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(28, itoo->negative_one) != -1 || sign_x_to_s32(28, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(29, itoo->negative_one) != -1 || sign_x_to_s32(29, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(30, itoo->negative_one) != -1 || sign_x_to_s32(30, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sign_x_to_s32(31, itoo->negative_one) != -1 || sign_x_to_s32(31, itoo->mostneg) != itoo->mostnegresult) + FATALME; + itoo++; + + if(sizeof(int8) != 1 || sizeof(uint8) != 1) + FATALME; + + + if(!DoAntiNSOBugTest()) + return(0); + + DoAntiNSOBugTest2014(); + + if(!DoLEPackerTest()) + return(0); + + assert(uilog2(0) == 0); + assert(uilog2(1) == 0); + assert(uilog2(3) == 1); + assert(uilog2(4095) == 11); + assert(uilog2(0xFFFFFFFF) == 31); + + RunFPTests(); + + RunMASMemTests(); + +#pragma message "this test is failing, if something goes wrong, it could be because of this comment" + //RunExceptionTests(); + + //RunThreadTests(); + + RunSTLTests(); + + LZCount_Test(); + + sha1_test(); + sha256_test(); + + zlib_test(); + +#if 0 +// Not really a math test. + const char *test_paths[] = { "/meow", "/meow/cow", "\\meow", "\\meow\\cow", "\\\\meow", "\\\\meow\\cow", + "/meow.", "/me.ow/cow.", "\\meow.", "\\me.ow\\cow.", "\\\\meow.", "\\\\meow\\cow.", + "/meow.txt", "/me.ow/cow.txt", "\\meow.txt", "\\me.ow\\cow.txt", "\\\\meow.txt", "\\\\meow\\cow.txt" + + "/meow", "/meow\\cow", "\\meow", "\\meow/cow", "\\\\meow", "\\\\meow/cow", + "/meow.", "\\me.ow/cow.", "\\meow.", "/me.ow\\cow.", "\\\\meow.", "\\\\meow/cow.", + "/meow.txt", "/me.ow\\cow.txt", "\\meow.txt", "\\me.ow/cow.txt", "\\\\meow.txt", "\\\\meow/cow.txt", + "/bark///dog", "\\bark\\\\\\dog" }; + + for(unsigned i = 0; i < sizeof(test_paths) / sizeof(const char *); i++) + { + std::string file_path = std::string(test_paths[i]); + std::string dir_path; + std::string file_base; + std::string file_ext; + + MDFN_GetFilePathComponents(file_path, &dir_path, &file_base, &file_ext); + + printf("%s ------ dir=%s --- base=%s --- ext=%s\n", file_path.c_str(), dir_path.c_str(), file_base.c_str(), file_ext.c_str()); + + } +#endif + + + return(1); +} diff --git a/Mednafen/mednafen/tests.h b/Mednafen/mednafen/tests.h new file mode 100644 index 0000000000..379617acb8 --- /dev/null +++ b/Mednafen/mednafen/tests.h @@ -0,0 +1,7 @@ +#ifndef __MDFN_TESTS_H +#define __MDFN_TESTS_H + +bool MDFN_RunMathTests(void); + +#endif + diff --git a/Mednafen/mednafen/tremor/!!!VERSION b/Mednafen/mednafen/tremor/!!!VERSION new file mode 100644 index 0000000000..88ea845ccb --- /dev/null +++ b/Mednafen/mednafen/tremor/!!!VERSION @@ -0,0 +1,8 @@ +tremor svn 18222 +libogg 1.3.0 + +With modifications like: +perl -p -i -e "s//\"ogg.h\"/g" * && perl -p -i -e "s//\"os_types.h\"/g" * && perl -p -i -e "s//\"config_types.h\"/g" * + +Jan 20, 2013: +Mednafen-specific modifications to os_types.h, os.h, and misc.h - config_types.h was removed. diff --git a/Mednafen/mednafen/tremor/CHANGELOG b/Mednafen/mednafen/tremor/CHANGELOG new file mode 100644 index 0000000000..53f23351e2 --- /dev/null +++ b/Mednafen/mednafen/tremor/CHANGELOG @@ -0,0 +1,19 @@ +*** 20020517: 1.0.2 *** + + Playback bugfix to floor1; mode mistakenly used for sizing instead + of blockflag + +*** 20020515: 1.0.1 *** + + Added complete API documentation to source tarball. No code + changes. + +*** 20020412: 1.0.1 *** + + Fixed a clipping bug that affected ARM processors; negative + overflows were being properly clipped, but then clobbered to + positive by the positive overflow chec (asm_arm.h:CLIP_TO_15) + +*** 20020403: 1.0.0 *** + + Initial version \ No newline at end of file diff --git a/Mednafen/mednafen/tremor/COPYING b/Mednafen/mednafen/tremor/COPYING new file mode 100644 index 0000000000..6111c6c5a6 --- /dev/null +++ b/Mednafen/mednafen/tremor/COPYING @@ -0,0 +1,28 @@ +Copyright (c) 2002, Xiph.org Foundation + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +- Neither the name of the Xiph.org Foundation nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Mednafen/mednafen/tremor/Makefile.am b/Mednafen/mednafen/tremor/Makefile.am new file mode 100644 index 0000000000..371106cd6b --- /dev/null +++ b/Mednafen/mednafen/tremor/Makefile.am @@ -0,0 +1,15 @@ +DEFS = @DEFS@ @CFLAG_VISIBILITY@ +INCLUDES = -I./ + +noinst_LIBRARIES = libvorbisidec.a + +libvorbisidec_a_SOURCES = mdct.c block.c window.c \ + synthesis.c info.c \ + floor1.c floor0.c vorbisfile.c \ + res012.c mapping0.c registry.c codebook.c \ + sharedbook.c framing.c bitwise.c \ + codebook.h misc.h mdct_lookup.h\ + os.h mdct.h block.h ivorbisfile.h lsp_lookup.h\ + registry.h window.h window_lookup.h\ + codec_internal.h backends.h ogg.h \ + asm_arm.h ivorbiscodec.h diff --git a/Mednafen/mednafen/tremor/Makefile.in b/Mednafen/mednafen/tremor/Makefile.in new file mode 100644 index 0000000000..26bdbe77ed --- /dev/null +++ b/Mednafen/mednafen/tremor/Makefile.in @@ -0,0 +1,703 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/tremor +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp COPYING \ + README +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libvorbisidec_a_AR = $(AR) $(ARFLAGS) +libvorbisidec_a_LIBADD = +am_libvorbisidec_a_OBJECTS = mdct.$(OBJEXT) block.$(OBJEXT) \ + window.$(OBJEXT) synthesis.$(OBJEXT) info.$(OBJEXT) \ + floor1.$(OBJEXT) floor0.$(OBJEXT) vorbisfile.$(OBJEXT) \ + res012.$(OBJEXT) mapping0.$(OBJEXT) registry.$(OBJEXT) \ + codebook.$(OBJEXT) sharedbook.$(OBJEXT) framing.$(OBJEXT) \ + bitwise.$(OBJEXT) +libvorbisidec_a_OBJECTS = $(am_libvorbisidec_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libvorbisidec_a_SOURCES) +DIST_SOURCES = $(libvorbisidec_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = @DEFS@ @CFLAG_VISIBILITY@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +INCLUDES = -I./ +noinst_LIBRARIES = libvorbisidec.a +libvorbisidec_a_SOURCES = mdct.c block.c window.c \ + synthesis.c info.c \ + floor1.c floor0.c vorbisfile.c \ + res012.c mapping0.c registry.c codebook.c \ + sharedbook.c framing.c bitwise.c \ + codebook.h misc.h mdct_lookup.h\ + os.h mdct.h block.h ivorbisfile.h lsp_lookup.h\ + registry.h window.h window_lookup.h\ + codec_internal.h backends.h ogg.h \ + asm_arm.h ivorbiscodec.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tremor/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tremor/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libvorbisidec.a: $(libvorbisidec_a_OBJECTS) $(libvorbisidec_a_DEPENDENCIES) $(EXTRA_libvorbisidec_a_DEPENDENCIES) + $(AM_V_at)-rm -f libvorbisidec.a + $(AM_V_AR)$(libvorbisidec_a_AR) libvorbisidec.a $(libvorbisidec_a_OBJECTS) $(libvorbisidec_a_LIBADD) + $(AM_V_at)$(RANLIB) libvorbisidec.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitwise.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/block.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/codebook.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/floor0.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/floor1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/framing.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/info.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mapping0.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/registry.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/res012.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sharedbook.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synthesis.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vorbisfile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/tremor/README b/Mednafen/mednafen/tremor/README new file mode 100644 index 0000000000..1321175322 --- /dev/null +++ b/Mednafen/mednafen/tremor/README @@ -0,0 +1,46 @@ +This README covers the Ogg Vorbis 'Tremor' integer playback codec +source as of date 2002 09 02, version 1.0.0. + + ****** + +The C source in this package will build on any ANSI C compiler and +function completely and properly on any platform. The included build +system assumes GNU build system and make tools (m4, automake, +autoconf, libtool and gmake). GCC is not required, although GCC is +the most tested compiler. To build using GNU tools, type in the +source directory: + +./autogen.sh +make + +Currently, the source implements playback in pure C on all platforms +except ARM, where a [currently] small amount of assembly (see +asm_arm.h) is used to implement 64 bit math operations and fast LSP +computation. If building on ARM without the benefit of GNU build +system tools, be sure that '_ARM_ASSEM_' is #defined by the build +system if this assembly is desired, else the resulting library will +use whatever 64 bit math builtins the compiler implements. + +No math library is required by this source. No floating point +operations are used at any point in either setup or decode. This +decoder library will properly decode any past, current or future +Vorbis I file or stream. + + ******** + +The build system produces a static and [when supported by the OS] +dynamic library named 'libvorbisidec'. This library exposes an API +nearly identical to the BSD reference library's 'libvorbisfile', +including all the features familiar to users of vorbisfile. This API +is similar enough that the proper header file to include is named +'ivorbisfile.h' [included in the source build directory]. Lower level +libvorbis-style headers and structures are in 'ivorbiscodec.h' +[included in the source build directory]. A simple example program, +ivorbisfile_example.c, can be built with 'make example'. + + ******** + +Detailed Tremor API Documentation begins at doc/index.html + +Monty +xiph.org diff --git a/Mednafen/mednafen/tremor/Version_script.in b/Mednafen/mednafen/tremor/Version_script.in new file mode 100644 index 0000000000..cf05203c0f --- /dev/null +++ b/Mednafen/mednafen/tremor/Version_script.in @@ -0,0 +1,62 @@ +# +# Export file for libvorbisidec +# +# Only the symbols listed in the global section will be callable from +# applications linking to libvorbisidec. +# + +@PACKAGE@.so.1 +{ + global: + ov_clear; + ov_open; + ov_open_callbacks; + ov_test; + ov_test_callbacks; + ov_test_open; + ov_bitrate; + ov_bitrate_instant; + ov_streams; + ov_seekable; + ov_serialnumber; + ov_raw_total; + ov_pcm_total; + ov_time_total; + ov_raw_seek; + ov_pcm_seek; + ov_pcm_seek_page; + ov_time_seek; + ov_time_seek_page; + ov_raw_tell; + ov_pcm_tell; + ov_time_tell; + ov_info; + ov_comment; + ov_read; + + vorbis_info_init; + vorbis_info_clear; + vorbis_info_blocksize; + vorbis_comment_init; + vorbis_comment_add; + vorbis_comment_add_tag; + vorbis_comment_query; + vorbis_comment_query_count; + vorbis_comment_clear; + vorbis_block_init; + vorbis_block_clear; + vorbis_dsp_clear; + vorbis_synthesis_idheader; + vorbis_synthesis_headerin; + vorbis_synthesis_init; + vorbis_synthesis_restart; + vorbis_synthesis; + vorbis_synthesis_trackonly; + vorbis_synthesis_blockin; + vorbis_synthesis_pcmout; + vorbis_synthesis_read; + vorbis_packet_blocksize; + + local: + *; +}; diff --git a/Mednafen/mednafen/tremor/asm_arm.h b/Mednafen/mednafen/tremor/asm_arm.h new file mode 100644 index 0000000000..c3bda005cd --- /dev/null +++ b/Mednafen/mednafen/tremor/asm_arm.h @@ -0,0 +1,245 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: arm7 and later wide math functions + + ********************************************************************/ + +#ifdef _ARM_ASSEM_ + +#if !defined(_V_WIDE_MATH) && !defined(_LOW_ACCURACY_) +#define _V_WIDE_MATH + +static inline ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { + int lo,hi; + asm volatile("smull\t%0, %1, %2, %3" + : "=&r"(lo),"=&r"(hi) + : "%r"(x),"r"(y) + : "cc"); + return(hi); +} + +static inline ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { + return MULT32(x,y)<<1; +} + +static inline ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { + int lo,hi; + asm volatile("smull %0, %1, %2, %3\n\t" + "movs %0, %0, lsr #15\n\t" + "adc %1, %0, %1, lsl #17\n\t" + : "=&r"(lo),"=&r"(hi) + : "%r"(x),"r"(y) + : "cc"); + return(hi); +} + +#define MB() asm volatile ("" : : : "memory") + +static inline void XPROD32(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + int x1, y1, l; + asm( "smull %0, %1, %4, %6\n\t" + "smlal %0, %1, %5, %7\n\t" + "rsb %3, %4, #0\n\t" + "smull %0, %2, %5, %6\n\t" + "smlal %0, %2, %3, %7" + : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) + : "3" (a), "r" (b), "r" (t), "r" (v) + : "cc" ); + *x = x1; + MB(); + *y = y1; +} + +static inline void XPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + int x1, y1, l; + asm( "smull %0, %1, %4, %6\n\t" + "smlal %0, %1, %5, %7\n\t" + "rsb %3, %4, #0\n\t" + "smull %0, %2, %5, %6\n\t" + "smlal %0, %2, %3, %7" + : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) + : "3" (a), "r" (b), "r" (t), "r" (v) + : "cc" ); + *x = x1 << 1; + MB(); + *y = y1 << 1; +} + +static inline void XNPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + int x1, y1, l; + asm( "rsb %2, %4, #0\n\t" + "smull %0, %1, %3, %5\n\t" + "smlal %0, %1, %2, %6\n\t" + "smull %0, %2, %4, %5\n\t" + "smlal %0, %2, %3, %6" + : "=&r" (l), "=&r" (x1), "=&r" (y1) + : "r" (a), "r" (b), "r" (t), "r" (v) + : "cc" ); + *x = x1 << 1; + MB(); + *y = y1 << 1; +} + +#endif + +#ifndef _V_CLIP_MATH +#define _V_CLIP_MATH + +static inline ogg_int32_t CLIP_TO_15(ogg_int32_t x) { + int tmp; + asm volatile("subs %1, %0, #32768\n\t" + "movpl %0, #0x7f00\n\t" + "orrpl %0, %0, #0xff\n" + "adds %1, %0, #32768\n\t" + "movmi %0, #0x8000" + : "+r"(x),"=r"(tmp) + : + : "cc"); + return(x); +} + +#endif + +#ifndef _V_LSP_MATH_ASM +#define _V_LSP_MATH_ASM + +static inline void lsp_loop_asm(ogg_uint32_t *qip,ogg_uint32_t *pip, + ogg_int32_t *qexpp, + ogg_int32_t *ilsp,ogg_int32_t wi, + ogg_int32_t m){ + + ogg_uint32_t qi=*qip,pi=*pip; + ogg_int32_t qexp=*qexpp; + + asm("mov r0,%3;" + "movs r1,%5,asr#1;" + "add r0,r0,r1,lsl#3;" + "beq 2f;\n" + "1:" + + "ldmdb r0!,{r1,r3};" + "subs r1,r1,%4;" //ilsp[j]-wi + "rsbmi r1,r1,#0;" //labs(ilsp[j]-wi) + "umull %0,r2,r1,%0;" //qi*=labs(ilsp[j]-wi) + + "subs r1,r3,%4;" //ilsp[j+1]-wi + "rsbmi r1,r1,#0;" //labs(ilsp[j+1]-wi) + "umull %1,r3,r1,%1;" //pi*=labs(ilsp[j+1]-wi) + + "cmn r2,r3;" // shift down 16? + "beq 0f;" + "add %2,%2,#16;" + "mov %0,%0,lsr #16;" + "orr %0,%0,r2,lsl #16;" + "mov %1,%1,lsr #16;" + "orr %1,%1,r3,lsl #16;" + "0:" + "cmp r0,%3;\n" + "bhi 1b;\n" + + "2:" + // odd filter assymetry + "ands r0,%5,#1;\n" + "beq 3f;\n" + "add r0,%3,%5,lsl#2;\n" + + "ldr r1,[r0,#-4];\n" + "mov r0,#0x4000;\n" + + "subs r1,r1,%4;\n" //ilsp[j]-wi + "rsbmi r1,r1,#0;\n" //labs(ilsp[j]-wi) + "umull %0,r2,r1,%0;\n" //qi*=labs(ilsp[j]-wi) + "umull %1,r3,r0,%1;\n" //pi*=labs(ilsp[j+1]-wi) + + "cmn r2,r3;\n" // shift down 16? + "beq 3f;\n" + "add %2,%2,#16;\n" + "mov %0,%0,lsr #16;\n" + "orr %0,%0,r2,lsl #16;\n" + "mov %1,%1,lsr #16;\n" + "orr %1,%1,r3,lsl #16;\n" + + //qi=(pi>>shift)*labs(ilsp[j]-wi); + //pi=(qi>>shift)*labs(ilsp[j+1]-wi); + //qexp+=shift; + + //} + + /* normalize to max 16 sig figs */ + "3:" + "mov r2,#0;" + "orr r1,%0,%1;" + "tst r1,#0xff000000;" + "addne r2,r2,#8;" + "movne r1,r1,lsr #8;" + "tst r1,#0x00f00000;" + "addne r2,r2,#4;" + "movne r1,r1,lsr #4;" + "tst r1,#0x000c0000;" + "addne r2,r2,#2;" + "movne r1,r1,lsr #2;" + "tst r1,#0x00020000;" + "addne r2,r2,#1;" + "movne r1,r1,lsr #1;" + "tst r1,#0x00010000;" + "addne r2,r2,#1;" + "mov %0,%0,lsr r2;" + "mov %1,%1,lsr r2;" + "add %2,%2,r2;" + + : "+r"(qi),"+r"(pi),"+r"(qexp) + : "r"(ilsp),"r"(wi),"r"(m) + : "r0","r1","r2","r3","cc"); + + *qip=qi; + *pip=pi; + *qexpp=qexp; +} + +static inline void lsp_norm_asm(ogg_uint32_t *qip,ogg_int32_t *qexpp){ + + ogg_uint32_t qi=*qip; + ogg_int32_t qexp=*qexpp; + + asm("tst %0,#0x0000ff00;" + "moveq %0,%0,lsl #8;" + "subeq %1,%1,#8;" + "tst %0,#0x0000f000;" + "moveq %0,%0,lsl #4;" + "subeq %1,%1,#4;" + "tst %0,#0x0000c000;" + "moveq %0,%0,lsl #2;" + "subeq %1,%1,#2;" + "tst %0,#0x00008000;" + "moveq %0,%0,lsl #1;" + "subeq %1,%1,#1;" + : "+r"(qi),"+r"(qexp) + : + : "cc"); + *qip=qi; + *qexpp=qexp; +} + +#endif +#endif + diff --git a/Mednafen/mednafen/tremor/backends.h b/Mednafen/mednafen/tremor/backends.h new file mode 100644 index 0000000000..52024219b1 --- /dev/null +++ b/Mednafen/mednafen/tremor/backends.h @@ -0,0 +1,131 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: backend and mapping structures + + ********************************************************************/ + +/* this is exposed up here because we need it for static modes. + Lookups for each backend aren't exposed because there's no reason + to do so */ + +#ifndef _vorbis_backend_h_ +#define _vorbis_backend_h_ + +#include "codec_internal.h" + +/* this would all be simpler/shorter with templates, but.... */ +/* Transform backend generic *************************************/ + +/* only mdct right now. Flesh it out more if we ever transcend mdct + in the transform domain */ + +/* Floor backend generic *****************************************/ +typedef struct{ + vorbis_info_floor *(*unpack)(vorbis_info *,oggpack_buffer *); + vorbis_look_floor *(*look) (vorbis_dsp_state *,vorbis_info_mode *, + vorbis_info_floor *); + void (*free_info) (vorbis_info_floor *); + void (*free_look) (vorbis_look_floor *); + void *(*inverse1) (struct vorbis_block *,vorbis_look_floor *); + int (*inverse2) (struct vorbis_block *,vorbis_look_floor *, + void *buffer,ogg_int32_t *); +} vorbis_func_floor; + +typedef struct{ + int order; + long rate; + long barkmap; + + int ampbits; + int ampdB; + + int numbooks; /* <= 16 */ + int books[16]; + +} vorbis_info_floor0; + +#define VIF_POSIT 63 +#define VIF_CLASS 16 +#define VIF_PARTS 31 +typedef struct{ + int partitions; /* 0 to 31 */ + int partitionclass[VIF_PARTS]; /* 0 to 15 */ + + int class_dim[VIF_CLASS]; /* 1 to 8 */ + int class_subs[VIF_CLASS]; /* 0,1,2,3 (bits: 1< +#include +#include +#include "ogg.h" + +#define BUFFER_INCREMENT 256 + +static const unsigned long mask[]= +{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, + 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, + 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, + 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, + 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, + 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, + 0x3fffffff,0x7fffffff,0xffffffff }; + +static const unsigned int mask8B[]= +{0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; + +void oggpack_writeinit(oggpack_buffer *b){ + memset(b,0,sizeof(*b)); + b->ptr=b->buffer=_ogg_malloc(BUFFER_INCREMENT); + b->buffer[0]='\0'; + b->storage=BUFFER_INCREMENT; +} + +void oggpackB_writeinit(oggpack_buffer *b){ + oggpack_writeinit(b); +} + +int oggpack_writecheck(oggpack_buffer *b){ + if(!b->ptr || !b->storage)return -1; + return 0; +} + +int oggpackB_writecheck(oggpack_buffer *b){ + return oggpack_writecheck(b); +} + +void oggpack_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask[bits]; + } +} + +void oggpackB_writetrunc(oggpack_buffer *b,long bits){ + long bytes=bits>>3; + if(b->ptr){ + bits-=bytes*8; + b->ptr=b->buffer+bytes; + b->endbit=bits; + b->endbyte=bytes; + *b->ptr&=mask8B[bits]; + } +} + +/* Takes only up to 32 bits. */ +void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ + if(bits<0 || bits>32) goto err; + if(b->endbyte>=b->storage-4){ + void *ret; + if(!b->ptr)return; + if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret) goto err; + b->buffer=ret; + b->storage+=BUFFER_INCREMENT; + b->ptr=b->buffer+b->endbyte; + } + + value&=mask[bits]; + bits+=b->endbit; + + b->ptr[0]|=value<endbit; + + if(bits>=8){ + b->ptr[1]=(unsigned char)(value>>(8-b->endbit)); + if(bits>=16){ + b->ptr[2]=(unsigned char)(value>>(16-b->endbit)); + if(bits>=24){ + b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); + else + b->ptr[4]=0; + } + } + } + } + + b->endbyte+=bits/8; + b->ptr+=bits/8; + b->endbit=bits&7; + return; + err: + oggpack_writeclear(b); +} + +/* Takes only up to 32 bits. */ +void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ + if(bits<0 || bits>32) goto err; + if(b->endbyte>=b->storage-4){ + void *ret; + if(!b->ptr)return; + if(b->storage>LONG_MAX-BUFFER_INCREMENT) goto err; + ret=_ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); + if(!ret) goto err; + b->buffer=ret; + b->storage+=BUFFER_INCREMENT; + b->ptr=b->buffer+b->endbyte; + } + + value=(value&mask[bits])<<(32-bits); + bits+=b->endbit; + + b->ptr[0]|=value>>(24+b->endbit); + + if(bits>=8){ + b->ptr[1]=(unsigned char)(value>>(16+b->endbit)); + if(bits>=16){ + b->ptr[2]=(unsigned char)(value>>(8+b->endbit)); + if(bits>=24){ + b->ptr[3]=(unsigned char)(value>>(b->endbit)); + if(bits>=32){ + if(b->endbit) + b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); + else + b->ptr[4]=0; + } + } + } + } + + b->endbyte+=bits/8; + b->ptr+=bits/8; + b->endbit=bits&7; + return; + err: + oggpack_writeclear(b); +} + +void oggpack_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpack_write(b,0,bits); +} + +void oggpackB_writealign(oggpack_buffer *b){ + int bits=8-b->endbit; + if(bits<8) + oggpackB_write(b,0,bits); +} + +static void oggpack_writecopy_helper(oggpack_buffer *b, + void *source, + long bits, + void (*w)(oggpack_buffer *, + unsigned long, + int), + int msb){ + unsigned char *ptr=(unsigned char *)source; + + long bytes=bits/8; + bits-=bytes*8; + + if(b->endbit){ + int i; + /* unaligned copy. Do it the hard way. */ + for(i=0;iendbyte+bytes+1>=b->storage){ + void *ret; + if(!b->ptr) goto err; + if(b->endbyte+bytes+BUFFER_INCREMENT>b->storage) goto err; + b->storage=b->endbyte+bytes+BUFFER_INCREMENT; + ret=_ogg_realloc(b->buffer,b->storage); + if(!ret) goto err; + b->buffer=ret; + b->ptr=b->buffer+b->endbyte; + } + + memmove(b->ptr,source,bytes); + b->ptr+=bytes; + b->endbyte+=bytes; + *b->ptr=0; + + } + if(bits){ + if(msb) + w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits); + else + w(b,(unsigned long)(ptr[bytes]),bits); + } + return; + err: + oggpack_writeclear(b); +} + +void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ + oggpack_writecopy_helper(b,source,bits,oggpack_write,0); +} + +void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ + oggpack_writecopy_helper(b,source,bits,oggpackB_write,1); +} + +void oggpack_reset(oggpack_buffer *b){ + if(!b->ptr)return; + b->ptr=b->buffer; + b->buffer[0]=0; + b->endbit=b->endbyte=0; +} + +void oggpackB_reset(oggpack_buffer *b){ + oggpack_reset(b); +} + +void oggpack_writeclear(oggpack_buffer *b){ + if(b->buffer)_ogg_free(b->buffer); + memset(b,0,sizeof(*b)); +} + +void oggpackB_writeclear(oggpack_buffer *b){ + oggpack_writeclear(b); +} + +void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ + memset(b,0,sizeof(*b)); + b->buffer=b->ptr=buf; + b->storage=bytes; +} + +void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ + oggpack_readinit(b,buf,bytes); +} + +/* Read in bits without advancing the bitptr; bits <= 32 */ +long oggpack_look(oggpack_buffer *b,int bits){ + unsigned long ret; + unsigned long m; + + if(bits<0 || bits>32) return -1; + m=mask[bits]; + bits+=b->endbit; + + if(b->endbyte >= b->storage-4){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) return -1; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]>>b->endbit; + if(bits>8){ + ret|=b->ptr[1]<<(8-b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(16-b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]<<(32-b->endbit); + } + } + } + return(m&ret); +} + +/* Read in bits without advancing the bitptr; bits <= 32 */ +long oggpackB_look(oggpack_buffer *b,int bits){ + unsigned long ret; + int m=32-bits; + + if(m<0 || m>32) return -1; + bits+=b->endbit; + + if(b->endbyte >= b->storage-4){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) return -1; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]<<(24+b->endbit); + if(bits>8){ + ret|=b->ptr[1]<<(16+b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(8+b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); + } + } + } + return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1); +} + +long oggpack_look1(oggpack_buffer *b){ + if(b->endbyte>=b->storage)return(-1); + return((b->ptr[0]>>b->endbit)&1); +} + +long oggpackB_look1(oggpack_buffer *b){ + if(b->endbyte>=b->storage)return(-1); + return((b->ptr[0]>>(7-b->endbit))&1); +} + +void oggpack_adv(oggpack_buffer *b,int bits){ + bits+=b->endbit; + + if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return; + + overflow: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; +} + +void oggpackB_adv(oggpack_buffer *b,int bits){ + oggpack_adv(b,bits); +} + +void oggpack_adv1(oggpack_buffer *b){ + if(++(b->endbit)>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } +} + +void oggpackB_adv1(oggpack_buffer *b){ + oggpack_adv1(b); +} + +/* bits <= 32 */ +long oggpack_read(oggpack_buffer *b,int bits){ + long ret; + unsigned long m; + + if(bits<0 || bits>32) goto err; + m=mask[bits]; + bits+=b->endbit; + + if(b->endbyte >= b->storage-4){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]>>b->endbit; + if(bits>8){ + ret|=b->ptr[1]<<(8-b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(16-b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(24-b->endbit); + if(bits>32 && b->endbit){ + ret|=b->ptr[4]<<(32-b->endbit); + } + } + } + } + ret&=m; + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return ret; + + overflow: + err: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +/* bits <= 32 */ +long oggpackB_read(oggpack_buffer *b,int bits){ + long ret; + long m=32-bits; + + if(m<0 || m>32) goto err; + bits+=b->endbit; + + if(b->endbyte+4>=b->storage){ + /* not the main path */ + if(b->endbyte > b->storage-((bits+7)>>3)) goto overflow; + /* special case to avoid reading b->ptr[0], which might be past the end of + the buffer; also skips some useless accounting */ + else if(!bits)return(0L); + } + + ret=b->ptr[0]<<(24+b->endbit); + if(bits>8){ + ret|=b->ptr[1]<<(16+b->endbit); + if(bits>16){ + ret|=b->ptr[2]<<(8+b->endbit); + if(bits>24){ + ret|=b->ptr[3]<<(b->endbit); + if(bits>32 && b->endbit) + ret|=b->ptr[4]>>(8-b->endbit); + } + } + } + ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1); + + b->ptr+=bits/8; + b->endbyte+=bits/8; + b->endbit=bits&7; + return ret; + + overflow: + err: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +long oggpack_read1(oggpack_buffer *b){ + long ret; + + if(b->endbyte >= b->storage) goto overflow; + ret=(b->ptr[0]>>b->endbit)&1; + + b->endbit++; + if(b->endbit>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } + return ret; + + overflow: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +long oggpackB_read1(oggpack_buffer *b){ + long ret; + + if(b->endbyte >= b->storage) goto overflow; + ret=(b->ptr[0]>>(7-b->endbit))&1; + + b->endbit++; + if(b->endbit>7){ + b->endbit=0; + b->ptr++; + b->endbyte++; + } + return ret; + + overflow: + b->ptr=NULL; + b->endbyte=b->storage; + b->endbit=1; + return -1L; +} + +long oggpack_bytes(oggpack_buffer *b){ + return(b->endbyte+(b->endbit+7)/8); +} + +long oggpack_bits(oggpack_buffer *b){ + return(b->endbyte*8+b->endbit); +} + +long oggpackB_bytes(oggpack_buffer *b){ + return oggpack_bytes(b); +} + +long oggpackB_bits(oggpack_buffer *b){ + return oggpack_bits(b); +} + +unsigned char *oggpack_get_buffer(oggpack_buffer *b){ + return(b->buffer); +} + +unsigned char *oggpackB_get_buffer(oggpack_buffer *b){ + return oggpack_get_buffer(b); +} + +/* Self test of the bitwise routines; everything else is based on + them, so they damned well better be solid. */ + +#ifdef _V_SELFTEST +#include + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +oggpack_buffer o; +oggpack_buffer r; + +void report(char *in){ + fprintf(stderr,"%s",in); + exit(1); +} + +void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ + long bytes,i; + unsigned char *buffer; + + oggpack_reset(&o); + for(i=0;i +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codec_internal.h" + +#include "window.h" +#include "registry.h" +#include "misc.h" + +static int ilog(unsigned int v){ + int ret=0; + if(v)--v; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* pcm accumulator examples (not exhaustive): + + <-------------- lW ----------------> + <--------------- W ----------------> +: .....|..... _______________ | +: .''' | '''_--- | |\ | +:.....''' |_____--- '''......| | \_______| +:.................|__________________|_______|__|______| + |<------ Sl ------>| > Sr < |endW + |beginSl |endSl | |endSr + |beginW |endlW |beginSr + + + |< lW >| + <--------------- W ----------------> + | | .. ______________ | + | | ' `/ | ---_ | + |___.'___/`. | ---_____| + |_______|__|_______|_________________| + | >|Sl|< |<------ Sr ----->|endW + | | |endSl |beginSr |endSr + |beginW | |endlW + mult[0] |beginSl mult[n] + + <-------------- lW -----------------> + |<--W-->| +: .............. ___ | | +: .''' |`/ \ | | +:.....''' |/`....\|...| +:.........................|___|___|___| + |Sl |Sr |endW + | | |endSr + | |beginSr + | |endSl + |beginSl + |beginW +*/ + +/* block abstraction setup *********************************************/ + +#ifndef WORD_ALIGN +#define WORD_ALIGN 8 +#endif + +int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ + memset(vb,0,sizeof(*vb)); + vb->vd=v; + vb->localalloc=0; + vb->localstore=NULL; + + return(0); +} + +void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ + bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); + if(bytes+vb->localtop>vb->localalloc){ + /* can't just _ogg_realloc... there are outstanding pointers */ + if(vb->localstore){ + struct alloc_chain *link=(struct alloc_chain *)_ogg_malloc(sizeof(*link)); + vb->totaluse+=vb->localtop; + link->next=vb->reap; + link->ptr=vb->localstore; + vb->reap=link; + } + /* highly conservative */ + vb->localalloc=bytes; + vb->localstore=_ogg_malloc(vb->localalloc); + vb->localtop=0; + } + { + void *ret=(void *)(((char *)vb->localstore)+vb->localtop); + vb->localtop+=bytes; + return ret; + } +} + +/* reap the chain, pull the ripcord */ +void _vorbis_block_ripcord(vorbis_block *vb){ + /* reap the chain */ + struct alloc_chain *reap=vb->reap; + while(reap){ + struct alloc_chain *next=reap->next; + _ogg_free(reap->ptr); + memset(reap,0,sizeof(*reap)); + _ogg_free(reap); + reap=next; + } + /* consolidate storage */ + if(vb->totaluse){ + vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); + vb->localalloc+=vb->totaluse; + vb->totaluse=0; + } + + /* pull the ripcord */ + vb->localtop=0; + vb->reap=NULL; +} + +int vorbis_block_clear(vorbis_block *vb){ + _vorbis_block_ripcord(vb); + if(vb->localstore)_ogg_free(vb->localstore); + + memset(vb,0,sizeof(*vb)); + return(0); +} + +static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ + int i; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + private_state *b=NULL; + + if(ci==NULL) return 1; + + memset(v,0,sizeof(*v)); + b=(private_state *)(v->backend_state=_ogg_calloc(1,sizeof(*b))); + + v->vi=vi; + b->modebits=ilog(ci->modes); + + /* Vorbis I uses only window type 0 */ + b->window[0]=_vorbis_window(0,ci->blocksizes[0]/2); + b->window[1]=_vorbis_window(0,ci->blocksizes[1]/2); + + /* finish the codebooks */ + if(!ci->fullbooks){ + ci->fullbooks=(codebook *)_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); + for(i=0;ibooks;i++){ + if(ci->book_param[i]==NULL) + goto abort_books; + if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) + goto abort_books; + /* decode codebooks are now standalone after init */ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + + v->pcm_storage=ci->blocksizes[1]; + v->pcm=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcm)); + v->pcmret=(ogg_int32_t **)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); + for(i=0;ichannels;i++) + v->pcm[i]=(ogg_int32_t *)_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); + + /* all 1 (large block) or 0 (small block) */ + /* explicitly set for the sake of clarity */ + v->lW=0; /* previous window size */ + v->W=0; /* current window size */ + + /* initialize all the mapping/backend lookups */ + b->mode=(vorbis_look_mapping **)_ogg_calloc(ci->modes,sizeof(*b->mode)); + for(i=0;imodes;i++){ + int mapnum=ci->mode_param[i]->mapping; + int maptype=ci->map_type[mapnum]; + b->mode[i]=_mapping_P[maptype]->look(v,ci->mode_param[i], + ci->map_param[mapnum]); + } + return 0; +abort_books: + for(i=0;ibooks;i++){ + if(ci->book_param[i]!=NULL){ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + vorbis_dsp_clear(v); + return -1; +} + +int vorbis_synthesis_restart(vorbis_dsp_state *v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci; + + if(!v->backend_state)return -1; + if(!vi)return -1; + ci=vi->codec_setup; + if(!ci)return -1; + + v->centerW=ci->blocksizes[1]/2; + v->pcm_current=v->centerW; + + v->pcm_returned=-1; + v->granulepos=-1; + v->sequence=-1; + ((private_state *)(v->backend_state))->sample_count=-1; + + return(0); +} + +int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ + if(_vds_init(v,vi))return 1; + vorbis_synthesis_restart(v); + + return 0; +} + +void vorbis_dsp_clear(vorbis_dsp_state *v){ + int i; + if(v){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info *)(vi?vi->codec_setup:NULL); + private_state *b=(private_state *)v->backend_state; + + if(v->pcm){ + for(i=0;ichannels;i++) + if(v->pcm[i])_ogg_free(v->pcm[i]); + _ogg_free(v->pcm); + if(v->pcmret)_ogg_free(v->pcmret); + } + + /* free mode lookups; these are actually vorbis_look_mapping structs */ + if(ci){ + for(i=0;imodes;i++){ + int mapnum=ci->mode_param[i]->mapping; + int maptype=ci->map_type[mapnum]; + if(b && b->mode)_mapping_P[maptype]->free_look(b->mode[i]); + } + } + + if(b){ + if(b->mode)_ogg_free(b->mode); + _ogg_free(b); + } + + memset(v,0,sizeof(*v)); + } +} + +/* Unlike in analysis, the window is only partially applied for each + block. The time domain envelope is not yet handled at the point of + calling (as it relies on the previous block). */ + +int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ + vorbis_info *vi=v->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + private_state *b=v->backend_state; + int i,j; + + if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); + + v->lW=v->W; + v->W=vb->W; + v->nW=-1; + + if((v->sequence==-1)|| + (v->sequence+1 != vb->sequence)){ + v->granulepos=-1; /* out of sequence; lose count */ + b->sample_count=-1; + } + + v->sequence=vb->sequence; + + if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly + was called on block */ + int n=ci->blocksizes[v->W]/2; + int n0=ci->blocksizes[0]/2; + int n1=ci->blocksizes[1]/2; + + int thisCenter; + int prevCenter; + + if(v->centerW){ + thisCenter=n1; + prevCenter=0; + }else{ + thisCenter=0; + prevCenter=n1; + } + + /* v->pcm is now used like a two-stage double buffer. We don't want + to have to constantly shift *or* adjust memory usage. Don't + accept a new block until the old is shifted out */ + + /* overlap/add PCM */ + + for(j=0;jchannels;j++){ + /* the overlap/add section */ + if(v->lW){ + if(v->W){ + /* large/large */ + ogg_int32_t *pcm=v->pcm[j]+prevCenter; + ogg_int32_t *p=vb->pcm[j]; + for(i=0;ipcm[j]+prevCenter+n1/2-n0/2; + ogg_int32_t *p=vb->pcm[j]; + for(i=0;iW){ + /* small/large */ + ogg_int32_t *pcm=v->pcm[j]+prevCenter; + ogg_int32_t *p=vb->pcm[j]+n1/2-n0/2; + for(i=0;ipcm[j]+prevCenter; + ogg_int32_t *p=vb->pcm[j]; + for(i=0;ipcm[j]+thisCenter; + ogg_int32_t *p=vb->pcm[j]+n; + for(i=0;icenterW) + v->centerW=0; + else + v->centerW=n1; + + /* deal with initial packet state; we do this using the explicit + pcm_returned==-1 flag otherwise we're sensitive to first block + being short or long */ + + if(v->pcm_returned==-1){ + v->pcm_returned=thisCenter; + v->pcm_current=thisCenter; + }else{ + v->pcm_returned=prevCenter; + v->pcm_current=prevCenter+ + ci->blocksizes[v->lW]/4+ + ci->blocksizes[v->W]/4; + } + + } + + /* track the frame number... This is for convenience, but also + making sure our last packet doesn't end with added padding. If + the last packet is partial, the number of samples we'll have to + return will be past the vb->granulepos. + + This is not foolproof! It will be confused if we begin + decoding at the last page after a seek or hole. In that case, + we don't have a starting point to judge where the last frame + is. For this reason, vorbisfile will always try to make sure + it reads the last two marked pages in proper sequence */ + + if(b->sample_count==-1){ + b->sample_count=0; + }else{ + b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; + } + + if(v->granulepos==-1){ + if(vb->granulepos!=-1){ /* only set if we have a position to set to */ + + v->granulepos=vb->granulepos; + + /* is this a short page? */ + if(b->sample_count>v->granulepos){ + /* corner case; if this is both the first and last audio page, + then spec says the end is cut, not beginning */ + long extra=b->sample_count-vb->granulepos; + + /* we use ogg_int64_t for granule positions because a + uint64 isn't universally available. Unfortunately, + that means granposes can be 'negative' and result in + extra being negative */ + if(extra<0) + extra=0; + + if(vb->eofflag){ + /* trim the end */ + /* no preceeding granulepos; assume we started at zero (we'd + have to in a short single-page stream) */ + /* granulepos could be -1 due to a seek, but that would result + in a long coun`t, not short count */ + + /* Guard against corrupt/malicious frames that set EOP and + a backdated granpos; don't rewind more samples than we + actually have */ + if(extra > v->pcm_current - v->pcm_returned) + extra = v->pcm_current - v->pcm_returned; + + v->pcm_current-=extra; + }else{ + /* trim the beginning */ + v->pcm_returned+=extra; + if(v->pcm_returned>v->pcm_current) + v->pcm_returned=v->pcm_current; + } + + } + + } + }else{ + v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; + if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ + + if(v->granulepos>vb->granulepos){ + long extra=v->granulepos-vb->granulepos; + + if(extra) + if(vb->eofflag){ + /* partial last frame. Strip the extra samples off */ + + /* Guard against corrupt/malicious frames that set EOP and + a backdated granpos; don't rewind more samples than we + actually have */ + if(extra > v->pcm_current - v->pcm_returned) + extra = v->pcm_current - v->pcm_returned; + + /* we use ogg_int64_t for granule positions because a + uint64 isn't universally available. Unfortunately, + that means granposes can be 'negative' and result in + extra being negative */ + if(extra<0) + extra=0; + + v->pcm_current-=extra; + + } /* else {Shouldn't happen *unless* the bitstream is out of + spec. Either way, believe the bitstream } */ + } /* else {Shouldn't happen *unless* the bitstream is out of + spec. Either way, believe the bitstream } */ + v->granulepos=vb->granulepos; + } + } + + /* Update, cleanup */ + + if(vb->eofflag)v->eofflag=1; + return(0); +} + +/* pcm==NULL indicates we just want the pending samples, no more */ +int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm){ + vorbis_info *vi=v->vi; + if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ + if(pcm){ + int i; + for(i=0;ichannels;i++) + v->pcmret[i]=v->pcm[i]+v->pcm_returned; + *pcm=v->pcmret; + } + return(v->pcm_current-v->pcm_returned); + } + return(0); +} + +int vorbis_synthesis_read(vorbis_dsp_state *v,int bytes){ + if(bytes && v->pcm_returned+bytes>v->pcm_current)return(OV_EINVAL); + v->pcm_returned+=bytes; + return(0); +} + diff --git a/Mednafen/mednafen/tremor/block.h b/Mednafen/mednafen/tremor/block.h new file mode 100644 index 0000000000..5e193543d4 --- /dev/null +++ b/Mednafen/mednafen/tremor/block.h @@ -0,0 +1,24 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2008 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: shared block functions + + ********************************************************************/ + +#ifndef _V_BLOCK_ +#define _V_BLOCK_ + +extern void _vorbis_block_ripcord(vorbis_block *vb); +extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes); + +#endif diff --git a/Mednafen/mednafen/tremor/codebook.c b/Mednafen/mednafen/tremor/codebook.c new file mode 100644 index 0000000000..338899d20a --- /dev/null +++ b/Mednafen/mednafen/tremor/codebook.c @@ -0,0 +1,391 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic codebook pack/unpack/code/decode operations + + ********************************************************************/ + +#include +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codebook.h" +#include "misc.h" + +/* unpacks a codebook from the packet buffer into the codebook struct, + readies the codebook auxiliary structures for decode *************/ +static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){ + long i,j; + static_codebook *s=_ogg_calloc(1,sizeof(*s)); + + /* make sure alignment is correct */ + if(oggpack_read(opb,24)!=0x564342)goto _eofout; + + /* first the basic parameters */ + s->dim=oggpack_read(opb,16); + s->entries=oggpack_read(opb,24); + if(s->entries==-1)goto _eofout; + + if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout; + + /* codeword ordering.... length ordered or unordered? */ + switch((int)oggpack_read(opb,1)){ + case 0:{ + long unused; + /* allocated but unused entries? */ + unused=oggpack_read(opb,1); + if((s->entries*(unused?1:5)+7)>>3>opb->storage-oggpack_bytes(opb)) + goto _eofout; + /* unordered */ + s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); + + /* allocated but unused entries? */ + if(unused){ + /* yes, unused entries */ + + for(i=0;ientries;i++){ + if(oggpack_read(opb,1)){ + long num=oggpack_read(opb,5); + if(num==-1)goto _eofout; + s->lengthlist[i]=num+1; + }else + s->lengthlist[i]=0; + } + }else{ + /* all entries used; no tagging */ + for(i=0;ientries;i++){ + long num=oggpack_read(opb,5); + if(num==-1)goto _eofout; + s->lengthlist[i]=num+1; + } + } + + break; + } + case 1: + /* ordered */ + { + long length=oggpack_read(opb,5)+1; + if(length==0)goto _eofout; + s->lengthlist=(long *)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); + + for(i=0;ientries;){ + long num=oggpack_read(opb,_ilog(s->entries-i)); + if(num==-1)goto _eofout; + if(length>32 || num>s->entries-i || + (num>0 && (num-1)>>(length>>1)>>((length+1)>>1))>0){ + goto _errout; + } + for(j=0;jlengthlist[i]=length; + length++; + } + } + break; + default: + /* EOF */ + goto _eofout; + } + + /* Do we have a mapping to unpack? */ + switch((s->maptype=oggpack_read(opb,4))){ + case 0: + /* no mapping */ + break; + case 1: case 2: + /* implicitly populated value mapping */ + /* explicitly populated value mapping */ + + s->q_min=oggpack_read(opb,32); + s->q_delta=oggpack_read(opb,32); + s->q_quant=oggpack_read(opb,4)+1; + s->q_sequencep=oggpack_read(opb,1); + if(s->q_sequencep==-1)goto _eofout; + + { + int quantvals=0; + switch(s->maptype){ + case 1: + quantvals=(s->dim==0?0:_book_maptype1_quantvals(s)); + break; + case 2: + quantvals=s->entries*s->dim; + break; + } + + /* quantized values */ + if((quantvals*s->q_quant+7)>>3>opb->storage-oggpack_bytes(opb)) + goto _eofout; + s->quantlist=(long *)_ogg_malloc(sizeof(*s->quantlist)*quantvals); + for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); + + if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; + } + break; + default: + goto _errout; + } + + /* all set */ + return(s); + + _errout: + _eofout: + vorbis_staticbook_destroy(s); + return(NULL); +} + +/* the 'eliminate the decode tree' optimization actually requires the + codewords to be MSb first, not LSb. This is an annoying inelegancy + (and one of the first places where carefully thought out design + turned out to be wrong; Vorbis II and future Ogg codecs should go + to an MSb bitpacker), but not actually the huge hit it appears to + be. The first-stage decode table catches most words so that + bitreverse is not in the main execution path. */ + +static ogg_uint32_t bitreverse(ogg_uint32_t x){ + x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); + x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); + x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); + x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); + return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); +} + +STIN long decode_packed_entry_number(codebook *book, + oggpack_buffer *b){ + int read=book->dec_maxlength; + long lo,hi; + long lok = oggpack_look(b,book->dec_firsttablen); + + if (lok >= 0) { + long entry = book->dec_firsttable[lok]; + if(entry&0x80000000UL){ + lo=(entry>>15)&0x7fff; + hi=book->used_entries-(entry&0x7fff); + }else{ + oggpack_adv(b, book->dec_codelengths[entry-1]); + return(entry-1); + } + }else{ + lo=0; + hi=book->used_entries; + } + + lok = oggpack_look(b, read); + + while(lok<0 && read>1) + lok = oggpack_look(b, --read); + + if(lok<0){ + oggpack_adv(b,1); /* force eop */ + return -1; + } + + /* bisect search for the codeword in the ordered list */ + { + ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); + + while(hi-lo>1){ + long p=(hi-lo)>>1; + long test=book->codelist[lo+p]>testword; + lo+=p&(test-1); + hi-=p&(-test); + } + + if(book->dec_codelengths[lo]<=read){ + oggpack_adv(b, book->dec_codelengths[lo]); + return(lo); + } + } + + oggpack_adv(b, read+1); + return(-1); +} + +/* Decode side is specced and easier, because we don't need to find + matches using different criteria; we simply read and map. There are + two things we need to do 'depending': + + We may need to support interleave. We don't really, but it's + convenient to do it here rather than rebuild the vector later. + + Cascades may be additive or multiplicitive; this is not inherent in + the codebook, but set in the code using the codebook. Like + interleaving, it's easiest to do it here. + addmul==0 -> declarative (set the value) + addmul==1 -> additive + addmul==2 -> multiplicitive */ + +/* returns the [original, not compacted] entry number or -1 on eof *********/ +long vorbis_book_decode(codebook *book, oggpack_buffer *b){ + if(book->used_entries>0){ + long packed_entry=decode_packed_entry_number(book,b); + if(packed_entry>=0) + return(book->dec_index[packed_entry]); + } + + /* if there's no dec_index, the codebook unpacking isn't collapsed */ + return(-1); +} + +/* returns 0 on OK or -1 on eof *************************************/ +/* decode vector / dim granularity gaurding is done in the upper layer */ +long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, + oggpack_buffer *b,int n,int point){ + if(book->used_entries>0){ + int step=n/book->dim; + long *entry = (long *)alloca(sizeof(*entry)*step); + ogg_int32_t **t = (ogg_int32_t **)alloca(sizeof(*t)*step); + int i,j,o; + int shift=point-book->binarypoint; + + if(shift>=0){ + for (i = 0; i < step; i++) { + entry[i]=decode_packed_entry_number(book,b); + if(entry[i]==-1)return(-1); + t[i] = book->valuelist+entry[i]*book->dim; + } + for(i=0,o=0;idim;i++,o+=step) + for (j=0;j>shift; + }else{ + for (i = 0; i < step; i++) { + entry[i]=decode_packed_entry_number(book,b); + if(entry[i]==-1)return(-1); + t[i] = book->valuelist+entry[i]*book->dim; + } + for(i=0,o=0;idim;i++,o+=step) + for (j=0;jused_entries>0){ + int i,j,entry; + ogg_int32_t *t; + int shift=point-book->binarypoint; + + if(shift>=0){ + for(i=0;ivaluelist+entry*book->dim; + for (j=0;jdim;) + a[i++]+=t[j++]>>shift; + } + }else{ + for(i=0;ivaluelist+entry*book->dim; + for (j=0;jdim;) + a[i++]+=t[j++]<<-shift; + } + } + } + return(0); +} + +/* unlike the others, we guard against n not being an integer number + of internally rather than in the upper layer (called only by + floor0) */ +long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, + oggpack_buffer *b,int n,int point){ + if(book->used_entries>0){ + int i,j,entry; + ogg_int32_t *t; + int shift=point-book->binarypoint; + + if(shift>=0){ + + for(i=0;ivaluelist+entry*book->dim; + for (j=0;idim;){ + a[i++]=t[j++]>>shift; + } + } + }else{ + + for(i=0;ivaluelist+entry*book->dim; + for (j=0;idim;){ + a[i++]=t[j++]<<-shift; + } + } + } + }else{ + + int i,j; + for(i=0;iused_entries>0){ + long i,j,entry; + int chptr=0; + int shift=point-book->binarypoint; + + if(shift>=0){ + + for(i=offset;ivaluelist+entry*book->dim; + for (j=0;jdim;j++){ + a[chptr++][i]+=t[j]>>shift; + if(chptr==ch){ + chptr=0; + i++; + } + } + } + } + }else{ + + for(i=offset;ivaluelist+entry*book->dim; + for (j=0;jdim;j++){ + a[chptr++][i]+=t[j]<<-shift; + if(chptr==ch){ + chptr=0; + i++; + } + } + } + } + } + } + return(0); +} diff --git a/Mednafen/mednafen/tremor/codebook.h b/Mednafen/mednafen/tremor/codebook.h new file mode 100644 index 0000000000..c6f46cdb25 --- /dev/null +++ b/Mednafen/mednafen/tremor/codebook.h @@ -0,0 +1,101 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + + ********************************************************************/ + +#ifndef _V_CODEBOOK_H_ +#define _V_CODEBOOK_H_ + +#include "ogg.h" + +/* This structure encapsulates huffman and VQ style encoding books; it + doesn't do anything specific to either. + + valuelist/quantlist are nonNULL (and q_* significant) only if + there's entry->value mapping to be done. + + If encode-side mapping must be done (and thus the entry needs to be + hunted), the auxiliary encode pointer will point to a decision + tree. This is true of both VQ and huffman, but is mostly useful + with VQ. + +*/ + +typedef struct static_codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long *lengthlist; /* codeword lengths in bits */ + + /* mapping ***************************************************************/ + int maptype; /* 0=none + 1=implicitly populated values from map column + 2=listed arbitrary values */ + + /* The below does a linear, single monotonic sequence mapping. */ + long q_min; /* packed 32 bit float; quant value 0 maps to minval */ + long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ + int q_quant; /* bits: 0 < quant <= 16 */ + int q_sequencep; /* bitflag */ + + long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map + map == 2: list of dim*entries quantized entry vals + */ +} static_codebook; + +typedef struct codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long used_entries; /* populated codebook entries */ + + /* the below are ordered by bitreversed codeword and only used + entries are populated */ + int binarypoint; + ogg_int32_t *valuelist; /* list of dim*entries actual entry values */ + ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ + + int *dec_index; + char *dec_codelengths; + ogg_uint32_t *dec_firsttable; + int dec_firsttablen; + int dec_maxlength; + + long q_min; /* packed 32 bit float; quant value 0 maps to minval */ + long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ + +} codebook; + +extern void vorbis_staticbook_destroy(static_codebook *b); +extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); + +extern void vorbis_book_clear(codebook *b); +extern long _book_maptype1_quantvals(const static_codebook *b); + +extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b); + +extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); +extern long vorbis_book_decodevs_add(codebook *book, ogg_int32_t *a, + oggpack_buffer *b,int n,int point); +extern long vorbis_book_decodev_set(codebook *book, ogg_int32_t *a, + oggpack_buffer *b,int n,int point); +extern long vorbis_book_decodev_add(codebook *book, ogg_int32_t *a, + oggpack_buffer *b,int n,int point); +extern long vorbis_book_decodevv_add(codebook *book, ogg_int32_t **a, + long off,int ch, + oggpack_buffer *b,int n,int point); + +extern int _ilog(unsigned int v); + + +#endif diff --git a/Mednafen/mednafen/tremor/codec_internal.h b/Mednafen/mednafen/tremor/codec_internal.h new file mode 100644 index 0000000000..3ca7f54724 --- /dev/null +++ b/Mednafen/mednafen/tremor/codec_internal.h @@ -0,0 +1,92 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis codec headers + + ********************************************************************/ + +#ifndef _V_CODECI_H_ +#define _V_CODECI_H_ + +#include "codebook.h" + +typedef void vorbis_look_mapping; +typedef void vorbis_look_floor; +typedef void vorbis_look_residue; +typedef void vorbis_look_transform; + +/* mode ************************************************************/ +typedef struct { + int blockflag; + int windowtype; + int transformtype; + int mapping; +} vorbis_info_mode; + +typedef void vorbis_info_floor; +typedef void vorbis_info_residue; +typedef void vorbis_info_mapping; + +typedef struct private_state { + /* local lookup storage */ + const void *window[2]; + + /* backend lookups are tied to the mode, not the backend or naked mapping */ + int modebits; + vorbis_look_mapping **mode; + + ogg_int64_t sample_count; + +} private_state; + +/* codec_setup_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). +*********************************************************************/ + +typedef struct codec_setup_info { + + /* Vorbis supports only short and long blocks, but allows the + encoder to choose the sizes */ + + long blocksizes[2]; + + /* modes are the primary means of supporting on-the-fly different + blocksizes, different channel mappings (LR or M/A), + different residue backends, etc. Each mode consists of a + blocksize flag and a mapping (along with the mapping setup */ + + int modes; + int maps; + int times; + int floors; + int residues; + int books; + + vorbis_info_mode *mode_param[64]; + int map_type[64]; + vorbis_info_mapping *map_param[64]; + int time_type[64]; + int floor_type[64]; + vorbis_info_floor *floor_param[64]; + int residue_type[64]; + vorbis_info_residue *residue_param[64]; + static_codebook *book_param[256]; + codebook *fullbooks; + + int passlimit[32]; /* iteration limit per couple/quant pass */ + int coupling_passes; +} codec_setup_info; + +#endif diff --git a/Mednafen/mednafen/tremor/configure.in b/Mednafen/mednafen/tremor/configure.in new file mode 100644 index 0000000000..e7f5690029 --- /dev/null +++ b/Mednafen/mednafen/tremor/configure.in @@ -0,0 +1,146 @@ +dnl Process this file with autoconf to produce a configure script + +dnl ------------------------------------------------ +dnl Initialization and Versioning +dnl ------------------------------------------------ + +AC_INIT(mdct.c) + +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + +AM_CONFIG_HEADER([config.h]) + +AM_INIT_AUTOMAKE(libvorbisidec,1.2.1) + +dnl AM_MAINTAINER_MODE only provides the option to configure to enable it +AM_MAINTAINER_MODE + +dnl Library versioning + +V_LIB_CURRENT=1 +V_LIB_REVISION=3 +V_LIB_AGE=0 +AC_SUBST(V_LIB_CURRENT) +AC_SUBST(V_LIB_REVISION) +AC_SUBST(V_LIB_AGE) + +dnl -------------------------------------------------- +dnl Check for programs +dnl -------------------------------------------------- + +dnl save $CFLAGS since AC_PROG_CC likes to insert "-g -O2" +dnl if $CFLAGS is blank +cflags_save="$CFLAGS" +AC_PROG_CC +AC_PROG_CPP +CFLAGS="$cflags_save" + +AM_PROG_LIBTOOL + +dnl -------------------------------------------------- +dnl Set build flags based on environment +dnl -------------------------------------------------- + +dnl Set some target options + +cflags_save="$CFLAGS" +ldflags_save="$LDFLAGS" +if test -z "$GCC"; then + case $host in + arm-*-*) + DEBUG="-g -D_ARM_ASSEM_" + CFLAGS="-O -D_ARM_ASSEM_" + PROFILE="-p -g -O -D_ARM_ASSEM_" ;; + *) + DEBUG="-g" + CFLAGS="-O" + PROFILE="-g -p" ;; + esac +else + + case $host in + arm-*-*) + DEBUG="-g -Wall -D__NO_MATH_INLINES -fsigned-char -D_ARM_ASSEM_" + CFLAGS="-O2 -D_ARM_ASSEM_ -fsigned-char" + PROFILE="-W -pg -g -O2 -D_ARM_ASSEM_ -fsigned-char -fno-inline-functions";; + + *) + DEBUG="-g -Wall -D__NO_MATH_INLINES -fsigned-char" + CFLAGS="-O2 -Wall -fsigned-char" + PROFILE="-Wall -pg -g -O2 -fsigned-char -fno-inline-functions";; + esac +fi +CFLAGS="$CFLAGS $cflags_save -D_REENTRANT" +LDFLAGS="$LDFLAGS $ldflags_save" + + +# Test whenever ld supports -version-script +AC_PROG_LD +AC_PROG_LD_GNU +if test "x$lt_cv_prog_gnu_ld" = "xyes"; then + SHLIB_VERSION_ARG="-Wl,--version-script=Version_script" + LDFLAGS="$LDFLAGS $SHLIB_VERSION_ARG" +fi + +dnl -------------------------------------------------- +dnl Options +dnl -------------------------------------------------- + +AC_ARG_ENABLE( + low-accuracy, + [ --enable-low-accuracy enable 32 bit only multiply operations], + CFLAGS="$CFLAGS -D_LOW_ACCURACY_" +) + +dnl -------------------------------------------------- +dnl Check for headers +dnl -------------------------------------------------- + +AC_CHECK_HEADER(memory.h,CFLAGS="$CFLAGS -DUSE_MEMORY_H",:) + +dnl -------------------------------------------------- +dnl Check for typedefs, structures, etc +dnl -------------------------------------------------- + +dnl none + +dnl -------------------------------------------------- +dnl Check for libraries +dnl -------------------------------------------------- + +PKG_PROG_PKG_CONFIG + +HAVE_OGG=no +if test "x$PKG_CONFIG" != "x" +then + PKG_CHECK_MODULES(OGG, ogg >= 1.0, HAVE_OGG=yes, HAVE_OGG=no) +fi +if test "x$HAVE_OGG" = "xno" +then + dnl fall back to the old school test + XIPH_PATH_OGG(, AC_MSG_ERROR(must have Ogg installed!)) + libs_save=$LIBS + LIBS="$OGG_LIBS" + AC_CHECK_FUNC(oggpack_writealign, , AC_MSG_ERROR(Ogg >= 1.0 required !)) + LIBS=$libs_save +fi + +dnl -------------------------------------------------- +dnl Check for library functions +dnl -------------------------------------------------- + +AC_FUNC_ALLOCA +AC_FUNC_MEMCMP + +dnl -------------------------------------------------- +dnl Do substitutions +dnl -------------------------------------------------- + +LIBS="$LIBS" + +AC_SUBST(LIBS) +AC_SUBST(DEBUG) +AC_SUBST(PROFILE) + +AC_OUTPUT(Makefile Version_script vorbisidec.pc) diff --git a/Mednafen/mednafen/tremor/floor0.c b/Mednafen/mednafen/tremor/floor0.c new file mode 100644 index 0000000000..1ece59d461 --- /dev/null +++ b/Mednafen/mednafen/tremor/floor0.c @@ -0,0 +1,439 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: floor backend 0 implementation + + ********************************************************************/ + +#include +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "block.h" + +#define LSP_FRACBITS 14 + +typedef struct { + long n; + int ln; + int m; + int *linearmap; + + vorbis_info_floor0 *vi; + ogg_int32_t *lsp_look; + +} vorbis_look_floor0; + +/*************** LSP decode ********************/ + +#include "lsp_lookup.h" + +/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in + 16.16 format + returns in m.8 format */ + +static long ADJUST_SQRT2[2]={8192,5792}; +STIN ogg_int32_t vorbis_invsqlook_i(long a,long e){ + long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); + long d=a&INVSQ_LOOKUP_I_MASK; /* 0.10 */ + long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ + ((INVSQ_LOOKUP_IDel[i]*d)>>INVSQ_LOOKUP_I_SHIFT); /* result 1.16 */ + val*=ADJUST_SQRT2[e&1]; + e=(e>>1)+21; + return(val>>e); +} + +/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ +/* a is in n.12 format */ +STIN ogg_int32_t vorbis_fromdBlook_i(long a){ + int i=(-a)>>(12-FROMdB2_SHIFT); + if(i<0) return 0x7fffffff; + if(i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT] * FROMdB2_LOOKUP[i&FROMdB2_MASK]; +} + +/* interpolated lookup based cos function, domain 0 to PI only */ +/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ +STIN ogg_int32_t vorbis_coslook_i(long a){ + int i=a>>COS_LOOKUP_I_SHIFT; + int d=a&COS_LOOKUP_I_MASK; + return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> + COS_LOOKUP_I_SHIFT); +} + +/* interpolated lookup based cos function */ +/* a is in 0.16 format, where 0==0, 2^^16==PI, return .LSP_FRACBITS */ +STIN ogg_int32_t vorbis_coslook2_i(long a){ + a=a&0x1ffff; + + if(a>0x10000)a=0x20000-a; + { + int i=a>>COS_LOOKUP_I_SHIFT; + int d=a&COS_LOOKUP_I_MASK; + a=((COS_LOOKUP_I[i]<> + (COS_LOOKUP_I_SHIFT-LSP_FRACBITS+14); + } + + return(a); +} + +static const int barklook[28]={ + 0,100,200,301, 405,516,635,766, + 912,1077,1263,1476, 1720,2003,2333,2721, + 3184,3742,4428,5285, 6376,7791,9662,12181, + 15624,20397,27087,36554 +}; + +/* used in init only; interpolate the long way */ +STIN ogg_int32_t toBARK(int n){ + int i; + for(i=0;i<27;i++) + if(n>=barklook[i] && n>10)*0x517d)>>14; +#endif + + /* safeguard against a malicious stream */ + if(val<0 || (val>>COS_LOOKUP_I_SHIFT)>=COS_LOOKUP_I_SZ){ + memset(curve,0,sizeof(*curve)*n); + return; + } + + ilsp[i]=vorbis_coslook_i(val); + } + + i=0; + while(i>16); + qi=((qi*qi)>>16); + + if(m&1){ + qexp= qexp*2-28*((m+1)>>1)+m; + pi*=(1<<14)-((wi*wi)>>14); + qi+=pi>>14; + }else{ + qexp= qexp*2-13*m; + + pi*=(1<<14)-wi; + qi*=(1<<14)+wi; + + qi=(qi+pi)>>14; + } + + if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ + qi>>=1; qexp++; + }else + lsp_norm_asm(&qi,&qexp); + +#else + + j=1; + if(m>1){ + qi*=labs(ilsp[0]-wi); + pi*=labs(ilsp[1]-wi); + + for(j+=2;j>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + qi=(qi>>shift)*labs(ilsp[j-1]-wi); + pi=(pi>>shift)*labs(ilsp[j]-wi); + qexp+=shift; + } + } + if(!(shift=MLOOP_1[(pi|qi)>>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + + /* pi,qi normalized collectively, both tracked using qexp */ + + if(m&1){ + /* odd order filter; slightly assymetric */ + /* the last coefficient */ + qi=(qi>>shift)*labs(ilsp[j-1]-wi); + pi=(pi>>shift)<<14; + qexp+=shift; + + if(!(shift=MLOOP_1[(pi|qi)>>25])) + if(!(shift=MLOOP_2[(pi|qi)>>19])) + shift=MLOOP_3[(pi|qi)>>16]; + + pi>>=shift; + qi>>=shift; + qexp+=shift-14*((m+1)>>1); + + pi=((pi*pi)>>16); + qi=((qi*qi)>>16); + qexp=qexp*2+m; + + pi*=(1<<14)-((wi*wi)>>14); + qi+=pi>>14; + + }else{ + /* even order filter; still symmetric */ + + /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't + worth tracking step by step */ + + pi>>=shift; + qi>>=shift; + qexp+=shift-7*m; + + pi=((pi*pi)>>16); + qi=((qi*qi)>>16); + qexp=qexp*2+m; + + pi*=(1<<14)-wi; + qi*=(1<<14)+wi; + qi=(qi+pi)>>14; + + } + + + /* we've let the normalization drift because it wasn't important; + however, for the lookup, things must be normalized again. We + need at most one right shift or a number of left shifts */ + + if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ + qi>>=1; qexp++; + }else + while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ + qi<<=1; qexp--; + } + +#endif + + amp=vorbis_fromdBlook_i(ampi* /* n.4 */ + vorbis_invsqlook_i(qi,qexp)- + /* m.8, m+n<=8 */ + ampoffseti); /* 8.12[0] */ + +#ifdef _LOW_ACCURACY_ + amp>>=9; +#endif + curve[i]= MULT31_SHIFT15(curve[i],amp); + while(map[++i]==k) curve[i]= MULT31_SHIFT15(curve[i],amp); + } +} + +/*************** vorbis decode glue ************/ + +static void floor0_free_info(vorbis_info_floor *i){ + vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void floor0_free_look(vorbis_look_floor *i){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + if(look){ + + if(look->linearmap)_ogg_free(look->linearmap); + if(look->lsp_look)_ogg_free(look->lsp_look); + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int j; + + vorbis_info_floor0 *info=(vorbis_info_floor0 *)_ogg_malloc(sizeof(*info)); + info->order=oggpack_read(opb,8); + info->rate=oggpack_read(opb,16); + info->barkmap=oggpack_read(opb,16); + info->ampbits=oggpack_read(opb,6); + info->ampdB=oggpack_read(opb,8); + info->numbooks=oggpack_read(opb,4)+1; + + if(info->order<1)goto err_out; + if(info->rate<1)goto err_out; + if(info->barkmap<1)goto err_out; + if(info->numbooks<1)goto err_out; + + for(j=0;jnumbooks;j++){ + info->books[j]=oggpack_read(opb,8); + if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; + if(ci->book_param[info->books[j]]->maptype==0)goto err_out; + if(ci->book_param[info->books[j]]->dim<1)goto err_out; + } + return(info); + + err_out: + floor0_free_info(info); + return(NULL); +} + +/* initialize Bark scale and normalization lookups. We could do this + with static tables, but Vorbis allows a number of possible + combinations, so it's best to do it computationally. + + The below is authoritative in terms of defining scale mapping. + Note that the scale depends on the sampling rate as well as the + linear block and mapping sizes */ + +static vorbis_look_floor *floor0_look (vorbis_dsp_state *vd,vorbis_info_mode *mi, + vorbis_info_floor *i){ + int j; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; + vorbis_look_floor0 *look=(vorbis_look_floor0 *)_ogg_calloc(1,sizeof(*look)); + look->m=info->order; + look->n=ci->blocksizes[mi->blockflag]/2; + look->ln=info->barkmap; + look->vi=info; + + /* the mapping from a linear scale to a smaller bark scale is + straightforward. We do *not* make sure that the linear mapping + does not skip bark-scale bins; the decoder simply skips them and + the encoder may do what it wishes in filling them. They're + necessary in some mapping combinations to keep the scale spacing + accurate */ + look->linearmap=(int *)_ogg_malloc((look->n+1)*sizeof(*look->linearmap)); + for(j=0;jn;j++){ + + int val=(look->ln* + ((toBARK(info->rate/2*j/look->n)<<11)/toBARK(info->rate/2)))>>11; + + if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ + look->linearmap[j]=val; + } + look->linearmap[j]=-1; + + look->lsp_look=(ogg_int32_t *)_ogg_malloc(look->ln*sizeof(*look->lsp_look)); + for(j=0;jln;j++) + look->lsp_look[j]=vorbis_coslook2_i(0x10000*j/look->ln); + + return look; +} + +static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + vorbis_info_floor0 *info=look->vi; + int j,k; + + int ampraw=oggpack_read(&vb->opb,info->ampbits); + if(ampraw>0){ /* also handles the -1 out of data case */ + long maxval=(1<ampbits)-1; + int amp=((ampraw*info->ampdB)<<4)/maxval; + int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks)); + + if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + codebook *b=ci->fullbooks+info->books[booknum]; + ogg_int32_t last=0; + ogg_int32_t *lsp=(ogg_int32_t *)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+1)); + + if(vorbis_book_decodev_set(b,lsp,&vb->opb,look->m,-24)==-1)goto eop; + for(j=0;jm;){ + for(k=0;jm && kdim;k++,j++)lsp[j]+=last; + last=lsp[j-1]; + } + + lsp[look->m]=amp; + return(lsp); + } + } + eop: + return(NULL); +} + +static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, + void *memo,ogg_int32_t *out){ + vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; + vorbis_info_floor0 *info=look->vi; + + if(memo){ + ogg_int32_t *lsp=(ogg_int32_t *)memo; + ogg_int32_t amp=lsp[look->m]; + + /* take the coefficients back to a spectral envelope curve */ + vorbis_lsp_to_curve(out,look->linearmap,look->n,look->ln, + lsp,look->m,amp,info->ampdB,look->lsp_look); + return(1); + } + memset(out,0,sizeof(*out)*look->n); + return(0); +} + +/* export hooks */ +vorbis_func_floor floor0_exportbundle={ + &floor0_unpack,&floor0_look,&floor0_free_info, + &floor0_free_look,&floor0_inverse1,&floor0_inverse2 +}; + + diff --git a/Mednafen/mednafen/tremor/floor1.c b/Mednafen/mednafen/tremor/floor1.c new file mode 100644 index 0000000000..ab4c899b54 --- /dev/null +++ b/Mednafen/mednafen/tremor/floor1.c @@ -0,0 +1,460 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: floor backend 1 implementation + + ********************************************************************/ + +#include +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "block.h" + +#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ + +typedef struct { + int forward_index[VIF_POSIT+2]; + + int hineighbor[VIF_POSIT]; + int loneighbor[VIF_POSIT]; + int posts; + + int n; + int quant_q; + vorbis_info_floor1 *vi; + +} vorbis_look_floor1; + +/***********************************************/ + +static void floor1_free_info(vorbis_info_floor *i){ + vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void floor1_free_look(vorbis_look_floor *i){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; + if(look){ + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static int icomp(const void *a,const void *b){ + return(**(int **)a-**(int **)b); +} + +static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int j,k,count=0,maxclass=-1,rangebits; + + vorbis_info_floor1 *info=(vorbis_info_floor1 *)_ogg_calloc(1,sizeof(*info)); + /* read partitions */ + info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ + for(j=0;jpartitions;j++){ + info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ + if(info->partitionclass[j]<0)goto err_out; + if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; + } + + /* read partition classes */ + for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ + info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ + if(info->class_subs[j]<0) + goto err_out; + if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); + if(info->class_book[j]<0 || info->class_book[j]>=ci->books) + goto err_out; + for(k=0;k<(1<class_subs[j]);k++){ + info->class_subbook[j][k]=oggpack_read(opb,8)-1; + if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) + goto err_out; + } + } + + /* read the post list */ + info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ + rangebits=oggpack_read(opb,4); + if(rangebits<0)goto err_out; + + for(j=0,k=0;jpartitions;j++){ + count+=info->class_dim[info->partitionclass[j]]; + if(count>VIF_POSIT)goto err_out; + for(;kpostlist[k+2]=oggpack_read(opb,rangebits); + if(t<0 || t>=(1<postlist[0]=0; + info->postlist[1]=1<postlist+j; + qsort(sortpointer,count+2,sizeof(*sortpointer),icomp); + + for(j=1;jvi=info; + look->n=info->postlist[1]; + + /* we drop each position value in-between already decoded values, + and use linear interpolation to predict each new value past the + edges. The positions are read in the order of the position + list... we precompute the bounding positions in the lookup. Of + course, the neighbors can change (if a position is declined), but + this is an initial mapping */ + + for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; + n+=2; + look->posts=n; + + /* also store a sorted position index */ + for(i=0;ipostlist+i; + qsort(sortpointer,n,sizeof(*sortpointer),icomp); + + /* points from sort order back to range number */ + for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; + + /* quantize values to multiplier spec */ + switch(info->mult){ + case 1: /* 1024 -> 256 */ + look->quant_q=256; + break; + case 2: /* 1024 -> 128 */ + look->quant_q=128; + break; + case 3: /* 1024 -> 86 */ + look->quant_q=86; + break; + case 4: /* 1024 -> 64 */ + look->quant_q=64; + break; + } + + /* discover our neighbors for decode where we don't use fit flags + (that would push the neighbors outward) */ + for(i=0;in; + int currentx=info->postlist[i+2]; + for(j=0;jpostlist[j]; + if(x>lx && xcurrentx){ + hi=j; + hx=x; + } + } + look->loneighbor[i]=lo; + look->hineighbor[i]=hi; + } + + return(look); +} + +static int render_point(int x0,int x1,int y0,int y1,int x){ + y0&=0x7fff; /* mask off flag */ + y1&=0x7fff; + + { + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int err=ady*(x-x0); + + int off=err/adx; + if(dy<0)return(y0-off); + return(y0+off); + } +} + +#ifdef _LOW_ACCURACY_ +# define XdB(n) ((((n)>>8)+1)>>1) +#else +# define XdB(n) (n) +#endif + +static const ogg_int32_t FLOOR_fromdB_LOOKUP[256]={ + XdB(0x000000e5), XdB(0x000000f4), XdB(0x00000103), XdB(0x00000114), + XdB(0x00000126), XdB(0x00000139), XdB(0x0000014e), XdB(0x00000163), + XdB(0x0000017a), XdB(0x00000193), XdB(0x000001ad), XdB(0x000001c9), + XdB(0x000001e7), XdB(0x00000206), XdB(0x00000228), XdB(0x0000024c), + XdB(0x00000272), XdB(0x0000029b), XdB(0x000002c6), XdB(0x000002f4), + XdB(0x00000326), XdB(0x0000035a), XdB(0x00000392), XdB(0x000003cd), + XdB(0x0000040c), XdB(0x00000450), XdB(0x00000497), XdB(0x000004e4), + XdB(0x00000535), XdB(0x0000058c), XdB(0x000005e8), XdB(0x0000064a), + XdB(0x000006b3), XdB(0x00000722), XdB(0x00000799), XdB(0x00000818), + XdB(0x0000089e), XdB(0x0000092e), XdB(0x000009c6), XdB(0x00000a69), + XdB(0x00000b16), XdB(0x00000bcf), XdB(0x00000c93), XdB(0x00000d64), + XdB(0x00000e43), XdB(0x00000f30), XdB(0x0000102d), XdB(0x0000113a), + XdB(0x00001258), XdB(0x0000138a), XdB(0x000014cf), XdB(0x00001629), + XdB(0x0000179a), XdB(0x00001922), XdB(0x00001ac4), XdB(0x00001c82), + XdB(0x00001e5c), XdB(0x00002055), XdB(0x0000226f), XdB(0x000024ac), + XdB(0x0000270e), XdB(0x00002997), XdB(0x00002c4b), XdB(0x00002f2c), + XdB(0x0000323d), XdB(0x00003581), XdB(0x000038fb), XdB(0x00003caf), + XdB(0x000040a0), XdB(0x000044d3), XdB(0x0000494c), XdB(0x00004e10), + XdB(0x00005323), XdB(0x0000588a), XdB(0x00005e4b), XdB(0x0000646b), + XdB(0x00006af2), XdB(0x000071e5), XdB(0x0000794c), XdB(0x0000812e), + XdB(0x00008993), XdB(0x00009283), XdB(0x00009c09), XdB(0x0000a62d), + XdB(0x0000b0f9), XdB(0x0000bc79), XdB(0x0000c8b9), XdB(0x0000d5c4), + XdB(0x0000e3a9), XdB(0x0000f274), XdB(0x00010235), XdB(0x000112fd), + XdB(0x000124dc), XdB(0x000137e4), XdB(0x00014c29), XdB(0x000161bf), + XdB(0x000178bc), XdB(0x00019137), XdB(0x0001ab4a), XdB(0x0001c70e), + XdB(0x0001e4a1), XdB(0x0002041f), XdB(0x000225aa), XdB(0x00024962), + XdB(0x00026f6d), XdB(0x000297f0), XdB(0x0002c316), XdB(0x0002f109), + XdB(0x000321f9), XdB(0x00035616), XdB(0x00038d97), XdB(0x0003c8b4), + XdB(0x000407a7), XdB(0x00044ab2), XdB(0x00049218), XdB(0x0004de23), + XdB(0x00052f1e), XdB(0x0005855c), XdB(0x0005e135), XdB(0x00064306), + XdB(0x0006ab33), XdB(0x00071a24), XdB(0x0007904b), XdB(0x00080e20), + XdB(0x00089422), XdB(0x000922da), XdB(0x0009bad8), XdB(0x000a5cb6), + XdB(0x000b091a), XdB(0x000bc0b1), XdB(0x000c8436), XdB(0x000d5471), + XdB(0x000e3233), XdB(0x000f1e5f), XdB(0x001019e4), XdB(0x001125c1), + XdB(0x00124306), XdB(0x001372d5), XdB(0x0014b663), XdB(0x00160ef7), + XdB(0x00177df0), XdB(0x001904c1), XdB(0x001aa4f9), XdB(0x001c603d), + XdB(0x001e384f), XdB(0x00202f0f), XdB(0x0022467a), XdB(0x002480b1), + XdB(0x0026dff7), XdB(0x002966b3), XdB(0x002c1776), XdB(0x002ef4fc), + XdB(0x0032022d), XdB(0x00354222), XdB(0x0038b828), XdB(0x003c67c2), + XdB(0x004054ae), XdB(0x004482e8), XdB(0x0048f6af), XdB(0x004db488), + XdB(0x0052c142), XdB(0x005821ff), XdB(0x005ddc33), XdB(0x0063f5b0), + XdB(0x006a74a7), XdB(0x00715faf), XdB(0x0078bdce), XdB(0x0080967f), + XdB(0x0088f1ba), XdB(0x0091d7f9), XdB(0x009b5247), XdB(0x00a56a41), + XdB(0x00b02a27), XdB(0x00bb9ce2), XdB(0x00c7ce12), XdB(0x00d4ca17), + XdB(0x00e29e20), XdB(0x00f15835), XdB(0x0101074b), XdB(0x0111bb4e), + XdB(0x01238531), XdB(0x01367704), XdB(0x014aa402), XdB(0x016020a7), + XdB(0x017702c3), XdB(0x018f6190), XdB(0x01a955cb), XdB(0x01c4f9cf), + XdB(0x01e269a8), XdB(0x0201c33b), XdB(0x0223265a), XdB(0x0246b4ea), + XdB(0x026c9302), XdB(0x0294e716), XdB(0x02bfda13), XdB(0x02ed9793), + XdB(0x031e4e09), XdB(0x03522ee4), XdB(0x03896ed0), XdB(0x03c445e2), + XdB(0x0402efd6), XdB(0x0445ac4b), XdB(0x048cbefc), XdB(0x04d87013), + XdB(0x05290c67), XdB(0x057ee5ca), XdB(0x05da5364), XdB(0x063bb204), + XdB(0x06a36485), XdB(0x0711d42b), XdB(0x0787710e), XdB(0x0804b299), + XdB(0x088a17ef), XdB(0x0918287e), XdB(0x09af747c), XdB(0x0a50957e), + XdB(0x0afc2f19), XdB(0x0bb2ef7f), XdB(0x0c759034), XdB(0x0d44d6ca), + XdB(0x0e2195bc), XdB(0x0f0cad0d), XdB(0x10070b62), XdB(0x1111aeea), + XdB(0x122da66c), XdB(0x135c120f), XdB(0x149e24d9), XdB(0x15f525b1), + XdB(0x176270e3), XdB(0x18e7794b), XdB(0x1a85c9ae), XdB(0x1c3f06d1), + XdB(0x1e14f07d), XdB(0x200963d7), XdB(0x221e5ccd), XdB(0x2455f870), + XdB(0x26b2770b), XdB(0x29363e2b), XdB(0x2be3db5c), XdB(0x2ebe06b6), + XdB(0x31c7a55b), XdB(0x3503ccd4), XdB(0x3875c5aa), XdB(0x3c210f44), + XdB(0x4009632b), XdB(0x4432b8cf), XdB(0x48a149bc), XdB(0x4d59959e), + XdB(0x52606733), XdB(0x57bad899), XdB(0x5d6e593a), XdB(0x6380b298), + XdB(0x69f80e9a), XdB(0x70dafda8), XdB(0x78307d76), XdB(0x7fffffff), +}; + +static void render_line(int n, int x0,int x1,int y0,int y1,ogg_int32_t *d){ + int dy=y1-y0; + int adx=x1-x0; + int ady=abs(dy); + int base=dy/adx; + int sy=(dy<0?base-1:base+1); + int x=x0; + int y=y0; + int err=0; + + if(n>x1)n=x1; + ady-=abs(base*adx); + + if(x=adx){ + err-=adx; + y+=sy; + }else{ + y+=base; + } + d[x]= MULT31_SHIFT15(d[x],FLOOR_fromdB_LOOKUP[y]); + } +} + +static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + + int i,j,k; + codebook *books=ci->fullbooks; + + /* unpack wrapped/predicted values from stream */ + if(oggpack_read(&vb->opb,1)==1){ + int *fit_value=(int *)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); + + fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); + fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); + + /* partition by partition */ + /* partition by partition */ + for(i=0,j=2;ipartitions;i++){ + int classv=info->partitionclass[i]; + int cdim=info->class_dim[classv]; + int csubbits=info->class_subs[classv]; + int csub=1<class_book[classv],&vb->opb); + + if(cval==-1)goto eop; + } + + for(k=0;kclass_subbook[classv][cval&(csub-1)]; + cval>>=csubbits; + if(book>=0){ + if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) + goto eop; + }else{ + fit_value[j+k]=0; + } + } + j+=cdim; + } + + /* unwrap positive values and reconsitute via linear interpolation */ + for(i=2;iposts;i++){ + int predicted=render_point(info->postlist[look->loneighbor[i-2]], + info->postlist[look->hineighbor[i-2]], + fit_value[look->loneighbor[i-2]], + fit_value[look->hineighbor[i-2]], + info->postlist[i]); + int hiroom=look->quant_q-predicted; + int loroom=predicted; + int room=(hiroom=room){ + if(hiroom>loroom){ + val = val-loroom; + }else{ + val = -1-(val-hiroom); + } + }else{ + if(val&1){ + val= -((val+1)>>1); + }else{ + val>>=1; + } + } + + fit_value[i]=(val+predicted)&0x7fff;; + fit_value[look->loneighbor[i-2]]&=0x7fff; + fit_value[look->hineighbor[i-2]]&=0x7fff; + + }else{ + fit_value[i]=predicted|0x8000; + } + + } + + return(fit_value); + } + eop: + return(NULL); +} + +static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, + ogg_int32_t *out){ + vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; + vorbis_info_floor1 *info=look->vi; + + codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; + int n=ci->blocksizes[vb->W]/2; + int j; + + if(memo){ + /* render the lines */ + int *fit_value=(int *)memo; + int hx=0; + int lx=0; + int ly=fit_value[0]*info->mult; + /* guard lookup against out-of-range values */ + ly=(ly<0?0:ly>255?255:ly); + + for(j=1;jposts;j++){ + int current=look->forward_index[j]; + int hy=fit_value[current]&0x7fff; + if(hy==fit_value[current]){ + + hx=info->postlist[current]; + hy*=info->mult; + /* guard lookup against out-of-range values */ + hy=(hy<0?0:hy>255?255:hy); + + render_line(n,lx,hx,ly,hy,out); + + lx=hx; + ly=hy; + } + } + for(j=hx;j +#include +#include "ogg.h" + +/* A complete description of Ogg framing exists in docs/framing.html */ + +int ogg_page_version(const ogg_page *og){ + return((int)(og->header[4])); +} + +int ogg_page_continued(const ogg_page *og){ + return((int)(og->header[5]&0x01)); +} + +int ogg_page_bos(const ogg_page *og){ + return((int)(og->header[5]&0x02)); +} + +int ogg_page_eos(const ogg_page *og){ + return((int)(og->header[5]&0x04)); +} + +ogg_int64_t ogg_page_granulepos(const ogg_page *og){ + unsigned char *page=og->header; + ogg_int64_t granulepos=page[13]&(0xff); + granulepos= (granulepos<<8)|(page[12]&0xff); + granulepos= (granulepos<<8)|(page[11]&0xff); + granulepos= (granulepos<<8)|(page[10]&0xff); + granulepos= (granulepos<<8)|(page[9]&0xff); + granulepos= (granulepos<<8)|(page[8]&0xff); + granulepos= (granulepos<<8)|(page[7]&0xff); + granulepos= (granulepos<<8)|(page[6]&0xff); + return(granulepos); +} + +int ogg_page_serialno(const ogg_page *og){ + return(og->header[14] | + (og->header[15]<<8) | + (og->header[16]<<16) | + (og->header[17]<<24)); +} + +long ogg_page_pageno(const ogg_page *og){ + return(og->header[18] | + (og->header[19]<<8) | + (og->header[20]<<16) | + (og->header[21]<<24)); +} + + + +/* returns the number of packets that are completed on this page (if + the leading packet is begun on a previous page, but ends on this + page, it's counted */ + +/* NOTE: + If a page consists of a packet begun on a previous page, and a new + packet begun (but not completed) on this page, the return will be: + ogg_page_packets(page) ==1, + ogg_page_continued(page) !=0 + + If a page happens to be a single packet that was begun on a + previous page, and spans to the next page (in the case of a three or + more page packet), the return will be: + ogg_page_packets(page) ==0, + ogg_page_continued(page) !=0 +*/ + +int ogg_page_packets(const ogg_page *og){ + int i,n=og->header[26],count=0; + for(i=0;iheader[27+i]<255)count++; + return(count); +} + + +#if 0 +/* helper to initialize lookup for direct-table CRC (illustrative; we + use the static init below) */ + +static ogg_uint32_t _ogg_crc_entry(unsigned long index){ + int i; + unsigned long r; + + r = index << 24; + for (i=0; i<8; i++) + if (r & 0x80000000UL) + r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator + polynomial, although we use an + unreflected alg and an init/final + of 0, not 0xffffffff */ + else + r<<=1; + return (r & 0xffffffffUL); +} +#endif + +static const ogg_uint32_t crc_lookup[256]={ + 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, + 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, + 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, + 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, + 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9, + 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, + 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011, + 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, + 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039, + 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, + 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81, + 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, + 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49, + 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, + 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1, + 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, + 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae, + 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, + 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16, + 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, + 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde, + 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, + 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066, + 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, + 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e, + 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, + 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6, + 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, + 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e, + 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, + 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686, + 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, + 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637, + 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, + 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f, + 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, + 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47, + 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, + 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff, + 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, + 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7, + 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, + 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f, + 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, + 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7, + 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, + 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f, + 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, + 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640, + 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, + 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8, + 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, + 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30, + 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, + 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088, + 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, + 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0, + 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, + 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18, + 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, + 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0, + 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, + 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668, + 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4}; + +/* init the encode/decode logical stream state */ + +int ogg_stream_init(ogg_stream_state *os,int serialno){ + if(os){ + memset(os,0,sizeof(*os)); + os->body_storage=16*1024; + os->lacing_storage=1024; + + os->body_data=_ogg_malloc(os->body_storage*sizeof(*os->body_data)); + os->lacing_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); + os->granule_vals=_ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); + + if(!os->body_data || !os->lacing_vals || !os->granule_vals){ + ogg_stream_clear(os); + return -1; + } + + os->serialno=serialno; + + return(0); + } + return(-1); +} + +/* async/delayed error detection for the ogg_stream_state */ +int ogg_stream_check(ogg_stream_state *os){ + if(!os || !os->body_data) return -1; + return 0; +} + +/* _clear does not free os, only the non-flat storage within */ +int ogg_stream_clear(ogg_stream_state *os){ + if(os){ + if(os->body_data)_ogg_free(os->body_data); + if(os->lacing_vals)_ogg_free(os->lacing_vals); + if(os->granule_vals)_ogg_free(os->granule_vals); + + memset(os,0,sizeof(*os)); + } + return(0); +} + +int ogg_stream_destroy(ogg_stream_state *os){ + if(os){ + ogg_stream_clear(os); + _ogg_free(os); + } + return(0); +} + +/* Helpers for ogg_stream_encode; this keeps the structure and + what's happening fairly clear */ + +static int _os_body_expand(ogg_stream_state *os,int needed){ + if(os->body_storage<=os->body_fill+needed){ + void *ret; + ret=_ogg_realloc(os->body_data,(os->body_storage+needed+1024)* + sizeof(*os->body_data)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->body_storage+=(needed+1024); + os->body_data=ret; + } + return 0; +} + +static int _os_lacing_expand(ogg_stream_state *os,int needed){ + if(os->lacing_storage<=os->lacing_fill+needed){ + void *ret; + ret=_ogg_realloc(os->lacing_vals,(os->lacing_storage+needed+32)* + sizeof(*os->lacing_vals)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->lacing_vals=ret; + ret=_ogg_realloc(os->granule_vals,(os->lacing_storage+needed+32)* + sizeof(*os->granule_vals)); + if(!ret){ + ogg_stream_clear(os); + return -1; + } + os->granule_vals=ret; + os->lacing_storage+=(needed+32); + } + return 0; +} + +/* checksum the page */ +/* Direct table CRC; note that this will be faster in the future if we + perform the checksum simultaneously with other copies */ + +void ogg_page_checksum_set(ogg_page *og){ + if(og){ + ogg_uint32_t crc_reg=0; + int i; + + /* safety; needed for API behavior, but not framing code */ + og->header[22]=0; + og->header[23]=0; + og->header[24]=0; + og->header[25]=0; + + for(i=0;iheader_len;i++) + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->header[i]]; + for(i=0;ibody_len;i++) + crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->body[i]]; + + og->header[22]=(unsigned char)(crc_reg&0xff); + og->header[23]=(unsigned char)((crc_reg>>8)&0xff); + og->header[24]=(unsigned char)((crc_reg>>16)&0xff); + og->header[25]=(unsigned char)((crc_reg>>24)&0xff); + } +} + +/* submit data to the internal buffer of the framing engine */ +int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, int count, + long e_o_s, ogg_int64_t granulepos){ + + int bytes = 0, lacing_vals, i; + + if(ogg_stream_check(os)) return -1; + if(!iov) return 0; + + for (i = 0; i < count; ++i) bytes += (int)iov[i].iov_len; + lacing_vals=bytes/255+1; + + if(os->body_returned){ + /* advance packet data according to the body_returned pointer. We + had to keep it around to return a pointer into the buffer last + call */ + + os->body_fill-=os->body_returned; + if(os->body_fill) + memmove(os->body_data,os->body_data+os->body_returned, + os->body_fill); + os->body_returned=0; + } + + /* make sure we have the buffer storage */ + if(_os_body_expand(os,bytes) || _os_lacing_expand(os,lacing_vals)) + return -1; + + /* Copy in the submitted packet. Yes, the copy is a waste; this is + the liability of overly clean abstraction for the time being. It + will actually be fairly easy to eliminate the extra copy in the + future */ + + for (i = 0; i < count; ++i) { + memcpy(os->body_data+os->body_fill, iov[i].iov_base, iov[i].iov_len); + os->body_fill += (int)iov[i].iov_len; + } + + /* Store lacing vals for this packet */ + for(i=0;ilacing_vals[os->lacing_fill+i]=255; + os->granule_vals[os->lacing_fill+i]=os->granulepos; + } + os->lacing_vals[os->lacing_fill+i]=bytes%255; + os->granulepos=os->granule_vals[os->lacing_fill+i]=granulepos; + + /* flag the first segment as the beginning of the packet */ + os->lacing_vals[os->lacing_fill]|= 0x100; + + os->lacing_fill+=lacing_vals; + + /* for the sake of completeness */ + os->packetno++; + + if(e_o_s)os->e_o_s=1; + + return(0); +} + +int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ + ogg_iovec_t iov; + iov.iov_base = op->packet; + iov.iov_len = op->bytes; + return ogg_stream_iovecin(os, &iov, 1, op->e_o_s, op->granulepos); +} + +/* Conditionally flush a page; force==0 will only flush nominal-size + pages, force==1 forces us to flush a page regardless of page size + so long as there's any data available at all. */ +static int ogg_stream_flush_i(ogg_stream_state *os,ogg_page *og, int force, int nfill){ + int i; + int vals=0; + int maxvals=(os->lacing_fill>255?255:os->lacing_fill); + int bytes=0; + long acc=0; + ogg_int64_t granule_pos=-1; + + if(ogg_stream_check(os)) return(0); + if(maxvals==0) return(0); + + /* construct a page */ + /* decide how many segments to include */ + + /* If this is the initial header case, the first page must only include + the initial header packet */ + if(os->b_o_s==0){ /* 'initial header page' case */ + granule_pos=0; + for(vals=0;valslacing_vals[vals]&0x0ff)<255){ + vals++; + break; + } + } + }else{ + + /* The extra packets_done, packet_just_done logic here attempts to do two things: + 1) Don't unneccessarily span pages. + 2) Unless necessary, don't flush pages if there are less than four packets on + them; this expands page size to reduce unneccessary overhead if incoming packets + are large. + These are not necessary behaviors, just 'always better than naive flushing' + without requiring an application to explicitly request a specific optimized + behavior. We'll want an explicit behavior setup pathway eventually as well. */ + + int packets_done=0; + int packet_just_done=0; + for(vals=0;valsnfill && packet_just_done>=4){ + force=1; + break; + } + acc+=os->lacing_vals[vals]&0x0ff; + if((os->lacing_vals[vals]&0xff)<255){ + granule_pos=os->granule_vals[vals]; + packet_just_done=++packets_done; + }else + packet_just_done=0; + } + if(vals==255)force=1; + } + + if(!force) return(0); + + /* construct the header in temp storage */ + memcpy(os->header,"OggS",4); + + /* stream structure version */ + os->header[4]=0x00; + + /* continued packet flag? */ + os->header[5]=0x00; + if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; + /* first page flag? */ + if(os->b_o_s==0)os->header[5]|=0x02; + /* last page flag? */ + if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; + os->b_o_s=1; + + /* 64 bits of PCM position */ + for(i=6;i<14;i++){ + os->header[i]=(unsigned char)(granule_pos&0xff); + granule_pos>>=8; + } + + /* 32 bits of stream serial number */ + { + long serialno=os->serialno; + for(i=14;i<18;i++){ + os->header[i]=(unsigned char)(serialno&0xff); + serialno>>=8; + } + } + + /* 32 bits of page counter (we have both counter and page header + because this val can roll over) */ + if(os->pageno==-1)os->pageno=0; /* because someone called + stream_reset; this would be a + strange thing to do in an + encode stream, but it has + plausible uses */ + { + long pageno=os->pageno++; + for(i=18;i<22;i++){ + os->header[i]=(unsigned char)(pageno&0xff); + pageno>>=8; + } + } + + /* zero for computation; filled in later */ + os->header[22]=0; + os->header[23]=0; + os->header[24]=0; + os->header[25]=0; + + /* segment table */ + os->header[26]=(unsigned char)(vals&0xff); + for(i=0;iheader[i+27]=(unsigned char)(os->lacing_vals[i]&0xff); + + /* set pointers in the ogg_page struct */ + og->header=os->header; + og->header_len=os->header_fill=vals+27; + og->body=os->body_data+os->body_returned; + og->body_len=bytes; + + /* advance the lacing data and set the body_returned pointer */ + + os->lacing_fill-=vals; + memmove(os->lacing_vals,os->lacing_vals+vals,os->lacing_fill*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+vals,os->lacing_fill*sizeof(*os->granule_vals)); + os->body_returned+=bytes; + + /* calculate the checksum */ + + ogg_page_checksum_set(og); + + /* done */ + return(1); +} + +/* This will flush remaining packets into a page (returning nonzero), + even if there is not enough data to trigger a flush normally + (undersized page). If there are no packets or partial packets to + flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will + try to flush a normal sized page like ogg_stream_pageout; a call to + ogg_stream_flush does not guarantee that all packets have flushed. + Only a return value of 0 from ogg_stream_flush indicates all packet + data is flushed into pages. + + since ogg_stream_flush will flush the last page in a stream even if + it's undersized, you almost certainly want to use ogg_stream_pageout + (and *not* ogg_stream_flush) unless you specifically need to flush + a page regardless of size in the middle of a stream. */ + +int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ + return ogg_stream_flush_i(os,og,1,4096); +} + +/* Like the above, but an argument is provided to adjust the nominal + page size for applications which are smart enough to provide their + own delay based flushing */ + +int ogg_stream_flush_fill(ogg_stream_state *os,ogg_page *og, int nfill){ + return ogg_stream_flush_i(os,og,1,nfill); +} + +/* This constructs pages from buffered packet segments. The pointers +returned are to static buffers; do not free. The returned buffers are +good only until the next call (using the same ogg_stream_state) */ + +int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ + int force=0; + if(ogg_stream_check(os)) return 0; + + if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ + (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ + force=1; + + return(ogg_stream_flush_i(os,og,force,4096)); +} + +/* Like the above, but an argument is provided to adjust the nominal +page size for applications which are smart enough to provide their +own delay based flushing */ + +int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill){ + int force=0; + if(ogg_stream_check(os)) return 0; + + if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ + (os->lacing_fill&&!os->b_o_s)) /* 'initial header page' case */ + force=1; + + return(ogg_stream_flush_i(os,og,force,nfill)); +} + +int ogg_stream_eos(ogg_stream_state *os){ + if(ogg_stream_check(os)) return 1; + return os->e_o_s; +} + +/* DECODING PRIMITIVES: packet streaming layer **********************/ + +/* This has two layers to place more of the multi-serialno and paging + control in the application's hands. First, we expose a data buffer + using ogg_sync_buffer(). The app either copies into the + buffer, or passes it directly to read(), etc. We then call + ogg_sync_wrote() to tell how many bytes we just added. + + Pages are returned (pointers into the buffer in ogg_sync_state) + by ogg_sync_pageout(). The page is then submitted to + ogg_stream_pagein() along with the appropriate + ogg_stream_state* (ie, matching serialno). We then get raw + packets out calling ogg_stream_packetout() with a + ogg_stream_state. */ + +/* initialize the struct to a known state */ +int ogg_sync_init(ogg_sync_state *oy){ + if(oy){ + oy->storage = -1; /* used as a readiness flag */ + memset(oy,0,sizeof(*oy)); + } + return(0); +} + +/* clear non-flat storage within */ +int ogg_sync_clear(ogg_sync_state *oy){ + if(oy){ + if(oy->data)_ogg_free(oy->data); + memset(oy,0,sizeof(*oy)); + } + return(0); +} + +int ogg_sync_destroy(ogg_sync_state *oy){ + if(oy){ + ogg_sync_clear(oy); + _ogg_free(oy); + } + return(0); +} + +int ogg_sync_check(ogg_sync_state *oy){ + if(oy->storage<0) return -1; + return 0; +} + +char *ogg_sync_buffer(ogg_sync_state *oy, long size){ + if(ogg_sync_check(oy)) return NULL; + + /* first, clear out any space that has been previously returned */ + if(oy->returned){ + oy->fill-=oy->returned; + if(oy->fill>0) + memmove(oy->data,oy->data+oy->returned,oy->fill); + oy->returned=0; + } + + if(size>oy->storage-oy->fill){ + /* We need to extend the internal buffer */ + long newsize=size+oy->fill+4096; /* an extra page to be nice */ + void *ret; + + if(oy->data) + ret=_ogg_realloc(oy->data,newsize); + else + ret=_ogg_malloc(newsize); + if(!ret){ + ogg_sync_clear(oy); + return NULL; + } + oy->data=ret; + oy->storage=newsize; + } + + /* expose a segment at least as large as requested at the fill mark */ + return((char *)oy->data+oy->fill); +} + +int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ + if(ogg_sync_check(oy))return -1; + if(oy->fill+bytes>oy->storage)return -1; + oy->fill+=bytes; + return(0); +} + +/* sync the stream. This is meant to be useful for finding page + boundaries. + + return values for this: + -n) skipped n bytes + 0) page not ready; more data (no bytes skipped) + n) page synced at current location; page length n bytes + +*/ + +long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ + unsigned char *page=oy->data+oy->returned; + unsigned char *next; + long bytes=oy->fill-oy->returned; + + if(ogg_sync_check(oy))return 0; + + if(oy->headerbytes==0){ + int headerbytes,i; + if(bytes<27)return(0); /* not enough for a header */ + + /* verify capture pattern */ + if(memcmp(page,"OggS",4))goto sync_fail; + + headerbytes=page[26]+27; + if(bytesbodybytes+=page[27+i]; + oy->headerbytes=headerbytes; + } + + if(oy->bodybytes+oy->headerbytes>bytes)return(0); + + /* The whole test page is buffered. Verify the checksum */ + { + /* Grab the checksum bytes, set the header field to zero */ + char chksum[4]; + ogg_page log; + + memcpy(chksum,page+22,4); + memset(page+22,0,4); + + /* set up a temp page struct and recompute the checksum */ + log.header=page; + log.header_len=oy->headerbytes; + log.body=page+oy->headerbytes; + log.body_len=oy->bodybytes; + ogg_page_checksum_set(&log); + + /* Compare */ + if(memcmp(chksum,page+22,4)){ + /* D'oh. Mismatch! Corrupt page (or miscapture and not a page + at all) */ + /* replace the computed checksum with the one actually read in */ + memcpy(page+22,chksum,4); + + /* Bad checksum. Lose sync */ + goto sync_fail; + } + } + + /* yes, have a whole page all ready to go */ + { + unsigned char *page=oy->data+oy->returned; + long bytes; + + if(og){ + og->header=page; + og->header_len=oy->headerbytes; + og->body=page+oy->headerbytes; + og->body_len=oy->bodybytes; + } + + oy->unsynced=0; + oy->returned+=(bytes=oy->headerbytes+oy->bodybytes); + oy->headerbytes=0; + oy->bodybytes=0; + return(bytes); + } + + sync_fail: + + oy->headerbytes=0; + oy->bodybytes=0; + + /* search for possible capture */ + next=memchr(page+1,'O',bytes-1); + if(!next) + next=oy->data+oy->fill; + + oy->returned=(int)(next-oy->data); + return((long)-(next-page)); +} + +/* sync the stream and get a page. Keep trying until we find a page. + Suppress 'sync errors' after reporting the first. + + return values: + -1) recapture (hole in data) + 0) need more data + 1) page returned + + Returns pointers into buffered data; invalidated by next call to + _stream, _clear, _init, or _buffer */ + +int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ + + if(ogg_sync_check(oy))return 0; + + /* all we need to do is verify a page at the head of the stream + buffer. If it doesn't verify, we look for the next potential + frame */ + + for(;;){ + long ret=ogg_sync_pageseek(oy,og); + if(ret>0){ + /* have a page */ + return(1); + } + if(ret==0){ + /* need more data */ + return(0); + } + + /* head did not start a synced page... skipped some bytes */ + if(!oy->unsynced){ + oy->unsynced=1; + return(-1); + } + + /* loop. keep looking */ + + } +} + +/* add the incoming page to the stream state; we decompose the page + into packet segments here as well. */ + +int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ + unsigned char *header=og->header; + unsigned char *body=og->body; + long bodysize=og->body_len; + int segptr=0; + + int version=ogg_page_version(og); + int continued=ogg_page_continued(og); + int bos=ogg_page_bos(og); + int eos=ogg_page_eos(og); + ogg_int64_t granulepos=ogg_page_granulepos(og); + int serialno=ogg_page_serialno(og); + long pageno=ogg_page_pageno(og); + int segments=header[26]; + + if(ogg_stream_check(os)) return -1; + + /* clean up 'returned data' */ + { + long lr=os->lacing_returned; + long br=os->body_returned; + + /* body data */ + if(br){ + os->body_fill-=br; + if(os->body_fill) + memmove(os->body_data,os->body_data+br,os->body_fill); + os->body_returned=0; + } + + if(lr){ + /* segment table */ + if(os->lacing_fill-lr){ + memmove(os->lacing_vals,os->lacing_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); + memmove(os->granule_vals,os->granule_vals+lr, + (os->lacing_fill-lr)*sizeof(*os->granule_vals)); + } + os->lacing_fill-=lr; + os->lacing_packet-=lr; + os->lacing_returned=0; + } + } + + /* check the serial number */ + if(serialno!=os->serialno)return(-1); + if(version>0)return(-1); + + if(_os_lacing_expand(os,segments+1)) return -1; + + /* are we in sequence? */ + if(pageno!=os->pageno){ + int i; + + /* unroll previous partial packet (if any) */ + for(i=os->lacing_packet;ilacing_fill;i++) + os->body_fill-=os->lacing_vals[i]&0xff; + os->lacing_fill=os->lacing_packet; + + /* make a note of dropped data in segment table */ + if(os->pageno!=-1){ + os->lacing_vals[os->lacing_fill++]=0x400; + os->lacing_packet++; + } + } + + /* are we a 'continued packet' page? If so, we may need to skip + some segments */ + if(continued){ + if(os->lacing_fill<1 || + os->lacing_vals[os->lacing_fill-1]==0x400){ + bos=0; + for(;segptrbody_data+os->body_fill,body,bodysize); + os->body_fill+=bodysize; + } + + { + int saved=-1; + while(segptrlacing_vals[os->lacing_fill]=val; + os->granule_vals[os->lacing_fill]=-1; + + if(bos){ + os->lacing_vals[os->lacing_fill]|=0x100; + bos=0; + } + + if(val<255)saved=os->lacing_fill; + + os->lacing_fill++; + segptr++; + + if(val<255)os->lacing_packet=os->lacing_fill; + } + + /* set the granulepos on the last granuleval of the last full packet */ + if(saved!=-1){ + os->granule_vals[saved]=granulepos; + } + + } + + if(eos){ + os->e_o_s=1; + if(os->lacing_fill>0) + os->lacing_vals[os->lacing_fill-1]|=0x200; + } + + os->pageno=pageno+1; + + return(0); +} + +/* clear things to an initial state. Good to call, eg, before seeking */ +int ogg_sync_reset(ogg_sync_state *oy){ + if(ogg_sync_check(oy))return -1; + + oy->fill=0; + oy->returned=0; + oy->unsynced=0; + oy->headerbytes=0; + oy->bodybytes=0; + return(0); +} + +int ogg_stream_reset(ogg_stream_state *os){ + if(ogg_stream_check(os)) return -1; + + os->body_fill=0; + os->body_returned=0; + + os->lacing_fill=0; + os->lacing_packet=0; + os->lacing_returned=0; + + os->header_fill=0; + + os->e_o_s=0; + os->b_o_s=0; + os->pageno=-1; + os->packetno=0; + os->granulepos=0; + + return(0); +} + +int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ + if(ogg_stream_check(os)) return -1; + ogg_stream_reset(os); + os->serialno=serialno; + return(0); +} + +static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ + + /* The last part of decode. We have the stream broken into packet + segments. Now we need to group them into packets (or return the + out of sync markers) */ + + int ptr=os->lacing_returned; + + if(os->lacing_packet<=ptr)return(0); + + if(os->lacing_vals[ptr]&0x400){ + /* we need to tell the codec there's a gap; it might need to + handle previous packet dependencies. */ + os->lacing_returned++; + os->packetno++; + return(-1); + } + + if(!op && !adv)return(1); /* just using peek as an inexpensive way + to ask if there's a whole packet + waiting */ + + /* Gather the whole packet. We'll have no holes or a partial packet */ + { + int size=os->lacing_vals[ptr]&0xff; + long bytes=size; + int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ + int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ + + while(size==255){ + int val=os->lacing_vals[++ptr]; + size=val&0xff; + if(val&0x200)eos=0x200; + bytes+=size; + } + + if(op){ + op->e_o_s=eos; + op->b_o_s=bos; + op->packet=os->body_data+os->body_returned; + op->packetno=os->packetno; + op->granulepos=os->granule_vals[ptr]; + op->bytes=bytes; + } + + if(adv){ + os->body_returned+=bytes; + os->lacing_returned=ptr+1; + os->packetno++; + } + } + return(1); +} + +int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ + if(ogg_stream_check(os)) return 0; + return _packetout(os,op,1); +} + +int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ + if(ogg_stream_check(os)) return 0; + return _packetout(os,op,0); +} + +void ogg_packet_clear(ogg_packet *op) { + _ogg_free(op->packet); + memset(op, 0, sizeof(*op)); +} + +#ifdef _V_SELFTEST +#include + +ogg_stream_state os_en, os_de; +ogg_sync_state oy; + +void checkpacket(ogg_packet *op,long len, int no, long pos){ + long j; + static int sequence=0; + static int lastno=0; + + if(op->bytes!=len){ + fprintf(stderr,"incorrect packet length (%ld != %ld)!\n",op->bytes,len); + exit(1); + } + if(op->granulepos!=pos){ + fprintf(stderr,"incorrect packet granpos (%ld != %ld)!\n",(long)op->granulepos,pos); + exit(1); + } + + /* packet number just follows sequence/gap; adjust the input number + for that */ + if(no==0){ + sequence=0; + }else{ + sequence++; + if(no>lastno+1) + sequence++; + } + lastno=no; + if(op->packetno!=sequence){ + fprintf(stderr,"incorrect packet sequence %ld != %d\n", + (long)(op->packetno),sequence); + exit(1); + } + + /* Test data */ + for(j=0;jbytes;j++) + if(op->packet[j]!=((j+no)&0xff)){ + fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", + j,op->packet[j],(j+no)&0xff); + exit(1); + } +} + +void check_page(unsigned char *data,const int *header,ogg_page *og){ + long j; + /* Test data */ + for(j=0;jbody_len;j++) + if(og->body[j]!=data[j]){ + fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", + j,data[j],og->body[j]); + exit(1); + } + + /* Test header */ + for(j=0;jheader_len;j++){ + if(og->header[j]!=header[j]){ + fprintf(stderr,"header content mismatch at pos %ld:\n",j); + for(j=0;jheader[j]); + fprintf(stderr,"\n"); + exit(1); + } + } + if(og->header_len!=header[26]+27){ + fprintf(stderr,"header length incorrect! (%ld!=%d)\n", + og->header_len,header[26]+27); + exit(1); + } +} + +void print_header(ogg_page *og){ + int j; + fprintf(stderr,"\nHEADER:\n"); + fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", + og->header[0],og->header[1],og->header[2],og->header[3], + (int)og->header[4],(int)og->header[5]); + + fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", + (og->header[9]<<24)|(og->header[8]<<16)| + (og->header[7]<<8)|og->header[6], + (og->header[17]<<24)|(og->header[16]<<16)| + (og->header[15]<<8)|og->header[14], + ((long)(og->header[21])<<24)|(og->header[20]<<16)| + (og->header[19]<<8)|og->header[18]); + + fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", + (int)og->header[22],(int)og->header[23], + (int)og->header[24],(int)og->header[25], + (int)og->header[26]); + + for(j=27;jheader_len;j++) + fprintf(stderr,"%d ",(int)og->header[j]); + fprintf(stderr,")\n\n"); +} + +void copy_page(ogg_page *og){ + unsigned char *temp=_ogg_malloc(og->header_len); + memcpy(temp,og->header,og->header_len); + og->header=temp; + + temp=_ogg_malloc(og->body_len); + memcpy(temp,og->body,og->body_len); + og->body=temp; +} + +void free_page(ogg_page *og){ + _ogg_free (og->header); + _ogg_free (og->body); +} + +void error(void){ + fprintf(stderr,"error!\n"); + exit(1); +} + +/* 17 only */ +const int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x15,0xed,0xec,0x91, + 1, + 17}; + +/* 17, 254, 255, 256, 500, 510, 600 byte, pad */ +const int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x59,0x10,0x6c,0x2c, + 1, + 17}; +const int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x89,0x33,0x85,0xce, + 13, + 254,255,0,255,1,255,245,255,255,0, + 255,255,90}; + +/* nil packets; beginning,middle,end */ +const int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; +const int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x5c,0x3f,0x66,0xcb, + 17, + 17,254,255,0,0,255,1,0,255,245,255,255,0, + 255,255,90,0}; + +/* large initial packet */ +const int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0x01,0x27,0x31,0xaa, + 18, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10}; + +const int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x7f,0x4e,0x8a,0xd2, + 4, + 255,4,255,0}; + + +/* continuing packet test */ +const int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xf8,0x3c,0x19,0x79, + 255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255}; + +const int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x38,0xe6,0xb6,0x28, + 6, + 255,220,255,4,255,0}; + + +/* spill expansion test */ +const int head1_4b[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_4b[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xce,0x8f,0x17,0x1a, + 23, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,10,255,4,255,0,0}; + + +const int head3_4b[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x14,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x9b,0xb2,0x50,0xa1, + 1, + 0}; + +/* page with the 255 segment limit */ +const int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0xed,0x2a,0x2e,0xa7, + 255, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10}; + +const int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, + 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0x6c,0x3b,0x82,0x3d, + 1, + 50}; + + +/* packet that overspans over an entire page */ +const int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x68,0x22,0x7c,0x3d, + 255, + 100, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255}; + +const int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xf4,0x87,0xba,0xf3, + 255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255}; + +const int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,3,0,0,0, + 0xf7,0x2f,0x6c,0x60, + 5, + 254,255,4,255,0}; + +/* packet that overspans over an entire page */ +const int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0,0,0,0, + 0xff,0x7b,0x23,0x17, + 1, + 0}; + +const int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, + 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,1,0,0,0, + 0x68,0x22,0x7c,0x3d, + 255, + 100, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255, + 255,255,255,255,255,255}; + +const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, + 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,2,0,0,0, + 0xd4,0xe0,0x60,0xe5, + 1, + 0}; + +void test_pack(const int *pl, const int **headers, int byteskip, + int pageskip, int packetskip){ + unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ + long inptr=0; + long outptr=0; + long deptr=0; + long depacket=0; + long granule_pos=7,pageno=0; + int i,j,packets,pageout=pageskip; + int eosflag=0; + int bosflag=0; + + int byteskipcount=0; + + ogg_stream_reset(&os_en); + ogg_stream_reset(&os_de); + ogg_sync_reset(&oy); + + for(packets=0;packetsbyteskip){ + memcpy(next,og.header,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } + + byteskipcount+=og.body_len; + if(byteskipcount>byteskip){ + memcpy(next,og.body,byteskipcount-byteskip); + next+=byteskipcount-byteskip; + byteskipcount=byteskip; + } + + ogg_sync_wrote(&oy,next-buf); + + while(1){ + int ret=ogg_sync_pageout(&oy,&og_de); + if(ret==0)break; + if(ret<0)continue; + /* got a page. Happy happy. Verify that it's good. */ + + fprintf(stderr,"(%d), ",pageout); + + check_page(data+deptr,headers[pageout],&og_de); + deptr+=og_de.body_len; + pageout++; + + /* submit it to deconstitution */ + ogg_stream_pagein(&os_de,&og_de); + + /* packets out? */ + while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ + ogg_stream_packetpeek(&os_de,NULL); + ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ + + /* verify peek and out match */ + if(memcmp(&op_de,&op_de2,sizeof(op_de))){ + fprintf(stderr,"packetout != packetpeek! pos=%ld\n", + depacket); + exit(1); + } + + /* verify the packet! */ + /* check data */ + if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ + fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", + depacket); + exit(1); + } + /* check bos flag */ + if(bosflag==0 && op_de.b_o_s==0){ + fprintf(stderr,"b_o_s flag not set on packet!\n"); + exit(1); + } + if(bosflag && op_de.b_o_s){ + fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); + exit(1); + } + bosflag=1; + depacket+=op_de.bytes; + + /* check eos flag */ + if(eosflag){ + fprintf(stderr,"Multiple decoded packets with eos flag!\n"); + exit(1); + } + + if(op_de.e_o_s)eosflag=1; + + /* check granulepos flag */ + if(op_de.granulepos!=-1){ + fprintf(stderr," granule:%ld ",(long)op_de.granulepos); + } + } + } + } + } + } + } + _ogg_free(data); + if(headers[pageno]!=NULL){ + fprintf(stderr,"did not write last page!\n"); + exit(1); + } + if(headers[pageout]!=NULL){ + fprintf(stderr,"did not decode last page!\n"); + exit(1); + } + if(inptr!=outptr){ + fprintf(stderr,"encoded page data incomplete!\n"); + exit(1); + } + if(inptr!=deptr){ + fprintf(stderr,"decoded page data incomplete!\n"); + exit(1); + } + if(inptr!=depacket){ + fprintf(stderr,"decoded packet data incomplete!\n"); + exit(1); + } + if(!eosflag){ + fprintf(stderr,"Never got a packet with EOS set!\n"); + exit(1); + } + fprintf(stderr,"ok.\n"); +} + +int main(void){ + + ogg_stream_init(&os_en,0x04030201); + ogg_stream_init(&os_de,0x04030201); + ogg_sync_init(&oy); + + /* Exercise each code path in the framing code. Also verify that + the checksums are working. */ + + { + /* 17 only */ + const int packets[]={17, -1}; + const int *headret[]={head1_0,NULL}; + + fprintf(stderr,"testing single page encoding... "); + test_pack(packets,headret,0,0,0); + } + + { + /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ + const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; + const int *headret[]={head1_1,head2_1,NULL}; + + fprintf(stderr,"testing basic page encoding... "); + test_pack(packets,headret,0,0,0); + } + + { + /* nil packets; beginning,middle,end */ + const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; + const int *headret[]={head1_2,head2_2,NULL}; + + fprintf(stderr,"testing basic nil packets... "); + test_pack(packets,headret,0,0,0); + } + + { + /* large initial packet */ + const int packets[]={4345,259,255,-1}; + const int *headret[]={head1_3,head2_3,NULL}; + + fprintf(stderr,"testing initial-packet lacing > 4k... "); + test_pack(packets,headret,0,0,0); + } + + { + /* continuing packet test; with page spill expansion, we have to + overflow the lacing table. */ + const int packets[]={0,65500,259,255,-1}; + const int *headret[]={head1_4,head2_4,head3_4,NULL}; + + fprintf(stderr,"testing single packet page span... "); + test_pack(packets,headret,0,0,0); + } + + { + /* spill expand packet test */ + const int packets[]={0,4345,259,255,0,0,-1}; + const int *headret[]={head1_4b,head2_4b,head3_4b,NULL}; + + fprintf(stderr,"testing page spill expansion... "); + test_pack(packets,headret,0,0,0); + } + + /* page with the 255 segment limit */ + { + + const int packets[]={0,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,50,-1}; + const int *headret[]={head1_5,head2_5,head3_5,NULL}; + + fprintf(stderr,"testing max packet segments... "); + test_pack(packets,headret,0,0,0); + } + + { + /* packet that overspans over an entire page */ + const int packets[]={0,100,130049,259,255,-1}; + const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; + + fprintf(stderr,"testing very large packets... "); + test_pack(packets,headret,0,0,0); + } + + { + /* test for the libogg 1.1.1 resync in large continuation bug + found by Josh Coalson) */ + const int packets[]={0,100,130049,259,255,-1}; + const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; + + fprintf(stderr,"testing continuation resync in very large packets... "); + test_pack(packets,headret,100,2,3); + } + + { + /* term only page. why not? */ + const int packets[]={0,100,64770,-1}; + const int *headret[]={head1_7,head2_7,head3_7,NULL}; + + fprintf(stderr,"testing zero data page (1 nil packet)... "); + test_pack(packets,headret,0,0,0); + } + + + + { + /* build a bunch of pages for testing */ + unsigned char *data=_ogg_malloc(1024*1024); + int pl[]={0, 1,1,98,4079, 1,1,2954,2057, 76,34,912,0,234,1000,1000, 1000,300,-1}; + int inptr=0,i,j; + ogg_page og[5]; + + ogg_stream_reset(&os_en); + + for(i=0;pl[i]!=-1;i++){ + ogg_packet op; + int len=pl[i]; + + op.packet=data+inptr; + op.bytes=len; + op.e_o_s=(pl[i+1]<0?1:0); + op.granulepos=(i+1)*1000; + + for(j=0;j0)error(); + + /* Test fractional page inputs: incomplete fixed header */ + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + /* Test fractional page inputs: incomplete header */ + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, + 5); + ogg_sync_wrote(&oy,5); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + /* Test fractional page inputs: incomplete body */ + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, + og[1].header_len-28); + ogg_sync_wrote(&oy,og[1].header_len-28); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); + ogg_sync_wrote(&oy,1000); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, + og[1].body_len-1000); + ogg_sync_wrote(&oy,og[1].body_len-1000); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test fractional page inputs: page + incomplete capture */ + { + ogg_page og_de; + fprintf(stderr,"Testing sync on 1+partial inputs... "); + ogg_sync_reset(&oy); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, + og[1].header_len-20); + ogg_sync_wrote(&oy,og[1].header_len-20); + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test recapture: garbage + page */ + { + ogg_page og_de; + fprintf(stderr,"Testing search for capture... "); + ogg_sync_reset(&oy); + + /* 'garbage' */ + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + 20); + ogg_sync_wrote(&oy,20); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, + og[2].header_len-20); + ogg_sync_wrote(&oy,og[2].header_len-20); + memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, + og[2].body_len); + ogg_sync_wrote(&oy,og[2].body_len); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Test recapture: page + garbage + page */ + { + ogg_page og_de; + fprintf(stderr,"Testing recapture... "); + ogg_sync_reset(&oy); + + memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, + og[1].header_len); + ogg_sync_wrote(&oy,og[1].header_len); + + memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, + og[1].body_len); + ogg_sync_wrote(&oy,og[1].body_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + og[2].header_len); + ogg_sync_wrote(&oy,og[2].header_len); + + memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, + og[2].header_len); + ogg_sync_wrote(&oy,og[2].header_len); + + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, + og[2].body_len-5); + ogg_sync_wrote(&oy,og[2].body_len-5); + + memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, + og[3].header_len); + ogg_sync_wrote(&oy,og[3].header_len); + + memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, + og[3].body_len); + ogg_sync_wrote(&oy,og[3].body_len); + + if(ogg_sync_pageout(&oy,&og_de)>0)error(); + if(ogg_sync_pageout(&oy,&og_de)<=0)error(); + + fprintf(stderr,"ok.\n"); + } + + /* Free page data that was previously copied */ + { + for(i=0;i<5;i++){ + free_page(&og[i]); + } + } + } + + return(0); +} + +#endif diff --git a/Mednafen/mednafen/tremor/info.c b/Mednafen/mednafen/tremor/info.c new file mode 100644 index 0000000000..0225976b2f --- /dev/null +++ b/Mednafen/mednafen/tremor/info.c @@ -0,0 +1,390 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: maintain the info structure, info <-> header packets + + ********************************************************************/ + +/* general handling of the header and the vorbis_info structure (and + substructures) */ + +#include +#include +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "codebook.h" +#include "registry.h" +#include "window.h" +#include "misc.h" + +/* helpers */ +static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ + while(bytes--){ + *buf++=oggpack_read(o,8); + } +} + +void vorbis_comment_init(vorbis_comment *vc){ + memset(vc,0,sizeof(*vc)); +} + +/* This is more or less the same as strncasecmp - but that doesn't exist + * everywhere, and this is a fairly trivial function, so we include it */ +static int tagcompare(const char *s1, const char *s2, int n){ + int c=0; + while(c < n){ + if(toupper(s1[c]) != toupper(s2[c])) + return !0; + c++; + } + return 0; +} + +char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count){ + long i; + int found = 0; + int taglen = strlen(tag)+1; /* +1 for the = we append */ + char *fulltag = (char *)alloca(taglen+ 1); + + strcpy(fulltag, tag); + strcat(fulltag, "="); + + for(i=0;icomments;i++){ + if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ + if(count == found) + /* We return a pointer to the data, not a copy */ + return vc->user_comments[i] + taglen; + else + found++; + } + } + return NULL; /* didn't find anything */ +} + +int vorbis_comment_query_count(vorbis_comment *vc, char *tag){ + int i,count=0; + int taglen = strlen(tag)+1; /* +1 for the = we append */ + char *fulltag = (char *)alloca(taglen+1); + strcpy(fulltag,tag); + strcat(fulltag, "="); + + for(i=0;icomments;i++){ + if(!tagcompare(vc->user_comments[i], fulltag, taglen)) + count++; + } + + return count; +} + +void vorbis_comment_clear(vorbis_comment *vc){ + if(vc){ + long i; + if(vc->user_comments){ + for(i=0;icomments;i++) + if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); + _ogg_free(vc->user_comments); + } + if(vc->comment_lengths)_ogg_free(vc->comment_lengths); + if(vc->vendor)_ogg_free(vc->vendor); + memset(vc,0,sizeof(*vc)); + } +} + +/* blocksize 0 is guaranteed to be short, 1 is guarantted to be long. + They may be equal, but short will never ge greater than long */ +int vorbis_info_blocksize(vorbis_info *vi,int zo){ + codec_setup_info *ci = (codec_setup_info *)vi->codec_setup; + return ci ? ci->blocksizes[zo] : -1; +} + +/* used by synthesis, which has a full, alloced vi */ +void vorbis_info_init(vorbis_info *vi){ + memset(vi,0,sizeof(*vi)); + vi->codec_setup=(codec_setup_info *)_ogg_calloc(1,sizeof(codec_setup_info)); +} + +void vorbis_info_clear(vorbis_info *vi){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int i; + + if(ci){ + + for(i=0;imodes;i++) + if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); + + for(i=0;imaps;i++) /* unpack does the range checking */ + if(ci->map_param[i]) + _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); + + for(i=0;ifloors;i++) /* unpack does the range checking */ + if(ci->floor_param[i]) + _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); + + for(i=0;iresidues;i++) /* unpack does the range checking */ + if(ci->residue_param[i]) + _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); + + for(i=0;ibooks;i++){ + if(ci->book_param[i]){ + /* knows if the book was not alloced */ + vorbis_staticbook_destroy(ci->book_param[i]); + } + if(ci->fullbooks) + vorbis_book_clear(ci->fullbooks+i); + } + if(ci->fullbooks) + _ogg_free(ci->fullbooks); + + _ogg_free(ci); + } + + memset(vi,0,sizeof(*vi)); +} + +/* Header packing/unpacking ********************************************/ + +static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + if(!ci)return(OV_EFAULT); + + vi->version=oggpack_read(opb,32); + if(vi->version!=0)return(OV_EVERSION); + + vi->channels=oggpack_read(opb,8); + vi->rate=oggpack_read(opb,32); + + vi->bitrate_upper=oggpack_read(opb,32); + vi->bitrate_nominal=oggpack_read(opb,32); + vi->bitrate_lower=oggpack_read(opb,32); + + ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; + if(vi->channels<1)goto err_out; + if(ci->blocksizes[0]<64)goto err_out; + if(ci->blocksizes[1]blocksizes[0])goto err_out; + if(ci->blocksizes[1]>8192)goto err_out; + + if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ + + return(0); + err_out: + vorbis_info_clear(vi); + return(OV_EBADHEADER); +} + +static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ + int i; + int vendorlen; + vendorlen=oggpack_read(opb,32); + if(vendorlen<0)goto err_out; + if(vendorlen>opb->storage-oggpack_bytes(opb))goto err_out; + vc->vendor=(char *)_ogg_calloc(vendorlen+1,1); + if(vc->vendor==NULL)goto err_out; + _v_readstring(opb,vc->vendor,vendorlen); + i=oggpack_read(opb,32); + if(i<0||i>=INT_MAX||i>(opb->storage-oggpack_bytes(opb))>>2)goto err_out; + vc->user_comments=(char **)_ogg_calloc(i+1,sizeof(*vc->user_comments)); + vc->comment_lengths=(int *)_ogg_calloc(i+1, sizeof(*vc->comment_lengths)); + if(vc->user_comments==NULL||vc->comment_lengths==NULL)goto err_out; + vc->comments=i; + + for(i=0;icomments;i++){ + int len=oggpack_read(opb,32); + if(len<0||len>opb->storage-oggpack_bytes(opb))goto err_out; + vc->comment_lengths[i]=len; + vc->user_comments[i]=(char *)_ogg_calloc(len+1,1); + if(vc->user_comments[i]==NULL){ + vc->comments=i; + goto err_out; + } + _v_readstring(opb,vc->user_comments[i],len); + } + if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ + + return(0); + err_out: + vorbis_comment_clear(vc); + return(OV_EBADHEADER); +} + +/* all of the real encoding details are here. The modes, books, + everything */ +static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + int i; + if(!ci)return(OV_EFAULT); + + /* codebooks */ + ci->books=oggpack_read(opb,8)+1; + if(ci->books<=0)goto err_out; + for(i=0;ibooks;i++){ + ci->book_param[i]=vorbis_staticbook_unpack(opb); + if(!ci->book_param[i])goto err_out; + } + + /* time backend settings */ + ci->times=oggpack_read(opb,6)+1; + if(ci->times<=0)goto err_out; + for(i=0;itimes;i++){ + ci->time_type[i]=oggpack_read(opb,16); + if(ci->time_type[i]<0 || ci->time_type[i]>=VI_TIMEB)goto err_out; + /* ci->time_param[i]=_time_P[ci->time_type[i]]->unpack(vi,opb); + Vorbis I has no time backend */ + /*if(!ci->time_param[i])goto err_out;*/ + } + + /* floor backend settings */ + ci->floors=oggpack_read(opb,6)+1; + if(ci->floors<=0)goto err_out; + for(i=0;ifloors;i++){ + ci->floor_type[i]=oggpack_read(opb,16); + if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; + ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); + if(!ci->floor_param[i])goto err_out; + } + + /* residue backend settings */ + ci->residues=oggpack_read(opb,6)+1; + if(ci->residues<=0)goto err_out; + for(i=0;iresidues;i++){ + ci->residue_type[i]=oggpack_read(opb,16); + if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; + ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); + if(!ci->residue_param[i])goto err_out; + } + + /* map backend settings */ + ci->maps=oggpack_read(opb,6)+1; + if(ci->maps<=0)goto err_out; + for(i=0;imaps;i++){ + ci->map_type[i]=oggpack_read(opb,16); + if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; + ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); + if(!ci->map_param[i])goto err_out; + } + + /* mode settings */ + ci->modes=oggpack_read(opb,6)+1; + if(ci->modes<=0)goto err_out; + for(i=0;imodes;i++){ + ci->mode_param[i]=(vorbis_info_mode *)_ogg_calloc(1,sizeof(*ci->mode_param[i])); + ci->mode_param[i]->blockflag=oggpack_read(opb,1); + ci->mode_param[i]->windowtype=oggpack_read(opb,16); + ci->mode_param[i]->transformtype=oggpack_read(opb,16); + ci->mode_param[i]->mapping=oggpack_read(opb,8); + + if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; + if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; + if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; + if(ci->mode_param[i]->mapping<0)goto err_out; + } + + if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ + + return(0); + err_out: + vorbis_info_clear(vi); + return(OV_EBADHEADER); +} + +/* Is this packet a vorbis ID header? */ +int vorbis_synthesis_idheader(ogg_packet *op){ + oggpack_buffer opb; + char buffer[6]; + + if(op){ + oggpack_readinit(&opb,op->packet,op->bytes); + + if(!op->b_o_s) + return(0); /* Not the initial packet */ + + if(oggpack_read(&opb,8) != 1) + return 0; /* not an ID header */ + + memset(buffer,0,6); + _v_readstring(&opb,buffer,6); + if(memcmp(buffer,"vorbis",6)) + return 0; /* not vorbis */ + + return 1; + } + + return 0; +} + +/* The Vorbis header is in three packets; the initial small packet in + the first page that identifies basic parameters, a second packet + with bitstream comments and a third packet that holds the + codebook. */ + +int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ + oggpack_buffer opb; + + if(op){ + oggpack_readinit(&opb,op->packet,op->bytes); + + /* Which of the three types of header is this? */ + /* Also verify header-ness, vorbis */ + { + char buffer[6]; + int packtype=oggpack_read(&opb,8); + memset(buffer,0,6); + _v_readstring(&opb,buffer,6); + if(memcmp(buffer,"vorbis",6)){ + /* not a vorbis header */ + return(OV_ENOTVORBIS); + } + switch(packtype){ + case 0x01: /* least significant *bit* is read first */ + if(!op->b_o_s){ + /* Not the initial packet */ + return(OV_EBADHEADER); + } + if(vi->rate!=0){ + /* previously initialized info header */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_info(vi,&opb)); + + case 0x03: /* least significant *bit* is read first */ + if(vi->rate==0){ + /* um... we didn't get the initial header */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_comment(vc,&opb)); + + case 0x05: /* least significant *bit* is read first */ + if(vi->rate==0 || vc->vendor==NULL){ + /* um... we didn;t get the initial header or comments yet */ + return(OV_EBADHEADER); + } + + return(_vorbis_unpack_books(vi,&opb)); + + default: + /* Not a valid vorbis header type */ + return(OV_EBADHEADER); + break; + } + } + } + return(OV_EBADHEADER); +} + diff --git a/Mednafen/mednafen/tremor/iseeking_example.c b/Mednafen/mednafen/tremor/iseeking_example.c new file mode 100644 index 0000000000..de534eba7e --- /dev/null +++ b/Mednafen/mednafen/tremor/iseeking_example.c @@ -0,0 +1,265 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: illustrate seeking, and test it too + last mod: $Id: iseeking_example.c 16037 2009-05-26 21:10:58Z xiphmont $ + + ********************************************************************/ + +#include +#include +#include "ivorbiscodec.h" +#include "ivorbisfile.h" + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +# include +# include +#endif + +void _verify(OggVorbis_File *ov, + ogg_int64_t val, + ogg_int64_t pcmval, + ogg_int64_t timeval, + ogg_int64_t pcmlength, + char *bigassbuffer){ + int j; + long bread; + char buffer[4096]; + int dummy; + ogg_int64_t pos; + + /* verify the raw position, the pcm position and position decode */ + if(val!=-1 && ov_raw_tell(ov)pcmval){ + fprintf(stderr,"pcm position out of tolerance: requested %ld, got %ld\n", + (long)pcmval,(long)ov_pcm_tell(ov)); + exit(1); + } + if(timeval!=-1 && ov_time_tell(ov)>timeval){ + fprintf(stderr,"time position out of tolerance: requested %ld, got %ld\n", + (long)timeval,(long)ov_time_tell(ov)); + exit(1); + } + pos=ov_pcm_tell(ov); + if(pos<0 || pos>pcmlength){ + fprintf(stderr,"pcm position out of bounds: got %ld\n",(long)pos); + exit(1); + } + bread=ov_read(ov,buffer,4096,&dummy); + if(bigassbuffer){ + for(j=0;jchannels!=2){ + fprintf(stderr,"Sorry; right now seeking_test can only use Vorbis files\n" + "that are entirely stereo.\n\n"); + exit(1); + } + } + + /* because we want to do sample-level verification that the seek + does what it claimed, decode the entire file into memory */ + pcmlength=ov_pcm_total(&ov,-1); + timelength=ov_time_total(&ov,-1); + bigassbuffer=malloc(pcmlength*4); /* w00t */ + if(bigassbuffer){ + i=0; + while(ival+1){ + fprintf(stderr,"Declared position didn't perfectly match request: %ld != %ld\n", + (long)val,(long)ov_time_tell(&ov)); + exit(1); + } + + _verify(&ov,-1,-1,val,pcmlength,bigassbuffer); + + } + } + + fprintf(stderr,"\r \nOK.\n\n"); + + + }else{ + fprintf(stderr,"Standard input was not seekable.\n"); + } + + ov_clear(&ov); + return 0; +} + + + + + + + + + + + + + diff --git a/Mednafen/mednafen/tremor/ivorbiscodec.h b/Mednafen/mednafen/tremor/ivorbiscodec.h new file mode 100644 index 0000000000..25e6509de1 --- /dev/null +++ b/Mednafen/mednafen/tremor/ivorbiscodec.h @@ -0,0 +1,204 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis codec headers + + ********************************************************************/ + +#ifndef _vorbis_codec_h_ +#define _vorbis_codec_h_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include "ogg.h" + +typedef struct vorbis_info{ + int version; + int channels; + long rate; + + /* The below bitrate declarations are *hints*. + Combinations of the three values carry the following implications: + + all three set to the same value: + implies a fixed rate bitstream + only nominal set: + implies a VBR stream that averages the nominal bitrate. No hard + upper/lower limit + upper and or lower set: + implies a VBR bitstream that obeys the bitrate limits. nominal + may also be set to give a nominal rate. + none set: + the coder does not care to speculate. + */ + + long bitrate_upper; + long bitrate_nominal; + long bitrate_lower; + long bitrate_window; + + void *codec_setup; +} vorbis_info; + +/* vorbis_dsp_state buffers the current vorbis audio + analysis/synthesis state. The DSP state belongs to a specific + logical bitstream ****************************************************/ +typedef struct vorbis_dsp_state{ + int analysisp; + vorbis_info *vi; + + ogg_int32_t **pcm; + ogg_int32_t **pcmret; + int pcm_storage; + int pcm_current; + int pcm_returned; + + int preextrapolate; + int eofflag; + + long lW; + long W; + long nW; + long centerW; + + ogg_int64_t granulepos; + ogg_int64_t sequence; + + void *backend_state; +} vorbis_dsp_state; + +typedef struct vorbis_block{ + /* necessary stream state for linking to the framing abstraction */ + ogg_int32_t **pcm; /* this is a pointer into local storage */ + oggpack_buffer opb; + + long lW; + long W; + long nW; + int pcmend; + int mode; + + int eofflag; + ogg_int64_t granulepos; + ogg_int64_t sequence; + vorbis_dsp_state *vd; /* For read-only access of configuration */ + + /* local storage to avoid remallocing; it's up to the mapping to + structure it */ + void *localstore; + long localtop; + long localalloc; + long totaluse; + struct alloc_chain *reap; + +} vorbis_block; + +/* vorbis_block is a single block of data to be processed as part of +the analysis/synthesis stream; it belongs to a specific logical +bitstream, but is independant from other vorbis_blocks belonging to +that logical bitstream. *************************************************/ + +struct alloc_chain{ + void *ptr; + struct alloc_chain *next; +}; + +/* vorbis_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). vorbis_info and substructures are in backends.h. +*********************************************************************/ + +/* the comments are not part of vorbis_info so that vorbis_info can be + static storage */ +typedef struct vorbis_comment{ + /* unlimited user comment fields. libvorbis writes 'libvorbis' + whatever vendor is set to in encode */ + char **user_comments; + int *comment_lengths; + int comments; + char *vendor; + +} vorbis_comment; + + +/* libvorbis encodes in two abstraction layers; first we perform DSP + and produce a packet (see docs/analysis.txt). The packet is then + coded into a framed OggSquish bitstream by the second layer (see + docs/framing.txt). Decode is the reverse process; we sync/frame + the bitstream and extract individual packets, then decode the + packet back into PCM audio. + + The extra framing/packetizing is used in streaming formats, such as + files. Over the net (such as with UDP), the framing and + packetization aren't necessary as they're provided by the transport + and the streaming layer is not used */ + +/* Vorbis PRIMITIVES: general ***************************************/ + +extern void vorbis_info_init(vorbis_info *vi); +extern void vorbis_info_clear(vorbis_info *vi); +extern int vorbis_info_blocksize(vorbis_info *vi,int zo); +extern void vorbis_comment_init(vorbis_comment *vc); +extern void vorbis_comment_add(vorbis_comment *vc, char *comment); +extern void vorbis_comment_add_tag(vorbis_comment *vc, + char *tag, char *contents); +extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); +extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); +extern void vorbis_comment_clear(vorbis_comment *vc); + +extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); +extern int vorbis_block_clear(vorbis_block *vb); +extern void vorbis_dsp_clear(vorbis_dsp_state *v); + +/* Vorbis PRIMITIVES: synthesis layer *******************************/ +extern int vorbis_synthesis_idheader(ogg_packet *op); +extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, + ogg_packet *op); + +extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); +extern int vorbis_synthesis_restart(vorbis_dsp_state *v); +extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); +extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); +extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); +extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,ogg_int32_t ***pcm); +extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); +extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); + +/* Vorbis ERRORS and return codes ***********************************/ + +#define OV_FALSE -1 +#define OV_EOF -2 +#define OV_HOLE -3 + +#define OV_EREAD -128 +#define OV_EFAULT -129 +#define OV_EIMPL -130 +#define OV_EINVAL -131 +#define OV_ENOTVORBIS -132 +#define OV_EBADHEADER -133 +#define OV_EVERSION -134 +#define OV_ENOTAUDIO -135 +#define OV_EBADPACKET -136 +#define OV_EBADLINK -137 +#define OV_ENOSEEK -138 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/Mednafen/mednafen/tremor/ivorbisfile.h b/Mednafen/mednafen/tremor/ivorbisfile.h new file mode 100644 index 0000000000..fda62056db --- /dev/null +++ b/Mednafen/mednafen/tremor/ivorbisfile.h @@ -0,0 +1,130 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + + ********************************************************************/ + +#ifndef _OV_FILE_H_ +#define _OV_FILE_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include +#include "ivorbiscodec.h" + +#define CHUNKSIZE 1024 +/* The function prototypes for the callbacks are basically the same as for + * the stdio functions fread, fseek, fclose, ftell. + * The one difference is that the FILE * arguments have been replaced with + * a void * - this is to be used as a pointer to whatever internal data these + * functions might need. In the stdio case, it's just a FILE * cast to a void * + * + * If you use other functions, check the docs for these functions and return + * the right values. For seek_func(), you *MUST* return -1 if the stream is + * unseekable + */ +typedef struct { + size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); + int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); + int (*close_func) (void *datasource); + long (*tell_func) (void *datasource); +} ov_callbacks; + +#define NOTOPEN 0 +#define PARTOPEN 1 +#define OPENED 2 +#define STREAMSET 3 +#define INITSET 4 + +typedef struct OggVorbis_File { + void *datasource; /* Pointer to a FILE *, etc. */ + int seekable; + ogg_int64_t offset; + ogg_int64_t end; + ogg_sync_state oy; + + /* If the FILE handle isn't seekable (eg, a pipe), only the current + stream appears */ + int links; + ogg_int64_t *offsets; + ogg_int64_t *dataoffsets; + ogg_uint32_t *serialnos; + ogg_int64_t *pcmlengths; + vorbis_info *vi; + vorbis_comment *vc; + + /* Decoding working state local storage */ + ogg_int64_t pcm_offset; + int ready_state; + ogg_uint32_t current_serialno; + int current_link; + + ogg_int64_t bittrack; + ogg_int64_t samptrack; + + ogg_stream_state os; /* take physical pages, weld into a logical + stream of packets */ + vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ + vorbis_block vb; /* local working space for packet->PCM decode */ + + ov_callbacks callbacks; + +} OggVorbis_File; + +extern int ov_clear(OggVorbis_File *vf); +extern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); + +extern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); +extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, + const char *initial, long ibytes, ov_callbacks callbacks); +extern int ov_test_open(OggVorbis_File *vf); + +extern long ov_bitrate(OggVorbis_File *vf,int i); +extern long ov_bitrate_instant(OggVorbis_File *vf); +extern long ov_streams(OggVorbis_File *vf); +extern long ov_seekable(OggVorbis_File *vf); +extern long ov_serialnumber(OggVorbis_File *vf,int i); + +extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); +extern ogg_int64_t ov_time_total(OggVorbis_File *vf,int i); + +extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek(OggVorbis_File *vf,ogg_int64_t pos); +extern int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t pos); + +extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); +extern ogg_int64_t ov_time_tell(OggVorbis_File *vf); + +extern vorbis_info *ov_info(OggVorbis_File *vf,int link); +extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); + +extern long ov_read(OggVorbis_File *vf,char *buffer,int length, + int *bitstream); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + + diff --git a/Mednafen/mednafen/tremor/ivorbisfile_example.c b/Mednafen/mednafen/tremor/ivorbisfile_example.c new file mode 100644 index 0000000000..7b0cf109ab --- /dev/null +++ b/Mednafen/mednafen/tremor/ivorbisfile_example.c @@ -0,0 +1,91 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: simple example decoder using vorbisidec + + ********************************************************************/ + +/* Takes a vorbis bitstream from stdin and writes raw stereo PCM to + stdout using vorbisfile. Using vorbisfile is much simpler than + dealing with libvorbis. */ + +#include +#include +#include "ivorbiscodec.h" +#include "ivorbisfile.h" + +#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */ +#include +#include +#endif + +char pcmout[4096]; /* take 4k out of the data segment, not the stack */ + +int main(){ + OggVorbis_File vf; + int eof=0; + int current_section; + +#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */ + /* Beware the evil ifdef. We avoid these where we can, but this one we + cannot. Don't add any more, you'll probably go to hell if you do. */ + _setmode( _fileno( stdin ), _O_BINARY ); + _setmode( _fileno( stdout ), _O_BINARY ); +#endif + + if(ov_open(stdin, &vf, NULL, 0) < 0) { + fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n"); + exit(1); + } + + /* Throw the comments plus a few lines about the bitstream we're + decoding */ + { + char **ptr=ov_comment(&vf,-1)->user_comments; + vorbis_info *vi=ov_info(&vf,-1); + while(*ptr){ + fprintf(stderr,"%s\n",*ptr); + ++ptr; + } + fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate); + fprintf(stderr,"\nDecoded length: %ld samples\n", + (long)ov_pcm_total(&vf,-1)); + fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor); + } + + while(!eof){ + long ret=ov_read(&vf,pcmout,sizeof(pcmout),¤t_section); + if (ret == 0) { + /* EOF */ + eof=1; + } else if (ret < 0) { + if(ret==OV_EBADLINK){ + fprintf(stderr,"Corrupt bitstream section! Exiting.\n"); + exit(1); + } + + /* some other error in the stream. Not a problem, just reporting it in + case we (the app) cares. In this case, we don't. */ + } else { + /* we don't bother dealing with sample rate changes, etc, but + you'll have to*/ + fwrite(pcmout,1,ret,stdout); + } + } + + /* cleanup */ + ov_clear(&vf); + + fprintf(stderr,"Done.\n"); + return(0); +} diff --git a/Mednafen/mednafen/tremor/lsp_lookup.h b/Mednafen/mednafen/tremor/lsp_lookup.h new file mode 100644 index 0000000000..fa84851887 --- /dev/null +++ b/Mednafen/mednafen/tremor/lsp_lookup.h @@ -0,0 +1,136 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: lookup data + + ********************************************************************/ + +#ifndef _V_LOOKUP_DATA_H_ +#define _V_LOOKUP_DATA_H_ + +#include "os_types.h" + +#define FROMdB_LOOKUP_SZ 35 +#define FROMdB2_LOOKUP_SZ 32 +#define FROMdB_SHIFT 5 +#define FROMdB2_SHIFT 3 +#define FROMdB2_MASK 31 + +static const ogg_int32_t FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ + 0x003fffff, 0x0028619b, 0x00197a96, 0x0010137a, + 0x000a24b0, 0x00066666, 0x000409c3, 0x00028c42, + 0x00019b8c, 0x000103ab, 0x0000a3d7, 0x00006760, + 0x0000413a, 0x00002928, 0x000019f8, 0x00001062, + 0x00000a56, 0x00000686, 0x0000041e, 0x00000299, + 0x000001a3, 0x00000109, 0x000000a7, 0x00000069, + 0x00000042, 0x0000002a, 0x0000001a, 0x00000011, + 0x0000000b, 0x00000007, 0x00000004, 0x00000003, + 0x00000002, 0x00000001, 0x00000001}; + +static const ogg_int32_t FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ + 0x000001fc, 0x000001f5, 0x000001ee, 0x000001e7, + 0x000001e0, 0x000001d9, 0x000001d2, 0x000001cc, + 0x000001c5, 0x000001bf, 0x000001b8, 0x000001b2, + 0x000001ac, 0x000001a6, 0x000001a0, 0x0000019a, + 0x00000194, 0x0000018e, 0x00000188, 0x00000183, + 0x0000017d, 0x00000178, 0x00000172, 0x0000016d, + 0x00000168, 0x00000163, 0x0000015e, 0x00000159, + 0x00000154, 0x0000014f, 0x0000014a, 0x00000145, +}; + +#define INVSQ_LOOKUP_I_SHIFT 10 +#define INVSQ_LOOKUP_I_MASK 1023 +static const long INVSQ_LOOKUP_I[64+1]={ + 92682, 91966, 91267, 90583, + 89915, 89261, 88621, 87995, + 87381, 86781, 86192, 85616, + 85051, 84497, 83953, 83420, + 82897, 82384, 81880, 81385, + 80899, 80422, 79953, 79492, + 79039, 78594, 78156, 77726, + 77302, 76885, 76475, 76072, + 75674, 75283, 74898, 74519, + 74146, 73778, 73415, 73058, + 72706, 72359, 72016, 71679, + 71347, 71019, 70695, 70376, + 70061, 69750, 69444, 69141, + 68842, 68548, 68256, 67969, + 67685, 67405, 67128, 66855, + 66585, 66318, 66054, 65794, + 65536, +}; + +static const long INVSQ_LOOKUP_IDel[64]={ + 716, 699, 684, 668, + 654, 640, 626, 614, + 600, 589, 576, 565, + 554, 544, 533, 523, + 513, 504, 495, 486, + 477, 469, 461, 453, + 445, 438, 430, 424, + 417, 410, 403, 398, + 391, 385, 379, 373, + 368, 363, 357, 352, + 347, 343, 337, 332, + 328, 324, 319, 315, + 311, 306, 303, 299, + 294, 292, 287, 284, + 280, 277, 273, 270, + 267, 264, 260, 258, +}; + +#define COS_LOOKUP_I_SHIFT 9 +#define COS_LOOKUP_I_MASK 511 +#define COS_LOOKUP_I_SZ 128 +static const ogg_int32_t COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ + 16384, 16379, 16364, 16340, + 16305, 16261, 16207, 16143, + 16069, 15986, 15893, 15791, + 15679, 15557, 15426, 15286, + 15137, 14978, 14811, 14635, + 14449, 14256, 14053, 13842, + 13623, 13395, 13160, 12916, + 12665, 12406, 12140, 11866, + 11585, 11297, 11003, 10702, + 10394, 10080, 9760, 9434, + 9102, 8765, 8423, 8076, + 7723, 7366, 7005, 6639, + 6270, 5897, 5520, 5139, + 4756, 4370, 3981, 3590, + 3196, 2801, 2404, 2006, + 1606, 1205, 804, 402, + 0, -401, -803, -1204, + -1605, -2005, -2403, -2800, + -3195, -3589, -3980, -4369, + -4755, -5138, -5519, -5896, + -6269, -6638, -7004, -7365, + -7722, -8075, -8422, -8764, + -9101, -9433, -9759, -10079, + -10393, -10701, -11002, -11296, + -11584, -11865, -12139, -12405, + -12664, -12915, -13159, -13394, + -13622, -13841, -14052, -14255, + -14448, -14634, -14810, -14977, + -15136, -15285, -15425, -15556, + -15678, -15790, -15892, -15985, + -16068, -16142, -16206, -16260, + -16304, -16339, -16363, -16378, + -16383, +}; + +#endif + + + + + diff --git a/Mednafen/mednafen/tremor/mapping0.c b/Mednafen/mednafen/tremor/mapping0.c new file mode 100644 index 0000000000..de050efce9 --- /dev/null +++ b/Mednafen/mednafen/tremor/mapping0.c @@ -0,0 +1,328 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: channel mapping 0 implementation + + ********************************************************************/ + +#include +#include +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "mdct.h" +#include "codec_internal.h" +#include "codebook.h" +#include "window.h" +#include "registry.h" +#include "misc.h" + +/* simplistic, wasteful way of doing this (unique lookup for each + mode/submapping); there should be a central repository for + identical lookups. That will require minor work, so I'm putting it + off as low priority. + + Why a lookup for each backend in a given mode? Because the + blocksize is set by the mode, and low backend lookups may require + parameters from other areas of the mode/mapping */ + +typedef struct { + vorbis_info_mode *mode; + vorbis_info_mapping0 *map; + + vorbis_look_floor **floor_look; + + vorbis_look_residue **residue_look; + + vorbis_func_floor **floor_func; + vorbis_func_residue **residue_func; + + int ch; + long lastframe; /* if a different mode is called, we need to + invalidate decay */ +} vorbis_look_mapping0; + +static void mapping0_free_info(vorbis_info_mapping *i){ + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +static void mapping0_free_look(vorbis_look_mapping *look){ + int i; + vorbis_look_mapping0 *l=(vorbis_look_mapping0 *)look; + if(l){ + + for(i=0;imap->submaps;i++){ + l->floor_func[i]->free_look(l->floor_look[i]); + l->residue_func[i]->free_look(l->residue_look[i]); + } + + _ogg_free(l->floor_func); + _ogg_free(l->residue_func); + _ogg_free(l->floor_look); + _ogg_free(l->residue_look); + memset(l,0,sizeof(*l)); + _ogg_free(l); + } +} + +static vorbis_look_mapping *mapping0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, + vorbis_info_mapping *m){ + int i; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)_ogg_calloc(1,sizeof(*look)); + vorbis_info_mapping0 *info=look->map=(vorbis_info_mapping0 *)m; + look->mode=vm; + + look->floor_look=(vorbis_look_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_look)); + + look->residue_look=(vorbis_look_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_look)); + + look->floor_func=(vorbis_func_floor **)_ogg_calloc(info->submaps,sizeof(*look->floor_func)); + look->residue_func=(vorbis_func_residue **)_ogg_calloc(info->submaps,sizeof(*look->residue_func)); + + for(i=0;isubmaps;i++){ + int floornum=info->floorsubmap[i]; + int resnum=info->residuesubmap[i]; + + look->floor_func[i]=_floor_P[ci->floor_type[floornum]]; + look->floor_look[i]=look->floor_func[i]-> + look(vd,vm,ci->floor_param[floornum]); + look->residue_func[i]=_residue_P[ci->residue_type[resnum]]; + look->residue_look[i]=look->residue_func[i]-> + look(vd,vm,ci->residue_param[resnum]); + + } + + look->ch=vi->channels; + + return(look); +} + +static int ilog(unsigned int v){ + int ret=0; + if(v)--v; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* also responsible for range checking */ +static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ + int i,b; + vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)_ogg_calloc(1,sizeof(*info)); + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + memset(info,0,sizeof(*info)); + + b=oggpack_read(opb,1); + if(b<0)goto err_out; + if(b){ + info->submaps=oggpack_read(opb,4)+1; + if(info->submaps<=0)goto err_out; + }else + info->submaps=1; + + b=oggpack_read(opb,1); + if(b<0)goto err_out; + if(b){ + info->coupling_steps=oggpack_read(opb,8)+1; + if(info->coupling_steps<=0)goto err_out; + for(i=0;icoupling_steps;i++){ + int testM=info->coupling_mag[i]=oggpack_read(opb,ilog(vi->channels)); + int testA=info->coupling_ang[i]=oggpack_read(opb,ilog(vi->channels)); + + if(testM<0 || + testA<0 || + testM==testA || + testM>=vi->channels || + testA>=vi->channels) goto err_out; + } + + } + + if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */ + + if(info->submaps>1){ + for(i=0;ichannels;i++){ + info->chmuxlist[i]=oggpack_read(opb,4); + if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out; + } + } + for(i=0;isubmaps;i++){ + int temp=oggpack_read(opb,8); + if(temp>=ci->times)goto err_out; + info->floorsubmap[i]=oggpack_read(opb,8); + if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out; + info->residuesubmap[i]=oggpack_read(opb,8); + if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0) + goto err_out; + } + + return info; + + err_out: + mapping0_free_info(info); + return(NULL); +} + +static int seq=0; +static int mapping0_inverse(vorbis_block *vb,vorbis_look_mapping *l){ + vorbis_dsp_state *vd=vb->vd; + vorbis_info *vi=vd->vi; + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + private_state *b=(private_state *)vd->backend_state; + vorbis_look_mapping0 *look=(vorbis_look_mapping0 *)l; + vorbis_info_mapping0 *info=look->map; + + int i,j; + long n=vb->pcmend=ci->blocksizes[vb->W]; + + ogg_int32_t **pcmbundle=(ogg_int32_t **)alloca(sizeof(*pcmbundle)*vi->channels); + int *zerobundle=(int *)alloca(sizeof(*zerobundle)*vi->channels); + + int *nonzero =(int *)alloca(sizeof(*nonzero)*vi->channels); + void **floormemo=(void **)alloca(sizeof(*floormemo)*vi->channels); + + /* time domain information decode (note that applying the + information would have to happen later; we'll probably add a + function entry to the harness for that later */ + /* NOT IMPLEMENTED */ + + /* recover the spectral envelope; store it in the PCM vector for now */ + for(i=0;ichannels;i++){ + int submap=info->chmuxlist[i]; + floormemo[i]=look->floor_func[submap]-> + inverse1(vb,look->floor_look[submap]); + if(floormemo[i]) + nonzero[i]=1; + else + nonzero[i]=0; + memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); + } + + /* channel coupling can 'dirty' the nonzero listing */ + for(i=0;icoupling_steps;i++){ + if(nonzero[info->coupling_mag[i]] || + nonzero[info->coupling_ang[i]]){ + nonzero[info->coupling_mag[i]]=1; + nonzero[info->coupling_ang[i]]=1; + } + } + + /* recover the residue into our working vectors */ + for(i=0;isubmaps;i++){ + int ch_in_bundle=0; + for(j=0;jchannels;j++){ + if(info->chmuxlist[j]==i){ + if(nonzero[j]) + zerobundle[ch_in_bundle]=1; + else + zerobundle[ch_in_bundle]=0; + pcmbundle[ch_in_bundle++]=vb->pcm[j]; + } + } + + look->residue_func[i]->inverse(vb,look->residue_look[i], + pcmbundle,zerobundle,ch_in_bundle); + } + + //for(j=0;jchannels;j++) + //_analysis_output("coupled",seq+j,vb->pcm[j],-8,n/2,0,0); + + + /* channel coupling */ + for(i=info->coupling_steps-1;i>=0;i--){ + ogg_int32_t *pcmM=vb->pcm[info->coupling_mag[i]]; + ogg_int32_t *pcmA=vb->pcm[info->coupling_ang[i]]; + + for(j=0;j0) + if(ang>0){ + pcmM[j]=mag; + pcmA[j]=mag-ang; + }else{ + pcmA[j]=mag; + pcmM[j]=mag+ang; + } + else + if(ang>0){ + pcmM[j]=mag; + pcmA[j]=mag+ang; + }else{ + pcmA[j]=mag; + pcmM[j]=mag-ang; + } + } + } + + //for(j=0;jchannels;j++) + //_analysis_output("residue",seq+j,vb->pcm[j],-8,n/2,0,0); + + /* compute and apply spectral envelope */ + for(i=0;ichannels;i++){ + ogg_int32_t *pcm=vb->pcm[i]; + int submap=info->chmuxlist[i]; + look->floor_func[submap]-> + inverse2(vb,look->floor_look[submap],floormemo[i],pcm); + } + + //for(j=0;jchannels;j++) + //_analysis_output("mdct",seq+j,vb->pcm[j],-24,n/2,0,1); + + /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ + /* only MDCT right now.... */ + for(i=0;ichannels;i++){ + ogg_int32_t *pcm=vb->pcm[i]; + mdct_backward(n,pcm,pcm); + } + + //for(j=0;jchannels;j++) + //_analysis_output("imdct",seq+j,vb->pcm[j],-24,n,0,0); + + /* window the data */ + for(i=0;ichannels;i++){ + ogg_int32_t *pcm=vb->pcm[i]; + if(nonzero[i]) + _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); + else + for(j=0;jchannels;j++) + //_analysis_output("window",seq+j,vb->pcm[j],-24,n,0,0); + + seq+=vi->channels; + /* all done! */ + return(0); +} + +/* export hooks */ +vorbis_func_mapping mapping0_exportbundle={ + &mapping0_unpack, + &mapping0_look, + &mapping0_free_info, + &mapping0_free_look, + &mapping0_inverse +}; diff --git a/Mednafen/mednafen/tremor/mdct.c b/Mednafen/mednafen/tremor/mdct.c new file mode 100644 index 0000000000..4f39e7d531 --- /dev/null +++ b/Mednafen/mednafen/tremor/mdct.c @@ -0,0 +1,510 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: normalized modified discrete cosine transform + power of two length transform only [64 <= n ] + last mod: $Id: mdct.c,v 1.9 2002/10/16 09:17:39 xiphmont Exp $ + + Original algorithm adapted long ago from _The use of multirate filter + banks for coding of high quality digital audio_, by T. Sporer, + K. Brandenburg and B. Edler, collection of the European Signal + Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp + 211-214 + + The below code implements an algorithm that no longer looks much like + that presented in the paper, but the basic structure remains if you + dig deep enough to see it. + + This module DOES NOT INCLUDE code to generate/apply the window + function. Everybody has their own weird favorite including me... I + happen to like the properties of y=sin(.5PI*sin^2(x)), but others may + vehemently disagree. + + ********************************************************************/ + +#include "ivorbiscodec.h" +#include "codebook.h" +#include "misc.h" +#include "mdct.h" +#include "mdct_lookup.h" + + +/* 8 point butterfly (in place) */ +STIN void mdct_butterfly_8(DATA_TYPE *x){ + + REG_TYPE r0 = x[4] + x[0]; + REG_TYPE r1 = x[4] - x[0]; + REG_TYPE r2 = x[5] + x[1]; + REG_TYPE r3 = x[5] - x[1]; + REG_TYPE r4 = x[6] + x[2]; + REG_TYPE r5 = x[6] - x[2]; + REG_TYPE r6 = x[7] + x[3]; + REG_TYPE r7 = x[7] - x[3]; + + x[0] = r5 + r3; + x[1] = r7 - r1; + x[2] = r5 - r3; + x[3] = r7 + r1; + x[4] = r4 - r0; + x[5] = r6 - r2; + x[6] = r4 + r0; + x[7] = r6 + r2; + MB(); +} + +/* 16 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_16(DATA_TYPE *x){ + + REG_TYPE r0, r1; + + r0 = x[ 0] - x[ 8]; x[ 8] += x[ 0]; + r1 = x[ 1] - x[ 9]; x[ 9] += x[ 1]; + x[ 0] = MULT31((r0 + r1) , cPI2_8); + x[ 1] = MULT31((r1 - r0) , cPI2_8); + MB(); + + r0 = x[10] - x[ 2]; x[10] += x[ 2]; + r1 = x[ 3] - x[11]; x[11] += x[ 3]; + x[ 2] = r1; x[ 3] = r0; + MB(); + + r0 = x[12] - x[ 4]; x[12] += x[ 4]; + r1 = x[13] - x[ 5]; x[13] += x[ 5]; + x[ 4] = MULT31((r0 - r1) , cPI2_8); + x[ 5] = MULT31((r0 + r1) , cPI2_8); + MB(); + + r0 = x[14] - x[ 6]; x[14] += x[ 6]; + r1 = x[15] - x[ 7]; x[15] += x[ 7]; + x[ 6] = r0; x[ 7] = r1; + MB(); + + mdct_butterfly_8(x); + mdct_butterfly_8(x+8); +} + +/* 32 point butterfly (in place, 4 register) */ +STIN void mdct_butterfly_32(DATA_TYPE *x){ + + REG_TYPE r0, r1; + + r0 = x[30] - x[14]; x[30] += x[14]; + r1 = x[31] - x[15]; x[31] += x[15]; + x[14] = r0; x[15] = r1; + MB(); + + r0 = x[28] - x[12]; x[28] += x[12]; + r1 = x[29] - x[13]; x[29] += x[13]; + XNPROD31( r0, r1, cPI1_8, cPI3_8, &x[12], &x[13] ); + MB(); + + r0 = x[26] - x[10]; x[26] += x[10]; + r1 = x[27] - x[11]; x[27] += x[11]; + x[10] = MULT31((r0 - r1) , cPI2_8); + x[11] = MULT31((r0 + r1) , cPI2_8); + MB(); + + r0 = x[24] - x[ 8]; x[24] += x[ 8]; + r1 = x[25] - x[ 9]; x[25] += x[ 9]; + XNPROD31( r0, r1, cPI3_8, cPI1_8, &x[ 8], &x[ 9] ); + MB(); + + r0 = x[22] - x[ 6]; x[22] += x[ 6]; + r1 = x[ 7] - x[23]; x[23] += x[ 7]; + x[ 6] = r1; x[ 7] = r0; + MB(); + + r0 = x[ 4] - x[20]; x[20] += x[ 4]; + r1 = x[ 5] - x[21]; x[21] += x[ 5]; + XPROD31 ( r0, r1, cPI3_8, cPI1_8, &x[ 4], &x[ 5] ); + MB(); + + r0 = x[ 2] - x[18]; x[18] += x[ 2]; + r1 = x[ 3] - x[19]; x[19] += x[ 3]; + x[ 2] = MULT31((r1 + r0) , cPI2_8); + x[ 3] = MULT31((r1 - r0) , cPI2_8); + MB(); + + r0 = x[ 0] - x[16]; x[16] += x[ 0]; + r1 = x[ 1] - x[17]; x[17] += x[ 1]; + XPROD31 ( r0, r1, cPI1_8, cPI3_8, &x[ 0], &x[ 1] ); + MB(); + + mdct_butterfly_16(x); + mdct_butterfly_16(x+16); +} + +/* N/stage point generic N stage butterfly (in place, 2 register) */ +STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){ + + LOOKUP_T *T = sincos_lookup0; + DATA_TYPE *x1 = x + points - 8; + DATA_TYPE *x2 = x + (points>>1) - 8; + REG_TYPE r0; + REG_TYPE r1; + + do{ + r0 = x1[6] - x2[6]; x1[6] += x2[6]; + r1 = x2[7] - x1[7]; x1[7] += x2[7]; + XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; + + r0 = x1[4] - x2[4]; x1[4] += x2[4]; + r1 = x2[5] - x1[5]; x1[5] += x2[5]; + XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step; + + r0 = x1[2] - x2[2]; x1[2] += x2[2]; + r1 = x2[3] - x1[3]; x1[3] += x2[3]; + XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; + + r0 = x1[0] - x2[0]; x1[0] += x2[0]; + r1 = x2[1] - x1[1]; x1[1] += x2[1]; + XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step; + + x1-=8; x2-=8; + }while(Tsincos_lookup0); + do{ + r0 = x2[6] - x1[6]; x1[6] += x2[6]; + r1 = x2[7] - x1[7]; x1[7] += x2[7]; + XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; + + r0 = x2[4] - x1[4]; x1[4] += x2[4]; + r1 = x2[5] - x1[5]; x1[5] += x2[5]; + XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step; + + r0 = x2[2] - x1[2]; x1[2] += x2[2]; + r1 = x2[3] - x1[3]; x1[3] += x2[3]; + XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; + + r0 = x2[0] - x1[0]; x1[0] += x2[0]; + r1 = x2[1] - x1[1]; x1[1] += x2[1]; + XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step; + + x1-=8; x2-=8; + }while(Tsincos_lookup0); +} + +STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift){ + + int stages=8-shift; + int i,j; + + for(i=0;--stages>0;i++){ + for(j=0;j<(1<>i)*j,points>>i,4<<(i+shift)); + } + + for(j=0;j>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); +} + +STIN void mdct_bitreverse(DATA_TYPE *x,int n,int step,int shift){ + + int bit = 0; + DATA_TYPE *w0 = x; + DATA_TYPE *w1 = x = w0+(n>>1); + LOOKUP_T *T = (step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; + LOOKUP_T *Ttop = T+1024; + DATA_TYPE r2; + + do{ + DATA_TYPE r3 = bitrev12(bit++); + DATA_TYPE *x0 = x + ((r3 ^ 0xfff)>>shift) -1; + DATA_TYPE *x1 = x + (r3>>shift); + + REG_TYPE r0 = x0[0] + x1[0]; + REG_TYPE r1 = x1[1] - x0[1]; + + XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; + + w1 -= 4; + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[0] = r0 + r2; + w0[1] = r1 + r3; + w1[2] = r0 - r2; + w1[3] = r3 - r1; + + r3 = bitrev12(bit++); + x0 = x + ((r3 ^ 0xfff)>>shift) -1; + x1 = x + (r3>>shift); + + r0 = x0[0] + x1[0]; + r1 = x1[1] - x0[1]; + + XPROD32( r0, r1, T[1], T[0], &r2, &r3 ); T+=step; + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[2] = r0 + r2; + w0[3] = r1 + r3; + w1[0] = r0 - r2; + w1[1] = r3 - r1; + + w0 += 4; + }while(T>shift) -1; + DATA_TYPE *x1 = x + (r3>>shift); + + REG_TYPE r0 = x0[0] + x1[0]; + REG_TYPE r1 = x1[1] - x0[1]; + + T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); + + w1 -= 4; + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[0] = r0 + r2; + w0[1] = r1 + r3; + w1[2] = r0 - r2; + w1[3] = r3 - r1; + + r3 = bitrev12(bit++); + x0 = x + ((r3 ^ 0xfff)>>shift) -1; + x1 = x + (r3>>shift); + + r0 = x0[0] + x1[0]; + r1 = x1[1] - x0[1]; + + T-=step; XPROD32( r0, r1, T[0], T[1], &r2, &r3 ); + + r0 = (x0[1] + x1[1])>>1; + r1 = (x0[0] - x1[0])>>1; + w0[2] = r0 + r2; + w0[3] = r1 + r3; + w1[0] = r0 - r2; + w1[1] = r3 - r1; + + w0 += 4; + }while(w0>1; + int n4=n>>2; + DATA_TYPE *iX; + DATA_TYPE *oX; + LOOKUP_T *T; + LOOKUP_T *V; + int shift; + int step; + + for (shift=6;!(n&(1<=in+n4); + do{ + oX-=4; + XPROD31( iX[4], iX[6], T[1], T[0], &oX[2], &oX[3] ); T-=step; + XPROD31( iX[0], iX[2], T[1], T[0], &oX[0], &oX[1] ); T-=step; + iX-=8; + }while(iX>=in); + + iX = in+n2-8; + oX = out+n2+n4; + T = sincos_lookup0; + + do{ + T+=step; XNPROD31( iX[6], iX[4], T[0], T[1], &oX[0], &oX[1] ); + T+=step; XNPROD31( iX[2], iX[0], T[0], T[1], &oX[2], &oX[3] ); + iX-=8; + oX+=4; + }while(iX>=in+n4); + do{ + T-=step; XNPROD31( iX[6], iX[4], T[1], T[0], &oX[0], &oX[1] ); + T-=step; XNPROD31( iX[2], iX[0], T[1], T[0], &oX[2], &oX[3] ); + iX-=8; + oX+=4; + }while(iX>=in); + + mdct_butterflies(out+n2,n2,shift); + mdct_bitreverse(out,n,step,shift); + + /* rotate + window */ + + step>>=2; + { + DATA_TYPE *oX1=out+n2+n4; + DATA_TYPE *oX2=out+n2+n4; + DATA_TYPE *iX =out; + + switch(step) { + default: { + T=(step>=4)?(sincos_lookup0+(step>>1)):sincos_lookup1; + do{ + oX1-=4; + XPROD31( iX[0], -iX[1], T[0], T[1], &oX1[3], &oX2[0] ); T+=step; + XPROD31( iX[2], -iX[3], T[0], T[1], &oX1[2], &oX2[1] ); T+=step; + XPROD31( iX[4], -iX[5], T[0], T[1], &oX1[1], &oX2[2] ); T+=step; + XPROD31( iX[6], -iX[7], T[0], T[1], &oX1[0], &oX2[3] ); T+=step; + oX2+=4; + iX+=8; + }while(iX>1; + t1 = (*T++)>>1; + do{ + oX1-=4; + + t0 += (v0 = (*V++)>>1); + t1 += (v1 = (*V++)>>1); + XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); + v0 += (t0 = (*T++)>>1); + v1 += (t1 = (*T++)>>1); + XPROD31( iX[2], -iX[3], v0, v1, &oX1[2], &oX2[1] ); + t0 += (v0 = (*V++)>>1); + t1 += (v1 = (*V++)>>1); + XPROD31( iX[4], -iX[5], t0, t1, &oX1[1], &oX2[2] ); + v0 += (t0 = (*T++)>>1); + v1 += (t1 = (*T++)>>1); + XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); + + oX2+=4; + iX+=8; + }while(iX>2); + t1 += (q1 = (v1-t1)>>2); + XPROD31( iX[0], -iX[1], t0, t1, &oX1[3], &oX2[0] ); + t0 = v0-q0; + t1 = v1-q1; + XPROD31( iX[2], -iX[3], t0, t1, &oX1[2], &oX2[1] ); + + t0 = *T++; + t1 = *T++; + v0 += (q0 = (t0-v0)>>2); + v1 += (q1 = (t1-v1)>>2); + XPROD31( iX[4], -iX[5], v0, v1, &oX1[1], &oX2[2] ); + v0 = t0-q0; + v1 = t1-q1; + XPROD31( iX[6], -iX[7], v0, v1, &oX1[0], &oX2[3] ); + + oX2+=4; + iX+=8; + }while(iXoX2); + } +} + diff --git a/Mednafen/mednafen/tremor/mdct.h b/Mednafen/mednafen/tremor/mdct.h new file mode 100644 index 0000000000..6d8890720c --- /dev/null +++ b/Mednafen/mednafen/tremor/mdct.h @@ -0,0 +1,52 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: modified discrete cosine transform prototypes + + ********************************************************************/ + +#ifndef _OGG_mdct_H_ +#define _OGG_mdct_H_ + +#include "ivorbiscodec.h" +#include "misc.h" + +#define DATA_TYPE ogg_int32_t +#define REG_TYPE register ogg_int32_t + +#ifdef _LOW_ACCURACY_ +#define cPI3_8 (0x0062) +#define cPI2_8 (0x00b5) +#define cPI1_8 (0x00ed) +#else +#define cPI3_8 (0x30fbc54d) +#define cPI2_8 (0x5a82799a) +#define cPI1_8 (0x7641af3d) +#endif + +extern void mdct_forward(int n, DATA_TYPE *in, DATA_TYPE *out); +extern void mdct_backward(int n, DATA_TYPE *in, DATA_TYPE *out); + +#endif + + + + + + + + + + + + diff --git a/Mednafen/mednafen/tremor/mdct_lookup.h b/Mednafen/mednafen/tremor/mdct_lookup.h new file mode 100644 index 0000000000..ee4f101c27 --- /dev/null +++ b/Mednafen/mednafen/tremor/mdct_lookup.h @@ -0,0 +1,540 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: sin,cos lookup tables + + ********************************************************************/ + +#include "misc.h" + +/* {sin(2*i*PI/4096), cos(2*i*PI/4096)}, with i = 0 to 512 */ +static const LOOKUP_T sincos_lookup0[1026] = { + X(0x00000000), X(0x7fffffff), X(0x003243f5), X(0x7ffff621), + X(0x006487e3), X(0x7fffd886), X(0x0096cbc1), X(0x7fffa72c), + X(0x00c90f88), X(0x7fff6216), X(0x00fb5330), X(0x7fff0943), + X(0x012d96b1), X(0x7ffe9cb2), X(0x015fda03), X(0x7ffe1c65), + X(0x01921d20), X(0x7ffd885a), X(0x01c45ffe), X(0x7ffce093), + X(0x01f6a297), X(0x7ffc250f), X(0x0228e4e2), X(0x7ffb55ce), + X(0x025b26d7), X(0x7ffa72d1), X(0x028d6870), X(0x7ff97c18), + X(0x02bfa9a4), X(0x7ff871a2), X(0x02f1ea6c), X(0x7ff75370), + X(0x03242abf), X(0x7ff62182), X(0x03566a96), X(0x7ff4dbd9), + X(0x0388a9ea), X(0x7ff38274), X(0x03bae8b2), X(0x7ff21553), + X(0x03ed26e6), X(0x7ff09478), X(0x041f6480), X(0x7feeffe1), + X(0x0451a177), X(0x7fed5791), X(0x0483ddc3), X(0x7feb9b85), + X(0x04b6195d), X(0x7fe9cbc0), X(0x04e8543e), X(0x7fe7e841), + X(0x051a8e5c), X(0x7fe5f108), X(0x054cc7b1), X(0x7fe3e616), + X(0x057f0035), X(0x7fe1c76b), X(0x05b137df), X(0x7fdf9508), + X(0x05e36ea9), X(0x7fdd4eec), X(0x0615a48b), X(0x7fdaf519), + X(0x0647d97c), X(0x7fd8878e), X(0x067a0d76), X(0x7fd6064c), + X(0x06ac406f), X(0x7fd37153), X(0x06de7262), X(0x7fd0c8a3), + X(0x0710a345), X(0x7fce0c3e), X(0x0742d311), X(0x7fcb3c23), + X(0x077501be), X(0x7fc85854), X(0x07a72f45), X(0x7fc560cf), + X(0x07d95b9e), X(0x7fc25596), X(0x080b86c2), X(0x7fbf36aa), + X(0x083db0a7), X(0x7fbc040a), X(0x086fd947), X(0x7fb8bdb8), + X(0x08a2009a), X(0x7fb563b3), X(0x08d42699), X(0x7fb1f5fc), + X(0x09064b3a), X(0x7fae7495), X(0x09386e78), X(0x7faadf7c), + X(0x096a9049), X(0x7fa736b4), X(0x099cb0a7), X(0x7fa37a3c), + X(0x09cecf89), X(0x7f9faa15), X(0x0a00ece8), X(0x7f9bc640), + X(0x0a3308bd), X(0x7f97cebd), X(0x0a6522fe), X(0x7f93c38c), + X(0x0a973ba5), X(0x7f8fa4b0), X(0x0ac952aa), X(0x7f8b7227), + X(0x0afb6805), X(0x7f872bf3), X(0x0b2d7baf), X(0x7f82d214), + X(0x0b5f8d9f), X(0x7f7e648c), X(0x0b919dcf), X(0x7f79e35a), + X(0x0bc3ac35), X(0x7f754e80), X(0x0bf5b8cb), X(0x7f70a5fe), + X(0x0c27c389), X(0x7f6be9d4), X(0x0c59cc68), X(0x7f671a05), + X(0x0c8bd35e), X(0x7f62368f), X(0x0cbdd865), X(0x7f5d3f75), + X(0x0cefdb76), X(0x7f5834b7), X(0x0d21dc87), X(0x7f531655), + X(0x0d53db92), X(0x7f4de451), X(0x0d85d88f), X(0x7f489eaa), + X(0x0db7d376), X(0x7f434563), X(0x0de9cc40), X(0x7f3dd87c), + X(0x0e1bc2e4), X(0x7f3857f6), X(0x0e4db75b), X(0x7f32c3d1), + X(0x0e7fa99e), X(0x7f2d1c0e), X(0x0eb199a4), X(0x7f2760af), + X(0x0ee38766), X(0x7f2191b4), X(0x0f1572dc), X(0x7f1baf1e), + X(0x0f475bff), X(0x7f15b8ee), X(0x0f7942c7), X(0x7f0faf25), + X(0x0fab272b), X(0x7f0991c4), X(0x0fdd0926), X(0x7f0360cb), + X(0x100ee8ad), X(0x7efd1c3c), X(0x1040c5bb), X(0x7ef6c418), + X(0x1072a048), X(0x7ef05860), X(0x10a4784b), X(0x7ee9d914), + X(0x10d64dbd), X(0x7ee34636), X(0x11082096), X(0x7edc9fc6), + X(0x1139f0cf), X(0x7ed5e5c6), X(0x116bbe60), X(0x7ecf1837), + X(0x119d8941), X(0x7ec8371a), X(0x11cf516a), X(0x7ec14270), + X(0x120116d5), X(0x7eba3a39), X(0x1232d979), X(0x7eb31e78), + X(0x1264994e), X(0x7eabef2c), X(0x1296564d), X(0x7ea4ac58), + X(0x12c8106f), X(0x7e9d55fc), X(0x12f9c7aa), X(0x7e95ec1a), + X(0x132b7bf9), X(0x7e8e6eb2), X(0x135d2d53), X(0x7e86ddc6), + X(0x138edbb1), X(0x7e7f3957), X(0x13c0870a), X(0x7e778166), + X(0x13f22f58), X(0x7e6fb5f4), X(0x1423d492), X(0x7e67d703), + X(0x145576b1), X(0x7e5fe493), X(0x148715ae), X(0x7e57dea7), + X(0x14b8b17f), X(0x7e4fc53e), X(0x14ea4a1f), X(0x7e47985b), + X(0x151bdf86), X(0x7e3f57ff), X(0x154d71aa), X(0x7e37042a), + X(0x157f0086), X(0x7e2e9cdf), X(0x15b08c12), X(0x7e26221f), + X(0x15e21445), X(0x7e1d93ea), X(0x16139918), X(0x7e14f242), + X(0x16451a83), X(0x7e0c3d29), X(0x1676987f), X(0x7e0374a0), + X(0x16a81305), X(0x7dfa98a8), X(0x16d98a0c), X(0x7df1a942), + X(0x170afd8d), X(0x7de8a670), X(0x173c6d80), X(0x7ddf9034), + X(0x176dd9de), X(0x7dd6668f), X(0x179f429f), X(0x7dcd2981), + X(0x17d0a7bc), X(0x7dc3d90d), X(0x1802092c), X(0x7dba7534), + X(0x183366e9), X(0x7db0fdf8), X(0x1864c0ea), X(0x7da77359), + X(0x18961728), X(0x7d9dd55a), X(0x18c7699b), X(0x7d9423fc), + X(0x18f8b83c), X(0x7d8a5f40), X(0x192a0304), X(0x7d808728), + X(0x195b49ea), X(0x7d769bb5), X(0x198c8ce7), X(0x7d6c9ce9), + X(0x19bdcbf3), X(0x7d628ac6), X(0x19ef0707), X(0x7d58654d), + X(0x1a203e1b), X(0x7d4e2c7f), X(0x1a517128), X(0x7d43e05e), + X(0x1a82a026), X(0x7d3980ec), X(0x1ab3cb0d), X(0x7d2f0e2b), + X(0x1ae4f1d6), X(0x7d24881b), X(0x1b161479), X(0x7d19eebf), + X(0x1b4732ef), X(0x7d0f4218), X(0x1b784d30), X(0x7d048228), + X(0x1ba96335), X(0x7cf9aef0), X(0x1bda74f6), X(0x7ceec873), + X(0x1c0b826a), X(0x7ce3ceb2), X(0x1c3c8b8c), X(0x7cd8c1ae), + X(0x1c6d9053), X(0x7ccda169), X(0x1c9e90b8), X(0x7cc26de5), + X(0x1ccf8cb3), X(0x7cb72724), X(0x1d00843d), X(0x7cabcd28), + X(0x1d31774d), X(0x7ca05ff1), X(0x1d6265dd), X(0x7c94df83), + X(0x1d934fe5), X(0x7c894bde), X(0x1dc4355e), X(0x7c7da505), + X(0x1df5163f), X(0x7c71eaf9), X(0x1e25f282), X(0x7c661dbc), + X(0x1e56ca1e), X(0x7c5a3d50), X(0x1e879d0d), X(0x7c4e49b7), + X(0x1eb86b46), X(0x7c4242f2), X(0x1ee934c3), X(0x7c362904), + X(0x1f19f97b), X(0x7c29fbee), X(0x1f4ab968), X(0x7c1dbbb3), + X(0x1f7b7481), X(0x7c116853), X(0x1fac2abf), X(0x7c0501d2), + X(0x1fdcdc1b), X(0x7bf88830), X(0x200d888d), X(0x7bebfb70), + X(0x203e300d), X(0x7bdf5b94), X(0x206ed295), X(0x7bd2a89e), + X(0x209f701c), X(0x7bc5e290), X(0x20d0089c), X(0x7bb9096b), + X(0x21009c0c), X(0x7bac1d31), X(0x21312a65), X(0x7b9f1de6), + X(0x2161b3a0), X(0x7b920b89), X(0x219237b5), X(0x7b84e61f), + X(0x21c2b69c), X(0x7b77ada8), X(0x21f3304f), X(0x7b6a6227), + X(0x2223a4c5), X(0x7b5d039e), X(0x225413f8), X(0x7b4f920e), + X(0x22847de0), X(0x7b420d7a), X(0x22b4e274), X(0x7b3475e5), + X(0x22e541af), X(0x7b26cb4f), X(0x23159b88), X(0x7b190dbc), + X(0x2345eff8), X(0x7b0b3d2c), X(0x23763ef7), X(0x7afd59a4), + X(0x23a6887f), X(0x7aef6323), X(0x23d6cc87), X(0x7ae159ae), + X(0x24070b08), X(0x7ad33d45), X(0x243743fa), X(0x7ac50dec), + X(0x24677758), X(0x7ab6cba4), X(0x2497a517), X(0x7aa8766f), + X(0x24c7cd33), X(0x7a9a0e50), X(0x24f7efa2), X(0x7a8b9348), + X(0x25280c5e), X(0x7a7d055b), X(0x2558235f), X(0x7a6e648a), + X(0x2588349d), X(0x7a5fb0d8), X(0x25b84012), X(0x7a50ea47), + X(0x25e845b6), X(0x7a4210d8), X(0x26184581), X(0x7a332490), + X(0x26483f6c), X(0x7a24256f), X(0x26783370), X(0x7a151378), + X(0x26a82186), X(0x7a05eead), X(0x26d809a5), X(0x79f6b711), + X(0x2707ebc7), X(0x79e76ca7), X(0x2737c7e3), X(0x79d80f6f), + X(0x27679df4), X(0x79c89f6e), X(0x27976df1), X(0x79b91ca4), + X(0x27c737d3), X(0x79a98715), X(0x27f6fb92), X(0x7999dec4), + X(0x2826b928), X(0x798a23b1), X(0x2856708d), X(0x797a55e0), + X(0x288621b9), X(0x796a7554), X(0x28b5cca5), X(0x795a820e), + X(0x28e5714b), X(0x794a7c12), X(0x29150fa1), X(0x793a6361), + X(0x2944a7a2), X(0x792a37fe), X(0x29743946), X(0x7919f9ec), + X(0x29a3c485), X(0x7909a92d), X(0x29d34958), X(0x78f945c3), + X(0x2a02c7b8), X(0x78e8cfb2), X(0x2a323f9e), X(0x78d846fb), + X(0x2a61b101), X(0x78c7aba2), X(0x2a911bdc), X(0x78b6fda8), + X(0x2ac08026), X(0x78a63d11), X(0x2aefddd8), X(0x789569df), + X(0x2b1f34eb), X(0x78848414), X(0x2b4e8558), X(0x78738bb3), + X(0x2b7dcf17), X(0x786280bf), X(0x2bad1221), X(0x7851633b), + X(0x2bdc4e6f), X(0x78403329), X(0x2c0b83fa), X(0x782ef08b), + X(0x2c3ab2b9), X(0x781d9b65), X(0x2c69daa6), X(0x780c33b8), + X(0x2c98fbba), X(0x77fab989), X(0x2cc815ee), X(0x77e92cd9), + X(0x2cf72939), X(0x77d78daa), X(0x2d263596), X(0x77c5dc01), + X(0x2d553afc), X(0x77b417df), X(0x2d843964), X(0x77a24148), + X(0x2db330c7), X(0x7790583e), X(0x2de2211e), X(0x777e5cc3), + X(0x2e110a62), X(0x776c4edb), X(0x2e3fec8b), X(0x775a2e89), + X(0x2e6ec792), X(0x7747fbce), X(0x2e9d9b70), X(0x7735b6af), + X(0x2ecc681e), X(0x77235f2d), X(0x2efb2d95), X(0x7710f54c), + X(0x2f29ebcc), X(0x76fe790e), X(0x2f58a2be), X(0x76ebea77), + X(0x2f875262), X(0x76d94989), X(0x2fb5fab2), X(0x76c69647), + X(0x2fe49ba7), X(0x76b3d0b4), X(0x30133539), X(0x76a0f8d2), + X(0x3041c761), X(0x768e0ea6), X(0x30705217), X(0x767b1231), + X(0x309ed556), X(0x76680376), X(0x30cd5115), X(0x7654e279), + X(0x30fbc54d), X(0x7641af3d), X(0x312a31f8), X(0x762e69c4), + X(0x3158970e), X(0x761b1211), X(0x3186f487), X(0x7607a828), + X(0x31b54a5e), X(0x75f42c0b), X(0x31e39889), X(0x75e09dbd), + X(0x3211df04), X(0x75ccfd42), X(0x32401dc6), X(0x75b94a9c), + X(0x326e54c7), X(0x75a585cf), X(0x329c8402), X(0x7591aedd), + X(0x32caab6f), X(0x757dc5ca), X(0x32f8cb07), X(0x7569ca99), + X(0x3326e2c3), X(0x7555bd4c), X(0x3354f29b), X(0x75419de7), + X(0x3382fa88), X(0x752d6c6c), X(0x33b0fa84), X(0x751928e0), + X(0x33def287), X(0x7504d345), X(0x340ce28b), X(0x74f06b9e), + X(0x343aca87), X(0x74dbf1ef), X(0x3468aa76), X(0x74c7663a), + X(0x34968250), X(0x74b2c884), X(0x34c4520d), X(0x749e18cd), + X(0x34f219a8), X(0x7489571c), X(0x351fd918), X(0x74748371), + X(0x354d9057), X(0x745f9dd1), X(0x357b3f5d), X(0x744aa63f), + X(0x35a8e625), X(0x74359cbd), X(0x35d684a6), X(0x74208150), + X(0x36041ad9), X(0x740b53fb), X(0x3631a8b8), X(0x73f614c0), + X(0x365f2e3b), X(0x73e0c3a3), X(0x368cab5c), X(0x73cb60a8), + X(0x36ba2014), X(0x73b5ebd1), X(0x36e78c5b), X(0x73a06522), + X(0x3714f02a), X(0x738acc9e), X(0x37424b7b), X(0x73752249), + X(0x376f9e46), X(0x735f6626), X(0x379ce885), X(0x73499838), + X(0x37ca2a30), X(0x7333b883), X(0x37f76341), X(0x731dc70a), + X(0x382493b0), X(0x7307c3d0), X(0x3851bb77), X(0x72f1aed9), + X(0x387eda8e), X(0x72db8828), X(0x38abf0ef), X(0x72c54fc1), + X(0x38d8fe93), X(0x72af05a7), X(0x39060373), X(0x7298a9dd), + X(0x3932ff87), X(0x72823c67), X(0x395ff2c9), X(0x726bbd48), + X(0x398cdd32), X(0x72552c85), X(0x39b9bebc), X(0x723e8a20), + X(0x39e6975e), X(0x7227d61c), X(0x3a136712), X(0x7211107e), + X(0x3a402dd2), X(0x71fa3949), X(0x3a6ceb96), X(0x71e35080), + X(0x3a99a057), X(0x71cc5626), X(0x3ac64c0f), X(0x71b54a41), + X(0x3af2eeb7), X(0x719e2cd2), X(0x3b1f8848), X(0x7186fdde), + X(0x3b4c18ba), X(0x716fbd68), X(0x3b78a007), X(0x71586b74), + X(0x3ba51e29), X(0x71410805), X(0x3bd19318), X(0x7129931f), + X(0x3bfdfecd), X(0x71120cc5), X(0x3c2a6142), X(0x70fa74fc), + X(0x3c56ba70), X(0x70e2cbc6), X(0x3c830a50), X(0x70cb1128), + X(0x3caf50da), X(0x70b34525), X(0x3cdb8e09), X(0x709b67c0), + X(0x3d07c1d6), X(0x708378ff), X(0x3d33ec39), X(0x706b78e3), + X(0x3d600d2c), X(0x70536771), X(0x3d8c24a8), X(0x703b44ad), + X(0x3db832a6), X(0x7023109a), X(0x3de4371f), X(0x700acb3c), + X(0x3e10320d), X(0x6ff27497), X(0x3e3c2369), X(0x6fda0cae), + X(0x3e680b2c), X(0x6fc19385), X(0x3e93e950), X(0x6fa90921), + X(0x3ebfbdcd), X(0x6f906d84), X(0x3eeb889c), X(0x6f77c0b3), + X(0x3f1749b8), X(0x6f5f02b2), X(0x3f430119), X(0x6f463383), + X(0x3f6eaeb8), X(0x6f2d532c), X(0x3f9a5290), X(0x6f1461b0), + X(0x3fc5ec98), X(0x6efb5f12), X(0x3ff17cca), X(0x6ee24b57), + X(0x401d0321), X(0x6ec92683), X(0x40487f94), X(0x6eaff099), + X(0x4073f21d), X(0x6e96a99d), X(0x409f5ab6), X(0x6e7d5193), + X(0x40cab958), X(0x6e63e87f), X(0x40f60dfb), X(0x6e4a6e66), + X(0x4121589b), X(0x6e30e34a), X(0x414c992f), X(0x6e174730), + X(0x4177cfb1), X(0x6dfd9a1c), X(0x41a2fc1a), X(0x6de3dc11), + X(0x41ce1e65), X(0x6dca0d14), X(0x41f93689), X(0x6db02d29), + X(0x42244481), X(0x6d963c54), X(0x424f4845), X(0x6d7c3a98), + X(0x427a41d0), X(0x6d6227fa), X(0x42a5311b), X(0x6d48047e), + X(0x42d0161e), X(0x6d2dd027), X(0x42faf0d4), X(0x6d138afb), + X(0x4325c135), X(0x6cf934fc), X(0x4350873c), X(0x6cdece2f), + X(0x437b42e1), X(0x6cc45698), X(0x43a5f41e), X(0x6ca9ce3b), + X(0x43d09aed), X(0x6c8f351c), X(0x43fb3746), X(0x6c748b3f), + X(0x4425c923), X(0x6c59d0a9), X(0x4450507e), X(0x6c3f055d), + X(0x447acd50), X(0x6c242960), X(0x44a53f93), X(0x6c093cb6), + X(0x44cfa740), X(0x6bee3f62), X(0x44fa0450), X(0x6bd3316a), + X(0x452456bd), X(0x6bb812d1), X(0x454e9e80), X(0x6b9ce39b), + X(0x4578db93), X(0x6b81a3cd), X(0x45a30df0), X(0x6b66536b), + X(0x45cd358f), X(0x6b4af279), X(0x45f7526b), X(0x6b2f80fb), + X(0x4621647d), X(0x6b13fef5), X(0x464b6bbe), X(0x6af86c6c), + X(0x46756828), X(0x6adcc964), X(0x469f59b4), X(0x6ac115e2), + X(0x46c9405c), X(0x6aa551e9), X(0x46f31c1a), X(0x6a897d7d), + X(0x471cece7), X(0x6a6d98a4), X(0x4746b2bc), X(0x6a51a361), + X(0x47706d93), X(0x6a359db9), X(0x479a1d67), X(0x6a1987b0), + X(0x47c3c22f), X(0x69fd614a), X(0x47ed5be6), X(0x69e12a8c), + X(0x4816ea86), X(0x69c4e37a), X(0x48406e08), X(0x69a88c19), + X(0x4869e665), X(0x698c246c), X(0x48935397), X(0x696fac78), + X(0x48bcb599), X(0x69532442), X(0x48e60c62), X(0x69368bce), + X(0x490f57ee), X(0x6919e320), X(0x49389836), X(0x68fd2a3d), + X(0x4961cd33), X(0x68e06129), X(0x498af6df), X(0x68c387e9), + X(0x49b41533), X(0x68a69e81), X(0x49dd282a), X(0x6889a4f6), + X(0x4a062fbd), X(0x686c9b4b), X(0x4a2f2be6), X(0x684f8186), + X(0x4a581c9e), X(0x683257ab), X(0x4a8101de), X(0x68151dbe), + X(0x4aa9dba2), X(0x67f7d3c5), X(0x4ad2a9e2), X(0x67da79c3), + X(0x4afb6c98), X(0x67bd0fbd), X(0x4b2423be), X(0x679f95b7), + X(0x4b4ccf4d), X(0x67820bb7), X(0x4b756f40), X(0x676471c0), + X(0x4b9e0390), X(0x6746c7d8), X(0x4bc68c36), X(0x67290e02), + X(0x4bef092d), X(0x670b4444), X(0x4c177a6e), X(0x66ed6aa1), + X(0x4c3fdff4), X(0x66cf8120), X(0x4c6839b7), X(0x66b187c3), + X(0x4c9087b1), X(0x66937e91), X(0x4cb8c9dd), X(0x6675658c), + X(0x4ce10034), X(0x66573cbb), X(0x4d092ab0), X(0x66390422), + X(0x4d31494b), X(0x661abbc5), X(0x4d595bfe), X(0x65fc63a9), + X(0x4d8162c4), X(0x65ddfbd3), X(0x4da95d96), X(0x65bf8447), + X(0x4dd14c6e), X(0x65a0fd0b), X(0x4df92f46), X(0x65826622), + X(0x4e210617), X(0x6563bf92), X(0x4e48d0dd), X(0x6545095f), + X(0x4e708f8f), X(0x6526438f), X(0x4e984229), X(0x65076e25), + X(0x4ebfe8a5), X(0x64e88926), X(0x4ee782fb), X(0x64c99498), + X(0x4f0f1126), X(0x64aa907f), X(0x4f369320), X(0x648b7ce0), + X(0x4f5e08e3), X(0x646c59bf), X(0x4f857269), X(0x644d2722), + X(0x4faccfab), X(0x642de50d), X(0x4fd420a4), X(0x640e9386), + X(0x4ffb654d), X(0x63ef3290), X(0x50229da1), X(0x63cfc231), + X(0x5049c999), X(0x63b0426d), X(0x5070e92f), X(0x6390b34a), + X(0x5097fc5e), X(0x637114cc), X(0x50bf031f), X(0x635166f9), + X(0x50e5fd6d), X(0x6331a9d4), X(0x510ceb40), X(0x6311dd64), + X(0x5133cc94), X(0x62f201ac), X(0x515aa162), X(0x62d216b3), + X(0x518169a5), X(0x62b21c7b), X(0x51a82555), X(0x6292130c), + X(0x51ced46e), X(0x6271fa69), X(0x51f576ea), X(0x6251d298), + X(0x521c0cc2), X(0x62319b9d), X(0x524295f0), X(0x6211557e), + X(0x5269126e), X(0x61f1003f), X(0x528f8238), X(0x61d09be5), + X(0x52b5e546), X(0x61b02876), X(0x52dc3b92), X(0x618fa5f7), + X(0x53028518), X(0x616f146c), X(0x5328c1d0), X(0x614e73da), + X(0x534ef1b5), X(0x612dc447), X(0x537514c2), X(0x610d05b7), + X(0x539b2af0), X(0x60ec3830), X(0x53c13439), X(0x60cb5bb7), + X(0x53e73097), X(0x60aa7050), X(0x540d2005), X(0x60897601), + X(0x5433027d), X(0x60686ccf), X(0x5458d7f9), X(0x604754bf), + X(0x547ea073), X(0x60262dd6), X(0x54a45be6), X(0x6004f819), + X(0x54ca0a4b), X(0x5fe3b38d), X(0x54efab9c), X(0x5fc26038), + X(0x55153fd4), X(0x5fa0fe1f), X(0x553ac6ee), X(0x5f7f8d46), + X(0x556040e2), X(0x5f5e0db3), X(0x5585adad), X(0x5f3c7f6b), + X(0x55ab0d46), X(0x5f1ae274), X(0x55d05faa), X(0x5ef936d1), + X(0x55f5a4d2), X(0x5ed77c8a), X(0x561adcb9), X(0x5eb5b3a2), + X(0x56400758), X(0x5e93dc1f), X(0x566524aa), X(0x5e71f606), + X(0x568a34a9), X(0x5e50015d), X(0x56af3750), X(0x5e2dfe29), + X(0x56d42c99), X(0x5e0bec6e), X(0x56f9147e), X(0x5de9cc33), + X(0x571deefa), X(0x5dc79d7c), X(0x5742bc06), X(0x5da5604f), + X(0x57677b9d), X(0x5d8314b1), X(0x578c2dba), X(0x5d60baa7), + X(0x57b0d256), X(0x5d3e5237), X(0x57d5696d), X(0x5d1bdb65), + X(0x57f9f2f8), X(0x5cf95638), X(0x581e6ef1), X(0x5cd6c2b5), + X(0x5842dd54), X(0x5cb420e0), X(0x58673e1b), X(0x5c9170bf), + X(0x588b9140), X(0x5c6eb258), X(0x58afd6bd), X(0x5c4be5b0), + X(0x58d40e8c), X(0x5c290acc), X(0x58f838a9), X(0x5c0621b2), + X(0x591c550e), X(0x5be32a67), X(0x594063b5), X(0x5bc024f0), + X(0x59646498), X(0x5b9d1154), X(0x598857b2), X(0x5b79ef96), + X(0x59ac3cfd), X(0x5b56bfbd), X(0x59d01475), X(0x5b3381ce), + X(0x59f3de12), X(0x5b1035cf), X(0x5a1799d1), X(0x5aecdbc5), + X(0x5a3b47ab), X(0x5ac973b5), X(0x5a5ee79a), X(0x5aa5fda5), + X(0x5a82799a), X(0x5a82799a) + }; + + /* {sin((2*i+1)*PI/4096), cos((2*i+1)*PI/4096)}, with i = 0 to 511 */ +static const LOOKUP_T sincos_lookup1[1024] = { + X(0x001921fb), X(0x7ffffd88), X(0x004b65ee), X(0x7fffe9cb), + X(0x007da9d4), X(0x7fffc251), X(0x00afeda8), X(0x7fff8719), + X(0x00e23160), X(0x7fff3824), X(0x011474f6), X(0x7ffed572), + X(0x0146b860), X(0x7ffe5f03), X(0x0178fb99), X(0x7ffdd4d7), + X(0x01ab3e97), X(0x7ffd36ee), X(0x01dd8154), X(0x7ffc8549), + X(0x020fc3c6), X(0x7ffbbfe6), X(0x024205e8), X(0x7ffae6c7), + X(0x027447b0), X(0x7ff9f9ec), X(0x02a68917), X(0x7ff8f954), + X(0x02d8ca16), X(0x7ff7e500), X(0x030b0aa4), X(0x7ff6bcf0), + X(0x033d4abb), X(0x7ff58125), X(0x036f8a51), X(0x7ff4319d), + X(0x03a1c960), X(0x7ff2ce5b), X(0x03d407df), X(0x7ff1575d), + X(0x040645c7), X(0x7fefcca4), X(0x04388310), X(0x7fee2e30), + X(0x046abfb3), X(0x7fec7c02), X(0x049cfba7), X(0x7feab61a), + X(0x04cf36e5), X(0x7fe8dc78), X(0x05017165), X(0x7fe6ef1c), + X(0x0533ab20), X(0x7fe4ee06), X(0x0565e40d), X(0x7fe2d938), + X(0x05981c26), X(0x7fe0b0b1), X(0x05ca5361), X(0x7fde7471), + X(0x05fc89b8), X(0x7fdc247a), X(0x062ebf22), X(0x7fd9c0ca), + X(0x0660f398), X(0x7fd74964), X(0x06932713), X(0x7fd4be46), + X(0x06c5598a), X(0x7fd21f72), X(0x06f78af6), X(0x7fcf6ce8), + X(0x0729bb4e), X(0x7fcca6a7), X(0x075bea8c), X(0x7fc9ccb2), + X(0x078e18a7), X(0x7fc6df08), X(0x07c04598), X(0x7fc3dda9), + X(0x07f27157), X(0x7fc0c896), X(0x08249bdd), X(0x7fbd9fd0), + X(0x0856c520), X(0x7fba6357), X(0x0888ed1b), X(0x7fb7132b), + X(0x08bb13c5), X(0x7fb3af4e), X(0x08ed3916), X(0x7fb037bf), + X(0x091f5d06), X(0x7facac7f), X(0x09517f8f), X(0x7fa90d8e), + X(0x0983a0a7), X(0x7fa55aee), X(0x09b5c048), X(0x7fa1949e), + X(0x09e7de6a), X(0x7f9dbaa0), X(0x0a19fb04), X(0x7f99ccf4), + X(0x0a4c1610), X(0x7f95cb9a), X(0x0a7e2f85), X(0x7f91b694), + X(0x0ab0475c), X(0x7f8d8de1), X(0x0ae25d8d), X(0x7f895182), + X(0x0b147211), X(0x7f850179), X(0x0b4684df), X(0x7f809dc5), + X(0x0b7895f0), X(0x7f7c2668), X(0x0baaa53b), X(0x7f779b62), + X(0x0bdcb2bb), X(0x7f72fcb4), X(0x0c0ebe66), X(0x7f6e4a5e), + X(0x0c40c835), X(0x7f698461), X(0x0c72d020), X(0x7f64aabf), + X(0x0ca4d620), X(0x7f5fbd77), X(0x0cd6da2d), X(0x7f5abc8a), + X(0x0d08dc3f), X(0x7f55a7fa), X(0x0d3adc4e), X(0x7f507fc7), + X(0x0d6cda53), X(0x7f4b43f2), X(0x0d9ed646), X(0x7f45f47b), + X(0x0dd0d01f), X(0x7f409164), X(0x0e02c7d7), X(0x7f3b1aad), + X(0x0e34bd66), X(0x7f359057), X(0x0e66b0c3), X(0x7f2ff263), + X(0x0e98a1e9), X(0x7f2a40d2), X(0x0eca90ce), X(0x7f247ba5), + X(0x0efc7d6b), X(0x7f1ea2dc), X(0x0f2e67b8), X(0x7f18b679), + X(0x0f604faf), X(0x7f12b67c), X(0x0f923546), X(0x7f0ca2e7), + X(0x0fc41876), X(0x7f067bba), X(0x0ff5f938), X(0x7f0040f6), + X(0x1027d784), X(0x7ef9f29d), X(0x1059b352), X(0x7ef390ae), + X(0x108b8c9b), X(0x7eed1b2c), X(0x10bd6356), X(0x7ee69217), + X(0x10ef377d), X(0x7edff570), X(0x11210907), X(0x7ed94538), + X(0x1152d7ed), X(0x7ed28171), X(0x1184a427), X(0x7ecbaa1a), + X(0x11b66dad), X(0x7ec4bf36), X(0x11e83478), X(0x7ebdc0c6), + X(0x1219f880), X(0x7eb6aeca), X(0x124bb9be), X(0x7eaf8943), + X(0x127d7829), X(0x7ea85033), X(0x12af33ba), X(0x7ea1039b), + X(0x12e0ec6a), X(0x7e99a37c), X(0x1312a230), X(0x7e922fd6), + X(0x13445505), X(0x7e8aa8ac), X(0x137604e2), X(0x7e830dff), + X(0x13a7b1bf), X(0x7e7b5fce), X(0x13d95b93), X(0x7e739e1d), + X(0x140b0258), X(0x7e6bc8eb), X(0x143ca605), X(0x7e63e03b), + X(0x146e4694), X(0x7e5be40c), X(0x149fe3fc), X(0x7e53d462), + X(0x14d17e36), X(0x7e4bb13c), X(0x1503153a), X(0x7e437a9c), + X(0x1534a901), X(0x7e3b3083), X(0x15663982), X(0x7e32d2f4), + X(0x1597c6b7), X(0x7e2a61ed), X(0x15c95097), X(0x7e21dd73), + X(0x15fad71b), X(0x7e194584), X(0x162c5a3b), X(0x7e109a24), + X(0x165dd9f0), X(0x7e07db52), X(0x168f5632), X(0x7dff0911), + X(0x16c0cef9), X(0x7df62362), X(0x16f2443e), X(0x7ded2a47), + X(0x1723b5f9), X(0x7de41dc0), X(0x17552422), X(0x7ddafdce), + X(0x17868eb3), X(0x7dd1ca75), X(0x17b7f5a3), X(0x7dc883b4), + X(0x17e958ea), X(0x7dbf298d), X(0x181ab881), X(0x7db5bc02), + X(0x184c1461), X(0x7dac3b15), X(0x187d6c82), X(0x7da2a6c6), + X(0x18aec0db), X(0x7d98ff17), X(0x18e01167), X(0x7d8f4409), + X(0x19115e1c), X(0x7d85759f), X(0x1942a6f3), X(0x7d7b93da), + X(0x1973ebe6), X(0x7d719eba), X(0x19a52ceb), X(0x7d679642), + X(0x19d669fc), X(0x7d5d7a74), X(0x1a07a311), X(0x7d534b50), + X(0x1a38d823), X(0x7d4908d9), X(0x1a6a0929), X(0x7d3eb30f), + X(0x1a9b361d), X(0x7d3449f5), X(0x1acc5ef6), X(0x7d29cd8c), + X(0x1afd83ad), X(0x7d1f3dd6), X(0x1b2ea43a), X(0x7d149ad5), + X(0x1b5fc097), X(0x7d09e489), X(0x1b90d8bb), X(0x7cff1af5), + X(0x1bc1ec9e), X(0x7cf43e1a), X(0x1bf2fc3a), X(0x7ce94dfb), + X(0x1c240786), X(0x7cde4a98), X(0x1c550e7c), X(0x7cd333f3), + X(0x1c861113), X(0x7cc80a0f), X(0x1cb70f43), X(0x7cbcccec), + X(0x1ce80906), X(0x7cb17c8d), X(0x1d18fe54), X(0x7ca618f3), + X(0x1d49ef26), X(0x7c9aa221), X(0x1d7adb73), X(0x7c8f1817), + X(0x1dabc334), X(0x7c837ad8), X(0x1ddca662), X(0x7c77ca65), + X(0x1e0d84f5), X(0x7c6c06c0), X(0x1e3e5ee5), X(0x7c602fec), + X(0x1e6f342c), X(0x7c5445e9), X(0x1ea004c1), X(0x7c4848ba), + X(0x1ed0d09d), X(0x7c3c3860), X(0x1f0197b8), X(0x7c3014de), + X(0x1f325a0b), X(0x7c23de35), X(0x1f63178f), X(0x7c179467), + X(0x1f93d03c), X(0x7c0b3777), X(0x1fc4840a), X(0x7bfec765), + X(0x1ff532f2), X(0x7bf24434), X(0x2025dcec), X(0x7be5ade6), + X(0x205681f1), X(0x7bd9047c), X(0x208721f9), X(0x7bcc47fa), + X(0x20b7bcfe), X(0x7bbf7860), X(0x20e852f6), X(0x7bb295b0), + X(0x2118e3dc), X(0x7ba59fee), X(0x21496fa7), X(0x7b989719), + X(0x2179f64f), X(0x7b8b7b36), X(0x21aa77cf), X(0x7b7e4c45), + X(0x21daf41d), X(0x7b710a49), X(0x220b6b32), X(0x7b63b543), + X(0x223bdd08), X(0x7b564d36), X(0x226c4996), X(0x7b48d225), + X(0x229cb0d5), X(0x7b3b4410), X(0x22cd12bd), X(0x7b2da2fa), + X(0x22fd6f48), X(0x7b1feee5), X(0x232dc66d), X(0x7b1227d3), + X(0x235e1826), X(0x7b044dc7), X(0x238e646a), X(0x7af660c2), + X(0x23beab33), X(0x7ae860c7), X(0x23eeec78), X(0x7ada4dd8), + X(0x241f2833), X(0x7acc27f7), X(0x244f5e5c), X(0x7abdef25), + X(0x247f8eec), X(0x7aafa367), X(0x24afb9da), X(0x7aa144bc), + X(0x24dfdf20), X(0x7a92d329), X(0x250ffeb7), X(0x7a844eae), + X(0x25401896), X(0x7a75b74f), X(0x25702cb7), X(0x7a670d0d), + X(0x25a03b11), X(0x7a584feb), X(0x25d0439f), X(0x7a497feb), + X(0x26004657), X(0x7a3a9d0f), X(0x26304333), X(0x7a2ba75a), + X(0x26603a2c), X(0x7a1c9ece), X(0x26902b39), X(0x7a0d836d), + X(0x26c01655), X(0x79fe5539), X(0x26effb76), X(0x79ef1436), + X(0x271fda96), X(0x79dfc064), X(0x274fb3ae), X(0x79d059c8), + X(0x277f86b5), X(0x79c0e062), X(0x27af53a6), X(0x79b15435), + X(0x27df1a77), X(0x79a1b545), X(0x280edb23), X(0x79920392), + X(0x283e95a1), X(0x79823f20), X(0x286e49ea), X(0x797267f2), + X(0x289df7f8), X(0x79627e08), X(0x28cd9fc1), X(0x79528167), + X(0x28fd4140), X(0x79427210), X(0x292cdc6d), X(0x79325006), + X(0x295c7140), X(0x79221b4b), X(0x298bffb2), X(0x7911d3e2), + X(0x29bb87bc), X(0x790179cd), X(0x29eb0957), X(0x78f10d0f), + X(0x2a1a847b), X(0x78e08dab), X(0x2a49f920), X(0x78cffba3), + X(0x2a796740), X(0x78bf56f9), X(0x2aa8ced3), X(0x78ae9fb0), + X(0x2ad82fd2), X(0x789dd5cb), X(0x2b078a36), X(0x788cf94c), + X(0x2b36ddf7), X(0x787c0a36), X(0x2b662b0e), X(0x786b088c), + X(0x2b957173), X(0x7859f44f), X(0x2bc4b120), X(0x7848cd83), + X(0x2bf3ea0d), X(0x7837942b), X(0x2c231c33), X(0x78264849), + X(0x2c52478a), X(0x7814e9df), X(0x2c816c0c), X(0x780378f1), + X(0x2cb089b1), X(0x77f1f581), X(0x2cdfa071), X(0x77e05f91), + X(0x2d0eb046), X(0x77ceb725), X(0x2d3db928), X(0x77bcfc3f), + X(0x2d6cbb10), X(0x77ab2ee2), X(0x2d9bb5f6), X(0x77994f11), + X(0x2dcaa9d5), X(0x77875cce), X(0x2df996a3), X(0x7775581d), + X(0x2e287c5a), X(0x776340ff), X(0x2e575af3), X(0x77511778), + X(0x2e863267), X(0x773edb8b), X(0x2eb502ae), X(0x772c8d3a), + X(0x2ee3cbc1), X(0x771a2c88), X(0x2f128d99), X(0x7707b979), + X(0x2f41482e), X(0x76f5340e), X(0x2f6ffb7a), X(0x76e29c4b), + X(0x2f9ea775), X(0x76cff232), X(0x2fcd4c19), X(0x76bd35c7), + X(0x2ffbe95d), X(0x76aa670d), X(0x302a7f3a), X(0x76978605), + X(0x30590dab), X(0x768492b4), X(0x308794a6), X(0x76718d1c), + X(0x30b61426), X(0x765e7540), X(0x30e48c22), X(0x764b4b23), + X(0x3112fc95), X(0x76380ec8), X(0x31416576), X(0x7624c031), + X(0x316fc6be), X(0x76115f63), X(0x319e2067), X(0x75fdec60), + X(0x31cc7269), X(0x75ea672a), X(0x31fabcbd), X(0x75d6cfc5), + X(0x3228ff5c), X(0x75c32634), X(0x32573a3f), X(0x75af6a7b), + X(0x32856d5e), X(0x759b9c9b), X(0x32b398b3), X(0x7587bc98), + X(0x32e1bc36), X(0x7573ca75), X(0x330fd7e1), X(0x755fc635), + X(0x333debab), X(0x754bafdc), X(0x336bf78f), X(0x7537876c), + X(0x3399fb85), X(0x75234ce8), X(0x33c7f785), X(0x750f0054), + X(0x33f5eb89), X(0x74faa1b3), X(0x3423d78a), X(0x74e63108), + X(0x3451bb81), X(0x74d1ae55), X(0x347f9766), X(0x74bd199f), + X(0x34ad6b32), X(0x74a872e8), X(0x34db36df), X(0x7493ba34), + X(0x3508fa66), X(0x747eef85), X(0x3536b5be), X(0x746a12df), + X(0x356468e2), X(0x74552446), X(0x359213c9), X(0x744023bc), + X(0x35bfb66e), X(0x742b1144), X(0x35ed50c9), X(0x7415ece2), + X(0x361ae2d3), X(0x7400b69a), X(0x36486c86), X(0x73eb6e6e), + X(0x3675edd9), X(0x73d61461), X(0x36a366c6), X(0x73c0a878), + X(0x36d0d746), X(0x73ab2ab4), X(0x36fe3f52), X(0x73959b1b), + X(0x372b9ee3), X(0x737ff9ae), X(0x3758f5f2), X(0x736a4671), + X(0x37864477), X(0x73548168), X(0x37b38a6d), X(0x733eaa96), + X(0x37e0c7cc), X(0x7328c1ff), X(0x380dfc8d), X(0x7312c7a5), + X(0x383b28a9), X(0x72fcbb8c), X(0x38684c19), X(0x72e69db7), + X(0x389566d6), X(0x72d06e2b), X(0x38c278d9), X(0x72ba2cea), + X(0x38ef821c), X(0x72a3d9f7), X(0x391c8297), X(0x728d7557), + X(0x39497a43), X(0x7276ff0d), X(0x39766919), X(0x7260771b), + X(0x39a34f13), X(0x7249dd86), X(0x39d02c2a), X(0x72333251), + X(0x39fd0056), X(0x721c7580), X(0x3a29cb91), X(0x7205a716), + X(0x3a568dd4), X(0x71eec716), X(0x3a834717), X(0x71d7d585), + X(0x3aaff755), X(0x71c0d265), X(0x3adc9e86), X(0x71a9bdba), + X(0x3b093ca3), X(0x71929789), X(0x3b35d1a5), X(0x717b5fd3), + X(0x3b625d86), X(0x7164169d), X(0x3b8ee03e), X(0x714cbbeb), + X(0x3bbb59c7), X(0x71354fc0), X(0x3be7ca1a), X(0x711dd220), + X(0x3c143130), X(0x7106430e), X(0x3c408f03), X(0x70eea28e), + X(0x3c6ce38a), X(0x70d6f0a4), X(0x3c992ec0), X(0x70bf2d53), + X(0x3cc5709e), X(0x70a7589f), X(0x3cf1a91c), X(0x708f728b), + X(0x3d1dd835), X(0x70777b1c), X(0x3d49fde1), X(0x705f7255), + X(0x3d761a19), X(0x70475839), X(0x3da22cd7), X(0x702f2ccd), + X(0x3dce3614), X(0x7016f014), X(0x3dfa35c8), X(0x6ffea212), + X(0x3e262bee), X(0x6fe642ca), X(0x3e52187f), X(0x6fcdd241), + X(0x3e7dfb73), X(0x6fb5507a), X(0x3ea9d4c3), X(0x6f9cbd79), + X(0x3ed5a46b), X(0x6f841942), X(0x3f016a61), X(0x6f6b63d8), + X(0x3f2d26a0), X(0x6f529d40), X(0x3f58d921), X(0x6f39c57d), + X(0x3f8481dd), X(0x6f20dc92), X(0x3fb020ce), X(0x6f07e285), + X(0x3fdbb5ec), X(0x6eeed758), X(0x40074132), X(0x6ed5bb10), + X(0x4032c297), X(0x6ebc8db0), X(0x405e3a16), X(0x6ea34f3d), + X(0x4089a7a8), X(0x6e89ffb9), X(0x40b50b46), X(0x6e709f2a), + X(0x40e064ea), X(0x6e572d93), X(0x410bb48c), X(0x6e3daaf8), + X(0x4136fa27), X(0x6e24175c), X(0x416235b2), X(0x6e0a72c5), + X(0x418d6729), X(0x6df0bd35), X(0x41b88e84), X(0x6dd6f6b1), + X(0x41e3abbc), X(0x6dbd1f3c), X(0x420ebecb), X(0x6da336dc), + X(0x4239c7aa), X(0x6d893d93), X(0x4264c653), X(0x6d6f3365), + X(0x428fbabe), X(0x6d551858), X(0x42baa4e6), X(0x6d3aec6e), + X(0x42e584c3), X(0x6d20afac), X(0x43105a50), X(0x6d066215), + X(0x433b2585), X(0x6cec03af), X(0x4365e65b), X(0x6cd1947c), + X(0x43909ccd), X(0x6cb71482), X(0x43bb48d4), X(0x6c9c83c3), + X(0x43e5ea68), X(0x6c81e245), X(0x44108184), X(0x6c67300b), + X(0x443b0e21), X(0x6c4c6d1a), X(0x44659039), X(0x6c319975), + X(0x449007c4), X(0x6c16b521), X(0x44ba74bd), X(0x6bfbc021), + X(0x44e4d71c), X(0x6be0ba7b), X(0x450f2edb), X(0x6bc5a431), + X(0x45397bf4), X(0x6baa7d49), X(0x4563be60), X(0x6b8f45c7), + X(0x458df619), X(0x6b73fdae), X(0x45b82318), X(0x6b58a503), + X(0x45e24556), X(0x6b3d3bcb), X(0x460c5cce), X(0x6b21c208), + X(0x46366978), X(0x6b0637c1), X(0x46606b4e), X(0x6aea9cf8), + X(0x468a624a), X(0x6acef1b2), X(0x46b44e65), X(0x6ab335f4), + X(0x46de2f99), X(0x6a9769c1), X(0x470805df), X(0x6a7b8d1e), + X(0x4731d131), X(0x6a5fa010), X(0x475b9188), X(0x6a43a29a), + X(0x478546de), X(0x6a2794c1), X(0x47aef12c), X(0x6a0b7689), + X(0x47d8906d), X(0x69ef47f6), X(0x48022499), X(0x69d3090e), + X(0x482badab), X(0x69b6b9d3), X(0x48552b9b), X(0x699a5a4c), + X(0x487e9e64), X(0x697dea7b), X(0x48a805ff), X(0x69616a65), + X(0x48d16265), X(0x6944da10), X(0x48fab391), X(0x6928397e), + X(0x4923f97b), X(0x690b88b5), X(0x494d341e), X(0x68eec7b9), + X(0x49766373), X(0x68d1f68f), X(0x499f8774), X(0x68b5153a), + X(0x49c8a01b), X(0x689823bf), X(0x49f1ad61), X(0x687b2224), + X(0x4a1aaf3f), X(0x685e106c), X(0x4a43a5b0), X(0x6840ee9b), + X(0x4a6c90ad), X(0x6823bcb7), X(0x4a957030), X(0x68067ac3), + X(0x4abe4433), X(0x67e928c5), X(0x4ae70caf), X(0x67cbc6c0), + X(0x4b0fc99d), X(0x67ae54ba), X(0x4b387af9), X(0x6790d2b6), + X(0x4b6120bb), X(0x677340ba), X(0x4b89badd), X(0x67559eca), + X(0x4bb24958), X(0x6737ecea), X(0x4bdacc28), X(0x671a2b20), + X(0x4c034345), X(0x66fc596f), X(0x4c2baea9), X(0x66de77dc), + X(0x4c540e4e), X(0x66c0866d), X(0x4c7c622d), X(0x66a28524), + X(0x4ca4aa41), X(0x66847408), X(0x4ccce684), X(0x6666531d), + X(0x4cf516ee), X(0x66482267), X(0x4d1d3b7a), X(0x6629e1ec), + X(0x4d455422), X(0x660b91af), X(0x4d6d60df), X(0x65ed31b5), + X(0x4d9561ac), X(0x65cec204), X(0x4dbd5682), X(0x65b0429f), + X(0x4de53f5a), X(0x6591b38c), X(0x4e0d1c30), X(0x657314cf), + X(0x4e34ecfc), X(0x6554666d), X(0x4e5cb1b9), X(0x6535a86b), + X(0x4e846a60), X(0x6516dacd), X(0x4eac16eb), X(0x64f7fd98), + X(0x4ed3b755), X(0x64d910d1), X(0x4efb4b96), X(0x64ba147d), + X(0x4f22d3aa), X(0x649b08a0), X(0x4f4a4f89), X(0x647bed3f), + X(0x4f71bf2e), X(0x645cc260), X(0x4f992293), X(0x643d8806), + X(0x4fc079b1), X(0x641e3e38), X(0x4fe7c483), X(0x63fee4f8), + X(0x500f0302), X(0x63df7c4d), X(0x50363529), X(0x63c0043b), + X(0x505d5af1), X(0x63a07cc7), X(0x50847454), X(0x6380e5f6), + X(0x50ab814d), X(0x63613fcd), X(0x50d281d5), X(0x63418a50), + X(0x50f975e6), X(0x6321c585), X(0x51205d7b), X(0x6301f171), + X(0x5147388c), X(0x62e20e17), X(0x516e0715), X(0x62c21b7e), + X(0x5194c910), X(0x62a219aa), X(0x51bb7e75), X(0x628208a1), + X(0x51e22740), X(0x6261e866), X(0x5208c36a), X(0x6241b8ff), + X(0x522f52ee), X(0x62217a72), X(0x5255d5c5), X(0x62012cc2), + X(0x527c4bea), X(0x61e0cff5), X(0x52a2b556), X(0x61c06410), + X(0x52c91204), X(0x619fe918), X(0x52ef61ee), X(0x617f5f12), + X(0x5315a50e), X(0x615ec603), X(0x533bdb5d), X(0x613e1df0), + X(0x536204d7), X(0x611d66de), X(0x53882175), X(0x60fca0d2), + X(0x53ae3131), X(0x60dbcbd1), X(0x53d43406), X(0x60bae7e1), + X(0x53fa29ed), X(0x6099f505), X(0x542012e1), X(0x6078f344), + X(0x5445eedb), X(0x6057e2a2), X(0x546bbdd7), X(0x6036c325), + X(0x54917fce), X(0x601594d1), X(0x54b734ba), X(0x5ff457ad), + X(0x54dcdc96), X(0x5fd30bbc), X(0x5502775c), X(0x5fb1b104), + X(0x55280505), X(0x5f90478a), X(0x554d858d), X(0x5f6ecf53), + X(0x5572f8ed), X(0x5f4d4865), X(0x55985f20), X(0x5f2bb2c5), + X(0x55bdb81f), X(0x5f0a0e77), X(0x55e303e6), X(0x5ee85b82), + X(0x5608426e), X(0x5ec699e9), X(0x562d73b2), X(0x5ea4c9b3), + X(0x565297ab), X(0x5e82eae5), X(0x5677ae54), X(0x5e60fd84), + X(0x569cb7a8), X(0x5e3f0194), X(0x56c1b3a1), X(0x5e1cf71c), + X(0x56e6a239), X(0x5dfade20), X(0x570b8369), X(0x5dd8b6a7), + X(0x5730572e), X(0x5db680b4), X(0x57551d80), X(0x5d943c4e), + X(0x5779d65b), X(0x5d71e979), X(0x579e81b8), X(0x5d4f883b), + X(0x57c31f92), X(0x5d2d189a), X(0x57e7afe4), X(0x5d0a9a9a), + X(0x580c32a7), X(0x5ce80e41), X(0x5830a7d6), X(0x5cc57394), + X(0x58550f6c), X(0x5ca2ca99), X(0x58796962), X(0x5c801354), + X(0x589db5b3), X(0x5c5d4dcc), X(0x58c1f45b), X(0x5c3a7a05), + X(0x58e62552), X(0x5c179806), X(0x590a4893), X(0x5bf4a7d2), + X(0x592e5e19), X(0x5bd1a971), X(0x595265df), X(0x5bae9ce7), + X(0x59765fde), X(0x5b8b8239), X(0x599a4c12), X(0x5b68596d), + X(0x59be2a74), X(0x5b452288), X(0x59e1faff), X(0x5b21dd90), + X(0x5a05bdae), X(0x5afe8a8b), X(0x5a29727b), X(0x5adb297d), + X(0x5a4d1960), X(0x5ab7ba6c), X(0x5a70b258), X(0x5a943d5e), +}; + diff --git a/Mednafen/mednafen/tremor/misc.h b/Mednafen/mednafen/tremor/misc.h new file mode 100644 index 0000000000..4fb9bfcf51 --- /dev/null +++ b/Mednafen/mednafen/tremor/misc.h @@ -0,0 +1,252 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: miscellaneous math and prototypes + + ********************************************************************/ + +#ifndef _V_RANDOM_H_ +#define _V_RANDOM_H_ +#include "ivorbiscodec.h" +#include "os.h" + +#ifdef _LOW_ACCURACY_ +# define X(n) (((((n)>>22)+1)>>1) - ((((n)>>22)+1)>>9)) +# define LOOKUP_T const unsigned char +#else +# define X(n) (n) +# define LOOKUP_T const ogg_int32_t +#endif + +#include "asm_arm.h" +#include /* for abs() */ + +#ifndef _V_WIDE_MATH +#define _V_WIDE_MATH + +#ifndef _LOW_ACCURACY_ +/* 64 bit multiply */ + +#if !(defined WIN32 && defined WINCE) +#include +#endif + +#if OGG_BYTE_ORDER==OGG_LITTLE_ENDIAN +union magic { + struct { + ogg_int32_t lo; + ogg_int32_t hi; + } halves; + ogg_int64_t whole; +}; +#endif + +#if OGG_BYTE_ORDER==OGG_BIG_ENDIAN +union magic { + struct { + ogg_int32_t hi; + ogg_int32_t lo; + } halves; + ogg_int64_t whole; +}; +#endif + +STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { + union magic magic; + magic.whole = (ogg_int64_t)x * y; + return magic.halves.hi; +} + +STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { + return MULT32(x,y)<<1; +} + +STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { + union magic magic; + magic.whole = (ogg_int64_t)x * y; + return ((ogg_uint32_t)(magic.halves.lo)>>15) | ((magic.halves.hi)<<17); +} + +#else +/* 32 bit multiply, more portable but less accurate */ + +/* + * Note: Precision is biased towards the first argument therefore ordering + * is important. Shift values were chosen for the best sound quality after + * many listening tests. + */ + +/* + * For MULT32 and MULT31: The second argument is always a lookup table + * value already preshifted from 31 to 8 bits. We therefore take the + * opportunity to save on text space and use unsigned char for those + * tables in this case. + */ + +STIN ogg_int32_t MULT32(ogg_int32_t x, ogg_int32_t y) { + return (x >> 9) * y; /* y preshifted >>23 */ +} + +STIN ogg_int32_t MULT31(ogg_int32_t x, ogg_int32_t y) { + return (x >> 8) * y; /* y preshifted >>23 */ +} + +STIN ogg_int32_t MULT31_SHIFT15(ogg_int32_t x, ogg_int32_t y) { + return (x >> 6) * y; /* y preshifted >>9 */ +} + +#endif + +/* + * This should be used as a memory barrier, forcing all cached values in + * registers to wr writen back to memory. Might or might not be beneficial + * depending on the architecture and compiler. + */ +#define MB() + +/* + * The XPROD functions are meant to optimize the cross products found all + * over the place in mdct.c by forcing memory operation ordering to avoid + * unnecessary register reloads as soon as memory is being written to. + * However this is only beneficial on CPUs with a sane number of general + * purpose registers which exclude the Intel x86. On Intel, better let the + * compiler actually reload registers directly from original memory by using + * macros. + */ + +#ifdef __i386__ + +#define XPROD32(_a, _b, _t, _v, _x, _y) \ + { *(_x)=MULT32(_a,_t)+MULT32(_b,_v); \ + *(_y)=MULT32(_b,_t)-MULT32(_a,_v); } +#define XPROD31(_a, _b, _t, _v, _x, _y) \ + { *(_x)=MULT31(_a,_t)+MULT31(_b,_v); \ + *(_y)=MULT31(_b,_t)-MULT31(_a,_v); } +#define XNPROD31(_a, _b, _t, _v, _x, _y) \ + { *(_x)=MULT31(_a,_t)-MULT31(_b,_v); \ + *(_y)=MULT31(_b,_t)+MULT31(_a,_v); } + +#else + +STIN void XPROD32(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + *x = MULT32(a, t) + MULT32(b, v); + *y = MULT32(b, t) - MULT32(a, v); +} + +STIN void XPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + *x = MULT31(a, t) + MULT31(b, v); + *y = MULT31(b, t) - MULT31(a, v); +} + +STIN void XNPROD31(ogg_int32_t a, ogg_int32_t b, + ogg_int32_t t, ogg_int32_t v, + ogg_int32_t *x, ogg_int32_t *y) +{ + *x = MULT31(a, t) - MULT31(b, v); + *y = MULT31(b, t) + MULT31(a, v); +} + +#endif + +#endif + +#ifndef _V_CLIP_MATH +#define _V_CLIP_MATH + +STIN ogg_int32_t CLIP_TO_15(ogg_int32_t x) { + int ret=x; + ret-= ((x<=32767)-1)&(x-32767); + ret-= ((x>=-32768)-1)&(x+32768); + return(ret); +} + +#endif + +STIN ogg_int32_t VFLOAT_MULT(ogg_int32_t a,ogg_int32_t ap, + ogg_int32_t b,ogg_int32_t bp, + ogg_int32_t *p){ + if(a && b){ +#ifndef _LOW_ACCURACY_ + *p=ap+bp+32; + return MULT32(a,b); +#else + *p=ap+bp+31; + return (a>>15)*(b>>16); +#endif + }else + return 0; +} + +int _ilog(unsigned int); + +STIN ogg_int32_t VFLOAT_MULTI(ogg_int32_t a,ogg_int32_t ap, + ogg_int32_t i, + ogg_int32_t *p){ + + int ip=_ilog(abs(i))-31; + return VFLOAT_MULT(a,ap,i<<-ip,ip,p); +} + +STIN ogg_int32_t VFLOAT_ADD(ogg_int32_t a,ogg_int32_t ap, + ogg_int32_t b,ogg_int32_t bp, + ogg_int32_t *p){ + + if(!a){ + *p=bp; + return b; + }else if(!b){ + *p=ap; + return a; + } + + /* yes, this can leak a bit. */ + if(ap>bp){ + int shift=ap-bp+1; + *p=ap+1; + a>>=1; + if(shift<32){ + b=(b+(1<<(shift-1)))>>shift; + }else{ + b=0; + } + }else{ + int shift=bp-ap+1; + *p=bp+1; + b>>=1; + if(shift<32){ + a=(a+(1<<(shift-1)))>>shift; + }else{ + a=0; + } + } + + a+=b; + if((a&0xc0000000)==0xc0000000 || + (a&0xc0000000)==0){ + a<<=1; + (*p)--; + } + return(a); +} + +#endif + + + + diff --git a/Mednafen/mednafen/tremor/ogg.h b/Mednafen/mednafen/tremor/ogg.h new file mode 100644 index 0000000000..00975ca354 --- /dev/null +++ b/Mednafen/mednafen/tremor/ogg.h @@ -0,0 +1,210 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel libogg include + last mod: $Id: ogg.h 18044 2011-08-01 17:55:20Z gmaxwell $ + + ********************************************************************/ +#ifndef _OGG_H +#define _OGG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "os_types.h" + +typedef struct { + void *iov_base; + size_t iov_len; +} ogg_iovec_t; + +typedef struct { + long endbyte; + int endbit; + + unsigned char *buffer; + unsigned char *ptr; + long storage; +} oggpack_buffer; + +/* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/ + +typedef struct { + unsigned char *header; + long header_len; + unsigned char *body; + long body_len; +} ogg_page; + +/* ogg_stream_state contains the current encode/decode state of a logical + Ogg bitstream **********************************************************/ + +typedef struct { + unsigned char *body_data; /* bytes from packet bodies */ + long body_storage; /* storage elements allocated */ + long body_fill; /* elements stored; fill mark */ + long body_returned; /* elements of fill returned */ + + + int *lacing_vals; /* The values that will go to the segment table */ + ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact + this way, but it is simple coupled to the + lacing fifo */ + long lacing_storage; + long lacing_fill; + long lacing_packet; + long lacing_returned; + + unsigned char header[282]; /* working space for header encode */ + int header_fill; + + int e_o_s; /* set when we have buffered the last packet in the + logical bitstream */ + int b_o_s; /* set after we've written the initial page + of a logical bitstream */ + long serialno; + long pageno; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ + ogg_int64_t granulepos; + +} ogg_stream_state; + +/* ogg_packet is used to encapsulate the data and metadata belonging + to a single raw Ogg/Vorbis packet *************************************/ + +typedef struct { + unsigned char *packet; + long bytes; + long b_o_s; + long e_o_s; + + ogg_int64_t granulepos; + + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a separate abstraction + layer) also knows about the gap */ +} ogg_packet; + +typedef struct { + unsigned char *data; + int storage; + int fill; + int returned; + + int unsynced; + int headerbytes; + int bodybytes; +} ogg_sync_state; + +/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ + +extern void oggpack_writeinit(oggpack_buffer *b); +extern int oggpack_writecheck(oggpack_buffer *b); +extern void oggpack_writetrunc(oggpack_buffer *b,long bits); +extern void oggpack_writealign(oggpack_buffer *b); +extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpack_reset(oggpack_buffer *b); +extern void oggpack_writeclear(oggpack_buffer *b); +extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpack_look(oggpack_buffer *b,int bits); +extern long oggpack_look1(oggpack_buffer *b); +extern void oggpack_adv(oggpack_buffer *b,int bits); +extern void oggpack_adv1(oggpack_buffer *b); +extern long oggpack_read(oggpack_buffer *b,int bits); +extern long oggpack_read1(oggpack_buffer *b); +extern long oggpack_bytes(oggpack_buffer *b); +extern long oggpack_bits(oggpack_buffer *b); +extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); + +extern void oggpackB_writeinit(oggpack_buffer *b); +extern int oggpackB_writecheck(oggpack_buffer *b); +extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); +extern void oggpackB_writealign(oggpack_buffer *b); +extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); +extern void oggpackB_reset(oggpack_buffer *b); +extern void oggpackB_writeclear(oggpack_buffer *b); +extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); +extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); +extern long oggpackB_look(oggpack_buffer *b,int bits); +extern long oggpackB_look1(oggpack_buffer *b); +extern void oggpackB_adv(oggpack_buffer *b,int bits); +extern void oggpackB_adv1(oggpack_buffer *b); +extern long oggpackB_read(oggpack_buffer *b,int bits); +extern long oggpackB_read1(oggpack_buffer *b); +extern long oggpackB_bytes(oggpack_buffer *b); +extern long oggpackB_bits(oggpack_buffer *b); +extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); + +/* Ogg BITSTREAM PRIMITIVES: encoding **************************/ + +extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); +extern int ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov, + int count, long e_o_s, ogg_int64_t granulepos); +extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill); +extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int nfill); + +/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ + +extern int ogg_sync_init(ogg_sync_state *oy); +extern int ogg_sync_clear(ogg_sync_state *oy); +extern int ogg_sync_reset(ogg_sync_state *oy); +extern int ogg_sync_destroy(ogg_sync_state *oy); +extern int ogg_sync_check(ogg_sync_state *oy); + +extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); +extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); +extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); +extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); +extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); +extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); +extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); + +/* Ogg BITSTREAM PRIMITIVES: general ***************************/ + +extern int ogg_stream_init(ogg_stream_state *os,int serialno); +extern int ogg_stream_clear(ogg_stream_state *os); +extern int ogg_stream_reset(ogg_stream_state *os); +extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); +extern int ogg_stream_destroy(ogg_stream_state *os); +extern int ogg_stream_check(ogg_stream_state *os); +extern int ogg_stream_eos(ogg_stream_state *os); + +extern void ogg_page_checksum_set(ogg_page *og); + +extern int ogg_page_version(const ogg_page *og); +extern int ogg_page_continued(const ogg_page *og); +extern int ogg_page_bos(const ogg_page *og); +extern int ogg_page_eos(const ogg_page *og); +extern ogg_int64_t ogg_page_granulepos(const ogg_page *og); +extern int ogg_page_serialno(const ogg_page *og); +extern long ogg_page_pageno(const ogg_page *og); +extern int ogg_page_packets(const ogg_page *og); + +extern void ogg_packet_clear(ogg_packet *op); + + +#ifdef __cplusplus +} +#endif + +#endif /* _OGG_H */ diff --git a/Mednafen/mednafen/tremor/os.h b/Mednafen/mednafen/tremor/os.h new file mode 100644 index 0000000000..65a4992ffc --- /dev/null +++ b/Mednafen/mednafen/tremor/os.h @@ -0,0 +1,62 @@ +#ifndef _OS_H +#define _OS_H +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + + ********************************************************************/ + +#include +#include "os_types.h" + +#ifndef _V_IFDEFJAIL_H_ +# define _V_IFDEFJAIL_H_ + +# ifdef __GNUC__ +# define STIN static __inline__ +# elif _WIN32 +# define STIN static __inline +# endif +#else +# define STIN static +#endif + +#ifndef M_PI +# define M_PI (3.1415926536f) +#endif + +#ifdef _WIN32 +# include +# define rint(x) (floor((x)+0.5f)) +# define NO_FLOAT_MATH_LIB +# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) +#endif + +#ifdef HAVE_ALLOCA_H +# include +#endif + +#ifdef USE_MEMORY_H +# include +#endif + +#ifndef min +# define min(x,y) ((x)>(y)?(y):(x)) +#endif + +#ifndef max +# define max(x,y) ((x)<(y)?(y):(x)) +#endif + +#endif /* _OS_H */ diff --git a/Mednafen/mednafen/tremor/os_types.h b/Mednafen/mednafen/tremor/os_types.h new file mode 100644 index 0000000000..495cfdd8e4 --- /dev/null +++ b/Mednafen/mednafen/tremor/os_types.h @@ -0,0 +1,56 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + last mod: $Id: os_types.h 17712 2010-12-03 17:10:02Z xiphmont $ + + ********************************************************************/ + +/* + Modified for usage in Mednafen +*/ + +#ifndef _OS_TYPES_H +#define _OS_TYPES_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#define OGG_BIG_ENDIAN 4321 +#define OGG_LITTLE_ENDIAN 1234 + +#ifdef MSB_FIRST + #define OGG_BYTE_ORDER OGG_BIG_ENDIAN +#elif defined(LSB_FIRST) + #define OGG_BYTE_ORDER OGG_LITTLE_ENDIAN +#else + #error "ERROR" +#endif + +/* make it easy on the folks that want to compile the libs with a + different malloc than stdlib */ +#define _ogg_malloc malloc +#define _ogg_calloc calloc +#define _ogg_realloc realloc +#define _ogg_free free + +#include + +typedef int16_t ogg_int16_t; +typedef uint16_t ogg_uint16_t; +typedef int32_t ogg_int32_t; +typedef uint32_t ogg_uint32_t; +typedef int64_t ogg_int64_t; +typedef uint64_t ogg_uint64_t; + +#endif /* _OS_TYPES_H */ diff --git a/Mednafen/mednafen/tremor/registry.c b/Mednafen/mednafen/tremor/registry.c new file mode 100644 index 0000000000..c0b5fec0cc --- /dev/null +++ b/Mednafen/mednafen/tremor/registry.c @@ -0,0 +1,50 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: registry for floor, res backends and channel mappings + + ********************************************************************/ + +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "misc.h" + + +/* seems like major overkill now; the backend numbers will grow into + the infrastructure soon enough */ + +extern vorbis_func_floor floor0_exportbundle; +extern vorbis_func_floor floor1_exportbundle; +extern vorbis_func_residue residue0_exportbundle; +extern vorbis_func_residue residue1_exportbundle; +extern vorbis_func_residue residue2_exportbundle; +extern vorbis_func_mapping mapping0_exportbundle; + +vorbis_func_floor *_floor_P[]={ + &floor0_exportbundle, + &floor1_exportbundle, +}; + +vorbis_func_residue *_residue_P[]={ + &residue0_exportbundle, + &residue1_exportbundle, + &residue2_exportbundle, +}; + +vorbis_func_mapping *_mapping_P[]={ + &mapping0_exportbundle, +}; + + + diff --git a/Mednafen/mednafen/tremor/registry.h b/Mednafen/mednafen/tremor/registry.h new file mode 100644 index 0000000000..2bc8068f69 --- /dev/null +++ b/Mednafen/mednafen/tremor/registry.h @@ -0,0 +1,40 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: registry for time, floor, res backends and channel mappings + + ********************************************************************/ + +#ifndef _V_REG_H_ +#define _V_REG_H_ + +#define VI_TRANSFORMB 1 +#define VI_WINDOWB 1 +#define VI_TIMEB 1 +#define VI_FLOORB 2 +#define VI_RESB 3 +#define VI_MAPB 1 + +#include "backends.h" + +#if defined(_WIN32) && defined(VORBISDLL_IMPORT) +# define EXTERN __declspec(dllimport) extern +#else +# define EXTERN extern +#endif + +EXTERN vorbis_func_floor *_floor_P[]; +EXTERN vorbis_func_residue *_residue_P[]; +EXTERN vorbis_func_mapping *_mapping_P[]; + +#endif diff --git a/Mednafen/mednafen/tremor/res012.c b/Mednafen/mednafen/tremor/res012.c new file mode 100644 index 0000000000..e2438c5a7e --- /dev/null +++ b/Mednafen/mednafen/tremor/res012.c @@ -0,0 +1,374 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: residue backend 0, 1 and 2 implementation + + ********************************************************************/ + +#include +#include +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "codebook.h" +#include "misc.h" +#include "os.h" +#include "block.h" + +typedef struct { + vorbis_info_residue0 *info; + int map; + + int parts; + int stages; + codebook *fullbooks; + codebook *phrasebook; + codebook ***partbooks; + + int partvals; + int **decodemap; + +} vorbis_look_residue0; + +void res0_free_info(vorbis_info_residue *i){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; + if(info){ + memset(info,0,sizeof(*info)); + _ogg_free(info); + } +} + +void res0_free_look(vorbis_look_residue *i){ + int j; + if(i){ + + vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; + + for(j=0;jparts;j++) + if(look->partbooks[j])_ogg_free(look->partbooks[j]); + _ogg_free(look->partbooks); + for(j=0;jpartvals;j++) + _ogg_free(look->decodemap[j]); + _ogg_free(look->decodemap); + + memset(look,0,sizeof(*look)); + _ogg_free(look); + } +} + +static int ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +static int icount(unsigned int v){ + int ret=0; + while(v){ + ret+=v&1; + v>>=1; + } + return(ret); +} + +/* vorbis_info is for range checking */ +vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ + int j,acc=0; + vorbis_info_residue0 *info=(vorbis_info_residue0 *)_ogg_calloc(1,sizeof(*info)); + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + + info->begin=oggpack_read(opb,24); + info->end=oggpack_read(opb,24); + info->grouping=oggpack_read(opb,24)+1; + info->partitions=oggpack_read(opb,6)+1; + info->groupbook=oggpack_read(opb,8); + + /* check for premature EOP */ + if(info->groupbook<0)goto errout; + + for(j=0;jpartitions;j++){ + int cascade=oggpack_read(opb,3); + int cflag=oggpack_read(opb,1); + if(cflag<0) goto errout; + if(cflag){ + int c=oggpack_read(opb,5); + if(c<0) goto errout; + cascade|=(c<<3); + } + info->secondstages[j]=cascade; + + acc+=icount(cascade); + } + for(j=0;jbooklist[j]=book; + } + + if(info->groupbook>=ci->books)goto errout; + for(j=0;jbooklist[j]>=ci->books)goto errout; + if(ci->book_param[info->booklist[j]]->maptype==0)goto errout; + } + + /* verify the phrasebook is not specifying an impossible or + inconsistent partitioning scheme. */ + /* modify the phrasebook ranging check from r16327; an early beta + encoder had a bug where it used an oversized phrasebook by + accident. These files should continue to be playable, but don't + allow an exploit */ + { + int entries = ci->book_param[info->groupbook]->entries; + int dim = ci->book_param[info->groupbook]->dim; + int partvals = 1; + if (dim<1) goto errout; + while(dim>0){ + partvals *= info->partitions; + if(partvals > entries) goto errout; + dim--; + } + info->partvals = partvals; + } + + return(info); + errout: + res0_free_info(info); + return(NULL); +} + +vorbis_look_residue *res0_look(vorbis_dsp_state *vd,vorbis_info_mode *vm, + vorbis_info_residue *vr){ + vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)_ogg_calloc(1,sizeof(*look)); + codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup; + + int j,k,acc=0; + int dim; + int maxstage=0; + look->info=info; + look->map=vm->mapping; + + look->parts=info->partitions; + look->fullbooks=ci->fullbooks; + look->phrasebook=ci->fullbooks+info->groupbook; + dim=look->phrasebook->dim; + + look->partbooks=(codebook ***)_ogg_calloc(look->parts,sizeof(*look->partbooks)); + + for(j=0;jparts;j++){ + int stages=ilog(info->secondstages[j]); + if(stages){ + if(stages>maxstage)maxstage=stages; + look->partbooks[j]=(codebook **)_ogg_calloc(stages,sizeof(*look->partbooks[j])); + for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; +#ifdef TRAIN_RES + look->training_data[k][j]=calloc(look->partbooks[j][k]->entries, + sizeof(***look->training_data)); +#endif + } + } + } + + look->partvals=look->parts; + for(j=1;jpartvals*=look->parts; + look->stages=maxstage; + look->decodemap=(int **)_ogg_malloc(look->partvals*sizeof(*look->decodemap)); + for(j=0;jpartvals;j++){ + long val=j; + long mult=look->partvals/look->parts; + look->decodemap[j]=(int *)_ogg_malloc(dim*sizeof(*look->decodemap[j])); + for(k=0;kparts; + look->decodemap[j][k]=deco; + } + } + + return(look); +} + + +/* a truncated packet here just means 'stop working'; it's not an error */ +static int _01inverse(vorbis_block *vb,vorbis_look_residue *vl, + ogg_int32_t **in,int ch, + long (*decodepart)(codebook *, ogg_int32_t *, + oggpack_buffer *,int,int)){ + + long i,j,k,l,s; + vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; + vorbis_info_residue0 *info=look->info; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int partitions_per_word=look->phrasebook->dim; + int max=vb->pcmend>>1; + int end=(info->endend:max); + int n=end-info->begin; + + if(n>0){ + int partvals=n/samples_per_partition; + int partwords=(partvals+partitions_per_word-1)/partitions_per_word; + int ***partword=(int ***)alloca(ch*sizeof(*partword)); + + for(j=0;jstages;s++){ + + /* each loop decodes on partition codeword containing + partitions_pre_word partitions */ + for(i=0,l=0;iphrasebook,&vb->opb); + if(temp==-1 || temp>=info->partvals)goto eopbreak; + partword[j][l]=look->decodemap[temp]; + if(partword[j][l]==NULL)goto errout; + } + } + + /* now we decode residual values for the partitions */ + for(k=0;kbegin+i*samples_per_partition; + if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; + if(stagebook){ + if(decodepart(stagebook,in[j]+offset,&vb->opb, + samples_per_partition,-8)==-1)goto eopbreak; + } + } + } + } + } + } + errout: + eopbreak: + return(0); +} + +int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, + ogg_int32_t **in,int *nonzero,int ch){ + int i,used=0; + for(i=0;iinfo; + + /* move all this setup out later */ + int samples_per_partition=info->grouping; + int partitions_per_word=look->phrasebook->dim; + int max=(vb->pcmend*ch)>>1; + int end=(info->endend:max); + int n=end-info->begin; + + if(n>0){ + + int partvals=n/samples_per_partition; + int partwords=(partvals+partitions_per_word-1)/partitions_per_word; + int **partword=(int **)_vorbis_block_alloc(vb,partwords*sizeof(*partword)); + int beginoff=info->begin/ch; + + for(i=0;istages;s++){ + for(i=0,l=0;iphrasebook,&vb->opb); + if(temp==-1 || temp>=info->partvals)goto eopbreak; + partword[l]=look->decodemap[temp]; + if(partword[l]==NULL)goto errout; + } + + /* now we decode residual values for the partitions */ + for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; + + if(stagebook){ + if(vorbis_book_decodevv_add(stagebook,in, + i*samples_per_partition+beginoff,ch, + &vb->opb, + samples_per_partition,-8)==-1) + goto eopbreak; + } + } + } + } + } + errout: + eopbreak: + return(0); +} + + +vorbis_func_residue residue0_exportbundle={ + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res0_inverse +}; + +vorbis_func_residue residue1_exportbundle={ + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res1_inverse +}; + +vorbis_func_residue residue2_exportbundle={ + &res0_unpack, + &res0_look, + &res0_free_info, + &res0_free_look, + &res2_inverse +}; diff --git a/Mednafen/mednafen/tremor/sharedbook.c b/Mednafen/mednafen/tremor/sharedbook.c new file mode 100644 index 0000000000..2e809189f7 --- /dev/null +++ b/Mednafen/mednafen/tremor/sharedbook.c @@ -0,0 +1,447 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + + ********************************************************************/ + +#include +#include +#include +#include "ogg.h" +#include "misc.h" +#include "ivorbiscodec.h" +#include "codebook.h" + +/**** pack/unpack helpers ******************************************/ +int _ilog(unsigned int v){ + int ret=0; + while(v){ + ret++; + v>>=1; + } + return(ret); +} + +/* 32 bit float (not IEEE; nonnormalized mantissa + + biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm + Why not IEEE? It's just not that important here. */ + +#define VQ_FEXP 10 +#define VQ_FMAN 21 +#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ + +static ogg_int32_t _float32_unpack(long val,int *point){ + long mant=val&0x1fffff; + int sign=val&0x80000000; + long exp =(val&0x7fe00000L)>>VQ_FMAN; + + exp-=(VQ_FMAN-1)+VQ_FEXP_BIAS; + + if(mant){ + while(!(mant&0x40000000)){ + mant<<=1; + exp-=1; + } + + if(sign)mant= -mant; + }else{ + sign=0; + exp=-9999; + } + + *point=exp; + return mant; +} + +/* given a list of word lengths, generate a list of codewords. Works + for length ordered or unordered, always assigns the lowest valued + codewords first. Extended to handle unused entries (length 0) */ +ogg_uint32_t *_make_words(long *l,long n,long sparsecount){ + long i,j,count=0; + ogg_uint32_t marker[33]; + ogg_uint32_t *r=(ogg_uint32_t *)_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); + memset(marker,0,sizeof(marker)); + + for(i=0;i0){ + ogg_uint32_t entry=marker[length]; + + /* when we claim a node for an entry, we also claim the nodes + below it (pruning off the imagined tree that may have dangled + from it) as well as blocking the use of any nodes directly + above for leaves */ + + /* update ourself */ + if(length<32 && (entry>>length)){ + /* error condition; the lengths must specify an overpopulated tree */ + _ogg_free(r); + return(NULL); + } + r[count++]=entry; + + /* Look to see if the next shorter marker points to the node + above. if so, update it and repeat. */ + { + for(j=length;j>0;j--){ + + if(marker[j]&1){ + /* have to jump branches */ + if(j==1) + marker[1]++; + else + marker[j]=marker[j-1]<<1; + break; /* invariant says next upper marker would already + have been moved if it was on the same path */ + } + marker[j]++; + } + } + + /* prune the tree; the implicit invariant says all the longer + markers were dangling from our just-taken node. Dangle them + from our *new* node. */ + for(j=length+1;j<33;j++) + if((marker[j]>>1) == entry){ + entry=marker[j]; + marker[j]=marker[j-1]<<1; + }else + break; + }else + if(sparsecount==0)count++; + } + + /* sanity check the huffman tree; an underpopulated tree must be + rejected. The only exception is the one-node pseudo-nil tree, + which appears to be underpopulated because the tree doesn't + really exist; there's only one possible 'codeword' or zero bits, + but the above tree-gen code doesn't mark that. */ + if(sparsecount != 1){ + for(i=1;i<33;i++) + if(marker[i] & (0xffffffffUL>>(32-i))){ + _ogg_free(r); + return(NULL); + } + } + + /* bitreverse the words because our bitwise packer/unpacker is LSb + endian */ + for(i=0,count=0;i>j)&1; + } + + if(sparsecount){ + if(l[i]) + r[count++]=temp; + }else + r[count++]=temp; + } + + return(r); +} + +/* there might be a straightforward one-line way to do the below + that's portable and totally safe against roundoff, but I haven't + thought of it. Therefore, we opt on the side of caution */ +long _book_maptype1_quantvals(const static_codebook *b){ + /* get us a starting hint, we'll polish it below */ + int bits=_ilog(b->entries); + int vals=b->entries>>((bits-1)*(b->dim-1)/b->dim); + + while(1){ + long acc=1; + long acc1=1; + int i; + for(i=0;idim;i++){ + acc*=vals; + acc1*=vals+1; + } + if(acc<=b->entries && acc1>b->entries){ + return(vals); + }else{ + if(acc>b->entries){ + vals--; + }else{ + vals++; + } + } + } +} + +/* different than what _book_unquantize does for mainline: + we repack the book in a fixed point format that shares the same + binary point. Upon first use, we can shift point if needed */ + +/* we need to deal with two map types: in map type 1, the values are + generated algorithmically (each column of the vector counts through + the values in the quant vector). in map type 2, all the values came + in in an explicit list. Both value lists must be unpacked */ + +ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap, + int *maxpoint){ + long j,k,count=0; + if(b->maptype==1 || b->maptype==2){ + int quantvals; + int minpoint,delpoint; + ogg_int32_t mindel=_float32_unpack(b->q_min,&minpoint); + ogg_int32_t delta=_float32_unpack(b->q_delta,&delpoint); + ogg_int32_t *r=(ogg_int32_t *)_ogg_calloc(n*b->dim,sizeof(*r)); + int *rp=(int *)_ogg_calloc(n*b->dim,sizeof(*rp)); + + *maxpoint=minpoint; + + /* maptype 1 and 2 both use a quantized value vector, but + different sizes */ + switch(b->maptype){ + case 1: + /* most of the time, entries%dimensions == 0, but we need to be + well defined. We define that the possible vales at each + scalar is values == entries/dim. If entries%dim != 0, we'll + have 'too few' values (values*dimentries;j++){ + if((sparsemap && b->lengthlist[j]) || !sparsemap){ + ogg_int32_t last=0; + int lastpoint=0; + int indexdiv=1; + for(k=0;kdim;k++){ + int index= (j/indexdiv)%quantvals; + int point=0; + int val=VFLOAT_MULTI(delta,delpoint, + abs(b->quantlist[index]),&point); + + val=VFLOAT_ADD(mindel,minpoint,val,point,&point); + val=VFLOAT_ADD(last,lastpoint,val,point,&point); + + if(b->q_sequencep){ + last=val; + lastpoint=point; + } + + if(sparsemap){ + r[sparsemap[count]*b->dim+k]=val; + rp[sparsemap[count]*b->dim+k]=point; + }else{ + r[count*b->dim+k]=val; + rp[count*b->dim+k]=point; + } + if(*maxpointentries;j++){ + if((sparsemap && b->lengthlist[j]) || !sparsemap){ + ogg_int32_t last=0; + int lastpoint=0; + + for(k=0;kdim;k++){ + int point=0; + int val=VFLOAT_MULTI(delta,delpoint, + abs(b->quantlist[j*b->dim+k]),&point); + + val=VFLOAT_ADD(mindel,minpoint,val,point,&point); + val=VFLOAT_ADD(last,lastpoint,val,point,&point); + + if(b->q_sequencep){ + last=val; + lastpoint=point; + } + + if(sparsemap){ + r[sparsemap[count]*b->dim+k]=val; + rp[sparsemap[count]*b->dim+k]=point; + }else{ + r[count*b->dim+k]=val; + rp[count*b->dim+k]=point; + } + if(*maxpointdim;j++) + if(rp[j]<*maxpoint) + r[j]>>=*maxpoint-rp[j]; + + _ogg_free(rp); + return(r); + } + return(NULL); +} + +void vorbis_staticbook_destroy(static_codebook *b){ + if(b->quantlist)_ogg_free(b->quantlist); + if(b->lengthlist)_ogg_free(b->lengthlist); + memset(b,0,sizeof(*b)); + _ogg_free(b); +} + +void vorbis_book_clear(codebook *b){ + /* static book is not cleared; we're likely called on the lookup and + the static codebook belongs to the info struct */ + if(b->valuelist)_ogg_free(b->valuelist); + if(b->codelist)_ogg_free(b->codelist); + + if(b->dec_index)_ogg_free(b->dec_index); + if(b->dec_codelengths)_ogg_free(b->dec_codelengths); + if(b->dec_firsttable)_ogg_free(b->dec_firsttable); + + memset(b,0,sizeof(*b)); +} + +static ogg_uint32_t bitreverse(ogg_uint32_t x){ + x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); + x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); + x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); + x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); + return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); +} + +static int sort32a(const void *a,const void *b){ + return (**(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- + (**(ogg_uint32_t **)a<**(ogg_uint32_t **)b); +} + +/* decode codebook arrangement is more heavily optimized than encode */ +int vorbis_book_init_decode(codebook *c,const static_codebook *s){ + int i,j,n=0,tabn; + int *sortindex; + memset(c,0,sizeof(*c)); + + /* count actually used entries */ + for(i=0;ientries;i++) + if(s->lengthlist[i]>0) + n++; + + c->entries=s->entries; + c->used_entries=n; + c->dim=s->dim; + + if(n>0){ + /* two different remappings go on here. + + First, we collapse the likely sparse codebook down only to + actually represented values/words. This collapsing needs to be + indexed as map-valueless books are used to encode original entry + positions as integers. + + Second, we reorder all vectors, including the entry index above, + by sorted bitreversed codeword to allow treeless decode. */ + + /* perform sort */ + ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); + ogg_uint32_t **codep=(ogg_uint32_t **)alloca(sizeof(*codep)*n); + + if(codes==NULL)goto err_out; + + for(i=0;icodelist=(ogg_uint32_t *)_ogg_malloc(n*sizeof(*c->codelist)); + /* the index is a reverse index */ + for(i=0;icodelist[sortindex[i]]=codes[i]; + _ogg_free(codes); + + + + c->valuelist=_book_unquantize(s,n,sortindex,&c->binarypoint); + c->dec_index=(int *)_ogg_malloc(n*sizeof(*c->dec_index)); + + for(n=0,i=0;ientries;i++) + if(s->lengthlist[i]>0) + c->dec_index[sortindex[n++]]=i; + + c->dec_codelengths=(char *)_ogg_malloc(n*sizeof(*c->dec_codelengths)); + for(n=0,i=0;ientries;i++) + if(s->lengthlist[i]>0) + c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; + + c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */ + if(c->dec_firsttablen<5)c->dec_firsttablen=5; + if(c->dec_firsttablen>8)c->dec_firsttablen=8; + + tabn=1<dec_firsttablen; + c->dec_firsttable=(ogg_uint32_t *)_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); + c->dec_maxlength=0; + + for(i=0;idec_maxlengthdec_codelengths[i]) + c->dec_maxlength=c->dec_codelengths[i]; + if(c->dec_codelengths[i]<=c->dec_firsttablen){ + ogg_uint32_t orig=bitreverse(c->codelist[i]); + for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) + c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; + } + } + + /* now fill in 'unused' entries in the firsttable with hi/lo search + hints for the non-direct-hits */ + { + ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); + long lo=0,hi=0; + + for(i=0;idec_firsttablen); + if(c->dec_firsttable[bitreverse(word)]==0){ + while((lo+1)codelist[lo+1]<=word)lo++; + while( hi=(c->codelist[hi]&mask))hi++; + + /* we only actually have 15 bits per hint to play with here. + In order to overflow gracefully (nothing breaks, efficiency + just drops), encode as the difference from the extremes. */ + { + unsigned long loval=lo; + unsigned long hival=n-hi; + + if(loval>0x7fff)loval=0x7fff; + if(hival>0x7fff)hival=0x7fff; + c->dec_firsttable[bitreverse(word)]= + 0x80000000UL | (loval<<15) | hival; + } + } + } + } + } + + return(0); + err_out: + vorbis_book_clear(c); + return(-1); +} + diff --git a/Mednafen/mednafen/tremor/synthesis.c b/Mednafen/mednafen/tremor/synthesis.c new file mode 100644 index 0000000000..1d69c03921 --- /dev/null +++ b/Mednafen/mednafen/tremor/synthesis.c @@ -0,0 +1,131 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2003 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: single-block PCM synthesis + last mod: $Id: synthesis.c,v 1.4 2003/03/29 03:07:21 xiphmont Exp $ + + ********************************************************************/ + +#include +#include "ogg.h" +#include "ivorbiscodec.h" +#include "codec_internal.h" +#include "registry.h" +#include "misc.h" +#include "block.h" + +static int _vorbis_synthesis1(vorbis_block *vb,ogg_packet *op,int decodep){ + vorbis_dsp_state *vd= vb ? vb->vd : 0; + private_state *b= vd ? (private_state *)vd->backend_state: 0; + vorbis_info *vi= vd ? vd->vi : 0; + codec_setup_info *ci= vi ? (codec_setup_info *)vi->codec_setup : 0; + oggpack_buffer *opb=vb ? &vb->opb : 0; + int type,mode,i; + + if (!vd || !b || !vi || !ci || !opb) { + return OV_EBADPACKET; + } + + /* first things first. Make sure decode is ready */ + _vorbis_block_ripcord(vb); + oggpack_readinit(opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(opb,b->modebits); + if(mode==-1)return(OV_EBADPACKET); + + vb->mode=mode; + if(!ci->mode_param[mode]){ + return(OV_EBADPACKET); + } + + vb->W=ci->mode_param[mode]->blockflag; + if(vb->W){ + vb->lW=oggpack_read(opb,1); + vb->nW=oggpack_read(opb,1); + if(vb->nW==-1) return(OV_EBADPACKET); + }else{ + vb->lW=0; + vb->nW=0; + } + + /* more setup */ + vb->granulepos=op->granulepos; + vb->sequence=op->packetno-3; /* first block is third packet */ + vb->eofflag=op->e_o_s; + + if(decodep){ + /* alloc pcm passback storage */ + vb->pcmend=ci->blocksizes[vb->W]; + vb->pcm=(ogg_int32_t **)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); + for(i=0;ichannels;i++) + vb->pcm[i]=(ogg_int32_t *)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); + + /* unpack_header enforces range checking */ + type=ci->map_type[ci->mode_param[mode]->mapping]; + + return(_mapping_P[type]->inverse(vb,b->mode[mode])); + }else{ + /* no pcm */ + vb->pcmend=0; + vb->pcm=NULL; + + return(0); + } +} + +int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ + return _vorbis_synthesis1(vb,op,1); +} + +/* used to track pcm position without actually performing decode. + Useful for sequential 'fast forward' */ +int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ + return _vorbis_synthesis1(vb,op,0); +} + +long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ + codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; + oggpack_buffer opb; + int mode; + + oggpack_readinit(&opb,op->packet,op->bytes); + + /* Check the packet type */ + if(oggpack_read(&opb,1)!=0){ + /* Oops. This is not an audio data packet */ + return(OV_ENOTAUDIO); + } + + { + int modebits=0; + int v=ci->modes; + while(v>1){ + modebits++; + v>>=1; + } + + /* read our mode and pre/post windowsize */ + mode=oggpack_read(&opb,modebits); + } + if(mode==-1)return(OV_EBADPACKET); + return(ci->blocksizes[ci->mode_param[mode]->blockflag]); +} + + diff --git a/Mednafen/mednafen/tremor/vorbisfile.c b/Mednafen/mednafen/tremor/vorbisfile.c new file mode 100644 index 0000000000..ac0eb88738 --- /dev/null +++ b/Mednafen/mednafen/tremor/vorbisfile.c @@ -0,0 +1,1884 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2009 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: stdio-based convenience library for opening/seeking/decoding + last mod: $Id: vorbisfile.c,v 1.6 2003/03/30 23:40:56 xiphmont Exp $ + + ********************************************************************/ + +#include +#include +#include +#include +#include + +#include "ivorbiscodec.h" +#include "ivorbisfile.h" + +#include "os.h" +#include "misc.h" + +/* A 'chained bitstream' is a Vorbis bitstream that contains more than + one logical bitstream arranged end to end (the only form of Ogg + multiplexing allowed in a Vorbis bitstream; grouping [parallel + multiplexing] is not allowed in Vorbis) */ + +/* A Vorbis file can be played beginning to end (streamed) without + worrying ahead of time about chaining (see decoder_example.c). If + we have the whole file, however, and want random access + (seeking/scrubbing) or desire to know the total length/time of a + file, we need to account for the possibility of chaining. */ + +/* We can handle things a number of ways; we can determine the entire + bitstream structure right off the bat, or find pieces on demand. + This example determines and caches structure for the entire + bitstream, but builds a virtual decoder on the fly when moving + between links in the chain. */ + +/* There are also different ways to implement seeking. Enough + information exists in an Ogg bitstream to seek to + sample-granularity positions in the output. Or, one can seek by + picking some portion of the stream roughly in the desired area if + we only want coarse navigation through the stream. */ + +/************************************************************************* + * Many, many internal helpers. The intention is not to be confusing; + * rampant duplication and monolithic function implementation would be + * harder to understand anyway. The high level functions are last. Begin + * grokking near the end of the file */ + + +/* read a little more data from the file/pipe into the ogg_sync framer */ +static long _get_data(OggVorbis_File *vf){ + errno=0; + if(!(vf->callbacks.read_func))return(-1); + if(vf->datasource){ + char *buffer=ogg_sync_buffer(&vf->oy,CHUNKSIZE); + long bytes=(vf->callbacks.read_func)(buffer,1,CHUNKSIZE,vf->datasource); + if(bytes>0)ogg_sync_wrote(&vf->oy,bytes); + if(bytes==0 && errno)return(-1); + return(bytes); + }else + return(0); +} + +/* save a tiny smidge of verbosity to make the code more readable */ +static int _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){ + if(vf->datasource){ + if(!(vf->callbacks.seek_func)|| + (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET) == -1) + return OV_EREAD; + vf->offset=offset; + ogg_sync_reset(&vf->oy); + }else{ + /* shouldn't happen unless someone writes a broken callback */ + return OV_EFAULT; + } + return 0; +} + +/* The read/seek functions track absolute position within the stream */ + +/* from the head of the stream, get the next page. boundary specifies + if the function is allowed to fetch more data from the stream (and + how much) or only use internally buffered data. + + boundary: -1) unbounded search + 0) read no additional data; use cached only + n) search for a new page beginning for n bytes + + return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD) + n) found a page at absolute offset n */ + +static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og, + ogg_int64_t boundary){ + if(boundary>0)boundary+=vf->offset; + while(1){ + long more; + + if(boundary>0 && vf->offset>=boundary)return(OV_FALSE); + more=ogg_sync_pageseek(&vf->oy,og); + + if(more<0){ + /* skipped n bytes */ + vf->offset-=more; + }else{ + if(more==0){ + /* send more paramedics */ + if(!boundary)return(OV_FALSE); + { + long ret=_get_data(vf); + if(ret==0)return(OV_EOF); + if(ret<0)return(OV_EREAD); + } + }else{ + /* got a page. Return the offset at the page beginning, + advance the internal offset past the page end */ + ogg_int64_t ret=vf->offset; + vf->offset+=more; + return(ret); + + } + } + } +} + +/* find the latest page beginning before the current stream cursor + position. Much dirtier than the above as Ogg doesn't have any + backward search linkage. no 'readp' as it will certainly have to + read. */ +/* returns offset or OV_EREAD, OV_FAULT */ +static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){ + ogg_int64_t begin=vf->offset; + ogg_int64_t end=begin; + ogg_int64_t ret; + ogg_int64_t offset=-1; + + while(offset==-1){ + begin-=CHUNKSIZE; + if(begin<0) + begin=0; + + ret=_seek_helper(vf,begin); + if(ret)return(ret); + + while(vf->offsetoffset); + if(ret==OV_EREAD)return(OV_EREAD); + if(ret<0){ + break; + }else{ + offset=ret; + } + } + } + + /* In a fully compliant, non-multiplexed stream, we'll still be + holding the last page. In multiplexed (or noncompliant streams), + we will probably have to re-read the last page we saw */ + if(og->header_len==0){ + ret=_seek_helper(vf,offset); + if(ret)return(ret); + + ret=_get_next_page(vf,og,CHUNKSIZE); + if(ret<0) + /* this shouldn't be possible */ + return(OV_EFAULT); + } + + return(offset); +} + +static void _add_serialno(ogg_page *og,ogg_uint32_t **serialno_list, int *n){ + ogg_uint32_t s = ogg_page_serialno(og); + (*n)++; + + if(*serialno_list){ + *serialno_list = _ogg_realloc(*serialno_list, sizeof(**serialno_list)*(*n)); + }else{ + *serialno_list = _ogg_malloc(sizeof(**serialno_list)); + } + + (*serialno_list)[(*n)-1] = s; +} + +/* returns nonzero if found */ +static int _lookup_serialno(ogg_uint32_t s, ogg_uint32_t *serialno_list, int n){ + if(serialno_list){ + while(n--){ + if(*serialno_list == s) return 1; + serialno_list++; + } + } + return 0; +} + +static int _lookup_page_serialno(ogg_page *og, ogg_uint32_t *serialno_list, int n){ + ogg_uint32_t s = ogg_page_serialno(og); + return _lookup_serialno(s,serialno_list,n); +} + +/* performs the same search as _get_prev_page, but prefers pages of + the specified serial number. If a page of the specified serialno is + spotted during the seek-back-and-read-forward, it will return the + info of last page of the matching serial number instead of the very + last page. If no page of the specified serialno is seen, it will + return the info of last page and alter *serialno. */ +static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, + ogg_uint32_t *serial_list, int serial_n, + int *serialno, ogg_int64_t *granpos){ + ogg_page og; + ogg_int64_t begin=vf->offset; + ogg_int64_t end=begin; + ogg_int64_t ret; + + ogg_int64_t prefoffset=-1; + ogg_int64_t offset=-1; + ogg_int64_t ret_serialno=-1; + ogg_int64_t ret_gran=-1; + + while(offset==-1){ + begin-=CHUNKSIZE; + if(begin<0) + begin=0; + + ret=_seek_helper(vf,begin); + if(ret)return(ret); + + while(vf->offsetoffset); + if(ret==OV_EREAD)return(OV_EREAD); + if(ret<0){ + break; + }else{ + ret_serialno=ogg_page_serialno(&og); + ret_gran=ogg_page_granulepos(&og); + offset=ret; + + if((ogg_uint32_t)ret_serialno == *serialno){ + prefoffset=ret; + *granpos=ret_gran; + } + + if(!_lookup_serialno((ogg_uint32_t)ret_serialno,serial_list,serial_n)){ + /* we fell off the end of the link, which means we seeked + back too far and shouldn't have been looking in that link + to begin with. If we found the preferred serial number, + forget that we saw it. */ + prefoffset=-1; + } + } + } + } + + /* we're not interested in the page... just the serialno and granpos. */ + if(prefoffset>=0)return(prefoffset); + + *serialno = ret_serialno; + *granpos = ret_gran; + return(offset); + +} + +/* uses the local ogg_stream storage in vf; this is important for + non-streaming input sources */ +static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc, + ogg_uint32_t **serialno_list, int *serialno_n, + ogg_page *og_ptr){ + ogg_page og; + ogg_packet op; + int i,ret; + int allbos=0; + + if(!og_ptr){ + ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE); + if(llret==OV_EREAD)return(OV_EREAD); + if(llret<0)return(OV_ENOTVORBIS); + og_ptr=&og; + } + + vorbis_info_init(vi); + vorbis_comment_init(vc); + vf->ready_state=OPENED; + + /* extract the serialnos of all BOS pages + the first set of vorbis + headers we see in the link */ + + while(ogg_page_bos(og_ptr)){ + if(serialno_list){ + if(_lookup_page_serialno(og_ptr,*serialno_list,*serialno_n)){ + /* a dupe serialnumber in an initial header packet set == invalid stream */ + if(*serialno_list)_ogg_free(*serialno_list); + *serialno_list=0; + *serialno_n=0; + ret=OV_EBADHEADER; + goto bail_header; + } + + _add_serialno(og_ptr,serialno_list,serialno_n); + } + + if(vf->ready_stateos,ogg_page_serialno(og_ptr)); + ogg_stream_pagein(&vf->os,og_ptr); + + if(ogg_stream_packetout(&vf->os,&op) > 0 && + vorbis_synthesis_idheader(&op)){ + /* vorbis header; continue setup */ + vf->ready_state=STREAMSET; + if((ret=vorbis_synthesis_headerin(vi,vc,&op))){ + ret=OV_EBADHEADER; + goto bail_header; + } + } + } + + /* get next page */ + { + ogg_int64_t llret=_get_next_page(vf,og_ptr,CHUNKSIZE); + if(llret==OV_EREAD){ + ret=OV_EREAD; + goto bail_header; + } + if(llret<0){ + ret=OV_ENOTVORBIS; + goto bail_header; + } + + /* if this page also belongs to our vorbis stream, submit it and break */ + if(vf->ready_state==STREAMSET && + vf->os.serialno == ogg_page_serialno(og_ptr)){ + ogg_stream_pagein(&vf->os,og_ptr); + break; + } + } + } + + if(vf->ready_state!=STREAMSET){ + ret = OV_ENOTVORBIS; + goto bail_header; + } + + while(1){ + + i=0; + while(i<2){ /* get a page loop */ + + while(i<2){ /* get a packet loop */ + + int result=ogg_stream_packetout(&vf->os,&op); + if(result==0)break; + if(result==-1){ + ret=OV_EBADHEADER; + goto bail_header; + } + + if((ret=vorbis_synthesis_headerin(vi,vc,&op))) + goto bail_header; + + i++; + } + + while(i<2){ + if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){ + ret=OV_EBADHEADER; + goto bail_header; + } + + /* if this page belongs to the correct stream, go parse it */ + if(vf->os.serialno == ogg_page_serialno(og_ptr)){ + ogg_stream_pagein(&vf->os,og_ptr); + break; + } + + /* if we never see the final vorbis headers before the link + ends, abort */ + if(ogg_page_bos(og_ptr)){ + if(allbos){ + ret = OV_EBADHEADER; + goto bail_header; + }else + allbos=1; + } + + /* otherwise, keep looking */ + } + } + + return 0; + } + + bail_header: + vorbis_info_clear(vi); + vorbis_comment_clear(vc); + vf->ready_state=OPENED; + + return ret; +} + +/* Starting from current cursor position, get initial PCM offset of + next page. Consumes the page in the process without decoding + audio, however this is only called during stream parsing upon + seekable open. */ +static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi){ + ogg_page og; + ogg_int64_t accumulated=0; + long lastblock=-1; + int result; + int serialno = vf->os.serialno; + + while(1){ + ogg_packet op; + if(_get_next_page(vf,&og,-1)<0) + break; /* should not be possible unless the file is truncated/mangled */ + + if(ogg_page_bos(&og)) break; + if(ogg_page_serialno(&og)!=serialno) continue; + + /* count blocksizes of all frames in the page */ + ogg_stream_pagein(&vf->os,&og); + while((result=ogg_stream_packetout(&vf->os,&op))){ + if(result>0){ /* ignore holes */ + long thisblock=vorbis_packet_blocksize(vi,&op); + if(lastblock!=-1) + accumulated+=(lastblock+thisblock)>>2; + lastblock=thisblock; + } + } + + if(ogg_page_granulepos(&og)!=-1){ + /* pcm offset of last packet on the first audio page */ + accumulated= ogg_page_granulepos(&og)-accumulated; + break; + } + } + + /* less than zero? This is a stream with samples trimmed off + the beginning, a normal occurrence; set the offset to zero */ + if(accumulated<0)accumulated=0; + + return accumulated; +} + +/* finds each bitstream link one at a time using a bisection search + (has to begin by knowing the offset of the lb's initial page). + Recurses for each link so it can alloc the link storage after + finding them all, then unroll and fill the cache at the same time */ +static int _bisect_forward_serialno(OggVorbis_File *vf, + ogg_int64_t begin, + ogg_int64_t searched, + ogg_int64_t end, + ogg_int64_t endgran, + int endserial, + ogg_uint32_t *currentno_list, + int currentnos, + long m){ + ogg_int64_t pcmoffset; + ogg_int64_t dataoffset=searched; + ogg_int64_t endsearched=end; + ogg_int64_t next=end; + ogg_int64_t searchgran=-1; + ogg_page og; + ogg_int64_t ret,last; + int serialno = vf->os.serialno; + + /* invariants: + we have the headers and serialnos for the link beginning at 'begin' + we have the offset and granpos of the last page in the file (potentially + not a page we care about) + */ + + /* Is the last page in our list of current serialnumbers? */ + if(_lookup_serialno(endserial,currentno_list,currentnos)){ + + /* last page is in the starting serialno list, so we've bisected + down to (or just started with) a single link. Now we need to + find the last vorbis page belonging to the first vorbis stream + for this link. */ + + while(endserial != serialno){ + endserial = serialno; + vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&endserial,&endgran); + } + + vf->links=m+1; + if(vf->offsets)_ogg_free(vf->offsets); + if(vf->serialnos)_ogg_free(vf->serialnos); + if(vf->dataoffsets)_ogg_free(vf->dataoffsets); + + vf->offsets=_ogg_malloc((vf->links+1)*sizeof(*vf->offsets)); + vf->vi=_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi)); + vf->vc=_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc)); + vf->serialnos=_ogg_malloc(vf->links*sizeof(*vf->serialnos)); + vf->dataoffsets=_ogg_malloc(vf->links*sizeof(*vf->dataoffsets)); + vf->pcmlengths=_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths)); + + vf->offsets[m+1]=end; + vf->offsets[m]=begin; + vf->pcmlengths[m*2+1]=endgran; + + }else{ + + ogg_uint32_t *next_serialno_list=NULL; + int next_serialnos=0; + vorbis_info vi; + vorbis_comment vc; + + /* the below guards against garbage seperating the last and + first pages of two links. */ + while(searchedoffset){ + ret=_seek_helper(vf,bisect); + if(ret)return(ret); + } + + last=_get_next_page(vf,&og,-1); + if(last==OV_EREAD)return(OV_EREAD); + if(last<0 || !_lookup_page_serialno(&og,currentno_list,currentnos)){ + endsearched=bisect; + if(last>=0)next=last; + }else{ + searched=vf->offset; + } + } + + /* Bisection point found */ + + /* for the time being, fetch end PCM offset the simple way */ + { + int testserial = serialno+1; + vf->offset = next; + while(testserial != serialno){ + testserial = serialno; + vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&testserial,&searchgran); + } + } + + if(vf->offset!=next){ + ret=_seek_helper(vf,next); + if(ret)return(ret); + } + + ret=_fetch_headers(vf,&vi,&vc,&next_serialno_list,&next_serialnos,NULL); + if(ret)return(ret); + serialno = vf->os.serialno; + dataoffset = vf->offset; + + /* this will consume a page, however the next bistection always + starts with a raw seek */ + pcmoffset = _initial_pcmoffset(vf,&vi); + + ret=_bisect_forward_serialno(vf,next,vf->offset,end,endgran,endserial, + next_serialno_list,next_serialnos,m+1); + if(ret)return(ret); + + if(next_serialno_list)_ogg_free(next_serialno_list); + + vf->offsets[m+1]=next; + vf->serialnos[m+1]=serialno; + vf->dataoffsets[m+1]=dataoffset; + + vf->vi[m+1]=vi; + vf->vc[m+1]=vc; + + vf->pcmlengths[m*2+1]=searchgran; + vf->pcmlengths[m*2+2]=pcmoffset; + vf->pcmlengths[m*2+3]-=pcmoffset; + + } + return(0); +} + +static int _make_decode_ready(OggVorbis_File *vf){ + if(vf->ready_state>STREAMSET)return 0; + if(vf->ready_stateseekable){ + if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link)) + return OV_EBADLINK; + }else{ + if(vorbis_synthesis_init(&vf->vd,vf->vi)) + return OV_EBADLINK; + } + vorbis_block_init(&vf->vd,&vf->vb); + vf->ready_state=INITSET; + vf->bittrack=0; + vf->samptrack=0; + return 0; +} + +static int _open_seekable2(OggVorbis_File *vf){ + ogg_int64_t dataoffset=vf->dataoffsets[0],end,endgran=-1; + int endserial=vf->os.serialno; + int serialno=vf->os.serialno; + + /* we're partially open and have a first link header state in + storage in vf */ + + /* fetch initial PCM offset */ + ogg_int64_t pcmoffset = _initial_pcmoffset(vf,vf->vi); + + /* we can seek, so set out learning all about this file */ + if(vf->callbacks.seek_func && vf->callbacks.tell_func){ + (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END); + vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource); + }else{ + vf->offset=vf->end=-1; + } + + /* If seek_func is implemented, tell_func must also be implemented */ + if(vf->end==-1) return(OV_EINVAL); + + /* Get the offset of the last page of the physical bitstream, or, if + we're lucky the last vorbis page of this link as most OggVorbis + files will contain a single logical bitstream */ + end=_get_prev_page_serial(vf,vf->serialnos+2,vf->serialnos[1],&endserial,&endgran); + if(end<0)return(end); + + /* now determine bitstream structure recursively */ + if(_bisect_forward_serialno(vf,0,dataoffset,vf->offset,endgran,endserial, + vf->serialnos+2,vf->serialnos[1],0)<0)return(OV_EREAD); + + vf->offsets[0]=0; + vf->serialnos[0]=serialno; + vf->dataoffsets[0]=dataoffset; + vf->pcmlengths[0]=pcmoffset; + vf->pcmlengths[1]-=pcmoffset; + + return(ov_raw_seek(vf,dataoffset)); +} + +/* clear out the current logical bitstream decoder */ +static void _decode_clear(OggVorbis_File *vf){ + vorbis_dsp_clear(&vf->vd); + vorbis_block_clear(&vf->vb); + vf->ready_state=OPENED; +} + +/* fetch and process a packet. Handles the case where we're at a + bitstream boundary and dumps the decoding machine. If the decoding + machine is unloaded, it loads it. It also keeps pcm_offset up to + date (seek and read both use this. seek uses a special hack with + readp). + + return: <0) error, OV_HOLE (lost packet) or OV_EOF + 0) need more data (only if readp==0) + 1) got a packet +*/ + +static int _fetch_and_process_packet(OggVorbis_File *vf, + ogg_packet *op_in, + int readp, + int spanp){ + ogg_page og; + + /* handle one packet. Try to fetch it from current stream state */ + /* extract packets from page */ + while(1){ + + if(vf->ready_state==STREAMSET){ + int ret=_make_decode_ready(vf); + if(ret<0)return ret; + } + + /* process a packet if we can. If the machine isn't loaded, + neither is a page */ + if(vf->ready_state==INITSET){ + while(1) { + ogg_packet op; + ogg_packet *op_ptr=(op_in?op_in:&op); + int result=ogg_stream_packetout(&vf->os,op_ptr); + ogg_int64_t granulepos; + + op_in=NULL; + if(result==-1)return(OV_HOLE); /* hole in the data. */ + if(result>0){ + /* got a packet. process it */ + granulepos=op_ptr->granulepos; + if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy + header handling. The + header packets aren't + audio, so if/when we + submit them, + vorbis_synthesis will + reject them */ + + /* suck in the synthesis data and track bitrate */ + { + int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL); + /* for proper use of libvorbis within libvorbisfile, + oldsamples will always be zero. */ + if(oldsamples)return(OV_EFAULT); + + vorbis_synthesis_blockin(&vf->vd,&vf->vb); + vf->samptrack+=vorbis_synthesis_pcmout(&vf->vd,NULL)-oldsamples; + vf->bittrack+=op_ptr->bytes*8; + } + + /* update the pcm offset. */ + if(granulepos!=-1 && !op_ptr->e_o_s){ + int link=(vf->seekable?vf->current_link:0); + int i,samples; + + /* this packet has a pcm_offset on it (the last packet + completed on a page carries the offset) After processing + (above), we know the pcm position of the *last* sample + ready to be returned. Find the offset of the *first* + + As an aside, this trick is inaccurate if we begin + reading anew right at the last page; the end-of-stream + granulepos declares the last frame in the stream, and the + last packet of the last page may be a partial frame. + So, we need a previous granulepos from an in-sequence page + to have a reference point. Thus the !op_ptr->e_o_s clause + above */ + + if(vf->seekable && link>0) + granulepos-=vf->pcmlengths[link*2]; + if(granulepos<0)granulepos=0; /* actually, this + shouldn't be possible + here unless the stream + is very broken */ + + samples=vorbis_synthesis_pcmout(&vf->vd,NULL); + + granulepos-=samples; + for(i=0;ipcmlengths[i*2+1]; + vf->pcm_offset=granulepos; + } + return(1); + } + } + else + break; + } + } + + if(vf->ready_state>=OPENED){ + ogg_int64_t ret; + + while(1){ + /* the loop is not strictly necessary, but there's no sense in + doing the extra checks of the larger loop for the common + case in a multiplexed bistream where the page is simply + part of a different logical bitstream; keep reading until + we get one with the correct serialno */ + + if(!readp)return(0); + if((ret=_get_next_page(vf,&og,-1))<0){ + return(OV_EOF); /* eof. leave unitialized */ + } + + /* bitrate tracking; add the header's bytes here, the body bytes + are done by packet above */ + vf->bittrack+=og.header_len*8; + + if(vf->ready_state==INITSET){ + if(vf->current_serialno!=ogg_page_serialno(&og)){ + + /* two possibilities: + 1) our decoding just traversed a bitstream boundary + 2) another stream is multiplexed into this logical section */ + + if(ogg_page_bos(&og)){ + /* boundary case */ + if(!spanp) + return(OV_EOF); + + _decode_clear(vf); + + if(!vf->seekable){ + vorbis_info_clear(vf->vi); + vorbis_comment_clear(vf->vc); + } + break; + + }else + continue; /* possibility #2 */ + } + } + + break; + } + } + + /* Do we need to load a new machine before submitting the page? */ + /* This is different in the seekable and non-seekable cases. + + In the seekable case, we already have all the header + information loaded and cached; we just initialize the machine + with it and continue on our merry way. + + In the non-seekable (streaming) case, we'll only be at a + boundary if we just left the previous logical bitstream and + we're now nominally at the header of the next bitstream + */ + + if(vf->ready_state!=INITSET){ + int link; + + if(vf->ready_stateseekable){ + ogg_uint32_t serialno = ogg_page_serialno(&og); + + /* match the serialno to bitstream section. We use this rather than + offset positions to avoid problems near logical bitstream + boundaries */ + + for(link=0;linklinks;link++) + if(vf->serialnos[link]==serialno)break; + + if(link==vf->links) continue; /* not the desired Vorbis + bitstream section; keep + trying */ + + vf->current_serialno=serialno; + vf->current_link=link; + + ogg_stream_reset_serialno(&vf->os,vf->current_serialno); + vf->ready_state=STREAMSET; + + }else{ + /* we're streaming */ + /* fetch the three header packets, build the info struct */ + + int ret=_fetch_headers(vf,vf->vi,vf->vc,NULL,NULL,&og); + if(ret)return(ret); + vf->current_serialno=vf->os.serialno; + vf->current_link++; + link=0; + } + } + } + + /* the buffered page is the data we want, and we're ready for it; + add it to the stream state */ + ogg_stream_pagein(&vf->os,&og); + + } +} + +/* if, eg, 64 bit stdio is configured by default, this will build with + fseek64 */ +static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){ + if(f==NULL)return(-1); + return fseek(f,off,whence); +} + +static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial, + long ibytes, ov_callbacks callbacks){ + int offsettest=((f && callbacks.seek_func)?callbacks.seek_func(f,0,SEEK_CUR):-1); + ogg_uint32_t *serialno_list=NULL; + int serialno_list_size=0; + int ret; + + memset(vf,0,sizeof(*vf)); + vf->datasource=f; + vf->callbacks = callbacks; + + /* init the framing state */ + ogg_sync_init(&vf->oy); + + /* perhaps some data was previously read into a buffer for testing + against other stream types. Allow initialization from this + previously read data (especially as we may be reading from a + non-seekable stream) */ + if(initial){ + char *buffer=ogg_sync_buffer(&vf->oy,ibytes); + memcpy(buffer,initial,ibytes); + ogg_sync_wrote(&vf->oy,ibytes); + } + + /* can we seek? Stevens suggests the seek test was portable */ + if(offsettest!=-1)vf->seekable=1; + + /* No seeking yet; Set up a 'single' (current) logical bitstream + entry for partial open */ + vf->links=1; + vf->vi=_ogg_calloc(vf->links,sizeof(*vf->vi)); + vf->vc=_ogg_calloc(vf->links,sizeof(*vf->vc)); + ogg_stream_init(&vf->os,-1); /* fill in the serialno later */ + + /* Fetch all BOS pages, store the vorbis header and all seen serial + numbers, load subsequent vorbis setup headers */ + if((ret=_fetch_headers(vf,vf->vi,vf->vc,&serialno_list,&serialno_list_size,NULL))<0){ + vf->datasource=NULL; + ov_clear(vf); + }else{ + /* serial number list for first link needs to be held somewhere + for second stage of seekable stream open; this saves having to + seek/reread first link's serialnumber data then. */ + vf->serialnos=_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos)); + vf->serialnos[0]=vf->current_serialno=vf->os.serialno; + vf->serialnos[1]=serialno_list_size; + memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos)); + + vf->offsets=_ogg_calloc(1,sizeof(*vf->offsets)); + vf->dataoffsets=_ogg_calloc(1,sizeof(*vf->dataoffsets)); + vf->offsets[0]=0; + vf->dataoffsets[0]=vf->offset; + + vf->ready_state=PARTOPEN; + } + if(serialno_list)_ogg_free(serialno_list); + return(ret); +} + +static int _ov_open2(OggVorbis_File *vf){ + if(vf->ready_state != PARTOPEN) return OV_EINVAL; + vf->ready_state=OPENED; + if(vf->seekable){ + int ret=_open_seekable2(vf); + if(ret){ + vf->datasource=NULL; + ov_clear(vf); + } + return(ret); + }else + vf->ready_state=STREAMSET; + + return 0; +} + + +/* clear out the OggVorbis_File struct */ +int ov_clear(OggVorbis_File *vf){ + if(vf){ + vorbis_block_clear(&vf->vb); + vorbis_dsp_clear(&vf->vd); + ogg_stream_clear(&vf->os); + + if(vf->vi && vf->links){ + int i; + for(i=0;ilinks;i++){ + vorbis_info_clear(vf->vi+i); + vorbis_comment_clear(vf->vc+i); + } + _ogg_free(vf->vi); + _ogg_free(vf->vc); + } + if(vf->dataoffsets)_ogg_free(vf->dataoffsets); + if(vf->pcmlengths)_ogg_free(vf->pcmlengths); + if(vf->serialnos)_ogg_free(vf->serialnos); + if(vf->offsets)_ogg_free(vf->offsets); + ogg_sync_clear(&vf->oy); + if(vf->datasource && vf->callbacks.close_func) + (vf->callbacks.close_func)(vf->datasource); + memset(vf,0,sizeof(*vf)); + } +#ifdef DEBUG_LEAKS + _VDBG_dump(); +#endif + return(0); +} + +/* inspects the OggVorbis file and finds/documents all the logical + bitstreams contained in it. Tries to be tolerant of logical + bitstream sections that are truncated/woogie. + + return: -1) error + 0) OK +*/ + +int ov_open_callbacks(void *f,OggVorbis_File *vf, + const char *initial,long ibytes,ov_callbacks callbacks){ + int ret=_ov_open1(f,vf,initial,ibytes,callbacks); + if(ret)return ret; + return _ov_open2(vf); +} + +int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ + ov_callbacks callbacks = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell + }; + + return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks); +} + +int ov_fopen(const char *path,OggVorbis_File *vf){ + int ret; + FILE *f = fopen(path,"rb"); + if(!f) return -1; + + ret = ov_open(f,vf,NULL,0); + if(ret) fclose(f); + return ret; +} + + +/* Only partially open the vorbis file; test for Vorbisness, and load + the headers for the first chain. Do not seek (although test for + seekability). Use ov_test_open to finish opening the file, else + ov_clear to close/free it. Same return codes as open. */ + +int ov_test_callbacks(void *f,OggVorbis_File *vf, + const char *initial,long ibytes,ov_callbacks callbacks) +{ + return _ov_open1(f,vf,initial,ibytes,callbacks); +} + +int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ + ov_callbacks callbacks = { + (size_t (*)(void *, size_t, size_t, void *)) fread, + (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, + (int (*)(void *)) fclose, + (long (*)(void *)) ftell + }; + + return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks); +} + +int ov_test_open(OggVorbis_File *vf){ + if(vf->ready_state!=PARTOPEN)return(OV_EINVAL); + return _ov_open2(vf); +} + +/* How many logical bitstreams in this physical bitstream? */ +long ov_streams(OggVorbis_File *vf){ + return vf->links; +} + +/* Is the FILE * associated with vf seekable? */ +long ov_seekable(OggVorbis_File *vf){ + return vf->seekable; +} + +/* returns the bitrate for a given logical bitstream or the entire + physical bitstream. If the file is open for random access, it will + find the *actual* average bitrate. If the file is streaming, it + returns the nominal bitrate (if set) else the average of the + upper/lower bounds (if set) else -1 (unset). + + If you want the actual bitrate field settings, get them from the + vorbis_info structs */ + +long ov_bitrate(OggVorbis_File *vf,int i){ + if(vf->ready_state=vf->links)return(OV_EINVAL); + if(!vf->seekable && i!=0)return(ov_bitrate(vf,0)); + if(i<0){ + ogg_int64_t bits=0; + int i; + for(i=0;ilinks;i++) + bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8; + /* This once read: return(rint(bits/ov_time_total(vf,-1))); + * gcc 3.x on x86 miscompiled this at optimisation level 2 and above, + * so this is slightly transformed to make it work. + */ + return(bits*1000/ov_time_total(vf,-1)); + }else{ + if(vf->seekable){ + /* return the actual bitrate */ + return((vf->offsets[i+1]-vf->dataoffsets[i])*8000/ov_time_total(vf,i)); + }else{ + /* return nominal if set */ + if(vf->vi[i].bitrate_nominal>0){ + return vf->vi[i].bitrate_nominal; + }else{ + if(vf->vi[i].bitrate_upper>0){ + if(vf->vi[i].bitrate_lower>0){ + return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2; + }else{ + return vf->vi[i].bitrate_upper; + } + } + return(OV_FALSE); + } + } + } +} + +/* returns the actual bitrate since last call. returns -1 if no + additional data to offer since last call (or at beginning of stream), + EINVAL if stream is only partially open +*/ +long ov_bitrate_instant(OggVorbis_File *vf){ + int link=(vf->seekable?vf->current_link:0); + long ret; + if(vf->ready_statesamptrack==0)return(OV_FALSE); + ret=vf->bittrack/vf->samptrack*vf->vi[link].rate; + vf->bittrack=0; + vf->samptrack=0; + return(ret); +} + +/* Guess */ +long ov_serialnumber(OggVorbis_File *vf,int i){ + if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1)); + if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1)); + if(i<0){ + return(vf->current_serialno); + }else{ + return(vf->serialnos[i]); + } +} + +/* returns: total raw (compressed) length of content if i==-1 + raw (compressed) length of that logical bitstream for i==0 to n + OV_EINVAL if the stream is not seekable (we can't know the length) + or if stream is only partially open +*/ +ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){ + if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); + if(i<0){ + ogg_int64_t acc=0; + int i; + for(i=0;ilinks;i++) + acc+=ov_raw_total(vf,i); + return(acc); + }else{ + return(vf->offsets[i+1]-vf->offsets[i]); + } +} + +/* returns: total PCM length (samples) of content if i==-1 PCM length + (samples) of that logical bitstream for i==0 to n + OV_EINVAL if the stream is not seekable (we can't know the + length) or only partially open +*/ +ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){ + if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); + if(i<0){ + ogg_int64_t acc=0; + int i; + for(i=0;ilinks;i++) + acc+=ov_pcm_total(vf,i); + return(acc); + }else{ + return(vf->pcmlengths[i*2+1]); + } +} + +/* returns: total milliseconds of content if i==-1 + milliseconds in that logical bitstream for i==0 to n + OV_EINVAL if the stream is not seekable (we can't know the + length) or only partially open +*/ +ogg_int64_t ov_time_total(OggVorbis_File *vf,int i){ + if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); + if(i<0){ + ogg_int64_t acc=0; + int i; + for(i=0;ilinks;i++) + acc+=ov_time_total(vf,i); + return(acc); + }else{ + return(((ogg_int64_t)vf->pcmlengths[i*2+1])*1000/vf->vi[i].rate); + } +} + +/* seek to an offset relative to the *compressed* data. This also + scans packets to update the PCM cursor. It will cross a logical + bitstream boundary, but only if it can't get any packets out of the + tail of the bitstream we seek to (so no surprises). + + returns zero on success, nonzero on failure */ + +int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){ + ogg_stream_state work_os; + int ret; + + if(vf->ready_stateseekable) + return(OV_ENOSEEK); /* don't dump machine if we can't seek */ + + if(pos<0 || pos>vf->end)return(OV_EINVAL); + + /* is the seek position outside our current link [if any]? */ + if(vf->ready_state>=STREAMSET){ + if(posoffsets[vf->current_link] || pos>=vf->offsets[vf->current_link+1]) + _decode_clear(vf); /* clear out stream state */ + } + + /* don't yet clear out decoding machine (if it's initialized), in + the case we're in the same link. Restart the decode lapping, and + let _fetch_and_process_packet deal with a potential bitstream + boundary */ + vf->pcm_offset=-1; + ogg_stream_reset_serialno(&vf->os, + vf->current_serialno); /* must set serialno */ + vorbis_synthesis_restart(&vf->vd); + + ret=_seek_helper(vf,pos); + if(ret)goto seek_error; + + /* we need to make sure the pcm_offset is set, but we don't want to + advance the raw cursor past good packets just to get to the first + with a granulepos. That's not equivalent behavior to beginning + decoding as immediately after the seek position as possible. + + So, a hack. We use two stream states; a local scratch state and + the shared vf->os stream state. We use the local state to + scan, and the shared state as a buffer for later decode. + + Unfortuantely, on the last page we still advance to last packet + because the granulepos on the last page is not necessarily on a + packet boundary, and we need to make sure the granpos is + correct. + */ + + { + ogg_page og; + ogg_packet op; + int lastblock=0; + int accblock=0; + int thisblock=0; + int lastflag=0; + int firstflag=0; + ogg_int64_t pagepos=-1; + + ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */ + ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE + return from not necessarily + starting from the beginning */ + + while(1){ + if(vf->ready_state>=STREAMSET){ + /* snarf/scan a packet if we can */ + int result=ogg_stream_packetout(&work_os,&op); + + if(result>0){ + + if(vf->vi[vf->current_link].codec_setup){ + thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); + if(thisblock<0){ + ogg_stream_packetout(&vf->os,NULL); + thisblock=0; + }else{ + + /* We can't get a guaranteed correct pcm position out of the + last page in a stream because it might have a 'short' + granpos, which can only be detected in the presence of a + preceding page. However, if the last page is also the first + page, the granpos rules of a first page take precedence. Not + only that, but for first==last, the EOS page must be treated + as if its a normal first page for the stream to open/play. */ + if(lastflag && !firstflag) + ogg_stream_packetout(&vf->os,NULL); + else + if(lastblock)accblock+=(lastblock+thisblock)>>2; + } + + if(op.granulepos!=-1){ + int i,link=vf->current_link; + ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2]; + if(granulepos<0)granulepos=0; + + for(i=0;ipcmlengths[i*2+1]; + vf->pcm_offset=granulepos-accblock; + if(vf->pcm_offset<0)vf->pcm_offset=0; + break; + } + lastblock=thisblock; + continue; + }else + ogg_stream_packetout(&vf->os,NULL); + } + } + + if(!lastblock){ + pagepos=_get_next_page(vf,&og,-1); + if(pagepos<0){ + vf->pcm_offset=ov_pcm_total(vf,-1); + break; + } + }else{ + /* huh? Bogus stream with packets but no granulepos */ + vf->pcm_offset=-1; + break; + } + + /* has our decoding just traversed a bitstream boundary? */ + if(vf->ready_state>=STREAMSET){ + if(vf->current_serialno!=ogg_page_serialno(&og)){ + + /* two possibilities: + 1) our decoding just traversed a bitstream boundary + 2) another stream is multiplexed into this logical section? */ + + if(ogg_page_bos(&og)){ + /* we traversed */ + _decode_clear(vf); /* clear out stream state */ + ogg_stream_clear(&work_os); + } /* else, do nothing; next loop will scoop another page */ + } + } + + if(vf->ready_statelinks;link++) + if(vf->serialnos[link]==serialno)break; + + if(link==vf->links) continue; /* not the desired Vorbis + bitstream section; keep + trying */ + vf->current_link=link; + vf->current_serialno=serialno; + ogg_stream_reset_serialno(&vf->os,serialno); + ogg_stream_reset_serialno(&work_os,serialno); + vf->ready_state=STREAMSET; + firstflag=(pagepos<=vf->dataoffsets[link]); + } + + ogg_stream_pagein(&vf->os,&og); + ogg_stream_pagein(&work_os,&og); + lastflag=ogg_page_eos(&og); + + } + } + + ogg_stream_clear(&work_os); + vf->bittrack=0; + vf->samptrack=0; + return(0); + + seek_error: + /* dump the machine so we're in a known state */ + vf->pcm_offset=-1; + ogg_stream_clear(&work_os); + _decode_clear(vf); + return OV_EBADLINK; +} + +/* rescales the number x from the range of [0,from] to [0,to] + x is in the range [0,from] + from, to are in the range [1, 1<<62-1] */ +ogg_int64_t rescale64(ogg_int64_t x, ogg_int64_t from, ogg_int64_t to){ + ogg_int64_t frac=0; + ogg_int64_t ret=0; + int i; + if(x >= from) return to; + if(x <= 0) return 0; + + for(i=0;i<64;i++){ + if(x>=from){ + frac|=1; + x-=from; + } + x<<=1; + frac<<=1; + } + + for(i=0;i<64;i++){ + if(frac & 1){ + ret+=to; + } + frac>>=1; + ret>>=1; + } + + return ret; +} + +/* Page granularity seek (faster than sample granularity because we + don't do the last bit of decode to find a specific sample). + + Seek to the last [granule marked] page preceding the specified pos + location, such that decoding past the returned point will quickly + arrive at the requested position. */ +int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ + int link=-1; + ogg_int64_t result=0; + ogg_int64_t total=ov_pcm_total(vf,-1); + + if(vf->ready_stateseekable)return(OV_ENOSEEK); + + if(pos<0 || pos>total)return(OV_EINVAL); + + /* which bitstream section does this pcm offset occur in? */ + for(link=vf->links-1;link>=0;link--){ + total-=vf->pcmlengths[link*2+1]; + if(pos>=total)break; + } + + /* search within the logical bitstream for the page with the highest + pcm_pos preceding (or equal to) pos. There is a danger here; + missing pages or incorrect frame number information in the + bitstream could make our task impossible. Account for that (it + would be an error condition) */ + + /* new search algorithm by HB (Nicholas Vinen) */ + { + ogg_int64_t end=vf->offsets[link+1]; + ogg_int64_t begin=vf->offsets[link]; + ogg_int64_t begintime = vf->pcmlengths[link*2]; + ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime; + ogg_int64_t target=pos-total+begintime; + ogg_int64_t best=begin; + + ogg_page og; + while(beginoffset){ + result=_seek_helper(vf,bisect); + if(result) goto seek_error; + } + + while(beginoffset); + if(result==OV_EREAD) goto seek_error; + if(result<0){ + if(bisect<=begin+1) + end=begin; /* found it */ + else{ + if(bisect==0) goto seek_error; + bisect-=CHUNKSIZE; + if(bisect<=begin)bisect=begin+1; + result=_seek_helper(vf,bisect); + if(result) goto seek_error; + } + }else{ + ogg_int64_t granulepos; + + if(ogg_page_serialno(&og)!=vf->serialnos[link]) + continue; + + granulepos=ogg_page_granulepos(&og); + if(granulepos==-1)continue; + + if(granuleposoffset; /* raw offset of next page */ + begintime=granulepos; + + if(target-begintime>44100)break; + bisect=begin; /* *not* begin + 1 */ + }else{ + if(bisect<=begin+1) + end=begin; /* found it */ + else{ + if(end==vf->offset){ /* we're pretty close - we'd be stuck in */ + end=result; + bisect-=CHUNKSIZE; /* an endless loop otherwise. */ + if(bisect<=begin)bisect=begin+1; + result=_seek_helper(vf,bisect); + if(result) goto seek_error; + }else{ + end=bisect; + endtime=granulepos; + break; + } + } + } + } + } + } + + /* found our page. seek to it, update pcm offset. Easier case than + raw_seek, don't keep packets preceding granulepos. */ + { + ogg_page og; + ogg_packet op; + + /* seek */ + result=_seek_helper(vf,best); + vf->pcm_offset=-1; + if(result) goto seek_error; + result=_get_next_page(vf,&og,-1); + if(result<0) goto seek_error; + + if(link!=vf->current_link){ + /* Different link; dump entire decode machine */ + _decode_clear(vf); + + vf->current_link=link; + vf->current_serialno=vf->serialnos[link]; + vf->ready_state=STREAMSET; + + }else{ + vorbis_synthesis_restart(&vf->vd); + } + + ogg_stream_reset_serialno(&vf->os,vf->current_serialno); + ogg_stream_pagein(&vf->os,&og); + + /* pull out all but last packet; the one with granulepos */ + while(1){ + result=ogg_stream_packetpeek(&vf->os,&op); + if(result==0){ + /* !!! the packet finishing this page originated on a + preceding page. Keep fetching previous pages until we + get one with a granulepos or without the 'continued' flag + set. Then just use raw_seek for simplicity. */ + + result=_seek_helper(vf,best); + if(result<0) goto seek_error; + + while(1){ + result=_get_prev_page(vf,&og); + if(result<0) goto seek_error; + if(ogg_page_serialno(&og)==vf->current_serialno && + (ogg_page_granulepos(&og)>-1 || + !ogg_page_continued(&og))){ + return ov_raw_seek(vf,result); + } + vf->offset=result; + } + } + if(result<0){ + result = OV_EBADPACKET; + goto seek_error; + } + if(op.granulepos!=-1){ + vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; + if(vf->pcm_offset<0)vf->pcm_offset=0; + vf->pcm_offset+=total; + break; + }else + result=ogg_stream_packetout(&vf->os,NULL); + } + } + } + + /* verify result */ + if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){ + result=OV_EFAULT; + goto seek_error; + } + vf->bittrack=0; + vf->samptrack=0; + return(0); + + seek_error: + /* dump machine so we're in a known state */ + vf->pcm_offset=-1; + _decode_clear(vf); + return (int)result; +} + +/* seek to a sample offset relative to the decompressed pcm stream + returns zero on success, nonzero on failure */ + +int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ + int thisblock,lastblock=0; + int ret=ov_pcm_seek_page(vf,pos); + if(ret<0)return(ret); + if((ret=_make_decode_ready(vf)))return ret; + + /* discard leading packets we don't need for the lapping of the + position we want; don't decode them */ + + while(1){ + ogg_packet op; + ogg_page og; + + int ret=ogg_stream_packetpeek(&vf->os,&op); + if(ret>0){ + thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); + if(thisblock<0){ + ogg_stream_packetout(&vf->os,NULL); + continue; /* non audio packet */ + } + if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2; + + if(vf->pcm_offset+((thisblock+ + vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break; + + /* remove the packet from packet queue and track its granulepos */ + ogg_stream_packetout(&vf->os,NULL); + vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with + only tracking, no + pcm_decode */ + vorbis_synthesis_blockin(&vf->vd,&vf->vb); + + /* end of logical stream case is hard, especially with exact + length positioning. */ + + if(op.granulepos>-1){ + int i; + /* always believe the stream markers */ + vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; + if(vf->pcm_offset<0)vf->pcm_offset=0; + for(i=0;icurrent_link;i++) + vf->pcm_offset+=vf->pcmlengths[i*2+1]; + } + + lastblock=thisblock; + + }else{ + if(ret<0 && ret!=OV_HOLE)break; + + /* suck in a new page */ + if(_get_next_page(vf,&og,-1)<0)break; + if(ogg_page_bos(&og))_decode_clear(vf); + + if(vf->ready_statelinks;link++) + if(vf->serialnos[link]==serialno)break; + if(link==vf->links) continue; + vf->current_link=link; + + vf->ready_state=STREAMSET; + vf->current_serialno=ogg_page_serialno(&og); + ogg_stream_reset_serialno(&vf->os,serialno); + ret=_make_decode_ready(vf); + if(ret)return ret; + lastblock=0; + } + + ogg_stream_pagein(&vf->os,&og); + } + } + + vf->bittrack=0; + vf->samptrack=0; + /* discard samples until we reach the desired position. Crossing a + logical bitstream boundary with abandon is OK. */ + while(vf->pcm_offsetpcm_offset; + long samples=vorbis_synthesis_pcmout(&vf->vd,NULL); + + if(samples>target)samples=target; + vorbis_synthesis_read(&vf->vd,samples); + vf->pcm_offset+=samples; + + if(samplespcm_offset=ov_pcm_total(vf,-1); /* eof */ + } + return 0; +} + +/* seek to a playback time relative to the decompressed pcm stream + returns zero on success, nonzero on failure */ +int ov_time_seek(OggVorbis_File *vf,ogg_int64_t milliseconds){ + /* translate time to PCM position and call ov_pcm_seek */ + + int link=-1; + ogg_int64_t pcm_total=0; + ogg_int64_t time_total=0; + + if(vf->ready_stateseekable)return(OV_ENOSEEK); + if(milliseconds<0)return(OV_EINVAL); + + /* which bitstream section does this time offset occur in? */ + for(link=0;linklinks;link++){ + ogg_int64_t addsec = ov_time_total(vf,link); + if(millisecondspcmlengths[link*2+1]; + } + + if(link==vf->links)return(OV_EINVAL); + + /* enough information to convert time offset to pcm offset */ + { + ogg_int64_t target=pcm_total+(milliseconds-time_total)*vf->vi[link].rate/1000; + return(ov_pcm_seek(vf,target)); + } +} + +/* page-granularity version of ov_time_seek + returns zero on success, nonzero on failure */ +int ov_time_seek_page(OggVorbis_File *vf,ogg_int64_t milliseconds){ + /* translate time to PCM position and call ov_pcm_seek */ + + int link=-1; + ogg_int64_t pcm_total=0; + ogg_int64_t time_total=0; + + if(vf->ready_stateseekable)return(OV_ENOSEEK); + if(milliseconds<0)return(OV_EINVAL); + + /* which bitstream section does this time offset occur in? */ + for(link=0;linklinks;link++){ + ogg_int64_t addsec = ov_time_total(vf,link); + if(millisecondspcmlengths[link*2+1]; + } + + if(link==vf->links)return(OV_EINVAL); + + /* enough information to convert time offset to pcm offset */ + { + ogg_int64_t target=pcm_total+(milliseconds-time_total)*vf->vi[link].rate/1000; + return(ov_pcm_seek_page(vf,target)); + } +} + +/* tell the current stream offset cursor. Note that seek followed by + tell will likely not give the set offset due to caching */ +ogg_int64_t ov_raw_tell(OggVorbis_File *vf){ + if(vf->ready_stateoffset); +} + +/* return PCM offset (sample) of next PCM sample to be read */ +ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ + if(vf->ready_statepcm_offset); +} + +/* return time offset (milliseconds) of next PCM sample to be read */ +ogg_int64_t ov_time_tell(OggVorbis_File *vf){ + int link=0; + ogg_int64_t pcm_total=0; + ogg_int64_t time_total=0; + + if(vf->ready_stateseekable){ + pcm_total=ov_pcm_total(vf,-1); + time_total=ov_time_total(vf,-1); + + /* which bitstream section does this time offset occur in? */ + for(link=vf->links-1;link>=0;link--){ + pcm_total-=vf->pcmlengths[link*2+1]; + time_total-=ov_time_total(vf,link); + if(vf->pcm_offset>=pcm_total)break; + } + } + + return(time_total+(1000*vf->pcm_offset-pcm_total)/vf->vi[link].rate); +} + +/* link: -1) return the vorbis_info struct for the bitstream section + currently being decoded + 0-n) to request information for a specific bitstream section + + In the case of a non-seekable bitstream, any call returns the + current bitstream. NULL in the case that the machine is not + initialized */ + +vorbis_info *ov_info(OggVorbis_File *vf,int link){ + if(vf->seekable){ + if(link<0) + if(vf->ready_state>=STREAMSET) + return vf->vi+vf->current_link; + else + return vf->vi; + else + if(link>=vf->links) + return NULL; + else + return vf->vi+link; + }else{ + return vf->vi; + } +} + +/* grr, strong typing, grr, no templates/inheritence, grr */ +vorbis_comment *ov_comment(OggVorbis_File *vf,int link){ + if(vf->seekable){ + if(link<0) + if(vf->ready_state>=STREAMSET) + return vf->vc+vf->current_link; + else + return vf->vc; + else + if(link>=vf->links) + return NULL; + else + return vf->vc+link; + }else{ + return vf->vc; + } +} + +/* up to this point, everything could more or less hide the multiple + logical bitstream nature of chaining from the toplevel application + if the toplevel application didn't particularly care. However, at + the point that we actually read audio back, the multiple-section + nature must surface: Multiple bitstream sections do not necessarily + have to have the same number of channels or sampling rate. + + ov_read returns the sequential logical bitstream number currently + being decoded along with the PCM data in order that the toplevel + application can take action on channel/sample rate changes. This + number will be incremented even for streamed (non-seekable) streams + (for seekable streams, it represents the actual logical bitstream + index within the physical bitstream. Note that the accessor + functions above are aware of this dichotomy). + + input values: buffer) a buffer to hold packed PCM data for return + bytes_req) the byte length requested to be placed into buffer + + return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) + 0) EOF + n) number of bytes of PCM actually returned. The + below works on a packet-by-packet basis, so the + return length is not related to the 'length' passed + in, just guaranteed to fit. + + *section) set to the logical bitstream number */ + +long ov_read(OggVorbis_File *vf,char *buffer,int bytes_req,int *bitstream){ + int i,j; + + ogg_int32_t **pcm; + long samples; + + if(vf->ready_stateready_state==INITSET){ + samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); + if(samples)break; + } + + /* suck in another packet */ + { + int ret=_fetch_and_process_packet(vf,NULL,1,1); + if(ret==OV_EOF) + return(0); + if(ret<=0) + return(ret); + } + + } + + if(samples>0){ + + /* yay! proceed to pack data into the byte buffer */ + + long channels=ov_info(vf,-1)->channels; + + if(samples>(bytes_req/(2*channels))) + samples=bytes_req/(2*channels); + + for(i=0;i>9); + dest+=channels; + } + } + + vorbis_synthesis_read(&vf->vd,samples); + vf->pcm_offset+=samples; + if(bitstream)*bitstream=vf->current_link; + return(samples*2*channels); + }else{ + return(samples); + } +} diff --git a/Mednafen/mednafen/tremor/vorbisidec.pc.in b/Mednafen/mednafen/tremor/vorbisidec.pc.in new file mode 100644 index 0000000000..9c09524213 --- /dev/null +++ b/Mednafen/mednafen/tremor/vorbisidec.pc.in @@ -0,0 +1,14 @@ +# libvorbisidec pkg-config source file + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: vorbisidec +Description: vorbisidec is the integer Ogg Vorbis library +Version: @VERSION@ +Requires: ogg +Conflicts: +Libs: -L${libdir} -lvorbisidec -lm +Cflags: -I${includedir} diff --git a/Mednafen/mednafen/tremor/window.c b/Mednafen/mednafen/tremor/window.c new file mode 100644 index 0000000000..006a1ee6b5 --- /dev/null +++ b/Mednafen/mednafen/tremor/window.c @@ -0,0 +1,83 @@ +/******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE. * + * * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * BY THE Xiph.Org FOUNDATION http://www.xiph.org/ * + * * + ******************************************************************** + + function: window functions + + ********************************************************************/ + +#include +#include +#include "misc.h" +#include "window.h" +#include "window_lookup.h" + +const void *_vorbis_window(int type, int left){ + + switch(type){ + case 0: + + switch(left){ + case 32: + return vwin64; + case 64: + return vwin128; + case 128: + return vwin256; + case 256: + return vwin512; + case 512: + return vwin1024; + case 1024: + return vwin2048; + case 2048: + return vwin4096; + case 4096: + return vwin8192; + default: + return(0); + } + break; + default: + return(0); + } +} + +void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2], + long *blocksizes, + int lW,int W,int nW){ + + LOOKUP_T *window[2]={window_p[0],window_p[1]}; + long n=blocksizes[W]; + long ln=blocksizes[lW]; + long rn=blocksizes[nW]; + + long leftbegin=n/4-ln/4; + long leftend=leftbegin+ln/2; + + long rightbegin=n/2+n/4-rn/4; + long rightend=rightbegin+rn/2; + + int i,p; + + for(i=0;i format for user-defined specifiers, which is + compatible with compiler warnings about mismatches between specifiers and + arguments. + +* Added TRIO_DEPRECATED flag (reported by David Boyce) + +* Fixed rounding adjustment for long double (reported as bug item #2136686). + +* Added Makefile dependency for test target (reported as bug item #2136636). + +* David Boyce + Fixed long long support for MSVC. + +* Fixed potential problem with read after buffer end for non-zero terminated + strings (reported as bug item #1828465). + +* Andreas Stricker + Added WinCE support. + +* Fixed number of significant digits for %g. + + +Version 1.12 - 2006/10/22 +------------------------- +* Fixed scanning of floats (reported by Bernd Ahlers). + +* Fixed configure.in for GCC on Tru64 and MIPSpro on IRIX (reported by Andreas + Maus). + +* Olli Savia + Added support for LynxOS. + + +Version 1.11 - 2006/04/08 +------------------------- +* Mark Pickelmann + Fixed trio_unregister. If the first element was removed, the remaining + list would be removed as well. + +* Fixed unintended formatting of %e that would result in non-zero numbers + starting with zero (reported by Mark Pickelmann and Gisli Ottarsson). + +* Fixed compilation with Sun Workshop 6 (reported by Matthias Andree). + +* Fixed accuracy for denormalized numbers (bug item #758327). + +* Glen Davidson + Fixed scanning of floating-point numbers without a decimal-point (bug item + #1370427). + +* David Byron + Fixed more compiler warnings. + +* Fixed compilation of trio_to_long_double and TRIO_FEATURE_FLOAT (reported by + David Byron). + +* Fixed precision of large floating-point numbers (bug item #1314524). + +* Karl Bochert + Fixed trio_fpclassify_and_signbit to only restore the floating-point + precision. + +* Fixed detection of need for ieee option on FreeBSD/Alpha. + +* Added TRIO_SNPRINTF_ONLY compilation. + +* Fixed trio_to_double by not using strtod() on Tru64/DECC because it does not + support hex-floats. + +* Fixed crash on 64 bits machines related to a previous workaround in version + 1.9 for uninitialized va_list (reported by Nicolai Tufar, suggestion by + Douglas Gwyn). + +* Patrick Jessee + Fixed width calculation for %g. + +* Added macros for internal features. + +* Jon Foster + Added macros for conditional compilation of many features. Documented all + the features. + +* Karl Bochert + Fixed problem with Borland C++, which changes the floating-point precision + for certain math functions (log10() and _fpclass()). + +* Karl Bochert + Fixed compilation warnings on Borland C++. + +* Removed any occurrence of #elif because Borland C++ reports wrong line + numbers when they are present (reported by Karl Bochert). + +* David Byron + Added trio_asprintfv. + +* Brian Chapman + Fixed Mac OS X compilation. + +* David Byron + Fixed several compiler warnings. + +* Fixed printing of out-of-range arguments for %hhd and %hd. These arguments + can be out of range because of default integer promotion. + +* Bob Friesenhahn + Fixed installation of header files. + +* Joe Orton + Added SHELL to Makefile.in to avoid problems with CShells. + +* Shaun Tancheff + Fixed regresion tests for MSVC. + +* Craig Berry + Fixed the VMS C99 workaround. + + +Version 1.10 - 2003/03/06 +------------------------- +* Rearranged some include files to accommodate large file support (reported by + Albert Chin-A-Young). + +* Added support for SunOS 4.1.x lack of strerror, tolower, and toupper + (reported by Peter McCluskey). + +* Fixed pedantic compilation with TRIO_MINIMAL. + +* Jose Kahan + Moved to avoid redefinition problems. + +* Fixed hex-float exponents (reported by Matthias Clasen). + +* Fixed handling of negative width and precision via paramters (reported by + Jacob Navia). + +* Nigel Hall + Fixed TRIO_VA_START for VMS. + +* Rune Enggaard Lausen + Fixed compilation for Borland C++ Builder. + +* Fixed precision of hex-float numbers (reported by James Antill). + +* Fixed plus sign only to be added for signed numbers. + +* Fixed printing of integers with value and precision of zero (reported by + James Antill). + +* Fixed %#.o to only print one zero if the value is zero (reported by James + Antill). + +* Rewrote check for IEEE compilation option to remove dependency on additional + scripts. + +* Mehdi Lavasani + Makefile install target fixed to work with older install programs. + +* Collapsed the DECC, MSVC, HP-UX, and AIX code for trio_fpclassify_and_sign() + with further preprocessing. + + +Version 1.9 - 2002/10/13 +------------------------ +* Fixed trio_fpclassify_and_signbit on AIX 3.2 + +* Added configure check for -ieee/-mieee compilation option for Alpha machines. + +* Craig Berry + Fixed compilation on VMS. + +* Albert Chin-A-Young + Fixed incorrect conditional expression in trio_isinf. + +* Fixed the warnings about uninitialized va_list in the printfv and scanfv + family without the use of compiler specific pragmas (suggested by Ian + Pilcher). + +* Fixed space flag for floating-point numbers (reported by Ian Main). + + +Version 1.8 - 2002/07/10 +------------------------ +* Fixed infinite loop in multibyte handling (reported by Gisli Ottarsson). + +* Added the customizable cprintf/cscanf family which enables to user to specify + input and output stream functions (suggested by Florian Schulze). + +* Fixed trio_isinf by removing the HP-UX workaround, and instead making sure + that the C99 macro will adhere to the trio return values (reported by Luke + Dunstan). + +* Alexander Lukyanov + Fixed boundary case for scanning and EOF. + +* Jacob Navia + Enabled the L modifier for formatting. + +* Added TRIO_MINIMAL to build trio without the string functions. + +* Added the R modifier to print rounded floating-point numbers. + +* Added trio_to_long_double and long double scanning (the L modifier). + +* Added trio_locale_decimal_point, trio_locale_thousand_separator, + trio_locale_grouping to overwrite locale settings. + +* Rewrote TrioWriteDouble to avoid temporary buffers and thus the danger of + buffer overflows (for instance %.5000f). + +* Improved floating-point formatting accuracy. + +* Fixed formatting of non-decimal exponents. + +* Fixed thousand separator checking. + +* Fixed %f scanning to get a float and %lf to get a double. + +* Fixed WIN32 compilation (reported by Emmanuel Mogenet) + +* Fixed regression test cases to exclude disabled features. + + +Version 1.7 - 2002/05/07 +------------------------ +* Fixed trio_to_double to handle hex-floats properly. + +* Fixed printing of %a-format to be like %e, not like %g. + +* Fixed floating-point printing of values beyond the machine accuracy. + +* Fixed %f for printing with large precision. + +* Fixed the usage of C99 nan(), which caused a crash on OSF/1 (reported by + Georg Bolz) + +* Joe Orton + Fixed %p on 64-bit platforms. + +* Made trio compile with K&R compilers. + +* Emmanuel Mogenet + Fixed bug in trio_asprintf. + +* Emmanuel Mogenet + Various WIN32 fixes. + +* Joe Orton + Fixed trio_isinf() on HP-UX, and added test cases. + +* Joe Orton + Fixed non-portable use of $^ in Makefile. + +* Joe Orton + Added autoconf. + +* Alexander Lukyanov + Fixed a number of bugs in the scanning of EOF and the count specifier. + +* Richard Jinks + Added trio_nzero + +* Fixed incorrect handling of return code from TrioReadChar (reported by + Henrik L?f) + +* Fixed parsing of character class expressions. + +* Fixed trio_to_double which did not work with long fractions. + +* Fixed %f for printing of large numbers. + +* Fixed %#s to handle whitespaces as non-printable characters. + +* Added trio_isfinite, trio_signbit, and trio_fpclassify. + +* Added new test cases. + + +Version 1.6 - 2002/01/13 +------------------------ +* Added dynamic string functions. + +* Rewrote and extended documentation in JavaDoc (using Doxygen). + +* Moved and renamed strio functions to triostr. + +* Robert Collins + Added definition for Cygwin. + +* Markus Henke + Added long double workaround for the HP C/iX compiler. + +* Marc Verwerft + Improved error handling for dynamically allocated strings. + +* John Fotheringham + Made trionan compile on OpenVMS. + +* Added 'd' and 'D' as exponent letters when using TRIO_MICROSOFT. + +* Fixed uninitial memory read for the parameter modifiers. + + +Version 1.5 - 2001/09/08 +------------------------ +* Merged with libxml changes. + +* Moved NaN and Inf handling to separate file to enable reuse in other + projects. + +* Igor Zlatkovic + Fixed TrioGenerateNan for MSVC. + +* Fixed lots of preprocessor macros and internal data structure names. + + +Version 1.4 - 2001/06/03 +------------------------ +* Added hex-float (%a and %A) for scanning. + +* Added wide character arguments (%ls, %ws, %S, %lc, %wc, and %C) for both + printf and scanf. + +* Added mutex callbacks for user-specified specifiers to enable applications to + add thread-safety. These are registered with trio_register, where the + namespace is set to either ":enter" to lock a mutex, or ":leave" to unlock a + mutex. + +* Added equivalence class expressions for scanning. For example, %[[=a=]] scans + for all letters in the same equivalence class as the letter 'a' as defined + by the locale. + +* Changed character class expressions for scanning. The expressions must now + be embedded withing an extra set of brackets, e.g. %[[:alpha:]]. This was + done to adhere to the syntax of UNIX98 regular expressions. + +* Added the possibility to specify standard support (TRIO_C99 etc.) as compiler + options. + +* Fixed conversion of hex-float in StrToDouble. + +* Fixed formatting of hex-float numbers. + +* Stan Boehm + Fixed crash on QNX, which happend because some buffers on the stack were too + big. + +* Fixed default precision for %f and %g (reported by Jose Ortiz) + +* Howard Kapustein + Added the I8, I16, I32, and I64 modifiers. + +* Jose Ortiz + Fixed rounding problem for %e. + +* Jose Ortiz + Fixed various problems with the xlC and Sun C++ compilers. + + +Version 1.3 - 2001/05/16 +------------------------ +* trio's treatment of the field width when the %e code was used was not + correct (reported by Gisli Ottarsson). It turns out the fraction part should + be zero-padded by default and the exponent part should be zero-prefixed if + it is only one digit. At least that's how the GNU and Sun libc's work. The + trio floating point output looks identical to them now. + +* Fixed group scanning with modifiers. + +* Fixed compilation for 64-bit Digital Unix. + +* Igor Zlatkovic + Fixed compilation of dprintf, which uses read/write, for MSVC. + +* Fixed various compilation problems on Digital Unix (mainly associated with + va_list). + + +Version 1.2 - 2001/04/11 +------------------------ +* Added autoconf integration. If compiled with HAVE_CONFIG_H the following + happens. Firstly, is included. Secondly, trio will only be + compiled if WITH_TRIO is defined herein. Thirdly, if TRIO_REPLACE_STDIO is + defined, only stdio functions that have not been detected by autoconf, i.e. + those not defined by HAVE_PRINTF or similar, will be replaced by trio + functions (suggested by Daniel Veillard). + +* Fixed '%m.nf' output. Previously trio did not treat the width properly + in all cases (reported by Gisli Ottarsson). + +* Added explicit promotion for the scanfv family. + +* Fixed more C++ compilation warnings. + + +Version 1.1 - 2001/02/25 +------------------------ +* Added explicit promotion for the printfv familiy. A float must be specified + by %hf. + +* Fixed positionals for printfv (reported by Gisli Ottarsson). + +* Fixed an integer to pointer conversion problem on the SGI MIPS C compiler + (reported by Gisli Ottarsson). + +* Fixed ANSI C++ warnings (type casting, and namespace is a reserved keyword). + +* Added \n to all examples in the documentation to prevent confusion. + +* Fixed StrSubstringMax + + +Version 1.0 - 2000/12/10 +------------------------ +* Bumped Version number. + + +Version 0.25 - 2000/12/09 +------------------------- +* Wrote more documentation. + +* Improved NaN support and added NaN to regression test. + +* Fixed C99 support. + +* Added missing getter/setter functions. + + +Version 0.24 - 2000/12/02 +------------------------- +* Added callback functionality for the user-defined specifier (<>). All + the necessary functions are defined in triop.h header file. See the + documentation for trio_register for further detail. + +* Wrote initial documentation on the callback functionality. + +* Added the printfv and scanfv family of functions, which takes a pointer + array rather than variadic arguments. Each pointer in the array must point + to the associated data (requested by Bruce Korb). + +* As indicated in version 0.21 the extension modifiers (<>) have now been + completely removed. + +* Added skipping of thousand-separators in floating-point number scanning. + + +Version 0.23 - 2000/10/21 +------------------------- +* Added width to scanning of floating-point numbers. + +* Wrote more documentation on trio_printf. + +* Fixed problem with trailing zeroes after decimal-point. + + +Version 0.22 - 2000/08/06 +------------------------- +* Added LC_CTYPE locale dependent character class expressions to scan lists. + Included are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], + [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:] + +* Added C escapes to alternative string formatting and scanning. + +* Added StrSubstringMax. + +* Wrote a little more documentation. + +* Fixed scanf return values. + +* Fixed a sign error for non-ascii characters. + + +Version 0.21 - 2000/07/19 +------------------------- +* Converted the documentation to TeX. With latex2man the documentation can + automatically be converted into man pages. + +* Added trio_scanf, trio_vscanf, trio_fscanf, and trio_vfscanf. + +* Added trio_dprintf, trio_vdprintf, trio_dscanf, and trio_vdscanf. These + functions can be used to write and read directly to pipes and sockets (the + assume blocking sockets). Stdio buffering is surpassed, so the functions are + async-safe. However, reading from stdin (STDIN_FILENO) or writing to stdout + (STDOUT_FILENO) reintroduces the buffering. + +* Paul Janzen + Added trio_asprintf and trio_vasprintf, which are compatible with the GNU + and BSD interfaces. + +* Added scanlist ranges for group scanning (%[]). + +* Added width for scanning (missing for floating-point numbers though). + +* Added variable size modifier (&) to handle system defined types of unknown + size. This modifier makes certain assumptions about the integer sizes, which + may not be valid on any machine. Consequently, the modifier will remain + undocumented, as it may be removed later. + +* Added \777 and \xFF to alternative string scanning (%#s) + +* Added the TRIO_REPLACE_STDIO check in the header. + +* Improved performance of the multibyte character parsing. + +* Fixed positionals (%n$) which had stopped working. + +* Fixed hh and ll modifiers to allow exactly two letters and no more. + +* Fixed ANSI C++ warnings. Also fixed the compiler warning about casting + between integer and pointer (this has been annoying me for ages). + +* Fixed snprintf and vsnprintf with zero buffer size. + +* Fixed NAN problems (reported by Keith Briggs). + +* Fixed parsing of multibyte characters. The format string was not correctly + advanced in case of a multibyte character. + +* Renamed many of the internal functions to have more consistant names. + +* Removed the and modifiers. They are not really worth + including. The other <> modifiers may disappear as well. + + +Version 0.20 - 2000/06/05 +------------------------- +* Added intmax_t and ptrdiff_t support. + +* Added support for LC_NUMERIC grouping. + +* Added double-dot notation for the conversion base. The style is now + %width.precision.base, where any argument can be a number, an asterix + indicating a parameter, or be omitted entirely. For example, %*..2i is + to specify binary numbers without precision, and with width as a parameter + on the va_list. + +* Added sticky modifier (!), which makes subsequent specifiers of the same + type reuse the current modifiers. Inspired by a suggestion from Gary Porter. + +* Added group scanning (%[]). Scanlist ranges and multibyte sequences are not + supported yet. + +* Added count scanning (%n). + +* Changed the number scanning to accept thousand separators and any base. + +* Fixed positional for parameters. It is possible to write something like + %3$*1$.*2$d (which happens to be the same as %*.*d). + +* Fixed precision of integers. + +* Fixed parameter flags. Before trio could only handle one parameter flag per + specifier, although two (three with double-dot base) were possible. + +* Fixed isinf() for those platforms where it is unimplemented. + + +Version 0.18 - 2000/05/27 +------------------------- +* Rewrote the entire floating-point formatting function (Danny Dulai had + reported several errors and even supplied some patches, which unfortunately + were lost due to the refactoring). + +* Removed the use of strlen() in the declaration of a stack array. This + caused problems on some compilers (besides it isn't really ANSI C compliant + anyways). Using some arbitrarily chosen maximum value; should examine if + some standard defines an upper limit on the length of decimal-point and + thousands-separator (sizeof(wchar_t) perhaps?) + +* Changed the parsing of the format string to be multibyte aware. + + +Version 0.17 - 2000/05/19 +------------------------- +* Added INF, -INF, and NAN for floating-point numbers. + +* Fixed %#.9g -- alternative with precision. + +* Ken Gibson + Fixed printing of negative hex numbers + +* Joerg (last name unknown) + Fixed convertion of non-ASCII characters + + +Version 0.16 - 1999/08/06 +------------------------- +* Changed the constness of the second argument of StrFloat and StrDouble. The + lack of parameter overloading in C is the reason for the strange use of + constness in strtof and strtod. + +* Cleaned up constness. + + +Version 0.15 - 1999/07/23 +------------------------- +* Fixed the internal representation of numbers from signed to unsigned. Signed + numbers posed a problem for large unsigned numbers (reported by Tero) + +* Fixed a tiny bug in trio_vsprintfcat + +* Changed the meaning of the max argument of StrAppendMax to be consistant + with StrFormatAppendMax. Now it is the maximal size of the entire target + buffer, not just the appended size. This makes it easier to avoid buffer + overflows (requested by Tero) + + +Version 0.14 - 1999/05/16 +------------------------- +* Added size_t support (just waiting for a C99 compliant compiler to add + ptrdiff_t and intmax_t) + +* Rewrote TrioOutStreamDouble so it does not use the libc sprintf to emulate + floating-point anylonger. + +* Fixed width, precision, and adjustment for numbers and doubles. + + +Version 0.13 - 1999/05/06 +------------------------- +* Fixed zero padding for %d. Now %d will only zero pad if explicitly requested + to do so with the 0 flag (reported by Tero). + +* Fixed an incorrect while() condition in TrioGetString (reported by Tero). + + +Version 0.12 - 1999/04/19 +------------------------- +* Fixed incorrect zero padding of pointers + +* Added StrHash with STRIO_HASH_PLAIN + +* Added StrFormatDateMax + + +Version 0.11 - 1999/03/25 +------------------------- +* Made it compile under cygwin + +* Fixed a bug were TrioPreprocess would return an error if no formatting chars + were found (reported by Tero). + + +Version - 1999/03/19 +-------------------- +* Added trio_strerror and TRIO_ERROR_NAME. + +* Changed the error codes to be positive (as errno) + +* Fixed two reads of uninitialized memory reported by Purify + +* Added binary specifiers 'b' and 'B' (like SCO.) ThousandSeparator can be + used to separate nibbles (4 bit) + +* Renamed all Internal* functions to Trio*, which seems like a better + namespace (even though it is of no practical interest because these + functions are not visible beyond the scope of this file.) + + +Version - 1999/03/12 +-------------------- +* Added hex-float format for StrToDouble + +* Double references and gaps in the arguments are not allowed (for the %n$ + format) and in both cases an error code is returned. + +* Added StrToDouble (and StrToFloat) + + +Version - 1999/03/08 +-------------------- +* Added InStream and OutStream to the trio_T structure. + +* Started work on TrioScan. + +* Return values for errors changed. Two macros to unpack the error code has + been added to the header. + +* Shortshort (hh) flag added. + +* %#s also quotes the quote-char now. + +* Removed the 'errorInFormat' boolean, which isn't used anymore after the + functions bail out with an error instead. + + +Version - 1999/03/04 +-------------------- +* More than MAX_PARAMETERS parametes will now cause the TrioPreprocess() + function to return error. + +* Unknown flags and/or specifiers cause errors too. + +* Added trio_snprintfcat and trio_vsnprintfcat and the defined name + StrFormatAppendMax. They append a formatted string to the end of a string. + +* Define MAX_PARAMETERS to 128 at all times instead of using NL_ARGMAX when + that exists. + +* Added platform fixes for Amiga as suggested by Tero J?nk? + + +Version - 1999/01/31 +-------------------- +* vaprintf did add a zero byte even when it had failed. + +* Cleaned up the code for locale handling and thousand separator + +* Added trio_aprintf() and trio_vaprintf(). They return an allocated string. + +* Added thousands separator for numbers + +* Added floating point support for *printf + + +Version - 1998/10/20 +-------------------- +* StrMatchCase() called StrMatch() instead of itself recursively + +* Rewrote the implementation of *printf and *scanf and put all the code in + this file. Extended qualifiers and qualifiers from other standards were + added. + +* Added StrSpanFunction, StrToLong, and StrToUnsignedLong + + +Version - 1998/05/23 +-------------------- +* Made the StrEqual* functions resistant to NULL pointers + +* Turns out strdup() is no standard at all, and some platforms (I seem to + recall HP-UX) has problems with it. Made our own StrDuplicate() instead. + +* Added StrFormat() and StrFormatMax() to serve as sprintf() and snprintf() + respectively. diff --git a/Mednafen/mednafen/trio/Makefile.am b/Mednafen/mednafen/trio/Makefile.am new file mode 100644 index 0000000000..6722fcc74c --- /dev/null +++ b/Mednafen/mednafen/trio/Makefile.am @@ -0,0 +1,6 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @TRIO_CFLAGS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libtrio.a +libtrio_a_SOURCES = trio.c trionan.c triostr.c diff --git a/Mednafen/mednafen/trio/Makefile.in b/Mednafen/mednafen/trio/Makefile.in new file mode 100644 index 0000000000..bdecbf8634 --- /dev/null +++ b/Mednafen/mednafen/trio/Makefile.in @@ -0,0 +1,679 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/trio +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libtrio_a_AR = $(AR) $(ARFLAGS) +libtrio_a_LIBADD = +am_libtrio_a_OBJECTS = trio.$(OBJEXT) trionan.$(OBJEXT) \ + triostr.$(OBJEXT) +libtrio_a_OBJECTS = $(am_libtrio_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libtrio_a_SOURCES) +DIST_SOURCES = $(libtrio_a_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ @TRIO_CFLAGS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libtrio.a +libtrio_a_SOURCES = trio.c trionan.c triostr.c +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/trio/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/trio/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libtrio.a: $(libtrio_a_OBJECTS) $(libtrio_a_DEPENDENCIES) $(EXTRA_libtrio_a_DEPENDENCIES) + $(AM_V_at)-rm -f libtrio.a + $(AM_V_AR)$(libtrio_a_AR) libtrio.a $(libtrio_a_OBJECTS) $(libtrio_a_LIBADD) + $(AM_V_at)$(RANLIB) libtrio.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trio.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trionan.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/triostr.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/trio/trio.c b/Mednafen/mednafen/trio/trio.c new file mode 100644 index 0000000000..9e6a8b9aa1 --- /dev/null +++ b/Mednafen/mednafen/trio/trio.c @@ -0,0 +1,7766 @@ +/************************************************************************* + * + * $Id: trio.c,v 1.129 2009/09/20 11:37:15 breese Exp $ + * + * Copyright (C) 1998, 2009 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************* + * + * A note to trio contributors: + * + * Avoid heap allocation at all costs to ensure that the trio functions + * are async-safe. The exceptions are the printf/fprintf functions, which + * uses fputc, and the asprintf functions and the modifier, which + * by design are required to allocate form the heap. + * + ************************************************************************/ + +/* + * TODO: + * - Scan is probably too permissive about its modifiers. + * - C escapes in %#[] ? + * - Multibyte characters (done for format parsing, except scan groups) + * - Complex numbers? (C99 _Complex) + * - Boolean values? (C99 _Bool) + * - C99 NaN(n-char-sequence) missing. The n-char-sequence can be used + * to print the mantissa, e.g. NaN(0xc000000000000000) + * - Should we support the GNU %a alloc modifier? GNU has an ugly hack + * for %a, because C99 used %a for other purposes. If specified as + * %as or %a[ it is interpreted as the alloc modifier, otherwise as + * the C99 hex-float. This means that you cannot scan %as as a hex-float + * immediately followed by an 's'. + * - Scanning of collating symbols. + */ + +/************************************************************************* + * Trio include files + */ +#include +#include +#include + +#if defined(TRIO_EMBED_NAN) +# define TRIO_PUBLIC_NAN static +# if TRIO_FEATURE_FLOAT +# define TRIO_FUNC_NAN +# define TRIO_FUNC_NINF +# define TRIO_FUNC_PINF +# define TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT +# define TRIO_FUNC_ISINF +# endif +#endif +#include + +#if defined(TRIO_EMBED_STRING) +# define TRIO_PUBLIC_STRING static +# define TRIO_FUNC_LENGTH +# define TRIO_FUNC_LENGTH_MAX +# define TRIO_FUNC_TO_LONG +# if TRIO_FEATURE_LOCALE +# define TRIO_FUNC_COPY_MAX +# endif +# if TRIO_FEATURE_DYNAMICSTRING +# define TRIO_FUNC_XSTRING_DUPLICATE +# endif +# if TRIO_EXTENSION && TRIO_FEATURE_SCANF +# define TRIO_FUNC_EQUAL_LOCALE +# endif +# if TRIO_FEATURE_ERRNO +# define TRIO_FUNC_ERROR +# endif +# if TRIO_FEATURE_FLOAT && TRIO_FEATURE_SCANF +# define TRIO_FUNC_TO_DOUBLE +# endif +# if TRIO_FEATURE_DYNAMICSTRING +# define TRIO_FUNC_STRING_EXTRACT +# endif +# if TRIO_FEATURE_DYNAMICSTRING +# define TRIO_FUNC_STRING_TERMINATE +# endif +# if TRIO_FEATURE_USER_DEFINED +# define TRIO_FUNC_DUPLICATE +# endif +# if TRIO_FEATURE_DYNAMICSTRING +# define TRIO_FUNC_STRING_DESTROY +# endif +# if TRIO_FEATURE_USER_DEFINED +# define TRIO_FUNC_DESTROY +# endif +# if TRIO_FEATURE_USER_DEFINED || (TRIO_FEATURE_FLOAT && TRIO_FEATURE_SCANF) +# define TRIO_FUNC_EQUAL +# endif +# if TRIO_FEATURE_USER_DEFINED || TRIO_FEATURE_SCANF +# define TRIO_FUNC_EQUAL_CASE +# endif +# if (TRIO_EXTENSION && TRIO_FEATURE_SCANF) +# define TRIO_FUNC_EQUAL_MAX +# endif +# if TRIO_FEATURE_SCANF +# define TRIO_FUNC_TO_UPPER +# endif +# if TRIO_FEATURE_DYNAMICSTRING +# define TRIO_FUNC_XSTRING_APPEND_CHAR +# endif +#endif +#include + +/************************************************************************** + * + * Definitions + * + *************************************************************************/ + +#include +#if TRIO_FEATURE_FLOAT +# include +# include +#endif + +#if defined(__STDC_ISO_10646__) || defined(MB_LEN_MAX) || defined(USE_MULTIBYTE) || TRIO_FEATURE_WIDECHAR +# if !defined(TRIO_PLATFORM_WINCE) +# define TRIO_COMPILER_SUPPORTS_MULTIBYTE +# if !defined(MB_LEN_MAX) +# define MB_LEN_MAX 6 +# endif +# endif +#endif + +#if (TRIO_COMPILER_VISUALC - 0 >= 1100) || defined(TRIO_COMPILER_BORLAND) +# define TRIO_COMPILER_SUPPORTS_VISUALC_INT +#endif + +#if TRIO_FEATURE_FLOAT +# if defined(PREDEF_STANDARD_C99) \ + || defined(PREDEF_STANDARD_UNIX03) +# if !defined(HAVE_FLOORL) && !defined(TRIO_NO_FLOORL) +# define HAVE_FLOORL +# endif +# if !defined(HAVE_CEILL) && !defined(TRIO_NO_CEILL) +# define HAVE_CEILL +# endif +# if !defined(HAVE_POWL) && !defined(TRIO_NO_POWL) +# define HAVE_POWL +# endif +# if !defined(HAVE_FMODL) && !defined(TRIO_NO_FMODL) +# define HAVE_FMODL +# endif +# if !defined(HAVE_LOG10L) && !defined(TRIO_NO_LOG10L) +# define HAVE_LOG10L +# endif +# endif +# if defined(TRIO_COMPILER_VISUALC) +# if defined(floorl) +# define HAVE_FLOORL +# endif +# if defined(ceill) +# define HAVE_CEILL +# endif +# if defined(powl) +# define HAVE_POWL +# endif +# if defined(fmodl) +# define HAVE_FMODL +# endif +# if defined(log10l) +# define HAVE_LOG10L +# endif +# endif +#endif + +/************************************************************************* + * Generic definitions + */ + +#if !(defined(DEBUG) || defined(NDEBUG)) +# define NDEBUG +#endif + +#include +#include +#if defined(PREDEF_STANDARD_C99) && !defined(isascii) +# define isascii(x) ((x) & 0x7F) +#endif +#if defined(TRIO_COMPILER_ANCIENT) +# include +#else +# include +#endif +#include +#if defined(TRIO_PLATFORM_WINCE) +extern int errno; +#else +# include +#endif + +#ifndef NULL +# define NULL 0 +#endif +#define NIL ((char)0) +#ifndef FALSE +# define FALSE (1 == 0) +# define TRUE (! FALSE) +#endif +#define BOOLEAN_T int + +/* mincore() can be used for debugging purposes */ +#define VALID(x) (NULL != (x)) + +#if TRIO_FEATURE_ERRORCODE + /* + * Encode the error code and the position. This is decoded + * with TRIO_ERROR_CODE and TRIO_ERROR_POSITION. + */ +# define TRIO_ERROR_RETURN(x,y) (- ((x) + ((y) << 8))) +#else +# define TRIO_ERROR_RETURN(x,y) (-1) +#endif + +typedef unsigned long trio_flags_t; + + +/************************************************************************* + * Platform specific definitions + */ +#if defined(TRIO_PLATFORM_UNIX) +# include +# include +# include +# if !defined(TRIO_FEATURE_LOCALE) +# define USE_LOCALE +# endif +#endif /* TRIO_PLATFORM_UNIX */ +#if defined(TRIO_PLATFORM_VMS) +# include +#endif +#if defined(TRIO_PLATFORM_WIN32) +# if defined(TRIO_PLATFORM_WINCE) +int read(int handle, char *buffer, unsigned int length); +int write(int handle, const char *buffer, unsigned int length); +# else +# include +# define read _read +# define write _write +# endif +#endif /* TRIO_PLATFORM_WIN32 */ + +#if TRIO_FEATURE_WIDECHAR +# if defined(PREDEF_STANDARD_C94) +# include +# include +typedef wchar_t trio_wchar_t; +typedef wint_t trio_wint_t; +# else +typedef char trio_wchar_t; +typedef int trio_wint_t; +# define WCONST(x) L ## x +# define WEOF EOF +# define iswalnum(x) isalnum(x) +# define iswalpha(x) isalpha(x) +# define iswcntrl(x) iscntrl(x) +# define iswdigit(x) isdigit(x) +# define iswgraph(x) isgraph(x) +# define iswlower(x) islower(x) +# define iswprint(x) isprint(x) +# define iswpunct(x) ispunct(x) +# define iswspace(x) isspace(x) +# define iswupper(x) isupper(x) +# define iswxdigit(x) isxdigit(x) +# endif +#endif + + +/************************************************************************* + * Compiler dependent definitions + */ + +/* Support for long long */ +#ifndef __cplusplus +# if !defined(USE_LONGLONG) +# if defined(TRIO_COMPILER_GCC) && !defined(__STRICT_ANSI__) +# define USE_LONGLONG +# else +# if defined(TRIO_COMPILER_SUNPRO) +# define USE_LONGLONG +# else +# if defined(TRIO_COMPILER_MSVC) && (_MSC_VER >= 1400) +# define USE_LONGLONG +# else +# if defined(_LONG_LONG) || defined(_LONGLONG) +# define USE_LONGLONG +# endif +# endif +# endif +# endif +# endif +#endif + +/* The extra long numbers */ +#if defined(USE_LONGLONG) +typedef signed long long int trio_longlong_t; +typedef unsigned long long int trio_ulonglong_t; +#else +# if defined(TRIO_COMPILER_SUPPORTS_VISUALC_INT) +typedef signed __int64 trio_longlong_t; +typedef unsigned __int64 trio_ulonglong_t; +# else +typedef TRIO_SIGNED long int trio_longlong_t; +typedef unsigned long int trio_ulonglong_t; +# endif +#endif + +/* Maximal and fixed integer types */ +#if defined(PREDEF_STANDARD_C99) +# include +typedef intmax_t trio_intmax_t; +typedef uintmax_t trio_uintmax_t; +typedef int8_t trio_int8_t; +typedef int16_t trio_int16_t; +typedef int32_t trio_int32_t; +typedef int64_t trio_int64_t; +#else +# if defined(PREDEF_STANDARD_UNIX98) +# include +typedef intmax_t trio_intmax_t; +typedef uintmax_t trio_uintmax_t; +typedef int8_t trio_int8_t; +typedef int16_t trio_int16_t; +typedef int32_t trio_int32_t; +typedef int64_t trio_int64_t; +# else +# if defined(TRIO_COMPILER_SUPPORTS_VISUALC_INT) +typedef trio_longlong_t trio_intmax_t; +typedef trio_ulonglong_t trio_uintmax_t; +typedef __int8 trio_int8_t; +typedef __int16 trio_int16_t; +typedef __int32 trio_int32_t; +typedef __int64 trio_int64_t; +# else +typedef trio_longlong_t trio_intmax_t; +typedef trio_ulonglong_t trio_uintmax_t; +# if defined(TRIO_INT8_T) +typedef TRIO_INT8_T trio_int8_t; +# else +typedef TRIO_SIGNED char trio_int8_t; +# endif +# if defined(TRIO_INT16_T) +typedef TRIO_INT16_T trio_int16_t; +# else +typedef TRIO_SIGNED short trio_int16_t; +# endif +# if defined(TRIO_INT32_T) +typedef TRIO_INT32_T trio_int32_t; +# else +typedef TRIO_SIGNED int trio_int32_t; +# endif +# if defined(TRIO_INT64_T) +typedef TRIO_INT64_T trio_int64_t; +# else +typedef trio_longlong_t trio_int64_t; +# endif +# endif +# endif +#endif + +#if defined(HAVE_FLOORL) +# define trio_floor(x) floorl((x)) +#else +# define trio_floor(x) floor((double)(x)) +#endif + +#if defined(HAVE_CEILL) +# define trio_ceil(x) ceill((x)) +#else +# define trio_ceil(x) ceil((double)(x)) +#endif + +#if defined(HAVE_FMODL) +# define trio_fmod(x,y) fmodl((x),(y)) +#else +# define trio_fmod(x,y) fmod((double)(x),(double)(y)) +#endif + +#if defined(HAVE_POWL) +# define trio_pow(x,y) powl((x),(y)) +#else +# define trio_pow(x,y) pow((double)(x),(double)(y)) +#endif + +#if defined(HAVE_LOG10L) +# define trio_log10(x) log10l((x)) +#else +# define trio_log10(x) log10((double)(x)) +#endif + +#if TRIO_FEATURE_FLOAT +# define TRIO_FABS(x) (((x) < 0.0) ? -(x) : (x)) +#endif + +/************************************************************************* + * Internal Definitions + */ + +#if TRIO_FEATURE_FLOAT + +# if !defined(DECIMAL_DIG) +# define DECIMAL_DIG DBL_DIG +# endif + +/* Long double sizes */ +# ifdef LDBL_DIG +# define MAX_MANTISSA_DIGITS LDBL_DIG +# define MAX_EXPONENT_DIGITS 4 +# define MAX_DOUBLE_DIGITS LDBL_MAX_10_EXP +# else +# define MAX_MANTISSA_DIGITS DECIMAL_DIG +# define MAX_EXPONENT_DIGITS 3 +# define MAX_DOUBLE_DIGITS DBL_MAX_10_EXP +# endif + +# if defined(TRIO_COMPILER_ANCIENT) || !defined(LDBL_DIG) +# undef LDBL_DIG +# undef LDBL_MANT_DIG +# undef LDBL_EPSILON +# define LDBL_DIG DBL_DIG +# define LDBL_MANT_DIG DBL_MANT_DIG +# define LDBL_EPSILON DBL_EPSILON +# endif + +#endif /* TRIO_FEATURE_FLOAT */ + +/* The maximal number of digits is for base 2 */ +#define MAX_CHARS_IN(x) (sizeof(x) * CHAR_BIT) +/* The width of a pointer. The number of bits in a hex digit is 4 */ +#define POINTER_WIDTH ((sizeof("0x") - 1) + sizeof(trio_pointer_t) * CHAR_BIT / 4) + +#if TRIO_FEATURE_FLOAT +/* Infinite and Not-A-Number for floating-point */ +# define INFINITE_LOWER "inf" +# define INFINITE_UPPER "INF" +# define LONG_INFINITE_LOWER "infinite" +# define LONG_INFINITE_UPPER "INFINITE" +# define NAN_LOWER "nan" +# define NAN_UPPER "NAN" +#endif + +/* Various constants */ +enum { + TYPE_PRINT = 1, +#if TRIO_FEATURE_SCANF + TYPE_SCAN = 2, +#endif + + /* Flags. FLAGS_LAST must be less than ULONG_MAX */ + FLAGS_NEW = 0, + FLAGS_STICKY = 1, + FLAGS_SPACE = 2 * FLAGS_STICKY, + FLAGS_SHOWSIGN = 2 * FLAGS_SPACE, + FLAGS_LEFTADJUST = 2 * FLAGS_SHOWSIGN, + FLAGS_ALTERNATIVE = 2 * FLAGS_LEFTADJUST, + FLAGS_SHORT = 2 * FLAGS_ALTERNATIVE, + FLAGS_SHORTSHORT = 2 * FLAGS_SHORT, + FLAGS_LONG = 2 * FLAGS_SHORTSHORT, + FLAGS_QUAD = 2 * FLAGS_LONG, + FLAGS_LONGDOUBLE = 2 * FLAGS_QUAD, + FLAGS_SIZE_T = 2 * FLAGS_LONGDOUBLE, + FLAGS_PTRDIFF_T = 2 * FLAGS_SIZE_T, + FLAGS_INTMAX_T = 2 * FLAGS_PTRDIFF_T, + FLAGS_NILPADDING = 2 * FLAGS_INTMAX_T, + FLAGS_UNSIGNED = 2 * FLAGS_NILPADDING, + FLAGS_UPPER = 2 * FLAGS_UNSIGNED, + FLAGS_WIDTH = 2 * FLAGS_UPPER, + FLAGS_WIDTH_PARAMETER = 2 * FLAGS_WIDTH, + FLAGS_PRECISION = 2 * FLAGS_WIDTH_PARAMETER, + FLAGS_PRECISION_PARAMETER = 2 * FLAGS_PRECISION, + FLAGS_BASE = 2 * FLAGS_PRECISION_PARAMETER, + FLAGS_BASE_PARAMETER = 2 * FLAGS_BASE, + FLAGS_FLOAT_E = 2 * FLAGS_BASE_PARAMETER, + FLAGS_FLOAT_G = 2 * FLAGS_FLOAT_E, + FLAGS_QUOTE = 2 * FLAGS_FLOAT_G, + FLAGS_WIDECHAR = 2 * FLAGS_QUOTE, + FLAGS_IGNORE = 2 * FLAGS_WIDECHAR, + FLAGS_IGNORE_PARAMETER = 2 * FLAGS_IGNORE, + FLAGS_VARSIZE_PARAMETER = 2 * FLAGS_IGNORE_PARAMETER, + FLAGS_FIXED_SIZE = 2 * FLAGS_VARSIZE_PARAMETER, + FLAGS_LAST = FLAGS_FIXED_SIZE, + /* Reused flags */ + FLAGS_EXCLUDE = FLAGS_SHORT, + FLAGS_USER_DEFINED = FLAGS_IGNORE, + FLAGS_USER_DEFINED_PARAMETER = FLAGS_IGNORE_PARAMETER, + FLAGS_ROUNDING = FLAGS_INTMAX_T, + /* Compounded flags */ + FLAGS_ALL_VARSIZES = FLAGS_LONG | FLAGS_QUAD | FLAGS_INTMAX_T | FLAGS_PTRDIFF_T | FLAGS_SIZE_T, + FLAGS_ALL_SIZES = FLAGS_ALL_VARSIZES | FLAGS_SHORTSHORT | FLAGS_SHORT, + + NO_POSITION = -1, + NO_WIDTH = 0, + NO_PRECISION = -1, + NO_SIZE = -1, + + /* Do not change these */ + NO_BASE = -1, + MIN_BASE = 2, + MAX_BASE = 36, + BASE_BINARY = 2, + BASE_OCTAL = 8, + BASE_DECIMAL = 10, + BASE_HEX = 16, + + /* Maximal number of allowed parameters */ + MAX_PARAMETERS = 64, + /* Maximal number of characters in class */ + MAX_CHARACTER_CLASS = UCHAR_MAX + 1, + +#if TRIO_FEATURE_USER_DEFINED + /* Maximal string lengths for user-defined specifiers */ + MAX_USER_NAME = 64, + MAX_USER_DATA = 256, +#endif + + /* Maximal length of locale separator strings */ + MAX_LOCALE_SEPARATOR_LENGTH = MB_LEN_MAX, + /* Maximal number of integers in grouping */ + MAX_LOCALE_GROUPS = 64 +}; + +#define NO_GROUPING ((int)CHAR_MAX) + +/* Fundamental formatting parameter types */ +#define FORMAT_SENTINEL -1 /* marks end of parameters array */ +#define FORMAT_UNKNOWN 0 +#define FORMAT_INT 1 +#define FORMAT_DOUBLE 2 +#define FORMAT_CHAR 3 +#define FORMAT_STRING 4 +#define FORMAT_POINTER 5 +#define FORMAT_COUNT 6 +#define FORMAT_PARAMETER 7 +#define FORMAT_GROUP 8 +#define FORMAT_ERRNO 9 +#define FORMAT_USER_DEFINED 10 + +/* Character constants */ +#define CHAR_IDENTIFIER '%' +#define CHAR_ALT_IDENTIFIER '$' +#define CHAR_BACKSLASH '\\' +#define CHAR_QUOTE '\"' +#define CHAR_ADJUST ' ' + +#if TRIO_EXTENSION +/* Character class expressions */ +# define CLASS_ALNUM "[:alnum:]" +# define CLASS_ALPHA "[:alpha:]" +# define CLASS_BLANK "[:blank:]" +# define CLASS_CNTRL "[:cntrl:]" +# define CLASS_DIGIT "[:digit:]" +# define CLASS_GRAPH "[:graph:]" +# define CLASS_LOWER "[:lower:]" +# define CLASS_PRINT "[:print:]" +# define CLASS_PUNCT "[:punct:]" +# define CLASS_SPACE "[:space:]" +# define CLASS_UPPER "[:upper:]" +# define CLASS_XDIGIT "[:xdigit:]" +#endif + +/* + * SPECIFIERS: + * + * + * a Hex-float + * A Hex-float + * c Character + * C Widechar character (wint_t) + * d Decimal + * e Float + * E Float + * F Float + * F Float + * g Float + * G Float + * i Integer + * m Error message + * n Count + * o Octal + * p Pointer + * s String + * S Widechar string (wchar_t *) + * u Unsigned + * x Hex + * X Hex + * [] Group + * <> User-defined + * + * Reserved: + * + * D Binary Coded Decimal %D(length,precision) (OS/390) + */ +#define SPECIFIER_CHAR 'c' +#define SPECIFIER_STRING 's' +#define SPECIFIER_DECIMAL 'd' +#define SPECIFIER_INTEGER 'i' +#define SPECIFIER_UNSIGNED 'u' +#define SPECIFIER_OCTAL 'o' +#define SPECIFIER_HEX 'x' +#define SPECIFIER_HEX_UPPER 'X' +#if TRIO_FEATURE_FLOAT +# define SPECIFIER_FLOAT_E 'e' +# define SPECIFIER_FLOAT_E_UPPER 'E' +# define SPECIFIER_FLOAT_F 'f' +# define SPECIFIER_FLOAT_F_UPPER 'F' +# define SPECIFIER_FLOAT_G 'g' +# define SPECIFIER_FLOAT_G_UPPER 'G' +#endif +#define SPECIFIER_POINTER 'p' +#if TRIO_FEATURE_SCANF +# define SPECIFIER_GROUP '[' +# define SPECIFIER_UNGROUP ']' +#endif +#define SPECIFIER_COUNT 'n' +#if TRIO_UNIX98 +# define SPECIFIER_CHAR_UPPER 'C' +# define SPECIFIER_STRING_UPPER 'S' +#endif +#define SPECIFIER_HEXFLOAT 'a' +#define SPECIFIER_HEXFLOAT_UPPER 'A' +#define SPECIFIER_ERRNO 'm' +#if TRIO_FEATURE_BINARY +# define SPECIFIER_BINARY 'b' +# define SPECIFIER_BINARY_UPPER 'B' +#endif +#if TRIO_FEATURE_USER_DEFINED +# define SPECIFIER_USER_DEFINED_BEGIN '<' +# define SPECIFIER_USER_DEFINED_END '>' +# define SPECIFIER_USER_DEFINED_SEPARATOR ':' +# define SPECIFIER_USER_DEFINED_EXTRA '|' +#endif + +/* + * QUALIFIERS: + * + * + * Numbers = d,i,o,u,x,X + * Float = a,A,e,E,f,F,g,G + * String = s + * Char = c + * + * + * 9$ Position + * Use the 9th parameter. 9 can be any number between 1 and + * the maximal argument + * + * 9 Width + * Set width to 9. 9 can be any number, but must not be postfixed + * by '$' + * + * h Short + * Numbers: + * (unsigned) short int + * + * hh Short short + * Numbers: + * (unsigned) char + * + * l Long + * Numbers: + * (unsigned) long int + * String: + * as the S specifier + * Char: + * as the C specifier + * + * ll Long Long + * Numbers: + * (unsigned) long long int + * + * L Long Double + * Float + * long double + * + * # Alternative + * Float: + * Decimal-point is always present + * String: + * non-printable characters are handled as \number + * + * Spacing + * + * + Sign + * + * - Alignment + * + * . Precision + * + * * Parameter + * print: use parameter + * scan: no parameter (ignore) + * + * q Quad + * + * Z size_t + * + * w Widechar + * + * ' Thousands/quote + * Numbers: + * Integer part grouped in thousands + * Binary numbers: + * Number grouped in nibbles (4 bits) + * String: + * Quoted string + * + * j intmax_t + * t prtdiff_t + * z size_t + * + * ! Sticky + * @ Parameter (for both print and scan) + * + * I n-bit Integer + * Numbers: + * The following options exists + * I8 = 8-bit integer + * I16 = 16-bit integer + * I32 = 32-bit integer + * I64 = 64-bit integer + */ +#define QUALIFIER_POSITION '$' +#define QUALIFIER_SHORT 'h' +#define QUALIFIER_LONG 'l' +#define QUALIFIER_LONG_UPPER 'L' +#define QUALIFIER_ALTERNATIVE '#' +#define QUALIFIER_SPACE ' ' +#define QUALIFIER_PLUS '+' +#define QUALIFIER_MINUS '-' +#define QUALIFIER_DOT '.' +#define QUALIFIER_STAR '*' +#define QUALIFIER_CIRCUMFLEX '^' /* For scanlists */ +#define QUALIFIER_SIZE_T 'z' +#define QUALIFIER_PTRDIFF_T 't' +#define QUALIFIER_INTMAX_T 'j' +#define QUALIFIER_QUAD 'q' +#define QUALIFIER_SIZE_T_UPPER 'Z' +#if TRIO_MISC +# define QUALIFIER_WIDECHAR 'w' +#endif +#define QUALIFIER_FIXED_SIZE 'I' +#define QUALIFIER_QUOTE '\'' +#define QUALIFIER_STICKY '!' +#define QUALIFIER_VARSIZE '&' /* This should remain undocumented */ +#define QUALIFIER_ROUNDING_UPPER 'R' +#if TRIO_EXTENSION +# define QUALIFIER_PARAM '@' /* Experimental */ +# define QUALIFIER_COLON ':' /* For scanlists */ +# define QUALIFIER_EQUAL '=' /* For scanlists */ +#endif + + +/************************************************************************* + * + * Internal Structures + * + *************************************************************************/ + +/* Parameters */ +typedef struct { + /* An indication of which entry in the data union is used */ + int type; + /* The flags */ + trio_flags_t flags; + /* The width qualifier */ + int width; + /* The precision qualifier */ + int precision; + /* The base qualifier */ + int base; + /* Base from specifier */ + int baseSpecifier; + /* The size for the variable size qualifier */ + int varsize; + /* Offset of the first character of the specifier */ + int beginOffset; + /* Offset of the first character after the specifier */ + int endOffset; + /* Position in the argument list that this parameter refers to */ + int position; + /* The data from the argument list */ + union { + char *string; +#if TRIO_FEATURE_WIDECHAR + trio_wchar_t *wstring; +#endif + trio_pointer_t pointer; + union { + trio_intmax_t as_signed; + trio_uintmax_t as_unsigned; + } number; +#if TRIO_FEATURE_FLOAT + double doubleNumber; + double *doublePointer; + trio_long_double_t longdoubleNumber; + trio_long_double_t *longdoublePointer; +#endif + int errorNumber; + } data; +#if TRIO_FEATURE_USER_DEFINED + /* For the user-defined specifier */ + union { + char namespace[MAX_USER_NAME]; + int handler; /* if flags & FLAGS_USER_DEFINED_PARAMETER */ + } user_defined; + char user_data[MAX_USER_DATA]; +#endif +} trio_parameter_t; + +/* Container for customized functions */ +typedef struct { + union { + trio_outstream_t out; + trio_instream_t in; + } stream; + trio_pointer_t closure; +} trio_custom_t; + +/* General trio "class" */ +typedef struct _trio_class_t { + /* + * The function to write characters to a stream. + */ + void (*OutStream) TRIO_PROTO((struct _trio_class_t *, int)); + /* + * The function to read characters from a stream. + */ + void (*InStream) TRIO_PROTO((struct _trio_class_t *, int *)); + /* + * The function to undo read characters from a stream. + */ + void (*UndoStream) TRIO_PROTO((struct _trio_class_t *)); + /* + * The current location in the stream. + */ + trio_pointer_t location; + /* + * The character currently being processed. + */ + int current; + /* + * The number of characters that would have been written/read + * if there had been sufficient space. + */ + int processed; + union { + /* + * The number of characters that are actually written. Processed and + * committed will only differ for the *nprintf functions. + */ + int committed; + /* + * The number of look-ahead characters read. + */ + int cached; + } actually; + /* + * The upper limit of characters that may be written/read. + */ + int max; + /* + * The last output error that was detected. + */ + int error; +} trio_class_t; + +/* References (for user-defined callbacks) */ +typedef struct _trio_reference_t { + trio_class_t *data; + trio_parameter_t *parameter; +} trio_reference_t; + +#if TRIO_FEATURE_USER_DEFINED +/* Registered entries (for user-defined callbacks) */ +typedef struct _trio_userdef_t { + struct _trio_userdef_t *next; + trio_callback_t callback; + char *name; +} trio_userdef_t; +#endif + +/************************************************************************* + * + * Internal Variables + * + *************************************************************************/ + +static TRIO_CONST char rcsid[] = "@(#)$Id: trio.c,v 1.129 2009/09/20 11:37:15 breese Exp $"; + +#if TRIO_FEATURE_FLOAT +/* + * Need this to workaround a parser bug in HP C/iX compiler that fails + * to resolves macro definitions that includes type 'long double', + * e.g: va_arg(arg_ptr, long double) + */ +# if defined(TRIO_PLATFORM_MPEIX) +static TRIO_CONST trio_long_double_t ___dummy_long_double = 0; +# endif +#endif + +static TRIO_CONST char internalNullString[] = "(nil)"; + +#if defined(USE_LOCALE) +static struct lconv *internalLocaleValues = NULL; +#endif + +/* + * UNIX98 says "in a locale where the radix character is not defined, + * the radix character defaults to a period (.)" + */ +#if TRIO_FEATURE_FLOAT || TRIO_FEATURE_LOCALE || defined(USE_LOCALE) +static int internalDecimalPointLength = 1; +static char internalDecimalPoint = '.'; +static char internalDecimalPointString[MAX_LOCALE_SEPARATOR_LENGTH + 1] = "."; +#endif +#if TRIO_FEATURE_QUOTE || TRIO_FEATURE_LOCALE || TRIO_EXTENSION +static int internalThousandSeparatorLength = 1; +static char internalThousandSeparator[MAX_LOCALE_SEPARATOR_LENGTH + 1] = ","; +static char internalGrouping[MAX_LOCALE_GROUPS] = { (char)NO_GROUPING }; +#endif + +static TRIO_CONST char internalDigitsLower[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +static TRIO_CONST char internalDigitsUpper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +#if TRIO_FEATURE_SCANF +static BOOLEAN_T internalDigitsUnconverted = TRUE; +static int internalDigitArray[128]; +# if TRIO_EXTENSION +static BOOLEAN_T internalCollationUnconverted = TRUE; +static char internalCollationArray[MAX_CHARACTER_CLASS][MAX_CHARACTER_CLASS]; +# endif +#endif + +#if TRIO_FEATURE_USER_DEFINED +static TRIO_VOLATILE trio_callback_t internalEnterCriticalRegion = NULL; +static TRIO_VOLATILE trio_callback_t internalLeaveCriticalRegion = NULL; +static trio_userdef_t *internalUserDef = NULL; +#endif + + +/************************************************************************* + * + * Internal Functions + * + ************************************************************************/ + +#if defined(TRIO_EMBED_NAN) +# include "trionan.c" +#endif + +#if defined(TRIO_EMBED_STRING) +# include "triostr.c" +#endif + +/************************************************************************* + * TrioInitializeParameter + * + * Description: + * Initialize a trio_parameter_t struct. + */ +TRIO_PRIVATE void +TrioInitializeParameter +TRIO_ARGS1((parameter), + trio_parameter_t *parameter) +{ + parameter->type = FORMAT_UNKNOWN; + parameter->flags = 0; + parameter->width = 0; + parameter->precision = 0; + parameter->base = 0; + parameter->baseSpecifier = 0; + parameter->varsize = 0; + parameter->beginOffset = 0; + parameter->endOffset = 0; + parameter->position = 0; + parameter->data.pointer = 0; +#if TRIO_FEATURE_USER_DEFINED + parameter->user_defined.handler = 0; + parameter->user_data[0] = 0; +#endif +} + +/************************************************************************* + * TrioCopyParameter + * + * Description: + * Copies one trio_parameter_t struct to another. + */ +TRIO_PRIVATE void +TrioCopyParameter +TRIO_ARGS2((target, source), + trio_parameter_t *target, + TRIO_CONST trio_parameter_t *source) +{ +#if TRIO_FEATURE_USER_DEFINED + size_t i; +#endif + + target->type = source->type; + target->flags = source->flags; + target->width = source->width; + target->precision = source->precision; + target->base = source->base; + target->baseSpecifier = source->baseSpecifier; + target->varsize = source->varsize; + target->beginOffset = source->beginOffset; + target->endOffset = source->endOffset; + target->position = source->position; + target->data = source->data; + +#if TRIO_FEATURE_USER_DEFINED + target->user_defined = source->user_defined; + + for (i = 0U; i < sizeof(target->user_data); ++i) + { + if ((target->user_data[i] = source->user_data[i]) == NIL) + break; + } +#endif +} + +/************************************************************************* + * TrioIsQualifier + * + * Description: + * Remember to add all new qualifiers to this function. + * QUALIFIER_POSITION must not be added. + */ +TRIO_PRIVATE BOOLEAN_T +TrioIsQualifier +TRIO_ARGS1((character), + TRIO_CONST char character) +{ + /* QUALIFIER_POSITION is not included */ + switch (character) + { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case QUALIFIER_PLUS: + case QUALIFIER_MINUS: + case QUALIFIER_SPACE: + case QUALIFIER_DOT: + case QUALIFIER_STAR: + case QUALIFIER_ALTERNATIVE: + case QUALIFIER_SHORT: + case QUALIFIER_LONG: + case QUALIFIER_CIRCUMFLEX: + case QUALIFIER_LONG_UPPER: + case QUALIFIER_SIZE_T: + case QUALIFIER_PTRDIFF_T: + case QUALIFIER_INTMAX_T: + case QUALIFIER_QUAD: + case QUALIFIER_SIZE_T_UPPER: +#if defined(QUALIFIER_WIDECHAR) + case QUALIFIER_WIDECHAR: +#endif + case QUALIFIER_QUOTE: + case QUALIFIER_STICKY: + case QUALIFIER_VARSIZE: +#if defined(QUALIFIER_PARAM) + case QUALIFIER_PARAM: +#endif + case QUALIFIER_FIXED_SIZE: + case QUALIFIER_ROUNDING_UPPER: + return TRUE; + default: + return FALSE; + } +} + +/************************************************************************* + * TrioSetLocale + */ +#if defined(USE_LOCALE) +TRIO_PRIVATE void +TrioSetLocale(TRIO_NOARGS) +{ + internalLocaleValues = (struct lconv *)localeconv(); + if (internalLocaleValues) + { + if ((internalLocaleValues->decimal_point) && + (internalLocaleValues->decimal_point[0] != NIL)) + { + internalDecimalPointLength = trio_length(internalLocaleValues->decimal_point); + if (internalDecimalPointLength == 1) + { + internalDecimalPoint = internalLocaleValues->decimal_point[0]; + } + else + { + internalDecimalPoint = NIL; + trio_copy_max(internalDecimalPointString, + sizeof(internalDecimalPointString), + internalLocaleValues->decimal_point); + } + } +# if TRIO_EXTENSION + if ((internalLocaleValues->thousands_sep) && + (internalLocaleValues->thousands_sep[0] != NIL)) + { + trio_copy_max(internalThousandSeparator, + sizeof(internalThousandSeparator), + internalLocaleValues->thousands_sep); + internalThousandSeparatorLength = trio_length(internalThousandSeparator); + } +# endif +# if TRIO_EXTENSION + if ((internalLocaleValues->grouping) && + (internalLocaleValues->grouping[0] != NIL)) + { + trio_copy_max(internalGrouping, + sizeof(internalGrouping), + internalLocaleValues->grouping); + } +# endif + } +} +#endif /* defined(USE_LOCALE) */ + +#if TRIO_FEATURE_FLOAT && TRIO_FEATURE_QUOTE +TRIO_PRIVATE int +TrioCalcThousandSeparatorLength +TRIO_ARGS1((digits), + int digits) +{ + int count = 0; + int step = NO_GROUPING; + char *groupingPointer = internalGrouping; + + while (digits > 0) + { + if (*groupingPointer == CHAR_MAX) + { + /* Disable grouping */ + break; /* while */ + } + else if (*groupingPointer == 0) + { + /* Repeat last group */ + if (step == NO_GROUPING) + { + /* Error in locale */ + break; /* while */ + } + } + else + { + step = *groupingPointer++; + } + if (digits > step) + count += internalThousandSeparatorLength; + digits -= step; + } + return count; +} +#endif /* TRIO_FEATURE_FLOAT && TRIO_FEATURE_QUOTE */ + +#if TRIO_FEATURE_QUOTE +TRIO_PRIVATE BOOLEAN_T +TrioFollowedBySeparator +TRIO_ARGS1((position), + int position) +{ + int step = 0; + char *groupingPointer = internalGrouping; + + position--; + if (position == 0) + return FALSE; + while (position > 0) + { + if (*groupingPointer == CHAR_MAX) + { + /* Disable grouping */ + break; /* while */ + } + else if (*groupingPointer != 0) + { + step = *groupingPointer++; + } + if (step == 0) + break; + position -= step; + } + return (position == 0); +} +#endif /* TRIO_FEATURE_QUOTE */ + +/************************************************************************* + * TrioGetPosition + * + * Get the %n$ position. + */ +TRIO_PRIVATE int +TrioGetPosition +TRIO_ARGS2((format, offsetPointer), + TRIO_CONST char *format, + int *offsetPointer) +{ +#if TRIO_FEATURE_POSITIONAL + char *tmpformat; + int number = 0; + int offset = *offsetPointer; + + number = (int)trio_to_long(&format[offset], &tmpformat, BASE_DECIMAL); + offset = (int)(tmpformat - format); + if ((number != 0) && (QUALIFIER_POSITION == format[offset++])) + { + *offsetPointer = offset; + /* + * number is decreased by 1, because n$ starts from 1, whereas + * the array it is indexing starts from 0. + */ + return number - 1; + } +#endif + return NO_POSITION; +} + +/************************************************************************* + * TrioFindNamespace + * + * Find registered user-defined specifier. + * The prev argument is used for optimization only. + */ +#if TRIO_FEATURE_USER_DEFINED +TRIO_PRIVATE trio_userdef_t * +TrioFindNamespace +TRIO_ARGS2((name, prev), + TRIO_CONST char *name, + trio_userdef_t **prev) +{ + trio_userdef_t *def; + + if (internalEnterCriticalRegion) + (void)internalEnterCriticalRegion(NULL); + + for (def = internalUserDef; def; def = def->next) + { + /* Case-sensitive string comparison */ + if (trio_equal_case(def->name, name)) + break; + + if (prev) + *prev = def; + } + + if (internalLeaveCriticalRegion) + (void)internalLeaveCriticalRegion(NULL); + + return def; +} +#endif + +/************************************************************************* + * TrioPower + * + * Description: + * Calculate pow(base, exponent), where number and exponent are integers. + */ +#if TRIO_FEATURE_FLOAT +TRIO_PRIVATE trio_long_double_t +TrioPower +TRIO_ARGS2((number, exponent), + int number, + int exponent) +{ + trio_long_double_t result; + + if (number == 10) + { + switch (exponent) + { + /* Speed up calculation of common cases */ + case 0: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E-1); + break; + case 1: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+0); + break; + case 2: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+1); + break; + case 3: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+2); + break; + case 4: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+3); + break; + case 5: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+4); + break; + case 6: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+5); + break; + case 7: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+6); + break; + case 8: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+7); + break; + case 9: + result = (trio_long_double_t)number * TRIO_SUFFIX_LONG(1E+8); + break; + default: + result = trio_pow((trio_long_double_t)number, + (trio_long_double_t)exponent); + break; + } + } + else + { + return trio_pow((trio_long_double_t)number, + (trio_long_double_t)exponent); + } + return result; +} +#endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * TrioLogarithm + */ +#if TRIO_FEATURE_FLOAT +TRIO_PRIVATE trio_long_double_t +TrioLogarithm +TRIO_ARGS2((number, base), + trio_long_double_t number, + int base) +{ + trio_long_double_t result; + + if (number <= 0.0) + { + /* xlC crashes on log(0) */ + result = (number == 0.0) ? trio_ninf() : trio_nan(); + } + else + { + if (base == 10) + { + result = trio_log10(number); + } + else + { + result = trio_log10(number) / trio_log10((double)base); + } + } + return result; +} +#endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * TrioLogarithmBase + */ +#if TRIO_FEATURE_FLOAT +TRIO_PRIVATE double +TrioLogarithmBase +TRIO_ARGS1((base), + int base) +{ + switch (base) + { + case BASE_BINARY : return 1.0; + case BASE_OCTAL : return 3.0; + case BASE_DECIMAL: return 3.321928094887362345; + case BASE_HEX : return 4.0; + default : return TrioLogarithm((double)base, 2); + } +} +#endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * TrioParseQualifiers + * + * Description: + * Parse the qualifiers of a potential conversion specifier + */ +TRIO_PRIVATE int +TrioParseQualifiers +TRIO_ARGS4((type, format, offset, parameter), + int type, + TRIO_CONST char *format, + int offset, + trio_parameter_t *parameter) +{ + char ch; + int dots = 0; /* Count number of dots in modifier part */ + char *tmpformat; + + parameter->beginOffset = offset - 1; + parameter->flags = FLAGS_NEW; + parameter->position = TrioGetPosition(format, &offset); + + /* Default values */ + parameter->width = NO_WIDTH; + parameter->precision = NO_PRECISION; + parameter->base = NO_BASE; + parameter->varsize = NO_SIZE; + + while (TrioIsQualifier(format[offset])) + { + ch = format[offset++]; + + switch (ch) + { + case QUALIFIER_SPACE: + parameter->flags |= FLAGS_SPACE; + break; + + case QUALIFIER_PLUS: + parameter->flags |= FLAGS_SHOWSIGN; + break; + + case QUALIFIER_MINUS: + parameter->flags |= FLAGS_LEFTADJUST; + parameter->flags &= ~FLAGS_NILPADDING; + break; + + case QUALIFIER_ALTERNATIVE: + parameter->flags |= FLAGS_ALTERNATIVE; + break; + + case QUALIFIER_DOT: + if (dots == 0) /* Precision */ + { + dots++; + + /* Skip if no precision */ + if (QUALIFIER_DOT == format[offset]) + break; + + /* After the first dot we have the precision */ + parameter->flags |= FLAGS_PRECISION; + if ((QUALIFIER_STAR == format[offset]) +#if defined(QUALIFIER_PARAM) + || (QUALIFIER_PARAM == format[offset]) +#endif + ) + { + offset++; + parameter->flags |= FLAGS_PRECISION_PARAMETER; + parameter->precision = TrioGetPosition(format, &offset); + } + else + { + parameter->precision = trio_to_long(&format[offset], + &tmpformat, + BASE_DECIMAL); + offset = (int)(tmpformat - format); + } + } + else if (dots == 1) /* Base */ + { + dots++; + + /* After the second dot we have the base */ + parameter->flags |= FLAGS_BASE; + if ((QUALIFIER_STAR == format[offset]) +#if defined(QUALIFIER_PARAM) + || (QUALIFIER_PARAM == format[offset]) +#endif + ) + { + offset++; + parameter->flags |= FLAGS_BASE_PARAMETER; + parameter->base = TrioGetPosition(format, &offset); + } + else + { + parameter->base = trio_to_long(&format[offset], + &tmpformat, + BASE_DECIMAL); + if (parameter->base > MAX_BASE) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + offset = (int)(tmpformat - format); + } + } + else + { + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + } + break; /* QUALIFIER_DOT */ + +#if defined(QUALIFIER_PARAM) + case QUALIFIER_PARAM: + parameter->type = TYPE_PRINT; + /* FALLTHROUGH */ +#endif + case QUALIFIER_STAR: + /* This has different meanings for print and scan */ + if (TYPE_PRINT == type) + { + /* Read with from parameter */ + int width = TrioGetPosition(format, &offset); + parameter->flags |= (FLAGS_WIDTH | FLAGS_WIDTH_PARAMETER); + if (NO_POSITION != width) + parameter->width = width; + /* else keep parameter->width = NO_WIDTH which != NO_POSITION */ + } +#if TRIO_FEATURE_SCANF + else + { + /* Scan, but do not store result */ + parameter->flags |= FLAGS_IGNORE; + } +#endif + break; /* QUALIFIER_STAR */ + + case '0': + if (! (parameter->flags & FLAGS_LEFTADJUST)) + parameter->flags |= FLAGS_NILPADDING; + /* FALLTHROUGH */ + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + parameter->flags |= FLAGS_WIDTH; + /* + * &format[offset - 1] is used to "rewind" the read + * character from format + */ + parameter->width = trio_to_long(&format[offset - 1], + &tmpformat, + BASE_DECIMAL); + offset = (int)(tmpformat - format); + break; + + case QUALIFIER_SHORT: + if (parameter->flags & FLAGS_SHORTSHORT) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + else if (parameter->flags & FLAGS_SHORT) + parameter->flags |= FLAGS_SHORTSHORT; + else + parameter->flags |= FLAGS_SHORT; + break; + + case QUALIFIER_LONG: + if (parameter->flags & FLAGS_QUAD) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + else if (parameter->flags & FLAGS_LONG) + parameter->flags |= FLAGS_QUAD; + else + parameter->flags |= FLAGS_LONG; + break; + +#if TRIO_FEATURE_LONGDOUBLE + case QUALIFIER_LONG_UPPER: + parameter->flags |= FLAGS_LONGDOUBLE; + break; +#endif + +#if TRIO_FEATURE_SIZE_T + case QUALIFIER_SIZE_T: + parameter->flags |= FLAGS_SIZE_T; + /* Modify flags for later truncation of number */ + if (sizeof(size_t) == sizeof(trio_ulonglong_t)) + parameter->flags |= FLAGS_QUAD; + else if (sizeof(size_t) == sizeof(long)) + parameter->flags |= FLAGS_LONG; + break; +#endif + +#if TRIO_FEATURE_PTRDIFF_T + case QUALIFIER_PTRDIFF_T: + parameter->flags |= FLAGS_PTRDIFF_T; + if (sizeof(ptrdiff_t) == sizeof(trio_ulonglong_t)) + parameter->flags |= FLAGS_QUAD; + else if (sizeof(ptrdiff_t) == sizeof(long)) + parameter->flags |= FLAGS_LONG; + break; +#endif + +#if TRIO_FEATURE_INTMAX_T + case QUALIFIER_INTMAX_T: + parameter->flags |= FLAGS_INTMAX_T; + if (sizeof(trio_intmax_t) == sizeof(trio_ulonglong_t)) + parameter->flags |= FLAGS_QUAD; + else if (sizeof(trio_intmax_t) == sizeof(long)) + parameter->flags |= FLAGS_LONG; + break; +#endif + +#if TRIO_FEATURE_QUAD + case QUALIFIER_QUAD: + parameter->flags |= FLAGS_QUAD; + break; +#endif + +#if TRIO_FEATURE_FIXED_SIZE + case QUALIFIER_FIXED_SIZE: + if (parameter->flags & FLAGS_FIXED_SIZE) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + + if (parameter->flags & (FLAGS_ALL_SIZES | + FLAGS_LONGDOUBLE | + FLAGS_WIDECHAR | + FLAGS_VARSIZE_PARAMETER)) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + + if ((format[offset] == '6') && + (format[offset + 1] == '4')) + { + parameter->varsize = sizeof(trio_int64_t); + offset += 2; + } + else if ((format[offset] == '3') && + (format[offset + 1] == '2')) + { + parameter->varsize = sizeof(trio_int32_t); + offset += 2; + } + else if ((format[offset] == '1') && + (format[offset + 1] == '6')) + { + parameter->varsize = sizeof(trio_int16_t); + offset += 2; + } + else if (format[offset] == '8') + { + parameter->varsize = sizeof(trio_int8_t); + offset++; + } + else + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + + parameter->flags |= FLAGS_FIXED_SIZE; + break; +#endif /* TRIO_FEATURE_FIXED_SIZE */ + +#if defined(QUALIFIER_WIDECHAR) + case QUALIFIER_WIDECHAR: + parameter->flags |= FLAGS_WIDECHAR; + break; +#endif + +#if TRIO_FEATURE_SIZE_T_UPPER + case QUALIFIER_SIZE_T_UPPER: + break; +#endif + +#if TRIO_FEATURE_QUOTE + case QUALIFIER_QUOTE: + parameter->flags |= FLAGS_QUOTE; + break; +#endif + +#if TRIO_FEATURE_STICKY + case QUALIFIER_STICKY: + parameter->flags |= FLAGS_STICKY; + break; +#endif + +#if TRIO_FEATURE_VARSIZE + case QUALIFIER_VARSIZE: + parameter->flags |= FLAGS_VARSIZE_PARAMETER; + break; +#endif + +#if TRIO_FEATURE_ROUNDING + case QUALIFIER_ROUNDING_UPPER: + parameter->flags |= FLAGS_ROUNDING; + break; +#endif + + default: + /* Bail out completely to make the error more obvious */ + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + } + } /* while qualifier */ + + parameter->endOffset = offset; + + return 0; +} + +/************************************************************************* + * TrioParseSpecifier + * + * Description: + * Parse the specifier part of a potential conversion specifier + */ +TRIO_PRIVATE int +TrioParseSpecifier +TRIO_ARGS4((type, format, offset, parameter), + int type, + TRIO_CONST char *format, + int offset, + trio_parameter_t *parameter) +{ + parameter->baseSpecifier = NO_BASE; + + switch (format[offset++]) + { +#if defined(SPECIFIER_CHAR_UPPER) + case SPECIFIER_CHAR_UPPER: + parameter->flags |= FLAGS_WIDECHAR; + /* FALLTHROUGH */ +#endif + case SPECIFIER_CHAR: + if (parameter->flags & FLAGS_LONG) + parameter->flags |= FLAGS_WIDECHAR; + else if (parameter->flags & FLAGS_SHORT) + parameter->flags &= ~FLAGS_WIDECHAR; + parameter->type = FORMAT_CHAR; + break; + +#if defined(SPECIFIER_STRING_UPPER) + case SPECIFIER_STRING_UPPER: + parameter->flags |= FLAGS_WIDECHAR; + /* FALLTHROUGH */ +#endif + case SPECIFIER_STRING: + if (parameter->flags & FLAGS_LONG) + parameter->flags |= FLAGS_WIDECHAR; + else if (parameter->flags & FLAGS_SHORT) + parameter->flags &= ~FLAGS_WIDECHAR; + parameter->type = FORMAT_STRING; + break; + +#if defined(SPECIFIER_GROUP) + case SPECIFIER_GROUP: + if (TYPE_SCAN == type) + { + int depth = 1; + parameter->type = FORMAT_GROUP; + if (format[offset] == QUALIFIER_CIRCUMFLEX) + offset++; + if (format[offset] == SPECIFIER_UNGROUP) + offset++; + if (format[offset] == QUALIFIER_MINUS) + offset++; + /* Skip nested brackets */ + while (format[offset] != NIL) + { + if (format[offset] == SPECIFIER_GROUP) + { + depth++; + } + else if (format[offset] == SPECIFIER_UNGROUP) + { + if (--depth <= 0) + { + offset++; + break; + } + } + offset++; + } + } + break; +#endif /* defined(SPECIFIER_GROUP) */ + + case SPECIFIER_INTEGER: + parameter->type = FORMAT_INT; + break; + + case SPECIFIER_UNSIGNED: + parameter->flags |= FLAGS_UNSIGNED; + parameter->type = FORMAT_INT; + break; + + case SPECIFIER_DECIMAL: + parameter->baseSpecifier = BASE_DECIMAL; + parameter->type = FORMAT_INT; + break; + + case SPECIFIER_OCTAL: + parameter->flags |= FLAGS_UNSIGNED; + parameter->baseSpecifier = BASE_OCTAL; + parameter->type = FORMAT_INT; + break; + +#if TRIO_FEATURE_BINARY + case SPECIFIER_BINARY_UPPER: + parameter->flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_BINARY: + parameter->flags |= FLAGS_NILPADDING; + parameter->baseSpecifier = BASE_BINARY; + parameter->type = FORMAT_INT; + break; +#endif + + case SPECIFIER_HEX_UPPER: + parameter->flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_HEX: + parameter->flags |= FLAGS_UNSIGNED; + parameter->baseSpecifier = BASE_HEX; + parameter->type = FORMAT_INT; + break; + +#if defined(SPECIFIER_FLOAT_E) +# if defined(SPECIFIER_FLOAT_E_UPPER) + case SPECIFIER_FLOAT_E_UPPER: + parameter->flags |= FLAGS_UPPER; + /* FALLTHROUGH */ +# endif + case SPECIFIER_FLOAT_E: + parameter->flags |= FLAGS_FLOAT_E; + parameter->type = FORMAT_DOUBLE; + break; +#endif + +#if defined(SPECIFIER_FLOAT_G) +# if defined(SPECIFIER_FLOAT_G_UPPER) + case SPECIFIER_FLOAT_G_UPPER: + parameter->flags |= FLAGS_UPPER; + /* FALLTHROUGH */ +# endif + case SPECIFIER_FLOAT_G: + parameter->flags |= FLAGS_FLOAT_G; + parameter->type = FORMAT_DOUBLE; + break; +#endif + +#if defined(SPECIFIER_FLOAT_F) +# if defined(SPECIFIER_FLOAT_F_UPPER) + case SPECIFIER_FLOAT_F_UPPER: + parameter->flags |= FLAGS_UPPER; + /* FALLTHROUGH */ +# endif + case SPECIFIER_FLOAT_F: + parameter->type = FORMAT_DOUBLE; + break; +#endif + +#if defined(TRIO_COMPILER_VISUALC) +# pragma warning( push ) +# pragma warning( disable : 4127 ) /* Conditional expression is constant */ +#endif + case SPECIFIER_POINTER: + if (sizeof(trio_pointer_t) == sizeof(trio_ulonglong_t)) + parameter->flags |= FLAGS_QUAD; + else if (sizeof(trio_pointer_t) == sizeof(long)) + parameter->flags |= FLAGS_LONG; + parameter->type = FORMAT_POINTER; + break; +#if defined(TRIO_COMPILER_VISUALC) +# pragma warning( pop ) +#endif + + case SPECIFIER_COUNT: + parameter->type = FORMAT_COUNT; + break; + +#if TRIO_FEATURE_HEXFLOAT + case SPECIFIER_HEXFLOAT_UPPER: + parameter->flags |= FLAGS_UPPER; + /* FALLTHROUGH */ + case SPECIFIER_HEXFLOAT: + parameter->baseSpecifier = BASE_HEX; + parameter->type = FORMAT_DOUBLE; + break; +#endif + +#if TRIO_FEATURE_ERRNO + case SPECIFIER_ERRNO: + parameter->type = FORMAT_ERRNO; + break; +#endif + +#if TRIO_FEATURE_USER_DEFINED + case SPECIFIER_USER_DEFINED_BEGIN: + { + unsigned int max; + int without_namespace = TRUE; + char* tmpformat = (char *)&format[offset]; + int ch; + + parameter->type = FORMAT_USER_DEFINED; + parameter->user_defined.namespace[0] = NIL; + + while ((ch = format[offset]) != NIL) + { + offset++; + if ((ch == SPECIFIER_USER_DEFINED_END) || (ch == SPECIFIER_USER_DEFINED_EXTRA)) + { + if (without_namespace) + /* No namespace, handler will be passed as an argument */ + parameter->flags |= FLAGS_USER_DEFINED_PARAMETER; + + /* Copy the user data */ + max = (unsigned int)(&format[offset] - tmpformat); + if (max > MAX_USER_DATA) + max = MAX_USER_DATA; + trio_copy_max(parameter->user_data, max, tmpformat); + + /* Skip extra data (which is only there to keep the compiler happy) */ + while ((ch != NIL) && (ch != SPECIFIER_USER_DEFINED_END)) + ch = format[offset++]; + + break; /* while */ + } + + if (ch == SPECIFIER_USER_DEFINED_SEPARATOR) + { + without_namespace = FALSE; + /* Copy the namespace for later looking-up */ + max = (int)(&format[offset] - tmpformat); + if (max > MAX_USER_NAME) + max = MAX_USER_NAME; + trio_copy_max(parameter->user_defined.namespace, max, tmpformat); + tmpformat = (char *)&format[offset]; + } + } + + if (ch != SPECIFIER_USER_DEFINED_END) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + } + break; +#endif /* TRIO_FEATURE_USER_DEFINED */ + + default: + /* Bail out completely to make the error more obvious */ + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + } + + parameter->endOffset = offset; + + return 0; +} + +/************************************************************************* + * TrioParse + * + * Description: + * Parse the format string + */ +TRIO_PRIVATE int +TrioParse +TRIO_ARGS5((type, format, parameters, arglist, argarray), + int type, + TRIO_CONST char *format, + trio_parameter_t *parameters, + va_list arglist, + trio_pointer_t *argarray) +{ + /* Count the number of times a parameter is referenced */ + unsigned short usedEntries[MAX_PARAMETERS]; + /* Parameter counters */ + int parameterPosition; + int maxParam = -1; + /* Utility variables */ + int offset; /* Offset into formatting string */ + BOOLEAN_T positional; /* Does the specifier have a positional? */ +#if TRIO_FEATURE_STICKY + BOOLEAN_T gotSticky = FALSE; /* Are there any sticky modifiers at all? */ +#endif + /* + * indices specifies the order in which the parameters must be + * read from the va_args (this is necessary to handle positionals) + */ + int indices[MAX_PARAMETERS]; + int pos = 0; + /* Various variables */ +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + int charlen; +#endif + int save_errno; + int i = -1; + int num; + trio_parameter_t workParameter; + int status; + + /* + * The 'parameters' array is not initialized, but we need to + * know which entries we have used. + */ + memset(usedEntries, 0, sizeof(usedEntries)); + + save_errno = errno; + offset = 0; + parameterPosition = 0; +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + (void)mblen(NULL, 0); +#endif + + while (format[offset]) + { + TrioInitializeParameter(&workParameter); + +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + if (! isascii(format[offset])) + { + /* + * Multibyte characters cannot be legal specifiers or + * modifiers, so we skip over them. + */ + charlen = mblen(&format[offset], MB_LEN_MAX); + offset += (charlen > 0) ? charlen : 1; + continue; /* while */ + } +#endif /* TRIO_COMPILER_SUPPORTS_MULTIBYTE */ + + switch(format[offset++]) { + + case CHAR_IDENTIFIER: + { + if (CHAR_IDENTIFIER == format[offset]) + { + /* skip double "%" */ + offset++; + continue; /* while */ + } + + status = TrioParseQualifiers(type, format, offset, &workParameter); + if (status < 0) + return status; /* Return qualifier syntax error */ + + status = TrioParseSpecifier(type, format, workParameter.endOffset, &workParameter); + if (status < 0) + return status; /* Return specifier syntax error */ + } + break; + +#if TRIO_EXTENSION + case CHAR_ALT_IDENTIFIER: + { + status = TrioParseQualifiers(type, format, offset, &workParameter); + if (status < 0) + continue; /* False alert, not a user defined specifier */ + + status = TrioParseSpecifier(type, format, workParameter.endOffset, &workParameter); + if ((status < 0) || (FORMAT_USER_DEFINED != workParameter.type)) + continue; /* False alert, not a user defined specifier */ + } + break; +#endif + + default: + continue; /* while */ + } + + /* now handle the parsed conversion specification */ + positional = (NO_POSITION != workParameter.position); + + /* + * Parameters only need the type and value. The value is + * read later. + */ + if (workParameter.flags & FLAGS_WIDTH_PARAMETER) + { + if (workParameter.width == NO_WIDTH) + { + workParameter.width = parameterPosition++; + } + else + { + if (! positional) + workParameter.position = workParameter.width + 1; + } + + usedEntries[workParameter.width] += 1; + if (workParameter.width > maxParam) + maxParam = workParameter.width; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[workParameter.width] = pos; + workParameter.width = pos++; + } + if (workParameter.flags & FLAGS_PRECISION_PARAMETER) + { + if (workParameter.precision == NO_PRECISION) + { + workParameter.precision = parameterPosition++; + } + else + { + if (! positional) + workParameter.position = workParameter.precision + 1; + } + + usedEntries[workParameter.precision] += 1; + if (workParameter.precision > maxParam) + maxParam = workParameter.precision; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[workParameter.precision] = pos; + workParameter.precision = pos++; + } + if (workParameter.flags & FLAGS_BASE_PARAMETER) + { + if (workParameter.base == NO_BASE) + { + workParameter.base = parameterPosition++; + } + else + { + if (! positional) + workParameter.position = workParameter.base + 1; + } + + usedEntries[workParameter.base] += 1; + if (workParameter.base > maxParam) + maxParam = workParameter.base; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[workParameter.base] = pos; + workParameter.base = pos++; + } +#if TRIO_FEATURE_VARSIZE + if (workParameter.flags & FLAGS_VARSIZE_PARAMETER) + { + workParameter.varsize = parameterPosition++; + + usedEntries[workParameter.varsize] += 1; + if (workParameter.varsize > maxParam) + maxParam = workParameter.varsize; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = 0; + indices[workParameter.varsize] = pos; + workParameter.varsize = pos++; + } +#endif +#if TRIO_FEATURE_USER_DEFINED + if (workParameter.flags & FLAGS_USER_DEFINED_PARAMETER) + { + workParameter.user_defined.handler = parameterPosition++; + + usedEntries[workParameter.user_defined.handler] += 1; + if (workParameter.user_defined.handler > maxParam) + maxParam = workParameter.user_defined.handler; + parameters[pos].type = FORMAT_PARAMETER; + parameters[pos].flags = FLAGS_USER_DEFINED; + indices[workParameter.user_defined.handler] = pos; + workParameter.user_defined.handler = pos++; + } +#endif + + if (NO_POSITION == workParameter.position) + { + workParameter.position = parameterPosition++; + } + + if (workParameter.position > maxParam) + maxParam = workParameter.position; + + if (workParameter.position >= MAX_PARAMETERS) + { + /* Bail out completely to make the error more obvious */ + return TRIO_ERROR_RETURN(TRIO_ETOOMANY, offset); + } + + indices[workParameter.position] = pos; + + /* Count the number of times this entry has been used */ + usedEntries[workParameter.position] += 1; + + /* Find last sticky parameters */ +#if TRIO_FEATURE_STICKY + if (workParameter.flags & FLAGS_STICKY) + { + gotSticky = TRUE; + } + else if (gotSticky) + { + for (i = pos - 1; i >= 0; i--) + { + if (parameters[i].type == FORMAT_PARAMETER) + continue; + if ((parameters[i].flags & FLAGS_STICKY) && + (parameters[i].type == workParameter.type)) + { + /* Do not overwrite current qualifiers */ + workParameter.flags |= (parameters[i].flags & (unsigned long)~FLAGS_STICKY); + if (workParameter.width == NO_WIDTH) + workParameter.width = parameters[i].width; + if (workParameter.precision == NO_PRECISION) + workParameter.precision = parameters[i].precision; + if (workParameter.base == NO_BASE) + workParameter.base = parameters[i].base; + break; + } + } + } +#endif + + if (workParameter.base == NO_BASE) + workParameter.base = BASE_DECIMAL; + + offset = workParameter.endOffset; + + TrioCopyParameter(¶meters[pos++], &workParameter); + } /* while format characters left */ + + parameters[pos].type = FORMAT_SENTINEL; /* end parameter array with sentinel */ + parameters[pos].beginOffset = offset; + + for (num = 0; num <= maxParam; num++) + { + if (usedEntries[num] != 1) + { + if (usedEntries[num] == 0) /* gap detected */ + return TRIO_ERROR_RETURN(TRIO_EGAP, num); + else /* double references detected */ + return TRIO_ERROR_RETURN(TRIO_EDBLREF, num); + } + + i = indices[num]; + + /* + * FORMAT_PARAMETERS are only present if they must be read, + * so it makes no sense to check the ignore flag (besides, + * the flags variable is not set for that particular type) + */ + if ((parameters[i].type != FORMAT_PARAMETER) && + (parameters[i].flags & FLAGS_IGNORE)) + continue; /* for all arguments */ + + /* + * The stack arguments are read according to ANSI C89 + * default argument promotions: + * + * char = int + * short = int + * unsigned char = unsigned int + * unsigned short = unsigned int + * float = double + * + * In addition to the ANSI C89 these types are read (the + * default argument promotions of C99 has not been + * considered yet) + * + * long long + * long double + * size_t + * ptrdiff_t + * intmax_t + */ + switch (parameters[i].type) + { + case FORMAT_GROUP: + case FORMAT_STRING: +#if TRIO_FEATURE_WIDECHAR + if (parameters[i].flags & FLAGS_WIDECHAR) + { + parameters[i].data.wstring = (argarray == NULL) + ? va_arg(arglist, trio_wchar_t *) + : (trio_wchar_t *)(argarray[num]); + } + else +#endif + { + parameters[i].data.string = (argarray == NULL) + ? va_arg(arglist, char *) + : (char *)(argarray[num]); + } + break; + +#if TRIO_FEATURE_USER_DEFINED + case FORMAT_USER_DEFINED: +#endif + case FORMAT_POINTER: + case FORMAT_COUNT: + case FORMAT_UNKNOWN: + parameters[i].data.pointer = (argarray == NULL) + ? va_arg(arglist, trio_pointer_t ) + : argarray[num]; + break; + + case FORMAT_CHAR: + case FORMAT_INT: +#if TRIO_FEATURE_SCANF + if (TYPE_SCAN == type) + { + if (argarray == NULL) + parameters[i].data.pointer = + (trio_pointer_t)va_arg(arglist, trio_pointer_t); + else + { + if (parameters[i].type == FORMAT_CHAR) + parameters[i].data.pointer = + (trio_pointer_t)((char *)argarray[num]); + else if (parameters[i].flags & FLAGS_SHORT) + parameters[i].data.pointer = + (trio_pointer_t)((short *)argarray[num]); + else + parameters[i].data.pointer = + (trio_pointer_t)((int *)argarray[num]); + } + } + else +#endif /* TRIO_FEATURE_SCANF */ + { +#if TRIO_FEATURE_VARSIZE || TRIO_FEATURE_FIXED_SIZE + if (parameters[i].flags + & (FLAGS_VARSIZE_PARAMETER | FLAGS_FIXED_SIZE)) + { + int varsize; + if (parameters[i].flags & FLAGS_VARSIZE_PARAMETER) + { + /* + * Variable sizes are mapped onto the fixed sizes, in + * accordance with integer promotion. + * + * Please note that this may not be portable, as we + * only guess the size, not the layout of the numbers. + * For example, if int is little-endian, and long is + * big-endian, then this will fail. + */ + varsize = (int)parameters[parameters[i].varsize].data.number.as_unsigned; + } + else + { + /* Used for the I modifiers */ + varsize = parameters[i].varsize; + } + parameters[i].flags &= ~FLAGS_ALL_VARSIZES; + + if (varsize <= (int)sizeof(int)) + ; + else if (varsize <= (int)sizeof(long)) + parameters[i].flags |= FLAGS_LONG; +#if TRIO_FEATURE_INTMAX_T + else if (varsize <= (int)sizeof(trio_longlong_t)) + parameters[i].flags |= FLAGS_QUAD; + else + parameters[i].flags |= FLAGS_INTMAX_T; +#else + else + parameters[i].flags |= FLAGS_QUAD; +#endif + } +#endif /* TRIO_FEATURE_VARSIZE */ +#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER + if (parameters[i].flags & FLAGS_SIZE_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(arglist, size_t) + : (trio_uintmax_t)(*((size_t *)argarray[num])); + else +#endif +#if TRIO_FEATURE_PTRDIFF_T + if (parameters[i].flags & FLAGS_PTRDIFF_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(arglist, ptrdiff_t) + : (trio_uintmax_t)(*((ptrdiff_t *)argarray[num])); + else +#endif +#if TRIO_FEATURE_INTMAX_T + if (parameters[i].flags & FLAGS_INTMAX_T) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(arglist, trio_intmax_t) + : (trio_uintmax_t)(*((trio_intmax_t *)argarray[num])); + else +#endif + if (parameters[i].flags & FLAGS_QUAD) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(arglist, trio_ulonglong_t) + : (trio_uintmax_t)(*((trio_ulonglong_t *)argarray[num])); + else if (parameters[i].flags & FLAGS_LONG) + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(arglist, long) + : (trio_uintmax_t)(*((long *)argarray[num])); + else + { + if (argarray == NULL) + parameters[i].data.number.as_unsigned = (trio_uintmax_t)va_arg(arglist, int); + else + { + if (parameters[i].type == FORMAT_CHAR) + parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((char *)argarray[num])); + else if (parameters[i].flags & FLAGS_SHORT) + parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((short *)argarray[num])); + else + parameters[i].data.number.as_unsigned = (trio_uintmax_t)(*((int *)argarray[num])); + } + } + } + break; + + case FORMAT_PARAMETER: + /* + * The parameter for the user-defined specifier is a pointer, + * whereas the rest (width, precision, base) uses an integer. + */ + if (parameters[i].flags & FLAGS_USER_DEFINED) + parameters[i].data.pointer = (argarray == NULL) + ? va_arg(arglist, trio_pointer_t ) + : argarray[num]; + else + parameters[i].data.number.as_unsigned = (argarray == NULL) + ? (trio_uintmax_t)va_arg(arglist, int) + : (trio_uintmax_t)(*((int *)argarray[num])); + break; + +#if TRIO_FEATURE_FLOAT + case FORMAT_DOUBLE: +# if TRIO_FEATURE_SCANF + if (TYPE_SCAN == type) + { + if (parameters[i].flags & FLAGS_LONGDOUBLE) + parameters[i].data.longdoublePointer = (argarray == NULL) + ? va_arg(arglist, trio_long_double_t *) + : (trio_long_double_t *)argarray[num]; + else + { + if (parameters[i].flags & FLAGS_LONG) + parameters[i].data.doublePointer = (argarray == NULL) + ? va_arg(arglist, double *) + : (double *)argarray[num]; + else + parameters[i].data.doublePointer = (argarray == NULL) + ? (double *)va_arg(arglist, float *) + : (double *)((float *)argarray[num]); + } + } + else +# endif /* TRIO_FEATURE_SCANF */ + { + if (parameters[i].flags & FLAGS_LONGDOUBLE) + parameters[i].data.longdoubleNumber = (argarray == NULL) + ? va_arg(arglist, trio_long_double_t) + : (trio_long_double_t)(*((trio_long_double_t *)argarray[num])); + else + { + if (argarray == NULL) + parameters[i].data.longdoubleNumber = + (trio_long_double_t)va_arg(arglist, double); + else + { + if (parameters[i].flags & FLAGS_SHORT) + parameters[i].data.longdoubleNumber = + (trio_long_double_t)(*((float *)argarray[num])); + else + parameters[i].data.longdoubleNumber = + (trio_long_double_t)(*((double *)argarray[num])); + } + } + } + break; +#endif /* TRIO_FEATURE_FLOAT */ + +#if TRIO_FEATURE_ERRNO + case FORMAT_ERRNO: + parameters[i].data.errorNumber = save_errno; + break; +#endif + + default: + break; + } + } /* for all specifiers */ + return num; +} + + +/************************************************************************* + * + * FORMATTING + * + ************************************************************************/ + + +/************************************************************************* + * TrioWriteNumber + * + * Description: + * Output a number. + * The complexity of this function is a result of the complexity + * of the dependencies of the flags. + */ +TRIO_PRIVATE void +TrioWriteNumber +TRIO_ARGS6((self, number, flags, width, precision, base), + trio_class_t *self, + trio_uintmax_t number, + trio_flags_t flags, + int width, + int precision, + int base) +{ + BOOLEAN_T isNegative; + BOOLEAN_T isNumberZero; + BOOLEAN_T isPrecisionZero; + BOOLEAN_T ignoreNumber; + char buffer[MAX_CHARS_IN(trio_uintmax_t) * (1 + MAX_LOCALE_SEPARATOR_LENGTH) + 1]; + char *bufferend; + char *pointer; + TRIO_CONST char *digits; + int i; +#if TRIO_FEATURE_QUOTE + int length; + char *p; +#endif + int count; + int digitOffset; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); + + digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; + if (base == NO_BASE) + base = BASE_DECIMAL; + + isNumberZero = (number == 0); + isPrecisionZero = (precision == 0); + ignoreNumber = (isNumberZero + && isPrecisionZero + && !((flags & FLAGS_ALTERNATIVE) && (base == BASE_OCTAL))); + + if (flags & FLAGS_UNSIGNED) + { + isNegative = FALSE; + flags &= ~FLAGS_SHOWSIGN; + } + else + { + isNegative = ((trio_intmax_t)number < 0); + if (isNegative) + number = -((trio_intmax_t)number); + } + + if (flags & FLAGS_QUAD) + number &= (trio_ulonglong_t)-1; + else if (flags & FLAGS_LONG) + number &= (unsigned long)-1; + else + number &= (unsigned int)-1; + + /* Build number */ + pointer = bufferend = &buffer[sizeof(buffer) - 1]; + *pointer-- = NIL; + for (i = 1; i < (int)sizeof(buffer); i++) + { + digitOffset = number % base; + *pointer-- = digits[digitOffset]; + number /= base; + if (number == 0) + break; + +#if TRIO_FEATURE_QUOTE + if ((flags & FLAGS_QUOTE) && TrioFollowedBySeparator(i + 1)) + { + /* + * We are building the number from the least significant + * to the most significant digit, so we have to copy the + * thousand separator backwards + */ + length = internalThousandSeparatorLength; + if (((int)(pointer - buffer) - length) > 0) + { + p = &internalThousandSeparator[length - 1]; + while (length-- > 0) + *pointer-- = *p--; + } + } +#endif + } + + if (! ignoreNumber) + { + /* Adjust width */ + width -= (bufferend - pointer) - 1; + } + + /* Adjust precision */ + if (NO_PRECISION != precision) + { + precision -= (bufferend - pointer) - 1; + if (precision < 0) + precision = 0; + flags |= FLAGS_NILPADDING; + } + + /* Calculate padding */ + count = (! ((flags & FLAGS_LEFTADJUST) || (precision == NO_PRECISION))) + ? precision + : 0; + + /* Adjust width further */ + if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) + width--; + if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) + { + switch (base) + { + case BASE_BINARY: + case BASE_HEX: + width -= 2; + break; + case BASE_OCTAL: + if (!(flags & FLAGS_NILPADDING) || (count == 0)) + width--; + break; + default: + break; + } + } + + /* Output prefixes spaces if needed */ + if (! ((flags & FLAGS_LEFTADJUST) || + ((flags & FLAGS_NILPADDING) && (precision == NO_PRECISION)))) + { + while (width-- > count) + self->OutStream(self, CHAR_ADJUST); + } + + /* width has been adjusted for signs and alternatives */ + if (isNegative) + self->OutStream(self, '-'); + else if (flags & FLAGS_SHOWSIGN) + self->OutStream(self, '+'); + else if (flags & FLAGS_SPACE) + self->OutStream(self, ' '); + + /* Prefix is not written when the value is zero */ + if ((flags & FLAGS_ALTERNATIVE) && !isNumberZero) + { + switch (base) + { + case BASE_BINARY: + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'B' : 'b'); + break; + + case BASE_OCTAL: + if (!(flags & FLAGS_NILPADDING) || (count == 0)) + self->OutStream(self, '0'); + break; + + case BASE_HEX: + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); + break; + + default: + break; + } /* switch base */ + } + + /* Output prefixed zero padding if needed */ + if (flags & FLAGS_NILPADDING) + { + if (precision == NO_PRECISION) + precision = width; + while (precision-- > 0) + { + self->OutStream(self, '0'); + width--; + } + } + + if (! ignoreNumber) + { + /* Output the number itself */ + while (*(++pointer)) + { + self->OutStream(self, *pointer); + } + } + + /* Output trailing spaces if needed */ + if (flags & FLAGS_LEFTADJUST) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } +} + +/************************************************************************* + * TrioWriteStringCharacter + * + * Description: + * Output a single character of a string + */ +TRIO_PRIVATE void +TrioWriteStringCharacter +TRIO_ARGS3((self, ch, flags), + trio_class_t *self, + int ch, + trio_flags_t flags) +{ + if (flags & FLAGS_ALTERNATIVE) + { + if (! isprint(ch)) + { + /* + * Non-printable characters are converted to C escapes or + * \number, if no C escape exists. + */ + self->OutStream(self, CHAR_BACKSLASH); + switch (ch) + { + case '\007': self->OutStream(self, 'a'); break; + case '\b': self->OutStream(self, 'b'); break; + case '\f': self->OutStream(self, 'f'); break; + case '\n': self->OutStream(self, 'n'); break; + case '\r': self->OutStream(self, 'r'); break; + case '\t': self->OutStream(self, 't'); break; + case '\v': self->OutStream(self, 'v'); break; + case '\\': self->OutStream(self, '\\'); break; + default: + self->OutStream(self, 'x'); + TrioWriteNumber(self, (trio_uintmax_t)ch, + FLAGS_UNSIGNED | FLAGS_NILPADDING, + 2, 2, BASE_HEX); + break; + } + } + else if (ch == CHAR_BACKSLASH) + { + self->OutStream(self, CHAR_BACKSLASH); + self->OutStream(self, CHAR_BACKSLASH); + } + else + { + self->OutStream(self, ch); + } + } + else + { + self->OutStream(self, ch); + } +} + +/************************************************************************* + * TrioWriteString + * + * Description: + * Output a string + */ +TRIO_PRIVATE void +TrioWriteString +TRIO_ARGS5((self, string, flags, width, precision), + trio_class_t *self, + TRIO_CONST char *string, + trio_flags_t flags, + int width, + int precision) +{ + int length; + int ch; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + + if (string == NULL) + { + string = internalNullString; + length = sizeof(internalNullString) - 1; +#if TRIO_FEATURE_QUOTE + /* Disable quoting for the null pointer */ + flags &= (~FLAGS_QUOTE); +#endif + width = 0; + } + else + { + if (precision == 0) + { + length = trio_length(string); + } + else + { + length = trio_length_max(string, precision); + } + } + if ((NO_PRECISION != precision) && + (precision < length)) + { + length = precision; + } + width -= length; + +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); +#endif + + if (! (flags & FLAGS_LEFTADJUST)) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } + + while (length-- > 0) + { + /* The ctype parameters must be an unsigned char (or EOF) */ + ch = (int)((unsigned char)(*string++)); + TrioWriteStringCharacter(self, ch, flags); + } + + if (flags & FLAGS_LEFTADJUST) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); +#endif +} + +/************************************************************************* + * TrioWriteWideStringCharacter + * + * Description: + * Output a wide string as a multi-byte sequence + */ +#if TRIO_FEATURE_WIDECHAR +TRIO_PRIVATE int +TrioWriteWideStringCharacter +TRIO_ARGS4((self, wch, flags, width), + trio_class_t *self, + trio_wchar_t wch, + trio_flags_t flags, + int width) +{ + int size; + int i; + int ch; + char *string; + char buffer[MB_LEN_MAX + 1]; + + if (width == NO_WIDTH) + width = sizeof(buffer); + + size = wctomb(buffer, wch); + if ((size <= 0) || (size > width) || (buffer[0] == NIL)) + return 0; + + string = buffer; + i = size; + while ((width >= i) && (width-- > 0) && (i-- > 0)) + { + /* The ctype parameters must be an unsigned char (or EOF) */ + ch = (int)((unsigned char)(*string++)); + TrioWriteStringCharacter(self, ch, flags); + } + return size; +} +#endif /* TRIO_FEATURE_WIDECHAR */ + +/************************************************************************* + * TrioWriteWideString + * + * Description: + * Output a wide character string as a multi-byte string + */ +#if TRIO_FEATURE_WIDECHAR +TRIO_PRIVATE void +TrioWriteWideString +TRIO_ARGS5((self, wstring, flags, width, precision), + trio_class_t *self, + TRIO_CONST trio_wchar_t *wstring, + trio_flags_t flags, + int width, + int precision) +{ + int length; + int size; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + /* Required by TrioWriteWideStringCharacter */ + (void)mblen(NULL, 0); +#endif + + if (wstring == NULL) + { + TrioWriteString(self, NULL, flags, width, precision); + return; + } + + if (NO_PRECISION == precision) + { + length = INT_MAX; + } + else + { + length = precision; + width -= length; + } + +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); +#endif + + if (! (flags & FLAGS_LEFTADJUST)) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } + + while (length > 0) + { + size = TrioWriteWideStringCharacter(self, *wstring++, flags, length); + if (size == 0) + break; /* while */ + length -= size; + } + + if (flags & FLAGS_LEFTADJUST) + { + while (width-- > 0) + self->OutStream(self, CHAR_ADJUST); + } +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + self->OutStream(self, CHAR_QUOTE); +#endif +} +#endif /* TRIO_FEATURE_WIDECHAR */ + +/************************************************************************* + * TrioWriteDouble + * + * http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_211.htm + * + * "5.2.4.2.2 paragraph #4 + * + * The accuracy [...] is implementation defined, as is the accuracy + * of the conversion between floating-point internal representations + * and string representations performed by the libray routine in + * " + */ +/* FIXME: handle all instances of constant long-double number (L) + * and *l() math functions. + */ +#if TRIO_FEATURE_FLOAT +TRIO_PRIVATE void +TrioWriteDouble +TRIO_ARGS6((self, number, flags, width, precision, base), + trio_class_t *self, + trio_long_double_t number, + trio_flags_t flags, + int width, + int precision, + int base) +{ + trio_long_double_t integerNumber; + trio_long_double_t fractionNumber; + trio_long_double_t workNumber; + int integerDigits; + int fractionDigits; + int exponentDigits; + int workDigits; + int baseDigits; + int integerThreshold; + int fractionThreshold; + int expectedWidth; + int exponent = 0; + unsigned int uExponent = 0; + int exponentBase; + trio_long_double_t dblBase; + trio_long_double_t dblFractionBase; + trio_long_double_t integerAdjust; + trio_long_double_t fractionAdjust; + trio_long_double_t workFractionNumber; + trio_long_double_t workFractionAdjust; + int fractionDigitsInspect; + BOOLEAN_T isNegative; + BOOLEAN_T isExponentNegative = FALSE; + BOOLEAN_T requireTwoDigitExponent; + BOOLEAN_T isHex; + TRIO_CONST char *digits; +# if TRIO_FEATURE_QUOTE + char *groupingPointer; +# endif + int i; + int offset; + BOOLEAN_T hasOnlyZeroes; + int leadingFractionZeroes = -1; + register int trailingZeroes; + BOOLEAN_T keepTrailingZeroes; + BOOLEAN_T keepDecimalPoint; + trio_long_double_t epsilon; + BOOLEAN_T adjustNumber = FALSE; + + assert(VALID(self)); + assert(VALID(self->OutStream)); + assert(((base >= MIN_BASE) && (base <= MAX_BASE)) || (base == NO_BASE)); + + /* Determine sign and look for special quantities */ + switch (trio_fpclassify_and_signbit(number, &isNegative)) + { + case TRIO_FP_NAN: + TrioWriteString(self, + (flags & FLAGS_UPPER) + ? NAN_UPPER + : NAN_LOWER, + flags, width, precision); + return; + + case TRIO_FP_INFINITE: + if (isNegative) + { + /* Negative infinity */ + TrioWriteString(self, + (flags & FLAGS_UPPER) + ? "-" INFINITE_UPPER + : "-" INFINITE_LOWER, + flags, width, precision); + return; + } + else + { + /* Positive infinity */ + TrioWriteString(self, + (flags & FLAGS_UPPER) + ? INFINITE_UPPER + : INFINITE_LOWER, + flags, width, precision); + return; + } + + default: + /* Finitude */ + break; + } + + /* Normal numbers */ + if (flags & FLAGS_LONGDOUBLE) + { + baseDigits = (base == 10) + ? LDBL_DIG + : (int)trio_floor(LDBL_MANT_DIG / TrioLogarithmBase(base)); + epsilon = LDBL_EPSILON; + } + else if (flags & FLAGS_SHORT) + { + baseDigits = (base == BASE_DECIMAL) + ? FLT_DIG + : (int)trio_floor(FLT_MANT_DIG / TrioLogarithmBase(base)); + epsilon = FLT_EPSILON; + } + else + { + baseDigits = (base == BASE_DECIMAL) + ? DBL_DIG + : (int)trio_floor(DBL_MANT_DIG / TrioLogarithmBase(base)); + epsilon = DBL_EPSILON; + } + + digits = (flags & FLAGS_UPPER) ? internalDigitsUpper : internalDigitsLower; + isHex = (base == BASE_HEX); + if (base == NO_BASE) + base = BASE_DECIMAL; + dblBase = (trio_long_double_t)base; + keepTrailingZeroes = !( (flags & FLAGS_ROUNDING) || + ( (flags & FLAGS_FLOAT_G) && + !(flags & FLAGS_ALTERNATIVE) ) ); + +# if TRIO_FEATURE_ROUNDING + if (flags & FLAGS_ROUNDING) + { + precision = baseDigits; + } +# endif + + if (precision == NO_PRECISION) + { + if (isHex) + { + keepTrailingZeroes = FALSE; + precision = FLT_MANT_DIG; + } + else + { + precision = FLT_DIG; + } + } + + if (isNegative) + { + number = -number; + } + + if (isHex) + { + flags |= FLAGS_FLOAT_E; + } + + reprocess: + + if (flags & FLAGS_FLOAT_G) + { + if (precision == 0) + precision = 1; + + if ( (number < TRIO_SUFFIX_LONG(1.0E-4)) || + (number >= TrioPower(base, (trio_long_double_t)precision)) ) + { + /* Use scientific notation */ + flags |= FLAGS_FLOAT_E; + } + else if (number < 1.0) + { + /* + * Use normal notation. If the integer part of the number is + * zero, then adjust the precision to include leading fractional + * zeros. + */ + workNumber = TrioLogarithm(number, base); + workNumber = TRIO_FABS(workNumber); + if (workNumber - trio_floor(workNumber) < epsilon) + workNumber--; + leadingFractionZeroes = (int)trio_floor(workNumber); + } + } + + if (flags & FLAGS_FLOAT_E) + { + /* Scale the number */ + workNumber = TrioLogarithm(number, base); + if (trio_isinf(workNumber) == -1) + { + exponent = 0; + /* Undo setting */ + if (flags & FLAGS_FLOAT_G) + flags &= ~FLAGS_FLOAT_E; + } + else + { + exponent = (int)trio_floor(workNumber); + workNumber = number; + /* + * The expression A * 10^-B is equivalent to A / 10^B but the former + * usually gives better accuracy. + */ + workNumber *= TrioPower(dblBase, (trio_long_double_t)-exponent); + if (trio_isinf(workNumber)) { + /* + * Scaling is done it two steps to avoid problems with subnormal + * numbers. + */ + workNumber /= TrioPower(dblBase, (trio_long_double_t)(exponent / 2)); + workNumber /= TrioPower(dblBase, (trio_long_double_t)(exponent - (exponent / 2))); + } + number = workNumber; + isExponentNegative = (exponent < 0); + uExponent = (isExponentNegative) ? -exponent : exponent; + if (isHex) + uExponent *= 4; /* log16(2) */ +#if TRIO_FEATURE_QUOTE + /* No thousand separators */ + flags &= ~FLAGS_QUOTE; +#endif + } + } + + integerNumber = trio_floor(number); + fractionNumber = number - integerNumber; + + /* + * Truncated number. + * + * Precision is number of significant digits for FLOAT_G and number of + * fractional digits for others. + */ + integerDigits = 1; + if (integerNumber > epsilon) + { + integerDigits += (int)TrioLogarithm(integerNumber, base); + } + + fractionDigits = precision; + if (flags & FLAGS_FLOAT_G) + { + if (leadingFractionZeroes > 0) + { + fractionDigits += leadingFractionZeroes; + } + if ((integerNumber > epsilon) || (number <= epsilon)) + { + fractionDigits -= integerDigits; + } + } + + dblFractionBase = TrioPower(base, fractionDigits); + + if (integerNumber < 1.0) + { + workNumber = number * dblFractionBase + TRIO_SUFFIX_LONG(0.5); + if (trio_floor(number * dblFractionBase) != trio_floor(workNumber)) + { + adjustNumber = TRUE; + /* Remove a leading fraction zero if fraction is rounded up */ + if ((int)TrioLogarithm(number * dblFractionBase, base) != (int)TrioLogarithm(workNumber, base)) + { + --leadingFractionZeroes; + } + } + workNumber /= dblFractionBase; + } + else + { + workNumber = number + TRIO_SUFFIX_LONG(0.5) / dblFractionBase; + adjustNumber = (trio_floor(number) != trio_floor(workNumber)); + } + if (adjustNumber) + { + if ((flags & FLAGS_FLOAT_G) && !(flags & FLAGS_FLOAT_E)) + { + /* The adjustment may require a change to scientific notation */ + if ( (workNumber < TRIO_SUFFIX_LONG(1.0E-4)) || + (workNumber >= TrioPower(base, (trio_long_double_t)precision)) ) + { + /* Use scientific notation */ + flags |= FLAGS_FLOAT_E; + goto reprocess; + } + } + + if (flags & FLAGS_FLOAT_E) + { + workDigits = 1 + TrioLogarithm(trio_floor(workNumber), base); + if (integerDigits == workDigits) + { + /* Adjust if the same number of digits are used */ + number += TRIO_SUFFIX_LONG(0.5) / dblFractionBase; + integerNumber = trio_floor(number); + fractionNumber = number - integerNumber; + } + else + { + /* Adjust if number was rounded up one digit (ie. 0.99 to 1.00) */ + exponent++; + isExponentNegative = (exponent < 0); + uExponent = (isExponentNegative) ? -exponent : exponent; + if (isHex) + uExponent *= 4; /* log16(2) */ + workNumber = (number + TRIO_SUFFIX_LONG(0.5) / dblFractionBase) / dblBase; + integerNumber = trio_floor(workNumber); + fractionNumber = workNumber - integerNumber; + } + } + else + { + if (workNumber > 1.0) + { + /* Adjust if number was rounded up one digit (ie. 99 to 100) */ + integerNumber = trio_floor(workNumber); + fractionNumber = 0.0; + integerDigits = (integerNumber > epsilon) + ? 1 + (int)TrioLogarithm(integerNumber, base) + : 1; + if (flags & FLAGS_FLOAT_G) + { + if (flags & FLAGS_ALTERNATIVE) + { + if ((integerNumber > epsilon) || (number <= epsilon)) + { + fractionDigits -= integerDigits; + } + } + else + { + fractionDigits = 0; + } + } + } + else + { + integerNumber = trio_floor(workNumber); + fractionNumber = workNumber - integerNumber; + if (flags & FLAGS_FLOAT_G) + { + if (flags & FLAGS_ALTERNATIVE) + { + fractionDigits = precision; + if (leadingFractionZeroes > 0) + { + fractionDigits += leadingFractionZeroes; + } + if ((integerNumber > epsilon) || (number <= epsilon)) + { + fractionDigits -= integerDigits; + } + } + } + } + } + } + + /* Estimate accuracy */ + integerAdjust = fractionAdjust = TRIO_SUFFIX_LONG(0.5); +# if TRIO_FEATURE_ROUNDING + if (flags & FLAGS_ROUNDING) + { + if (integerDigits > baseDigits) + { + integerThreshold = baseDigits; + fractionDigits = 0; + dblFractionBase = 1.0; + fractionThreshold = 0; + precision = 0; /* Disable decimal-point */ + integerAdjust = TrioPower(base, integerDigits - integerThreshold - 1); + fractionAdjust = 0.0; + } + else + { + integerThreshold = integerDigits; + fractionThreshold = fractionDigits - integerThreshold; + fractionAdjust = 1.0; + } + } + else +# endif + { + integerThreshold = INT_MAX; + fractionThreshold = INT_MAX; + } + + /* + * Calculate expected width. + * sign + integer part + thousands separators + decimal point + * + fraction + exponent + */ + fractionAdjust /= dblFractionBase; + hasOnlyZeroes = (trio_floor((fractionNumber + fractionAdjust) * + dblFractionBase) < epsilon); + keepDecimalPoint = ( (flags & FLAGS_ALTERNATIVE) || + !((precision == 0) || + (!keepTrailingZeroes && hasOnlyZeroes)) ); + + expectedWidth = integerDigits + fractionDigits; + + if (!keepTrailingZeroes) + { + trailingZeroes = 0; + workFractionNumber = fractionNumber; + workFractionAdjust = fractionAdjust; + fractionDigitsInspect = fractionDigits; + + if (integerDigits > integerThreshold) + { + fractionDigitsInspect = 0; + } + else if (fractionThreshold <= fractionDigits) + { + fractionDigitsInspect = fractionThreshold + 1; + } + + trailingZeroes = fractionDigits - fractionDigitsInspect; + for (i = 0; i < fractionDigitsInspect; i++) + { + workFractionNumber *= dblBase; + workFractionAdjust *= dblBase; + workNumber = trio_floor(workFractionNumber + workFractionAdjust); + workFractionNumber -= workNumber; + offset = (int)trio_fmod(workNumber, dblBase); + if (offset == 0) + { + trailingZeroes++; + } + else + { + trailingZeroes = 0; + } + } + expectedWidth -= trailingZeroes; + } + + if (keepDecimalPoint) + { + expectedWidth += internalDecimalPointLength; + } + +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + { + expectedWidth += TrioCalcThousandSeparatorLength(integerDigits); + } +#endif + + if (isNegative || (flags & FLAGS_SHOWSIGN) || (flags & FLAGS_SPACE)) + { + expectedWidth += sizeof("-") - 1; + } + + exponentDigits = 0; + if (flags & FLAGS_FLOAT_E) + { + exponentDigits = (uExponent == 0) + ? 1 + : (int)trio_ceil(TrioLogarithm((double)(uExponent + 1), + (isHex) ? 10 : base)); + } + requireTwoDigitExponent = ((base == BASE_DECIMAL) && (exponentDigits == 1)); + if (exponentDigits > 0) + { + expectedWidth += exponentDigits; + expectedWidth += (requireTwoDigitExponent + ? sizeof("E+0") - 1 + : sizeof("E+") - 1); + } + + if (isHex) + { + expectedWidth += sizeof("0X") - 1; + } + + /* Output prefixing */ + if (flags & FLAGS_NILPADDING) + { + /* Leading zeros must be after sign */ + if (isNegative) + self->OutStream(self, '-'); + else if (flags & FLAGS_SHOWSIGN) + self->OutStream(self, '+'); + else if (flags & FLAGS_SPACE) + self->OutStream(self, ' '); + if (isHex) + { + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); + } + if (!(flags & FLAGS_LEFTADJUST)) + { + for (i = expectedWidth; i < width; i++) + { + self->OutStream(self, '0'); + } + } + } + else + { + /* Leading spaces must be before sign */ + if (!(flags & FLAGS_LEFTADJUST)) + { + for (i = expectedWidth; i < width; i++) + { + self->OutStream(self, CHAR_ADJUST); + } + } + if (isNegative) + self->OutStream(self, '-'); + else if (flags & FLAGS_SHOWSIGN) + self->OutStream(self, '+'); + else if (flags & FLAGS_SPACE) + self->OutStream(self, ' '); + if (isHex) + { + self->OutStream(self, '0'); + self->OutStream(self, (flags & FLAGS_UPPER) ? 'X' : 'x'); + } + } + + /* Output the integer part and thousand separators */ + for (i = 0; i < integerDigits; i++) + { + workNumber = trio_floor(((integerNumber + integerAdjust) + / TrioPower(base, integerDigits - i - 1))); + if (i > integerThreshold) + { + /* Beyond accuracy */ + self->OutStream(self, digits[0]); + } + else + { + self->OutStream(self, digits[(int)trio_fmod(workNumber, dblBase)]); + } + +#if TRIO_FEATURE_QUOTE + if (((flags & (FLAGS_FLOAT_E | FLAGS_QUOTE)) == FLAGS_QUOTE) + && TrioFollowedBySeparator(integerDigits - i)) + { + for (groupingPointer = internalThousandSeparator; + *groupingPointer != NIL; + groupingPointer++) + { + self->OutStream(self, *groupingPointer); + } + } +#endif + } + + /* Insert decimal point and build the fraction part */ + trailingZeroes = 0; + + if (keepDecimalPoint) + { + if (internalDecimalPoint) + { + self->OutStream(self, internalDecimalPoint); + } + else + { + for (i = 0; i < internalDecimalPointLength; i++) + { + self->OutStream(self, internalDecimalPointString[i]); + } + } + } + + for (i = 0; i < fractionDigits; i++) + { + if ((integerDigits > integerThreshold) || (i > fractionThreshold)) + { + /* Beyond accuracy */ + trailingZeroes++; + } + else + { + fractionNumber *= dblBase; + fractionAdjust *= dblBase; + workNumber = trio_floor(fractionNumber + fractionAdjust); + if (workNumber > fractionNumber) + { + /* fractionNumber should never become negative */ + fractionNumber = 0.0; + fractionAdjust = 0.0; + } + else + { + fractionNumber -= workNumber; + } + offset = (int)trio_fmod(workNumber, dblBase); + if (offset == 0) + { + trailingZeroes++; + } + else + { + while (trailingZeroes > 0) + { + /* Not trailing zeroes after all */ + self->OutStream(self, digits[0]); + trailingZeroes--; + } + self->OutStream(self, digits[offset]); + } + } + } + + if (keepTrailingZeroes) + { + while (trailingZeroes > 0) + { + self->OutStream(self, digits[0]); + trailingZeroes--; + } + } + + /* Output exponent */ + if (exponentDigits > 0) + { + self->OutStream(self, + isHex + ? ((flags & FLAGS_UPPER) ? 'P' : 'p') + : ((flags & FLAGS_UPPER) ? 'E' : 'e')); + self->OutStream(self, (isExponentNegative) ? '-' : '+'); + + /* The exponent must contain at least two digits */ + if (requireTwoDigitExponent) + self->OutStream(self, '0'); + + if (isHex) + base = 10; + exponentBase = (int)TrioPower(base, exponentDigits - 1); + for (i = 0; i < exponentDigits; i++) + { + self->OutStream(self, digits[(uExponent / exponentBase) % base]); + exponentBase /= base; + } + } + /* Output trailing spaces */ + if (flags & FLAGS_LEFTADJUST) + { + for (i = expectedWidth; i < width; i++) + { + self->OutStream(self, CHAR_ADJUST); + } + } +} +#endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * TrioFormatProcess + * + * Description: + * This is the main engine for formatting output + */ +TRIO_PRIVATE int +TrioFormatProcess +TRIO_ARGS3((data, format, parameters), + trio_class_t *data, + TRIO_CONST char *format, + trio_parameter_t *parameters) +{ + int i; +#if TRIO_FEATURE_ERRNO + TRIO_CONST char *string; +#endif + trio_pointer_t pointer; + trio_flags_t flags; + int width; + int precision; + int base; + int offset; + + offset = 0; + i = 0; + + for (;;) + { + /* Skip the parameter entries */ + while (parameters[i].type == FORMAT_PARAMETER) + i++; + + /* Copy non conversion-specifier part of format string */ + while (offset < parameters[i].beginOffset) + { + if (CHAR_IDENTIFIER == format[offset] && CHAR_IDENTIFIER == format[offset + 1]) + { + data->OutStream(data, CHAR_IDENTIFIER); + offset += 2; + } + else + { + data->OutStream(data, format[offset++]); + } + } + + /* Abort if we reached end of format string */ + if (parameters[i].type == FORMAT_SENTINEL) + break; + + /* Ouput parameter */ + flags = parameters[i].flags; + + /* Find width */ + width = parameters[i].width; + if (flags & FLAGS_WIDTH_PARAMETER) + { + /* Get width from parameter list */ + width = (int)parameters[width].data.number.as_signed; + if (width < 0) + { + /* + * A negative width is the same as the - flag and + * a positive width. + */ + flags |= FLAGS_LEFTADJUST; + flags &= ~FLAGS_NILPADDING; + width = -width; + } + } + + /* Find precision */ + if (flags & FLAGS_PRECISION) + { + precision = parameters[i].precision; + if (flags & FLAGS_PRECISION_PARAMETER) + { + /* Get precision from parameter list */ + precision = (int)parameters[precision].data.number.as_signed; + if (precision < 0) + { + /* + * A negative precision is the same as no + * precision + */ + precision = NO_PRECISION; + } + } + } + else + { + precision = NO_PRECISION; + } + + /* Find base */ + if (NO_BASE != parameters[i].baseSpecifier) + { + /* Base from specifier has priority */ + base = parameters[i].baseSpecifier; + } + else if (flags & FLAGS_BASE_PARAMETER) + { + /* Get base from parameter list */ + base = parameters[i].base; + base = (int)parameters[base].data.number.as_signed; + } + else + { + /* Use base from format string */ + base = parameters[i].base; + } + + switch (parameters[i].type) + { + case FORMAT_CHAR: +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + data->OutStream(data, CHAR_QUOTE); +#endif + if (! (flags & FLAGS_LEFTADJUST)) + { + while (--width > 0) + data->OutStream(data, CHAR_ADJUST); + } +#if TRIO_FEATURE_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + TrioWriteWideStringCharacter(data, + (trio_wchar_t)parameters[i].data.number.as_signed, + flags, + NO_WIDTH); + } + else +#endif + { + TrioWriteStringCharacter(data, + (int)parameters[i].data.number.as_signed, + flags); + } + + if (flags & FLAGS_LEFTADJUST) + { + while(--width > 0) + data->OutStream(data, CHAR_ADJUST); + } +#if TRIO_FEATURE_QUOTE + if (flags & FLAGS_QUOTE) + data->OutStream(data, CHAR_QUOTE); +#endif + + break; /* FORMAT_CHAR */ + + case FORMAT_INT: + TrioWriteNumber(data, + parameters[i].data.number.as_unsigned, + flags, + width, + precision, + base); + + break; /* FORMAT_INT */ + +#if TRIO_FEATURE_FLOAT + case FORMAT_DOUBLE: + TrioWriteDouble(data, + parameters[i].data.longdoubleNumber, + flags, + width, + precision, + base); + break; /* FORMAT_DOUBLE */ +#endif + + case FORMAT_STRING: +#if TRIO_FEATURE_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + TrioWriteWideString(data, + parameters[i].data.wstring, + flags, + width, + precision); + } + else +#endif + { + TrioWriteString(data, + parameters[i].data.string, + flags, + width, + precision); + } + break; /* FORMAT_STRING */ + + case FORMAT_POINTER: + { + trio_reference_t reference; + + reference.data = data; + reference.parameter = ¶meters[i]; + trio_print_pointer(&reference, parameters[i].data.pointer); + } + break; /* FORMAT_POINTER */ + + case FORMAT_COUNT: + pointer = parameters[i].data.pointer; + if (NULL != pointer) + { + /* + * C99 paragraph 7.19.6.1.8 says "the number of + * characters written to the output stream so far by + * this call", which is data->actually.committed + */ +#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER + if (flags & FLAGS_SIZE_T) + *(size_t *)pointer = (size_t)data->actually.committed; + else +#endif +#if TRIO_FEATURE_PTRDIFF_T + if (flags & FLAGS_PTRDIFF_T) + *(ptrdiff_t *)pointer = (ptrdiff_t)data->actually.committed; + else +#endif +#if TRIO_FEATURE_INTMAX_T + if (flags & FLAGS_INTMAX_T) + *(trio_intmax_t *)pointer = (trio_intmax_t)data->actually.committed; + else +#endif + if (flags & FLAGS_QUAD) + { + *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)data->actually.committed; + } + else if (flags & FLAGS_LONG) + { + *(long int *)pointer = (long int)data->actually.committed; + } + else if (flags & FLAGS_SHORT) + { + *(short int *)pointer = (short int)data->actually.committed; + } + else + { + *(int *)pointer = (int)data->actually.committed; + } + } + break; /* FORMAT_COUNT */ + + case FORMAT_PARAMETER: + break; /* FORMAT_PARAMETER */ + +#if TRIO_FEATURE_ERRNO + case FORMAT_ERRNO: + string = trio_error(parameters[i].data.errorNumber); + if (string) + { + TrioWriteString(data, + string, + flags, + width, + precision); + } + else + { + data->OutStream(data, '#'); + TrioWriteNumber(data, + (trio_uintmax_t)parameters[i].data.errorNumber, + flags, + width, + precision, + BASE_DECIMAL); + } + break; /* FORMAT_ERRNO */ +#endif /* TRIO_FEATURE_ERRNO */ + +#if TRIO_FEATURE_USER_DEFINED + case FORMAT_USER_DEFINED: + { + trio_reference_t reference; + trio_userdef_t *def = NULL; + + if (parameters[i].flags & FLAGS_USER_DEFINED_PARAMETER) + { + /* Use handle */ + if ((i > 0) || + (parameters[i - 1].type == FORMAT_PARAMETER)) + def = (trio_userdef_t *)parameters[i - 1].data.pointer; + } + else + { + /* Look up namespace */ + def = TrioFindNamespace(parameters[i].user_defined.namespace, NULL); + } + if (def) + { + reference.data = data; + reference.parameter = ¶meters[i]; + def->callback(&reference); + } + } + break; +#endif /* TRIO_FEATURE_USER_DEFINED */ + + default: + break; + } /* switch parameter type */ + + /* Prepare for next */ + offset = parameters[i].endOffset; + i++; + } + + return data->processed; +} + +/************************************************************************* + * TrioFormatRef + */ +#if TRIO_EXTENSION +TRIO_PRIVATE int +TrioFormatRef +TRIO_ARGS4((reference, format, arglist, argarray), + trio_reference_t *reference, + TRIO_CONST char *format, + va_list arglist, + trio_pointer_t *argarray) +{ + int status; + trio_parameter_t parameters[MAX_PARAMETERS]; + + status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); + if (status < 0) + return status; + + status = TrioFormatProcess(reference->data, format, parameters); + if (reference->data->error != 0) + { + status = reference->data->error; + } + return status; +} +#endif /* TRIO_EXTENSION */ + +/************************************************************************* + * TrioFormat + */ +TRIO_PRIVATE int +TrioFormat +TRIO_ARGS6((destination, destinationSize, OutStream, format, arglist, argarray), + trio_pointer_t destination, + size_t destinationSize, + void (*OutStream) TRIO_PROTO((trio_class_t *, int)), + TRIO_CONST char *format, + va_list arglist, + trio_pointer_t *argarray) +{ + int status; + trio_class_t data; + trio_parameter_t parameters[MAX_PARAMETERS]; + + assert(VALID(OutStream)); + assert(VALID(format)); + + memset(&data, 0, sizeof(data)); + data.OutStream = OutStream; + data.location = destination; + data.max = destinationSize; + data.error = 0; + +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + + status = TrioParse(TYPE_PRINT, format, parameters, arglist, argarray); + if (status < 0) + return status; + + status = TrioFormatProcess(&data, format, parameters); + if (data.error != 0) + { + status = data.error; + } + return status; +} + +/************************************************************************* + * TrioOutStreamFile + */ +#if TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO +TRIO_PRIVATE void +TrioOutStreamFile +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + FILE *file; + + assert(VALID(self)); + assert(VALID(self->location)); + + file = (FILE *)self->location; + self->processed++; + if (fputc(output, file) == EOF) + { + self->error = TRIO_ERROR_RETURN(TRIO_EOF, 0); + } + else + { + self->actually.committed++; + } +} +#endif /* TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO */ + +/************************************************************************* + * TrioOutStreamFileDescriptor + */ +#if TRIO_FEATURE_FD +TRIO_PRIVATE void +TrioOutStreamFileDescriptor +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + int fd; + char ch; + + assert(VALID(self)); + + fd = *((int *)self->location); + ch = (char)output; + self->processed++; + if (write(fd, &ch, sizeof(char)) == -1) + { + self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); + } + else + { + self->actually.committed++; + } +} +#endif /* TRIO_FEATURE_FD */ + +/************************************************************************* + * TrioOutStreamCustom + */ +#if TRIO_FEATURE_CLOSURE +TRIO_PRIVATE void +TrioOutStreamCustom +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + int status; + trio_custom_t *data; + + assert(VALID(self)); + assert(VALID(self->location)); + + data = (trio_custom_t *)self->location; + if (data->stream.out) + { + status = (data->stream.out)(data->closure, output); + if (status >= 0) + { + self->actually.committed++; + } + else + { + if (self->error == 0) + { + self->error = TRIO_ERROR_RETURN(TRIO_ECUSTOM, -status); + } + } + } + self->processed++; +} +#endif /* TRIO_FEATURE_CLOSURE */ + +/************************************************************************* + * TrioOutStreamString + */ +TRIO_PRIVATE void +TrioOutStreamString +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + char **buffer; + + assert(VALID(self)); + assert(VALID(self->location)); + + buffer = (char **)self->location; + **buffer = (char)output; + (*buffer)++; + self->processed++; + self->actually.committed++; +} + +/************************************************************************* + * TrioOutStreamStringMax + */ +TRIO_PRIVATE void +TrioOutStreamStringMax +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + char **buffer; + + assert(VALID(self)); + assert(VALID(self->location)); + + buffer = (char **)self->location; + + if (self->processed < self->max) + { + **buffer = (char)output; + (*buffer)++; + self->actually.committed++; + } + self->processed++; +} + +/************************************************************************* + * TrioOutStreamStringDynamic + */ +#if TRIO_FEATURE_DYNAMICSTRING +TRIO_PRIVATE void +TrioOutStreamStringDynamic +TRIO_ARGS2((self, output), + trio_class_t *self, + int output) +{ + assert(VALID(self)); + assert(VALID(self->location)); + + if (self->error == 0) + { + trio_xstring_append_char((trio_string_t *)self->location, + (char)output); + self->actually.committed++; + } + /* The processed variable must always be increased */ + self->processed++; +} +#endif /* TRIO_FEATURE_DYNAMICSTRING */ + +/************************************************************************* + * + * Formatted printing functions + * + ************************************************************************/ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_printf.h" +#endif +/** @addtogroup Printf + @{ +*/ + +/************************************************************************* + * printf + */ + +/** + Print to standard output stream. + + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_STDIO +TRIO_PUBLIC int +trio_printf +TRIO_VARGS2((format, va_alist), + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_STDIO */ + +/** + Print to standard output stream. + + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_STDIO +TRIO_PUBLIC int +trio_vprintf +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioFormat(stdout, 0, TrioOutStreamFile, format, args, NULL); +} +#endif /* TRIO_FEATURE_STDIO */ + +/** + Print to standard output stream. + + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_STDIO +TRIO_PUBLIC int +trio_printfv +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + trio_pointer_t * args) +{ + static va_list unused; + + assert(VALID(format)); + + return TrioFormat(stdout, 0, TrioOutStreamFile, format, unused, args); +} +#endif /* TRIO_FEATURE_STDIO */ + +/************************************************************************* + * fprintf + */ + +/** + Print to file. + + @param file File pointer. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_FILE +TRIO_PUBLIC int +trio_fprintf +TRIO_VARGS3((file, format, va_alist), + FILE *file, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(file)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_FILE */ + +/** + Print to file. + + @param file File pointer. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_FILE +TRIO_PUBLIC int +trio_vfprintf +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(file)); + assert(VALID(format)); + + return TrioFormat(file, 0, TrioOutStreamFile, format, args, NULL); +} +#endif /* TRIO_FEATURE_FILE */ + +/** + Print to file. + + @param file File pointer. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_FILE +TRIO_PUBLIC int +trio_fprintfv +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + trio_pointer_t * args) +{ + static va_list unused; + + assert(VALID(file)); + assert(VALID(format)); + + return TrioFormat(file, 0, TrioOutStreamFile, format, unused, args); +} +#endif /* TRIO_FEATURE_FILE */ + +/************************************************************************* + * dprintf + */ + +/** + Print to file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_FD +TRIO_PUBLIC int +trio_dprintf +TRIO_VARGS3((fd, format, va_alist), + int fd, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_FD */ + +/** + Print to file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_FD +TRIO_PUBLIC int +trio_vdprintf +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, args, NULL); +} +#endif /* TRIO_FEATURE_FD */ + +/** + Print to file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_FD +TRIO_PUBLIC int +trio_dprintfv +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + + assert(VALID(format)); + + return TrioFormat(&fd, 0, TrioOutStreamFileDescriptor, format, unused, args); +} +#endif /* TRIO_FEATURE_FD */ + +/************************************************************************* + * cprintf + */ +#if TRIO_FEATURE_CLOSURE +TRIO_PUBLIC int +trio_cprintf +TRIO_VARGS4((stream, closure, format, va_alist), + trio_outstream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + data.stream.out = stream; + data.closure = closure; + status = TrioFormat(&data, 0, TrioOutStreamCustom, format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_CLOSURE */ + +#if TRIO_FEATURE_CLOSURE +TRIO_PUBLIC int +trio_vcprintf +TRIO_ARGS4((stream, closure, format, args), + trio_outstream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + va_list args) +{ + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.out = stream; + data.closure = closure; + return TrioFormat(&data, 0, TrioOutStreamCustom, format, args, NULL); +} +#endif /* TRIO_FEATURE_CLOSURE */ + +#if TRIO_FEATURE_CLOSURE +TRIO_PUBLIC int +trio_cprintfv +TRIO_ARGS4((stream, closure, format, args), + trio_outstream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + void **args) +{ + static va_list unused; + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.out = stream; + data.closure = closure; + return TrioFormat(&data, 0, TrioOutStreamCustom, format, unused, args); +} +#endif /* TRIO_FEATURE_CLOSURE */ + +/************************************************************************* + * sprintf + */ + +/** + Print to string. + + @param buffer Output string. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_sprintf +TRIO_VARGS3((buffer, format, va_alist), + char *buffer, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(buffer)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL); + *buffer = NIL; /* Terminate with NIL character */ + TRIO_VA_END(args); + return status; +} + +/** + Print to string. + + @param buffer Output string. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vsprintf +TRIO_ARGS3((buffer, format, args), + char *buffer, + TRIO_CONST char *format, + va_list args) +{ + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, args, NULL); + *buffer = NIL; + return status; +} + +/** + Print to string. + + @param buffer Output string. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_sprintfv +TRIO_ARGS3((buffer, format, args), + char *buffer, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + int status; + + assert(VALID(buffer)); + assert(VALID(format)); + + status = TrioFormat(&buffer, 0, TrioOutStreamString, format, unused, args); + *buffer = NIL; + return status; +} + +/************************************************************************* + * snprintf + */ + +/** + Print at most @p max characters to string. + + @param buffer Output string. + @param max Maximum number of characters to print. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_snprintf +TRIO_VARGS4((buffer, max, format, va_alist), + char *buffer, + size_t max, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(buffer) || (max == 0)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, + TrioOutStreamStringMax, format, args, NULL); + if (max > 0) + *buffer = NIL; + TRIO_VA_END(args); + return status; +} + +/** + Print at most @p max characters to string. + + @param buffer Output string. + @param max Maximum number of characters to print. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_vsnprintf +TRIO_ARGS4((buffer, max, format, args), + char *buffer, + size_t max, + TRIO_CONST char *format, + va_list args) +{ + int status; + + assert(VALID(buffer) || (max == 0)); + assert(VALID(format)); + + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, + TrioOutStreamStringMax, format, args, NULL); + if (max > 0) + *buffer = NIL; + return status; +} + +/** + Print at most @p max characters to string. + + @param buffer Output string. + @param max Maximum number of characters to print. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +TRIO_PUBLIC int +trio_snprintfv +TRIO_ARGS4((buffer, max, format, args), + char *buffer, + size_t max, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + int status; + + assert(VALID(buffer) || (max == 0)); + assert(VALID(format)); + + status = TrioFormat(&buffer, max > 0 ? max - 1 : 0, + TrioOutStreamStringMax, format, unused, args); + if (max > 0) + *buffer = NIL; + return status; +} + +/************************************************************************* + * snprintfcat + * Appends the new string to the buffer string overwriting the '\0' + * character at the end of buffer. + */ +#if TRIO_EXTENSION +TRIO_PUBLIC int +trio_snprintfcat +TRIO_VARGS4((buffer, max, format, va_alist), + char *buffer, + size_t max, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + size_t buf_len; + + TRIO_VA_START(args, format); + + assert(VALID(buffer)); + assert(VALID(format)); + + buf_len = trio_length(buffer); + buffer = &buffer[buf_len]; + + status = TrioFormat(&buffer, max - 1 - buf_len, + TrioOutStreamStringMax, format, args, NULL); + TRIO_VA_END(args); + *buffer = NIL; + return status; +} +#endif + +#if TRIO_EXTENSION +TRIO_PUBLIC int +trio_vsnprintfcat +TRIO_ARGS4((buffer, max, format, args), + char *buffer, + size_t max, + TRIO_CONST char *format, + va_list args) +{ + int status; + size_t buf_len; + + assert(VALID(buffer)); + assert(VALID(format)); + + buf_len = trio_length(buffer); + buffer = &buffer[buf_len]; + status = TrioFormat(&buffer, max - 1 - buf_len, + TrioOutStreamStringMax, format, args, NULL); + *buffer = NIL; + return status; +} +#endif + +/************************************************************************* + * trio_aprintf + */ + +#if TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING +TRIO_PUBLIC char * +trio_aprintf +TRIO_VARGS2((format, va_alist), + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + va_list args; + trio_string_t *info; + char *result = NULL; + + assert(VALID(format)); + + info = trio_xstring_duplicate(""); + if (info) + { + TRIO_VA_START(args, format); + (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, args, NULL); + TRIO_VA_END(args); + + trio_string_terminate(info); + result = trio_string_extract(info); + trio_string_destroy(info); + } + return result; +} +#endif /* TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING */ + +#if TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING +TRIO_PUBLIC char * +trio_vaprintf +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + va_list args) +{ + trio_string_t *info; + char *result = NULL; + + assert(VALID(format)); + + info = trio_xstring_duplicate(""); + if (info) + { + (void)TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, args, NULL); + trio_string_terminate(info); + result = trio_string_extract(info); + trio_string_destroy(info); + } + return result; +} +#endif /* TRIO_DEPRECATED && TRIO_FEATURE_DYNAMICSTRING */ + +/** + Allocate and print to string. + The memory allocated and returned by @p result must be freed by the + calling application. + + @param result Output string. + @param format Formatting string. + @param ... Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_DYNAMICSTRING +TRIO_PUBLIC int +trio_asprintf +TRIO_VARGS3((result, format, va_alist), + char **result, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + va_list args; + int status; + trio_string_t *info; + + assert(VALID(format)); + + *result = NULL; + + info = trio_xstring_duplicate(""); + if (info == NULL) + { + status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); + } + else + { + TRIO_VA_START(args, format); + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, args, NULL); + TRIO_VA_END(args); + if (status >= 0) + { + trio_string_terminate(info); + *result = trio_string_extract(info); + } + trio_string_destroy(info); + } + return status; +} +#endif /* TRIO_FEATURE_DYNAMICSTRING */ + +/** + Allocate and print to string. + The memory allocated and returned by @p result must be freed by the + calling application. + + @param result Output string. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_DYNAMICSTRING +TRIO_PUBLIC int +trio_vasprintf +TRIO_ARGS3((result, format, args), + char **result, + TRIO_CONST char *format, + va_list args) +{ + int status; + trio_string_t *info; + + assert(VALID(format)); + + *result = NULL; + + info = trio_xstring_duplicate(""); + if (info == NULL) + { + status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); + } + else + { + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, args, NULL); + if (status >= 0) + { + trio_string_terminate(info); + *result = trio_string_extract(info); + } + trio_string_destroy(info); + } + return status; +} +#endif /* TRIO_FEATURE_DYNAMICSTRING */ + +/** + Allocate and print to string. + The memory allocated and returned by @p result must be freed by the + calling application. + + @param result Output string. + @param format Formatting string. + @param args Arguments. + @return Number of printed characters. + */ +#if TRIO_FEATURE_DYNAMICSTRING +TRIO_PUBLIC int +trio_asprintfv +TRIO_ARGS3((result, format, args), + char **result, + TRIO_CONST char *format, + trio_pointer_t * args) +{ + static va_list unused; + int status; + trio_string_t *info; + + assert(VALID(format)); + + *result = NULL; + + info = trio_xstring_duplicate(""); + if (info == NULL) + { + status = TRIO_ERROR_RETURN(TRIO_ENOMEM, 0); + } + else + { + status = TrioFormat(info, 0, TrioOutStreamStringDynamic, + format, unused, args); + if (status >= 0) + { + trio_string_terminate(info); + *result = trio_string_extract(info); + } + trio_string_destroy(info); + } + return status; +} +#endif /* TRIO_FEATURE_DYNAMICSTRING */ + +/** @} End of Printf documentation module */ + +/************************************************************************* + * + * CALLBACK + * + ************************************************************************/ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_register.h" +#endif +/** + @addtogroup UserDefined + @{ +*/ + +#if TRIO_FEATURE_USER_DEFINED + +/************************************************************************* + * trio_register + */ + +/** + Register new user-defined specifier. + + @param callback + @param name + @return Handle. + */ +TRIO_PUBLIC trio_pointer_t +trio_register +TRIO_ARGS2((callback, name), + trio_callback_t callback, + TRIO_CONST char *name) +{ + trio_userdef_t *def; + trio_userdef_t *prev = NULL; + + if (callback == NULL) + return NULL; + + if (name) + { + /* Handle built-in namespaces */ + if (name[0] == ':') + { + if (trio_equal(name, ":enter")) + { + internalEnterCriticalRegion = callback; + } + else if (trio_equal(name, ":leave")) + { + internalLeaveCriticalRegion = callback; + } + return NULL; + } + + /* Bail out if namespace is too long */ + if (trio_length(name) >= MAX_USER_NAME) + return NULL; + + /* Bail out if namespace already is registered */ + def = TrioFindNamespace(name, &prev); + if (def) + return NULL; + } + + def = (trio_userdef_t *)TRIO_MALLOC(sizeof(trio_userdef_t)); + if (def) + { + if (internalEnterCriticalRegion) + (void)internalEnterCriticalRegion(NULL); + + if (name) + { + /* Link into internal list */ + if (prev == NULL) + internalUserDef = def; + else + prev->next = def; + } + /* Initialize */ + def->callback = callback; + def->name = (name == NULL) + ? NULL + : trio_duplicate(name); + def->next = NULL; + + if (internalLeaveCriticalRegion) + (void)internalLeaveCriticalRegion(NULL); + } + return (trio_pointer_t)def; +} + +/** + Unregister an existing user-defined specifier. + + @param handle + */ +void +trio_unregister +TRIO_ARGS1((handle), + trio_pointer_t handle) +{ + trio_userdef_t *self = (trio_userdef_t *)handle; + trio_userdef_t *def; + trio_userdef_t *prev = NULL; + + assert(VALID(self)); + + if (self->name) + { + def = TrioFindNamespace(self->name, &prev); + if (def) + { + if (internalEnterCriticalRegion) + (void)internalEnterCriticalRegion(NULL); + + if (prev == NULL) + internalUserDef = internalUserDef->next; + else + prev->next = def->next; + + if (internalLeaveCriticalRegion) + (void)internalLeaveCriticalRegion(NULL); + } + trio_destroy(self->name); + } + TRIO_FREE(self); +} + +/************************************************************************* + * trio_get_format [public] + */ +TRIO_CONST char * +trio_get_format +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ +#if TRIO_FEATURE_USER_DEFINED + assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); +#endif + + return (((trio_reference_t *)ref)->parameter->user_data); +} + +/************************************************************************* + * trio_get_argument [public] + */ +/* Mednafen modification to fix a gcc warning */ +/*TRIO_CONST*/ trio_pointer_t +trio_get_argument +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ +#if TRIO_FEATURE_USER_DEFINED + assert(((trio_reference_t *)ref)->parameter->type == FORMAT_USER_DEFINED); +#endif + + return ((trio_reference_t *)ref)->parameter->data.pointer; +} + +/************************************************************************* + * trio_get_width / trio_set_width [public] + */ +int +trio_get_width +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return ((trio_reference_t *)ref)->parameter->width; +} + +void +trio_set_width +TRIO_ARGS2((ref, width), + trio_pointer_t ref, + int width) +{ + ((trio_reference_t *)ref)->parameter->width = width; +} + +/************************************************************************* + * trio_get_precision / trio_set_precision [public] + */ +int +trio_get_precision +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->precision); +} + +void +trio_set_precision +TRIO_ARGS2((ref, precision), + trio_pointer_t ref, + int precision) +{ + ((trio_reference_t *)ref)->parameter->precision = precision; +} + +/************************************************************************* + * trio_get_base / trio_set_base [public] + */ +int +trio_get_base +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->base); +} + +void +trio_set_base +TRIO_ARGS2((ref, base), + trio_pointer_t ref, + int base) +{ + ((trio_reference_t *)ref)->parameter->base = base; +} + +/************************************************************************* + * trio_get_long / trio_set_long [public] + */ +int +trio_get_long +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONG) + ? TRUE + : FALSE; +} + +void +trio_set_long +TRIO_ARGS2((ref, is_long), + trio_pointer_t ref, + int is_long) +{ + if (is_long) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONG; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONG; +} + +/************************************************************************* + * trio_get_longlong / trio_set_longlong [public] + */ +int +trio_get_longlong +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUAD) + ? TRUE + : FALSE; +} + +void +trio_set_longlong +TRIO_ARGS2((ref, is_longlong), + trio_pointer_t ref, + int is_longlong) +{ + if (is_longlong) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUAD; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUAD; +} + +/************************************************************************* + * trio_get_longdouble / trio_set_longdouble [public] + */ +# if TRIO_FEATURE_FLOAT +int +trio_get_longdouble +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LONGDOUBLE) + ? TRUE + : FALSE; +} + +void +trio_set_longdouble +TRIO_ARGS2((ref, is_longdouble), + trio_pointer_t ref, + int is_longdouble) +{ + if (is_longdouble) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LONGDOUBLE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LONGDOUBLE; +} +# endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * trio_get_short / trio_set_short [public] + */ +int +trio_get_short +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORT) + ? TRUE + : FALSE; +} + +void +trio_set_short +TRIO_ARGS2((ref, is_short), + trio_pointer_t ref, + int is_short) +{ + if (is_short) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORT; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORT; +} + +/************************************************************************* + * trio_get_shortshort / trio_set_shortshort [public] + */ +int +trio_get_shortshort +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHORTSHORT) + ? TRUE + : FALSE; +} + +void +trio_set_shortshort +TRIO_ARGS2((ref, is_shortshort), + trio_pointer_t ref, + int is_shortshort) +{ + if (is_shortshort) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHORTSHORT; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHORTSHORT; +} + +/************************************************************************* + * trio_get_alternative / trio_set_alternative [public] + */ +int +trio_get_alternative +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_ALTERNATIVE) + ? TRUE + : FALSE; +} + +void +trio_set_alternative +TRIO_ARGS2((ref, is_alternative), + trio_pointer_t ref, + int is_alternative) +{ + if (is_alternative) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_ALTERNATIVE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_ALTERNATIVE; +} + +/************************************************************************* + * trio_get_alignment / trio_set_alignment [public] + */ +int +trio_get_alignment +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_LEFTADJUST) + ? TRUE + : FALSE; +} + +void +trio_set_alignment +TRIO_ARGS2((ref, is_leftaligned), + trio_pointer_t ref, + int is_leftaligned) +{ + if (is_leftaligned) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_LEFTADJUST; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_LEFTADJUST; +} + +/************************************************************************* + * trio_get_spacing /trio_set_spacing [public] + */ +int +trio_get_spacing +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SPACE) + ? TRUE + : FALSE; +} + +void +trio_set_spacing +TRIO_ARGS2((ref, is_space), + trio_pointer_t ref, + int is_space) +{ + if (is_space) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SPACE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SPACE; +} + +/************************************************************************* + * trio_get_sign / trio_set_sign [public] + */ +int +trio_get_sign +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SHOWSIGN) + ? TRUE + : FALSE; +} + +void +trio_set_sign +TRIO_ARGS2((ref, is_sign), + trio_pointer_t ref, + int is_sign) +{ + if (is_sign) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SHOWSIGN; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SHOWSIGN; +} + +/************************************************************************* + * trio_get_padding / trio_set_padding [public] + */ +int +trio_get_padding +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_NILPADDING) + ? TRUE + : FALSE; +} + +void +trio_set_padding +TRIO_ARGS2((ref, is_padding), + trio_pointer_t ref, + int is_padding) +{ + if (is_padding) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_NILPADDING; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_NILPADDING; +} + +/************************************************************************* + * trio_get_quote / trio_set_quote [public] + */ +# if TRIO_FEATURE_QUOTE +int +trio_get_quote +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_QUOTE) + ? TRUE + : FALSE; +} + +void +trio_set_quote +TRIO_ARGS2((ref, is_quote), + trio_pointer_t ref, + int is_quote) +{ + if (is_quote) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_QUOTE; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_QUOTE; +} +#endif /* TRIO_FEATURE_QUOTE */ + +/************************************************************************* + * trio_get_upper / trio_set_upper [public] + */ +int +trio_get_upper +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_UPPER) + ? TRUE + : FALSE; +} + +void +trio_set_upper +TRIO_ARGS2((ref, is_upper), + trio_pointer_t ref, + int is_upper) +{ + if (is_upper) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_UPPER; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_UPPER; +} + +/************************************************************************* + * trio_get_largest / trio_set_largest [public] + */ +#if TRIO_FEATURE_INTMAX_T +int +trio_get_largest +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_INTMAX_T) + ? TRUE + : FALSE; +} + +void +trio_set_largest +TRIO_ARGS2((ref, is_largest), + trio_pointer_t ref, + int is_largest) +{ + if (is_largest) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_INTMAX_T; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_INTMAX_T; +} +#endif /* TRIO_FEATURE_INTMAX_T */ + +/************************************************************************* + * trio_get_ptrdiff / trio_set_ptrdiff [public] + */ +#if TRIO_FEATURE_PTRDIFF_T +int +trio_get_ptrdiff +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_PTRDIFF_T) + ? TRUE + : FALSE; +} + +void +trio_set_ptrdiff +TRIO_ARGS2((ref, is_ptrdiff), + trio_pointer_t ref, + int is_ptrdiff) +{ + if (is_ptrdiff) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_PTRDIFF_T; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_PTRDIFF_T; +} +#endif /* TRIO_FEATURE_PTRDIFF_T */ + +/************************************************************************* + * trio_get_size / trio_set_size [public] + */ +#if TRIO_FEATURE_SIZE_T +int +trio_get_size +TRIO_ARGS1((ref), + trio_pointer_t ref) +{ + return (((trio_reference_t *)ref)->parameter->flags & FLAGS_SIZE_T) + ? TRUE + : FALSE; +} + +void +trio_set_size +TRIO_ARGS2((ref, is_size), + trio_pointer_t ref, + int is_size) +{ + if (is_size) + ((trio_reference_t *)ref)->parameter->flags |= FLAGS_SIZE_T; + else + ((trio_reference_t *)ref)->parameter->flags &= ~FLAGS_SIZE_T; +} +#endif /* TRIO_FEATURE_SIZE_T */ + +/************************************************************************* + * trio_print_int [public] + */ +void +trio_print_int +TRIO_ARGS2((ref, number), + trio_pointer_t ref, + int number) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteNumber(self->data, + (trio_uintmax_t)number, + self->parameter->flags, + self->parameter->width, + self->parameter->precision, + self->parameter->base); +} + +/************************************************************************* + * trio_print_uint [public] + */ +void +trio_print_uint +TRIO_ARGS2((ref, number), + trio_pointer_t ref, + unsigned int number) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteNumber(self->data, + (trio_uintmax_t)number, + self->parameter->flags | FLAGS_UNSIGNED, + self->parameter->width, + self->parameter->precision, + self->parameter->base); +} + +/************************************************************************* + * trio_print_double [public] + */ +#if TRIO_FEATURE_FLOAT +void +trio_print_double +TRIO_ARGS2((ref, number), + trio_pointer_t ref, + double number) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteDouble(self->data, + number, + self->parameter->flags, + self->parameter->width, + self->parameter->precision, + self->parameter->base); +} +#endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * trio_print_string [public] + */ +void +trio_print_string +TRIO_ARGS2((ref, string), + trio_pointer_t ref, + TRIO_CONST char *string) +{ + trio_reference_t *self = (trio_reference_t *)ref; + + TrioWriteString(self->data, + string, + self->parameter->flags, + self->parameter->width, + self->parameter->precision); +} + +/************************************************************************* + * trio_print_ref [public] + */ +int +trio_print_ref +TRIO_VARGS3((ref, format, va_alist), + trio_pointer_t ref, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list arglist; + + assert(VALID(format)); + + TRIO_VA_START(arglist, format); + status = TrioFormatRef((trio_reference_t *)ref, format, arglist, NULL); + TRIO_VA_END(arglist); + return status; +} + +/************************************************************************* + * trio_vprint_ref [public] + */ +int +trio_vprint_ref +TRIO_ARGS3((ref, format, arglist), + trio_pointer_t ref, + TRIO_CONST char *format, + va_list arglist) +{ + assert(VALID(format)); + + return TrioFormatRef((trio_reference_t *)ref, format, arglist, NULL); +} + +/************************************************************************* + * trio_printv_ref [public] + */ +int +trio_printv_ref +TRIO_ARGS3((ref, format, argarray), + trio_pointer_t ref, + TRIO_CONST char *format, + trio_pointer_t *argarray) +{ + static va_list unused; + + assert(VALID(format)); + + return TrioFormatRef((trio_reference_t *)ref, format, unused, argarray); +} + +#endif + +/************************************************************************* + * trio_print_pointer [public] + */ +void +trio_print_pointer +TRIO_ARGS2((ref, pointer), + trio_pointer_t ref, + trio_pointer_t pointer) +{ + trio_reference_t *self = (trio_reference_t *)ref; + trio_flags_t flags; + trio_uintmax_t number; + + if (NULL == pointer) + { + TRIO_CONST char *string = internalNullString; + while (*string) + self->data->OutStream(self->data, *string++); + } + else + { + /* + * The subtraction of the null pointer is a workaround + * to avoid a compiler warning. The performance overhead + * is negligible (and likely to be removed by an + * optimizing compiler). The (char *) casting is done + * to please ANSI C++. + */ + number = (trio_uintmax_t)((char *)pointer - (char *)0); + /* Shrink to size of pointer */ + number &= (trio_uintmax_t)-1; + flags = self->parameter->flags; + flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | + FLAGS_NILPADDING); + TrioWriteNumber(self->data, + number, + flags, + POINTER_WIDTH, + NO_PRECISION, + BASE_HEX); + } +} + +/** @} End of UserDefined documentation module */ + +/************************************************************************* + * + * LOCALES + * + ************************************************************************/ + +/************************************************************************* + * trio_locale_set_decimal_point + * + * Decimal point can only be one character. The input argument is a + * string to enable multibyte characters. At most MB_LEN_MAX characters + * will be used. + */ +#if TRIO_FEATURE_LOCALE +TRIO_PUBLIC void +trio_locale_set_decimal_point +TRIO_ARGS1((decimalPoint), + char *decimalPoint) +{ +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + internalDecimalPointLength = trio_length(decimalPoint); + if (internalDecimalPointLength == 1) + { + internalDecimalPoint = *decimalPoint; + } + else + { + internalDecimalPoint = NIL; + trio_copy_max(internalDecimalPointString, + sizeof(internalDecimalPointString), + decimalPoint); + } +} +#endif + +/************************************************************************* + * trio_locale_set_thousand_separator + * + * See trio_locale_set_decimal_point + */ +#if TRIO_FEATURE_LOCALE || TRIO_EXTENSION +TRIO_PUBLIC void +trio_locale_set_thousand_separator +TRIO_ARGS1((thousandSeparator), + char *thousandSeparator) +{ +# if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +# endif + trio_copy_max(internalThousandSeparator, + sizeof(internalThousandSeparator), + thousandSeparator); + internalThousandSeparatorLength = trio_length(internalThousandSeparator); +} +#endif + +/************************************************************************* + * trio_locale_set_grouping + * + * Array of bytes. Reversed order. + * + * CHAR_MAX : No further grouping + * 0 : Repeat last group for the remaining digits (not necessary + * as C strings are zero-terminated) + * n : Set current group to n + * + * Same order as the grouping attribute in LC_NUMERIC. + */ +#if TRIO_FEATURE_LOCALE || TRIO_EXTENSION +TRIO_PUBLIC void +trio_locale_set_grouping +TRIO_ARGS1((grouping), + char *grouping) +{ +# if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +# endif + trio_copy_max(internalGrouping, + sizeof(internalGrouping), + grouping); +} +#endif + + +/************************************************************************* + * + * SCANNING + * + ************************************************************************/ + +#if TRIO_FEATURE_SCANF + +/************************************************************************* + * TrioSkipWhitespaces + */ +TRIO_PRIVATE int +TrioSkipWhitespaces +TRIO_ARGS1((self), + trio_class_t *self) +{ + int ch; + + ch = self->current; + while (isspace(ch)) + { + self->InStream(self, &ch); + } + return ch; +} + +/************************************************************************* + * TrioGetCollation + */ +#if TRIO_EXTENSION +TRIO_PRIVATE void +TrioGetCollation(TRIO_NOARGS) +{ + int i; + int j; + int k; + char first[2]; + char second[2]; + + /* This is computationally expensive */ + first[1] = NIL; + second[1] = NIL; + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + { + k = 0; + first[0] = (char)i; + for (j = 0; j < MAX_CHARACTER_CLASS; j++) + { + second[0] = (char)j; + if (trio_equal_locale(first, second)) + internalCollationArray[i][k++] = (char)j; + } + internalCollationArray[i][k] = NIL; + } +} +#endif + +/************************************************************************* + * TrioGetCharacterClass + * + * FIXME: + * multibyte + */ +TRIO_PRIVATE int +TrioGetCharacterClass +TRIO_ARGS4((format, offsetPointer, flagsPointer, characterclass), + TRIO_CONST char *format, + int *offsetPointer, + trio_flags_t *flagsPointer, + int *characterclass) +{ + int offset = *offsetPointer; + int i; + char ch; + char range_begin; + char range_end; + + *flagsPointer &= ~FLAGS_EXCLUDE; + + if (format[offset] == QUALIFIER_CIRCUMFLEX) + { + *flagsPointer |= FLAGS_EXCLUDE; + offset++; + } + /* + * If the ungroup character is at the beginning of the scanlist, + * it will be part of the class, and a second ungroup character + * must follow to end the group. + */ + if (format[offset] == SPECIFIER_UNGROUP) + { + characterclass[(int)SPECIFIER_UNGROUP]++; + offset++; + } + /* + * Minus is used to specify ranges. To include minus in the class, + * it must be at the beginning of the list + */ + if (format[offset] == QUALIFIER_MINUS) + { + characterclass[(int)QUALIFIER_MINUS]++; + offset++; + } + /* Collect characters */ + for (ch = format[offset]; + (ch != SPECIFIER_UNGROUP) && (ch != NIL); + ch = format[++offset]) + { + switch (ch) + { + case QUALIFIER_MINUS: /* Scanlist ranges */ + + /* + * Both C99 and UNIX98 describes ranges as implementation- + * defined. + * + * We support the following behaviour (although this may + * change as we become wiser) + * - only increasing ranges, ie. [a-b] but not [b-a] + * - transitive ranges, ie. [a-b-c] == [a-c] + * - trailing minus, ie. [a-] is interpreted as an 'a' + * and a '-' + * - duplicates (although we can easily convert these + * into errors) + */ + range_begin = format[offset - 1]; + range_end = format[++offset]; + if (range_end == SPECIFIER_UNGROUP) + { + /* Trailing minus is included */ + characterclass[(int)ch]++; + ch = range_end; + break; /* for */ + } + if (range_end == NIL) + return TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + if (range_begin > range_end) + return TRIO_ERROR_RETURN(TRIO_ERANGE, offset); + + for (i = (int)range_begin; i <= (int)range_end; i++) + characterclass[i]++; + + ch = range_end; + break; + +#if TRIO_EXTENSION + + case SPECIFIER_GROUP: + + switch (format[offset + 1]) + { + case QUALIFIER_DOT: /* Collating symbol */ + /* + * FIXME: This will be easier to implement when multibyte + * characters have been implemented. Until now, we ignore + * this feature. + */ + for (i = offset + 2; ; i++) + { + if (format[i] == NIL) + /* Error in syntax */ + return -1; + else if (format[i] == QUALIFIER_DOT) + break; /* for */ + } + if (format[++i] != SPECIFIER_UNGROUP) + return -1; + + offset = i; + break; + + case QUALIFIER_EQUAL: /* Equivalence class expressions */ + { + unsigned int j; + unsigned int k; + + if (internalCollationUnconverted) + { + /* Lazy evaluation of collation array */ + TrioGetCollation(); + internalCollationUnconverted = FALSE; + } + for (i = offset + 2; ; i++) + { + if (format[i] == NIL) + /* Error in syntax */ + return -1; + else if (format[i] == QUALIFIER_EQUAL) + break; /* for */ + else + { + /* Mark any equivalent character */ + k = (unsigned int)format[i]; + for (j = 0; internalCollationArray[k][j] != NIL; j++) + characterclass[(int)internalCollationArray[k][j]]++; + } + } + if (format[++i] != SPECIFIER_UNGROUP) + return -1; + + offset = i; + } + break; + + case QUALIFIER_COLON: /* Character class expressions */ + + if (trio_equal_max(CLASS_ALNUM, sizeof(CLASS_ALNUM) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isalnum(i)) + characterclass[i]++; + offset += sizeof(CLASS_ALNUM) - 1; + } + else if (trio_equal_max(CLASS_ALPHA, sizeof(CLASS_ALPHA) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isalpha(i)) + characterclass[i]++; + offset += sizeof(CLASS_ALPHA) - 1; + } + else if (trio_equal_max(CLASS_CNTRL, sizeof(CLASS_CNTRL) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (iscntrl(i)) + characterclass[i]++; + offset += sizeof(CLASS_CNTRL) - 1; + } + else if (trio_equal_max(CLASS_DIGIT, sizeof(CLASS_DIGIT) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isdigit(i)) + characterclass[i]++; + offset += sizeof(CLASS_DIGIT) - 1; + } + else if (trio_equal_max(CLASS_GRAPH, sizeof(CLASS_GRAPH) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isgraph(i)) + characterclass[i]++; + offset += sizeof(CLASS_GRAPH) - 1; + } + else if (trio_equal_max(CLASS_LOWER, sizeof(CLASS_LOWER) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (islower(i)) + characterclass[i]++; + offset += sizeof(CLASS_LOWER) - 1; + } + else if (trio_equal_max(CLASS_PRINT, sizeof(CLASS_PRINT) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isprint(i)) + characterclass[i]++; + offset += sizeof(CLASS_PRINT) - 1; + } + else if (trio_equal_max(CLASS_PUNCT, sizeof(CLASS_PUNCT) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (ispunct(i)) + characterclass[i]++; + offset += sizeof(CLASS_PUNCT) - 1; + } + else if (trio_equal_max(CLASS_SPACE, sizeof(CLASS_SPACE) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isspace(i)) + characterclass[i]++; + offset += sizeof(CLASS_SPACE) - 1; + } + else if (trio_equal_max(CLASS_UPPER, sizeof(CLASS_UPPER) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isupper(i)) + characterclass[i]++; + offset += sizeof(CLASS_UPPER) - 1; + } + else if (trio_equal_max(CLASS_XDIGIT, sizeof(CLASS_XDIGIT) - 1, + &format[offset])) + { + for (i = 0; i < MAX_CHARACTER_CLASS; i++) + if (isxdigit(i)) + characterclass[i]++; + offset += sizeof(CLASS_XDIGIT) - 1; + } + else + { + characterclass[(int)ch]++; + } + break; + + default: + characterclass[(int)ch]++; + break; + } + break; + +#endif /* TRIO_EXTENSION */ + + default: + characterclass[(int)ch]++; + break; + } + } + return 0; +} + +/************************************************************************* + * TrioReadNumber + * + * We implement our own number conversion in preference of strtol and + * strtoul, because we must handle 'long long' and thousand separators. + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadNumber +TRIO_ARGS5((self, target, flags, width, base), + trio_class_t *self, + trio_uintmax_t *target, + trio_flags_t flags, + int width, + int base) +{ + trio_uintmax_t number = 0; + int digit; + int count; + BOOLEAN_T isNegative = FALSE; + BOOLEAN_T gotNumber = FALSE; + int j; + + assert(VALID(self)); + assert(VALID(self->InStream)); + assert((base >= MIN_BASE && base <= MAX_BASE) || (base == NO_BASE)); + + if (internalDigitsUnconverted) + { + /* Lazy evaluation of digits array */ + memset(internalDigitArray, -1, sizeof(internalDigitArray)); + for (j = 0; j < (int)sizeof(internalDigitsLower) - 1; j++) + { + internalDigitArray[(int)internalDigitsLower[j]] = j; + internalDigitArray[(int)internalDigitsUpper[j]] = j; + } + internalDigitsUnconverted = FALSE; + } + + TrioSkipWhitespaces(self); + + /* Leading sign */ + if (self->current == '+') + { + self->InStream(self, NULL); + } + else if (self->current == '-') + { + self->InStream(self, NULL); + isNegative = TRUE; + } + + count = self->processed; + + if (flags & FLAGS_ALTERNATIVE) + { + switch (base) + { + case NO_BASE: + case BASE_OCTAL: + case BASE_HEX: + case BASE_BINARY: + if (self->current == '0') + { + self->InStream(self, NULL); + if (self->current) + { + if ((base == BASE_HEX) && + (trio_to_upper(self->current) == 'X')) + { + self->InStream(self, NULL); + } + else if ((base == BASE_BINARY) && + (trio_to_upper(self->current) == 'B')) + { + self->InStream(self, NULL); + } + } + } + else + return FALSE; + break; + default: + break; + } + } + + while (((width == NO_WIDTH) || (self->processed - count < width)) && + (! ((self->current == EOF) || isspace(self->current)))) + { + if (isascii(self->current)) + { + digit = internalDigitArray[self->current]; + /* Abort if digit is not allowed in the specified base */ + if ((digit == -1) || (digit >= base)) + break; + } +#if TRIO_FEATURE_QUOTE + else if (flags & FLAGS_QUOTE) + { + /* Compare with thousands separator */ + for (j = 0; internalThousandSeparator[j] && self->current; j++) + { + if (internalThousandSeparator[j] != self->current) + break; + + self->InStream(self, NULL); + } + if (internalThousandSeparator[j]) + break; /* Mismatch */ + else + continue; /* Match */ + } +#endif + else + break; + + number *= base; + number += digit; + gotNumber = TRUE; /* we need at least one digit */ + + self->InStream(self, NULL); + } + + /* Was anything read at all? */ + if (!gotNumber) + return FALSE; + + if (target) + *target = (isNegative) ? (trio_uintmax_t)(-((trio_intmax_t)number)) : number; + return TRUE; +} + +/************************************************************************* + * TrioReadChar + */ +TRIO_PRIVATE int +TrioReadChar +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + char *target, + trio_flags_t flags, + int width) +{ + int i; + char ch; + trio_uintmax_t number; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + for (i = 0; + (self->current != EOF) && (i < width); + i++) + { + ch = (char)self->current; + self->InStream(self, NULL); + if ((flags & FLAGS_ALTERNATIVE) && (ch == CHAR_BACKSLASH)) + { + switch (self->current) + { + case '\\': ch = '\\'; break; + case 'a': ch = '\007'; break; + case 'b': ch = '\b'; break; + case 'f': ch = '\f'; break; + case 'n': ch = '\n'; break; + case 'r': ch = '\r'; break; + case 't': ch = '\t'; break; + case 'v': ch = '\v'; break; + default: + if (isdigit(self->current)) + { + /* Read octal number */ + if (!TrioReadNumber(self, &number, 0, 3, BASE_OCTAL)) + return 0; + ch = (char)number; + } + else if (trio_to_upper(self->current) == 'X') + { + /* Read hexadecimal number */ + self->InStream(self, NULL); + if (!TrioReadNumber(self, &number, 0, 2, BASE_HEX)) + return 0; + ch = (char)number; + } + else + { + ch = (char)self->current; + } + break; + } + } + + if (target) + target[i] = ch; + } + return i + 1; +} + +/************************************************************************* + * TrioReadString + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadString +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + char *target, + trio_flags_t flags, + int width) +{ + int i; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + TrioSkipWhitespaces(self); + + /* + * Continue until end of string is reached, a whitespace is encountered, + * or width is exceeded + */ + for (i = 0; + ((width == NO_WIDTH) || (i < width)) && + (! ((self->current == EOF) || isspace(self->current))); + i++) + { + if (TrioReadChar(self, (target ? &target[i] : 0), flags, 1) == 0) + break; /* for */ + } + if (target) + target[i] = NIL; + return TRUE; +} + +/************************************************************************* + * TrioReadWideChar + */ +#if TRIO_FEATURE_WIDECHAR +TRIO_PRIVATE int +TrioReadWideChar +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + trio_wchar_t *target, + trio_flags_t flags, + int width) +{ + int i; + int j; + int size; + int amount = 0; + trio_wchar_t wch; + char buffer[MB_LEN_MAX + 1]; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + for (i = 0; + (self->current != EOF) && (i < width); + i++) + { + if (isascii(self->current)) + { + if (TrioReadChar(self, buffer, flags, 1) == 0) + return 0; + buffer[1] = NIL; + } + else + { + /* + * Collect a multibyte character, by enlarging buffer until + * it contains a fully legal multibyte character, or the + * buffer is full. + */ + j = 0; + do + { + buffer[j++] = (char)self->current; + buffer[j] = NIL; + self->InStream(self, NULL); + } + while ((j < (int)sizeof(buffer)) && (mblen(buffer, (size_t)j) != j)); + } + if (target) + { + size = mbtowc(&wch, buffer, sizeof(buffer)); + if (size > 0) + target[i] = wch; + } + amount += size; + self->InStream(self, NULL); + } + return amount; +} +#endif /* TRIO_FEATURE_WIDECHAR */ + +/************************************************************************* + * TrioReadWideString + */ +#if TRIO_FEATURE_WIDECHAR +TRIO_PRIVATE BOOLEAN_T +TrioReadWideString +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + trio_wchar_t *target, + trio_flags_t flags, + int width) +{ + int i; + int size; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + TrioSkipWhitespaces(self); + +#if defined(TRIO_COMPILER_SUPPORTS_MULTIBYTE) + /* Required by TrioReadWideChar */ + (void)mblen(NULL, 0); +#endif + + /* + * Continue until end of string is reached, a whitespace is encountered, + * or width is exceeded + */ + for (i = 0; + ((width == NO_WIDTH) || (i < width)) && + (! ((self->current == EOF) || isspace(self->current))); + ) + { + size = TrioReadWideChar(self, &target[i], flags, 1); + if (size == 0) + break; /* for */ + + i += size; + } + if (target) + target[i] = WCONST('\0'); + return TRUE; +} +#endif /* TRIO_FEATURE_WIDECHAR */ + +/************************************************************************* + * TrioReadGroup + * + * Reads non-empty character groups. + * + * FIXME: characterclass does not work with multibyte characters + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadGroup +TRIO_ARGS5((self, target, characterclass, flags, width), + trio_class_t *self, + char *target, + int *characterclass, + trio_flags_t flags, + int width) +{ + int ch; + int i; + + assert(VALID(self)); + assert(VALID(self->InStream)); + + ch = self->current; + for (i = 0; + ((width == NO_WIDTH) || (i < width)) && + (! ((ch == EOF) || + (((flags & FLAGS_EXCLUDE) != 0) ^ (characterclass[ch] == 0)))); + i++) + { + if (target) + target[i] = (char)ch; + self->InStream(self, &ch); + } + + if (i == 0) + return FALSE; + + /* Terminate the string if input saved */ + if (target) + target[i] = NIL; + return TRUE; +} + +/************************************************************************* + * TrioReadDouble + * + * FIXME: + * add long double + * handle base + */ +#if TRIO_FEATURE_FLOAT +TRIO_PRIVATE BOOLEAN_T +TrioReadDouble +TRIO_ARGS4((self, target, flags, width), + trio_class_t *self, + trio_pointer_t target, + trio_flags_t flags, + int width) +{ + int ch; + char doubleString[512]; + int offset = 0; + int start; +# if TRIO_FEATURE_QUOTE + int j; +# endif + BOOLEAN_T isHex = FALSE; + trio_long_double_t infinity; + + doubleString[0] = 0; + + if ((width == NO_WIDTH) || (width > (int)sizeof(doubleString) - 1)) + width = sizeof(doubleString) - 1; + + TrioSkipWhitespaces(self); + + /* + * Read entire double number from stream. trio_to_double requires + * a string as input, but InStream can be anything, so we have to + * collect all characters. + */ + ch = self->current; + if ((ch == '+') || (ch == '-')) + { + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + width--; + } + + start = offset; + switch (ch) + { + case 'n': + case 'N': + /* Not-a-number */ + if (offset != 0) + break; + /* FALLTHROUGH */ + case 'i': + case 'I': + /* Infinity */ + while (isalpha(ch) && (offset - start < width)) + { + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + } + doubleString[offset] = NIL; + + /* Case insensitive string comparison */ + if (trio_equal(&doubleString[start], INFINITE_UPPER) || + trio_equal(&doubleString[start], LONG_INFINITE_UPPER)) + { + infinity = ((start == 1) && (doubleString[0] == '-')) + ? trio_ninf() + : trio_pinf(); + if (flags & FLAGS_LONGDOUBLE) + { + *((trio_long_double_t *)target) = infinity; + } + else if (flags & FLAGS_LONG) + { + *((double *)target) = infinity; + } + else + { + *((float *)target) = infinity; + } + return TRUE; + } + if (trio_equal(doubleString, NAN_UPPER)) + { + /* NaN must not have a preceeding + nor - */ + if (flags & FLAGS_LONGDOUBLE) + { + *((trio_long_double_t *)target) = trio_nan(); + } + else if (flags & FLAGS_LONG) + { + *((double *)target) = trio_nan(); + } + else + { + *((float *)target) = trio_nan(); + } + return TRUE; + } + return FALSE; + + case '0': + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + if (trio_to_upper(ch) == 'X') + { + isHex = TRUE; + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + } + break; + + default: + break; + } + + while ((ch != EOF) && (offset - start < width)) + { + /* Integer part */ + if (isHex ? isxdigit(ch) : isdigit(ch)) + { + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + } +# if TRIO_FEATURE_QUOTE + else if (flags & FLAGS_QUOTE) + { + /* Compare with thousands separator */ + for (j = 0; internalThousandSeparator[j] && self->current; j++) + { + if (internalThousandSeparator[j] != self->current) + break; + + self->InStream(self, &ch); + } + if (internalThousandSeparator[j]) + break; /* Mismatch */ + else + continue; /* Match */ + } +# endif + else + break; /* while */ + } + if (ch == '.') + { + /* Decimal part */ + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + while ((isHex ? isxdigit(ch) : isdigit(ch)) && + (offset - start < width)) + { + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + } + } + if (isHex ? (trio_to_upper(ch) == 'P') : (trio_to_upper(ch) == 'E')) + { + /* Exponent */ + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + if ((ch == '+') || (ch == '-')) + { + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + } + while (isdigit(ch) && (offset - start < width)) + { + doubleString[offset++] = (char)ch; + self->InStream(self, &ch); + } + } + + if ((offset == start) || (*doubleString == NIL)) + return FALSE; + + doubleString[offset] = 0; + + if (flags & FLAGS_LONGDOUBLE) + { + *((trio_long_double_t *)target) = trio_to_long_double(doubleString, NULL); + } + else if (flags & FLAGS_LONG) + { + *((double *)target) = trio_to_double(doubleString, NULL); + } + else + { + *((float *)target) = trio_to_float(doubleString, NULL); + } + return TRUE; +} +#endif /* TRIO_FEATURE_FLOAT */ + +/************************************************************************* + * TrioReadPointer + */ +TRIO_PRIVATE BOOLEAN_T +TrioReadPointer +TRIO_ARGS3((self, target, flags), + trio_class_t *self, + trio_pointer_t *target, + trio_flags_t flags) +{ + trio_uintmax_t number; + char buffer[sizeof(internalNullString)]; + + flags |= (FLAGS_UNSIGNED | FLAGS_ALTERNATIVE | FLAGS_NILPADDING); + + if (TrioReadNumber(self, + &number, + flags, + POINTER_WIDTH, + BASE_HEX)) + { + if (target) + { +#if defined(TRIO_COMPILER_GCC) || defined(TRIO_COMPILER_MIPSPRO) + /* + * The strange assignment of number is a workaround for a compiler + * warning + */ + *target = &((char *)0)[number]; +#else + *target = (trio_pointer_t)number; +#endif + } + return TRUE; + } + else if (TrioReadString(self, + (flags & FLAGS_IGNORE) + ? NULL + : buffer, + 0, + sizeof(internalNullString) - 1)) + { + if (trio_equal_case(buffer, internalNullString)) + { + if (target) + *target = NULL; + return TRUE; + } + } + return FALSE; +} + +/************************************************************************* + * TrioScanProcess + */ +TRIO_PRIVATE int +TrioScanProcess +TRIO_ARGS3((data, format, parameters), + trio_class_t *data, + TRIO_CONST char *format, + trio_parameter_t *parameters) +{ + int status; + int assignment; + int ch; + int offset; /* Offset of format string */ + int i; /* Offset of current parameter */ + trio_flags_t flags; + int width; + int base; + trio_pointer_t pointer; + + /* Return on empty format string */ + if (format[0] == NIL) + return 0; + + status = 0; + assignment = 0; + i = 0; + offset = 0; + data->InStream(data, &ch); + + for (;;) + { + /* Skip the parameter entries */ + while (parameters[i].type == FORMAT_PARAMETER) + { + assert(i <= MAX_PARAMETERS); + i++; + } + + /* Compare non conversion-specifier part of format string */ + while (offset < parameters[i].beginOffset) + { + if ((CHAR_IDENTIFIER == format[offset]) && + (CHAR_IDENTIFIER == format[offset + 1])) + { + /* Two % in format matches one % in input stream */ + if (CHAR_IDENTIFIER == ch) + { + data->InStream(data, &ch); + offset += 2; + continue; /* while format chars left */ + } + else + { + status = TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + goto end; + } + } + else /* Not an % identifier */ + { + if (isspace((int)format[offset])) + { + /* Whitespaces may match any amount of whitespaces */ + ch = TrioSkipWhitespaces(data); + } + else if (ch == format[offset]) + { + data->InStream(data, &ch); + } + else + { + status = assignment; + goto end; + } + + offset++; + } + } + + if (parameters[i].type == FORMAT_SENTINEL) + break; + + if ((EOF == ch) && (parameters[i].type != FORMAT_COUNT)) + { + status = (assignment > 0) ? assignment : EOF; + goto end; + } + + flags = parameters[i].flags; + + /* Find width */ + width = parameters[i].width; + if (flags & FLAGS_WIDTH_PARAMETER) + { + /* Get width from parameter list */ + width = (int)parameters[width].data.number.as_signed; + } + + /* Find base */ + if (NO_BASE != parameters[i].baseSpecifier) + { + /* Base from specifier has priority */ + base = parameters[i].baseSpecifier; + } + else if (flags & FLAGS_BASE_PARAMETER) + { + /* Get base from parameter list */ + base = parameters[i].base; + base = (int)parameters[base].data.number.as_signed; + } + else + { + /* Use base from format string */ + base = parameters[i].base; + } + + switch (parameters[i].type) + { + case FORMAT_INT: + { + trio_uintmax_t number; + + if (0 == base) + base = BASE_DECIMAL; + + if (!TrioReadNumber(data, + &number, + flags, + width, + base)) + { + status = assignment; + goto end; + } + + if (!(flags & FLAGS_IGNORE)) + { + assignment++; + + pointer = parameters[i].data.pointer; +#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER + if (flags & FLAGS_SIZE_T) + *(size_t *)pointer = (size_t)number; + else +#endif +#if TRIO_FEATURE_PTRDIFF_T + if (flags & FLAGS_PTRDIFF_T) + *(ptrdiff_t *)pointer = (ptrdiff_t)number; + else +#endif +#if TRIO_FEATURE_INTMAX_T + if (flags & FLAGS_INTMAX_T) + *(trio_intmax_t *)pointer = (trio_intmax_t)number; + else +#endif + if (flags & FLAGS_QUAD) + *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)number; + else if (flags & FLAGS_LONG) + *(long int *)pointer = (long int)number; + else if (flags & FLAGS_SHORT) + *(short int *)pointer = (short int)number; + else + *(int *)pointer = (int)number; + } + } + break; /* FORMAT_INT */ + + case FORMAT_STRING: +#if TRIO_FEATURE_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + if (!TrioReadWideString(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.wstring, + flags, + width)) + { + status = assignment; + goto end; + } + } + else +#endif + { + if (!TrioReadString(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.string, + flags, + width)) + { + status = assignment; + goto end; + } + } + if (!(flags & FLAGS_IGNORE)) + assignment++; + break; /* FORMAT_STRING */ + +#if TRIO_FEATURE_FLOAT + case FORMAT_DOUBLE: + { + if (flags & FLAGS_IGNORE) + { + pointer = NULL; + } + else + { + pointer = (flags & FLAGS_LONGDOUBLE) + ? (trio_pointer_t)parameters[i].data.longdoublePointer + : (trio_pointer_t)parameters[i].data.doublePointer; + } + if (!TrioReadDouble(data, pointer, flags, width)) + { + status = assignment; + goto end; + } + if (!(flags & FLAGS_IGNORE)) + { + assignment++; + } + break; /* FORMAT_DOUBLE */ + } +#endif + + case FORMAT_GROUP: + { + int characterclass[MAX_CHARACTER_CLASS + 1]; + + /* Skip over modifiers */ + while (format[offset] != SPECIFIER_GROUP) + { + offset++; + } + /* Skip over group specifier */ + offset++; + + memset(characterclass, 0, sizeof(characterclass)); + status = TrioGetCharacterClass(format, + &offset, + &flags, + characterclass); + if (status < 0) + goto end; + + if (!TrioReadGroup(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.string, + characterclass, + flags, + parameters[i].width)) + { + status = assignment; + goto end; + } + if (!(flags & FLAGS_IGNORE)) + assignment++; + } + break; /* FORMAT_GROUP */ + + case FORMAT_COUNT: + pointer = parameters[i].data.pointer; + if (NULL != pointer) + { + int count = data->processed; + if (ch != EOF) + count--; /* a character is read, but is not consumed yet */ +#if TRIO_FEATURE_SIZE_T || TRIO_FEATURE_SIZE_T_UPPER + if (flags & FLAGS_SIZE_T) + *(size_t *)pointer = (size_t)count; + else +#endif +#if TRIO_FEATURE_PTRDIFF_T + if (flags & FLAGS_PTRDIFF_T) + *(ptrdiff_t *)pointer = (ptrdiff_t)count; + else +#endif +#if TRIO_FEATURE_INTMAX_T + if (flags & FLAGS_INTMAX_T) + *(trio_intmax_t *)pointer = (trio_intmax_t)count; + else +#endif + if (flags & FLAGS_QUAD) + { + *(trio_ulonglong_t *)pointer = (trio_ulonglong_t)count; + } + else if (flags & FLAGS_LONG) + { + *(long int *)pointer = (long int)count; + } + else if (flags & FLAGS_SHORT) + { + *(short int *)pointer = (short int)count; + } + else + { + *(int *)pointer = (int)count; + } + } + break; /* FORMAT_COUNT */ + + case FORMAT_CHAR: +#if TRIO_FEATURE_WIDECHAR + if (flags & FLAGS_WIDECHAR) + { + if (TrioReadWideChar(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.wstring, + flags, + (width == NO_WIDTH) ? 1 : width) == 0) + { + status = assignment; + goto end; + } + } + else +#endif + { + if (TrioReadChar(data, + (flags & FLAGS_IGNORE) + ? NULL + : parameters[i].data.string, + flags, + (width == NO_WIDTH) ? 1 : width) == 0) + { + status = assignment; + goto end; + } + } + if (!(flags & FLAGS_IGNORE)) + assignment++; + break; /* FORMAT_CHAR */ + + case FORMAT_POINTER: + if (!TrioReadPointer(data, + (flags & FLAGS_IGNORE) + ? NULL + : (trio_pointer_t *)parameters[i].data.pointer, + flags)) + { + status = assignment; + goto end; + } + if (!(flags & FLAGS_IGNORE)) + assignment++; + break; /* FORMAT_POINTER */ + + case FORMAT_PARAMETER: + break; /* FORMAT_PARAMETER */ + + default: + status = TRIO_ERROR_RETURN(TRIO_EINVAL, offset); + goto end; + } + + ch = data->current; + offset = parameters[i].endOffset; + i++; + } + + status = assignment; + end: + if (data->UndoStream) + data->UndoStream(data); + return status; +} + +/************************************************************************* + * TrioScan + */ +TRIO_PRIVATE int +TrioScan +TRIO_ARGS7((source, sourceSize, InStream, UndoStream, format, arglist, argarray), + trio_pointer_t source, + size_t sourceSize, + void (*InStream) TRIO_PROTO((trio_class_t *, int *)), + void (*UndoStream) TRIO_PROTO((trio_class_t *)), + TRIO_CONST char *format, + va_list arglist, + trio_pointer_t *argarray) +{ + int status; + trio_parameter_t parameters[MAX_PARAMETERS]; + trio_class_t data; + + assert(VALID(InStream)); + assert(VALID(format)); + + memset(&data, 0, sizeof(data)); + data.InStream = InStream; + data.UndoStream = UndoStream; + data.location = (trio_pointer_t)source; + data.max = sourceSize; + data.error = 0; + +#if defined(USE_LOCALE) + if (NULL == internalLocaleValues) + { + TrioSetLocale(); + } +#endif + + status = TrioParse(TYPE_SCAN, format, parameters, arglist, argarray); + if (status < 0) + return status; + + status = TrioScanProcess(&data, format, parameters); + if (data.error != 0) + { + status = data.error; + } + return status; +} + +/************************************************************************* + * TrioInStreamFile + */ +#if TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO +TRIO_PRIVATE void +TrioInStreamFile +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + FILE *file = (FILE *)self->location; + + assert(VALID(self)); + assert(VALID(file)); + + self->actually.cached = 0; + + /* The initial value of self->current is zero */ + if (self->current == EOF) + { + self->error = (ferror(file)) + ? TRIO_ERROR_RETURN(TRIO_ERRNO, 0) + : TRIO_ERROR_RETURN(TRIO_EOF, 0); + } + else + { + self->processed++; + self->actually.cached++; + } + + self->current = fgetc(file); + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} +#endif /* TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO */ + +/************************************************************************* + * TrioUndoStreamFile + */ +#if TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO +TRIO_PRIVATE void +TrioUndoStreamFile +TRIO_ARGS1((self), + trio_class_t *self) +{ + FILE *file = (FILE *)self->location; + + assert(VALID(self)); + assert(VALID(file)); + + if (self->actually.cached > 0) + { + assert(self->actually.cached == 1); + + self->current = ungetc(self->current, file); + self->actually.cached = 0; + } +} +#endif /* TRIO_FEATURE_FILE || TRIO_FEATURE_STDIO */ + +/************************************************************************* + * TrioInStreamFileDescriptor + */ +#if TRIO_FEATURE_FD +TRIO_PRIVATE void +TrioInStreamFileDescriptor +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + int fd = *((int *)self->location); + int size; + unsigned char input; + + assert(VALID(self)); + + self->actually.cached = 0; + + size = read(fd, &input, sizeof(char)); + if (size == -1) + { + self->error = TRIO_ERROR_RETURN(TRIO_ERRNO, 0); + self->current = EOF; + } + else + { + self->current = (size == 0) ? EOF : input; + } + if (self->current != EOF) + { + self->actually.cached++; + self->processed++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} +#endif /* TRIO_FEATURE_FD */ + +/************************************************************************* + * TrioInStreamCustom + */ +#if TRIO_FEATURE_CLOSURE +TRIO_PRIVATE void +TrioInStreamCustom +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + trio_custom_t *data; + + assert(VALID(self)); + assert(VALID(self->location)); + + self->actually.cached = 0; + + data = (trio_custom_t *)self->location; + + self->current = (data->stream.in == NULL) + ? NIL + : (data->stream.in)(data->closure); + + if (self->current == NIL) + { + self->current = EOF; + } + else + { + self->processed++; + self->actually.cached++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} +#endif /* TRIO_FEATURE_CLOSURE */ + +/************************************************************************* + * TrioInStreamString + */ +TRIO_PRIVATE void +TrioInStreamString +TRIO_ARGS2((self, intPointer), + trio_class_t *self, + int *intPointer) +{ + unsigned char **buffer; + + assert(VALID(self)); + assert(VALID(self->location)); + + self->actually.cached = 0; + + buffer = (unsigned char **)self->location; + self->current = (*buffer)[0]; + if (self->current == NIL) + { + self->current = EOF; + } + else + { + (*buffer)++; + self->processed++; + self->actually.cached++; + } + + if (VALID(intPointer)) + { + *intPointer = self->current; + } +} + +/************************************************************************* + * + * Formatted scanning functions + * + ************************************************************************/ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_scanf.h" +#endif +/** @addtogroup Scanf + @{ +*/ + +/************************************************************************* + * scanf + */ + +/** + Scan characters from standard input stream. + + @param format Formatting string. + @param ... Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_STDIO +TRIO_PUBLIC int +trio_scanf +TRIO_VARGS2((format, va_alist), + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, + TrioUndoStreamFile, + format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_STDIO */ + +/** + Scan characters from standard input stream. + + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_STDIO +TRIO_PUBLIC int +trio_vscanf +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, + TrioUndoStreamFile, + format, args, NULL); +} +#endif /* TRIO_FEATURE_STDIO */ + +/** + Scan characters from standard input stream. + + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_STDIO +TRIO_PUBLIC int +trio_scanfv +TRIO_ARGS2((format, args), + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + + assert(VALID(format)); + + return TrioScan((trio_pointer_t)stdin, 0, + TrioInStreamFile, + TrioUndoStreamFile, + format, unused, args); +} +#endif /* TRIO_FEATURE_STDIO */ + +/************************************************************************* + * fscanf + */ + +/** + Scan characters from file. + + @param file File pointer. + @param format Formatting string. + @param ... Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_FILE +TRIO_PUBLIC int +trio_fscanf +TRIO_VARGS3((file, format, va_alist), + FILE *file, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(file)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, + TrioUndoStreamFile, + format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_FILE */ + +/** + Scan characters from file. + + @param file File pointer. + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_FILE +TRIO_PUBLIC int +trio_vfscanf +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(file)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, + TrioUndoStreamFile, + format, args, NULL); +} +#endif /* TRIO_FEATURE_FILE */ + +/** + Scan characters from file. + + @param file File pointer. + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_FILE +TRIO_PUBLIC int +trio_fscanfv +TRIO_ARGS3((file, format, args), + FILE *file, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + + assert(VALID(file)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)file, 0, + TrioInStreamFile, + TrioUndoStreamFile, + format, unused, args); +} +#endif /* TRIO_FEATURE_FILE */ + +/************************************************************************* + * dscanf + */ + +/** + Scan characters from file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param ... Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_FD +TRIO_PUBLIC int +trio_dscanf +TRIO_VARGS3((fd, format, va_alist), + int fd, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, + NULL, + format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_FD */ + +/** + Scan characters from file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_FD +TRIO_PUBLIC int +trio_vdscanf +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, + NULL, + format, args, NULL); +} +#endif /* TRIO_FEATURE_FD */ + +/** + Scan characters from file descriptor. + + @param fd File descriptor. + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +#if TRIO_FEATURE_FD +TRIO_PUBLIC int +trio_dscanfv +TRIO_ARGS3((fd, format, args), + int fd, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&fd, 0, + TrioInStreamFileDescriptor, + NULL, + format, unused, args); +} +#endif /* TRIO_FEATURE_FD */ + +/************************************************************************* + * cscanf + */ +#if TRIO_FEATURE_CLOSURE +TRIO_PUBLIC int +trio_cscanf +TRIO_VARGS4((stream, closure, format, va_alist), + trio_instream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + data.stream.in = stream; + data.closure = closure; + status = TrioScan(&data, 0, TrioInStreamCustom, NULL, format, args, NULL); + TRIO_VA_END(args); + return status; +} +#endif /* TRIO_FEATURE_CLOSURE */ + +#if TRIO_FEATURE_CLOSURE +TRIO_PUBLIC int +trio_vcscanf +TRIO_ARGS4((stream, closure, format, args), + trio_instream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + va_list args) +{ + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.in = stream; + data.closure = closure; + return TrioScan(&data, 0, TrioInStreamCustom, NULL, format, args, NULL); +} +#endif /* TRIO_FEATURE_CLOSURE */ + +#if TRIO_FEATURE_CLOSURE +TRIO_PUBLIC int +trio_cscanfv +TRIO_ARGS4((stream, closure, format, args), + trio_instream_t stream, + trio_pointer_t closure, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + trio_custom_t data; + + assert(VALID(stream)); + assert(VALID(format)); + + data.stream.in = stream; + data.closure = closure; + return TrioScan(&data, 0, TrioInStreamCustom, NULL, format, unused, args); +} +#endif /* TRIO_FEATURE_CLOSURE */ + +/************************************************************************* + * sscanf + */ + +/** + Scan characters from string. + + @param buffer Input string. + @param format Formatting string. + @param ... Arguments. + @return Number of scanned characters. + */ +TRIO_PUBLIC int +trio_sscanf +TRIO_VARGS3((buffer, format, va_alist), + TRIO_CONST char *buffer, + TRIO_CONST char *format, + TRIO_VA_DECL) +{ + int status; + va_list args; + + assert(VALID(buffer)); + assert(VALID(format)); + + TRIO_VA_START(args, format); + status = TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, + NULL, + format, args, NULL); + TRIO_VA_END(args); + return status; +} + +/** + Scan characters from string. + + @param buffer Input string. + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +TRIO_PUBLIC int +trio_vsscanf +TRIO_ARGS3((buffer, format, args), + TRIO_CONST char *buffer, + TRIO_CONST char *format, + va_list args) +{ + assert(VALID(buffer)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, + NULL, + format, args, NULL); +} + +/** + Scan characters from string. + + @param buffer Input string. + @param format Formatting string. + @param args Arguments. + @return Number of scanned characters. + */ +TRIO_PUBLIC int +trio_sscanfv +TRIO_ARGS3((buffer, format, args), + TRIO_CONST char *buffer, + TRIO_CONST char *format, + trio_pointer_t *args) +{ + static va_list unused; + + assert(VALID(buffer)); + assert(VALID(format)); + + return TrioScan((trio_pointer_t)&buffer, 0, + TrioInStreamString, + NULL, + format, unused, args); +} + +#endif /* TRIO_FEATURE_SCANF */ + +/** @} End of Scanf documentation module */ + +/************************************************************************* + * trio_strerror + */ +TRIO_PUBLIC TRIO_CONST char * +trio_strerror +TRIO_ARGS1((errorcode), + int errorcode) +{ +#if TRIO_FEATURE_STRERR + /* Textual versions of the error codes */ + switch (TRIO_ERROR_CODE(errorcode)) + { + case TRIO_EOF: + return "End of file"; + case TRIO_EINVAL: + return "Invalid argument"; + case TRIO_ETOOMANY: + return "Too many arguments"; + case TRIO_EDBLREF: + return "Double reference"; + case TRIO_EGAP: + return "Reference gap"; + case TRIO_ENOMEM: + return "Out of memory"; + case TRIO_ERANGE: + return "Invalid range"; + case TRIO_ECUSTOM: + return "Custom error"; + default: + return "Unknown"; + } +#else + return "Unknown"; +#endif +} diff --git a/Mednafen/mednafen/trio/trionan.c b/Mednafen/mednafen/trio/trionan.c new file mode 100644 index 0000000000..cfb5a6b452 --- /dev/null +++ b/Mednafen/mednafen/trio/trionan.c @@ -0,0 +1,1257 @@ +/************************************************************************* + * + * $Id: trionan.c,v 1.33 2005/05/29 11:57:25 breese Exp $ + * + * Copyright (C) 2001 Bjorn Reese + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************ + * + * Functions to handle special quantities in floating-point numbers + * (that is, NaNs and infinity). They provide the capability to detect + * and fabricate special quantities. + * + * Although written to be as portable as possible, it can never be + * guaranteed to work on all platforms, as not all hardware supports + * special quantities. + * + * The approach used here (approximately) is to: + * + * 1. Use C99 functionality when available. + * 2. Use IEEE 754 bit-patterns if possible. + * 3. Use platform-specific techniques. + * + ************************************************************************/ + +/************************************************************************* + * Include files + */ +#include +#include + +#include +#include +#include +#if !defined(TRIO_PLATFORM_SYMBIAN) +# include +#endif +#if defined(TRIO_PLATFORM_UNIX) +# include +#endif +#if defined(TRIO_COMPILER_DECC) +# include +#endif +#include + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_nan.h" +#endif +/** @addtogroup SpecialQuantities + @{ +*/ + +/************************************************************************* + * Definitions + */ + +#if !defined(TRIO_PUBLIC_NAN) +# define TRIO_PUBLIC_NAN TRIO_PUBLIC +#endif +#if !defined(TRIO_PRIVATE_NAN) +# define TRIO_PRIVATE_NAN TRIO_PRIVATE +#endif + +#define TRIO_TRUE (1 == 1) +#define TRIO_FALSE (0 == 1) + +/* + * We must enable IEEE floating-point on Alpha + */ +#if defined(__alpha) && !defined(_IEEE_FP) +# if defined(TRIO_COMPILER_DECC) +# if defined(TRIO_PLATFORM_VMS) +# error "Must be compiled with option /IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE" +# else +# if !defined(_CFE) +# error "Must be compiled with option -ieee" +# endif +# endif +# else +# if defined(TRIO_COMPILER_GCC) +# error "Must be compiled with option -mieee" +# endif +# endif +#endif /* __alpha && ! _IEEE_FP */ + +/* + * In ANSI/IEEE 754-1985 64-bits double format numbers have the + * following properties (amoungst others) + * + * o FLT_RADIX == 2: binary encoding + * o DBL_MAX_EXP == 1024: 11 bits exponent, where one bit is used + * to indicate special numbers (e.g. NaN and Infinity), so the + * maximum exponent is 10 bits wide (2^10 == 1024). + * o DBL_MANT_DIG == 53: The mantissa is 52 bits wide, but because + * numbers are normalized the initial binary 1 is represented + * implicitly (the so-called "hidden bit"), which leaves us with + * the ability to represent 53 bits wide mantissa. + */ +#if defined(__STDC_IEC_559__) +# define TRIO_IEEE_754 +#else +# if (FLT_RADIX - 0 == 2) && (DBL_MAX_EXP - 0 == 1024) && (DBL_MANT_DIG - 0 == 53) +# define TRIO_IEEE_754 +# endif +#endif + +/* + * Determine which fpclassify_and_sign() function to use. + */ +#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT) +# if defined(PREDEF_STANDARD_C99) && defined(fpclassify) +# define TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT +# else +# if defined(TRIO_COMPILER_DECC) +# define TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT +# else +# if defined(TRIO_COMPILER_VISUALC) || defined(TRIO_COMPILER_BORLAND) +# define TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT +# else +# if defined(TRIO_COMPILER_HP) && defined(FP_PLUS_NORM) +# define TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT +# else +# if defined(TRIO_COMPILER_XLC) && defined(FP_PLUS_NORM) +# define TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT +# else +# define TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT +# endif +# endif +# endif +# endif +# endif +#endif + +/* + * Determine how to generate negative zero. + */ +#if defined(TRIO_FUNC_NZERO) +# if defined(TRIO_IEEE_754) +# define TRIO_NZERO_IEEE_754 +# else +# define TRIO_NZERO_FALLBACK +# endif +#endif + +/* + * Determine how to generate positive infinity. + */ +#if defined(TRIO_FUNC_PINF) +# if defined(INFINITY) && defined(__STDC_IEC_559__) +# define TRIO_PINF_C99_MACRO +# else +# if defined(TRIO_IEEE_754) +# define TRIO_PINF_IEEE_754 +# else +# define TRIO_PINF_FALLBACK +# endif +# endif +#endif + +/* + * Determine how to generate NaN. + */ +#if defined(TRIO_FUNC_NAN) +# if defined(PREDEF_STANDARD_C99) && !defined(TRIO_COMPILER_DECC) +# define TRIO_NAN_C99_FUNCTION +# else +# if defined(NAN) && defined(__STDC_IEC_559__) +# define TRIO_NAN_C99_MACRO +# else +# if defined(TRIO_IEEE_754) +# define TRIO_NAN_IEEE_754 +# else +# define TRIO_NAN_FALLBACK +# endif +# endif +# endif +#endif + +/* + * Resolve internal dependencies. + */ +#if defined(TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT) +# define TRIO_FUNC_INTERNAL_ISNAN +# define TRIO_FUNC_INTERNAL_ISINF +# if defined(TRIO_IEEE_754) +# define TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY +# define TRIO_FUNC_INTERNAL_IS_NEGATIVE +# endif +#endif + +#if defined(TRIO_NZERO_IEEE_754) \ + || defined(TRIO_PINF_IEEE_754) \ + || defined(TRIO_NAN_IEEE_754) +# define TRIO_FUNC_INTERNAL_MAKE_DOUBLE +#endif + +#if defined(TRIO_FUNC_INTERNAL_ISNAN) +# if defined(PREDEF_STANDARD_XPG3) +# define TRIO_INTERNAL_ISNAN_XPG3 +# else +# if defined(TRIO_IEEE_754) +# define TRIO_INTERNAL_ISNAN_IEEE_754 +# else +# define TRIO_INTERNAL_ISNAN_FALLBACK +# endif +# endif +#endif + +#if defined(TRIO_FUNC_INTERNAL_ISINF) +# if defined(TRIO_IEEE_754) +# define TRIO_INTERNAL_ISINF_IEEE_754 +# else +# define TRIO_INTERNAL_ISINF_FALLBACK +# endif +#endif + +/************************************************************************* + * Constants + */ + +#if !defined(TRIO_EMBED_NAN) +static TRIO_CONST char rcsid[] = "@(#)$Id: trionan.c,v 1.33 2005/05/29 11:57:25 breese Exp $"; +#endif + +#if defined(TRIO_FUNC_INTERNAL_MAKE_DOUBLE) \ + || defined(TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY) \ + || defined(TRIO_FUNC_INTERNAL_IS_NEGATIVE) +/* + * Endian-agnostic indexing macro. + * + * The value of internalEndianMagic, when converted into a 64-bit + * integer, becomes 0x0706050403020100 (we could have used a 64-bit + * integer value instead of a double, but not all platforms supports + * that type). The value is automatically encoded with the correct + * endianess by the compiler, which means that we can support any + * kind of endianess. The individual bytes are then used as an index + * for the IEEE 754 bit-patterns and masks. + */ +#define TRIO_DOUBLE_INDEX(x) (((unsigned char *)&internalEndianMagic)[7-(x)]) +static TRIO_CONST double internalEndianMagic = 7.949928895127363e-275; +#endif + +#if defined(TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY) +/* Mask for the exponent */ +static TRIO_CONST unsigned char ieee_754_exponent_mask[] = { + 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* Mask for the mantissa */ +static TRIO_CONST unsigned char ieee_754_mantissa_mask[] = { + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; +#endif + +#if defined(TRIO_FUNC_INTERNAL_IS_NEGATIVE) +/* Mask for the sign bit */ +static TRIO_CONST unsigned char ieee_754_sign_mask[] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif + +#if defined(TRIO_NZERO_IEEE_754) +/* Bit-pattern for negative zero */ +static TRIO_CONST unsigned char ieee_754_negzero_array[] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif + +#if defined(TRIO_PINF_IEEE_754) +/* Bit-pattern for infinity */ +static TRIO_CONST unsigned char ieee_754_infinity_array[] = { + 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif + +#if defined(TRIO_NAN_IEEE_754) +/* Bit-pattern for quiet NaN */ +static TRIO_CONST unsigned char ieee_754_qnan_array[] = { + 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif + + +/************************************************************************* + * Internal functions + */ + +/* + * internal_make_double + */ +#if defined(TRIO_FUNC_INTERNAL_MAKE_DOUBLE) + +TRIO_PRIVATE_NAN double +internal_make_double +TRIO_ARGS1((values), + TRIO_CONST unsigned char *values) +{ + TRIO_VOLATILE double result; + int i; + + for (i = 0; i < (int)sizeof(double); i++) { + ((TRIO_VOLATILE unsigned char *)&result)[TRIO_DOUBLE_INDEX(i)] = values[i]; + } + return result; +} + +#endif + +/* + * internal_is_special_quantity + */ +#if defined(TRIO_FUNC_INTERNAL_IS_SPECIAL_QUANTITY) + +TRIO_PRIVATE_NAN int +internal_is_special_quantity +TRIO_ARGS2((number, has_mantissa), + double number, + int *has_mantissa) +{ + unsigned int i; + unsigned char current; + int is_special_quantity = TRIO_TRUE; + + *has_mantissa = 0; + + for (i = 0; i < (unsigned int)sizeof(double); i++) { + current = ((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)]; + is_special_quantity + &= ((current & ieee_754_exponent_mask[i]) == ieee_754_exponent_mask[i]); + *has_mantissa |= (current & ieee_754_mantissa_mask[i]); + } + return is_special_quantity; +} + +#endif + +/* + * internal_is_negative + */ +#if defined(TRIO_FUNC_INTERNAL_IS_NEGATIVE) + +TRIO_PRIVATE_NAN int +internal_is_negative +TRIO_ARGS1((number), + double number) +{ + unsigned int i; + int is_negative = TRIO_FALSE; + + for (i = 0; i < (unsigned int)sizeof(double); i++) { + is_negative |= (((unsigned char *)&number)[TRIO_DOUBLE_INDEX(i)] + & ieee_754_sign_mask[i]); + } + return is_negative; +} + +#endif + +#if defined(TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT) + +TRIO_PRIVATE_NAN TRIO_INLINE int +c99_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ + *is_negative = signbit(number); + switch (fpclassify(number)) { + case FP_NAN: + return TRIO_FP_NAN; + case FP_INFINITE: + return TRIO_FP_INFINITE; + case FP_SUBNORMAL: + return TRIO_FP_SUBNORMAL; + case FP_ZERO: + return TRIO_FP_ZERO; + default: + return TRIO_FP_NORMAL; + } +} + +#endif /* TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT */ + +#if defined(TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT) + +TRIO_PRIVATE_NAN TRIO_INLINE int +decc_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ + switch (fp_class(number)) { + case FP_QNAN: + case FP_SNAN: + *is_negative = TRIO_FALSE; /* NaN has no sign */ + return TRIO_FP_NAN; + case FP_POS_INF: + *is_negative = TRIO_FALSE; + return TRIO_FP_INFINITE; + case FP_NEG_INF: + *is_negative = TRIO_TRUE; + return TRIO_FP_INFINITE; + case FP_POS_DENORM: + *is_negative = TRIO_FALSE; + return TRIO_FP_SUBNORMAL; + case FP_NEG_DENORM: + *is_negative = TRIO_TRUE; + return TRIO_FP_SUBNORMAL; + case FP_POS_ZERO: + *is_negative = TRIO_FALSE; + return TRIO_FP_ZERO; + case FP_NEG_ZERO: + *is_negative = TRIO_TRUE; + return TRIO_FP_ZERO; + case FP_POS_NORM: + *is_negative = TRIO_FALSE; + return TRIO_FP_NORMAL; + case FP_NEG_NORM: + *is_negative = TRIO_TRUE; + return TRIO_FP_NORMAL; + default: + *is_negative = (number < 0.0); + return TRIO_FP_NORMAL; + } +} + +#endif /* TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT */ + +#if defined(TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT) + +TRIO_PRIVATE_NAN int +ms_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ + int result; +# if defined(TRIO_COMPILER_BORLAND) + /* + * The floating-point precision may be changed by the Borland _fpclass() + * function, so we have to save and restore the floating-point control mask. + */ + unsigned int mask; + /* Remember the old mask */ + mask = _control87(0, 0); +# endif + + switch (_fpclass(number)) { + case _FPCLASS_QNAN: + case _FPCLASS_SNAN: + *is_negative = TRIO_FALSE; /* NaN has no sign */ + result = TRIO_FP_NAN; + break; + case _FPCLASS_PINF: + *is_negative = TRIO_FALSE; + result = TRIO_FP_INFINITE; + break; + case _FPCLASS_NINF: + *is_negative = TRIO_TRUE; + result = TRIO_FP_INFINITE; + break; + case _FPCLASS_PD: + *is_negative = TRIO_FALSE; + result = TRIO_FP_SUBNORMAL; + break; + case _FPCLASS_ND: + *is_negative = TRIO_TRUE; + result = TRIO_FP_SUBNORMAL; + break; + case _FPCLASS_PZ: + *is_negative = TRIO_FALSE; + result = TRIO_FP_ZERO; + break; + case _FPCLASS_NZ: + *is_negative = TRIO_TRUE; + result = TRIO_FP_ZERO; + break; + case _FPCLASS_PN: + *is_negative = TRIO_FALSE; + result = TRIO_FP_NORMAL; + break; + case _FPCLASS_NN: + *is_negative = TRIO_TRUE; + result = TRIO_FP_NORMAL; + break; + default: + *is_negative = (number < 0.0); + result = TRIO_FP_NORMAL; + break; + } + +# if defined(TRIO_COMPILER_BORLAND) + /* Restore the old precision */ + (void)_control87(mask, MCW_PC); +# endif + + return result; +} + +#endif /* TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT */ + +#if defined(TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT) + +TRIO_PRIVATE_NAN TRIO_INLINE int +hp_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ + /* + * HP-UX 9.x and 10.x have an fpclassify() function, that is different + * from the C99 fpclassify() macro supported on HP-UX 11.x. + */ + switch (fpclassify(number)) { + case FP_QNAN: + case FP_SNAN: + *is_negative = TRIO_FALSE; /* NaN has no sign */ + return TRIO_FP_NAN; + case FP_PLUS_INF: + *is_negative = TRIO_FALSE; + return TRIO_FP_INFINITE; + case FP_MINUS_INF: + *is_negative = TRIO_TRUE; + return TRIO_FP_INFINITE; + case FP_PLUS_DENORM: + *is_negative = TRIO_FALSE; + return TRIO_FP_SUBNORMAL; + case FP_MINUS_DENORM: + *is_negative = TRIO_TRUE; + return TRIO_FP_SUBNORMAL; + case FP_PLUS_ZERO: + *is_negative = TRIO_FALSE; + return TRIO_FP_ZERO; + case FP_MINUS_ZERO: + *is_negative = TRIO_TRUE; + return TRIO_FP_ZERO; + case FP_PLUS_NORM: + *is_negative = TRIO_FALSE; + return TRIO_FP_NORMAL; + case FP_MINUS_NORM: + *is_negative = TRIO_TRUE; + return TRIO_FP_NORMAL; + default: + *is_negative = (number < 0.0); + return TRIO_FP_NORMAL; + } +} + +#endif /* TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT */ + +#if defined(TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT) + +TRIO_PRIVATE_NAN TRIO_INLINE int +xlc_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ + /* + * AIX has class() for C, and _class() for C++ + */ +# if defined(__cplusplus) +# define AIX_CLASS(n) _class(n) +# else +# define AIX_CLASS(n) class(n) +# endif + + switch (AIX_CLASS(number)) { + case FP_QNAN: + case FP_SNAN: + *is_negative = TRIO_FALSE; /* NaN has no sign */ + return TRIO_FP_NAN; + case FP_PLUS_INF: + *is_negative = TRIO_FALSE; + return TRIO_FP_INFINITE; + case FP_MINUS_INF: + *is_negative = TRIO_TRUE; + return TRIO_FP_INFINITE; + case FP_PLUS_DENORM: + *is_negative = TRIO_FALSE; + return TRIO_FP_SUBNORMAL; + case FP_MINUS_DENORM: + *is_negative = TRIO_TRUE; + return TRIO_FP_SUBNORMAL; + case FP_PLUS_ZERO: + *is_negative = TRIO_FALSE; + return TRIO_FP_ZERO; + case FP_MINUS_ZERO: + *is_negative = TRIO_TRUE; + return TRIO_FP_ZERO; + case FP_PLUS_NORM: + *is_negative = TRIO_FALSE; + return TRIO_FP_NORMAL; + case FP_MINUS_NORM: + *is_negative = TRIO_TRUE; + return TRIO_FP_NORMAL; + default: + *is_negative = (number < 0.0); + return TRIO_FP_NORMAL; + } +} + +#endif /* TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT */ + +#if defined(TRIO_FUNC_INTERNAL_ISNAN) + +TRIO_PRIVATE_NAN TRIO_INLINE int +internal_isnan +TRIO_ARGS1((number), + double number) +{ +# if defined(TRIO_INTERNAL_ISNAN_XPG3) || defined(TRIO_PLATFORM_SYMBIAN) + /* + * XPG3 defines isnan() as a function. + */ + return isnan(number); + +# endif + +# if defined(TRIO_INTERNAL_ISNAN_IEEE_754) + + /* + * Examine IEEE 754 bit-pattern. A NaN must have a special exponent + * pattern, and a non-empty mantissa. + */ + int has_mantissa; + int is_special_quantity; + + is_special_quantity = internal_is_special_quantity(number, &has_mantissa); + + return (is_special_quantity && has_mantissa); + +# endif + +# if defined(TRIO_INTERNAL_ISNAN_FALLBACK) + + /* + * Fallback solution + */ + int status; + double integral, fraction; + +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + status = (/* + * NaN is the only number which does not compare to itself + */ + ((TRIO_VOLATILE double)number != (TRIO_VOLATILE double)number) || + /* + * Fallback solution if NaN compares to NaN + */ + ((number != 0.0) && + (fraction = modf(number, &integral), + integral == fraction))); + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + + return status; + +# endif +} + +#endif /* TRIO_FUNC_INTERNAL_ISNAN */ + +#if defined(TRIO_FUNC_INTERNAL_ISINF) + +TRIO_PRIVATE_NAN TRIO_INLINE int +internal_isinf +TRIO_ARGS1((number), + double number) +{ +# if defined(TRIO_PLATFORM_SYMBIAN) + + return isinf(number); + +# endif + +# if defined(TRIO_INTERNAL_ISINF_IEEE_754) + /* + * Examine IEEE 754 bit-pattern. Infinity must have a special exponent + * pattern, and an empty mantissa. + */ + int has_mantissa; + int is_special_quantity; + + is_special_quantity = internal_is_special_quantity(number, &has_mantissa); + + return (is_special_quantity && !has_mantissa) + ? ((number < 0.0) ? -1 : 1) + : 0; + +# endif + +# if defined(TRIO_INTERNAL_ISINF_FALLBACK) + + /* + * Fallback solution. + */ + int status; + +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + double infinity = trio_pinf(); + + status = ((number == infinity) + ? 1 + : ((number == -infinity) ? -1 : 0)); + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + + return status; + +# endif +} + +#endif /* TRIO_FUNC_INTERNAL_ISINF */ + +/************************************************************************* + * Public functions + */ + +#if defined(TRIO_FUNC_FPCLASSIFY_AND_SIGNBIT) + +TRIO_PUBLIC_NAN int +trio_fpclassify_and_signbit +TRIO_ARGS2((number, is_negative), + double number, + int *is_negative) +{ + /* The TRIO_FUNC_xxx_FPCLASSIFY_AND_SIGNBIT macros are mutually exclusive */ + +#if defined(TRIO_FUNC_C99_FPCLASSIFY_AND_SIGNBIT) + + return c99_fpclassify_and_signbit(number, is_negative); + +#endif + +#if defined(TRIO_FUNC_DECC_FPCLASSIFY_AND_SIGNBIT) + + return decc_fpclassify_and_signbit(number, is_negative); + +#endif + +#if defined(TRIO_FUNC_MS_FPCLASSIFY_AND_SIGNBIT) + + return ms_fpclassify_and_signbit(number, is_negative); + +#endif + +#if defined(TRIO_FUNC_HP_FPCLASSIFY_AND_SIGNBIT) + + return hp_fpclassify_and_signbit(number, is_negative); + +#endif + +#if defined(TRIO_FUNC_XLC_FPCLASSIFY_AND_SIGNBIT) + + return xlc_fpclassify_and_signbit(number, is_negative); + +#endif + +#if defined(TRIO_FUNC_INTERNAL_FPCLASSIFY_AND_SIGNBIT) + + /* + * Fallback solution. + */ + int rc; + + if (number == 0.0) { + /* + * In IEEE 754 the sign of zero is ignored in comparisons, so we + * have to handle this as a special case by examining the sign bit + * directly. + */ +# if defined(TRIO_IEEE_754) + *is_negative = internal_is_negative(number); +# else + *is_negative = TRIO_FALSE; /* FIXME */ +# endif + return TRIO_FP_ZERO; + } + if (internal_isnan(number)) { + *is_negative = TRIO_FALSE; + return TRIO_FP_NAN; + } + rc = internal_isinf(number); + if (rc != 0) { + *is_negative = (rc == -1); + return TRIO_FP_INFINITE; + } + if ((number > 0.0) && (number < DBL_MIN)) { + *is_negative = TRIO_FALSE; + return TRIO_FP_SUBNORMAL; + } + if ((number < 0.0) && (number > -DBL_MIN)) { + *is_negative = TRIO_TRUE; + return TRIO_FP_SUBNORMAL; + } + *is_negative = (number < 0.0); + return TRIO_FP_NORMAL; + +#endif +} + +#endif + +/** + Check for NaN. + + @param number An arbitrary floating-point number. + @return Boolean value indicating whether or not the number is a NaN. +*/ +#if defined(TRIO_FUNC_ISNAN) + +TRIO_PUBLIC_NAN int +trio_isnan +TRIO_ARGS1((number), + double number) +{ + int dummy; + + return (trio_fpclassify_and_signbit(number, &dummy) == TRIO_FP_NAN); +} + +#endif + +/** + Check for infinity. + + @param number An arbitrary floating-point number. + @return 1 if positive infinity, -1 if negative infinity, 0 otherwise. +*/ +#if defined(TRIO_FUNC_ISINF) + +TRIO_PUBLIC_NAN int +trio_isinf +TRIO_ARGS1((number), + double number) +{ + int is_negative; + + if (trio_fpclassify_and_signbit(number, &is_negative) == TRIO_FP_INFINITE) + { + return (is_negative) ? -1 : 1; + } + else + { + return 0; + } +} + +#endif + +/** + Check for finity. + + @param number An arbitrary floating-point number. + @return Boolean value indicating whether or not the number is a finite. +*/ +#if defined(TRIO_FUNC_ISFINITE) + +TRIO_PUBLIC_NAN int +trio_isfinite +TRIO_ARGS1((number), + double number) +{ + int dummy; + + switch (trio_fpclassify_and_signbit(number, &dummy)) + { + case TRIO_FP_INFINITE: + case TRIO_FP_NAN: + return 0; + default: + return 1; + } +} + +#endif + +/** + Examine the sign of a number. + + @param number An arbitrary floating-point number. + @return Boolean value indicating whether or not the number has the + sign bit set (i.e. is negative). +*/ +#if defined(TRIO_FUNC_SIGNBIT) + +TRIO_PUBLIC_NAN int +trio_signbit +TRIO_ARGS1((number), + double number) +{ + int is_negative; + + (void)trio_fpclassify_and_signbit(number, &is_negative); + return is_negative; +} + +#endif + +/** + Examine the class of a number. + + @param number An arbitrary floating-point number. + @return Enumerable value indicating the class of @p number +*/ +#if defined(TRIO_FUNC_FPCLASSIFY) + +TRIO_PUBLIC_NAN int +trio_fpclassify +TRIO_ARGS1((number), + double number) +{ + int dummy; + + return trio_fpclassify_and_signbit(number, &dummy); +} + +#endif + +/** + Generate negative zero. + + @return Floating-point representation of negative zero. +*/ +#if defined(TRIO_FUNC_NZERO) + +TRIO_PUBLIC_NAN double +trio_nzero(TRIO_NOARGS) +{ +# if defined(TRIO_NZERO_IEEE_754) + + return internal_make_double(ieee_754_negzero_array); + +# endif + +# if defined(TRIO_NZERO_FALLBACK) + + TRIO_VOLATILE double zero = 0.0; + + return -zero; + +# endif +} + +#endif + +/** + Generate positive infinity. + + @return Floating-point representation of positive infinity. +*/ +#if defined(TRIO_FUNC_PINF) + +TRIO_PUBLIC_NAN double +trio_pinf(TRIO_NOARGS) +{ + /* Cache the result */ + static double pinf_value = 0.0; + + if (pinf_value == 0.0) { + +# if defined(TRIO_PINF_C99_MACRO) + + pinf_value = (double)INFINITY; + +# endif + +# if defined(TRIO_PINF_IEEE_754) + + pinf_value = internal_make_double(ieee_754_infinity_array); + +# endif + +# if defined(TRIO_PINF_FALLBACK) + /* + * If HUGE_VAL is different from DBL_MAX, then HUGE_VAL is used + * as infinity. Otherwise we have to resort to an overflow + * operation to generate infinity. + */ +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + pinf_value = HUGE_VAL; + if (HUGE_VAL == DBL_MAX) { + /* Force overflow */ + pinf_value += HUGE_VAL; + } + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + +# endif + } + return pinf_value; +} + +#endif + +/** + Generate negative infinity. + + @return Floating-point value of negative infinity. +*/ +#if defined(TRIO_FUNC_NINF) + +TRIO_PUBLIC_NAN double +trio_ninf(TRIO_NOARGS) +{ + static double ninf_value = 0.0; + + if (ninf_value == 0.0) { + /* + * Negative infinity is calculated by negating positive infinity, + * which can be done because it is legal to do calculations on + * infinity (for example, 1 / infinity == 0). + */ + ninf_value = -trio_pinf(); + } + return ninf_value; +} + +#endif + +/** + Generate NaN. + + @return Floating-point representation of NaN. +*/ +#if defined(TRIO_FUNC_NAN) + +TRIO_PUBLIC_NAN double +trio_nan(TRIO_NOARGS) +{ + /* Cache the result */ + static double nan_value = 0.0; + + if (nan_value == 0.0) { + +# if defined(TRIO_NAN_C99_FUNCTION) || defined(TRIO_PLATFORM_SYMBIAN) + + nan_value = nan(""); + +# endif + +# if defined(TRIO_NAN_C99_MACRO) + + nan_value = (double)NAN; + +# endif + +# if defined(TRIO_NAN_IEEE_754) + + nan_value = internal_make_double(ieee_754_qnan_array); + +# endif + +# if defined(TRIO_NAN_FALLBACK) + /* + * There are several ways to generate NaN. The one used here is + * to divide infinity by infinity. I would have preferred to add + * negative infinity to positive infinity, but that yields wrong + * result (infinity) on FreeBSD. + * + * This may fail if the hardware does not support NaN, or if + * the Invalid Operation floating-point exception is unmasked. + */ +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN); +# endif + + nan_value = trio_pinf() / trio_pinf(); + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + +# endif + } + return nan_value; +} + +#endif + +/** @} SpecialQuantities */ + +/************************************************************************* + * For test purposes. + * + * Add the following compiler option to include this test code. + * + * Unix : -DSTANDALONE + * VMS : /DEFINE=(STANDALONE) + */ +#if defined(STANDALONE) +# include + +static TRIO_CONST char * +getClassification +TRIO_ARGS1((type), + int type) +{ + switch (type) { + case TRIO_FP_INFINITE: + return "FP_INFINITE"; + case TRIO_FP_NAN: + return "FP_NAN"; + case TRIO_FP_NORMAL: + return "FP_NORMAL"; + case TRIO_FP_SUBNORMAL: + return "FP_SUBNORMAL"; + case TRIO_FP_ZERO: + return "FP_ZERO"; + default: + return "FP_UNKNOWN"; + } +} + +static void +print_class +TRIO_ARGS2((prefix, number), + TRIO_CONST char *prefix, + double number) +{ + printf("%-6s: %s %-15s %g\n", + prefix, + trio_signbit(number) ? "-" : "+", + getClassification(trio_fpclassify(number)), + number); +} + +int main(TRIO_NOARGS) +{ + double my_nan; + double my_pinf; + double my_ninf; +# if defined(TRIO_PLATFORM_UNIX) + void (*signal_handler) TRIO_PROTO((int)); +# endif + + my_nan = trio_nan(); + my_pinf = trio_pinf(); + my_ninf = trio_ninf(); + + print_class("Nan", my_nan); + print_class("PInf", my_pinf); + print_class("NInf", my_ninf); + print_class("PZero", 0.0); + print_class("NZero", -0.0); + print_class("PNorm", 1.0); + print_class("NNorm", -1.0); + print_class("PSub", 1.01e-307 - 1.00e-307); + print_class("NSub", 1.00e-307 - 1.01e-307); + + printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n", + my_nan, + ((unsigned char *)&my_nan)[0], + ((unsigned char *)&my_nan)[1], + ((unsigned char *)&my_nan)[2], + ((unsigned char *)&my_nan)[3], + ((unsigned char *)&my_nan)[4], + ((unsigned char *)&my_nan)[5], + ((unsigned char *)&my_nan)[6], + ((unsigned char *)&my_nan)[7], + trio_isnan(my_nan), trio_isinf(my_nan), trio_isfinite(my_nan)); + printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n", + my_pinf, + ((unsigned char *)&my_pinf)[0], + ((unsigned char *)&my_pinf)[1], + ((unsigned char *)&my_pinf)[2], + ((unsigned char *)&my_pinf)[3], + ((unsigned char *)&my_pinf)[4], + ((unsigned char *)&my_pinf)[5], + ((unsigned char *)&my_pinf)[6], + ((unsigned char *)&my_pinf)[7], + trio_isnan(my_pinf), trio_isinf(my_pinf), trio_isfinite(my_pinf)); + printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n", + my_ninf, + ((unsigned char *)&my_ninf)[0], + ((unsigned char *)&my_ninf)[1], + ((unsigned char *)&my_ninf)[2], + ((unsigned char *)&my_ninf)[3], + ((unsigned char *)&my_ninf)[4], + ((unsigned char *)&my_ninf)[5], + ((unsigned char *)&my_ninf)[6], + ((unsigned char *)&my_ninf)[7], + trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf)); + +# if defined(TRIO_PLATFORM_UNIX) + signal_handler = signal(SIGFPE, SIG_IGN); +# endif + + my_pinf = DBL_MAX + DBL_MAX; + my_ninf = -my_pinf; + my_nan = my_pinf / my_pinf; + +# if defined(TRIO_PLATFORM_UNIX) + signal(SIGFPE, signal_handler); +# endif + + printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n", + my_nan, + ((unsigned char *)&my_nan)[0], + ((unsigned char *)&my_nan)[1], + ((unsigned char *)&my_nan)[2], + ((unsigned char *)&my_nan)[3], + ((unsigned char *)&my_nan)[4], + ((unsigned char *)&my_nan)[5], + ((unsigned char *)&my_nan)[6], + ((unsigned char *)&my_nan)[7], + trio_isnan(my_nan), trio_isinf(my_nan), trio_isfinite(my_nan)); + printf("PInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n", + my_pinf, + ((unsigned char *)&my_pinf)[0], + ((unsigned char *)&my_pinf)[1], + ((unsigned char *)&my_pinf)[2], + ((unsigned char *)&my_pinf)[3], + ((unsigned char *)&my_pinf)[4], + ((unsigned char *)&my_pinf)[5], + ((unsigned char *)&my_pinf)[6], + ((unsigned char *)&my_pinf)[7], + trio_isnan(my_pinf), trio_isinf(my_pinf), trio_isfinite(my_pinf)); + printf("NInf: %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n", + my_ninf, + ((unsigned char *)&my_ninf)[0], + ((unsigned char *)&my_ninf)[1], + ((unsigned char *)&my_ninf)[2], + ((unsigned char *)&my_ninf)[3], + ((unsigned char *)&my_ninf)[4], + ((unsigned char *)&my_ninf)[5], + ((unsigned char *)&my_ninf)[6], + ((unsigned char *)&my_ninf)[7], + trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf)); + + return 0; +} +#endif diff --git a/Mednafen/mednafen/trio/triostr.c b/Mednafen/mednafen/trio/triostr.c new file mode 100644 index 0000000000..6d74a4d914 --- /dev/null +++ b/Mednafen/mednafen/trio/triostr.c @@ -0,0 +1,2385 @@ +/************************************************************************* + * + * $Id: triostr.c,v 1.36 2010/01/26 13:02:02 breese Exp $ + * + * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND + * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. + * + ************************************************************************/ + +/************************************************************************* + * Include files + */ + +#if defined(HAVE_CONFIG_H) +# include +#endif +#include +#include +#include +#include +#include +#include +#if defined(TRIO_FUNC_TO_LONG_DOUBLE) +# define USE_MATH +#endif +#if defined(USE_MATH) +# include +#endif + +/************************************************************************* + * Definitions + */ + +#if !defined(TRIO_PUBLIC_STRING) +# define TRIO_PUBLIC_STRING TRIO_PUBLIC +#endif +#if !defined(TRIO_PRIVATE_STRING) +# define TRIO_PRIVATE_STRING TRIO_PRIVATE +#endif + +#if !defined(NULL) +# define NULL 0 +#endif +#if !defined(NIL) +# define NIL ((char)0) +#endif +#if !defined(FALSE) +# define FALSE (1 == 0) +# define TRUE (! FALSE) +#endif +#if !defined(BOOLEAN_T) +# define BOOLEAN_T int +#endif + +#if defined(USE_MATH) +# if defined(PREDEF_STANDARD_C99) +# if defined(TRIO_COMPILER_DECC) +# if (TRIO_COMPILER_DECC - 0 > 80000000) +/* + * The OSF/1 runtime that comes with the DECC compiler does not support + * hexfloats conversion. + */ +# define USE_STRTOD +# define USE_STRTOF +# endif +# else +# define USE_STRTOD +# define USE_STRTOF +# endif +# else +# if defined(TRIO_COMPILER_VISUALC) +# define USE_STRTOD +# endif +#endif +#endif + +#if defined(TRIO_PLATFORM_UNIX) +# if defined(PREDEF_STANDARD_UNIX95) +# define USE_STRCASECMP +# define USE_STRNCASECMP +# endif +# if defined(TRIO_PLATFORM_SUNOS) +# define USE_SYS_ERRLIST +# else +# define USE_STRERROR +# endif +# if defined(TRIO_PLATFORM_QNX) +# define strcasecmp(x,y) stricmp(x,y) +# define strncasecmp(x,y,n) strnicmp(x,y,n) +# endif +#endif + +#if defined(TRIO_PLATFORM_WIN32) +# define USE_STRCASECMP +# if defined(TRIO_PLATFORM_WINCE) +# define strcasecmp(x,y) _stricmp(x,y) +# else +# define strcasecmp(x,y) strcmpi(x,y) +# endif +#endif + +#if !defined(HAVE_CONFIG_H) +# if !(defined(TRIO_PLATFORM_SUNOS)) +# define HAVE_TOLOWER +# define HAVE_TOUPPER +# endif +#endif + +#if defined(USE_MATH) && !defined(TRIO_NO_POWL) +# if !defined(HAVE_POWL) +# if defined(PREDEF_STANDARD_C99) \ + || defined(PREDEF_STANDARD_UNIX03) +# define HAVE_POWL +# else +# if defined(TRIO_COMPILER_VISUALC) +# if defined(powl) +# define HAVE_POWL +# endif +# endif +# endif +# endif +#endif + +#if defined(HAVE_POWL) +# define trio_powl(x,y) powl((x),(y)) +#else +# define trio_powl(x,y) pow((double)(x),(double)(y)) +#endif + +#if defined(TRIO_FUNC_TO_UPPER) \ + || (defined(TRIO_FUNC_EQUAL) && !defined(USE_STRCASECMP)) \ + || (defined(TRIO_FUNC_EQUAL_MAX) && !defined(USE_STRNCASECMP)) \ + || defined(TRIO_FUNC_MATCH) \ + || defined(TRIO_FUNC_TO_LONG_DOUBLE) \ + || defined(TRIO_FUNC_UPPER) +# define TRIO_FUNC_INTERNAL_TO_UPPER +#endif + +/************************************************************************* + * Structures + */ + +struct _trio_string_t +{ + char *content; + size_t length; + size_t allocated; +}; + +/************************************************************************* + * Constants + */ + +#if !defined(TRIO_EMBED_STRING) +static TRIO_CONST char rcsid[] = "@(#)$Id: triostr.c,v 1.36 2010/01/26 13:02:02 breese Exp $"; +#endif + +/************************************************************************* + * Static String Functions + */ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_static.h" +#endif +/** @addtogroup StaticStrings + @{ +*/ + +/* + * internal_duplicate_max + */ +#if defined(TRIO_FUNC_DUPLICATE) \ + || defined(TRIO_FUNC_DUPLICATE_MAX) \ + || defined(TRIO_FUNC_STRING_DUPLICATE) \ + || defined(TRIO_FUNC_XSTRING_DUPLICATE) + +TRIO_PRIVATE_STRING char * +internal_duplicate_max +TRIO_ARGS2((source, size), + TRIO_CONST char *source, + size_t size) +{ + char *target; + + assert(source); + + /* Make room for string plus a terminating zero */ + size++; + target = trio_create(size); + if (target) + { + trio_copy_max(target, size, source); + } + return target; +} + +#endif + +/* + * internal_string_alloc + */ +#if defined(TRIO_FUNC_STRING_CREATE) \ + || defined(TRIO_FUNC_STRING_DUPLICATE) \ + || defined(TRIO_FUNC_XSTRING_DUPLICATE) + +TRIO_PRIVATE_STRING trio_string_t * +internal_string_alloc(TRIO_NOARGS) +{ + trio_string_t *self; + + self = (trio_string_t *)TRIO_MALLOC(sizeof(trio_string_t)); + if (self) + { + self->content = NULL; + self->length = 0; + self->allocated = 0; + } + return self; +} + +#endif + +/* + * internal_string_grow + * + * The size of the string will be increased by 'delta' characters. If + * 'delta' is zero, the size will be doubled. + */ +#if defined(TRIO_FUNC_STRING_CREATE) \ + || defined(TRIO_FUNC_STRING_APPEND) \ + || defined(TRIO_FUNC_XSTRING_APPEND) \ + || defined(TRIO_FUNC_XSTRING_APPEND_CHAR) + +TRIO_PRIVATE_STRING BOOLEAN_T +internal_string_grow +TRIO_ARGS2((self, delta), + trio_string_t *self, + size_t delta) +{ + BOOLEAN_T status = FALSE; + char *new_content; + size_t new_size; + + new_size = (delta == 0) + ? ( (self->allocated == 0) ? 1 : self->allocated * 2 ) + : self->allocated + delta; + + new_content = (char *)TRIO_REALLOC(self->content, new_size); + if (new_content) + { + self->content = new_content; + self->allocated = new_size; + status = TRUE; + } + return status; +} + +#endif + +/* + * internal_string_grow_to + * + * The size of the string will be increased to 'length' plus one characters. + * If 'length' is less than the original size, the original size will be + * used (that is, the size of the string is never decreased). + */ +#if defined(TRIO_FUNC_STRING_APPEND) \ + || defined(TRIO_FUNC_XSTRING_APPEND) \ + || defined(TRIO_FUNC_XSTRING_APPEND_MAX) + +TRIO_PRIVATE_STRING BOOLEAN_T +internal_string_grow_to +TRIO_ARGS2((self, length), + trio_string_t *self, + size_t length) +{ + length++; /* Room for terminating zero */ + return (self->allocated < length) + ? internal_string_grow(self, length - self->allocated) + : TRUE; +} + +#endif + +#if defined(TRIO_FUNC_INTERNAL_TO_UPPER) + +TRIO_PRIVATE_STRING TRIO_INLINE int +internal_to_upper +TRIO_ARGS1((source), + int source) +{ +# if defined(HAVE_TOUPPER) + + return toupper(source); + +# else + + /* Does not handle locales or non-contiguous alphabetic characters */ + return ((source >= (int)'a') && (source <= (int)'z')) + ? source - 'a' + 'A' + : source; + +# endif +} + +#endif + + +/** + Create new string. + + @param size Size of new string. + @return Pointer to string, or NULL if allocation failed. +*/ +#if defined(TRIO_FUNC_CREATE) + +TRIO_PUBLIC_STRING char * +trio_create +TRIO_ARGS1((size), + size_t size) +{ + return (char *)TRIO_MALLOC(size); +} + +#endif + +/** + Destroy string. + + @param string String to be freed. +*/ +#if defined(TRIO_FUNC_DESTROY) + +TRIO_PUBLIC_STRING void +trio_destroy +TRIO_ARGS1((string), + char *string) +{ + if (string) + { + TRIO_FREE(string); + } +} + +#endif + +/** + Count the number of characters in a string. + + @param string String to measure. + @return Number of characters in @p string. +*/ +#if defined(TRIO_FUNC_LENGTH) + +TRIO_PUBLIC_STRING size_t +trio_length +TRIO_ARGS1((string), + TRIO_CONST char *string) +{ + return strlen(string); +} + +#endif + +/** + Count at most @p max characters in a string. + + @param string String to measure. + @param max Maximum number of characters to count. + @return The maximum value of @p max and number of characters in @p string. +*/ +#if defined(TRIO_FUNC_LENGTH_MAX) + +TRIO_PUBLIC_STRING size_t +trio_length_max +TRIO_ARGS2((string, max), + TRIO_CONST char *string, + size_t max) +{ + size_t i; + + for (i = 0; i < max; ++i) + { + if (string[i] == 0) + break; + } + return i; +} + +#endif + +/** + Append @p source at the end of @p target. + + @param target Target string. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chunk with sufficient room to + contain the @p target string and @p source string. + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +#if defined(TRIO_FUNC_APPEND) + +TRIO_PUBLIC_STRING int +trio_append +TRIO_ARGS2((target, source), + char *target, + TRIO_CONST char *source) +{ + assert(target); + assert(source); + + return (strcat(target, source) != NULL); +} + +#endif + +/** + Append at most @p max characters from @p source to @p target. + + @param target Target string. + @param max Maximum number of characters to append. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chuck with sufficient room to + contain the @p target string and the @p source string (at most @p max + characters). + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +#if defined(TRIO_FUNC_APPEND_MAX) + +TRIO_PUBLIC_STRING int +trio_append_max +TRIO_ARGS3((target, max, source), + char *target, + size_t max, + TRIO_CONST char *source) +{ + size_t length; + + assert(target); + assert(source); + + length = trio_length(target); + + if (max > length) + { + strncat(target, source, max - length - 1); + } + return TRUE; +} + +#endif + +/** + Determine if a string contains a substring. + + @param string String to be searched. + @param substring String to be found. + @return Boolean value indicating success or failure. +*/ +#if defined(TRIO_FUNC_CONTAINS) + +TRIO_PUBLIC_STRING int +trio_contains +TRIO_ARGS2((string, substring), + TRIO_CONST char *string, + TRIO_CONST char *substring) +{ + assert(string); + assert(substring); + + return (0 != strstr(string, substring)); +} + +#endif + +/** + Copy @p source to @p target. + + @param target Target string. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chunk with sufficient room to + contain the @p source string. + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +#if defined(TRIO_FUNC_COPY) + +TRIO_PUBLIC_STRING int +trio_copy +TRIO_ARGS2((target, source), + char *target, + TRIO_CONST char *source) +{ + assert(target); + assert(source); + + (void)strcpy(target, source); + return TRUE; +} + +#endif + +/** + Copy at most @p max - 1 characters from @p source to @p target. + + @param target Target string. + @param max Maximum number of characters to append (one of which is + a NUL terminator). In other words @p source must point to at least + @p max - 1 bytes, but @p target must point to at least @p max + bytes. + @param source Source string. + @return Boolean value indicating success or failure. + + @pre @p target must point to a memory chunk with sufficient room to + contain the @p source string and a NUL terminator (at most @p max + bytes total). + @pre No boundary checking is performed, so insufficient memory will + result in a buffer overrun. + @post @p target will be zero terminated. +*/ +#if defined(TRIO_FUNC_COPY_MAX) + +TRIO_PUBLIC_STRING int +trio_copy_max +TRIO_ARGS3((target, max, source), + char *target, + size_t max, + TRIO_CONST char *source) +{ + assert(target); + assert(source); + assert(max > 0); /* Includes != 0 */ + + (void)strncpy(target, source, max - 1); + target[max - 1] = (char)0; + return TRUE; +} + +#endif + +/** + Duplicate @p source. + + @param source Source string. + @return A copy of the @p source string. + + @post @p target will be zero terminated. +*/ +#if defined(TRIO_FUNC_DUPLICATE) + +TRIO_PUBLIC_STRING char * +trio_duplicate +TRIO_ARGS1((source), + TRIO_CONST char *source) +{ + return internal_duplicate_max(source, trio_length(source)); +} + +#endif + +/** + Duplicate at most @p max characters of @p source. + + @param source Source string. + @param max Maximum number of characters to duplicate. + @return A copy of the @p source string. + + @post @p target will be zero terminated. +*/ +#if defined(TRIO_FUNC_DUPLICATE_MAX) + +TRIO_PUBLIC_STRING char * +trio_duplicate_max +TRIO_ARGS2((source, max), + TRIO_CONST char *source, + size_t max) +{ + size_t length; + + assert(source); + assert(max > 0); + + length = trio_length(source); + if (length > max) + { + length = max; + } + return internal_duplicate_max(source, length); +} + +#endif + +/** + Compare if two strings are equal. + + @param first First string. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-insensitive comparison. +*/ +#if defined(TRIO_FUNC_EQUAL) + +TRIO_PUBLIC_STRING int +trio_equal +TRIO_ARGS2((first, second), + TRIO_CONST char *first, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { +# if defined(USE_STRCASECMP) + return (0 == strcasecmp(first, second)); +# else + while ((*first != NIL) && (*second != NIL)) + { + if (internal_to_upper(*first) != internal_to_upper(*second)) + { + break; + } + first++; + second++; + } + return ((*first == NIL) && (*second == NIL)); +# endif + } + return FALSE; +} + +#endif + +/** + Compare if two strings are equal. + + @param first First string. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-sensitive comparison. +*/ +#if defined(TRIO_FUNC_EQUAL_CASE) + +TRIO_PUBLIC_STRING int +trio_equal_case +TRIO_ARGS2((first, second), + TRIO_CONST char *first, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { + return (0 == strcmp(first, second)); + } + return FALSE; +} + +#endif + +/** + Compare if two strings up until the first @p max characters are equal. + + @param first First string. + @param max Maximum number of characters to compare. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-sensitive comparison. +*/ +#if defined(TRIO_FUNC_EQUAL_CASE_MAX) + +TRIO_PUBLIC_STRING int +trio_equal_case_max +TRIO_ARGS3((first, max, second), + TRIO_CONST char *first, + size_t max, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { + return (0 == strncmp(first, second, max)); + } + return FALSE; +} + +#endif + +/** + Compare if two strings are equal. + + @param first First string. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Collating characters are considered equal. +*/ +#if defined(TRIO_FUNC_EQUAL_LOCALE) + +TRIO_PUBLIC_STRING int +trio_equal_locale +TRIO_ARGS2((first, second), + TRIO_CONST char *first, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + +# if defined(LC_COLLATE) + return (strcoll(first, second) == 0); +# else + return trio_equal(first, second); +# endif +} + +#endif + +/** + Compare if two strings up until the first @p max characters are equal. + + @param first First string. + @param max Maximum number of characters to compare. + @param second Second string. + @return Boolean indicating whether the two strings are equal or not. + + Case-insensitive comparison. +*/ +#if defined(TRIO_FUNC_EQUAL_MAX) + +TRIO_PUBLIC_STRING int +trio_equal_max +TRIO_ARGS3((first, max, second), + TRIO_CONST char *first, + size_t max, + TRIO_CONST char *second) +{ + assert(first); + assert(second); + + if ((first != NULL) && (second != NULL)) + { +# if defined(USE_STRNCASECMP) + return (0 == strncasecmp(first, second, max)); +# else + /* Not adequately tested yet */ + size_t cnt = 0; + while ((*first != NIL) && (*second != NIL) && (cnt <= max)) + { + if (internal_to_upper(*first) != internal_to_upper(*second)) + { + break; + } + first++; + second++; + cnt++; + } + return ((cnt == max) || ((*first == NIL) && (*second == NIL))); +# endif + } + return FALSE; +} + +#endif + +/** + Provide a textual description of an error code (errno). + + @param error_number Error number. + @return Textual description of @p error_number. +*/ +#if defined(TRIO_FUNC_ERROR) + +TRIO_PUBLIC_STRING TRIO_CONST char * +trio_error +TRIO_ARGS1((error_number), + int error_number) +{ +# if defined(USE_STRERROR) + + return strerror(error_number); + +# else +# if defined(USE_SYS_ERRLIST) + + extern char *sys_errlist[]; + extern int sys_nerr; + + return ((error_number < 0) || (error_number >= sys_nerr)) + ? "unknown" + : sys_errlist[error_number]; + +# else + + return "unknown"; + +# endif +# endif +} + +#endif + +/** + Format the date/time according to @p format. + + @param target Target string. + @param max Maximum number of characters to format. + @param format Formatting string. + @param datetime Date/time structure. + @return Number of formatted characters. + + The formatting string accepts the same specifiers as the standard C + function strftime. +*/ +#if defined(TRIO_FUNC_FORMAT_DATE_MAX) + +TRIO_PUBLIC_STRING size_t +trio_format_date_max +TRIO_ARGS4((target, max, format, datetime), + char *target, + size_t max, + TRIO_CONST char *format, + TRIO_CONST struct tm *datetime) +{ + assert(target); + assert(format); + assert(datetime); + assert(max > 0); + + return strftime(target, max, format, datetime); +} + +#endif + +/** + Calculate a hash value for a string. + + @param string String to be calculated on. + @param type Hash function. + @return Calculated hash value. + + @p type can be one of the following + @li @c TRIO_HASH_PLAIN Plain hash function. +*/ +#if defined(TRIO_FUNC_HASH) + +TRIO_PUBLIC_STRING unsigned long +trio_hash +TRIO_ARGS2((string, type), + TRIO_CONST char *string, + int type) +{ + unsigned long value = 0L; + char ch; + + assert(string); + + switch (type) + { + case TRIO_HASH_PLAIN: + while ( (ch = *string++) != NIL ) + { + value *= 31; + value += (unsigned long)ch; + } + break; + default: + assert(FALSE); + break; + } + return value; +} + +#endif + +/** + Find first occurrence of a character in a string. + + @param string String to be searched. + @param character Character to be found. + @return A pointer to the found character, or NULL if character was not found. + */ +#if defined(TRIO_FUNC_INDEX) + +TRIO_PUBLIC_STRING char * +trio_index +TRIO_ARGS2((string, character), + TRIO_CONST char *string, + int character) +{ + assert(string); + + return strchr(string, character); +} + +#endif + +/** + Find last occurrence of a character in a string. + + @param string String to be searched. + @param character Character to be found. + @return A pointer to the found character, or NULL if character was not found. + */ +#if defined(TRIO_FUNC_INDEX_LAST) + +TRIO_PUBLIC_STRING char * +trio_index_last +TRIO_ARGS2((string, character), + TRIO_CONST char *string, + int character) +{ + assert(string); + + return strchr(string, character); +} + +#endif + +/** + Convert the alphabetic letters in the string to lower-case. + + @param target String to be converted. + @return Number of processed characters (converted or not). +*/ +#if defined(TRIO_FUNC_LOWER) + +TRIO_PUBLIC_STRING int +trio_lower +TRIO_ARGS1((target), + char *target) +{ + assert(target); + + return trio_span_function(target, target, trio_to_lower); +} + +#endif + +/** + Compare two strings using wildcards. + + @param string String to be searched. + @param pattern Pattern, including wildcards, to search for. + @return Boolean value indicating success or failure. + + Case-insensitive comparison. + + The following wildcards can be used + @li @c * Match any number of characters. + @li @c ? Match a single character. +*/ +#if defined(TRIO_FUNC_MATCH) + +TRIO_PUBLIC_STRING int +trio_match +TRIO_ARGS2((string, pattern), + TRIO_CONST char *string, + TRIO_CONST char *pattern) +{ + assert(string); + assert(pattern); + + for (; ('*' != *pattern); ++pattern, ++string) + { + if (NIL == *string) + { + return (NIL == *pattern); + } + if ((internal_to_upper((int)*string) != internal_to_upper((int)*pattern)) + && ('?' != *pattern)) + { + return FALSE; + } + } + /* two-line patch to prevent *too* much recursiveness: */ + while ('*' == pattern[1]) + pattern++; + + do + { + if ( trio_match(string, &pattern[1]) ) + { + return TRUE; + } + } + while (*string++); + + return FALSE; +} + +#endif + +/** + Compare two strings using wildcards. + + @param string String to be searched. + @param pattern Pattern, including wildcards, to search for. + @return Boolean value indicating success or failure. + + Case-sensitive comparison. + + The following wildcards can be used + @li @c * Match any number of characters. + @li @c ? Match a single character. +*/ +#if defined(TRIO_FUNC_MATCH_CASE) + +TRIO_PUBLIC_STRING int +trio_match_case +TRIO_ARGS2((string, pattern), + TRIO_CONST char *string, + TRIO_CONST char *pattern) +{ + assert(string); + assert(pattern); + + for (; ('*' != *pattern); ++pattern, ++string) + { + if (NIL == *string) + { + return (NIL == *pattern); + } + if ((*string != *pattern) + && ('?' != *pattern)) + { + return FALSE; + } + } + /* two-line patch to prevent *too* much recursiveness: */ + while ('*' == pattern[1]) + pattern++; + + do + { + if ( trio_match_case(string, &pattern[1]) ) + { + return TRUE; + } + } + while (*string++); + + return FALSE; +} + +#endif + +/** + Execute a function on each character in string. + + @param target Target string. + @param source Source string. + @param Function Function to be executed. + @return Number of processed characters. +*/ +#if defined(TRIO_FUNC_SPAN_FUNCTION) + +TRIO_PUBLIC_STRING size_t +trio_span_function +TRIO_ARGS3((target, source, Function), + char *target, + TRIO_CONST char *source, + int (*Function) TRIO_PROTO((int))) +{ + size_t count = 0; + + assert(target); + assert(source); + assert(Function); + + while (*source != NIL) + { + *target++ = Function(*source++); + count++; + } + return count; +} + +#endif + +/** + Search for a substring in a string. + + @param string String to be searched. + @param substring String to be found. + @return Pointer to first occurrence of @p substring in @p string, or NULL + if no match was found. +*/ +#if defined(TRIO_FUNC_SUBSTRING) + +TRIO_PUBLIC_STRING char * +trio_substring +TRIO_ARGS2((string, substring), + TRIO_CONST char *string, + TRIO_CONST char *substring) +{ + assert(string); + assert(substring); + + return strstr(string, substring); +} + +#endif + +/** + Search for a substring in the first @p max characters of a string. + + @param string String to be searched. + @param max Maximum characters to be searched. + @param substring String to be found. + @return Pointer to first occurrence of @p substring in @p string, or NULL + if no match was found. +*/ +#if defined(TRIO_FUNC_SUBSTRING_MAX) + +TRIO_PUBLIC_STRING char * +trio_substring_max +TRIO_ARGS3((string, max, substring), + TRIO_CONST char *string, + size_t max, + TRIO_CONST char *substring) +{ + size_t count; + size_t size; + char *result = NULL; + + assert(string); + assert(substring); + + size = trio_length(substring); + if (size <= max) + { + for (count = 0; count <= max - size; count++) + { + if (trio_equal_max(substring, size, &string[count])) + { + result = (char *)&string[count]; + break; + } + } + } + return result; +} + +#endif + +/** + Tokenize string. + + @param string String to be tokenized. + @param delimiters String containing list of delimiting characters. + @return Start of new token. + + @warning @p string will be destroyed. +*/ +#if defined(TRIO_FUNC_TOKENIZE) + +TRIO_PUBLIC_STRING char * +trio_tokenize +TRIO_ARGS2((string, delimiters), + char *string, + TRIO_CONST char *delimiters) +{ + assert(delimiters); + + return strtok(string, delimiters); +} + +#endif + +/** + Convert string to floating-point number. + + @param source String to be converted. + @param endp Pointer to end of the converted string. + @return A floating-point number. + + The following Extended Backus-Naur form is used + @verbatim + double ::= [ ] + ( | + | + ) + [ [ ] ] + number ::= 1*( ) + digit ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ) + exponential ::= ( 'e' | 'E' ) + sign ::= ( '-' | '+' ) + decimal_point ::= '.' + @endverbatim +*/ +#if defined(TRIO_FUNC_TO_LONG_DOUBLE) + +/* FIXME: Add EBNF for hex-floats */ +TRIO_PUBLIC_STRING trio_long_double_t +trio_to_long_double +TRIO_ARGS2((source, endp), + TRIO_CONST char *source, + char **endp) +{ +# if defined(USE_STRTOLD) + return strtold(source, endp); +# else + int isNegative = FALSE; + int isExponentNegative = FALSE; + trio_long_double_t integer = 0.0; + trio_long_double_t fraction = 0.0; + unsigned long exponent = 0; + trio_long_double_t base; + trio_long_double_t fracdiv = 1.0; + trio_long_double_t value = 0.0; + + /* First try hex-floats */ + if ((source[0] == '0') && ((source[1] == 'x') || (source[1] == 'X'))) + { + base = 16.0; + source += 2; + while (isxdigit((int)*source)) + { + integer *= base; + integer += (isdigit((int)*source) + ? (*source - '0') + : 10 + (internal_to_upper((int)*source) - 'A')); + source++; + } + if (*source == '.') + { + source++; + while (isxdigit((int)*source)) + { + fracdiv /= base; + fraction += fracdiv * (isdigit((int)*source) + ? (*source - '0') + : 10 + (internal_to_upper((int)*source) - 'A')); + source++; + } + if ((*source == 'p') || (*source == 'P')) + { + source++; + if ((*source == '+') || (*source == '-')) + { + isExponentNegative = (*source == '-'); + source++; + } + while (isdigit((int)*source)) + { + exponent *= 10; + exponent += (*source - '0'); + source++; + } + } + } + /* For later use with exponent */ + base = 2.0; + } + else /* Then try normal decimal floats */ + { + base = 10.0; + isNegative = (*source == '-'); + /* Skip sign */ + if ((*source == '+') || (*source == '-')) + source++; + + /* Integer part */ + while (isdigit((int)*source)) + { + integer *= base; + integer += (*source - '0'); + source++; + } + + if (*source == '.') + { + source++; /* skip decimal point */ + while (isdigit((int)*source)) + { + fracdiv /= base; + fraction += (*source - '0') * fracdiv; + source++; + } + } + if ((*source == 'e') + || (*source == 'E') +# if TRIO_MICROSOFT + || (*source == 'd') + || (*source == 'D') +# endif + ) + { + source++; /* Skip exponential indicator */ + isExponentNegative = (*source == '-'); + if ((*source == '+') || (*source == '-')) + source++; + while (isdigit((int)*source)) + { + exponent *= (int)base; + exponent += (*source - '0'); + source++; + } + } + } + + value = integer + fraction; + if (exponent != 0) + { + if (isExponentNegative) + value /= trio_powl(base, (trio_long_double_t)exponent); + else + value *= trio_powl(base, (trio_long_double_t)exponent); + } + if (isNegative) + value = -value; + + if (endp) + *endp = (char *)source; + return value; +# endif +} + +#endif + +/** + Convert string to floating-point number. + + @param source String to be converted. + @param endp Pointer to end of the converted string. + @return A floating-point number. + + See @ref trio_to_long_double. +*/ +#if defined(TRIO_FUNC_TO_DOUBLE) + +TRIO_PUBLIC_STRING double +trio_to_double +TRIO_ARGS2((source, endp), + TRIO_CONST char *source, + char **endp) +{ +#if defined(USE_STRTOD) + return strtod(source, endp); +#else + return (double)trio_to_long_double(source, endp); +#endif +} + +#endif + +/** + Convert string to floating-point number. + + @param source String to be converted. + @param endp Pointer to end of the converted string. + @return A floating-point number. + + See @ref trio_to_long_double. +*/ +#if defined(TRIO_FUNC_TO_FLOAT) + +TRIO_PUBLIC_STRING float +trio_to_float +TRIO_ARGS2((source, endp), + TRIO_CONST char *source, + char **endp) +{ +# if defined(USE_STRTOF) + return strtof(source, endp); +# else + return (float)trio_to_long_double(source, endp); +# endif +} + +#endif + +/** + Convert string to signed integer. + + @param string String to be converted. + @param endp Pointer to end of converted string. + @param base Radix number of number. +*/ +#if defined(TRIO_FUNC_TO_LONG) + +TRIO_PUBLIC_STRING long +trio_to_long +TRIO_ARGS3((string, endp, base), + TRIO_CONST char *string, + char **endp, + int base) +{ + assert(string); + assert((base >= 2) && (base <= 36)); + + return strtol(string, endp, base); +} + +#endif + +/** + Convert one alphabetic letter to lower-case. + + @param source The letter to be converted. + @return The converted letter. +*/ +#if defined(TRIO_FUNC_TO_LOWER) + +TRIO_PUBLIC_STRING int +trio_to_lower +TRIO_ARGS1((source), + int source) +{ +# if defined(HAVE_TOLOWER) + + return tolower(source); + +# else + + /* Does not handle locales or non-contiguous alphabetic characters */ + return ((source >= (int)'A') && (source <= (int)'Z')) + ? source - 'A' + 'a' + : source; + +# endif +} + +#endif + +/** + Convert string to unsigned integer. + + @param string String to be converted. + @param endp Pointer to end of converted string. + @param base Radix number of number. +*/ +#if defined(TRIO_FUNC_TO_UNSIGNED_LONG) + +TRIO_PUBLIC_STRING unsigned long +trio_to_unsigned_long +TRIO_ARGS3((string, endp, base), + TRIO_CONST char *string, + char **endp, + int base) +{ + assert(string); + assert((base >= 2) && (base <= 36)); + + return strtoul(string, endp, base); +} + +#endif + +/** + Convert one alphabetic letter to upper-case. + + @param source The letter to be converted. + @return The converted letter. +*/ +#if defined(TRIO_FUNC_TO_UPPER) + +TRIO_PUBLIC_STRING int +trio_to_upper +TRIO_ARGS1((source), + int source) +{ + return internal_to_upper(source); +} + +#endif + +/** + Convert the alphabetic letters in the string to upper-case. + + @param target The string to be converted. + @return The number of processed characters (converted or not). +*/ +#if defined(TRIO_FUNC_UPPER) + +TRIO_PUBLIC_STRING int +trio_upper +TRIO_ARGS1((target), + char *target) +{ + assert(target); + + return trio_span_function(target, target, internal_to_upper); +} + +#endif + +/** @} End of StaticStrings */ + + +/************************************************************************* + * Dynamic String Functions + */ + +#if defined(TRIO_DOCUMENTATION) +# include "doc/doc_dynamic.h" +#endif +/** @addtogroup DynamicStrings + @{ +*/ + +/** + Create a new dynamic string. + + @param initial_size Initial size of the buffer. + @return Newly allocated dynamic string, or NULL if memory allocation failed. +*/ +#if defined(TRIO_FUNC_STRING_CREATE) + +TRIO_PUBLIC_STRING trio_string_t * +trio_string_create +TRIO_ARGS1((initial_size), + int initial_size) +{ + trio_string_t *self; + + self = internal_string_alloc(); + if (self) + { + if (internal_string_grow(self, + (size_t)((initial_size > 0) ? initial_size : 1))) + { + self->content[0] = (char)0; + self->allocated = initial_size; + } + else + { + trio_string_destroy(self); + self = NULL; + } + } + return self; +} + +#endif + +/** + Deallocate the dynamic string and its contents. + + @param self Dynamic string +*/ +#if defined(TRIO_FUNC_STRING_DESTROY) + +TRIO_PUBLIC_STRING void +trio_string_destroy +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + if (self) + { + trio_destroy(self->content); + TRIO_FREE(self); + } +} + +#endif + +/** + Get a pointer to the content. + + @param self Dynamic string. + @param offset Offset into content. + @return Pointer to the content. + + @p Offset can be zero, positive, or negative. If @p offset is zero, + then the start of the content will be returned. If @p offset is positive, + then a pointer to @p offset number of characters from the beginning of the + content is returned. If @p offset is negative, then a pointer to @p offset + number of characters from the ending of the string, starting at the + terminating zero, is returned. +*/ +#if defined(TRIO_FUNC_STRING_GET) + +TRIO_PUBLIC_STRING char * +trio_string_get +TRIO_ARGS2((self, offset), + trio_string_t *self, + int offset) +{ + char *result = NULL; + + assert(self); + + if (self->content != NULL) + { + if (self->length == 0) + { + (void)trio_string_length(self); + } + if (offset >= 0) + { + if (offset > (int)self->length) + { + offset = self->length; + } + } + else + { + offset += self->length + 1; + if (offset < 0) + { + offset = 0; + } + } + result = &(self->content[offset]); + } + return result; +} + +#endif + +/** + Extract the content. + + @param self Dynamic String + @return Content of dynamic string. + + The content is removed from the dynamic string. This enables destruction + of the dynamic string without deallocation of the content. +*/ +#if defined(TRIO_FUNC_STRING_EXTRACT) + +TRIO_PUBLIC_STRING char * +trio_string_extract +TRIO_ARGS1((self), + trio_string_t *self) +{ + char *result; + + assert(self); + + result = self->content; + /* FIXME: Allocate new empty buffer? */ + self->content = NULL; + self->length = self->allocated = 0; + return result; +} + +#endif + +/** + Set the content of the dynamic string. + + @param self Dynamic String + @param buffer The new content. + + Sets the content of the dynamic string to a copy @p buffer. + An existing content will be deallocated first, if necessary. + + @remark + This function will make a copy of @p buffer. + You are responsible for deallocating @p buffer yourself. +*/ +#if defined(TRIO_FUNC_XSTRING_SET) + +TRIO_PUBLIC_STRING void +trio_xstring_set +TRIO_ARGS2((self, buffer), + trio_string_t *self, + char *buffer) +{ + assert(self); + + trio_destroy(self->content); + self->content = trio_duplicate(buffer); +} + +#endif + +/* + * trio_string_size + */ +#if defined(TRIO_FUNC_STRING_SIZE) + +TRIO_PUBLIC_STRING int +trio_string_size +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + return self->allocated; +} + +#endif + +/* + * trio_string_terminate + */ +#if defined(TRIO_FUNC_STRING_TERMINATE) + +TRIO_PUBLIC_STRING void +trio_string_terminate +TRIO_ARGS1((self), + trio_string_t *self) +{ + trio_xstring_append_char(self, 0); +} + +#endif + +/** + Append the second string to the first. + + @param self Dynamic string to be modified. + @param other Dynamic string to copy from. + @return Boolean value indicating success or failure. +*/ +#if defined(TRIO_FUNC_STRING_APPEND) + +TRIO_PUBLIC_STRING int +trio_string_append +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + size_t length; + + assert(self); + assert(other); + + length = self->length + other->length; + if (!internal_string_grow_to(self, length)) + goto error; + trio_copy(&self->content[self->length], other->content); + self->length = length; + return TRUE; + + error: + return FALSE; +} + +#endif + + +/* + * trio_xstring_append + */ +#if defined(TRIO_FUNC_XSTRING_APPEND) + +TRIO_PUBLIC_STRING int +trio_xstring_append +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + size_t length; + + assert(self); + assert(other); + + length = self->length + trio_length(other); + if (!internal_string_grow_to(self, length)) + goto error; + trio_copy(&self->content[self->length], other); + self->length = length; + return TRUE; + + error: + return FALSE; +} + +#endif + +/* + * trio_xstring_append_char + */ +#if defined(TRIO_FUNC_XSTRING_APPEND_CHAR) + +TRIO_PUBLIC_STRING int +trio_xstring_append_char +TRIO_ARGS2((self, character), + trio_string_t *self, + char character) +{ + assert(self); + + if ((int)self->length >= trio_string_size(self)) + { + if (!internal_string_grow(self, 0)) + goto error; + } + self->content[self->length] = character; + self->length++; + return TRUE; + + error: + return FALSE; +} + +#endif + +/* + * trio_xstring_append_max + */ +#if defined(TRIO_FUNC_XSTRING_APPEND_MAX) + +TRIO_PUBLIC_STRING int +trio_xstring_append_max +TRIO_ARGS3((self, other, max), + trio_string_t *self, + TRIO_CONST char *other, + size_t max) +{ + size_t length; + + assert(self); + assert(other); + + length = self->length + trio_length_max(other, max); + if (!internal_string_grow_to(self, length)) + goto error; + + /* + * Pass max + 1 since trio_copy_max copies one character less than + * this from the source to make room for a terminating zero. + */ + trio_copy_max(&self->content[self->length], max + 1, other); + self->length = length; + return TRUE; + + error: + return FALSE; +} + +#endif + +/** + Search for the first occurrence of second parameter in the first. + + @param self Dynamic string to be modified. + @param other Dynamic string to copy from. + @return Boolean value indicating success or failure. +*/ +#if defined(TRIO_FUNC_STRING_CONTAINS) + +TRIO_PUBLIC_STRING int +trio_string_contains +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_contains(self->content, other->content); +} + +#endif + +/* + * trio_xstring_contains + */ +#if defined(TRIO_FUNC_XSTRING_CONTAINS) + +TRIO_PUBLIC_STRING int +trio_xstring_contains +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_contains(self->content, other); +} + +#endif + +/* + * trio_string_copy + */ +#if defined(TRIO_FUNC_STRING_COPY) + +TRIO_PUBLIC_STRING int +trio_string_copy +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + self->length = 0; + return trio_string_append(self, other); +} + +#endif + + +/* + * trio_xstring_copy + */ +#if defined(TRIO_FUNC_XSTRING_COPY) + +TRIO_PUBLIC_STRING int +trio_xstring_copy +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + self->length = 0; + return trio_xstring_append(self, other); +} + +#endif + +/* + * trio_string_duplicate + */ +#if defined(TRIO_FUNC_STRING_DUPLICATE) + +TRIO_PUBLIC_STRING trio_string_t * +trio_string_duplicate +TRIO_ARGS1((other), + trio_string_t *other) +{ + trio_string_t *self; + + assert(other); + + self = internal_string_alloc(); + if (self) + { + self->content = internal_duplicate_max(other->content, other->length); + if (self->content) + { + self->length = other->length; + self->allocated = self->length + 1; + } + else + { + self->length = self->allocated = 0; + } + } + return self; +} + +#endif + +/* + * trio_xstring_duplicate + */ +#if defined(TRIO_FUNC_XSTRING_DUPLICATE) + +TRIO_PUBLIC_STRING trio_string_t * +trio_xstring_duplicate +TRIO_ARGS1((other), + TRIO_CONST char *other) +{ + trio_string_t *self; + + assert(other); + + self = internal_string_alloc(); + if (self) + { + self->content = internal_duplicate_max(other, trio_length(other)); + if (self->content) + { + self->length = trio_length(self->content); + self->allocated = self->length + 1; + } + else + { + self->length = self->allocated = 0; + } + } + return self; +} + +#endif + +/* + * trio_string_equal + */ +#if defined(TRIO_FUNC_STRING_EQUAL) + +TRIO_PUBLIC_STRING int +trio_string_equal +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal(self->content, other->content); +} + +#endif + + +/* + * trio_xstring_equal + */ +#if defined(TRIO_FUNC_XSTRING_EQUAL) + +TRIO_PUBLIC_STRING int +trio_xstring_equal +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal(self->content, other); +} + +#endif + +/* + * trio_string_equal_max + */ +#if defined(TRIO_FUNC_STRING_EQUAL_MAX) + +TRIO_PUBLIC_STRING int +trio_string_equal_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal_max(self->content, max, other->content); +} +#endif + +/* + * trio_xstring_equal_max + */ +#if defined(TRIO_FUNC_XSTRING_EQUAL_MAX) + +TRIO_PUBLIC_STRING int +trio_xstring_equal_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal_max(self->content, max, other); +} + +#endif + +/* + * trio_string_equal_case + */ +#if defined(TRIO_FUNC_STRING_EQUAL_CASE) + +TRIO_PUBLIC_STRING int +trio_string_equal_case +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal_case(self->content, other->content); +} + +#endif + +/* + * trio_xstring_equal_case + */ +#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE) + +TRIO_PUBLIC_STRING int +trio_xstring_equal_case +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal_case(self->content, other); +} + +#endif + +/* + * trio_string_equal_case_max + */ +#if defined(TRIO_FUNC_STRING_EQUAL_CASE_MAX) + +TRIO_PUBLIC_STRING int +trio_string_equal_case_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_equal_case_max(self->content, max, other->content); +} + +#endif + +/* + * trio_xstring_equal_case_max + */ +#if defined(TRIO_FUNC_XSTRING_EQUAL_CASE_MAX) + +TRIO_PUBLIC_STRING int +trio_xstring_equal_case_max +TRIO_ARGS3((self, max, other), + trio_string_t *self, + size_t max, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_equal_case_max(self->content, max, other); +} + +#endif + +/* + * trio_string_format_data_max + */ +#if defined(TRIO_FUNC_STRING_FORMAT_DATE_MAX) + +TRIO_PUBLIC_STRING size_t +trio_string_format_date_max +TRIO_ARGS4((self, max, format, datetime), + trio_string_t *self, + size_t max, + TRIO_CONST char *format, + TRIO_CONST struct tm *datetime) +{ + assert(self); + + return trio_format_date_max(self->content, max, format, datetime); +} + +#endif + +/* + * trio_string_index + */ +#if defined(TRIO_FUNC_STRING_INDEX) + +TRIO_PUBLIC_STRING char * +trio_string_index +TRIO_ARGS2((self, character), + trio_string_t *self, + int character) +{ + assert(self); + + return trio_index(self->content, character); +} + +#endif + +/* + * trio_string_index_last + */ +#if defined(TRIO_FUNC_STRING_INDEX_LAST) + +TRIO_PUBLIC_STRING char * +trio_string_index_last +TRIO_ARGS2((self, character), + trio_string_t *self, + int character) +{ + assert(self); + + return trio_index_last(self->content, character); +} + +#endif + +/* + * trio_string_length + */ +#if defined(TRIO_FUNC_STRING_LENGTH) + +TRIO_PUBLIC_STRING int +trio_string_length +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + if (self->length == 0) + { + self->length = trio_length(self->content); + } + return self->length; +} + +#endif + +/* + * trio_string_lower + */ +#if defined(TRIO_FUNC_STRING_LOWER) + +TRIO_PUBLIC_STRING int +trio_string_lower +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + return trio_lower(self->content); +} + +#endif + +/* + * trio_string_match + */ +#if defined(TRIO_FUNC_STRING_MATCH) + +TRIO_PUBLIC_STRING int +trio_string_match +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_match(self->content, other->content); +} + +#endif + +/* + * trio_xstring_match + */ +#if defined(TRIO_FUNC_XSTRING_MATCH) + +TRIO_PUBLIC_STRING int +trio_xstring_match +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_match(self->content, other); +} + +#endif + +/* + * trio_string_match_case + */ +#if defined(TRIO_FUNC_STRING_MATCH_CASE) + +TRIO_PUBLIC_STRING int +trio_string_match_case +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_match_case(self->content, other->content); +} + +#endif + +/* + * trio_xstring_match_case + */ +#if defined(TRIO_FUNC_XSTRING_MATCH_CASE) + +TRIO_PUBLIC_STRING int +trio_xstring_match_case +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_match_case(self->content, other); +} + +#endif + +/* + * trio_string_substring + */ +#if defined(TRIO_FUNC_STRING_SUBSTRING) + +TRIO_PUBLIC_STRING char * +trio_string_substring +TRIO_ARGS2((self, other), + trio_string_t *self, + trio_string_t *other) +{ + assert(self); + assert(other); + + return trio_substring(self->content, other->content); +} + +#endif + +/* + * trio_xstring_substring + */ +#if defined(TRIO_FUNC_XSTRING_SUBSTRING) + +TRIO_PUBLIC_STRING char * +trio_xstring_substring +TRIO_ARGS2((self, other), + trio_string_t *self, + TRIO_CONST char *other) +{ + assert(self); + assert(other); + + return trio_substring(self->content, other); +} + +#endif + +/* + * trio_string_upper + */ +#if defined(TRIO_FUNC_STRING_UPPER) + +TRIO_PUBLIC_STRING int +trio_string_upper +TRIO_ARGS1((self), + trio_string_t *self) +{ + assert(self); + + return trio_upper(self->content); +} + +#endif + +/** @} End of DynamicStrings */ diff --git a/Mednafen/mednafen/types.h b/Mednafen/mednafen/types.h new file mode 100644 index 0000000000..47673ddcd0 --- /dev/null +++ b/Mednafen/mednafen/types.h @@ -0,0 +1,190 @@ +#ifndef __MDFN_TYPES +#define __MDFN_TYPES + +#define __STDC_LIMIT_MACROS 1 + +// Make sure this file is included BEFORE a few common standard C header files(stdio.h, errno.h, math.h, AND OTHERS, but this is not an exhaustive check, nor +// should it be), so that any defines in config.h that change header file behavior will work properly. +#if defined(EOF) || defined(EACCES) || defined(F_LOCK) || defined(NULL) || defined(O_APPEND) || defined(M_LOG2E) + #error "Wrong include order for types.h" +#endif + +// Yes, yes, I know: There's a better place for including config.h than here, but I'm tired, and this should work fine. :b +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; + +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; + + +#if !defined(HAVE_NATIVE64BIT) && (SIZEOF_VOID_P >= 8 || defined(__x86_64__)) +#define HAVE_NATIVE64BIT 1 +#endif + +#if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) + #define HAVE_COMPUTED_GOTO 1 +#endif + +#ifdef __GNUC__ + + #define MDFN_MAKE_GCCV(maj,min,pl) (((maj)*100*100) + ((min) * 100) + (pl)) + #define MDFN_GCC_VERSION MDFN_MAKE_GCCV(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) + + #define INLINE inline __attribute__((always_inline)) + #define NO_INLINE __attribute__((noinline)) + + #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,5,0) + #define NO_CLONE __attribute__((noclone)) + #else + #define NO_CLONE + #endif + + #if MDFN_GCC_VERSION < MDFN_MAKE_GCCV(4,8,0) + #define alignas(n) __attribute__ ((aligned (n))) // Kludge for 4.7.x, remove eventually when 4.8+ are not so new. + #endif + + // + // Just avoid using fastcall with gcc before 4.1.0, as it(and similar regparm) + // tend to generate bad code on the older versions(between about 3.1.x and 4.0.x, at least) + // + // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12236 + // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7574 + // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17025 + // + #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,1,0) + #if defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) + #define MDFN_FASTCALL __attribute__((fastcall)) + #else + #define MDFN_FASTCALL + #endif + #else + #define MDFN_FASTCALL + #endif + + #if !defined(__clang__) //|| ((__clang_major__ * 1000) + __clang_minor__) >= 3005 + #define MDFN_FORMATSTR(a,b,c) __attribute__ ((format (a, b, c))) + #else + #define MDFN_FORMATSTR(a,b,c) + #endif + + #define MDFN_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) + #define MDFN_NOWARN_UNUSED __attribute__((unused)) + + #define MDFN_UNLIKELY(n) __builtin_expect((n) != 0, 0) + #define MDFN_LIKELY(n) __builtin_expect((n) != 0, 1) + + #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,3,0) + #define MDFN_COLD __attribute__((cold)) + #else + #define MDFN_COLD + #endif + + #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,7,0) + #define MDFN_ASSUME_ALIGNED(p, align) __builtin_assume_aligned((p), (align)) + #else + #define MDFN_ASSUME_ALIGNED(p, align) (p) + #endif +#elif defined(_MSC_VER) + + #pragma message("Compiling with MSVC, untested") + + #define INLINE __forceinline + #define NO_INLINE __declspec(noinline) + #define NO_CLONE + + #define MDFN_FASTCALL __fastcall + + #define MDFN_FORMATSTR(a,b,c) + + #define MDFN_WARN_UNUSED_RESULT + + #define MDFN_NOWARN_UNUSED + + #define MDFN_UNLIKELY(n) ((n) != 0) + #define MDFN_LIKELY(n) ((n) != 0) + + #define MDFN_COLD + + #define MDFN_ASSUME_ALIGNED(p, align) (p) +#else + #define INLINE inline + #define NO_INLINE + #define NO_CLONE + + #define MDFN_FASTCALL + + #define MDFN_FORMATSTR(a,b,c) + + #define MDFN_WARN_UNUSED_RESULT + + #define MDFN_NOWARN_UNUSED + + #define MDFN_UNLIKELY(n) ((n) != 0) + #define MDFN_LIKELY(n) ((n) != 0) + + #define MDFN_COLD + + #define MDFN_ASSUME_ALIGNED(p, align) (p) +#endif + +#if PSS_STYLE==2 + +#define PSS "\\" +#define MDFN_PS '\\' + +#elif PSS_STYLE==1 + +#define PSS "/" +#define MDFN_PS '/' + +#elif PSS_STYLE==3 + +#define PSS "\\" +#define MDFN_PS '\\' + +#elif PSS_STYLE==4 + +#define PSS ":" +#define MDFN_PS ':' + +#endif + +typedef uint32 UTF32; /* at least 32 bits */ +typedef uint16 UTF16; /* at least 16 bits */ +typedef uint8 UTF8; /* typically 8 bits */ + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#undef require +#define require( expr ) assert( expr ) + +#if !defined(MSB_FIRST) && !defined(LSB_FIRST) + #error "Define MSB_FIRST or LSB_FIRST!" +#elif defined(MSB_FIRST) && defined(LSB_FIRST) + #error "Define only one of MSB_FIRST or LSB_FIRST, not both!" +#endif + +#include "error.h" + +#endif diff --git a/Mednafen/mednafen/vb/Makefile.am b/Mednafen/mednafen/vb/Makefile.am new file mode 100644 index 0000000000..de67a56dc0 --- /dev/null +++ b/Mednafen/mednafen/vb/Makefile.am @@ -0,0 +1,10 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -fno-strict-aliasing +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libvb.a +libvb_a_SOURCES = vb.cpp timer.cpp input.cpp vip.cpp vsu.cpp + +if WANT_DEBUGGER +libvb_a_SOURCES += debug.cpp +endif diff --git a/Mednafen/mednafen/vb/Makefile.in b/Mednafen/mednafen/vb/Makefile.in new file mode 100644 index 0000000000..c6fc6c88c2 --- /dev/null +++ b/Mednafen/mednafen/vb/Makefile.in @@ -0,0 +1,687 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = debug.cpp +subdir = src/vb +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libvb_a_AR = $(AR) $(ARFLAGS) +libvb_a_LIBADD = +am__libvb_a_SOURCES_DIST = vb.cpp timer.cpp input.cpp vip.cpp vsu.cpp \ + debug.cpp +@WANT_DEBUGGER_TRUE@am__objects_1 = debug.$(OBJEXT) +am_libvb_a_OBJECTS = vb.$(OBJEXT) timer.$(OBJEXT) input.$(OBJEXT) \ + vip.$(OBJEXT) vsu.$(OBJEXT) $(am__objects_1) +libvb_a_OBJECTS = $(am_libvb_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libvb_a_SOURCES) +DIST_SOURCES = $(am__libvb_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ -fno-strict-aliasing +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libvb.a +libvb_a_SOURCES = vb.cpp timer.cpp input.cpp vip.cpp vsu.cpp \ + $(am__append_1) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/vb/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/vb/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +libvb.a: $(libvb_a_OBJECTS) $(libvb_a_DEPENDENCIES) $(EXTRA_libvb_a_DEPENDENCIES) + $(AM_V_at)-rm -f libvb.a + $(AM_V_AR)$(libvb_a_AR) libvb.a $(libvb_a_OBJECTS) $(libvb_a_LIBADD) + $(AM_V_at)$(RANLIB) libvb.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vb.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vip.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsu.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/vb/debug.cpp b/Mednafen/mednafen/vb/debug.cpp new file mode 100644 index 0000000000..6dc0674f5f --- /dev/null +++ b/Mednafen/mednafen/vb/debug.cpp @@ -0,0 +1,609 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vb.h" +#include +#include +#include +#include +#include + +#include "debug.h" +#include "timer.h" +//#include "input.h" +#include "vip.h" +#include "vsu.h" +#include "timer.h" + +namespace MDFN_IEN_VB +{ + +extern V810 *VB_V810; +extern VSU *VB_VSU; + +static void RedoCPUHook(void); +static void (*CPUHook)(uint32, bool bpoint) = NULL; +static bool CPUHookContinuous = false; +static void (*LogFunc)(const char *, const char *); +bool VB_LoggingOn = FALSE; + +typedef struct __VB_BPOINT { + uint32 A[2]; + int type; + bool logical; +} VB_BPOINT; + +static std::vector BreakPointsPC, BreakPointsRead, BreakPointsWrite; +static bool FoundBPoint = 0; + +struct BTEntry +{ + uint32 from; + uint32 to; + uint32 branch_count; + uint32 ecode; + bool valid; +}; + +#define NUMBT 24 +static BTEntry BTEntries[NUMBT]; +static int BTIndex; +static bool BTEnabled; + +static void AddBranchTrace(uint32 from, uint32 to, uint32 ecode) +{ + BTEntry *prevbt = &BTEntries[(BTIndex + NUMBT - 1) % NUMBT]; + + //if(BTEntries[(BTIndex - 1) & 0xF] == PC) return; + + if(prevbt->from == from && prevbt->to == to && prevbt->ecode == ecode && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid) + prevbt->branch_count++; + else + { + BTEntries[BTIndex].from = from; + BTEntries[BTIndex].to = to; + BTEntries[BTIndex].ecode = ecode; + BTEntries[BTIndex].branch_count = 1; + BTEntries[BTIndex].valid = true; + + BTIndex = (BTIndex + 1) % NUMBT; + } +} + +void VBDBG_EnableBranchTrace(bool enable) +{ + BTEnabled = enable; + if(!enable) + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + } + + RedoCPUHook(); +} + +std::vector VBDBG_GetBranchTrace(void) +{ + BranchTraceResult tmp; + std::vector ret; + + for(int x = 0; x < NUMBT; x++) + { + const BTEntry *bt = &BTEntries[(x + BTIndex) % NUMBT]; + + if(!bt->valid) + continue; + + tmp.count = bt->branch_count; + trio_snprintf(tmp.from, sizeof(tmp.from), "%08x", bt->from); + trio_snprintf(tmp.to, sizeof(tmp.to), "%08x", bt->to); + + tmp.code[0] = 0; + + + if(bt->ecode >= 0xFFA0 && bt->ecode <= 0xFFBF) // TRAP + { + trio_snprintf(tmp.code, sizeof(tmp.code), "TRAP"); + } + else if(bt->ecode >= 0xFE00 && bt->ecode <= 0xFEFF) + { + trio_snprintf(tmp.code, sizeof(tmp.code), "INT%d", (bt->ecode >> 4) & 0xF); + } + else switch(bt->ecode) + { + case 0: break; + default: trio_snprintf(tmp.code, sizeof(tmp.code), "e"); + break; + + case 0xFFF0: // Reset + trio_snprintf(tmp.code, sizeof(tmp.code), "R"); + break; + + case 0xFFD0: // NMI + trio_snprintf(tmp.code, sizeof(tmp.code), "NMI"); + break; + + case 0xFFC0: // Address trap + trio_snprintf(tmp.code, sizeof(tmp.code), "ADTR"); + break; + + case 0xFF90: // Illegal/invalid instruction code + trio_snprintf(tmp.code, sizeof(tmp.code), "ILL"); + break; + + case 0xFF80: // Zero division + trio_snprintf(tmp.code, sizeof(tmp.code), "ZD"); + break; + + case 0xFF70: + trio_snprintf(tmp.code, sizeof(tmp.code), "FIV"); // FIV + break; + + case 0xFF68: + trio_snprintf(tmp.code, sizeof(tmp.code), "FZD"); // FZD + break; + + case 0xFF64: + trio_snprintf(tmp.code, sizeof(tmp.code), "FOV"); // FOV + break; + + case 0xFF62: + trio_snprintf(tmp.code, sizeof(tmp.code), "FUD"); // FUD + break; + + case 0xFF61: + trio_snprintf(tmp.code, sizeof(tmp.code), "FPR"); // FPR + break; + + case 0xFF60: + trio_snprintf(tmp.code, sizeof(tmp.code), "FRO"); // FRO + break; + } + + ret.push_back(tmp); + } + return(ret); +} + + +void VBDBG_CheckBP(int type, uint32 address, uint32 value, unsigned int len) +{ + std::vector::iterator bpit, bpit_end; + + if(type == BPOINT_READ || type == BPOINT_IO_READ) + { + bpit = BreakPointsRead.begin(); + bpit_end = BreakPointsRead.end(); + } + else if(type == BPOINT_WRITE || type == BPOINT_IO_WRITE) + { + bpit = BreakPointsWrite.begin(); + bpit_end = BreakPointsWrite.end(); + } + else + return; + + for(; bpit != bpit_end; bpit++) + { + uint32 tmp_address = address; + uint32 tmp_len = len; + + while(tmp_len--) + { + if(tmp_address >= bpit->A[0] && tmp_address <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + tmp_address++; + } + } +} + +static uint16 MDFN_FASTCALL MemPeek8(v810_timestamp_t timestamp, uint32 A) +{ + uint8 ret; + + // TODO: VB_InDebugPeek(implement elsewhere) + VB_InDebugPeek++; + ret = MemRead8(timestamp, A); + VB_InDebugPeek--; + + return(ret); +} + +static uint16 MDFN_FASTCALL MemPeek16(v810_timestamp_t timestamp, uint32 A) +{ + uint16 ret; + + // TODO: VB_InDebugPeek(implement elsewhere) + VB_InDebugPeek++; + ret = MemRead16(timestamp, A); + VB_InDebugPeek--; + + return(ret); +} + +static void CPUHandler(const v810_timestamp_t timestamp, uint32 PC) +{ + std::vector::iterator bpit; + + for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) + { + if(PC >= bpit->A[0] && PC <= bpit->A[1]) + { + FoundBPoint = TRUE; + break; + } + } + VB_V810->CheckBreakpoints(VBDBG_CheckBP, MemPeek16, NULL); + + CPUHookContinuous |= FoundBPoint; + + if(CPUHook && CPUHookContinuous) + { + ForceEventUpdates(timestamp); + CPUHook(PC, FoundBPoint); + } + + FoundBPoint = false; +} + +static void RedoCPUHook(void) +{ + VB_V810->SetCPUHook((CPUHook || VB_LoggingOn || BreakPointsPC.size() || BreakPointsRead.size() || BreakPointsWrite.size()) ? CPUHandler : NULL, + BTEnabled ? AddBranchTrace : NULL); +} + +void VBDBG_FlushBreakPoints(int type) +{ + std::vector::iterator bpit; + + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_PC) + BreakPointsPC.clear(); + + RedoCPUHook(); +} + +void VBDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + VB_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type = type; + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_PC) + BreakPointsPC.push_back(tmp); + + RedoCPUHook(); +} + +static uint16 dis_readhw(uint32 A) +{ + int32 timestamp = 0; + return(MemPeek16(timestamp, A)); +} + +void VBDBG_Disassemble(uint32 &a, uint32 SpecialA, char *TextBuf) +{ + return(v810_dis(a, 1, TextBuf, dis_readhw, true)); +} + +uint32 VBDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ret = 0; + int32 ws = 0; + + for(unsigned int i = 0; i < bsize; i++) + { + A &= 0xFFFFFFFF; + //ret |= mem_peekbyte(A, ws) << (i * 8); + ret |= MemRead8(ws, A) << (i * 8); + A++; + } + + return(ret); +} + +static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + while(Length--) + { + *Buffer = MemPeek8(0, Address); + + Address++; + Buffer++; + } + } + else if(!strncmp(name, "vsuwd", 5)) + { + const unsigned int which = name[5] - '0'; + + while(Length--) + { + *Buffer = VB_VSU->PeekWave(which, Address); + + Address++; + Buffer++; + } + } +} + +static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "cpu")) + { + while(Length--) + { + int32 dummy_ts = 0; + + MemWrite8(dummy_ts, Address, *Buffer); + + Address++; + Buffer++; + } + } + else if(!strncmp(name, "vsuwd", 5)) + { + const unsigned int which = name[5] - '0'; + + while(Length--) + { + VB_VSU->PokeWave(which, Address, *Buffer); + + Address++; + Buffer++; + } + } +} + +static uint32 VBDBG_GetRegister(const unsigned int id, char* special, const uint32 special_len) +{ + return VB_V810->GetRegister(id, special, special_len); +} + +static void VBDBG_SetRegister(const unsigned int id, uint32 value) +{ + VB_V810->SetRegister(id, value); +} + +void VBDBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + CPUHook = callb; + CPUHookContinuous = continuous; + RedoCPUHook(); +} + +void VBDBG_DoLog(const char *type, const char *format, ...) +{ + if(LogFunc) + { + char *temp; + + va_list ap; + va_start(ap, format); + + temp = trio_vaprintf(format, ap); + LogFunc(type, temp); + free(temp); + + va_end(ap); + } +} + +void VBDBG_SetLogFunc(void (*func)(const char *, const char *)) +{ + LogFunc = func; + + VB_LoggingOn = func ? TRUE : FALSE; + + if(VB_LoggingOn) + { + + } + else + { + + } + RedoCPUHook(); +} + +static RegType V810Regs[] = +{ + { V810::GSREG_PC, "PC", "Program Counter", 4 }, + { V810::GSREG_PR + 1, "PR1", "Program Register 1", 4 }, + { V810::GSREG_PR + 2, "HSP", "Program Register 2(Handler Stack Pointer)", 4 }, + { V810::GSREG_PR + 3, "SP", "Program Register 3(Stack Pointer)", 4 }, + { V810::GSREG_PR + 4, "GP", "Program Register 4(Global Pointer)", 4 }, + { V810::GSREG_PR + 5, "TP", "Program Register 5(Text Pointer)", 4 }, + { V810::GSREG_PR + 6, "PR6", "Program Register 6", 4 }, + { V810::GSREG_PR + 7, "PR7", "Program Register 7", 4 }, + { V810::GSREG_PR + 8, "PR8", "Program Register 8", 4 }, + { V810::GSREG_PR + 9, "PR9", "Program Register 9", 4 }, + { V810::GSREG_PR + 10, "PR10", "Program Register 10", 4 }, + { V810::GSREG_PR + 11, "PR11", "Program Register 11", 4 }, + { V810::GSREG_PR + 12, "PR12", "Program Register 12", 4 }, + { V810::GSREG_PR + 13, "PR13", "Program Register 13", 4 }, + { V810::GSREG_PR + 14, "PR14", "Program Register 14", 4 }, + { V810::GSREG_PR + 15, "PR15", "Program Register 15", 4 }, + { V810::GSREG_PR + 16, "PR16", "Program Register 16", 4 }, + { V810::GSREG_PR + 17, "PR17", "Program Register 17", 4 }, + { V810::GSREG_PR + 18, "PR18", "Program Register 18", 4 }, + { V810::GSREG_PR + 19, "PR19", "Program Register 19", 4 }, + { V810::GSREG_PR + 20, "PR20", "Program Register 20", 4 }, + { V810::GSREG_PR + 21, "PR21", "Program Register 21", 4 }, + { V810::GSREG_PR + 22, "PR22", "Program Register 22", 4 }, + { V810::GSREG_PR + 23, "PR23", "Program Register 23", 4 }, + { V810::GSREG_PR + 24, "PR24", "Program Register 24", 4 }, + { V810::GSREG_PR + 25, "PR25", "Program Register 25", 4 }, + { V810::GSREG_PR + 26, "PR26", "Program Register 26(String Dest Bit Offset)", 4 }, + { V810::GSREG_PR + 27, "PR27", "Program Register 27(String Source Bit Offset)", 4 }, + { V810::GSREG_PR + 28, "PR28", "Program Register 28(String Length)", 4 }, + { V810::GSREG_PR + 29, "PR29", "Program Register 29(String Dest)", 4 }, + { V810::GSREG_PR + 30, "PR30", "Program Register 30(String Source)", 4 }, + { V810::GSREG_PR + 31, "LP", "Program Register 31(Link Pointer)", 4 }, + + { V810::GSREG_SR + 0, "SR0", "Exception/Interrupt PC", 4 }, + { V810::GSREG_SR + 1, "SR1", "Exception/Interrupt PSW", 4 }, + { V810::GSREG_SR + 2, "SR2", "Fatal Error PC", 4 }, + { V810::GSREG_SR + 3, "SR3", "Fatal Error PSW", 4 }, + { V810::GSREG_SR + 4, "SR4", "Exception Cause Register", 4 }, + { V810::GSREG_SR + 5, "SR5", "Program Status Word", 4 }, + { V810::GSREG_SR + 6, "SR6", "Processor ID Register", 4 }, + { V810::GSREG_SR + 7, "SR7", "Task Control Word", 4 }, + { V810::GSREG_SR + 24, "SR24", "Cache Control Word", 4 }, + { V810::GSREG_SR + 25, "SR25", "Address Trap Register", 4 }, + + { V810::GSREG_TIMESTAMP, "TStamp", "Timestamp", 3 }, + + { 0, "", "", 0 }, +}; + + +static RegGroupType V810RegsGroup = +{ + NULL, + V810Regs, + VBDBG_GetRegister, + VBDBG_SetRegister, +}; + +static uint32 MISC_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + return(TIMER_GetRegister(id, special, special_len)); +} + +static void MISC_SetRegister(const unsigned int id, const uint32 value) +{ + TIMER_SetRegister(id, value); +} + + +static RegType Regs_Misc[] = +{ + { TIMER_GSREG_TCR, "TCR", "Timer Control Register", 1 }, + { TIMER_GSREG_DIVCOUNTER, "DivCounter", "Timer Clock Divider Counter", 2 }, + { TIMER_GSREG_RELOAD_VALUE, "ReloadValue", "Timer Reload Value", 2 }, + { TIMER_GSREG_COUNTER, "Counter", "Timer Counter Value", 2 }, + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_Misc = +{ + "Misc", + Regs_Misc, + MISC_GetRegister, + MISC_SetRegister +}; + + +static RegType Regs_VIP[] = +{ + { VIP_GSREG_IPENDING, "IPending", "Interrupts Pending", 2 }, + { VIP_GSREG_IENABLE, "IEnable", "Interrupts Enabled", 2 }, + + { VIP_GSREG_DPCTRL, "DPCTRL", "DPCTRL", 2 }, + + { VIP_GSREG_BRTA, "BRTA", "BRTA", 1 }, + { VIP_GSREG_BRTB, "BRTB", "BRTB", 1 }, + { VIP_GSREG_BRTC, "BRTC", "BRTC", 1 }, + { VIP_GSREG_REST, "REST", "REST", 1 }, + { VIP_GSREG_FRMCYC, "FRMCYC", "FRMCYC", 1 }, + { VIP_GSREG_XPCTRL, "XPCTRL", "XPCTRL", 2 }, + + { VIP_GSREG_SPT0, "SPT0", "SPT0", 2 }, + { VIP_GSREG_SPT1, "SPT1", "SPT1", 2 }, + { VIP_GSREG_SPT2, "SPT2", "SPT2", 2 }, + { VIP_GSREG_SPT3, "SPT3", "SPT3", 2 }, + + { VIP_GSREG_GPLT0, "GPLT0", "GPLT0", 1 }, + { VIP_GSREG_GPLT1, "GPLT1", "GPLT1", 1 }, + { VIP_GSREG_GPLT2, "GPLT2", "GPLT2", 1 }, + { VIP_GSREG_GPLT3, "GPLT3", "GPLT3", 1 }, + + { VIP_GSREG_JPLT0, "JPLT0", "JPLT0", 1 }, + { VIP_GSREG_JPLT1, "JPLT1", "JPLT1", 1 }, + { VIP_GSREG_JPLT2, "JPLT2", "JPLT2", 1 }, + { VIP_GSREG_JPLT3, "JPLT3", "JPLT3", 1 }, + + { VIP_GSREG_BKCOL, "BKCOL", "BKCOL", 1 }, + + { 0, "", "", 0 }, +}; + +static RegGroupType RegsGroup_VIP = +{ + "VIP", + Regs_VIP, + VIP_GetRegister, + VIP_SetRegister +}; + + +bool VBDBG_Init(void) +{ + BTEnabled = false; + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + + MDFNDBG_AddRegGroup(&V810RegsGroup); + MDFNDBG_AddRegGroup(&RegsGroup_Misc); + MDFNDBG_AddRegGroup(&RegsGroup_VIP); + + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "cpu", "CPU Physical", 32); +// ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ram", "RAM", 21); + + + for(int x = 0; x < 5; x++) + { + AddressSpaceType newt; + char tmpname[128], tmpinfo[128]; + + trio_snprintf(tmpname, 128, "vsuwd%d", x); + trio_snprintf(tmpinfo, 128, "VSU Wave Data %d", x); + + newt.GetAddressSpaceBytes = GetAddressSpaceBytes; + newt.PutAddressSpaceBytes = PutAddressSpaceBytes; + + newt.name = std::string(tmpname); + newt.long_name = std::string(tmpinfo); + newt.TotalBits = 5; + newt.NP2Size = 0; + + newt.IsWave = TRUE; + newt.WaveFormat = ASPACE_WFMT_UNSIGNED; + newt.WaveBits = 6; + ASpace_Add(newt); //PSG_GetAddressSpaceBytes, PSG_PutAddressSpaceBytes, tmpname, tmpinfo, 5); + } + + + + return(true); +} + +} diff --git a/Mednafen/mednafen/vb/debug.h b/Mednafen/mednafen/vb/debug.h new file mode 100644 index 0000000000..7804915107 --- /dev/null +++ b/Mednafen/mednafen/vb/debug.h @@ -0,0 +1,31 @@ +#ifndef __VB_DEBUG_H +#define __VB_DEBUG_H + +namespace MDFN_IEN_VB +{ + +void VBDBG_FlushBreakPoints(int type); +void VBDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical); +void VBDBG_Disassemble(uint32 &a, uint32 SpecialA, char *); + +uint32 VBDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical); + +void VBDBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous); + +void VBDBG_EnableBranchTrace(bool enable); +std::vector VBDBG_GetBranchTrace(void); + +void VBDBG_CheckBP(int type, uint32 address, uint32 value, unsigned int len); + +void VBDBG_SetLogFunc(void (*func)(const char *, const char *)); + +void VBDBG_DoLog(const char *type, const char *format, ...); + + +extern bool VB_LoggingOn; + +bool VBDBG_Init(void); + +}; + +#endif diff --git a/Mednafen/mednafen/vb/input.cpp b/Mednafen/mednafen/vb/input.cpp new file mode 100644 index 0000000000..a70b8a774f --- /dev/null +++ b/Mednafen/mednafen/vb/input.cpp @@ -0,0 +1,226 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vb.h" +#include "input.h" + +namespace MDFN_IEN_VB +{ +static bool InstantReadHack; + +static bool IntPending; + +static uint8 *data_ptr; + +static uint16 PadData; +static uint16 PadLatched; + +static uint8 SCR; +static uint16 SDR; + +#define SCR_S_ABT_DIS 0x01 +#define SCR_SI_STAT 0x02 +#define SCR_HW_SI 0x04 +#define SCR_SOFT_CLK 0x10 + +#define SCR_PARA_SI 0x20 +#define SCR_K_INT_INH 0x80 + +static uint32 ReadBitPos; +static int32 ReadCounter; + +static v810_timestamp_t last_ts; + +void VBINPUT_Init(void) +{ + InstantReadHack = true; +} + +void VBINPUT_SetInstantReadHack(bool enabled) +{ + InstantReadHack = enabled; +} + + +void VBINPUT_SetInput(unsigned port, const char *type, uint8 *ptr) +{ + data_ptr = (uint8 *)ptr; +} + +uint8 VBINPUT_Read(v810_timestamp_t ×tamp, uint32 A) +{ + uint8 ret = 0; + + + VBINPUT_Update(timestamp); + + //if(((A & 0xFF) == 0x10 || (A & 0xFF) == 0x14)) + // printf("Read %d\n", timestamp); + + //if(((A & 0xFF) == 0x10 || (A & 0xFF) == 0x14) && ReadCounter > 0) + //{ + // printf("Input port read during hardware transfer: %08x %d\n", A, timestamp); + //} + + switch(A & 0xFF) + { + case 0x10: if(InstantReadHack) + ret = PadData; + else + ret = SDR & 0xFF; + break; + + case 0x14: if(InstantReadHack) + ret = PadData >> 8; + else + ret = SDR >> 8; + break; + + case 0x28: ret = SCR | (0x40 | 0x08 | SCR_HW_SI); + if(ReadCounter > 0) + ret |= SCR_SI_STAT; + break; + } + +// printf("Input Read: %08x %02x\n", A, ret); + VB_SetEvent(VB_EVENT_INPUT, (ReadCounter > 0) ? (timestamp + ReadCounter) : VB_EVENT_NONONO); + + return(ret); +} + +void VBINPUT_Write(v810_timestamp_t ×tamp, uint32 A, uint8 V) +{ + VBINPUT_Update(timestamp); + + //printf("Input write: %d, %08x %02x\n", timestamp, A, V); + switch(A & 0xFF) + { + case 0x28: + if((V & SCR_HW_SI) && !(SCR & SCR_S_ABT_DIS) && ReadCounter <= 0) + { + //printf("Start Read: %d\n", timestamp); + PadLatched = PadData; + ReadBitPos = 0; + ReadCounter = 640; + } + + if(V & SCR_S_ABT_DIS) + { + ReadCounter = 0; + ReadBitPos = 0; + } + + if(V & SCR_K_INT_INH) + { + IntPending = false; + VBIRQ_Assert(VBIRQ_SOURCE_INPUT, IntPending); + } + + SCR = V & (0x80 | 0x20 | 0x10 | 1); + break; + } + + VB_SetEvent(VB_EVENT_INPUT, (ReadCounter > 0) ? (timestamp + ReadCounter) : VB_EVENT_NONONO); +} + +void VBINPUT_Frame(void) +{ + PadData = (MDFN_de16lsb(data_ptr) << 2) | 0x2; +} + +v810_timestamp_t VBINPUT_Update(const v810_timestamp_t timestamp) +{ + int32 clocks = timestamp - last_ts; + + if(ReadCounter > 0) + { + ReadCounter -= clocks; + + while(ReadCounter <= 0) + { + SDR &= ~(1 << ReadBitPos); + SDR |= PadLatched & (1 << ReadBitPos); + + ReadBitPos++; + if(ReadBitPos < 16) + ReadCounter += 640; + else + { + //printf("Read End: %d\n", timestamp); + if(!(SCR & SCR_K_INT_INH)) + { + //printf("Input IRQ: %d\n", timestamp); + IntPending = true; + VBIRQ_Assert(VBIRQ_SOURCE_INPUT, IntPending); + } + break; + } + } + + } + + + last_ts = timestamp; + + return((ReadCounter > 0) ? (timestamp + ReadCounter) : VB_EVENT_NONONO); +} + +void VBINPUT_ResetTS(void) +{ + last_ts = 0; +} + +void VBINPUT_Power(void) +{ + last_ts = 0; + PadData = 0; + PadLatched = 0; + SDR = 0; + SCR = 0; + ReadBitPos = 0; + ReadCounter = 0; + IntPending = false; + + VBIRQ_Assert(VBIRQ_SOURCE_INPUT, 0); +} + + + +void VBINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(PadData), + SFVAR(PadLatched), + SFVAR(SCR), + SFVAR(SDR), + SFVAR(ReadBitPos), + SFVAR(ReadCounter), + SFVAR(IntPending), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INPUT"); + + if(load) + { + + } +} + + +} diff --git a/Mednafen/mednafen/vb/input.h b/Mednafen/mednafen/vb/input.h new file mode 100644 index 0000000000..895c6d9991 --- /dev/null +++ b/Mednafen/mednafen/vb/input.h @@ -0,0 +1,29 @@ +#ifndef __VB_INPUT_H +#define __VB_INPUT_H + +namespace MDFN_IEN_VB +{ + +void VBINPUT_Init(void); +void VBINPUT_SetInstantReadHack(bool); + +void VBINPUT_SetInput(unsigned port, const char *type, uint8 *ptr); + +uint8 VBINPUT_Read(v810_timestamp_t ×tamp, uint32 A); + +void VBINPUT_Write(v810_timestamp_t ×tamp, uint32 A, uint8 V); + +void VBINPUT_Frame(void); +void VBINPUT_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +int32 VBINPUT_Update(const int32 timestamp); +void VBINPUT_ResetTS(void); + + +void VBINPUT_Power(void); + + +int VBINPUT_StateAction(StateMem *sm, int load, int data_only); + +} +#endif diff --git a/Mednafen/mednafen/vb/timer.cpp b/Mednafen/mednafen/vb/timer.cpp new file mode 100644 index 0000000000..cfc757e57f --- /dev/null +++ b/Mednafen/mednafen/vb/timer.cpp @@ -0,0 +1,252 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vb.h" +#include "timer.h" + +namespace MDFN_IEN_VB +{ + +#define TC_TENABLE 0x01 +#define TC_ZSTAT 0x02 +#define TC_ZSTATCLR 0x04 +#define TC_TIMZINT 0x08 +#define TC_TCLKSEL 0x10 + +static uint8 TimerControl; +static uint16 TimerReloadValue; +static uint16 TimerCounter; +static int32 TimerDivider; +static v810_timestamp_t TimerLastTS; +static bool TimerStatus, TimerStatusShadow; +static bool ReloadPending; + +v810_timestamp_t TIMER_Update(v810_timestamp_t timestamp) +{ + int32 run_time = timestamp - TimerLastTS; + + if(TimerControl & TC_TENABLE) + { + TimerDivider -= run_time; + while(TimerDivider <= 0) + { + if(!TimerCounter || ReloadPending) + { + TimerCounter = TimerReloadValue; + ReloadPending = false; + } + + if(TimerCounter) + TimerCounter--; + + if(!TimerCounter || TimerStatus) + { + TimerStatusShadow = TimerStatus = true; + } + + VBIRQ_Assert(VBIRQ_SOURCE_TIMER, TimerStatusShadow && (TimerControl & TC_TIMZINT)); + TimerDivider += (TimerControl & TC_TCLKSEL) ? 500 : 2000; + } + } + + TimerLastTS = timestamp; + + return((TimerControl & TC_TENABLE) ? (timestamp + TimerDivider) : VB_EVENT_NONONO); +} + +void TIMER_ResetTS(void) +{ + TimerLastTS = 0; +} + +uint8 TIMER_Read(const v810_timestamp_t ×tamp, uint32 A) +{ + uint8 ret = 0; + + //if(A <= 0x1C) + //printf("Read: %d, %08x\n", timestamp, A); + TIMER_Update(timestamp); + + switch(A & 0xFF) + { + case 0x18: ret = TimerCounter; + break; + + case 0x1C: ret = TimerCounter >> 8; + break; + + case 0x20: ret = TimerControl | (0xE0 | TC_ZSTATCLR) | (TimerStatus ? TC_ZSTAT : 0); + break; + + } + + return(ret); +} + +void TIMER_Write(const v810_timestamp_t ×tamp, uint32 A, uint8 V) +{ + if(A & 0x3) + { + puts("HWCtrl Bogus Write?"); + return; + } + + TIMER_Update(timestamp); + + //if((A & 0xFF) <= 0x1C) + //printf("Write: %d, %08x %02x\n", timestamp, A, V); + + switch(A & 0xFF) + { + case 0x18: TimerReloadValue &= 0xFF00; + TimerReloadValue |= V; + ReloadPending = true; + break; + + case 0x1C: TimerReloadValue &= 0x00FF; + TimerReloadValue |= V << 8; + ReloadPending = true; + break; + + case 0x20: if(V & TC_ZSTATCLR) + { + if((TimerControl & TC_TENABLE) && TimerCounter == 0) + { + //puts("Faulty Z-Stat-Clr"); + } + else + { + TimerStatus = false; + } + TimerStatusShadow = false; + } + if((V & TC_TENABLE) && !(TimerControl & TC_TENABLE)) + { + //TimerCounter = TimerReloadValue; + TimerDivider = (V & TC_TCLKSEL) ? 500 : 2000; + } + TimerControl = V & (0x10 | 0x08 | 0x01); + + if(!(TimerControl & TC_TIMZINT)) + TimerStatus = TimerStatusShadow = false; + + VBIRQ_Assert(VBIRQ_SOURCE_TIMER, TimerStatusShadow && (TimerControl & TC_TIMZINT)); + + if(TimerControl & TC_TENABLE) + VB_SetEvent(VB_EVENT_TIMER, timestamp + TimerDivider); + break; + } +} + +void TIMER_Power(void) +{ + TimerLastTS = 0; + + TimerCounter = 0xFFFF; + TimerReloadValue = 0; + TimerDivider = 2000; //2150; //2000; + + TimerStatus = false; + TimerStatusShadow = false; + TimerControl = 0; + + ReloadPending = false; + + VBIRQ_Assert(VBIRQ_SOURCE_TIMER, false); +} + +void TIMER_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(TimerCounter), + SFVAR(TimerReloadValue), + SFVAR(TimerDivider), + SFVAR(TimerStatus), + SFVAR(TimerStatusShadow), + SFVAR(TimerControl), + SFVAR(ReloadPending), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "TIMER"); + + if(load) + { + + } +} + +uint32 TIMER_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 ret = 0xDEADBEEF; + + switch(id) + { + case TIMER_GSREG_TCR: + ret = TimerControl; + if(special) + trio_snprintf(special, special_len, "TEnable: %d, TimZInt: %d, TClkSel: %d(%.3f KHz)", + (int)(bool)(ret & TC_TENABLE), + (int)(bool)(ret & TC_TIMZINT), + (int)(bool)(ret & TC_TCLKSEL), + (double)VB_MASTER_CLOCK / ((ret & TC_TCLKSEL) ? 500 : 2000) / 1000 ); + break; + + case TIMER_GSREG_DIVCOUNTER: + ret = TimerDivider; + break; + + case TIMER_GSREG_RELOAD_VALUE: + ret = TimerReloadValue; + break; + + case TIMER_GSREG_COUNTER: + ret = TimerCounter; + break; + + } + return(ret); +} + +void TIMER_SetRegister(const unsigned int id, const uint32 value) +{ + switch(id) + { + case TIMER_GSREG_TCR: + TimerControl = value & (TC_TENABLE | TC_TIMZINT | TC_TCLKSEL); + break; + + case TIMER_GSREG_DIVCOUNTER: + TimerDivider = value % ((TimerControl & TC_TCLKSEL) ? 500 : 2000); + break; + + case TIMER_GSREG_RELOAD_VALUE: + TimerReloadValue = value; + break; + + case TIMER_GSREG_COUNTER: + TimerCounter = value; + break; + + } + + +} + + +} diff --git a/Mednafen/mednafen/vb/timer.h b/Mednafen/mednafen/vb/timer.h new file mode 100644 index 0000000000..0b5264503f --- /dev/null +++ b/Mednafen/mednafen/vb/timer.h @@ -0,0 +1,30 @@ +#ifndef __MDFN_VB_TIMER_H +#define __MDFN_VB_TIMER_H + +namespace MDFN_IEN_VB +{ + +v810_timestamp_t TIMER_Update(v810_timestamp_t timestamp); +void TIMER_ResetTS(void); +uint8 TIMER_Read(const v810_timestamp_t ×tamp, uint32 A); +void TIMER_Write(const v810_timestamp_t ×tamp, uint32 A, uint8 V); + +void TIMER_Power(void) MDFN_COLD; + +void TIMER_StateAction(StateMem *sm, const unsigned load, const bool data_only); + + +enum +{ + TIMER_GSREG_TCR, + TIMER_GSREG_DIVCOUNTER, + TIMER_GSREG_RELOAD_VALUE, + TIMER_GSREG_COUNTER, +}; + +uint32 TIMER_GetRegister(const unsigned int id, char *special, const uint32 special_len); +void TIMER_SetRegister(const unsigned int id, const uint32 value); + +} + +#endif diff --git a/Mednafen/mednafen/vb/vb.cpp b/Mednafen/mednafen/vb/vb.cpp new file mode 100644 index 0000000000..8de1ff34a9 --- /dev/null +++ b/Mednafen/mednafen/vb/vb.cpp @@ -0,0 +1,1035 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vb.h" +#include "timer.h" +#include "vsu.h" +#include "vip.h" +#ifdef WANT_DEBUGGER +#include "debug.h" +#endif +#include "input.h" +#include +#include +#include +#include +#include + +namespace MDFN_IEN_VB +{ + +enum +{ + ANAGLYPH_PRESET_DISABLED = 0, + ANAGLYPH_PRESET_RED_BLUE, + ANAGLYPH_PRESET_RED_CYAN, + ANAGLYPH_PRESET_RED_ELECTRICCYAN, + ANAGLYPH_PRESET_RED_GREEN, + ANAGLYPH_PRESET_GREEN_MAGENTA, + ANAGLYPH_PRESET_YELLOW_BLUE, +}; + +static const uint32 AnaglyphPreset_Colors[][2] = +{ + { 0, 0 }, + { 0xFF0000, 0x0000FF }, + { 0xFF0000, 0x00B7EB }, + { 0xFF0000, 0x00FFFF }, + { 0xFF0000, 0x00FF00 }, + { 0x00FF00, 0xFF00FF }, + { 0xFFFF00, 0x0000FF }, +}; + + +int32 VB_InDebugPeek; + +static uint32 VB3DMode; + +static uint8 *WRAM = NULL; + +static uint8 *GPRAM = NULL; +static uint32 GPRAM_Mask; + +static uint8 *GPROM = NULL; +static uint32 GPROM_Mask; + +V810 *VB_V810 = NULL; + +VSU *VB_VSU = NULL; +static uint32 VSU_CycleFix; + +static uint8 WCR; + +static int32 next_vip_ts, next_timer_ts, next_input_ts; + + +static uint32 IRQ_Asserted; + +static INLINE void RecalcIntLevel(void) +{ + int ilevel = -1; + + for(int i = 4; i >= 0; i--) + { + if(IRQ_Asserted & (1 << i)) + { + ilevel = i; + break; + } + } + + VB_V810->SetInt(ilevel); +} + +void VBIRQ_Assert(int source, bool assert) +{ + assert(source >= 0 && source <= 4); + + IRQ_Asserted &= ~(1 << source); + + if(assert) + IRQ_Asserted |= 1 << source; + + RecalcIntLevel(); +} + + + +static uint8 HWCTRL_Read(v810_timestamp_t ×tamp, uint32 A) +{ + uint8 ret = 0; + + if(A & 0x3) + { + puts("HWCtrl Bogus Read?"); + return(ret); + } + + switch(A & 0xFF) + { + default: printf("Unknown HWCTRL Read: %08x\n", A); + break; + + case 0x18: + case 0x1C: + case 0x20: ret = TIMER_Read(timestamp, A); + break; + + case 0x24: ret = WCR | 0xFC; + break; + + case 0x10: + case 0x14: + case 0x28: ret = VBINPUT_Read(timestamp, A); + break; + + } + + return(ret); +} + +static void HWCTRL_Write(v810_timestamp_t ×tamp, uint32 A, uint8 V) +{ + if(A & 0x3) + { + puts("HWCtrl Bogus Write?"); + return; + } + + switch(A & 0xFF) + { + default: printf("Unknown HWCTRL Write: %08x %02x\n", A, V); + break; + + case 0x18: + case 0x1C: + case 0x20: TIMER_Write(timestamp, A, V); + break; + + case 0x24: WCR = V & 0x3; + break; + + case 0x10: + case 0x14: + case 0x28: VBINPUT_Write(timestamp, A, V); + break; + } +} + +uint8 MDFN_FASTCALL MemRead8(v810_timestamp_t ×tamp, uint32 A) +{ + uint8 ret = 0; + A &= (1 << 27) - 1; + + //if((A >> 24) <= 2) + // printf("Read8: %d %08x\n", timestamp, A); + + switch(A >> 24) + { + case 0: ret = VIP_Read8(timestamp, A); + break; + + case 1: break; + + case 2: ret = HWCTRL_Read(timestamp, A); + break; + + case 3: break; + case 4: break; + + case 5: ret = WRAM[A & 0xFFFF]; + break; + + case 6: if(GPRAM) + ret = GPRAM[A & GPRAM_Mask]; + else + printf("GPRAM(Unmapped) Read: %08x\n", A); + break; + + case 7: ret = GPROM[A & GPROM_Mask]; + break; + } + return(ret); +} + +uint16 MDFN_FASTCALL MemRead16(v810_timestamp_t ×tamp, uint32 A) +{ + uint16 ret = 0; + + A &= (1 << 27) - 1; + + //if((A >> 24) <= 2) + // printf("Read16: %d %08x\n", timestamp, A); + + + switch(A >> 24) + { + case 0: ret = VIP_Read16(timestamp, A); + break; + + case 1: break; + + case 2: ret = HWCTRL_Read(timestamp, A); + break; + + case 3: break; + + case 4: break; + + case 5: ret = MDFN_de16lsb(&WRAM[A & 0xFFFF]); + break; + + case 6: if(GPRAM) + ret = MDFN_de16lsb(&GPRAM[A & GPRAM_Mask]); + else printf("GPRAM(Unmapped) Read: %08x\n", A); + break; + + case 7: ret = MDFN_de16lsb(&GPROM[A & GPROM_Mask]); + break; + } + return(ret); +} + +void MDFN_FASTCALL MemWrite8(v810_timestamp_t ×tamp, uint32 A, uint8 V) +{ + A &= (1 << 27) - 1; + + //if((A >> 24) <= 2) + // printf("Write8: %d %08x %02x\n", timestamp, A, V); + + switch(A >> 24) + { + case 0: VIP_Write8(timestamp, A, V); + break; + + case 1: VB_VSU->Write((timestamp + VSU_CycleFix) >> 2, A, V); + break; + + case 2: HWCTRL_Write(timestamp, A, V); + break; + + case 3: break; + + case 4: break; + + case 5: WRAM[A & 0xFFFF] = V; + break; + + case 6: if(GPRAM) + GPRAM[A & GPRAM_Mask] = V; + break; + + case 7: // ROM, no writing allowed! + break; + } +} + +void MDFN_FASTCALL MemWrite16(v810_timestamp_t ×tamp, uint32 A, uint16 V) +{ + A &= (1 << 27) - 1; + + //if((A >> 24) <= 2) + // printf("Write16: %d %08x %04x\n", timestamp, A, V); + + switch(A >> 24) + { + case 0: VIP_Write16(timestamp, A, V); + break; + + case 1: VB_VSU->Write((timestamp + VSU_CycleFix) >> 2, A, V); + break; + + case 2: HWCTRL_Write(timestamp, A, V); + break; + + case 3: break; + + case 4: break; + + case 5: MDFN_en16lsb(&WRAM[A & 0xFFFF], V); + break; + + case 6: if(GPRAM) + MDFN_en16lsb(&GPRAM[A & GPRAM_Mask], V); + break; + + case 7: // ROM, no writing allowed! + break; + } +} + +static void FixNonEvents(void) +{ + if(next_vip_ts & 0x40000000) + next_vip_ts = VB_EVENT_NONONO; + + if(next_timer_ts & 0x40000000) + next_timer_ts = VB_EVENT_NONONO; + + if(next_input_ts & 0x40000000) + next_input_ts = VB_EVENT_NONONO; +} + +static void EventReset(void) +{ + next_vip_ts = VB_EVENT_NONONO; + next_timer_ts = VB_EVENT_NONONO; + next_input_ts = VB_EVENT_NONONO; +} + +static INLINE int32 CalcNextTS(void) +{ + int32 next_timestamp = next_vip_ts; + + if(next_timestamp > next_timer_ts) + next_timestamp = next_timer_ts; + + if(next_timestamp > next_input_ts) + next_timestamp = next_input_ts; + + return(next_timestamp); +} + +static void RebaseTS(const v810_timestamp_t timestamp) +{ + //printf("Rebase: %08x %08x %08x\n", timestamp, next_vip_ts, next_timer_ts); + + assert(next_vip_ts > timestamp); + assert(next_timer_ts > timestamp); + assert(next_input_ts > timestamp); + + next_vip_ts -= timestamp; + next_timer_ts -= timestamp; + next_input_ts -= timestamp; +} + +void VB_SetEvent(const int type, const v810_timestamp_t next_timestamp) +{ + //assert(next_timestamp > VB_V810->v810_timestamp); + + if(type == VB_EVENT_VIP) + next_vip_ts = next_timestamp; + else if(type == VB_EVENT_TIMER) + next_timer_ts = next_timestamp; + else if(type == VB_EVENT_INPUT) + next_input_ts = next_timestamp; + + if(next_timestamp < VB_V810->GetEventNT()) + VB_V810->SetEventNT(next_timestamp); +} + + +static int32 MDFN_FASTCALL EventHandler(const v810_timestamp_t timestamp) +{ + if(timestamp >= next_vip_ts) + next_vip_ts = VIP_Update(timestamp); + + if(timestamp >= next_timer_ts) + next_timer_ts = TIMER_Update(timestamp); + + if(timestamp >= next_input_ts) + next_input_ts = VBINPUT_Update(timestamp); + + return(CalcNextTS()); +} + +// Called externally from debug.cpp in some cases. +void ForceEventUpdates(const v810_timestamp_t timestamp) +{ + next_vip_ts = VIP_Update(timestamp); + next_timer_ts = TIMER_Update(timestamp); + next_input_ts = VBINPUT_Update(timestamp); + + VB_V810->SetEventNT(CalcNextTS()); + //printf("FEU: %d %d %d\n", next_vip_ts, next_timer_ts, next_input_ts); +} + +static void VB_Power(void) +{ + memset(WRAM, 0, 65536); + + VIP_Power(); + VB_VSU->Power(); + TIMER_Power(); + VBINPUT_Power(); + + EventReset(); + IRQ_Asserted = 0; + RecalcIntLevel(); + VB_V810->Reset(); + + VSU_CycleFix = 0; + WCR = 0; + + + ForceEventUpdates(0); //VB_V810->v810_timestamp); +} + +static void SettingChanged(const char *name) +{ + if(!strcasecmp(name, "vb.3dmode")) + { + // FIXME, TODO (complicated) + //VB3DMode = MDFN_GetSettingUI("vb.3dmode"); + //VIP_Set3DMode(VB3DMode); + } + else if(!strcasecmp(name, "vb.disable_parallax")) + { + VIP_SetParallaxDisable(MDFN_GetSettingB("vb.disable_parallax")); + } + else if(!strcasecmp(name, "vb.anaglyph.lcolor") || !strcasecmp(name, "vb.anaglyph.rcolor") || + !strcasecmp(name, "vb.anaglyph.preset") || !strcasecmp(name, "vb.default_color")) + + { + uint32 lcolor = MDFN_GetSettingUI("vb.anaglyph.lcolor"), rcolor = MDFN_GetSettingUI("vb.anaglyph.rcolor"); + int preset = MDFN_GetSettingI("vb.anaglyph.preset"); + + if(preset != ANAGLYPH_PRESET_DISABLED) + { + lcolor = AnaglyphPreset_Colors[preset][0]; + rcolor = AnaglyphPreset_Colors[preset][1]; + } + VIP_SetAnaglyphColors(lcolor, rcolor); + VIP_SetDefaultColor(MDFN_GetSettingUI("vb.default_color")); + } + else if(!strcasecmp(name, "vb.input.instant_read_hack")) + { + VBINPUT_SetInstantReadHack(MDFN_GetSettingB("vb.input.instant_read_hack")); + } + else if(!strcasecmp(name, "vb.instant_display_hack")) + VIP_SetInstantDisplayHack(MDFN_GetSettingB("vb.instant_display_hack")); + else if(!strcasecmp(name, "vb.allow_draw_skip")) + VIP_SetAllowDrawSkip(MDFN_GetSettingB("vb.allow_draw_skip")); + else + abort(); + + +} + +struct VB_HeaderInfo +{ + char game_title[256]; + uint32 game_code; + uint16 manf_code; + uint8 version; +}; + +static void ReadHeader(const uint8* const rom_data, const uint64 rom_size, VB_HeaderInfo *hi) +{ +#pragma message "iconv is giving compilation problems on simulator so i'll comment this method" +// iconv_t sjis_ict = iconv_open("UTF-8", "shift_jis"); +// +// if(sjis_ict != (iconv_t)-1) +// { +// char *in_ptr, *out_ptr; +// size_t ibl, obl; +// +// ibl = 20; +// obl = sizeof(hi->game_title) - 1; +// +// in_ptr = (char*)rom_data + (0xFFFFFDE0 & (rom_size - 1)); +// out_ptr = hi->game_title; +// +// iconv(sjis_ict, (ICONV_CONST char **)&in_ptr, &ibl, &out_ptr, &obl); +// iconv_close(sjis_ict); +// +// *out_ptr = 0; +// +// MDFN_RemoveControlChars(hi->game_title); +// MDFN_trim(hi->game_title); +// } +// else +// hi->game_title[0] = 0; +// +// hi->game_code = MDFN_de32lsb(rom_data + (0xFFFFFDFB & (rom_size - 1))); +// hi->manf_code = MDFN_de16lsb(rom_data + (0xFFFFFDF9 & (rom_size - 1))); +// hi->version = rom_data[0xFFFFFDFF & (rom_size - 1)]; +} + +static bool TestMagic(MDFNFILE *fp) +{ + if(!strcasecmp(fp->ext, "vb") || !strcasecmp(fp->ext, "vboy")) + return(true); + + return(false); +} + +static void Cleanup(void) +{ + VIP_Kill(); + + if(VB_VSU) + { + delete VB_VSU; + VB_VSU = NULL; + } + + if(VB_V810) + { + delete VB_V810; + VB_V810 = NULL; + WRAM = NULL; + GPRAM = NULL; + GPROM = NULL; + } +} + +static void Load(MDFNFILE *fp) +{ + try + { + const uint64 rom_size = fp->size(); + V810_Emu_Mode cpu_mode; + md5_context md5; + + VB_InDebugPeek = 0; + + cpu_mode = (V810_Emu_Mode)MDFN_GetSettingI("vb.cpu_emulation"); + + if(rom_size != round_up_pow2(rom_size)) + { + throw MDFN_Error(0, _("VB ROM image size is not a power of 2.")); + } + + if(rom_size < 256) + { + throw MDFN_Error(0, _("VB ROM image size is too small.")); + } + + if(rom_size > (1 << 24)) + { + throw MDFN_Error(0, _("VB ROM image size is too large.")); + } + + VB_V810 = new V810(); + VB_V810->Init(cpu_mode, true); + + VB_V810->SetMemReadHandlers(MemRead8, MemRead16, NULL); + VB_V810->SetMemWriteHandlers(MemWrite8, MemWrite16, NULL); + + VB_V810->SetIOReadHandlers(MemRead8, MemRead16, NULL); + VB_V810->SetIOWriteHandlers(MemWrite8, MemWrite16, NULL); + + for(int i = 0; i < 256; i++) + { + VB_V810->SetMemReadBus32(i, false); + VB_V810->SetMemWriteBus32(i, false); + } + + std::vector Map_Addresses; + + for(uint64 A = 0; A < 1ULL << 32; A += (1 << 27)) + { + for(uint64 sub_A = 5 << 24; sub_A < (6 << 24); sub_A += 65536) + { + Map_Addresses.push_back(A + sub_A); + } + } + + WRAM = VB_V810->SetFastMap(&Map_Addresses[0], 65536, Map_Addresses.size(), "WRAM"); + Map_Addresses.clear(); + + + // Round up the ROM size to 65536(we mirror it a little later) + GPROM_Mask = (rom_size < 65536) ? (65536 - 1) : (rom_size - 1); + + for(uint64 A = 0; A < 1ULL << 32; A += (1 << 27)) + { + for(uint64 sub_A = 7 << 24; sub_A < (8 << 24); sub_A += GPROM_Mask + 1) + { + Map_Addresses.push_back(A + sub_A); + //printf("%08x\n", (uint32)(A + sub_A)); + } + } + + + GPROM = VB_V810->SetFastMap(&Map_Addresses[0], GPROM_Mask + 1, Map_Addresses.size(), "Cart ROM"); + Map_Addresses.clear(); + + fp->read(GPROM, rom_size); + + // Mirror ROM images < 64KiB to 64KiB + for(uint64 i = rom_size; i < 65536; i += rom_size) + { + memcpy(GPROM + i, GPROM, rom_size); + } + + md5.starts(); + md5.update(GPROM, rom_size); + md5.finish(MDFNGameInfo->MD5); + + VB_HeaderInfo hinfo; + + ReadHeader(GPROM, rom_size, &hinfo); + + MDFN_printf(_("Title: %s\n"), hinfo.game_title); + MDFN_printf(_("Game ID Code: %u\n"), hinfo.game_code); + MDFN_printf(_("Manufacturer Code: %d\n"), hinfo.manf_code); + MDFN_printf(_("Version: %u\n"), hinfo.version); + + MDFN_printf(_("ROM: %uKiB\n"), (unsigned)(rom_size / 1024)); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + MDFN_printf("\n"); + + MDFN_printf(_("V810 Emulation Mode: %s\n"), (cpu_mode == V810_EMU_MODE_ACCURATE) ? _("Accurate") : _("Fast")); + + GPRAM_Mask = 0xFFFF; + + for(uint64 A = 0; A < 1ULL << 32; A += (1 << 27)) + { + for(uint64 sub_A = 6 << 24; sub_A < (7 << 24); sub_A += GPRAM_Mask + 1) + { + //printf("GPRAM: %08x\n", A + sub_A); + Map_Addresses.push_back(A + sub_A); + } + } + + + GPRAM = VB_V810->SetFastMap(&Map_Addresses[0], GPRAM_Mask + 1, Map_Addresses.size(), "Cart RAM"); + Map_Addresses.clear(); + + memset(GPRAM, 0, GPRAM_Mask + 1); + + try + { + std::unique_ptr gp = MDFN_AmbigGZOpenHelper(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), std::vector({ 65536 })); + + gp->read(GPRAM, 65536); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + + VIP_Init(); + VB_VSU = new VSU(); + VBINPUT_Init(); + + VB3DMode = MDFN_GetSettingUI("vb.3dmode"); + uint32 prescale = MDFN_GetSettingUI("vb.liprescale"); + uint32 sbs_separation = MDFN_GetSettingUI("vb.sidebyside.separation"); + + VIP_Set3DMode(VB3DMode, MDFN_GetSettingUI("vb.3dreverse"), prescale, sbs_separation); + + + //SettingChanged("vb.3dmode"); + SettingChanged("vb.disable_parallax"); + SettingChanged("vb.anaglyph.lcolor"); + SettingChanged("vb.anaglyph.rcolor"); + SettingChanged("vb.anaglyph.preset"); + SettingChanged("vb.default_color"); + + SettingChanged("vb.instant_display_hack"); + SettingChanged("vb.allow_draw_skip"); + + SettingChanged("vb.input.instant_read_hack"); + + MDFNGameInfo->fps = (int64)20000000 * 65536 * 256 / (259 * 384 * 4); + + + VB_Power(); + + + #ifdef WANT_DEBUGGER + VBDBG_Init(); + #endif + + + MDFNGameInfo->nominal_width = 384; + MDFNGameInfo->nominal_height = 224; + MDFNGameInfo->fb_width = 384; + MDFNGameInfo->fb_height = 224; + + switch(VB3DMode) + { + default: break; + + case VB3DMODE_VLI: + MDFNGameInfo->nominal_width = 768 * prescale; + MDFNGameInfo->nominal_height = 224; + MDFNGameInfo->fb_width = 768 * prescale; + MDFNGameInfo->fb_height = 224; + break; + + case VB3DMODE_HLI: + MDFNGameInfo->nominal_width = 384; + MDFNGameInfo->nominal_height = 448 * prescale; + MDFNGameInfo->fb_width = 384; + MDFNGameInfo->fb_height = 448 * prescale; + break; + + case VB3DMODE_CSCOPE: + MDFNGameInfo->nominal_width = 512; + MDFNGameInfo->nominal_height = 384; + MDFNGameInfo->fb_width = 512; + MDFNGameInfo->fb_height = 384; + break; + + case VB3DMODE_SIDEBYSIDE: + MDFNGameInfo->nominal_width = 384 * 2 + sbs_separation; + MDFNGameInfo->nominal_height = 224; + MDFNGameInfo->fb_width = 384 * 2 + sbs_separation; + MDFNGameInfo->fb_height = 224; + break; + } + MDFNGameInfo->lcm_width = MDFNGameInfo->fb_width; + MDFNGameInfo->lcm_height = MDFNGameInfo->fb_height; + + + MDFNMP_Init(32768, ((uint64)1 << 27) / 32768); + MDFNMP_AddRAM(65536, 5 << 24, WRAM); + if((GPRAM_Mask + 1) >= 32768) + MDFNMP_AddRAM(GPRAM_Mask + 1, 6 << 24, GPRAM); + } + catch(...) + { + Cleanup(); + throw; + } +} + +static void CloseGame(void) +{ + // Only save cart RAM if it has been modified. + for(unsigned int i = 0; i < GPRAM_Mask + 1; i++) + { + if(GPRAM[i]) + { + if(!MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), GPRAM, 65536)) + { + + } + break; + } + } + + Cleanup(); +} + +void VB_ExitLoop(void) +{ + VB_V810->Exit(); +} + +static void Emulate(EmulateSpecStruct *espec) +{ + v810_timestamp_t v810_timestamp; + + MDFNMP_ApplyPeriodicCheats(); + + VBINPUT_Frame(); + + if(espec->SoundFormatChanged) + VB_VSU->SetSoundRate(espec->SoundRate); + + VIP_StartFrame(espec); + + v810_timestamp = VB_V810->Run(EventHandler); + + FixNonEvents(); + ForceEventUpdates(v810_timestamp); + + espec->SoundBufSize = VB_VSU->EndFrame((v810_timestamp + VSU_CycleFix) >> 2, espec->SoundBuf, espec->SoundBufMaxSize); + + VSU_CycleFix = (v810_timestamp + VSU_CycleFix) & 3; + + espec->MasterCycles = v810_timestamp; + + TIMER_ResetTS(); + VBINPUT_ResetTS(); + VIP_ResetTS(); + + RebaseTS(v810_timestamp); + + VB_V810->ResetTS(0); +} + +} + +using namespace MDFN_IEN_VB; + +#ifdef WANT_DEBUGGER +static DebuggerInfoStruct DBGInfo = +{ + "shift_jis", + 4, + 2, // Instruction alignment(bytes) + 32, + 32, + 0x00000000, + ~0U, + + VBDBG_MemPeek, + VBDBG_Disassemble, + NULL, + NULL, //ForceIRQ, + NULL, + VBDBG_FlushBreakPoints, + VBDBG_AddBreakPoint, + VBDBG_SetCPUCallback, + VBDBG_EnableBranchTrace, + VBDBG_GetBranchTrace, + NULL, //KING_SetGraphicsDecode, + VBDBG_SetLogFunc, +}; +#endif + + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + const v810_timestamp_t timestamp = VB_V810->v810_timestamp; + + SFORMAT StateRegs[] = + { + SFARRAY(WRAM, 65536), + SFARRAY(GPRAM, GPRAM_Mask ? (GPRAM_Mask + 1) : 0), + SFVAR(WCR), + SFVAR(IRQ_Asserted), + SFVAR(VSU_CycleFix), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MAIN"); + + VB_V810->StateAction(sm, load, data_only); + + VB_VSU->StateAction(sm, load, data_only); + TIMER_StateAction(sm, load, data_only); + VBINPUT_StateAction(sm, load, data_only); + VIP_StateAction(sm, load, data_only); + + if(load) + { + // Needed to recalculate next_*_ts since we don't bother storing their deltas in save states. + ForceEventUpdates(timestamp); + } +} + +static void SetLayerEnableMask(uint64 mask) +{ + +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: + case MDFN_MSC_RESET: VB_Power(); break; + } +} + +static const MDFNSetting_EnumList V810Mode_List[] = +{ + { "fast", (int)V810_EMU_MODE_FAST, gettext_noop("Fast Mode"), gettext_noop("Fast mode trades timing accuracy, cache emulation, and executing from hardware registers and RAM not intended for code use for performance.")}, + { "accurate", (int)V810_EMU_MODE_ACCURATE, gettext_noop("Accurate Mode"), gettext_noop("Increased timing accuracy, though not perfect, along with cache emulation, at the cost of decreased performance. Additionally, even the pipeline isn't correctly and fully emulated in this mode.") }, + { NULL, 0 }, +}; + +static const MDFNSetting_EnumList VB3DMode_List[] = +{ + { "anaglyph", VB3DMODE_ANAGLYPH, gettext_noop("Anaglyph"), gettext_noop("Used in conjunction with classic dual-lens-color glasses.") }, + { "cscope", VB3DMODE_CSCOPE, gettext_noop("CyberScope"), gettext_noop("Intended for use with the CyberScope 3D device.") }, + { "sidebyside", VB3DMODE_SIDEBYSIDE, gettext_noop("Side-by-Side"), gettext_noop("The left-eye image is displayed on the left, and the right-eye image is displayed on the right.") }, +// { "overunder", VB3DMODE_OVERUNDER }, + { "vli", VB3DMODE_VLI, gettext_noop("Vertical Line Interlaced"), gettext_noop("Vertical lines alternate between left view and right view.") }, + { "hli", VB3DMODE_HLI, gettext_noop("Horizontal Line Interlaced"), gettext_noop("Horizontal lines alternate between left view and right view.") }, + { NULL, 0 }, +}; + +static const MDFNSetting_EnumList AnaglyphPreset_List[] = +{ + { "disabled", ANAGLYPH_PRESET_DISABLED, gettext_noop("Disabled"), gettext_noop("Forces usage of custom anaglyph colors.") }, + { "0", ANAGLYPH_PRESET_DISABLED }, + + { "red_blue", ANAGLYPH_PRESET_RED_BLUE, gettext_noop("Red/Blue"), gettext_noop("Classic red/blue anaglyph.") }, + { "red_cyan", ANAGLYPH_PRESET_RED_CYAN, gettext_noop("Red/Cyan"), gettext_noop("Improved quality red/cyan anaglyph.") }, + { "red_electriccyan", ANAGLYPH_PRESET_RED_ELECTRICCYAN, gettext_noop("Red/Electric Cyan"), gettext_noop("Alternate version of red/cyan") }, + { "red_green", ANAGLYPH_PRESET_RED_GREEN, gettext_noop("Red/Green") }, + { "green_magenta", ANAGLYPH_PRESET_GREEN_MAGENTA, gettext_noop("Green/Magenta") }, + { "yellow_blue", ANAGLYPH_PRESET_YELLOW_BLUE, gettext_noop("Yellow/Blue") }, + + { NULL, 0 }, +}; + +static MDFNSetting VBSettings[] = +{ + { "vb.cpu_emulation", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("CPU emulation mode."), NULL, MDFNST_ENUM, "fast", NULL, NULL, NULL, NULL, V810Mode_List }, + { "vb.input.instant_read_hack", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Input latency reduction hack."), gettext_noop("Reduces latency in some games by 20ms by returning the current pad state, rather than latched state, on serial port data reads. This hack may cause some homebrew software to malfunction, but it should be relatively safe for commercial official games."), MDFNST_BOOL, "1", NULL, NULL, NULL, SettingChanged }, + + { "vb.instant_display_hack", MDFNSF_NOFLAGS, gettext_noop("Display latency reduction hack."), gettext_noop("Reduces latency in games by displaying the framebuffer 20ms earlier. This hack has some potential of causing graphical glitches, so it is disabled by default."), MDFNST_BOOL, "0", NULL, NULL, NULL, SettingChanged }, + { "vb.allow_draw_skip", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Allow draw skipping."), gettext_noop("If vb.instant_display_hack is set to \"1\", and this setting is set to \"1\", then frame-skipping the drawing to the emulated framebuffer will be allowed. THIS WILL CAUSE GRAPHICAL GLITCHES, AND THEORETICALLY(but unlikely) GAME CRASHES, ESPECIALLY WITH DIRECT FRAMEBUFFER DRAWING GAMES."), MDFNST_BOOL, "0", NULL, NULL, NULL, SettingChanged }, + + // FIXME: We're going to have to set up some kind of video mode change notification for changing vb.3dmode while the game is running to work properly. + { "vb.3dmode", MDFNSF_NOFLAGS, gettext_noop("3D mode."), NULL, MDFNST_ENUM, "anaglyph", NULL, NULL, NULL, /*SettingChanged*/NULL, VB3DMode_List }, + { "vb.liprescale", MDFNSF_NOFLAGS, gettext_noop("Line Interlaced prescale."), NULL, MDFNST_UINT, "2", "1", "10", NULL, NULL }, + + { "vb.disable_parallax", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Disable parallax for BG and OBJ rendering."), NULL, MDFNST_BOOL, "0", NULL, NULL, NULL, SettingChanged }, + { "vb.default_color", MDFNSF_NOFLAGS, gettext_noop("Default maximum-brightness color to use in non-anaglyph 3D modes."), NULL, MDFNST_UINT, "0xF0F0F0", "0x000000", "0xFFFFFF", NULL, SettingChanged }, + + { "vb.anaglyph.preset", MDFNSF_NOFLAGS, gettext_noop("Anaglyph preset colors."), NULL, MDFNST_ENUM, "red_blue", NULL, NULL, NULL, SettingChanged, AnaglyphPreset_List }, + { "vb.anaglyph.lcolor", MDFNSF_NOFLAGS, gettext_noop("Anaglyph maximum-brightness color for left view."), NULL, MDFNST_UINT, "0xffba00", "0x000000", "0xFFFFFF", NULL, SettingChanged }, + { "vb.anaglyph.rcolor", MDFNSF_NOFLAGS, gettext_noop("Anaglyph maximum-brightness color for right view."), NULL, MDFNST_UINT, "0x00baff", "0x000000", "0xFFFFFF", NULL, SettingChanged }, + + { "vb.sidebyside.separation", MDFNSF_NOFLAGS, gettext_noop("Number of pixels to separate L/R views by."), gettext_noop("This setting refers to pixels before vb.xscale(fs) scaling is taken into consideration. For example, a value of \"100\" here will result in a separation of 300 screen pixels if vb.xscale(fs) is set to \"3\"."), MDFNST_UINT, /*"96"*/"0", "0", "1024", NULL, NULL }, + + { "vb.3dreverse", MDFNSF_NOFLAGS, gettext_noop("Reverse left/right 3D views."), NULL, MDFNST_BOOL, "0", NULL, NULL, NULL, SettingChanged }, + { NULL } +}; + + +static const IDIISG IDII = +{ + { "a", "A", 7, IDIT_BUTTON_CAN_RAPID, NULL }, + { "b", "B", 6, IDIT_BUTTON_CAN_RAPID, NULL }, + { "rt", "Right-Back", 13, IDIT_BUTTON, NULL }, + { "lt", "Left-Back", 12, IDIT_BUTTON, NULL }, + + { "up-r", "UP ↑ (Right D-Pad)", 8, IDIT_BUTTON, "down-r" }, + { "right-r", "RIGHT → (Right D-Pad)", 11, IDIT_BUTTON, "left-r" }, + + { "right-l", "RIGHT → (Left D-Pad)", 3, IDIT_BUTTON, "left-l" }, + { "left-l", "LEFT ← (Left D-Pad)", 2, IDIT_BUTTON, "right-l" }, + { "down-l", "DOWN ↓ (Left D-Pad)", 1, IDIT_BUTTON, "up-l" }, + { "up-l", "UP ↑ (Left D-Pad)", 0, IDIT_BUTTON, "down-l" }, + + { "start", "Start", 5, IDIT_BUTTON, NULL }, + { "select", "Select", 4, IDIT_BUTTON, NULL }, + + { "left-r", "LEFT ← (Right D-Pad)", 10, IDIT_BUTTON, "right-r" }, + { "down-r", "DOWN ↓ (Right D-Pad)", 9, IDIT_BUTTON, "up-r" }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + IDII, + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo, "gamepad" } +}; + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".vb", gettext_noop("Nintendo Virtual Boy") }, + { ".vboy", gettext_noop("Nintendo Virtual Boy") }, + { NULL, NULL } +}; + +MDFNGI EmulatedVB = +{ + "vb", + "Virtual Boy", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &DBGInfo, + #else + NULL, // Debug info + #endif + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + SetLayerEnableMask, + NULL, // Layer names, null-delimited + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + VBINPUT_SetInput, + NULL, + DoSimpleCommand, + VBSettings, + MDFN_MASTERCLOCK_FIXED(VB_MASTER_CLOCK), + 0, + false, // Multires possible? + + 0, // lcm_width + 0, // lcm_height + NULL, // Dummy + + 384, // Nominal width + 224, // Nominal height + + 384, // Framebuffer width + 256, // Framebuffer height + + 2, // Number of output sound channels +}; diff --git a/Mednafen/mednafen/vb/vb.h b/Mednafen/mednafen/vb/vb.h new file mode 100644 index 0000000000..e6455b0b9b --- /dev/null +++ b/Mednafen/mednafen/vb/vb.h @@ -0,0 +1,62 @@ +#ifndef __VB_VB_H +#define __VB_VB_H + +#include +#include +#include + +namespace MDFN_IEN_VB +{ + +enum +{ + VB3DMODE_ANAGLYPH = 0, + VB3DMODE_CSCOPE = 1, + VB3DMODE_SIDEBYSIDE = 2, + VB3DMODE_OVERUNDER = 3, + VB3DMODE_VLI, + VB3DMODE_HLI +}; + +#define VB_MASTER_CLOCK 20000000.0 + + + +enum +{ + VB_EVENT_VIP = 0, + VB_EVENT_TIMER, + VB_EVENT_INPUT, +// VB_EVENT_COMM +}; + +#define VB_EVENT_NONONO 0x7fffffff + +void VB_SetEvent(const int type, const v810_timestamp_t next_timestamp); + + +#define VBIRQ_SOURCE_INPUT 0 +#define VBIRQ_SOURCE_TIMER 1 +#define VBIRQ_SOURCE_EXPANSION 2 +#define VBIRQ_SOURCE_COMM 3 +#define VBIRQ_SOURCE_VIP 4 + +void VBIRQ_Assert(int source, bool assert); + +void VB_ExitLoop(void); + +void ForceEventUpdates(const v810_timestamp_t timestamp); + + +uint8 MDFN_FASTCALL MemRead8(v810_timestamp_t ×tamp, uint32 A); +uint16 MDFN_FASTCALL MemRead16(v810_timestamp_t ×tamp, uint32 A); + +void MDFN_FASTCALL MemWrite8(v810_timestamp_t ×tamp, uint32 A, uint8 V); +void MDFN_FASTCALL MemWrite16(v810_timestamp_t ×tamp, uint32 A, uint16 V); + + + +extern int32 VB_InDebugPeek; +} + +#endif diff --git a/Mednafen/mednafen/vb/vip.cpp b/Mednafen/mednafen/vb/vip.cpp new file mode 100644 index 0000000000..26836299df --- /dev/null +++ b/Mednafen/mednafen/vb/vip.cpp @@ -0,0 +1,1688 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vb.h" +#include "vip.h" +#include + +#define VIP_DBGMSG(format, ...) { } +//#define VIP_DBGMSG(format, ...) printf(format "\n", ## __VA_ARGS__) + +namespace MDFN_IEN_VB +{ + +static uint8 FB[2][2][0x6000]; +static uint16 CHR_RAM[0x8000 / sizeof(uint16)]; +static uint16 DRAM[0x20000 / sizeof(uint16)]; + +// Helper functions for the V810 VIP RAM read/write handlers. +// "Memory Array 16 (Write/Read) (16/8)" +#define VIP__GETP16(array, address) ( (uint16 *)&((uint8 *)(array))[(address)] ) + +#ifdef MSB_FIRST +#define VIP__GETP8(array, address) ( &((uint8 *)(array))[(address) ^ 1] ) +#else +#define VIP__GETP8(array, address) ( &((uint8 *)(array))[(address)] ) +#endif + +static INLINE void VIP_MA16W16(uint16 *array, const uint32 v810_address, const uint16 value) +{ + *(VIP__GETP16(array, v810_address)) = value; +} + +static INLINE uint16 VIP_MA16R16(uint16 *array, const uint32 v810_address) +{ + return *(VIP__GETP16(array, v810_address)); +} + +static INLINE void VIP_MA16W8(uint16 *array, const uint32 v810_address, const uint8 value) +{ + *(VIP__GETP8(array, v810_address)) = value; +} + +static INLINE uint8 VIP_MA16R8(uint16 *array, const uint32 v810_address) +{ + return *(VIP__GETP8(array, v810_address)); +} + + +#define INT_SCAN_ERR 0x0001 +#define INT_LFB_END 0x0002 +#define INT_RFB_END 0x0004 +#define INT_GAME_START 0x0008 +#define INT_FRAME_START 0x0010 + +#define INT_SB_HIT 0x2000 +#define INT_XP_END 0x4000 +#define INT_TIME_ERR 0x8000 + +static uint16 InterruptPending; +static uint16 InterruptEnable; + +static uint8 BRTA, BRTB, BRTC, REST; +static uint8 Repeat; + +static void CopyFBColumnToTarget_Anaglyph(void) NO_INLINE; +static void CopyFBColumnToTarget_AnaglyphSlow(void) NO_INLINE; +static void CopyFBColumnToTarget_CScope(void) NO_INLINE; +static void CopyFBColumnToTarget_SideBySide(void) NO_INLINE; +static void CopyFBColumnToTarget_VLI(void) NO_INLINE; +static void CopyFBColumnToTarget_HLI(void) NO_INLINE; +static void (*CopyFBColumnToTarget)(void) = NULL; +static uint32 VB3DMode; +static uint32 VB3DReverse; +static uint32 VBPrescale; +static uint32 VBSBS_Separation; +static uint32 HLILUT[256]; +static uint32 ColorLUT[2][256]; +static int32 BrightnessCache[4]; +static uint32 BrightCLUT[2][4]; + +static double ColorLUTNoGC[2][256][3]; +static uint32 AnaSlowColorLUT[256][256]; + +// A few settings: +static bool InstantDisplayHack; +static bool AllowDrawSkip; + +static bool VidSettingsDirty; +static bool ParallaxDisabled; +static uint32 Anaglyph_Colors[2]; +static uint32 Default_Color; + +static void MakeColorLUT(const MDFN_PixelFormat &format) +{ + for(int lr = 0; lr < 2; lr++) + { + for(int i = 0; i < 256; i++) + { + double r, g, b; + double r_prime, g_prime, b_prime; + + r = g = b = (double)i / 255; + + // TODO: Use correct gamma curve, instead of approximation. + r_prime = pow(r, 1.0 / 2.2); + g_prime = pow(g, 1.0 / 2.2); + b_prime = pow(b, 1.0 / 2.2); + + switch(VB3DMode) + { + case VB3DMODE_ANAGLYPH: + r_prime = r_prime * ((Anaglyph_Colors[lr ^ VB3DReverse] >> 16) & 0xFF) / 255; + g_prime = g_prime * ((Anaglyph_Colors[lr ^ VB3DReverse] >> 8) & 0xFF) / 255; + b_prime = b_prime * ((Anaglyph_Colors[lr ^ VB3DReverse] >> 0) & 0xFF) / 255; + break; + default: + r_prime = r_prime * ((Default_Color >> 16) & 0xFF) / 255; + g_prime = g_prime * ((Default_Color >> 8) & 0xFF) / 255; + b_prime = b_prime * ((Default_Color >> 0) & 0xFF) / 255; + break; + } + ColorLUTNoGC[lr][i][0] = pow(r_prime, 2.2 / 1.0); + ColorLUTNoGC[lr][i][1] = pow(g_prime, 2.2 / 1.0); + ColorLUTNoGC[lr][i][2] = pow(b_prime, 2.2 / 1.0); + + ColorLUT[lr][i] = format.MakeColor((int)(r_prime * 255), (int)(g_prime * 255), (int)(b_prime * 255), 0); + } + } + + // Anaglyph slow-mode LUT calculation + for(int l_b = 0; l_b < 256; l_b++) + { + for(int r_b = 0; r_b < 256; r_b++) + { + double r, g, b; + double r_prime, g_prime, b_prime; + + r = ColorLUTNoGC[0][l_b][0] + ColorLUTNoGC[1][r_b][0]; + g = ColorLUTNoGC[0][l_b][1] + ColorLUTNoGC[1][r_b][1]; + b = ColorLUTNoGC[0][l_b][2] + ColorLUTNoGC[1][r_b][2]; + + if(r > 1.0) + r = 1.0; + if(g > 1.0) + g = 1.0; + if(b > 1.0) + b = 1.0; + + r_prime = pow(r, 1.0 / 2.2); + g_prime = pow(g, 1.0 / 2.2); + b_prime = pow(b, 1.0 / 2.2); + + AnaSlowColorLUT[l_b][r_b] = format.MakeColor((int)(r_prime * 255), (int)(g_prime * 255), (int)(b_prime * 255), 0); + } + } +} + +static void RecalcBrightnessCache(void) +{ + //printf("BRTA: %d, BRTB: %d, BRTC: %d, Rest: %d\n", BRTA, BRTB, BRTC, REST); + int32 CumulativeTime = (BRTA + 1 + BRTB + 1 + BRTC + 1 + REST + 1) + 1; + int32 MaxTime = 128; + + BrightnessCache[0] = 0; + BrightnessCache[1] = 0; + BrightnessCache[2] = 0; + BrightnessCache[3] = 0; + + for(int i = 0; i < Repeat + 1; i++) + { + int32 btemp[4]; + + if((i * CumulativeTime) >= MaxTime) + break; + + btemp[1] = (i * CumulativeTime) + BRTA; + if(btemp[1] > MaxTime) + btemp[1] = MaxTime; + btemp[1] -= (i * CumulativeTime); + if(btemp[1] < 0) + btemp[1] = 0; + + + btemp[2] = (i * CumulativeTime) + BRTA + 1 + BRTB; + if(btemp[2] > MaxTime) + btemp[2] = MaxTime; + btemp[2] -= (i * CumulativeTime) + BRTA + 1; + if(btemp[2] < 0) + btemp[2] = 0; + + //btemp[3] = (i * CumulativeTime) + BRTA + 1 + BRTB + 1 + BRTC; + //if(btemp[3] > MaxTime) + // btemp[3] = MaxTime; + //btemp[3] -= (i * CumulativeTime); + //if(btemp[3] < 0) + // btemp[3] = 0; + + btemp[3] = (i * CumulativeTime) + BRTA + BRTB + BRTC + 1; + if(btemp[3] > MaxTime) + btemp[3] = MaxTime; + btemp[3] -= (i * CumulativeTime) + 1; + if(btemp[3] < 0) + btemp[3] = 0; + + BrightnessCache[1] += btemp[1]; + BrightnessCache[2] += btemp[2]; + BrightnessCache[3] += btemp[3]; + } + + //printf("BC: %d %d %d %d\n", BrightnessCache[0], BrightnessCache[1], BrightnessCache[2], BrightnessCache[3]); + + for(int i = 0; i < 4; i++) + BrightnessCache[i] = 255 * BrightnessCache[i] / MaxTime; + + for(int lr = 0; lr < 2; lr++) + for(int i = 0; i < 4; i++) + { + BrightCLUT[lr][i] = ColorLUT[lr][BrightnessCache[i]]; + } +} + +static void Recalc3DModeStuff(bool non_rgb_output = false) +{ + switch(VB3DMode) + { + default: + if(((Anaglyph_Colors[0] & 0xFF) && (Anaglyph_Colors[1] & 0xFF)) || + ((Anaglyph_Colors[0] & 0xFF00) && (Anaglyph_Colors[1] & 0xFF00)) || + ((Anaglyph_Colors[0] & 0xFF0000) && (Anaglyph_Colors[1] & 0xFF0000)) || + non_rgb_output) + { + CopyFBColumnToTarget = CopyFBColumnToTarget_AnaglyphSlow; + } + else + CopyFBColumnToTarget = CopyFBColumnToTarget_Anaglyph; + break; + + case VB3DMODE_CSCOPE: + CopyFBColumnToTarget = CopyFBColumnToTarget_CScope; + break; + + case VB3DMODE_SIDEBYSIDE: + CopyFBColumnToTarget = CopyFBColumnToTarget_SideBySide; + break; + + case VB3DMODE_VLI: + CopyFBColumnToTarget = CopyFBColumnToTarget_VLI; + break; + + case VB3DMODE_HLI: + CopyFBColumnToTarget = CopyFBColumnToTarget_HLI; + break; + } + RecalcBrightnessCache(); +} + +void VIP_Set3DMode(uint32 mode, bool reverse, uint32 prescale, uint32 sbs_separation) +{ + VB3DMode = mode; + VB3DReverse = reverse ? 1 : 0; + VBPrescale = prescale; + VBSBS_Separation = sbs_separation; + + VidSettingsDirty = true; + + for(uint32 p = 0; p < 256; p++) + { + uint32 v; + uint8 s[4]; + + s[0] = (p >> 0) & 0x3; + s[1] = (p >> 2) & 0x3; + s[2] = (p >> 4) & 0x3; + s[3] = (p >> 6) & 0x3; + + v = 0; + for(unsigned int i = 0, shifty = 0; i < 4; i++) + { + for(unsigned int ps = 0; ps < prescale; ps++) + { + v |= s[i] << shifty; + shifty += 2; + } + } + + HLILUT[p] = v; + } +} + +void VIP_SetParallaxDisable(bool disabled) +{ + ParallaxDisabled = disabled; +} + +void VIP_SetDefaultColor(uint32 default_color) +{ + Default_Color = default_color; + + VidSettingsDirty = true; +} + + +void VIP_SetAnaglyphColors(uint32 lcolor, uint32 rcolor) +{ + Anaglyph_Colors[0] = lcolor; + Anaglyph_Colors[1] = rcolor; + + VidSettingsDirty = true; +} + +void VIP_SetInstantDisplayHack(bool val) +{ + InstantDisplayHack = val; +} + +void VIP_SetAllowDrawSkip(bool val) +{ + AllowDrawSkip = val; +} + + +static uint16 FRMCYC; + +static uint16 DPCTRL; +static bool DisplayActive; + +#define XPCTRL_XP_RST 0x0001 +#define XPCTRL_XP_EN 0x0002 +static uint16 XPCTRL; +static uint16 SBCMP; // Derived from XPCTRL + +static uint16 SPT[4]; // SPT0~SPT3, 5f848~5f84e +static uint16 GPLT[4]; +static uint8 GPLT_Cache[4][4]; + +static INLINE void Recalc_GPLT_Cache(int which) +{ + for(int i = 0; i < 4; i++) + GPLT_Cache[which][i] = (GPLT[which] >> (i * 2)) & 3; +} + +static uint16 JPLT[4]; +static uint8 JPLT_Cache[4][4]; + +static INLINE void Recalc_JPLT_Cache(int which) +{ + for(int i = 0; i < 4; i++) + JPLT_Cache[which][i] = (JPLT[which] >> (i * 2)) & 3; +} + + +static uint16 BKCOL; + +// +// +// +static int32 CalcNextEvent(void); + +static int32 last_ts; + +static int32 Column; +static int32 ColumnCounter; + +static int32 DisplayRegion; +static bool DisplayFB; + +static int32 GameFrameCounter; + +static int32 DrawingCounter; +static bool DrawingActive; +static bool DrawingFB; +static uint32 DrawingBlock; +static int32 SB_Latch; +static int32 SBOUT_InactiveTime; + +//static uint8 CTA_L, CTA_R; + +static void CheckIRQ(void) +{ + VBIRQ_Assert(VBIRQ_SOURCE_VIP, (bool)(InterruptEnable & InterruptPending)); + + #if 0 + printf("%08x\n", InterruptEnable & InterruptPending); + if((bool)(InterruptEnable & InterruptPending)) + puts("IRQ asserted"); + else + puts("IRQ not asserted"); + #endif +} + + +void VIP_Init(void) +{ + InstantDisplayHack = false; + AllowDrawSkip = false; + ParallaxDisabled = false; + Anaglyph_Colors[0] = 0xFF0000; + Anaglyph_Colors[1] = 0x0000FF; + VB3DMode = VB3DMODE_ANAGLYPH; + Default_Color = 0xFFFFFF; + VB3DReverse = 0; + VBPrescale = 1; + VBSBS_Separation = 0; + + VidSettingsDirty = true; +} + +void VIP_Kill(void) +{ + + +} + +void VIP_Power(void) +{ + Repeat = 0; + SB_Latch = 0; + SBOUT_InactiveTime = -1; + last_ts = 0; + + Column = 0; + ColumnCounter = 259; + + DisplayRegion = 0; + DisplayFB = 0; + + GameFrameCounter = 0; + + DrawingCounter = 0; + DrawingActive = false; + DrawingFB = 0; + DrawingBlock = 0; + + DPCTRL = 2; + DisplayActive = false; + + + + memset(FB, 0, 0x6000 * 2 * 2); + memset(CHR_RAM, 0, 0x8000); + memset(DRAM, 0, 0x20000); + + InterruptPending = 0; + InterruptEnable = 0; + + BRTA = 0; + BRTB = 0; + BRTC = 0; + REST = 0; + + FRMCYC = 0; + + XPCTRL = 0; + SBCMP = 0; + + for(int i = 0; i < 4; i++) + { + SPT[i] = 0; + GPLT[i] = 0; + JPLT[i] = 0; + + Recalc_GPLT_Cache(i); + Recalc_JPLT_Cache(i); + } + + BKCOL = 0; +} + +static INLINE uint16 ReadRegister(int32 ×tamp, uint32 A) +{ + uint16 ret = 0; //0xFFFF; + + if(A & 1) + VIP_DBGMSG("Misaligned VIP Read: %08x", A); + + switch(A & 0xFE) + { + default: VIP_DBGMSG("Unknown VIP register read: %08x", A); + break; + + case 0x00: ret = InterruptPending; + break; + + case 0x02: ret = InterruptEnable; + break; + + case 0x20: //printf("Read DPSTTS at %d\n", timestamp); + ret = DPCTRL & 0x702; + if((DisplayRegion & 1) && DisplayActive) + { + unsigned int DPBSY = 1 << ((DisplayRegion >> 1) & 1); + + if(DisplayFB) + DPBSY <<= 2; + + ret |= DPBSY << 2; + } + //if(!(DisplayRegion & 1)) // FIXME? (Had to do it this way for Galactic Pinball...) + ret |= 1 << 6; + break; + + // Note: Upper bits of BRTA, BRTB, BRTC, and REST(?) are 0 when read(on real hardware) + case 0x24: ret = BRTA; + break; + + case 0x26: ret = BRTB; + break; + + case 0x28: ret = BRTC; + break; + + case 0x2A: ret = REST; + break; + + case 0x30: ret = 0xFFFF; + break; + + case 0x40: ret = XPCTRL & 0x2; + if(DrawingActive) + { + ret |= (1 + DrawingFB) << 2; + } + if(timestamp < SBOUT_InactiveTime) + { + ret |= 0x8000; + ret |= /*DrawingBlock*/SB_Latch << 8; + } + break; // XPSTTS, read-only + + case 0x44: ret = 2; // VIP version. 2 is a known valid version, while the validity of other numbers is unknown, so we'll just go with 2. + break; + + case 0x48: + case 0x4a: + case 0x4c: + case 0x4e: ret = SPT[(A >> 1) & 3]; + break; + + case 0x60: + case 0x62: + case 0x64: + case 0x66: ret = GPLT[(A >> 1) & 3]; + break; + + case 0x68: + case 0x6a: + case 0x6c: + case 0x6e: ret = JPLT[(A >> 1) & 3]; + break; + + case 0x70: ret = BKCOL; + break; + } + + return(ret); +} + +static INLINE void WriteRegister(int32 ×tamp, uint32 A, uint16 V) +{ + if(A & 1) + VIP_DBGMSG("Misaligned VIP Write: %08x %04x", A, V); + + switch(A & 0xFE) + { + default: VIP_DBGMSG("Unknown VIP register write: %08x %04x", A, V); + break; + + case 0x00: break; // Interrupt pending, read-only + + case 0x02: { + InterruptEnable = V & 0xE01F; + + VIP_DBGMSG("Interrupt Enable: %04x", V); + + if(V & 0x2000) + VIP_DBGMSG("Warning: VIP SB Hit Interrupt enable: %04x\n", V); + CheckIRQ(); + } + break; + + case 0x04: InterruptPending &= ~V; + CheckIRQ(); + break; + + case 0x20: break; // Display control, read-only. + + case 0x22: DPCTRL = V & (0x703); // Display-control, write-only + if(V & 1) + { + DisplayActive = false; + InterruptPending &= ~(INT_TIME_ERR | INT_FRAME_START | INT_GAME_START | INT_RFB_END | INT_LFB_END | INT_SCAN_ERR); + CheckIRQ(); + } + break; + + case 0x24: BRTA = V & 0xFF; // BRTA + RecalcBrightnessCache(); + break; + + case 0x26: BRTB = V & 0xFF; // BRTB + RecalcBrightnessCache(); + break; + + case 0x28: BRTC = V & 0xFF; // BRTC + RecalcBrightnessCache(); + break; + + case 0x2A: REST = V & 0xFF; // REST + RecalcBrightnessCache(); + break; + + case 0x2E: FRMCYC = V & 0xF; // FRMCYC, write-only? + break; + + case 0x30: break; // CTA, read-only( + + case 0x40: break; // XPSTTS, read-only + + case 0x42: XPCTRL = V & 0x0002; // XPCTRL, write-only + SBCMP = (V >> 8) & 0x1F; + + if(V & 1) + { + VIP_DBGMSG("XPRST"); + DrawingActive = 0; + DrawingCounter = 0; + InterruptPending &= ~(INT_SB_HIT | INT_XP_END | INT_TIME_ERR); + CheckIRQ(); + } + break; + + case 0x44: break; // Version Control, read-only? + + case 0x48: + case 0x4a: + case 0x4c: + case 0x4e: SPT[(A >> 1) & 3] = V & 0x3FF; + break; + + case 0x60: + case 0x62: + case 0x64: + case 0x66: GPLT[(A >> 1) & 3] = V & 0xFC; + Recalc_GPLT_Cache((A >> 1) & 3); + break; + + case 0x68: + case 0x6a: + case 0x6c: + case 0x6e: JPLT[(A >> 1) & 3] = V & 0xFC; + Recalc_JPLT_Cache((A >> 1) & 3); + break; + + case 0x70: BKCOL = V & 0x3; + break; + + } +} + +// +// Don't update the VIP state on reads/writes, the event system will update it with enough precision as far as VB software cares. +// + +uint8 VIP_Read8(int32 ×tamp, uint32 A) +{ + uint8 ret = 0; //0xFF; + + //VIP_Update(timestamp); + + switch(A >> 16) + { + case 0x0: + case 0x1: + if((A & 0x7FFF) >= 0x6000) + { + ret = VIP_MA16R8(CHR_RAM, (A & 0x1FFF) | ((A >> 2) & 0x6000)); + } + else + { + ret = FB[(A >> 15) & 1][(A >> 16) & 1][A & 0x7FFF]; + } + break; + + case 0x2: + case 0x3: ret = VIP_MA16R8(DRAM, A & 0x1FFFF); + break; + + case 0x4: + case 0x5: if(A >= 0x5E000) + ret = ReadRegister(timestamp, A); + else + VIP_DBGMSG("Unknown VIP Read: %08x", A); + break; + + case 0x6: break; + + case 0x7: if(A >= 0x8000) + { + ret = VIP_MA16R8(CHR_RAM, A & 0x7FFF); + } + else + VIP_DBGMSG("Unknown VIP Read: %08x", A); + break; + + default: VIP_DBGMSG("Unknown VIP Read: %08x", A); + break; + } + + + //VB_SetEvent(VB_EVENT_VIP, timestamp + CalcNextEvent()); + + return(ret); +} + +uint16 VIP_Read16(int32 ×tamp, uint32 A) +{ + uint16 ret = 0; //0xFFFF; + + //VIP_Update(timestamp); + + switch(A >> 16) + { + case 0x0: + case 0x1: + if((A & 0x7FFF) >= 0x6000) + { + ret = VIP_MA16R16(CHR_RAM, (A & 0x1FFF) | ((A >> 2) & 0x6000)); + } + else + { + ret = MDFN_de16lsb(&FB[(A >> 15) & 1][(A >> 16) & 1][A & 0x7FFF]); + } + break; + + case 0x2: + case 0x3: ret = VIP_MA16R16(DRAM, A & 0x1FFFF); + break; + + case 0x4: + case 0x5: + if(A >= 0x5E000) + ret = ReadRegister(timestamp, A); + else + VIP_DBGMSG("Unknown VIP Read: %08x", A); + break; + + case 0x6: break; + + case 0x7: if(A >= 0x8000) + { + ret = VIP_MA16R16(CHR_RAM, A & 0x7FFF); + } + else + VIP_DBGMSG("Unknown VIP Read: %08x", A); + break; + + default: VIP_DBGMSG("Unknown VIP Read: %08x", A); + break; + } + + + //VB_SetEvent(VB_EVENT_VIP, timestamp + CalcNextEvent()); + return(ret); +} + +void VIP_Write8(int32 ×tamp, uint32 A, uint8 V) +{ + //VIP_Update(timestamp); + + //if(A >= 0x3DC00 && A < 0x3E000) + // printf("%08x %02x\n", A, V); + + switch(A >> 16) + { + case 0x0: + case 0x1: + if((A & 0x7FFF) >= 0x6000) + VIP_MA16W8(CHR_RAM, (A & 0x1FFF) | ((A >> 2) & 0x6000), V); + else + FB[(A >> 15) & 1][(A >> 16) & 1][A & 0x7FFF] = V; + break; + + case 0x2: + case 0x3: VIP_MA16W8(DRAM, A & 0x1FFFF, V); + break; + + case 0x4: + case 0x5: if(A >= 0x5E000) + WriteRegister(timestamp, A, V); + else + VIP_DBGMSG("Unknown VIP Write: %08x %02x", A, V); + break; + + case 0x6: VIP_DBGMSG("Unknown VIP Write: %08x %02x", A, V); + break; + + case 0x7: if(A >= 0x8000) + VIP_MA16W8(CHR_RAM, A & 0x7FFF, V); + else + VIP_DBGMSG("Unknown VIP Write: %08x %02x", A, V); + break; + + default: VIP_DBGMSG("Unknown VIP Write: %08x %02x", A, V); + break; + } + + //VB_SetEvent(VB_EVENT_VIP, timestamp + CalcNextEvent()); +} + +void VIP_Write16(int32 ×tamp, uint32 A, uint16 V) +{ + //VIP_Update(timestamp); + + //if(A >= 0x3DC00 && A < 0x3E000) + // printf("%08x %04x\n", A, V); + + switch(A >> 16) + { + case 0x0: + case 0x1: + if((A & 0x7FFF) >= 0x6000) + VIP_MA16W16(CHR_RAM, (A & 0x1FFF) | ((A >> 2) & 0x6000), V); + else + MDFN_en16lsb(&FB[(A >> 15) & 1][(A >> 16) & 1][A & 0x7FFF], V); + break; + + case 0x2: + case 0x3: VIP_MA16W16(DRAM, A & 0x1FFFF, V); + break; + + case 0x4: + case 0x5: if(A >= 0x5E000) + WriteRegister(timestamp, A, V); + else + VIP_DBGMSG("Unknown VIP Write: %08x %04x", A, V); + break; + + case 0x6: VIP_DBGMSG("Unknown VIP Write: %08x %04x", A, V); + break; + + case 0x7: if(A >= 0x8000) + VIP_MA16W16(CHR_RAM, A & 0x7FFF, V); + else + VIP_DBGMSG("Unknown VIP Write: %08x %04x", A, V); + break; + + default: VIP_DBGMSG("Unknown VIP Write: %08x %04x", A, V); + break; + } + + + //VB_SetEvent(VB_EVENT_VIP, timestamp + CalcNextEvent()); +} + +static MDFN_Surface *surface; +static bool skip; + +void VIP_StartFrame(EmulateSpecStruct *espec) +{ +// puts("Start frame"); + + if(espec->VideoFormatChanged || VidSettingsDirty) + { + MakeColorLUT(espec->surface->format); + Recalc3DModeStuff(espec->surface->format.colorspace != MDFN_COLORSPACE_RGB); + + VidSettingsDirty = false; + } + + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + + switch(VB3DMode) + { + default: + espec->DisplayRect.w = 384; + espec->DisplayRect.h = 224; + break; + + case VB3DMODE_VLI: + espec->DisplayRect.w = 768 * VBPrescale; + espec->DisplayRect.h = 224; + break; + + case VB3DMODE_HLI: + espec->DisplayRect.w = 384; + espec->DisplayRect.h = 448 * VBPrescale; + break; + + case VB3DMODE_CSCOPE: + espec->DisplayRect.w = 512; + espec->DisplayRect.h = 384; + break; + + case VB3DMODE_SIDEBYSIDE: + espec->DisplayRect.w = 768 + VBSBS_Separation; + espec->DisplayRect.h = 224; + break; + } + + surface = espec->surface; + skip = espec->skip; +} + +void VIP_ResetTS(void) +{ + if(SBOUT_InactiveTime >= 0) + SBOUT_InactiveTime -= last_ts; + last_ts = 0; +} + +static int32 CalcNextEvent(void) +{ + return(ColumnCounter); +} + +#include "vip_draw.inc" + +static INLINE void CopyFBColumnToTarget_Anaglyph_BASE(const bool DisplayActive_arg, const int lr) +{ + const int fb = DisplayFB; + uint32 *target = surface->pixels + Column; + const int32 pitch32 = surface->pitch32; + const uint8 *fb_source = &FB[fb][lr][64 * Column]; + + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + uint32 pixel = BrightCLUT[lr][source_bits & 3]; + + if(!DisplayActive_arg) + pixel = 0; + + if(lr) + *target |= pixel; + else + *target = pixel; + + source_bits >>= 2; + target += pitch32; + } + fb_source++; + } +} + +static void CopyFBColumnToTarget_Anaglyph(void) +{ + const int lr = (DisplayRegion & 2) >> 1; + + if(!DisplayActive) + { + if(!lr) + CopyFBColumnToTarget_Anaglyph_BASE(0, 0); + else + CopyFBColumnToTarget_Anaglyph_BASE(0, 1); + } + else + { + if(!lr) + CopyFBColumnToTarget_Anaglyph_BASE(1, 0); + else + CopyFBColumnToTarget_Anaglyph_BASE(1, 1); + } +} + +static uint32 AnaSlowBuf[384][224]; + +static INLINE void CopyFBColumnToTarget_AnaglyphSlow_BASE(const bool DisplayActive_arg, const int lr) +{ + const int fb = DisplayFB; + const uint8 *fb_source = &FB[fb][lr][64 * Column]; + + if(!lr) + { + uint32 *target = AnaSlowBuf[Column]; + + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + uint32 pixel = BrightnessCache[source_bits & 3]; + + if(!DisplayActive_arg) + pixel = 0; + + *target = pixel; + source_bits >>= 2; + target++; + } + fb_source++; + } + + } + else + { + uint32 *target = surface->pixels + Column; + const uint32 *left_src = AnaSlowBuf[Column]; + const int32 pitch32 = surface->pitch32; + + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + uint32 pixel = AnaSlowColorLUT[*left_src][DisplayActive_arg ? BrightnessCache[source_bits & 3] : 0]; + + *target = pixel; + + source_bits >>= 2; + target += pitch32; + left_src++; + } + fb_source++; + } + } +} + +static void CopyFBColumnToTarget_AnaglyphSlow(void) +{ + const int lr = (DisplayRegion & 2) >> 1; + + if(!DisplayActive) + { + if(!lr) + CopyFBColumnToTarget_AnaglyphSlow_BASE(0, 0); + else + CopyFBColumnToTarget_AnaglyphSlow_BASE(0, 1); + } + else + { + if(!lr) + CopyFBColumnToTarget_AnaglyphSlow_BASE(1, 0); + else + CopyFBColumnToTarget_AnaglyphSlow_BASE(1, 1); + } +} + + +static void CopyFBColumnToTarget_CScope_BASE(const bool DisplayActive_arg, const int lr, const int dest_lr) +{ + const int fb = DisplayFB; + uint32 *target = surface->pixels + (dest_lr ? 512 - 16 - 1 : 16) + (dest_lr ? Column : 383 - Column) * surface->pitch32; + const uint8 *fb_source = &FB[fb][lr][64 * Column]; + + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + if(DisplayActive_arg) + *target = BrightCLUT[lr][source_bits & 3]; + else + *target = 0; + + source_bits >>= 2; + if(dest_lr) + target--; + else + target++; + } + fb_source++; + } +} + +static void CopyFBColumnToTarget_CScope(void) +{ + const int lr = (DisplayRegion & 2) >> 1; + + if(!DisplayActive) + { + if(!lr) + CopyFBColumnToTarget_CScope_BASE(0, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_CScope_BASE(0, 1, 1 ^ VB3DReverse); + } + else + { + if(!lr) + CopyFBColumnToTarget_CScope_BASE(1, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_CScope_BASE(1, 1, 1 ^ VB3DReverse); + } +} + +static void CopyFBColumnToTarget_SideBySide_BASE(const bool DisplayActive_arg, const int lr, const int dest_lr) +{ + const int fb = DisplayFB; + uint32 *target = surface->pixels + Column + (dest_lr ? (384 + VBSBS_Separation) : 0); + const int32 pitch32 = surface->pitch32; + const uint8 *fb_source = &FB[fb][lr][64 * Column]; + + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + if(DisplayActive_arg) + *target = BrightCLUT[lr][source_bits & 3]; + else + *target = 0; + source_bits >>= 2; + target += pitch32; + } + fb_source++; + } +} + +static void CopyFBColumnToTarget_SideBySide(void) +{ + const int lr = (DisplayRegion & 2) >> 1; + + if(!DisplayActive) + { + if(!lr) + CopyFBColumnToTarget_SideBySide_BASE(0, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_SideBySide_BASE(0, 1, 1 ^ VB3DReverse); + } + else + { + if(!lr) + CopyFBColumnToTarget_SideBySide_BASE(1, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_SideBySide_BASE(1, 1, 1 ^ VB3DReverse); + } +} + +static INLINE void CopyFBColumnToTarget_VLI_BASE(const bool DisplayActive_arg, const int lr, const int dest_lr) +{ + const int fb = DisplayFB; + uint32 *target = surface->pixels + Column * 2 * VBPrescale + dest_lr; + const int32 pitch32 = surface->pitch32; + const uint8 *fb_source = &FB[fb][lr][64 * Column]; + + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + uint32 tv; + + if(DisplayActive_arg) + tv = BrightCLUT[0][source_bits & 3]; + else + tv = 0; + + for(uint32 ps = 0; ps < VBPrescale; ps++) + target[ps * 2] = tv; + + source_bits >>= 2; + target += pitch32; + } + fb_source++; + } +} + +static void CopyFBColumnToTarget_VLI(void) +{ + const int lr = (DisplayRegion & 2) >> 1; + + if(!DisplayActive) + { + if(!lr) + CopyFBColumnToTarget_VLI_BASE(0, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_VLI_BASE(0, 1, 1 ^ VB3DReverse); + } + else + { + if(!lr) + CopyFBColumnToTarget_VLI_BASE(1, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_VLI_BASE(1, 1, 1 ^ VB3DReverse); + } +} + +static INLINE void CopyFBColumnToTarget_HLI_BASE(const bool DisplayActive_arg, const int lr, const int dest_lr) +{ + const int fb = DisplayFB; + const int32 pitch32 = surface->pitch32; + uint32 *target = surface->pixels + Column + dest_lr * pitch32; + const uint8 *fb_source = &FB[fb][lr][64 * Column]; + +if(VBPrescale <= 4) + for(int y = 56; y; y--) + { + uint32 source_bits = HLILUT[*fb_source]; + + for(int y_sub = 4 * VBPrescale; y_sub; y_sub--) + { + if(DisplayActive_arg) + *target = BrightCLUT[0][source_bits & 3]; + else + *target = 0; + + target += pitch32 * 2; + source_bits >>= 2; + } + fb_source++; + } +else + for(int y = 56; y; y--) + { + uint32 source_bits = *fb_source; + + for(int y_sub = 4; y_sub; y_sub--) + { + for(uint32 ps = 0; ps < VBPrescale; ps++) + { + if(DisplayActive_arg) + *target = BrightCLUT[0][source_bits & 3]; + else + *target = 0; + + target += pitch32 * 2; + } + + source_bits >>= 2; + } + fb_source++; + } +} + +static void CopyFBColumnToTarget_HLI(void) +{ + const int lr = (DisplayRegion & 2) >> 1; + + if(!DisplayActive) + { + if(!lr) + CopyFBColumnToTarget_HLI_BASE(0, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_HLI_BASE(0, 1, 1 ^ VB3DReverse); + } + else + { + if(!lr) + CopyFBColumnToTarget_HLI_BASE(1, 0, 0 ^ VB3DReverse); + else + CopyFBColumnToTarget_HLI_BASE(1, 1, 1 ^ VB3DReverse); + } +} + + +v810_timestamp_t MDFN_FASTCALL VIP_Update(const v810_timestamp_t timestamp) +{ + int32 clocks = timestamp - last_ts; + int32 running_timestamp = timestamp; + + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(DrawingCounter > 0 && chunk_clocks > DrawingCounter) + chunk_clocks = DrawingCounter; + if(chunk_clocks > ColumnCounter) + chunk_clocks = ColumnCounter; + + running_timestamp += chunk_clocks; + + if(DrawingCounter > 0) + { + DrawingCounter -= chunk_clocks; + if(DrawingCounter <= 0) + { + alignas(8) uint8 DrawingBuffers[2][512 * 8]; // Don't decrease this from 512 unless you adjust vip_draw.inc(including areas that draw off-visible >= 384 and >= -7 for speed reasons) + + if(skip && InstantDisplayHack && AllowDrawSkip) + { +#if 0 + for(int lr = 0; lr < 2; lr++) + { + uint8 *FB_Target = FB[DrawingFB][lr] + DrawingBlock * 2; + for(int x = 0; x < 384; x++) + { + FB_Target[64 * x + 0] = BKCOL; + FB_Target[64 * x + 1] = BKCOL; + } + } +#endif + } + else + { + VIP_DrawBlock(DrawingBlock, DrawingBuffers[0] + 8, DrawingBuffers[1] + 8); + + for(int lr = 0; lr < 2; lr++) + { + uint8 *FB_Target = FB[DrawingFB][lr] + DrawingBlock * 2; + + for(int x = 0; x < 384; x++) + { + FB_Target[64 * x + 0] = (DrawingBuffers[lr][8 + x + 512 * 0] << 0) + | (DrawingBuffers[lr][8 + x + 512 * 1] << 2) + | (DrawingBuffers[lr][8 + x + 512 * 2] << 4) + | (DrawingBuffers[lr][8 + x + 512 * 3] << 6); + + FB_Target[64 * x + 1] = (DrawingBuffers[lr][8 + x + 512 * 4] << 0) + | (DrawingBuffers[lr][8 + x + 512 * 5] << 2) + | (DrawingBuffers[lr][8 + x + 512 * 6] << 4) + | (DrawingBuffers[lr][8 + x + 512 * 7] << 6); + + } + } + } + + SBOUT_InactiveTime = running_timestamp + 1120; + SB_Latch = DrawingBlock; // Not exactly correct, but probably doesn't matter. + + DrawingBlock++; + if(DrawingBlock == 28) + { + DrawingActive = false; + + InterruptPending |= INT_XP_END; + CheckIRQ(); + } + else + DrawingCounter += 1120 * 4; + } + } + + ColumnCounter -= chunk_clocks; + if(ColumnCounter == 0) + { + if(DisplayRegion & 1) + { + if(!(Column & 3)) + { + const int lr = (DisplayRegion & 2) >> 1; + uint16 ctdata = VIP_MA16R16(DRAM, 0x1DFFE - ((Column >> 2) * 2) - (lr ? 0 : 0x200)); + + if((ctdata >> 8) != Repeat) + { + Repeat = ctdata >> 8; + RecalcBrightnessCache(); + } + } + if(!skip && !InstantDisplayHack) + CopyFBColumnToTarget(); + } + + ColumnCounter = 259; + Column++; + if(Column == 384) + { + Column = 0; + + if(DisplayActive) + { + if(DisplayRegion & 1) // Did we just finish displaying an active region? + { + if(DisplayRegion & 2) // finished displaying right eye + InterruptPending |= INT_RFB_END; + else // Otherwise, left eye + InterruptPending |= INT_LFB_END; + + CheckIRQ(); + } + } + + DisplayRegion = (DisplayRegion + 1) & 3; + + if(DisplayRegion == 0) // New frame start + { + DisplayActive = DPCTRL & 0x2; + + if(DisplayActive) + { + InterruptPending |= INT_FRAME_START; + CheckIRQ(); + } + GameFrameCounter++; + if(GameFrameCounter > FRMCYC) // New game frame start? + { + InterruptPending |= INT_GAME_START; + CheckIRQ(); + + if(XPCTRL & XPCTRL_XP_EN) + { + DisplayFB ^= 1; + + DrawingBlock = 0; + DrawingActive = true; + DrawingCounter = 1120 * 4; + DrawingFB = DisplayFB ^ 1; + } + + GameFrameCounter = 0; + } + + if(!skip && InstantDisplayHack) + { + // Ugly kludge, fix in the future. + int32 save_DisplayRegion = DisplayRegion; + int32 save_Column = Column; + uint8 save_Repeat = Repeat; + + for(int lr = 0; lr < 2; lr++) + { + DisplayRegion = lr << 1; + for(Column = 0; Column < 384; Column++) + { + if(!(Column & 3)) + { + uint16 ctdata = VIP_MA16R16(DRAM, 0x1DFFE - ((Column >> 2) * 2) - (lr ? 0 : 0x200)); + + if((ctdata >> 8) != Repeat) + { + Repeat = ctdata >> 8; + RecalcBrightnessCache(); + } + } + + CopyFBColumnToTarget(); + } + } + DisplayRegion = save_DisplayRegion; + Column = save_Column; + Repeat = save_Repeat; + RecalcBrightnessCache(); + } + + VB_ExitLoop(); + } + } + } + + clocks -= chunk_clocks; + } + + last_ts = timestamp; + + return(timestamp + CalcNextEvent()); +} + + +void VIP_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(FB[0][0], 0x6000 * 2 * 2), + SFARRAY16(CHR_RAM, 0x8000 / sizeof(uint16)), + SFARRAY16(DRAM, 0x20000 / sizeof(uint16)), + + SFVAR(InterruptPending), + SFVAR(InterruptEnable), + + SFVAR(BRTA), + SFVAR(BRTB), + SFVAR(BRTC), + SFVAR(REST), + + SFVAR(FRMCYC), + SFVAR(DPCTRL), + + SFVAR(DisplayActive), + + SFVAR(XPCTRL), + SFVAR(SBCMP), + SFARRAY16(SPT, 4), + SFARRAY16(GPLT, 4), // FIXME + SFARRAY16(JPLT, 4), + + SFVAR(BKCOL), + + SFVAR(Column), + SFVAR(ColumnCounter), + + SFVAR(DisplayRegion), + SFVAR(DisplayFB), + + SFVAR(GameFrameCounter), + + SFVAR(DrawingCounter), + + SFVAR(DrawingActive), + SFVAR(DrawingFB), + SFVAR(DrawingBlock), + + SFVAR(SB_Latch), + SFVAR(SBOUT_InactiveTime), + + SFVAR(Repeat), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "VIP"); + + if(load) + { + RecalcBrightnessCache(); + for(int i = 0; i < 4; i++) + { + Recalc_GPLT_Cache(i); + Recalc_JPLT_Cache(i); + } + } +} + +uint32 VIP_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 ret = 0xDEADBEEF; + + switch(id) + { + case VIP_GSREG_IPENDING: + ret = InterruptPending; + break; + + case VIP_GSREG_IENABLE: + ret = InterruptEnable; + break; + + case VIP_GSREG_DPCTRL: + ret = DPCTRL; + break; + + case VIP_GSREG_BRTA: + ret = BRTA; + break; + + case VIP_GSREG_BRTB: + ret = BRTB; + break; + + case VIP_GSREG_BRTC: + ret = BRTC; + break; + + case VIP_GSREG_REST: + ret = REST; + break; + + case VIP_GSREG_FRMCYC: + ret = FRMCYC; + break; + + case VIP_GSREG_XPCTRL: + ret = XPCTRL | (SBCMP << 8); + break; + + case VIP_GSREG_SPT0: + case VIP_GSREG_SPT1: + case VIP_GSREG_SPT2: + case VIP_GSREG_SPT3: + ret = SPT[id - VIP_GSREG_SPT0]; + break; + + case VIP_GSREG_GPLT0: + case VIP_GSREG_GPLT1: + case VIP_GSREG_GPLT2: + case VIP_GSREG_GPLT3: + ret = GPLT[id - VIP_GSREG_GPLT0]; + break; + + case VIP_GSREG_JPLT0: + case VIP_GSREG_JPLT1: + case VIP_GSREG_JPLT2: + case VIP_GSREG_JPLT3: + ret = JPLT[id - VIP_GSREG_JPLT0]; + break; + + case VIP_GSREG_BKCOL: + ret = BKCOL; + break; + + } + + if(id == VIP_GSREG_IPENDING || id == VIP_GSREG_IENABLE) + { + if(special) + trio_snprintf(special, special_len, "%s: %s%s%s%s%s%s%s%s", + (id == VIP_GSREG_IPENDING) ? "Interrupts Pending" : "Interrupts Enabled", + (ret & INT_SCAN_ERR) ? "SCAN_ERR " : "", + (ret & INT_LFB_END) ? "LFB_END " : "", + (ret & INT_RFB_END) ? "RFB_END " : "", + (ret & INT_GAME_START) ? "GAME_START " : "", + (ret & INT_FRAME_START) ? "FRAME_START " : "", + (ret & INT_SB_HIT) ? "SB_HIT " : "", + (ret & INT_XP_END) ? "XP_END " : "", + (ret & INT_TIME_ERR) ? "TIME_ERR " : ""); + + } + + return(ret); +} + +void VIP_SetRegister(const unsigned int id, const uint32 value) +{ + switch(id) + { + case VIP_GSREG_IPENDING: + InterruptPending = value & 0xE01F; + CheckIRQ(); + break; + + case VIP_GSREG_IENABLE: + InterruptEnable = value & 0xE01F; + CheckIRQ(); + break; + + case VIP_GSREG_DPCTRL: + DPCTRL = value & 0x703; // FIXME(Lower bit?) + break; + + case VIP_GSREG_BRTA: + BRTA = value & 0xFF; + RecalcBrightnessCache(); + break; + + case VIP_GSREG_BRTB: + BRTB = value & 0xFF; + RecalcBrightnessCache(); + break; + + case VIP_GSREG_BRTC: + BRTC = value & 0xFF; + RecalcBrightnessCache(); + break; + + case VIP_GSREG_REST: + REST = value & 0xFF; + RecalcBrightnessCache(); + break; + + case VIP_GSREG_FRMCYC: + FRMCYC = value & 0xF; + break; + + case VIP_GSREG_XPCTRL: + XPCTRL = value & 0x2; + SBCMP = (value >> 8) & 0x1f; + break; + + case VIP_GSREG_SPT0: + case VIP_GSREG_SPT1: + case VIP_GSREG_SPT2: + case VIP_GSREG_SPT3: + SPT[id - VIP_GSREG_SPT0] = value & 0x3FF; + break; + + case VIP_GSREG_GPLT0: + case VIP_GSREG_GPLT1: + case VIP_GSREG_GPLT2: + case VIP_GSREG_GPLT3: + GPLT[id - VIP_GSREG_GPLT0] = value & 0xFC; + Recalc_GPLT_Cache(id - VIP_GSREG_GPLT0); + break; + + case VIP_GSREG_JPLT0: + case VIP_GSREG_JPLT1: + case VIP_GSREG_JPLT2: + case VIP_GSREG_JPLT3: + JPLT[id - VIP_GSREG_JPLT0] = value & 0xFC; + Recalc_JPLT_Cache(id - VIP_GSREG_JPLT0); + break; + + case VIP_GSREG_BKCOL: + BKCOL = value & 0x03; + break; + } +} + + +} diff --git a/Mednafen/mednafen/vb/vip.h b/Mednafen/mednafen/vb/vip.h new file mode 100644 index 0000000000..c30a18bd06 --- /dev/null +++ b/Mednafen/mednafen/vb/vip.h @@ -0,0 +1,70 @@ +#ifndef __VB_VIP_H +#define __VB_VIP_H + +namespace MDFN_IEN_VB +{ + +void VIP_Init(void) MDFN_COLD; +void VIP_Kill(void) MDFN_COLD; +void VIP_Power(void) MDFN_COLD; + +void VIP_SetInstantDisplayHack(bool) MDFN_COLD; +void VIP_SetAllowDrawSkip(bool) MDFN_COLD; +void VIP_Set3DMode(uint32 mode, bool reverse, uint32 prescale, uint32 sbs_separation) MDFN_COLD; +void VIP_SetParallaxDisable(bool disabled) MDFN_COLD; +void VIP_SetDefaultColor(uint32 default_color) MDFN_COLD; +void VIP_SetAnaglyphColors(uint32 lcolor, uint32 rcolor) MDFN_COLD; // R << 16, G << 8, B << 0 + +v810_timestamp_t MDFN_FASTCALL VIP_Update(const v810_timestamp_t timestamp); +void VIP_ResetTS(void); + +void VIP_StartFrame(EmulateSpecStruct *espec); + +uint8 VIP_Read8(v810_timestamp_t ×tamp, uint32 A); +uint16 VIP_Read16(v810_timestamp_t ×tamp, uint32 A); + + +void VIP_Write8(v810_timestamp_t ×tamp, uint32 A, uint8 V); +void VIP_Write16(v810_timestamp_t ×tamp, uint32 A, uint16 V); + +void VIP_StateAction(StateMem *sm, const unsigned load, const bool data_only); + + +enum +{ + VIP_GSREG_IPENDING = 0, // Current pending interrupt(bits) + VIP_GSREG_IENABLE, + + VIP_GSREG_DPCTRL, + + VIP_GSREG_BRTA, + VIP_GSREG_BRTB, + VIP_GSREG_BRTC, + VIP_GSREG_REST, + VIP_GSREG_FRMCYC, + VIP_GSREG_XPCTRL, + + VIP_GSREG_SPT0, + VIP_GSREG_SPT1, + VIP_GSREG_SPT2, + VIP_GSREG_SPT3, + + VIP_GSREG_GPLT0, + VIP_GSREG_GPLT1, + VIP_GSREG_GPLT2, + VIP_GSREG_GPLT3, + + VIP_GSREG_JPLT0, + VIP_GSREG_JPLT1, + VIP_GSREG_JPLT2, + VIP_GSREG_JPLT3, + + VIP_GSREG_BKCOL, +}; + +uint32 VIP_GetRegister(const unsigned int id, char *special, const uint32 special_len); +void VIP_SetRegister(const unsigned int id, const uint32 value); + + +} +#endif diff --git a/Mednafen/mednafen/vb/vip_draw.inc b/Mednafen/mednafen/vb/vip_draw.inc new file mode 100644 index 0000000000..775f0de973 --- /dev/null +++ b/Mednafen/mednafen/vb/vip_draw.inc @@ -0,0 +1,474 @@ +#include "vb.h" + +#define BGM_AFFINE 0x2 +#define BGM_OBJ 0x3 + + +static void DrawBG(uint8 *target, uint16 RealY, bool lr, uint8 bgmap_base_raw, bool overplane, uint16 overplane_char, uint32 SourceX, uint32 SourceY, uint32 scx, uint32 scy, uint16 DestX, uint16 DestY, uint16 DestWidth, uint16 DestHeight) +{ + const uint16 *CHR16 = CHR_RAM; + const uint16 *BGMap = DRAM; + uint32 BGMap_Base = bgmap_base_raw << 12; + int32 start_x, final_x; + const uint32 bgsc_overplane = DRAM[overplane_char]; + const uint32 BGMap_XCount = 1 << scx; + const uint32 BGMap_YCount = 1 << scy; + const uint32 SourceX_Size = 512 * BGMap_XCount; + const uint32 SourceY_Size = 512 * BGMap_YCount; + const uint32 SourceX_Mask = overplane ? 0x1FFF : (SourceX_Size - 1); + const uint32 SourceY_Mask = overplane ? 0x1FFF : (SourceY_Size - 1); + + if((uint16)(RealY - DestY) > DestHeight) + return; + + //printf("%d, %d, %d, %d\n", overplane, srcXSize, srcYSize, bgmap_base_raw); + + DestX = sign_10_to_s16(DestX); + + if(DestX & 0x8000) + SourceX -= DestX; + + start_x = (int16)DestX; + final_x = (int16)DestX + DestWidth; + + if(start_x < 0) + start_x = 0; + + if(final_x > 383) + final_x = 383; + + if(start_x > final_x) + return; + + // Optimization: + SourceY &= SourceY_Mask; + BGMap_Base |= (((SourceY >> 3) & 0x3F) * 0x40) | (((SourceY << 3) & ~0xFFF) << scx); + + for(int x = start_x; x <= final_x; x++) + { + uint32 bgsc; + uint32 char_no; + uint32 palette_selector; + uint32 hflip_xor; + uint32 vflip_xor; + + SourceX &= SourceX_Mask; + + bgsc = bgsc_overplane; + + if(SourceX < SourceX_Size && SourceY < SourceY_Size) + bgsc = BGMap[(BGMap_Base | ((SourceX << 3) & ~0xFFF) | ((SourceX >> 3) & 0x3F)) & 0xFFFF]; + + char_no = bgsc & 0x7FF; + palette_selector = bgsc >> 14; + hflip_xor = (bgsc & 0x2000) ? 7 : 0; //(((int32)bgsc << 18) >> 31) & 0x7; + vflip_xor = (bgsc & 0x1000) ? 7 : 0; //(((int32)bgsc << 19) >> 31) & 0x7; + + unsigned int char_sub_y = vflip_xor ^ (SourceY & 0x7); + + if(!(SourceX & 7) && (x + 7) <= final_x) + { + uint32 pixels = CHR16[char_no * 8 + char_sub_y]; + + #if 0 + unsigned int char_sub_x; + uint8 *sub_target = target + x + 8; + + for(int sub_x = -8; sub_x < 0; sub_x++) + { + if(pixels & 3) sub_target[sub_x] = GPLT_Cache[palette_selector][pixels & 3]; + pixels >>= 2; + } + #endif + + if(bgsc & 0x2000) + { + if((pixels >> 14) & 3) target[0 + x] = GPLT_Cache[palette_selector][(pixels >> 14) & 3]; + if((pixels >> 12) & 3) target[1 + x] = GPLT_Cache[palette_selector][(pixels >> 12) & 3]; + if((pixels >> 10) & 3) target[2 + x] = GPLT_Cache[palette_selector][(pixels >> 10) & 3]; + if((pixels >> 8) & 3) target[3 + x] = GPLT_Cache[palette_selector][(pixels >> 8) & 3]; + if((pixels >> 6) & 3) target[4 + x] = GPLT_Cache[palette_selector][(pixels >> 6) & 3]; + if((pixels >> 4) & 3) target[5 + x] = GPLT_Cache[palette_selector][(pixels >> 4) & 3]; + if((pixels >> 2) & 3) target[6 + x] = GPLT_Cache[palette_selector][(pixels >> 2) & 3]; + if((pixels >> 0) & 3) target[7 + x] = GPLT_Cache[palette_selector][(pixels >> 0) & 3]; + } + else + { + if((pixels >> 0) & 3) target[0 + x] = GPLT_Cache[palette_selector][(pixels >> 0) & 3]; + if((pixels >> 2) & 3) target[1 + x] = GPLT_Cache[palette_selector][(pixels >> 2) & 3]; + if((pixels >> 4) & 3) target[2 + x] = GPLT_Cache[palette_selector][(pixels >> 4) & 3]; + if((pixels >> 6) & 3) target[3 + x] = GPLT_Cache[palette_selector][(pixels >> 6) & 3]; + if((pixels >> 8) & 3) target[4 + x] = GPLT_Cache[palette_selector][(pixels >> 8) & 3]; + if((pixels >> 10) & 3) target[5 + x] = GPLT_Cache[palette_selector][(pixels >> 10) & 3]; + if((pixels >> 12) & 3) target[6 + x] = GPLT_Cache[palette_selector][(pixels >> 12) & 3]; + if((pixels >> 14) & 3) target[7 + x] = GPLT_Cache[palette_selector][(pixels >> 14) & 3]; + } + + x += 7; + SourceX += 8; + } + else + { + unsigned int char_sub_x; + + char_sub_x = hflip_xor ^ (SourceX & 0x7); + + uint8 pixel = (CHR16[char_no * 8 + char_sub_y] >> (char_sub_x * 2)) & 0x3; + + if(pixel) + target[x] = GPLT_Cache[palette_selector][pixel]; //target[x] = (GPLT[palette_selector] >> (pixel * 2)) & 0x3; + SourceX++; + } + } +} + +static void DrawAffine(uint8 *target, uint16 RealY, bool lr, uint32 ParamBase, uint32 BGMap_Base, bool OverplaneMode, uint16 OverplaneChar, uint32 scx, uint32 scy, + uint16 DestX, uint16 DestY, uint16 DestWidth, uint16 DestHeight) +{ + const uint16 *CHR16 = CHR_RAM; + const uint16 *BGMap = DRAM; + + const uint32 BGMap_XCount = 1 << scx; + const uint32 BGMap_YCount = 1 << scy; + const uint32 SourceX_Size = 512 * BGMap_XCount; + const uint32 SourceY_Size = 512 * BGMap_YCount; + + const uint16 *param_ptr = &DRAM[(ParamBase + 8 * (RealY - DestY)) & 0xFFFF]; + int16 mx = param_ptr[0], mp = (ParallaxDisabled ? 0 : param_ptr[1]), my = param_ptr[2], dx = param_ptr[3], dy = param_ptr[4]; + + uint32 SourceX, SourceY; + uint32 SourceX_Mask, SourceY_Mask; + + int32 start_x, final_x; + const uint32 bgsc_overplane = DRAM[OverplaneChar]; + + + DestX = sign_10_to_s16(DestX); + + if((uint16)(RealY - DestY) > DestHeight) + return; + + SourceX = (int32)mx << 6; + SourceY = (int32)my << 6; + + if(DestX & 0x8000) + { + SourceX += dx * (65536 - DestX); + SourceY += dy * (65536 - DestX); + } + + if(mp >= 0 && lr) + { + SourceX += dx * mp; + SourceY += dy * mp; + } + else if(mp < 0 && !lr) + { + SourceX += dx * -mp; + SourceY += dy * -mp; + } + + if(OverplaneMode) + { + SourceX_Mask = 0x3FFFFFF; //(((uint32)SourceX_Size << 9) * 2) - 1; + SourceY_Mask = 0x3FFFFFF; //(((uint32)SourceY_Size << 9) * 2) - 1; + } + else + { + SourceX_Mask = ((uint32)SourceX_Size << 9) - 1; + SourceY_Mask = ((uint32)SourceY_Size << 9) - 1; + } + + start_x = (int16)DestX; + final_x = (int16)DestX + DestWidth; + + if(start_x < 0) + start_x = 0; + + if(final_x > 383) + final_x = 383; + +if(dy == 0) // Optimization for no rotation. +{ + SourceY &= SourceY_Mask; + + if(SourceY >= (SourceY_Size << 9)) + return; + + BGMap_Base |= (((SourceY >> 6) & ~0xFFF) << scx) | (((SourceY >> 12) & 0x3F) * 0x40); + for(int x = start_x; x <= final_x; x++) + { + uint32 bgsc; + uint32 hflip_xor; + uint32 vflip_xor; + uint32 pixel = 0; + + SourceX &= SourceX_Mask; + + bgsc = bgsc_overplane; + + if(SourceX < (SourceX_Size << 9)) + bgsc = BGMap[(BGMap_Base | ((SourceX >> 6) & ~0xFFF) | ((SourceX >> 12) & 0x3F)) & 0xFFFF]; + + //hflip_xor = bgsc & 0x2000 ? 0xE : 0; + //vflip_xor = bgsc & 0x1000 ? 0x7 : 0; + hflip_xor = ((int32)(bgsc << 18) >> 30) & 0xE; + vflip_xor = ((int32)(bgsc << 19) >> 31) & 0x7; + + unsigned int char_sub_y = vflip_xor ^ ((SourceY >> 9) & 0x7); + unsigned int char_sub_x = hflip_xor ^ ((SourceX >> 8) & 0xE); + + pixel = (CHR16[((bgsc & 0x7FF) * 8) | char_sub_y] >> char_sub_x) & 0x3; + + if(pixel) + target[x] = GPLT_Cache[bgsc >> 14][pixel]; + + SourceX += dx; + } +} +else + for(int x = start_x; x <= final_x; x++) + { + uint32 bgsc; + uint32 char_no; + uint32 palette_selector; + uint32 hflip_xor; + uint32 vflip_xor; + uint8 pixel = 0; + + SourceX &= SourceX_Mask; + SourceY &= SourceY_Mask; + + bgsc = bgsc_overplane; + + if(SourceX < (SourceX_Size << 9) && SourceY < (SourceY_Size << 9)) + { + uint32 m_index = ((SourceX >> 6) & ~0xFFF) + (((SourceY >> 6) & ~0xFFF) << scx); + uint32 sub_index = ((SourceX >> 12) & 0x3F) + (((SourceY >> 12) & 0x3F) * 0x40); + + bgsc = BGMap[(BGMap_Base | m_index | sub_index) & 0xFFFF]; + + //bgsc = BGMap[(BGMapBase + (SourceX >> 12) + (SourceY >> 12) * (SourceX_Size >> 3)) & 0xFFFF ]; + } + char_no = bgsc & 0x7FF; + palette_selector = bgsc >> 14; + hflip_xor = bgsc & 0x2000 ? 7 : 0; //(((int32)bgsc << 18) >> 31) & 0x7; + vflip_xor = bgsc & 0x1000 ? 7 : 0; //(((int32)bgsc << 19) >> 31) & 0x7; + + unsigned int char_sub_y = vflip_xor ^ ((SourceY >> 9) & 0x7); + unsigned int char_sub_x = hflip_xor ^ ((SourceX >> 9) & 0x7); + + pixel = (CHR16[char_no * 8 + char_sub_y] >> (char_sub_x * 2)) & 0x3; + + if(pixel) + target[x] = GPLT_Cache[palette_selector][pixel]; + + SourceX += dx; + SourceY += dy; + } +} + +static int obj_search_which; + +static void DrawOBJ(uint8 *fb[2], uint16 Y, bool lron[2]) +{ + const uint16 *CHR16 = CHR_RAM; + + int32 start_oam; + int32 end_oam; + + start_oam = SPT[obj_search_which]; + + end_oam = 1023; + if(obj_search_which) + end_oam = SPT[obj_search_which - 1]; + + int32 oam = start_oam; + do + { + const uint16 *oam_ptr = &DRAM[(0x1E000 + (oam * 8)) >> 1]; + const uint32 jy = oam_ptr[2]; + const uint32 tile_y = (Y - jy) & 0xFF; // I think this mask is right. See: http://www.planetvb.com/modules/newbb/viewtopic.php?topic_id=3797&forum=2 + + if(tile_y >= 8) + continue; + + uint32 jx = oam_ptr[0]; + uint32 jp = ParallaxDisabled ? 0 : (oam_ptr[1] & 0x3FFF); + uint32 palette_selector = oam_ptr[3] >> 14; + uint32 vflip_xor = (oam_ptr[3] & 0x1000) ? 7 : 0; + uint32 char_sub_y = vflip_xor ^ tile_y; + bool jlron[2] = { (bool)(oam_ptr[1] & 0x8000), (bool)(oam_ptr[1] & 0x4000) }; + uint32 char_no = oam_ptr[3] & 0x7FF; + const uint32 pixels_save = CHR16[char_no * 8 + char_sub_y]; + + for(int lr = 0; lr < 2; lr++) + { + if(!(jlron[lr] & lron[lr])) + continue; + + uint32 pixels = pixels_save; + int32 x = sign_x_to_s32(10, (jx + (lr ? jp : -jp))); // It may actually be 9, TODO? + + if(x >= -7 && x < 384) // Make sure we always keep the pitch of our 384x8 buffer large enough(with padding before and after the visible space) + { + uint8 *target = &fb[lr][x]; + + if(oam_ptr[3] & 0x2000) + { + target += 7; + + for(int meow = 8; meow; meow--) + { + if(pixels & 3) + *target = JPLT_Cache[palette_selector][pixels & 3]; + target--; + pixels >>= 2; + } + } + else + { + for(int meow = 8; meow; meow--) + { + if(pixels & 3) + *target = JPLT_Cache[palette_selector][pixels & 3]; + target++; + pixels >>= 2; + } + } + #if 0 + if(oam_ptr[3] & 0x2000) + { + if((pixels >> 14) & 3) fb[lr][0 + x] = JPLT_Cache[palette_selector][(pixels >> 14) & 3]; + if((pixels >> 12) & 3) fb[lr][1 + x] = JPLT_Cache[palette_selector][(pixels >> 12) & 3]; + if((pixels >> 10) & 3) fb[lr][2 + x] = JPLT_Cache[palette_selector][(pixels >> 10) & 3]; + if((pixels >> 8) & 3) fb[lr][3 + x] = JPLT_Cache[palette_selector][(pixels >> 8) & 3]; + if((pixels >> 6) & 3) fb[lr][4 + x] = JPLT_Cache[palette_selector][(pixels >> 6) & 3]; + if((pixels >> 4) & 3) fb[lr][5 + x] = JPLT_Cache[palette_selector][(pixels >> 4) & 3]; + if((pixels >> 2) & 3) fb[lr][6 + x] = JPLT_Cache[palette_selector][(pixels >> 2) & 3]; + if((pixels >> 0) & 3) fb[lr][7 + x] = JPLT_Cache[palette_selector][(pixels >> 0) & 3]; + } + else + { + if((pixels >> 0) & 3) fb[lr][0 + x] = JPLT_Cache[palette_selector][(pixels >> 0) & 3]; + if((pixels >> 2) & 3) fb[lr][1 + x] = JPLT_Cache[palette_selector][(pixels >> 2) & 3]; + if((pixels >> 4) & 3) fb[lr][2 + x] = JPLT_Cache[palette_selector][(pixels >> 4) & 3]; + if((pixels >> 6) & 3) fb[lr][3 + x] = JPLT_Cache[palette_selector][(pixels >> 6) & 3]; + if((pixels >> 8) & 3) fb[lr][4 + x] = JPLT_Cache[palette_selector][(pixels >> 8) & 3]; + if((pixels >> 10) & 3) fb[lr][5 + x] = JPLT_Cache[palette_selector][(pixels >> 10) & 3]; + if((pixels >> 12) & 3) fb[lr][6 + x] = JPLT_Cache[palette_selector][(pixels >> 12) & 3]; + if((pixels >> 14) & 3) fb[lr][7 + x] = JPLT_Cache[palette_selector][(pixels >> 14) & 3]; + } +#endif + + } + + } + } while( (oam = (oam - 1) & 1023) != end_oam); + +} + + +void VIP_DrawBlock(uint8 block_no, uint8 *fb_l, uint8 *fb_r) +{ + for(int y = 0; y < 8; y++) + { + memset(fb_l + y * 512, BKCOL, 384); + memset(fb_r + y * 512, BKCOL, 384); + } + + obj_search_which = 3; + + for(int world = 31; world >= 0; world--) + { + const uint16 *world_ptr = &DRAM[(0x1D800 + world * 0x20) >> 1]; + + uint32 bgmap_base = world_ptr[0] & 0xF; + bool end = world_ptr[0] & 0x40; + bool over = world_ptr[0] & 0x80; + uint32 scy = (world_ptr[0] >> 8) & 3; + uint32 scx = (world_ptr[0] >> 10) & 3; + uint32 bgm = (world_ptr[0] >> 12) & 3; + bool lron[2] = { (bool)(world_ptr[0] & 0x8000), (bool)(world_ptr[0] & 0x4000) }; + + uint16 gx = sign_11_to_s16(world_ptr[1]); + uint16 gp = ParallaxDisabled ? 0 : sign_9_to_s16(world_ptr[2]); + uint16 gy = sign_11_to_s16(world_ptr[3]); + uint16 mx = world_ptr[4]; + uint16 mp = ParallaxDisabled ? 0 : sign_9_to_s16(world_ptr[5]); + uint16 my = world_ptr[6]; + uint16 window_width = sign_11_to_s16(world_ptr[7]); + uint16 window_height = (world_ptr[8] & 0x3FF); + uint32 param_base = (world_ptr[9] & 0xFFF0); + uint16 overplane_char = world_ptr[10]; + + if(end) + break; + + if(((512 << scx) + (512 << scy)) > 4096) + { + printf("BG Size too large for world: %d(scx=%d, scy=%d)\n", world, scx, scy); + } + +// if(world != 2) +// continue; + + // if(block_no == 8) + // printf("World: %d; gx: %d, gp: %d, gy: %d, mx: %d, mp: %d, my: %d, window_width: %d, window_height: %d\n", world, gx, gp, gy, mx, mp, my, window_width, window_height); + + for(int y = 0; y < 8; y++) + { + uint8 *fb[2] = { &fb_l[y * 512], &fb_r[y * 512] }; + + if(bgm == BGM_OBJ) + { + if(!lron[0] || !lron[1]) + printf("Bad OBJ World? %d(%d/%d) %d~%d\n", world, lron[0], lron[1], SPT[obj_search_which], obj_search_which ? (SPT[obj_search_which - 1] + 1) : 0); + + DrawOBJ(fb, (block_no * 8) + y, lron); + } + else if(bgm == BGM_AFFINE) + { + //if(((block_no * 8) + y) == 128) + // printf("Draw affine: %d %d\n", gx, gp); + for(int lr = 0; lr < 2; lr++) + { + if(lron[lr]) + { + DrawAffine(fb[lr], (block_no * 8) + y, lr, param_base, bgmap_base * 4096, over, overplane_char, scx, scy, + gx + (lr ? gp : -gp), gy, window_width, window_height); + } + } + } + else + for(int lr = 0; lr < 2; lr++) + { + uint16 srcX, srcY; + uint16 RealY = (block_no * 8) + y; + uint16 DestX; + uint16 DestY; + + srcX = mx + (lr ? mp : -mp); + srcY = my + (RealY - gy); + + DestX = gx + (lr ? gp : -gp); + DestY = gy; + + if(lron[lr]) + { + if(bgm == 1) // HBias + srcX += (int16)DRAM[(param_base + (((RealY - DestY) * 2) | lr)) & 0xFFFF]; + + DrawBG(fb[lr], RealY, lr, bgmap_base, over, overplane_char, (int32)(int16)srcX, (int32)(int16)srcY, scx, scy, DestX, DestY, window_width, window_height); + } + } + } + + if(bgm == BGM_OBJ) + if(obj_search_which) + obj_search_which--; + + } + + +} diff --git a/Mednafen/mednafen/vb/vsu.cpp b/Mednafen/mednafen/vb/vsu.cpp new file mode 100644 index 0000000000..9fc6ca04a5 --- /dev/null +++ b/Mednafen/mednafen/vb/vsu.cpp @@ -0,0 +1,541 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "vb.h" +#include "vsu.h" + +static const unsigned int Tap_LUT[8] = { 15 - 1, 11 - 1, 14 - 1, 5 - 1, 9 - 1, 7 - 1, 10 - 1, 12 - 1 }; + +VSU::VSU() +{ + Synth.volume(1.0 / 6 / 2); + + for(int ch = 0; ch < 6; ch++) + { + for(int lr = 0; lr < 2; lr++) + last_output[ch][lr] = 0; + } +} + +VSU::~VSU() +{ + +} + +void VSU::SetSoundRate(double rate) +{ + for(int y = 0; y < 2; y++) + { + sbuf[y].set_sample_rate(rate ? rate : 44100, 50); + sbuf[y].clock_rate((long)(VB_MASTER_CLOCK / 4)); + sbuf[y].bass_freq(20); + } +} + +void VSU::Power(void) +{ + SweepControl = 0; + SweepModCounter = 0; + SweepModClockDivider = 1; + + for(int ch = 0; ch < 6; ch++) + { + IntlControl[ch] = 0; + LeftLevel[ch] = 0; + RightLevel[ch] = 0; + Frequency[ch] = 0; + EnvControl[ch] = 0; + RAMAddress[ch] = 0; + + EffFreq[ch] = 0; + Envelope[ch] = 0; + WavePos[ch] = 0; + FreqCounter[ch] = 0; + IntervalCounter[ch] = 0; + EnvelopeCounter[ch] = 0; + + EffectsClockDivider[ch] = 4800; + IntervalClockDivider[ch] = 4; + EnvelopeClockDivider[ch] = 4; + + LatcherClockDivider[ch] = 120; + } + + + NoiseLatcherClockDivider = 120; + NoiseLatcher = 0; + + memset(WaveData, 0, sizeof(WaveData)); + memset(ModData, 0, sizeof(ModData)); + + last_ts = 0; +} + +void VSU::Write(int32 timestamp, uint32 A, uint8 V) +{ + A &= 0x7FF; + + Update(timestamp); + + //printf("VSU Write: %d, %08x %02x\n", timestamp, A, V); + + if(A < 0x280) + WaveData[A >> 7][(A >> 2) & 0x1F] = V & 0x3F; + else if(A < 0x400) + { + //if(A >= 0x300) + // printf("Modulation mirror write? %08x %02x\n", A, V); + ModData[(A >> 2) & 0x1F] = V; + } + else if(A < 0x600) + { + int ch = (A >> 6) & 0xF; + + //if(ch < 6) + //printf("Ch: %d, Reg: %d, Value: %02x\n", ch, (A >> 2) & 0xF, V); + + if(ch > 5) + { + if(A == 0x580 && (V & 1)) + { + //puts("STOP, HAMMER TIME"); + for(int i = 0; i < 6; i++) + IntlControl[i] &= ~0x80; + } + } + else + switch((A >> 2) & 0xF) + { + case 0x0: IntlControl[ch] = V & ~0x40; + + if(V & 0x80) + { + EffFreq[ch] = Frequency[ch]; + if(ch == 5) + FreqCounter[ch] = 10 * (2048 - EffFreq[ch]); + else + FreqCounter[ch] = 2048 - EffFreq[ch]; + IntervalCounter[ch] = (V & 0x1F) + 1; + EnvelopeCounter[ch] = (EnvControl[ch] & 0x7) + 1; + + if(ch == 4) + { + SweepModCounter = (SweepControl >> 4) & 7; + SweepModClockDivider = (SweepControl & 0x80) ? 8 : 1; + ModWavePos = 0; + } + + WavePos[ch] = 0; + + if(ch == 5) // Not sure if this is correct. + lfsr = 1; + + //if(!(IntlControl[ch] & 0x80)) + // Envelope[ch] = (EnvControl[ch] >> 4) & 0xF; + + EffectsClockDivider[ch] = 4800; + IntervalClockDivider[ch] = 4; + EnvelopeClockDivider[ch] = 4; + } + break; + + case 0x1: LeftLevel[ch] = (V >> 4) & 0xF; + RightLevel[ch] = (V >> 0) & 0xF; + break; + + case 0x2: Frequency[ch] &= 0xFF00; + Frequency[ch] |= V << 0; + EffFreq[ch] &= 0xFF00; + EffFreq[ch] |= V << 0; + break; + + case 0x3: Frequency[ch] &= 0x00FF; + Frequency[ch] |= (V & 0x7) << 8; + EffFreq[ch] &= 0x00FF; + EffFreq[ch] |= (V & 0x7) << 8; + break; + + case 0x4: EnvControl[ch] &= 0xFF00; + EnvControl[ch] |= V << 0; + + Envelope[ch] = (V >> 4) & 0xF; + break; + + case 0x5: EnvControl[ch] &= 0x00FF; + if(ch == 4) + EnvControl[ch] |= (V & 0x73) << 8; + else if(ch == 5) + { + EnvControl[ch] |= (V & 0x73) << 8; + lfsr = 1; + } + else + EnvControl[ch] |= (V & 0x03) << 8; + break; + + case 0x6: RAMAddress[ch] = V & 0xF; + break; + + case 0x7: if(ch == 4) + { + SweepControl = V; + } + break; + } + } +} + +INLINE void VSU::CalcCurrentOutput(int ch, int &left, int &right) +{ + if(!(IntlControl[ch] & 0x80)) + { + left = right = 0; + return; + } + + int WD; + int l_ol, r_ol; + + if(ch == 5) + WD = NoiseLatcher; //(NoiseLatcher << 6) - NoiseLatcher; + else + { + if(RAMAddress[ch] > 4) + WD = 0; + else + WD = WaveData[RAMAddress[ch]][WavePos[ch]]; // - 0x20; + } + l_ol = Envelope[ch] * LeftLevel[ch]; + if(l_ol) + { + l_ol >>= 3; + l_ol += 1; + } + + r_ol = Envelope[ch] * RightLevel[ch]; + if(r_ol) + { + r_ol >>= 3; + r_ol += 1; + } + + left = WD * l_ol; + right = WD * r_ol; +} + +void VSU::Update(int32 timestamp) +{ + //puts("VSU Start"); + int left, right; + + for(int ch = 0; ch < 6; ch++) + { + int32 clocks = timestamp - last_ts; + int32 running_timestamp = last_ts; + + // Output sound here + CalcCurrentOutput(ch, left, right); + Synth.offset_inline(running_timestamp, left - last_output[ch][0], &sbuf[0]); + Synth.offset_inline(running_timestamp, right - last_output[ch][1], &sbuf[1]); + last_output[ch][0] = left; + last_output[ch][1] = right; + + if(!(IntlControl[ch] & 0x80)) + continue; + + while(clocks > 0) + { + int32 chunk_clocks = clocks; + + if(chunk_clocks > EffectsClockDivider[ch]) + chunk_clocks = EffectsClockDivider[ch]; + + if(ch == 5) + { + if(chunk_clocks > NoiseLatcherClockDivider) + chunk_clocks = NoiseLatcherClockDivider; + } + else + { + if(EffFreq[ch] >= 2040) + { + if(chunk_clocks > LatcherClockDivider[ch]) + chunk_clocks = LatcherClockDivider[ch]; + } + else + { + if(chunk_clocks > FreqCounter[ch]) + chunk_clocks = FreqCounter[ch]; + } + } + + if(ch == 5 && chunk_clocks > NoiseLatcherClockDivider) + chunk_clocks = NoiseLatcherClockDivider; + + FreqCounter[ch] -= chunk_clocks; + while(FreqCounter[ch] <= 0) + { + if(ch == 5) + { + int feedback = ((lfsr >> 7) & 1) ^ ((lfsr >> Tap_LUT[(EnvControl[5] >> 12) & 0x7]) & 1) ^ 1; + lfsr = ((lfsr << 1) & 0x7FFF) | feedback; + + FreqCounter[ch] += 10 * (2048 - EffFreq[ch]); + } + else + { + FreqCounter[ch] += 2048 - EffFreq[ch]; + WavePos[ch] = (WavePos[ch] + 1) & 0x1F; + } + } + + LatcherClockDivider[ch] -= chunk_clocks; + while(LatcherClockDivider[ch] <= 0) + LatcherClockDivider[ch] += 120; + + if(ch == 5) + { + NoiseLatcherClockDivider -= chunk_clocks; + if(!NoiseLatcherClockDivider) + { + NoiseLatcherClockDivider = 120; + NoiseLatcher = ((lfsr & 1) << 6) - (lfsr & 1); + } + } + + EffectsClockDivider[ch] -= chunk_clocks; + while(EffectsClockDivider[ch] <= 0) + { + EffectsClockDivider[ch] += 4800; + + IntervalClockDivider[ch]--; + while(IntervalClockDivider[ch] <= 0) + { + IntervalClockDivider[ch] += 4; + + if(IntlControl[ch] & 0x20) + { + IntervalCounter[ch]--; + if(!IntervalCounter[ch]) + { + IntlControl[ch] &= ~0x80; + } + } + + EnvelopeClockDivider[ch]--; + while(EnvelopeClockDivider[ch] <= 0) + { + EnvelopeClockDivider[ch] += 4; + + if(EnvControl[ch] & 0x0100) // Enveloping enabled? + { + EnvelopeCounter[ch]--; + if(!EnvelopeCounter[ch]) + { + EnvelopeCounter[ch] = (EnvControl[ch] & 0x7) + 1; + + if(EnvControl[ch] & 0x0008) // Grow + { + if(Envelope[ch] < 0xF || (EnvControl[ch] & 0x200)) + Envelope[ch] = (Envelope[ch] + 1) & 0xF; + } + else // Decay + { + if(Envelope[ch] > 0 || (EnvControl[ch] & 0x200)) + Envelope[ch] = (Envelope[ch] - 1) & 0xF; + } + } + } + + } // end while(EnvelopeClockDivider[ch] <= 0) + } // end while(IntervalClockDivider[ch] <= 0) + + if(ch == 4) + { + SweepModClockDivider--; + while(SweepModClockDivider <= 0) + { + SweepModClockDivider += (SweepControl & 0x80) ? 8 : 1; + + if(((SweepControl >> 4) & 0x7) && (EnvControl[ch] & 0x4000)) + { + if(SweepModCounter) + SweepModCounter--; + + if(!SweepModCounter) + { + SweepModCounter = (SweepControl >> 4) & 0x7; + + if(EnvControl[ch] & 0x1000) // Modulation + { + if(ModWavePos < 32 || (EnvControl[ch] & 0x2000)) + { + ModWavePos &= 0x1F; + + EffFreq[ch] = (EffFreq[ch] + (int8)ModData[ModWavePos]); + if(EffFreq[ch] < 0) + { + //puts("Underflow"); + EffFreq[ch] = 0; + } + else if(EffFreq[ch] > 0x7FF) + { + //puts("Overflow"); + EffFreq[ch] = 0x7FF; + } + ModWavePos++; + } + //puts("Mod"); + } + else // Sweep + { + int32 delta = EffFreq[ch] >> (SweepControl & 0x7); + int32 NewFreq = EffFreq[ch] + ((SweepControl & 0x8) ? delta : -delta); + + //printf("Sweep(%d): Old: %d, New: %d\n", ch, EffFreq[ch], NewFreq); + + if(NewFreq < 0) + EffFreq[ch] = 0; + else if(NewFreq > 0x7FF) + { + //EffFreq[ch] = 0x7FF; + IntlControl[ch] &= ~0x80; + } + else + EffFreq[ch] = NewFreq; + } + } + } + } // end while(SweepModClockDivider <= 0) + } // end if(ch == 4) + } // end while(EffectsClockDivider[ch] <= 0) + clocks -= chunk_clocks; + running_timestamp += chunk_clocks; + + // Output sound here too. + CalcCurrentOutput(ch, left, right); + Synth.offset_inline(running_timestamp, left - last_output[ch][0], &sbuf[0]); + Synth.offset_inline(running_timestamp, right - last_output[ch][1], &sbuf[1]); + last_output[ch][0] = left; + last_output[ch][1] = right; + } + } + last_ts = timestamp; + //puts("VSU End"); +} + +int32 VSU::EndFrame(int32 timestamp, int16* SoundBuf, int32 SoundBufMaxSize) +{ + int32 ret = 0; + + Update(timestamp); + last_ts = 0; + + if(SoundBuf) + { + for(int y = 0; y < 2; y++) + { + sbuf[y].end_frame(timestamp); + ret = sbuf[y].read_samples(SoundBuf + y, SoundBufMaxSize, 1); + } + } + + return ret; +} + +void VSU::StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY(IntlControl, 6), + SFARRAY(LeftLevel, 6), + SFARRAY(RightLevel, 6), + + SFARRAY16(Frequency, 6), + SFARRAY16(EnvControl, 6), + SFARRAY(RAMAddress, 6), + SFVAR(SweepControl), + + SFARRAY(&WaveData[0][0], 5 * 0x20), + SFARRAY(ModData, 0x20), + + SFARRAY32(EffFreq, 6), + SFARRAY32(Envelope, 6), + + SFARRAY32(WavePos, 6), + + SFVAR(ModWavePos), + + SFARRAY32(LatcherClockDivider, 6), + SFARRAY32(FreqCounter, 6), + SFARRAY32(IntervalCounter, 6), + SFARRAY32(EnvelopeCounter, 6), + + SFVAR(SweepModCounter), + + SFARRAY32(EffectsClockDivider, 6), + SFARRAY32(IntervalClockDivider, 6), + SFARRAY32(EnvelopeClockDivider, 6), + + SFVAR(SweepModClockDivider), + + SFVAR(NoiseLatcherClockDivider), + SFVAR(NoiseLatcher), + SFVAR(lfsr), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "VSU"); + + if(load) + { + + } +} + + + +uint8 VSU::PeekWave(const unsigned int which, uint32 Address) +{ + assert(which <= 4); + + Address &= 0x1F; + + return(WaveData[which][Address]); +} + +void VSU::PokeWave(const unsigned int which, uint32 Address, uint8 value) +{ + assert(which <= 4); + + Address &= 0x1F; + + WaveData[which][Address] = value & 0x3F; +} + +uint8 VSU::PeekModWave(uint32 Address) +{ + Address &= 0x1F; + return(ModData[Address]); +} + +void VSU::PokeModWave(uint32 Address, uint8 value) +{ + Address &= 0x1F; + + ModData[Address] = value & 0xFF; +} diff --git a/Mednafen/mednafen/vb/vsu.h b/Mednafen/mednafen/vb/vsu.h new file mode 100644 index 0000000000..2f0830918a --- /dev/null +++ b/Mednafen/mednafen/vb/vsu.h @@ -0,0 +1,83 @@ +#ifndef __VB_VSU_H +#define __VB_VSU_H + +#include + +class VSU +{ + public: + + VSU() MDFN_COLD; + ~VSU() MDFN_COLD; + + void SetSoundRate(double rate) MDFN_COLD; + + void Power(void) MDFN_COLD; + + void Write(int32 timestamp, uint32 A, uint8 V); + + int32 EndFrame(int32 timestamp, int16* SoundBuf, int32 SoundBufMaxSize); + + void StateAction(StateMem *sm, const unsigned load, const bool data_only); + + uint8 PeekWave(const unsigned int which, uint32 Address); + void PokeWave(const unsigned int which, uint32 Address, uint8 value); + + uint8 PeekModWave(uint32 Address); + void PokeModWave(uint32 Address, uint8 value); + + private: + + void CalcCurrentOutput(int ch, int &left, int &right); + + void Update(int32 timestamp); + + uint8 IntlControl[6]; + uint8 LeftLevel[6]; + uint8 RightLevel[6]; + uint16 Frequency[6]; + uint16 EnvControl[6]; // Channel 5/6 extra functionality tacked on too. + + uint8 RAMAddress[6]; + + uint8 SweepControl; + + uint8 WaveData[5][0x20]; + + uint8 ModData[0x20]; + + // + // + // + int32 EffFreq[6]; + int32 Envelope[6]; + + int32 WavePos[6]; + int32 ModWavePos; + + int32 LatcherClockDivider[6]; + + int32 FreqCounter[6]; + int32 IntervalCounter[6]; + int32 EnvelopeCounter[6]; + int32 SweepModCounter; + + int32 EffectsClockDivider[6]; + int32 IntervalClockDivider[6]; + int32 EnvelopeClockDivider[6]; + int32 SweepModClockDivider; + + int32 NoiseLatcherClockDivider; + uint32 NoiseLatcher; + + uint32 lfsr; + + int32 last_output[6][2]; + int32 last_ts; + + Blip_Buffer sbuf[2]; + Blip_Synth Synth; + Blip_Synth NoiseSynth; +}; + +#endif diff --git a/Mednafen/mednafen/video-driver.h b/Mednafen/mednafen/video-driver.h new file mode 100644 index 0000000000..f4d0d8c8ca --- /dev/null +++ b/Mednafen/mednafen/video-driver.h @@ -0,0 +1,9 @@ +#ifndef __VIDEO_DRIVER_H +#define __VIDEO_DRIVER_H + +#include "video.h" + +void MDFND_DispMessage(char* text); +void MDFNI_SaveSnapshot(const MDFN_Surface *src, const MDFN_Rect *rect, const int32 *LineWidths); + +#endif diff --git a/Mednafen/mednafen/video.h b/Mednafen/mednafen/video.h new file mode 100644 index 0000000000..48cd18690b --- /dev/null +++ b/Mednafen/mednafen/video.h @@ -0,0 +1,18 @@ +#ifndef __MDFN_VIDEO_H +#define __MDFN_VIDEO_H + +#include "video/surface.h" +#include "video/primitives.h" +#include "video/text.h" + +#include + +void MDFN_ResetMessages(void); +void MDFN_InitFontData(void); +void MDFN_DispMessage(const char *format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); + +int MDFN_InitVirtualVideo(void); +void MDFN_KillVirtualVideo(void); + + +#endif diff --git a/Mednafen/mednafen/video/Deinterlacer.cpp b/Mednafen/mednafen/video/Deinterlacer.cpp new file mode 100644 index 0000000000..6f24befaf4 --- /dev/null +++ b/Mednafen/mednafen/video/Deinterlacer.cpp @@ -0,0 +1,209 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "video-common.h" +#include "Deinterlacer.h" + +Deinterlacer::Deinterlacer() : FieldBuffer(NULL), StateValid(false), DeintType(DEINT_WEAVE) +{ + PrevDRect.x = 0; + PrevDRect.y = 0; + + PrevDRect.w = 0; + PrevDRect.h = 0; +} + +Deinterlacer::~Deinterlacer() +{ + if(FieldBuffer) + { + delete FieldBuffer; + FieldBuffer = NULL; + } +} + +void Deinterlacer::SetType(unsigned dt) +{ + if(DeintType != dt) + { + DeintType = dt; + + LWBuffer.resize(0); + if(FieldBuffer) + { + delete FieldBuffer; + FieldBuffer = NULL; + } + StateValid = false; + } +} + +template +void Deinterlacer::InternalProcess(MDFN_Surface *surface, MDFN_Rect &DisplayRect, int32 *LineWidths, const bool field) +{ + // + // We need to output with LineWidths as always being valid to handle the case of horizontal resolution change between fields + // while in interlace mode, so clear the first LineWidths entry if it's == ~0, and + // [...] + const bool LineWidths_In_Valid = (LineWidths[0] != ~0); + const bool WeaveGood = (StateValid && PrevDRect.h == DisplayRect.h && DeintType == DEINT_WEAVE); + // + // XReposition stuff is to prevent exceeding the dimensions of the video surface under certain conditions(weave deinterlacer, previous field has higher + // horizontal resolution than current field, and current field's rectangle has an x offset that's too large when taking into consideration the previous field's + // width; for simplicity, we don't check widths, but just assume that the previous field's maximum width is >= than the current field's maximum width). + // + const int32 XReposition = ((WeaveGood && DisplayRect.x > PrevDRect.x) ? DisplayRect.x : 0); + + //printf("%2d %2d, %d\n", DisplayRect.x, PrevDRect.x, XReposition); + + if(XReposition) + DisplayRect.x = 0; + + if(surface->h && !LineWidths_In_Valid) + { + LineWidths[0] = 0; + } + + for(int y = 0; y < DisplayRect.h / 2; y++) + { + // [...] + // set all relevant source line widths to the contents of DisplayRect(also simplifies the src_lw and related pointer calculation code + // farther below. + if(!LineWidths_In_Valid) + LineWidths[(y * 2) + field + DisplayRect.y] = DisplayRect.w; + + if(XReposition) + { + memmove(surface->pix() + ((y * 2) + field + DisplayRect.y) * surface->pitchinpix, + surface->pix() + ((y * 2) + field + DisplayRect.y) * surface->pitchinpix + XReposition, + LineWidths[(y * 2) + field + DisplayRect.y] * sizeof(T)); + } + + if(WeaveGood) + { + const T* src = FieldBuffer->pix() + y * FieldBuffer->pitchinpix; + T* dest = surface->pix() + ((y * 2) + (field ^ 1) + DisplayRect.y) * surface->pitchinpix + DisplayRect.x; + int32 *dest_lw = &LineWidths[(y * 2) + (field ^ 1) + DisplayRect.y]; + + *dest_lw = LWBuffer[y]; + + memcpy(dest, src, LWBuffer[y] * sizeof(T)); + } + else if(DeintType == DEINT_BOB) + { + const T* src = surface->pix() + ((y * 2) + field + DisplayRect.y) * surface->pitchinpix + DisplayRect.x; + T* dest = surface->pix() + ((y * 2) + (field ^ 1) + DisplayRect.y) * surface->pitchinpix + DisplayRect.x; + const int32 *src_lw = &LineWidths[(y * 2) + field + DisplayRect.y]; + int32 *dest_lw = &LineWidths[(y * 2) + (field ^ 1) + DisplayRect.y]; + + *dest_lw = *src_lw; + + memcpy(dest, src, *src_lw * sizeof(T)); + } + else + { + const int32 *src_lw = &LineWidths[(y * 2) + field + DisplayRect.y]; + const T* src = surface->pix() + ((y * 2) + field + DisplayRect.y) * surface->pitchinpix + DisplayRect.x; + const int32 dly = ((y * 2) + (field + 1) + DisplayRect.y); + T* dest = surface->pix() + dly * surface->pitchinpix + DisplayRect.x; + + if(y == 0 && field) + { + T black = surface->MakeColor(0, 0, 0); + T* dm2 = surface->pix() + (dly - 2) * surface->pitchinpix; + + LineWidths[dly - 2] = *src_lw; + + for(int x = 0; x < *src_lw; x++) + dm2[x] = black; + } + + if(dly < (DisplayRect.y + DisplayRect.h)) + { + LineWidths[dly] = *src_lw; + memcpy(dest, src, *src_lw * sizeof(T)); + } + } + + // + // + // + // + // + // + if(DeintType == DEINT_WEAVE) + { + const int32 *src_lw = &LineWidths[(y * 2) + field + DisplayRect.y]; + const T* src = surface->pix() + ((y * 2) + field + DisplayRect.y) * surface->pitchinpix + DisplayRect.x; + T* dest = FieldBuffer->pix() + y * FieldBuffer->pitchinpix; + + memcpy(dest, src, *src_lw * sizeof(uint32)); + LWBuffer[y] = *src_lw; + + StateValid = true; + } + } +} + +void Deinterlacer::Process(MDFN_Surface *surface, MDFN_Rect &DisplayRect, int32 *LineWidths, const bool field) +{ + const MDFN_Rect DisplayRect_Original = DisplayRect; + + if(DeintType == DEINT_WEAVE) + { + if(!FieldBuffer || FieldBuffer->w < surface->w || FieldBuffer->h < (surface->h / 2)) + { + if(FieldBuffer) + delete FieldBuffer; + + FieldBuffer = new MDFN_Surface(NULL, surface->w, surface->h / 2, surface->w, surface->format); + LWBuffer.resize(FieldBuffer->h); + } + else if(memcmp(&surface->format, &FieldBuffer->format, sizeof(MDFN_PixelFormat))) + { + FieldBuffer->SetFormat(surface->format, StateValid && PrevDRect.h == DisplayRect.h); + } + } + + switch(surface->format.bpp) + { + case 8: + InternalProcess(surface, DisplayRect, LineWidths, field); + break; + + case 16: + InternalProcess(surface, DisplayRect, LineWidths, field); + break; + + case 32: + InternalProcess(surface, DisplayRect, LineWidths, field); + break; + } + + PrevDRect = DisplayRect_Original; +} + +void Deinterlacer::ClearState(void) +{ + StateValid = false; + + PrevDRect.x = 0; + PrevDRect.y = 0; + + PrevDRect.w = 0; + PrevDRect.h = 0; +} diff --git a/Mednafen/mednafen/video/Deinterlacer.h b/Mednafen/mednafen/video/Deinterlacer.h new file mode 100644 index 0000000000..7f7c6704c7 --- /dev/null +++ b/Mednafen/mednafen/video/Deinterlacer.h @@ -0,0 +1,59 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __MDFN_DEINTERLACER_H +#define __MDFN_DEINTERLACER_H + +#include + +class Deinterlacer +{ + public: + + Deinterlacer(); + ~Deinterlacer(); + + enum + { + DEINT_BOB_OFFSET = 0, // Code will fall-through to this case under certain conditions, too. + DEINT_BOB, + DEINT_WEAVE, + }; + + void SetType(unsigned t); + inline unsigned GetType(void) + { + return(DeintType); + } + + void Process(MDFN_Surface *surface, MDFN_Rect &DisplayRect, int32 *LineWidths, const bool field); + + void ClearState(void); + + private: + + template + void InternalProcess(MDFN_Surface *surface, MDFN_Rect &DisplayRect, int32 *LineWidths, const bool field); + + MDFN_Surface *FieldBuffer; + std::vector LWBuffer; + bool StateValid; + MDFN_Rect PrevDRect; + unsigned DeintType; +}; + +#endif diff --git a/Mednafen/mednafen/video/Makefile.am.inc b/Mednafen/mednafen/video/Makefile.am.inc new file mode 100644 index 0000000000..c1cc4e5498 --- /dev/null +++ b/Mednafen/mednafen/video/Makefile.am.inc @@ -0,0 +1 @@ +mednafen_SOURCES += video/surface.cpp video/font-data.cpp video/font-data-18x18.c video/font-data-12x13.c video/png.cpp video/primitives.cpp video/text.cpp video/video.cpp video/tblur.cpp video/resize.cpp video/Deinterlacer.cpp diff --git a/Mednafen/mednafen/video/README.FONTS b/Mednafen/mednafen/video/README.FONTS new file mode 100644 index 0000000000..719852f2d2 --- /dev/null +++ b/Mednafen/mednafen/video/README.FONTS @@ -0,0 +1,5 @@ +Bitmap font sources: + +http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html +http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz +http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts-asian.tar.gz diff --git a/Mednafen/mednafen/video/font-data-12x13.c b/Mednafen/mednafen/video/font-data-12x13.c new file mode 100644 index 0000000000..78672c9352 --- /dev/null +++ b/Mednafen/mednafen/video/font-data-12x13.c @@ -0,0 +1,43 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +//#include "../mednafen.h" +//#include "font-data.h" + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +typedef struct +{ + uint16_t glyph_num; + uint8_t data[13 * 2]; +} font12x13; + +font12x13 FontData12x13[]= +{ + #ifdef WANT_INTERNAL_CJK + #include "font12x13.h" + #else + + #endif +}; + +const int FontData12x13_Size = sizeof(FontData12x13); + diff --git a/Mednafen/mednafen/video/font-data-18x18.c b/Mednafen/mednafen/video/font-data-18x18.c new file mode 100644 index 0000000000..968d7452e9 --- /dev/null +++ b/Mednafen/mednafen/video/font-data-18x18.c @@ -0,0 +1,43 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +//#include "../mednafen.h" +//#include "font-data.h" + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +typedef struct +{ + uint16_t glyph_num; + uint8_t data[18 * 3]; +} font18x18; + +font18x18 FontData18x18[]= +{ + #ifdef WANT_INTERNAL_CJK + #include "font18x18.h" + #else + + #endif +}; + +const int FontData18x18_Size = sizeof(FontData18x18); + diff --git a/Mednafen/mednafen/video/font-data.cpp b/Mednafen/mednafen/video/font-data.cpp new file mode 100644 index 0000000000..21f172859d --- /dev/null +++ b/Mednafen/mednafen/video/font-data.cpp @@ -0,0 +1,46 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "font-data.h" + +const font4x5 FontData4x5[] = +{ + #include "font4x5.h" +}; + +const font5x7 FontData5x7[] = +{ + #include "font5x7.h" +}; + +const font6x13 FontData6x13[] = +{ + #include "font6x13.h" +}; + +const font9x18 FontData9x18[]= +{ + #include "font9x18.h" +}; + + +const int FontData4x5_Size = sizeof(FontData4x5); +const int FontData5x7_Size = sizeof(FontData5x7); +const int FontData6x13_Size = sizeof(FontData6x13); +const int FontData9x18_Size = sizeof(FontData9x18); + diff --git a/Mednafen/mednafen/video/font-data.h b/Mednafen/mednafen/video/font-data.h new file mode 100644 index 0000000000..0d7b110e20 --- /dev/null +++ b/Mednafen/mednafen/video/font-data.h @@ -0,0 +1,63 @@ +// Note: The size of each these structs shouldn't exceed 256 bytes(current worst-case is about 56 bytes with the 18x18 font). + +typedef struct +{ + uint16 glyph_num; + uint8 data[5]; +} font4x5; + +typedef struct +{ + uint16 glyph_num; + uint8 data[7]; +} font5x7; + +typedef struct +{ + uint16 glyph_num; + uint8 data[13]; +} font6x13; + +typedef struct +{ + uint16 glyph_num; + uint8 data[18 * 2]; +} font9x18; + +extern const font4x5 FontData4x5[]; +extern const font5x7 FontData5x7[]; +extern const font6x13 FontData6x13[]; +extern const font9x18 FontData9x18[]; + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + uint16_t glyph_num; + uint8_t data[13 * 2]; +} font12x13; + +typedef struct +{ + uint16 glyph_num; + uint8 data[18 * 3]; +} font18x18; + +extern font12x13 FontData12x13[]; +extern font18x18 FontData18x18[]; + +extern const int FontData12x13_Size; +extern const int FontData18x18_Size; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +extern const int FontData4x5_Size; +extern const int FontData5x7_Size; +extern const int FontData6x13_Size; +extern const int FontData9x18_Size; + diff --git a/Mednafen/mednafen/video/font12x13.h b/Mednafen/mednafen/video/font12x13.h new file mode 100644 index 0000000000..a6a7bccddb --- /dev/null +++ b/Mednafen/mednafen/video/font12x13.h @@ -0,0 +1,19204 @@ +{ 0x0000, {0x00,0x00,0x00,0x00,0xAA,0xA0,0x00,0x00,0x80,0x20,0x00,0x00,0x80,0x20,0x00,0x00,0x80,0x20,0x00,0x00,0xAA,0xA0,0x00,0x00,0x00,0x00,}}, +{ 0x0020, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0021, {0x00,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x0022, {0x00,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0023, {0x00,0x00,0x08,0x80,0x08,0x80,0x3F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x00,0x00,}}, +{ 0x0024, {0x00,0x00,0x04,0x00,0x1F,0x00,0x24,0x80,0x25,0x80,0x3C,0x00,0x0F,0x00,0x05,0x80,0x34,0x80,0x24,0x80,0x1F,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x0025, {0x00,0x00,0x38,0x20,0x6C,0x40,0x6C,0x80,0x6D,0x00,0x3A,0x00,0x05,0xC0,0x0B,0x60,0x13,0x60,0x23,0x60,0x41,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0026, {0x00,0x00,0x1C,0x00,0x32,0x00,0x32,0x00,0x3C,0x00,0x19,0xC0,0x38,0x80,0x6D,0x80,0x63,0x00,0x67,0x00,0x38,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0027, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0028, {0x00,0x00,0x00,0x80,0x01,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x00,0x80,0x00,0x00,}}, +{ 0x0029, {0x00,0x00,0x20,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x002A, {0x00,0x00,0x04,0x00,0x0E,0x00,0x24,0x80,0x75,0xC0,0x0E,0x00,0x0E,0x00,0x75,0xC0,0x24,0x80,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x002B, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x002C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x002D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x002E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x002F, {0x00,0x00,0x00,0x60,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0030, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0031, {0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0032, {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x80,0x38,0xC0,0x19,0x80,0x01,0x00,0x02,0x00,0x04,0x40,0x0F,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0033, {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x80,0x30,0xC0,0x01,0x80,0x07,0x00,0x00,0x80,0x30,0xC0,0x11,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0034, {0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x31,0x80,0x3F,0xC0,0x01,0x80,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0035, {0x00,0x00,0x00,0x00,0x1F,0x80,0x1F,0x00,0x10,0x00,0x1F,0x00,0x01,0x80,0x00,0xC0,0x00,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0036, {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x80,0x30,0x00,0x2F,0x00,0x71,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0037, {0x00,0x00,0x00,0x00,0x1F,0xC0,0x1F,0x80,0x21,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0038, {0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x80,0x38,0xC0,0x1D,0x80,0x0F,0x00,0x1B,0x80,0x31,0xC0,0x10,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0039, {0x00,0x00,0x00,0x00,0x06,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x19,0xC0,0x0E,0xC0,0x00,0x80,0x31,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x003A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x003B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x003C, {0x00,0x00,0x00,0x40,0x01,0x80,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x00,}}, +{ 0x003D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x003E, {0x00,0x00,0x20,0x00,0x18,0x00,0x04,0x00,0x03,0x00,0x00,0x80,0x00,0x40,0x00,0x80,0x03,0x00,0x04,0x00,0x18,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x003F, {0x00,0x00,0x0E,0x00,0x13,0x00,0x21,0x80,0x31,0x80,0x33,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x0040, {0x00,0x00,0x07,0x00,0x18,0xC0,0x27,0x20,0x29,0xA0,0x49,0xA0,0x51,0x20,0x53,0x40,0x4E,0x80,0x20,0x20,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0041, {0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x07,0x00,0x09,0x00,0x09,0x80,0x10,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0042, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3F,0x00,0x30,0x80,0x30,0xC0,0x30,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0043, {0x00,0x00,0x00,0x00,0x07,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0044, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0045, {0x00,0x00,0x00,0x00,0x7F,0x80,0x30,0x80,0x30,0x00,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0046, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0x40,0x18,0x00,0x18,0x80,0x1F,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0047, {0x00,0x00,0x00,0x00,0x0E,0x80,0x31,0x80,0x60,0x00,0x60,0x00,0x63,0xC0,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0048, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0049, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x004A, {0x00,0x00,0x00,0x00,0x07,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x004B, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0x80,0x31,0x00,0x33,0x00,0x35,0x80,0x39,0x80,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x004C, {0x00,0x00,0x00,0x00,0x7C,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x004D, {0x00,0x00,0x00,0x00,0x61,0xC0,0x31,0x80,0x31,0x80,0x3B,0x80,0x3B,0x80,0x2D,0x80,0x2D,0x80,0x25,0x80,0x71,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x004E, {0x00,0x00,0x00,0x00,0x31,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x11,0x80,0x10,0x80,0x39,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x004F, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0050, {0x00,0x00,0x00,0x00,0x3F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0051, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x6C,0xC0,0x33,0x80,0x1F,0x80,0x00,0xC0,0x00,0x00,}}, +{ 0x0052, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0053, {0x00,0x00,0x00,0x00,0x0E,0x80,0x11,0x80,0x30,0x80,0x1C,0x00,0x0F,0x00,0x03,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0054, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0055, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0056, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x18,0x40,0x18,0x80,0x0C,0x80,0x0D,0x00,0x07,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0057, {0x00,0x00,0x00,0x00,0xEE,0x60,0x66,0x40,0x66,0x40,0x37,0xC0,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0058, {0x00,0x00,0x00,0x00,0x79,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0E,0x00,0x13,0x00,0x21,0x80,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0059, {0x00,0x00,0x00,0x00,0x7B,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x005A, {0x00,0x00,0x00,0x00,0x7F,0x80,0x43,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x005B, {0x00,0x00,0x07,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x00,0x00,}}, +{ 0x005C, {0x00,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x60,0x00,0x00,0x00,0x00,}}, +{ 0x005D, {0x00,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3C,0x00,0x00,0x00,}}, +{ 0x005E, {0x00,0x00,0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x005F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,}}, +{ 0x0060, {0x00,0x00,0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0061, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0062, {0x00,0x00,0x00,0x00,0x38,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1C,0xC0,0x3B,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0063, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0064, {0x00,0x00,0x00,0x00,0x03,0x80,0x01,0x80,0x0D,0x80,0x33,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0065, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0066, {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x80,0x18,0x00,0x3F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0067, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x19,0x80,0x11,0x80,0x11,0x00,0x0E,0x00,0x1F,0x80,0x31,0xC0,0x10,0x40,0x0F,0x80,}}, +{ 0x0068, {0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x36,0x00,0x3B,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0069, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x006A, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x13,0x00,0x32,0x00,0x1C,0x00,}}, +{ 0x006B, {0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x31,0x80,0x33,0x00,0x36,0x00,0x3F,0x00,0x33,0x00,0x31,0x80,0x79,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x006C, {0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x006D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x76,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x006E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x39,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x006F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0070, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x00,0x1C,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1C,0x80,0x1B,0x00,0x18,0x00,0x3C,0x00,}}, +{ 0x0071, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xC0,0x13,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x13,0x80,0x0D,0x80,0x01,0x80,0x03,0xC0,}}, +{ 0x0072, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x00,0x1D,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0073, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0074, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0075, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0076, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x18,0x80,0x18,0x80,0x0D,0x00,0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0077, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xE0,0x76,0x40,0x36,0x40,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0078, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0xC0,0x18,0x80,0x0D,0x00,0x06,0x00,0x0F,0x00,0x11,0x80,0x3B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0079, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xC0,0x30,0x80,0x18,0x80,0x19,0x00,0x0D,0x00,0x0E,0x00,0x66,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x007A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x21,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x007B, {0x00,0x00,0x01,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x02,0x00,0x0C,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x00,0x00,}}, +{ 0x007C, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x007D, {0x00,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x06,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x007E, {0x00,0x00,0x1C,0xC0,0x33,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00A0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00A1, {0x00,0x00,0x04,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x00A2, {0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x0F,0x00,0x1B,0x80,0x32,0xC0,0x32,0x00,0x34,0x00,0x1C,0xC0,0x0F,0x80,0x08,0x00,0x08,0x00,}}, +{ 0x00A3, {0x00,0x00,0x03,0x80,0x06,0xC0,0x0C,0xC0,0x0C,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x3C,0x20,0x4E,0x40,0x39,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00A4, {0x00,0x00,0x00,0x00,0x60,0xC0,0x35,0x80,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x1F,0x00,0x35,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00A5, {0x00,0x00,0x70,0xE0,0x30,0x40,0x18,0x80,0x0C,0x80,0x0D,0x00,0x3F,0xC0,0x06,0x00,0x3F,0xC0,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00A6, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00A7, {0x00,0x00,0x0E,0x00,0x11,0x00,0x18,0x00,0x0C,0x00,0x0E,0x00,0x13,0x00,0x19,0x00,0x0E,0x00,0x06,0x00,0x13,0x00,0x11,0x00,0x0E,0x00,}}, +{ 0x00A8, {0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00A9, {0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x4F,0x20,0x59,0xA0,0x58,0x20,0x59,0xA0,0x4F,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00AA, {0x00,0x00,0x1C,0x00,0x36,0x00,0x06,0x00,0x3E,0x00,0x66,0x00,0x3A,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00AB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x09,0x00,0x1B,0x00,0x1B,0x00,0x09,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00AC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x00AD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00AE, {0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x5F,0x20,0x59,0xA0,0x5F,0x20,0x5B,0x20,0x59,0xA0,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00AF, {0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00B0, {0x00,0x00,0x00,0x00,0x18,0x00,0x24,0x00,0x24,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00B1, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00B2, {0x1C,0x00,0x26,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00B3, {0x1C,0x00,0x36,0x00,0x06,0x00,0x0C,0x00,0x06,0x00,0x36,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00B4, {0x00,0x00,0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00B5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x39,0xC0,0x36,0xE0,0x30,0x00,0x78,0x00,}}, +{ 0x00B6, {0x00,0x00,0x00,0x00,0x1F,0xC0,0x3D,0x80,0x3D,0x80,0x1D,0x80,0x0D,0x80,0x0D,0x80,0x0D,0x80,0x0D,0x80,0x0D,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00B7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00B8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x0E,0x00,}}, +{ 0x00B9, {0x18,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00BA, {0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00BB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x09,0x00,0x0D,0x80,0x0D,0x80,0x09,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00BC, {0x61,0x00,0xE1,0x00,0x62,0x00,0x62,0x00,0x64,0x00,0x65,0xC0,0xF9,0xC0,0x0B,0xC0,0x12,0xC0,0x16,0xC0,0x27,0xE0,0x20,0xC0,0x00,0x00,}}, +{ 0x00BD, {0x61,0x00,0xE1,0x00,0x62,0x00,0x62,0x00,0x64,0x00,0x65,0xC0,0xFA,0x60,0x08,0x60,0x10,0xC0,0x11,0x80,0x23,0x00,0x23,0xE0,0x00,0x00,}}, +{ 0x00BE, {0x61,0x00,0xB1,0x00,0x32,0x00,0x62,0x00,0x34,0x00,0xB5,0xC0,0x69,0xC0,0x0B,0xC0,0x12,0xC0,0x16,0xC0,0x27,0xE0,0x20,0xC0,0x00,0x00,}}, +{ 0x00BF, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x19,0x80,0x31,0x80,0x30,0x80,0x19,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x00C0, {0x06,0x00,0x03,0x00,0x00,0x80,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x00C1, {0x03,0x00,0x06,0x00,0x08,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x00C2, {0x06,0x00,0x0F,0x00,0x10,0x80,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x00C3, {0x0E,0xC0,0x1B,0x80,0x00,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x00C4, {0x19,0x80,0x19,0x80,0x00,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x00C5, {0x03,0x00,0x04,0x80,0x03,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x00C6, {0x00,0x00,0x00,0x00,0x07,0xC0,0x06,0x20,0x0E,0x00,0x12,0x40,0x13,0xC0,0x22,0x40,0x3E,0x00,0x42,0x20,0xE7,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00C7, {0x00,0x00,0x00,0x00,0x07,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x03,0x00,0x0E,0x00,}}, +{ 0x00C8, {0x18,0x00,0x0C,0x00,0x02,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00C9, {0x06,0x00,0x0C,0x00,0x10,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00CA, {0x0C,0x00,0x1E,0x00,0x21,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00CB, {0x33,0x00,0x33,0x00,0x00,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00CC, {0x0C,0x00,0x06,0x00,0x01,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00CD, {0x03,0x00,0x06,0x00,0x08,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00CE, {0x06,0x00,0x0F,0x00,0x10,0x80,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00CF, {0x19,0x80,0x19,0x80,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00D0, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x30,0xC0,0x30,0xC0,0x78,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00D1, {0x0E,0x40,0x13,0x80,0x00,0x00,0x3B,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x11,0x80,0x39,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00D2, {0x0C,0x00,0x06,0x00,0x01,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00D3, {0x06,0x00,0x0C,0x00,0x10,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00D4, {0x0C,0x00,0x1E,0x00,0x21,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00D5, {0x1D,0x80,0x37,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00D6, {0x19,0x80,0x19,0x80,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00D7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xC0,0x19,0x80,0x0F,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00D8, {0x00,0x00,0x01,0x80,0x1F,0x80,0x33,0x80,0x66,0xC0,0x66,0xC0,0x6C,0xC0,0x6C,0xC0,0x78,0xC0,0x79,0x80,0x3F,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x00D9, {0x0C,0x00,0x06,0x00,0x01,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00DA, {0x01,0x80,0x03,0x00,0x04,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00DB, {0x06,0x00,0x0F,0x00,0x10,0x80,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00DC, {0x19,0x80,0x19,0x80,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00DD, {0x03,0x00,0x06,0x00,0x08,0x00,0x7B,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00DE, {0x00,0x00,0x00,0x00,0x38,0x00,0x1F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00DF, {0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x1B,0x00,0x3B,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x3B,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00E0, {0x18,0x00,0x0C,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E1, {0x06,0x00,0x0C,0x00,0x10,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E2, {0x0C,0x00,0x1E,0x00,0x21,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E3, {0x00,0x00,0x1D,0x80,0x37,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E4, {0x00,0x00,0x33,0x00,0x33,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E5, {0x0C,0x00,0x12,0x00,0x0C,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0xC0,0x66,0x60,0x66,0x60,0x1F,0xE0,0x66,0x00,0xC7,0x60,0x79,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00E7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x03,0x00,0x0E,0x00,}}, +{ 0x00E8, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00E9, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00EA, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00EB, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00EC, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00ED, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00EE, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00EF, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x00F0, {0x00,0x00,0x36,0x00,0x1C,0x00,0x1C,0x00,0x36,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x1B,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F1, {0x00,0x00,0x1D,0x80,0x37,0x00,0x00,0x00,0x77,0x00,0x39,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00F2, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F3, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F4, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F5, {0x00,0x00,0x0E,0xC0,0x1B,0x80,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F6, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x00F8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0xC0,0x19,0x80,0x33,0xC0,0x36,0xC0,0x3C,0xC0,0x19,0x80,0x1F,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x00F9, {0x18,0x00,0x0C,0x00,0x02,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00FA, {0x06,0x00,0x0C,0x00,0x10,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00FB, {0x0C,0x00,0x1E,0x00,0x21,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00FC, {0x00,0x00,0x33,0x00,0x33,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x00FD, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x7D,0xC0,0x30,0x80,0x18,0x80,0x19,0x00,0x0D,0x00,0x0E,0x00,0x66,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x00FE, {0x00,0x00,0x00,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x1F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,}}, +{ 0x00FF, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x7D,0xC0,0x30,0x80,0x18,0x80,0x19,0x00,0x0D,0x00,0x0E,0x00,0x66,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x0100, {0x00,0x00,0x0F,0x80,0x00,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0101, {0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0102, {0x18,0xC0,0x0F,0x80,0x00,0x00,0x02,0x00,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0103, {0x00,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0104, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x12,0x00,0x13,0x00,0x21,0x00,0x3F,0x80,0x40,0x80,0xE1,0x80,0x01,0xA0,0x00,0xC0,}}, +{ 0x0105, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3D,0x80,0x03,0x00,0x01,0xC0,}}, +{ 0x0106, {0x01,0x80,0x03,0x00,0x04,0x00,0x0F,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0107, {0x01,0x80,0x03,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0108, {0x06,0x00,0x0F,0x00,0x10,0x80,0x0F,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0109, {0x00,0x00,0x06,0x00,0x0F,0x00,0x10,0x80,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x010A, {0x06,0x00,0x06,0x00,0x00,0x00,0x0F,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x010B, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x010C, {0x10,0x80,0x0F,0x00,0x06,0x00,0x0F,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x010D, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x010E, {0x21,0x00,0x1E,0x00,0x0C,0x00,0x7E,0x00,0x31,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x010F, {0x42,0x00,0x3C,0x00,0x1B,0x80,0x01,0x80,0x0D,0x80,0x33,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0110, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x30,0xC0,0x30,0xC0,0x78,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0111, {0x00,0x00,0x03,0x80,0x01,0x80,0x07,0xC0,0x01,0x80,0x1D,0x80,0x33,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0112, {0x00,0x00,0x1F,0x00,0x00,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0113, {0x00,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0114, {0x31,0x80,0x1F,0x00,0x00,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0115, {0x00,0x00,0x18,0xC0,0x0F,0x80,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0116, {0x0C,0x00,0x0C,0x00,0x00,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0117, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0118, {0x00,0x00,0x00,0x00,0x7F,0x80,0x30,0x80,0x30,0x00,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x08,0x00,0x0E,0x00,}}, +{ 0x0119, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x04,0x00,0x07,0x00,}}, +{ 0x011A, {0x21,0x00,0x1E,0x00,0x0C,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x011B, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x011C, {0x0C,0x00,0x1E,0x00,0x21,0x00,0x0E,0x80,0x31,0x80,0x60,0x00,0x63,0xC0,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x011D, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x0F,0xC0,0x19,0x80,0x11,0x80,0x11,0x00,0x0E,0x00,0x1F,0x80,0x31,0xC0,0x10,0x40,0x0F,0x80,}}, +{ 0x011E, {0x31,0x80,0x1F,0x00,0x00,0x00,0x0E,0x80,0x31,0x80,0x60,0x00,0x63,0xC0,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x011F, {0x00,0x00,0x18,0xC0,0x0F,0x80,0x00,0x00,0x0F,0xC0,0x19,0x80,0x11,0x80,0x11,0x00,0x0E,0x00,0x1F,0x80,0x31,0xC0,0x10,0x40,0x0F,0x80,}}, +{ 0x0120, {0x0C,0x00,0x0C,0x00,0x00,0x00,0x0E,0x80,0x31,0x80,0x60,0x00,0x63,0xC0,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0121, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x0F,0xC0,0x19,0x80,0x11,0x80,0x11,0x00,0x0E,0x00,0x1F,0x80,0x31,0xC0,0x10,0x40,0x0F,0x80,}}, +{ 0x0122, {0x00,0x00,0x00,0x00,0x0E,0x80,0x31,0x80,0x60,0x00,0x60,0x00,0x63,0xC0,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x00,0x06,0x00,0x1C,0x00,}}, +{ 0x0123, {0x02,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x0F,0xC0,0x19,0x80,0x11,0x80,0x11,0x00,0x0E,0x00,0x1F,0x80,0x31,0xC0,0x10,0x40,0x0F,0x80,}}, +{ 0x0124, {0x06,0x00,0x0F,0x00,0x10,0x80,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0125, {0x06,0x00,0x0F,0x00,0x70,0x80,0x30,0x00,0x36,0x00,0x3B,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0126, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x7F,0xE0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0127, {0x00,0x00,0x70,0x00,0x30,0x00,0x7E,0x00,0x30,0x00,0x36,0x00,0x3B,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0128, {0x1D,0x80,0x37,0x00,0x00,0x00,0x3F,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0129, {0x00,0x00,0x00,0x00,0x1D,0x80,0x37,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x012A, {0x00,0x00,0x0F,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x012B, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x012C, {0x19,0x80,0x0F,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x012D, {0x00,0x00,0x00,0x00,0x19,0x80,0x0F,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x012E, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x04,0x00,0x07,0x00,}}, +{ 0x012F, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x04,0x00,0x07,0x00,}}, +{ 0x0130, {0x06,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0131, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0132, {0x00,0x00,0x00,0x00,0xF3,0xE0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x6C,0xC0,0x6C,0xC0,0x6D,0x80,0xF7,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0133, {0x00,0x00,0x20,0x40,0x70,0xE0,0x20,0x40,0x00,0x00,0x73,0xE0,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x7A,0x60,0x06,0x40,0x03,0x80,}}, +{ 0x0134, {0x01,0x80,0x03,0xC0,0x04,0x20,0x07,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0135, {0x00,0x00,0x03,0x00,0x07,0x80,0x08,0x40,0x00,0x00,0x1F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x13,0x00,0x32,0x00,0x1C,0x00,}}, +{ 0x0136, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0x80,0x31,0x00,0x33,0x00,0x35,0x80,0x39,0x80,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x18,0x00,0x70,0x00,}}, +{ 0x0137, {0x00,0x00,0x00,0x00,0x38,0x00,0x18,0x00,0x18,0xC0,0x19,0x80,0x1B,0x00,0x1F,0x80,0x19,0x80,0x18,0xC0,0x3C,0xE0,0x18,0x00,0x70,0x00,}}, +{ 0x0138, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xC0,0x31,0x80,0x33,0x00,0x3E,0x00,0x33,0x00,0x31,0x80,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0139, {0x06,0x00,0x0C,0x00,0x10,0x00,0x7C,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x013A, {0x03,0x00,0x06,0x00,0x08,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x013B, {0x00,0x00,0x00,0x00,0x7C,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x0C,0x00,0x38,0x00,}}, +{ 0x013C, {0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x1C,0x00,}}, +{ 0x013D, {0x42,0x00,0x3C,0x00,0x18,0x00,0x3E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x20,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x013E, {0x10,0x80,0x0F,0x00,0x06,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x013F, {0x00,0x00,0x00,0x00,0x7C,0x00,0x30,0x00,0x30,0x00,0x32,0x00,0x37,0x00,0x32,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0140, {0x00,0x00,0x00,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x0D,0xC0,0x0C,0x80,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0141, {0x00,0x00,0x00,0x00,0x3E,0x00,0x18,0x00,0x1A,0x00,0x1C,0x00,0x18,0x00,0x38,0x00,0x58,0x00,0x18,0x20,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0142, {0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x80,0x07,0x00,0x06,0x00,0x0E,0x00,0x16,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0143, {0x03,0x00,0x06,0x00,0x08,0x00,0x31,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x10,0x80,0x39,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0144, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x77,0x00,0x39,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0145, {0x00,0x00,0x00,0x00,0x31,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x11,0x80,0x10,0x80,0x39,0xC0,0x18,0x00,0x70,0x00,}}, +{ 0x0146, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x80,0x1C,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3D,0xE0,0x18,0x00,0x70,0x00,}}, +{ 0x0147, {0x10,0x80,0x0F,0x00,0x06,0x00,0x31,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x10,0x80,0x39,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0148, {0x21,0x00,0x1E,0x00,0x0C,0x00,0x00,0x00,0x77,0x00,0x39,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0149, {0x00,0x00,0x40,0x00,0xE0,0x00,0x60,0x00,0xDD,0xC0,0x0E,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x1E,0xF0,0x00,0x00,0x00,0x00,}}, +{ 0x014A, {0x00,0x00,0x00,0x00,0x31,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x11,0x80,0x10,0x80,0x38,0x80,0x01,0x80,0x07,0x00,}}, +{ 0x014B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x80,0x1C,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3C,0xC0,0x00,0xC0,0x03,0x80,}}, +{ 0x014C, {0x1F,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x014D, {0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x014E, {0x31,0x80,0x1F,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x014F, {0x00,0x00,0x19,0x80,0x0F,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0150, {0x0C,0xC0,0x19,0x80,0x22,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0151, {0x0C,0xC0,0x19,0x80,0x22,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0152, {0x00,0x00,0x00,0x00,0x37,0xC0,0x6E,0x20,0xC6,0x00,0xC6,0x40,0xC7,0xC0,0xC6,0x40,0xC6,0x00,0x6E,0x20,0x37,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0153, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0xC0,0x6F,0x60,0xC6,0x20,0xC7,0xE0,0xC6,0x00,0x6F,0x20,0x39,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0154, {0x06,0x00,0x0C,0x00,0x10,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x3E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0155, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x3B,0x00,0x1D,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0156, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x7B,0xC0,0x18,0x00,0x70,0x00,}}, +{ 0x0157, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x00,0x1D,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x0C,0x00,0x38,0x00,}}, +{ 0x0158, {0x21,0x00,0x1E,0x00,0x0C,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x3E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0159, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x3B,0x00,0x1D,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x015A, {0x03,0x00,0x06,0x00,0x08,0x00,0x1E,0x80,0x11,0x80,0x30,0x80,0x1E,0x00,0x07,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x015B, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x015C, {0x06,0x00,0x0F,0x00,0x10,0x80,0x1E,0x80,0x11,0x80,0x30,0x80,0x1E,0x00,0x07,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x015D, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x015E, {0x00,0x00,0x00,0x00,0x0E,0x80,0x11,0x80,0x30,0x80,0x1C,0x00,0x0F,0x00,0x03,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x06,0x00,0x1C,0x00,}}, +{ 0x015F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x06,0x00,0x1C,0x00,}}, +{ 0x0160, {0x10,0x80,0x0F,0x00,0x06,0x00,0x1E,0x80,0x11,0x80,0x30,0x80,0x1E,0x00,0x07,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0161, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0162, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x03,0x00,0x0E,0x00,}}, +{ 0x0163, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x07,0x00,0x06,0x00,0x1C,0x00,}}, +{ 0x0164, {0x10,0x80,0x0F,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0165, {0x21,0x00,0x1E,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0166, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x3F,0xC0,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0167, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x80,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0168, {0x0E,0xC0,0x1B,0x80,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0169, {0x00,0x00,0x1D,0x80,0x37,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x016A, {0x00,0x00,0x0F,0x80,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x016B, {0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x016C, {0x18,0xC0,0x0F,0x80,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x016D, {0x00,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x016E, {0x07,0x00,0x0D,0x80,0x07,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x016F, {0x00,0x00,0x1E,0x00,0x33,0x00,0x1E,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0170, {0x0C,0xC0,0x19,0x80,0x22,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0171, {0x19,0x80,0x33,0x00,0x44,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0172, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x04,0x00,0x07,0x00,}}, +{ 0x0173, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x08,0x00,0x0E,0x00,}}, +{ 0x0174, {0x06,0x00,0x0F,0x00,0x10,0x80,0xEE,0x60,0x66,0x40,0x37,0xC0,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0175, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x76,0xE0,0x76,0x40,0x36,0x40,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0176, {0x0C,0x00,0x1E,0x00,0x21,0x00,0x7B,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0177, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x7D,0xC0,0x30,0x80,0x18,0x80,0x19,0x00,0x0D,0x00,0x0E,0x00,0x66,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x0178, {0x33,0x00,0x33,0x00,0x00,0x00,0x7B,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0179, {0x06,0x00,0x0C,0x00,0x10,0x00,0x7F,0x80,0x43,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x017A, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x3F,0xC0,0x21,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x017B, {0x0C,0x00,0x0C,0x00,0x00,0x00,0x7F,0x80,0x43,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x017C, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x3F,0xC0,0x21,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x017D, {0x21,0x00,0x1E,0x00,0x0C,0x00,0x7F,0x80,0x43,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x017E, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x3F,0xC0,0x21,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x017F, {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x80,0x18,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x018F, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x00,0xC0,0x7F,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0192, {0x00,0x00,0x00,0x00,0x03,0x80,0x04,0xC0,0x0C,0x00,0x1F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x2C,0x00,0x6C,0x00,0x38,0x00,}}, +{ 0x01FA, {0x00,0xC0,0x01,0x80,0x03,0x00,0x04,0x80,0x03,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x01FB, {0x03,0x00,0x06,0x00,0x0C,0x00,0x12,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x01FC, {0x00,0xC0,0x01,0x80,0x02,0x00,0x07,0xC0,0x0E,0x20,0x12,0x00,0x13,0xC0,0x22,0x40,0x3E,0x00,0x42,0x20,0xE7,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x01FD, {0x00,0xC0,0x01,0x80,0x02,0x00,0x00,0x00,0x3D,0xC0,0x66,0x60,0x66,0x60,0x1F,0xE0,0x66,0x00,0xC7,0x60,0x79,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x01FE, {0x03,0x00,0x06,0x00,0x09,0x80,0x1F,0x80,0x33,0x80,0x66,0xC0,0x66,0xC0,0x6C,0xC0,0x6C,0xC0,0x79,0x80,0x3F,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x01FF, {0x01,0x80,0x03,0x00,0x04,0x00,0x00,0xC0,0x0F,0xC0,0x19,0x80,0x33,0xC0,0x36,0xC0,0x3C,0xC0,0x19,0x80,0x1F,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x0218, {0x00,0x00,0x00,0x00,0x0E,0x80,0x11,0x80,0x30,0x80,0x1C,0x00,0x0F,0x00,0x03,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x06,0x00,0x0C,0x00,}}, +{ 0x0219, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x06,0x00,0x0C,0x00,}}, +{ 0x021A, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x06,0x00,0x0C,0x00,}}, +{ 0x021B, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x07,0x00,0x06,0x00,0x0C,0x00,}}, +{ 0x0259, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x80,0x00,0xC0,0x3F,0xC0,0x30,0xC0,0x11,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02BB, {0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02BC, {0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02BD, {0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02C6, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02C7, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02C9, {0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02D0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02D8, {0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02D9, {0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02DA, {0x0E,0x00,0x1B,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02DB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x1F,0x00,}}, +{ 0x02DC, {0x00,0x00,0x1D,0x80,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x02DD, {0x0C,0xC0,0x19,0x80,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0300, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0301, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0302, {0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0303, {0x00,0x00,0x1D,0x80,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0304, {0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0305, {0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0306, {0x00,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0307, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0308, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0309, {0x0F,0x00,0x19,0x80,0x19,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x030A, {0x06,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x030B, {0x0C,0xC0,0x19,0x80,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x030C, {0x10,0x80,0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x030D, {0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x030E, {0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x030F, {0x33,0x00,0x19,0x80,0x04,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0310, {0x04,0x00,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0311, {0x00,0x00,0x1F,0x00,0x31,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0374, {0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0375, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,}}, +{ 0x037A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,}}, +{ 0x037E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x0384, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0385, {0x03,0x00,0x36,0xC0,0x38,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0386, {0x0C,0x00,0x18,0x00,0x22,0x00,0x06,0x00,0x07,0x00,0x0B,0x00,0x09,0x80,0x11,0x80,0x1F,0xC0,0x20,0xC0,0x71,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0387, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0388, {0x30,0x00,0x60,0x00,0x9F,0xC0,0x0C,0x40,0x0C,0x00,0x0C,0x80,0x0F,0x80,0x0C,0x80,0x0C,0x00,0x0C,0x20,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0389, {0x30,0x00,0x60,0x00,0xBC,0xE0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3C,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x038A, {0x18,0x00,0x30,0x00,0x47,0xE0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x038C, {0x18,0x00,0x30,0x00,0x47,0x00,0x18,0xC0,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x18,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x038E, {0x18,0x00,0x30,0x00,0x4C,0xC0,0x17,0xA0,0x13,0x20,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x038F, {0x18,0x00,0x30,0x00,0x47,0x00,0x18,0xC0,0x30,0x60,0x30,0x60,0x30,0x60,0x18,0xC0,0x08,0x80,0x05,0x00,0x3D,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0390, {0x03,0x00,0x36,0xC0,0x38,0xC0,0x00,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0391, {0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x07,0x00,0x0B,0x00,0x09,0x80,0x11,0x80,0x1F,0xC0,0x20,0xC0,0x71,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0392, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3F,0x00,0x30,0x80,0x30,0xC0,0x30,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0393, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0394, {0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x13,0x00,0x13,0x00,0x21,0x80,0x21,0x80,0x40,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0395, {0x00,0x00,0x00,0x00,0x7F,0x80,0x30,0x80,0x30,0x00,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0396, {0x00,0x00,0x00,0x00,0x3F,0x80,0x43,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0397, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0398, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x71,0xC0,0x7F,0xC0,0x71,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0399, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x039A, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x80,0x31,0x00,0x33,0x00,0x35,0x80,0x39,0x80,0x30,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x039B, {0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x07,0x00,0x07,0x00,0x09,0x80,0x11,0x80,0x10,0xC0,0x20,0xC0,0x71,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x039C, {0x00,0x00,0x00,0x00,0x70,0xE0,0x39,0xC0,0x39,0xC0,0x3F,0xC0,0x36,0xC0,0x36,0xC0,0x30,0xC0,0x30,0xC0,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x039D, {0x00,0x00,0x00,0x00,0x70,0xE0,0x38,0xC0,0x3C,0xC0,0x3C,0xC0,0x36,0xC0,0x33,0xC0,0x33,0xC0,0x31,0xC0,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x039E, {0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x1F,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x039F, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03A0, {0x00,0x00,0x00,0x00,0x7F,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x03A1, {0x00,0x00,0x00,0x00,0x3F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03A3, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0x40,0x0C,0x00,0x06,0x00,0x03,0x00,0x02,0x00,0x04,0x00,0x08,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x03A4, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x46,0x20,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03A5, {0x00,0x00,0x00,0x00,0x19,0x80,0x2F,0x40,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03A6, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03A7, {0x00,0x00,0x00,0x00,0x71,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0E,0x00,0x13,0x00,0x21,0x80,0x61,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x03A8, {0x00,0x00,0x00,0x00,0x1F,0x80,0x46,0x20,0x66,0x60,0x36,0xC0,0x36,0xC0,0x16,0x80,0x1F,0x80,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03A9, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x11,0x00,0x0A,0x00,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x03AA, {0x19,0x80,0x19,0x80,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03AB, {0x19,0x80,0x19,0x80,0x00,0x00,0x19,0x80,0x2F,0x40,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03AC, {0x01,0x80,0x03,0x00,0x04,0x00,0x00,0x00,0x0E,0xC0,0x19,0xC0,0x10,0xC0,0x30,0x80,0x31,0x80,0x33,0x80,0x1C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x03AD, {0x01,0x80,0x03,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x0D,0x80,0x08,0x00,0x07,0x00,0x0C,0x00,0x18,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03AE, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x12,0x00,0x3D,0x00,0x09,0x80,0x11,0x80,0x11,0x00,0x31,0x00,0x23,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x03AF, {0x01,0x80,0x03,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03B0, {0x03,0x00,0x36,0xC0,0x38,0xC0,0x00,0x00,0x10,0x00,0x11,0x00,0x31,0x80,0x31,0x80,0x21,0x00,0x23,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03B1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0xC0,0x19,0xC0,0x10,0xC0,0x30,0x80,0x31,0x80,0x33,0x80,0x1C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x03B2, {0x00,0x00,0x00,0x00,0x01,0xC0,0x02,0x40,0x04,0x40,0x08,0x40,0x0B,0x80,0x08,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x80,0x30,0x00,0x30,0x00,}}, +{ 0x03B3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x80,0x35,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x03B4, {0x00,0x00,0x00,0x00,0x0E,0x00,0x13,0x80,0x08,0x00,0x0E,0x00,0x13,0x00,0x31,0x00,0x23,0x00,0x26,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03B5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0D,0x80,0x08,0x00,0x07,0x00,0x0C,0x00,0x18,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03B6, {0x00,0x00,0x00,0x00,0x08,0x00,0x0F,0x80,0x07,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x18,0x00,0x0E,0x00,0x07,0x00,0x0D,0x80,0x07,0x00,}}, +{ 0x03B7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x3D,0x00,0x09,0x80,0x11,0x80,0x11,0x00,0x31,0x00,0x23,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x03B8, {0x00,0x00,0x00,0x00,0x03,0x80,0x04,0x80,0x18,0x80,0x10,0x80,0x3F,0x80,0x31,0x80,0x21,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03B9, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x0C,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03BA, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xC0,0x09,0x80,0x1A,0x00,0x1C,0x00,0x12,0x00,0x32,0x00,0x33,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03BB, {0x00,0x00,0x00,0x00,0x0E,0x00,0x03,0x00,0x03,0x00,0x07,0x00,0x05,0x00,0x09,0x00,0x19,0x00,0x11,0x00,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03BC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x11,0x80,0x11,0x80,0x31,0x00,0x21,0x00,0x33,0x00,0x3F,0xC0,0x60,0x00,0x60,0x00,}}, +{ 0x03BD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x80,0x11,0x00,0x11,0x00,0x12,0x00,0x1C,0x00,0x38,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03BE, {0x00,0x00,0x0C,0x00,0x13,0x80,0x0F,0x00,0x18,0x00,0x10,0x00,0x0F,0x00,0x13,0x00,0x20,0x00,0x38,0x00,0x1E,0x00,0x03,0x00,0x1E,0x00,}}, +{ 0x03BF, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0D,0x00,0x18,0x80,0x31,0x80,0x31,0x80,0x13,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03C0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x51,0x00,0x11,0x00,0x11,0x00,0x22,0x00,0x22,0x00,0x63,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03C1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0xC0,0x18,0xC0,0x18,0xC0,0x30,0xC0,0x31,0x80,0x3F,0x00,0x60,0x00,0x60,0x00,}}, +{ 0x03C2, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0C,0x80,0x19,0x80,0x18,0x00,0x18,0x00,0x0E,0x00,0x01,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x03C3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0F,0x00,0x18,0x80,0x30,0x80,0x31,0x80,0x33,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03C4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x80,0x3F,0x80,0x24,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03C5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x11,0x00,0x31,0x80,0x31,0x80,0x21,0x00,0x23,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03C6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x80,0x12,0x80,0x32,0xC0,0x34,0xC0,0x1D,0x80,0x0F,0x00,0x08,0x00,0x08,0x00,}}, +{ 0x03C7, {0x00,0x00,0x00,0x00,0x0C,0x40,0x06,0xC0,0x02,0x80,0x03,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x0A,0x00,0x12,0x00,0x33,0x00,0x21,0x80,}}, +{ 0x03C8, {0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x23,0x00,0x72,0xC0,0x12,0x40,0x12,0x40,0x34,0xC0,0x35,0x80,0x1F,0x00,0x08,0x00,0x08,0x00,}}, +{ 0x03C9, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x22,0x40,0x26,0x40,0x24,0x40,0x24,0x80,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03CA, {0x00,0x00,0x1B,0x00,0x1B,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03CB, {0x00,0x00,0x1B,0x00,0x1B,0x00,0x00,0x00,0x10,0x00,0x11,0x00,0x31,0x80,0x31,0x80,0x21,0x00,0x23,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03CC, {0x01,0x80,0x03,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x0D,0x00,0x18,0x80,0x31,0x80,0x31,0x80,0x13,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03CD, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x11,0x00,0x31,0x80,0x31,0x80,0x21,0x00,0x23,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03CE, {0x00,0x00,0x01,0x80,0x03,0x00,0x04,0x00,0x00,0x00,0x10,0x40,0x22,0x40,0x26,0x40,0x24,0x40,0x24,0x80,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03D1, {0x00,0x00,0x00,0x00,0x03,0x80,0x04,0x80,0x08,0x80,0x10,0x80,0x0F,0xC0,0x01,0x80,0x21,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x03D5, {0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x07,0x00,0x1B,0x80,0x12,0x80,0x32,0xC0,0x34,0xC0,0x1D,0x80,0x0F,0x00,0x08,0x00,0x08,0x00,}}, +{ 0x03D6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x22,0x40,0x26,0x40,0x24,0x40,0x24,0x80,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x03F1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x06,0x40,0x0C,0x40,0x08,0x40,0x18,0xC0,0x1C,0xC0,0x1B,0x80,0x30,0x00,0x1F,0x00,}}, +{ 0x0400, {0x18,0x00,0x0C,0x00,0x02,0x00,0x7F,0x80,0x30,0x40,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0401, {0x33,0x00,0x33,0x00,0x00,0x00,0x7F,0x80,0x30,0x00,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0402, {0x00,0x00,0xFF,0x00,0x99,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3C,0xC0,0x01,0x80,0x07,0x00,}}, +{ 0x0403, {0x03,0x00,0x06,0x00,0x08,0x00,0x3F,0xC0,0x18,0xC0,0x18,0x40,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0404, {0x00,0x00,0x00,0x00,0x0F,0x00,0x31,0xC0,0x20,0x00,0x63,0x00,0x6E,0x80,0x78,0x00,0x20,0x00,0x31,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0405, {0x00,0x00,0x00,0x00,0x0E,0x80,0x11,0x80,0x30,0x80,0x1C,0x00,0x0F,0x00,0x03,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0406, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0407, {0x19,0x80,0x19,0x80,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0408, {0x00,0x00,0x00,0x00,0x07,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0409, {0x00,0x00,0x00,0x00,0xFE,0x00,0x6C,0x00,0x6C,0x00,0x6F,0x00,0x6C,0x80,0x6C,0xC0,0x6C,0xC0,0x6C,0xC0,0xEF,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x040A, {0x00,0x00,0x00,0x00,0xEE,0x00,0x6C,0x00,0x6C,0x00,0x7F,0x00,0x6C,0x80,0x6C,0xC0,0x6C,0xC0,0x6C,0xC0,0xEF,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x040B, {0x00,0x00,0xFF,0x00,0x99,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3D,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x040C, {0x01,0x80,0x03,0x00,0x04,0x00,0x78,0xE0,0x31,0x20,0x32,0x00,0x3E,0x00,0x33,0x00,0x31,0x80,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x040D, {0x0C,0x00,0x06,0x00,0x01,0x00,0x78,0xE0,0x30,0xC0,0x31,0xC0,0x32,0xC0,0x34,0xC0,0x38,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x040E, {0x1B,0x00,0x0E,0x00,0x00,0x00,0x71,0xC0,0x30,0x80,0x31,0x80,0x19,0x00,0x19,0x00,0x0E,0x00,0x0E,0x00,0x24,0x00,0x68,0x00,0x30,0x00,}}, +{ 0x040F, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x7F,0xE0,0x06,0x00,0x06,0x00,}}, +{ 0x0410, {0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x07,0x00,0x09,0x80,0x09,0x80,0x10,0xC0,0x1F,0xC0,0x30,0xC0,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0411, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0x40,0x18,0x00,0x1F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0412, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3F,0x00,0x30,0x80,0x30,0xC0,0x30,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0413, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0xC0,0x18,0x40,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0414, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x11,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x21,0x80,0x3F,0xC0,0x60,0xC0,0x40,0x40,}}, +{ 0x0415, {0x00,0x00,0x00,0x00,0x7F,0x80,0x30,0x80,0x30,0x00,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0416, {0x00,0x00,0x00,0x00,0x6F,0x60,0x76,0xE0,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x16,0x80,0x36,0xC0,0x26,0x40,0x6F,0x60,0x00,0x00,0x00,0x00,}}, +{ 0x0417, {0x00,0x00,0x00,0x00,0x0F,0x00,0x38,0xC0,0x00,0xC0,0x00,0xC0,0x07,0x80,0x00,0xC0,0x00,0xC0,0x38,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0418, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0xC0,0x30,0xC0,0x31,0xC0,0x32,0xC0,0x34,0xC0,0x38,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0419, {0x0D,0x80,0x07,0x00,0x00,0x00,0x78,0xE0,0x30,0xC0,0x31,0xC0,0x32,0xC0,0x34,0xC0,0x38,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x041A, {0x00,0x00,0x00,0x00,0x78,0xE0,0x31,0x20,0x31,0x00,0x32,0x00,0x3E,0x00,0x33,0x00,0x31,0x80,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x041B, {0x00,0x00,0x00,0x00,0x1F,0xC0,0x09,0x80,0x09,0x80,0x09,0x80,0x09,0x80,0x09,0x80,0x09,0x80,0x71,0x80,0x73,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x041C, {0x00,0x00,0x00,0x00,0x70,0xE0,0x30,0xC0,0x39,0xC0,0x3F,0xC0,0x36,0xC0,0x36,0xC0,0x30,0xC0,0x30,0xC0,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x041D, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x041E, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x041F, {0x00,0x00,0x00,0x00,0x7F,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x78,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0420, {0x00,0x00,0x00,0x00,0x3F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0421, {0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x40,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0422, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x46,0x20,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0423, {0x00,0x00,0x00,0x00,0x71,0xC0,0x60,0x80,0x30,0x80,0x31,0x80,0x19,0x00,0x19,0x00,0x0E,0x00,0x0E,0x00,0x24,0x00,0x68,0x00,0x30,0x00,}}, +{ 0x0424, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0425, {0x00,0x00,0x00,0x00,0x71,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0E,0x00,0x13,0x00,0x21,0x80,0x61,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0426, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x7F,0xE0,0x00,0x60,0x00,0x20,}}, +{ 0x0427, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0428, {0x00,0x00,0x00,0x00,0x76,0xE0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0429, {0x00,0x00,0x00,0x00,0x76,0xE0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x7F,0xE0,0x00,0x60,0x00,0x20,}}, +{ 0x042A, {0x00,0x00,0x00,0x00,0x3E,0x00,0x4C,0x00,0x0C,0x00,0x0F,0x80,0x0C,0xC0,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x042B, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x3C,0xC0,0x33,0xC0,0x31,0xC0,0x31,0xC0,0x33,0xC0,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x042C, {0x00,0x00,0x00,0x00,0x3E,0x00,0x18,0x00,0x18,0x00,0x1F,0x00,0x18,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x042D, {0x00,0x00,0x00,0x00,0x1E,0x00,0x71,0x80,0x00,0x80,0x18,0xC0,0x2E,0xC0,0x03,0xC0,0x00,0x80,0x71,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x042E, {0x00,0x00,0x00,0x00,0x79,0x80,0x32,0x40,0x36,0x60,0x36,0x60,0x3E,0x60,0x36,0x60,0x36,0x60,0x32,0x40,0x79,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x042F, {0x00,0x00,0x00,0x00,0x0F,0xC0,0x31,0x80,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x80,0x0D,0x80,0x19,0x80,0x71,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0430, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3D,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0431, {0x00,0x00,0x00,0x80,0x0F,0x00,0x10,0x00,0x36,0x00,0x3B,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0432, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x18,0xC0,0x18,0xC0,0x1F,0x80,0x18,0xC0,0x18,0xC0,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0433, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0xC0,0x18,0x40,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0434, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x11,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x7F,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x0435, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0436, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4F,0x20,0x66,0x60,0x16,0x80,0x1F,0x80,0x16,0x80,0x36,0xC0,0x6F,0x60,0x00,0x00,0x00,0x00,}}, +{ 0x0437, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x07,0x80,0x00,0xC0,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0438, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x31,0xC0,0x32,0xC0,0x34,0xC0,0x38,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0439, {0x00,0x00,0x0D,0x80,0x07,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x31,0xC0,0x32,0xC0,0x34,0xC0,0x38,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x043A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xC0,0x31,0x40,0x32,0x00,0x3E,0x00,0x33,0x00,0x31,0x80,0x78,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x043B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x09,0x80,0x09,0x80,0x09,0x80,0x09,0x80,0x71,0x80,0x73,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x043C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xE0,0x39,0xC0,0x39,0xC0,0x3F,0xC0,0x36,0xC0,0x30,0xC0,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x043D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x043E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x043F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0440, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1D,0x80,0x1B,0x00,0x18,0x00,0x3C,0x00,}}, +{ 0x0441, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x18,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0442, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x36,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0443, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x19,0x80,0x19,0x80,0x0F,0x00,0x0E,0x00,0x24,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x0444, {0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x16,0x80,0x3F,0xC0,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x3F,0xC0,0x06,0x00,0x0F,0x00,}}, +{ 0x0445, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0xC0,0x18,0x80,0x0D,0x00,0x06,0x00,0x0F,0x00,0x11,0x80,0x3B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0446, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x3F,0x80,0x01,0x80,0x00,0x80,}}, +{ 0x0447, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x0F,0xC0,0x00,0xC0,0x01,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0448, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xE0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x0449, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xE0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x7F,0xE0,0x00,0x60,0x00,0x20,}}, +{ 0x044A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x2C,0x00,0x4C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0xC0,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x044B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x3E,0xC0,0x33,0xC0,0x33,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x044C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x18,0x00,0x18,0x00,0x1F,0x80,0x18,0xC0,0x18,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x044D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x06,0xC0,0x0B,0xC0,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x044E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x80,0x32,0x40,0x36,0x60,0x3E,0x60,0x36,0x60,0x32,0x40,0x79,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x044F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x0F,0x80,0x19,0x80,0x33,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x0450, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0451, {0x00,0x00,0x0D,0x80,0x0D,0x80,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0452, {0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x3C,0xC0,0x01,0x80,0x07,0x00,}}, +{ 0x0453, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x3F,0xC0,0x18,0xC0,0x18,0x40,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0454, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x36,0x00,0x3D,0x00,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0455, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0456, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0457, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x0458, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x13,0x00,0x32,0x00,0x1C,0x00,}}, +{ 0x0459, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x6C,0x00,0x6C,0x00,0x6F,0x80,0x6C,0xC0,0x6C,0xC0,0xEF,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x045A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x00,0x6C,0x00,0x6C,0x00,0x7F,0x80,0x6C,0xC0,0x6C,0xC0,0xEF,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x045B, {0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x3D,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x045C, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x78,0xC0,0x31,0x40,0x32,0x00,0x3E,0x00,0x33,0x00,0x31,0x80,0x78,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x045D, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x31,0xC0,0x32,0xC0,0x34,0xC0,0x38,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x045E, {0x00,0x00,0x1B,0x00,0x0E,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x19,0x80,0x19,0x80,0x0F,0x00,0x0E,0x00,0x24,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x045F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7B,0xC0,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7F,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x0490, {0x00,0x40,0x00,0xC0,0x3F,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x0491, {0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x3F,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05D0, {0x00,0x00,0x41,0x80,0x61,0xC0,0x30,0xC0,0x19,0x00,0x3E,0x00,0x46,0x00,0x43,0x00,0x21,0x80,0x30,0xC0,0x70,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x05D1, {0x00,0x00,0x40,0x00,0x7F,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x3F,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05D2, {0x00,0x00,0x10,0x00,0x1C,0x00,0x0E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x1F,0x00,0x39,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05D3, {0x00,0x00,0x40,0x00,0x7F,0xC0,0x3F,0xC0,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05D4, {0x00,0x00,0x40,0x00,0x7F,0xC0,0x3F,0xC0,0x00,0x80,0x00,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05D5, {0x00,0x00,0x10,0x00,0x1C,0x00,0x0E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05D6, {0x00,0x00,0x20,0x00,0x3C,0x00,0x1E,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05D7, {0x00,0x00,0x40,0x00,0x7F,0xC0,0x3F,0xC0,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05D8, {0x00,0x00,0x40,0x00,0x71,0xC0,0x3B,0xC0,0x22,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0xC0,0x3F,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05D9, {0x00,0x00,0x20,0x00,0x38,0x00,0x1C,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05DA, {0x00,0x00,0x20,0x00,0x3F,0xC0,0x1F,0xC0,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,}}, +{ 0x05DB, {0x00,0x00,0x40,0x00,0x7F,0x80,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x3F,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05DC, {0x40,0x00,0x20,0x00,0x3F,0xC0,0x1F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05DD, {0x00,0x00,0x40,0x00,0x7F,0x80,0x3F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x05DE, {0x00,0x00,0x40,0x00,0x6F,0x80,0x3F,0xC0,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x4F,0xC0,0x5F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05DF, {0x00,0x00,0x08,0x00,0x0F,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,}}, +{ 0x05E0, {0x00,0x00,0x10,0x00,0x1C,0x00,0x0E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05E1, {0x00,0x00,0x40,0x00,0x7F,0x80,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05E2, {0x00,0x00,0x42,0x00,0x73,0x80,0x39,0xC0,0x20,0x40,0x10,0x40,0x08,0x40,0x04,0x40,0x02,0x40,0x3F,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05E3, {0x00,0x00,0x20,0x00,0x3F,0xC0,0x1F,0xC0,0x20,0x80,0x30,0x80,0x30,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,}}, +{ 0x05E4, {0x00,0x00,0x40,0x00,0x7F,0x80,0x3F,0xC0,0x20,0x40,0x30,0x40,0x30,0x40,0x00,0x40,0x00,0x40,0x7F,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05E5, {0x41,0x00,0x71,0xC0,0x30,0xC0,0x11,0x00,0x12,0x00,0x14,0x00,0x18,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x05E6, {0x00,0x00,0x41,0x00,0x71,0xC0,0x38,0xC0,0x09,0x00,0x0A,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x7F,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x05E7, {0x40,0x00,0x7F,0x80,0x3F,0xC0,0x00,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x11,0x00,0x16,0x00,0x14,0x00,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x05E8, {0x00,0x00,0x40,0x00,0x7F,0x80,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x05E9, {0x00,0x00,0x49,0x00,0x6D,0xC0,0x6D,0xC0,0x44,0x40,0x44,0x40,0x4C,0x40,0x58,0xC0,0x70,0x80,0x7F,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x05EA, {0x00,0x00,0x40,0x00,0x7F,0x80,0x3F,0xC0,0x10,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x10,0x40,0x30,0x40,0x70,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x1200, {0x00,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x33,0x80,0x33,0x00,0x3F,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1201, {0x00,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC7,0xE0,0xC6,0x60,0xCE,0x00,0xCC,0x00,0xFC,0x00,0x70,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1202, {0x00,0x00,0x18,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x1F,0x80,0x0F,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0xC0,0x0F,0xC0,0x00,0x00,}}, +{ 0x1203, {0x00,0x00,0x18,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x1F,0x80,0x0F,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x1204, {0x00,0x00,0x18,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x1F,0x80,0x0F,0x00,0x03,0x00,0x06,0x00,0x07,0x80,0x06,0x40,0x03,0x80,0x00,0x00,}}, +{ 0x1205, {0x00,0x00,0x30,0xC0,0x60,0xC0,0x60,0xC0,0x18,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1206, {0x00,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1208, {0x00,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1209, {0x00,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x63,0x00,0x63,0xE0,0x63,0x60,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x120A, {0x00,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x60,0x63,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x120B, {0x00,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x120C, {0x00,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x120D, {0x00,0x00,0x01,0x80,0x03,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x3C,0xC0,0x32,0xC0,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x120E, {0x00,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x63,0x00,0x63,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x120F, {0x00,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x1210, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1211, {0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0xDB,0x00,0xDB,0xE0,0xDB,0x60,0xDB,0x00,0xDB,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1212, {0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x60,0xDB,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1213, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1214, {0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0xDB,0x00,0xDB,0x00,0xDB,0xC0,0xDB,0x20,0xDB,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1215, {0x00,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1216, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1217, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x04,0x20,}}, +{ 0x1218, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x31,0x80,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1219, {0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x94,0x80,0x94,0xF0,0x94,0xB0,0x94,0x80,0x94,0x80,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x121A, {0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x31,0xC0,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x60,0x03,0xE0,0x00,0x00,}}, +{ 0x121B, {0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x31,0xC0,0x00,0x40,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x121C, {0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x31,0xC0,0x00,0x80,0x01,0x00,0x01,0xC0,0x01,0x20,0x01,0xC0,0x00,0x00,}}, +{ 0x121D, {0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x39,0x80,0x08,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x121E, {0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x39,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x121F, {0x00,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x31,0xC0,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x07,0xC0,0x04,0x40,}}, +{ 0x1220, {0x00,0x00,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x37,0x80,0x36,0x00,0x36,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1221, {0x00,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0xE0,0xDB,0x60,0xDB,0x00,0xDE,0x00,0xD8,0x00,0xD8,0x00,0x70,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1222, {0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x03,0x00,0x06,0x00,0x06,0x60,0x07,0xE0,0x00,0x00,}}, +{ 0x1223, {0x00,0x00,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x1F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,}}, +{ 0x1224, {0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x3F,0x80,0x01,0x80,0x03,0xC0,0x03,0x20,0x01,0xC0,0x00,0x00,}}, +{ 0x1225, {0x00,0x00,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x3F,0x80,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x1226, {0x00,0x00,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x1227, {0x00,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x3F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x04,0x20,}}, +{ 0x1228, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x38,0xC0,0x1F,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1229, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x70,0x00,0x3F,0xC0,0x1F,0xC0,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x122A, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x31,0x80,0x30,0xC0,0x38,0xC0,0x1F,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x122B, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x60,0xE0,0x71,0xE0,0x3F,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x122C, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0x71,0xC0,0x3F,0x20,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x122D, {0x00,0x00,0x0F,0x00,0x1F,0x80,0x31,0x80,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0xC0,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x122E, {0x00,0x00,0x1F,0x80,0x3E,0x40,0x61,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x61,0x80,0x7F,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x122F, {0x00,0x00,0x21,0x00,0x3F,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0x60,0xE0,0x71,0xE0,0x3F,0x00,0x1E,0x00,0x00,0x00,}}, +{ 0x1230, {0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1231, {0x00,0x00,0x10,0x00,0x10,0x00,0x38,0x00,0x7C,0x00,0xC6,0x00,0xC7,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1232, {0x00,0x00,0x10,0x00,0x10,0x00,0x38,0x00,0x7C,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x60,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1233, {0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1234, {0x00,0x00,0x08,0x00,0x08,0x00,0x1C,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1235, {0x00,0x00,0x18,0x00,0x0C,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1236, {0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1237, {0x00,0x00,0x08,0x00,0x08,0x00,0x1C,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x1238, {0x00,0x00,0x1F,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1239, {0x00,0x00,0x7C,0x00,0x10,0x00,0x38,0x00,0x7C,0x00,0xC6,0x00,0xC7,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x123A, {0x00,0x00,0x7C,0x00,0x10,0x00,0x38,0x00,0x7C,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x60,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x123B, {0x00,0x00,0x1F,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x123C, {0x00,0x00,0x3E,0x00,0x08,0x00,0x1C,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x123D, {0x00,0x00,0x3F,0x00,0x0C,0x00,0x07,0x00,0x0F,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x123E, {0x00,0x00,0x1F,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x123F, {0x00,0x00,0x3E,0x00,0x08,0x00,0x1C,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x1240, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1241, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x0C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1242, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x0C,0x00,0x0C,0xC0,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1243, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1244, {0x00,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1245, {0x00,0x00,0x30,0x00,0x1E,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1246, {0x00,0x00,0x0F,0x00,0x19,0x80,0x0F,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1248, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x0F,0xC0,0x0D,0x20,0x0C,0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x124A, {0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x40,0xDB,0x40,0xDB,0xC0,0x7E,0x60,0x18,0x20,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x124B, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,}}, +{ 0x124C, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x07,0x80,0x06,0x40,0x1F,0x80,0x10,0x00,}}, +{ 0x124D, {0x00,0x00,0x18,0x00,0x18,0x40,0x18,0x40,0x7E,0xE0,0xDB,0x60,0xDB,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1250, {0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1251, {0x00,0x00,0x3F,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x0C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1252, {0x00,0x00,0x3F,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x0C,0x00,0x0C,0xC0,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1253, {0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1254, {0x00,0x00,0x1F,0x80,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1255, {0x00,0x00,0x7E,0x00,0x18,0x00,0x0E,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1256, {0x00,0x00,0x1F,0x80,0x09,0x00,0x0F,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1258, {0x00,0x00,0x3F,0x00,0x0C,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x3F,0x00,0x0F,0xC0,0x0D,0x20,0x0C,0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x125A, {0x00,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x7E,0x40,0xDB,0x40,0xDB,0xC0,0x7E,0x60,0x18,0x20,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x125B, {0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,}}, +{ 0x125C, {0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x1F,0x80,0x06,0x00,0x07,0x80,0x06,0x40,0x1F,0x80,0x10,0x00,}}, +{ 0x125D, {0x00,0x00,0x7E,0x00,0x18,0x40,0x18,0x40,0x7E,0xE0,0xDB,0x60,0xDB,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1260, {0x00,0x00,0x0F,0x00,0x11,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1261, {0x00,0x00,0x3C,0x00,0x46,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC7,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1262, {0x00,0x00,0x3C,0x00,0x46,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x60,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1263, {0x00,0x00,0x0F,0x00,0x11,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1264, {0x00,0x00,0x1E,0x00,0x23,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1265, {0x00,0x00,0x03,0xC0,0x04,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0xFC,0x60,0xCC,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x00,0x00,0x00,0x00,}}, +{ 0x1266, {0x00,0x00,0x0F,0x00,0x11,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1267, {0x00,0x00,0x1E,0x00,0x23,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x1268, {0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0x00,0x11,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1269, {0x00,0x00,0x7E,0x00,0x00,0x00,0x3C,0x00,0x46,0x00,0xC6,0x00,0xC7,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x126A, {0x00,0x00,0x7E,0x00,0x00,0x00,0x3C,0x00,0x46,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x60,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x126B, {0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0x00,0x11,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x126C, {0x00,0x00,0x3F,0x00,0x00,0x00,0x1E,0x00,0x23,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x126D, {0x00,0x00,0x07,0xE0,0x00,0x00,0x03,0xC0,0x04,0x60,0x0C,0x60,0xFC,0x60,0xCC,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x00,0x00,0x00,0x00,}}, +{ 0x126E, {0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0x00,0x11,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x126F, {0x00,0x00,0x3F,0x00,0x00,0x00,0x1E,0x00,0x23,0x00,0x63,0x00,0x63,0x00,0x63,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x1270, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1271, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x7F,0x80,0x4C,0x80,0x0C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1272, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x7F,0x80,0x4C,0x80,0x0C,0x00,0x0C,0x00,0x0C,0xC0,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1273, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1274, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1275, {0x00,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1276, {0x00,0x00,0x0F,0x00,0x19,0x80,0x0F,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1277, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,}}, +{ 0x1278, {0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1279, {0x00,0x00,0x7F,0x80,0x4C,0x80,0x0C,0x00,0x7F,0x80,0x4C,0x80,0x0C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x127A, {0x00,0x00,0x7F,0x80,0x4C,0x80,0x0C,0x00,0x0C,0x00,0x7F,0x80,0x4C,0x80,0x0C,0x00,0x0C,0x00,0x0C,0xC0,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x127B, {0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x127C, {0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x127D, {0x00,0x00,0x7F,0xC0,0x4E,0x40,0x07,0x00,0x03,0x00,0x1F,0xE0,0x13,0x20,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x127E, {0x00,0x00,0x3F,0xC0,0x29,0x40,0x0F,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x127F, {0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,}}, +{ 0x1280, {0x00,0x00,0x06,0x00,0x06,0x00,0x3E,0x00,0x33,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1281, {0x00,0x00,0x18,0x00,0x18,0x00,0xF8,0x00,0xCE,0x00,0x06,0x00,0x07,0xE0,0x06,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1282, {0x00,0x00,0x18,0x00,0x18,0x00,0xF8,0x00,0xCE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x60,0x07,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1283, {0x00,0x00,0x06,0x00,0x06,0x00,0x3E,0x00,0x33,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1284, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x7C,0x00,0x67,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x03,0x20,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1285, {0x00,0x00,0x03,0x00,0x03,0x00,0x0F,0x00,0x19,0xC0,0x30,0xC0,0x30,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1286, {0x00,0x00,0x03,0xC0,0x07,0x20,0x0D,0xC0,0x7C,0x00,0x67,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1288, {0x00,0x00,0x18,0x00,0x18,0x00,0xF8,0x00,0xCE,0x00,0x06,0x00,0x07,0xC0,0x07,0x20,0x06,0xC0,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x128A, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x7C,0x00,0x67,0x40,0x03,0x40,0x03,0xC0,0x03,0x60,0x03,0x20,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x128B, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x7C,0x00,0x67,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x128C, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x7C,0x00,0x67,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x03,0x20,0x0F,0xC0,0x08,0x00,}}, +{ 0x128D, {0x00,0x00,0x0C,0x00,0x0C,0x40,0x7C,0x40,0x67,0xE0,0x03,0x60,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1290, {0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1291, {0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7C,0x00,0x0C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1292, {0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0xC0,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1293, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x30,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1294, {0x00,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1295, {0x00,0x00,0x1E,0x00,0x36,0x00,0x36,0x00,0x07,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1296, {0x00,0x00,0x1F,0x00,0x34,0x80,0x33,0x00,0x30,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1297, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x30,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,}}, +{ 0x1298, {0x00,0x00,0x3F,0x00,0x0C,0x00,0x0C,0x00,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1299, {0x00,0x00,0xFC,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x06,0x00,0x07,0xE0,0x06,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x129A, {0x00,0x00,0xFC,0x00,0x30,0x00,0x30,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x60,0x07,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x129B, {0x00,0x00,0x1F,0x00,0x04,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x30,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x129C, {0x00,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x1F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x03,0x20,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x129D, {0x00,0x00,0x1F,0x80,0x06,0x00,0x1E,0x00,0x36,0x00,0x37,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x129E, {0x00,0x00,0x1F,0x00,0x04,0x00,0x1F,0x00,0x34,0x80,0x33,0x00,0x30,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x129F, {0x00,0x00,0x1F,0x00,0x04,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x30,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,}}, +{ 0x12A0, {0x00,0x00,0x30,0x00,0x30,0x00,0x1C,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12A1, {0x00,0x00,0xC0,0x00,0xC0,0x00,0x70,0x00,0x30,0x00,0x78,0x00,0xCC,0x00,0xC7,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12A2, {0x00,0x00,0xC0,0x00,0xC0,0x00,0x70,0x00,0x30,0x00,0x78,0x00,0xCC,0x00,0xC6,0x00,0xC6,0x00,0xC6,0x60,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12A3, {0x00,0x00,0x30,0x00,0x30,0x00,0x1C,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12A4, {0x00,0x00,0x60,0x00,0x60,0x00,0x38,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x63,0x00,0x63,0xC0,0x63,0x20,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12A5, {0x00,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12A6, {0x00,0x00,0x30,0x00,0x30,0x00,0x1C,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12A7, {0x00,0x00,0x42,0x00,0x7E,0x00,0x18,0x00,0x0E,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12A8, {0x00,0x00,0x20,0x00,0x20,0x00,0x2F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12A9, {0x00,0x00,0x80,0x00,0x80,0x00,0xBC,0x00,0x66,0x00,0x66,0x00,0x67,0xE0,0x66,0x60,0x66,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12AA, {0x00,0x00,0x80,0x00,0x80,0x00,0xBC,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x60,0x67,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12AB, {0x00,0x00,0x20,0x00,0x20,0x00,0x2F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12AC, {0x00,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0xC0,0x33,0x20,0x33,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12AD, {0x00,0x00,0x20,0x00,0x20,0x00,0x2F,0x00,0x19,0x80,0x19,0x80,0x1D,0x80,0x0D,0x80,0x0D,0x80,0x0D,0x80,0x0D,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12AE, {0x00,0x00,0x20,0x00,0x20,0x00,0x2F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12B0, {0x00,0x00,0x80,0x00,0x80,0x00,0xBC,0x00,0x66,0x00,0x66,0x00,0x67,0xC0,0x67,0x20,0x66,0xC0,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12B2, {0x00,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x33,0x00,0x33,0x40,0x33,0x40,0x33,0xE0,0x33,0x60,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12B3, {0x00,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x12B4, {0x00,0x00,0x40,0x00,0x40,0x00,0x5E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x03,0xC0,0x03,0x20,0x0F,0xC0,0x08,0x00,0x00,0x00,}}, +{ 0x12B5, {0x00,0x00,0x40,0x40,0x40,0x40,0x5E,0xE0,0x33,0x60,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12B8, {0x00,0x00,0x44,0x00,0x7C,0x00,0x10,0x00,0x17,0x80,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12B9, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2E,0x00,0x33,0x00,0x33,0x00,0x33,0xE0,0x33,0x60,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12BA, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x60,0x33,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12BB, {0x00,0x00,0x44,0x00,0x7C,0x00,0x10,0x00,0x17,0x80,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12BC, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0xC0,0x33,0x20,0x33,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12BD, {0x00,0x00,0x44,0x00,0x7C,0x00,0x10,0x00,0x17,0x80,0x0C,0xC0,0x0C,0xC0,0x06,0xC0,0x06,0xC0,0x06,0xC0,0x06,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12BE, {0x00,0x00,0x44,0x00,0x7C,0x00,0x10,0x00,0x17,0x80,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12C0, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2E,0x00,0x33,0x00,0x33,0xC0,0x33,0x20,0x33,0xC0,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12C2, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2E,0x00,0x33,0x40,0x33,0x40,0x33,0xE0,0x33,0x60,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12C3, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x04,0x20,}}, +{ 0x12C4, {0x00,0x00,0x88,0x00,0xF8,0x00,0x20,0x00,0x2E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x03,0xC0,0x03,0x20,0x0F,0xC0,0x08,0x00,0x00,0x00,}}, +{ 0x12C5, {0x00,0x00,0x88,0x00,0xF8,0x40,0x20,0x40,0x2E,0xE0,0x33,0x60,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12C8, {0x00,0x00,0x00,0x00,0x1F,0x00,0x35,0x80,0x64,0xC0,0x64,0xC0,0x64,0xC0,0x64,0xC0,0x35,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12C9, {0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x6B,0x00,0xC9,0x80,0xC9,0x80,0xC9,0x80,0xC9,0x80,0x6B,0x20,0x3F,0xE0,0x00,0x60,0x00,0x00,}}, +{ 0x12CA, {0x00,0x00,0x1F,0x00,0x35,0x80,0x64,0xC0,0x64,0xC0,0x35,0x80,0x1F,0x00,0x04,0x00,0x0C,0x00,0x19,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12CB, {0x00,0x00,0x1F,0x00,0x35,0x80,0x64,0xC0,0x64,0xC0,0x35,0x80,0x1F,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12CC, {0x00,0x00,0x1F,0x00,0x35,0x80,0x64,0xC0,0x64,0xC0,0x35,0x80,0x1F,0x00,0x04,0x00,0x07,0x00,0x04,0x80,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12CD, {0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x6B,0x00,0xC9,0x80,0xC9,0xF0,0xC9,0xB0,0xC9,0x80,0x6B,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12CE, {0x00,0x00,0x1F,0x00,0x35,0x80,0x64,0xC0,0x64,0xC0,0x35,0x80,0x1F,0x00,0x04,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12D0, {0x00,0x00,0x03,0x00,0x0D,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x37,0x80,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12D1, {0x00,0x00,0x0C,0x00,0x36,0x00,0xC6,0x00,0xC6,0x00,0xC7,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0xDE,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12D2, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x40,0x07,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12D3, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12D4, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x03,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12D5, {0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x37,0x80,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12D6, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x1F,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12D8, {0x00,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12D9, {0x00,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x66,0x00,0x67,0xE0,0x66,0x60,0x66,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12DA, {0x00,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x60,0x67,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12DB, {0x00,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12DC, {0x00,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x67,0x80,0x66,0x40,0x67,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12DD, {0x00,0x00,0x3E,0x00,0x08,0xC0,0x0C,0xC0,0x0C,0xC0,0x0F,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x0C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12DE, {0x00,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12DF, {0x00,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x3F,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x12E0, {0x00,0x00,0x39,0xC0,0x19,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12E1, {0x00,0x00,0xE7,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x66,0x00,0x67,0xE0,0x66,0x60,0x66,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12E2, {0x00,0x00,0xE7,0x00,0x66,0x00,0x66,0x00,0x7E,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x60,0x67,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12E3, {0x00,0x00,0x39,0xC0,0x19,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12E4, {0x00,0x00,0x73,0x80,0x33,0x00,0x33,0x00,0x3F,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x33,0xC0,0x33,0x20,0x33,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12E5, {0x00,0x00,0x7C,0x00,0x11,0xC0,0x39,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12E6, {0x00,0x00,0x39,0xC0,0x19,0x80,0x19,0x80,0x1F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12E7, {0x00,0x00,0x73,0x80,0x33,0x00,0x33,0x00,0x3F,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x12E8, {0x00,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x19,0x80,0x0F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12E9, {0x00,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0F,0xC0,0x0C,0xC0,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12EA, {0x00,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x63,0x00,0x33,0x00,0x1E,0x00,0x0C,0x80,0x0F,0x80,0x0C,0xC0,0x0C,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x12EB, {0x00,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x19,0x80,0x0F,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12EC, {0x00,0x00,0x1C,0x00,0x36,0x00,0x63,0x00,0x33,0x00,0x1E,0x00,0x0C,0x00,0x0F,0x80,0x0E,0x40,0x0D,0x80,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12ED, {0x00,0x00,0x0E,0x00,0x1B,0x00,0x31,0x80,0x19,0x80,0x0F,0x00,0x06,0x20,0x06,0x60,0x3F,0xC0,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12EE, {0x00,0x00,0x38,0x00,0x6C,0x00,0xC6,0x00,0xC7,0xE0,0x66,0x60,0x3C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12EF, {0x00,0x00,0x3F,0x80,0x0E,0x00,0x1B,0x00,0x31,0x80,0x31,0x80,0x19,0x80,0x0F,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12F0, {0x00,0x00,0x0F,0x80,0x18,0xC0,0x18,0xC0,0x19,0x80,0x0E,0x00,0x0C,0x00,0x06,0x00,0x1F,0x80,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12F1, {0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0xE0,0xC3,0x60,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12F2, {0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0x00,0xC3,0x60,0xC3,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12F3, {0x00,0x00,0x1F,0x00,0x31,0x80,0x31,0x80,0x33,0x00,0x1C,0x00,0x18,0x00,0x0C,0x00,0x3F,0x00,0x21,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12F4, {0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0xC0,0xC3,0x20,0xC3,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12F5, {0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0xE0,0x66,0x60,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0x00,0xC3,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12F6, {0x00,0x00,0x0F,0x80,0x18,0xC0,0x18,0xC0,0x19,0x80,0x0E,0x00,0x0C,0x00,0x06,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12F7, {0x00,0x00,0x3E,0x00,0x63,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0x00,0x43,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x12F8, {0x00,0x00,0x0F,0x80,0x18,0xC0,0x1F,0xC0,0x19,0x80,0x0E,0x00,0x0C,0x00,0x06,0x00,0x1F,0x80,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12F9, {0x00,0x00,0x3E,0x00,0x63,0x00,0x7F,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0xE0,0xC3,0x60,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12FA, {0x00,0x00,0x3E,0x00,0x63,0x00,0x7F,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0x00,0xC3,0x60,0xC3,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x12FB, {0x00,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x33,0x00,0x1C,0x00,0x18,0x00,0x0C,0x00,0x3F,0x00,0x21,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x12FC, {0x00,0x00,0x3E,0x00,0x63,0x00,0x7F,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0xC0,0xC3,0x20,0xC3,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x12FD, {0x00,0x00,0x3E,0x00,0x63,0x00,0x7F,0xE0,0x66,0x60,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0x00,0xC3,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12FE, {0x00,0x00,0x0F,0x80,0x18,0xC0,0x1F,0xC0,0x19,0x80,0x0E,0x00,0x0C,0x00,0x06,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x12FF, {0x00,0x00,0x3E,0x00,0x63,0x00,0x7F,0x00,0x66,0x00,0x38,0x00,0x30,0x00,0x18,0x00,0x7E,0x00,0x43,0x00,0x03,0x00,0x0F,0xC0,0x08,0x40,}}, +{ 0x1300, {0x00,0x00,0x1F,0xC0,0x02,0x00,0x0F,0x80,0x18,0xC0,0x19,0x80,0x0E,0x00,0x06,0x00,0x1F,0x80,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1301, {0x00,0x00,0x7F,0x00,0x08,0x00,0x3E,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x18,0x00,0x7E,0xE0,0xC3,0x60,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1302, {0x00,0x00,0x7F,0x00,0x08,0x00,0x3E,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x18,0x00,0x7E,0x00,0xC3,0x60,0xC3,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1303, {0x00,0x00,0x3F,0x80,0x04,0x00,0x1F,0x00,0x31,0x80,0x33,0x00,0x1C,0x00,0x0C,0x00,0x3F,0x00,0x21,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1304, {0x00,0x00,0x7F,0x00,0x08,0x00,0x3E,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x18,0x00,0x7E,0xC0,0xC3,0x20,0xC3,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1305, {0x00,0x00,0x7F,0x00,0x08,0x00,0x3E,0x00,0x63,0xE0,0x66,0x60,0x38,0x00,0x18,0x00,0x7E,0x00,0xC3,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1306, {0x00,0x00,0x1F,0xC0,0x02,0x00,0x0F,0x80,0x18,0xC0,0x19,0x80,0x0E,0x00,0x06,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1307, {0x00,0x00,0x7F,0x00,0x08,0x00,0x3E,0x00,0x63,0x00,0x66,0x00,0x38,0x00,0x18,0x00,0x7E,0x00,0x43,0x00,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x1308, {0x00,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1309, {0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xE0,0x06,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x130A, {0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x60,0x07,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x130B, {0x00,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x130C, {0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x130D, {0x00,0x00,0x1F,0x80,0x32,0xC0,0x1C,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x130E, {0x00,0x00,0x06,0x00,0x06,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1310, {0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xC0,0x07,0x20,0x06,0xC0,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1312, {0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x80,0x06,0x80,0x07,0xC0,0x06,0xC0,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1313, {0x00,0x00,0x1E,0x00,0x33,0x00,0x03,0x00,0x0F,0x80,0x0C,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1314, {0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x06,0x40,0x1F,0x80,0x10,0x00,0x00,0x00,}}, +{ 0x1315, {0x00,0x00,0x00,0x80,0x7C,0x80,0x07,0xC0,0x06,0xC0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1318, {0x00,0x00,0x1F,0x80,0x00,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1319, {0x00,0x00,0x7E,0x00,0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x07,0xE0,0x06,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x131A, {0x00,0x00,0x7E,0x00,0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x60,0x07,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x131B, {0x00,0x00,0x1F,0x80,0x00,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x131C, {0x00,0x00,0x7E,0x00,0x00,0x00,0x7C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x131D, {0x00,0x00,0x1F,0xC0,0x00,0x00,0x1F,0x80,0x32,0xC0,0x1C,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x131E, {0x00,0x00,0x1F,0x80,0x06,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x131F, {0x00,0x00,0x1F,0x80,0x00,0x00,0x1E,0x00,0x33,0x00,0x03,0x00,0x0F,0x80,0x0C,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1320, {0x00,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1321, {0x00,0x00,0x7E,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0xE0,0xDB,0x60,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1322, {0x00,0x00,0x7E,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x60,0xDB,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1323, {0x00,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1324, {0x00,0x00,0x7E,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0x00,0xDB,0xC0,0xDB,0x20,0xDB,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1325, {0x00,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x06,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1326, {0x00,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1327, {0x00,0x00,0x3F,0x00,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x6D,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x1328, {0x00,0x00,0x7F,0x00,0xC9,0x80,0x88,0x80,0x88,0x80,0x88,0x80,0x88,0x80,0xCC,0xC0,0xAA,0xA0,0xAA,0xA0,0xCC,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1329, {0x00,0x00,0x7C,0x00,0xD6,0x00,0x92,0x00,0x93,0xE0,0x92,0x60,0x92,0x00,0xDB,0x00,0xB6,0x80,0xB6,0x80,0xDB,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x132A, {0x00,0x00,0x7C,0x00,0xD6,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0xDA,0x00,0xB6,0x00,0xB6,0x60,0xDB,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x132B, {0x00,0x00,0x7F,0x00,0xC9,0x80,0x88,0x80,0xCC,0x80,0xAA,0x80,0xAA,0x80,0xCC,0xC0,0x00,0xA0,0x00,0xA0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x132C, {0x00,0x00,0x7C,0x00,0xD6,0x00,0x93,0xC0,0x93,0x20,0x92,0xC0,0x92,0x00,0xDB,0x00,0xB6,0x80,0xB6,0x80,0xDB,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x132D, {0x00,0x00,0x7F,0x00,0xC9,0x80,0x88,0x80,0xC8,0xC0,0xA8,0xA0,0xA8,0xA0,0xCC,0xC0,0x0A,0x00,0x0A,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x132E, {0x00,0x00,0x7F,0x00,0xC9,0x80,0x88,0x80,0x8C,0xC0,0x8A,0xA0,0x8A,0xA0,0xCC,0xC0,0xA0,0x00,0xA0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x132F, {0x00,0x00,0x7F,0x00,0xC9,0x80,0x88,0x80,0xCC,0x80,0xAA,0x80,0xAA,0x80,0xCC,0x80,0x00,0x80,0x00,0x80,0x03,0xE0,0x02,0x20,0x00,0x00,}}, +{ 0x1330, {0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1331, {0x00,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0xE0,0xC3,0x60,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1332, {0x00,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0x00,0xC3,0x60,0xC3,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1333, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x21,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1334, {0x00,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0xC0,0xC3,0x20,0xC3,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1335, {0x00,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x67,0xE0,0x66,0x60,0x3C,0x00,0x3C,0x00,0x66,0x00,0xC3,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1336, {0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x00,0x19,0x80,0x30,0x80,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1337, {0x00,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0x00,0x43,0x00,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x1338, {0x00,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1339, {0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0x00,0xC3,0xE0,0xC3,0x60,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x133A, {0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0x00,0xC3,0x00,0xC3,0x60,0xC3,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x133B, {0x00,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x133C, {0x00,0x00,0x3C,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x3C,0x00,0x3C,0x00,0x66,0x00,0xC3,0xC0,0xC3,0x20,0xC3,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x133D, {0x00,0x00,0x3C,0x00,0x66,0x00,0x67,0xE0,0x66,0x60,0x3C,0x00,0x3C,0x00,0x66,0x00,0xC3,0x00,0xC3,0x00,0xC3,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x133E, {0x00,0x00,0x0F,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x0F,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x133F, {0x00,0x00,0x1E,0x00,0x33,0x00,0x33,0x00,0x33,0x00,0x1E,0x00,0x1E,0x00,0x33,0x00,0x61,0x80,0x01,0x80,0x07,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x1340, {0x00,0x00,0x03,0x00,0x0D,0x80,0x31,0x80,0x31,0x80,0x3F,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x37,0x80,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1341, {0x00,0x00,0x0C,0x00,0x36,0x00,0xC6,0x00,0xC6,0x00,0xFF,0xE0,0xC6,0x60,0xC6,0x00,0xC6,0x00,0xDE,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1342, {0x00,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x40,0x07,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1343, {0x00,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1344, {0x00,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x03,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1345, {0x00,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x31,0x80,0x31,0x80,0x3F,0x80,0x31,0x80,0x31,0x80,0x37,0x80,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1346, {0x00,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x31,0x80,0x1F,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1348, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x1C,0x00,0x36,0x00,0x32,0x00,0x3A,0xC0,0x1F,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1349, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x3C,0x00,0x66,0x00,0x76,0x00,0x3F,0xC0,0x1F,0xC0,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x134A, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x38,0x00,0x6D,0x80,0x64,0xC0,0x74,0xC0,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x134B, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x38,0x00,0x64,0xE0,0x75,0xE0,0x3F,0x00,0x1E,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x134C, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x38,0x00,0x68,0x00,0x64,0x00,0x75,0xC0,0x3F,0x20,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x134D, {0x00,0x00,0x0F,0x00,0x1F,0x80,0x31,0x80,0x30,0x00,0x3C,0x00,0x32,0x00,0x32,0xC0,0x3F,0xC0,0x1F,0x80,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x134E, {0x00,0x00,0x1F,0x80,0x3E,0x40,0x61,0x80,0x60,0x00,0x60,0x00,0x78,0x00,0x64,0x00,0x65,0x80,0x7F,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x134F, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x38,0x00,0x64,0xE0,0x75,0xE0,0x3F,0x00,0x1E,0x00,0x0C,0x00,0x3F,0x00,0x21,0x00,}}, +{ 0x1350, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1351, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xE0,0x06,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1352, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x60,0x07,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1353, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1354, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x06,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1355, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x07,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1356, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1357, {0x00,0x00,0x3F,0xC0,0x66,0x60,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x1358, {0x00,0x00,0x3F,0x80,0x04,0x00,0x3F,0x80,0x4A,0x40,0x4A,0x40,0x4A,0x40,0x31,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x1359, {0x00,0x00,0x21,0x00,0x3F,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x31,0x80,0x60,0xC0,0x70,0xC0,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x135A, {0x00,0x00,0x21,0x00,0x3F,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x39,0x80,0x64,0xC0,0x74,0xC0,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1361, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1362, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1363, {0x00,0x00,0x00,0xC0,0x3F,0xC0,0x30,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1364, {0x00,0x00,0x00,0xC0,0x3F,0xC0,0x30,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0xC0,0x3F,0xC0,0x30,0x00,0x00,0x00,}}, +{ 0x1365, {0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0xC0,0x3F,0xC0,0x30,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1366, {0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1367, {0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1368, {0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x30,0xC0,0x36,0xC0,0x06,0x00,0x30,0xC0,0x30,0xC0,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E02, {0x0C,0x00,0x0C,0x00,0x00,0x00,0x7F,0x00,0x31,0x80,0x31,0x80,0x3F,0x00,0x30,0x80,0x30,0xC0,0x30,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E03, {0x00,0x00,0x03,0x00,0x3B,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1C,0xC0,0x3B,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E0A, {0x0C,0x00,0x0C,0x00,0x00,0x00,0x7E,0x00,0x31,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E0B, {0x00,0x00,0x18,0x00,0x1B,0x80,0x01,0x80,0x0D,0x80,0x33,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1E1E, {0x06,0x00,0x06,0x00,0x00,0x00,0x3F,0xC0,0x18,0x40,0x18,0x00,0x18,0x80,0x1F,0x80,0x18,0x80,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E1F, {0x18,0x00,0x18,0x00,0x07,0x00,0x09,0x80,0x18,0x00,0x3F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E40, {0x0C,0x00,0x0C,0x00,0x61,0xC0,0x31,0x80,0x31,0x80,0x3B,0x80,0x3B,0x80,0x2D,0x80,0x2D,0x80,0x25,0x80,0x71,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x1E41, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x6D,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x76,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x1E56, {0x06,0x00,0x06,0x00,0x00,0x00,0x3F,0x00,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E57, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x3B,0x00,0x1C,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1C,0x80,0x1B,0x00,0x18,0x00,0x3C,0x00,}}, +{ 0x1E60, {0x06,0x00,0x06,0x00,0x00,0x00,0x1E,0x80,0x11,0x80,0x30,0x80,0x1E,0x00,0x07,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E61, {0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E6A, {0x06,0x00,0x06,0x00,0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E6B, {0x0C,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1E80, {0x18,0x00,0x0C,0x00,0x02,0x00,0xEE,0x60,0x66,0x40,0x37,0xC0,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E81, {0x18,0x00,0x0C,0x00,0x02,0x00,0x00,0x00,0x76,0xE0,0x76,0x40,0x36,0x40,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E82, {0x06,0x00,0x0C,0x00,0x10,0x00,0xEE,0x60,0x66,0x40,0x37,0xC0,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E83, {0x03,0x00,0x06,0x00,0x08,0x00,0x00,0x00,0x76,0xE0,0x76,0x40,0x36,0x40,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E84, {0x33,0x00,0x33,0x00,0x00,0x00,0xEE,0x60,0x66,0x40,0x37,0xC0,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1E85, {0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x76,0xE0,0x76,0x40,0x36,0x40,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x1EF2, {0x18,0x00,0x0C,0x00,0x02,0x00,0x7B,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x1EF3, {0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x7D,0xC0,0x30,0x80,0x18,0x80,0x19,0x00,0x0D,0x00,0x0E,0x00,0x66,0x00,0x64,0x00,0x38,0x00,}}, +{ 0x2010, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2011, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2012, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2013, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2014, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2015, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2016, {0x00,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,}}, +{ 0x2017, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0xFF,0xE0,}}, +{ 0x2018, {0x00,0x00,0x06,0x00,0x0C,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2019, {0x00,0x00,0x04,0x00,0x0E,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x201A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x201B, {0x00,0x00,0x04,0x00,0x0E,0x00,0x0C,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x201C, {0x00,0x00,0x19,0x80,0x33,0x00,0x3B,0x80,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x201D, {0x00,0x00,0x11,0x00,0x3B,0x80,0x19,0x80,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x201E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x3B,0x80,0x19,0x80,0x33,0x00,0x00,0x00,}}, +{ 0x201F, {0x00,0x00,0x11,0x00,0x3B,0x80,0x33,0x00,0x19,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2020, {0x00,0x00,0x04,0x00,0x0E,0x00,0x04,0x00,0x3F,0x80,0x35,0x80,0x0E,0x00,0x0E,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,}}, +{ 0x2021, {0x00,0x00,0x04,0x00,0x0E,0x00,0x24,0x80,0x3F,0x80,0x2E,0x80,0x04,0x00,0x04,0x00,0x2E,0x80,0x3F,0x80,0x24,0x80,0x0E,0x00,0x04,0x00,}}, +{ 0x2022, {0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1F,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2023, {0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x1C,0x00,0x1E,0x00,0x1F,0x00,0x1E,0x00,0x1C,0x00,0x18,0x00,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2024, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2025, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x2026, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0xC0,0x36,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2027, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2030, {0x00,0x00,0x38,0x80,0x6D,0x00,0x6D,0x00,0x6A,0x00,0x34,0x00,0x06,0x40,0x0D,0xA0,0x1D,0xA0,0x35,0xA0,0x22,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x2031, {0x00,0x00,0x44,0x00,0xA8,0x00,0xA8,0x00,0xB0,0x00,0x60,0x00,0x32,0x40,0x6D,0xA0,0xED,0xA0,0xAD,0xA0,0x12,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x2032, {0x00,0x00,0x30,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2033, {0x00,0x00,0x36,0x00,0x36,0x00,0x24,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2034, {0x00,0x00,0x36,0xC0,0x36,0xC0,0x24,0x80,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2035, {0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2036, {0x00,0x00,0x36,0x00,0x36,0x00,0x12,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2037, {0x00,0x00,0x6D,0x80,0x6D,0x80,0x24,0x80,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2039, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x203A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x203B, {0x00,0x00,0x00,0x00,0x44,0x40,0x24,0x80,0x11,0x00,0x0A,0x00,0x64,0xC0,0x0A,0x00,0x11,0x00,0x24,0x80,0x44,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x203C, {0x00,0x00,0x10,0x80,0x39,0xC0,0x39,0xC0,0x39,0xC0,0x39,0xC0,0x10,0x80,0x10,0x80,0x00,0x00,0x10,0x80,0x39,0xC0,0x10,0x80,0x00,0x00,}}, +{ 0x203E, {0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2044, {0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x2070, {0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2071, {0x00,0x00,0x18,0x00,0x00,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2074, {0x06,0x00,0x0E,0x00,0x1E,0x00,0x36,0x00,0x36,0x00,0x3F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2075, {0x3E,0x00,0x30,0x00,0x30,0x00,0x3C,0x00,0x06,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2076, {0x1C,0x00,0x36,0x00,0x30,0x00,0x3C,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2077, {0x3E,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2078, {0x1C,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2079, {0x1C,0x00,0x36,0x00,0x36,0x00,0x1E,0x00,0x06,0x00,0x36,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x207A, {0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x207B, {0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x207C, {0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x207D, {0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x207E, {0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x207F, {0x00,0x00,0x00,0x00,0x36,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2080, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,}}, +{ 0x2081, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,}}, +{ 0x2082, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x26,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x00,0x3E,0x00,}}, +{ 0x2083, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x36,0x00,0x06,0x00,0x0C,0x00,0x06,0x00,0x36,0x00,0x1C,0x00,}}, +{ 0x2084, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0E,0x00,0x1E,0x00,0x36,0x00,0x36,0x00,0x3F,0x00,0x06,0x00,}}, +{ 0x2085, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x30,0x00,0x30,0x00,0x3C,0x00,0x06,0x00,0x06,0x00,0x3C,0x00,}}, +{ 0x2086, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x36,0x00,0x30,0x00,0x3C,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,}}, +{ 0x2087, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,}}, +{ 0x2088, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x1C,0x00,}}, +{ 0x2089, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x1E,0x00,0x06,0x00,0x36,0x00,0x1C,0x00,}}, +{ 0x208A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x08,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x208B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x208C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x208D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,}}, +{ 0x208E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,}}, +{ 0x20A3, {0x00,0x00,0x00,0x00,0x7F,0x80,0x30,0x80,0x30,0x00,0x30,0x00,0x3E,0xC0,0x33,0x00,0x33,0x00,0x33,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20A4, {0x00,0x00,0x03,0x80,0x06,0xC0,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x3C,0x20,0x4E,0x40,0x39,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x20A7, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x7F,0xC0,0x31,0x80,0x3E,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x78,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20A9, {0x00,0x00,0x00,0x00,0xEE,0x60,0x66,0x40,0x66,0x40,0x36,0xC0,0xFF,0xE0,0x3B,0x80,0xFF,0xE0,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x20AC, {0x00,0x00,0x00,0x00,0x07,0x80,0x0C,0x40,0x18,0x00,0x3F,0x80,0x18,0x00,0x3F,0x00,0x18,0x00,0x0C,0x40,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x20AF, {0x04,0x00,0x08,0x00,0x3C,0x00,0x4A,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x40,0x69,0xA0,0x92,0xA0,0x6D,0x40,0x01,0x00,0x02,0x00,}}, +{ 0x20D0, {0x10,0x00,0x20,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D1, {0x01,0x00,0x00,0x80,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D2, {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x20D3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x20D4, {0x5F,0x80,0x60,0x40,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D5, {0x3F,0x40,0x40,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D6, {0x10,0x00,0x3F,0xC0,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D7, {0x00,0x80,0x3F,0xC0,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20D9, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0B,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20DA, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x0B,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20DB, {0x36,0xC0,0x36,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20DC, {0xDB,0x60,0xDB,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x20DD, {0x0F,0x00,0x30,0xC0,0x40,0x20,0x40,0x20,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x40,0x20,0x40,0x20,0x30,0xC0,0x0F,0x00,}}, +{ 0x20DE, {0xFF,0xF0,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0xFF,0xF0,}}, +{ 0x20DF, {0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x80,0x10,0x80,0x10,0x40,0x20,0x20,0x40,0x10,0x80,0x09,0x00,0x06,0x00,}}, +{ 0x20E0, {0x0F,0x00,0x30,0xC0,0x60,0x20,0x50,0x20,0x88,0x10,0x84,0x10,0x82,0x10,0x82,0x10,0x81,0x10,0x40,0xA0,0x40,0x60,0x30,0xC0,0x0F,0x00,}}, +{ 0x20E1, {0x10,0x80,0x3F,0xC0,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2102, {0x00,0x00,0x00,0x00,0x0F,0x40,0x1E,0xC0,0x36,0x40,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x1E,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x2103, {0x00,0x00,0x70,0x00,0x53,0xA0,0x76,0x60,0x0C,0x20,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x20,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2105, {0x00,0x00,0x00,0x00,0x38,0x00,0x6C,0x00,0x60,0x00,0x6C,0x00,0x3B,0x80,0x06,0xC0,0x06,0xC0,0x06,0xC0,0x03,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x210D, {0x00,0x00,0x00,0x00,0x6C,0x60,0x6C,0x60,0x6C,0x60,0x6C,0x60,0x6F,0xE0,0x6C,0x60,0x6C,0x60,0x6C,0x60,0x6C,0x60,0x00,0x00,0x00,0x00,}}, +{ 0x2113, {0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x06,0x00,0x1C,0x00,0x04,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2115, {0x00,0x00,0x00,0x00,0x78,0x40,0x6C,0x40,0x6E,0x40,0x6F,0x40,0x6F,0x40,0x6D,0xC0,0x6C,0xC0,0x6C,0x40,0x6C,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x2116, {0x00,0x00,0x00,0x00,0xCE,0x00,0x64,0x00,0x75,0xC0,0x5F,0x60,0x5F,0x60,0x4F,0x60,0x45,0xC0,0x44,0x00,0xEF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x2119, {0x00,0x00,0x00,0x00,0x7F,0x00,0x6D,0x80,0x6C,0xC0,0x6C,0xC0,0x6D,0x80,0x6F,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x211A, {0x00,0x00,0x00,0x00,0x0E,0x00,0x3D,0x80,0x6C,0xC0,0x6C,0xC0,0x6C,0xC0,0x6C,0xC0,0x6C,0xC0,0x3F,0x80,0x1F,0x80,0x00,0xC0,0x00,0x00,}}, +{ 0x211D, {0x00,0x00,0x00,0x00,0x7F,0x00,0x6D,0x80,0x6C,0xC0,0x6C,0xC0,0x6D,0x80,0x6F,0x00,0x6D,0x80,0x6C,0xC0,0x6C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2122, {0x00,0x00,0x00,0x00,0xFA,0x20,0x23,0x60,0x22,0xA0,0x22,0x20,0x22,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2124, {0x00,0x00,0x00,0x00,0x7F,0xE0,0x46,0xC0,0x06,0xC0,0x0D,0x80,0x0D,0x80,0x1B,0x00,0x1B,0x00,0x36,0x20,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2126, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x11,0x00,0x4A,0x40,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2127, {0x00,0x00,0x00,0x00,0x7B,0xC0,0x4A,0x40,0x11,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x212B, {0x0E,0x00,0x0A,0x00,0x0E,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x13,0x00,0x13,0x00,0x3F,0x80,0x31,0x80,0x61,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x212E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x71,0xC0,0x7F,0xC0,0x70,0x00,0x31,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x215B, {0x30,0x80,0x70,0x80,0x31,0x00,0x31,0x00,0x32,0x00,0x33,0xC0,0x7F,0x60,0x07,0x60,0x09,0xC0,0x0B,0x60,0x13,0x60,0x11,0xC0,0x00,0x00,}}, +{ 0x215C, {0x30,0x80,0x58,0x80,0x19,0x00,0x31,0x00,0x1A,0x00,0x5B,0xC0,0x37,0x60,0x07,0x60,0x09,0xC0,0x0B,0x60,0x13,0x60,0x11,0xC0,0x00,0x00,}}, +{ 0x215D, {0x78,0x80,0x60,0x80,0x71,0x00,0x19,0x00,0x1A,0x00,0x5B,0xC0,0x37,0x60,0x07,0x60,0x09,0xC0,0x0B,0x60,0x13,0x60,0x11,0xC0,0x00,0x00,}}, +{ 0x215E, {0x78,0x80,0x18,0x80,0x19,0x00,0x31,0x00,0x32,0x00,0x33,0xC0,0x37,0x60,0x07,0x60,0x09,0xC0,0x0B,0x60,0x13,0x60,0x11,0xC0,0x00,0x00,}}, +{ 0x2190, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x7F,0xE0,0x20,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2191, {0x00,0x00,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2192, {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x7F,0xE0,0x00,0x40,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2193, {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2194, {0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x7F,0xE0,0x20,0x40,0x10,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2195, {0x00,0x00,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2196, {0x00,0x00,0x00,0x00,0x7C,0x00,0x60,0x00,0x50,0x00,0x48,0x00,0x44,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x2197, {0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0xC0,0x01,0x40,0x02,0x40,0x04,0x40,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2198, {0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x40,0x02,0x40,0x01,0x40,0x00,0xC0,0x07,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2199, {0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x60,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21A4, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x20,0x20,0x20,0x7F,0xE0,0x20,0x20,0x10,0x20,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21A5, {0x00,0x00,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21A6, {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x40,0x80,0x40,0x40,0x7F,0xE0,0x40,0x40,0x40,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21A7, {0x00,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21A8, {0x00,0x00,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x04,0x00,0x24,0x80,0x15,0x00,0x0E,0x00,0x04,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x21CB, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20,0x00,0x7F,0xC0,0x00,0x00,0x7F,0xC0,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21CC, {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x7F,0xC0,0x00,0x00,0x7F,0xC0,0x20,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D0, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00,0x3F,0xE0,0x40,0x00,0x3F,0xE0,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D1, {0x00,0x00,0x04,0x00,0x0A,0x00,0x1B,0x00,0x2A,0x80,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D2, {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x7F,0xC0,0x00,0x20,0x7F,0xC0,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D3, {0x00,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x2A,0x80,0x1B,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D4, {0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x10,0x80,0x3F,0xC0,0x40,0x20,0x3F,0xC0,0x10,0x80,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D5, {0x00,0x00,0x04,0x00,0x0A,0x00,0x1B,0x00,0x2A,0x80,0x0A,0x00,0x0A,0x00,0x2A,0x80,0x1B,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D6, {0x00,0x00,0x00,0x00,0x7E,0x00,0x48,0x00,0x44,0x00,0x62,0x00,0x51,0x00,0x48,0x80,0x04,0x40,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D7, {0x00,0x00,0x00,0x00,0x0F,0xC0,0x02,0x40,0x04,0x40,0x08,0xC0,0x11,0x40,0x22,0x40,0x44,0x00,0x08,0x00,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x21D8, {0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x44,0x00,0x22,0x40,0x11,0x40,0x08,0xC0,0x04,0x40,0x02,0x40,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x21D9, {0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x40,0x48,0x80,0x51,0x00,0x62,0x00,0x44,0x00,0x48,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2200, {0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x3F,0x80,0x20,0x80,0x11,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2201, {0x00,0x00,0x0E,0x00,0x1B,0x00,0x19,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0x00,0x1B,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x2202, {0x00,0x00,0x07,0x00,0x09,0x80,0x00,0x80,0x0E,0x80,0x19,0x80,0x31,0x80,0x31,0x00,0x33,0x00,0x16,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2203, {0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x3F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x2204, {0x00,0x00,0x02,0x00,0x3F,0x80,0x02,0x80,0x04,0x80,0x04,0x80,0x3F,0x80,0x08,0x80,0x08,0x80,0x10,0x80,0x3F,0x80,0x10,0x00,0x00,0x00,}}, +{ 0x2205, {0x00,0x00,0x00,0x00,0x0E,0x40,0x11,0x80,0x21,0x80,0x42,0x40,0x44,0x40,0x48,0x40,0x30,0x80,0x31,0x00,0x4E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2206, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2207, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x20,0x80,0x11,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2208, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x10,0x00,0x20,0x00,0x3F,0xC0,0x20,0x00,0x10,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2209, {0x00,0x00,0x00,0x40,0x00,0x80,0x0F,0xC0,0x11,0x00,0x22,0x00,0x3F,0xC0,0x24,0x00,0x18,0x00,0x0F,0xC0,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x220B, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x220C, {0x00,0x00,0x20,0x00,0x10,0x00,0x3F,0x00,0x08,0x80,0x04,0x40,0x3F,0xC0,0x02,0x40,0x01,0x80,0x3F,0x00,0x00,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x220F, {0x00,0x00,0x7F,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,}}, +{ 0x2210, {0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x7F,0xE0,0x00,0x00,}}, +{ 0x2211, {0x00,0x00,0x3F,0xC0,0x18,0x40,0x0C,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x30,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0x2212, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2213, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2215, {0x00,0x00,0x00,0x60,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2218, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2219, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x221A, {0x00,0x00,0x00,0x00,0x03,0xE0,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x64,0x00,0x78,0x00,0x18,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x221D, {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0xC0,0x3D,0xC0,0x27,0x00,0x27,0x00,0x3D,0xC0,0x18,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x221E, {0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x80,0x7B,0xC0,0x4E,0x40,0x4E,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x221F, {0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2220, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2221, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x19,0x00,0x06,0x00,0x06,0x00,0x09,0x00,0x11,0x00,0x3F,0xC0,0x01,0x00,0x00,0x00,}}, +{ 0x2224, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x0C,0x00,0x14,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2225, {0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2226, {0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0xC0,0x0F,0x00,0x39,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2227, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x2228, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x20,0x80,0x20,0x80,0x11,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2229, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x222A, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x10,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x222B, {0x01,0x80,0x02,0xC0,0x06,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x34,0x00,0x18,0x00,}}, +{ 0x222C, {0x0C,0x60,0x14,0xA0,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0xA5,0x00,0xC6,0x00,}}, +{ 0x222E, {0x01,0x80,0x02,0xC0,0x06,0x80,0x06,0x00,0x1F,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x0F,0x00,0x06,0x00,0x16,0x00,0x34,0x00,0x18,0x00,}}, +{ 0x2234, {0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2235, {0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xC0,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x223C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0xC0,0x33,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x223D, {0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x80,0x42,0x40,0x84,0x20,0x84,0x20,0x48,0x40,0x31,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2243, {0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x40,0x03,0x80,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2245, {0x00,0x00,0x00,0x00,0x38,0x00,0x44,0x40,0x03,0x80,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2248, {0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x38,0x40,0x44,0x40,0x43,0x80,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2249, {0x00,0x00,0x01,0x00,0x01,0x00,0x3A,0x40,0x46,0x40,0x43,0x80,0x04,0x00,0x3C,0x40,0x4C,0x40,0x4B,0x80,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x2252, {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x2259, {0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x225F, {0x00,0x00,0x04,0x00,0x0A,0x00,0x02,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2260, {0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2261, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2262, {0x00,0x00,0x01,0x00,0x01,0x00,0x3F,0xC0,0x02,0x00,0x02,0x00,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x08,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x2264, {0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2265, {0x00,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2266, {0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2267, {0x30,0x00,0x0C,0x00,0x03,0x00,0x00,0xC0,0x03,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x226A, {0x00,0x00,0x00,0x00,0x02,0x40,0x04,0x80,0x09,0x00,0x12,0x00,0x24,0x00,0x12,0x00,0x09,0x00,0x04,0x80,0x02,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x226B, {0x00,0x00,0x00,0x00,0x24,0x00,0x12,0x00,0x09,0x00,0x04,0x80,0x02,0x40,0x04,0x80,0x09,0x00,0x12,0x00,0x24,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2282, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x10,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2283, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2284, {0x00,0x00,0x00,0x00,0x02,0x00,0x0F,0xC0,0x12,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x12,0x00,0x0F,0xC0,0x02,0x00,0x00,0x00,}}, +{ 0x2285, {0x00,0x00,0x00,0x00,0x04,0x00,0x3F,0x00,0x04,0x80,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x80,0x3F,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x2286, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x10,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2287, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x80,0x3F,0x00,0x00,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2288, {0x00,0x00,0x00,0x00,0x02,0x00,0x0F,0xC0,0x12,0x00,0x22,0x00,0x22,0x00,0x12,0x00,0x0F,0xC0,0x02,0x00,0x3F,0xC0,0x02,0x00,0x00,0x00,}}, +{ 0x2289, {0x00,0x00,0x00,0x00,0x04,0x00,0x3F,0x00,0x04,0x80,0x04,0x40,0x04,0x40,0x04,0x80,0x3F,0x00,0x04,0x00,0x3F,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x228A, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x10,0x00,0x20,0x00,0x20,0x00,0x11,0x00,0x0F,0xC0,0x02,0x00,0x3F,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x228B, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x80,0x00,0x40,0x00,0x40,0x04,0x80,0x3F,0x00,0x08,0x00,0x3F,0xC0,0x10,0x00,0x00,0x00,}}, +{ 0x2295, {0x00,0x00,0x00,0x00,0x1F,0x00,0x24,0x80,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x24,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2297, {0x00,0x00,0x00,0x00,0x1F,0x00,0x20,0x80,0x51,0x40,0x4A,0x40,0x44,0x40,0x4A,0x40,0x51,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x22A4, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x22A5, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x22A6, {0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x1F,0x80,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x22A7, {0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x1F,0x80,0x10,0x00,0x1F,0x80,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x22C0, {0x00,0x00,0x06,0x00,0x06,0x00,0x09,0x00,0x09,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x20,0x40,0x20,0x40,0x40,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x22C1, {0x00,0x00,0x40,0x20,0x40,0x20,0x20,0x40,0x20,0x40,0x10,0x80,0x10,0x80,0x10,0x80,0x09,0x00,0x09,0x00,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x22C2, {0x00,0x00,0x0F,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x22C3, {0x00,0x00,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x20,0x40,0x10,0x80,0x0F,0x00,0x00,0x00,}}, +{ 0x22C5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2300, {0x00,0x00,0x00,0x00,0x0E,0x40,0x11,0x80,0x21,0x80,0x42,0x40,0x44,0x40,0x48,0x40,0x30,0x80,0x31,0x00,0x4E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2302, {0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x2308, {0x00,0x00,0x07,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x2309, {0x00,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x230A, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x00,0x00,}}, +{ 0x230B, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3C,0x00,0x00,0x00,}}, +{ 0x2310, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2312, {0x00,0x00,0x3F,0x80,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2320, {0x00,0x00,0x03,0x00,0x05,0x80,0x0D,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,}}, +{ 0x2321, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x16,0x00,0x34,0x00,0x18,0x00,0x00,0x00,}}, +{ 0x2329, {0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x232A, {0x00,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x23B7, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x12,0x00,0x12,0x00,0x0A,0x00,0x0A,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x23B8, {0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,}}, +{ 0x23B9, {0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,}}, +{ 0x23BA, {0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x23BB, {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x23BC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x23BD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,}}, +{ 0x2409, {0x00,0x00,0x48,0x00,0x48,0x00,0x78,0x00,0x4B,0xE0,0x48,0x80,0x48,0x80,0x48,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x240A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x43,0xC0,0x42,0x00,0x42,0x00,0x7B,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x240B, {0x00,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x53,0xE0,0x50,0x80,0x20,0x80,0x20,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x240C, {0x00,0x00,0x78,0x00,0x40,0x00,0x40,0x00,0x73,0xC0,0x42,0x00,0x42,0x00,0x43,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x240D, {0x00,0x00,0x30,0x00,0x48,0x00,0x40,0x00,0x43,0x80,0x42,0x40,0x4A,0x40,0x33,0x80,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x2424, {0x00,0x00,0x48,0x00,0x48,0x00,0x68,0x00,0x5A,0x00,0x4A,0x00,0x4A,0x00,0x4A,0x00,0x02,0x00,0x02,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2500, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2501, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2502, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2503, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x250C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x250F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x07,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x2510, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2513, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0xFE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x2514, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2517, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xF0,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2518, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x251B, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x251C, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x251D, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xF0,0x03,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2520, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x2523, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xF0,0x07,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x2524, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2525, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2528, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x252B, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x00,0xFE,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x252C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x252F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2530, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x2533, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x2534, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2537, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2538, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x253B, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFF,0xF0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x253C, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x253F, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF0,0xFF,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2542, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFF,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x254B, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFF,0xF0,0xFF,0xF0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,}}, +{ 0x254C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFB,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x254D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFB,0xE0,0xFB,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x254E, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x254F, {0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x2550, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2551, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2552, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x02,0x00,0x03,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2553, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2554, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x04,0x00,0x05,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2555, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x02,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2556, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2557, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x01,0x00,0xFD,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2558, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xF0,0x02,0x00,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2559, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x255A, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0xF0,0x04,0x00,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x255B, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x02,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x255C, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x255D, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFD,0x00,0x01,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x255E, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xF0,0x02,0x00,0x03,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x255F, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2560, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0xF0,0x04,0x00,0x05,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2561, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFE,0x00,0x02,0x00,0xFE,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2562, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFD,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2563, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFD,0x00,0x01,0x00,0xFD,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2564, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFF,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x2565, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2566, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0xFD,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x2567, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2568, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2569, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFD,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x256A, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xFF,0xF0,0x02,0x00,0xFF,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x256B, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFF,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x256C, {0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0xFD,0xF0,0x00,0x00,0xFD,0xF0,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,0x05,0x00,}}, +{ 0x256D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x256E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,}}, +{ 0x256F, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2570, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2571, {0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,}}, +{ 0x2572, {0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x10,}}, +{ 0x2573, {0x80,0x10,0x40,0x20,0x20,0x40,0x10,0x80,0x09,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x20,0x40,0x40,0x20,0x80,0x10,}}, +{ 0x2580, {0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2581, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2582, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2583, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2584, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2585, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2586, {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2587, {0x00,0x00,0x00,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2588, {0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x2589, {0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,}}, +{ 0x258A, {0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,0xFF,0x80,}}, +{ 0x258B, {0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,}}, +{ 0x258C, {0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,}}, +{ 0x258D, {0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,}}, +{ 0x258E, {0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,}}, +{ 0x258F, {0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,}}, +{ 0x2590, {0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,}}, +{ 0x2591, {0xAA,0xA0,0x00,0x00,0x55,0x50,0x00,0x00,0xAA,0xA0,0x00,0x00,0x55,0x50,0x00,0x00,0xAA,0xA0,0x00,0x00,0x55,0x50,0x00,0x00,0xAA,0xA0,}}, +{ 0x2592, {0xAA,0xA0,0x55,0x50,0xAA,0xA0,0x55,0x50,0xAA,0xA0,0x55,0x50,0xAA,0xA0,0x55,0x50,0xAA,0xA0,0x55,0x50,0xAA,0xA0,0x55,0x50,0xAA,0xA0,}}, +{ 0x2593, {0x55,0x50,0xFF,0xF0,0xAA,0xA0,0xFF,0xF0,0x55,0x50,0xFF,0xF0,0xAA,0xA0,0xFF,0xF0,0x55,0x50,0xFF,0xF0,0xAA,0xA0,0xFF,0xF0,0x55,0x50,}}, +{ 0x2594, {0xFF,0xF0,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2595, {0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,}}, +{ 0x2596, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,}}, +{ 0x2597, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,}}, +{ 0x2598, {0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2599, {0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x259A, {0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,}}, +{ 0x259B, {0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,}}, +{ 0x259C, {0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,}}, +{ 0x259D, {0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x259E, {0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,0xFC,0x00,}}, +{ 0x259F, {0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0x03,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x25A0, {0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x25A1, {0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x25AA, {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25AB, {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25AC, {0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25AD, {0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25AE, {0x00,0x00,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x25B2, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x25B3, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40,0x40,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x25B6, {0x00,0x00,0x00,0x00,0x60,0x00,0x78,0x00,0x7E,0x00,0x7F,0x00,0x7F,0xC0,0x7F,0x00,0x7E,0x00,0x78,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25B7, {0x00,0x00,0x00,0x00,0x60,0x00,0x58,0x00,0x46,0x00,0x41,0x00,0x40,0xC0,0x41,0x00,0x46,0x00,0x58,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25BA, {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x7C,0x00,0x7F,0x80,0x7F,0xE0,0x7F,0x80,0x7C,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25BB, {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x5C,0x00,0x43,0x80,0x40,0x60,0x43,0x80,0x5C,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25BC, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x1F,0x00,0x1F,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25BD, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x40,0x40,0x20,0x80,0x20,0x80,0x11,0x00,0x11,0x00,0x0A,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25C0, {0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x0F,0xC0,0x1F,0xC0,0x7F,0xC0,0x1F,0xC0,0x0F,0xC0,0x03,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x25C1, {0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0x40,0x0C,0x40,0x10,0x40,0x60,0x40,0x10,0x40,0x0C,0x40,0x03,0x40,0x00,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x25C4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0xE0,0x1F,0xE0,0x7F,0xE0,0x1F,0xE0,0x03,0xE0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25C5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0xA0,0x1C,0x20,0x60,0x20,0x1C,0x20,0x03,0xA0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25C6, {0x00,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x3F,0x80,0x7F,0xC0,0xFF,0xE0,0x7F,0xC0,0x3F,0x80,0x1F,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x25C7, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x25CA, {0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x1F,0x00,0x1F,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25CB, {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x80,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25CC, {0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x20,0x80,0x00,0x00,0x40,0x40,0x00,0x00,0x20,0x80,0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25CE, {0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x2E,0x80,0x51,0x40,0x51,0x40,0x51,0x40,0x2E,0x80,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25CF, {0x00,0x00,0x00,0x00,0x0E,0x00,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25D8, {0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,0xF1,0xF0,0xE0,0xF0,0xC0,0x70,0xC0,0x70,0xC0,0x70,0xE0,0xF0,0xF1,0xF0,0xFF,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x25D9, {0xFF,0xF0,0xFF,0xF0,0xF1,0xF0,0xEE,0xF0,0xDF,0x70,0xBF,0xB0,0xBF,0xB0,0xBF,0xB0,0xDF,0x70,0xEE,0xF0,0xF1,0xF0,0xFF,0xF0,0xFF,0xF0,}}, +{ 0x25E6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x25EF, {0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x40,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0x2605, {0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0xFF,0xE0,0x7F,0xC0,0x3F,0x00,0x1F,0x00,0x3F,0x80,0x3B,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2606, {0x00,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0xF1,0xE0,0x60,0xC0,0x31,0x80,0x15,0x00,0x2E,0x80,0x31,0x80,0x60,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x2639, {0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x59,0xA0,0x59,0xA0,0x40,0x20,0x4F,0x20,0x50,0xA0,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x263A, {0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x59,0xA0,0x59,0xA0,0x40,0x20,0x50,0xA0,0x4F,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x263B, {0x00,0x00,0x00,0x00,0x1F,0x80,0x3F,0xC0,0x66,0x60,0x66,0x60,0x7F,0xE0,0x6F,0x60,0x70,0xE0,0x3F,0xC0,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x263C, {0x00,0x00,0x04,0x00,0x44,0x40,0x2E,0x80,0x11,0x00,0x20,0x80,0xE0,0xE0,0x20,0x80,0x11,0x00,0x2E,0x80,0x44,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x2640, {0x00,0x00,0x0E,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x11,0x00,0x0E,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x2641, {0x00,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x0E,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x11,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x2642, {0x00,0x00,0x07,0xE0,0x00,0x60,0x00,0xA0,0x01,0x20,0x1A,0x20,0x24,0x20,0x42,0x00,0x42,0x00,0x24,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2660, {0x00,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x3F,0x80,0x7F,0xC0,0x7F,0xC0,0x35,0x80,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2661, {0x00,0x00,0x00,0x00,0x31,0x80,0x4A,0x40,0x84,0x20,0x80,0x20,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2662, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2663, {0x00,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x35,0x80,0x7F,0xC0,0x7F,0xC0,0x35,0x80,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2664, {0x00,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x4E,0x40,0x35,0x80,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2665, {0x00,0x00,0x00,0x00,0x31,0x80,0x7B,0xC0,0xFF,0xE0,0xFF,0xE0,0x7F,0xC0,0x3F,0x80,0x1F,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2666, {0x00,0x00,0x04,0x00,0x0E,0x00,0x1F,0x00,0x3F,0x80,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x1F,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2667, {0x00,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x35,0x80,0x4E,0x40,0x4E,0x40,0x35,0x80,0x04,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x2669, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x0E,0x00,0x1E,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x266A, {0x04,0x00,0x06,0x00,0x07,0x00,0x05,0x80,0x05,0x80,0x04,0x80,0x04,0x80,0x05,0x00,0x1C,0x00,0x3C,0x00,0x38,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x266B, {0x00,0x00,0x00,0x60,0x03,0xE0,0x0F,0xA0,0x0C,0x20,0x08,0x20,0x08,0x20,0x08,0xE0,0x09,0xE0,0x39,0xC0,0x78,0x00,0x70,0x00,0x00,0x00,}}, +{ 0x266C, {0x00,0x00,0x00,0x60,0x03,0xA0,0x0C,0x60,0x0B,0xA0,0x0C,0x20,0x08,0x20,0x08,0xE0,0x09,0xE0,0x39,0xC0,0x78,0x00,0x70,0x00,0x00,0x00,}}, +{ 0x266D, {0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x17,0x00,0x19,0x80,0x11,0x00,0x12,0x00,0x14,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x266E, {0x00,0x00,0x08,0x00,0x09,0x00,0x0B,0x00,0x0F,0x00,0x0D,0x00,0x09,0x00,0x0B,0x00,0x0F,0x00,0x0D,0x00,0x09,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x266F, {0x00,0x00,0x01,0x00,0x09,0xC0,0x0F,0xC0,0x3F,0x00,0x39,0x00,0x09,0x00,0x09,0xC0,0x0F,0xC0,0x3F,0x00,0x39,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x3000, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3001, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x30,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x3002, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x48,0x00,0x48,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x3003, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x08,0x80,0x08,0x80,0x11,0x00,0x11,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3005, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x0F,0x80,0x11,0x00,0x11,0x00,0x22,0x00,0x06,0x00,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x3006, {0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x0C,0x80,0x13,0x00,0x12,0x00,0x15,0x00,0x28,0x00,0x30,0x00,0x20,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3007, {0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x40,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0x3008, {0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x00,}}, +{ 0x3009, {0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00,0x00,}}, +{ 0x300A, {0x02,0x40,0x04,0x80,0x04,0x80,0x09,0x00,0x09,0x00,0x12,0x00,0x12,0x00,0x09,0x00,0x09,0x00,0x04,0x80,0x04,0x80,0x02,0x40,0x00,0x00,}}, +{ 0x300B, {0x48,0x00,0x24,0x00,0x24,0x00,0x12,0x00,0x12,0x00,0x09,0x00,0x09,0x00,0x12,0x00,0x12,0x00,0x24,0x00,0x24,0x00,0x48,0x00,0x00,0x00,}}, +{ 0x300C, {0x07,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x300D, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7C,0x00,0x00,0x00,}}, +{ 0x300E, {0x0F,0xC0,0x08,0x40,0x0B,0xC0,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x300F, {0x0E,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x7A,0x00,0x42,0x00,0x7E,0x00,0x00,0x00,}}, +{ 0x3010, {0x03,0xC0,0x03,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x03,0x80,0x03,0xC0,0x00,0x00,}}, +{ 0x3011, {0x78,0x00,0x38,0x00,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x00,0x38,0x00,0x78,0x00,0x00,0x00,}}, +{ 0x3012, {0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3013, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3014, {0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x00,}}, +{ 0x3015, {0x40,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00,0x00,}}, +{ 0x301C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x24,0x20,0x42,0x40,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3041, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x07,0x00,0x3C,0x00,0x09,0x00,0x0F,0x80,0x1A,0x40,0x24,0x40,0x2C,0x40,0x31,0x80,0x00,0x00,}}, +{ 0x3042, {0x10,0x00,0x08,0x00,0x0E,0x00,0x78,0x00,0x12,0x00,0x1F,0x00,0x34,0x80,0x54,0x40,0x48,0x40,0x58,0x40,0x21,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x3043, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x20,0x80,0x20,0x40,0x10,0x40,0x14,0x00,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3044, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x20,0x40,0x20,0x20,0x24,0x20,0x28,0x60,0x28,0x20,0x30,0x00,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3045, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x17,0x00,0x08,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x3046, {0x08,0x00,0x07,0x00,0x00,0x00,0x0F,0x00,0x30,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x3047, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x1A,0x00,0x04,0x00,0x08,0x00,0x14,0x00,0x23,0x80,0x00,0x00,}}, +{ 0x3048, {0x10,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x3A,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x38,0x00,0x44,0x00,0x43,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x3049, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x80,0x18,0xC0,0x30,0x00,0x17,0x80,0x18,0x40,0x30,0x40,0x31,0x80,0x10,0x00,0x00,0x00,}}, +{ 0x304A, {0x00,0x00,0x10,0x00,0x08,0x80,0x0C,0x60,0x38,0x20,0x09,0x80,0x0E,0x40,0x18,0x20,0x68,0x20,0x19,0xC0,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x304B, {0x00,0x00,0x10,0x00,0x08,0x80,0x4E,0x40,0x39,0x20,0x09,0x60,0x11,0x00,0x11,0x00,0x11,0x00,0x25,0x00,0x22,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x304C, {0x00,0x40,0x21,0x20,0x10,0x80,0x9D,0x00,0x72,0x80,0x12,0x40,0x22,0xC0,0x22,0x00,0x22,0x00,0x4A,0x00,0x44,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x304D, {0x08,0x00,0x04,0x00,0x05,0x00,0x1E,0x00,0x03,0x80,0x3E,0x00,0x01,0x00,0x01,0x80,0x1E,0x80,0x20,0x00,0x18,0x00,0x07,0x00,0x00,0x00,}}, +{ 0x304E, {0x10,0x40,0x09,0x20,0x0A,0x80,0x3C,0x00,0x07,0x00,0x7C,0x00,0x02,0x00,0x03,0x00,0x3D,0x00,0x40,0x00,0x30,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x304F, {0x01,0x00,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x00,}}, +{ 0x3050, {0x02,0x00,0x01,0x00,0x02,0x40,0x04,0x20,0x18,0x80,0x20,0x40,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x3051, {0x02,0x00,0x41,0x00,0x20,0x80,0x20,0xE0,0x4F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x60,0x80,0x21,0x00,0x21,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x3052, {0x04,0x40,0x82,0xA0,0x41,0x40,0x41,0xC0,0x9F,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0xC1,0x00,0x42,0x00,0x42,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x3053, {0x00,0x00,0x10,0x00,0x0F,0x80,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x3054, {0x01,0x40,0x20,0xA0,0x1F,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x3055, {0x08,0x00,0x04,0x00,0x03,0xC0,0x3D,0x00,0x01,0x00,0x00,0x80,0x0F,0xC0,0x10,0x00,0x20,0x00,0x18,0x00,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x3056, {0x10,0x40,0x08,0xA0,0x07,0x40,0x7A,0x00,0x02,0x00,0x01,0x00,0x1F,0x80,0x20,0x00,0x40,0x00,0x30,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3057, {0x00,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x40,0x11,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3058, {0x00,0x00,0x40,0x80,0x22,0x40,0x21,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x40,0x11,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3059, {0x02,0x00,0x01,0x00,0x41,0xE0,0x3F,0x00,0x07,0x00,0x09,0x80,0x08,0x80,0x07,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x305A, {0x05,0x40,0x02,0xA0,0x83,0xC0,0x7E,0x00,0x0E,0x00,0x13,0x00,0x11,0x00,0x0F,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x305B, {0x00,0x00,0x01,0x00,0x10,0x80,0x10,0xE0,0x57,0x80,0x38,0x80,0x10,0x80,0x11,0x80,0x10,0x80,0x08,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x305C, {0x00,0x40,0x02,0xA0,0x21,0x40,0x21,0xC0,0xAF,0x00,0x71,0x00,0x21,0x00,0x23,0x00,0x21,0x00,0x10,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x305D, {0x00,0x00,0x27,0x00,0x1A,0x00,0x04,0x00,0x08,0xC0,0x1F,0x00,0x62,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x305E, {0x00,0x40,0x27,0x20,0x1A,0x80,0x04,0x40,0x08,0xC0,0x1F,0x00,0x62,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x305F, {0x00,0x00,0x30,0x00,0x16,0x00,0x78,0x00,0x13,0x80,0x20,0xC0,0x21,0x00,0x20,0x00,0x40,0x00,0x44,0x00,0x43,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x3060, {0x00,0x40,0x31,0x20,0x16,0x80,0x78,0x00,0x13,0x80,0x20,0xC0,0x21,0x00,0x20,0x00,0x40,0x00,0x44,0x00,0x43,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x3061, {0x10,0x00,0x08,0x00,0x0B,0x00,0x7C,0x00,0x10,0x00,0x11,0x80,0x16,0x40,0x38,0x40,0x20,0x40,0x00,0x40,0x01,0x80,0x0E,0x00,0x00,0x00,}}, +{ 0x3062, {0x20,0x40,0x10,0x20,0x16,0x80,0xF8,0x40,0x20,0x00,0x23,0x00,0x2C,0x80,0x70,0x80,0x40,0x80,0x00,0x80,0x03,0x00,0x1C,0x00,0x00,0x00,}}, +{ 0x3063, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x18,0x80,0x60,0x40,0x00,0x40,0x00,0x80,0x03,0x00,0x1C,0x00,0x00,0x00,}}, +{ 0x3064, {0x00,0x00,0x00,0x00,0x03,0x80,0x4C,0x40,0x30,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x01,0x80,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3065, {0x01,0x40,0x00,0xA0,0x07,0x00,0x98,0x80,0x60,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x03,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3066, {0x00,0x00,0x00,0xE0,0x47,0x00,0x3A,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x3067, {0x00,0x00,0x01,0xC0,0x8E,0x00,0x74,0x40,0x05,0x20,0x08,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3068, {0x00,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0xC0,0x07,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x3069, {0x00,0x00,0x11,0x40,0x08,0xA0,0x08,0x00,0x09,0x80,0x0E,0x00,0x18,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x306A, {0x10,0x00,0x0A,0x00,0x7C,0x00,0x09,0x80,0x10,0xC0,0x20,0x80,0x21,0x00,0x41,0x00,0x0F,0x00,0x11,0x80,0x11,0x40,0x0E,0x00,0x00,0x00,}}, +{ 0x306B, {0x00,0x00,0x40,0x00,0x23,0x80,0x2C,0xC0,0x40,0x80,0x40,0x00,0x40,0x00,0x40,0x00,0x48,0x00,0x67,0xC0,0x20,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x306C, {0x00,0x00,0x02,0x00,0x01,0x00,0x07,0x80,0x2A,0x40,0x32,0x20,0x34,0x20,0x3C,0x20,0x48,0xE0,0x59,0x40,0x20,0xA0,0x00,0x00,0x00,0x00,}}, +{ 0x306D, {0x20,0x00,0x10,0x00,0x10,0x00,0x19,0x80,0x7E,0x40,0x18,0x40,0x10,0x40,0x30,0x40,0x31,0xC0,0x52,0x60,0x11,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x306E, {0x00,0x00,0x00,0x00,0x1F,0x00,0x24,0x80,0x24,0x40,0x48,0x40,0x48,0x40,0x50,0x40,0x50,0x80,0x21,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x306F, {0x01,0x00,0x40,0x80,0x28,0xE0,0x27,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x67,0x80,0x28,0xC0,0x27,0x20,0x00,0x00,0x00,0x00,}}, +{ 0x3070, {0x02,0x40,0x81,0x20,0x51,0xC0,0x4F,0x20,0x81,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0xCF,0x00,0x51,0x80,0x4E,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x3071, {0x02,0xC0,0x81,0xA0,0x51,0x60,0x4F,0xC0,0x81,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0xCF,0x00,0x51,0x80,0x4E,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x3072, {0x00,0x00,0x00,0x80,0x08,0x80,0x78,0xC0,0x10,0x40,0x10,0x60,0x20,0xA0,0x20,0x80,0x20,0x80,0x11,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3073, {0x00,0x40,0x01,0x20,0x11,0x40,0xF1,0xA0,0x20,0x80,0x20,0x80,0x41,0x40,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3074, {0x00,0xC0,0x01,0xA0,0x11,0xE0,0xF1,0x00,0x20,0x80,0x20,0x80,0x41,0x40,0x41,0x00,0x41,0x00,0x22,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3075, {0x00,0x00,0x10,0x00,0x0E,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x0A,0xC0,0xB2,0x20,0x52,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3076, {0x00,0x00,0x10,0x40,0x0E,0x20,0x04,0x80,0x08,0x40,0x08,0x00,0x04,0x00,0x0A,0xC0,0xB2,0x20,0x52,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3077, {0x00,0x00,0x10,0x00,0x0E,0x60,0x04,0xA0,0x08,0xC0,0x08,0x00,0x04,0x00,0x0A,0xC0,0xB2,0x20,0x52,0x60,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3078, {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x14,0x00,0xA2,0x00,0x41,0x00,0x00,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3079, {0x00,0x00,0x00,0x00,0x00,0x40,0x19,0x20,0x14,0x80,0xA2,0x00,0x41,0x00,0x00,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x307A, {0x00,0x00,0x00,0xC0,0x01,0x40,0x19,0x80,0x14,0x00,0xA2,0x00,0x41,0x00,0x00,0xC0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x307B, {0x00,0x00,0x48,0xC0,0x27,0x80,0x20,0xE0,0x4F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x67,0x80,0x28,0xC0,0x27,0x20,0x00,0x00,0x00,0x00,}}, +{ 0x307C, {0x00,0x40,0x93,0xA0,0x4E,0x40,0x43,0x80,0x9F,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0xCF,0x00,0x51,0x80,0x4E,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x307D, {0x00,0xC0,0x93,0xA0,0x4E,0x60,0x43,0xC0,0x9F,0x00,0x81,0x00,0x81,0x00,0x81,0x00,0xCF,0x00,0x51,0x80,0x4E,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x307E, {0x04,0x00,0x02,0x00,0x23,0xC0,0x1E,0x00,0x03,0x80,0x3E,0x00,0x02,0x00,0x02,0x00,0x1E,0x00,0x23,0x80,0x1C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x307F, {0x00,0x00,0x22,0x00,0x1E,0x00,0x04,0x00,0x08,0x80,0x08,0x80,0x3F,0x80,0x50,0xC0,0x91,0x20,0x61,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3080, {0x20,0x00,0x10,0x00,0x7C,0x80,0x10,0x40,0x30,0x60,0x50,0x00,0x51,0x00,0x70,0x80,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x3081, {0x00,0x00,0x02,0x00,0x01,0x00,0x27,0x00,0x29,0x80,0x32,0x40,0x32,0x20,0x4C,0x20,0x44,0x20,0x4C,0x20,0x30,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x3082, {0x04,0x00,0x02,0x00,0x12,0x00,0x0F,0x00,0x04,0x00,0x28,0x80,0x18,0x40,0x0E,0x40,0x08,0x40,0x08,0x40,0x04,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x3083, {0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x13,0x80,0x0C,0x40,0x38,0x40,0x08,0x80,0x04,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x3084, {0x02,0x00,0x01,0x00,0x13,0x00,0x31,0xC0,0x16,0x20,0x58,0x20,0x28,0x20,0x04,0xC0,0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x3085, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x23,0x80,0x2E,0x40,0x32,0x40,0x22,0x40,0x23,0x80,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x3086, {0x00,0x00,0x06,0x00,0x43,0x80,0x25,0x40,0x29,0x20,0x31,0x20,0x31,0x20,0x21,0x20,0x25,0x40,0x03,0x80,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x3087, {0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x02,0x40,0x03,0x80,0x02,0x00,0x02,0x00,0x1E,0x00,0x23,0x80,0x22,0x40,0x1C,0x00,0x00,0x00,}}, +{ 0x3088, {0x08,0x00,0x04,0x00,0x04,0xC0,0x07,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x3E,0x00,0x45,0x80,0x44,0x40,0x38,0x00,0x00,0x00,}}, +{ 0x3089, {0x08,0x00,0x04,0x00,0x07,0x00,0x18,0x00,0x20,0x00,0x20,0x00,0x27,0x00,0x38,0x80,0x20,0x80,0x00,0x80,0x03,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x308A, {0x20,0x00,0x13,0x00,0x14,0x80,0x18,0x40,0x18,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x00,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x308B, {0x00,0x00,0x11,0x80,0x0F,0x00,0x02,0x00,0x04,0x00,0x0F,0x80,0x18,0x40,0x20,0x40,0x06,0x40,0x09,0xC0,0x08,0x80,0x07,0x00,0x00,0x00,}}, +{ 0x308C, {0x00,0x00,0x40,0x00,0x26,0x00,0x29,0x00,0x31,0x00,0xF1,0x00,0x21,0x00,0x61,0x00,0x61,0x00,0xA1,0x20,0x20,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x308D, {0x00,0x00,0x11,0x80,0x0F,0x00,0x02,0x00,0x04,0x00,0x0F,0x80,0x10,0x40,0x20,0x40,0x00,0x40,0x00,0x40,0x01,0x80,0x0E,0x00,0x00,0x00,}}, +{ 0x308E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x1B,0x00,0x34,0x80,0x18,0x80,0x30,0x80,0x30,0x80,0x11,0x00,0x00,0x00,}}, +{ 0x308F, {0x20,0x00,0x10,0x00,0x10,0x00,0x59,0x80,0x3E,0x40,0x18,0x20,0x10,0x20,0x30,0x20,0x30,0x20,0x50,0x40,0x11,0x80,0x10,0x00,0x00,0x00,}}, +{ 0x3090, {0x00,0x00,0x36,0x00,0x1A,0x00,0x04,0x00,0x0F,0x00,0x38,0x80,0x48,0x40,0x50,0x40,0x52,0x40,0x65,0xC0,0x63,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x3091, {0x00,0x00,0x1B,0x00,0x0E,0x00,0x0F,0x00,0x18,0x80,0x10,0x40,0x0C,0x40,0x1B,0x80,0x0E,0x00,0x19,0x80,0x26,0x40,0x40,0x60,0x00,0x00,}}, +{ 0x3092, {0x10,0x00,0x08,0x00,0x3E,0x00,0x08,0x00,0x10,0x80,0x3C,0xC0,0x23,0x00,0x46,0x00,0x0A,0x00,0x10,0x00,0x20,0x00,0x1F,0x00,0x00,0x00,}}, +{ 0x3093, {0x08,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x3C,0x00,0x22,0x00,0x22,0x00,0x42,0x40,0x41,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x3099, {0x00,0x20,0x00,0x90,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x309A, {0x00,0x20,0x00,0x50,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x309B, {0x10,0x00,0x48,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x309C, {0x30,0x00,0x48,0x00,0x48,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x309D, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x309E, {0x00,0x00,0x02,0x00,0x05,0x00,0x12,0x00,0x0C,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30A1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0xC0,0x1C,0x80,0x05,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x30A2, {0x00,0x00,0x00,0x00,0x23,0xC0,0x1C,0x40,0x04,0x80,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30A3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x02,0x00,0x0E,0x00,0x32,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x30A4, {0x00,0x00,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x0A,0x00,0x31,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x30A5, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x03,0x80,0x1C,0x80,0x08,0x80,0x08,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30A6, {0x00,0x00,0x04,0x00,0x02,0x00,0x03,0xC0,0x3C,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30A7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x3C,0x00,0x04,0x00,0x04,0x00,0x07,0x00,0x38,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x30A8, {0x00,0x00,0x00,0x00,0x01,0x80,0x3E,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0F,0x80,0x70,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30A9, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x03,0x80,0x3E,0x00,0x06,0x00,0x0A,0x00,0x12,0x00,0x26,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x30AA, {0x00,0x00,0x02,0x00,0x01,0x00,0x41,0xC0,0x3F,0x00,0x03,0x00,0x05,0x00,0x09,0x00,0x11,0x00,0x21,0x00,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x30AB, {0x00,0x00,0x04,0x00,0x02,0x00,0x03,0xC0,0x3E,0x40,0x04,0x40,0x04,0x40,0x08,0x40,0x08,0x80,0x12,0x80,0x21,0x80,0x01,0x00,0x00,0x00,}}, +{ 0x30AC, {0x00,0x40,0x09,0x20,0x04,0x80,0x07,0x80,0x7C,0x80,0x08,0x80,0x08,0x80,0x10,0x80,0x11,0x00,0x25,0x00,0x43,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x30AD, {0x00,0x00,0x10,0x00,0x09,0x80,0x0E,0x00,0x34,0x00,0x04,0x00,0x05,0xC0,0x0E,0x00,0x72,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x30AE, {0x01,0x40,0x10,0xA0,0x09,0x80,0x0E,0x00,0x34,0x00,0x04,0x00,0x05,0xC0,0x0E,0x00,0x72,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x30AF, {0x00,0x00,0x10,0x00,0x0B,0x80,0x0C,0x80,0x10,0x80,0x11,0x00,0x21,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30B0, {0x01,0x40,0x30,0xA0,0x17,0x00,0x19,0x00,0x11,0x00,0x22,0x00,0x22,0x00,0x44,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30B1, {0x00,0x00,0x18,0x00,0x08,0x00,0x08,0x60,0x1F,0x80,0x12,0x00,0x21,0x00,0x41,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x30B2, {0x00,0x40,0x31,0x20,0x10,0xA0,0x10,0x80,0x3F,0x00,0x24,0x00,0x42,0x00,0x82,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30B3, {0x00,0x00,0x00,0x00,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x07,0x80,0x38,0x80,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30B4, {0x01,0x40,0x00,0xA0,0x86,0x00,0x79,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x0E,0x00,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30B5, {0x00,0x00,0x02,0x00,0x11,0x00,0x11,0x00,0x53,0xC0,0x3D,0x00,0x11,0x00,0x11,0x00,0x12,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x30B6, {0x00,0x40,0x02,0xA0,0x11,0x40,0x11,0x00,0x53,0xC0,0x3D,0x00,0x11,0x00,0x11,0x00,0x12,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x30B7, {0x00,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x60,0x00,0x10,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x4C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30B8, {0x00,0x00,0x00,0x40,0x31,0x20,0x08,0x80,0x60,0x00,0x10,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x4C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30B9, {0x00,0x00,0x00,0x00,0x11,0xC0,0x0E,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30BA, {0x00,0x40,0x01,0x20,0x46,0x80,0x3A,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x00,0xC1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30BB, {0x00,0x00,0x20,0x00,0x10,0x00,0x11,0xC0,0x16,0x40,0x58,0x80,0x31,0x00,0x11,0x00,0x10,0x00,0x08,0x00,0x07,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x30BC, {0x00,0x40,0x21,0x20,0x10,0x80,0x11,0xC0,0x16,0x40,0x58,0x80,0x31,0x00,0x11,0x00,0x10,0x00,0x08,0x00,0x07,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x30BD, {0x00,0x00,0x01,0x00,0x20,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30BE, {0x00,0x40,0x02,0xA0,0x41,0x40,0x21,0x00,0x21,0x00,0x21,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30BF, {0x00,0x00,0x04,0x00,0x03,0xC0,0x06,0x40,0x04,0x40,0x0A,0x40,0x11,0xC0,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x30C0, {0x00,0x40,0x10,0xA0,0x0F,0x40,0x19,0x00,0x11,0x00,0x29,0x00,0x47,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0xC0,0x00,0x00,0x00,}}, +{ 0x30C1, {0x00,0x00,0x01,0x00,0x06,0x00,0x3C,0x00,0x03,0xC0,0x4E,0x00,0x32,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30C2, {0x00,0x40,0x01,0xA0,0x06,0x40,0x3C,0x00,0x03,0xC0,0x4E,0x00,0x32,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30C3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80,0x24,0x40,0x14,0x40,0x10,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30C4, {0x00,0x00,0x00,0x80,0x08,0x40,0x44,0x40,0x24,0x40,0x20,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30C5, {0x00,0x40,0x01,0x20,0x22,0x80,0x91,0x00,0x51,0x00,0x41,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30C6, {0x00,0x00,0x00,0x00,0x27,0x00,0x18,0x00,0x01,0xC0,0x4E,0x00,0x32,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30C7, {0x00,0x40,0x01,0x20,0x26,0x80,0x18,0x00,0x01,0xC0,0x4E,0x00,0x32,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30C8, {0x00,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x1C,0x00,0x13,0x00,0x10,0x80,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30C9, {0x00,0x80,0x22,0x40,0x11,0x00,0x10,0x00,0x10,0x00,0x1C,0x00,0x13,0x00,0x10,0x80,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30CA, {0x00,0x00,0x04,0x00,0x02,0x00,0x03,0xC0,0x7E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30CB, {0x00,0x00,0x00,0x00,0x03,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x78,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30CC, {0x00,0x00,0x00,0x00,0x13,0xC0,0x0C,0x40,0x00,0x80,0x1C,0x80,0x03,0x00,0x01,0x80,0x02,0x40,0x0C,0x40,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30CD, {0x00,0x00,0x08,0x00,0x07,0x80,0x3C,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x0D,0x00,0x34,0x80,0x44,0x40,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30CE, {0x00,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x30CF, {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x80,0x08,0x80,0x10,0x40,0x10,0x40,0x20,0x20,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D0, {0x00,0x00,0x01,0x40,0x00,0xA0,0x02,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D1, {0x00,0x00,0x00,0xE0,0x00,0xA0,0x02,0xE0,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40,0x40,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D2, {0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x23,0x00,0x3C,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x30D3, {0x00,0x00,0x00,0x40,0x21,0x20,0x20,0x80,0x23,0x00,0x3C,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x30D4, {0x00,0x00,0x00,0xE0,0x20,0xA0,0x20,0xE0,0x23,0x00,0x3C,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x30D5, {0x00,0x00,0x00,0x00,0x27,0x80,0x18,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D6, {0x01,0x40,0x00,0xA0,0x4F,0x00,0x31,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D7, {0x00,0xE0,0x00,0xA0,0x4F,0xE0,0x31,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D8, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x14,0x00,0xA2,0x00,0x41,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30D9, {0x00,0x00,0x00,0x80,0x02,0x40,0x09,0x00,0x14,0x00,0xA2,0x00,0x41,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30DA, {0x00,0x00,0x03,0x80,0x02,0x80,0x0B,0x80,0x14,0x00,0xA2,0x00,0x41,0x00,0x00,0xC0,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30DB, {0x00,0x00,0x04,0x00,0x02,0x00,0x03,0xC0,0x3E,0x00,0x02,0x00,0x02,0x80,0x12,0x40,0x12,0x40,0x22,0x00,0x06,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x30DC, {0x01,0x40,0x08,0xA0,0x04,0x00,0x07,0x80,0x7C,0x00,0x04,0x00,0x05,0x00,0x24,0x80,0x24,0x80,0x44,0x00,0x0C,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30DD, {0x00,0xE0,0x08,0xA0,0x04,0xE0,0x07,0xC0,0x7C,0x00,0x04,0x00,0x05,0x00,0x24,0x80,0x24,0x80,0x44,0x00,0x0C,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30DE, {0x00,0x00,0x00,0x00,0x43,0x80,0x3C,0x40,0x00,0x40,0x00,0x80,0x01,0x00,0x32,0x00,0x0C,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30DF, {0x00,0x00,0x08,0x00,0x06,0x00,0x01,0x80,0x10,0x00,0x0C,0x00,0x03,0x00,0x00,0x80,0x18,0x00,0x06,0x00,0x01,0x00,0x00,0x80,0x00,0x00,}}, +{ 0x30E0, {0x00,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x09,0x00,0x10,0x80,0x17,0x40,0x78,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30E1, {0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x40,0x0C,0x40,0x03,0x80,0x00,0x80,0x01,0x40,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x30E2, {0x00,0x00,0x00,0x00,0x27,0x00,0x18,0x00,0x08,0x00,0x4F,0xC0,0x38,0x00,0x08,0x00,0x08,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30E3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x09,0x80,0x0E,0x80,0x39,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x30E4, {0x00,0x00,0x20,0x00,0x11,0xC0,0x0E,0x40,0x58,0x40,0x28,0x80,0x05,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30E5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x19,0x00,0x01,0x00,0x02,0x00,0x07,0x80,0x38,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x30E6, {0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x19,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x07,0x80,0x78,0x40,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30E7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x38,0x80,0x00,0x80,0x07,0x00,0x19,0x00,0x07,0x00,0x38,0x80,0x00,0x00,0x00,0x00,}}, +{ 0x30E8, {0x00,0x00,0x00,0x00,0x03,0xC0,0x3C,0x40,0x00,0x40,0x03,0xC0,0x1C,0x80,0x00,0x80,0x00,0x80,0x03,0x80,0x1C,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x30E9, {0x00,0x00,0x13,0x00,0x0C,0x00,0x00,0xC0,0x27,0x40,0x18,0x40,0x00,0x40,0x00,0x80,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x00,0x00,}}, +{ 0x30EA, {0x00,0x00,0x01,0x00,0x10,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30EB, {0x00,0x00,0x00,0x00,0x04,0x00,0x22,0x00,0x12,0x00,0x12,0x40,0x12,0x40,0x12,0x80,0x22,0x80,0x23,0x00,0x42,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30EC, {0x00,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x40,0x10,0x80,0x11,0x00,0x16,0x00,0x18,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30ED, {0x00,0x00,0x00,0x00,0x43,0xC0,0x3C,0x40,0x20,0x40,0x20,0x40,0x10,0x80,0x10,0x80,0x13,0x80,0x1C,0x40,0x10,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30EE, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x80,0x1C,0x80,0x10,0x80,0x11,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x30EF, {0x00,0x00,0x00,0x00,0x43,0xC0,0x3C,0x40,0x20,0x40,0x10,0x40,0x10,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x30F0, {0x00,0x00,0x04,0x00,0x02,0x00,0x07,0x80,0x7A,0x00,0x22,0x00,0x12,0x00,0x17,0x80,0x7A,0x40,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x30F1, {0x00,0x00,0x00,0x00,0x07,0x00,0x38,0x80,0x09,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30F2, {0x00,0x00,0x00,0x00,0x03,0xC0,0x3C,0x40,0x00,0x40,0x03,0xC0,0x1C,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x0C,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30F3, {0x00,0x00,0x00,0x00,0x60,0x00,0x10,0x40,0x08,0x40,0x00,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x4C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30F4, {0x00,0x40,0x11,0x20,0x08,0x80,0x8F,0x80,0x70,0x80,0x41,0x00,0x21,0x00,0x21,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x00,0x00,}}, +{ 0x30F5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x27,0x80,0x18,0x80,0x08,0x80,0x08,0x80,0x13,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x30F6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x08,0xC0,0x0F,0x00,0x11,0x00,0x22,0x00,0x04,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x30FB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30FC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xE0,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30FD, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x30FE, {0x00,0x00,0x01,0x00,0x02,0x80,0x11,0x00,0x0C,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x4E00, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x4E01, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4E03, {0x10,0x00,0x10,0x00,0x10,0x00,0x10,0xE0,0x1F,0x00,0xF0,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x40,0x10,0x40,0x0F,0xC0,0x00,0x00,}}, +{ 0x4E07, {0x00,0x00,0xFF,0xE0,0x08,0x00,0x08,0x00,0x0F,0x80,0x08,0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x4E08, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x14,0x00,0x08,0x00,0x16,0x00,0x21,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x4E09, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E0A, {0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x0F,0x80,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E0B, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x06,0x00,0x07,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E0D, {0x00,0x00,0xFF,0xE0,0x02,0x00,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x40,0x04,0x20,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E0E, {0x10,0x00,0x10,0x00,0x1F,0x80,0x10,0x00,0x1F,0x00,0x11,0x00,0x01,0x00,0xFF,0xE0,0x01,0x00,0x01,0x00,0x01,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x4E10, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x07,0xC0,0x44,0x00,0x44,0x00,0x7F,0xC0,0x40,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x4E11, {0x00,0x00,0x3F,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x7F,0xC0,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E14, {0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E15, {0x00,0x00,0x7F,0xC0,0x06,0x00,0x0C,0x00,0x17,0x00,0x24,0x80,0x44,0x40,0x84,0x20,0x04,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x4E16, {0x49,0x00,0x49,0x00,0x49,0x00,0xFF,0xE0,0x49,0x00,0x49,0x00,0x49,0x00,0x4F,0x00,0x48,0x00,0x40,0x00,0x7F,0xC0,0x40,0x00,0x00,0x00,}}, +{ 0x4E17, {0x64,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0xFF,0xE0,0x64,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x4E18, {0x01,0x00,0x02,0x00,0x3C,0x00,0x20,0x00,0x3F,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E19, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x4A,0x40,0x49,0x40,0x50,0xC0,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x4E1E, {0x00,0x00,0x3F,0x00,0x02,0x00,0x76,0x40,0x15,0x80,0x25,0x00,0x24,0x80,0x44,0x40,0x84,0x20,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x4E21, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x5F,0x40,0x51,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x4E25, {0x00,0x00,0x00,0x00,0xFF,0xE0,0x0A,0x00,0x4A,0x40,0x2A,0x80,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x00,}}, +{ 0x4E26, {0x20,0x80,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x51,0x40,0x31,0x40,0x31,0x80,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E2A, {0x04,0x00,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x24,0x80,0x44,0x40,0x84,0x20,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E2D, {0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E31, {0x09,0x00,0x09,0x00,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x79,0xE0,0x49,0x20,0x11,0x00,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4E32, {0x04,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E36, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x4E38, {0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0x00,0x09,0x00,0x09,0x00,0x29,0x00,0x19,0x00,0x15,0x00,0x23,0x20,0x41,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x4E39, {0x00,0x00,0x3F,0x80,0x20,0x80,0x24,0x80,0x24,0x80,0x20,0x80,0xFF,0xE0,0x20,0x80,0x20,0x80,0x40,0x80,0x40,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x4E3B, {0x08,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E3C, {0x10,0x80,0x10,0x80,0x7F,0xE0,0x10,0x80,0x14,0x80,0x12,0x80,0x12,0x80,0xFF,0xE0,0x10,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x4E3F, {0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x4E42, {0x00,0x80,0x60,0x80,0x20,0x80,0x21,0x00,0x21,0x00,0x11,0x00,0x12,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x4E43, {0x00,0x00,0x3F,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0xE0,0x08,0xA0,0x08,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0xC0,0x00,0x00,}}, +{ 0x4E45, {0x08,0x00,0x08,0x00,0x0F,0x80,0x10,0x80,0x10,0x80,0x21,0x00,0x41,0x00,0x02,0x00,0x05,0x00,0x18,0x80,0x20,0x40,0xC0,0x20,0x00,0x00,}}, +{ 0x4E4B, {0x04,0x00,0x04,0x00,0x7F,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x64,0x00,0x78,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x4E4D, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x24,0x00,0x24,0x00,0x47,0xC0,0x84,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E4E, {0x01,0x80,0x7F,0x00,0x04,0x80,0x24,0x80,0x25,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4E4F, {0x00,0xC0,0x03,0x00,0x7C,0x00,0x04,0x00,0x3F,0x80,0x00,0x80,0x01,0x00,0x02,0x00,0x3C,0x00,0x30,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x4E55, {0x01,0xC0,0x7E,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x62,0x00,0x7F,0xC0,0x72,0x40,0x52,0x40,0x52,0xC0,0x82,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x4E56, {0x01,0x80,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x24,0x00,0xE5,0x60,0x25,0x80,0x25,0x00,0xE4,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E57, {0x01,0x00,0x3E,0x00,0x7F,0xC0,0x24,0x80,0xFF,0xE0,0x24,0x80,0x7F,0xC0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4E58, {0x01,0x00,0x3E,0x00,0xFF,0xE0,0x15,0x00,0x75,0xC0,0x15,0x00,0x35,0x40,0xD4,0xC0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x4E59, {0x00,0x00,0x7F,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x4E5D, {0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x41,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x4E5E, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x20,0x00,0x20,0x00,0x5F,0x80,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x4E5F, {0x04,0x00,0x24,0x00,0x24,0x80,0x27,0x80,0x3C,0x80,0xE4,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x4E62, {0x62,0x00,0x62,0x00,0x62,0x00,0xF2,0x00,0xF2,0x00,0xF2,0x00,0xF2,0x00,0xF2,0x00,0xF2,0x00,0xF2,0x20,0x82,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x4E71, {0x09,0x00,0x11,0x00,0x61,0x00,0x21,0x00,0xFD,0x00,0x21,0x00,0x21,0x00,0x79,0x00,0x49,0x00,0x49,0x20,0x79,0x20,0x49,0xE0,0x00,0x00,}}, +{ 0x4E73, {0x0D,0x00,0xF1,0x00,0x05,0x00,0xA9,0x00,0x51,0x00,0x7D,0x00,0x09,0x00,0x11,0x00,0x1D,0x00,0xF1,0x20,0x11,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x4E7E, {0x22,0x00,0x22,0x00,0xFB,0xE0,0x7C,0x00,0x4B,0xC0,0x78,0x80,0x49,0x00,0x79,0x00,0x22,0x00,0xFE,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x4E80, {0x08,0x00,0x0F,0x00,0xF6,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x7F,0x80,0x44,0x80,0x7F,0x80,0x7F,0xA0,0x44,0xA0,0x03,0xE0,0x00,0x00,}}, +{ 0x4E82, {0x1D,0x00,0xE9,0x00,0x7D,0x00,0xF9,0x00,0x31,0x00,0xFD,0x00,0xF5,0x00,0xF5,0x00,0xF5,0x00,0xB5,0x20,0xB5,0x20,0xCD,0xE0,0x00,0x00,}}, +{ 0x4E85, {0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4E86, {0x00,0x00,0x3F,0xC0,0x00,0x80,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x4E88, {0x00,0x00,0x3F,0x80,0x09,0x00,0x06,0x00,0xFF,0xE0,0x04,0x40,0x04,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4E89, {0x04,0x00,0x0F,0x00,0x72,0x00,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x04,0x80,0x04,0x80,0x3F,0x80,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4E8A, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x24,0x80,0x24,0x80,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4E8B, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x3F,0x80,0x04,0x00,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x3F,0x80,0x04,0x80,0x0C,0x00,0x00,0x00,}}, +{ 0x4E8C, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x4E8E, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x18,0x00,0x00,0x00,}}, +{ 0x4E91, {0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x09,0x00,0x08,0x80,0x11,0x80,0x7E,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x4E92, {0x00,0x00,0x7F,0xC0,0x08,0x00,0x0F,0x80,0x08,0x80,0x10,0x80,0x11,0x00,0x3F,0x00,0x01,0x00,0x02,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E94, {0x00,0x00,0x7F,0xC0,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E95, {0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x4E98, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x4E99, {0x00,0x00,0x7F,0xC0,0x08,0x00,0x1F,0x80,0x14,0x80,0x12,0x80,0x12,0x80,0x28,0x80,0x25,0x00,0x01,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E9B, {0x12,0x00,0x12,0x00,0x5F,0xC0,0x52,0x00,0x52,0x20,0x7A,0x20,0xC1,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E9C, {0x00,0x00,0x7F,0xE0,0x09,0x00,0x3F,0xC0,0x29,0x40,0x29,0x40,0x29,0x40,0x3F,0xC0,0x29,0x40,0x09,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E9E, {0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x71,0xC0,0x40,0x40,0x40,0x40,0x71,0xC0,0x11,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4E9F, {0x00,0x00,0xFF,0xE0,0x08,0x00,0x1F,0xC0,0x73,0x40,0x53,0x40,0x52,0x80,0x52,0xC0,0x73,0x60,0x0E,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4EA0, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x4EA1, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x4EA2, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x1F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x20,0x21,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x4EA4, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x31,0x40,0x51,0x40,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x4EA5, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x29,0x00,0x12,0x80,0x0D,0x00,0x0A,0x00,0x37,0x00,0x08,0x80,0x30,0x40,0xC0,0x40,0x00,0x00,}}, +{ 0x4EA6, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x80,0x51,0x40,0x91,0x20,0x91,0x20,0x21,0x00,0x21,0x00,0x43,0x00,0x00,0x00,}}, +{ 0x4EA8, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x3F,0x80,0x01,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4EAB, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x3F,0x00,0x02,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4EAC, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x4EAD, {0x04,0x00,0xFF,0xE0,0x1F,0x00,0x11,0x00,0x1F,0x00,0x00,0x00,0x7F,0xE0,0x40,0x40,0xBF,0x80,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x4EAE, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x7F,0xE0,0x40,0x40,0x92,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x4EB0, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x4EB3, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x7F,0xE0,0x43,0x40,0x9C,0x00,0x7F,0xC0,0x04,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x4EB6, {0x04,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4EBA, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20,0x00,0x00,}}, +{ 0x4EC0, {0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x3F,0xE0,0x61,0x00,0xA1,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4EC1, {0x20,0x00,0x20,0x00,0x2F,0xC0,0x40,0x00,0x40,0x00,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x5F,0xE0,0x40,0x00,0x40,0x00,0x00,0x00,}}, +{ 0x4EC2, {0x11,0x00,0x11,0x00,0x11,0x00,0x2F,0xE0,0x21,0x20,0x61,0x20,0x21,0x20,0x21,0x20,0x22,0x20,0x24,0x20,0x28,0x20,0x20,0x40,0x00,0x00,}}, +{ 0x4EC4, {0x00,0x00,0x3F,0xE0,0x20,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x25,0x00,0x25,0x00,0x48,0x80,0x48,0x80,0x90,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x4EC6, {0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x80,0x61,0x40,0xA1,0x20,0x21,0x20,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4EC7, {0x24,0x00,0x24,0x00,0x24,0x00,0x67,0x00,0x7D,0x00,0xA5,0x00,0x25,0x00,0x25,0x00,0x25,0x00,0x29,0x20,0x30,0xA0,0x20,0x60,0x00,0x00,}}, +{ 0x4ECA, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xDF,0x60,0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4ECB, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xD1,0x60,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x4ECD, {0x10,0x00,0x1F,0x80,0x12,0x80,0x22,0x80,0x22,0x80,0x62,0xE0,0x22,0x20,0x22,0x20,0x22,0x20,0x24,0x20,0x28,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x4ECE, {0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x31,0x00,0x2A,0x80,0x46,0x40,0x44,0x40,0x88,0x20,0x00,0x00,}}, +{ 0x4ECF, {0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x00,0x42,0x00,0x42,0x00,0xC4,0x00,0x44,0x80,0x44,0x40,0x49,0xC0,0x7E,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x4ED4, {0x20,0x00,0x2F,0xC0,0x20,0x80,0x61,0x00,0x61,0x00,0xA1,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x4ED5, {0x21,0x00,0x21,0x00,0x21,0x00,0x61,0x00,0x7F,0xE0,0xA1,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x2F,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x4ED6, {0x21,0x00,0x21,0x00,0x29,0x00,0x69,0xC0,0x6F,0x40,0xB9,0x40,0x29,0x40,0x29,0x40,0x29,0x40,0x28,0x20,0x28,0x20,0x27,0xE0,0x00,0x00,}}, +{ 0x4ED7, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x41,0x00,0x49,0x00,0xC9,0x00,0x45,0x00,0x46,0x00,0x42,0x00,0x45,0x00,0x48,0x80,0x50,0x60,0x00,0x00,}}, +{ 0x4ED8, {0x10,0x80,0x10,0x80,0x10,0x80,0x2F,0xE0,0x20,0x80,0x64,0x80,0xA2,0x80,0x22,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x4ED9, {0x10,0x80,0x10,0x80,0x10,0x80,0x34,0xA0,0x34,0xA0,0x54,0xA0,0x14,0xA0,0x14,0xA0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x14,0x20,0x00,0x00,}}, +{ 0x4EDD, {0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x1F,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4EDE, {0x10,0x00,0x1F,0xE0,0x11,0x20,0x21,0x20,0x21,0x20,0x65,0x20,0x25,0x20,0x29,0x20,0x22,0x20,0x22,0x20,0x24,0x20,0x28,0x40,0x00,0x00,}}, +{ 0x4EDF, {0x20,0x40,0x21,0x80,0x2F,0x00,0x61,0x00,0x61,0x00,0xFF,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x4EE3, {0x12,0x80,0x12,0x40,0x12,0x40,0x23,0xE0,0x3F,0x00,0x61,0x00,0xA1,0x00,0x21,0x80,0x20,0x80,0x20,0xA0,0x20,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x4EE4, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x04,0x80,0x04,0x80,0x07,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4EE5, {0x20,0x40,0x20,0x40,0x24,0x40,0x23,0x40,0x21,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x2C,0xE0,0x30,0xA0,0xC3,0x10,0x0C,0x10,0x00,0x00,}}, +{ 0x4EED, {0x20,0x00,0x3F,0xC0,0x22,0x40,0x62,0x40,0x72,0x40,0xEA,0x40,0x66,0x40,0x62,0x40,0x65,0xE0,0x68,0x60,0x70,0x40,0x60,0x80,0x00,0x00,}}, +{ 0x4EEE, {0x20,0x00,0x2F,0xE0,0x28,0x00,0x6F,0xC0,0x6A,0x40,0xAA,0x40,0x29,0x40,0x29,0x80,0x29,0x80,0x31,0x80,0x36,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x4EF0, {0x10,0x80,0x11,0x00,0x16,0xE0,0x34,0xA0,0x34,0xA0,0x54,0xA0,0x14,0xA0,0x15,0xA0,0x16,0xA0,0x1C,0xC0,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x4EF2, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x69,0x20,0x69,0x20,0xA9,0x20,0x29,0x20,0x2F,0xE0,0x29,0x20,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4EF6, {0x21,0x00,0x25,0x00,0x25,0x00,0x6F,0xC0,0x71,0x00,0xA1,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4EF7, {0x22,0x00,0x22,0x00,0x27,0x00,0x65,0x00,0x68,0x80,0xF4,0xC0,0x65,0xA0,0x65,0x80,0x65,0x80,0x69,0x80,0x71,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x4EFB, {0x20,0xC0,0x2F,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0xDF,0xE0,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x4F,0xC0,0x40,0x00,0x00,0x00,}}, +{ 0x4F01, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC4,0x60,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x24,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4F09, {0x21,0x00,0x33,0x00,0x3F,0xE0,0x60,0x00,0x67,0x00,0xE5,0x80,0x65,0x80,0x65,0x80,0x65,0x80,0x69,0xA0,0x71,0xA0,0x60,0xE0,0x00,0x00,}}, +{ 0x4F0A, {0x20,0x00,0x2F,0xC0,0x21,0x40,0x6F,0xE0,0x61,0x40,0xA1,0x40,0x2F,0xC0,0x21,0x40,0x22,0x00,0x22,0x00,0x24,0x00,0x28,0x00,0x00,0x00,}}, +{ 0x4F0D, {0x20,0x00,0x3F,0xC0,0x22,0x00,0x62,0x00,0x62,0x00,0xBF,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x4F0E, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x61,0x00,0x61,0x00,0xAF,0xC0,0x24,0x40,0x24,0x80,0x22,0x80,0x23,0x00,0x24,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x4F0F, {0x21,0x00,0x21,0x80,0x21,0x40,0x41,0x00,0x5F,0xE0,0xC1,0x00,0x41,0x00,0x43,0x00,0x42,0x80,0x44,0x80,0x58,0x40,0x60,0x20,0x00,0x00,}}, +{ 0x4F10, {0x11,0x80,0x11,0x40,0x11,0x40,0x21,0xE0,0x3F,0x40,0x61,0x40,0xA1,0x80,0x21,0x80,0x21,0x00,0x22,0xA0,0x2C,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x4F11, {0x21,0x00,0x21,0x00,0x21,0x00,0x7F,0xE0,0x63,0x00,0xA3,0x00,0x23,0x80,0x25,0x80,0x25,0x40,0x39,0x20,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4F1A, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xDF,0x60,0x00,0x00,0x00,0x00,0x7F,0xC0,0x09,0x00,0x13,0x80,0x7C,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x4F1C, {0x22,0x00,0x32,0x00,0x3F,0x80,0x65,0xA0,0x65,0xA0,0xE8,0xE0,0x71,0x00,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x4F1D, {0x20,0x00,0x2F,0xC0,0x20,0x00,0x40,0x00,0x5F,0xE0,0xC2,0x00,0x42,0x00,0x42,0x80,0x44,0x40,0x48,0xC0,0x5F,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x4F2F, {0x10,0x80,0x10,0x80,0x11,0x00,0x27,0xE0,0x24,0x20,0x64,0x20,0x24,0x20,0x27,0xE0,0x24,0x20,0x24,0x20,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x4F30, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x6F,0xE0,0x61,0x00,0xE1,0x00,0x6F,0xC0,0x68,0x40,0x68,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x4F34, {0x21,0x00,0x29,0x40,0x25,0x40,0x61,0x00,0x6F,0xC0,0xA1,0x00,0x21,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4F36, {0x11,0x00,0x11,0x00,0x12,0x80,0x24,0x80,0x2F,0xC0,0x70,0x20,0xAF,0xC0,0x21,0x40,0x21,0x40,0x21,0xC0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4F38, {0x08,0x80,0x08,0x80,0x17,0xE0,0x14,0xA0,0x37,0xE0,0x54,0xA0,0x14,0xA0,0x17,0xE0,0x14,0xA0,0x10,0x80,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x4F3A, {0x10,0x00,0x1F,0xE0,0x10,0x20,0x37,0xA0,0x30,0x20,0x57,0xA0,0x14,0xA0,0x14,0xA0,0x17,0xA0,0x10,0x20,0x10,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x4F3C, {0x20,0x80,0x28,0x80,0x28,0x80,0x6A,0x80,0x69,0x80,0xA8,0x80,0x28,0x80,0x28,0x80,0x28,0x80,0x2D,0x40,0x31,0x20,0x22,0x20,0x00,0x00,}}, +{ 0x4F3D, {0x14,0x00,0x14,0x00,0x1F,0xE0,0x35,0xA0,0x35,0xA0,0x55,0xA0,0x15,0xA0,0x15,0xA0,0x15,0xA0,0x19,0xE0,0x1B,0xA0,0x10,0x00,0x00,0x00,}}, +{ 0x4F43, {0x10,0x00,0x17,0xE0,0x14,0xA0,0x34,0xA0,0x34,0xA0,0x57,0xE0,0x14,0xA0,0x14,0xA0,0x14,0xA0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x4F46, {0x20,0x00,0x2F,0x80,0x28,0x80,0x68,0x80,0x6F,0x80,0xA8,0x80,0x28,0x80,0x28,0x80,0x2F,0x80,0x20,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x4F47, {0x21,0x00,0x23,0x00,0x2F,0xE0,0x68,0x60,0x70,0x00,0xFF,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x4F4D, {0x22,0x00,0x22,0x00,0x22,0x00,0x7F,0xE0,0x60,0x40,0xA8,0x40,0x24,0x80,0x24,0x80,0x24,0x80,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x4F4E, {0x20,0xC0,0x2F,0x00,0x29,0x00,0x69,0x00,0x6F,0xE0,0xA9,0x00,0x29,0x00,0x28,0x80,0x2E,0x80,0x30,0x60,0x2F,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x4F4F, {0x22,0x00,0x21,0x00,0x3F,0xE0,0x61,0x00,0x61,0x00,0xA1,0x00,0x2F,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x4F50, {0x22,0x00,0x22,0x00,0x3F,0xE0,0x62,0x00,0x62,0x00,0xA2,0x00,0x27,0xC0,0x25,0x00,0x29,0x00,0x31,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x4F51, {0x22,0x00,0x22,0x00,0x3F,0xE0,0x44,0x00,0x44,0x00,0xC8,0x00,0x4F,0xC0,0x54,0x40,0x64,0x40,0x44,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x4F53, {0x21,0x00,0x21,0x00,0x21,0x00,0x7F,0xE0,0x63,0x00,0xA3,0x80,0x25,0x80,0x25,0x40,0x29,0x20,0x27,0x80,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x4F55, {0x20,0x00,0x3F,0xE0,0x20,0x40,0x6F,0x40,0x69,0x40,0xA9,0x40,0x29,0x40,0x2F,0x40,0x28,0x40,0x20,0x40,0x20,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x4F57, {0x21,0x00,0x23,0x00,0x2F,0xE0,0x6A,0x60,0x72,0x00,0xE2,0x40,0x62,0x80,0x63,0x00,0x62,0x00,0x62,0x20,0x62,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x4F59, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x1F,0x00,0x04,0x00,0x7F,0xC0,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x4F5A, {0x21,0x00,0x29,0x00,0x29,0x00,0x6F,0xC0,0x73,0x00,0xE1,0x00,0x7F,0xE0,0x63,0x00,0x67,0x80,0x68,0x80,0x70,0x40,0x60,0x20,0x00,0x00,}}, +{ 0x4F5B, {0x23,0x80,0x33,0x80,0x3F,0xC0,0x63,0xC0,0x7F,0xC0,0xF3,0x80,0x73,0x80,0x7F,0xE0,0x77,0xA0,0x65,0xA0,0x69,0xC0,0x71,0x80,0x00,0x00,}}, +{ 0x4F5C, {0x24,0x00,0x24,0x00,0x27,0xE0,0x6A,0x00,0x72,0x00,0xA3,0xC0,0x22,0x00,0x22,0x00,0x23,0xC0,0x22,0x00,0x22,0x00,0x22,0x00,0x00,0x00,}}, +{ 0x4F5D, {0x12,0x00,0x12,0x00,0x13,0xE0,0x37,0xE0,0x38,0x20,0x77,0xA0,0x34,0xA0,0x34,0xA0,0x37,0xA0,0x37,0x20,0x30,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x4F5E, {0x20,0x00,0x2F,0xC0,0x20,0x00,0x7F,0xE0,0x62,0x00,0xE2,0x00,0x7F,0xE0,0x64,0x80,0x67,0x80,0x67,0x80,0x63,0x40,0x7C,0x20,0x00,0x00,}}, +{ 0x4F69, {0x20,0x00,0x3F,0x80,0x30,0x80,0x7F,0x80,0x72,0x80,0xFF,0x80,0x7B,0x80,0x7B,0x80,0x7B,0x80,0x7B,0xE0,0x62,0x60,0x62,0x20,0x00,0x00,}}, +{ 0x4F6F, {0x28,0x80,0x24,0x80,0x3F,0xE0,0x6F,0xE0,0x61,0x00,0xEF,0xC0,0x61,0x00,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x4F70, {0x20,0x00,0x3F,0xE0,0x22,0x00,0x6F,0xC0,0x68,0x40,0xE8,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x4F73, {0x21,0x00,0x21,0x00,0x27,0xC0,0x61,0x00,0x6F,0xE0,0xA1,0x00,0x21,0x00,0x2F,0xC0,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x4F75, {0x28,0x80,0x24,0x80,0x3F,0xC0,0x44,0x80,0x44,0x80,0xC4,0x80,0x7F,0xE0,0x44,0x80,0x44,0x80,0x48,0x80,0x50,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x4F76, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x7F,0xE0,0x61,0x00,0xEF,0xC0,0x60,0x00,0x6F,0xC0,0x68,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x4F7B, {0x23,0x80,0x23,0x80,0x33,0xC0,0x6B,0xC0,0x6B,0x80,0xE3,0x80,0x67,0xC0,0x6B,0xA0,0x77,0xA0,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x4F7C, {0x22,0x00,0x22,0x00,0x3F,0xE0,0x44,0x80,0x48,0x80,0xD5,0x40,0x45,0x00,0x42,0x00,0x42,0x00,0x45,0x00,0x58,0x80,0x40,0x60,0x00,0x00,}}, +{ 0x4F7F, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x6F,0xC0,0x69,0x40,0xA9,0x40,0x2F,0xC0,0x29,0x40,0x26,0x00,0x22,0x00,0x2D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x4F83, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x48,0x40,0x4F,0xC0,0xC0,0x00,0x4A,0x80,0x4A,0x80,0x4A,0x80,0x4A,0xA0,0x52,0xA0,0x60,0x60,0x00,0x00,}}, +{ 0x4F86, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x25,0x80,0x35,0x80,0x2D,0x40,0x4E,0x40,0x0E,0x00,0x35,0x80,0xE4,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x4F88, {0x22,0x00,0x23,0xC0,0x24,0x40,0x7B,0x80,0x61,0x00,0xE7,0x00,0x79,0xE0,0x62,0x20,0x6D,0xC0,0x61,0x80,0x63,0x00,0x7C,0x00,0x00,0x00,}}, +{ 0x4F8B, {0x10,0x20,0x1F,0xA0,0x14,0xA0,0x27,0xA0,0x29,0xA0,0x69,0xA0,0x35,0xA0,0x22,0xA0,0x22,0xA0,0x24,0x20,0x28,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x4F8D, {0x21,0x00,0x21,0x00,0x2F,0xC0,0x61,0x00,0x7F,0xE0,0xA0,0x80,0x20,0x80,0x3F,0xE0,0x28,0x80,0x24,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x4F8F, {0x21,0x00,0x25,0x00,0x27,0xC0,0x6F,0xC0,0x71,0x00,0xFF,0xE0,0x63,0x80,0x63,0x80,0x65,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x4F91, {0x22,0x00,0x32,0x00,0x3F,0xE0,0x64,0x00,0x67,0xC0,0xEC,0x40,0x77,0xC0,0x64,0x40,0x67,0xC0,0x64,0x40,0x64,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x4F96, {0x04,0x00,0x04,0x00,0x0A,0x00,0x3F,0x80,0xC0,0x60,0x7F,0x80,0x6A,0x80,0x6A,0x80,0x7F,0x80,0x6A,0x80,0x6A,0x80,0x6A,0x80,0x00,0x00,}}, +{ 0x4F98, {0x21,0x00,0x23,0x00,0x2F,0xE0,0x68,0x60,0x71,0x80,0xEF,0x00,0x61,0x00,0x63,0xE0,0x7F,0x00,0x61,0x20,0x61,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x4F9B, {0x24,0x80,0x24,0x80,0x24,0x80,0x7F,0xC0,0x64,0x80,0xA4,0x80,0x24,0x80,0x3F,0xE0,0x20,0x00,0x24,0x80,0x28,0x40,0x30,0x40,0x00,0x00,}}, +{ 0x4F9D, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x63,0x00,0x63,0x40,0xA5,0x40,0x2D,0x80,0x35,0x00,0x24,0x80,0x24,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x4FA0, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x69,0x40,0x65,0x40,0xA5,0x80,0x3F,0xE0,0x23,0x00,0x23,0x80,0x24,0x80,0x28,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x4FA1, {0x20,0x00,0x3F,0xE0,0x22,0x80,0x62,0x80,0x6F,0xC0,0xAA,0xC0,0x2A,0xC0,0x2A,0xC0,0x2A,0xC0,0x2A,0xC0,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x4FAB, {0x21,0x00,0x33,0x00,0x3F,0xE0,0x68,0x00,0x67,0xC0,0xE2,0x00,0x7F,0xE0,0x64,0x80,0x67,0x80,0x67,0x80,0x63,0x40,0x7C,0x20,0x00,0x00,}}, +{ 0x4FAD, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x4F,0xC0,0x48,0xC0,0xC8,0x80,0x4A,0x80,0x51,0x40,0x50,0x20,0x46,0x00,0x41,0x00,0x40,0x80,0x00,0x00,}}, +{ 0x4FAE, {0x24,0x00,0x24,0x00,0x27,0xE0,0x4F,0x80,0x55,0x80,0xC5,0x80,0x5F,0xE0,0x4A,0x80,0x4A,0x80,0x5F,0xE0,0x40,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x4FAF, {0x27,0x80,0x20,0x80,0x3F,0xE0,0x64,0x00,0x64,0x00,0xA7,0xC0,0x29,0x00,0x31,0x00,0x3F,0xE0,0x22,0x80,0x2C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x4FB5, {0x10,0x00,0x17,0xC0,0x10,0x40,0x23,0xC0,0x27,0xC0,0x60,0x00,0xAF,0xF0,0x28,0x20,0x27,0xC0,0x21,0x80,0x22,0xC0,0x2C,0x30,0x00,0x00,}}, +{ 0x4FB6, {0x10,0x00,0x17,0xC0,0x14,0x40,0x24,0x40,0x27,0xC0,0x61,0x00,0x22,0x00,0x2F,0xE0,0x28,0x20,0x28,0x20,0x2F,0xE0,0x28,0x20,0x00,0x00,}}, +{ 0x4FBF, {0x20,0x00,0x3F,0xE0,0x21,0x00,0x4F,0xC0,0x4F,0xC0,0xC9,0x40,0x4F,0xC0,0x49,0x40,0x46,0x00,0x42,0x00,0x45,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x4FC2, {0x20,0xC0,0x27,0x00,0x3A,0x00,0x64,0x80,0x63,0x40,0xA2,0xC0,0x27,0x20,0x3D,0x00,0x21,0x40,0x29,0x20,0x31,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x4FC3, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x6F,0xC0,0x69,0x40,0xA1,0x00,0x29,0x00,0x29,0xC0,0x29,0x00,0x2D,0x00,0x33,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x4FC4, {0x11,0x00,0x17,0x40,0x3D,0x20,0x65,0x00,0x7F,0xE0,0xA5,0x00,0x27,0x40,0x2C,0xC0,0x34,0x80,0x24,0xA0,0x2D,0x60,0x24,0x20,0x00,0x00,}}, +{ 0x4FCA, {0x22,0x00,0x24,0xC0,0x3F,0xE0,0x6F,0x80,0x65,0xA0,0xAA,0xE0,0x33,0x80,0x24,0x80,0x2B,0x00,0x23,0x00,0x2D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x4FCE, {0x60,0x00,0x67,0x80,0x64,0x80,0x74,0x80,0x57,0x80,0xC4,0x80,0x64,0x80,0x77,0x80,0x54,0x80,0x44,0x80,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x4FD0, {0x10,0xA0,0x1B,0xE0,0x1E,0xE0,0x32,0xE0,0x3F,0xE0,0x72,0xE0,0x36,0xE0,0x37,0xE0,0x3A,0xE0,0x3A,0xA0,0x32,0x20,0x32,0x60,0x00,0x00,}}, +{ 0x4FD1, {0x10,0x00,0x17,0xE0,0x11,0xC0,0x37,0xE0,0x35,0xA0,0x74,0xA0,0x37,0xE0,0x34,0xA0,0x37,0xE0,0x37,0xE0,0x34,0xA0,0x34,0xE0,0x00,0x00,}}, +{ 0x4FD4, {0x20,0x00,0x2F,0xC0,0x2F,0xC0,0x6F,0xC0,0x6F,0xC0,0xE8,0x40,0x6F,0xC0,0x6B,0xC0,0x67,0x80,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x4FD7, {0x24,0x80,0x24,0x80,0x38,0x40,0x62,0x00,0x67,0x00,0xA5,0x00,0x28,0x80,0x3F,0xC0,0x28,0xA0,0x28,0x80,0x2F,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x4FD8, {0x20,0x40,0x21,0x80,0x2F,0x40,0x69,0x20,0x70,0x20,0xEF,0xC0,0x61,0x80,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x4FDA, {0x20,0x00,0x2F,0xC0,0x29,0x40,0x6F,0xC0,0x6B,0x40,0xE9,0x40,0x6F,0xC0,0x63,0x00,0x6F,0xC0,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x4FDB, {0x22,0x00,0x23,0x80,0x25,0x00,0x7F,0xC0,0x6B,0x40,0xE9,0x40,0x6F,0xC0,0x6B,0xC0,0x63,0x80,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x4FDD, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x4F,0xC0,0x49,0x40,0xC1,0x00,0x5F,0xE0,0x43,0x80,0x45,0x40,0x59,0x20,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x4FDF, {0x22,0x00,0x22,0x80,0x26,0xC0,0x7F,0xC0,0x64,0x00,0xE7,0xC0,0x69,0x00,0x73,0x00,0x7F,0xE0,0x63,0x00,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x4FE1, {0x27,0x80,0x20,0x00,0x3F,0xE0,0x60,0x00,0x6F,0xC0,0xA0,0x00,0x2F,0xC0,0x20,0x00,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x4FE3, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x4F,0xC0,0x40,0x00,0xCF,0xC0,0x41,0x00,0x5F,0xE0,0x41,0x00,0x42,0x80,0x4C,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x4FE4, {0x24,0x80,0x22,0x80,0x27,0xC0,0x67,0xC0,0x6F,0xC0,0xE9,0x00,0x6F,0xE0,0x6B,0x20,0x67,0x20,0x69,0x60,0x71,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x4FE5, {0x21,0x00,0x33,0x00,0x3F,0xE0,0x6F,0xC0,0x6B,0x40,0xEF,0xC0,0x69,0x40,0x6F,0xC0,0x6F,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x4FEE, {0x22,0x00,0x22,0x00,0x37,0xE0,0x7E,0x80,0x73,0x80,0xBC,0xE0,0x31,0x00,0x36,0x80,0x31,0x00,0x36,0x40,0x21,0x80,0x2E,0x00,0x00,0x00,}}, +{ 0x4FEF, {0x21,0x00,0x33,0x00,0x3F,0xE0,0x72,0x40,0x72,0x40,0xF7,0xE0,0x75,0x40,0x7D,0xC0,0x74,0x40,0x74,0x40,0x64,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x4FF3, {0x22,0x80,0x22,0x80,0x3E,0xE0,0x42,0x80,0x42,0x80,0xDE,0xE0,0x42,0x80,0x42,0x80,0x5E,0xE0,0x44,0x80,0x48,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x4FF5, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x4F,0xC0,0x43,0x00,0xFF,0xE0,0x43,0x00,0x45,0x40,0x5C,0x80,0x45,0x80,0x46,0x40,0x58,0x20,0x00,0x00,}}, +{ 0x4FF6, {0x28,0x00,0x28,0x00,0x2F,0xC0,0x6E,0x40,0x69,0x40,0xFF,0x40,0x69,0xC0,0x6C,0x80,0x7A,0x80,0x79,0xC0,0x69,0x40,0x7A,0x20,0x00,0x00,}}, +{ 0x4FF8, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x47,0xC0,0x43,0x00,0xDF,0xE0,0x45,0x80,0x4F,0xC0,0x51,0x20,0x47,0xC0,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x4FFA, {0x22,0x00,0x22,0x00,0x3F,0xC0,0x6F,0x00,0x72,0xC0,0xAF,0xA0,0x2A,0x80,0x2F,0x80,0x2F,0x80,0x2A,0xA0,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x4FFE, {0x21,0x00,0x22,0x00,0x2F,0xC0,0x6F,0xC0,0x6B,0x40,0xEF,0xC0,0x61,0x00,0x63,0x80,0x6F,0xE0,0x6F,0xE0,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x5005, {0x21,0x00,0x33,0x00,0x3F,0xE0,0x64,0x80,0x64,0x80,0xEB,0x40,0x71,0x40,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x5006, {0x20,0x00,0x3F,0xE0,0x21,0x00,0x7F,0xE0,0x73,0x20,0xFD,0xA0,0x75,0xA0,0x77,0xE0,0x7B,0x60,0x73,0x20,0x71,0x20,0x71,0x60,0x00,0x00,}}, +{ 0x5009, {0x04,0x00,0x0A,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x20,0x00,0x3F,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x500B, {0x10,0x00,0x1F,0xE0,0x19,0x20,0x2F,0xE0,0x29,0x20,0x6B,0xA0,0x2A,0xA0,0x2A,0xA0,0x2B,0xA0,0x28,0x20,0x2F,0xE0,0x28,0x20,0x00,0x00,}}, +{ 0x500D, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x44,0x80,0x44,0x80,0xDF,0xE0,0x40,0x00,0x4F,0xC0,0x48,0x40,0x48,0x40,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x500F, {0x22,0x00,0x22,0x00,0x37,0xC0,0x7F,0x80,0x73,0x80,0xFC,0xE0,0x71,0x80,0x73,0x40,0x7F,0xE0,0x73,0x00,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x5011, {0x20,0x00,0x3F,0xE0,0x3F,0xE0,0x7F,0xE0,0x7F,0xE0,0xF0,0x20,0x70,0x20,0x70,0x20,0x70,0x20,0x70,0x20,0x70,0x20,0x70,0x60,0x00,0x00,}}, +{ 0x5012, {0x20,0x20,0x3F,0xA0,0x24,0xA0,0x4A,0xA0,0x5F,0xA0,0xC4,0xA0,0x44,0xA0,0x5F,0xA0,0x44,0xA0,0x47,0x20,0x58,0x20,0x40,0x60,0x00,0x00,}}, +{ 0x5014, {0x20,0x00,0x2F,0xE0,0x2F,0xE0,0x6F,0xE0,0x6B,0xC0,0xEB,0xC0,0x6B,0xC0,0x6B,0xC0,0x6D,0xA0,0x75,0xA0,0x77,0xE0,0x64,0x20,0x00,0x00,}}, +{ 0x5016, {0x21,0x00,0x21,0x00,0x2F,0xC0,0x61,0x00,0x7F,0xE0,0xA4,0x80,0x24,0x80,0x3F,0xE0,0x21,0x00,0x2F,0xC0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5019, {0x27,0x80,0x20,0x80,0x3F,0xE0,0x62,0x00,0xB3,0xC0,0x35,0x00,0x39,0x00,0x3F,0xE0,0x31,0x00,0x32,0x80,0x24,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x501A, {0x21,0x00,0x33,0x00,0x3F,0xE0,0x64,0x80,0x68,0x80,0xFF,0xE0,0x60,0x40,0x6F,0x40,0x69,0x40,0x6F,0x40,0x68,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x501F, {0x25,0x00,0x25,0x00,0x3F,0xC0,0x65,0x00,0x65,0x00,0xBF,0xE0,0x20,0x00,0x2F,0x80,0x28,0x80,0x2F,0x80,0x2F,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x5021, {0x10,0x00,0x17,0xC0,0x17,0xC0,0x37,0xC0,0x37,0xC0,0x74,0x40,0x30,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x38,0x20,0x00,0x00,}}, +{ 0x5023, {0x29,0x00,0x29,0x00,0x29,0x00,0x7F,0xE0,0x49,0x40,0xCF,0x40,0x4B,0x40,0x4A,0xC0,0x4A,0x80,0x52,0x80,0x53,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x5024, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x47,0x80,0x54,0x80,0xD7,0x80,0x54,0x80,0x57,0x80,0x54,0x80,0x57,0x80,0x5F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x5025, {0x21,0x00,0x23,0x00,0x2F,0xE0,0x6B,0xE0,0x73,0xA0,0xE4,0xE0,0x68,0x00,0x6F,0xC0,0x61,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5026, {0x21,0x00,0x29,0x40,0x27,0xC0,0x45,0x40,0x5F,0xE0,0xC2,0x80,0x47,0x80,0x48,0xC0,0x57,0xA0,0x44,0x40,0x44,0x40,0x43,0xC0,0x00,0x00,}}, +{ 0x5028, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x6F,0xC0,0x6B,0x40,0xE9,0x00,0x6F,0xE0,0x6B,0x00,0x77,0xC0,0x74,0x40,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x5029, {0x21,0x00,0x2F,0xC0,0x27,0xC0,0x67,0xC0,0x7F,0xE0,0xE0,0x00,0x6F,0xC0,0x69,0x40,0x6F,0xC0,0x6F,0xC0,0x68,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x502A, {0x22,0x00,0x2C,0xC0,0x28,0x40,0x6E,0xC0,0x68,0x40,0xE8,0x40,0x6F,0xC0,0x6B,0xC0,0x67,0x80,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x502B, {0x21,0x00,0x23,0x00,0x24,0x80,0x4F,0xC0,0x50,0x20,0xCF,0xC0,0x4A,0xC0,0x4A,0xC0,0x4F,0xC0,0x4A,0xC0,0x4A,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x502C, {0x21,0x00,0x21,0x00,0x21,0xE0,0x6F,0xC0,0x68,0x40,0xEF,0xC0,0x68,0x40,0x6F,0xC0,0x6F,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x502D, {0x20,0xC0,0x2F,0x00,0x3F,0xE0,0x43,0x00,0x45,0x80,0xD9,0x40,0x41,0x00,0x5F,0xE0,0x42,0x80,0x47,0x00,0x42,0x80,0x5C,0x40,0x00,0x00,}}, +{ 0x5036, {0x20,0x00,0x2F,0x80,0x28,0x80,0x6F,0x80,0x68,0x80,0xAF,0x80,0x28,0x80,0x2F,0x80,0x20,0x00,0x3F,0xE0,0x28,0x80,0x30,0x40,0x00,0x00,}}, +{ 0x5039, {0x11,0x00,0x11,0x00,0x12,0x80,0x3F,0xC0,0x31,0x20,0x57,0xC0,0x15,0x40,0x17,0xC0,0x13,0x00,0x12,0x80,0x14,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x5043, {0x20,0x00,0x3F,0xE0,0x37,0xC0,0x77,0xC0,0x74,0x40,0xF7,0xC0,0x71,0x00,0x7F,0xE0,0x77,0x80,0x77,0xC0,0x7F,0xE0,0x70,0x00,0x00,0x00,}}, +{ 0x5047, {0x20,0x00,0x3E,0xC0,0x32,0x40,0x7E,0xC0,0x72,0x40,0xF0,0x00,0x7D,0xC0,0x71,0x40,0x79,0xC0,0x78,0x80,0x70,0xC0,0x73,0x20,0x00,0x00,}}, +{ 0x5048, {0x10,0x00,0x17,0xC0,0x17,0xC0,0x37,0xC0,0x37,0xC0,0x74,0x00,0x37,0xE0,0x39,0x20,0x3B,0xA0,0x3C,0x20,0x3F,0xA0,0x38,0xC0,0x00,0x00,}}, +{ 0x5049, {0x21,0x00,0x2F,0x80,0x3F,0xE0,0x60,0x00,0x6F,0x80,0xAF,0x80,0x20,0x00,0x2F,0xC0,0x29,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x504F, {0x10,0x00,0x1F,0xE0,0x10,0x00,0x27,0xC0,0x27,0xC0,0x64,0x00,0x27,0xE0,0x2D,0x60,0x2D,0x60,0x37,0xE0,0x35,0x60,0x24,0x60,0x00,0x00,}}, +{ 0x5050, {0x21,0x00,0x3F,0xE0,0x23,0x80,0x67,0x80,0x6F,0xE0,0xE8,0x80,0x69,0x00,0x6E,0x40,0x6B,0x80,0x7A,0x60,0x70,0xC0,0x67,0x00,0x00,0x00,}}, +{ 0x5055, {0x29,0x80,0x29,0xA0,0x2F,0xC0,0x69,0x80,0x6F,0xA0,0xF9,0xE0,0x62,0x00,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x5056, {0x21,0x00,0x23,0x00,0x2F,0xC0,0x61,0x40,0x7F,0xE0,0xE1,0x80,0x62,0x80,0x6F,0xC0,0x77,0xC0,0x67,0xC0,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x505A, {0x21,0x80,0x29,0x80,0x29,0x80,0x7F,0xE0,0x6B,0x40,0xEB,0x40,0x7F,0xC0,0x72,0x80,0x72,0x80,0x7F,0xC0,0x73,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x505C, {0x21,0x00,0x3F,0xE0,0x27,0x80,0x64,0x80,0x67,0x80,0xA0,0x00,0x3F,0xE0,0x30,0x40,0x2F,0xC0,0x21,0x00,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x5065, {0x20,0x80,0x23,0xC0,0x38,0xC0,0x4F,0xE0,0x53,0xC0,0xDC,0x80,0x47,0xC0,0x54,0x80,0x4F,0xE0,0x4C,0x80,0x53,0x00,0x40,0xE0,0x00,0x00,}}, +{ 0x506C, {0x24,0x00,0x24,0x00,0x2F,0xC0,0x7F,0xC0,0x77,0xC0,0xE9,0xC0,0x72,0x80,0x62,0x00,0x65,0x40,0x74,0x20,0x74,0xA0,0x63,0x80,0x00,0x00,}}, +{ 0x5072, {0x20,0x00,0x2F,0xC0,0x29,0x40,0x6F,0xC0,0x49,0x40,0xC9,0x40,0x4F,0xC0,0x41,0x00,0x44,0x80,0x54,0x20,0x54,0xA0,0x63,0x80,0x00,0x00,}}, +{ 0x5074, {0x10,0x20,0x1E,0xA0,0x1A,0xA0,0x2E,0xA0,0x2A,0xA0,0x6A,0xA0,0x2E,0xA0,0x2A,0xA0,0x2E,0xA0,0x26,0x20,0x29,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x5075, {0x11,0x00,0x11,0xE0,0x11,0x00,0x37,0xC0,0x34,0x40,0x57,0xC0,0x14,0x40,0x17,0xC0,0x14,0x40,0x17,0xC0,0x12,0x40,0x1C,0x20,0x00,0x00,}}, +{ 0x5076, {0x10,0x00,0x17,0xC0,0x15,0x40,0x37,0xC0,0x27,0xC0,0x61,0x00,0x2F,0xE0,0x29,0x60,0x2F,0xE0,0x2C,0x60,0x28,0x20,0x28,0x60,0x00,0x00,}}, +{ 0x5078, {0x27,0x00,0x23,0x00,0x26,0x80,0x7F,0xC0,0x70,0x20,0xFE,0x40,0x73,0xC0,0x7B,0xC0,0x7F,0x80,0x7F,0xC0,0x73,0xC0,0x77,0xC0,0x00,0x00,}}, +{ 0x507D, {0x29,0x00,0x25,0x00,0x3F,0x80,0x6F,0x80,0x62,0x80,0xA7,0xC0,0x24,0x40,0x2F,0xE0,0x37,0xE0,0x3A,0x20,0x28,0x20,0x20,0xC0,0x00,0x00,}}, +{ 0x5080, {0x21,0x00,0x22,0x00,0x2F,0xC0,0x6F,0xC0,0x6B,0x40,0xEF,0xC0,0x6B,0x40,0x63,0x80,0x67,0xC0,0x65,0xE0,0x69,0x20,0x71,0xE0,0x00,0x00,}}, +{ 0x5085, {0x21,0x80,0x3F,0xE0,0x27,0xC0,0x6F,0xC0,0x6F,0xC0,0xE9,0x40,0x6F,0xC0,0x69,0xC0,0x7F,0xE0,0x7F,0xE0,0x62,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x508D, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x44,0x80,0x5F,0xE0,0xD1,0x20,0x5F,0xE0,0x42,0x00,0x43,0xC0,0x44,0x40,0x58,0x40,0x40,0x80,0x00,0x00,}}, +{ 0x5091, {0x24,0x40,0x24,0x40,0x2F,0xE0,0x7F,0x40,0x67,0xE0,0xA9,0x40,0x31,0x40,0x3F,0xE0,0x27,0x80,0x29,0x40,0x31,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x5098, {0x04,0x00,0x0A,0x00,0x35,0x80,0xE4,0xE0,0x24,0x80,0x35,0x80,0x6F,0x40,0x35,0x80,0x5E,0x40,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5099, {0x24,0x80,0x3F,0xC0,0x24,0x80,0x7F,0xE0,0x48,0x00,0xCF,0xC0,0x49,0x40,0x5F,0xC0,0x59,0x40,0x5F,0xC0,0x69,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x509A, {0x25,0x80,0x25,0x80,0x3F,0xE0,0x7F,0xE0,0x73,0x40,0xF3,0x40,0x6D,0xC0,0x64,0x80,0x64,0x80,0x6A,0xC0,0x73,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x50AC, {0x21,0x00,0x29,0x40,0x29,0x40,0x6F,0xC0,0x64,0x80,0xAF,0xE0,0x39,0x00,0x2F,0xC0,0x29,0x00,0x2F,0xC0,0x2F,0xE0,0x28,0x00,0x00,0x00,}}, +{ 0x50AD, {0x21,0x00,0x3F,0xE0,0x5F,0xC0,0x51,0x40,0xDF,0xE0,0x5F,0xC0,0x51,0x00,0x5F,0xC0,0x5F,0xC0,0x6F,0xC0,0x69,0x40,0x49,0xC0,0x00,0x00,}}, +{ 0x50B2, {0x29,0x80,0x39,0x80,0x3F,0xE0,0x7F,0xE0,0x6B,0x40,0xEB,0x40,0x7F,0xC0,0x68,0x80,0x6E,0x80,0x7A,0xC0,0x73,0x40,0x66,0x20,0x00,0x00,}}, +{ 0x50B3, {0x21,0x00,0x3F,0xE0,0x27,0xC0,0x6F,0xC0,0x6F,0xC0,0xEF,0xC0,0x61,0x40,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x64,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x50B4, {0x20,0x00,0x3F,0xE0,0x33,0x80,0x73,0x80,0x73,0x80,0xF0,0x00,0x77,0xC0,0x75,0xC0,0x77,0xC0,0x77,0xC0,0x7F,0xE0,0x70,0x00,0x00,0x00,}}, +{ 0x50B5, {0x22,0x00,0x3F,0xC0,0x2F,0x80,0x62,0x00,0x7F,0xE0,0xAF,0x80,0x28,0x80,0x2F,0x80,0x28,0x80,0x2F,0x80,0x2C,0x80,0x30,0x40,0x00,0x00,}}, +{ 0x50B7, {0x12,0x00,0x13,0xF0,0x17,0xC0,0x2A,0x40,0x63,0xC0,0xA3,0xC0,0x3F,0xF0,0x24,0x00,0x27,0xE0,0x2A,0xA0,0x25,0x20,0x21,0xC0,0x00,0x00,}}, +{ 0x50BE, {0x20,0x00,0x27,0xE0,0x30,0x80,0x75,0xC0,0x75,0x40,0xB9,0xC0,0x31,0x40,0x31,0xC0,0x35,0x40,0x2D,0xC0,0x21,0x40,0x26,0x20,0x00,0x00,}}, +{ 0x50C2, {0x21,0x00,0x2F,0xC0,0x3F,0xE0,0x6F,0xE0,0x6F,0xC0,0xEF,0xC0,0x69,0x40,0x6F,0xC0,0x7F,0xE0,0x7F,0xE0,0x63,0x80,0x7E,0x40,0x00,0x00,}}, +{ 0x50C5, {0x24,0x80,0x3F,0xE0,0x24,0x80,0x6F,0xC0,0x69,0x40,0xAF,0xC0,0x21,0x00,0x2F,0xC0,0x27,0x80,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x50C9, {0x04,0x00,0x0A,0x00,0x3F,0x80,0xFF,0xE0,0x7B,0xC0,0x6A,0x80,0x6A,0x80,0x3B,0x80,0x31,0x80,0x39,0x80,0x4A,0x40,0x84,0x40,0x00,0x00,}}, +{ 0x50CA, {0x20,0x00,0x3F,0xE0,0x3F,0xC0,0x7F,0xC0,0x7F,0xC0,0xE2,0x00,0x7F,0xE0,0x65,0x80,0x7F,0xE0,0x6F,0x80,0x68,0x40,0x67,0xC0,0x00,0x00,}}, +{ 0x50CD, {0x23,0x40,0x3C,0x40,0x3F,0xE0,0x3F,0x60,0x55,0x60,0xDF,0x60,0x55,0x60,0x5F,0x60,0x44,0x60,0x4E,0xA0,0x47,0xA0,0x59,0x60,0x00,0x00,}}, +{ 0x50CF, {0x22,0x00,0x27,0x80,0x3F,0xC0,0x69,0x40,0x6F,0xC0,0xA1,0x00,0x26,0x40,0x3B,0x80,0x2F,0x80,0x25,0x40,0x39,0x20,0x22,0x00,0x00,0x00,}}, +{ 0x50D1, {0x21,0x80,0x2F,0x00,0x3F,0xE0,0x77,0x00,0x4F,0x80,0xD5,0x40,0x47,0x20,0x5F,0xC0,0x50,0x40,0x57,0x40,0x57,0x40,0x50,0x40,0x00,0x00,}}, +{ 0x50D5, {0x22,0x80,0x2A,0xC0,0x3F,0xE0,0x64,0x40,0x62,0x80,0xBF,0xE0,0x21,0x00,0x2F,0xC0,0x3F,0xE0,0x23,0x00,0x2C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x50D6, {0x21,0x00,0x3F,0xE0,0x27,0xC0,0x67,0xC0,0x6F,0xC0,0xE8,0x40,0x6F,0xC0,0x64,0xC0,0x7F,0xE0,0x6F,0xC0,0x68,0x40,0x6F,0xC0,0x00,0x00,}}, +{ 0x50DA, {0x22,0x00,0x32,0x00,0x3F,0xE0,0x4C,0xA0,0x4F,0xC0,0xD4,0xA0,0x47,0x80,0x44,0x80,0x47,0x80,0x49,0x40,0x51,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x50DE, {0x20,0xC0,0x3F,0xC0,0x39,0x60,0x6F,0x80,0x68,0x80,0xEF,0xC0,0x68,0x40,0x6F,0xE0,0x69,0xE0,0x77,0xE0,0x7A,0x20,0x68,0xC0,0x00,0x00,}}, +{ 0x50E3, {0x25,0x80,0x35,0x80,0x3F,0xC0,0x7F,0xE0,0x6D,0xC0,0xEB,0x80,0x73,0x40,0x6F,0xA0,0x6F,0x80,0x6F,0x80,0x6F,0x80,0x68,0x80,0x00,0x00,}}, +{ 0x50E5, {0x21,0x00,0x2F,0xC0,0x3F,0xE0,0x6F,0xE0,0x7E,0xE0,0xE4,0x80,0x66,0xE0,0x78,0x00,0x7F,0xE0,0x63,0x80,0x65,0xA0,0x78,0xE0,0x00,0x00,}}, +{ 0x50E7, {0x12,0x40,0x11,0x80,0x17,0xE0,0x37,0xE0,0x34,0xA0,0x57,0xE0,0x10,0x00,0x13,0xC0,0x12,0x40,0x13,0xC0,0x13,0xC0,0x12,0x40,0x00,0x00,}}, +{ 0x50ED, {0x24,0x80,0x3F,0xE0,0x35,0x80,0x7F,0xE0,0x6D,0xC0,0xF7,0xA0,0x65,0x60,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x50EE, {0x21,0x00,0x3F,0xC0,0x3F,0xE0,0x7F,0xE0,0x6F,0xC0,0xE9,0x40,0x6F,0xC0,0x6B,0x40,0x6F,0xC0,0x6F,0xC0,0x63,0x00,0x7F,0xE0,0x00,0x00,}}, +{ 0x50F5, {0x20,0x00,0x3F,0xE0,0x2F,0xC0,0x6F,0xC0,0x6B,0x40,0xEF,0xC0,0x7F,0xE0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x7F,0xE0,0x00,0x00,}}, +{ 0x50F9, {0x20,0x00,0x3F,0xE0,0x3F,0xC0,0x7F,0xC0,0x7F,0xC0,0xEF,0x80,0x68,0x80,0x6F,0x80,0x6F,0x80,0x6F,0x80,0x65,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x50FB, {0x20,0x80,0x2E,0x80,0x2B,0xE0,0x6B,0x40,0x4F,0x40,0xC9,0xE0,0x48,0x80,0x5E,0x80,0x5B,0xE0,0x6A,0x80,0x4E,0x80,0x48,0x80,0x00,0x00,}}, +{ 0x5100, {0x24,0x80,0x23,0x00,0x3F,0xE0,0x6F,0xC0,0x61,0x00,0xBF,0xE0,0x2F,0xC0,0x35,0xA0,0x3F,0xE0,0x2C,0xC0,0x34,0xE0,0x2D,0x20,0x00,0x00,}}, +{ 0x5101, {0x25,0x80,0x25,0x80,0x2F,0xE0,0x7F,0xC0,0x7B,0x00,0xEF,0xC0,0x69,0x00,0x6F,0xE0,0x6C,0xE0,0x7F,0xE0,0x73,0xA0,0x70,0x60,0x00,0x00,}}, +{ 0x5102, {0x23,0x80,0x2F,0xC0,0x2F,0xC0,0x6F,0xC0,0x6F,0xC0,0xE0,0x00,0x7F,0xC0,0x73,0x80,0x7F,0xE0,0x75,0xC0,0x67,0x80,0x7C,0x60,0x00,0x00,}}, +{ 0x5104, {0x21,0x00,0x2F,0xC0,0x24,0x80,0x7F,0xE0,0x67,0x80,0xA4,0x80,0x27,0x80,0x24,0x80,0x27,0xC0,0x2D,0x20,0x34,0xA0,0x23,0x80,0x00,0x00,}}, +{ 0x5109, {0x21,0x00,0x23,0x00,0x26,0x80,0x7F,0xE0,0x60,0x00,0xEE,0xC0,0x6B,0xC0,0x6B,0xC0,0x6E,0xC0,0x66,0xC0,0x6B,0xA0,0x71,0x20,0x00,0x00,}}, +{ 0x5112, {0x20,0x00,0x3F,0xE0,0x22,0x00,0x7F,0xE0,0x7D,0xC0,0xA0,0x00,0x3F,0xE0,0x22,0x00,0x2F,0xC0,0x2A,0xC0,0x2A,0xC0,0x2A,0xC0,0x00,0x00,}}, +{ 0x5114, {0x21,0x00,0x3F,0xE0,0x27,0xC0,0x7F,0xE0,0x6F,0xC0,0xE1,0x00,0x6F,0xC0,0x7F,0xE0,0x6F,0xE0,0x7F,0xE0,0x7D,0x40,0x70,0xC0,0x00,0x00,}}, +{ 0x5115, {0x62,0x00,0x7F,0xE0,0x7F,0xC0,0x7B,0xC0,0xEB,0xC0,0x7B,0xC0,0x48,0xA0,0x4F,0x80,0x4F,0x80,0x4F,0x80,0x50,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5116, {0x21,0x80,0x3F,0x80,0x3D,0xE0,0x7F,0xE0,0x7E,0x00,0xF4,0xC0,0x7F,0x00,0x60,0x00,0x6F,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5118, {0x62,0x00,0x7F,0x80,0x7F,0xE0,0x5F,0xE0,0xC2,0x00,0x7F,0xE0,0x69,0x40,0x45,0xA0,0x5F,0x80,0x55,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x511A, {0x25,0x80,0x3F,0xE0,0x27,0xC0,0x6F,0xC0,0x6F,0xC0,0xE0,0x00,0x7F,0xE0,0x73,0x20,0x67,0xC0,0x67,0x80,0x63,0x00,0x7C,0x00,0x00,0x00,}}, +{ 0x511F, {0x15,0x20,0x13,0xC0,0x2F,0xF0,0x2A,0x50,0x63,0xC0,0xA7,0xE0,0x27,0xE0,0x27,0xE0,0x24,0x20,0x27,0xE0,0x22,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x5121, {0x20,0x00,0x2F,0xC0,0x2F,0xC0,0x6F,0xC0,0x6F,0xC0,0xE8,0x40,0x60,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x71,0x20,0x00,0x00,}}, +{ 0x512A, {0x20,0x00,0x3F,0xE0,0x27,0x80,0x47,0x80,0x47,0x80,0xDF,0xE0,0x6D,0xC0,0x5B,0xC0,0x57,0xA0,0x5D,0x00,0x47,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x5132, {0x20,0x80,0x3C,0x80,0x3F,0xC0,0x40,0xC0,0x5F,0xE0,0xC0,0x80,0x5D,0xC0,0x43,0x40,0x5D,0xC0,0x55,0x40,0x5D,0xC0,0x55,0x40,0x00,0x00,}}, +{ 0x5137, {0x3E,0xE0,0x30,0x00,0x3F,0xE0,0x67,0x80,0x7F,0xE0,0xF3,0x80,0x7F,0xC0,0x73,0xC0,0x7F,0xE0,0x77,0xE0,0x67,0xA0,0x7C,0xE0,0x00,0x00,}}, +{ 0x513A, {0x75,0xC0,0x7F,0xC0,0x7D,0xE0,0x49,0xE0,0x7F,0x80,0xEB,0xE0,0x7F,0x80,0x4B,0xC0,0x5F,0xE0,0x5F,0x80,0x57,0xE0,0x63,0x00,0x00,0x00,}}, +{ 0x513B, {0x25,0x80,0x3F,0xE0,0x37,0xC0,0x6F,0xC0,0x6F,0xC0,0xEB,0xC0,0x6F,0xC0,0x63,0x00,0x6F,0xC0,0x7F,0xE0,0x6B,0xC0,0x73,0xA0,0x00,0x00,}}, +{ 0x513C, {0x6F,0xC0,0x6B,0xC0,0x4E,0xC0,0x5F,0xE0,0xFF,0x80,0x65,0x80,0x7F,0xE0,0x6B,0xC0,0x6E,0xC0,0x6E,0x80,0x7F,0xC0,0x43,0x20,0x00,0x00,}}, +{ 0x513F, {0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x20,0x41,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5140, {0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x20,0x41,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5141, {0x08,0x00,0x09,0x00,0x11,0xC0,0xFF,0x20,0x12,0x00,0x12,0x00,0x12,0x00,0x22,0x00,0x22,0x00,0x22,0x20,0x42,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5143, {0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x00,0x22,0x00,0x22,0x20,0x42,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5144, {0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x2A,0x40,0x0A,0x00,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x5145, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x09,0x00,0x11,0x80,0x7E,0x40,0x09,0x00,0x09,0x00,0x11,0x00,0x11,0x20,0x21,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5146, {0x12,0x00,0x12,0x00,0x12,0x80,0x52,0x80,0x33,0x00,0x12,0x00,0x12,0x80,0x32,0x80,0xE2,0x00,0x22,0x20,0x42,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5147, {0x02,0x00,0x42,0x80,0x5C,0x80,0x4E,0x80,0x52,0x80,0x60,0x80,0x7F,0x80,0x52,0x80,0x12,0x00,0x22,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5148, {0x04,0x00,0x24,0x00,0x3F,0x80,0x24,0x00,0x44,0x00,0xFF,0xE0,0x0A,0x00,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5149, {0x04,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x04,0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x00,0x22,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x514B, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x0A,0x80,0x0A,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x514C, {0x07,0x00,0x11,0x00,0x20,0x80,0xFF,0xE0,0x31,0x80,0x21,0x80,0x21,0x80,0x3F,0x00,0x0A,0x00,0x1A,0x20,0x32,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x514D, {0x10,0x00,0x1F,0x00,0x22,0x00,0xFF,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x0A,0x80,0x0A,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x514E, {0x00,0x80,0x03,0x00,0x7C,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x0C,0x80,0x0D,0x00,0x14,0xA0,0x24,0x20,0xC3,0xE0,0x00,0x00,}}, +{ 0x5150, {0x00,0x00,0x2F,0x80,0x28,0x80,0x2F,0x80,0x28,0x80,0x28,0x80,0x2F,0x80,0x0A,0x80,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5152, {0x08,0x00,0x73,0xC0,0x40,0x40,0x7B,0xC0,0x40,0x40,0x40,0x40,0x7F,0xC0,0x52,0x40,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5154, {0x08,0x00,0x0F,0x00,0x32,0x00,0xFF,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x0C,0x80,0x0D,0x00,0x15,0xA0,0x24,0x20,0xC3,0xE0,0x00,0x00,}}, +{ 0x515A, {0x24,0x80,0x15,0x00,0x7F,0xE0,0x40,0x20,0x9F,0x80,0x10,0x80,0x10,0x80,0x1F,0x80,0x0A,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x515C, {0x02,0x00,0x34,0x00,0x5F,0xC0,0x52,0x40,0x5E,0x40,0x7E,0xC0,0x40,0x40,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5162, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x71,0x80,0x71,0x80,0x5E,0xA0,0x72,0xA0,0x84,0x60,0x00,0x00,}}, +{ 0x5165, {0x3C,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0E,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x80,0x20,0x00,0x00,}}, +{ 0x5168, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x3F,0x80,0x04,0x00,0x04,0x00,0x1F,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x5169, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x44,0x40,0x75,0x40,0x55,0xC0,0x55,0xC0,0x6E,0xC0,0x44,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x516A, {0x1C,0x00,0x0A,0x00,0x31,0x80,0xFF,0xE0,0x00,0x00,0x79,0x40,0x49,0x40,0x7A,0x80,0x7C,0x80,0x7A,0x80,0x4B,0x40,0x59,0x40,0x00,0x00,}}, +{ 0x516B, {0x1F,0x00,0x01,0x00,0x01,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x20,0x80,0x20,0x80,0x40,0x80,0x40,0x40,0x80,0x20,0x00,0x00,}}, +{ 0x516C, {0x07,0x00,0x11,0x00,0x10,0x80,0x20,0x80,0x24,0x40,0x44,0x20,0x84,0x00,0x09,0x00,0x08,0x80,0x11,0x80,0x7E,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x516D, {0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x10,0x80,0x20,0x80,0x20,0x40,0x40,0x40,0x80,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x516E, {0x07,0x00,0x11,0x00,0x20,0x80,0xFF,0xE0,0x10,0x00,0x10,0x00,0x1F,0x80,0x21,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x5171, {0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x20,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x5175, {0x03,0x00,0x3C,0x00,0x20,0x00,0x3F,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0xFF,0xE0,0x10,0x00,0x21,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x5176, {0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0x1F,0x00,0x11,0x00,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x5177, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x30,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x5178, {0x0A,0x00,0x0A,0x00,0x3F,0x80,0x2A,0x80,0x2A,0x80,0x3F,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x10,0x00,0x21,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x517C, {0x21,0x00,0x12,0x00,0xFF,0xE0,0x7F,0x80,0x12,0x80,0xFF,0xE0,0x12,0x80,0x7F,0x80,0x33,0x00,0xD2,0xE0,0x12,0x00,0x12,0x00,0x00,0x00,}}, +{ 0x5180, {0x11,0x40,0x71,0x80,0x3F,0xE0,0xFF,0xE0,0x3F,0x80,0x25,0x80,0x3F,0x00,0x13,0x00,0x7F,0xC0,0xFF,0xE0,0x31,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5182, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5185, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x4A,0x40,0x49,0x40,0x50,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5186, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5189, {0x04,0x00,0x04,0x00,0x3F,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0x64,0xC0,0xFF,0xE0,0x60,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x518A, {0x00,0x00,0x7F,0x80,0x4A,0x80,0x4A,0x80,0x4A,0x80,0x4A,0x80,0xFF,0xE0,0x4A,0x80,0x4A,0x80,0x4A,0x80,0x4A,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x518C, {0x00,0x00,0x79,0xC0,0x69,0x40,0x69,0x40,0x69,0x40,0xFF,0xE0,0x69,0x40,0x69,0x40,0x69,0x40,0x4A,0x40,0x4A,0x40,0x9C,0xC0,0x00,0x00,}}, +{ 0x518D, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0xFF,0xE0,0x20,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x518F, {0x00,0x00,0x7F,0xC0,0x52,0x40,0x52,0x40,0x63,0xC0,0x60,0x40,0x5F,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x53,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5190, {0x00,0x00,0x7F,0xC0,0x7F,0x40,0x7F,0x40,0x7F,0x40,0x40,0x40,0x7F,0x80,0x60,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5191, {0x04,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x7F,0x80,0x60,0x80,0x7E,0x80,0x7E,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5192, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5193, {0x11,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7F,0x80,0x64,0x80,0x7F,0x80,0xFF,0xE0,0x60,0xC0,0x60,0x80,0x00,0x00,}}, +{ 0x5195, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x1F,0x00,0x62,0x00,0xFF,0x80,0x7F,0x80,0x3F,0xA0,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x5196, {0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x60,0x20,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x5197, {0x00,0x00,0x3F,0xE0,0x40,0x20,0x0F,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x11,0x00,0x11,0x20,0x21,0x20,0x40,0xE0,0x00,0x00,}}, +{ 0x5199, {0x00,0x00,0x7F,0xE0,0x90,0x40,0x1F,0x80,0x10,0x00,0x1F,0x00,0x11,0x00,0x01,0x00,0xFF,0xE0,0x01,0x00,0x02,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x51A0, {0x00,0x00,0x7F,0xE0,0x80,0x40,0xF8,0x80,0x07,0xE0,0xFC,0x80,0x52,0x80,0x52,0x80,0x50,0x80,0x50,0xA0,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x51A2, {0x00,0x00,0x7F,0xE0,0xFF,0xC0,0x3F,0xC0,0x19,0x40,0x25,0x40,0xED,0x80,0x33,0x80,0x5E,0x80,0x1A,0x40,0x62,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x51A4, {0x00,0x00,0x7F,0xE0,0x8E,0x40,0x3E,0x00,0xFF,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x0C,0x00,0x1D,0x20,0x35,0xA0,0xC3,0xE0,0x00,0x00,}}, +{ 0x51A5, {0x00,0x00,0x7F,0xE0,0x80,0x40,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x10,0x00,0x21,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x51A6, {0x00,0x00,0x7F,0xE0,0xF9,0x40,0x39,0xE0,0x01,0x00,0xFF,0xC0,0x72,0x40,0x71,0x80,0x71,0xC0,0x57,0x60,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x51A8, {0x00,0x00,0x7F,0xE0,0xBF,0xC0,0x1F,0x00,0x11,0x00,0x1F,0x00,0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x51A9, {0x00,0x00,0x7F,0xE0,0xFB,0xC0,0x73,0x80,0x7B,0x80,0x60,0x80,0x3F,0x80,0x10,0x00,0xFF,0xC0,0xDD,0x40,0x55,0xC0,0x81,0x80,0x00,0x00,}}, +{ 0x51AA, {0x00,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x31,0x80,0x3F,0x80,0x21,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0xF5,0xE0,0x25,0x80,0x00,0x00,}}, +{ 0x51AB, {0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x51AC, {0x04,0x00,0x04,0x00,0x1F,0x80,0x69,0x00,0x06,0x00,0x0D,0x00,0x30,0x80,0xCC,0x60,0x02,0x00,0x1C,0x00,0x02,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x51B0, {0x01,0x00,0x01,0x00,0x41,0x00,0x7F,0x20,0x03,0xC0,0x03,0x80,0x65,0x80,0x45,0x80,0x49,0x40,0x91,0x20,0x81,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x51B1, {0x00,0x00,0x3F,0xE0,0x48,0x00,0x6F,0x80,0x08,0x80,0x08,0x80,0x68,0x80,0x4F,0x80,0x48,0x80,0x80,0x80,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x51B2, {0x00,0x80,0x00,0x80,0x23,0xE0,0x37,0xE0,0x04,0xA0,0x04,0xA0,0x34,0xA0,0x27,0xE0,0x24,0xA0,0x40,0x80,0x40,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x51B3, {0x02,0x00,0x02,0x00,0x4F,0x80,0x6F,0x80,0x02,0x80,0x02,0x80,0x7F,0xE0,0x43,0x00,0x45,0x80,0x88,0x80,0x90,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x51B4, {0x00,0x00,0x0F,0xC0,0x44,0x80,0x24,0x80,0x04,0x80,0x3F,0xE0,0x21,0x80,0x41,0x80,0x42,0x80,0x8C,0x80,0xB0,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x51B5, {0x00,0x00,0x0F,0xC0,0x48,0x40,0x68,0x40,0x0F,0xC0,0x0B,0xC0,0x63,0x80,0x43,0x80,0x45,0x80,0x89,0xA0,0x91,0xA0,0x20,0xE0,0x00,0x00,}}, +{ 0x51B6, {0x02,0x00,0x42,0x00,0x22,0x00,0x84,0x80,0x44,0xC0,0x1F,0x20,0x20,0x00,0x4F,0xC0,0x48,0x40,0x88,0x40,0x8F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x51B7, {0x02,0x00,0x02,0x00,0x45,0x00,0x28,0x80,0x17,0xC0,0x20,0x20,0x5F,0xC0,0x42,0x40,0x42,0x40,0x83,0xC0,0x82,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x51BD, {0x00,0x20,0x1F,0xA0,0x24,0xE0,0x37,0xE0,0x09,0xE0,0x09,0xE0,0x35,0xE0,0x26,0xE0,0x22,0xE0,0x44,0x20,0x48,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x51C4, {0x02,0x00,0x3F,0xE0,0x8F,0x80,0x42,0x80,0x3F,0xE0,0x02,0x80,0x4F,0x80,0x42,0x00,0x5F,0xE0,0x8F,0x80,0x83,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0x51C5, {0x00,0x00,0x0F,0xE0,0x29,0x20,0x3F,0xE0,0x09,0x20,0x09,0x20,0x3B,0xE0,0x2A,0xE0,0x2B,0xE0,0x4B,0xA0,0x4F,0xE0,0x08,0x20,0x00,0x00,}}, +{ 0x51C6, {0x04,0x80,0x04,0x80,0x4F,0xE0,0x29,0x00,0x19,0x00,0x2F,0xC0,0x29,0x00,0x49,0x00,0x4F,0xC0,0x89,0x00,0x8F,0xE0,0x08,0x00,0x00,0x00,}}, +{ 0x51C9, {0x01,0x00,0x03,0x00,0x5F,0xE0,0x6F,0xC0,0x08,0x40,0x08,0x40,0x6F,0xC0,0x41,0x00,0x49,0x40,0x99,0x20,0xB1,0x20,0x03,0x00,0x00,0x00,}}, +{ 0x51CB, {0x00,0x00,0x0F,0xE0,0x49,0x20,0x2F,0xA0,0x09,0x20,0x0F,0xE0,0x28,0x20,0x2B,0xA0,0x4A,0xA0,0x4B,0xA0,0x10,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x51CC, {0x01,0x00,0x0F,0xC0,0x41,0x00,0x3F,0xE0,0x02,0x80,0x04,0xA0,0x5A,0xE0,0x43,0x80,0x84,0x80,0x8B,0x00,0x02,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0x51CD, {0x01,0x00,0x01,0x00,0x5F,0xE0,0x2F,0xC0,0x09,0x40,0x2F,0xC0,0x29,0x40,0x2F,0xC0,0x43,0x80,0x45,0x40,0x59,0x20,0x01,0x00,0x00,0x00,}}, +{ 0x51D6, {0x04,0x80,0x45,0x80,0x6F,0xC0,0x1F,0x80,0x3B,0x00,0x6F,0x80,0x49,0x00,0x4F,0xC0,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x51DB, {0x01,0x00,0x1F,0xE0,0x47,0xC0,0x6F,0xC0,0x0B,0xC0,0x0B,0xC0,0x6F,0xC0,0x47,0x80,0x4F,0xE0,0x8F,0xE0,0x89,0x40,0x11,0x40,0x00,0x00,}}, +{ 0x51DD, {0x10,0x00,0x15,0xE0,0x98,0xC0,0x5E,0x80,0x13,0xE0,0x1E,0xC0,0x29,0x80,0x2B,0xE0,0x7F,0x80,0x8D,0x80,0x92,0x80,0x24,0x60,0x00,0x00,}}, +{ 0x51E0, {0x00,0x00,0x1F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x20,0x41,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x51E1, {0x00,0x00,0x3F,0x00,0x21,0x00,0x21,0x00,0x29,0x00,0x25,0x00,0x25,0x00,0x25,0x00,0x21,0x00,0x41,0x20,0x41,0x20,0x80,0xE0,0x00,0x00,}}, +{ 0x51E6, {0x20,0x00,0x23,0x80,0x3A,0x80,0x2A,0x80,0x4A,0x80,0x6A,0x80,0xAA,0x80,0x12,0x80,0x14,0xA0,0x28,0x60,0x46,0x00,0x81,0xE0,0x00,0x00,}}, +{ 0x51E7, {0x00,0x00,0x7F,0x80,0x44,0x80,0x5F,0x80,0x55,0x80,0x55,0x80,0x55,0x80,0x55,0x80,0x57,0x80,0x44,0xA0,0x44,0x60,0x84,0x20,0x00,0x00,}}, +{ 0x51E9, {0x00,0x00,0x7F,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0x6E,0x80,0x6D,0x80,0x75,0x80,0x75,0xE0,0x64,0x60,0x84,0x20,0x00,0x00,}}, +{ 0x51EA, {0x00,0x00,0x7F,0x80,0x40,0x80,0x44,0x80,0x54,0x80,0x57,0x80,0x54,0x80,0x54,0x80,0x54,0x80,0x7F,0xA0,0x40,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x51ED, {0x20,0xC0,0x2F,0x00,0x6F,0xE0,0x6F,0xE0,0xE1,0x00,0x6F,0xC0,0x00,0x00,0x1F,0x00,0x11,0x00,0x11,0x20,0x21,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x51F0, {0x00,0x00,0x7F,0x80,0x6E,0x80,0x7F,0x80,0x7F,0x80,0x71,0x80,0x7F,0x80,0x60,0x80,0x7F,0x80,0x5E,0x60,0x44,0x60,0xBF,0x20,0x00,0x00,}}, +{ 0x51F1, {0x20,0x00,0x6B,0x80,0x7A,0x80,0x7A,0x80,0xFA,0x80,0x02,0x80,0x7A,0x80,0x4A,0x80,0x7A,0x80,0x52,0xA0,0x7C,0xA0,0xC8,0x60,0x00,0x00,}}, +{ 0x51F5, {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x51F6, {0x00,0x80,0x00,0x80,0x51,0x20,0x4D,0x20,0x42,0x20,0x43,0x20,0x44,0xA0,0x48,0x60,0x50,0x20,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x51F8, {0x00,0x00,0x1F,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x71,0xC0,0x51,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x51F9, {0x00,0x00,0x71,0xC0,0x51,0x40,0x51,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x51,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x51FA, {0x04,0x00,0x24,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,}}, +{ 0x51FD, {0x00,0x00,0x3F,0xC0,0x04,0x00,0x4E,0x20,0x42,0xE0,0x53,0xA0,0x56,0xA0,0x4A,0xE0,0x52,0x20,0x40,0x20,0x7F,0xE0,0x40,0x20,0x00,0x00,}}, +{ 0x51FE, {0x1F,0x80,0x01,0x80,0x43,0x20,0x5B,0xE0,0x7B,0x60,0x7A,0xE0,0x7A,0xE0,0x7B,0xE0,0x4B,0x20,0x4C,0x20,0x7F,0xE0,0x40,0x20,0x00,0x00,}}, +{ 0x5200, {0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x10,0x40,0x10,0x40,0x20,0x40,0x40,0x80,0x00,0x00,}}, +{ 0x5203, {0x00,0x00,0x7F,0xE0,0x04,0x20,0x04,0x20,0x04,0x20,0x1C,0x20,0x0E,0x20,0x09,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0xC0,0x00,0x00,}}, +{ 0x5204, {0x00,0x00,0xFF,0x80,0x08,0x80,0x08,0x80,0x48,0x80,0x28,0x80,0x18,0x80,0x16,0x80,0x11,0xE0,0x20,0xE0,0x40,0x80,0x87,0x00,0x00,0x00,}}, +{ 0x5206, {0x1F,0x00,0x01,0x00,0x21,0x00,0x20,0x80,0x40,0x80,0x7F,0xC0,0x88,0xA0,0x08,0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x21,0x00,0x00,0x00,}}, +{ 0x5207, {0x10,0x00,0x13,0xE0,0x10,0xA0,0x1C,0xA0,0x70,0xA0,0x10,0xA0,0x10,0xA0,0x15,0x20,0x1D,0x20,0x02,0x20,0x04,0x20,0x18,0x40,0x00,0x00,}}, +{ 0x5208, {0x04,0x20,0x04,0xA0,0x04,0xA0,0x24,0xA0,0x18,0xA0,0x08,0xA0,0x0C,0xA0,0x14,0xA0,0x12,0xA0,0x20,0x20,0x20,0x20,0x40,0x60,0x00,0x00,}}, +{ 0x520A, {0x00,0x20,0x7E,0xA0,0x10,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x10,0xA0,0x10,0xA0,0x10,0xA0,0x10,0x20,0x10,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x520B, {0x02,0x20,0x0C,0xA0,0x38,0xA0,0x08,0xA0,0x08,0xA0,0x7F,0xA0,0x08,0xA0,0x08,0xA0,0x08,0xA0,0x10,0x20,0x10,0x20,0x20,0x60,0x00,0x00,}}, +{ 0x520E, {0x30,0x20,0x30,0xE0,0x3E,0xE0,0x3F,0xE0,0x35,0xE0,0x55,0xE0,0x35,0xE0,0x29,0xE0,0x09,0xE0,0x12,0x20,0x02,0x20,0x0C,0x60,0x00,0x00,}}, +{ 0x5211, {0x00,0x20,0x3F,0xA0,0x14,0xA0,0x14,0xA0,0x14,0xA0,0x7F,0xA0,0x14,0xA0,0x14,0xA0,0x14,0xA0,0x24,0x20,0x24,0x20,0x44,0x60,0x00,0x00,}}, +{ 0x5214, {0x10,0x20,0x10,0xA0,0x3C,0xA0,0x3E,0xA0,0x12,0xA0,0x12,0xA0,0x7F,0xA0,0x18,0xA0,0x1C,0xA0,0x32,0x20,0x22,0x20,0x40,0x60,0x00,0x00,}}, +{ 0x5217, {0x00,0x20,0x7E,0xA0,0x10,0xA0,0x1C,0xA0,0x14,0xA0,0x24,0xA0,0x34,0xA0,0x4C,0xA0,0x08,0xA0,0x08,0x20,0x10,0x20,0x20,0x60,0x00,0x00,}}, +{ 0x521D, {0x10,0x00,0x13,0xE0,0x7C,0xA0,0x04,0xA0,0x0A,0xA0,0x12,0xA0,0x3C,0xA0,0x54,0xA0,0x13,0x20,0x11,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x5224, {0x10,0x20,0x52,0xA0,0x32,0xA0,0x10,0xA0,0x7E,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x10,0xA0,0x10,0x20,0x10,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x5225, {0x00,0x20,0x3E,0xA0,0x22,0xA0,0x22,0xA0,0x3E,0xA0,0x32,0xA0,0x10,0xA0,0x1E,0xA0,0x12,0xA0,0x12,0x20,0x22,0x20,0x4C,0x60,0x00,0x00,}}, +{ 0x5227, {0x08,0x20,0x08,0xA0,0x3C,0xA0,0x3C,0xA0,0x08,0xA0,0x7F,0xA0,0x10,0xA0,0x14,0xA0,0x12,0xA0,0x3F,0x20,0x71,0x20,0x00,0x60,0x00,0x00,}}, +{ 0x5229, {0x02,0x20,0x0C,0xA0,0x38,0xA0,0x08,0xA0,0x7E,0xA0,0x18,0xA0,0x1C,0xA0,0x3A,0xA0,0x2A,0xA0,0x48,0x20,0x08,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x522A, {0x00,0x20,0x3F,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x7F,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x35,0x20,0x35,0x20,0x23,0x60,0x00,0x00,}}, +{ 0x522E, {0x02,0x20,0x0C,0xA0,0x38,0xA0,0x08,0xA0,0x7F,0xA0,0x08,0xA0,0x08,0xA0,0x3E,0xA0,0x22,0xA0,0x22,0x20,0x3E,0x20,0x20,0x60,0x00,0x00,}}, +{ 0x5230, {0x00,0x20,0x7F,0xA0,0x10,0xA0,0x24,0xA0,0x7A,0xA0,0x12,0xA0,0x10,0xA0,0x7E,0xA0,0x10,0xA0,0x1E,0x20,0x70,0x20,0x00,0x60,0x00,0x00,}}, +{ 0x5233, {0x10,0x20,0x18,0xA0,0x7E,0xA0,0x24,0xA0,0x7A,0xA0,0x00,0xA0,0x7E,0xA0,0x30,0xA0,0x3C,0xA0,0x04,0x20,0x04,0x20,0x18,0x60,0x00,0x00,}}, +{ 0x5236, {0x28,0x20,0x28,0xA0,0x3E,0xA0,0x48,0xA0,0x7F,0xA0,0x08,0xA0,0x3E,0xA0,0x2A,0xA0,0x2A,0xA0,0x2C,0xA0,0x28,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x5237, {0x00,0x20,0x3E,0xA0,0x22,0xA0,0x3E,0xA0,0x28,0xA0,0x28,0xA0,0x3E,0xA0,0x6A,0xA0,0x6A,0xA0,0x2E,0x20,0x28,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x5238, {0x04,0x00,0x24,0x80,0x7F,0xC0,0x0A,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0xFF,0xE0,0x08,0x80,0x08,0x80,0x10,0x80,0x63,0x00,0x00,0x00,}}, +{ 0x5239, {0x04,0x20,0x04,0xA0,0x3C,0xA0,0x1E,0xA0,0x68,0xA0,0x08,0xA0,0x7E,0xA0,0x18,0xA0,0x1C,0xA0,0x2A,0x20,0x48,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x523A, {0x08,0x20,0x08,0xA0,0x7F,0xA0,0x3E,0xA0,0x2A,0xA0,0x2A,0xA0,0x2E,0xA0,0x18,0xA0,0x1C,0xA0,0x2A,0x20,0x48,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x523B, {0x08,0x20,0x08,0x20,0x7F,0xA0,0x14,0xA0,0x24,0xA0,0x18,0xA0,0x0A,0xA0,0x12,0xA0,0x24,0x20,0x0C,0x20,0x12,0x20,0x60,0x60,0x00,0x00,}}, +{ 0x5243, {0x24,0x20,0x14,0xA0,0x7E,0xA0,0x12,0xA0,0x7E,0xA0,0x50,0xA0,0x7E,0xA0,0x12,0xA0,0x32,0xA0,0x5C,0x20,0x10,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x5244, {0x00,0x20,0x7E,0xA0,0x34,0xA0,0x7C,0xA0,0x78,0xA0,0x34,0xA0,0x34,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0x20,0x1E,0x20,0x70,0x60,0x00,0x00,}}, +{ 0x5247, {0x00,0x20,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x24,0xA0,0x24,0xA0,0x3C,0xA0,0x18,0x20,0x24,0x20,0x40,0x60,0x00,0x00,}}, +{ 0x524A, {0x10,0x20,0x52,0xA0,0x32,0xA0,0x10,0xA0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x24,0x20,0x24,0x20,0x2C,0x60,0x00,0x00,}}, +{ 0x524B, {0x20,0x40,0x21,0x40,0xF9,0x40,0xF9,0x40,0x79,0x40,0x49,0x40,0x49,0x40,0x79,0x40,0x70,0x40,0x70,0x60,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x524C, {0x10,0x20,0x18,0xA0,0x7E,0xA0,0x7E,0xA0,0x5A,0xA0,0x52,0xA0,0x7E,0xA0,0x58,0xA0,0x34,0xA0,0x32,0x20,0x50,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x524D, {0x20,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x40,0x49,0x40,0x79,0x40,0x49,0x40,0x79,0x40,0x49,0x40,0x48,0x40,0x58,0xC0,0x00,0x00,}}, +{ 0x524F, {0x48,0x00,0x68,0x00,0xFF,0xC0,0xF9,0x40,0x75,0x40,0x73,0x40,0xFD,0x40,0x71,0xC0,0x72,0x60,0x52,0x60,0x54,0x40,0x98,0x80,0x00,0x00,}}, +{ 0x5254, {0x00,0x20,0x3E,0xA0,0x3E,0xA0,0x3E,0xA0,0x3E,0xA0,0x30,0xA0,0x3E,0xA0,0x76,0xA0,0x5E,0xA0,0x2A,0x20,0x1A,0x20,0x1C,0x60,0x00,0x00,}}, +{ 0x5256, {0x08,0x20,0x08,0xA0,0x3F,0xA0,0x12,0xA0,0x14,0xA0,0x7F,0xA0,0x00,0xA0,0x1E,0xA0,0x12,0xA0,0x12,0x20,0x1E,0x20,0x12,0x60,0x00,0x00,}}, +{ 0x525B, {0x00,0x20,0x7E,0xA0,0x66,0xA0,0x6A,0xA0,0x7E,0xA0,0x52,0xA0,0x76,0xA0,0x76,0xA0,0x76,0xA0,0x7E,0x20,0x42,0x20,0x46,0x60,0x00,0x00,}}, +{ 0x525E, {0x08,0x20,0x09,0xA0,0x7F,0xA0,0x1C,0xA0,0x24,0xA0,0x7F,0xA0,0x02,0xA0,0x3A,0xA0,0x2A,0xA0,0x3A,0x20,0x22,0x20,0x06,0x60,0x00,0x00,}}, +{ 0x5263, {0x08,0x20,0x08,0x20,0x14,0xA0,0x7F,0xA0,0x08,0xA0,0x3E,0xA0,0x2A,0xA0,0x3E,0xA0,0x0C,0xA0,0x12,0x20,0x12,0x20,0x60,0x60,0x00,0x00,}}, +{ 0x5264, {0x08,0x20,0x08,0xA0,0x7F,0xA0,0x14,0xA0,0x1F,0xA0,0x72,0xA0,0x1E,0xA0,0x12,0xA0,0x1E,0xA0,0x12,0x20,0x22,0x20,0x42,0x60,0x00,0x00,}}, +{ 0x5265, {0x00,0x20,0x3C,0xA0,0x04,0xA0,0x3C,0xA0,0x7F,0xA0,0x08,0xA0,0x2A,0xA0,0x1A,0xA0,0x2C,0xA0,0x4B,0x20,0x08,0x20,0x18,0x60,0x00,0x00,}}, +{ 0x5269, {0x01,0x20,0x3E,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xE0,0x3A,0xE0,0x3A,0xE0,0x59,0xE0,0x1C,0xE0,0x2B,0x20,0x49,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x526A, {0x21,0x00,0x13,0x00,0xFF,0xE0,0x79,0x40,0x79,0x40,0x69,0x40,0x69,0x40,0x58,0xC0,0xFF,0xC0,0xFF,0xC0,0x30,0x40,0xE1,0x80,0x00,0x00,}}, +{ 0x526F, {0x00,0x20,0x7E,0xA0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x52,0xA0,0x7E,0xA0,0x52,0x20,0x7E,0x20,0x42,0x60,0x00,0x00,}}, +{ 0x5270, {0x02,0x20,0x1C,0xA0,0x7E,0xA0,0x2A,0xA0,0x7F,0xA0,0x2A,0xA0,0x2A,0xA0,0x7F,0xA0,0x1C,0xA0,0x2A,0x20,0x48,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x5271, {0x20,0x00,0x37,0xC0,0x79,0x40,0x79,0x40,0xB5,0x40,0x7B,0x40,0x69,0x40,0x79,0xC0,0x7A,0x60,0x6A,0x60,0x4C,0x40,0x88,0x80,0x00,0x00,}}, +{ 0x5272, {0x10,0x20,0x7E,0xA0,0x52,0xA0,0x7C,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0xA0,0x24,0x20,0x3C,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x5273, {0x34,0x20,0x35,0xA0,0x7F,0xA0,0x3C,0xA0,0x1C,0xA0,0x12,0xA0,0x3F,0xA0,0x60,0xA0,0x7E,0xA0,0x32,0x20,0x3E,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x5274, {0x10,0x20,0x34,0xA0,0x3C,0xA0,0x3C,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x2C,0x20,0x3C,0x20,0x70,0x60,0x00,0x00,}}, +{ 0x5275, {0x08,0x20,0x0C,0xA0,0x1A,0xA0,0x3F,0xA0,0x52,0xA0,0x1E,0xA0,0x12,0xA0,0x1E,0xA0,0x20,0xA0,0x3E,0x20,0x5E,0x20,0x12,0x60,0x00,0x00,}}, +{ 0x527D, {0x00,0x20,0x7E,0xA0,0x7C,0xA0,0x7E,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x32,0x20,0x52,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x527F, {0x29,0x20,0x5A,0xE0,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x29,0xE0,0x3F,0xE0,0x08,0xE0,0x7F,0xE0,0x1E,0x20,0x69,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x5283, {0x08,0x20,0x3E,0xA0,0x7F,0xA0,0x7F,0xA0,0x3E,0xA0,0x3E,0xA0,0x7F,0xA0,0x3E,0xA0,0x3E,0xA0,0x3E,0x20,0x0E,0x20,0x70,0x60,0x00,0x00,}}, +{ 0x5287, {0x08,0x20,0x0E,0xA0,0x3E,0xA0,0x2E,0xA0,0x3E,0xA0,0x2C,0xA0,0x38,0xA0,0x2E,0xA0,0x3E,0x20,0x3D,0x20,0x44,0x20,0x18,0x60,0x00,0x00,}}, +{ 0x5288, {0x01,0x80,0x79,0x80,0x7B,0xC0,0x7F,0xE0,0x79,0x80,0x6B,0xC0,0xF9,0x80,0x61,0x80,0x7F,0xC0,0x08,0x40,0x30,0x40,0x61,0x80,0x00,0x00,}}, +{ 0x5289, {0x20,0x20,0x7E,0xA0,0x6A,0xA0,0x7A,0xA0,0xD6,0xA0,0x28,0xA0,0x7C,0xA0,0x92,0xA0,0x7F,0xA0,0x38,0x20,0x1E,0x20,0xE0,0x60,0x00,0x00,}}, +{ 0x528D, {0x08,0x20,0x08,0xA0,0x14,0xA0,0x3E,0xA0,0x40,0xA0,0x3E,0xA0,0x3A,0xA0,0x3E,0xA0,0x34,0xA0,0x3E,0x20,0x29,0x20,0x51,0x60,0x00,0x00,}}, +{ 0x5291, {0x08,0x20,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x3D,0xE0,0x3E,0xE0,0x72,0xE0,0x3E,0xE0,0x3E,0xE0,0x3E,0x20,0x22,0x20,0x42,0x60,0x00,0x00,}}, +{ 0x5292, {0x08,0x00,0x09,0xE0,0x14,0xE0,0x3E,0xE0,0x40,0xE0,0x3F,0xE0,0x3B,0xE0,0x3E,0xE0,0x34,0xA0,0x3E,0xA0,0x2B,0x20,0x52,0x40,0x00,0x00,}}, +{ 0x5294, {0x10,0x00,0x13,0xC0,0x2D,0xC0,0x7F,0xC0,0x83,0xC0,0x7D,0xC0,0x75,0xC0,0x7D,0xC0,0x69,0x60,0x7D,0x60,0x56,0x40,0xA4,0x80,0x00,0x00,}}, +{ 0x529B, {0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xE0,0x04,0x20,0x04,0x20,0x04,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x20,0x20,0x40,0x40,0x00,0x00,}}, +{ 0x529F, {0x01,0x00,0x01,0x00,0x79,0x00,0x11,0x00,0x17,0xE0,0x11,0x20,0x11,0x20,0x11,0x20,0x1A,0x20,0x62,0x20,0x04,0x20,0x08,0x40,0x00,0x00,}}, +{ 0x52A0, {0x20,0x00,0x20,0x00,0x21,0xE0,0xFD,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0xE0,0x45,0x20,0x98,0x00,0x00,0x00,}}, +{ 0x52A3, {0x04,0x00,0x24,0x80,0x24,0xC0,0x4D,0x20,0x06,0x20,0x1A,0x00,0xE2,0x00,0x3F,0xC0,0x04,0x40,0x08,0x40,0x30,0x40,0xC0,0x80,0x00,0x00,}}, +{ 0x52A9, {0x00,0x80,0x38,0x80,0x28,0x80,0x3F,0xE0,0x28,0xA0,0x28,0xA0,0x38,0xA0,0x28,0xA0,0x2D,0x20,0x31,0x20,0x42,0x20,0x04,0x40,0x00,0x00,}}, +{ 0x52AA, {0x20,0x00,0x27,0xC0,0xFA,0x40,0x29,0x40,0x71,0x80,0x1A,0x80,0x24,0x60,0xC4,0x00,0x7F,0x80,0x08,0x80,0x10,0x80,0x23,0x80,0x00,0x00,}}, +{ 0x52AB, {0x10,0x80,0x10,0x80,0x3C,0x80,0x13,0xE0,0x10,0xA0,0x7E,0xA0,0x10,0xA0,0x18,0xA0,0x25,0x20,0x3F,0x20,0x62,0x20,0x04,0x40,0x00,0x00,}}, +{ 0x52AC, {0x30,0x80,0x30,0x80,0x3C,0x80,0x3F,0xE0,0x25,0xA0,0x74,0xA0,0x34,0xA0,0x34,0xA0,0x35,0x20,0x35,0x20,0x06,0x20,0x1C,0x40,0x00,0x00,}}, +{ 0x52AD, {0x00,0x80,0x7C,0x80,0x34,0x80,0x37,0xE0,0x25,0xA0,0x58,0xA0,0x00,0xA0,0x3C,0xA0,0x25,0x20,0x25,0x20,0x3E,0x20,0x24,0x40,0x00,0x00,}}, +{ 0x52B1, {0x06,0x80,0x78,0x80,0x40,0x80,0x7F,0xE0,0x50,0xA0,0x50,0xA0,0x5C,0xA0,0x54,0xA0,0x55,0x20,0x55,0x20,0x66,0x20,0x8C,0xC0,0x00,0x00,}}, +{ 0x52B4, {0x28,0x80,0x15,0x00,0x7F,0xE0,0x44,0x40,0x84,0x00,0x04,0x00,0x7F,0x80,0x04,0x80,0x08,0x80,0x08,0x80,0x10,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x52B5, {0x04,0x00,0x24,0x80,0x3F,0xC0,0x7F,0xC0,0x0A,0x00,0xFF,0xE0,0x19,0x00,0x39,0x80,0xFF,0xE0,0x99,0xA0,0x31,0x80,0x23,0x00,0x00,0x00,}}, +{ 0x52B9, {0x10,0x80,0x10,0x80,0x7C,0x80,0x0B,0xE0,0x24,0xA0,0x26,0xA0,0x54,0xA0,0x18,0xA0,0x09,0x20,0x15,0x20,0x22,0x20,0x44,0x40,0x00,0x00,}}, +{ 0x52BC, {0x10,0x80,0x10,0x80,0x7C,0x80,0x7F,0xE0,0x11,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0xA0,0x25,0x20,0x25,0x20,0x3E,0x20,0x24,0x40,0x00,0x00,}}, +{ 0x52BE, {0x10,0x80,0x10,0x80,0x7E,0x80,0x13,0xE0,0x68,0xA0,0x28,0xA0,0x14,0xA0,0x24,0xA0,0x09,0x20,0x15,0x20,0x22,0x20,0x44,0x40,0x00,0x00,}}, +{ 0x52C1, {0x00,0x80,0x7E,0x80,0x34,0x80,0x7F,0xE0,0x79,0xA0,0x34,0xA0,0x34,0xA0,0x00,0xA0,0x7E,0xA0,0x11,0x20,0x1D,0x20,0x72,0x40,0x00,0x00,}}, +{ 0x52C3, {0x10,0x80,0x7C,0x80,0x10,0x80,0x3F,0xE0,0x44,0xA0,0x7C,0xA0,0x08,0xA0,0x10,0xA0,0x1D,0x20,0x71,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x52C5, {0x10,0x80,0x10,0x80,0x7E,0x80,0x11,0xE0,0x3C,0xA0,0x34,0xA0,0x3C,0xA0,0x18,0xA0,0x35,0x20,0x51,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x52C7, {0x3F,0x00,0x1E,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x08,0x40,0x10,0x40,0x61,0x80,0x00,0x00,}}, +{ 0x52C9, {0x21,0x00,0x31,0x00,0x59,0x00,0xB7,0xC0,0x79,0x40,0x69,0x40,0x79,0x40,0x72,0x40,0x34,0x40,0x38,0xC0,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x52CD, {0x10,0x80,0x18,0x80,0x7E,0x80,0x3F,0xE0,0x25,0xA0,0x24,0xA0,0x3C,0xA0,0x18,0xA0,0x3D,0x20,0x35,0x20,0x52,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x52D2, {0x38,0x80,0x38,0x80,0x7E,0x80,0x3B,0xE0,0x19,0xA0,0x3C,0xA0,0x34,0xA0,0x3C,0xA0,0x7F,0x20,0x7F,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x52D5, {0x0C,0x80,0x30,0x80,0x7C,0x80,0x3F,0xE0,0x34,0xA0,0x3C,0xA0,0x34,0xA0,0x3C,0xA0,0x11,0x20,0x3D,0x20,0x1E,0x20,0x74,0x40,0x00,0x00,}}, +{ 0x52D7, {0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x3C,0x80,0x24,0x80,0x3F,0xE0,0x3C,0xA0,0x3D,0x20,0x3F,0x20,0x62,0x40,0x00,0x00,}}, +{ 0x52D8, {0x24,0x80,0x24,0x80,0x7F,0xE0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x24,0xA0,0x7F,0xA0,0x38,0xA0,0x3D,0x20,0x3F,0x20,0x22,0x40,0x00,0x00,}}, +{ 0x52D9, {0x02,0x00,0x7A,0x00,0x33,0xE0,0x2E,0x80,0xF9,0x00,0x32,0x80,0x6C,0x60,0x61,0x00,0xAF,0xC0,0x22,0x40,0x24,0x40,0x28,0x80,0x00,0x00,}}, +{ 0x52DD, {0x01,0x00,0x75,0x40,0x5F,0xE0,0x52,0x80,0x7F,0xE0,0x52,0x80,0x55,0x40,0x79,0x20,0x5F,0xE0,0x52,0x40,0x54,0x40,0xB8,0xC0,0x00,0x00,}}, +{ 0x52DE, {0x21,0x80,0x31,0xC0,0x6B,0xC0,0xE7,0x80,0x71,0x80,0x4A,0x40,0x7F,0xE0,0xC8,0x40,0xBF,0x80,0x18,0x80,0x30,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x52DF, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x28,0x80,0xDF,0x60,0x09,0x00,0x33,0x00,0x00,0x00,}}, +{ 0x52E0, {0x00,0x80,0x7E,0x80,0x7E,0x80,0x7F,0xE0,0x5B,0xA0,0x14,0xA0,0x62,0xA0,0x1A,0xA0,0x3D,0x20,0x3D,0x20,0x1A,0x20,0x34,0x40,0x00,0x00,}}, +{ 0x52E2, {0x21,0x00,0x79,0x00,0x27,0x80,0xF9,0x80,0x77,0x80,0xF9,0x80,0x22,0xA0,0xFC,0x60,0x08,0x00,0x7F,0x80,0x10,0x80,0x63,0x80,0x00,0x00,}}, +{ 0x52E3, {0x10,0x80,0x7E,0x80,0x3C,0x80,0x3D,0xE0,0x7F,0xA0,0x3C,0xA0,0x24,0xA0,0x3C,0xA0,0x3C,0xA0,0x3D,0x20,0x35,0x20,0x62,0x40,0x00,0x00,}}, +{ 0x52E4, {0x28,0x80,0x7E,0x80,0x28,0x80,0x3F,0xE0,0x34,0xA0,0x3C,0xA0,0x10,0xA0,0x3C,0xA0,0x10,0xA0,0x3D,0x20,0x1D,0x20,0x62,0x40,0x00,0x00,}}, +{ 0x52E6, {0x34,0x80,0x78,0x80,0x3C,0x80,0x3F,0xE0,0x3D,0xA0,0x34,0xA0,0x3C,0xA0,0x18,0xA0,0x7D,0x20,0x3D,0x20,0x52,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x52E7, {0x20,0x80,0x20,0x80,0x3F,0xE0,0x7E,0xA0,0x38,0xA0,0x3E,0xA0,0x68,0xA0,0x3E,0xA0,0x3C,0xA0,0x3F,0x20,0x3F,0x20,0x22,0x40,0x00,0x00,}}, +{ 0x52F2, {0x09,0x00,0xF1,0x00,0xF9,0x00,0x7F,0xC0,0x79,0x40,0x69,0x40,0x79,0x40,0xFA,0x40,0x3E,0xC0,0xE0,0x80,0x52,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x52F3, {0x0C,0x80,0x78,0x80,0x7E,0x80,0x7F,0xE0,0x7F,0xA0,0x7A,0xA0,0x7E,0xA0,0x18,0xA0,0x7E,0xA0,0x7D,0x20,0x7D,0x20,0x7A,0x40,0x00,0x00,}}, +{ 0x52F5, {0x00,0xC0,0x3F,0xC0,0x3E,0xC0,0x3F,0xE0,0x3F,0xE0,0x35,0xE0,0x3F,0xE0,0x3D,0xE0,0x3F,0xE0,0x3F,0xE0,0x3F,0xA0,0x71,0xE0,0x00,0x00,}}, +{ 0x52F8, {0x38,0x80,0x7E,0x80,0x7C,0x80,0x7F,0xE0,0x7F,0xA0,0x28,0xA0,0x3E,0xA0,0x68,0xA0,0x7C,0xA0,0x3D,0x20,0x29,0x20,0x3E,0x40,0x00,0x00,}}, +{ 0x52F9, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x1F,0xE0,0x30,0x20,0x20,0x20,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x60,0x00,0xC0,0x00,0x00,}}, +{ 0x52FA, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x10,0x20,0x20,0x20,0x28,0x20,0x44,0x20,0x02,0x20,0x02,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x52FE, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x20,0x20,0x24,0x20,0x44,0x20,0x0A,0x20,0x09,0x20,0x13,0xA0,0x3C,0x20,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x52FF, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x14,0xA0,0x14,0xA0,0x24,0xA0,0x48,0xA0,0x09,0x20,0x11,0x20,0x02,0x20,0x04,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x5301, {0x10,0x00,0x10,0x00,0x1F,0xC0,0x12,0x40,0x1A,0x40,0x26,0x40,0x22,0x40,0x45,0xC0,0x04,0x60,0x08,0x40,0x10,0x40,0x01,0x80,0x00,0x00,}}, +{ 0x5302, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x20,0x20,0x30,0x20,0x53,0x20,0x1C,0x20,0x10,0x20,0x10,0xA0,0x0F,0xA0,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x5305, {0x20,0x00,0x20,0x00,0x3F,0xC0,0x40,0x40,0x7E,0x40,0x82,0x40,0x02,0x40,0x7E,0x40,0x42,0x80,0x40,0x20,0x40,0x20,0x3F,0xE0,0x00,0x00,}}, +{ 0x5306, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x1F,0xE0,0x34,0xA0,0x3C,0xA0,0x4B,0xA0,0x09,0xA0,0x11,0x20,0x02,0x20,0x04,0x60,0x00,0xC0,0x00,0x00,}}, +{ 0x5308, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x1F,0xE0,0x32,0x20,0x32,0xA0,0x7E,0xA0,0x37,0xA0,0x39,0xA0,0x3F,0xA0,0x31,0xA0,0x00,0xC0,0x00,0x00,}}, +{ 0x530D, {0x10,0x00,0x18,0x00,0x3F,0xE0,0x3F,0xA0,0x44,0x20,0x1F,0xA0,0x34,0xA0,0x3F,0xA0,0x3F,0xA0,0x3F,0xA0,0x35,0xA0,0x00,0xC0,0x00,0x00,}}, +{ 0x530F, {0x21,0x00,0x31,0x00,0xFF,0xC0,0x6B,0xC0,0x7F,0x40,0x83,0xC0,0xFB,0xC0,0x63,0xC0,0x7A,0x80,0x0A,0x20,0x0A,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x5310, {0x10,0x00,0x18,0x00,0x3F,0xE0,0x3F,0x20,0x5F,0x20,0x11,0x20,0x1F,0x20,0x3F,0xA0,0x3F,0xA0,0x3F,0xA0,0x3F,0xA0,0x30,0xC0,0x00,0x00,}}, +{ 0x5315, {0x60,0x00,0x60,0x00,0x60,0x40,0x60,0x80,0x63,0x00,0x6C,0x00,0x70,0x00,0xE0,0x00,0x60,0x00,0x60,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x5316, {0x12,0x00,0x12,0x00,0x12,0x40,0x22,0x40,0x22,0x80,0x63,0x00,0xA2,0x00,0x22,0x00,0x22,0x00,0x22,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x5317, {0x12,0x00,0x12,0x00,0x12,0x40,0xF2,0x40,0x12,0x80,0x13,0x00,0x12,0x00,0x12,0x00,0x32,0x00,0xD2,0x20,0x12,0x20,0x11,0xE0,0x00,0x00,}}, +{ 0x5319, {0x01,0x00,0x7D,0x00,0x45,0x00,0x7D,0x40,0x7D,0x40,0x01,0x80,0xFF,0x00,0x11,0x00,0x5D,0x20,0x71,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x531A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x531D, {0x00,0x00,0x7F,0xE0,0x42,0x00,0x5F,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x53,0x80,0x42,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5320, {0x00,0x00,0x7F,0xC0,0x43,0x00,0x5C,0x00,0x50,0x00,0x5F,0xC0,0x51,0x00,0x51,0x00,0x61,0x00,0x61,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5321, {0x00,0x00,0x7F,0xE0,0x40,0x00,0x5F,0xC0,0x42,0x00,0x5F,0x80,0x42,0x00,0x42,0x00,0x5F,0xC0,0x40,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5323, {0x00,0x00,0x7F,0xC0,0x4F,0x80,0x5F,0x80,0x5F,0x80,0x52,0x80,0x5F,0x80,0x52,0x80,0x42,0x00,0x42,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x532A, {0x00,0x00,0x7F,0xE0,0x45,0x00,0x5D,0xC0,0x45,0x00,0x7D,0xC0,0x45,0x00,0x7D,0xC0,0x49,0x00,0x51,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x532F, {0x00,0x00,0x7F,0xC0,0x52,0x80,0x57,0xC0,0x7D,0x80,0x67,0xC0,0x45,0x80,0x57,0xC0,0x57,0xC0,0x67,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5331, {0x00,0x00,0x7F,0xE0,0x4F,0x80,0x5F,0x80,0x7F,0xE0,0x5F,0x80,0x50,0x80,0x5F,0x80,0x5F,0x80,0x5F,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5333, {0x00,0x00,0x7F,0xC0,0x46,0x00,0x5F,0x80,0x70,0x40,0x5D,0x80,0x55,0x80,0x5D,0x80,0x49,0x80,0x56,0x40,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5338, {0x00,0x00,0xFF,0xE0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x5339, {0x00,0x00,0x7F,0xC0,0x49,0x00,0x49,0x00,0x49,0x00,0x49,0x00,0x51,0x40,0x51,0x40,0x60,0xC0,0x40,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x533A, {0x00,0x00,0x7F,0xC0,0x40,0x80,0x41,0x00,0x71,0x00,0x4E,0x00,0x42,0x00,0x45,0x00,0x48,0x80,0x50,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x533B, {0x00,0x00,0x7F,0xC0,0x48,0x00,0x4F,0x80,0x52,0x00,0x62,0x00,0x7F,0xC0,0x45,0x00,0x44,0x80,0x58,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x533F, {0x00,0x00,0x7F,0xC0,0x49,0x00,0x5F,0x80,0x44,0x00,0x7F,0xC0,0x48,0x00,0x5F,0x80,0x68,0x80,0x4F,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5340, {0x00,0x00,0xFF,0xC0,0x47,0x00,0x4F,0x80,0x4F,0x80,0x40,0x00,0x7D,0xC0,0x75,0x40,0x7D,0xC0,0x40,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5341, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5343, {0x01,0x00,0x02,0x00,0x3C,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5345, {0x64,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0xFF,0xE0,0x64,0x80,0x64,0x80,0x64,0x80,0x44,0x80,0x44,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x5346, {0x08,0x00,0x08,0x00,0x7F,0x00,0x11,0x20,0x31,0x20,0x25,0xE0,0x44,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5347, {0x05,0x00,0x19,0x00,0x71,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x5348, {0x20,0x00,0x20,0x00,0x3F,0x80,0x44,0x00,0x44,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5349, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x7F,0xC0,0x24,0x00,0x25,0x80,0x21,0x80,0xFF,0xE0,0x21,0x80,0x21,0x80,0x61,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x534A, {0x04,0x00,0x04,0x00,0x24,0x80,0x15,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x534D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x7F,0xC0,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x47,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x5351, {0x08,0x00,0x10,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x11,0x00,0x21,0x00,0xFF,0xE0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5352, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x21,0x00,0x31,0x00,0x2A,0x80,0x4C,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5353, {0x04,0x00,0x04,0x00,0x07,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5354, {0x21,0x00,0x21,0x00,0x2F,0xC0,0xF2,0x40,0x24,0x40,0x28,0x80,0x28,0x80,0x3F,0xE0,0x2A,0xA0,0x3A,0xA0,0x33,0xA0,0x27,0x60,0x00,0x00,}}, +{ 0x5357, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x51,0x40,0x4A,0x40,0x7F,0x40,0x44,0x40,0x5F,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x5358, {0x28,0x80,0x15,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x535A, {0x41,0x40,0x5F,0xE0,0x4F,0xC0,0xF9,0x40,0x4F,0xC0,0x49,0x40,0x4F,0xC0,0x40,0x80,0x5F,0xE0,0x44,0x80,0x42,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x535C, {0x08,0x00,0x08,0x00,0x08,0x00,0x0C,0x00,0x0A,0x00,0x09,0x00,0x09,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x535E, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x06,0x00,0x05,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5360, {0x08,0x00,0x08,0x00,0x0F,0xC0,0x08,0x00,0x08,0x00,0x08,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x5366, {0x10,0x80,0x10,0x80,0x7C,0x80,0x10,0x80,0x10,0x80,0xFE,0xC0,0x10,0xA0,0x10,0xA0,0x7E,0x80,0x10,0x80,0x1E,0x80,0xF0,0x80,0x00,0x00,}}, +{ 0x5369, {0x00,0x00,0x3F,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x27,0x00,0x26,0x00,0x20,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x536E, {0x00,0xC0,0x03,0x00,0x7C,0x00,0x7F,0xE0,0x60,0x00,0x6F,0x80,0x68,0x80,0x68,0x80,0x69,0x80,0x49,0x20,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x536F, {0x04,0x00,0x08,0x00,0x31,0xE0,0x25,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x3D,0x20,0x69,0xC0,0x09,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x5370, {0x04,0x00,0x18,0x00,0x63,0xC0,0x42,0x40,0x7A,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x7A,0x40,0x43,0x80,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5371, {0x08,0x00,0x1F,0x00,0xE2,0x00,0x3F,0xE0,0x20,0x00,0x2F,0x80,0x28,0x80,0x28,0x80,0x29,0x80,0x49,0x20,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x5373, {0x00,0x00,0x3D,0xE0,0x25,0x20,0x3D,0x20,0x25,0x20,0x25,0x20,0x3D,0x20,0x29,0x20,0x2D,0x20,0x35,0xE0,0x65,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5374, {0x10,0x00,0x10,0xE0,0x3C,0xA0,0x10,0xA0,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x10,0xA0,0x24,0xA0,0x2E,0xC0,0x72,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5375, {0x04,0x00,0x08,0x00,0x35,0xE0,0x25,0x20,0x35,0xA0,0x35,0x60,0x25,0x20,0x25,0x20,0x3D,0x20,0x69,0xC0,0x09,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x5377, {0x04,0x00,0x24,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x21,0x80,0x5F,0xC0,0x91,0x60,0x16,0x00,0x10,0x80,0x0F,0x80,0x00,0x00,}}, +{ 0x5378, {0x10,0x00,0x10,0xE0,0x3E,0xA0,0x48,0xA0,0x7F,0xA0,0x08,0xA0,0x2E,0xA0,0x28,0xA0,0x2E,0xA0,0x38,0xC0,0x60,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x537B, {0x10,0x00,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x18,0xA0,0x14,0xA0,0x32,0xA0,0x7E,0xA0,0x74,0xE0,0x34,0xC0,0x3C,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x537F, {0x10,0x00,0x27,0x70,0x45,0x50,0x57,0x50,0x55,0x50,0x55,0x50,0x57,0x50,0x54,0x50,0x77,0x50,0x94,0x70,0x27,0x40,0x24,0x40,0x00,0x00,}}, +{ 0x5382, {0x00,0x00,0x7F,0xE0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x00,0x00,}}, +{ 0x5384, {0x00,0x00,0x3F,0xE0,0x20,0x00,0x2F,0x80,0x28,0x80,0x28,0x80,0x28,0x80,0x28,0x80,0x29,0x00,0x48,0x20,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x5396, {0x00,0x00,0x7F,0xE0,0x6C,0x80,0x6A,0xC0,0x69,0xC0,0x7F,0x80,0x68,0xA0,0x6C,0x20,0x4C,0x40,0x54,0xA0,0xB4,0x20,0x23,0xE0,0x00,0x00,}}, +{ 0x5398, {0x00,0x00,0x7F,0xE0,0x5F,0x80,0x52,0x80,0x5F,0x80,0x52,0x80,0x5F,0x80,0x42,0x00,0x5F,0x80,0x42,0x00,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x539A, {0x00,0x00,0x7F,0xE0,0x5F,0x80,0x5F,0x80,0x50,0x80,0x5F,0x80,0x40,0x00,0x4F,0x80,0x41,0x00,0x5F,0xC0,0x82,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x539F, {0x00,0x00,0x7F,0xE0,0x44,0x00,0x4F,0x80,0x4F,0x80,0x48,0x80,0x4F,0x80,0x42,0x00,0x4A,0x80,0x4A,0x40,0x92,0x40,0x06,0x00,0x00,0x00,}}, +{ 0x53A0, {0x00,0x00,0x7F,0xE0,0x6C,0x00,0x7E,0x40,0x7F,0xC0,0x73,0xC0,0x7F,0xC0,0x73,0xC0,0x7F,0xC0,0x4D,0xC0,0x52,0x40,0xA2,0xC0,0x00,0x00,}}, +{ 0x53A5, {0x00,0x00,0x7F,0xE0,0x73,0x80,0x75,0x80,0x7F,0xE0,0x69,0xA0,0x6A,0xC0,0x7A,0x80,0x7E,0x80,0x69,0xC0,0x51,0x40,0xA2,0x20,0x00,0x00,}}, +{ 0x53A6, {0x00,0x00,0x7F,0xE0,0x7F,0xC0,0x6F,0x80,0x68,0x80,0x6F,0x80,0x6F,0x80,0x68,0x80,0x6F,0x80,0x5F,0x80,0x43,0x80,0xBD,0xC0,0x00,0x00,}}, +{ 0x53A8, {0x00,0x00,0x7F,0xE0,0x7E,0x40,0x40,0x40,0x5E,0x40,0x53,0xE0,0x53,0x40,0x5E,0xC0,0x5A,0x40,0x4C,0x40,0x4E,0x40,0xB0,0xC0,0x00,0x00,}}, +{ 0x53A9, {0x00,0x00,0x7F,0xE0,0x40,0x00,0x7D,0xC0,0x66,0x80,0x7D,0x80,0x7F,0xE0,0x61,0x80,0x69,0x80,0x6D,0xA0,0xB2,0xA0,0x24,0x60,0x00,0x00,}}, +{ 0x53AD, {0x00,0x00,0x7F,0xE0,0x7C,0x00,0x7C,0xA0,0x64,0x80,0x7F,0xE0,0x40,0x80,0x7C,0x80,0x7C,0x80,0x7D,0x80,0x66,0x40,0xAC,0x20,0x00,0x00,}}, +{ 0x53AE, {0x00,0x00,0x7F,0xE0,0x74,0x40,0x7F,0x80,0x77,0x00,0x7D,0xE0,0x75,0x80,0x7D,0x80,0x7F,0x80,0x7F,0x80,0x52,0x80,0xA2,0x80,0x00,0x00,}}, +{ 0x53B0, {0x00,0x00,0x7F,0xE0,0x69,0x80,0x7F,0x80,0x7B,0xE0,0x7F,0x40,0x63,0xC0,0x7E,0xC0,0x76,0x80,0x7E,0xC0,0x73,0x40,0xA6,0x20,0x00,0x00,}}, +{ 0x53B3, {0x24,0x40,0x12,0x80,0x7F,0xE0,0x7E,0x80,0x49,0x00,0x7F,0xE0,0x75,0x40,0x7F,0xC0,0x5C,0x80,0x7C,0x80,0x85,0x40,0x06,0x20,0x00,0x00,}}, +{ 0x53B6, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x80,0x10,0x40,0x23,0xC0,0xFC,0x20,0x00,0x20,0x00,0x00,}}, +{ 0x53BB, {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x09,0x00,0x13,0x80,0x7C,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x53C2, {0x08,0x00,0x12,0x00,0x7F,0x80,0x0C,0x00,0xFF,0xE0,0x13,0x00,0x24,0x80,0x5B,0x40,0x86,0x20,0x19,0x00,0x06,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x53C3, {0x04,0x00,0x0B,0x00,0x3F,0x80,0x34,0xC0,0xFB,0xE0,0x11,0x00,0x62,0x80,0xCC,0x60,0x16,0x00,0x1C,0x80,0x03,0x00,0x3C,0x00,0x00,0x00,}}, +{ 0x53C8, {0x00,0x00,0x7F,0x80,0x20,0x80,0x20,0x80,0x10,0x80,0x11,0x00,0x09,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x53C9, {0x00,0x00,0x7F,0x80,0x08,0x80,0x24,0x80,0x10,0x80,0x11,0x00,0x09,0x00,0x06,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x53CA, {0x00,0x00,0x7F,0x80,0x11,0x00,0x11,0x00,0x1B,0x80,0x28,0x80,0x24,0x80,0x25,0x00,0x23,0x00,0x43,0x00,0x4C,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x53CB, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x08,0x00,0x08,0x00,0x1F,0x80,0x18,0x80,0x15,0x00,0x22,0x00,0x26,0x00,0x59,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x53CC, {0x00,0x00,0xFF,0xC0,0x0A,0x40,0x0A,0x40,0x4A,0x40,0x31,0x80,0x11,0x80,0x11,0x00,0x29,0x00,0x22,0x80,0x44,0x40,0x88,0x20,0x00,0x00,}}, +{ 0x53CD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x48,0x80,0x48,0x80,0x48,0x80,0x45,0x00,0x42,0x00,0x46,0x00,0x49,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x53CE, {0x10,0x00,0x17,0xC0,0x52,0x40,0x52,0x40,0x52,0x40,0x52,0x80,0x51,0x80,0x59,0x00,0x71,0x00,0x92,0x80,0x1C,0x40,0x10,0x20,0x00,0x00,}}, +{ 0x53D4, {0x20,0x00,0x23,0xC0,0x38,0x40,0x22,0x40,0x22,0x40,0xFA,0x40,0x21,0x80,0x29,0x80,0x65,0x80,0x62,0x80,0xA4,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x53D6, {0x00,0x00,0xFC,0x00,0x4F,0xC0,0x7A,0x40,0x4A,0x40,0x4A,0x40,0x79,0x80,0x49,0x80,0x79,0x80,0xCA,0x80,0x0C,0x40,0x08,0x20,0x00,0x00,}}, +{ 0x53D7, {0x01,0x80,0x06,0x80,0x78,0x80,0x25,0x00,0x7F,0xE0,0x40,0x40,0xBF,0x80,0x11,0x00,0x0A,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x53D9, {0x20,0x00,0x27,0xC0,0x52,0x40,0x4A,0x40,0xFA,0x40,0x21,0x40,0xFD,0x80,0x21,0x80,0x71,0x80,0x6A,0x80,0xA4,0x40,0x68,0x20,0x00,0x00,}}, +{ 0x53DB, {0x20,0x00,0x2B,0xE0,0xBA,0x00,0x73,0xC0,0xFA,0x40,0x22,0x40,0x23,0x40,0x3D,0x80,0xE5,0x80,0x29,0x80,0x4A,0x40,0x90,0x20,0x00,0x00,}}, +{ 0x53DF, {0x14,0x00,0x65,0xC0,0x75,0xC0,0x75,0xC0,0x44,0x40,0x7F,0xC0,0x04,0x00,0x7F,0x80,0x19,0x00,0x06,0x00,0x1B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x53E1, {0x20,0x00,0x3B,0xC0,0xFC,0x40,0xF9,0x40,0x75,0x40,0xE9,0x40,0x7C,0x80,0xC8,0x80,0x78,0x80,0x79,0x40,0x4A,0x40,0x7C,0x20,0x00,0x00,}}, +{ 0x53E2, {0x2A,0x80,0x1B,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x78,0x00,0x7F,0xC0,0x7B,0x80,0xCB,0x80,0x0C,0x60,0x00,0x00,}}, +{ 0x53E3, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x53E4, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x53E5, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x30,0x20,0x3F,0x20,0x51,0x20,0x11,0x20,0x11,0x20,0x1F,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x53E8, {0x00,0x00,0x0F,0xE0,0x71,0x20,0x51,0x20,0x51,0x20,0x51,0x20,0x51,0x20,0x51,0x20,0x73,0x20,0x72,0x20,0x44,0x20,0x08,0x40,0x00,0x00,}}, +{ 0x53E9, {0x00,0x00,0x01,0xE0,0x79,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x49,0x20,0x79,0x20,0x49,0x20,0x01,0xC0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x53EA, {0x00,0x00,0x1F,0xC0,0x10,0x40,0x10,0x40,0x10,0x40,0x10,0x40,0x1F,0xC0,0x00,0x40,0x08,0x80,0x08,0x40,0x10,0x20,0x60,0x20,0x00,0x00,}}, +{ 0x53EB, {0x00,0x80,0x00,0x80,0xE4,0x80,0xA4,0x80,0xA4,0x80,0xA4,0x80,0xA4,0x80,0xA4,0xE0,0xE7,0x80,0x98,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x53EC, {0x00,0x00,0x7F,0xE0,0x04,0x20,0x0C,0x20,0x18,0x20,0x60,0xC0,0x00,0x00,0x1F,0xC0,0x10,0x40,0x10,0x40,0x1F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x53ED, {0x07,0x80,0x01,0x80,0xE1,0x80,0xA5,0x80,0xA5,0x80,0xA5,0x80,0xA4,0x80,0xA4,0x80,0xE4,0x80,0x88,0x40,0x10,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x53EE, {0x00,0x00,0x1F,0xE0,0xE1,0x80,0xA1,0x80,0xA1,0x80,0xA1,0x80,0xA1,0x80,0xA1,0x80,0xE1,0x80,0xE1,0x80,0x81,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x53EF, {0x00,0x00,0xFF,0xE0,0x00,0x80,0x3C,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x3C,0x80,0x24,0x80,0x00,0x80,0x00,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x53F0, {0x04,0x00,0x04,0x00,0x08,0x00,0x11,0x80,0xFF,0x40,0x00,0x20,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x53F1, {0x02,0x00,0x02,0x00,0xF2,0x00,0x92,0x40,0x92,0x40,0x92,0x80,0x93,0x00,0x9E,0x00,0xF2,0x00,0x82,0x20,0x02,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x53F2, {0x04,0x00,0x04,0x00,0x7F,0x80,0x44,0x80,0x44,0x80,0x44,0x80,0x7F,0x80,0x44,0x80,0x18,0x00,0x0C,0x00,0x33,0x00,0xC0,0xE0,0x00,0x00,}}, +{ 0x53F3, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x10,0x00,0x10,0x00,0x20,0x00,0x3F,0x80,0x60,0x80,0x60,0x80,0xA0,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x53F6, {0x01,0x00,0x01,0x00,0xE1,0x00,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xA1,0x00,0xA1,0x00,0xE1,0x00,0x81,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x53F7, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x20,0x80,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x53F8, {0x00,0x00,0x7F,0xE0,0x00,0x20,0x3F,0x20,0x00,0x20,0x3F,0x20,0x21,0x20,0x21,0x20,0x3F,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x53FA, {0x07,0x00,0x01,0x00,0xE1,0x00,0xA1,0x00,0xA1,0x00,0xA3,0x00,0xA3,0x80,0xA3,0x80,0xE4,0x80,0x88,0x80,0x10,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x5401, {0x00,0x00,0x0F,0xC0,0xE1,0x00,0xA1,0x00,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xA1,0x00,0xE1,0x00,0xE1,0x00,0x81,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5403, {0x04,0x00,0x04,0x00,0xE7,0xE0,0xA8,0x00,0xA8,0x00,0xB7,0x80,0xA1,0x00,0xA2,0x00,0xE4,0x00,0x88,0x20,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x5404, {0x08,0x00,0x08,0x00,0x1F,0x80,0x29,0x00,0x46,0x00,0x09,0x00,0x30,0x80,0xDF,0x60,0x11,0x00,0x11,0x00,0x1F,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x5408, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xDF,0x60,0x00,0x00,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5409, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x540A, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x540B, {0x00,0x80,0x00,0x80,0xE0,0x80,0xBF,0xE0,0xA0,0x80,0xA4,0x80,0xA2,0x80,0xA2,0x80,0xE0,0x80,0x80,0x80,0x01,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x540C, {0x00,0x00,0x7F,0xE0,0x40,0x20,0x5F,0xA0,0x40,0x20,0x5F,0xA0,0x50,0xA0,0x50,0xA0,0x5F,0xA0,0x50,0xA0,0x40,0x20,0x40,0x60,0x00,0x00,}}, +{ 0x540D, {0x04,0x00,0x04,0x00,0x0F,0xC0,0x08,0x80,0x15,0x00,0x22,0x00,0x04,0x00,0x0F,0xE0,0x18,0x20,0x68,0x20,0x0F,0xE0,0x08,0x20,0x00,0x00,}}, +{ 0x540E, {0x01,0xC0,0x7F,0x00,0x40,0x00,0x7F,0xE0,0x40,0x00,0x40,0x00,0x4F,0x80,0x48,0x80,0x48,0x80,0x48,0x80,0x8F,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x540F, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x34,0x80,0x0C,0x00,0x0A,0x00,0x31,0x00,0xC0,0xE0,0x00,0x00,}}, +{ 0x5410, {0x01,0x00,0x01,0x00,0xE1,0x00,0xAF,0xC0,0xA1,0x00,0xA1,0x00,0xA1,0x00,0xA1,0x00,0xE1,0x00,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5411, {0x08,0x00,0x10,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x5F,0x40,0x51,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x541B, {0x00,0x00,0x3F,0x00,0x09,0x00,0xFF,0xE0,0x09,0x00,0x09,0x00,0x3F,0x00,0x10,0x00,0x3F,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x541D, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x09,0x00,0x06,0x00,0x19,0x00,0xE0,0xE0,0x3F,0x80,0x21,0x80,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x541F, {0x01,0x00,0x01,0x00,0xE2,0x80,0xA4,0x40,0xAF,0xC0,0xB0,0x20,0xA0,0x00,0xAF,0xC0,0xE0,0x40,0x80,0x80,0x00,0x80,0x01,0x00,0x00,0x00,}}, +{ 0x5420, {0x01,0x00,0x01,0x80,0xE1,0x40,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xA1,0x00,0xA3,0x00,0xE2,0x80,0x84,0x80,0x18,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x5426, {0x00,0x00,0xFF,0xE0,0x06,0x00,0x0D,0x80,0x34,0x40,0xC4,0x20,0x04,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5429, {0x01,0x80,0x05,0x80,0xE5,0x80,0xA8,0x80,0xA8,0x80,0xBF,0xC0,0xA2,0xA0,0xA2,0x80,0xE6,0x80,0xE4,0x80,0x88,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x542B, {0x04,0x00,0x04,0x00,0x0A,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x00,0x01,0x00,0x02,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x542C, {0x00,0x40,0x01,0x80,0xE6,0x00,0xA4,0x00,0xA7,0xE0,0xA5,0x80,0xA5,0x80,0xA5,0x80,0xE5,0x80,0xE9,0x80,0x91,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x542D, {0x01,0x00,0x01,0x00,0xFF,0xE0,0xBF,0xE0,0xA7,0x00,0xA5,0x80,0xA5,0x80,0xA5,0x80,0xE5,0x80,0x89,0xA0,0x09,0xA0,0x10,0xE0,0x00,0x00,}}, +{ 0x542E, {0x01,0x00,0x03,0x00,0xE2,0x40,0xA4,0xE0,0xBF,0xA0,0xA3,0x80,0xA3,0x80,0xA3,0x80,0xE7,0x80,0xE5,0xA0,0x89,0xA0,0x10,0xE0,0x00,0x00,}}, +{ 0x5436, {0x03,0x80,0x00,0x80,0x73,0xE0,0x57,0xE0,0x54,0xA0,0x54,0xA0,0x55,0x60,0x55,0x60,0x76,0x20,0x74,0x20,0x44,0x20,0x04,0x60,0x00,0x00,}}, +{ 0x5438, {0x00,0x00,0x1F,0x80,0xE4,0x80,0xA5,0x80,0xA7,0xC0,0xA6,0x40,0xA6,0x40,0xE9,0x80,0x89,0x80,0x11,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x5439, {0x04,0x00,0x04,0x00,0xE4,0x00,0xA7,0xE0,0xA9,0x40,0xA9,0x80,0xB1,0x00,0xA3,0x00,0xE2,0x80,0x84,0x80,0x08,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x543B, {0x02,0x00,0x02,0x00,0x73,0xE0,0x55,0x60,0x55,0x60,0x59,0x60,0x52,0xA0,0x52,0xA0,0x74,0xA0,0x49,0x20,0x02,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x543C, {0x01,0x80,0x1F,0x80,0xE3,0x80,0xA3,0x80,0xA5,0x80,0xA5,0x80,0xA7,0x80,0xBD,0x80,0xE5,0x80,0x85,0xA0,0x05,0xA0,0x0C,0xE0,0x00,0x00,}}, +{ 0x543D, {0x01,0x00,0x05,0x00,0xE5,0x00,0xA7,0xC0,0xAB,0x00,0xA9,0x00,0xB1,0x00,0xBF,0xE0,0xE1,0x00,0xE1,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x543E, {0x00,0x00,0x7F,0xC0,0x08,0x00,0x3F,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5440, {0x00,0x00,0x0F,0xC0,0xE1,0x80,0xA9,0x80,0xA9,0x80,0xAF,0xE0,0xA1,0x80,0xA3,0x80,0xE7,0x80,0xE9,0x80,0x91,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x5442, {0x00,0x00,0x1F,0x80,0x10,0x80,0x10,0x80,0x1F,0x80,0x12,0x80,0x04,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x00,}}, +{ 0x5446, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5448, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5449, {0x00,0x00,0x0F,0x80,0x28,0x80,0x28,0x80,0x2F,0x80,0x20,0x00,0x3F,0x80,0x00,0x80,0xFF,0xE0,0x11,0x00,0x20,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x544A, {0x04,0x00,0x24,0x00,0x3F,0x80,0x44,0x00,0x44,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x544E, {0x00,0x00,0x07,0xC0,0xE4,0x40,0xA4,0x40,0xA4,0x40,0xA7,0xC0,0xA6,0x40,0xE5,0x00,0x89,0x00,0x18,0x80,0x30,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x5451, {0x01,0x80,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x11,0x00,0x60,0x80,0xBF,0xE0,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x545F, {0x01,0x00,0x01,0x00,0xFF,0xE0,0xBF,0xE0,0xA1,0x80,0xAA,0x80,0xA6,0x80,0xA3,0x80,0xE1,0x80,0xE2,0x40,0x84,0xE0,0x1F,0x20,0x00,0x00,}}, +{ 0x5468, {0x00,0x00,0x3F,0xE0,0x22,0x20,0x2F,0xA0,0x22,0x20,0x3F,0xA0,0x20,0x20,0x2F,0xA0,0x28,0xA0,0x2F,0xA0,0x28,0xA0,0x40,0x60,0x00,0x00,}}, +{ 0x546A, {0x00,0x00,0x0F,0xC0,0xE8,0x40,0xA8,0x40,0xAF,0xC0,0xAB,0x40,0xA3,0x00,0xA3,0x00,0xE5,0x00,0x89,0x20,0x11,0x20,0x20,0xE0,0x00,0x00,}}, +{ 0x5470, {0x22,0x00,0x22,0x40,0x7F,0x80,0x7F,0x00,0x62,0x20,0x7A,0x20,0x61,0xE0,0xC0,0x00,0x3F,0x80,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x5471, {0x00,0x40,0x01,0x80,0xEF,0x80,0xAB,0x80,0xAB,0x80,0xAB,0x80,0xAB,0x80,0xAA,0x80,0xEA,0x80,0xFB,0xC0,0x9F,0xC0,0x20,0xA0,0x00,0x00,}}, +{ 0x5473, {0x01,0x00,0x01,0x00,0xEF,0xC0,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xA3,0x00,0xA5,0x80,0xE9,0x40,0xB1,0x20,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5475, {0x00,0x00,0x1F,0xE0,0xE0,0x40,0xAE,0x40,0xAB,0x40,0xA9,0x40,0xA9,0x40,0xAB,0x40,0xEF,0x40,0xE0,0x40,0x80,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x5476, {0x08,0x00,0x08,0x00,0xEB,0xC0,0xFF,0x40,0xF7,0x40,0xF5,0x40,0xF5,0x80,0xF4,0x80,0xEC,0x80,0xEB,0xC0,0x93,0x40,0x22,0x20,0x00,0x00,}}, +{ 0x5477, {0x00,0x00,0x07,0xE0,0x74,0xA0,0x54,0xA0,0x57,0xE0,0x54,0xA0,0x54,0xA0,0x55,0xA0,0x77,0xE0,0x40,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x547B, {0x00,0x80,0x01,0x80,0x77,0xE0,0x54,0xA0,0x57,0xE0,0x54,0xA0,0x54,0xA0,0x57,0xE0,0x74,0xA0,0x40,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x547C, {0x00,0xC0,0x0F,0x00,0xE1,0x40,0xA5,0x40,0xA5,0x80,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xE1,0x00,0x81,0x00,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x547D, {0x04,0x00,0x0A,0x00,0x31,0x80,0xFF,0xE0,0x00,0x00,0x73,0xC0,0x52,0x40,0x52,0x40,0x72,0x40,0x53,0xC0,0x42,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5480, {0x00,0x00,0x07,0x80,0xE4,0x80,0xA4,0x80,0xA7,0x80,0xA4,0x80,0xA4,0x80,0xA7,0x80,0xE4,0x80,0xE4,0x80,0x9F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5484, {0x00,0x80,0x04,0xA0,0x74,0xA0,0x54,0xA0,0x57,0xE0,0x54,0xA0,0x50,0x80,0x54,0xA0,0x74,0xA0,0x74,0xA0,0x47,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x5486, {0x04,0x00,0x04,0x00,0xE7,0xC0,0xA8,0x40,0xB7,0x40,0xA5,0xC0,0xA5,0xC0,0xA7,0xC0,0xE4,0x80,0x84,0x20,0x04,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x548B, {0x04,0x00,0x04,0x00,0xE7,0xE0,0xAA,0x00,0xB2,0x00,0xA3,0xC0,0xA2,0x00,0xA2,0x00,0xE3,0xC0,0x82,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x548C, {0x04,0x00,0x08,0x00,0x31,0xE0,0x11,0x20,0x7F,0x20,0x11,0x20,0x39,0x20,0x35,0x20,0x55,0x20,0x11,0xE0,0x11,0x20,0x10,0x00,0x00,0x00,}}, +{ 0x548E, {0x21,0x80,0x31,0x80,0x79,0x80,0x79,0x80,0xB2,0x40,0x34,0x40,0x4F,0xE0,0xC0,0x00,0x3F,0x80,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x548F, {0x01,0x00,0x01,0x80,0xE7,0x00,0xA7,0x20,0xA1,0x20,0xBF,0xC0,0xA3,0x80,0xA3,0x80,0xE5,0x80,0xE9,0x40,0x91,0x20,0x03,0x00,0x00,0x00,}}, +{ 0x5490, {0x02,0x40,0x02,0x40,0xE6,0x40,0xA7,0xE0,0xAC,0x40,0xB5,0x40,0xA5,0xC0,0xA4,0x40,0xE4,0x40,0xE4,0x40,0x84,0x40,0x04,0xC0,0x00,0x00,}}, +{ 0x5492, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x00,0x00,0x1F,0x00,0x11,0x00,0x11,0x00,0x11,0x20,0x21,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x54A2, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x01,0x80,0x01,0x00,0x0E,0x00,0x00,0x00,}}, +{ 0x54A4, {0x01,0x00,0x03,0x00,0xEF,0xE0,0xB8,0xC0,0xBF,0x00,0xA1,0x00,0xA1,0xE0,0xBF,0x00,0xE1,0x00,0xE1,0x20,0x81,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x54A5, {0x00,0x00,0x1F,0xE0,0xE2,0x40,0xA4,0xE0,0xBF,0x20,0xA1,0x00,0xA1,0x00,0xAF,0xC0,0xE1,0x00,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x54A8, {0x04,0x00,0x04,0x00,0xE7,0xE0,0x19,0x60,0x03,0xC0,0x24,0x80,0xC8,0x40,0x3F,0xA0,0x21,0x80,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x54AB, {0x00,0x00,0x7B,0xC0,0x6A,0x40,0x6A,0x40,0x6A,0x40,0x7B,0xC0,0x69,0x80,0x73,0xC0,0x76,0x40,0x48,0x00,0x46,0x00,0x81,0xE0,0x00,0x00,}}, +{ 0x54AC, {0x01,0x00,0x03,0x00,0xFF,0xE0,0xA4,0x40,0xAC,0xE0,0xB2,0xA0,0xA2,0x80,0xA1,0x80,0xE1,0x80,0x83,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x54AF, {0x02,0x00,0x02,0x00,0xE7,0x80,0xAC,0x80,0xB3,0x80,0xA1,0x80,0xA6,0xC0,0xBF,0xA0,0xE4,0x80,0x84,0x80,0x07,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x54B2, {0x08,0x80,0x04,0x80,0xE5,0x00,0xAF,0xC0,0xA1,0x00,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xE2,0x80,0x84,0x80,0x18,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x54B3, {0x01,0x00,0x01,0x00,0xFF,0xE0,0xA9,0x40,0xA6,0x40,0xA2,0x80,0xA1,0x40,0xA2,0x80,0xED,0x00,0x82,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x54B8, {0x01,0x80,0x01,0x40,0x3F,0xE0,0x7F,0xE0,0x7F,0x40,0x61,0x40,0x7F,0xC0,0x72,0x80,0x72,0x80,0x5F,0xE0,0x53,0x60,0x82,0x20,0x00,0x00,}}, +{ 0x54BC, {0x00,0x00,0x3F,0x80,0x27,0x80,0x27,0x80,0x25,0x80,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x53,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x54BD, {0x00,0x00,0x07,0xE0,0x74,0xA0,0x54,0xA0,0x57,0xE0,0x54,0xA0,0x54,0xA0,0x55,0x60,0x76,0x60,0x44,0x20,0x07,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x54BE, {0x01,0x00,0x03,0x00,0xEF,0xC0,0xA1,0x40,0xBF,0xE0,0xA1,0x00,0xA2,0x40,0xB6,0x80,0xFB,0x00,0xE2,0x40,0x82,0x40,0x01,0xC0,0x00,0x00,}}, +{ 0x54C0, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x00,0x21,0x00,0x3F,0x40,0x0C,0x40,0x32,0x80,0xD3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x54C1, {0x00,0x00,0x1F,0x80,0x10,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,0x79,0xE0,0x49,0x20,0x49,0x20,0x79,0xE0,0x49,0x20,0x00,0x00,}}, +{ 0x54C2, {0x00,0x00,0x1F,0xE0,0xE3,0x80,0xAF,0xC0,0xAB,0xC0,0xAB,0xC0,0xAB,0xC0,0xAD,0xC0,0xEC,0xC0,0x88,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x54C4, {0x05,0x80,0x05,0x80,0xE5,0x80,0xBF,0xC0,0xB5,0x80,0xA5,0x80,0xA5,0x80,0xB5,0x80,0xFF,0xE0,0x84,0x80,0x08,0x40,0x10,0x40,0x00,0x00,}}, +{ 0x54C7, {0x01,0x00,0x03,0x00,0xEF,0xC0,0xA1,0x00,0xBF,0xE0,0xA1,0x00,0xA1,0x00,0xAF,0xC0,0xE1,0x00,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x54C8, {0x01,0x00,0x03,0x00,0xE3,0x80,0xA4,0x80,0xAF,0xC0,0xB0,0x20,0xA0,0x00,0xA7,0x80,0xE4,0x80,0x84,0x80,0x07,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x54C9, {0x22,0x00,0x22,0x80,0x7E,0x40,0x22,0x00,0xFF,0xE0,0x01,0x40,0x79,0x40,0x48,0x80,0x48,0x80,0x79,0xA0,0x4A,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x54D8, {0x04,0x00,0x05,0xC0,0xF8,0x00,0xB2,0x00,0xA3,0xE0,0xA4,0x80,0xAC,0x80,0xB4,0x80,0xE4,0x80,0x84,0x80,0x04,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x54E1, {0x00,0x00,0x3F,0x80,0x20,0x80,0x1F,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x54E2, {0x00,0x00,0x0F,0xC0,0xE7,0x80,0xA7,0x80,0xA1,0x00,0xBF,0xE0,0xA4,0x80,0xB4,0xC0,0xFF,0xE0,0x84,0x80,0x08,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x54E5, {0x00,0x00,0x7F,0xC0,0x39,0x80,0x7D,0x80,0x7D,0x80,0x01,0x80,0xFF,0xE0,0x01,0x80,0x7D,0x80,0x7D,0x80,0x65,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x54E6, {0x03,0x80,0x05,0xC0,0xFD,0xA0,0xA5,0x80,0xBF,0xE0,0xA5,0xC0,0xA4,0xC0,0xB6,0x80,0xFC,0x80,0x85,0xE0,0x06,0x60,0x0C,0x20,0x00,0x00,}}, +{ 0x54E8, {0x01,0x00,0x05,0x80,0xE5,0x40,0xB9,0x20,0xBF,0xC0,0xA8,0x40,0xAF,0xC0,0xA8,0x40,0xEF,0xC0,0x88,0x40,0x08,0x40,0x08,0xC0,0x00,0x00,}}, +{ 0x54E9, {0x00,0x00,0x0F,0xC0,0xE9,0x40,0xAF,0xC0,0xA9,0x40,0xA9,0x40,0xAF,0xC0,0xA1,0x00,0xEF,0xC0,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x54ED, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x04,0x00,0x04,0x80,0xFF,0xE0,0x04,0x00,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x54EE, {0x02,0x00,0x02,0x40,0xEF,0xC0,0xA2,0x80,0xBF,0xE0,0xA1,0x00,0xA7,0xC0,0xBD,0x80,0xFF,0xE0,0x9F,0xE0,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x54F2, {0x20,0xC0,0x23,0x00,0xFF,0xE0,0x3A,0x80,0xE2,0x80,0x24,0x80,0x28,0x80,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x54FA, {0x01,0x80,0x03,0x40,0xFF,0xE0,0xAF,0xC0,0xAB,0x40,0xA9,0x40,0xAF,0xC0,0xA9,0x40,0xEF,0xC0,0x8F,0xC0,0x09,0x40,0x09,0xC0,0x00,0x00,}}, +{ 0x54FD, {0x00,0x00,0x1F,0xE0,0xE7,0xC0,0xAF,0xC0,0xAF,0xC0,0xA9,0x40,0xAF,0xC0,0xAB,0x00,0xE6,0x00,0x86,0x00,0x09,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x5504, {0x00,0x00,0x07,0xC0,0x74,0x40,0x57,0xC0,0x54,0x40,0x54,0x40,0x57,0xC0,0x54,0x40,0x77,0xC0,0x42,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x5506, {0x02,0x00,0x02,0x40,0xE4,0xE0,0xBF,0x00,0xA5,0x20,0xAA,0xE0,0xB3,0x80,0xA4,0x80,0xED,0x00,0x92,0x00,0x05,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x5507, {0x00,0x00,0x7F,0xC0,0x5F,0x80,0x40,0x00,0x7F,0xE0,0x52,0x80,0x5D,0x80,0xB0,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x550F, {0x00,0x80,0x07,0x80,0xE7,0x80,0xA6,0x00,0xBF,0xE0,0xA5,0x00,0xA9,0x00,0xBF,0xC0,0xF9,0x40,0x89,0x40,0x09,0xC0,0x01,0x00,0x00,0x00,}}, +{ 0x5510, {0x02,0x00,0x7F,0xE0,0x5F,0x80,0x42,0x80,0x7F,0xE0,0x42,0x80,0x5F,0x80,0x40,0x00,0x5F,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5514, {0x00,0x00,0x1F,0xE0,0xE2,0x00,0xAF,0x80,0xA4,0x80,0xA4,0x80,0xBF,0xE0,0xA0,0x00,0xEF,0xC0,0x88,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x5516, {0x00,0x00,0x1F,0xE0,0xE2,0x80,0xAF,0xC0,0xAA,0xC0,0xAA,0xC0,0xAA,0xC0,0xEF,0xC0,0xAA,0xC0,0x82,0x80,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x552E, {0x21,0x80,0x3F,0xE0,0x7F,0xC0,0x7F,0xC0,0xBF,0xC0,0x21,0x00,0x3F,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x552F, {0x02,0x80,0x02,0x80,0xE5,0x00,0xAF,0xE0,0xAD,0x00,0xB7,0xC0,0xA5,0x00,0xA5,0x00,0xE7,0xC0,0x85,0x00,0x07,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x5531, {0x00,0x00,0x03,0xC0,0x72,0x40,0x53,0xC0,0x52,0x40,0x53,0xC0,0x50,0x00,0x77,0xE0,0x44,0x20,0x07,0xE0,0x04,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x5533, {0x00,0x00,0x1F,0xE0,0xE7,0xC0,0xAF,0xC0,0xA8,0x40,0xAF,0xC0,0xA9,0x80,0xAB,0x40,0xFF,0xE0,0x93,0x00,0x34,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x5538, {0x01,0x00,0x03,0x00,0xE6,0x80,0xBF,0xE0,0xB0,0x00,0xAF,0xC0,0xA0,0x80,0xA3,0x80,0xF1,0x40,0x94,0x20,0x34,0xA0,0x03,0x80,0x00,0x00,}}, +{ 0x5539, {0x04,0x80,0x04,0x80,0xFF,0xC0,0xBF,0xC0,0xA9,0x20,0xAB,0x20,0xAE,0x80,0xAA,0x80,0xFA,0x00,0x92,0x80,0x32,0x40,0x2C,0x40,0x00,0x00,}}, +{ 0x553E, {0x00,0xC0,0x0F,0x00,0xE1,0x00,0xAF,0xC0,0xA5,0x80,0xBF,0xE0,0xA5,0x80,0xA5,0x80,0xEF,0xC0,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5540, {0x00,0x00,0x0F,0xE0,0xEB,0xC0,0xAB,0xC0,0xA9,0x80,0xAF,0xE0,0xA9,0x80,0xA9,0x80,0xFB,0xC0,0x91,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5544, {0x00,0x00,0x1F,0xE0,0xE2,0x00,0xA6,0x40,0xBB,0xC0,0xA3,0x80,0xA5,0x80,0xFB,0xC0,0x86,0xA0,0x18,0x80,0x00,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x5545, {0x01,0x00,0x01,0x00,0xE1,0xE0,0xAF,0xC0,0xA8,0x40,0xAF,0xC0,0xA8,0x40,0xAF,0xC0,0xFF,0xE0,0x9F,0xE0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5546, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x52,0x40,0x52,0xC0,0x7F,0xC0,0x51,0x40,0x5F,0x40,0x51,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x554C, {0x01,0x00,0x03,0x00,0xEF,0xE0,0xBB,0x80,0xB5,0xA0,0xA8,0xE0,0xA0,0x00,0xAF,0xC0,0xE1,0x00,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x554F, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x5F,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5553, {0x02,0x00,0xFE,0x00,0x03,0xE0,0x7E,0x80,0x4B,0x80,0x79,0x00,0x4E,0x80,0xC0,0x60,0xBF,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5556, {0x01,0x00,0x01,0x40,0xEB,0x40,0xBB,0x80,0xB4,0x80,0xA9,0x80,0xA1,0x00,0xAB,0x40,0xFB,0xC0,0x95,0x80,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x5557, {0x01,0x00,0x01,0x00,0x73,0xE0,0x54,0x20,0x59,0xC0,0x56,0xE0,0x54,0x20,0x54,0x20,0x77,0x60,0x44,0x20,0x07,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x555C, {0x00,0x00,0x1F,0xC0,0xFB,0x40,0xA4,0xC0,0xAA,0xC0,0xB3,0x40,0xBF,0xC0,0xB3,0x40,0xEF,0xC0,0x86,0x80,0x0A,0xC0,0x31,0x20,0x00,0x00,}}, +{ 0x555D, {0x00,0x80,0x03,0x00,0x7E,0xE0,0x52,0xE0,0x5F,0xE0,0x52,0xE0,0x57,0xE0,0x5F,0xE0,0x7A,0xE0,0x0A,0x80,0x02,0x40,0x02,0x00,0x00,0x00,}}, +{ 0x5563, {0x04,0x00,0x04,0x00,0x77,0xE0,0x7F,0xE0,0x7A,0xE0,0x7F,0xE0,0x72,0xE0,0x7B,0xE0,0x7A,0xE0,0x4B,0xE0,0x0E,0xC0,0x18,0xC0,0x00,0x00,}}, +{ 0x557B, {0x04,0x00,0x7F,0xC0,0x1A,0x00,0x7F,0xE0,0x44,0x40,0xFF,0x80,0x64,0x80,0x04,0x80,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x557C, {0x01,0x00,0x03,0x00,0xEF,0xC0,0xA6,0x80,0xAF,0xE0,0xA9,0x40,0xB1,0x00,0xAF,0xC0,0xE9,0x40,0x89,0x40,0x09,0xC0,0x01,0x00,0x00,0x00,}}, +{ 0x557E, {0x01,0x80,0x06,0x80,0xFC,0x80,0xA4,0xA0,0xBF,0xC0,0xA5,0x80,0xA6,0x80,0xAD,0x80,0xFD,0xC0,0xB5,0xC0,0x05,0x20,0x06,0x20,0x00,0x00,}}, +{ 0x5580, {0x01,0x00,0x03,0x00,0xEF,0xE0,0xBB,0xC0,0xB2,0x80,0xA6,0x80,0xA9,0x80,0xA2,0xC0,0xFF,0xE0,0x94,0x80,0x07,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x5583, {0x01,0x00,0x03,0x00,0xFF,0xE0,0xAF,0xC0,0xAD,0xC0,0xAB,0xC0,0xAF,0xC0,0xAB,0x40,0xEF,0xC0,0x89,0x40,0x09,0x40,0x08,0xC0,0x00,0x00,}}, +{ 0x5584, {0x21,0x00,0x12,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x24,0x80,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5587, {0x02,0x20,0x02,0x20,0x7F,0xE0,0x7F,0xE0,0x7B,0xE0,0x7A,0xE0,0x7F,0xE0,0x72,0xE0,0x77,0xA0,0x4E,0xA0,0x1A,0x20,0x02,0x60,0x00,0x00,}}, +{ 0x5589, {0x04,0x00,0x07,0xC0,0xE4,0x40,0xAF,0xE0,0xB9,0x00,0xAB,0xE0,0xAA,0x80,0xAC,0x80,0xEF,0xE0,0x89,0x80,0x0A,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x558A, {0x01,0x80,0x01,0x40,0xEF,0xE0,0xFF,0xE0,0xFF,0x40,0xF1,0x40,0xFF,0xC0,0xFA,0x80,0xFE,0x80,0xBF,0xE0,0x22,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x558B, {0x05,0x80,0x05,0x80,0xFF,0xE0,0xA5,0x80,0xA4,0x00,0xA7,0xC0,0xA1,0x00,0xBF,0xE0,0xE7,0x80,0x89,0x40,0x31,0x20,0x01,0x00,0x00,0x00,}}, +{ 0x5598, {0x01,0x00,0x09,0x40,0xEF,0xC0,0xA7,0xC0,0xBF,0xE0,0xA1,0x00,0xAF,0xC0,0xAB,0xC0,0xEB,0xC0,0x8B,0xC0,0x0B,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x5599, {0x04,0x00,0x07,0x80,0xE7,0x80,0xA7,0x80,0xBF,0xE0,0xA2,0x40,0xA7,0x40,0xBB,0x80,0xFF,0x80,0x9F,0x40,0x19,0x20,0x06,0x00,0x00,0x00,}}, +{ 0x559A, {0x02,0x00,0x03,0x80,0xE5,0x00,0xBF,0xC0,0xBB,0x40,0xAB,0x40,0xAB,0xC0,0xAD,0x40,0xFF,0xE0,0x83,0x00,0x0C,0xC0,0x30,0x20,0x00,0x00,}}, +{ 0x559C, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x559D, {0x00,0x00,0x07,0xC0,0x74,0x40,0x57,0xC0,0x57,0xC0,0x51,0x00,0x53,0xE0,0x5C,0xA0,0x77,0x20,0x44,0x20,0x03,0xA0,0x00,0xC0,0x00,0x00,}}, +{ 0x559E, {0x04,0x00,0x04,0xE0,0x7F,0xE0,0x7F,0xE0,0x79,0xE0,0x7F,0xE0,0x79,0xE0,0x78,0xE0,0x7F,0xE0,0x4F,0xC0,0x08,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x559F, {0x00,0x00,0x07,0xE0,0x77,0xE0,0x57,0xE0,0x57,0xE0,0x50,0x00,0x53,0xC0,0x52,0x40,0x73,0xC0,0x43,0xC0,0x02,0x40,0x02,0x40,0x00,0x00,}}, +{ 0x55A7, {0x01,0x00,0x01,0x00,0xEF,0xC0,0xA8,0x40,0xA7,0x80,0xA7,0x80,0xA4,0x80,0xA7,0x80,0xE7,0x80,0x80,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x55A8, {0x01,0x00,0x1F,0xE0,0xE7,0x80,0xA7,0x80,0xA7,0x80,0xA0,0x00,0xAF,0xE0,0xB8,0x40,0xF3,0x80,0x83,0xA0,0x05,0xA0,0x18,0xE0,0x00,0x00,}}, +{ 0x55A9, {0x02,0x00,0x02,0x00,0xE5,0x00,0xFF,0x80,0xF0,0x40,0xFE,0x60,0xF3,0xC0,0xFB,0xC0,0xFF,0x80,0x9F,0xC0,0x13,0xC0,0x17,0xC0,0x00,0x00,}}, +{ 0x55AA, {0x04,0x00,0xFF,0xE0,0x75,0xC0,0x55,0x40,0x75,0xC0,0x55,0x40,0x04,0x00,0xFF,0xE0,0x22,0x80,0x23,0x00,0x39,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x55AB, {0x08,0x00,0x0B,0xC0,0xFD,0x40,0xAD,0x40,0xB9,0x40,0xAE,0x40,0xB9,0xC0,0xA2,0x00,0xFF,0xE0,0x86,0x00,0x19,0x80,0x20,0x60,0x00,0x00,}}, +{ 0x55AC, {0x01,0x00,0x3E,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0xD1,0x60,0x1F,0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x55AE, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3F,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x55B0, {0x01,0x00,0x03,0x00,0xE6,0x80,0xA9,0x60,0xB7,0xC0,0xA4,0x80,0xA7,0x80,0xA4,0xC0,0xE7,0xC0,0x85,0x80,0x06,0x40,0x1C,0x20,0x00,0x00,}}, +{ 0x55B6, {0x28,0x80,0x15,0x00,0x7F,0xE0,0x40,0x40,0x9F,0x00,0x11,0x00,0x1F,0x00,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x55C4, {0x00,0x00,0x1F,0xE0,0xE7,0x80,0xAF,0x80,0xAF,0x80,0xAF,0x80,0xA8,0x80,0xAF,0x80,0xE7,0x80,0x9F,0x00,0x07,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x55C5, {0x01,0x00,0x02,0x00,0xEF,0x80,0xAF,0x80,0xA8,0x80,0xAF,0x80,0xA8,0x80,0xAF,0xC0,0xFF,0xE0,0x9F,0xE0,0x0D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x55C7, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x35,0x80,0x56,0x80,0xFF,0xE0,0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x55D4, {0x04,0xC0,0x07,0x00,0xE7,0xE0,0xAB,0xE0,0xAA,0x40,0xAB,0xC0,0xAA,0x40,0xAB,0xC0,0xEB,0xC0,0x8F,0xE0,0x06,0xC0,0x38,0x20,0x00,0x00,}}, +{ 0x55DA, {0x01,0x00,0x02,0x00,0xEF,0x80,0xA8,0x80,0xAF,0x80,0xA8,0x00,0xAF,0xC0,0xA8,0x00,0xEF,0xE0,0x9F,0xA0,0x15,0xA0,0x20,0xC0,0x00,0x00,}}, +{ 0x55DC, {0x02,0x00,0x0F,0xC0,0xFF,0xE0,0xBF,0xE0,0xA7,0x80,0xBA,0x40,0xA3,0xC0,0xAF,0x80,0xEF,0x80,0x8F,0x80,0x0F,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x55DF, {0x04,0x80,0x03,0x80,0xEF,0xC0,0xA7,0x80,0xA3,0x00,0xBF,0xE0,0xA4,0x00,0xA7,0xC0,0xE9,0x80,0x99,0x80,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x55E3, {0x00,0x00,0x7B,0xE0,0x48,0x20,0x79,0xA0,0x00,0x20,0xFD,0xA0,0xD5,0xA0,0xD5,0xA0,0xFD,0xA0,0xD4,0x20,0xD4,0x20,0x8C,0x60,0x00,0x00,}}, +{ 0x55E4, {0x01,0x00,0x09,0x40,0xEF,0xC0,0xA7,0xC0,0xBF,0xE0,0xA1,0x00,0xAF,0xC0,0xAB,0x40,0xEF,0xC0,0x81,0x40,0x01,0xE0,0x3E,0x20,0x00,0x00,}}, +{ 0x55F7, {0x09,0x80,0x09,0x80,0xFF,0x80,0xE9,0xE0,0xFF,0x40,0xE9,0x40,0xFF,0xC0,0xE8,0xC0,0xEE,0x80,0x92,0xC0,0x33,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x55F9, {0x01,0x80,0x11,0x80,0xEF,0xE0,0xE3,0xC0,0xF3,0xC0,0xF3,0xC0,0xE3,0xC0,0xFB,0xC0,0xEF,0xE0,0x8F,0xE0,0x15,0x80,0x23,0xE0,0x00,0x00,}}, +{ 0x55FD, {0x09,0x80,0x09,0x80,0xFF,0x80,0xFF,0xE0,0xFB,0xE0,0xEA,0xC0,0xEA,0x80,0xFE,0x80,0x9D,0xC0,0x1B,0xC0,0x2B,0x20,0x0A,0x20,0x00,0x00,}}, +{ 0x55FE, {0x09,0x80,0x09,0x80,0xFD,0xE0,0xBF,0xE0,0xA9,0x00,0xAF,0xE0,0xAB,0x80,0xAA,0xC0,0xFB,0xE0,0x93,0xC0,0x33,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x5606, {0x04,0x80,0x04,0x80,0xFF,0xE0,0xAF,0xC0,0xAB,0x40,0xAF,0xC0,0xA1,0x00,0xAF,0xC0,0xE1,0x00,0x9F,0xE0,0x0C,0xC0,0x30,0x20,0x00,0x00,}}, +{ 0x5609, {0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x7D,0xC0,0x15,0x40,0x6D,0xC0,0x00,0x00,}}, +{ 0x5614, {0x00,0x00,0x1F,0xC0,0xF3,0x80,0xF3,0x80,0xF3,0x80,0xF0,0x00,0xF7,0xC0,0xF7,0xC0,0xF7,0xC0,0x91,0x00,0x1F,0xE0,0x10,0x00,0x00,0x00,}}, +{ 0x5616, {0x01,0x00,0x0F,0xC0,0xE7,0x80,0xA7,0x80,0xBF,0xE0,0xA7,0x80,0xA4,0x80,0xA7,0x80,0xE7,0x80,0x87,0x80,0x06,0x80,0x18,0x40,0x00,0x00,}}, +{ 0x5617, {0x28,0x80,0x15,0x00,0x7F,0xE0,0x91,0x20,0x3F,0x80,0x3F,0x00,0x20,0x40,0x3F,0xC0,0x1F,0x00,0x1F,0x00,0x11,0x00,0x1F,0x00,0x00,0x00,}}, +{ 0x5618, {0x02,0x00,0x03,0xC0,0xEF,0xE0,0xA9,0xC0,0xAE,0x40,0xA9,0xC0,0xAA,0x80,0xAA,0xC0,0xF6,0xC0,0xA6,0x80,0x2F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x561B, {0x01,0x00,0x03,0x00,0xFF,0xE0,0xF2,0x80,0xFF,0xE0,0xF2,0x80,0xF7,0xC0,0xF7,0xC0,0xF7,0xE0,0xBF,0xE0,0x23,0xE0,0x22,0x80,0x00,0x00,}}, +{ 0x5629, {0x04,0x80,0x04,0x80,0xFF,0xE0,0xAF,0xC0,0xA5,0x80,0xBF,0xE0,0xA5,0x80,0xAF,0xC0,0xE1,0x00,0x9F,0xE0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x562F, {0x02,0x00,0x1F,0xC0,0xFF,0xE0,0xFF,0xE0,0xFF,0xC0,0xF7,0xC0,0xFE,0xC0,0xF2,0x40,0xFF,0xC0,0x9E,0xC0,0x17,0xC0,0x27,0xC0,0x00,0x00,}}, +{ 0x5631, {0x0F,0xE0,0x08,0x20,0xEF,0xE0,0xAF,0xE0,0xAF,0x80,0xAB,0xC0,0xEA,0xC0,0xAB,0xE0,0x8F,0xE0,0x17,0xE0,0x14,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x5632, {0x04,0x00,0x04,0xE0,0x7F,0xE0,0x7F,0xE0,0x79,0xE0,0x7F,0xE0,0x79,0xE0,0x7F,0xE0,0x7F,0xA0,0x5F,0xA0,0x05,0x20,0x06,0x60,0x00,0x00,}}, +{ 0x5634, {0x05,0x80,0x15,0xA0,0xF7,0xC0,0xFF,0xA0,0xF3,0xE0,0xE5,0x80,0xFF,0xC0,0xEB,0x40,0xEF,0xC0,0x8F,0xC0,0x10,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x5636, {0x14,0x40,0x14,0x80,0xFF,0x00,0xFF,0x00,0xFD,0xE0,0xF5,0x80,0xFD,0x80,0xF7,0x80,0xFF,0x80,0x96,0x80,0x32,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x5638, {0x08,0x00,0x08,0x00,0xEF,0xE0,0xFB,0xC0,0xFF,0xE0,0xEB,0xC0,0xEB,0xC0,0xEB,0xC0,0xFF,0xE0,0x94,0x40,0x13,0x20,0x23,0xA0,0x00,0x00,}}, +{ 0x5642, {0x04,0x80,0x02,0x80,0xFF,0xE0,0xA2,0x80,0xAF,0xC0,0xAB,0x40,0xAF,0xC0,0xAF,0xC0,0xE0,0x80,0x9F,0xE0,0x04,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x564C, {0x02,0x40,0x01,0x80,0x77,0xE0,0x57,0xE0,0x54,0xA0,0x57,0xE0,0x50,0x00,0x53,0xC0,0x72,0x40,0x43,0xC0,0x03,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x564E, {0x01,0x00,0x1F,0xE0,0xE7,0x80,0xAF,0xE0,0xA8,0x40,0xBF,0xE0,0xA7,0x80,0xA4,0x80,0xE7,0x80,0x86,0x80,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5650, {0x00,0x00,0x7B,0x80,0x6A,0x80,0x7B,0x80,0x00,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x3B,0x80,0x7B,0x80,0x7B,0x80,0x6A,0x80,0x00,0x00,}}, +{ 0x565B, {0x01,0x00,0x05,0xC0,0xE5,0x00,0xBF,0xE0,0xBF,0xC0,0xAD,0x40,0xAB,0xC0,0xAF,0xC0,0xEB,0xC0,0x8D,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x5664, {0x04,0x80,0x04,0xC0,0xFF,0xE0,0xAF,0xC0,0xB5,0xE0,0xA4,0x80,0xAF,0xC0,0xB0,0x00,0xFF,0xE0,0x89,0x40,0x11,0x40,0x03,0x00,0x00,0x00,}}, +{ 0x5668, {0x00,0x00,0x3B,0x80,0x2A,0x80,0x3B,0x80,0x04,0x00,0xFF,0xE0,0x11,0x00,0x60,0xC0,0xBB,0xA0,0x2A,0x80,0x3B,0x80,0x2A,0x80,0x00,0x00,}}, +{ 0x566A, {0x00,0x00,0x07,0x80,0xE7,0x80,0xA7,0x80,0xAE,0xC0,0xAB,0xC0,0xAF,0xC0,0xB3,0x00,0xFF,0xE0,0x87,0x80,0x19,0x60,0x01,0x00,0x00,0x00,}}, +{ 0x566B, {0x01,0x00,0x03,0x00,0xEF,0xC0,0xBF,0xE0,0xB7,0xC0,0xA4,0x80,0xA7,0x80,0xA4,0x80,0xE7,0x80,0x97,0x40,0x14,0xE0,0x23,0xA0,0x00,0x00,}}, +{ 0x566C, {0x09,0x80,0x09,0x80,0xFF,0xE0,0xB6,0x40,0xA0,0x00,0xBF,0xE0,0xA5,0x80,0xA5,0xC0,0xE7,0xE0,0x9B,0x20,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5674, {0x01,0x00,0x0F,0xC0,0xFF,0xE0,0xA4,0x80,0xAF,0xC0,0xA8,0x40,0xAF,0xC0,0xA8,0x40,0xEF,0xC0,0x8F,0xC0,0x04,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x5678, {0x08,0x00,0x0B,0xE0,0xEE,0x80,0xBB,0xC0,0xAB,0x40,0xAB,0xC0,0xAB,0x40,0xFF,0xC0,0xA9,0x40,0x09,0xC0,0x08,0xC0,0x07,0x20,0x00,0x00,}}, +{ 0x567A, {0x04,0x20,0x04,0x40,0xFF,0x80,0xAB,0x00,0xAD,0xE0,0xBF,0x40,0xA9,0x40,0xBF,0x40,0xFD,0x40,0xBA,0x40,0x2A,0x40,0x08,0x40,0x00,0x00,}}, +{ 0x5680, {0x01,0x00,0x0F,0xE0,0xFB,0x40,0xBB,0xA0,0xAA,0xA0,0xB1,0x80,0xAF,0xC0,0xBB,0xC0,0xFF,0xE0,0x9F,0xE0,0x03,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5686, {0x04,0x80,0x1F,0xE0,0xE5,0x00,0xBF,0xE0,0xB7,0xC0,0xA4,0x80,0xA7,0x80,0xAF,0xC0,0xEB,0x40,0x8B,0xC0,0x0B,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x5687, {0x08,0x80,0x08,0x80,0xFF,0xE0,0xC8,0x80,0xFF,0xE0,0xD5,0x40,0xD7,0x40,0xF7,0x60,0xF7,0x60,0x95,0x40,0x15,0x40,0x2E,0xC0,0x00,0x00,}}, +{ 0x568A, {0x01,0x00,0x07,0x80,0xE7,0x80,0xA7,0x80,0xA4,0x80,0xA7,0x80,0xAF,0xC0,0xAF,0xC0,0xEF,0xC0,0x9F,0xE0,0x04,0xC0,0x18,0x80,0x00,0x00,}}, +{ 0x568F, {0x01,0x00,0x0F,0xC0,0xE7,0xE0,0xAF,0xE0,0xB7,0xC0,0xA7,0x80,0xA5,0x80,0xB7,0xC0,0xFF,0xE0,0x89,0xC0,0x17,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x5694, {0x01,0x00,0x0F,0xC0,0xE7,0xE0,0xAF,0xE0,0xB7,0xC0,0xA7,0x80,0xA5,0x80,0xA7,0x80,0xE7,0x80,0x8F,0xC0,0x17,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x56A0, {0x04,0x20,0x1B,0xA0,0xFF,0xA0,0xFF,0xA0,0xE6,0xA0,0xEA,0xA0,0xFF,0xA0,0xF5,0xA0,0xFF,0xA0,0x8E,0x20,0x0F,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x56A2, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x6B,0xC0,0xFF,0xC0,0x3F,0x80,0xFF,0xE0,0xFB,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x56A5, {0x05,0x00,0x3F,0xE0,0xE7,0x00,0xF6,0xA0,0xF7,0xC0,0xF5,0x80,0xF5,0xA0,0xF7,0xE0,0xF4,0x60,0x94,0x40,0x13,0x20,0x23,0xA0,0x00,0x00,}}, +{ 0x56AE, {0x3F,0xE0,0x37,0xE0,0x77,0xC0,0x37,0xE0,0x34,0xE0,0x77,0xE0,0x27,0x00,0x22,0x00,0x3F,0xE0,0x2F,0xA0,0x2F,0xA0,0x20,0x60,0x00,0x00,}}, +{ 0x56B4, {0x79,0xC0,0x69,0x40,0x7F,0xE0,0x7F,0xE0,0x7F,0x80,0x49,0x80,0x7F,0xE0,0x77,0x40,0x7F,0xC0,0x7F,0x80,0x7F,0x40,0x86,0x20,0x00,0x00,}}, +{ 0x56B6, {0x00,0x00,0x0F,0xC0,0xEF,0xC0,0xAF,0xC0,0xAF,0xC0,0xAB,0xC0,0xAF,0xC0,0xBB,0x40,0xFF,0xE0,0x9F,0xE0,0x03,0x80,0x1C,0xC0,0x00,0x00,}}, +{ 0x56BC, {0x00,0xC0,0x1F,0xC0,0xFF,0xE0,0xFF,0xE0,0xFF,0xC0,0xFE,0x40,0xF2,0x40,0xFF,0xE0,0xFF,0x40,0x9F,0xC0,0x1E,0x40,0x10,0xC0,0x00,0x00,}}, +{ 0x56C0, {0x08,0x80,0x08,0xC0,0xFF,0xE0,0xFF,0xE0,0xFB,0xE0,0xFF,0xA0,0xEB,0xE0,0xFF,0xC0,0xFF,0xE0,0xBF,0xE0,0x09,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x56C1, {0x00,0x00,0x0F,0xC0,0xE7,0x80,0xA7,0x80,0xAF,0xC0,0xA0,0x80,0xBF,0xE0,0xAB,0xC0,0xEF,0xC0,0x8F,0xE0,0x3F,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x56C2, {0x7B,0x80,0x6A,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x7E,0x80,0x6F,0x80,0x3F,0x80,0xFB,0xE0,0xFB,0xE0,0x7B,0x80,0x6A,0x80,0x00,0x00,}}, +{ 0x56C3, {0x09,0xC0,0x09,0xC0,0xFF,0xE0,0xF5,0xE0,0xFF,0xC0,0xEB,0xE0,0xE9,0xC0,0xFF,0xC0,0xFD,0xE0,0xBB,0xC0,0x29,0xE0,0x09,0x80,0x00,0x00,}}, +{ 0x56C8, {0x05,0x80,0x3F,0xE0,0xED,0x80,0xEF,0xC0,0xFF,0xC0,0xFF,0xC0,0xFF,0xE0,0xEF,0x60,0xFF,0xA0,0xBF,0xE0,0x04,0xC0,0x1F,0xC0,0x00,0x00,}}, +{ 0x56CE, {0x01,0x80,0x1D,0xC0,0xF7,0xE0,0xFF,0xE0,0xF7,0xE0,0xF7,0xE0,0xFC,0x00,0xF5,0xC0,0xFD,0xC0,0x99,0xC0,0x15,0xC0,0x25,0x40,0x00,0x00,}}, +{ 0x56D1, {0x1F,0xE0,0x18,0x20,0x7F,0xE0,0x76,0xE0,0x7F,0xE0,0x7A,0xE0,0x7F,0xE0,0x77,0xE0,0x7F,0xE0,0x1F,0xE0,0x11,0xE0,0x2F,0xC0,0x00,0x00,}}, +{ 0x56D3, {0x0E,0x00,0x3B,0xC0,0xFF,0xC0,0xFF,0x40,0xF2,0xC0,0xEB,0x80,0xFF,0xE0,0xF5,0xC0,0xFF,0xC0,0x9F,0xC0,0x1B,0xC0,0x1F,0xC0,0x00,0x00,}}, +{ 0x56D7, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56D8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x5E,0x40,0x53,0x40,0x51,0x40,0x5F,0x40,0x50,0x40,0x51,0xC0,0x4F,0xC0,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x56DA, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x4A,0x40,0x4A,0x40,0x51,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56DB, {0x00,0x00,0x7F,0xE0,0x49,0x20,0x49,0x20,0x49,0x20,0x51,0x20,0x51,0x20,0x60,0xE0,0x40,0x20,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x56DE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x51,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56E0, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x4C,0x40,0x4A,0x40,0x51,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56E3, {0x00,0x00,0x7F,0xC0,0x42,0x40,0x7F,0xC0,0x42,0x40,0x52,0x40,0x4A,0x40,0x4A,0x40,0x42,0x40,0x46,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56EE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x4A,0x40,0x52,0xC0,0x73,0x40,0x52,0x40,0x52,0xC0,0x53,0xC0,0x41,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56F0, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x4E,0x40,0x4E,0x40,0x55,0x40,0x64,0xC0,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56F2, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x49,0x40,0x5F,0xC0,0x49,0x40,0x49,0x40,0x7F,0xC0,0x49,0x40,0x51,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56F3, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x44,0xC0,0x54,0xC0,0x51,0x40,0x41,0x40,0x5E,0x40,0x45,0x40,0x58,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56F9, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x5B,0x40,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x45,0xC0,0x47,0x40,0x46,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56FA, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x5F,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56FD, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x44,0x40,0x5F,0x40,0x44,0x40,0x45,0x40,0x5F,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x56FF, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x5F,0x40,0x59,0xC0,0x6F,0xC0,0x49,0xC0,0x4F,0xC0,0x49,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5700, {0x00,0x00,0x7F,0xC0,0x52,0x40,0x57,0xC0,0x44,0x40,0x7F,0x40,0x44,0x40,0x47,0xC0,0x49,0xC0,0x53,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5703, {0x00,0x00,0x7F,0xC0,0x45,0x40,0x7F,0xC0,0x5F,0x40,0x55,0x40,0x5F,0x40,0x55,0x40,0x5F,0x40,0x55,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5704, {0x00,0x00,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x7F,0x40,0x49,0x40,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x4E,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5708, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x4E,0x40,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x53,0xC0,0x56,0x40,0x4F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5709, {0x00,0x00,0x7F,0xC0,0x4E,0x40,0x4E,0x40,0x7F,0x40,0x51,0x40,0x4A,0x40,0x7F,0x40,0x4E,0x40,0x4E,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x570B, {0x00,0x00,0x7F,0xC0,0x43,0x40,0x7F,0xC0,0x42,0x40,0x7A,0x40,0x6B,0xC0,0x79,0xC0,0x7F,0xC0,0x74,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x570D, {0x00,0x00,0x7F,0xC0,0x4E,0x40,0x4F,0x40,0x7F,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x570F, {0x00,0x00,0x7F,0xC0,0x55,0x40,0x4E,0x40,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x4F,0x40,0x50,0xC0,0x4F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5712, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x5F,0x40,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0xC0,0x4E,0x40,0x55,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5713, {0x00,0x00,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x71,0xC0,0x7F,0xC0,0x7F,0xC0,0x71,0xC0,0x5F,0xC0,0x79,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5716, {0x00,0x00,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x6F,0xC0,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5718, {0x00,0x00,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x57,0x40,0x5F,0x40,0x55,0x40,0x5F,0xC0,0x5F,0x40,0x5F,0x40,0x4B,0x40,0x7F,0xC0,0x00,0x00,}}, +{ 0x571C, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0xC0,0x7F,0x40,0x59,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x571F, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5726, {0x07,0x00,0x61,0x00,0x61,0x00,0xF1,0x00,0x61,0x00,0x63,0x00,0x63,0x80,0x73,0x80,0xE4,0x80,0x88,0x80,0x10,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x5727, {0x00,0x00,0x3F,0xE0,0x22,0x00,0x22,0x00,0x22,0x00,0x2F,0xC0,0x22,0x00,0x22,0x00,0x42,0x00,0x42,0x00,0x9F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5728, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x10,0x00,0x11,0x00,0x21,0x00,0x2F,0xC0,0x61,0x00,0xA1,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x572D, {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5730, {0x01,0x00,0x29,0x00,0x29,0x00,0xF9,0xC0,0x2F,0x40,0x39,0x40,0x29,0x40,0x29,0x40,0x39,0x80,0xC8,0x20,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x5737, {0x00,0x00,0x6F,0xE0,0x61,0x00,0xF1,0x00,0x61,0x00,0x61,0x80,0x61,0x40,0x71,0x40,0xE1,0x00,0x81,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5738, {0x00,0x80,0x30,0x80,0x30,0x80,0x7C,0xA0,0x34,0xA0,0x34,0xA0,0x34,0xA0,0x3C,0xA0,0x74,0xA0,0x47,0xE0,0x04,0x20,0x04,0x20,0x00,0x00,}}, +{ 0x573B, {0x00,0x40,0x61,0x80,0x66,0x00,0xF4,0x00,0x67,0xE0,0x65,0x80,0x65,0x80,0x75,0x80,0xE9,0x80,0x99,0x80,0x31,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x5740, {0x01,0x00,0x61,0x00,0x61,0x00,0xF9,0x00,0x69,0xC0,0x69,0x00,0x69,0x00,0x79,0x00,0xE9,0x00,0x89,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5742, {0x20,0x00,0x27,0xE0,0x24,0x00,0xF4,0x00,0x27,0xC0,0x24,0x40,0x26,0x80,0x35,0x80,0x69,0x00,0x8A,0x80,0x14,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x5747, {0x02,0x00,0x12,0x00,0x13,0xE0,0x7E,0x20,0x14,0x20,0x11,0x20,0x11,0x20,0x18,0xA0,0x13,0x20,0x60,0x20,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x574A, {0x01,0x00,0x21,0x00,0x2F,0xE0,0xF1,0x00,0x21,0x00,0x21,0x00,0x23,0xC0,0x22,0x40,0x34,0x40,0xC8,0x40,0x10,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x574E, {0x04,0x00,0x64,0x00,0x67,0xE0,0xFF,0xE0,0x69,0x40,0x71,0x80,0x63,0x00,0x73,0x80,0xE6,0x80,0x84,0x80,0x08,0x40,0x10,0x20,0x00,0x00,}}, +{ 0x574F, {0x00,0x00,0x6F,0xE0,0x61,0x80,0xF1,0x00,0x61,0x00,0x63,0x80,0x65,0x40,0x79,0x20,0xE1,0x20,0x81,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5750, {0x04,0x00,0x24,0x80,0x24,0x80,0x24,0x80,0x75,0x80,0x4E,0x40,0x84,0x20,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5751, {0x01,0x00,0x21,0x00,0x2F,0xE0,0xF0,0x00,0x27,0x80,0x24,0x80,0x24,0x80,0x2C,0x80,0x74,0x80,0x88,0xA0,0x10,0xA0,0x20,0xE0,0x00,0x00,}}, +{ 0x5761, {0x01,0x00,0x63,0x00,0x6F,0xE0,0xF9,0x40,0x69,0x00,0x6F,0xC0,0x6C,0x40,0x7A,0x80,0xFB,0x80,0x91,0x80,0x36,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x5764, {0x00,0x80,0x10,0x80,0x17,0xE0,0x7C,0xA0,0x14,0xA0,0x17,0xE0,0x14,0xA0,0x1C,0xA0,0x37,0xE0,0x40,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5766, {0x00,0x00,0x27,0x80,0x24,0x80,0xF4,0x80,0x27,0x80,0x24,0x80,0x24,0x80,0x34,0x80,0x67,0x80,0x80,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5769, {0x04,0x80,0x64,0x80,0x6F,0xE0,0xFF,0xE0,0x64,0x80,0x64,0x80,0x67,0x80,0x74,0x80,0xE4,0x80,0x84,0x80,0x07,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x576A, {0x00,0x00,0x3F,0xE0,0x21,0x00,0xF9,0x40,0x25,0x80,0x21,0x00,0x3F,0xE0,0x21,0x00,0x31,0x00,0xC1,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x577F, {0x02,0x80,0x62,0x80,0x66,0x80,0xF7,0xE0,0x6C,0xC0,0x76,0x80,0x65,0x80,0x75,0x80,0xE4,0x80,0x84,0x80,0x04,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x5782, {0x01,0x80,0x3E,0x00,0x04,0x00,0x7F,0xC0,0x25,0x00,0x25,0x00,0xFF,0xE0,0x25,0x00,0x25,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0x5788, {0x11,0x80,0x11,0x40,0x27,0xE0,0x27,0x80,0x60,0x80,0xA4,0xA0,0x24,0x60,0x04,0x20,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5789, {0x04,0x00,0x64,0x00,0x67,0xC0,0xFF,0xC0,0x7F,0x40,0x69,0x40,0x69,0x40,0x7F,0x40,0xE9,0x80,0x88,0x20,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x578B, {0x00,0x40,0x7F,0x40,0x29,0x40,0xFF,0x40,0x29,0x40,0x29,0x40,0x48,0xC0,0x84,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5793, {0x01,0x00,0x63,0x00,0x6F,0xE0,0xF1,0x00,0x66,0x80,0x62,0x80,0x61,0x40,0x73,0x40,0xE6,0x80,0x81,0xC0,0x06,0x20,0x18,0x20,0x00,0x00,}}, +{ 0x57A0, {0x00,0x00,0x6F,0x80,0x68,0x80,0xFF,0x80,0x68,0x80,0x68,0x80,0x6F,0xA0,0x79,0x20,0xE9,0xC0,0x8A,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x57A2, {0x00,0xC0,0x2F,0x00,0x28,0x00,0xFF,0xE0,0x28,0x00,0x28,0x00,0x2B,0xC0,0x3A,0x40,0x6A,0x40,0x92,0x40,0x33,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x57A3, {0x00,0x00,0x2F,0xE0,0x20,0x00,0xF7,0x80,0x24,0x80,0x27,0x80,0x24,0x80,0x34,0x80,0x67,0x80,0x80,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x57A4, {0x00,0x00,0x6F,0xE0,0x61,0x00,0xF2,0x40,0x6F,0xE0,0x61,0x20,0x61,0x00,0x7F,0xC0,0xE1,0x00,0x81,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x57AA, {0x04,0x40,0x62,0x40,0x67,0xE0,0xFF,0xE0,0x62,0x80,0x62,0x80,0x62,0x80,0x7F,0xE0,0xE6,0x80,0x84,0x80,0x08,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x57B0, {0x01,0x00,0x61,0x00,0x61,0xC0,0xF1,0x00,0x6F,0xE0,0x60,0x00,0x6F,0xE0,0x71,0x00,0xE1,0xC0,0x81,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x57B3, {0x02,0x00,0x63,0xC0,0x64,0x00,0xFA,0x00,0x63,0xE0,0x64,0x80,0x6C,0x80,0x74,0x80,0xE4,0x80,0x84,0x80,0x04,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x57C0, {0x01,0x80,0x3F,0x00,0xFF,0xE0,0xFF,0xE0,0x75,0xC0,0x15,0x80,0x35,0x40,0x54,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x57C3, {0x01,0x00,0x63,0xC0,0x67,0xE0,0xFF,0xE0,0x62,0x00,0x67,0xC0,0x69,0x00,0x63,0x00,0xFF,0xE0,0x83,0x00,0x0C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x57C6, {0x01,0x00,0x31,0xC0,0x36,0x80,0x7F,0xE0,0x35,0xA0,0x34,0xA0,0x37,0xE0,0x3C,0xA0,0x77,0xE0,0x47,0xE0,0x08,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x57CB, {0x20,0x00,0x2F,0xC0,0x29,0x40,0xFF,0xC0,0x29,0x40,0x29,0x40,0x2F,0xC0,0x31,0x00,0xCF,0xC0,0x01,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x57CE, {0x01,0x80,0x21,0x40,0x2F,0xE0,0xF9,0x00,0x29,0x40,0x2F,0x40,0x2B,0xC0,0x3A,0x80,0x6A,0x80,0x8A,0xA0,0x17,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x57D2, {0x00,0x40,0x61,0x80,0x6F,0x40,0xF5,0x20,0x69,0x20,0x60,0x80,0x60,0x80,0x7F,0xE0,0xE4,0x80,0x82,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x57D3, {0x01,0x00,0x63,0x20,0x6E,0xE0,0xF6,0xC0,0x63,0x80,0x6E,0x80,0x60,0x80,0x7F,0xE0,0xE4,0x80,0x82,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x57D4, {0x01,0x80,0x63,0x40,0x7F,0xE0,0xFF,0xC0,0x6B,0x40,0x69,0x40,0x6F,0xC0,0x79,0x40,0xEF,0xC0,0x8F,0xC0,0x09,0x40,0x09,0xC0,0x00,0x00,}}, +{ 0x57D6, {0x04,0x80,0x64,0xC0,0x7F,0xE0,0xF6,0x80,0x63,0x80,0x63,0xA0,0x65,0xC0,0x75,0x80,0xFD,0x80,0x85,0xA0,0x05,0xA0,0x04,0xE0,0x00,0x00,}}, +{ 0x57DC, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x71,0x80,0x6A,0xC0,0xA4,0xA0,0x24,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x57DF, {0x01,0x00,0x21,0x40,0x2F,0xE0,0x21,0x00,0xFF,0x40,0x2B,0x40,0x2A,0xC0,0x2E,0xC0,0x39,0x80,0xC6,0xA0,0x09,0x60,0x02,0x20,0x00,0x00,}}, +{ 0x57E0, {0x01,0x00,0x22,0x00,0x2F,0x80,0xFF,0x80,0x28,0x00,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x31,0x00,0xCF,0xE0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x57E3, {0x01,0x00,0x63,0x00,0x7F,0xE0,0xF4,0x80,0x66,0xC0,0x69,0xA0,0x71,0x20,0x63,0x00,0xFF,0xE0,0x81,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x57F4, {0x01,0x00,0x21,0x00,0x2F,0xE0,0xF3,0xC0,0x2A,0x40,0x2B,0xC0,0x2A,0x40,0x3B,0xC0,0x6A,0x40,0x8B,0xC0,0x08,0x00,0x0F,0xE0,0x00,0x00,}}, +{ 0x57F7, {0x21,0x00,0x71,0x00,0x27,0x80,0xF9,0x80,0x89,0x80,0x4B,0x80,0x51,0x80,0xF9,0x80,0x22,0x80,0x7A,0xA0,0x24,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x57F9, {0x01,0x00,0x21,0x00,0x2F,0xE0,0xF2,0x80,0x22,0x80,0x3F,0xE0,0x20,0x00,0x27,0xC0,0x34,0x40,0xC4,0x40,0x07,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x57FA, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x1F,0x00,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x24,0x80,0x7F,0xC0,0x84,0x20,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x57FC, {0x01,0x00,0x21,0x00,0x2F,0xC0,0xF2,0x80,0x24,0x40,0x3F,0xE0,0x20,0x40,0x37,0x40,0x65,0x40,0x87,0x40,0x04,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x5800, {0x00,0x00,0x2F,0xE0,0x28,0x20,0xFF,0xE0,0x28,0x80,0x2A,0xC0,0x2A,0xC0,0x3B,0xC0,0xD4,0xA0,0x14,0xA0,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x5802, {0x24,0x80,0x15,0x00,0x7F,0xE0,0x80,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5805, {0x00,0x00,0x7F,0xC0,0x7A,0x40,0x79,0x80,0x79,0x80,0x52,0x80,0x7C,0x60,0x44,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5806, {0x04,0x80,0x24,0x80,0x25,0x00,0xFF,0xE0,0x2D,0x00,0x27,0xC0,0x25,0x00,0x35,0x00,0x67,0xC0,0x85,0x00,0x07,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x580A, {0x00,0x00,0xFF,0xE0,0x3B,0x80,0x7B,0x80,0x7B,0x80,0x6A,0x80,0x0A,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x580B, {0x00,0x00,0x37,0xE0,0x35,0xE0,0x7D,0xE0,0x37,0xE0,0x35,0xE0,0x35,0xE0,0x37,0xE0,0x7D,0xE0,0x49,0xA0,0x19,0xA0,0x13,0x60,0x00,0x00,}}, +{ 0x5815, {0x02,0x00,0xFF,0xE0,0xA7,0xC0,0xCC,0x40,0xB7,0xC0,0xA4,0x40,0xC7,0xC0,0x84,0x40,0xBF,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5819, {0x00,0x00,0x7F,0xE0,0x67,0xC0,0xFF,0xC0,0x6B,0xC0,0x6F,0xC0,0x69,0x40,0x73,0x00,0xEF,0xC0,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x581D, {0x00,0x00,0x33,0xC0,0x32,0xC0,0x7A,0xC0,0x32,0xC0,0x37,0xE0,0x34,0x20,0x3D,0xE0,0x75,0xE0,0x45,0xE0,0x05,0x20,0x04,0x60,0x00,0x00,}}, +{ 0x5821, {0x20,0x00,0x27,0x80,0x67,0x80,0x67,0x80,0xFF,0xE0,0x63,0x80,0x6D,0xC0,0x11,0x20,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5824, {0x00,0x00,0x27,0x80,0x24,0x80,0xF7,0x80,0x27,0x80,0x20,0x00,0x3F,0xE0,0x21,0x00,0x39,0xC0,0xCD,0x00,0x13,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x582A, {0x04,0x80,0x2F,0xE0,0x24,0x80,0xF7,0x80,0x27,0x80,0x24,0x80,0x3F,0xE0,0x2B,0x80,0x6E,0xC0,0x88,0x40,0x0F,0xE0,0x08,0x00,0x00,0x00,}}, +{ 0x582F, {0x04,0x00,0x3F,0x80,0x7F,0xC0,0x7F,0xC0,0x7B,0xC0,0x21,0x80,0x3F,0xE0,0xE0,0x00,0x7F,0xC0,0x19,0x20,0x31,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5830, {0x00,0x00,0x4F,0xE0,0x4B,0xC0,0xFA,0x40,0x4B,0xC0,0x4A,0x40,0x4B,0xC0,0x59,0x00,0x6F,0xE0,0x8B,0x80,0x0B,0x40,0x0F,0xE0,0x00,0x00,}}, +{ 0x5831, {0x20,0x00,0x7B,0xC0,0x22,0x40,0xFE,0xC0,0x4A,0x00,0x4B,0xC0,0x52,0x40,0xFF,0x40,0x22,0x80,0x7A,0x80,0x23,0x40,0x22,0x20,0x00,0x00,}}, +{ 0x5834, {0x00,0x00,0x27,0x80,0x24,0x80,0xF7,0x80,0x27,0x80,0x20,0x00,0x2F,0xE0,0x34,0x00,0x67,0xC0,0x8A,0xC0,0x15,0x40,0x03,0x80,0x00,0x00,}}, +{ 0x5835, {0x01,0x00,0x21,0x40,0x2F,0xC0,0xF1,0x80,0x3F,0xE0,0x21,0x00,0x27,0xC0,0x3C,0x40,0xF7,0xC0,0x04,0x40,0x07,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x583A, {0x00,0x00,0x2F,0xC0,0x29,0x40,0xFF,0xC0,0x2F,0xC0,0x2B,0x40,0x22,0x80,0x34,0xC0,0xCC,0xA0,0x14,0x80,0x08,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x583D, {0x00,0x00,0x6F,0xC0,0x6B,0xC0,0xFF,0xC0,0x60,0x00,0x7F,0xE0,0x61,0x00,0x71,0x00,0xF1,0xC0,0x91,0x00,0x1F,0xE0,0x10,0x00,0x00,0x00,}}, +{ 0x5840, {0x00,0x00,0x2F,0xE0,0x28,0x20,0xFF,0xE0,0x2A,0x40,0x2F,0xE0,0x2A,0x80,0x3A,0x80,0xDF,0xE0,0x12,0x80,0x14,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x5841, {0x00,0x00,0x7F,0x80,0x44,0x80,0x7F,0x80,0x7F,0x80,0x40,0x40,0x21,0x80,0x14,0x80,0xE4,0x60,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x584A, {0x01,0x00,0x22,0x00,0x2F,0xC0,0xF9,0x40,0x2F,0xC0,0x2F,0xC0,0x2B,0x40,0x32,0x80,0x66,0xC0,0x8B,0xE0,0x12,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x584B, {0x21,0x80,0x31,0xC0,0x6B,0xC0,0xE7,0x80,0x71,0x80,0x4A,0x40,0x7F,0xE0,0xC4,0x40,0xBF,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5851, {0x24,0x00,0x19,0xE0,0x7F,0x20,0x35,0xE0,0x3D,0xE0,0x35,0x20,0x12,0x20,0x22,0x60,0x0F,0x80,0x02,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5852, {0x01,0x80,0x61,0x80,0x7F,0xC0,0xF5,0x80,0x77,0xE0,0x7C,0x80,0x74,0x80,0x77,0xE0,0xFE,0x80,0x99,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5854, {0x04,0x80,0x44,0x80,0x5F,0xE0,0xF4,0x80,0x43,0x00,0x44,0x80,0x5F,0xE0,0x70,0x00,0xCF,0xC0,0x08,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x5857, {0x21,0x00,0x12,0x80,0x87,0xC0,0x49,0x20,0x3F,0xE0,0x25,0x80,0x59,0x40,0x47,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5858, {0x01,0x00,0x2F,0xE0,0x29,0x00,0xFF,0xC0,0x2F,0xE0,0x29,0x40,0x2F,0xC0,0x38,0x00,0x6F,0xC0,0x94,0x40,0x17,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x5859, {0x01,0x00,0x21,0x00,0x3F,0xE0,0xF7,0x80,0x24,0x80,0x27,0x80,0x20,0x00,0x3F,0xC0,0xF0,0x40,0x17,0xC0,0x17,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x585A, {0x00,0x00,0x2F,0xE0,0x28,0x00,0xFF,0xC0,0x27,0x20,0x39,0x40,0x23,0x80,0x2D,0xC0,0x72,0xA0,0x9C,0x80,0x00,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x585E, {0x04,0x00,0x7F,0xE0,0x51,0x40,0xBF,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x15,0x00,0x7F,0xC0,0x84,0x20,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x5862, {0x01,0x00,0x62,0x00,0x6F,0x80,0xF8,0x80,0x6F,0x80,0x68,0x00,0x6F,0xC0,0x78,0x00,0xEF,0xE0,0x9F,0xA0,0x15,0xA0,0x20,0xC0,0x00,0x00,}}, +{ 0x5869, {0x04,0x00,0x24,0x00,0x2F,0xE0,0xF7,0x80,0x24,0x80,0x27,0x80,0x20,0x00,0x3F,0xC0,0x6A,0xC0,0x8A,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x586B, {0x01,0x00,0x21,0x00,0x3F,0xE0,0xF7,0x80,0x24,0x80,0x27,0x80,0x24,0x80,0x37,0x80,0x64,0x80,0x9F,0xE0,0x06,0x80,0x18,0x40,0x00,0x00,}}, +{ 0x5870, {0x24,0x00,0x27,0xE0,0x9F,0xC0,0x47,0xC0,0x3F,0xE0,0x29,0xC0,0x4F,0xE0,0x44,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5872, {0x04,0x00,0x64,0x00,0x6F,0xC0,0xF7,0x80,0x67,0x80,0x64,0x80,0x67,0x80,0x7F,0xE0,0xEF,0xC0,0x9F,0xC0,0x35,0x40,0x0B,0x80,0x00,0x00,}}, +{ 0x5875, {0x02,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x7F,0xC0,0x5F,0x60,0x51,0x80,0x5F,0x20,0xB3,0xE0,0x9F,0x80,0x02,0x00,0x7F,0xE0,0x00,0x00,}}, +{ 0x5879, {0x20,0xC0,0xFF,0x00,0x7B,0xE0,0x7B,0xE0,0x7A,0x80,0x7A,0x80,0xFC,0x80,0x28,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x587E, {0x21,0x00,0xF9,0x00,0x07,0x80,0x79,0x80,0x4B,0x80,0x79,0x80,0x19,0xA0,0xF2,0x60,0x14,0x20,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x5883, {0x01,0x00,0x2F,0xC0,0x24,0x80,0xFF,0xE0,0x20,0x00,0x27,0x80,0x24,0x80,0x37,0x80,0x64,0x80,0x87,0x80,0x0D,0x20,0x30,0xE0,0x00,0x00,}}, +{ 0x5885, {0x00,0x00,0x7B,0xC0,0x79,0x80,0x7F,0xE0,0x79,0xC0,0x21,0x80,0x79,0x80,0x31,0x00,0xFF,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5893, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x35,0x80,0xDF,0x60,0x04,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0x5897, {0x02,0x40,0x11,0x80,0x17,0xE0,0x7F,0xE0,0x14,0xA0,0x17,0xE0,0x10,0x00,0x1B,0xC0,0x32,0x40,0x43,0xC0,0x03,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x589C, {0x04,0x80,0x73,0x00,0x6F,0xE0,0x7F,0x40,0x53,0xC0,0x5D,0x80,0x63,0xC0,0x4D,0x20,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x589F, {0x02,0x00,0x63,0xC0,0x6F,0xE0,0xFF,0xE0,0x73,0x40,0x7D,0xC0,0x73,0x80,0x7B,0xC0,0xFF,0xC0,0xA7,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58A8, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x7F,0xC0,0x1F,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58AB, {0x01,0x80,0x64,0xC0,0x7F,0xE0,0xFF,0xC0,0x6B,0xC0,0x6D,0xC0,0x6F,0xC0,0x78,0x40,0xEF,0xC0,0x9F,0xE0,0x04,0xC0,0x02,0x80,0x00,0x00,}}, +{ 0x58AE, {0x02,0x00,0x7F,0xE0,0x57,0xC0,0x6F,0xC0,0x57,0xC0,0x54,0x40,0x67,0xC0,0x47,0xC0,0x7F,0xC0,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58B3, {0x01,0x00,0x2F,0xC0,0x3F,0xE0,0xF4,0x80,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x38,0x40,0xCF,0xC0,0x0F,0xC0,0x06,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x58B8, {0x04,0x80,0x7F,0xE0,0x65,0x40,0xF7,0xC0,0x63,0xC0,0x7F,0xE0,0x61,0x80,0x77,0xC0,0xFF,0xC0,0x87,0xC0,0x07,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x58B9, {0x00,0x00,0x3E,0xE0,0x3E,0xE0,0x7E,0xE0,0x7E,0xE0,0x30,0x20,0x37,0xE0,0x34,0xE0,0x77,0xE0,0x57,0xE0,0x14,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x58BA, {0x01,0x00,0x62,0x00,0x6F,0xC0,0xFF,0xC0,0x6B,0xC0,0x6F,0xC0,0x6B,0xC0,0x7D,0xC0,0xFF,0xE0,0x9F,0xE0,0x0C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x58BB, {0x01,0x00,0x63,0x00,0x7F,0xE0,0xF7,0xC0,0x6B,0xA0,0x7F,0xE0,0x60,0x00,0x7F,0xC0,0xEB,0xC0,0x8B,0xC0,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x58BE, {0x33,0xC0,0xD3,0xC0,0x7A,0x40,0xF3,0xC0,0xDB,0x40,0x2A,0x80,0xCB,0x40,0x16,0x20,0x64,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x58C1, {0x00,0x80,0x78,0x80,0x4F,0xE0,0x7A,0x40,0x47,0xE0,0x78,0x80,0xBF,0xE0,0x04,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58C5, {0x04,0x00,0xFF,0xE0,0x63,0xE0,0xD7,0xE0,0x7B,0xC0,0x73,0xC0,0xF2,0x80,0x27,0xE0,0x7F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58C7, {0x01,0x00,0x3F,0xE0,0x2F,0xC0,0xFB,0xC0,0x2B,0xC0,0x2F,0xC0,0x27,0x80,0x34,0x80,0x67,0x80,0x87,0x80,0x00,0x00,0x3F,0xE0,0x00,0x00,}}, +{ 0x58CA, {0x01,0x00,0x3F,0xE0,0x21,0x00,0xFF,0xC0,0x2A,0xC0,0x2F,0xC0,0x21,0x00,0x7F,0xE0,0x87,0x40,0x1D,0x80,0x07,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x58CC, {0x01,0x00,0x3F,0xE0,0x24,0x80,0xFF,0xE0,0x22,0x80,0x2F,0xC0,0x22,0x80,0x3F,0xE0,0x67,0xC0,0x9D,0x80,0x06,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x58D1, {0x20,0x00,0x3B,0xC0,0x7E,0x40,0xF9,0x80,0xF1,0x80,0x79,0x80,0xEE,0x40,0x38,0x20,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58D3, {0x00,0x00,0x7F,0xE0,0x7E,0xE0,0x7F,0xE0,0x7E,0xC0,0x62,0x80,0x7F,0x40,0xFF,0x40,0xBF,0xA0,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58D5, {0x01,0x00,0x5F,0xE0,0x47,0x80,0xF7,0x80,0x5F,0xE0,0x50,0x20,0x5F,0xE0,0x73,0x20,0x5F,0x80,0x87,0xC0,0x1D,0xA0,0x03,0x00,0x00,0x00,}}, +{ 0x58D7, {0x01,0x00,0x6F,0xC0,0x6F,0xE0,0xFF,0xE0,0x6F,0xC0,0x61,0x00,0x7F,0xE0,0x7A,0xC0,0xFF,0xE0,0x8F,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58D8, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7F,0xC0,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x58D9, {0x01,0x00,0x6F,0xE0,0x6F,0xE0,0xFF,0xE0,0x6B,0x80,0x6F,0xE0,0x6B,0xC0,0x7B,0xC0,0xEB,0xC0,0x9B,0xC0,0x13,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x58DC, {0x07,0x80,0x64,0x80,0x67,0x80,0xFF,0xC0,0x63,0x00,0x7F,0xE0,0x71,0x40,0x7D,0xC0,0xEF,0xC0,0x9F,0xE0,0x02,0xC0,0x0F,0xC0,0x00,0x00,}}, +{ 0x58DE, {0x01,0x00,0x7F,0xE0,0x67,0xC0,0xFF,0xC0,0x6F,0xC0,0x61,0x00,0x6D,0xC0,0x7F,0xC0,0xE7,0x40,0x9D,0xC0,0x07,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x58DF, {0x22,0x00,0x7B,0xC0,0xFF,0xC0,0xFF,0xC0,0x4B,0xC0,0x7B,0xC0,0x7A,0xE0,0x59,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58E4, {0x01,0x00,0x7F,0xE0,0x6F,0xC0,0xFF,0xC0,0x63,0x80,0x7F,0xE0,0x6F,0xC0,0x63,0x80,0xFF,0xE0,0x9D,0xC0,0x07,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x58E5, {0x00,0x00,0x6F,0xE0,0x6B,0xC0,0xFB,0xC0,0x6B,0xC0,0x69,0x80,0x6B,0xC0,0x7F,0xE0,0xFF,0xE0,0x97,0xE0,0x31,0x80,0x2F,0xE0,0x00,0x00,}}, +{ 0x58EB, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x58EC, {0x01,0x80,0x0E,0x00,0x74,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x58EE, {0x21,0x00,0x21,0x00,0x21,0x00,0xA1,0x00,0x7F,0xE0,0x21,0x00,0x21,0x00,0x61,0x00,0x61,0x00,0xA1,0x00,0x2F,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x58EF, {0x11,0x00,0x51,0x00,0x51,0x00,0x71,0x00,0x5F,0xE0,0x11,0x00,0x11,0x00,0xF1,0x00,0x51,0x00,0x51,0x00,0x9F,0xC0,0x10,0x00,0x00,0x00,}}, +{ 0x58F0, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x00,}}, +{ 0x58F1, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x00,0x00,0x7F,0xE0,0x50,0x40,0x93,0x00,0x1E,0x00,0x10,0x40,0x10,0x40,0x0F,0xC0,0x00,0x00,}}, +{ 0x58F2, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x00,0x00,0x7F,0xE0,0x40,0x40,0x92,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x58F7, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x7F,0xE0,0x4A,0x40,0xBF,0x80,0x2A,0x80,0x3F,0x80,0x0A,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58F9, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x40,0x40,0xBF,0x80,0x3F,0x80,0x3F,0x80,0x1F,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58FA, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x4A,0x40,0xFB,0x80,0x60,0x80,0x7B,0x80,0x0A,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58FB, {0x00,0x00,0x7F,0xE0,0x61,0x40,0xF5,0x80,0x6B,0x00,0x71,0xE0,0x6F,0x80,0x78,0x80,0xEF,0x80,0x8F,0x80,0x08,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x58FC, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x7F,0xE0,0x40,0x40,0xFF,0x80,0x0A,0x00,0x7B,0x80,0x7B,0x80,0x3B,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x58FD, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x7F,0xE0,0x7A,0xC0,0x60,0x80,0x00,0x00,}}, +{ 0x5902, {0x08,0x00,0x08,0x00,0x0F,0x00,0x1F,0x80,0x31,0x80,0x31,0x00,0x49,0x00,0x0A,0x00,0x04,0x00,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5909, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x09,0x00,0x49,0x40,0x53,0x20,0xA8,0x20,0x0F,0x00,0x1A,0x00,0x24,0x00,0x1B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x590A, {0x08,0x00,0x48,0x00,0x4F,0x00,0x7F,0x80,0x31,0x80,0x21,0x00,0x51,0x00,0x0A,0x00,0x04,0x00,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x590F, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x0F,0x80,0x7B,0x00,0x1E,0x00,0xE1,0xE0,0x00,0x00,}}, +{ 0x5910, {0x07,0x80,0x19,0x00,0x7F,0xC0,0x3D,0x40,0x1F,0xC0,0x10,0xC0,0x1F,0xC0,0x1F,0xC0,0x1F,0xC0,0x3F,0x80,0x07,0x00,0x78,0xE0,0x00,0x00,}}, +{ 0x5915, {0x04,0x00,0x04,0x00,0x07,0xC0,0x08,0x40,0x14,0x40,0x22,0x80,0x01,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x18,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x5916, {0x21,0x00,0x21,0x00,0x3D,0x00,0x25,0x00,0x25,0x00,0x65,0x00,0x59,0xC0,0x89,0x20,0x11,0x00,0x11,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x5918, {0x30,0x00,0x31,0xE0,0x3D,0x20,0x35,0x20,0x35,0x20,0x35,0x20,0x59,0x20,0x09,0x20,0x09,0x60,0x11,0x40,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5919, {0x00,0x00,0x7F,0x80,0x40,0x80,0x5E,0x80,0x48,0x80,0x4E,0x80,0x4A,0x80,0x5A,0x80,0x66,0x80,0x44,0xA0,0x48,0x60,0x90,0x20,0x00,0x00,}}, +{ 0x591A, {0x08,0x00,0x0F,0x80,0x19,0x00,0x66,0x00,0x07,0x00,0x19,0xE0,0x62,0x20,0x0E,0x40,0x11,0x80,0x03,0x00,0x1C,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x591B, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0F,0x80,0x30,0x80,0x49,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x591C, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x22,0x00,0x23,0x80,0x46,0x80,0x45,0x80,0xCD,0x80,0x53,0x00,0x43,0x00,0x4C,0x80,0x70,0x60,0x00,0x00,}}, +{ 0x5922, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0x80,0x7F,0x80,0x00,0x00,0x7F,0xE0,0x44,0x40,0x8F,0x00,0x3A,0x00,0x0C,0x00,0x70,0x00,0x00,0x00,}}, +{ 0x5925, {0x01,0x00,0x79,0x00,0x7B,0xC0,0x7E,0x40,0x79,0x80,0x21,0x80,0xFA,0xE0,0x71,0xA0,0x6B,0xC0,0xA0,0xC0,0x20,0x80,0x23,0x00,0x00,0x00,}}, +{ 0x5927, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5929, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0E,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x592A, {0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x19,0x00,0x24,0x80,0x44,0x40,0x80,0x20,0x00,0x00,}}, +{ 0x592B, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x592C, {0x04,0x00,0x04,0x00,0x3F,0x80,0x3F,0x80,0x04,0x80,0x04,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x592D, {0x01,0x80,0x07,0x00,0x3C,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0C,0x00,0x0A,0x00,0x12,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x592E, {0x04,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5931, {0x04,0x00,0x24,0x00,0x24,0x00,0x3F,0x80,0x44,0x00,0x44,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5932, {0x04,0x00,0x04,0x00,0xFF,0xE0,0xFF,0xE0,0x13,0x00,0x25,0x80,0xC4,0x60,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5937, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x7F,0x80,0x04,0x80,0x7F,0x80,0x44,0x00,0x7F,0xE0,0x04,0x20,0x0A,0x20,0x31,0xC0,0xC0,0x60,0x00,0x00,}}, +{ 0x5938, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1A,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x80,0x08,0x00,0x0F,0x80,0x01,0x00,0x01,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x593E, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x25,0x80,0x25,0x80,0x35,0x80,0x55,0x40,0x4E,0x40,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5944, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0xA0,0x24,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x5947, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x80,0x3C,0x80,0x24,0x80,0x3C,0x80,0x24,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x5948, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x31,0x80,0xDF,0x60,0x00,0x00,0x7F,0xC0,0x04,0x00,0x35,0x80,0xC4,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x5949, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x0A,0x00,0xFF,0xE0,0x24,0x80,0x5F,0x40,0x84,0x20,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x594E, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1E,0x00,0x35,0x80,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x1F,0x00,0x1F,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x594F, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x0A,0x00,0xFF,0xE0,0x13,0x00,0x6C,0xC0,0xBF,0xA0,0x0E,0x00,0x19,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x5950, {0x04,0x00,0x0F,0x00,0xF2,0x00,0xFF,0x80,0x6A,0x80,0x6A,0x80,0x71,0x80,0x04,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x5951, {0x20,0x00,0x27,0xC0,0xFD,0x40,0x29,0x40,0x72,0x40,0x3C,0x40,0xC4,0x80,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5954, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x15,0x00,0x3F,0x80,0xC4,0x60,0x15,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5955, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x09,0x00,0x69,0x40,0x51,0x40,0x27,0x00,0x04,0x00,0xFF,0xE0,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5957, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0xD0,0x60,0x1F,0x00,0x10,0x00,0x1F,0x00,0x10,0x00,0xFF,0xE0,0x13,0x00,0x7E,0x80,0x00,0x00,}}, +{ 0x5958, {0x51,0x80,0x51,0x80,0x77,0xE0,0xF7,0xE0,0xD1,0x80,0x53,0xC0,0x94,0x00,0x04,0x00,0xFF,0xE0,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x595A, {0x01,0x80,0x7F,0x80,0x64,0x40,0x48,0x40,0x39,0x00,0x07,0x00,0x0C,0x80,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x5960, {0x1F,0x80,0x61,0x80,0x9F,0xE0,0x3F,0xE0,0x6B,0x80,0x71,0x80,0x7F,0x80,0x60,0x80,0x3F,0x80,0xFF,0xE0,0x33,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x5962, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x3F,0x80,0xC7,0x60,0x7F,0xC0,0x09,0x00,0x3F,0x80,0xDF,0x80,0x1F,0x80,0x1F,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x5965, {0x04,0x00,0x08,0x00,0x3F,0x80,0x35,0x80,0x36,0x80,0x3F,0x80,0x2E,0x80,0x35,0x80,0xFF,0xE0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x5967, {0x08,0x00,0x10,0x00,0x7F,0x80,0x7E,0x80,0x6E,0x80,0x7F,0x80,0x6E,0x80,0x15,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x5968, {0x20,0xE0,0xAF,0x20,0x65,0x40,0x20,0x80,0x7F,0xE0,0xA4,0x80,0x22,0x80,0x25,0x80,0xFF,0xE0,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5969, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x19,0x80,0xFF,0xE0,0x6F,0x80,0x69,0x80,0x6F,0x80,0x7D,0x80,0x7D,0x80,0x60,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0x596A, {0x08,0x00,0xFF,0xE0,0x3B,0x80,0xFF,0xE0,0x32,0x00,0x3F,0x00,0x1F,0x00,0x12,0x00,0xFF,0xE0,0xFF,0xE0,0x09,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x596C, {0x51,0x00,0x53,0xC0,0x7D,0x80,0x17,0x80,0xFF,0xE0,0x54,0x80,0x52,0x80,0x90,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x596E, {0x04,0x00,0xFF,0xE0,0x3B,0x80,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x22,0x00,0x3F,0xC0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5973, {0x08,0x00,0x08,0x00,0x08,0x00,0xFF,0xE0,0x09,0x00,0x11,0x00,0x31,0x00,0x0A,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5974, {0x20,0x00,0x27,0xC0,0x22,0x40,0xFA,0x40,0x2A,0x40,0x29,0x40,0x29,0x80,0x71,0x80,0x11,0x00,0x1A,0x80,0x24,0x40,0x40,0x20,0x00,0x00,}}, +{ 0x5978, {0x20,0x00,0x23,0xC0,0x21,0x80,0xF9,0x80,0x69,0x80,0x6F,0xE0,0x69,0x80,0x79,0x80,0x19,0x80,0x19,0x80,0x21,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x597D, {0x20,0x00,0x27,0xC0,0x20,0x40,0xF8,0x80,0x28,0x80,0x29,0x00,0x4F,0xE0,0x71,0x00,0x19,0x00,0x29,0x00,0x21,0x00,0x43,0x00,0x00,0x00,}}, +{ 0x5981, {0x10,0x80,0x10,0x80,0x11,0xE0,0x7D,0xE0,0x36,0x20,0x35,0x20,0x34,0xA0,0x38,0xA0,0x0C,0x20,0x0C,0x20,0x10,0x20,0x20,0x40,0x00,0x00,}}, +{ 0x5982, {0x10,0x00,0x10,0x00,0x11,0xE0,0x7D,0x20,0x15,0x20,0x15,0x20,0x25,0x20,0x39,0x20,0x0D,0x20,0x09,0xE0,0x11,0x20,0x20,0x00,0x00,0x00,}}, +{ 0x5983, {0x20,0x00,0x23,0xC0,0x20,0x40,0xF8,0x40,0x2B,0xC0,0x2A,0x40,0x2A,0x00,0x72,0x00,0x1A,0x00,0x1A,0x20,0x22,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x5984, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x20,0x00,0x1F,0xC0,0x04,0x00,0x08,0x00,0xFF,0xE0,0x11,0x00,0x3E,0x00,0x0D,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x598A, {0x20,0x00,0x20,0xE0,0x27,0x80,0xF8,0x80,0x28,0x80,0x28,0x80,0x2F,0xE0,0x70,0x80,0x18,0x80,0x10,0x80,0x27,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x598D, {0x20,0x00,0x27,0xC0,0x22,0x80,0xFA,0x80,0x6A,0x80,0x6F,0xE0,0x6A,0x80,0x72,0x80,0x1A,0x80,0x1C,0x80,0x24,0x80,0x48,0x80,0x00,0x00,}}, +{ 0x5993, {0x20,0x80,0x20,0x80,0x27,0xE0,0xF8,0x80,0x2F,0xE0,0x2A,0x20,0x4A,0x40,0x71,0x40,0x10,0x80,0x29,0x80,0x22,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x5996, {0x20,0x40,0x20,0x80,0x27,0x00,0xF9,0x00,0x29,0x00,0x2F,0xE0,0x49,0x00,0x71,0x00,0x19,0x00,0x12,0x80,0x24,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x5999, {0x20,0x80,0x20,0x80,0x20,0x80,0xFA,0xC0,0x2A,0xC0,0x2A,0xA0,0x4C,0xE0,0x74,0xC0,0x10,0x80,0x18,0x80,0x23,0x00,0x4C,0x00,0x00,0x00,}}, +{ 0x599B, {0x04,0x00,0x64,0x80,0x7F,0x80,0x3F,0x80,0xFF,0xE0,0x08,0x00,0x7F,0xC0,0x11,0x00,0x1E,0x00,0x3F,0x00,0x0C,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x599D, {0x11,0x00,0x51,0x00,0x51,0x00,0x7F,0xE0,0x52,0xC0,0x12,0x80,0xF2,0x80,0x74,0x80,0x77,0x80,0x51,0x80,0x56,0x40,0x98,0x20,0x00,0x00,}}, +{ 0x59A3, {0x65,0x80,0x65,0x80,0x65,0x80,0xF5,0xA0,0xD7,0xC0,0x55,0x80,0x55,0x80,0xE5,0x80,0xB5,0x80,0x35,0xA0,0x47,0xA0,0x98,0xE0,0x00,0x00,}}, +{ 0x59A5, {0x00,0xC0,0x03,0x40,0x7C,0x40,0x24,0x80,0x21,0x00,0x04,0x00,0xFF,0xE0,0x08,0x80,0x11,0x00,0x1F,0x00,0x0D,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x59A8, {0x21,0x00,0x21,0x00,0x27,0xE0,0xFD,0x00,0x29,0x00,0x29,0xC0,0x29,0x40,0x71,0x40,0x1A,0x40,0x12,0x40,0x24,0x40,0x48,0x80,0x00,0x00,}}, +{ 0x59AC, {0x20,0x00,0x27,0xE0,0x21,0x00,0xF9,0x00,0x29,0x00,0x2A,0x00,0x4B,0xC0,0x76,0x40,0x1A,0x40,0x1A,0x40,0x23,0xC0,0x42,0x40,0x00,0x00,}}, +{ 0x59B2, {0x20,0x00,0x23,0xC0,0x22,0x40,0xFA,0x40,0x6B,0xC0,0x6A,0x40,0x6A,0x40,0x72,0x40,0x1B,0xC0,0x18,0x00,0x2F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x59B9, {0x20,0x80,0x20,0x80,0x27,0xE0,0xF8,0x80,0x28,0x80,0x2F,0xE0,0x49,0x80,0x72,0x80,0x14,0xC0,0x18,0xA0,0x28,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x59BB, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x04,0x80,0x3F,0x80,0x08,0x00,0xFF,0xE0,0x19,0x00,0x07,0x00,0x78,0xC0,0x00,0x00,}}, +{ 0x59BE, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x04,0x00,0x08,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x00,0x0D,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x59C6, {0x20,0x00,0x23,0xC0,0x22,0x40,0xFB,0x40,0x6B,0xC0,0x6F,0xE0,0x6A,0x40,0x7B,0x40,0x1B,0xC0,0x1F,0xE0,0x24,0x40,0x40,0x80,0x00,0x00,}}, +{ 0x59C9, {0x20,0x80,0x20,0x80,0x27,0xF0,0xF8,0x80,0x2B,0xE0,0x2A,0xA0,0x2A,0xA0,0x6A,0xA0,0x52,0xA0,0x1A,0xA0,0x20,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x59CB, {0x21,0x00,0x21,0x00,0x21,0x00,0xF2,0x40,0x52,0xE0,0x5F,0x20,0x50,0x00,0xD7,0xC0,0xA4,0x40,0x34,0x40,0x47,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x59D0, {0x20,0x00,0x23,0xC0,0x22,0x40,0xFA,0x40,0x2B,0xC0,0x2A,0x40,0x4A,0x40,0x73,0xC0,0x1A,0x40,0x12,0x40,0x2F,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x59D1, {0x21,0x00,0x21,0x00,0x27,0xE0,0xF9,0x00,0x29,0x00,0x29,0x00,0x4B,0xC0,0x72,0x40,0x1A,0x40,0x1A,0x40,0x23,0xC0,0x42,0x40,0x00,0x00,}}, +{ 0x59D3, {0x21,0x00,0x25,0x00,0x25,0x00,0xF7,0xE0,0x59,0x00,0x59,0x00,0x51,0x00,0xE7,0xC0,0xB1,0x00,0x31,0x00,0x4F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x59D4, {0x01,0x80,0x3F,0x00,0x04,0x00,0xFF,0xE0,0x37,0x00,0xE4,0xE0,0x08,0x00,0xFF,0xE0,0x11,0x00,0x3E,0x00,0x0D,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x59D9, {0x62,0x00,0x62,0x60,0x67,0x80,0xF4,0x80,0xDC,0x80,0x54,0x80,0x57,0xE0,0xE4,0x80,0xB4,0x80,0x34,0x80,0x45,0xE0,0x84,0x00,0x00,0x00,}}, +{ 0x59DA, {0x63,0x80,0x63,0x80,0x6F,0xC0,0xF7,0xC0,0xD3,0x80,0x53,0x80,0x57,0xC0,0xEB,0xC0,0xB7,0x80,0x35,0xA0,0x49,0xA0,0x90,0xE0,0x00,0x00,}}, +{ 0x59DC, {0x21,0x00,0x13,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x08,0x00,0xFF,0xE0,0x19,0x00,0x3F,0x00,0x19,0x00,0x60,0x80,0x00,0x00,}}, +{ 0x59E5, {0x21,0x00,0x21,0x40,0x27,0xC0,0xF1,0x80,0x5F,0xE0,0x51,0x00,0x52,0x00,0xE6,0xC0,0xAB,0x00,0x32,0x20,0x42,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x59E6, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x1A,0x00,0x0E,0x00,0x13,0x00,0x20,0x80,0xFF,0xE0,0x29,0x40,0x73,0x80,0x39,0xC0,0xC6,0x20,0x00,0x00,}}, +{ 0x59E8, {0x21,0x80,0x21,0x80,0x27,0xE0,0xFB,0xC0,0x69,0xC0,0x6B,0xC0,0x6B,0x80,0x77,0xE0,0x19,0xE0,0x19,0xC0,0x26,0x40,0x58,0x20,0x00,0x00,}}, +{ 0x59EA, {0x20,0x00,0x3F,0xE0,0x22,0x00,0xF4,0x80,0x5F,0xC0,0x51,0x40,0x51,0x00,0x6F,0xC0,0xA1,0x00,0x31,0x00,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x59EB, {0x20,0x00,0x27,0xE0,0x25,0x00,0xF5,0x00,0x57,0xC0,0x54,0x40,0x54,0x40,0x67,0xC0,0xB5,0x00,0x35,0x00,0x47,0xE0,0x84,0x00,0x00,0x00,}}, +{ 0x59F6, {0x21,0x80,0x21,0x80,0x21,0x80,0xF9,0x80,0x2A,0x40,0x2F,0xE0,0x48,0x00,0x6B,0xC0,0x12,0x40,0x1A,0x40,0x23,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x59FB, {0x10,0x00,0x13,0xE0,0x12,0xA0,0x7A,0xA0,0x2B,0xE0,0x2A,0xA0,0x2A,0xA0,0x72,0xE0,0x1B,0x60,0x12,0x20,0x23,0xE0,0x42,0x20,0x00,0x00,}}, +{ 0x59FF, {0x04,0x00,0x64,0x00,0x0F,0xE0,0x1B,0x00,0x25,0x80,0xD8,0x60,0x04,0x00,0xFF,0xE0,0x09,0x00,0x1E,0x00,0x0D,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x5A01, {0x02,0x80,0x02,0x40,0x7F,0xE0,0x7F,0x40,0x49,0x40,0x7F,0x40,0x52,0x80,0x52,0x80,0x7C,0x80,0x4D,0xA0,0x72,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x5A03, {0x20,0x80,0x20,0x80,0x23,0xC0,0xF8,0x80,0x28,0x80,0x2F,0xE0,0x28,0x80,0x73,0xC0,0x18,0x80,0x14,0x80,0x27,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5A09, {0x21,0x80,0x23,0xC0,0x23,0xC0,0xFB,0xC0,0x6B,0xC0,0x68,0x00,0x6F,0xE0,0x71,0x00,0x1B,0xC0,0x18,0x40,0x20,0xC0,0x41,0x80,0x00,0x00,}}, +{ 0x5A11, {0x21,0x00,0xA5,0xC0,0x45,0x60,0x1B,0xA0,0x23,0x80,0x43,0x00,0x5C,0x00,0x08,0x00,0xFF,0xE0,0x1E,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x5A18, {0x21,0x00,0x21,0x00,0x23,0xC0,0xFA,0x40,0x2B,0xC0,0x2A,0x40,0x2B,0xC0,0x73,0xA0,0x1A,0xC0,0x12,0x80,0x23,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x5A1A, {0x20,0x00,0x23,0xC0,0x23,0xC0,0xFB,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x71,0x80,0x1F,0xE0,0x19,0x20,0x22,0x20,0x4C,0xC0,0x00,0x00,}}, +{ 0x5A1C, {0x60,0x00,0x7F,0xC0,0x6B,0xC0,0xFF,0xC0,0xFB,0x80,0x6B,0xC0,0x7F,0xC0,0xEB,0xA0,0xEB,0xA0,0x7B,0xE0,0x5D,0x80,0xA1,0x80,0x00,0x00,}}, +{ 0x5A1F, {0x30,0x00,0x33,0xE0,0x32,0x20,0x7B,0xE0,0x68,0x00,0x2B,0xE0,0x2A,0x20,0x7B,0xE0,0x5B,0xE0,0x1B,0xE0,0x2A,0x20,0x42,0x60,0x00,0x00,}}, +{ 0x5A20, {0x20,0x00,0x27,0xE0,0x24,0x00,0xF7,0xC0,0x54,0x00,0x57,0xE0,0x55,0x40,0xF5,0x40,0xBD,0x80,0x29,0x80,0x51,0x40,0x86,0x20,0x00,0x00,}}, +{ 0x5A25, {0x61,0x80,0x63,0xC0,0x6F,0xA0,0xF3,0x80,0xDF,0xE0,0x53,0xC0,0x53,0xC0,0xE3,0xC0,0xBE,0x80,0x32,0xE0,0x43,0x60,0x86,0x20,0x00,0x00,}}, +{ 0x5A29, {0x21,0x00,0x23,0xC0,0x26,0x80,0xFF,0xC0,0x55,0x40,0x55,0x40,0x57,0xC0,0xE5,0x40,0xB3,0x00,0x23,0x20,0x45,0x20,0x98,0xE0,0x00,0x00,}}, +{ 0x5A2F, {0x20,0x00,0x25,0xC0,0x25,0x40,0xF5,0x40,0x55,0xC0,0x55,0x40,0x54,0x00,0xE7,0xC0,0xB0,0x00,0x2F,0xE0,0x44,0x40,0x98,0x20,0x00,0x00,}}, +{ 0x5A35, {0x60,0x00,0x7F,0xE0,0x6A,0x00,0xEF,0xC0,0xEB,0x40,0x6B,0x40,0x6F,0xC0,0xEA,0x80,0x6E,0x80,0x7F,0xC0,0x43,0x40,0x82,0x20,0x00,0x00,}}, +{ 0x5A36, {0x00,0x00,0xFC,0x00,0x7B,0xC0,0x7A,0x40,0x79,0x80,0x6B,0x80,0xFC,0x60,0x08,0x00,0xFF,0xE0,0x1E,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x5A3C, {0x10,0x00,0x13,0xC0,0x12,0x40,0x7B,0xC0,0x2B,0xC0,0x2A,0x40,0x28,0x00,0x77,0xE0,0x5C,0x20,0x17,0xE0,0x27,0xE0,0x44,0x20,0x00,0x00,}}, +{ 0x5A40, {0x60,0x00,0x7F,0xE0,0x74,0x40,0xFF,0x40,0xFB,0xC0,0x77,0xC0,0x77,0xC0,0xF7,0xC0,0xFE,0x40,0x78,0x40,0x50,0x40,0x90,0xC0,0x00,0x00,}}, +{ 0x5A41, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x25,0x80,0x3F,0x80,0xFF,0xE0,0x1D,0x00,0x07,0x00,0x79,0x80,0x00,0x00,}}, +{ 0x5A46, {0x41,0x00,0x2F,0xE0,0x89,0x00,0x2F,0xC0,0x53,0x80,0x5E,0xE0,0x24,0x00,0xFF,0xE0,0x09,0x00,0x1F,0x00,0x0C,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x5A49, {0x61,0x80,0x61,0x80,0x67,0xE0,0xFE,0x60,0xD2,0xC0,0x53,0xC0,0x55,0xC0,0xEF,0xC0,0x33,0x80,0x33,0xA0,0x45,0xA0,0x88,0xE0,0x00,0x00,}}, +{ 0x5A5A, {0x20,0xC0,0x27,0x80,0x24,0x80,0xF7,0xE0,0x54,0x80,0x57,0xA0,0x5C,0x60,0x67,0xE0,0xA4,0x40,0x37,0xC0,0x47,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x5A62, {0x21,0x00,0x23,0x00,0x23,0xC0,0xFB,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0x80,0x1F,0xE0,0x1F,0xE0,0x20,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x5A66, {0x20,0x00,0x27,0x80,0x24,0x80,0xF7,0x80,0x57,0x80,0x50,0x00,0x5F,0xE0,0x69,0x20,0xB7,0xC0,0x35,0x40,0x45,0xC0,0x81,0x00,0x00,0x00,}}, +{ 0x5A6A, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x79,0x80,0x6B,0xC0,0xA5,0xA0,0x20,0x00,0x08,0x00,0xFF,0xE0,0x1E,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x5A6C, {0x60,0x40,0x61,0xC0,0x67,0x60,0xF9,0xA0,0xD0,0xC0,0x57,0x80,0x51,0x80,0xE1,0x80,0x33,0xC0,0x31,0x80,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x5A7F, {0x20,0x00,0x2F,0xE0,0x21,0x40,0xF5,0xC0,0x57,0x00,0x59,0xE0,0x57,0xC0,0xF4,0x40,0x27,0xC0,0x37,0xC0,0x44,0x40,0x84,0xC0,0x00,0x00,}}, +{ 0x5A92, {0x22,0x80,0x22,0x80,0x2F,0xE0,0xF3,0x80,0x52,0x80,0x53,0x80,0x51,0x00,0x5F,0xE0,0xB3,0x80,0x2D,0x40,0x49,0x20,0x81,0x00,0x00,0x00,}}, +{ 0x5A9A, {0x30,0x00,0x37,0xE0,0x34,0xA0,0x7F,0xE0,0x7C,0x00,0x35,0xE0,0x35,0x20,0x75,0xE0,0x35,0xE0,0x3D,0xE0,0x29,0xE0,0x51,0x20,0x00,0x00,}}, +{ 0x5A9B, {0x20,0xE0,0x2F,0x20,0x25,0x40,0xFF,0xE0,0x51,0x00,0x5F,0xE0,0x51,0x00,0xF3,0xC0,0xA6,0x40,0x39,0x80,0x53,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x5ABC, {0x60,0x00,0x67,0xC0,0x65,0x40,0xF7,0xC0,0xD4,0x40,0x57,0xC0,0x50,0x00,0xEF,0xC0,0x3B,0xC0,0x3B,0xC0,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x5ABD, {0x60,0x00,0x67,0xE0,0x65,0x80,0xF7,0xC0,0xD5,0x80,0x57,0xC0,0x55,0x80,0xF7,0xE0,0x31,0xE0,0x3F,0xE0,0x4A,0x20,0x90,0xC0,0x00,0x00,}}, +{ 0x5ABE, {0x21,0x80,0x27,0xE0,0x23,0xC0,0xFB,0xC0,0x6F,0xE0,0x69,0x80,0x6B,0xC0,0x73,0xC0,0x1B,0xC0,0x1F,0xE0,0x22,0x40,0x42,0xC0,0x00,0x00,}}, +{ 0x5AC1, {0x22,0x00,0x22,0x00,0x2F,0xE0,0xF8,0x20,0x57,0xC0,0x53,0x20,0x5D,0xC0,0xE2,0x80,0xB5,0xC0,0x3A,0xA0,0x44,0x80,0x83,0x00,0x00,0x00,}}, +{ 0x5AC2, {0x63,0x00,0x6D,0xC0,0x69,0x40,0xED,0x40,0xE9,0x40,0x69,0x40,0x6F,0xC0,0xE3,0x00,0xEF,0xC0,0x66,0x80,0x43,0x80,0x9C,0xE0,0x00,0x00,}}, +{ 0x5AC9, {0x20,0x80,0x20,0x80,0x27,0xE0,0xFD,0x00,0x6D,0xC0,0x66,0x80,0x6C,0x80,0xBF,0xE0,0xFC,0x80,0x69,0x80,0x52,0x40,0xA4,0x20,0x00,0x00,}}, +{ 0x5ACB, {0x30,0x00,0x37,0x60,0x31,0x20,0x7F,0x60,0x7C,0xC0,0x34,0xC0,0x37,0x60,0x73,0x60,0x77,0x60,0x37,0x60,0x21,0x20,0x46,0x40,0x00,0x00,}}, +{ 0x5ACC, {0x24,0x40,0x22,0x80,0x2F,0xE0,0xF7,0xC0,0x52,0xC0,0x5F,0xE0,0x52,0xC0,0x67,0xC0,0xA6,0x80,0x3A,0xC0,0x52,0xA0,0x82,0x80,0x00,0x00,}}, +{ 0x5AD0, {0x60,0x40,0x7F,0x40,0x75,0x40,0xFF,0xE0,0xF7,0xE0,0x7F,0xA0,0x64,0xA0,0xFF,0xE0,0xE5,0xC0,0x69,0x40,0x51,0xE0,0xA3,0xA0,0x00,0x00,}}, +{ 0x5AD6, {0x60,0x00,0x7F,0xE0,0x67,0xC0,0xEF,0xC0,0xEB,0xC0,0x6F,0xC0,0x60,0x00,0xE7,0x80,0xEF,0xE0,0x7F,0xE0,0x49,0x40,0x83,0x00,0x00,0x00,}}, +{ 0x5AD7, {0x60,0x00,0x6F,0xC0,0x6B,0x80,0xEB,0x80,0xEB,0x80,0x68,0x00,0x6F,0xC0,0xED,0xC0,0xEF,0xC0,0x6F,0xC0,0x4F,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x5AE1, {0x41,0x00,0x41,0x00,0x5F,0xE0,0x42,0x80,0xEF,0xC0,0x69,0x40,0x6F,0xC0,0xA9,0x40,0xEB,0xC0,0x7B,0xC0,0x4B,0xC0,0x88,0xC0,0x00,0x00,}}, +{ 0x5AE3, {0x60,0x00,0x67,0xE0,0x61,0xC0,0xF3,0xC0,0xDF,0xE0,0x52,0x00,0x53,0xC0,0xE2,0x00,0x37,0xE0,0x3F,0xE0,0x4B,0xE0,0x90,0xC0,0x00,0x00,}}, +{ 0x5AE6, {0x61,0x00,0x69,0x40,0x67,0xE0,0xEF,0xE0,0xF7,0xC0,0x64,0x80,0x67,0x80,0xE3,0x00,0xEF,0xC0,0x69,0x40,0x49,0xC0,0x81,0x00,0x00,0x00,}}, +{ 0x5AE9, {0x64,0x80,0x64,0x80,0x6E,0x80,0xFF,0xE0,0xFF,0xC0,0x75,0xC0,0x75,0xC0,0xFF,0xC0,0xEE,0xC0,0x7D,0xC0,0x75,0xC0,0x85,0x20,0x00,0x00,}}, +{ 0x5AFA, {0x30,0x00,0x37,0xE0,0x37,0xE0,0x77,0xE0,0x77,0xE0,0x34,0x20,0x35,0xE0,0x75,0xE0,0x75,0xE0,0x35,0xE0,0x25,0xE0,0x46,0xE0,0x00,0x00,}}, +{ 0x5AFB, {0x30,0x00,0x37,0xE0,0x37,0xE0,0x77,0xE0,0x77,0xE0,0x34,0xA0,0x34,0xA0,0x77,0xE0,0x75,0xE0,0x37,0xE0,0x24,0xA0,0x44,0xE0,0x00,0x00,}}, +{ 0x5B09, {0x41,0x00,0x4F,0xE0,0x47,0xC0,0xFF,0xC0,0x54,0x40,0x57,0xC0,0x52,0x80,0xEF,0xE0,0x37,0xC0,0x2C,0x40,0x47,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x5B0B, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0xFC,0xC0,0xFF,0xC0,0x69,0x40,0x6F,0xC0,0xEB,0x40,0xEF,0xC0,0x7F,0xE0,0x43,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x5B0C, {0x60,0xC0,0x67,0x00,0x67,0xC0,0xFF,0xC0,0xD7,0x80,0x5B,0xC0,0x53,0xA0,0xEF,0xC0,0x3B,0x40,0x3B,0xC0,0x4B,0xC0,0x8A,0xC0,0x00,0x00,}}, +{ 0x5B16, {0x01,0x80,0x7B,0xC0,0x79,0x80,0x7F,0xE0,0x79,0x80,0x6B,0xC0,0xB9,0x80,0x09,0x80,0xFF,0xE0,0x1E,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x5B22, {0x21,0x00,0x2F,0xE0,0x27,0xE0,0xFF,0xE0,0x53,0x80,0x57,0xC0,0x53,0x80,0xEF,0xE0,0xB7,0xC0,0x2E,0x80,0x43,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x5B2A, {0x61,0x00,0x6F,0xE0,0x6F,0xC0,0xFF,0xC0,0xD9,0x80,0x53,0xC0,0x5E,0x40,0xD3,0xC0,0xE3,0xC0,0x33,0xC0,0x43,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x5B2C, {0x40,0x00,0x4F,0xC0,0x41,0x00,0xFF,0xE0,0x7D,0xC0,0x61,0x00,0x7F,0xE0,0xA1,0x00,0xAF,0xC0,0x7B,0x40,0x4B,0x40,0x8B,0x40,0x00,0x00,}}, +{ 0x5B30, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x37,0x40,0xFF,0xE0,0x1D,0x00,0x07,0x00,0x78,0xC0,0x00,0x00,}}, +{ 0x5B32, {0x04,0x00,0xF5,0xE0,0xF5,0xA0,0xFF,0xE0,0xFB,0xE0,0xFB,0xE0,0x6A,0x80,0xFF,0xE0,0x74,0xA0,0x5E,0xA0,0x59,0xA0,0xB1,0x60,0x00,0x00,}}, +{ 0x5B36, {0x61,0x00,0x67,0x80,0x67,0x80,0xF7,0x80,0xD4,0x80,0x57,0x80,0x5F,0xC0,0xEB,0x40,0x3F,0xC0,0x3F,0xE0,0x44,0xC0,0x98,0x80,0x00,0x00,}}, +{ 0x5B3E, {0x64,0x00,0x65,0xE0,0x7E,0xA0,0xFF,0xE0,0xF7,0xE0,0x75,0xA0,0x7F,0xE0,0xED,0xA0,0xEF,0xE0,0x75,0xE0,0x64,0xC0,0x85,0xA0,0x00,0x00,}}, +{ 0x5B40, {0x60,0x00,0x6F,0xC0,0x67,0xE0,0xEF,0xE0,0xF5,0xC0,0x65,0xC0,0x65,0x40,0xFF,0xC0,0xEF,0xC0,0x7F,0xC0,0x75,0xC0,0x85,0x40,0x00,0x00,}}, +{ 0x5B43, {0x61,0x00,0x7F,0xE0,0x6F,0xC0,0xEF,0xC0,0xE3,0x80,0x6F,0xC0,0x67,0x80,0xF3,0x80,0xFF,0xE0,0x7F,0xC0,0x77,0x80,0x8C,0x60,0x00,0x00,}}, +{ 0x5B45, {0x6B,0x80,0x6B,0xC0,0x6F,0xC0,0xF1,0x80,0xFF,0xE0,0x6B,0x80,0x7B,0xC0,0xFB,0xC0,0xFB,0x80,0x7B,0xE0,0x4F,0x60,0xB8,0x20,0x00,0x00,}}, +{ 0x5B50, {0x00,0x00,0x7F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B51, {0x00,0x00,0x1F,0xC0,0x00,0x80,0x01,0x00,0x02,0x00,0x02,0x40,0x03,0x80,0x1E,0x00,0x62,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x5B54, {0x01,0x00,0x79,0x00,0x09,0x00,0x11,0x00,0x31,0x00,0x21,0x00,0x39,0x00,0xE1,0x00,0x21,0x00,0x21,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x5B55, {0x00,0x00,0x7F,0x00,0x11,0xC0,0x11,0xC0,0x20,0x40,0x3F,0x40,0x41,0x80,0x82,0x00,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B57, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0x1F,0x00,0x01,0x00,0x06,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B58, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x10,0x00,0x17,0xC0,0x20,0x80,0x61,0x00,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x5B5A, {0x01,0x80,0x07,0x80,0x78,0x40,0x64,0x40,0x7F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B5B, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x7F,0xE0,0x40,0x40,0xBF,0x00,0x01,0x00,0x02,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B5C, {0x02,0x00,0xFA,0x00,0x0B,0xE0,0x16,0x80,0x24,0x80,0x3A,0x80,0xE1,0x00,0x21,0x00,0x21,0x00,0x22,0x80,0x2C,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x5B5D, {0x04,0x00,0x04,0x80,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x04,0x00,0x1F,0x80,0x21,0x00,0xC2,0x00,0x3F,0xC0,0x02,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x5B5F, {0x3F,0x80,0x02,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x3F,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5B63, {0x01,0x00,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x16,0x00,0x25,0x80,0xDF,0x60,0x02,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x1C,0x00,0x00,0x00,}}, +{ 0x5B64, {0x00,0x40,0x79,0x80,0x0F,0x80,0x15,0x80,0x25,0x80,0x25,0x80,0x35,0x80,0x65,0x40,0xA5,0x40,0x29,0xC0,0x3E,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x5B65, {0x20,0x00,0xFF,0xC0,0x69,0x40,0x79,0x80,0x1B,0x80,0x24,0x60,0xFF,0x00,0x03,0x00,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B66, {0x28,0x80,0x14,0x80,0x7F,0xE0,0x40,0x40,0x9F,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B69, {0x01,0x00,0xF3,0x00,0x1F,0xE0,0x29,0x00,0x26,0x80,0x62,0x80,0x71,0x40,0x63,0x40,0xE6,0x80,0x61,0xC0,0x66,0x20,0x78,0x20,0x00,0x00,}}, +{ 0x5B6B, {0x00,0x40,0xF1,0x80,0x1F,0x80,0x2E,0x80,0x22,0x80,0x41,0x40,0x6F,0xA0,0xC1,0x20,0x45,0x40,0x49,0x20,0x51,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x5B70, {0x21,0x00,0x31,0x00,0xFD,0x00,0x7F,0x80,0x4B,0x80,0x7D,0x80,0x03,0x80,0x79,0x80,0x1B,0x80,0xFA,0xA0,0x24,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x5B71, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x63,0x00,0x7F,0xC0,0x62,0x00,0x7F,0xE0,0x64,0x40,0x7F,0xE0,0x48,0xC0,0x98,0x80,0x00,0x00,}}, +{ 0x5B73, {0x21,0x00,0x13,0x00,0xFF,0xE0,0x7B,0xC0,0x39,0xC0,0x7F,0xE0,0x04,0x20,0x3F,0x80,0x06,0x00,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B75, {0x20,0x20,0x31,0xC0,0x7D,0xE0,0x76,0xA0,0x7C,0x00,0x7D,0xE0,0x74,0x40,0x74,0xC0,0xF7,0xE0,0xF8,0x80,0x70,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x5B78, {0x12,0x00,0x6B,0x80,0x7F,0x80,0x7B,0x80,0x77,0x80,0x6A,0x80,0x7F,0xE0,0xC0,0x40,0x9F,0x00,0x7F,0xC0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B7A, {0x00,0x00,0x77,0xC0,0x1F,0xE0,0x2F,0xE0,0x35,0xC0,0x61,0x00,0x7F,0xE0,0xE2,0x00,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x5B80, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x7F,0xE0,0x40,0x20,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x5B83, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x48,0x60,0x88,0x00,0x08,0x80,0x09,0x00,0x0E,0x00,0x08,0x00,0x08,0x20,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x5B85, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x81,0x00,0x06,0x00,0x38,0x00,0x08,0x00,0x0F,0xE0,0xF8,0x00,0x08,0x40,0x08,0x40,0x07,0xC0,0x00,0x00,}}, +{ 0x5B87, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x40,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5B88, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x40,0x01,0x00,0xFF,0xE0,0x01,0x00,0x21,0x00,0x11,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5B89, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x88,0x40,0x08,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x3A,0x00,0x07,0x00,0x18,0x80,0x60,0x40,0x00,0x00,}}, +{ 0x5B8B, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x84,0x20,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x15,0x00,0x64,0xC0,0x84,0x20,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5B8C, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9F,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5B8D, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x10,0x80,0x20,0x40,0xC0,0x40,0x00,0x00,}}, +{ 0x5B8F, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x88,0x00,0xFF,0xC0,0x08,0x00,0x12,0x00,0x12,0x00,0x24,0x00,0x45,0x80,0xBF,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x5B95, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0xFF,0xE0,0x10,0x00,0x10,0x00,0x3F,0x80,0x30,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5B97, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x5B98, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5B99, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x84,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5B9A, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0xFF,0xC0,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x34,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x5B9B, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xA0,0x40,0x3B,0xC0,0x2A,0x40,0x2A,0x40,0x7A,0x40,0x92,0x80,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5B9C, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x80,0x40,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5B9D, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x3F,0x80,0x05,0x00,0x04,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5B9F, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x84,0x40,0x3F,0x80,0x04,0x00,0x3F,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5BA2, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9F,0x20,0x31,0x00,0x4A,0x00,0x0E,0x00,0x31,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5BA3, {0x04,0x00,0x7F,0xE0,0x80,0x00,0x3F,0x80,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x5BA4, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x00,0x3F,0xC0,0x11,0x00,0x7E,0x80,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5BA5, {0x08,0x00,0x08,0x00,0x7F,0xE0,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30,0x80,0x3F,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5BA6, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x7F,0xE0,0xE4,0x00,0x7F,0x80,0x60,0x80,0x60,0x80,0x7F,0x80,0x64,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5BAE, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x40,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5BB0, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x84,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5BB3, {0x04,0x00,0x7F,0xE0,0xC4,0x40,0x3F,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5BB4, {0x04,0x00,0x7F,0xE0,0x80,0x40,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x19,0x00,0x0F,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0x5BB5, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x94,0x80,0x15,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x5BB6, {0x04,0x00,0x7F,0xE0,0x40,0x40,0xBF,0xC0,0x88,0x00,0x15,0x40,0x6F,0x40,0x37,0x80,0x4A,0x80,0x32,0x40,0xC2,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x5BB8, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x7F,0xC0,0x7F,0x80,0x60,0x00,0x7F,0xE0,0x6A,0x00,0x69,0x40,0x49,0x80,0x4E,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x5BB9, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x91,0x00,0x14,0x80,0x2A,0x80,0x11,0x00,0x60,0xC0,0xBF,0xA0,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5BBF, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x90,0x20,0x1F,0xC0,0x22,0x00,0x6F,0xC0,0xA8,0x40,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x5BC2, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xA0,0x00,0x3B,0xC0,0x22,0x40,0xFD,0x40,0x21,0x80,0x68,0x80,0xA5,0x80,0x22,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x5BC3, {0x04,0x00,0x7F,0xE0,0x8E,0x40,0x3E,0x00,0xFF,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x0A,0x80,0x1A,0xA0,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5BC4, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x0B,0x00,0x31,0x00,0xFF,0xE0,0x00,0x80,0x3C,0x80,0x24,0x80,0x3C,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x5BC5, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xBF,0xC0,0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x5BC6, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x8C,0x40,0x15,0x40,0x32,0x20,0x55,0xA0,0x1F,0x00,0x24,0x00,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5BC7, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x79,0xE0,0x81,0x00,0xFF,0xC0,0x72,0x40,0x71,0x80,0x71,0x80,0x57,0xC0,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x5BC9, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x90,0x00,0x32,0x00,0x3F,0xC0,0x62,0x00,0xFF,0x80,0xBF,0x80,0x3F,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5BCC, {0x04,0x00,0x7F,0xE0,0xBF,0xC0,0x1F,0x00,0x11,0x00,0x1F,0x00,0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5BD0, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xD1,0x00,0xD7,0xC0,0x71,0x00,0x5F,0xE0,0x13,0x80,0xF7,0x80,0x79,0x40,0x51,0x20,0x93,0x00,0x00,0x00,}}, +{ 0x5BD2, {0x04,0x00,0x7F,0xE0,0xD1,0x40,0xBF,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x15,0x00,0x62,0xC0,0x98,0x20,0x06,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5BD3, {0x04,0x00,0x7F,0xE0,0x80,0x40,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x5F,0x40,0x41,0xC0,0x40,0xC0,0x00,0x00,}}, +{ 0x5BD4, {0x04,0x00,0x7F,0xE0,0x9F,0x40,0x3F,0x80,0x3F,0x80,0x21,0x80,0x3F,0x00,0x00,0x00,0xFF,0xE0,0x67,0x80,0x5C,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5BDB, {0x04,0x00,0x7F,0xE0,0x91,0x00,0xFF,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x0A,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5BDD, {0x04,0x00,0x7F,0xE0,0x87,0xC0,0x20,0x80,0xA7,0x80,0x67,0x80,0x7F,0xE0,0x30,0x20,0x77,0xC0,0xA1,0x80,0x23,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x5BDE, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x3F,0x80,0x3F,0x00,0x21,0x80,0x3F,0x80,0x31,0x80,0x1F,0x00,0xFF,0xE0,0x1B,0x00,0x61,0xC0,0x00,0x00,}}, +{ 0x5BDF, {0x04,0x00,0x7F,0xE0,0xBC,0x40,0x2F,0xC0,0xDA,0x80,0x31,0x80,0x7F,0x60,0xC0,0x00,0x7F,0xC0,0x35,0x80,0xC4,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x5BE1, {0x04,0x00,0x7F,0xE0,0xBF,0x40,0x1F,0x00,0x31,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0xD1,0x60,0x26,0x00,0x00,0x00,}}, +{ 0x5BE2, {0x04,0x00,0x7F,0xE0,0xD7,0xC0,0xDF,0xE0,0x70,0xC0,0x57,0x80,0x1F,0xE0,0xF8,0x40,0x77,0x80,0x73,0x80,0x53,0x80,0x9C,0x60,0x00,0x00,}}, +{ 0x5BE4, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xD7,0xC0,0xD3,0x00,0x77,0x80,0x52,0x80,0x1F,0xE0,0xF7,0xC0,0x77,0xC0,0x57,0xC0,0x94,0x40,0x00,0x00,}}, +{ 0x5BE5, {0x04,0x00,0x7F,0xE0,0xFB,0xC0,0x3B,0x80,0x3B,0x80,0x2D,0x80,0x2A,0x00,0x33,0x80,0xDF,0xE0,0x1F,0x00,0x06,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x5BE6, {0x04,0x00,0x7F,0xE0,0x9F,0xC0,0xFF,0xE0,0x37,0x00,0x3F,0x00,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x5BE7, {0x04,0x00,0x7F,0xE0,0xCC,0x40,0x73,0x80,0x4F,0x40,0x7F,0x80,0x6A,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5BE8, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x35,0x80,0xFF,0xE0,0x9F,0x20,0x64,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x5BE9, {0x04,0x00,0x7F,0xE0,0xBF,0xC0,0x1F,0x00,0xFF,0xE0,0x15,0x00,0x3F,0x80,0xE4,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5BEB, {0x04,0x00,0x7F,0xE0,0xFB,0xC0,0x73,0x80,0x7B,0x80,0x60,0x80,0x3F,0x80,0x30,0x00,0xFF,0xC0,0xCF,0x40,0x6B,0xC0,0x41,0x80,0x00,0x00,}}, +{ 0x5BEE, {0x04,0x00,0x7F,0xE0,0x88,0x00,0xFF,0xE0,0x5F,0x40,0xE0,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x15,0x80,0x64,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x5BF0, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x7F,0x80,0x7F,0x80,0xFF,0xE0,0x3F,0x80,0x31,0x80,0x3F,0x00,0xF2,0x40,0x1D,0x80,0x20,0x60,0x00,0x00,}}, +{ 0x5BF3, {0x04,0x00,0x7F,0xE0,0xFB,0xC0,0xFF,0xC0,0x3B,0xC0,0x65,0xC0,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x71,0xC0,0x00,0x00,}}, +{ 0x5BF5, {0x04,0x00,0x7F,0xE0,0xF9,0xC0,0x51,0xC0,0xFD,0xC0,0x00,0x40,0x79,0xC0,0x49,0x00,0x79,0xC0,0x79,0xE0,0x49,0x20,0x59,0xE0,0x00,0x00,}}, +{ 0x5BF6, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xE0,0x3B,0xC0,0x63,0xC0,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x71,0xC0,0x00,0x00,}}, +{ 0x5BF8, {0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xE0,0x01,0x00,0x21,0x00,0x11,0x00,0x09,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x07,0x00,0x00,0x00,}}, +{ 0x5BFA, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x01,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5BFE, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x10,0x80,0x10,0x80,0x52,0x80,0x31,0x80,0x11,0x80,0x18,0x80,0x28,0x80,0x40,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x5BFF, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x08,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x31,0x00,0x49,0x00,0x89,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5C01, {0x20,0x80,0x20,0x80,0x78,0x80,0x27,0xE0,0xFC,0x80,0x22,0x80,0x21,0x80,0x79,0x80,0x20,0x80,0x38,0x80,0xE0,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5C02, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x01,0x00,0xFF,0xE0,0x11,0x00,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5C04, {0x10,0x40,0x20,0x40,0x7C,0x40,0x47,0xE0,0x7C,0x40,0x7E,0x40,0x45,0x40,0x7D,0x40,0xCC,0x40,0x34,0x40,0xC4,0x40,0x0C,0xC0,0x00,0x00,}}, +{ 0x5C05, {0x20,0x80,0x30,0x80,0xFC,0x80,0x7F,0xE0,0x48,0xC0,0x4A,0x80,0x79,0x80,0x71,0x80,0x70,0x80,0x50,0xA0,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x5C06, {0x20,0xC0,0x23,0x00,0x3E,0x40,0xA5,0x40,0x65,0x80,0x20,0x80,0x3F,0xE0,0x64,0x80,0xA2,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5C07, {0x11,0x00,0x53,0xC0,0x52,0x40,0x77,0x80,0x5B,0x80,0x13,0x80,0xF2,0x80,0x7F,0xE0,0x74,0x80,0x52,0x80,0x90,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5C08, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x64,0x80,0x3F,0x80,0x04,0xC0,0x7F,0xC0,0xFF,0xE0,0x33,0x00,0x13,0x00,0x00,0x00,}}, +{ 0x5C09, {0x00,0x40,0x7C,0x40,0x44,0x40,0x7D,0xE0,0x7C,0x40,0x41,0x40,0x7D,0xC0,0x50,0x40,0x78,0x40,0x74,0x40,0x90,0x40,0x30,0xC0,0x00,0x00,}}, +{ 0x5C0A, {0x21,0x00,0x12,0x00,0xFF,0xE0,0x3F,0x80,0x2A,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x01,0x00,0xFF,0xE0,0x11,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5C0B, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x00,0x80,0x3F,0x80,0x7B,0xC0,0x22,0x40,0xFB,0xC0,0x01,0x00,0xFF,0xE0,0x09,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5C0D, {0x28,0x40,0xAA,0x40,0x6E,0x40,0xFF,0xE0,0x64,0x40,0x29,0x40,0x7D,0xC0,0x10,0x40,0x7C,0x40,0x10,0x40,0x1C,0x40,0xE0,0xC0,0x00,0x00,}}, +{ 0x5C0E, {0x45,0x00,0x3F,0xE0,0x04,0x00,0xEF,0x80,0x2F,0x80,0x2F,0x80,0x68,0x80,0x9F,0xC0,0x01,0x00,0xFF,0xE0,0x09,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5C0F, {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5C11, {0x04,0x00,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0xE0,0x44,0xA0,0x85,0x00,0x0D,0x00,0x02,0x00,0x04,0x00,0x18,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x5C13, {0x20,0x00,0x20,0x00,0x3F,0xE0,0x7F,0xE0,0x44,0x00,0xA4,0x00,0x24,0x80,0x64,0xC0,0x44,0x40,0x84,0x40,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x5C16, {0x04,0x00,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x5C1A, {0x04,0x00,0x24,0x80,0x24,0x80,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5C20, {0x69,0x80,0x69,0x80,0x7D,0x80,0x7B,0xC0,0x6B,0xC0,0x7B,0xA0,0x6D,0xE0,0xFD,0xC0,0x70,0x80,0x7C,0x80,0x43,0x00,0x7C,0x00,0x00,0x00,}}, +{ 0x5C22, {0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x06,0x00,0x0A,0x00,0x0A,0x00,0x0A,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5C24, {0x04,0x80,0x04,0x40,0x04,0x40,0xFF,0xE0,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x14,0x00,0x14,0x00,0x24,0x20,0x44,0x20,0x83,0xE0,0x00,0x00,}}, +{ 0x5C28, {0x61,0x80,0x71,0x00,0x69,0x00,0xFA,0x80,0x74,0x80,0x71,0xC0,0x71,0x40,0x72,0x80,0x70,0x80,0x51,0x20,0x52,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x5C2D, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x21,0x00,0x21,0x00,0xFF,0xE0,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5C31, {0x21,0x00,0x21,0x80,0xFD,0x40,0x7F,0xE0,0x49,0x00,0x49,0x00,0x79,0x80,0x22,0x80,0x72,0x80,0x6C,0xA0,0xA8,0xA0,0x20,0xE0,0x00,0x00,}}, +{ 0x5C38, {0x00,0x00,0x3F,0xE0,0x30,0x20,0x3F,0xE0,0x30,0x20,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x00,0x00,}}, +{ 0x5C39, {0x00,0x00,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x04,0xC0,0x04,0x80,0x3F,0x80,0x04,0x80,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x5C3A, {0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x24,0x00,0x22,0x00,0x22,0x00,0x21,0x00,0x40,0x80,0x80,0x60,0x00,0x00,}}, +{ 0x5C3B, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x44,0x40,0x44,0x00,0x7F,0x80,0x44,0x80,0x44,0x80,0x48,0xA0,0x90,0xA0,0xA0,0x60,0x00,0x00,}}, +{ 0x5C3C, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x48,0x40,0x48,0x00,0x49,0xC0,0x4E,0x00,0x48,0x00,0x48,0x20,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x5C3D, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x22,0x00,0x41,0x00,0x4C,0x80,0x82,0x60,0x1C,0x00,0x02,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5C3E, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x43,0xC0,0x5E,0x00,0x43,0x80,0x5E,0x00,0x43,0xE0,0x7E,0x00,0x42,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5C3F, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x42,0x00,0x42,0x40,0x5F,0x40,0x47,0x80,0x4A,0x80,0x72,0x40,0x82,0x20,0x06,0x00,0x00,0x00,}}, +{ 0x5C40, {0x00,0x00,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xE0,0x20,0x20,0x2F,0x20,0x29,0x20,0x4F,0x20,0x49,0x20,0x80,0xC0,0x00,0x00,}}, +{ 0x5C41, {0x00,0x00,0x7F,0xC0,0x60,0x40,0x7F,0xC0,0x73,0x40,0x71,0x00,0x71,0x20,0x7F,0x40,0x71,0x80,0x51,0x20,0x5D,0x20,0xF1,0xE0,0x00,0x00,}}, +{ 0x5C45, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x42,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x5F,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5C46, {0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x31,0x00,0x39,0x20,0x3F,0xE0,0x39,0x20,0x3B,0xA0,0x2B,0xA0,0x2F,0xE0,0x48,0x20,0x00,0x00,}}, +{ 0x5C48, {0x00,0x00,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x29,0x40,0x29,0x40,0x2F,0xC0,0x29,0x40,0x31,0x20,0x31,0x20,0x5F,0xE0,0x10,0x20,0x00,0x00,}}, +{ 0x5C4A, {0x00,0x00,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x21,0x00,0x3F,0xE0,0x31,0x20,0x31,0x20,0x3F,0xE0,0x31,0x20,0x5F,0xE0,0x10,0x20,0x00,0x00,}}, +{ 0x5C4B, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0xC0,0x25,0x00,0x29,0x80,0x3E,0x40,0x44,0x00,0x5F,0x80,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5C4D, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x40,0x00,0x7F,0xE0,0x49,0x00,0x4F,0x40,0x53,0x80,0x6D,0x00,0x49,0x20,0x91,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x5C4E, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x72,0xC0,0x6A,0x80,0x6B,0x80,0x7F,0xE0,0x67,0x00,0x5A,0x80,0x72,0x60,0x82,0x00,0x00,0x00,}}, +{ 0x5C4F, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x64,0x80,0x7F,0xC0,0x65,0x80,0x65,0x80,0x7F,0xE0,0x49,0x80,0x51,0x80,0xA1,0x80,0x00,0x00,}}, +{ 0x5C50, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x69,0x80,0x77,0xE0,0x69,0x80,0x6F,0xC0,0x72,0x40,0x71,0x80,0x53,0x80,0x9C,0x60,0x00,0x00,}}, +{ 0x5C51, {0x00,0x00,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x35,0x40,0x3F,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x48,0x40,0x08,0x40,0x00,0x00,}}, +{ 0x5C53, {0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x3F,0xC0,0x38,0x40,0x3F,0xC0,0x38,0x40,0x3F,0xC0,0x2F,0xC0,0x26,0xC0,0x58,0x20,0x00,0x00,}}, +{ 0x5C55, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x49,0x00,0x7F,0xC0,0x49,0x00,0x7F,0xE0,0x49,0x40,0x49,0x80,0x4E,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x5C5E, {0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x27,0xE0,0x39,0x00,0x2F,0xC0,0x29,0x40,0x3F,0xE0,0x31,0xA0,0x3F,0xE0,0x30,0x20,0x50,0x60,0x00,0x00,}}, +{ 0x5C60, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x42,0x80,0x5F,0x80,0x43,0x00,0x7F,0xE0,0x4F,0x80,0x58,0x80,0x6F,0x80,0x4F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x5C61, {0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x52,0x80,0x4B,0x00,0x7F,0xE0,0x4A,0x80,0x76,0x40,0x7F,0xE0,0x48,0x80,0x47,0x00,0xB8,0xC0,0x00,0x00,}}, +{ 0x5C64, {0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x39,0x20,0x3F,0xE0,0x27,0xC0,0x27,0xC0,0x47,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x5C65, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x53,0xE0,0x5F,0x80,0x6B,0x80,0x52,0x80,0x73,0xC0,0x5F,0xC0,0x53,0x80,0x9E,0xE0,0x00,0x00,}}, +{ 0x5C6C, {0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x3D,0xC0,0x3F,0xC0,0x3A,0xC0,0x3F,0xE0,0x3F,0xE0,0x3F,0xA0,0x23,0xA0,0x5F,0xC0,0x00,0x00,}}, +{ 0x5C6E, {0x04,0x00,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x08,0x40,0x18,0x00,0x30,0x00,0x20,0x00,0x00,0x00,}}, +{ 0x5C6F, {0x08,0x00,0x09,0x80,0xFE,0x00,0x08,0x00,0x48,0x80,0x48,0x80,0x48,0x80,0x7F,0x80,0x48,0x80,0x08,0x20,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x5C71, {0x04,0x00,0x04,0x00,0x04,0x00,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,}}, +{ 0x5C76, {0x02,0x00,0x22,0x20,0x22,0x20,0x3F,0xE0,0x20,0x20,0x00,0x00,0x7F,0xE0,0x04,0x20,0x04,0x20,0x0C,0x20,0x18,0x20,0x60,0xC0,0x00,0x00,}}, +{ 0x5C79, {0x62,0x00,0x62,0x00,0x67,0xE0,0xF7,0xE0,0xF8,0x00,0xF7,0x80,0xF1,0x00,0xF3,0x00,0xF2,0x00,0xF4,0x20,0x84,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x5C8C, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7E,0x00,0x13,0x00,0x11,0x00,0x1F,0x80,0x10,0x80,0x29,0x00,0x27,0x00,0x4D,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x5C90, {0x01,0x00,0x21,0x00,0x2F,0xE0,0xB1,0x00,0xB1,0x00,0xBF,0xC0,0xB4,0x40,0xB2,0x80,0xF3,0x80,0x81,0x00,0x06,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x5C91, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x61,0x80,0xDF,0x60,0x3E,0x00,0x3F,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5C94, {0x1F,0x00,0x11,0x00,0xFF,0xE0,0x9F,0xA0,0x09,0x80,0x31,0x80,0x43,0x00,0x04,0x00,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5CA1, {0x00,0x00,0x7F,0xC0,0x51,0x40,0x52,0x40,0x7F,0xC0,0x44,0x40,0x55,0x40,0x55,0x40,0x5F,0x40,0x51,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5CA8, {0x00,0x00,0x27,0x80,0x24,0x80,0xB4,0x80,0xB7,0x80,0xB4,0x80,0xB4,0x80,0xB7,0x80,0xF4,0x80,0x84,0x80,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5CA9, {0x04,0x00,0x44,0x80,0x7F,0x80,0x00,0x00,0xFF,0xE0,0x10,0x00,0x10,0x00,0x3F,0x80,0x30,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5CAB, {0x30,0x80,0x30,0x80,0x30,0x80,0x7B,0xE0,0x7B,0xA0,0x7A,0xA0,0x7A,0xA0,0x7B,0xE0,0x7A,0xA0,0x7A,0xA0,0x43,0xE0,0x02,0x20,0x00,0x00,}}, +{ 0x5CAC, {0x00,0x00,0x27,0xE0,0x24,0xA0,0xB7,0xE0,0xB4,0xA0,0xB4,0xA0,0xB7,0xE0,0xB4,0xA0,0xF0,0x80,0x80,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5CB1, {0x22,0x80,0x22,0x40,0x6F,0xE0,0x61,0x00,0xA1,0x20,0x20,0xA0,0x04,0x60,0x04,0x00,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5CB3, {0x01,0x00,0x06,0x00,0x38,0x00,0x3F,0xC0,0x21,0x00,0x21,0x00,0xFF,0xE0,0x04,0x00,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5CB6, {0x30,0xC0,0x30,0x80,0x33,0xE0,0x7B,0xE0,0x7A,0x20,0x7A,0x20,0x7B,0xE0,0x7A,0x20,0x7A,0x20,0x7A,0x20,0x43,0xE0,0x02,0x20,0x00,0x00,}}, +{ 0x5CB7, {0x60,0x00,0x67,0xC0,0x64,0x40,0xF7,0xC0,0xF5,0xC0,0xF5,0x80,0xF7,0xE0,0xF5,0x80,0xF4,0x80,0xF4,0xA0,0x86,0x60,0x18,0x20,0x00,0x00,}}, +{ 0x5CB8, {0x04,0x00,0x44,0x80,0x7F,0x80,0x00,0x00,0x7F,0xE0,0x40,0x00,0x5F,0x80,0x42,0x00,0x5F,0xC0,0x42,0x00,0x82,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5CBB, {0x60,0xC0,0x67,0x80,0x65,0x80,0xF5,0x80,0xF7,0xE0,0xF5,0x80,0xF4,0x80,0xF4,0x80,0xF6,0x80,0xFC,0x60,0x8F,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x5CBC, {0x60,0x00,0x6F,0xC0,0x61,0x00,0xF5,0x40,0xF9,0x40,0xF1,0x00,0xFF,0xE0,0xF1,0x00,0xF1,0x00,0xF1,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5CBE, {0x61,0x00,0x61,0x00,0x61,0xE0,0xF1,0xE0,0xF1,0x00,0xF1,0x00,0xF7,0xC0,0xF4,0x40,0xF4,0x40,0xF4,0x40,0x87,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x5CC5, {0x61,0x00,0x63,0x00,0x62,0xC0,0xFF,0xE0,0xF2,0x80,0xF2,0x80,0xF2,0x80,0xFF,0xE0,0xF6,0x80,0x84,0x80,0x08,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5CC7, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x7F,0x80,0xC0,0x60,0x3F,0x80,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x5CD9, {0x61,0x00,0x63,0x00,0x67,0xC0,0xF1,0x00,0xFF,0xE0,0xF0,0x80,0xF0,0x80,0xFF,0xE0,0xF4,0x80,0xF2,0x80,0x80,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5CE0, {0x01,0x00,0x21,0x00,0x21,0xC0,0xB1,0x00,0xBF,0xE0,0xB0,0x00,0xBF,0xE0,0xB1,0x80,0xB1,0x40,0xF1,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5CE1, {0x01,0x00,0x21,0x00,0x2F,0xC0,0xB9,0x40,0xB5,0x40,0xB5,0x80,0xBF,0xE0,0xB3,0x00,0xF2,0x80,0x84,0x80,0x08,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x5CE8, {0x01,0x00,0x22,0xC0,0x2E,0xA0,0xB2,0x80,0xBF,0xE0,0xB2,0xA0,0xB2,0xC0,0xB3,0xC0,0xBE,0x80,0xFB,0xA0,0x82,0x60,0x06,0x20,0x00,0x00,}}, +{ 0x5CE9, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x18,0x40,0x71,0x40,0x21,0x00,0xFF,0xE0,0x31,0x40,0xF9,0xC0,0xE1,0xA0,0x26,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x5CEA, {0x62,0x80,0x62,0xC0,0x6C,0x40,0xF9,0x00,0xF3,0x00,0xF3,0x80,0xF4,0x80,0xFF,0xC0,0xF4,0xA0,0xF4,0x80,0x87,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x5CED, {0x61,0x00,0x65,0xC0,0x6D,0x60,0xF9,0x20,0xF7,0xC0,0xF4,0x40,0xF7,0xC0,0xF4,0x40,0xF7,0xC0,0x84,0x40,0x04,0x40,0x04,0xC0,0x00,0x00,}}, +{ 0x5CEF, {0x24,0x80,0x3F,0x80,0x0F,0x00,0x73,0x00,0x0E,0x00,0x35,0x00,0xDE,0xE0,0x04,0x00,0x1F,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5CF0, {0x01,0x00,0x23,0xC0,0x2E,0x80,0xB3,0x80,0xBD,0x60,0xB7,0xC0,0xB1,0x00,0xB7,0x80,0xF1,0x00,0x8F,0xE0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5CF6, {0x04,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x49,0x20,0x7F,0x20,0x41,0xC0,0x00,0x00,}}, +{ 0x5CFA, {0x60,0x00,0x6F,0xE0,0x67,0xC0,0xF7,0xC0,0xF7,0xC0,0xF5,0x40,0xF7,0xC0,0xFD,0x40,0xF6,0x00,0xF2,0x00,0x8D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x5CFB, {0x01,0x00,0x22,0xC0,0x2F,0xE0,0xB2,0x80,0xB2,0xA0,0xB4,0xE0,0xBB,0x80,0xB2,0x80,0xFD,0x00,0x83,0x00,0x0C,0xC0,0x30,0x20,0x00,0x00,}}, +{ 0x5CFD, {0x61,0x00,0x63,0x00,0x6F,0xE0,0xF5,0x80,0xF5,0x80,0xFB,0xC0,0xF9,0x20,0xF3,0x20,0xF3,0x80,0xF4,0x80,0x88,0x40,0x10,0x20,0x00,0x00,}}, +{ 0x5D07, {0x24,0x80,0x24,0x80,0x3F,0x80,0x7F,0xE0,0x40,0x40,0xBF,0x00,0x00,0x00,0xFF,0xE0,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x5D0B, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x35,0x80,0xFF,0xE0,0x25,0x80,0x35,0x80,0x7F,0xC0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5D0E, {0x20,0x80,0x20,0x80,0x27,0xE0,0x69,0x80,0x6A,0x40,0x6F,0xE0,0x68,0x40,0x6B,0xC0,0x7A,0xC0,0x7B,0xC0,0x40,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x5D11, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x60,0x80,0x7F,0x80,0x60,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0x20,0x72,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x5D14, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x12,0x00,0x3F,0xC0,0x22,0x00,0x7F,0x80,0xBF,0x80,0x3F,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5D15, {0x60,0x00,0x67,0xE0,0x67,0xC0,0xF7,0xC0,0xF5,0x80,0xF7,0xE0,0xF5,0x80,0xF5,0x80,0xF7,0xC0,0xF9,0x80,0x8F,0xE0,0x10,0x00,0x00,0x00,}}, +{ 0x5D16, {0x04,0x00,0x24,0x80,0x3F,0x80,0x7F,0xE0,0x42,0x00,0x5F,0x80,0x42,0x00,0x5F,0xC0,0x4F,0x80,0x42,0x00,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5D17, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x53,0x40,0x4A,0x40,0x7F,0xC0,0x44,0x40,0x65,0xC0,0x7F,0xC0,0x71,0xC0,0x40,0xC0,0x00,0x00,}}, +{ 0x5D18, {0x61,0x00,0x63,0x00,0x66,0x80,0xFF,0xC0,0xF0,0x20,0xFF,0xC0,0xFB,0xC0,0xFB,0xC0,0xFF,0xC0,0xFB,0xC0,0x8B,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x5D19, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x13,0x00,0x3F,0x80,0xC0,0x60,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x6A,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5D1A, {0x61,0x00,0x67,0xC0,0x6F,0xE0,0xFF,0xE0,0xF3,0xA0,0xF5,0xE0,0xF9,0x00,0xF3,0x80,0xFC,0x80,0xFB,0x00,0x87,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x5D1B, {0x60,0x00,0x67,0xE0,0x64,0x20,0xF7,0xE0,0xF5,0x80,0xF7,0xC0,0xF7,0xC0,0xF7,0xC0,0xF9,0x80,0x9D,0xA0,0x37,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x5D1F, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x13,0x00,0x3F,0x80,0xC4,0x60,0x3F,0x80,0x15,0x80,0x15,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x5D22, {0x60,0xC0,0x67,0xC0,0x65,0x60,0xF8,0x20,0xF7,0xC0,0xF1,0x40,0xFF,0xE0,0xF3,0x40,0xF7,0xC0,0xF1,0x00,0x81,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x5D29, {0x02,0x00,0x12,0x40,0x1F,0xC0,0x00,0x00,0x1C,0xE0,0x14,0xA0,0x1C,0xE0,0x14,0xA0,0x1C,0xE0,0x25,0x20,0x25,0x20,0x4E,0x60,0x00,0x00,}}, +{ 0x5D4B, {0x30,0x00,0x33,0xE0,0x32,0xE0,0x7B,0xE0,0x7A,0x00,0x7A,0xE0,0x7A,0xA0,0x7A,0xE0,0x7A,0xE0,0x7C,0xE0,0x44,0xE0,0x08,0xA0,0x00,0x00,}}, +{ 0x5D4C, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x51,0x00,0xFD,0xE0,0x53,0xC0,0x55,0x80,0x71,0x80,0x52,0x80,0x74,0x40,0x58,0x20,0x00,0x00,}}, +{ 0x5D4E, {0x30,0x00,0x33,0xC0,0x33,0xC0,0x7B,0xC0,0x7A,0xC0,0x7B,0xC0,0x78,0x80,0x7F,0xE0,0x7C,0xE0,0x7F,0xE0,0x44,0x20,0x04,0x60,0x00,0x00,}}, +{ 0x5D50, {0x24,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x23,0x80,0x3C,0x80,0x3F,0x80,0x35,0x80,0x5F,0x80,0x47,0xA0,0x79,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x5D52, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x1F,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x04,0x00,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5D5C, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x80,0x7C,0x80,0x7C,0x80,0x64,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5D69, {0x04,0x00,0x24,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x5D6C, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x3F,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0x0B,0xC0,0x1B,0xE0,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x5D6F, {0x04,0x40,0x42,0x80,0x4F,0xE0,0xD7,0xC0,0xD1,0x00,0xDF,0xE0,0xD2,0x00,0xD7,0xC0,0xF9,0x00,0x91,0x00,0x2F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5D73, {0x04,0x00,0x44,0x40,0x7F,0xC0,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x5D76, {0x30,0x00,0x37,0xE0,0x31,0x20,0x7F,0xE0,0x7D,0x80,0x7C,0x80,0x7F,0xE0,0x7B,0x60,0x7F,0xE0,0x7F,0xE0,0x41,0x20,0x06,0x40,0x00,0x00,}}, +{ 0x5D82, {0x61,0x00,0x6F,0xC0,0x6F,0xE0,0xFF,0xE0,0xF7,0x80,0xF4,0x80,0xF7,0x80,0xF4,0x80,0xF7,0x80,0xFF,0xE0,0x83,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x5D84, {0x04,0x00,0x44,0x40,0x7F,0xC0,0xFC,0xC0,0x33,0x00,0x7A,0x00,0x6B,0xE0,0x7A,0x80,0x7A,0x80,0x7C,0x80,0xFC,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x5D87, {0x60,0x00,0x6F,0xE0,0x6B,0x80,0xFB,0x80,0xFB,0x80,0xF8,0x00,0xFF,0xC0,0xFD,0xC0,0xFF,0xC0,0xFF,0xC0,0x8F,0xE0,0x08,0x00,0x00,0x00,}}, +{ 0x5D8B, {0x01,0x00,0x27,0x80,0x24,0x80,0xB7,0x80,0xB7,0x80,0xB4,0x00,0xB7,0xE0,0xB4,0x00,0xFF,0xE0,0x8F,0xA0,0x12,0x60,0x20,0xC0,0x00,0x00,}}, +{ 0x5D8C, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x1F,0x00,0x31,0x80,0x3F,0x80,0x3F,0x00,0x30,0x00,0x3F,0xE0,0x3F,0xC0,0x57,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x5D90, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x73,0xC0,0x5E,0xC0,0x61,0x80,0x6E,0xE0,0x77,0xC0,0x57,0xC0,0x7F,0x80,0x43,0x00,0x5F,0xE0,0x00,0x00,}}, +{ 0x5D9D, {0x63,0x80,0x61,0xC0,0x66,0x80,0xF7,0xE0,0xF8,0x40,0xF7,0xA0,0xF4,0x80,0xF4,0x80,0xF7,0x80,0x86,0x80,0x0F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5DA2, {0x61,0x00,0x6F,0xC0,0x6F,0xE0,0xFF,0xE0,0xFE,0xC0,0xF4,0x80,0xF7,0xE0,0xF8,0x00,0xFF,0xE0,0x83,0xA0,0x05,0xA0,0x18,0xE0,0x00,0x00,}}, +{ 0x5DAC, {0x64,0x40,0x62,0xC0,0x6F,0xE0,0xF7,0xC0,0xF3,0x00,0xFF,0xE0,0xF3,0xC0,0xFD,0xA0,0xFF,0xE0,0xFC,0xE0,0x84,0xE0,0x0F,0x20,0x00,0x00,}}, +{ 0x5DAE, {0x61,0x00,0x63,0x00,0x63,0x80,0xF4,0x80,0xFF,0xC0,0xF0,0x20,0xFF,0xC0,0xFB,0xC0,0xFE,0xC0,0x86,0x80,0x0A,0xC0,0x11,0x20,0x00,0x00,}}, +{ 0x5DB7, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x73,0xC0,0x4B,0xC0,0x79,0x80,0x47,0xE0,0xF9,0xC0,0xFB,0xC0,0xFB,0xC0,0x37,0x80,0xC9,0xE0,0x00,0x00,}}, +{ 0x5DBA, {0x24,0x80,0x24,0x80,0x3F,0x80,0x37,0xE0,0x29,0x00,0x7B,0xC0,0x42,0x40,0xFB,0xC0,0x2A,0x40,0x2B,0xC0,0x33,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x5DBC, {0x61,0x00,0x63,0xC0,0x65,0x40,0xF7,0xC0,0xF5,0xC0,0xF5,0xC0,0xF7,0xC0,0xF5,0xC0,0xFF,0xE0,0xFF,0xE0,0x84,0x40,0x08,0x40,0x00,0x00,}}, +{ 0x5DBD, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x2E,0xE0,0x7F,0xA0,0x61,0xE0,0x6E,0x80,0xAE,0x80,0x64,0x80,0xAF,0xC0,0x2F,0x40,0x6A,0x20,0x00,0x00,}}, +{ 0x5DC9, {0x61,0x80,0x63,0x80,0x6F,0xC0,0xF7,0xC0,0xF7,0xC0,0xF7,0xA0,0xFD,0xE0,0xF3,0x80,0xFF,0x80,0xF7,0xA0,0x83,0xE0,0x0C,0xE0,0x00,0x00,}}, +{ 0x5DCC, {0x04,0x00,0x24,0x40,0x3F,0xC0,0x1D,0x80,0x7F,0xE0,0x49,0x00,0x7D,0xE0,0x57,0x40,0x5C,0xC0,0x5C,0x80,0x75,0x40,0x86,0x20,0x00,0x00,}}, +{ 0x5DCD, {0x04,0x00,0x44,0x40,0x7F,0xC0,0x77,0x80,0xFF,0x80,0x77,0x80,0x6D,0x80,0xB7,0x80,0xFB,0xC0,0x73,0xE0,0x37,0x20,0x69,0xE0,0x00,0x00,}}, +{ 0x5DD2, {0x6E,0x80,0x7F,0xC0,0xE7,0xC0,0x6E,0xC0,0xF3,0xE0,0x6F,0xC0,0xFB,0xA0,0x0E,0x80,0x04,0x00,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x5DD3, {0x44,0x40,0x7F,0xC0,0x7F,0xE0,0x7F,0xE0,0xFB,0xC0,0xEA,0x40,0xFB,0xC0,0xFA,0x40,0xFB,0xC0,0xFB,0xC0,0x73,0x40,0xCE,0x20,0x00,0x00,}}, +{ 0x5DD6, {0x44,0x40,0x7F,0xC0,0x7B,0x80,0x7B,0x80,0x7F,0xE0,0x7D,0x80,0x51,0x80,0x7F,0xE0,0x7F,0xC0,0x7E,0x80,0x7F,0xC0,0x86,0x20,0x00,0x00,}}, +{ 0x5DDB, {0x11,0x20,0x11,0x20,0x11,0x20,0x12,0x20,0x32,0x40,0x24,0x40,0x48,0x80,0x24,0x40,0x32,0x40,0x13,0x20,0x11,0x20,0x11,0x20,0x00,0x00,}}, +{ 0x5DDD, {0x10,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x5DDE, {0x10,0x20,0x11,0x20,0x11,0x20,0x19,0x20,0x3D,0xA0,0x35,0x60,0x51,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x20,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x5DE1, {0x09,0x40,0x89,0x40,0x4A,0x40,0x12,0x80,0x34,0x80,0x12,0x80,0xEA,0x80,0x29,0x40,0x29,0x40,0x20,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5DE3, {0x28,0x80,0x15,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x15,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x5DE5, {0x00,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x5DE6, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x08,0x00,0x08,0x00,0x10,0x00,0x1F,0x80,0x22,0x00,0x22,0x00,0x42,0x00,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5DE7, {0x00,0x00,0x1F,0xE0,0xF2,0x00,0x22,0x00,0x23,0xC0,0x24,0x40,0x24,0x40,0x30,0x40,0x60,0x40,0x80,0x40,0x00,0x40,0x01,0x80,0x00,0x00,}}, +{ 0x5DE8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x00,0x40,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x5DEB, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x25,0x80,0x25,0x80,0x25,0x80,0x35,0x80,0x6F,0xC0,0x4E,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5DEE, {0x20,0x80,0x11,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x10,0x00,0x3F,0xC0,0x42,0x00,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5DF1, {0x00,0x00,0x7F,0x80,0x00,0x80,0x00,0x80,0x7F,0x80,0x40,0x80,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x7F,0xC0,0x00,0x00,}}, +{ 0x5DF2, {0x00,0x00,0x7F,0x80,0x00,0x80,0x00,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x40,0x00,0x40,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,}}, +{ 0x5DF3, {0x00,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x40,0x00,0x40,0x00,0x40,0x40,0x40,0x40,0x7F,0xC0,0x00,0x00,}}, +{ 0x5DF4, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x40,0x00,0x40,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,}}, +{ 0x5DF5, {0x01,0x80,0x7F,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0x80,0x72,0x80,0x72,0x80,0x7F,0x80,0x70,0x00,0x50,0x20,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x5DF7, {0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x61,0x40,0xBF,0x20,0x20,0x00,0x20,0x80,0x1F,0x80,0x00,0x00,}}, +{ 0x5DFB, {0x24,0x80,0x24,0x80,0x7F,0xC0,0x0A,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0xC1,0x60,0x3F,0x00,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0x5DFD, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x42,0x00,0x4A,0x40,0x79,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x5DFE, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0x40,0x44,0xC0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5E02, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5E03, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x0A,0x00,0x12,0x00,0x3F,0xC0,0x22,0x40,0x62,0x40,0xA2,0x40,0x22,0x40,0x22,0xC0,0x02,0x00,0x00,0x00,}}, +{ 0x5E06, {0x20,0x00,0x27,0x80,0xF4,0x80,0xB4,0x80,0xB6,0x80,0xB5,0x80,0xB5,0x80,0xB5,0x80,0xB4,0x80,0x28,0xA0,0x28,0xA0,0x30,0x60,0x00,0x00,}}, +{ 0x5E0B, {0x01,0x80,0x7F,0x00,0x7F,0xE0,0x7F,0xE0,0x7B,0x20,0xE4,0xE0,0x04,0x20,0x7F,0x80,0x64,0x80,0x64,0x80,0x67,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E0C, {0x19,0x00,0x07,0x00,0x7D,0x80,0x08,0x00,0xFF,0xE0,0x12,0x00,0x3F,0xC0,0x62,0x40,0xA2,0x40,0x22,0x40,0x22,0xC0,0x02,0x00,0x00,0x00,}}, +{ 0x5E11, {0x20,0x00,0x30,0x00,0xFF,0xC0,0x6A,0x40,0x71,0x80,0x1B,0x80,0x64,0x60,0xFF,0x80,0x64,0x80,0x64,0x80,0x65,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E16, {0x21,0x00,0x21,0x00,0xF1,0xE0,0xB1,0x00,0xB1,0x00,0xB1,0x00,0xB7,0xC0,0xB4,0x40,0xB4,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x5E19, {0x61,0x00,0x65,0x00,0xF7,0xC0,0xF7,0xC0,0xF9,0x00,0xF1,0x00,0xFF,0xE0,0xF3,0x00,0xE3,0x80,0x64,0x80,0x68,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x5E1A, {0x00,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x00,0x00,0x7F,0xE0,0xC4,0x40,0xFF,0x80,0x64,0x80,0x65,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E1B, {0x04,0x00,0x08,0x00,0x7F,0x80,0x7F,0x80,0x60,0x80,0x7F,0x80,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x5E1D, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xE0,0x44,0x40,0xBF,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E25, {0x21,0x00,0x41,0x00,0xF7,0xE0,0x95,0x20,0xF5,0x20,0x95,0x20,0x85,0x20,0xF5,0x20,0x95,0x20,0xF1,0x40,0x91,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x5E2B, {0x40,0x00,0x8F,0xE0,0xF1,0x00,0x97,0xC0,0xF5,0x40,0x95,0x40,0x85,0x40,0xF5,0x40,0x95,0x40,0xF1,0x00,0x91,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x5E2D, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,0x4F,0x80,0x42,0x00,0x5F,0xC0,0x52,0x40,0x52,0x40,0x92,0xC0,0x02,0x00,0x00,0x00,}}, +{ 0x5E2F, {0x24,0x80,0x24,0x80,0xFF,0xE0,0x3F,0x80,0x00,0x00,0x7F,0xE0,0x44,0x40,0xBF,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E30, {0x2F,0xC0,0x20,0x40,0xA7,0xC0,0xA0,0x40,0xAF,0xC0,0xA0,0x00,0xBF,0xE0,0x31,0x20,0x2F,0xC0,0x49,0x40,0x49,0xC0,0x81,0x00,0x00,0x00,}}, +{ 0x5E33, {0x20,0x00,0x27,0xC0,0xF4,0x00,0xB7,0x80,0xB7,0x80,0xB4,0x00,0xBF,0xE0,0xB5,0x40,0xB4,0x80,0x25,0x80,0x26,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x5E36, {0x2B,0x80,0x3B,0x80,0xFF,0xE0,0x2F,0xC0,0x20,0xC0,0x7F,0xE0,0x44,0x40,0xFF,0x80,0x64,0x80,0x64,0x80,0x65,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E37, {0x62,0x80,0x62,0x80,0xF7,0xE0,0xF7,0xE0,0xFD,0x80,0xF7,0xC0,0xF5,0x80,0xF5,0x80,0xF7,0xC0,0x65,0x80,0x67,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x5E38, {0x24,0x80,0x15,0x00,0x7F,0xE0,0x9F,0x20,0x11,0x00,0x1F,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E3D, {0x17,0xE0,0x14,0x20,0x7F,0xE0,0x5C,0x20,0x5F,0xE0,0x5B,0xC0,0x5A,0x40,0x5B,0xC0,0x5A,0x40,0x13,0xC0,0x13,0xC0,0x12,0x40,0x00,0x00,}}, +{ 0x5E40, {0x61,0x00,0x61,0x00,0xF1,0xE0,0xF7,0xC0,0xF4,0x40,0xF7,0xC0,0xF4,0x40,0xF7,0xC0,0xF7,0xC0,0x67,0xC0,0x62,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x5E43, {0x62,0x00,0x6F,0x80,0xFF,0xE0,0xFF,0xE0,0xF7,0x80,0xF4,0x80,0xF7,0x80,0xF1,0x80,0xF7,0xC0,0x7F,0xE0,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x5E44, {0x60,0x00,0x67,0xC0,0xF7,0xC0,0xF7,0xC0,0xF7,0xE0,0xF5,0x80,0xF5,0xC0,0xF7,0xC0,0xF7,0xC0,0x6F,0xC0,0x6F,0xE0,0x70,0x00,0x00,0x00,}}, +{ 0x5E45, {0x10,0x00,0x17,0xE0,0x7B,0xC0,0x5A,0x40,0x5B,0xC0,0x58,0x00,0x5F,0xE0,0x5C,0xA0,0x5F,0xE0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x5E47, {0x20,0x80,0x78,0xC0,0xFF,0xE0,0xFA,0x80,0x78,0x80,0x3C,0x80,0xE4,0x00,0x7F,0x80,0x64,0x80,0x64,0x80,0x65,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E4C, {0x20,0x00,0x27,0xC0,0xF4,0x40,0xB7,0xC0,0xB7,0xC0,0xB9,0x40,0xB5,0x80,0xBF,0xE0,0xB3,0x00,0x25,0x20,0x29,0x20,0x30,0xE0,0x00,0x00,}}, +{ 0x5E4E, {0x60,0x00,0x6F,0xE0,0xFF,0xC0,0xF7,0x80,0xF7,0x80,0xF4,0x80,0xF7,0x80,0xF3,0x00,0xFF,0xE0,0x62,0x00,0x64,0x40,0x78,0x40,0x00,0x00,}}, +{ 0x5E54, {0x60,0x00,0x67,0x80,0xF7,0x80,0xF7,0x80,0xF7,0x80,0xFF,0xC0,0xFB,0xC0,0xFF,0xC0,0xF7,0x80,0x63,0x80,0x63,0x80,0x7C,0x60,0x00,0x00,}}, +{ 0x5E55, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x15,0x00,0x7F,0xC0,0xA4,0xA0,0x24,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E57, {0x30,0x00,0x37,0xE0,0x7C,0xE0,0x7F,0xE0,0x7D,0xA0,0x7F,0xE0,0x7E,0xE0,0x7F,0xE0,0x7F,0xE0,0x37,0xE0,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x5E5F, {0x63,0x80,0x63,0xC0,0xFF,0xC0,0xF7,0x80,0xFF,0xE0,0xF1,0x80,0xFF,0xC0,0xFB,0xC0,0xFF,0xC0,0x6F,0xA0,0x69,0xE0,0x61,0x20,0x00,0x00,}}, +{ 0x5E61, {0x40,0xC0,0x4F,0x40,0xF9,0x40,0xDF,0xE0,0xD3,0x80,0xD5,0x80,0xDF,0xC0,0xD5,0xA0,0xD7,0x80,0x45,0x80,0x47,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x5E62, {0x61,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0xF7,0x80,0xF7,0x80,0xF5,0x80,0xF7,0x80,0xFF,0xC0,0x67,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5E63, {0x21,0x00,0xA9,0x00,0x73,0xE0,0xFF,0x40,0xF9,0x80,0xEF,0x40,0x84,0x20,0x3F,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x5E64, {0x21,0x00,0xE9,0x00,0xFF,0xE0,0xFE,0x40,0xF5,0x80,0xF7,0x60,0x84,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x5E72, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5E73, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x24,0x80,0x24,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5E74, {0x20,0x00,0x20,0x00,0x7F,0xC0,0x42,0x00,0xBF,0x80,0x12,0x00,0x12,0x00,0x12,0x00,0xFF,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5E75, {0x00,0x00,0x7B,0xC0,0x21,0x80,0x21,0x80,0x21,0x80,0xFF,0xE0,0x21,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x5E76, {0x21,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x5E78, {0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x20,0x80,0x11,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x5E79, {0x21,0x80,0x21,0x80,0xFE,0x40,0x78,0x20,0x4B,0xC0,0x78,0x80,0x48,0x80,0x7F,0xE0,0x20,0x80,0xF8,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5E7A, {0x02,0x00,0x02,0x00,0x04,0x00,0x28,0x80,0x18,0x80,0x05,0x80,0x03,0x00,0x02,0x00,0x04,0x80,0x19,0xC0,0x7E,0x20,0x00,0x20,0x00,0x00,}}, +{ 0x5E7B, {0x10,0x00,0x13,0xE0,0x10,0x20,0x64,0x20,0x34,0x20,0x18,0x20,0x08,0x20,0x18,0x20,0x14,0x20,0x7E,0x20,0x02,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x5E7C, {0x10,0x80,0x10,0x80,0x10,0x80,0x27,0xE0,0x68,0xA0,0x28,0xA0,0x10,0xA0,0x18,0xA0,0x25,0x20,0x3D,0x20,0x62,0x20,0x04,0x40,0x00,0x00,}}, +{ 0x5E7D, {0x04,0x00,0x15,0x80,0x77,0x40,0x6F,0x40,0x6D,0xC0,0x55,0xC0,0x5D,0xC0,0x6E,0xC0,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,}}, +{ 0x5E7E, {0x65,0x80,0x55,0x40,0xF7,0xC0,0x35,0x80,0x2D,0x40,0xFF,0xE0,0x04,0x80,0x7F,0xE0,0x32,0x80,0x2B,0x20,0x46,0xA0,0x98,0x60,0x00,0x00,}}, +{ 0x5E7F, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x00,0x00,}}, +{ 0x5E81, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x40,0x00,0x5F,0xE0,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x5E83, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x44,0x00,0x48,0x80,0x48,0xC0,0x5F,0x20,0x80,0x20,0x00,0x00,}}, +{ 0x5E84, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x42,0x00,0x5F,0xC0,0x42,0x00,0x42,0x00,0x42,0x00,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x5E87, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x50,0x00,0x51,0x00,0x51,0x20,0x5F,0x40,0x51,0x80,0x51,0x00,0x55,0x20,0x59,0x20,0xA1,0xE0,0x00,0x00,}}, +{ 0x5E8A, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x42,0x00,0x42,0x00,0x7F,0xE0,0x47,0x00,0x46,0x80,0x4A,0x80,0x52,0x40,0x62,0x20,0x82,0x00,0x00,0x00,}}, +{ 0x5E8F, {0x02,0x00,0x7F,0xE0,0x40,0x00,0x5F,0xC0,0x44,0x80,0x43,0x00,0x7F,0xE0,0x42,0x40,0x42,0x00,0x42,0x00,0x82,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x5E95, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x43,0x80,0x5D,0x00,0x51,0x00,0x5F,0xE0,0x51,0x00,0x58,0x80,0x70,0xA0,0x7F,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x5E96, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x4F,0xC0,0x48,0x40,0x5F,0x40,0x61,0x40,0x4F,0x40,0x49,0x80,0x48,0x20,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x5E97, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x42,0x00,0x43,0xE0,0x42,0x00,0x42,0x00,0x5F,0xC0,0x50,0x40,0x50,0x40,0x9F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x5E9A, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x5F,0x80,0x42,0x80,0x7F,0xE0,0x42,0x80,0x5F,0x80,0x42,0x00,0x45,0x00,0x48,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x5E9C, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x44,0x80,0x48,0x80,0x4F,0xE0,0x58,0x80,0x6A,0x80,0x49,0x80,0x48,0x80,0x48,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x5EA0, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x65,0x00,0x7F,0xC0,0x62,0x00,0x7F,0x80,0x62,0x00,0x7F,0xE0,0x7F,0xE0,0x42,0x00,0x82,0x00,0x00,0x00,}}, +{ 0x5EA6, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xE0,0x4F,0x00,0x40,0x00,0x7F,0x80,0x49,0x00,0x46,0x00,0x8D,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x5EA7, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x52,0x80,0x52,0x80,0x5A,0xC0,0x67,0x20,0x62,0x20,0x5F,0x80,0x42,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5EAB, {0x02,0x00,0x7F,0xE0,0x5F,0xC0,0x42,0x00,0x5F,0x80,0x52,0x80,0x5F,0x80,0x52,0x80,0x5F,0x80,0x7F,0xE0,0x82,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5EAD, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x78,0xC0,0x4B,0x80,0x70,0x80,0x7F,0xE0,0x68,0x80,0x5B,0xC0,0x48,0x00,0x56,0x00,0xA1,0xE0,0x00,0x00,}}, +{ 0x5EB5, {0x02,0x00,0x7F,0xE0,0x42,0x00,0x7F,0xE0,0x4B,0x00,0x72,0xC0,0x5F,0xA0,0x52,0x80,0x5F,0x80,0x5F,0x80,0x52,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x5EB6, {0x02,0x00,0x02,0x00,0x3F,0xE0,0x24,0x80,0x3F,0xE0,0x24,0x80,0x24,0x80,0x27,0x80,0x44,0x00,0x48,0x40,0xA5,0x20,0x24,0xA0,0x00,0x00,}}, +{ 0x5EB7, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x5F,0x80,0x42,0x80,0x7F,0xE0,0x42,0x80,0x5F,0xC0,0x43,0x40,0x4E,0x80,0xB2,0x60,0x06,0x00,0x00,0x00,}}, +{ 0x5EB8, {0x02,0x00,0x7F,0xE0,0x5F,0x80,0x42,0x80,0x7F,0xE0,0x7F,0x80,0x42,0x00,0x5F,0x80,0x5F,0x80,0x5F,0x80,0x92,0x80,0x12,0x80,0x00,0x00,}}, +{ 0x5EC1, {0x02,0x00,0x7F,0xE0,0x6C,0x00,0x7E,0x40,0x7F,0xC0,0x73,0xC0,0x7F,0xC0,0x73,0xC0,0x7F,0xC0,0x4E,0x40,0x52,0x40,0xA0,0xC0,0x00,0x00,}}, +{ 0x5EC2, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x69,0xC0,0x7F,0x40,0x69,0x40,0x6D,0xC0,0x7B,0x40,0x7B,0xC0,0x69,0x40,0x49,0xC0,0x89,0x40,0x00,0x00,}}, +{ 0x5EC3, {0x02,0x00,0x7F,0xE0,0x44,0x00,0x66,0xA0,0x55,0xA0,0x68,0xC0,0x7F,0xC0,0x55,0x20,0x7F,0xC0,0x49,0x00,0x91,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x5EC8, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x6F,0x80,0x6F,0x80,0x6F,0x80,0x68,0x80,0x6F,0x80,0x5F,0x80,0x43,0x80,0xBC,0xE0,0x00,0x00,}}, +{ 0x5EC9, {0x02,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,0x5F,0xC0,0x45,0x40,0x7F,0xE0,0x45,0x40,0x5F,0xC0,0x4D,0x80,0xB5,0x60,0x05,0x00,0x00,0x00,}}, +{ 0x5ECA, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x48,0x00,0x5E,0xC0,0x52,0xC0,0x5E,0x80,0x52,0xC0,0x5F,0xA0,0x56,0xE0,0x9A,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5ECF, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x7D,0x80,0x75,0x80,0x7D,0xA0,0x76,0x60,0x7F,0xC0,0x71,0x40,0x59,0x80,0x53,0x80,0x8E,0x60,0x00,0x00,}}, +{ 0x5ED0, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x7D,0xC0,0x75,0xC0,0x7D,0x80,0x75,0xE0,0x7D,0x80,0x70,0x80,0x59,0xA0,0x53,0xA0,0x8E,0x60,0x00,0x00,}}, +{ 0x5ED3, {0x02,0x00,0x7F,0xE0,0x48,0x00,0x7F,0xE0,0x5E,0xA0,0x52,0xC0,0x5F,0xC0,0x7E,0xA0,0x48,0xA0,0x7F,0xE0,0x88,0x80,0x18,0x80,0x00,0x00,}}, +{ 0x5ED6, {0x02,0x00,0x7F,0xE0,0x6F,0xC0,0x6F,0xC0,0x7B,0xC0,0x66,0xC0,0x7B,0xC0,0x6F,0xC0,0x7F,0xE0,0x47,0x80,0x43,0x80,0x9E,0x00,0x00,0x00,}}, +{ 0x5EDA, {0x02,0x00,0x7F,0xE0,0x7E,0x40,0x7E,0x40,0x7F,0xE0,0x60,0x40,0x7F,0x40,0x73,0xC0,0x7E,0x40,0x4C,0x40,0x4E,0x40,0xB0,0xC0,0x00,0x00,}}, +{ 0x5EDB, {0x02,0x00,0x7F,0xE0,0x7F,0x80,0x7F,0x80,0x72,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xE0,0x69,0xC0,0x7F,0xC0,0x42,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x5EDD, {0x02,0x00,0x7F,0xE0,0x75,0xC0,0x7F,0x80,0x77,0x00,0x7D,0xE0,0x75,0x80,0x7D,0x80,0x7F,0x80,0x7F,0x80,0x92,0x80,0x22,0x80,0x00,0x00,}}, +{ 0x5EDF, {0x02,0x00,0x7F,0xE0,0x50,0x00,0x7D,0xC0,0x5D,0x40,0x65,0xC0,0x7D,0x40,0x75,0x40,0x5D,0xC0,0x7F,0x40,0x92,0x40,0x94,0xC0,0x00,0x00,}}, +{ 0x5EE0, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x6B,0x00,0x7D,0x00,0x7F,0xE0,0x63,0x40,0x7F,0xC0,0x7E,0x80,0x7E,0x80,0xB3,0x40,0x26,0x20,0x00,0x00,}}, +{ 0x5EE1, {0x02,0x00,0x7F,0xE0,0x68,0x00,0x6F,0xE0,0x7B,0xC0,0x6B,0xC0,0x7F,0xE0,0x6B,0xC0,0x6F,0xE0,0x5F,0xE0,0x53,0x20,0xA3,0xA0,0x00,0x00,}}, +{ 0x5EE2, {0x02,0x00,0x7F,0xE0,0x6E,0x80,0x7F,0xA0,0x78,0xC0,0x7D,0xE0,0x65,0x80,0x7F,0xE0,0x7F,0xE0,0x7F,0xC0,0x45,0x80,0x9B,0x60,0x00,0x00,}}, +{ 0x5EE3, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xE0,0x62,0x00,0x7F,0x80,0x72,0x80,0x5F,0x80,0x5F,0x80,0x8D,0x80,0x30,0x40,0x00,0x00,}}, +{ 0x5EE8, {0x02,0x00,0x7F,0xE0,0x59,0xC0,0x5D,0xC0,0x69,0xC0,0x7F,0xC0,0x6B,0x80,0x7F,0xC0,0x7F,0xE0,0x7F,0xE0,0x62,0xC0,0xE6,0x80,0x00,0x00,}}, +{ 0x5EE9, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x77,0x80,0x75,0x80,0x77,0x80,0x7F,0x80,0x67,0x00,0x7F,0xE0,0x5B,0xC0,0xE2,0x60,0x00,0x00,}}, +{ 0x5EEC, {0x02,0x00,0x7F,0xE0,0x6F,0xE0,0x7F,0xE0,0x7F,0xC0,0x77,0x80,0x75,0x80,0x77,0x80,0x57,0x80,0x5F,0xC0,0xAB,0xC0,0x3F,0xE0,0x00,0x00,}}, +{ 0x5EF0, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x6F,0xE0,0x7D,0xA0,0x6F,0xE0,0x79,0x80,0x7F,0xE0,0x7F,0x20,0x4F,0x40,0x89,0xC0,0x00,0x00,}}, +{ 0x5EF1, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xE0,0x7F,0xC0,0x65,0xC0,0x7F,0xE0,0x41,0xC0,0x7F,0xE0,0x7F,0xC0,0x73,0xE0,0x9F,0x80,0x00,0x00,}}, +{ 0x5EF3, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x77,0xE0,0x7F,0xA0,0x67,0xE0,0x7C,0x00,0x7F,0xE0,0x5F,0xE0,0x57,0x60,0xBD,0xC0,0x00,0x00,}}, +{ 0x5EF4, {0x00,0x00,0x70,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x70,0x00,0x10,0x00,0x50,0x00,0x60,0x00,0x60,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5EF6, {0x00,0x00,0xE0,0xE0,0x2F,0x00,0x41,0x00,0x75,0x00,0x15,0xC0,0x55,0x00,0x55,0x00,0x3F,0xE0,0x20,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5EF7, {0x00,0x20,0x00,0xC0,0x77,0x80,0x10,0x80,0x20,0x80,0x3F,0xF0,0x10,0x80,0x50,0x80,0x20,0x80,0x33,0xE0,0x4C,0x00,0x83,0xF0,0x00,0x00,}}, +{ 0x5EF8, {0x01,0x00,0xE1,0x00,0x21,0x00,0x6F,0xC0,0x4B,0x40,0xE9,0x40,0x2F,0xC0,0xA9,0x40,0x6F,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5EFA, {0x01,0x00,0x01,0x00,0xEF,0xC0,0x3F,0xE0,0x41,0x40,0x6F,0xC0,0x21,0x00,0xAF,0xC0,0x61,0x00,0x7F,0xE0,0x59,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5EFB, {0x00,0x00,0x0F,0xC0,0xE8,0x40,0x2B,0xC0,0x4A,0xC0,0x6A,0xC0,0x2A,0xC0,0xAB,0xC0,0x4A,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5EFC, {0x00,0x00,0x1F,0xE0,0xE2,0x80,0x2F,0xC0,0x4A,0xC0,0x6A,0xC0,0x2A,0xC0,0xAC,0x40,0x6F,0xC0,0x2F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x5EFE, {0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x5EFF, {0x21,0x00,0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F01, {0x04,0x00,0x04,0x00,0x08,0x80,0x7F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x5F03, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x10,0x80,0x7F,0xC0,0x11,0x40,0x13,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F04, {0x00,0x00,0x3F,0x80,0x04,0x00,0x1F,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F09, {0x51,0x00,0x51,0x00,0x7F,0xE0,0xFF,0xE0,0xD1,0x00,0x57,0xC0,0x90,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x31,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F0A, {0x21,0x00,0x79,0x00,0xFB,0xE0,0xFF,0x40,0xFD,0xC0,0xE7,0x40,0xAD,0x20,0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F0B, {0x04,0x80,0x04,0x80,0x04,0x60,0x07,0xE0,0x1E,0x00,0xE2,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00,0xA0,0x00,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x5F0C, {0x01,0x80,0x01,0x40,0x01,0x40,0xFF,0xE0,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x80,0x7E,0x80,0x00,0xA0,0x00,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x5F0D, {0x01,0x80,0x7D,0x40,0x01,0x00,0xFF,0xE0,0x01,0x00,0x01,0x00,0x7D,0x00,0x00,0x80,0x00,0x80,0xFE,0xA0,0x00,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x5F0F, {0x01,0x80,0x01,0x40,0xFF,0xE0,0x01,0x00,0x01,0x00,0x7F,0x00,0x11,0x00,0x11,0x00,0x10,0x80,0x1E,0xA0,0xF0,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x5F10, {0x01,0x80,0x3D,0x40,0x01,0x40,0xFF,0xE0,0x01,0x00,0x01,0x00,0x3D,0x00,0x01,0x00,0x04,0x80,0x18,0xA0,0xE0,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x5F11, {0x08,0xC0,0x08,0xA0,0x77,0xE0,0x3F,0xE0,0xE8,0x80,0x27,0x80,0xF9,0x80,0x71,0x80,0x79,0x60,0x69,0x60,0xA6,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x5F13, {0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x20,0x80,0x40,0x00,0x7F,0xC0,0x40,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x5F14, {0x00,0x00,0x7F,0x80,0x08,0x80,0x7F,0x80,0x48,0x80,0x48,0x00,0x7F,0xC0,0x48,0x40,0x08,0x40,0x08,0xC0,0x08,0x00,0x08,0x00,0x00,0x00,}}, +{ 0x5F15, {0x00,0x40,0x7E,0x40,0x02,0x40,0x3E,0x40,0x22,0x40,0x20,0x40,0x3E,0x40,0x22,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x00,0x00,}}, +{ 0x5F16, {0x00,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x60,0x80,0x60,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x03,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5F17, {0x12,0x00,0x12,0x00,0x7F,0x80,0x12,0x80,0x7F,0x80,0x52,0x80,0x52,0x00,0x7F,0xC0,0x12,0x40,0x22,0x40,0x22,0xC0,0x42,0x00,0x00,0x00,}}, +{ 0x5F18, {0x00,0x80,0xF8,0x80,0x08,0x80,0x79,0x00,0x49,0x00,0x41,0x00,0x79,0x00,0x49,0x00,0x0A,0x40,0x12,0x40,0x17,0xA0,0x60,0x20,0x00,0x00,}}, +{ 0x5F1B, {0x00,0x80,0xF2,0x80,0x12,0x80,0x72,0xC0,0x53,0xC0,0x4E,0xC0,0x72,0xC0,0x52,0xC0,0x12,0xC0,0x12,0x20,0x12,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x5F1F, {0x10,0x80,0x09,0x00,0x3F,0xC0,0x02,0x40,0x3F,0xC0,0x22,0x00,0x3F,0xE0,0x22,0x20,0x06,0x20,0x1A,0xE0,0x62,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5F25, {0x02,0x00,0xF2,0x00,0x17,0xE0,0x74,0x80,0x58,0x80,0x42,0x80,0x72,0xC0,0x52,0xC0,0x14,0xA0,0x18,0xA0,0x10,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5F26, {0x01,0x00,0xF1,0x00,0x1F,0xE0,0x71,0x40,0x5E,0x40,0x42,0x80,0x71,0x80,0x51,0x00,0x11,0x00,0x12,0x40,0x3F,0xE0,0x60,0x20,0x00,0x00,}}, +{ 0x5F27, {0x00,0x40,0xF1,0x80,0x17,0x80,0x75,0x80,0x55,0x80,0x45,0x80,0x75,0x80,0x55,0x40,0x15,0x40,0x19,0xA0,0x2E,0xA0,0x40,0xA0,0x00,0x00,}}, +{ 0x5F29, {0x20,0x00,0x33,0xC0,0xFE,0x40,0x69,0x80,0x1B,0x80,0x24,0x60,0xFF,0x80,0x01,0x80,0x3F,0x00,0x3F,0x80,0x60,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x5F2D, {0x00,0x00,0xFF,0xE0,0x24,0x80,0xE7,0x80,0xA4,0x80,0x84,0x80,0x87,0x80,0xE4,0x80,0xA7,0x80,0x3F,0x80,0x30,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5F2F, {0x04,0x00,0xFF,0xE0,0x09,0x00,0x69,0x40,0x53,0x20,0xBF,0x20,0x01,0x80,0x3F,0x00,0x3F,0x80,0x7F,0x80,0x00,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x5F31, {0x00,0x00,0x7D,0xE0,0x04,0x20,0x3D,0xE0,0x21,0x00,0x3D,0xE0,0x25,0x20,0x14,0xA0,0x1C,0xE0,0x75,0xA0,0x04,0x20,0x18,0x40,0x00,0x00,}}, +{ 0x5F35, {0x00,0x00,0xE7,0xC0,0x24,0x00,0xE7,0x80,0xA7,0x80,0x84,0x00,0xFF,0xE0,0xA5,0x40,0xA5,0x80,0x25,0x80,0x26,0x40,0xD8,0x20,0x00,0x00,}}, +{ 0x5F37, {0x01,0x00,0xE2,0x40,0x2F,0xE0,0x21,0x20,0xEF,0xC0,0x89,0x40,0xE9,0x40,0xAF,0xC0,0x29,0x40,0x21,0xE0,0x2F,0x20,0xC0,0x20,0x00,0x00,}}, +{ 0x5F38, {0x00,0x00,0x77,0xE0,0x15,0xE0,0x75,0xE0,0x57,0xE0,0x45,0xE0,0x75,0xE0,0x55,0xE0,0x17,0xE0,0x1D,0xA0,0x19,0xA0,0x73,0x60,0x00,0x00,}}, +{ 0x5F3C, {0x00,0x00,0x71,0xE0,0x1F,0x20,0x32,0x60,0x27,0x80,0x25,0x80,0x35,0xE0,0x37,0x20,0x15,0x20,0x17,0x20,0x15,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x5F3E, {0x02,0x40,0xE9,0x40,0x25,0x80,0xEF,0xC0,0xAF,0xC0,0x89,0x40,0xEF,0xC0,0xA1,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0xC1,0x00,0x00,0x00,}}, +{ 0x5F41, {0x00,0x00,0xFF,0xE0,0x26,0x40,0xEF,0x40,0xAF,0x40,0x80,0xC0,0xFF,0xE0,0xA0,0x40,0x2F,0x40,0x2F,0x40,0x2B,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x5F48, {0x00,0x00,0xEF,0xC0,0x2F,0xC0,0xE4,0xC0,0xAF,0xC0,0x89,0x40,0xEF,0xC0,0xAB,0x40,0x2F,0xC0,0x3F,0xE0,0x33,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x5F4A, {0x00,0x00,0xEF,0xC0,0x20,0x00,0xE7,0x80,0xA7,0x80,0x8F,0xC0,0xE0,0x00,0xA7,0x80,0xA7,0x80,0x27,0x80,0x3F,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x5F4C, {0x00,0x00,0xFF,0xE0,0x3D,0x60,0xFF,0xE0,0xAB,0xC0,0x8F,0xC0,0xEB,0xC0,0xAF,0xC0,0x2F,0xC0,0x2F,0xC0,0x2F,0xC0,0x69,0xC0,0x00,0x00,}}, +{ 0x5F4E, {0x6E,0x80,0xFF,0xC0,0x7E,0xE0,0xFF,0xE0,0xFB,0xC0,0xFF,0xA0,0x3F,0x80,0x01,0x80,0x3F,0x00,0x3F,0x80,0x60,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x5F51, {0x08,0x00,0x08,0x00,0x0F,0x00,0x1F,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x3F,0x00,0x01,0x00,0x01,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x5F53, {0x02,0x00,0x02,0x00,0x12,0x40,0x0A,0x80,0x0B,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x1F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,}}, +{ 0x5F56, {0x08,0x00,0x0F,0x00,0x1E,0x00,0x1E,0x00,0xFF,0xE0,0x04,0x00,0x1D,0x40,0xF7,0x80,0x7F,0x80,0x7E,0x80,0x72,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x5F57, {0x21,0x80,0x31,0x80,0xFB,0xE0,0x7B,0xC0,0x31,0x80,0x3B,0xE0,0xE1,0x80,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x5F59, {0x08,0x00,0x1F,0x00,0xFF,0xE0,0xFF,0xE0,0x7F,0xE0,0x7F,0xC0,0xA5,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x37,0x80,0x64,0xC0,0x00,0x00,}}, +{ 0x5F5C, {0x04,0x00,0x0F,0x00,0xFF,0xE0,0xFF,0xE0,0x72,0x40,0xFF,0xE0,0x71,0x40,0xEB,0x40,0x92,0x40,0xFF,0xE0,0x13,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F5D, {0x04,0x00,0x0F,0x00,0xFF,0xE0,0xFF,0xE0,0x73,0xC0,0xF9,0xC0,0x77,0xE0,0xEB,0xC0,0x95,0x20,0xFF,0xE0,0x13,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x5F61, {0x04,0x00,0x04,0x00,0x08,0x00,0x19,0x00,0x32,0x00,0x22,0x80,0x04,0x80,0x09,0x80,0x11,0x00,0x02,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x5F62, {0x00,0x80,0x7C,0x80,0x29,0x00,0x29,0x40,0x28,0x40,0xFE,0x80,0x28,0x80,0x28,0x20,0x28,0x20,0x48,0x40,0x48,0x40,0x88,0x80,0x00,0x00,}}, +{ 0x5F66, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x09,0x00,0x7F,0xE0,0x41,0x80,0x46,0x00,0x58,0x80,0x43,0x00,0x4C,0x60,0x41,0x80,0x9E,0x00,0x00,0x00,}}, +{ 0x5F69, {0x18,0x80,0xE4,0x80,0xA5,0x00,0x59,0x40,0x32,0x40,0x20,0x80,0xFD,0x20,0x31,0x20,0x68,0x40,0xA0,0x40,0x20,0x80,0x21,0x00,0x00,0x00,}}, +{ 0x5F6A, {0x10,0x80,0x1C,0x80,0x7D,0x80,0x7F,0x40,0x78,0xC0,0x62,0xA0,0x5C,0x20,0x68,0x40,0x68,0x40,0x68,0x80,0x68,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x5F6B, {0x00,0x80,0x7E,0x80,0x53,0x00,0x7B,0x40,0x52,0x40,0x7E,0x80,0x42,0x80,0x7A,0x20,0x6A,0x20,0x7A,0x40,0x6A,0x40,0x86,0x80,0x00,0x00,}}, +{ 0x5F6C, {0x24,0x80,0x24,0x80,0xFE,0x80,0x25,0x40,0x6C,0x40,0x7E,0x80,0x7C,0x80,0xAD,0x20,0xB4,0x20,0x24,0x40,0x24,0x40,0x24,0x80,0x00,0x00,}}, +{ 0x5F6D, {0x20,0x80,0x30,0x80,0xFD,0x80,0x79,0x40,0x02,0xC0,0x78,0xA0,0x49,0x20,0x79,0x40,0x48,0x40,0x78,0x80,0x79,0x00,0xE2,0x00,0x00,0x00,}}, +{ 0x5F70, {0x10,0x80,0x7C,0x80,0x29,0x00,0xFE,0x40,0x3C,0x80,0x24,0x80,0x3D,0x20,0x25,0x20,0x3C,0x40,0xFE,0x40,0x10,0x80,0x11,0x00,0x00,0x00,}}, +{ 0x5F71, {0x7C,0x80,0x44,0x80,0x7D,0x00,0x45,0x40,0x7E,0x40,0x10,0x80,0xFE,0x80,0x7D,0x20,0x44,0x20,0x7C,0x40,0xD2,0x80,0x31,0x00,0x00,0x00,}}, +{ 0x5F73, {0x02,0x00,0x02,0x00,0x04,0x00,0x0C,0x80,0x19,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x0A,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x5F77, {0x21,0x00,0x21,0x00,0x6F,0xE0,0x5F,0xE0,0x31,0x00,0x21,0xC0,0x61,0x40,0xE3,0x40,0xA2,0x40,0x24,0x40,0x28,0x40,0x30,0x80,0x00,0x00,}}, +{ 0x5F79, {0x40,0x00,0x47,0x80,0x84,0x80,0x24,0xA0,0x28,0xE0,0x50,0x00,0x5F,0x80,0xC4,0x80,0x45,0x00,0x42,0x00,0x4D,0x80,0x50,0x60,0x00,0x00,}}, +{ 0x5F7C, {0x21,0x00,0x41,0x00,0x8F,0xE0,0x29,0x40,0x29,0x00,0x4F,0xC0,0x4A,0x40,0xCA,0x80,0x49,0x00,0x51,0x00,0x56,0x80,0x68,0x60,0x00,0x00,}}, +{ 0x5F7F, {0x23,0x80,0x23,0x80,0x6F,0xC0,0x53,0xC0,0xBF,0xC0,0x2B,0xC0,0x6B,0x80,0xEF,0xE0,0xAB,0xA0,0x23,0xE0,0x25,0x80,0x29,0x80,0x00,0x00,}}, +{ 0x5F80, {0x22,0x00,0x21,0x00,0x4F,0xE0,0x91,0x00,0x21,0x00,0x21,0x00,0x6F,0xC0,0xA1,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5F81, {0x20,0x00,0x2F,0xE0,0x41,0x00,0x95,0x00,0x25,0x00,0x25,0xC0,0x65,0x00,0xA5,0x00,0x25,0x00,0x25,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5F82, {0x20,0x00,0x27,0x80,0x64,0x80,0x54,0x80,0xB7,0x80,0x24,0x80,0x64,0x80,0xE7,0x80,0xA4,0x80,0x24,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5F83, {0x61,0x00,0x49,0x00,0x49,0x00,0xAF,0xE0,0x33,0x00,0x71,0x00,0x61,0x00,0xEF,0xC0,0x61,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5F84, {0x20,0x00,0x2F,0xC0,0x44,0x80,0x13,0x00,0x24,0x80,0x39,0x60,0x61,0x00,0xAF,0xC0,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5F85, {0x21,0x00,0x21,0x00,0x4F,0xC0,0x11,0x00,0x3F,0xE0,0x20,0x80,0x60,0x80,0xBF,0xE0,0x24,0x80,0x22,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x5F87, {0x12,0x00,0x12,0x00,0x33,0xE0,0x2F,0xE0,0x5F,0xA0,0x1A,0xE0,0x33,0xE0,0x72,0xE0,0x53,0xE0,0x10,0x20,0x10,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x5F88, {0x20,0x00,0x27,0x80,0x64,0x80,0x57,0x80,0xB4,0x80,0x24,0x80,0x67,0xA0,0xE5,0x20,0xA5,0xC0,0x25,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x5F8A, {0x30,0x00,0x27,0xE0,0x44,0x20,0x15,0xA0,0x15,0xE0,0x35,0xE0,0x35,0xE0,0x75,0xE0,0x35,0x20,0x34,0x20,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x5F8B, {0x21,0x00,0x41,0x00,0x4F,0xC0,0xBF,0xE0,0x21,0x40,0x4F,0xC0,0x41,0x00,0xCF,0xC0,0x41,0x00,0x5F,0xE0,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x5F8C, {0x21,0x00,0x43,0x80,0x8E,0x80,0x23,0x80,0x22,0x40,0x7F,0xA0,0x62,0x20,0xA7,0xC0,0x3C,0x80,0x23,0x00,0x27,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x5F90, {0x21,0x00,0x43,0x00,0x84,0x80,0x28,0x40,0x37,0xE0,0x41,0x00,0x5F,0xE0,0xC1,0x00,0x45,0x40,0x49,0x20,0x51,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x5F91, {0x60,0x00,0x5F,0xE0,0x89,0x40,0x3A,0x40,0x2B,0x40,0x69,0x40,0x60,0x00,0xEF,0xC0,0x61,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5F92, {0x41,0x00,0x41,0x00,0x8F,0xC0,0x21,0x00,0x3F,0xE0,0x41,0x00,0x49,0x00,0xC9,0xC0,0x49,0x00,0x55,0x00,0x53,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x5F93, {0x28,0x80,0x44,0x80,0x9F,0xE0,0x21,0x00,0x21,0x00,0x49,0x00,0x49,0xC0,0xC9,0x00,0x49,0x00,0x5D,0x00,0x53,0x00,0x60,0xE0,0x00,0x00,}}, +{ 0x5F97, {0x20,0x00,0x47,0x80,0x84,0x80,0x27,0x80,0x27,0x80,0x40,0x00,0x5F,0xE0,0xC0,0x80,0x5F,0xE0,0x44,0x80,0x42,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x5F98, {0x63,0x80,0x43,0x80,0x9F,0xE0,0x3F,0xE0,0x23,0x80,0x7F,0xC0,0x63,0x80,0xE3,0x80,0x7F,0xE0,0x65,0x80,0x69,0x80,0x71,0x80,0x00,0x00,}}, +{ 0x5F99, {0x61,0x00,0x41,0x00,0x89,0xC0,0x29,0xC0,0x29,0x00,0x7F,0xE0,0x61,0x00,0xE9,0x00,0x69,0xC0,0x6D,0x00,0x73,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x5F9E, {0x64,0x80,0x44,0x80,0x84,0xC0,0x2B,0xA0,0x33,0x20,0x61,0x00,0x69,0x00,0xE9,0x00,0x69,0xC0,0x7D,0x00,0x73,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x5FA0, {0x61,0x00,0x43,0x00,0x9F,0xE0,0x25,0x80,0x2D,0xC0,0x6B,0xA0,0x71,0x20,0xE3,0x80,0x67,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x5FA1, {0x14,0x00,0x24,0xE0,0x4F,0xA0,0x1A,0xA0,0x1F,0xA0,0x32,0xA0,0x3A,0xA0,0x5B,0xA0,0x1A,0xA0,0x1B,0xE0,0x1C,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x5FA8, {0x21,0x00,0x22,0x00,0x67,0xC0,0x57,0xC0,0xB4,0x40,0x27,0xC0,0x60,0x00,0xFF,0xE0,0xA7,0xC0,0x27,0xC0,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x5FA9, {0x24,0x00,0x44,0x00,0x8F,0xE0,0x37,0x80,0x27,0x80,0x44,0x80,0x47,0x80,0xC2,0x00,0x47,0x80,0x4B,0x00,0x46,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x5FAA, {0x20,0x40,0x41,0x80,0x8F,0x00,0x2F,0xE0,0x29,0x00,0x6B,0xC0,0x6A,0x40,0xAB,0xC0,0x2A,0x40,0x2B,0xC0,0x33,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x5FAD, {0x62,0x00,0x43,0x80,0x9F,0x80,0x3D,0x00,0x26,0x00,0x7F,0xC0,0x65,0x00,0xEB,0x00,0x7F,0xE0,0x69,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x5FAE, {0x49,0x00,0x6B,0x00,0xAB,0x00,0x3F,0xE0,0x61,0x40,0x43,0x40,0xFF,0x40,0x59,0x80,0x58,0x80,0x6C,0x80,0x6B,0x40,0x40,0x20,0x00,0x00,}}, +{ 0x5FB3, {0x21,0x00,0x41,0x00,0x9F,0xE0,0x2F,0xC0,0x2A,0xC0,0x4A,0xC0,0x4F,0xC0,0xC8,0x40,0x45,0x40,0x55,0x20,0x54,0xA0,0x43,0x80,0x00,0x00,}}, +{ 0x5FB4, {0x48,0x80,0x6A,0x80,0xAA,0x80,0x3E,0xE0,0x43,0x40,0x7F,0x40,0xC9,0xC0,0x5D,0x80,0x48,0x80,0x4E,0x80,0x71,0x40,0x42,0x20,0x00,0x00,}}, +{ 0x5FB9, {0x24,0x80,0x24,0x80,0x5E,0x80,0xAF,0xE0,0x3F,0x40,0x61,0x40,0x5F,0x40,0xD3,0x80,0x5E,0x80,0x5E,0x80,0x53,0x40,0x56,0x20,0x00,0x00,}}, +{ 0x5FBC, {0x65,0x80,0x49,0x80,0x9F,0x80,0x3F,0xE0,0x33,0x40,0x7F,0x40,0x69,0xC0,0xFE,0x80,0x6C,0x80,0x6E,0xC0,0x73,0x40,0x66,0x20,0x00,0x00,}}, +{ 0x5FBD, {0x48,0x80,0x6A,0x80,0xBE,0x80,0x27,0xE0,0x7D,0x40,0x77,0x40,0xC9,0x40,0x55,0xC0,0x7E,0x80,0x6C,0x80,0x6B,0x40,0x4A,0x20,0x00,0x00,}}, +{ 0x5FC3, {0x04,0x00,0x02,0x00,0x01,0x00,0x08,0x00,0x08,0x00,0x08,0x80,0x48,0x40,0x48,0x20,0x88,0x20,0x08,0x00,0x08,0x80,0x07,0x80,0x00,0x00,}}, +{ 0x5FC5, {0x08,0x00,0x04,0x80,0x02,0x80,0x10,0x80,0x10,0x80,0x51,0x00,0x51,0x40,0x92,0x20,0x94,0x20,0x18,0x00,0x30,0x80,0xCF,0x80,0x00,0x00,}}, +{ 0x5FCC, {0x00,0x00,0x7F,0x00,0x01,0x00,0x7F,0x00,0x41,0x00,0x40,0x40,0x3F,0xC0,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x5FCD, {0x00,0x00,0x7F,0x80,0x14,0x80,0x0C,0x80,0x0A,0x80,0x30,0x80,0x41,0x00,0x04,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x5FD6, {0x60,0x80,0x60,0x80,0x60,0x80,0x7F,0xE0,0x70,0xC0,0x64,0x80,0xE2,0x80,0x62,0x80,0x60,0x80,0x60,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5FD7, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x12,0x80,0x52,0x60,0x50,0x20,0x90,0x80,0x0F,0x80,0x00,0x00,}}, +{ 0x5FD8, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x20,0x00,0x20,0x00,0x1F,0x80,0x04,0x00,0x12,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x5FD9, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x34,0x00,0x74,0x00,0x74,0x00,0xA4,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x23,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x5FDC, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x42,0x00,0x41,0x00,0x44,0x80,0x54,0xA0,0x54,0x20,0x54,0x20,0x64,0x00,0x84,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x5FDD, {0x01,0x80,0x07,0x00,0x3C,0x00,0xFF,0xE0,0x0A,0x00,0x11,0x00,0x68,0x80,0xC8,0x60,0x2C,0x80,0x2A,0x40,0x49,0x40,0x18,0x00,0x00,0x00,}}, +{ 0x5FE0, {0x04,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x04,0x80,0x04,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x5FE4, {0x64,0x00,0x64,0x00,0x67,0xC0,0x7F,0xC0,0x71,0x00,0x61,0x00,0xFF,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x5FEB, {0x21,0x00,0x21,0x00,0x27,0xC0,0x61,0x40,0x71,0x40,0x71,0x40,0xAF,0xE0,0x23,0x80,0x22,0x80,0x24,0x80,0x28,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x5FF0, {0x62,0x00,0x62,0x00,0x6F,0x80,0x73,0xA0,0x75,0xA0,0x64,0xE0,0xE9,0x00,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x5FF1, {0x61,0x00,0x61,0x00,0x67,0xE0,0x6F,0xE0,0x79,0x40,0x71,0x00,0xE1,0x80,0x63,0x80,0x67,0x80,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x5FF5, {0x04,0x00,0x04,0x00,0x0A,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x00,0x01,0x00,0x06,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x5FF8, {0x60,0x00,0x6F,0x80,0x64,0x80,0x74,0x80,0x74,0x80,0x7F,0xE0,0xE4,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x5FFB, {0x60,0x40,0x61,0x80,0x66,0x00,0x74,0x00,0x77,0xE0,0x64,0x80,0xE4,0x80,0x64,0x80,0x64,0x80,0x68,0x80,0x70,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x5FFD, {0x20,0x00,0x20,0x00,0x7F,0xC0,0x49,0x40,0x92,0x40,0x24,0x40,0x00,0x80,0x04,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x5FFF, {0x07,0x00,0x11,0x00,0x20,0x80,0xFF,0xE0,0x09,0x80,0x11,0x80,0x23,0x00,0x04,0x00,0x12,0x40,0x50,0x20,0x90,0x20,0x0F,0x80,0x00,0x00,}}, +{ 0x600E, {0x20,0x00,0x30,0x00,0x3F,0xE0,0x67,0x80,0x44,0x00,0x87,0x80,0x04,0x00,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x600F, {0x61,0x00,0x61,0x00,0x67,0xC0,0x7F,0xC0,0x79,0x40,0x69,0x40,0xFF,0xE0,0x63,0x00,0x63,0x00,0x65,0x80,0x68,0x80,0x70,0x60,0x00,0x00,}}, +{ 0x6010, {0x32,0x00,0x32,0x00,0x33,0xE0,0x3F,0xE0,0x38,0x20,0x77,0xA0,0x34,0xA0,0x34,0xA0,0x37,0xA0,0x37,0xA0,0x30,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x6012, {0x20,0x00,0x20,0x00,0xFF,0xC0,0x2A,0x40,0x71,0x80,0x12,0x80,0x2C,0x60,0xC4,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6015, {0x30,0x80,0x31,0x80,0x33,0xE0,0x3B,0xE0,0x3A,0x20,0x32,0x20,0x73,0xE0,0x32,0x20,0x32,0x20,0x32,0x20,0x33,0xE0,0x32,0x20,0x00,0x00,}}, +{ 0x6016, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x32,0x80,0x72,0x80,0x77,0xE0,0xAC,0xA0,0x34,0xA0,0x24,0xA0,0x24,0xE0,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6019, {0x61,0x00,0x61,0x00,0x67,0xE0,0x7F,0xE0,0x71,0x00,0xE1,0x00,0x6F,0xC0,0x68,0x40,0x68,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x601B, {0x60,0x00,0x67,0x80,0x64,0x80,0x74,0x80,0x77,0x80,0x64,0x80,0xE4,0x80,0x64,0x80,0x67,0x80,0x60,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x601C, {0x21,0x00,0x21,0x00,0x22,0x80,0x34,0x80,0x7F,0xC0,0x70,0x20,0xAF,0xC0,0x21,0x40,0x21,0x40,0x21,0xC0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x601D, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6020, {0x08,0x00,0x09,0x00,0x31,0xC0,0xFF,0x20,0x3F,0x00,0x21,0x00,0x21,0x00,0x3F,0x00,0x04,0x00,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6021, {0x61,0x00,0x61,0x00,0x72,0x00,0x72,0x40,0x64,0xE0,0xFF,0xA0,0x60,0x00,0x6F,0xC0,0x68,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x6025, {0x08,0x00,0x1F,0x00,0x22,0x00,0x7F,0x80,0x3F,0x80,0x00,0x80,0x3F,0x80,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6026, {0x60,0x00,0x6F,0xC0,0x61,0x00,0x75,0x40,0x79,0x40,0x61,0x00,0xFF,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6027, {0x21,0x00,0x25,0x00,0x25,0x00,0x2F,0xC0,0x71,0x00,0x71,0x00,0xAF,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6028, {0x20,0x00,0x38,0x00,0x2F,0xC0,0x6E,0x40,0x9A,0xC0,0x12,0x20,0x61,0xE0,0x84,0x00,0x52,0x40,0x50,0x20,0x91,0x20,0x0F,0x80,0x00,0x00,}}, +{ 0x6029, {0x60,0x00,0x6F,0xC0,0x78,0x40,0x7F,0xC0,0x68,0x40,0xEA,0x00,0x6A,0x40,0x6A,0x80,0x6B,0x00,0x72,0x20,0x72,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x602A, {0x20,0x00,0x2F,0xC0,0x24,0x80,0x63,0x00,0x7D,0x80,0x71,0x60,0xA1,0x00,0x2F,0xC0,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x602B, {0x63,0x80,0x63,0x80,0x6F,0xC0,0x73,0xC0,0x7F,0xC0,0x6B,0x80,0xEB,0x80,0x6F,0xE0,0x6B,0xA0,0x63,0xE0,0x65,0x80,0x69,0x80,0x00,0x00,}}, +{ 0x602F, {0x21,0x00,0x21,0x00,0x27,0xC0,0x21,0x00,0x71,0x00,0x71,0x00,0xBF,0xE0,0x21,0x00,0x22,0x40,0x24,0xC0,0x2F,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x6031, {0x20,0x00,0x30,0x00,0x7F,0xC0,0x79,0x40,0x96,0x40,0x23,0x40,0x04,0x80,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x603A, {0x61,0x00,0x61,0x80,0x67,0x00,0x77,0x40,0x71,0x40,0x6F,0x80,0xE3,0x80,0x65,0x80,0x65,0x40,0x79,0x20,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x6041, {0x20,0xC0,0x2F,0x00,0x61,0x00,0x7F,0xE0,0xE3,0x00,0x61,0x00,0x6F,0xC0,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6042, {0x32,0x00,0x32,0x00,0x33,0xE0,0x3F,0xE0,0x3F,0xA0,0x34,0xA0,0x77,0xA0,0x35,0xA0,0x37,0xA0,0x30,0x20,0x30,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x6043, {0x61,0x00,0x63,0x00,0x6F,0xC0,0x71,0x00,0x7F,0xE0,0x60,0x80,0xE0,0x80,0x7F,0xE0,0x64,0x80,0x62,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x6046, {0x60,0x00,0x7F,0xE0,0x64,0x00,0x77,0x80,0x76,0x80,0x65,0x80,0xE5,0x80,0x6C,0x80,0x6B,0x80,0x61,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x604A, {0x61,0x00,0x63,0x00,0x6F,0xC0,0x72,0x40,0x74,0x40,0x68,0x80,0xE8,0x80,0x7F,0xE0,0x6A,0xA0,0x7A,0xA0,0x73,0xA0,0x67,0x60,0x00,0x00,}}, +{ 0x604B, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x09,0x00,0x69,0x40,0x49,0x20,0x93,0x20,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x604D, {0x61,0x00,0x61,0x00,0x69,0x40,0x75,0x40,0x71,0x00,0x7F,0xE0,0xE3,0x80,0x63,0x80,0x67,0x80,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x6050, {0x00,0x00,0xFF,0x80,0x24,0x80,0x26,0x80,0x3D,0xA0,0xE8,0xA0,0x10,0x60,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6052, {0x20,0x00,0x2F,0xC0,0x20,0x00,0x67,0x80,0x74,0x80,0x77,0x80,0xA4,0x80,0x24,0x80,0x27,0x80,0x20,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6055, {0x20,0x00,0x20,0x00,0xFB,0xC0,0x2A,0x40,0x72,0x40,0x1B,0xC0,0x62,0x40,0xC4,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6059, {0x21,0x00,0x13,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x605A, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x605F, {0x34,0x00,0x34,0x00,0x37,0xE0,0x3F,0xE0,0x3C,0xA0,0x33,0xA0,0x79,0xE0,0x3A,0xE0,0x3F,0xE0,0x3F,0xE0,0x30,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x6060, {0x62,0x00,0x62,0x00,0x67,0xE0,0x7F,0xE0,0x74,0x00,0x69,0x80,0xF9,0x80,0x6B,0xC0,0x69,0x80,0x69,0x80,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x6062, {0x20,0x00,0x2F,0xE0,0x28,0x00,0x29,0x00,0x7B,0x40,0x7B,0x40,0xAB,0x00,0x2D,0x00,0x29,0x00,0x2A,0x80,0x3C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x6063, {0x04,0x00,0x04,0x00,0xE7,0xE0,0x19,0x40,0x33,0x80,0xC4,0x80,0x18,0x60,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6064, {0x61,0x00,0x61,0x00,0x62,0x00,0x7F,0xC0,0x7B,0xC0,0x6B,0xC0,0xEB,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6065, {0x01,0x00,0xF8,0x80,0x50,0x00,0x71,0x00,0x51,0x00,0x55,0x40,0x75,0x20,0x55,0x20,0x79,0x20,0xD1,0x40,0x11,0x40,0x11,0xC0,0x00,0x00,}}, +{ 0x6068, {0x20,0x00,0x27,0x80,0x24,0x80,0x37,0x80,0x74,0x80,0x64,0x80,0xA7,0xA0,0x25,0x20,0x25,0xC0,0x25,0x80,0x26,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x6069, {0x00,0x00,0x7F,0x80,0x44,0x80,0x7F,0x80,0x4A,0x80,0x71,0x80,0x7F,0x80,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x606A, {0x62,0x00,0x62,0x00,0x67,0x80,0x76,0x80,0x7B,0x80,0x61,0x80,0xE2,0x80,0x67,0xC0,0x7C,0xA0,0x64,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x606B, {0x30,0x00,0x37,0xE0,0x34,0x20,0x3F,0xE0,0x3C,0x20,0x35,0xA0,0x75,0xE0,0x35,0xE0,0x35,0xE0,0x34,0x20,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x606C, {0x60,0x40,0x61,0x80,0x6F,0x00,0x71,0x00,0x7F,0xE0,0x61,0x00,0xE1,0x00,0x6F,0xC0,0x68,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x606D, {0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x11,0x00,0x28,0x80,0x48,0x40,0x88,0x20,0x2A,0x80,0x49,0x40,0x18,0x00,0x00,0x00,}}, +{ 0x606F, {0x04,0x00,0x08,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6070, {0x23,0x00,0x23,0x00,0x23,0x00,0x74,0x80,0x7F,0xC0,0x70,0x20,0xA0,0x00,0x27,0x80,0x24,0x80,0x24,0x80,0x27,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x6075, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6077, {0x21,0x00,0x33,0x00,0x7F,0xE0,0x63,0x80,0xE7,0x80,0x69,0x40,0x71,0x20,0x07,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6081, {0x30,0x00,0x37,0xE0,0x34,0x20,0x3F,0xE0,0x38,0x00,0x37,0xE0,0x74,0x20,0x37,0xE0,0x37,0xE0,0x37,0xE0,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x6083, {0x30,0x00,0x37,0xE0,0x34,0xA0,0x3C,0xA0,0x3F,0xE0,0x34,0xA0,0x75,0xE0,0x35,0xE0,0x36,0xA0,0x34,0xA0,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x6084, {0x61,0x00,0x65,0xC0,0x65,0x60,0x79,0x20,0x7F,0xC0,0x68,0x40,0xEF,0xC0,0x68,0x40,0x6F,0xC0,0x68,0x40,0x68,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x6089, {0x01,0x80,0x7E,0x80,0x24,0x80,0xFF,0xE0,0x0E,0x00,0x35,0x00,0xC4,0xE0,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x608B, {0x61,0x00,0x63,0x00,0x7F,0xE0,0x76,0x80,0x73,0x00,0x67,0x80,0xF8,0x60,0x67,0x80,0x64,0x80,0x64,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x608C, {0x24,0x80,0x22,0x80,0x27,0xC0,0x31,0x40,0x7F,0xC0,0x69,0x00,0xAF,0xE0,0x2B,0x20,0x25,0x20,0x29,0x60,0x31,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x608D, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0x60,0x00,0xEF,0xC0,0x61,0x00,0x6F,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6092, {0x60,0x00,0x67,0x80,0x67,0x80,0x77,0x80,0x7F,0xC0,0x69,0x40,0xE9,0x40,0x6F,0xC0,0x68,0x40,0x68,0x20,0x68,0x20,0x67,0xE0,0x00,0x00,}}, +{ 0x6094, {0x24,0x00,0x24,0x00,0x2F,0xE0,0x2C,0x00,0x77,0xC0,0x65,0x40,0xBF,0xE0,0x29,0x40,0x2A,0x40,0x3F,0xE0,0x20,0x80,0x21,0x00,0x00,0x00,}}, +{ 0x6096, {0x61,0x00,0x63,0x00,0x7F,0xE0,0x7F,0xE0,0x68,0x40,0x77,0x80,0xE1,0x00,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x6097, {0x62,0x00,0x63,0x80,0x65,0x00,0x7F,0xC0,0x7B,0x40,0x69,0x40,0xEF,0xC0,0x6B,0x40,0x63,0x80,0x67,0xA0,0x69,0x20,0x71,0xE0,0x00,0x00,}}, +{ 0x609A, {0x61,0x00,0x63,0x00,0x7F,0xE0,0x6F,0xC0,0x7B,0x40,0x79,0x40,0xEF,0xC0,0x6B,0x40,0x67,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x609B, {0x61,0x00,0x63,0xC0,0x67,0xE0,0x7F,0xE0,0x73,0x80,0x65,0xA0,0xEA,0xE0,0x63,0x80,0x64,0x80,0x63,0x00,0x67,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x609F, {0x20,0x00,0x2F,0xE0,0x21,0x00,0x37,0x80,0x72,0x80,0x62,0x80,0xBF,0xE0,0x20,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x60A0, {0x22,0x00,0x32,0x00,0x37,0xE0,0x5E,0x80,0xD3,0x00,0x55,0x80,0x58,0x60,0x04,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60A3, {0x04,0x00,0x3F,0x80,0x3F,0x80,0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60A6, {0x24,0x80,0x22,0x80,0x2F,0xC0,0x78,0x40,0x78,0x40,0x6F,0xC0,0xAB,0x40,0x23,0x00,0x25,0x00,0x29,0x20,0x31,0x20,0x20,0xE0,0x00,0x00,}}, +{ 0x60A7, {0x30,0xA0,0x31,0xE0,0x3E,0xE0,0x3A,0xE0,0x3F,0xE0,0x32,0xE0,0x77,0xE0,0x36,0xE0,0x3A,0xE0,0x32,0x20,0x32,0x20,0x32,0x60,0x00,0x00,}}, +{ 0x60A9, {0x11,0x20,0x14,0xA0,0x12,0xC0,0x18,0x80,0x38,0x00,0x36,0xA0,0x55,0xA0,0x14,0xA0,0x15,0x60,0x16,0x20,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x60AA, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x3F,0x80,0x2A,0x80,0x3F,0x80,0x0A,0x00,0xFF,0xE0,0x14,0x40,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60B2, {0x0A,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0xC0,0x0A,0x00,0xFB,0xE0,0x12,0x00,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60B3, {0x04,0x00,0xFF,0xE0,0x0F,0x80,0x5F,0x80,0x5F,0x80,0x5F,0x80,0x50,0x80,0x5F,0xC0,0x7F,0xE0,0x16,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x60B4, {0x61,0x00,0x63,0x00,0x7F,0xE0,0x74,0x80,0x76,0xC0,0x69,0xA0,0xF1,0x20,0x63,0x00,0x7F,0xE0,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x60B5, {0x60,0x00,0x67,0xC0,0x67,0x80,0x77,0x80,0x77,0x80,0x64,0x00,0xFF,0xE0,0x65,0x40,0x65,0xC0,0x65,0x80,0x66,0x40,0x78,0x20,0x00,0x00,}}, +{ 0x60B6, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x42,0x40,0x4A,0x40,0x69,0xC0,0x69,0xC0,0x47,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x60B8, {0x60,0xC0,0x6F,0x00,0x7F,0xE0,0x7F,0xE0,0x67,0x80,0x79,0x60,0xE7,0x80,0x61,0x00,0x6F,0xE0,0x6F,0xE0,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x60BC, {0x22,0x00,0x22,0x00,0x23,0xE0,0x3F,0xC0,0x78,0x40,0x6F,0xC0,0xA8,0x40,0x2F,0xC0,0x21,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x60BD, {0x61,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7F,0xE0,0x61,0x40,0xEF,0xC0,0x62,0x00,0x7F,0xE0,0x6F,0x80,0x63,0x80,0x7C,0x40,0x00,0x00,}}, +{ 0x60C5, {0x21,0x00,0x2F,0xC0,0x21,0x00,0x37,0x80,0x7F,0xE0,0x60,0x00,0xA7,0x80,0x24,0x80,0x27,0x80,0x27,0x80,0x24,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x60C6, {0x30,0x00,0x37,0xE0,0x34,0xA0,0x3D,0xA0,0x3D,0xA0,0x35,0xA0,0x74,0xA0,0x35,0xE0,0x35,0xE0,0x3D,0xE0,0x39,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x60C7, {0x21,0x00,0x3F,0xE0,0x27,0x80,0x34,0x80,0x77,0x80,0x60,0x00,0xAF,0x80,0x21,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x60D1, {0x02,0x80,0x02,0x40,0xFF,0xE0,0x7A,0x80,0x4B,0x80,0x79,0xA0,0x1E,0xE0,0xE4,0x20,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60D3, {0x61,0x00,0x65,0xC0,0x67,0xC0,0x7F,0xC0,0x7F,0xE0,0x64,0x80,0xEF,0xC0,0x74,0xA0,0x65,0x80,0x65,0x40,0x64,0x40,0x63,0xC0,0x00,0x00,}}, +{ 0x60D8, {0x30,0x00,0x37,0xE0,0x36,0xE0,0x3D,0xA0,0x3F,0xE0,0x34,0xA0,0x77,0xE0,0x35,0x20,0x35,0xA0,0x35,0xA0,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x60DA, {0x24,0x00,0x24,0x00,0x27,0xC0,0x3A,0xC0,0x75,0xC0,0x69,0x40,0xA2,0x80,0x22,0x00,0x25,0x40,0x34,0x60,0x34,0xA0,0x23,0x80,0x00,0x00,}}, +{ 0x60DC, {0x22,0x80,0x22,0x80,0x2F,0xE0,0x32,0x80,0x72,0x80,0x7F,0xE0,0xA0,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x60DF, {0x22,0x40,0x22,0x40,0x24,0x80,0x3F,0xE0,0x74,0x80,0x6F,0xC0,0xA4,0x80,0x24,0x80,0x27,0xC0,0x24,0x80,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x60E0, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x64,0x80,0x3F,0x80,0x04,0xC0,0x7F,0xC0,0x16,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x60E1, {0x00,0x00,0xFF,0xE0,0x3B,0x80,0x7B,0x80,0x7B,0x80,0x0A,0x00,0xFF,0xE0,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60E3, {0x24,0x00,0x64,0x00,0x7F,0xC0,0xBB,0xC0,0x35,0xC0,0xE9,0x40,0x22,0x80,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60E7, {0x60,0x00,0x67,0x80,0x67,0x80,0x77,0x80,0x77,0x80,0x64,0x80,0xE7,0x80,0x64,0xC0,0x7F,0xE0,0x64,0x80,0x68,0x40,0x70,0x40,0x00,0x00,}}, +{ 0x60E8, {0x21,0x00,0x22,0x80,0x27,0xC0,0x33,0x00,0x7F,0xE0,0x63,0x80,0xA4,0x80,0x3B,0x60,0x27,0x00,0x26,0x40,0x21,0x80,0x2E,0x00,0x00,0x00,}}, +{ 0x60F0, {0x21,0x00,0x2F,0xE0,0x27,0xC0,0x34,0x80,0x7B,0xE0,0x60,0x00,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x27,0xC0,0x24,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x60F1, {0x32,0xE0,0x32,0xE0,0x34,0xC0,0x3E,0xE0,0x3A,0xE0,0x31,0x00,0x77,0xE0,0x34,0xA0,0x35,0xA0,0x35,0xE0,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x60F3, {0x20,0x00,0x23,0xC0,0xFA,0x40,0x33,0xC0,0x7B,0xC0,0x6A,0x40,0xA3,0xC0,0x34,0x00,0x12,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60F4, {0x61,0x00,0x69,0x40,0x69,0x40,0x6F,0xC0,0x70,0x00,0x7F,0xE0,0xE2,0x00,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x60F6, {0x61,0x00,0x62,0x00,0x67,0x80,0x77,0x80,0x74,0x80,0x67,0x80,0xE0,0x00,0x6F,0xC0,0x67,0x80,0x67,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x60F7, {0x04,0x00,0x3F,0x80,0x1F,0x00,0xFF,0xE0,0x3F,0x80,0x31,0x80,0xDF,0x60,0x13,0x00,0x1E,0x00,0x56,0x20,0x90,0x20,0x0F,0x80,0x00,0x00,}}, +{ 0x60F9, {0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x10,0x00,0x3F,0x80,0xD0,0x80,0x1F,0x80,0x04,0x00,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x60FA, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0x65,0x00,0xE5,0x00,0x6F,0xC0,0x7F,0x80,0x67,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x60FB, {0x30,0x20,0x3F,0x20,0x39,0xE0,0x3F,0xE0,0x39,0xE0,0x3F,0xE0,0x79,0xE0,0x39,0xE0,0x3F,0xE0,0x37,0x20,0x39,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x6100, {0x61,0x80,0x62,0x80,0x7C,0x80,0x74,0xA0,0x7F,0xC0,0x65,0x80,0xE6,0x80,0x6D,0x80,0x6D,0xC0,0x75,0xC0,0x65,0x20,0x66,0x20,0x00,0x00,}}, +{ 0x6101, {0x08,0x80,0x70,0xA0,0x22,0xA0,0xFE,0xC0,0x79,0x80,0xAA,0x40,0x24,0x20,0x04,0x00,0x52,0x40,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6103, {0x61,0x00,0x63,0x00,0x6F,0xE0,0x7F,0xC0,0x70,0x00,0x67,0x80,0xE4,0x80,0x67,0x80,0x67,0x80,0x67,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6106, {0x68,0x00,0x45,0xC0,0x98,0x00,0x23,0xE0,0x24,0xC0,0x68,0x80,0xE8,0x80,0x00,0x80,0x04,0x00,0x52,0x20,0x90,0x20,0x0F,0x80,0x00,0x00,}}, +{ 0x6108, {0x04,0x00,0x0A,0x00,0x3F,0x80,0xF8,0xE0,0x2A,0x80,0x3A,0x80,0x3A,0x80,0x28,0x80,0x54,0xC0,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6109, {0x21,0x00,0x23,0x00,0x24,0x80,0x3F,0xC0,0x70,0x20,0x7E,0x40,0xAA,0xC0,0x2E,0xC0,0x2A,0xC0,0x2E,0xC0,0x2A,0x40,0x2A,0xC0,0x00,0x00,}}, +{ 0x610D, {0x01,0x00,0x79,0x00,0x7B,0xE0,0x7F,0x40,0x7D,0xC0,0x51,0x80,0x6F,0x40,0xC4,0x20,0x04,0x40,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x610E, {0x64,0x00,0x67,0xE0,0x7F,0x80,0x77,0x80,0x77,0x80,0x64,0x80,0xE7,0x80,0x62,0x00,0x6F,0xC0,0x6B,0x80,0x63,0x80,0x7C,0x60,0x00,0x00,}}, +{ 0x610F, {0x04,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x7F,0x80,0x56,0x40,0x90,0x20,0x0F,0x80,0x00,0x00,}}, +{ 0x6115, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0x7C,0xC0,0x77,0x80,0x60,0x00,0xFF,0xE0,0x62,0x00,0x67,0x80,0x60,0x80,0x60,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x611A, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x45,0x40,0x7F,0xC0,0x44,0xC0,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x611B, {0x01,0x80,0x7E,0x80,0x28,0x80,0x7F,0xE0,0x96,0x40,0xB1,0x80,0x4F,0x40,0x08,0x00,0x1F,0x00,0x66,0x00,0x1B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x611F, {0x02,0x80,0x02,0x40,0x7F,0xE0,0x7E,0x40,0x41,0x40,0x7D,0x80,0x65,0xA0,0xBE,0x60,0x04,0x20,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6121, {0x64,0x00,0x64,0x00,0x67,0xC0,0x7F,0xC0,0x77,0xC0,0x69,0xC0,0xE2,0x80,0x62,0x00,0x65,0x40,0x74,0x60,0x74,0xA0,0x63,0x80,0x00,0x00,}}, +{ 0x6127, {0x61,0x00,0x62,0x00,0x6F,0xC0,0x7F,0xC0,0x7B,0x40,0x6F,0xC0,0xEB,0x40,0x63,0x80,0x65,0xC0,0x69,0xE0,0x71,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x6128, {0x21,0x80,0xFD,0x80,0x7A,0x60,0x7B,0xE0,0x7F,0x40,0x49,0x80,0xBB,0xC0,0x00,0x20,0x04,0x40,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x612C, {0x48,0x00,0x73,0xC0,0xFF,0xC0,0x2B,0xC0,0x6B,0xC0,0x7A,0x40,0x24,0x40,0x4C,0xC0,0x02,0x00,0x10,0x20,0x51,0xA0,0x8F,0x80,0x00,0x00,}}, +{ 0x6134, {0x61,0x00,0x63,0x00,0x67,0x80,0x7F,0xC0,0x77,0xE0,0x64,0x80,0xE7,0x80,0x64,0x80,0x67,0x80,0x6F,0xC0,0x74,0x40,0x67,0xC0,0x00,0x00,}}, +{ 0x613C, {0x64,0x80,0x67,0x20,0x67,0xE0,0x73,0xC0,0x7A,0x40,0x6B,0xC0,0xEA,0x40,0x6B,0xC0,0x6B,0xC0,0x6F,0xE0,0x66,0xC0,0x78,0x20,0x00,0x00,}}, +{ 0x613D, {0x61,0x40,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7F,0xC0,0x69,0x40,0xEF,0xC0,0x69,0x40,0x6F,0xE0,0x6F,0xE0,0x62,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x613E, {0x64,0x00,0x64,0x00,0x67,0xE0,0x7F,0x80,0x70,0x00,0x7F,0x80,0xF3,0x80,0x6B,0x80,0x6F,0x80,0x6F,0xE0,0x6B,0x60,0x72,0x20,0x00,0x00,}}, +{ 0x613F, {0x00,0x00,0x7F,0xE0,0x6F,0x80,0x7F,0x80,0x70,0x80,0x5F,0x80,0x52,0x80,0xA6,0x60,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6142, {0x2F,0x80,0x23,0x80,0x8F,0xC0,0x4F,0xC0,0x2B,0x40,0x2F,0xC0,0x49,0x40,0x49,0xC0,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6144, {0x60,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7B,0xC0,0x6F,0xC0,0xE1,0x00,0x7F,0xE0,0x67,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x6147, {0x18,0x00,0x73,0x80,0x7A,0x80,0x7F,0xE0,0x7A,0xC0,0x79,0x80,0x4E,0x80,0xB0,0x60,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6148, {0x21,0x00,0x12,0x00,0xFF,0xE0,0x6B,0x40,0x31,0xC0,0x2B,0x40,0xFF,0xE0,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x614A, {0x61,0x40,0x67,0x80,0x7F,0xE0,0x7F,0xE0,0x7F,0xC0,0x63,0xC0,0xFF,0xE0,0x63,0xC0,0x6F,0xC0,0x6F,0xC0,0x73,0xA0,0x63,0x80,0x00,0x00,}}, +{ 0x614B, {0x21,0x00,0x49,0x40,0xFD,0x80,0x79,0xE0,0x79,0x40,0x79,0x80,0x49,0x20,0x58,0xE0,0x04,0x40,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x614C, {0x22,0x80,0x2F,0xE0,0x22,0x80,0x7F,0xE0,0x74,0x00,0x63,0xC0,0xA0,0x00,0x25,0x80,0x25,0x80,0x25,0xA0,0x29,0xA0,0x30,0x60,0x00,0x00,}}, +{ 0x614D, {0x60,0x00,0x67,0x80,0x65,0x80,0x77,0x80,0x74,0x80,0x67,0x80,0xE0,0x00,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x614E, {0x21,0x00,0x3F,0xE0,0x27,0x80,0x34,0x80,0x77,0x80,0x64,0x80,0xA7,0x80,0x24,0x80,0x27,0x80,0x2F,0xE0,0x24,0x80,0x38,0x40,0x00,0x00,}}, +{ 0x6153, {0x60,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7F,0xC0,0x60,0x00,0xEF,0xC0,0x60,0x00,0x7F,0xE0,0x69,0x40,0x71,0x40,0x63,0x00,0x00,0x00,}}, +{ 0x6155, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x39,0x80,0xED,0x60,0x4A,0x80,0x18,0x00,0x00,0x00,}}, +{ 0x6158, {0x61,0x00,0x62,0xC0,0x6F,0xC0,0x74,0xC0,0x7A,0xA0,0x7F,0xE0,0xE3,0x80,0x67,0xC0,0x7F,0x60,0x66,0x40,0x63,0x80,0x6E,0x00,0x00,0x00,}}, +{ 0x6159, {0x20,0x40,0xFF,0x80,0x7B,0xE0,0x7B,0xE0,0x7A,0x80,0x7A,0x80,0xFC,0x80,0x20,0x80,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x615A, {0x64,0x20,0x65,0xC0,0x7F,0x80,0x7F,0x80,0x77,0xE0,0x7F,0xC0,0xF5,0xC0,0x7F,0xC0,0x6F,0xC0,0x6F,0x40,0x65,0x40,0x66,0x40,0x00,0x00,}}, +{ 0x615D, {0x00,0x00,0x7F,0xC0,0x7F,0x80,0x7F,0x80,0x7F,0xC0,0x5F,0x80,0x69,0x80,0x4F,0x80,0x7F,0xC0,0x16,0x40,0x51,0xA0,0x8F,0xA0,0x00,0x00,}}, +{ 0x615F, {0x61,0x80,0x7E,0x80,0x6E,0x80,0x7F,0xE0,0x7F,0xE0,0x75,0xA0,0xFF,0xA0,0x77,0xA0,0x7E,0xA0,0x7F,0xA0,0x67,0xA0,0x7D,0x60,0x00,0x00,}}, +{ 0x6162, {0x20,0x00,0x27,0x80,0x27,0x80,0x34,0x80,0x77,0x80,0x6F,0xC0,0xAA,0xC0,0x2F,0xC0,0x3F,0xC0,0x22,0x80,0x27,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x6163, {0x20,0x00,0x23,0xE0,0x2F,0xF0,0x27,0xE0,0x30,0x00,0x6F,0xE0,0x64,0x20,0xA7,0xE0,0x27,0xE0,0x27,0xE0,0x23,0x60,0x2C,0x10,0x00,0x00,}}, +{ 0x6165, {0x61,0x80,0x6B,0x80,0x67,0xC0,0x77,0xC0,0x7D,0x80,0x6F,0xE0,0xE1,0x80,0x7B,0xC0,0x6A,0x40,0x6B,0xC0,0x74,0x00,0x63,0xE0,0x00,0x00,}}, +{ 0x6167, {0x20,0x80,0xFF,0xE0,0x7B,0xC0,0x7F,0xE0,0xF1,0x80,0x3F,0x80,0x7F,0xC0,0x00,0x80,0x1F,0x00,0x56,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6168, {0x20,0x00,0x2F,0xE0,0x2A,0xC0,0x2E,0xC0,0x2A,0xC0,0x6F,0xF0,0x78,0x40,0xAA,0xC0,0x2A,0xC0,0x2D,0xD0,0x29,0x50,0x22,0x30,0x00,0x00,}}, +{ 0x616B, {0x64,0x80,0x44,0xC0,0x9B,0x60,0x39,0x00,0x29,0xC0,0x6D,0x00,0xF3,0x00,0x20,0xE0,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x616E, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x7F,0xC0,0x43,0x80,0x5F,0x80,0x52,0x80,0x5F,0x80,0x5F,0xC0,0x5A,0xA0,0xA8,0xA0,0x27,0x80,0x00,0x00,}}, +{ 0x616F, {0x64,0x00,0x64,0x00,0x6F,0xE0,0x77,0x80,0x77,0x80,0x74,0x80,0xE7,0x80,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x67,0x40,0x6B,0x80,0x00,0x00,}}, +{ 0x6170, {0x00,0x80,0x7C,0x80,0x47,0xE0,0x7C,0x80,0x43,0x80,0x7D,0x80,0x78,0x80,0xD4,0x80,0x94,0xC0,0x12,0x20,0x50,0xA0,0x8F,0x80,0x00,0x00,}}, +{ 0x6171, {0x61,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7F,0xC0,0x69,0x40,0xEF,0xC0,0x63,0x40,0x7F,0xE0,0x7F,0xE0,0x64,0xC0,0x62,0x80,0x00,0x00,}}, +{ 0x6173, {0x60,0x00,0x7F,0xE0,0x7D,0xA0,0x7E,0xC0,0x7E,0xC0,0x75,0xC0,0xFE,0x20,0x73,0x00,0x6F,0xC0,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6174, {0x30,0x00,0x3F,0xE0,0x33,0x60,0x3F,0xE0,0x3D,0xE0,0x39,0xA0,0x72,0x00,0x37,0xC0,0x37,0xC0,0x37,0xC0,0x37,0xC0,0x34,0x40,0x00,0x00,}}, +{ 0x6175, {0x61,0x00,0x7F,0xE0,0x77,0xC0,0x77,0xC0,0x7F,0xE0,0x71,0x40,0xF7,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x6F,0xC0,0x69,0xC0,0x00,0x00,}}, +{ 0x6176, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xE0,0x75,0xC0,0x67,0xA0,0x7F,0xA0,0x57,0x00,0x8F,0x00,0x30,0xE0,0x00,0x00,}}, +{ 0x6177, {0x61,0x00,0x6F,0xE0,0x6F,0xC0,0x7F,0xC0,0x7F,0xE0,0x69,0x40,0xEF,0xC0,0x69,0x40,0x6F,0xC0,0x7F,0x80,0x71,0x60,0x63,0x00,0x00,0x00,}}, +{ 0x617E, {0x29,0x00,0x55,0x00,0x1B,0xE0,0x2C,0xC0,0x78,0x80,0xA9,0x80,0x3E,0x40,0x04,0x20,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6182, {0x00,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x55,0xC0,0x9F,0xC0,0x1F,0x20,0x7A,0x00,0x1F,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x6187, {0x0A,0x40,0x72,0x40,0xFF,0xE0,0xFB,0xC0,0x7A,0x40,0x4A,0x40,0x7B,0xC0,0x42,0x40,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x618A, {0x23,0x80,0x2F,0xC0,0x6F,0xE0,0x6F,0xE0,0xEF,0x40,0x77,0xC0,0x65,0x40,0x67,0xC0,0x46,0x40,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x618E, {0x12,0x40,0x11,0x80,0x17,0xE0,0x1F,0xE0,0x3D,0xA0,0x37,0xE0,0x50,0x00,0x13,0xC0,0x12,0x40,0x13,0xC0,0x13,0xC0,0x12,0x40,0x00,0x00,}}, +{ 0x6190, {0x21,0x00,0x29,0x40,0x27,0xE0,0x3F,0xE0,0x73,0x80,0x7D,0x60,0xA9,0x40,0x2F,0xE0,0x2B,0x40,0x27,0xE0,0x28,0x40,0x30,0x40,0x00,0x00,}}, +{ 0x6191, {0x00,0x00,0x4F,0xC0,0x6F,0x80,0x0F,0x80,0x2B,0x00,0x2F,0xE0,0x55,0xA0,0x52,0xE0,0x14,0x40,0x12,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x6194, {0x64,0x80,0x64,0x80,0x67,0xE0,0x7F,0xE0,0x77,0xC0,0x65,0x80,0xE7,0xC0,0x65,0x80,0x67,0xE0,0x6A,0x40,0x6B,0xE0,0x71,0xA0,0x00,0x00,}}, +{ 0x6196, {0x21,0x80,0xFD,0xC0,0x6B,0xE0,0xFF,0xE0,0x71,0x80,0x69,0x40,0xAE,0x20,0x04,0x00,0x12,0x40,0x50,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6199, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x1F,0x40,0x52,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x619A, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0x7C,0xC0,0x7F,0xC0,0x69,0x40,0xEF,0xC0,0x6B,0x40,0x6F,0xC0,0x7F,0xE0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x61A4, {0x21,0x00,0x2F,0xC0,0x3F,0xE0,0x34,0x80,0x7F,0xC0,0x68,0x40,0xAF,0xC0,0x28,0x40,0x2F,0xC0,0x2F,0xC0,0x25,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x61A7, {0x21,0x00,0x2F,0xC0,0x24,0x80,0x3F,0xE0,0x79,0x40,0x7F,0xC0,0xA9,0x40,0x2F,0xC0,0x21,0x00,0x27,0xC0,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x61A9, {0x09,0x00,0x73,0xC0,0xFF,0xC0,0x22,0x40,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x42,0x40,0x14,0x00,0x52,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x61AB, {0x30,0x00,0x37,0xE0,0x37,0xE0,0x3F,0xE0,0x3F,0xE0,0x34,0xA0,0x77,0xE0,0x35,0xA0,0x34,0xA0,0x35,0xE0,0x36,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x61AC, {0x60,0x00,0x67,0x80,0x67,0x80,0x77,0x80,0x77,0x80,0x61,0x00,0xFF,0xE0,0x67,0x80,0x67,0x80,0x67,0x80,0x69,0x40,0x73,0x40,0x00,0x00,}}, +{ 0x61AE, {0x68,0x00,0x68,0x00,0x7F,0xE0,0x7B,0xC0,0x7F,0xE0,0x6B,0xC0,0xEB,0xC0,0x6B,0xC0,0x7F,0xE0,0x74,0x40,0x73,0x20,0x63,0xA0,0x00,0x00,}}, +{ 0x61B2, {0x04,0x00,0x7F,0xE0,0x84,0x00,0xFF,0xC0,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x2A,0x80,0x7F,0xC0,0x56,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x61B6, {0x21,0x00,0x2F,0xC0,0x24,0x80,0x7F,0xE0,0x77,0x80,0x74,0x80,0xA7,0x80,0x24,0x80,0x27,0xC0,0x2D,0x20,0x34,0xA0,0x23,0x80,0x00,0x00,}}, +{ 0x61BA, {0x61,0x00,0x63,0x80,0x6F,0xE0,0x7F,0xE0,0x7A,0xC0,0x6D,0x80,0xEF,0xE0,0x69,0x80,0x6B,0xC0,0x73,0xC0,0x73,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x61BE, {0x40,0xC0,0x4F,0xE0,0x4F,0x80,0x68,0xC0,0x7F,0xC0,0xCD,0xA0,0xD7,0x60,0x42,0x20,0x45,0x40,0x54,0x60,0x54,0xA0,0x43,0x80,0x00,0x00,}}, +{ 0x61C3, {0x71,0x00,0xFD,0x00,0x7F,0xC0,0x7F,0xC0,0x79,0x40,0xFE,0x40,0x7A,0x40,0x3C,0x80,0xC4,0x00,0x12,0x20,0x51,0xA0,0x8F,0x80,0x00,0x00,}}, +{ 0x61C6, {0x60,0x00,0x67,0x80,0x67,0x80,0x77,0x80,0x7E,0xC0,0x6B,0xC0,0xEF,0xC0,0x63,0x00,0x7F,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x61C7, {0x33,0xC0,0xD2,0x40,0x7B,0xC0,0xB2,0x40,0x73,0xC0,0x9A,0xA0,0x2B,0xC0,0xD7,0x40,0x34,0x20,0x12,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x61C8, {0x68,0x00,0x6E,0xE0,0x76,0xA0,0x7F,0xA0,0x77,0x60,0x75,0x40,0xFF,0xC0,0x75,0xE0,0x7F,0xE0,0x7F,0xE0,0x71,0x40,0x63,0x40,0x00,0x00,}}, +{ 0x61C9, {0x02,0x00,0x7F,0xE0,0x6B,0xE0,0x7F,0xE0,0x7B,0xC0,0x72,0x80,0x73,0xC0,0x72,0xC0,0x53,0xE0,0x4A,0x40,0xA8,0xE0,0x27,0xA0,0x00,0x00,}}, +{ 0x61CA, {0x61,0x00,0x62,0x00,0x6F,0xC0,0x7F,0xC0,0x7B,0xC0,0x6F,0xC0,0xEB,0xC0,0x6D,0xC0,0x6F,0xE0,0x6F,0xE0,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x61CB, {0x60,0x80,0x7F,0xC0,0xEE,0xE0,0x7F,0xC0,0x7F,0xC0,0x75,0xA0,0xE5,0xA0,0x0C,0x80,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x61CC, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0x61,0x00,0xFF,0xE0,0x64,0xC0,0x7F,0xE0,0x6F,0xC0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x61CD, {0x61,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7B,0xC0,0x6B,0xC0,0xEF,0xC0,0x6F,0x80,0x6F,0xE0,0x6F,0xE0,0x7B,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x61D0, {0x21,0x00,0x3F,0xE0,0x21,0x00,0x3F,0xC0,0x7A,0xC0,0x6F,0xC0,0xA1,0x00,0x3F,0xE0,0x27,0x40,0x3D,0x80,0x27,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x61E3, {0x24,0x80,0x3F,0xE0,0x87,0x80,0x5F,0xE0,0x3F,0xE0,0x35,0xA0,0x55,0xA0,0x5B,0x60,0x10,0x20,0x16,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x61E6, {0x60,0x00,0x6F,0xC0,0x67,0xE0,0x7F,0xE0,0x7D,0xC0,0x6D,0xC0,0xE1,0x00,0x7F,0xE0,0x67,0xC0,0x6F,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x61F2, {0x48,0x80,0xFA,0x80,0xBF,0xE0,0x7F,0x40,0xE9,0xC0,0x7E,0x80,0x6F,0x80,0x31,0x40,0x04,0x20,0x72,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x61F4, {0x65,0x80,0x65,0xC0,0x7F,0xC0,0x7F,0xE0,0x6B,0x80,0x7B,0xC0,0xEB,0xC0,0x7B,0xC0,0x6A,0x80,0x6B,0xE0,0x6F,0x60,0x78,0x20,0x00,0x00,}}, +{ 0x61F6, {0x64,0x00,0x65,0xE0,0x7E,0xA0,0x7F,0xE0,0x77,0xE0,0x75,0xA0,0xFF,0xE0,0x6D,0xA0,0x6F,0xE0,0x75,0xE0,0x65,0xC0,0x65,0x20,0x00,0x00,}}, +{ 0x61F7, {0x61,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x7F,0xC0,0x61,0x00,0xFD,0xE0,0x7F,0xE0,0x7F,0x40,0x7D,0xC0,0x67,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x61F8, {0x78,0xC0,0xCB,0x80,0xF9,0xC0,0xCB,0xC0,0xFF,0xE0,0xF8,0xA0,0x6B,0xC0,0xA4,0xA0,0x94,0x00,0x52,0x40,0x50,0x20,0x8F,0xA0,0x00,0x00,}}, +{ 0x61FA, {0x6B,0x80,0x6B,0xC0,0x7F,0xC0,0x71,0x80,0x7F,0xE0,0x6B,0x80,0xFB,0xC0,0x6B,0xC0,0x7B,0x80,0x7B,0xE0,0x6F,0x60,0x78,0x20,0x00,0x00,}}, +{ 0x61FC, {0x60,0x00,0x6F,0xC0,0x6F,0xC0,0x7F,0xC0,0x7B,0xC0,0x6F,0xC0,0xE5,0x80,0x67,0xE0,0x6F,0xC0,0x77,0xC0,0x65,0x80,0x67,0xE0,0x00,0x00,}}, +{ 0x61FD, {0x64,0x80,0x7F,0xE0,0x64,0xC0,0x7F,0xC0,0x7F,0xC0,0x65,0x80,0xE7,0xE0,0x6D,0x80,0x77,0xC0,0x67,0xC0,0x65,0x80,0x67,0xE0,0x00,0x00,}}, +{ 0x61FE, {0x60,0x00,0x6F,0xC0,0x67,0x80,0x77,0x80,0x7F,0xC0,0x60,0x80,0xFF,0xE0,0x6B,0xC0,0x6F,0xC0,0x6F,0xE0,0x7F,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x61FF, {0x61,0x00,0xF1,0x00,0x6F,0xE0,0xF1,0xC0,0x95,0x80,0xF9,0x40,0x03,0x20,0x71,0x80,0x71,0x00,0x75,0x20,0x79,0xA0,0xC1,0x80,0x00,0x00,}}, +{ 0x6200, {0x6E,0x80,0x7F,0xC0,0xE7,0xC0,0x6E,0xC0,0xF3,0xE0,0x6F,0xC0,0xFB,0xA0,0x0E,0x80,0x04,0x00,0x52,0x20,0x91,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x6208, {0x04,0x00,0x04,0xC0,0x04,0x40,0xFF,0xE0,0x02,0x00,0x02,0x40,0x02,0x40,0x01,0x80,0x03,0x80,0x0F,0xA0,0x30,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x6209, {0x02,0x80,0x02,0x40,0x3F,0xE0,0x7F,0xE0,0x62,0x40,0x62,0x40,0x61,0x40,0x61,0x80,0x69,0x80,0x71,0xA0,0xC6,0x60,0x18,0x20,0x00,0x00,}}, +{ 0x620A, {0x02,0x00,0x02,0x80,0x02,0x40,0x3F,0xE0,0x22,0x40,0x22,0x40,0x22,0x80,0x21,0x80,0x21,0x00,0x46,0xA0,0x58,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x620C, {0x02,0x80,0x02,0x40,0x3F,0xE0,0x7F,0xE0,0x62,0x40,0x62,0x40,0x61,0x40,0x7D,0x80,0x61,0x80,0x41,0xA0,0x46,0x60,0x98,0x20,0x00,0x00,}}, +{ 0x620D, {0x02,0x80,0x02,0x40,0x3F,0xE0,0x7F,0xE0,0x62,0x40,0x62,0x40,0x71,0x40,0x69,0x80,0x69,0x80,0x41,0xA0,0x46,0x60,0x98,0x20,0x00,0x00,}}, +{ 0x620E, {0x02,0x80,0x02,0x40,0xFF,0xE0,0x02,0x40,0x22,0x40,0x22,0x40,0x2E,0x80,0xF1,0x80,0x21,0x00,0x22,0xA0,0x44,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x6210, {0x02,0x80,0x02,0x40,0x7F,0xE0,0x42,0x00,0x42,0x80,0x7A,0x80,0x49,0x00,0x49,0x00,0x49,0x00,0x5A,0xA0,0x44,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x6211, {0x0A,0x00,0x12,0xC0,0x62,0x40,0x22,0x00,0xFF,0xE0,0x22,0x40,0x22,0x40,0x39,0x80,0xE1,0x00,0x22,0xA0,0x2C,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x6212, {0x02,0x80,0x02,0x40,0xFF,0xE0,0x02,0x00,0x0A,0x40,0x2A,0x40,0x29,0x80,0xFF,0x80,0x29,0x00,0x49,0xA0,0x4A,0x60,0x84,0x20,0x00,0x00,}}, +{ 0x6214, {0x04,0x80,0x04,0xC0,0xFF,0xE0,0x03,0xA0,0x07,0xA0,0x39,0xE0,0x04,0x80,0xFF,0xE0,0x03,0x80,0x03,0xA0,0x1C,0xE0,0x60,0x20,0x00,0x00,}}, +{ 0x6216, {0x02,0x80,0x02,0x40,0xFF,0xE0,0x02,0x00,0x7A,0x40,0x4A,0x40,0x49,0x40,0x79,0x80,0x40,0x80,0x19,0xA0,0xE6,0x60,0x18,0x20,0x00,0x00,}}, +{ 0x621A, {0x01,0x80,0x01,0x40,0x7F,0xE0,0x49,0x00,0x4D,0x40,0x7F,0x40,0x49,0x40,0x5D,0x80,0x5A,0x80,0x69,0xA0,0x8A,0x60,0x18,0x20,0x00,0x00,}}, +{ 0x621B, {0x00,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x3F,0xC0,0xFF,0xE0,0xFF,0xE0,0x0F,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x621D, {0x01,0x80,0x79,0x40,0x49,0x40,0x79,0xE0,0x4F,0x40,0x79,0x40,0x49,0x80,0x49,0x80,0x79,0x80,0x6A,0xA0,0x4C,0x60,0x88,0x20,0x00,0x00,}}, +{ 0x621E, {0x00,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x7F,0xE0,0xFF,0xC0,0x3F,0xC0,0x0F,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x621F, {0x21,0x00,0x21,0x80,0xF9,0x40,0x7F,0xE0,0x49,0x40,0x79,0x40,0x49,0x80,0x78,0x80,0x21,0x80,0xFA,0xA0,0x24,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x6221, {0x69,0xC0,0x69,0xA0,0xFF,0xE0,0x7B,0xE0,0x69,0xC0,0x79,0xC0,0x69,0xC0,0xFE,0x80,0x68,0x80,0x65,0xE0,0x42,0x60,0x7C,0x20,0x00,0x00,}}, +{ 0x6226, {0x25,0x80,0xA5,0x40,0x59,0x40,0x79,0xE0,0x6F,0x00,0x79,0x40,0x69,0x40,0x79,0x80,0x21,0x00,0xFA,0xA0,0x2C,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x622A, {0x11,0x00,0x11,0xC0,0x7D,0x40,0xFF,0xE0,0x6B,0x00,0x7F,0x40,0x69,0xC0,0xFE,0xC0,0xFC,0x80,0x7C,0xE0,0x7F,0x60,0x60,0x20,0x00,0x00,}}, +{ 0x622E, {0x01,0x80,0xFF,0xC0,0x67,0xC0,0xFF,0xE0,0xFB,0x80,0xB3,0xC0,0x78,0xC0,0xF4,0x80,0x70,0x80,0x69,0xE0,0x32,0x60,0xE0,0x20,0x00,0x00,}}, +{ 0x622F, {0x11,0x00,0x1D,0x40,0x7D,0x40,0x5D,0xE0,0x73,0x00,0x5D,0x40,0x55,0x40,0x76,0x80,0x74,0x80,0x5D,0xA0,0xB2,0x60,0x60,0x20,0x00,0x00,}}, +{ 0x6230, {0x01,0x80,0xFD,0xC0,0xFD,0xC0,0xC9,0xE0,0x7B,0x80,0x69,0xC0,0x78,0xC0,0x78,0xC0,0x78,0x80,0xFD,0xE0,0x32,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x6232, {0x11,0x80,0x1D,0xC0,0x7F,0xC0,0x7D,0xE0,0x5F,0x80,0x7D,0xC0,0x40,0xC0,0x7C,0xC0,0x7C,0x80,0x79,0xE0,0x5E,0x60,0xF0,0x20,0x00,0x00,}}, +{ 0x6233, {0x01,0x80,0xFF,0xC0,0x67,0xC0,0xFF,0xE0,0xFB,0x80,0xEB,0xC0,0x7E,0xC0,0xD0,0xC0,0xFC,0x80,0x7C,0xE0,0x51,0x60,0x7E,0x20,0x00,0x00,}}, +{ 0x6234, {0x11,0x00,0x3D,0x80,0x11,0x40,0xFF,0xE0,0x55,0x40,0x7D,0x40,0x55,0x80,0x7D,0x80,0x7E,0x80,0xFE,0xA0,0x77,0x60,0xC2,0x20,0x00,0x00,}}, +{ 0x6238, {0x00,0x00,0x7F,0xE0,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x00,0x00,}}, +{ 0x623B, {0x00,0x00,0x7F,0xE0,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x22,0x40,0x22,0x00,0x3F,0xE0,0x46,0x00,0x49,0x00,0x90,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x623F, {0x00,0x00,0x7F,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x22,0x00,0x3F,0xE0,0x24,0x00,0x27,0x80,0x44,0x80,0x48,0x80,0xB1,0x80,0x00,0x00,}}, +{ 0x6240, {0x00,0x40,0x7C,0x80,0x03,0x00,0x3A,0x00,0x2B,0xE0,0x2A,0x80,0x3A,0x80,0x2A,0x80,0x22,0x80,0x24,0x80,0x48,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x6241, {0x00,0x00,0x7F,0xE0,0x3F,0xC0,0x7F,0xC0,0x7F,0xC0,0x60,0x00,0x7F,0xC0,0x65,0x40,0x7F,0xC0,0x7F,0xC0,0xA5,0x40,0x25,0xC0,0x00,0x00,}}, +{ 0x6247, {0x00,0x00,0x7F,0xE0,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x35,0x40,0x5D,0xC0,0x7F,0xC0,0x84,0x40,0x0C,0xC0,0x00,0x00,}}, +{ 0x6248, {0x00,0x00,0x7F,0xE0,0x3F,0xC0,0x7F,0xC0,0x7F,0xC0,0x6F,0x80,0x69,0x80,0x6F,0x80,0x7F,0x80,0x5F,0xA0,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x6249, {0x00,0x00,0xFF,0xE0,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x45,0x00,0x5D,0xC0,0x45,0x00,0x5D,0xC0,0x79,0xE0,0x89,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x624B, {0x01,0x00,0x02,0x00,0x3C,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x624D, {0x02,0x00,0x02,0x00,0xFF,0xE0,0x02,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x0A,0x00,0x32,0x00,0x42,0x00,0x02,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x624E, {0x62,0x00,0x62,0x00,0xF2,0x00,0xF2,0x00,0x62,0x00,0x62,0x00,0x72,0x00,0x62,0x00,0xE2,0x00,0x62,0x20,0x62,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x6253, {0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x38,0x80,0xE0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x6255, {0x21,0x00,0x21,0x00,0xF9,0x00,0x21,0x00,0x21,0x00,0x31,0x00,0x62,0x00,0xA2,0x80,0x24,0x40,0x24,0xC0,0x3F,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x6258, {0x20,0x40,0x21,0x80,0xFF,0x00,0x21,0x00,0x21,0x00,0x21,0xE0,0x3F,0x00,0x61,0x00,0xA1,0x00,0x21,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x625B, {0x60,0x00,0x6F,0xC0,0xF1,0x00,0xF1,0x00,0x61,0x00,0x61,0x00,0x71,0x00,0x61,0x00,0xE1,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x625E, {0x60,0x00,0x67,0xC0,0xF1,0x00,0xF1,0x00,0x61,0x00,0x6F,0xE0,0x71,0x00,0x61,0x00,0xE1,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6260, {0x60,0x00,0x6F,0xC0,0xF0,0x40,0xF5,0x40,0x65,0xC0,0x62,0x80,0x73,0x80,0x61,0x00,0xE3,0x00,0x64,0x80,0x68,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x6263, {0x30,0x00,0x30,0x00,0x7B,0xE0,0x7A,0x20,0x32,0x20,0x32,0x20,0x3A,0x20,0x32,0x20,0x72,0x20,0x33,0xE0,0x32,0x20,0x32,0x20,0x00,0x00,}}, +{ 0x6268, {0x60,0x00,0x6F,0x80,0xF2,0x80,0xF2,0x80,0x6A,0x80,0x66,0x80,0x72,0x80,0x63,0x80,0xE6,0xE0,0x64,0xE0,0x68,0x80,0x71,0x80,0x00,0x00,}}, +{ 0x626E, {0x23,0x00,0x21,0x00,0xF5,0x00,0x24,0x80,0x28,0x80,0x3F,0xC0,0x72,0xA0,0xA2,0x80,0x24,0x80,0x24,0x80,0x28,0x80,0x31,0x80,0x00,0x00,}}, +{ 0x6271, {0x20,0x00,0x2F,0x80,0xF4,0x80,0x25,0x00,0x27,0xC0,0x26,0x40,0x36,0x40,0xE9,0x80,0x29,0x80,0x29,0x80,0x36,0x40,0x78,0x20,0x00,0x00,}}, +{ 0x6276, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x21,0x00,0x21,0x00,0x31,0x00,0x6F,0xE0,0xA1,0x00,0x22,0x80,0x24,0x80,0x38,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x6279, {0x29,0x00,0x29,0x00,0xF9,0x00,0x29,0x20,0x2F,0xC0,0x39,0x00,0x69,0x00,0xA9,0x00,0x29,0x00,0x2B,0x20,0x2D,0x20,0x30,0xE0,0x00,0x00,}}, +{ 0x627C, {0x60,0x00,0x6F,0xE0,0xF8,0x00,0xFB,0xC0,0x6A,0x40,0x6A,0x40,0x7A,0x40,0x6A,0x40,0xEA,0x80,0x7A,0x20,0x72,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x627E, {0x61,0x80,0x61,0x40,0xF1,0x40,0xF1,0xE0,0x6F,0x40,0x61,0x40,0x71,0x80,0x61,0x80,0xE1,0x80,0x62,0xA0,0x6C,0x60,0x60,0x20,0x00,0x00,}}, +{ 0x627F, {0x00,0x00,0x3F,0x00,0x02,0x00,0xE4,0x20,0x3F,0xC0,0x25,0x00,0x3F,0x80,0x44,0x80,0x5F,0xC0,0x84,0x20,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6280, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x21,0x00,0x6F,0xC0,0x74,0x40,0xA2,0x80,0x23,0x80,0x21,0x00,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x6282, {0x60,0x00,0x7F,0xE0,0xF1,0x00,0xF1,0x00,0x61,0x00,0x6F,0xC0,0x71,0x00,0x61,0x00,0xE1,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6283, {0x61,0x00,0x61,0x00,0xFF,0xE0,0xFF,0xE0,0x61,0x00,0x61,0x00,0x71,0x80,0x61,0x40,0xE1,0x40,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6284, {0x21,0x00,0x21,0x00,0xF5,0x80,0x25,0x40,0x29,0x40,0x39,0x20,0x63,0xA0,0xA1,0x80,0x21,0x00,0x22,0x00,0x2C,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x6289, {0x62,0x00,0x62,0x00,0xFF,0x80,0xFF,0x80,0x62,0x80,0x62,0x80,0x7F,0xE0,0x62,0x00,0xE7,0x00,0x69,0x00,0x70,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x628A, {0x20,0x00,0x2F,0xC0,0xF9,0x40,0x29,0x40,0x29,0x40,0x3F,0xC0,0x68,0x40,0xA8,0x00,0x28,0x00,0x28,0x20,0x28,0x20,0x27,0xE0,0x00,0x00,}}, +{ 0x6291, {0x11,0x00,0x11,0x00,0x7E,0xE0,0x14,0xA0,0x14,0xA0,0x1C,0xA0,0x34,0xA0,0x55,0xA0,0x16,0xA0,0x1C,0xC0,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x6292, {0x60,0x00,0x6F,0xC0,0xF3,0x80,0xF1,0x00,0x7F,0xE0,0x61,0x40,0x71,0x80,0x61,0x00,0xE1,0x00,0x61,0x00,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x6293, {0x60,0x40,0x61,0x80,0xF7,0x80,0xF5,0x80,0x65,0x80,0x65,0x80,0x75,0x80,0x65,0x80,0xE5,0x80,0x69,0x40,0x71,0x40,0x60,0x20,0x00,0x00,}}, +{ 0x6294, {0x60,0x00,0x6F,0xE0,0xF1,0x80,0xF1,0x80,0x61,0x80,0x63,0x80,0x75,0x40,0x69,0x20,0xE1,0x20,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6295, {0x20,0x00,0x27,0x00,0xF5,0x00,0x25,0x20,0x28,0xE0,0x30,0x00,0x7F,0x80,0xA4,0x80,0x23,0x00,0x23,0x00,0x2C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x6296, {0x60,0x80,0x62,0x80,0xF1,0x80,0xF0,0x80,0x64,0x80,0x62,0x80,0x72,0x80,0x60,0xE0,0xE7,0x80,0x64,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x6297, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x20,0x00,0x27,0x80,0x74,0x80,0x74,0x80,0x64,0x80,0xA4,0x80,0x28,0xA0,0x28,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x6298, {0x20,0x40,0x21,0x80,0xF6,0x00,0x24,0x00,0x27,0xE0,0x24,0x80,0x74,0x80,0xA4,0x80,0x28,0x80,0x30,0x80,0x20,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x629B, {0x69,0x80,0x69,0x80,0xF9,0xC0,0xFF,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x6B,0x40,0xEA,0x40,0x7A,0x60,0x72,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x629C, {0x22,0x00,0x22,0x00,0xFF,0xE0,0x22,0x00,0x22,0x00,0x33,0xC0,0x62,0x40,0xA3,0x40,0x24,0x80,0x28,0x80,0x33,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x629E, {0x20,0x00,0x27,0xC0,0xF4,0x40,0x24,0x40,0x27,0xC0,0x35,0x40,0x65,0x00,0xA5,0x00,0x24,0x80,0x28,0x80,0x30,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x62AB, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x29,0x40,0x29,0x00,0x3F,0xC0,0x6A,0x40,0xAA,0x80,0x29,0x80,0x29,0x00,0x32,0x80,0x34,0x60,0x00,0x00,}}, +{ 0x62AC, {0x61,0x00,0x61,0x00,0xF2,0x00,0xF2,0x40,0x64,0xE0,0x7F,0xA0,0x70,0x00,0x67,0xC0,0xE4,0x40,0x64,0x40,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x62B1, {0x24,0x00,0x24,0x00,0xF7,0xC0,0x28,0x40,0x3F,0x40,0x31,0x40,0x6F,0x40,0xA9,0x40,0x28,0x80,0x28,0x20,0x28,0x20,0x27,0xE0,0x00,0x00,}}, +{ 0x62B5, {0x20,0xC0,0x27,0x00,0xF5,0x00,0x25,0x00,0x27,0xE0,0x35,0x00,0x65,0x00,0xA5,0x00,0x2E,0x80,0x28,0x60,0x3F,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x62B9, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x21,0x00,0x3F,0xC0,0x61,0x00,0xA3,0x80,0x25,0x40,0x39,0x20,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x62BB, {0x30,0x80,0x30,0x80,0x7F,0xE0,0x7F,0xE0,0x34,0xA0,0x37,0xE0,0x3C,0xA0,0x35,0xA0,0x77,0xE0,0x30,0x80,0x30,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x62BC, {0x10,0x00,0x17,0xE0,0x7C,0xA0,0x17,0xE0,0x14,0xA0,0x14,0xA0,0x1F,0xE0,0x74,0xA0,0x10,0x80,0x10,0x80,0x10,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x62BD, {0x10,0x80,0x10,0x80,0x78,0x80,0x17,0xE0,0x14,0xA0,0x1C,0xA0,0x34,0xA0,0x57,0xE0,0x14,0xA0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x62C2, {0x63,0x80,0x63,0x80,0xFF,0xC0,0xF3,0xC0,0x6F,0xC0,0x6B,0x80,0x7B,0x80,0x6F,0xE0,0xE3,0xA0,0x63,0xE0,0x65,0x80,0x69,0x80,0x00,0x00,}}, +{ 0x62C5, {0x20,0x00,0x27,0x80,0xF4,0x80,0x24,0x80,0x27,0x80,0x24,0x80,0x34,0x80,0x64,0x80,0xA7,0x80,0x20,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x62C6, {0x60,0x40,0x61,0x80,0xFE,0x00,0xF8,0x00,0x6F,0xE0,0x69,0x80,0x7B,0x80,0x69,0x80,0xE9,0xC0,0x79,0xA0,0x71,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x62C7, {0x60,0x00,0x67,0xC0,0xF4,0x40,0xF5,0x40,0x65,0xC0,0x7F,0xE0,0x78,0x40,0x6A,0x40,0xE9,0x40,0x6F,0xE0,0x68,0x40,0x60,0x80,0x00,0x00,}}, +{ 0x62C8, {0x61,0x00,0x61,0x00,0xF1,0x00,0xF1,0xE0,0x61,0x00,0x61,0x00,0x71,0x00,0x6F,0xC0,0xE8,0x40,0x68,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x62C9, {0x61,0x00,0x61,0x00,0xFF,0xE0,0xFF,0xE0,0x68,0x80,0x64,0x80,0x74,0x80,0x63,0x80,0xE3,0x80,0x63,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x62CA, {0x64,0x80,0x64,0x80,0xF4,0x80,0xFF,0xE0,0x68,0xC0,0x7A,0x80,0x79,0x80,0x69,0x80,0xE8,0x80,0x68,0x80,0x68,0x80,0x68,0x80,0x00,0x00,}}, +{ 0x62CC, {0x61,0x00,0x61,0x00,0xF5,0x40,0xF9,0x40,0x67,0xC0,0x61,0x00,0x71,0x00,0x6F,0xE0,0xE1,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x62CD, {0x10,0x40,0x10,0x80,0x79,0x00,0x13,0xE0,0x12,0x20,0x1A,0x20,0x32,0x20,0x53,0xE0,0x12,0x20,0x12,0x20,0x13,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x62CF, {0x20,0x00,0xFF,0xC0,0x69,0x40,0x79,0x80,0x1B,0x80,0x24,0x60,0xC3,0x00,0x3C,0x00,0x3F,0x80,0x7F,0xC0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x62D0, {0x10,0x00,0x17,0xE0,0x7C,0x20,0x17,0xE0,0x1C,0x20,0x30,0x00,0x3F,0xE0,0x51,0x20,0x11,0x20,0x12,0x20,0x14,0x20,0x18,0x40,0x00,0x00,}}, +{ 0x62D1, {0x64,0x80,0x64,0x80,0xFF,0xE0,0xFF,0xE0,0x64,0x80,0x64,0x80,0x77,0x80,0x64,0x80,0xE4,0x80,0x64,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x62D2, {0x20,0x00,0x27,0xE0,0xFC,0x00,0x27,0xC0,0x24,0x40,0x24,0x40,0x3C,0x40,0xE7,0xC0,0x24,0x40,0x24,0x00,0x27,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x62D3, {0x20,0x00,0x2F,0xE0,0xF1,0x00,0x22,0x00,0x22,0x00,0x27,0xC0,0x3C,0x40,0x74,0x40,0xA4,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x62D4, {0x62,0x80,0x62,0x40,0xFF,0xE0,0xFF,0xE0,0x62,0x80,0x62,0x80,0x77,0x80,0x65,0x80,0xE5,0x80,0x69,0x80,0x72,0x40,0x64,0x20,0x00,0x00,}}, +{ 0x62D7, {0x30,0xC0,0x32,0xC0,0x7A,0xC0,0x7C,0xE0,0x35,0xE0,0x35,0xE0,0x3A,0xE0,0x32,0xE0,0x75,0xE0,0x3F,0xA0,0x31,0xA0,0x31,0x60,0x00,0x00,}}, +{ 0x62D8, {0x12,0x00,0x12,0x00,0x77,0xE0,0x14,0x20,0x18,0x20,0x17,0xA0,0x14,0xA0,0x34,0xA0,0x57,0xA0,0x10,0x20,0x10,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x62D9, {0x10,0x80,0x10,0x80,0x7C,0xA0,0x14,0xA0,0x17,0xE0,0x14,0xA0,0x10,0x80,0x34,0xA0,0x54,0xA0,0x14,0xA0,0x17,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x62DB, {0x10,0x00,0x17,0xE0,0x79,0x20,0x11,0x20,0x12,0x20,0x12,0x40,0x1C,0x00,0x33,0xE0,0x52,0x20,0x12,0x20,0x13,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x62DC, {0x08,0x00,0x17,0xE0,0x63,0xC0,0x23,0xC0,0x79,0x80,0x23,0xC0,0x21,0x80,0x39,0x80,0xE7,0xE0,0x21,0x80,0x61,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x62DD, {0x20,0x00,0x2F,0xC0,0xF1,0x00,0x2F,0xC0,0x21,0x00,0x21,0x00,0x3F,0xC0,0x61,0x00,0xA1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x62E0, {0x20,0x00,0x29,0x80,0xE9,0x80,0x3D,0x80,0x35,0x80,0x35,0x80,0x6D,0x80,0xAA,0x80,0x2E,0xA0,0x34,0x60,0x23,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x62E1, {0x20,0x80,0x20,0x80,0xF7,0xE0,0x24,0x00,0x24,0x80,0x34,0x80,0x64,0x80,0xA5,0x00,0x25,0x40,0x29,0xC0,0x76,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x62EC, {0x20,0x40,0x21,0x80,0xFF,0x00,0x21,0x00,0x3F,0xE0,0x21,0x00,0x61,0x00,0xAF,0xC0,0x28,0x40,0x28,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x62ED, {0x21,0x80,0x21,0x40,0xFF,0xE0,0x21,0x00,0x21,0x00,0x3F,0x00,0x25,0x00,0x64,0x80,0xA4,0x80,0x26,0xA0,0x38,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x62EE, {0x61,0x00,0x61,0x00,0xFF,0xE0,0xFF,0xE0,0x61,0x00,0x67,0xC0,0x70,0x00,0x67,0xC0,0xE4,0x40,0x64,0x40,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x62EF, {0x60,0x00,0x67,0x80,0xF1,0x00,0xFF,0x40,0x63,0x40,0x63,0x80,0x75,0x80,0x65,0xC0,0xE9,0x60,0x63,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x62F1, {0x65,0x80,0x65,0x80,0xF5,0x80,0xFF,0xC0,0x65,0x80,0x65,0x80,0x75,0x80,0x75,0x80,0xFF,0xE0,0x64,0x80,0x68,0x40,0x70,0x40,0x00,0x00,}}, +{ 0x62F3, {0x24,0x80,0x15,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x26,0x80,0xDC,0x60,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x62F5, {0x62,0x00,0x62,0x00,0xFF,0xE0,0xFF,0xE0,0x67,0xC0,0x68,0x40,0x78,0x80,0x69,0x80,0xEF,0xE0,0x69,0x80,0x69,0x80,0x69,0x80,0x00,0x00,}}, +{ 0x62F6, {0x25,0x20,0x25,0x20,0xFA,0x40,0x22,0x40,0x27,0x20,0x21,0x00,0x31,0xC0,0x62,0x40,0xA6,0x80,0x21,0x80,0x23,0x00,0x2C,0x00,0x00,0x00,}}, +{ 0x62F7, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x21,0x40,0x3F,0xE0,0x31,0x00,0x63,0xC0,0xA6,0x00,0x2B,0xC0,0x20,0x40,0x20,0x40,0x61,0x80,0x00,0x00,}}, +{ 0x62FE, {0x21,0x00,0x23,0x00,0xF2,0x80,0x24,0x80,0x2F,0xC0,0x30,0x20,0x60,0x00,0xA7,0x80,0x24,0x80,0x24,0x80,0x27,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x62FF, {0x04,0x00,0x0A,0x00,0xFF,0xE0,0xFF,0xE0,0x31,0x80,0x3F,0x80,0x07,0x00,0x3C,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6301, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x21,0x00,0x3F,0xE0,0x20,0x80,0x60,0x80,0xBF,0xE0,0x24,0x80,0x22,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6302, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xF1,0x00,0x7F,0xE0,0x61,0x00,0x71,0x00,0x6F,0xC0,0xE1,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6307, {0x24,0x00,0x24,0xC0,0xF7,0x00,0x24,0x20,0x23,0xE0,0x30,0x00,0x67,0xC0,0xA4,0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x6308, {0x28,0x00,0x37,0xC0,0x79,0x40,0x79,0x40,0x32,0x40,0x64,0x80,0x03,0x00,0x3C,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6309, {0x21,0x00,0x21,0x00,0x2F,0xE0,0xF8,0x40,0x21,0x00,0x3F,0xE0,0x22,0x80,0xE2,0x80,0x26,0x80,0x21,0x80,0x22,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x630C, {0x62,0x00,0x62,0x00,0xF7,0x80,0xFC,0x80,0x73,0x80,0x61,0x00,0x73,0x80,0x77,0xC0,0xFC,0xA0,0x64,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x6311, {0x22,0x80,0x22,0x80,0xFA,0xC0,0x2A,0xC0,0x26,0x80,0x32,0x80,0x66,0xC0,0xAA,0xA0,0x32,0xA0,0x24,0xA0,0x28,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x6319, {0x28,0x80,0x24,0x80,0xFF,0xE0,0x11,0x00,0x21,0x00,0x3E,0xC0,0xC4,0x20,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x631F, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x29,0x40,0x25,0x40,0x25,0x80,0x7F,0xE0,0xA3,0x00,0x22,0x80,0x24,0x80,0x28,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x6327, {0x30,0x00,0x3F,0xE0,0x7B,0x20,0x7B,0x60,0x35,0x60,0x39,0xA0,0x3B,0x60,0x33,0x60,0x75,0xA0,0x31,0x20,0x31,0x20,0x33,0x60,0x00,0x00,}}, +{ 0x6328, {0x22,0x00,0x22,0x80,0x24,0xC0,0xFF,0x40,0x24,0x00,0x27,0xC0,0x29,0x00,0xF1,0x00,0x3F,0xE0,0x21,0x00,0x22,0x80,0x64,0x60,0x00,0x00,}}, +{ 0x632B, {0x21,0x00,0x21,0x00,0xF5,0x40,0x25,0x40,0x25,0x40,0x3B,0xA0,0x61,0x20,0xA1,0x00,0x2F,0xC0,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x632F, {0x20,0x00,0x2F,0xE0,0xF8,0x00,0x2B,0xC0,0x28,0x00,0x2F,0xE0,0x7B,0x40,0xAB,0x40,0x2A,0x80,0x32,0x80,0x33,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x633A, {0x40,0x00,0x5C,0xC0,0xE7,0x80,0x48,0x80,0x5C,0x80,0x47,0xE0,0x74,0x80,0xD4,0x80,0x4B,0xC0,0x5C,0x00,0x52,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x633D, {0x22,0x00,0x23,0x80,0xFD,0x00,0x2F,0xC0,0x29,0x40,0x39,0x40,0x6F,0xC0,0xAB,0x40,0x23,0x00,0x25,0x20,0x29,0x20,0x30,0xE0,0x00,0x00,}}, +{ 0x633E, {0x61,0x00,0x61,0x00,0xFF,0xE0,0xFF,0xE0,0x65,0x80,0x65,0xC0,0x7B,0x20,0x69,0x20,0xE3,0x80,0x62,0x80,0x64,0x40,0x78,0x20,0x00,0x00,}}, +{ 0x633F, {0x20,0x40,0x21,0x80,0xFF,0x00,0x3F,0xE0,0x21,0x00,0x2F,0xC0,0x79,0x40,0xAF,0xC0,0x29,0x40,0x2F,0xC0,0x21,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6349, {0x20,0x00,0x2F,0xC0,0xF8,0x40,0x38,0x40,0x2F,0xC0,0x21,0x00,0x39,0x00,0x69,0xC0,0xA9,0x00,0x2D,0x00,0x33,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x634C, {0x20,0x20,0x2F,0xA0,0x79,0xA0,0x29,0xA0,0x2F,0xA0,0x24,0xA0,0x34,0xA0,0x67,0xA0,0x25,0x20,0x29,0x20,0x29,0x20,0x26,0x60,0x00,0x00,}}, +{ 0x634D, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x60,0x00,0x7F,0xC0,0x61,0x00,0xEF,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x634F, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x68,0x40,0x61,0x00,0x63,0x00,0xEF,0xC0,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6350, {0x30,0x00,0x37,0xE0,0x7C,0x20,0x7F,0xE0,0x30,0x00,0x37,0xE0,0x3C,0x20,0x37,0xE0,0x77,0xE0,0x37,0xE0,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x6355, {0x21,0x80,0x21,0x40,0xFF,0xE0,0x2F,0xC0,0x29,0x40,0x39,0x40,0x6F,0xC0,0xA9,0x40,0x2F,0xC0,0x29,0x40,0x29,0x40,0x29,0xC0,0x00,0x00,}}, +{ 0x6357, {0x21,0x00,0x25,0x00,0xF5,0xC0,0x25,0x00,0x3F,0xE0,0x35,0x80,0x65,0x40,0xA9,0xA0,0x33,0xA0,0x21,0x00,0x26,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x635C, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x2F,0xC0,0x29,0x40,0x2F,0xC0,0x21,0x00,0x7F,0xC0,0xA4,0x80,0x23,0x00,0x25,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x6367, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x27,0x80,0x73,0x00,0x7F,0xE0,0x65,0x80,0xAF,0xC0,0xB1,0x20,0x27,0xC0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6368, {0x21,0x00,0x21,0x00,0xF2,0x80,0x2D,0x60,0x27,0xC0,0x31,0x00,0x6F,0xE0,0xA0,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x6369, {0x60,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x69,0x40,0x79,0x00,0xEF,0xE0,0x69,0x00,0x73,0x00,0x7C,0x80,0x70,0x60,0x00,0x00,}}, +{ 0x636B, {0x30,0x00,0x37,0xE0,0x7F,0xE0,0x7F,0xE0,0x37,0xE0,0x34,0x20,0x3C,0x20,0x34,0x20,0x74,0x20,0x34,0x20,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x636E, {0x20,0x00,0x2F,0xC0,0xF8,0x40,0x2F,0xC0,0x29,0x00,0x3F,0xE0,0x69,0x00,0xA9,0x00,0x37,0xC0,0x34,0x40,0x27,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x6372, {0x21,0x00,0x25,0x40,0xFF,0xE0,0x22,0x80,0x3F,0xE0,0x34,0x80,0x2F,0xC0,0x70,0xA0,0xA7,0x80,0x24,0x40,0x24,0x40,0x63,0xC0,0x00,0x00,}}, +{ 0x6376, {0x60,0xC0,0x6F,0x00,0xFF,0xC0,0xFF,0xC0,0x65,0x80,0x7F,0xE0,0x65,0x80,0x67,0xC0,0xEF,0xC0,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6377, {0x21,0x00,0x3F,0xE0,0xFF,0xC0,0x21,0x40,0x3F,0xE0,0x21,0x40,0x6F,0xC0,0xA1,0x00,0x25,0xC0,0x25,0x00,0x2B,0x00,0x31,0xE0,0x00,0x00,}}, +{ 0x637A, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x23,0x00,0x24,0x80,0x3F,0xC0,0x70,0x20,0xAF,0xC0,0x21,0x00,0x25,0x40,0x29,0x40,0x23,0x00,0x00,0x00,}}, +{ 0x637B, {0x21,0x00,0x23,0x00,0xF4,0x80,0x2F,0xC0,0x30,0x20,0x3F,0xC0,0x60,0x80,0xA3,0x80,0x25,0x40,0x34,0x20,0x34,0xA0,0x23,0x80,0x00,0x00,}}, +{ 0x6380, {0x63,0x00,0x65,0x00,0xF9,0x00,0xF1,0xE0,0x7F,0xA0,0x77,0xC0,0x75,0x80,0x75,0x80,0xF5,0x80,0x75,0x80,0x66,0x40,0x64,0x20,0x00,0x00,}}, +{ 0x6383, {0x20,0x00,0x27,0x80,0xF0,0x80,0x27,0x80,0x27,0x80,0x20,0x00,0x7F,0xE0,0xB1,0x00,0x2F,0xC0,0x29,0x40,0x29,0xC0,0x61,0x00,0x00,0x00,}}, +{ 0x6388, {0x20,0xC0,0x2F,0x40,0xF9,0x40,0x25,0x80,0x2F,0xE0,0x28,0x40,0x37,0x80,0x62,0x80,0xA3,0x00,0x21,0x00,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x6389, {0x61,0x00,0x61,0x00,0xF1,0xE0,0xFF,0xC0,0x68,0x40,0x6F,0xC0,0x78,0x40,0x6F,0xC0,0xEF,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x638C, {0x28,0x80,0x15,0x00,0x7F,0xE0,0x9F,0x00,0x11,0x00,0x1F,0x00,0x3F,0x00,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x638E, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF2,0x80,0x64,0x80,0x6F,0xE0,0x70,0x40,0x67,0xC0,0xE5,0xC0,0x67,0xC0,0x64,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x638F, {0x32,0x00,0x32,0x00,0x7F,0xE0,0x7E,0x20,0x33,0xA0,0x35,0x20,0x3F,0xA0,0x31,0x20,0x75,0xE0,0x37,0xE0,0x34,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x6392, {0x22,0x80,0x22,0x80,0xFE,0xE0,0x22,0x80,0x22,0x80,0x3E,0xE0,0x62,0x80,0xA2,0x80,0x3E,0xE0,0x24,0x80,0x28,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x6396, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF5,0x80,0x65,0xC0,0x69,0x40,0x79,0xC0,0x6A,0xC0,0xE9,0x80,0x69,0x80,0x6B,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x6398, {0x40,0x00,0x4F,0xE0,0xF8,0x20,0x4F,0xE0,0x48,0x80,0x6A,0xC0,0x4A,0xC0,0xCB,0xC0,0x4C,0xA0,0x54,0xA0,0x57,0xE0,0x44,0x20,0x00,0x00,}}, +{ 0x639B, {0x24,0x80,0x24,0x80,0xFE,0x80,0x24,0x80,0x3F,0xC0,0x24,0xA0,0x64,0xA0,0xBF,0x80,0x24,0x80,0x26,0x80,0x38,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x639F, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF8,0x00,0x7F,0xE0,0x61,0x00,0x79,0x00,0x69,0xC0,0xE9,0x00,0x6D,0x00,0x73,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x63A0, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2F,0xC0,0x28,0x40,0x38,0x40,0x6F,0xC0,0xA1,0x00,0x25,0x40,0x29,0x20,0x31,0x20,0x23,0x00,0x00,0x00,}}, +{ 0x63A1, {0x20,0xC0,0x2F,0x40,0xF9,0x40,0x25,0x80,0x31,0x00,0x21,0x00,0x7F,0xE0,0xA3,0x00,0x25,0x80,0x29,0x40,0x31,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x63A2, {0x20,0x00,0x2F,0xE0,0xFA,0x80,0x24,0xA0,0x28,0xE0,0x21,0x00,0x7F,0xE0,0xA3,0x80,0x25,0x40,0x39,0x20,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x63A3, {0x60,0x40,0xF9,0x40,0xF9,0x40,0xF9,0x40,0x79,0x40,0x68,0x40,0x7B,0xC0,0x1C,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x63A5, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x22,0x80,0x2F,0xE0,0x21,0x00,0x3F,0xE0,0x62,0x80,0xA6,0x80,0x21,0x80,0x22,0x40,0x6C,0x40,0x00,0x00,}}, +{ 0x63A7, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2A,0x80,0x22,0xA0,0x24,0xE0,0x38,0x00,0x6F,0xC0,0xA1,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x63A8, {0x22,0x80,0x22,0x80,0xF7,0xE0,0x2D,0x00,0x35,0x00,0x27,0xC0,0x35,0x00,0x65,0x00,0xA7,0xC0,0x25,0x00,0x27,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x63A9, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x27,0x80,0x29,0x40,0x3F,0xE0,0x69,0x40,0xAF,0xC0,0x29,0x40,0x2F,0xC0,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x63AA, {0x25,0x00,0x25,0x00,0xFF,0xC0,0x25,0x00,0x3F,0xE0,0x20,0x00,0x7F,0x80,0xA8,0x80,0x2F,0x80,0x28,0x80,0x2F,0x80,0x68,0x80,0x00,0x00,}}, +{ 0x63AB, {0x60,0x00,0x7F,0xE0,0xFA,0x00,0xFF,0xC0,0x6B,0x40,0x6B,0x40,0x7F,0xC0,0x6A,0x80,0xEE,0x80,0x7F,0xC0,0x62,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x63AC, {0x12,0x00,0x12,0x00,0x7F,0xE0,0x14,0x20,0x19,0x60,0x1D,0x60,0x37,0xA0,0x5F,0xE0,0x13,0xA0,0x17,0x60,0x19,0x20,0x11,0x40,0x00,0x00,}}, +{ 0x63B2, {0x20,0x00,0x27,0xC0,0xF4,0x40,0x27,0xC0,0x27,0xC0,0x32,0x00,0x67,0xE0,0xAC,0xA0,0x37,0x20,0x24,0x20,0x23,0xA0,0x60,0xC0,0x00,0x00,}}, +{ 0x63B4, {0x10,0x00,0x17,0xE0,0x7C,0x20,0x17,0xE0,0x14,0xA0,0x1F,0xE0,0x34,0xA0,0x54,0xE0,0x17,0xE0,0x14,0x20,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x63B5, {0x61,0x00,0x63,0x00,0xF6,0x80,0xFF,0xC0,0x70,0x20,0x6E,0xC0,0x7B,0xC0,0x6B,0xC0,0xEF,0xC0,0x6D,0xC0,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x63BB, {0x20,0x00,0x2F,0xC0,0xF2,0x80,0x23,0x80,0x3D,0x60,0x31,0x00,0x6F,0xC0,0xA9,0x40,0x2F,0xC0,0x21,0x40,0x21,0xC0,0x7E,0x20,0x00,0x00,}}, +{ 0x63BE, {0x62,0x00,0x63,0x80,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x61,0x00,0x73,0xC0,0x6F,0xC0,0xE7,0x80,0x67,0xC0,0x6D,0xA0,0x63,0x00,0x00,0x00,}}, +{ 0x63C0, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFF,0xC0,0x6F,0xC0,0x6B,0xC0,0x7B,0xC0,0x6F,0xC0,0xE7,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x63C3, {0x48,0x80,0x44,0x80,0xFF,0xE0,0x40,0x00,0x5E,0x40,0x53,0x40,0x5F,0x40,0x73,0x40,0xDF,0x40,0x52,0x40,0x52,0x40,0x56,0xC0,0x00,0x00,}}, +{ 0x63C4, {0x67,0x00,0x63,0x00,0xF6,0x80,0xFF,0xC0,0x70,0x20,0x7E,0x40,0x73,0xC0,0x7B,0xC0,0xFF,0x80,0x7F,0xC0,0x73,0xC0,0x77,0xC0,0x00,0x00,}}, +{ 0x63C6, {0x67,0x80,0x63,0xA0,0xFF,0xA0,0xF4,0xC0,0x68,0x40,0x67,0xA0,0x71,0x00,0x63,0x00,0xEF,0xC0,0x62,0x80,0x64,0x40,0x78,0x40,0x00,0x00,}}, +{ 0x63C9, {0x60,0x00,0x6F,0x80,0xF3,0x00,0xFF,0xE0,0x63,0x40,0x6D,0x80,0x73,0x00,0x73,0x00,0xFF,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x63CF, {0x24,0x80,0x24,0x80,0xFF,0xE0,0x24,0x80,0x20,0x00,0x2F,0xC0,0x29,0x40,0x69,0x40,0xAF,0xC0,0x29,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x63D0, {0x20,0x00,0x27,0x80,0xF4,0x80,0x27,0x80,0x27,0x80,0x30,0x00,0x7F,0xE0,0xA1,0x00,0x29,0xC0,0x2D,0x00,0x33,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x63D2, {0x60,0x40,0x61,0x80,0xFF,0x00,0xF1,0x00,0x7F,0xE0,0x65,0x00,0x69,0xC0,0x69,0x40,0xED,0x40,0x69,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x63D6, {0x27,0x80,0x24,0x80,0xF7,0x80,0x20,0x00,0x3F,0xE0,0x24,0x80,0x37,0x80,0x64,0x80,0xA7,0x80,0x27,0xE0,0x3C,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x63DA, {0x20,0x00,0x27,0x80,0xF4,0x80,0x27,0x80,0x27,0x80,0x30,0x00,0x7F,0xE0,0xA4,0x00,0x27,0xC0,0x25,0xC0,0x2B,0x40,0x23,0x80,0x00,0x00,}}, +{ 0x63DB, {0x22,0x00,0x23,0x80,0xFD,0x00,0x2F,0xC0,0x2B,0x40,0x3D,0xC0,0x68,0x40,0xA9,0x40,0x3F,0xE0,0x23,0x00,0x24,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x63E1, {0x20,0x00,0x2F,0xC0,0xF8,0x40,0x2F,0xC0,0x2F,0xE0,0x29,0x80,0x2A,0xC0,0xEF,0xA0,0x29,0x00,0x37,0xC0,0x31,0x00,0x6F,0xE0,0x00,0x00,}}, +{ 0x63E3, {0x61,0x00,0x69,0x40,0xF9,0x40,0xFF,0xC0,0x60,0x00,0x7F,0xE0,0x61,0x00,0x6F,0xC0,0xEB,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x63E9, {0x65,0x80,0x65,0xA0,0xF7,0xC0,0xF5,0x80,0x67,0xA0,0x79,0xE0,0x62,0x00,0x67,0xC0,0xE7,0xC0,0x67,0xC0,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x63EE, {0x20,0x00,0x2F,0xE0,0xF9,0x40,0x2F,0xC0,0x2F,0xC0,0x39,0x40,0x6F,0xC0,0xA9,0x40,0x2F,0xC0,0x3F,0xE0,0x21,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x63F4, {0x20,0x40,0x21,0x80,0xFF,0x40,0x25,0x80,0x2F,0xC0,0x22,0x00,0x7F,0xE0,0xA4,0x00,0x27,0xC0,0x2A,0x80,0x33,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x63F6, {0x60,0x00,0x7F,0xC0,0xFB,0xC0,0xFF,0xC0,0x6B,0x80,0x6B,0xC0,0x7F,0xC0,0x6B,0xA0,0xEF,0xA0,0x7F,0xE0,0x63,0x80,0x63,0x80,0x00,0x00,}}, +{ 0x63FA, {0x21,0xC0,0x2E,0x40,0xF9,0x40,0x25,0x80,0x20,0x00,0x3F,0xC0,0x61,0x00,0xBF,0xE0,0x21,0x00,0x29,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x6406, {0x63,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x7F,0xE0,0x61,0x00,0x7F,0xC0,0x7B,0x40,0xFF,0xE0,0x7F,0xE0,0x68,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x640D, {0x20,0x00,0x27,0x80,0xF4,0x80,0x27,0x80,0x2F,0xC0,0x38,0x40,0x6F,0xC0,0xA8,0x40,0x2F,0xC0,0x2F,0xC0,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x640F, {0x61,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x69,0x40,0x7F,0xC0,0x69,0x40,0xEF,0xE0,0x6F,0xE0,0x62,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x6413, {0x64,0x80,0x63,0x80,0xFF,0xC0,0xF7,0x80,0x63,0x00,0x7F,0xE0,0x64,0x00,0x67,0xC0,0xE9,0x00,0x71,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6416, {0x62,0x00,0x63,0x80,0xFF,0x80,0xFD,0x00,0x66,0x00,0x7F,0xC0,0x69,0x00,0x7F,0xE0,0xE1,0x00,0x69,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x6417, {0x61,0x00,0x62,0x00,0xF7,0xC0,0xF7,0xC0,0x64,0x40,0x67,0xC0,0x74,0x00,0x67,0xE0,0xE7,0xE0,0x6F,0xE0,0x6F,0xA0,0x68,0xC0,0x00,0x00,}}, +{ 0x641C, {0x65,0x00,0x69,0xC0,0xF9,0x40,0xF9,0x40,0x69,0x40,0x6F,0xC0,0x61,0x00,0x7F,0xC0,0xE4,0x80,0x63,0x00,0x67,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x6426, {0x30,0x00,0x37,0xE0,0x79,0x20,0x7F,0x60,0x34,0xC0,0x34,0xC0,0x3F,0x60,0x33,0x60,0x77,0xE0,0x37,0xE0,0x39,0xA0,0x36,0xC0,0x00,0x00,}}, +{ 0x6428, {0x30,0x00,0x37,0xC0,0x7F,0xC0,0x7F,0xC0,0x37,0xC0,0x30,0x00,0x3F,0xE0,0x33,0x60,0x77,0xE0,0x37,0xE0,0x39,0xA0,0x33,0x60,0x00,0x00,}}, +{ 0x642C, {0x48,0x00,0x49,0xC0,0xFF,0x40,0x5B,0x60,0x57,0x60,0x57,0x20,0x7F,0xC0,0xD3,0x40,0x5A,0xC0,0x5A,0x80,0x63,0x40,0x66,0x20,0x00,0x00,}}, +{ 0x642D, {0x24,0x80,0x24,0x80,0xFF,0xE0,0x24,0x80,0x23,0x00,0x3C,0xC0,0x77,0xA0,0xA0,0x00,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x6434, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x3F,0x80,0x0A,0x00,0x7F,0xC0,0x23,0x80,0x7C,0xC0,0x9F,0x60,0x7F,0xC0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6436, {0x61,0x00,0x63,0x00,0xF7,0x80,0xFF,0xC0,0x77,0xE0,0x64,0x80,0x77,0x80,0x64,0x80,0xE7,0x80,0x6F,0xC0,0x74,0x40,0x67,0xC0,0x00,0x00,}}, +{ 0x643A, {0x25,0x00,0x27,0xE0,0xFD,0x80,0x3F,0xC0,0x27,0xC0,0x25,0x80,0x37,0xE0,0x7F,0x80,0xA5,0xE0,0x24,0x20,0x28,0x20,0x30,0xC0,0x00,0x00,}}, +{ 0x643E, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2A,0x80,0x24,0xC0,0x34,0x00,0x67,0xE0,0xA9,0x00,0x31,0xC0,0x21,0xC0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6442, {0x20,0x00,0x2F,0xE0,0xF2,0x80,0x23,0x80,0x23,0x80,0x22,0xE0,0x7F,0x80,0xA4,0x40,0x22,0x80,0x22,0x00,0x2C,0xC0,0x70,0x20,0x00,0x00,}}, +{ 0x644E, {0x60,0x00,0x7F,0xC0,0xE6,0xC0,0xFF,0xC0,0x6B,0xC0,0x73,0x40,0x65,0x80,0x7B,0xC0,0xE7,0x60,0x66,0x40,0x63,0x80,0x6E,0x00,0x00,0x00,}}, +{ 0x6458, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x22,0x80,0x2F,0xC0,0x39,0x40,0x6F,0xC0,0xA9,0x40,0x2B,0xC0,0x2B,0xC0,0x28,0x40,0x28,0xC0,0x00,0x00,}}, +{ 0x6467, {0x61,0x00,0x69,0x40,0xFF,0xC0,0xFF,0xC0,0x62,0x80,0x67,0xE0,0x75,0x80,0x7F,0xC0,0xF7,0xC0,0x67,0xC0,0x67,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x6469, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xE0,0x69,0x80,0x7F,0x00,0x62,0x00,0x5F,0xC0,0x7F,0xE0,0x82,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x646F, {0x21,0x00,0x7B,0x00,0xFF,0x80,0xFF,0xA0,0xFF,0xA0,0x7C,0x60,0x21,0x00,0x1E,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6476, {0x61,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x69,0x40,0x7F,0xC0,0x63,0xC0,0xEF,0xC0,0x7F,0xE0,0x64,0xC0,0x62,0x80,0x00,0x00,}}, +{ 0x6478, {0x22,0x80,0x22,0x80,0xFF,0xE0,0x27,0x80,0x24,0x80,0x27,0x80,0x34,0x80,0x67,0x80,0xA1,0x00,0x2F,0xE0,0x24,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x647A, {0x10,0x00,0x1F,0xE0,0x7D,0xA0,0x17,0xE0,0x19,0xA0,0x1B,0x60,0x31,0x00,0x57,0xC0,0x14,0x40,0x17,0xC0,0x17,0xC0,0x34,0x40,0x00,0x00,}}, +{ 0x6483, {0x21,0xC0,0xFD,0x40,0x7A,0x60,0x7F,0xE0,0x79,0x40,0xFC,0x80,0x23,0x60,0x3C,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6488, {0x64,0x80,0x77,0xA0,0xEE,0xE0,0xEE,0xC0,0x73,0x20,0x6F,0xE0,0x69,0x40,0x73,0x00,0xEF,0xC0,0x62,0x40,0x64,0x40,0x68,0x80,0x00,0x00,}}, +{ 0x6492, {0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x2B,0x40,0x3F,0x40,0x21,0x40,0x6E,0xC0,0xAA,0x80,0x2E,0x80,0x2E,0x80,0x2B,0x40,0x2A,0x20,0x00,0x00,}}, +{ 0x6493, {0x61,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x7F,0xE0,0x64,0x80,0x67,0xE0,0x78,0x00,0xEF,0xC0,0x63,0x80,0x65,0xA0,0x78,0xE0,0x00,0x00,}}, +{ 0x6495, {0x6A,0x20,0x6A,0x40,0xFF,0x80,0xFF,0x80,0x6F,0xE0,0x6B,0xC0,0x7F,0xC0,0x7B,0xC0,0xFF,0xC0,0x6F,0x40,0x73,0x40,0x62,0x40,0x00,0x00,}}, +{ 0x649A, {0x48,0x80,0x48,0xC0,0xEE,0xC0,0x4B,0xE0,0x56,0x80,0x54,0x80,0x49,0x80,0x7B,0x40,0xC4,0x20,0x54,0x40,0x52,0xA0,0x62,0xA0,0x00,0x00,}}, +{ 0x649E, {0x21,0x00,0x2F,0xC0,0xF4,0x80,0x3F,0xE0,0x29,0x40,0x2F,0xC0,0x39,0x40,0x6F,0xC0,0xA1,0x00,0x27,0xC0,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x64A4, {0x24,0x80,0x24,0x80,0xFE,0x80,0x2F,0xE0,0x3F,0x40,0x21,0x40,0x7F,0x40,0xB3,0x80,0x3E,0x80,0x3E,0x80,0x33,0x40,0x36,0x20,0x00,0x00,}}, +{ 0x64A5, {0x67,0x80,0x6B,0xA0,0xF6,0xE0,0xF8,0x40,0x7D,0xE0,0x65,0x80,0x7D,0xA0,0x72,0x60,0xFF,0xC0,0x65,0xC0,0x65,0xC0,0x7B,0x20,0x00,0x00,}}, +{ 0x64A9, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFC,0xE0,0x7F,0xC0,0x64,0xA0,0x77,0x80,0x64,0x80,0xE7,0x80,0x69,0x40,0x71,0x40,0x63,0x00,0x00,0x00,}}, +{ 0x64AB, {0x24,0x00,0x24,0x00,0xFF,0xE0,0x3A,0xC0,0x2A,0xC0,0x3F,0xE0,0x6A,0xC0,0xAA,0xC0,0x3F,0xE0,0x2D,0x40,0x2A,0xA0,0x32,0xA0,0x00,0x00,}}, +{ 0x64AD, {0x20,0x80,0x2F,0x40,0xF9,0x40,0x3F,0xE0,0x23,0x80,0x35,0x80,0x69,0x40,0xBF,0xE0,0x29,0x40,0x2F,0xC0,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x64AE, {0x27,0x80,0x24,0x80,0xF7,0x80,0x24,0x80,0x27,0x80,0x3F,0xE0,0x72,0x00,0xBF,0xC0,0x3F,0x40,0x3E,0x80,0x33,0x40,0x22,0x20,0x00,0x00,}}, +{ 0x64B0, {0x20,0x00,0x2F,0xC0,0xFB,0x40,0x2F,0xC0,0x39,0x20,0x2F,0xE0,0x64,0x80,0xAF,0xC0,0x24,0x80,0x3F,0xE0,0x24,0x80,0x68,0x40,0x00,0x00,}}, +{ 0x64B2, {0x22,0x80,0x2A,0xC0,0xFF,0xE0,0x24,0x40,0x22,0x80,0x3F,0xC0,0x61,0x00,0xA7,0xC0,0x2F,0xE0,0x23,0x00,0x2C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x64B9, {0x2A,0x40,0x27,0x80,0xFF,0xE0,0x37,0xC0,0x24,0x80,0x37,0x80,0x64,0x80,0xA7,0x80,0x27,0x80,0x23,0x20,0x25,0x20,0x38,0xE0,0x00,0x00,}}, +{ 0x64BB, {0x71,0x80,0x6B,0xC0,0xEF,0xE0,0xF7,0xE0,0x6B,0xC0,0x6F,0xE0,0x61,0x80,0x7B,0xC0,0xEF,0xE0,0x6F,0xE0,0x75,0x80,0x63,0xE0,0x00,0x00,}}, +{ 0x64BC, {0x61,0xC0,0x61,0xA0,0xFF,0xE0,0xFF,0xC0,0x69,0xC0,0x6F,0x80,0x7D,0xA0,0x7F,0x60,0xFB,0x20,0x6B,0xA0,0x72,0xA0,0x61,0x80,0x00,0x00,}}, +{ 0x64C1, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x25,0x40,0x2B,0xE0,0x3B,0x40,0x65,0xE0,0xAB,0x40,0x3F,0xE0,0x25,0x40,0x29,0xE0,0x31,0x00,0x00,0x00,}}, +{ 0x64C2, {0x60,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x7D,0xC0,0x6D,0xC0,0x61,0x00,0x6F,0xC0,0xEF,0xC0,0x6F,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x64C5, {0x61,0x00,0x7F,0xE0,0xFF,0xC0,0xFB,0xC0,0x6B,0xC0,0x6F,0xC0,0x77,0x80,0x64,0x80,0xE7,0x80,0x67,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x64C7, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x61,0x00,0x7F,0xE0,0x74,0xC0,0xFF,0xE0,0x6F,0xC0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x64CD, {0x20,0x00,0x27,0x80,0xF4,0x80,0x27,0x80,0x3E,0xE0,0x32,0xA0,0x7E,0xE0,0xA1,0x00,0x3F,0xE0,0x27,0x80,0x39,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x64D2, {0x61,0x00,0x63,0x80,0xFF,0xE0,0xFF,0xE0,0x6B,0xC0,0x6E,0xC0,0x7F,0xC0,0x73,0x00,0xFF,0xE0,0x77,0xA0,0x70,0xA0,0x70,0x60,0x00,0x00,}}, +{ 0x64D4, {0x61,0x00,0x63,0x80,0xFF,0xE0,0xFF,0xE0,0x6A,0xE0,0x6D,0x80,0x7B,0xC0,0x69,0x80,0xEB,0xC0,0x7B,0xC0,0x73,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x64D8, {0x01,0x80,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0xE9,0x80,0x3B,0x00,0x1C,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x64DA, {0x61,0x00,0x63,0xC0,0xFF,0xE0,0xFF,0xC0,0x69,0xC0,0x6F,0xE0,0x79,0xC0,0x6F,0xC0,0xEF,0xC0,0x7F,0xC0,0x76,0xE0,0x61,0x80,0x00,0x00,}}, +{ 0x64E0, {0x42,0x00,0x7F,0xE0,0xFF,0xC0,0xFB,0xC0,0x6B,0xC0,0x7B,0xA0,0x48,0x80,0xCF,0x80,0xCF,0x80,0x4F,0x80,0x50,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x64E1, {0x61,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x64,0x80,0x67,0x80,0x7F,0xE0,0x77,0xC0,0xE7,0xC0,0x67,0xC0,0x67,0x80,0x7F,0xE0,0x00,0x00,}}, +{ 0x64E2, {0x20,0x00,0x3F,0xC0,0xFF,0xC0,0x3F,0xC0,0x3F,0xC0,0x35,0x80,0x6F,0xC0,0xB9,0x00,0x2F,0x80,0x2F,0x80,0x2F,0xE0,0x28,0x00,0x00,0x00,}}, +{ 0x64E3, {0x61,0x00,0x7F,0xE0,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x67,0xC0,0x71,0x00,0x77,0xC0,0xFF,0xE0,0x6F,0xE0,0x6F,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x64E6, {0x21,0x00,0x2F,0xE0,0xFF,0xC0,0x2D,0x40,0x3B,0xC0,0x26,0x80,0x6F,0xC0,0xB0,0x20,0x2F,0xC0,0x29,0x40,0x31,0x40,0x23,0x00,0x00,0x00,}}, +{ 0x64E7, {0x28,0x80,0x6E,0x80,0x6C,0x80,0x66,0x80,0x6A,0x80,0xFF,0xE0,0x23,0x80,0x7C,0xC0,0x9F,0x60,0x7F,0xC0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x64EC, {0x28,0x00,0x29,0xE0,0xFE,0xC0,0x2E,0x80,0x2B,0xE0,0x3E,0xC0,0x65,0x80,0xBF,0xE0,0x25,0x80,0x2F,0x80,0x32,0x80,0x24,0x60,0x00,0x00,}}, +{ 0x64EF, {0x61,0x00,0x6F,0xE0,0xFF,0xC0,0xFF,0xC0,0x73,0xA0,0x67,0xA0,0x7C,0x80,0x67,0x80,0xE7,0x80,0x67,0x80,0x66,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x64F1, {0x30,0x00,0x37,0xE0,0x7F,0xE0,0x7F,0xE0,0x37,0xE0,0x35,0x20,0x3D,0xE0,0x37,0xA0,0x77,0xE0,0x37,0xE0,0x35,0xE0,0x34,0x60,0x00,0x00,}}, +{ 0x64F2, {0x52,0x00,0x5F,0xC0,0xFF,0xC0,0xFF,0xC0,0x77,0x80,0x7F,0xC0,0x61,0xC0,0xFF,0xA0,0xDF,0xA0,0x5F,0xE0,0x53,0x80,0xE1,0x80,0x00,0x00,}}, +{ 0x64F4, {0x61,0x00,0x6F,0xE0,0xFF,0xE0,0xFF,0xE0,0x6F,0xE0,0x69,0x80,0x7B,0xC0,0x6B,0xC0,0xEB,0xC0,0x7B,0xC0,0x73,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x64F6, {0x71,0x80,0x7F,0xE0,0xF4,0xC0,0xE6,0xC0,0x7F,0xE0,0x60,0x00,0x7F,0xC0,0x73,0xC0,0xFF,0xC0,0x7F,0xC0,0x72,0x40,0x76,0xC0,0x00,0x00,}}, +{ 0x64FA, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x73,0xC0,0x7F,0x80,0x61,0xA0,0x7E,0xE0,0xFF,0x80,0x7F,0xC0,0x73,0xA0,0x76,0xE0,0x00,0x00,}}, +{ 0x64FD, {0x69,0x40,0x6B,0x40,0xF7,0xA0,0xFF,0xE0,0x6F,0xE0,0x77,0xA0,0x7F,0xE0,0x73,0x00,0xFF,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x64FE, {0x20,0x00,0x2F,0xE0,0xF7,0x80,0x27,0x80,0x27,0x80,0x3F,0xE0,0x7A,0xA0,0xAB,0xC0,0x37,0xA0,0x3E,0x80,0x23,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0x6500, {0x62,0x80,0x6E,0xC0,0xFF,0xE0,0x7B,0xC0,0xE6,0xE0,0x6D,0x80,0xFF,0xE0,0x17,0x00,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6505, {0x65,0x80,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6B,0x40,0x77,0xA0,0x74,0x80,0xE7,0x80,0x67,0x80,0x67,0x80,0x66,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x6518, {0x61,0x00,0x7F,0xE0,0xEF,0xC0,0xEF,0xC0,0x63,0x80,0x6F,0xC0,0x67,0x80,0x73,0x80,0xFF,0xE0,0x7F,0xC0,0x67,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x651C, {0x34,0xA0,0x37,0xE0,0x7F,0xE0,0x7F,0xE0,0x3F,0xC0,0x37,0xC0,0x34,0x80,0x3F,0xE0,0x7F,0xE0,0x3F,0xE0,0x3B,0xA0,0x3B,0xE0,0x00,0x00,}}, +{ 0x651D, {0x60,0x00,0x7F,0xE0,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x60,0x80,0x7F,0xE0,0x6B,0xC0,0xEF,0xC0,0x6F,0xE0,0x7F,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x6523, {0x6E,0x80,0xFF,0xC0,0x7E,0xE0,0xFF,0xE0,0xFF,0xC0,0xFB,0xA0,0x2F,0x00,0x3E,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6524, {0x55,0xC0,0x7F,0xC0,0xFD,0xE0,0xFF,0xE0,0x7B,0x80,0x7F,0xE0,0x49,0x80,0xFF,0xC0,0xDF,0xE0,0x5F,0x80,0x53,0xE0,0xE1,0x00,0x00,0x00,}}, +{ 0x652A, {0x67,0xC0,0x6B,0xC0,0xFF,0xC0,0xFF,0xC0,0x7F,0xE0,0x77,0xC0,0x74,0x80,0xE7,0x80,0x67,0x80,0x67,0x80,0x67,0xA0,0x79,0xE0,0x00,0x00,}}, +{ 0x652B, {0x6F,0xC0,0x6B,0xC0,0xFF,0xC0,0xFF,0xC0,0x65,0x80,0x6F,0xE0,0x7B,0x80,0x6B,0xC0,0xEF,0xE0,0x67,0x80,0x63,0x80,0x7C,0xE0,0x00,0x00,}}, +{ 0x652C, {0x41,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xE0,0x7B,0xE0,0x7F,0xE0,0x6F,0x80,0xC8,0x80,0xCF,0x80,0x4F,0xA0,0x47,0xA0,0xF8,0xE0,0x00,0x00,}}, +{ 0x652F, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x3F,0x00,0x11,0x00,0x11,0x00,0x0E,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x6534, {0x04,0x00,0x04,0x00,0x07,0xE0,0x04,0x00,0x7F,0x80,0x10,0x80,0x09,0x80,0x09,0x00,0x06,0x00,0x0E,0x00,0x31,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x6535, {0x10,0x00,0x10,0x00,0x10,0x00,0x1F,0xE0,0x31,0x80,0x31,0x80,0x49,0x00,0x0B,0x00,0x06,0x00,0x0E,0x00,0x31,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x6536, {0x12,0x00,0x12,0x00,0x57,0xE0,0x57,0xE0,0x5A,0x80,0x52,0x80,0x51,0x80,0x59,0x80,0xF1,0x80,0x93,0x80,0x14,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x6537, {0x02,0x00,0xFA,0x00,0x63,0xE0,0x67,0xE0,0x76,0x80,0x5A,0x80,0x51,0x80,0x11,0x80,0x11,0x80,0x11,0x80,0x22,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x6538, {0x22,0x00,0x32,0x00,0x33,0xE0,0x77,0xE0,0x76,0x80,0xFA,0x80,0x71,0x80,0x71,0x80,0x71,0x80,0x71,0x80,0x62,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x6539, {0x02,0x00,0xF2,0x00,0x13,0xE0,0x16,0x40,0xF4,0x40,0x9A,0x80,0x82,0x80,0x81,0x00,0x91,0x00,0xF2,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x653B, {0x02,0x00,0x02,0x00,0xFB,0xE0,0x24,0x80,0x24,0x80,0x2A,0x80,0x21,0x00,0x31,0x00,0x61,0x00,0x82,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x653E, {0x21,0x00,0x21,0x00,0xF9,0x00,0x23,0xE0,0x22,0x40,0x3E,0x40,0x2A,0x40,0x29,0x80,0x49,0x80,0x49,0x80,0x8E,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x653F, {0x02,0x00,0xFE,0x00,0x23,0xE0,0x26,0x80,0x7A,0x80,0x62,0x80,0x61,0x00,0x61,0x00,0x79,0x00,0x62,0x80,0x8C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x6545, {0x21,0x00,0x21,0x00,0xFB,0xE0,0x26,0x80,0x2A,0x80,0x22,0x80,0x79,0x00,0x49,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x6548, {0x21,0x00,0x31,0x00,0xFD,0xE0,0x6B,0xE0,0x5A,0x80,0xD6,0x80,0x31,0x80,0x31,0x80,0x39,0x80,0x29,0x80,0x42,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x654D, {0x21,0x00,0x31,0x00,0x79,0xE0,0x79,0x00,0xB7,0xC0,0x22,0x40,0xFA,0x40,0x31,0x80,0x79,0x80,0x69,0x80,0xA2,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x654F, {0x41,0x00,0x41,0x00,0x79,0x00,0x81,0xE0,0xFA,0x40,0x6A,0x40,0x6D,0x40,0xFC,0x80,0x68,0x80,0xFD,0x80,0x8E,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x6551, {0x21,0x00,0x29,0x00,0xFD,0xE0,0x22,0x00,0xAA,0x40,0x6C,0x40,0x32,0x40,0x71,0x80,0x69,0x80,0xA1,0x80,0x22,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x6555, {0x21,0x00,0x31,0x00,0xFF,0xE0,0x7B,0xE0,0x7E,0x80,0x6A,0x80,0x79,0x80,0x71,0x80,0x69,0x80,0xA1,0x80,0x22,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x6556, {0x21,0x00,0x31,0x00,0x7B,0xE0,0xFF,0xE0,0x32,0x80,0x25,0x80,0xFD,0x80,0x31,0x80,0x39,0x80,0x69,0x80,0x4A,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x6557, {0x01,0x00,0x79,0x00,0x49,0x00,0x7B,0xE0,0x4A,0x40,0x7E,0x40,0x49,0x40,0x49,0x80,0x78,0x80,0x31,0x80,0x4A,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x6558, {0x21,0x00,0x31,0x00,0x7B,0xE0,0x7B,0xE0,0xB6,0x80,0x2A,0x80,0xF9,0x80,0x31,0x80,0x79,0x80,0x69,0x80,0xA2,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x6559, {0x21,0x00,0x21,0x00,0x7D,0x00,0x23,0xE0,0xFE,0x40,0x26,0x40,0x7D,0x40,0x89,0x80,0xFD,0x80,0x11,0x80,0x16,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x655D, {0x21,0x00,0x69,0x00,0xA5,0xE0,0x27,0xE0,0xFF,0x40,0xA5,0x40,0xED,0x40,0xED,0x80,0xED,0x80,0xA5,0x80,0xA6,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x655E, {0x21,0x00,0x69,0x00,0xA5,0xE0,0x27,0xE0,0xFF,0x40,0x85,0x40,0xF5,0x40,0xF5,0x80,0xF5,0x80,0xF5,0x80,0x86,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x6562, {0x01,0x00,0x7D,0x00,0x11,0x00,0xFF,0xE0,0x4A,0x40,0x7E,0x40,0x49,0x80,0x79,0x80,0x4D,0x80,0xF9,0x80,0x0A,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x6563, {0x51,0x00,0x51,0x00,0xFD,0xE0,0x52,0x40,0xFE,0x40,0x05,0x40,0x79,0x80,0x48,0x80,0x78,0x80,0x79,0x80,0x4A,0x40,0x5C,0x20,0x00,0x00,}}, +{ 0x6566, {0x21,0x00,0x21,0x00,0xFD,0x00,0x7B,0xE0,0x4A,0x40,0x7E,0x40,0x01,0x40,0x78,0x80,0x10,0x80,0xF9,0x80,0x22,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x656C, {0x51,0x00,0x51,0x00,0xFD,0xE0,0x52,0x40,0x7A,0x40,0x4D,0x40,0xE9,0x80,0x68,0x80,0x68,0x80,0x69,0x80,0x0A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x6570, {0xA5,0x00,0x69,0x00,0xF9,0xE0,0x33,0x40,0x6A,0x40,0xA5,0x40,0x11,0x40,0xFC,0x80,0x28,0x80,0x71,0x40,0x2A,0x40,0xC4,0x20,0x00,0x00,}}, +{ 0x6572, {0x21,0x80,0x31,0x80,0xFD,0xE0,0x79,0x80,0x4B,0xC0,0x79,0x40,0x01,0x40,0xFD,0xC0,0xB4,0x80,0xF4,0x80,0xF5,0x40,0x8E,0x20,0x00,0x00,}}, +{ 0x6574, {0x21,0x00,0xFD,0x00,0x7B,0xE0,0x7F,0x40,0x71,0xC0,0x6B,0x40,0xA4,0x20,0x7F,0xC0,0x07,0x00,0x24,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6575, {0x21,0x00,0x21,0x00,0xFD,0x00,0x51,0xE0,0xFE,0x40,0xA6,0x40,0xFD,0x40,0xA5,0x40,0xF4,0x80,0xF5,0x80,0x86,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x6577, {0x29,0x00,0xFD,0x00,0x79,0x00,0x7B,0xE0,0x7A,0x40,0x6E,0x40,0x79,0x40,0x21,0x80,0xFD,0x80,0x79,0x80,0x4E,0x40,0xB8,0x20,0x00,0x00,}}, +{ 0x6578, {0x11,0x80,0x7D,0x80,0xFF,0xE0,0xFF,0xE0,0x7F,0x40,0x7D,0x40,0x55,0x80,0x7D,0x80,0xF9,0x80,0xF9,0x80,0x7A,0x40,0xE4,0x20,0x00,0x00,}}, +{ 0x6582, {0x21,0x00,0x31,0x00,0x79,0xE0,0x7F,0xE0,0x83,0x40,0xDD,0x40,0xF5,0xC0,0xFC,0x80,0x68,0x80,0x7D,0xC0,0x56,0x40,0xA4,0x20,0x00,0x00,}}, +{ 0x6583, {0xA5,0x80,0xF9,0x80,0xFF,0xE0,0xB7,0xC0,0xFD,0x80,0xAF,0x60,0x00,0x00,0xFF,0xE0,0x3A,0xC0,0xFB,0xA0,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x6587, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x11,0x00,0x11,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x6588, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x0E,0x00,0x31,0x00,0xDF,0xE0,0x02,0x00,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6589, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x0E,0x00,0x31,0x00,0xE0,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x658C, {0x20,0x80,0x2E,0xC0,0xF0,0xA0,0x2F,0xE0,0x22,0x80,0xAA,0x80,0x6B,0x80,0x6A,0x80,0x6A,0x80,0x6B,0xA0,0x5C,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x658E, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x1B,0x00,0xE1,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x36,0x80,0x75,0x80,0x8C,0x80,0x00,0x00,}}, +{ 0x6590, {0x09,0x00,0x79,0xE0,0x09,0x00,0x79,0xE0,0xF1,0xE0,0x15,0x00,0x24,0x00,0xFF,0xE0,0x12,0x00,0x0C,0x00,0x1B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x6591, {0x04,0x00,0xF5,0xE0,0x4E,0x80,0x42,0x80,0x72,0x80,0xCB,0xE0,0x44,0x80,0x44,0x80,0x4C,0x80,0xFA,0x80,0x13,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6597, {0x01,0x00,0x31,0x00,0x09,0x00,0x21,0x00,0x11,0x00,0x01,0x00,0x01,0xE0,0x1F,0x00,0xE1,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x6599, {0x20,0x80,0xAA,0x80,0x71,0x80,0x34,0x80,0xFA,0x80,0x22,0x80,0x70,0xE0,0x6B,0x80,0xAC,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x659B, {0x60,0x80,0x7A,0x80,0xF9,0x80,0xF8,0x80,0x6A,0x80,0x79,0x80,0x69,0x80,0x78,0xE0,0x7F,0x80,0x4C,0x80,0x48,0x80,0x98,0x80,0x00,0x00,}}, +{ 0x659C, {0x20,0x80,0x32,0x80,0x51,0x80,0x4C,0x80,0xFA,0x80,0x22,0x80,0xF8,0xE0,0x21,0x80,0x76,0x80,0x68,0x80,0xA0,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x659F, {0x68,0x80,0x6A,0x80,0xFD,0x80,0x78,0x80,0x6A,0x80,0x79,0x80,0x69,0x80,0xFC,0xE0,0x6F,0x80,0x6C,0x80,0x40,0x80,0x7C,0x80,0x00,0x00,}}, +{ 0x65A1, {0x21,0x80,0x21,0x80,0xFA,0x40,0x25,0x20,0x79,0x80,0x7A,0x80,0x49,0x80,0x79,0x80,0x20,0xE0,0xFF,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x65A4, {0x00,0x80,0x03,0x00,0x3C,0x00,0x20,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x65A5, {0x00,0x80,0x03,0x00,0x3C,0x00,0x20,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x27,0x00,0x41,0xC0,0x41,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x65A7, {0x11,0x00,0x31,0x80,0x4E,0x40,0x19,0x00,0xE2,0xE0,0x3C,0x00,0x20,0x00,0x3F,0xC0,0x22,0x00,0x42,0x00,0x42,0x00,0x82,0x00,0x00,0x00,}}, +{ 0x65AB, {0x00,0x40,0xFD,0x80,0x22,0x00,0x22,0x00,0x23,0xE0,0x7A,0x80,0x6A,0x80,0xEA,0x80,0xEE,0x80,0x7C,0x80,0x68,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x65AC, {0x20,0x40,0x20,0x80,0xFF,0x00,0x7A,0x00,0x6B,0xE0,0x7A,0x80,0x6A,0x80,0x7A,0x80,0x22,0x80,0xF4,0x80,0x28,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x65AD, {0x10,0x40,0x10,0x80,0xD5,0x00,0xB9,0x00,0x91,0xE0,0xFF,0x40,0xB1,0x40,0xB9,0x40,0xD6,0x40,0x96,0x40,0xFC,0x40,0x80,0x40,0x00,0x00,}}, +{ 0x65AF, {0x28,0x40,0x28,0x80,0xFD,0x00,0x29,0x00,0x39,0xE0,0x29,0x40,0x39,0x40,0x29,0x40,0xFE,0x40,0x2A,0x40,0x44,0x40,0x80,0x40,0x00,0x00,}}, +{ 0x65B0, {0x20,0x40,0x20,0x80,0xFF,0x00,0x4A,0x00,0x53,0xE0,0xFE,0x80,0x22,0x80,0xFA,0x80,0x72,0x80,0x72,0x80,0xA4,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x65B7, {0x68,0x40,0xFD,0x80,0xFD,0x00,0xFD,0x00,0xFD,0xE0,0xFD,0x80,0xED,0x80,0xF5,0x80,0xFE,0x80,0xFE,0x80,0xFC,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x65B9, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x08,0x00,0x0F,0x80,0x08,0x80,0x08,0x80,0x10,0x80,0x10,0x80,0x20,0x80,0x43,0x80,0x00,0x00,}}, +{ 0x65BC, {0x21,0x00,0x21,0x00,0xF9,0x00,0x22,0x80,0x24,0x40,0x3D,0x20,0x28,0x80,0x28,0x80,0x48,0x00,0x49,0x00,0x88,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x65BD, {0x22,0x00,0x22,0x00,0xF7,0xE0,0x49,0x00,0x45,0xC0,0x77,0x40,0x5D,0x40,0x55,0x40,0x55,0xC0,0x55,0x00,0x94,0x20,0x23,0xE0,0x00,0x00,}}, +{ 0x65C1, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x7F,0xE0,0x44,0x40,0x84,0x00,0x7F,0xC0,0x07,0x80,0x0F,0x80,0x30,0x80,0x63,0x80,0x00,0x00,}}, +{ 0x65C3, {0x62,0x00,0x62,0x00,0xF7,0xE0,0xF4,0x00,0x6B,0xC0,0x73,0xC0,0x73,0xC0,0x73,0xC0,0x57,0xE0,0x52,0x40,0x92,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x65C4, {0x62,0x00,0x62,0x00,0xF7,0xE0,0xFF,0x80,0x63,0x00,0x71,0xC0,0x77,0x00,0x71,0x00,0x5F,0xE0,0x5F,0x20,0x91,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x65C5, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x22,0x80,0x24,0xA0,0x39,0x40,0x29,0x80,0x2B,0x80,0x4D,0x80,0x49,0x40,0x89,0x20,0x31,0x00,0x00,0x00,}}, +{ 0x65C6, {0x62,0x00,0x62,0x00,0xF7,0xE0,0xF9,0x80,0x6F,0xE0,0x71,0x80,0x73,0xC0,0x73,0xC0,0x53,0xC0,0x53,0xC0,0x91,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x65CB, {0x22,0x00,0x22,0x00,0xF7,0xE0,0x24,0x00,0x2F,0xE0,0x30,0xC0,0x32,0x80,0x52,0x80,0x52,0xE0,0x52,0x80,0x95,0x80,0x28,0xE0,0x00,0x00,}}, +{ 0x65CC, {0x62,0x00,0x62,0x00,0xFF,0xE0,0xFE,0x00,0x6B,0x80,0x73,0xC0,0x73,0x80,0x75,0x80,0x53,0xC0,0x51,0x80,0x97,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x65CF, {0x22,0x00,0x22,0x00,0xFF,0xE0,0x42,0x00,0x73,0xC0,0x55,0x00,0x59,0x00,0x5F,0xE0,0x51,0x00,0x52,0x80,0x94,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x65D2, {0x62,0x00,0x62,0x00,0xFF,0xE0,0xFF,0xE0,0x63,0xC0,0x72,0xC0,0x7F,0xC0,0x70,0x80,0x55,0x80,0x55,0xA0,0x95,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x65D7, {0x22,0x00,0x22,0x00,0xF7,0xE0,0x4A,0x80,0x57,0xE0,0x72,0x80,0x53,0x80,0x53,0x80,0x5F,0xE0,0x52,0x80,0x92,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x65D9, {0x60,0xC0,0x67,0xC0,0xF5,0xC0,0xFF,0xE0,0x63,0xC0,0x73,0xC0,0x7D,0xA0,0x73,0xC0,0x53,0xC0,0x53,0xC0,0x93,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x65DB, {0x62,0x00,0x63,0xE0,0xFF,0xC0,0xFB,0xC0,0x67,0xE0,0x71,0x80,0x73,0xC0,0x7F,0xE0,0x53,0xC0,0x53,0xC0,0x93,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x65E0, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x06,0x00,0x06,0x00,0x0A,0x00,0x1A,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x65E1, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x44,0x00,0x44,0x00,0x7F,0xE0,0x46,0x00,0x06,0x00,0x0A,0x00,0x1A,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x65E2, {0x00,0x00,0x7F,0xE0,0x4A,0x80,0x7A,0x80,0x4A,0x80,0x7F,0xE0,0x49,0x80,0x71,0x80,0x59,0x80,0x6A,0xA0,0xC4,0xA0,0x08,0x60,0x00,0x00,}}, +{ 0x65E5, {0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x00,}}, +{ 0x65E6, {0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x65E7, {0x20,0x00,0x2F,0xC0,0x28,0x40,0x28,0x40,0x28,0x40,0x2F,0xC0,0x28,0x40,0x28,0x40,0x28,0x40,0x2F,0xC0,0x28,0x40,0x20,0x00,0x00,0x00,}}, +{ 0x65E8, {0x40,0x00,0x43,0x80,0x7E,0x00,0x40,0x40,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x65E9, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x65EC, {0x10,0x00,0x10,0x00,0x1F,0xE0,0x20,0x20,0x3F,0x20,0x51,0x20,0x1F,0x20,0x11,0x20,0x11,0x20,0x1F,0x20,0x00,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x65ED, {0x20,0x00,0x23,0xC0,0x22,0x40,0xFA,0x40,0x2B,0xC0,0x2A,0x40,0x2A,0x40,0x2B,0xC0,0x2A,0x40,0x48,0x20,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x65F1, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x00,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x65FA, {0x00,0x00,0xFF,0xE0,0x91,0x00,0x91,0x00,0xF1,0x00,0x9F,0xC0,0x91,0x00,0x91,0x00,0xF1,0x00,0x81,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x65FB, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x04,0x00,0xFF,0xE0,0x11,0x00,0x1A,0x00,0x0E,0x00,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x6602, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x18,0x00,0x63,0xC0,0x42,0x40,0x4A,0x40,0x7B,0xC0,0x42,0x00,0x02,0x00,0x00,0x00,}}, +{ 0x6603, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x00,0x00,0x7F,0xE0,0x62,0x00,0x66,0x00,0x47,0x00,0x59,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x6606, {0x00,0x00,0x7F,0x80,0x40,0x80,0x7F,0x80,0x40,0x80,0x7F,0x80,0x42,0x00,0x4E,0xC0,0x73,0x00,0x42,0x20,0x7A,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x6607, {0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x04,0x80,0x38,0x80,0x08,0x80,0xFF,0xF0,0x08,0x80,0x10,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x660A, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x660C, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x660E, {0x00,0x00,0x79,0xE0,0x49,0x20,0x49,0x20,0x79,0xE0,0x49,0x20,0x49,0x20,0x49,0x20,0x79,0xE0,0x42,0x20,0x04,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x660F, {0x01,0x80,0x3E,0x00,0x22,0x00,0x3F,0xE0,0x3D,0x00,0xE0,0xE0,0x3F,0xA0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6613, {0x00,0x00,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x0F,0xE0,0x32,0xA0,0x4D,0x20,0x32,0x20,0x0C,0x40,0x01,0x80,0x00,0x00,}}, +{ 0x6614, {0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x661C, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x30,0x00,0x3F,0xC0,0x49,0x40,0x12,0x40,0x24,0x80,0x00,0x00,}}, +{ 0x661F, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x40,0x80,0x7F,0x80,0x04,0x00,0x24,0x00,0x7F,0xC0,0x84,0x00,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x6620, {0x01,0x00,0x01,0x00,0xEF,0xC0,0xA9,0x40,0xA9,0x40,0xE9,0x40,0xBF,0xE0,0xA3,0x00,0xE2,0x80,0xA4,0x80,0x08,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x6625, {0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x0A,0x00,0xFF,0xE0,0x11,0x00,0x7F,0x80,0x9F,0x60,0x11,0x00,0x1F,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x6627, {0x01,0x00,0x01,0x00,0xE7,0xC0,0xA1,0x00,0xA1,0x00,0xFF,0xE0,0xA1,0x00,0xA3,0x80,0xE5,0x40,0xB9,0x20,0xA1,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x6628, {0x04,0x00,0x04,0x00,0xE7,0xE0,0xA9,0x00,0xA9,0x00,0xF1,0xE0,0xA1,0x00,0xA1,0x00,0xE1,0xE0,0x81,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x662D, {0x00,0x00,0x07,0xE0,0x71,0x20,0x51,0x20,0x52,0x20,0x72,0x40,0x54,0x00,0x53,0xE0,0x72,0x20,0x52,0x20,0x43,0xE0,0x02,0x20,0x00,0x00,}}, +{ 0x662F, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x24,0x00,0x27,0x80,0x34,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x6634, {0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x04,0x00,0x39,0xE0,0x25,0x20,0x2D,0x20,0x7D,0xE0,0x09,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x6635, {0x00,0x00,0x0F,0xC0,0xE8,0x40,0xAF,0xC0,0xA8,0x40,0xEA,0x00,0xAA,0x40,0xAA,0x80,0xEB,0x00,0xFA,0x20,0x92,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x6636, {0x00,0x00,0xF9,0xC0,0x71,0x40,0x75,0xC0,0x15,0x40,0xF9,0x40,0x39,0x40,0x35,0xC0,0x76,0x40,0x53,0x00,0x90,0xE0,0x30,0x00,0x00,0x00,}}, +{ 0x663C, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x21,0x00,0x3F,0x00,0x51,0x80,0x5F,0x40,0x91,0x20,0x1F,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x663F, {0x01,0x00,0x01,0x00,0xE7,0xE0,0xAF,0xE0,0xA8,0x00,0xE9,0x80,0xA9,0x00,0xA9,0x00,0xEA,0x40,0xFA,0x40,0x1F,0xA0,0x20,0x20,0x00,0x00,}}, +{ 0x6641, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x0A,0x80,0x2A,0x80,0x2B,0x80,0x3A,0x80,0xF2,0xA0,0x32,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x6642, {0x01,0x00,0x01,0x00,0xEF,0xC0,0xA1,0x00,0xBF,0xE0,0xE0,0x80,0xA0,0x80,0xBF,0xE0,0xE4,0x80,0xA2,0x80,0x80,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x6643, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x15,0x00,0xFF,0xE0,0x0A,0x00,0x12,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x6644, {0x01,0x00,0x01,0x00,0xE9,0x40,0xA5,0x40,0xA1,0x00,0xFF,0xE0,0xA3,0x80,0xA3,0x80,0xE7,0x80,0xE5,0xA0,0x09,0xA0,0x10,0xE0,0x00,0x00,}}, +{ 0x6649, {0x00,0x00,0x7F,0xC0,0x31,0x80,0x7B,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x664B, {0x00,0x00,0x7F,0xC0,0x4A,0x40,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x664F, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x04,0x00,0x7F,0xE0,0xC8,0x40,0xFF,0xC0,0x1E,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x6652, {0x00,0x00,0x1F,0xE0,0xE2,0x80,0xAF,0xC0,0xAA,0xC0,0xEA,0xC0,0xAA,0xC0,0xAA,0xC0,0xEC,0xC0,0xA8,0x40,0x8F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x665D, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,}}, +{ 0x665E, {0x00,0x40,0x07,0x80,0xE7,0xC0,0xA6,0x00,0xBF,0xE0,0xE5,0x00,0xAF,0xC0,0xB9,0x40,0xE9,0x40,0xE9,0x40,0x09,0xC0,0x01,0x00,0x00,0x00,}}, +{ 0x665F, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x02,0x40,0x7F,0xE0,0x42,0x00,0x79,0x40,0x51,0xA0,0x73,0xA0,0x8C,0x60,0x00,0x00,}}, +{ 0x6662, {0x20,0xC0,0x33,0x00,0xFF,0xE0,0x3B,0xE0,0xF2,0x80,0x24,0x80,0x68,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x6664, {0x00,0x00,0x1F,0xE0,0xE1,0x00,0xAF,0x80,0xA2,0x80,0xE2,0x80,0xBF,0xE0,0xA0,0x00,0xE7,0xC0,0xE4,0x40,0x07,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x6666, {0x04,0x00,0x04,0x00,0xE7,0xE0,0xAF,0xC0,0xB5,0x40,0xE5,0x40,0xBF,0xE0,0xAA,0x40,0xAF,0xC0,0xE8,0xE0,0x80,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x6667, {0x01,0x00,0x05,0x00,0xE7,0xC0,0xAF,0xC0,0xB1,0x00,0xFF,0xE0,0xA1,0x00,0xAF,0x80,0xE8,0x80,0xE8,0x80,0x0F,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x6668, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x7F,0xE0,0x7F,0xE0,0x5B,0x80,0xF0,0xE0,0x00,0x00,}}, +{ 0x6669, {0x02,0x00,0x03,0x80,0xE5,0x00,0xBF,0xC0,0xA9,0x40,0xE9,0x40,0xAF,0xC0,0xAB,0x40,0xE3,0x00,0xA5,0x20,0x89,0x20,0x10,0xE0,0x00,0x00,}}, +{ 0x666E, {0x21,0x00,0x12,0x00,0x7F,0xC0,0x4A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x666F, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x15,0x00,0x24,0x80,0x4C,0x40,0x00,0x00,}}, +{ 0x6670, {0x04,0x20,0x04,0x40,0xFF,0x80,0xBF,0x80,0xA7,0xE0,0xED,0xC0,0xAD,0xC0,0xBD,0xC0,0xF5,0x40,0xF5,0x40,0x06,0x40,0x04,0x40,0x00,0x00,}}, +{ 0x6674, {0x01,0x00,0x0F,0xC0,0xE1,0x00,0xA7,0x80,0xBF,0xE0,0xE0,0x00,0xA7,0x80,0xA4,0x80,0xE7,0x80,0xA7,0x80,0x84,0x80,0x05,0x80,0x00,0x00,}}, +{ 0x6676, {0x00,0x00,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x00,0x00,0x79,0xE0,0x49,0x20,0x79,0xE0,0x49,0x20,0x79,0xE0,0x00,0x00,}}, +{ 0x667A, {0x20,0x00,0x20,0x00,0x3F,0xE0,0x51,0x20,0x3D,0x20,0x19,0xE0,0x25,0x20,0x5F,0xC0,0x10,0x40,0x1F,0xC0,0x1F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x6681, {0x01,0x00,0x01,0x00,0xEF,0xC0,0xA5,0x80,0xBF,0xE0,0xE4,0x80,0xA4,0x80,0xBF,0xE0,0xE2,0x80,0xA4,0xA0,0x88,0xA0,0x30,0x60,0x00,0x00,}}, +{ 0x6683, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x0A,0x00,0xFB,0xE0,0x0A,0x00,0x7B,0xC0,0x1B,0xE0,0xF2,0x00,0x22,0x00,0x00,0x00,}}, +{ 0x6684, {0x01,0x00,0x03,0x00,0xEF,0xE0,0xBF,0xC0,0xB0,0x00,0xE7,0x80,0xA4,0x80,0xA7,0x80,0xE7,0x80,0xE7,0x80,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6687, {0x00,0x00,0x1E,0xC0,0xD2,0x40,0xDE,0xC0,0xD2,0x40,0xD0,0x00,0xDD,0xC0,0xD1,0x40,0xDD,0xC0,0xD0,0x80,0x90,0xC0,0x13,0x20,0x00,0x00,}}, +{ 0x6688, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x44,0x40,0xFF,0xC0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6689, {0x00,0x00,0x0F,0xE0,0xFF,0xC0,0xBF,0xC0,0xAF,0xC0,0xE9,0x40,0xAF,0xC0,0xAB,0x40,0xEF,0xC0,0xFF,0xE0,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x668E, {0x04,0x80,0x04,0xC0,0xFF,0xE0,0xA1,0x00,0xAF,0xC0,0xE9,0x40,0xA9,0x40,0xBB,0x40,0xFF,0xE0,0xE3,0x00,0x0C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x6691, {0x7F,0x80,0x40,0x80,0x7F,0x80,0x7F,0x80,0x04,0x40,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x3F,0x80,0xD0,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x6696, {0x00,0xE0,0x1F,0x20,0xE9,0x40,0xAF,0xC0,0xA2,0x00,0xFF,0xE0,0xA2,0x00,0xA7,0x80,0xE4,0x80,0xAB,0x00,0x12,0x80,0x0C,0x60,0x00,0x00,}}, +{ 0x6697, {0x02,0x00,0x02,0x00,0xEF,0xC0,0xA4,0x80,0xBF,0xE0,0xE0,0x00,0xA7,0x80,0xA4,0x80,0xE7,0x80,0xA4,0x80,0x87,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x6698, {0x00,0x00,0x07,0x80,0xE7,0x80,0xA7,0x80,0xA7,0x80,0xE0,0x00,0xBF,0xE0,0xA4,0x00,0xFF,0xC0,0xF5,0xC0,0x09,0x40,0x03,0x80,0x00,0x00,}}, +{ 0x669D, {0x00,0x00,0x0F,0xE0,0xFF,0xC0,0xB7,0x80,0xA7,0x80,0xE4,0x80,0xA7,0x80,0xB3,0x00,0xFF,0xE0,0xE2,0x00,0x04,0x40,0x18,0x40,0x00,0x00,}}, +{ 0x66A2, {0x20,0x00,0x27,0x80,0xF4,0x80,0xB7,0x80,0xB7,0x80,0xB0,0x00,0xBF,0xE0,0xB4,0x00,0xAF,0xC0,0x25,0xC0,0x29,0x40,0x23,0x80,0x00,0x00,}}, +{ 0x66A6, {0x00,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,0x5D,0xC0,0x6A,0xA0,0x48,0x80,0x5F,0x80,0x50,0x80,0x9F,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x66AB, {0x20,0xC0,0xFF,0x00,0x7A,0x00,0x7B,0xE0,0x7A,0x80,0xFE,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x66AE, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x1F,0x00,0x71,0xC0,0x9F,0x20,0x1F,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x66B4, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x35,0x80,0xDF,0x60,0x75,0xC0,0x0C,0x00,0x00,0x00,}}, +{ 0x66B8, {0x01,0x00,0x1F,0xE0,0xEF,0xC0,0xAC,0xC0,0xB7,0xE0,0xE4,0x80,0xA7,0x80,0xA4,0x80,0xE7,0x80,0xE9,0x40,0x11,0x40,0x03,0x00,0x00,0x00,}}, +{ 0x66B9, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x4F,0xC0,0x64,0xC0,0x07,0xE0,0xED,0x80,0x77,0xC0,0x67,0xC0,0x67,0xE0,0x5C,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x66BC, {0x21,0x00,0xE9,0x00,0xFF,0xE0,0xFF,0x40,0xB5,0xC0,0xED,0x80,0xA7,0x40,0x7F,0xA0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x66BE, {0x05,0x80,0x05,0x80,0xFF,0xE0,0xAF,0xE0,0xAB,0x40,0xEF,0xC0,0xA1,0xC0,0xBF,0x80,0xE6,0xC0,0xFC,0xC0,0x05,0x20,0x0E,0x20,0x00,0x00,}}, +{ 0x66C1, {0x20,0x00,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x5B,0xA0,0x64,0x60,0x3F,0x80,0x11,0x80,0x1F,0x80,0x1F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x66C4, {0x04,0x80,0x1F,0xE0,0xE7,0xC0,0xA7,0xC0,0xA5,0x80,0xFF,0xE0,0xA5,0x80,0xA7,0xC0,0xEF,0xC0,0xFF,0xE0,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x66C7, {0x3F,0x80,0x20,0x80,0x3F,0x80,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0x75,0xC0,0xB7,0x80,0x3F,0x80,0xFF,0xE0,0x13,0x80,0x7E,0x80,0x00,0x00,}}, +{ 0x66C9, {0x01,0x00,0x0F,0xC0,0xFF,0xE0,0xBF,0xE0,0xBE,0xE0,0xE4,0x80,0xA6,0xE0,0xB8,0x00,0xEF,0xC0,0xE3,0xA0,0x05,0xA0,0x18,0xE0,0x00,0x00,}}, +{ 0x66D6, {0x00,0xC0,0x0F,0x40,0xE8,0x40,0xAF,0xE0,0xAB,0xC0,0xF6,0xC0,0xA7,0xA0,0xAB,0x00,0xE7,0xC0,0xE7,0x80,0x03,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0x66D9, {0x0F,0xC0,0x0B,0x40,0xEF,0xC0,0xA1,0x20,0xAF,0xC0,0xE1,0x80,0xBF,0xE0,0xA7,0xC0,0xEB,0xC0,0xB2,0x40,0x83,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x66DA, {0x04,0x80,0x1F,0xE0,0xE7,0xE0,0xAF,0xE0,0xB0,0x00,0xFF,0xE0,0xA3,0x40,0xBF,0xC0,0xE7,0x80,0xE7,0xC0,0x1D,0xA0,0x03,0x00,0x00,0x00,}}, +{ 0x66DC, {0x00,0x00,0x0F,0xE0,0x75,0xA0,0x53,0x60,0x5D,0xA0,0x72,0xC0,0x57,0xE0,0x5C,0x80,0x77,0xC0,0x57,0xC0,0x44,0x80,0x07,0xE0,0x00,0x00,}}, +{ 0x66DD, {0x00,0x00,0xE7,0x80,0xA7,0x80,0xA7,0x80,0xE2,0x80,0xAF,0xC0,0xA2,0x80,0xBF,0xE0,0xE5,0xC0,0xFF,0xE0,0x8F,0xC0,0x03,0x00,0x00,0x00,}}, +{ 0x66E0, {0x01,0x00,0x0F,0xE0,0xEF,0xE0,0xAF,0xE0,0xAF,0xE0,0xE9,0x80,0xAB,0xC0,0xAB,0xC0,0xFB,0xC0,0xF3,0xC0,0x33,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x66E6, {0x02,0x80,0x0F,0xC0,0xE7,0x80,0xBF,0xE0,0xBF,0xC0,0xE5,0xA0,0xBF,0xE0,0xBF,0xC0,0xFF,0xC0,0xFF,0xA0,0x13,0x60,0x06,0x20,0x00,0x00,}}, +{ 0x66E9, {0x7F,0x80,0x7F,0x80,0x3F,0x80,0xFF,0xE0,0x7B,0xC0,0x6A,0x80,0x7B,0x80,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0xFF,0x80,0x70,0xE0,0x00,0x00,}}, +{ 0x66F0, {0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x66F2, {0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x51,0x40,0x51,0x40,0x7F,0xC0,0x51,0x40,0x51,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,}}, +{ 0x66F3, {0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0xC0,0x04,0x80,0x03,0x00,0x0F,0x20,0x71,0xA0,0x00,0x60,0x00,0x00,}}, +{ 0x66F4, {0x00,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x1C,0x00,0x0E,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x66F5, {0x04,0x80,0x04,0x80,0x7F,0x80,0x7E,0x80,0x64,0x80,0x64,0x80,0x7F,0xC0,0x04,0x80,0x03,0x00,0x0F,0x20,0x71,0xA0,0x00,0x60,0x00,0x00,}}, +{ 0x66F7, {0x00,0x00,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x34,0x00,0x0F,0xE0,0x32,0x20,0x73,0x20,0x3C,0x20,0x3F,0xA0,0x30,0xC0,0x00,0x00,}}, +{ 0x66F8, {0x04,0x00,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x3F,0x80,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x66F9, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x66FC, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x1F,0x00,0x06,0x00,0x0F,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0x66FD, {0x21,0x00,0x12,0x00,0x7F,0xC0,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x66FE, {0x17,0x00,0x20,0x80,0x7F,0xC0,0xF5,0xE0,0x6E,0xC0,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x66FF, {0x20,0x80,0x20,0x80,0x7B,0xC0,0xFF,0xE0,0x31,0x80,0x31,0x40,0x4A,0x40,0xBF,0xA0,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6700, {0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x78,0x00,0x7B,0xC0,0x49,0x40,0x79,0x80,0xCE,0x40,0x08,0x20,0x00,0x00,}}, +{ 0x6703, {0x04,0x00,0x0A,0x00,0x3F,0x80,0xFF,0xE0,0x7F,0xC0,0x65,0x80,0x75,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x6708, {0x00,0x00,0x1F,0xC0,0x10,0x40,0x10,0x40,0x1F,0xC0,0x10,0x40,0x10,0x40,0x1F,0xC0,0x10,0x40,0x10,0x40,0x20,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x6709, {0x08,0x00,0x08,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30,0x80,0x5F,0x80,0x50,0x80,0x9F,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x670B, {0x00,0x00,0x1C,0xE0,0x14,0xA0,0x14,0xA0,0x1C,0xE0,0x14,0xA0,0x14,0xA0,0x1C,0xE0,0x15,0x20,0x25,0x20,0x26,0x20,0x4C,0x60,0x00,0x00,}}, +{ 0x670D, {0x00,0x00,0x77,0xC0,0x54,0x40,0x54,0xC0,0x74,0x00,0x57,0xC0,0x56,0x40,0x75,0x40,0x55,0x80,0x55,0x80,0x56,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x670F, {0x01,0x80,0x75,0xA0,0x55,0xA0,0x55,0xA0,0x77,0xE0,0x55,0xA0,0x51,0x80,0x75,0xA0,0x55,0xA0,0x55,0xA0,0x57,0xE0,0xB4,0x20,0x00,0x00,}}, +{ 0x6714, {0x24,0x00,0x15,0xE0,0x7F,0x20,0x11,0x20,0x35,0xE0,0x35,0x20,0x35,0x20,0x3D,0xE0,0x35,0x20,0x11,0x20,0x12,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x6715, {0x08,0x40,0x74,0x40,0x52,0x80,0x7F,0xC0,0x51,0x00,0x51,0x00,0x7F,0xE0,0x51,0x00,0x52,0x80,0x54,0x80,0x58,0x40,0xB0,0x20,0x00,0x00,}}, +{ 0x6716, {0x01,0x00,0x73,0x00,0x57,0x80,0x54,0x80,0x77,0x80,0x54,0x80,0x57,0x80,0x75,0x40,0x55,0xC0,0x54,0x80,0x57,0x40,0xBC,0x20,0x00,0x00,}}, +{ 0x6717, {0x10,0x00,0x11,0xE0,0x3D,0x20,0x25,0x20,0x3D,0xE0,0x25,0x20,0x3D,0x20,0x39,0xE0,0x2D,0x20,0x32,0x20,0x64,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x671B, {0x20,0x00,0x23,0xC0,0xFE,0x40,0x43,0xC0,0x43,0xC0,0x3A,0x40,0x04,0x80,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x671D, {0x10,0x00,0x11,0xE0,0x7F,0x20,0x3D,0x20,0x25,0xE0,0x3D,0x20,0x25,0x20,0x3D,0xE0,0x11,0x20,0x7F,0x20,0x12,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x671E, {0x11,0x00,0x7F,0xC0,0x1F,0x00,0x1F,0x00,0x13,0x00,0xFF,0xE0,0x21,0x80,0x5F,0xC0,0x9F,0x60,0x1F,0x00,0x33,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x671F, {0x14,0x00,0x14,0xE0,0x7F,0xA0,0x14,0xE0,0x1C,0xA0,0x14,0xA0,0x1C,0xE0,0x14,0xA0,0x7F,0xA0,0x15,0x20,0x25,0x20,0x42,0x60,0x00,0x00,}}, +{ 0x6726, {0x02,0x80,0x7F,0xE0,0x57,0xE0,0x57,0xE0,0x7B,0xC0,0x5F,0xE0,0x53,0x40,0x7F,0xC0,0x5F,0x80,0x5F,0xC0,0x5D,0xA0,0xB3,0x00,0x00,0x00,}}, +{ 0x6727, {0x05,0x80,0x75,0xE0,0x7F,0xC0,0x6A,0xC0,0x7F,0xC0,0x61,0x80,0x6F,0xC0,0x6B,0x80,0x6F,0xC0,0x6F,0xE0,0x6B,0xA0,0xEA,0xE0,0x00,0x00,}}, +{ 0x6728, {0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0x44,0x40,0x84,0x20,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x672A, {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x15,0x00,0x64,0xC0,0x84,0x20,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x672B, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x672C, {0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x15,0x00,0x15,0x00,0x24,0x80,0x44,0x40,0x9F,0x20,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x672D, {0x21,0x00,0x21,0x00,0xF9,0x00,0x21,0x00,0x21,0x00,0x71,0x00,0x69,0x00,0x65,0x00,0xA5,0x00,0x21,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x672E, {0x04,0x80,0x04,0x40,0xFF,0xE0,0xFF,0xE0,0x24,0x00,0x25,0x80,0x25,0x80,0x25,0x80,0x25,0x80,0x65,0xA0,0x44,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6731, {0x04,0x00,0x24,0x00,0x3F,0x80,0x24,0x00,0x44,0x00,0xFF,0xE0,0x0E,0x00,0x15,0x00,0x64,0xC0,0x84,0x20,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x6734, {0x21,0x00,0x21,0x00,0xF9,0x00,0x21,0x00,0x21,0x80,0x71,0x40,0x69,0x20,0x69,0x20,0xA1,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6736, {0x00,0x00,0x7F,0x00,0x11,0xC0,0x11,0xC0,0x20,0x40,0x45,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6737, {0x10,0x00,0x17,0xE0,0x7D,0x20,0x7D,0x20,0x19,0x20,0x35,0x20,0x35,0x20,0x31,0x20,0x53,0x20,0x12,0x20,0x14,0x20,0x18,0x40,0x00,0x00,}}, +{ 0x6738, {0x10,0x80,0x10,0x80,0x7F,0xE0,0x7F,0xE0,0x18,0xA0,0x34,0xA0,0x34,0xA0,0x30,0xA0,0x51,0x20,0x11,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x673A, {0x20,0x00,0x23,0x80,0xFA,0x80,0x22,0x80,0x32,0x80,0x6A,0x80,0x6A,0x80,0x62,0x80,0xA6,0x80,0x24,0xA0,0x28,0xA0,0x30,0x60,0x00,0x00,}}, +{ 0x673D, {0x20,0x00,0x27,0xE0,0xF9,0x00,0x21,0x00,0x33,0xC0,0x6A,0x40,0x6A,0x40,0x64,0x40,0xA0,0x40,0x20,0x40,0x20,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x673F, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0x07,0x00,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6741, {0x27,0x00,0x21,0x00,0xF9,0x00,0xF9,0x00,0x31,0x00,0x29,0x00,0x6B,0x80,0x63,0x80,0x66,0x80,0xA4,0x80,0x28,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x6746, {0x20,0x00,0x27,0xC0,0xF9,0x80,0xF9,0x80,0x31,0x80,0x6F,0xE0,0x69,0x80,0x61,0x80,0xA1,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x6749, {0x20,0x80,0x20,0x80,0xF9,0x00,0x26,0x40,0x30,0x40,0x68,0x80,0x69,0x00,0x62,0x20,0xA0,0x20,0x20,0x40,0x21,0x80,0x26,0x00,0x00,0x00,}}, +{ 0x674E, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x3F,0x00,0x02,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x674F, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6750, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x20,0x80,0x30,0x80,0x69,0x80,0x69,0x80,0x62,0x80,0xA4,0x80,0x20,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x6751, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x20,0x80,0x20,0x80,0x72,0x80,0x69,0x80,0x69,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6753, {0x11,0x00,0x11,0x00,0x7F,0xE0,0x12,0x20,0x14,0x20,0x39,0x20,0x34,0xA0,0x34,0xA0,0x50,0x20,0x10,0x20,0x10,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x6756, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x20,0x80,0x30,0x80,0x68,0x80,0x6A,0x80,0x62,0x80,0xA1,0x00,0x21,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x6759, {0x21,0x80,0x21,0x40,0xF9,0x40,0xF9,0xE0,0x37,0x00,0x69,0x00,0x69,0x80,0x61,0x80,0xA0,0x80,0x20,0xA0,0x20,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x675C, {0x21,0x00,0x21,0x00,0xF9,0x00,0x21,0x00,0x27,0xE0,0x71,0x00,0x69,0x00,0x69,0x00,0xA1,0x00,0x21,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x675E, {0x20,0x00,0x27,0xC0,0xF8,0x40,0xF8,0x40,0x30,0x40,0x6F,0xC0,0x6C,0x40,0x64,0x00,0xA4,0x00,0x24,0x20,0x24,0x20,0x23,0xE0,0x00,0x00,}}, +{ 0x675F, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x0E,0x80,0x0D,0x00,0x34,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6760, {0x20,0x00,0x27,0xE0,0xF9,0x80,0xF9,0x80,0x31,0x80,0x69,0x80,0x69,0x80,0x61,0x80,0xA1,0x80,0x21,0x80,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6761, {0x08,0x00,0x08,0x00,0x1F,0x00,0x6A,0x00,0x0E,0x00,0x35,0x00,0xC4,0xE0,0x3F,0x80,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6762, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6763, {0x30,0x80,0x30,0x80,0x7C,0x80,0x7C,0xA0,0x34,0xA0,0x3C,0xA0,0x3C,0xA0,0x74,0xA0,0x74,0xA0,0x37,0xE0,0x34,0x20,0x34,0x20,0x00,0x00,}}, +{ 0x6764, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0xF9,0x00,0x31,0xC0,0x69,0x40,0x69,0x40,0x62,0x40,0xA6,0x40,0x24,0x40,0x28,0x40,0x30,0x80,0x00,0x00,}}, +{ 0x6765, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x15,0x80,0x15,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x676A, {0x21,0x80,0x21,0x80,0xF9,0x80,0xFB,0xC0,0x33,0xA0,0x6D,0xE0,0x69,0xC0,0x61,0x80,0xA0,0x80,0x21,0x00,0x26,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x676D, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x20,0x00,0x33,0x80,0x6A,0x80,0x6A,0x80,0x62,0x80,0xA2,0x80,0x24,0xA0,0x24,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x676F, {0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x31,0x80,0x69,0xC0,0x6A,0xC0,0x62,0xA0,0xA4,0xA0,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6770, {0x04,0x00,0x04,0x00,0xFF,0xE0,0xFF,0xE0,0x17,0x00,0x25,0x00,0x44,0x80,0xC4,0x60,0x04,0x00,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x6771, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6772, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6773, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1E,0x00,0x35,0x80,0xC4,0x60,0x3F,0x80,0x31,0x80,0x3F,0x80,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x6775, {0x22,0x00,0x22,0x00,0xF7,0xE0,0x25,0x00,0x29,0x00,0x71,0x00,0x6F,0xE0,0x69,0x00,0xA1,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6777, {0x20,0x00,0x27,0xC0,0xFD,0x40,0x25,0x40,0x25,0x40,0x77,0xC0,0x6C,0x40,0x6C,0x00,0xA4,0x00,0x24,0x20,0x24,0x20,0x23,0xE0,0x00,0x00,}}, +{ 0x677C, {0x20,0x00,0x27,0xC0,0xF9,0x80,0xF9,0x80,0x3F,0xE0,0x69,0xA0,0x69,0xC0,0x61,0x80,0xA1,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x677E, {0x21,0x80,0x20,0x80,0xFA,0x80,0x22,0x80,0x34,0x40,0x6D,0x40,0x69,0x20,0x62,0x00,0xA2,0x80,0x24,0x40,0x3F,0xA0,0x20,0x20,0x00,0x00,}}, +{ 0x677F, {0x20,0x00,0x27,0xE0,0xFC,0x00,0x27,0xC0,0x24,0x40,0x76,0x40,0x6E,0x80,0x6D,0x80,0xA5,0x80,0x29,0x80,0x2A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x6785, {0x20,0x00,0x2F,0xC0,0xFA,0x80,0xFA,0x80,0x32,0x80,0x6F,0xE0,0x6A,0x80,0x62,0x80,0xA6,0x80,0x24,0x80,0x28,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x6787, {0x24,0x80,0x24,0x80,0xFC,0x80,0x24,0xA0,0x27,0xC0,0x74,0x80,0x6C,0x80,0x6C,0x80,0xA4,0x80,0x24,0xA0,0x27,0xA0,0x38,0xE0,0x00,0x00,}}, +{ 0x6789, {0x20,0x00,0x27,0xE0,0xF9,0x80,0xF9,0x80,0x31,0x80,0x6F,0xE0,0x69,0x80,0x61,0x80,0xA1,0x80,0x21,0x80,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x678B, {0x21,0x00,0x21,0x00,0xFF,0xE0,0xFF,0xE0,0x31,0x00,0x69,0xC0,0x69,0x40,0x61,0x40,0xA2,0x40,0x22,0x40,0x24,0x40,0x28,0x80,0x00,0x00,}}, +{ 0x678C, {0x67,0x80,0x63,0x80,0xF6,0x80,0xF4,0x80,0x68,0x40,0x7F,0xA0,0x72,0x80,0xE2,0x80,0xE6,0x80,0x64,0x80,0x68,0x80,0x71,0x80,0x00,0x00,}}, +{ 0x6790, {0x20,0x40,0x21,0x80,0xFA,0x00,0x22,0x00,0x23,0xE0,0x72,0x80,0x6A,0x80,0x6A,0x80,0xA6,0x80,0x24,0x80,0x28,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x6795, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x29,0x40,0x21,0x00,0x71,0x00,0x69,0x00,0x6B,0x00,0xA3,0x00,0x25,0x20,0x29,0x20,0x30,0xE0,0x00,0x00,}}, +{ 0x6797, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x31,0x00,0x2B,0x80,0x6B,0x80,0x65,0x40,0xA9,0x20,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x679A, {0x22,0x00,0x22,0x00,0xFF,0xE0,0x24,0x40,0x2A,0x40,0x72,0x80,0x69,0x80,0x69,0x00,0xA1,0x00,0x22,0x80,0x2C,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x679C, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x679D, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x31,0x00,0x6F,0xC0,0x64,0x40,0x62,0x80,0xA3,0x00,0x21,0x00,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x67A0, {0x21,0x00,0x21,0x00,0xFF,0x80,0x21,0x80,0x32,0xA0,0x6D,0xA0,0x69,0x60,0xA1,0x00,0xAF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x67A1, {0x61,0x80,0x62,0x80,0xFE,0x80,0xF2,0x80,0x62,0x80,0x7F,0xE0,0x72,0x80,0xE2,0x80,0xE6,0x80,0x64,0x80,0x68,0x80,0x70,0x80,0x00,0x00,}}, +{ 0x67A2, {0x20,0x00,0x27,0xE0,0xFC,0x00,0x24,0x40,0x25,0x40,0x75,0x80,0x6C,0x80,0x6D,0xC0,0xA6,0x40,0x24,0x00,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x67A6, {0x20,0x00,0x2F,0xE0,0xFF,0xC0,0xFF,0xC0,0x34,0x40,0x6C,0x40,0x6F,0xC0,0x64,0x40,0xA4,0x00,0x28,0x00,0x28,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x67A9, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1E,0x00,0x35,0x80,0xC4,0x60,0x11,0x00,0x20,0xC0,0xC4,0x60,0x88,0x00,0x11,0x80,0x3E,0x40,0x00,0x00,}}, +{ 0x67AF, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x31,0x00,0x69,0x00,0x6F,0xC0,0x64,0x40,0xA4,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x67B3, {0x20,0x00,0x27,0xC0,0xFC,0x40,0xFC,0x40,0x34,0x40,0x6C,0x40,0x6F,0xC0,0x64,0x40,0xA0,0x00,0x22,0x40,0x24,0x20,0x28,0x20,0x00,0x00,}}, +{ 0x67B4, {0x10,0x00,0x13,0xE0,0x7E,0x20,0x7F,0xE0,0x1A,0x20,0x34,0x00,0x37,0xE0,0x34,0xA0,0x50,0xA0,0x11,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x67B6, {0x20,0x00,0x23,0xC0,0xFA,0x40,0x2A,0x40,0x4B,0xC0,0xB6,0x40,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x67B7, {0x34,0x00,0x34,0x00,0x7E,0x60,0x7F,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x75,0xE0,0x75,0xE0,0x3D,0xE0,0x39,0xE0,0x33,0x00,0x00,0x00,}}, +{ 0x67B8, {0x31,0x00,0x31,0x00,0x7B,0xE0,0x7B,0xE0,0x34,0x20,0x3B,0xA0,0x3A,0xE0,0x72,0xE0,0x73,0xE0,0x30,0x20,0x30,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x67B9, {0x64,0x00,0x64,0x00,0xF7,0xC0,0xFF,0xC0,0x6F,0x40,0x75,0xC0,0x75,0xC0,0xE7,0xC0,0xE4,0x80,0x64,0x20,0x64,0x20,0x63,0xE0,0x00,0x00,}}, +{ 0x67C1, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x22,0x00,0x22,0x00,0x62,0x40,0x72,0x80,0x6B,0x00,0xAA,0x00,0x22,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x67C4, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0x27,0xC0,0x25,0x40,0x75,0x40,0x6D,0xC0,0x6E,0xC0,0xA6,0x40,0x24,0x40,0x24,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x67C6, {0x61,0x00,0x61,0x00,0xFF,0xE0,0xFF,0xE0,0x68,0x80,0x64,0x80,0x74,0x80,0xF2,0x80,0xE3,0x80,0x63,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x67CA, {0x21,0x00,0x21,0x00,0xFB,0xC0,0x22,0x40,0x36,0x80,0x69,0x80,0x69,0x80,0x63,0x40,0xA4,0xA0,0x26,0x00,0x21,0x80,0x20,0x40,0x00,0x00,}}, +{ 0x67CE, {0x62,0x40,0x62,0x40,0xF2,0x40,0xF7,0xE0,0x64,0x40,0x7D,0x40,0x75,0xC0,0xE4,0x40,0xE4,0x40,0x64,0x40,0x64,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x67CF, {0x10,0x80,0x11,0x00,0x7F,0xE0,0x12,0x20,0x12,0x20,0x3A,0x20,0x37,0xE0,0x36,0x20,0x52,0x20,0x12,0x20,0x13,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x67D0, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x1F,0x00,0x11,0x00,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x67D1, {0x22,0x40,0x22,0x40,0xFF,0xE0,0x22,0x40,0x22,0x40,0x72,0x40,0x6B,0xC0,0x6A,0x40,0xA2,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x67D3, {0x22,0x00,0x92,0x00,0x4F,0x80,0x02,0xA0,0x24,0xA0,0x48,0xE0,0x84,0x00,0x7F,0xC0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x67D4, {0x00,0x00,0x3F,0x00,0x1E,0x00,0xFF,0xC0,0x0D,0xC0,0x35,0x00,0x4C,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x67D8, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0x21,0x00,0x22,0x00,0x73,0xC0,0x6A,0x40,0x6E,0x40,0xA6,0x40,0x2A,0x40,0x33,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x67DA, {0x10,0x80,0x10,0x80,0x78,0x80,0x17,0xE0,0x34,0xA0,0x34,0xA0,0x3C,0xA0,0x5F,0xE0,0x54,0xA0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x67DD, {0x20,0x40,0x21,0x80,0xFE,0x00,0xFC,0x00,0x37,0xE0,0x6D,0x80,0x6D,0x80,0x65,0xC0,0xA5,0xC0,0x29,0x80,0x31,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x67DE, {0x22,0x00,0x22,0x00,0xFF,0xE0,0xFF,0xE0,0x39,0x00,0x69,0xC0,0x69,0x00,0x61,0x00,0xA1,0xC0,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x67E2, {0x20,0x40,0x21,0x80,0xFF,0x80,0xFD,0x80,0x37,0xE0,0x6D,0x80,0x6C,0x80,0x64,0x80,0xA6,0x80,0x3E,0x60,0x37,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x67E4, {0x20,0x00,0x27,0x80,0xFC,0x80,0xFC,0x80,0x37,0x80,0x6C,0x80,0x6C,0x80,0x67,0x80,0xA4,0x80,0x24,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x67E7, {0x20,0x40,0x21,0x80,0xFF,0x80,0xFD,0x80,0x35,0x80,0x6D,0x80,0x6D,0x80,0x65,0x80,0xA5,0x80,0x29,0xC0,0x2F,0xC0,0x30,0x20,0x00,0x00,}}, +{ 0x67E9, {0x60,0x00,0x6F,0xE0,0xF9,0x00,0xF9,0x80,0x6A,0x80,0x7C,0x80,0x79,0x80,0xEB,0xC0,0xEE,0x60,0x68,0x00,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x67EC, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x77,0x80,0x75,0x80,0x76,0x80,0x3F,0x80,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x67EE, {0x30,0x80,0x34,0xA0,0x7C,0xA0,0x7C,0xA0,0x37,0xE0,0x3C,0xA0,0x38,0x80,0x74,0xA0,0x74,0xA0,0x34,0xA0,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x67EF, {0x20,0x00,0x2F,0xE0,0xF8,0x40,0xFF,0x40,0x35,0xC0,0x6D,0xC0,0x6D,0xC0,0x67,0xC0,0xA4,0x40,0x20,0x40,0x20,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x67F1, {0x22,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x21,0x00,0x71,0x00,0x6F,0xC0,0x69,0x00,0xA1,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x67F3, {0x21,0x00,0x22,0x00,0xFC,0xE0,0x2A,0xA0,0x6A,0xA0,0x7A,0xA0,0x7A,0xA0,0xAA,0xA0,0xAE,0xA0,0x24,0xE0,0x24,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x67F4, {0x22,0x00,0x22,0xC0,0x7F,0x00,0x62,0x20,0x7B,0xE0,0xE4,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x67F5, {0x20,0x00,0x2F,0xC0,0xFA,0xC0,0x2A,0xC0,0x6A,0xC0,0x7F,0xE0,0x7A,0xC0,0xAA,0xC0,0xAA,0xC0,0x2A,0xC0,0x2A,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x67FB, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1E,0x00,0x25,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x67FE, {0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,0x22,0x80,0x72,0xE0,0x6A,0x80,0x6A,0x80,0xA2,0x80,0x22,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x67FF, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x21,0x00,0x77,0xE0,0x6D,0x20,0x6D,0x20,0xA5,0x20,0x25,0x60,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6802, {0x20,0x00,0x23,0xC0,0xFA,0x40,0x23,0x40,0x32,0x40,0x6F,0xE0,0x6C,0x40,0x65,0x40,0xA5,0x40,0x2F,0xE0,0x28,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x6803, {0x20,0xC0,0x27,0x00,0xFC,0x00,0x27,0xE0,0x35,0x00,0x6D,0x00,0x6D,0xC0,0x65,0x40,0xAA,0x40,0x32,0x40,0x24,0x40,0x28,0x80,0x00,0x00,}}, +{ 0x6804, {0x28,0x80,0x14,0x80,0x7F,0xE0,0x40,0x40,0x84,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x6813, {0x21,0x00,0x21,0x00,0xFB,0x80,0x24,0x80,0x38,0x40,0x7F,0xE0,0x69,0x00,0x61,0x00,0xAF,0xC0,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6816, {0x20,0x00,0x3F,0xE0,0xF3,0x00,0x23,0x00,0x2F,0xC0,0x6B,0x40,0x7B,0x40,0xBB,0xC0,0xAC,0x40,0x28,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x6817, {0x00,0x00,0xFF,0xE0,0x0A,0x00,0x3F,0x80,0x2A,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x681E, {0x00,0x00,0x7B,0xC0,0x21,0x80,0xFF,0xE0,0x31,0x80,0x25,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6821, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x22,0x40,0x22,0x40,0x74,0xA0,0x6A,0xA0,0x69,0x80,0xA1,0x00,0x22,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x6822, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0x27,0xC0,0x24,0x40,0x74,0x40,0x6C,0x40,0x6F,0xC0,0xA4,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x6829, {0x30,0x00,0x3F,0xE0,0x7B,0x20,0x7B,0x60,0x35,0x60,0x39,0xA0,0x3B,0x60,0x73,0x60,0x75,0xA0,0x31,0x20,0x31,0x20,0x33,0x60,0x00,0x00,}}, +{ 0x682A, {0x21,0x00,0x25,0x00,0xF7,0xC0,0x2D,0x00,0x31,0x00,0x7F,0xE0,0x69,0x00,0x6B,0x80,0xA5,0x40,0x29,0x20,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x682B, {0x61,0x00,0x61,0x00,0xFF,0xE0,0xFF,0xE0,0x63,0xC0,0x74,0x40,0x74,0x80,0xEC,0xC0,0xF7,0xE0,0x64,0x80,0x64,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x6832, {0x21,0x00,0x23,0x40,0xFF,0xC0,0xF9,0x80,0x3F,0xE0,0x69,0x00,0x6B,0xE0,0x66,0x00,0xAB,0xC0,0x20,0x40,0x20,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x6834, {0x22,0x00,0x22,0x00,0xF7,0xE0,0x28,0x00,0x33,0xC0,0x6A,0xC0,0x6A,0xC0,0x62,0xC0,0xAF,0xE0,0x22,0x40,0x22,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x6838, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x25,0x40,0x32,0x40,0x6A,0x80,0x69,0x00,0x66,0x40,0xA8,0x80,0x21,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x6839, {0x20,0x00,0x27,0x80,0x24,0x80,0xFF,0x80,0x24,0x80,0x34,0x80,0x7F,0xA0,0x6D,0x20,0xA5,0xC0,0x25,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x683C, {0x21,0x00,0x21,0x00,0xFB,0xC0,0x26,0x40,0x21,0x80,0x71,0x80,0x6A,0x40,0x6F,0xE0,0xA2,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x683D, {0x21,0x00,0x21,0x80,0x7D,0x40,0x21,0x00,0xFF,0xE0,0x21,0x40,0xFD,0x40,0x30,0x80,0x68,0x80,0xA1,0xA0,0x22,0x60,0x24,0x20,0x00,0x00,}}, +{ 0x6840, {0x20,0x80,0x30,0xC0,0x7B,0xE0,0xDA,0x80,0x3F,0xE0,0x20,0x80,0xC4,0x80,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6841, {0x22,0x00,0x23,0xC0,0xFC,0x00,0x3A,0x00,0x33,0xE0,0x6C,0x80,0x6C,0x80,0x64,0x80,0xA4,0x80,0x24,0x80,0x24,0x80,0x25,0x80,0x00,0x00,}}, +{ 0x6842, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x21,0x00,0x2F,0xE0,0x71,0x00,0x69,0x00,0x6F,0xC0,0xA1,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6843, {0x22,0x80,0x22,0x80,0xFA,0xC0,0x26,0xC0,0x66,0x80,0x72,0x80,0x76,0xC0,0xBA,0xA0,0xA6,0xA0,0x24,0xA0,0x28,0xA0,0x30,0x60,0x00,0x00,}}, +{ 0x6846, {0x60,0x00,0x6F,0xE0,0xFB,0xC0,0xFB,0xC0,0x69,0x80,0x7B,0xC0,0x79,0x80,0xE9,0x80,0xEB,0xC0,0x6B,0xC0,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x6848, {0x04,0x00,0x7F,0xE0,0x48,0x00,0xFF,0xC0,0x13,0x00,0x3E,0x00,0x0D,0x80,0x74,0x40,0xFF,0xE0,0x15,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x684D, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF2,0x80,0x67,0xC0,0x78,0x20,0x7F,0xC0,0xE2,0x00,0xE7,0x80,0x60,0x80,0x60,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x684E, {0x60,0x00,0x6F,0xE0,0xF1,0x00,0xF2,0x40,0x7F,0xE0,0x71,0x20,0x71,0x00,0xEF,0xC0,0xE1,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6850, {0x10,0x00,0x17,0xE0,0x7C,0x20,0x1F,0xE0,0x34,0x20,0x35,0xE0,0x3D,0x60,0x5D,0x60,0x55,0xE0,0x14,0x20,0x14,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x6851, {0x1F,0x00,0x06,0x00,0x1B,0x00,0x7F,0xC0,0x2B,0x40,0x11,0x80,0x2F,0x40,0xFF,0xE0,0x0E,0x00,0x15,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6853, {0x20,0x00,0x27,0xE0,0xF8,0x00,0x23,0xC0,0x22,0x40,0x73,0xC0,0x6A,0x40,0x6A,0x40,0xA3,0xC0,0x20,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6854, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x21,0x00,0x31,0x00,0x6F,0xC0,0x68,0x00,0x67,0xC0,0xA4,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x6859, {0x21,0x00,0x23,0xC0,0xFF,0xE0,0xFF,0xE0,0x33,0x80,0x6B,0xC0,0x6D,0x80,0x69,0x80,0xAF,0xE0,0x21,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x685C, {0x22,0x40,0x29,0x40,0xF4,0x40,0x20,0x80,0x31,0x00,0x6F,0xE0,0x6A,0x80,0x62,0x80,0xA7,0x00,0x21,0x80,0x22,0x40,0x2C,0x40,0x00,0x00,}}, +{ 0x685D, {0x24,0x40,0x24,0x40,0xF7,0xE0,0x35,0x40,0x69,0x40,0x79,0x40,0x77,0x40,0xB3,0xE0,0xA4,0x40,0x28,0x40,0x30,0x40,0x20,0x40,0x00,0x00,}}, +{ 0x685F, {0x21,0x80,0x21,0x40,0xFF,0xE0,0x21,0x00,0x27,0xC0,0x71,0x00,0x6F,0xE0,0x61,0x40,0xA0,0xC0,0x20,0xA0,0x23,0x60,0x2C,0x20,0x00,0x00,}}, +{ 0x6863, {0x30,0x80,0x30,0x80,0x7C,0xA0,0x7A,0xA0,0x30,0x80,0x3F,0xE0,0x38,0x20,0x70,0x20,0x77,0xE0,0x30,0x20,0x37,0xE0,0x30,0x20,0x00,0x00,}}, +{ 0x6867, {0x21,0x00,0x23,0x00,0xF2,0x80,0x24,0x80,0x6F,0xC0,0x70,0x20,0x70,0x00,0xBF,0xE0,0xA2,0x80,0x24,0xC0,0x3F,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x6874, {0x60,0x40,0x61,0xC0,0xFF,0x60,0xF5,0xA0,0x68,0x00,0x77,0xC0,0x70,0x80,0xE1,0x80,0xEF,0xE0,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x6876, {0x10,0x00,0x17,0xE0,0x79,0xC0,0x17,0xE0,0x14,0xA0,0x34,0xA0,0x3F,0xE0,0x3C,0xA0,0x57,0xE0,0x14,0xA0,0x14,0xA0,0x14,0xE0,0x00,0x00,}}, +{ 0x6877, {0x31,0x00,0x31,0xC0,0x7E,0x80,0x7F,0xE0,0x35,0xA0,0x3C,0xA0,0x3F,0xE0,0x74,0xA0,0x77,0xE0,0x37,0xE0,0x38,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x687E, {0x60,0x00,0x6F,0x80,0xF2,0x80,0xFF,0xE0,0x62,0xC0,0x62,0x80,0x7F,0x80,0xF4,0x00,0xE7,0xC0,0x7C,0x40,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x687F, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x70,0x00,0x7F,0xC0,0xE1,0x00,0xEF,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x6881, {0x20,0x00,0x2F,0x80,0x82,0x80,0x0A,0xC0,0x34,0xA0,0x29,0xA0,0x44,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x6883, {0x60,0xC0,0x7F,0x80,0xF5,0x80,0xF9,0x80,0x6B,0xE0,0x7D,0x80,0x65,0x80,0xF5,0x80,0xFF,0xC0,0x6B,0xC0,0x74,0x00,0x63,0xE0,0x00,0x00,}}, +{ 0x6885, {0x22,0x00,0x22,0x00,0xFF,0xE0,0x27,0xC0,0x22,0xC0,0x72,0xC0,0x6F,0xE0,0x6A,0xC0,0xA5,0xE0,0x27,0xE0,0x20,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x688D, {0x61,0x00,0x62,0x00,0xF7,0xC0,0xF7,0xC0,0x64,0x40,0x77,0xC0,0x72,0x00,0xE2,0xE0,0xE7,0x00,0x66,0x40,0x62,0x40,0x61,0xC0,0x00,0x00,}}, +{ 0x688F, {0x61,0x00,0x65,0x00,0xF7,0xC0,0xFF,0xC0,0x71,0x00,0x7F,0xE0,0x71,0x00,0xE7,0xC0,0xE4,0x40,0x64,0x40,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x6893, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x24,0x40,0x32,0x80,0x6F,0xE0,0x69,0x00,0x61,0x00,0xA7,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6894, {0x60,0xC0,0x6F,0x00,0xFF,0xE0,0xFF,0xE0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0xEB,0xC0,0xEA,0x40,0x72,0x20,0x72,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x6897, {0x20,0x00,0x3F,0xE0,0xFF,0xC0,0x39,0x40,0x6F,0xC0,0x69,0x40,0x7F,0xC0,0xB9,0x40,0xA6,0x00,0x22,0x00,0x2D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x689B, {0x60,0x00,0x7F,0xC0,0xEB,0xC0,0xFF,0xC0,0x7B,0x80,0x6B,0xC0,0x7F,0xC0,0xEB,0xA0,0xEB,0xA0,0x73,0xE0,0x73,0x80,0x6D,0x80,0x00,0x00,}}, +{ 0x689D, {0x22,0x00,0x22,0x00,0x37,0xE0,0x3E,0x80,0x73,0x80,0x7F,0xE0,0xF1,0x00,0x7F,0xE0,0x77,0x80,0x79,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x689F, {0x04,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0xC0,0x20,0x00,0x3F,0x80,0x24,0x80,0xFF,0xE0,0xFF,0xE0,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x68A0, {0x30,0x00,0x33,0xC0,0x7A,0x40,0x7A,0x40,0x33,0xC0,0x38,0x80,0x39,0x00,0x77,0xE0,0x74,0x20,0x34,0x20,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x68A2, {0x20,0x80,0x24,0xA0,0xFA,0xA0,0x20,0x80,0x23,0xC0,0x72,0x40,0x6B,0xC0,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x22,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x68A6, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x79,0x80,0x6B,0xC0,0xA5,0xA0,0x07,0x80,0x18,0x80,0x29,0x00,0x06,0x00,0x18,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x68A7, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0x27,0x80,0x32,0x80,0x72,0x80,0x6F,0xE0,0x60,0x00,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x68A8, {0x04,0x40,0x79,0x40,0x11,0x40,0xFF,0x40,0x35,0x40,0xD2,0xC0,0x14,0x00,0x7F,0xC0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x68AD, {0x21,0x00,0x23,0xC0,0xFF,0xE0,0xFF,0x80,0x33,0xA0,0x6D,0xE0,0x69,0x00,0x63,0x80,0xA4,0x80,0x23,0x00,0x27,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x68AF, {0x24,0x80,0x22,0x80,0xFF,0xC0,0x21,0x40,0x2F,0xC0,0x79,0x00,0x6F,0xE0,0x6B,0x20,0xA5,0x20,0x29,0x60,0x31,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x68B0, {0x21,0x00,0x21,0x80,0xF9,0x40,0x2F,0xE0,0x31,0x80,0x7A,0x80,0x6A,0x80,0x7F,0xA0,0xAA,0xC0,0x2A,0xC0,0x33,0x60,0x22,0x20,0x00,0x00,}}, +{ 0x68B1, {0x10,0x00,0x17,0xE0,0x7C,0xA0,0x14,0xA0,0x37,0xE0,0x34,0xA0,0x3D,0xE0,0x5D,0xE0,0x56,0xA0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x68B3, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF4,0xC0,0x7F,0xA0,0x70,0x00,0x75,0x80,0xE5,0x80,0xE5,0x80,0x69,0xA0,0x69,0xA0,0x70,0x60,0x00,0x00,}}, +{ 0x68B5, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x79,0x80,0x6B,0xC0,0xA5,0xA0,0x1F,0x00,0x11,0x00,0x19,0x00,0x15,0x20,0x21,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x68B6, {0x20,0x00,0x27,0xC0,0xFC,0x40,0x27,0xC0,0x27,0xC0,0x75,0x00,0x6F,0xC0,0x6D,0x00,0xA7,0xE0,0x29,0x00,0x29,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x68B9, {0x60,0x40,0x61,0x80,0xF6,0x00,0xF7,0xE0,0x64,0xC0,0x74,0x80,0x74,0x80,0xE4,0xC0,0xFF,0xE0,0x64,0x40,0x68,0x20,0x70,0x20,0x00,0x00,}}, +{ 0x68BA, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x7B,0xC0,0xAD,0xA0,0x21,0x80,0xFF,0xE0,0x04,0x00,0x07,0x00,0x04,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x68BC, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x27,0xC0,0x63,0x00,0x7F,0xE0,0x72,0x80,0xBF,0xE0,0xA4,0x80,0x3A,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x68C4, {0x04,0x00,0xFF,0xE0,0x3F,0x00,0x3F,0x80,0xFF,0xE0,0x25,0x80,0x3F,0x00,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x68C6, {0x61,0x00,0x63,0x00,0xF6,0x80,0xFF,0xC0,0x70,0x20,0x6F,0xC0,0x7B,0xC0,0xFB,0xC0,0xEF,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x68C9, {0x21,0x00,0x22,0x00,0xFB,0xC0,0x23,0xC0,0x32,0x40,0x6B,0xC0,0x68,0x80,0x67,0xE0,0xA4,0xA0,0x24,0xA0,0x24,0xC0,0x20,0x80,0x00,0x00,}}, +{ 0x68CA, {0x11,0x00,0x7F,0xC0,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x35,0x80,0xFF,0xE0,0x9F,0x20,0x64,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x68CB, {0x22,0x80,0x22,0x80,0xFF,0xE0,0x22,0x80,0x33,0x80,0x6A,0x80,0x6B,0x80,0x62,0x80,0xAF,0xE0,0x22,0x40,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x68CD, {0x20,0x00,0x27,0xC0,0xFC,0x40,0xFF,0xC0,0x34,0x40,0x6F,0xC0,0x6D,0x80,0x65,0xA0,0xA7,0xC0,0x25,0xA0,0x27,0xA0,0x3C,0xE0,0x00,0x00,}}, +{ 0x68D2, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2F,0xC0,0x33,0x80,0x7F,0xE0,0x65,0x80,0x6F,0xC0,0xB1,0x20,0x27,0xC0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x68D4, {0x20,0xC0,0x27,0x80,0xFF,0xE0,0xFF,0xE0,0x34,0x80,0x6F,0xA0,0x6C,0x60,0x67,0xE0,0xA7,0xC0,0x27,0xC0,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x68D5, {0x21,0x80,0x21,0x80,0xFF,0xE0,0xF8,0x00,0x33,0xC0,0x68,0x00,0x6F,0xE0,0x61,0x80,0xA3,0xC0,0x25,0xA0,0x29,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x68D7, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x77,0x80,0x64,0x80,0xFF,0xE0,0x04,0x00,0x7F,0x80,0x7F,0x80,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x68D8, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x31,0x80,0x7B,0xC0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x68DA, {0x10,0x00,0x17,0xE0,0x7D,0xA0,0x15,0xA0,0x37,0xE0,0x35,0xA0,0x3D,0xA0,0x5F,0xE0,0x55,0xA0,0x1D,0xA0,0x19,0xA0,0x13,0x60,0x00,0x00,}}, +{ 0x68DF, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2F,0xC0,0x69,0x40,0x6F,0xC0,0x79,0x40,0xBF,0xC0,0xA7,0x80,0x39,0x40,0x21,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x68E0, {0x24,0x80,0x35,0x80,0x7F,0xE0,0x9F,0x00,0x31,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x68E1, {0x30,0x00,0x3F,0xE0,0x7A,0xE0,0x79,0xA0,0x3F,0xE0,0x38,0xA0,0x3A,0xE0,0x7A,0xE0,0x7B,0xE0,0x3B,0xE0,0x38,0x20,0x38,0x60,0x00,0x00,}}, +{ 0x68E3, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xFF,0xE0,0x63,0x40,0x7F,0xC0,0x79,0x40,0xE5,0xC0,0xE7,0x80,0x67,0x40,0x79,0x20,0x63,0x00,0x00,0x00,}}, +{ 0x68E7, {0x21,0x80,0x21,0x40,0xFF,0xE0,0xFF,0xC0,0x31,0xA0,0x6F,0x60,0x69,0xA0,0x63,0xE0,0xAF,0xC0,0x20,0xA0,0x21,0xE0,0x26,0x20,0x00,0x00,}}, +{ 0x68EE, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x0E,0x00,0x75,0xC0,0x24,0x80,0x20,0x80,0xFF,0xE0,0x71,0x80,0x6A,0xC0,0xA4,0xA0,0x20,0x80,0x00,0x00,}}, +{ 0x68EF, {0x61,0x00,0x63,0x00,0xF6,0x80,0xFF,0xC0,0x70,0x20,0x67,0x80,0x71,0x00,0xF3,0x00,0xE3,0x80,0x6A,0x20,0x72,0xA0,0x61,0x80,0x00,0x00,}}, +{ 0x68F2, {0x21,0x00,0x2F,0xE0,0xF1,0x00,0x27,0xC0,0x6F,0xE0,0x71,0x40,0x6F,0xC0,0xA2,0x00,0xBF,0xE0,0x24,0x80,0x23,0x80,0x2C,0x40,0x00,0x00,}}, +{ 0x68F9, {0x61,0x00,0x61,0x00,0xF1,0xE0,0xFF,0xC0,0x68,0x40,0x7F,0xC0,0x78,0x40,0xEF,0xC0,0xEF,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x68FA, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x28,0x40,0x27,0x80,0x74,0x80,0x6F,0x80,0x6C,0x00,0xA7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x6900, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2C,0x00,0x77,0xC0,0x75,0x40,0x7D,0x40,0xAB,0x40,0xB3,0x40,0x25,0x20,0x29,0x20,0x30,0xE0,0x00,0x00,}}, +{ 0x6901, {0x61,0x00,0x7F,0xE0,0xF7,0x80,0xF7,0x80,0x67,0x80,0x70,0x00,0x7F,0xC0,0xE0,0x80,0xEF,0xE0,0x6F,0xE0,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x6904, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xF6,0x80,0x7F,0xE0,0x71,0x00,0x7F,0xE0,0xE2,0x80,0xE7,0x80,0x67,0x80,0x63,0x40,0x7C,0x40,0x00,0x00,}}, +{ 0x6905, {0x21,0x00,0x21,0x00,0x27,0xE0,0xF9,0x80,0x32,0x40,0x6F,0xE0,0x68,0x40,0x67,0x40,0xA5,0x40,0x27,0x40,0x25,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x6908, {0x32,0x00,0x32,0x00,0x7F,0xE0,0x7D,0x20,0x35,0xE0,0x33,0xA0,0x3F,0xE0,0x7B,0xA0,0x73,0xE0,0x3D,0x20,0x31,0x20,0x30,0x40,0x00,0x00,}}, +{ 0x690B, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x23,0xC0,0x22,0x40,0x72,0x40,0x6B,0xC0,0x69,0x00,0xA3,0x40,0x25,0x20,0x29,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x690C, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFB,0x80,0x73,0xA0,0x74,0xE0,0x78,0x00,0xEF,0xC0,0xE1,0x00,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x690D, {0x20,0x80,0x23,0xE0,0xF0,0x80,0x25,0xC0,0x25,0x40,0x75,0xC0,0x6D,0x40,0x6D,0xC0,0xA5,0x40,0x25,0xC0,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x690E, {0x22,0x80,0x22,0x80,0xFE,0x80,0x2F,0xE0,0x24,0x80,0x77,0xC0,0x7C,0x80,0x6C,0x80,0xA7,0xC0,0x24,0x80,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x690F, {0x60,0x00,0x6F,0xC0,0xF3,0x80,0xF3,0x80,0x6F,0xC0,0x78,0x40,0x78,0x40,0xEF,0xC0,0xEB,0xC0,0x63,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6912, {0x64,0x00,0x64,0x00,0xF7,0xE0,0xF5,0xA0,0x7F,0xC0,0x65,0xC0,0x74,0xC0,0xFE,0x80,0xED,0xC0,0x75,0xC0,0x65,0x20,0x6E,0x20,0x00,0x00,}}, +{ 0x6919, {0x10,0x00,0x13,0xC0,0x7E,0x40,0x13,0xC0,0x33,0xC0,0x3A,0x40,0x38,0x00,0x57,0xE0,0x54,0x20,0x17,0xE0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x691A, {0x30,0x00,0x37,0xE0,0x7F,0xE0,0x7F,0xE0,0x37,0xE0,0x3C,0x20,0x3C,0x20,0x74,0x20,0x74,0x20,0x34,0x20,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x691B, {0x22,0x80,0x22,0x80,0xFF,0xE0,0x22,0x80,0x30,0x00,0x72,0xA0,0x6A,0xC0,0x64,0x80,0xAC,0x80,0x24,0xA0,0x24,0xA0,0x24,0xE0,0x00,0x00,}}, +{ 0x691C, {0x21,0x00,0x21,0x00,0xFA,0x80,0x27,0xC0,0x29,0x20,0x77,0xC0,0x75,0x40,0x6D,0x40,0xA7,0xC0,0x22,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x6921, {0x30,0x20,0x3F,0xA0,0x7A,0xE0,0x7F,0xE0,0x3F,0xE0,0x32,0xE0,0x3A,0xE0,0x7F,0xE0,0x72,0xE0,0x33,0xA0,0x3E,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x6922, {0x30,0x00,0x37,0xE0,0x7F,0xE0,0x7F,0xE0,0x34,0xA0,0x3F,0xE0,0x3C,0xA0,0x74,0xE0,0x77,0xE0,0x37,0xE0,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x6923, {0x63,0x80,0x63,0x80,0xFF,0xC0,0xFF,0xC0,0x6B,0xC0,0x7F,0xC0,0x7B,0xC0,0xEB,0xC0,0xFF,0xE0,0x62,0x80,0x64,0x40,0x78,0x40,0x00,0x00,}}, +{ 0x6925, {0x34,0x00,0x34,0x00,0x7F,0xE0,0x7F,0xE0,0x3A,0xE0,0x3F,0xE0,0x3A,0xE0,0x7A,0xE0,0x73,0xE0,0x34,0xE0,0x38,0xE0,0x30,0x00,0x00,0x00,}}, +{ 0x6926, {0x61,0x00,0x65,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xE0,0x73,0x80,0x75,0x80,0xFB,0x60,0xEF,0xC0,0x62,0x40,0x64,0x40,0x68,0x80,0x00,0x00,}}, +{ 0x6928, {0x61,0x80,0x61,0x80,0xFF,0xE0,0xF9,0x40,0x69,0x40,0x7B,0xE0,0x7B,0x40,0xEF,0xC0,0xEA,0x40,0x72,0x40,0x72,0x40,0x62,0xC0,0x00,0x00,}}, +{ 0x692A, {0x64,0x80,0x62,0x80,0xFF,0xE0,0xFF,0xE0,0x6B,0xC0,0x7B,0xC0,0x77,0xC0,0xE7,0x80,0xE7,0x80,0x67,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6930, {0x60,0x00,0x7F,0xC0,0xFB,0xC0,0xFF,0xC0,0x6B,0x80,0x7B,0xC0,0x7F,0xC0,0xEB,0xA0,0xEF,0xA0,0x7F,0xE0,0x63,0x80,0x63,0x80,0x00,0x00,}}, +{ 0x6934, {0x21,0x00,0x23,0xC0,0xFD,0x40,0x2F,0x60,0x6B,0x60,0x68,0x20,0x7F,0xC0,0xB9,0x40,0xAE,0xC0,0x38,0x80,0x29,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x6936, {0x61,0x80,0x69,0x40,0xFF,0x40,0xFB,0xC0,0x6F,0xC0,0x73,0x80,0x74,0xA0,0xEA,0xE0,0xE7,0x80,0x7F,0x80,0x63,0x80,0x7C,0x60,0x00,0x00,}}, +{ 0x6939, {0x64,0x80,0x64,0xC0,0xFF,0xE0,0xF7,0x80,0x64,0x80,0x77,0x80,0x74,0x80,0xFF,0xE0,0xEB,0x80,0x6C,0xC0,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x693D, {0x62,0x00,0x63,0xC0,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x73,0x40,0x7D,0xC0,0xE3,0x80,0xEF,0xC0,0x7D,0xA0,0x61,0x80,0x63,0x00,0x00,0x00,}}, +{ 0x693F, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x37,0x80,0x63,0x80,0x7F,0xE0,0x74,0x80,0xAF,0xC0,0xB7,0xA0,0x27,0x80,0x27,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x694A, {0x20,0x00,0x27,0x80,0xF4,0x80,0x27,0x80,0x67,0x80,0x70,0x00,0x7F,0xE0,0xA4,0x00,0xA7,0xC0,0x25,0xC0,0x2B,0x40,0x23,0x80,0x00,0x00,}}, +{ 0x6953, {0x20,0x00,0x2F,0xC0,0xF9,0xC0,0x2F,0x40,0x69,0x40,0x7F,0xC0,0x7D,0xC0,0xAF,0xC0,0xAD,0x60,0x31,0xE0,0x3E,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x6954, {0x64,0x00,0x64,0x00,0xFF,0xE0,0xFF,0xA0,0x65,0xA0,0x67,0x20,0x7C,0xC0,0xF7,0x00,0xFF,0xE0,0x63,0x00,0x6C,0x80,0x70,0x60,0x00,0x00,}}, +{ 0x6955, {0x21,0x00,0x2F,0xE0,0xF3,0xC0,0x24,0x80,0x2B,0xE0,0x70,0x00,0x77,0xC0,0x6C,0x40,0xAF,0xC0,0x27,0xC0,0x24,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x6959, {0x60,0x80,0x7F,0x80,0xFF,0xE0,0xFD,0xE0,0x7F,0x80,0x65,0xC0,0x77,0xC0,0xFD,0xC0,0xED,0xA0,0x74,0x80,0x64,0x80,0x6C,0x80,0x00,0x00,}}, +{ 0x695A, {0x10,0x80,0x10,0x80,0xFF,0xE0,0x39,0x80,0xD6,0xE0,0x10,0x80,0xFF,0xC0,0x04,0x80,0x24,0x00,0x27,0x80,0x5C,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x695C, {0x32,0x00,0x32,0xE0,0x7F,0xE0,0x7F,0xE0,0x32,0xE0,0x3F,0xE0,0x3D,0xE0,0x75,0xE0,0x77,0xA0,0x37,0xA0,0x31,0x20,0x32,0x60,0x00,0x00,}}, +{ 0x695D, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFF,0xC0,0x6F,0xC0,0x7B,0xC0,0x7B,0xC0,0xEF,0xC0,0xE7,0x80,0x79,0x60,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x695E, {0x60,0x00,0x6F,0xC0,0xFB,0xC0,0xFF,0xC0,0x6B,0x40,0x61,0x00,0x7F,0xE0,0xF1,0x00,0xE3,0xC0,0x62,0x40,0x64,0x40,0x78,0x80,0x00,0x00,}}, +{ 0x6960, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x2F,0xC0,0x6C,0xC0,0x6B,0x40,0x7F,0xC0,0xB9,0x40,0xAF,0xC0,0x29,0x40,0x29,0x40,0x28,0xC0,0x00,0x00,}}, +{ 0x6961, {0x67,0x00,0x63,0x00,0xF6,0x80,0xFF,0xC0,0x70,0x20,0x7E,0x40,0x73,0xC0,0xFB,0xC0,0xFF,0x80,0x7F,0xC0,0x73,0xC0,0x77,0xC0,0x00,0x00,}}, +{ 0x6962, {0x24,0x80,0x22,0x80,0xFF,0xE0,0x23,0x00,0x6F,0xC0,0x6B,0x40,0x7B,0x40,0xBA,0xC0,0xAF,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x696A, {0x65,0x80,0x67,0xC0,0xFF,0xE0,0xF5,0x80,0x64,0x00,0x77,0xC0,0x71,0x00,0xFF,0xE0,0xE7,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x696B, {0x60,0x00,0x67,0x80,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x74,0x80,0x77,0x80,0xE4,0x80,0xE7,0xE0,0x67,0xE0,0x7C,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x696D, {0x0A,0x00,0x2A,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x696E, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xF1,0x40,0x7F,0xE0,0x71,0x80,0x72,0x80,0xE7,0xC0,0xFF,0xC0,0x67,0xC0,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x696F, {0x20,0x40,0x21,0x80,0xFE,0x80,0x2F,0xE0,0x28,0x80,0x7B,0xC0,0x7A,0x40,0xAB,0xC0,0xAA,0x40,0x33,0xC0,0x33,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x6973, {0x22,0x80,0x22,0x80,0xFF,0xE0,0x23,0x80,0x22,0x80,0x73,0x80,0x69,0x00,0x6F,0xE0,0xA7,0x80,0x29,0x40,0x31,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x6974, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xF6,0x80,0x6F,0xE0,0x79,0x40,0x71,0x00,0xEF,0xC0,0xE9,0x40,0x69,0x40,0x69,0xC0,0x61,0x00,0x00,0x00,}}, +{ 0x6975, {0x20,0x00,0x3F,0xE0,0xF2,0x00,0x26,0x60,0x65,0xA0,0x6F,0xA0,0x7B,0xC0,0xBB,0xC0,0xAF,0xA0,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6977, {0x25,0x80,0x25,0xA0,0xFF,0xC0,0xFD,0x80,0x27,0xA0,0x7D,0xE0,0x69,0x00,0x6F,0xC0,0xA7,0xC0,0x27,0xC0,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x6978, {0x61,0x80,0x62,0x80,0xFC,0x80,0xF4,0xA0,0x7F,0xC0,0x65,0xC0,0x76,0x80,0xFD,0x80,0xED,0xC0,0x75,0xC0,0x65,0x20,0x66,0x20,0x00,0x00,}}, +{ 0x6979, {0x60,0x00,0x6F,0x80,0xF2,0xE0,0xF7,0xE0,0x67,0xA0,0x79,0xA0,0x7A,0xC0,0xEF,0xC0,0xEB,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x697C, {0x21,0x00,0x29,0x40,0xF7,0x80,0x2F,0xE0,0x37,0x80,0x69,0x40,0x69,0x00,0xAF,0xE0,0xA2,0x80,0x27,0x00,0x22,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0x697D, {0x04,0x00,0x48,0x40,0x3F,0x40,0x1F,0x80,0x31,0xC0,0xDF,0x20,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x697E, {0x61,0x00,0x62,0x00,0xFF,0xC0,0xFF,0xC0,0x68,0x40,0x7F,0xC0,0x71,0x40,0xFF,0xC0,0xE7,0x80,0x69,0x40,0x71,0x20,0x63,0x00,0x00,0x00,}}, +{ 0x6981, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFF,0xE0,0x73,0x80,0x74,0x80,0x7F,0x40,0xE3,0x00,0xEF,0xC0,0x61,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6982, {0x40,0x00,0x5F,0xE0,0x54,0x80,0xFD,0x80,0x55,0x80,0x77,0xE0,0x7D,0x80,0xF9,0x80,0xD7,0x80,0x5F,0xA0,0x52,0xA0,0x44,0x60,0x00,0x00,}}, +{ 0x698A, {0x24,0x40,0x24,0x40,0xFF,0xE0,0x23,0x60,0x63,0xE0,0x75,0x60,0x7F,0x60,0xAF,0xE0,0xB5,0x60,0x24,0x40,0x24,0x40,0x24,0x40,0x00,0x00,}}, +{ 0x698E, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0x27,0xC0,0x34,0x40,0x6F,0xC0,0x6C,0x40,0x67,0xC0,0xAE,0xC0,0x23,0x80,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x6991, {0x61,0x40,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x79,0x40,0x7F,0xC0,0xE9,0x40,0xEF,0xE0,0x6F,0xE0,0x62,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x6994, {0x64,0x00,0x65,0xE0,0xFF,0xA0,0xF3,0xC0,0x7F,0xC0,0x73,0xC0,0x7F,0xA0,0xF9,0xA0,0xF5,0xA0,0x77,0xE0,0x79,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x6995, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFC,0x40,0x75,0x40,0x79,0x40,0x72,0x80,0xE4,0xC0,0xEF,0xE0,0x64,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x699B, {0x21,0x00,0x2F,0xE0,0xF7,0xC0,0x2F,0xC0,0x7F,0xE0,0x64,0x80,0x7B,0x40,0xB1,0x20,0xAF,0xC0,0x27,0x80,0x39,0x60,0x21,0x00,0x00,0x00,}}, +{ 0x699C, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xF6,0x80,0x6F,0xE0,0x79,0x40,0x7F,0xC0,0xE1,0x00,0xE3,0xC0,0x62,0x40,0x64,0x40,0x78,0x80,0x00,0x00,}}, +{ 0x69A0, {0x60,0x00,0x6F,0xE0,0xFF,0xC0,0xF7,0x80,0x67,0x80,0x74,0x80,0x77,0x80,0xE3,0x00,0xFF,0xE0,0x62,0x00,0x64,0x40,0x78,0x40,0x00,0x00,}}, +{ 0x69A7, {0x60,0x00,0x6F,0xE0,0xF9,0x80,0xFF,0xE0,0x6B,0xC0,0x7F,0xE0,0x79,0x80,0xEF,0xE0,0xEA,0x80,0x6C,0x80,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x69AE, {0x21,0x80,0x7B,0xA0,0xB7,0xC0,0x31,0xC0,0x4A,0x40,0x7F,0xE0,0x44,0x40,0xBF,0x80,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x69B1, {0x61,0x00,0x7F,0xE0,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x64,0x80,0x77,0x80,0xF3,0x40,0xED,0xC0,0x6C,0x80,0x67,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x69B2, {0x60,0x00,0x6F,0xC0,0xF9,0x40,0xFB,0xC0,0x6C,0x40,0x7F,0xC0,0x70,0x00,0xEF,0xC0,0xEB,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x69B4, {0x61,0x00,0x6E,0xE0,0xF8,0xA0,0xFA,0xA0,0x6B,0xA0,0x7D,0xE0,0x71,0x00,0xEF,0xC0,0xEF,0xC0,0x6F,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x69BB, {0x30,0x00,0x37,0xC0,0x7F,0xC0,0x7F,0xC0,0x37,0xC0,0x38,0x00,0x3F,0xE0,0x73,0x60,0x7F,0xE0,0x3F,0xE0,0x31,0x20,0x33,0x60,0x00,0x00,}}, +{ 0x69BE, {0x60,0x00,0x67,0xC0,0xF5,0xC0,0xF5,0xC0,0x6F,0xE0,0x78,0x40,0x77,0xC0,0xE4,0x40,0xE7,0xC0,0x67,0xC0,0x64,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x69BF, {0x61,0x00,0x69,0x40,0xFF,0xC0,0xFF,0xC0,0x7F,0xE0,0x70,0x00,0x77,0x80,0xE4,0x80,0xE7,0x80,0x66,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x69C1, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF7,0x80,0x64,0x80,0x77,0x80,0x70,0x00,0xEF,0xC0,0xEB,0x40,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x69C3, {0x23,0x80,0x7A,0x80,0x6E,0x60,0x7F,0xE0,0xFA,0xC0,0x69,0x80,0x9E,0xE0,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x69C7, {0x22,0xC0,0x23,0x00,0xFF,0xE0,0xFD,0xE0,0x25,0x40,0x75,0xC0,0x6D,0x40,0x6D,0xC0,0xA5,0xC0,0x27,0xE0,0x23,0xC0,0x2C,0x20,0x00,0x00,}}, +{ 0x69CA, {0x48,0x00,0x73,0xC0,0xFF,0xC0,0x2B,0xC0,0x6B,0xC0,0x7A,0x40,0x24,0xC0,0x64,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x69CB, {0x22,0x80,0x2F,0xE0,0xFA,0x80,0x27,0xC0,0x6F,0xE0,0x71,0x00,0x77,0xC0,0xA5,0x40,0xA7,0xC0,0x2F,0xE0,0x24,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x69CC, {0x20,0x80,0x29,0x00,0xF5,0xC0,0x21,0x40,0x61,0xC0,0x6D,0x00,0x75,0xC0,0xB5,0x40,0xA5,0x40,0x25,0xC0,0x2A,0x00,0x31,0xE0,0x00,0x00,}}, +{ 0x69CD, {0x21,0x00,0x23,0x00,0xFF,0x80,0x3F,0xC0,0x77,0xE0,0x64,0x80,0x77,0x80,0xB7,0x80,0xA7,0xC0,0x3C,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x69CE, {0x64,0x80,0x63,0x80,0xFF,0xE0,0xFF,0xC0,0x63,0x00,0x7F,0xE0,0x74,0x00,0xE7,0xC0,0xE9,0x00,0x71,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x69D0, {0x61,0x00,0x62,0x00,0xFF,0xC0,0xF9,0x40,0x6F,0xC0,0x79,0x40,0x7F,0xC0,0xE5,0x80,0xE5,0xC0,0x69,0xE0,0x71,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x69D3, {0x20,0x00,0x27,0xC0,0xFF,0xE0,0xFF,0xE0,0x27,0xC0,0x74,0x40,0x6F,0xC0,0x6C,0x40,0xA7,0xC0,0x27,0xC0,0x26,0xC0,0x38,0x20,0x00,0x00,}}, +{ 0x69D8, {0x22,0x80,0x27,0xC0,0xF9,0x00,0x27,0xC0,0x21,0x00,0x7F,0xE0,0x69,0x00,0x6F,0x60,0xA3,0xC0,0x2D,0x20,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x69D9, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x27,0x80,0x24,0x80,0x77,0x80,0x6C,0x80,0x6F,0x80,0xA4,0x80,0x3F,0xE0,0x26,0x80,0x38,0x40,0x00,0x00,}}, +{ 0x69DD, {0x62,0x00,0x6F,0x80,0xFF,0x80,0xFF,0x80,0x6F,0x80,0x78,0x00,0x7F,0xE0,0xE8,0x00,0xEF,0xE0,0x72,0xA0,0x7F,0xA0,0x70,0xC0,0x00,0x00,}}, +{ 0x69DE, {0x61,0x00,0x63,0x00,0xFF,0xC0,0xF6,0x80,0x7F,0xE0,0x70,0x00,0x7F,0xC0,0xEB,0x40,0xEF,0xC0,0x6F,0xE0,0x6B,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x69E7, {0x20,0xC0,0xFF,0x00,0x7B,0xE0,0x7B,0xE0,0x7A,0x80,0x7A,0x80,0xFC,0x80,0x34,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x69E8, {0x64,0x00,0x65,0xC0,0xFF,0xC0,0xFF,0xC0,0x6B,0x80,0x6F,0xC0,0x71,0xC0,0xFF,0xA0,0xE7,0xA0,0x7D,0xE0,0x65,0x80,0x6D,0x80,0x00,0x00,}}, +{ 0x69EB, {0x61,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6B,0x40,0x7F,0xC0,0x71,0x80,0xFF,0xC0,0xEF,0xE0,0x6F,0xE0,0x62,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x69ED, {0x61,0x80,0x61,0xC0,0xFF,0xE0,0xFF,0xE0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0xEF,0xC0,0xEE,0x80,0x77,0xA0,0x7B,0xE0,0x67,0x20,0x00,0x00,}}, +{ 0x69F2, {0x68,0x40,0x6F,0xC0,0xF6,0xC0,0xFE,0x40,0x77,0x40,0x75,0xC0,0x7F,0xC0,0xF5,0x60,0xFF,0xC0,0x7F,0x40,0x71,0x40,0x63,0x40,0x00,0x00,}}, +{ 0x69F9, {0x61,0x00,0x62,0x00,0xFF,0xC0,0xFF,0xC0,0x68,0x40,0x7F,0xC0,0x71,0x00,0xED,0xC0,0xE1,0x40,0x7F,0xE0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x69FB, {0x24,0x00,0x25,0xC0,0xF5,0x40,0x3F,0xC0,0x65,0x40,0x7F,0xC0,0x75,0x40,0xA5,0x40,0xAB,0xC0,0x31,0xA0,0x31,0xA0,0x22,0x60,0x00,0x00,}}, +{ 0x69FD, {0x63,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x6B,0xC0,0x7F,0xC0,0xF7,0x80,0xE7,0x80,0x67,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x69FF, {0x65,0x80,0x7F,0xE0,0xF7,0x80,0xFF,0xC0,0x6B,0x40,0x7F,0xC0,0x71,0x00,0xEF,0xC0,0xE7,0xC0,0x67,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6A02, {0x64,0x80,0x64,0xC0,0xEF,0xC0,0x6E,0xC0,0x6A,0xC0,0x7A,0xE0,0xDF,0xA0,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6A05, {0x65,0x40,0x65,0x40,0xF9,0x40,0xF7,0xE0,0x67,0xA0,0x78,0x00,0x79,0x80,0xFB,0x80,0xEB,0xC0,0x6B,0x80,0x6F,0x80,0x68,0xE0,0x00,0x00,}}, +{ 0x6A0A, {0x62,0x80,0x62,0xC0,0xFF,0xE0,0x6E,0xC0,0x73,0xC0,0xFD,0xA0,0xE6,0xA0,0x6C,0xC0,0xFF,0xE0,0x0E,0x00,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x6A0B, {0x20,0x00,0x27,0xC0,0xF9,0x80,0x2B,0xC0,0x62,0xC0,0x7A,0xC0,0x7B,0xC0,0xBA,0xC0,0xAB,0xC0,0x2A,0xC0,0x36,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x6A0C, {0x60,0x00,0x67,0xC0,0xFF,0xE0,0xFF,0xE0,0x6F,0x80,0x77,0xC0,0x74,0x40,0xE7,0xC0,0xE7,0xC0,0x67,0xC0,0x66,0xC0,0x78,0x20,0x00,0x00,}}, +{ 0x6A12, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFA,0xC0,0x6B,0xC0,0x6B,0xA0,0x73,0xA0,0xF7,0x80,0xF9,0x00,0x69,0x40,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x6A13, {0x61,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6F,0xC0,0x7F,0xC0,0x79,0x40,0xEF,0xC0,0xEF,0xE0,0x6F,0xE0,0x63,0x80,0x7E,0x40,0x00,0x00,}}, +{ 0x6A14, {0x69,0x40,0x72,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x79,0x40,0x7F,0xC0,0xE3,0x00,0xFF,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x6A17, {0x60,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6D,0xC0,0x67,0x80,0x70,0x00,0xFF,0xE0,0xE3,0x80,0x67,0x80,0x60,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x6A19, {0x20,0x00,0x3F,0xE0,0xF4,0x80,0x2F,0xC0,0x6F,0xC0,0x70,0x00,0x77,0x80,0xA0,0x00,0xBF,0xE0,0x29,0x40,0x31,0x40,0x23,0x00,0x00,0x00,}}, +{ 0x6A1B, {0x60,0x00,0x6F,0xE0,0xF7,0x60,0xFF,0xE0,0x67,0xE0,0x79,0xA0,0x77,0x80,0xFB,0x60,0xE7,0x00,0x66,0x40,0x63,0x80,0x6E,0x00,0x00,0x00,}}, +{ 0x6A1E, {0x60,0x00,0x6F,0xC0,0xFB,0x80,0xFB,0x80,0x6B,0x80,0x78,0x00,0x7F,0xC0,0xED,0xC0,0xEF,0xC0,0x6F,0xC0,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x6A1F, {0x20,0x80,0x27,0xE0,0xF9,0x40,0x27,0xE0,0x33,0xC0,0x6A,0x40,0x6B,0xC0,0x62,0x40,0xA3,0xC0,0x2F,0xE0,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6A21, {0x22,0x80,0x22,0x80,0xFF,0xE0,0x27,0xC0,0x34,0x40,0x6F,0xC0,0x6C,0x40,0x67,0xC0,0xA1,0x00,0x3F,0xE0,0x24,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x6A22, {0x62,0x00,0x6F,0x80,0xFF,0x80,0xFF,0x80,0x6F,0x80,0x78,0x00,0x7F,0xE0,0xE8,0x00,0xEF,0xE0,0x7F,0xA0,0x74,0x20,0x60,0xC0,0x00,0x00,}}, +{ 0x6A23, {0x64,0x80,0x63,0x80,0xFF,0xC0,0xF7,0x80,0x63,0x00,0x7F,0xE0,0x73,0x00,0xE7,0x40,0xEF,0xC0,0x6F,0x80,0x79,0x60,0x63,0x00,0x00,0x00,}}, +{ 0x6A29, {0x22,0x00,0x23,0xC0,0xFD,0x00,0x2F,0xE0,0x62,0x80,0x67,0xE0,0x7D,0x00,0xB7,0xC0,0xA7,0xC0,0x25,0x00,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x6A2A, {0x22,0x80,0x27,0xC0,0xF2,0x80,0x2F,0xE0,0x61,0x00,0x7F,0xC0,0x79,0x40,0xBF,0xC0,0xA9,0x40,0x2F,0xC0,0x24,0x80,0x28,0x40,0x00,0x00,}}, +{ 0x6A2B, {0x20,0x00,0x2F,0xC0,0xFF,0x40,0x2E,0xC0,0x6F,0x80,0x6A,0xC0,0x7F,0x20,0xB1,0x00,0xAF,0xC0,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x6A2E, {0x60,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6B,0xC0,0x7F,0xC0,0x71,0x00,0xE9,0x40,0xEB,0x40,0x63,0x80,0x6C,0x80,0x70,0x60,0x00,0x00,}}, +{ 0x6A35, {0x22,0x80,0x22,0x80,0xF7,0xE0,0x2D,0x00,0x67,0xC0,0x65,0x00,0x77,0xC0,0xB5,0x00,0xA7,0xE0,0x2B,0x40,0x2A,0xA0,0x34,0xA0,0x00,0x00,}}, +{ 0x6A36, {0x60,0x00,0x67,0x80,0xF7,0x80,0xF7,0x80,0x67,0x80,0x7F,0xE0,0x7A,0x00,0xEF,0xC0,0xEF,0xC0,0x6E,0xC0,0x7F,0xC0,0x62,0x20,0x00,0x00,}}, +{ 0x6A38, {0x63,0x80,0x6B,0xC0,0xFF,0xE0,0xFF,0xE0,0x62,0x80,0x7F,0xC0,0x71,0x00,0xE7,0x80,0xEF,0xE0,0x6F,0xE0,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x6A39, {0x24,0x40,0x24,0x40,0xFF,0xE0,0x2F,0x40,0x60,0x40,0x6F,0xC0,0x79,0xC0,0xBF,0x40,0xBA,0x40,0x2E,0x40,0x38,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x6A3A, {0x24,0x80,0x24,0x80,0xFF,0xE0,0x24,0x80,0x6F,0xC0,0x7F,0xE0,0x75,0x40,0xAF,0xE0,0xA1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x6A3D, {0x24,0x80,0x22,0x80,0xFF,0xE0,0x2F,0xC0,0x2B,0xC0,0x2C,0xC0,0x3F,0xC0,0x6F,0xC0,0xA0,0x80,0x2F,0xE0,0x22,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6A44, {0x61,0x80,0x6F,0x80,0xFF,0x80,0xFF,0xE0,0x6B,0xC0,0x7F,0xC0,0x7B,0xC0,0xEE,0x80,0xEE,0x80,0x7F,0xC0,0x63,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x6A47, {0x61,0x80,0x6F,0x00,0xFF,0x80,0xFF,0xC0,0x6E,0x40,0x71,0xC0,0x76,0xC0,0xFB,0x80,0xEF,0xC0,0x6F,0xE0,0x7B,0xA0,0x67,0xE0,0x00,0x00,}}, +{ 0x6A48, {0x61,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6E,0xC0,0x74,0x80,0x77,0xE0,0xF8,0x00,0xFF,0xE0,0x63,0x80,0x65,0xA0,0x78,0xE0,0x00,0x00,}}, +{ 0x6A4B, {0x20,0xC0,0x2F,0x00,0xFF,0xE0,0x3F,0x80,0x67,0xC0,0x7B,0xA0,0x73,0x80,0xAF,0xE0,0xA8,0x20,0x2B,0xA0,0x2B,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x6A58, {0x2F,0xC0,0x27,0x80,0xFF,0xE0,0x25,0x20,0x69,0xC0,0x71,0x00,0x7F,0xE0,0xAB,0x20,0xAD,0xE0,0x2B,0xA0,0x2B,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x6A59, {0x67,0x80,0x63,0xC0,0xFF,0xC0,0xF4,0xC0,0x6F,0xC0,0x70,0x20,0x77,0x80,0xE4,0x80,0xE7,0x80,0x66,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6A5F, {0x25,0x40,0x27,0x40,0xFB,0xA0,0x3F,0x60,0x6B,0xC0,0x7F,0xE0,0x71,0x80,0xAF,0xE0,0xA9,0x40,0x3E,0xC0,0x30,0xA0,0x23,0x60,0x00,0x00,}}, +{ 0x6A61, {0x23,0x80,0x25,0x00,0xFF,0xC0,0x2A,0x40,0x6F,0xC0,0x62,0x00,0x77,0x40,0xBB,0x80,0xAD,0xC0,0x26,0xA0,0x39,0x80,0x23,0x00,0x00,0x00,}}, +{ 0x6A62, {0x61,0x80,0x7F,0xE0,0xF5,0xC0,0xFF,0xC0,0x7F,0xE0,0x74,0x00,0x75,0xC0,0xF5,0x40,0xFD,0xC0,0x79,0xC0,0x71,0x40,0x71,0xC0,0x00,0x00,}}, +{ 0x6A66, {0x61,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6B,0x40,0x7F,0xC0,0x79,0x40,0xEF,0xC0,0xE7,0xC0,0x67,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6A72, {0x61,0x00,0x6F,0xC0,0xF7,0x80,0xF7,0x80,0x67,0x80,0x74,0x80,0x77,0x80,0xE3,0x80,0xFF,0xE0,0x67,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x6A78, {0x30,0x00,0x33,0xC0,0x7B,0xC0,0x7B,0xC0,0x33,0xC0,0x3A,0x40,0x38,0x00,0x77,0xE0,0x77,0xE0,0x37,0xE0,0x37,0xE0,0x35,0xE0,0x00,0x00,}}, +{ 0x6A7F, {0x20,0x00,0x2F,0xE0,0xF0,0x00,0x27,0x80,0x67,0x80,0x77,0x80,0x7F,0xC0,0xA0,0x00,0xA7,0x80,0x27,0x80,0x27,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0x6A80, {0x21,0x00,0x3F,0xE0,0xFF,0xC0,0x2B,0xC0,0x6B,0xC0,0x6F,0xC0,0x77,0x80,0xB4,0x80,0xA7,0x80,0x27,0x80,0x20,0x00,0x3F,0xE0,0x00,0x00,}}, +{ 0x6A84, {0x65,0x80,0x6F,0x80,0xFF,0xE0,0xFF,0xE0,0x6F,0xC0,0x75,0xC0,0x7F,0xC0,0xE4,0x80,0xE6,0x80,0x6A,0xC0,0x73,0x40,0x66,0x20,0x00,0x00,}}, +{ 0x6A8D, {0x61,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x67,0x80,0x74,0x80,0x77,0x80,0xE4,0x80,0xE7,0xC0,0x6B,0x20,0x6A,0xA0,0x71,0x80,0x00,0x00,}}, +{ 0x6A8E, {0x21,0x00,0x23,0x80,0xFF,0xE0,0x2C,0xC0,0x2B,0x40,0x7C,0xC0,0x7F,0xC0,0xA1,0x00,0xAF,0xE0,0x2A,0xA0,0x2F,0xA0,0x28,0xE0,0x00,0x00,}}, +{ 0x6A90, {0x61,0x00,0x63,0x80,0xFF,0xE0,0xFF,0xE0,0x6F,0xC0,0x79,0x00,0x7F,0xE0,0xEB,0x80,0xEF,0xC0,0x77,0xC0,0x77,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x6A97, {0x01,0x80,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0xE9,0x80,0x3C,0x00,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6A9C, {0x61,0x00,0x62,0x80,0xFF,0xC0,0xFF,0xE0,0x6F,0xC0,0x6B,0xC0,0x7F,0xC0,0xF7,0x80,0xE7,0x80,0x67,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x6AA0, {0x71,0x00,0xFD,0x00,0x7B,0xE0,0x7E,0x80,0xE9,0x80,0x69,0x80,0x6E,0x60,0x34,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6AA2, {0x61,0x00,0x63,0x00,0xF6,0x80,0xFF,0xC0,0x70,0x20,0x6E,0xC0,0x7B,0xC0,0xFE,0xC0,0xE4,0x80,0x66,0xC0,0x6B,0xA0,0x71,0x20,0x00,0x00,}}, +{ 0x6AA3, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xF5,0x80,0x6B,0xC0,0x7F,0xE0,0x70,0x00,0xEF,0xC0,0xEB,0xC0,0x6B,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x6AAA, {0x61,0x00,0x72,0x20,0xFF,0xE0,0xFF,0xC0,0x6C,0xE0,0x77,0xA0,0x71,0x00,0xFF,0xE0,0xE7,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x6AAC, {0x64,0x80,0x7F,0xE0,0xFF,0xE0,0xFF,0xE0,0x77,0xC0,0x7F,0xE0,0x73,0x40,0xFF,0xC0,0xE7,0x80,0x67,0xC0,0x7D,0xA0,0x63,0x00,0x00,0x00,}}, +{ 0x6AAE, {0x61,0x00,0x6F,0xC0,0xF7,0x80,0xFF,0xE0,0x67,0xC0,0x61,0x00,0x77,0x80,0xFF,0xE0,0xE7,0xE0,0x6F,0xE0,0x6F,0xC0,0x60,0xC0,0x00,0x00,}}, +{ 0x6AB3, {0x61,0x00,0x6F,0xE0,0xFF,0xC0,0xF7,0xC0,0x69,0x80,0x67,0xC0,0x7C,0x40,0xF7,0xC0,0xE7,0xC0,0x67,0xC0,0x66,0x40,0x78,0x20,0x00,0x00,}}, +{ 0x6AB8, {0x61,0x00,0x6F,0xE0,0xFF,0x40,0xF6,0xE0,0x6B,0x80,0x6F,0xC0,0x7B,0xC0,0xFF,0xE0,0xEF,0xE0,0x6F,0xE0,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x6ABB, {0x61,0x80,0x7F,0x80,0xFD,0xE0,0xFF,0xE0,0x7E,0x00,0x74,0xC0,0x7F,0x00,0xF0,0x00,0xEF,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6AC1, {0x61,0x00,0x6F,0xE0,0xFA,0xC0,0xFB,0xC0,0x6B,0xA0,0x73,0xA0,0x77,0x80,0xFB,0x00,0xEF,0xC0,0x6F,0xC0,0x63,0xC0,0x7F,0xA0,0x00,0x00,}}, +{ 0x6AC2, {0x60,0x00,0x6F,0xE0,0xFF,0xE0,0xFF,0xE0,0x6F,0xE0,0x72,0x80,0x77,0xE0,0xED,0x80,0xF7,0xC0,0x67,0xC0,0x65,0x80,0x67,0xE0,0x00,0x00,}}, +{ 0x6AC3, {0x60,0x00,0x6F,0xE0,0xFB,0xC0,0xFB,0xC0,0x6F,0xE0,0x7B,0xC0,0x7B,0xC0,0xEB,0xC0,0xEB,0xC0,0x6E,0x40,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x6AD1, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x78,0x40,0x70,0x00,0xFF,0xE0,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0x71,0x20,0x00,0x00,}}, +{ 0x6AD3, {0x22,0x00,0x27,0x80,0xF9,0x00,0x3F,0xC0,0x6F,0xC0,0x79,0x40,0x7F,0xC0,0xAB,0xC0,0xB7,0xA0,0x27,0x80,0x24,0x80,0x27,0x80,0x00,0x00,}}, +{ 0x6ADA, {0x30,0x00,0x37,0xE0,0x7F,0xE0,0x7F,0xE0,0x37,0xE0,0x3D,0xE0,0x3D,0xE0,0x75,0xA0,0x75,0xA0,0x35,0xE0,0x35,0xE0,0x34,0x60,0x00,0x00,}}, +{ 0x6ADB, {0x29,0x00,0x2F,0xE0,0xFB,0x40,0x32,0x40,0x6E,0xE0,0x7A,0xA0,0x7E,0xA0,0xAA,0xA0,0xAC,0xA0,0x2E,0xE0,0x2A,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6ADE, {0x64,0x80,0x65,0xE0,0xFB,0xC0,0xFF,0xC0,0x67,0xE0,0x7B,0x80,0x7F,0xA0,0xE5,0xE0,0xF7,0xC0,0x77,0xE0,0x74,0x80,0x65,0x80,0x00,0x00,}}, +{ 0x6ADF, {0x69,0x40,0x6B,0x40,0xFF,0xE0,0xFF,0xE0,0x77,0xE0,0x7F,0xE0,0x71,0x00,0xFF,0xE0,0xE7,0x80,0x69,0x40,0x71,0x20,0x61,0x00,0x00,0x00,}}, +{ 0x6AE8, {0x61,0x80,0x6F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0xEB,0xC0,0xF7,0xC0,0x77,0xC0,0x65,0xC0,0x7F,0xE0,0x00,0x00,}}, +{ 0x6AEA, {0x60,0x00,0x7F,0xE0,0xF7,0xC0,0xFF,0xE0,0x77,0xC0,0x7B,0xC0,0x72,0xA0,0xF1,0x00,0xF5,0xC0,0x75,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x6AFA, {0x60,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x7D,0xC0,0x6D,0xC0,0x71,0x00,0xFF,0xE0,0xF7,0xA0,0x77,0xA0,0x7F,0xE0,0x77,0xA0,0x00,0x00,}}, +{ 0x6AFB, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6B,0xC0,0x6F,0xC0,0x7B,0x40,0xF3,0x20,0xFF,0xE0,0x67,0x80,0x63,0x80,0x6E,0x40,0x00,0x00,}}, +{ 0x6B04, {0x20,0x00,0x3E,0xE0,0xF2,0xA0,0x3E,0xE0,0x71,0x20,0x7F,0xE0,0x77,0xA0,0xB7,0xA0,0xB7,0xA0,0x33,0xA0,0x3D,0x60,0x31,0x60,0x00,0x00,}}, +{ 0x6B05, {0x66,0xC0,0x6B,0xC0,0xFF,0xC0,0xFF,0xC0,0x6B,0xC0,0x7F,0xE0,0x65,0x80,0xEF,0x40,0xF7,0xA0,0x6F,0xC0,0x63,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x6B0A, {0x64,0x80,0x7F,0xE0,0xFC,0xC0,0xFF,0xC0,0x6F,0xC0,0x77,0xE0,0x75,0x80,0xEF,0xC0,0xEF,0xC0,0x67,0xC0,0x67,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x6B12, {0x6E,0x80,0x7F,0xC0,0xE7,0xC0,0x6E,0xC0,0xFF,0xE0,0x6B,0xC0,0xFF,0xA0,0x64,0xC0,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6B16, {0x61,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xE0,0x77,0xE0,0x7F,0xE0,0x7F,0x80,0xF8,0x80,0xEF,0x80,0x6F,0xA0,0x67,0xA0,0x78,0xE0,0x00,0x00,}}, +{ 0x6B1D, {0x2A,0x80,0xF7,0xE0,0x7F,0xC0,0xFF,0xA0,0x6A,0x80,0x7F,0x80,0x78,0x80,0x4F,0xE0,0x7A,0x80,0x59,0x80,0x78,0x80,0xC0,0x80,0x00,0x00,}}, +{ 0x6B1F, {0x72,0x00,0x7F,0xC0,0xFF,0xC0,0xFF,0xC0,0x7F,0xC0,0x75,0xC0,0x7F,0xC0,0xF5,0xC0,0xFF,0xC0,0x7F,0xA0,0x7F,0xA0,0x72,0x60,0x00,0x00,}}, +{ 0x6B20, {0x20,0x00,0x20,0x00,0x3F,0xE0,0x20,0x40,0x44,0x80,0x44,0x00,0x84,0x00,0x06,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x6B21, {0x04,0x00,0x04,0x00,0x44,0x00,0x27,0xE0,0x09,0x40,0x09,0x80,0x21,0x00,0x43,0x00,0x42,0x80,0x84,0x80,0x98,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x6B23, {0x05,0x00,0x09,0x00,0x71,0x00,0x43,0xE0,0x7E,0x40,0x55,0x00,0x51,0x00,0x51,0x00,0x51,0x00,0x52,0x80,0x94,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x6B27, {0x01,0x00,0x7D,0x00,0x4B,0xE0,0x4A,0xA0,0x6C,0xC0,0x50,0x80,0x58,0x80,0x69,0x00,0x65,0x00,0x42,0x80,0x7C,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x6B32, {0x51,0x00,0x49,0x00,0x89,0x00,0x23,0xE0,0x32,0xC0,0x4C,0x80,0x48,0x80,0xF8,0x80,0x49,0x80,0x7A,0x40,0x4C,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x6B37, {0x09,0x00,0x71,0x00,0xF9,0x00,0xA3,0xE0,0xFF,0xA0,0x65,0xC0,0x61,0x80,0xF9,0x80,0x69,0x80,0x7A,0x80,0x74,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x6B38, {0x21,0x00,0x31,0x00,0x39,0x00,0xFF,0xE0,0xC3,0xA0,0x7D,0xC0,0x61,0x80,0xB1,0x80,0xFD,0x80,0x32,0x80,0x4C,0x40,0x88,0x20,0x00,0x00,}}, +{ 0x6B39, {0x21,0x00,0x31,0x00,0xFD,0x00,0x3B,0xE0,0x4B,0xA0,0xFD,0xC0,0x09,0x80,0x69,0x80,0x69,0x80,0x69,0x80,0x0A,0x40,0x1C,0x20,0x00,0x00,}}, +{ 0x6B3A, {0x49,0x00,0x49,0x00,0xFD,0x00,0x49,0xE0,0x7A,0x40,0x4C,0x80,0x78,0x80,0x48,0x80,0xFC,0x80,0x31,0x80,0x4A,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x6B3D, {0x21,0x00,0x31,0x00,0x79,0x00,0x4B,0xE0,0xF2,0x40,0x25,0x00,0xF9,0x00,0x21,0x00,0x79,0x00,0x72,0x80,0x3C,0x40,0xE8,0x20,0x00,0x00,}}, +{ 0x6B3E, {0x21,0x00,0x21,0x00,0xFD,0x00,0x7B,0xE0,0x02,0x40,0x7D,0x00,0x01,0x00,0xFD,0x00,0x31,0x00,0x6A,0x80,0xA4,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x6B43, {0x0D,0x00,0x71,0x00,0xF9,0x00,0xFF,0xE0,0x23,0xA0,0xED,0xC0,0xA5,0x80,0xA5,0x80,0xAD,0x80,0xA5,0x80,0xFE,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x6B47, {0x01,0x00,0x79,0x00,0x79,0x00,0x7B,0xE0,0x7B,0xA0,0x65,0xC0,0x7D,0x80,0xF5,0x80,0xFD,0x80,0x6D,0x80,0x76,0x40,0x5C,0x20,0x00,0x00,}}, +{ 0x6B49, {0x69,0x00,0xF3,0x00,0xFF,0x00,0x7D,0xE0,0x77,0xA0,0xFF,0xC0,0x75,0x80,0x7D,0x80,0x79,0x80,0x75,0x80,0xF2,0x40,0x74,0x20,0x00,0x00,}}, +{ 0x6B4C, {0x01,0x00,0xFD,0x00,0x69,0x00,0x6B,0xE0,0x6A,0xC0,0x0C,0x80,0xF9,0x00,0x09,0x00,0x69,0x80,0x6A,0x80,0x6C,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x6B4E, {0x71,0x00,0x71,0x00,0xFF,0xE0,0x7A,0x20,0x7D,0x40,0x79,0x00,0x21,0x00,0x79,0x00,0xF9,0x80,0xFE,0x80,0x4C,0x40,0x88,0x20,0x00,0x00,}}, +{ 0x6B50, {0x01,0x00,0xFD,0x00,0xB9,0x00,0xF9,0xE0,0xFB,0xA0,0x83,0xC0,0xFD,0x80,0xF5,0x80,0xFD,0x80,0xF9,0x80,0xFE,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x6B53, {0x41,0x00,0x41,0x00,0x7D,0x00,0xA1,0xE0,0xFA,0x40,0x7C,0x80,0x70,0x80,0xFC,0x80,0x78,0x80,0x79,0x80,0x7A,0x40,0x44,0x20,0x00,0x00,}}, +{ 0x6B54, {0x11,0x00,0x1D,0x00,0x7F,0x00,0x7F,0xE0,0x77,0xA0,0x5F,0xC0,0x69,0x80,0x6D,0x80,0x6D,0x80,0x69,0x80,0xBE,0x40,0x64,0x20,0x00,0x00,}}, +{ 0x6B59, {0x21,0x00,0x31,0x00,0x79,0x00,0xFF,0xE0,0x6B,0xA0,0x7D,0xC0,0xFD,0x80,0x7D,0x80,0xFD,0x80,0xFD,0x80,0xB6,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x6B5B, {0x11,0x00,0x11,0x00,0x29,0x00,0x7F,0xE0,0x83,0xA0,0x7D,0xC0,0x75,0x80,0x7D,0x80,0x69,0x80,0x7D,0x80,0x52,0x40,0xA4,0x20,0x00,0x00,}}, +{ 0x6B5F, {0x61,0x80,0x77,0x80,0x7B,0x80,0x7F,0xE0,0x4B,0xA0,0x6B,0xC0,0x6F,0x80,0x6B,0x80,0xFF,0x80,0xFF,0x80,0x26,0x40,0xC4,0x20,0x00,0x00,}}, +{ 0x6B61, {0x71,0x00,0xFD,0x00,0xF9,0x00,0xFF,0xE0,0xFF,0xA0,0x7D,0xC0,0x51,0x80,0xFD,0x80,0x79,0x80,0x79,0x80,0x7E,0x40,0x44,0x20,0x00,0x00,}}, +{ 0x6B62, {0x04,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6B63, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x27,0x80,0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6B64, {0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x40,0x5F,0x80,0x51,0x00,0x51,0x00,0x51,0x00,0x51,0x00,0x59,0x20,0x61,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x6B66, {0x01,0x80,0x3D,0x40,0x01,0x40,0xFF,0xE0,0x11,0x00,0x11,0x00,0x5F,0x00,0x51,0x00,0x50,0x80,0x5E,0xA0,0xF0,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x6B69, {0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0,0x04,0x00,0x24,0x80,0x24,0xC0,0x45,0x40,0x06,0x00,0x18,0x00,0xE0,0x00,0x00,0x00,}}, +{ 0x6B6A, {0x00,0x00,0xFF,0xE0,0x06,0x00,0x1F,0x80,0xE4,0x40,0x04,0x00,0x7F,0xC0,0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6B6F, {0x04,0x00,0x24,0x00,0x27,0xC0,0xFF,0xE0,0x7F,0xC0,0x55,0x40,0x7F,0xC0,0x4E,0x40,0x55,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x6B73, {0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0,0x7F,0xE0,0x41,0x00,0x7F,0x40,0x49,0xC0,0x5C,0x80,0x7A,0xA0,0x6B,0x60,0x98,0x20,0x00,0x00,}}, +{ 0x6B74, {0x00,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,0x5D,0x80,0x6A,0xC0,0x48,0xA0,0x42,0x00,0x53,0x80,0x92,0x00,0xBF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x6B78, {0x20,0x00,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x48,0x00,0x7F,0xE0,0x35,0xC0,0x7B,0xC0,0x63,0xC0,0x7B,0xC0,0xE1,0x80,0x00,0x00,}}, +{ 0x6B79, {0x00,0x00,0xFF,0xE0,0x08,0x00,0x0F,0x80,0x10,0x80,0x10,0x80,0x29,0x80,0x45,0x00,0x06,0x00,0x04,0x00,0x18,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x6B7B, {0x00,0x00,0xFF,0xE0,0x22,0x00,0x3A,0x40,0x2A,0x40,0x4A,0x80,0x6B,0x00,0x92,0x00,0x12,0x00,0x22,0x20,0x42,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x6B7F, {0x01,0x00,0xF9,0x00,0x63,0xC0,0x7A,0x40,0x6C,0x40,0x68,0x80,0x6F,0xC0,0xB2,0x40,0x12,0x80,0x21,0x80,0x43,0x80,0x9C,0x60,0x00,0x00,}}, +{ 0x6B80, {0x00,0x40,0xF9,0x80,0x67,0x00,0x79,0x00,0x49,0x00,0x4F,0xE0,0xA9,0x00,0x33,0x00,0x13,0x80,0x24,0x80,0x48,0x40,0x90,0x20,0x00,0x00,}}, +{ 0x6B83, {0x01,0x00,0xF9,0x00,0x67,0xC0,0x77,0xC0,0x55,0x40,0x55,0x40,0xFF,0xE0,0x23,0x00,0x23,0x80,0x64,0x80,0x48,0x40,0x90,0x20,0x00,0x00,}}, +{ 0x6B84, {0x01,0x00,0xFF,0x00,0x63,0x80,0x7C,0x80,0x48,0xC0,0x49,0x20,0xAE,0x00,0x30,0x80,0x17,0x00,0x24,0x40,0x41,0x80,0x8E,0x00,0x00,0x00,}}, +{ 0x6B86, {0x01,0x00,0xFD,0x00,0x21,0x00,0x3A,0x40,0x2A,0x60,0x4F,0xA0,0x68,0x00,0x97,0xC0,0x14,0x40,0x24,0x40,0x47,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x6B89, {0x01,0x00,0x7D,0x00,0x23,0xE0,0x3E,0x20,0x2B,0xA0,0x2A,0xA0,0x5B,0xA0,0x1A,0xA0,0x13,0xA0,0x12,0xA0,0x20,0x20,0x40,0x40,0x00,0x00,}}, +{ 0x6B8A, {0x01,0x00,0xFD,0x00,0x47,0xC0,0x79,0x00,0x51,0x00,0x5F,0xE0,0xB1,0x00,0x23,0x80,0x25,0x40,0x39,0x20,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x6B8B, {0x01,0x80,0xF9,0x40,0x67,0xC0,0x79,0x00,0x57,0xC0,0x51,0x00,0xFF,0xE0,0x21,0x40,0x20,0xC0,0x40,0xA0,0x43,0x60,0x8C,0x20,0x00,0x00,}}, +{ 0x6B8D, {0x00,0x40,0xF9,0x80,0x6F,0x40,0x75,0x20,0x58,0x20,0x5F,0xC0,0xF0,0x80,0x33,0x80,0x3F,0xE0,0x61,0x00,0x41,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x6B95, {0x01,0x00,0xFB,0x00,0x6F,0xC0,0x76,0x80,0x52,0x80,0x5F,0xE0,0xF0,0x00,0x27,0xC0,0x24,0x40,0x64,0x40,0x47,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x6B96, {0x00,0x80,0xFB,0xE0,0x20,0x80,0x75,0xC0,0x55,0x40,0x55,0xC0,0xB5,0x40,0x35,0xC0,0x25,0x40,0x25,0xC0,0x47,0xE0,0x84,0x00,0x00,0x00,}}, +{ 0x6B98, {0x01,0x80,0xF9,0x40,0x67,0xE0,0x7F,0xC0,0x51,0xA0,0x56,0x60,0xB1,0xA0,0x23,0xE0,0x2F,0x40,0x61,0xA0,0x43,0xE0,0x8C,0x20,0x00,0x00,}}, +{ 0x6B9E, {0x00,0x00,0xF7,0xC0,0x67,0xC0,0x77,0xC0,0x57,0xC0,0x54,0x40,0xF7,0xC0,0x24,0x40,0x27,0xC0,0x67,0xC0,0x46,0xC0,0x98,0x20,0x00,0x00,}}, +{ 0x6BA4, {0x04,0x00,0xFF,0xE0,0x67,0x80,0x7F,0x80,0x54,0x80,0x57,0x80,0xFF,0xE0,0x24,0x00,0x27,0xC0,0x7B,0xC0,0x47,0x40,0x8B,0x80,0x00,0x00,}}, +{ 0x6BAA, {0x01,0x00,0xFF,0xC0,0x67,0x80,0x77,0x80,0x5F,0xE0,0x58,0x40,0xFF,0xC0,0x27,0x80,0x27,0x80,0x67,0x80,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6BAB, {0x00,0x00,0xFF,0xC0,0x6F,0xC0,0x7C,0xC0,0x5F,0xC0,0x59,0x40,0xFF,0xC0,0x2B,0x40,0x2F,0xC0,0x7F,0xE0,0x43,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x6BAF, {0x01,0x00,0xFF,0xE0,0x6F,0xC0,0x77,0xC0,0x59,0x80,0x57,0xC0,0xFC,0x40,0x27,0xC0,0x27,0xC0,0x67,0xC0,0x46,0xC0,0x98,0x20,0x00,0x00,}}, +{ 0x6BB1, {0x05,0x80,0xF5,0xC0,0x7F,0xC0,0x7F,0xE0,0x7B,0x80,0x7B,0xC0,0xEB,0xC0,0xFB,0xC0,0x7A,0x80,0x6F,0xE0,0x7B,0x60,0x82,0x20,0x00,0x00,}}, +{ 0x6BB2, {0x0B,0x80,0xFB,0xC0,0x6F,0xC0,0x71,0x80,0x7F,0xE0,0x6B,0x80,0xFB,0xC0,0xFB,0xC0,0x7B,0x80,0x7A,0xE0,0x4F,0xE0,0xB9,0x20,0x00,0x00,}}, +{ 0x6BB3, {0x00,0x00,0x3F,0x00,0x21,0x00,0x21,0x20,0x21,0xE0,0xC0,0x00,0x7F,0x80,0x31,0x00,0x1A,0x00,0x0E,0x00,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x6BB4, {0x00,0x00,0x7D,0x80,0x49,0x80,0x49,0xA0,0x6A,0xA0,0x54,0x60,0x53,0xC0,0x69,0x40,0x69,0x80,0x41,0x80,0x7B,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x6BB5, {0x18,0x00,0x63,0x80,0x42,0x80,0x72,0xA0,0x44,0xA0,0x48,0x60,0x77,0xC0,0x44,0x40,0x52,0x80,0x61,0x00,0xC2,0x80,0x4C,0x60,0x00,0x00,}}, +{ 0x6BB7, {0x18,0x00,0x63,0x80,0x7A,0x80,0x7A,0xA0,0x7A,0x60,0x4C,0x00,0x7F,0xC0,0x42,0x40,0x79,0x80,0x49,0x80,0x4B,0x80,0xBC,0x60,0x00,0x00,}}, +{ 0x6BBA, {0x08,0x00,0x0B,0x80,0x72,0x80,0x3A,0xA0,0xE4,0x60,0x28,0x00,0xFF,0xC0,0x32,0x40,0x69,0x40,0xA1,0x80,0x22,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x6BBB, {0x20,0x00,0x23,0x80,0xFA,0x80,0x72,0xA0,0x04,0x60,0x7C,0x00,0x4B,0xC0,0xF2,0x40,0x51,0x80,0x59,0x80,0x52,0x80,0x8C,0x60,0x00,0x00,}}, +{ 0x6BBC, {0x20,0x00,0xFD,0x80,0x79,0x80,0x79,0xA0,0x7D,0xA0,0x4A,0x60,0xB7,0xC0,0x02,0x40,0x71,0x80,0x79,0x80,0x53,0x80,0xAC,0x60,0x00,0x00,}}, +{ 0x6BBF, {0x00,0x00,0x7D,0x80,0x45,0x80,0x7D,0xA0,0x6A,0xA0,0x6A,0x60,0x7F,0xC0,0x69,0x40,0x7D,0x80,0xB1,0x80,0xAA,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x6BC0, {0x20,0x00,0x5B,0x80,0x4A,0x80,0x4A,0xA0,0x4C,0xA0,0x78,0x60,0x6F,0xC0,0x32,0x40,0x7A,0x80,0x21,0x80,0x3B,0x80,0xEC,0x60,0x00,0x00,}}, +{ 0x6BC5, {0x10,0x00,0x11,0x80,0x7D,0x80,0x29,0xA0,0xFE,0xA0,0x64,0x60,0xB7,0xC0,0x59,0x40,0xB5,0x80,0xD1,0x80,0x12,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x6BC6, {0x00,0x00,0xFD,0x80,0xB9,0x80,0xF9,0xA0,0xFA,0xA0,0x84,0x60,0xFF,0xC0,0xF5,0x40,0xFD,0x80,0xF9,0x80,0xFD,0x40,0x86,0x20,0x00,0x00,}}, +{ 0x6BCB, {0x00,0x00,0x7F,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0xFF,0xE0,0x64,0x80,0x64,0x80,0x64,0x80,0x7F,0xE0,0x41,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x6BCD, {0x00,0x00,0x3F,0x80,0x24,0x80,0x22,0x80,0xFF,0xE0,0x28,0x80,0x24,0x80,0x24,0x80,0x40,0x80,0x7F,0xE0,0x00,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x6BCE, {0x20,0x00,0x20,0x00,0x7F,0xE0,0x5F,0x80,0x94,0x80,0x14,0x80,0xFF,0xE0,0x24,0x80,0x24,0x80,0x7F,0xC0,0x00,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x6BD2, {0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x3F,0x80,0xFF,0xE0,0x24,0x80,0x3F,0xC0,0x61,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x6BD3, {0x61,0x80,0x61,0x80,0x7F,0xE0,0xF9,0xC0,0xEF,0xE0,0x68,0x20,0xFF,0xC0,0x6B,0xC0,0x7F,0xC0,0x7F,0xE0,0x15,0xE0,0x38,0x20,0x00,0x00,}}, +{ 0x6BD4, {0x22,0x00,0x22,0x00,0x22,0x00,0x22,0x40,0x3E,0x40,0x22,0x80,0x23,0x00,0x22,0x00,0x26,0x00,0x2A,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x6BD8, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x22,0x00,0x3E,0xC0,0x23,0x00,0x22,0x20,0x3A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x6BDB, {0x01,0x80,0x06,0x00,0x38,0x00,0x08,0x00,0x7F,0xC0,0x08,0x00,0x08,0x00,0xFF,0xE0,0x08,0x00,0x08,0x20,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x6BDF, {0x04,0x00,0x64,0xC0,0x45,0xE0,0x87,0x20,0x38,0x00,0xE3,0x00,0x3C,0x00,0x0F,0x80,0x7F,0xE0,0xFF,0xE0,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x6BEB, {0x04,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x43,0x40,0xBC,0x00,0x3F,0x80,0x3F,0xC0,0x78,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x6BEC, {0x11,0x80,0x23,0x40,0xEF,0xC0,0x79,0x40,0xE5,0x40,0x65,0x80,0x73,0x80,0xE5,0x40,0x79,0x20,0x63,0x20,0x60,0x20,0x3F,0xE0,0x00,0x00,}}, +{ 0x6BEF, {0x11,0x40,0x25,0x40,0xE5,0x80,0x7B,0x80,0xE7,0x80,0x69,0x40,0x75,0x40,0xE5,0x80,0x6B,0x80,0x64,0xA0,0x68,0x20,0x3F,0xE0,0x00,0x00,}}, +{ 0x6BF3, {0x03,0x00,0x3C,0x00,0x3F,0x00,0x3F,0x80,0x78,0x40,0x07,0xC0,0x18,0xC0,0x73,0x80,0x7B,0xC0,0x7F,0xE0,0xF7,0xA0,0x3D,0xE0,0x00,0x00,}}, +{ 0x6C08, {0x10,0x40,0xFF,0x80,0x7F,0x80,0x7B,0xC0,0x7B,0x80,0x7F,0x80,0x7D,0x80,0x65,0xE0,0x7F,0x80,0x7D,0xA0,0x7F,0xA0,0xE0,0xE0,0x00,0x00,}}, +{ 0x6C0F, {0x01,0x00,0x06,0x00,0x3C,0x00,0x24,0x00,0x25,0xC0,0x3E,0x00,0x22,0x00,0x21,0x00,0x21,0x00,0x2C,0xA0,0x30,0x60,0xC0,0x20,0x00,0x00,}}, +{ 0x6C11, {0x00,0x00,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x22,0x40,0x22,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x28,0xA0,0x30,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x6C13, {0x60,0x00,0x6F,0xC0,0x68,0x40,0xFF,0xC0,0x8B,0x40,0x89,0x00,0x8F,0xE0,0x89,0x00,0xF9,0x80,0x7A,0xA0,0x0C,0x60,0x30,0x20,0x00,0x00,}}, +{ 0x6C14, {0x20,0x00,0x30,0x00,0x7F,0xC0,0x7F,0x00,0x80,0x00,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x60,0x00,0x60,0x00,0x20,0x00,0x00,}}, +{ 0x6C17, {0x20,0x00,0x20,0x00,0x3F,0xC0,0x40,0x00,0x9F,0x00,0x7F,0x80,0x02,0x80,0x04,0x80,0x3C,0x80,0x0E,0xA0,0x32,0x60,0xC0,0x20,0x00,0x00,}}, +{ 0x6C1B, {0x20,0x00,0x30,0x00,0x7F,0xC0,0x7F,0x80,0x80,0x00,0x7F,0x80,0x3C,0x80,0x62,0x80,0xFF,0x80,0x12,0x60,0x22,0x60,0xCC,0x20,0x00,0x00,}}, +{ 0x6C23, {0x20,0x00,0x30,0x00,0x7F,0xC0,0x7F,0x00,0x80,0x00,0x7F,0x80,0x29,0x80,0x3A,0x80,0x7E,0x80,0x1E,0x60,0x6B,0x60,0x08,0x20,0x00,0x00,}}, +{ 0x6C24, {0x20,0x00,0x30,0x00,0x7F,0xC0,0x7F,0x00,0x80,0x00,0x7F,0x80,0x7F,0x80,0x6B,0x80,0x7F,0x80,0x77,0x60,0x7F,0x60,0x61,0x20,0x00,0x00,}}, +{ 0x6C34, {0x04,0x00,0x04,0x00,0x04,0x40,0xFC,0x40,0x16,0x80,0x15,0x00,0x25,0x00,0x24,0x80,0x44,0x40,0x84,0x20,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6C37, {0x04,0x00,0x24,0x00,0x24,0x40,0x06,0x40,0xF6,0x80,0x15,0x00,0x25,0x00,0x24,0x80,0x44,0x40,0x84,0x20,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6C38, {0x0C,0x00,0x02,0x00,0x1C,0x00,0x04,0x40,0x06,0x40,0xFE,0x80,0x15,0x00,0x15,0x00,0x24,0x80,0xC4,0x60,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x6C3E, {0x20,0x00,0x27,0xC0,0x04,0x40,0x84,0x40,0x44,0x40,0x04,0x40,0x24,0x80,0x24,0x00,0x24,0x00,0x44,0x20,0x44,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x6C40, {0x20,0x00,0x2F,0xE0,0x01,0x00,0x81,0x00,0x41,0x00,0x01,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x43,0x00,0x00,0x00,}}, +{ 0x6C41, {0x21,0x00,0x21,0x00,0x01,0x00,0x81,0x00,0x5F,0xE0,0x01,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6C42, {0x04,0x80,0x04,0x80,0xFF,0xE0,0x04,0x00,0x06,0x40,0x46,0x40,0x25,0x80,0x0D,0x00,0x34,0x80,0xC4,0x40,0x04,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x6C4E, {0x20,0x00,0x27,0x80,0x04,0x80,0x84,0x80,0x46,0x80,0x05,0x80,0x25,0x80,0x24,0x80,0x24,0x80,0x48,0xA0,0x48,0xA0,0x50,0x60,0x00,0x00,}}, +{ 0x6C50, {0x11,0x00,0x11,0x00,0x01,0xE0,0x43,0x20,0x22,0x20,0x05,0x40,0x18,0xC0,0x10,0x40,0x10,0x80,0x21,0x00,0x26,0x00,0x28,0x00,0x00,0x00,}}, +{ 0x6C55, {0x10,0x80,0x10,0x80,0x00,0x80,0x44,0xA0,0x24,0xA0,0x04,0xA0,0x14,0xA0,0x14,0xA0,0x34,0xA0,0x27,0xE0,0x24,0x20,0x24,0x20,0x00,0x00,}}, +{ 0x6C57, {0x20,0x00,0x2F,0xC0,0x01,0x00,0x81,0x00,0x41,0x00,0x1F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6C5A, {0x20,0x00,0x2F,0xC0,0x01,0x00,0x9F,0xE0,0x42,0x00,0x02,0x00,0x27,0xC0,0x24,0x40,0x20,0x40,0x40,0x40,0x40,0x40,0x41,0x80,0x00,0x00,}}, +{ 0x6C5D, {0x22,0x00,0x22,0x00,0x02,0x00,0x9F,0xE0,0x44,0x80,0x04,0x80,0x24,0x80,0x2E,0x80,0x29,0x00,0x41,0x80,0x46,0x40,0x58,0x40,0x00,0x00,}}, +{ 0x6C5E, {0x00,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x06,0x40,0xF6,0x40,0x15,0x80,0x25,0x80,0x24,0x80,0xC4,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x6C5F, {0x20,0x00,0x2F,0xC0,0x01,0x00,0x81,0x00,0x41,0x00,0x01,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6C60, {0x21,0x00,0x29,0x00,0x09,0x00,0x89,0xC0,0x4F,0x40,0x39,0x40,0x09,0x40,0x29,0x40,0x29,0x80,0x48,0x20,0x48,0x20,0x47,0xE0,0x00,0x00,}}, +{ 0x6C62, {0x21,0x00,0x21,0x00,0x01,0x00,0x81,0x00,0x4F,0xC0,0x01,0x00,0x21,0x00,0x21,0x00,0x61,0x00,0x41,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6C68, {0x10,0x00,0x17,0xE0,0x04,0x20,0x44,0x20,0x24,0x20,0x07,0xE0,0x14,0x20,0x14,0x20,0x34,0x20,0x24,0x20,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x6C6A, {0x20,0x00,0x3F,0xE0,0x01,0x00,0x81,0x00,0x41,0x00,0x0F,0xC0,0x21,0x00,0x21,0x00,0x61,0x00,0x41,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6C70, {0x21,0x00,0x21,0x00,0x01,0x00,0x9F,0xE0,0x41,0x00,0x01,0x00,0x23,0x00,0x22,0x80,0x44,0x80,0x4E,0x40,0x91,0x40,0xA0,0x20,0x00,0x00,}}, +{ 0x6C72, {0x40,0x00,0x4F,0x80,0x28,0x80,0x89,0x00,0x4D,0xC0,0x0C,0x40,0x2A,0x80,0x2A,0x80,0x49,0x00,0x51,0x80,0xA2,0x40,0xAC,0x20,0x00,0x00,}}, +{ 0x6C73, {0x20,0x00,0x2F,0xE0,0x08,0x00,0x8F,0xC0,0x4A,0x40,0x0A,0x40,0x29,0x80,0x29,0x80,0x69,0x80,0x5B,0x80,0x5C,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x6C7A, {0x22,0x00,0x22,0x00,0x1F,0x80,0x82,0x80,0x42,0x80,0x02,0x80,0x3F,0xE0,0x22,0x00,0x45,0x00,0x48,0x80,0x90,0x40,0xA0,0x20,0x00,0x00,}}, +{ 0x6C7D, {0x24,0x00,0x24,0x00,0x0F,0xC0,0x97,0x80,0x40,0x00,0x1F,0x80,0x00,0x80,0x20,0x80,0x20,0x80,0x20,0x60,0x40,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x6C7E, {0x23,0x80,0x21,0x80,0x04,0x80,0x88,0x80,0x48,0x40,0x1F,0xA0,0x22,0x80,0x22,0x80,0x66,0x80,0x44,0x80,0x48,0x80,0x51,0x80,0x00,0x00,}}, +{ 0x6C81, {0x21,0x00,0x21,0x80,0x00,0x00,0x82,0x00,0x42,0x00,0x0A,0x40,0x2A,0x20,0x3A,0x20,0x72,0x00,0x42,0x40,0x42,0x40,0x41,0xC0,0x00,0x00,}}, +{ 0x6C82, {0x20,0x40,0x21,0x80,0x0E,0x00,0x88,0x00,0x4F,0xE0,0x09,0x80,0x29,0x80,0x29,0x80,0x69,0x80,0x59,0x80,0x51,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x6C83, {0x20,0x40,0x21,0x80,0x0F,0x00,0x81,0x00,0x41,0x00,0x1F,0xE0,0x21,0x00,0x41,0x00,0x42,0x80,0x84,0x80,0x88,0x40,0xB0,0x20,0x00,0x00,}}, +{ 0x6C88, {0x21,0x00,0x21,0x00,0x01,0x00,0x8F,0xE0,0x49,0x40,0x11,0x00,0x41,0x00,0x43,0x00,0x43,0x00,0x85,0x20,0x89,0x20,0x90,0xE0,0x00,0x00,}}, +{ 0x6C8C, {0x21,0x00,0x21,0x00,0x01,0xE0,0x9F,0x40,0x49,0x40,0x09,0x40,0x29,0x40,0x2F,0xC0,0x29,0x40,0x41,0x20,0x41,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x6C8D, {0x20,0x00,0x3F,0xE0,0x02,0x00,0x87,0x80,0x44,0x80,0x04,0x80,0x24,0x80,0x2F,0x80,0x69,0x80,0x41,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6C90, {0x21,0x00,0x21,0x00,0x01,0x00,0x9F,0xE0,0x43,0x00,0x03,0x00,0x23,0x80,0x25,0x80,0x65,0x40,0x59,0x20,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6C92, {0x24,0x00,0x27,0xC0,0x04,0x40,0x88,0x40,0x51,0xC0,0x00,0x00,0x2F,0xC0,0x24,0x40,0x62,0x80,0x43,0x00,0x47,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x6C93, {0x04,0x00,0x04,0x40,0x7F,0x80,0x15,0x00,0x24,0x80,0xCC,0x60,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6C96, {0x20,0x80,0x10,0x80,0x07,0xE0,0x44,0xA0,0x24,0xA0,0x04,0xA0,0x14,0xA0,0x17,0xE0,0x14,0xA0,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x6C99, {0x21,0x00,0x21,0x00,0x01,0x00,0x89,0x40,0x49,0x40,0x09,0x60,0x31,0xA0,0x23,0x80,0x40,0x80,0x41,0x00,0x86,0x00,0xB8,0x00,0x00,0x00,}}, +{ 0x6C9A, {0x21,0x00,0x21,0x00,0x01,0x00,0x89,0x00,0x49,0xC0,0x09,0x00,0x29,0x00,0x29,0x00,0x69,0x00,0x49,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6C9B, {0x21,0x00,0x21,0x00,0x1F,0xE0,0x8F,0xE0,0x41,0x00,0x0F,0xC0,0x29,0x40,0x29,0x40,0x69,0x40,0x49,0xC0,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6CA1, {0x20,0x00,0x27,0x80,0x04,0x80,0x84,0xA0,0x48,0x60,0x10,0x00,0x2F,0xC0,0x24,0x40,0x22,0x80,0x41,0x00,0x46,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x6CA2, {0x20,0x00,0x2F,0xC0,0x08,0x40,0x88,0x40,0x4F,0xC0,0x09,0x40,0x29,0x00,0x29,0x00,0x48,0x80,0x50,0x80,0x90,0x40,0xA0,0x20,0x00,0x00,}}, +{ 0x6CAB, {0x21,0x00,0x21,0x00,0x1F,0xE0,0x81,0x00,0x41,0x00,0x0F,0xC0,0x21,0x00,0x23,0x80,0x25,0x80,0x49,0x40,0x51,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x6CAE, {0x20,0x00,0x27,0x80,0x04,0x80,0x84,0x80,0x47,0x80,0x04,0x80,0x24,0x80,0x27,0x80,0x64,0x80,0x44,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6CB1, {0x21,0x00,0x23,0x00,0x0F,0xE0,0x9C,0x00,0x44,0x00,0x04,0x40,0x25,0x80,0x27,0x00,0x64,0x00,0x44,0x20,0x44,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x6CB3, {0x40,0x00,0x3F,0xE0,0x00,0x40,0x8F,0x40,0x49,0x40,0x09,0x40,0x09,0x40,0x2F,0x40,0x29,0x40,0x20,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x6CB8, {0x45,0x00,0x25,0x00,0x1F,0xC0,0x85,0x40,0x5F,0xC0,0x15,0x40,0x35,0x00,0x3F,0xE0,0x55,0x20,0x49,0x60,0x89,0x00,0x91,0x00,0x00,0x00,}}, +{ 0x6CB9, {0x10,0x80,0x10,0x80,0x00,0x80,0x47,0xE0,0x24,0xA0,0x04,0xA0,0x14,0xA0,0x17,0xE0,0x14,0xA0,0x24,0xA0,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x6CBA, {0x10,0x00,0x17,0xE0,0x04,0xA0,0x44,0xA0,0x24,0xA0,0x07,0xE0,0x14,0xA0,0x14,0xA0,0x34,0xA0,0x24,0xA0,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x6CBB, {0x22,0x00,0x22,0x00,0x02,0x00,0x84,0x80,0x44,0xC0,0x3F,0x20,0x00,0x00,0x2F,0xC0,0x48,0x40,0x48,0x40,0x8F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x6CBC, {0x20,0x00,0x17,0xE0,0x01,0x20,0x42,0x20,0x22,0x20,0x04,0x40,0x08,0x00,0x27,0xE0,0x24,0x20,0x24,0x20,0x47,0xE0,0x44,0x20,0x00,0x00,}}, +{ 0x6CBD, {0x21,0x00,0x21,0x00,0x1F,0xE0,0x8F,0xE0,0x41,0x00,0x01,0x00,0x2F,0xC0,0x28,0x40,0x68,0x40,0x48,0x40,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6CBE, {0x21,0x00,0x21,0x00,0x01,0xE0,0x81,0xE0,0x41,0x00,0x01,0x00,0x2F,0xC0,0x28,0x40,0x68,0x40,0x48,0x40,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6CBF, {0x23,0x00,0x21,0x00,0x05,0x00,0x84,0x80,0x48,0x80,0x08,0x40,0x3F,0xA0,0x28,0x80,0x48,0x80,0x48,0x80,0x8F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6CC1, {0x20,0x00,0x2F,0xC0,0x08,0x40,0x88,0x40,0x4F,0xC0,0x0A,0xC0,0x22,0x80,0x22,0x80,0x44,0x80,0x48,0xA0,0x90,0xA0,0xA0,0x60,0x00,0x00,}}, +{ 0x6CC4, {0x29,0x80,0x29,0x80,0x09,0x80,0x9F,0xE0,0x4B,0xC0,0x09,0x80,0x29,0x80,0x29,0x80,0x69,0x80,0x48,0x00,0x4F,0xE0,0x48,0x00,0x00,0x00,}}, +{ 0x6CC5, {0x10,0x00,0x1F,0xE0,0x08,0x20,0x49,0x20,0x29,0x20,0x09,0x20,0x19,0xA0,0x1A,0xA0,0x3E,0x60,0x2C,0x20,0x2F,0xE0,0x28,0x20,0x00,0x00,}}, +{ 0x6CC9, {0x04,0x00,0x08,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x40,0x7E,0x80,0x0F,0x00,0x34,0x80,0xC4,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x6CCA, {0x10,0x80,0x11,0x00,0x02,0x00,0x47,0xE0,0x24,0x20,0x04,0x20,0x17,0xE0,0x14,0x20,0x24,0x20,0x24,0x20,0x47,0xE0,0x44,0x20,0x00,0x00,}}, +{ 0x6CCC, {0x21,0x00,0x21,0x40,0x00,0x40,0x82,0x40,0x4A,0x80,0x0A,0x80,0x2B,0x40,0x33,0x20,0x52,0x20,0x46,0x40,0x8A,0x40,0x91,0xC0,0x00,0x00,}}, +{ 0x6CD3, {0x21,0x80,0x3D,0x80,0x05,0x80,0x9D,0x80,0x51,0x80,0x11,0x80,0x3D,0x80,0x35,0xC0,0x65,0x40,0x45,0x60,0x47,0xA0,0x58,0x20,0x00,0x00,}}, +{ 0x6CD5, {0x21,0x00,0x21,0x00,0x07,0xC0,0x81,0x00,0x41,0x00,0x1F,0xE0,0x01,0x00,0x22,0x00,0x22,0x40,0x44,0xC0,0x5F,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x6CD7, {0x10,0x00,0x1F,0xE0,0x0A,0xA0,0x4A,0xA0,0x2A,0xA0,0x0A,0xA0,0x1A,0xE0,0x1C,0xE0,0x3C,0x60,0x28,0x20,0x2F,0xE0,0x28,0x20,0x00,0x00,}}, +{ 0x6CD9, {0x20,0x00,0x2F,0xC0,0x01,0x00,0x85,0x40,0x49,0x40,0x01,0x00,0x3F,0xE0,0x21,0x00,0x61,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6CDB, {0x20,0x40,0x21,0x80,0x0F,0x00,0x81,0x00,0x5F,0xC0,0x00,0x40,0x20,0x80,0x20,0x80,0x61,0x00,0x4E,0x00,0x53,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x6CDD, {0x20,0x40,0x21,0x80,0x0E,0x00,0x88,0x00,0x4F,0xE0,0x09,0x80,0x2B,0x80,0x29,0xC0,0x69,0xE0,0x59,0x80,0x51,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x6CE1, {0x24,0x00,0x24,0x00,0x07,0xC0,0x88,0x40,0x5F,0x40,0x21,0x40,0x0F,0x40,0x29,0x80,0x28,0x00,0x48,0x20,0x48,0x20,0x47,0xE0,0x00,0x00,}}, +{ 0x6CE2, {0x21,0x00,0x21,0x00,0x0F,0xE0,0x89,0x40,0x49,0x00,0x0F,0xC0,0x2C,0x40,0x2A,0x80,0x4B,0x00,0x51,0x00,0x92,0x80,0xAC,0x60,0x00,0x00,}}, +{ 0x6CE3, {0x21,0x00,0x21,0x00,0x1F,0xE0,0x88,0x40,0x48,0x40,0x04,0x40,0x24,0x40,0x22,0x80,0x62,0x80,0x42,0x80,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6CE5, {0x20,0x00,0x2F,0xC0,0x08,0x40,0x8F,0xC0,0x4A,0x40,0x0A,0x00,0x2A,0xC0,0x2B,0x00,0x4A,0x00,0x52,0x20,0x92,0x20,0xA1,0xE0,0x00,0x00,}}, +{ 0x6CE8, {0x42,0x00,0x21,0x00,0x1F,0xE0,0x81,0x00,0x41,0x00,0x01,0x00,0x2F,0xC0,0x21,0x00,0x41,0x00,0x41,0x00,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6CEA, {0x10,0x00,0x17,0xE0,0x04,0x20,0x44,0x20,0x27,0xE0,0x04,0x20,0x14,0x20,0x17,0xE0,0x34,0x20,0x24,0x20,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x6CEF, {0x20,0x00,0x2F,0xC0,0x08,0x40,0x8F,0xC0,0x4B,0x40,0x09,0x00,0x2F,0xE0,0x29,0x80,0x68,0x80,0x48,0xA0,0x4F,0x60,0x78,0x20,0x00,0x00,}}, +{ 0x6CF0, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x1F,0x00,0x0A,0x00,0xFF,0xE0,0x15,0x00,0x75,0xC0,0x9F,0x60,0x1F,0x00,0x64,0xC0,0x0C,0x00,0x00,0x00,}}, +{ 0x6CF1, {0x21,0x00,0x21,0x00,0x07,0xC0,0x8F,0xC0,0x49,0x40,0x09,0x40,0x29,0x40,0x3F,0xE0,0x61,0x00,0x43,0x00,0x4C,0x80,0x70,0x60,0x00,0x00,}}, +{ 0x6CF3, {0x43,0x00,0x20,0x80,0x07,0x00,0x81,0x40,0x41,0x40,0x1F,0x80,0x23,0x80,0x25,0x80,0x45,0x40,0x59,0x20,0x81,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x6D0B, {0x24,0x40,0x22,0x80,0x1F,0xE0,0x81,0x00,0x41,0x00,0x0F,0xC0,0x21,0x00,0x21,0x00,0x3F,0xE0,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6D0C, {0x10,0x20,0x1F,0xA0,0x04,0xE0,0x47,0xE0,0x29,0xE0,0x09,0xE0,0x1D,0xE0,0x13,0xE0,0x32,0xE0,0x24,0x20,0x28,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x6D12, {0x20,0x00,0x3F,0xE0,0x05,0x00,0x9F,0xC0,0x57,0x40,0x15,0x40,0x35,0xC0,0x35,0xC0,0x78,0xC0,0x58,0x40,0x5F,0xC0,0x50,0x40,0x00,0x00,}}, +{ 0x6D17, {0x21,0x00,0x25,0x00,0x07,0xC0,0x89,0x00,0x51,0x00,0x1F,0xE0,0x02,0x80,0x22,0x80,0x44,0x80,0x48,0xA0,0x90,0xA0,0xA0,0x60,0x00,0x00,}}, +{ 0x6D19, {0x21,0x00,0x25,0x00,0x07,0xC0,0x8F,0xC0,0x51,0x00,0x1F,0xE0,0x23,0x80,0x23,0x80,0x65,0x80,0x49,0x40,0x51,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x6D1B, {0x22,0x00,0x22,0x00,0x07,0x80,0x8C,0x80,0x53,0x00,0x03,0x00,0x4C,0x80,0x7F,0xE0,0x48,0x80,0x88,0x80,0x8F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6D1E, {0x10,0x00,0x1F,0xE0,0x08,0x20,0x4F,0xE0,0x28,0x20,0x0B,0xA0,0x1A,0xA0,0x1A,0xA0,0x2B,0xA0,0x28,0x20,0x48,0x20,0x48,0x60,0x00,0x00,}}, +{ 0x6D1F, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x8F,0xC0,0x43,0x40,0x0F,0xC0,0x29,0x00,0x2F,0xE0,0x69,0x60,0x43,0xC0,0x44,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x6D25, {0x41,0x00,0x21,0x00,0x0F,0xC0,0x9F,0xE0,0x41,0x40,0x0F,0xC0,0x21,0x00,0x2F,0xC0,0x41,0x00,0x5F,0xE0,0x81,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x6D29, {0x42,0x00,0x22,0x00,0x0F,0xC0,0x8A,0x40,0x4F,0xC0,0x0A,0x40,0x2F,0xC0,0x29,0x40,0x21,0x80,0x43,0xA0,0x5C,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x6D2A, {0x24,0x80,0x24,0x80,0x04,0x80,0x9F,0xC0,0x44,0x80,0x04,0x80,0x04,0x80,0x5F,0xE0,0x44,0x00,0x48,0x80,0x90,0x40,0xA0,0x40,0x00,0x00,}}, +{ 0x6D2B, {0x21,0x00,0x23,0x00,0x07,0xC0,0x8F,0xC0,0x4B,0xC0,0x0B,0xC0,0x2B,0xC0,0x2B,0xC0,0x6B,0xC0,0x4B,0xC0,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6D32, {0x14,0x20,0x14,0xA0,0x04,0xA0,0x4C,0xA0,0x2F,0xE0,0x1D,0xE0,0x04,0xA0,0x14,0xA0,0x24,0xA0,0x28,0xA0,0x48,0xA0,0x50,0x20,0x00,0x00,}}, +{ 0x6D33, {0x12,0x00,0x12,0x00,0x02,0xE0,0x4F,0xE0,0x25,0xE0,0x05,0xE0,0x15,0xE0,0x1D,0xE0,0x3F,0xE0,0x23,0xE0,0x24,0xE0,0x28,0x00,0x00,0x00,}}, +{ 0x6D35, {0x12,0x00,0x12,0x00,0x03,0xE0,0x47,0xE0,0x27,0xA0,0x0C,0xA0,0x17,0xA0,0x15,0xA0,0x37,0xA0,0x20,0x20,0x20,0x20,0x20,0x40,0x00,0x00,}}, +{ 0x6D36, {0x12,0x00,0x12,0x00,0x03,0xE0,0x47,0xE0,0x28,0xA0,0x1C,0xA0,0x3B,0xE0,0x29,0xE0,0x2E,0xE0,0x4F,0xE0,0x48,0xE0,0x40,0xC0,0x00,0x00,}}, +{ 0x6D38, {0x21,0x00,0x21,0x00,0x09,0x40,0x85,0x40,0x41,0x00,0x1F,0xE0,0x23,0x80,0x23,0x80,0x67,0x80,0x45,0xA0,0x49,0xA0,0x50,0xE0,0x00,0x00,}}, +{ 0x6D3B, {0x20,0x40,0x21,0x80,0x0F,0x00,0x81,0x00,0x5F,0xE0,0x01,0x00,0x21,0x00,0x2F,0xC0,0x48,0x40,0x48,0x40,0x8F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x6D3D, {0x21,0x00,0x23,0x00,0x03,0x80,0x84,0x80,0x4F,0xC0,0x10,0x20,0x20,0x00,0x2F,0xC0,0x68,0x40,0x48,0x40,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6D3E, {0x21,0x00,0x23,0x00,0x0C,0xC0,0x8B,0x00,0x4A,0x40,0x0B,0x40,0x2B,0x80,0x2A,0x80,0x4A,0x80,0x52,0x40,0x92,0x20,0xA2,0x00,0x00,0x00,}}, +{ 0x6D41, {0x42,0x00,0x22,0x00,0x3F,0xE0,0x84,0x80,0x5F,0xC0,0x00,0x40,0x2A,0x80,0x4A,0x80,0x4A,0x80,0x8A,0xA0,0x92,0xA0,0xA0,0xE0,0x00,0x00,}}, +{ 0x6D44, {0x42,0x00,0x22,0x00,0x07,0x80,0x99,0x00,0x4F,0xC0,0x01,0x40,0x3F,0xE0,0x21,0x40,0x4F,0xC0,0x41,0x00,0x81,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x6D45, {0x22,0x80,0x22,0x40,0x1F,0xC0,0x83,0x80,0x4E,0x00,0x03,0xC0,0x3E,0x80,0x21,0x80,0x41,0x00,0x46,0xA0,0x98,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x6D59, {0x28,0x40,0x28,0x80,0x3F,0x00,0x9F,0x00,0x49,0xE0,0x09,0x80,0x2B,0x80,0x3D,0x80,0x79,0x80,0x4A,0x80,0x4A,0x80,0x5C,0x80,0x00,0x00,}}, +{ 0x6D5A, {0x21,0x00,0x23,0xC0,0x1F,0xE0,0x8F,0x80,0x45,0xA0,0x0A,0xE0,0x33,0x80,0x24,0x80,0x6D,0x80,0x43,0x00,0x47,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x6D5C, {0x21,0x80,0x2E,0x00,0x08,0x00,0x8F,0xC0,0x49,0x00,0x09,0x00,0x29,0x00,0x7F,0xE0,0x40,0x00,0x88,0x80,0x90,0x40,0xA0,0x40,0x00,0x00,}}, +{ 0x6D63, {0x21,0x00,0x23,0x00,0x0F,0xE0,0x9F,0xC0,0x40,0x00,0x00,0x00,0x3F,0xE0,0x23,0x80,0x67,0x80,0x45,0xA0,0x49,0xA0,0x50,0xE0,0x00,0x00,}}, +{ 0x6D64, {0x21,0x00,0x23,0x00,0x0F,0xE0,0x9A,0x00,0x42,0x00,0x1F,0xE0,0x22,0x00,0x25,0x80,0x65,0x80,0x59,0x40,0x73,0xE0,0x4E,0x20,0x00,0x00,}}, +{ 0x6D66, {0x41,0x80,0x21,0x40,0x1F,0xE0,0x81,0x00,0x4F,0xC0,0x09,0x40,0x2F,0xC0,0x29,0x40,0x2F,0xC0,0x49,0x40,0x49,0x40,0x49,0xC0,0x00,0x00,}}, +{ 0x6D69, {0x21,0x00,0x25,0x00,0x07,0xC0,0x89,0x00,0x51,0x00,0x3F,0xE0,0x00,0x00,0x2F,0xC0,0x48,0x40,0x48,0x40,0x8F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x6D6A, {0x22,0x00,0x22,0x00,0x0F,0x80,0x88,0x80,0x4F,0x80,0x08,0x80,0x2F,0x80,0x4A,0x40,0x49,0x40,0x89,0x80,0x8E,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x6D6C, {0x20,0x00,0x2F,0xC0,0x09,0x40,0x8F,0xC0,0x49,0x40,0x09,0x40,0x2F,0xC0,0x21,0x00,0x2F,0xC0,0x41,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6D6E, {0x40,0x40,0x21,0x80,0x3E,0x40,0x89,0x40,0x44,0x80,0x0F,0xC0,0x20,0x80,0x21,0x00,0x5F,0xE0,0x41,0x00,0x81,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x6D74, {0x24,0x80,0x24,0x80,0x08,0x40,0x92,0x00,0x42,0x00,0x05,0x00,0x28,0x80,0x3F,0xC0,0x68,0xA0,0x48,0x80,0x8F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6D77, {0x48,0x00,0x28,0x00,0x0F,0xE0,0x97,0xC0,0x45,0x40,0x05,0x40,0x7F,0xE0,0x49,0x40,0x49,0x40,0x4F,0xE0,0x80,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x6D78, {0x40,0x00,0x2F,0x80,0x00,0x80,0x87,0x80,0x4F,0x80,0x00,0x00,0x3F,0xE0,0x30,0x40,0x4F,0x80,0x43,0x00,0x87,0x00,0xB8,0xE0,0x00,0x00,}}, +{ 0x6D79, {0x21,0x00,0x21,0x00,0x1F,0xE0,0x8F,0xE0,0x45,0x80,0x05,0xC0,0x2B,0x20,0x33,0x20,0x63,0x80,0x44,0x80,0x48,0x40,0x50,0x20,0x00,0x00,}}, +{ 0x6D85, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x8F,0xC0,0x4F,0xC0,0x09,0x40,0x21,0x00,0x2F,0xC0,0x61,0x00,0x41,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6D88, {0x20,0x80,0x14,0xA0,0x12,0xA0,0x42,0xC0,0x27,0xE0,0x04,0x20,0x17,0xE0,0x14,0x20,0x27,0xE0,0x24,0x20,0x44,0x20,0x44,0x60,0x00,0x00,}}, +{ 0x6D8C, {0x20,0x00,0x17,0xE0,0x01,0xC0,0x47,0xE0,0x24,0xA0,0x04,0xA0,0x17,0xE0,0x14,0xA0,0x24,0xA0,0x27,0xE0,0x44,0xA0,0x44,0xE0,0x00,0x00,}}, +{ 0x6D8E, {0x20,0x20,0x3C,0x40,0x05,0x80,0x88,0x80,0x49,0x80,0x1D,0xE0,0x25,0x80,0x35,0x80,0x7D,0x80,0x4D,0xE0,0x52,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x6D93, {0x10,0x00,0x17,0xE0,0x04,0x20,0x47,0xE0,0x20,0x00,0x07,0xE0,0x14,0x20,0x17,0xE0,0x37,0xE0,0x27,0xE0,0x24,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x6D95, {0x28,0x80,0x24,0x80,0x1F,0xC0,0x8F,0xC0,0x4F,0xC0,0x09,0x00,0x2F,0xE0,0x2B,0x20,0x67,0x20,0x49,0x60,0x71,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6D99, {0x40,0x00,0x3F,0xE0,0x0F,0xC0,0x88,0x40,0x4F,0xC0,0x09,0x40,0x29,0x00,0x4F,0xE0,0x51,0x00,0x92,0x80,0xAC,0x40,0xB0,0x20,0x00,0x00,}}, +{ 0x6D9B, {0x21,0x00,0x31,0x00,0x1F,0xE0,0x8F,0xC0,0x43,0x00,0x1F,0xE0,0x22,0x80,0x3F,0xE0,0x64,0x80,0x5A,0x80,0x70,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x6D9C, {0x41,0x00,0x21,0x00,0x1F,0xE0,0x8F,0xC0,0x40,0x00,0x0F,0xE0,0x28,0x40,0x32,0x80,0x42,0x80,0x44,0xA0,0x88,0xA0,0xB0,0xE0,0x00,0x00,}}, +{ 0x6DAF, {0x40,0x00,0x2F,0xE0,0x09,0x00,0x8B,0xC0,0x49,0x00,0x0F,0xE0,0x29,0x00,0x29,0x00,0x4F,0xC0,0x51,0x00,0xAF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6DB2, {0x21,0x00,0x11,0x00,0x1F,0xE0,0x85,0xC0,0x49,0x40,0x1B,0x40,0x3A,0xC0,0x2D,0x80,0x49,0x80,0x49,0x80,0x8A,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x6DB5, {0x40,0x00,0x7F,0xE0,0x04,0x00,0x86,0x40,0x7B,0xC0,0x2B,0x40,0x6B,0x40,0x77,0xC0,0x7A,0xC0,0xA6,0x40,0xBF,0xC0,0xA0,0x40,0x00,0x00,}}, +{ 0x6DB8, {0x10,0x00,0x17,0xE0,0x04,0xA0,0x47,0xE0,0x25,0xA0,0x04,0xA0,0x15,0xE0,0x15,0xE0,0x35,0xE0,0x25,0xA0,0x27,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x6DBC, {0x41,0x00,0x21,0x00,0x3F,0xE0,0x8F,0xC0,0x48,0x40,0x08,0x40,0x2F,0xC0,0x21,0x00,0x49,0x40,0x49,0x20,0x91,0x20,0x83,0x00,0x00,0x00,}}, +{ 0x6DC0, {0x21,0x00,0x21,0x00,0x0F,0xE0,0x88,0x00,0x5F,0xE0,0x01,0x00,0x29,0x00,0x49,0xC0,0x49,0x00,0x8D,0x00,0x93,0x00,0xA1,0xE0,0x00,0x00,}}, +{ 0x6DC5, {0x48,0x40,0x68,0x80,0x3F,0x00,0x9F,0x00,0x4D,0xE0,0x1B,0x80,0x7B,0x80,0x79,0x80,0x6A,0x80,0xEA,0x80,0x8C,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6DC6, {0x20,0x80,0x27,0x80,0x07,0x40,0x9F,0xE0,0x42,0x00,0x07,0xC0,0x24,0x40,0x3F,0xC0,0x77,0xC0,0x67,0xC0,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x6DC7, {0x24,0x80,0x24,0x80,0x1F,0xE0,0x8F,0xE0,0x47,0x80,0x04,0x80,0x27,0x80,0x34,0xC0,0x7F,0xE0,0x42,0x00,0x44,0x40,0x58,0x40,0x00,0x00,}}, +{ 0x6DCB, {0x48,0x80,0x28,0x80,0x1F,0xE0,0x88,0x80,0x4C,0x80,0x1B,0x80,0x1B,0xC0,0x2A,0xC0,0x4C,0xA0,0x48,0x80,0x88,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6DCC, {0x21,0x00,0x25,0xC0,0x05,0x60,0x99,0x20,0x4F,0xC0,0x08,0x40,0x2B,0xC0,0x2B,0xC0,0x6B,0xC0,0x4B,0xC0,0x48,0x40,0x48,0xC0,0x00,0x00,}}, +{ 0x6DD1, {0x28,0x00,0x28,0x00,0x0F,0xC0,0x89,0x40,0x7F,0x40,0x09,0x40,0x4C,0x80,0x5A,0x80,0x5A,0x80,0x69,0x40,0x8A,0x40,0x9C,0x20,0x00,0x00,}}, +{ 0x6DD2, {0x21,0x00,0x3F,0xE0,0x07,0xC0,0x87,0xC0,0x5F,0xE0,0x01,0x40,0x2F,0xC0,0x33,0x00,0x7F,0xE0,0x47,0x80,0x43,0x80,0x5E,0x40,0x00,0x00,}}, +{ 0x6DD5, {0x21,0x00,0x23,0x00,0x0F,0xC0,0x9F,0xE0,0x45,0x80,0x05,0xA0,0x29,0xE0,0x33,0x00,0x6F,0xC0,0x41,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6DD8, {0x12,0x00,0x12,0x00,0x03,0xE0,0x46,0x20,0x2B,0xA0,0x15,0x20,0x3F,0xE0,0x31,0x20,0x25,0x60,0x27,0xE0,0x44,0x60,0x40,0x40,0x00,0x00,}}, +{ 0x6DD9, {0x21,0x00,0x23,0x00,0x0F,0xE0,0x9F,0xC0,0x40,0x00,0x00,0x00,0x3F,0xE0,0x21,0x00,0x65,0x40,0x49,0x20,0x51,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x6DDE, {0x49,0x80,0x68,0x80,0x3F,0x80,0x9F,0x40,0x4D,0x40,0x1B,0x20,0x7B,0x80,0x79,0x80,0x69,0xC0,0x89,0x40,0x8F,0xA0,0x88,0x20,0x00,0x00,}}, +{ 0x6DE1, {0x21,0x00,0x21,0x40,0x0B,0x40,0x93,0x80,0x44,0x40,0x19,0x20,0x21,0x40,0x2B,0x40,0x4B,0x00,0x45,0x00,0x88,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x6DE4, {0x29,0x80,0x29,0x80,0x09,0x80,0x9F,0x80,0x4A,0x40,0x08,0x20,0x2E,0x80,0x2A,0x80,0x6B,0x00,0x52,0x80,0x72,0x40,0x6C,0x40,0x00,0x00,}}, +{ 0x6DE6, {0x21,0x00,0x23,0x00,0x06,0x80,0x8F,0xC0,0x53,0x20,0x01,0x00,0x2F,0xC0,0x21,0x00,0x69,0x40,0x45,0x40,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6DE8, {0x20,0xC0,0x2F,0xC0,0x09,0x60,0x98,0x20,0x4F,0xC0,0x01,0x40,0x3F,0xE0,0x23,0x40,0x6F,0xC0,0x41,0x00,0x41,0x00,0x43,0x00,0x00,0x00,}}, +{ 0x6DEA, {0x21,0x00,0x23,0x00,0x06,0x80,0x8F,0xC0,0x50,0x20,0x0F,0xC0,0x2B,0xC0,0x2B,0xC0,0x6F,0xC0,0x4B,0xC0,0x4B,0xC0,0x48,0xC0,0x00,0x00,}}, +{ 0x6DEB, {0x40,0x60,0x23,0x80,0x3E,0x40,0x8A,0x40,0x49,0xC0,0x0F,0x00,0x21,0x00,0x3F,0xE0,0x41,0x00,0x41,0x00,0x9F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6DEC, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x84,0x80,0x44,0xC0,0x0A,0xA0,0x31,0x20,0x33,0x00,0x7F,0xE0,0x41,0x00,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6DEE, {0x24,0x80,0x24,0x80,0x07,0xE0,0x8F,0xE0,0x49,0x80,0x1F,0xC0,0x29,0x80,0x29,0x80,0x6F,0xC0,0x49,0x80,0x4F,0xE0,0x48,0x00,0x00,0x00,}}, +{ 0x6DF1, {0x40,0x00,0x2F,0xE0,0x0A,0x80,0x92,0xA0,0x44,0xE0,0x09,0x00,0x21,0x00,0x2F,0xE0,0x43,0x80,0x45,0x40,0x99,0x20,0x81,0x00,0x00,0x00,}}, +{ 0x6DF3, {0x21,0x00,0x3F,0xE0,0x07,0x80,0x84,0x80,0x47,0x80,0x00,0x00,0x2F,0xC0,0x20,0x80,0x4F,0xE0,0x41,0x00,0x81,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x6DF5, {0x15,0x60,0x15,0x60,0x05,0x60,0x47,0x60,0x24,0x20,0x07,0xE0,0x14,0x20,0x17,0x60,0x25,0x60,0x2D,0x60,0x49,0x60,0x50,0x20,0x00,0x00,}}, +{ 0x6DF7, {0x20,0x00,0x2F,0x80,0x08,0x80,0x8F,0x80,0x48,0x80,0x0F,0x80,0x29,0x00,0x2B,0x40,0x4D,0x80,0x49,0x20,0x8F,0x20,0xB1,0xE0,0x00,0x00,}}, +{ 0x6DF9, {0x22,0x00,0x32,0x00,0x1F,0xE0,0x84,0x80,0x49,0x40,0x1F,0xE0,0x29,0x40,0x2F,0xC0,0x6F,0xC0,0x4F,0xE0,0x41,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x6DFA, {0x22,0x80,0x22,0x40,0x1F,0xE0,0x8E,0x80,0x41,0xA0,0x0E,0xE0,0x23,0xA0,0x33,0xE0,0x7E,0x80,0x41,0xA0,0x43,0xE0,0x5C,0x20,0x00,0x00,}}, +{ 0x6DFB, {0x20,0xC0,0x2F,0x00,0x12,0x00,0x8F,0xE0,0x44,0x80,0x0A,0x40,0x52,0x20,0x6A,0xC0,0x4A,0xA0,0x52,0xA0,0x82,0x00,0x86,0x00,0x00,0x00,}}, +{ 0x6E05, {0x22,0x00,0x3F,0xC0,0x1F,0x80,0x82,0x00,0x7F,0xE0,0x00,0x00,0x0F,0x80,0x28,0x80,0x4F,0x80,0x4F,0x80,0x88,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6E07, {0x10,0x00,0x17,0xC0,0x04,0x40,0x47,0xC0,0x27,0xC0,0x02,0x00,0x17,0xE0,0x1D,0xA0,0x37,0x20,0x24,0x20,0x43,0xA0,0x40,0xC0,0x00,0x00,}}, +{ 0x6E08, {0x21,0x00,0x11,0x00,0x1F,0xE0,0x84,0x80,0x43,0x00,0x1C,0xE0,0x24,0x40,0x27,0xC0,0x24,0x40,0x4F,0xC0,0x48,0x40,0x50,0x40,0x00,0x00,}}, +{ 0x6E09, {0x21,0x00,0x21,0x00,0x05,0xC0,0x85,0x00,0x5F,0xE0,0x01,0x80,0x29,0x40,0x29,0xA0,0x53,0xA0,0x41,0x00,0x86,0x00,0xB8,0x00,0x00,0x00,}}, +{ 0x6E0A, {0x14,0x20,0x14,0xA0,0x07,0xE0,0x45,0xE0,0x25,0xA0,0x07,0xE0,0x14,0xA0,0x15,0xE0,0x37,0xE0,0x2C,0xA0,0x28,0xA0,0x30,0x20,0x00,0x00,}}, +{ 0x6E0B, {0x21,0x00,0x21,0x00,0x09,0xC0,0x89,0x00,0x49,0x00,0x1F,0xE0,0x40,0x00,0x58,0x40,0x44,0x80,0x42,0x00,0x8C,0xC0,0xB0,0x20,0x00,0x00,}}, +{ 0x6E13, {0x20,0x40,0x23,0xC0,0x0E,0x40,0x85,0x40,0x45,0x80,0x01,0x00,0x2F,0xC0,0x21,0x00,0x5F,0xE0,0x43,0x00,0x84,0x80,0x98,0x60,0x00,0x00,}}, +{ 0x6E15, {0x10,0x20,0x19,0x20,0x07,0xE0,0x4F,0xE0,0x22,0xE0,0x02,0xE0,0x1F,0xE0,0x12,0xE0,0x33,0xE0,0x2C,0xA0,0x38,0x20,0x20,0x60,0x00,0x00,}}, +{ 0x6E19, {0x42,0x00,0x67,0x80,0x3F,0xC0,0x9F,0xC0,0x55,0xC0,0x15,0xC0,0x78,0xC0,0x72,0x40,0x5F,0xE0,0x86,0x00,0x99,0x80,0xA0,0x60,0x00,0x00,}}, +{ 0x6E1A, {0x42,0x00,0x22,0x00,0x0F,0xA0,0x82,0x40,0x5F,0xE0,0x02,0x00,0x27,0xC0,0x2C,0x40,0x57,0xC0,0x64,0x40,0x87,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x6E1B, {0x21,0x80,0x21,0x40,0x1F,0xE0,0x91,0x00,0x5F,0x40,0x11,0x40,0x3F,0xC0,0x3A,0x80,0x5E,0x80,0x53,0xA0,0xA2,0x60,0xA4,0x20,0x00,0x00,}}, +{ 0x6E1D, {0x27,0x00,0x23,0x00,0x06,0x80,0x8F,0xC0,0x70,0x20,0x1E,0x40,0x33,0xC0,0x3B,0xC0,0x7F,0x80,0x5F,0xC0,0x53,0xC0,0x57,0xC0,0x00,0x00,}}, +{ 0x6E1F, {0x21,0x00,0x3F,0xE0,0x07,0x80,0x87,0x80,0x47,0x80,0x00,0x00,0x2F,0xE0,0x38,0x40,0x7F,0xC0,0x41,0x00,0x41,0x00,0x43,0x00,0x00,0x00,}}, +{ 0x6E20, {0x20,0x00,0x2F,0xC0,0x8F,0x80,0x48,0x80,0x0F,0x80,0x28,0x00,0x4F,0xC0,0x84,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x6E21, {0x41,0x00,0x21,0x00,0x1F,0xE0,0x92,0x80,0x5F,0xE0,0x13,0x80,0x30,0x00,0x3F,0xC0,0x54,0x80,0x53,0x00,0xA6,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x6E23, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x87,0x80,0x59,0x60,0x07,0x80,0x24,0x80,0x27,0x80,0x67,0x80,0x47,0x80,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6E24, {0x24,0xC0,0x34,0xC0,0x1F,0xC0,0x4F,0xE0,0x39,0xE0,0x3E,0xE0,0x32,0xE0,0x24,0xE0,0x2F,0xA0,0x4C,0xA0,0x45,0x20,0x4E,0x40,0x00,0x00,}}, +{ 0x6E25, {0x40,0x00,0x2F,0xC0,0x08,0x40,0x8F,0xC0,0x4F,0xE0,0x09,0x80,0x2A,0xC0,0x2F,0xA0,0x49,0x00,0x57,0xC0,0xB1,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x6E26, {0x10,0x00,0x17,0xC0,0x04,0x40,0x45,0xC0,0x25,0x40,0x0F,0xE0,0x28,0x20,0x2B,0xA0,0x2A,0xA0,0x2B,0xA0,0x4A,0xA0,0x48,0x60,0x00,0x00,}}, +{ 0x6E29, {0x40,0x00,0x2F,0x80,0x08,0x80,0x8F,0x80,0x4F,0x80,0x08,0x80,0x40,0x00,0x5F,0xC0,0x55,0x40,0x55,0x40,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6E2B, {0x25,0x80,0x37,0xC0,0x1F,0xE0,0x85,0x80,0x44,0x00,0x07,0xC0,0x21,0x00,0x3F,0xE0,0x67,0x80,0x49,0x40,0x51,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x6E2C, {0x20,0x20,0x1F,0x20,0x09,0xA0,0x4F,0xA0,0x29,0xA0,0x0F,0xA0,0x19,0xA0,0x19,0xA0,0x2F,0x20,0x26,0x20,0x49,0x20,0x50,0x60,0x00,0x00,}}, +{ 0x6E2D, {0x10,0x00,0x1F,0xE0,0x0F,0xE0,0x4F,0xE0,0x2F,0xE0,0x08,0x20,0x17,0xC0,0x14,0x40,0x37,0xC0,0x27,0xC0,0x24,0x40,0x24,0x40,0x00,0x00,}}, +{ 0x6E2E, {0x24,0x80,0x34,0xC0,0x1F,0xE0,0x84,0x80,0x5F,0xE0,0x00,0x40,0x2F,0x40,0x29,0x40,0x6F,0x40,0x4F,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x6E2F, {0x44,0x80,0x44,0x80,0x3F,0xC0,0x84,0x80,0x5F,0xE0,0x08,0x80,0x5F,0xC0,0x60,0xA0,0x4F,0x80,0x48,0x40,0x88,0x40,0x87,0xC0,0x00,0x00,}}, +{ 0x6E38, {0x29,0x80,0x29,0x80,0x09,0xE0,0x9F,0xE0,0x4B,0xC0,0x08,0x40,0x2E,0x80,0x2A,0xC0,0x6B,0xE0,0x5A,0x80,0x52,0x80,0x6C,0x80,0x00,0x00,}}, +{ 0x6E3A, {0x41,0x80,0x7D,0x80,0x25,0x80,0xBD,0xC0,0x75,0xC0,0x27,0xA0,0x7D,0xE0,0x65,0xC0,0x7D,0x80,0xBC,0x80,0x83,0x00,0x8C,0x00,0x00,0x00,}}, +{ 0x6E3E, {0x20,0x00,0x2F,0xE0,0x1F,0xE0,0x8F,0xE0,0x4F,0xC0,0x09,0x40,0x2F,0xC0,0x2B,0x40,0x6F,0xC0,0x5F,0xE0,0x43,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6E43, {0x21,0x00,0x37,0xE0,0x1C,0x80,0x85,0xE0,0x5E,0xC0,0x04,0x80,0x25,0xE0,0x36,0x80,0x7D,0xE0,0x49,0xE0,0x48,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x6E4A, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x8F,0xC0,0x43,0x80,0x1F,0xE0,0x64,0x80,0x6F,0x40,0x5F,0xE0,0x47,0xC0,0x84,0x80,0x98,0x60,0x00,0x00,}}, +{ 0x6E4D, {0x21,0x00,0x29,0x40,0x09,0x40,0x8F,0xC0,0x40,0x00,0x1F,0xE0,0x22,0x00,0x2F,0xC0,0x6B,0xC0,0x4B,0xC0,0x4B,0xC0,0x48,0xC0,0x00,0x00,}}, +{ 0x6E4E, {0x20,0x00,0x3F,0xE0,0x06,0x00,0x9F,0xC0,0x55,0xC0,0x15,0xC0,0x37,0xC0,0x35,0xC0,0x77,0xC0,0x55,0xC0,0x5F,0xC0,0x50,0x40,0x00,0x00,}}, +{ 0x6E56, {0x20,0x00,0x14,0xE0,0x04,0xA0,0x4F,0xA0,0x24,0xE0,0x04,0xA0,0x0E,0xA0,0x2A,0xA0,0x2A,0xE0,0x2F,0x20,0x41,0x20,0x42,0x60,0x00,0x00,}}, +{ 0x6E58, {0x24,0x00,0x24,0xE0,0x1F,0xA0,0x44,0xA0,0x24,0xE0,0x0E,0xA0,0x2D,0xA0,0x2D,0xE0,0x34,0xA0,0x24,0xA0,0x44,0xE0,0x44,0xA0,0x00,0x00,}}, +{ 0x6E5B, {0x44,0x80,0x2F,0xE0,0x07,0x80,0x84,0x80,0x47,0x80,0x04,0x80,0x3F,0xE0,0x32,0x80,0x54,0xE0,0x58,0x20,0x9F,0xE0,0x90,0x00,0x00,0x00,}}, +{ 0x6E5F, {0x21,0x00,0x22,0x00,0x0F,0xC0,0x8F,0xC0,0x48,0x40,0x0F,0xC0,0x20,0x00,0x3F,0xE0,0x67,0xC0,0x47,0xC0,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6E67, {0x40,0x00,0x2F,0xC0,0x03,0x80,0x8F,0xC0,0x49,0x40,0x0F,0xC0,0x29,0x40,0x4F,0xC0,0x41,0x00,0x9F,0xE0,0x86,0x20,0xB8,0xC0,0x00,0x00,}}, +{ 0x6E6B, {0x43,0x80,0x65,0x80,0x39,0x80,0x89,0xA0,0x7F,0xC0,0x09,0x80,0x7F,0x80,0x7B,0x80,0x6B,0x80,0xE9,0x40,0x8A,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x6E6E, {0x20,0x00,0x3F,0xE0,0x1F,0xC0,0x9F,0xC0,0x55,0xC0,0x19,0xC0,0x3F,0xC0,0x32,0x00,0x7F,0xC0,0x42,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6E6F, {0x20,0x00,0x2F,0x80,0x08,0x80,0x8F,0x80,0x4F,0x80,0x00,0x00,0x7F,0xE0,0x48,0x00,0x4F,0xC0,0x95,0xC0,0x89,0x40,0x83,0x80,0x00,0x00,}}, +{ 0x6E72, {0x20,0xC0,0x2F,0xC0,0x09,0x60,0x9F,0xA0,0x42,0x00,0x1F,0xE0,0x22,0x00,0x27,0xC0,0x65,0x40,0x59,0x80,0x73,0x80,0x4C,0x60,0x00,0x00,}}, +{ 0x6E76, {0x21,0x00,0x22,0x00,0x0F,0xC0,0x8F,0xC0,0x48,0x40,0x0F,0xC0,0x21,0x20,0x3F,0xA0,0x67,0xC0,0x49,0x40,0x71,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x6E7E, {0x41,0x00,0x21,0x00,0x1F,0xE0,0x8A,0xC0,0x54,0xA0,0x0F,0x80,0x20,0x80,0x2F,0x80,0x4F,0xC0,0x50,0x40,0x80,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x6E7F, {0x20,0x00,0x2F,0xC0,0x08,0x40,0x8F,0xC0,0x48,0x40,0x0F,0xC0,0x42,0x80,0x52,0xC0,0x4A,0xC0,0x42,0x80,0x9F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6E80, {0x45,0x00,0x3F,0xC0,0x25,0x00,0x9F,0xE0,0x42,0x00,0x3F,0xC0,0x62,0x40,0x6A,0xC0,0x6A,0xC0,0xAF,0xC0,0xA0,0x40,0xA0,0xC0,0x00,0x00,}}, +{ 0x6E82, {0x24,0x20,0x34,0xE0,0x1F,0xE0,0x4F,0xE0,0x3D,0xE0,0x15,0xE0,0x3F,0xE0,0x24,0xE0,0x2E,0xE0,0x4D,0x20,0x54,0x20,0x44,0x60,0x00,0x00,}}, +{ 0x6E8C, {0x4E,0x80,0x22,0x80,0x1D,0xA0,0x88,0xC0,0x5F,0xC0,0x25,0x20,0x05,0x00,0x7F,0xE0,0x45,0x00,0x49,0x20,0x91,0x20,0xA0,0xE0,0x00,0x00,}}, +{ 0x6E8F, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x97,0xC0,0x53,0x40,0x1F,0xE0,0x71,0x40,0x57,0xC0,0x57,0xC0,0x97,0xC0,0xA7,0xC0,0xA4,0x40,0x00,0x00,}}, +{ 0x6E90, {0x20,0x00,0x2F,0xE0,0x09,0x00,0x8B,0xC0,0x4A,0x40,0x0B,0xC0,0x2A,0x40,0x2B,0xC0,0x48,0x80,0x52,0xA0,0xA4,0xA0,0x80,0x80,0x00,0x00,}}, +{ 0x6E96, {0x25,0x00,0x25,0x00,0x8F,0xC0,0x5F,0x80,0x19,0x00,0x2F,0x80,0x49,0x00,0x4F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x6E98, {0x21,0x00,0x23,0x00,0x0F,0xC0,0x9F,0xE0,0x43,0x80,0x04,0x80,0x3F,0xC0,0x20,0x40,0x6F,0xC0,0x4B,0xC0,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6E9C, {0x22,0x00,0x3D,0xE0,0x08,0x60,0x4B,0x60,0x2B,0xA0,0x1C,0xE0,0x31,0x00,0x2F,0xC0,0x29,0x40,0x4F,0xC0,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6E9D, {0x25,0x00,0x3F,0xC0,0x1F,0x80,0x85,0x00,0x7F,0xE0,0x02,0x00,0x2F,0x80,0x2A,0x80,0x4F,0x80,0x5F,0xE0,0x88,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6E9F, {0x20,0x00,0x2F,0xE0,0x1F,0xC0,0x87,0x80,0x47,0x80,0x04,0x80,0x27,0x80,0x33,0x00,0x7F,0xE0,0x42,0x00,0x44,0x40,0x58,0x40,0x00,0x00,}}, +{ 0x6EA2, {0x50,0x80,0x28,0x80,0x3F,0xE0,0x89,0x00,0x49,0x00,0x10,0x80,0x7F,0xC0,0x55,0xA0,0x55,0x80,0x55,0x80,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6EA5, {0x21,0x80,0x3F,0xE0,0x07,0xC0,0x8F,0xC0,0x4F,0xC0,0x09,0x40,0x2F,0xC0,0x29,0x40,0x6F,0xE0,0x4F,0xE0,0x42,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x6EAA, {0x20,0xC0,0x2F,0xC0,0x0A,0x60,0x99,0x20,0x46,0x80,0x02,0x80,0x21,0x80,0x2F,0xC0,0x6F,0xE0,0x4F,0xE0,0x44,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x6EAF, {0x31,0x00,0x39,0xE0,0x1F,0xE0,0x4F,0xE0,0x35,0xE0,0x15,0xE0,0x35,0xE0,0x3F,0xE0,0x25,0xA0,0x44,0xA0,0x49,0x20,0x52,0x60,0x00,0x00,}}, +{ 0x6EB2, {0x25,0x00,0x29,0xC0,0x09,0x40,0x89,0x40,0x4D,0xC0,0x09,0x40,0x21,0x00,0x2F,0xC0,0x64,0x80,0x43,0x00,0x47,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x6EB6, {0x21,0x00,0x21,0x00,0x0F,0xE0,0x94,0x40,0x45,0x40,0x09,0x40,0x22,0x80,0x44,0x40,0x4F,0xA0,0x84,0x80,0x87,0x80,0x84,0x80,0x00,0x00,}}, +{ 0x6EB7, {0x10,0x00,0x1F,0xE0,0x0F,0xE0,0x4F,0xE0,0x2B,0xE0,0x0D,0xE0,0x1A,0xE0,0x1D,0xE0,0x3E,0xE0,0x2F,0x20,0x2F,0xE0,0x28,0x20,0x00,0x00,}}, +{ 0x6EBA, {0x20,0x00,0x1F,0xE0,0x01,0x20,0x4F,0xE0,0x29,0x00,0x0F,0xE0,0x11,0x20,0x19,0xA0,0x27,0x60,0x2D,0xA0,0x41,0x20,0x46,0x40,0x00,0x00,}}, +{ 0x6EBD, {0x20,0x00,0x2F,0xE0,0x0F,0xC0,0x8F,0xC0,0x5F,0xE0,0x15,0xC0,0x27,0x80,0x3C,0xE0,0x6F,0xE0,0x4F,0xE0,0x42,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x6EC2, {0x21,0x00,0x23,0x00,0x0F,0xC0,0x86,0x80,0x5F,0xE0,0x11,0x40,0x21,0x00,0x3F,0xE0,0x61,0xC0,0x43,0xC0,0x44,0x40,0x58,0x80,0x00,0x00,}}, +{ 0x6EC4, {0x21,0x00,0x23,0x00,0x07,0x80,0x8F,0xC0,0x57,0xE0,0x04,0x80,0x27,0x80,0x27,0x80,0x6F,0xC0,0x5F,0xC0,0x77,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x6EC5, {0x21,0x00,0x21,0x40,0x01,0x20,0x9F,0xE0,0x5F,0x40,0x15,0x40,0x3D,0x40,0x36,0x80,0x54,0x80,0x5B,0xA0,0xB2,0x60,0xA0,0x20,0x00,0x00,}}, +{ 0x6EC9, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x8F,0xC0,0x4F,0xC0,0x09,0x40,0x25,0x40,0x37,0xC0,0x7F,0xE0,0x43,0x80,0x45,0xA0,0x58,0xE0,0x00,0x00,}}, +{ 0x6ECB, {0x24,0x80,0x22,0x80,0x1F,0xE0,0x84,0x80,0x44,0x80,0x05,0xA0,0x19,0xA0,0x4A,0xC0,0x46,0xC0,0x4A,0xC0,0xBF,0xE0,0x81,0x20,0x00,0x00,}}, +{ 0x6ECC, {0x49,0x80,0x69,0x80,0x09,0xE0,0x97,0xC0,0x75,0x80,0x77,0xE0,0x75,0x80,0x57,0xE0,0x55,0x80,0x97,0xC0,0x95,0xA0,0x91,0x80,0x00,0x00,}}, +{ 0x6ED1, {0x20,0x00,0x2F,0x80,0x0B,0x80,0x8B,0x80,0x5F,0xE0,0x10,0x20,0x3F,0xC0,0x28,0x80,0x4F,0x80,0x4F,0x80,0x88,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6ED3, {0x21,0x00,0x23,0x00,0x0F,0xE0,0x98,0x00,0x4F,0xC0,0x04,0x80,0x23,0x80,0x3F,0xE0,0x67,0xC0,0x47,0xC0,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6ED4, {0x20,0xC0,0x2F,0xC0,0x09,0x60,0x99,0xA0,0x42,0x00,0x0C,0xC0,0x28,0x40,0x28,0x40,0x6E,0xC0,0x48,0x40,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6ED5, {0x01,0x00,0x75,0xC0,0x5F,0xC0,0x5F,0xC0,0x7F,0xE0,0x55,0x80,0x59,0x40,0x77,0xA0,0x53,0x80,0x5F,0x80,0x51,0x40,0xB3,0x00,0x00,0x00,}}, +{ 0x6EDD, {0x42,0x00,0x22,0x00,0x1F,0xC0,0x85,0x00,0x7F,0xE0,0x00,0x00,0x2F,0x80,0x2A,0x80,0x4F,0x80,0x4F,0xA0,0x8A,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x6EDE, {0x45,0x40,0x25,0x40,0x1F,0xE0,0x87,0xC0,0x40,0x00,0x1F,0xE0,0x11,0x20,0x6F,0xC0,0x49,0x40,0x49,0x40,0x89,0xC0,0x81,0x00,0x00,0x00,}}, +{ 0x6EEC, {0x40,0x00,0x7F,0xE0,0x0F,0xC0,0x9F,0xC0,0x5F,0xC0,0x17,0x80,0x74,0x80,0x57,0xC0,0x5F,0xC0,0x9F,0xC0,0xA8,0x20,0xA7,0xE0,0x00,0x00,}}, +{ 0x6EEF, {0x55,0x80,0x77,0xC0,0x3F,0xE0,0x97,0xA0,0x70,0x60,0x3F,0xE0,0x62,0x40,0x5F,0x80,0x52,0x80,0x92,0x80,0x93,0x80,0x82,0x00,0x00,0x00,}}, +{ 0x6EF2, {0x21,0x00,0x22,0xC0,0x0F,0xC0,0x86,0xC0,0x4B,0xA0,0x1F,0xE0,0x23,0x80,0x3F,0xC0,0x77,0x60,0x46,0x40,0x43,0x80,0x4E,0x00,0x00,0x00,}}, +{ 0x6EF4, {0x42,0x00,0x22,0x00,0x3F,0xE0,0x85,0x00,0x5F,0xC0,0x12,0x40,0x5F,0xC0,0x52,0x40,0x57,0x40,0x57,0x40,0x95,0x40,0x90,0x40,0x00,0x00,}}, +{ 0x6EF7, {0x22,0x00,0x22,0x00,0x03,0xE0,0x9F,0xC0,0x53,0xC0,0x19,0xC0,0x35,0xC0,0x3B,0xC0,0x77,0x40,0x5F,0xC0,0x5F,0xC0,0x50,0x40,0x00,0x00,}}, +{ 0x6EF8, {0x41,0x80,0x7D,0x80,0x3F,0xE0,0x9F,0xE0,0x5E,0x80,0x00,0x80,0x7C,0x80,0x43,0xE0,0x5C,0x80,0x94,0x80,0x9C,0x80,0x94,0x80,0x00,0x00,}}, +{ 0x6EFE, {0x21,0x00,0x3F,0xE0,0x04,0x40,0x9F,0xE0,0x48,0x80,0x08,0x80,0x2F,0x80,0x23,0x40,0x7D,0xC0,0x7C,0x80,0x47,0x40,0x58,0x20,0x00,0x00,}}, +{ 0x6EFF, {0x49,0x80,0x7F,0xE0,0x0F,0x80,0x87,0x00,0x7F,0xC0,0x22,0x40,0x7B,0xC0,0x6B,0xC0,0x7F,0xC0,0xB6,0x40,0xA2,0x40,0xA2,0xC0,0x00,0x00,}}, +{ 0x6F01, {0x22,0x00,0x22,0x00,0x07,0x80,0x89,0x00,0x5F,0xC0,0x09,0x40,0x2F,0xC0,0x29,0x40,0x4F,0xC0,0x55,0x40,0x92,0xA0,0xA2,0xA0,0x00,0x00,}}, +{ 0x6F02, {0x40,0x00,0x3F,0xE0,0x04,0x80,0x8F,0xC0,0x4F,0xC0,0x00,0x00,0x2F,0xC0,0x20,0x00,0x5F,0xE0,0x49,0x40,0x91,0x40,0x83,0x00,0x00,0x00,}}, +{ 0x6F06, {0x41,0x00,0x21,0x00,0x0F,0xE0,0x87,0x80,0x59,0x60,0x03,0x00,0x2D,0xC0,0x39,0x60,0x47,0x80,0x47,0x80,0x99,0x60,0x83,0x00,0x00,0x00,}}, +{ 0x6F09, {0x42,0x00,0x22,0x00,0x1F,0xE0,0x95,0x00,0x5F,0xC0,0x15,0x40,0x3F,0xC0,0x35,0x00,0x57,0xC0,0x55,0x20,0xA7,0x20,0xB9,0xE0,0x00,0x00,}}, +{ 0x6F0F, {0x40,0x00,0x7F,0xC0,0x1F,0xC0,0x9F,0xC0,0x5F,0xE0,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x7B,0x40,0x6D,0x40,0xEB,0xC0,0x89,0xC0,0x00,0x00,}}, +{ 0x6F11, {0x48,0x00,0x6B,0xC0,0x3C,0x80,0xA5,0x80,0x7D,0x80,0x27,0xE0,0x7D,0x80,0x71,0x80,0x7D,0x80,0xBD,0xA0,0xB2,0xA0,0xA4,0x60,0x00,0x00,}}, +{ 0x6F13, {0x42,0x00,0x7F,0xE0,0x19,0x80,0x9F,0x80,0x55,0x80,0x1F,0x80,0x62,0x00,0x7F,0xC0,0x67,0x40,0xBF,0xC0,0xB0,0x40,0xA0,0xC0,0x00,0x00,}}, +{ 0x6F14, {0x41,0x00,0x3F,0xE0,0x17,0xA0,0x91,0x20,0x4F,0xC0,0x09,0x40,0x2F,0xC0,0x29,0x40,0x4F,0xC0,0x42,0x80,0x8C,0x40,0xB0,0x20,0x00,0x00,}}, +{ 0x6F15, {0x23,0x80,0x3F,0xE0,0x07,0xC0,0x8F,0xC0,0x4F,0xC0,0x0B,0xC0,0x2F,0xC0,0x27,0x80,0x27,0x80,0x67,0x80,0x47,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x6F20, {0x45,0x00,0x5F,0xE0,0x25,0x00,0x8F,0x80,0x48,0x80,0x0F,0x80,0x28,0x80,0x2F,0x80,0x42,0x00,0x5F,0xE0,0x8D,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x6F22, {0x44,0x80,0x24,0x80,0x1F,0xE0,0x8F,0xC0,0x49,0x40,0x0F,0xC0,0x21,0x00,0x2F,0xC0,0x41,0x00,0x4F,0xE0,0x84,0x80,0x98,0x60,0x00,0x00,}}, +{ 0x6F23, {0x40,0x80,0x37,0xE0,0x08,0x80,0x83,0xC0,0x42,0xC0,0x3B,0xC0,0x6B,0xC0,0x48,0x80,0x4F,0xE0,0x88,0x80,0x96,0x80,0xA1,0xE0,0x00,0x00,}}, +{ 0x6F2B, {0x20,0x00,0x2F,0x80,0x0F,0x80,0x88,0x80,0x4F,0x80,0x1F,0xC0,0x75,0xC0,0x5F,0xC0,0x4F,0x80,0x85,0x00,0x87,0x00,0xB8,0xE0,0x00,0x00,}}, +{ 0x6F2C, {0x41,0x00,0x2F,0xC0,0x01,0x00,0x87,0x80,0x5F,0xE0,0x07,0x80,0x24,0x80,0x27,0x80,0x44,0x80,0x47,0x80,0x87,0x80,0x98,0x40,0x00,0x00,}}, +{ 0x6F31, {0x49,0x80,0x69,0x80,0x3F,0x80,0x9F,0xE0,0x7B,0xA0,0x2B,0xC0,0x7F,0x80,0x4D,0x80,0x5B,0x80,0x9B,0x80,0xAA,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x6F32, {0x40,0x00,0x7B,0xC0,0x0B,0x80,0x9B,0x80,0x73,0x80,0x22,0x00,0x7F,0xE0,0x6B,0xC0,0x4A,0xC0,0x8A,0x80,0x8B,0x40,0xB6,0x20,0x00,0x00,}}, +{ 0x6F38, {0x48,0x40,0x28,0x40,0x3F,0x80,0x9F,0x00,0x6B,0xE0,0x3F,0x40,0x2B,0x40,0x7F,0x40,0x49,0x40,0x5F,0x40,0x89,0x40,0x8A,0x40,0x00,0x00,}}, +{ 0x6F3E, {0x24,0x80,0x3F,0xE0,0x07,0xC0,0x87,0xC0,0x5F,0xE0,0x0F,0x80,0x27,0x00,0x33,0xC0,0x7F,0xC0,0x47,0x40,0x59,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x6F3F, {0x51,0x00,0x53,0xC0,0x7F,0x80,0xFF,0x80,0x77,0xE0,0x52,0x80,0x94,0x80,0x04,0x40,0xFF,0x80,0x35,0x80,0xC4,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x6F41, {0x40,0x00,0x4F,0xE0,0x71,0x00,0x4B,0xC0,0x7A,0x40,0x23,0xC0,0x2A,0x40,0xFB,0xC0,0x73,0xC0,0x7B,0xC0,0xA6,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x6F45, {0x44,0x00,0x27,0xC0,0x0A,0x00,0x9F,0xE0,0x54,0x80,0x2F,0xE0,0x09,0x00,0x5F,0xC0,0x4F,0xC0,0x89,0x00,0x8F,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x6F54, {0x24,0x00,0x3F,0xE0,0x1E,0xA0,0x46,0xA0,0x2F,0x60,0x15,0x00,0x2A,0x80,0x2F,0x60,0x3F,0xE0,0x27,0x80,0x5D,0x60,0x41,0x00,0x00,0x00,}}, +{ 0x6F58, {0x20,0xC0,0x2F,0x40,0x09,0x40,0x9F,0xE0,0x43,0x80,0x05,0x80,0x39,0x60,0x2F,0xC0,0x6F,0xC0,0x4F,0xC0,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6F5B, {0x48,0x80,0x7F,0xE0,0x29,0x80,0xBF,0xE0,0x5B,0xC0,0x1D,0xA0,0x69,0x60,0x4F,0x80,0x4F,0x80,0x8F,0x80,0x8F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6F5C, {0x24,0x80,0x34,0x80,0x1F,0xC0,0x9F,0xE0,0x4D,0x80,0x0B,0x40,0x32,0x20,0x2F,0x80,0x48,0x80,0x4F,0x80,0x8F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6F5F, {0x22,0x00,0x2C,0xC0,0x08,0x40,0x8F,0xC0,0x4F,0xC0,0x04,0x00,0x4F,0xE0,0x58,0x20,0x4D,0x60,0x9A,0xA0,0xA4,0x20,0x80,0xC0,0x00,0x00,}}, +{ 0x6F64, {0x20,0x00,0x3E,0xE0,0x1E,0xE0,0x5E,0xE0,0x3E,0xE0,0x10,0x20,0x17,0xA0,0x31,0x20,0x37,0xA0,0x37,0xA0,0x50,0x20,0x50,0x60,0x00,0x00,}}, +{ 0x6F66, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x8C,0xC0,0x4F,0xC0,0x34,0xA0,0x27,0x80,0x24,0x80,0x67,0x80,0x49,0x40,0x51,0x40,0x43,0x00,0x00,0x00,}}, +{ 0x6F6D, {0x20,0x00,0x3F,0xE0,0x07,0xC0,0x8F,0xC0,0x4F,0xC0,0x07,0x80,0x24,0x80,0x27,0x80,0x67,0x80,0x5F,0xE0,0x43,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6F6E, {0x24,0x00,0x34,0xE0,0x1F,0xA0,0x4E,0xA0,0x3A,0xE0,0x0E,0xA0,0x2A,0xA0,0x2E,0xE0,0x24,0xA0,0x5F,0xA0,0x45,0x20,0x46,0x60,0x00,0x00,}}, +{ 0x6F6F, {0x20,0x00,0x2F,0x80,0x1F,0xE0,0x8F,0xE0,0x4F,0x80,0x1F,0xC0,0x25,0xC0,0x36,0xC0,0x7F,0xE0,0x4F,0xE0,0x42,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x6F70, {0x42,0x00,0x2F,0x80,0x0F,0x80,0x82,0x00,0x7F,0xE0,0x0F,0x80,0x28,0x80,0x2F,0x80,0x4F,0x80,0x4F,0x80,0x8C,0x80,0xB0,0x40,0x00,0x00,}}, +{ 0x6F74, {0x49,0x00,0x6B,0x00,0x3F,0xC0,0x91,0x40,0x7F,0xE0,0x09,0x80,0x7A,0x40,0x7F,0xC0,0x6B,0xC0,0x8B,0xC0,0x8B,0xC0,0xB2,0x40,0x00,0x00,}}, +{ 0x6F78, {0x48,0x80,0x68,0xC0,0x3F,0xE0,0x8A,0xC0,0x6B,0xE0,0x2A,0xA0,0x6F,0x80,0x48,0x80,0x4F,0x80,0x8F,0x80,0x90,0x80,0xA0,0x80,0x00,0x00,}}, +{ 0x6F7A, {0x40,0x00,0x7F,0xC0,0x1F,0xC0,0x9F,0xC0,0x53,0x80,0x1F,0xE0,0x71,0x00,0x5F,0xC0,0x56,0x40,0xBF,0xE0,0xA4,0xC0,0x8C,0x80,0x00,0x00,}}, +{ 0x6F7C, {0x21,0x00,0x2F,0xC0,0x1F,0xE0,0x8F,0xE0,0x4B,0x40,0x0F,0xC0,0x29,0x40,0x2F,0xC0,0x67,0xC0,0x47,0xC0,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x6F80, {0x40,0x00,0x7F,0xC0,0x2B,0xC0,0x9B,0xC0,0x53,0x40,0x2F,0x80,0x68,0x80,0x6F,0xE0,0x69,0x80,0xAD,0x80,0xBB,0xE0,0xA0,0x00,0x00,0x00,}}, +{ 0x6F81, {0x41,0x00,0x69,0x00,0x09,0xC0,0x89,0x00,0x7F,0xE0,0x08,0x80,0x69,0x80,0x6F,0xE0,0x69,0x80,0xAD,0x80,0xBB,0xE0,0xA0,0x00,0x00,0x00,}}, +{ 0x6F82, {0x49,0x80,0x6B,0x80,0x2B,0x80,0xBF,0xE0,0x43,0x40,0x3F,0x40,0x63,0xC0,0x7E,0x80,0x5C,0x80,0x9C,0xC0,0x8F,0x40,0xB2,0x20,0x00,0x00,}}, +{ 0x6F84, {0x4E,0x80,0x22,0x80,0x1D,0xA0,0x8F,0xC0,0x50,0x40,0x2F,0xA0,0x08,0x80,0x4F,0x80,0x48,0x80,0x45,0x00,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6F86, {0x21,0x00,0x2F,0xC0,0x1F,0xE0,0x8F,0xE0,0x5E,0xE0,0x04,0x80,0x26,0xE0,0x38,0x00,0x7F,0xE0,0x43,0xA0,0x45,0xA0,0x58,0xE0,0x00,0x00,}}, +{ 0x6F8E, {0x24,0x80,0x34,0x80,0x1F,0x80,0x9F,0x40,0x40,0xC0,0x1F,0x80,0x31,0x20,0x3F,0x20,0x7A,0x40,0x4A,0x40,0x4D,0x80,0x71,0x00,0x00,0x00,}}, +{ 0x6F91, {0x20,0x00,0x3F,0xE0,0x07,0xC0,0x8F,0xC0,0x4B,0xC0,0x0F,0xC0,0x23,0x80,0x2F,0xC0,0x6F,0xC0,0x4F,0xC0,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x6F97, {0x00,0x00,0x2E,0xE0,0x1A,0xA0,0x4E,0xE0,0x2E,0xE0,0x18,0x20,0x0B,0xA0,0x2A,0xA0,0x2B,0xA0,0x2B,0xA0,0x4A,0xA0,0x48,0x60,0x00,0x00,}}, +{ 0x6FA1, {0x20,0x00,0x27,0x80,0x07,0x80,0x87,0x80,0x5E,0xE0,0x13,0xA0,0x3F,0xE0,0x33,0x00,0x7F,0xE0,0x47,0x80,0x59,0x60,0x41,0x00,0x00,0x00,}}, +{ 0x6FA3, {0x49,0x80,0x69,0x80,0x3F,0x80,0x9D,0x40,0x77,0xE0,0x3D,0x80,0x65,0x80,0x7F,0xE0,0x7D,0x80,0xFD,0x80,0x89,0x80,0x89,0x80,0x00,0x00,}}, +{ 0x6FA4, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x87,0xC0,0x4F,0xC0,0x01,0x00,0x3F,0xE0,0x34,0xC0,0x7F,0xE0,0x4F,0xC0,0x43,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x6FAA, {0x20,0x00,0x2F,0xC0,0x07,0xE0,0x8F,0xE0,0x5D,0xC0,0x0D,0xC0,0x23,0x80,0x3F,0xC0,0x7F,0xE0,0x47,0xC0,0x41,0xC0,0x41,0x00,0x00,0x00,}}, +{ 0x6FB1, {0x40,0x00,0x7F,0xC0,0x23,0xC0,0xBF,0xC0,0xFB,0xE0,0x6B,0x20,0x3F,0xE0,0x6B,0xC0,0x7F,0xC0,0x7F,0x80,0xF3,0x40,0xA2,0x20,0x00,0x00,}}, +{ 0x6FB3, {0x21,0x00,0x22,0x00,0x0F,0xC0,0x8F,0xC0,0x4B,0xC0,0x0F,0xC0,0x2B,0xC0,0x2D,0xC0,0x6F,0xE0,0x4F,0xE0,0x47,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x6FB9, {0x42,0x00,0x6F,0x80,0x3F,0xE0,0x9F,0xE0,0x5C,0xE0,0x13,0x80,0x7F,0xE0,0x53,0x80,0x57,0xC0,0x97,0xC0,0xA7,0xC0,0xA4,0x40,0x00,0x00,}}, +{ 0x6FC0, {0x45,0x00,0x29,0x00,0x1F,0x00,0x9F,0xE0,0x53,0x40,0x1F,0x40,0x29,0x40,0x3F,0x80,0x48,0x80,0x5E,0xC0,0x93,0x40,0xA6,0x20,0x00,0x00,}}, +{ 0x6FC1, {0x20,0x00,0x3F,0xC0,0x0F,0xC0,0x47,0xC0,0x27,0xE0,0x0A,0x20,0x3F,0xA0,0x3B,0xA0,0x2F,0xA0,0x23,0xA0,0x5C,0xE0,0x40,0xC0,0x00,0x00,}}, +{ 0x6FC2, {0x41,0x00,0x7F,0xE0,0x1F,0xE0,0x9F,0xE0,0x5F,0xC0,0x13,0xC0,0x7F,0xE0,0x53,0xC0,0x5F,0xC0,0x9F,0xC0,0xB3,0xA0,0xA3,0x80,0x00,0x00,}}, +{ 0x6FC3, {0x22,0x80,0x2F,0xC0,0x0A,0xC0,0x8F,0xC0,0x4A,0xC0,0x1F,0xE0,0x17,0x80,0x50,0x00,0x5F,0xE0,0x55,0xC0,0xA7,0x80,0xAC,0x60,0x00,0x00,}}, +{ 0x6FC6, {0x21,0x00,0x2F,0xC0,0x1F,0xE0,0x8F,0xE0,0xCF,0xC0,0x48,0x40,0x2F,0xC0,0x28,0x40,0x6F,0xC0,0x4F,0xC0,0x46,0xC0,0x78,0x20,0x00,0x00,}}, +{ 0x6FD4, {0x40,0x00,0x7F,0xE0,0x3A,0xC0,0xBF,0xC0,0x76,0xC0,0x3B,0xC0,0x6F,0xC0,0x73,0xC0,0x7F,0xC0,0xBF,0xC0,0xB3,0xC0,0xA2,0xC0,0x00,0x00,}}, +{ 0x6FD5, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x8F,0xC0,0x4F,0xC0,0x04,0x80,0x3B,0xC0,0x2D,0xC0,0x6F,0xE0,0x4F,0xE0,0x53,0x20,0x63,0xA0,0x00,0x00,}}, +{ 0x6FD8, {0x21,0x00,0x2F,0xE0,0x1F,0x40,0x8E,0xE0,0x53,0xA0,0x0F,0xC0,0x2B,0xC0,0x3F,0xE0,0x67,0xC0,0x47,0xC0,0x41,0x00,0x43,0x00,0x00,0x00,}}, +{ 0x6FDB, {0x24,0x80,0x3F,0xE0,0x07,0xE0,0x8F,0xE0,0x50,0x00,0x1F,0xE0,0x23,0x40,0x3F,0xC0,0x67,0x80,0x47,0xC0,0x4D,0xA0,0x43,0x00,0x00,0x00,}}, +{ 0x6FDF, {0x42,0x00,0x7F,0xE0,0x3F,0xC0,0x9F,0xC0,0x57,0xC0,0x1F,0xC0,0x68,0xA0,0x4F,0x80,0x4F,0x80,0x8F,0x80,0x90,0x80,0xA0,0x80,0x00,0x00,}}, +{ 0x6FE0, {0x21,0x00,0x3F,0xE0,0x07,0x80,0x87,0x80,0x5F,0xE0,0x10,0x40,0x3F,0xC0,0x63,0x40,0x5F,0x80,0x47,0xC0,0x99,0xA0,0x83,0x00,0x00,0x00,}}, +{ 0x6FE1, {0x20,0x00,0x2F,0xC0,0x1F,0xE0,0x9F,0xE0,0x4D,0xC0,0x01,0x00,0x3F,0xE0,0x22,0x00,0x6F,0xC0,0x4A,0xC0,0x4A,0xC0,0x4A,0xC0,0x00,0x00,}}, +{ 0x6FE4, {0x42,0x00,0x7F,0xC0,0x07,0x80,0x9F,0xE0,0x4F,0xC0,0x02,0x00,0x6F,0x80,0x7F,0xE0,0x4F,0xE0,0x9F,0xE0,0x9D,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x6FEB, {0x40,0x80,0x3F,0x80,0x1C,0xE0,0x93,0x00,0x5E,0x00,0x14,0xC0,0x5F,0x00,0x40,0x00,0x5F,0xC0,0x95,0x40,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x6FEC, {0x21,0x00,0x23,0xC0,0x0F,0xE0,0x9F,0xC0,0x45,0x40,0x0B,0x40,0x27,0x80,0x3C,0xE0,0x67,0x80,0x47,0x80,0x47,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x6FEE, {0x49,0x80,0x6F,0xE0,0x0F,0xE0,0x9F,0xE0,0x73,0xC0,0x17,0xE0,0x71,0x80,0x53,0xC0,0x57,0xE0,0x97,0xE0,0x91,0x80,0x96,0x60,0x00,0x00,}}, +{ 0x6FEF, {0x40,0x00,0x7F,0xC0,0x0F,0xC0,0x8F,0xC0,0x5F,0xC0,0x09,0x80,0x6F,0xC0,0x7B,0x00,0x6F,0x80,0x4F,0x80,0x8F,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x6FF1, {0x21,0x00,0x2F,0xE0,0x1F,0xC0,0x8F,0xC0,0x53,0xA0,0x07,0xC0,0x3C,0x40,0x27,0xC0,0x67,0xC0,0x47,0xC0,0x46,0xC0,0x58,0x20,0x00,0x00,}}, +{ 0x6FF3, {0x59,0x80,0x79,0xC0,0x3F,0xE0,0xFF,0xE0,0x55,0xC0,0x17,0xA0,0x75,0x60,0x6F,0x80,0x4F,0x80,0x8F,0x80,0x8F,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x6FF6, {0x20,0x00,0x3E,0xE0,0x1E,0xE0,0x5E,0xE0,0x3E,0xE0,0x10,0xE0,0x37,0x20,0x3F,0xE0,0x33,0xA0,0x57,0xE0,0x57,0xE0,0x54,0xE0,0x00,0x00,}}, +{ 0x6FFA, {0x41,0x80,0x7D,0x40,0x27,0xE0,0xBF,0xC0,0x75,0xE0,0x27,0x60,0x7D,0xA0,0x67,0xE0,0x7F,0xC0,0x98,0xE0,0xB5,0xE0,0xA6,0x20,0x00,0x00,}}, +{ 0x6FFE, {0x41,0x00,0x63,0xC0,0x1F,0xE0,0x9F,0x40,0x53,0xC0,0x17,0x80,0x75,0x80,0x57,0x80,0x57,0xC0,0x9F,0xE0,0xAA,0xA0,0xB1,0x80,0x00,0x00,}}, +{ 0x7001, {0x24,0x80,0x3F,0xE0,0x07,0x80,0x9F,0xE0,0x44,0xC0,0x0B,0xC0,0x37,0xA0,0x24,0x80,0x67,0xC0,0x47,0xC0,0x47,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x7009, {0x21,0x00,0x2F,0xE0,0x1E,0xC0,0x88,0xC0,0x4E,0xC0,0x08,0x40,0x2F,0xC0,0x22,0x00,0x7F,0xE0,0x7F,0xA0,0x54,0x20,0x50,0xC0,0x00,0x00,}}, +{ 0x700B, {0x21,0x00,0x2F,0xE0,0x1F,0x40,0x8F,0x40,0x5F,0xE0,0x03,0x80,0x2D,0xC0,0x3F,0xE0,0x6F,0xC0,0x4F,0xC0,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x700F, {0x24,0x20,0x3F,0xA0,0x1E,0xE0,0x7F,0xE0,0x24,0xE0,0x0A,0xE0,0x3F,0xE0,0x34,0xE0,0x3F,0xE0,0x4E,0x20,0x47,0x20,0x5C,0x60,0x00,0x00,}}, +{ 0x7011, {0x40,0x00,0x7F,0x80,0x1F,0x80,0x9F,0x80,0x5F,0x80,0x3F,0xC0,0x69,0x80,0x7F,0xE0,0x7F,0xE0,0xEF,0xE0,0xB2,0x40,0x86,0x00,0x00,0x00,}}, +{ 0x7015, {0x48,0x00,0x2B,0xE0,0x2C,0x80,0x89,0xC0,0x7F,0x40,0x0D,0xC0,0x5B,0x40,0x5B,0xC0,0x6D,0x40,0x89,0xC0,0x91,0x40,0xA6,0x20,0x00,0x00,}}, +{ 0x7018, {0x41,0x00,0x63,0xC0,0x1F,0xE0,0x9F,0xC0,0x57,0xC0,0x15,0x80,0x77,0x80,0x57,0x80,0x5F,0xC0,0x9F,0xC0,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x701A, {0x51,0x80,0x71,0x80,0x3D,0x80,0x9A,0x40,0x7C,0x20,0x3F,0xC0,0x69,0x40,0x7B,0xC0,0x7F,0xC0,0xFF,0xC0,0x91,0x40,0x93,0xC0,0x00,0x00,}}, +{ 0x701B, {0x42,0x00,0x7F,0xE0,0x0F,0xC0,0x9F,0xC0,0x50,0x80,0x1F,0x80,0x7B,0xC0,0x7F,0xC0,0x7D,0xC0,0xBF,0xE0,0xBB,0xE0,0xBD,0x20,0x00,0x00,}}, +{ 0x701D, {0x40,0x00,0x7F,0xE0,0x17,0xC0,0x9F,0xE0,0x57,0xC0,0x1B,0xA0,0x71,0x00,0x55,0x00,0x55,0xC0,0x95,0x00,0xBF,0xE0,0xA0,0x00,0x00,0x00,}}, +{ 0x701E, {0x49,0x80,0x7D,0x80,0x3E,0xC0,0x88,0x80,0x7F,0xC0,0x00,0xC0,0x5F,0xE0,0x54,0xC0,0x5F,0xC0,0x9C,0x80,0x94,0x80,0x95,0x80,0x00,0x00,}}, +{ 0x701F, {0x49,0x80,0x7F,0xE0,0x0F,0x80,0x8F,0x80,0x7F,0xE0,0x1F,0x80,0x6B,0xC0,0x7B,0xC0,0x7F,0xC0,0xBA,0xC0,0xBB,0xC0,0xAB,0xC0,0x00,0x00,}}, +{ 0x7026, {0x41,0x80,0x7D,0x80,0x0B,0xC0,0x9B,0xC0,0x7B,0xE0,0x0D,0x80,0x7D,0xC0,0x6F,0x40,0x4B,0xC0,0xFB,0x40,0x89,0xC0,0xB1,0x40,0x00,0x00,}}, +{ 0x7027, {0x49,0x00,0x4B,0xC0,0x3F,0x00,0x95,0xC0,0x7F,0xC0,0x01,0x00,0x1D,0xC0,0x55,0x00,0x5D,0xC0,0x5D,0xC0,0x95,0x20,0xAD,0xE0,0x00,0x00,}}, +{ 0x702C, {0x48,0x00,0x4B,0xE0,0x3F,0x00,0x89,0xC0,0x7F,0x40,0x2B,0xC0,0x3F,0x40,0x69,0xC0,0x5D,0x40,0x5B,0xC0,0xA9,0x20,0x8A,0x20,0x00,0x00,}}, +{ 0x7030, {0x40,0x00,0x7F,0xE0,0x0F,0xE0,0x9F,0xE0,0x77,0xE0,0x27,0xE0,0x7D,0xE0,0x6F,0xE0,0x4F,0xE0,0x8F,0xE0,0x8F,0xE0,0xB5,0xE0,0x00,0x00,}}, +{ 0x7032, {0x49,0x80,0x69,0x80,0x0D,0x80,0x9F,0xE0,0x73,0x40,0x3F,0x40,0x6D,0xC0,0x7F,0xC0,0x5E,0x80,0x92,0xC0,0xBF,0xC0,0xA9,0x20,0x00,0x00,}}, +{ 0x703E, {0x20,0x00,0x3E,0xE0,0x1E,0xE0,0x5E,0xE0,0x3F,0xE0,0x1F,0xE0,0x37,0xE0,0x37,0xE0,0x37,0xE0,0x53,0xA0,0x5D,0xE0,0x51,0x60,0x00,0x00,}}, +{ 0x704C, {0x23,0x80,0x3F,0xE0,0x07,0xC0,0x8F,0xC0,0x4F,0xC0,0x05,0x80,0x6F,0xE0,0x7B,0x00,0x6F,0xC0,0x4F,0xC0,0x8F,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x7051, {0x40,0x00,0x7D,0xE0,0x39,0xC0,0xBF,0xC0,0x7F,0xE0,0x25,0x00,0x7F,0xC0,0x77,0x40,0x7F,0xC0,0xAF,0xC0,0xAF,0x20,0xF1,0xE0,0x00,0x00,}}, +{ 0x7058, {0x54,0xA0,0x7E,0xA0,0x35,0x40,0x9F,0xE0,0x7B,0x40,0x3F,0xE0,0x69,0x40,0x7F,0x40,0x49,0xE0,0x9F,0x40,0x93,0xE0,0xA1,0x00,0x00,0x00,}}, +{ 0x7063, {0x53,0x40,0x7F,0xE0,0x3A,0x60,0x9B,0x60,0x57,0xC0,0x3D,0xE0,0x77,0xE0,0x5F,0x80,0x4F,0x80,0x9F,0xC0,0xB0,0x40,0x83,0x80,0x00,0x00,}}, +{ 0x706B, {0x04,0x00,0x04,0x00,0x04,0x40,0x24,0x40,0x24,0x80,0x46,0x00,0x4A,0x00,0x09,0x00,0x11,0x00,0x10,0x80,0x20,0x40,0xC0,0x20,0x00,0x00,}}, +{ 0x706F, {0x20,0x00,0x27,0xE0,0x20,0x80,0x28,0x80,0x70,0x80,0x60,0x80,0xA0,0x80,0x30,0x80,0x28,0x80,0x48,0x80,0x40,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x7070, {0x00,0x00,0x3F,0xE0,0x20,0x00,0x22,0x40,0x2A,0x40,0x2A,0x80,0x32,0x00,0x22,0x00,0x45,0x00,0x49,0x00,0x90,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x7078, {0x04,0x00,0x0F,0x00,0x72,0x00,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x80,0x24,0x80,0x4A,0x00,0x09,0x00,0x30,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x707C, {0x11,0x00,0x11,0x00,0x11,0xE0,0x15,0x20,0x3A,0x20,0x33,0x20,0x54,0xA0,0x10,0xA0,0x18,0x20,0x24,0x20,0x24,0x20,0x40,0x40,0x00,0x00,}}, +{ 0x707D, {0x22,0x40,0x22,0x40,0x44,0x80,0x44,0x80,0x22,0x40,0x04,0x00,0x04,0x40,0x24,0x40,0x4A,0x00,0x09,0x00,0x30,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7089, {0x20,0x00,0x27,0xE0,0x20,0x00,0x2B,0xC0,0x72,0x40,0x62,0x40,0xA3,0xC0,0x22,0x40,0x32,0x00,0x4A,0x00,0x44,0x00,0x88,0x00,0x00,0x00,}}, +{ 0x708A, {0x21,0x00,0x21,0x00,0x21,0x00,0x2B,0xE0,0x72,0xC0,0x64,0x80,0xA0,0x80,0x31,0x00,0x29,0x00,0x4A,0x80,0x44,0x40,0x88,0x20,0x00,0x00,}}, +{ 0x708E, {0x04,0x80,0x24,0x80,0x24,0x00,0x0E,0x00,0x11,0x80,0x64,0x40,0x24,0x80,0x24,0x80,0x45,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7092, {0x21,0x80,0x21,0x80,0x21,0x80,0x2B,0xC0,0x73,0xC0,0x63,0xA0,0xA5,0xE0,0x31,0xC0,0x38,0x80,0x69,0x00,0x46,0x00,0x98,0x00,0x00,0x00,}}, +{ 0x7099, {0x04,0x00,0x0F,0xC0,0x74,0x80,0x4B,0x00,0x1C,0x00,0xE4,0x40,0x24,0x40,0x24,0x80,0x44,0x00,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x70AC, {0x20,0x00,0x27,0xE0,0x24,0x00,0x2F,0xC0,0x74,0x40,0x64,0x40,0xA4,0x40,0x37,0xC0,0x3C,0x40,0x6C,0x00,0x47,0xE0,0x84,0x00,0x00,0x00,}}, +{ 0x70AD, {0x04,0x00,0x24,0x80,0x3F,0x80,0x00,0x00,0x3F,0xE0,0x22,0x00,0x22,0x40,0x32,0x40,0x55,0x00,0x49,0x00,0x90,0x80,0x20,0x60,0x00,0x00,}}, +{ 0x70AE, {0x22,0x00,0x22,0x00,0x2B,0xC0,0x3F,0xC0,0x77,0x40,0x6D,0xC0,0xA5,0xC0,0x37,0xC0,0x3C,0x80,0x6C,0x20,0x44,0x20,0x83,0xE0,0x00,0x00,}}, +{ 0x70AF, {0x30,0x00,0x37,0xE0,0x34,0x20,0x3D,0xA0,0x3D,0xE0,0x35,0xE0,0x75,0xE0,0x35,0xE0,0x3D,0xE0,0x2C,0x20,0x24,0x20,0x44,0x60,0x00,0x00,}}, +{ 0x70B3, {0x20,0x00,0x2F,0xE0,0x21,0x00,0x2F,0xC0,0x77,0x40,0x65,0x40,0xA5,0xC0,0x36,0xC0,0x3E,0x40,0x6C,0x40,0x44,0x40,0x84,0xC0,0x00,0x00,}}, +{ 0x70B8, {0x22,0x00,0x22,0x00,0x2B,0xE0,0x3F,0xE0,0x75,0x00,0x69,0xC0,0xA1,0x00,0x31,0x00,0x39,0xC0,0x69,0x00,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x70B9, {0x04,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x12,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x70BA, {0x24,0x00,0x14,0x00,0x7F,0x80,0x08,0x80,0x09,0x00,0x1F,0x80,0x10,0x80,0x3F,0xE0,0x30,0x20,0x6A,0xA0,0xAA,0xA0,0x20,0xC0,0x00,0x00,}}, +{ 0x70C8, {0x00,0x40,0xFE,0x40,0x11,0x40,0x3D,0x40,0x65,0x40,0x19,0x40,0x11,0x40,0x20,0x40,0xC0,0xC0,0x4A,0x40,0x49,0x20,0x80,0x20,0x00,0x00,}}, +{ 0x70CB, {0x21,0x00,0x21,0x00,0x6F,0xE0,0x6F,0xE0,0xE3,0x80,0x65,0x80,0x69,0x40,0x71,0x20,0x00,0x00,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x70CF, {0x04,0x00,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x55,0x40,0x54,0x40,0x80,0x80,0x00,0x00,}}, +{ 0x70D9, {0x21,0x00,0x21,0x00,0x23,0xC0,0x2A,0x40,0x77,0x80,0x61,0x80,0xA3,0xC0,0x3F,0xE0,0x3A,0x40,0x6A,0x40,0x43,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x70DD, {0x00,0x00,0x3F,0x00,0x06,0x00,0x7E,0x40,0x15,0xC0,0x25,0x80,0x44,0x80,0xCC,0x60,0x3F,0x80,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x70DF, {0x10,0x00,0x13,0xE0,0x12,0xA0,0x16,0xA0,0x3B,0xE0,0x32,0xA0,0x52,0xA0,0x1B,0xE0,0x1F,0x60,0x36,0x20,0x23,0xE0,0x42,0x20,0x00,0x00,}}, +{ 0x70F1, {0x30,0x00,0x37,0xE0,0x35,0xE0,0x3D,0xE0,0x3E,0xE0,0x34,0x60,0x75,0xE0,0x35,0xE0,0x3D,0xE0,0x2D,0xE0,0x24,0x20,0x44,0x60,0x00,0x00,}}, +{ 0x70F9, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x7F,0xC0,0x01,0x00,0x06,0x00,0x04,0x00,0x1E,0x00,0x4B,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x70FD, {0x21,0x00,0x23,0x00,0x2F,0xC0,0x3F,0x80,0x73,0x80,0x7D,0x60,0xAF,0xC0,0x33,0x00,0x3F,0x80,0x6F,0xC0,0x43,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x7109, {0x00,0x00,0x7F,0xC0,0x07,0x80,0x27,0x80,0xFF,0xE0,0x20,0x00,0x3F,0x80,0x30,0x00,0x3F,0xC0,0x7D,0x40,0x50,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x7114, {0x10,0x80,0x10,0x80,0x15,0xE0,0x16,0x20,0x38,0x40,0x32,0xE0,0x52,0xA0,0x1A,0xA0,0x16,0xE0,0x26,0xA0,0x22,0xE0,0x42,0xA0,0x00,0x00,}}, +{ 0x7119, {0x21,0x00,0x23,0x00,0x2F,0xC0,0x2E,0x80,0x72,0x80,0x6F,0xE0,0xA0,0x00,0x37,0xC0,0x3C,0x40,0x6C,0x40,0x47,0xC0,0x84,0x40,0x00,0x00,}}, +{ 0x711A, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x7B,0x80,0x65,0x40,0xA1,0x20,0x04,0x80,0x24,0x80,0x24,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x711C, {0x20,0x00,0x27,0xC0,0x24,0x40,0x2F,0xC0,0x74,0x40,0x67,0xC0,0xA5,0x80,0x35,0xA0,0x3F,0xC0,0x6D,0xA0,0x47,0xA0,0x9C,0xE0,0x00,0x00,}}, +{ 0x7121, {0x20,0x00,0x20,0x00,0x7F,0xC0,0x6A,0x80,0xFF,0xC0,0x2A,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x12,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7126, {0x11,0x00,0x12,0x00,0x3F,0xC0,0x22,0x00,0x7F,0x80,0xA2,0x00,0x3F,0x80,0x22,0x00,0x3F,0xE0,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7136, {0x21,0x00,0x31,0x80,0x39,0x40,0x6F,0xE0,0x59,0x00,0xA9,0x00,0x32,0x80,0x64,0x40,0xC0,0x20,0x6A,0x40,0x49,0x20,0x80,0x20,0x00,0x00,}}, +{ 0x713C, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x3B,0x80,0x7F,0xC0,0x62,0x80,0xA2,0x80,0x3F,0xE0,0x22,0x80,0x54,0xA0,0x48,0xA0,0x90,0xE0,0x00,0x00,}}, +{ 0x7149, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x3F,0xC0,0x79,0x40,0x6F,0xC0,0xA9,0x40,0x2F,0xC0,0x23,0x80,0x55,0x40,0x59,0x20,0x81,0x00,0x00,0x00,}}, +{ 0x714C, {0x21,0x00,0x23,0x00,0x27,0xC0,0x2F,0xC0,0x74,0x40,0x67,0xC0,0xA0,0x00,0x2F,0xE0,0x37,0xC0,0x77,0xC0,0x4F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x714E, {0x21,0x00,0x12,0x00,0xFF,0xE0,0x78,0x40,0x49,0x40,0x79,0x40,0x79,0x40,0x49,0x40,0x18,0x40,0x12,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7155, {0x00,0x00,0x7D,0xC0,0x49,0x40,0x65,0xC0,0x65,0x40,0x6D,0x00,0x49,0x20,0x7D,0x20,0x00,0xE0,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7156, {0x20,0xC0,0x27,0xC0,0x25,0x60,0x28,0x20,0x77,0xC0,0x61,0x00,0xAF,0xE0,0x33,0x00,0x3B,0xC0,0x67,0xC0,0x49,0x80,0x96,0x60,0x00,0x00,}}, +{ 0x7159, {0x40,0x00,0x5F,0xE0,0x43,0x00,0x5F,0xC0,0x6B,0x40,0xCF,0xC0,0xC9,0x40,0x61,0x00,0x5F,0xC0,0x41,0x00,0x9F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7162, {0x21,0x80,0x7B,0xC0,0xF7,0x80,0xCE,0x40,0x7F,0xE0,0x40,0x40,0xBF,0x80,0x08,0x80,0x3E,0x80,0x3E,0x60,0x08,0x60,0x08,0x20,0x00,0x00,}}, +{ 0x7164, {0x22,0x80,0x22,0x80,0x2F,0xE0,0x33,0x80,0x72,0x80,0x63,0x80,0xA1,0x00,0x2F,0xE0,0x33,0x80,0x4D,0x40,0x49,0x20,0x81,0x00,0x00,0x00,}}, +{ 0x7165, {0x62,0x00,0x63,0x80,0x6D,0x00,0x7F,0xC0,0x7B,0xC0,0x6B,0xC0,0xEC,0xC0,0x6B,0x40,0x7F,0xE0,0x53,0x00,0x44,0x80,0x98,0x60,0x00,0x00,}}, +{ 0x7166, {0x02,0x00,0x72,0x00,0x57,0xC0,0x5F,0x40,0x75,0xC0,0x55,0xC0,0x57,0xC0,0x74,0x40,0x10,0xC0,0x12,0xC0,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7167, {0x00,0x00,0x7F,0xC0,0x52,0x40,0x54,0xC0,0x70,0x00,0x57,0xC0,0x54,0x40,0x77,0xC0,0x40,0x00,0x12,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7169, {0x20,0x00,0x2F,0xE0,0x21,0x00,0x2F,0xC0,0x74,0x40,0x67,0xC0,0xA4,0x40,0x27,0xC0,0x34,0x40,0x4F,0xC0,0x44,0x40,0x98,0x20,0x00,0x00,}}, +{ 0x716C, {0x20,0x00,0x27,0xC0,0x27,0xC0,0x2F,0xC0,0x77,0xC0,0x60,0x00,0xAF,0xE0,0x34,0x00,0x3F,0xC0,0x7B,0xC0,0x47,0x40,0x8B,0x80,0x00,0x00,}}, +{ 0x716E, {0x04,0x80,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x1F,0x80,0x30,0x80,0xDF,0x80,0x10,0x80,0x1F,0x80,0x12,0x40,0x4A,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x717D, {0x20,0x00,0x3F,0xE0,0x2F,0xC0,0x38,0x40,0x7F,0xC0,0x68,0x00,0xAF,0xC0,0x29,0x40,0x3F,0xC0,0x4F,0xC0,0x51,0x40,0xA3,0xC0,0x00,0x00,}}, +{ 0x7184, {0x21,0x00,0x23,0x00,0x27,0xC0,0x2F,0xC0,0x74,0x40,0x67,0xC0,0xA4,0x40,0x37,0xC0,0x3B,0x00,0x6A,0x20,0x52,0xA0,0x81,0x80,0x00,0x00,}}, +{ 0x7188, {0x00,0x00,0x7F,0xC0,0x79,0x40,0x7D,0xC0,0x65,0x40,0x7D,0x00,0x69,0x20,0xFF,0x20,0x80,0xE0,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x718A, {0x21,0x00,0x49,0x40,0xFD,0x80,0x79,0xE0,0x49,0x00,0x79,0x60,0x49,0x80,0x79,0x00,0x49,0xE0,0x52,0x40,0x49,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x718F, {0x01,0x80,0x3F,0x00,0xFF,0xE0,0xFF,0xE0,0x77,0x80,0x6E,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0xFF,0xE0,0xD2,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x7194, {0x21,0x00,0x21,0x00,0x2F,0xE0,0x3C,0x40,0x75,0x40,0x69,0x40,0xA2,0x80,0x24,0x40,0x3F,0xA0,0x54,0x80,0x47,0x80,0x84,0x80,0x00,0x00,}}, +{ 0x7195, {0x20,0x00,0x27,0xC0,0x27,0xE0,0x2F,0xE0,0x77,0xC0,0x64,0x40,0xA7,0xC0,0x34,0x40,0x3F,0xC0,0x6F,0xC0,0x46,0xC0,0x98,0x20,0x00,0x00,}}, +{ 0x719F, {0x21,0x00,0xF9,0x00,0x07,0x80,0x79,0x80,0x4B,0x80,0x79,0x80,0x19,0xA0,0xF2,0x60,0x14,0x00,0x12,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x71A8, {0x00,0x40,0x7C,0x40,0x7F,0xE0,0x7F,0xE0,0x7F,0x40,0x79,0xC0,0xF4,0x40,0x74,0xC0,0x24,0x80,0x2E,0x80,0x33,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x71AC, {0x21,0x00,0x79,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0x80,0x21,0x80,0x39,0x80,0x4B,0xC0,0x9E,0x60,0x92,0x60,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x71B1, {0x21,0x00,0x79,0x00,0x27,0x80,0xFD,0x80,0x77,0x80,0x6D,0x80,0xF9,0xA0,0x32,0xE0,0xFC,0x60,0x52,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x71B9, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x52,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x71BE, {0x65,0x80,0x65,0xC0,0x7F,0xC0,0x7B,0x80,0x7F,0xE0,0x61,0x80,0xEF,0xC0,0x6B,0xC0,0x7F,0x80,0x5F,0xE0,0x4B,0x60,0x82,0x20,0x00,0x00,}}, +{ 0x71C3, {0x24,0x80,0x24,0xC0,0x37,0xA0,0x3D,0xE0,0x6A,0x80,0x7A,0x80,0xA5,0x80,0x2B,0xC0,0x32,0x60,0x74,0x60,0x53,0x20,0xA3,0xA0,0x00,0x00,}}, +{ 0x71C8, {0x27,0x40,0x23,0x40,0x3C,0x80,0x37,0xE0,0x68,0x40,0x77,0xA0,0xA4,0x80,0x27,0x80,0x34,0x80,0x52,0x80,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x71C9, {0x65,0x80,0x65,0x80,0x7F,0x80,0x7F,0xE0,0x7B,0x40,0x6F,0x40,0xE1,0xC0,0x6E,0x80,0x76,0x80,0x5F,0xC0,0x45,0x40,0x8E,0x20,0x00,0x00,}}, +{ 0x71CE, {0x61,0x00,0x63,0x00,0x6F,0xE0,0x7C,0xC0,0x7F,0xC0,0x74,0xA0,0xE7,0x80,0x64,0x80,0x77,0x80,0x55,0x40,0x49,0x40,0x83,0x00,0x00,0x00,}}, +{ 0x71D0, {0x21,0x00,0x29,0x40,0x27,0x80,0x7F,0xE0,0x75,0x80,0xB9,0x60,0x25,0x40,0x27,0xE0,0x3B,0x40,0x4F,0xE0,0x48,0x40,0x90,0x40,0x00,0x00,}}, +{ 0x71D2, {0x61,0x00,0x6F,0xC0,0x6F,0xE0,0x7F,0xE0,0x7E,0xC0,0x64,0x80,0xE7,0xE0,0x78,0x00,0x7F,0xE0,0x53,0xA0,0x45,0xA0,0x98,0xE0,0x00,0x00,}}, +{ 0x71D4, {0x60,0xC0,0x6F,0x40,0x69,0x40,0x7F,0xE0,0x73,0x80,0x65,0x80,0xE9,0x40,0x7F,0xE0,0x7F,0xC0,0x5F,0xC0,0x4F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x71D5, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x1F,0x20,0xF1,0xC0,0x2F,0x00,0x6B,0x00,0xEA,0xA0,0x3E,0xE0,0x6A,0x40,0x49,0x20,0x80,0x20,0x00,0x00,}}, +{ 0x71D7, {0x30,0x00,0x37,0xE0,0x37,0xE0,0x3F,0xE0,0x3F,0xE0,0x35,0xE0,0x75,0xE0,0x35,0xE0,0x3D,0xE0,0x2D,0xE0,0x27,0xE0,0x44,0x60,0x00,0x00,}}, +{ 0x71DF, {0x15,0xC0,0x7B,0x80,0x7B,0xC0,0x7F,0xE0,0x40,0x40,0xBF,0x00,0x21,0x80,0x3F,0x00,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x71E0, {0x61,0x00,0x62,0x00,0x6F,0xC0,0x7F,0xC0,0x7B,0xC0,0x6F,0xC0,0xEB,0xC0,0x6B,0xC0,0x7F,0xE0,0x5F,0xE0,0x44,0x80,0x98,0x60,0x00,0x00,}}, +{ 0x71E5, {0x20,0x00,0x27,0x80,0x24,0x80,0x37,0x80,0x7F,0xC0,0x6B,0x40,0xAF,0xC0,0x21,0x00,0x3F,0xE0,0x73,0x80,0x5D,0x60,0x81,0x00,0x00,0x00,}}, +{ 0x71E6, {0x24,0x00,0x27,0xC0,0x2F,0x40,0x7B,0x80,0x76,0xC0,0xA5,0x20,0x39,0x40,0x27,0xC0,0x3F,0xE0,0x27,0x80,0x59,0x60,0x81,0x00,0x00,0x00,}}, +{ 0x71E7, {0x69,0x80,0x65,0xC0,0x66,0x60,0x7B,0xE0,0x75,0xA0,0x67,0xA0,0xFD,0xC0,0x67,0xC0,0x77,0xA0,0x56,0x80,0x4B,0x80,0x91,0xE0,0x00,0x00,}}, +{ 0x71EC, {0x64,0x00,0x79,0xC0,0x77,0xC0,0x7F,0xE0,0x73,0xE0,0x73,0x20,0xFF,0xC0,0x65,0xC0,0x7E,0xC0,0x54,0x80,0x46,0xC0,0x99,0x20,0x00,0x00,}}, +{ 0x71ED, {0x10,0x00,0x17,0xE0,0x15,0xA0,0x1F,0xE0,0x3A,0x00,0x33,0xE0,0x55,0x20,0x1F,0xE0,0x1D,0x60,0x2F,0xE0,0x21,0xE0,0x4E,0xC0,0x00,0x00,}}, +{ 0x71EE, {0x6E,0x80,0x7F,0xA0,0xFD,0xE0,0xEF,0xC0,0x6E,0xC0,0x6A,0xA0,0x4F,0x20,0x80,0x00,0x3F,0x00,0x0E,0x00,0x1B,0x00,0x61,0xC0,0x00,0x00,}}, +{ 0x71F5, {0x69,0x80,0x67,0xC0,0x67,0xE0,0x7F,0xE0,0x75,0xC0,0x67,0xE0,0xFD,0x80,0x67,0xC0,0x77,0xE0,0x57,0xE0,0x4B,0x80,0x91,0xE0,0x00,0x00,}}, +{ 0x71F9, {0x00,0x00,0xFB,0xE0,0xE3,0x80,0xFB,0xA0,0xF3,0xC0,0x69,0xA0,0xEB,0xA0,0x65,0x80,0x24,0x80,0x2E,0x80,0x33,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x71FB, {0x60,0xC0,0x6F,0x00,0x6F,0xE0,0x7F,0xE0,0x7F,0xC0,0x6B,0xC0,0xEF,0xC0,0x63,0x00,0x7F,0xC0,0x5F,0xE0,0x4B,0xC0,0x91,0xA0,0x00,0x00,}}, +{ 0x71FC, {0x61,0x00,0x6F,0xC0,0x6F,0xE0,0x7F,0xE0,0x7F,0xC0,0x61,0x00,0xFF,0xE0,0x6B,0xC0,0x7F,0xE0,0x4F,0xC0,0x4B,0xC0,0x9F,0xE0,0x00,0x00,}}, +{ 0x71FF, {0x60,0x00,0x7F,0xC0,0x6F,0xC0,0x7F,0xC0,0x73,0x40,0x69,0x00,0xEF,0xC0,0x7B,0x00,0x7F,0x80,0x5F,0x80,0x4F,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x7206, {0x20,0x00,0x27,0x80,0x27,0x80,0x37,0x80,0x73,0x80,0x6F,0xC0,0xA3,0x80,0x3F,0xE0,0x3D,0xC0,0x5F,0xE0,0x4F,0xC0,0x83,0x00,0x00,0x00,}}, +{ 0x720D, {0x69,0x40,0x6B,0x40,0x7F,0xE0,0x7F,0xE0,0x77,0xE0,0x7F,0xE0,0xE1,0x00,0x7F,0xE0,0x67,0x80,0x79,0x40,0x51,0x20,0x81,0x00,0x00,0x00,}}, +{ 0x7210, {0x62,0x00,0x63,0xC0,0x7F,0xE0,0x7F,0xC0,0x77,0xC0,0x75,0x80,0xF7,0x80,0x77,0x80,0x7F,0xC0,0x7F,0xC0,0x7B,0xC0,0xFF,0xE0,0x00,0x00,}}, +{ 0x721B, {0x60,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0xF7,0xA0,0x77,0xA0,0x77,0xA0,0x77,0xA0,0x5F,0xA0,0x91,0x60,0x00,0x00,}}, +{ 0x7228, {0x3F,0x80,0x77,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xE0,0x51,0xC0,0xFF,0xE0,0x3B,0xC0,0xFF,0xE0,0xFF,0xE0,0xFB,0x60,0x71,0x80,0x00,0x00,}}, +{ 0x722A, {0x00,0x80,0x03,0x00,0x3D,0x00,0x25,0x00,0x25,0x00,0x25,0x00,0x24,0x80,0x24,0x80,0x24,0x80,0x44,0x40,0x44,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x722C, {0x04,0x00,0x1B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6A,0x40,0x6A,0x00,0x6A,0x20,0x67,0xE0,0x67,0xE0,0x63,0x00,0x80,0xE0,0x00,0x00,}}, +{ 0x722D, {0x01,0x80,0x7F,0x80,0x68,0x40,0x44,0x40,0xFF,0xC0,0x04,0x80,0xFF,0xE0,0x04,0x80,0x3F,0x80,0x3F,0x80,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x7230, {0x01,0x80,0x7F,0x80,0x64,0x40,0x7F,0xC0,0x88,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x29,0x00,0x27,0x00,0x4D,0x80,0xF0,0x60,0x00,0x00,}}, +{ 0x7232, {0x01,0x80,0x7F,0x80,0x68,0x40,0x7F,0x40,0xB1,0x80,0x3F,0x80,0x20,0x80,0x30,0xC0,0x3F,0xE0,0x7E,0xA0,0x68,0x20,0xE0,0xC0,0x00,0x00,}}, +{ 0x7235, {0x01,0xC0,0x7E,0x80,0x17,0x00,0x7F,0xC0,0x7F,0xC0,0x78,0x80,0x7F,0xE0,0x4A,0x80,0x79,0x80,0x58,0x80,0x68,0x80,0xC5,0x80,0x00,0x00,}}, +{ 0x7236, {0x11,0x00,0x10,0x80,0x20,0x40,0x50,0x40,0x11,0x00,0x11,0x00,0x0A,0x00,0x0A,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x723A, {0x0B,0x00,0x31,0x80,0x4A,0x40,0x1F,0x00,0xF0,0xE0,0x7F,0xC0,0x49,0x40,0x79,0x80,0x49,0x60,0x7D,0x20,0xF9,0xC0,0x09,0x00,0x00,0x00,}}, +{ 0x723B, {0x01,0x00,0x03,0x00,0x1F,0x00,0x19,0x80,0x71,0x00,0x11,0x00,0x11,0x00,0x0A,0x00,0x0E,0x00,0x0E,0x00,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x723C, {0x10,0x00,0x17,0x80,0xF4,0x80,0x24,0x80,0x37,0x80,0x44,0x80,0x94,0x80,0x57,0x80,0x24,0x80,0x34,0x80,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x723D, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x55,0x40,0x24,0x80,0x35,0xC0,0xD7,0x40,0x64,0x80,0x35,0x40,0x4A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x723E, {0x00,0x00,0xFF,0xE0,0x44,0x40,0xFF,0xE0,0x4C,0xC0,0x75,0xC0,0x6D,0xC0,0x6E,0xC0,0x55,0xC0,0x5D,0xC0,0x66,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x723F, {0x08,0xC0,0x08,0xC0,0x08,0xC0,0x0F,0xC0,0x08,0xC0,0x00,0xC0,0x3F,0xC0,0x04,0xC0,0x04,0xC0,0x0C,0xC0,0x18,0xC0,0x30,0xC0,0x00,0x00,}}, +{ 0x7240, {0x11,0x00,0x51,0x00,0x51,0x00,0x7F,0xE0,0x53,0x00,0x13,0x00,0xF3,0x80,0x75,0x80,0x7D,0x40,0x59,0x20,0x51,0x00,0x91,0x00,0x00,0x00,}}, +{ 0x7246, {0x21,0x00,0x73,0x00,0x7F,0xE0,0x6D,0xC0,0x73,0xA0,0x3F,0xE0,0xE0,0x00,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x6F,0xC0,0xA8,0x40,0x00,0x00,}}, +{ 0x7247, {0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x40,0x80,0x40,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x7248, {0x50,0x00,0x57,0xE0,0x54,0x00,0x7F,0xC0,0x46,0x40,0x46,0x40,0x75,0x80,0x55,0x80,0x55,0x80,0x59,0x80,0x96,0x40,0x98,0x20,0x00,0x00,}}, +{ 0x724B, {0x51,0x80,0x51,0x40,0x57,0xE0,0x7F,0xC0,0x41,0xA0,0x46,0x60,0x71,0xA0,0x53,0xE0,0x5F,0xC0,0x51,0xA0,0x56,0x60,0x90,0x20,0x00,0x00,}}, +{ 0x724C, {0x50,0x80,0x51,0x00,0x57,0xE0,0x7D,0x20,0x47,0xE0,0x45,0x20,0x77,0xE0,0x51,0x40,0x52,0x40,0x5F,0xF0,0x50,0x40,0x90,0x40,0x00,0x00,}}, +{ 0x7252, {0x65,0x80,0x67,0xC0,0x6F,0xE0,0x75,0x80,0x45,0x80,0x44,0x00,0x67,0xC0,0x73,0x00,0x7F,0xE0,0x67,0x80,0x79,0x60,0xA1,0x00,0x00,0x00,}}, +{ 0x7258, {0x61,0x00,0x7F,0xE0,0x67,0xC0,0x7F,0xC0,0x4D,0xC0,0x4F,0xC0,0x67,0x80,0x64,0x80,0x67,0x80,0x67,0x80,0x66,0x80,0xB8,0x40,0x00,0x00,}}, +{ 0x7259, {0x00,0x00,0x3F,0x80,0x21,0x00,0x21,0x00,0x21,0x00,0xFF,0xE0,0x03,0x00,0x05,0x00,0x09,0x00,0x31,0x00,0xC1,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x725B, {0x04,0x00,0x24,0x00,0x24,0x00,0x3F,0x80,0x44,0x00,0x44,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x725D, {0x22,0x00,0x62,0x00,0x62,0x00,0x7A,0x40,0x62,0x40,0xA2,0x80,0x23,0x00,0x3A,0x00,0xE2,0x00,0x22,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x725F, {0x08,0x00,0x09,0x00,0x13,0x80,0x7C,0x40,0x24,0x00,0x3F,0x80,0x44,0x00,0x84,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7261, {0x21,0x00,0x21,0x00,0x61,0x00,0x79,0x00,0x67,0xC0,0x61,0x00,0xA1,0x00,0x39,0x00,0xE1,0x00,0x21,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7262, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x84,0x00,0x24,0x00,0x3F,0x80,0x44,0x00,0x84,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7267, {0x22,0x00,0x22,0x00,0x62,0x00,0x7B,0xE0,0x64,0x40,0x66,0x40,0xAA,0x40,0x31,0x80,0xE1,0x80,0x21,0x80,0x26,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x7269, {0x12,0x00,0x32,0x00,0x33,0xE0,0x3F,0x60,0x35,0x60,0x59,0x60,0x12,0xA0,0x1A,0xA0,0x74,0xA0,0x11,0x20,0x12,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x7272, {0x21,0x00,0x25,0x00,0x65,0x00,0x7F,0xE0,0x65,0x00,0x69,0x00,0xA1,0x00,0x37,0xC0,0xE1,0x00,0x21,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7274, {0x20,0x40,0x21,0x80,0x67,0x80,0x7D,0x80,0x77,0xE0,0x65,0x80,0xA5,0x80,0x3D,0x80,0xE6,0x80,0x20,0x60,0x2F,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x7279, {0x21,0x00,0x21,0x00,0x6F,0xC0,0x71,0x00,0x7F,0xE0,0x60,0x80,0xA0,0x80,0x3F,0xE0,0xE4,0x80,0x22,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x727D, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0xFF,0xE0,0x91,0x40,0xBF,0x80,0x14,0x80,0x3F,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x727E, {0x20,0x00,0x2F,0xE0,0x61,0x00,0x7F,0x80,0x72,0x80,0x62,0x80,0xAF,0xE0,0x30,0x00,0xE7,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x7280, {0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x2D,0x60,0x21,0x00,0x2D,0x60,0x29,0x00,0x2F,0xC0,0x31,0x00,0x2F,0xE0,0x41,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x7281, {0x08,0x40,0x71,0x40,0xF9,0x40,0xF9,0x40,0x79,0x40,0x68,0x40,0xA4,0xC0,0x64,0x00,0x7F,0xC0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7282, {0x1A,0x00,0x62,0x00,0xFF,0xC0,0xFD,0xC0,0x79,0x40,0x6A,0x40,0xA4,0x80,0x64,0x00,0x7F,0xC0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7287, {0x04,0x00,0x34,0x00,0x3F,0x80,0x7F,0xC0,0x04,0x00,0x24,0x00,0x63,0x80,0x7B,0xC0,0xBF,0x80,0xFF,0xE0,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7292, {0x21,0x00,0x23,0x00,0x6F,0xE0,0x77,0x80,0x74,0x80,0x67,0x80,0xA0,0x00,0x3F,0xC0,0xEB,0x40,0x2B,0xC0,0x2B,0xC0,0x28,0xC0,0x00,0x00,}}, +{ 0x7296, {0x21,0x80,0x7B,0xC0,0xB7,0x80,0x31,0x80,0x4A,0x40,0x7F,0xE0,0x64,0x40,0xBF,0x80,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x72A0, {0x24,0x80,0x23,0x00,0x6F,0xE0,0x77,0xC0,0x71,0x00,0xAF,0xE0,0x37,0xC0,0x73,0xA0,0xBF,0xE0,0x2E,0x40,0x22,0xE0,0x27,0x20,0x00,0x00,}}, +{ 0x72A2, {0x21,0x00,0x2F,0xE0,0x67,0xC0,0x7F,0xC0,0x7C,0xC0,0x6F,0xC0,0xA7,0x80,0x34,0x80,0xE7,0x80,0x27,0x80,0x26,0x80,0x38,0x40,0x00,0x00,}}, +{ 0x72A7, {0x22,0x80,0x2F,0xE0,0x67,0xC0,0x7F,0xE0,0x77,0xC0,0x63,0xA0,0xAF,0xE0,0x37,0xC0,0xEF,0xC0,0x27,0xE0,0x2B,0xE0,0x23,0x20,0x00,0x00,}}, +{ 0x72AC, {0x04,0x00,0x04,0x80,0x04,0x80,0xFF,0xE0,0x04,0x00,0x0C,0x00,0x0A,0x00,0x0A,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x72AF, {0x10,0x00,0x97,0xC0,0x64,0x40,0x44,0x40,0xA4,0x40,0x24,0x40,0x24,0x80,0x64,0x00,0xA4,0x00,0x24,0x20,0x24,0x20,0x63,0xE0,0x00,0x00,}}, +{ 0x72B2, {0x11,0x80,0x91,0x80,0x61,0x80,0x7F,0xE0,0xB3,0x80,0x21,0x80,0x63,0x80,0xE3,0x80,0xA5,0x80,0x39,0x80,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x72B6, {0x21,0x00,0x21,0x80,0x21,0x40,0xA1,0x00,0x6F,0xE0,0x21,0x00,0x21,0x00,0x61,0x00,0xA2,0x80,0x24,0x80,0x28,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x72B9, {0x11,0x80,0x91,0x40,0x61,0x40,0x7F,0xE0,0xB3,0x00,0x23,0x00,0x63,0x00,0xE3,0x00,0xA5,0x00,0x29,0x20,0x71,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x72C2, {0x20,0x00,0xBF,0xE0,0x41,0x00,0x61,0x00,0xA1,0x00,0x2F,0xC0,0x61,0x00,0x61,0x00,0xA1,0x00,0x21,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x72C3, {0x10,0x00,0x9F,0x80,0x62,0x80,0x62,0x80,0xA2,0x80,0x2F,0xE0,0x62,0x80,0xE2,0x80,0xA2,0x80,0x22,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x72C4, {0x21,0x00,0xA1,0x00,0x61,0x40,0x65,0x40,0xA5,0x80,0x29,0x00,0x69,0x80,0xE3,0x80,0xA2,0x80,0x24,0x80,0x68,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x72C6, {0x10,0x80,0x50,0x80,0x33,0xE0,0x37,0xE0,0x54,0xA0,0x14,0xA0,0x37,0xE0,0x74,0xA0,0x50,0x80,0x10,0x80,0x30,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x72CE, {0x10,0x00,0x57,0xE0,0x34,0xA0,0x37,0xE0,0x55,0xA0,0x14,0xA0,0x37,0xE0,0x74,0xA0,0x50,0x80,0x10,0x80,0x30,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x72D0, {0x10,0x40,0x91,0x80,0x67,0x80,0x65,0x80,0xA5,0x80,0x25,0x80,0x25,0x80,0x65,0xC0,0xA5,0x40,0x29,0xC0,0x4E,0xE0,0x50,0x20,0x00,0x00,}}, +{ 0x72D2, {0x13,0x80,0x93,0x80,0x6F,0xC0,0x63,0xC0,0xAF,0xC0,0x2B,0xC0,0x6B,0x80,0xEF,0xE0,0xAB,0xA0,0x25,0xE0,0x69,0x80,0x71,0x80,0x00,0x00,}}, +{ 0x72D7, {0x11,0x00,0x51,0x00,0x23,0xE0,0x32,0x20,0x54,0x20,0x1B,0xA0,0x12,0xA0,0x32,0xA0,0x53,0xA0,0x10,0x20,0x20,0x20,0x20,0x40,0x00,0x00,}}, +{ 0x72D9, {0x10,0x00,0x97,0x80,0x64,0x80,0x64,0x80,0xA7,0x80,0x24,0x80,0x64,0x80,0x67,0x80,0xA4,0x80,0x24,0x80,0x3F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x72DB, {0x10,0x80,0x51,0x00,0x22,0x00,0x23,0xE0,0x52,0x20,0x12,0x20,0x33,0xE0,0x52,0x20,0x12,0x20,0x12,0x20,0x23,0xE0,0x22,0x20,0x00,0x00,}}, +{ 0x72E0, {0x10,0x00,0x97,0x80,0x64,0x80,0x67,0x80,0xA4,0x80,0x24,0x80,0x67,0xA0,0xE5,0x20,0xA5,0xC0,0x24,0x80,0x67,0x40,0x7C,0x20,0x00,0x00,}}, +{ 0x72E1, {0x21,0x00,0xB3,0x00,0x7F,0xE0,0x64,0x40,0xAC,0xE0,0x34,0xA0,0x63,0x80,0xE3,0x00,0xA3,0x00,0x24,0x80,0x68,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x72E2, {0x22,0x00,0xA2,0x00,0x67,0x80,0x6C,0x80,0xB3,0x00,0x23,0x00,0x65,0x80,0xFF,0xE0,0xA8,0x80,0x28,0x80,0x6F,0x80,0x68,0x80,0x00,0x00,}}, +{ 0x72E9, {0x21,0x00,0xA1,0x00,0x4F,0xE0,0x48,0x40,0xB0,0x80,0x3F,0xE0,0x20,0x80,0x64,0x80,0xA2,0x80,0x20,0x80,0x60,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x72EC, {0x11,0x00,0x91,0x00,0x61,0x00,0x6F,0xC0,0xA9,0x40,0x29,0x40,0x2F,0xC0,0x69,0x00,0xA1,0x40,0x21,0xC0,0x5E,0x20,0x40,0x20,0x00,0x00,}}, +{ 0x72ED, {0x11,0x00,0x91,0x00,0x7F,0xE0,0x69,0x40,0xA5,0x40,0x25,0x80,0x3F,0xE0,0x61,0x00,0xA3,0x00,0x24,0x80,0x68,0x40,0x50,0x20,0x00,0x00,}}, +{ 0x72F7, {0x10,0x00,0x57,0xE0,0x34,0x20,0x37,0xE0,0x50,0x00,0x17,0xE0,0x34,0x20,0x77,0xE0,0x57,0xE0,0x17,0xE0,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x72F8, {0x20,0x00,0xAF,0xC0,0x49,0x40,0x4F,0xC0,0xA9,0x40,0x29,0x40,0x6F,0xC0,0xA1,0x00,0x2F,0xC0,0x21,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x72F9, {0x21,0x00,0xA1,0x00,0x6F,0xE0,0x6F,0xE0,0xA5,0x80,0x25,0x80,0x6B,0x40,0xF3,0x20,0xA3,0x80,0x24,0x80,0x68,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x72FC, {0x11,0x00,0x91,0x00,0x67,0x80,0x44,0x80,0xA7,0x80,0x24,0x80,0x27,0x80,0x65,0x40,0xA4,0x80,0x25,0x80,0x26,0x40,0x68,0x20,0x00,0x00,}}, +{ 0x72FD, {0x10,0x00,0x97,0xC0,0x64,0x40,0x47,0xC0,0xA4,0x40,0x27,0xC0,0x64,0x40,0x64,0x40,0xA7,0xC0,0x22,0x40,0x24,0x20,0x68,0x20,0x00,0x00,}}, +{ 0x730A, {0x22,0x00,0xAC,0xC0,0x68,0x40,0x6E,0xC0,0xA8,0x40,0x28,0x40,0x6F,0xC0,0xE3,0x80,0xA3,0x80,0x25,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x7316, {0x10,0x00,0x53,0xC0,0x33,0xC0,0x33,0xC0,0x53,0xC0,0x12,0x40,0x30,0x00,0x77,0xE0,0x57,0xE0,0x17,0xE0,0x37,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x7317, {0x11,0x00,0x93,0x00,0x6F,0xC0,0x63,0x00,0xA4,0x80,0x3F,0xE0,0x60,0x40,0xE7,0xC0,0xA7,0xC0,0x27,0xC0,0x60,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x731B, {0x20,0x00,0xAF,0xC0,0x41,0x00,0x7F,0xE0,0xA2,0x00,0x22,0x00,0x2F,0xC0,0x6A,0xC0,0xAA,0xC0,0x2A,0xC0,0x3F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x731C, {0x21,0x00,0xBF,0xE0,0x67,0xC0,0x67,0xC0,0xBF,0xE0,0x20,0x00,0x6F,0xC0,0xE9,0x40,0xAF,0xC0,0x2F,0xC0,0x68,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x731D, {0x21,0x00,0xB3,0x00,0x7F,0xE0,0x64,0x80,0xAA,0xC0,0x31,0x20,0x61,0x00,0xFF,0xE0,0xA1,0x00,0x21,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x731F, {0x22,0x40,0xA9,0x40,0x45,0x80,0x67,0xC0,0xA5,0x40,0x27,0xC0,0x25,0x40,0x67,0xC0,0xA5,0x40,0x29,0x40,0x31,0x60,0x61,0x20,0x00,0x00,}}, +{ 0x7325, {0x20,0x00,0xAF,0xC0,0x6F,0xC0,0x6F,0xC0,0xAF,0xC0,0x20,0x00,0x7F,0xE0,0xE5,0x40,0xA5,0xC0,0x24,0x80,0x67,0x40,0x78,0x20,0x00,0x00,}}, +{ 0x7329, {0x20,0x00,0xAF,0xC0,0x6F,0xC0,0x6F,0xC0,0xAF,0xC0,0x25,0x00,0x67,0xC0,0xFB,0x00,0xB7,0x80,0x21,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x732A, {0x12,0x00,0x92,0x40,0x6F,0xC0,0x62,0x80,0xBF,0xE0,0x22,0x00,0x67,0xC0,0xAC,0x40,0x37,0xC0,0x24,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x732B, {0x24,0x80,0xA4,0x80,0x7F,0xE0,0x44,0x80,0xA0,0x00,0x2F,0xC0,0x29,0x40,0x69,0x40,0xAF,0xC0,0x29,0x40,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x732E, {0x10,0x80,0x10,0xC0,0xFE,0xA0,0x7F,0xE0,0x6C,0x80,0x74,0x80,0x7C,0x80,0x55,0x80,0x7D,0x40,0x56,0x40,0x56,0x20,0x4C,0x20,0x00,0x00,}}, +{ 0x732F, {0x21,0x00,0xA9,0x40,0x6F,0xC0,0x67,0xC0,0xBF,0xE0,0x21,0x00,0x6F,0xC0,0xEB,0xC0,0xAB,0xC0,0x2B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x7334, {0x24,0x00,0xA7,0x80,0x64,0x80,0x6F,0xE0,0xBA,0x00,0x2B,0xC0,0x6B,0x80,0xED,0x80,0xAF,0xE0,0x29,0x80,0x6A,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x7336, {0x24,0x80,0xA2,0x80,0x4F,0xE0,0x42,0x80,0xAF,0xC0,0x2A,0xC0,0x2A,0xC0,0x6C,0x40,0xAF,0xC0,0x28,0x40,0x2F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x7337, {0x44,0x80,0x28,0xC0,0xFC,0xA0,0x30,0x80,0x7F,0xE0,0x74,0x80,0x74,0x80,0x7C,0x80,0x7D,0x80,0x45,0x40,0x7E,0x40,0x44,0x20,0x00,0x00,}}, +{ 0x733E, {0x20,0x00,0xAF,0x80,0x6B,0x80,0x6B,0x80,0xBF,0xE0,0x30,0x40,0x6F,0x80,0xE8,0x80,0xAF,0x80,0x2F,0x80,0x68,0x80,0x68,0x80,0x00,0x00,}}, +{ 0x733F, {0x21,0x00,0xAF,0xC0,0x61,0x00,0x4F,0xE0,0xA7,0x80,0x24,0x80,0x67,0x80,0x73,0x40,0xBD,0xC0,0x24,0x80,0x67,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x7344, {0x20,0x80,0xAE,0xC0,0x5E,0xA0,0x40,0x80,0xAF,0xE0,0x20,0x80,0x2E,0x80,0x60,0xC0,0xAE,0xC0,0x2A,0xC0,0x4F,0x20,0x42,0x20,0x00,0x00,}}, +{ 0x7345, {0x28,0x00,0xAB,0xE0,0x50,0x80,0x5D,0xE0,0xB5,0xA0,0x3D,0xA0,0x71,0xA0,0x7D,0xA0,0xB5,0xA0,0x3D,0xE0,0x50,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x734E, {0x51,0x00,0x53,0xC0,0x7D,0x80,0x17,0x80,0xFF,0xE0,0x54,0x80,0x53,0x80,0x94,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x734F, {0x24,0x80,0xBF,0xE0,0x67,0xC0,0x6F,0xC0,0xAF,0xC0,0x28,0x40,0x6F,0xC0,0xF3,0x00,0xBF,0xE0,0x23,0x00,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x7357, {0x60,0x00,0xFF,0xE0,0x59,0x80,0x56,0x80,0xFF,0xE0,0x75,0xA0,0x7D,0xC0,0x7F,0xC0,0xFF,0x80,0x7D,0xC0,0x69,0x40,0x72,0x20,0x00,0x00,}}, +{ 0x7363, {0xA5,0x00,0x55,0x40,0x79,0x20,0x69,0x00,0x7F,0xE0,0x69,0x00,0x79,0x00,0xFD,0x00,0x79,0x00,0x4A,0x80,0x7C,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x7368, {0x10,0x00,0x57,0xE0,0x37,0xE0,0x33,0xE0,0x53,0xE0,0x15,0x20,0x3F,0xE0,0x75,0xE0,0x57,0xE0,0x11,0xE0,0x3E,0x60,0x30,0x40,0x00,0x00,}}, +{ 0x736A, {0x21,0x00,0xA3,0x80,0x6F,0xE0,0x6F,0xE0,0xAF,0xC0,0x2B,0xC0,0x6F,0xC0,0xE7,0x80,0xA7,0x80,0x27,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x7370, {0x21,0x00,0xAF,0xE0,0x6B,0x40,0x6A,0xE0,0xB3,0x80,0x2F,0xC0,0x6B,0xC0,0xEF,0xC0,0xBF,0xE0,0x3F,0xE0,0x61,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x7372, {0x24,0x80,0xBF,0xE0,0x44,0x80,0x6F,0xE0,0xB7,0xC0,0x27,0xC0,0x25,0x80,0x67,0xE0,0xAF,0xC0,0x22,0x80,0x63,0x80,0x5C,0x60,0x00,0x00,}}, +{ 0x7375, {0x29,0x40,0xB2,0xC0,0x6F,0xC0,0x6F,0xC0,0xAF,0xC0,0x2F,0xC0,0x6D,0xC0,0xEB,0xC0,0xAF,0xC0,0x2B,0x60,0x6D,0x60,0x79,0x20,0x00,0x00,}}, +{ 0x7378, {0xFD,0x80,0xF5,0xC0,0xFD,0xA0,0x7D,0x80,0x7F,0xE0,0x55,0x80,0x7D,0x80,0xFF,0x80,0x79,0x80,0x7D,0x80,0x7E,0x40,0x44,0x20,0x00,0x00,}}, +{ 0x737A, {0x34,0x00,0x75,0xE0,0x2F,0xA0,0x3F,0xE0,0x7D,0xA0,0x35,0xE0,0x3F,0xA0,0x74,0xE0,0x7F,0xE0,0x3D,0xE0,0x34,0xA0,0x65,0x20,0x00,0x00,}}, +{ 0x737B, {0x11,0x80,0x1F,0xC0,0x7F,0xA0,0x7D,0x80,0x7F,0xE0,0x7D,0x80,0x65,0x80,0x7D,0x80,0x7F,0x80,0x7F,0x40,0x6A,0x40,0xEA,0x20,0x00,0x00,}}, +{ 0x7384, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x08,0x80,0x29,0x00,0x19,0x00,0x06,0x00,0x04,0x80,0x09,0xC0,0xFE,0x20,0x00,0x20,0x00,0x00,}}, +{ 0x7387, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x58,0x40,0x0A,0x00,0x26,0x80,0xC9,0x60,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7389, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x80,0x04,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x738B, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7396, {0x02,0x00,0x02,0x00,0xF3,0x80,0x44,0x80,0x44,0x80,0xF8,0x80,0x41,0x00,0x41,0x00,0x73,0x00,0xC4,0x80,0x08,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x73A9, {0x00,0x00,0x07,0xC0,0xF0,0x00,0x20,0x00,0x2F,0xE0,0xF2,0x80,0x22,0x80,0x22,0x80,0x34,0x80,0xC8,0xA0,0x10,0xA0,0x20,0x60,0x00,0x00,}}, +{ 0x73B2, {0x01,0x00,0x01,0x00,0xF2,0x80,0x24,0x80,0x2B,0xC0,0xF0,0x20,0x2F,0xC0,0x21,0x40,0x31,0x40,0xC1,0xC0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x73B3, {0x05,0x80,0x05,0xC0,0xFD,0xA0,0x69,0xE0,0x7F,0x80,0xE9,0x80,0x69,0x80,0x68,0x80,0x68,0x80,0xE8,0x60,0x08,0x60,0x08,0x20,0x00,0x00,}}, +{ 0x73BB, {0x01,0x00,0x03,0x00,0xFF,0xE0,0x69,0x40,0x69,0x00,0xFF,0xC0,0x6A,0x40,0x69,0x80,0x69,0x80,0xF9,0x80,0x16,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x73C0, {0x00,0x80,0x01,0x80,0x7B,0xE0,0x33,0xE0,0x32,0x20,0x7A,0x20,0x33,0xE0,0x32,0x20,0x3A,0x20,0x7A,0x20,0x03,0xE0,0x02,0x20,0x00,0x00,}}, +{ 0x73C2, {0x00,0x00,0x0F,0xE0,0xF0,0x40,0x47,0x40,0x45,0x40,0xF5,0x40,0x45,0x40,0x47,0x40,0x75,0x40,0xC0,0x40,0x00,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x73C8, {0x04,0x00,0x04,0x00,0x74,0x60,0x3F,0xE0,0x35,0xE0,0x75,0xE0,0x35,0xE0,0x35,0xE0,0x3D,0xE0,0x79,0xE0,0x19,0xE0,0x16,0x00,0x00,0x00,}}, +{ 0x73CA, {0x00,0x00,0x0F,0xC0,0xFA,0xC0,0x4A,0xC0,0x4A,0xC0,0xFF,0xE0,0x4A,0xC0,0x4A,0xC0,0x7A,0xC0,0xCA,0xC0,0x0A,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x73CD, {0x01,0x00,0x01,0x00,0xF2,0x80,0x24,0x80,0x29,0x40,0xF2,0x20,0x2C,0x80,0x21,0x00,0x36,0x40,0xC0,0x80,0x03,0x00,0x1C,0x00,0x00,0x00,}}, +{ 0x73CE, {0x04,0x00,0x04,0x00,0xF7,0xE0,0x6F,0xE0,0x71,0xC0,0xF1,0x00,0x65,0x80,0x65,0xC0,0x65,0x60,0xF9,0x20,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x73DE, {0x02,0x00,0x02,0x00,0xF7,0x80,0x6C,0x80,0x73,0x00,0xF3,0x00,0x65,0x80,0x7F,0xE0,0x68,0x80,0xE8,0x80,0x0F,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x73E0, {0x01,0x00,0x05,0x00,0xF7,0xC0,0x29,0x00,0x31,0x00,0xFF,0xE0,0x21,0x00,0x23,0x80,0x35,0x40,0xC9,0x20,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x73E5, {0x00,0x00,0x1F,0xE0,0xF4,0x80,0x67,0x80,0x64,0x80,0xF4,0x80,0x67,0x80,0x64,0x80,0x67,0x80,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x73EA, {0x01,0x00,0x01,0x00,0xFF,0xC0,0x21,0x00,0x2F,0xE0,0xF1,0x00,0x21,0x00,0x2F,0xC0,0x71,0x00,0x81,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x73ED, {0x02,0x00,0xF3,0xE0,0x2A,0x80,0x2A,0x80,0x2A,0x80,0xFB,0xE0,0x2A,0x80,0x2A,0x80,0x36,0x80,0xC4,0x80,0x0B,0xE0,0x10,0x00,0x00,0x00,}}, +{ 0x73EE, {0x00,0x00,0x1F,0x80,0xFF,0x80,0x7F,0x80,0x72,0x80,0xFF,0x80,0x7B,0x80,0x7B,0x80,0x7B,0x80,0xFB,0xE0,0x32,0x60,0x22,0x20,0x00,0x00,}}, +{ 0x73F1, {0x02,0x20,0x11,0x20,0xE8,0x40,0x62,0x00,0x62,0x00,0xFF,0xE0,0x64,0x80,0x64,0x80,0x7F,0x80,0xF1,0x80,0x06,0x40,0x38,0x40,0x00,0x00,}}, +{ 0x73F8, {0x00,0x00,0x0F,0xC0,0xF1,0x00,0x67,0x80,0x62,0x80,0xF2,0x80,0x7F,0xE0,0x60,0x00,0x77,0xC0,0xF4,0x40,0x07,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x73FE, {0x00,0x00,0x07,0xC0,0xF4,0x40,0x27,0xC0,0x24,0x40,0xF7,0xC0,0x24,0x40,0x27,0xC0,0x32,0x80,0xC4,0xA0,0x18,0xA0,0x20,0xE0,0x00,0x00,}}, +{ 0x7403, {0x01,0x80,0xF1,0x40,0x2F,0xE0,0x21,0x00,0x29,0x40,0xF5,0x40,0x25,0x80,0x23,0x80,0x37,0x40,0xC9,0x20,0x01,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x7405, {0x01,0x00,0x03,0x00,0xF7,0xC0,0x67,0xC0,0x64,0x40,0xF4,0x40,0x67,0xC0,0x65,0xA0,0x74,0xE0,0xF4,0xC0,0x06,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x7406, {0x00,0x00,0x0F,0xC0,0xF9,0x40,0x2F,0xC0,0x29,0x40,0xF9,0x40,0x2F,0xC0,0x21,0x00,0x37,0xC0,0xC1,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7409, {0x01,0x00,0x01,0x00,0xFF,0xE0,0x22,0x80,0x2F,0xC0,0xF0,0x40,0x25,0x80,0x25,0x80,0x3D,0x80,0xC9,0xA0,0x11,0xA0,0x20,0x60,0x00,0x00,}}, +{ 0x7422, {0x00,0x00,0x0F,0xE0,0xF2,0x00,0x26,0x40,0x3B,0x40,0xF3,0x80,0x25,0x80,0x3B,0xC0,0x26,0xE0,0xF8,0x80,0x01,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x7425, {0x01,0x00,0x01,0xC0,0xFF,0xE0,0x6F,0xE0,0x69,0xC0,0xFF,0x40,0x69,0xC0,0x6B,0x80,0x7B,0x80,0xF3,0xA0,0x35,0xA0,0x28,0xE0,0x00,0x00,}}, +{ 0x7432, {0x03,0x80,0x03,0x80,0xFF,0xE0,0x6F,0xE0,0x63,0x80,0xFF,0xE0,0x63,0x80,0x63,0x80,0x7F,0xE0,0xFD,0x80,0x09,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x7433, {0x04,0x80,0x04,0x80,0xFF,0xE0,0x24,0x80,0x26,0x80,0xFD,0xC0,0x2D,0xC0,0x2F,0xA0,0x36,0xA0,0xC4,0x80,0x04,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x7434, {0x00,0x00,0x7B,0xC0,0x21,0x00,0x7B,0xC0,0x3F,0xE0,0xEA,0x00,0x11,0x00,0x7F,0xC0,0x80,0x60,0x1F,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7435, {0x00,0x00,0xFB,0xE0,0x31,0xC0,0x7B,0xC0,0x3B,0xE0,0xE2,0x00,0x22,0x00,0x3E,0xC0,0x23,0x00,0x22,0x20,0x3A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x7436, {0x00,0x00,0x7B,0xC0,0x11,0x00,0x7B,0xC0,0x3B,0xE0,0xE0,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,}}, +{ 0x743A, {0x09,0x80,0x05,0x80,0xF7,0xC0,0x6B,0xC0,0x69,0x80,0xF7,0xE0,0x65,0x80,0x65,0x80,0x79,0xC0,0xF9,0xC0,0x17,0x20,0x10,0x20,0x00,0x00,}}, +{ 0x743F, {0x00,0x00,0x0F,0xE0,0xFF,0xE0,0x6F,0xE0,0x6F,0xC0,0xF9,0x40,0x6F,0xC0,0x6B,0x40,0x6F,0xC0,0xFF,0xE0,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x7441, {0x00,0x00,0x07,0xE0,0x7D,0xA0,0x35,0xA0,0x35,0xA0,0x7B,0xC0,0x32,0x40,0x33,0xC0,0x3B,0xC0,0x7B,0xC0,0x03,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x7455, {0x00,0x00,0x1E,0xC0,0xF2,0x40,0x7E,0xC0,0x72,0x40,0xF0,0x00,0x7F,0xC0,0x71,0x40,0x7D,0xC0,0xFC,0x80,0x10,0xC0,0x13,0x20,0x00,0x00,}}, +{ 0x7459, {0x04,0xA0,0x05,0xA0,0x7D,0x20,0x34,0xA0,0x31,0x00,0x7F,0xE0,0x34,0xE0,0x37,0xA0,0x35,0xA0,0x76,0x60,0x07,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x745A, {0x04,0x00,0x04,0xE0,0x7F,0xA0,0x24,0xA0,0x24,0xE0,0x74,0xA0,0x2E,0xA0,0x2A,0xE0,0x3A,0xA0,0x2E,0xA0,0x41,0x20,0x02,0x60,0x00,0x00,}}, +{ 0x745B, {0x04,0x80,0x04,0x80,0xFF,0xE0,0x25,0x80,0x2F,0xC0,0xF9,0x40,0x29,0x40,0x3F,0xE0,0x31,0x00,0xC3,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x745C, {0x07,0x00,0x03,0x00,0xF6,0x80,0x6F,0xC0,0x70,0x20,0xFE,0x40,0x73,0xC0,0x7B,0xC0,0x7F,0x80,0xFF,0xC0,0x13,0xC0,0x17,0xC0,0x00,0x00,}}, +{ 0x745E, {0x01,0x00,0x09,0x40,0xFF,0xC0,0x20,0x00,0x2F,0xE0,0xF2,0x00,0x2F,0xC0,0x2B,0x40,0x3B,0x40,0xCB,0x40,0x0B,0x40,0x08,0xC0,0x00,0x00,}}, +{ 0x745F, {0x00,0x00,0xFB,0xE0,0x7B,0xC0,0x7B,0xC0,0xFB,0xE0,0x09,0x80,0x05,0x80,0x15,0xC0,0x72,0x60,0x54,0x20,0x98,0x80,0x2F,0x80,0x00,0x00,}}, +{ 0x7460, {0x02,0x00,0x0D,0xE0,0xF8,0xA0,0x2A,0xA0,0x2D,0xA0,0xF1,0x60,0x2F,0xC0,0x29,0x40,0x3F,0xC0,0xC9,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x7463, {0x01,0x00,0x05,0xC0,0xFD,0x60,0x7F,0xE0,0x68,0x40,0xFF,0xC0,0x68,0x40,0x6F,0xC0,0x6F,0xC0,0xE7,0xC0,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x7464, {0x01,0x00,0x03,0xC0,0xF7,0xC0,0x7F,0x80,0x63,0x00,0xFC,0x00,0x67,0xC0,0x6B,0x00,0x7F,0xE0,0xF9,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x7469, {0x21,0x80,0x29,0xC0,0x7B,0xC0,0xF7,0x80,0xCA,0x40,0x7F,0xE0,0x40,0x40,0xFF,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x746A, {0x00,0x00,0x0F,0xE0,0xFF,0xC0,0x6F,0xC0,0x6F,0xC0,0xF9,0x00,0x6F,0xE0,0x68,0xA0,0x7A,0xA0,0xFD,0x20,0x34,0x20,0x20,0xC0,0x00,0x00,}}, +{ 0x746F, {0x04,0x00,0x05,0xC0,0xFF,0xC0,0x7F,0xC0,0x73,0x80,0xF3,0xC0,0x7F,0xC0,0x73,0xA0,0x77,0xA0,0xF7,0xE0,0x19,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7470, {0x01,0x00,0x02,0x00,0xFF,0xC0,0x6F,0xC0,0x6B,0x40,0xF9,0x40,0x6F,0xC0,0x63,0x80,0x77,0xC0,0xF5,0xE0,0x09,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x7473, {0x04,0x40,0x02,0x80,0xFF,0xC0,0x21,0x00,0x27,0x80,0xF1,0x00,0x2F,0xE0,0x34,0x00,0x6F,0xC0,0x91,0x00,0x2F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7476, {0x01,0xC0,0x0F,0x40,0xF9,0x40,0x65,0x80,0x61,0x00,0xFF,0xC0,0x61,0x00,0x7F,0xE0,0x79,0x40,0xF9,0x40,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x747E, {0x04,0x80,0x1F,0xE0,0xF7,0x80,0x6F,0xC0,0x6B,0x40,0xFF,0xC0,0x61,0x00,0x6F,0xC0,0x77,0x80,0xF7,0x80,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7483, {0x01,0x00,0x1F,0xE0,0xF9,0x40,0x2B,0x40,0x2C,0xC0,0xFF,0xC0,0x21,0x00,0x3F,0xE0,0x32,0xA0,0xDF,0xA0,0x10,0xA0,0x10,0x60,0x00,0x00,}}, +{ 0x748B, {0x01,0x00,0x0F,0xC0,0xF4,0x80,0x7F,0xE0,0x67,0xC0,0xF4,0x80,0x67,0x80,0x64,0x80,0x77,0x80,0xFF,0xE0,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x749E, {0x03,0x80,0x0B,0xC0,0xFF,0xE0,0x6F,0xE0,0x62,0x80,0xFF,0xC0,0x61,0x00,0x67,0x80,0x7F,0xE0,0xFF,0xE0,0x06,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x74A2, {0x00,0x00,0x1F,0xE0,0xFF,0xC0,0x6F,0xC0,0x6B,0xC0,0xFF,0xC0,0x63,0x80,0x6F,0xC0,0x7F,0xC0,0xFF,0xC0,0x0F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x74A7, {0x01,0x80,0x7F,0xE0,0x7A,0x40,0x7F,0xE0,0x79,0x80,0xEF,0xE0,0x79,0x80,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x74B0, {0x00,0x00,0x0F,0xC0,0xFB,0x40,0x2F,0xC0,0x3F,0xE0,0xF7,0x80,0x24,0x80,0x37,0xC0,0x67,0x40,0x8E,0x80,0x12,0x60,0x02,0x00,0x00,0x00,}}, +{ 0x74BD, {0x00,0x00,0xFF,0xE0,0x24,0x80,0xFF,0xE0,0x55,0x40,0x6E,0xC0,0x55,0x40,0x6E,0xC0,0x7F,0xC0,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x74CA, {0x02,0x00,0x07,0x80,0xFF,0xC0,0x6F,0xC0,0x6F,0xC0,0xF4,0x80,0x67,0x80,0x67,0x80,0x77,0xC0,0xFF,0xC0,0x03,0x80,0x1C,0xE0,0x00,0x00,}}, +{ 0x74CF, {0x05,0x80,0x1F,0xE0,0xEB,0xC0,0x7F,0xC0,0x61,0xC0,0xFF,0x80,0x73,0xC0,0x7F,0x80,0x7F,0xC0,0xFF,0xC0,0x13,0xA0,0x16,0xE0,0x00,0x00,}}, +{ 0x74D4, {0x00,0x00,0x1F,0xE0,0xFF,0xE0,0x7F,0xE0,0x73,0xA0,0xFF,0xE0,0x6D,0x40,0x73,0x20,0x7F,0xE0,0xE6,0x80,0x03,0xC0,0x1E,0x20,0x00,0x00,}}, +{ 0x74DC, {0x00,0x80,0x03,0x00,0x3D,0x00,0x25,0x00,0x25,0x00,0x25,0x00,0x24,0x80,0x24,0x80,0x26,0x80,0x45,0x40,0x59,0x40,0x80,0x20,0x00,0x00,}}, +{ 0x74E0, {0x20,0x40,0x31,0x80,0xFF,0x80,0x75,0x80,0xFD,0x80,0x05,0x80,0xFD,0x80,0x65,0x80,0x75,0x80,0x19,0xC0,0x19,0xC0,0x37,0x20,0x00,0x00,}}, +{ 0x74E2, {0x00,0x40,0xFD,0x80,0xFF,0x80,0xFD,0x80,0xFD,0x80,0x05,0x80,0x75,0x80,0x05,0x80,0xFD,0x80,0x79,0xC0,0xEF,0xC0,0x70,0x20,0x00,0x00,}}, +{ 0x74E3, {0x61,0x80,0x62,0xC0,0xFF,0xE0,0x6F,0xC0,0x6F,0xC0,0xFF,0xE0,0x6E,0x80,0x7E,0xC0,0xEF,0xE0,0x77,0x80,0x7D,0x80,0xA0,0x80,0x00,0x00,}}, +{ 0x74E6, {0x00,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x00,0x11,0x00,0x11,0x00,0x19,0x00,0x25,0x00,0x25,0x00,0x27,0x20,0x39,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x74E7, {0x01,0x80,0xFF,0x80,0x61,0x80,0x79,0x80,0x6F,0xE0,0x69,0x80,0x69,0x80,0x79,0x80,0x79,0x80,0x79,0xA0,0x78,0x20,0xC7,0xE0,0x00,0x00,}}, +{ 0x74E9, {0x00,0x40,0xFC,0x80,0x63,0x80,0x79,0x80,0x69,0x80,0x6F,0xE0,0x79,0x80,0x79,0x80,0x69,0x80,0x79,0xA0,0x78,0x20,0xC7,0xE0,0x00,0x00,}}, +{ 0x74EE, {0x1F,0x00,0x11,0x00,0xE4,0xE0,0x8F,0x20,0x3E,0x80,0x00,0x00,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x17,0xA0,0x3F,0xA0,0xE0,0xE0,0x00,0x00,}}, +{ 0x74F0, {0x01,0x80,0xFC,0x80,0x61,0x40,0x7A,0x40,0x6F,0xE0,0x69,0x40,0x79,0x40,0x7B,0x40,0x6E,0xC0,0x78,0xA0,0x78,0x20,0xC7,0xE0,0x00,0x00,}}, +{ 0x74F1, {0x00,0x40,0xFD,0x80,0x67,0x00,0x79,0xC0,0x6F,0x00,0x69,0x00,0x79,0xE0,0x7F,0x00,0x69,0x00,0x79,0xE0,0x78,0x20,0xC7,0xE0,0x00,0x00,}}, +{ 0x74F2, {0x01,0x80,0xFD,0xE0,0x67,0x80,0x7B,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x69,0x80,0x78,0xE0,0x78,0x20,0xC7,0xE0,0x00,0x00,}}, +{ 0x74F6, {0x48,0x00,0x4F,0xE0,0x52,0x00,0xFB,0x80,0x52,0x80,0x53,0x80,0xFF,0x80,0x52,0x80,0x52,0x80,0x53,0xA0,0x5C,0x60,0x90,0x20,0x00,0x00,}}, +{ 0x74F7, {0x04,0x00,0x04,0x00,0xE7,0xE0,0x3B,0x40,0xC5,0x80,0x18,0xC0,0xFF,0xE0,0x30,0x00,0x3F,0x80,0x25,0xA0,0x7F,0xA0,0xE0,0xE0,0x00,0x00,}}, +{ 0x74F8, {0x00,0x00,0xFF,0xE0,0x61,0x00,0x7B,0xC0,0x6A,0x40,0x6B,0xC0,0x7A,0x40,0x7A,0x40,0x6B,0xC0,0x78,0x20,0x78,0x20,0xC7,0xE0,0x00,0x00,}}, +{ 0x7503, {0x09,0x80,0x71,0xA0,0xFB,0xA0,0xFF,0xC0,0x79,0x40,0xA2,0x20,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x17,0xA0,0x3F,0xA0,0xE0,0xE0,0x00,0x00,}}, +{ 0x7504, {0x00,0x00,0xFF,0xE0,0xF9,0x00,0xFD,0xC0,0xF5,0x40,0xFD,0x40,0xA5,0xC0,0x31,0xC0,0xFD,0x40,0x21,0x60,0x39,0xE0,0xE6,0x20,0x00,0x00,}}, +{ 0x7505, {0x00,0x00,0xFF,0xE0,0x47,0xC0,0x77,0xC0,0x57,0xC0,0x57,0xC0,0x77,0xC0,0x75,0x80,0x5B,0xC0,0x5F,0xE0,0x70,0x20,0xCF,0xE0,0x00,0x00,}}, +{ 0x750C, {0x00,0x00,0xFF,0xE0,0xB9,0x00,0xF9,0xC0,0xF9,0x40,0x81,0x40,0xFD,0xC0,0xF5,0xC0,0xFD,0x60,0xF9,0x60,0xFD,0xA0,0x86,0x20,0x00,0x00,}}, +{ 0x750D, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xE0,0x40,0x40,0xBF,0x80,0x7F,0x00,0x7F,0xA0,0x3F,0xA0,0xE0,0xE0,0x00,0x00,}}, +{ 0x750E, {0x20,0x00,0xFF,0xE0,0x79,0x00,0x79,0xC0,0x79,0x40,0x79,0x40,0x29,0xC0,0xFD,0xC0,0xF9,0x60,0xF9,0x60,0x51,0xA0,0x36,0x20,0x00,0x00,}}, +{ 0x7511, {0x88,0x00,0x53,0xE0,0xFD,0x00,0xFD,0xC0,0xB5,0x40,0xFD,0x40,0x01,0xC0,0x7A,0xC0,0x4A,0x40,0x7B,0x60,0x7E,0x60,0x48,0x20,0x00,0x00,}}, +{ 0x7513, {0x01,0x80,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0xE9,0x80,0x79,0x80,0xFF,0xE0,0x1F,0x00,0x1F,0xA0,0x3F,0xA0,0xE0,0xE0,0x00,0x00,}}, +{ 0x7515, {0x04,0x00,0xFF,0xE0,0x63,0xE0,0x7F,0xE0,0x3B,0xC0,0xFB,0xC0,0x12,0x80,0x33,0xE0,0x7F,0xC0,0x7F,0x20,0x35,0xA0,0xFA,0xE0,0x00,0x00,}}, +{ 0x7518, {0x10,0x80,0x10,0x80,0x10,0x80,0x7F,0xE0,0x10,0x80,0x10,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x751A, {0x11,0x00,0x7F,0xC0,0x11,0x00,0x1F,0x00,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x2A,0x00,0x2B,0xC0,0x30,0x00,0x3F,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x751C, {0x1A,0x40,0x62,0x40,0x22,0x40,0xFF,0xE0,0x22,0x40,0x22,0x40,0x22,0x40,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x00,0x00,}}, +{ 0x751E, {0x24,0x80,0x35,0x80,0x7F,0xE0,0x9F,0x00,0x31,0x80,0x3F,0x80,0x21,0x80,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x751F, {0x04,0x00,0x24,0x00,0x24,0x00,0x3F,0xC0,0x64,0x00,0x44,0x00,0x84,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7523, {0x04,0x00,0x7F,0xE0,0x11,0x00,0x7F,0xE0,0x4A,0x00,0x4A,0x00,0x5F,0xC0,0x72,0x00,0x5F,0x80,0x42,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7525, {0x10,0x00,0x37,0xE0,0x3C,0xA0,0x37,0xE0,0x54,0xA0,0x14,0xA0,0x3F,0xE0,0x11,0x80,0x17,0xE0,0x19,0x20,0x62,0x20,0x0C,0x40,0x00,0x00,}}, +{ 0x7526, {0x01,0x80,0xFF,0x80,0x7B,0x80,0x7B,0xE0,0x7D,0x80,0x6D,0x80,0x7B,0xC0,0xE9,0x80,0x67,0xE0,0x67,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x7528, {0x00,0x00,0x1F,0xC0,0x12,0x40,0x12,0x40,0x1F,0xC0,0x12,0x40,0x12,0x40,0x1F,0xC0,0x12,0x40,0x12,0x40,0x22,0x40,0x40,0x40,0x00,0x00,}}, +{ 0x752B, {0x04,0x80,0x04,0x40,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x752C, {0x00,0x00,0x7F,0xC0,0x1F,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x7530, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,0x00,0x00,}}, +{ 0x7531, {0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x7532, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7533, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7537, {0x00,0x00,0x1F,0xC0,0x12,0x40,0x1F,0xC0,0x12,0x40,0x12,0x40,0x1F,0xC0,0x02,0x00,0x7F,0xE0,0x04,0x20,0x18,0x20,0x60,0xC0,0x00,0x00,}}, +{ 0x7538, {0x10,0x00,0x18,0x00,0x1F,0xE0,0x30,0x20,0x3F,0xA0,0x74,0xA0,0x34,0xA0,0x3F,0xA0,0x34,0xA0,0x3F,0xA0,0x31,0xA0,0x00,0xC0,0x00,0x00,}}, +{ 0x753A, {0x00,0x00,0x7E,0x00,0x53,0xE0,0x52,0x80,0x7E,0x80,0x52,0x80,0x52,0x80,0x52,0x80,0x7E,0x80,0x00,0x80,0x00,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x753B, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x5F,0x40,0x55,0x40,0x55,0x40,0x5F,0x40,0x55,0x40,0x55,0x40,0x5F,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x753C, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x7544, {0x08,0x40,0x44,0x40,0x64,0x80,0x01,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x7546, {0x21,0x80,0x21,0x80,0xF9,0x80,0xF9,0x80,0x79,0x80,0x69,0x80,0x69,0x80,0x79,0xC0,0x69,0x40,0x69,0xE0,0x7E,0x20,0x48,0x20,0x00,0x00,}}, +{ 0x7549, {0x01,0x00,0x01,0x00,0xFF,0xC0,0xFF,0xC0,0xF1,0x00,0xF1,0x00,0xFF,0xE0,0xF3,0x00,0xF3,0x80,0xF4,0x80,0x08,0x40,0x10,0x20,0x00,0x00,}}, +{ 0x754A, {0x02,0x80,0x02,0x80,0xFF,0xE0,0xFF,0xE0,0xF2,0x80,0xF2,0x80,0xF2,0x80,0xFF,0xE0,0xF6,0x80,0xF4,0x80,0x08,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x754B, {0x02,0x00,0x02,0x00,0xF3,0xE0,0xF7,0xE0,0xF6,0x80,0xFA,0x80,0xF1,0x80,0xF1,0x80,0xF1,0x80,0xF1,0x80,0x06,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x754C, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x0A,0x00,0x31,0x80,0xD1,0x60,0x11,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x754D, {0x01,0x00,0x01,0x00,0xF3,0x00,0xF3,0x80,0xF4,0x80,0xFA,0xC0,0xF3,0xA0,0xF3,0x80,0xF7,0x80,0xF5,0x80,0x09,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x754F, {0x00,0x00,0x7F,0x80,0x44,0x80,0x7F,0x80,0x44,0x80,0x7F,0x80,0x00,0x00,0xFF,0xE0,0x22,0x80,0x2F,0x00,0x31,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x7551, {0x10,0x00,0x11,0xE0,0x11,0x60,0x15,0x60,0x39,0x60,0x31,0xE0,0x51,0x60,0x11,0x60,0x19,0x60,0x25,0xE0,0x25,0x20,0x40,0x00,0x00,0x00,}}, +{ 0x7554, {0x01,0x00,0x09,0x40,0xF5,0x40,0xB1,0x00,0xBF,0xC0,0xB1,0x00,0xF1,0x00,0xBF,0xE0,0xB1,0x00,0xF1,0x00,0x81,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x7559, {0x0C,0x00,0x33,0xE0,0x20,0xA0,0x2D,0x20,0x32,0x20,0x44,0x40,0x1F,0xC0,0x12,0x40,0x1F,0xC0,0x12,0x40,0x1F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x755A, {0x08,0x00,0x0B,0x00,0x7F,0xC0,0x7C,0x00,0xFF,0xE0,0x11,0x00,0x61,0x80,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x755B, {0x01,0x00,0x03,0x00,0xF3,0x80,0xF4,0x80,0xF8,0xC0,0xF3,0x20,0xFC,0x80,0xF1,0x00,0xFE,0x40,0xF8,0x80,0x03,0x00,0x1C,0x00,0x00,0x00,}}, +{ 0x755C, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3B,0x00,0x15,0x00,0x0F,0x80,0xF8,0x40,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x755D, {0x21,0x00,0x21,0x00,0xF9,0xC0,0x01,0x40,0x7A,0x40,0x6C,0x80,0x68,0x80,0x78,0x80,0x69,0x40,0x7A,0x40,0x4C,0x20,0x08,0x20,0x00,0x00,}}, +{ 0x7560, {0x04,0x00,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x00,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x7562, {0x00,0x00,0x7F,0x80,0x44,0x80,0x7F,0x80,0x7F,0x80,0x25,0x80,0xFF,0xE0,0x35,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7564, {0x01,0x00,0x03,0x00,0xFF,0xC0,0xF1,0x00,0xFF,0xE0,0xF0,0x80,0xF0,0x80,0xFF,0xE0,0xF4,0x80,0xF2,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x7565, {0x01,0x00,0x01,0x00,0xF3,0xC0,0xB6,0x40,0xB9,0x80,0xF1,0x80,0xB6,0x40,0xBB,0xE0,0xB2,0x40,0xF2,0x40,0x83,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x7566, {0x01,0x00,0x01,0x00,0xFF,0xC0,0xD1,0x00,0xDF,0xE0,0xD1,0x00,0xF1,0x00,0xDF,0xC0,0xD1,0x00,0xF1,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7567, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x08,0x00,0x1F,0x80,0x73,0x00,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7569, {0x01,0x00,0x01,0x00,0xFF,0xE0,0xFF,0xE0,0xF3,0x40,0xF5,0x40,0xF5,0x80,0xFD,0x80,0xF4,0x80,0xF4,0x80,0x06,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x756A, {0x01,0x80,0x7E,0x80,0x25,0x00,0xFF,0xE0,0x0E,0x00,0x15,0x00,0x64,0x80,0xBF,0xE0,0x24,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x756B, {0x04,0x00,0x7F,0xC0,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x7F,0x80,0x64,0x80,0x7F,0x80,0x7F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x756D, {0x01,0x00,0x03,0x00,0xF6,0x80,0xFF,0xC0,0xF3,0x20,0xF1,0x00,0xFF,0xE0,0xF1,0x00,0xF5,0x40,0xF9,0x20,0x11,0x20,0x03,0x00,0x00,0x00,}}, +{ 0x7570, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x09,0x00,0x10,0x80,0x60,0x40,0x00,0x00,}}, +{ 0x7573, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x00,0x00,0x7F,0xE0,0x5F,0x40,0x91,0x00,0x1F,0x00,0x11,0x00,0x1F,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x7574, {0x01,0x00,0x03,0x00,0xFF,0xE0,0xF7,0xC0,0xF3,0x00,0xFF,0xE0,0xF2,0x80,0xFF,0xE0,0xF6,0x80,0xF9,0x80,0x10,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x7576, {0x24,0x80,0x35,0x80,0x7F,0xE0,0x9F,0x00,0x31,0x80,0x3F,0x80,0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7577, {0x00,0x00,0x0F,0xC0,0xFB,0x40,0xBC,0xC0,0xB6,0x80,0xF9,0x40,0xBF,0xC0,0xB3,0x40,0xBC,0xC0,0xF6,0x80,0x8B,0xC0,0x11,0x20,0x00,0x00,}}, +{ 0x7578, {0x01,0x00,0x03,0x00,0xFF,0xC0,0xF3,0x00,0xF4,0x80,0xFF,0xE0,0xF0,0x40,0xF7,0xC0,0xF7,0xC0,0xF7,0xC0,0x00,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x757F, {0x65,0x80,0x55,0x40,0xF7,0xC0,0x75,0xC0,0xFF,0xE0,0x0B,0xA0,0xFF,0xE0,0x7A,0x40,0x79,0x40,0x79,0x80,0x79,0xA0,0x46,0x60,0x00,0x00,}}, +{ 0x7582, {0x3F,0x80,0x35,0x80,0x3F,0x80,0x7F,0xC0,0x3B,0x80,0x60,0xC0,0x7F,0xE0,0xFF,0xC0,0xBF,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7586, {0x00,0x00,0xFF,0xE0,0x17,0xC0,0x77,0xC0,0x47,0x40,0x77,0xC0,0x5F,0xE0,0x77,0xC0,0x77,0xC0,0x77,0xC0,0xD7,0xC0,0x6F,0xE0,0x00,0x00,}}, +{ 0x7587, {0x01,0x00,0x0F,0xC0,0xF7,0x80,0xFF,0xE0,0xF7,0xC0,0xF1,0x00,0xF7,0x80,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x0E,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x7589, {0x3F,0x80,0x35,0x80,0x3F,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x7F,0xC0,0x7F,0xE0,0x8F,0x40,0x1F,0x00,0x35,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x758A, {0x3F,0x80,0x35,0x80,0x3F,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7F,0xE0,0xFF,0xC0,0x3F,0x80,0x31,0x80,0xFF,0xE0,0x00,0x00,}}, +{ 0x758B, {0x00,0x00,0xFF,0xE0,0x04,0x40,0x04,0x80,0x24,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x34,0x00,0x6C,0x00,0x46,0x00,0x81,0xE0,0x00,0x00,}}, +{ 0x758E, {0x01,0x00,0xF9,0x00,0x1F,0xE0,0x2F,0xC0,0x69,0x40,0x79,0x40,0x6F,0xC0,0x63,0x80,0x67,0x80,0x79,0x40,0x71,0x20,0xC1,0x00,0x00,0x00,}}, +{ 0x758F, {0x01,0x00,0xF9,0x00,0x1F,0xE0,0x32,0xC0,0x2F,0xA0,0x60,0x80,0x75,0x80,0x65,0x80,0x65,0x80,0x75,0xA0,0x68,0xA0,0xD0,0x60,0x00,0x00,}}, +{ 0x7591, {0x40,0x00,0x5F,0xC0,0x62,0x80,0x79,0x80,0x47,0xE0,0x79,0x40,0x55,0x00,0xFD,0xC0,0x35,0x00,0x2F,0x00,0x49,0x80,0x90,0x60,0x00,0x00,}}, +{ 0x7594, {0x01,0x00,0x03,0x00,0x3F,0xE0,0xA0,0x00,0x7F,0xE0,0x21,0x00,0x61,0x00,0xE1,0x00,0xA1,0x00,0x61,0x00,0x41,0x00,0x83,0x00,0x00,0x00,}}, +{ 0x759A, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA2,0x00,0x67,0x80,0x24,0x80,0x69,0x80,0xF1,0x00,0xA3,0x00,0x67,0x00,0x58,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x759D, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA1,0x00,0x69,0x40,0x29,0x40,0x69,0x40,0xE9,0x40,0xA9,0x40,0x69,0x40,0x4F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x75A3, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA2,0x40,0x7F,0xE0,0x22,0x00,0x63,0x00,0xE3,0x00,0xA5,0x00,0x69,0x20,0x51,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x75A5, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA1,0x00,0x63,0x00,0x24,0x80,0x6D,0xC0,0xF5,0xA0,0xA5,0x80,0x65,0x80,0x49,0x80,0x91,0x80,0x00,0x00,}}, +{ 0x75AB, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA7,0x00,0x65,0x20,0x25,0x20,0x68,0xE0,0xBF,0x80,0x24,0x80,0x43,0x00,0x45,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x75B1, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA4,0x00,0x6F,0xC0,0x30,0x40,0x6F,0x40,0xEB,0x40,0xAF,0xC0,0x69,0xA0,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x75B2, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA2,0x00,0x6F,0xC0,0x2A,0x40,0x2F,0x80,0x6C,0x80,0xAA,0x80,0x49,0x00,0x52,0x80,0xAC,0x60,0x00,0x00,}}, +{ 0x75B3, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA4,0x80,0x7F,0xE0,0x24,0x80,0x64,0x80,0xE7,0x80,0xA4,0x80,0x64,0x80,0x47,0x80,0x84,0x80,0x00,0x00,}}, +{ 0x75B5, {0x02,0x00,0x02,0x00,0x7F,0xE0,0xE5,0x80,0x75,0x80,0x75,0xA0,0x77,0xC0,0xF5,0x80,0xF5,0x80,0x57,0xA0,0x5D,0xA0,0xF0,0xE0,0x00,0x00,}}, +{ 0x75B8, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAF,0x80,0x68,0x80,0x28,0x80,0x6F,0x80,0xE8,0x80,0xAF,0x80,0x67,0x80,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x75B9, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA6,0x00,0x69,0x80,0x31,0x60,0x26,0x00,0x61,0x00,0xA6,0x40,0x20,0x80,0x43,0x00,0x9C,0x00,0x00,0x00,}}, +{ 0x75BC, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA3,0x80,0x64,0x80,0x3A,0x80,0x63,0x00,0xFD,0xC0,0xB3,0x60,0x6E,0x00,0x43,0x00,0x80,0x80,0x00,0x00,}}, +{ 0x75BD, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAF,0x80,0x68,0x80,0x28,0x80,0x6F,0x80,0xE8,0x80,0xAF,0x80,0x68,0x80,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x75BE, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA4,0x00,0x67,0xC0,0x29,0x00,0x71,0x00,0xBF,0xE0,0x23,0x00,0x24,0x80,0x48,0x40,0xB0,0x20,0x00,0x00,}}, +{ 0x75C2, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA8,0x00,0x7E,0xC0,0x2B,0xC0,0x6B,0xC0,0xEB,0xC0,0xAB,0xC0,0x6B,0xC0,0x53,0xC0,0xA6,0x00,0x00,0x00,}}, +{ 0x75C3, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA1,0x00,0x7F,0xE0,0x21,0x00,0x62,0x80,0xEE,0x80,0xA1,0x80,0x62,0xC0,0x7F,0xA0,0x80,0x20,0x00,0x00,}}, +{ 0x75C5, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAF,0xC0,0x61,0x00,0x2F,0xC0,0x69,0x40,0xAB,0x40,0x2C,0xC0,0x48,0x40,0x48,0x40,0x88,0xC0,0x00,0x00,}}, +{ 0x75C7, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA0,0x00,0x6F,0xC0,0x21,0x00,0x21,0x00,0x69,0xC0,0xA9,0x00,0x29,0x00,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x75CA, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA7,0x00,0x64,0x80,0x3F,0xE0,0x61,0x00,0xE3,0x00,0xAF,0xC0,0x61,0x00,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x75CD, {0x02,0x00,0x3F,0xE0,0xBF,0xE0,0x7F,0xE0,0x2F,0xC0,0x21,0x40,0x6F,0xC0,0xBB,0x00,0x3F,0xE0,0x63,0xE0,0x4C,0xC0,0xB0,0x60,0x00,0x00,}}, +{ 0x75D2, {0x01,0x00,0x03,0x00,0x3F,0xE0,0xA6,0x80,0x7F,0xE0,0x21,0x00,0x6F,0xC0,0xE1,0x00,0xBF,0xE0,0x7F,0xE0,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x75D4, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA1,0x00,0x6F,0xC0,0x21,0x00,0x3F,0xE0,0x60,0x80,0xBF,0xE0,0x24,0x80,0x44,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x75D5, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAF,0x80,0x68,0x80,0x2F,0x80,0x68,0x80,0xAF,0xC0,0x29,0x40,0x69,0x80,0x4E,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x75D8, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xBF,0xC0,0x60,0x00,0x2F,0x80,0x28,0x80,0x68,0x80,0xAF,0x80,0x24,0x80,0x45,0x00,0xBF,0xE0,0x00,0x00,}}, +{ 0x75D9, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xBF,0xE0,0x7B,0x40,0x29,0x40,0x72,0x80,0xEB,0x40,0xAF,0xC0,0x61,0x00,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x75DB, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAF,0x80,0x65,0x00,0x23,0x00,0x2F,0xC0,0x6A,0x40,0xAF,0xC0,0x2F,0xC0,0x4A,0x40,0x8A,0xC0,0x00,0x00,}}, +{ 0x75DE, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xBF,0xE0,0x73,0x80,0x27,0xC0,0x79,0x20,0xE3,0x00,0xAF,0xC0,0x68,0x40,0x4F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x75E2, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA7,0x40,0x7D,0x40,0x25,0x40,0x3F,0x40,0x6D,0x40,0xAF,0x40,0x55,0x40,0x44,0x40,0x84,0xC0,0x00,0x00,}}, +{ 0x75E3, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA1,0x00,0x7F,0xE0,0x21,0x00,0x6F,0xC0,0xE1,0x00,0xB5,0x80,0x74,0x20,0x74,0xA0,0x83,0x80,0x00,0x00,}}, +{ 0x75E9, {0x02,0x00,0x3F,0xE0,0x21,0x00,0xAF,0xC0,0x6F,0xC0,0x29,0x40,0x6F,0xC0,0xA3,0x00,0x2F,0xC0,0x23,0x80,0x47,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x75F0, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA9,0x40,0x69,0xC0,0x33,0x80,0x65,0x60,0xF9,0x40,0xA9,0x40,0x7B,0x80,0x4C,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x75F2, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA4,0x80,0x7F,0xE0,0x24,0x80,0x6F,0xC0,0xEF,0xC0,0xAF,0xE0,0x7F,0xE0,0x76,0xC0,0x84,0x80,0x00,0x00,}}, +{ 0x75F3, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA4,0x80,0x7F,0xE0,0x24,0x80,0x6F,0xC0,0xEF,0xC0,0xBD,0xE0,0x76,0xA0,0x74,0x80,0x84,0x80,0x00,0x00,}}, +{ 0x75F4, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA8,0x00,0x6F,0xC0,0x35,0x40,0x25,0x40,0x7F,0x40,0xA5,0x40,0x6F,0xC0,0x53,0x40,0xA0,0x00,0x00,0x00,}}, +{ 0x75FA, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAF,0xC0,0x6B,0x40,0x2F,0xC0,0x69,0x40,0xEF,0xC0,0xA7,0x80,0x7F,0xE0,0x41,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x75FC, {0x02,0x00,0x02,0x00,0x7F,0xE0,0xFF,0xC0,0x72,0x40,0x7F,0xC0,0x72,0x40,0xF7,0xC0,0xF7,0xC0,0x57,0x40,0x5F,0xC0,0x90,0x40,0x00,0x00,}}, +{ 0x75FE, {0x02,0x00,0x02,0x00,0x7F,0xE0,0xFF,0xE0,0x74,0x40,0x7B,0x40,0x7B,0xC0,0xF7,0xC0,0xF7,0xC0,0x5C,0x40,0x50,0x40,0x90,0xC0,0x00,0x00,}}, +{ 0x75FF, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA7,0x80,0x7F,0xE0,0x27,0x80,0x79,0x60,0xF3,0x00,0xBF,0xE0,0x6F,0x80,0x43,0x80,0x9C,0x40,0x00,0x00,}}, +{ 0x7601, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xBF,0xE0,0x74,0xC0,0x24,0x80,0x6D,0x40,0xF3,0x20,0xBF,0xE0,0x7F,0xE0,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x7609, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xA7,0x00,0x6F,0x80,0x30,0x60,0x7F,0xC0,0xFB,0xC0,0xBF,0x80,0x7F,0xC0,0x53,0xC0,0x97,0xC0,0x00,0x00,}}, +{ 0x760B, {0x02,0x00,0x7F,0xE0,0xEF,0x80,0x7F,0x80,0x7E,0x80,0x7F,0x80,0x7B,0x80,0xFB,0x80,0x7F,0xE0,0x73,0xE0,0x7C,0xE0,0xE0,0x20,0x00,0x00,}}, +{ 0x760D, {0x02,0x00,0x3F,0xE0,0xAF,0x80,0x6F,0x80,0x28,0x80,0x2F,0x80,0x7F,0xE0,0xA8,0x00,0x3F,0xC0,0x75,0x40,0x4A,0x40,0x94,0x80,0x00,0x00,}}, +{ 0x761F, {0x02,0x00,0x3F,0xE0,0xA7,0x80,0x6F,0x80,0x2B,0x80,0x2D,0x80,0x6F,0x80,0xA0,0x00,0x2F,0xC0,0x6B,0xC0,0x7F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x7620, {0x02,0x00,0x3F,0xE0,0xB9,0x60,0x79,0x60,0x3F,0xE0,0x24,0x80,0x7F,0xE0,0xA4,0x80,0x27,0x80,0x67,0x80,0x44,0x80,0x84,0x80,0x00,0x00,}}, +{ 0x7621, {0x02,0x00,0x3F,0xE0,0xA3,0x00,0x67,0x80,0x3F,0xE0,0x24,0x80,0x67,0x80,0xA7,0x80,0x27,0xC0,0x6F,0xC0,0x57,0xC0,0xA4,0x40,0x00,0x00,}}, +{ 0x7622, {0x02,0x00,0x7F,0xE0,0xE4,0xC0,0x7F,0xC0,0x73,0xC0,0x7B,0xE0,0x77,0x20,0xFF,0xC0,0x7B,0xC0,0x5A,0xC0,0x7A,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x7624, {0x02,0x00,0x3F,0xE0,0x27,0xC0,0xAD,0xC0,0x6B,0xC0,0x3F,0xC0,0x62,0x00,0xEF,0xC0,0xAF,0xC0,0x6F,0xC0,0x4F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x7627, {0x02,0x00,0x3F,0xE0,0xA1,0xC0,0x6F,0xE0,0x2B,0xC0,0x2F,0x40,0x69,0xC0,0xAB,0xC0,0x3F,0xE0,0x7F,0xE0,0x73,0xC0,0xE2,0x00,0x00,0x00,}}, +{ 0x7630, {0x02,0x00,0x3F,0xE0,0xAF,0xC0,0x6F,0xC0,0x2B,0x40,0x2F,0xC0,0x62,0x80,0xAD,0xC0,0x3F,0xE0,0x7F,0xE0,0x59,0x20,0x81,0x00,0x00,0x00,}}, +{ 0x7634, {0x02,0x00,0x3F,0xE0,0xA7,0xC0,0x67,0xC0,0x3F,0xE0,0x27,0x80,0x64,0x80,0xA7,0x80,0x27,0x80,0x7F,0xE0,0x43,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x763B, {0x02,0x00,0x3F,0xE0,0xA7,0xC0,0x7F,0xE0,0x3F,0xC0,0x21,0x00,0x6F,0xC0,0xAF,0xC0,0x3F,0xE0,0x6F,0xE0,0x43,0x80,0x9E,0x40,0x00,0x00,}}, +{ 0x7642, {0x02,0x00,0x3F,0xE0,0x22,0x00,0xBF,0xE0,0x74,0xC0,0x2F,0xC0,0x74,0xA0,0xA7,0x80,0x27,0x80,0x2D,0x40,0x51,0x20,0x83,0x00,0x00,0x00,}}, +{ 0x7646, {0x02,0x00,0x3F,0xE0,0xB7,0xA0,0x77,0xE0,0x3B,0xC0,0x33,0x20,0x7F,0xE0,0xB2,0x40,0x3F,0xC0,0x64,0x40,0x48,0x40,0xB0,0x80,0x00,0x00,}}, +{ 0x7647, {0x02,0x00,0x7F,0xE0,0xEF,0xC0,0x7F,0xC0,0x7F,0xC0,0x73,0x40,0x7F,0xC0,0xF7,0xC0,0x77,0xC0,0x57,0xC0,0x57,0xC0,0x95,0xC0,0x00,0x00,}}, +{ 0x7648, {0x02,0x00,0x3F,0xE0,0xB7,0x80,0x7F,0xA0,0x38,0xC0,0x3D,0xA0,0x65,0xA0,0xBE,0xE0,0x3F,0xC0,0x6D,0xC0,0x45,0x80,0x9B,0x60,0x00,0x00,}}, +{ 0x764C, {0x02,0x00,0x3F,0xE0,0x27,0x80,0xA4,0x80,0x67,0x80,0x3E,0xE0,0x72,0xA0,0xBE,0xE0,0x31,0x20,0x29,0x40,0x4F,0xC0,0x88,0x40,0x00,0x00,}}, +{ 0x7652, {0x02,0x00,0x3F,0xE0,0x3F,0x80,0xBF,0xE0,0x6F,0xC0,0x2B,0xC0,0x6F,0xC0,0xAE,0xC0,0x2A,0x40,0x77,0x40,0x54,0xE0,0xA3,0xA0,0x00,0x00,}}, +{ 0x7656, {0x02,0x00,0x02,0x00,0x3F,0xE0,0xAE,0x80,0x6B,0xE0,0x2B,0x40,0x2F,0x80,0x69,0xE0,0xAE,0x80,0x5B,0xE0,0x6E,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x7658, {0x02,0x00,0x3F,0xE0,0xBF,0xE0,0x7F,0xE0,0x2B,0x40,0x2F,0xC0,0x69,0x40,0xBF,0xC0,0x3F,0xE0,0x71,0xE0,0x5E,0x60,0x90,0x60,0x00,0x00,}}, +{ 0x765C, {0x02,0x00,0x7F,0xE0,0xEF,0xC0,0x7F,0xC0,0x7F,0xE0,0x7B,0xE0,0x7F,0x20,0xFB,0xC0,0x7F,0xC0,0x7F,0x80,0x6B,0xC0,0x91,0x20,0x00,0x00,}}, +{ 0x7661, {0x02,0x00,0x3F,0xE0,0xAB,0xE0,0x6F,0xE0,0x2A,0xC0,0x27,0xE0,0x68,0xA0,0xBF,0xC0,0x3F,0xE0,0x7F,0x80,0x53,0x80,0xA2,0x60,0x00,0x00,}}, +{ 0x7662, {0x02,0x00,0x3F,0xE0,0xBF,0xE0,0x7F,0xE0,0x2F,0xC0,0x3F,0xE0,0x65,0x80,0xBF,0xC0,0x37,0xA0,0x67,0xC0,0x47,0xC0,0x9E,0x40,0x00,0x00,}}, +{ 0x7667, {0x02,0x00,0x7F,0xE0,0xEF,0xE0,0x7F,0xE0,0x74,0xC0,0x7F,0xE0,0x76,0xC0,0xFD,0xA0,0x71,0xC0,0x75,0xC0,0x7F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x7668, {0x02,0x00,0x3F,0xE0,0xAF,0xC0,0x7F,0xE0,0x3F,0xC0,0x2D,0xC0,0x6F,0xC0,0xB9,0x80,0x2F,0xC0,0x6F,0xC0,0x4F,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x7669, {0x02,0x00,0x7F,0xE0,0xFF,0xC0,0x7F,0xC0,0x7F,0xC0,0x6B,0xC0,0x6B,0x40,0xFF,0xC0,0x7F,0xC0,0x7B,0xC0,0x69,0xC0,0x8B,0x20,0x00,0x00,}}, +{ 0x766A, {0x02,0x00,0x7F,0xE0,0xFF,0xC0,0x7B,0xC0,0x6B,0xE0,0x7F,0xC0,0x69,0x40,0xFF,0xC0,0x7B,0xC0,0x6B,0xC0,0x49,0xC0,0x8B,0x20,0x00,0x00,}}, +{ 0x766C, {0x02,0x00,0x7F,0xE0,0xEF,0x40,0x7D,0xC0,0x7F,0xE0,0x6A,0x80,0x7E,0xC0,0xFA,0xC0,0x7F,0xE0,0x7E,0x80,0x6B,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x7670, {0x02,0x00,0x7F,0xE0,0xFF,0xC0,0x7F,0xE0,0x7F,0xC0,0x73,0xC0,0x7F,0xE0,0xFF,0xC0,0x7F,0xE0,0x7D,0xC0,0x63,0xE0,0x9F,0x80,0x00,0x00,}}, +{ 0x7672, {0x02,0x00,0x7F,0xE0,0xFF,0xE0,0x7F,0xE0,0x6E,0xC0,0x6F,0xC0,0x6F,0xC0,0xEF,0xC0,0x6F,0xC0,0x7F,0xC0,0x4A,0xC0,0xB1,0xA0,0x00,0x00,}}, +{ 0x7676, {0x00,0x00,0x00,0x00,0x1D,0x80,0x0F,0x40,0x4A,0x40,0x31,0x80,0x20,0x80,0x40,0xC0,0x80,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0x7678, {0x3A,0x80,0x0A,0x80,0x51,0x20,0x31,0x60,0x3F,0xC0,0x44,0x40,0x84,0x20,0x7F,0xC0,0x04,0x00,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x767A, {0x3A,0x80,0x0A,0x80,0x51,0x20,0x20,0xC0,0x3F,0x80,0x49,0x40,0x89,0x20,0x7F,0xC0,0x09,0x00,0x11,0x20,0x21,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x767B, {0x3A,0x80,0x0A,0x80,0x51,0x20,0x21,0x40,0x3F,0xC0,0x40,0x40,0x9F,0x20,0x11,0x00,0x1F,0x00,0x0A,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x767C, {0x3A,0x80,0x0A,0xA0,0x71,0xA0,0x73,0xC0,0xD3,0xA0,0x13,0xC0,0x74,0xC0,0x4F,0x80,0x72,0x80,0x13,0x00,0x33,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x767D, {0x04,0x00,0x08,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x00,}}, +{ 0x767E, {0x00,0x00,0xFF,0xE0,0x08,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7680, {0x04,0x00,0x08,0x00,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x61,0x80,0x7E,0x00,0x78,0x40,0x60,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0x7683, {0x04,0x00,0x08,0x00,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x52,0x40,0x12,0x00,0x12,0x00,0x22,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x7684, {0x11,0x00,0x21,0x00,0x41,0xE0,0x7A,0x20,0x4A,0x20,0x4D,0x20,0x78,0xA0,0x48,0xA0,0x48,0x20,0x78,0x20,0x40,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x7686, {0x42,0x00,0x42,0xC0,0x7F,0x00,0x42,0x20,0x77,0xE0,0xC8,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7687, {0x04,0x00,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x00,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x7688, {0x60,0x00,0x47,0xE0,0xE4,0x00,0xE7,0xC0,0xA6,0x40,0xE6,0x40,0xA5,0x80,0xA5,0x80,0xE9,0x80,0xF9,0x80,0x36,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x768B, {0x04,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x35,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x768E, {0x61,0x00,0x43,0x00,0xFF,0xE0,0xE4,0x40,0xA8,0xE0,0xF4,0xA0,0xA4,0x80,0xA3,0x80,0xE3,0x00,0xE3,0x00,0x0C,0xC0,0x30,0x20,0x00,0x00,}}, +{ 0x7690, {0x08,0x00,0x10,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x35,0x80,0x04,0x00,0x35,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7693, {0x61,0x00,0x45,0x00,0xE7,0xC0,0xEF,0xC0,0xB1,0x00,0xFF,0xE0,0xA0,0x00,0xA7,0x80,0xE4,0x80,0xE4,0x80,0x07,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x7696, {0x61,0x00,0x43,0x00,0xEF,0xE0,0xFF,0xC0,0xB0,0x00,0xE0,0x00,0xBF,0xE0,0xA3,0x80,0xE3,0x80,0x05,0xA0,0x19,0xA0,0x20,0xE0,0x00,0x00,}}, +{ 0x7699, {0x20,0xC0,0x33,0x00,0xFB,0xE0,0x7B,0xE0,0x62,0x80,0xAA,0x80,0x34,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x769A, {0x61,0x00,0x49,0x40,0xEF,0xC0,0xE7,0xC0,0xBF,0xE0,0xE0,0x00,0xAF,0xC0,0xA8,0x40,0xEF,0xC0,0xE6,0x80,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76AE, {0x02,0x00,0x02,0x00,0x3F,0xE0,0x22,0x40,0x22,0x00,0x3F,0x80,0x28,0x80,0x25,0x00,0x22,0x00,0x43,0x00,0x4C,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x76B0, {0x21,0x00,0x31,0x00,0x7F,0xE0,0x7B,0xE0,0x77,0xA0,0x7A,0xA0,0x6A,0xA0,0x7B,0xE0,0x52,0x40,0x5A,0x20,0x6A,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x76B4, {0x21,0x80,0x31,0x80,0xFF,0xE0,0xF7,0xC0,0x77,0x80,0x6F,0xC0,0xA3,0x40,0x7B,0xC0,0xFA,0x80,0x34,0x80,0x2D,0x40,0xCA,0x20,0x00,0x00,}}, +{ 0x76B7, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x7B,0xE0,0x03,0x80,0x7B,0xC0,0x4B,0x40,0x7B,0x80,0x57,0x80,0x7D,0x80,0x7A,0x40,0xD4,0x20,0x00,0x00,}}, +{ 0x76B8, {0x01,0x80,0x7D,0x80,0xFF,0xE0,0xFF,0xC0,0x7B,0x80,0x6B,0xC0,0x7B,0x40,0x7B,0xC0,0x7A,0x80,0xFC,0x80,0x35,0x40,0x2A,0x20,0x00,0x00,}}, +{ 0x76B9, {0x20,0x00,0x33,0xE0,0x7F,0xE0,0x7F,0xE0,0x73,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x53,0xC0,0x5F,0xE0,0x69,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x76BA, {0x61,0x80,0x79,0x80,0xFB,0xE0,0xFB,0xC0,0x7B,0x80,0x73,0xC0,0x7B,0x40,0xFB,0xC0,0xFA,0x80,0x7A,0x80,0x6B,0x40,0x54,0x20,0x00,0x00,}}, +{ 0x76BF, {0x00,0x00,0x00,0x00,0x3F,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76C2, {0x00,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0C,0x00,0x7F,0x80,0x6A,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76C3, {0x00,0x00,0xFF,0xE0,0x06,0x00,0x1D,0x80,0xE4,0x40,0x04,0x20,0x3F,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76C6, {0x0F,0x00,0x21,0x00,0x3F,0x80,0x49,0x40,0x89,0x20,0x11,0x00,0x62,0x00,0x3F,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76C8, {0x00,0x00,0x3F,0x00,0x11,0x00,0x1F,0xC0,0x32,0x40,0x2C,0x40,0x4A,0x40,0xB1,0x80,0x3F,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76CA, {0x20,0x80,0x11,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x20,0x80,0x7F,0xC0,0xAA,0xA0,0xAA,0xA0,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76CD, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x11,0x80,0x7E,0x40,0x00,0x00,0x7F,0x80,0x6A,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76D2, {0x04,0x00,0x0A,0x00,0x3F,0x80,0xFF,0xE0,0x3F,0x00,0x21,0x80,0x3F,0x00,0x00,0x00,0x7F,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76D6, {0x21,0x00,0x13,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0x80,0x6A,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76D7, {0x04,0x00,0x44,0x00,0x27,0xE0,0x09,0x40,0x33,0x00,0x24,0x80,0x48,0x60,0x3F,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76DB, {0x02,0x80,0x02,0x40,0x7F,0xE0,0x42,0x80,0x7B,0x00,0x49,0xA0,0xB2,0xE0,0x3F,0xA0,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76DC, {0x24,0x00,0x24,0x00,0x87,0xE0,0x09,0x40,0x31,0x80,0x42,0x80,0x44,0x60,0x7F,0x80,0x6A,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76DE, {0x09,0x80,0xFF,0xE0,0x07,0x00,0x3F,0xA0,0x0B,0xE0,0xFD,0x80,0x07,0x20,0x79,0xE0,0x7F,0xE0,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76DF, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x08,0xC0,0x3F,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76E1, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x52,0x80,0xCB,0x40,0xFF,0xA0,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76E3, {0x01,0x00,0x7D,0x00,0x53,0xE0,0x7A,0x00,0x7C,0x00,0x51,0xC0,0x7C,0x00,0x00,0x00,0x3F,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76E4, {0x20,0x00,0x79,0x80,0x6A,0x60,0x5F,0xE0,0xFA,0x40,0x69,0x80,0x9A,0x60,0x3F,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76E5, {0x24,0x00,0x45,0xC0,0x7F,0xC0,0x6E,0xC0,0x77,0xC0,0x65,0xC0,0x4C,0x40,0x7F,0x80,0x6A,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76E7, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x7F,0xC0,0x63,0x80,0x7F,0x80,0x72,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xC0,0x77,0x40,0xFF,0xE0,0x00,0x00,}}, +{ 0x76EA, {0x27,0x80,0x24,0x80,0x87,0x80,0x1F,0xE0,0x24,0x00,0x6F,0xE0,0x53,0xA0,0x47,0xC0,0x7F,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x76EE, {0x00,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x76F2, {0x04,0x00,0xFF,0xE0,0x20,0x00,0x3F,0x80,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x76F4, {0x02,0x00,0x02,0x00,0xFF,0xE0,0x1F,0x80,0x50,0x80,0x5F,0x80,0x50,0x80,0x5F,0x80,0x50,0x80,0x5F,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x76F8, {0x10,0x00,0x13,0xE0,0x7E,0x20,0x12,0x20,0x13,0xE0,0x3A,0x20,0x36,0x20,0x37,0xE0,0x52,0x20,0x12,0x20,0x13,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x76FB, {0x00,0x00,0x07,0x80,0xE4,0x80,0xB8,0x40,0xFF,0xE0,0xA2,0x00,0xA3,0x80,0xE4,0x80,0xA4,0x80,0xE0,0x80,0xA0,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x76FE, {0x00,0xC0,0x07,0x00,0x7A,0x00,0x7F,0xE0,0x42,0x00,0x5F,0x80,0x50,0x80,0x5F,0x80,0x50,0x80,0x5F,0x80,0x9F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7701, {0x04,0x00,0x24,0x80,0x44,0xE0,0x87,0x00,0x1C,0x00,0xFF,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7704, {0x00,0x00,0x1F,0xE0,0xE1,0x00,0xA9,0xC0,0xE9,0x40,0xA9,0x40,0xA9,0x40,0xEF,0xC0,0xA8,0x40,0xE0,0x40,0xA0,0x40,0x00,0x80,0x00,0x00,}}, +{ 0x7707, {0x01,0x00,0x01,0x00,0xE1,0x00,0xA5,0x40,0xE5,0x20,0xA9,0x60,0xA9,0x40,0xF3,0x80,0xA3,0x80,0xE1,0x00,0xA6,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x7708, {0x01,0x00,0x01,0x00,0xE7,0xE0,0xAF,0xE0,0xE9,0x00,0xA1,0x00,0xA1,0x80,0xE3,0x80,0xA7,0x80,0xE9,0xA0,0xB1,0xA0,0x20,0xE0,0x00,0x00,}}, +{ 0x7709, {0x00,0x00,0x3F,0xE0,0x22,0x20,0x3F,0xE0,0x20,0x20,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x28,0x40,0x2F,0xC0,0x4F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x770B, {0x01,0x80,0x3E,0x00,0x08,0x00,0x7F,0xC0,0xFF,0xE0,0x10,0x00,0x1F,0x80,0x30,0x80,0x3F,0x80,0x5F,0x80,0x90,0x80,0x1F,0x80,0x00,0x00,}}, +{ 0x770C, {0x00,0x00,0x1F,0x80,0x50,0x80,0x5F,0x80,0x50,0x80,0x5F,0x80,0x5F,0x80,0x40,0x00,0x7F,0xE0,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x771B, {0x01,0x00,0x01,0x00,0xE7,0xC0,0xA7,0xC0,0xE1,0x00,0xBF,0xE0,0xA3,0x80,0xE3,0x80,0xA5,0x40,0xF9,0x20,0xB1,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x771E, {0x61,0x80,0x67,0x00,0x3F,0xC0,0x1F,0xC0,0x50,0x80,0x5F,0x80,0x50,0x80,0x5F,0x80,0x5F,0x80,0x7F,0xE0,0x31,0xC0,0xE0,0x60,0x00,0x00,}}, +{ 0x771F, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x7720, {0x00,0x00,0xE7,0xC0,0xA4,0x40,0xE7,0xC0,0xA5,0x00,0xA5,0x00,0xE7,0xE0,0xA4,0x80,0xA4,0x80,0xE4,0xA0,0x86,0x60,0x18,0x20,0x00,0x00,}}, +{ 0x7724, {0x00,0x00,0x0F,0xC0,0xE8,0x40,0xAF,0xC0,0xEA,0x40,0xAA,0x00,0xAA,0x40,0xEB,0x80,0xAA,0x00,0xFA,0x20,0xB2,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7725, {0x11,0x00,0x71,0x40,0x7D,0x80,0x7D,0x20,0xF1,0xE0,0x7F,0x80,0x60,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7726, {0x02,0x80,0x02,0x80,0xE2,0x80,0xAA,0xA0,0xEB,0xC0,0xAA,0x80,0xAA,0x80,0xEA,0x80,0xAA,0x80,0xEB,0xA0,0xAC,0xA0,0x30,0x60,0x00,0x00,}}, +{ 0x7729, {0x01,0x00,0x01,0x00,0xFF,0xE0,0xBF,0xE0,0xE9,0x80,0xA6,0x80,0xA3,0x80,0xE1,0x80,0xA3,0x80,0xE4,0xC0,0xBF,0x20,0x00,0x20,0x00,0x00,}}, +{ 0x7737, {0x04,0x00,0x35,0x80,0x3F,0x80,0xFF,0xE0,0x31,0x80,0x3F,0x80,0xE1,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7738, {0x01,0x00,0x03,0x80,0xFF,0xC0,0xBF,0x40,0xE5,0x00,0xAF,0xC0,0xB1,0x00,0xF3,0x00,0xBF,0xE0,0xE1,0x00,0xA1,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x773A, {0x02,0x80,0xE2,0x80,0xA2,0xC0,0xEA,0xC0,0xA6,0x80,0xA2,0x80,0xE6,0xC0,0xBA,0xA0,0xE2,0xA0,0xA4,0xA0,0x88,0xA0,0x10,0xE0,0x00,0x00,}}, +{ 0x773C, {0x00,0x00,0xE7,0x80,0xA4,0x80,0xE7,0x80,0xA4,0x80,0xE7,0x80,0xA4,0x40,0xA5,0x40,0xE4,0x80,0xA5,0x80,0x86,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x7740, {0x11,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x10,0x00,0x3F,0x80,0x5F,0x80,0x50,0x80,0x9F,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7747, {0x04,0x80,0x02,0x80,0xE7,0xC0,0xA7,0xC0,0xEF,0xC0,0xA9,0x00,0xAF,0xE0,0xEB,0x20,0xA7,0x20,0xE9,0x60,0xB1,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x775A, {0x00,0x00,0x0F,0xE0,0xEB,0xC0,0xAB,0xC0,0xE9,0x80,0xAF,0xE0,0xA9,0x80,0xE9,0x80,0xAB,0xC0,0xF9,0x80,0xBF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x775B, {0x01,0x00,0xEF,0xC0,0xA7,0x80,0xE7,0x80,0xBF,0xE0,0xA0,0x00,0xEF,0xC0,0xA9,0x40,0xEF,0xC0,0xEF,0xC0,0x08,0x40,0x08,0xC0,0x00,0x00,}}, +{ 0x7761, {0x00,0xC0,0xEF,0x00,0xA1,0x00,0xEF,0xC0,0xA5,0x80,0xBF,0xE0,0xE5,0x80,0xA5,0x80,0xEF,0xC0,0xA1,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7763, {0x20,0x00,0x3F,0xC0,0xF9,0x40,0x79,0x80,0x76,0x80,0xBF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7765, {0x01,0x00,0x02,0x00,0xEF,0xC0,0xAF,0xC0,0xEB,0x40,0xAF,0xC0,0xAA,0x40,0xE3,0x80,0xBF,0xE0,0xFF,0xE0,0xA1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x7766, {0x01,0x00,0xEF,0xC0,0xA1,0x00,0xFF,0xE0,0xA4,0x80,0xA4,0xA0,0xE8,0xE0,0xB1,0x00,0xEF,0xC0,0xA1,0x00,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7768, {0x02,0x00,0x0C,0xC0,0xEC,0xC0,0xAC,0xC0,0xE8,0x40,0xAF,0xC0,0xAB,0xC0,0xE3,0x80,0xA7,0x80,0xE5,0xA0,0xA9,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x776B, {0x01,0x00,0x1F,0xE0,0xE7,0xC0,0xA7,0xC0,0xFF,0xE0,0xA1,0x40,0xAF,0xC0,0xE1,0x40,0xA9,0xE0,0xED,0xE0,0xB3,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x7779, {0x02,0x00,0x02,0x40,0xEF,0xC0,0xA2,0x80,0xFF,0xE0,0xA1,0x80,0xA2,0x40,0xF7,0xC0,0xBF,0xC0,0xE7,0xC0,0xA7,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x777E, {0x04,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x13,0x00,0x7F,0xC0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x777F, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0xBF,0x80,0x2A,0x80,0x11,0x00,0x7F,0x80,0xF1,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x778B, {0x04,0x40,0xE5,0xA0,0xA7,0xE0,0xEB,0xE0,0xAA,0x40,0xAB,0xC0,0xEA,0x40,0xAB,0xC0,0xEB,0xC0,0xEF,0xE0,0x06,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x778E, {0x01,0x00,0x0F,0xE0,0xFF,0xC0,0xB7,0x00,0xEF,0xC0,0xA1,0x00,0xBF,0xE0,0xE3,0x00,0xAF,0xC0,0xE8,0x40,0xAF,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x7791, {0x00,0x00,0x0F,0xE0,0xFF,0xC0,0xB7,0x80,0xE7,0x80,0xA4,0x80,0xA7,0x80,0xF3,0x00,0xBF,0xE0,0xE2,0x00,0xA4,0x40,0x18,0x40,0x00,0x00,}}, +{ 0x779E, {0x04,0x80,0x04,0xC0,0xFF,0xE0,0xE7,0x80,0xE3,0x00,0xFF,0xE0,0xF1,0x20,0xFD,0xA0,0xF5,0xA0,0xFF,0xE0,0xF3,0x20,0x11,0x60,0x00,0x00,}}, +{ 0x77A0, {0x01,0x00,0xE9,0x40,0xA7,0xE0,0xEF,0xE0,0xB7,0xC0,0xA4,0x80,0xE4,0x80,0xA7,0x80,0xE7,0xC0,0xE7,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x77A5, {0xA5,0x00,0xF9,0x00,0xFF,0xE0,0xB6,0x40,0xFD,0x80,0xBF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x77AC, {0x00,0xC0,0xEF,0x40,0xA9,0x40,0xE5,0x80,0xBF,0xE0,0xB4,0xC0,0xE7,0xC0,0xBA,0x80,0xFE,0x80,0xA7,0xE0,0x88,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x77AD, {0x02,0x00,0xE2,0x00,0xBF,0xE0,0xF4,0xC0,0xAF,0xC0,0xB4,0xA0,0xE7,0x80,0xA4,0x80,0xE7,0x80,0xA9,0x40,0x91,0x20,0x03,0x00,0x00,0x00,}}, +{ 0x77B0, {0x01,0x80,0x1F,0x80,0xFF,0x80,0xFF,0xE0,0xF3,0xC0,0xFF,0xC0,0xF3,0xC0,0xFE,0xC0,0xFE,0x80,0xFE,0xC0,0xE3,0x40,0x02,0x20,0x00,0x00,}}, +{ 0x77B3, {0x01,0x00,0xEF,0xC0,0xA4,0x80,0xFF,0xE0,0xA9,0x40,0xAF,0xC0,0xE9,0x40,0xAF,0xC0,0xE1,0x00,0xA7,0xC0,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x77B6, {0x01,0x00,0x0F,0xC0,0xEF,0xC0,0xBF,0xE0,0xFF,0xC0,0xA8,0x40,0xAF,0xC0,0xE8,0x40,0xAF,0xC0,0xEF,0xC0,0xA6,0xC0,0x18,0x20,0x00,0x00,}}, +{ 0x77B9, {0x00,0xC0,0x0F,0x20,0xE9,0xC0,0xAF,0xE0,0xEB,0x40,0xB7,0x40,0xAA,0xA0,0xE3,0xC0,0xBF,0xC0,0xFB,0x80,0xA7,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x77BB, {0x01,0x00,0x03,0x80,0xFF,0xE0,0xAF,0xE0,0xEA,0xC0,0xAD,0x80,0xAF,0xE0,0xE9,0x80,0xAB,0xC0,0xFB,0xC0,0xB3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x77BC, {0x01,0x00,0x03,0x00,0xE6,0x80,0xAF,0xC0,0xF0,0x20,0xAE,0xC0,0xAB,0xC0,0xEB,0xC0,0xAE,0xC0,0xE6,0xC0,0xAB,0xA0,0x11,0x20,0x00,0x00,}}, +{ 0x77BD, {0x21,0x80,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x79,0xC0,0x7F,0xC0,0xFF,0xA0,0x60,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x77BF, {0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x21,0x00,0x3F,0xC0,0x72,0x00,0xBF,0x80,0x3F,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x77C7, {0x04,0x80,0x1F,0xE0,0xE7,0xE0,0xAF,0xE0,0xF0,0x00,0xBF,0xE0,0xA3,0x40,0xFF,0xC0,0xBF,0x80,0xFF,0xC0,0xB9,0xA0,0x03,0x00,0x00,0x00,}}, +{ 0x77CD, {0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3F,0xC0,0x6F,0x80,0xFF,0x80,0x7F,0xC0,0x7F,0x00,0x0F,0x00,0xF1,0xE0,0x00,0x00,}}, +{ 0x77D7, {0x04,0x00,0x7F,0xC0,0x1F,0x00,0x7F,0x00,0x7F,0x00,0x7F,0xC0,0xFF,0xE0,0x71,0x80,0xF5,0x80,0xF5,0x80,0xFF,0xE0,0x84,0x00,0x00,0x00,}}, +{ 0x77DA, {0x00,0x00,0x1F,0xE0,0xFF,0xE0,0xFF,0xE0,0xFD,0xC0,0xFF,0xC0,0xFB,0xC0,0xFF,0xC0,0xFF,0xE0,0xFF,0xA0,0xA3,0xE0,0x3E,0xC0,0x00,0x00,}}, +{ 0x77DB, {0x00,0x00,0x3F,0x80,0x09,0x00,0x06,0x00,0xFF,0xE0,0x02,0x40,0x06,0x80,0x0A,0x00,0x32,0x00,0xC2,0x00,0x02,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x77DC, {0x01,0x80,0x7D,0x80,0x39,0x80,0x12,0x40,0xFF,0xE0,0x34,0x00,0x38,0x00,0x73,0xC0,0x50,0x40,0x90,0x40,0x10,0x40,0x30,0x40,0x00,0x00,}}, +{ 0x77E2, {0x20,0x00,0x20,0x00,0x3F,0x80,0x44,0x00,0x44,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x09,0x00,0x30,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x77E3, {0x04,0x00,0x04,0x00,0x09,0x80,0x7F,0xC0,0x30,0x00,0x3F,0xC0,0x44,0x00,0xC4,0x00,0xFF,0xE0,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x77E5, {0x20,0x00,0x20,0x00,0x21,0xE0,0x3D,0x20,0x51,0x20,0x11,0x20,0x7F,0x20,0x11,0x20,0x19,0x20,0x25,0xE0,0x25,0x20,0x40,0x00,0x00,0x00,}}, +{ 0x77E7, {0x20,0x20,0x23,0xA0,0x20,0xA0,0x3F,0xA0,0x52,0x20,0x12,0x20,0x7F,0xA0,0x12,0xA0,0x18,0xA0,0x24,0xA0,0x20,0xA0,0x43,0x20,0x00,0x00,}}, +{ 0x77E9, {0x40,0x00,0x43,0xE0,0x7E,0x00,0x63,0xC0,0xA2,0x40,0x22,0x40,0xFE,0x40,0x33,0xC0,0x32,0x40,0x4A,0x00,0x4B,0xE0,0x82,0x00,0x00,0x00,}}, +{ 0x77ED, {0x40,0x00,0x4F,0xE0,0x40,0x00,0x7F,0xC0,0xA4,0x40,0x27,0xC0,0xFC,0x40,0x24,0x40,0x32,0x80,0x48,0x80,0x4F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x77EE, {0x60,0xC0,0x67,0x80,0x7F,0xE0,0x7F,0xE0,0x63,0xC0,0xA5,0xA0,0xF9,0x80,0x37,0xE0,0x3B,0x40,0x6B,0xC0,0x41,0xC0,0x8E,0x20,0x00,0x00,}}, +{ 0x77EF, {0x40,0xC0,0x4F,0x00,0x5F,0xE0,0x7B,0x80,0xA7,0xC0,0x2A,0xA0,0xFB,0x80,0x2F,0xE0,0x38,0x20,0x5B,0xA0,0x4B,0xA0,0x88,0x60,0x00,0x00,}}, +{ 0x77F3, {0x00,0x00,0x7F,0xE0,0x08,0x00,0x08,0x00,0x10,0x00,0x1F,0xC0,0x30,0x40,0x30,0x40,0x50,0x40,0x90,0x40,0x1F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x77FC, {0x00,0x00,0x7F,0xC0,0x21,0x80,0x21,0x80,0x21,0x80,0x79,0x80,0x69,0x80,0xE9,0x80,0x69,0x80,0x79,0x80,0x6F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7802, {0x01,0x00,0x7D,0x00,0x21,0x00,0x23,0x40,0x23,0x40,0x7D,0x20,0x6D,0x60,0xA9,0x40,0x28,0x80,0x38,0x80,0x23,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x780C, {0x04,0x00,0x7D,0xE0,0x34,0xE0,0x36,0xE0,0x3C,0xE0,0x34,0xE0,0x74,0xE0,0x35,0xE0,0x37,0xA0,0x33,0xA0,0x21,0x20,0x02,0x60,0x00,0x00,}}, +{ 0x7812, {0x05,0x80,0xFD,0x80,0x65,0x80,0x65,0xA0,0x77,0xC0,0x55,0x80,0xD5,0x80,0x55,0x80,0x75,0x80,0x75,0xA0,0x47,0xA0,0x18,0xE0,0x00,0x00,}}, +{ 0x7814, {0x00,0x00,0x7F,0xC0,0x22,0x80,0x22,0x80,0x22,0x80,0x7F,0xE0,0x6A,0x80,0xAA,0x80,0x2A,0x80,0x3C,0x80,0x24,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x7815, {0x01,0x00,0x79,0x00,0x27,0x80,0x22,0xA0,0x22,0xA0,0x7C,0x60,0x69,0x00,0xA9,0x00,0x2F,0xE0,0x39,0x00,0x21,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x7820, {0x00,0x00,0xFB,0xC0,0x62,0x40,0x62,0x40,0x73,0xC0,0x52,0x40,0xD2,0x40,0x53,0xC0,0x72,0x40,0x72,0x40,0x4F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7825, {0x00,0x40,0xFF,0x80,0x25,0x00,0x25,0x00,0x47,0xE0,0x75,0x00,0xD4,0x80,0x54,0x80,0x5E,0x80,0x78,0x60,0x57,0xE0,0x00,0x20,0x00,0x00,}}, +{ 0x7826, {0x22,0x00,0x22,0x40,0x7F,0x80,0x62,0x20,0x7B,0xE0,0xE0,0x00,0x7F,0xC0,0x08,0x00,0x3F,0x80,0xD0,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7827, {0x00,0x80,0x7C,0x80,0x20,0xE0,0x20,0x80,0x20,0x80,0x78,0x80,0x6B,0xC0,0xAA,0x40,0x2A,0x40,0x3A,0x40,0x23,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x7832, {0x02,0x00,0xFA,0x00,0x27,0xC0,0x28,0x40,0x47,0x40,0x71,0x40,0xD7,0x40,0x54,0x80,0x54,0x00,0x74,0x20,0x54,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x7834, {0x01,0x00,0xF9,0x00,0x27,0xE0,0x25,0x40,0x45,0x80,0x77,0xC0,0xD6,0x40,0x55,0x40,0x55,0x80,0x79,0x80,0x56,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x783A, {0x00,0x00,0xFF,0xE0,0x24,0x00,0x27,0xE0,0x75,0x00,0x55,0x00,0xD5,0xC0,0x55,0x40,0x75,0x40,0x59,0x40,0x52,0x40,0x24,0x80,0x00,0x00,}}, +{ 0x783F, {0x01,0x00,0xF9,0x00,0x27,0xE0,0x24,0x00,0x74,0x80,0x54,0x80,0xD5,0x00,0x55,0x00,0x75,0x40,0x5A,0x40,0x4F,0xE0,0x10,0x20,0x00,0x00,}}, +{ 0x7845, {0x01,0x00,0xFB,0x00,0x6F,0xC0,0x61,0x00,0x7F,0xE0,0x51,0x00,0xD1,0x00,0x5F,0xC0,0x71,0x00,0x71,0x00,0x5F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x785D, {0x01,0x00,0xF9,0x20,0x25,0x20,0x21,0x40,0x27,0xC0,0x74,0x40,0x57,0xC0,0xD4,0x40,0x57,0xC0,0x74,0x40,0x54,0x40,0x04,0xC0,0x00,0x00,}}, +{ 0x786B, {0x01,0x00,0xF1,0x00,0x2F,0xE0,0x22,0x80,0x7F,0xC0,0x50,0x40,0xD5,0x80,0x55,0x80,0x75,0x80,0x55,0xA0,0x49,0xA0,0x10,0x60,0x00,0x00,}}, +{ 0x786C, {0x00,0x00,0xFF,0xE0,0x21,0x00,0x2F,0xC0,0x4F,0xC0,0x79,0x40,0xDF,0xC0,0x59,0x40,0x56,0x00,0x72,0x00,0x4D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x786F, {0x00,0x00,0xFF,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x77,0xC0,0x54,0x40,0xD7,0xC0,0x52,0x80,0x74,0xA0,0x48,0xA0,0x10,0xE0,0x00,0x00,}}, +{ 0x7872, {0x02,0x80,0xFA,0x80,0x24,0x40,0x21,0x00,0x71,0x00,0x52,0x80,0xD4,0x80,0x5F,0xC0,0x74,0xA0,0x54,0x80,0x47,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x7874, {0x02,0x80,0xF2,0xC0,0x6F,0xE0,0x62,0x80,0x72,0x80,0x53,0xA0,0xD5,0xC0,0x5D,0x80,0x75,0x80,0x75,0xA0,0x45,0xA0,0x04,0xE0,0x00,0x00,}}, +{ 0x787C, {0x00,0x00,0x7F,0xE0,0x35,0xE0,0x35,0xE0,0x37,0xE0,0x35,0xE0,0x75,0xE0,0x37,0xE0,0x35,0xE0,0x3D,0xA0,0x29,0xA0,0x13,0x60,0x00,0x00,}}, +{ 0x7881, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x20,0x80,0x7F,0xC0,0x90,0x20,0x7F,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7886, {0x21,0x00,0x2F,0xE0,0x8F,0xC0,0x0F,0xC0,0x2B,0x80,0x53,0x80,0x6C,0x60,0xFF,0xE0,0x3F,0x80,0xFF,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7887, {0x00,0x80,0xF8,0x80,0x27,0xE0,0x28,0x00,0x7F,0xE0,0x50,0x80,0xD2,0x80,0x52,0xC0,0x52,0x80,0x76,0x80,0x49,0x80,0x10,0x60,0x00,0x00,}}, +{ 0x788C, {0x02,0x00,0xFB,0x80,0x67,0x80,0x67,0x80,0x7F,0xE0,0x59,0xC0,0xD5,0xC0,0x57,0x80,0x77,0x40,0x79,0x20,0x41,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x788D, {0x00,0x00,0xF7,0xC0,0x27,0xC0,0x24,0x40,0x47,0xC0,0x70,0x00,0xD7,0xC0,0x50,0x80,0x7F,0xE0,0x54,0x80,0x42,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x788E, {0x01,0x80,0xF9,0x80,0x6F,0xE0,0x62,0x80,0x72,0xC0,0x55,0xA0,0xD9,0xA0,0x51,0x80,0x7F,0xE0,0x71,0x80,0x41,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x7891, {0x01,0x00,0xF2,0x00,0x2F,0xC0,0x29,0x40,0x2F,0xC0,0x79,0x40,0x5F,0xC0,0xD2,0x80,0x54,0x80,0x7F,0xE0,0x40,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x7893, {0x02,0x80,0xFA,0x80,0x27,0xE0,0x24,0x80,0x7C,0x80,0x57,0xC0,0xD4,0x80,0x54,0x80,0x77,0xC0,0x54,0x80,0x47,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7895, {0x01,0x00,0xF1,0x00,0x2F,0xE0,0x22,0x80,0x74,0x40,0x5F,0xE0,0xD0,0x40,0x57,0x40,0x75,0x40,0x47,0x40,0x44,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x7897, {0x01,0x00,0xF1,0x00,0x2F,0xE0,0x2C,0x00,0x47,0xC0,0x75,0x40,0xD5,0x40,0x5B,0x40,0x7B,0xC0,0x55,0x20,0x49,0x20,0x10,0xE0,0x00,0x00,}}, +{ 0x789A, {0x01,0x00,0xFB,0x00,0x6F,0xC0,0x66,0x80,0x72,0x80,0x5F,0xE0,0xD0,0x00,0x57,0xC0,0x74,0x40,0x74,0x40,0x47,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x78A3, {0x00,0x00,0x7F,0xC0,0x33,0xC0,0x33,0xC0,0x3B,0xC0,0x29,0x00,0x69,0xE0,0x2A,0xA0,0x3F,0xE0,0x3B,0xE0,0x22,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x78A7, {0x01,0x00,0xFE,0x00,0x13,0xC0,0x7B,0xC0,0x3E,0x40,0xE3,0xC0,0x00,0x00,0xFF,0xE0,0x08,0x00,0x3F,0x80,0xDF,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x78A9, {0x00,0x00,0xFF,0xE0,0x22,0x00,0x27,0xC0,0x74,0x40,0x57,0xC0,0xD4,0x40,0x57,0xC0,0x74,0x40,0x57,0xC0,0x4C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x78AA, {0x02,0x80,0xF2,0xC0,0x6F,0xE0,0x63,0x80,0x72,0x80,0x53,0x80,0xD2,0x80,0x5F,0xE0,0x75,0x80,0x76,0x60,0x47,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x78AF, {0x04,0xA0,0x7D,0xA0,0x3D,0x20,0x34,0xA0,0x31,0x00,0x37,0xE0,0x74,0xE0,0x37,0xA0,0x35,0xA0,0x36,0x60,0x27,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x78B5, {0x01,0x00,0xF9,0x00,0x61,0xE0,0x67,0xC0,0x74,0x40,0x57,0xC0,0xD4,0x40,0x57,0xC0,0x77,0xC0,0x77,0xC0,0x44,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x78BA, {0x01,0x00,0xF9,0x00,0x27,0xE0,0x2A,0x20,0x72,0x80,0x57,0xE0,0xDC,0x80,0x57,0xC0,0x77,0xC0,0x54,0x80,0x47,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x78BC, {0x00,0x00,0xFF,0xE0,0x67,0xC0,0x67,0xC0,0x77,0xC0,0x55,0x80,0xD5,0x80,0x57,0xE0,0x79,0xE0,0x7F,0xE0,0x4A,0x20,0x10,0xC0,0x00,0x00,}}, +{ 0x78BE, {0x00,0x00,0xF7,0xC0,0x67,0xC0,0x67,0xC0,0x75,0x80,0x57,0xC0,0xD5,0x80,0x57,0xC0,0x7F,0xE0,0x7A,0xC0,0x13,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x78C1, {0x04,0x80,0xF2,0x80,0x2F,0xE0,0x24,0x80,0x44,0x80,0x6D,0xA0,0xF9,0xA0,0x66,0xC0,0x66,0x40,0x6A,0xC0,0x5F,0xE0,0x01,0x20,0x00,0x00,}}, +{ 0x78C5, {0x01,0x00,0xFB,0x00,0x6F,0xC0,0x66,0x80,0x7F,0xE0,0x59,0x40,0xD1,0x00,0x5F,0xE0,0x71,0xC0,0x73,0xC0,0x44,0x40,0x18,0x80,0x00,0x00,}}, +{ 0x78C6, {0x00,0x00,0xFF,0x80,0x65,0x80,0x65,0x80,0x7F,0xE0,0x58,0x40,0xD7,0x80,0x54,0x80,0x77,0x80,0x77,0x80,0x44,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x78CA, {0x00,0x00,0x7F,0xC0,0x0F,0x80,0x3F,0x80,0xDF,0x80,0x10,0x80,0xFB,0xE0,0x61,0x00,0x7B,0xC0,0xEF,0x40,0x79,0xC0,0x69,0x40,0x00,0x00,}}, +{ 0x78CB, {0x04,0x80,0xF3,0x80,0x6F,0xC0,0x67,0x80,0x73,0x00,0x5F,0xE0,0xD2,0x00,0x53,0xC0,0x75,0x80,0x79,0x80,0x5F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x78D0, {0x20,0x00,0x79,0x80,0x6A,0x60,0x5F,0xE0,0xFA,0x40,0x69,0x80,0x9B,0x60,0x7F,0xC0,0x10,0x00,0x3F,0x80,0xDF,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x78D1, {0x01,0x00,0xFB,0x40,0x6F,0xC0,0x7F,0xE0,0x70,0x00,0x57,0x80,0xD4,0x80,0x54,0x80,0x77,0x80,0x76,0x80,0x5F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x78D4, {0x04,0x40,0xF4,0x40,0x67,0xE0,0x7B,0xC0,0x77,0xE0,0x65,0x40,0xE9,0x40,0x7F,0xE0,0x67,0x80,0x69,0x40,0x51,0x20,0x01,0x00,0x00,0x00,}}, +{ 0x78DA, {0x01,0x00,0xFF,0xE0,0x67,0xC0,0x67,0xC0,0x77,0xC0,0x55,0x40,0xD7,0xC0,0x53,0x40,0x7F,0xE0,0x7F,0xE0,0x42,0xC0,0x01,0x80,0x00,0x00,}}, +{ 0x78E7, {0x01,0x00,0xFF,0xC0,0x67,0x80,0x67,0x80,0x7F,0xE0,0x57,0x80,0xD4,0x80,0x57,0x80,0x77,0x80,0x77,0x80,0x46,0x80,0x18,0x40,0x00,0x00,}}, +{ 0x78E8, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7D,0xC0,0x6B,0xA0,0x6A,0x80,0x7F,0xE0,0x44,0x00,0x5F,0xC0,0x8F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x78EC, {0x20,0x00,0xFD,0x80,0x7A,0x60,0x7F,0xE0,0x7B,0xC0,0x79,0x80,0x46,0x60,0xFF,0xC0,0x3F,0x80,0xFF,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x78EF, {0x05,0x80,0xF5,0xC0,0x2B,0x40,0x27,0x80,0x6B,0xC0,0x7F,0xE0,0xE1,0x40,0x6F,0xE0,0x6D,0xC0,0x6A,0xA0,0x10,0xE0,0x23,0x20,0x00,0x00,}}, +{ 0x78F4, {0x07,0x80,0xFB,0xA0,0x6F,0xA0,0x64,0xC0,0x7F,0xC0,0x50,0x20,0xD7,0xC0,0x54,0x40,0x77,0xC0,0x73,0x80,0x5F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x78FD, {0x01,0x00,0xFF,0xC0,0x6F,0xE0,0x6F,0xE0,0x7E,0xE0,0x64,0x80,0xE6,0xE0,0x78,0x00,0x7F,0xE0,0x63,0xA0,0x45,0xA0,0x18,0xE0,0x00,0x00,}}, +{ 0x7901, {0x02,0x80,0xFA,0x80,0x27,0xE0,0x25,0x00,0x7F,0xC0,0x55,0x00,0xD7,0xC0,0x55,0x00,0x77,0xE0,0x59,0x40,0x4A,0xA0,0x14,0xA0,0x00,0x00,}}, +{ 0x7907, {0x01,0x00,0xFF,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6B,0xC0,0xED,0xC0,0x69,0x40,0x7F,0xE0,0x7F,0xE0,0x44,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x790E, {0x04,0x80,0xF4,0x80,0x3F,0xE0,0x2E,0xC0,0x6F,0xE0,0x74,0x80,0xEF,0xE0,0x61,0x40,0x69,0x00,0x6D,0xC0,0x53,0x00,0x21,0xE0,0x00,0x00,}}, +{ 0x7911, {0x09,0x40,0xF7,0xC0,0x6F,0xE0,0x7F,0xC0,0x74,0x80,0x67,0x80,0xE0,0x00,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x4F,0xC0,0x08,0x40,0x00,0x00,}}, +{ 0x7912, {0x04,0x80,0xFF,0xE0,0x67,0xC0,0x67,0xC0,0x7F,0xE0,0x63,0xC0,0xFD,0xA0,0x7F,0xE0,0x64,0xC0,0x7C,0xE0,0x47,0x60,0x0C,0x20,0x00,0x00,}}, +{ 0x7919, {0x10,0x00,0xF3,0xE0,0x7C,0xC0,0x6E,0x80,0x6B,0xE0,0x6E,0xA0,0xF5,0xC0,0x77,0xC0,0x7F,0xE0,0x6F,0x80,0x53,0x80,0x22,0x60,0x00,0x00,}}, +{ 0x7926, {0x01,0x80,0xFF,0xE0,0x6F,0xE0,0x6F,0xE0,0x69,0x80,0x6F,0xE0,0xEB,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x53,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x792A, {0x00,0x00,0xFF,0xE0,0x6F,0xE0,0x6F,0xE0,0x6B,0xC0,0x6B,0xC0,0xEB,0xC0,0x6B,0xC0,0x7F,0xE0,0x77,0xE0,0x74,0x20,0x04,0x60,0x00,0x00,}}, +{ 0x792B, {0x09,0x40,0xFB,0x40,0x6F,0xE0,0x6F,0xE0,0x6B,0xC0,0x77,0xA0,0xFD,0xE0,0x73,0x00,0x7F,0xE0,0x67,0x80,0x59,0x60,0x01,0x00,0x00,0x00,}}, +{ 0x792C, {0x62,0x80,0x6A,0xC0,0xFF,0xE0,0x7A,0xC0,0xE7,0xE0,0x6A,0x80,0xFF,0xE0,0x11,0x80,0xFF,0xE0,0x9F,0xE0,0x70,0x80,0x1F,0x80,0x00,0x00,}}, +{ 0x793A, {0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0x40,0x44,0x20,0x84,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x793C, {0x21,0x00,0x21,0x00,0xF9,0x00,0x09,0x00,0x11,0x00,0x21,0x00,0x71,0x00,0xA9,0x00,0x29,0x00,0x21,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x793E, {0x21,0x00,0x21,0x00,0xF9,0x00,0x09,0x00,0x17,0xC0,0x31,0x00,0x69,0x00,0xA9,0x00,0x21,0x00,0x21,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7940, {0x00,0x00,0x7B,0xC0,0x02,0x40,0xFE,0x40,0x32,0x40,0x6B,0xC0,0x6A,0x40,0x6A,0x00,0x6A,0x00,0x6A,0x20,0xA2,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7941, {0x20,0x00,0x23,0xC0,0xFA,0x40,0x0A,0x80,0x12,0x80,0x22,0x80,0x72,0x40,0xAA,0x20,0x2A,0x20,0x23,0xE0,0x22,0x00,0x22,0x00,0x00,0x00,}}, +{ 0x7947, {0x20,0x40,0x21,0x80,0xF7,0x00,0x15,0x00,0x35,0x00,0x27,0xE0,0x64,0x80,0x74,0x80,0xB4,0xA0,0x26,0x60,0x28,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x7948, {0x20,0x40,0x21,0x80,0xFA,0x00,0x0A,0x00,0x13,0xE0,0x32,0x80,0x6A,0x80,0xAA,0x80,0x26,0x80,0x24,0x80,0x28,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x7949, {0x20,0x80,0x20,0x80,0xF8,0x80,0x0A,0x80,0x12,0xE0,0x32,0x80,0x6A,0x80,0xAA,0x80,0x22,0x80,0x22,0x80,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7950, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x22,0x00,0x73,0xC0,0xB6,0x40,0x26,0x40,0x3A,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7953, {0x01,0x80,0x79,0x40,0x01,0x40,0xFF,0xE0,0x33,0x00,0x69,0x40,0x69,0xC0,0x6B,0xC0,0x6A,0x80,0x64,0x80,0xA9,0x40,0x32,0x20,0x00,0x00,}}, +{ 0x7955, {0x00,0x80,0x78,0x80,0x01,0x40,0xFD,0x40,0x33,0x40,0x6B,0xC0,0x6B,0xA0,0x6D,0xA0,0x6D,0xA0,0x61,0x40,0xA3,0x40,0x25,0xC0,0x00,0x00,}}, +{ 0x7956, {0x20,0x00,0x27,0x80,0xF4,0x80,0x14,0x80,0x27,0x80,0x24,0x80,0x64,0x80,0xB7,0x80,0xAC,0x80,0x24,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7957, {0x00,0x40,0x78,0x80,0x03,0x80,0xFF,0x80,0x33,0xE0,0x6B,0x80,0x6A,0x80,0x6A,0x80,0x6B,0xE0,0x6E,0x60,0xA7,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x795A, {0x01,0x00,0x79,0x00,0x01,0xE0,0xFF,0xE0,0x33,0x80,0x6D,0xE0,0x69,0x80,0x69,0x80,0x69,0xE0,0x69,0x80,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x795D, {0x20,0x00,0x27,0xC0,0xF4,0x40,0x14,0x40,0x27,0xC0,0x22,0x80,0x72,0x80,0xAA,0x80,0x22,0x80,0x24,0xA0,0x28,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x795E, {0x10,0x80,0x10,0x80,0x7F,0xE0,0x0A,0xA0,0x12,0xA0,0x13,0xE0,0x32,0xA0,0x5A,0xA0,0x53,0xE0,0x10,0x80,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x795F, {0x04,0x00,0x64,0x80,0x7F,0x80,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x3F,0x00,0x00,0x00,0xFF,0xE0,0x35,0x80,0xC4,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x7960, {0x00,0x00,0x3B,0xE0,0x03,0xE0,0x7F,0xE0,0x19,0xA0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x34,0x20,0x50,0x20,0x10,0x60,0x00,0x00,}}, +{ 0x7962, {0x22,0x00,0x22,0x00,0xF7,0xE0,0x15,0x00,0x29,0x00,0x23,0x00,0x63,0x40,0xB3,0x40,0x35,0x20,0x29,0x20,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x7965, {0x24,0x80,0x22,0x80,0xFF,0xE0,0x11,0x00,0x21,0x00,0x2F,0xC0,0x71,0x00,0xA1,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x7968, {0x00,0x00,0xFF,0xE0,0x12,0x00,0x7F,0x80,0x7F,0x80,0x00,0x00,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x35,0x80,0xC4,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x796D, {0x20,0x00,0x3F,0xC0,0x66,0x40,0xD9,0x80,0x30,0x80,0x7F,0xE0,0x80,0x00,0x7F,0xC0,0x24,0x80,0x24,0x40,0x44,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x7977, {0x21,0x00,0x21,0x00,0xFF,0xC0,0x17,0x80,0x31,0x00,0x2F,0xE0,0x72,0x80,0xBF,0xE0,0x26,0x80,0x39,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x797A, {0x02,0x80,0x72,0x80,0x07,0xE0,0xFF,0xE0,0x33,0x80,0x6A,0x80,0x6B,0x80,0x6A,0x80,0x6F,0xE0,0x67,0xE0,0xA4,0x40,0x28,0x40,0x00,0x00,}}, +{ 0x797F, {0x01,0x00,0x7B,0xC0,0x03,0xC0,0xFB,0x80,0x37,0xE0,0x6D,0x80,0x6B,0xA0,0x6B,0xC0,0x6B,0xC0,0x6D,0xA0,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7980, {0x04,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x00,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x64,0xC0,0x0C,0x00,0x00,0x00,}}, +{ 0x7981, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x31,0x80,0x6B,0x40,0xA5,0x20,0x3F,0x00,0x00,0x00,0xFF,0xE0,0x24,0x80,0xC4,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x7984, {0x20,0x00,0x27,0x80,0xF0,0x80,0x17,0x80,0x2F,0xE0,0x21,0x00,0x75,0xA0,0xB3,0xC0,0x25,0x80,0x29,0x40,0x21,0x20,0x23,0x00,0x00,0x00,}}, +{ 0x7985, {0x22,0x40,0x29,0x40,0xF5,0x80,0x1F,0xC0,0x29,0x40,0x2F,0xC0,0x69,0x40,0xBF,0xC0,0xB1,0x00,0x2F,0xE0,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x798A, {0x04,0x00,0x77,0xC0,0x0F,0xC0,0xFF,0xC0,0x67,0xC0,0x7D,0x40,0x76,0xC0,0x73,0x00,0x7F,0xE0,0x73,0x00,0xE4,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x798D, {0x10,0x00,0x13,0xC0,0x7A,0x40,0x0A,0xC0,0x12,0xC0,0x17,0xE0,0x34,0x20,0x5D,0xA0,0x1D,0xA0,0x15,0xA0,0x14,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x798E, {0x21,0x00,0x21,0xE0,0xF1,0x00,0x17,0xC0,0x24,0x40,0x27,0xC0,0x64,0x40,0xB7,0xC0,0x34,0x40,0x27,0xC0,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x798F, {0x10,0x00,0x17,0xE0,0x7B,0xC0,0x0A,0x40,0x13,0xC0,0x10,0x00,0x37,0xE0,0x5C,0xA0,0x1F,0xE0,0x14,0xA0,0x17,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x799D, {0x00,0x00,0x7B,0xC0,0x03,0xC0,0xFF,0xC0,0x33,0xC0,0x69,0x80,0x6A,0xA0,0x6D,0x60,0x6B,0x80,0x6F,0x80,0xA1,0x80,0x26,0x60,0x00,0x00,}}, +{ 0x79A6, {0x28,0x00,0x5F,0xC0,0xB5,0x40,0x5F,0x40,0xC7,0x40,0x55,0xC0,0x5F,0x00,0x41,0x00,0x3F,0x80,0xFF,0xE0,0x35,0x80,0xCC,0x60,0x00,0x00,}}, +{ 0x79A7, {0x01,0x80,0x7F,0xE0,0x03,0xC0,0xFB,0xC0,0x33,0xC0,0x6A,0x40,0x6B,0xC0,0x6B,0xC0,0x6F,0xE0,0x6B,0xC0,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x79AA, {0x00,0x00,0x7F,0xE0,0x07,0xE0,0xFE,0x60,0x33,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6F,0xE0,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x79AE, {0x03,0x80,0x7F,0xC0,0x0F,0xC0,0xFF,0xC0,0x6F,0xC0,0x70,0x00,0x7F,0xE0,0x77,0x80,0x77,0x80,0x67,0x80,0xFF,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x79B0, {0x60,0x00,0x6F,0xE0,0xFD,0x60,0xFF,0xE0,0x3B,0xC0,0x2F,0xC0,0x6B,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x6F,0xC0,0x69,0xC0,0x00,0x00,}}, +{ 0x79B3, {0x01,0x00,0x7F,0xE0,0x0F,0xC0,0xFF,0xC0,0x63,0x80,0x7F,0xC0,0x77,0x80,0x73,0x80,0x7F,0xE0,0x7F,0xC0,0xE7,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x79B9, {0x01,0xC0,0x7F,0x00,0x3F,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0x04,0x00,0x7F,0xC0,0x45,0x40,0x7F,0xC0,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x79BA, {0x00,0x00,0x7F,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0x04,0x00,0x7F,0xC0,0x45,0x40,0x7F,0xC0,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x79BD, {0x04,0x00,0x0A,0x00,0x35,0x80,0xFF,0xE0,0x27,0x80,0x39,0x80,0x3F,0x00,0x04,0x00,0x7F,0xC0,0x4E,0x40,0x73,0x40,0x41,0xC0,0x00,0x00,}}, +{ 0x79BE, {0x01,0x80,0x06,0x00,0x3C,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x15,0x00,0x64,0xC0,0x84,0x20,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x79BF, {0x01,0x80,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC4,0x60,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x79C0, {0x01,0x80,0x3F,0x00,0x04,0x00,0xFF,0xE0,0x16,0x00,0x25,0x80,0xFF,0x60,0x09,0x00,0x09,0xC0,0x10,0x40,0x20,0x40,0xC1,0x80,0x00,0x00,}}, +{ 0x79C1, {0x04,0x80,0x18,0x80,0x70,0x80,0x10,0x80,0xFD,0x00,0x11,0x00,0x39,0x00,0x35,0x40,0x56,0x40,0x92,0x40,0x1F,0xA0,0x10,0x20,0x00,0x00,}}, +{ 0x79C9, {0x01,0x80,0x7E,0x00,0xFF,0xE0,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x04,0x80,0x3F,0x80,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x79CB, {0x08,0x80,0x10,0x80,0x60,0x80,0x22,0xA0,0xFA,0xC0,0x22,0x80,0x74,0x80,0x68,0x80,0xA9,0x80,0x22,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x79D1, {0x08,0x80,0x32,0x80,0x61,0x80,0x25,0x80,0xFA,0x80,0x22,0x80,0x70,0xE0,0x6B,0x80,0xAE,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x79D2, {0x08,0x80,0x10,0x80,0x60,0x80,0x22,0xC0,0xFA,0xA0,0x22,0xA0,0x74,0xC0,0x68,0xC0,0xA8,0x80,0x20,0x80,0x23,0x00,0x2C,0x00,0x00,0x00,}}, +{ 0x79D5, {0x0D,0x80,0x15,0x80,0x65,0x80,0x25,0xA0,0xFF,0xC0,0x25,0x80,0x75,0x80,0x6D,0x80,0xAD,0x80,0x25,0xA0,0x27,0xA0,0x2C,0xE0,0x00,0x00,}}, +{ 0x79D8, {0x11,0x00,0x61,0x00,0xA0,0x40,0x22,0x40,0xFA,0xC0,0x2A,0x80,0x6A,0x80,0x7B,0x40,0xB2,0x20,0x26,0x60,0x2A,0x40,0x31,0xC0,0x00,0x00,}}, +{ 0x79DF, {0x08,0x00,0x13,0xC0,0x62,0x40,0x22,0x40,0xFF,0xC0,0x22,0x40,0x72,0x40,0x6B,0xC0,0xAA,0x40,0x22,0x40,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x79E1, {0x09,0x00,0x11,0xC0,0x61,0x40,0x27,0xE0,0xFB,0x00,0x21,0x40,0x71,0xC0,0x6B,0xC0,0xAA,0x80,0x24,0x80,0x29,0x40,0x32,0x20,0x00,0x00,}}, +{ 0x79E3, {0x09,0x80,0x11,0x80,0x67,0xE0,0x27,0xE0,0xF9,0x80,0x23,0xC0,0x71,0x80,0x69,0x80,0xAB,0xC0,0x25,0xA0,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x79E4, {0x08,0x00,0x17,0xE0,0x60,0x80,0x24,0xC0,0xFA,0xC0,0x20,0x80,0x77,0xE0,0x68,0x80,0xA8,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x79E6, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x3E,0x80,0x64,0xC0,0x9F,0x60,0x1F,0x00,0x64,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x79E7, {0x09,0x80,0x11,0x80,0x63,0xC0,0x23,0xC0,0xFB,0xC0,0x23,0xC0,0x77,0xE0,0x69,0x80,0xA9,0x80,0x22,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x79E9, {0x08,0x80,0x10,0x80,0x62,0x80,0x23,0xC0,0xFA,0x80,0x24,0x80,0x77,0xE0,0x68,0x80,0xA9,0x80,0x22,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x79EC, {0x08,0x00,0x13,0xE0,0x62,0x00,0x23,0xC0,0xFE,0x40,0x22,0x40,0x72,0x40,0x6B,0xC0,0xAA,0x40,0x22,0x00,0x23,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x79F0, {0x0A,0x00,0x12,0x00,0x67,0xE0,0x24,0x80,0xF8,0x80,0x22,0x80,0x72,0xC0,0x6A,0xC0,0xAC,0xA0,0x28,0xA0,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x79FB, {0x09,0x00,0x33,0xC0,0x66,0x40,0x21,0x80,0xF9,0x00,0x27,0x00,0x71,0xE0,0x6B,0x20,0xAE,0xC0,0x20,0xC0,0x21,0x80,0x2E,0x00,0x00,0x00,}}, +{ 0x7A00, {0x08,0x80,0x13,0x00,0x61,0x80,0x26,0x40,0xFF,0xE0,0x22,0x80,0x77,0xC0,0x6E,0xC0,0xAA,0xC0,0x22,0xC0,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7A08, {0x08,0x00,0x13,0xC0,0x63,0xC0,0x23,0xC0,0xFB,0xC0,0x20,0x00,0x73,0xC0,0x69,0x80,0xAF,0xE0,0x27,0xE0,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7A0B, {0x08,0x00,0x17,0xC0,0x64,0x40,0x27,0xC0,0xF8,0x00,0x27,0xC0,0x71,0x00,0x6F,0xC0,0xA1,0x00,0x21,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7A0D, {0x09,0x80,0x13,0xC0,0x67,0xE0,0x21,0x80,0xFB,0xC0,0x22,0x40,0x73,0xC0,0x6A,0x40,0xAB,0xC0,0x22,0x40,0x22,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x7A0E, {0x0C,0x80,0x12,0x80,0x62,0x80,0x27,0xC0,0xFC,0x40,0x27,0xC0,0x72,0x80,0x6A,0x80,0xAA,0x80,0x24,0xA0,0x28,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x7A14, {0x11,0x00,0x23,0x00,0xE4,0x80,0x2F,0xC0,0xF0,0x20,0x2F,0xC0,0x60,0x80,0x73,0x00,0xB9,0x40,0x2A,0x20,0x32,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7A17, {0x11,0x00,0x62,0x00,0xAF,0xC0,0x29,0x40,0xFF,0xC0,0x2F,0xC0,0x62,0x80,0x74,0x80,0xBF,0xE0,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7A18, {0x0A,0x80,0x12,0x80,0x67,0xE0,0x27,0xE0,0xFB,0x80,0x32,0x80,0x6B,0x80,0x6A,0x80,0xA7,0xE0,0x27,0xE0,0x24,0x40,0x28,0x40,0x00,0x00,}}, +{ 0x7A19, {0x09,0x80,0x11,0x80,0x67,0xE0,0x25,0xC0,0xFD,0x40,0x25,0xC0,0x75,0x40,0x6D,0xC0,0xAD,0xC0,0x25,0xC0,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x7A1A, {0x0A,0x80,0x12,0x80,0x65,0x00,0x2F,0xE0,0xFD,0x00,0x27,0xC0,0x75,0x00,0x6D,0x00,0xAF,0xC0,0x25,0x00,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x7A1C, {0x11,0x00,0x6F,0xC0,0xA1,0x00,0x3F,0xE0,0xF2,0x80,0x24,0xA0,0x6A,0xE0,0x73,0x80,0xB6,0x80,0x29,0x00,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x7A1F, {0x04,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x01,0x00,0x7E,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7A20, {0x04,0x00,0x0B,0xE0,0x32,0xA0,0x13,0xE0,0x7F,0xA0,0x13,0xE0,0x3A,0x20,0x37,0xE0,0x57,0xE0,0x17,0xE0,0x15,0xE0,0x18,0x60,0x00,0x00,}}, +{ 0x7A2E, {0x10,0x40,0x67,0x80,0xBF,0xE0,0x21,0x00,0xFF,0xC0,0x29,0x40,0x6F,0xC0,0x79,0x40,0xBF,0xC0,0x2F,0xC0,0x21,0x00,0x3F,0xE0,0x00,0x00,}}, +{ 0x7A31, {0x08,0xC0,0x13,0xC0,0x63,0xE0,0x24,0x20,0xF8,0x00,0x33,0xC0,0x6B,0xC0,0x6B,0xC0,0xA7,0xE0,0x27,0xE0,0x22,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x7A32, {0x08,0xC0,0x3F,0x20,0xE5,0x40,0x25,0x40,0xF8,0x00,0x25,0xC0,0x75,0x40,0x6D,0x40,0xAD,0xC0,0x25,0x40,0x25,0xC0,0x25,0x40,0x00,0x00,}}, +{ 0x7A37, {0x08,0x00,0x17,0xC0,0x67,0xC0,0x27,0xC0,0xFF,0xC0,0x23,0x80,0x75,0xA0,0x6B,0xE0,0xAF,0x80,0x27,0x80,0x23,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x7A3B, {0x08,0x40,0x11,0xC0,0x67,0x60,0x29,0xA0,0xF9,0x00,0x27,0xC0,0x74,0x40,0x6C,0x40,0xAE,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x7A3C, {0x11,0x00,0x21,0x00,0xEF,0xE0,0x3F,0xC0,0xF3,0x00,0x23,0x20,0x6D,0xC0,0x72,0x80,0xBD,0xC0,0xA6,0xA0,0x20,0x80,0x23,0x00,0x00,0x00,}}, +{ 0x7A3D, {0x09,0x40,0x37,0xE0,0xE3,0x80,0x26,0xE0,0xFB,0xC0,0x22,0x20,0x71,0xE0,0x6B,0xC0,0xAA,0x40,0x23,0xC0,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7A3E, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0xC0,0xFF,0xE0,0xFF,0xE0,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7A3F, {0x08,0x80,0x37,0xE0,0x53,0xC0,0x12,0x40,0x7B,0xC0,0x10,0x00,0x37,0xE0,0x3C,0x20,0x5D,0xA0,0x15,0xA0,0x14,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x7A40, {0x20,0x00,0xFF,0x80,0x7A,0x80,0x7A,0xA0,0x7C,0x60,0x58,0x00,0xE7,0xC0,0x32,0x40,0xFD,0x80,0x79,0x80,0xA3,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x7A42, {0x01,0x00,0x31,0x00,0xEF,0xE0,0x2F,0xC0,0xF9,0x40,0x2F,0xC0,0x69,0x40,0x7F,0xC0,0xBA,0x80,0x2A,0x20,0x32,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7A43, {0x09,0x80,0x11,0x80,0x67,0xE0,0x2E,0x40,0xFA,0xC0,0x25,0xA0,0x71,0x80,0x6A,0x40,0xAF,0xE0,0x22,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7A46, {0x11,0x00,0x67,0xC0,0xE7,0xC0,0x67,0xC0,0xF7,0xC0,0x61,0x00,0x65,0xC0,0x7B,0xA0,0xF7,0x80,0x67,0x40,0x60,0xC0,0x6F,0x00,0x00,0x00,}}, +{ 0x7A49, {0x08,0x00,0x17,0xC0,0x67,0xC0,0x27,0xC0,0xFF,0xE0,0x27,0xE0,0x75,0x80,0x6D,0x80,0xAF,0xC0,0x2F,0xE0,0x29,0x80,0x31,0x80,0x00,0x00,}}, +{ 0x7A4D, {0x11,0x00,0x6F,0xE0,0xA7,0xC0,0x21,0x00,0xFF,0xE0,0x27,0xC0,0x64,0x40,0x77,0xC0,0xB4,0x40,0x27,0xC0,0x26,0xC0,0x38,0x20,0x00,0x00,}}, +{ 0x7A4E, {0x40,0x00,0x57,0xE0,0x61,0x00,0x7B,0xC0,0x0A,0x40,0x73,0xC0,0x22,0x40,0xFB,0xC0,0x72,0x40,0x6B,0xC0,0xA2,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x7A4F, {0x10,0xC0,0x6F,0x40,0xA9,0x40,0x27,0xC0,0xF0,0x40,0x27,0xC0,0x60,0x40,0x77,0xC0,0xBB,0x00,0x2A,0x20,0x32,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7A50, {0x12,0x00,0x27,0xC0,0xE8,0x80,0x27,0xC0,0xF5,0x40,0x27,0xC0,0x6F,0xC0,0x79,0x40,0xBF,0xC0,0x29,0x60,0x2F,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7A57, {0x09,0x80,0x17,0xE0,0x63,0xC0,0x23,0xC0,0xFB,0xC0,0x23,0xC0,0x71,0xC0,0x6F,0xA0,0xAB,0x00,0x27,0xA0,0x2A,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7A61, {0x11,0x00,0x33,0x00,0xFF,0xE0,0x65,0x80,0xFB,0xC0,0x7F,0xE0,0x60,0x00,0xFF,0xC0,0xFB,0xC0,0x6B,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x7A62, {0x11,0x00,0x25,0x00,0xE5,0xC0,0x7F,0xE0,0xF1,0xC0,0x6F,0xE0,0x69,0x80,0xFF,0xC0,0xFF,0xE0,0x7F,0xE0,0x73,0xE0,0x6D,0x20,0x00,0x00,}}, +{ 0x7A63, {0x11,0x00,0x6F,0xE0,0xA4,0xC0,0x3F,0xE0,0xF2,0x80,0x2F,0xC0,0x62,0x80,0x7F,0xE0,0xB3,0xC0,0x2E,0x80,0x23,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x7A69, {0x10,0x40,0x27,0xC0,0xE7,0xE0,0x67,0x80,0xF7,0x80,0x67,0xC0,0x6F,0xE0,0xF0,0x40,0xF7,0xC0,0x6B,0x40,0x72,0xE0,0x61,0x80,0x00,0x00,}}, +{ 0x7A6B, {0x12,0x80,0x2F,0xE0,0xE6,0x80,0x2F,0xE0,0xF7,0xC0,0x27,0xC0,0x64,0x80,0x77,0xE0,0xBF,0xC0,0x23,0x80,0x23,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0x7A70, {0x11,0x00,0x3F,0xE0,0xEF,0xC0,0x6F,0xC0,0xF3,0x80,0x6F,0xC0,0x67,0x80,0xF3,0x80,0xFF,0xE0,0x7F,0xC0,0x67,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x7A74, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x80,0x40,0x03,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x20,0x80,0x20,0x80,0x40,0x40,0x80,0x20,0x00,0x00,}}, +{ 0x7A76, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x00,0x12,0x40,0x25,0xC0,0x44,0x00,0x7F,0x00,0x09,0x00,0x09,0x20,0x11,0x20,0x60,0xE0,0x00,0x00,}}, +{ 0x7A79, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9A,0x40,0xE3,0xC0,0x7F,0x80,0x00,0x80,0x7F,0x80,0x7F,0xC0,0x7F,0xC0,0x00,0x40,0x03,0x80,0x00,0x00,}}, +{ 0x7A7A, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x00,0x12,0x40,0x21,0xC0,0x00,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7A7D, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9A,0x40,0xF3,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0xFF,0xE0,0x31,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x7A7F, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x40,0x23,0xC0,0x3F,0x80,0x21,0x00,0x33,0x00,0xFF,0xE0,0x19,0x00,0xE1,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x7A81, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x00,0x12,0x40,0x25,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7A83, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x40,0x33,0xC0,0x00,0x00,0x2F,0xC0,0x31,0x40,0xE2,0x40,0x2A,0x40,0x34,0x40,0x08,0x80,0x00,0x00,}}, +{ 0x7A84, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x40,0x1B,0xC0,0x28,0x00,0x1F,0xE0,0x64,0x00,0x87,0xC0,0x04,0x00,0x07,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x7A88, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9A,0x40,0xE3,0xC0,0x21,0x00,0x29,0x00,0xEF,0xC0,0x31,0x40,0x3A,0x40,0x3C,0x40,0xC8,0x80,0x00,0x00,}}, +{ 0x7A92, {0x04,0x00,0x7F,0xE0,0x92,0x40,0x13,0x80,0x7F,0xC0,0x09,0x00,0x11,0x80,0x7E,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7A93, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x95,0xC0,0x35,0x00,0x09,0x80,0x3F,0x40,0x04,0x00,0x52,0x40,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x7A95, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x92,0x40,0xEB,0xC0,0x0A,0x40,0x6B,0x80,0x3B,0x00,0xFA,0xC0,0xD2,0x20,0x32,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x7A96, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9A,0x40,0xF7,0xC0,0x14,0x00,0x3F,0x80,0x64,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7A97, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x95,0x40,0xE9,0xC0,0x7F,0x80,0x64,0x80,0x7F,0x80,0x7E,0x80,0x7E,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7A98, {0x04,0x00,0x7F,0xE0,0x9A,0x40,0xF3,0xC0,0x7F,0xC0,0x08,0x80,0xFF,0xE0,0x08,0x80,0x3F,0xC0,0x3F,0xC0,0xDF,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x7A9F, {0x04,0x00,0x7F,0xE0,0x8A,0x40,0x73,0xC0,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x52,0x80,0x5F,0x80,0x62,0x40,0xBF,0xC0,0x20,0x40,0x00,0x00,}}, +{ 0x7AA9, {0x04,0x00,0x04,0x00,0x7F,0xE0,0x9A,0x40,0xE3,0xC0,0x3F,0x80,0x27,0x80,0x35,0x80,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x7AAA, {0x04,0x00,0x7F,0xE0,0x92,0x40,0x13,0xC0,0x21,0x00,0x2F,0xC0,0xA1,0x00,0x5F,0xE0,0x07,0xC0,0x21,0x00,0x3F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x7AAE, {0x04,0x00,0x7F,0xE0,0x92,0x40,0x33,0x80,0x7B,0x80,0x48,0x80,0x7B,0x80,0x4A,0x00,0x7B,0xC0,0xD8,0x40,0x28,0x40,0xD8,0x80,0x00,0x00,}}, +{ 0x7AAF, {0x04,0x00,0x7F,0xE0,0x91,0x00,0x2B,0xC0,0x7F,0xC0,0x04,0x00,0x3F,0x00,0x04,0x00,0x7F,0xC0,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7AB0, {0x04,0x00,0x7F,0xE0,0x9A,0x40,0xFB,0xC0,0x1F,0xC0,0x69,0x80,0x2E,0x00,0xFF,0x80,0xFF,0xE0,0xFF,0xE0,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7AB6, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x35,0x80,0xFF,0xE0,0xFF,0xE0,0x07,0x00,0x78,0x80,0x00,0x00,}}, +{ 0x7ABA, {0x04,0x00,0x7F,0xE0,0x92,0x00,0x27,0xC0,0x24,0x80,0x7F,0x80,0x24,0x80,0xFF,0x80,0x24,0x80,0x33,0xA0,0x45,0x20,0x98,0xE0,0x00,0x00,}}, +{ 0x7ABF, {0x04,0x00,0x7F,0xE0,0x9B,0xC0,0xF1,0xC0,0x73,0xC0,0x5E,0x80,0x63,0x80,0x7F,0xE0,0x5F,0xC0,0x7F,0x80,0x43,0x00,0x5F,0xE0,0x00,0x00,}}, +{ 0x7AC3, {0x04,0x00,0x7F,0xE0,0xBF,0xC0,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x7F,0xC0,0x7F,0xE0,0x7C,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x7AC4, {0x04,0x00,0x7F,0xE0,0xF7,0xC0,0x7F,0xC0,0x60,0x80,0x7B,0x80,0x7F,0x80,0x64,0x80,0x77,0x80,0x76,0x60,0x77,0x60,0xEC,0x20,0x00,0x00,}}, +{ 0x7AC5, {0x04,0x00,0x7F,0xE0,0x9A,0x40,0xF3,0xC0,0x79,0x00,0x49,0xE0,0x7A,0x40,0x7D,0x40,0xF9,0x80,0xF9,0x80,0x2B,0x40,0xDC,0x20,0x00,0x00,}}, +{ 0x7AC7, {0x04,0x00,0x7F,0xE0,0xF9,0xC0,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x73,0xC0,0x7F,0xC0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x7AC8, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x7F,0xC0,0x6A,0x80,0x7B,0x80,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x4A,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x7ACA, {0x04,0x00,0x7F,0xE0,0xFB,0xC0,0x39,0xC0,0xF9,0xE0,0x6B,0xC0,0x73,0xC0,0xFB,0xC0,0x77,0xE0,0x7F,0xE0,0xA4,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x7ACB, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x00,0x80,0x20,0x80,0x10,0x80,0x10,0x80,0x09,0x00,0x09,0x00,0x02,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7ACD, {0x21,0x80,0x21,0x80,0xF9,0x80,0xF9,0x80,0x49,0x80,0x4F,0xE0,0x69,0x80,0x71,0x80,0x19,0x80,0x39,0x80,0xC1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x7ACF, {0x20,0x40,0x20,0x80,0xFF,0x80,0xF9,0x80,0x49,0x80,0x4F,0xE0,0x69,0x80,0x71,0x80,0x19,0x80,0x39,0x80,0xC1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x7AD2, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x11,0x80,0x11,0x00,0xFF,0xE0,0x00,0x80,0x7C,0x80,0x64,0x80,0x7C,0x80,0x64,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x7AD3, {0x20,0x40,0x20,0x80,0xFF,0x00,0xF9,0x00,0x51,0xC0,0x57,0x00,0x71,0x00,0x73,0xE0,0x3F,0x00,0x39,0x20,0xC1,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x7AD5, {0x21,0x80,0x20,0x80,0xF9,0x80,0xFA,0x40,0x52,0x40,0x57,0xE0,0x79,0x40,0x71,0x40,0x3A,0x40,0x3A,0x40,0xC4,0x40,0x08,0x80,0x00,0x00,}}, +{ 0x7AD9, {0x21,0x00,0x21,0x00,0xF9,0xE0,0xF9,0xE0,0x51,0x00,0x51,0x00,0x77,0xC0,0x34,0x40,0x3C,0x40,0x3C,0x40,0xC7,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x7ADA, {0x21,0x80,0x21,0x80,0xFF,0xE0,0xF8,0x00,0x50,0x00,0x57,0xE0,0x71,0x80,0x71,0x80,0x39,0x80,0x39,0x80,0xC1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x7ADC, {0x04,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0xA0,0x04,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x7ADD, {0x21,0x80,0x21,0x80,0xFF,0xE0,0xFF,0xE0,0x4A,0x40,0x49,0x40,0x69,0x40,0x71,0x80,0x18,0x80,0x38,0x80,0xCF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7ADF, {0x04,0x00,0x04,0x00,0x7F,0xC0,0xFF,0xE0,0x00,0x00,0x3F,0x00,0x21,0x80,0x3F,0x80,0x3F,0x80,0x1F,0x20,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x7AE0, {0x04,0x00,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7AE1, {0x20,0x00,0x2F,0xE0,0xF9,0x00,0xFF,0xC0,0x54,0x40,0x54,0x40,0x74,0x40,0x37,0xC0,0x3C,0x40,0x3C,0x40,0xC7,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x7AE2, {0x21,0x80,0x21,0x80,0xF9,0xC0,0xFF,0xE0,0x52,0x20,0x53,0xC0,0x73,0x80,0x35,0x80,0x3F,0xE0,0x39,0x80,0xC2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x7AE3, {0x01,0x00,0x22,0x40,0x27,0xA0,0xFA,0x80,0x12,0xA0,0x94,0xE0,0x5B,0xC0,0x62,0x40,0x36,0x80,0xC9,0x00,0x02,0x80,0x0C,0x60,0x00,0x00,}}, +{ 0x7AE5, {0x04,0x00,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7AE6, {0x21,0x80,0x21,0x80,0xFF,0xE0,0xFB,0xC0,0x53,0xC0,0x53,0xC0,0x73,0xC0,0x31,0x80,0x3B,0xC0,0x3D,0xA0,0xC9,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x7AEA, {0x00,0x00,0x7F,0xC0,0x79,0x40,0x79,0xC0,0x79,0x80,0x53,0x40,0x7C,0x20,0x04,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7AED, {0x10,0x00,0x13,0xC0,0x7F,0xC0,0x7F,0xC0,0x2B,0xC0,0x29,0x00,0x39,0xE0,0x1A,0xA0,0x1F,0xE0,0x1F,0xE0,0x62,0x20,0x00,0x40,0x00,0x00,}}, +{ 0x7AEF, {0x01,0x00,0x29,0x40,0x2F,0xC0,0xF0,0x00,0x2F,0xE0,0xA1,0x00,0x6F,0xC0,0x6B,0x40,0x7B,0x40,0xCB,0x40,0x0B,0x40,0x08,0xC0,0x00,0x00,}}, +{ 0x7AF0, {0x60,0x00,0x6F,0xE0,0xFB,0xC0,0xFB,0xC0,0xAB,0xC0,0x6B,0xC0,0x6B,0xC0,0x69,0x80,0x6B,0xC0,0x79,0x80,0xDF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7AF6, {0x21,0x00,0xFF,0xC0,0x52,0x80,0x52,0x80,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x35,0x80,0x5A,0xA0,0x94,0x60,0x00,0x00,}}, +{ 0x7AF8, {0x21,0x80,0x7B,0xC0,0xFF,0xE0,0xFF,0xE0,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x75,0xA0,0x5A,0xA0,0xB4,0x60,0x00,0x00,}}, +{ 0x7AF9, {0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x72,0x80,0x54,0x80,0x90,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7AFA, {0x41,0x00,0x41,0x00,0x7D,0xE0,0x53,0x80,0x52,0x80,0x94,0x80,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7AFF, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x54,0x80,0x88,0x80,0x7F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7B02, {0x61,0x00,0x63,0x00,0x7F,0xE0,0x94,0x80,0x04,0x00,0x7F,0x00,0x05,0x80,0x35,0x80,0x0D,0x80,0x1B,0xA0,0x31,0xA0,0xC0,0xE0,0x00,0x00,}}, +{ 0x7B04, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x00,0x00,0x7F,0xC0,0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0xC1,0x00,0x00,0x00,}}, +{ 0x7B06, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x00,0x00,0x3F,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x60,0x20,0x60,0x20,0x3F,0xE0,0x00,0x00,}}, +{ 0x7B08, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x54,0x80,0x90,0x80,0x7F,0x00,0x12,0x00,0x1B,0xC0,0x28,0x80,0x27,0x00,0x4E,0x00,0xB1,0xE0,0x00,0x00,}}, +{ 0x7B0A, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x00,0xC0,0x3F,0x80,0x25,0x80,0x25,0x80,0x24,0x80,0x64,0x80,0x44,0x40,0x84,0x20,0x00,0x00,}}, +{ 0x7B0B, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x3F,0x80,0x04,0x80,0xFF,0xE0,0x04,0x80,0x3F,0x80,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x7B0F, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x30,0x00,0x3F,0xC0,0x49,0x40,0xCB,0x40,0x92,0x40,0x24,0x40,0x08,0xC0,0x01,0x80,0x00,0x00,}}, +{ 0x7B11, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x54,0x80,0x88,0x80,0x07,0x80,0x3C,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7B18, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x04,0x00,0x07,0xE0,0x04,0x00,0x04,0x00,0x7F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7B19, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x34,0x00,0x24,0x00,0x7F,0xC0,0x64,0x00,0x9F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7B1B, {0x21,0x00,0x22,0x00,0x7F,0xE0,0x44,0x80,0x84,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7B1E, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x08,0x00,0x09,0x00,0x11,0xC0,0xFF,0x20,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7B20, {0x21,0x00,0x21,0x00,0x7F,0xE0,0x54,0x80,0x94,0x80,0x04,0x00,0x7F,0xC0,0x01,0x00,0x11,0x00,0x12,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7B25, {0x42,0x00,0x7B,0xE0,0x94,0x80,0x00,0x00,0xFF,0xC0,0x00,0x40,0x7F,0x40,0x00,0x40,0x3E,0x40,0x3E,0x40,0x22,0x40,0x00,0xC0,0x00,0x00,}}, +{ 0x7B26, {0x42,0x00,0x42,0x00,0x7F,0xE0,0x94,0x80,0x10,0x80,0x20,0x80,0x3F,0xE0,0x64,0x80,0xA2,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7B28, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7B2C, {0x21,0x00,0x21,0x00,0x3F,0xE0,0x4A,0x40,0x7F,0xC0,0x02,0x40,0x3F,0xC0,0x22,0x00,0x3F,0xE0,0x06,0x20,0x1A,0x60,0x62,0x00,0x00,0x00,}}, +{ 0x7B33, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x30,0x00,0x23,0xC0,0xFA,0x40,0x2A,0x40,0x2A,0x40,0x6A,0x40,0x4B,0xC0,0xB2,0x40,0x00,0x00,}}, +{ 0x7B35, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x00,0x00,0x27,0xC0,0xA4,0x40,0x44,0x40,0x14,0xC0,0x24,0xA0,0x44,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x7B36, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x30,0x00,0x3F,0xC0,0x44,0x00,0xC4,0x00,0xFF,0xE0,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7B39, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x4C,0x80,0xA4,0x80,0x24,0x80,0xFF,0xE0,0x24,0x80,0x27,0x80,0x24,0x00,0x3F,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x7B45, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x34,0x00,0x3F,0x80,0x64,0x00,0xFF,0xE0,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x7B46, {0x42,0x00,0x7F,0xE0,0x94,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x80,0x3F,0x80,0x04,0x00,0x3F,0x80,0x7F,0xC0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7B48, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x48,0x80,0xFF,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7B49, {0x42,0x00,0x42,0x00,0x7F,0xE0,0x94,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x01,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x7B4B, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x4C,0x80,0x89,0x00,0x79,0x00,0x4F,0xC0,0x79,0x40,0x49,0x40,0x7A,0x40,0x4A,0x40,0x9C,0x80,0x00,0x00,}}, +{ 0x7B4C, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x0A,0x00,0x11,0x00,0x61,0x80,0xFF,0x60,0x1F,0x00,0x1F,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x7B4D, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x10,0x00,0x3F,0xC0,0x60,0x40,0xFE,0x40,0x3E,0x40,0x3E,0x40,0x3E,0x40,0x22,0x80,0x00,0x00,}}, +{ 0x7B4F, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x4C,0x80,0x91,0x80,0x11,0x40,0x2F,0xE0,0x61,0x40,0xA1,0x80,0x22,0xA0,0x2C,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x7B50, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xE0,0x40,0x00,0x7F,0xC0,0x42,0x00,0x5F,0x80,0x5F,0xC0,0x5F,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x7B51, {0x21,0x00,0x21,0x00,0x7F,0xE0,0x4C,0x80,0x88,0x80,0xFF,0x80,0x24,0x80,0x26,0x80,0x3D,0x80,0xE8,0xA0,0x10,0xA0,0x20,0x60,0x00,0x00,}}, +{ 0x7B52, {0x21,0x00,0x21,0x00,0x7F,0xE0,0x4A,0x80,0xBF,0xC0,0x20,0x40,0x2F,0x40,0x20,0x40,0x2F,0x40,0x29,0x40,0x2F,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x7B54, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x4E,0x80,0x8A,0x00,0x11,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7B56, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x94,0x80,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x24,0x80,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x7B5D, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x0F,0x80,0x32,0x00,0x7F,0x80,0x04,0x80,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x7B65, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x3F,0x80,0x60,0x80,0x60,0x80,0x3F,0x80,0x08,0x00,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x7B67, {0x61,0x00,0x63,0x00,0x7F,0xE0,0xBF,0x80,0x31,0x80,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0x80,0x1F,0x20,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x7B6C, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x02,0x80,0x3F,0xE0,0x62,0x40,0x79,0x40,0x69,0x80,0x69,0xA0,0x73,0x60,0x8C,0x20,0x00,0x00,}}, +{ 0x7B6E, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0xFF,0xC0,0x25,0x80,0x25,0x80,0x35,0xC0,0x4E,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7B70, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x34,0x00,0x27,0xE0,0x69,0x00,0xF1,0xE0,0xE1,0xE0,0x61,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x7B71, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x32,0x00,0x22,0x00,0x73,0xE0,0xF6,0x80,0xFA,0x80,0x71,0x80,0x73,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x7B74, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x04,0x00,0xFF,0xE0,0x25,0x80,0x35,0xC0,0x5A,0x40,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7B75, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0xE0,0xFF,0xC0,0x21,0x80,0x65,0xE0,0xF5,0x80,0xA5,0x80,0x67,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x7B7A, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xE0,0x40,0x00,0x7F,0xC0,0x42,0x00,0x5F,0x80,0x5F,0xC0,0x5F,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x7B86, {0x21,0x00,0x33,0x00,0x7F,0xE0,0xFF,0x80,0x64,0x80,0x6A,0x80,0x71,0x80,0x62,0x40,0x7F,0x80,0x6F,0x20,0x72,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x7B87, {0x41,0x00,0x7B,0xE0,0x94,0x80,0xFF,0xC0,0x44,0x40,0x7F,0x40,0x44,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x7B8B, {0x61,0x00,0x7F,0xE0,0x96,0xC0,0xFF,0xE0,0x04,0xC0,0x03,0x80,0x3F,0xA0,0x0B,0x60,0xFF,0xC0,0x07,0x20,0x0F,0xA0,0x70,0x60,0x00,0x00,}}, +{ 0x7B8D, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x00,0x00,0x6F,0xE0,0xF9,0x80,0x6B,0xC0,0x6B,0xC0,0xEB,0xC0,0xE9,0xC0,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x7B8F, {0x61,0x00,0x7F,0xE0,0x96,0xC0,0xFF,0xC0,0x64,0x40,0x7F,0xA0,0x84,0x80,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x7B92, {0x61,0x00,0x7F,0xE0,0xFF,0x80,0x3F,0x80,0xFF,0xE0,0x7F,0x80,0x7F,0xE0,0xC4,0x40,0xFF,0x80,0x64,0x80,0x65,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x7B94, {0x21,0x00,0x21,0x00,0x7B,0xE0,0x95,0x80,0x41,0x00,0x27,0xC0,0x84,0x40,0x64,0x40,0x27,0xC0,0x64,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x7B95, {0x41,0x00,0x7F,0xE0,0xB5,0x80,0xFF,0xC0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x7B97, {0x21,0x00,0x7F,0xE0,0x95,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x7B98, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xC0,0x41,0xC0,0x7F,0x40,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0x64,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x7B99, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xF7,0xC0,0x54,0x40,0x54,0x80,0x77,0xC0,0x55,0x40,0x75,0xC0,0x55,0x80,0x57,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x7B9A, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x10,0x40,0x19,0x40,0x25,0x40,0x7F,0x40,0xF9,0x40,0x7D,0x40,0x7C,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x7B9C, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x04,0x00,0x7F,0xE0,0x4A,0x40,0xB2,0x40,0x63,0xC0,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7B9D, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x34,0x80,0x24,0x80,0xFF,0xE0,0x34,0x80,0x37,0x80,0xE4,0x80,0x27,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x7B9F, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x3F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x7F,0xC0,0x7E,0x40,0x7F,0xA0,0x7A,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x7BA1, {0x21,0x00,0x7F,0xE0,0x94,0x80,0xFF,0xE0,0x40,0x40,0xBF,0x80,0x20,0x80,0x3F,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7BAA, {0x42,0x00,0x7B,0xE0,0x94,0x80,0x28,0x80,0x15,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7BAD, {0x41,0x00,0x7F,0xE0,0xB4,0x80,0x11,0x80,0xFF,0xE0,0x00,0x00,0x79,0x40,0x49,0x40,0x79,0x40,0x79,0x40,0x48,0x40,0x58,0xC0,0x00,0x00,}}, +{ 0x7BB1, {0x21,0x00,0x21,0x00,0x7F,0xE0,0x94,0x80,0x30,0x00,0x23,0xC0,0xFE,0x40,0x33,0xC0,0x6A,0x40,0x6B,0xC0,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7BB4, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x00,0x80,0x3F,0xE0,0x61,0x40,0x7F,0x40,0x63,0x40,0x7F,0x80,0x7F,0xA0,0x53,0x60,0x86,0x20,0x00,0x00,}}, +{ 0x7BB8, {0x41,0x00,0x7F,0xE0,0x96,0x80,0x3F,0xC0,0x05,0x00,0xFF,0xE0,0x0C,0x00,0x3F,0x80,0xD0,0x80,0x1F,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7BC0, {0x42,0x00,0x42,0x00,0x7F,0xE0,0x94,0x80,0x79,0xC0,0x49,0x40,0x79,0x40,0x49,0x40,0x79,0x40,0x49,0xC0,0x75,0x00,0xC1,0x00,0x00,0x00,}}, +{ 0x7BC1, {0x61,0x00,0x7F,0xE0,0x9E,0x80,0x1F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7BC4, {0x41,0x00,0x7F,0xE0,0x94,0x80,0xFF,0xC0,0x22,0x40,0x7A,0x40,0x6A,0x40,0x7A,0x40,0x7A,0x80,0x22,0x20,0xFE,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7BC6, {0x61,0x00,0x7F,0xE0,0x9F,0x80,0x1F,0x00,0x3F,0x00,0xFF,0xE0,0x0E,0x40,0xF7,0x80,0x7F,0x80,0x7E,0x80,0x72,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x7BC7, {0x41,0x00,0x7F,0xE0,0x92,0x80,0xFF,0xE0,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x60,0x00,0x7F,0xC0,0x7F,0xC0,0xAA,0x40,0x2A,0xC0,0x00,0x00,}}, +{ 0x7BC9, {0x41,0x00,0x7F,0xE0,0x96,0x80,0xFF,0x80,0x22,0x80,0x3B,0xA0,0xC4,0x60,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7BCB, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xE0,0x42,0x00,0x7F,0xC0,0x52,0x80,0x5B,0xC0,0x45,0x40,0x58,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x7BCC, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x17,0x80,0x20,0x80,0x3F,0xE0,0x64,0x00,0xE7,0xC0,0xEF,0xE0,0x6F,0xE0,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x7BCF, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x09,0x00,0x69,0x00,0xFF,0xE0,0x6B,0xA0,0x7D,0xC0,0x69,0x80,0x7A,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x7BDD, {0x61,0x00,0x7F,0xE0,0x96,0x40,0xFF,0xC0,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x31,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7BE0, {0x41,0x00,0x7B,0xE0,0x94,0x80,0x12,0x00,0x33,0xC0,0x3E,0x80,0x53,0x80,0xDF,0xE0,0x53,0x00,0x55,0x80,0x59,0x60,0x41,0x00,0x00,0x00,}}, +{ 0x7BE4, {0x41,0x00,0x7F,0xE0,0x96,0x80,0x3F,0xC0,0x22,0x00,0x3F,0x80,0x22,0x00,0x3F,0x80,0x3F,0xE0,0x2A,0x60,0x52,0xA0,0x80,0xC0,0x00,0x00,}}, +{ 0x7BE5, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xE0,0x13,0x00,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0xF5,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7BE6, {0x61,0x00,0x7F,0xE0,0x9E,0x80,0xFF,0xC0,0x5B,0x40,0x47,0x40,0x79,0xC0,0x7F,0xC0,0x7E,0x40,0x7F,0xA0,0x7A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x7BE9, {0x61,0x00,0x61,0x00,0x7F,0xE0,0x94,0x80,0x37,0xE0,0x79,0x80,0x4B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x49,0x80,0x00,0x00,}}, +{ 0x7BED, {0x42,0x00,0x7F,0xE0,0x94,0x80,0xFF,0xC0,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0xA0,0x24,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x7BF3, {0x61,0x00,0x7F,0xE0,0xFF,0x80,0x7F,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x7BF6, {0x61,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x27,0x80,0x24,0x00,0xFF,0xE0,0x1F,0x80,0x1F,0xC0,0x3F,0xC0,0x55,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x7BF7, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x07,0x80,0x2F,0x80,0x83,0x80,0x5D,0xE0,0x0F,0xC0,0xE7,0xC0,0x67,0xC0,0x71,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x7C00, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xC0,0x7F,0xC0,0xFF,0xE0,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x7C07, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x16,0x00,0x23,0xE0,0xFE,0x00,0x23,0xC0,0x3D,0x80,0x6F,0xE0,0x49,0x80,0x92,0x40,0x3C,0x20,0x00,0x00,}}, +{ 0x7C0D, {0x61,0x00,0x7F,0xE0,0x9F,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x35,0x80,0xFF,0xE0,0xFF,0xE0,0x07,0x00,0x78,0x80,0x00,0x00,}}, +{ 0x7C11, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xE0,0x3F,0x80,0x21,0x80,0xFF,0xE0,0x31,0x80,0x1F,0xC0,0xFB,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x7C12, {0x61,0x00,0x7F,0xE0,0xFF,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x3F,0x80,0x08,0x00,0xFF,0xE0,0xFB,0xE0,0x75,0x00,0x1F,0x80,0x00,0x00,}}, +{ 0x7C13, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFE,0x80,0x52,0x80,0x7E,0xC0,0x53,0x40,0x7E,0x80,0x5A,0x20,0x7A,0x60,0x7A,0xC0,0x86,0x80,0x00,0x00,}}, +{ 0x7C14, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xE0,0xFF,0xC0,0x21,0x80,0xFF,0xE0,0x31,0x80,0x7F,0xC0,0xFB,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x7C17, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x0F,0x80,0xA2,0xC0,0x4A,0xA0,0x54,0xA0,0xCF,0x80,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7C1F, {0x61,0x00,0x7F,0xE0,0xFF,0xE0,0xFF,0xE0,0x6A,0x80,0x7F,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7C21, {0x41,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x50,0xC0,0x00,0x00,}}, +{ 0x7C23, {0x61,0x00,0x7F,0xE0,0xBF,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x7C27, {0x61,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x1F,0x00,0xFF,0xE0,0x7F,0x80,0x64,0x80,0x7F,0x80,0x7F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x7C2A, {0x61,0x00,0x7F,0xE0,0xFB,0xC0,0xFB,0xC0,0xFF,0xE0,0x39,0x80,0x73,0xA0,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7C2B, {0x61,0x00,0x7F,0xE0,0xFF,0x80,0x3F,0x80,0xFF,0xE0,0x7F,0x80,0x75,0x80,0x75,0x80,0x7F,0x80,0x7F,0x80,0x55,0x80,0x95,0x80,0x00,0x00,}}, +{ 0x7C37, {0x61,0x00,0x7F,0xE0,0x9F,0x80,0x1F,0x00,0xFF,0xE0,0x69,0xA0,0x77,0xE0,0x7F,0xC0,0x67,0x80,0x6F,0x80,0x48,0x80,0x8F,0x80,0x00,0x00,}}, +{ 0x7C38, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x08,0x80,0xFF,0xE0,0x6B,0xC0,0x7B,0x80,0x6B,0xC0,0x7B,0x40,0xFE,0xC0,0x77,0xC0,0xCE,0x20,0x00,0x00,}}, +{ 0x7C3D, {0x61,0x00,0x7F,0xE0,0x96,0x80,0x0E,0x00,0x33,0x00,0xFF,0xE0,0x00,0x00,0x7B,0x80,0x7B,0x80,0x3B,0x80,0x2A,0x80,0xC4,0x40,0x00,0x00,}}, +{ 0x7C3E, {0x61,0x00,0x7F,0xE0,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0x80,0x65,0x80,0x7F,0xE0,0x7F,0x80,0x5F,0x80,0xF5,0x60,0x05,0x00,0x00,0x00,}}, +{ 0x7C3F, {0x41,0x00,0x7F,0xE0,0x96,0xC0,0x1F,0xE0,0x37,0xC0,0xA5,0x80,0x47,0x80,0x67,0x80,0x3F,0x80,0x6F,0xE0,0x42,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x7C40, {0x61,0x00,0x7F,0xE0,0xD6,0x00,0x6F,0xE0,0xFA,0xE0,0x6B,0xA0,0x7D,0xC0,0x6F,0xC0,0xFF,0xC0,0xEF,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x7C43, {0x61,0x00,0x7F,0xE0,0xFE,0x00,0xF9,0xE0,0x7A,0x00,0x7C,0x00,0x51,0xC0,0x7C,0x00,0x7F,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7C4C, {0x61,0x00,0x7F,0xE0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x7F,0xC0,0x04,0x00,0x7F,0x80,0xFF,0xE0,0x7F,0xE0,0x7A,0xC0,0x60,0x80,0x00,0x00,}}, +{ 0x7C4D, {0x41,0x00,0x7F,0xE0,0x94,0x80,0x32,0x80,0xFF,0xE0,0x22,0x80,0x7F,0xE0,0x20,0x00,0xFF,0xC0,0x72,0x40,0xAB,0xC0,0x23,0xC0,0x00,0x00,}}, +{ 0x7C4F, {0x61,0x00,0x7F,0xE0,0xB6,0x80,0x37,0xE0,0xFA,0xC0,0x6F,0xE0,0x72,0x80,0x73,0x80,0x73,0x80,0x5F,0xE0,0x52,0xC0,0xEC,0x40,0x00,0x00,}}, +{ 0x7C50, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xF9,0x40,0x5F,0xE0,0x53,0x80,0x7F,0xE0,0x55,0xC0,0x7F,0xE0,0x5F,0x80,0x51,0x60,0xB3,0x00,0x00,0x00,}}, +{ 0x7C54, {0x61,0x00,0x7F,0xE0,0xFE,0x80,0x7D,0x80,0xFF,0xE0,0x7D,0x40,0x7F,0x40,0x75,0xC0,0xFC,0x80,0xFC,0x80,0x19,0x40,0x66,0x20,0x00,0x00,}}, +{ 0x7C56, {0x61,0x00,0x7F,0xE0,0x92,0x00,0xFF,0x00,0x13,0x40,0xFF,0xE0,0x29,0xC0,0x6F,0xC0,0x6E,0x80,0x6E,0xA0,0x3F,0x60,0xE2,0x20,0x00,0x00,}}, +{ 0x7C58, {0x61,0x00,0x7F,0xE0,0x96,0x80,0xFF,0xC0,0x53,0xA0,0x5F,0xE0,0x75,0x80,0x5F,0xE0,0x7F,0xC0,0x5F,0xE0,0x55,0x40,0xB9,0x40,0x00,0x00,}}, +{ 0x7C5F, {0x61,0x00,0x7F,0xE0,0x97,0xC0,0xFF,0xC0,0x32,0xC0,0x7B,0xC0,0x6A,0x40,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0xA3,0x40,0x26,0x20,0x00,0x00,}}, +{ 0x7C60, {0x61,0x00,0x7F,0xE0,0x96,0x00,0xF9,0xE0,0x71,0xC0,0xFC,0x40,0x79,0xC0,0x49,0x00,0x79,0xC0,0x79,0xC0,0x49,0x20,0x59,0xE0,0x00,0x00,}}, +{ 0x7C64, {0x61,0x00,0x7F,0xE0,0xDA,0x00,0x69,0x00,0x75,0x40,0xFF,0xE0,0x29,0xC0,0x6F,0xC0,0x6E,0x80,0x6E,0xA0,0x3F,0x60,0xE2,0x20,0x00,0x00,}}, +{ 0x7C65, {0x61,0x00,0x7F,0xE0,0x9E,0x80,0x1B,0x80,0xFF,0xE0,0x6F,0xC0,0x6B,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x53,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x7C6C, {0x61,0x00,0x7F,0xE0,0x96,0x40,0xFD,0x40,0xD9,0xE0,0x6B,0x80,0x7D,0xC0,0xF9,0xC0,0xFD,0xC0,0xFD,0x80,0x85,0xE0,0x8D,0x00,0x00,0x00,}}, +{ 0x7C73, {0x04,0x00,0x24,0x80,0x24,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x15,0x00,0x24,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7C75, {0x21,0x80,0xA9,0x80,0x79,0x80,0x31,0x80,0xFF,0xE0,0x21,0x80,0x71,0x80,0x69,0x80,0xA9,0x80,0x21,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7C7E, {0x10,0x00,0x13,0xE0,0x54,0xA0,0x38,0xA0,0x12,0xA0,0x7D,0xA0,0x18,0xE0,0x34,0xA0,0x35,0x20,0x51,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x7C81, {0x20,0x40,0xA8,0x80,0x7B,0x80,0x20,0x80,0xF8,0x80,0x27,0xE0,0x70,0x80,0x68,0x80,0xA8,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7C82, {0x04,0x00,0x1F,0x00,0x26,0x00,0x1B,0x00,0xE4,0xE0,0x24,0x80,0x15,0x00,0x7F,0xC0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x7C83, {0x65,0x80,0xF5,0x80,0x75,0x80,0x65,0xA0,0xF7,0xC0,0x65,0x80,0x65,0x80,0xF5,0x80,0xF5,0x80,0x65,0xA0,0x67,0xA0,0x78,0xE0,0x00,0x00,}}, +{ 0x7C89, {0x23,0x80,0xA8,0x80,0x72,0x80,0x32,0x80,0xFC,0x80,0x27,0xC0,0x79,0xA0,0x69,0x80,0xAA,0x80,0x22,0x80,0x24,0x80,0x29,0x80,0x00,0x00,}}, +{ 0x7C8B, {0x21,0x00,0xA9,0x00,0x7F,0x80,0x31,0xA0,0xFA,0xA0,0x24,0xE0,0x71,0x00,0x69,0x00,0xAF,0xE0,0x21,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x7C8D, {0x20,0x40,0xA9,0x80,0x7F,0x00,0x31,0x00,0xFF,0xC0,0x21,0x00,0x71,0x00,0x6F,0xE0,0xA9,0x00,0x21,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7C90, {0x20,0x00,0xAF,0xE0,0x7B,0xC0,0x33,0xC0,0xFA,0x40,0x22,0x40,0x73,0xC0,0x6A,0x40,0xAE,0x00,0x24,0x00,0x28,0x00,0x30,0x00,0x00,0x00,}}, +{ 0x7C92, {0x20,0x80,0xA8,0x80,0x70,0x80,0x37,0xE0,0xF8,0x40,0x22,0x40,0x71,0x40,0x69,0x40,0xA9,0x80,0x20,0x80,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7C95, {0x10,0x80,0x54,0x80,0x39,0xE0,0x19,0x20,0x7D,0x20,0x11,0x20,0x39,0xE0,0x35,0x20,0x55,0x20,0x11,0x20,0x11,0xE0,0x11,0x20,0x00,0x00,}}, +{ 0x7C97, {0x20,0x00,0xAB,0xC0,0x7A,0x40,0x32,0x40,0xFB,0xC0,0x22,0x40,0x72,0x40,0x6B,0xC0,0xAA,0x40,0x22,0x40,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7C98, {0x21,0x00,0xA9,0x00,0x79,0xE0,0x31,0x00,0xF9,0x00,0x21,0x00,0x77,0xC0,0x6C,0x40,0xAC,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x7C9B, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0x04,0x80,0x3F,0x80,0x64,0xC0,0x55,0x40,0x7F,0xC0,0x4E,0x40,0x75,0xC0,0x44,0x40,0x84,0x40,0x00,0x00,}}, +{ 0x7C9F, {0x00,0x00,0xFF,0xE0,0x0A,0x00,0x3F,0x80,0x2A,0x80,0x3F,0x80,0x24,0x80,0x15,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7CA1, {0x30,0x00,0x7F,0xE0,0x3C,0x20,0x37,0xE0,0x7C,0x20,0x35,0xA0,0x35,0xE0,0x7D,0xE0,0x7D,0xE0,0x34,0x20,0x34,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x7CA2, {0x02,0x00,0xF2,0x00,0x07,0xE0,0x1B,0x00,0xE5,0x80,0x6D,0xE0,0x25,0x00,0x37,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7CA4, {0x08,0x00,0x7F,0x80,0x7E,0x80,0x7F,0x80,0x6E,0x80,0x75,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x7CA5, {0x02,0x00,0x72,0xE0,0x1B,0x20,0x77,0xE0,0x46,0x80,0x5F,0x80,0x72,0xE0,0x17,0xA0,0x16,0xA0,0x1A,0x20,0x12,0x20,0x62,0x40,0x00,0x00,}}, +{ 0x7CA7, {0x20,0x80,0xA8,0x80,0x7F,0xE0,0x34,0x00,0xFC,0x80,0x24,0x80,0x77,0xC0,0x64,0x80,0xA4,0x80,0x28,0x80,0x2F,0xE0,0x30,0x00,0x00,0x00,}}, +{ 0x7CA8, {0x20,0x00,0xAF,0xE0,0x79,0x80,0x31,0x00,0xFF,0xC0,0x22,0x40,0x72,0x40,0x6B,0xC0,0xAA,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7CAB, {0x60,0x00,0xFF,0xE0,0x71,0x00,0x62,0x00,0xFF,0xC0,0x6B,0xC0,0x6B,0xC0,0xFB,0xC0,0xFB,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x7CAD, {0x21,0x00,0xAB,0x00,0x7B,0x80,0x34,0x80,0xFF,0xC0,0x20,0x20,0x70,0x00,0x6F,0xC0,0xAC,0x40,0x24,0x40,0x27,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x7CAE, {0x21,0x80,0xA9,0x80,0x7B,0xC0,0x32,0x40,0xFF,0xC0,0x22,0x40,0x73,0xC0,0x6B,0xA0,0xAA,0xC0,0x22,0x80,0x23,0xC0,0x2C,0x20,0x00,0x00,}}, +{ 0x7CB1, {0x20,0x00,0x2F,0x80,0x82,0xC0,0x6A,0xE0,0x54,0xA0,0x49,0x80,0x24,0x80,0x35,0x80,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7CB2, {0x20,0x00,0x3B,0xC0,0x39,0x40,0xF9,0x80,0x33,0x80,0xEC,0x60,0x24,0x80,0x35,0x80,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7CB3, {0x20,0x00,0xAF,0xE0,0x7F,0xC0,0x37,0xC0,0xFF,0xC0,0x25,0x40,0x77,0xC0,0x6F,0x40,0xAE,0x00,0x26,0x00,0x29,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x7CB9, {0x21,0x80,0xA9,0x80,0x7F,0xE0,0x32,0x80,0xFB,0xC0,0x25,0xA0,0x79,0xA0,0x69,0x80,0xAF,0xE0,0x21,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7CBD, {0x21,0x80,0xA9,0x80,0x7B,0xE0,0x37,0xC0,0xF8,0x00,0x20,0x00,0x77,0xE0,0x69,0x80,0xAB,0xC0,0x25,0xA0,0x29,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7CBE, {0x20,0x80,0xAF,0xE0,0x78,0x80,0x33,0xC0,0xFF,0xE0,0x20,0x00,0x73,0xC0,0x6A,0x40,0xAB,0xC0,0x23,0xC0,0x22,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x7CC0, {0x62,0x80,0xF2,0xC0,0x7F,0xE0,0x62,0x80,0xF3,0x80,0x65,0xA0,0x65,0xC0,0xFD,0x80,0xF5,0x80,0x65,0xA0,0x65,0xA0,0x64,0xE0,0x00,0x00,}}, +{ 0x7CC2, {0x22,0x80,0xAA,0xC0,0x7F,0xE0,0x33,0x80,0xFA,0x80,0x23,0x80,0x72,0x80,0x6F,0xE0,0xAD,0x80,0x26,0x60,0x27,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x7CC5, {0x60,0x00,0xF7,0xC0,0x71,0x80,0x6F,0xE0,0xF3,0xC0,0x6D,0x80,0x61,0x00,0xF3,0x00,0xFF,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x7CCA, {0x10,0x00,0x5A,0xE0,0x3A,0xA0,0x37,0xE0,0x7A,0xA0,0x12,0xE0,0x37,0xA0,0x3D,0xA0,0x5D,0xA0,0x17,0xA0,0x11,0x20,0x12,0x60,0x00,0x00,}}, +{ 0x7CCE, {0x20,0x00,0xBF,0xE0,0x78,0x00,0x6B,0xC0,0xFA,0xC0,0x2B,0xC0,0x6A,0xC0,0x7B,0xC0,0xA8,0x80,0x2B,0xC0,0x30,0x80,0x27,0xE0,0x00,0x00,}}, +{ 0x7CD2, {0x62,0x80,0xFF,0xE0,0x72,0x00,0x6F,0xE0,0xF8,0x00,0x6B,0xC0,0x6B,0xC0,0xFB,0xC0,0xFB,0xC0,0x7B,0xC0,0x73,0xC0,0x62,0xC0,0x00,0x00,}}, +{ 0x7CD6, {0x21,0x00,0xBF,0xE0,0x79,0x00,0x6F,0xC0,0xFF,0xE0,0x29,0x40,0x6F,0xC0,0x78,0x00,0xBF,0xC0,0x3C,0x40,0x37,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x7CD8, {0x21,0x80,0xA9,0x80,0x7F,0xE0,0x3F,0xE0,0xFB,0x00,0x27,0x20,0x71,0xC0,0x6F,0x80,0xAB,0xC0,0x2D,0xA0,0x21,0x80,0x23,0x00,0x00,0x00,}}, +{ 0x7CDC, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xE0,0x69,0xA0,0x72,0x80,0x6B,0x80,0x7F,0xE0,0x5F,0x80,0x72,0x60,0x82,0x00,0x00,0x00,}}, +{ 0x7CDE, {0x25,0x80,0x7F,0xC0,0x3F,0x00,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x7F,0xC0,0xFF,0xE0,0x13,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x7CDF, {0x63,0x80,0xFF,0xE0,0x7F,0xC0,0x6F,0xC0,0xFF,0xC0,0x6B,0xC0,0x6F,0xC0,0xF7,0x80,0xF7,0x80,0x67,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x7CE0, {0x21,0x00,0xBF,0xE0,0x79,0x00,0x6B,0xC0,0xFF,0xE0,0x29,0x40,0x7B,0xC0,0x7D,0x20,0xBB,0xC0,0x2B,0x40,0x35,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x7CE2, {0x62,0x80,0xF2,0xC0,0x7F,0xE0,0x67,0xC0,0xFC,0x40,0x67,0xC0,0x64,0x40,0xF7,0xC0,0xFF,0xE0,0x67,0xE0,0x64,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x7CE7, {0x20,0x00,0xB7,0xC0,0x77,0xC0,0x67,0xC0,0xFF,0xE0,0x27,0xC0,0x65,0x40,0x77,0xC0,0xA9,0x00,0x27,0xC0,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7CEF, {0x60,0x00,0xFF,0xE0,0x7F,0xE0,0x6F,0xE0,0xF7,0xC0,0x61,0x00,0x6F,0xE0,0xF2,0x00,0xFF,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x7CF2, {0x60,0x00,0xFF,0xE0,0x7F,0xE0,0x6F,0xE0,0xFB,0xC0,0x6B,0xC0,0x6B,0xC0,0xFB,0xC0,0xFF,0xE0,0x7F,0xE0,0x74,0x20,0x64,0x60,0x00,0x00,}}, +{ 0x7CF4, {0x00,0x00,0x67,0xC0,0x27,0xC0,0x37,0xC0,0x4F,0xC0,0xA1,0x80,0x6B,0xE0,0x76,0xC0,0xFB,0xC0,0x7B,0xC0,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x7CF6, {0x20,0x00,0x6F,0xC0,0x7F,0xC0,0xFF,0xC0,0xFF,0xC0,0xA9,0x80,0x6B,0xE0,0x76,0xC0,0xFB,0xC0,0x7B,0xC0,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x7CF8, {0x04,0x00,0x04,0x80,0x29,0x00,0x12,0x00,0x0C,0x80,0x08,0x40,0xFF,0xA0,0x04,0x00,0x24,0x80,0x24,0x40,0x44,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x7CFA, {0x21,0x00,0x21,0x00,0xE9,0x00,0xF9,0x00,0x31,0x00,0x29,0x00,0xF5,0x00,0x21,0x00,0x69,0x00,0x65,0x20,0xA1,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7CFB, {0x01,0xC0,0x7F,0x00,0x09,0x80,0x39,0x00,0x0E,0x80,0x04,0x40,0xFF,0xE0,0x04,0x20,0x24,0x80,0x24,0x40,0x44,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x7CFE, {0x20,0x80,0x22,0x80,0x4A,0x80,0xFA,0x80,0x32,0x80,0x6A,0x80,0xF6,0x80,0x32,0xE0,0x7B,0x80,0x6C,0x80,0xA0,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7D00, {0x20,0x00,0x23,0xC0,0x48,0x40,0xF8,0x40,0x33,0xC0,0x6A,0x40,0xF6,0x00,0x32,0x00,0x7A,0x00,0x6A,0x20,0xA2,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7D02, {0x20,0x80,0x20,0x80,0xE8,0x80,0xFF,0xE0,0x30,0xC0,0x2A,0x80,0xF5,0x80,0x31,0x80,0x78,0x80,0x68,0x80,0xA0,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7D04, {0x11,0x00,0x11,0x00,0x25,0xE0,0x6D,0x20,0x1A,0x20,0x35,0x20,0x7C,0xA0,0x18,0xA0,0x3C,0x20,0x34,0x20,0x50,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x7D05, {0x20,0x00,0x27,0xC0,0x49,0x00,0xF9,0x00,0x31,0x00,0x69,0x00,0xF5,0x00,0x31,0x00,0x79,0x00,0x69,0x00,0xAF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7D06, {0x20,0x00,0x23,0xC0,0xE9,0x80,0xF9,0x80,0x31,0x80,0x2F,0xE0,0xF9,0x80,0x31,0x80,0x79,0x80,0x69,0x80,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7D0A, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x37,0x00,0xE4,0xE0,0x09,0x00,0x3A,0x80,0xFF,0xE0,0xFF,0x00,0x35,0x80,0x64,0x40,0x00,0x00,}}, +{ 0x7D0B, {0x20,0x80,0x20,0x80,0x4F,0xE0,0xFA,0x40,0x32,0x40,0x6A,0x40,0xF9,0x80,0x31,0x80,0x69,0x80,0x61,0x80,0xA6,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x7D0D, {0x10,0x80,0x10,0x80,0x2F,0xE0,0x7C,0xA0,0x14,0xA0,0x2C,0xA0,0x7D,0x60,0x15,0x60,0x3E,0x20,0x3C,0x20,0x54,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x7D10, {0x20,0x00,0x27,0xC0,0x69,0x40,0xF9,0x40,0x31,0x40,0x6F,0xE0,0xF9,0x40,0x31,0x40,0x69,0x40,0x69,0x40,0xA7,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7D14, {0x21,0x00,0x21,0x60,0x6F,0x80,0xF9,0x40,0x35,0x40,0x6D,0x40,0xFD,0x40,0x37,0xC0,0x7D,0x40,0x69,0x20,0xA1,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7D15, {0x65,0x80,0x65,0x80,0xD5,0x80,0xF5,0xA0,0x67,0xC0,0x55,0x80,0xF5,0x80,0x65,0x80,0x75,0x80,0x75,0xA0,0xE7,0xA0,0x78,0xE0,0x00,0x00,}}, +{ 0x7D17, {0x20,0x80,0x20,0x80,0x48,0x80,0xD2,0xC0,0x32,0xC0,0x6A,0xA0,0xFC,0xA0,0x35,0xC0,0x78,0x40,0x68,0x80,0xA3,0x00,0x2C,0x00,0x00,0x00,}}, +{ 0x7D18, {0x21,0x00,0x21,0x00,0x4F,0xE0,0xD9,0x00,0x31,0x00,0x69,0x00,0xFA,0x80,0x32,0x80,0x6D,0x00,0x65,0x40,0xAB,0xE0,0x30,0x20,0x00,0x00,}}, +{ 0x7D19, {0x20,0x40,0x21,0x80,0x4A,0x80,0xFA,0x80,0x33,0xE0,0x6A,0x80,0xFA,0x80,0x32,0x80,0x7A,0x80,0x6A,0xA0,0xA3,0x60,0x2C,0x20,0x00,0x00,}}, +{ 0x7D1A, {0x20,0x00,0x23,0xC0,0x4A,0x40,0xFA,0x80,0x32,0xC0,0x6A,0x40,0xFA,0x40,0x33,0x40,0x7A,0x80,0x6C,0x80,0xA5,0x40,0x2A,0x20,0x00,0x00,}}, +{ 0x7D1B, {0x23,0x80,0x20,0x80,0x4A,0x80,0xD2,0x80,0x34,0x80,0x6F,0xC0,0xF9,0xA0,0x31,0x80,0x6A,0x80,0x62,0x80,0xA4,0x80,0x29,0x80,0x00,0x00,}}, +{ 0x7D1C, {0x20,0x00,0x23,0xC0,0xE8,0x00,0xF8,0x00,0x37,0xE0,0x29,0x80,0xF5,0x80,0x31,0x80,0x79,0x40,0x6A,0x40,0xAF,0xA0,0x20,0x20,0x00,0x00,}}, +{ 0x7D20, {0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x09,0x00,0x32,0x00,0x0D,0x80,0xFF,0x40,0x35,0x80,0xC4,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x7D21, {0x21,0x00,0x21,0x00,0x4F,0xE0,0xF9,0x00,0x31,0x00,0x69,0xC0,0xF5,0x40,0x31,0x40,0x6A,0x40,0x62,0x40,0xA4,0x40,0x28,0x80,0x00,0x00,}}, +{ 0x7D22, {0x04,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xE0,0x48,0x40,0xB2,0x00,0x0D,0x00,0x09,0xC0,0xFF,0x40,0x35,0x80,0xC4,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x7D2B, {0x22,0x00,0x22,0xC0,0x7B,0x00,0x62,0x20,0x7F,0xE0,0xE9,0x00,0x33,0x00,0x0D,0xC0,0xFF,0x40,0x35,0x80,0xC4,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x7D2C, {0x10,0x80,0x10,0x80,0x28,0x80,0x7F,0xE0,0x14,0xA0,0x2C,0xA0,0x7C,0xA0,0x17,0xE0,0x3C,0xA0,0x3C,0xA0,0x57,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x7D2E, {0x21,0x00,0x31,0x00,0xFD,0x00,0x79,0x20,0x65,0x20,0xA5,0xE0,0x09,0x00,0x3A,0x80,0xFF,0xE0,0xFF,0x00,0x35,0x80,0x64,0x40,0x00,0x00,}}, +{ 0x7D2F, {0x00,0x00,0x3F,0xC0,0x22,0x40,0x3F,0xC0,0x3F,0xC0,0x04,0x80,0x19,0x80,0x06,0xC0,0x7F,0xA0,0x1A,0xC0,0x62,0x20,0x02,0x00,0x00,0x00,}}, +{ 0x7D30, {0x10,0x00,0x13,0xE0,0x26,0xA0,0x7E,0xA0,0x1A,0xA0,0x37,0xE0,0x7E,0xA0,0x1A,0xA0,0x3E,0xA0,0x37,0xE0,0x52,0x20,0x10,0x00,0x00,0x00,}}, +{ 0x7D32, {0x23,0xC0,0x23,0xC0,0xEB,0xC0,0xFF,0xE0,0x33,0xC0,0x2B,0xC0,0xFB,0xC0,0x33,0xC0,0x7A,0x40,0x6A,0x00,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x7D33, {0x10,0x80,0x10,0x80,0x2B,0xE0,0x7E,0xA0,0x32,0xA0,0x2B,0xE0,0x7A,0xA0,0x12,0xA0,0x3B,0xE0,0x34,0x80,0x50,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7D35, {0x21,0x80,0x21,0x80,0xEB,0xE0,0xFC,0x00,0x30,0x00,0x2F,0xE0,0xF9,0x80,0x31,0x80,0x79,0x80,0x69,0x80,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7D39, {0x10,0x00,0x17,0xE0,0x24,0xA0,0x6C,0xA0,0x19,0x20,0x35,0x40,0x7E,0x00,0x1B,0xE0,0x3E,0x20,0x36,0x20,0x53,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x7D3A, {0x22,0x40,0x22,0x40,0x4A,0x40,0xFF,0xE0,0x32,0x40,0x6A,0x40,0xFA,0x40,0x33,0xC0,0x7A,0x40,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7D3F, {0x21,0x00,0x21,0x00,0xE9,0x00,0xFA,0x00,0x32,0x40,0x2F,0xA0,0xF8,0x20,0x37,0xC0,0x7C,0x40,0x6C,0x40,0xA7,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x7D42, {0x21,0x00,0x21,0x00,0x53,0xC0,0xDE,0x40,0x31,0x80,0x6A,0x80,0xFC,0x40,0x31,0x20,0x78,0x80,0x6A,0x00,0xA1,0x80,0x20,0x40,0x00,0x00,}}, +{ 0x7D43, {0x21,0x00,0x21,0x00,0x4F,0xE0,0xF9,0x00,0x31,0x40,0x6A,0x40,0xFE,0x80,0x31,0x00,0x6B,0x00,0x62,0x40,0xAF,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x7D44, {0x20,0x00,0x23,0xC0,0x4A,0x40,0xDA,0x40,0x33,0xC0,0x6A,0x40,0xFE,0x40,0x33,0xC0,0x6A,0x40,0x62,0x40,0xAF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7D45, {0x30,0x00,0x37,0xE0,0x6C,0x20,0x7D,0xA0,0x35,0xE0,0x2D,0xE0,0x7D,0xE0,0x35,0xE0,0x3D,0x20,0x3C,0x20,0x74,0x20,0x34,0x60,0x00,0x00,}}, +{ 0x7D46, {0x21,0x80,0x21,0x80,0xEB,0xE0,0xFD,0xA0,0x33,0xC0,0x29,0x80,0xF9,0x80,0x37,0xE0,0x79,0x80,0x69,0x80,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7D4B, {0x21,0x80,0x21,0x80,0xEF,0xE0,0xFF,0xE0,0x34,0x00,0x2D,0x80,0xFD,0x80,0x35,0x80,0x6D,0xC0,0x65,0x40,0xAF,0xA0,0x30,0x20,0x00,0x00,}}, +{ 0x7D4C, {0x20,0x00,0x27,0xC0,0x4A,0x40,0xF9,0x80,0x33,0x80,0x6E,0x60,0xFC,0x80,0x33,0xC0,0x68,0x80,0x60,0x80,0xAF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7D4E, {0x62,0x00,0x63,0xC0,0xD4,0x00,0xFE,0x00,0x63,0xE0,0x52,0x80,0xF4,0x80,0x6C,0x80,0x74,0x80,0x74,0x80,0xE4,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x7D4F, {0x21,0x00,0x23,0x00,0xEF,0xC0,0xFF,0xC0,0x37,0x40,0x2F,0xC0,0xFD,0x40,0x31,0x40,0x69,0x80,0x63,0xA0,0xAC,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x7D50, {0x21,0x00,0x21,0x00,0x51,0x00,0xFF,0xE0,0x31,0x00,0x6B,0xC0,0xF8,0x00,0x33,0xC0,0x7A,0x40,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7D56, {0x21,0x80,0x21,0x80,0xED,0xA0,0xFB,0xE0,0x31,0x80,0x2F,0xE0,0xF9,0x80,0x31,0x80,0x6A,0x80,0x62,0xA0,0xA4,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x7D5B, {0x22,0x00,0x23,0xE0,0x3F,0x80,0x7B,0x80,0x7F,0x60,0xF1,0x80,0x77,0x80,0x73,0x40,0x7F,0xE0,0x75,0x40,0x69,0x40,0x61,0x00,0x00,0x00,}}, +{ 0x7D5E, {0x21,0x00,0x21,0x00,0x4F,0xE0,0xFA,0x40,0x36,0x40,0x6A,0xA0,0xF9,0x80,0x31,0x00,0x69,0x00,0x62,0x80,0xA4,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x7D61, {0x21,0x00,0x21,0x00,0x4B,0xC0,0xDA,0x40,0x35,0x80,0x69,0x80,0xFA,0x40,0x37,0xE0,0x7A,0x40,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7D62, {0x12,0x00,0x22,0x00,0x4B,0xE0,0x32,0x20,0x2F,0xA0,0x4A,0xA0,0x7B,0xA0,0x12,0xA0,0x3B,0xA0,0x58,0x20,0x50,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x7D63, {0x22,0x40,0x21,0x40,0xEF,0xE0,0xFF,0xE0,0x31,0x80,0x29,0x80,0xFF,0xE0,0x31,0x80,0x6A,0x80,0x62,0x80,0xA4,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x7D66, {0x20,0x80,0x20,0x80,0x49,0x80,0xFA,0x40,0x37,0xE0,0x68,0x00,0xF8,0x00,0x33,0xC0,0x7A,0x40,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7D68, {0x61,0x80,0x61,0xC0,0xD1,0xA0,0xFF,0xE0,0x63,0x80,0x53,0xC0,0xF3,0xC0,0x6E,0xC0,0x76,0x80,0x74,0xE0,0xE9,0x60,0x62,0x20,0x00,0x00,}}, +{ 0x7D6E, {0x20,0x00,0xFB,0xC0,0x6A,0x40,0x7A,0x40,0x13,0xC0,0x2E,0x40,0xC9,0x00,0x32,0x80,0xFF,0xE0,0xFF,0x00,0x35,0x80,0x64,0x40,0x00,0x00,}}, +{ 0x7D71, {0x20,0x80,0x20,0x80,0x4F,0xE0,0xF9,0x00,0x32,0xC0,0x2F,0xA0,0xF9,0x80,0x31,0x80,0x6A,0x80,0x62,0xA0,0xA4,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x7D72, {0x21,0x80,0x21,0x80,0xEF,0x40,0xFF,0x40,0x31,0x80,0x29,0x40,0xFF,0xE0,0x35,0xA0,0x7B,0xC0,0x6B,0xA0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7D73, {0x21,0x00,0x21,0x00,0xEB,0xC0,0xFE,0x40,0x31,0x80,0x2B,0xE0,0xFC,0x80,0x33,0xC0,0x7A,0x80,0x6F,0xE0,0xA0,0xC0,0x20,0x80,0x00,0x00,}}, +{ 0x7D75, {0x21,0x00,0x21,0x00,0x49,0x80,0xF2,0x40,0x37,0xE0,0x68,0x00,0xF8,0x00,0x37,0xE0,0x79,0x00,0x6A,0x40,0xA7,0xA0,0x20,0x20,0x00,0x00,}}, +{ 0x7D76, {0x21,0x00,0x21,0x00,0x6B,0xC0,0xFC,0x80,0x33,0xC0,0x6A,0xC0,0xFA,0xC0,0x23,0xC0,0x72,0x00,0x6A,0x20,0xA2,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7D79, {0x10,0x00,0x11,0xE0,0x25,0x20,0x7D,0xE0,0x18,0x00,0x35,0xE0,0x7D,0x20,0x19,0xE0,0x3D,0x20,0x35,0xE0,0x51,0x20,0x11,0x60,0x00,0x00,}}, +{ 0x7D7D, {0x20,0x00,0x23,0xC0,0xEA,0x40,0xFA,0x40,0x33,0xC0,0x29,0x80,0xF9,0x00,0x37,0xE0,0x7C,0x20,0x6C,0x20,0xA7,0xE0,0x24,0x20,0x00,0x00,}}, +{ 0x7D89, {0x20,0x40,0x23,0x80,0xEF,0xE0,0xFF,0xE0,0x33,0xC0,0x2D,0xA0,0xFB,0x80,0x31,0x80,0x6A,0xE0,0x62,0x60,0xA4,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x7D8F, {0x20,0x40,0x20,0xC0,0xEF,0xE0,0xFA,0xA0,0x34,0x80,0x29,0x80,0xFF,0xE0,0x31,0x40,0x7B,0xC0,0x6B,0x80,0xA1,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x7D93, {0x20,0x00,0x27,0xE0,0xEB,0xC0,0xFF,0xC0,0x33,0xC0,0x2B,0xC0,0xF8,0x00,0x37,0xC0,0x69,0x80,0x61,0x80,0xAF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7D99, {0x20,0x80,0x24,0x80,0x4E,0xC0,0xFD,0xC0,0x35,0x80,0x6F,0xE0,0xFD,0x80,0x37,0xC0,0x7E,0xC0,0x6C,0x80,0xA7,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x7D9A, {0x20,0x80,0x20,0x80,0x6F,0xE0,0xFB,0xC0,0x30,0x00,0x6F,0xE0,0xFC,0x40,0x35,0x80,0x79,0x80,0x6A,0xA0,0xA2,0xA0,0x24,0x60,0x00,0x00,}}, +{ 0x7D9B, {0x60,0x00,0x6F,0xC0,0xD1,0x40,0xD7,0x40,0x63,0x40,0x55,0x80,0xF9,0x00,0x73,0x80,0x76,0x60,0x6E,0x20,0xF2,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x7D9C, {0x20,0x80,0x20,0x80,0x6B,0xE0,0xFC,0x00,0x33,0xC0,0x68,0x00,0xFF,0xE0,0x30,0x80,0x6A,0xC0,0x64,0xA0,0xA0,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7D9F, {0x60,0x00,0x6F,0xE0,0xD7,0xC0,0xF7,0xC0,0x67,0xC0,0x55,0x80,0xF5,0x80,0x77,0xE0,0x75,0x80,0x69,0x80,0xEE,0x40,0x78,0x20,0x00,0x00,}}, +{ 0x7DA2, {0x30,0x00,0x37,0xE0,0x6C,0xA0,0x7F,0xE0,0x35,0xA0,0x2F,0xE0,0x7C,0xA0,0x3D,0xE0,0x3D,0xE0,0x35,0xE0,0x78,0x20,0x30,0x60,0x00,0x00,}}, +{ 0x7DA3, {0x21,0x80,0x23,0xC0,0xEF,0xE0,0xFF,0xE0,0x37,0xE0,0x29,0x80,0xFA,0x40,0x37,0xA0,0x7A,0x80,0x6A,0xA0,0xA2,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7DAB, {0x21,0x80,0x21,0x40,0xEF,0xE0,0xFF,0xC0,0x31,0xE0,0x2B,0x60,0xF9,0x80,0x33,0xE0,0x7F,0xC0,0x68,0xE0,0xA1,0xE0,0x26,0x20,0x00,0x00,}}, +{ 0x7DAC, {0x20,0x40,0x27,0xA0,0x4A,0xA0,0xFA,0xC0,0x37,0xE0,0x6C,0x40,0xFF,0x80,0x32,0x80,0x6B,0x00,0x61,0x00,0xA6,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x7DAD, {0x21,0x40,0x21,0x40,0x4A,0x80,0xFF,0xE0,0x32,0x80,0x6B,0xC0,0xFA,0x80,0x32,0x80,0x7B,0xC0,0x6A,0x80,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x7DAE, {0x01,0x00,0xFB,0x00,0x7F,0xE0,0x7E,0x80,0x79,0x80,0x4E,0x80,0x49,0x60,0xBB,0x00,0xFF,0xC0,0xFF,0x00,0x64,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x7DAF, {0x31,0x00,0x31,0x00,0x6B,0xE0,0x7F,0xE0,0x33,0xA0,0x2D,0x20,0x7F,0xE0,0x31,0x20,0x3D,0xE0,0x3F,0xE0,0x74,0xE0,0x30,0xC0,0x00,0x00,}}, +{ 0x7DB0, {0x21,0x00,0x23,0x00,0xEF,0xE0,0xFF,0xC0,0x32,0x80,0x2A,0x80,0xFB,0x80,0x32,0x00,0x7B,0xC0,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7DB1, {0x10,0x00,0x17,0xE0,0x2E,0x60,0x7D,0x60,0x17,0xE0,0x2C,0xA0,0x7E,0xE0,0x16,0xE0,0x3E,0xE0,0x37,0xE0,0x54,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x7DB2, {0x10,0x00,0x17,0xE0,0x2E,0xE0,0x7D,0xA0,0x17,0xE0,0x2C,0xA0,0x7F,0xE0,0x15,0x20,0x3D,0x20,0x3D,0xE0,0x54,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x7DB4, {0x20,0x00,0x6F,0xC0,0x5F,0xC0,0xF6,0x80,0x27,0xC0,0x69,0x40,0xFF,0xC0,0x39,0x40,0x77,0xC0,0x66,0x80,0xA8,0xC0,0x31,0x20,0x00,0x00,}}, +{ 0x7DB5, {0x20,0x40,0x20,0xC0,0xEB,0xE0,0xFA,0xA0,0x34,0x80,0x28,0x80,0xF9,0x80,0x37,0xE0,0x79,0x80,0x6B,0xC0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7DB8, {0x61,0x00,0x63,0x00,0xD3,0x80,0xF4,0x80,0x6F,0xC0,0x50,0x20,0xFF,0xC0,0x6B,0xC0,0x7F,0xC0,0x7B,0xC0,0xEB,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x7DBA, {0x21,0x80,0x21,0x80,0xEF,0xE0,0xF9,0x80,0x32,0x40,0x2F,0xE0,0xF8,0x40,0x33,0xC0,0x7B,0xC0,0x6B,0xC0,0xA0,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x7DBB, {0x20,0x80,0x20,0x80,0x6B,0xE0,0xFC,0x00,0x37,0xE0,0x68,0x80,0xFA,0x80,0x22,0xC0,0x72,0x80,0x6A,0x80,0xA5,0x80,0x28,0x60,0x00,0x00,}}, +{ 0x7DBD, {0x21,0x80,0x21,0x80,0xE9,0xE0,0xFB,0xC0,0x32,0x40,0x2B,0xC0,0xFA,0x40,0x33,0xC0,0x7F,0xE0,0x6F,0xE0,0xA1,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7DBE, {0x21,0x00,0x27,0xC0,0x59,0x00,0xFF,0xE0,0x22,0x80,0x64,0xA0,0xFA,0xE0,0x33,0x80,0x7E,0x80,0x69,0x00,0xA6,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x7DBF, {0x10,0x80,0x11,0x00,0x2B,0xC0,0x7B,0xC0,0x12,0x40,0x2B,0xC0,0x78,0x80,0x17,0xE0,0x3C,0xA0,0x34,0xA0,0x54,0xE0,0x10,0x80,0x00,0x00,}}, +{ 0x7DC7, {0x34,0xA0,0x35,0xA0,0x6D,0x20,0x7C,0xA0,0x30,0x00,0x2F,0xE0,0x7C,0xA0,0x35,0xA0,0x3F,0xE0,0x3C,0xA0,0x77,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x7DCA, {0x00,0x00,0x7F,0xC0,0x52,0x40,0x79,0x80,0x7B,0x80,0x7C,0x60,0x45,0x80,0x3B,0x40,0xFF,0xE0,0x1F,0x00,0x34,0x80,0x44,0x40,0x00,0x00,}}, +{ 0x7DCB, {0x22,0x80,0x22,0x80,0x5E,0xE0,0xF2,0x80,0x22,0x80,0x5E,0xE0,0xF2,0x80,0x22,0x80,0x7E,0xE0,0x74,0x80,0xA8,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x7DCF, {0x20,0x80,0x22,0x80,0x6A,0xC0,0xFD,0xA0,0x31,0x80,0x6B,0xC0,0xF9,0x40,0x31,0x80,0x6B,0x60,0x67,0x20,0xA9,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7DD1, {0x20,0x00,0x27,0x80,0x50,0x80,0xF7,0x80,0x2F,0xE0,0x59,0x00,0xF5,0xA0,0x23,0xC0,0x77,0x80,0x79,0x40,0xA1,0x20,0x23,0x00,0x00,0x00,}}, +{ 0x7DD2, {0x21,0x00,0x21,0x40,0x4B,0xC0,0xD1,0x80,0x3F,0xE0,0x69,0x00,0xFB,0xC0,0x36,0x40,0x7B,0xC0,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7DD5, {0x21,0x80,0x21,0x80,0xEF,0xE0,0xFA,0x40,0x31,0x80,0x2E,0x60,0xFA,0x40,0x33,0xC0,0x6B,0xC0,0x63,0xC0,0xA4,0x40,0x28,0x40,0x00,0x00,}}, +{ 0x7DD8, {0x61,0x80,0x61,0xC0,0xDF,0xE0,0xDF,0xE0,0x6F,0xC0,0x59,0xC0,0xFF,0xC0,0x6D,0x80,0x7F,0xE0,0x6F,0xE0,0xF1,0x20,0x62,0x20,0x00,0x00,}}, +{ 0x7DDA, {0x21,0x00,0x22,0x00,0x4B,0xC0,0xFB,0xC0,0x32,0x40,0x6B,0xC0,0xFD,0x00,0x37,0x20,0x6B,0xC0,0x65,0x40,0xA9,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x7DDC, {0x20,0x60,0x67,0x80,0x7B,0x00,0x7B,0x40,0x49,0x80,0x79,0x40,0x27,0xE0,0xF9,0xA0,0xAB,0xC0,0xAB,0xA0,0xBD,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7DDD, {0x20,0x00,0x23,0xC0,0xEB,0xC0,0xFB,0xC0,0x3F,0xE0,0x2A,0x40,0xFB,0xC0,0x32,0x40,0x6B,0xC0,0x63,0xC0,0xAE,0x40,0x20,0x40,0x00,0x00,}}, +{ 0x7DDE, {0x62,0x00,0x6D,0x80,0xD9,0x80,0xDF,0xA0,0x6B,0x60,0x5A,0x00,0xFF,0xC0,0x69,0x40,0x7D,0xC0,0x7C,0x80,0xE8,0xC0,0x6B,0x20,0x00,0x00,}}, +{ 0x7DE0, {0x21,0x00,0x21,0x00,0x5F,0xE0,0xD2,0x80,0x2F,0xE0,0x49,0x40,0xF1,0x00,0x27,0xC0,0x75,0x40,0x75,0x40,0xA5,0xC0,0x21,0x00,0x00,0x00,}}, +{ 0x7DE1, {0x60,0x00,0x67,0xC0,0xD7,0xC0,0xD7,0xC0,0x67,0xE0,0x54,0x80,0xF7,0x60,0x6F,0xE0,0x77,0xC0,0x77,0xC0,0xE7,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x7DE4, {0x23,0xC0,0x23,0xC0,0xEF,0xE0,0xFB,0xC0,0x32,0x00,0x2B,0xE0,0xF9,0x80,0x37,0xE0,0x79,0x80,0x6B,0xC0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7DE8, {0x20,0x00,0x2F,0xE0,0x50,0x00,0xF7,0xC0,0x27,0xC0,0x54,0x00,0xFF,0xE0,0x25,0x60,0x7F,0xE0,0x7D,0x60,0xAD,0x60,0x34,0x60,0x00,0x00,}}, +{ 0x7DE9, {0x20,0x60,0x27,0xA0,0x4A,0xC0,0xFF,0xE0,0x31,0x00,0x6F,0xE0,0xFA,0x00,0x33,0xE0,0x72,0x40,0x65,0x80,0xAB,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x7DEC, {0x20,0x00,0x3F,0xE0,0x52,0x00,0xFF,0xC0,0x2A,0xC0,0x5A,0xC0,0xFB,0xC0,0x2A,0xC0,0x7B,0xC0,0x7A,0xC0,0xAF,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x7DEF, {0x21,0x00,0x27,0xC0,0x49,0x40,0xFF,0xE0,0x33,0xC0,0x6A,0x40,0xFB,0xC0,0x30,0x80,0x7B,0xC0,0x6F,0xE0,0xA0,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7DF2, {0x60,0x80,0x6E,0x80,0xDA,0xC0,0xDF,0xC0,0x6B,0xE0,0x5B,0xA0,0xFF,0xA0,0x6A,0xC0,0x7E,0x40,0x7E,0x80,0xE3,0x00,0x62,0x00,0x00,0x00,}}, +{ 0x7DF4, {0x21,0x00,0x21,0x00,0x5F,0xE0,0xFF,0xC0,0x29,0x40,0x5F,0xC0,0xF9,0x40,0x3F,0xC0,0x73,0x80,0x6D,0x40,0xB9,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x7DFB, {0x61,0x80,0x7F,0x80,0xE5,0x80,0xEF,0xE0,0x6B,0x40,0x5D,0x40,0xF5,0xC0,0x7F,0xC0,0x74,0x80,0x67,0xC0,0xFB,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x7E01, {0x20,0x00,0x27,0x80,0x50,0x80,0xF7,0x80,0x2F,0xE0,0x51,0x00,0xF3,0xA0,0x2D,0xC0,0x72,0x80,0x7F,0xC0,0xAD,0xA0,0x23,0x00,0x00,0x00,}}, +{ 0x7E04, {0x20,0x00,0x2F,0xC0,0x5F,0xC0,0xDF,0xC0,0x21,0x00,0x5F,0xC0,0xF9,0x40,0x2F,0xC0,0x79,0x40,0x7F,0xE0,0xA9,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x7E05, {0x61,0x80,0x61,0xC0,0xDF,0xE0,0xDF,0xE0,0x6F,0xC0,0x5B,0xC0,0xFF,0xC0,0x6D,0xC0,0x7E,0x80,0x7F,0xE0,0xF5,0xE0,0x69,0x20,0x00,0x00,}}, +{ 0x7E09, {0x60,0x00,0x6F,0xE0,0xD2,0x80,0xD7,0xC0,0x6F,0xE0,0x50,0x00,0xFF,0xE0,0x67,0xC0,0x77,0xC0,0x77,0xC0,0xE7,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x7E0A, {0x63,0x80,0x60,0x80,0xD7,0xC0,0xDF,0xE0,0x62,0x80,0x52,0x80,0xF4,0x40,0x6F,0xE0,0x75,0xC0,0x75,0xC0,0xEF,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x7E0B, {0x68,0x80,0x65,0x80,0xD5,0xC0,0xD9,0x40,0x65,0xC0,0x55,0x00,0xF1,0xC0,0x6D,0x40,0x75,0xC0,0x75,0xC0,0xEB,0x00,0x71,0xE0,0x00,0x00,}}, +{ 0x7E12, {0x22,0x40,0x21,0x40,0xEF,0xE0,0xFF,0xE0,0x33,0xC0,0x29,0x80,0xFF,0xE0,0x32,0x00,0x6F,0xC0,0x69,0x80,0xBF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x7E1B, {0x21,0x80,0x21,0x40,0x5F,0xE0,0xDF,0xC0,0x69,0x40,0x5F,0xC0,0xF9,0x40,0x2F,0xC0,0x70,0x80,0x7F,0xE0,0xA2,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7E1E, {0x21,0x00,0x2F,0xE0,0x48,0x00,0xFB,0x80,0x33,0x80,0x68,0x00,0xFF,0xC0,0x34,0x40,0x7F,0xC0,0x6F,0xC0,0xA4,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x7E1F, {0x60,0x00,0x6F,0xE0,0xDF,0xC0,0xDF,0xC0,0x6F,0xE0,0x5B,0xC0,0xFB,0x80,0x6E,0xE0,0x7F,0xE0,0x7F,0xE0,0xF3,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x7E21, {0x61,0x00,0x63,0x00,0xDF,0xE0,0xD9,0x00,0x7F,0xC0,0x54,0x80,0xF3,0x80,0x6F,0xE0,0x7F,0xC0,0x7F,0xC0,0xE1,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x7E22, {0x01,0x00,0x67,0xC0,0x67,0xE0,0x7F,0xE0,0x77,0xC0,0x69,0xC0,0x77,0xA0,0x73,0x40,0x7F,0xE0,0x65,0x40,0x69,0x40,0xE1,0x00,0x00,0x00,}}, +{ 0x7E23, {0x00,0x20,0x7B,0xC0,0xFB,0x00,0xFB,0x40,0xF9,0x80,0xE9,0x40,0xBF,0xE0,0x81,0xA0,0xFB,0xC0,0x7B,0xA0,0xAD,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7E26, {0x22,0x40,0x23,0x40,0x55,0x40,0xDB,0xE0,0x62,0x80,0x54,0x80,0xF5,0x80,0x2D,0xE0,0x75,0x80,0x75,0x80,0xA6,0x80,0x24,0x60,0x00,0x00,}}, +{ 0x7E2B, {0x61,0x80,0x69,0xC0,0xD7,0xC0,0xD7,0xC0,0x61,0xA0,0x5F,0xC0,0xF5,0x80,0x77,0xC0,0x77,0xE0,0x67,0xE0,0xEB,0x80,0x71,0xE0,0x00,0x00,}}, +{ 0x7E2E, {0x20,0x80,0x20,0x80,0x57,0xE0,0xDC,0x20,0x23,0xC0,0x52,0x80,0xF5,0xE0,0x2D,0x20,0x75,0xE0,0x75,0x20,0xA5,0xE0,0x25,0x20,0x00,0x00,}}, +{ 0x7E31, {0x65,0x80,0x65,0x80,0xE9,0x80,0xFF,0xC0,0x77,0xA0,0x55,0xA0,0xFB,0x80,0x7B,0x80,0x7B,0xC0,0x7B,0x80,0xED,0x80,0x68,0xE0,0x00,0x00,}}, +{ 0x7E32, {0x60,0x00,0x6F,0xC0,0xDF,0xC0,0xDF,0xC0,0x6F,0xC0,0x52,0x80,0xF7,0x80,0x63,0x40,0x7F,0xA0,0x75,0x40,0xE9,0x40,0x61,0x00,0x00,0x00,}}, +{ 0x7E35, {0x20,0x00,0x23,0xC0,0xEB,0xC0,0xFB,0xC0,0x33,0xC0,0x2F,0xE0,0xFD,0xA0,0x37,0xE0,0x7F,0xC0,0x6B,0x80,0xA3,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x7E37, {0x21,0x80,0x23,0xC0,0xEF,0xE0,0xFF,0xE0,0x33,0xC0,0x2B,0xC0,0xFB,0xC0,0x33,0xC0,0x7F,0xE0,0x6B,0xC0,0xA1,0xC0,0x27,0x20,0x00,0x00,}}, +{ 0x7E39, {0x60,0x00,0x7F,0xE0,0xE7,0xC0,0xEF,0xC0,0x6F,0xC0,0x50,0x00,0xF7,0x80,0x60,0x00,0x7F,0xE0,0x75,0x40,0xE9,0x40,0x63,0x00,0x00,0x00,}}, +{ 0x7E3A, {0x69,0x80,0x65,0x80,0xD7,0xE0,0xDB,0xC0,0x67,0xC0,0x57,0xC0,0xF3,0xC0,0x6F,0xC0,0x77,0xE0,0x77,0xE0,0xEB,0x80,0x71,0xE0,0x00,0x00,}}, +{ 0x7E3B, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xE0,0x6B,0xA0,0x65,0x80,0x7F,0x80,0x7F,0xE0,0x7F,0x80,0x72,0x40,0x82,0x00,0x00,0x00,}}, +{ 0x7E3D, {0x62,0x00,0x6F,0xC0,0xDB,0xC0,0xDF,0xC0,0x6B,0xC0,0x5A,0xC0,0xFF,0xC0,0x73,0x00,0x7B,0xE0,0x6A,0x20,0xF2,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x7E3E, {0x20,0x80,0x27,0xE0,0x6B,0xC0,0xF8,0x80,0x37,0xE0,0x6B,0xC0,0xFA,0x40,0x33,0xC0,0x7A,0x40,0x6B,0xC0,0xA3,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x7E41, {0x61,0x00,0xFF,0x00,0xFF,0xE0,0xFF,0x40,0x75,0xC0,0x7F,0xC0,0x4D,0x20,0x33,0x00,0x7F,0xC0,0x7F,0x00,0x64,0xC0,0x04,0x00,0x00,0x00,}}, +{ 0x7E43, {0x30,0x80,0x34,0xA0,0x6F,0xE0,0x6F,0xE0,0x37,0x60,0x2D,0xE0,0x7D,0xE0,0x37,0xE0,0x3F,0xE0,0x3F,0xE0,0x79,0xA0,0x33,0x60,0x00,0x00,}}, +{ 0x7E46, {0x60,0x00,0x6F,0xE0,0xDF,0xE0,0xDF,0xE0,0x6F,0xE0,0x51,0x20,0xF3,0x80,0x6F,0xC0,0x77,0xE0,0x77,0xC0,0xE3,0x80,0x6E,0x00,0x00,0x00,}}, +{ 0x7E4A, {0x22,0x80,0x22,0xC0,0x5F,0xA0,0xF2,0x80,0x2F,0xE0,0x55,0x80,0xF5,0xA0,0x2D,0xA0,0x7D,0xC0,0x67,0xA0,0xB8,0xE0,0x21,0x20,0x00,0x00,}}, +{ 0x7E4B, {0x20,0x00,0xFD,0x80,0x7A,0x60,0x7F,0xE0,0x7A,0xC0,0x79,0x80,0xFF,0x80,0x3B,0x60,0x1F,0x80,0xFF,0xC0,0x34,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x7E4D, {0x21,0x00,0x27,0xC0,0x4F,0xE0,0x97,0xC0,0x6F,0xC0,0x59,0x40,0xFD,0xC0,0x2B,0x40,0x7F,0xC0,0x7B,0x40,0xAD,0xC0,0x31,0x40,0x00,0x00,}}, +{ 0x7E54, {0x24,0x80,0x24,0xC0,0x5F,0xC0,0xDA,0x80,0x2F,0xE0,0x50,0x80,0xFE,0xC0,0x2A,0xC0,0x7E,0x80,0x7A,0xA0,0xAF,0x60,0x22,0x20,0x00,0x00,}}, +{ 0x7E55, {0x22,0x40,0x27,0xE0,0x48,0x80,0xFB,0xC0,0x37,0xE0,0x6A,0xC0,0xF9,0x80,0x37,0xE0,0x7B,0xC0,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7E56, {0x6B,0x80,0x6B,0x80,0xFF,0x80,0xFF,0xE0,0x73,0x40,0x6F,0x40,0xFB,0xC0,0x6E,0xC0,0x7E,0x80,0x7E,0xC0,0xEB,0x40,0x6A,0x20,0x00,0x00,}}, +{ 0x7E59, {0x20,0xC0,0x27,0xC0,0xEB,0xC0,0xFF,0xE0,0x33,0xC0,0x2B,0xC0,0xFD,0xA0,0x33,0xC0,0x7B,0xC0,0x6B,0xC0,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x7E5A, {0x21,0x80,0x21,0x80,0xEF,0xE0,0xFE,0x60,0x37,0xE0,0x2A,0x40,0xFB,0xC0,0x32,0x40,0x7B,0xC0,0x6B,0xA0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x7E5D, {0x30,0x00,0x37,0xE0,0x6F,0xE0,0x6F,0xE0,0x37,0xE0,0x2D,0xE0,0x7D,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x77,0xE0,0x34,0x20,0x00,0x00,}}, +{ 0x7E5E, {0x61,0x00,0x67,0xC0,0xDF,0xE0,0xDF,0xE0,0x6E,0xC0,0x54,0x80,0xF7,0xE0,0x6C,0x00,0x7F,0xE0,0x73,0xA0,0xE5,0xA0,0x68,0xE0,0x00,0x00,}}, +{ 0x7E66, {0x60,0x00,0x7D,0xC0,0xE5,0x40,0xFD,0xC0,0x71,0x80,0x73,0xC0,0xFF,0xC0,0x77,0xC0,0x77,0xC0,0x75,0xC0,0xE7,0xE0,0x78,0x20,0x00,0x00,}}, +{ 0x7E67, {0x60,0x00,0x6F,0xE0,0xDF,0xE0,0xDF,0xE0,0x6F,0xC0,0x51,0x00,0xF7,0xC0,0x60,0x00,0x7F,0xE0,0x72,0x40,0xEF,0xE0,0x60,0x20,0x00,0x00,}}, +{ 0x7E69, {0x60,0x00,0x6F,0xC0,0xDF,0xC0,0xDF,0xC0,0x6B,0xC0,0x5B,0xC0,0xFF,0xC0,0x6B,0xC0,0x7F,0xC0,0x7F,0xE0,0xE2,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x7E6A, {0x61,0x00,0x63,0x00,0xD7,0x80,0xDF,0xC0,0x6F,0xE0,0x5D,0xC0,0xFB,0xC0,0x6F,0xC0,0x77,0x80,0x77,0x80,0xE4,0x80,0x67,0x80,0x00,0x00,}}, +{ 0x7E6D, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x6F,0xC0,0x6F,0xC0,0x57,0xC0,0x7F,0xC0,0x7D,0xC0,0x5F,0xC0,0x74,0x40,0x54,0xC0,0x00,0x00,}}, +{ 0x7E70, {0x20,0x00,0x23,0xC0,0x4A,0x40,0xFB,0xC0,0x37,0xE0,0x6D,0xA0,0xFF,0xE0,0x30,0x80,0x7F,0xE0,0x69,0xC0,0xA6,0xA0,0x20,0x80,0x00,0x00,}}, +{ 0x7E79, {0x60,0x00,0x6F,0xC0,0xDF,0xC0,0xDF,0xC0,0x6F,0xC0,0x51,0x00,0xFF,0xE0,0x64,0xC0,0x7F,0xE0,0x7F,0xC0,0xE3,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x7E7B, {0x60,0x00,0x67,0xC0,0xDF,0xE0,0xDF,0xE0,0x7D,0xC0,0x51,0x00,0xFF,0xE0,0x63,0x00,0x7F,0xC0,0x7B,0xC0,0xEB,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x7E7C, {0x62,0x80,0x6B,0xC0,0xDF,0xC0,0xDB,0xC0,0x6F,0xC0,0x5F,0xE0,0xFB,0xC0,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0xEF,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x7E7D, {0x21,0x80,0x27,0xE0,0xEF,0xE0,0xFF,0xE0,0x37,0xC0,0x29,0xC0,0xFE,0x40,0x33,0xC0,0x7B,0xC0,0x6B,0xC0,0xA2,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x7E7F, {0x60,0x80,0x6F,0x80,0xDE,0xE0,0xDF,0xE0,0x6F,0x00,0x5B,0xC0,0xFF,0x00,0x70,0x00,0x7F,0xC0,0x6B,0xC0,0xFF,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x7E82, {0x42,0x00,0x7F,0xE0,0x94,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x5F,0x00,0xFF,0xE0,0x1F,0x00,0x24,0xC0,0x00,0x00,}}, +{ 0x7E83, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFF,0xE0,0x6B,0xC0,0x6B,0xC0,0xF7,0xA0,0x64,0x80,0x77,0x80,0x77,0x80,0xE8,0x80,0x70,0x80,0x00,0x00,}}, +{ 0x7E88, {0x64,0x00,0x65,0xE0,0xDE,0x80,0xDF,0xC0,0x65,0xC0,0x5F,0xC0,0xF1,0xC0,0x6F,0xC0,0x7B,0xC0,0x7F,0xC0,0xEB,0xA0,0x61,0x20,0x00,0x00,}}, +{ 0x7E89, {0x64,0x80,0x6E,0xC0,0xDF,0xE0,0xDF,0xE0,0x6A,0xC0,0x57,0xA0,0xF4,0x80,0x67,0x80,0x77,0x80,0x77,0x80,0xE2,0x80,0x6C,0x40,0x00,0x00,}}, +{ 0x7E8C, {0x61,0x00,0x7F,0xE0,0xCF,0xC0,0xDF,0xC0,0x6D,0xC0,0x5F,0xC0,0xFF,0x80,0x67,0x80,0x77,0x80,0x77,0x80,0xE6,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x7E8E, {0x65,0x80,0x65,0xC0,0xFF,0xC0,0xFF,0xE0,0x7B,0x80,0x7B,0xC0,0xEB,0xC0,0x7B,0xC0,0x7A,0x80,0x7F,0xA0,0xFB,0x60,0x62,0x20,0x00,0x00,}}, +{ 0x7E8F, {0x61,0x80,0x6F,0xE0,0xDB,0xC0,0xDB,0xC0,0x6B,0xC0,0x5B,0xC0,0xFB,0xC0,0x6F,0xE0,0x7F,0xE0,0x7F,0xE0,0xE9,0x80,0x77,0xE0,0x00,0x00,}}, +{ 0x7E90, {0x64,0x00,0x65,0xE0,0xDE,0x80,0xDF,0xC0,0x6B,0xC0,0x53,0xC0,0xFB,0xC0,0x77,0xC0,0x77,0xC0,0x69,0xC0,0xF1,0xA0,0x61,0x20,0x00,0x00,}}, +{ 0x7E92, {0x60,0x00,0x6F,0xE0,0xDB,0xC0,0xDB,0xC0,0x6B,0xC0,0x5B,0xC0,0xFB,0xC0,0x6F,0xE0,0x7F,0xE0,0x7F,0xE0,0xF1,0x80,0x6F,0xE0,0x00,0x00,}}, +{ 0x7E93, {0x60,0x00,0x6F,0xC0,0xDF,0xC0,0xDF,0xC0,0x6B,0xC0,0x5F,0xC0,0xF7,0x40,0x6B,0x20,0x7F,0xE0,0x77,0x80,0xE3,0x80,0x6E,0x40,0x00,0x00,}}, +{ 0x7E94, {0x63,0x80,0x65,0x80,0xDF,0xC0,0xD7,0xE0,0x65,0xC0,0x57,0xA0,0xFD,0xE0,0x63,0x80,0x7F,0x80,0x77,0xC0,0xE3,0xA0,0x7C,0xE0,0x00,0x00,}}, +{ 0x7E96, {0x6B,0x80,0x6B,0xC0,0xFF,0xC0,0xFF,0xE0,0x7B,0x80,0x7B,0xC0,0xEB,0xC0,0x7B,0xC0,0x7A,0x80,0x7F,0xA0,0xFB,0x60,0x62,0x20,0x00,0x00,}}, +{ 0x7E9B, {0x04,0x00,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x7F,0x80,0x7B,0xE0,0x7F,0xC0,0x7B,0xC0,0x7F,0xE0,0x7B,0xC0,0xA6,0xA0,0x00,0x00,}}, +{ 0x7E9C, {0x61,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xE0,0x77,0xE0,0x7F,0xE0,0xF7,0x80,0x77,0x80,0x77,0x80,0x67,0xA0,0xE3,0xA0,0x7C,0xE0,0x00,0x00,}}, +{ 0x7F36, {0x20,0x00,0x20,0x00,0x3F,0xC0,0x44,0x00,0x44,0x00,0xBF,0xE0,0x04,0x00,0x24,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7F38, {0x60,0x00,0x67,0xE0,0x79,0x80,0xA1,0x80,0xFD,0x80,0x21,0x80,0x69,0x80,0x69,0x80,0x69,0x80,0x79,0x80,0x4F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x7F3A, {0x61,0x80,0x61,0x80,0x7B,0xC0,0xA3,0xC0,0xFD,0xC0,0x21,0xC0,0x6F,0xE0,0x69,0x80,0x69,0x80,0x7A,0x80,0x4C,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x7F45, {0x61,0x00,0x63,0xC0,0x7F,0xE0,0x7F,0xC0,0xA5,0xC0,0xFC,0xC0,0x27,0xC0,0x77,0xC0,0x77,0xE0,0x7F,0xE0,0x59,0x80,0x51,0x80,0x00,0x00,}}, +{ 0x7F4C, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x71,0x80,0xDA,0x60,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7F4D, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0xFF,0xE0,0xFF,0xE0,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7F4E, {0x67,0x80,0x64,0x80,0x7F,0x80,0x7F,0xC0,0xA3,0x00,0xFF,0xE0,0x2D,0xC0,0x77,0xC0,0x7F,0xE0,0x7F,0xE0,0x53,0xC0,0x4C,0x40,0x00,0x00,}}, +{ 0x7F50, {0x62,0x80,0x6F,0xE0,0x7F,0xC0,0x7F,0xC0,0xA7,0xC0,0xFA,0x80,0x27,0xE0,0x7D,0x80,0x77,0xC0,0x77,0xC0,0x57,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x7F51, {0x00,0x00,0x7F,0xE0,0x48,0xA0,0x48,0xA0,0x6C,0xA0,0x6A,0xA0,0x51,0x20,0x59,0xA0,0x5F,0xA0,0x72,0xE0,0x64,0x20,0x40,0x60,0x00,0x00,}}, +{ 0x7F54, {0x00,0x00,0x7F,0xC0,0x59,0x40,0x4A,0x40,0x7F,0xC0,0x44,0x40,0x5F,0x40,0x50,0x40,0x50,0x40,0x4E,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x7F55, {0x00,0x00,0x7F,0xE0,0x92,0x40,0x13,0xC0,0x20,0x00,0x7F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7F58, {0x00,0x00,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x02,0x00,0x06,0x00,0x3D,0xC0,0xE4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7F5F, {0x00,0x00,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x44,0x40,0x04,0x00,0xFF,0xE0,0x04,0x00,0x7F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x7F60, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x60,0x80,0x7F,0x80,0x64,0x00,0x7F,0xC0,0x62,0x20,0x7D,0xA0,0xE0,0x60,0x00,0x00,}}, +{ 0x7F67, {0x00,0x00,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x31,0x80,0x21,0x80,0xFF,0xE0,0x71,0x80,0x6B,0xC0,0xA5,0xA0,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x7F68, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0xFF,0xE0,0x25,0x80,0x7F,0x80,0xF5,0xE0,0x3F,0x80,0x3F,0xC0,0x34,0x40,0x03,0xC0,0x00,0x00,}}, +{ 0x7F69, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x07,0xC0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7F6A, {0x00,0x00,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x09,0x00,0x79,0xC0,0x09,0x00,0x79,0xC0,0x09,0x00,0xF1,0xE0,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x7F6B, {0x00,0x00,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x7C,0x80,0x10,0x80,0xFE,0xC0,0x10,0xA0,0x7C,0xA0,0x1E,0x80,0xF0,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x7F6E, {0x00,0x00,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0xFF,0xE0,0x1F,0x80,0x50,0x80,0x5F,0x80,0x5F,0x80,0x5F,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x7F70, {0x00,0x00,0x3F,0xE0,0x28,0xA0,0x3F,0xE0,0x1C,0x20,0x7E,0xA0,0x1C,0xA0,0x1C,0xA0,0x00,0xA0,0x3E,0xA0,0x3E,0x20,0x22,0x60,0x00,0x00,}}, +{ 0x7F72, {0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x04,0x40,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x1F,0x80,0x70,0x80,0x9F,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x7F75, {0x00,0x00,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x22,0x00,0x3F,0x80,0x22,0x00,0x3F,0x80,0x3F,0xE0,0x2B,0xA0,0x52,0xA0,0x80,0xC0,0x00,0x00,}}, +{ 0x7F77, {0x00,0x00,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x29,0x40,0xFD,0x80,0x79,0x20,0x49,0xE0,0x79,0x40,0x79,0x80,0x49,0x20,0x59,0xE0,0x00,0x00,}}, +{ 0x7F78, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x30,0x80,0xFF,0xE0,0x00,0x80,0x72,0x80,0x79,0x80,0x78,0x80,0x78,0x80,0x48,0x80,0x00,0x00,}}, +{ 0x7F79, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x64,0x80,0x6F,0xC0,0x79,0x00,0xFF,0x80,0xEF,0x80,0x6F,0x80,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x7F82, {0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x39,0x40,0x69,0xC0,0x33,0xE0,0x3A,0x20,0x7F,0xE0,0x3F,0xE0,0x52,0x20,0x12,0x60,0x00,0x00,}}, +{ 0x7F83, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0xFF,0xE0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x25,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x7F85, {0x00,0x00,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x32,0xC0,0xD3,0xE0,0x66,0x80,0x53,0xC0,0xFA,0x80,0x73,0xC0,0xAB,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x7F86, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0xFB,0x80,0x7A,0x40,0x49,0xC0,0x7A,0x80,0x7B,0x00,0x5B,0xC0,0x52,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x7F87, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0xFF,0xC0,0x71,0x80,0x72,0x80,0x7F,0xE0,0x7B,0xC0,0xFF,0xC0,0x32,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x7F88, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xE0,0xFF,0x80,0x73,0xC0,0x73,0x80,0x7B,0xC0,0x7B,0xE0,0xFF,0xE0,0x37,0xE0,0x28,0xC0,0x00,0x00,}}, +{ 0x7F8A, {0x20,0x80,0x11,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7F8C, {0x21,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x7F8E, {0x20,0x80,0x11,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x7F94, {0x21,0x80,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x7F9A, {0x49,0x80,0x69,0x80,0xF9,0x80,0xFE,0x40,0x27,0xE0,0x78,0x00,0x27,0xC0,0x39,0x40,0xE1,0x40,0x61,0xC0,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x7F9D, {0x48,0x40,0x68,0x80,0xFF,0x80,0xFF,0x80,0x23,0x80,0x7B,0xE0,0x22,0x80,0x3A,0x80,0xE2,0x60,0x66,0x60,0x5F,0xE0,0x80,0x20,0x00,0x00,}}, +{ 0x7F9E, {0x21,0x00,0x13,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x20,0x00,0x3F,0x80,0x7F,0xC0,0x9F,0xC0,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7FA3, {0x00,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x1F,0xC0,0x30,0x40,0xDF,0xC0,0x13,0x00,0x7F,0xC0,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x7FA4, {0x02,0x40,0x79,0x40,0x2F,0xE0,0xF8,0x80,0x28,0x80,0x3B,0xC0,0x20,0x80,0x78,0x80,0x6F,0xE0,0xA8,0x80,0x38,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x7FA8, {0x11,0x00,0x7F,0xC0,0x04,0x00,0x1F,0x80,0xFF,0xE0,0x42,0x00,0x22,0x00,0x87,0xE0,0x59,0x40,0x23,0x80,0x44,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x7FA9, {0x11,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x1A,0x80,0x62,0x40,0xFF,0xE0,0x29,0x40,0xF0,0xA0,0x23,0xA0,0x6C,0x60,0x00,0x00,}}, +{ 0x7FAE, {0x11,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x52,0x40,0x89,0x20,0x7F,0xC0,0x1F,0x00,0xFF,0xE0,0x33,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x7FAF, {0x48,0x00,0x6B,0xC0,0xFF,0xC0,0xFF,0xC0,0x23,0xC0,0x79,0x00,0x23,0xE0,0x3D,0xA0,0xE7,0xA0,0x67,0xA0,0x44,0x20,0x80,0xC0,0x00,0x00,}}, +{ 0x7FB2, {0x11,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x19,0x80,0x61,0x40,0xFF,0xE0,0xF9,0xC0,0xF8,0xE0,0x09,0xE0,0x36,0x20,0x00,0x00,}}, +{ 0x7FB6, {0x91,0x00,0xFF,0xE0,0xFF,0xC0,0x6B,0xC0,0x6B,0xC0,0x6F,0xC0,0x77,0x80,0xE4,0x80,0x47,0x80,0x47,0x80,0x9F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7FB8, {0x04,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x60,0x80,0x7F,0x80,0x6B,0xC0,0x7F,0xC0,0x6F,0xC0,0x7F,0xE0,0x75,0xE0,0xE5,0x20,0x00,0x00,}}, +{ 0x7FB9, {0x11,0x00,0x7F,0xC0,0x3F,0x80,0xFF,0xE0,0xD2,0x40,0xA9,0x20,0x7F,0xC0,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x7FBD, {0x00,0x00,0x7F,0xE0,0x04,0x20,0x05,0x20,0x24,0xA0,0x14,0xA0,0x04,0x20,0x0C,0x60,0x14,0xA0,0x67,0x20,0x04,0x20,0x0C,0x60,0x00,0x00,}}, +{ 0x7FC1, {0x17,0x80,0x10,0x80,0xE6,0x60,0x8F,0x20,0x7E,0x80,0x00,0x00,0xFF,0xC0,0x4A,0x40,0x08,0x40,0x39,0xC0,0xCE,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x7FC5, {0x60,0x00,0x6F,0xC0,0xF3,0xC0,0xF7,0xC0,0x69,0x40,0xF3,0xC0,0x53,0xC0,0x75,0x40,0x29,0x40,0x33,0x40,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x7FC6, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0x40,0x08,0x00,0x7F,0x00,0x11,0x20,0x64,0xE0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7FCA, {0x30,0x00,0x3F,0xE0,0x7B,0x20,0x7B,0x60,0x55,0x60,0x39,0xA0,0x31,0x60,0x33,0x60,0x33,0xA0,0x7D,0x20,0x01,0x20,0x03,0x60,0x00,0x00,}}, +{ 0x7FCC, {0x00,0x00,0x7F,0xC0,0x29,0x40,0x39,0xC0,0x6B,0x40,0x1C,0xC0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x0A,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x7FD2, {0x00,0x00,0x7F,0xE0,0x25,0x20,0x1C,0xE0,0x67,0x20,0x08,0x60,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x7FD4, {0x48,0x00,0x2F,0xE0,0x79,0x20,0x7D,0x20,0x33,0xA0,0x3B,0xE0,0x31,0x20,0x33,0x60,0x75,0xA0,0x31,0x20,0x21,0x20,0x43,0x60,0x00,0x00,}}, +{ 0x7FD5, {0x04,0x00,0x0A,0x00,0xFF,0xE0,0xFF,0xE0,0x31,0x80,0x3F,0x80,0x00,0x00,0xFF,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x7FE0, {0x00,0x00,0x7B,0xC0,0x39,0xC0,0x7B,0xC0,0x1C,0xC0,0x04,0x00,0x7F,0xC0,0x11,0x80,0x2E,0x40,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x7FE1, {0x12,0x00,0xF3,0xE0,0x73,0xC0,0x73,0xC0,0xF3,0xE0,0x22,0x00,0xFF,0xC0,0x18,0xC0,0xFF,0xC0,0xFF,0xC0,0xCE,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x7FE6, {0x11,0x00,0xFF,0xE0,0x78,0x40,0x79,0x40,0x79,0x40,0x59,0x40,0x58,0xC0,0xFF,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x7FE9, {0x00,0x00,0x7F,0xE0,0x3D,0xA0,0x3D,0xE0,0x3F,0xE0,0x20,0xA0,0x3D,0xE0,0x7D,0xE0,0x7E,0xA0,0x7C,0xA0,0x3C,0xA0,0x2D,0xE0,0x00,0x00,}}, +{ 0x7FEB, {0x00,0x00,0xFF,0xE0,0xBA,0x00,0x6E,0x00,0xB3,0xE0,0x67,0x80,0x21,0x80,0x7D,0x80,0x45,0x80,0x7D,0xA0,0x7E,0xA0,0x44,0x60,0x00,0x00,}}, +{ 0x7FF0, {0x21,0x00,0x21,0x00,0xFA,0x80,0x7C,0x40,0x4F,0xE0,0x79,0x40,0x4D,0xC0,0x7B,0x40,0x27,0xC0,0xFD,0xC0,0x21,0x40,0x23,0xC0,0x00,0x00,}}, +{ 0x7FF3, {0x00,0x00,0x7D,0x80,0x7A,0x60,0x7F,0xE0,0x73,0xC0,0x69,0x80,0x7F,0x60,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x7FF9, {0x20,0x00,0x77,0xC0,0xFB,0xC0,0xFF,0xC0,0xF9,0x40,0x53,0xC0,0x7B,0xC0,0x85,0x40,0xF9,0x40,0x73,0x60,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x7FFB, {0x0C,0x00,0x77,0xE0,0x3C,0xA0,0x7E,0xA0,0x39,0xE0,0x35,0xE0,0x34,0xA0,0x7D,0xE0,0x3E,0xA0,0x3C,0xA0,0x3C,0xA0,0x25,0xE0,0x00,0x00,}}, +{ 0x7FFC, {0x00,0x00,0xFF,0xC0,0x6B,0xC0,0xDF,0xC0,0x24,0x80,0x3F,0x80,0x24,0x80,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x1B,0x00,0xE0,0xC0,0x00,0x00,}}, +{ 0x8000, {0x20,0x00,0x27,0xC0,0xAF,0xC0,0x7F,0xC0,0x37,0xC0,0xFA,0x80,0x67,0xE0,0x6D,0x80,0x67,0xC0,0x7F,0xC0,0x77,0xE0,0x84,0x00,0x00,0x00,}}, +{ 0x8001, {0x04,0x00,0x04,0x80,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x0C,0x00,0x18,0x00,0x19,0x80,0x6E,0x00,0x88,0x40,0x08,0x40,0x07,0xC0,0x00,0x00,}}, +{ 0x8003, {0x04,0x80,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x02,0x00,0x0C,0x00,0x3F,0xC0,0xC8,0x00,0x1F,0x80,0x10,0x80,0x00,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x8004, {0x08,0x80,0x3F,0x00,0xFF,0xE0,0xFF,0xE0,0x3F,0x40,0xE8,0x40,0x07,0xC0,0x3E,0x00,0x7F,0x80,0x7F,0xE0,0xF8,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x8005, {0x04,0x00,0x04,0x80,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x04,0x00,0x1F,0x80,0x70,0x80,0x9F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x8006, {0x08,0x80,0x3F,0x00,0xFF,0xE0,0xFF,0xE0,0x3F,0x40,0xE8,0x40,0x07,0xC0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x800B, {0x08,0x80,0x3F,0x00,0xFF,0xE0,0xFF,0xE0,0x3F,0x20,0xE7,0xE0,0x7F,0xC0,0x09,0x80,0x7F,0xC0,0x1F,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x800C, {0x00,0x00,0x7F,0xE0,0x02,0x00,0x3F,0xC0,0x29,0x40,0x29,0x40,0x29,0x40,0x29,0x40,0x29,0x40,0x29,0x40,0x29,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x8010, {0x00,0x40,0xFC,0x40,0x20,0x40,0xFF,0xE0,0xB4,0x40,0xB5,0x40,0xB4,0xC0,0xB4,0x40,0xB4,0x40,0xB4,0x40,0xB4,0x40,0x8C,0xC0,0x00,0x00,}}, +{ 0x8012, {0x04,0xC0,0x07,0x00,0x7C,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xE4,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8015, {0x21,0x40,0x21,0x40,0xFF,0xE0,0x79,0x40,0x21,0x40,0xFD,0x40,0x21,0x40,0x77,0xE0,0x6A,0x40,0xA2,0x40,0x24,0x40,0x28,0x40,0x00,0x00,}}, +{ 0x8017, {0x20,0x40,0x21,0x80,0xFF,0x00,0x71,0x40,0x27,0x80,0xF9,0x00,0x21,0x20,0x77,0xC0,0x69,0x00,0xA1,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x8018, {0x20,0x00,0x3B,0xC0,0xE0,0x00,0x78,0x00,0x37,0xE0,0xF9,0x80,0x21,0x80,0x71,0x80,0x69,0xC0,0xA1,0x40,0x27,0xA0,0x20,0x20,0x00,0x00,}}, +{ 0x8019, {0x20,0x00,0x3B,0xC0,0xE3,0xC0,0x7B,0xC0,0x33,0xC0,0xFF,0xC0,0x22,0x40,0x72,0x00,0x6A,0x00,0xA2,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x801C, {0x10,0x00,0x1D,0xC0,0x71,0x40,0x3D,0x40,0x19,0xC0,0x7D,0x40,0x11,0x00,0x39,0xE0,0x35,0x20,0x51,0x20,0x11,0xE0,0x11,0x20,0x00,0x00,}}, +{ 0x8021, {0x30,0xC0,0x3F,0xC0,0x75,0xC0,0x37,0xE0,0x35,0xE0,0x7D,0xE0,0x37,0xE0,0x3D,0xE0,0x7F,0xA0,0x3F,0xA0,0x31,0x20,0x32,0x40,0x00,0x00,}}, +{ 0x8028, {0x20,0x00,0x3F,0xE0,0xE7,0xC0,0x7F,0xC0,0x37,0xE0,0xFD,0xA0,0x35,0xC0,0x6F,0x60,0x6F,0xE0,0xA9,0x40,0x20,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x8033, {0x00,0x00,0xFF,0xE0,0x21,0x00,0x3F,0x00,0x21,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x21,0xC0,0xFF,0x00,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x8036, {0x00,0x00,0xFF,0xC0,0x49,0x40,0x79,0x80,0x49,0x80,0x49,0x80,0x79,0x40,0x49,0x20,0x4D,0x20,0xF9,0xE0,0x09,0x00,0x09,0x00,0x00,0x00,}}, +{ 0x803B, {0x01,0x80,0xF9,0x80,0x51,0x80,0x73,0x80,0x53,0xC0,0x53,0x80,0x73,0x80,0x53,0x80,0x73,0x80,0xF3,0x80,0x1F,0xE0,0x10,0x00,0x00,0x00,}}, +{ 0x803D, {0x01,0x00,0xF9,0x00,0x57,0xE0,0x75,0x20,0x59,0x00,0x51,0x00,0x71,0x80,0x51,0x80,0x7A,0x80,0xD2,0xA0,0x14,0xA0,0x18,0xE0,0x00,0x00,}}, +{ 0x803F, {0x01,0x80,0xFD,0x80,0x69,0x80,0x7B,0xA0,0x6B,0xC0,0x6B,0x80,0x7D,0x80,0x69,0x80,0x79,0x80,0xFA,0x40,0x0C,0x40,0x08,0x20,0x00,0x00,}}, +{ 0x8046, {0x01,0x00,0xFB,0x00,0x53,0x80,0x74,0x80,0x5F,0xC0,0x50,0x20,0x7F,0xC0,0x51,0x40,0x71,0x40,0xF1,0xC0,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x804A, {0x01,0x00,0x7E,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x35,0xE0,0x3F,0xE0,0x7D,0xE0,0x12,0xC0,0x14,0xC0,0x00,0x00,}}, +{ 0x8052, {0x00,0x40,0xF8,0x80,0x53,0x80,0x71,0x80,0x57,0xE0,0x51,0x80,0x71,0x80,0x53,0xC0,0x72,0x40,0xF2,0x40,0x13,0xC0,0x12,0x40,0x00,0x00,}}, +{ 0x8056, {0x00,0x00,0xFE,0x00,0x79,0xC0,0x79,0x40,0x4D,0xC0,0xF9,0x40,0x08,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x8058, {0x01,0x00,0xFF,0xC0,0x57,0xC0,0x77,0xC0,0x57,0xC0,0x50,0x00,0x7F,0xE0,0x51,0x00,0x73,0xC0,0xF0,0x40,0x10,0x40,0x10,0x80,0x00,0x00,}}, +{ 0x805A, {0x00,0x00,0xFC,0x00,0x7B,0xC0,0x79,0xC0,0x69,0x80,0x7E,0x40,0xC9,0x20,0x0E,0x80,0x77,0x80,0x75,0x80,0x64,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x805E, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x7F,0xC0,0x51,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x7F,0x40,0x41,0xC0,0x00,0x00,}}, +{ 0x805F, {0x60,0x00,0x7B,0xC0,0xFE,0x40,0xFF,0xC0,0x2A,0x40,0x40,0x00,0xFF,0xE0,0x31,0x80,0x3F,0x80,0x3F,0xE0,0xFF,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8061, {0x01,0x80,0xFA,0x80,0x56,0x40,0x79,0x20,0x52,0x80,0x57,0xC0,0x71,0x40,0x53,0x80,0x76,0x60,0xDE,0x20,0x12,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x8062, {0x01,0x80,0xF9,0x80,0x57,0xE0,0x78,0x00,0x57,0xE0,0x51,0x80,0x73,0x80,0x53,0xC0,0x73,0x80,0xF3,0x80,0x15,0x80,0x18,0xE0,0x00,0x00,}}, +{ 0x8068, {0x04,0x80,0xF4,0xC0,0x7B,0xC0,0x64,0xC0,0x6A,0xC0,0x7F,0xE0,0x61,0x20,0x72,0xC0,0x7F,0xE0,0xE2,0x80,0x24,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x806F, {0x04,0x80,0xF4,0xC0,0x7B,0xC0,0x64,0xC0,0x6A,0xC0,0x7F,0xE0,0x63,0xA0,0x7B,0xC0,0x7F,0xC0,0xEF,0xC0,0x25,0x80,0x29,0x80,0x00,0x00,}}, +{ 0x8070, {0x01,0x00,0xFF,0xC0,0x55,0xC0,0x77,0xC0,0x57,0xC0,0x56,0xC0,0x77,0xC0,0x53,0x00,0x77,0xE0,0xFE,0x20,0x12,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x8072, {0x21,0x80,0xFD,0x80,0x7A,0x60,0x7B,0xE0,0x7B,0xC0,0x79,0x80,0x47,0x60,0xBF,0xC0,0x3F,0x80,0x3F,0xC0,0xFF,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8073, {0x24,0x80,0x66,0xC0,0x39,0x60,0xE5,0xE0,0x6B,0x00,0x71,0xE0,0xFF,0xE0,0x31,0x80,0x3F,0x80,0x3F,0xE0,0xFF,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8074, {0x00,0x80,0xFF,0xF0,0x50,0x80,0x77,0xE0,0x55,0x60,0x75,0x60,0x57,0xE0,0x79,0x80,0xD5,0x40,0x15,0x10,0x19,0x50,0x10,0xC0,0x00,0x00,}}, +{ 0x8076, {0x00,0x00,0x7F,0xC0,0x1F,0x00,0x1F,0x00,0x7F,0x00,0x01,0x00,0xFF,0xE0,0x6A,0x80,0x7B,0x80,0x7B,0x80,0xFF,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x8077, {0x04,0x80,0xF4,0xC0,0x7F,0xC0,0x6A,0x80,0x7F,0xE0,0x60,0x80,0x6E,0xC0,0x6A,0xC0,0x7E,0x80,0xEE,0xA0,0x2B,0x60,0x22,0x20,0x00,0x00,}}, +{ 0x8079, {0x01,0x00,0xFF,0xE0,0x7F,0x40,0x7E,0xE0,0x73,0x80,0x6F,0xC0,0x6B,0xC0,0x7F,0xE0,0x7F,0xE0,0xFF,0xE0,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x807D, {0x01,0x00,0xF3,0x00,0x7F,0xE0,0x6F,0xC0,0x6B,0xC0,0x6F,0xC0,0xE0,0x00,0xFF,0xE0,0xE3,0x00,0xEB,0xA0,0xF2,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x807E, {0x12,0x00,0x7F,0xC0,0xFF,0x80,0xFF,0x80,0x6B,0x80,0x7B,0x80,0x7B,0xA0,0x7B,0xE0,0xFF,0xE0,0x1F,0xC0,0xFF,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x807F, {0x04,0x00,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x04,0xC0,0x3F,0x80,0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8084, {0x41,0x80,0x59,0x80,0x63,0xC0,0x7F,0xE0,0x61,0xC0,0x7B,0xC0,0x61,0x80,0xFB,0xC0,0x37,0xE0,0x6F,0xE0,0x49,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x8085, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x75,0x80,0x75,0x80,0x64,0x80,0x7F,0x80,0x75,0x80,0x55,0x80,0x95,0x80,0x00,0x00,}}, +{ 0x8086, {0x01,0x80,0x79,0x80,0x73,0xC0,0x77,0xE0,0x71,0xC0,0x43,0xC0,0xF9,0x80,0x63,0xC0,0x77,0xE0,0x5F,0xE0,0xE9,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8087, {0x01,0x00,0xFF,0x00,0x7F,0xE0,0x79,0xC0,0x47,0x60,0xBF,0x00,0xFF,0xE0,0x3F,0x00,0x04,0x00,0x7F,0xC0,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x8089, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x44,0x40,0x4A,0x40,0x55,0x40,0x64,0x40,0x46,0x40,0x49,0x40,0x50,0xC0,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x808B, {0x00,0x80,0x38,0x80,0x28,0x80,0x2F,0xE0,0x38,0xA0,0x28,0xA0,0x28,0xA0,0x38,0xA0,0x29,0x20,0x29,0x20,0x2A,0x20,0x5C,0x40,0x00,0x00,}}, +{ 0x808C, {0x00,0x00,0x73,0x80,0x52,0x80,0x72,0x80,0x52,0x80,0x52,0x80,0x72,0x80,0x52,0x80,0x52,0x80,0x54,0xA0,0x54,0xA0,0xB8,0x60,0x00,0x00,}}, +{ 0x8093, {0x04,0x00,0x7F,0xE0,0x40,0x00,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x60,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8096, {0x04,0x00,0x44,0x40,0x24,0x80,0x04,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8098, {0x00,0x80,0x70,0x80,0x50,0x80,0x5F,0xE0,0x70,0x80,0x54,0x80,0x52,0x80,0x72,0x80,0x50,0x80,0x50,0x80,0x50,0x80,0xB0,0x80,0x00,0x00,}}, +{ 0x809A, {0x01,0x00,0x71,0x00,0x51,0x00,0x51,0x00,0x7F,0xC0,0x51,0x00,0x51,0x00,0x71,0x00,0x51,0x00,0x51,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x809B, {0x00,0x00,0x7F,0xC0,0x51,0x00,0x51,0x00,0x71,0x00,0x51,0x00,0x51,0x00,0x71,0x00,0x51,0x00,0x51,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x809D, {0x00,0x00,0x7F,0xC0,0x51,0x00,0x51,0x00,0x71,0x00,0x5F,0xE0,0x51,0x00,0x71,0x00,0x51,0x00,0x51,0x00,0x51,0x00,0xB1,0x00,0x00,0x00,}}, +{ 0x80A1, {0x00,0x00,0x73,0x80,0x52,0x80,0x72,0xA0,0x54,0xA0,0x58,0x60,0x77,0xC0,0x52,0x40,0x51,0x80,0x51,0x00,0x56,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x80A2, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x71,0x00,0x51,0x00,0x5F,0xC0,0x74,0x40,0x52,0x80,0x53,0x00,0x51,0x00,0x56,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x80A5, {0x00,0x00,0x77,0xC0,0x55,0x40,0x55,0x40,0x75,0x40,0x57,0xC0,0x54,0x40,0x74,0x00,0x54,0x00,0x54,0x20,0x54,0x20,0xB3,0xE0,0x00,0x00,}}, +{ 0x80A9, {0x00,0x00,0x3F,0xE0,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x00,0x1F,0xC0,0x28,0x40,0x2F,0xC0,0x4F,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0x80AA, {0x01,0x00,0x71,0x00,0x51,0x00,0x5F,0xE0,0x71,0x00,0x51,0xC0,0x51,0x40,0x72,0x40,0x52,0x40,0x54,0x40,0x58,0x40,0xB0,0x80,0x00,0x00,}}, +{ 0x80AC, {0x01,0x80,0x71,0x40,0x5F,0xE0,0x5F,0xE0,0x71,0x00,0x51,0x00,0x51,0x80,0x73,0x80,0x53,0x80,0x55,0xA0,0x59,0xA0,0xB0,0xE0,0x00,0x00,}}, +{ 0x80AD, {0x03,0x80,0x38,0x80,0x2B,0xE0,0x2B,0xE0,0x3A,0xA0,0x2A,0xA0,0x2A,0xE0,0x3B,0x60,0x2A,0x20,0x2A,0x20,0x2A,0x20,0x5A,0x60,0x00,0x00,}}, +{ 0x80AF, {0x04,0x00,0x27,0x80,0x24,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x80B1, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x51,0x00,0x71,0x00,0x52,0x00,0x52,0x80,0x72,0x80,0x55,0x00,0x59,0x40,0x57,0xA0,0xB0,0x20,0x00,0x00,}}, +{ 0x80B2, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x19,0x80,0x7E,0x40,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x80B4, {0x09,0x00,0x06,0x00,0x3D,0x80,0xFF,0xE0,0x08,0x00,0x1F,0x80,0x30,0x80,0x5F,0x80,0x90,0x80,0x1F,0x80,0x10,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x80BA, {0x01,0x00,0x71,0x00,0x51,0x00,0x7F,0xE0,0x51,0x00,0x57,0xE0,0x75,0x20,0x55,0x20,0x55,0x20,0x55,0x60,0x51,0x00,0xB1,0x00,0x00,0x00,}}, +{ 0x80C3, {0x00,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x80C4, {0x04,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0x7F,0x80,0x60,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x80C6, {0x00,0x00,0x77,0x80,0x54,0x80,0x74,0x80,0x57,0x80,0x54,0x80,0x74,0x80,0x54,0x80,0x57,0x80,0x50,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x80CC, {0x12,0x00,0x12,0x40,0xF3,0x80,0x32,0x20,0xD3,0xE0,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x80CE, {0x01,0x00,0x71,0x00,0x51,0x00,0x72,0x40,0x52,0xE0,0x5F,0x20,0x70,0x00,0x57,0xC0,0x54,0x40,0x54,0x40,0x57,0xC0,0xB4,0x40,0x00,0x00,}}, +{ 0x80D6, {0x01,0x00,0x71,0x00,0x55,0x40,0x59,0x20,0x7F,0xC0,0x51,0x00,0x51,0x00,0x7F,0xE0,0x51,0x00,0x51,0x00,0x51,0x00,0xB1,0x00,0x00,0x00,}}, +{ 0x80D9, {0x02,0x00,0x72,0x00,0x53,0xE0,0x57,0xE0,0x79,0x00,0x51,0xE0,0x51,0x00,0x71,0x00,0x51,0xE0,0x51,0x00,0x51,0x00,0xB1,0x00,0x00,0x00,}}, +{ 0x80DA, {0x00,0x00,0x7F,0xE0,0x51,0x80,0x51,0x00,0x71,0x00,0x53,0x80,0x55,0x40,0x79,0x20,0x51,0x20,0x51,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x80DB, {0x00,0x00,0x3B,0xE0,0x2A,0xA0,0x2B,0xE0,0x3B,0xA0,0x2A,0xA0,0x2B,0xE0,0x3A,0xA0,0x28,0x80,0x28,0x80,0x28,0x80,0x58,0x80,0x00,0x00,}}, +{ 0x80DD, {0x00,0x40,0x71,0x80,0x57,0x80,0x55,0x80,0x77,0xE0,0x55,0x80,0x55,0x80,0x75,0x80,0x5E,0xA0,0x58,0x60,0x5F,0xE0,0xB0,0x20,0x00,0x00,}}, +{ 0x80DE, {0x02,0x00,0x72,0x00,0x57,0xE0,0x74,0x20,0x5B,0xA0,0x50,0xA0,0x77,0xA0,0x54,0xC0,0x54,0x00,0x54,0x20,0x54,0x20,0xB3,0xE0,0x00,0x00,}}, +{ 0x80E1, {0x10,0x00,0x11,0xE0,0x7F,0x20,0x11,0xE0,0x11,0x20,0x11,0x20,0x3D,0xE0,0x25,0x20,0x25,0x20,0x3D,0x20,0x26,0x20,0x04,0x60,0x00,0x00,}}, +{ 0x80E4, {0x44,0x80,0x45,0x80,0x7A,0x80,0x46,0x80,0x7F,0x80,0x40,0x80,0x5E,0x80,0x52,0x80,0x5E,0x80,0x5E,0xA0,0x52,0xA0,0x92,0x60,0x00,0x00,}}, +{ 0x80E5, {0x00,0x00,0xFF,0xC0,0x27,0xC0,0x3F,0xC0,0xC7,0xE0,0x00,0x00,0x7F,0x80,0x60,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x80EF, {0x01,0x00,0x73,0x00,0x5F,0xE0,0x54,0x80,0x7B,0xC0,0x50,0x20,0x5F,0xC0,0x71,0x00,0x53,0xC0,0x50,0x40,0x50,0x40,0xB0,0x80,0x00,0x00,}}, +{ 0x80F1, {0x01,0x00,0x71,0x40,0x59,0x40,0x55,0x80,0x71,0x00,0x5F,0xE0,0x53,0x80,0x73,0x80,0x57,0x80,0x55,0xA0,0x59,0xA0,0xB0,0xE0,0x00,0x00,}}, +{ 0x80F4, {0x00,0x00,0x77,0xE0,0x54,0x20,0x77,0xE0,0x54,0x20,0x55,0xA0,0x75,0xA0,0x55,0xA0,0x55,0xA0,0x55,0xA0,0x54,0x20,0xB4,0x60,0x00,0x00,}}, +{ 0x80F8, {0x02,0x00,0x72,0x00,0x57,0xE0,0x54,0x20,0x79,0x20,0x57,0x20,0x55,0xA0,0x76,0xA0,0x54,0xA0,0x57,0xA0,0x50,0x20,0xB0,0xC0,0x00,0x00,}}, +{ 0x80FC, {0x04,0x40,0x72,0x40,0x5F,0xE0,0x5F,0xE0,0x72,0x80,0x52,0x80,0x5F,0xE0,0x72,0x80,0x52,0x80,0x54,0x80,0x54,0x80,0xB8,0x80,0x00,0x00,}}, +{ 0x80FD, {0x21,0x00,0x31,0x00,0x49,0x60,0xFD,0x80,0x05,0x20,0x79,0xE0,0x49,0x00,0x79,0x60,0x49,0x80,0x79,0x20,0x49,0x20,0x59,0xE0,0x00,0x00,}}, +{ 0x8102, {0x04,0x00,0x74,0xC0,0x57,0x00,0x54,0x20,0x73,0xE0,0x50,0x00,0x53,0xC0,0x72,0x40,0x53,0xC0,0x52,0x40,0x53,0xC0,0xB2,0x40,0x00,0x00,}}, +{ 0x8105, {0x04,0x00,0x1F,0x80,0x08,0x80,0x7F,0xE0,0x14,0xA0,0x2D,0x60,0x5F,0xC0,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x10,0xC0,0x00,0x00,}}, +{ 0x8106, {0x01,0x00,0x77,0xC0,0x52,0x80,0x5F,0xE0,0x74,0x00,0x55,0xC0,0x55,0x40,0x75,0x40,0x55,0x80,0x55,0x20,0x59,0x20,0xB1,0xE0,0x00,0x00,}}, +{ 0x8107, {0x01,0x00,0x71,0x00,0x57,0xC0,0x71,0x40,0x52,0x40,0x54,0x80,0x74,0x80,0x5F,0xE0,0x55,0xA0,0x55,0xA0,0x59,0xA0,0xB3,0x60,0x00,0x00,}}, +{ 0x8108, {0x00,0xC0,0x77,0x00,0x54,0x20,0x75,0xC0,0x55,0x20,0x55,0xA0,0x75,0xC0,0x55,0x80,0x55,0x40,0x59,0x40,0x59,0x20,0xB1,0x00,0x00,0x00,}}, +{ 0x8109, {0x01,0x00,0x71,0x80,0x57,0x00,0x57,0x40,0x7F,0x40,0x53,0x80,0x53,0x80,0x75,0x80,0x5D,0x40,0x59,0x20,0x51,0x00,0xB3,0x00,0x00,0x00,}}, +{ 0x810A, {0x04,0x00,0x64,0xC0,0x04,0x00,0x6B,0xC0,0x11,0x00,0x3F,0x80,0xE0,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x811A, {0x02,0x00,0x72,0xE0,0x5F,0xA0,0x52,0xA0,0x72,0xA0,0x5F,0xA0,0x52,0xA0,0x72,0xA0,0x55,0xA0,0x5F,0xE0,0x58,0x80,0x90,0x80,0x00,0x00,}}, +{ 0x811B, {0x00,0x00,0x7F,0xE0,0x53,0xC0,0x57,0xC0,0x75,0x80,0x53,0xC0,0x50,0x00,0x77,0xC0,0x51,0x00,0x51,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x8123, {0x00,0x00,0x7F,0xE0,0x7F,0x80,0x7F,0xE0,0x72,0xC0,0x7D,0x80,0x70,0xE0,0xFF,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8129, {0x22,0x00,0x22,0x00,0x37,0xE0,0x7F,0x80,0x73,0x80,0xFC,0x60,0x73,0xC0,0x72,0x40,0x73,0xC0,0x73,0xC0,0x72,0x40,0x62,0xC0,0x00,0x00,}}, +{ 0x812F, {0x01,0x80,0x73,0x40,0x5F,0xE0,0x57,0xC0,0x77,0x40,0x55,0x40,0x57,0xC0,0x75,0x40,0x57,0xC0,0x57,0xC0,0x55,0x40,0xB5,0xC0,0x00,0x00,}}, +{ 0x8131, {0x04,0x40,0x72,0x80,0x57,0xC0,0x54,0x40,0x74,0x40,0x57,0xC0,0x55,0xC0,0x71,0x80,0x52,0x80,0x52,0xA0,0x54,0xA0,0xB8,0xE0,0x00,0x00,}}, +{ 0x8133, {0x01,0x20,0x3C,0xA0,0x2A,0x20,0x38,0x40,0x2A,0x60,0x2B,0x60,0x3A,0xA0,0x2A,0xA0,0x2B,0x60,0x2A,0x20,0x2B,0xE0,0x5A,0x20,0x00,0x00,}}, +{ 0x8139, {0x00,0x00,0x73,0xC0,0x53,0x80,0x73,0x80,0x53,0x80,0x52,0x00,0x7F,0xE0,0x53,0x40,0x52,0xC0,0x52,0x80,0x53,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x813E, {0x01,0x00,0x72,0x00,0x57,0xC0,0x57,0xC0,0x77,0x40,0x55,0x40,0x57,0xC0,0x73,0x80,0x5F,0xE0,0x5F,0xE0,0x50,0x80,0xB0,0x80,0x00,0x00,}}, +{ 0x8146, {0x03,0x80,0x63,0x80,0x67,0xC0,0x6F,0xC0,0x6B,0xC0,0x6F,0xC0,0x6B,0xC0,0x7B,0xC0,0x7F,0xE0,0x62,0x80,0x64,0x40,0xE8,0x40,0x00,0x00,}}, +{ 0x814B, {0x01,0x00,0x73,0x00,0x5F,0xE0,0x53,0x80,0x75,0xC0,0x55,0x40,0x5D,0xC0,0x77,0x80,0x55,0x80,0x55,0x80,0x56,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x814E, {0x00,0x00,0x7F,0xC0,0x72,0x40,0x79,0x80,0x72,0x80,0x7C,0x60,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8150, {0x02,0x00,0x7F,0xE0,0x44,0x80,0x5F,0xE0,0x6A,0x80,0x49,0x80,0x4B,0x80,0x7F,0xC0,0xAF,0x40,0x27,0x40,0x29,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x8151, {0x01,0x80,0x61,0x80,0x6F,0xE0,0x69,0x40,0x6A,0x40,0x6B,0xE0,0x6F,0x40,0x6B,0xC0,0x6A,0x40,0x7A,0x40,0x72,0x40,0xE2,0xC0,0x00,0x00,}}, +{ 0x8153, {0x03,0x80,0x73,0x80,0x5F,0xE0,0x5F,0xE0,0x73,0x80,0x5F,0xE0,0x53,0x80,0x73,0x80,0x5F,0xE0,0x55,0x80,0x55,0x80,0xB9,0x80,0x00,0x00,}}, +{ 0x8154, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x5A,0x80,0x72,0x80,0x54,0xC0,0x58,0x00,0x7F,0xC0,0x51,0x00,0x51,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x8155, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x5C,0x00,0x77,0xC0,0x55,0x40,0x55,0x40,0x7B,0x40,0x53,0xC0,0x55,0x20,0x59,0x20,0xB0,0xE0,0x00,0x00,}}, +{ 0x815F, {0x01,0x00,0x73,0x00,0x5F,0xE0,0x5F,0xE0,0x73,0xC0,0x52,0x40,0x5F,0xA0,0x73,0x00,0x57,0xC0,0x51,0x00,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x8165, {0x00,0x00,0x77,0xC0,0x57,0xC0,0x57,0xC0,0x77,0xC0,0x53,0x80,0x53,0x80,0x77,0xE0,0x5F,0xC0,0x57,0xC0,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x8166, {0x01,0xE0,0x39,0xE0,0x2A,0xC0,0x2B,0xE0,0x39,0x80,0x2B,0xE0,0x2A,0xE0,0x3B,0xE0,0x2A,0xE0,0x2B,0x20,0x2B,0xE0,0x5A,0x20,0x00,0x00,}}, +{ 0x816B, {0x00,0x20,0x77,0xC0,0x5F,0xF0,0x50,0x80,0x77,0xE0,0x54,0xA0,0x57,0xE0,0x74,0xA0,0x57,0xE0,0x57,0xE0,0x50,0x80,0x9F,0xF0,0x00,0x00,}}, +{ 0x816E, {0x00,0x00,0x77,0xC0,0x55,0x40,0x57,0xC0,0x77,0x40,0x55,0x40,0x57,0xC0,0x73,0x00,0x57,0xE0,0x5E,0x20,0x52,0x80,0xB1,0x80,0x00,0x00,}}, +{ 0x8170, {0x00,0x00,0x7F,0xF0,0x51,0x40,0x57,0xE0,0x75,0x60,0x57,0xE0,0x50,0x80,0x7F,0xF0,0x51,0x40,0x53,0x80,0x51,0x40,0x96,0x20,0x00,0x00,}}, +{ 0x8171, {0x01,0x80,0x71,0x80,0x7F,0xC0,0x6F,0xE0,0x69,0xC0,0x7F,0xC0,0x65,0x80,0x77,0xC0,0x7F,0xE0,0x6F,0xE0,0x73,0x80,0xE1,0xE0,0x00,0x00,}}, +{ 0x8174, {0x01,0x00,0x75,0xC0,0x59,0x40,0x5D,0x40,0x79,0x40,0x59,0x40,0x5D,0xC0,0x79,0x40,0x53,0x80,0x52,0x80,0x54,0x40,0xB8,0x20,0x00,0x00,}}, +{ 0x8178, {0x00,0x00,0x77,0x80,0x54,0x80,0x57,0x80,0x77,0x80,0x50,0x00,0x5F,0xE0,0x74,0x00,0x5F,0xC0,0x5D,0xC0,0x5B,0x40,0xB3,0x80,0x00,0x00,}}, +{ 0x8179, {0x02,0x00,0x72,0x00,0x57,0xE0,0x5B,0xC0,0x73,0xC0,0x52,0x40,0x53,0xC0,0x73,0x00,0x57,0xC0,0x59,0x80,0x53,0x80,0xBC,0x60,0x00,0x00,}}, +{ 0x817A, {0x01,0x00,0x72,0x00,0x57,0xC0,0x57,0xC0,0x74,0x40,0x57,0xC0,0x51,0x00,0x77,0x20,0x53,0xC0,0x55,0x40,0x59,0x20,0xB1,0x00,0x00,0x00,}}, +{ 0x817F, {0x00,0x00,0x79,0xC0,0x55,0x40,0x51,0xC0,0x71,0x40,0x51,0xC0,0x5D,0xA0,0x75,0xC0,0x55,0xC0,0x57,0x20,0x5A,0x00,0xB1,0xE0,0x00,0x00,}}, +{ 0x8180, {0x01,0x00,0x73,0x00,0x5F,0xE0,0x56,0x80,0x7F,0xE0,0x59,0x40,0x5F,0xE0,0x71,0x00,0x51,0xC0,0x52,0x40,0x54,0x40,0xB8,0x80,0x00,0x00,}}, +{ 0x8182, {0x22,0x00,0xFB,0xE0,0x7F,0x80,0x7B,0xC0,0x53,0xC0,0x66,0x20,0xBF,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x31,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8183, {0x00,0x00,0x77,0xC0,0x55,0xC0,0x55,0xC0,0x76,0x40,0x57,0xC0,0x50,0x00,0x77,0xC0,0x55,0xC0,0x55,0xC0,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x8188, {0x00,0x00,0x37,0xE0,0x33,0xC0,0x33,0xC0,0x33,0xC0,0x30,0x00,0x37,0xE0,0x35,0xE0,0x37,0xE0,0x35,0xA0,0x34,0xA0,0x74,0x60,0x00,0x00,}}, +{ 0x818A, {0x01,0x80,0x7F,0xE0,0x57,0xC0,0x57,0xC0,0x77,0x40,0x57,0xC0,0x55,0x40,0x75,0xC0,0x5F,0xE0,0x5F,0xE0,0x52,0x80,0xB0,0x80,0x00,0x00,}}, +{ 0x818F, {0x04,0x00,0xFF,0xE0,0x1F,0x00,0x00,0x00,0x7F,0xE0,0x5F,0x40,0x80,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8193, {0x02,0x00,0x72,0x00,0x5F,0xE0,0x5F,0x80,0x77,0x80,0x54,0x80,0x57,0x80,0x7F,0xE0,0x57,0xC0,0x5F,0xC0,0x57,0x40,0xB3,0x80,0x00,0x00,}}, +{ 0x8195, {0x00,0x00,0x37,0xE0,0x34,0xE0,0x37,0xE0,0x34,0xE0,0x37,0xE0,0x36,0xE0,0x37,0xE0,0x37,0xE0,0x37,0xE0,0x37,0xE0,0x74,0x20,0x00,0x00,}}, +{ 0x819A, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x6F,0x80,0x7F,0xC0,0x7F,0xC0,0x72,0x40,0x7F,0xC0,0x4F,0x80,0x4F,0x80,0x8F,0x80,0x09,0x80,0x00,0x00,}}, +{ 0x819C, {0x02,0x80,0x72,0x80,0x5F,0xE0,0x57,0xC0,0x74,0x40,0x57,0xC0,0x54,0x40,0x77,0xC0,0x51,0x00,0x5F,0xE0,0x54,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x819D, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x77,0x80,0x59,0x60,0x53,0x00,0x7D,0xC0,0x59,0x60,0x57,0x80,0x5F,0xC0,0x51,0x20,0xB3,0x00,0x00,0x00,}}, +{ 0x81A0, {0x00,0x00,0x7F,0xC0,0x5F,0xC0,0x5F,0xC0,0x7B,0x40,0x51,0x00,0x57,0x80,0x7B,0x60,0x57,0x00,0x56,0x40,0x53,0x80,0xBE,0x00,0x00,0x00,}}, +{ 0x81A3, {0x01,0x00,0x73,0x00,0x5F,0xE0,0x5B,0xA0,0x74,0xE0,0x5F,0xC0,0x52,0x80,0x77,0xC0,0x57,0xC0,0x57,0xC0,0x5F,0xE0,0xB0,0x00,0x00,0x00,}}, +{ 0x81A4, {0x00,0x00,0x7F,0xC0,0x5F,0xE0,0x5F,0xE0,0x7D,0xC0,0x5D,0xC0,0x50,0x00,0x77,0xC0,0x5F,0xE0,0x5F,0xE0,0x57,0xC0,0xB0,0x40,0x00,0x00,}}, +{ 0x81A8, {0x02,0x20,0x77,0x20,0x52,0x40,0x5F,0xC0,0x70,0x20,0x57,0xA0,0x54,0xC0,0x77,0x90,0x55,0x10,0x53,0xA0,0x5E,0x20,0x90,0x40,0x00,0x00,}}, +{ 0x81A9, {0x01,0xC0,0x71,0xA0,0x7F,0xE0,0x67,0x80,0x7F,0x80,0x6F,0x80,0x69,0x80,0x6F,0x80,0x6F,0x60,0x6F,0x60,0x66,0x20,0xE9,0x20,0x00,0x00,}}, +{ 0x81B0, {0x00,0xC0,0x7F,0x40,0x57,0x40,0x5F,0xE0,0x73,0x80,0x55,0x80,0x59,0x60,0x77,0xC0,0x57,0xC0,0x57,0xC0,0x57,0xC0,0xB4,0x40,0x00,0x00,}}, +{ 0x81B3, {0x04,0x40,0x72,0x80,0x5F,0xE0,0x51,0x00,0x77,0xC0,0x5F,0xE0,0x55,0x80,0x7F,0xE0,0x57,0xC0,0x54,0x40,0x57,0xC0,0xB4,0x40,0x00,0x00,}}, +{ 0x81B5, {0x02,0x80,0x72,0xC0,0x5F,0xE0,0x53,0x00,0x7F,0xE0,0x55,0x80,0x55,0x80,0x7B,0x40,0x5F,0xE0,0x5F,0xE0,0x51,0x00,0xB1,0x00,0x00,0x00,}}, +{ 0x81B8, {0x09,0x00,0x77,0xE0,0x55,0xC0,0x5B,0xC0,0x77,0xE0,0x55,0xC0,0x51,0x40,0x7D,0xC0,0x55,0xC0,0x55,0xC0,0x5B,0xC0,0xB1,0xE0,0x00,0x00,}}, +{ 0x81BA, {0x02,0x00,0x7F,0xE0,0x6B,0xE0,0x7F,0xE0,0x7B,0xC0,0x72,0x80,0x73,0xE0,0x6F,0x80,0x6F,0x80,0x4F,0x80,0x48,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x81BD, {0x01,0x00,0x73,0x80,0x5F,0xE0,0x5F,0xE0,0x76,0x60,0x55,0x80,0x57,0xE0,0x75,0x80,0x57,0xC0,0x5F,0xC0,0x5B,0xC0,0xB2,0x40,0x00,0x00,}}, +{ 0x81BE, {0x01,0x00,0x73,0x80,0x5F,0xC0,0x5F,0xE0,0x7F,0xC0,0x5B,0xC0,0x5F,0xC0,0x77,0x80,0x57,0x80,0x57,0x80,0x57,0x80,0xB4,0x80,0x00,0x00,}}, +{ 0x81BF, {0x01,0x40,0x77,0xE0,0x55,0x60,0x57,0xE0,0x75,0x60,0x57,0xF0,0x55,0xE0,0x74,0x00,0x57,0xF0,0x55,0x60,0x59,0xC0,0x96,0x30,0x00,0x00,}}, +{ 0x81C0, {0x00,0x00,0x7D,0x80,0x7E,0xE0,0x7F,0xE0,0x7B,0xC0,0x7D,0x80,0xEB,0x60,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x81C2, {0x01,0x80,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x6B,0xC0,0xF9,0x80,0x7F,0x80,0x60,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x81C6, {0x01,0x00,0x7F,0xE0,0x54,0x80,0x5F,0xE0,0x77,0xC0,0x54,0x40,0x57,0xC0,0x74,0x40,0x57,0xC0,0x57,0xA0,0x5A,0xA0,0xB1,0x80,0x00,0x00,}}, +{ 0x81C8, {0x03,0x80,0x73,0x80,0x5F,0xE0,0x57,0x80,0x77,0x80,0x54,0x80,0x57,0x80,0x73,0xC0,0x5D,0x40,0x57,0xC0,0x57,0xC0,0xB5,0x80,0x00,0x00,}}, +{ 0x81C9, {0x01,0x00,0x73,0x00,0x56,0x80,0x5F,0xC0,0x70,0x20,0x5E,0xC0,0x5B,0xC0,0x7B,0xC0,0x5E,0xC0,0x56,0xC0,0x5B,0xA0,0xB1,0x20,0x00,0x00,}}, +{ 0x81CD, {0x01,0x00,0x73,0x00,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x6F,0xC0,0x71,0x20,0x64,0x80,0x67,0x80,0x67,0x80,0x68,0x80,0xF0,0x80,0x00,0x00,}}, +{ 0x81D1, {0x00,0x00,0x6F,0xC0,0x67,0xE0,0x6F,0xE0,0x7D,0xC0,0x6D,0xC0,0x61,0x00,0x6F,0xC0,0x67,0xC0,0x6F,0xC0,0x6B,0xC0,0xEB,0xC0,0x00,0x00,}}, +{ 0x81D3, {0x02,0x40,0x7F,0xF0,0x52,0x60,0x57,0xF0,0x74,0xC0,0x57,0xE0,0x57,0xE0,0x77,0xE0,0x57,0xC0,0x57,0x70,0x5B,0xF0,0x90,0x90,0x00,0x00,}}, +{ 0x81D8, {0x09,0x40,0x7B,0x40,0x7A,0x40,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xE0,0xFB,0x20,0x00,0x00,}}, +{ 0x81D9, {0x03,0x80,0x7F,0xE0,0x63,0x80,0x67,0x80,0x7F,0xA0,0x67,0xC0,0x67,0x80,0x7F,0xE0,0x76,0x60,0x6A,0x40,0x6B,0xE0,0xF1,0xA0,0x00,0x00,}}, +{ 0x81DA, {0x01,0x00,0x63,0xC0,0x6F,0xE0,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6F,0xC0,0x6F,0xC0,0x75,0xC0,0xEF,0xE0,0x00,0x00,}}, +{ 0x81DF, {0x04,0x80,0x7F,0xE0,0x64,0xE0,0x77,0xE0,0x74,0xC0,0x7F,0xA0,0x67,0xA0,0x7F,0xC0,0x6F,0xE0,0x7F,0xE0,0x7B,0xE0,0xF1,0x20,0x00,0x00,}}, +{ 0x81E0, {0x6E,0x80,0xFF,0xC0,0x6E,0xC0,0xFF,0xE0,0xFB,0xC0,0xFF,0xA0,0x04,0x00,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x71,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x81E3, {0x00,0x00,0x7F,0xE0,0x44,0x00,0x7F,0x80,0x40,0x80,0x40,0x80,0x40,0x80,0x7F,0x80,0x44,0x00,0x44,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x81E5, {0x01,0x00,0x7F,0x00,0x51,0x00,0x7D,0x00,0x45,0x00,0x45,0x00,0x45,0x00,0x7D,0x00,0x52,0x80,0x7E,0x80,0x44,0x40,0x08,0x20,0x00,0x00,}}, +{ 0x81E7, {0x01,0x80,0x03,0x40,0x7F,0xE0,0x7F,0x40,0x77,0x40,0x7F,0x40,0x33,0xC0,0xF3,0x80,0x7E,0x80,0xFF,0xA0,0x73,0x60,0x42,0x20,0x00,0x00,}}, +{ 0x81E8, {0x02,0x00,0x7A,0x00,0x63,0xE0,0x77,0xC0,0x5A,0x40,0x52,0x40,0x53,0xC0,0x70,0x00,0x67,0xE0,0x7D,0xA0,0x47,0xE0,0x05,0xA0,0x00,0x00,}}, +{ 0x81EA, {0x02,0x00,0x04,0x00,0x08,0x00,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x00,}}, +{ 0x81ED, {0x04,0x00,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x81F3, {0x00,0x00,0xFF,0xE0,0x08,0x00,0x11,0x80,0x7F,0x40,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x81F4, {0x02,0x00,0xFE,0x00,0x23,0xE0,0x4C,0x80,0xFC,0x80,0x2A,0x80,0x21,0x00,0x79,0x00,0x21,0x00,0x3A,0x80,0xE4,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x81FA, {0x04,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x7F,0x40,0x8B,0x00,0x3F,0x80,0x1F,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x81FB, {0x01,0x00,0xF3,0x00,0x6F,0xE0,0x77,0xC0,0xF3,0x80,0x6F,0xE0,0x65,0x80,0xFB,0x40,0x6F,0xE0,0x77,0x80,0xC9,0x60,0x01,0x00,0x00,0x00,}}, +{ 0x81FC, {0x04,0x00,0x18,0x00,0x63,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x7B,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x81FE, {0x04,0x00,0x14,0x00,0x65,0xC0,0x44,0x40,0x75,0xC0,0x44,0x40,0x44,0x40,0x77,0xC0,0x06,0x40,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x8201, {0x08,0x00,0x73,0x80,0x7B,0x80,0x7B,0x80,0x60,0x80,0x7F,0x80,0x09,0x80,0x0B,0x00,0xFF,0xE0,0x19,0x00,0x31,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x8202, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x69,0x80,0xF3,0xE0,0x3B,0x80,0x3B,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8205, {0x04,0x00,0x39,0xE0,0x3D,0xE0,0x3F,0xE0,0x3F,0xE0,0x32,0x40,0x3F,0xC0,0x32,0x40,0x7F,0xE0,0x7F,0xE0,0x18,0x20,0x70,0xC0,0x00,0x00,}}, +{ 0x8207, {0x28,0x00,0x48,0xC0,0x4E,0x40,0x6E,0xC0,0x42,0x40,0x6A,0xC0,0x4A,0x40,0xCA,0x40,0xFF,0xE0,0x11,0x00,0x30,0xC0,0xC0,0x20,0x00,0x00,}}, +{ 0x8208, {0x20,0x00,0x5F,0xC0,0x5F,0x40,0x71,0xC0,0x5F,0x40,0x7B,0xC0,0x5F,0x40,0x51,0x40,0xFF,0xE0,0x11,0x00,0x20,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x8209, {0x18,0x00,0x6E,0x80,0x6C,0x80,0x6E,0x80,0x6A,0x80,0x6A,0x80,0xFF,0xE0,0x35,0x80,0xDE,0x60,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x820A, {0x11,0x00,0xFF,0xE0,0x3F,0xC0,0xFF,0xC0,0x7F,0x00,0x7F,0x80,0x3F,0xC0,0x08,0x00,0x7B,0x80,0x7B,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x820C, {0x00,0x80,0x03,0x00,0x3C,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x820D, {0x04,0x00,0x0A,0x00,0x31,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x7F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x820E, {0x04,0x00,0x0A,0x00,0x31,0x80,0xC4,0x60,0x1F,0x00,0x04,0x00,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8210, {0x08,0x40,0x10,0x80,0x63,0x80,0x23,0x80,0xFF,0x80,0x23,0xE0,0x23,0x80,0x7A,0x80,0x4A,0x80,0x4A,0xE0,0x7B,0x60,0x4C,0x20,0x00,0x00,}}, +{ 0x8212, {0x20,0x00,0x37,0xC0,0x59,0x80,0x48,0x80,0xFF,0xE0,0x20,0xA0,0xF8,0xC0,0x20,0x80,0x78,0x80,0x48,0x80,0x78,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x8216, {0x21,0x80,0x33,0x40,0x7F,0xE0,0x7F,0xC0,0xB7,0x40,0x25,0x40,0xFF,0xC0,0x35,0x40,0x77,0xC0,0x57,0xC0,0x75,0x40,0x55,0xC0,0x00,0x00,}}, +{ 0x8217, {0x21,0x80,0x31,0x40,0x7F,0xE0,0x61,0x00,0xFF,0xC0,0x25,0x40,0xFF,0xC0,0x05,0x40,0x77,0xC0,0x55,0x40,0x75,0x40,0x55,0xC0,0x00,0x00,}}, +{ 0x8218, {0x21,0x00,0x31,0x00,0x7F,0xE0,0x4C,0x40,0xFB,0x80,0x22,0x80,0xFB,0x80,0x32,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x00,0x00,}}, +{ 0x821B, {0x20,0x80,0x20,0x80,0x38,0x80,0x2B,0xE0,0x4A,0x80,0x4A,0x80,0xAA,0x80,0x17,0xE0,0x10,0x80,0x10,0x80,0x20,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x821C, {0x01,0x80,0x06,0x80,0x78,0x80,0x25,0x00,0x7F,0xE0,0x50,0x40,0xBF,0xC0,0x2A,0x80,0x5A,0x80,0x17,0xE0,0x20,0x80,0xC0,0x80,0x00,0x00,}}, +{ 0x821E, {0x20,0x00,0x20,0x00,0x7F,0xC0,0xAA,0x80,0x7F,0xE0,0x2A,0x80,0x7F,0xC0,0x3F,0xC0,0x6A,0x80,0x9F,0xE0,0x30,0x80,0xC0,0x80,0x00,0x00,}}, +{ 0x821F, {0x04,0x00,0x08,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x20,0x80,0xFF,0xE0,0x24,0x80,0x24,0x80,0x24,0x80,0x44,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x8229, {0x11,0x80,0x30,0x80,0x79,0x80,0x6A,0x40,0x7A,0x40,0x7C,0x20,0x7D,0x80,0xE9,0x80,0x69,0x40,0x6A,0x40,0x4F,0xA0,0x98,0x20,0x00,0x00,}}, +{ 0x822A, {0x11,0x00,0x21,0x00,0x7F,0xE0,0x68,0x00,0x59,0x80,0x59,0x80,0xFD,0x80,0x69,0x80,0x6A,0x80,0x6A,0xA0,0x4C,0xA0,0x98,0x60,0x00,0x00,}}, +{ 0x822B, {0x11,0x80,0x31,0x80,0x7F,0xE0,0x6F,0xE0,0x79,0x00,0x79,0xC0,0x7D,0x40,0xE9,0x40,0x6A,0x40,0x6A,0x40,0x4C,0x40,0x98,0x80,0x00,0x00,}}, +{ 0x822C, {0x10,0x00,0x23,0x80,0x7A,0x80,0x6A,0xA0,0x5A,0xA0,0x5C,0x60,0xFF,0xC0,0x6A,0x40,0x6A,0x80,0x69,0x80,0x49,0x80,0x9E,0x60,0x00,0x00,}}, +{ 0x822E, {0x10,0x00,0x37,0xE0,0x7B,0xC0,0x6B,0xC0,0x7A,0x40,0x7A,0x40,0x7F,0xC0,0xEA,0x40,0x6A,0x00,0x6A,0x00,0x4C,0x00,0x9C,0x00,0x00,0x00,}}, +{ 0x8233, {0x08,0xC0,0x18,0xC0,0x3C,0xC0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x3F,0xE0,0x75,0xE0,0x35,0xE0,0x35,0xE0,0x25,0xE0,0x4D,0x20,0x00,0x00,}}, +{ 0x8235, {0x10,0x80,0x20,0x80,0x7B,0xE0,0x6E,0x00,0x59,0x00,0x59,0x40,0xFD,0x80,0x49,0x00,0x69,0x00,0x69,0x20,0x49,0x20,0x99,0xE0,0x00,0x00,}}, +{ 0x8236, {0x08,0x40,0x10,0x80,0x3D,0xE0,0x35,0x20,0x2D,0x20,0x2D,0x20,0x7F,0xE0,0x35,0x20,0x35,0x20,0x35,0x20,0x25,0xE0,0x4D,0x20,0x00,0x00,}}, +{ 0x8237, {0x10,0x80,0x20,0x80,0x7F,0xE0,0x68,0x80,0x79,0x00,0x5F,0x40,0xFD,0x80,0x68,0x80,0x68,0xC0,0x69,0x40,0x4F,0xE0,0x98,0x20,0x00,0x00,}}, +{ 0x8238, {0x10,0x00,0x37,0xE0,0x78,0x40,0x6B,0x40,0x7B,0xC0,0x7B,0xC0,0x7F,0xC0,0xEB,0xC0,0x6A,0x40,0x68,0x40,0x48,0x40,0x98,0xC0,0x00,0x00,}}, +{ 0x8239, {0x11,0x80,0x20,0x80,0x7A,0x80,0x6A,0x40,0x5A,0x40,0x5C,0x20,0x7B,0xC0,0xCA,0x40,0x6A,0x40,0x6A,0x40,0x4B,0xC0,0x9A,0x40,0x00,0x00,}}, +{ 0x8240, {0x10,0x60,0x37,0xC0,0x7B,0xE0,0x6D,0xA0,0x78,0x80,0x7F,0xC0,0x78,0x80,0xE9,0x80,0x6F,0xE0,0x69,0x80,0x49,0x80,0x99,0x80,0x00,0x00,}}, +{ 0x8247, {0x20,0x00,0x4E,0x60,0x73,0x80,0x54,0x80,0x7E,0x80,0x73,0xE0,0xFA,0x80,0x5A,0x80,0x75,0xE0,0x7C,0x00,0x53,0x00,0xB0,0xE0,0x00,0x00,}}, +{ 0x8258, {0x21,0x00,0x63,0x00,0x75,0x40,0x57,0x40,0x77,0x40,0x77,0xC0,0x7D,0x40,0xD3,0x00,0x7F,0xC0,0x73,0x80,0x57,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x8259, {0x11,0x80,0x31,0x80,0x7B,0xC0,0x6F,0xE0,0x7B,0xC0,0x7B,0xC0,0x7A,0x40,0xEB,0xC0,0x6F,0xC0,0x6F,0xC0,0x4B,0xC0,0x9A,0x40,0x00,0x00,}}, +{ 0x825A, {0x23,0x80,0x6F,0xE0,0x7F,0xC0,0x5F,0xC0,0x7F,0xC0,0x7B,0xC0,0x7F,0xC0,0xD7,0x80,0x77,0x80,0x77,0x80,0x57,0x80,0xB4,0x80,0x00,0x00,}}, +{ 0x825D, {0x20,0x00,0x67,0xC0,0x7F,0xE0,0x5F,0xE0,0x77,0xC0,0x77,0xC0,0x79,0x00,0xD7,0xC0,0x7F,0xE0,0x7F,0xE0,0x57,0xC0,0xB0,0x40,0x00,0x00,}}, +{ 0x825F, {0x11,0x80,0x33,0xC0,0x7F,0xE0,0x6F,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0xEB,0xC0,0x6B,0xC0,0x6B,0xC0,0x4F,0xE0,0x98,0x00,0x00,0x00,}}, +{ 0x8262, {0x21,0x00,0x63,0x00,0x7F,0xE0,0x55,0x80,0x7B,0xC0,0x7F,0xE0,0x70,0x00,0xDF,0xC0,0x7B,0xC0,0x7B,0xC0,0x5F,0xC0,0xB8,0x40,0x00,0x00,}}, +{ 0x8264, {0x24,0x80,0x63,0x80,0x7F,0xC0,0x57,0x80,0x73,0x00,0x7F,0xE0,0x71,0xC0,0xD7,0xA0,0x7F,0xE0,0x7F,0xE0,0x53,0xE0,0xB6,0x20,0x00,0x00,}}, +{ 0x8266, {0x20,0x80,0x67,0x80,0x77,0xE0,0x57,0x80,0x77,0x00,0x75,0xE0,0xFF,0x00,0x50,0x00,0x77,0xC0,0x75,0xC0,0x55,0xC0,0xBF,0xE0,0x00,0x00,}}, +{ 0x8268, {0x22,0x80,0x6F,0xE0,0x7F,0xE0,0x5F,0xE0,0x70,0x00,0x7F,0xE0,0x71,0x40,0xDF,0xC0,0x7F,0x80,0x7F,0xC0,0x5D,0xA0,0xB3,0x00,0x00,0x00,}}, +{ 0x826A, {0x21,0x00,0x63,0x80,0x7F,0xC0,0x57,0xC0,0x77,0xC0,0x77,0xC0,0x77,0xC0,0xDB,0xE0,0x77,0xC0,0x77,0xC0,0x57,0xC0,0xB4,0x40,0x00,0x00,}}, +{ 0x826B, {0x21,0x00,0x63,0xC0,0x77,0xE0,0x57,0xC0,0x77,0xC0,0x77,0xC0,0x77,0xC0,0xD7,0xC0,0x77,0xC0,0x7F,0xC0,0x5B,0xC0,0xB7,0xE0,0x00,0x00,}}, +{ 0x826E, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x20,0x80,0x3F,0xC0,0x24,0x40,0x22,0x80,0x2B,0x00,0x31,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x826F, {0x04,0x00,0x04,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0x28,0x80,0x25,0x00,0x22,0x00,0x39,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x8271, {0x70,0x00,0xFF,0xC0,0x72,0x40,0x7B,0xC0,0x7A,0x40,0x7B,0xC0,0x23,0xA0,0x7B,0xA0,0xFA,0xC0,0xFA,0x80,0x4B,0xC0,0x86,0x20,0x00,0x00,}}, +{ 0x8272, {0x10,0x00,0x1F,0x00,0x22,0x00,0xFF,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x00,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x8276, {0x51,0x00,0xF9,0xC0,0xDA,0x40,0xF8,0x80,0xFF,0xC0,0x02,0xC0,0xFE,0xC0,0x4B,0xC0,0x7A,0x40,0x52,0x20,0x7A,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x8277, {0xED,0x00,0xFF,0xC0,0xFE,0x80,0xFF,0xC0,0xFF,0xC0,0xFF,0xC0,0x03,0xC0,0xFF,0xC0,0x7A,0x40,0x7A,0x20,0x7A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x8278, {0x21,0x80,0x21,0x80,0x21,0x80,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x2B,0xC0,0x21,0x80,0x21,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x827E, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x01,0x00,0x21,0x80,0x21,0x80,0x11,0x00,0x13,0x00,0x0E,0x00,0x0E,0x00,0x31,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x828B, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x828D, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x20,0x00,0x3F,0xC0,0x40,0x40,0xC8,0x40,0x84,0x40,0x00,0x40,0x00,0xC0,0x01,0x80,0x00,0x00,}}, +{ 0x8292, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0xFF,0xE0,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x8299, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x829D, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0x7F,0xC0,0x00,0x80,0x01,0x00,0x06,0x00,0x78,0x00,0x50,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x829F, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x1F,0x00,0x13,0x40,0x11,0x40,0x21,0xC0,0x7F,0x00,0x1A,0x00,0x0E,0x00,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x82A5, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x0A,0x00,0x11,0x00,0x31,0x80,0xD1,0x60,0x11,0x00,0x21,0x00,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x82A6, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x40,0x00,0x80,0x00,0x00,0x00,}}, +{ 0x82AB, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x82AC, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x1F,0x00,0x13,0x00,0x21,0x00,0x60,0x80,0xFF,0xE0,0x09,0x80,0x19,0x80,0x31,0x80,0x63,0x00,0x00,0x00,}}, +{ 0x82AD, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x00,0x20,0x20,0x20,0x20,0x3F,0xE0,0x00,0x00,}}, +{ 0x82AF, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x00,0x00,0x04,0x00,0x12,0x80,0x51,0x40,0x50,0x20,0x90,0x00,0x10,0x80,0x0F,0x80,0x00,0x00,}}, +{ 0x82B1, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x12,0x00,0x22,0x40,0x22,0x80,0x63,0x00,0xA2,0x00,0x22,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x82B3, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x07,0x80,0x08,0x80,0x08,0x80,0x30,0x80,0xC1,0x80,0x00,0x00,}}, +{ 0x82B8, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x09,0x00,0x13,0x80,0x7C,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x82B9, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x80,0x3F,0x00,0x20,0x00,0x3F,0xE0,0x21,0x00,0x21,0x00,0x41,0x00,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x82BB, {0x10,0x00,0x1F,0xE0,0x74,0xA0,0x7F,0xA0,0x35,0xA0,0x18,0xC0,0x30,0x00,0x1F,0xE0,0x74,0xA0,0x7F,0xA0,0x09,0xA0,0x30,0xC0,0x00,0x00,}}, +{ 0x82BD, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x21,0x00,0xFF,0xE0,0x03,0x00,0x0D,0x00,0x39,0x00,0xC1,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x82C5, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x08,0x40,0x49,0x40,0x29,0x40,0x31,0x40,0x11,0x40,0x29,0x40,0x48,0x40,0x80,0xC0,0x00,0x00,}}, +{ 0x82D1, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x23,0xC0,0x3A,0x40,0x4A,0x40,0x4A,0x40,0xB2,0x80,0x12,0x20,0x22,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x82D2, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0xFF,0xE0,0xFF,0xE0,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x82D3, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x0E,0x00,0x11,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x80,0x04,0x80,0x05,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x82D4, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x04,0x00,0x09,0x00,0x11,0x80,0xFE,0x40,0x00,0x20,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x82D7, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x82D9, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0x7F,0xC0,0x01,0x80,0x31,0x00,0x11,0x00,0x12,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x82DB, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x00,0x80,0x3C,0x80,0x24,0x80,0x3C,0x80,0x24,0x80,0x00,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x82DC, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x3F,0x80,0x60,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x82DE, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x3F,0xC0,0x20,0x40,0x7E,0x40,0xB2,0x40,0x3E,0xC0,0x20,0xA0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x82DF, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x3F,0xC0,0x20,0x40,0x7E,0x40,0xA2,0x40,0x3E,0x40,0x3E,0x40,0x00,0x40,0x00,0x80,0x00,0x00,}}, +{ 0x82E1, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x00,0x80,0x68,0x80,0x64,0x80,0x64,0x80,0x60,0x80,0x79,0xC0,0x73,0x20,0xCC,0x20,0x00,0x00,}}, +{ 0x82E3, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x3F,0xC0,0x60,0x00,0x7F,0x80,0x60,0x80,0x60,0x80,0x7F,0x80,0x60,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x82E5, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x1F,0x80,0x70,0x80,0x90,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x82E6, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x82E7, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xE0,0x40,0x40,0x80,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x82EB, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x82F1, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0xFF,0xE0,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x82F3, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0F,0x00,0x33,0x00,0x6A,0x00,0x0E,0x00,0x39,0x80,0xC4,0x60,0x00,0x00,0x06,0x00,0x18,0x00,0x00,0x00,}}, +{ 0x82F4, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x1F,0x00,0x31,0x80,0x21,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x21,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x82F9, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7F,0xC0,0x35,0x80,0x24,0x80,0x44,0x40,0xC4,0x40,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x82FA, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x1F,0x00,0x39,0x80,0x25,0x80,0xFF,0xE0,0x69,0x80,0x65,0x80,0x7F,0xC0,0x43,0x00,0x06,0x00,0x00,0x00,}}, +{ 0x82FB, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x20,0x80,0x3F,0xE0,0x60,0x80,0xE4,0x80,0xE2,0x80,0x60,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8302, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x04,0x40,0x3F,0xE0,0x24,0x00,0x22,0x80,0x22,0x80,0x41,0x00,0x46,0xA0,0x98,0x60,0x00,0x00,}}, +{ 0x8303, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x00,0x00,0x27,0xC0,0xA4,0x40,0x44,0x40,0x44,0x40,0x24,0x80,0x64,0x20,0x44,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x8304, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x20,0x00,0xFB,0xC0,0x2A,0x40,0x2A,0x40,0x2A,0x40,0x4A,0x40,0x4B,0xC0,0xB2,0x40,0x00,0x00,}}, +{ 0x8305, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x13,0x00,0x0C,0x00,0xFF,0xE0,0x04,0xC0,0x0D,0x00,0x34,0x00,0xC4,0x00,0x0C,0x00,0x00,0x00,}}, +{ 0x8306, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x18,0x00,0x73,0xC0,0x52,0x40,0x52,0x40,0x52,0x40,0x72,0x40,0xF3,0xC0,0x32,0x00,0x22,0x00,0x00,0x00,}}, +{ 0x8309, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x15,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x830E, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x13,0x00,0x0E,0x00,0x35,0x80,0xE4,0xE0,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8316, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x0F,0x00,0x71,0x00,0x0E,0x00,0x1B,0x80,0xFF,0xE0,0x21,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8317, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x0F,0x80,0x39,0x80,0x45,0x00,0x06,0x00,0xFF,0xC0,0xD0,0x40,0x1F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x8318, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x3F,0x80,0x04,0x80,0x18,0x80,0x21,0x00,0x00,0x00,0xFF,0xC0,0x69,0x40,0x4A,0x40,0xB4,0x80,0x00,0x00,}}, +{ 0x831C, {0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x12,0x00,0x7F,0xC0,0x52,0x40,0x52,0xC0,0x61,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x8323, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0F,0x80,0x68,0x80,0x6F,0x80,0x60,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x8328, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0x44,0x00,0x27,0xE0,0x25,0x40,0x09,0x80,0x23,0x00,0xC4,0x80,0x18,0x40,0x20,0x20,0x00,0x00,}}, +{ 0x832B, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x01,0x00,0x21,0x00,0xAF,0xE0,0x48,0x00,0x48,0x00,0x28,0x00,0x68,0x00,0x47,0xC0,0x40,0x00,0x00,0x00,}}, +{ 0x832F, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x21,0x40,0x21,0x00,0x7F,0xE0,0xE1,0x00,0xE3,0x80,0x62,0x80,0x6C,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x8331, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x14,0x00,0x24,0x00,0x3F,0x80,0x44,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x8332, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x21,0x80,0x6B,0x40,0x29,0x40,0x30,0x80,0x10,0x80,0x39,0xC0,0xFF,0xE0,0x04,0x20,0x00,0x00,}}, +{ 0x8334, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x4E,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x8335, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x44,0x40,0x7F,0x40,0x44,0x40,0x4A,0x40,0x51,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x8336, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x11,0x00,0x24,0x80,0xC4,0x60,0x3F,0x80,0x04,0x00,0x35,0x80,0xC4,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x8338, {0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0xC0,0xFF,0x80,0x00,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x8339, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x23,0xC0,0xFA,0x40,0x6A,0x40,0x6A,0x40,0x7A,0x40,0x1B,0xC0,0x3A,0x40,0xC0,0x00,0x00,0x00,}}, +{ 0x8340, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x3F,0xC0,0x20,0x40,0x7E,0x40,0xB2,0x40,0x3E,0x40,0x3E,0x40,0x32,0x40,0x00,0x80,0x00,0x00,}}, +{ 0x8345, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0E,0x00,0x13,0x00,0x21,0x80,0xFF,0x60,0x00,0x00,0x7F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8349, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x834A, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x7D,0x40,0x29,0x40,0x29,0x40,0xFF,0x40,0x29,0x40,0x29,0x40,0x48,0x40,0x88,0xC0,0x00,0x00,}}, +{ 0x834F, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x40,0x2F,0x80,0x21,0x00,0x61,0x00,0xBF,0xE0,0x21,0x00,0x21,0x00,0x2F,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x8350, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x3F,0x80,0x21,0x00,0xFF,0xE0,0xBF,0xE0,0x21,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x8352, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x15,0x00,0xFF,0xE0,0x20,0x00,0x1F,0x80,0x00,0x00,0x25,0x00,0x25,0x20,0x25,0x20,0xC0,0xE0,0x00,0x00,}}, +{ 0x8358, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0xA1,0x00,0x61,0x00,0x7F,0xE0,0x21,0x00,0x61,0x00,0xA1,0x00,0x2F,0xC0,0x20,0x00,0x00,0x00,}}, +{ 0x8373, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7F,0xC0,0x00,0x00,0x3F,0x00,0x21,0x80,0x31,0x80,0x1F,0x00,0x0A,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8375, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7F,0x80,0x08,0x80,0x38,0x80,0x16,0x80,0x61,0x00,0xC4,0x00,0x52,0x20,0x90,0x20,0x0F,0x80,0x00,0x00,}}, +{ 0x8377, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x2F,0xE0,0x20,0x80,0x6F,0x80,0xA9,0x80,0x2F,0x80,0x28,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x837B, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x51,0x40,0x23,0x40,0x65,0x80,0xD5,0x00,0x35,0x00,0xD2,0x80,0x14,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x837C, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0E,0x00,0x13,0x00,0x3F,0x80,0xC4,0x60,0x3F,0x80,0x04,0x00,0x35,0x80,0xC4,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x8385, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x12,0x00,0x22,0x00,0x3F,0xC0,0x60,0x80,0xE8,0x80,0xE5,0x80,0x65,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8387, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x71,0x00,0x51,0x00,0x57,0xC0,0x71,0x40,0x51,0x40,0x72,0x40,0x5A,0x40,0x74,0x40,0xC8,0x80,0x00,0x00,}}, +{ 0x8389, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x18,0x40,0x71,0x40,0x21,0x40,0xFD,0x40,0x71,0x40,0x69,0x40,0xA1,0x40,0x20,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x838A, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x71,0x00,0x5F,0xE0,0x11,0x00,0xF1,0x00,0x71,0x00,0x5F,0xC0,0x90,0x00,0x00,0x00,}}, +{ 0x838E, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x01,0x00,0x25,0x80,0xA5,0x40,0x49,0x20,0x4B,0x60,0x33,0x80,0x61,0x00,0x46,0x00,0x58,0x00,0x00,0x00,}}, +{ 0x8393, {0x11,0x00,0xFF,0xE0,0x10,0x00,0x7F,0xE0,0x40,0x00,0xBF,0x00,0x25,0x80,0x33,0x80,0xFF,0xE0,0x65,0x80,0x7F,0xC0,0x03,0x00,0x00,0x00,}}, +{ 0x8396, {0x11,0x00,0x13,0x00,0xFF,0xE0,0xFF,0xE0,0x32,0x40,0x24,0x80,0x6C,0x80,0x32,0x40,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x839A, {0x11,0x00,0x13,0x00,0xFF,0xE0,0xF0,0x40,0x2F,0x80,0x21,0x00,0x69,0x00,0x29,0xC0,0xE9,0x00,0x67,0xC0,0x70,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x839E, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xE0,0x40,0x40,0xBF,0x00,0x00,0x00,0x7F,0xE0,0x1A,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x839F, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0E,0x00,0x13,0x00,0x3F,0x80,0xC0,0x60,0x3F,0x00,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x83A0, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x15,0x00,0x75,0xC0,0x9F,0x60,0x09,0x80,0x30,0x80,0x63,0x80,0x00,0x00,}}, +{ 0x83A2, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x25,0x80,0x25,0x80,0x57,0x40,0x0E,0x40,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x83A8, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x60,0x80,0x7F,0x80,0x60,0xC0,0x7F,0xC0,0x66,0x80,0x7B,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x83AA, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x19,0x00,0x71,0x40,0x21,0x00,0xFF,0xE0,0x31,0x40,0xF9,0x80,0xE3,0xA0,0x2C,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x83AB, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x33,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x83B1, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x7F,0xC0,0x24,0x80,0x15,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x83B5, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x08,0x00,0x3F,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x04,0x00,0x1D,0x20,0x35,0xA0,0xC3,0xE0,0x00,0x00,}}, +{ 0x83BD, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x11,0x00,0x71,0xC0,0xFF,0xE0,0x7F,0xC0,0x31,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x83C1, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x83C5, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x7F,0xE0,0x40,0x40,0xBF,0x00,0x21,0x00,0x3F,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x83CA, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x31,0x00,0x3F,0xC0,0x49,0x40,0x6A,0x40,0x9C,0x40,0x7F,0x40,0x1E,0x40,0x69,0x40,0x09,0x80,0x00,0x00,}}, +{ 0x83CC, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x5E,0x40,0x44,0x40,0x7F,0xC0,0x4E,0x40,0x55,0x40,0x44,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x83CE, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x3F,0x80,0x60,0x80,0x7F,0x80,0x60,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0x20,0x7A,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x83D3, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x83D6, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x83D8, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x80,0x20,0x80,0xFA,0x80,0x22,0x40,0x75,0x20,0x69,0x00,0xA2,0x40,0x2F,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x83DC, {0x11,0x00,0xFF,0xE0,0x07,0x80,0x7C,0x80,0x24,0x80,0x21,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x83DF, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x1F,0x00,0x32,0x00,0xFF,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x0C,0x20,0x35,0x20,0xC3,0xE0,0x00,0x00,}}, +{ 0x83E0, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x01,0x00,0x2F,0xE0,0xA9,0x40,0x49,0x80,0x4F,0xC0,0x2A,0x40,0x69,0x80,0x53,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x83E9, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x7F,0xC0,0x20,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x83EB, {0x11,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x64,0x80,0x7F,0x80,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x83EF, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x15,0x00,0xFF,0xE0,0x15,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x83F0, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x15,0x80,0x25,0x80,0x35,0x80,0x65,0x40,0xA9,0xC0,0x2F,0xE0,0x30,0xA0,0x00,0x00,}}, +{ 0x83F1, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x7F,0x80,0xFF,0xE0,0x12,0x40,0x29,0xC0,0xCF,0x00,0x1A,0x00,0x24,0x00,0x1B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x83F2, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0A,0x00,0x0A,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0xC0,0xFF,0xE0,0xFB,0xE0,0x32,0x00,0xC2,0x00,0x00,0x00,}}, +{ 0x83F4, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x15,0x00,0x7F,0x80,0xF5,0xE0,0x3F,0x80,0x3F,0xC0,0x34,0x40,0x03,0xC0,0x00,0x00,}}, +{ 0x83F7, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0x1F,0x80,0xFF,0xE0,0x01,0x80,0x3F,0x80,0x7F,0xE0,0xFF,0xC0,0x7F,0x80,0x64,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x83FB, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x11,0x00,0x21,0x80,0xFF,0xE0,0x21,0x80,0x71,0x80,0x6B,0xC0,0xA5,0xA0,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x83FD, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x3B,0xC0,0x21,0x40,0xFD,0x40,0x31,0x80,0x79,0x80,0x69,0x80,0xA2,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x8403, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x80,0x29,0x80,0x46,0x40,0xFF,0xE0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8404, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x31,0x00,0x3F,0xC0,0x50,0x40,0xBF,0x40,0x48,0x40,0x3F,0x40,0x29,0x40,0x3F,0x40,0x21,0x80,0x00,0x00,}}, +{ 0x8407, {0x11,0x00,0xFF,0xE0,0x1F,0x80,0x3F,0x80,0x3F,0x00,0x20,0x00,0x3F,0x00,0x30,0x00,0xFF,0xE0,0x26,0x80,0x3B,0x80,0x60,0xE0,0x00,0x00,}}, +{ 0x840B, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x05,0x80,0xFF,0xE0,0x05,0x80,0x7F,0x80,0xFF,0xE0,0x1F,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x840C, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x44,0x40,0x08,0xC0,0x00,0x00,}}, +{ 0x840D, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x0F,0xC0,0x27,0xC0,0xA5,0x40,0x49,0x40,0x43,0x00,0x3F,0xE0,0x61,0x00,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x840E, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0x3E,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xC8,0x60,0x7F,0xC0,0x1A,0x00,0x0F,0x00,0x70,0x80,0x00,0x00,}}, +{ 0x8413, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7F,0xE0,0x40,0x40,0xBF,0x00,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8420, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x39,0xC0,0x69,0x40,0x69,0x40,0x79,0xC0,0x69,0x40,0x79,0xC0,0x69,0x40,0x4A,0x40,0x9C,0xC0,0x00,0x00,}}, +{ 0x8422, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x27,0xC0,0xA8,0x40,0x5F,0x40,0x43,0x40,0x2F,0xC0,0x69,0xA0,0x48,0x20,0x47,0xE0,0x00,0x00,}}, +{ 0x8429, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x70,0xA0,0x22,0xA0,0xFA,0xC0,0x32,0x80,0x6C,0x80,0xA1,0x80,0x22,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x842A, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x19,0x40,0x71,0x40,0x21,0xC0,0xFA,0x40,0x71,0x40,0x69,0xE0,0xA3,0xC0,0x20,0x40,0x20,0x40,0x00,0x00,}}, +{ 0x842C, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x25,0x80,0x3F,0x00,0x04,0x00,0x7F,0xC0,0x47,0x40,0x79,0xC0,0x40,0xC0,0x00,0x00,}}, +{ 0x8431, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x7F,0xE0,0xBF,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8435, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x27,0x80,0x25,0x80,0x7F,0xC0,0x40,0x40,0x5F,0x40,0x5F,0x40,0x53,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x8438, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x14,0x00,0x35,0x80,0x64,0x80,0x75,0x80,0x64,0x80,0x7F,0x80,0x1A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x843C, {0x11,0x00,0xFF,0xE0,0x3B,0x80,0x7B,0x80,0x7B,0x80,0x00,0x00,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x1F,0x80,0x30,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x843D, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x53,0x80,0x26,0x80,0x89,0x00,0x43,0x00,0x54,0x80,0x3F,0xE0,0x24,0x80,0x47,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x8446, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x17,0x80,0x24,0x80,0x27,0x80,0x61,0x00,0xFF,0xE0,0xE7,0x80,0x79,0x60,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x8449, {0x11,0x00,0xFF,0xE0,0x15,0x00,0xFF,0xE0,0x25,0x00,0x27,0x00,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x844E, {0x11,0x00,0xFF,0xE0,0x13,0x00,0x4F,0x80,0x7F,0xE0,0xA2,0x80,0x4F,0x80,0x42,0x00,0xDF,0xC0,0x7F,0xE0,0x42,0x00,0x42,0x00,0x00,0x00,}}, +{ 0x8457, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x3F,0xC0,0x06,0x00,0xFF,0xE0,0x08,0x00,0x1F,0x80,0x70,0x80,0x9F,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x845B, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x1F,0xC0,0x7E,0x40,0xB8,0x40,0x1F,0x40,0x01,0x80,0x00,0x00,}}, +{ 0x8461, {0x11,0x00,0xFF,0xE0,0x51,0x00,0x7F,0xC0,0x7F,0x40,0x49,0xC0,0xBF,0x40,0x29,0x40,0x3F,0x40,0x29,0x40,0x3F,0x40,0x29,0x80,0x00,0x00,}}, +{ 0x8462, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x64,0x80,0xC2,0x60,0x7F,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8463, {0x11,0x00,0xFF,0xE0,0x1E,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x7F,0xC0,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8466, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0xC0,0x21,0x00,0xFF,0xE0,0x01,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x8469, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x27,0xC0,0x75,0x40,0x55,0x40,0x57,0xC0,0x74,0x40,0x54,0x20,0x74,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x846B, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x10,0x00,0x21,0xC0,0xFD,0x40,0x21,0x40,0x31,0xC0,0x79,0xC0,0x4B,0xC0,0x7A,0x40,0x4C,0xC0,0x00,0x00,}}, +{ 0x846C, {0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x3E,0xC0,0xEB,0x80,0x32,0x20,0xD1,0xE0,0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x846D, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7B,0xC0,0x48,0x40,0x7B,0xC0,0x40,0x00,0x7B,0xC0,0x7A,0x40,0x79,0x80,0x43,0x80,0x4C,0x60,0x00,0x00,}}, +{ 0x846E, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x3B,0x80,0x62,0xA0,0x7A,0xA0,0x64,0x60,0x7F,0xC0,0x7A,0x40,0xF9,0x80,0x63,0x80,0x6C,0x60,0x00,0x00,}}, +{ 0x846F, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x02,0x00,0x72,0x00,0xD3,0xC0,0x64,0x40,0x7A,0x40,0xF9,0x40,0x78,0x40,0xA0,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x8471, {0x11,0x00,0xFF,0xE0,0x31,0x00,0x3F,0xC0,0x7A,0x40,0x97,0x40,0x24,0x40,0x0C,0x80,0x02,0x00,0x50,0x20,0x90,0xA0,0x0F,0x80,0x00,0x00,}}, +{ 0x8475, {0x11,0x00,0xFF,0xE0,0x19,0x00,0x0D,0x80,0x2B,0x40,0x11,0x80,0x7F,0x80,0xC4,0x60,0x3F,0x80,0x0C,0x00,0x13,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8477, {0x11,0x00,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0xFF,0xC0,0x3F,0x80,0x25,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8479, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x12,0x00,0x23,0xE0,0xFD,0x80,0x23,0xC0,0x3B,0xC0,0x6F,0xC0,0x4B,0xE0,0x8A,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x847A, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0xE0,0xFF,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x8482, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xE0,0xC4,0x40,0xBF,0x80,0x25,0x80,0x27,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8484, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7F,0xE0,0x40,0xC0,0xF8,0x80,0x07,0xE0,0xFA,0x80,0x71,0x80,0x70,0xA0,0x50,0xA0,0x8F,0xE0,0x00,0x00,}}, +{ 0x848B, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x31,0xE0,0xBF,0x40,0x65,0x80,0x62,0x80,0x2F,0xE0,0x64,0x80,0xA2,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8490, {0x11,0x00,0xFF,0xE0,0x18,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x15,0x80,0x17,0xE0,0x24,0x20,0xC3,0xE0,0x00,0x00,}}, +{ 0x8494, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x51,0x00,0x5F,0xE0,0x70,0x80,0x5F,0xE0,0x74,0x80,0x42,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x8499, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xE0,0x9F,0x80,0xFF,0xE0,0x0D,0x40,0x77,0x80,0x1E,0x80,0x6E,0x40,0xF2,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x849C, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x00,0x00,0xFF,0xE0,0x20,0x80,0x72,0xC0,0x6A,0xE0,0xA4,0xA0,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x849F, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x12,0x00,0x23,0xC0,0xFC,0x40,0x1B,0xC0,0x53,0xC0,0x73,0xC0,0x7B,0x40,0xE0,0x40,0x00,0x80,0x00,0x00,}}, +{ 0x84A1, {0x11,0x00,0xFF,0xE0,0x14,0x00,0x7F,0xC0,0x13,0x00,0x7F,0xE0,0x44,0x40,0xFF,0xC0,0x07,0x80,0x0F,0x80,0x30,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x84AD, {0x11,0x00,0xFF,0xE0,0x3F,0xC0,0xFF,0xC0,0x7F,0x40,0x31,0x40,0x71,0x80,0x3F,0xC0,0xE9,0x40,0xFF,0x40,0x33,0x40,0xE1,0xC0,0x00,0x00,}}, +{ 0x84B2, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x51,0x40,0x2F,0xE0,0xA1,0x00,0x4F,0xC0,0x29,0x40,0x0F,0xC0,0x2F,0xC0,0x49,0x40,0x89,0xC0,0x00,0x00,}}, +{ 0x84B8, {0x11,0x00,0xFF,0xE0,0x3F,0x00,0x03,0x40,0x76,0x40,0x15,0x80,0x24,0x80,0xCC,0x60,0x1F,0x00,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x84B9, {0x11,0x00,0xFF,0xE0,0x1B,0x00,0xFF,0xE0,0x7F,0xC0,0x0A,0x80,0xFF,0xE0,0x0A,0x80,0x3F,0x80,0x3B,0x80,0xCA,0x60,0x0A,0x00,0x00,0x00,}}, +{ 0x84BB, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x7B,0xC0,0x08,0x40,0x7B,0xC0,0x42,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x84BC, {0x20,0x80,0xFF,0xE0,0x24,0x80,0x1F,0x00,0xFF,0xE0,0x21,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x7F,0x80,0x5F,0x80,0x90,0x80,0x00,0x00,}}, +{ 0x84BF, {0x11,0x00,0xFF,0xE0,0x10,0x00,0xFF,0xE0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x7F,0xC0,0x4E,0x40,0x5F,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x84C1, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0xFF,0xE0,0x13,0x00,0x7D,0xC0,0x9F,0x60,0x1F,0x80,0x64,0x40,0x04,0x00,0x00,0x00,}}, +{ 0x84C4, {0x11,0x00,0xFF,0xE0,0x15,0x00,0xFF,0xC0,0x33,0x00,0x0D,0x80,0xFF,0x40,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x84C6, {0x11,0x00,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x49,0x80,0x4F,0x00,0x42,0x00,0x7F,0xC0,0x62,0x40,0xA2,0xC0,0x02,0x00,0x00,0x00,}}, +{ 0x84C9, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xE0,0x51,0x40,0xA4,0x80,0x0A,0x00,0x11,0x00,0x3F,0x80,0xE0,0xE0,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x84CA, {0x11,0x00,0xFF,0xE0,0x17,0x00,0x37,0x80,0xC9,0x60,0x7F,0x00,0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0x40,0x18,0xC0,0x00,0x00,}}, +{ 0x84CB, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7F,0x80,0x00,0x40,0x3F,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x84CD, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x00,0xFF,0xE0,0x1F,0x80,0x78,0x40,0xCF,0xC0,0x3F,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x84D0, {0x11,0x00,0xFF,0xE0,0x3F,0xE0,0x7F,0xE0,0x60,0x00,0x7F,0xE0,0x69,0x40,0x6F,0xC0,0x7F,0xE0,0x7F,0xE0,0x85,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x84D1, {0x11,0x00,0xFF,0xE0,0x15,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0xF2,0x40,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x84D6, {0x11,0x00,0xFF,0xE0,0x14,0x00,0x3F,0x80,0x6B,0x80,0x66,0x80,0x79,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0x00,0x7A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x84D9, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x55,0x80,0x55,0x80,0x6F,0xC0,0x7F,0xC0,0x5F,0x80,0xFF,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x84DA, {0x11,0x00,0xFF,0xE0,0x13,0x00,0x33,0xE0,0x36,0xC0,0x79,0x80,0x73,0x80,0xFD,0x60,0x73,0x80,0x73,0xC0,0x71,0xC0,0x67,0x00,0x00,0x00,}}, +{ 0x84EC, {0x11,0x00,0xFF,0xE0,0x13,0x80,0x5E,0x80,0x23,0x80,0x0D,0xE0,0xFF,0xC0,0x21,0x00,0x2F,0xC0,0x3F,0xE0,0x71,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x84EE, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x5F,0xE0,0x2F,0xC0,0x09,0x40,0xEF,0xC0,0x29,0x40,0x2F,0xC0,0x3F,0xE0,0x51,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x84F4, {0x11,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x64,0x80,0x7F,0x80,0x3F,0x80,0x04,0xC0,0x7F,0xC0,0xFF,0xE0,0x11,0x80,0x09,0x80,0x00,0x00,}}, +{ 0x84FC, {0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x2D,0xC0,0x6B,0x40,0x35,0x80,0xDF,0xE0,0x1F,0x00,0x06,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x84FF, {0x11,0x00,0xFF,0xE0,0x14,0x00,0x7F,0xE0,0x70,0x40,0xBF,0xC0,0x62,0x00,0x6F,0x80,0xEF,0x80,0x6F,0x80,0x6F,0x80,0x68,0x80,0x00,0x00,}}, +{ 0x8500, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x21,0xC0,0xFD,0x40,0x49,0x80,0x51,0x80,0xFD,0x40,0x79,0x20,0x49,0x20,0x79,0xC0,0x49,0x00,0x00,0x00,}}, +{ 0x8506, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x2F,0xC0,0xA3,0x00,0x5F,0xE0,0x44,0xA0,0x7A,0xE0,0x47,0x80,0x5F,0x00,0x87,0x80,0xB8,0x60,0x00,0x00,}}, +{ 0x8511, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x7F,0xC0,0x02,0x80,0x7F,0xE0,0x61,0x40,0x58,0xC0,0x48,0xA0,0x43,0x60,0x8C,0x20,0x00,0x00,}}, +{ 0x8513, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x2A,0x80,0x3F,0x80,0x7F,0x00,0x0A,0x00,0x1E,0x00,0xE1,0xC0,0x00,0x00,}}, +{ 0x8514, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0x40,0xBE,0x40,0x22,0x40,0x3E,0x40,0x7F,0x40,0x7F,0x40,0x7F,0x40,0x61,0x80,0x00,0x00,}}, +{ 0x8515, {0x11,0x00,0xFF,0xE0,0x1B,0x00,0xFF,0xE0,0x3B,0xA0,0x6E,0xE0,0x7F,0xE0,0xC4,0x40,0xFF,0x80,0x64,0x80,0x65,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x8517, {0x11,0x00,0xFF,0xE0,0x10,0x00,0x3F,0xC0,0x6B,0x00,0x69,0x00,0x7F,0x80,0x69,0x00,0x7F,0xC0,0x7F,0xC0,0x69,0x40,0xE5,0x20,0x00,0x00,}}, +{ 0x8518, {0x11,0x00,0xFF,0xE0,0x1E,0x00,0x1E,0x00,0x75,0xC0,0xFB,0xE0,0x11,0x00,0x77,0xC0,0x9E,0x60,0x1F,0x80,0x06,0x00,0x38,0x00,0x00,0x00,}}, +{ 0x851A, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x78,0x40,0x7F,0xE0,0x40,0x40,0x79,0x40,0x40,0xC0,0x7C,0x40,0xB8,0x40,0xD4,0x40,0x10,0xC0,0x00,0x00,}}, +{ 0x851F, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x12,0x00,0x27,0xE0,0xFA,0x00,0x23,0xC0,0x3D,0x80,0x6F,0xE0,0x49,0x80,0x8A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x8521, {0x11,0x00,0xFF,0xE0,0x19,0xC0,0x3F,0xC0,0xDB,0x80,0x51,0x80,0x7F,0x60,0xC0,0x00,0x3F,0x80,0x04,0x80,0x64,0x40,0x0C,0x00,0x00,0x00,}}, +{ 0x8526, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x52,0xA0,0x80,0xC0,0x00,0x00,}}, +{ 0x852C, {0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x39,0x80,0x31,0x40,0x67,0xE0,0x78,0x00,0x65,0x80,0x75,0xA0,0x79,0xA0,0xD0,0x60,0x00,0x00,}}, +{ 0x852D, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x76,0x80,0x5B,0x60,0x67,0x80,0x61,0x00,0x57,0xC0,0x50,0x00,0x7F,0xE0,0x45,0x80,0x4E,0x40,0x00,0x00,}}, +{ 0x8535, {0x11,0x00,0xFF,0xE0,0x11,0x40,0x7F,0xE0,0x63,0x00,0x7F,0x40,0x65,0xC0,0x7F,0xC0,0x7E,0x80,0x7C,0xA0,0x7F,0x60,0xA2,0x20,0x00,0x00,}}, +{ 0x853D, {0x11,0x00,0x11,0x00,0xFF,0xE0,0xB5,0x00,0xF5,0xE0,0x6B,0x40,0xFD,0x40,0xB5,0x40,0xFC,0x80,0xEC,0x80,0xA5,0x40,0xAE,0x20,0x00,0x00,}}, +{ 0x8540, {0x11,0x00,0xFF,0xE0,0x11,0x00,0xFF,0xE0,0x31,0x80,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x8541, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x7F,0x80,0x7B,0xC0,0x32,0x40,0xFF,0xE0,0xFF,0xE0,0x11,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x8543, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x1F,0x00,0xFF,0xE0,0x15,0x00,0x64,0x80,0xBF,0xE0,0x24,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8548, {0x11,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x6A,0x80,0x7F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8549, {0x11,0x00,0xFF,0xE0,0x12,0x00,0x3F,0xC0,0x24,0x00,0x7F,0x80,0x64,0x00,0xBF,0x80,0x24,0x00,0x3F,0xC0,0x4A,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x854A, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x32,0x40,0x50,0x40,0x0F,0x80,0x10,0x80,0x5A,0xC0,0x46,0x20,0xD6,0x80,0x31,0x80,0x00,0x00,}}, +{ 0x854B, {0x11,0x00,0xFF,0xE0,0x14,0x00,0x27,0x80,0x24,0x00,0x7F,0xC0,0x21,0x80,0x33,0x80,0x7B,0xC0,0x7B,0x80,0x77,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x854E, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x3E,0x00,0x7F,0xC0,0x1F,0x00,0x31,0x80,0xDF,0x60,0x3F,0x80,0x2E,0x80,0x2E,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8555, {0x11,0x00,0xFF,0xE0,0x13,0x80,0xA7,0x80,0x6F,0xC0,0x73,0xA0,0x6F,0xC0,0xAB,0xC0,0x6F,0xC0,0xAF,0xC0,0x2F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x8557, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x79,0xC0,0x4B,0x40,0x4C,0x80,0x79,0x80,0x12,0x40,0x5F,0xE0,0x5A,0x40,0x73,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x8558, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x21,0x80,0x7B,0xC0,0x39,0x80,0xFF,0xE0,0x7F,0xC0,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x855A, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x03,0x80,0x00,0x00,}}, +{ 0x8563, {0x11,0x00,0xFF,0xE0,0x7F,0x80,0x7C,0x80,0x25,0x00,0x7F,0xE0,0x61,0xC0,0xBB,0xC0,0x6B,0x80,0x1F,0xE0,0x31,0x80,0xC1,0x80,0x00,0x00,}}, +{ 0x8568, {0x11,0x00,0xFF,0xE0,0x3F,0xE0,0x7F,0xE0,0x6D,0x80,0x7F,0xE0,0x6B,0xA0,0x7B,0xC0,0x7E,0x80,0x69,0x80,0x51,0x40,0xA2,0x20,0x00,0x00,}}, +{ 0x8569, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x27,0x80,0x94,0x80,0x47,0x80,0x47,0x80,0x3F,0xE0,0x27,0xC0,0x5D,0xC0,0x4B,0x40,0x43,0x80,0x00,0x00,}}, +{ 0x856A, {0x11,0x00,0xFF,0xE0,0x30,0x00,0x3F,0xC0,0x6A,0x80,0xAA,0x80,0xFF,0xE0,0x2A,0x80,0xFF,0xE0,0x52,0x80,0x49,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x856D, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x7F,0x80,0x75,0x80,0x77,0x80,0x7F,0x80,0x75,0x80,0x55,0x80,0x95,0x80,0x00,0x00,}}, +{ 0x8577, {0x11,0x00,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0x33,0xC0,0xFE,0x40,0x2B,0xC0,0x32,0x40,0x23,0xC0,0x23,0xC0,0x23,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x857E, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xE0,0x75,0xC0,0xB5,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8580, {0x11,0x00,0xFF,0xE0,0x1F,0x80,0x2F,0x80,0xAB,0x80,0x4D,0x80,0x4F,0x80,0x60,0x00,0x5F,0xC0,0x55,0xC0,0xBF,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x8584, {0x11,0x00,0xFF,0xE0,0x51,0x40,0x3F,0xE0,0x8F,0xC0,0x49,0x40,0x4F,0xC0,0x29,0x40,0x2F,0xC0,0x5F,0xE0,0x82,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x8587, {0x11,0x00,0xFF,0xE0,0x19,0x00,0x4B,0x80,0xAB,0x80,0x3F,0xE0,0x61,0x40,0xFF,0xC0,0xC8,0x80,0x5E,0x80,0x77,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x8588, {0x21,0x80,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0xFF,0xE0,0x65,0x80,0x75,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x858A, {0x11,0x00,0xFF,0xE0,0x38,0x00,0x38,0x40,0x7D,0x40,0xF5,0x40,0x7D,0x40,0x75,0x40,0x7D,0x40,0x7F,0x40,0x6A,0x40,0x80,0xC0,0x00,0x00,}}, +{ 0x8590, {0x11,0x00,0xFF,0xE0,0x19,0x00,0x7F,0xC0,0x23,0x00,0xFF,0xE0,0x23,0xA0,0x75,0xE0,0x6F,0x80,0xA7,0x80,0x23,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x8591, {0x11,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x7F,0x80,0x64,0x80,0x7F,0x80,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0xFF,0xE0,0x00,0x00,}}, +{ 0x8594, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x35,0x80,0x2D,0x40,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8597, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x44,0x40,0x5F,0x40,0x7F,0xC0,0x51,0x40,0x5F,0xC0,0x4F,0x40,0x59,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x8599, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x51,0x40,0x7A,0x80,0x63,0xE0,0xA6,0x80,0xFB,0xC0,0x32,0x80,0x2B,0xC0,0x4B,0xE0,0x82,0x00,0x00,0x00,}}, +{ 0x859B, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x31,0x80,0x77,0xE0,0x52,0x40,0x71,0x80,0x47,0xE0,0x77,0xE0,0x57,0xE0,0x71,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x859C, {0x11,0x00,0x13,0x00,0xFF,0xE0,0x71,0x80,0x57,0xE0,0x52,0x40,0x71,0x80,0x47,0xE0,0xF7,0xE0,0xD7,0xE0,0x71,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x85A4, {0x11,0x00,0x13,0x00,0xFF,0xE0,0xFB,0x00,0x63,0x80,0x7F,0xC0,0x53,0x80,0xDF,0xC0,0xA7,0xC0,0x27,0xC0,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x85A6, {0x11,0x00,0xFF,0xE0,0x15,0x00,0x7F,0xE0,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x48,0x00,0x5F,0xE0,0x5F,0xE0,0xA7,0xA0,0x20,0xC0,0x00,0x00,}}, +{ 0x85A8, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xE0,0x40,0x40,0xFF,0xC0,0xFB,0xC0,0xFB,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x85A9, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xE0,0x52,0x40,0x6F,0xE0,0x6A,0x80,0x5B,0xC0,0x5C,0x80,0x6F,0xC0,0x48,0x80,0x57,0xE0,0x00,0x00,}}, +{ 0x85AA, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x7C,0x20,0x29,0xC0,0x79,0x00,0xFD,0xE0,0x21,0x40,0xFD,0x40,0x72,0x40,0xAA,0x40,0x24,0x40,0x00,0x00,}}, +{ 0x85AB, {0x11,0x00,0xFF,0xE0,0x1F,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0xFF,0xE0,0x2A,0x40,0xC5,0x20,0x00,0x00,}}, +{ 0x85AC, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x5F,0x40,0x3F,0x80,0x31,0xC0,0xDF,0x20,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x85AE, {0x11,0x00,0xFF,0xE0,0x39,0x00,0x79,0x00,0xFD,0xE0,0x72,0x80,0x6A,0x80,0xFD,0x00,0x29,0x00,0x51,0x80,0x32,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x85AF, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x05,0x00,0xFF,0xE0,0x1F,0x80,0x70,0x80,0x9F,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x85B9, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x31,0x80,0x3F,0x80,0x7F,0xE0,0xFF,0x40,0x9F,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0x85BA, {0x11,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0xF7,0xC0,0x75,0x80,0x77,0xC0,0xB5,0xA0,0x3F,0x80,0x3F,0x80,0x21,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x85C1, {0x11,0x00,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x1F,0x00,0x7F,0xC0,0x5F,0x40,0x53,0x40,0xFF,0xE0,0xFF,0xE0,0x35,0x80,0xC4,0x60,0x00,0x00,}}, +{ 0x85C9, {0x11,0x00,0xFF,0xE0,0x39,0x80,0xFB,0xC0,0x23,0xC0,0x7F,0xE0,0x20,0x00,0xFB,0xC0,0x7B,0xC0,0x6B,0xC0,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x85CD, {0x11,0x00,0xFF,0xE0,0x79,0x00,0x79,0xE0,0x4A,0x00,0x7C,0x00,0x51,0xC0,0x7C,0x00,0x3F,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x85CF, {0x11,0x00,0xFF,0xE0,0x11,0x40,0x1F,0xE0,0x73,0x00,0x7F,0x40,0x35,0x40,0xFF,0xC0,0x7E,0x80,0xFC,0xA0,0x7F,0x60,0x52,0x20,0x00,0x00,}}, +{ 0x85D0, {0x11,0x00,0xFF,0xE0,0x1A,0x00,0xFF,0xC0,0xF4,0x40,0x67,0xC0,0x64,0x40,0xF7,0xC0,0xF3,0x80,0xF3,0xA0,0xD5,0xA0,0x68,0xE0,0x00,0x00,}}, +{ 0x85D5, {0x11,0x00,0xFF,0xE0,0x3F,0xC0,0xFF,0xC0,0x33,0xC0,0x7B,0xC0,0x23,0xC0,0xF9,0x80,0x7F,0xE0,0x6F,0xE0,0xA4,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x85DC, {0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x67,0xC0,0xF9,0x40,0x76,0x40,0xEB,0x80,0x39,0x00,0xF5,0xE0,0x9F,0x20,0x75,0xC0,0x0C,0x00,0x00,0x00,}}, +{ 0x85DD, {0x11,0x00,0xFF,0xE0,0x7B,0x80,0xFF,0x80,0xF7,0x80,0xFD,0xA0,0x3A,0xA0,0x74,0x60,0xFF,0xE0,0xFF,0xE0,0x1F,0x80,0x60,0x40,0x00,0x00,}}, +{ 0x85E4, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x75,0x80,0x5F,0xC0,0x52,0x80,0x7F,0xE0,0x55,0x40,0x5B,0xE0,0x7D,0x80,0x51,0x40,0x93,0x00,0x00,0x00,}}, +{ 0x85E5, {0x11,0x00,0xFF,0xE0,0xFF,0xC0,0xEF,0xC0,0x6E,0xC0,0x6A,0xC0,0xFF,0xE0,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x85E9, {0x11,0x00,0xFF,0xE0,0x11,0xC0,0x2F,0x80,0xA7,0xC0,0x5F,0xE0,0x43,0x80,0x3F,0xC0,0x27,0xA0,0x47,0x80,0x47,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x85EA, {0x11,0x00,0xFF,0xE0,0x39,0x00,0x7D,0x80,0xFF,0xE0,0x7D,0x40,0x7F,0x40,0x75,0xC0,0xFC,0x80,0xFC,0x80,0x19,0x40,0x66,0x20,0x00,0x00,}}, +{ 0x85F7, {0x11,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0xF9,0x80,0x6F,0xE0,0x61,0x00,0x03,0xC0,0x76,0x40,0x5B,0xC0,0x73,0xC0,0x42,0x40,0x00,0x00,}}, +{ 0x85F9, {0x11,0x00,0xFF,0xE0,0x73,0xC0,0x73,0xC0,0xFB,0xC0,0x02,0x40,0x73,0xC0,0x73,0xE0,0x7D,0x20,0x7F,0xA0,0x77,0xA0,0x44,0xC0,0x00,0x00,}}, +{ 0x85FA, {0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x52,0x40,0x5F,0x40,0x7F,0x40,0x5E,0x40,0x5F,0x40,0x50,0xC0,0x00,0x00,}}, +{ 0x85FB, {0x11,0x00,0xFF,0xE0,0x17,0x80,0x27,0x80,0xA7,0x80,0x4F,0xC0,0x4B,0xC0,0x2F,0xC0,0x3F,0xE0,0x6F,0xE0,0x5B,0x60,0x41,0x00,0x00,0x00,}}, +{ 0x85FE, {0x11,0x00,0xFF,0xE0,0x37,0xC0,0xFF,0xC0,0x32,0xC0,0x7F,0xC0,0x6A,0x40,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0xA3,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x8602, {0x11,0x00,0xFF,0xE0,0x17,0x80,0x73,0xC0,0x4F,0x00,0x69,0x40,0x77,0xA0,0xB5,0xA0,0xFF,0xE0,0xFF,0xE0,0x35,0x80,0xC4,0x60,0x00,0x00,}}, +{ 0x8606, {0x11,0x00,0xFF,0xE0,0x17,0xC0,0x3F,0xE0,0x67,0x40,0x7B,0xC0,0x7F,0x80,0x72,0x80,0x7F,0x80,0x7F,0xC0,0x77,0x40,0xFF,0xE0,0x00,0x00,}}, +{ 0x8607, {0x11,0x00,0xFF,0xE0,0x11,0x40,0x7B,0x80,0x50,0x80,0xF8,0x80,0x6F,0xE0,0x79,0x80,0x7A,0xC0,0x7C,0xA0,0x74,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x860A, {0x11,0x00,0xFF,0xE0,0x17,0xC0,0x77,0xC0,0xD5,0x40,0x66,0xC0,0x77,0xC0,0xF8,0x00,0x37,0xC0,0x7D,0xC0,0xAF,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x860B, {0x11,0x00,0xFF,0xE0,0x17,0xE0,0x27,0xE0,0x7B,0xC0,0x62,0x40,0xFF,0xC0,0x62,0x40,0xEB,0xC0,0x3B,0xC0,0x32,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x8613, {0x11,0x00,0xFF,0xE0,0x19,0x80,0x7B,0x80,0x27,0xC0,0xFB,0xC0,0x23,0xC0,0x73,0xC0,0x6B,0xC0,0xA6,0x40,0x27,0xE0,0x29,0xA0,0x00,0x00,}}, +{ 0x8616, {0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x7F,0xE0,0x79,0x80,0x4B,0xC0,0x7C,0x00,0xFF,0xE0,0xFF,0xE0,0xF5,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x8617, {0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x7F,0xE0,0x79,0x80,0x6B,0xC0,0xBC,0x00,0xFF,0xE0,0xFF,0xE0,0xF5,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x861A, {0x11,0x00,0xFF,0xE0,0x3F,0x40,0x39,0x40,0x7F,0xE0,0xF5,0x80,0x7F,0xC0,0x75,0x80,0x7F,0xE0,0x7F,0xE0,0x6D,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x8622, {0x11,0x00,0xFF,0xE0,0x7B,0xE0,0x7B,0xE0,0xF8,0x40,0x03,0xC0,0x72,0x00,0x53,0xC0,0x73,0xC0,0x73,0xE0,0x52,0x20,0x71,0xE0,0x00,0x00,}}, +{ 0x862D, {0x11,0x00,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x4E,0x40,0x75,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x862F, {0x11,0x00,0xFF,0xE0,0x1F,0x80,0x4F,0x80,0x8F,0x80,0x7F,0xE0,0x6F,0xC0,0xF7,0x40,0xBF,0x80,0x7F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8630, {0x11,0x00,0xFF,0xE0,0x3B,0xC0,0xEB,0xC0,0x73,0xC0,0x37,0xE0,0x6D,0xA0,0xFF,0xE0,0x3F,0xC0,0x6B,0x80,0xA3,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x863F, {0x11,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x72,0x80,0xF3,0xE0,0x7E,0xC0,0xFB,0xC0,0x7B,0xC0,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x864D, {0x04,0x00,0x07,0xC0,0x3F,0xE0,0x7F,0xE0,0x64,0xC0,0x64,0xE0,0x67,0x00,0x7C,0x00,0x64,0x00,0x44,0x20,0x44,0x20,0x83,0xE0,0x00,0x00,}}, +{ 0x864E, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x44,0x60,0x47,0xC0,0x7C,0x40,0x43,0xC0,0x49,0x00,0x49,0x00,0x49,0x20,0x91,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x8650, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x44,0x00,0x5F,0xE0,0x44,0x00,0x47,0x80,0x7F,0xC0,0x50,0x00,0x5F,0xC0,0x90,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0x8654, {0x04,0x00,0x07,0xC0,0x3F,0xE0,0x7F,0xE0,0x7C,0x40,0x63,0xC0,0x62,0x00,0x7F,0xE0,0x69,0x00,0x46,0x00,0x4F,0x00,0xF0,0xE0,0x00,0x00,}}, +{ 0x8655, {0x04,0x00,0x07,0xC0,0x3F,0xE0,0x7F,0xE0,0x7C,0xC0,0x67,0x80,0x70,0x00,0x7D,0x80,0x75,0xA0,0x7F,0x60,0x56,0x00,0xE1,0xE0,0x00,0x00,}}, +{ 0x865A, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x4B,0xE0,0x7C,0x40,0x47,0xC0,0x45,0x00,0x55,0x40,0x55,0x40,0x45,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x865C, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x4F,0x80,0x7F,0x80,0x52,0x80,0x5F,0x80,0x52,0x80,0x5F,0xC0,0x7F,0xC0,0x8C,0x40,0x30,0x80,0x00,0x00,}}, +{ 0x865E, {0x04,0x00,0x07,0xC0,0x7F,0xE0,0x7F,0x40,0x43,0xC0,0x57,0x80,0x54,0x80,0x57,0x80,0x5F,0x80,0x7F,0xE0,0x99,0xC0,0x20,0x60,0x00,0x00,}}, +{ 0x865F, {0x01,0x00,0x71,0xC0,0x57,0xE0,0x77,0xE0,0x05,0xC0,0xFF,0x20,0x65,0xE0,0x75,0x80,0x15,0x80,0x19,0xA0,0x2A,0xA0,0x74,0x60,0x00,0x00,}}, +{ 0x8667, {0x20,0x00,0x3F,0xC0,0x7F,0x80,0x7D,0x80,0x5F,0xE0,0x69,0x00,0x7F,0x00,0x79,0xC0,0x7C,0x40,0x78,0x40,0xBE,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x866B, {0x04,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x04,0x80,0x07,0xC0,0xF8,0x20,0x00,0x20,0x00,0x00,}}, +{ 0x8671, {0x00,0x00,0x7F,0x80,0x07,0x80,0x79,0x80,0x11,0x80,0x7F,0x80,0x53,0x80,0x53,0x80,0x7E,0x80,0x16,0xA0,0x1F,0x60,0xE1,0x20,0x00,0x00,}}, +{ 0x8679, {0x20,0x00,0x20,0x00,0x7F,0xE0,0x69,0x00,0x69,0x00,0x69,0x00,0x69,0x00,0x79,0x00,0x29,0x00,0x3D,0x00,0x37,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x867B, {0x20,0x80,0x20,0x80,0xF8,0x80,0xAF,0xE0,0xAA,0x00,0xAA,0x00,0xFA,0x00,0xB2,0x00,0x2A,0x00,0x3E,0x00,0xE6,0x00,0x01,0xE0,0x00,0x00,}}, +{ 0x868A, {0x20,0x80,0x20,0x80,0x7F,0xE0,0x6A,0x40,0x6A,0x40,0x6A,0x40,0x79,0x80,0x61,0x80,0x29,0x80,0x3D,0x80,0xE2,0x40,0x04,0x20,0x00,0x00,}}, +{ 0x868B, {0x10,0xC0,0x10,0xC0,0x3D,0xE0,0x3D,0xE0,0x35,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x1D,0x20,0x1F,0x20,0x71,0x20,0x01,0x60,0x00,0x00,}}, +{ 0x868C, {0x21,0x80,0x21,0x80,0x7F,0xE0,0x7F,0xE0,0x69,0x80,0x6B,0xC0,0x79,0x80,0x79,0x80,0x3F,0xE0,0x3D,0x80,0xE1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8693, {0x30,0x20,0x33,0xE0,0x78,0xE0,0x7B,0xE0,0x7A,0x20,0x7A,0x20,0x7B,0xE0,0x7A,0xE0,0x38,0xE0,0x3C,0xE0,0x64,0xE0,0x03,0xA0,0x00,0x00,}}, +{ 0x8695, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x0A,0x00,0x35,0x80,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x24,0x80,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x86A3, {0x21,0x80,0x20,0x80,0x79,0x80,0x7A,0x40,0x6A,0x40,0x6C,0x20,0x79,0x80,0x79,0x80,0x39,0xC0,0x3D,0x40,0xE7,0xA0,0x00,0x20,0x00,0x00,}}, +{ 0x86A4, {0x00,0x00,0x7F,0xC0,0x1B,0x80,0x26,0x00,0x1F,0x00,0x24,0x80,0xFF,0xE0,0x24,0x80,0x3F,0x80,0x04,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x86A9, {0x04,0x00,0x64,0x80,0x7F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7F,0x80,0x64,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x86AA, {0x20,0x40,0x21,0x40,0x79,0xC0,0x7A,0x40,0x6B,0x40,0x69,0x40,0x78,0x60,0x79,0xC0,0x3A,0x40,0x3C,0x40,0xE4,0x40,0x00,0x40,0x00,0x00,}}, +{ 0x86AB, {0x21,0x00,0x21,0x00,0x7B,0xC0,0x7B,0xC0,0x6F,0x40,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3A,0x80,0x3A,0x20,0xE2,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x86AF, {0x20,0x40,0x20,0x80,0x7B,0x00,0x7A,0x00,0x6B,0xE0,0x6A,0x80,0x7A,0x80,0x7A,0x80,0x3A,0x80,0x3A,0x80,0xE7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x86B0, {0x10,0xC0,0x10,0xC0,0x3D,0xE0,0x3D,0xE0,0x35,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x1D,0xE0,0x1F,0xE0,0x71,0xE0,0x01,0x20,0x00,0x00,}}, +{ 0x86B6, {0x22,0x40,0x22,0x40,0x7F,0xE0,0x7F,0xE0,0x6A,0x40,0x6A,0x40,0x7B,0xC0,0x7A,0x40,0x3A,0x40,0x3E,0x40,0xE3,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x86C4, {0x21,0x80,0x21,0x80,0x7F,0xE0,0x7F,0xE0,0x69,0x80,0x69,0x80,0x7B,0xC0,0x7A,0x40,0x3A,0x40,0x3E,0x40,0xE3,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x86C6, {0x20,0x00,0x23,0xC0,0x7A,0x40,0x7A,0x40,0x6B,0xC0,0x6A,0x40,0x7A,0x40,0x7B,0xC0,0x3A,0x40,0x3E,0x40,0xE7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x86C7, {0x20,0x80,0x20,0x80,0x7B,0xE0,0x6B,0x20,0x6F,0x00,0x69,0x40,0x69,0x40,0x79,0x80,0x29,0x00,0x3D,0x20,0xE5,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x86C9, {0x21,0x80,0x21,0x80,0x79,0x80,0x7A,0x40,0x6F,0xE0,0x68,0x00,0x7B,0xE0,0x79,0xA0,0x39,0xA0,0x3D,0xE0,0xE1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x86CB, {0x00,0x00,0x7F,0xC0,0x27,0x80,0x34,0x00,0x4F,0xE0,0x84,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x86CD, {0x28,0x80,0x14,0x80,0x7F,0xE0,0x44,0x40,0xBF,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x04,0x80,0x07,0xC0,0x78,0x40,0x00,0x00,}}, +{ 0x86CE, {0x20,0x00,0x23,0xE0,0x7A,0x00,0x6B,0xE0,0x6A,0x80,0x6A,0x80,0x7A,0xE0,0x6A,0xA0,0x2B,0x20,0x3D,0x20,0xEA,0x20,0x04,0xC0,0x00,0x00,}}, +{ 0x86D4, {0x10,0x00,0x13,0xE0,0x3E,0x20,0x3F,0xA0,0x37,0xE0,0x37,0xE0,0x3F,0xE0,0x3B,0xE0,0x1F,0x20,0x1E,0x20,0x73,0xE0,0x02,0x20,0x00,0x00,}}, +{ 0x86D9, {0x20,0x80,0x20,0x80,0x7B,0xC0,0x68,0x80,0x68,0x80,0x6F,0xE0,0x78,0x80,0x68,0x80,0x3B,0xC0,0x28,0x80,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x86DB, {0x21,0x80,0x23,0x80,0x7B,0xC0,0x7B,0xC0,0x6D,0x80,0x6F,0xE0,0x79,0x80,0x7B,0xC0,0x3B,0xC0,0x3D,0xA0,0xE9,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x86DE, {0x20,0x40,0x20,0x80,0x7B,0x80,0x79,0x80,0x6F,0xE0,0x69,0x80,0x79,0x80,0x7B,0xC0,0x3A,0x40,0x3E,0x40,0xE3,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x86DF, {0x21,0x80,0x21,0x80,0x7F,0xE0,0x79,0x40,0x6A,0xE0,0x6D,0xA0,0x79,0x80,0x79,0x80,0x39,0x80,0x3D,0x80,0xE2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x86E4, {0x21,0x80,0x21,0x80,0x79,0x80,0x6A,0x40,0x6F,0xE0,0x68,0x00,0x78,0x00,0x6B,0xC0,0x2A,0x40,0x3E,0x40,0xE3,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x86E9, {0x00,0x00,0xF7,0x80,0x64,0x80,0x66,0xA0,0x79,0xA0,0xD0,0x60,0x04,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x86EC, {0x11,0x00,0x13,0x00,0x7F,0xC0,0xFF,0xE0,0x17,0x00,0x25,0x80,0xFF,0xE0,0x25,0x80,0x3F,0x80,0x3F,0x80,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x86ED, {0x20,0x00,0x27,0xE0,0x79,0x00,0x6A,0x40,0x6F,0xE0,0x68,0xA0,0x78,0x80,0x6B,0xC0,0x28,0x80,0x38,0x80,0xEF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x86EE, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x69,0x40,0x51,0x20,0xA7,0x20,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x80,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x86EF, {0x21,0x80,0x21,0x80,0x7B,0xE0,0x79,0xE0,0x6F,0xE0,0x68,0x80,0x79,0x00,0x7B,0x60,0x3F,0x80,0x39,0x20,0xE1,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x86F8, {0x20,0x80,0x24,0xA0,0x7A,0xA0,0x68,0x80,0x6B,0xC0,0x6A,0x40,0x7B,0xC0,0x72,0x40,0x2B,0xC0,0x3E,0x40,0xE2,0x40,0x02,0xC0,0x00,0x00,}}, +{ 0x86F9, {0x10,0x00,0x13,0xE0,0x3C,0xC0,0x3D,0xE0,0x35,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x1D,0xE0,0x1F,0xE0,0x71,0xE0,0x01,0x60,0x00,0x00,}}, +{ 0x86FB, {0x21,0x80,0x20,0x80,0x79,0x40,0x7A,0x40,0x6F,0xE0,0x6A,0x40,0x7A,0x40,0x7B,0xC0,0x39,0x80,0x3A,0xA0,0xE4,0xA0,0x08,0x60,0x00,0x00,}}, +{ 0x86FE, {0x21,0x80,0x22,0x80,0xFE,0xC0,0xB2,0xA0,0xBF,0xE0,0xB2,0x80,0xF3,0xC0,0xA6,0xC0,0x3A,0x80,0x32,0xA0,0xC3,0x60,0x06,0x20,0x00,0x00,}}, +{ 0x8700, {0x00,0x00,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x1F,0xE0,0x14,0x20,0x3F,0xA0,0x75,0xA0,0x3F,0xA0,0x07,0xA0,0x78,0xE0,0x00,0xC0,0x00,0x00,}}, +{ 0x8702, {0x21,0x00,0x23,0xC0,0x7E,0x80,0x69,0x80,0x6B,0x40,0x6F,0xA0,0x79,0x00,0x73,0xC0,0x29,0x00,0x3F,0xE0,0xE1,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x8703, {0x00,0x00,0x7F,0xC0,0x7F,0x80,0x7F,0xE0,0x72,0xC0,0x5D,0x80,0xE4,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x8706, {0x20,0x00,0x23,0xC0,0x7A,0x40,0x7B,0xC0,0x6A,0x40,0x6B,0xC0,0x7A,0x40,0x7B,0xC0,0x3B,0xC0,0x3B,0xA0,0xE5,0xA0,0x08,0xE0,0x00,0x00,}}, +{ 0x8708, {0x20,0x00,0x21,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x6A,0x00,0x7B,0xC0,0x7B,0xC0,0x3F,0xE0,0x3F,0xE0,0xE2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x8709, {0x20,0x40,0x21,0x80,0x7F,0xC0,0x7B,0xA0,0x6C,0x20,0x6B,0xC0,0x78,0x80,0x71,0x80,0x3F,0xE0,0x3D,0x80,0xE1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x870A, {0x30,0xA0,0x31,0x20,0x7F,0xE0,0x79,0xE0,0x7F,0xE0,0x79,0xE0,0x7B,0xE0,0x73,0xE0,0x3D,0xE0,0x39,0x20,0x61,0x20,0x01,0x60,0x00,0x00,}}, +{ 0x870D, {0x21,0x80,0x21,0x80,0x79,0x80,0x7A,0x40,0x6F,0xE0,0x69,0x80,0x7F,0xE0,0x79,0x80,0x3B,0xC0,0x3D,0xA0,0xE9,0xA0,0x01,0x80,0x00,0x00,}}, +{ 0x8711, {0x00,0x60,0xF7,0x80,0x71,0xE0,0x75,0xE0,0x33,0xE0,0x38,0x00,0xC7,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x8712, {0x60,0x20,0x6E,0x40,0xF3,0x80,0xF4,0x80,0xF5,0xE0,0xFF,0x80,0xF3,0x80,0xEB,0x80,0x7F,0xE0,0x76,0xE0,0xCB,0x00,0x10,0xE0,0x00,0x00,}}, +{ 0x8718, {0x24,0x00,0x24,0x00,0xF7,0xE0,0xBA,0xA0,0xBA,0xA0,0xB2,0xA0,0xFF,0xA0,0xA2,0xA0,0x37,0xA0,0x3D,0xE0,0xC9,0xA0,0x10,0x00,0x00,0x00,}}, +{ 0x871A, {0x09,0x00,0x79,0xE0,0x39,0xC0,0x3D,0xC0,0xF9,0xE0,0x11,0x00,0x25,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x871C, {0x04,0x00,0x04,0x00,0x7F,0xE0,0xDE,0x40,0x74,0xC0,0x5F,0xA0,0x24,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x8725, {0x62,0x20,0x62,0x40,0xFF,0x80,0xFF,0x80,0xF7,0xE0,0xF7,0xC0,0xF7,0xC0,0xEB,0xC0,0x7B,0x40,0x73,0x40,0xD2,0x40,0x02,0x40,0x00,0x00,}}, +{ 0x8729, {0x30,0x00,0x33,0xE0,0x7A,0xA0,0x7B,0xE0,0x7B,0xA0,0x7B,0xE0,0x7A,0xA0,0x7B,0xE0,0x3B,0xE0,0x3F,0xE0,0x64,0x20,0x08,0x60,0x00,0x00,}}, +{ 0x8734, {0x20,0x00,0x23,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x69,0x00,0x7B,0xE0,0x75,0xA0,0x3A,0xA0,0x3C,0xA0,0xE1,0x20,0x00,0xC0,0x00,0x00,}}, +{ 0x8737, {0x21,0x80,0x23,0xC0,0x7F,0xA0,0x7F,0xE0,0x6B,0xC0,0x6F,0xE0,0x7A,0x40,0x77,0xA0,0x3A,0x80,0x3A,0xA0,0xE2,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x873B, {0x21,0x80,0x27,0xE0,0x7B,0xC0,0x7B,0xC0,0x6F,0xE0,0x68,0x00,0x7B,0xC0,0x7B,0xC0,0x3B,0xC0,0x3F,0xC0,0xE2,0x40,0x02,0xC0,0x00,0x00,}}, +{ 0x873F, {0x61,0x80,0x61,0x80,0xF7,0xE0,0xFE,0x00,0xF3,0xC0,0xF3,0xC0,0xF5,0xC0,0xFF,0xC0,0x73,0xC0,0x7B,0xA0,0xC5,0xA0,0x08,0xE0,0x00,0x00,}}, +{ 0x8749, {0x21,0x20,0x24,0xA0,0x7A,0xC0,0x6B,0xC0,0x6A,0xC0,0x6B,0xC0,0x7A,0xC0,0x73,0xC0,0x28,0x80,0x3F,0xE0,0xE0,0x80,0x00,0x80,0x00,0x00,}}, +{ 0x874B, {0x42,0x40,0x49,0x40,0xF7,0xC0,0xD5,0x40,0xD5,0x40,0xD7,0xC0,0xF5,0x40,0xE5,0x40,0x57,0xC0,0x75,0x40,0xC9,0x60,0x11,0x20,0x00,0x00,}}, +{ 0x874C, {0x61,0x40,0x62,0xC0,0xFE,0xC0,0xF2,0x40,0xFF,0x40,0xF2,0xC0,0xF6,0xC0,0xE7,0x60,0x7B,0xC0,0x7A,0x40,0xC2,0x40,0x02,0x40,0x00,0x00,}}, +{ 0x874E, {0x20,0x00,0x23,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x69,0x00,0x7B,0xE0,0x77,0xA0,0x3B,0xE0,0x3F,0xE0,0xE2,0x20,0x00,0xC0,0x00,0x00,}}, +{ 0x8753, {0x63,0x80,0x61,0x80,0xF2,0x80,0xF7,0xC0,0xF8,0x20,0xFE,0x40,0xFB,0xC0,0xEF,0xC0,0x7F,0x80,0x7F,0xC0,0xCB,0xC0,0x0B,0xC0,0x00,0x00,}}, +{ 0x8755, {0x10,0x40,0x18,0x40,0x25,0xE0,0x51,0x60,0xBD,0x60,0x25,0x60,0x3D,0x60,0x25,0xE0,0x3C,0x40,0x28,0x60,0x3C,0xD0,0x63,0x10,0x00,0x00,}}, +{ 0x8757, {0x21,0x00,0x23,0x00,0x7B,0xC0,0x7B,0xC0,0x6A,0x40,0x6B,0xC0,0x78,0x00,0x77,0xE0,0x3B,0xC0,0x3B,0xC0,0xEF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8759, {0x60,0x00,0x6F,0xE0,0xF7,0xC0,0xF7,0xC0,0xF7,0xC0,0xF4,0x00,0xF7,0xC0,0xE5,0xC0,0x7F,0xC0,0x7F,0xC0,0xD5,0xC0,0x04,0xC0,0x00,0x00,}}, +{ 0x875F, {0x20,0x00,0x27,0xE0,0x7F,0xE0,0x7F,0xE0,0x6F,0xE0,0x68,0x00,0x7B,0xC0,0x7A,0x40,0x3B,0xC0,0x3F,0xC0,0xE2,0x40,0x02,0xC0,0x00,0x00,}}, +{ 0x8760, {0x20,0x00,0x27,0xE0,0x7B,0x80,0x7B,0x80,0x6B,0x80,0x68,0x00,0x7F,0xC0,0x77,0x40,0x3F,0xC0,0x3D,0x40,0xE7,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x8763, {0x65,0x80,0x65,0x80,0xF5,0xE0,0xFF,0xE0,0xF7,0xE0,0xF4,0x40,0xF7,0x80,0xE5,0xC0,0x75,0xE0,0x79,0x80,0xC9,0x80,0x17,0x80,0x00,0x00,}}, +{ 0x8766, {0x20,0x00,0x26,0xC0,0xF6,0x40,0xB6,0x40,0xB6,0xC0,0xB4,0x00,0xF7,0xC0,0xA5,0xC0,0x37,0xC0,0x34,0x80,0xD4,0xC0,0x05,0x20,0x00,0x00,}}, +{ 0x8768, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0xA0,0x10,0x60,0x20,0x20,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3D,0xE0,0xE7,0x20,0x00,0x00,}}, +{ 0x876A, {0x20,0x00,0x23,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x68,0x00,0x7F,0xE0,0x72,0x00,0x3F,0xE0,0x3A,0xA0,0xE4,0xA0,0x01,0xC0,0x00,0x00,}}, +{ 0x876E, {0x22,0x00,0x22,0x00,0x7F,0xE0,0x7F,0xC0,0x6B,0xC0,0x6A,0x40,0x7B,0xC0,0x7B,0x00,0x3F,0xC0,0x3F,0x80,0xE3,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0x8774, {0x32,0x00,0x32,0xE0,0x7A,0xE0,0x7F,0xE0,0x7A,0xE0,0x7A,0xE0,0x7F,0xE0,0x75,0xE0,0x3F,0xA0,0x3F,0xA0,0x61,0x20,0x02,0x60,0x00,0x00,}}, +{ 0x8776, {0x22,0xC0,0x22,0xC0,0x7F,0xE0,0x6A,0xC0,0x6A,0xC0,0x6A,0x00,0x7B,0xE0,0x60,0x80,0x2F,0xE0,0x39,0xC0,0xEA,0xA0,0x00,0x80,0x00,0x00,}}, +{ 0x8778, {0x10,0x00,0x11,0xC0,0x3D,0xC0,0x3D,0xC0,0x35,0xC0,0x37,0xE0,0x3E,0x20,0x3B,0xE0,0x1F,0xE0,0x1F,0xE0,0x72,0x20,0x02,0x60,0x00,0x00,}}, +{ 0x877F, {0x20,0x00,0x23,0xC0,0x7B,0xC0,0x6A,0xC0,0x6B,0xC0,0x68,0x80,0x7B,0xC0,0x72,0xC0,0x2B,0xC0,0x3E,0xC0,0xE3,0xA0,0x00,0xE0,0x00,0x00,}}, +{ 0x8782, {0x64,0x00,0x65,0xC0,0xFF,0xC0,0xFB,0xC0,0xFF,0x80,0xFB,0xC0,0xFF,0xC0,0xEB,0xA0,0x7F,0xE0,0x7B,0xC0,0xCF,0x80,0x31,0x80,0x00,0x00,}}, +{ 0x878D, {0x01,0x00,0xFD,0x00,0x7B,0xC0,0x4B,0x40,0x7B,0x40,0x03,0x40,0xFF,0xC0,0xD7,0x00,0xFD,0x40,0xBD,0x40,0xA7,0xA0,0xAC,0x20,0x00,0x00,}}, +{ 0x879F, {0x20,0x00,0x27,0xE0,0x7F,0xC0,0x7B,0xC0,0x6B,0xC0,0x6A,0x40,0x7B,0xC0,0x71,0x80,0x3F,0xE0,0x3C,0x00,0xE2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x87A2, {0x21,0x80,0x7B,0xC0,0xB7,0x80,0x31,0xC0,0x4A,0x40,0x7F,0xE0,0x44,0x40,0xFF,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x87AB, {0x11,0x00,0x7D,0x00,0xFF,0xE0,0xFF,0x40,0x6A,0xC0,0xF9,0xC0,0x46,0x20,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x87AF, {0x21,0x00,0xF9,0x00,0xFF,0xE0,0xFE,0x80,0x39,0x80,0x29,0x80,0xDE,0x60,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0xF8,0x20,0x00,0x00,}}, +{ 0x87B3, {0x21,0x80,0x25,0xA0,0x7F,0xE0,0x7F,0xE0,0x6B,0xC0,0x6A,0x40,0x7B,0xC0,0x71,0x80,0x3B,0xC0,0x39,0x80,0xEF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x87BA, {0x20,0x00,0x23,0xC0,0x7B,0xC0,0x6B,0xC0,0x6B,0xC0,0x69,0x40,0x7A,0x80,0x71,0xC0,0x2F,0xE0,0x3B,0x40,0xE5,0x20,0x01,0x00,0x00,0x00,}}, +{ 0x87BB, {0x21,0x80,0x23,0xC0,0x7F,0xE0,0x7F,0xE0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x73,0xC0,0x3F,0xE0,0x3B,0x80,0xE3,0xC0,0x0E,0x20,0x00,0x00,}}, +{ 0x87BD, {0x04,0x00,0x0F,0x00,0x3E,0x00,0x1F,0x00,0xF2,0xE0,0x0E,0x00,0x21,0x80,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3D,0xE0,0xE7,0x20,0x00,0x00,}}, +{ 0x87C0, {0x21,0x80,0x21,0x80,0x7F,0xE0,0x7B,0xC0,0x6F,0xE0,0x69,0x80,0x7B,0xC0,0x7D,0xA0,0x3F,0xE0,0x3F,0xE0,0xE1,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x87C4, {0x21,0x00,0x7B,0x00,0xFF,0x80,0xFF,0x80,0xFF,0xA0,0x7A,0xA0,0x24,0x60,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0x78,0x40,0x00,0x00,}}, +{ 0x87C6, {0x21,0x80,0x23,0xC0,0x7F,0xE0,0x7B,0xC0,0x6A,0x40,0x6B,0xC0,0x7A,0x40,0x73,0xC0,0x3F,0xE0,0x3F,0xE0,0xE2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x87C7, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x08,0x00,0xFF,0xE0,0x35,0x80,0xFF,0xE0,0xBF,0xA0,0x07,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x87CB, {0x20,0xC0,0x27,0xC0,0x7B,0xC0,0x7F,0xE0,0x6B,0xC0,0x6B,0xC0,0x7D,0x20,0x71,0x00,0x3B,0x60,0x3B,0x20,0xE7,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x87D0, {0x25,0xA0,0x23,0xC0,0x7F,0xE0,0x7F,0xC0,0x6A,0x40,0x6B,0xC0,0x79,0x80,0x77,0xE0,0x3D,0xA0,0x3D,0xA0,0xE5,0xC0,0x01,0x80,0x00,0x00,}}, +{ 0x87D2, {0x21,0x80,0x23,0xC0,0x7F,0xE0,0x79,0x80,0x6F,0xE0,0x69,0x80,0x7A,0x40,0x75,0xA0,0x3F,0xE0,0x3F,0xE0,0xE2,0x80,0x04,0x80,0x00,0x00,}}, +{ 0x87E0, {0x20,0xC0,0x27,0xC0,0x7B,0xC0,0x7F,0xE0,0x6B,0xC0,0x6B,0xC0,0x7D,0xA0,0x73,0xC0,0x3B,0xC0,0x3F,0xC0,0xE3,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x87EF, {0x21,0x80,0x23,0xC0,0x7F,0xE0,0x7F,0xE0,0x6F,0xE0,0x6A,0x40,0x7B,0xE0,0x74,0x00,0x3F,0xE0,0x39,0xA0,0xE2,0xA0,0x0C,0x60,0x00,0x00,}}, +{ 0x87F2, {0x04,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0x78,0x40,0x21,0x80,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x3D,0xE0,0xE7,0x20,0x00,0x00,}}, +{ 0x87F6, {0x60,0x00,0x6F,0x80,0xF7,0xE0,0xF7,0xA0,0xF7,0xA0,0xFF,0xE0,0xF1,0xC0,0xE7,0x80,0x73,0xC0,0x73,0xC0,0xCF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x87F7, {0x25,0xA0,0x23,0xC0,0x7F,0xE0,0x7F,0xC0,0x6A,0x80,0x6B,0x80,0x78,0x00,0x77,0xC0,0x3F,0xC0,0x3F,0xC0,0xE7,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x87F9, {0x40,0x00,0x77,0xC0,0xFA,0x40,0xEE,0xC0,0x7B,0xC0,0x6D,0x00,0xFF,0xE0,0x8D,0x00,0x7F,0xC0,0x7F,0xC0,0x05,0x80,0xFE,0x40,0x00,0x00,}}, +{ 0x87FB, {0x22,0x80,0x2F,0xE0,0xF1,0x00,0xB7,0xC0,0xBF,0xE0,0xB3,0xC0,0xFE,0xA0,0xAF,0xE0,0x32,0xC0,0x3E,0xA0,0xC3,0x60,0x06,0x20,0x00,0x00,}}, +{ 0x87FE, {0x61,0x00,0x63,0x80,0xFF,0xE0,0xFF,0xE0,0xF6,0xE0,0xF5,0xC0,0xF7,0xE0,0xE5,0x80,0x7F,0xC0,0x7B,0xC0,0xD3,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x8805, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0xF7,0xC0,0xFB,0xC0,0xFF,0xC0,0xEB,0xC0,0x7F,0xC0,0x7B,0x80,0xC2,0x20,0x01,0xE0,0x00,0x00,}}, +{ 0x880D, {0x60,0x80,0x6F,0x80,0xFF,0x80,0xFF,0xE0,0xFF,0xE0,0xF4,0xC0,0xFF,0x80,0xED,0x80,0x7F,0xC0,0x7F,0xC0,0xCB,0x20,0x03,0x20,0x00,0x00,}}, +{ 0x880E, {0x21,0x80,0x27,0xE0,0x79,0x80,0x7F,0xE0,0x6B,0xC0,0x6B,0xC0,0x7F,0xE0,0x71,0x80,0x3F,0xE0,0x3F,0xE0,0xE4,0x40,0x08,0x40,0x00,0x00,}}, +{ 0x880F, {0x64,0x00,0x67,0xE0,0xFA,0xA0,0xFF,0xE0,0xFB,0x40,0xFB,0xC0,0xFF,0xE0,0xEB,0x40,0x7F,0xE0,0x7F,0xE0,0xD1,0x40,0x23,0x40,0x00,0x00,}}, +{ 0x8811, {0x62,0x80,0x67,0xE0,0xFB,0xC0,0xF7,0xC0,0xF9,0x20,0xF7,0xE0,0xF5,0xC0,0xE9,0x80,0x7F,0xE0,0x73,0xC0,0xCD,0xA0,0x01,0x80,0x00,0x00,}}, +{ 0x8815, {0x20,0x00,0x27,0xE0,0x7F,0xE0,0x7F,0xE0,0x6F,0xE0,0x6F,0xE0,0x7F,0xE0,0x71,0x80,0x3F,0xE0,0x3D,0xA0,0xE5,0xA0,0x04,0x60,0x00,0x00,}}, +{ 0x8816, {0x21,0x80,0x27,0xE0,0x7B,0xE0,0x7F,0xE0,0x6B,0xC0,0x6B,0xC0,0x7B,0x80,0x73,0xE0,0x3F,0xC0,0x3B,0x80,0xE3,0x80,0x0C,0x60,0x00,0x00,}}, +{ 0x8821, {0x10,0x00,0x1F,0x00,0xFF,0xE0,0xFF,0xE0,0x7F,0x80,0x77,0x80,0x7A,0x60,0x3D,0x80,0x7B,0xC0,0x7B,0xC0,0x39,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x8822, {0x04,0x00,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0x33,0x80,0xDF,0x60,0x1F,0x00,0x31,0x80,0x7B,0xC0,0x7B,0xC0,0x39,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x8823, {0x20,0x00,0x27,0xE0,0x7F,0xE0,0x7F,0xE0,0x6F,0xC0,0x6F,0xC0,0x7F,0xC0,0x77,0xC0,0x3F,0xE0,0x3F,0xE0,0xEC,0x20,0x14,0x60,0x00,0x00,}}, +{ 0x8827, {0x04,0x00,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0x9F,0x80,0x31,0x80,0xDF,0x80,0x31,0x80,0x7B,0xC0,0x7B,0xC0,0x39,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x8831, {0x04,0x00,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x31,0x80,0x7B,0xC0,0x7B,0xC0,0x39,0xC0,0xFF,0xA0,0x7F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8836, {0x00,0x00,0x7B,0xC0,0xFF,0xE0,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x7B,0xC0,0x7B,0xC0,0x39,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x8839, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0xE0,0x7F,0xC0,0x9F,0x80,0x69,0x80,0x3F,0x80,0x7B,0xC0,0x7B,0xC0,0x39,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x883B, {0x6E,0x80,0x7F,0xE0,0xFE,0xC0,0xFF,0xE0,0xFF,0xC0,0x7B,0xA0,0xEE,0xA0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x07,0xC0,0x78,0x40,0x00,0x00,}}, +{ 0x8840, {0x04,0x00,0x04,0x00,0x08,0x00,0x3F,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8842, {0x20,0x00,0x27,0xC0,0x79,0x40,0x7D,0x40,0x77,0x40,0x75,0x40,0x75,0xC0,0x75,0xC0,0x7E,0x60,0x7E,0x40,0xC4,0x40,0x08,0x80,0x00,0x00,}}, +{ 0x8844, {0x20,0x00,0x23,0xC0,0x79,0x40,0x7D,0x40,0x75,0x40,0x77,0xE0,0x75,0x40,0x75,0x40,0x7F,0x40,0x7F,0x40,0xC7,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8846, {0x04,0x00,0x08,0x00,0x3F,0x80,0x2A,0x80,0xFF,0xE0,0x01,0x00,0x26,0x40,0x5C,0x80,0x85,0x00,0x24,0x80,0xC4,0x60,0x04,0x00,0x00,0x00,}}, +{ 0x884C, {0x20,0x00,0x27,0xC0,0x40,0x00,0x10,0x00,0x3F,0xE0,0x20,0x80,0x60,0x80,0xA0,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x884D, {0x68,0x00,0x45,0xC0,0x84,0x00,0x30,0x00,0x2B,0xE0,0x68,0x80,0x60,0x80,0xE4,0x80,0x64,0x80,0x68,0x80,0x70,0x80,0x70,0x80,0x00,0x00,}}, +{ 0x8852, {0x68,0x00,0x48,0xC0,0x9E,0x00,0x3E,0x00,0x2B,0xE0,0x72,0x80,0x74,0x80,0xEC,0x80,0x6C,0x80,0x7E,0x80,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x8853, {0x24,0x00,0x46,0xE0,0x85,0x00,0x3F,0x00,0x25,0xE0,0x44,0x40,0x56,0x40,0xD5,0x40,0x55,0x40,0x54,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x8857, {0x24,0x00,0x45,0xE0,0x9E,0x00,0x24,0x00,0x3F,0xE0,0x44,0x40,0xC4,0x40,0x5F,0x40,0x44,0x40,0x46,0x40,0x58,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x8859, {0x60,0x00,0x7F,0xC0,0x9C,0x00,0x3E,0x00,0x2A,0xE0,0x7F,0x80,0x60,0x80,0xFE,0x80,0x72,0x80,0x7E,0x80,0x72,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x885B, {0x24,0x00,0x5E,0xC0,0x8A,0x00,0x3F,0xE0,0x3E,0x40,0x6A,0x40,0x6E,0x40,0xA4,0x40,0x2E,0x40,0x3F,0x40,0x24,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x885D, {0x23,0x00,0x5C,0xE0,0xBF,0x00,0x3F,0xE0,0x35,0x40,0x5F,0x40,0xD5,0x40,0x5F,0x40,0x44,0x40,0x4F,0x40,0x46,0x40,0x58,0xC0,0x00,0x00,}}, +{ 0x885E, {0x64,0x00,0x5F,0xE0,0x9F,0x00,0x3F,0x00,0x33,0xE0,0x7F,0x40,0x7F,0x40,0xE4,0x40,0x7F,0x40,0x75,0x40,0x77,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x8861, {0x28,0x00,0x4E,0xE0,0x94,0x00,0x3F,0xE0,0x35,0x40,0x5F,0x40,0xD5,0x40,0x5F,0x40,0x44,0x40,0x5F,0x40,0x4A,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x8862, {0x60,0x00,0x7B,0xE0,0xBB,0x80,0x3B,0x80,0x7B,0xE0,0x7B,0xC0,0x5F,0x40,0xF2,0x40,0x5F,0x40,0x5E,0x40,0x5F,0x40,0x50,0xC0,0x00,0x00,}}, +{ 0x8863, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0C,0x40,0x12,0x40,0x32,0x80,0xD1,0x00,0x11,0x00,0x14,0x80,0x18,0x40,0x60,0x20,0x00,0x00,}}, +{ 0x8868, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x08,0x80,0x12,0x80,0x33,0x00,0xD1,0x00,0x1C,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x886B, {0x20,0x80,0x20,0x80,0xF9,0x80,0xF9,0x40,0x16,0xC0,0x24,0x80,0x79,0x20,0xEB,0x20,0xA6,0x40,0x20,0x40,0x21,0x80,0x26,0x00,0x00,0x00,}}, +{ 0x8870, {0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x0C,0x00,0x34,0x80,0xD3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x8872, {0x31,0x80,0x30,0x80,0x7B,0xE0,0x7B,0xE0,0x16,0xA0,0x16,0xA0,0x3B,0xE0,0x7B,0x60,0x36,0x20,0x32,0x20,0x32,0x20,0x32,0x60,0x00,0x00,}}, +{ 0x8875, {0x30,0x00,0x33,0xE0,0x7A,0x20,0x7A,0x20,0x16,0x20,0x17,0xE0,0x3A,0x20,0x7A,0x20,0x36,0x20,0x32,0x20,0x33,0xE0,0x32,0x20,0x00,0x00,}}, +{ 0x8877, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x80,0x0C,0x40,0x33,0x80,0xD2,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x887D, {0x60,0x40,0x61,0x80,0xF7,0x80,0xF1,0x80,0x29,0x80,0x2F,0xE0,0x71,0x80,0xF1,0x80,0x69,0x80,0x61,0x80,0x67,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x887E, {0x04,0x00,0x0A,0x00,0xFF,0xE0,0xCE,0x60,0x3F,0x80,0x01,0x80,0x05,0x00,0xFF,0xE0,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x887F, {0x21,0x00,0x21,0x00,0xF3,0x80,0x12,0x80,0x2F,0xC0,0x28,0x20,0x70,0x00,0xB7,0xC0,0x28,0x80,0x20,0x80,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x8881, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x00,0x21,0x80,0x3F,0x00,0x0A,0x40,0xF2,0x40,0xD1,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x8882, {0x61,0x00,0x61,0x00,0xF7,0xC0,0xF7,0xC0,0x29,0x40,0x29,0x40,0x77,0xE0,0xF1,0x00,0x6B,0x80,0x62,0x80,0x64,0x40,0x68,0x20,0x00,0x00,}}, +{ 0x8888, {0x20,0x00,0x23,0xC0,0xFA,0x40,0x2A,0x40,0x4B,0xC0,0xB6,0x40,0x04,0x00,0xFF,0xE0,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x888B, {0x0A,0x80,0x12,0x40,0x7F,0xE0,0xA1,0x00,0x24,0xA0,0x24,0x40,0xFF,0xE0,0x0C,0x80,0x32,0x80,0xD3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x888D, {0x62,0x00,0x62,0x00,0xF7,0xC0,0xF7,0xC0,0x2F,0x40,0x2D,0xC0,0x75,0xC0,0xF7,0xC0,0x6C,0x80,0x64,0x20,0x64,0x20,0x63,0xE0,0x00,0x00,}}, +{ 0x8892, {0x60,0x00,0x67,0x80,0xF4,0x80,0xF4,0x80,0x2F,0x80,0x2C,0x80,0x74,0x80,0xF4,0x80,0x6F,0x80,0x60,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8896, {0x10,0x80,0x10,0x80,0x78,0x80,0x0B,0xE0,0x12,0xA0,0x16,0xA0,0x3A,0xA0,0x5B,0xE0,0x16,0xA0,0x12,0xA0,0x13,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x8897, {0x61,0x00,0x61,0x00,0xF3,0x80,0xF2,0x80,0x2C,0xC0,0x29,0x20,0x76,0x80,0xF1,0x00,0x6E,0x40,0x64,0x80,0x63,0x00,0x6C,0x00,0x00,0x00,}}, +{ 0x8899, {0x30,0x80,0x31,0x80,0x7B,0xE0,0x7B,0xE0,0x16,0x20,0x16,0x20,0x3B,0xE0,0x7A,0x20,0x36,0x20,0x32,0x20,0x33,0xE0,0x32,0x20,0x00,0x00,}}, +{ 0x889E, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x31,0xC0,0xFF,0xA0,0x21,0x80,0x21,0x80,0x3F,0x00,0xFA,0x40,0xF1,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88A2, {0x61,0x80,0x63,0xC0,0xF7,0xA0,0xF7,0xE0,0x29,0x80,0x29,0x80,0x77,0xE0,0xF1,0x80,0x69,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x88A4, {0x04,0x00,0xFF,0xE0,0x1F,0x00,0xFF,0xE0,0x0D,0xC0,0x34,0x00,0xCC,0x00,0x04,0x00,0xFF,0xE0,0xFF,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88AB, {0x21,0x00,0x21,0x00,0xF7,0xE0,0x15,0x20,0x2D,0x40,0x2F,0xC0,0x76,0x40,0xB6,0x80,0x29,0x80,0x29,0x80,0x36,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x88AE, {0x62,0x00,0x62,0x00,0xF2,0x00,0xF3,0xE0,0x2D,0x80,0x29,0x80,0x73,0x80,0xF3,0xC0,0x6F,0xE0,0x69,0xA0,0x61,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x88B0, {0x00,0x00,0x1F,0x80,0xFF,0xE0,0xFF,0xE0,0x22,0x80,0x3F,0xE0,0x05,0x00,0x04,0x00,0xFF,0xE0,0xFE,0x40,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88B1, {0x63,0x80,0x63,0xC0,0xF7,0xA0,0xF5,0x80,0x2F,0xE0,0x35,0x80,0x65,0x80,0xF5,0x80,0x75,0x80,0x66,0x40,0x66,0x40,0x64,0x20,0x00,0x00,}}, +{ 0x88B4, {0x20,0x80,0x20,0x80,0xF7,0xE0,0x12,0x40,0x2F,0xE0,0x28,0x00,0x77,0xE0,0xB1,0x00,0x2B,0xC0,0x20,0x40,0x20,0x40,0x20,0x80,0x00,0x00,}}, +{ 0x88B5, {0x62,0x00,0x62,0x60,0xF7,0x80,0xF4,0x80,0x2C,0x80,0x2C,0x80,0x77,0xE0,0xF4,0x80,0x6C,0x80,0x64,0x80,0x65,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x88B7, {0x21,0x00,0x21,0x00,0xFB,0x80,0x14,0x80,0x2F,0xC0,0x28,0x20,0x70,0x00,0xB7,0x80,0x2C,0x80,0x24,0x80,0x27,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x88BF, {0x61,0x00,0x63,0x00,0xF7,0xC0,0xF1,0x00,0x2F,0xE0,0x29,0x00,0x71,0x00,0xF7,0xC0,0x69,0x00,0x61,0x00,0x6F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x88C1, {0x22,0x00,0x7A,0x80,0x22,0x40,0xFF,0xE0,0x21,0x00,0xFD,0x40,0x31,0x40,0x54,0x80,0xD8,0x80,0x59,0xA0,0x66,0x60,0xC0,0x20,0x00,0x00,}}, +{ 0x88C2, {0x00,0x40,0x7F,0x40,0x11,0x40,0x3D,0x40,0x69,0x40,0x35,0x40,0x64,0xC0,0xFF,0xE0,0x0C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88C3, {0x61,0x00,0x61,0x00,0xF1,0xC0,0xF1,0x00,0x2F,0xE0,0x28,0x00,0x77,0xE0,0xF1,0x00,0x69,0xC0,0x61,0x00,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x88C4, {0x62,0x00,0x62,0xC0,0xFC,0x00,0xFA,0x00,0x23,0xE0,0x34,0x80,0x64,0x80,0xFC,0x80,0x74,0x80,0x64,0x80,0x64,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x88C5, {0x11,0x00,0x51,0x00,0x1F,0xE0,0x31,0x00,0xD7,0xC0,0x14,0x00,0x04,0x00,0xFF,0xE0,0x32,0x80,0xD3,0x80,0x1D,0x80,0x20,0x60,0x00,0x00,}}, +{ 0x88CF, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0xF3,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88D4, {0x04,0x00,0xFF,0xE0,0x1A,0x40,0xF1,0x80,0x1D,0x80,0x60,0x60,0x7F,0xC0,0x52,0xC0,0x7F,0xC0,0x5F,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x88D5, {0x22,0x80,0x22,0x80,0xFC,0x40,0x11,0x00,0x2B,0x00,0x32,0x80,0x64,0x40,0xBF,0xC0,0x34,0xA0,0x24,0x80,0x27,0x80,0x24,0x80,0x00,0x00,}}, +{ 0x88D8, {0x04,0x80,0xFF,0xE0,0x64,0xC0,0x7F,0x80,0x34,0xC0,0xCC,0x20,0x04,0x00,0xFF,0xE0,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88D9, {0x60,0x00,0x67,0xC0,0xF1,0x40,0xFF,0xE0,0x23,0x40,0x2F,0xC0,0x72,0x00,0xF3,0xC0,0x6E,0x40,0x7A,0x40,0x63,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x88DC, {0x21,0x80,0x21,0x40,0xFF,0xE0,0x1F,0xC0,0x29,0x40,0x39,0x40,0x6F,0xC0,0xB9,0x40,0x3F,0xC0,0x29,0x40,0x29,0x40,0x29,0xC0,0x00,0x00,}}, +{ 0x88DD, {0x51,0x00,0x53,0x00,0x7F,0xE0,0xF1,0x00,0xD7,0xC0,0x94,0x00,0x04,0x00,0xFF,0xE0,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88DF, {0x21,0x00,0x25,0x40,0x85,0x20,0x4B,0x60,0x21,0x80,0x2E,0x00,0x44,0x00,0xFF,0xE0,0x1A,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88E1, {0x20,0x00,0x2F,0xC0,0xF9,0x40,0x1F,0xC0,0x29,0x40,0x39,0x40,0x6F,0xC0,0xB1,0x00,0x2F,0xC0,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x88E8, {0x61,0x00,0x62,0x00,0xF7,0xC0,0xF5,0x40,0x2F,0xC0,0x2D,0x40,0x77,0xC0,0xF3,0x80,0xEF,0xE0,0x67,0xE0,0x60,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x88F2, {0x60,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x2F,0xC0,0x3B,0xC0,0x6B,0xC0,0xFB,0xC0,0x7D,0x40,0x69,0x40,0x69,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x88F3, {0x24,0x80,0x15,0x00,0x7F,0xE0,0x9F,0x20,0x11,0x00,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x1A,0x80,0xF3,0x00,0x1D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x88F4, {0x09,0x00,0xF9,0xE0,0x79,0xC0,0x7D,0xC0,0xF9,0xE0,0x11,0x00,0x25,0x00,0xFF,0xE0,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88F8, {0x20,0x00,0x2F,0xC0,0xF9,0x40,0x1F,0xC0,0x29,0x40,0x3F,0xC0,0x61,0x00,0xBF,0xE0,0x33,0x80,0x25,0x40,0x39,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x88F9, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x35,0x80,0x3F,0x80,0xFF,0xE0,0x45,0xC0,0x9F,0x60,0xF3,0x00,0x1D,0x80,0x20,0x60,0x00,0x00,}}, +{ 0x88FC, {0x60,0x00,0x67,0xC0,0xF7,0xC0,0xF7,0xC0,0x2F,0xC0,0x2A,0x00,0x73,0xE0,0xF5,0xA0,0x6A,0xA0,0x64,0xA0,0x61,0x20,0x60,0xC0,0x00,0x00,}}, +{ 0x88FD, {0x50,0x40,0x7D,0x40,0x91,0x40,0xFF,0x40,0x53,0x40,0x5C,0xC0,0x04,0x00,0xFF,0xE0,0x18,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x88FE, {0x20,0x00,0x27,0xC0,0xF4,0x40,0x17,0xC0,0x24,0x80,0x2F,0xE0,0x74,0x80,0xB4,0x80,0x2B,0xC0,0x2A,0x40,0x33,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x8902, {0x62,0x80,0x62,0x80,0xFF,0x80,0xF2,0x80,0x2F,0xC0,0x32,0xA0,0x62,0xA0,0xFF,0x80,0xF2,0x80,0x63,0x80,0x6E,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8904, {0x61,0x00,0x6F,0xE0,0xF7,0xC0,0xF7,0xC0,0x2F,0xE0,0x31,0x40,0x67,0xC0,0xF3,0x00,0xFF,0xE0,0x67,0x80,0x63,0x80,0x6E,0x40,0x00,0x00,}}, +{ 0x8907, {0x24,0x00,0x24,0x00,0xFF,0xE0,0x17,0x80,0x2F,0x80,0x2C,0x80,0x77,0x80,0xB2,0x00,0x2F,0x80,0x2B,0x00,0x26,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x890A, {0x30,0x60,0x37,0x80,0x7F,0xE0,0x7F,0xE0,0x17,0xE0,0x1C,0x00,0x37,0xE0,0x7D,0xE0,0x7F,0xE0,0x3F,0xE0,0x35,0xE0,0x34,0x60,0x00,0x00,}}, +{ 0x890C, {0x60,0x00,0x6F,0xE0,0xFF,0xE0,0xFF,0xE0,0x2F,0xC0,0x35,0x40,0x67,0xC0,0xF7,0x40,0xF7,0xC0,0x6F,0xE0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x8910, {0x10,0x00,0x13,0xC0,0x7A,0x40,0x0B,0xC0,0x17,0xC0,0x19,0x00,0x33,0xE0,0x5E,0xA0,0x1B,0x20,0x12,0x20,0x11,0xA0,0x10,0xC0,0x00,0x00,}}, +{ 0x8912, {0x04,0x00,0xFF,0xE0,0x27,0x80,0x27,0x80,0xFF,0xE0,0x65,0x80,0x79,0x60,0x05,0x00,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x20,0x60,0x00,0x00,}}, +{ 0x8913, {0x62,0x00,0x63,0xC0,0xF7,0x40,0xF5,0x40,0x2D,0xC0,0x35,0x80,0x67,0xE0,0xF5,0x80,0x77,0xC0,0x65,0xA0,0x65,0x80,0x65,0x80,0x00,0x00,}}, +{ 0x891D, {0x62,0x40,0x69,0x40,0xF5,0x80,0xF7,0xC0,0x2F,0x40,0x37,0xC0,0x65,0x40,0xF7,0xC0,0xFF,0xE0,0x6F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x891E, {0x60,0x00,0x67,0x80,0xF5,0x80,0xF7,0x80,0x2C,0x80,0x37,0x80,0x60,0x00,0xFF,0xC0,0x6B,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8925, {0x60,0x00,0x6F,0xE0,0xFB,0xC0,0xFF,0xE0,0x2B,0xC0,0x3B,0x80,0x6E,0x60,0xF8,0xC0,0x7F,0xE0,0x7A,0x80,0x70,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x892A, {0x68,0x00,0x65,0xC0,0xF5,0x40,0xF9,0xC0,0x25,0x40,0x35,0xE0,0x61,0x20,0xFD,0xC0,0x75,0xE0,0x67,0xA0,0x6B,0x00,0x71,0xE0,0x00,0x00,}}, +{ 0x892B, {0x60,0xC0,0x6F,0x80,0xF9,0xC0,0xFB,0xE0,0x2B,0xC0,0x3B,0xA0,0x6A,0xE0,0xFB,0x80,0xEF,0x80,0x75,0xA0,0x7A,0xA0,0x64,0x60,0x00,0x00,}}, +{ 0x8936, {0x60,0x00,0x6F,0xE0,0xF7,0x60,0xFF,0xE0,0x27,0xE0,0x39,0xA0,0x62,0x00,0xF7,0xC0,0xF7,0xC0,0x67,0xC0,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x8938, {0x61,0x00,0x67,0xC0,0xFF,0xE0,0xFF,0xE0,0x27,0xC0,0x37,0xC0,0x65,0x40,0xF7,0xC0,0x7F,0xE0,0x67,0x80,0x63,0x80,0x6E,0x40,0x00,0x00,}}, +{ 0x893B, {0x04,0x00,0xFF,0xE0,0x7B,0x80,0xFF,0x80,0xF7,0x80,0xAD,0x80,0x79,0xA0,0x3A,0xE0,0x4E,0x60,0xFB,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x8941, {0x41,0x80,0x5D,0xC0,0xE7,0xE0,0xFF,0xE0,0x73,0xC0,0x73,0xC0,0x7F,0xC0,0xF7,0xC0,0x47,0xC0,0x45,0xC0,0x47,0xE0,0x58,0x20,0x00,0x00,}}, +{ 0x8943, {0x04,0x00,0xFF,0xE0,0x73,0xC0,0x63,0xC0,0x77,0xE0,0x41,0x80,0x77,0xE0,0x44,0x80,0x1C,0x80,0xF3,0x00,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x8944, {0x04,0x00,0xFF,0xE0,0x7B,0x80,0x7B,0x80,0x13,0x00,0x7F,0xC0,0x3F,0x80,0x13,0x00,0xFF,0xE0,0xFB,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x894C, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFC,0xC0,0x2F,0x80,0x35,0x80,0x67,0x80,0xF7,0x80,0xF7,0x80,0x7F,0xE0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x894D, {0x62,0x80,0x63,0x80,0xFF,0xE0,0xFF,0xC0,0x2F,0xC0,0x35,0x80,0x67,0xE0,0xF3,0x00,0x7F,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x8956, {0x41,0x00,0x42,0x00,0xFF,0xC0,0x1F,0xC0,0x2F,0xC0,0x7B,0xC0,0x6D,0xC0,0xBB,0x40,0xBF,0xE0,0x23,0x00,0x2C,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x895E, {0x01,0x80,0x7F,0xE0,0x7A,0x40,0x7F,0xE0,0x79,0x80,0xEF,0xE0,0x79,0x80,0x65,0x80,0xFF,0xE0,0xFB,0x80,0x1D,0x80,0x60,0x60,0x00,0x00,}}, +{ 0x895F, {0x22,0x80,0x22,0x80,0xFF,0xE0,0x17,0xC0,0x2B,0xA0,0x72,0x80,0x67,0xC0,0xB0,0x00,0x3F,0xE0,0x25,0x40,0x29,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x8960, {0x69,0x40,0x67,0xC0,0xFF,0xE0,0xFF,0xC0,0x2C,0x80,0x37,0x80,0x60,0x00,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x6F,0xC0,0x68,0x40,0x00,0x00,}}, +{ 0x8964, {0x60,0x80,0x6F,0x80,0xFE,0xE0,0xFF,0xE0,0x2F,0x00,0x3B,0xC0,0x6F,0x00,0xF0,0x00,0x7F,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8966, {0x60,0x00,0x6F,0xC0,0xFF,0xE0,0xFF,0xE0,0x2D,0xC0,0x3D,0xC0,0x6F,0xC0,0xF2,0x00,0xFF,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x00,0x00,}}, +{ 0x896A, {0x63,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x2F,0xC0,0x31,0xC0,0x6F,0xE0,0xF9,0xC0,0xFE,0xC0,0x68,0xA0,0x73,0x60,0x60,0x20,0x00,0x00,}}, +{ 0x896D, {0x64,0x00,0x65,0xE0,0xFF,0x80,0xFF,0xC0,0x25,0xC0,0x3F,0xC0,0x61,0xC0,0xFF,0xC0,0xFB,0xC0,0x6E,0xC0,0x6A,0xA0,0x61,0x20,0x00,0x00,}}, +{ 0x896F, {0x60,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x3B,0xC0,0x3F,0xC0,0x65,0xC0,0xFF,0xC0,0xFF,0x80,0x7D,0xA0,0x65,0xA0,0x66,0x60,0x00,0x00,}}, +{ 0x8972, {0x22,0x00,0xFB,0xE0,0x53,0xC0,0xFC,0x40,0x7B,0xC0,0x4B,0x80,0x7B,0xA0,0x4D,0xE0,0xFF,0xE0,0x32,0xC0,0xD9,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x8974, {0x40,0x00,0x5F,0xE0,0xFF,0xE0,0xFF,0xE0,0x7F,0xE0,0x71,0x20,0x7F,0xE0,0xF7,0xA0,0x57,0xA0,0x57,0xA0,0x5F,0xE0,0x51,0x60,0x00,0x00,}}, +{ 0x8977, {0x62,0x00,0x67,0xC0,0xFF,0xC0,0xFF,0xC0,0x2B,0xC0,0x3F,0xE0,0x65,0x80,0xFB,0x40,0xF7,0xA0,0x6F,0xC0,0x63,0x00,0x63,0x00,0x00,0x00,}}, +{ 0x897E, {0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x53,0x40,0x51,0x40,0x51,0x40,0x5F,0x40,0x50,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,}}, +{ 0x897F, {0x00,0x00,0xFF,0xE0,0x12,0x00,0x12,0x00,0x7F,0xC0,0x52,0x40,0x52,0x40,0x62,0xC0,0x63,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x8981, {0x00,0x00,0xFF,0xE0,0x0A,0x00,0x3F,0x80,0x2A,0x80,0x3F,0x80,0x08,0x00,0xFF,0xE0,0x11,0x00,0x3E,0x00,0x0D,0x80,0x70,0x40,0x00,0x00,}}, +{ 0x8983, {0x00,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x5F,0x40,0x3F,0x00,0x21,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8986, {0x00,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x24,0x00,0x47,0xE0,0xAF,0x80,0x77,0x80,0xA3,0x00,0x2F,0x80,0x23,0x80,0x3C,0xE0,0x00,0x00,}}, +{ 0x8987, {0x00,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0x80,0x50,0x00,0xFF,0xC0,0x72,0x40,0x7B,0xC0,0x7A,0x40,0xFF,0xC0,0x34,0x40,0x28,0xC0,0x00,0x00,}}, +{ 0x8988, {0x00,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x33,0x00,0x79,0x00,0x4B,0xE0,0x7A,0x80,0xFF,0x80,0xF9,0x80,0x49,0x80,0xB6,0x60,0x00,0x00,}}, +{ 0x898A, {0x00,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x53,0xE0,0xFF,0x80,0x73,0xC0,0x7B,0xC0,0x7B,0xE0,0xFF,0xE0,0x37,0xE0,0x28,0xC0,0x00,0x00,}}, +{ 0x898B, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x0A,0x00,0x12,0x20,0x22,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x898F, {0x20,0x00,0x27,0xC0,0x7C,0x40,0x27,0xC0,0x27,0xC0,0xFC,0x40,0x27,0xC0,0x23,0x40,0x37,0x00,0x55,0x20,0x49,0x20,0x90,0xE0,0x00,0x00,}}, +{ 0x8993, {0x01,0xC0,0x7F,0xC0,0x44,0x60,0x9F,0x20,0x31,0x80,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0x80,0x1F,0x20,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x8996, {0x20,0x00,0x27,0xC0,0xF4,0x40,0x17,0xC0,0x24,0x40,0x27,0xC0,0x64,0x40,0x77,0xC0,0xB2,0x80,0x24,0xA0,0x28,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x8997, {0x00,0x00,0xFB,0xC0,0x0A,0x40,0xFB,0xC0,0x0A,0x40,0x6B,0xC0,0x6A,0x40,0x6B,0xC0,0x69,0x80,0x09,0xA0,0x0A,0xA0,0x34,0x60,0x00,0x00,}}, +{ 0x8998, {0x60,0x00,0x67,0x80,0x7C,0x80,0x7F,0x80,0x64,0x80,0xF7,0x80,0x94,0x80,0x97,0x80,0xF3,0x80,0xF5,0xA0,0x09,0xA0,0x30,0xE0,0x00,0x00,}}, +{ 0x899A, {0x28,0x80,0x15,0x00,0x7F,0xE0,0xBF,0xA0,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x0A,0x20,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x89A1, {0x00,0x00,0x03,0xC0,0xFE,0x40,0x2B,0xC0,0x6A,0x40,0x6B,0xC0,0x6A,0x40,0xFF,0xC0,0xB5,0x80,0x3A,0xA0,0xE4,0xA0,0x18,0x60,0x00,0x00,}}, +{ 0x89A6, {0x38,0x00,0x19,0xC0,0x27,0x40,0x7F,0xC0,0x83,0x40,0x6B,0xC0,0x6B,0x40,0x7B,0xC0,0x75,0x80,0x7F,0xA0,0x6B,0xA0,0x6A,0x60,0x00,0x00,}}, +{ 0x89A7, {0x01,0x00,0xFB,0xE0,0xF4,0x00,0xF1,0xC0,0xF8,0x00,0xBF,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1A,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x89A9, {0x20,0x00,0x37,0xC0,0x7E,0x40,0x2B,0xC0,0xFE,0x40,0x33,0xC0,0x6A,0x40,0xFB,0xC0,0xF9,0x80,0x7A,0xA0,0x7C,0xA0,0x68,0x60,0x00,0x00,}}, +{ 0x89AA, {0x20,0x00,0x23,0xC0,0xFA,0x40,0x53,0xC0,0xFA,0x40,0x23,0xC0,0xFE,0x40,0x33,0xC0,0x69,0x80,0xA2,0xA0,0x24,0xA0,0x28,0xE0,0x00,0x00,}}, +{ 0x89AC, {0x20,0x00,0x6B,0xC0,0x7A,0x40,0x7B,0xC0,0xFE,0x40,0x03,0xC0,0x7A,0x40,0x4B,0xC0,0x79,0x80,0x59,0xA0,0x7A,0xA0,0xC4,0x60,0x00,0x00,}}, +{ 0x89AF, {0x70,0x00,0xFF,0xC0,0x7A,0x40,0x7B,0xC0,0xFE,0x40,0x23,0xC0,0x7A,0x40,0x7B,0xC0,0x79,0x80,0xFD,0xA0,0xCA,0xA0,0x5C,0x60,0x00,0x00,}}, +{ 0x89B2, {0x70,0x00,0xFF,0xC0,0x72,0x40,0x33,0xC0,0x7A,0x40,0x6B,0xC0,0x7A,0x40,0x33,0xC0,0x79,0x80,0x79,0xA0,0x32,0xA0,0xE4,0x60,0x00,0x00,}}, +{ 0x89B3, {0x40,0x00,0x43,0xC0,0x7A,0x40,0xA3,0xC0,0xFE,0x40,0x53,0xC0,0x7A,0x40,0xF3,0xC0,0x79,0x80,0x72,0xA0,0x7C,0xA0,0x48,0x60,0x00,0x00,}}, +{ 0x89BA, {0x12,0x00,0x6F,0x80,0x6A,0x80,0x65,0x80,0x6A,0x80,0x7F,0xE0,0x7F,0xC0,0xB1,0x80,0x3F,0x80,0x3F,0xA0,0x1B,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x89BD, {0x02,0x00,0xFB,0xE0,0xFF,0xC0,0xFF,0xE0,0xB7,0xE0,0xFF,0xE0,0xBF,0x80,0x31,0x80,0x3F,0x80,0x3F,0xA0,0x1A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x89BF, {0x20,0x00,0xFD,0xC0,0xF9,0x40,0xFD,0xC0,0xFD,0x40,0x79,0xC0,0x49,0x40,0x79,0xC0,0x79,0x80,0x79,0xA0,0x72,0xA0,0xCC,0x60,0x00,0x00,}}, +{ 0x89C0, {0x70,0x00,0xFD,0xC0,0xF9,0x40,0xFD,0xC0,0xFD,0x40,0x71,0xC0,0x7D,0x40,0xD1,0xC0,0x7D,0x80,0x79,0xA0,0x7E,0xA0,0x44,0x60,0x00,0x00,}}, +{ 0x89D2, {0x04,0x00,0x0F,0x80,0x31,0x00,0x1F,0xC0,0x12,0x40,0x1F,0xC0,0x12,0x40,0x12,0x40,0x1F,0xC0,0x10,0x40,0x20,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x89DA, {0x60,0x40,0x79,0x80,0x97,0x80,0xFD,0x80,0x7D,0x80,0x6D,0x80,0x7D,0x80,0x7D,0x80,0x7D,0xC0,0x4D,0xC0,0x4E,0xE0,0x98,0x20,0x00,0x00,}}, +{ 0x89DC, {0x22,0x00,0x7E,0xC0,0x7F,0x20,0xFF,0xE0,0x1F,0x00,0x22,0x00,0xFF,0x80,0x34,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x89DD, {0x60,0x40,0x78,0x80,0x93,0x80,0xFB,0x80,0x7B,0xE0,0x6B,0x80,0x7A,0x80,0x7A,0x80,0x7F,0xE0,0x4C,0x60,0x4F,0xE0,0x98,0x20,0x00,0x00,}}, +{ 0x89E3, {0x40,0x00,0x77,0xC0,0xA2,0x40,0xFC,0xC0,0x6A,0x80,0x7B,0xC0,0x6C,0x80,0x78,0x80,0x4F,0xE0,0x48,0x80,0x48,0x80,0x98,0x80,0x00,0x00,}}, +{ 0x89E6, {0x20,0x80,0x78,0x80,0x93,0xC0,0x7A,0xC0,0x6A,0xC0,0x7A,0xC0,0x6A,0xC0,0x7B,0xC0,0x48,0x80,0x48,0xC0,0x48,0xA0,0x9B,0x20,0x00,0x00,}}, +{ 0x89E7, {0x62,0x40,0x79,0x40,0x97,0xE0,0xFF,0xE0,0x79,0x80,0x6B,0xC0,0x79,0x80,0x79,0x80,0x7F,0xE0,0x49,0x80,0x49,0x80,0x99,0x80,0x00,0x00,}}, +{ 0x89F4, {0x61,0x00,0x7B,0x00,0x97,0xE0,0xFF,0x80,0x7B,0x80,0x6A,0x80,0x7B,0x80,0x7F,0xE0,0x7F,0xC0,0x4F,0xC0,0x4F,0x40,0x99,0x80,0x00,0x00,}}, +{ 0x89F8, {0x30,0x00,0x3F,0xE0,0x4B,0xE0,0x7F,0xE0,0x3D,0xE0,0x36,0xA0,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x24,0xE0,0x27,0x20,0x4C,0x40,0x00,0x00,}}, +{ 0x8A00, {0x00,0x00,0x3F,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x8A02, {0x00,0x00,0x70,0x00,0xFF,0xE0,0x01,0x00,0x71,0x00,0x01,0x00,0x71,0x00,0x01,0x00,0x71,0x00,0x51,0x00,0x71,0x00,0x53,0x00,0x00,0x00,}}, +{ 0x8A03, {0x01,0x80,0x79,0x80,0xF9,0x80,0xF9,0x80,0x79,0x80,0x01,0xC0,0x79,0xA0,0x01,0xA0,0x79,0x80,0x49,0x80,0x79,0x80,0x49,0x80,0x00,0x00,}}, +{ 0x8A08, {0x01,0x00,0x71,0x00,0xF9,0x00,0x07,0xE0,0x71,0x00,0x01,0x00,0x71,0x00,0x01,0x00,0x71,0x00,0x51,0x00,0x71,0x00,0x51,0x00,0x00,0x00,}}, +{ 0x8A0A, {0x00,0x00,0x77,0x80,0xFA,0x80,0x02,0x80,0x72,0x80,0x02,0x80,0x73,0x80,0x06,0x80,0x72,0x80,0x54,0xA0,0x74,0x60,0x48,0x20,0x00,0x00,}}, +{ 0x8A0C, {0x00,0x00,0x77,0xC0,0xF9,0x00,0xF9,0x00,0x71,0x00,0x01,0x00,0x71,0x00,0x01,0x00,0x71,0x00,0x51,0x00,0x7F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x8A0E, {0x00,0x80,0x70,0x80,0xF8,0x80,0x07,0xE0,0x70,0x80,0x04,0x80,0x72,0x80,0x02,0x80,0x70,0x80,0x50,0x80,0x70,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x8A10, {0x00,0x00,0x73,0xC0,0xF9,0x80,0xF9,0x80,0x71,0x80,0x07,0xE0,0x71,0x80,0x01,0x80,0x71,0x80,0x51,0x80,0x71,0x80,0x51,0x80,0x00,0x00,}}, +{ 0x8A13, {0x00,0x20,0x3D,0x20,0x7D,0xA0,0x01,0xA0,0x3D,0xA0,0x01,0xA0,0x3D,0xA0,0x01,0xA0,0x3D,0xA0,0x26,0x20,0x3E,0x20,0x24,0x20,0x00,0x00,}}, +{ 0x8A16, {0x02,0x00,0x72,0x00,0xFB,0xE0,0xFF,0xE0,0x7F,0xC0,0x00,0x80,0x71,0x00,0x03,0x00,0x76,0x00,0x54,0x20,0x74,0x20,0x53,0xE0,0x00,0x00,}}, +{ 0x8A17, {0x00,0x40,0x71,0x80,0xFF,0x00,0x01,0x00,0x71,0x00,0x01,0xE0,0x77,0x00,0x01,0x00,0x71,0x00,0x51,0x20,0x71,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x8A18, {0x78,0x00,0x03,0xC0,0xF8,0x40,0x00,0x40,0x7B,0xC0,0x02,0x40,0x7A,0x00,0x02,0x00,0x7A,0x00,0x4A,0x20,0x7A,0x20,0x49,0xE0,0x00,0x00,}}, +{ 0x8A1B, {0x03,0x80,0x73,0x80,0xFB,0x80,0xFD,0xA0,0x75,0xC0,0x0D,0xC0,0x75,0x80,0x05,0x80,0x75,0x80,0x55,0xA0,0x75,0xA0,0x54,0xE0,0x00,0x00,}}, +{ 0x8A1D, {0x00,0x00,0x77,0xC0,0xF8,0x80,0xFA,0x80,0x72,0x80,0x0F,0xE0,0x71,0x80,0x01,0x80,0x72,0x80,0x54,0x80,0x78,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x8A1F, {0x01,0x80,0x72,0x80,0xFA,0x80,0x02,0x80,0x74,0x40,0x05,0x40,0x79,0x20,0x02,0x00,0x72,0x80,0x54,0x80,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x8A23, {0x01,0x00,0x71,0x00,0xF1,0x00,0x0F,0xC0,0x71,0x40,0x01,0x40,0x7F,0xE0,0x03,0x00,0x72,0x80,0x54,0x80,0x78,0x40,0x50,0x20,0x00,0x00,}}, +{ 0x8A25, {0x01,0x80,0x38,0x80,0x7F,0xE0,0x7F,0xE0,0x3A,0xA0,0x02,0xA0,0x3A,0xE0,0x03,0x60,0x3B,0x20,0x2A,0x20,0x3A,0x20,0x2A,0x60,0x00,0x00,}}, +{ 0x8A2A, {0x01,0x00,0x71,0x00,0xF9,0x00,0x0F,0xE0,0x71,0x00,0x01,0xC0,0x71,0x40,0x02,0x40,0x72,0x40,0x54,0x40,0x78,0x40,0x50,0x80,0x00,0x00,}}, +{ 0x8A2D, {0x00,0x00,0x73,0x80,0xFA,0x80,0x02,0xA0,0x74,0x60,0x08,0x00,0x77,0xC0,0x02,0x40,0x72,0x80,0x51,0x00,0x72,0x80,0x4C,0x60,0x00,0x00,}}, +{ 0x8A31, {0x02,0x00,0x72,0x00,0xFF,0xC0,0x05,0x00,0x79,0x00,0x01,0x00,0x7F,0xE0,0x01,0x00,0x71,0x00,0x51,0x00,0x71,0x00,0x51,0x00,0x00,0x00,}}, +{ 0x8A33, {0x00,0x00,0x73,0xC0,0xFA,0x40,0x02,0x40,0x73,0xC0,0x03,0x40,0x73,0x00,0x03,0x00,0x72,0x80,0x54,0x80,0x78,0x40,0x50,0x20,0x00,0x00,}}, +{ 0x8A34, {0x00,0x40,0x71,0x80,0xFA,0x00,0x02,0x00,0x73,0xE0,0x02,0x80,0x72,0x80,0x02,0xC0,0x74,0xA0,0x54,0x80,0x78,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x8A36, {0x00,0x00,0x77,0xE0,0xF8,0x40,0xFF,0x40,0x75,0xC0,0x05,0xC0,0x75,0xC0,0x07,0xC0,0x74,0x40,0x50,0x40,0x70,0x40,0x50,0xC0,0x00,0x00,}}, +{ 0x8A3A, {0x01,0x00,0x71,0x00,0xFB,0x80,0x02,0x80,0x74,0xC0,0x09,0x20,0x76,0x80,0x01,0x00,0x76,0x20,0x50,0x40,0x71,0x80,0x4E,0x00,0x00,0x00,}}, +{ 0x8A3B, {0x02,0x00,0x71,0x00,0xFF,0xE0,0x01,0x00,0x71,0x00,0x01,0x00,0x7F,0xC0,0x01,0x00,0x71,0x00,0x51,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x8A3C, {0x00,0x00,0x77,0xE0,0xF8,0x80,0x02,0x80,0x72,0x80,0x02,0xC0,0x72,0x80,0x02,0x80,0x72,0x80,0x52,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x8A41, {0x01,0x80,0x71,0x80,0xFF,0xE0,0xFF,0xE0,0x71,0x80,0x01,0x80,0x73,0xC0,0x02,0x40,0x72,0x40,0x52,0x40,0x73,0xC0,0x52,0x40,0x00,0x00,}}, +{ 0x8A46, {0x00,0x40,0x71,0x80,0xFF,0x80,0xFD,0x80,0x77,0xE0,0x05,0x80,0x74,0x80,0x04,0x80,0x7E,0x80,0x58,0x60,0x7F,0x60,0x50,0x20,0x00,0x00,}}, +{ 0x8A48, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x00,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x8A50, {0x02,0x00,0x72,0x00,0xFB,0xE0,0x05,0x00,0x75,0x00,0x09,0xE0,0x71,0x00,0x01,0x00,0x71,0xE0,0x51,0x00,0x71,0x00,0x51,0x00,0x00,0x00,}}, +{ 0x8A51, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x0F,0xE0,0x7A,0x00,0x02,0x00,0x72,0xC0,0x03,0x00,0x72,0x00,0x52,0x20,0x72,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x8A52, {0x01,0x80,0x71,0x80,0xF9,0x80,0xF9,0x40,0x72,0x40,0x0F,0xA0,0x70,0x20,0x03,0xC0,0x72,0x40,0x52,0x40,0x73,0xC0,0x52,0x40,0x00,0x00,}}, +{ 0x8A54, {0x00,0x00,0x3B,0xE0,0x7C,0xA0,0x00,0xA0,0x39,0x20,0x02,0x40,0x3C,0x00,0x03,0xE0,0x3A,0x20,0x2A,0x20,0x3B,0xE0,0x22,0x20,0x00,0x00,}}, +{ 0x8A55, {0x00,0x00,0x77,0xE0,0xF8,0x80,0x04,0xA0,0x72,0xC0,0x00,0x80,0x7F,0xE0,0x00,0x80,0x70,0x80,0x50,0x80,0x70,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x8A5B, {0x00,0x00,0x73,0x80,0xFA,0x80,0xFA,0x80,0x73,0x80,0x02,0x80,0x72,0x80,0x03,0x80,0x72,0x80,0x52,0x80,0x7F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x8A5E, {0x00,0x00,0x3B,0xE0,0x7C,0x20,0x03,0xE0,0x38,0x20,0x03,0xA0,0x3A,0xA0,0x02,0xA0,0x3B,0xA0,0x28,0x20,0x38,0x20,0x20,0x40,0x00,0x00,}}, +{ 0x8A60, {0x01,0x00,0x70,0x80,0x00,0x80,0xFB,0xA0,0x70,0xA0,0x07,0xC0,0x71,0xC0,0x02,0xC0,0x74,0xC0,0x58,0xA0,0x70,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x8A62, {0x01,0x00,0x39,0x00,0x7D,0xE0,0x7F,0xE0,0x3F,0xA0,0x02,0xE0,0x3B,0xE0,0x02,0xE0,0x3B,0xE0,0x28,0x20,0x38,0x20,0x28,0x40,0x00,0x00,}}, +{ 0x8A63, {0x02,0x00,0x72,0xC0,0xFB,0x00,0x02,0x20,0x73,0xE0,0x00,0x00,0x73,0xC0,0x02,0x40,0x73,0xC0,0x52,0x40,0x73,0xC0,0x52,0x40,0x00,0x00,}}, +{ 0x8A66, {0x01,0x80,0x71,0x40,0xFF,0xE0,0x01,0x00,0x71,0x00,0x0F,0x80,0x72,0x80,0x02,0x80,0x73,0x80,0x5C,0xA0,0x70,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x8A69, {0x01,0x00,0x71,0x00,0xFF,0xC0,0x01,0x00,0x7F,0xE0,0x00,0x80,0x70,0x80,0x0F,0xE0,0x74,0x80,0x52,0x80,0x70,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x8A6B, {0x00,0x80,0x70,0x80,0xFF,0xE0,0x04,0x40,0x77,0x80,0x01,0x00,0x71,0xE0,0x0F,0x00,0x71,0x00,0x51,0x20,0x71,0x20,0x51,0xE0,0x00,0x00,}}, +{ 0x8A6C, {0x00,0xC0,0x77,0x00,0xFC,0x00,0xFF,0xE0,0x74,0x00,0x04,0x00,0x77,0xC0,0x06,0x40,0x7E,0x40,0x5A,0x40,0x73,0xC0,0x52,0x40,0x00,0x00,}}, +{ 0x8A6D, {0x01,0x00,0x73,0xC0,0xFE,0x80,0xFF,0xE0,0x74,0x00,0x05,0xC0,0x75,0x40,0x05,0x40,0x75,0x80,0x59,0x20,0x79,0x20,0x51,0xE0,0x00,0x00,}}, +{ 0x8A6E, {0x01,0x00,0x71,0x00,0xFA,0x80,0x04,0x80,0x78,0x40,0x0F,0xE0,0x71,0x00,0x01,0x00,0x77,0xC0,0x51,0x00,0x7F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x8A70, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x01,0x00,0x71,0x00,0x07,0xC0,0x70,0x00,0x07,0xC0,0x74,0x40,0x54,0x40,0x77,0xC0,0x54,0x40,0x00,0x00,}}, +{ 0x8A71, {0x00,0x40,0x71,0x80,0xFF,0x00,0x01,0x00,0x7F,0xE0,0x01,0x00,0x71,0x00,0x07,0xC0,0x74,0x40,0x54,0x40,0x77,0xC0,0x54,0x40,0x00,0x00,}}, +{ 0x8A72, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x01,0x00,0x76,0x80,0x02,0x80,0x71,0x40,0x03,0x40,0x76,0x80,0x51,0x40,0x76,0x20,0x58,0x20,0x00,0x00,}}, +{ 0x8A73, {0x04,0x80,0x72,0x80,0xFF,0xE0,0x01,0x00,0x71,0x00,0x0F,0xC0,0x71,0x00,0x01,0x00,0x7F,0xE0,0x51,0x00,0x71,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x8A7C, {0x01,0x00,0x73,0x00,0xFF,0xE0,0xFB,0x00,0x73,0xA0,0x05,0xA0,0x7B,0xC0,0x03,0x80,0x75,0x80,0x51,0x80,0x72,0x40,0x54,0x20,0x00,0x00,}}, +{ 0x8A82, {0x03,0x80,0x63,0x80,0xFB,0x80,0xFF,0xC0,0x67,0xC0,0x03,0x80,0x67,0xC0,0x1B,0xA0,0x67,0xA0,0x65,0xA0,0x69,0xA0,0x70,0xE0,0x00,0x00,}}, +{ 0x8A84, {0x01,0x00,0x73,0xC0,0xFF,0x00,0xF7,0xC0,0x73,0x00,0x0F,0xE0,0x73,0x80,0x03,0x80,0x7D,0x40,0x59,0x20,0x71,0x00,0x51,0x00,0x00,0x00,}}, +{ 0x8A85, {0x01,0x80,0x73,0x80,0xFB,0xC0,0xFF,0xC0,0x79,0x80,0x0F,0xE0,0x71,0x80,0x03,0xC0,0x77,0xC0,0x59,0xA0,0x71,0x80,0x51,0x80,0x00,0x00,}}, +{ 0x8A87, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x04,0x80,0x7B,0xC0,0x00,0x20,0x77,0xC0,0x02,0x00,0x77,0xC0,0x54,0x40,0x70,0x40,0x41,0x80,0x00,0x00,}}, +{ 0x8A89, {0x28,0x80,0x15,0x00,0xFF,0xE0,0x7F,0x80,0x7F,0xC0,0x80,0x20,0x1F,0x00,0x1F,0x00,0x00,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8A8C, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x01,0x00,0x71,0x00,0x0F,0xC0,0x70,0x80,0x02,0xC0,0x76,0x60,0x5A,0x20,0x72,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x8A8D, {0x00,0x00,0x77,0xC0,0xFD,0x40,0x03,0x40,0x73,0x40,0x04,0x80,0x71,0x00,0x03,0x80,0x76,0xC0,0x5A,0x20,0x72,0x80,0x51,0x80,0x00,0x00,}}, +{ 0x8A91, {0x02,0x00,0x63,0xE0,0xFE,0x80,0xF4,0x80,0x7C,0x80,0x03,0xE0,0x66,0x80,0x06,0x80,0x7A,0x80,0x72,0x80,0x63,0xE0,0x6C,0x00,0x00,0x00,}}, +{ 0x8A93, {0x20,0xC0,0xFB,0x00,0x3B,0xE0,0xE2,0x80,0x60,0x80,0x1F,0x00,0xFF,0xE0,0x1F,0x00,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8A95, {0x00,0x00,0x7C,0x60,0xF7,0x80,0x18,0x80,0x69,0x80,0x1D,0xE0,0x65,0x80,0x15,0x80,0x6B,0xE0,0x6C,0x00,0x72,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x8A98, {0x00,0xC0,0x77,0x00,0xF1,0x00,0x0F,0xE0,0x75,0x80,0x09,0x40,0x77,0xA0,0x02,0x80,0x72,0xC0,0x54,0x40,0x74,0x40,0x48,0x80,0x00,0x00,}}, +{ 0x8A9A, {0x01,0x80,0x73,0xC0,0xFF,0xE0,0xF9,0xA0,0x77,0xC0,0x04,0x40,0x77,0xC0,0x04,0x40,0x77,0xC0,0x54,0x40,0x74,0x40,0x54,0xC0,0x00,0x00,}}, +{ 0x8A9E, {0x00,0x00,0x77,0xC0,0xF9,0x00,0x07,0x80,0x72,0x80,0x02,0x80,0x7F,0xE0,0x00,0x00,0x77,0xC0,0x54,0x40,0x77,0xC0,0x54,0x40,0x00,0x00,}}, +{ 0x8AA0, {0x01,0x00,0x71,0x40,0xFF,0xE0,0x05,0x20,0x75,0x40,0x07,0x40,0x75,0xC0,0x05,0x80,0x75,0x80,0x55,0xA0,0x75,0x60,0x5A,0x20,0x00,0x00,}}, +{ 0x8AA1, {0x01,0xC0,0x61,0xA0,0xFF,0xE0,0xFF,0xE0,0x6B,0xC0,0x0B,0xC0,0x7F,0xC0,0x0A,0xC0,0x6A,0x80,0x6A,0xE0,0x73,0x60,0x62,0x20,0x00,0x00,}}, +{ 0x8AA3, {0x00,0x00,0x6F,0xE0,0xF1,0x00,0xF5,0x80,0x65,0x80,0x05,0x80,0x65,0x80,0x0B,0xC0,0x7B,0x20,0x71,0x00,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8AA4, {0x00,0x00,0x71,0xC0,0xFD,0x40,0x05,0xC0,0x75,0x40,0x04,0x00,0x77,0xC0,0x00,0x40,0x7F,0xE0,0x51,0x40,0x72,0x20,0x54,0x20,0x00,0x00,}}, +{ 0x8AA5, {0x01,0x80,0x73,0x80,0xFB,0xE0,0xFF,0xE0,0x79,0x80,0x0F,0xE0,0x71,0x80,0x03,0xC0,0x72,0x40,0x52,0x40,0x73,0xC0,0x52,0x40,0x00,0x00,}}, +{ 0x8AA6, {0x00,0x00,0x3B,0xE0,0x7C,0xC0,0x7F,0xE0,0x3B,0xA0,0x02,0xA0,0x3B,0xE0,0x02,0xA0,0x3B,0xE0,0x2B,0xE0,0x3A,0xA0,0x2A,0xE0,0x00,0x00,}}, +{ 0x8AA8, {0x02,0x00,0x72,0x00,0xFF,0xE0,0xFF,0xC0,0x73,0x40,0x03,0x40,0x7F,0xE0,0x05,0x40,0x75,0xC0,0x5F,0xE0,0x70,0x40,0x50,0x80,0x00,0x00,}}, +{ 0x8AAC, {0x04,0x40,0x72,0x80,0xFF,0xC0,0x04,0x40,0x74,0x40,0x07,0xC0,0x75,0xC0,0x01,0x80,0x72,0x80,0x52,0xA0,0x74,0xA0,0x58,0xE0,0x00,0x00,}}, +{ 0x8AAD, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x07,0xC0,0x70,0x00,0x07,0xE0,0x74,0x40,0x0A,0x80,0x72,0x80,0x52,0xA0,0x74,0xA0,0x58,0xE0,0x00,0x00,}}, +{ 0x8AB0, {0x02,0x80,0x72,0x80,0xFF,0xE0,0x05,0x00,0x7D,0x00,0x07,0xC0,0x75,0x00,0x05,0x00,0x77,0xC0,0x55,0x00,0x77,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x8AB2, {0x00,0x00,0x77,0xC0,0x05,0x40,0xFF,0xC0,0x75,0x40,0x07,0xC0,0x71,0x00,0x0F,0xE0,0x77,0x80,0x59,0x40,0x71,0x20,0x51,0x00,0x00,0x00,}}, +{ 0x8AB9, {0x02,0x80,0x72,0x80,0xF2,0x80,0x0E,0xE0,0x72,0x80,0x0E,0xE0,0x72,0x80,0x02,0x80,0x7E,0xE0,0x52,0x80,0x74,0x80,0x58,0x80,0x00,0x00,}}, +{ 0x8ABC, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x08,0x40,0x77,0x80,0x04,0x80,0x77,0x80,0x04,0x80,0x77,0x80,0x54,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x8ABF, {0x00,0x00,0x3B,0xE0,0x7E,0xA0,0x03,0xE0,0x3A,0xA0,0x03,0xE0,0x3A,0x20,0x03,0xE0,0x3B,0x60,0x2D,0xE0,0x3C,0x20,0x28,0x60,0x00,0x00,}}, +{ 0x8AC2, {0x00,0x80,0x38,0x80,0x7D,0xE0,0x7D,0x20,0x3A,0x60,0x00,0x80,0x3B,0x60,0x02,0x20,0x3B,0x60,0x2A,0x20,0x3B,0xE0,0x2A,0x20,0x00,0x00,}}, +{ 0x8AC4, {0x01,0x80,0x71,0x80,0xFF,0xE0,0xFB,0xC0,0x72,0x40,0x03,0xC0,0x70,0x00,0x03,0xC0,0x77,0xE0,0x57,0xE0,0x71,0x80,0x51,0x80,0x00,0x00,}}, +{ 0x8AC7, {0x00,0x80,0x70,0xC0,0xFA,0xC0,0x04,0x80,0x71,0x80,0x02,0x40,0x70,0xA0,0x02,0xA0,0x74,0xC0,0x51,0x80,0x72,0x40,0x54,0x20,0x00,0x00,}}, +{ 0x8ACB, {0x00,0x80,0x77,0xE0,0xFB,0xC0,0x00,0x80,0x7F,0xE0,0x00,0x00,0x73,0xC0,0x02,0x40,0x73,0xC0,0x53,0xC0,0x72,0x40,0x52,0xC0,0x00,0x00,}}, +{ 0x8ACC, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x07,0xC0,0x75,0x40,0x07,0xC0,0x75,0x40,0x07,0xC0,0x73,0x80,0x5D,0x40,0x71,0x20,0x51,0x00,0x00,0x00,}}, +{ 0x8ACD, {0x00,0xC0,0x77,0xC0,0xFD,0x60,0xF8,0x20,0x77,0xC0,0x01,0x40,0x7F,0xE0,0x03,0x40,0x77,0xC0,0x51,0x00,0x71,0x00,0x53,0x00,0x00,0x00,}}, +{ 0x8ACF, {0x00,0x00,0x7F,0x00,0xEB,0xC0,0x0F,0x40,0x6B,0x40,0x0B,0xC0,0x6E,0xC0,0x0A,0x80,0x6F,0x80,0x6B,0xC0,0x73,0x40,0x42,0x20,0x00,0x00,}}, +{ 0x8AD2, {0x00,0x80,0x70,0x80,0xFF,0xE0,0x03,0xC0,0x72,0x40,0x02,0x40,0x73,0xC0,0x00,0x80,0x72,0xC0,0x54,0xA0,0x78,0xA0,0x40,0x80,0x00,0x00,}}, +{ 0x8AD6, {0x01,0x00,0x61,0x00,0xF2,0x80,0x04,0x40,0x6F,0xC0,0x10,0x20,0x6F,0xC0,0x0A,0xC0,0x6F,0xC0,0x6A,0xC0,0x6A,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x8ADA, {0x01,0x80,0x71,0x80,0xFF,0xE0,0xF8,0x00,0x77,0xE0,0x01,0x80,0x73,0x80,0x03,0xC0,0x73,0x80,0x53,0x80,0x75,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x8ADB, {0x03,0x00,0x6D,0xC0,0xF9,0x40,0xFD,0x40,0x69,0x40,0x09,0x40,0x6F,0xC0,0x0B,0x40,0x63,0x80,0x64,0x80,0x68,0x40,0x70,0x20,0x00,0x00,}}, +{ 0x8ADC, {0x05,0x80,0x75,0x80,0xFF,0xE0,0x05,0x80,0x75,0x80,0x04,0x00,0x77,0xC0,0x01,0x00,0x7F,0xE0,0x53,0x80,0x7D,0x60,0x51,0x00,0x00,0x00,}}, +{ 0x8ADE, {0x00,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x08,0x00,0x6F,0xC0,0x0B,0xC0,0x7F,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x8AE0, {0x01,0x80,0x71,0x80,0xFF,0xE0,0xFF,0xE0,0x70,0x00,0x03,0xC0,0x72,0x40,0x03,0xC0,0x73,0xC0,0x53,0xC0,0x7F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x8AE1, {0x00,0x00,0x73,0x80,0xF7,0xC0,0xFF,0xE0,0x73,0x80,0x00,0x80,0x71,0x80,0x07,0xC0,0x75,0xC0,0x55,0xC0,0x7F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x8AE2, {0x00,0x00,0x77,0xE0,0xFF,0xE0,0xFF,0xE0,0x77,0xC0,0x05,0x40,0x77,0xC0,0x07,0x40,0x77,0xC0,0x5F,0xE0,0x73,0x00,0x51,0x00,0x00,0x00,}}, +{ 0x8AE4, {0x00,0x00,0x77,0xE0,0xFF,0xE0,0xFE,0x60,0x73,0xC0,0x00,0x00,0x77,0xE0,0x01,0x00,0x73,0xC0,0x50,0x40,0x70,0x40,0x50,0x80,0x00,0x00,}}, +{ 0x8AE6, {0x00,0x80,0x70,0x80,0xFF,0xE0,0x02,0x40,0x77,0xE0,0x04,0xA0,0x7B,0xC0,0x02,0xC0,0x72,0xC0,0x52,0xC0,0x70,0x80,0x50,0x80,0x00,0x00,}}, +{ 0x8AE7, {0x05,0x80,0x75,0xA0,0xFF,0xC0,0xFD,0xA0,0x77,0xA0,0x0D,0xE0,0x71,0x00,0x07,0xC0,0x77,0xC0,0x57,0xC0,0x77,0xC0,0x54,0x40,0x00,0x00,}}, +{ 0x8AEB, {0x01,0x00,0x73,0x00,0xFF,0xE0,0xFF,0xC0,0x7F,0xC0,0x0B,0xC0,0x7B,0xC0,0x0F,0xC0,0x77,0x80,0x59,0x40,0x71,0x20,0x51,0x00,0x00,0x00,}}, +{ 0x8AED, {0x01,0x00,0x63,0x00,0xF4,0x80,0x0F,0xC0,0x70,0x20,0x0E,0x40,0x6A,0xC0,0x0E,0xC0,0x6A,0xC0,0x6E,0xC0,0x6A,0x40,0x6A,0xC0,0x00,0x00,}}, +{ 0x8AEE, {0x01,0x00,0x79,0x00,0xF5,0xE0,0x03,0x40,0x76,0x80,0x09,0x80,0x72,0x40,0x0C,0x20,0x77,0xC0,0x54,0x40,0x77,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x8AF1, {0x01,0x00,0x77,0xC0,0xFF,0xE0,0xFF,0xE0,0x73,0xC0,0x02,0x40,0x73,0xC0,0x00,0xC0,0x73,0xC0,0x5F,0xE0,0x70,0xC0,0x50,0x80,0x00,0x00,}}, +{ 0x8AF3, {0x01,0x80,0x71,0x80,0xFF,0xE0,0xFA,0x40,0x71,0xC0,0x07,0xE0,0x70,0x00,0x03,0xC0,0x73,0xC0,0x53,0xC0,0x73,0xC0,0x52,0x40,0x00,0x00,}}, +{ 0x8AF7, {0x00,0x00,0x6F,0x80,0xFF,0x80,0xFE,0x80,0x6F,0x80,0x0F,0x80,0x6F,0x80,0x0F,0x80,0x6A,0x80,0x7B,0xE0,0x7C,0xE0,0x60,0x20,0x00,0x00,}}, +{ 0x8AF8, {0x01,0x00,0x71,0x20,0xF7,0xC0,0x01,0x40,0x77,0xE0,0x01,0x00,0x73,0xC0,0x06,0x40,0x7B,0xC0,0x52,0x40,0x73,0xC0,0x42,0x40,0x00,0x00,}}, +{ 0x8AFA, {0x01,0x00,0x71,0x00,0xFF,0xE0,0x02,0x40,0x77,0xE0,0x04,0x80,0x75,0x00,0x06,0x40,0x74,0x80,0x59,0x20,0x78,0xC0,0x57,0x00,0x00,0x00,}}, +{ 0x8AFE, {0x02,0x80,0x72,0x80,0xFF,0xE0,0x03,0x80,0x7F,0xE0,0x01,0x00,0x72,0x00,0x07,0xC0,0x7A,0x40,0x52,0x40,0x73,0xC0,0x42,0x40,0x00,0x00,}}, +{ 0x8B00, {0x04,0x80,0x64,0x80,0xFF,0xE0,0x07,0x80,0x74,0x80,0x07,0x80,0x71,0x00,0x0F,0xE0,0x73,0x80,0x55,0x40,0x79,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x8B01, {0x00,0x00,0x3B,0xC0,0x7E,0x40,0x03,0xC0,0x3B,0xC0,0x01,0x00,0x3B,0xE0,0x06,0xA0,0x3B,0xA0,0x2B,0xE0,0x38,0x20,0x20,0x40,0x00,0x00,}}, +{ 0x8B02, {0x00,0x00,0x77,0xE0,0x04,0xA0,0xFF,0xE0,0x77,0xE0,0x00,0x00,0x73,0xC0,0x02,0x40,0x73,0xC0,0x53,0xC0,0x72,0x40,0x52,0xC0,0x00,0x00,}}, +{ 0x8B04, {0x09,0x40,0x77,0xC0,0x53,0x80,0x5F,0xE0,0x74,0xC0,0x5B,0xC0,0x5F,0xE0,0x73,0x80,0x53,0x80,0x57,0xC0,0x54,0x40,0xB7,0xC0,0x00,0x00,}}, +{ 0x8B07, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x3F,0xC0,0xFF,0xE0,0x11,0x00,0x7F,0x80,0xFF,0x60,0x1F,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x8B0C, {0x00,0x00,0x77,0xE0,0xFB,0x40,0xFB,0xC0,0x73,0xC0,0x00,0xC0,0x77,0xE0,0x00,0x40,0x73,0xC0,0x53,0xC0,0x70,0x40,0x50,0xC0,0x00,0x00,}}, +{ 0x8B0E, {0x00,0x80,0x68,0xC0,0xF6,0xC0,0x01,0x80,0x63,0xE0,0x1C,0x80,0x65,0x80,0x06,0xC0,0x66,0xA0,0x6C,0x80,0x73,0x00,0x61,0xE0,0x00,0x00,}}, +{ 0x8B10, {0x01,0x00,0x61,0xC0,0xFA,0xC0,0xFA,0xC0,0x6A,0xA0,0x13,0xA0,0x63,0x80,0x0F,0xC0,0x6B,0xC0,0x6B,0xC0,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8B14, {0x01,0x80,0x71,0xE0,0xFF,0xE0,0xFF,0xE0,0x77,0xA0,0x04,0xE0,0x74,0x00,0x05,0xE0,0x77,0xE0,0x5F,0xE0,0x79,0xE0,0x51,0x00,0x00,0x00,}}, +{ 0x8B16, {0x00,0x00,0x77,0xC0,0xFF,0xC0,0xFF,0xC0,0x77,0xC0,0x03,0xA0,0x75,0xE0,0x0B,0x00,0x7F,0xC0,0x5F,0x80,0x73,0x80,0x5C,0x60,0x00,0x00,}}, +{ 0x8B17, {0x01,0x80,0x71,0x80,0xFF,0xE0,0xFA,0x40,0x77,0xE0,0x05,0xC0,0x79,0x80,0x07,0xE0,0x71,0xC0,0x51,0xC0,0x72,0x40,0x54,0x80,0x00,0x00,}}, +{ 0x8B19, {0x04,0x40,0x62,0x80,0xFF,0xE0,0x0F,0xC0,0x62,0xC0,0x1F,0xE0,0x62,0xC0,0x0F,0xC0,0x66,0x80,0x6A,0xC0,0x72,0xA0,0x42,0x80,0x00,0x00,}}, +{ 0x8B1A, {0x03,0x80,0x72,0xC0,0xFF,0xE0,0xFF,0x80,0x73,0x80,0x02,0x80,0x74,0x40,0x0F,0xE0,0x75,0xC0,0x55,0xC0,0x7F,0xE0,0x50,0x00,0x00,0x00,}}, +{ 0x8B1B, {0x02,0x80,0x77,0xC0,0xFA,0x80,0x0F,0xC0,0x7F,0xE0,0x01,0x00,0x77,0xC0,0x05,0x40,0x77,0xC0,0x5F,0xE0,0x74,0x40,0x54,0xC0,0x00,0x00,}}, +{ 0x8B1D, {0x01,0x20,0x72,0x20,0xFF,0xA0,0x04,0xF0,0x77,0xA0,0x07,0xA0,0x74,0xE0,0x0F,0xE0,0x73,0xA0,0x54,0xA0,0x78,0xA0,0x41,0xE0,0x00,0x00,}}, +{ 0x8B20, {0x01,0x00,0x73,0xC0,0xFF,0xC0,0xFB,0x80,0x7E,0x00,0x03,0xC0,0x75,0x80,0x0F,0xE0,0x71,0x80,0x55,0xC0,0x77,0xC0,0x54,0x40,0x00,0x00,}}, +{ 0x8B21, {0x00,0x40,0x71,0x80,0xFE,0x40,0x05,0x40,0x75,0x80,0x0F,0xC0,0x71,0x00,0x0F,0xE0,0x61,0x00,0x69,0x40,0x6F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x8B26, {0x21,0x80,0xFF,0x80,0x7F,0xE0,0x7F,0xE0,0x7B,0x80,0x4E,0xE0,0x9F,0x00,0x7F,0xC0,0x1F,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x8B28, {0x02,0x80,0x72,0xC0,0xFF,0xE0,0xFF,0xC0,0x74,0x40,0x07,0xC0,0x74,0x40,0x07,0xC0,0x7F,0xE0,0x5F,0xE0,0x74,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x8B2B, {0x01,0x00,0x73,0x00,0xFF,0xE0,0xF6,0x80,0x6F,0xC0,0x09,0x40,0x6F,0xC0,0x0B,0x40,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x8B2C, {0x00,0x00,0x7F,0xC0,0xF6,0xC0,0x0F,0xC0,0x73,0x40,0x06,0xC0,0x63,0x00,0x0D,0xC0,0x77,0x60,0x66,0x40,0x61,0xC0,0x6F,0x00,0x00,0x00,}}, +{ 0x8B33, {0x00,0x00,0x6F,0xE0,0xFB,0x80,0xFB,0x80,0x6B,0x80,0x08,0x00,0x6F,0xC0,0x0D,0xC0,0x6F,0xC0,0x6F,0xC0,0x6F,0xE0,0x68,0x00,0x00,0x00,}}, +{ 0x8B39, {0x02,0x80,0x72,0x80,0xFF,0xE0,0x0F,0xC0,0x7B,0x40,0x0F,0xC0,0x71,0x00,0x07,0xC0,0x77,0xC0,0x51,0x00,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x8B3E, {0x00,0x00,0x73,0xC0,0xFB,0xC0,0xFB,0xC0,0x73,0xC0,0x07,0xE0,0x75,0xA0,0x07,0xE0,0x77,0xC0,0x53,0x80,0x73,0x80,0x5C,0x60,0x00,0x00,}}, +{ 0x8B41, {0x03,0x80,0x73,0x80,0xFF,0xE0,0xFF,0xC0,0x67,0xC0,0x1F,0xE0,0x65,0x80,0x0F,0xC0,0x7F,0xE0,0x7F,0xE0,0x61,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x8B49, {0x07,0x40,0x63,0xC0,0xFE,0xA0,0xF7,0xE0,0x68,0x40,0x17,0xA0,0x64,0x80,0x04,0x80,0x67,0x80,0x66,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8B4C, {0x00,0xC0,0x6F,0xC0,0xF5,0x60,0xFF,0xA0,0x65,0x80,0x07,0x80,0x64,0x80,0x07,0xE0,0x6A,0x20,0x7F,0xE0,0x75,0x20,0x68,0xC0,0x00,0x00,}}, +{ 0x8B4E, {0x00,0x00,0x6F,0x80,0xF3,0x00,0xFF,0xE0,0x73,0x40,0x0D,0x80,0x63,0x00,0x0F,0xC0,0x6F,0xC0,0x6F,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x8B4F, {0x05,0x40,0x77,0x40,0xFB,0xA0,0xFF,0x60,0x6B,0xE0,0x1F,0xE0,0x61,0x80,0x0F,0xE0,0x65,0xC0,0x6E,0xE0,0x68,0xE0,0x73,0x20,0x00,0x00,}}, +{ 0x8B56, {0x02,0x40,0x6F,0xE0,0xFB,0xC0,0xFF,0xE0,0x67,0xC0,0x07,0xE0,0x69,0x60,0x17,0xC0,0x67,0xC0,0x67,0xC0,0x67,0xC0,0x64,0x40,0x00,0x00,}}, +{ 0x8B58, {0x04,0x80,0x74,0xC0,0xFF,0xA0,0x0A,0x80,0x7F,0xE0,0x00,0x80,0x6E,0xC0,0x0A,0xC0,0x6E,0x80,0x6A,0xA0,0x6F,0x60,0x42,0x20,0x00,0x00,}}, +{ 0x8B5A, {0x00,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x07,0x80,0x64,0x80,0x07,0x80,0x67,0x80,0x7F,0xE0,0x73,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x8B5B, {0x04,0x80,0x74,0xC0,0xFF,0xE0,0xFF,0xE0,0x74,0xC0,0x0A,0xC0,0x71,0x20,0x07,0x80,0x67,0x80,0x67,0x80,0x67,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x8B5C, {0x04,0x40,0x72,0x80,0xFF,0xE0,0x0A,0xC0,0x76,0xC0,0x0F,0xE0,0x70,0x00,0x07,0xC0,0x74,0x40,0x57,0xC0,0x77,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x8B5F, {0x00,0x00,0x67,0x80,0xF7,0x80,0xF7,0x80,0x6E,0xC0,0x0B,0xC0,0x6F,0xC0,0x03,0x00,0x7F,0xE0,0x67,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x8B66, {0x49,0x00,0xFF,0xE0,0x7F,0x40,0xF5,0x80,0x7B,0x60,0x1F,0x00,0xFF,0xE0,0x1F,0x00,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8B6B, {0x01,0x00,0x63,0xC0,0xFF,0xE0,0xFF,0xE0,0x6E,0x60,0x09,0x80,0x6F,0xE0,0x09,0x80,0x6B,0xC0,0x6B,0xC0,0x73,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x8B6C, {0x01,0x80,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x6F,0xE0,0xF9,0x80,0x3F,0x80,0xFF,0xE0,0x1F,0x00,0x1F,0x00,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x8B6F, {0x00,0x00,0x6F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x01,0x00,0x7F,0xE0,0x04,0xC0,0x7F,0xE0,0x6F,0xC0,0x63,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x8B70, {0x04,0x80,0x73,0x80,0xFF,0xE0,0x0F,0xC0,0x63,0x00,0x1F,0xE0,0x6F,0xC0,0x05,0xA0,0x7F,0xE0,0x5C,0xE0,0x75,0xE0,0x4C,0x20,0x00,0x00,}}, +{ 0x8B71, {0x21,0x80,0x7F,0xC0,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x24,0x80,0xFF,0xE0,0x65,0x80,0x75,0xC0,0x75,0xC0,0x75,0xC0,0x55,0x40,0x00,0x00,}}, +{ 0x8B72, {0x01,0x00,0x7F,0xE0,0xFC,0xC0,0x0F,0xE0,0x72,0x80,0x07,0xC0,0x72,0x80,0x0F,0xE0,0x73,0xC0,0x5E,0x80,0x73,0x40,0x5C,0x20,0x00,0x00,}}, +{ 0x8B74, {0x01,0x80,0x6B,0xC0,0xE7,0xC0,0xF7,0xC0,0x7F,0xE0,0x0B,0x80,0x62,0x80,0x1B,0xC0,0x6B,0xC0,0x6B,0xC0,0x76,0x00,0x63,0xE0,0x00,0x00,}}, +{ 0x8B77, {0x02,0x80,0x6F,0xE0,0xF6,0x80,0x0F,0xE0,0x77,0xC0,0x07,0xC0,0x75,0x00,0x07,0xE0,0x7F,0xC0,0x52,0x80,0x73,0x80,0x5C,0x60,0x00,0x00,}}, +{ 0x8B7D, {0x18,0x00,0x6F,0x80,0x7F,0x80,0x7B,0x80,0x6A,0x80,0xFF,0xE0,0x7F,0x80,0xFF,0xC0,0x9F,0x20,0x1F,0x00,0x31,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x8B80, {0x01,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6D,0xC0,0x0F,0xC0,0x67,0x80,0x04,0x80,0x67,0x80,0x67,0x80,0x66,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x8B83, {0x04,0x80,0x6F,0xC0,0xFF,0xC0,0x06,0xE0,0x7F,0x80,0x04,0x80,0x77,0x80,0x04,0x80,0x77,0x80,0x57,0x80,0x76,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x8B8A, {0x6E,0x80,0x7F,0xC0,0xE7,0xC0,0x6E,0xC0,0xFF,0xE0,0x6B,0xC0,0xFF,0xA0,0x08,0xC0,0x7F,0xC0,0x7E,0x00,0x3B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x8B8C, {0x03,0x80,0x73,0x80,0xFF,0xE0,0xF7,0x80,0x7C,0xA0,0x07,0xC0,0x6F,0x80,0x17,0xE0,0x66,0x60,0x6A,0x40,0x6B,0xE0,0x71,0xA0,0x00,0x00,}}, +{ 0x8B8E, {0x70,0xA0,0x7E,0xE0,0x7F,0xE0,0xFF,0xE0,0xEF,0xC0,0x71,0xE0,0x6F,0xC0,0x71,0xC0,0x7F,0xE0,0x6F,0xC0,0x7B,0xE0,0x41,0x80,0x00,0x00,}}, +{ 0x8B90, {0x52,0x80,0x7B,0xC0,0xD6,0x80,0x7B,0xC0,0x7B,0xC0,0x1F,0x00,0xFF,0xE0,0x1F,0x00,0x1F,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x8B92, {0x01,0x00,0x73,0xC0,0xFF,0x80,0xF7,0xA0,0x67,0xC0,0x07,0xA0,0x6D,0xE0,0x03,0x80,0x6F,0x80,0x67,0xA0,0x63,0xE0,0x7C,0xE0,0x00,0x00,}}, +{ 0x8B93, {0x01,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x63,0x80,0x1F,0xE0,0x6F,0xC0,0x03,0x80,0x7F,0xE0,0x7D,0xC0,0x77,0x80,0x78,0x60,0x00,0x00,}}, +{ 0x8B96, {0x0B,0x80,0x6B,0xC0,0xFF,0xC0,0xFF,0xE0,0x7B,0x80,0x1B,0xC0,0x6B,0xC0,0x1B,0xC0,0x7A,0x80,0x7F,0xE0,0x7B,0x60,0x62,0x20,0x00,0x00,}}, +{ 0x8B99, {0x03,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x02,0x80,0x67,0xE0,0x0D,0x80,0x77,0xC0,0x67,0xC0,0x67,0xE0,0x64,0x00,0x00,0x00,}}, +{ 0x8B9A, {0x0D,0x80,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6F,0xA0,0x15,0x60,0x67,0x80,0x04,0x80,0x67,0x80,0x67,0x80,0x66,0x80,0x78,0x40,0x00,0x00,}}, +{ 0x8C37, {0x11,0x00,0x10,0x80,0x20,0x80,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xDF,0xE0,0x10,0x80,0x10,0x80,0x1F,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x8C3A, {0x70,0x00,0x4B,0xC0,0x8A,0x80,0x22,0x80,0x32,0x80,0x6F,0xE0,0x49,0x80,0xF9,0x80,0x4A,0x80,0x7C,0x80,0x48,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x8C3F, {0x09,0x80,0x7B,0x40,0xA6,0x40,0x29,0x80,0x69,0x80,0x31,0x80,0x2A,0x40,0x7F,0xE0,0xFE,0x40,0xFE,0x40,0x2B,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x8C41, {0x21,0x80,0x7F,0x40,0xFA,0x40,0xFD,0x80,0x79,0x80,0x21,0x80,0xFE,0x40,0x33,0xE0,0x7A,0x40,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x00,0x00,}}, +{ 0x8C46, {0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x11,0x00,0x11,0x00,0x02,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8C48, {0x04,0x00,0x64,0x80,0x7F,0x80,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x31,0x80,0x1F,0x00,0x0A,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8C4A, {0x0A,0x00,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8C4C, {0x01,0x80,0xF9,0x80,0x77,0xE0,0x7E,0x00,0x52,0xC0,0x53,0xC0,0x75,0xC0,0x5F,0xC0,0x73,0xC0,0x73,0xA0,0xC5,0xA0,0x08,0xE0,0x00,0x00,}}, +{ 0x8C4E, {0x00,0x00,0x7F,0xC0,0x7A,0x40,0x79,0x80,0x53,0x80,0x7C,0x60,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x1F,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8C50, {0x55,0x40,0x7F,0x40,0x5F,0x40,0x7F,0xC0,0x57,0x40,0x7F,0xC0,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x1F,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8C55, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x18,0x40,0xED,0x40,0x15,0x80,0x67,0x80,0xCA,0x80,0x32,0x40,0xE2,0x20,0x04,0x00,0x18,0x00,0x00,0x00,}}, +{ 0x8C5A, {0x00,0x00,0x7F,0xE0,0x52,0x00,0x5E,0x40,0x71,0x40,0x53,0x80,0x5D,0x80,0x72,0xC0,0x5C,0xA0,0x58,0x80,0x51,0x80,0xB3,0x00,0x00,0x00,}}, +{ 0x8C61, {0x0F,0x00,0x32,0x00,0xFF,0x80,0x24,0x80,0x3F,0x80,0x0C,0x40,0x36,0x80,0xCB,0x00,0x77,0x00,0x1A,0xC0,0x62,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x8C62, {0x24,0x80,0x34,0xC0,0x3F,0xC0,0xFF,0xE0,0x13,0x00,0x3F,0x80,0xCC,0xE0,0x76,0x80,0x7F,0x80,0x7F,0xC0,0x72,0x20,0x0C,0x00,0x00,0x00,}}, +{ 0x8C6A, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x7F,0xE0,0x40,0x40,0xFF,0xC0,0x1E,0x40,0x7F,0x80,0x3F,0x80,0x72,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x8C6B, {0x01,0x00,0xFB,0xC0,0x77,0xC0,0x27,0xC0,0xFB,0xC0,0x6B,0xE0,0x71,0xA0,0x6F,0xC0,0x67,0x80,0x67,0xC0,0x6D,0xA0,0x63,0x00,0x00,0x00,}}, +{ 0x8C6C, {0x01,0x00,0xFB,0x40,0x67,0xC0,0x69,0x80,0xAF,0xE0,0x31,0x80,0x71,0x40,0xAB,0xC0,0x6F,0xC0,0xA3,0xC0,0x23,0xC0,0x62,0x40,0x00,0x00,}}, +{ 0x8C78, {0x00,0x80,0x01,0x00,0x3F,0x20,0x3C,0xC0,0x07,0x00,0x79,0x00,0x02,0x80,0x0D,0xC0,0x33,0xC0,0x0C,0xC0,0x38,0x80,0x03,0x00,0x00,0x00,}}, +{ 0x8C79, {0x09,0x00,0x39,0x00,0x6D,0xE0,0x3A,0x20,0x74,0x20,0x19,0x20,0x28,0xA0,0x68,0xA0,0x18,0x20,0x68,0x20,0x08,0x20,0x10,0x40,0x00,0x00,}}, +{ 0x8C7A, {0x10,0x80,0x60,0x80,0xD8,0x80,0x7F,0xE0,0xE1,0xC0,0x21,0x80,0x71,0x80,0xD3,0x80,0x36,0x80,0xD8,0x80,0x10,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8C7C, {0x15,0x80,0x65,0x80,0xDD,0x80,0x75,0xA0,0xE7,0xC0,0x35,0x80,0x55,0x80,0xD5,0x80,0x35,0x80,0xD5,0xA0,0x17,0xA0,0x38,0xE0,0x00,0x00,}}, +{ 0x8C82, {0x08,0x00,0x33,0xE0,0x6C,0xA0,0x38,0xA0,0x71,0x20,0x1A,0x40,0x28,0x00,0x6B,0xE0,0x1A,0x20,0x6A,0x20,0x0B,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x8C85, {0x25,0x80,0x65,0x80,0xF5,0x80,0x6F,0xE0,0xE9,0x80,0x79,0x80,0x69,0x80,0xAB,0xC0,0x6F,0xE0,0xA9,0x80,0x29,0x80,0x69,0x80,0x00,0x00,}}, +{ 0x8C89, {0x11,0x00,0x63,0x00,0xDB,0xC0,0x76,0x40,0xEB,0x80,0x31,0x80,0x56,0x80,0xD8,0x60,0x37,0xC0,0xD4,0x40,0x17,0xC0,0x24,0x40,0x00,0x00,}}, +{ 0x8C8A, {0x10,0x00,0x67,0xE0,0xD9,0x80,0x71,0x00,0xE3,0xC0,0x32,0x40,0x52,0x40,0xD3,0xC0,0x32,0x40,0xD2,0x40,0x13,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x8C8C, {0x11,0x00,0x62,0x00,0xDF,0xC0,0x74,0x40,0xE7,0xC0,0x34,0x40,0x57,0xC0,0xD4,0xC0,0x32,0x80,0xD2,0xA0,0x14,0xA0,0x28,0xE0,0x00,0x00,}}, +{ 0x8C8D, {0x10,0x00,0x67,0xC0,0xDD,0x40,0x77,0xC0,0xE7,0x40,0x35,0x40,0x57,0xC0,0xD3,0x00,0x37,0xC0,0xD1,0x00,0x1F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x8C8E, {0x11,0x00,0x66,0xC0,0xDC,0x40,0x76,0xC0,0xE4,0x40,0x34,0x40,0x57,0xC0,0xD3,0x80,0x33,0x80,0xD3,0xA0,0x15,0xA0,0x28,0xE0,0x00,0x00,}}, +{ 0x8C94, {0x11,0x00,0x62,0x00,0xDF,0xC0,0x77,0xC0,0xE7,0xC0,0x36,0x40,0x57,0xC0,0xD5,0xA0,0x37,0xC0,0xD5,0xA0,0x17,0xA0,0x38,0xE0,0x00,0x00,}}, +{ 0x8C98, {0x12,0x80,0x6F,0xE0,0xD7,0xC0,0x77,0xC0,0xE7,0xC0,0x34,0x40,0x57,0xC0,0xD3,0x00,0x3F,0xE0,0xD3,0x00,0x14,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x8C9D, {0x00,0x00,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x05,0x00,0x18,0xC0,0x60,0x20,0x00,0x00,}}, +{ 0x8C9E, {0x02,0x00,0x03,0xE0,0x02,0x00,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x18,0xC0,0x60,0x20,0x00,0x00,}}, +{ 0x8CA0, {0x04,0x00,0x0F,0x80,0x71,0x00,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x08,0xC0,0x70,0x20,0x00,0x00,}}, +{ 0x8CA1, {0x00,0x80,0x78,0x80,0x48,0x80,0x7F,0xE0,0x48,0x80,0x79,0x80,0x49,0x80,0x4A,0x80,0x7C,0x80,0x30,0x80,0x48,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x8CA2, {0x00,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CA7, {0x06,0x00,0x13,0x00,0x7F,0xC0,0x9B,0x20,0x7F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CA8, {0x12,0x00,0x12,0x60,0x63,0x80,0xA3,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CA9, {0x00,0x00,0x7B,0xE0,0x4A,0x00,0x7B,0xC0,0x4A,0x40,0x7A,0x40,0x4A,0x40,0x4B,0x40,0x7E,0x80,0x34,0x80,0x4B,0x40,0x9C,0x20,0x00,0x00,}}, +{ 0x8CAA, {0x04,0x00,0x0A,0x00,0xFF,0xE0,0xFF,0xE0,0x03,0x00,0x3F,0x00,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CAB, {0x00,0x00,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x00,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x1F,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CAC, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CAD, {0x00,0xC0,0x7F,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0x80,0x70,0x80,0x7F,0x80,0x70,0x80,0x5F,0x80,0x5F,0x80,0x8D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x8CAE, {0x01,0x80,0x3D,0x40,0xFF,0xE0,0xFF,0xE0,0x3D,0x00,0x65,0x00,0x7D,0x00,0x65,0x80,0x7C,0x80,0x7C,0xA0,0x74,0x60,0xC2,0x20,0x00,0x00,}}, +{ 0x8CAF, {0x00,0x80,0x70,0x80,0x57,0xE0,0x78,0x20,0x50,0x00,0x77,0xE0,0x50,0x80,0x50,0x80,0x70,0x80,0x30,0x80,0x48,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x8CB0, {0x24,0x80,0xFF,0xE0,0x27,0x80,0x3F,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CB2, {0x22,0x00,0x7E,0xC0,0x7B,0x00,0xFB,0xE0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CB3, {0x01,0x80,0x03,0x40,0xFF,0xE0,0x39,0x00,0xFF,0x00,0x7D,0x00,0x65,0x00,0x7D,0x80,0x7C,0x80,0x7C,0xA0,0x74,0x60,0xC2,0x20,0x00,0x00,}}, +{ 0x8CB4, {0x04,0x00,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CB6, {0x00,0x40,0x71,0x80,0x5F,0x00,0x71,0x00,0x5F,0xC0,0x70,0x40,0x50,0x80,0x50,0x80,0x71,0x00,0x76,0x00,0x4B,0x00,0x91,0xE0,0x00,0x00,}}, +{ 0x8CB7, {0x00,0x00,0x7F,0xC0,0x51,0x40,0x7F,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CB8, {0x0A,0x80,0x12,0x40,0x6F,0xC0,0xA1,0x20,0x3F,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CBB, {0x0A,0x00,0x7F,0xC0,0x0A,0x40,0x7F,0xE0,0x92,0x20,0x3F,0xC0,0xE0,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CBC, {0x01,0x00,0x79,0x00,0x49,0x00,0x79,0xE0,0x49,0x00,0x79,0x00,0x4B,0xC0,0x4A,0x40,0x7A,0x40,0x32,0x40,0x4B,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x8CBD, {0x01,0x80,0x79,0x80,0x49,0x80,0x79,0x40,0x4A,0x40,0x7F,0xA0,0x48,0x20,0x4B,0xC0,0x7A,0x40,0x6A,0x40,0x4B,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x8CBF, {0x0C,0x00,0x39,0xE0,0x28,0xA0,0x3D,0x20,0x7F,0xE0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x1F,0xC0,0x0D,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x8CC0, {0x10,0x00,0x11,0xE0,0x7D,0x20,0x35,0xE0,0x3F,0xC0,0x50,0x40,0x1F,0xC0,0x10,0x40,0x1F,0xC0,0x10,0x40,0x0F,0xC0,0x30,0x60,0x00,0x00,}}, +{ 0x8CC1, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x00,0x21,0x80,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CC2, {0x01,0x00,0x79,0x00,0x4B,0xC0,0x7A,0x40,0x4D,0x80,0x79,0x80,0x4A,0x40,0x4F,0xE0,0x7A,0x40,0x32,0x40,0x4B,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x8CC3, {0x11,0x80,0x67,0x00,0xBF,0xE0,0x2F,0xC0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CC4, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x71,0x00,0x53,0xC0,0x72,0x40,0x57,0xC0,0x5A,0x40,0x73,0xC0,0x62,0x40,0x52,0x40,0x82,0xC0,0x00,0x00,}}, +{ 0x8CC7, {0x24,0x00,0x27,0xC0,0x1B,0x00,0x35,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CC8, {0x00,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CCA, {0x01,0x80,0x71,0x40,0x5F,0xE0,0x71,0x00,0x55,0x20,0x75,0x20,0x5F,0x40,0x54,0xC0,0x74,0x80,0x24,0xA0,0x55,0x60,0x82,0x20,0x00,0x00,}}, +{ 0x8CCD, {0x01,0x80,0x71,0x80,0x57,0xE0,0x75,0x80,0x55,0x80,0x77,0xC0,0x55,0x80,0x55,0x80,0x7D,0x80,0x79,0x80,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x8CCE, {0x01,0x80,0x71,0x40,0x5F,0xE0,0x71,0xC0,0x5F,0x00,0x71,0xE0,0x5F,0x40,0x51,0x40,0x71,0x80,0x52,0xA0,0x5C,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x8CD1, {0x00,0x00,0x77,0xE0,0x54,0x00,0x75,0xC0,0x54,0x00,0x77,0xE0,0x55,0x80,0x55,0xA0,0x75,0xC0,0x35,0x80,0x49,0xC0,0x96,0x20,0x00,0x00,}}, +{ 0x8CD3, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0x3F,0x80,0x6F,0x40,0xFF,0x00,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CDA, {0x04,0x00,0xFF,0xE0,0x3C,0xC0,0x5F,0x40,0x75,0xC0,0xFF,0xE0,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CDB, {0x20,0x80,0x7B,0xC0,0x31,0x80,0xFB,0xE0,0x7F,0xC0,0xA0,0xA0,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CDC, {0x00,0x00,0x77,0x80,0x54,0x80,0x57,0x80,0x77,0x80,0x50,0x00,0x5F,0xE0,0x74,0x00,0x57,0xC0,0x5A,0xC0,0x55,0x40,0x8A,0x80,0x00,0x00,}}, +{ 0x8CDE, {0x24,0x80,0x15,0x00,0x7F,0xE0,0x9F,0x00,0x1F,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CE0, {0x00,0x80,0x78,0x80,0x4F,0xE0,0x7A,0x40,0x49,0xC0,0x7F,0xE0,0x48,0x00,0x4B,0xC0,0x7A,0x40,0x2A,0x40,0x4B,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x8CE2, {0x00,0x00,0x7F,0xC0,0x7A,0x40,0x79,0x80,0x7E,0x60,0x7F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CE3, {0x04,0x00,0xFF,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x3F,0x80,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8CE4, {0x01,0x80,0x71,0x40,0x5F,0xE0,0x7F,0xC0,0x51,0xA0,0x76,0x60,0x51,0xA0,0x53,0xE0,0x7F,0xC0,0x71,0xA0,0x53,0x60,0x8C,0x20,0x00,0x00,}}, +{ 0x8CE6, {0x00,0x80,0x77,0xC0,0x50,0xA0,0x7F,0xE0,0x52,0x80,0x76,0x80,0x57,0x80,0x56,0x80,0x76,0x80,0x37,0xA0,0x5C,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x8CEA, {0x19,0x80,0x63,0x00,0x7F,0xE0,0x54,0x80,0xBF,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0x8CED, {0x01,0x00,0x71,0x40,0x5F,0xC0,0x71,0x80,0x5F,0xE0,0x71,0x00,0x53,0xC0,0x56,0x40,0x7B,0xC0,0x22,0x40,0x53,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x8CFA, {0x01,0x40,0x77,0xC0,0x5F,0xE0,0x7F,0xC0,0x53,0xC0,0x7F,0xE0,0x53,0xC0,0x5F,0xC0,0x77,0x80,0x7F,0xC0,0x53,0xA0,0x83,0x80,0x00,0x00,}}, +{ 0x8CFB, {0x01,0x80,0x7F,0xE0,0x57,0xC0,0x77,0xC0,0x57,0xC0,0x75,0x40,0x57,0xC0,0x55,0x40,0x7F,0xE0,0x7F,0xE0,0x52,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x8CFC, {0x02,0x80,0x7F,0xE0,0x52,0x80,0x57,0xC0,0x7F,0xE0,0x51,0x00,0x77,0xC0,0x55,0x40,0x57,0xC0,0x7F,0xE0,0x54,0x40,0x84,0xC0,0x00,0x00,}}, +{ 0x8CFD, {0x04,0x00,0x7F,0xE0,0xFF,0xE0,0xFF,0xE0,0x13,0x00,0xFF,0xE0,0x3F,0x80,0x71,0xC0,0xBF,0xE0,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8D04, {0x21,0x00,0xFB,0x00,0xFF,0x80,0xFF,0xA0,0xFB,0xA0,0x24,0x60,0x3F,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8D05, {0x21,0x00,0xFB,0x00,0xFF,0xE0,0xFE,0x80,0x79,0x80,0x5E,0x60,0xBF,0x80,0x31,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8D07, {0x23,0xA0,0xFF,0xE0,0x39,0x80,0x35,0xA0,0xCE,0x60,0x3F,0x20,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8D08, {0x02,0x20,0x39,0x40,0x2B,0xE0,0x3B,0xE0,0x2A,0xA0,0x3B,0xE0,0x28,0x00,0x2B,0xC0,0x3A,0x40,0x13,0xC0,0x2B,0xC0,0x42,0x40,0x00,0x00,}}, +{ 0x8D0A, {0x73,0x80,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0x56,0xA0,0xBF,0xE0,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x1B,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x8D0B, {0x00,0x00,0x7F,0xE0,0x4A,0x80,0x57,0xE0,0x7B,0xC0,0x53,0xE0,0x5F,0x80,0x48,0x80,0x4F,0x80,0x4F,0x80,0x8F,0x80,0x30,0x60,0x00,0x00,}}, +{ 0x8D0D, {0x01,0x00,0x73,0x80,0x5F,0xE0,0x77,0xE0,0x56,0x60,0x75,0x80,0x57,0xE0,0x55,0x80,0x7F,0xC0,0x7B,0xC0,0x53,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x8D0F, {0x04,0x00,0xFF,0xE0,0x1F,0x80,0x3F,0x80,0x60,0x80,0x7F,0x80,0x6F,0xC0,0x6B,0xC0,0x6F,0xC0,0x6F,0xE0,0x6F,0x60,0xF2,0x20,0x00,0x00,}}, +{ 0x8D10, {0x01,0x00,0x77,0xC0,0x5F,0xE0,0x7F,0xE0,0x53,0x00,0x7F,0xE0,0x57,0xC0,0x5B,0xE0,0x77,0xC0,0x75,0xC0,0x5F,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x8D13, {0x00,0xC0,0x70,0xE0,0x77,0xE0,0x77,0xA0,0x7F,0xA0,0x67,0xA0,0x7F,0xC0,0x77,0xC0,0x77,0xE0,0x7F,0xE0,0x68,0xA0,0x91,0x20,0x00,0x00,}}, +{ 0x8D14, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x73,0x40,0xCE,0x20,0x00,0x00,}}, +{ 0x8D16, {0x01,0x80,0x77,0xE0,0x57,0xE0,0x77,0xE0,0x56,0xE0,0x77,0xE0,0x53,0xC0,0x52,0x40,0x73,0xC0,0x73,0xC0,0x53,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x8D64, {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x09,0x00,0x29,0x80,0x49,0x40,0x89,0x20,0x11,0x00,0x11,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x8D66, {0x21,0x00,0x21,0x00,0x79,0xE0,0x22,0x40,0xFC,0x40,0x51,0x40,0x59,0x40,0xD4,0x80,0xD4,0x80,0x51,0x80,0x52,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x8D67, {0x20,0x00,0x33,0xC0,0x7A,0x40,0x23,0xC0,0xFE,0x00,0x73,0xC0,0x7B,0x40,0x7B,0xC0,0xF6,0x80,0x76,0x80,0x53,0x40,0xB2,0x20,0x00,0x00,}}, +{ 0x8D6B, {0x20,0x80,0x20,0x80,0x7B,0xC0,0x20,0x80,0xFF,0xE0,0x51,0x80,0x5B,0x80,0xD7,0xC0,0xDD,0xA0,0x5A,0x80,0x52,0x80,0xB4,0x80,0x00,0x00,}}, +{ 0x8D6D, {0x21,0x00,0x33,0x40,0x7F,0xC0,0x21,0x80,0xFF,0xE0,0x71,0x80,0x7A,0x40,0x7F,0xC0,0xF7,0xC0,0x77,0xC0,0x53,0xC0,0xB2,0x40,0x00,0x00,}}, +{ 0x8D70, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x24,0x00,0x27,0xC0,0x24,0x00,0x34,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x8D71, {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x21,0x80,0x11,0x00,0x13,0x00,0x66,0x00,0x78,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x8D73, {0x20,0x80,0x32,0x80,0x7A,0x80,0x22,0x80,0xFE,0x80,0x22,0x80,0x62,0xE0,0x7B,0x80,0x66,0x80,0x60,0x80,0x98,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8D74, {0x10,0x80,0x10,0x80,0x7E,0x80,0x10,0x80,0xFE,0x80,0x10,0xC0,0x50,0xA0,0x5E,0xA0,0x50,0x80,0x70,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8D77, {0x20,0x00,0x23,0xC0,0x78,0x40,0x20,0x40,0xFF,0xC0,0x22,0x40,0x62,0x00,0x7A,0x00,0x62,0x20,0x63,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8D81, {0x21,0x80,0x31,0x80,0x79,0x80,0x22,0x40,0xFC,0x20,0x21,0x00,0x62,0x80,0x79,0x20,0x62,0x40,0x61,0x80,0x9E,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8D85, {0x20,0x00,0x27,0xC0,0x79,0x40,0x22,0x40,0xFA,0xC0,0x24,0x00,0x63,0xC0,0x7A,0x40,0x63,0xC0,0x62,0x40,0x98,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8D8A, {0x21,0x00,0x21,0x40,0x7F,0xE0,0x27,0x00,0xFD,0xC0,0x25,0xC0,0x65,0x80,0x7F,0xA0,0x66,0xE0,0x61,0x20,0x98,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8D99, {0x21,0x80,0x33,0xC0,0x7F,0xA0,0x27,0xE0,0xFE,0x40,0x23,0xC0,0x62,0x40,0x7B,0xC0,0x62,0x40,0x62,0x40,0x98,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8DA3, {0x20,0x00,0x3F,0xE0,0x75,0x00,0x27,0xC0,0xFD,0x40,0x27,0x40,0x65,0x80,0x7F,0xC0,0x65,0xA0,0x61,0x00,0x59,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8DA8, {0x22,0x00,0x23,0xC0,0x7D,0x40,0x27,0xC0,0xFA,0x40,0x26,0x80,0x63,0xC0,0x7D,0x40,0x67,0xC0,0x67,0xC0,0x5C,0xC0,0x87,0xE0,0x00,0x00,}}, +{ 0x8DB3, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x24,0x80,0x04,0x00,0x24,0x00,0x27,0x80,0x24,0x00,0x34,0x00,0x4C,0x00,0x83,0xE0,0x00,0x00,}}, +{ 0x8DBA, {0x01,0x80,0x79,0x80,0x4B,0xC0,0x7B,0xC0,0x31,0x80,0x67,0xE0,0x79,0x80,0x61,0x80,0x79,0x80,0x7A,0x80,0xC4,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x8DBE, {0x01,0x80,0x79,0x80,0x49,0x80,0x7B,0x80,0x33,0xE0,0x63,0x80,0x7B,0x80,0x63,0x80,0x7B,0x80,0x7B,0x80,0xCF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8DC2, {0x01,0x80,0x79,0x80,0x4F,0xE0,0x7F,0xE0,0x31,0x80,0x67,0xC0,0x7A,0x40,0x61,0x80,0x79,0x80,0x79,0x80,0xC6,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x8DCB, {0x01,0x80,0x79,0x40,0x4F,0xE0,0x7F,0xE0,0x31,0x40,0x61,0x40,0x7B,0x40,0x63,0x80,0x7F,0x80,0x79,0x80,0xD2,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x8DCC, {0x01,0x80,0x7B,0x80,0x4B,0xC0,0x7B,0xC0,0x35,0x80,0x6F,0xE0,0x79,0x80,0x61,0x80,0x79,0x80,0x7A,0x80,0xC4,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x8DCF, {0x04,0x00,0x74,0x00,0x5E,0xE0,0x7F,0xA0,0x35,0xA0,0x65,0xA0,0x75,0xA0,0x65,0xA0,0x7D,0xA0,0x79,0xE0,0xD1,0xE0,0x26,0x00,0x00,0x00,}}, +{ 0x8DD6, {0x00,0x00,0x7F,0xE0,0x49,0x00,0x79,0x00,0x32,0x00,0x63,0xC0,0x7E,0x40,0x66,0x40,0x6A,0x40,0x7A,0x40,0x73,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x8DDA, {0x00,0x00,0xEF,0xC0,0xAB,0xC0,0xEB,0xC0,0x6B,0xC0,0xFF,0xE0,0xFB,0xC0,0xEB,0xC0,0xFB,0xC0,0xFB,0xC0,0x8B,0xC0,0x08,0xC0,0x00,0x00,}}, +{ 0x8DDB, {0x01,0x80,0x71,0x80,0x57,0xE0,0x75,0x80,0x35,0x80,0x67,0xC0,0x7E,0x40,0x65,0x80,0x7D,0x80,0x79,0x80,0xD6,0x40,0x38,0x20,0x00,0x00,}}, +{ 0x8DDD, {0x00,0x00,0x7B,0xE0,0x4A,0x00,0x7B,0xC0,0x22,0x40,0x62,0x40,0x7A,0x40,0x63,0xC0,0x62,0x40,0x7A,0x00,0x73,0xE0,0xC2,0x00,0x00,0x00,}}, +{ 0x8DDF, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x32,0x40,0x63,0xC0,0x7B,0xA0,0x63,0xA0,0x62,0xC0,0x7A,0x80,0x73,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x8DE1, {0x00,0x80,0x78,0x80,0x4F,0xE0,0x79,0x80,0x21,0x80,0x63,0xC0,0x7B,0xC0,0x65,0xA0,0x7A,0xA0,0x62,0x80,0x84,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x8DE3, {0x01,0x80,0x7B,0x80,0x4B,0xC0,0x7B,0xC0,0x35,0x80,0x67,0xE0,0x79,0x80,0x61,0x80,0x7A,0x80,0x7A,0xA0,0xC4,0xA0,0x08,0x60,0x00,0x00,}}, +{ 0x8DE8, {0x00,0x80,0x78,0x80,0x4F,0xE0,0x7A,0x40,0x17,0xE0,0x50,0x00,0x5F,0xE0,0x51,0x00,0x53,0xC0,0x5A,0x40,0x70,0x40,0xC0,0x80,0x00,0x00,}}, +{ 0x8DEA, {0x01,0x00,0x73,0xC0,0x5E,0x80,0x7F,0xE0,0x34,0x00,0x65,0xC0,0x7D,0x40,0x65,0x40,0x7D,0x80,0x79,0x20,0xD1,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x8DEB, {0x00,0x00,0x7F,0x80,0x24,0x80,0x3E,0xA0,0xE5,0xA0,0x08,0x60,0x7F,0x80,0x60,0x80,0x3F,0x80,0x27,0x80,0x34,0x00,0xCF,0xE0,0x00,0x00,}}, +{ 0x8DEF, {0x01,0x00,0x79,0x00,0x4B,0xC0,0x7A,0x40,0x25,0x80,0x21,0x80,0x7A,0x40,0x67,0xE0,0x62,0x40,0x7A,0x40,0x63,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x8DF3, {0x02,0x80,0x72,0x80,0x5A,0xC0,0x76,0xC0,0x22,0x80,0x62,0x80,0x76,0xC0,0x6A,0xA0,0x72,0x80,0x74,0xA0,0xC8,0xA0,0x10,0xE0,0x00,0x00,}}, +{ 0x8DF5, {0x01,0x80,0x79,0x40,0x4F,0xC0,0x79,0xC0,0x27,0x00,0x61,0xE0,0x7F,0x40,0x61,0x40,0x79,0x80,0x61,0xA0,0xC6,0x60,0x18,0x20,0x00,0x00,}}, +{ 0x8DFC, {0x00,0x00,0x77,0xC0,0x54,0x40,0x77,0xC0,0x34,0x00,0x67,0xE0,0x7C,0x20,0x67,0xA0,0x7F,0xA0,0x7B,0xA0,0xD0,0x20,0x20,0xC0,0x00,0x00,}}, +{ 0x8DFF, {0x01,0x80,0x79,0x80,0x4B,0xC0,0x79,0x80,0x37,0xE0,0x61,0x80,0x7B,0x80,0x63,0xC0,0x7F,0x80,0x7F,0x80,0xC9,0x80,0x10,0x60,0x00,0x00,}}, +{ 0x8E08, {0x01,0x80,0x79,0x80,0x4F,0xE0,0x7B,0xC0,0x33,0xC0,0x63,0xC0,0x7B,0xC0,0x61,0x80,0x7B,0xC0,0x7D,0xA0,0xC9,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8E09, {0x01,0x80,0x79,0x80,0x4B,0xC0,0x7A,0x40,0x73,0xC0,0x22,0x40,0x7B,0xC0,0x63,0xA0,0x62,0xC0,0x7A,0x80,0x73,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x8E0A, {0x00,0x00,0x3F,0xE0,0x29,0x80,0x3B,0xE0,0x3A,0xA0,0x12,0xA0,0x3B,0xE0,0x32,0xA0,0x33,0xE0,0x36,0xA0,0x3A,0xA0,0x62,0xE0,0x00,0x00,}}, +{ 0x8E0F, {0x00,0x80,0x78,0xA0,0x4F,0xC0,0x7A,0xC0,0x6C,0xA0,0x20,0x80,0x7B,0xC0,0x62,0x40,0x63,0xC0,0x6A,0x40,0x73,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x8E10, {0x01,0x80,0x79,0x40,0x4F,0xE0,0x7F,0xC0,0x31,0xA0,0x66,0x60,0x79,0xA0,0x63,0xE0,0x7F,0xC0,0x79,0xA0,0xC3,0xE0,0x0C,0x20,0x00,0x00,}}, +{ 0x8E1D, {0x00,0x00,0x7B,0xC0,0x4B,0xC0,0x7B,0xC0,0x33,0xC0,0x63,0xC0,0x79,0x80,0x67,0xE0,0x7B,0xC0,0x7D,0xA0,0xC9,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8E1E, {0x00,0x00,0x77,0xC0,0x54,0x40,0x77,0xC0,0x35,0xC0,0x65,0x80,0x7F,0xE0,0x65,0x80,0x7F,0xC0,0x7A,0x40,0xD3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x8E1F, {0x02,0x00,0x3A,0x00,0x2B,0xE0,0x3B,0xE0,0x1D,0xE0,0x31,0xE0,0x3F,0xE0,0x31,0xE0,0x3F,0xE0,0x3E,0xE0,0x64,0xE0,0x08,0x00,0x00,0x00,}}, +{ 0x8E2A, {0x01,0x80,0x79,0x80,0x4F,0xE0,0x78,0x00,0x73,0xC0,0x20,0x00,0x7F,0xE0,0x61,0x80,0x63,0xC0,0x75,0xA0,0x79,0xA0,0xC1,0x80,0x00,0x00,}}, +{ 0x8E30, {0x03,0x80,0x73,0x80,0x56,0x40,0x7F,0xE0,0x70,0x00,0x2E,0x40,0x7B,0xC0,0x6F,0xC0,0x6F,0x80,0x7F,0xC0,0x7B,0xC0,0xCB,0xC0,0x00,0x00,}}, +{ 0x8E34, {0x00,0x00,0x7F,0xC0,0x49,0x80,0x7B,0xC0,0x73,0xC0,0x23,0xC0,0x7B,0xC0,0x63,0xC0,0x67,0xE0,0x7F,0xE0,0x72,0x20,0xCC,0xC0,0x00,0x00,}}, +{ 0x8E35, {0x00,0xC0,0x7B,0x80,0x4F,0xE0,0x7B,0xC0,0x33,0xC0,0x63,0xC0,0x7B,0xC0,0x63,0xC0,0x7B,0xC0,0x7B,0xC0,0xCF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8E42, {0x00,0x00,0x7B,0xC0,0x49,0x80,0x7F,0xE0,0x73,0xC0,0x27,0x80,0x79,0x80,0x61,0x80,0x67,0xE0,0x7B,0xC0,0x75,0xA0,0xC1,0x80,0x00,0x00,}}, +{ 0x8E44, {0x00,0x80,0x78,0x80,0x4F,0xE0,0x7A,0x40,0x27,0xE0,0x24,0x80,0x7F,0xC0,0x62,0xC0,0x62,0xC0,0x6A,0xC0,0x70,0x80,0xC0,0x80,0x00,0x00,}}, +{ 0x8E47, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x13,0x00,0xFF,0xE0,0x3F,0x80,0x53,0xC0,0x9E,0x60,0x27,0x00,0x3C,0x00,0xC7,0xE0,0x00,0x00,}}, +{ 0x8E48, {0x00,0xC0,0x77,0xC0,0x55,0x60,0x79,0xA0,0x71,0x00,0x27,0xC0,0x7C,0x40,0x64,0x40,0x66,0xC0,0x7C,0x40,0x77,0xC0,0xC4,0x40,0x00,0x00,}}, +{ 0x8E49, {0x04,0x80,0x73,0x80,0x5F,0xE0,0x77,0xC0,0x33,0x00,0x6F,0xE0,0x72,0x00,0x63,0xC0,0x7F,0x80,0x79,0x80,0xDF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8E4A, {0x00,0xC0,0x77,0xC0,0x55,0x60,0x79,0xA0,0x36,0x80,0x61,0x80,0x79,0x80,0x67,0xC0,0x7F,0xE0,0x7F,0xE0,0xC4,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x8E4C, {0x01,0x00,0x73,0x00,0x57,0x80,0x7F,0xC0,0x37,0xE0,0x64,0x80,0x7F,0x80,0x67,0x80,0x7F,0xC0,0x7F,0xC0,0xD7,0xC0,0x04,0x40,0x00,0x00,}}, +{ 0x8E50, {0x01,0x00,0x7D,0xC0,0x59,0x40,0x7F,0xC0,0x74,0x80,0x2F,0xC0,0x7C,0xA0,0x67,0x80,0x67,0x80,0x7F,0x80,0x74,0x80,0xC4,0x80,0x00,0x00,}}, +{ 0x8E55, {0x00,0x00,0x7F,0xC0,0x5F,0xC0,0x7F,0xC0,0x7F,0xC0,0x25,0x80,0x7F,0xE0,0x67,0xC0,0x6F,0xC0,0x7F,0xE0,0x73,0x00,0xC1,0x00,0x00,0x00,}}, +{ 0x8E59, {0x01,0x80,0x7F,0xE0,0x6F,0x40,0x7F,0xC0,0x7D,0x80,0x6B,0xA0,0x48,0x60,0xBF,0xA0,0x3F,0x80,0x3F,0x80,0x3C,0x00,0x47,0xC0,0x00,0x00,}}, +{ 0x8E5F, {0x00,0x80,0x77,0xE0,0x53,0xC0,0x70,0x80,0x7F,0xE0,0x23,0xC0,0x7A,0x40,0x63,0xC0,0x62,0x40,0x7B,0xC0,0x62,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x8E60, {0x01,0x80,0x71,0x80,0x57,0xE0,0x75,0x80,0x37,0xE0,0x65,0x80,0x75,0x80,0x65,0x80,0x7C,0x00,0x7E,0x40,0xD7,0xE0,0x29,0xA0,0x00,0x00,}}, +{ 0x8E63, {0x03,0x80,0x73,0x80,0x5F,0xE0,0x73,0x80,0x73,0x00,0x2F,0xC0,0x79,0x40,0x6F,0xC0,0x6B,0xC0,0x7F,0xC0,0x79,0x40,0xC9,0xC0,0x00,0x00,}}, +{ 0x8E64, {0x03,0xC0,0x73,0xC0,0x5D,0xE0,0x7B,0xA0,0x32,0x80,0x64,0x80,0x7D,0x80,0x6D,0xE0,0x65,0x80,0x7F,0x80,0x76,0x80,0xC4,0x60,0x00,0x00,}}, +{ 0x8E72, {0x03,0x80,0x72,0xC0,0x5F,0xE0,0x7F,0xE0,0x77,0xC0,0x26,0xC0,0x7F,0xC0,0x67,0xC0,0x67,0xE0,0x7F,0xE0,0x73,0x80,0xC1,0x80,0x00,0x00,}}, +{ 0x8E74, {0x04,0x80,0x74,0xC0,0x5E,0xA0,0x7E,0x80,0x2B,0xE0,0x6A,0x80,0x7E,0x80,0x65,0x80,0x6F,0x80,0x75,0xA0,0xC6,0xA0,0x0C,0x60,0x00,0x00,}}, +{ 0x8E76, {0x00,0x00,0x7F,0xE0,0x5D,0x80,0x7B,0x80,0x3F,0xE0,0x6B,0xA0,0x7F,0xC0,0x6F,0x80,0x7E,0xC0,0x7E,0xC0,0xD5,0xA0,0x29,0x20,0x00,0x00,}}, +{ 0x8E7C, {0x03,0x80,0x7B,0xC0,0x5F,0xE0,0x7F,0xE0,0x32,0x80,0x6F,0xC0,0x71,0x00,0x67,0x80,0x7F,0xE0,0x7F,0xE0,0xC4,0x80,0x18,0x60,0x00,0x00,}}, +{ 0x8E81, {0x00,0x00,0x7B,0xC0,0x4B,0xC0,0x7B,0xC0,0x37,0xE0,0x65,0xA0,0x7F,0xE0,0x61,0x80,0x7F,0xE0,0x7B,0xC0,0xCD,0xA0,0x01,0x80,0x00,0x00,}}, +{ 0x8E84, {0x01,0x80,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x6B,0xC0,0xF9,0x80,0x3F,0x80,0x31,0x80,0x3F,0x00,0x27,0x80,0x3C,0x00,0x47,0xC0,0x00,0x00,}}, +{ 0x8E85, {0x00,0x00,0x77,0xC0,0x57,0xC0,0x77,0xC0,0x37,0xE0,0x65,0x20,0x7F,0xA0,0x67,0xA0,0x7F,0xA0,0x79,0xE0,0xCE,0x60,0x00,0xC0,0x00,0x00,}}, +{ 0x8E87, {0x02,0x80,0x7F,0xE0,0x52,0x40,0x77,0xC0,0x73,0xC0,0x2F,0xE0,0x79,0x80,0x63,0xC0,0x6F,0xC0,0x7B,0xC0,0x73,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x8E8A, {0x01,0x00,0x7F,0xE0,0x57,0x80,0x7F,0xE0,0x77,0xC0,0x21,0x00,0x7F,0x80,0x6F,0xE0,0x67,0xE0,0x7F,0xE0,0x7F,0x40,0xC8,0xC0,0x00,0x00,}}, +{ 0x8E8B, {0x01,0x00,0x7F,0xE0,0x5F,0xC0,0x7F,0xC0,0x3F,0xC0,0x71,0xA0,0x7C,0x80,0x67,0x80,0x7F,0x80,0x7F,0x80,0xC8,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x8E8D, {0x00,0x00,0x7F,0xC0,0x5F,0xC0,0x7F,0xC0,0x77,0xC0,0x22,0x80,0x77,0xE0,0x6D,0x00,0x67,0xC0,0x6F,0xC0,0x75,0x00,0xC7,0xE0,0x00,0x00,}}, +{ 0x8E91, {0x0A,0x00,0xFB,0xC0,0xBF,0xC0,0xFF,0xC0,0x77,0x80,0xFB,0xC0,0xFF,0xC0,0xFF,0xA0,0xFF,0xA0,0xFF,0xE0,0x93,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8E93, {0x01,0x40,0x77,0x80,0x57,0xE0,0x77,0xE0,0x79,0x40,0x27,0x80,0x7C,0x80,0x67,0x80,0x7F,0x80,0x7F,0x80,0xC6,0x80,0x18,0x40,0x00,0x00,}}, +{ 0x8E94, {0x01,0x80,0x7F,0xE0,0x5B,0xC0,0x7B,0xC0,0x3B,0xC0,0x6B,0xC0,0x7B,0xC0,0x6F,0xE0,0x7F,0xE0,0x7F,0xE0,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x8E99, {0x00,0x00,0x3F,0xE0,0x2F,0xE0,0x3F,0xE0,0x3F,0xE0,0x14,0xE0,0x3D,0xE0,0x37,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x64,0x60,0x00,0x00,}}, +{ 0x8EA1, {0x00,0x00,0x77,0xC0,0x53,0x80,0x73,0x80,0x37,0x80,0x60,0x80,0x7F,0xE0,0x6B,0xC0,0x7F,0xC0,0x7F,0xC0,0xDB,0xC0,0x02,0x40,0x00,0x00,}}, +{ 0x8EAA, {0x03,0x80,0x7F,0xE0,0x5F,0xC0,0x7F,0xC0,0x7F,0xC0,0x2F,0xC0,0x79,0xC0,0x6B,0xC0,0x6F,0xC0,0x7B,0xC0,0x7B,0xC0,0xC8,0xC0,0x00,0x00,}}, +{ 0x8EAB, {0x04,0x00,0x08,0x00,0x3F,0x80,0x3F,0x80,0x20,0xA0,0x3F,0xC0,0x20,0x80,0x3F,0x80,0xE3,0x80,0x0C,0x80,0x70,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x8EAC, {0x10,0x00,0x33,0xC0,0x38,0x40,0x3B,0xC0,0x2A,0x40,0x3A,0x00,0x2F,0xE0,0x7A,0x20,0x1A,0x20,0x68,0x20,0x08,0x60,0x18,0xC0,0x00,0x00,}}, +{ 0x8EAF, {0x20,0x00,0x63,0xE0,0x42,0x00,0x7A,0x40,0x4B,0x40,0x7B,0x80,0x4E,0x80,0xFA,0xC0,0x1B,0x40,0x2A,0x00,0xCB,0xE0,0x1A,0x00,0x00,0x00,}}, +{ 0x8EB0, {0x21,0x00,0x61,0x00,0x7F,0xE0,0x7F,0xE0,0x53,0x80,0x75,0x80,0x5D,0x80,0xFB,0x40,0x37,0xA0,0xD1,0x00,0x11,0x00,0x31,0x00,0x00,0x00,}}, +{ 0x8EB1, {0x20,0x00,0x67,0x80,0x73,0xC0,0x73,0xC0,0x54,0x40,0x79,0x80,0x59,0x00,0xFF,0xE0,0x37,0x80,0xD9,0x60,0x11,0x00,0x31,0x00,0x00,0x00,}}, +{ 0x8EBE, {0x24,0x80,0x63,0x80,0x7F,0xC0,0x77,0x80,0x53,0x00,0x7F,0xE0,0x59,0x00,0xF3,0x00,0x3F,0xE0,0xD3,0x00,0x14,0x80,0x38,0x60,0x00,0x00,}}, +{ 0x8EC5, {0x20,0x00,0x6F,0xE0,0x6B,0xC0,0x6B,0xC0,0x6F,0xE0,0x6F,0x80,0x7D,0xC0,0xED,0xC0,0x7D,0xC0,0xB5,0x80,0x35,0xE0,0x25,0x00,0x00,0x00,}}, +{ 0x8EC6, {0x23,0x80,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0x5F,0xC0,0x70,0x00,0x5F,0xE0,0xF7,0x80,0x37,0x80,0xD7,0x80,0x1F,0xE0,0x30,0x00,0x00,0x00,}}, +{ 0x8EC8, {0x21,0x00,0x6F,0xE0,0x6B,0xE0,0x6F,0xE0,0x6F,0xC0,0x6D,0xC0,0x7D,0x80,0xED,0xE0,0x7F,0x00,0xB7,0xA0,0x3A,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x8ECA, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8ECB, {0x21,0x00,0x31,0x00,0xFD,0x00,0x79,0x00,0x79,0x00,0x79,0x00,0x69,0x00,0x79,0x00,0xF9,0x00,0xF9,0x20,0x21,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x8ECC, {0x21,0x00,0x21,0x00,0xFD,0x80,0x7F,0x80,0x69,0x80,0x79,0x80,0x69,0x80,0x7A,0x80,0x22,0x80,0xFE,0xA0,0x24,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x8ECD, {0x00,0x00,0x7F,0xE0,0x84,0x20,0xFF,0xC0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8ED2, {0x20,0x00,0x23,0xC0,0xFD,0x00,0x79,0x00,0x69,0x00,0x7F,0xE0,0x69,0x00,0x79,0x00,0x21,0x00,0xF9,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x8EDB, {0x20,0x00,0x33,0xE0,0xFE,0x00,0x7B,0xC0,0x7B,0x40,0x7B,0x40,0x6B,0x40,0x7B,0xC0,0xFF,0x00,0xFD,0x20,0x29,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x8EDF, {0x21,0x00,0x21,0x00,0xFD,0x00,0x7B,0xE0,0x6A,0xC0,0x7C,0x80,0x68,0x80,0x78,0x80,0x21,0x80,0xFE,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x8EE2, {0x20,0x00,0x23,0xC0,0xFC,0x00,0x78,0x00,0x6F,0xE0,0x78,0x80,0x68,0x80,0x78,0x80,0x21,0x40,0xF9,0xC0,0x27,0x20,0x20,0x20,0x00,0x00,}}, +{ 0x8EE3, {0x04,0x00,0x7F,0xC0,0x3F,0x80,0x3F,0x80,0x35,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x75,0xC0,0x1B,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,}}, +{ 0x8EEB, {0x21,0x80,0x31,0x80,0xFD,0x80,0x7A,0x40,0x7C,0x20,0x7B,0x00,0x68,0x80,0x79,0x00,0xFA,0x20,0xF8,0x40,0x21,0x80,0x26,0x00,0x00,0x00,}}, +{ 0x8EF8, {0x10,0x40,0x10,0x40,0x7E,0x40,0x3D,0xE0,0x35,0x60,0x3D,0x60,0x35,0xE0,0x3D,0x60,0x11,0x60,0x7F,0x60,0x11,0xE0,0x11,0x20,0x00,0x00,}}, +{ 0x8EFB, {0x20,0x00,0x37,0xE0,0xFC,0x40,0x7B,0x40,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0xFE,0x40,0xF8,0x40,0x20,0x40,0x20,0xC0,0x00,0x00,}}, +{ 0x8EFC, {0x21,0x80,0x33,0x80,0xFF,0x80,0x7B,0xC0,0x7B,0x80,0x7D,0x80,0x6F,0xE0,0x79,0x80,0xF9,0x80,0xFE,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x8EFD, {0x20,0x00,0x27,0xC0,0xFA,0x40,0x79,0x80,0x6B,0x80,0x7D,0x60,0x69,0x00,0x7B,0xC0,0x21,0x00,0xF9,0x00,0x27,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x8EFE, {0x21,0xC0,0x31,0xA0,0xFF,0xE0,0x7F,0xE0,0x79,0x80,0x7F,0x80,0x6A,0x80,0x7A,0x80,0xFA,0x80,0xFB,0xE0,0x2C,0x60,0x20,0x20,0x00,0x00,}}, +{ 0x8F03, {0x21,0x00,0x21,0x00,0xFF,0xE0,0x79,0x80,0x6A,0x40,0x7E,0xA0,0x6A,0x80,0x79,0x80,0x21,0x80,0xF9,0x80,0x22,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x8F05, {0x21,0x00,0x31,0x00,0xFF,0xC0,0x7A,0x40,0x7D,0x80,0x79,0x80,0x6A,0x40,0x7F,0xE0,0xFE,0x40,0xFE,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x8F09, {0x11,0x00,0x3D,0x80,0x11,0x40,0xFF,0xE0,0x7D,0x00,0x55,0x40,0x7D,0x40,0x7C,0x80,0x10,0x80,0xFD,0xA0,0x12,0x60,0x10,0x20,0x00,0x00,}}, +{ 0x8F0A, {0x20,0x00,0x37,0xE0,0xFD,0x80,0x79,0xC0,0x7F,0xE0,0x79,0xA0,0x69,0x80,0x7B,0xC0,0xF9,0x80,0xF9,0x80,0x27,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x8F0C, {0x60,0x00,0x6F,0xE0,0xF1,0x00,0xFF,0xC0,0xFB,0x40,0xFD,0xC0,0xFD,0xC0,0xFF,0xC0,0xFF,0xC0,0xF8,0x40,0x68,0x40,0x68,0xC0,0x00,0x00,}}, +{ 0x8F12, {0x20,0x00,0x3F,0xE0,0xFD,0x80,0x77,0x80,0x77,0x80,0x75,0x80,0x77,0x80,0x75,0x80,0xFF,0x80,0xFF,0xA0,0x21,0xA0,0x21,0x60,0x00,0x00,}}, +{ 0x8F13, {0x21,0x00,0x33,0xC0,0xFE,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0xF9,0x80,0xFE,0xA0,0x24,0xA0,0x28,0x60,0x00,0x00,}}, +{ 0x8F14, {0x20,0xC0,0x20,0xA0,0xFF,0xE0,0x78,0x80,0x6B,0xC0,0x7A,0xC0,0x6A,0xC0,0x7B,0xC0,0x22,0xC0,0xFF,0xC0,0x22,0xC0,0x22,0xC0,0x00,0x00,}}, +{ 0x8F15, {0x20,0x00,0x37,0xE0,0xFF,0xC0,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x68,0x00,0x7B,0xC0,0xF9,0x80,0xF9,0x80,0x27,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x8F19, {0x20,0x00,0x3F,0xE0,0xFD,0x00,0x7F,0xC0,0x7F,0xC0,0x7D,0xC0,0x6F,0xC0,0x7D,0x80,0xFF,0xC0,0xFF,0xC0,0x21,0x20,0x21,0x00,0x00,0x00,}}, +{ 0x8F1B, {0x60,0x00,0x6F,0xE0,0xF1,0x00,0xFF,0xC0,0xFB,0x40,0xFF,0xC0,0xFB,0xC0,0xFB,0xC0,0xFD,0x40,0xF9,0x40,0x69,0x40,0x69,0xC0,0x00,0x00,}}, +{ 0x8F1C, {0x11,0xE0,0x19,0xE0,0x7E,0xC0,0x3F,0xE0,0x3D,0xE0,0x3C,0x00,0x35,0xE0,0x3D,0xE0,0x7F,0xE0,0x7F,0xE0,0x11,0xE0,0x11,0x20,0x00,0x00,}}, +{ 0x8F1D, {0x20,0x00,0x27,0xE0,0xA8,0xA0,0x7F,0xE0,0x33,0xC0,0xFE,0xC0,0x33,0xC0,0x33,0xC0,0x38,0x80,0x5F,0xE0,0x40,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x8F1F, {0x20,0x00,0x37,0xC0,0xF9,0x40,0x7F,0xC0,0x7B,0xC0,0x7D,0xA0,0x6F,0xC0,0x79,0xC0,0xFF,0xC0,0xFE,0x80,0x27,0xC0,0x29,0x20,0x00,0x00,}}, +{ 0x8F26, {0x21,0x80,0x7B,0xC0,0xFF,0xE0,0xFF,0xE0,0x4E,0x40,0xFF,0xA0,0x3F,0x80,0x35,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x8F29, {0x09,0x00,0xF9,0xE0,0x79,0xC0,0xFD,0xE0,0x15,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x8F2A, {0x21,0x00,0x21,0x00,0xFA,0x80,0x24,0x40,0xFF,0xC0,0xF0,0x20,0xFF,0xC0,0xFA,0xC0,0x2F,0xC0,0xFA,0xC0,0x2A,0xC0,0x28,0x40,0x00,0x00,}}, +{ 0x8F2F, {0x23,0xC0,0x22,0x40,0xFF,0xC0,0x7F,0xE0,0x6A,0x40,0x7B,0xC0,0x6A,0x40,0x7B,0xC0,0x22,0x60,0xFB,0xC0,0x26,0x40,0x20,0x40,0x00,0x00,}}, +{ 0x8F33, {0x21,0x80,0x31,0x80,0xFF,0xE0,0x7B,0xC0,0x79,0x80,0x7F,0xE0,0x69,0x80,0x7B,0xC0,0xFF,0xE0,0xFB,0xC0,0x21,0x40,0x26,0x20,0x00,0x00,}}, +{ 0x8F38, {0x41,0x00,0x41,0x00,0xFA,0x80,0x44,0x80,0xFF,0xC0,0xD0,0x20,0xFE,0xC0,0xFA,0xC0,0x4E,0xC0,0xFE,0xC0,0x4A,0x40,0x4A,0xC0,0x00,0x00,}}, +{ 0x8F39, {0x22,0x00,0x32,0x00,0xFF,0xE0,0x7F,0x80,0x7B,0x80,0x7A,0x80,0x6B,0x80,0x7B,0x00,0xFF,0xC0,0xFF,0x80,0x23,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x8F3B, {0x10,0x00,0x1B,0xE0,0x7D,0xC0,0x3D,0xC0,0x3D,0x40,0x3D,0xC0,0x34,0x00,0x3F,0xE0,0x7F,0xE0,0x7F,0xE0,0x13,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x8F3E, {0x20,0x00,0x37,0xC0,0xFC,0x40,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x6D,0x80,0x7F,0xC0,0xFF,0xE0,0xFE,0xC0,0x33,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x8F3F, {0x24,0x00,0x65,0xC0,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x55,0x40,0x7F,0xC0,0x7F,0x40,0xFF,0xE0,0xFF,0xE0,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x8F42, {0x20,0x00,0xFD,0x80,0x79,0x80,0x7D,0xA0,0xFA,0xA0,0xFC,0x60,0x7B,0xC0,0x79,0x40,0x79,0x80,0x79,0x80,0xFD,0x80,0x26,0x60,0x00,0x00,}}, +{ 0x8F44, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x7C,0xA0,0x6B,0xC0,0x7B,0xC0,0x68,0x80,0x7F,0xE0,0x23,0xC0,0xFA,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x8F45, {0x21,0x80,0x33,0xC0,0xFF,0xE0,0x7F,0xE0,0x7B,0xC0,0x7A,0x40,0x6B,0xC0,0x79,0xA0,0xFF,0xE0,0xFF,0xC0,0x21,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x8F46, {0x61,0x00,0x63,0x00,0xFF,0xE0,0xFF,0xC0,0xFB,0xC0,0xFB,0xC0,0xFF,0xC0,0xFD,0xA0,0xFF,0xC0,0xFD,0xA0,0x77,0xA0,0x68,0xE0,0x00,0x00,}}, +{ 0x8F49, {0x21,0xC0,0x37,0xE0,0xFB,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x79,0xC0,0xFF,0xE0,0xFF,0xE0,0x23,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x8F4C, {0x20,0x00,0x37,0xE0,0xFF,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x68,0x00,0x7B,0xC0,0xFF,0xE0,0xFF,0xE0,0x23,0xC0,0x20,0x40,0x00,0x00,}}, +{ 0x8F4D, {0x24,0x80,0x24,0x80,0xFE,0x80,0x2F,0xE0,0xFF,0x40,0xB1,0x40,0xFF,0x40,0xFA,0x80,0x2E,0x80,0xFE,0x80,0x2B,0x40,0x2A,0x20,0x00,0x00,}}, +{ 0x8F4E, {0x20,0xC0,0x33,0x80,0xFF,0xE0,0x7F,0xE0,0x7B,0xC0,0x7D,0xA0,0x69,0x80,0x7F,0xE0,0xFD,0xA0,0xFD,0xA0,0x25,0xA0,0x24,0x60,0x00,0x00,}}, +{ 0x8F57, {0x61,0xC0,0x61,0xA0,0xFF,0xE0,0xFF,0xC0,0xF8,0xC0,0xFF,0xA0,0xFD,0x60,0xF7,0x20,0xFB,0x00,0xFA,0x20,0x72,0xA0,0x61,0x80,0x00,0x00,}}, +{ 0x8F5C, {0x60,0x00,0x6F,0xE0,0xFF,0xE0,0xFF,0xE0,0xFD,0xC0,0xFD,0xC0,0xFF,0xE0,0xF2,0x00,0xFF,0xC0,0xFB,0xC0,0x6B,0xC0,0x68,0xC0,0x00,0x00,}}, +{ 0x8F5F, {0x04,0x00,0x3F,0x80,0x1F,0x00,0x1F,0x00,0x7F,0xC0,0x24,0x80,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0xFF,0xE0,0x20,0x80,0x00,0x00,}}, +{ 0x8F61, {0x44,0x80,0x7F,0xA0,0xFF,0xC0,0x7E,0xE0,0xFF,0xE0,0x75,0xC0,0xBF,0xA0,0x24,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x8F62, {0x69,0x40,0x6B,0x40,0xF7,0xA0,0xFF,0xE0,0xEB,0xC0,0xF7,0xA0,0xFD,0xE0,0xF3,0x00,0xFF,0xE0,0xE7,0x80,0x79,0x60,0x61,0x00,0x00,0x00,}}, +{ 0x8F63, {0x60,0x00,0x6F,0xE0,0xFF,0xC0,0xFF,0xE0,0xFB,0xC0,0xFF,0xC0,0xFA,0xA0,0xF9,0x80,0xFB,0xC0,0xFB,0x80,0x7F,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x8F64, {0x61,0x00,0x63,0xC0,0xFF,0xE0,0xFF,0xC0,0xFF,0xC0,0xFD,0x80,0xFF,0x80,0xFF,0x80,0xFF,0xC0,0xFF,0xC0,0x75,0xC0,0x6F,0xE0,0x00,0x00,}}, +{ 0x8F9B, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8F9C, {0x04,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0x80,0x7F,0x80,0x04,0x00,0x7F,0xC0,0x31,0x80,0xFF,0xE0,0x7F,0xC0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x8F9E, {0x08,0x80,0x10,0x80,0x67,0xE0,0x22,0x40,0xF9,0x40,0x27,0xE0,0x20,0x80,0x78,0x80,0x4F,0xE0,0x48,0x80,0x78,0x80,0x48,0x80,0x00,0x00,}}, +{ 0x8F9F, {0x01,0x80,0x79,0x80,0x6F,0xE0,0x6A,0x40,0x79,0xC0,0x6F,0xE0,0x61,0x80,0x79,0x80,0xEF,0xE0,0x79,0x80,0x69,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x8FA3, {0x21,0x00,0x33,0x00,0xFF,0xE0,0x57,0xC0,0x77,0x40,0xFD,0x40,0x27,0xC0,0x3B,0x80,0xE7,0x80,0x29,0x40,0x61,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x8FA7, {0x60,0x80,0x60,0xC0,0xFF,0xE0,0x6B,0xC0,0x6B,0xC0,0xFB,0xE0,0x6A,0x80,0x7A,0xC0,0xEB,0xE0,0x7A,0x80,0x52,0x80,0xA6,0x80,0x00,0x00,}}, +{ 0x8FA8, {0x62,0x80,0x62,0xC0,0xF3,0xE0,0x6B,0xC0,0x6B,0xC0,0xFB,0xE0,0x6A,0x80,0x7A,0xC0,0xE3,0xE0,0x64,0x80,0x44,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x8FAD, {0x0C,0x80,0x78,0xC0,0x7F,0xE0,0xF9,0x40,0x11,0xC0,0x7F,0xE0,0x6C,0x80,0x7C,0xC0,0x7F,0xE0,0x5C,0x80,0x7C,0x80,0x4C,0x80,0x00,0x00,}}, +{ 0x8FAE, {0x64,0x80,0x64,0xC0,0xFF,0xE0,0x7B,0xC0,0x65,0xC0,0xFB,0xE0,0x6F,0x80,0x74,0xC0,0xF7,0xE0,0x55,0x80,0x74,0x80,0x84,0x80,0x00,0x00,}}, +{ 0x8FAF, {0x60,0x80,0x6E,0xC0,0xFF,0xE0,0x7F,0xC0,0x6F,0xC0,0xF1,0xE0,0x6E,0x80,0x70,0xC0,0xEF,0xE0,0x4E,0x80,0x4A,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x8FB0, {0x00,0x00,0x7F,0xE0,0x40,0x00,0x5F,0xC0,0x40,0x00,0x7F,0xE0,0x4A,0x40,0x49,0x40,0x49,0x80,0x4A,0x80,0x8C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x8FB1, {0x00,0x00,0x7F,0xE0,0x4F,0x80,0x40,0x00,0x7F,0xE0,0x4B,0x40,0x4C,0x80,0xB1,0x60,0xFF,0xE0,0x11,0x00,0x09,0x00,0x03,0x00,0x00,0x00,}}, +{ 0x8FB2, {0x0A,0x00,0x3F,0x80,0x2A,0x80,0x3F,0x80,0x2A,0x80,0x7F,0xC0,0x5F,0x80,0x40,0x00,0x7F,0xE0,0x4A,0xC0,0x4D,0x80,0xB0,0x60,0x00,0x00,}}, +{ 0x8FB7, {0x20,0x00,0x20,0x00,0x00,0x00,0x40,0x00,0x7F,0xC0,0x00,0x00,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FBA, {0x00,0x00,0x80,0x00,0x5F,0xC0,0x42,0x40,0x02,0x40,0xE2,0x40,0x24,0x40,0x24,0x40,0x28,0xC0,0x30,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FBB, {0x01,0x00,0x41,0x00,0x21,0x00,0x01,0x00,0x1F,0xE0,0xE1,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x61,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FBC, {0x00,0x00,0x47,0x00,0x21,0x00,0x01,0x00,0x03,0x00,0xE3,0x00,0x24,0x80,0x24,0x80,0x28,0x40,0x70,0x20,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FBF, {0x01,0x00,0x41,0x00,0x29,0x40,0x09,0x40,0x09,0x40,0xE9,0x40,0x29,0x40,0x29,0x40,0x2F,0xC0,0x20,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FC2, {0x00,0x00,0x4F,0xC0,0x21,0x00,0x21,0x00,0x1F,0xE0,0xE1,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x23,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FC4, {0x04,0x00,0x44,0x00,0x27,0xE0,0x18,0x00,0x07,0x80,0xE2,0x00,0x24,0x00,0x28,0x20,0x28,0x20,0x27,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FC5, {0x00,0x00,0x5F,0x80,0x24,0x80,0x04,0x80,0x04,0x80,0x1F,0x80,0xE4,0x80,0x24,0x80,0x24,0x60,0x24,0x20,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FCE, {0x01,0x00,0x42,0x00,0x2D,0xC0,0x09,0x40,0x09,0x40,0xE9,0x40,0x29,0x40,0x2F,0x40,0x39,0x80,0x21,0x00,0x59,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FD1, {0x00,0x80,0x43,0x00,0x2C,0x00,0x08,0x00,0x0F,0xE0,0x09,0x00,0xE9,0x00,0x29,0x00,0x31,0x00,0x21,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FD4, {0x00,0x00,0x4F,0xE0,0x28,0x00,0x0F,0x80,0x0C,0x80,0xEA,0x80,0x29,0x00,0x29,0x80,0x36,0x40,0x30,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FDA, {0x21,0x00,0x21,0x00,0x07,0xC0,0x4F,0xC0,0x69,0x40,0x09,0x40,0xEF,0xC0,0x69,0x40,0x61,0x00,0x61,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FE2, {0x20,0x00,0x2F,0xC0,0x02,0x40,0x42,0x40,0x64,0xC0,0x08,0x00,0xE7,0xC0,0x64,0x40,0x67,0xC0,0x67,0xC0,0x70,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x8FE5, {0x20,0x00,0x2F,0xC0,0x08,0x40,0x4B,0x40,0x6B,0xC0,0x0B,0xC0,0xEB,0xC0,0x6A,0x40,0x68,0x40,0x68,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FE6, {0x08,0x00,0x48,0x00,0x29,0xC0,0x3F,0x40,0x0B,0x40,0xEB,0x40,0x2B,0x40,0x33,0x40,0x33,0xC0,0x2D,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FE9, {0x04,0x00,0x44,0x00,0x27,0xE0,0x09,0x00,0x11,0x00,0xE5,0x80,0x25,0x40,0x29,0x20,0x31,0x20,0x23,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FEA, {0x01,0x00,0x41,0x00,0x67,0xC0,0x0F,0xC0,0x09,0x40,0xCF,0xC0,0x69,0x40,0x6B,0x40,0x6F,0xC0,0x60,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FEB, {0x02,0x00,0x44,0x00,0x2F,0x80,0x08,0x80,0x08,0x80,0xE8,0x80,0x2F,0x80,0x28,0x80,0x28,0x80,0x2F,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FED, {0x01,0x00,0x49,0x00,0x2F,0xC0,0x19,0x00,0x11,0x00,0xEF,0xE0,0x21,0x00,0x22,0x80,0x24,0x40,0x20,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FEF, {0x49,0x80,0x69,0x80,0x0D,0x80,0x9F,0x80,0x53,0xC0,0x2B,0xA0,0xE5,0xA0,0x65,0x80,0x69,0x80,0x71,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FF0, {0x02,0x00,0x42,0xC0,0x5F,0xE0,0x22,0x00,0x0A,0x00,0xEA,0x80,0x2A,0x80,0x32,0x40,0x32,0x40,0x22,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FF4, {0x20,0x00,0x2F,0xC0,0x0B,0x40,0x4B,0xC0,0x6B,0xC0,0x0B,0xC0,0xEB,0xC0,0x6B,0x40,0x6F,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FF7, {0x02,0x00,0x52,0x80,0x2A,0x80,0x02,0x00,0x1F,0xC0,0xE2,0x00,0x27,0x00,0x2A,0x80,0x32,0x40,0x22,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FF8, {0x48,0x80,0x64,0x80,0x0F,0xC0,0x8F,0xC0,0x45,0x80,0x3F,0xE0,0xE5,0x80,0x65,0x80,0x69,0x80,0x71,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FF9, {0x21,0x00,0x21,0x00,0x1F,0xE0,0x4F,0xE0,0x6B,0x80,0x0B,0xC0,0xF3,0xA0,0x63,0xA0,0x65,0x80,0x69,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FFA, {0x20,0x00,0x3F,0xE0,0x03,0x80,0x4F,0xC0,0x6B,0xC0,0x0B,0xC0,0xEA,0xC0,0x6C,0xC0,0x6F,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x8FFD, {0x01,0x00,0x42,0x00,0x2F,0x80,0x08,0x80,0x0F,0x80,0xE8,0x00,0x2F,0x80,0x28,0x80,0x28,0x80,0x2F,0x80,0x50,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x9000, {0x00,0x00,0x4F,0x80,0x28,0x80,0x0F,0x80,0x0F,0x80,0xEA,0x40,0x29,0x40,0x29,0x80,0x2E,0x40,0x28,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9001, {0x08,0x80,0x44,0x80,0x2F,0xC0,0x01,0x00,0x01,0x00,0xFF,0xE0,0x23,0x00,0x22,0x80,0x22,0x40,0x24,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9003, {0x02,0x80,0x42,0x80,0x2A,0xC0,0x06,0xC0,0x02,0x80,0xE6,0x80,0x2A,0xC0,0x34,0xC0,0x24,0xA0,0x28,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9005, {0x20,0xC0,0x2F,0x00,0x08,0x00,0x4F,0xE0,0x68,0x00,0x08,0x00,0xEF,0xC0,0x74,0x40,0x77,0xC0,0x67,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9006, {0x08,0x80,0x44,0x80,0x2F,0xE0,0x01,0x00,0x09,0x40,0xE9,0x40,0x29,0x40,0x2F,0xC0,0x29,0x40,0x22,0x00,0x5C,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x900B, {0x21,0x80,0x33,0x40,0x1F,0xE0,0x4F,0xC0,0x6B,0x40,0x0F,0xC0,0xE9,0x40,0x6F,0xC0,0x69,0x40,0x69,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x900D, {0x21,0x00,0x25,0xC0,0x05,0x60,0x5F,0xA0,0x64,0x80,0x07,0x80,0xE4,0x80,0x67,0x80,0x64,0x80,0x64,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x900E, {0x20,0x00,0x3F,0xE0,0x07,0xC0,0x4F,0xC0,0x6B,0xC0,0x0B,0xC0,0xEC,0xC0,0x6B,0x40,0x6F,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x900F, {0x00,0x80,0x4F,0x00,0x21,0x00,0x0F,0xE0,0x07,0x80,0xFB,0xE0,0x22,0x80,0x24,0xC0,0x24,0x40,0x38,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9010, {0x00,0x00,0x1F,0xE0,0x46,0x00,0x3B,0x40,0x05,0xC0,0xF9,0x00,0x23,0x80,0x2D,0x40,0x31,0x20,0x26,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9011, {0x21,0x80,0x21,0x40,0x1F,0xE0,0x4F,0xE0,0x69,0x40,0x05,0x40,0xE5,0x80,0x67,0xC0,0x79,0x40,0x63,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9013, {0x00,0xC0,0x5F,0x00,0x3F,0xE0,0x11,0x00,0x1F,0xE0,0x11,0x00,0xFF,0xC0,0x29,0x40,0x29,0x40,0x21,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9014, {0x02,0x00,0x42,0x00,0x25,0x00,0x08,0x80,0x3F,0xC0,0xE2,0x20,0x3F,0xC0,0x2A,0x80,0x2A,0x40,0x36,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9015, {0x40,0x00,0x7F,0xE0,0x09,0x40,0x9A,0x40,0x4B,0x40,0x00,0x00,0xEF,0xC0,0x61,0x00,0x6F,0xE0,0x7F,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9016, {0x45,0x80,0x65,0x80,0x19,0x80,0x99,0xC0,0x7D,0xC0,0x0F,0x80,0xF5,0x80,0x65,0x80,0x66,0x40,0x7C,0x20,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9017, {0x00,0x00,0x5F,0xE0,0x20,0x00,0x0F,0xC0,0x08,0x40,0xEF,0xC0,0x28,0x80,0x24,0x80,0x25,0x00,0x6F,0xE0,0x50,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x9019, {0x00,0x00,0x47,0x80,0x2F,0xE0,0x00,0x00,0x07,0x80,0xE0,0x00,0x27,0x80,0x20,0x00,0x27,0x80,0x27,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x901A, {0x00,0x00,0x5F,0xC0,0x27,0x80,0x0F,0xC0,0x09,0x40,0xEF,0xC0,0x29,0x40,0x2F,0xC0,0x29,0x40,0x29,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x901D, {0x04,0x40,0x44,0x80,0x5F,0x00,0x25,0xE0,0x05,0x40,0x07,0x40,0xFD,0x40,0x25,0x40,0x26,0x40,0x24,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x901E, {0x20,0x00,0x27,0x80,0x04,0x80,0x47,0x80,0x60,0x00,0x0F,0xC0,0xE1,0x00,0x67,0x80,0x6F,0xE0,0x7F,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x901F, {0x01,0x00,0x41,0x00,0x3F,0xE0,0x0F,0xC0,0x09,0x40,0xE9,0x40,0x2F,0xC0,0x23,0x80,0x2D,0x40,0x31,0x20,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9020, {0x01,0x00,0x49,0x00,0x2F,0xC0,0x11,0x00,0x2F,0xE0,0xE0,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9021, {0x22,0x00,0x22,0x80,0x1F,0xE0,0x4F,0x80,0x65,0xA0,0x0A,0xE0,0xF3,0x80,0x66,0x80,0x6B,0x80,0x6E,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9022, {0x02,0x00,0x47,0xC0,0x2A,0x80,0x07,0x80,0x39,0x60,0xEF,0xC0,0x21,0x00,0x2F,0xC0,0x21,0x00,0x3F,0xE0,0x59,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9023, {0x01,0x00,0x41,0x00,0x3F,0xE0,0x0F,0xC0,0x09,0x40,0xEF,0xC0,0x29,0x40,0x2F,0xC0,0x21,0x00,0x3F,0xE0,0x51,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x9027, {0x22,0x80,0x22,0xC0,0x04,0x40,0x41,0x00,0x63,0x00,0x04,0x80,0xEF,0xC0,0x74,0xA0,0x67,0x80,0x67,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x902E, {0x01,0x00,0x4F,0xC0,0x21,0x40,0x1F,0xE0,0x0F,0xC0,0xF1,0x40,0x2D,0x80,0x23,0x80,0x2D,0x40,0x23,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9031, {0x00,0x00,0x4F,0xC0,0x29,0x40,0x0F,0xC0,0x0F,0xC0,0xE8,0x40,0x2F,0xC0,0x2C,0xC0,0x37,0xC0,0x20,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9032, {0x04,0x80,0x44,0x80,0x29,0x00,0x1F,0xE0,0x09,0x00,0xEF,0xC0,0x29,0x00,0x2F,0xC0,0x29,0x00,0x6F,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9035, {0x21,0x00,0x2F,0xC0,0x1F,0xE0,0x4F,0xE0,0x65,0xA0,0x09,0xE0,0xF1,0x00,0x67,0x80,0x6F,0xE0,0x7F,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9036, {0x20,0xC0,0x2F,0x00,0x1F,0xE0,0x4F,0xE0,0x67,0x80,0x09,0x40,0xFF,0xE0,0x62,0x80,0x67,0x80,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9038, {0x02,0x00,0x43,0x80,0x25,0x00,0x3F,0xC0,0x09,0x40,0xE9,0x40,0x2F,0xC0,0x25,0x40,0x25,0x00,0x29,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9039, {0x21,0x00,0x23,0x00,0x0F,0xC0,0x5F,0xE0,0x64,0xC0,0x02,0x80,0xFF,0xE0,0x63,0x00,0x6F,0xC0,0x61,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x903C, {0x00,0x00,0x5F,0xE0,0x27,0x80,0x04,0x80,0x07,0x80,0xE0,0x00,0x2F,0xC0,0x29,0x40,0x2F,0xC0,0x6F,0xC0,0x50,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x903E, {0x27,0x00,0x22,0x80,0x07,0xC0,0x5F,0xE0,0x6E,0x40,0x0B,0xC0,0xEF,0x80,0x6B,0xC0,0x6F,0xC0,0x6B,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9041, {0x00,0xC0,0x4F,0x80,0x29,0x00,0x0F,0xE0,0x0B,0xC0,0xEA,0x40,0x2B,0xC0,0x2A,0x40,0x33,0xC0,0x33,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9042, {0x08,0x80,0x45,0x00,0x3F,0xE0,0x06,0x40,0x3B,0x40,0xE5,0x80,0x3B,0x80,0x25,0x40,0x39,0x20,0x26,0x00,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9045, {0x00,0x00,0x5F,0xC0,0x30,0x40,0x1F,0xC0,0x12,0x80,0xFF,0xC0,0x31,0x00,0x37,0x80,0x31,0x00,0x27,0xC0,0x59,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9047, {0x00,0x00,0x4F,0x80,0x2A,0x80,0x2F,0x80,0x0F,0x80,0xE2,0x00,0x2F,0xC0,0x2A,0xC0,0x2B,0xC0,0x2E,0x40,0x58,0x40,0x87,0xE0,0x00,0x00,}}, +{ 0x9049, {0x22,0x00,0x23,0xC0,0x07,0x80,0x4F,0x80,0x6F,0x80,0x08,0x80,0xEF,0x80,0x68,0x80,0x6F,0x80,0x78,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x904A, {0x09,0x00,0x49,0x00,0x3F,0xE0,0x2A,0x00,0x09,0xE0,0xEE,0x40,0x2A,0x80,0x2B,0xE0,0x32,0x80,0x36,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x904B, {0x00,0x00,0x5F,0xE0,0x31,0x20,0x3F,0xE0,0x0F,0xC0,0xE9,0x40,0x2F,0xC0,0x29,0x40,0x2F,0xC0,0x3F,0xE0,0x51,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x904D, {0x00,0x00,0x5F,0xE0,0x20,0x00,0x0F,0xC0,0x0F,0xC0,0xE8,0x00,0x2F,0xC0,0x3A,0xC0,0x3F,0xC0,0x2A,0xC0,0x58,0xC0,0x87,0xE0,0x00,0x00,}}, +{ 0x904E, {0x00,0x00,0x4F,0x80,0x28,0x80,0x0B,0x80,0x1F,0xC0,0xF0,0x40,0x37,0x40,0x35,0x40,0x37,0x40,0x30,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x904F, {0x20,0x00,0x2F,0x80,0x0F,0x80,0x4F,0x80,0x6F,0x80,0x04,0x00,0xEF,0xC0,0x7B,0x40,0x6F,0xC0,0x6F,0xC0,0x58,0xC0,0x87,0xE0,0x00,0x00,}}, +{ 0x9050, {0x20,0x00,0x2E,0xC0,0x0A,0x40,0x4E,0xC0,0x68,0x00,0x0F,0xC0,0xE8,0xC0,0x68,0x80,0x6E,0xC0,0x69,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9051, {0x21,0x00,0x27,0x80,0x07,0x80,0x47,0x80,0x67,0x80,0x00,0x00,0xEF,0xC0,0x63,0x00,0x67,0x80,0x7F,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9052, {0x27,0x80,0x24,0xC0,0x1F,0xE0,0x4F,0xE0,0x6F,0xC0,0x0B,0xC0,0xED,0xC0,0x6B,0x40,0x6F,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9053, {0x08,0x80,0x45,0x00,0x3F,0xE0,0x0F,0x80,0x08,0x80,0xEF,0x80,0x28,0x80,0x2F,0x80,0x28,0x80,0x2F,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9054, {0x01,0x00,0x4F,0xC0,0x21,0x00,0x0F,0xE0,0x02,0x80,0xFF,0xE0,0x21,0x00,0x2F,0xC0,0x21,0x00,0x7F,0xE0,0x51,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x9055, {0x01,0x00,0x47,0xC0,0x22,0x40,0x2F,0xE0,0x04,0x40,0xE7,0xC0,0x20,0x80,0x27,0xC0,0x24,0x80,0x3F,0xE0,0x58,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9056, {0x21,0x00,0x33,0x00,0x1F,0xE0,0x4F,0xC0,0x6C,0xC0,0x0A,0xC0,0xEF,0xC0,0x6B,0x40,0x6F,0xC0,0x69,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9058, {0x23,0x80,0x3F,0xE0,0x07,0xC0,0x47,0xC0,0x7F,0xE0,0x07,0x80,0xE5,0x80,0x67,0x80,0x6F,0xE0,0x7F,0xE0,0x5C,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9059, {0x41,0x00,0x63,0xC0,0x0F,0x80,0x8F,0x00,0x7F,0xC0,0x09,0x00,0xFF,0xE0,0x69,0x40,0x6F,0xC0,0x6F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x905C, {0x00,0x60,0x5F,0xC0,0x25,0x40,0x0B,0x40,0x0D,0x80,0x39,0x40,0xEB,0xE0,0x2B,0xC0,0x2F,0xA0,0x39,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x905E, {0x20,0xC0,0x2F,0x80,0x0B,0xE0,0x4B,0xE0,0x6B,0xC0,0x0B,0xA0,0xEA,0xE0,0x75,0x80,0x7D,0xA0,0x62,0x60,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9060, {0x02,0x00,0x4F,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,0xEF,0x80,0x2F,0x80,0x26,0x40,0x3B,0x80,0x62,0xC0,0x5A,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9061, {0x12,0x00,0x4B,0xC0,0x7F,0x40,0x35,0x40,0x15,0xC0,0x15,0x40,0xFF,0xC0,0x35,0x40,0x29,0x40,0x32,0x40,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9063, {0x01,0x00,0x4F,0xC0,0x2F,0xC0,0x01,0x00,0x3F,0xE0,0xE7,0x80,0x24,0x80,0x27,0x80,0x27,0x80,0x24,0x80,0x5F,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9065, {0x00,0xE0,0x5F,0x40,0x29,0x40,0x05,0x80,0x0F,0xC0,0xE1,0x00,0x3F,0xE0,0x29,0x40,0x29,0x40,0x2F,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9068, {0x25,0x80,0x2F,0x80,0x1F,0xE0,0x4F,0xE0,0x7F,0x40,0x04,0xC0,0xE6,0x80,0x6A,0xC0,0x6B,0x60,0x76,0x20,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9069, {0x01,0x00,0x4F,0xE0,0x22,0x80,0x0F,0xC0,0x09,0x40,0xEF,0xC0,0x29,0x40,0x2B,0xC0,0x2A,0xC0,0x2B,0xC0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x906D, {0x03,0x80,0x5F,0xE0,0x2F,0xC0,0x0F,0xC0,0x0B,0xC0,0xEF,0xC0,0x27,0x80,0x24,0x80,0x27,0x80,0x27,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x906E, {0x01,0x00,0x41,0x00,0x2F,0xE0,0x0A,0x80,0x0F,0xE0,0xEB,0x80,0x2A,0x80,0x30,0x00,0x36,0xC0,0x6A,0xA0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x906F, {0x40,0x00,0x7F,0xE0,0x15,0x80,0x9F,0xA0,0x55,0xC0,0x17,0xC0,0xFD,0xC0,0x77,0xA0,0x74,0xA0,0x6D,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9072, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x4F,0xC0,0x6F,0xE0,0x0F,0xE0,0xEB,0x80,0x6B,0xC0,0x7F,0xE0,0x7F,0xE0,0x59,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9075, {0x04,0x80,0x83,0x00,0x5F,0xE0,0x4F,0xC0,0x0B,0x40,0xED,0xC0,0x2F,0xC0,0x2F,0xC0,0x3F,0xE0,0x62,0x80,0x58,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9076, {0x21,0x00,0x27,0x80,0x1F,0xE0,0x4F,0xE0,0x7E,0xC0,0x06,0x80,0xF9,0xE0,0x6F,0xC0,0x67,0x80,0x68,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9077, {0x00,0x00,0x5F,0xE0,0x24,0x80,0x0F,0xC0,0x0F,0xC0,0xE2,0x00,0x3F,0xE0,0x2F,0xC0,0x37,0xA0,0x24,0x80,0x5B,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9078, {0x00,0x00,0x5F,0xC0,0x2F,0xC0,0x19,0x00,0x0F,0xE0,0xE4,0x80,0x3F,0xC0,0x24,0x80,0x3F,0xE0,0x24,0x80,0x58,0x40,0x87,0xE0,0x00,0x00,}}, +{ 0x907A, {0x01,0x00,0x47,0xC0,0x27,0xC0,0x2F,0xE0,0x07,0xC0,0xE4,0x40,0x27,0xC0,0x27,0xC0,0x27,0xC0,0x22,0x80,0x5C,0x40,0x87,0xE0,0x00,0x00,}}, +{ 0x907C, {0x02,0x00,0x42,0x00,0x3F,0xE0,0x04,0xC0,0x0F,0xC0,0xF4,0xA0,0x27,0x80,0x24,0x80,0x27,0xC0,0x29,0x20,0x73,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x907D, {0x42,0x00,0x63,0xC0,0x1F,0xE0,0x9F,0xC0,0x53,0x80,0x1F,0xC0,0xF3,0x40,0x7F,0xC0,0x7F,0xC0,0x67,0xA0,0x5B,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x907F, {0x00,0x80,0x5C,0x80,0x37,0xE0,0x1D,0x40,0x11,0x40,0xFF,0xE0,0x34,0x80,0x34,0x80,0x3F,0xE0,0x30,0x80,0x58,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x9080, {0x25,0x80,0x3F,0x80,0x1F,0xE0,0x5F,0xE0,0x7F,0x40,0x09,0x40,0xFF,0x80,0x6E,0xC0,0x6B,0x60,0x76,0x20,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9081, {0x23,0x80,0x3F,0xE0,0x07,0x80,0x47,0x80,0x67,0x80,0x05,0x80,0xE7,0x80,0x6F,0xC0,0x6F,0xC0,0x6F,0xC0,0x58,0xC0,0x87,0xE0,0x00,0x00,}}, +{ 0x9082, {0x48,0x00,0x6F,0xC0,0x37,0xC0,0x9F,0xC0,0x57,0xC0,0x1F,0xC0,0xF7,0x80,0x7F,0xE0,0x72,0x80,0x76,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9083, {0x41,0x00,0x7F,0xE0,0x3F,0xE0,0x87,0xE0,0x5F,0xE0,0x03,0x40,0xFF,0xC0,0x63,0x80,0x6F,0xC0,0x6D,0xC0,0x73,0x00,0x8F,0xE0,0x00,0x00,}}, +{ 0x9084, {0x00,0x00,0x9F,0xC0,0x5F,0xC0,0x00,0x00,0x1F,0xE0,0xEF,0x80,0x28,0x80,0x2F,0xC0,0x23,0x80,0x66,0x80,0x5A,0x40,0x8F,0xE0,0x00,0x00,}}, +{ 0x9087, {0x40,0x00,0x7F,0xE0,0x05,0x60,0x9F,0xE0,0x4B,0xC0,0x0D,0xC0,0xEF,0xC0,0x6B,0xC0,0x6F,0xC0,0x6F,0xC0,0x69,0xC0,0x9F,0xE0,0x00,0x00,}}, +{ 0x9089, {0x21,0x00,0x27,0x80,0x06,0x80,0x47,0x80,0x67,0x80,0x0F,0xE0,0xEB,0xC0,0x74,0xC0,0x7F,0xE0,0x67,0x80,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x908A, {0x21,0x00,0x27,0x80,0x07,0x80,0x47,0x80,0x67,0x80,0x0F,0xE0,0xEB,0xC0,0x77,0xC0,0x7F,0xE0,0x67,0x80,0x59,0x80,0x87,0xE0,0x00,0x00,}}, +{ 0x908F, {0x20,0x00,0x2F,0xC0,0x0F,0xC0,0x4F,0xC0,0x75,0xE0,0x0D,0x80,0xEB,0xE0,0x7F,0xC0,0x6F,0xE0,0x77,0xE0,0x58,0x00,0x87,0xE0,0x00,0x00,}}, +{ 0x9091, {0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x40,0x00,0x40,0x20,0x7F,0xE0,0x00,0x00,}}, +{ 0x90A3, {0x00,0x00,0xFD,0xC0,0x25,0x40,0x7D,0x80,0x25,0x80,0x25,0x80,0x7D,0x40,0x25,0x20,0x25,0x20,0x45,0xE0,0x45,0x00,0x99,0x00,0x00,0x00,}}, +{ 0x90A6, {0x10,0x00,0x13,0xC0,0x7F,0x40,0x11,0x80,0x7F,0x80,0x11,0x80,0x11,0x40,0xFF,0x20,0x11,0x20,0x21,0xE0,0x21,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x90A8, {0x10,0x00,0x19,0xE0,0x7F,0x20,0x75,0x40,0x35,0x40,0x35,0x40,0x35,0x20,0x3D,0x20,0x15,0x20,0x15,0xE0,0x19,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x90AA, {0x00,0x00,0x7D,0xC0,0x29,0x40,0x29,0x80,0xFD,0x80,0x19,0x80,0x19,0x40,0x29,0x20,0x29,0x20,0x49,0xE0,0x89,0x00,0x19,0x00,0x00,0x00,}}, +{ 0x90AF, {0x34,0x00,0x34,0xE0,0x34,0xA0,0x7F,0xC0,0x35,0xC0,0x34,0xC0,0x34,0xC0,0x3C,0xA0,0x34,0xA0,0x34,0xE0,0x3C,0x80,0x34,0x80,0x00,0x00,}}, +{ 0x90B1, {0x02,0x00,0x0D,0xE0,0x31,0x20,0x21,0x40,0x3F,0x40,0x29,0x40,0x29,0x20,0x29,0x20,0x2F,0x20,0x3F,0xE0,0x61,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x90B5, {0x00,0x00,0x7D,0xE0,0x35,0x20,0x35,0x40,0x25,0x40,0x59,0x40,0x01,0x20,0x3D,0x20,0x25,0x20,0x25,0xE0,0x3D,0x00,0x25,0x00,0x00,0x00,}}, +{ 0x90B8, {0x0C,0x00,0x71,0xC0,0x51,0x40,0x51,0x80,0x7F,0x80,0x51,0x80,0x51,0x40,0x49,0x20,0xEB,0x20,0x87,0xE0,0xF9,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x90C1, {0x10,0x00,0x13,0xC0,0xFF,0x40,0x21,0x80,0x3D,0x80,0x65,0x80,0x7D,0x40,0xA5,0x20,0x3D,0x20,0x25,0xE0,0x25,0x00,0x2D,0x00,0x00,0x00,}}, +{ 0x90CA, {0x10,0x00,0x11,0xC0,0xFF,0x40,0x29,0x40,0x65,0x80,0x4D,0x80,0xAB,0x40,0x11,0x20,0x11,0x20,0x29,0xE0,0x41,0x00,0x81,0x00,0x00,0x00,}}, +{ 0x90CE, {0x10,0x00,0x11,0xC0,0x79,0x40,0x49,0x80,0x79,0x80,0x49,0x80,0x79,0x40,0x51,0x20,0x49,0x20,0x7D,0xE0,0xC1,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x90DB, {0x06,0x00,0x39,0xE0,0x37,0x20,0x33,0x40,0x41,0x40,0x3D,0x40,0x09,0x20,0x19,0x20,0x7D,0x20,0x71,0xE0,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0x90E1, {0x00,0x00,0x7D,0xC0,0x25,0x40,0xFD,0x80,0x25,0x80,0x7D,0x80,0x21,0x40,0x3D,0x20,0x65,0x20,0x65,0xE0,0xBD,0x00,0x25,0x00,0x00,0x00,}}, +{ 0x90E2, {0x00,0x00,0x3D,0xE0,0x25,0x20,0x3D,0x40,0x01,0x40,0x7D,0x40,0x11,0x20,0x19,0x20,0x3D,0x20,0x11,0xE0,0x1D,0x00,0x71,0x00,0x00,0x00,}}, +{ 0x90E4, {0x38,0x00,0x25,0xE0,0x45,0x20,0x11,0x40,0x19,0x40,0x35,0x40,0x25,0x20,0x7D,0x20,0x25,0x20,0x3D,0xE0,0x25,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x90E8, {0x20,0x00,0x21,0xC0,0xFD,0x40,0x49,0x40,0x51,0x80,0xFD,0x80,0x01,0x40,0x79,0x20,0x49,0x20,0x49,0xE0,0x79,0x00,0x49,0x00,0x00,0x00,}}, +{ 0x90ED, {0x10,0x00,0xFF,0xC0,0x01,0x40,0x7D,0x80,0x7D,0x80,0x01,0x80,0x7D,0x40,0x09,0x20,0x3D,0x20,0xF1,0xE0,0x11,0x00,0x31,0x00,0x00,0x00,}}, +{ 0x90F5, {0x06,0x00,0x79,0xC0,0x11,0x40,0x7F,0x80,0x35,0x80,0xFF,0x80,0x35,0x40,0x35,0x20,0x7F,0x20,0x11,0xE0,0x1D,0x00,0x61,0x00,0x00,0x00,}}, +{ 0x90F7, {0x20,0x00,0x4E,0xC0,0x8A,0xC0,0xDE,0xC0,0x6A,0x80,0x4E,0xC0,0xB8,0xA0,0xEC,0xA0,0x2A,0xA0,0x6E,0xE0,0x48,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x90FD, {0x20,0x00,0x21,0xC0,0x7D,0x40,0x29,0x80,0xFF,0x80,0x21,0x80,0x7D,0x40,0xA5,0x20,0x3D,0x20,0x25,0xE0,0x3D,0x00,0x25,0x00,0x00,0x00,}}, +{ 0x9102, {0x00,0x00,0x7E,0xE0,0x7A,0xA0,0x7E,0xC0,0x00,0xC0,0x3C,0xC0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x3C,0xE0,0x04,0x80,0x18,0x80,0x00,0x00,}}, +{ 0x9112, {0x30,0x00,0x3E,0xE0,0x72,0xA0,0x7E,0xC0,0x3A,0xC0,0x1C,0xC0,0x30,0xA0,0x3E,0xA0,0x72,0xA0,0x7E,0xE0,0x3A,0x80,0x3C,0x80,0x00,0x00,}}, +{ 0x9119, {0x00,0x00,0x3E,0xE0,0x3E,0xA0,0x7F,0xC0,0x19,0xC0,0x3E,0xC0,0x22,0xA0,0x3E,0xA0,0x3E,0xA0,0x2E,0xE0,0x3E,0x80,0x22,0x80,0x00,0x00,}}, +{ 0x912D, {0x24,0x00,0x3B,0xC0,0xFF,0x40,0x7D,0x80,0x7D,0x80,0x6D,0x80,0x7D,0x40,0x7D,0x20,0xFF,0x20,0xFF,0xE0,0x25,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x9130, {0x08,0x00,0x2A,0xE0,0x7F,0xA0,0x7F,0xC0,0x1A,0xC0,0x7B,0xC0,0x3F,0xA0,0x7A,0xA0,0x7F,0xA0,0x3F,0xE0,0x22,0x80,0x42,0x80,0x00,0x00,}}, +{ 0x9132, {0x00,0x00,0x7E,0xE0,0x7E,0xA0,0x64,0xC0,0x3C,0xC0,0x34,0xC0,0x3C,0xA0,0x3C,0xA0,0x3C,0xA0,0x7E,0xE0,0x18,0x80,0x10,0x80,0x00,0x00,}}, +{ 0x9149, {0x00,0x00,0xFF,0xE0,0x12,0x00,0x7F,0xC0,0x52,0x40,0x52,0xC0,0x52,0xC0,0x61,0xC0,0x7F,0xC0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x914A, {0x00,0x00,0xFE,0x00,0x33,0xE0,0x7C,0x80,0x74,0x80,0x74,0x80,0x7C,0x80,0x5C,0x80,0x7C,0x80,0x7C,0x80,0x7C,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x914B, {0x20,0x80,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x3F,0x80,0x2A,0x80,0x33,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x914C, {0x00,0x80,0x7F,0x80,0x18,0xE0,0x3E,0xA0,0x3B,0x20,0x3A,0xA0,0x3E,0x60,0x22,0x20,0x3E,0x20,0x22,0x20,0x3E,0x20,0x22,0x40,0x00,0x00,}}, +{ 0x914D, {0x00,0x00,0xFF,0xC0,0x30,0x40,0x7C,0x40,0x75,0xC0,0x75,0x40,0x75,0x00,0x5D,0x00,0x7D,0x00,0x45,0x20,0x7D,0x20,0x45,0xE0,0x00,0x00,}}, +{ 0x914E, {0x00,0x40,0xFE,0x40,0x30,0x40,0x7F,0xE0,0x74,0x40,0x75,0x40,0x7C,0xC0,0x44,0x40,0x7C,0x40,0x44,0x40,0x7C,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x9152, {0x20,0x00,0x3F,0xE0,0x05,0x00,0x9F,0xC0,0x55,0x40,0x15,0x40,0x55,0xC0,0x58,0x40,0x5F,0xC0,0x50,0x40,0x9F,0xC0,0x90,0x40,0x00,0x00,}}, +{ 0x9154, {0x01,0x00,0xFF,0x00,0x33,0x80,0x7D,0x80,0x75,0xA0,0x76,0xE0,0x7D,0x00,0x45,0x00,0x7F,0xE0,0x45,0x00,0x7D,0x00,0x45,0x00,0x00,0x00,}}, +{ 0x9156, {0x01,0x80,0xFF,0x80,0x31,0x80,0x7F,0xE0,0x77,0xC0,0x75,0x80,0x7D,0x80,0x6D,0x80,0x7D,0x80,0x7D,0xA0,0x7E,0xA0,0x44,0x60,0x00,0x00,}}, +{ 0x9158, {0x00,0x00,0xFF,0x80,0x31,0x80,0x7D,0xA0,0x76,0xA0,0x74,0x60,0x7F,0xC0,0x5D,0x40,0x7D,0x80,0x7D,0x80,0x7D,0x40,0x46,0x20,0x00,0x00,}}, +{ 0x9162, {0x01,0x00,0xFF,0x00,0x31,0xE0,0x7E,0x80,0x76,0x80,0x74,0xE0,0x7C,0x80,0x44,0x80,0x7C,0xE0,0x44,0x80,0x7C,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x9163, {0x01,0x40,0xFF,0x40,0x31,0x40,0x7F,0xE0,0x77,0x40,0x75,0x40,0x7D,0x40,0x5D,0xC0,0x7D,0x40,0x7D,0x40,0x7D,0xC0,0x45,0x40,0x00,0x00,}}, +{ 0x9165, {0x00,0x40,0xFF,0x80,0x33,0x80,0x7D,0x80,0x77,0xE0,0x75,0x80,0x7D,0x80,0x5F,0xC0,0x7F,0xC0,0x7D,0xA0,0x7D,0x80,0x45,0x80,0x00,0x00,}}, +{ 0x9169, {0x00,0xC0,0x7F,0xC0,0x18,0xE0,0x3F,0xA0,0x3A,0xC0,0x3A,0xC0,0x3E,0x80,0x2F,0xE0,0x3E,0xA0,0x3E,0xA0,0x3E,0xE0,0x22,0xA0,0x00,0x00,}}, +{ 0x916A, {0x00,0x80,0xFE,0x80,0x31,0xC0,0x7F,0x40,0x74,0x80,0x74,0x80,0x7D,0x40,0x5F,0xE0,0x7D,0x40,0x45,0x40,0x7D,0xC0,0x45,0x40,0x00,0x00,}}, +{ 0x916C, {0x00,0x20,0x7D,0x20,0x31,0x60,0x7D,0x60,0x77,0xE0,0x77,0xE0,0x7D,0x60,0x45,0x60,0x7D,0x60,0x46,0x60,0x7E,0x60,0x44,0x20,0x00,0x00,}}, +{ 0x9172, {0x00,0x00,0xFF,0xC0,0x31,0x40,0x7D,0x40,0x75,0xC0,0x74,0x40,0x7F,0x80,0x7D,0x80,0x7F,0xC0,0x7D,0x80,0x7F,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x9173, {0x01,0x80,0xFD,0x40,0x33,0xC0,0x7D,0xC0,0x77,0xE0,0x74,0x20,0x7D,0xC0,0x5D,0x40,0x7D,0xC0,0x7D,0xC0,0x7D,0x40,0x45,0xC0,0x00,0x00,}}, +{ 0x9175, {0x00,0x80,0xFC,0xA0,0x33,0xE0,0x7C,0xC0,0x77,0xE0,0x75,0x80,0x7F,0xC0,0x46,0x40,0x7F,0xE0,0x46,0x80,0x7C,0x80,0x44,0x80,0x00,0x00,}}, +{ 0x9177, {0x00,0x80,0xFF,0x80,0x31,0xE0,0x7E,0x80,0x74,0x80,0x77,0xE0,0x7C,0x00,0x5D,0xC0,0x7D,0x40,0x7D,0x40,0x7D,0xC0,0x45,0x40,0x00,0x00,}}, +{ 0x9178, {0x00,0x80,0xFD,0x00,0x33,0x40,0x7F,0xE0,0x75,0xA0,0x76,0xE0,0x7D,0xC0,0x45,0x40,0x7E,0x80,0x44,0x80,0x7D,0x40,0x46,0x20,0x00,0x00,}}, +{ 0x9182, {0x02,0x80,0xFE,0x80,0x32,0x80,0x7F,0xE0,0x7A,0xC0,0x7B,0xC0,0x7F,0xC0,0x5F,0xC0,0x7B,0xA0,0x7A,0x80,0x7A,0x80,0x4A,0x80,0x00,0x00,}}, +{ 0x9187, {0x00,0x80,0xFF,0xE0,0x31,0xC0,0x7D,0x40,0x75,0xC0,0x74,0x00,0x7D,0xC0,0x44,0x40,0x7C,0x80,0x47,0xE0,0x7C,0x80,0x45,0x80,0x00,0x00,}}, +{ 0x9189, {0x01,0x80,0xFD,0x80,0x33,0xE0,0x7D,0x40,0x75,0x40,0x77,0xA0,0x7D,0xA0,0x4D,0x80,0x7F,0xE0,0x7D,0x80,0x7D,0x80,0x45,0x80,0x00,0x00,}}, +{ 0x918B, {0x01,0x80,0xFF,0x80,0x33,0xC0,0x7F,0xC0,0x75,0x80,0x77,0xE0,0x7C,0x00,0x5D,0xC0,0x7D,0xC0,0x7D,0xC0,0x7D,0xC0,0x45,0x40,0x00,0x00,}}, +{ 0x918D, {0x00,0x00,0xFF,0xC0,0x31,0x40,0x7D,0xC0,0x75,0xC0,0x74,0x00,0x7F,0xE0,0x44,0x80,0x7D,0xE0,0x45,0x80,0x7F,0x80,0x44,0xE0,0x00,0x00,}}, +{ 0x9190, {0x02,0x00,0x7A,0xE0,0x32,0xA0,0x7F,0xE0,0x7A,0xA0,0x7A,0xE0,0x7F,0xA0,0x4D,0xA0,0x7D,0xA0,0x4F,0xA0,0x78,0xA0,0x49,0x60,0x00,0x00,}}, +{ 0x9192, {0x00,0x00,0xFF,0xC0,0x31,0xC0,0x7D,0xC0,0x75,0xC0,0x75,0x80,0x7D,0xE0,0x46,0x80,0x7D,0xC0,0x44,0x80,0x7F,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x9197, {0x01,0xC0,0xFD,0xC0,0x33,0xA0,0x7E,0x60,0x77,0xE0,0x75,0x80,0x7D,0x80,0x5F,0xE0,0x7D,0x80,0x46,0xA0,0x7E,0xA0,0x44,0x60,0x00,0x00,}}, +{ 0x919C, {0x01,0x00,0xFF,0x00,0x33,0xC0,0x7F,0x40,0x77,0xC0,0x77,0xC0,0x7D,0x80,0x45,0xC0,0x7F,0xE0,0x47,0xE0,0x7D,0xA0,0x44,0xE0,0x00,0x00,}}, +{ 0x91A2, {0x02,0x00,0xFA,0x00,0x67,0xE0,0xFF,0x80,0xFA,0x80,0xEB,0x80,0xF8,0x00,0xDF,0xC0,0xFD,0xC0,0xFD,0xC0,0xFF,0xE0,0x88,0x00,0x00,0x00,}}, +{ 0x91A4, {0x21,0xE0,0xFF,0x40,0x7F,0xE0,0xB7,0xE0,0x22,0x80,0xFF,0xE0,0x0A,0x00,0x7F,0xC0,0x53,0xC0,0x7F,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x91AA, {0x00,0x00,0xFF,0xC0,0x37,0xC0,0x7F,0xC0,0x7F,0xC0,0x79,0x80,0x7B,0x80,0x5D,0xE0,0x7B,0x80,0x7B,0x40,0x79,0xC0,0x4B,0x00,0x00,0x00,}}, +{ 0x91AB, {0x00,0x00,0x7D,0x80,0x7E,0xE0,0x7F,0xE0,0x7B,0xC0,0x7F,0xC0,0xFF,0xE0,0x0A,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x91AF, {0x01,0x80,0xFF,0xE0,0x37,0xC0,0x7F,0xC0,0x7A,0x40,0x7B,0xC0,0x7A,0x60,0x5C,0x20,0x7B,0xC0,0x7B,0xC0,0x7F,0xE0,0x48,0x00,0x00,0x00,}}, +{ 0x91B4, {0x01,0x80,0xFF,0xC0,0x37,0xC0,0x7F,0xC0,0x7F,0xC0,0x78,0x00,0x7F,0xE0,0x5B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7F,0xE0,0x48,0x00,0x00,0x00,}}, +{ 0x91B5, {0x01,0x80,0xFD,0xC0,0x33,0xE0,0x7B,0xC0,0x7A,0xC0,0x7B,0xE0,0x7B,0x80,0x5B,0xE0,0x7B,0xC0,0x7F,0xE0,0x7D,0xA0,0x49,0x80,0x00,0x00,}}, +{ 0x91B8, {0x00,0x80,0xFF,0xE0,0x36,0x60,0x7F,0xE0,0x7B,0xC0,0x7B,0xC0,0x79,0x80,0x5F,0xE0,0x7B,0xC0,0x4F,0x80,0x79,0xC0,0x4E,0x20,0x00,0x00,}}, +{ 0x91BA, {0x00,0xC0,0xFF,0x80,0x37,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x59,0x80,0x7F,0xE0,0x7F,0xE0,0x7B,0x40,0x4D,0xA0,0x00,0x00,}}, +{ 0x91C0, {0x01,0x80,0xFF,0xE0,0x37,0xE0,0x7F,0xE0,0x7B,0xC0,0x7F,0xE0,0x7B,0xC0,0x5B,0xC0,0x7F,0xE0,0x7F,0xC0,0x7B,0xC0,0x4E,0x20,0x00,0x00,}}, +{ 0x91C1, {0x6E,0x80,0x6A,0x80,0x6F,0x80,0x7F,0xE0,0x7F,0xC0,0xFF,0x80,0x73,0x80,0x7F,0x80,0x3F,0x80,0x1F,0x80,0xEB,0x60,0x33,0x00,0x00,0x00,}}, +{ 0x91C6, {0x01,0x80,0x06,0x00,0x7C,0x80,0x24,0x80,0x25,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x91C7, {0x00,0xC0,0x03,0x40,0x7C,0x40,0x24,0x80,0x13,0x00,0x04,0x00,0xFF,0xE0,0x0E,0x00,0x35,0x80,0xC4,0x60,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x91C8, {0x0C,0x00,0x33,0xC0,0xE6,0x40,0xAA,0x40,0x73,0xC0,0xFF,0x40,0x23,0x00,0x73,0x00,0x6A,0x80,0xA4,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x91C9, {0x06,0xC0,0x7A,0xC0,0x52,0xC0,0x3D,0xE0,0x7F,0xE0,0x31,0xE0,0x39,0xE0,0x35,0xE0,0x33,0xE0,0x53,0xE0,0x11,0xE0,0x11,0x20,0x00,0x00,}}, +{ 0x91CB, {0x08,0x00,0xF7,0xC0,0xAF,0xC0,0x7F,0xC0,0xFF,0xC0,0x61,0x00,0x77,0xE0,0x6A,0xC0,0x6F,0xE0,0xA7,0xC0,0x23,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x91CC, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x91CD, {0x01,0x80,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x91CE, {0x00,0x00,0x7F,0xC0,0x68,0x80,0x79,0x80,0x6F,0xE0,0x68,0xC0,0x78,0x80,0x20,0x80,0x78,0x80,0x38,0x80,0xE0,0x80,0x01,0x80,0x00,0x00,}}, +{ 0x91CF, {0x00,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x91D0, {0x21,0x00,0xFB,0xE0,0xFF,0x80,0x7B,0xE0,0xFF,0xC0,0x7F,0x80,0x72,0x80,0x7F,0x80,0x7F,0xC0,0x7F,0xC0,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x91D1, {0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xDF,0x60,0x04,0x00,0x7F,0xC0,0x04,0x00,0x24,0x80,0x15,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x91D6, {0x10,0x00,0x1B,0xE0,0x3C,0xA0,0x24,0xA0,0x78,0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x3D,0x20,0x39,0x20,0x1E,0x20,0x74,0x40,0x00,0x00,}}, +{ 0x91D8, {0x20,0x00,0x37,0xE0,0x78,0x80,0x48,0x80,0xF0,0x80,0x20,0x80,0xF8,0x80,0x20,0x80,0x78,0x80,0x70,0x80,0x38,0x80,0xE1,0x80,0x00,0x00,}}, +{ 0x91DB, {0x10,0x80,0x18,0x80,0x3C,0x80,0x27,0xE0,0x79,0xA0,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x3D,0x20,0x39,0x20,0x1E,0x20,0x74,0x40,0x00,0x00,}}, +{ 0x91DC, {0x09,0x00,0x31,0xC0,0x4E,0x40,0x0E,0x00,0x31,0x80,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x24,0x80,0x15,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x91DD, {0x20,0x80,0x30,0x80,0x78,0x80,0x48,0x80,0xF7,0xE0,0x20,0x80,0xF8,0x80,0x20,0x80,0x78,0x80,0x70,0x80,0x38,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x91DF, {0x20,0x00,0x31,0x80,0x78,0x80,0x48,0x80,0xF1,0x80,0x21,0x80,0xF9,0x80,0x22,0xC0,0x7A,0x40,0x74,0x40,0x3C,0x20,0xE8,0x20,0x00,0x00,}}, +{ 0x91E1, {0x11,0x00,0x10,0x80,0x24,0x80,0x0E,0x00,0x13,0x00,0x3F,0x80,0xC4,0x60,0x3F,0x80,0x15,0x80,0x15,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x91E3, {0x10,0x80,0x18,0x80,0x3C,0xE0,0x25,0x20,0x79,0x20,0x12,0xA0,0x7C,0x60,0x10,0x20,0x3C,0x20,0x38,0x20,0x1C,0x20,0x70,0x40,0x00,0x00,}}, +{ 0x91E6, {0x10,0x00,0x18,0x00,0x3D,0xE0,0x25,0x20,0x79,0x20,0x11,0x20,0x7D,0x20,0x11,0x20,0x3D,0x20,0x39,0x20,0x1D,0xE0,0x71,0x20,0x00,0x00,}}, +{ 0x91E7, {0x10,0x20,0x11,0x20,0x29,0xA0,0x25,0xA0,0x79,0xA0,0x11,0xA0,0x7D,0xA0,0x11,0xA0,0x5D,0xA0,0x3A,0xA0,0x1C,0x20,0x70,0x20,0x00,0x00,}}, +{ 0x91F5, {0x20,0x00,0x37,0xC0,0x7A,0x40,0x4B,0x40,0xF2,0xC0,0x21,0x80,0xF9,0x80,0x21,0x80,0x79,0x80,0x73,0x80,0x3C,0x40,0xE8,0x20,0x00,0x00,}}, +{ 0x91F6, {0x21,0x80,0x33,0x80,0x7B,0x80,0x4B,0xC0,0xF3,0xC0,0x27,0xC0,0xFB,0xC0,0x23,0xC0,0x7B,0xC0,0x72,0x20,0x3A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x91FC, {0x20,0x00,0x37,0xC0,0x79,0x40,0x4D,0x40,0xF3,0x40,0x21,0x40,0xF9,0xC0,0x21,0xC0,0x7A,0x60,0x72,0x40,0x3C,0x40,0xE8,0x80,0x00,0x00,}}, +{ 0x91FF, {0x20,0x40,0x30,0x80,0x7B,0x00,0x4A,0x00,0xF3,0xE0,0x22,0x80,0xFA,0x80,0x22,0x80,0x7E,0x80,0x74,0x80,0x38,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x920D, {0x21,0x00,0x31,0x00,0x79,0xE0,0x4F,0x40,0xF3,0x40,0x23,0x40,0xFB,0x40,0x23,0x40,0x7B,0xC0,0x71,0x20,0x39,0x20,0xE0,0xE0,0x00,0x00,}}, +{ 0x920E, {0x11,0x00,0x19,0x00,0x3D,0xE0,0x26,0x20,0x7C,0xA0,0x10,0xA0,0x7D,0x60,0x11,0xE0,0x3F,0x20,0x38,0x20,0x1C,0x20,0x70,0x40,0x00,0x00,}}, +{ 0x9211, {0x20,0x00,0x33,0xE0,0x7A,0x00,0x4B,0xC0,0xF3,0x40,0x23,0x40,0xFB,0xC0,0x22,0x80,0x7A,0x80,0x75,0xC0,0x3D,0x40,0xEA,0x20,0x00,0x00,}}, +{ 0x9214, {0x21,0x80,0x31,0x80,0x79,0x80,0x4B,0xC0,0xF3,0xC0,0x25,0xA0,0xFD,0xE0,0x21,0xC0,0x78,0x80,0x70,0x80,0x3B,0x00,0xEC,0x00,0x00,0x00,}}, +{ 0x9215, {0x20,0x00,0x37,0x80,0x7A,0x80,0x4A,0x80,0xF2,0x80,0x27,0xE0,0xFA,0x80,0x22,0x80,0x7A,0x80,0x72,0x80,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x921E, {0x10,0x80,0x18,0x80,0x3D,0xE0,0x25,0xE0,0x7A,0x20,0x11,0xA0,0x7C,0x20,0x10,0xA0,0x3D,0x20,0x38,0x20,0x1C,0x20,0x70,0x40,0x00,0x00,}}, +{ 0x9229, {0x20,0x00,0x37,0xE0,0x7B,0xC0,0x4B,0xC0,0xF2,0x40,0x22,0x40,0xFB,0xC0,0x22,0x40,0x7A,0x00,0x74,0x00,0x3C,0x00,0xE8,0x00,0x00,0x00,}}, +{ 0x922C, {0x20,0x00,0x33,0xC0,0x7A,0x40,0x4A,0x40,0xF3,0xC0,0x23,0xC0,0xFB,0x80,0x23,0x80,0x7A,0x80,0x74,0x80,0x3C,0x40,0xE8,0x20,0x00,0x00,}}, +{ 0x9234, {0x21,0x00,0x31,0x00,0x7B,0x80,0x4C,0x80,0xF7,0xC0,0x20,0x20,0xFF,0xC0,0x21,0x40,0x79,0x40,0x71,0xC0,0x39,0x00,0xE1,0x00,0x00,0x00,}}, +{ 0x9237, {0x20,0x80,0x30,0x80,0x78,0x80,0x4F,0xE0,0xF0,0x80,0x20,0x80,0xFB,0xC0,0x22,0x40,0x7A,0x40,0x72,0x40,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x923F, {0x10,0x00,0x19,0xE0,0x3D,0xE0,0x25,0xE0,0x79,0xE0,0x11,0xE0,0x7D,0xE0,0x11,0xE0,0x3D,0xE0,0x39,0xE0,0x1D,0x20,0x70,0x00,0x00,0x00,}}, +{ 0x9244, {0x20,0x80,0x30,0x80,0x7A,0x80,0x4B,0xC0,0xF2,0x80,0x24,0x80,0xFF,0xE0,0x20,0x80,0x78,0x80,0x71,0x80,0x3A,0x40,0xEC,0x20,0x00,0x00,}}, +{ 0x9245, {0x20,0x00,0x37,0xE0,0x7A,0x00,0x4B,0xC0,0xF2,0x40,0x22,0x40,0xFA,0x40,0x23,0xC0,0x7A,0x40,0x72,0x00,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x9248, {0x21,0x80,0x31,0x80,0x7B,0xE0,0x4B,0xE0,0xF7,0x00,0x21,0x00,0xF9,0x40,0x21,0x80,0x79,0x00,0x71,0x20,0x39,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x9249, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4F,0xE0,0xF5,0xC0,0x23,0x40,0xF9,0x80,0x21,0x80,0x79,0x80,0x71,0xC0,0x3F,0xE0,0xE0,0x20,0x00,0x00,}}, +{ 0x924B, {0x21,0x00,0x31,0x00,0x7B,0xC0,0x4B,0xC0,0xF7,0x40,0x23,0xC0,0xFB,0xC0,0x23,0xC0,0x7A,0x80,0x72,0x20,0x3A,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x9250, {0x20,0x00,0x37,0xE0,0x79,0x00,0x49,0x00,0xF2,0x00,0x23,0xC0,0xFE,0x40,0x22,0x40,0x7A,0x40,0x72,0x40,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x9257, {0x22,0x80,0x32,0x80,0x7A,0x80,0x4F,0xE0,0xF2,0xC0,0x22,0x80,0xFA,0x80,0x23,0x80,0x7A,0x80,0x72,0x80,0x3B,0x80,0xE2,0x80,0x00,0x00,}}, +{ 0x925A, {0x30,0x80,0x31,0x00,0x36,0xE0,0x2D,0xE0,0x7D,0xE0,0x35,0xE0,0x7D,0xE0,0x35,0xE0,0x7F,0xE0,0x32,0xE0,0x3A,0xC0,0x64,0xC0,0x00,0x00,}}, +{ 0x925B, {0x21,0x80,0x30,0x80,0x5A,0x80,0x4A,0x40,0xF4,0x40,0x24,0x20,0xFB,0xC0,0x22,0x40,0x7A,0x40,0x72,0x40,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x925E, {0x21,0x80,0x31,0xC0,0x7B,0xE0,0x4B,0xE0,0xF3,0xC0,0x23,0xC0,0xFA,0xC0,0x22,0xC0,0x7A,0x80,0x73,0xE0,0x3F,0xE0,0xE9,0x20,0x00,0x00,}}, +{ 0x9262, {0x21,0x00,0x31,0x00,0x79,0x00,0x4F,0xE0,0xF1,0x00,0x21,0x80,0xFB,0x80,0x25,0x40,0x79,0x20,0x73,0xC0,0x39,0x00,0xE1,0x00,0x00,0x00,}}, +{ 0x9264, {0x10,0x80,0x18,0x80,0x3D,0xE0,0x25,0xE0,0x7B,0xA0,0x11,0xE0,0x7D,0xE0,0x11,0xE0,0x3D,0x20,0x38,0x20,0x1C,0x20,0x70,0x40,0x00,0x00,}}, +{ 0x9266, {0x20,0x00,0x37,0xE0,0x78,0x80,0x4A,0x80,0xF2,0x80,0x22,0xC0,0xFA,0x80,0x22,0x80,0x7A,0x80,0x72,0x80,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x9271, {0x20,0x80,0x30,0x80,0x7B,0xE0,0x4A,0x00,0xF2,0x00,0x22,0x80,0xFA,0x80,0x24,0x80,0x7D,0x40,0x75,0x40,0x3F,0xA0,0xE8,0x20,0x00,0x00,}}, +{ 0x927E, {0x21,0x00,0x31,0x00,0x7A,0x40,0x4F,0xE0,0xF2,0x80,0x22,0x80,0xFF,0xC0,0x24,0x80,0x7C,0x80,0x77,0xE0,0x38,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x9280, {0x20,0x00,0x33,0xC0,0x7A,0x40,0x4B,0xC0,0xF2,0x40,0x22,0x40,0xFB,0xC0,0x23,0x20,0x6A,0xC0,0x72,0x80,0x3B,0x40,0xE4,0x20,0x00,0x00,}}, +{ 0x9283, {0x21,0x00,0x31,0x00,0x7F,0xE0,0x49,0x40,0xF2,0xE0,0x27,0xA0,0xF9,0x80,0x21,0x80,0x7A,0x80,0x72,0xA0,0x3C,0xA0,0xE8,0x60,0x00,0x00,}}, +{ 0x9285, {0x10,0x00,0x1B,0xE0,0x3E,0x20,0x27,0xE0,0x7A,0x20,0x13,0xE0,0x7F,0x60,0x13,0x60,0x3F,0x60,0x3B,0xE0,0x1E,0x20,0x72,0x60,0x00,0x00,}}, +{ 0x9291, {0x20,0x80,0x30,0x80,0x7A,0x80,0x4B,0xC0,0xF2,0x80,0x24,0x80,0xFF,0xE0,0x21,0x80,0x7A,0x80,0x72,0xA0,0x3C,0xA0,0xE8,0x60,0x00,0x00,}}, +{ 0x9293, {0x23,0x80,0x31,0x80,0x79,0x80,0x4A,0x40,0xF7,0xE0,0x21,0x80,0xF9,0x80,0x23,0xC0,0x79,0x80,0x71,0x80,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x9295, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4F,0xC0,0xF1,0xC0,0x27,0xC0,0xFD,0x80,0x27,0xE0,0x7D,0xE0,0x71,0xC0,0x3A,0x40,0xE4,0x20,0x00,0x00,}}, +{ 0x9296, {0x21,0x80,0x33,0x80,0x7B,0xC0,0x4B,0xC0,0xF5,0x80,0x27,0xE0,0xF9,0x80,0x23,0xC0,0x7B,0xC0,0x75,0xA0,0x39,0x80,0xE1,0x80,0x00,0x00,}}, +{ 0x9298, {0x10,0x80,0x18,0x80,0x3D,0xE0,0x25,0x20,0x7B,0x40,0x10,0xC0,0x7C,0x80,0x11,0xE0,0x3F,0x20,0x39,0x20,0x1D,0xE0,0x71,0x20,0x00,0x00,}}, +{ 0x929A, {0x21,0x80,0x31,0x80,0x79,0x80,0x4F,0xA0,0xF3,0xC0,0x21,0x80,0xFB,0xC0,0x25,0xA0,0x7A,0xA0,0x72,0xA0,0x3C,0xA0,0xE8,0x60,0x00,0x00,}}, +{ 0x929B, {0x20,0x40,0x30,0x80,0x7B,0x80,0x49,0x80,0xF7,0xE0,0x21,0x80,0xF9,0x80,0x23,0xC0,0x7A,0x40,0x72,0x40,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x929C, {0x64,0x00,0x44,0xE0,0x8A,0x00,0x3F,0xE0,0x24,0x40,0x7F,0x40,0x64,0x40,0xF7,0x40,0x6E,0x40,0x66,0x40,0x78,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x92AD, {0x21,0x00,0x31,0x40,0x7F,0xE0,0x41,0x00,0xF7,0xC0,0x21,0x00,0xFF,0xE0,0x21,0x40,0x78,0xC0,0x70,0xA0,0x3B,0x60,0xEC,0x20,0x00,0x00,}}, +{ 0x92B7, {0x21,0x80,0x31,0x80,0x7B,0xE0,0x4D,0xA0,0xF3,0xC0,0x22,0x40,0xFB,0xC0,0x22,0x40,0x7B,0xC0,0x72,0x40,0x3A,0x40,0xE2,0xC0,0x00,0x00,}}, +{ 0x92B9, {0x20,0xC0,0x33,0x80,0x7F,0xE0,0x4F,0xE0,0xF3,0xC0,0x25,0xA0,0xFB,0x80,0x21,0xC0,0x7A,0xE0,0x72,0x20,0x3C,0x20,0xE8,0xC0,0x00,0x00,}}, +{ 0x92CF, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4B,0xC0,0xF3,0xC0,0x23,0xC0,0xFD,0xA0,0x25,0xA0,0x79,0x80,0x72,0x80,0x3C,0x40,0xE8,0x20,0x00,0x00,}}, +{ 0x92D2, {0x21,0x00,0x33,0xC0,0x7E,0x80,0x49,0x80,0xF6,0xE0,0x23,0xC0,0xF8,0x80,0x23,0xC0,0x78,0x80,0x77,0xE0,0x38,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x92E4, {0x20,0x80,0x2E,0x80,0x7A,0x80,0x5F,0xE0,0xFA,0xA0,0x2E,0xA0,0xFA,0xA0,0x2B,0xA0,0xBE,0xA0,0x79,0x20,0x32,0x20,0xC4,0x40,0x00,0x00,}}, +{ 0x92E9, {0x22,0x80,0x32,0xC0,0x7F,0xE0,0x48,0x80,0xF1,0x80,0x27,0xE0,0xFA,0x00,0x22,0x00,0x7A,0x00,0x72,0x00,0x3A,0x00,0xE1,0xC0,0x00,0x00,}}, +{ 0x92EA, {0x21,0xC0,0x31,0x20,0x7F,0xE0,0x49,0x00,0xF7,0xC0,0x25,0x40,0xFF,0xC0,0x25,0x40,0x7F,0xC0,0x75,0x40,0x3D,0x40,0xE5,0x40,0x00,0x00,}}, +{ 0x92ED, {0x22,0x40,0x31,0x40,0x79,0x00,0x4B,0xC0,0xF2,0x40,0x22,0x40,0xFB,0xC0,0x21,0x80,0x7A,0x80,0x72,0xA0,0x3C,0xA0,0xE8,0x60,0x00,0x00,}}, +{ 0x92F2, {0x20,0x40,0x33,0x80,0x7A,0x00,0x4B,0xE0,0xF2,0x80,0x22,0x80,0xFA,0x80,0x27,0xE0,0x78,0x00,0x71,0x40,0x3A,0x20,0xE4,0x20,0x00,0x00,}}, +{ 0x92F3, {0x21,0x00,0x31,0x00,0x7F,0xE0,0x4B,0xC0,0xF1,0x00,0x27,0xE0,0xF9,0x40,0x27,0xE0,0x7B,0x40,0x75,0xC0,0x38,0x40,0xE0,0xC0,0x00,0x00,}}, +{ 0x92F8, {0x20,0x00,0x37,0xC0,0x5C,0x40,0x4F,0xC0,0xF4,0x80,0x27,0xE0,0xFC,0x80,0x24,0x80,0x7F,0xC0,0x76,0x40,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x92FA, {0x61,0x80,0x61,0x80,0x77,0xE0,0x5C,0x00,0xF7,0xC0,0x65,0xC0,0xF5,0xC0,0x6B,0xC0,0xF3,0xC0,0x65,0xA0,0x79,0xA0,0xD0,0xE0,0x00,0x00,}}, +{ 0x92FC, {0x30,0x00,0x37,0xE0,0x2E,0x60,0x4D,0x60,0x7F,0xE0,0x14,0xA0,0x7E,0xE0,0x16,0xE0,0x7E,0xE0,0x37,0xE0,0x3C,0x20,0x64,0x60,0x00,0x00,}}, +{ 0x9306, {0x20,0x80,0x37,0xE0,0x78,0x80,0x4B,0xC0,0xF7,0xE0,0x20,0x00,0xFB,0xC0,0x22,0x40,0x7B,0xC0,0x73,0xC0,0x3A,0x40,0xE2,0xC0,0x00,0x00,}}, +{ 0x930F, {0x60,0x00,0x6F,0xE0,0x73,0x80,0x5F,0xC0,0xF8,0x40,0x68,0x40,0xFF,0xC0,0x6B,0xC0,0xF3,0x80,0x63,0x80,0x7F,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x9310, {0x21,0x40,0x31,0x40,0x7A,0x80,0x4F,0xE0,0xFA,0x80,0x23,0xC0,0xFA,0x80,0x22,0x80,0x7B,0xC0,0x72,0x80,0x3B,0xE0,0xE2,0x00,0x00,0x00,}}, +{ 0x9318, {0x20,0xC0,0x37,0x80,0x78,0x80,0x4F,0xE0,0xF2,0xC0,0x27,0xE0,0xFA,0xC0,0x22,0xC0,0x7F,0xE0,0x70,0x80,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x9319, {0x11,0xE0,0x19,0xE0,0x3E,0xC0,0x27,0xE0,0x79,0xE0,0x10,0x00,0x7D,0xE0,0x11,0xE0,0x3D,0xE0,0x39,0xE0,0x1D,0xE0,0x71,0x20,0x00,0x00,}}, +{ 0x931A, {0x20,0x60,0x37,0xC0,0x7B,0xE0,0x4C,0x20,0xF3,0xC0,0x21,0xC0,0xFF,0xE0,0x21,0xC0,0x7B,0xC0,0x71,0x80,0x39,0x80,0xE1,0x80,0x00,0x00,}}, +{ 0x9320, {0x20,0x80,0x30,0x80,0x7F,0xE0,0x48,0x20,0xF7,0xE0,0x20,0x80,0xFA,0x80,0x22,0xC0,0x7A,0x80,0x72,0x80,0x3D,0x80,0xE8,0xE0,0x00,0x00,}}, +{ 0x9322, {0x21,0x80,0x31,0x40,0x7F,0xE0,0x4F,0xC0,0xF1,0xA0,0x26,0x60,0xF9,0x80,0x23,0xE0,0x7F,0xC0,0x71,0xA0,0x3E,0xE0,0xE0,0x20,0x00,0x00,}}, +{ 0x9323, {0x20,0x00,0x37,0xC0,0x79,0x40,0x4F,0xC0,0xF3,0x80,0x25,0xC0,0xFF,0xC0,0x21,0x40,0x7F,0xC0,0x72,0x80,0x3F,0xC0,0xE9,0x20,0x00,0x00,}}, +{ 0x9326, {0x21,0x00,0x32,0x00,0x7B,0xC0,0x4B,0xC0,0xF2,0x40,0x23,0xC0,0xF9,0x00,0x27,0xE0,0x7D,0x20,0x75,0x20,0x3D,0x40,0xE1,0x00,0x00,0x00,}}, +{ 0x9328, {0x22,0x80,0x32,0x80,0x7F,0xE0,0x4A,0x80,0xF0,0x00,0x27,0xC0,0xFD,0x40,0x25,0x40,0x6F,0xC0,0x75,0x40,0x3F,0xC0,0xE4,0x40,0x00,0x00,}}, +{ 0x932B, {0x20,0x00,0x37,0xC0,0x7C,0x40,0x4F,0xC0,0xF7,0xC0,0x22,0x00,0xFB,0xE0,0x25,0xA0,0x7A,0xA0,0x74,0xA0,0x39,0x20,0xE0,0xC0,0x00,0x00,}}, +{ 0x932C, {0x20,0x80,0x30,0x80,0x7F,0xE0,0x48,0x80,0xF3,0xC0,0x22,0xC0,0xFB,0xC0,0x23,0xC0,0x79,0xC0,0x72,0xA0,0x3C,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x932E, {0x10,0x00,0x1B,0xE0,0x3E,0xA0,0x27,0xE0,0x7B,0xA0,0x12,0xA0,0x7F,0xE0,0x13,0xE0,0x3F,0xE0,0x3B,0xA0,0x1F,0xE0,0x72,0x20,0x00,0x00,}}, +{ 0x932F, {0x22,0x80,0x32,0x80,0x7F,0xE0,0x4A,0x80,0xF2,0x80,0x27,0xE0,0xF8,0x00,0x23,0xC0,0x7A,0x40,0x73,0xC0,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x9332, {0x20,0x00,0x33,0xC0,0x58,0x40,0x4B,0xC0,0xF7,0xE0,0x20,0x80,0xFC,0xA0,0x22,0xC0,0x79,0xC0,0x76,0xA0,0x38,0x80,0xE0,0x80,0x00,0x00,}}, +{ 0x9335, {0x21,0x80,0x33,0xC0,0x7F,0xE0,0x49,0x80,0xF1,0x80,0x23,0xA0,0xFB,0xC0,0x27,0x80,0x7B,0x80,0x73,0xA0,0x3B,0xA0,0xE2,0xE0,0x00,0x00,}}, +{ 0x933A, {0x21,0x80,0x33,0xC0,0x7F,0xE0,0x49,0x80,0xF1,0x80,0x27,0xE0,0xF9,0x80,0x21,0xC0,0x79,0x40,0x71,0x40,0x3A,0x40,0xE4,0x80,0x00,0x00,}}, +{ 0x933B, {0x20,0x80,0x33,0xC0,0x78,0xA0,0x4F,0xE0,0xF3,0xC0,0x25,0x80,0xFD,0x80,0x25,0x80,0x7D,0x80,0x77,0xE0,0x3C,0x60,0xE0,0x20,0x00,0x00,}}, +{ 0x9344, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4B,0xC0,0xF2,0x40,0x22,0x40,0xFB,0xC0,0x21,0x80,0x7B,0xC0,0x75,0xA0,0x39,0xA0,0xE1,0x80,0x00,0x00,}}, +{ 0x934B, {0x20,0x00,0x33,0xC0,0x7A,0x40,0x4A,0xC0,0xF2,0xC0,0x27,0xE0,0xFC,0x20,0x25,0xA0,0x7D,0xA0,0x75,0xA0,0x3C,0x20,0xE4,0x60,0x00,0x00,}}, +{ 0x934D, {0x20,0x80,0x30,0x80,0x7F,0xE0,0x4D,0x80,0xF7,0xE0,0x25,0x80,0xFC,0x00,0x27,0xC0,0x7D,0x40,0x78,0x80,0x39,0x80,0xF6,0x60,0x00,0x00,}}, +{ 0x9354, {0x20,0x00,0x37,0xE0,0x7F,0xE0,0x4E,0x60,0xF3,0xC0,0x20,0x00,0xFF,0xE0,0x21,0x00,0x7B,0xC0,0x70,0x40,0x38,0x40,0xE0,0x80,0x00,0x00,}}, +{ 0x9356, {0x62,0x80,0x62,0xC0,0x7F,0xE0,0x53,0x80,0xF2,0x80,0x63,0x80,0xF2,0x80,0x6F,0xE0,0xF5,0x80,0x66,0x60,0x77,0xE0,0xC4,0x00,0x00,0x00,}}, +{ 0x935B, {0x21,0x00,0x33,0xC0,0x7D,0xC0,0x4F,0xC0,0xF7,0x60,0x24,0x20,0xFF,0xC0,0x25,0x40,0x7F,0xC0,0x7F,0x80,0x34,0xC0,0xE7,0x20,0x00,0x00,}}, +{ 0x935C, {0x20,0x00,0x37,0xC0,0x7D,0x40,0x4F,0x40,0xF7,0x40,0x24,0x00,0xFF,0xC0,0x25,0xC0,0x7F,0xC0,0x76,0x80,0x3C,0xC0,0xE5,0x20,0x00,0x00,}}, +{ 0x9360, {0x21,0x00,0x33,0x00,0x7B,0xC0,0x4B,0xC0,0xF2,0x40,0x23,0xC0,0xF8,0x00,0x27,0xE0,0x7B,0xC0,0x73,0xC0,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x936C, {0x21,0x80,0x22,0x80,0x76,0x80,0x8A,0xA0,0x7F,0xA0,0x23,0xC0,0xF7,0x80,0x26,0xC0,0xBA,0xC0,0x63,0x40,0x73,0x20,0xC2,0x20,0x00,0x00,}}, +{ 0x936E, {0x63,0x00,0x63,0x00,0x76,0x80,0x5F,0xC0,0xF0,0x20,0x6E,0x40,0xFB,0xC0,0x6F,0xC0,0xFF,0x80,0x6F,0xC0,0x7B,0xC0,0xCB,0xC0,0x00,0x00,}}, +{ 0x9375, {0x20,0x80,0x23,0xC0,0x7C,0xC0,0x57,0xE0,0xF4,0xC0,0x2F,0xC0,0xF0,0x80,0x2B,0xC0,0xFC,0x80,0x67,0xE0,0x6A,0x80,0xD1,0xE0,0x00,0x00,}}, +{ 0x937C, {0x61,0xC0,0x71,0xA0,0x5F,0xE0,0x4F,0xE0,0xEF,0xC0,0x69,0xC0,0xFF,0xC0,0x6D,0x80,0xFF,0x80,0x6F,0xE0,0x71,0x60,0xD2,0x20,0x00,0x00,}}, +{ 0x937E, {0x20,0xC0,0x33,0x80,0x7F,0xE0,0x48,0x80,0xF3,0xC0,0x23,0xC0,0xFB,0xC0,0x20,0x80,0x7B,0xC0,0x70,0x80,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x938C, {0x64,0x80,0x63,0x00,0x7F,0xE0,0x9F,0xC0,0xF2,0xC0,0x2F,0xE0,0xF2,0xC0,0x2F,0xC0,0xB6,0x80,0x6A,0xC0,0x72,0xA0,0xC2,0x80,0x00,0x00,}}, +{ 0x9394, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x49,0x40,0xF3,0x40,0x25,0x80,0xF1,0x80,0x22,0x40,0x7F,0xE0,0x72,0x40,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x9396, {0x20,0x80,0x34,0xA0,0x7A,0xA0,0x4B,0xC0,0xF2,0x40,0x23,0xC0,0xFA,0x40,0x23,0xC0,0x7A,0x40,0x73,0xC0,0x3A,0x40,0xEC,0x20,0x00,0x00,}}, +{ 0x9397, {0x21,0x80,0x31,0x80,0x7B,0xC0,0x4F,0xE0,0xF3,0xC0,0x22,0x40,0xFB,0xC0,0x23,0xC0,0x7F,0xE0,0x77,0xE0,0x3B,0xE0,0xE2,0x20,0x00,0x00,}}, +{ 0x939A, {0x60,0x80,0x69,0x00,0x75,0xC0,0x51,0x40,0xF1,0xC0,0x2D,0x00,0xF5,0xC0,0x25,0x40,0xF5,0x40,0x65,0xC0,0x7A,0x00,0xD1,0xE0,0x00,0x00,}}, +{ 0x93A7, {0x21,0x00,0x33,0x40,0x7B,0x40,0x4B,0x40,0xF7,0xE0,0x20,0x00,0xFB,0xC0,0x22,0x40,0x7B,0xC0,0x72,0x40,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x93AC, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4B,0xC0,0xF2,0x40,0x23,0xC0,0xF8,0x00,0x27,0xE0,0x7D,0xA0,0x75,0xA0,0x3D,0xA0,0xE4,0x60,0x00,0x00,}}, +{ 0x93AD, {0x22,0xC0,0x33,0x00,0x7B,0xE0,0x4D,0xE0,0xF5,0x40,0x25,0xC0,0xFD,0x40,0x25,0xC0,0x7D,0xC0,0x77,0xE0,0x3B,0x40,0xEC,0x20,0x00,0x00,}}, +{ 0x93AE, {0x20,0x80,0x37,0xE0,0x78,0x80,0x4B,0xC0,0xF3,0xC0,0x22,0x40,0xFB,0xC0,0x22,0x40,0x7B,0xC0,0x77,0xE0,0x3A,0x40,0xE4,0x20,0x00,0x00,}}, +{ 0x93B0, {0x23,0x80,0x32,0xC0,0x7F,0xE0,0x4F,0xE0,0xF3,0x80,0x22,0x80,0xFC,0x40,0x27,0xE0,0x7D,0xC0,0x75,0xC0,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x93B9, {0x69,0x80,0x64,0x80,0x7D,0x40,0x5E,0x20,0xF7,0xC0,0x61,0x80,0xF3,0xE0,0x6D,0x80,0xF5,0xC0,0x66,0x40,0x7A,0x00,0xD1,0xE0,0x00,0x00,}}, +{ 0x93C3, {0x65,0x80,0x65,0x80,0x75,0xE0,0x5F,0xE0,0xF5,0x80,0x67,0xE0,0xF7,0x80,0x67,0xE0,0xFE,0xC0,0x6B,0xC0,0x73,0x20,0xC6,0x20,0x00,0x00,}}, +{ 0x93C8, {0x69,0x80,0x65,0x80,0x77,0xE0,0x5B,0xC0,0xF7,0xC0,0x67,0xC0,0xF3,0xC0,0x6F,0xC0,0xF7,0xE0,0x67,0xE0,0x7B,0x80,0xD1,0xE0,0x00,0x00,}}, +{ 0x93D0, {0x20,0x00,0x37,0xC0,0x7F,0xC0,0x4F,0xC0,0xF7,0xC0,0x21,0x00,0xFB,0x80,0x25,0xC0,0x7B,0x60,0x73,0x40,0x39,0xC0,0xE7,0x00,0x00,0x00,}}, +{ 0x93D1, {0x61,0x00,0x61,0x00,0x7F,0xE0,0xD2,0x80,0xFF,0xC0,0x29,0x40,0xFF,0xC0,0x29,0x40,0xFB,0xC0,0x6B,0xC0,0x78,0x40,0xC8,0xC0,0x00,0x00,}}, +{ 0x93D6, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x5F,0xA0,0xA5,0xE0,0x3B,0x80,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x93D7, {0x60,0x00,0x6F,0xC0,0x7F,0xC0,0x5F,0xC0,0xFF,0x80,0x6B,0xC0,0xFF,0x20,0x6B,0x00,0xF7,0xC0,0x61,0x00,0x7F,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x93D8, {0x63,0x80,0x6B,0xC0,0x7B,0xC0,0x5F,0xC0,0xFB,0x80,0x63,0xC0,0xF3,0x40,0x6F,0xE0,0xFB,0x40,0x6B,0xC0,0x72,0x40,0xC2,0xC0,0x00,0x00,}}, +{ 0x93DD, {0x20,0x00,0x33,0xC0,0x7B,0xC0,0x4B,0xC0,0xF3,0xC0,0x27,0xE0,0xFD,0xA0,0x27,0xE0,0x7F,0xC0,0x72,0x40,0x39,0x80,0xEE,0x60,0x00,0x00,}}, +{ 0x93E1, {0x20,0x80,0x37,0xE0,0x79,0x40,0x4F,0xE0,0xF3,0xC0,0x22,0x40,0xFB,0xC0,0x22,0x40,0x7B,0xC0,0x71,0xA0,0x3A,0xA0,0xEC,0x60,0x00,0x00,}}, +{ 0x93E4, {0x21,0x80,0x33,0xC0,0x7F,0xE0,0x4F,0xE0,0xF3,0xC0,0x23,0xC0,0xFB,0xC0,0x23,0xC0,0x7F,0xE0,0x73,0x80,0x39,0x80,0xE7,0x40,0x00,0x00,}}, +{ 0x93E5, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4E,0x00,0xF3,0xE0,0x25,0x80,0xFD,0xC0,0x2D,0x40,0x7D,0xC0,0x75,0x40,0x3D,0xC0,0xE5,0x40,0x00,0x00,}}, +{ 0x93E8, {0x20,0xC0,0xFF,0x00,0x7B,0xE0,0x7B,0xE0,0x7A,0x80,0xFC,0x80,0x24,0x80,0x1B,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x9403, {0x61,0x00,0x67,0xC0,0x7F,0xE0,0x5F,0xE0,0xFE,0xC0,0x64,0x80,0xF6,0xE0,0x6C,0x00,0xFF,0xE0,0x63,0xA0,0x75,0xA0,0xC8,0xE0,0x00,0x00,}}, +{ 0x9407, {0x20,0xC0,0x37,0xC0,0x7B,0xC0,0x4F,0xE0,0xF3,0xC0,0x23,0xC0,0xFD,0xA0,0x23,0xC0,0x7B,0xC0,0x73,0xC0,0x3B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x9410, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x4E,0x60,0xF7,0xE0,0x22,0x40,0xFB,0xC0,0x22,0x40,0x7B,0xC0,0x73,0xA0,0x3D,0xA0,0xE1,0x80,0x00,0x00,}}, +{ 0x9413, {0x65,0x80,0x65,0x80,0x7F,0x80,0x5F,0xE0,0xFB,0xC0,0x6F,0xC0,0xFE,0xC0,0x62,0x80,0xFF,0x80,0x65,0xC0,0x75,0x40,0xCE,0x20,0x00,0x00,}}, +{ 0x9414, {0x60,0x00,0x7F,0xE0,0x7F,0xC0,0x5F,0xC0,0xFF,0xC0,0x67,0x80,0xF4,0x80,0x67,0x80,0xF7,0x80,0x6F,0xE0,0x73,0x00,0xC1,0x00,0x00,0x00,}}, +{ 0x9418, {0x20,0x80,0x37,0xE0,0x79,0x40,0x4F,0xE0,0xF3,0xC0,0x23,0xC0,0xFB,0xC0,0x23,0xC0,0x78,0x80,0x73,0xC0,0x38,0x80,0xE7,0xE0,0x00,0x00,}}, +{ 0x9419, {0x23,0x40,0x31,0xC0,0x7E,0x60,0x4B,0xE0,0xF4,0x40,0x27,0xE0,0xFA,0x40,0x23,0xC0,0x7A,0x80,0x71,0x80,0x3F,0xE0,0xE0,0x00,0x00,0x00,}}, +{ 0x941A, {0x60,0x00,0x6F,0xE0,0x7F,0xC0,0x5C,0xC0,0xFE,0xC0,0x6B,0xC0,0xF3,0x80,0x6F,0xE0,0xFB,0x00,0x6B,0xA0,0x72,0xA0,0xC1,0x80,0x00,0x00,}}, +{ 0x9421, {0x63,0x80,0x63,0xC0,0x7F,0xC0,0x5F,0xE0,0xF1,0x80,0x6F,0xC0,0xF9,0xC0,0x6F,0xC0,0xFE,0x80,0x67,0xE0,0x79,0xE0,0xC1,0x20,0x00,0x00,}}, +{ 0x942B, {0x22,0x80,0x32,0xC0,0x7F,0xE0,0x4F,0xC0,0xF7,0xC0,0x25,0x80,0xFF,0xE0,0x20,0x00,0x7F,0xE0,0x75,0xA0,0x3C,0x20,0xE4,0x60,0x00,0x00,}}, +{ 0x9435, {0x65,0x80,0x6F,0xC0,0x7F,0xE0,0x5F,0xE0,0xFF,0xC0,0x6B,0xC0,0xFF,0xC0,0x6F,0xC0,0xFC,0x80,0x67,0xE0,0x7F,0x60,0xC2,0x20,0x00,0x00,}}, +{ 0x9436, {0x20,0x00,0x37,0xE0,0x7F,0xE0,0x4F,0xE0,0xF7,0xE0,0x20,0x00,0xFB,0xC0,0x22,0x40,0x7B,0xE0,0x77,0xE0,0x3B,0xC0,0xE6,0x20,0x00,0x00,}}, +{ 0x9438, {0x20,0x00,0x37,0xE0,0x7F,0xE0,0x4F,0xE0,0xF3,0xC0,0x21,0x80,0xFF,0xE0,0x23,0xC0,0x7F,0xE0,0x73,0xC0,0x39,0x80,0xE1,0x80,0x00,0x00,}}, +{ 0x943A, {0x25,0xA0,0x33,0xC0,0x7F,0xE0,0x4F,0xC0,0xF2,0x40,0x23,0xC0,0xF8,0x00,0x27,0xE0,0x7F,0xE0,0x77,0xE0,0x3F,0xE0,0xE4,0x20,0x00,0x00,}}, +{ 0x9441, {0x21,0x80,0x35,0xE0,0x7F,0xA0,0x4F,0xE0,0xF6,0xE0,0x27,0xE0,0xF9,0xA0,0x27,0x60,0x7B,0x80,0x77,0x80,0x31,0x80,0xE6,0x60,0x00,0x00,}}, +{ 0x9444, {0x61,0x00,0x6F,0xE0,0x77,0x80,0x5F,0xE0,0xF7,0xC0,0x61,0x00,0xF7,0x80,0x6F,0xE0,0xFF,0xE0,0x6F,0xE0,0x7F,0x40,0xC0,0xC0,0x00,0x00,}}, +{ 0x9451, {0x60,0x80,0x6F,0x80,0x7A,0xE0,0x5F,0x80,0xFF,0x00,0x2A,0xE0,0xFF,0x00,0x28,0x00,0xB7,0xC0,0x65,0xC0,0x7F,0xE0,0xC0,0x00,0x00,0x00,}}, +{ 0x9452, {0x02,0x00,0x7A,0x00,0x7F,0xE0,0x7F,0xC0,0x77,0xC0,0x67,0xC0,0x7C,0x00,0x1B,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x9453, {0x61,0x80,0x6B,0xC0,0x77,0xC0,0x57,0xC0,0xF7,0xE0,0x61,0x80,0xFD,0x80,0x65,0xC0,0xF5,0xC0,0x65,0xC0,0x7B,0x00,0xD1,0xE0,0x00,0x00,}}, +{ 0x945A, {0x22,0x80,0x37,0xC0,0x7F,0xE0,0x4F,0xE0,0xF5,0xC0,0x23,0xE0,0xFA,0x40,0x23,0xC0,0x7B,0xC0,0x73,0xC0,0x3B,0x40,0xEC,0x20,0x00,0x00,}}, +{ 0x945B, {0x61,0x80,0x6F,0xE0,0x7F,0xE0,0x5F,0xE0,0xF9,0x80,0x6F,0xE0,0xFB,0xC0,0x6B,0xC0,0xFB,0xC0,0x6B,0xC0,0x73,0x40,0xDC,0x20,0x00,0x00,}}, +{ 0x945E, {0x65,0x80,0x67,0x80,0x7F,0x80,0x5F,0xC0,0xFB,0xC0,0x6E,0xC0,0xFF,0xC0,0x6F,0xC0,0xFF,0xC0,0x6F,0xE0,0x7F,0xA0,0xD2,0x20,0x00,0x00,}}, +{ 0x9460, {0x69,0x40,0x6A,0x40,0x77,0xA0,0x5F,0xE0,0xFB,0xC0,0x77,0xA0,0xFD,0xE0,0x63,0x00,0xFF,0xE0,0x67,0x80,0x79,0x60,0xC1,0x00,0x00,0x00,}}, +{ 0x9462, {0x61,0x00,0x63,0xC0,0x7F,0xE0,0x5F,0xC0,0xFB,0xC0,0x6B,0xC0,0xFB,0xC0,0x6B,0xC0,0xFB,0xC0,0x6B,0xE0,0x73,0x60,0xD5,0xC0,0x00,0x00,}}, +{ 0x946A, {0x61,0x00,0x63,0xC0,0x7F,0xE0,0x5F,0xC0,0xFB,0xC0,0x6B,0xC0,0xFB,0xC0,0x6B,0xC0,0xFF,0xC0,0x7F,0xC0,0x75,0xC0,0xDF,0xE0,0x00,0x00,}}, +{ 0x9470, {0x61,0x00,0x62,0x80,0x7F,0xE0,0x5F,0xE0,0xFF,0xE0,0x77,0xA0,0xFF,0xE0,0x6F,0xC0,0xFF,0xC0,0x6F,0xC0,0x7B,0xC0,0xCB,0xC0,0x00,0x00,}}, +{ 0x9475, {0x63,0x80,0x7F,0xE0,0x7F,0xC0,0x5F,0xC0,0xFF,0xC0,0x62,0x80,0xF7,0xE0,0x6D,0x80,0xF7,0xC0,0x67,0xC0,0x77,0xE0,0xC4,0x00,0x00,0x00,}}, +{ 0x9477, {0x60,0x00,0x6F,0xE0,0x73,0x80,0x53,0x80,0xFF,0x80,0x60,0x80,0xFF,0xE0,0x6B,0xC0,0xFF,0xC0,0x6F,0xC0,0x7F,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x947C, {0x60,0x00,0x6F,0xC0,0x7F,0xC0,0x5F,0xC0,0xF5,0xC0,0x7B,0xE0,0xF5,0x80,0x6B,0xC0,0xFF,0xC0,0x6F,0xC0,0x77,0xE0,0xC5,0x00,0x00,0x00,}}, +{ 0x947D, {0x66,0xC0,0x67,0xE0,0x7F,0xE0,0x5F,0xE0,0xFB,0xE0,0x67,0xE0,0xF4,0x40,0x67,0xC0,0xF7,0xC0,0x67,0xC0,0x76,0xC0,0xD8,0x20,0x00,0x00,}}, +{ 0x947E, {0x6E,0x80,0x7F,0xE0,0xFF,0xC0,0xFF,0xE0,0xFB,0xC0,0xFF,0xA0,0x04,0x80,0x1B,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x947F, {0x75,0x80,0xFF,0x80,0x7E,0x60,0xFF,0xE0,0xFF,0xC0,0x6F,0x80,0x7C,0x60,0x1B,0x00,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0x9481, {0x6F,0xC0,0x6B,0xC0,0x7F,0xC0,0x5F,0xC0,0xF7,0xE0,0x6F,0xC0,0xF7,0xC0,0x65,0x80,0xFF,0xE0,0x67,0xC0,0x73,0x80,0xCE,0xE0,0x00,0x00,}}, +{ 0x9577, {0x00,0x00,0x3F,0x80,0x20,0x00,0x3F,0x00,0x3F,0x00,0x20,0x00,0xFF,0xE0,0x24,0x80,0x22,0x80,0x23,0x00,0x3D,0x80,0xE0,0x60,0x00,0x00,}}, +{ 0x9580, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9582, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9583, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x44,0x40,0x4A,0x40,0x4A,0x40,0x51,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9587, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x7F,0x40,0x44,0x40,0x46,0x40,0x44,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x9589, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x42,0x40,0x42,0x40,0x7F,0x40,0x46,0x40,0x4A,0x40,0x72,0x40,0x46,0xC0,0x00,0x00,}}, +{ 0x958A, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x65,0xC0,0x65,0xC0,0x65,0xC0,0x7F,0xC0,0x71,0xC0,0x40,0xC0,0x00,0x00,}}, +{ 0x958B, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x5F,0x40,0x4A,0x40,0x7F,0xC0,0x4A,0x40,0x52,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x958F, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x5F,0x40,0x44,0x40,0x4E,0x40,0x44,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9591, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x44,0x40,0x5F,0x40,0x4E,0x40,0x55,0x40,0x64,0xC0,0x44,0xC0,0x00,0x00,}}, +{ 0x9593, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x9594, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x44,0x40,0x7F,0x40,0x4E,0x40,0x4E,0x40,0x73,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9596, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x45,0x40,0x7F,0x40,0x4E,0x40,0x55,0x40,0x4C,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9598, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x5F,0x40,0x57,0x40,0x5F,0x40,0x5F,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x9599, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x65,0xC0,0x67,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x95A0, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x7F,0x40,0x44,0x40,0x5E,0x40,0x46,0x40,0x7F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x95A2, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x51,0x40,0x4A,0x40,0x5F,0x40,0x5F,0x40,0x44,0x40,0x5B,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x95A3, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x4F,0x40,0x79,0x40,0x46,0x40,0x7F,0xC0,0x51,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x95A4, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x4A,0x40,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x95A5, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x55,0x40,0x55,0xC0,0x77,0x40,0x7F,0x40,0x6F,0xC0,0x61,0xC0,0x40,0xC0,0x00,0x00,}}, +{ 0x95A7, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x40,0x40,0x4A,0x40,0x7F,0x40,0x5F,0x40,0x5F,0x40,0x73,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x95A8, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x5F,0x40,0x44,0x40,0x5F,0x40,0x4E,0x40,0x7F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x95AD, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x4E,0x40,0x5F,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x95B2, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x51,0x40,0x4A,0x40,0x5F,0x40,0x5F,0x40,0x4E,0x40,0x52,0x40,0x61,0xC0,0x00,0x00,}}, +{ 0x95B9, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x7F,0xC0,0x5F,0x40,0x7F,0xC0,0x5F,0x40,0x55,0x40,0x43,0xC0,0x00,0x00,}}, +{ 0x95BB, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x4F,0x40,0x51,0x40,0x76,0x40,0x5B,0x40,0x5B,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x95BC, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x51,0x40,0x7D,0x40,0x53,0xC0,0x5F,0xC0,0x57,0x40,0x79,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x95BE, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x43,0xC0,0x7F,0xC0,0x7B,0x40,0x7B,0x40,0x5B,0xC0,0x75,0xC0,0x40,0xC0,0x00,0x00,}}, +{ 0x95C3, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x4A,0x40,0x71,0xC0,0x00,0x00,}}, +{ 0x95C7, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x44,0x40,0x5F,0x40,0x4A,0x40,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x51,0xC0,0x00,0x00,}}, +{ 0x95CA, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x61,0xC0,0x56,0x40,0x6F,0xC0,0x57,0x40,0x57,0xC0,0x77,0xC0,0x65,0xC0,0x00,0x00,}}, +{ 0x95CC, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x7F,0x40,0x5F,0x40,0x57,0x40,0x5F,0x40,0x4E,0x40,0x77,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x95CD, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x45,0xC0,0x5F,0x40,0x7F,0x40,0x47,0x40,0x7F,0x40,0x6F,0x40,0x4F,0x40,0x49,0xC0,0x00,0x00,}}, +{ 0x95D4, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x44,0x40,0x5F,0x40,0x7F,0x40,0x4B,0x40,0x5F,0x40,0x5F,0x40,0x7F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x95D5, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x66,0x40,0x5A,0x40,0x7F,0xC0,0x55,0x40,0x7D,0x40,0x53,0x40,0x64,0xC0,0x00,0x00,}}, +{ 0x95D6, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x5F,0xC0,0x54,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x5F,0xC0,0x77,0xC0,0x63,0xC0,0x00,0x00,}}, +{ 0x95D8, {0x00,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x41,0x40,0x7D,0x40,0x6F,0xC0,0x7B,0x40,0x69,0x40,0x5D,0x40,0x61,0x40,0x00,0x00,}}, +{ 0x95DC, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x51,0x40,0x6F,0xC0,0x5B,0xC0,0x7F,0xC0,0x7B,0xC0,0x52,0x40,0x62,0xC0,0x00,0x00,}}, +{ 0x95E1, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x7F,0xC0,0x44,0xC0,0x00,0x00,}}, +{ 0x95E2, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x79,0x40,0x6F,0xC0,0x7B,0xC0,0x7F,0xC0,0x7F,0xC0,0x7B,0x40,0x61,0xC0,0x00,0x00,}}, +{ 0x95E5, {0x00,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x72,0x40,0x57,0x40,0x6F,0x40,0x57,0x40,0x5F,0x40,0x5F,0x40,0x52,0x40,0x6F,0xC0,0x00,0x00,}}, +{ 0x961C, {0x04,0x00,0x08,0x00,0x3F,0x80,0x3F,0x80,0x20,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x9621, {0x00,0x40,0x71,0x80,0x57,0x80,0x61,0x80,0x61,0x80,0x5F,0xE0,0x51,0x80,0x51,0x80,0x71,0x80,0x61,0x80,0x41,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x9628, {0x00,0x00,0x77,0xE0,0x54,0x00,0x65,0xC0,0x65,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x7D,0x80,0x69,0x20,0x51,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x962A, {0x00,0x00,0x77,0xE0,0x54,0x00,0x67,0xC0,0x64,0x40,0x64,0x40,0x56,0x40,0x55,0x80,0x65,0x80,0x49,0x80,0x56,0x40,0x68,0x20,0x00,0x00,}}, +{ 0x962E, {0x00,0x00,0x77,0xC0,0x50,0x00,0x60,0x00,0x6F,0xE0,0x53,0x80,0x53,0x80,0x53,0x80,0x77,0x80,0x65,0xA0,0x49,0xA0,0x50,0xE0,0x00,0x00,}}, +{ 0x962F, {0x01,0x00,0x71,0x00,0x51,0x00,0x65,0x00,0x65,0xC0,0x55,0x00,0x55,0x00,0x55,0x00,0x75,0x00,0x65,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x9632, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x61,0x00,0x61,0x00,0x61,0xC0,0x51,0x40,0x52,0x40,0x52,0x40,0x74,0x40,0x48,0x40,0x50,0x80,0x00,0x00,}}, +{ 0x963B, {0x00,0x00,0x77,0x80,0x54,0x80,0x64,0x80,0x67,0x80,0x64,0x80,0x54,0x80,0x57,0x80,0x74,0x80,0x64,0x80,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x963F, {0x00,0x00,0x7F,0xE0,0x50,0x40,0x67,0x40,0x65,0x40,0x55,0x40,0x55,0x40,0x57,0x40,0x74,0x40,0x60,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9640, {0x00,0x80,0x70,0x80,0x57,0xE0,0x64,0x20,0x6A,0x00,0x62,0x00,0x52,0xC0,0x53,0x00,0x52,0x00,0x72,0x20,0x42,0x20,0x41,0xE0,0x00,0x00,}}, +{ 0x9642, {0x01,0x80,0x71,0x80,0x57,0xE0,0x67,0xE0,0x65,0x80,0x57,0xC0,0x56,0x40,0x55,0x80,0x7D,0x80,0x69,0x80,0x53,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x9644, {0x02,0x40,0x72,0x40,0x54,0x40,0x67,0xE0,0x6C,0x40,0x6D,0x40,0x54,0xC0,0x54,0x40,0x54,0x40,0x74,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x964B, {0x00,0x00,0x67,0xE0,0x63,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6B,0xC0,0x6A,0xC0,0x6A,0x40,0x68,0x40,0x4F,0xE0,0x48,0x00,0x00,0x00,}}, +{ 0x964C, {0x00,0x00,0x7F,0xE0,0x51,0x00,0x62,0x00,0x67,0xC0,0x54,0x40,0x54,0x40,0x57,0xC0,0x74,0x40,0x64,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x964D, {0x01,0x00,0x73,0xC0,0x56,0x40,0x69,0x80,0x63,0xE0,0x5C,0x80,0x53,0xC0,0x52,0x80,0x6F,0xE0,0x40,0x80,0x40,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x964F, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x67,0xE0,0x63,0xC0,0x56,0x40,0x5B,0xC0,0x52,0x40,0x73,0xC0,0x62,0x40,0x42,0x40,0x42,0xC0,0x00,0x00,}}, +{ 0x9650, {0x00,0x00,0x77,0x80,0x54,0x80,0x67,0x80,0x64,0x80,0x57,0x80,0x55,0x40,0x55,0x40,0x75,0x80,0x65,0x80,0x46,0x40,0x58,0x20,0x00,0x00,}}, +{ 0x965B, {0x04,0x80,0x74,0xA0,0x57,0xC0,0x64,0x80,0x65,0xA0,0x67,0xA0,0x5D,0xE0,0x51,0x00,0x7F,0xC0,0x61,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x965C, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x67,0xE0,0x65,0x80,0x55,0x80,0x5B,0x40,0x53,0x40,0x73,0x80,0x64,0x80,0x48,0x40,0x50,0x20,0x00,0x00,}}, +{ 0x965D, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x67,0xE0,0x6D,0xC0,0x55,0x40,0x55,0x40,0x5B,0xA0,0x73,0xA0,0x64,0x80,0x48,0x40,0x50,0x20,0x00,0x00,}}, +{ 0x965E, {0x01,0x80,0x77,0x80,0x52,0x80,0x6F,0xE0,0x62,0xC0,0x54,0x80,0x59,0x80,0x53,0x00,0x7F,0xC0,0x61,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x965F, {0x01,0x80,0x71,0x80,0x53,0xC0,0x63,0x80,0x6F,0xE0,0x51,0x80,0x53,0xA0,0x53,0xA0,0x7D,0xC0,0x61,0x80,0x43,0x00,0x4C,0x00,0x00,0x00,}}, +{ 0x9662, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x70,0x20,0x67,0xC0,0x50,0x00,0x5F,0xE0,0x52,0x80,0x54,0x80,0x64,0xA0,0x48,0xA0,0x50,0xE0,0x00,0x00,}}, +{ 0x9663, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x57,0xC0,0x65,0x40,0x67,0xC0,0x55,0x40,0x57,0xC0,0x51,0x00,0x6F,0xE0,0x41,0x00,0x41,0x00,0x00,0x00,}}, +{ 0x9664, {0x01,0x00,0x71,0x00,0x52,0x80,0x64,0x40,0x6F,0xE0,0x51,0x00,0x5F,0xE0,0x51,0x00,0x75,0x40,0x69,0x20,0x51,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x9665, {0x01,0x00,0x71,0x00,0x53,0xC0,0x64,0x80,0x68,0x80,0x55,0xC0,0x55,0x40,0x55,0x40,0x65,0xC0,0x45,0x40,0x45,0xC0,0x45,0x40,0x00,0x00,}}, +{ 0x9666, {0x01,0x00,0x73,0x00,0x5F,0xE0,0x67,0xC0,0x63,0x00,0x5F,0xE0,0x52,0x80,0x5F,0xE0,0x66,0x80,0x59,0x80,0x40,0x80,0x40,0x80,0x00,0x00,}}, +{ 0x966A, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x64,0x80,0x62,0x80,0x6F,0xE0,0x50,0x00,0x57,0xC0,0x54,0x40,0x64,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x966C, {0x00,0x00,0x7F,0xE0,0x6A,0x00,0x6F,0xC0,0x6B,0xC0,0x6B,0xC0,0x6F,0xC0,0x6A,0x80,0x6E,0x80,0x7F,0xC0,0x43,0x40,0x42,0x20,0x00,0x00,}}, +{ 0x9670, {0x01,0x00,0x73,0x00,0x54,0x80,0x6B,0x40,0x60,0x20,0x57,0x80,0x51,0x00,0x57,0x80,0x60,0x00,0x7F,0xE0,0x45,0x80,0x5F,0x40,0x00,0x00,}}, +{ 0x9672, {0x00,0xC0,0x77,0x00,0x5F,0xC0,0x67,0xC0,0x65,0x80,0x5F,0xE0,0x55,0x80,0x57,0xC0,0x7F,0xC0,0x61,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x9673, {0x01,0x00,0x71,0x00,0x5F,0xE0,0x57,0xC0,0x65,0x40,0x67,0xC0,0x55,0x40,0x57,0xC0,0x73,0x80,0x65,0x40,0x59,0x20,0x41,0x00,0x00,0x00,}}, +{ 0x9675, {0x01,0x00,0x71,0x00,0x57,0xC0,0x6F,0xE0,0x62,0x80,0x54,0xA0,0x5A,0xE0,0x53,0x80,0x7C,0x80,0x63,0x00,0x46,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x9676, {0x02,0x00,0x72,0x00,0x53,0xE0,0x6E,0x20,0x7B,0xA0,0x55,0x20,0x5F,0xE0,0x51,0x20,0x75,0x60,0x67,0xE0,0x44,0x60,0x40,0x40,0x00,0x00,}}, +{ 0x9677, {0x02,0x00,0x73,0xC0,0x56,0x40,0x64,0x40,0x68,0xC0,0x51,0x00,0x56,0xC0,0x54,0x40,0x76,0xC0,0x64,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x9678, {0x01,0x00,0x71,0x00,0x57,0xC0,0x5F,0xE0,0x62,0x80,0x64,0xA0,0x59,0xE0,0x51,0x00,0x77,0xC0,0x61,0x00,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x967A, {0x01,0x00,0x71,0x00,0x52,0x80,0x67,0xC0,0x69,0x20,0x67,0xC0,0x55,0x40,0x55,0x40,0x77,0xC0,0x63,0x00,0x44,0x80,0x58,0x60,0x00,0x00,}}, +{ 0x967D, {0x00,0x00,0x77,0x80,0x54,0x80,0x57,0x80,0x67,0x80,0x60,0x00,0x5F,0xE0,0x54,0x00,0x77,0xC0,0x7B,0xC0,0x47,0x40,0x4B,0x80,0x00,0x00,}}, +{ 0x9685, {0x00,0x00,0x77,0xC0,0x55,0x40,0x67,0xC0,0x65,0x40,0x57,0xC0,0x51,0x00,0x5F,0xE0,0x59,0x60,0x6F,0xE0,0x48,0x20,0x48,0x60,0x00,0x00,}}, +{ 0x9686, {0x01,0x00,0x73,0x00,0x56,0xC0,0x69,0x00,0x62,0x80,0x6D,0x60,0x55,0x00,0x57,0xC0,0x79,0x00,0x67,0xC0,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x9688, {0x00,0x00,0x77,0xC0,0x55,0x40,0x67,0xC0,0x67,0xC0,0x50,0x00,0x5F,0xE0,0x55,0x40,0x75,0x80,0x65,0x80,0x46,0x40,0x58,0x20,0x00,0x00,}}, +{ 0x968A, {0x04,0x80,0x72,0x80,0x5F,0xE0,0x67,0x20,0x63,0x40,0x6D,0xC0,0x52,0x80,0x5D,0x80,0x72,0xC0,0x6C,0xA0,0x41,0x80,0x43,0x00,0x00,0x00,}}, +{ 0x968B, {0x02,0x00,0x7F,0xE0,0x53,0xC0,0x67,0xC0,0x6B,0xE0,0x60,0x00,0x57,0xC0,0x54,0x40,0x77,0xC0,0x67,0xC0,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x968D, {0x01,0x00,0x72,0x00,0x57,0xC0,0x67,0xC0,0x64,0x40,0x57,0xC0,0x50,0x00,0x5F,0xE0,0x77,0xC0,0x67,0xC0,0x5F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x968E, {0x04,0x80,0x75,0xA0,0x56,0xC0,0x64,0xA0,0x67,0xE0,0x59,0x00,0x57,0xC0,0x54,0x40,0x77,0xC0,0x64,0x40,0x47,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x968F, {0x00,0x80,0x78,0x80,0x57,0xE0,0x61,0xC0,0x63,0x40,0x5D,0xC0,0x55,0x40,0x55,0xC0,0x75,0x40,0x65,0x40,0x4A,0x00,0x51,0xE0,0x00,0x00,}}, +{ 0x9694, {0x00,0x00,0x7F,0xC0,0x57,0x80,0x64,0x80,0x67,0x80,0x60,0x00,0x5F,0xC0,0x5B,0x40,0x7F,0xC0,0x6B,0xC0,0x49,0x40,0x49,0xC0,0x00,0x00,}}, +{ 0x9695, {0x00,0x00,0x77,0xC0,0x57,0xC0,0x67,0xC0,0x67,0xC0,0x54,0x40,0x57,0xC0,0x54,0x40,0x77,0xC0,0x67,0xC0,0x46,0xC0,0x58,0x20,0x00,0x00,}}, +{ 0x9697, {0x01,0x00,0x72,0x00,0x57,0xC0,0x65,0x40,0x67,0xC0,0x55,0x40,0x57,0xC0,0x53,0x80,0x73,0xC0,0x67,0xE0,0x49,0x20,0x51,0xE0,0x00,0x00,}}, +{ 0x9698, {0x03,0x80,0x72,0xC0,0x5F,0xE0,0x63,0x80,0x63,0x80,0x52,0x80,0x54,0x40,0x5F,0xE0,0x75,0xC0,0x65,0xC0,0x4F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x9699, {0x01,0x00,0x75,0xC0,0x5D,0x40,0x67,0xC0,0x64,0x80,0x57,0x80,0x54,0x80,0x57,0x80,0x75,0x40,0x69,0x20,0x51,0x20,0x43,0x00,0x00,0x00,}}, +{ 0x969B, {0x04,0x00,0x77,0xC0,0x5F,0x40,0x6B,0xC0,0x76,0x80,0x57,0xC0,0x58,0x20,0x5F,0xC0,0x61,0x00,0x45,0x40,0x49,0x40,0x43,0x00,0x00,0x00,}}, +{ 0x969C, {0x01,0x00,0x7F,0xC0,0x52,0x80,0x6F,0xE0,0x67,0xC0,0x64,0x40,0x57,0xC0,0x54,0x40,0x57,0xC0,0x61,0x00,0x4F,0xE0,0x41,0x00,0x00,0x00,}}, +{ 0x96A0, {0x00,0xC0,0x7F,0x20,0x59,0x20,0x67,0xC0,0x60,0x40,0x57,0xC0,0x50,0x40,0x57,0xC0,0x7A,0x00,0x6D,0xA0,0x54,0xA0,0x43,0x80,0x00,0x00,}}, +{ 0x96A3, {0x01,0x00,0x79,0x40,0x57,0x80,0x6F,0xE0,0x67,0x80,0x59,0x60,0x55,0x40,0x57,0xE0,0x6B,0x40,0x57,0xE0,0x44,0x40,0x58,0x40,0x00,0x00,}}, +{ 0x96A7, {0x11,0x80,0x6B,0xC0,0x6F,0xE0,0x77,0xE0,0x69,0xA0,0x6F,0xA0,0x61,0xC0,0x7F,0xC0,0x6E,0xA0,0x6C,0x80,0x55,0x80,0x63,0xE0,0x00,0x00,}}, +{ 0x96A8, {0x09,0x80,0x65,0x80,0x77,0xE0,0x7B,0xC0,0x6F,0xE0,0x61,0xC0,0x7D,0x40,0x55,0xC0,0x55,0xC0,0x75,0x40,0x4A,0x00,0x51,0xE0,0x00,0x00,}}, +{ 0x96AA, {0x01,0x00,0x63,0x00,0x66,0x80,0x6F,0xC0,0x70,0x20,0x6E,0xC0,0x6B,0xC0,0x6B,0xC0,0x6E,0xC0,0x66,0xC0,0x4B,0xA0,0x51,0x20,0x00,0x00,}}, +{ 0x96B0, {0x00,0x00,0x77,0xC0,0x57,0xC0,0x67,0xC0,0x67,0xC0,0x52,0x40,0x5D,0xA0,0x52,0x40,0x7F,0xE0,0x67,0xE0,0x4A,0x40,0x51,0xA0,0x00,0x00,}}, +{ 0x96B1, {0x00,0xC0,0x77,0xC0,0x5F,0xA0,0x67,0x80,0x67,0x80,0x57,0xC0,0x50,0x40,0x5F,0xE0,0x77,0xC0,0x6B,0x20,0x4A,0xA0,0x51,0x80,0x00,0x00,}}, +{ 0x96B2, {0x01,0x80,0x73,0xC0,0x5D,0xE0,0x67,0x80,0x67,0xE0,0x55,0x80,0x57,0xC0,0x57,0xC0,0x77,0xE0,0x6F,0xE0,0x4B,0xE0,0x50,0xC0,0x00,0x00,}}, +{ 0x96B4, {0x05,0x80,0x75,0x80,0x7F,0xE0,0x7F,0xC0,0x60,0x40,0x6E,0xC0,0x6B,0x80,0x6F,0xC0,0x6F,0xC0,0x4F,0xC0,0x4B,0xA0,0x4A,0xE0,0x00,0x00,}}, +{ 0x96B6, {0x04,0x00,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x04,0xC0,0x3F,0x80,0x24,0x80,0x26,0x80,0x3F,0x00,0xF5,0x80,0x04,0x60,0x0C,0x00,0x00,0x00,}}, +{ 0x96B7, {0x20,0x80,0x20,0x80,0xFB,0xC0,0x77,0xE0,0x00,0xC0,0x7B,0xC0,0x04,0x80,0xFA,0xA0,0x33,0xC0,0x7E,0xC0,0xA8,0xA0,0x20,0x80,0x00,0x00,}}, +{ 0x96B8, {0x21,0x80,0x31,0x80,0xFB,0xC0,0x7F,0xE0,0x69,0xC0,0xA3,0xC0,0x79,0xC0,0x03,0xA0,0xF9,0xC0,0x7F,0xC0,0xA9,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x96B9, {0x11,0x80,0x11,0x00,0x1F,0xE0,0x3F,0xE0,0x21,0x00,0x7F,0xC0,0xA1,0x00,0x33,0x00,0x3F,0xC0,0x21,0x00,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x96BB, {0x21,0x00,0x3F,0xC0,0x62,0x00,0x7F,0x80,0xBF,0x80,0x22,0x00,0x3F,0xE0,0x00,0x00,0x7F,0x80,0x09,0x00,0x0F,0x00,0xF0,0xE0,0x00,0x00,}}, +{ 0x96BC, {0x21,0x00,0x22,0x00,0x3F,0xC0,0x7F,0x80,0xA2,0x00,0x3F,0x80,0x22,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x96C0, {0x04,0x00,0x15,0x80,0x24,0x60,0xC7,0x00,0x0C,0x00,0x3F,0xC0,0xE2,0x00,0x3F,0x80,0x22,0x00,0x3F,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x96C1, {0x00,0x00,0x7F,0xE0,0x49,0x40,0x52,0x80,0x73,0xE0,0x76,0x80,0x5B,0xC0,0x52,0x80,0x53,0xC0,0x52,0x80,0x93,0xE0,0x12,0x00,0x00,0x00,}}, +{ 0x96C4, {0x21,0x40,0x21,0x40,0x22,0x80,0xFF,0xE0,0x26,0x80,0x23,0xC0,0x32,0x80,0x52,0x80,0x6B,0xC0,0xBA,0x80,0xE7,0xE0,0x02,0x00,0x00,0x00,}}, +{ 0x96C5, {0x01,0x40,0x7B,0x40,0x52,0x80,0x57,0xE0,0xFA,0x80,0x33,0xE0,0x32,0x80,0x72,0x80,0x53,0xE0,0x92,0x80,0x13,0xE0,0x32,0x00,0x00,0x00,}}, +{ 0x96C6, {0x22,0x00,0x3F,0xC0,0x62,0x00,0x7F,0x80,0xBF,0x80,0x22,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x96C7, {0x00,0x00,0x7F,0xE0,0x3F,0xC0,0x20,0x40,0x3F,0xC0,0x29,0x80,0x3F,0xE0,0x73,0x00,0x5F,0x80,0x5F,0x80,0x9F,0xE0,0x10,0x00,0x00,0x00,}}, +{ 0x96C9, {0x61,0x40,0x61,0x40,0x7B,0xE0,0x7B,0xE0,0xA6,0x80,0xFF,0xC0,0x22,0x80,0x32,0xC0,0x7B,0xC0,0x4A,0x80,0x83,0xE0,0x02,0x00,0x00,0x00,}}, +{ 0x96CB, {0x11,0x00,0x13,0x00,0x3F,0xE0,0x3F,0x80,0x73,0x00,0xBF,0x80,0x21,0x00,0x3F,0xE0,0x79,0xC0,0x6F,0x40,0x6B,0x40,0x60,0xC0,0x00,0x00,}}, +{ 0x96CC, {0x29,0x40,0x29,0x40,0x2A,0x80,0x2B,0xE0,0x7E,0x80,0x6B,0xC0,0x6A,0x80,0x6A,0x80,0x6B,0xC0,0x7E,0x80,0xC3,0xE0,0x02,0x00,0x00,0x00,}}, +{ 0x96CD, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x72,0x80,0xD7,0xE0,0x65,0x80,0x6F,0xC0,0x75,0x80,0xF7,0xC0,0x95,0x80,0x27,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x96CE, {0x01,0x40,0x71,0x40,0x53,0xE0,0x73,0xE0,0x56,0x80,0x5B,0xC0,0x72,0x80,0x52,0xC0,0x5B,0xC0,0x7A,0x80,0xC3,0xE0,0x02,0x00,0x00,0x00,}}, +{ 0x96D1, {0x21,0x40,0x31,0x40,0xF2,0x80,0x57,0xE0,0x4A,0x80,0xA3,0xC0,0x22,0x80,0xFE,0x80,0x73,0xC0,0x6A,0x80,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x96D5, {0x01,0x40,0x7D,0x40,0x55,0xE0,0x7F,0xE0,0x57,0x80,0x7D,0xC0,0x55,0x80,0x7D,0xC0,0x7D,0xC0,0x7D,0x80,0x45,0xE0,0x8D,0x00,0x00,0x00,}}, +{ 0x96D6, {0x01,0x40,0x79,0x40,0x7B,0xE0,0x7B,0xE0,0x7E,0x80,0x6B,0xC0,0x6A,0x80,0x7A,0xC0,0x23,0xC0,0x3E,0x80,0xE7,0xE0,0x02,0x00,0x00,0x00,}}, +{ 0x96D9, {0x69,0x40,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x7B,0xC0,0x52,0x80,0x7F,0xE0,0x42,0x00,0x3F,0x80,0x07,0x00,0x1B,0x00,0x60,0xE0,0x00,0x00,}}, +{ 0x96DB, {0x20,0xA0,0x20,0xA0,0x7D,0xF0,0xD7,0x40,0x7F,0x40,0x75,0xE0,0x29,0x40,0x7D,0x40,0xD5,0xE0,0x7D,0x40,0x75,0xF0,0x29,0x00,0x00,0x00,}}, +{ 0x96DC, {0x21,0x40,0x31,0x40,0xFF,0xE0,0x6B,0xE0,0x76,0x80,0xA7,0xC0,0x22,0x80,0xFE,0xC0,0x7B,0xC0,0x6A,0x80,0xA3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x96E2, {0x21,0x40,0x21,0x40,0xFE,0x80,0x5B,0xE0,0x7E,0x80,0x7B,0xC0,0x22,0x80,0xFB,0xC0,0xBA,0x80,0xFA,0x80,0x8B,0xE0,0x9A,0x00,0x00,0x00,}}, +{ 0x96E3, {0x51,0x40,0x51,0x40,0xFE,0x80,0x7B,0xE0,0x6E,0x80,0x7B,0xC0,0x22,0x80,0x7A,0x80,0x23,0xC0,0xFA,0x80,0x4B,0xE0,0x82,0x00,0x00,0x00,}}, +{ 0x96E8, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x44,0x40,0x55,0x40,0x55,0x40,0x44,0x40,0x55,0x40,0x55,0x40,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x96EA, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xBD,0xC0,0x35,0x80,0x04,0x00,0x3F,0x80,0x00,0x80,0x3F,0x80,0x00,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x96EB, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x00,0x00,0xFF,0xE0,0x06,0x00,0x05,0x80,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x96F0, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x1F,0x00,0x11,0x00,0x7F,0xC0,0x89,0x20,0x11,0x00,0x23,0x00,0x00,0x00,}}, +{ 0x96F2, {0x00,0x00,0x3F,0x80,0x04,0x00,0x7F,0xE0,0x75,0xC0,0xBD,0xC0,0x00,0x00,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x13,0x80,0x7C,0x40,0x00,0x00,}}, +{ 0x96F6, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x0A,0x00,0x3F,0x80,0xDF,0x60,0x3F,0x80,0x05,0x80,0x04,0x00,0x00,0x00,}}, +{ 0x96F7, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x96F9, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x08,0x00,0x1F,0x80,0x70,0x80,0xBE,0x80,0x3F,0xA0,0x30,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x96FB, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0xA0,0x24,0x20,0x03,0xE0,0x00,0x00,}}, +{ 0x9700, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0xFF,0xE0,0x08,0x00,0x7F,0xC0,0x52,0x40,0x52,0x40,0x52,0xC0,0x00,0x00,}}, +{ 0x9704, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x15,0x80,0x64,0xC0,0xFF,0xA0,0x3F,0x80,0x3F,0x80,0x31,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x9706, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x00,0xC0,0x77,0x80,0x31,0x80,0x7F,0xE0,0x3B,0xC0,0x38,0x00,0xC7,0xE0,0x00,0x00,}}, +{ 0x9707, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x00,0x00,0x7F,0xC0,0x7F,0xE0,0x7F,0xE0,0x5F,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x9708, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x21,0x00,0xBF,0xE0,0x07,0xC0,0x2F,0xC0,0x49,0xC0,0x41,0x00,0x00,0x00,}}, +{ 0x970A, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x3F,0x00,0x00,0x00,0x7F,0xC0,0x2A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x970D, {0x00,0x00,0x7F,0xC0,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x15,0x00,0x3F,0xC0,0x72,0x00,0xBF,0x80,0x3F,0x80,0x3F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x970E, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x04,0x00,0x7F,0xC0,0x13,0x00,0xFF,0xE0,0x7F,0xC0,0x0F,0x00,0x71,0x80,0x00,0x00,}}, +{ 0x970F, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x0A,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0xF3,0xE0,0x22,0x00,0x00,0x00,}}, +{ 0x9711, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x21,0x00,0xA1,0xE0,0x07,0xC0,0x2F,0xC0,0x4F,0xC0,0x48,0x40,0x00,0x00,}}, +{ 0x9713, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x0C,0x00,0x73,0x80,0x7B,0x80,0x7F,0x80,0x3F,0xA0,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x9716, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x75,0x80,0x21,0x80,0xFF,0xE0,0x79,0x80,0x6B,0xC0,0xA5,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x9719, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x11,0x00,0xFF,0xE0,0x17,0x00,0x3F,0x80,0xFF,0xE0,0x1B,0x00,0x61,0xC0,0x00,0x00,}}, +{ 0x971C, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x7F,0xE0,0xF5,0xC0,0x00,0x00,0x23,0xC0,0xFE,0x40,0x7B,0xC0,0x67,0xC0,0xA3,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x971E, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x04,0x00,0x7B,0xC0,0x48,0x40,0x7F,0xC0,0x77,0xC0,0x71,0x80,0x46,0x60,0x00,0x00,}}, +{ 0x9724, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x7B,0xC0,0x69,0x40,0x76,0xC0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x9727, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x05,0x00,0x79,0xE0,0x73,0x80,0xFF,0xE0,0x7F,0xE0,0xB3,0x40,0x26,0xC0,0x00,0x00,}}, +{ 0x972A, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x60,0xC0,0x2F,0x80,0x9B,0x60,0x1F,0xE0,0x3F,0xE0,0x4F,0xC0,0x40,0x00,0x00,0x00,}}, +{ 0x9730, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x7D,0x00,0x71,0xE0,0xFE,0x80,0x7D,0x80,0x79,0x80,0x6B,0x40,0x7C,0x20,0x00,0x00,}}, +{ 0x9732, {0x00,0x00,0x7F,0xC0,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x04,0x00,0x79,0xC0,0x4F,0x80,0x7E,0xE0,0x3F,0xE0,0x7B,0xC0,0xE2,0x40,0x00,0x00,}}, +{ 0x9738, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xBF,0xC0,0x34,0x00,0xFF,0xC0,0x72,0x40,0x7B,0xC0,0x7B,0xC0,0xFE,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x9739, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x79,0x80,0x6B,0xC0,0x7B,0xC0,0x7F,0xE0,0xFF,0xE0,0x79,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x973D, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x04,0x00,0xFF,0xE0,0x7B,0xC0,0xF5,0xE0,0x9F,0xE0,0x3F,0x80,0x61,0x80,0x00,0x00,}}, +{ 0x973E, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x37,0x80,0xE5,0x80,0xFF,0x80,0xF7,0xC0,0x77,0xC0,0xDF,0xE0,0x60,0x00,0x00,0x00,}}, +{ 0x9742, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x7F,0xE0,0x79,0x80,0x7F,0xE0,0x7F,0xC0,0x57,0xC0,0x52,0x00,0xFF,0xE0,0x00,0x00,}}, +{ 0x9744, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x73,0xC0,0xFE,0x40,0x73,0xC0,0x7B,0xE0,0x7F,0xE0,0x7B,0xE0,0x4A,0xC0,0x00,0x00,}}, +{ 0x9746, {0x00,0x80,0x7C,0xC0,0x7B,0xC0,0x7B,0xE0,0xFC,0xC0,0x7B,0xC0,0x23,0xA0,0x71,0xC0,0xFF,0xE0,0xFA,0xA0,0x7B,0x80,0x8D,0xE0,0x00,0x00,}}, +{ 0x9748, {0x00,0x00,0x3F,0x80,0x7F,0xE0,0x7F,0xE0,0xF5,0xC0,0x6F,0xC0,0x6B,0xC0,0x7F,0xC0,0x7F,0xC0,0x75,0xC0,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x9749, {0x00,0x60,0x7B,0xE0,0x7B,0xC0,0x7F,0xE0,0xFD,0xC0,0x7B,0xC0,0x23,0xA0,0x75,0x20,0xFB,0xC0,0xFF,0xC0,0x79,0x80,0xCE,0x60,0x00,0x00,}}, +{ 0x9752, {0x04,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x20,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x9756, {0x00,0x80,0x27,0xE0,0x20,0x80,0xFB,0xC0,0x17,0xE0,0x50,0x00,0x53,0xC0,0x32,0x40,0x3B,0xC0,0xC3,0xC0,0x02,0x40,0x02,0xC0,0x00,0x00,}}, +{ 0x9759, {0x21,0x00,0xFD,0x00,0x23,0xC0,0x7C,0x80,0xFF,0xC0,0x01,0x40,0x7F,0xE0,0x49,0x40,0x7B,0xC0,0x79,0x00,0x49,0x00,0x59,0x00,0x00,0x00,}}, +{ 0x975C, {0x20,0xC0,0x33,0xC0,0xFF,0xE0,0x7C,0x20,0x33,0xC0,0xFD,0xC0,0x7F,0xE0,0x69,0xC0,0x7B,0xC0,0x79,0x80,0x49,0x80,0x59,0x80,0x00,0x00,}}, +{ 0x975E, {0x09,0x00,0x09,0x00,0x79,0xE0,0x09,0x00,0x09,0x00,0x79,0xE0,0x09,0x00,0x09,0x00,0xF9,0xE0,0x11,0x00,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x9760, {0x24,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x31,0x80,0x3F,0x80,0xFB,0xE0,0x0A,0x00,0x7F,0xC0,0xFF,0xE0,0x32,0x00,0x62,0x00,0x00,0x00,}}, +{ 0x9761, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x6B,0xA0,0x65,0x00,0x7D,0xE0,0x7F,0xC0,0x7F,0xE0,0x89,0x00,0x31,0x00,0x00,0x00,}}, +{ 0x9762, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x51,0x40,0x51,0x40,0x5F,0x40,0x51,0x40,0x5F,0x40,0x51,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x9764, {0x01,0x00,0xFF,0x00,0x21,0xC0,0x7F,0xC0,0x7F,0xC0,0x6D,0xC0,0x7D,0xC0,0x7D,0xC0,0x7D,0x00,0x6D,0x20,0x7D,0x20,0x45,0xE0,0x00,0x00,}}, +{ 0x9766, {0x00,0x00,0xFF,0xC0,0x21,0x40,0x7F,0xC0,0x7B,0x40,0x6B,0xC0,0x7B,0x40,0x7B,0xC0,0x7B,0x80,0x6B,0xA0,0x7F,0xA0,0x42,0x60,0x00,0x00,}}, +{ 0x9768, {0x00,0x00,0x7F,0xE0,0x7C,0xE0,0x7F,0xE0,0x7E,0xC0,0xBE,0xC0,0x27,0x20,0xFF,0xE0,0x7F,0x80,0x6E,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x9769, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x1F,0x00,0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0x976B, {0x70,0x00,0x77,0xC0,0xFB,0x40,0x73,0xC0,0x33,0x40,0x79,0x80,0x69,0x80,0x79,0x80,0xF9,0x80,0xFE,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x976D, {0x28,0x00,0x2B,0xE0,0x7C,0xA0,0x38,0xA0,0x10,0xA0,0x3D,0xA0,0x34,0xE0,0x3C,0xA0,0x11,0x20,0x7D,0x20,0x12,0x20,0x14,0x40,0x00,0x00,}}, +{ 0x9771, {0x70,0x00,0x77,0xC0,0xF9,0x40,0x75,0x40,0x33,0x40,0x79,0x40,0x69,0xC0,0x79,0xC0,0xFF,0x60,0xFE,0x40,0x24,0x40,0x28,0x80,0x00,0x00,}}, +{ 0x9774, {0x51,0x80,0x51,0x80,0xFF,0x80,0x72,0xA0,0x26,0xC0,0x7A,0x80,0x6A,0x80,0x7A,0x80,0x22,0x80,0xFE,0xA0,0x22,0xA0,0x22,0xE0,0x00,0x00,}}, +{ 0x9779, {0x39,0x80,0x38,0x80,0x7F,0xE0,0x3B,0xE0,0x1A,0xA0,0x3E,0xA0,0x37,0x60,0x3F,0x60,0x7E,0x20,0x7E,0x20,0x12,0x20,0x12,0x60,0x00,0x00,}}, +{ 0x977A, {0x71,0x80,0x71,0x80,0xFF,0xE0,0x77,0xE0,0x31,0x80,0x7B,0xC0,0x69,0x80,0x7B,0xC0,0xFF,0xE0,0xF9,0x80,0x21,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x977C, {0x70,0x00,0x73,0xC0,0xFE,0x40,0x72,0x40,0x33,0xC0,0x7A,0x40,0x6A,0x40,0x7A,0x40,0xFF,0xC0,0xFC,0x00,0x2F,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x9781, {0x71,0x80,0x71,0x80,0xFF,0xE0,0x73,0xC0,0x33,0x80,0x7B,0xC0,0x6B,0x40,0x7B,0x40,0xFF,0x80,0xFD,0x80,0x2A,0x40,0x24,0x20,0x00,0x00,}}, +{ 0x9784, {0x52,0x00,0x52,0x00,0xFF,0xC0,0x74,0x40,0x23,0xC0,0x7A,0xC0,0x6B,0xC0,0x7A,0xC0,0x22,0x00,0xFE,0x20,0x22,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x9785, {0x71,0x80,0x71,0x80,0xFF,0xC0,0x73,0xC0,0x33,0xC0,0x7B,0xC0,0x6F,0xE0,0x79,0x80,0xF9,0x80,0xFE,0x80,0x24,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x9786, {0x70,0x00,0x77,0xE0,0xF9,0x00,0x77,0xC0,0x37,0x40,0x7D,0x40,0x6D,0xC0,0x7E,0xC0,0xFE,0x40,0xFC,0x40,0x24,0x40,0x24,0xC0,0x00,0x00,}}, +{ 0x978B, {0x71,0x80,0x71,0x80,0xFF,0xC0,0x71,0x80,0x37,0xE0,0x79,0x80,0x69,0x80,0x7B,0xC0,0xF9,0x80,0xF9,0x80,0x27,0xE0,0x20,0x00,0x00,0x00,}}, +{ 0x978D, {0x50,0x80,0x50,0x80,0xFB,0xE0,0x55,0x40,0x71,0x00,0x7F,0xE0,0x69,0x40,0x7A,0x40,0x23,0x80,0xF8,0xC0,0x21,0x20,0x26,0x20,0x00,0x00,}}, +{ 0x978F, {0x00,0x00,0xFF,0x80,0x26,0x80,0x3D,0xA0,0xE8,0x60,0x11,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x9790, {0x71,0x00,0x71,0x00,0xFD,0xC0,0x71,0x00,0x37,0xE0,0x78,0x00,0x6F,0xE0,0x79,0x80,0xF9,0x80,0xF9,0x00,0x21,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x9798, {0x50,0x80,0x54,0xA0,0xFA,0xA0,0x50,0x80,0x73,0xC0,0xFA,0x40,0xAB,0xC0,0xFA,0x40,0x23,0xC0,0xFE,0x40,0x22,0x40,0x22,0xC0,0x00,0x00,}}, +{ 0x979C, {0x71,0x80,0x71,0xA0,0xFF,0xC0,0x73,0xC0,0x35,0xA0,0x79,0x80,0x6B,0xC0,0x7A,0x40,0xFF,0xC0,0xFE,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x97A0, {0x29,0x00,0x29,0x00,0x7D,0xE0,0x3A,0xA0,0x16,0xE0,0x3D,0xE0,0x37,0xE0,0x3D,0xA0,0x16,0xE0,0x7C,0xA0,0x10,0xA0,0x10,0xC0,0x00,0x00,}}, +{ 0x97A3, {0x70,0x00,0x77,0xC0,0xF9,0x80,0x77,0xE0,0x33,0xC0,0x7B,0x80,0x6D,0x80,0x79,0x80,0xFF,0xE0,0xFF,0xC0,0x25,0xA0,0x21,0x80,0x00,0x00,}}, +{ 0x97A6, {0x61,0x80,0xF2,0x80,0xFE,0x80,0x62,0xA0,0x6F,0xA0,0xF3,0xC0,0xF7,0x80,0xF7,0xC0,0xFB,0xC0,0xFB,0xC0,0x63,0x20,0x62,0x20,0x00,0x00,}}, +{ 0x97A8, {0x70,0x00,0x73,0xC0,0xFB,0xC0,0x73,0xC0,0x33,0xC0,0x79,0x00,0x6B,0xE0,0x7F,0xA0,0xFB,0xE0,0xFB,0xE0,0x22,0x20,0x20,0xC0,0x00,0x00,}}, +{ 0x97AB, {0x39,0x00,0x7F,0x00,0x3B,0xE0,0x1F,0xA0,0x3F,0xE0,0x34,0x20,0x35,0xE0,0x3D,0xA0,0x7F,0xA0,0x7F,0xE0,0x11,0xE0,0x10,0xC0,0x00,0x00,}}, +{ 0x97AD, {0x52,0x00,0xFB,0xE0,0x54,0x80,0x75,0xE0,0x2D,0xE0,0xF5,0xA0,0xB5,0xE0,0xF4,0xA0,0x25,0x80,0xF4,0x80,0x25,0x40,0x26,0x20,0x00,0x00,}}, +{ 0x97B3, {0x71,0x80,0x73,0xC0,0xFF,0xE0,0x71,0x80,0x31,0x80,0x7A,0x40,0x6F,0xE0,0x78,0x00,0xFF,0xC0,0xFE,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x97B4, {0x62,0x80,0xF2,0xC0,0xFF,0xE0,0x67,0xE0,0x64,0x00,0xF7,0xC0,0xF7,0xC0,0xF7,0xC0,0xFF,0xC0,0xFB,0xC0,0x73,0xC0,0x62,0xC0,0x00,0x00,}}, +{ 0x97C3, {0x69,0x80,0xF5,0x80,0xF7,0xC0,0x6B,0xE0,0x67,0xC0,0xF7,0xE0,0xF1,0x80,0xFF,0xC0,0xF7,0xE0,0xF7,0xE0,0x6B,0x80,0x71,0xE0,0x00,0x00,}}, +{ 0x97C6, {0x68,0x00,0xF7,0xE0,0xF7,0xE0,0x6B,0xE0,0x67,0xE0,0xF5,0x80,0xF3,0xE0,0xFF,0xC0,0xF7,0xA0,0xF5,0xC0,0x6B,0xC0,0x71,0xE0,0x00,0x00,}}, +{ 0x97C8, {0x63,0x80,0xFF,0xE0,0xFF,0xC0,0x6F,0xC0,0x6F,0xC0,0xF1,0x40,0xFF,0xE0,0xF9,0x40,0xFD,0xC0,0xFA,0xA0,0x70,0xE0,0x71,0x20,0x00,0x00,}}, +{ 0x97CB, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x00,0x21,0x80,0x3F,0x00,0x03,0x00,0x3F,0xC0,0xFF,0xE0,0x03,0x00,0x01,0x00,0x00,0x00,}}, +{ 0x97D3, {0x21,0x00,0x23,0xC0,0xF9,0x40,0x7F,0xE0,0x4B,0xC0,0x7A,0x40,0x4B,0xC0,0x78,0x80,0x23,0xC0,0xFF,0xE0,0x20,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x97DC, {0x20,0xC0,0x7B,0xC0,0xFF,0xE0,0xFC,0x20,0x78,0x00,0x4B,0xC0,0x7A,0x40,0x12,0x40,0x7A,0x40,0xFE,0x40,0x13,0xC0,0x12,0x40,0x00,0x00,}}, +{ 0x97ED, {0x09,0x00,0x09,0x00,0x79,0xC0,0x79,0xC0,0x09,0x00,0x79,0xC0,0x09,0x00,0x09,0x00,0x79,0xC0,0x09,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x97EE, {0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x71,0xC0,0x11,0x00,0x71,0xC0,0x11,0x00,0x71,0xC0,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x97F2, {0x04,0x00,0xFF,0xE0,0x7F,0xC0,0x75,0x80,0x77,0xC0,0x8A,0x20,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x3B,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x97F3, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x97F5, {0x11,0x00,0x19,0x00,0x7D,0xE0,0x2B,0xE0,0x3A,0x20,0x7D,0xA0,0x00,0x20,0x3C,0xA0,0x3D,0x20,0x3C,0x20,0x3C,0x20,0x24,0x40,0x00,0x00,}}, +{ 0x97F6, {0x10,0x00,0x1B,0xE0,0x7C,0xA0,0x28,0xA0,0x39,0x20,0x7E,0x40,0x00,0x00,0x3D,0xE0,0x3D,0x20,0x3D,0x20,0x3D,0xE0,0x25,0x20,0x00,0x00,}}, +{ 0x97FB, {0x20,0x00,0x23,0xC0,0xFE,0x40,0x53,0xC0,0xFF,0xC0,0x02,0x40,0x73,0xC0,0x52,0x40,0x73,0xC0,0x53,0xC0,0x73,0x40,0x5C,0x20,0x00,0x00,}}, +{ 0x97FF, {0x2E,0xC0,0xEA,0xC0,0x7E,0xA0,0xFA,0xE0,0x2E,0x80,0xFF,0xC0,0x11,0x00,0xFF,0xE0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x9801, {0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x9802, {0x00,0x00,0x0F,0xE0,0xF2,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x68,0x20,0x00,0x00,}}, +{ 0x9803, {0x00,0x00,0x5F,0xE0,0x42,0x00,0x5F,0xC0,0x74,0x40,0x47,0xC0,0x44,0x40,0x57,0xC0,0x54,0x40,0x37,0xC0,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x9805, {0x00,0x00,0x1F,0xE0,0xF2,0x00,0x27,0xC0,0x24,0x40,0x27,0xC0,0x24,0x40,0x37,0xC0,0xC4,0x40,0x07,0xC0,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x9806, {0x00,0x00,0x4F,0xE0,0x69,0x00,0x6B,0xC0,0x6A,0x40,0x6B,0xC0,0x6A,0x40,0x6B,0xC0,0x6A,0x40,0x4B,0xC0,0x4B,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9808, {0x20,0x00,0x5F,0xE0,0x82,0x00,0x27,0xC0,0x24,0x40,0x57,0xC0,0x94,0x40,0x27,0xC0,0x24,0x40,0x47,0xC0,0x8C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0x980C, {0x00,0x00,0x37,0xE0,0x11,0x00,0x6B,0xC0,0x4A,0x40,0xA7,0xC0,0x22,0x40,0x33,0xC0,0x7B,0xC0,0xFB,0xC0,0x02,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x980F, {0x20,0x00,0x27,0xE0,0xF9,0x00,0xFF,0xC0,0x32,0x40,0x73,0xC0,0x72,0x40,0x73,0xC0,0x77,0xC0,0x4F,0xC0,0x42,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9810, {0x00,0x00,0x7F,0xE0,0x19,0x00,0x33,0xC0,0xFE,0x40,0x27,0xC0,0x2A,0x40,0x33,0xC0,0x22,0x40,0x23,0xC0,0x22,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x9811, {0x00,0x00,0x07,0xE0,0x79,0x00,0x03,0xC0,0xFE,0x40,0x53,0xC0,0x52,0x40,0x53,0xC0,0x5E,0x40,0x43,0xC0,0x86,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x9812, {0x30,0x00,0x17,0xE0,0x31,0x00,0x2B,0xC0,0x4A,0x40,0x7F,0xC0,0xAA,0x40,0x2B,0xC0,0x2A,0x40,0x4B,0xC0,0x56,0x40,0x88,0x20,0x00,0x00,}}, +{ 0x9813, {0x20,0x00,0x27,0xE0,0x3D,0x00,0xE3,0xC0,0x6A,0x40,0x6B,0xC0,0x6A,0x40,0x6B,0xC0,0x7A,0x40,0x2B,0xC0,0x22,0x40,0x1C,0x20,0x00,0x00,}}, +{ 0x9817, {0x10,0x00,0x17,0xE0,0x7D,0x00,0x5B,0xC0,0x52,0x40,0x7B,0xC0,0x4A,0x40,0x6B,0xC0,0x52,0x40,0x5B,0xC0,0x6A,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9818, {0x20,0x00,0x27,0xE0,0x51,0x00,0x8B,0xC0,0xF2,0x40,0x03,0xC0,0xFA,0x40,0x2B,0xC0,0x2A,0x40,0x3B,0xC0,0x22,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x981A, {0x00,0x00,0xFF,0xE0,0x49,0x00,0x73,0xC0,0x3A,0x40,0x67,0xC0,0xA2,0x40,0x7B,0xC0,0x22,0x40,0x3B,0xC0,0xE2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x9821, {0x20,0x00,0x27,0xE0,0xF9,0x00,0xFF,0xC0,0x22,0x40,0x7B,0xC0,0x02,0x40,0x7B,0xC0,0x4B,0xC0,0x4B,0xC0,0x7A,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x9824, {0x00,0x00,0x7F,0xE0,0x51,0x00,0x5B,0xC0,0x7A,0x40,0x6B,0xC0,0x6A,0x40,0x7B,0xC0,0x53,0xC0,0x53,0xC0,0x7A,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x982C, {0x20,0x00,0x27,0xE0,0xF9,0x00,0xAF,0xC0,0xAA,0x40,0x73,0xC0,0x62,0x40,0xFF,0xC0,0x32,0x40,0x6B,0xC0,0x62,0x40,0xAC,0x20,0x00,0x00,}}, +{ 0x982D, {0x00,0x00,0xFF,0xE0,0x01,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x2B,0xC0,0x32,0x40,0x3B,0xC0,0xC6,0x40,0x18,0x20,0x00,0x00,}}, +{ 0x9834, {0x40,0x00,0x57,0xE0,0x61,0x00,0x7B,0xC0,0x02,0x40,0x7B,0xC0,0x02,0x40,0xFF,0xC0,0x3A,0x40,0x6B,0xC0,0xA2,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x9837, {0x20,0x00,0x37,0xE0,0x79,0x00,0x7B,0xC0,0x82,0x40,0x7B,0xC0,0x12,0x40,0x33,0xC0,0x7B,0xC0,0x4B,0xC0,0x7A,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x9838, {0x00,0x00,0xFF,0xE0,0x69,0x00,0xFB,0xC0,0xFA,0x40,0x6B,0xC0,0x02,0x40,0xFB,0xC0,0x23,0xC0,0x3B,0xC0,0xE2,0x40,0x0C,0x20,0x00,0x00,}}, +{ 0x983B, {0x20,0x00,0x27,0xE0,0x79,0x00,0x63,0xC0,0xFE,0x40,0x33,0xC0,0x2A,0x40,0x67,0xC0,0xAE,0x40,0x33,0xC0,0x22,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x983C, {0x20,0x00,0x27,0xE0,0xFD,0x00,0x23,0xC0,0x7A,0x40,0x6B,0xC0,0x7A,0x40,0x33,0xC0,0x6A,0x40,0xA3,0xC0,0x22,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x983D, {0x08,0x00,0x77,0xE0,0xF9,0x00,0xFF,0xC0,0x7A,0x40,0xAB,0xC0,0x72,0x40,0x73,0xC0,0x77,0xC0,0x7F,0xC0,0x52,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9846, {0x00,0x00,0x7F,0xE0,0x79,0x00,0x7B,0xC0,0x7A,0x40,0x23,0xC0,0xFE,0x40,0x73,0xC0,0x6B,0xC0,0xA3,0xC0,0x22,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x984B, {0x00,0x00,0x7F,0xE0,0x69,0x00,0x7B,0xC0,0x7A,0x40,0x7B,0xC0,0x22,0x40,0x1B,0xC0,0x77,0xC0,0xF7,0xC0,0xF2,0x40,0x3C,0x20,0x00,0x00,}}, +{ 0x984C, {0x00,0x00,0x7F,0xE0,0x4B,0xC0,0x7A,0x40,0x7B,0xC0,0x02,0x40,0xFF,0xC0,0x22,0x40,0x7B,0xC0,0x62,0x80,0x74,0x40,0x8F,0xE0,0x00,0x00,}}, +{ 0x984D, {0x20,0x00,0x27,0xE0,0xFD,0x00,0xBF,0xC0,0x2A,0x40,0x73,0xC0,0x32,0x40,0x6B,0xC0,0xFF,0xC0,0x4B,0xC0,0x7A,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x984E, {0x00,0x00,0xFF,0xE0,0xB5,0x00,0xFF,0xC0,0x02,0x40,0x7B,0xC0,0x02,0x40,0xFF,0xC0,0x42,0x40,0x7B,0xC0,0x0A,0x40,0x3C,0x20,0x00,0x00,}}, +{ 0x984F, {0x20,0x00,0x37,0xE0,0xFD,0x00,0x33,0xC0,0x2A,0x40,0x7F,0xC0,0x52,0x40,0x7B,0xC0,0x77,0xC0,0x6F,0xC0,0xB2,0x40,0x6C,0x20,0x00,0x00,}}, +{ 0x9854, {0x20,0x00,0x27,0xE0,0xF9,0x00,0x53,0xC0,0x7E,0x40,0x53,0xC0,0x6A,0x40,0x53,0xC0,0x66,0x40,0x4B,0xC0,0xB2,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x9855, {0x00,0x00,0x7F,0xE0,0x49,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x36,0x40,0xB7,0xC0,0x7A,0x40,0x73,0xC0,0x32,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x9858, {0x00,0x00,0x7F,0xE0,0x48,0x80,0x7D,0xC0,0x65,0x40,0x7D,0xC0,0x65,0x40,0x7D,0xC0,0x59,0x40,0x75,0xC0,0x91,0x40,0x36,0x20,0x00,0x00,}}, +{ 0x985B, {0x20,0x00,0x27,0xE0,0xFD,0x00,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7A,0x40,0x4B,0xC0,0x7A,0x40,0xFF,0xC0,0x2A,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x985E, {0x20,0x00,0xAB,0xE0,0x71,0x00,0xFF,0xC0,0x32,0x40,0x6B,0xC0,0x6A,0x40,0xA3,0xC0,0xFE,0x40,0x33,0xC0,0x52,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9867, {0x00,0x00,0xFF,0xE0,0x7C,0x80,0x45,0xC0,0x7D,0x40,0x69,0xC0,0x7F,0x40,0x79,0xC0,0x7D,0x40,0xB9,0xC0,0xBF,0x40,0x22,0x20,0x00,0x00,}}, +{ 0x986B, {0x10,0x00,0xFF,0xE0,0x7C,0x80,0x7D,0xC0,0x7D,0x40,0x7D,0xC0,0x79,0x40,0x69,0xC0,0x79,0xC0,0x79,0xC0,0x39,0x40,0xE6,0x20,0x00,0x00,}}, +{ 0x986F, {0x00,0x00,0x7F,0xE0,0x7C,0x80,0x7D,0xC0,0x7D,0x40,0x69,0xC0,0xF5,0x40,0x75,0xC0,0xFF,0xC0,0xFF,0xC0,0x7B,0x40,0xAA,0x20,0x00,0x00,}}, +{ 0x9870, {0x20,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0xF3,0xC0,0x6B,0xC0,0xFF,0xE0,0x35,0x80,0x3F,0x80,0x1F,0x00,0xFF,0xE0,0x01,0x00,0x00,0x00,}}, +{ 0x9871, {0x10,0x00,0x1F,0xE0,0x7E,0x80,0x7D,0xC0,0x7D,0x40,0x75,0xC0,0x7D,0x40,0x7D,0xC0,0x79,0xC0,0xFD,0xC0,0x7F,0x40,0x62,0x20,0x00,0x00,}}, +{ 0x9873, {0x00,0x00,0x7F,0xE0,0x3C,0x80,0x3D,0xC0,0x7D,0x40,0x05,0xC0,0xFF,0x40,0x6B,0xC0,0x6F,0xC0,0x6F,0xC0,0xFF,0xC0,0x23,0x20,0x00,0x00,}}, +{ 0x9874, {0x70,0x00,0xFF,0xE0,0xF8,0x80,0xFD,0xC0,0xFD,0x40,0x71,0xC0,0x7D,0x40,0xD1,0xC0,0x79,0xC0,0x79,0xC0,0x7D,0x40,0x46,0x20,0x00,0x00,}}, +{ 0x98A8, {0x00,0x00,0x7F,0x80,0x46,0x80,0x78,0x80,0x7E,0x80,0x6A,0x80,0x6A,0x80,0x7E,0x80,0x6A,0x80,0x4F,0xA0,0x71,0x60,0x80,0x20,0x00,0x00,}}, +{ 0x98AA, {0x00,0x00,0xFF,0xE0,0x07,0x00,0x04,0x00,0x3F,0x80,0x63,0x80,0x7C,0x80,0x7F,0x80,0x7F,0x80,0x6F,0xE0,0x7E,0xE0,0x80,0x20,0x00,0x00,}}, +{ 0x98AF, {0x60,0x00,0x6F,0x80,0x6F,0x80,0xFE,0x80,0x3F,0x80,0xAF,0x80,0x6F,0x80,0x6F,0x80,0x7B,0x80,0xF3,0xE0,0x3C,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x98B1, {0x01,0x80,0x7F,0x80,0x7F,0xC0,0x7B,0x60,0x7F,0xE0,0x76,0x00,0x77,0xC0,0x7F,0x40,0x7F,0xC0,0x5F,0xE0,0x73,0xA0,0x80,0x60,0x00,0x00,}}, +{ 0x98B6, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x73,0xC0,0x7F,0xC0,0x77,0xC0,0x77,0xC0,0x7F,0xE0,0x7F,0xE0,0x5F,0x20,0x73,0xA0,0x80,0x60,0x00,0x00,}}, +{ 0x98C3, {0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x77,0xE0,0x7F,0xE0,0x6D,0xC0,0x6C,0x00,0x7F,0xE0,0x7E,0xE0,0x7E,0xA0,0x67,0xA0,0x80,0xE0,0x00,0x00,}}, +{ 0x98C4, {0x00,0x00,0xFF,0xC0,0xFF,0xC0,0xFF,0x40,0xFF,0xC0,0x07,0xC0,0x77,0xC0,0x07,0xC0,0xFD,0xE0,0x79,0xE0,0xAE,0xA0,0x30,0x20,0x00,0x00,}}, +{ 0x98C6, {0x30,0x00,0x3F,0xC0,0x7F,0xC0,0x37,0x40,0x6F,0xC0,0x77,0xC0,0x7F,0xC0,0xFF,0xC0,0x5D,0xE0,0x79,0xE0,0xAE,0xA0,0xB0,0x20,0x00,0x00,}}, +{ 0x98DB, {0x00,0x00,0x3F,0x40,0x19,0x80,0x69,0x40,0x29,0x40,0x28,0xC0,0xFF,0x40,0x29,0x80,0x49,0xC0,0x49,0x20,0x88,0xA0,0x08,0x60,0x00,0x00,}}, +{ 0x98DC, {0x18,0x00,0xEF,0xE0,0x7B,0xC0,0xFF,0xE0,0x73,0xE0,0x6B,0xA0,0x67,0xA0,0xFB,0xC0,0x7B,0xE0,0x7B,0xE0,0x7D,0xE0,0x49,0xA0,0x00,0x00,}}, +{ 0x98DF, {0x04,0x00,0x04,0x00,0x0A,0x00,0x35,0x80,0xFF,0x60,0x21,0x00,0x3F,0x00,0x21,0x00,0x3F,0x00,0x26,0x00,0x3B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x98E2, {0x20,0x00,0x33,0x80,0x5A,0x80,0x62,0x80,0xFA,0x80,0x4A,0x80,0x7A,0x80,0x4A,0x80,0x7A,0x80,0x54,0xA0,0x7C,0xA0,0xC8,0x60,0x00,0x00,}}, +{ 0x98E9, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x7F,0x80,0xF3,0xC0,0x53,0xC0,0x73,0xC0,0x53,0xC0,0x73,0xC0,0x71,0xA0,0x79,0xA0,0x40,0xE0,0x00,0x00,}}, +{ 0x98EB, {0x20,0x40,0x30,0x80,0x7B,0x80,0x79,0x80,0xF1,0x80,0x57,0xE0,0x71,0x80,0x51,0x80,0x79,0x80,0x7A,0x80,0x7C,0x40,0x48,0x20,0x00,0x00,}}, +{ 0x98ED, {0x22,0x00,0x32,0x00,0x7B,0xE0,0x7F,0xE0,0xF9,0x00,0x4F,0xC0,0x79,0x40,0x49,0x40,0x79,0x40,0x7A,0x40,0x7A,0x40,0x44,0x80,0x00,0x00,}}, +{ 0x98EE, {0x21,0x00,0x31,0x00,0x79,0x00,0x7B,0xE0,0xFB,0xA0,0x4D,0xC0,0x79,0x80,0x49,0x80,0x79,0x80,0x79,0x80,0x7A,0x40,0x44,0x20,0x00,0x00,}}, +{ 0x98EF, {0x20,0x00,0x33,0xE0,0x6A,0x00,0xA3,0xC0,0xFA,0x40,0x4A,0x40,0x7B,0x40,0x4B,0x40,0x7A,0x80,0x5C,0x80,0x75,0x40,0xCA,0x20,0x00,0x00,}}, +{ 0x98F2, {0x21,0x00,0x31,0x00,0x79,0x00,0x57,0xE0,0xFB,0x20,0x4D,0x40,0x79,0x00,0x49,0x00,0x79,0x80,0x52,0x80,0x7C,0x40,0xC8,0x20,0x00,0x00,}}, +{ 0x98F4, {0x20,0x80,0x30,0x80,0x69,0x00,0xA1,0x40,0xFA,0xE0,0x4F,0x20,0x78,0x00,0x4B,0xC0,0x7A,0x40,0x52,0x40,0x7B,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x98FC, {0x10,0x00,0x1B,0xE0,0x3C,0x20,0x35,0xE0,0x7C,0x20,0x25,0xE0,0x3D,0x60,0x25,0x60,0x3D,0xE0,0x2C,0x20,0x3C,0x20,0x60,0x60,0x00,0x00,}}, +{ 0x98FD, {0x21,0x00,0x31,0x00,0x6B,0xC0,0xA4,0x40,0xFB,0xC0,0x48,0xC0,0x7B,0xC0,0x4A,0x80,0x7A,0x00,0x5A,0x20,0x7A,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x98FE, {0x21,0x00,0x31,0x00,0x7B,0xE0,0x64,0x80,0xF8,0x80,0x4B,0xC0,0x7A,0xC0,0x4A,0xC0,0x7A,0xC0,0x52,0xC0,0x78,0x80,0xC0,0x80,0x00,0x00,}}, +{ 0x9903, {0x21,0x80,0x31,0x80,0x7F,0xE0,0x79,0x40,0xF2,0xE0,0x55,0xA0,0x71,0x80,0x51,0x80,0x79,0x80,0x79,0x80,0x7A,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x9905, {0x24,0x40,0x32,0x40,0x6F,0xE0,0xA2,0x80,0xF2,0x80,0x52,0x80,0x7F,0xE0,0x52,0x80,0x72,0x80,0x54,0x80,0x74,0x80,0xC8,0x80,0x00,0x00,}}, +{ 0x9909, {0x10,0xC0,0x18,0x80,0x3F,0xE0,0x3F,0xE0,0x7B,0xA0,0x2B,0xE0,0x3B,0xE0,0x2B,0xE0,0x3F,0xE0,0x3E,0x20,0x3E,0x20,0x22,0x60,0x00,0x00,}}, +{ 0x990A, {0x11,0x00,0x7F,0xC0,0x04,0x00,0x3F,0x80,0xFF,0xE0,0x15,0x00,0x7F,0x80,0xDF,0x60,0x1F,0x00,0x14,0x80,0x1B,0x00,0x61,0xC0,0x00,0x00,}}, +{ 0x990C, {0x20,0x00,0x37,0xE0,0x69,0x40,0xA1,0xC0,0xF9,0x40,0x49,0x40,0x79,0xC0,0x49,0x40,0x79,0xE0,0x5F,0x40,0x78,0x40,0xC0,0x40,0x00,0x00,}}, +{ 0x9910, {0x23,0xC0,0x3A,0x40,0xFD,0x80,0xFD,0x40,0x6E,0x20,0x35,0x80,0xDF,0xE0,0x1F,0x00,0x1F,0x00,0x12,0x80,0x1F,0x80,0x60,0xC0,0x00,0x00,}}, +{ 0x9912, {0x20,0xC0,0x33,0xC0,0x7B,0xE0,0x7C,0x20,0xF8,0x00,0x49,0x80,0x7F,0xE0,0x49,0x40,0x7B,0xC0,0x7B,0x80,0x79,0xC0,0x4E,0x20,0x00,0x00,}}, +{ 0x9913, {0x21,0x80,0x32,0xC0,0x7E,0xA0,0x62,0x80,0xFF,0xE0,0x52,0x80,0x72,0xC0,0x53,0x80,0x7E,0x80,0x52,0xA0,0x7B,0x60,0xC6,0x20,0x00,0x00,}}, +{ 0x9914, {0x21,0x80,0x33,0x40,0x7F,0xE0,0x7F,0xC0,0xF7,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x7F,0xC0,0x7F,0xC0,0x7D,0x40,0x45,0xC0,0x00,0x00,}}, +{ 0x9918, {0x21,0x80,0x31,0x80,0x79,0x80,0x7A,0x40,0xF7,0xE0,0x51,0x80,0x77,0xE0,0x51,0x80,0x7B,0xC0,0x7D,0xA0,0x79,0xA0,0x41,0x80,0x00,0x00,}}, +{ 0x991D, {0x21,0x80,0x33,0xC0,0x7F,0xE0,0x79,0x80,0xF1,0x80,0x57,0xE0,0x71,0x80,0x51,0xC0,0x79,0x40,0x7A,0x40,0x7C,0x40,0x48,0x80,0x00,0x00,}}, +{ 0x991E, {0x21,0x80,0x31,0x40,0x7F,0xE0,0x7F,0xC0,0xF1,0xA0,0x56,0x60,0x71,0xA0,0x53,0xE0,0x7F,0xC0,0x79,0xA0,0x7E,0x60,0x40,0x20,0x00,0x00,}}, +{ 0x9920, {0x22,0x80,0x32,0x80,0x7F,0xE0,0x7F,0xE0,0xF2,0x80,0x52,0x80,0x73,0x80,0x5E,0xE0,0x7A,0x80,0x7C,0x80,0x7C,0x80,0x48,0x80,0x00,0x00,}}, +{ 0x9921, {0x11,0x00,0x19,0xE0,0x3D,0x20,0x3E,0x20,0x7C,0x60,0x28,0x80,0x3B,0x60,0x2A,0x20,0x3F,0x20,0x3E,0x20,0x3F,0xE0,0x22,0x20,0x00,0x00,}}, +{ 0x9924, {0x21,0x80,0x31,0xA0,0x7B,0xA0,0x7F,0xC0,0xF1,0x80,0x52,0x40,0x75,0xA0,0x53,0xA0,0x7F,0xC0,0x79,0x80,0x7A,0x40,0x44,0x20,0x00,0x00,}}, +{ 0x9928, {0x21,0x00,0x31,0x00,0x5F,0xE0,0x64,0x40,0xFB,0x80,0x4A,0x80,0x7B,0x80,0x4A,0x00,0x7B,0xC0,0x5A,0x40,0x77,0xC0,0xC2,0x40,0x00,0x00,}}, +{ 0x992C, {0x32,0x00,0x32,0xE0,0x3F,0xE0,0x3F,0xE0,0x7A,0xE0,0x37,0xE0,0x35,0xE0,0x35,0xE0,0x3F,0xA0,0x3F,0xA0,0x39,0x20,0x22,0x60,0x00,0x00,}}, +{ 0x992E, {0x01,0x80,0x7F,0xC0,0x3F,0xE0,0xFB,0xC0,0x75,0xC0,0xCA,0x00,0x3F,0x80,0xDF,0xE0,0x1F,0x00,0x1F,0x00,0x1F,0x80,0x71,0xC0,0x00,0x00,}}, +{ 0x993D, {0x21,0x00,0x32,0x00,0x7F,0xC0,0x7F,0xC0,0xF7,0x40,0x57,0xC0,0x77,0x40,0x53,0x80,0x7F,0xC0,0x7D,0xE0,0x79,0x20,0x51,0xE0,0x00,0x00,}}, +{ 0x993E, {0x21,0x00,0x36,0xE0,0x7C,0xA0,0x7E,0xA0,0xF7,0xA0,0x5D,0xE0,0x71,0x00,0x57,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x44,0x40,0x00,0x00,}}, +{ 0x9942, {0x20,0x00,0x37,0xC0,0x7D,0x40,0x7F,0xC0,0xF4,0xC0,0x57,0xC0,0x70,0x00,0x57,0xC0,0x7D,0xC0,0x7D,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x9945, {0x20,0x00,0x33,0xC0,0x7B,0xC0,0x7B,0xC0,0xF3,0xC0,0x57,0xE0,0x75,0xA0,0x57,0xE0,0x7B,0xC0,0x79,0x80,0x7B,0x80,0x4C,0x60,0x00,0x00,}}, +{ 0x9949, {0x21,0x80,0x37,0xE0,0x79,0x80,0x7B,0xC0,0xF3,0xC0,0x53,0xC0,0x71,0x80,0x57,0xE0,0x7B,0xC0,0x7B,0xC0,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x994B, {0x21,0x80,0x33,0xC0,0x7B,0xC0,0x7F,0xE0,0xF3,0xC0,0x52,0x40,0x73,0xC0,0x52,0x40,0x7B,0xC0,0x7B,0xC0,0x7B,0x40,0x4C,0x20,0x00,0x00,}}, +{ 0x994C, {0x20,0x00,0x37,0xC0,0x7F,0xC0,0x7F,0xC0,0xF5,0xA0,0x53,0xE0,0x71,0x80,0x57,0xC0,0x7F,0xE0,0x7F,0xE0,0x7A,0x40,0x44,0x40,0x00,0x00,}}, +{ 0x9950, {0x21,0x80,0x37,0xE0,0x7B,0xC0,0x7F,0xE0,0xF4,0x40,0x5F,0xE0,0x73,0xC0,0x52,0x40,0x7B,0xC0,0x7A,0x40,0x7F,0xE0,0x40,0x00,0x00,0x00,}}, +{ 0x9951, {0x65,0x40,0x67,0x40,0x7F,0xA0,0x77,0x60,0xFB,0xE0,0x6F,0xE0,0x61,0x40,0x6F,0xE0,0x7F,0x40,0x79,0xE0,0x7B,0x60,0x50,0x20,0x00,0x00,}}, +{ 0x9952, {0x21,0x80,0x31,0x80,0x7B,0xC0,0x7F,0xE0,0xF2,0xC0,0x5F,0xE0,0x72,0x80,0x53,0xE0,0x7F,0xE0,0x7F,0xE0,0x72,0xA0,0x4C,0x60,0x00,0x00,}}, +{ 0x9955, {0x79,0xC0,0x6B,0xE0,0xFF,0xC0,0xFF,0xC0,0x4D,0xA0,0x3B,0x60,0x3F,0x80,0xDF,0xE0,0x1F,0x00,0x1F,0x00,0x1B,0x80,0x61,0xC0,0x00,0x00,}}, +{ 0x9957, {0x2E,0xC0,0xEA,0xC0,0x7E,0xA0,0xFA,0xE0,0x2E,0x80,0xEF,0x80,0x15,0x00,0x7F,0xC0,0x9F,0x60,0x1E,0x80,0x1F,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0x9996, {0x21,0x00,0x12,0x00,0xFF,0xE0,0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x9997, {0x22,0x40,0x23,0xC0,0x27,0xE0,0xFB,0xC0,0x3A,0x40,0x2B,0xC0,0x2A,0x40,0x2B,0xC0,0x2B,0xC0,0x6B,0xE0,0x48,0x20,0x87,0xE0,0x00,0x00,}}, +{ 0x9998, {0x51,0x80,0x71,0xC0,0xFF,0xE0,0xFF,0xE0,0x27,0xC0,0x75,0xC0,0x55,0xC0,0x77,0x80,0x75,0x80,0x7F,0xE0,0x73,0x60,0x52,0x20,0x00,0x00,}}, +{ 0x9999, {0x01,0x80,0x3F,0x00,0x04,0x00,0xFF,0xE0,0x15,0x00,0x24,0x80,0xFF,0xE0,0x20,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x20,0x80,0x00,0x00,}}, +{ 0x99A5, {0x1A,0x00,0x62,0x00,0xFF,0xE0,0xFF,0xC0,0x7B,0xC0,0x6A,0x40,0xA3,0xC0,0x7B,0x00,0x7F,0xC0,0x7F,0x80,0x7B,0x80,0x4C,0x60,0x00,0x00,}}, +{ 0x99A8, {0x21,0xC0,0xFF,0x60,0x7B,0xE0,0x6B,0x40,0x79,0x80,0x5F,0x60,0x84,0x00,0xFF,0xE0,0x3F,0x80,0xDF,0x60,0x1F,0x00,0x1F,0x00,0x00,0x00,}}, +{ 0x99AC, {0x00,0x00,0x7F,0xC0,0x44,0x00,0x7F,0x80,0x7F,0x80,0x44,0x00,0x7F,0xE0,0x00,0x20,0x14,0xA0,0x50,0x20,0x40,0x20,0x80,0xC0,0x00,0x00,}}, +{ 0x99AD, {0x00,0x00,0x7F,0xC0,0x7A,0x40,0x7A,0x40,0x7B,0xC0,0x51,0x80,0x7D,0x80,0x15,0x80,0x7D,0x80,0x7D,0x80,0x8A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x99AE, {0x00,0x00,0x0F,0xC0,0x4F,0x80,0x6F,0x80,0x0F,0x80,0x29,0x00,0x2F,0xE0,0x60,0xA0,0x5E,0xA0,0x55,0x20,0x70,0x40,0x00,0x80,0x00,0x00,}}, +{ 0x99B3, {0x00,0x80,0x7E,0x80,0x7A,0xC0,0x7B,0xC0,0x7E,0xC0,0x62,0xC0,0x7A,0xC0,0x3A,0xC0,0x7A,0xC0,0x7A,0x20,0x8A,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x99B4, {0x00,0x20,0x3F,0x20,0x3D,0x60,0x3D,0x60,0x3D,0x60,0x31,0x60,0x3D,0x60,0x1D,0x60,0x3D,0x60,0x3D,0x60,0x4A,0x20,0x14,0x20,0x00,0x00,}}, +{ 0x99BC, {0x01,0x80,0x7D,0x80,0x7F,0xE0,0x7F,0xE0,0x7A,0x40,0x62,0x40,0x79,0x80,0x39,0x80,0x79,0x80,0x79,0x80,0x8A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x99C1, {0x00,0x40,0x7C,0x40,0x7B,0x80,0x79,0xC0,0x79,0x20,0x62,0x40,0x7D,0x40,0x39,0x80,0x79,0x80,0x69,0x80,0x8A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x99C4, {0x00,0x80,0x7C,0x80,0x78,0x80,0x7F,0xE0,0x78,0x80,0x60,0x80,0x79,0x80,0x39,0x80,0x7A,0x40,0x7B,0x40,0x94,0xA0,0x28,0x20,0x00,0x00,}}, +{ 0x99C5, {0x00,0x00,0x7F,0xC0,0x7A,0x40,0x7A,0x40,0x7B,0xC0,0x63,0x40,0x7B,0x00,0x7A,0x80,0xAA,0x80,0xAC,0x40,0x94,0x40,0x28,0x20,0x00,0x00,}}, +{ 0x99C6, {0x00,0x00,0x7F,0xE0,0x7A,0x40,0x7B,0x40,0x7A,0xC0,0x62,0x80,0x7A,0x80,0x3A,0xC0,0x7B,0x40,0x7A,0x00,0x8B,0xE0,0x32,0x00,0x00,0x00,}}, +{ 0x99C8, {0x00,0x40,0x7C,0x80,0x7B,0x00,0x7A,0x00,0x7B,0xE0,0x62,0x80,0x7A,0x80,0x3A,0x80,0x7A,0x80,0x7A,0x80,0x8F,0xE0,0x30,0x00,0x00,0x00,}}, +{ 0x99D0, {0x01,0x00,0x7C,0x80,0x7F,0xE0,0x78,0x80,0x78,0x80,0x60,0x80,0x7B,0xC0,0x38,0x80,0x78,0x80,0x78,0x80,0x8F,0xE0,0x30,0x00,0x00,0x00,}}, +{ 0x99D1, {0x20,0x00,0xFB,0xC0,0x69,0xC0,0x7B,0xC0,0xFF,0xE0,0x12,0x00,0x1F,0x80,0x1F,0x00,0x1F,0xC0,0x1F,0xC0,0x6B,0x40,0x41,0x80,0x00,0x00,}}, +{ 0x99D2, {0x00,0x80,0x3E,0x80,0x3D,0xE0,0x3D,0x20,0x3E,0x20,0x31,0xE0,0x3D,0x60,0x1D,0xE0,0x3D,0x20,0x3C,0x20,0x44,0x20,0x18,0x40,0x00,0x00,}}, +{ 0x99D5, {0x10,0x00,0x7D,0xE0,0x15,0x20,0x2D,0xE0,0x7F,0xE0,0x22,0x00,0x3F,0xC0,0x3F,0x80,0x3F,0xE0,0x1F,0xE0,0x2A,0xA0,0x40,0xC0,0x00,0x00,}}, +{ 0x99D8, {0x01,0x80,0x7D,0x80,0x79,0x80,0x79,0x80,0x79,0x40,0x67,0xA0,0x78,0x20,0x3B,0xC0,0x7A,0x40,0x7A,0x40,0x8B,0xC0,0x32,0x40,0x00,0x00,}}, +{ 0x99DB, {0x01,0x80,0x7D,0x80,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x63,0xC0,0x7B,0xC0,0x3F,0xC0,0x7B,0x00,0x79,0x00,0x8A,0xC0,0x34,0x20,0x00,0x00,}}, +{ 0x99DD, {0x01,0x80,0x7D,0x80,0x7B,0xE0,0x7B,0xE0,0x7F,0x00,0x61,0x00,0x79,0x60,0x39,0x80,0x79,0x00,0x79,0x00,0x89,0x20,0x31,0xE0,0x00,0x00,}}, +{ 0x99DF, {0x00,0x00,0x3F,0xE0,0x3A,0xE0,0x3A,0xE0,0x3A,0xE0,0x32,0xE0,0x3E,0xE0,0x1F,0x60,0x3F,0x20,0x3E,0x20,0x4B,0xE0,0x12,0x20,0x00,0x00,}}, +{ 0x99E2, {0x02,0x40,0x7D,0x40,0x7F,0xE0,0x7F,0xE0,0x79,0x80,0x61,0x80,0x7F,0xE0,0x39,0x80,0x7A,0x80,0x7A,0x80,0x94,0x80,0x28,0x80,0x00,0x00,}}, +{ 0x99ED, {0x01,0x80,0x7D,0x80,0x7F,0xE0,0x79,0x00,0x7E,0x80,0x61,0x80,0x79,0x40,0x3B,0x40,0x7A,0x80,0x78,0xC0,0x93,0x20,0x2C,0x20,0x00,0x00,}}, +{ 0x99EE, {0x01,0x80,0x7D,0x80,0x7F,0xE0,0x79,0x40,0x7A,0xE0,0x65,0xA0,0x79,0x80,0x39,0x80,0x79,0x80,0x79,0x80,0x8A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x99F1, {0x01,0x00,0x7D,0x00,0x7B,0xC0,0x7A,0x40,0x7D,0x80,0x61,0x80,0x7A,0x40,0x3F,0xE0,0x7A,0x40,0x7A,0x40,0x8B,0xC0,0x32,0x40,0x00,0x00,}}, +{ 0x99F2, {0x00,0x20,0x3D,0x20,0x39,0xE0,0x39,0xE0,0x39,0xE0,0x33,0xE0,0x3F,0xE0,0x1D,0xE0,0x3D,0xE0,0x3E,0xE0,0x4A,0xE0,0x14,0x20,0x00,0x00,}}, +{ 0x99F8, {0x00,0x00,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x60,0x00,0x7F,0xE0,0x3C,0x40,0x7B,0xC0,0x79,0x80,0x93,0x80,0x2C,0x60,0x00,0x00,}}, +{ 0x99FB, {0x00,0x00,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x60,0x00,0x7B,0xC0,0x39,0x80,0x7F,0xE0,0x79,0x80,0x89,0x80,0x31,0x80,0x00,0x00,}}, +{ 0x99FF, {0x01,0x00,0x7A,0x40,0x77,0xE0,0x72,0x80,0x72,0xA0,0x62,0x60,0x7D,0xC0,0x3B,0x40,0x7D,0x80,0x79,0x80,0x92,0x40,0x2C,0x20,0x00,0x00,}}, +{ 0x9A01, {0x01,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x60,0x00,0x7F,0xE0,0x39,0x00,0x7B,0xC0,0x78,0x40,0x88,0x40,0x30,0x80,0x00,0x00,}}, +{ 0x9A05, {0x01,0x40,0x7D,0x40,0x7B,0xE0,0x7B,0xE0,0x7E,0x80,0x63,0xC0,0x7A,0x80,0x3A,0xC0,0x7B,0xC0,0x7A,0x80,0x8B,0xE0,0x32,0x00,0x00,0x00,}}, +{ 0x9A0E, {0x00,0x80,0x7C,0x80,0x77,0xE0,0x79,0x80,0x7A,0x40,0x67,0xE0,0x78,0x40,0x3B,0xC0,0x7A,0xC0,0x7B,0xC0,0x88,0x40,0x30,0xC0,0x00,0x00,}}, +{ 0x9A0F, {0x01,0x40,0x7D,0x40,0x7B,0xE0,0x7B,0xE0,0x79,0xC0,0x61,0x40,0x79,0xC0,0x3B,0x40,0x7F,0xE0,0x79,0x40,0x8A,0x20,0x34,0x20,0x00,0x00,}}, +{ 0x9A12, {0x00,0x00,0x7F,0xC0,0x7A,0x40,0x79,0x80,0x7F,0xE0,0x60,0x80,0x7B,0xC0,0x3A,0xC0,0x7B,0xC0,0x78,0xC0,0x88,0xE0,0x37,0x20,0x00,0x00,}}, +{ 0x9A13, {0x00,0x80,0x7C,0x80,0x79,0x40,0x57,0xE0,0x78,0x80,0x53,0xE0,0x7A,0xA0,0x3B,0xE0,0x78,0x80,0x79,0x80,0x8A,0x40,0x34,0x20,0x00,0x00,}}, +{ 0x9A19, {0x00,0x00,0x7F,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x62,0x00,0x7B,0xE0,0x3B,0xE0,0x7F,0xE0,0x7F,0xA0,0x8B,0xA0,0x32,0x60,0x00,0x00,}}, +{ 0x9A28, {0x01,0x20,0x7D,0xA0,0x7A,0xC0,0x7B,0xC0,0x7A,0xC0,0x63,0xC0,0x7A,0xC0,0x3B,0xC0,0x78,0x80,0x7F,0xE0,0x88,0x80,0x30,0x80,0x00,0x00,}}, +{ 0x9A2B, {0x04,0x00,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x0A,0x00,0xFF,0xE0,0x3F,0x80,0x5F,0xC0,0x9E,0x60,0x1F,0x80,0x3A,0x80,0x55,0x80,0x00,0x00,}}, +{ 0x9A30, {0x02,0xA0,0x77,0xE0,0x51,0xC0,0x5F,0xF0,0x7A,0xA0,0x57,0xE0,0x5B,0xD0,0x73,0xC0,0x53,0xF0,0x57,0xF0,0x55,0xF0,0x98,0x60,0x00,0x00,}}, +{ 0x9A37, {0x00,0x00,0x7F,0xC0,0x7F,0xC0,0x7F,0x80,0x7B,0x80,0x6F,0xE0,0x7B,0xC0,0x3B,0xC0,0x7B,0xC0,0x79,0xC0,0x89,0xE0,0x37,0x20,0x00,0x00,}}, +{ 0x9A3E, {0x00,0x00,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x61,0x80,0x7B,0x80,0x39,0xC0,0x7F,0xE0,0x7B,0xA0,0x8D,0xA0,0x31,0x80,0x00,0x00,}}, +{ 0x9A40, {0x11,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x1F,0x00,0x75,0xC0,0x9F,0x60,0x1F,0xC0,0x3A,0x40,0x55,0x80,0x00,0x00,}}, +{ 0x9A42, {0x01,0x00,0x7A,0xC0,0x77,0xC0,0x77,0xC0,0x7F,0xE0,0x61,0x80,0x7A,0x80,0x3D,0x60,0x7B,0x00,0x7B,0x40,0x89,0xC0,0x37,0x00,0x00,0x00,}}, +{ 0x9A43, {0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x60,0x00,0x7B,0xC0,0x38,0x00,0x7F,0xE0,0x7B,0xA0,0x8D,0xA0,0x31,0x80,0x00,0x00,}}, +{ 0x9A45, {0x00,0x00,0x7F,0xE0,0x75,0xC0,0x75,0xC0,0x75,0xC0,0x64,0x00,0x7F,0xE0,0x3F,0xA0,0x7F,0xE0,0x7F,0xE0,0x97,0xE0,0x24,0x00,0x00,0x00,}}, +{ 0x9A4D, {0x01,0x80,0x7F,0xC0,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x62,0x40,0x7B,0xE0,0x3C,0x00,0x7F,0xE0,0x79,0x80,0x8A,0xA0,0x34,0x60,0x00,0x00,}}, +{ 0x9A55, {0x00,0xC0,0x7F,0x80,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x65,0xA0,0x79,0x80,0x3F,0xE0,0x7D,0xA0,0x7D,0xA0,0x94,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x9A57, {0x01,0x80,0x7D,0x80,0x79,0x80,0x7A,0x40,0x7F,0xE0,0x60,0x00,0x7F,0xC0,0x3F,0xC0,0x7F,0xC0,0x7A,0xC0,0x95,0xA0,0x29,0x20,0x00,0x00,}}, +{ 0x9A5A, {0x51,0x00,0xFD,0xE0,0x7B,0x40,0x69,0xC0,0xAB,0x60,0x7F,0x80,0x22,0x00,0x3F,0x80,0x3F,0xC0,0x3F,0xC0,0x55,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x9A5B, {0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x61,0x80,0x7F,0xE0,0x3B,0xC0,0x7F,0xE0,0x7B,0xC0,0x89,0x80,0x31,0x80,0x00,0x00,}}, +{ 0x9A5F, {0x00,0x00,0x7F,0x80,0x77,0xE0,0x77,0x60,0x77,0xE0,0x6F,0xA0,0x79,0x80,0x3B,0xA0,0x7F,0xC0,0x7B,0xC0,0x8D,0xA0,0x31,0x80,0x00,0x00,}}, +{ 0x9A62, {0x01,0x80,0x79,0xC0,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x67,0xC0,0x7F,0xC0,0x3F,0xC0,0x7F,0xC0,0x7F,0xC0,0x9B,0xC0,0x27,0xE0,0x00,0x00,}}, +{ 0x9A64, {0x01,0x80,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x67,0xE0,0x7B,0xC0,0x3B,0xC0,0x7F,0xE0,0x7F,0xC0,0x93,0xC0,0x26,0x20,0x00,0x00,}}, +{ 0x9A65, {0x01,0x80,0x7F,0xE0,0x7B,0xE0,0x7F,0x60,0x7B,0xC0,0x63,0xC0,0x7B,0xC0,0x3B,0xC0,0x7B,0xC0,0x7F,0xE0,0x8B,0x40,0x36,0x20,0x00,0x00,}}, +{ 0x9A69, {0x01,0x80,0x7F,0xE0,0x77,0xE0,0x77,0xE0,0x77,0xE0,0x61,0x80,0x7B,0xE0,0x3E,0xC0,0x7B,0xC0,0x7B,0xC0,0x8B,0xE0,0x32,0x00,0x00,0x00,}}, +{ 0x9A6A, {0x00,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x79,0x80,0x67,0xE0,0x7D,0x80,0x3F,0xC0,0x7F,0xE0,0x7F,0xE0,0x9B,0xE0,0x26,0x60,0x00,0x00,}}, +{ 0x9A6B, {0x00,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x80,0x3A,0x80,0x35,0x80,0x7F,0xE0,0x73,0x80,0x7B,0xC0,0x7F,0xE0,0x77,0xE0,0xFD,0xC0,0x00,0x00,}}, +{ 0x9AA8, {0x00,0x00,0x3F,0x80,0x27,0x80,0x24,0x80,0x7F,0xE0,0x40,0x40,0x9F,0x80,0x10,0x80,0x1F,0x80,0x1F,0x80,0x10,0x80,0x11,0x80,0x00,0x00,}}, +{ 0x9AAD, {0x00,0x00,0x7B,0xC0,0x59,0x80,0x79,0x80,0xFF,0xE0,0x89,0x80,0x79,0x80,0x49,0x80,0x79,0x80,0x79,0x80,0x49,0x80,0x59,0x80,0x00,0x00,}}, +{ 0x9AB0, {0x00,0x00,0x79,0x80,0x59,0x80,0x79,0xA0,0xFA,0x60,0x8C,0x00,0x7F,0xC0,0x49,0x40,0x79,0x80,0x79,0x80,0x4B,0x80,0x5C,0x60,0x00,0x00,}}, +{ 0x9AB8, {0x00,0x80,0x78,0x80,0x7F,0xE0,0x69,0x00,0xFE,0x80,0x8A,0x80,0xF9,0x40,0x4B,0x40,0x7A,0x80,0x79,0x40,0x4A,0x20,0x5C,0x20,0x00,0x00,}}, +{ 0x9ABC, {0x01,0x00,0x79,0x00,0x5B,0xC0,0x7A,0x40,0xFD,0x80,0x89,0x80,0x7A,0x40,0x4F,0xE0,0x7A,0x40,0x7A,0x40,0x4B,0xC0,0x5A,0x40,0x00,0x00,}}, +{ 0x9AC0, {0x01,0x00,0x7B,0x00,0x5B,0xC0,0x7B,0xC0,0xFF,0xC0,0x8B,0xC0,0x79,0x80,0x4A,0xC0,0x7F,0xE0,0x78,0x80,0x48,0x80,0x58,0x80,0x00,0x00,}}, +{ 0x9AC4, {0x00,0x80,0x70,0x80,0x57,0xE0,0x71,0xC0,0xF9,0x40,0x8F,0xC0,0xF5,0x40,0x55,0xC0,0x75,0x40,0x75,0x40,0x5A,0x00,0x71,0xE0,0x00,0x00,}}, +{ 0x9ACF, {0x01,0x80,0x7B,0xC0,0x5F,0xE0,0x7F,0xE0,0xFF,0xC0,0x8B,0xC0,0x7B,0xC0,0x4B,0xC0,0x7F,0xE0,0x7B,0x80,0x49,0x80,0x5F,0x40,0x00,0x00,}}, +{ 0x9AD1, {0x00,0x00,0x3B,0xE0,0x3B,0xE0,0x3B,0xE0,0x7D,0xE0,0x4A,0xA0,0x3F,0xE0,0x2B,0xE0,0x3B,0xE0,0x38,0xE0,0x2F,0x20,0x38,0x40,0x00,0x00,}}, +{ 0x9AD3, {0x09,0x80,0x77,0xE0,0x75,0xC0,0x7B,0xC0,0xFF,0xE0,0x95,0xC0,0x71,0x40,0x5D,0xC0,0x75,0xC0,0x75,0xC0,0x5B,0xC0,0x71,0xE0,0x00,0x00,}}, +{ 0x9AD4, {0x01,0x80,0x77,0xC0,0x77,0xC0,0x77,0xC0,0xFF,0xC0,0x88,0x00,0x7F,0xE0,0x57,0xC0,0x77,0xC0,0x77,0xC0,0x5F,0xE0,0x70,0x00,0x00,0x00,}}, +{ 0x9AD8, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1F,0x00,0x11,0x00,0x1F,0x00,0x00,0x00,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9AD9, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x1F,0x00,0x11,0x00,0x1F,0x00,0x11,0x00,0x7F,0xC0,0x5F,0x40,0x51,0x40,0x5F,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9ADE, {0x20,0x00,0x33,0xC0,0xFB,0xC0,0x73,0xC0,0x77,0xE0,0x05,0xA0,0xFF,0xE0,0x89,0x80,0xFF,0xE0,0xFB,0xC0,0x8D,0xA0,0x99,0x80,0x00,0x00,}}, +{ 0x9ADF, {0x00,0x80,0x7C,0x80,0x61,0x80,0x79,0x40,0x62,0xC0,0x78,0x80,0x61,0x20,0xFD,0x20,0x78,0x40,0x5C,0x40,0xF5,0x80,0x06,0x00,0x00,0x00,}}, +{ 0x9AE2, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x24,0x00,0x37,0x80,0xFC,0x80,0xE5,0xA0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x9AE3, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x04,0x00,0xFF,0xE0,0x07,0x80,0x0F,0x80,0x30,0x80,0x63,0x80,0x00,0x00,}}, +{ 0x9AE6, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x03,0x00,0x3C,0x00,0x3F,0x80,0xFF,0xE0,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x9AEA, {0x00,0x80,0x7F,0x00,0x78,0xC0,0xFF,0x20,0x68,0xC0,0x5F,0x80,0x84,0x00,0xFF,0xE0,0x08,0x00,0x3F,0x80,0xC7,0x00,0x79,0xE0,0x00,0x00,}}, +{ 0x9AEB, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x77,0x80,0x3F,0x80,0x0C,0x80,0xFF,0x80,0xFF,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x9AED, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0x20,0x68,0xC0,0x7F,0x80,0x92,0x00,0x52,0xC0,0x5F,0x00,0x52,0x20,0x5E,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x9AEE, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x04,0x40,0xFF,0xE0,0x09,0x00,0x36,0x00,0xDB,0x00,0x60,0xE0,0x00,0x00,}}, +{ 0x9AEF, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x04,0x00,0x3F,0x80,0x3F,0x80,0xFF,0xE0,0x31,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x9AF1, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x08,0x00,0x3F,0x80,0xFE,0x80,0x3F,0xA0,0x30,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x9AF4, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x3F,0x80,0x12,0x80,0x7F,0xE0,0x7F,0xE0,0x72,0xC0,0xC2,0x00,0x00,0x00,}}, +{ 0x9AF7, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x0A,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x9AFB, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x04,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x00,0x00,}}, +{ 0x9B06, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x21,0xC0,0xFA,0x40,0x77,0xA0,0x79,0xC0,0xA7,0xE0,0x20,0x20,0x00,0x00,}}, +{ 0x9B18, {0x00,0x80,0x7F,0x80,0x7B,0x80,0xFF,0xE0,0x7B,0x80,0x7F,0x00,0x1F,0x00,0x1F,0x00,0x7F,0x80,0x3F,0x80,0x0E,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0x9B1A, {0x00,0x80,0x7F,0x00,0x7A,0xC0,0xFF,0xA0,0x68,0xC0,0x7F,0x80,0x3F,0xE0,0xE7,0x80,0x67,0x80,0x57,0x80,0x37,0x80,0xDC,0xE0,0x00,0x00,}}, +{ 0x9B1F, {0x00,0x80,0x7F,0x80,0x7B,0x80,0xFF,0xE0,0x7B,0x80,0x7F,0x80,0x3F,0x80,0xFF,0xE0,0x1F,0x40,0xFF,0xC0,0x1F,0x80,0x20,0xE0,0x00,0x00,}}, +{ 0x9B22, {0x00,0x80,0x7F,0x80,0x7B,0x80,0xFD,0xE0,0x7B,0x80,0x7F,0xE0,0x7F,0x40,0xBF,0x00,0x7F,0x80,0x7F,0x80,0x1F,0x80,0x71,0xC0,0x00,0x00,}}, +{ 0x9B23, {0x00,0x80,0x7F,0x80,0x7B,0x80,0xFD,0xE0,0x7B,0xC0,0x65,0x80,0x12,0x40,0x7F,0x80,0x7F,0x80,0x7F,0xA0,0x77,0x60,0xEC,0x20,0x00,0x00,}}, +{ 0x9B25, {0x00,0x00,0x7B,0x40,0x5B,0x40,0x5B,0x40,0x7B,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,}}, +{ 0x9B27, {0x00,0x00,0x7B,0x40,0x5B,0x40,0x5B,0x40,0x7B,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x65,0xC0,0x67,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x9B28, {0x00,0x00,0x7B,0x40,0x5B,0x40,0x5B,0x40,0x7B,0x40,0x40,0x40,0x4A,0x40,0x7F,0x40,0x7F,0xC0,0x7F,0xC0,0x53,0x40,0x61,0xC0,0x00,0x00,}}, +{ 0x9B29, {0x00,0x00,0x7B,0x40,0x5B,0x40,0x5B,0x40,0x7B,0x40,0x48,0x40,0x53,0x40,0x5B,0x40,0x5F,0x40,0x4E,0x40,0x52,0x40,0x61,0xC0,0x00,0x00,}}, +{ 0x9B2A, {0x00,0x00,0x7B,0x40,0x5B,0x40,0x5B,0x40,0x7B,0x40,0x41,0xC0,0x7D,0xC0,0x7F,0xC0,0x7F,0xC0,0x79,0xC0,0x5D,0xC0,0x61,0xC0,0x00,0x00,}}, +{ 0x9B2E, {0x00,0x00,0x7B,0x40,0x5B,0x40,0x7B,0xC0,0x4E,0x40,0x7F,0x40,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x7A,0xC0,0x67,0xC0,0x00,0x00,}}, +{ 0x9B2F, {0x09,0x00,0x47,0x40,0x7E,0xC0,0x66,0x40,0x4D,0x40,0x72,0x40,0x7F,0xC0,0x60,0x40,0x3F,0x80,0x3C,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0x9B31, {0x68,0x80,0xFF,0xE0,0x7F,0xC0,0xFF,0xE0,0xFF,0xE0,0x6A,0x40,0xEE,0x80,0x7B,0xC0,0x7F,0x80,0x7F,0x60,0x72,0xC0,0x7F,0x00,0x00,0x00,}}, +{ 0x9B32, {0x00,0x00,0xFF,0xE0,0x1F,0x00,0x3F,0x80,0x3F,0x80,0x00,0x00,0x7F,0xC0,0x4A,0x40,0x7F,0xC0,0x4F,0xC0,0x44,0x40,0x44,0xC0,0x00,0x00,}}, +{ 0x9B3B, {0x75,0xC0,0x3F,0x40,0x7F,0xC0,0x7F,0xC0,0x65,0xC0,0xFF,0xE0,0x3F,0x80,0x31,0x80,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x44,0xC0,0x00,0x00,}}, +{ 0x9B3C, {0x04,0x00,0x08,0x00,0x7F,0x80,0x44,0x80,0x7F,0x80,0x44,0x80,0x7F,0x80,0x15,0x80,0x16,0x80,0x27,0xE0,0x24,0x20,0x43,0xE0,0x00,0x00,}}, +{ 0x9B41, {0x22,0x80,0x41,0x80,0x78,0x80,0x6E,0x80,0x7A,0x80,0x78,0xE0,0x77,0x80,0x34,0x80,0x3C,0x80,0x7E,0xA0,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x9B42, {0x01,0x00,0x02,0x00,0x77,0xC0,0x05,0x40,0xF7,0xC0,0x27,0xC0,0x23,0x40,0x53,0x80,0xFD,0xC0,0x89,0xE0,0x11,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x9B43, {0x21,0x00,0x61,0xC0,0x7F,0xE0,0x7F,0xE0,0x79,0x80,0x79,0x80,0x61,0x80,0x6B,0x80,0x7F,0x80,0x7E,0x40,0x74,0x20,0x9F,0xE0,0x00,0x00,}}, +{ 0x9B44, {0x21,0x00,0x22,0x00,0x77,0xC0,0x77,0xC0,0x57,0x40,0x77,0xC0,0x55,0x40,0x53,0x80,0x77,0xC0,0x75,0xC0,0x19,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x9B45, {0x20,0x80,0x40,0x80,0x7B,0xC0,0x58,0x80,0x7F,0xE0,0x58,0x80,0x71,0x80,0x36,0xC0,0x3C,0xA0,0x7F,0x80,0x50,0x20,0x8F,0xE0,0x00,0x00,}}, +{ 0x9B4D, {0x20,0x00,0x63,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x63,0xC0,0x6B,0x40,0x7E,0xC0,0x7E,0x60,0x70,0x20,0x9F,0xE0,0x00,0x00,}}, +{ 0x9B4E, {0x20,0x00,0x67,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x67,0xC0,0x6F,0x40,0x7D,0x40,0x7C,0x60,0x70,0x20,0x9F,0xE0,0x00,0x00,}}, +{ 0x9B4F, {0x19,0x00,0x63,0x00,0xFF,0xC0,0xFF,0xC0,0x7B,0xC0,0x6B,0xC0,0xA3,0x80,0xF9,0xC0,0x6B,0xE0,0x7B,0xE0,0x3D,0xA0,0xC8,0xE0,0x00,0x00,}}, +{ 0x9B51, {0x21,0x80,0x67,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x79,0x80,0x67,0xE0,0x77,0xE0,0x7F,0xE0,0x7C,0x60,0x70,0x20,0x9F,0xE0,0x00,0x00,}}, +{ 0x9B54, {0x04,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xC0,0x7F,0xA0,0x72,0x80,0x7F,0x80,0x5F,0xC0,0x4F,0xE0,0xB2,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x9B58, {0x00,0x00,0x7F,0xE0,0x7C,0xE0,0x7F,0xE0,0x7E,0xC0,0x7E,0xC0,0x67,0x20,0x7F,0x80,0x5F,0x80,0x4F,0xC0,0x9B,0xE0,0x61,0xE0,0x00,0x00,}}, +{ 0x9B5A, {0x10,0x00,0x1F,0x00,0x22,0x00,0x7F,0x80,0xA4,0x80,0x3F,0x80,0x24,0x80,0x24,0x80,0x3F,0x80,0x12,0x40,0x4B,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x9B6F, {0x08,0x00,0x1F,0x00,0xE2,0x00,0x3F,0x80,0x3F,0x80,0x24,0x80,0x3F,0x80,0x6B,0x40,0xBF,0xA0,0x3F,0x80,0x20,0x80,0x3F,0x80,0x00,0x00,}}, +{ 0x9B74, {0x21,0x80,0x31,0x80,0x7B,0xE0,0xFB,0xE0,0xF9,0x80,0x79,0xC0,0x69,0xC0,0x79,0x40,0x79,0x40,0x7A,0x40,0x74,0x40,0x88,0x80,0x00,0x00,}}, +{ 0x9B83, {0x20,0x00,0x37,0xE0,0x79,0x80,0xFB,0xA0,0xFD,0xA0,0x79,0x80,0x6F,0xE0,0x79,0x80,0x79,0x80,0x79,0x80,0x71,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9B8E, {0x21,0x00,0x31,0x00,0x59,0xE0,0xF9,0x00,0x59,0x00,0x79,0x00,0x5B,0xC0,0x7A,0x40,0x12,0x40,0x6A,0x40,0x53,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9B91, {0x21,0x00,0x31,0x00,0x79,0xC0,0xFB,0xC0,0xFF,0x40,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7A,0x80,0x7A,0x20,0x72,0x20,0x81,0xE0,0x00,0x00,}}, +{ 0x9B92, {0x21,0x40,0x31,0x40,0x7A,0x40,0xFB,0xE0,0xFE,0x40,0x7B,0x40,0x6A,0xC0,0x7A,0x40,0x7A,0x40,0x7A,0x40,0x72,0x40,0x82,0xC0,0x00,0x00,}}, +{ 0x9B93, {0x21,0x00,0x31,0x00,0x79,0xE0,0xFB,0xE0,0xFB,0x80,0x7D,0xE0,0x69,0x80,0x79,0x80,0x79,0xE0,0x79,0x80,0x71,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9B96, {0x20,0x00,0x37,0xE0,0x79,0x80,0xF9,0x80,0xF9,0x00,0x79,0x00,0x6B,0xC0,0x7E,0x40,0x7A,0x40,0x7A,0x40,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9B97, {0x21,0x00,0x31,0x00,0x7B,0xC0,0xFE,0x40,0xF9,0x80,0x79,0x80,0x6B,0x40,0x7D,0xA0,0x78,0x00,0x7A,0x00,0x71,0x80,0x80,0x40,0x00,0x00,}}, +{ 0x9B9F, {0x21,0x80,0x31,0x80,0x7B,0xE0,0xFC,0x00,0xF9,0x80,0x7F,0xE0,0x69,0x40,0x7B,0x40,0x7B,0x80,0x78,0xC0,0x73,0x20,0x8C,0x20,0x00,0x00,}}, +{ 0x9BA0, {0x21,0x80,0x31,0x80,0x7B,0xC0,0xFF,0xE0,0xFA,0x00,0x7B,0xC0,0x6B,0x40,0x7B,0x40,0x7B,0x40,0x7F,0x60,0x75,0x20,0x89,0xE0,0x00,0x00,}}, +{ 0x9BA8, {0x22,0x00,0x32,0xC0,0x7B,0x00,0xFA,0x20,0xFB,0xE0,0x78,0x00,0x6B,0xC0,0x7A,0x40,0x7B,0xC0,0x7A,0x40,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9BAA, {0x21,0x00,0x31,0x00,0x7F,0xE0,0xF9,0x00,0xF9,0xC0,0x7B,0x40,0x6B,0xC0,0x7D,0x40,0x79,0xC0,0x79,0x40,0x71,0x40,0x81,0x40,0x00,0x00,}}, +{ 0x9BAB, {0x20,0x80,0x30,0x80,0x5F,0xE0,0xB2,0x40,0x7A,0x40,0x6A,0x40,0x7D,0xA0,0x69,0x80,0x79,0x80,0x39,0x80,0x72,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9BAD, {0x20,0x80,0x30,0x80,0x5B,0xC0,0xB0,0x80,0x7F,0xE0,0x68,0x80,0x78,0x80,0x6B,0xC0,0x78,0x80,0x38,0x80,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9BAE, {0x22,0x40,0x31,0x40,0x5F,0xE0,0xA0,0x80,0x78,0x80,0x6B,0xC0,0x78,0x80,0x68,0x80,0x7F,0xE0,0x38,0x80,0x70,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x9BB4, {0x21,0x80,0x31,0x80,0x7A,0x80,0xFB,0xE0,0xFE,0xC0,0x7A,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xA0,0x7A,0x80,0x72,0x80,0x82,0x80,0x00,0x00,}}, +{ 0x9BB9, {0x21,0x80,0x31,0x80,0x7B,0xE0,0xFD,0xA0,0xFB,0xC0,0x7A,0x40,0x6B,0xC0,0x7A,0x40,0x7B,0xC0,0x7A,0x40,0x72,0x40,0x82,0xC0,0x00,0x00,}}, +{ 0x9BC0, {0x20,0x60,0x37,0x80,0x79,0x80,0xFB,0x40,0xF9,0xC0,0x79,0x80,0x69,0x40,0x7F,0xA0,0x79,0x80,0x7B,0xA0,0x75,0xA0,0x81,0x80,0x00,0x00,}}, +{ 0x9BC6, {0x21,0xC0,0x31,0xA0,0x7F,0xE0,0xFB,0xC0,0xFB,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x73,0xC0,0x82,0xC0,0x00,0x00,}}, +{ 0x9BC9, {0x20,0x00,0x33,0xC0,0x5A,0xC0,0xB3,0xC0,0x7A,0xC0,0x6A,0xC0,0x7B,0xC0,0x78,0x80,0x33,0xC0,0x78,0x80,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9BCA, {0x21,0x00,0xA5,0xC0,0x07,0x60,0x3B,0xA0,0x4E,0x00,0x5F,0x00,0x22,0x00,0x7F,0x80,0x3F,0x80,0x3F,0x80,0x32,0x80,0x49,0x40,0x00,0x00,}}, +{ 0x9BCF, {0x10,0xA0,0x19,0x20,0x3F,0xE0,0x7D,0xE0,0x7F,0xE0,0x3D,0xE0,0x35,0xE0,0x3F,0xE0,0x3F,0xE0,0x3D,0x20,0x39,0x20,0x41,0x60,0x00,0x00,}}, +{ 0x9BD1, {0x20,0x40,0x33,0x80,0x7F,0xC0,0xFD,0x80,0xFF,0xE0,0x79,0x80,0x6B,0x80,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x73,0xC0,0x81,0x80,0x00,0x00,}}, +{ 0x9BD2, {0x10,0x00,0x1B,0xE0,0x3C,0xC0,0x7D,0xE0,0x7D,0xE0,0x3D,0xE0,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x3D,0xE0,0x39,0xE0,0x41,0xE0,0x00,0x00,}}, +{ 0x9BD4, {0x11,0xE0,0x19,0xE0,0x3E,0xC0,0x7F,0xE0,0x7D,0xE0,0x3C,0x00,0x35,0xE0,0x3D,0xE0,0x3D,0xE0,0x3D,0xE0,0x39,0xE0,0x41,0x20,0x00,0x00,}}, +{ 0x9BD6, {0x20,0x80,0x37,0xE0,0x58,0x80,0xB3,0xC0,0xFF,0xE0,0x78,0x00,0x6B,0xC0,0x7A,0x40,0x6B,0xC0,0x3B,0xC0,0x72,0x40,0x82,0xC0,0x00,0x00,}}, +{ 0x9BDB, {0x10,0x00,0x19,0xE0,0x3D,0xE0,0x7D,0xE0,0x7D,0xE0,0x3D,0xE0,0x35,0x20,0x3D,0xE0,0x3D,0xE0,0x3F,0xE0,0x3A,0x20,0x44,0x60,0x00,0x00,}}, +{ 0x9BE1, {0x21,0x80,0x31,0x80,0x7F,0xE0,0xFF,0xE0,0xF9,0x80,0x7F,0xE0,0x69,0x80,0x7B,0xC0,0x7E,0xE0,0x7A,0x80,0x74,0x80,0x88,0x80,0x00,0x00,}}, +{ 0x9BE2, {0x21,0x00,0x33,0x00,0x7A,0x40,0xFA,0x40,0xFA,0x40,0x7A,0x40,0x6B,0xC0,0x79,0xC0,0x7B,0x80,0x7B,0xA0,0x75,0xA0,0x88,0xE0,0x00,0x00,}}, +{ 0x9BE3, {0x20,0x00,0x33,0xC0,0x7B,0xC0,0xFB,0xC0,0xFB,0xC0,0x79,0x00,0x6B,0xE0,0x7D,0xA0,0x7A,0xA0,0x7C,0xA0,0x71,0x20,0x80,0xC0,0x00,0x00,}}, +{ 0x9BE4, {0x20,0x00,0x33,0xC0,0x7A,0x40,0xFB,0xC0,0xFA,0x40,0x7B,0xC0,0x6A,0x80,0x7A,0xE0,0x7B,0xC0,0x7A,0xA0,0x73,0xA0,0x8C,0x60,0x00,0x00,}}, +{ 0x9BE8, {0x20,0x80,0x30,0x80,0x5F,0xE0,0xB3,0xC0,0xFA,0x40,0x7A,0x40,0x6B,0xC0,0x78,0x80,0x3A,0xC0,0x7A,0xA0,0x74,0xA0,0x80,0x80,0x00,0x00,}}, +{ 0x9BF0, {0x21,0x80,0x31,0x80,0x7A,0x40,0xFF,0xE0,0xF8,0x00,0x7B,0xC0,0x68,0x80,0x79,0x80,0x7B,0xE0,0x7B,0x20,0x77,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9BF1, {0x21,0x80,0x31,0xC0,0x7B,0xE0,0xFB,0xE0,0xFB,0xC0,0x7B,0xA0,0x6A,0xE0,0x7B,0x80,0x7F,0x80,0x7D,0xA0,0x7A,0xA0,0x84,0x60,0x00,0x00,}}, +{ 0x9BF2, {0x22,0x80,0x32,0x80,0x7A,0xC0,0xFF,0xC0,0xFA,0x20,0x7A,0xA0,0x6B,0x40,0x7B,0x40,0x7F,0x00,0x7D,0x40,0x79,0x20,0x86,0x20,0x00,0x00,}}, +{ 0x9BF5, {0x21,0x80,0x32,0x40,0x5F,0xE0,0xF8,0x80,0x5F,0xE0,0x79,0x80,0x5A,0xC0,0x7D,0x20,0x12,0x80,0x69,0x60,0x50,0xC0,0x87,0x00,0x00,0x00,}}, +{ 0x9C04, {0x61,0x80,0x61,0xC0,0x7F,0xE0,0xFF,0xE0,0xFF,0xC0,0x7B,0xC0,0x7F,0xC0,0x7D,0xC0,0x7E,0x80,0x7A,0xE0,0x75,0xE0,0xA1,0x20,0x00,0x00,}}, +{ 0x9C06, {0x21,0x80,0x31,0x80,0x7F,0xE0,0xFB,0xC0,0xF9,0x80,0x7F,0xE0,0x69,0x80,0x7B,0xC0,0x7F,0xE0,0x7B,0xC0,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9C08, {0x23,0xC0,0x33,0xC0,0x7F,0xE0,0xFB,0xC0,0xFA,0x00,0x7B,0xE0,0x69,0x80,0x7F,0xE0,0x79,0x80,0x7B,0xC0,0x75,0xA0,0x81,0x80,0x00,0x00,}}, +{ 0x9C09, {0x21,0x00,0x33,0x00,0x7B,0xC0,0xFB,0xC0,0xFA,0x40,0x7B,0xC0,0x68,0x00,0x7F,0xE0,0x7B,0xC0,0x7B,0xC0,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9C0A, {0x21,0x80,0x31,0x80,0x7F,0xE0,0xFB,0xC0,0xFB,0xC0,0x7B,0xC0,0x6B,0xC0,0x79,0x80,0x7B,0xC0,0x7D,0xA0,0x71,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9C0C, {0x21,0x80,0x31,0x80,0x7A,0x40,0xFF,0xE0,0xF9,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9C0D, {0x21,0x80,0x36,0x80,0x5A,0x80,0xA3,0xA0,0x7F,0xA0,0x7A,0xC0,0x6F,0x80,0x7E,0x80,0x7E,0x80,0x3B,0x40,0x73,0x20,0x82,0x20,0x00,0x00,}}, +{ 0x9C10, {0x20,0x00,0x37,0xE0,0x7F,0xE0,0xFE,0x60,0xFB,0xC0,0x78,0x00,0x6F,0xE0,0x79,0x00,0x7B,0xC0,0x78,0x40,0x70,0x40,0x80,0x80,0x00,0x00,}}, +{ 0x9C12, {0x21,0x00,0x33,0x00,0x7F,0xE0,0xFF,0xC0,0xFB,0xC0,0x7A,0x40,0x6B,0xC0,0x7B,0x00,0x7F,0xC0,0x79,0x80,0x73,0x80,0x8C,0x60,0x00,0x00,}}, +{ 0x9C13, {0x20,0x00,0x33,0xC0,0x7B,0xC0,0xFB,0xC0,0xFB,0xC0,0x7B,0xC0,0x69,0x80,0x7B,0xC0,0x7B,0x60,0x7F,0x20,0x75,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9C14, {0x21,0xC0,0x31,0xA0,0x7F,0xE0,0xFF,0xE0,0xFF,0xC0,0x7D,0xC0,0x6F,0xC0,0x7F,0x80,0x7F,0x80,0x7C,0xE0,0x79,0x60,0x8A,0x20,0x00,0x00,}}, +{ 0x9C15, {0x20,0x00,0x37,0xC0,0x7D,0x40,0xFF,0x40,0xFF,0x40,0x7C,0x00,0x6F,0xC0,0x7D,0xC0,0x7F,0xC0,0x7E,0x80,0x74,0xC0,0x85,0x20,0x00,0x00,}}, +{ 0x9C1B, {0x20,0x00,0x33,0xC0,0x7A,0x40,0xFB,0xC0,0xFA,0x40,0x7B,0xC0,0x68,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9C21, {0x21,0x00,0x33,0x00,0x7F,0xE0,0xFE,0xA0,0xFF,0xA0,0x7D,0xE0,0x69,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9C24, {0x22,0x00,0x33,0xE0,0x7E,0x80,0xFF,0xE0,0xFD,0xE0,0x7F,0xA0,0x6D,0xA0,0x7F,0xA0,0x7D,0xE0,0x7F,0xE0,0x74,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x9C25, {0x20,0x00,0x37,0xE0,0x7D,0xA0,0xFF,0xE0,0xF9,0x80,0x7B,0xC0,0x6B,0xC0,0x7D,0xA0,0x7B,0xC0,0x7D,0xA0,0x71,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9C2D, {0x21,0x80,0x33,0xC0,0x7F,0xE0,0xFF,0xE0,0xF9,0xC0,0x7B,0x20,0x6D,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9C2E, {0x20,0x00,0x33,0xC0,0x7B,0xC0,0xFB,0xC0,0xFA,0x40,0x7B,0xC0,0x68,0x00,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9C2F, {0x10,0x00,0x1B,0xE0,0x2C,0xA0,0x7F,0xE0,0x2E,0xC0,0x3F,0xE0,0x2C,0xA0,0x3F,0xE0,0x0D,0xA0,0x37,0xE0,0x28,0xA0,0x43,0xC0,0x00,0x00,}}, +{ 0x9C30, {0x60,0x80,0x67,0x80,0x70,0xE0,0xFF,0xE0,0xFB,0xA0,0x7F,0xE0,0x6F,0xA0,0x7F,0xE0,0x7F,0xE0,0x7E,0x80,0x72,0x80,0x82,0x80,0x00,0x00,}}, +{ 0x9C32, {0x21,0x00,0xF9,0x00,0xFF,0xE0,0xFF,0x40,0x79,0xC0,0x5B,0x40,0x9E,0x20,0x7F,0x80,0x3F,0x80,0x3F,0x80,0x32,0x80,0x49,0x40,0x00,0x00,}}, +{ 0x9C39, {0x20,0x00,0x37,0xE0,0x5F,0xA0,0xBF,0x40,0x7F,0xC0,0x6D,0xA0,0x7F,0xA0,0x68,0x80,0x7B,0xC0,0x38,0x80,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9C3A, {0x21,0x80,0x33,0xC0,0x7B,0xC0,0xFF,0xC0,0xFF,0xE0,0x79,0x80,0x6F,0x80,0x7B,0x60,0x7B,0x00,0x7A,0x40,0x71,0x80,0x86,0x00,0x00,0x00,}}, +{ 0x9C3B, {0x20,0x00,0x33,0xC0,0x5B,0xC0,0xBB,0xC0,0x7B,0xC0,0x5F,0xE0,0x7D,0xA0,0x5F,0xE0,0x7B,0xC0,0x39,0x80,0x73,0x80,0x8C,0x60,0x00,0x00,}}, +{ 0x9C3E, {0x20,0x00,0x37,0xE0,0x7F,0xE0,0xFF,0xE0,0xFF,0xE0,0x78,0x00,0x6B,0xC0,0x78,0x00,0x7F,0xE0,0x7B,0xA0,0x75,0xA0,0x81,0x80,0x00,0x00,}}, +{ 0x9C46, {0x21,0x80,0x31,0x80,0x7B,0xC0,0xFF,0xE0,0xFB,0xC0,0x7A,0x40,0x6B,0xC0,0x7A,0x40,0x7B,0xC0,0x7F,0xE0,0x71,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9C47, {0x21,0x80,0x31,0x80,0x7B,0xE0,0xFB,0xC0,0xFB,0xC0,0x7B,0xE0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7F,0xC0,0x77,0xA0,0x89,0x80,0x00,0x00,}}, +{ 0x9C48, {0x20,0x00,0x33,0xC0,0x78,0x80,0xFF,0xE0,0xFB,0xC0,0x7B,0xC0,0x69,0x80,0x7B,0xC0,0x78,0x40,0x7B,0xC0,0x70,0x40,0x83,0xC0,0x00,0x00,}}, +{ 0x9C52, {0x22,0x40,0x33,0xC0,0x7F,0xE0,0xFB,0xC0,0xFB,0xC0,0x7B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x73,0x80,0x81,0x80,0x00,0x00,}}, +{ 0x9C57, {0x21,0x80,0x33,0xC0,0x7F,0xE0,0xFF,0xE0,0xFB,0xC0,0x7D,0xA0,0x6B,0xC0,0x7B,0xE0,0x7F,0xC0,0x7F,0xE0,0x72,0x40,0x84,0x40,0x00,0x00,}}, +{ 0x9C5A, {0x21,0x80,0x37,0xE0,0x7B,0xC0,0xFB,0xC0,0xFB,0xC0,0x7A,0x40,0x6B,0xC0,0x7B,0xC0,0x7F,0xE0,0x7B,0xC0,0x73,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9C60, {0x21,0x00,0x33,0x80,0x7F,0xC0,0xFF,0xE0,0xFF,0xC0,0x7D,0xC0,0x6F,0xC0,0x7B,0x80,0x7B,0x80,0x7B,0x80,0x73,0x80,0x82,0x80,0x00,0x00,}}, +{ 0x9C67, {0x21,0x80,0x37,0xC0,0x7F,0xC0,0xFF,0xC0,0xFF,0xC0,0x78,0x00,0x6F,0xE0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x77,0xE0,0x80,0x00,0x00,0x00,}}, +{ 0x9C76, {0x22,0x40,0x33,0xC0,0x7F,0xE0,0xFB,0xC0,0xFF,0xE0,0x7B,0x80,0x6F,0xC0,0x7A,0xA0,0x7B,0x80,0x7B,0xC0,0x73,0xC0,0x8C,0x60,0x00,0x00,}}, +{ 0x9C78, {0x21,0x80,0x31,0xC0,0x7F,0xE0,0xFF,0xC0,0xFF,0xC0,0x7F,0xC0,0x6F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7B,0xC0,0x87,0xE0,0x00,0x00,}}, +{ 0x9CE5, {0x04,0x00,0x08,0x00,0x3F,0x80,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x56,0xA0,0x50,0x20,0x80,0xC0,0x00,0x00,}}, +{ 0x9CE7, {0x04,0x00,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xC0,0x75,0x40,0x4B,0xC0,0x0F,0x80,0x1F,0x00,0x31,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x9CE9, {0x41,0x00,0x42,0x00,0x77,0x80,0xD7,0x80,0x54,0x80,0x57,0x80,0x57,0xE0,0x5C,0x00,0x4F,0xE0,0x4F,0xE0,0x8A,0xA0,0x10,0xC0,0x00,0x00,}}, +{ 0x9CEB, {0x00,0x00,0x7F,0xE0,0x67,0x80,0x6F,0x80,0x6F,0x80,0x6F,0x80,0x6F,0xE0,0x68,0x00,0x4F,0xE0,0x5F,0xA0,0xB4,0x20,0x20,0xC0,0x00,0x00,}}, +{ 0x9CEC, {0x08,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xE0,0x60,0x00,0x7F,0xC0,0x00,0x40,0x1F,0xC0,0x13,0xA0,0x32,0x20,0xC1,0xE0,0x00,0x00,}}, +{ 0x9CF0, {0x01,0x00,0x02,0x00,0x67,0x80,0x27,0x80,0x24,0x80,0x27,0x80,0x77,0xE0,0x54,0x00,0x4F,0xE0,0x8F,0xA0,0x0A,0x20,0x10,0xC0,0x00,0x00,}}, +{ 0x9CF3, {0x00,0x00,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x71,0x80,0x7F,0x80,0x7F,0x80,0x7F,0xE0,0x5F,0xE0,0x77,0xE0,0xEB,0xA0,0x00,0x00,}}, +{ 0x9CF4, {0x01,0x00,0x02,0x00,0xEF,0x80,0xAF,0x80,0xA8,0x80,0xAF,0x80,0xAF,0xE0,0xA8,0x00,0xEF,0xE0,0x9F,0xA0,0x14,0x20,0x20,0xC0,0x00,0x00,}}, +{ 0x9CF6, {0x04,0x80,0xFF,0xE0,0x0A,0x00,0x3F,0x20,0x7F,0xE0,0x61,0x20,0x7F,0x00,0x7F,0x80,0x7F,0xC0,0x7F,0xC0,0x55,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x9D03, {0x21,0x80,0x61,0x80,0x7B,0xC0,0x7B,0xC0,0x49,0xC0,0x79,0xC0,0x7F,0xE0,0x41,0x80,0x7D,0x80,0x75,0x80,0x6A,0x40,0xB4,0x20,0x00,0x00,}}, +{ 0x9D06, {0x21,0x00,0x23,0x00,0x23,0xC0,0x7F,0xC0,0x7A,0x40,0xA3,0xC0,0x33,0xE0,0x32,0x00,0x7F,0xE0,0x5F,0xE0,0x87,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D07, {0x41,0x00,0x5A,0x00,0x67,0x80,0x4F,0x80,0x7C,0x80,0x67,0x80,0x67,0xE0,0xFC,0x00,0x67,0xE0,0x6F,0xE0,0x6A,0x20,0x70,0xC0,0x00,0x00,}}, +{ 0x9D08, {0x00,0x00,0x7F,0xE0,0x6B,0xC0,0x6B,0xC0,0x73,0xC0,0x73,0xC0,0x73,0xE0,0x72,0x00,0x53,0xE0,0x57,0xE0,0x97,0x20,0x18,0xC0,0x00,0x00,}}, +{ 0x9D09, {0x01,0x00,0x7B,0x00,0x53,0xC0,0x53,0xC0,0xFA,0x40,0x33,0xC0,0x33,0xE0,0x72,0x00,0x53,0xE0,0x97,0xE0,0x17,0x20,0x38,0xC0,0x00,0x00,}}, +{ 0x9D0E, {0x01,0x00,0x7F,0x00,0x43,0xC0,0x4B,0xC0,0x4A,0x40,0x73,0xC0,0x53,0xE0,0x5A,0x00,0x6B,0xE0,0x47,0xE0,0x7F,0x20,0x48,0xC0,0x00,0x00,}}, +{ 0x9D12, {0x21,0x00,0x33,0x00,0x7B,0xC0,0x4B,0xC0,0xF2,0x40,0x03,0xC0,0xFB,0xE0,0x6A,0x00,0x6B,0xE0,0x7F,0xE0,0x67,0x20,0x68,0xC0,0x00,0x00,}}, +{ 0x9D15, {0x21,0x80,0x61,0x80,0x7B,0xE0,0x7B,0xE0,0x4F,0x00,0x79,0x00,0x7D,0x60,0x41,0x80,0x7D,0x00,0x75,0x20,0x65,0x20,0x99,0xE0,0x00,0x00,}}, +{ 0x9D1B, {0x20,0x00,0x7F,0xC0,0xFA,0xC0,0x3A,0xA0,0xFF,0xE0,0x2F,0x00,0x3F,0x00,0x3F,0xC0,0x3F,0xC0,0x3F,0xC0,0x55,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x9D1F, {0x01,0x00,0x1B,0x00,0x63,0xC0,0x63,0xC0,0x7E,0x40,0x63,0xC0,0x6B,0xE0,0x5A,0x00,0x7B,0xE0,0xEF,0xE0,0xF7,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D23, {0x21,0x00,0x22,0x00,0x27,0x80,0xFF,0x80,0x34,0x80,0x27,0x80,0x77,0xE0,0x54,0x00,0x57,0xE0,0x7F,0xE0,0x4A,0x20,0x10,0xC0,0x00,0x00,}}, +{ 0x9D26, {0x04,0x00,0x3F,0x80,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0xD1,0x60,0x1F,0x00,0x1F,0x00,0x1F,0xE0,0x1F,0xC0,0x6B,0x40,0x41,0x80,0x00,0x00,}}, +{ 0x9D28, {0x01,0x00,0xF2,0x00,0xB7,0x80,0xB7,0x80,0xF4,0x80,0xB7,0x80,0xF7,0xE0,0xB4,0x00,0x27,0xE0,0x2B,0x60,0x2A,0xA0,0x30,0xC0,0x00,0x00,}}, +{ 0x9D2A, {0x21,0x00,0x33,0x00,0x7F,0xC0,0x83,0xC0,0x32,0x40,0x13,0xC0,0x73,0xE0,0x72,0x00,0x5B,0xE0,0x4F,0xE0,0x87,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D2B, {0x01,0x00,0x02,0x00,0xF7,0x80,0xD7,0x80,0xD4,0x80,0xF7,0x80,0xD7,0xE0,0xD4,0x00,0xD7,0xE0,0xFD,0xE0,0x0A,0x20,0x10,0xC0,0x00,0x00,}}, +{ 0x9D2C, {0x28,0x80,0x15,0x00,0x7F,0xE0,0x9F,0x00,0x31,0x80,0x3F,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xC0,0x3F,0xC0,0x53,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x9D3B, {0x41,0x00,0x42,0x00,0x3F,0x80,0x97,0x80,0x54,0x80,0x57,0x80,0x17,0xE0,0x54,0x00,0x5F,0xE0,0x6B,0xA0,0x8A,0x20,0x90,0xC0,0x00,0x00,}}, +{ 0x9D3E, {0x21,0x00,0x33,0x00,0xFF,0xC0,0xF7,0xC0,0x62,0x40,0x7B,0xC0,0x63,0xE0,0xB2,0x00,0xFF,0xE0,0x27,0xE0,0x27,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9D3F, {0x21,0x00,0x33,0x00,0x7B,0xC0,0x4B,0xC0,0xFA,0x40,0x03,0xC0,0x7B,0xE0,0x4A,0x00,0x7B,0xE0,0x7F,0xE0,0x47,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D41, {0x21,0x00,0x23,0x00,0xFF,0x80,0xFF,0x80,0x6A,0x80,0x4B,0x80,0xB3,0xE0,0x32,0x00,0x33,0xE0,0x37,0xE0,0x47,0x20,0x88,0xC0,0x00,0x00,}}, +{ 0x9D44, {0x01,0x00,0xFA,0x00,0x67,0x80,0x77,0x80,0xFC,0x80,0x27,0x80,0x27,0xE0,0x7C,0x00,0x27,0xE0,0x3F,0xE0,0xEA,0x20,0x10,0xC0,0x00,0x00,}}, +{ 0x9D46, {0x64,0x00,0x48,0xE0,0x9E,0x00,0x3E,0x00,0x32,0xE0,0x7E,0x40,0x7F,0x40,0xF0,0x40,0x7F,0x40,0x7D,0x40,0x71,0x40,0x66,0xC0,0x00,0x00,}}, +{ 0x9D48, {0x01,0x00,0xFB,0x00,0x53,0xC0,0x73,0xC0,0x52,0x40,0x53,0xC0,0x73,0xE0,0x52,0x00,0x73,0xE0,0xF7,0xE0,0x17,0x20,0x18,0xC0,0x00,0x00,}}, +{ 0x9D50, {0x01,0x00,0xFF,0x00,0x23,0xC0,0x6B,0xC0,0x6A,0x40,0x6B,0xC0,0x77,0xE0,0xB6,0x00,0xA3,0xE0,0x3F,0xE0,0xE7,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D51, {0x01,0x00,0x7B,0x00,0x7B,0xC0,0x7B,0xC0,0x7A,0x40,0x4B,0xC0,0x7B,0xE0,0x4A,0x00,0x7B,0xE0,0x4F,0xE0,0x4F,0x20,0x58,0xC0,0x00,0x00,}}, +{ 0x9D59, {0x01,0x00,0x7B,0x00,0x4B,0xC0,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4B,0xE0,0x4A,0x00,0x7B,0xE0,0x77,0xE0,0x57,0x20,0x88,0xC0,0x00,0x00,}}, +{ 0x9D5C, {0x51,0x00,0x32,0x00,0xFB,0xC0,0x2B,0xC0,0x7A,0x40,0x63,0xC0,0x7B,0xE0,0x6A,0x00,0x6B,0xE0,0xB7,0xE0,0x25,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9D5D, {0x30,0x80,0x79,0x80,0xF5,0xC0,0x71,0xC0,0xFD,0x40,0x75,0xC0,0x75,0xE0,0x79,0x00,0xE9,0xE0,0x7F,0xA0,0x67,0x20,0x64,0xC0,0x00,0x00,}}, +{ 0x9D5E, {0x19,0x80,0xF3,0x40,0xFF,0xE0,0xF7,0xA0,0x7F,0xE0,0x11,0x80,0x1F,0x80,0x1F,0x80,0x1F,0xE0,0x1F,0xC0,0x6B,0x40,0x41,0x80,0x00,0x00,}}, +{ 0x9D60, {0x21,0x00,0x63,0x00,0x7B,0xC0,0x63,0xC0,0xA2,0x40,0xFF,0xC0,0x03,0xE0,0x7A,0x00,0x4B,0xE0,0x7F,0xE0,0x47,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D61, {0x11,0x00,0x7B,0x00,0x17,0xC0,0xFF,0xC0,0x72,0x40,0x73,0xC0,0x73,0xE0,0x72,0x00,0x7B,0xE0,0x7F,0xE0,0xCF,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9D64, {0x21,0x00,0x33,0x00,0x7B,0xC0,0xFB,0xC0,0xFA,0x40,0x6B,0xC0,0x7B,0xE0,0x7A,0x00,0x7B,0xE0,0x4F,0xE0,0x4F,0x20,0x98,0xC0,0x00,0x00,}}, +{ 0x9D6C, {0x00,0x40,0x7E,0xC0,0x5A,0xE0,0x5A,0xE0,0x7E,0xA0,0x5A,0xE0,0x5A,0xF0,0x5A,0x80,0x7E,0xF0,0x5B,0xD0,0x5B,0x90,0xB6,0x60,0x00,0x00,}}, +{ 0x9D6F, {0x21,0x00,0x63,0x00,0x7B,0xC0,0x6B,0xC0,0x7A,0x40,0x6B,0xC0,0x7B,0xE0,0x52,0x00,0xFB,0xE0,0xFF,0xE0,0x17,0x20,0x18,0xC0,0x00,0x00,}}, +{ 0x9D72, {0x71,0x00,0x73,0x00,0xFF,0xC0,0xFF,0xC0,0x72,0x40,0xFF,0xC0,0x03,0xE0,0x7A,0x00,0x7B,0xE0,0x7F,0xE0,0x7F,0x20,0x48,0xC0,0x00,0x00,}}, +{ 0x9D7A, {0x21,0x00,0x23,0x00,0xFF,0xC0,0xFF,0xC0,0x7E,0x40,0x67,0xC0,0x7B,0xE0,0xEA,0x00,0x5B,0xE0,0x5F,0xE0,0x67,0x20,0x48,0xC0,0x00,0x00,}}, +{ 0x9D87, {0x21,0x00,0x33,0x00,0xFF,0xC0,0x7B,0xC0,0x7A,0x40,0x7B,0xC0,0x6B,0xE0,0x7A,0x00,0x7B,0xE0,0x67,0xE0,0xA7,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9D89, {0x21,0x00,0xFF,0x00,0x73,0xC0,0x73,0xC0,0x72,0x40,0x03,0xC0,0x7B,0xE0,0x12,0x00,0xFB,0xE0,0xE7,0xE0,0x27,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9D8F, {0x09,0x00,0x33,0x00,0xEB,0xC0,0xBB,0xC0,0x32,0x40,0x7B,0xC0,0x23,0xE0,0xFA,0x00,0x33,0xE0,0x6F,0xE0,0x47,0x20,0x89,0xC0,0x00,0x00,}}, +{ 0x9D9A, {0x01,0x00,0xFF,0x00,0xFF,0xC0,0xCF,0xC0,0x72,0x40,0x03,0xC0,0xFB,0xE0,0x62,0x00,0x73,0xE0,0x17,0xE0,0x17,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9DA4, {0x01,0x00,0x7F,0x00,0xFF,0xC0,0xFF,0xC0,0x7A,0x40,0x6B,0xC0,0x7B,0xE0,0x7A,0x00,0x7B,0xE0,0xFF,0xE0,0x37,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9DA9, {0x01,0x00,0x7B,0x00,0xFF,0xE0,0xFF,0x80,0x66,0xE0,0xFF,0x80,0x11,0x80,0x1F,0x80,0x1F,0xE0,0x1F,0xE0,0x17,0x40,0x4B,0x80,0x00,0x00,}}, +{ 0x9DAB, {0x21,0x00,0x33,0x00,0xFF,0xC0,0xFF,0xC0,0xFE,0x40,0xF7,0xC0,0xFF,0xE0,0x72,0x00,0x7B,0xE0,0xA7,0xE0,0x27,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9DAF, {0x37,0xC0,0x3B,0xC0,0x7F,0xE0,0x7F,0xE0,0xBF,0x00,0x21,0x80,0x3F,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xC0,0x55,0x40,0x81,0x80,0x00,0x00,}}, +{ 0x9DB2, {0x31,0x00,0x53,0x00,0xAF,0xC0,0x37,0xC0,0x7A,0x40,0x03,0xC0,0xFB,0xE0,0xFA,0x00,0xFB,0xE0,0xFF,0xE0,0x6F,0x20,0x78,0xC0,0x00,0x00,}}, +{ 0x9DB4, {0x21,0x00,0x22,0x00,0xFF,0xC0,0xFB,0xC0,0x72,0x40,0x7B,0xC0,0xD3,0xE0,0x7A,0x00,0x53,0xE0,0x7F,0xE0,0x7F,0x20,0x48,0xC0,0x00,0x00,}}, +{ 0x9DB8, {0x01,0x00,0xFB,0x00,0x6B,0xC0,0xFB,0xC0,0xB2,0x40,0xFB,0xC0,0xEB,0xE0,0xFA,0x00,0xFB,0xE0,0xFF,0xE0,0x6F,0x20,0xF8,0xC0,0x00,0x00,}}, +{ 0x9DBA, {0x21,0x00,0xEF,0x00,0xBF,0xC0,0xFF,0xC0,0x6A,0x40,0x7F,0xC0,0xEB,0xE0,0x7A,0x00,0x7B,0xE0,0x7F,0xE0,0x6F,0x20,0x78,0xC0,0x00,0x00,}}, +{ 0x9DBB, {0x01,0x00,0x7B,0x00,0x5B,0xC0,0x7B,0xC0,0xFE,0x40,0x87,0xC0,0x7B,0xE0,0x4A,0x00,0x7B,0xE0,0x7F,0xE0,0x4F,0x20,0x58,0xC0,0x00,0x00,}}, +{ 0x9DC1, {0x71,0x00,0x53,0x00,0x7F,0xC0,0xF7,0xC0,0x32,0x40,0x73,0xC0,0x4B,0xE0,0xFE,0x00,0x7B,0xE0,0x7F,0xE0,0xE7,0x20,0x08,0xC0,0x00,0x00,}}, +{ 0x9DC2, {0x61,0x00,0x7B,0x00,0x7B,0xC0,0xD3,0xC0,0x72,0x40,0xFB,0xC0,0x63,0xE0,0xFE,0x00,0x6B,0xE0,0x7F,0xE0,0x47,0x20,0x48,0xC0,0x00,0x00,}}, +{ 0x9DC4, {0x19,0x00,0x73,0x00,0xAF,0xC0,0x37,0xC0,0x72,0x40,0x23,0xC0,0x73,0xE0,0x7A,0x00,0xFB,0xE0,0xFF,0xE0,0x2F,0x20,0xC8,0xC0,0x00,0x00,}}, +{ 0x9DC6, {0x6D,0x00,0x73,0x00,0x3F,0xC0,0x3F,0xC0,0x7A,0x40,0x7B,0xC0,0x7B,0xE0,0x7A,0x00,0x7F,0xE0,0x7F,0xE0,0x6F,0x20,0xC8,0xC0,0x00,0x00,}}, +{ 0x9DCF, {0x21,0x00,0xFF,0x00,0x7B,0xC0,0x7B,0xC0,0x7A,0x40,0x7B,0xC0,0x4B,0xE0,0x7A,0x00,0xFF,0xE0,0xFF,0xE0,0x2F,0x20,0xC8,0xC0,0x00,0x00,}}, +{ 0x9DD3, {0x11,0x00,0x13,0x00,0x7F,0xC0,0x6B,0xC0,0x7E,0x40,0x6B,0xC0,0x7B,0xE0,0x6A,0x00,0x7B,0xE0,0xFF,0xE0,0xFF,0x20,0x44,0xC0,0x00,0x00,}}, +{ 0x9DD9, {0x21,0x00,0xFB,0x00,0xFF,0x80,0xFF,0xA0,0xFB,0xA0,0x24,0x60,0x3F,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xE0,0x37,0x40,0x4B,0x80,0x00,0x00,}}, +{ 0x9DE6, {0x69,0x00,0x73,0x00,0xFF,0xC0,0xFB,0xC0,0x72,0x40,0x7B,0xC0,0x63,0xE0,0x7E,0x00,0x7B,0xE0,0x7F,0xE0,0x77,0x20,0x88,0xC0,0x00,0x00,}}, +{ 0x9DED, {0x19,0x00,0x6B,0x00,0x7B,0xC0,0xFF,0xC0,0x72,0x40,0x6B,0xC0,0xFB,0xE0,0x7A,0x00,0x7B,0xE0,0x7F,0xE0,0x47,0x20,0x48,0xC0,0x00,0x00,}}, +{ 0x9DEF, {0x21,0x00,0x33,0x00,0xFF,0xC0,0xEF,0xC0,0x7E,0x40,0xCB,0xC0,0x7B,0xE0,0x4A,0x00,0x7B,0xE0,0x67,0xE0,0xA7,0x20,0x28,0xC0,0x00,0x00,}}, +{ 0x9DF2, {0x21,0x80,0xFD,0xC0,0x7F,0xE0,0x7B,0xA0,0x7C,0xE0,0xFF,0x80,0x21,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xE0,0x75,0xA0,0x92,0xC0,0x00,0x00,}}, +{ 0x9DF8, {0x00,0x80,0x7D,0x80,0x19,0xC0,0xFF,0xC0,0x77,0x40,0xD1,0xC0,0x7D,0xE0,0x75,0x00,0x7D,0xE0,0x7F,0xA0,0x7F,0x20,0x4C,0xC0,0x00,0x00,}}, +{ 0x9DF9, {0x02,0x00,0x7F,0xE0,0x6F,0xE0,0x7F,0xE0,0x77,0x80,0x77,0xE0,0x6F,0x80,0x6F,0x80,0x4F,0xC0,0x4F,0xC0,0xB7,0x40,0x2B,0x80,0x00,0x00,}}, +{ 0x9DFA, {0x79,0xC0,0x4A,0x40,0x7D,0x80,0x5E,0x60,0x7B,0xC0,0xDF,0x80,0x20,0x80,0x3F,0x80,0x3F,0xC0,0x3F,0xE0,0x7A,0x40,0x95,0x80,0x00,0x00,}}, +{ 0x9DFD, {0x2A,0x80,0x66,0x80,0x6F,0x80,0x7F,0xE0,0x44,0x40,0xBF,0x00,0x3F,0x80,0x31,0x80,0x3F,0xE0,0x3F,0xE0,0x37,0x40,0x4B,0x80,0x00,0x00,}}, +{ 0x9E1A, {0x00,0x80,0x6F,0x80,0x6F,0xC0,0x6F,0xC0,0x6B,0xC0,0x6F,0xC0,0x6D,0xE0,0xD3,0x80,0xFF,0xE0,0x3B,0xA0,0x37,0x20,0x64,0xC0,0x00,0x00,}}, +{ 0x9E1B, {0x70,0x80,0xFD,0x80,0xF9,0xC0,0xFD,0xC0,0xFD,0x40,0x71,0xC0,0x7D,0xE0,0xF1,0x00,0x79,0xE0,0x7B,0xE0,0x7F,0x20,0x44,0xC0,0x00,0x00,}}, +{ 0x9E1E, {0x6E,0x80,0x7F,0xE0,0xEF,0xC0,0xFF,0xE0,0xFB,0xC0,0xFF,0xA0,0x3F,0x80,0x3F,0x80,0x3F,0xE0,0x3F,0xE0,0x37,0x40,0x4B,0x80,0x00,0x00,}}, +{ 0x9E75, {0x04,0x00,0x07,0xE0,0x7F,0xC0,0x7F,0xC0,0x45,0x40,0x71,0x40,0x4E,0xC0,0x72,0xC0,0x5D,0x40,0x5E,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x9E78, {0x20,0x80,0x38,0x80,0x21,0x40,0xFF,0xE0,0xE8,0x80,0xBB,0xE0,0xFA,0xA0,0xEA,0xA0,0xFB,0xE0,0xD9,0x80,0xFA,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9E79, {0x61,0x80,0x61,0xC0,0x7F,0xE0,0xFF,0xE0,0xFF,0xC0,0xBD,0xC0,0xEF,0xC0,0xFF,0x80,0xFF,0x80,0xED,0xE0,0xF9,0x60,0x88,0x20,0x00,0x00,}}, +{ 0x9E7D, {0x04,0x00,0x77,0xE0,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x6F,0xC0,0x7F,0xC0,0x48,0x40,0x7F,0x80,0x6A,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x9E7F, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x49,0x00,0x7F,0xC0,0x49,0x40,0x7F,0xC0,0x51,0x00,0x5F,0xC0,0x51,0x20,0x9D,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x9E81, {0x04,0x00,0x0F,0x00,0xF6,0x00,0xFF,0xE0,0x6B,0x00,0x7F,0xC0,0x69,0x40,0x7F,0xC0,0x7F,0xE0,0x5F,0x80,0x5D,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x9E88, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x7D,0x80,0x7D,0x20,0x73,0xE0,0x5F,0xC0,0x8F,0x80,0x3F,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0x9E8B, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0x5D,0x80,0x9D,0x20,0x25,0xE0,0xFF,0xE0,0xFF,0xE0,0xF5,0xE0,0x04,0x00,0x00,0x00,}}, +{ 0x9E8C, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x5F,0xE0,0xF9,0xE0,0x1F,0x80,0x71,0x80,0x7F,0x80,0xFF,0xE0,0x1B,0x80,0xE0,0xE0,0x00,0x00,}}, +{ 0x9E91, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x7F,0xC0,0xB9,0x20,0x69,0xE0,0x73,0x80,0x7B,0x80,0x7F,0x80,0x32,0x20,0xE1,0xE0,0x00,0x00,}}, +{ 0x9E92, {0x11,0x40,0x11,0x40,0x7F,0xE0,0x7F,0xE0,0x7D,0xC0,0x6D,0x40,0x7D,0xC0,0x73,0x40,0x7F,0xE0,0xF9,0x40,0xF6,0x20,0x6C,0x20,0x00,0x00,}}, +{ 0x9E93, {0x10,0x80,0xFF,0xE0,0x39,0xC0,0x56,0xA0,0xBF,0xE0,0x29,0x00,0x3F,0xC0,0x29,0x40,0x7F,0xC0,0x59,0xC0,0x9D,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x9E95, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x4F,0xA0,0xB9,0xE0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x7E,0x80,0x7F,0x80,0x60,0x80,0x00,0x00,}}, +{ 0x9E97, {0x00,0x00,0xFF,0xE0,0x7B,0xC0,0x4E,0x40,0x7F,0xE0,0x69,0x00,0x7F,0xC0,0x6B,0x40,0x7F,0xC0,0x59,0xC0,0x9D,0x20,0x21,0xE0,0x00,0x00,}}, +{ 0x9E9D, {0x02,0x00,0x7F,0xE0,0x7F,0xC0,0x7F,0xC0,0x5F,0xE0,0xB9,0xE0,0x78,0x80,0x6F,0xE0,0x7A,0x80,0xF9,0x80,0x78,0x80,0xD8,0x80,0x00,0x00,}}, +{ 0x9E9F, {0x11,0x80,0x13,0xC0,0x7F,0xE0,0x7F,0xE0,0x7F,0xC0,0x6D,0xA0,0x7D,0x40,0x7B,0xE0,0x7F,0xC0,0x6B,0xE0,0x7E,0x40,0xE4,0x40,0x00,0x00,}}, +{ 0x9EA5, {0x04,0x00,0x04,0x00,0xFF,0xE0,0x25,0x80,0x5F,0x40,0x15,0x00,0x65,0x80,0xCF,0xE0,0x79,0x00,0x47,0x00,0x19,0x00,0x60,0x00,0x00,0x00,}}, +{ 0x9EA6, {0x04,0x00,0x04,0x00,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0F,0x80,0x39,0x00,0x46,0x00,0x1B,0x00,0xE0,0xE0,0x00,0x00,}}, +{ 0x9EA9, {0x21,0x80,0x31,0x80,0xFF,0xC0,0x6B,0xC0,0xF5,0x80,0x6B,0xE0,0x65,0x80,0xB9,0x80,0x7A,0x40,0x94,0x40,0x3C,0x00,0xC3,0xE0,0x00,0x00,}}, +{ 0x9EAA, {0x20,0x00,0x37,0xE0,0xFD,0x80,0x6B,0xC0,0xF7,0xC0,0x73,0xC0,0x6B,0xC0,0xBB,0xC0,0x7A,0x40,0x90,0x40,0x38,0x40,0xC0,0x80,0x00,0x00,}}, +{ 0x9EAD, {0x21,0x00,0x31,0x00,0xFF,0xC0,0x6B,0x40,0xF7,0xC0,0x73,0xC0,0x6B,0xC0,0xBA,0x80,0x7A,0x00,0x93,0xE0,0x3C,0x00,0xC3,0xE0,0x00,0x00,}}, +{ 0x9EB8, {0x21,0x80,0x31,0x80,0xFF,0xC0,0x7B,0xC0,0x31,0x80,0xFF,0xE0,0x61,0x80,0x79,0x80,0xFA,0x40,0x14,0x40,0x3C,0x00,0xC3,0xE0,0x00,0x00,}}, +{ 0x9EB9, {0x21,0x00,0x23,0x00,0xFF,0xE0,0x7D,0xE0,0x23,0xE0,0xFD,0xA0,0x23,0xE0,0x7B,0xE0,0x5F,0xE0,0xB1,0xE0,0x3C,0x00,0xC3,0xE0,0x00,0x00,}}, +{ 0x9EBA, {0x20,0x00,0x27,0xE0,0xFA,0x00,0x77,0xE0,0x25,0x60,0xFD,0xE0,0x25,0x60,0x75,0xE0,0xD5,0x60,0x37,0xE0,0x28,0x00,0xC7,0xE0,0x00,0x00,}}, +{ 0x9EBB, {0x02,0x00,0x02,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,0x48,0x80,0x5D,0x80,0x5A,0xC0,0x6C,0xA0,0x48,0x80,0x88,0x80,0x08,0x80,0x00,0x00,}}, +{ 0x9EBC, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x7B,0xE0,0x6B,0xE0,0x6A,0x80,0x64,0x80,0x7F,0x80,0x46,0x40,0x7F,0xE0,0x80,0x20,0x00,0x00,}}, +{ 0x9EBE, {0x02,0x00,0x7F,0xE0,0x7F,0xE0,0x7F,0xE0,0x5B,0xA0,0x7D,0xE0,0x51,0x00,0x5E,0x00,0x5F,0x80,0x5F,0xE0,0x7C,0x20,0x83,0xE0,0x00,0x00,}}, +{ 0x9EBF, {0x02,0x00,0x7F,0xE0,0x48,0x80,0x7F,0xE0,0x5B,0xC0,0x7F,0xA0,0x48,0x80,0x4F,0x80,0x44,0x00,0x5F,0xC0,0x9F,0xC0,0x10,0x40,0x00,0x00,}}, +{ 0x9EC4, {0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x24,0x80,0x1F,0x00,0x31,0x80,0xC0,0x40,0x00,0x00,}}, +{ 0x9ECC, {0x2A,0x80,0x66,0x80,0x6F,0x80,0x7F,0xE0,0x53,0x40,0xFF,0x80,0x1F,0x00,0xFF,0xE0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x61,0xC0,0x00,0x00,}}, +{ 0x9ECD, {0x01,0x80,0x3E,0x00,0x04,0x00,0xFF,0xE0,0x1F,0x00,0xE4,0xE0,0x0E,0x00,0x35,0x80,0xDF,0x60,0x1F,0x00,0x64,0xC0,0x0C,0x00,0x00,0x00,}}, +{ 0x9ECE, {0x19,0x00,0x63,0x00,0xFF,0xC0,0xF9,0x40,0x7A,0x40,0xA4,0x80,0x2A,0x00,0x35,0x80,0xF7,0xE0,0x1F,0x00,0x74,0xC0,0x0C,0x00,0x00,0x00,}}, +{ 0x9ECF, {0x19,0x80,0x61,0x80,0xF9,0x80,0xF9,0xE0,0x79,0x80,0xB5,0x80,0x73,0xC0,0xFE,0x40,0x7A,0x40,0xFE,0x40,0x23,0xC0,0x22,0x40,0x00,0x00,}}, +{ 0x9ED0, {0x19,0x80,0x61,0x80,0xFF,0xE0,0xFF,0xC0,0x7B,0xC0,0xA7,0x40,0x73,0xC0,0xF9,0x80,0xF7,0xE0,0xFF,0xE0,0x24,0x20,0x24,0x60,0x00,0x00,}}, +{ 0x9ED2, {0x00,0x00,0x3F,0x80,0x24,0x80,0x3F,0x80,0x3F,0x80,0x04,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x12,0x40,0x49,0x20,0x89,0x20,0x00,0x00,}}, +{ 0x9ED4, {0x01,0x80,0x7D,0x80,0x7D,0x80,0x7D,0x80,0x7E,0x40,0x11,0xA0,0x7C,0x00,0x1B,0x80,0xE0,0x80,0x7C,0x80,0x74,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x9ED8, {0x00,0x80,0x7E,0xC0,0x7E,0xA0,0x7A,0x80,0x7F,0xE0,0x10,0x80,0x7E,0x80,0x10,0x80,0xFE,0xC0,0xF5,0xC0,0x7B,0x20,0x82,0x20,0x00,0x00,}}, +{ 0x9ED9, {0x00,0x80,0x7C,0xC0,0x54,0xA0,0x7F,0xE0,0x7C,0x80,0x10,0x80,0x7D,0x80,0x1A,0x40,0xF0,0x20,0x2A,0x40,0x49,0x20,0x80,0x20,0x00,0x00,}}, +{ 0x9EDB, {0x0A,0x80,0x13,0xE0,0xFF,0x00,0xA0,0xE0,0x3F,0xE0,0x64,0x80,0x7F,0x80,0x7F,0xC0,0x7F,0xC0,0xFF,0xE0,0xD2,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x9EDC, {0x00,0xC0,0x3E,0xC0,0x3F,0xE0,0x3F,0xE0,0x3F,0xE0,0x09,0xE0,0x3E,0xC0,0x0D,0xE0,0x71,0xE0,0x3F,0xE0,0x3B,0xE0,0x41,0x20,0x00,0x00,}}, +{ 0x9EDD, {0x02,0x80,0x7A,0x80,0x7A,0x80,0x7E,0x80,0x7D,0xE0,0x23,0xA0,0x7A,0xA0,0x33,0xA0,0xFF,0xA0,0x7F,0xA0,0x79,0x20,0x82,0xC0,0x00,0x00,}}, +{ 0x9EDE, {0x01,0x80,0x7D,0x80,0x7D,0xE0,0x7D,0xE0,0x7D,0x80,0x11,0x80,0x7F,0xC0,0x1A,0x40,0xE2,0x40,0x7E,0x40,0x77,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9EE0, {0x01,0x80,0x7D,0x80,0x7F,0xE0,0x7F,0xE0,0x7D,0x80,0x13,0xC0,0x7C,0x00,0x1B,0xC0,0xE2,0x40,0x7E,0x40,0x77,0xC0,0x82,0x40,0x00,0x00,}}, +{ 0x9EE5, {0x00,0x80,0x7C,0xC0,0x7F,0xE0,0x7D,0xC0,0x7D,0x40,0x11,0x40,0x7D,0xC0,0x18,0xC0,0xE1,0xE0,0x7E,0xA0,0x74,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x9EE8, {0x25,0x00,0x17,0x00,0x7F,0xE0,0x9F,0x00,0x3F,0x80,0x65,0x80,0x75,0x80,0x7F,0xC0,0x7F,0xC0,0xFF,0xE0,0xD2,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x9EEF, {0x01,0x80,0x7D,0x80,0x7F,0xE0,0x7D,0xC0,0x7F,0xE0,0x10,0x00,0x7D,0xC0,0x19,0x40,0xE1,0xC0,0x7D,0x40,0x75,0xC0,0x81,0x40,0x00,0x00,}}, +{ 0x9EF4, {0x69,0x80,0x7B,0x80,0xFF,0x80,0x7F,0xE0,0x7F,0xC0,0x7B,0xC0,0xFE,0xC0,0x7E,0xC0,0x7E,0xC0,0x7F,0xC0,0x7F,0x20,0x62,0x20,0x00,0x00,}}, +{ 0x9EF6, {0x00,0x00,0x7F,0xE0,0x7D,0xE0,0x7F,0xE0,0x7E,0x80,0xBF,0x40,0x3F,0xA0,0x37,0x80,0x3F,0x80,0xFF,0xE0,0xD2,0x40,0x89,0x20,0x00,0x00,}}, +{ 0x9EF7, {0x01,0x80,0x7F,0xE0,0x7B,0xC0,0x7F,0xE0,0x7F,0xE0,0x27,0xE0,0x7B,0xC0,0x32,0x40,0xFB,0xC0,0x7B,0xC0,0x73,0x40,0x8C,0x20,0x00,0x00,}}, +{ 0x9EF9, {0x0A,0x00,0x2A,0x80,0xFF,0xE0,0xFF,0xE0,0x64,0x40,0x7F,0xA0,0xE4,0xA0,0x75,0x80,0x75,0x80,0x75,0x80,0x64,0x80,0x64,0x80,0x00,0x00,}}, +{ 0x9EFB, {0x71,0x80,0xF5,0xC0,0xF9,0xC0,0xFF,0xE0,0x65,0x80,0xFD,0xC0,0x69,0xC0,0x79,0xC0,0x7B,0x80,0x7C,0x80,0x6B,0x40,0x5C,0x20,0x00,0x00,}}, +{ 0x9EFC, {0x71,0xC0,0xF5,0xA0,0xFF,0xE0,0xFF,0xC0,0x67,0xC0,0xFF,0xC0,0x6B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x6B,0xC0,0x5A,0xC0,0x00,0x00,}}, +{ 0x9EFD, {0x00,0x00,0x7F,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x7B,0xC0,0x7B,0xC0,0x08,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x9F07, {0x21,0x80,0xF9,0x80,0xFF,0xE0,0xFF,0xC0,0x79,0x80,0x5B,0x60,0xFF,0x80,0x7B,0xC0,0x7B,0xC0,0x7B,0xC0,0x7B,0xE0,0x47,0xE0,0x00,0x00,}}, +{ 0x9F08, {0x69,0x00,0xB7,0xE0,0xFF,0x40,0xFD,0xC0,0xA7,0x60,0x3F,0x80,0x7B,0x80,0x4B,0xC0,0x6B,0xC0,0x6B,0xC0,0x4A,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x9F0E, {0x00,0x00,0x1F,0x00,0x51,0x40,0x5F,0x40,0x5F,0x40,0x5F,0x40,0x7B,0xC0,0x0A,0x00,0xFB,0xE0,0x6A,0x80,0x4A,0x80,0x8A,0x80,0x00,0x00,}}, +{ 0x9F13, {0x20,0x80,0x20,0x80,0xFF,0xE0,0x78,0x80,0x07,0xC0,0x7A,0x40,0x4A,0x40,0x79,0x80,0x11,0x80,0x59,0x80,0x32,0x40,0xCC,0x20,0x00,0x00,}}, +{ 0x9F15, {0x21,0x80,0xFF,0xE0,0x7B,0xC0,0x7B,0xC0,0x79,0x80,0x3E,0x60,0xCF,0x00,0x1B,0x00,0x3F,0x00,0xFF,0xE0,0x03,0x00,0x1C,0x00,0x00,0x00,}}, +{ 0x9F20, {0x0C,0x00,0x73,0x80,0x7B,0x80,0x7B,0x80,0x7F,0x80,0x00,0x00,0x75,0x80,0x6C,0x80,0x76,0x80,0x55,0x60,0x76,0x60,0xD8,0x20,0x00,0x00,}}, +{ 0x9F21, {0x08,0x80,0x24,0x80,0x25,0x00,0x3F,0x80,0x64,0x80,0x64,0x80,0x7F,0x80,0x64,0x80,0x7F,0x80,0x7F,0xE0,0x44,0x60,0x84,0x20,0x00,0x00,}}, +{ 0x9F2C, {0x21,0x80,0x59,0x80,0x4B,0xC0,0x4B,0xC0,0x7B,0xC0,0x6B,0xC0,0x6B,0xC0,0x7B,0xC0,0x7F,0xC0,0x74,0x20,0x7B,0x20,0xA1,0xE0,0x00,0x00,}}, +{ 0x9F3B, {0x08,0x00,0x3F,0x80,0x20,0x80,0x3F,0x80,0x3F,0x80,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x7F,0xC0,0xFF,0xE0,0x11,0x00,0x21,0x00,0x00,0x00,}}, +{ 0x9F3E, {0x20,0x00,0x7B,0xC0,0x79,0x80,0x79,0x80,0x79,0x80,0x7F,0xE0,0x7D,0x80,0x55,0x80,0xFD,0x80,0xFD,0x80,0x69,0x80,0x49,0x80,0x00,0x00,}}, +{ 0x9F4A, {0x04,0x00,0xFF,0xE0,0xFF,0xC0,0xF5,0x80,0x75,0x80,0x77,0xC0,0xA1,0xA0,0x3F,0x80,0x3F,0x80,0x3F,0x80,0x21,0x80,0x41,0x80,0x00,0x00,}}, +{ 0x9F4B, {0x04,0x00,0xFF,0xE0,0xFF,0xC0,0xF5,0x80,0x75,0x80,0x77,0xC0,0xE0,0xA0,0x7F,0x80,0x7F,0x80,0x7F,0x80,0x55,0x80,0xA4,0x80,0x00,0x00,}}, +{ 0x9F4E, {0x04,0x00,0xFF,0xE0,0x7F,0xC0,0x75,0xC0,0x7F,0xE0,0xFF,0x80,0x7F,0x80,0x73,0x80,0x7F,0x80,0x7F,0x80,0x4A,0x80,0xB1,0x80,0x00,0x00,}}, +{ 0x9F4F, {0x04,0x00,0xFF,0xE0,0x7F,0xC0,0x75,0xC0,0xE4,0xE0,0x7F,0x80,0x7F,0x80,0x6A,0x80,0x7B,0x80,0x7B,0x80,0x7F,0x80,0x80,0x80,0x00,0x00,}}, +{ 0x9F52, {0x04,0x00,0x24,0x00,0x27,0x80,0xFF,0xE0,0xD3,0x40,0x6B,0x40,0x6D,0xC0,0x7F,0xC0,0x5B,0x40,0x6D,0xC0,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x9F54, {0x11,0x80,0x71,0x80,0x7F,0x80,0xFF,0xA0,0xFB,0xA0,0x6B,0xC0,0x77,0x80,0x7F,0x80,0x6B,0x80,0x7F,0xA0,0x7F,0xA0,0x42,0xE0,0x00,0x00,}}, +{ 0x9F5F, {0x10,0x00,0x71,0xC0,0x7D,0x40,0xFF,0x40,0xFF,0xC0,0x6D,0x40,0x75,0x40,0x7D,0xC0,0x6D,0x40,0x7D,0x40,0x7F,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x9F60, {0x08,0x00,0x39,0xE0,0x3E,0xE0,0x7F,0xE0,0x7F,0xA0,0x37,0xC0,0x3A,0x00,0x3E,0xE0,0x36,0xA0,0x3E,0xA0,0x3E,0xE0,0x22,0xA0,0x00,0x00,}}, +{ 0x9F61, {0x11,0x80,0x71,0x80,0x7D,0x80,0xFE,0x40,0xFF,0xE0,0x6C,0x00,0x77,0xC0,0x7D,0xC0,0x6D,0xC0,0x7D,0x80,0x7D,0x80,0x45,0x80,0x00,0x00,}}, +{ 0x9F62, {0x10,0x80,0x5C,0x80,0x51,0x40,0xFE,0x20,0x57,0xE0,0x76,0x00,0x5B,0xE0,0x7E,0xA0,0x7A,0xA0,0x56,0xC0,0x7E,0x80,0x42,0x80,0x00,0x00,}}, +{ 0x9F63, {0x08,0x80,0x38,0x80,0x3E,0xE0,0x7F,0xE0,0x7F,0xA0,0x37,0xE0,0x3B,0xE0,0x3F,0xE0,0x37,0x20,0x3E,0x20,0x3E,0x20,0x22,0x40,0x00,0x00,}}, +{ 0x9F66, {0x10,0x00,0x71,0xC0,0x7D,0x40,0xFF,0xC0,0xFF,0x40,0x6D,0x40,0x75,0xC0,0x7D,0xA0,0x6D,0xC0,0x7D,0x80,0x7D,0xC0,0x46,0x20,0x00,0x00,}}, +{ 0x9F67, {0x20,0x00,0xFF,0xC0,0x7A,0x40,0xFC,0xC0,0x27,0x80,0xFF,0xE0,0x59,0x40,0x77,0xC0,0x7F,0xC0,0x5F,0x40,0x7F,0xC0,0x40,0x40,0x00,0x00,}}, +{ 0x9F6A, {0x10,0x00,0x71,0xC0,0x7D,0x40,0xFF,0x40,0xFF,0xC0,0x6C,0x80,0x75,0x80,0x7D,0xE0,0x6D,0x80,0x7D,0x80,0x7E,0x80,0x44,0x60,0x00,0x00,}}, +{ 0x9F6C, {0x10,0x00,0x73,0xE0,0x7D,0x80,0xFF,0xC0,0xFF,0x40,0x6D,0x40,0x77,0xE0,0x7C,0x00,0x6D,0xC0,0x7D,0x40,0x7D,0xC0,0x45,0x40,0x00,0x00,}}, +{ 0x9F72, {0x10,0xC0,0x73,0x80,0x7F,0xC0,0xFF,0xC0,0xFF,0xC0,0x6F,0xC0,0x75,0x80,0x7F,0xE0,0x6F,0xE0,0x7F,0xE0,0x7E,0x20,0x46,0x60,0x00,0x00,}}, +{ 0x9F76, {0x10,0x00,0x73,0xE0,0x7F,0xE0,0xFF,0xE0,0xFD,0xC0,0x6C,0x00,0x77,0xE0,0x7D,0x80,0x6D,0xC0,0x7C,0x40,0x7C,0x40,0x44,0x80,0x00,0x00,}}, +{ 0x9F77, {0x10,0x00,0x71,0xC0,0x7D,0xC0,0xFF,0xC0,0xFF,0xE0,0x6D,0xC0,0x75,0xA0,0x7D,0xE0,0x6D,0xE0,0x7F,0xE0,0x7F,0xE0,0x44,0x00,0x00,0x00,}}, +{ 0x9F8D, {0x22,0x00,0x23,0xC0,0xFB,0xC0,0x50,0x40,0xFB,0xC0,0x02,0x00,0x7B,0xC0,0x4A,0x00,0x7B,0xC0,0x7B,0xC0,0x4A,0x20,0x59,0xE0,0x00,0x00,}}, +{ 0x9F95, {0x04,0x00,0x0A,0x00,0xFF,0xE0,0xFF,0xE0,0x3F,0x80,0x7F,0xC0,0x6B,0x80,0xFC,0x80,0x7B,0x80,0x7B,0x80,0x6B,0xA0,0x79,0xE0,0x00,0x00,}}, +{ 0x9F9C, {0x08,0x00,0x1F,0x00,0xFF,0x80,0xFF,0x80,0x7B,0x80,0x6A,0x00,0xFB,0xC0,0x6B,0xC0,0xFB,0xC0,0xFB,0xE0,0x6A,0x20,0x07,0xE0,0x00,0x00,}}, +{ 0x9F9D, {0x11,0x00,0x37,0x80,0xFF,0xC0,0x6F,0xC0,0xFF,0xC0,0x6F,0x80,0x7F,0xE0,0xFF,0xE0,0xFF,0xE0,0x7F,0xE0,0x6E,0x20,0x61,0xE0,0x00,0x00,}}, +{ 0x9FA0, {0x04,0x00,0x0A,0x00,0x3F,0x80,0xFF,0xE0,0xEE,0xC0,0x6B,0xC0,0x6E,0xC0,0x00,0x00,0x7F,0x80,0x7F,0x80,0x6A,0x80,0x6A,0x80,0x00,0x00,}}, +{ 0xAC00, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAC01, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAC02, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAC03, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAC04, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC05, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAC06, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAC07, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC08, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC09, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAC0A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC0B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC0C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC0D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC0E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC0F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAC10, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC11, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC12, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAC13, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xAC14, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAC15, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAC16, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC17, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC18, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC19, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC1A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAC1B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAC1C, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0x20,0x05,0x20,0x05,0x20,0x09,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xAC1D, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAC1E, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAC1F, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAC20, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC21, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAC22, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAC23, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC24, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC25, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAC26, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC27, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC28, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC29, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC2A, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC2B, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAC2C, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC2D, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC2E, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC2F, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xAC30, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xAC31, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC32, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC33, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC34, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC35, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC36, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAC37, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAC38, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x02,0x40,0x02,0x40,0x04,0x40,0x04,0x70,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAC39, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAC3A, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAC3B, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAC3C, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC3D, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAC3E, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAC3F, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC40, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC41, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAC42, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC43, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC44, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC45, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC46, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC47, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAC48, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC49, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC4A, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAC4B, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xAC4C, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAC4D, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAC4E, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC4F, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC50, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC51, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC52, {0x00,0x00,0x7E,0x40,0x02,0x70,0x02,0x40,0x04,0x70,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAC53, {0x00,0x00,0x7E,0x40,0x02,0x70,0x04,0x40,0x18,0x70,0x60,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAC54, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x05,0x20,0x09,0x20,0x09,0xE0,0x11,0x20,0x61,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xAC55, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAC56, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAC57, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAC58, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC59, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAC5A, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAC5B, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC5C, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC5D, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAC5E, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC5F, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC60, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC61, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC62, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC63, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAC64, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC65, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC66, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC67, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xAC68, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xAC69, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC6A, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC6B, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC6C, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC6D, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC6E, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x05,0x20,0x19,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAC6F, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x19,0x20,0x61,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAC70, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAC71, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAC72, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAC73, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAC74, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC75, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAC76, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAC77, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC78, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC79, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAC7A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC7B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC7C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC7D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC7E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC7F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAC80, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC81, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC82, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAC83, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAC84, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAC85, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAC86, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC87, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAC88, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC89, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAC8A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAC8B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAC8C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xA0,0x04,0xA0,0x07,0xA0,0x08,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xAC8D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAC8E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAC8F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAC90, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC91, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAC92, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAC93, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC94, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC95, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAC96, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC97, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC98, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC99, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC9A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC9B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAC9C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC9D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAC9E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAC9F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xACA0, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xACA1, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xACA2, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xACA3, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xACA4, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACA5, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACA6, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xACA7, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x18,0xA0,0x60,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xACA8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x02,0x40,0x02,0x40,0x05,0xC0,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xACA9, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xACAA, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xACAB, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xACAC, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xACAD, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xACAE, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xACAF, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xACB0, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xACB1, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xACB2, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xACB3, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xACB4, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xACB5, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACB6, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xACB7, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xACB8, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xACB9, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xACBA, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xACBB, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xACBC, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xACBD, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xACBE, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xACBF, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xACC0, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xACC1, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xACC2, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x02,0x40,0x05,0xC0,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xACC3, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x04,0x40,0x19,0xC0,0x60,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xACC4, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x04,0xA0,0x04,0xA0,0x0B,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xACC5, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xACC6, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xACC7, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xACC8, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACC9, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xACCA, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xACCB, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACCC, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACCD, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xACCE, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xACCF, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xACD0, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xACD1, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACD2, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xACD3, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xACD4, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xACD5, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xACD6, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xACD7, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xACD8, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xACD9, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xACDA, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xACDB, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xACDC, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACDD, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xACDE, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x04,0xA0,0x07,0xA0,0x18,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xACDF, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x04,0xA0,0x19,0xA0,0x60,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xACE0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xACE1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xACE2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xACE3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xACE4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x04,0x40,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xACE5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xACE6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xACE7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xACE8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xACE9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xACEA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xACEB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xACEC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xACED, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xACEE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xACEF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xACF0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xACF1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xACF2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xACF3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xACF4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xACF5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xACF6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xACF7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xACF8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xACF9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xACFA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xACFB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xACFC, {0x00,0x00,0x7F,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x11,0x70,0x11,0x40,0x11,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xACFD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xACFE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xACFF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAD00, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x70,0x0A,0x40,0x7F,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD01, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAD02, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD03, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD04, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD05, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAD06, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD07, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD08, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD09, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD0A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD0B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD0C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD0D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD0E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD0F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAD10, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAD11, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAD12, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD13, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD14, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD15, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD16, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x70,0x12,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAD17, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAD18, {0x00,0x00,0x7E,0xA0,0x02,0xA0,0x02,0xA0,0x02,0xA0,0x22,0xE0,0x22,0xA0,0x22,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xAD19, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAD1A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAD1B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAD1C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x04,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD1D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAD1E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAD1F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD20, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD21, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAD22, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD23, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD24, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD25, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD26, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD27, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD28, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD29, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD2A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD2B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD2C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAD2D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD2E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD2F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD30, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD31, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD32, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAD33, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x24,0xE0,0x20,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAD34, {0x00,0x00,0x7F,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAD35, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAD36, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAD37, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAD38, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x0A,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD39, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAD3A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD3B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD3C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD3D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAD3E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD3F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD40, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD41, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD42, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD43, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD44, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD45, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD46, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD47, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAD48, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAD49, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAD4A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD4B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD4C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD4D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD4E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAD4F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x12,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAD50, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xAD51, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAD52, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAD53, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xAD54, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x11,0x40,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD55, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xAD56, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAD57, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD58, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD59, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xAD5A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD5B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD5C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAD5D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD5E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD5F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAD60, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD61, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD62, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAD63, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAD64, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xAD65, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xAD66, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xAD67, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAD68, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD69, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD6A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xAD6B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x22,0x40,0x22,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xAD6C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xAD6D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAD6E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAD6F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xAD70, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x44,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD71, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xAD72, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAD73, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD74, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD75, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xAD76, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD77, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD78, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAD79, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD7A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD7B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAD7C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD7D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD7E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAD7F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAD80, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xAD81, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xAD82, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xAD83, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAD84, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD85, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAD86, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xAD87, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xAD88, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xAD89, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAD8A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAD8B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAD8C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD8D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAD8E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD8F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD90, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD91, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAD92, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD93, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD94, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD95, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD96, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAD97, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAD98, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD99, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAD9A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAD9B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAD9C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAD9D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAD9E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAD9F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xADA0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADA1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADA2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xADA3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0xC0,0x02,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xADA4, {0x00,0x00,0x7E,0xA0,0x02,0xA0,0x02,0xA0,0x02,0xA0,0x02,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xADA5, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xADA6, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xADA7, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xADA8, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADA9, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xADAA, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xADAB, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADAC, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADAD, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xADAE, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xADAF, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xADB0, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xADB1, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADB2, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xADB3, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xADB4, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xADB5, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xADB6, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xADB7, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xADB8, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xADB9, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xADBA, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xADBB, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xADBC, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADBD, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADBE, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xADBF, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x05,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xADC0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xADC1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xADC2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xADC3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xADC4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADC5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xADC6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xADC7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADC8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADC9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xADCA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xADCB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xADCC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xADCD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xADCE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xADCF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xADD0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xADD1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xADD2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xADD3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xADD4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xADD5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xADD6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xADD7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xADD8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADD9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xADDA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xADDB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xADDC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xADDD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xADDE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xADDF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xADE0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADE1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xADE2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xADE3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADE4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADE5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xADE6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xADE7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xADE8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xADE9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADEA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xADEB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xADEC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xADED, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xADEE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xADEF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xADF0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xADF1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xADF2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xADF3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xADF4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADF5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADF6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xADF7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xADF8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xADF9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xADFA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xADFB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xADFC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xADFD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xADFE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xADFF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE00, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE01, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xAE02, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE03, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE04, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAE05, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE06, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE07, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAE08, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE09, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE0A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAE0B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAE0C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xAE0D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xAE0E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xAE0F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAE10, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE11, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAE12, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xAE13, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xAE14, {0x00,0x00,0x7F,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE15, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE16, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAE17, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAE18, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE19, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAE1A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAE1B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE1C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE1D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAE1E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE1F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE20, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE21, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE22, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE23, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAE24, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE25, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE26, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE27, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAE28, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAE29, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAE2A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE2B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE2C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE2D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE2E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAE2F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAE30, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE31, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE32, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAE33, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAE34, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE35, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAE36, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAE37, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE38, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE39, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAE3A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE3B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE3C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE3D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE3E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE3F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAE40, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE41, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE42, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAE43, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xAE44, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAE45, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAE46, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE47, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE48, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE49, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE4A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAE4B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x04,0x40,0x18,0x40,0x60,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAE4C, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x11,0x70,0x11,0x40,0x21,0x40,0x22,0x40,0x42,0x40,0x04,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE4D, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE4E, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAE4F, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAE50, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE51, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAE52, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAE53, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE54, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE55, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAE56, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE57, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE58, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE59, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE5A, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE5B, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAE5C, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE5D, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE5E, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAE5F, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xAE60, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAE61, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAE62, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE63, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE64, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE65, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE66, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAE67, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAE68, {0x00,0x00,0xFD,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x25,0x20,0x25,0xE0,0x45,0x20,0x49,0x20,0x89,0x20,0x11,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xAE69, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAE6A, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAE6B, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAE6C, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE6D, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAE6E, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAE6F, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE70, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE71, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAE72, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE73, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE74, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE75, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE76, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE77, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAE78, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE79, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE7A, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE7B, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xAE7C, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xAE7D, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE7E, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE7F, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE80, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE81, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE82, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAE83, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAE84, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x70,0x11,0x40,0x11,0x40,0x11,0x40,0x21,0x70,0x22,0x40,0x42,0x40,0x04,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE85, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAE86, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAE87, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAE88, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE89, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAE8A, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAE8B, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE8C, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE8D, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAE8E, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE8F, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE90, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAE91, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE92, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAE93, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAE94, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE95, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE96, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAE97, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xAE98, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAE99, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAE9A, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE9B, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAE9C, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE9D, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAE9E, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x70,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAE9F, {0x00,0x00,0x7E,0x40,0x12,0x70,0x12,0x40,0x22,0x70,0x44,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAEA0, {0x00,0x00,0xFD,0x20,0x25,0x20,0x25,0xE0,0x25,0x20,0x25,0x20,0x25,0x20,0x45,0xE0,0x49,0x20,0x89,0x20,0x11,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xAEA1, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAEA2, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAEA3, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAEA4, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEA5, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAEA6, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAEA7, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEA8, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEA9, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAEAA, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEAB, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEAC, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAEAD, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEAE, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEAF, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAEB0, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEB1, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEB2, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAEB3, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xAEB4, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xAEB5, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEB6, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAEB7, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAEB8, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEB9, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEBA, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x11,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAEBB, {0x00,0x00,0x7F,0x20,0x13,0x20,0x13,0xE0,0x25,0x20,0x49,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAEBC, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0xC0,0x11,0x40,0x11,0x40,0x21,0x40,0x22,0x40,0x42,0x40,0x04,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAEBD, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAEBE, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAEBF, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAEC0, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEC1, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAEC2, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAEC3, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEC4, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEC5, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAEC6, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEC7, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEC8, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAEC9, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAECA, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAECB, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAECC, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAECD, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAECE, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAECF, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAED0, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAED1, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAED2, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAED3, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAED4, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAED5, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAED6, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAED7, {0x00,0x00,0x7E,0x40,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAED8, {0x00,0x00,0xFC,0xA0,0x24,0xA0,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x44,0xA0,0x48,0xA0,0x88,0xA0,0x10,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xAED9, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAEDA, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAEDB, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAEDC, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEDD, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAEDE, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAEDF, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE0, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE1, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAEE2, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE3, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE4, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAEE5, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE6, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE7, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAEE8, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEE9, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEEA, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAEEB, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xAEEC, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xAEED, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEEE, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAEEF, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAEF0, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEF1, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAEF2, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAEF3, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x24,0xA0,0x48,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAEF4, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0xC0,0x11,0x40,0x11,0x40,0x11,0xC0,0x21,0x40,0x22,0x40,0x42,0x40,0x04,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAEF5, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAEF6, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAEF7, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAEF8, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEF9, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAEFA, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xAEFB, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEFC, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEFD, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAEFE, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAEFF, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF00, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF01, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF02, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF03, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF04, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF05, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF06, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xAF07, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAF08, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAF09, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAF0A, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF0B, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF0C, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF0D, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF0E, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x13,0xC0,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAF0F, {0x00,0x00,0x7E,0x40,0x13,0xC0,0x12,0x40,0x23,0xC0,0x44,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAF10, {0x00,0x00,0xFC,0xA0,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x44,0xA0,0x48,0xA0,0x88,0xA0,0x10,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xAF11, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAF12, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAF13, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAF14, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF15, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAF16, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAF17, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF18, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF19, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAF1A, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF1B, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF1C, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF1D, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF1E, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF1F, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF20, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF21, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF22, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF23, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xAF24, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xAF25, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF26, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF27, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF28, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF29, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF2A, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x10,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAF2B, {0x00,0x00,0x7E,0xA0,0x13,0xA0,0x12,0xA0,0x27,0xA0,0x48,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAF2C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0x44,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xAF2D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAF2E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAF2F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xAF30, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF31, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xAF32, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAF33, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF34, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF35, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xAF36, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF37, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF38, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAF39, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF3A, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF3B, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAF3C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF3D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF3E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAF3F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAF40, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xAF41, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xAF42, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xAF43, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAF44, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF45, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAF46, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xAF47, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x24,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xAF48, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x21,0x70,0x41,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAF49, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAF4A, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAF4B, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAF4C, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF4D, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAF4E, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF4F, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF50, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF51, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAF52, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF53, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF54, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF55, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF56, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF57, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF58, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF59, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF5A, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF5B, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAF5C, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAF5D, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAF5E, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF5F, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF60, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF61, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF62, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAF63, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAF64, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x12,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xAF65, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAF66, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAF67, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAF68, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF69, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAF6A, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAF6B, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF6C, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF6D, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAF6E, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF6F, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF70, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF71, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF72, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF73, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF74, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF75, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF76, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF77, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF78, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAF79, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF7A, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF7B, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF7C, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF7D, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF7E, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAF7F, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x22,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAF80, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAF81, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAF82, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAF83, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAF84, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF85, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAF86, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF87, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF88, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF89, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAF8A, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF8B, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF8C, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF8D, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF8E, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAF8F, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAF90, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF91, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF92, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAF93, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAF94, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAF95, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAF96, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF97, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAF98, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF99, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAF9A, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAF9B, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAF9C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0x51,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xAF9D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAF9E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAF9F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xAFA0, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFA1, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xAFA2, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAFA3, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFA4, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFA5, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xAFA6, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFA7, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFA8, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAFA9, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFAA, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFAB, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAFAC, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFAD, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFAE, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAFAF, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAFB0, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xAFB1, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xAFB2, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xAFB3, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAFB4, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFB5, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFB6, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xAFB7, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x31,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xAFB8, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xAFB9, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAFBA, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAFBB, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xAFBC, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFBD, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xAFBE, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAFBF, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC0, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC1, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xAFC2, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC3, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC4, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAFC5, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC6, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC7, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xAFC8, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFC9, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFCA, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xAFCB, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAFCC, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xAFCD, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xAFCE, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xAFCF, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xAFD0, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFD1, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xAFD2, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xAFD3, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xAFD4, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xAFD5, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xAFD6, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xAFD7, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAFD8, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFD9, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xAFDA, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAFDB, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFDC, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFDD, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xAFDE, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFDF, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFE0, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAFE1, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFE2, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFE3, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xAFE4, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFE5, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFE6, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAFE7, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xAFE8, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xAFE9, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xAFEA, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAFEB, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xAFEC, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFED, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xAFEE, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xAFEF, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xAFF0, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x12,0xA0,0x12,0xA0,0x12,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xAFF1, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xAFF2, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xAFF3, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xAFF4, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFF5, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xAFF6, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xAFF7, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFF8, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFF9, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xAFFA, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFFB, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFFC, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xAFFD, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFFE, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xAFFF, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB000, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB001, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB002, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB003, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB004, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB005, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB006, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB007, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB008, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB009, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB00A, {0x00,0x00,0x7C,0xA0,0x14,0xA0,0x15,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB00B, {0x00,0x00,0x7E,0xA0,0x12,0xA0,0x13,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB00C, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB00D, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB00E, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB00F, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB010, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB011, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB012, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB013, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB014, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB015, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB016, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB017, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB018, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB019, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB01A, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB01B, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB01C, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB01D, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB01E, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB01F, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB020, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB021, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB022, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB023, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB024, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB025, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB026, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB027, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB028, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xB029, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB02A, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB02B, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB02C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB02D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB02E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB02F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB030, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB031, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB032, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB033, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB034, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB035, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB036, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB037, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB038, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB039, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB03A, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB03B, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB03C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB03D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB03E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB03F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB040, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB041, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB042, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB043, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB044, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0x40,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB045, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB046, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB047, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB048, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB049, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB04A, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB04B, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB04C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB04D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB04E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB04F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB050, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB051, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB052, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB053, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB054, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB055, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB056, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB057, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB058, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB059, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB05A, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB05B, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB05C, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB05D, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB05E, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB05F, {0x00,0x00,0x7B,0xC0,0x08,0x40,0x10,0x40,0x20,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB060, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB061, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB062, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB063, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB064, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB065, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB066, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB067, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB068, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB069, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB06A, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB06B, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB06C, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB06D, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB06E, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB06F, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB070, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB071, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB072, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB073, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB074, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB075, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB076, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB077, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB078, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB079, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB07A, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB07B, {0x00,0x00,0x77,0x40,0x11,0x40,0x21,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB07C, {0x00,0x00,0x77,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x11,0x40,0x21,0x40,0x22,0x40,0x42,0x40,0x04,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB07D, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB07E, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB07F, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB080, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB081, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB082, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB083, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB084, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB085, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB086, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB087, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB088, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB089, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB08A, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB08B, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB08C, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB08D, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB08E, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB08F, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB090, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB091, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB092, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB093, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB094, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB095, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB096, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB097, {0x00,0x00,0x7E,0x40,0x12,0x40,0x12,0x40,0x22,0x40,0x44,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB098, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB099, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB09A, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB09B, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB09C, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB09D, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB09E, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB09F, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0A0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0A1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB0A2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0A3, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0A4, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB0A5, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0A6, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0A7, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB0A8, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0A9, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0AA, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB0AB, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB0AC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB0AD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB0AE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB0AF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB0B0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0B1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0B2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB0B3, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB0B4, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB0B5, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB0B6, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB0B7, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB0B8, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0B9, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB0BA, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB0BB, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0BC, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0BD, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB0BE, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0BF, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0C0, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB0C1, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0C2, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0C3, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB0C4, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0C5, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0C6, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB0C7, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB0C8, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB0C9, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0CA, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB0CB, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB0CC, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0CD, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0CE, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB0CF, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB0D0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB0D1, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB0D2, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB0D3, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB0D4, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0D5, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB0D6, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB0D7, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0D8, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0D9, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB0DA, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0DB, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0DC, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB0DD, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0DE, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0DF, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB0E0, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0E1, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0E2, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB0E3, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB0E4, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB0E5, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB0E6, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB0E7, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB0E8, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0E9, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB0EA, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB0EB, {0x00,0x00,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB0EC, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0xE0,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB0ED, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB0EE, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB0EF, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB0F0, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0F1, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB0F2, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB0F3, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0F4, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0F5, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB0F6, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0F7, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0F8, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB0F9, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0FA, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0FB, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB0FC, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0FD, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB0FE, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB0FF, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB100, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB101, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB102, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB103, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB104, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB105, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB106, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB107, {0x00,0x00,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB108, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB109, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB10A, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB10B, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB10C, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB10D, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB10E, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB10F, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB110, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB111, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB112, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB113, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB114, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB115, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB116, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB117, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB118, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB119, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB11A, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB11B, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB11C, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB11D, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB11E, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB11F, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB120, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB121, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB122, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB123, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB124, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB125, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB126, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB127, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB128, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB129, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB12A, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB12B, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB12C, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB12D, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB12E, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB12F, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB130, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB131, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB132, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB133, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB134, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB135, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB136, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB137, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB138, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB139, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB13A, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB13B, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB13C, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB13D, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB13E, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB13F, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB140, {0x00,0x00,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB141, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB142, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB143, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB144, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB145, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB146, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB147, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB148, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB149, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB14A, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB14B, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB14C, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB14D, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB14E, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB14F, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB150, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB151, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB152, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB153, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB154, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB155, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB156, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB157, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB158, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB159, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB15A, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB15B, {0x00,0x00,0x40,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB15C, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB15D, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB15E, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB15F, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB160, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB161, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB162, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB163, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB164, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB165, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB166, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB167, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB168, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB169, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB16A, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB16B, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB16C, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB16D, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB16E, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB16F, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB170, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB171, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB172, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB173, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB174, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB175, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB176, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB177, {0x00,0x00,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB178, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB179, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB17A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB17B, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB17C, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB17D, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB17E, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB17F, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB180, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB181, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB182, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB183, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB184, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB185, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB186, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB187, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB188, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB189, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB18A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB18B, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB18C, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB18D, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB18E, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB18F, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB190, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB191, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB192, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB193, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB194, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB195, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB196, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB197, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB198, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB199, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB19A, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB19B, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB19C, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB19D, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB19E, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB19F, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1A0, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB1A1, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1A2, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1A3, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB1A4, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1A5, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1A6, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB1A7, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB1A8, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB1A9, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB1AA, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1AB, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1AC, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1AD, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1AE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB1AF, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB1B0, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB1B1, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB1B2, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB1B3, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB1B4, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1B5, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB1B6, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB1B7, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1B8, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1B9, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB1BA, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1BB, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1BC, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB1BD, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1BE, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1BF, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB1C0, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1C1, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1C2, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB1C3, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1C4, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB1C5, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1C6, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1C7, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1C8, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1C9, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1CA, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB1CB, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB1CC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB1CD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB1CE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB1CF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB1D0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1D1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB1D2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB1D3, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1D4, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1D5, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB1D6, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1D7, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1D8, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB1D9, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1DA, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB1DB, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB1DC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1DD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1DE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB1DF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB1E0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB1E1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB1E2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1E3, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB1E4, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1E5, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB1E6, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB1E7, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB1E8, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB1E9, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB1EA, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB1EB, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB1EC, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1ED, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB1EE, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB1EF, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F0, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F1, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB1F2, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F3, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F4, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB1F5, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F6, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F7, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB1F8, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1F9, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB1FA, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB1FB, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB1FC, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB1FD, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB1FE, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB1FF, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB200, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB201, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB202, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB203, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB204, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xB205, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB206, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB207, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB208, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB209, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB20A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB20B, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB20C, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB20D, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB20E, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB20F, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB210, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB211, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB212, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB213, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB214, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB215, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB216, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB217, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB218, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB219, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB21A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB21B, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB21C, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB21D, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB21E, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB21F, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB220, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB221, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB222, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB223, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB224, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB225, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB226, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB227, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB228, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB229, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB22A, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB22B, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB22C, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB22D, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB22E, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB22F, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB230, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB231, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB232, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB233, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB234, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB235, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB236, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB237, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB238, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB239, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB23A, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB23B, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB23C, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xB23D, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB23E, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB23F, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB240, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB241, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB242, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB243, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB244, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB245, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB246, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB247, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB248, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB249, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB24A, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB24B, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB24C, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB24D, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB24E, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB24F, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB250, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB251, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB252, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB253, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB254, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB255, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB256, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB257, {0x00,0x00,0x40,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB258, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB259, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB25A, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB25B, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB25C, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB25D, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB25E, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB25F, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB260, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB261, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB262, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB263, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB264, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB265, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB266, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB267, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB268, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB269, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB26A, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB26B, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB26C, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB26D, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB26E, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB26F, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB270, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB271, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB272, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB273, {0x00,0x00,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB274, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xB275, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB276, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB277, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB278, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB279, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB27A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB27B, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB27C, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB27D, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB27E, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB27F, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB280, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB281, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB282, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB283, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB284, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB285, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB286, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB287, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB288, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB289, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB28A, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB28B, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB28C, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB28D, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB28E, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB28F, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB290, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB291, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB292, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB293, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB294, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB295, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB296, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB297, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB298, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB299, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB29A, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB29B, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB29C, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB29D, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB29E, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB29F, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB2A0, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB2A1, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB2A2, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB2A3, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB2A4, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB2A5, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB2A6, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB2A7, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB2A8, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB2A9, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB2AA, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB2AB, {0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB2AC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB2AD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB2AE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB2AF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB2B0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2B1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB2B2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB2B3, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2B4, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2B5, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB2B6, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2B7, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2B8, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB2B9, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB2BA, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB2BB, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB2BC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2BD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2BE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB2BF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB2C0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB2C1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB2C2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB2C3, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB2C4, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2C5, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2C6, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB2C7, {0x00,0x00,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB2C8, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB2C9, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB2CA, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB2CB, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB2CC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2CD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB2CE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB2CF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2D0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2D1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB2D2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2D3, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2D4, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB2D5, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2D6, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB2D7, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB2D8, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2D9, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2DA, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB2DB, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB2DC, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB2DD, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB2DE, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB2DF, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB2E0, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2E1, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2E2, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB2E3, {0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB2E4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB2E5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB2E6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB2E7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB2E8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2E9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB2EA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB2EB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2EC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2ED, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB2EE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2EF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2F0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB2F1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2F2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB2F3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB2F4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2F5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2F6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB2F7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB2F8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB2F9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB2FA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB2FB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB2FC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2FD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB2FE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB2FF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB300, {0x00,0x00,0x79,0x20,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB301, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB302, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB303, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB304, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB305, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB306, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB307, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB308, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB309, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB30A, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB30B, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB30C, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB30D, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB30E, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB30F, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB310, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB311, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB312, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB313, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB314, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB315, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB316, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB317, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB318, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB319, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB31A, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB31B, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB31C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB31D, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB31E, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB31F, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB320, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB321, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB322, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB323, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB324, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB325, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB326, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB327, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB328, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB329, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB32A, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB32B, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB32C, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB32D, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB32E, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB32F, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB330, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB331, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB332, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB333, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB334, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB335, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB336, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB337, {0x00,0x00,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB338, {0x00,0x00,0x79,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x41,0x20,0x41,0x20,0x41,0xE0,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB339, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB33A, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB33B, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB33C, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB33D, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB33E, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB33F, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB340, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB341, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB342, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB343, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB344, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB345, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB346, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB347, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB348, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB349, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB34A, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB34B, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB34C, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB34D, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB34E, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB34F, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB350, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB351, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB352, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB353, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB354, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB355, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB356, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB357, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB358, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB359, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB35A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB35B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB35C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB35D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB35E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB35F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB360, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB361, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB362, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB363, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB364, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB365, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB366, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB367, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB368, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB369, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB36A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB36B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB36C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB36D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB36E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB36F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB370, {0x00,0x00,0x78,0xA0,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB371, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB372, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB373, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB374, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB375, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB376, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB377, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB378, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB379, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB37A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB37B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB37C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB37D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB37E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB37F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB380, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB381, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB382, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB383, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB384, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB385, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB386, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB387, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB388, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB389, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB38A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB38B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB38C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB38D, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB38E, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB38F, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB390, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB391, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB392, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB393, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB394, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB395, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB396, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB397, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB398, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB399, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB39A, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB39B, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB39C, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB39D, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB39E, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB39F, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB3A0, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB3A1, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB3A2, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB3A3, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB3A4, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3A5, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3A6, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB3A7, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x40,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB3A8, {0x00,0x00,0x78,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB3A9, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB3AA, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB3AB, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB3AC, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3AD, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB3AE, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB3AF, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B0, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B1, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB3B2, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B3, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B4, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB3B5, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B6, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B7, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB3B8, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3B9, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3BA, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB3BB, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB3BC, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB3BD, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3BE, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB3BF, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB3C0, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3C1, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3C2, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB3C3, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB3C4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB3C5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB3C6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB3C7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB3C8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3C9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB3CA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB3CB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3CC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3CD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB3CE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3CF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3D0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB3D1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3D2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3D3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB3D4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3D5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3D6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB3D7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB3D8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB3D9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB3DA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB3DB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB3DC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3DD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB3DE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB3DF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB3E0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB3E1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB3E2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB3E3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB3E4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3E5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB3E6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB3E7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3E8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3E9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB3EA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3EB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3EC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB3ED, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3EE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB3EF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB3F0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3F1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3F2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB3F3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB3F4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB3F5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB3F6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB3F7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB3F8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3F9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB3FA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB3FB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB3FC, {0x00,0x00,0x7E,0xA0,0x40,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB3FD, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB3FE, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB3FF, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB400, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB401, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB402, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB403, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB404, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB405, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB406, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB407, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB408, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB409, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB40A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB40B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB40C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB40D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB40E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB40F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB410, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB411, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB412, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB413, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB414, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB415, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB416, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB417, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB418, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB419, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB41A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB41B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB41C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB41D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB41E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB41F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB420, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB421, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB422, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB423, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB424, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB425, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB426, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB427, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB428, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB429, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB42A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB42B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB42C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB42D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB42E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB42F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB430, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB431, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB432, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB433, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB434, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB435, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB436, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB437, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB438, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB439, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB43A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB43B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB43C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB43D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB43E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB43F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB440, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB441, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB442, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB443, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB444, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB445, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB446, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB447, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB448, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB449, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB44A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB44B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB44C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB44D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB44E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB44F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB450, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xB451, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB452, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB453, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB454, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB455, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB456, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB457, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB458, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB459, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB45A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB45B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB45C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB45D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB45E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB45F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB460, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB461, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB462, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB463, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB464, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB465, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB466, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB467, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB468, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB469, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB46A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB46B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB46C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB46D, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB46E, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB46F, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB470, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB471, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB472, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB473, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB474, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB475, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB476, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB477, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB478, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB479, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB47A, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB47B, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB47C, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB47D, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB47E, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB47F, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB480, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB481, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB482, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB483, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB484, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB485, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB486, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB487, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB488, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xB489, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB48A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB48B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB48C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB48D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB48E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB48F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB490, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB491, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB492, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB493, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB494, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB495, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB496, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB497, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB498, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB499, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB49A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB49B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB49C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB49D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB49E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB49F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB4A0, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB4A1, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB4A2, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x41,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB4A3, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB4A4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB4A5, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB4A6, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB4A7, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB4A8, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4A9, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB4AA, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB4AB, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4AC, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4AD, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB4AE, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4AF, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4B0, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB4B1, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB4B2, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB4B3, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB4B4, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4B5, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4B6, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB4B7, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB4B8, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB4B9, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB4BA, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB4BB, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB4BC, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4BD, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4BE, {0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB4BF, {0x00,0x00,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB4C0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xB4C1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB4C2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB4C3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB4C4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4C5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB4C6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB4C7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4C8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4C9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB4CA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4CB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4CC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB4CD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4CE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4CF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB4D0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4D1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4D2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB4D3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB4D4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB4D5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB4D6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB4D7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB4D8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4D9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4DA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB4DB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB4DC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB4DD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB4DE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB4DF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB4E0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4E1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB4E2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB4E3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4E4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4E5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB4E6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4E7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4E8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB4E9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4EA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4EB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB4EC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4ED, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4EE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB4EF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB4F0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB4F1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB4F2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB4F3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB4F4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4F5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB4F6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB4F7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB4F8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB4F9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB4FA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB4FB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB4FC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB4FD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB4FE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB4FF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB500, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB501, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB502, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB503, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB504, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB505, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB506, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB507, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB508, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB509, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB50A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB50B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB50C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB50D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB50E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB50F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB510, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB511, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB512, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB513, {0x00,0x00,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB514, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB515, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB516, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB517, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB518, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB519, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB51A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB51B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB51C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB51D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB51E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB51F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB520, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB521, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB522, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB523, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB524, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB525, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB526, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB527, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB528, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB529, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB52A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB52B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB52C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB52D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB52E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB52F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB530, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB531, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB532, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB533, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB534, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB535, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB536, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB537, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB538, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB539, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB53A, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB53B, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB53C, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB53D, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB53E, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB53F, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB540, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB541, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB542, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB543, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB544, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB545, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB546, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB547, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB548, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB549, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB54A, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB54B, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB54C, {0x00,0x00,0x7D,0x20,0x51,0x20,0x51,0x20,0x51,0x20,0x51,0x20,0x51,0xE0,0x51,0x20,0x51,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB54D, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB54E, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB54F, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB550, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB551, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB552, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB553, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB554, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB555, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB556, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB557, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB558, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB559, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB55A, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB55B, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB55C, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB55D, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB55E, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB55F, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB560, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB561, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB562, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB563, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB564, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB565, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB566, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB567, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB568, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x70,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB569, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB56A, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB56B, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB56C, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB56D, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB56E, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB56F, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB570, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB571, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB572, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB573, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB574, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB575, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB576, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB577, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB578, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB579, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB57A, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB57B, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB57C, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB57D, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB57E, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB57F, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB580, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB581, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB582, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB583, {0x00,0x00,0x7F,0x40,0x48,0x70,0x48,0x40,0x48,0x70,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB584, {0x00,0x00,0x7D,0x20,0x51,0x20,0x51,0xE0,0x51,0x20,0x51,0x20,0x51,0x20,0x51,0xE0,0x51,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB585, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB586, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB587, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB588, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB589, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB58A, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB58B, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB58C, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB58D, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB58E, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB58F, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB590, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB591, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB592, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB593, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB594, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB595, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB596, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB597, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB598, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB599, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB59A, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB59B, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB59C, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB59D, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB59E, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB59F, {0x00,0x00,0x7F,0x20,0x49,0x20,0x49,0xE0,0x49,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB5A0, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB5A1, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB5A2, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB5A3, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB5A4, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5A5, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB5A6, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB5A7, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5A8, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5A9, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB5AA, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5AB, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5AC, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB5AD, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5AE, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5AF, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB5B0, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5B1, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5B2, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB5B3, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB5B4, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB5B5, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB5B6, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB5B7, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB5B8, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5B9, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5BA, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB5BB, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB5BC, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xA0,0x50,0xA0,0x53,0xA0,0x50,0xA0,0x50,0xA0,0x50,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB5BD, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB5BE, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB5BF, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB5C0, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5C1, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB5C2, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB5C3, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5C4, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5C5, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB5C6, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5C7, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5C8, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB5C9, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5CA, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5CB, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB5CC, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5CD, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5CE, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB5CF, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB5D0, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB5D1, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5D2, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB5D3, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB5D4, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5D5, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5D6, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB5D7, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x4B,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB5D8, {0x00,0x00,0x7F,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x48,0x40,0x49,0xC0,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB5D9, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB5DA, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB5DB, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB5DC, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5DD, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB5DE, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB5DF, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5E0, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5E1, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB5E2, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5E3, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5E4, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB5E5, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5E6, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5E7, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB5E8, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5E9, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5EA, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB5EB, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB5EC, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB5ED, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB5EE, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB5EF, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB5F0, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5F1, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB5F2, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB5F3, {0x00,0x00,0x7F,0x40,0x49,0xC0,0x48,0x40,0x49,0xC0,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB5F4, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x53,0xA0,0x50,0xA0,0x50,0xA0,0x53,0xA0,0x50,0xA0,0x50,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB5F5, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB5F6, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB5F7, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB5F8, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5F9, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB5FA, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB5FB, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5FC, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5FD, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB5FE, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB5FF, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB600, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB601, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB602, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB603, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB604, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB605, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB606, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB607, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB608, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB609, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB60A, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB60B, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB60C, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB60D, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB60E, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB60F, {0x00,0x00,0x7E,0xA0,0x4B,0xA0,0x48,0xA0,0x4B,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB610, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB611, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB612, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB613, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB614, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB615, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB616, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB617, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB618, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB619, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB61A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB61B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB61C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB61D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB61E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB61F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB620, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB621, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB622, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB623, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB624, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB625, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB626, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB627, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB628, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB629, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB62A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB62B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB62C, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB62D, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB62E, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB62F, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB630, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB631, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB632, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB633, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB634, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB635, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB636, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB637, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB638, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB639, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB63A, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB63B, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB63C, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB63D, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB63E, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB63F, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB640, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB641, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB642, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB643, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB644, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB645, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB646, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB647, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB648, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x48,0xA0,0x48,0xA0,0x3E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB649, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB64A, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB64B, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB64C, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB64D, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB64E, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB64F, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB650, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB651, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB652, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB653, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB654, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB655, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB656, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB657, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB658, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB659, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB65A, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB65B, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB65C, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB65D, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB65E, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB65F, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB660, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB661, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB662, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x50,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB663, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB664, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB665, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB666, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB667, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB668, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB669, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB66A, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB66B, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB66C, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB66D, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB66E, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB66F, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB670, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB671, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB672, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB673, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB674, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB675, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB676, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB677, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB678, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB679, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB67A, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB67B, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB67C, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB67D, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB67E, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB67F, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB680, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB681, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB682, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB683, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB684, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB685, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB686, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB687, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB688, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB689, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB68A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB68B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB68C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB68D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB68E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB68F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB690, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB691, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB692, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB693, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB694, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB695, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB696, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB697, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB698, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB699, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB69A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB69B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB69C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xB69D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB69E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB69F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB6A0, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6A1, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB6A2, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB6A3, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6A4, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6A5, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB6A6, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6A7, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6A8, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB6A9, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6AA, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6AB, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB6AC, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6AD, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6AE, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB6AF, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB6B0, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB6B1, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB6B2, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB6B3, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB6B4, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6B5, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB6B6, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB6B7, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB6B8, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB6B9, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB6BA, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB6BB, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB6BC, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6BD, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB6BE, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB6BF, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6C0, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6C1, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB6C2, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6C3, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6C4, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB6C5, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6C6, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6C7, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB6C8, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6C9, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6CA, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB6CB, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB6CC, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB6CD, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB6CE, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB6CF, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB6D0, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6D1, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6D2, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0xC0,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB6D3, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB6D4, {0x00,0x00,0x7E,0xA0,0x48,0xA0,0x48,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xB6D5, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB6D6, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB6D7, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB6D8, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6D9, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB6DA, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB6DB, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6DC, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6DD, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB6DE, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6DF, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6E0, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB6E1, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6E2, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6E3, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB6E4, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6E5, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6E6, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB6E7, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB6E8, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB6E9, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6EA, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB6EB, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB6EC, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6ED, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6EE, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x51,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB6EF, {0x00,0x00,0x7C,0xA0,0x50,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB6F0, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB6F1, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB6F2, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB6F3, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB6F4, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6F5, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB6F6, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB6F7, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6F8, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6F9, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB6FA, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6FB, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB6FC, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB6FD, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6FE, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB6FF, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB700, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB701, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB702, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB703, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB704, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB705, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB706, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB707, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB708, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB709, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB70A, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB70B, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB70C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xB70D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB70E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB70F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB710, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB711, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB712, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB713, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB714, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB715, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB716, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB717, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB718, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB719, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB71A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB71B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB71C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB71D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB71E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB71F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB720, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB721, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB722, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB723, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB724, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB725, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB726, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB727, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB728, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB729, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB72A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB72B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB72C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB72D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB72E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB72F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB730, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB731, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB732, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB733, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB734, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB735, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB736, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB737, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB738, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB739, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB73A, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xB73B, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB73C, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB73D, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB73E, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB73F, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB740, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB741, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB742, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB743, {0x00,0x00,0x7B,0xC0,0x42,0x00,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB744, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB745, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB746, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB747, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB748, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB749, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB74A, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB74B, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB74C, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB74D, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB74E, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB74F, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB750, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB751, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB752, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB753, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB754, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB755, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB756, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB757, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB758, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB759, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB75A, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB75B, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB75C, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB75D, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB75E, {0x00,0x00,0x7E,0x40,0x48,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB75F, {0x00,0x00,0x7E,0x40,0x48,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB760, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB761, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB762, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB763, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB764, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB765, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB766, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB767, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB768, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB769, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB76A, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB76B, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB76C, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB76D, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB76E, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB76F, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB770, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB771, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB772, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB773, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB774, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB775, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB776, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB777, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB778, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB779, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB77A, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB77B, {0x00,0x00,0x7F,0x40,0x48,0x40,0x48,0x40,0x48,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB77C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB77D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB77E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB77F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB780, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB781, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB782, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB783, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB784, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB785, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB786, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB787, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB788, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB789, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB78A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB78B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB78C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB78D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB78E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB78F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB790, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB791, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB792, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB793, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB794, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB795, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB796, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB797, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB798, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0x20,0x7D,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB799, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB79A, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB79B, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB79C, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB79D, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB79E, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB79F, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB7A2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A4, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB7A5, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A6, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A7, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB7A8, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7A9, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7AA, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB7AB, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB7AC, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB7AD, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7AE, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB7AF, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB7B0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7B1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7B2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB7B3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB7B4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB7B5, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB7B6, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB7B7, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB7B8, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7B9, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB7BA, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB7BB, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7BC, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7BD, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB7BE, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7BF, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7C0, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB7C1, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7C2, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7C3, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB7C4, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7C5, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7C6, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB7C7, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB7C8, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB7C9, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB7CA, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB7CB, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB7CC, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7CD, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7CE, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB7CF, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB7D0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x7D,0x20,0x41,0x20,0x41,0x20,0x41,0xE0,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB7D1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB7D2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB7D3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB7D4, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7D5, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB7D6, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB7D7, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7D8, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7D9, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB7DA, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7DB, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7DC, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB7DD, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7DE, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7DF, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB7E0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7E1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7E2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB7E3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB7E4, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB7E5, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7E6, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB7E7, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB7E8, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7E9, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7EA, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x41,0x20,0x3D,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB7EB, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB7EC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB7ED, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB7EE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB7EF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB7F0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7F1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB7F2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB7F3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7F4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7F5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB7F6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7F7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7F8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB7F9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7FA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB7FB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB7FC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7FD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB7FE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB7FF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB800, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB801, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB802, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB803, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB804, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB805, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB806, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB807, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB808, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB809, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB80A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB80B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB80C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB80D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB80E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB80F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB810, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB811, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB812, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB813, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB814, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB815, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB816, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB817, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB818, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB819, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB81A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB81B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB81C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB81D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB81E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB81F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB820, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB821, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB822, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB823, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB824, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x7E,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB825, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB826, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB827, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB828, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB829, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB82A, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB82B, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB82C, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB82D, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB82E, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB82F, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB830, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB831, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB832, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB833, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB834, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB835, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB836, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB837, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xB838, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB839, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB83A, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB83B, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB83C, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB83D, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB83E, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB83F, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB840, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB841, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB842, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB843, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB844, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB845, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB846, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB847, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB848, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB849, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB84A, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB84B, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB84C, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB84D, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB84E, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB84F, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB850, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB851, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB852, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB853, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB854, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB855, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB856, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB857, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB858, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB859, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB85A, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB85B, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x43,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB85C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB85D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB85E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB85F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB860, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB861, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB862, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB863, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB864, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB865, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB866, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB867, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB868, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB869, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB86A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB86B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB86C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB86D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB86E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB86F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB870, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB871, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB872, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB873, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB874, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB875, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB876, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB877, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB878, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB879, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB87A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB87B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB87C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB87D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB87E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB87F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB880, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB881, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB882, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB883, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB884, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB885, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB886, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB887, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB888, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB889, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB88A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB88B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB88C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB88D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB88E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB88F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB890, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB891, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB892, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB893, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB894, {0x00,0x00,0x7E,0xA0,0x02,0xA0,0x7E,0xA0,0x40,0xA0,0x40,0xE0,0x3E,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xB895, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB896, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB897, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xB898, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB899, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB89A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x40,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB89B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB89C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB89D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB89E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB89F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8A0, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB8A1, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xB8A2, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8A3, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB8A4, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8A5, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8A6, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x24,0x00,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB8A7, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB8A8, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB8A9, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8AA, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB8AB, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB8AC, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8AD, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8AE, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB8AF, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB8B0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB8B1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB8B2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB8B3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB8B4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8B5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB8B6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB8B7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8B8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8B9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB8BA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8BB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8BC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB8BD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8BE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB8BF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB8C0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8C1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8C2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB8C3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB8C4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB8C5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB8C6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB8C7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB8C8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8C9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB8CA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8CB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB8CC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB8CD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB8CE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB8CF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB8D0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8D1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB8D2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB8D3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8D4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8D5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB8D6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8D7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8D8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB8D9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8DA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8DB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB8DC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8DD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8DE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB8DF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB8E0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB8E1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB8E2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB8E3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB8E4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8E5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8E6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB8E7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB8E8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xB8E9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB8EA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB8EB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB8EC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8ED, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB8EE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB8EF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB8F2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB8F5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB8F8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8F9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x44,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB8FA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x4C,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB8FB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xB8FC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB8FD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB8FE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB8FF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB900, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB901, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB902, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB903, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB904, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB905, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB906, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB907, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB908, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB909, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB90A, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB90B, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB90C, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB90D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB90E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB90F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB910, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB911, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB912, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB913, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB914, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB915, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB916, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB917, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB918, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB919, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB91A, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB91B, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB91C, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB91D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB91E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB91F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB920, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xB921, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB922, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB923, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xB924, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x30,0x20,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB925, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB926, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xE0,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB927, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB928, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB929, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB92A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB92B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB92C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB92D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xB92E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB92F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB930, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB931, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x30,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB932, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x34,0xA0,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB933, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB934, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB935, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB936, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB937, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB938, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB939, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB93A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB93B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB93C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xB93D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB93E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB93F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB940, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB941, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB942, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB943, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB944, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB945, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB946, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB947, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB948, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB949, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB94A, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB94B, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB94C, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB94D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB94E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB94F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB950, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB951, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB952, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB953, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB954, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB955, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB956, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB957, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB958, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xB959, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB95A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB95B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB95C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB95D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB95E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB95F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB960, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB961, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB962, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB963, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB964, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB965, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB966, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB967, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB968, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB969, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x51,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB96A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x59,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB96B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xB96C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB96D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB96E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB96F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB970, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB971, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB972, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB973, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB974, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xB975, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB976, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB977, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xB978, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB979, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB97A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB97B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB97C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB97D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xB97E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB97F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB980, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB981, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB982, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x70,0x00,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB983, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB984, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB985, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xB986, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xB987, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xB988, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xB989, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xB98A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB98B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xB98C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB98D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xB98E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xB98F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xB990, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB991, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB992, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB993, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB994, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB995, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB996, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB997, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB998, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB999, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB99A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB99B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB99C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB99D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB99E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB99F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB9A0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9A1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9A2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x24,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB9A3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9A4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB9A5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB9A6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB9A7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xB9A8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9A9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9AA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xB9AB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB9AC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB9AD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB9AE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB9AF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB9B0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9B1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB9B2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB9B3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9B4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9B5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB9B6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9B7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9B8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB9B9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9BA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9BB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB9BC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9BD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9BE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB9BF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB9C0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB9C1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB9C2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9C3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9C4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9C5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9C6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB9C7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB9C8, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB9C9, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xB9CA, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xB9CB, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB9CC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9CD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xB9CE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xB9CF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9D0, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9D1, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xB9D2, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9D3, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9D4, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB9D5, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9D6, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9D7, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xB9D8, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9D9, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9DA, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xB9DB, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xB9DC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xB9DD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xB9DE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9DF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9E0, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9E1, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9E2, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB9E3, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xB9E4, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0x20,0x45,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x45,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xB9E5, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xB9E6, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xB9E7, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xB9E8, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9E9, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xB9EA, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xB9EB, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9EC, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9ED, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xB9EE, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9EF, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9F0, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB9F1, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9F2, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9F3, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xB9F4, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9F5, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9F6, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xB9F7, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xB9F8, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xB9F9, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xB9FA, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9FB, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xB9FC, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9FD, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xB9FE, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xB9FF, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBA00, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBA01, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBA02, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBA03, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBA04, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA05, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBA06, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBA07, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA08, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA09, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBA0A, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA0B, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA0C, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA0D, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA0E, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA0F, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBA10, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA11, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA12, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBA13, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBA14, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBA15, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBA16, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA17, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA18, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA19, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA1A, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBA1B, {0x00,0x00,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBA1C, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x45,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xBA1D, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBA1E, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBA1F, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBA20, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA21, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBA22, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBA23, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA24, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA25, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBA26, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA27, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA28, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA29, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA2A, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA2B, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBA2C, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA2D, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA2E, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA2F, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBA30, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBA31, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA32, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA33, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA34, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA35, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA36, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBA37, {0x00,0x00,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBA38, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBA39, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBA3A, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBA3B, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBA3C, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA3D, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBA3E, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBA3F, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA40, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA41, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBA42, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA43, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA44, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA45, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA46, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA47, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBA48, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA49, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA4A, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBA4B, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBA4C, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBA4D, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBA4E, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA4F, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA50, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA51, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA52, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBA53, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBA54, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBA55, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBA56, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBA57, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBA58, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA59, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBA5A, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBA5B, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA5C, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA5D, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBA5E, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA5F, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA60, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA61, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA62, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA63, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBA64, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA65, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA66, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA67, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBA68, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBA69, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA6A, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA6B, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA6C, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA6D, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA6E, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBA6F, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBA70, {0x00,0x00,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBA71, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBA72, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBA73, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBA74, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA75, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBA76, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBA77, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA78, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA79, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBA7A, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA7B, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA7C, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA7D, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA7E, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA7F, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBA80, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA81, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA82, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBA83, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBA84, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBA85, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBA86, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA87, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBA88, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA89, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBA8A, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBA8B, {0x00,0x00,0x7E,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBA8C, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBA8D, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBA8E, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBA8F, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBA90, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA91, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBA92, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBA93, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA94, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA95, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBA96, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA97, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA98, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA99, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA9A, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA9B, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBA9C, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA9D, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBA9E, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBA9F, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBAA0, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBAA1, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBAA2, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBAA3, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBAA4, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAA5, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAA6, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBAA7, {0x00,0x00,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBAA8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBAA9, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBAAA, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBAAB, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBAAC, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAAD, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBAAE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBAAF, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB0, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB1, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBAB2, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB3, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB4, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBAB5, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB6, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB7, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBAB8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAB9, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBABA, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBABB, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBABC, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBABD, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBABE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBABF, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBAC0, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAC1, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBAC2, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBAC3, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBAC4, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBAC5, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBAC6, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBAC7, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBAC8, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBAC9, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBACA, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBACB, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBACC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBACD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBACE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBACF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBAD0, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBAD1, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAD2, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAD3, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBAD4, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBAD5, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBAD6, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBAD7, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBAD8, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBAD9, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBADA, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBADB, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBADC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBADD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBADE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBADF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBAE0, {0x00,0x00,0x7E,0xA0,0x42,0xA0,0x42,0xA0,0x42,0xA0,0x3E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBAE1, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBAE2, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBAE3, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBAE4, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAE5, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBAE6, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBAE7, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAE8, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAE9, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBAEA, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAEB, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAEC, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBAED, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAEE, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAEF, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBAF0, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAF1, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAF2, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBAF3, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBAF4, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBAF5, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBAF6, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBAF7, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBAF8, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAF9, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBAFA, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBAFB, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3C,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBAFC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBAFD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBAFE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBAFF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBB00, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB01, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBB02, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB03, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB04, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB05, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBB06, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB07, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB08, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB09, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB0A, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB0B, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB0C, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB0D, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB0E, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB0F, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBB10, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBB11, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBB12, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB13, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB14, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB15, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB16, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBB17, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBB18, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBB19, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBB1A, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBB1B, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBB1C, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB1D, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBB1E, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBB1F, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB20, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB21, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBB22, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB23, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB24, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBB25, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB26, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB27, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBB28, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB29, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB2A, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBB2B, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBB2C, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBB2D, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBB2E, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBB2F, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBB30, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB31, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB32, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBB33, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBB34, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xBB35, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBB36, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBB37, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBB38, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB39, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBB3A, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBB3B, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB3C, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB3D, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBB3E, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB3F, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB40, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBB41, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB42, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB43, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBB44, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB45, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB46, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBB47, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBB48, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBB49, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBB4A, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBB4B, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBB4C, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB4D, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBB4E, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBB4F, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBB50, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xBB51, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBB52, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBB53, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBB54, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB55, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBB56, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB57, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB58, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB59, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBB5A, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB5B, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB5C, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB5D, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB5E, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB5F, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB60, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB61, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB62, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB63, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBB64, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBB65, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBB66, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB67, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB68, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB69, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB6A, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBB6B, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBB6C, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xBB6D, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBB6E, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBB6F, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBB70, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB71, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBB72, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBB73, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB74, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB75, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBB76, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB77, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB78, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB79, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB7A, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB7B, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB7C, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB7D, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB7E, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB7F, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB80, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBB81, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB82, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB83, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB84, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB85, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB86, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBB87, {0x00,0x00,0x7C,0xA0,0x44,0xA0,0x3D,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBB88, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xBB89, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBB8A, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBB8B, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBB8C, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB8D, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBB8E, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB8F, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB90, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB91, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBB92, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB93, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB94, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB95, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB96, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBB97, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBB98, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB99, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBB9A, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBB9B, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBB9C, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBB9D, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBB9E, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBB9F, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBBA0, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBA1, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBA2, {0x00,0x00,0x7C,0x40,0x44,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBBA3, {0x00,0x00,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBBA4, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xBBA5, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBBA6, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBBA7, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBBA8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBA9, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBBAA, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBBAB, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBAC, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBAD, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBBAE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBAF, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBB0, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBBB1, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBB2, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBB3, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBBB4, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBB5, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBB6, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBBB7, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBBB8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBBB9, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBBBA, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBBBB, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBBBC, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBBD, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBBE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBBBF, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBBC0, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBBC1, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBBC2, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBBC3, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBBC4, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBC5, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBBC6, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBBC7, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBC8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBC9, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBBCA, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBCB, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBCC, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBBCD, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBCE, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBCF, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBBD0, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBD1, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBD2, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBBD3, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBBD4, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBBD5, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBBD6, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBBD7, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBBD8, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBD9, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBBDA, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBBDB, {0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBBDC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBBDD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBBDE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBBDF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBBE0, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBE1, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBBE2, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBBE3, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBE4, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBE5, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBBE6, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBE7, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBE8, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBBE9, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBBEA, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBBEB, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBBEC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBED, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBEE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBBEF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBBF0, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBBF1, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBBF2, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBBF3, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBBF4, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBF5, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBF6, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBBF7, {0x00,0x00,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBBF8, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBBF9, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBBFA, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBBFB, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBBFC, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBBFD, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBBFE, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBBFF, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC00, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC01, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBC02, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC03, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC04, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC05, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC06, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC07, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBC08, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC09, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC0A, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBC0B, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBC0C, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBC0D, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBC0E, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC0F, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC10, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC11, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC12, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBC13, {0x00,0x00,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBC14, {0x00,0x00,0x42,0x40,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x70,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBC15, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBC16, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBC17, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBC18, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC19, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBC1A, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBC1B, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC1C, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC1D, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBC1E, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC1F, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC20, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC21, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC22, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC23, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBC24, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC25, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC26, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBC27, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBC28, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBC29, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBC2A, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC2B, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC2C, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC2D, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC2E, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBC2F, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x70,0x42,0x40,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBC30, {0x00,0x00,0x45,0x20,0x45,0x20,0x45,0x20,0x7D,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xBC31, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBC32, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBC33, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBC34, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC35, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBC36, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBC37, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC38, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC39, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBC3A, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC3B, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC3C, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC3D, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC3E, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC3F, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBC40, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC41, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC42, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC43, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBC44, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBC45, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC46, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC47, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC48, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC49, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC4A, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBC4B, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBC4C, {0x00,0x00,0x42,0x40,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBC4D, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBC4E, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBC4F, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBC50, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC51, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBC52, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBC53, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC54, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC55, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBC56, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC57, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC58, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC59, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC5A, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC5B, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBC5C, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC5D, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC5E, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBC5F, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBC60, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBC61, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBC62, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC63, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC64, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC65, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC66, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBC67, {0x00,0x00,0x42,0x40,0x42,0x70,0x7E,0x40,0x42,0x70,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBC68, {0x00,0x00,0x45,0x20,0x45,0x20,0x45,0xE0,0x7D,0x20,0x45,0x20,0x45,0x20,0x45,0xE0,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xBC69, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBC6A, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBC6B, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBC6C, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC6D, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBC6E, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBC6F, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC70, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC71, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBC72, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC73, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC74, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC75, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC76, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC77, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBC78, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC79, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC7A, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC7B, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBC7C, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBC7D, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC7E, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC7F, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC80, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC81, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC82, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBC83, {0x00,0x00,0x45,0x20,0x45,0x20,0x7D,0xE0,0x45,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBC84, {0x00,0x00,0x42,0x40,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBC85, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBC86, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBC87, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBC88, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC89, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBC8A, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBC8B, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC8C, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC8D, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBC8E, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC8F, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC90, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBC91, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC92, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBC93, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBC94, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC95, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC96, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBC97, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBC98, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBC99, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBC9A, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC9B, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBC9C, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC9D, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBC9E, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBC9F, {0x00,0x00,0x42,0x40,0x42,0x40,0x7F,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBCA0, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x44,0xA0,0x7C,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBCA1, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBCA2, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBCA3, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBCA4, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCA5, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBCA6, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBCA7, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCA8, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCA9, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBCAA, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCAB, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCAC, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBCAD, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCAE, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCAF, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBCB0, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCB1, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCB2, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBCB3, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBCB4, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBCB5, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCB6, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBCB7, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBCB8, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCB9, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCBA, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBCBB, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x7F,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBCBC, {0x00,0x00,0x42,0x40,0x42,0x40,0x43,0xC0,0x7E,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBCBD, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBCBE, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBCBF, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBCC0, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCC1, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBCC2, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBCC3, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCC4, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCC5, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBCC6, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCC7, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCC8, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBCC9, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCCA, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCCB, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBCCC, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCCD, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCCE, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBCCF, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBCD0, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBCD1, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBCD2, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBCD3, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBCD4, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCD5, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCD6, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBCD7, {0x00,0x00,0x42,0x40,0x43,0xC0,0x7E,0x40,0x43,0xC0,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBCD8, {0x00,0x00,0x44,0xA0,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBCD9, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBCDA, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBCDB, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBCDC, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCDD, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBCDE, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBCDF, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE0, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE1, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBCE2, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE3, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE4, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBCE5, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE6, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE7, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBCE8, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCE9, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCEA, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBCEB, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBCEC, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBCED, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBCEE, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBCEF, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBCF0, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCF1, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBCF2, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBCF3, {0x00,0x00,0x44,0xA0,0x47,0xA0,0x7C,0xA0,0x47,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBCF4, {0x00,0x00,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBCF5, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBCF6, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBCF7, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBCF8, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBCF9, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBCFA, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBCFB, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBCFC, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBCFD, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBCFE, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBCFF, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD00, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBD01, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD02, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD03, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBD04, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD05, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD06, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBD07, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBD08, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBD09, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBD0A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBD0B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBD0C, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD0D, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD0E, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBD0F, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBD10, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD11, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD12, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBD13, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBD14, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD15, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBD16, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBD17, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD18, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD19, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBD1A, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD1B, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD1C, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBD1D, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD1E, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD1F, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBD20, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD21, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD22, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBD23, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBD24, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBD25, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBD26, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD27, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD28, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD29, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD2A, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBD2B, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBD2C, {0x00,0x00,0x42,0xA0,0x42,0xA0,0x7E,0xA0,0x42,0xA0,0x3E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBD2D, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBD2E, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBD2F, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBD30, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD31, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBD32, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBD33, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD34, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD35, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBD36, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD37, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD38, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBD39, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD3A, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD3B, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBD3C, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD3D, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD3E, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBD3F, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD40, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBD41, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD42, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD43, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD44, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD45, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD46, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBD47, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBD48, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD49, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD4A, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBD4B, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBD4C, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD4D, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBD4E, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBD4F, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD50, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD51, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBD52, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD53, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD54, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBD55, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD56, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBD57, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBD58, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD59, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD5A, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBD5B, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBD5C, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBD5D, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBD5E, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD5F, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBD60, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD61, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBD62, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBD63, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBD64, {0x00,0x00,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBD65, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD66, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBD67, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBD68, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD69, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBD6A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBD6B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD6C, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD6D, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBD6E, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD6F, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD70, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBD71, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD72, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD73, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBD74, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD75, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD76, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBD77, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBD78, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBD79, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBD7A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBD7B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBD7C, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD7D, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD7E, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBD7F, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBD80, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xBD81, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD82, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBD83, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBD84, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD85, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBD86, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBD87, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD88, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD89, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBD8A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD8B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD8C, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBD8D, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD8E, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD8F, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBD90, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD91, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD92, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBD93, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBD94, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBD95, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBD96, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBD97, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBD98, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD99, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBD9A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBD9B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBD9C, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xBD9D, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBD9E, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBD9F, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBDA0, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDA1, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBDA2, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBDA3, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDA4, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDA5, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBDA6, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDA7, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDA8, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBDA9, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDAA, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDAB, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBDAC, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDAD, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDAE, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBDAF, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBDB0, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBDB1, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBDB2, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDB3, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDB4, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDB5, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDB6, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBDB7, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBDB8, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x44,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xBDB9, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBDBA, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBDBB, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBDBC, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDBD, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBDBE, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBDBF, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC0, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC1, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBDC2, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC3, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC4, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBDC5, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC6, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC7, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBDC8, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDC9, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDCA, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBDCB, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDCC, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBDCD, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDCE, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDCF, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDD0, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDD1, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDD2, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x45,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBDD3, {0x00,0x00,0x44,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBDD4, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xBDD5, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBDD6, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBDD7, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBDD8, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDD9, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBDDA, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBDDB, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDDC, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDDD, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBDDE, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDDF, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDE0, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBDE1, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDE2, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBDE3, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBDE4, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDE5, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDE6, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBDE7, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBDE8, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBDE9, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBDEA, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDEB, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBDEC, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDED, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBDEE, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBDEF, {0x00,0x00,0x44,0x40,0x7C,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBDF0, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xBDF1, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBDF2, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBDF3, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBDF4, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDF5, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBDF6, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBDF7, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDF8, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDF9, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBDFA, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDFB, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDFC, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBDFD, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDFE, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBDFF, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBE00, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE01, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE02, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBE03, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBE04, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBE05, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBE06, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBE07, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBE08, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE09, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE0A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBE0B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0x80,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBE0C, {0x00,0x00,0x40,0x40,0x40,0x40,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBE0D, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE0E, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBE0F, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBE10, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE11, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBE12, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBE13, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE14, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE15, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBE16, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE17, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE18, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBE19, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE1A, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE1B, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBE1C, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE1D, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE1E, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBE1F, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBE20, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBE21, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBE22, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBE23, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBE24, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE25, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBE26, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBE27, {0x00,0x00,0x40,0x40,0x7F,0xC0,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBE28, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE29, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE2A, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBE2B, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBE2C, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE2D, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBE2E, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBE2F, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE30, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE31, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBE32, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE33, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE34, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBE35, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE36, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE37, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBE38, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE39, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE3A, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBE3B, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBE3C, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBE3D, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBE3E, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE3F, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE40, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE41, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE42, {0x00,0x00,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBE43, {0x00,0x00,0x42,0x40,0x7E,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBE44, {0x00,0x00,0x42,0x40,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE45, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE46, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBE47, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBE48, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE49, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBE4A, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBE4B, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE4C, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE4D, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBE4E, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE4F, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE50, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBE51, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE52, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE53, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBE54, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE55, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE56, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBE57, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBE58, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBE59, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBE5A, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE5B, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE5C, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE5D, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE5E, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBE5F, {0x00,0x00,0x42,0x40,0x42,0x40,0x7E,0x40,0x42,0x40,0x3E,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBE60, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE61, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE62, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBE63, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBE64, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE65, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBE66, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBE67, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE68, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE69, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBE6A, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE6B, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE6C, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBE6D, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE6E, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE6F, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBE70, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE71, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE72, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBE73, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBE74, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBE75, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBE76, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE77, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE78, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE79, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE7A, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBE7B, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBE7C, {0x00,0x00,0xA9,0x20,0xA9,0x20,0xF9,0x20,0xA9,0x20,0xA9,0x20,0xA9,0xE0,0xA9,0x20,0xF9,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xBE7D, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBE7E, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBE7F, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBE80, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE81, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBE82, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBE83, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE84, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE85, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBE86, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE87, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE88, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBE89, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE8A, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE8B, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBE8C, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE8D, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE8E, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBE8F, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBE90, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBE91, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE92, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE93, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBE94, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE95, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBE96, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBE97, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBE98, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x70,0x55,0x40,0x55,0x40,0x55,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE99, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBE9A, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBE9B, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBE9C, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBE9D, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBE9E, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBE9F, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEA0, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEA1, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBEA2, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEA3, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEA4, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBEA5, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEA6, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEA7, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBEA8, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEA9, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEAA, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBEAB, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xBEAC, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBEAD, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBEAE, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBEAF, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBEB0, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEB1, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEB2, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBEB3, {0x00,0x00,0x55,0x40,0x55,0x70,0x77,0x40,0x55,0x70,0x33,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBEB4, {0x00,0x00,0xA9,0x20,0xA9,0x20,0xF9,0xE0,0xA9,0x20,0xA9,0x20,0xA9,0x20,0xA9,0xE0,0xF9,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xBEB5, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBEB6, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBEB7, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBEB8, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEB9, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBEBA, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBEBB, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEBC, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEBD, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBEBE, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEBF, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEC0, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBEC1, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEC2, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEC3, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBEC4, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEC5, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEC6, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBEC7, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBEC8, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBEC9, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBECA, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBECB, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBECC, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBECD, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBECE, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBECF, {0x00,0x00,0x55,0x20,0x55,0x20,0x7D,0xE0,0x55,0x20,0x3D,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBED0, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0xC0,0x55,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBED1, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBED2, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBED3, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBED4, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBED5, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBED6, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBED7, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBED8, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBED9, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBEDA, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEDB, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEDC, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBEDD, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEDE, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEDF, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBEE0, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEE1, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEE2, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBEE3, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBEE4, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBEE5, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBEE6, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBEE7, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBEE8, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEE9, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBEEA, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBEEB, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBEEC, {0x00,0x00,0xA8,0xA0,0xA8,0xA0,0xF8,0xA0,0xA8,0xA0,0xAB,0xA0,0xA8,0xA0,0xA8,0xA0,0xF8,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBEED, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBEEE, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBEEF, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBEF0, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEF1, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBEF2, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBEF3, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEF4, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEF5, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBEF6, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEF7, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEF8, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBEF9, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEFA, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEFB, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBEFC, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEFD, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBEFE, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBEFF, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBF00, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBF01, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF02, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF03, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF04, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF05, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF06, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBF07, {0x00,0x00,0x54,0xA0,0x54,0xA0,0x7F,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBF08, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0xC0,0x55,0x40,0x55,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF09, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF0A, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBF0B, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBF0C, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF0D, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBF0E, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xBF0F, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF10, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF11, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBF12, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF13, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF14, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF15, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF16, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF17, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBF18, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF19, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF1A, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xBF1B, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBF1C, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBF1D, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBF1E, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF1F, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF20, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF21, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF22, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBF23, {0x00,0x00,0x55,0x40,0x55,0xC0,0x77,0x40,0x55,0xC0,0x33,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBF24, {0x00,0x00,0xA8,0xA0,0xA8,0xA0,0xFB,0xA0,0xA8,0xA0,0xA8,0xA0,0xAB,0xA0,0xA8,0xA0,0xF8,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBF25, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBF26, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBF27, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBF28, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF29, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBF2A, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBF2B, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF2C, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF2D, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBF2E, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF2F, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF30, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF31, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF32, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF33, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBF34, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF35, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF36, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF37, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xBF38, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xBF39, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF3A, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF3B, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF3C, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF3D, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF3E, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBF3F, {0x00,0x00,0x54,0xA0,0x57,0xA0,0x7C,0xA0,0x57,0xA0,0x3C,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBF40, {0x00,0x00,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x39,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBF41, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF42, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBF43, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBF44, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF45, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBF46, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBF47, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF48, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF49, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBF4A, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF4B, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF4C, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBF4D, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF4E, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF4F, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBF50, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF51, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF52, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBF53, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBF54, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBF55, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBF56, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBF57, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBF58, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF59, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBF5A, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBF5B, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBF5C, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x70,0x33,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF5D, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF5E, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBF5F, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBF60, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF61, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBF62, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBF63, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF64, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF65, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBF66, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF67, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF68, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF69, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF6A, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF6B, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBF6C, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF6D, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF6E, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF6F, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBF70, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBF71, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBF72, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF73, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF74, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF75, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF76, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBF77, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBF78, {0x00,0x00,0x52,0xA0,0x52,0xA0,0x7E,0xA0,0x52,0xA0,0x52,0xE0,0x3E,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xBF79, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xBF7A, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xBF7B, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBF7C, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF7D, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xBF7E, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xBF7F, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF80, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF81, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xBF82, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF83, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF84, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF85, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF86, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF87, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBF88, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF89, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF8A, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBF8B, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF8C, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBF8D, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF8E, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF8F, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBF90, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF91, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBF92, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xE0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBF93, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBF94, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF95, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBF96, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBF97, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBF98, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF99, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBF9A, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBF9B, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF9C, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF9D, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBF9E, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBF9F, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFA0, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBFA1, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBFA2, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBFA3, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBFA4, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFA5, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFA6, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBFA7, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBFA8, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBFA9, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBFAA, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBFAB, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBFAC, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFAD, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFAE, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xBFAF, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xBFB0, {0x00,0x00,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x39,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xBFB1, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBFB2, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBFB3, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBFB4, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFB5, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBFB6, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBFB7, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFB8, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFB9, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBFBA, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFBB, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFBC, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBFBD, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFBE, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFBF, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBFC0, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFC1, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFC2, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBFC3, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBFC4, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBFC5, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBFC6, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBFC7, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBFC8, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFC9, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFCA, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBFCB, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBFCC, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xBFCD, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBFCE, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBFCF, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xBFD0, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFD1, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xBFD2, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBFD3, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFD4, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFD5, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xBFD6, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFD7, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFD8, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBFD9, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFDA, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFDB, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xBFDC, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFDD, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFDE, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xBFDF, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBFE0, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xBFE1, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xBFE2, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xBFE3, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xBFE4, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFE5, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xBFE6, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xBFE7, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xBFE8, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xBFE9, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xBFEA, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xBFEB, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xBFEC, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFED, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xBFEE, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBFEF, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFF0, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFF1, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xBFF2, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFF3, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFF4, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBFF5, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xBFF6, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xBFF7, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xBFF8, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFF9, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xBFFA, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xBFFB, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xBFFC, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xBFFD, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xBFFE, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xBFFF, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC000, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC001, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC002, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC003, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC004, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x54,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xC005, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC006, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC007, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC008, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC009, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC00A, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC00B, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC00C, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC00D, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC00E, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC00F, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC010, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC011, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC012, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC013, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC014, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC015, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC016, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC017, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC018, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC019, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC01A, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC01B, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC01C, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC01D, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC01E, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x55,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC01F, {0x00,0x00,0x54,0xA0,0x7C,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC020, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC021, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC022, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC023, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC024, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC025, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC026, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC027, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC028, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC029, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC02A, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC02B, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC02C, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC02D, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC02E, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC02F, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC030, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC031, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC032, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC033, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC034, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC035, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC036, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC037, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC038, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC039, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC03A, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC03B, {0x00,0x00,0x54,0x40,0x7C,0x40,0x54,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC03C, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xC03D, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC03E, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC03F, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC040, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC041, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC042, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC043, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC044, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC045, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC046, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC047, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC048, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC049, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC04A, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC04B, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC04C, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC04D, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC04E, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC04F, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC050, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC051, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC052, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC053, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC054, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC055, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC056, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC057, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x31,0x80,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC058, {0x00,0x00,0x4A,0x40,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x4A,0x40,0x39,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC059, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC05A, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC05B, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC05C, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC05D, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC05E, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC05F, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC060, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC061, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC062, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC063, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC064, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC065, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC066, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC067, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC068, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC069, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC06A, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC06B, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC06C, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC06D, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC06E, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC06F, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC070, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC071, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC072, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x4A,0x40,0x39,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC073, {0x00,0x00,0x4A,0x40,0x7B,0xC0,0x31,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC074, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC075, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC076, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC077, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC078, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC079, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC07A, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC07B, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC07C, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC07D, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC07E, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC07F, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC080, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC081, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC082, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC083, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC084, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC085, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC086, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC087, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC088, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC089, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC08A, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC08B, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC08C, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC08D, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC08E, {0x00,0x00,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC08F, {0x00,0x00,0x55,0x40,0x77,0x40,0x32,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC090, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC091, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC092, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC093, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC094, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC095, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC096, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC097, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC098, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC099, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC09A, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC09B, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC09C, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC09D, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC09E, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC09F, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC0A0, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0A1, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0A2, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC0A3, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC0A4, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC0A5, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC0A6, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0A7, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0A8, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0A9, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0AA, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x55,0x40,0x33,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC0AB, {0x00,0x00,0x55,0x40,0x55,0x40,0x77,0x40,0x55,0x40,0x33,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC0AC, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x70,0x14,0x40,0x22,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC0AD, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC0AE, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC0AF, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC0B0, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0B1, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC0B2, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC0B3, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0B4, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0B5, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC0B6, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0B7, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0B8, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC0B9, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0BA, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0BB, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC0BC, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0BD, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0BE, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC0BF, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC0C0, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC0C1, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC0C2, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0C3, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0C4, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0C5, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0C6, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC0C7, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC0C8, {0x00,0x00,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x29,0x20,0x29,0xE0,0x45,0x20,0x45,0x20,0x83,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC0C9, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC0CA, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC0CB, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC0CC, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0CD, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC0CE, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC0CF, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D0, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D1, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC0D2, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D3, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D4, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC0D5, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D6, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D7, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC0D8, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0D9, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0DA, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC0DB, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC0DC, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC0DD, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0DE, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0DF, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0E0, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0E1, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0E2, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC0E3, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC0E4, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC0E5, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC0E6, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC0E7, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC0E8, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0E9, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC0EA, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC0EB, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0EC, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0ED, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC0EE, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0EF, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0F0, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC0F1, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0F2, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC0F3, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC0F4, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0F5, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0F6, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC0F7, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC0F8, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC0F9, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC0FA, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0FB, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC0FC, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0FD, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC0FE, {0x00,0x00,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC0FF, {0x00,0x00,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC100, {0x00,0x00,0x11,0x20,0x11,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x29,0x20,0x45,0xE0,0x45,0x20,0x83,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC101, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC102, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC103, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC104, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC105, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC106, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC107, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC108, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC109, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC10A, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC10B, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC10C, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC10D, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC10E, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC10F, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC110, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC111, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC112, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC113, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC114, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC115, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC116, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC117, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC118, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC119, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC11A, {0x00,0x00,0x11,0x20,0x11,0x20,0x19,0xE0,0x25,0x20,0x43,0x20,0x81,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC11B, {0x00,0x00,0x09,0x20,0x09,0x20,0x15,0xE0,0x23,0x20,0x43,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC11C, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x14,0x40,0x22,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC11D, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC11E, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC11F, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC120, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC121, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC122, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC123, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC124, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC125, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC126, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC127, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC128, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC129, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC12A, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC12B, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC12C, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC12D, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC12E, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC12F, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC130, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC131, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC132, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC133, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC134, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC135, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC136, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC137, {0x00,0x00,0x08,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC138, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x10,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x44,0xA0,0x82,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC139, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC13A, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC13B, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC13C, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC13D, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC13E, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC13F, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC140, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC141, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC142, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC143, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC144, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC145, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC146, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC147, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC148, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC149, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC14A, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC14B, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC14C, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC14D, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC14E, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC14F, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC150, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC151, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC152, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x1B,0xA0,0x24,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC153, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x17,0xA0,0x22,0xA0,0x42,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC154, {0x00,0x00,0x08,0x40,0x08,0x40,0x09,0xC0,0x08,0x40,0x14,0x40,0x15,0xC0,0x22,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC155, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC156, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC157, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC158, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC159, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC15A, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC15B, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC15C, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC15D, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC15E, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC15F, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC160, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC161, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC162, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC163, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC164, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC165, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC166, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC167, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC168, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC169, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC16A, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC16B, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC16C, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC16D, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC16E, {0x00,0x00,0x08,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC16F, {0x00,0x00,0x08,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC170, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x44,0xA0,0x82,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC171, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC172, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC173, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC174, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC175, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC176, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC177, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC178, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC179, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC17A, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC17B, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC17C, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC17D, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC17E, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC17F, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC180, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC181, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC182, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC183, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC184, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC185, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC186, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC187, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC188, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC189, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC18A, {0x00,0x00,0x10,0xA0,0x13,0xA0,0x18,0xA0,0x27,0xA0,0x42,0xA0,0x80,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC18B, {0x00,0x00,0x08,0xA0,0x0B,0xA0,0x14,0xA0,0x23,0xA0,0x42,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC18C, {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC18D, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC18E, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC18F, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC190, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC191, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC192, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC193, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC194, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC195, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC196, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC197, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC198, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC199, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC19A, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC19B, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC19C, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC19D, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC19E, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC19F, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC1A0, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC1A1, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC1A2, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC1A3, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC1A4, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC1A5, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC1A6, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC1A7, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC1A8, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC1A9, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC1AA, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC1AB, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC1AC, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1AD, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC1AE, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC1AF, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1B0, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1B1, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC1B2, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1B3, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1B4, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC1B5, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1B6, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1B7, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC1B8, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1B9, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1BA, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC1BB, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC1BC, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC1BD, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC1BE, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1BF, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1C0, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1C1, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1C2, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC1C3, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC1C4, {0x00,0x00,0x08,0xA0,0x08,0xA0,0x08,0xA0,0x14,0xA0,0x24,0xE0,0x42,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC1C5, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC1C6, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC1C7, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC1C8, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1C9, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC1CA, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC1CB, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1CC, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1CD, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC1CE, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1CF, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1D0, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC1D1, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1D2, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1D3, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC1D4, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1D5, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1D6, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC1D7, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1D8, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC1D9, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1DA, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1DB, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1DC, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1DD, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1DE, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC1DF, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC1E0, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC1E1, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC1E2, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC1E3, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC1E4, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1E5, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC1E6, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC1E7, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1E8, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1E9, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC1EA, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1EB, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1EC, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC1ED, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1EE, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC1EF, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC1F0, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1F1, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1F2, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC1F3, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC1F4, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC1F5, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC1F6, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1F7, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC1F8, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1F9, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC1FA, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC1FB, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC1FC, {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC1FD, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC1FE, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC1FF, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC200, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC201, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC202, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC203, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC204, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC205, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC206, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC207, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC208, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC209, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC20A, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC20B, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC20C, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC20D, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC20E, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC20F, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC210, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC211, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC212, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC213, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC214, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC215, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC216, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC217, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC218, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xC219, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC21A, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC21B, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC21C, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC21D, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC21E, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC21F, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC220, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC221, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC222, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC223, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC224, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC225, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC226, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC227, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC228, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC229, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC22A, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC22B, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC22C, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC22D, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC22E, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC22F, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC230, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC231, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC232, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC233, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC234, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC235, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC236, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC237, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC238, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC239, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC23A, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC23B, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC23C, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC23D, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC23E, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC23F, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC240, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC241, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC242, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC243, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC244, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC245, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC246, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC247, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC248, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC249, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC24A, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC24B, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC24C, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC24D, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC24E, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC24F, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC250, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xC251, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC252, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC253, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC254, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC255, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC256, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC257, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC258, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC259, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC25A, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC25B, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC25C, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC25D, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC25E, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC25F, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC260, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC261, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC262, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC263, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC264, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC265, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC266, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC267, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC268, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC269, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC26A, {0x00,0x00,0x10,0xA0,0x10,0xA0,0x29,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC26B, {0x00,0x00,0x10,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC26C, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC26D, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC26E, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC26F, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC270, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC271, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC272, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC273, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC274, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC275, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC276, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC277, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC278, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC279, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC27A, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC27B, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC27C, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC27D, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC27E, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC27F, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC280, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC281, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC282, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC283, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC284, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC285, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC286, {0x00,0x00,0x10,0x40,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC287, {0x00,0x00,0x10,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC288, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0xC0,0x60,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xC289, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC28A, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC28B, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC28C, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC28D, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC28E, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC28F, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC290, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC291, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC292, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC293, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC294, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC295, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC296, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC297, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC298, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC299, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC29A, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC29B, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC29C, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC29D, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC29E, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC29F, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC2A0, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2A1, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2A2, {0x00,0x00,0x04,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC2A3, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC2A4, {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0A,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC2A5, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2A6, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC2A7, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC2A8, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2A9, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC2AA, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC2AB, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2AC, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2AD, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC2AE, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2AF, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2B0, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC2B1, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2B2, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2B3, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC2B4, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2B5, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2B6, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC2B7, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC2B8, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC2B9, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC2BA, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC2BB, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC2BC, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2BD, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC2BE, {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC2BF, {0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC2C0, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2C1, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2C2, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC2C3, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC2C4, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2C5, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC2C6, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC2C7, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2C8, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2C9, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC2CA, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2CB, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2CC, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC2CD, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC2CE, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC2CF, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC2D0, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2D1, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2D2, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC2D3, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC2D4, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC2D5, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC2D6, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC2D7, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC2D8, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2D9, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2DA, {0x00,0x00,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC2DB, {0x00,0x00,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC2DC, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2DD, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2DE, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC2DF, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC2E0, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2E1, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC2E2, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC2E3, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2E4, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2E5, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC2E6, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2E7, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2E8, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC2E9, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2EA, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC2EB, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC2EC, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2ED, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2EE, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC2EF, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC2F0, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC2F1, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC2F2, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC2F3, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC2F4, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2F5, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2F6, {0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC2F7, {0x00,0x00,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC2F8, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2F9, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC2FA, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC2FB, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC2FC, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC2FD, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC2FE, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC2FF, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC300, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC301, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC302, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC303, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC304, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC305, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC306, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC307, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC308, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC309, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC30A, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC30B, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC30C, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC30D, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC30E, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC30F, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC310, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC311, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC312, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC313, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC314, {0x00,0x00,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x55,0xE0,0x55,0x20,0x95,0x20,0x23,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC315, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC316, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC317, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC318, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC319, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC31A, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC31B, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC31C, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC31D, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC31E, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC31F, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC320, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC321, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC322, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC323, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC324, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC325, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC326, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC327, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC328, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC329, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC32A, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC32B, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC32C, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC32D, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC32E, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC32F, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC330, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x70,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC331, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC332, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC333, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC334, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC335, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC336, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC337, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC338, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC339, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC33A, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC33B, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC33C, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC33D, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC33E, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC33F, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC340, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC341, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC342, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC343, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC344, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC345, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC346, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC347, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC348, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC349, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC34A, {0x00,0x00,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC34B, {0x00,0x00,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC34C, {0x00,0x00,0x29,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x55,0x20,0x55,0xE0,0x95,0x20,0x23,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC34D, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC34E, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC34F, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC350, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC351, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC352, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC353, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC354, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC355, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC356, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC357, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC358, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC359, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC35A, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC35B, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC35C, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC35D, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC35E, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC35F, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC360, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC361, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC362, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC363, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC364, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC365, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC366, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC367, {0x00,0x00,0x25,0x20,0x25,0x20,0x25,0xE0,0x5B,0x20,0x93,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC368, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC369, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC36A, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC36B, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC36C, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC36D, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC36E, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC36F, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC370, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC371, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC372, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC373, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC374, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC375, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC376, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC377, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC378, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC379, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC37A, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC37B, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC37C, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC37D, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC37E, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC37F, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC380, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC381, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC382, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC383, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC384, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x28,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x94,0xA0,0x22,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC385, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC386, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC387, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC388, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC389, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC38A, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC38B, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC38C, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC38D, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC38E, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC38F, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC390, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC391, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC392, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC393, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC394, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC395, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC396, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC397, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC398, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC399, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC39A, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC39B, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC39C, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC39D, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC39E, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC39F, {0x00,0x00,0x24,0xA0,0x24,0xA0,0x27,0xA0,0x5A,0xA0,0x92,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC3A0, {0x00,0x00,0x22,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC3A1, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC3A2, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC3A3, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC3A4, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3A5, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC3A6, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC3A7, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3A8, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3A9, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC3AA, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3AB, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3AC, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC3AD, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3AE, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3AF, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC3B0, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3B1, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3B2, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC3B3, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC3B4, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC3B5, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC3B6, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC3B7, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC3B8, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3B9, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3BA, {0x00,0x00,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC3BB, {0x00,0x00,0x22,0x40,0x23,0xC0,0x55,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC3BC, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x94,0xA0,0x22,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC3BD, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC3BE, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC3BF, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC3C0, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3C1, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC3C2, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC3C3, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3C4, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3C5, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC3C6, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3C7, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3C8, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC3C9, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3CA, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3CB, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC3CC, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3CD, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3CE, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC3CF, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC3D0, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC3D1, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3D2, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC3D3, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC3D4, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3D5, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC3D6, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC3D7, {0x00,0x00,0x24,0xA0,0x27,0xA0,0x24,0xA0,0x5B,0xA0,0x92,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC3D8, {0x00,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x31,0x80,0x4A,0x40,0x84,0x20,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC3D9, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC3DA, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC3DB, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC3DC, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3DD, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC3DE, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC3DF, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E0, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E1, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC3E2, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E3, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E4, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC3E5, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E6, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E7, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC3E8, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3E9, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3EA, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC3EB, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC3EC, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC3ED, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC3EE, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC3EF, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC3F0, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3F1, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC3F2, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC3F3, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC3F4, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC3F5, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC3F6, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC3F7, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC3F8, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3F9, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC3FA, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC3FB, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3FC, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3FD, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC3FE, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC3FF, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC400, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC401, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC402, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC403, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC404, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC405, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC406, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC407, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC408, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC409, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC40A, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC40B, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC40C, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC40D, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC40E, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC40F, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC410, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC411, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC412, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC413, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC414, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC415, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC416, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC417, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC418, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC419, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC41A, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC41B, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC41C, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC41D, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC41E, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC41F, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC420, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC421, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC422, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC423, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC424, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC425, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC426, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC427, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC428, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC429, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC42A, {0x00,0x00,0x14,0xA0,0x14,0xA0,0x2C,0xE0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC42B, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x52,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC42C, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC42D, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC42E, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC42F, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC430, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC431, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC432, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC433, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC434, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC435, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC436, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC437, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC438, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC439, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC43A, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC43B, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC43C, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC43D, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC43E, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC43F, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC440, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC441, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC442, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC443, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC444, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC445, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC446, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC447, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC448, {0x00,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x31,0x80,0x4A,0x40,0x84,0x20,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC449, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC44A, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC44B, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC44C, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC44D, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC44E, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC44F, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC450, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC451, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC452, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC453, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC454, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC455, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC456, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC457, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC458, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC459, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC45A, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC45B, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC45C, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC45D, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC45E, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC45F, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC460, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC461, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC462, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC463, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC464, {0x00,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xC465, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC466, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC467, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC468, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC469, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC46A, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC46B, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC46C, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC46D, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC46E, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC46F, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC470, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC471, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC472, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC473, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC474, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC475, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC476, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC477, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC478, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC479, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC47A, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC47B, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC47C, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC47D, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC47E, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC47F, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC480, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC481, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC482, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC483, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC484, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC485, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC486, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC487, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC488, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC489, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC48A, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC48B, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC48C, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC48D, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC48E, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC48F, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC490, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC491, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC492, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC493, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC494, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC495, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC496, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC497, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC498, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC499, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC49A, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC49B, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC49C, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xC49D, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC49E, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC49F, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC4A0, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4A1, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC4A2, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC4A3, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4A4, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4A5, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC4A6, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4A7, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4A8, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC4A9, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4AA, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4AB, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC4AC, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4AD, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4AE, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC4AF, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC4B0, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC4B1, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4B2, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC4B3, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC4B4, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4B5, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4B6, {0x00,0x00,0x28,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC4B7, {0x00,0x00,0x14,0xA0,0x2A,0xA0,0x53,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC4B8, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC4B9, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC4BA, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC4BB, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC4BC, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4BD, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC4BE, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC4BF, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4C0, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4C1, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC4C2, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4C3, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4C4, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC4C5, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4C6, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC4C7, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC4C8, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4C9, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4CA, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC4CB, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC4CC, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC4CD, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC4CE, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC4CF, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC4D0, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4D1, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC4D2, {0x00,0x00,0x28,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC4D3, {0x00,0x00,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC4D4, {0x00,0x00,0x20,0x80,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xC4D5, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC4D6, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC4D7, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC4D8, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4D9, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC4DA, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC4DB, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4DC, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4DD, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC4DE, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4DF, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4E0, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC4E1, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4E2, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4E3, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC4E4, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4E5, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4E6, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC4E7, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC4E8, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC4E9, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC4EA, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC4EB, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC4EC, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4ED, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4EE, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC4EF, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC4F0, {0x00,0x00,0x10,0x80,0x10,0x80,0x10,0x80,0x31,0x80,0x4A,0x40,0x84,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC4F1, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC4F2, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC4F3, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC4F4, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4F5, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC4F6, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC4F7, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4F8, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4F9, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC4FA, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4FB, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4FC, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC4FD, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4FE, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC4FF, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC500, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC501, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC502, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC503, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC504, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC505, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC506, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC507, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC508, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC509, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC50A, {0x00,0x00,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC50B, {0x00,0x00,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC50C, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC50D, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC50E, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC50F, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC510, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC511, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC512, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC513, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC514, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC515, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC516, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC517, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC518, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC519, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC51A, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC51B, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC51C, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC51D, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC51E, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC51F, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC520, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC521, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC522, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC523, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC524, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC525, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC526, {0x00,0x00,0x12,0x40,0x12,0x40,0x2D,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC527, {0x00,0x00,0x12,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC528, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC529, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC52A, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC52B, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC52C, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC52D, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC52E, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC52F, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC530, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC531, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC532, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC533, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC534, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC535, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC536, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC537, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC538, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC539, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC53A, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC53B, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC53C, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC53D, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC53E, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC53F, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC540, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC541, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC542, {0x00,0x00,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC543, {0x00,0x00,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC544, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC545, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC546, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC547, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC548, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC549, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC54A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC54B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC54C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC54D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC54E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC54F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC550, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC551, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC552, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC553, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC554, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC555, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC556, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC557, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC558, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC559, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC55A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC55B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC55C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC55D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC55E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC55F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC560, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0x20,0x45,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x45,0x20,0x39,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC561, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC562, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC563, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC564, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC565, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC566, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC567, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC568, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC569, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC56A, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC56B, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC56C, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC56D, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC56E, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC56F, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC570, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC571, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC572, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC573, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC574, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC575, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC576, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC577, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC578, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC579, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC57A, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC57B, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC57C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC57D, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC57E, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC57F, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC580, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC581, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC582, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC583, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC584, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC585, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC586, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC587, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC588, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC589, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC58A, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC58B, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC58C, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC58D, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC58E, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC58F, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC590, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC591, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC592, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC593, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC594, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC595, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC596, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC597, {0x00,0x00,0x3C,0x40,0x42,0x70,0x42,0x40,0x42,0x70,0x3C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC598, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x45,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC599, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC59A, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC59B, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC59C, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC59D, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC59E, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC59F, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A0, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A1, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC5A2, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A3, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A4, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC5A5, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A6, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A7, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC5A8, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5A9, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5AA, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC5AB, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC5AC, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC5AD, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5AE, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC5AF, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC5B0, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5B1, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5B2, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC5B3, {0x00,0x00,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC5B4, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC5B5, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC5B6, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC5B7, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC5B8, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5B9, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC5BA, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC5BB, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5BC, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5BD, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC5BE, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5BF, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5C0, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC5C1, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5C2, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5C3, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC5C4, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5C5, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5C6, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC5C7, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC5C8, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC5C9, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC5CA, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC5CB, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC5CC, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5CD, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5CE, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC5CF, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC5D0, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC5D1, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC5D2, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC5D3, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC5D4, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5D5, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC5D6, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC5D7, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5D8, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5D9, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC5DA, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5DB, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5DC, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC5DD, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5DE, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5DF, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC5E0, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5E1, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5E2, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC5E3, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC5E4, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC5E5, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5E6, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC5E7, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC5E8, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5E9, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5EA, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC5EB, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC5EC, {0x00,0x00,0x3C,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC5ED, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC5EE, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC5EF, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC5F0, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5F1, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC5F2, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC5F3, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5F4, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5F5, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC5F6, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5F7, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5F8, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC5F9, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5FA, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC5FB, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC5FC, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5FD, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC5FE, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC5FF, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC600, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC601, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC602, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC603, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC604, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC605, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC606, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC607, {0x00,0x00,0x3C,0x40,0x43,0xC0,0x42,0x40,0x43,0xC0,0x3C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC608, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC609, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC60A, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC60B, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC60C, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC60D, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC60E, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC60F, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC610, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC611, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC612, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC613, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC614, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC615, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC616, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC617, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC618, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC619, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC61A, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC61B, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC61C, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC61D, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC61E, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC61F, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC620, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC621, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC622, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC623, {0x00,0x00,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC624, {0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC625, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC626, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC627, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC628, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC629, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC62A, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC62B, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC62C, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC62D, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC62E, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC62F, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC630, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC631, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC632, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC633, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC634, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC635, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC636, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC637, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC638, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC639, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC63A, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC63B, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC63C, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC63D, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC63E, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC63F, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC640, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC641, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC642, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC643, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC644, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC645, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC646, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC647, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC648, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC649, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC64A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC64B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC64C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC64D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC64E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC64F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC650, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC651, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC652, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC653, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC654, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC655, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC656, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC657, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC658, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC659, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC65A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC65B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC65C, {0x00,0x00,0x3C,0xA0,0x42,0xA0,0x42,0xA0,0x42,0xA0,0x3C,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC65D, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC65E, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC65F, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC660, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC661, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC662, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC663, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC664, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC665, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC666, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC667, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC668, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC669, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC66A, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC66B, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC66C, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC66D, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC66E, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC66F, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC670, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC671, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC672, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC673, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC674, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC675, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC676, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xE0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC677, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x38,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC678, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC679, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC67A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC67B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC67C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC67D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC67E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC67F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC680, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC681, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC682, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC683, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC684, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC685, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC686, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC687, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC688, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC689, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC68A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC68B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC68C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC68D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC68E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC68F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC690, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC691, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC692, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC693, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC694, {0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC695, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC696, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC697, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC698, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC699, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC69A, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC69B, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC69C, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC69D, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC69E, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC69F, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6A0, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC6A1, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6A2, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6A3, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC6A4, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6A5, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6A6, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC6A7, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC6A8, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC6A9, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC6AA, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC6AB, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC6AC, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6AD, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6AE, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC6AF, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC6B0, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xC6B1, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC6B2, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC6B3, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC6B4, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6B5, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC6B6, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC6B7, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6B8, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6B9, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC6BA, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6BB, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6BC, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC6BD, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6BE, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6BF, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC6C0, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6C1, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6C2, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC6C3, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC6C4, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC6C5, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC6C6, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC6C7, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC6C8, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6C9, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC6CA, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC6CB, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC6CC, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC6CD, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC6CE, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC6CF, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC6D0, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6D1, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC6D2, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC6D3, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6D4, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6D5, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC6D6, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6D7, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6D8, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC6D9, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6DA, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6DB, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC6DC, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6DD, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6DE, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC6DF, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC6E0, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC6E1, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC6E2, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC6E3, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC6E4, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6E5, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6E6, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0xC0,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC6E7, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC6E8, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xC6E9, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC6EA, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC6EB, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC6EC, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6ED, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC6EE, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC6EF, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F0, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F1, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC6F2, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F3, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F4, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC6F5, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F6, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F7, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC6F8, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6F9, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC6FA, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC6FB, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC6FC, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC6FD, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC6FE, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC6FF, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC700, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC701, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC702, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x45,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC703, {0x00,0x00,0x38,0xA0,0x44,0xA0,0x39,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC704, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC705, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC706, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC707, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC708, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC709, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC70A, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC70B, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC70C, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC70D, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC70E, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC70F, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC710, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC711, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC712, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC713, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC714, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC715, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC716, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC717, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC718, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC719, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC71A, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC71B, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC71C, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC71D, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC71E, {0x00,0x00,0x38,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC71F, {0x00,0x00,0x38,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC720, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xC721, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC722, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC723, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC724, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC725, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC726, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC727, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC728, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC729, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC72A, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC72B, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC72C, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC72D, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC72E, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC72F, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC730, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC731, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC732, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC733, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC734, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC735, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC736, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC737, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC738, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC739, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC73A, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC73B, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC73C, {0x00,0x00,0x1F,0x00,0x20,0x80,0x40,0x40,0x40,0x40,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC73D, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC73E, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC73F, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC740, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC741, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC742, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC743, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC744, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC745, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC746, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC747, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC748, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC749, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC74A, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC74B, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC74C, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC74D, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC74E, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC74F, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC750, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC751, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC752, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC753, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC754, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC755, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC756, {0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC757, {0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC758, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC759, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC75A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC75B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC75C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC75D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC75E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC75F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC760, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC761, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC762, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC763, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC764, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC765, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC766, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC767, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC768, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC769, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC76A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC76B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC76C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC76D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC76E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC76F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC770, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC771, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC772, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC773, {0x00,0x00,0x3C,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC774, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC775, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC776, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC777, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC778, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC779, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC77A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC77B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC77C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC77D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC77E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC77F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC780, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC781, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC782, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC783, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC784, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC785, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC786, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC787, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC788, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC789, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC78A, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC78B, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC78C, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC78D, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC78E, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC78F, {0x00,0x00,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC790, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC791, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC792, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC793, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC794, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC795, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC796, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC797, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC798, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC799, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC79A, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC79B, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC79C, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC79D, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC79E, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC79F, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC7A0, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7A1, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7A2, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC7A3, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC7A4, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC7A5, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC7A6, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7A7, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7A8, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7A9, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7AA, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC7AB, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC7AC, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x45,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC7AD, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC7AE, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC7AF, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC7B0, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7B1, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC7B2, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC7B3, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7B4, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7B5, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC7B6, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7B7, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7B8, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC7B9, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7BA, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7BB, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC7BC, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7BD, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7BE, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC7BF, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC7C0, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC7C1, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7C2, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7C3, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7C4, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7C5, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7C6, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC7C7, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC7C8, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x70,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC7C9, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC7CA, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC7CB, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC7CC, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7CD, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC7CE, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC7CF, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7D0, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7D1, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC7D2, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7D3, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7D4, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC7D5, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7D6, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7D7, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC7D8, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7D9, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7DA, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC7DB, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC7DC, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC7DD, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC7DE, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7DF, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7E0, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7E1, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7E2, {0x00,0x00,0x7F,0x40,0x08,0x70,0x08,0x40,0x14,0x70,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC7E3, {0x00,0x00,0x7F,0x40,0x08,0x70,0x14,0x40,0x22,0x70,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC7E4, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x11,0x20,0x11,0x20,0x29,0x20,0x29,0xE0,0x45,0x20,0x45,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC7E5, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC7E6, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC7E7, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC7E8, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7E9, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC7EA, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC7EB, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7EC, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7ED, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC7EE, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7EF, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7F0, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC7F1, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7F2, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7F3, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC7F4, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7F5, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7F6, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC7F7, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC7F8, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC7F9, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC7FA, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7FB, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC7FC, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7FD, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC7FE, {0x00,0x00,0x7D,0x20,0x11,0x20,0x11,0xE0,0x29,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC7FF, {0x00,0x00,0x7D,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC800, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x09,0xC0,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC801, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC802, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC803, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC804, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC805, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC806, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC807, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC808, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC809, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC80A, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC80B, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC80C, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC80D, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC80E, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC80F, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC810, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC811, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC812, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC813, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC814, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC815, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC816, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC817, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC818, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC819, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC81A, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC81B, {0x00,0x00,0x7F,0x40,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC81C, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x10,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC81D, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC81E, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC81F, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC820, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC821, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC822, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC823, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC824, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC825, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC826, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC827, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC828, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC829, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC82A, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC82B, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC82C, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC82D, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC82E, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC82F, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC830, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC831, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC832, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC833, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC834, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC835, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC836, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC837, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC838, {0x00,0x00,0x7F,0x40,0x08,0x40,0x09,0xC0,0x08,0x40,0x08,0x40,0x15,0xC0,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC839, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC83A, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC83B, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC83C, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC83D, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC83E, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC83F, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC840, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC841, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC842, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC843, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC844, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC845, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC846, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC847, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC848, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC849, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC84A, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC84B, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC84C, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC84D, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC84E, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC84F, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC850, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC851, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC852, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x08,0x40,0x15,0xC0,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC853, {0x00,0x00,0x7F,0x40,0x09,0xC0,0x14,0x40,0x23,0xC0,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC854, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC855, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC856, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC857, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC858, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC859, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC85A, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC85B, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC85C, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC85D, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC85E, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC85F, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC860, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC861, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC862, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC863, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC864, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC865, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC866, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC867, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xC868, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xC869, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC86A, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC86B, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC86C, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC86D, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC86E, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC86F, {0x00,0x00,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC870, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC871, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC872, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC873, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC874, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC875, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC876, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC877, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC878, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC879, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC87A, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC87B, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC87C, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC87D, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC87E, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC87F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC880, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC881, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC882, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC883, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC884, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC885, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC886, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC887, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC888, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC889, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC88A, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC88B, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC88C, {0x00,0x00,0x7E,0x40,0x18,0x40,0x24,0x40,0x24,0x40,0x42,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC88D, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC88E, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC88F, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC890, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC891, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC892, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC893, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC894, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC895, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC896, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC897, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC898, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC899, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC89A, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC89B, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC89C, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC89D, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC89E, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC89F, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC8A0, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC8A1, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC8A2, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8A3, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8A4, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8A5, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8A6, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC8A7, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC8A8, {0x00,0x00,0x7E,0xA0,0x18,0xA0,0x24,0xA0,0x24,0xA0,0x42,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xC8A9, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC8AA, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC8AB, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC8AC, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8AD, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC8AE, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC8AF, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B0, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B1, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC8B2, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B3, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B4, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC8B5, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B6, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B7, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC8B8, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8B9, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8BA, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC8BB, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8BC, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC8BD, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8BE, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8BF, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8C0, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8C1, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8C2, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC8C3, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x44,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC8C4, {0x00,0x00,0x7E,0x40,0x18,0x40,0x24,0x40,0x24,0x40,0x42,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC8C5, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC8C6, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC8C7, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC8C8, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8C9, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC8CA, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC8CB, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8CC, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8CD, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC8CE, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8CF, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8D0, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC8D1, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8D2, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC8D3, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC8D4, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8D5, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8D6, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC8D7, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC8D8, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC8D9, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC8DA, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8DB, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC8DC, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8DD, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC8DE, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC8DF, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC8E0, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC8E1, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC8E2, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC8E3, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC8E4, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8E5, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC8E6, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC8E7, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8E8, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8E9, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC8EA, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8EB, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8EC, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC8ED, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8EE, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8EF, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC8F0, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8F1, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8F2, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC8F3, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC8F4, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC8F5, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC8F6, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC8F7, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC8F8, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8F9, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC8FA, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC8FB, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC8FC, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xC8FD, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC8FE, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC8FF, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC900, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC901, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC902, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC903, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC904, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC905, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC906, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC907, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC908, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC909, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC90A, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC90B, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC90C, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC90D, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC90E, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC90F, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC910, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC911, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC912, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC913, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC914, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC915, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC916, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC917, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC918, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC919, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC91A, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC91B, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC91C, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC91D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC91E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC91F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC920, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC921, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC922, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC923, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC924, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC925, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC926, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC927, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC928, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC929, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC92A, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC92B, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC92C, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC92D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC92E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC92F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC930, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC931, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC932, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC933, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC934, {0x00,0x00,0x7C,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xC935, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC936, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC937, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC938, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC939, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC93A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC93B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC93C, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC93D, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xC93E, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC93F, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC940, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC941, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC942, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC943, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC944, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC945, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xC946, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC947, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC948, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC949, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xC94A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC94B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC94C, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC94D, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC94E, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC94F, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x45,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC950, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xC951, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC952, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC953, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC954, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC955, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC956, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC957, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC958, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC959, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC95A, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC95B, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC95C, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC95D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC95E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC95F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC960, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC961, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC962, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC963, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC964, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC965, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC966, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC967, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC968, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC969, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC96A, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC96B, {0x00,0x00,0x7C,0x40,0x28,0x40,0x44,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC96C, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xC96D, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC96E, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC96F, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC970, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC971, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC972, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC973, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC974, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC975, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC976, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC977, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC978, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC979, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC97A, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC97B, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC97C, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC97D, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC97E, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC97F, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC980, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC981, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC982, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC983, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC984, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC985, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC986, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC987, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC988, {0x00,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xC989, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC98A, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC98B, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xC98C, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC98D, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xC98E, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC98F, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC990, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC991, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xC992, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC993, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC994, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC995, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC996, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xC997, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC998, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC999, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xC99A, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xC99B, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC99C, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xC99D, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xC99E, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xC99F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xC9A0, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC9A1, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xC9A2, {0x00,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xC9A3, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xC9A4, {0x00,0x00,0x7E,0x40,0x18,0x40,0x24,0x40,0x24,0x40,0x42,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC9A5, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC9A6, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC9A7, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC9A8, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9A9, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC9AA, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC9AB, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9AC, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9AD, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC9AE, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9AF, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9B0, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC9B1, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC9B2, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC9B3, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xC9B4, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9B5, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9B6, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC9B7, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xC9B8, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC9B9, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC9BA, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC9BB, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC9BC, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9BD, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9BE, {0x00,0x00,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC9BF, {0x00,0x00,0x7F,0x40,0x22,0x40,0x55,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC9C0, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC9C1, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC9C2, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC9C3, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC9C4, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9C5, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC9C6, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC9C7, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9C8, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9C9, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC9CA, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9CB, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9CC, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC9CD, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9CE, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC9CF, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC9D0, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9D1, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9D2, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC9D3, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC9D4, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC9D5, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC9D6, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC9D7, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC9D8, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9D9, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9DA, {0x00,0x00,0x7F,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC9DB, {0x00,0x00,0x7F,0x40,0x08,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC9DC, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC9DD, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xC9DE, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xC9DF, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC9E0, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9E1, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xC9E2, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xC9E3, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9E4, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9E5, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xC9E6, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9E7, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9E8, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xC9E9, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9EA, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xC9EB, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xC9EC, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9ED, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9EE, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xC9EF, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xC9F0, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xC9F1, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xC9F2, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC9F3, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xC9F4, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9F5, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xC9F6, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xC9F7, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xC9F8, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x55,0xE0,0x55,0x20,0x95,0x20,0x23,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xC9F9, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xC9FA, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xC9FB, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xC9FC, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xC9FD, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xC9FE, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xC9FF, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA00, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA01, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCA02, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA03, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA04, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA05, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA06, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA07, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCA08, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA09, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA0A, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA0B, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCA0C, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCA0D, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA0E, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA0F, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA10, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA11, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA12, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCA13, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCA14, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x70,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x70,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCA15, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCA16, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCA17, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCA18, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA19, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCA1A, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCA1B, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA1C, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA1D, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCA1E, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA1F, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA20, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA21, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA22, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA23, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCA24, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA25, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA26, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCA27, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCA28, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCA29, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCA2A, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA2B, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA2C, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA2D, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA2E, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x22,0x70,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCA2F, {0x00,0x00,0x77,0x40,0x22,0x70,0x22,0x40,0x55,0x70,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCA30, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x55,0x20,0x55,0xE0,0x95,0x20,0x23,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xCA31, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCA32, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCA33, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCA34, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA35, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCA36, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCA37, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA38, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA39, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCA3A, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA3B, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA3C, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA3D, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA3E, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA3F, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCA40, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA41, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA42, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA43, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCA44, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCA45, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA46, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA47, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA48, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA49, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA4A, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x55,0x20,0x55,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCA4B, {0x00,0x00,0x7D,0x20,0x29,0x20,0x29,0xE0,0x55,0x20,0x55,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCA4C, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCA4D, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCA4E, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCA4F, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCA50, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA51, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCA52, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCA53, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA54, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA55, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCA56, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA57, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA58, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA59, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA5A, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA5B, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCA5C, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA5D, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA5E, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCA5F, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCA60, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCA61, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCA62, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA63, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA64, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA65, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA66, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCA67, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCA68, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x28,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x94,0xA0,0x22,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCA69, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCA6A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCA6B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCA6C, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA6D, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCA6E, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCA6F, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA70, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA71, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCA72, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA73, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA74, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA75, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA76, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA77, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCA78, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA79, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA7A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA7B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCA7C, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCA7D, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA7E, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA7F, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA80, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA81, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA82, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCA83, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCA84, {0x00,0x00,0x77,0x40,0x22,0x40,0x23,0xC0,0x22,0x40,0x22,0x40,0x55,0xC0,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCA85, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCA86, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCA87, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCA88, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA89, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCA8A, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCA8B, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA8C, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA8D, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCA8E, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA8F, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA90, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCA91, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA92, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCA93, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCA94, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA95, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA96, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCA97, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCA98, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCA99, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCA9A, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA9B, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCA9C, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA9D, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCA9E, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x23,0xC0,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCA9F, {0x00,0x00,0x77,0x40,0x23,0xC0,0x22,0x40,0x55,0xC0,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCAA0, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x94,0xA0,0x22,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCAA1, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCAA2, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCAA3, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCAA4, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAA5, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCAA6, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCAA7, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAA8, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAA9, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCAAA, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAAB, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAAC, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCAAD, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAAE, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAAF, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCAB0, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAB1, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAB2, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCAB3, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCAB4, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCAB5, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAB6, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCAB7, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCAB8, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAB9, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCABA, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x2B,0xA0,0x54,0xA0,0x54,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCABB, {0x00,0x00,0x7C,0xA0,0x2B,0xA0,0x28,0xA0,0x57,0xA0,0x54,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCABC, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCABD, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCABE, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCABF, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCAC0, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAC1, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCAC2, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCAC3, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAC4, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAC5, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCAC6, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAC7, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAC8, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCAC9, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCACA, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCACB, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCACC, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCACD, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCACE, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCACF, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCAD0, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCAD1, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCAD2, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCAD3, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCAD4, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAD5, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCAD6, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCAD7, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCAD8, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCAD9, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCADA, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCADB, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCADC, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCADD, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCADE, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCADF, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAE0, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAE1, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCAE2, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAE3, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAE4, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCAE5, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAE6, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAE7, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCAE8, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAE9, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAEA, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCAEB, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCAEC, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCAED, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCAEE, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCAEF, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCAF0, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAF1, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCAF2, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCAF3, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCAF4, {0x00,0x00,0x7E,0xA0,0x24,0xA0,0x24,0xA0,0x5A,0xA0,0x52,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCAF5, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCAF6, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCAF7, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCAF8, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAF9, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCAFA, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCAFB, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAFC, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAFD, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCAFE, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCAFF, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB00, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB01, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB02, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB03, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCB04, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB05, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB06, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB07, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB08, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCB09, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB0A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB0B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB0C, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB0D, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB0E, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x54,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCB0F, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x54,0xE0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCB10, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCB11, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCB12, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCB13, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCB14, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB15, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCB16, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCB17, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB18, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB19, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCB1A, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB1B, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB1C, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB1D, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB1E, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB1F, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCB20, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB21, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB22, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB23, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCB24, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCB25, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCB26, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB27, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB28, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB29, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB2A, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCB2B, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCB2C, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCB2D, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCB2E, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCB2F, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCB30, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB31, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCB32, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCB33, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB34, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB35, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCB36, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB37, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB38, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCB39, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB3A, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB3B, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCB3C, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB3D, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB3E, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCB3F, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCB40, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCB41, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCB42, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCB43, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCB44, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB45, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB46, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCB47, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCB48, {0x00,0x00,0x7B,0xC0,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xCB49, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCB4A, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCB4B, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCB4C, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB4D, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCB4E, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCB4F, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB50, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB51, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCB52, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB53, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB54, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCB55, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB56, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB57, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCB58, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB59, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB5A, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCB5B, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCB5C, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCB5D, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCB5E, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCB5F, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCB60, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB61, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCB62, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCB63, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCB64, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xCB65, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCB66, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCB67, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCB68, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB69, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCB6A, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCB6B, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB6C, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB6D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCB6E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB6F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB70, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB71, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB72, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB73, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCB74, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB75, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB76, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB77, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCB78, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCB79, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCB7A, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB7B, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB7C, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB7D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB7E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x54,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCB7F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCB80, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x28,0xA0,0x54,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xCB81, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCB82, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCB83, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCB84, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB85, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCB86, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCB87, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB88, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB89, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCB8A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB8B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB8C, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB8D, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB8E, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB8F, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCB90, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB91, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB92, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCB93, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB94, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCB95, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCB96, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB97, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCB98, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB99, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCB9A, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x54,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCB9B, {0x00,0x00,0x7C,0xA0,0x28,0xA0,0x55,0xA0,0x00,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCB9C, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xCB9D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCB9E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCB9F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCBA0, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBA1, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCBA2, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCBA3, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBA4, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBA5, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCBA6, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBA7, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBA8, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCBA9, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCBAA, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCBAB, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCBAC, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBAD, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBAE, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCBAF, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCBB0, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCBB1, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCBB2, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCBB3, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCBB4, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBB5, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBB6, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x54,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCBB7, {0x00,0x00,0x7C,0x40,0x28,0x40,0x54,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCBB8, {0x00,0x00,0x7B,0xC0,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xCBB9, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCBBA, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCBBB, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCBBC, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBBD, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCBBE, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCBBF, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC0, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC1, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCBC2, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC3, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC4, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCBC5, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC6, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC7, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCBC8, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBC9, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBCA, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCBCB, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCBCC, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCBCD, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCBCE, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCBCF, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCBD0, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBD1, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBD2, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCBD3, {0x00,0x00,0xFB,0xE0,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCBD4, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x20,0x80,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCBD5, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCBD6, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCBD7, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCBD8, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBD9, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCBDA, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCBDB, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBDC, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBDD, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCBDE, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBDF, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBE0, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCBE1, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBE2, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBE3, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCBE4, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBE5, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBE6, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCBE7, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCBE8, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCBE9, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCBEA, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCBEB, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCBEC, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBED, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCBEE, {0x00,0x00,0xFB,0xE0,0x20,0x80,0x51,0x40,0x8A,0x20,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCBEF, {0x00,0x00,0x7F,0xC0,0x2A,0x80,0x44,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCBF0, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCBF1, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCBF2, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCBF3, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCBF4, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBF5, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCBF6, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCBF7, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBF8, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBF9, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCBFA, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBFB, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCBFC, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCBFD, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCBFE, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCBFF, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCC00, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC01, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC02, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC03, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCC04, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCC05, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCC06, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC07, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC08, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC09, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC0A, {0x00,0x00,0x77,0x40,0x22,0x40,0x55,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCC0B, {0x00,0x00,0x7F,0x40,0x36,0x40,0x49,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCC0C, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x55,0x40,0x55,0x40,0x88,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC0D, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC0E, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCC0F, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCC10, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC11, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCC12, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCC13, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC14, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC15, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCC16, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC17, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC18, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC19, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC1A, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC1B, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCC1C, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC1D, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC1E, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCC1F, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCC20, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCC21, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCC22, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC23, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC24, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC25, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC26, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCC27, {0x00,0x00,0x77,0x40,0x22,0x40,0x22,0x40,0x55,0x40,0x89,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCC28, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x70,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC29, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC2A, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCC2B, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCC2C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC2D, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCC2E, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCC2F, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC30, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC31, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCC32, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC33, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC34, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC35, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC36, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC37, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCC38, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC39, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC3A, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCC3B, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCC3C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCC3D, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCC3E, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC3F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC40, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC41, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC42, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCC43, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCC44, {0x00,0x00,0x39,0x20,0x01,0x20,0x7D,0x20,0x11,0x20,0x11,0x20,0x29,0xE0,0x29,0x20,0x45,0x20,0x83,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xCC45, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCC46, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCC47, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCC48, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC49, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCC4A, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCC4B, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC4C, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC4D, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCC4E, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC4F, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC50, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC51, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC52, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC53, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCC54, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC55, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC56, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC57, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCC58, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCC59, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC5A, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC5B, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC5C, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC5D, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC5E, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCC5F, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCC60, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x70,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x70,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC61, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC62, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCC63, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCC64, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC65, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCC66, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCC67, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC68, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC69, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCC6A, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC6B, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC6C, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC6D, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC6E, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC6F, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCC70, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC71, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC72, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCC73, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCC74, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCC75, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCC76, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC77, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC78, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC79, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC7A, {0x00,0x00,0x1C,0x40,0x00,0x70,0x7F,0x40,0x08,0x70,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCC7B, {0x00,0x00,0x08,0x40,0x7F,0x70,0x08,0x40,0x14,0x70,0x63,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCC7C, {0x00,0x00,0x39,0x20,0x01,0x20,0x7D,0xE0,0x11,0x20,0x11,0x20,0x29,0x20,0x29,0xE0,0x45,0x20,0x83,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xCC7D, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCC7E, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCC7F, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCC80, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC81, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCC82, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCC83, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC84, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC85, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCC86, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC87, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC88, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC89, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC8A, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC8B, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCC8C, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC8D, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC8E, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCC8F, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCC90, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCC91, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC92, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC93, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCC94, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC95, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCC96, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x11,0x20,0x29,0x20,0x45,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCC97, {0x00,0x00,0x11,0x20,0x7D,0x20,0x11,0xE0,0x29,0x20,0x45,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCC98, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x09,0xC0,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC99, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCC9A, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCC9B, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCC9C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCC9D, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCC9E, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCC9F, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCA0, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCA1, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCCA2, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCA3, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCA4, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCCA5, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCA6, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCA7, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCCA8, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCA9, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCAA, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCCAB, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCCAC, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCCAD, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCCAE, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCCAF, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCCB0, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCB1, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCB2, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCCB3, {0x00,0x00,0x08,0x40,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCCB4, {0x00,0x00,0x38,0xA0,0x00,0xA0,0x7C,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x28,0xA0,0x44,0xA0,0x82,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCCB5, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCCB6, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCCB7, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCCB8, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCB9, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCCBA, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCCBB, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCBC, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCBD, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCCBE, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCBF, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCC0, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCCC1, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCC2, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCC3, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCCC4, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCC5, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCC6, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCCC7, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCCC8, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCCC9, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCCA, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCCCB, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCCCC, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCCD, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCCE, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCCCF, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCCD0, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x40,0x09,0xC0,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCCD1, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCCD2, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCCD3, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCCD4, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCD5, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCCD6, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCCD7, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCD8, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCD9, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCCDA, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCDB, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCDC, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCCDD, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCDE, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCDF, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCCE0, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCE1, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCE2, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCCE3, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCCE4, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCCE5, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCCE6, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCCE7, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCCE8, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCE9, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCCEA, {0x00,0x00,0x1C,0x40,0x01,0xC0,0x7F,0x40,0x09,0xC0,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCCEB, {0x00,0x00,0x08,0x40,0x7F,0xC0,0x08,0x40,0x15,0xC0,0x63,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCCEC, {0x00,0x00,0x38,0xA0,0x00,0xA0,0x7F,0xA0,0x10,0xA0,0x10,0xA0,0x2B,0xA0,0x28,0xA0,0x44,0xA0,0x82,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCCED, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCCEE, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCCEF, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCCF0, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCF1, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCCF2, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCCF3, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCF4, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCF5, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCCF6, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCF7, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCF8, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCCF9, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCFA, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCFB, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCCFC, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCFD, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCCFE, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCCFF, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCD00, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCD01, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD02, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCD03, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCD04, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD05, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD06, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x13,0xA0,0x28,0xA0,0x44,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCD07, {0x00,0x00,0x10,0xA0,0x7F,0xA0,0x10,0xA0,0x2B,0xA0,0x44,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCD08, {0x00,0x00,0x1F,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x44,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCD09, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD0A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCD0B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCD0C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD0D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD0E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCD0F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD10, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD11, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCD12, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD13, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD14, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD15, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD16, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD17, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCD18, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD19, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD1A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD1B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCD1C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCD1D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCD1E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCD1F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCD20, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD21, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD22, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCD23, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCD24, {0x00,0x00,0x18,0x40,0x00,0x40,0x7E,0x40,0x18,0x40,0x24,0x70,0x24,0x40,0x4A,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD25, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD26, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCD27, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCD28, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD29, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCD2A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCD2B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD2C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD2D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCD2E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD2F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD30, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCD31, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD32, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD33, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCD34, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD35, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD36, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCD37, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCD38, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCD39, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCD3A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCD3B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCD3C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD3D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD3E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD3F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x41,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCD40, {0x00,0x00,0x18,0xA0,0x00,0xA0,0x7E,0xA0,0x18,0xA0,0x24,0xE0,0x24,0xA0,0x52,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCD41, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCD42, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCD43, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xCD44, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD45, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCD46, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x40,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCD47, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD48, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD49, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCD4A, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD4B, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD4C, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCD4D, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7F,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xCD4E, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD4F, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCD50, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD51, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD52, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x24,0x00,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCD53, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCD54, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCD55, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD56, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCD57, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCD58, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD59, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD5A, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCD5B, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x18,0xE0,0x24,0xA0,0x42,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCD5C, {0x00,0x00,0x18,0x40,0x00,0x40,0x7E,0x40,0x18,0x40,0x24,0x40,0x24,0x40,0x4A,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD5D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD5E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCD5F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCD60, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD61, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCD62, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCD63, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD64, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD65, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCD66, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD67, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD68, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCD69, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD6A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCD6B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCD6C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD6D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD6E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCD6F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCD70, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCD71, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCD72, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCD73, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCD74, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD75, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCD76, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD77, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCD78, {0x00,0x00,0x1F,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x51,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCD79, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD7A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCD7B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCD7C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD7D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD7E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCD7F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD80, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD81, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCD82, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD83, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD84, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD85, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD86, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD87, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCD88, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD89, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD8A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD8B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCD8C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCD8D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCD8E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCD8F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCD90, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD91, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD92, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCD93, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCD94, {0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xCD95, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCD96, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCD97, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCD98, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD99, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCD9A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCD9B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD9C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD9D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCD9E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCD9F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDA0, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCDA1, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDA2, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDA3, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCDA4, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDA5, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x44,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDA6, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x4C,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCDA7, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xCDA8, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCDA9, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCDAA, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCDAB, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCDAC, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDAD, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDAE, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCDAF, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCDB0, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xCDB1, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCDB2, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCDB3, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCDB4, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDB5, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCDB6, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCDB7, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDB8, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDB9, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCDBA, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDBB, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDBC, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCDBD, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDBE, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDBF, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCDC0, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDC1, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDC2, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCDC3, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCDC4, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCDC5, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCDC6, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCDC7, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCDC8, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDC9, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDCA, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCDCB, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0xC0,0x44,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCDCC, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x10,0xA0,0x28,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xCDCD, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCDCE, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCDCF, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xCDD0, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x30,0x20,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDD1, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCDD2, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xE0,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCDD3, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDD4, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDD5, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCDD6, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDD7, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDD8, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCDD9, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xCDDA, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDDB, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCDDC, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDDD, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x30,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDDE, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x34,0xA0,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCDDF, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCDE0, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCDE1, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDE2, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCDE3, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCDE4, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDE5, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDE6, {0x00,0x00,0x10,0xA0,0x7C,0xA0,0x29,0xA0,0x44,0xA0,0x44,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCDE7, {0x00,0x00,0x10,0xA0,0x7E,0xA0,0x19,0xA0,0x24,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCDE8, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xCDE9, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCDEA, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCDEB, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCDEC, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDED, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCDEE, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCDEF, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDF0, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDF1, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCDF2, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDF3, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDF4, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCDF5, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDF6, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCDF7, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCDF8, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDF9, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCDFA, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCDFB, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCDFC, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCDFD, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCDFE, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCDFF, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCE00, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE01, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE02, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x44,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE03, {0x00,0x00,0x10,0x40,0x7C,0x40,0x28,0x40,0x44,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCE04, {0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xCE05, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE06, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCE07, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCE08, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE09, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCE0A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCE0B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE0C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE0D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCE0E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE0F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE10, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCE11, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE12, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE13, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCE14, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE15, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x51,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE16, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x59,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCE17, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xCE18, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCE19, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCE1A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCE1B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCE1C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE1D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE1E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCE1F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x11,0x00,0x60,0xC0,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCE20, {0x00,0x00,0x1F,0x00,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCE21, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE22, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCE23, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCE24, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE25, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCE26, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCE27, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE28, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE29, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCE2A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE2B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE2C, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCE2D, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE2E, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x70,0x00,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE2F, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCE30, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE31, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE32, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCE33, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCE34, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCE35, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCE36, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCE37, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCE38, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE39, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE3A, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCE3B, {0x00,0x00,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCE3C, {0x00,0x00,0x18,0x40,0x00,0x40,0x7E,0x40,0x18,0x40,0x24,0x40,0x24,0x40,0x42,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE3D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE3E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCE3F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCE40, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE41, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCE42, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCE43, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE44, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE45, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCE46, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE47, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE48, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCE49, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE4A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE4B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCE4C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE4D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE4E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x24,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCE4F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCE50, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCE51, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCE52, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCE53, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xCE54, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE55, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE56, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCE57, {0x00,0x00,0x08,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCE58, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x14,0x40,0x14,0x40,0x22,0x40,0x41,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE59, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE5A, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCE5B, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCE5C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE5D, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCE5E, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCE5F, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE60, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE61, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCE62, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE63, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE64, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCE65, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE66, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE67, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCE68, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE69, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE6A, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCE6B, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCE6C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCE6D, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCE6E, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCE6F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCE70, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE71, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE72, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCE73, {0x00,0x00,0x08,0x40,0x7F,0x40,0x08,0x40,0x14,0x40,0x63,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCE74, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x02,0x70,0x04,0x40,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE75, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCE76, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCE77, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCE78, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE79, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCE7A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCE7B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE7C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE7D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCE7E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE7F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE80, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCE81, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE82, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE83, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCE84, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE85, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE86, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCE87, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCE88, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCE89, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCE8A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCE8B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCE8C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE8D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCE8E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCE8F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x70,0x02,0x40,0x7C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCE90, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0x20,0x7D,0x20,0x05,0x20,0x09,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xCE91, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCE92, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCE93, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCE94, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE95, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCE96, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCE97, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE98, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE99, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCE9A, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE9B, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE9C, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCE9D, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE9E, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCE9F, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCEA0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEA1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEA2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCEA3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCEA4, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCEA5, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEA6, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEA7, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEA8, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEA9, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEAA, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCEAB, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCEAC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x70,0x7E,0x40,0x02,0x40,0x04,0x40,0x04,0x70,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCEAD, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCEAE, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCEAF, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCEB0, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEB1, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCEB2, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCEB3, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEB4, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEB5, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCEB6, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEB7, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEB8, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCEB9, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEBA, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEBB, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCEBC, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEBD, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEBE, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCEBF, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xCEC0, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCEC1, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCEC2, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEC3, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEC4, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEC5, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEC6, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCEC7, {0x00,0x00,0x7E,0x40,0x02,0x70,0x7E,0x40,0x02,0x70,0x7C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCEC8, {0x00,0x00,0x7D,0x20,0x05,0x20,0x05,0xE0,0x7D,0x20,0x05,0x20,0x09,0x20,0x09,0xE0,0x11,0x20,0x61,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xCEC9, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCECA, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCECB, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCECC, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCECD, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCECE, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCECF, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCED2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED4, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCED5, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED6, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED7, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCED8, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCED9, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEDA, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCEDB, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCEDC, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCEDD, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEDE, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEDF, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEE0, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEE1, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEE2, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x09,0x20,0x11,0x20,0x61,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCEE3, {0x00,0x00,0x7D,0x20,0x05,0x20,0x7D,0xE0,0x05,0x20,0x79,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCEE4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x03,0xC0,0x04,0x40,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCEE5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCEE6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCEE7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCEE8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEE9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCEEA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCEEB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEEC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEED, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCEEE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEEF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEF0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCEF1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEF2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCEF3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCEF4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEF5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEF6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCEF7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCEF8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCEF9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCEFA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEFB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCEFC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEFD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCEFE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCEFF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x02,0x40,0x7C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCF00, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x04,0xA0,0x7C,0xA0,0x07,0xA0,0x08,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCF01, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCF02, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCF03, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCF04, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF05, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCF06, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCF07, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF08, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF09, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCF0A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF0B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF0C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF0D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF0E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF0F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCF10, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF11, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF12, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF13, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCF14, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCF15, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF16, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF17, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF18, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF19, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF1A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7F,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCF1B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x78,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCF1C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x03,0xC0,0x7E,0x40,0x02,0x40,0x05,0xC0,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCF1D, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCF1E, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCF1F, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCF20, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF21, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCF22, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xCF23, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF24, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF25, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCF26, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF27, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF28, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF29, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF2A, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF2B, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCF2C, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF2D, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF2E, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xCF2F, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCF30, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCF31, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCF32, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF33, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF34, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF35, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF36, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCF37, {0x00,0x00,0x7E,0x40,0x03,0xC0,0x7E,0x40,0x03,0xC0,0x7C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCF38, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x07,0xA0,0x7C,0xA0,0x04,0xA0,0x0B,0xA0,0x08,0xA0,0x10,0xA0,0x60,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCF39, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCF3A, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCF3B, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCF3C, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF3D, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCF3E, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCF3F, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF40, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF41, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCF42, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF43, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF44, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF45, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF46, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF47, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCF48, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF49, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF4A, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF4B, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xCF4C, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xCF4D, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF4E, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF4F, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF50, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF51, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF52, {0x00,0x00,0x7C,0xA0,0x07,0xA0,0x7C,0xA0,0x0B,0xA0,0x10,0xA0,0x60,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCF53, {0x00,0x00,0x7C,0xA0,0x05,0xA0,0x7C,0xA0,0x05,0xA0,0x78,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCF54, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCF55, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCF56, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCF57, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCF58, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF59, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCF5A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCF5B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF5C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF5D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCF5E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF5F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF60, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCF61, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF62, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF63, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCF64, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF65, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF66, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCF67, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCF68, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCF69, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCF6A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCF6B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCF6C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF6D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCF6E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCF6F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x08,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCF70, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x12,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCF71, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCF72, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCF73, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCF74, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF75, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCF76, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCF77, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF78, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF79, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCF7A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF7B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF7C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF7D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF7E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF7F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCF80, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF81, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF82, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF83, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCF84, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCF85, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCF86, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF87, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCF88, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF89, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCF8A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x10,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCF8B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCF8C, {0x00,0x00,0x7E,0xA0,0x02,0xA0,0x02,0xA0,0x7E,0xA0,0x22,0xE0,0x22,0xA0,0x22,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xCF8D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xCF8E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xCF8F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCF90, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x04,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF91, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xCF92, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xCF93, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF94, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF95, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xCF96, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF97, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF98, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF99, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF9A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF9B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCF9C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF9D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xCF9E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCF9F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCFA0, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCFA1, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFA2, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCFA3, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCFA4, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCFA5, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCFA6, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x20,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCFA7, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xE0,0x24,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCFA8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCFA9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCFAA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCFAB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xCFAC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFAD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xCFAE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCFAF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFB0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFB1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xCFB2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFB3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFB4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCFB5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xCFB6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xCFB7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xCFB8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFB9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFBA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xCFBB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xCFBC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xCFBD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xCFBE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCFBF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xCFC0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFC1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xCFC2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x10,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xCFC3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x12,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xCFC4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x40,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xCFC5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCFC6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCFC7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCFC8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFC9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCFCA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCFCB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFCC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFCD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCFCE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFCF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFD0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCFD1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFD2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFD3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCFD4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFD5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFD6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCFD7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCFD8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCFD9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCFDA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCFDB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCFDC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFDD, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFDE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0x22,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCFDF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x22,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCFE0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xCFE1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCFE2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCFE3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xCFE4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x44,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFE5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xCFE6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCFE7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFE8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFE9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xCFEA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFEB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFEC, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCFED, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFEE, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFEF, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xCFF0, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFF1, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFF2, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xCFF3, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCFF4, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xCFF5, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xCFF6, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xCFF7, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xCFF8, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFF9, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xCFFA, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xCFFB, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xCFFC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xCFFD, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xCFFE, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xCFFF, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD000, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD001, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD002, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD003, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD004, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD005, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD006, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD007, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD008, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD009, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD00A, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD00B, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD00C, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD00D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD00E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD00F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD010, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD011, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD012, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD013, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD014, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD015, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD016, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD017, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0xC0,0x04,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD018, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7C,0xA0,0x04,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xD019, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD01A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD01B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD01C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD01D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD01E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD01F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD020, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD021, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD022, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD023, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD024, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD025, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD026, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD027, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD028, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD029, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD02A, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD02B, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD02C, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD02D, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD02E, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD02F, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD030, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD031, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD032, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD033, {0x00,0x00,0x7C,0xA0,0x04,0xA0,0x7D,0xA0,0x04,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD034, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD035, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD036, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD037, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD038, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD039, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD03A, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD03B, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD03C, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD03D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD03E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD03F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD040, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD041, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD042, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD043, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD044, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD045, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD046, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD047, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD048, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD049, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD04A, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD04B, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD04C, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD04D, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD04E, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD04F, {0x00,0x00,0x7C,0x40,0x04,0x40,0x7C,0x40,0x04,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD050, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xD051, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD052, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD053, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD054, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD055, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD056, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD057, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD058, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD059, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD05A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD05B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD05C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD05D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD05E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD05F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD060, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD061, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD062, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD063, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD064, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD065, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD066, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD067, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD068, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD069, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD06A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD06B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD06C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD06D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD06E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD06F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD070, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD071, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD072, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD073, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD074, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD075, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD076, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD077, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD078, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD079, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD07A, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD07B, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD07C, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD07D, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD07E, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD07F, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD080, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD081, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD082, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD083, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD084, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD085, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD086, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD087, {0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x00,0x40,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD088, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD089, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD08A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD08B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD08C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD08D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD08E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD08F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD090, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD091, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD092, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD093, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD094, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD095, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD096, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD097, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD098, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD099, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD09A, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD09B, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD09C, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD09D, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD09E, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD09F, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0A0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0A1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0A2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD0A3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD0A4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x04,0x40,0x08,0x40,0x70,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD0A5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD0A6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD0A7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD0A8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0A9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD0AA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD0AB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0AC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0AD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD0AE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0AF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0B0, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD0B1, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0B2, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0B3, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD0B4, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0B5, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0B6, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD0B7, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD0B8, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD0B9, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD0BA, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0BB, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0BC, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0BD, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0BE, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x04,0x40,0x78,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD0BF, {0x00,0x00,0x7E,0x40,0x02,0x40,0x7E,0x40,0x02,0x40,0x7C,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD0C0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD0C1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD0C2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD0C3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD0C4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0C5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD0C6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD0C7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0C8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0C9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD0CA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0CB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0CC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD0CD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0CE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0CF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD0D0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0D1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0D2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD0D3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD0D4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD0D5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD0D6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0D7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0D8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0D9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0DA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD0DB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD0DC, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0x20,0x79,0x20,0x41,0x20,0x41,0xE0,0x41,0x20,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xD0DD, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD0DE, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD0DF, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD0E0, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0E1, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD0E2, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD0E3, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0E4, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0E5, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD0E6, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0E7, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0E8, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD0E9, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0EA, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0EB, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD0EC, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0ED, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0EE, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD0EF, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD0F0, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD0F1, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0F2, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0F3, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD0F4, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0F5, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD0F6, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD0F7, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD0F8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x70,0x7C,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD0F9, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD0FA, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD0FB, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD0FC, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD0FD, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD0FE, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD0FF, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD100, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD101, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD102, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD103, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD104, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD105, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD106, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD107, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD108, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD109, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD10A, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD10B, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD10C, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD10D, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD10E, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD10F, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD110, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD111, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD112, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD113, {0x00,0x00,0x7E,0x40,0x40,0x70,0x7C,0x40,0x40,0x70,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD114, {0x00,0x00,0x7D,0x20,0x41,0x20,0x41,0xE0,0x79,0x20,0x41,0x20,0x41,0x20,0x41,0xE0,0x3D,0x20,0x01,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xD115, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD116, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD117, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD118, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD119, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD11A, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD11B, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD11C, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD11D, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD11E, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD11F, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD120, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD121, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD122, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD123, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD124, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD125, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD126, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD127, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD128, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD129, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD12A, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD12B, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD12C, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD12D, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD12E, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x41,0x20,0x3F,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD12F, {0x00,0x00,0x7D,0x20,0x41,0x20,0x79,0xE0,0x41,0x20,0x3F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD130, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD131, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD132, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD133, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD134, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD135, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD136, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD137, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD138, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD139, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD13A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD13B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD13C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD13D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD13E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD13F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD140, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD141, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD142, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD143, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD144, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD145, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD146, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD147, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD148, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD149, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD14A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD14B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7D,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD14C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x40,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD14D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD14E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD14F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD150, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD151, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD152, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD153, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD154, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD155, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD156, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD157, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD158, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD159, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD15A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD15B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD15C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD15D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD15E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD15F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD160, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD161, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD162, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD163, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD164, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD165, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD166, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD167, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x7B,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD168, {0x00,0x00,0x7E,0x40,0x40,0x40,0x41,0xC0,0x7C,0x40,0x40,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD169, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD16A, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD16B, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD16C, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD16D, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD16E, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD16F, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD170, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD171, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD172, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD173, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD174, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD175, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD176, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD177, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD178, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD179, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD17A, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD17B, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD17C, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD17D, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD17E, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD17F, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD180, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD181, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD182, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD183, {0x00,0x00,0x7E,0x40,0x41,0xC0,0x7C,0x40,0x41,0xC0,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD184, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x43,0xA0,0x78,0xA0,0x40,0xA0,0x43,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD185, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD186, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD187, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD188, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD189, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD18A, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD18B, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD18C, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD18D, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD18E, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD18F, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD190, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD191, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD192, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD193, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD194, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD195, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD196, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD197, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD198, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD199, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD19A, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD19B, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD19C, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD19D, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD19E, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x40,0xA0,0x3E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD19F, {0x00,0x00,0x7C,0xA0,0x43,0xA0,0x78,0xA0,0x43,0xA0,0x3E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD1A0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x3F,0xC0,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD1A1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD1A2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD1A3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD1A4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1A5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD1A6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD1A7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1A8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1A9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD1AA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1AB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1AC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD1AD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1AE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1AF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD1B0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1B1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1B2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD1B3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD1B4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD1B5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD1B6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD1B7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD1B8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1B9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1BA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD1BB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD1BC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD1BD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD1BE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD1BF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD1C0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1C1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD1C2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD1C3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1C4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1C5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD1C6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1C7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1C8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD1C9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1CA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1CB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD1CC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1CD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1CE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD1CF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD1D0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD1D1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD1D2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD1D3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD1D4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1D5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1D6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD1D7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x70,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD1D8, {0x00,0x00,0x7E,0xA0,0x40,0xA0,0x7C,0xA0,0x40,0xA0,0x3E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD1D9, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD1DA, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD1DB, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xD1DC, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1DD, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD1DE, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x40,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD1DF, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1E0, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1E1, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD1E2, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1E3, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1E4, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD1E5, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xD1E6, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1E7, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD1E8, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1E9, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1EA, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x24,0x00,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD1EB, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD1EC, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD1ED, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1EE, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD1EF, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD1F0, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1F1, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD1F2, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD1F3, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xE0,0x40,0xA0,0x3C,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD1F4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD1F5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD1F6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD1F7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD1F8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1F9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD1FA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD1FB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1FC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1FD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD1FE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD1FF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD200, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD201, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD202, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD203, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD204, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD205, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD206, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD207, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD208, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD209, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD20A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD20B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD20C, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD20D, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD20E, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD20F, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD210, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x3F,0xC0,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD211, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD212, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD213, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD214, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD215, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD216, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD217, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD218, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD219, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD21A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD21B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD21C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD21D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD21E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD21F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD220, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD221, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD222, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD223, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD224, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD225, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD226, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD227, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD228, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD229, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD22A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD22B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD22C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x3F,0xC0,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xD22D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD22E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD22F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD230, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD231, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD232, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD233, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD234, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD235, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD236, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD237, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD238, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD239, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD23A, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD23B, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD23C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD23D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x44,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD23E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x4C,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD23F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xD240, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD241, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD242, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD243, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD244, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD245, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD246, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD247, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD248, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD249, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD24A, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD24B, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD24C, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD24D, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD24E, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD24F, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD250, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD251, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD252, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD253, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD254, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD255, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD256, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD257, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD258, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD259, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD25A, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD25B, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD25C, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD25D, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD25E, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD25F, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD260, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD261, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD262, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD263, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0xC0,0x40,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD264, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x78,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xD265, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD266, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD267, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xD268, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x30,0x20,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD269, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD26A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xE0,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD26B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD26C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD26D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD26E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD26F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD270, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD271, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xD272, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD273, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD274, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD275, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x30,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD276, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x34,0xA0,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD277, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD278, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD279, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD27A, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD27B, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD27C, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD27D, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD27E, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x3C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD27F, {0x00,0x00,0x7C,0xA0,0x40,0xA0,0x79,0xA0,0x40,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD280, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD281, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD282, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD283, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD284, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD285, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD286, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD287, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD288, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD289, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD28A, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD28B, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD28C, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD28D, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD28E, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD28F, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD290, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD291, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD292, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD293, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD294, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD295, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD296, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD297, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD298, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD299, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD29A, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD29B, {0x00,0x00,0x7C,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD29C, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x3F,0xC0,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xD29D, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD29E, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD29F, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD2A0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2A1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD2A2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD2A3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2A4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2A5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD2A6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2A7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2A8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD2A9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2AA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2AB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD2AC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2AD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x51,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2AE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x59,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD2AF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xD2B0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD2B1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD2B2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD2B3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD2B4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2B5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2B6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD2B7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD2B8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x7F,0x80,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD2B9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD2BA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD2BB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD2BC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2BD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD2BE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD2BF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD2C2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C4, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD2C5, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C6, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x70,0x00,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C7, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD2C8, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2C9, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2CA, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD2CB, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD2CC, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD2CD, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD2CE, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD2CF, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD2D0, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2D1, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2D2, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD2D3, {0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD2D4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD2D5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD2D6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD2D7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD2D8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2D9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD2DA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD2DB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2DC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2DD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD2DE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2DF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2E0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD2E1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD2E2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD2E3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD2E4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2E5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2E6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x24,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD2E7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD2E8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD2E9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD2EA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD2EB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD2EC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2ED, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2EE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3E,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD2EF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD2F0, {0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD2F1, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD2F2, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD2F3, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD2F4, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2F5, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD2F6, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD2F7, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2F8, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2F9, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD2FA, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2FB, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2FC, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD2FD, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD2FE, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD2FF, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD300, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD301, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD302, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD303, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD304, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD305, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD306, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD307, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD308, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD309, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD30A, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x40,0x40,0x3F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD30B, {0x00,0x00,0x7E,0x40,0x40,0x40,0x7C,0x40,0x40,0x40,0x3F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD30C, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD30D, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD30E, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD30F, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD310, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD311, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD312, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD313, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD314, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD315, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD316, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD317, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD318, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD319, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD31A, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD31B, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD31C, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD31D, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD31E, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD31F, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD320, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD321, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD322, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD323, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD324, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD325, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD326, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD327, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD328, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xD329, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD32A, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD32B, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD32C, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD32D, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD32E, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD32F, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD330, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD331, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD332, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD333, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD334, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD335, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD336, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD337, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD338, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD339, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD33A, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD33B, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD33C, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD33D, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD33E, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD33F, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD340, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD341, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD342, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD343, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD344, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x70,0x24,0x40,0x24,0x40,0x24,0x40,0x24,0x70,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD345, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD346, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD347, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD348, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD349, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD34A, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD34B, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD34C, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD34D, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD34E, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD34F, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD350, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD351, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD352, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD353, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD354, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD355, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD356, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD357, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD358, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD359, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD35A, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD35B, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD35C, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD35D, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD35E, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD35F, {0x00,0x00,0x7E,0x40,0x00,0x70,0x24,0x40,0x24,0x70,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD360, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x29,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xD361, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD362, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD363, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD364, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD365, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD366, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD367, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD368, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD369, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD36A, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD36B, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD36C, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD36D, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD36E, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD36F, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD370, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD371, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD372, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD373, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD374, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD375, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD376, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD377, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD378, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD379, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD37A, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x29,0x20,0x7F,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD37B, {0x00,0x00,0x7D,0x20,0x01,0x20,0x29,0xE0,0x29,0x20,0x7F,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD37C, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD37D, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD37E, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD37F, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD380, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD381, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD382, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD383, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD384, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD385, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD386, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD387, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD388, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD389, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD38A, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD38B, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD38C, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD38D, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD38E, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD38F, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD390, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD391, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD392, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD393, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD394, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD395, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD396, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD397, {0x00,0x00,0x7E,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD398, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD399, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD39A, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD39B, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD39C, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD39D, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD39E, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD39F, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A0, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A1, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD3A2, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A3, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A4, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD3A5, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A6, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A7, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD3A8, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3A9, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3AA, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD3AB, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD3AC, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD3AD, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3AE, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD3AF, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD3B0, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3B1, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3B2, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD3B3, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD3B4, {0x00,0x00,0x7F,0x40,0x00,0x40,0x25,0xC0,0x24,0x40,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD3B5, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD3B6, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD3B7, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD3B8, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3B9, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD3BA, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD3BB, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3BC, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3BD, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD3BE, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3BF, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3C0, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD3C1, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3C2, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3C3, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD3C4, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3C5, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3C6, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD3C7, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD3C8, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD3C9, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD3CA, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD3CB, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD3CC, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3CD, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3CE, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD3CF, {0x00,0x00,0x7E,0x40,0x01,0xC0,0x24,0x40,0x25,0xC0,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD3D0, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD3D1, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD3D2, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD3D3, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD3D4, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3D5, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD3D6, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD3D7, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3D8, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3D9, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD3DA, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3DB, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3DC, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD3DD, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3DE, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3DF, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD3E0, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3E1, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3E2, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD3E3, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD3E4, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD3E5, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD3E6, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD3E7, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD3E8, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3E9, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD3EA, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x28,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD3EB, {0x00,0x00,0x7C,0xA0,0x03,0xA0,0x28,0xA0,0x2B,0xA0,0x7E,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD3EC, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD3ED, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD3EE, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD3EF, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD3F0, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3F1, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD3F2, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD3F3, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3F4, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3F5, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD3F6, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3F7, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3F8, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD3F9, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3FA, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3FB, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD3FC, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3FD, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD3FE, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD3FF, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD400, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD401, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD402, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD403, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD404, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD405, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD406, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD407, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x04,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD408, {0x00,0x00,0x7F,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0x7F,0x70,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD409, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD40A, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD40B, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD40C, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD40D, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD40E, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD40F, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD410, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD411, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD412, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD413, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD414, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD415, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD416, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD417, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD418, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD419, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD41A, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD41B, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD41C, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD41D, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD41E, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD41F, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD420, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD421, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD422, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x70,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD423, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x70,0x7F,0xC0,0x00,0x00,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD424, {0x00,0x00,0x7E,0xA0,0x00,0xA0,0x24,0xA0,0x24,0xA0,0x7E,0xE0,0x00,0xA0,0x10,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD425, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD426, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD427, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD428, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD429, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD42A, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD42B, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD42C, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD42D, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD42E, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD42F, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD430, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD431, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD432, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD433, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD434, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD435, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD436, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD437, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD438, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD439, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD43A, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD43B, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD43C, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD43D, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD43E, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD43F, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xE0,0x7C,0xA0,0x7E,0xA0,0x00,0x00,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD440, {0x00,0x00,0x7F,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0x7F,0x40,0x00,0x40,0x08,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD441, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD442, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD443, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD444, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD445, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD446, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD447, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD448, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD449, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD44A, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD44B, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD44C, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD44D, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD44E, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD44F, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD450, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD451, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD452, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD453, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD454, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD455, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD456, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD457, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD458, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD459, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD45A, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD45B, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD45C, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD45D, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD45E, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD45F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD460, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD461, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD462, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD463, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD464, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD465, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD466, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD467, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD468, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD469, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD46A, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD46B, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD46C, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD46D, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD46E, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD46F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD470, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD471, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD472, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD473, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD474, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD475, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD476, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD477, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x11,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD478, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xD479, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD47A, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD47B, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD47C, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x44,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD47D, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD47E, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD47F, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD480, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD481, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD482, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD483, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD484, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD485, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD486, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD487, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD488, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD489, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD48A, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD48B, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD48C, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD48D, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD48E, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD48F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD490, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD491, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD492, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD493, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD494, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD495, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD496, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD497, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD498, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD499, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD49A, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD49B, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD49C, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD49D, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD49E, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD49F, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4A0, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD4A1, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4A2, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4A3, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD4A4, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4A5, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4A6, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD4A7, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD4A8, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD4A9, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD4AA, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4AB, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4AC, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4AD, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4AE, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0xC0,0x7C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD4AF, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0xC0,0x00,0x40,0x7F,0x40,0x08,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD4B0, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x28,0xA0,0x28,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xD4B1, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD4B2, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD4B3, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD4B4, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x08,0xA0,0x28,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4B5, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD4B6, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD4B7, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4B8, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4B9, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD4BA, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4BB, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4BC, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3C,0xA0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD4BD, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4BE, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4BF, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x38,0xA0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD4C0, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4C1, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4C2, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD4C3, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4C4, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD4C5, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4C6, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4C7, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4C8, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4C9, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4CA, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD4CB, {0x00,0x00,0x7C,0xA0,0x00,0xA0,0x29,0xA0,0x7C,0xA0,0x00,0xA0,0x7E,0xA0,0x17,0xA0,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD4CC, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7E,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD4CD, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD4CE, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD4CF, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD4D0, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4D1, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD4D2, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD4D3, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4D4, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4D5, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD4D6, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4D7, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4D8, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3C,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD4D9, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4DA, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD4DB, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x38,0xC0,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD4DC, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4DD, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4DE, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD4DF, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD4E0, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD4E1, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD4E2, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4E3, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x09,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD4E4, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4E5, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD4E6, {0x00,0x00,0x7C,0x40,0x00,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD4E7, {0x00,0x00,0x7C,0x40,0x28,0x40,0x7C,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x0F,0x40,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD4E8, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xD4E9, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD4EA, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD4EB, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD4EC, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x51,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4ED, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD4EE, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD4EF, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F0, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F1, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD4F2, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F3, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F4, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD4F5, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F6, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F7, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD4F8, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4F9, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD4FA, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD4FB, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD4FC, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD4FD, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD4FE, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD4FF, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD500, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD501, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD502, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD503, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD504, {0x00,0x00,0x7F,0xC0,0x00,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD505, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD506, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD507, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x08,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD508, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0xFF,0xE0,0x40,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD509, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x41,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD50A, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x01,0x00,0x47,0xE0,0x42,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD50B, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD50C, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD50D, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD50E, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD50F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD510, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x79,0x00,0x09,0x00,0x7A,0x80,0x44,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD511, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD512, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD513, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD514, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD515, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD516, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x49,0x00,0x7A,0x80,0x4C,0x40,0x38,0x20,0x00,0x00,}}, +{ 0xD517, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD518, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD519, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD51A, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x00,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD51B, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x02,0x00,0x7F,0xC0,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD51C, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD51D, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD51E, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD51F, {0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,0xFF,0xE0,0x00,0x00,0x0E,0x00,0x00,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD520, {0x00,0x00,0x7F,0x40,0x00,0x40,0x22,0x40,0x22,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD521, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD522, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD523, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD524, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD525, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD526, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x01,0x40,0x27,0xE0,0x22,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD527, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD528, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD529, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD52A, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD52B, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD52C, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD52D, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD52E, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD52F, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD530, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD531, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD532, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD533, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD534, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD535, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD536, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD537, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD538, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD539, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD53A, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD53B, {0x00,0x00,0x7F,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD53C, {0x00,0x00,0x7F,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD53D, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD53E, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD53F, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD540, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD541, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD542, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD543, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD544, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD545, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD546, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD547, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD548, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD549, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD54A, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD54B, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD54C, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD54D, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD54E, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD54F, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD550, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD551, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD552, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD553, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD554, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD555, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD556, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD557, {0x00,0x00,0x7E,0x40,0x00,0x40,0x24,0x40,0x24,0x40,0x7F,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD558, {0x00,0x00,0x3C,0x40,0x00,0x40,0xFF,0x40,0x00,0x40,0x3C,0x70,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD559, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD55A, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD55B, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD55C, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x20,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD55D, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD55E, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD55F, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD560, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD561, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD562, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD563, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD564, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD565, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD566, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD567, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD568, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD569, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD56A, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD56B, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD56C, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD56D, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD56E, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD56F, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD570, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD571, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD572, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x70,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD573, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x70,0x44,0x40,0x38,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD574, {0x00,0x00,0x39,0x20,0x01,0x20,0xFF,0x20,0x01,0x20,0x39,0x20,0x45,0xE0,0x45,0x20,0x45,0x20,0x39,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xD575, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD576, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD577, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD578, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD579, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD57A, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD57B, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD57C, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD57D, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD57E, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD57F, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD580, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD581, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD582, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD583, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD584, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD585, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD586, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD587, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD588, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD589, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD58A, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD58B, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD58C, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD58D, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD58E, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD58F, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD590, {0x00,0x00,0x3C,0x40,0x00,0x40,0xFF,0x70,0x00,0x40,0x3C,0x40,0x42,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD591, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD592, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD593, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD594, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD595, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD596, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD597, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD598, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD599, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD59A, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD59B, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD59C, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD59D, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD59E, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD59F, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD5A0, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5A1, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5A2, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD5A3, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD5A4, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD5A5, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD5A6, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5A7, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5A8, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5A9, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5AA, {0x00,0x00,0x10,0x40,0xFF,0x70,0x24,0x40,0x42,0x70,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD5AB, {0x00,0x00,0x10,0x40,0xFE,0x70,0x44,0x40,0x44,0x70,0x38,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD5AC, {0x00,0x00,0x39,0x20,0x01,0x20,0xFF,0xE0,0x01,0x20,0x39,0x20,0x45,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x01,0x20,0x00,0x00,}}, +{ 0xD5AD, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD5AE, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD5AF, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD5B0, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5B1, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD5B2, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD5B3, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5B4, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5B5, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD5B6, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5B7, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5B8, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD5B9, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5BA, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5BB, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD5BC, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5BD, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5BE, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD5BF, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD5C0, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD5C1, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5C2, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5C3, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5C4, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5C5, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5C6, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD5C7, {0x00,0x00,0x11,0x20,0xFF,0x20,0x45,0xE0,0x45,0x20,0x39,0x20,0x01,0x20,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD5C8, {0x00,0x00,0x3C,0x40,0x00,0x40,0xFF,0x40,0x01,0xC0,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD5C9, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD5CA, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD5CB, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD5CC, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5CD, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD5CE, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD5CF, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5D0, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5D1, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD5D2, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5D3, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5D4, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD5D5, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5D6, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5D7, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD5D8, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5D9, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5DA, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD5DB, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD5DC, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD5DD, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD5DE, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5DF, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5E0, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5E1, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5E2, {0x00,0x00,0x10,0x40,0xFF,0x40,0x25,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD5E3, {0x00,0x00,0x10,0x40,0xFE,0x40,0x45,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD5E4, {0x00,0x00,0x38,0xA0,0x00,0xA0,0xFE,0xA0,0x00,0xA0,0x3B,0xA0,0x44,0xA0,0x44,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD5E5, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD5E6, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD5E7, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD5E8, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5E9, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD5EA, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD5EB, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5EC, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5ED, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD5EE, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5EF, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5F0, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD5F1, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5F2, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5F3, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD5F4, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5F5, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5F6, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD5F7, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD5F8, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD5F9, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD5FA, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5FB, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD5FC, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5FD, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD5FE, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD5FF, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x47,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD600, {0x00,0x00,0x3C,0x40,0x00,0x40,0xFF,0xC0,0x00,0x40,0x3C,0x40,0x43,0xC0,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD601, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD602, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD603, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD604, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD605, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD606, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD607, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD608, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD609, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD60A, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD60B, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3D,0x40,0x05,0x40,0x3D,0xC0,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD60C, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD60D, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3D,0xE0,0x05,0x00,0x3D,0xC0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD60E, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD60F, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD610, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD611, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD612, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD613, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x02,0x00,0x05,0x00,0x08,0x80,0x30,0x60,0x00,0x00,}}, +{ 0xD614, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD615, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD616, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD617, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD618, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD619, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD61A, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x24,0x40,0x43,0xC0,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD61B, {0x00,0x00,0x10,0x40,0xFF,0xC0,0x44,0x40,0x45,0xC0,0x38,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD61C, {0x00,0x00,0x38,0xA0,0x00,0xA0,0xFF,0xA0,0x00,0xA0,0x38,0xA0,0x47,0xA0,0x44,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD61D, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD61E, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xE0,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD61F, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD620, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD621, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x23,0xE0,0x20,0x80,0x21,0x40,0x1E,0x30,0x00,0x00,}}, +{ 0xD622, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x23,0xF0,0x21,0x20,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD623, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD624, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD625, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x04,0x20,0x3C,0x20,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD626, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x20,0x3D,0x20,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD627, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0x20,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD628, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD629, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD62A, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD62B, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x38,0x80,0x0F,0xE0,0x3A,0x40,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD62C, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD62D, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD62E, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD62F, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x00,0x80,0x00,0x80,0x03,0x40,0x1C,0x30,0x00,0x00,}}, +{ 0xD630, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x08,0x40,0x08,0x40,0x14,0xA0,0x23,0x10,0x00,0x00,}}, +{ 0xD631, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD632, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD633, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x80,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD634, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD635, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD636, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD637, {0x00,0x00,0x10,0xA0,0xFF,0xA0,0x44,0xA0,0x47,0xA0,0x38,0xA0,0x00,0xA0,0x07,0x00,0x00,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD638, {0x00,0x00,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD639, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD63A, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD63B, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD63C, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD63D, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD63E, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD63F, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD640, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD641, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD642, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD643, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD644, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD645, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD646, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD647, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD648, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD649, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD64A, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD64B, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD64C, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD64D, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD64E, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD64F, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD650, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD651, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD652, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD653, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x04,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD654, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x14,0x40,0x22,0x70,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD655, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD656, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD657, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD658, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD659, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD65A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD65B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD65C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD65D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD65E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD65F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD660, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD661, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD662, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD663, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD664, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD665, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD666, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD667, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD668, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD669, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD66A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD66B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD66C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD66D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD66E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD66F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x70,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD670, {0x00,0x00,0x38,0xA0,0x00,0xA0,0xFE,0xA0,0x28,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x00,}}, +{ 0xD671, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD672, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD673, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xD674, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x20,0x20,0x00,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD675, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD676, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x40,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD677, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD678, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD679, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD67A, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD67B, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD67C, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD67D, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7F,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xD67E, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD67F, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD680, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD681, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD682, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x24,0x00,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD683, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD684, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD685, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD686, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD687, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD688, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD689, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD68A, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x00,0x00,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD68B, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xE0,0x44,0xA0,0x38,0xA0,0x10,0xA0,0x7E,0xA0,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD68C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD68D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD68E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD68F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD690, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD691, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD692, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x80,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD693, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD694, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD695, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD696, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD697, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD698, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD699, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD69A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD69B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD69C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD69D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD69E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x24,0x80,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD69F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD6A0, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD6A1, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD6A2, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD6A3, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD6A4, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6A5, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6A6, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x40,0x00,0x00,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6A7, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x08,0x40,0x7F,0x80,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD6A8, {0x00,0x00,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD6A9, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD6AA, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD6AB, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD6AC, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6AD, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD6AE, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD6AF, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B0, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B1, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD6B2, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B3, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B4, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD6B5, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B6, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B7, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD6B8, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6B9, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6BA, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD6BB, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD6BC, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD6BD, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD6BE, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD6BF, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD6C0, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6C1, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6C2, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD6C3, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x11,0x00,0xFF,0xE0,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD6C4, {0x00,0x00,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xD6C5, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD6C6, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD6C7, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD6C8, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x44,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6C9, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD6CA, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD6CB, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6CC, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6CD, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD6CE, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6CF, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6D0, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD6D1, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6D2, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6D3, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD6D4, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6D5, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x44,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6D6, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x4C,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD6D7, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xD6D8, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD6D9, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD6DA, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD6DB, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD6DC, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6DD, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6DE, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x04,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD6DF, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x04,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD6E0, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x0B,0xC0,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD6E1, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD6E2, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD6E3, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD6E4, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6E5, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD6E6, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD6E7, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6E8, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6E9, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD6EA, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6EB, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6EC, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD6ED, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD6EE, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD6EF, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD6F0, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6F1, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6F2, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD6F3, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD6F4, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD6F5, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD6F6, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD6F7, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD6F8, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6F9, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD6FA, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD6FB, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0xC0,0x38,0x40,0x7F,0x40,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD6FC, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x44,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x13,0xA0,0x10,0xA0,0x10,0xA0,0x00,0x00,}}, +{ 0xD6FD, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,}}, +{ 0xD6FE, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x20,0x02,0x20,0x00,0x00,}}, +{ 0xD6FF, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x40,0x04,0xA0,0x05,0x10,0x00,0x00,}}, +{ 0xD700, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x30,0x20,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD701, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x23,0xE0,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD702, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xE0,0x23,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD703, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD704, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x00,0x20,0x3F,0xE0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD705, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x20,0x20,0x1E,0x20,0x00,0x00,}}, +{ 0xD706, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD707, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x05,0x20,0x3D,0xE0,0x21,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD708, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x00,0x3C,0x80,0x21,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD709, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3D,0xE0,0x05,0x00,0x3D,0xE0,0x21,0x00,0x1F,0xF0,0x00,0x00,}}, +{ 0xD70A, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD70B, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3C,0x00,0x04,0x40,0x3F,0xF0,0x21,0x20,0x1C,0xC0,0x00,0x00,}}, +{ 0xD70C, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD70D, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x30,0xA0,0x3F,0xE0,0x20,0x20,0x1F,0xE0,0x00,0x00,}}, +{ 0xD70E, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x34,0xA0,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD70F, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD710, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD711, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x1F,0xC0,0x20,0x20,0x1F,0xC0,0x00,0x00,}}, +{ 0xD712, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD713, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD714, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD715, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD716, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x38,0xA0,0x00,0xA0,0x7E,0xA0,0x10,0xA0,0x3F,0xE0,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD717, {0x00,0x00,0x10,0xA0,0xFE,0xA0,0x45,0xA0,0x44,0xA0,0x7E,0xA0,0x10,0xA0,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD718, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,}}, +{ 0xD719, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD71A, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD71B, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD71C, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x28,0x40,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD71D, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD71E, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD71F, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD720, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD721, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD722, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD723, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD724, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD725, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD726, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD727, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD728, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD729, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x28,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD72A, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x2C,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD72B, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD72C, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD72D, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD72E, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD72F, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD730, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD731, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD732, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x7F,0xC0,0x08,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD733, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x38,0x40,0x7F,0xC0,0x08,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD734, {0x00,0x00,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x00,0x00,}}, +{ 0xD735, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD736, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD737, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD738, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x51,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD739, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD73A, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD73B, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD73C, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD73D, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD73E, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x40,0x7A,0x40,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD73F, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7A,0x40,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD740, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x79,0x00,0x09,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD741, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD742, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x77,0xC0,0x12,0x80,0x72,0x80,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD743, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD744, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD745, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x51,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD746, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x59,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD747, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x0D,0x00,0x70,0xC0,0x00,0x00,}}, +{ 0xD748, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD749, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD74A, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD74B, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x11,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD74C, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD74D, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD74E, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD74F, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0xFF,0xE0,0x11,0x00,0x0E,0x00,0x00,0x00,0xFF,0xE0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD750, {0x00,0x00,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x11,0x00,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xD751, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD752, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD753, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x78,0x80,0x09,0x40,0x0A,0x20,0x00,0x00,}}, +{ 0xD754, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x40,0x00,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD755, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x47,0xC0,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD756, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x80,0x47,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD757, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD758, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x00,0x40,0x7F,0xC0,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD759, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x08,0x40,0x78,0x40,0x40,0x40,0x3C,0x40,0x00,0x00,}}, +{ 0xD75A, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD75B, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x78,0x00,0x0A,0x40,0x7B,0xC0,0x42,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD75C, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x00,0x79,0x00,0x42,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD75D, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x7B,0xC0,0x0A,0x00,0x7B,0x80,0x42,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD75E, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x70,0x00,0x10,0x00,0x77,0xC0,0x42,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD75F, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x78,0x00,0x08,0x80,0x7F,0xE0,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD760, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD761, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x40,0x40,0x7F,0xC0,0x40,0x40,0x3F,0xC0,0x00,0x00,}}, +{ 0xD762, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x48,0x00,0x79,0x00,0x4A,0x80,0x3C,0x40,0x00,0x00,}}, +{ 0xD763, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x04,0x00,0x1B,0x00,0x60,0xC0,0x00,0x00,}}, +{ 0xD764, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x11,0x00,0x2A,0x80,0x44,0x40,0x00,0x00,}}, +{ 0xD765, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x3F,0x80,0x40,0x40,0x3F,0x80,0x00,0x00,}}, +{ 0xD766, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD767, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x0A,0x00,0x71,0xC0,0x00,0x00,}}, +{ 0xD768, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD769, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x40,0x00,0x7F,0x80,0x40,0x00,0x3F,0xC0,0x00,0x00,}}, +{ 0xD76A, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0x1F,0x00,0x00,0x00,0xFF,0xE0,0x00,0x00,0x7F,0xC0,0x11,0x00,0x7F,0xC0,0x00,0x00,}}, +{ 0xD76B, {0x00,0x00,0x04,0x00,0xFF,0xE0,0x20,0x80,0x20,0x80,0xFF,0xE0,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xC0,0x20,0x80,0x1F,0x00,0x00,0x00,}}, +{ 0xD76C, {0x00,0x00,0x1C,0x40,0x00,0x40,0x7F,0x40,0x14,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD76D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD76E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD76F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD770, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD771, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x27,0xC0,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD772, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0xC0,0x27,0xE0,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD773, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD774, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD775, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD776, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD777, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD778, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3C,0x00,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD779, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xE0,0x00,0x00,}}, +{ 0xD77A, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x00,0x3B,0xE0,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD77B, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x38,0x00,0x08,0x80,0x3F,0xE0,0x22,0x40,0x19,0x80,0x00,0x00,}}, +{ 0xD77C, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD77D, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD77E, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x24,0xC0,0x3D,0x40,0x26,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD77F, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD780, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD781, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x1F,0x80,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD782, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD783, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x02,0x80,0x3C,0x60,0x00,0x00,}}, +{ 0xD784, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD785, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD786, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x1C,0x40,0x00,0x40,0x7F,0xC0,0x00,0x40,0x3F,0xC0,0x08,0x80,0x3F,0xC0,0x00,0x00,}}, +{ 0xD787, {0x00,0x00,0x08,0x40,0x7F,0x40,0x22,0x40,0x22,0x40,0x7F,0xC0,0x00,0x40,0x00,0x00,0x01,0x00,0x3F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xD788, {0x00,0x00,0x3C,0x40,0x00,0x40,0xFF,0x40,0x00,0x40,0x3C,0x40,0x42,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD789, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,}}, +{ 0xD78A, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,}}, +{ 0xD78B, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3C,0x80,0x04,0x80,0x05,0x40,0x02,0x20,0x00,0x00,}}, +{ 0xD78C, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x40,0x20,0x00,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD78D, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x27,0xC0,0x21,0x00,0x22,0x80,0x1C,0x60,0x00,0x00,}}, +{ 0xD78E, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x01,0x00,0x27,0xE0,0x22,0x40,0x22,0x40,0x1D,0x80,0x00,0x00,}}, +{ 0xD78F, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD790, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x00,0x40,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD791, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x04,0x40,0x3C,0x40,0x20,0x40,0x1C,0x40,0x00,0x00,}}, +{ 0xD792, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3D,0xC0,0x05,0x40,0x3D,0x40,0x21,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD793, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3A,0x40,0x0A,0x40,0x3B,0xC0,0x22,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD794, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3C,0x80,0x04,0x80,0x3D,0x40,0x22,0x20,0x1C,0x10,0x00,0x00,}}, +{ 0xD795, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3B,0xC0,0x0A,0x00,0x3B,0xC0,0x22,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD796, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3B,0xE0,0x09,0x40,0x39,0x40,0x21,0x40,0x1F,0xE0,0x00,0x00,}}, +{ 0xD797, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x78,0x80,0x0F,0xE0,0x7A,0x40,0x42,0x40,0x39,0x80,0x00,0x00,}}, +{ 0xD798, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD799, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x1F,0xC0,0x00,0x00,}}, +{ 0xD79A, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x24,0x80,0x3C,0x80,0x25,0x40,0x1E,0x20,0x00,0x00,}}, +{ 0xD79B, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x01,0x00,0x02,0x80,0x0C,0x40,0x30,0x20,0x00,0x00,}}, +{ 0xD79C, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x08,0x80,0x08,0x80,0x15,0x40,0x22,0x20,0x00,0x00,}}, +{ 0xD79D, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00,}}, +{ 0xD79E, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD79F, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x01,0x00,0x3F,0xE0,0x01,0x00,0x06,0x80,0x38,0x60,0x00,0x00,}}, +{ 0xD7A0, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD7A1, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x3F,0xC0,0x20,0x00,0x3F,0xC0,0x20,0x00,0x1F,0xC0,0x00,0x00,}}, +{ 0xD7A2, {0x00,0x00,0x10,0x40,0xFF,0x40,0x24,0x40,0x42,0x40,0x42,0x40,0x3C,0x40,0x00,0x00,0x3F,0xE0,0x08,0x80,0x08,0x80,0x3F,0xE0,0x00,0x00,}}, +{ 0xD7A3, {0x00,0x00,0x10,0x40,0xFE,0x40,0x44,0x40,0x44,0x40,0x38,0x40,0x00,0x40,0x07,0x00,0x00,0x00,0x7F,0xE0,0x10,0x40,0x0F,0x80,0x00,0x00,}}, +{ 0xFB01, {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x80,0x18,0x00,0x3F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFB02, {0x00,0x00,0x00,0x00,0x07,0x80,0x09,0x80,0x19,0x80,0x3F,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFE30, {0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE31, {0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xFE32, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE33, {0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,}}, +{ 0xFE34, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE35, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x3F,0x80,0x60,0xC0,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE36, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x60,0xC0,0x3F,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE37, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x7B,0xC0,0xF1,0xE0,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE38, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0xF1,0xE0,0x7B,0xC0,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE39, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x40,0x40,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE3A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x40,0x40,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE3B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0xF1,0xE0,0xC0,0x60,0x80,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE3C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0xC0,0x60,0xF1,0xE0,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE3D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0xC0,0x60,0x0E,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE3E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x31,0x80,0x0E,0x00,0xC0,0x60,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE3F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0xC0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE40, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x60,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE41, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE42, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE43, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xE0,0x80,0x20,0xFF,0xA0,0x00,0xA0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE44, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xA0,0x00,0xBF,0xE0,0x80,0x20,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE45, {0x00,0x00,0xEE,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE46, {0x00,0x00,0xF5,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE47, {0x00,0x00,0x55,0x40,0xAA,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE48, {0x00,0x00,0x55,0x40,0xAA,0xA0,0x00,0x00,0x55,0x40,0xAA,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE49, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0xE0,0x00,0x00,}}, +{ 0xFE4A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF5,0xE0,0x00,0x00,}}, +{ 0xFE4B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x40,0xAA,0xA0,0x00,0x00,}}, +{ 0xFE50, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0xFE51, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x30,0x00,0x10,0x00,0x08,0x00,0x00,0x00,}}, +{ 0xFE52, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE53, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xFE54, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE55, {0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x03,0x80,0x07,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE56, {0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE57, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE58, {0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE59, {0x00,0x00,0x00,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE5A, {0x00,0x00,0x00,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE5B, {0x00,0x00,0x00,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE5C, {0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE5D, {0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE5E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x1F,0x00,0x0A,0x00,0x1F,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE5F, {0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x12,0x00,0x12,0x00,0x0C,0x00,0x0A,0x80,0x11,0x00,0x12,0x80,0x0C,0x40,0x00,0x00,0x00,0x00,}}, +{ 0xFE60, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x1F,0x00,0x0E,0x00,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE61, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE62, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE63, {0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE64, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE65, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE66, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE67, {0x00,0x00,0x00,0x00,0x04,0x00,0x0F,0x00,0x14,0x00,0x14,0x00,0x0C,0x00,0x06,0x00,0x05,0x00,0x05,0x00,0x1E,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xFE68, {0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x15,0x00,0x0A,0x00,0x02,0x00,0x04,0x00,0x05,0x00,0x0A,0x80,0x09,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFE69, {0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x10,0x40,0x25,0x40,0x2B,0x40,0x29,0x40,0x27,0x80,0x10,0x00,0x0F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF00, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF01, {0x00,0x00,0x04,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x0E,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xFF02, {0x00,0x00,0x19,0x80,0x19,0x80,0x19,0x80,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF03, {0x00,0x00,0x08,0x80,0x08,0x80,0x3F,0xC0,0x11,0x00,0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0x80,0x22,0x00,0x22,0x00,0x22,0x00,0x00,0x00,}}, +{ 0xFF04, {0x00,0x00,0x04,0x00,0x1F,0x00,0x24,0x80,0x25,0x80,0x3C,0x00,0x0F,0x00,0x05,0x80,0x34,0x80,0x24,0x80,0x1F,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xFF05, {0x00,0x00,0x38,0x20,0x6C,0x40,0x6C,0x80,0x6D,0x00,0x3A,0x00,0x05,0xC0,0x0B,0x60,0x13,0x60,0x23,0x60,0x41,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF06, {0x00,0x00,0x1C,0x00,0x32,0x00,0x32,0x00,0x3C,0x00,0x19,0xC0,0x38,0x80,0x6D,0x80,0x63,0x00,0x67,0x00,0x38,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF07, {0x00,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF08, {0x00,0x00,0x00,0x80,0x01,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x00,0x80,0x00,0x00,}}, +{ 0xFF09, {0x00,0x00,0x20,0x00,0x10,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0xFF0A, {0x00,0x00,0x04,0x00,0x0E,0x00,0x24,0x80,0x75,0xC0,0x0E,0x00,0x0E,0x00,0x75,0xC0,0x24,0x80,0x0E,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF0B, {0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF0C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x10,0x00,0x20,0x00,0x00,0x00,}}, +{ 0xFF0D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF0E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF0F, {0x00,0x00,0x00,0x60,0x00,0xE0,0x01,0xC0,0x03,0x80,0x07,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0x60,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF10, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x0E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF11, {0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF12, {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x80,0x38,0xC0,0x19,0x80,0x01,0x00,0x02,0x00,0x04,0x40,0x0F,0x80,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF13, {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x80,0x30,0xC0,0x01,0x80,0x07,0x00,0x00,0x80,0x30,0xC0,0x11,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF14, {0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x31,0x80,0x3F,0xC0,0x01,0x80,0x03,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF15, {0x00,0x00,0x00,0x00,0x1F,0x80,0x1F,0x00,0x10,0x00,0x1F,0x00,0x01,0x80,0x00,0xC0,0x00,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF16, {0x00,0x00,0x00,0x00,0x0F,0x00,0x11,0x80,0x30,0x00,0x2F,0x00,0x71,0x80,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF17, {0x00,0x00,0x00,0x00,0x1F,0xC0,0x1F,0x80,0x21,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF18, {0x00,0x00,0x00,0x00,0x0F,0x00,0x10,0x80,0x38,0xC0,0x1D,0x80,0x0F,0x00,0x1B,0x80,0x31,0xC0,0x10,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF19, {0x00,0x00,0x00,0x00,0x06,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x19,0xC0,0x0E,0xC0,0x00,0x80,0x31,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF1A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF1B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x00,0x00,}}, +{ 0xFF1C, {0x00,0x00,0x00,0x40,0x01,0x80,0x02,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x01,0x80,0x00,0x40,0x00,0x00,}}, +{ 0xFF1D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF1E, {0x00,0x00,0x20,0x00,0x18,0x00,0x04,0x00,0x03,0x00,0x00,0x80,0x00,0x40,0x00,0x80,0x03,0x00,0x04,0x00,0x18,0x00,0x20,0x00,0x00,0x00,}}, +{ 0xFF1F, {0x00,0x00,0x0E,0x00,0x13,0x00,0x21,0x80,0x31,0x80,0x33,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,}}, +{ 0xFF20, {0x00,0x00,0x07,0x00,0x18,0xC0,0x27,0x20,0x29,0xA0,0x49,0xA0,0x51,0x20,0x53,0x40,0x4E,0x80,0x20,0x20,0x1F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF21, {0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x07,0x00,0x09,0x00,0x09,0x80,0x10,0x80,0x1F,0xC0,0x20,0x40,0x70,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xFF22, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3F,0x00,0x30,0x80,0x30,0xC0,0x30,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF23, {0x00,0x00,0x00,0x00,0x07,0x40,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF24, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x7E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF25, {0x00,0x00,0x00,0x00,0x7F,0x80,0x30,0x80,0x30,0x00,0x31,0x00,0x3F,0x00,0x31,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF26, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x18,0x40,0x18,0x00,0x18,0x80,0x1F,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF27, {0x00,0x00,0x00,0x00,0x0E,0x80,0x31,0x80,0x60,0x00,0x60,0x00,0x63,0xC0,0x61,0x80,0x61,0x80,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF28, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x3F,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xFF29, {0x00,0x00,0x00,0x00,0x1F,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF2A, {0x00,0x00,0x00,0x00,0x07,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x61,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF2B, {0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0x80,0x31,0x00,0x33,0x00,0x35,0x80,0x39,0x80,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xFF2C, {0x00,0x00,0x00,0x00,0x7C,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF2D, {0x00,0x00,0x00,0x00,0x61,0xC0,0x31,0x80,0x31,0x80,0x3B,0x80,0x3B,0x80,0x2D,0x80,0x2D,0x80,0x25,0x80,0x71,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF2E, {0x00,0x00,0x00,0x00,0x31,0xC0,0x18,0x80,0x1C,0x80,0x16,0x80,0x16,0x80,0x13,0x80,0x11,0x80,0x10,0x80,0x39,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF2F, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF30, {0x00,0x00,0x00,0x00,0x3F,0x00,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF31, {0x00,0x00,0x00,0x00,0x0E,0x00,0x31,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x6C,0xC0,0x33,0x80,0x1F,0x80,0x00,0xC0,0x00,0x00,}}, +{ 0xFF32, {0x00,0x00,0x00,0x00,0x7E,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x3E,0x00,0x33,0x00,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF33, {0x00,0x00,0x00,0x00,0x0E,0x80,0x11,0x80,0x30,0x80,0x1C,0x00,0x0F,0x00,0x03,0x80,0x20,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF34, {0x00,0x00,0x00,0x00,0x3F,0xC0,0x26,0x40,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF35, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF36, {0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x18,0x40,0x18,0x80,0x0C,0x80,0x0D,0x00,0x07,0x00,0x06,0x00,0x02,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF37, {0x00,0x00,0x00,0x00,0xEE,0x60,0x66,0x40,0x66,0x40,0x37,0xC0,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF38, {0x00,0x00,0x00,0x00,0x79,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0E,0x00,0x13,0x00,0x21,0x80,0x63,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF39, {0x00,0x00,0x00,0x00,0x7B,0xC0,0x31,0x00,0x1A,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF3A, {0x00,0x00,0x00,0x00,0x7F,0x80,0x43,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x40,0x7F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF3B, {0x00,0x00,0x07,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x80,0x00,0x00,}}, +{ 0xFF3C, {0x00,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x60,0x00,0x00,0x00,0x00,}}, +{ 0xFF3D, {0x00,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3C,0x00,0x00,0x00,}}, +{ 0xFF3E, {0x00,0x00,0x06,0x00,0x0F,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF3F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,}}, +{ 0xFF40, {0x00,0x00,0x0C,0x00,0x06,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF41, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x33,0x00,0x31,0x80,0x0F,0x80,0x31,0x80,0x63,0x80,0x3C,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF42, {0x00,0x00,0x00,0x00,0x38,0x00,0x18,0x00,0x1B,0x00,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1C,0xC0,0x3B,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF43, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x30,0x00,0x30,0x40,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF44, {0x00,0x00,0x00,0x00,0x03,0x80,0x01,0x80,0x0D,0x80,0x33,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x80,0x1D,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF45, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0xC0,0x3F,0xC0,0x30,0x00,0x18,0x40,0x0F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF46, {0x00,0x00,0x00,0x00,0x07,0x00,0x09,0x80,0x18,0x00,0x3F,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF47, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x19,0x80,0x11,0x80,0x11,0x00,0x0E,0x00,0x1F,0x80,0x31,0xC0,0x10,0x40,0x0F,0x80,}}, +{ 0xFF48, {0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x36,0x00,0x3B,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF49, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF4A, {0x00,0x00,0x02,0x00,0x07,0x00,0x02,0x00,0x00,0x00,0x1F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x13,0x00,0x32,0x00,0x1C,0x00,}}, +{ 0xFF4B, {0x00,0x00,0x00,0x00,0x70,0x00,0x30,0x00,0x31,0x80,0x33,0x00,0x36,0x00,0x3F,0x00,0x33,0x00,0x31,0x80,0x79,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF4C, {0x00,0x00,0x00,0x00,0x1E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF4D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6D,0x80,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x76,0xE0,0x00,0x00,0x00,0x00,}}, +{ 0xFF4E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x00,0x39,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x7B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF4F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF50, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x00,0x1C,0x80,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x1C,0x80,0x1B,0x00,0x18,0x00,0x3C,0x00,}}, +{ 0xFF51, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0xC0,0x13,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x13,0x80,0x0D,0x80,0x01,0x80,0x03,0xC0,}}, +{ 0xFF52, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x00,0x1D,0x80,0x18,0x80,0x18,0x00,0x18,0x00,0x18,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF53, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0x80,0x30,0x00,0x1F,0x80,0x00,0xC0,0x30,0xC0,0x2F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF54, {0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x80,0x07,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF55, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x1E,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF56, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x18,0x80,0x18,0x80,0x0D,0x00,0x0F,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF57, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0xE0,0x76,0x40,0x36,0x40,0x3B,0x80,0x3B,0x80,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFF58, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0xC0,0x18,0x80,0x0D,0x00,0x06,0x00,0x0F,0x00,0x11,0x80,0x3B,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF59, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7D,0xC0,0x30,0x80,0x18,0x80,0x19,0x00,0x0D,0x00,0x0E,0x00,0x66,0x00,0x64,0x00,0x38,0x00,}}, +{ 0xFF5A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x21,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x18,0x40,0x3F,0xC0,0x00,0x00,0x00,0x00,}}, +{ 0xFF5B, {0x00,0x00,0x01,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x02,0x00,0x0C,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x00,0x00,}}, +{ 0xFF5C, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFF5D, {0x00,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x06,0x00,0x08,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x00,0x00,}}, +{ 0xFF5E, {0x00,0x00,0x1C,0xC0,0x33,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFFE0, {0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x0F,0x00,0x1B,0x80,0x32,0xC0,0x32,0x00,0x34,0x00,0x1C,0xC0,0x0F,0x80,0x08,0x00,0x08,0x00,}}, +{ 0xFFE1, {0x00,0x00,0x03,0x80,0x06,0xC0,0x0C,0xC0,0x0C,0x00,0x0C,0x00,0x3F,0x80,0x0C,0x00,0x3C,0x20,0x4E,0x40,0x39,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFFE2, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,}}, +{ 0xFFE3, {0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFFE4, {0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,}}, +{ 0xFFE5, {0x00,0x00,0x70,0xE0,0x30,0x40,0x18,0x80,0x0C,0x80,0x0D,0x00,0x3F,0xC0,0x06,0x00,0x3F,0xC0,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFFE6, {0x00,0x00,0x00,0x00,0xEE,0x60,0x66,0x40,0x66,0x40,0x36,0xC0,0xFF,0xE0,0x3B,0x80,0xFF,0xE0,0x19,0x80,0x19,0x80,0x00,0x00,0x00,0x00,}}, +{ 0xFFFD, {0x0F,0x00,0x1F,0x80,0x30,0xC0,0x66,0x60,0x7E,0x60,0x7C,0xE0,0x79,0xE0,0x79,0xE0,0x7F,0xE0,0x39,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,}}, diff --git a/Mednafen/mednafen/video/font18x18.h b/Mednafen/mednafen/video/font18x18.h new file mode 100644 index 0000000000..1027cfa89d --- /dev/null +++ b/Mednafen/mednafen/video/font18x18.h @@ -0,0 +1,27990 @@ +{ 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0023, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0024, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0xF0, 0x00, 0x04, 0x98, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x80, 0x00, 0x04, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x88, 0x00, 0x00, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x88, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x01, 0x00, 0x22, 0x02, 0x00, 0x22, 0x04, 0x00, 0x22, 0x08, 0x00, 0x22, 0x10, 0x00, 0x22, 0x20, 0x00, 0x1C, 0x40, 0x00, 0x00, 0x8E, 0x00, 0x01, 0x11, 0x00, 0x02, 0x11, 0x00, 0x04, 0x11, 0x00, 0x08, 0x11, 0x00, 0x10, 0x11, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x07, 0x3E, 0x00, 0x06, 0x08, 0x00, 0x0F, 0x18, 0x00, 0x19, 0x90, 0x00, 0x30, 0xF0, 0x00, 0x20, 0x60, 0x00, 0x20, 0xF1, 0x00, 0x11, 0x9B, 0x00, 0x0F, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0027, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0028, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0029, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0C, 0x98, 0x00, 0x06, 0xB0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0031, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x08, 0x00, 0x0C, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0xD0, 0x00, 0x01, 0x90, 0x00, 0x03, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xF0, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0D, 0xE0, 0x00, 0x0A, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0037, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x10, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0038, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x14, 0x00, 0x01, 0xEC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0040, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x08, 0xD4, 0x00, 0x11, 0x32, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x64, 0x00, 0x09, 0xB8, 0x00, 0x08, 0x02, 0x00, 0x06, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0042, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x14, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x18, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x04, 0x00, 0x04, 0x06, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x18, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0046, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC8, 0x00, 0x0C, 0x38, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x3E, 0x00, 0x30, 0x08, 0x00, 0x10, 0x08, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x28, 0x00, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0048, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x08, 0x30, 0x00, 0x08, 0x60, 0x00, 0x08, 0xC0, 0x00, 0x09, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x80, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x60, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x18, 0x0C, 0x00, 0x1C, 0x1C, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x16, 0x34, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x13, 0x64, 0x00, 0x11, 0x44, 0x00, 0x11, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x78, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1F, 0x00, 0x0E, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x64, 0x00, 0x08, 0x24, 0x00, 0x08, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x18, 0x06, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x18, 0x06, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0051, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x18, 0x18, 0x00, 0x10, 0x08, 0x00, 0x30, 0x0C, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x30, 0x0C, 0x00, 0x11, 0x88, 0x00, 0x1A, 0x58, 0x00, 0x0C, 0x30, 0x00, 0x03, 0xD2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0052, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0053, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x06, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0054, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0055, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0056, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x04, 0x18, 0x00, 0x06, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x30, 0x00, 0x03, 0x20, 0x00, 0x01, 0x60, 0x00, 0x01, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0057, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xCF, 0x80, 0x10, 0xC2, 0x00, 0x10, 0xC2, 0x00, 0x11, 0xE2, 0x00, 0x19, 0x26, 0x00, 0x09, 0x24, 0x00, 0x0B, 0x34, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0x14, 0x00, 0x0E, 0x1C, 0x00, 0x06, 0x18, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0058, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x08, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0059, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x18, 0x00, 0x08, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005B, { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005C, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x005D, { 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005E, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x0060, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0061, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0062, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x03, 0x08, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x03, 0x08, 0x00, 0x02, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0064, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xD0, 0x00, 0x04, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0066, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x88, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0068, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0069, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x04, 0x20, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x30, 0x00, 0x04, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x60, 0x00, 0x04, 0x18, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x38, 0x00, 0x18, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x39, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0070, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xF0, 0x00, 0x03, 0x08, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x03, 0x08, 0x00, 0x02, 0xF0, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0071, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xD0, 0x00, 0x04, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x30, 0x00, 0x03, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0072, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x00, 0x01, 0x48, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0073, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xCF, 0x00, 0x08, 0xC4, 0x00, 0x0D, 0xEC, 0x00, 0x05, 0x28, 0x00, 0x05, 0x28, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x13, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007E, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x30, 0x00, 0x04, 0x48, 0x00, 0x04, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x03, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x23, 0x01, 0x00, 0x22, 0xC2, 0x00, 0x1C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x0B, 0xE8, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xE8, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x01, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x30, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A9, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x44, 0x00, 0x80, 0x44, 0x00, 0x80, 0x44, 0x00, 0x80, 0x44, 0x00, 0x80, 0x24, 0x09, 0x00, 0x22, 0x11, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x30, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x70, 0x00, 0x07, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x20, 0x00, 0x02, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x02, 0x40, 0x00, 0x01, 0x20, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AE, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x13, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x22, 0x09, 0x00, 0x42, 0x10, 0x80, 0x43, 0xE0, 0x80, 0x42, 0x10, 0x80, 0x42, 0x10, 0x80, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AF, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x22, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x22, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x05, 0xE6, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF6, 0x00, 0x1C, 0x36, 0x00, 0x30, 0x36, 0x00, 0x30, 0x36, 0x00, 0x1C, 0x36, 0x00, 0x07, 0xF6, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x02, 0x40, 0x00, 0x01, 0x20, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x01, 0x20, 0x00, 0x02, 0x40, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x02, 0x22, 0x00, 0x07, 0x46, 0x00, 0x00, 0x8A, 0x00, 0x01, 0x12, 0x00, 0x02, 0x22, 0x00, 0x04, 0x7F, 0x80, 0x08, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x02, 0x2F, 0x00, 0x07, 0x50, 0x80, 0x00, 0x80, 0x80, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x04, 0x04, 0x00, 0x08, 0x08, 0x80, 0x10, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x21, 0x01, 0x00, 0x01, 0x02, 0x00, 0x0E, 0x04, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x21, 0x22, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x8A, 0x00, 0x01, 0x12, 0x00, 0x02, 0x22, 0x00, 0x04, 0x7F, 0x80, 0x08, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C0, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C3, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C4, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C5, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x70, 0x80, 0x00, 0xB0, 0x00, 0x01, 0x31, 0x00, 0x02, 0x3F, 0x00, 0x07, 0xF1, 0x00, 0x08, 0x30, 0x00, 0x10, 0x30, 0x00, 0x20, 0x30, 0x80, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x14, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C8, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CB, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CC, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CF, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x0C, 0x70, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x3F, 0x8C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x70, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D1, { 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x3E, 0x7F, 0x00, 0x0E, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x64, 0x00, 0x08, 0x24, 0x00, 0x08, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D2, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D5, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D6, { 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x38, 0x00, 0x0C, 0x6C, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x0D, 0x8C, 0x00, 0x07, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D9, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DC, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DD, { 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x3F, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0xE0, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x0D, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x80, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3E, 0x00, 0x61, 0xE3, 0x00, 0x00, 0xC1, 0x80, 0x7F, 0xFF, 0x80, 0x60, 0xC0, 0x00, 0x61, 0xE1, 0x80, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x03, 0xF0, 0x00, 0x06, 0xD8, 0x00, 0x0D, 0x8C, 0x00, 0x00, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x78, 0x00, 0x0C, 0x6C, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x07, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x13, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x06, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x07, 0x18, 0x00, 0x07, 0xF0, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x13, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0100, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0101, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0102, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0106, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x14, 0x00, 0x04, 0x0C, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0108, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x14, 0x00, 0x04, 0x0C, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010A, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x14, 0x00, 0x04, 0x0C, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010C, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x14, 0x00, 0x04, 0x0C, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x18, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x04, 0x00, 0x04, 0x06, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x18, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010F, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x70, 0x00, 0x00, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xD0, 0x00, 0x04, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x04, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x04, 0x18, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x04, 0x00, 0x04, 0x06, 0x00, 0x04, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x18, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0C, 0x00, 0x03, 0xEC, 0x00, 0x06, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x1C, 0x00, 0x03, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0112, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0114, { 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0116, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x80, 0x00, 0x04, 0x40, 0x00, 0x03, 0xC8, 0x00, 0x0C, 0x38, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x3E, 0x00, 0x30, 0x08, 0x00, 0x10, 0x18, 0x00, 0x0C, 0x28, 0x00, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011E, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC8, 0x00, 0x0C, 0x38, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x3E, 0x00, 0x30, 0x08, 0x00, 0x10, 0x18, 0x00, 0x0C, 0x28, 0x00, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0120, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC8, 0x00, 0x0C, 0x38, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x3E, 0x00, 0x30, 0x08, 0x00, 0x10, 0x18, 0x00, 0x0C, 0x28, 0x00, 0x03, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC8, 0x00, 0x0C, 0x38, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x3E, 0x00, 0x30, 0x08, 0x00, 0x10, 0x08, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x28, 0x00, 0x03, 0xC8, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0124, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0125, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1D, 0x40, 0x00, 0x06, 0x20, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x3F, 0xFF, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x06, 0x00, 0x00, 0x06, 0xF0, 0x00, 0x07, 0x98, 0x00, 0x07, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0128, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012A, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012C, { 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0130, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0xCC, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0134, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x08, 0x30, 0x00, 0x08, 0x60, 0x00, 0x08, 0xC0, 0x00, 0x09, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x80, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x60, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x3E, 0xBE, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x30, 0x00, 0x04, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x60, 0x00, 0x04, 0x18, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x0E, 0xC0, 0x00, 0x0C, 0x60, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0139, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013D, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xCC, 0x00, 0x00, 0xCC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0143, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x5F, 0x00, 0x0E, 0x84, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x64, 0x00, 0x08, 0x24, 0x00, 0x08, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1F, 0x00, 0x0E, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x64, 0x00, 0x08, 0x24, 0x00, 0x08, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x44, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0147, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3D, 0x5F, 0x00, 0x0E, 0x84, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x09, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x64, 0x00, 0x08, 0x24, 0x00, 0x08, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x38, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xE0, 0x00, 0x0E, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014C, { 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014E, { 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0150, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x90, 0x00, 0x01, 0x20, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0151, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x90, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0152, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x60, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60, 0x00, 0x18, 0x7C, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60, 0x00, 0x18, 0x60, 0x00, 0x0C, 0xE0, 0x00, 0x07, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x31, 0xE3, 0x00, 0x60, 0xC1, 0x80, 0x60, 0xFF, 0x80, 0x60, 0xC0, 0x00, 0x31, 0xE1, 0x80, 0x1F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0154, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x00, 0x01, 0x48, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0156, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xBE, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x00, 0x01, 0x48, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0158, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0159, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x00, 0x01, 0x48, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x06, 0x04, 0x00, 0x01, 0xE0, 0x00, 0x08, 0x18, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x06, 0x04, 0x00, 0x01, 0xE0, 0x00, 0x08, 0x18, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x06, 0x04, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0160, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x06, 0x04, 0x00, 0x01, 0xE0, 0x00, 0x08, 0x18, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x78, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0164, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0165, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x18, 0xC6, 0x00, 0x10, 0xC2, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x01, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x88, 0x00, 0x01, 0x98, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0168, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016A, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0170, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x20, 0x00, 0x02, 0x40, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x02, 0x40, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0174, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7D, 0x5F, 0x00, 0x12, 0x24, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x19, 0xCC, 0x00, 0x09, 0x48, 0x00, 0x09, 0x48, 0x00, 0x0B, 0x68, 0x00, 0x0A, 0x28, 0x00, 0x0E, 0x38, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xCF, 0x00, 0x08, 0xC4, 0x00, 0x0D, 0xEC, 0x00, 0x05, 0x28, 0x00, 0x05, 0x28, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0176, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3D, 0x5E, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x13, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0178, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x3F, 0x7E, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0179, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x18, 0x00, 0x08, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x18, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017B, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x18, 0x00, 0x08, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x18, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017D, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x18, 0x00, 0x08, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x18, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xB0, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x88, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01CD, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x68, 0x00, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01CF, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D1, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D3, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D5, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D9, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x03, 0xE0, 0x00, 0x03, 0x60, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DA, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DB, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DC, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x06, 0x30, 0x00, 0x03, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DC, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x04, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0300, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0301, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0302, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0303, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x04, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0307, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0308, { 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030A, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0384, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0385, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0386, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x80, 0x00, 0x11, 0xC0, 0x00, 0x11, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x08, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0388, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x22, 0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0389, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x5F, 0x1F, 0x00, 0x44, 0x04, 0x00, 0x44, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xF8, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038C, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x21, 0xE0, 0x00, 0x26, 0x18, 0x00, 0x2C, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x18, 0x06, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x18, 0x06, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038E, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x47, 0xBC, 0x00, 0x4C, 0xE6, 0x00, 0x58, 0x43, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038F, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0xF0, 0x00, 0x23, 0x0C, 0x00, 0x26, 0x06, 0x00, 0x04, 0x02, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x04, 0x02, 0x00, 0x06, 0x06, 0x00, 0x03, 0x0C, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0390, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x8C, 0x00, 0x01, 0xFC, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x8C, 0x00, 0x01, 0x0C, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x0C, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x40, 0x00, 0x0F, 0xC0, 0x00, 0x0C, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x1A, 0x2C, 0x00, 0x1B, 0xEC, 0x00, 0x1B, 0xEC, 0x00, 0x1A, 0x2C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x00, 0x0C, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x0C, 0x40, 0x00, 0x0F, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x8C, 0x00, 0x01, 0x0C, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x0C, 0x00, 0x38, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0E, 0x00, 0x18, 0x1C, 0x00, 0x1C, 0x2C, 0x00, 0x16, 0x4C, 0x00, 0x13, 0x8C, 0x00, 0x11, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x38, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0E, 0x00, 0x18, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x16, 0x04, 0x00, 0x13, 0x04, 0x00, 0x11, 0x84, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x64, 0x00, 0x10, 0x34, 0x00, 0x10, 0x1C, 0x00, 0x38, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x02, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x18, 0xC6, 0x00, 0x10, 0xC2, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x78, 0x00, 0x13, 0xCC, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0xCC, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0xCC, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0E, 0x00, 0x0C, 0x08, 0x00, 0x06, 0x10, 0x00, 0x03, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x02, 0x30, 0x00, 0x04, 0x18, 0x00, 0x08, 0x0C, 0x00, 0x38, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE7, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0xCC, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AA, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AB, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x78, 0x00, 0x19, 0xCC, 0x00, 0x30, 0x86, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC4, 0x00, 0x02, 0x24, 0x00, 0x04, 0x28, 0x00, 0x04, 0x30, 0x00, 0x08, 0x20, 0x00, 0x08, 0x60, 0x00, 0x08, 0xA4, 0x00, 0x07, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x02, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x78, 0x00, 0x09, 0x8C, 0x00, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x02, 0x0C, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x04, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AF, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xB0, 0x00, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x30, 0x00, 0x04, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC4, 0x00, 0x0C, 0x68, 0x00, 0x18, 0x30, 0x00, 0x18, 0x30, 0x00, 0x18, 0x30, 0x00, 0x18, 0x30, 0x00, 0x18, 0x78, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0xE0, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x0D, 0xC0, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x1C, 0x00, 0x06, 0x22, 0x00, 0x03, 0x40, 0x00, 0x03, 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x08, 0x00, 0x06, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xF0, 0x00, 0x07, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x90, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x06, 0x30, 0x00, 0x06, 0x40, 0x00, 0x06, 0x80, 0x00, 0x07, 0x80, 0x00, 0x06, 0x60, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0xB0, 0x00, 0x01, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0B, 0xEC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x60, 0x00, 0x0D, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x7C, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x78, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x04, 0x18, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0E, 0x18, 0x00, 0x0C, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x10, 0x00, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x03, 0x30, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x18, 0x00, 0x0C, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0C, 0x08, 0x00, 0x06, 0x30, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x0C, 0x98, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x10, 0x00, 0x01, 0xA0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x02, 0x30, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x86, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x0C, 0x98, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x0D, 0xEC, 0x00, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB0, 0x00, 0x01, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x30, 0x00, 0x04, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x10, 0x00, 0x06, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x18, 0x00, 0x02, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x18, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x30, 0x00, 0x04, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC4, 0x00, 0x0E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x40, 0x00, 0x0F, 0xC0, 0x00, 0x0C, 0x40, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0402, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xB8, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8A, 0x00, 0x03, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0403, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x04, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x1C, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x18, 0x00, 0x00, 0x14, 0x70, 0x00, 0x13, 0x88, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x06, 0x1C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x06, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0407, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xBC, 0x00, 0x00, 0xA2, 0x00, 0x00, 0xA1, 0x00, 0x00, 0xA1, 0x00, 0x00, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x31, 0x22, 0x00, 0x1E, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xC0, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x84, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x84, 0x00, 0x39, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xB8, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x03, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040C, { 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3C, 0x00, 0x08, 0x64, 0x00, 0x08, 0xC0, 0x00, 0x09, 0x80, 0x00, 0x09, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x09, 0x80, 0x00, 0x08, 0xE0, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x03, 0x60, 0x00, 0x01, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x13, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0410, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x8C, 0x00, 0x01, 0xFC, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x0C, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0411, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0414, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x02, 0x0C, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0415, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x40, 0x00, 0x0F, 0xC0, 0x00, 0x0C, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE7, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0xCC, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0xCC, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x39, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x01, 0xCC, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x04, 0x00, 0x0F, 0x1C, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x06, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x16, 0x00, 0x18, 0x26, 0x00, 0x18, 0x46, 0x00, 0x18, 0x86, 0x00, 0x19, 0x06, 0x00, 0x1A, 0x06, 0x00, 0x1C, 0x06, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0419, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x36, 0x00, 0x18, 0xC6, 0x00, 0x1B, 0x06, 0x00, 0x1C, 0x06, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x00, 0x0C, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x0C, 0x40, 0x00, 0x0F, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x31, 0x0C, 0x00, 0x32, 0x0C, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x0C, 0x0C, 0x00, 0x0E, 0x1C, 0x00, 0x0B, 0x2C, 0x00, 0x09, 0xCC, 0x00, 0x08, 0x8C, 0x00, 0x10, 0x06, 0x00, 0x10, 0x06, 0x00, 0x10, 0x06, 0x00, 0x10, 0x06, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0420, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0421, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF2, 0x00, 0x07, 0x1E, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x0C, 0x06, 0x00, 0x07, 0x1C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x18, 0xC6, 0x00, 0x10, 0xC2, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0423, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0F, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x18, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x19, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0424, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0xCC, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0xCC, 0x00, 0x07, 0xF8, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0425, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0E, 0x00, 0x0C, 0x08, 0x00, 0x06, 0x10, 0x00, 0x03, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x02, 0x30, 0x00, 0x04, 0x18, 0x00, 0x08, 0x0C, 0x00, 0x38, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x1E, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0427, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0428, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x63, 0x00, 0x00, 0x43, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x03, 0x06, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x06, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x1F, 0xC6, 0x00, 0x18, 0x66, 0x00, 0x18, 0x36, 0x00, 0x18, 0x36, 0x00, 0x18, 0x66, 0x00, 0x3F, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xE0, 0x00, 0x1E, 0x38, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x07, 0x06, 0x00, 0x08, 0x8E, 0x00, 0x00, 0x76, 0x00, 0x10, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x0E, 0x38, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7C, 0x00, 0x18, 0xC6, 0x00, 0x19, 0x83, 0x00, 0x19, 0x83, 0x00, 0x1F, 0x83, 0x00, 0x19, 0x83, 0x00, 0x19, 0x83, 0x00, 0x19, 0x83, 0x00, 0x18, 0xC6, 0x00, 0x18, 0x7C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x07, 0x0C, 0x00, 0x01, 0xFC, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x26, 0x0C, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0430, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x30, 0x00, 0x18, 0x30, 0x00, 0x18, 0x70, 0x00, 0x0F, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x03, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0E, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0432, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x04, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x18, 0x00, 0x01, 0x18, 0x00, 0x01, 0x18, 0x00, 0x02, 0x18, 0x00, 0x04, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0435, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE7, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0xCC, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0xCC, 0x00, 0x18, 0xC6, 0x00, 0x39, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0437, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x01, 0xCC, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0F, 0x1C, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x0C, 0x38, 0x00, 0x0C, 0x58, 0x00, 0x0C, 0x98, 0x00, 0x0D, 0x18, 0x00, 0x0E, 0x18, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0439, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x0C, 0x38, 0x00, 0x0C, 0x58, 0x00, 0x0C, 0x98, 0x00, 0x0D, 0x18, 0x00, 0x0E, 0x18, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x38, 0x00, 0x06, 0x10, 0x00, 0x06, 0x20, 0x00, 0x06, 0x40, 0x00, 0x07, 0x80, 0x00, 0x06, 0xC0, 0x00, 0x06, 0x60, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x98, 0x00, 0x00, 0x98, 0x00, 0x00, 0x98, 0x00, 0x00, 0x98, 0x00, 0x18, 0x98, 0x00, 0x19, 0x18, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x0E, 0x38, 0x00, 0x0E, 0x38, 0x00, 0x0D, 0x58, 0x00, 0x0D, 0xD8, 0x00, 0x0C, 0x98, 0x00, 0x0C, 0x18, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x0F, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x07, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE8, 0x00, 0x07, 0x38, 0x00, 0x0C, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x07, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0xCC, 0x00, 0x08, 0xC4, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x04, 0x18, 0x00, 0x02, 0x30, 0x00, 0x01, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x06, 0xD8, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x06, 0xD8, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0447, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x31, 0x80, 0x00, 0x21, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x86, 0x00, 0x01, 0x86, 0x00, 0x01, 0x86, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x1F, 0xC6, 0x00, 0x18, 0x66, 0x00, 0x18, 0x66, 0x00, 0x18, 0x66, 0x00, 0x3F, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0x1C, 0x00, 0x04, 0xEC, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x78, 0x00, 0x18, 0xCC, 0x00, 0x19, 0x86, 0x00, 0x1F, 0x86, 0x00, 0x19, 0x86, 0x00, 0x18, 0xCC, 0x00, 0x18, 0x78, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x26, 0x18, 0x00, 0x1C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0451, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0452, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x02, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x03, 0x18, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x28, 0x00, 0x0F, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0453, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0454, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x06, 0x60, 0x00, 0x05, 0x90, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE8, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x05, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0456, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0457, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0458, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x04, 0x20, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x78, 0x00, 0x01, 0x44, 0x00, 0x01, 0x42, 0x00, 0x11, 0x42, 0x00, 0x13, 0x44, 0x00, 0x0E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xC0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x88, 0x00, 0x1D, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x70, 0x00, 0x04, 0x90, 0x00, 0x05, 0x00, 0x00, 0x07, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x0E, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x03, 0x30, 0x00, 0x01, 0x20, 0x00, 0x01, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x09, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0490, { 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2010, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2011, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2012, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2013, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2014, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2015, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2016, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2017, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, }}, +{ 0x2018, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2019, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201B, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x01, 0x20, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201F, { 0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x02, 0x40, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x00, 0x12, 0x20, 0x00, 0x22, 0x40, 0x00, 0x24, 0x80, 0x00, 0x19, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0xC3, 0x00, 0x09, 0x24, 0x80, 0x12, 0x28, 0x80, 0x22, 0x49, 0x00, 0x41, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x0C, 0xCC, 0x00, 0x19, 0x98, 0x00, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xC4, 0x00, 0x04, 0xC8, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0xC8, 0x00, 0x08, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x12, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2082, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x22, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2083, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x22, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2084, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x12, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x04, 0x02, 0x00, 0x3F, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x04, 0x02, 0x00, 0x06, 0x06, 0x00, 0x03, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x24, 0xF8, 0x00, 0x19, 0x8C, 0x00, 0x03, 0x06, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x06, 0x00, 0x01, 0x8C, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x03, 0x06, 0x00, 0x03, 0x00, 0x00, 0x03, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x03, 0x10, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x01, 0x40, 0x00, 0x01, 0x90, 0x00, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x18, 0x80, 0x00, 0x18, 0x80, 0x00, 0x14, 0x80, 0x00, 0x14, 0x80, 0x00, 0x12, 0x98, 0x00, 0x12, 0xA4, 0x00, 0x11, 0xA4, 0x00, 0x11, 0xA4, 0x00, 0x30, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x24, 0x00, 0x09, 0xE4, 0x00, 0x09, 0x04, 0x00, 0x1C, 0xEE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xB6, 0x00, 0x04, 0x36, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x0E, 0x22, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x02, 0x2F, 0x00, 0x07, 0x50, 0x80, 0x00, 0x80, 0x80, 0x01, 0x07, 0x00, 0x02, 0x00, 0x80, 0x04, 0x00, 0x80, 0x08, 0x10, 0x80, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2154, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x21, 0x01, 0x00, 0x01, 0x02, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x10, 0x2F, 0x00, 0x3F, 0x50, 0x80, 0x00, 0x80, 0x80, 0x01, 0x07, 0x00, 0x02, 0x00, 0x80, 0x04, 0x00, 0x80, 0x08, 0x10, 0x80, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x02, 0x20, 0x00, 0x07, 0x5F, 0x00, 0x00, 0xA0, 0x80, 0x01, 0x20, 0x80, 0x02, 0x1F, 0x00, 0x04, 0x20, 0x80, 0x08, 0x20, 0x80, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x81, 0x00, 0x00, 0x82, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x88, 0x00, 0x10, 0x90, 0x00, 0x0F, 0x20, 0x00, 0x00, 0x5F, 0x00, 0x00, 0xA0, 0x80, 0x01, 0x20, 0x80, 0x02, 0x1F, 0x00, 0x04, 0x20, 0x80, 0x08, 0x20, 0x80, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x84, 0x00, 0x00, 0x48, 0x00, 0x10, 0x90, 0x00, 0x0F, 0x20, 0x00, 0x00, 0x5F, 0x00, 0x00, 0xA0, 0x80, 0x01, 0x20, 0x80, 0x02, 0x1F, 0x00, 0x04, 0x20, 0x80, 0x08, 0x20, 0x80, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x41, 0x00, 0x00, 0x42, 0x00, 0x00, 0x84, 0x00, 0x01, 0x08, 0x00, 0x02, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x5F, 0x00, 0x00, 0xA0, 0x80, 0x01, 0x20, 0x80, 0x02, 0x1F, 0x00, 0x04, 0x20, 0x80, 0x08, 0x20, 0x80, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2160, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x87, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2164, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1F, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xFF, 0x00, 0x20, 0x24, 0x00, 0x20, 0x24, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x05, 0x04, 0x00, 0x05, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x04, 0x12, 0x00, 0x04, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x20, 0xAA, 0x00, 0x20, 0xAA, 0x00, 0x20, 0xAA, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2168, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x8F, 0x00, 0x12, 0x02, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x11, 0x04, 0x00, 0x12, 0x02, 0x00, 0x7F, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x77, 0x00, 0x20, 0x22, 0x00, 0x10, 0x42, 0x00, 0x08, 0x82, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x20, 0x22, 0x00, 0x70, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x7F, 0x00, 0x20, 0x2A, 0x00, 0x10, 0x4A, 0x00, 0x08, 0x8A, 0x00, 0x05, 0x0A, 0x00, 0x05, 0x0A, 0x00, 0x02, 0x0A, 0x00, 0x05, 0x0A, 0x00, 0x05, 0x0A, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x8A, 0x00, 0x10, 0x4A, 0x00, 0x20, 0x2A, 0x00, 0x70, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x60, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x19, 0x98, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x1D, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x8E, 0x00, 0x31, 0x04, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x20, 0x00, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2174, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xE4, 0x00, 0x10, 0x4C, 0x00, 0x10, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x05, 0x04, 0x00, 0x05, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2176, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x22, 0x00, 0x22, 0x66, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x49, 0x00, 0x22, 0xDB, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xC7, 0x00, 0x30, 0x82, 0x00, 0x10, 0x44, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x39, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2179, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2193, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2194, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x18, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xF0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x50, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x50, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x50, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x08, 0x00, 0x20, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x20, 0x40, 0x00, 0x10, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x01, 0x00, 0x04, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x10, 0x00, 0x80, 0x20, 0x00, 0x80, 0x7F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x10, 0x00, 0x80, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04, 0x00, 0x40, 0x02, 0x00, 0x40, 0x01, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x01, 0x00, 0x40, 0x02, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A7, { 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x0A, 0x28, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D3, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x0A, 0x28, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x0E, 0x00, 0x06, 0x04, 0x00, 0x06, 0x04, 0x00, 0x03, 0xF8, 0x00, 0x03, 0x08, 0x00, 0x01, 0x90, 0x00, 0x01, 0x90, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x30, 0x00, 0x04, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0xF8, 0x00, 0x03, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x30, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x04, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x11, 0x44, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x11, 0x44, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x11, 0x44, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x11, 0x44, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x08, 0x02, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xCC, 0x00, 0x00, 0xCC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDE, 0x00, 0x03, 0x33, 0x00, 0x03, 0x33, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x33, 0x30, 0x00, 0x33, 0x30, 0x00, 0x1E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xCC, 0x00, 0x00, 0xCC, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x06, 0xD8, 0x00, 0x06, 0xD8, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2234, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2235, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2236, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x19, 0x86, 0x00, 0x30, 0xCC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x38, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x11, 0x04, 0x00, 0x0E, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2248, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x23, 0x84, 0x00, 0x00, 0x78, 0x00, 0x1C, 0x02, 0x00, 0x23, 0x84, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x38, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x02, 0x00, 0x11, 0x04, 0x00, 0x0E, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0x0C, 0x60, 0x00, 0x03, 0x18, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x0C, 0x60, 0x00, 0x03, 0x18, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x60, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x01, 0x18, 0x00, 0x01, 0x60, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x19, 0x00, 0x00, 0x21, 0x00, 0x00, 0x19, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x60, 0x00, 0x01, 0x18, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x03, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x42, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2287, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x0C, 0x00, 0x08, 0xE2, 0x00, 0x11, 0xF1, 0x00, 0x13, 0xF9, 0x00, 0x13, 0xF9, 0x00, 0x11, 0xF1, 0x00, 0x08, 0xE2, 0x00, 0x06, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2302, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2308, { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2309, { 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2310, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2312, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x48, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2321, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x80, 0x00, 0x09, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x11, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2460, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x11, 0x00, 0x20, 0x21, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x01, 0x00, 0x12, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x20, 0x11, 0x00, 0x20, 0xE1, 0x00, 0x20, 0x11, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2463, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x22, 0x00, 0x10, 0x62, 0x00, 0x20, 0xA1, 0x00, 0x21, 0x21, 0x00, 0x22, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2464, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x11, 0x00, 0x20, 0x09, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x01, 0x00, 0x22, 0xE1, 0x00, 0x23, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2466, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x12, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2467, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x11, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x21, 0xD1, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x72, 0x00, 0x12, 0x8A, 0x00, 0x22, 0x89, 0x00, 0x22, 0x89, 0x00, 0x22, 0x89, 0x00, 0x22, 0x89, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x72, 0x00, 0x12, 0x8A, 0x00, 0x22, 0x89, 0x00, 0x22, 0x19, 0x00, 0x22, 0x21, 0x00, 0x22, 0x41, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFA, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x72, 0x00, 0x12, 0x8A, 0x00, 0x22, 0x09, 0x00, 0x22, 0x31, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x32, 0x00, 0x12, 0x52, 0x00, 0x22, 0x51, 0x00, 0x22, 0x91, 0x00, 0x22, 0xF9, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x82, 0x00, 0x22, 0x81, 0x00, 0x22, 0xF1, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x11, 0x00, 0x20, 0x21, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x01, 0x00, 0x12, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2476, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x20, 0x11, 0x00, 0x20, 0xE1, 0x00, 0x20, 0x11, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x22, 0x00, 0x10, 0x62, 0x00, 0x20, 0xA1, 0x00, 0x21, 0x21, 0x00, 0x22, 0x21, 0x00, 0x23, 0xF9, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2478, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x11, 0x00, 0x20, 0x09, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2479, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x01, 0x00, 0x22, 0xE1, 0x00, 0x23, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x12, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x11, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x12, 0x12, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x21, 0xD1, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x72, 0x00, 0x12, 0x8A, 0x00, 0x22, 0x89, 0x00, 0x22, 0x89, 0x00, 0x22, 0x89, 0x00, 0x22, 0x89, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x72, 0x00, 0x12, 0x8A, 0x00, 0x22, 0x89, 0x00, 0x22, 0x11, 0x00, 0x22, 0x21, 0x00, 0x22, 0x41, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFA, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x72, 0x00, 0x12, 0x8A, 0x00, 0x22, 0x09, 0x00, 0x22, 0x31, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2481, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x32, 0x00, 0x12, 0x52, 0x00, 0x22, 0x51, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0xF9, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x82, 0x00, 0x22, 0x81, 0x00, 0x22, 0xF1, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2483, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x48, 0xF1, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0x71, 0x00, 0x49, 0x89, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x48, 0xF1, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2484, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x49, 0xF9, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x48, 0x11, 0x00, 0x48, 0x21, 0x00, 0x48, 0x21, 0x00, 0x48, 0x21, 0x00, 0x48, 0x41, 0x00, 0x48, 0x41, 0x00, 0x48, 0x41, 0x00, 0x48, 0x41, 0x00, 0x48, 0x41, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2485, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x48, 0xF1, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x48, 0xF1, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x48, 0xF1, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x48, 0xF1, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x19, 0x00, 0x48, 0xE9, 0x00, 0x48, 0x09, 0x00, 0x48, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x48, 0xF1, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2487, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x4E, 0x39, 0x00, 0x51, 0x45, 0x00, 0x51, 0x45, 0x00, 0x41, 0x45, 0x00, 0x41, 0x45, 0x00, 0x42, 0x45, 0x00, 0x44, 0x45, 0x00, 0x48, 0x45, 0x00, 0x50, 0x45, 0x00, 0x51, 0x45, 0x00, 0x51, 0x45, 0x00, 0x5F, 0x39, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x02, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x02, 0x80, 0x00, 0x02, 0x80, 0x00, 0x02, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0x80, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0x80, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x04, 0x80, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2490, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x07, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x07, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x60, 0x00, 0x28, 0xA0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x60, 0x00, 0x08, 0x80, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x60, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x18, 0x50, 0x00, 0x28, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2496, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xF8, 0x00, 0x19, 0x00, 0x00, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x70, 0x00, 0x09, 0x88, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2497, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x70, 0x00, 0x09, 0x88, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x19, 0x04, 0x00, 0x29, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x90, 0x00, 0x08, 0x60, 0x00, 0x08, 0x90, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x18, 0x00, 0x08, 0xE8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x22, 0x88, 0x00, 0x22, 0x88, 0x00, 0x02, 0x88, 0x00, 0x02, 0x88, 0x00, 0x02, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x10, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x22, 0x88, 0x00, 0x22, 0x88, 0x00, 0x3E, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x21, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xEA, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x23, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x13, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x20, 0x11, 0x00, 0x21, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x01, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x62, 0x00, 0x10, 0x82, 0x00, 0x20, 0x81, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x21, 0xF1, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x22, 0xE1, 0x00, 0x23, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0xC2, 0x00, 0x20, 0x01, 0x00, 0x20, 0xC1, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x62, 0x00, 0x20, 0x01, 0x00, 0x20, 0x61, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x10, 0x22, 0x00, 0x12, 0x22, 0x00, 0x09, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x22, 0x21, 0x00, 0x22, 0x41, 0x00, 0x23, 0x81, 0x00, 0x12, 0x42, 0x00, 0x12, 0x32, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x11, 0x84, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x10, 0x84, 0x00, 0x11, 0xC4, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x27, 0xB1, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x26, 0xE1, 0x00, 0x23, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF1, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0x71, 0x00, 0x21, 0x89, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x22, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x27, 0xE1, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0x12, 0x00, 0x10, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x11, 0x22, 0x00, 0x10, 0xC2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x24, 0xC9, 0x00, 0x24, 0xC9, 0x00, 0x13, 0x32, 0x00, 0x12, 0x12, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x21, 0x00, 0x12, 0x12, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x21, 0x11, 0x00, 0x20, 0xA1, 0x00, 0x10, 0x42, 0x00, 0x10, 0x82, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x20, 0x81, 0x00, 0x11, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x21, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xEA, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x23, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x13, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x20, 0x11, 0x00, 0x21, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xF2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x01, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x62, 0x00, 0x10, 0x82, 0x00, 0x20, 0x81, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x21, 0xF1, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x22, 0xE1, 0x00, 0x23, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0xC2, 0x00, 0x20, 0x01, 0x00, 0x20, 0xC1, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x62, 0x00, 0x20, 0x01, 0x00, 0x20, 0x61, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x12, 0x22, 0x00, 0x11, 0xC2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x01, 0x00, 0x22, 0x21, 0x00, 0x22, 0x41, 0x00, 0x23, 0x81, 0x00, 0x12, 0x42, 0x00, 0x12, 0x32, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x11, 0x82, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x27, 0xB1, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x12, 0x4A, 0x00, 0x10, 0x02, 0x00, 0x0E, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x26, 0xE1, 0x00, 0x23, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF1, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x0E, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x21, 0x71, 0x00, 0x21, 0x89, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x22, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x20, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x27, 0xE1, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0x12, 0x00, 0x10, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xF2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x11, 0x22, 0x00, 0x10, 0xC2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x24, 0xC9, 0x00, 0x24, 0xC9, 0x00, 0x13, 0x32, 0x00, 0x12, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x21, 0x00, 0x12, 0x12, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x21, 0x11, 0x00, 0x20, 0xA1, 0x00, 0x10, 0x42, 0x00, 0x10, 0x82, 0x00, 0x0F, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x20, 0x81, 0x00, 0x11, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2502, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2503, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xC7, 0x00, 0x71, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2506, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2507, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x3B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2509, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x3B, 0x80, 0x77, 0x3B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250B, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2510, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2511, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2512, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2513, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2514, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2515, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2516, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2517, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2518, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2519, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251A, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251B, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251C, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251D, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251E, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251F, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2520, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2521, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2522, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2523, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2524, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2525, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2526, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2527, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2528, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2529, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x252A, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x252B, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x252C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x252D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x252E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x252F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2534, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2535, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2536, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2537, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2538, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2539, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253A, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253B, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253C, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253D, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253E, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253F, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2540, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2541, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2542, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2543, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2544, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2545, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2546, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2547, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2548, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2549, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254A, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254B, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254F, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2551, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2552, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2553, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2554, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x01, 0x00, 0x00, 0x01, 0x7F, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2555, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2556, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2557, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x40, 0x00, 0xFF, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2558, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2559, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255A, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x7F, 0xC0, 0x01, 0x00, 0x00, 0x01, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255B, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255C, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255D, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255E, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x255F, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x7F, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2560, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x7F, 0xC0, 0x01, 0x00, 0x00, 0x01, 0x7F, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2561, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2562, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2563, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0x40, 0x00, 0x00, 0x40, 0x00, 0xFF, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2564, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2565, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2566, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x2567, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2568, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2569, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x256A, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x256B, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0xFF, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x256C, { 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0xFF, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0xC0, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, }}, +{ 0x256D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x18, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x256E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x256F, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2570, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2571, { 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, }}, +{ 0x2572, { 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, }}, +{ 0x2573, { 0x80, 0x00, 0x40, 0x40, 0x00, 0x80, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x40, 0x00, 0x80, 0x80, 0x00, 0x40, }}, +{ 0x2574, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2575, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2576, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2579, { 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, }}, +{ 0x257C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257D, { 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, }}, +{ 0x257E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257F, { 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, }}, +{ 0x2580, { 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2584, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2586, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2587, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2588, { 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x2589, { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, }}, +{ 0x258A, { 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, 0xFF, 0xFC, 0x00, }}, +{ 0x258B, { 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, 0xFF, 0xE0, 0x00, }}, +{ 0x258C, { 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, }}, +{ 0x258D, { 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, }}, +{ 0x258E, { 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0xF0, 0x00, 0x00, }}, +{ 0x258F, { 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, }}, +{ 0x2590, { 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, 0x00, 0x7F, 0xC0, }}, +{ 0x2591, { 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, 0x22, 0x22, 0x00, 0x88, 0x88, 0x80, }}, +{ 0x2592, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2593, { 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, 0xDD, 0xDD, 0xC0, 0x77, 0x77, 0x40, }}, +{ 0x2594, { 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2595, { 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, }}, +{ 0x25A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x13, 0xF2, 0x00, 0x13, 0xF2, 0x00, 0x13, 0xF2, 0x00, 0x13, 0xF2, 0x00, 0x13, 0xF2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x25A5, { 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A6, { 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x25A7, { 0x00, 0x00, 0x00, 0x44, 0x44, 0x00, 0x22, 0x22, 0x00, 0x11, 0x11, 0x00, 0x08, 0x88, 0x80, 0x44, 0x44, 0x00, 0x22, 0x22, 0x00, 0x11, 0x11, 0x00, 0x08, 0x88, 0x80, 0x44, 0x44, 0x00, 0x22, 0x22, 0x00, 0x11, 0x11, 0x00, 0x08, 0x88, 0x80, 0x44, 0x44, 0x00, 0x22, 0x22, 0x00, 0x11, 0x11, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x25A8, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x11, 0x11, 0x00, 0x22, 0x22, 0x00, 0x44, 0x44, 0x00, 0x08, 0x88, 0x80, 0x11, 0x11, 0x00, 0x22, 0x22, 0x00, 0x44, 0x44, 0x00, 0x08, 0x88, 0x80, 0x11, 0x11, 0x00, 0x22, 0x22, 0x00, 0x44, 0x44, 0x00, 0x08, 0x88, 0x80, 0x11, 0x11, 0x00, 0x22, 0x22, 0x00, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A9, { 0x00, 0x00, 0x00, 0x4C, 0xCC, 0x80, 0x33, 0x33, 0x00, 0x33, 0x33, 0x00, 0x4C, 0xCC, 0x80, 0x4C, 0xCC, 0x80, 0x33, 0x33, 0x00, 0x33, 0x33, 0x00, 0x4C, 0xCC, 0x80, 0x4C, 0xCC, 0x80, 0x33, 0x33, 0x00, 0x33, 0x33, 0x00, 0x4C, 0xCC, 0x80, 0x4C, 0xCC, 0x80, 0x33, 0x33, 0x00, 0x33, 0x33, 0x00, 0x4C, 0xCC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x25AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x07, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xF8, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x04, 0x01, 0x00, 0x08, 0x02, 0x00, 0x10, 0x04, 0x00, 0x20, 0x08, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x09, 0x80, 0x00, 0x08, 0x60, 0x00, 0x08, 0x18, 0x00, 0x08, 0x06, 0x00, 0x08, 0x18, 0x00, 0x08, 0x60, 0x00, 0x09, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x07, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x05, 0x80, 0x00, 0x04, 0x60, 0x00, 0x04, 0x18, 0x00, 0x04, 0x60, 0x00, 0x05, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x3F, 0xFC, 0x00, 0x3F, 0xE0, 0x00, 0x3F, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x27, 0x00, 0x00, 0x20, 0xE0, 0x00, 0x20, 0x1C, 0x00, 0x20, 0x03, 0x80, 0x20, 0x1C, 0x00, 0x20, 0xE0, 0x00, 0x27, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x7C, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x64, 0x00, 0x01, 0x84, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x06, 0x04, 0x00, 0x01, 0x84, 0x00, 0x00, 0x64, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x78, 0x00, 0x01, 0xF8, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x78, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x68, 0x00, 0x01, 0x88, 0x00, 0x06, 0x08, 0x00, 0x01, 0x88, 0x00, 0x00, 0x68, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1F, 0x80, 0x00, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x07, 0xFF, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x80, 0x00, 0xE0, 0x80, 0x07, 0x00, 0x80, 0x38, 0x00, 0x80, 0x07, 0x00, 0x80, 0x00, 0xE0, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x90, 0x00, 0x09, 0xC8, 0x00, 0x13, 0xE4, 0x00, 0x27, 0xF2, 0x00, 0x13, 0xE4, 0x00, 0x09, 0xC8, 0x00, 0x04, 0x90, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x11, 0xE2, 0x00, 0x13, 0xF2, 0x00, 0x27, 0xF9, 0x00, 0x27, 0xF9, 0x00, 0x27, 0xF9, 0x00, 0x27, 0xF9, 0x00, 0x13, 0xF2, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0xB8, 0x00, 0x0A, 0xAC, 0x00, 0x1A, 0xAA, 0x00, 0x1A, 0xAA, 0x00, 0x2A, 0xAB, 0x00, 0x2A, 0xAB, 0x00, 0x2A, 0xAB, 0x00, 0x2A, 0xAB, 0x00, 0x1A, 0xAA, 0x00, 0x1A, 0xAA, 0x00, 0x0A, 0xAC, 0x00, 0x06, 0xB8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x18, 0x00, 0x11, 0xC4, 0x00, 0x24, 0x12, 0x00, 0x28, 0x0A, 0x00, 0x28, 0x0A, 0x00, 0x24, 0x12, 0x00, 0x11, 0xC4, 0x00, 0x0C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0xCC, 0x00, 0x0F, 0xC2, 0x00, 0x1F, 0xC1, 0x00, 0x1F, 0xC1, 0x00, 0x1F, 0xC1, 0x00, 0x1F, 0xC1, 0x00, 0x0F, 0xC2, 0x00, 0x07, 0xCC, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x7C, 0x00, 0x08, 0x7E, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x7F, 0x00, 0x08, 0x7E, 0x00, 0x06, 0x7C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x78, 0x00, 0x08, 0x7C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x7E, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x78, 0x00, 0x08, 0x7C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x7E, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x1F, 0xFE, 0x00, 0x1F, 0xFE, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x07, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x07, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x78, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x78, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D8, { 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFE, 0x3F, 0xC0, 0xFC, 0x1F, 0xC0, 0xF8, 0x0F, 0xC0, 0xF8, 0x0F, 0xC0, 0xF8, 0x0F, 0xC0, 0xFC, 0x1F, 0xC0, 0xFE, 0x3F, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x25D9, { 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFE, 0x1F, 0xC0, 0xF9, 0xE7, 0xC0, 0xF7, 0xFB, 0xC0, 0xEF, 0xFD, 0xC0, 0xEF, 0xFD, 0xC0, 0xDF, 0xFE, 0xC0, 0xDF, 0xFE, 0xC0, 0xDF, 0xFE, 0xC0, 0xDF, 0xFE, 0xC0, 0xEF, 0xFD, 0xC0, 0xEF, 0xFD, 0xC0, 0xF7, 0xFB, 0xC0, 0xF9, 0xE7, 0xC0, 0xFE, 0x1F, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x25DA, { 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, 0xFE, 0x1F, 0xC0, 0xF9, 0xE7, 0xC0, 0xF7, 0xFB, 0xC0, 0xEF, 0xFD, 0xC0, 0xEF, 0xFD, 0xC0, 0xDF, 0xFE, 0xC0, 0xDF, 0xFE, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xFE, 0xC0, 0xDF, 0xFE, 0xC0, 0xEF, 0xFD, 0xC0, 0xEF, 0xFD, 0xC0, 0xF7, 0xFB, 0xC0, 0xF9, 0xE7, 0xC0, 0xFE, 0x1F, 0xC0, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xC0, }}, +{ 0x25DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x0F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0xE0, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xF8, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFC, 0x00, 0x3F, 0xF8, 0x00, 0x3F, 0xF0, 0x00, 0x3F, 0xE0, 0x00, 0x3F, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFF, 0x00, 0x07, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x7F, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFD, 0x00, 0x3F, 0xF9, 0x00, 0x3F, 0xF1, 0x00, 0x3F, 0xE1, 0x00, 0x3F, 0xC1, 0x00, 0x3F, 0x81, 0x00, 0x3F, 0x01, 0x00, 0x3E, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x38, 0x01, 0x00, 0x30, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x03, 0x00, 0x20, 0x07, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x1F, 0x00, 0x20, 0x3F, 0x00, 0x20, 0x7F, 0x00, 0x20, 0xFF, 0x00, 0x21, 0xFF, 0x00, 0x23, 0xFF, 0x00, 0x27, 0xFF, 0x00, 0x2F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x88, 0x00, 0x09, 0xC8, 0x00, 0x08, 0x84, 0x00, 0x10, 0x04, 0x00, 0x10, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xA0, 0x00, 0x03, 0x90, 0x00, 0x07, 0x90, 0x00, 0x07, 0x88, 0x00, 0x0F, 0x88, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x70, 0x00, 0x02, 0x70, 0x00, 0x02, 0x78, 0x00, 0x04, 0x78, 0x00, 0x04, 0x7C, 0x00, 0x08, 0x7C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x7E, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EF, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x40, 0x00, 0x80, 0x40, 0x00, 0x80, 0x40, 0x00, 0x80, 0x40, 0x00, 0x80, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2600, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x08, 0x08, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x77, 0xF7, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2605, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x7F, 0xFF, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x0F, 0x78, 0x00, 0x1C, 0x1C, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2606, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x7E, 0x3F, 0x00, 0x10, 0x04, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x10, 0x00, 0x09, 0xC8, 0x00, 0x0B, 0x68, 0x00, 0x1C, 0x1C, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x3F, 0xFE, 0x00, 0x7A, 0x2F, 0x00, 0x7B, 0xEF, 0x00, 0x03, 0xE0, 0x00, 0x0F, 0xF8, 0x00, 0x1C, 0x1C, 0x00, 0x38, 0x0E, 0x00, 0x7D, 0x5F, 0x00, 0x7F, 0xFF, 0x00, 0x38, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x30, 0x06, 0x00, 0x46, 0x31, 0x00, 0x7D, 0xDF, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x18, 0x00, 0x13, 0xE4, 0x00, 0x27, 0xF2, 0x00, 0x42, 0xA1, 0x00, 0x47, 0xF1, 0x00, 0x38, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x1F, 0xFE, 0x80, 0x20, 0x02, 0x80, 0x1F, 0xE2, 0x80, 0x02, 0x02, 0x80, 0x01, 0xE2, 0x80, 0x01, 0x02, 0x80, 0x00, 0xE2, 0x80, 0x00, 0x82, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x5F, 0xFE, 0x00, 0x50, 0x01, 0x00, 0x51, 0xFE, 0x00, 0x50, 0x10, 0x00, 0x51, 0xE0, 0x00, 0x50, 0x20, 0x00, 0x51, 0xC0, 0x00, 0x50, 0x40, 0x00, 0x5F, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2639, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x12, 0x12, 0x00, 0x17, 0x3A, 0x00, 0x22, 0x11, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x12, 0x12, 0x00, 0x14, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x08, 0x04, 0x00, 0x12, 0x12, 0x00, 0x17, 0x3A, 0x00, 0x22, 0x11, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x24, 0x09, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x06, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xF8, 0x00, 0x0F, 0xFC, 0x00, 0x1D, 0xEE, 0x00, 0x18, 0xC6, 0x00, 0x3D, 0xEF, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x3B, 0xF7, 0x00, 0x1D, 0xEE, 0x00, 0x1E, 0x1E, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x08, 0x08, 0x00, 0x01, 0xC0, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x74, 0x17, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2640, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2642, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x06, 0xD8, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2660, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x1F, 0xFC, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x1E, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2661, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x11, 0x44, 0x00, 0x20, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2662, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2663, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x03, 0xF0, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0xDE, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0x3F, 0x00, 0x1E, 0xDE, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2664, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x21, 0xC2, 0x00, 0x1E, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2665, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x1F, 0x7C, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x3F, 0xFE, 0x00, 0x1F, 0xFC, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2666, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x0F, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x07, 0xF0, 0x00, 0x03, 0xE0, 0x00, 0x03, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2667, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x1E, 0xDE, 0x00, 0x21, 0xE1, 0x00, 0x20, 0xC1, 0x00, 0x21, 0xE1, 0x00, 0x1E, 0xDE, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2668, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x50, 0x00, 0x02, 0xA0, 0x00, 0x02, 0xA0, 0x00, 0x01, 0x50, 0x00, 0x11, 0x52, 0x00, 0x22, 0xA1, 0x00, 0x20, 0x01, 0x00, 0x18, 0x06, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2669, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x50, 0x00, 0x00, 0x68, 0x00, 0x00, 0x58, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0xD0, 0x00, 0x03, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x06, 0x03, 0x00, 0x1E, 0x0F, 0x00, 0x3E, 0x1F, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x06, 0x06, 0x00, 0x1E, 0x1E, 0x00, 0x3C, 0x3C, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x38, 0x00, 0x02, 0xC4, 0x00, 0x03, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x30, 0x00, 0x02, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x70, 0x00, 0x03, 0xF0, 0x00, 0x03, 0x90, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x70, 0x00, 0x03, 0xF0, 0x00, 0x03, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x1E, 0x00, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x1E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x1E, 0x00, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x00, 0x1E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2800, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2801, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2802, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2803, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2804, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2805, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2806, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2807, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2808, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2809, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x280A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x280B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x280C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x280D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x280E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x280F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2810, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2811, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2812, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2813, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2814, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2815, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2816, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2817, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2818, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2819, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x281A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x281B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x281C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x281D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x281E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x281F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2820, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2821, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2822, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2823, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2824, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2825, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2826, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2827, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2828, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2829, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x282A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x282B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x282C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x282D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x282E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x282F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2830, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2831, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2832, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2833, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2834, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2835, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2836, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2837, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2838, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2839, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x283A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x283B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x283C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x283D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x283E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x283F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2840, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2841, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2842, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2843, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2844, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2845, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2846, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2847, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2848, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2849, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x284A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x284B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x284C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x284D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x284E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x284F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2850, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2851, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2852, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2853, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2854, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2855, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2856, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2857, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2858, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2859, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x285A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x285B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x285C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x285D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x285E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x285F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2860, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2861, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2862, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2863, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2864, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2865, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2866, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2867, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2868, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2869, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x286A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x286B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x286C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x286D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x286E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x286F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2870, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2871, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2872, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2873, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2874, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2875, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2876, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2877, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2878, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2879, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x287A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x287B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x287C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x287D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x287E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x287F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2880, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2881, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2882, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2883, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2884, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2885, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2886, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2887, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2888, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2889, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x288A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x288B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x288C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x288D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x288E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x288F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2890, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2891, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2892, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2893, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2894, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2895, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2896, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2897, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2898, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2899, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x289A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x289B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x289C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x289D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x289E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x289F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x28FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x07, 0x38, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x0E, }}, +{ 0x2FF0, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF1, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF2, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0x84, 0x10, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF3, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x2A, 0xAA, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x2A, 0xAA, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF4, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x15, 0x54, 0x00, 0x80, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x00, 0x80, 0x10, 0x04, 0x00, 0x80, 0x00, 0x80, 0x15, 0x54, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF5, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x8A, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF6, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x8A, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF7, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x8A, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x88, 0x00, 0x80, 0x00, 0x00, 0x00, 0x88, 0x00, 0x80, 0x00, 0x00, 0x00, 0x88, 0x00, 0x80, 0x00, 0x00, 0x00, 0x8A, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF8, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FF9, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xA0, 0x80, 0x00, 0x00, 0x00, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FFA, { 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x00, 0x00, 0x82, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x2FFB, { 0xAA, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xAA, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0x88, 0x08, 0x80, 0x00, 0x00, 0x00, 0xAA, 0xA8, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0A, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x3000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3001, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3002, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3003, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0x00, 0x03, 0x30, 0x00, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3005, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x19, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3006, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x98, 0x00, 0x04, 0xF0, 0x00, 0x08, 0x60, 0x00, 0x08, 0xF0, 0x00, 0x19, 0x98, 0x00, 0x13, 0x00, 0x00, 0x16, 0x00, 0x00, 0x14, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3007, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x1C, 0x00, 0x18, 0x06, 0x00, 0x10, 0x02, 0x00, 0x30, 0x03, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x30, 0x03, 0x00, 0x10, 0x02, 0x00, 0x18, 0x06, 0x00, 0x0E, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3008, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3009, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x300A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0x01, 0x98, 0x00, 0x03, 0x30, 0x00, 0x06, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x19, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x06, 0x60, 0x00, 0x03, 0x30, 0x00, 0x01, 0x98, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x300B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x06, 0x60, 0x00, 0x03, 0x30, 0x00, 0x01, 0x98, 0x00, 0x00, 0xCC, 0x00, 0x01, 0x98, 0x00, 0x03, 0x30, 0x00, 0x06, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x300C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x300D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x300E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0xF0, 0x00, 0x02, 0x80, 0x00, 0x02, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x300F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x50, 0x00, 0x00, 0x50, 0x00, 0x03, 0xD0, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3010, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3011, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3012, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3013, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3014, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3015, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3016, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x84, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3017, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x10, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x10, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x301C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x21, 0x80, 0x80, 0x40, 0x61, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x40, 0x00, 0x1F, 0xE0, 0x00, 0x02, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0E, 0xB0, 0x00, 0x13, 0x18, 0x00, 0x33, 0x18, 0x00, 0x35, 0x18, 0x00, 0x19, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3042, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x80, 0x00, 0x03, 0x20, 0x00, 0x1F, 0xF0, 0x00, 0x02, 0x00, 0x00, 0x02, 0x40, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x4C, 0x00, 0x1A, 0xC6, 0x00, 0x13, 0x86, 0x00, 0x33, 0x06, 0x00, 0x37, 0x06, 0x00, 0x3D, 0x0C, 0x00, 0x11, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, 0x18, 0x20, 0x00, 0x18, 0x10, 0x00, 0x18, 0x18, 0x00, 0x1A, 0x38, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x20, 0x00, 0x20, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x06, 0x00, 0x30, 0x06, 0x00, 0x32, 0x03, 0x00, 0x34, 0x03, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x02, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1F, 0x60, 0x00, 0x0C, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3046, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0xC0, 0x00, 0x09, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x39, 0x80, 0x00, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3048, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0xB0, 0x00, 0x0C, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x38, 0xC4, 0x00, 0x10, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0x90, 0x00, 0x38, 0x00, 0x00, 0x09, 0xF0, 0x00, 0x0F, 0x18, 0x00, 0x1C, 0x18, 0x00, 0x64, 0x18, 0x00, 0x1C, 0x30, 0x00, 0x0C, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x304A, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x1C, 0x00, 0x06, 0x06, 0x00, 0x07, 0xC4, 0x00, 0x3E, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x78, 0x00, 0x05, 0x8C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x3A, 0x06, 0x00, 0x0E, 0x0C, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x304B, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xCC, 0x00, 0x3E, 0x22, 0x00, 0x14, 0x21, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x23, 0x00, 0x08, 0x61, 0x00, 0x18, 0x40, 0x00, 0x12, 0x40, 0x00, 0x31, 0xC0, 0x00, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x304C, { 0x00, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x09, 0x00, 0x06, 0x04, 0x00, 0x06, 0x00, 0x00, 0x07, 0xCC, 0x00, 0x3E, 0x22, 0x00, 0x14, 0x21, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x23, 0x00, 0x08, 0x61, 0x00, 0x18, 0x40, 0x00, 0x12, 0x40, 0x00, 0x31, 0xC0, 0x00, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x304D, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x70, 0x00, 0x1F, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x06, 0x60, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x304E, { 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x03, 0x04, 0x80, 0x01, 0x72, 0x00, 0x1F, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0xE0, 0x00, 0x06, 0x60, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x304F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3050, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x31, 0x00, 0x00, 0x64, 0x80, 0x00, 0xC2, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3051, { 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x18, 0x30, 0x00, 0x18, 0x10, 0x00, 0x10, 0x1A, 0x00, 0x31, 0xFF, 0x00, 0x20, 0x98, 0x00, 0x20, 0x18, 0x00, 0x20, 0x18, 0x00, 0x24, 0x18, 0x00, 0x34, 0x10, 0x00, 0x18, 0x30, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3052, { 0x00, 0x00, 0x00, 0x30, 0x61, 0x00, 0x18, 0x34, 0x80, 0x18, 0x12, 0x00, 0x10, 0x18, 0x00, 0x31, 0xFF, 0x00, 0x20, 0x98, 0x00, 0x20, 0x18, 0x00, 0x20, 0x18, 0x00, 0x24, 0x18, 0x00, 0x34, 0x10, 0x00, 0x18, 0x30, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3053, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3054, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x04, 0x80, 0x03, 0x82, 0x00, 0x00, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3055, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x30, 0x00, 0x01, 0xF8, 0x00, 0x1F, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3056, { 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x03, 0x34, 0x80, 0x01, 0xE2, 0x00, 0x1F, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3057, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x06, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3058, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, 0x08, 0x00, 0x06, 0x24, 0x00, 0x06, 0x10, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x06, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3059, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC6, 0x00, 0x7F, 0xFF, 0x00, 0x30, 0x80, 0x00, 0x07, 0x80, 0x00, 0x08, 0xC0, 0x00, 0x08, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x305A, { 0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0x00, 0xE4, 0x80, 0x00, 0xC2, 0x00, 0x7F, 0xFF, 0x00, 0x30, 0x80, 0x00, 0x07, 0x80, 0x00, 0x08, 0xC0, 0x00, 0x08, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x305B, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x70, 0x00, 0x08, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x18, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x305C, { 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x18, 0x34, 0x80, 0x0C, 0x22, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x78, 0x20, 0x00, 0x28, 0x20, 0x00, 0x08, 0xE0, 0x00, 0x08, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x18, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x305D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x70, 0x00, 0x04, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x02, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x1E, 0x60, 0x00, 0x30, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x305E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x0F, 0x74, 0x80, 0x04, 0xC2, 0x00, 0x01, 0x80, 0x00, 0x02, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x1E, 0x60, 0x00, 0x30, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x305F, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x40, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x18, 0x00, 0x2C, 0x0E, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x80, 0x00, 0x30, 0x80, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3060, { 0x00, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x06, 0x09, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x18, 0x00, 0x2C, 0x0E, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x80, 0x00, 0x30, 0x80, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3061, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x40, 0x00, 0x03, 0xE0, 0x00, 0x3E, 0x00, 0x00, 0x16, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x78, 0x00, 0x05, 0x8C, 0x00, 0x0E, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3062, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x02, 0x00, 0x02, 0x49, 0x00, 0x03, 0xE4, 0x00, 0x3E, 0x00, 0x00, 0x16, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x78, 0x00, 0x05, 0x8C, 0x00, 0x0E, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x18, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3064, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x4F, 0x0C, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x09, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x4F, 0x0C, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3066, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0xF8, 0x00, 0x18, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0xF8, 0x00, 0x18, 0x21, 0x00, 0x00, 0x44, 0x80, 0x00, 0x82, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x70, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3068, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x78, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3069, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03, 0x89, 0x00, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x78, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x306A, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x22, 0x04, 0x00, 0x04, 0x1E, 0x00, 0x08, 0x22, 0x00, 0x18, 0x20, 0x00, 0x30, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x4C, 0x00, 0x07, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x306B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x78, 0x00, 0x11, 0x8C, 0x00, 0x30, 0x10, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x80, 0x00, 0x29, 0x00, 0x00, 0x39, 0x8C, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x306C, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x11, 0xF0, 0x00, 0x13, 0x08, 0x00, 0x15, 0x04, 0x00, 0x19, 0x06, 0x00, 0x1A, 0x06, 0x00, 0x2A, 0x06, 0x00, 0x2C, 0x06, 0x00, 0x44, 0x74, 0x00, 0x4A, 0x9C, 0x00, 0x30, 0x8C, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x306D, { 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7C, 0x78, 0x00, 0x29, 0x8C, 0x00, 0x0A, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x28, 0x74, 0x00, 0x68, 0x9C, 0x00, 0x58, 0x8C, 0x00, 0x08, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x306E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0D, 0x18, 0x00, 0x19, 0x0C, 0x00, 0x11, 0x04, 0x00, 0x21, 0x06, 0x00, 0x23, 0x06, 0x00, 0x22, 0x06, 0x00, 0x26, 0x04, 0x00, 0x34, 0x0C, 0x00, 0x18, 0x38, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x306F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x11, 0xFF, 0x00, 0x30, 0xC8, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x28, 0x0C, 0x00, 0x28, 0xFC, 0x00, 0x39, 0x0E, 0x00, 0x11, 0x1B, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3070, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0x24, 0x80, 0x18, 0x32, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x30, 0xD0, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x28, 0x18, 0x00, 0x28, 0xF8, 0x00, 0x39, 0x1E, 0x00, 0x11, 0x1B, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3071, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x24, 0x80, 0x18, 0x34, 0x80, 0x18, 0x13, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x30, 0xD0, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x28, 0x18, 0x00, 0x28, 0xF8, 0x00, 0x39, 0x1E, 0x00, 0x11, 0x1B, 0x00, 0x10, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3072, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0E, 0x18, 0x00, 0x76, 0x18, 0x00, 0x04, 0x18, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x10, 0x16, 0x00, 0x10, 0x12, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3073, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x14, 0x80, 0x0E, 0x12, 0x00, 0x76, 0x10, 0x00, 0x04, 0x18, 0x00, 0x08, 0x18, 0x00, 0x08, 0x1C, 0x00, 0x10, 0x16, 0x00, 0x10, 0x12, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3074, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x14, 0x80, 0x0E, 0x14, 0x80, 0x76, 0x13, 0x00, 0x04, 0x18, 0x00, 0x08, 0x18, 0x00, 0x08, 0x1C, 0x00, 0x10, 0x16, 0x00, 0x10, 0x12, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0C, 0xC0, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x01, 0xFF, 0x00, 0x4E, 0x61, 0x80, 0x38, 0x61, 0x80, 0x31, 0xE2, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x64, 0x80, 0x00, 0x62, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x01, 0xFF, 0x00, 0x4E, 0x61, 0x80, 0x38, 0x61, 0x80, 0x31, 0xE2, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x64, 0x80, 0x00, 0x64, 0x80, 0x00, 0x83, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x01, 0xFF, 0x00, 0x4E, 0x61, 0x80, 0x38, 0x61, 0x80, 0x31, 0xE2, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x40, 0x00, 0x18, 0x20, 0x00, 0x10, 0x10, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x24, 0x00, 0x06, 0x10, 0x00, 0x09, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x40, 0x00, 0x18, 0x20, 0x00, 0x10, 0x10, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x307A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x12, 0x00, 0x09, 0x12, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x40, 0x00, 0x18, 0x20, 0x00, 0x10, 0x10, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x307B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x19, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0E, 0x00, 0x31, 0xF8, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0xF8, 0x00, 0x39, 0x18, 0x00, 0x11, 0x1C, 0x00, 0x10, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x307C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x19, 0xFD, 0x00, 0x18, 0x20, 0x80, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x31, 0xFC, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0xF0, 0x00, 0x39, 0x38, 0x00, 0x11, 0x34, 0x00, 0x10, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x307D, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x04, 0x80, 0x19, 0xFC, 0x80, 0x18, 0x23, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x31, 0xFC, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0xF0, 0x00, 0x39, 0x30, 0x00, 0x11, 0x3C, 0x00, 0x10, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x307E, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x10, 0xD8, 0x00, 0x0F, 0xF0, 0x00, 0x04, 0x80, 0x00, 0x10, 0xB8, 0x00, 0x0F, 0xF0, 0x00, 0x04, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x08, 0xF0, 0x00, 0x18, 0xDC, 0x00, 0x0F, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x307F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC0, 0x00, 0x0F, 0xE0, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x88, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x0C, 0x00, 0x07, 0xC8, 0x00, 0x1A, 0x38, 0x00, 0x24, 0x1E, 0x00, 0x2C, 0x13, 0x00, 0x38, 0x30, 0x00, 0x10, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3080, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x3E, 0x04, 0x00, 0x14, 0x0A, 0x00, 0x04, 0x09, 0x00, 0x1E, 0x0B, 0x00, 0x26, 0x08, 0x00, 0x26, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x1C, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x10, 0x60, 0x00, 0x13, 0xF0, 0x00, 0x0C, 0x4C, 0x00, 0x18, 0x82, 0x00, 0x2C, 0x83, 0x00, 0x25, 0x03, 0x00, 0x42, 0x03, 0x00, 0x47, 0x03, 0x00, 0x29, 0x06, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3082, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x08, 0x80, 0x00, 0x05, 0x80, 0x00, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x03, 0x88, 0x00, 0x02, 0xC4, 0x00, 0x06, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x0C, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3083, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x10, 0xE0, 0x00, 0x13, 0x10, 0x00, 0x0C, 0x08, 0x00, 0x7C, 0x98, 0x00, 0x26, 0x70, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3084, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x40, 0x00, 0x08, 0x38, 0x00, 0x08, 0xC6, 0x00, 0x05, 0x03, 0x00, 0x0F, 0x23, 0x00, 0x7A, 0x1E, 0x00, 0x21, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3085, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x02, 0x40, 0x00, 0x22, 0x40, 0x00, 0x12, 0xE0, 0x00, 0x13, 0x50, 0x00, 0x26, 0x48, 0x00, 0x2A, 0xC8, 0x00, 0x3A, 0x90, 0x00, 0x11, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3086, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x21, 0x20, 0x00, 0x12, 0x78, 0x00, 0x1B, 0x96, 0x00, 0x12, 0x13, 0x00, 0x16, 0x11, 0x00, 0x25, 0x11, 0x00, 0x29, 0x33, 0x00, 0x38, 0xA6, 0x00, 0x10, 0x78, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3087, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x20, 0x00, 0x01, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x13, 0x70, 0x00, 0x0E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3088, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xE0, 0x00, 0x10, 0xB8, 0x00, 0x11, 0x8C, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3089, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x07, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xE0, 0x00, 0x3C, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x308A, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0xE0, 0x00, 0x05, 0x30, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x04, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x308B, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0xF0, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0xE0, 0x00, 0x07, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x11, 0xC4, 0x00, 0x02, 0x6C, 0x00, 0x02, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x308C, { 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7C, 0x70, 0x00, 0x29, 0x98, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x28, 0x10, 0x00, 0x68, 0x10, 0x80, 0x58, 0x1B, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x308D, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0xF0, 0x00, 0x06, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x07, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x18, 0x02, 0x00, 0x30, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x308E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x0C, 0xE0, 0x00, 0x0B, 0x10, 0x00, 0x1C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x38, 0x18, 0x00, 0x28, 0x30, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x308F, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x00, 0x00, 0x3E, 0x70, 0x00, 0x15, 0x8C, 0x00, 0x06, 0x06, 0x00, 0x04, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x14, 0x06, 0x00, 0x36, 0x04, 0x00, 0x2E, 0x18, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3090, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0F, 0xF0, 0x00, 0x06, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x0C, 0x00, 0x12, 0x02, 0x00, 0x24, 0x01, 0x00, 0x2C, 0x39, 0x00, 0x38, 0x47, 0x00, 0x10, 0x46, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3091, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xE0, 0x00, 0x04, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x08, 0x10, 0x00, 0x03, 0x90, 0x00, 0x06, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x02, 0x00, 0x00, 0x06, 0x1C, 0x00, 0x1D, 0x66, 0x00, 0x30, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3092, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xA0, 0x00, 0x1F, 0xF0, 0x00, 0x09, 0x00, 0x00, 0x03, 0x08, 0x00, 0x02, 0x0C, 0x00, 0x07, 0x98, 0x00, 0x0C, 0xE0, 0x00, 0x10, 0xE0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3093, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x0C, 0x61, 0x00, 0x08, 0x61, 0x00, 0x18, 0x62, 0x00, 0x30, 0x36, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3099, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x309A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x309B, { 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x309C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x309D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x309E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x0C, 0x28, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xF0, 0x00, 0x3F, 0x38, 0x00, 0x18, 0x60, 0x00, 0x02, 0x80, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7E, 0x00, 0x3F, 0x87, 0x00, 0x18, 0x0C, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x19, 0x30, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x30, 0x00, 0x08, 0x30, 0x00, 0x08, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A6, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x8C, 0x00, 0x0F, 0xFE, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1F, 0xF0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x18, 0x00, 0x3F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x83, 0x00, 0x7F, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x80, 0x00, 0x06, 0x80, 0x00, 0x08, 0x80, 0x00, 0x11, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30AA, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0x00, 0x7F, 0xFF, 0x80, 0x30, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0xD0, 0x00, 0x01, 0x90, 0x00, 0x03, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x30, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30AB, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x30, 0xFC, 0x00, 0x1F, 0xC6, 0x00, 0x01, 0x06, 0x00, 0x03, 0x04, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x10, 0x00, 0x10, 0xB0, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30AC, { 0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0x00, 0xC4, 0x80, 0x00, 0x82, 0x00, 0x30, 0xFC, 0x00, 0x1F, 0xC6, 0x00, 0x01, 0x06, 0x00, 0x03, 0x04, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x10, 0x00, 0x10, 0xB0, 0x00, 0x20, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30AD, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x30, 0x00, 0x01, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x3D, 0x8C, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30AE, { 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x03, 0x04, 0x80, 0x03, 0x32, 0x00, 0x01, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x3D, 0x8C, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xE0, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30AF, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B0, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0xC4, 0x80, 0x01, 0x82, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x60, 0x00, 0x20, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B2, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0x04, 0x80, 0x03, 0x02, 0x00, 0x06, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x60, 0x00, 0x20, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B4, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B5, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x0C, 0x30, 0x00, 0x06, 0x22, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xF0, 0x00, 0x24, 0x30, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B6, { 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x34, 0x80, 0x0C, 0x22, 0x00, 0x06, 0x20, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xF0, 0x00, 0x24, 0x30, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x02, 0x00, 0x03, 0x84, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B8, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x84, 0x80, 0x01, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x02, 0x00, 0x03, 0x84, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x0F, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x3C, 0x00, 0x07, 0xDC, 0x00, 0x03, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x98, 0x00, 0x06, 0x0E, 0x00, 0x18, 0x07, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30BA, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x02, 0x00, 0x10, 0x70, 0x00, 0x0F, 0xB8, 0x00, 0x06, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x0E, 0x00, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x7C, 0x00, 0x07, 0xC6, 0x00, 0x7A, 0x0C, 0x00, 0x22, 0x18, 0x00, 0x02, 0x20, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xC6, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30BC, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x04, 0x80, 0x03, 0x02, 0x00, 0x03, 0x00, 0x00, 0x02, 0x7C, 0x00, 0x07, 0xC6, 0x00, 0x7A, 0x0C, 0x00, 0x22, 0x18, 0x00, 0x02, 0x20, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xC6, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x06, 0x18, 0x00, 0x06, 0x10, 0x00, 0x02, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30BE, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x64, 0x80, 0x00, 0x32, 0x00, 0x40, 0x30, 0x00, 0x30, 0x20, 0x00, 0x18, 0x60, 0x00, 0x18, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30BF, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x13, 0x18, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C0, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0xC4, 0x80, 0x01, 0x82, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x13, 0x18, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC6, 0x00, 0x60, 0xFF, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C2, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x14, 0x80, 0x00, 0xE2, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC6, 0x00, 0x60, 0xFF, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x11, 0x98, 0x00, 0x09, 0x98, 0x00, 0x0D, 0x10, 0x00, 0x04, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x21, 0x8C, 0x00, 0x11, 0x8C, 0x00, 0x19, 0x8C, 0x00, 0x19, 0x88, 0x00, 0x08, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C5, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x02, 0x12, 0x00, 0x43, 0x18, 0x00, 0x23, 0x18, 0x00, 0x33, 0x18, 0x00, 0x33, 0x10, 0x00, 0x10, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0xFF, 0x80, 0x30, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C7, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x0F, 0xFA, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0xFF, 0x80, 0x30, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C8, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xB8, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x84, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30C9, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0xC2, 0x00, 0x01, 0x89, 0x00, 0x01, 0x84, 0x00, 0x01, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xB8, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x84, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30CA, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC3, 0x00, 0x40, 0xFF, 0x80, 0x3F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFC, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x0C, 0x20, 0x00, 0x03, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xF0, 0x00, 0x01, 0x18, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30CD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x28, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0x70, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xB0, 0x00, 0x03, 0x8C, 0x00, 0x0C, 0xC6, 0x00, 0x30, 0xC3, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x03, 0x10, 0x00, 0x03, 0x08, 0x00, 0x02, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x04, 0x02, 0x00, 0x08, 0x03, 0x00, 0x18, 0x03, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D0, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00, 0x03, 0x10, 0x00, 0x03, 0x08, 0x00, 0x02, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x04, 0x02, 0x00, 0x08, 0x03, 0x00, 0x18, 0x03, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D1, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x02, 0x23, 0x00, 0x03, 0x10, 0x00, 0x03, 0x08, 0x00, 0x02, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x04, 0x02, 0x00, 0x08, 0x03, 0x00, 0x18, 0x03, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D3, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x04, 0x80, 0x0E, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D4, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x04, 0x80, 0x0E, 0x04, 0x80, 0x0C, 0x03, 0x00, 0x0C, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x0F, 0xEE, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D6, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x40, 0xF2, 0x00, 0x3F, 0xB8, 0x00, 0x1C, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D7, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x40, 0xF4, 0x80, 0x3F, 0xBB, 0x00, 0x1C, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x08, 0x40, 0x00, 0x18, 0x20, 0x00, 0x30, 0x18, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x24, 0x00, 0x06, 0x10, 0x00, 0x05, 0x00, 0x00, 0x0C, 0x80, 0x00, 0x08, 0x40, 0x00, 0x18, 0x20, 0x00, 0x30, 0x18, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x24, 0x00, 0x06, 0x24, 0x00, 0x05, 0x18, 0x00, 0x0C, 0x80, 0x00, 0x08, 0x40, 0x00, 0x18, 0x20, 0x00, 0x30, 0x18, 0x00, 0x60, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30DB, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xCC, 0x00, 0x31, 0xFE, 0x00, 0x1E, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x18, 0xC2, 0x00, 0x32, 0xC2, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30DC, { 0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0x00, 0xE4, 0x80, 0x00, 0xC2, 0x00, 0x00, 0xC0, 0x00, 0x31, 0xFE, 0x00, 0x1E, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x18, 0xC2, 0x00, 0x32, 0xC2, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30DD, { 0x00, 0x00, 0x00, 0x01, 0x83, 0x00, 0x00, 0xE4, 0x80, 0x00, 0xC4, 0x80, 0x00, 0xC3, 0x00, 0x31, 0xFC, 0x00, 0x1E, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x18, 0xC2, 0x00, 0x32, 0xC2, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x61, 0xFE, 0x00, 0x3F, 0x0E, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x02, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30DF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x10, 0x00, 0x03, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x06, 0x00, 0x48, 0x3E, 0x00, 0x3F, 0xC3, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x08, 0x00, 0x01, 0x98, 0x00, 0x00, 0x70, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x00, 0xCC, 0x00, 0x01, 0x04, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x86, 0x00, 0x41, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x19, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0xE0, 0x00, 0x07, 0x30, 0x00, 0x7A, 0x40, 0x00, 0x22, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E4, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1E, 0x00, 0x03, 0xE7, 0x00, 0x7D, 0x0C, 0x00, 0x31, 0x10, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xE0, 0x00, 0x08, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xF8, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x78, 0x00, 0x1F, 0x9C, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x41, 0xFF, 0x00, 0x3F, 0x03, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xF0, 0x00, 0x08, 0x30, 0x00, 0x00, 0x30, 0x00, 0x1F, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xE0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0C, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x1F, 0xFC, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0xFE, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30EA, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x1C, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x18, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x18, 0x81, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8C, 0x00, 0x30, 0x98, 0x00, 0x20, 0xF0, 0x00, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x30, 0x00, 0x08, 0x30, 0x00, 0x08, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1C, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F0, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x0C, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x43, 0x00, 0x7F, 0xFF, 0x80, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x9C, 0x00, 0x0C, 0x30, 0x00, 0x01, 0x40, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x0F, 0xCE, 0x00, 0x06, 0x0E, 0x00, 0x00, 0x0C, 0x00, 0x21, 0xF8, 0x00, 0x1F, 0x18, 0x00, 0x08, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x06, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x27, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F4, { 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x01, 0x89, 0x00, 0x01, 0x84, 0x00, 0x31, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x02, 0x30, 0x00, 0x06, 0x30, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x60, 0x00, 0x08, 0x40, 0x00, 0x12, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x18, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x30FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3106, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x01, 0x88, 0x00, 0x06, 0x08, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3108, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x88, 0x00, 0x10, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x310A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x310B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x310C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x28, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x310D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x310E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x310F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x30, 0x00, 0x04, 0xD0, 0x00, 0x07, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3112, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3114, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x10, 0x00, 0x02, 0x20, 0x00, 0x04, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0x10, 0x00, 0x04, 0x90, 0x00, 0x04, 0x50, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x08, 0x00, 0x01, 0x48, 0x00, 0x01, 0x30, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x311A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x311B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0x80, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x311C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0x80, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x311D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x311E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x311F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3120, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3124, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x40, 0x00, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3125, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x42, 0x00, 0x08, 0x42, 0x00, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3128, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x01, 0x04, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x3C, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x08, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x1C, 0x00, 0x06, 0x36, 0x00, 0x06, 0x67, 0x00, 0x06, 0xC3, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3134, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x0E, 0x38, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3F, 0x00, 0x18, 0x03, 0x00, 0x18, 0x06, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x1E, 0x00, 0x18, 0x33, 0x00, 0x18, 0xE1, 0x80, 0x0F, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x18, 0x7F, 0x00, 0x18, 0x1C, 0x00, 0x18, 0x77, 0x00, 0x18, 0x63, 0x00, 0x19, 0xF7, 0x00, 0x0F, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x0E, 0x38, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0xC0, 0x00, 0x0C, 0xC4, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3139, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x06, 0x04, 0x00, 0x07, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x313A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x19, 0x83, 0x00, 0x01, 0x03, 0x00, 0x3F, 0x83, 0x00, 0x18, 0x03, 0x00, 0x18, 0x03, 0x00, 0x19, 0x83, 0x00, 0x0F, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x313B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x19, 0xB3, 0x00, 0x01, 0x33, 0x00, 0x3F, 0xB3, 0x00, 0x18, 0x33, 0x00, 0x18, 0x32, 0x00, 0x19, 0xB2, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x313C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3F, 0x63, 0x00, 0x1B, 0x33, 0x00, 0x03, 0x33, 0x00, 0x3E, 0x3F, 0x00, 0x18, 0x33, 0x00, 0x18, 0x33, 0x00, 0x19, 0xB3, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x313D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x18, 0x00, 0x1B, 0x0C, 0x00, 0x03, 0x0C, 0x00, 0x3E, 0x0C, 0x00, 0x18, 0x18, 0x00, 0x18, 0x36, 0x00, 0x1B, 0x63, 0x00, 0x0F, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x313E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x1B, 0x30, 0x00, 0x03, 0x30, 0x00, 0x3E, 0x3E, 0x00, 0x18, 0x30, 0x00, 0x18, 0x30, 0x00, 0x19, 0xB2, 0x00, 0x0F, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x313F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x1B, 0x36, 0x00, 0x03, 0x36, 0x00, 0x3E, 0x36, 0x00, 0x18, 0x36, 0x00, 0x18, 0x36, 0x00, 0x1B, 0x14, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3F, 0x0C, 0x00, 0x1B, 0x7F, 0x80, 0x03, 0x20, 0x00, 0x3E, 0x1E, 0x00, 0x18, 0x33, 0x00, 0x18, 0x33, 0x00, 0x1B, 0x33, 0x00, 0x0F, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3143, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x06, 0xCC, 0x00, 0x33, 0x6C, 0x00, 0x1B, 0x6C, 0x00, 0x1F, 0x7C, 0x00, 0x1B, 0x6C, 0x00, 0x1B, 0x6C, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x63, 0x06, 0x00, 0x33, 0x06, 0x00, 0x33, 0x0C, 0x00, 0x3F, 0x1C, 0x00, 0x33, 0x37, 0x00, 0x33, 0x63, 0x80, 0x3F, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xA0, 0x00, 0x03, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x30, 0x00, 0x06, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x1B, 0xC0, 0x00, 0x33, 0x70, 0x00, 0x46, 0x1C, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3147, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x01, 0x98, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x98, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x19, 0x98, 0x00, 0x03, 0x30, 0x00, 0x06, 0x60, 0x00, 0x0E, 0xC0, 0x00, 0x1B, 0xB0, 0x00, 0x33, 0x1C, 0x00, 0x44, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x314A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x0C, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x06, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x18, 0x30, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x314B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x03, 0x18, 0x00, 0x00, 0x18, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x314C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x18, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x314D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x20, 0x00, 0x01, 0x20, 0x00, 0x01, 0x24, 0x00, 0x0F, 0xFE, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x314E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x314F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3150, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x26, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3151, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3152, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x26, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3153, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3154, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x03, 0xF6, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x26, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3155, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3156, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x03, 0xF6, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x03, 0xF6, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x26, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC3, 0x00, 0x3F, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3158, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x0F, 0x00, 0x06, 0x3C, 0x00, 0x3F, 0xCC, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3159, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x33, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x1B, 0x00, 0x0C, 0x1F, 0x00, 0x06, 0x1B, 0x00, 0x06, 0x7B, 0x00, 0x7F, 0x9B, 0x00, 0x30, 0x13, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x315A, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x06, 0x00, 0x03, 0x06, 0x00, 0x03, 0x1E, 0x00, 0x3F, 0xE6, 0x00, 0x18, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x315B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x3F, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x315C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3F, 0xFF, 0x00, 0x18, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x315D, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x3C, 0x00, 0x3F, 0xCC, 0x00, 0x16, 0x0C, 0x00, 0x06, 0x7C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x315E, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x66, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0x36, 0x00, 0x00, 0xF6, 0x00, 0x7F, 0x36, 0x00, 0x2C, 0x36, 0x00, 0x0D, 0xF6, 0x00, 0x0C, 0x36, 0x00, 0x0C, 0x36, 0x00, 0x08, 0x26, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x315F, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1E, 0x00, 0x3F, 0xE6, 0x00, 0x13, 0x06, 0x00, 0x03, 0x06, 0x00, 0x03, 0x06, 0x00, 0x03, 0x06, 0x00, 0x02, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3160, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x13, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x02, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3F, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3162, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1E, 0x00, 0x3F, 0xE6, 0x00, 0x18, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3163, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3164, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0xB1, 0x80, 0x3F, 0x3F, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x7F, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x39, 0xB1, 0x80, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x30, 0x34, 0x00, 0x30, 0x66, 0x00, 0x36, 0xC3, 0x00, 0x1D, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3168, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x00, 0x30, 0x1C, 0x00, 0x30, 0x36, 0x00, 0x30, 0x36, 0x00, 0x30, 0x63, 0x00, 0x30, 0x63, 0x00, 0x3B, 0xC1, 0x80, 0x1E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xEE, 0x00, 0x0C, 0x66, 0x00, 0x0C, 0x66, 0x00, 0x7C, 0x66, 0x00, 0x60, 0x6F, 0x00, 0x60, 0x6D, 0x80, 0x66, 0x59, 0x80, 0x38, 0x51, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x316A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x33, 0x30, 0x00, 0x03, 0x30, 0x00, 0x7E, 0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x33, 0x30, 0x80, 0x1F, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x316B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x46, 0x00, 0x0F, 0x66, 0x00, 0x0F, 0x66, 0x00, 0x7B, 0xE6, 0x00, 0x63, 0x67, 0x00, 0x63, 0x6D, 0x00, 0x67, 0x79, 0x80, 0x3B, 0xF1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x316C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x10, 0x00, 0x36, 0x38, 0x00, 0x06, 0x6C, 0x00, 0x7C, 0x6C, 0x00, 0x60, 0xC6, 0x00, 0x60, 0xC6, 0x00, 0x63, 0x83, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x316D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x33, 0x00, 0x00, 0x03, 0x1C, 0x00, 0x3E, 0x36, 0x00, 0x30, 0x63, 0x00, 0x30, 0x63, 0x00, 0x33, 0x77, 0x00, 0x1C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x316E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x7F, 0x63, 0x00, 0x33, 0x33, 0x00, 0x33, 0x33, 0x00, 0x33, 0x3F, 0x00, 0x33, 0x33, 0x00, 0x33, 0x33, 0x00, 0x32, 0x33, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x316F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0C, 0x00, 0x33, 0x06, 0x00, 0x33, 0x06, 0x00, 0x33, 0x06, 0x00, 0x33, 0x0C, 0x00, 0x33, 0x1A, 0x00, 0x32, 0x31, 0x80, 0x3F, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x08, 0x00, 0x63, 0x0C, 0x00, 0x63, 0x16, 0x00, 0x63, 0x36, 0x00, 0x63, 0x63, 0x00, 0x63, 0x63, 0x00, 0x63, 0xC1, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7F, 0x00, 0x61, 0xB3, 0x00, 0x31, 0x83, 0x00, 0x31, 0x83, 0x00, 0x3F, 0x83, 0x00, 0x31, 0x83, 0x00, 0x31, 0x83, 0x00, 0x3F, 0x83, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x31, 0xB0, 0x00, 0x31, 0xB0, 0x00, 0x3F, 0xB0, 0x00, 0x31, 0xB0, 0x00, 0x31, 0xB0, 0x80, 0x31, 0xBF, 0x00, 0x3F, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3174, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xDF, 0x80, 0x66, 0x6D, 0x80, 0x66, 0x61, 0x80, 0x7E, 0x61, 0x80, 0x66, 0x61, 0x80, 0x66, 0xD1, 0x80, 0x67, 0x99, 0x80, 0x7F, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x9F, 0x80, 0x6C, 0xCC, 0x00, 0x6C, 0xCC, 0x00, 0x7C, 0xCC, 0x00, 0x6C, 0xCC, 0x00, 0x6D, 0xAC, 0x00, 0x6F, 0x3C, 0x80, 0x7E, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3176, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3F, 0x00, 0x63, 0x06, 0x00, 0x33, 0x06, 0x00, 0x3F, 0x0C, 0x00, 0x33, 0x1C, 0x00, 0x33, 0x33, 0x00, 0x33, 0x61, 0x80, 0x3F, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x61, 0x7F, 0x00, 0x31, 0xB0, 0x00, 0x31, 0xB0, 0x00, 0x3F, 0xBF, 0x00, 0x31, 0xB0, 0x00, 0x31, 0xB0, 0x00, 0x31, 0xB3, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3179, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0xC6, 0x00, 0x06, 0x66, 0x00, 0x07, 0xFE, 0x00, 0x06, 0x66, 0x00, 0x06, 0x66, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x03, 0x0C, 0x00, 0x03, 0x0C, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x317A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7F, 0x00, 0x03, 0x33, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x07, 0x03, 0x00, 0x0D, 0x83, 0x00, 0x18, 0xC3, 0x00, 0x20, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x317B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x07, 0x18, 0x00, 0x0C, 0x98, 0x00, 0x18, 0xD9, 0x80, 0x20, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x317C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x7F, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x0E, 0x30, 0x00, 0x1B, 0x30, 0x00, 0x31, 0xB0, 0x80, 0x40, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x317D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x66, 0x00, 0x06, 0x33, 0x00, 0x06, 0x33, 0x00, 0x06, 0x3F, 0x00, 0x0E, 0x33, 0x00, 0x19, 0x33, 0x00, 0x31, 0xB3, 0x00, 0x40, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x317E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x06, 0x03, 0x00, 0x06, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x0E, 0x18, 0x00, 0x1B, 0xB6, 0x00, 0x31, 0xE3, 0x80, 0x40, 0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x317F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3180, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0x1F, 0x00, 0x31, 0xB1, 0x80, 0x31, 0xB1, 0x80, 0x31, 0xB1, 0x80, 0x31, 0xB1, 0x80, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3181, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x0F, 0x06, 0x00, 0x19, 0x8E, 0x00, 0x19, 0x9B, 0x00, 0x19, 0xB1, 0x80, 0x0F, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0x1E, 0x00, 0x33, 0x1E, 0x00, 0x61, 0xB3, 0x00, 0x61, 0xB3, 0x00, 0x33, 0x61, 0x80, 0x1E, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3184, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3185, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x0E, 0x07, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x31, 0xB1, 0x80, 0x31, 0xB1, 0x80, 0x31, 0xB1, 0x80, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3186, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x07, 0x38, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x07, 0x38, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3187, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0x80, 0x03, 0x06, 0x00, 0x19, 0x86, 0x00, 0x0D, 0x87, 0x80, 0x0D, 0x9E, 0x00, 0x3F, 0xE6, 0x00, 0x18, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x19, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x0F, 0x80, 0x03, 0x0D, 0x80, 0x19, 0x8D, 0x80, 0x0D, 0x8F, 0x80, 0x0D, 0xBD, 0x80, 0x3F, 0xCD, 0x80, 0x18, 0x0D, 0x80, 0x00, 0x09, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3189, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x01, 0x83, 0x00, 0x0C, 0xC3, 0x00, 0x06, 0xC3, 0x00, 0x06, 0xCF, 0x00, 0x1F, 0xF3, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x318A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x33, 0x00, 0x7F, 0xC3, 0x00, 0x1B, 0x1F, 0x00, 0x1B, 0x03, 0x00, 0x1B, 0x1F, 0x00, 0x1B, 0x03, 0x00, 0x13, 0x03, 0x00, 0x02, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x318B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x19, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x6D, 0x80, 0x7F, 0x8D, 0x80, 0x1B, 0x7D, 0x80, 0x1B, 0x0D, 0x80, 0x1B, 0x7D, 0x80, 0x1B, 0x0D, 0x80, 0x12, 0x0D, 0x80, 0x00, 0x09, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x318C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1B, 0x00, 0x3F, 0xE3, 0x00, 0x0D, 0x83, 0x00, 0x0D, 0x83, 0x00, 0x0D, 0x83, 0x00, 0x0D, 0x83, 0x00, 0x09, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x318D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x318E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x11, 0x00, 0x10, 0x22, 0x00, 0x10, 0x42, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x14, 0x02, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x14, 0x0A, 0x00, 0x13, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x14, 0x0A, 0x00, 0x13, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x01, 0x00, 0x14, 0x0A, 0x00, 0x13, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3204, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFA, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x12, 0x00, 0x14, 0x0A, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF9, 0x00, 0x22, 0x09, 0x00, 0x12, 0x0A, 0x00, 0x13, 0xFA, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x20, 0x41, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x21, 0x00, 0x22, 0x19, 0x00, 0x14, 0x0A, 0x00, 0x10, 0x02, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x20, 0x11, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x20, 0xA1, 0x00, 0x11, 0x12, 0x00, 0x12, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x10, 0x42, 0x00, 0x13, 0xFA, 0x00, 0x20, 0x11, 0x00, 0x20, 0x21, 0x00, 0x20, 0x61, 0x00, 0x20, 0x91, 0x00, 0x11, 0x0A, 0x00, 0x12, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x320A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFA, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x23, 0xF9, 0x00, 0x20, 0x11, 0x00, 0x10, 0x22, 0x00, 0x10, 0xC2, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x320B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x01, 0x00, 0x14, 0x0A, 0x00, 0x13, 0xF2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x320C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x22, 0x21, 0x00, 0x21, 0x11, 0x00, 0x21, 0x11, 0x00, 0x21, 0x21, 0x00, 0x11, 0x22, 0x00, 0x17, 0xFA, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x320D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x84, 0x00, 0x10, 0x42, 0x00, 0x17, 0xFA, 0x00, 0x20, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x320E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x51, 0x00, 0x20, 0x91, 0x00, 0x20, 0x9D, 0x00, 0x21, 0x11, 0x00, 0x12, 0x12, 0x00, 0x14, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x320F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x14, 0x12, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x13, 0x92, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3210, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x17, 0x92, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x51, 0x00, 0x27, 0xD1, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x13, 0x92, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x24, 0x51, 0x00, 0x24, 0x51, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x91, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x14, 0x52, 0x00, 0x24, 0x51, 0x00, 0x27, 0xD1, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x51, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3214, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x11, 0x12, 0x00, 0x20, 0x91, 0x00, 0x21, 0x91, 0x00, 0x22, 0x5D, 0x00, 0x24, 0x51, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x13, 0x12, 0x00, 0x24, 0x91, 0x00, 0x28, 0x51, 0x00, 0x28, 0x5D, 0x00, 0x24, 0x91, 0x00, 0x13, 0x12, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3216, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x91, 0x00, 0x21, 0x11, 0x00, 0x22, 0x9D, 0x00, 0x24, 0x51, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x10, 0x92, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x91, 0x00, 0x21, 0x11, 0x00, 0x22, 0x9D, 0x00, 0x24, 0x51, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x51, 0x00, 0x27, 0xD1, 0x00, 0x20, 0x9D, 0x00, 0x21, 0x11, 0x00, 0x12, 0x12, 0x00, 0x14, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x24, 0x11, 0x00, 0x27, 0x91, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x13, 0x92, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x321A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x9D, 0x00, 0x22, 0x91, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x321B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x24, 0x00, 0x13, 0x12, 0x00, 0x1F, 0xD2, 0x00, 0x20, 0x11, 0x00, 0x27, 0x91, 0x00, 0x28, 0x5D, 0x00, 0x28, 0x51, 0x00, 0x17, 0x92, 0x00, 0x10, 0x12, 0x00, 0x08, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x321C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x33, 0xF3, 0x00, 0x60, 0xC1, 0x80, 0x61, 0xB1, 0x80, 0x66, 0x19, 0x80, 0x60, 0x01, 0x80, 0x6F, 0xFD, 0x80, 0x60, 0xC1, 0x80, 0x60, 0xC1, 0x80, 0x30, 0xC3, 0x00, 0x18, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x09, 0x00, 0x5F, 0xFD, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3221, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x40, 0x11, 0x00, 0x4F, 0xF9, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x09, 0x00, 0x5F, 0xFD, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x12, 0x00, 0x4F, 0xF9, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x21, 0x00, 0x47, 0xF1, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x40, 0x09, 0x00, 0x5F, 0xFD, 0x00, 0x40, 0x01, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x40, 0x01, 0x00, 0x5F, 0xFD, 0x00, 0x52, 0x25, 0x00, 0x52, 0x25, 0x00, 0x52, 0x25, 0x00, 0x52, 0x25, 0x00, 0x52, 0x25, 0x00, 0x5F, 0xFD, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x12, 0x00, 0x4F, 0xF9, 0x00, 0x41, 0x01, 0x00, 0x41, 0x01, 0x00, 0x41, 0x11, 0x00, 0x4F, 0xF9, 0x00, 0x42, 0x11, 0x00, 0x42, 0x11, 0x00, 0x42, 0x11, 0x00, 0x42, 0x11, 0x00, 0x5F, 0xFD, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x02, 0x00, 0x41, 0x01, 0x00, 0x40, 0x81, 0x00, 0x40, 0x09, 0x00, 0x5F, 0xFD, 0x00, 0x40, 0x01, 0x00, 0x40, 0x01, 0x00, 0x42, 0x21, 0x00, 0x42, 0x11, 0x00, 0x44, 0x09, 0x00, 0x48, 0x09, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3226, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x21, 0x02, 0x00, 0x41, 0x01, 0x00, 0x41, 0x01, 0x00, 0x41, 0x09, 0x00, 0x41, 0x3D, 0x00, 0x41, 0xC1, 0x00, 0x5F, 0x01, 0x00, 0x41, 0x01, 0x00, 0x41, 0x01, 0x00, 0x41, 0x11, 0x00, 0x41, 0x11, 0x00, 0x20, 0xF2, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x42, 0x00, 0x42, 0x41, 0x00, 0x42, 0x41, 0x00, 0x42, 0x41, 0x00, 0x42, 0x41, 0x00, 0x42, 0x41, 0x00, 0x44, 0x21, 0x00, 0x44, 0x11, 0x00, 0x48, 0x0D, 0x00, 0x50, 0x09, 0x00, 0x40, 0x01, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x21, 0x02, 0x00, 0x41, 0x01, 0x00, 0x41, 0x21, 0x00, 0x4F, 0xF1, 0x00, 0x41, 0x21, 0x00, 0x41, 0x21, 0x00, 0x41, 0x21, 0x00, 0x42, 0x21, 0x00, 0x42, 0x25, 0x00, 0x44, 0x25, 0x00, 0x48, 0x1D, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x20, 0x82, 0x00, 0x40, 0x81, 0x00, 0x40, 0x81, 0x00, 0x40, 0x89, 0x00, 0x5F, 0xFD, 0x00, 0x40, 0x81, 0x00, 0x40, 0x81, 0x00, 0x40, 0x81, 0x00, 0x40, 0x81, 0x00, 0x40, 0x81, 0x00, 0x40, 0x81, 0x00, 0x20, 0x02, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x27, 0xF9, 0x00, 0x22, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x11, 0x00, 0x20, 0x21, 0x00, 0x10, 0x42, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x14, 0x02, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x05, 0x00, 0x12, 0x3A, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x22, 0x00, 0x17, 0xF2, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x11, 0x00, 0x11, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x17, 0xF2, 0x00, 0x22, 0x11, 0x00, 0x20, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x22, 0x01, 0x00, 0x12, 0x12, 0x00, 0x11, 0xFA, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x17, 0xF2, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x13, 0xF2, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x22, 0x00, 0x24, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x82, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x21, 0x00, 0x22, 0x11, 0x00, 0x24, 0x11, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x22, 0x11, 0x00, 0x11, 0xE2, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x20, 0x41, 0x00, 0x20, 0x81, 0x00, 0x21, 0x41, 0x00, 0x22, 0x31, 0x00, 0x14, 0x12, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x8C, 0x00, 0x10, 0x42, 0x00, 0x17, 0xFA, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x20, 0xE1, 0x00, 0x21, 0x19, 0x00, 0x12, 0x0A, 0x00, 0x18, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x326A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x11, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x10, 0x42, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x326B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x17, 0xF2, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x01, 0x00, 0x12, 0x12, 0x00, 0x11, 0xFA, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x326C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x326D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0x82, 0x00, 0x10, 0x42, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x22, 0x11, 0x00, 0x12, 0x12, 0x00, 0x11, 0xE2, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x326E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x51, 0x00, 0x20, 0x51, 0x00, 0x20, 0x9D, 0x00, 0x21, 0x11, 0x00, 0x16, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x326F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x1C, 0x00, 0x10, 0x12, 0x00, 0x14, 0x12, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x13, 0x92, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x13, 0x92, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x51, 0x00, 0x27, 0xD1, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x17, 0x92, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x27, 0xD1, 0x00, 0x24, 0x51, 0x00, 0x24, 0x5D, 0x00, 0x27, 0xD1, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x18, 0x92, 0x00, 0x24, 0x51, 0x00, 0x27, 0xD1, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x51, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x11, 0x12, 0x00, 0x21, 0x11, 0x00, 0x23, 0x11, 0x00, 0x24, 0x9D, 0x00, 0x28, 0x51, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x13, 0x92, 0x00, 0x24, 0x51, 0x00, 0x24, 0x51, 0x00, 0x24, 0x5D, 0x00, 0x23, 0x91, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x91, 0x00, 0x21, 0x11, 0x00, 0x22, 0x9D, 0x00, 0x2C, 0x51, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x11, 0x92, 0x00, 0x27, 0xD1, 0x00, 0x20, 0x91, 0x00, 0x21, 0x9D, 0x00, 0x22, 0x51, 0x00, 0x14, 0x52, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x51, 0x00, 0x27, 0xD1, 0x00, 0x20, 0x9D, 0x00, 0x21, 0x11, 0x00, 0x16, 0x12, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x24, 0x11, 0x00, 0x27, 0x91, 0x00, 0x24, 0x1D, 0x00, 0x24, 0x51, 0x00, 0x17, 0x92, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x327A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x9D, 0x00, 0x22, 0x91, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x327B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0C, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x17, 0xD2, 0x00, 0x20, 0x11, 0x00, 0x23, 0x91, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x51, 0x00, 0x13, 0x92, 0x00, 0x10, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x327F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x18, 0x06, 0x00, 0x33, 0x1B, 0x00, 0x23, 0x31, 0x00, 0x63, 0x61, 0x80, 0x63, 0xC0, 0x00, 0x7B, 0xC7, 0x80, 0x03, 0x61, 0x80, 0x63, 0x31, 0x00, 0x33, 0x1B, 0x00, 0x18, 0x06, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3380, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x14, 0x00, 0x10, 0x94, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xBE, 0x00, 0x1F, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0xC1, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3381, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x2E, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x22, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3382, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x04, 0x34, 0x00, 0x08, 0x54, 0x00, 0x08, 0x62, 0x00, 0x10, 0xBE, 0x00, 0x10, 0xC1, 0x00, 0x31, 0x41, 0x00, 0x2E, 0xC1, 0x80, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3383, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x15, 0x14, 0x00, 0x15, 0x22, 0x00, 0x15, 0x3E, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x15, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x00, 0x10, 0x08, 0x00, 0x11, 0x14, 0x00, 0x12, 0x14, 0x00, 0x14, 0x22, 0x00, 0x18, 0x3E, 0x00, 0x14, 0x41, 0x00, 0x12, 0x41, 0x00, 0x39, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3388, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1C, 0xE2, 0x00, 0x22, 0x12, 0x00, 0x20, 0xF2, 0x00, 0x21, 0x12, 0x00, 0x23, 0x12, 0x00, 0x1C, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3389, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x03, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x25, 0x99, 0x00, 0x2A, 0x45, 0x00, 0x32, 0x1D, 0x00, 0x2A, 0x25, 0x00, 0x25, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x338A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x21, 0x40, 0x00, 0x21, 0x7C, 0x00, 0x21, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x338B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x2E, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x338C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x10, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x31, 0x20, 0x00, 0x2E, 0xE0, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x338D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x04, 0x31, 0x00, 0x08, 0x51, 0x00, 0x08, 0x4E, 0x00, 0x10, 0x90, 0x00, 0x10, 0x9E, 0x00, 0x31, 0xA1, 0x00, 0x2E, 0xA1, 0x00, 0x40, 0x5E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x338E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x3E, 0x31, 0x00, 0x15, 0x11, 0x00, 0x15, 0x0E, 0x00, 0x15, 0x10, 0x00, 0x15, 0x1E, 0x00, 0x15, 0x21, 0x00, 0x15, 0xA1, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x338F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x10, 0x0E, 0x00, 0x11, 0x31, 0x00, 0x12, 0x11, 0x00, 0x14, 0x0E, 0x00, 0x18, 0x10, 0x00, 0x14, 0x1E, 0x00, 0x12, 0x21, 0x00, 0x39, 0xA1, 0x00, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x80, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x24, 0x00, 0x11, 0x08, 0x00, 0x11, 0x12, 0x00, 0x3B, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x21, 0x20, 0x00, 0x21, 0x20, 0x00, 0x21, 0x20, 0x00, 0x27, 0xEF, 0x80, 0x29, 0x29, 0x00, 0x31, 0x22, 0x00, 0x29, 0x24, 0x80, 0x67, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x20, 0x00, 0x6D, 0x20, 0x00, 0x55, 0x20, 0x00, 0x55, 0x20, 0x00, 0x45, 0xEF, 0x80, 0x45, 0x29, 0x00, 0x45, 0x22, 0x00, 0x45, 0x24, 0x80, 0x45, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x20, 0x00, 0x45, 0x20, 0x00, 0x41, 0x20, 0x00, 0x41, 0x20, 0x00, 0x41, 0xEF, 0x80, 0x5D, 0x29, 0x00, 0x45, 0x22, 0x00, 0x4D, 0x24, 0x80, 0x35, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x20, 0x00, 0x55, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0xEF, 0x80, 0x11, 0x29, 0x00, 0x11, 0x22, 0x00, 0x11, 0x24, 0x80, 0x39, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x29, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x10, 0x89, 0x00, 0x10, 0x8A, 0x00, 0x31, 0x0C, 0x00, 0x2E, 0xF6, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x00, 0x3D, 0x89, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4C, 0x00, 0x32, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x12, 0x00, 0x01, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x21, 0x12, 0x00, 0x21, 0x14, 0x00, 0x21, 0x18, 0x00, 0x1F, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x12, 0x12, 0x00, 0x14, 0x12, 0x00, 0x18, 0x12, 0x00, 0x14, 0x14, 0x00, 0x12, 0x18, 0x00, 0x39, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x3399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x0E, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x339A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x7C, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x11, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x339B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x08, 0xFC, 0x00, 0x08, 0xAA, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x32, 0x2A, 0x00, 0x2D, 0xEB, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x339C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x339D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7C, 0x00, 0x21, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x21, 0x2A, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x339E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x7C, 0x00, 0x18, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x39, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x339F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x7C, 0x00, 0x21, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x21, 0x2A, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x09, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0xB0, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x06, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x04, 0x80, 0x30, 0x01, 0x00, 0x10, 0x07, 0x80, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x7C, 0x00, 0x18, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x39, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A3, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A4, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7C, 0x00, 0x21, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x21, 0x2A, 0x00, 0x1E, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A5, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x03, 0x00, 0x0F, 0xB0, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x06, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A6, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x80, 0x00, 0x01, 0x00, 0x30, 0x04, 0x80, 0x10, 0x03, 0x00, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x7C, 0x00, 0x18, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x39, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x04, 0x00, 0x15, 0x08, 0x00, 0x15, 0x10, 0x00, 0x15, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x8C, 0x00, 0x01, 0x10, 0x00, 0x02, 0x0C, 0x00, 0x04, 0x02, 0x00, 0x08, 0x12, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x0B, 0x00, 0x15, 0x14, 0x80, 0x15, 0x21, 0x00, 0x15, 0x47, 0x80, 0x00, 0x80, 0x00, 0x01, 0x0C, 0x00, 0x02, 0x10, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x02, 0x00, 0x10, 0x12, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xB8, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xE0, 0x00, 0x21, 0x10, 0x00, 0x21, 0x10, 0x00, 0x21, 0x1E, 0x00, 0x25, 0xE1, 0x00, 0x29, 0x0F, 0x00, 0x31, 0x11, 0x00, 0x29, 0x11, 0x00, 0x25, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xE0, 0x00, 0x6D, 0x10, 0x00, 0x55, 0x10, 0x00, 0x55, 0x1E, 0x00, 0x55, 0xE1, 0x00, 0x45, 0x0F, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xE0, 0x00, 0x45, 0x10, 0x00, 0x45, 0x10, 0x00, 0x41, 0x1E, 0x00, 0x41, 0xE1, 0x00, 0x5D, 0x0F, 0x00, 0x45, 0x11, 0x00, 0x4D, 0x11, 0x00, 0x35, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0xC1, 0x00, 0x11, 0x27, 0x00, 0x10, 0xE9, 0x00, 0x11, 0x31, 0x00, 0x11, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33AE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x5B, 0x08, 0x00, 0x24, 0xBA, 0x00, 0x23, 0xCC, 0x00, 0x24, 0xC8, 0x00, 0x27, 0x78, 0x00, 0x00, 0x20, 0x00, 0x00, 0x46, 0x00, 0x00, 0x88, 0x00, 0x01, 0x06, 0x00, 0x02, 0x11, 0x00, 0x04, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33AF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x56, 0x10, 0x00, 0x29, 0x74, 0x00, 0x27, 0x9B, 0x00, 0x29, 0x94, 0x80, 0x2E, 0xF1, 0x00, 0x00, 0x47, 0x80, 0x00, 0x80, 0x00, 0x01, 0x0C, 0x00, 0x02, 0x10, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x22, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1E, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA0, 0x00, 0x10, 0x9E, 0x00, 0x1F, 0x01, 0x00, 0x10, 0x21, 0x00, 0x10, 0x5E, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x1E, 0x00, 0x11, 0x21, 0x00, 0x11, 0x20, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x01, 0x00, 0x11, 0x21, 0x00, 0x11, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2E, 0x00, 0x08, 0x51, 0x00, 0x08, 0x50, 0x00, 0x10, 0x8E, 0x00, 0x10, 0x81, 0x00, 0x31, 0x21, 0x00, 0x2E, 0xDE, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1E, 0x00, 0x15, 0x21, 0x00, 0x15, 0x20, 0x00, 0x15, 0x1E, 0x00, 0x15, 0x01, 0x00, 0x15, 0x21, 0x00, 0x15, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0x00, 0x00, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x21, 0x44, 0x00, 0x21, 0x44, 0x00, 0x21, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x83, 0x00, 0x00, 0x82, 0x00, 0x5C, 0x82, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x28, 0x00, 0x22, 0x28, 0x00, 0x22, 0x10, 0x00, 0x23, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x41, 0x00, 0x04, 0x41, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x10, 0x94, 0x00, 0x10, 0x94, 0x00, 0x31, 0x08, 0x00, 0x2E, 0xC8, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x14, 0x00, 0x15, 0x14, 0x00, 0x15, 0x08, 0x00, 0x15, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC1, 0x80, 0x10, 0x41, 0x00, 0x11, 0x41, 0x00, 0x12, 0x22, 0x00, 0x14, 0x22, 0x00, 0x18, 0x14, 0x00, 0x14, 0x14, 0x00, 0x12, 0x08, 0x00, 0x39, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xC1, 0x80, 0x1B, 0x41, 0x00, 0x1B, 0x41, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x08, 0x00, 0x3B, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x49, 0x00, 0x10, 0xC9, 0x00, 0x10, 0xC9, 0x00, 0x10, 0xC9, 0x00, 0x1F, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x36, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x41, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x10, 0xC9, 0x00, 0x10, 0xC9, 0x00, 0x31, 0x49, 0x00, 0x2F, 0x36, 0x00, 0x41, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x41, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x15, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x41, 0x00, 0x12, 0x49, 0x00, 0x14, 0x49, 0x00, 0x18, 0x49, 0x00, 0x14, 0x49, 0x00, 0x12, 0x49, 0x00, 0x39, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x1B, 0x41, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x3B, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x38, 0x00, 0x20, 0x44, 0x00, 0x20, 0x82, 0x00, 0x22, 0x82, 0x00, 0x24, 0x82, 0x00, 0x28, 0x44, 0x00, 0x30, 0x28, 0x00, 0x29, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x38, 0x00, 0x36, 0x44, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0x44, 0x00, 0x22, 0x28, 0x00, 0x23, 0x29, 0x00, 0x23, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xEC, 0x00, 0x44, 0x92, 0x00, 0x04, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x44, 0x92, 0x00, 0x44, 0x92, 0x00, 0x3D, 0x92, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0x8F, 0x00, 0x08, 0x51, 0x00, 0x08, 0x51, 0x00, 0x08, 0x51, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x13, 0x46, 0x00, 0x10, 0x40, 0x00, 0x10, 0xC2, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x1C, 0x00, 0x11, 0x24, 0x00, 0x10, 0x44, 0x00, 0x11, 0x44, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x90, 0x00, 0x0F, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x48, 0x00, 0x04, 0x53, 0x00, 0x08, 0x64, 0x80, 0x10, 0x54, 0x80, 0x00, 0x4B, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x10, 0x40, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x18, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x08, 0xA4, 0x00, 0x07, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7C, 0x00, 0x01, 0x42, 0x00, 0x01, 0x42, 0x00, 0x0F, 0x7C, 0x00, 0x11, 0x42, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x23, 0xA1, 0x00, 0x20, 0x91, 0x00, 0x11, 0x8A, 0x00, 0x0E, 0x84, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0x1C, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x9E, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x18, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0x10, 0x00, 0x12, 0x7C, 0x00, 0x14, 0x10, 0x00, 0x18, 0x10, 0x00, 0x14, 0x10, 0x00, 0x12, 0x12, 0x00, 0x39, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xF0, 0x00, 0x04, 0xA8, 0x00, 0x04, 0xA8, 0x00, 0x04, 0xA8, 0x00, 0x04, 0xA8, 0x00, 0x0E, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xCC, 0x00, 0x04, 0x48, 0x00, 0x04, 0x30, 0x00, 0x04, 0x30, 0x00, 0x04, 0x48, 0x00, 0x0E, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x7C, 0x72, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEC, 0x00, 0x42, 0x92, 0x00, 0x42, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x40, 0x92, 0x00, 0x40, 0x92, 0x00, 0x44, 0x92, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x26, 0x00, 0x08, 0x19, 0x00, 0x07, 0x10, 0x00, 0x00, 0x90, 0x00, 0x10, 0x90, 0x00, 0x2F, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0x22, 0x00, 0x00, 0xA2, 0x00, 0x00, 0xA2, 0x00, 0x10, 0x94, 0x00, 0x2F, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x33DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xE0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x0A, 0xA0, 0x00, 0x0A, 0xBC, 0x00, 0x0A, 0xA2, 0x00, 0x05, 0x22, 0x00, 0x05, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E03, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x03, 0x80, 0x02, 0x3C, 0x00, 0x07, 0xC0, 0x00, 0x3A, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x08, 0x02, 0x00, 0x10, 0x04, 0x00, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E08, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x05, 0x20, 0x00, 0x09, 0x20, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E0A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x48, 0x00, 0x02, 0x44, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x40, 0x80, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E0E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x06, 0x82, 0x00, 0x03, 0x82, 0x00, 0x01, 0x02, 0x00, 0x03, 0x82, 0x00, 0x02, 0xC2, 0x00, 0x06, 0x46, 0x00, 0x0C, 0x04, 0x00, 0x18, 0x04, 0x00, 0x70, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E13, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x03, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xD0, 0x00, 0x01, 0x48, 0x00, 0x02, 0x44, 0x00, 0x0C, 0x42, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E16, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E17, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E18, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x11, 0x00, 0x12, 0x09, 0x00, 0x1C, 0x05, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E1A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x22, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x30, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x04, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x09, 0x48, 0x00, 0x10, 0xC4, 0x00, 0x20, 0x87, 0x00, 0x41, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E1C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x04, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x8C, 0x00, 0x22, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E1D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x11, 0x22, 0x00, 0x3F, 0x7E, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x61, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x64, 0x00, 0x01, 0x68, 0x00, 0x02, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x48, 0x00, 0x08, 0x44, 0x00, 0x10, 0x42, 0x00, 0x23, 0x81, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0x08, 0x00, 0x02, 0x0C, 0x00, 0x06, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x0F, 0xC2, 0x00, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E22, { 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x25, 0x29, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x28, 0x41, 0x00, 0x28, 0x81, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E25, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x09, 0x24, 0x00, 0x05, 0x28, 0x00, 0x01, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E26, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x32, 0x13, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E27, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x06, 0x98, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x09, 0x10, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x18, 0x00, 0x0C, 0x07, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E2A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E2C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x14, 0x00, 0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E2D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xE8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x0D, 0x00, 0x02, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E2F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E30, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E31, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E32, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E34, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFF, 0x00, 0x29, 0x00, 0x00, 0x2A, 0x40, 0x00, 0x2C, 0x30, 0x00, 0x28, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E35, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x38, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E38, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x02, 0x84, 0x00, 0x01, 0x84, 0x00, 0x00, 0xC4, 0x00, 0x00, 0xA4, 0x00, 0x01, 0x14, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x80, 0x04, 0x04, 0x80, 0x08, 0x07, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E3A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x06, 0x40, 0x00, 0x02, 0x40, 0x00, 0x00, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x01, 0x42, 0x00, 0x02, 0x32, 0x00, 0x04, 0x12, 0x00, 0x08, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E3B, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E3C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x05, 0x88, 0x00, 0x04, 0xC8, 0x00, 0x04, 0x48, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x70, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E3D, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x7E, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x19, 0x64, 0x00, 0x15, 0x54, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x15, 0x54, 0x00, 0x12, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E3E, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x90, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x17, 0xF7, 0x00, 0x60, 0x82, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E3F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x12, 0x00, 0x00, 0x33, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x24, 0x04, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x1F, 0x80, 0x01, 0x10, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x03, 0x98, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x00, 0x01, 0x98, 0x00, 0x13, 0x00, 0x00, 0x12, 0x00, 0x00, 0x16, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E45, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x06, 0x00, 0x0C, 0x01, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E47, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x83, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E48, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x40, 0x00, 0x10, 0x80, 0x00, 0x20, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x10, 0x84, 0x00, 0x10, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x30, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x07, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E4B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E4C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E4D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x20, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E4E, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E4F, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x13, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E50, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x88, 0x00, 0x08, 0x84, 0x00, 0x10, 0x86, 0x00, 0x22, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E51, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x18, 0x82, 0x00, 0x30, 0x86, 0x00, 0x60, 0xAC, 0x00, 0x00, 0xB0, 0x00, 0x08, 0x98, 0x00, 0x18, 0x8C, 0x00, 0x30, 0x86, 0x00, 0x60, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E52, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E53, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E54, { 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0x28, 0x00, 0x1A, 0x27, 0x00, 0x62, 0x22, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E55, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x21, 0x00, 0x24, 0x21, 0x00, 0x64, 0x21, 0x00, 0x04, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E56, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x49, 0x80, 0x3E, 0x4E, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x0E, 0x48, 0x80, 0x32, 0x48, 0x80, 0x02, 0x4F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E57, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E58, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x3E, 0x4B, 0x80, 0x02, 0x4C, 0x00, 0x0E, 0x48, 0x80, 0x32, 0x6F, 0x80, 0x02, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x01, 0x80, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x80, 0x20, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E5A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x01, 0x00, 0x0C, 0x03, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E5C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x07, 0x00, 0x04, 0x3D, 0x00, 0x05, 0xE1, 0x00, 0x07, 0x01, 0x00, 0x7C, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x07, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x80, 0x06, 0x01, 0x80, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E5D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x80, 0x08, 0x08, 0x80, 0x10, 0x0F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E5E, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E5F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x8E, 0x00, 0x08, 0xF2, 0x00, 0x0B, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x12, 0x00, 0x00, 0x62, 0x00, 0x01, 0x82, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x22, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E61, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E62, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x7F, 0x20, 0x80, 0x00, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E63, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x61, 0x10, 0x00, 0x33, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x90, 0x00, 0x10, 0x90, 0x00, 0x3F, 0xD0, 0x80, 0x60, 0x59, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E66, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x00, 0x83, 0x00, 0x1F, 0xF9, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E68, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x90, 0x00, 0x30, 0x90, 0x00, 0x27, 0xD0, 0x00, 0x7C, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x20, 0x90, 0x00, 0x20, 0x90, 0x80, 0x20, 0x99, 0x80, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E69, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xD0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x40, 0x90, 0x00, 0x40, 0x90, 0x00, 0x40, 0x90, 0x00, 0x40, 0x90, 0x80, 0x40, 0x99, 0x80, 0x7F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E6B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x91, 0x00, 0x04, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x11, 0x9F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x78, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x20, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x38, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x04, 0x44, 0x00, 0x03, 0x40, 0x00, 0x01, 0x40, 0x00, 0x10, 0x40, 0x00, 0x0C, 0x80, 0x00, 0x04, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0x60, 0x00, 0x02, 0x18, 0x00, 0x04, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E71, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x07, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x20, 0x90, 0x00, 0x20, 0x90, 0x80, 0x20, 0x99, 0x80, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E73, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x1C, 0x90, 0x00, 0x12, 0x50, 0x00, 0x21, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0xD0, 0x00, 0x07, 0x10, 0x00, 0x3A, 0x10, 0x00, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x1F, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E74, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x0E, 0x44, 0x00, 0x78, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x19, 0x84, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x01, 0x00, 0x0C, 0x03, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E75, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x20, 0x90, 0x00, 0x31, 0x90, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x80, 0x04, 0x19, 0x80, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E76, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, 0x00, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E77, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0xA4, 0x00, 0x01, 0x22, 0x00, 0x22, 0x21, 0x00, 0x10, 0x20, 0x00, 0x00, 0x21, 0x00, 0x08, 0x66, 0x00, 0x10, 0x18, 0x00, 0x20, 0x60, 0x00, 0x03, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x80, 0x30, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E79, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x80, 0x04, 0x10, 0x80, 0x04, 0x19, 0x80, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E7E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x40, 0x00, 0x3F, 0x80, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xC0, 0x80, 0x04, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E7F, { 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x29, 0x20, 0x00, 0x44, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x22, 0x20, 0x00, 0x14, 0x20, 0x00, 0x08, 0x20, 0x00, 0x11, 0x20, 0x00, 0x7F, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x2A, 0x20, 0x80, 0x6B, 0x20, 0x80, 0x49, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E80, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x68, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x80, 0x00, 0x80, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E82, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x1C, 0x90, 0x00, 0x12, 0x50, 0x00, 0x11, 0x10, 0x00, 0x20, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x09, 0x10, 0x00, 0x06, 0x10, 0x00, 0x3F, 0xD0, 0x00, 0x24, 0x50, 0x00, 0x29, 0x50, 0x00, 0x33, 0xD0, 0x00, 0x3C, 0xD0, 0x80, 0x20, 0x50, 0x80, 0x20, 0x50, 0x80, 0x20, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4E85, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x03, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x00, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E89, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x30, 0x00, 0x18, 0x60, 0x00, 0x70, 0xC0, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E8A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E8B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E8F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0x0F, 0x00, 0x11, 0xF0, 0x80, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E93, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E95, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E97, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x06, 0xC8, 0x00, 0x04, 0x68, 0x00, 0x04, 0x08, 0x00, 0x05, 0x98, 0x00, 0x0C, 0xD0, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E9A, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x22, 0x24, 0x00, 0x12, 0x26, 0x00, 0x12, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x30, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E9B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x12, 0x11, 0x80, 0x13, 0xD6, 0x00, 0x12, 0x18, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x80, 0x13, 0xDF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E9D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x10, 0x08, 0x00, 0x22, 0x11, 0x00, 0x7F, 0x3F, 0x80, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4E9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x51, 0x00, 0x22, 0x5B, 0x00, 0x22, 0x4E, 0x00, 0x22, 0x44, 0x00, 0x3E, 0xCE, 0x00, 0x00, 0x9B, 0x00, 0x03, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x08, 0x0F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x0A, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EA5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x48, 0x00, 0x04, 0x88, 0x00, 0x03, 0x12, 0x00, 0x01, 0x22, 0x00, 0x00, 0xC4, 0x00, 0x01, 0x08, 0x00, 0x06, 0x18, 0x00, 0x18, 0x24, 0x00, 0x00, 0xC2, 0x00, 0x03, 0x01, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x05, 0x14, 0x00, 0x05, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x12, 0x10, 0x80, 0x22, 0x10, 0x80, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x01, 0x08, 0x00, 0x01, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EA9, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EAB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EAC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EAD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EAE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EAF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EB0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EB2, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x8C, 0x00, 0x10, 0x86, 0x00, 0x22, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EB3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0xF9, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EB5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x7E, 0x00, 0x04, 0x24, 0x00, 0x07, 0x64, 0x00, 0x3C, 0x54, 0x00, 0x04, 0x85, 0x00, 0x0D, 0x03, 0x00, 0x00, 0x88, 0x00, 0x01, 0x50, 0x00, 0x06, 0x20, 0x00, 0x0A, 0x98, 0x00, 0x33, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EB6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFA, 0x00, 0x0A, 0x0A, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EB9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3B, 0xF7, 0x00, 0x22, 0x11, 0x00, 0x3B, 0xD7, 0x00, 0x22, 0x51, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EBA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EBB, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x14, 0x00, 0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EBF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x18, 0x20, 0x00, 0x28, 0x40, 0x00, 0x48, 0x80, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC2, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x21, 0x00, 0x30, 0x21, 0x00, 0x50, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x61, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0xC1, 0x00, 0x10, 0x83, 0x00, 0x11, 0x82, 0x00, 0x13, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC3, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x38, 0x08, 0x00, 0x68, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x21, 0x04, 0x00, 0x22, 0x02, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EC5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x28, 0x84, 0x00, 0x48, 0x84, 0x00, 0x08, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x83, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x38, 0x1C, 0x00, 0x68, 0x17, 0x00, 0x08, 0x11, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC7, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1B, 0xFC, 0x00, 0x18, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0x84, 0x80, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EC9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0x88, 0x00, 0x28, 0x88, 0x00, 0x48, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x0A, 0x07, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ECA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ECB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ECD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x18, 0x4F, 0x80, 0x28, 0x48, 0x80, 0x28, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x09, 0x01, 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ECE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0A, 0x1C, 0x00, 0x0B, 0x14, 0x00, 0x19, 0x14, 0x00, 0x11, 0xB6, 0x00, 0x30, 0xA2, 0x00, 0x60, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4ECF, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x60, 0x00, 0x10, 0x40, 0x00, 0x30, 0x40, 0x00, 0x50, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x83, 0x00, 0x10, 0x81, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xF1, 0x80, 0x13, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4ED0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x0F, 0x00, 0x64, 0x12, 0x00, 0x04, 0x30, 0x00, 0x04, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0F, 0x00, 0x67, 0xF2, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x50, 0x00, 0x04, 0x20, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x04, 0x00, 0x18, 0x18, 0x00, 0x18, 0x10, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x13, 0x00, 0x19, 0x15, 0x00, 0x19, 0x39, 0x00, 0x29, 0xD1, 0x00, 0x2F, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x17, 0x00, 0x09, 0x10, 0x00, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED7, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x29, 0x10, 0x00, 0x29, 0x10, 0x00, 0x0A, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x50, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4ED8, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x04, 0x00, 0x28, 0x04, 0x00, 0x28, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4ED9, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x19, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EDA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EDB, { 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x02, 0x1E, 0x00, 0x06, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x19, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EDD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x06, 0x00, 0x0C, 0x01, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EDE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x21, 0x00, 0x08, 0x21, 0x00, 0x18, 0x21, 0x00, 0x10, 0xA1, 0x00, 0x30, 0xA1, 0x00, 0x51, 0xA1, 0x00, 0x11, 0x21, 0x00, 0x10, 0x61, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0xC3, 0x00, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x13, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EDF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EE0, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x7F, 0x00, 0x06, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x68, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EE1, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x80, 0x00, 0x11, 0x80, 0x00, 0x33, 0x7E, 0x00, 0x50, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x30, 0x00, 0x10, 0x60, 0x00, 0x10, 0xC0, 0x00, 0x11, 0x80, 0x00, 0x11, 0x00, 0x80, 0x11, 0x81, 0x80, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EE2, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x06, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0xC1, 0x00, 0x08, 0x81, 0x00, 0x19, 0x81, 0x00, 0x38, 0x31, 0x00, 0x68, 0x19, 0x00, 0x08, 0x09, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EE3, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x48, 0x00, 0x08, 0x44, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x28, 0x40, 0x00, 0x28, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x80, 0x08, 0x06, 0x80, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EE4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x1C, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EE5, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x0A, 0x00, 0x10, 0xD2, 0x00, 0x17, 0x22, 0x00, 0x38, 0x41, 0x00, 0x00, 0x81, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EE8, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x7E, 0x00, 0x68, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EEA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x32, 0x00, 0x09, 0x12, 0x00, 0x09, 0x02, 0x00, 0x19, 0x04, 0x00, 0x28, 0x84, 0x00, 0x48, 0x88, 0x00, 0x08, 0x48, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EEB, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x28, 0x00, 0x14, 0x48, 0x00, 0x24, 0x90, 0x00, 0x05, 0x10, 0x00, 0x06, 0x20, 0x00, 0x04, 0x40, 0x00, 0x04, 0x84, 0x00, 0x05, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EEC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x02, 0x00, 0x08, 0xBF, 0x00, 0x12, 0x42, 0x00, 0x12, 0x02, 0x00, 0x32, 0x02, 0x00, 0x52, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EED, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x22, 0x00, 0x18, 0x22, 0x00, 0x11, 0x22, 0x00, 0x31, 0xA2, 0x00, 0x50, 0xE2, 0x00, 0x10, 0x62, 0x00, 0x10, 0x72, 0x00, 0x10, 0x5A, 0x00, 0x10, 0x4E, 0x00, 0x10, 0xC7, 0x00, 0x10, 0x85, 0x80, 0x11, 0x84, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EEE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x31, 0x42, 0x00, 0x51, 0x46, 0x00, 0x11, 0x64, 0x00, 0x11, 0x2C, 0x00, 0x11, 0x38, 0x00, 0x13, 0x10, 0x00, 0x12, 0x38, 0x00, 0x16, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4EEF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x92, 0x00, 0x18, 0x92, 0x00, 0x11, 0x93, 0x00, 0x31, 0x11, 0x00, 0x53, 0x11, 0x80, 0x10, 0x12, 0x00, 0x10, 0x72, 0x00, 0x10, 0x06, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x30, 0x00, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF0, { 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x05, 0x8F, 0x80, 0x09, 0x08, 0x80, 0x09, 0x08, 0x80, 0x19, 0x08, 0x80, 0x19, 0x08, 0x80, 0x29, 0x08, 0x80, 0x29, 0x08, 0x80, 0x09, 0x08, 0x80, 0x09, 0x08, 0x80, 0x09, 0x78, 0x80, 0x0B, 0x8F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF1, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x33, 0x7D, 0x80, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF2, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x1A, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF3, { 0x00, 0x00, 0x00, 0x02, 0x88, 0x00, 0x02, 0x88, 0x00, 0x06, 0x88, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x88, 0x80, 0x08, 0x89, 0x80, 0x18, 0xEF, 0x00, 0x38, 0x88, 0x00, 0x68, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x80, 0x08, 0xED, 0x80, 0x0B, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF5, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x48, 0x00, 0x08, 0xC8, 0x00, 0x18, 0x08, 0x00, 0x38, 0x08, 0x00, 0x68, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x90, 0x00, 0x18, 0xFF, 0x00, 0x19, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EF7, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x18, 0x82, 0x00, 0x19, 0x01, 0x00, 0x2A, 0x00, 0x80, 0x28, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EFB, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x04, 0x38, 0x00, 0x09, 0xD0, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EFD, { 0x00, 0x00, 0x00, 0x04, 0x1C, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x18, 0x82, 0x00, 0x11, 0x83, 0x00, 0x33, 0x01, 0x80, 0x50, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x62, 0x00, 0x10, 0x42, 0x00, 0x10, 0x86, 0x00, 0x11, 0x84, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EFE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x10, 0xFC, 0x00, 0x30, 0x84, 0x00, 0x50, 0x84, 0x00, 0x11, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4EFF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0xFF, 0x80, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x38, 0x3F, 0x00, 0x68, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x61, 0x00, 0x08, 0x43, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F00, { 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x02, 0x04, 0x00, 0x06, 0x26, 0x00, 0x04, 0x62, 0x00, 0x0C, 0x43, 0x00, 0x08, 0xC1, 0x00, 0x18, 0x91, 0x80, 0x39, 0x90, 0x00, 0x68, 0x10, 0x00, 0x08, 0x30, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x43, 0x00, 0x08, 0xC1, 0x00, 0x08, 0x8F, 0x00, 0x09, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F01, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F02, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F03, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x06, 0x02, 0x00, 0x04, 0x64, 0x00, 0x0C, 0x38, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x38, 0x10, 0x80, 0x68, 0x11, 0x00, 0x08, 0x12, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F08, { 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x04, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x08, 0x00, 0x18, 0x40, 0x00, 0x10, 0x40, 0x00, 0x30, 0x40, 0x00, 0x50, 0x40, 0x00, 0x11, 0x43, 0x00, 0x11, 0x41, 0x00, 0x13, 0x41, 0x80, 0x12, 0x40, 0x80, 0x16, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x66, 0x00, 0x10, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F09, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x28, 0x7C, 0x00, 0x28, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x80, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F0A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x18, 0x22, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F0B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x18, 0x84, 0x00, 0x18, 0xFF, 0x00, 0x28, 0xC1, 0x00, 0x28, 0xC2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x14, 0x00, 0x09, 0x22, 0x00, 0x0A, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F0C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x06, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0C, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x18, 0xA2, 0x00, 0x38, 0xA2, 0x00, 0x68, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA6, 0x00, 0x08, 0xA0, 0x00, 0x09, 0xA0, 0x00, 0x09, 0x20, 0x80, 0x0B, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F0D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x18, 0x20, 0x00, 0x28, 0x20, 0x00, 0x2B, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F0E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0x82, 0x00, 0x08, 0x42, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F0F, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x08, 0x22, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x28, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x09, 0x02, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F10, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x08, 0x22, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x28, 0x21, 0x00, 0x28, 0x21, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x80, 0x08, 0xC6, 0x80, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F11, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x38, 0x00, 0x28, 0x38, 0x00, 0x28, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F12, { 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x02, 0x0E, 0x00, 0x06, 0xF8, 0x00, 0x04, 0x80, 0x00, 0x0C, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x84, 0x00, 0x38, 0x84, 0x00, 0x68, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F15, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x68, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F16, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x05, 0xFF, 0x80, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x7E, 0x00, 0x38, 0x42, 0x00, 0x68, 0x42, 0x00, 0x08, 0xE6, 0x00, 0x08, 0xA4, 0x00, 0x09, 0xBC, 0x00, 0x0B, 0x18, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x66, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F17, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x74, 0x0B, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x0A, 0x14, 0x00, 0x1B, 0x36, 0x00, 0x31, 0xE3, 0x00, 0x60, 0xC1, 0x80, 0x40, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F18, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x42, 0x00, 0x3F, 0xFF, 0x00, 0x50, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x14, 0x1F, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F19, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x11, 0x00, 0x04, 0x91, 0x00, 0x0C, 0x93, 0x00, 0x08, 0x92, 0x00, 0x19, 0x96, 0x00, 0x39, 0x10, 0x00, 0x68, 0x38, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F1A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x04, 0x7C, 0x00, 0x0F, 0xC6, 0x00, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F1B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x09, 0x04, 0x00, 0x19, 0x44, 0x00, 0x29, 0x28, 0x00, 0x49, 0x28, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x28, 0x00, 0x09, 0x44, 0x00, 0x09, 0x84, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F1C, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0D, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xC4, 0x80, 0x31, 0x84, 0x80, 0x53, 0x03, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F1D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x86, 0x00, 0x10, 0x82, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xF1, 0x80, 0x13, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F1E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x87, 0x00, 0x68, 0x8A, 0x00, 0x06, 0x98, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F1F, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x18, 0x24, 0x00, 0x2B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x24, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F20, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x18, 0x22, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F22, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8A, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x18, 0x00, 0x08, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0x48, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F24, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x05, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x28, 0x44, 0x00, 0x4B, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F25, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x84, 0x00, 0x04, 0x88, 0x00, 0x08, 0x90, 0x00, 0x08, 0xA0, 0x00, 0x18, 0xC0, 0x00, 0x28, 0x82, 0x00, 0x4F, 0xFF, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x90, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA3, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F26, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x19, 0x04, 0x00, 0x2A, 0x07, 0x00, 0x4C, 0x82, 0x00, 0x08, 0x88, 0x00, 0x08, 0x98, 0x00, 0x08, 0xE0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F27, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x19, 0x07, 0x00, 0x2A, 0x02, 0x00, 0x4C, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F2A, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x05, 0x20, 0x00, 0x04, 0xA0, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x22, 0x00, 0x28, 0x22, 0x00, 0x48, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x52, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x82, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x14, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F2B, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x1A, 0x04, 0x00, 0x28, 0x00, 0x00, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F2E, { 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x3F, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x11, 0x00, 0x1B, 0xD1, 0x00, 0x11, 0x5B, 0x00, 0x31, 0x4A, 0x00, 0x51, 0x4A, 0x00, 0x13, 0x4E, 0x00, 0x12, 0x44, 0x00, 0x12, 0xC4, 0x00, 0x13, 0x8E, 0x00, 0x10, 0x8A, 0x00, 0x11, 0xDB, 0x00, 0x11, 0x51, 0x00, 0x13, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F2F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x19, 0x01, 0x00, 0x29, 0x01, 0x00, 0x29, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F30, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x50, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F31, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x11, 0x93, 0x00, 0x33, 0x11, 0x80, 0x50, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x11, 0x11, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F32, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x05, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x49, 0x40, 0x00, 0x09, 0x44, 0x00, 0x09, 0x4C, 0x00, 0x09, 0x50, 0x00, 0x09, 0x60, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0x3F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F33, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x24, 0x00, 0x0D, 0x24, 0x00, 0x09, 0x24, 0x00, 0x19, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x31, 0x24, 0x00, 0x51, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x3C, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F34, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F35, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0D, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x19, 0x24, 0x80, 0x11, 0x24, 0x80, 0x31, 0x24, 0x80, 0x51, 0x24, 0x80, 0x11, 0x64, 0x80, 0x11, 0x47, 0x80, 0x11, 0xC0, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F36, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x19, 0x01, 0x00, 0x1A, 0x00, 0x80, 0x29, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x46, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F37, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x39, 0x11, 0x00, 0x69, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F38, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x19, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F39, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x06, 0x82, 0x00, 0x04, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x38, 0x82, 0x00, 0x68, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F3A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x18, 0x00, 0x80, 0x19, 0xFE, 0x80, 0x28, 0x00, 0x80, 0x28, 0x00, 0x80, 0x08, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x08, 0x84, 0x80, 0x08, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F3B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x54, 0x00, 0x18, 0xD6, 0x00, 0x10, 0x92, 0x00, 0x30, 0x92, 0x00, 0x50, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F3C, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x92, 0x00, 0x18, 0x8A, 0x00, 0x18, 0x82, 0x00, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFA, 0x00, 0x0F, 0x02, 0x00, 0x08, 0x05, 0x00, 0x08, 0x18, 0x80, 0x08, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F3D, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0B, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x18, 0x94, 0x80, 0x18, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x09, 0x14, 0x80, 0x09, 0x14, 0x80, 0x09, 0x67, 0x80, 0x0A, 0x04, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F3E, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x10, 0x00, 0x18, 0x34, 0x00, 0x38, 0x76, 0x00, 0x68, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F40, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x51, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F42, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x90, 0x00, 0x10, 0x90, 0x00, 0x30, 0x9F, 0x00, 0x50, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F43, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x19, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F46, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F47, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F48, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x90, 0x00, 0x19, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2D, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x13, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F49, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x38, 0x10, 0x00, 0x6B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x62, 0x00, 0x08, 0x42, 0x00, 0x08, 0x5F, 0x00, 0x08, 0xF1, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F4B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x21, 0x00, 0x08, 0x21, 0x00, 0x18, 0x61, 0x00, 0x10, 0x43, 0x00, 0x30, 0xC2, 0x00, 0x51, 0x8E, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F4C, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x45, 0x80, 0x12, 0x77, 0x00, 0x32, 0x44, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x74, 0x80, 0x13, 0xC6, 0x80, 0x16, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F4D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x29, 0x01, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x42, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F4E, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x05, 0xF0, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x10, 0x00, 0x19, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x08, 0x00, 0x09, 0xF8, 0x80, 0x0F, 0x04, 0x80, 0x08, 0x02, 0x80, 0x09, 0xFD, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F4F, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F50, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x40, 0x00, 0x18, 0x40, 0x00, 0x28, 0x80, 0x00, 0x28, 0x80, 0x00, 0x09, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F51, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x18, 0x80, 0x00, 0x28, 0x80, 0x00, 0x29, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F52, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x22, 0x00, 0x11, 0x22, 0x00, 0x31, 0x22, 0x00, 0x51, 0x22, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x10, 0x58, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x8C, 0x00, 0x11, 0x86, 0x00, 0x13, 0x03, 0x00, 0x16, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F53, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x10, 0xA8, 0x00, 0x30, 0xA8, 0x00, 0x50, 0xAC, 0x00, 0x11, 0xA4, 0x00, 0x11, 0x26, 0x00, 0x11, 0x22, 0x00, 0x13, 0x23, 0x00, 0x16, 0xFD, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F54, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x38, 0x10, 0x00, 0x68, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F55, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x18, 0x02, 0x00, 0x29, 0xF2, 0x00, 0x29, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F56, { 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x04, 0x30, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x10, 0x46, 0x00, 0x30, 0x44, 0x00, 0x51, 0x4C, 0x00, 0x11, 0x4B, 0x00, 0x11, 0x59, 0x80, 0x13, 0x70, 0x80, 0x12, 0x60, 0x00, 0x10, 0x40, 0x00, 0x11, 0xC1, 0x00, 0x17, 0x63, 0x00, 0x10, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F57, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x12, 0x00, 0x80, 0x30, 0x40, 0x00, 0x50, 0x43, 0x00, 0x10, 0x4E, 0x00, 0x10, 0x78, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x80, 0x10, 0x61, 0x80, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F58, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x18, 0x86, 0x00, 0x30, 0x83, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F59, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x06, 0x00, 0x0C, 0x01, 0x80, 0x37, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F5A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F5B, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x49, 0x00, 0x18, 0x49, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x08, 0x88, 0x80, 0x08, 0x8B, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F5C, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x19, 0x20, 0x00, 0x1A, 0x20, 0x00, 0x28, 0x20, 0x00, 0x28, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F5D, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0C, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x13, 0x01, 0x00, 0x30, 0xF9, 0x00, 0x50, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0xF9, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F5E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x20, 0x00, 0x50, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x86, 0x00, 0x11, 0xE4, 0x00, 0x10, 0x3C, 0x00, 0x10, 0xE7, 0x00, 0x13, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F5F, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x06, 0x7C, 0x00, 0x04, 0xC4, 0x00, 0x0D, 0x8C, 0x00, 0x08, 0x58, 0x00, 0x18, 0x30, 0x00, 0x38, 0x78, 0x00, 0x68, 0xCE, 0x00, 0x0B, 0x83, 0x80, 0x08, 0x70, 0x00, 0x08, 0x18, 0x00, 0x08, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x38, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F60, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x06, 0x40, 0x00, 0x04, 0xFF, 0x80, 0x0C, 0x88, 0x80, 0x09, 0x89, 0x80, 0x1B, 0x09, 0x00, 0x38, 0x2A, 0x00, 0x68, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F63, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x51, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x13, 0x11, 0x00, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F64, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0x88, 0x00, 0x18, 0xFC, 0x00, 0x28, 0x88, 0x00, 0x48, 0x88, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x28, 0x00, 0x09, 0x18, 0x00, 0x09, 0x08, 0x00, 0x09, 0xE9, 0x00, 0x0B, 0x09, 0x00, 0x08, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F65, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x28, 0x00, 0x17, 0xF7, 0x00, 0x60, 0x02, 0x00, 0x09, 0x08, 0x00, 0x04, 0x88, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x20, 0x00, 0x00, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F67, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x48, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x28, 0x42, 0x00, 0x4F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x60, 0x00, 0x08, 0x50, 0x00, 0x08, 0x4C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F69, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x1B, 0xFE, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xFA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xBA, 0x80, 0x0A, 0x21, 0x80, 0x0A, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F6A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x00, 0x80, 0x09, 0x00, 0x80, 0x19, 0x00, 0x80, 0x11, 0x3C, 0x80, 0x31, 0x24, 0x80, 0x51, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x3C, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F6C, { 0x00, 0x00, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x06, 0xFF, 0x00, 0x04, 0x12, 0x00, 0x0C, 0x16, 0x00, 0x08, 0x14, 0x00, 0x19, 0xFF, 0x80, 0x38, 0x18, 0x00, 0x68, 0x30, 0x00, 0x08, 0xE3, 0x00, 0x09, 0xAE, 0x00, 0x08, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F6E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x38, 0x00, 0x06, 0x28, 0x00, 0x04, 0x6C, 0x00, 0x0C, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x1B, 0x01, 0x80, 0x38, 0xFE, 0x00, 0x68, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F6F, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F70, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x29, 0x01, 0x00, 0x29, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F71, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F73, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F74, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x48, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xBF, 0x00, 0x0B, 0xC4, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F75, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0xC6, 0x00, 0x0C, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x44, 0x00, 0x10, 0x44, 0x00, 0x30, 0x44, 0x00, 0x50, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x11, 0x84, 0x00, 0x13, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F76, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F77, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x06, 0x82, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x38, 0xFE, 0x00, 0x68, 0x90, 0x80, 0x08, 0x99, 0x80, 0x08, 0x8B, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F78, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x1E, 0x00, 0x0D, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F79, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x7E, 0x00, 0x06, 0xC4, 0x00, 0x04, 0x88, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x18, 0x80, 0x00, 0x38, 0xBE, 0x00, 0x68, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA6, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x80, 0x09, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F7A, { 0x00, 0x00, 0x00, 0x04, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x18, 0x82, 0x00, 0x1B, 0x01, 0x80, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F7B, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x0C, 0x49, 0x00, 0x0A, 0x4B, 0x00, 0x1B, 0x4A, 0x00, 0x11, 0x48, 0x00, 0x30, 0x48, 0x00, 0x50, 0x48, 0x00, 0x10, 0x4E, 0x00, 0x11, 0xCB, 0x00, 0x17, 0x49, 0x80, 0x10, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x88, 0x80, 0x11, 0x89, 0x80, 0x13, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F7C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x31, 0x83, 0x00, 0x53, 0x45, 0x80, 0x10, 0xC4, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F7D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x18, 0x60, 0x80, 0x17, 0x49, 0x80, 0x30, 0xC9, 0x00, 0x50, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x9C, 0x00, 0x13, 0x14, 0x00, 0x16, 0x14, 0x00, 0x10, 0x36, 0x00, 0x10, 0x22, 0x00, 0x10, 0x63, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F7E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x82, 0x00, 0x19, 0x01, 0x00, 0x1A, 0x00, 0x80, 0x2C, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F7F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x60, 0x00, 0x08, 0x50, 0x00, 0x08, 0x8C, 0x00, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F81, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x09, 0xFF, 0x00, 0x1A, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x28, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x80, 0x0A, 0x0F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F82, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x12, 0x0F, 0x00, 0x32, 0x78, 0x00, 0x52, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x16, 0x10, 0x00, 0x14, 0x10, 0x80, 0x14, 0x19, 0x80, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F83, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x19, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x80, 0x0A, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F84, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x42, 0x00, 0x18, 0x81, 0x00, 0x29, 0x3F, 0x00, 0x2B, 0xD0, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F85, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x10, 0x64, 0x00, 0x30, 0xCC, 0x00, 0x51, 0x89, 0x00, 0x10, 0xDB, 0x00, 0x10, 0x32, 0x00, 0x10, 0x66, 0x00, 0x10, 0xCC, 0x00, 0x13, 0x98, 0x00, 0x10, 0x36, 0x00, 0x10, 0xE3, 0x00, 0x17, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F86, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F88, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x42, 0x00, 0x18, 0xA4, 0x00, 0x1B, 0x18, 0x00, 0x28, 0x10, 0x00, 0x28, 0x28, 0x00, 0x08, 0xC8, 0x00, 0x0B, 0x1F, 0x80, 0x08, 0x21, 0x00, 0x08, 0xD2, 0x00, 0x0B, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x60, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F89, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x18, 0x42, 0x00, 0x11, 0x81, 0x80, 0x30, 0x7E, 0x00, 0x50, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F8A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x11, 0x00, 0x09, 0x11, 0x00, 0x08, 0x92, 0x00, 0x18, 0x92, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x80, 0x09, 0x04, 0x80, 0x0A, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F8B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x09, 0xFA, 0x80, 0x08, 0x42, 0x80, 0x18, 0x82, 0x80, 0x18, 0xFA, 0x80, 0x29, 0x0A, 0x80, 0x29, 0x8A, 0x80, 0x0A, 0x52, 0x80, 0x0C, 0x22, 0x80, 0x08, 0x22, 0x80, 0x08, 0x42, 0x80, 0x08, 0x82, 0x80, 0x09, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F8C, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x7C, 0x00, 0x0F, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F8D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F8E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x92, 0x00, 0x04, 0xD2, 0x00, 0x0C, 0x56, 0x00, 0x08, 0x54, 0x00, 0x18, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x68, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F8F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x34, 0x00, 0x08, 0x54, 0x00, 0x08, 0x52, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4F90, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x30, 0x00, 0x06, 0x20, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x18, 0xAA, 0x00, 0x38, 0xAA, 0x00, 0x68, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F91, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x40, 0x00, 0x18, 0x80, 0x00, 0x28, 0xFF, 0x00, 0x29, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F92, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x00, 0x80, 0x09, 0x20, 0x80, 0x18, 0x20, 0x00, 0x39, 0xFF, 0x80, 0x68, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0x46, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F93, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x11, 0x00, 0x08, 0x11, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x30, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F94, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x44, 0x00, 0x0C, 0xC4, 0x00, 0x08, 0x9E, 0x00, 0x19, 0xF3, 0x00, 0x10, 0x00, 0x00, 0x30, 0x10, 0x00, 0x50, 0x90, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x90, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F96, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x37, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F97, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x31, 0x01, 0x00, 0x51, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x45, 0x00, 0x11, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F98, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x06, 0x80, 0x18, 0x38, 0x00, 0x29, 0xE0, 0x00, 0x28, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F99, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x0A, 0x00, 0x06, 0x0B, 0x00, 0x04, 0x09, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x3B, 0xE8, 0x00, 0x68, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xE6, 0x00, 0x0B, 0x82, 0x80, 0x08, 0x03, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F9A, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0C, 0xFF, 0x00, 0x09, 0x81, 0x00, 0x19, 0x01, 0x00, 0x12, 0xF9, 0x00, 0x30, 0x89, 0x00, 0x50, 0x89, 0x00, 0x10, 0xF9, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0xF9, 0x00, 0x10, 0x03, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F9B, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1B, 0xFF, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x28, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x84, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F9D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x18, 0x50, 0x00, 0x28, 0x90, 0x80, 0x29, 0x91, 0x00, 0x0A, 0x92, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9A, 0x00, 0x08, 0xE1, 0x00, 0x0B, 0x80, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F9E, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x87, 0x80, 0x18, 0x84, 0x80, 0x17, 0xF4, 0x80, 0x31, 0x14, 0x80, 0x31, 0x14, 0x80, 0x51, 0x34, 0x80, 0x13, 0x24, 0x80, 0x12, 0x24, 0x80, 0x12, 0x64, 0x80, 0x13, 0xC4, 0x80, 0x10, 0xE4, 0x80, 0x11, 0xB4, 0x80, 0x13, 0x17, 0x80, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4F9F, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x18, 0x60, 0x00, 0x10, 0x5F, 0x00, 0x30, 0xC1, 0x00, 0x50, 0x82, 0x00, 0x11, 0x84, 0x00, 0x12, 0xBF, 0x80, 0x14, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x12, 0x22, 0x00, 0x33, 0x26, 0x00, 0x31, 0x24, 0x00, 0x51, 0x24, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x10, 0xD8, 0x00, 0x10, 0x8C, 0x00, 0x11, 0x86, 0x00, 0x13, 0x03, 0x00, 0x16, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FA1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x18, 0x48, 0x00, 0x10, 0x48, 0x00, 0x33, 0xFF, 0x00, 0x52, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA3, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x05, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x28, 0x00, 0x00, 0x48, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA5, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x84, 0x00, 0x04, 0x7E, 0x00, 0x0B, 0xC0, 0x00, 0x08, 0x50, 0x00, 0x18, 0x22, 0x00, 0x28, 0x52, 0x00, 0x49, 0x8E, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x91, 0x00, 0x09, 0x11, 0x00, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA6, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x22, 0x00, 0x04, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x1B, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x4A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x48, 0x00, 0x08, 0x86, 0x00, 0x0B, 0x03, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA7, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x11, 0x00, 0x05, 0xF9, 0x00, 0x09, 0x15, 0x00, 0x09, 0x55, 0x00, 0x19, 0x55, 0x00, 0x29, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x51, 0x00, 0x08, 0x41, 0x00, 0x08, 0xA1, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x05, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA8, { 0x00, 0x00, 0x00, 0x04, 0x1C, 0x00, 0x05, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x90, 0x00, 0x48, 0x88, 0x00, 0x09, 0x07, 0x00, 0x0A, 0x8A, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FA9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x10, 0x00, 0x32, 0x08, 0x00, 0x54, 0x27, 0x00, 0x19, 0xF2, 0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x90, 0x00, 0x11, 0x08, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FAA, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x14, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x18, 0x20, 0x00, 0x28, 0x58, 0x00, 0x49, 0x87, 0x00, 0x0E, 0x8A, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FAB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x19, 0x00, 0x00, 0x11, 0x00, 0x00, 0x30, 0xFF, 0x00, 0x50, 0x00, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x86, 0x00, 0x11, 0xE4, 0x00, 0x10, 0x3C, 0x00, 0x10, 0xE7, 0x00, 0x13, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FAC, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x41, 0x00, 0x1C, 0x42, 0x00, 0x28, 0xA0, 0x00, 0x48, 0xA4, 0x00, 0x09, 0x98, 0x00, 0x0A, 0x90, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA7, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FAD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x31, 0x08, 0x00, 0x51, 0x0C, 0x00, 0x13, 0x04, 0x00, 0x12, 0xE6, 0x00, 0x16, 0x3B, 0x00, 0x1C, 0x09, 0x80, 0x11, 0xC0, 0x00, 0x10, 0x70, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FAE, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FAF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x80, 0x00, 0x28, 0x80, 0x00, 0x29, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FB2, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0x7F, 0x00, 0x11, 0x00, 0x00, 0x31, 0x00, 0x00, 0x51, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x11, 0x24, 0x80, 0x11, 0x25, 0x80, 0x11, 0x25, 0x00, 0x13, 0x26, 0x00, 0x12, 0x22, 0x00, 0x16, 0x3B, 0x00, 0x10, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FB5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x02, 0x00, 0x18, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x09, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FB6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x19, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x28, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FB7, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x81, 0x00, 0x04, 0x81, 0x00, 0x0C, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x18, 0x80, 0x00, 0x38, 0xFF, 0x80, 0x68, 0x80, 0x80, 0x08, 0xBC, 0x80, 0x08, 0xA4, 0x80, 0x09, 0xA4, 0x80, 0x09, 0x24, 0x80, 0x09, 0x3D, 0x80, 0x0A, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FB9, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x80, 0x0B, 0xC7, 0x00, 0x08, 0xBC, 0x00, 0x18, 0x84, 0x00, 0x11, 0x84, 0x00, 0x31, 0x04, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x44, 0x00, 0x14, 0x44, 0x00, 0x12, 0xC4, 0x00, 0x12, 0x84, 0x00, 0x13, 0x84, 0x00, 0x11, 0x3F, 0x80, 0x13, 0x80, 0x00, 0x12, 0xE0, 0x00, 0x16, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FBB, { 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x02, 0x04, 0x00, 0x06, 0x66, 0x00, 0x04, 0xC3, 0x00, 0x0D, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x38, 0x81, 0x00, 0x68, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0x44, 0x80, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FBC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x51, 0x01, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FBD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x21, 0x00, 0x10, 0x61, 0x00, 0x10, 0x43, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FBE, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x11, 0x00, 0x06, 0xFF, 0x00, 0x04, 0x12, 0x00, 0x0C, 0x14, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x38, 0x20, 0x00, 0x68, 0xFE, 0x00, 0x0B, 0x04, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FBF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x1A, 0x21, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x21, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x70, 0x00, 0x08, 0x8F, 0x80, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC0, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x1E, 0x00, 0x0D, 0xF0, 0x00, 0x08, 0x24, 0x00, 0x18, 0xB6, 0x00, 0x11, 0x93, 0x00, 0x31, 0x21, 0x00, 0x50, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x8C, 0x00, 0x11, 0xE8, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x66, 0x00, 0x11, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x3E, 0x00, 0x06, 0xA2, 0x00, 0x04, 0xA2, 0x00, 0x0C, 0xA2, 0x00, 0x08, 0xBE, 0x00, 0x18, 0x80, 0x00, 0x38, 0x80, 0x00, 0x68, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC2, { 0x00, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x05, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x18, 0x44, 0x00, 0x19, 0x88, 0x00, 0x28, 0x92, 0x00, 0x28, 0x61, 0x00, 0x08, 0x2F, 0x00, 0x0B, 0xF0, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x19, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x9F, 0x80, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x50, 0x00, 0x09, 0x50, 0x00, 0x0A, 0x3F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC4, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x35, 0x00, 0x09, 0xC4, 0x80, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x1F, 0xFF, 0x80, 0x28, 0x44, 0x00, 0x28, 0x44, 0x80, 0x08, 0x4C, 0x80, 0x08, 0x75, 0x00, 0x0B, 0xC5, 0x00, 0x08, 0x46, 0x00, 0x08, 0x42, 0x80, 0x08, 0x46, 0x80, 0x08, 0x49, 0x80, 0x08, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FC5, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x13, 0x00, 0x0C, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x11, 0x11, 0x00, 0x31, 0x93, 0x00, 0x50, 0x96, 0x00, 0x10, 0x10, 0x00, 0x10, 0x18, 0x00, 0x10, 0x5C, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x11, 0x11, 0x80, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x33, 0x7D, 0x80, 0x50, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC8, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x10, 0x00, 0x12, 0x10, 0x00, 0x30, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FC9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x19, 0xFE, 0x00, 0x18, 0x22, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FCA, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x84, 0x00, 0x09, 0x3E, 0x00, 0x0F, 0xC9, 0x00, 0x18, 0x88, 0x00, 0x18, 0x88, 0x80, 0x28, 0x8F, 0x80, 0x29, 0x40, 0x00, 0x0E, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x09, 0x84, 0x00, 0x0A, 0x48, 0x00, 0x0C, 0x30, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FCB, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x06, 0x82, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x39, 0x11, 0x00, 0x69, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x80, 0x09, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FCC, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x11, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x51, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FCD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x38, 0x82, 0x00, 0x68, 0xFE, 0x80, 0x08, 0x89, 0x80, 0x08, 0x8B, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FCE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x09, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x20, 0x42, 0x00, 0x00, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x0A, 0x42, 0x00, 0x09, 0x42, 0x00, 0x10, 0x42, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FCF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x92, 0x00, 0x0D, 0x93, 0x00, 0x09, 0x11, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x51, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FD0, { 0x00, 0x00, 0x00, 0x08, 0x21, 0x00, 0x08, 0xE9, 0x00, 0x1B, 0x89, 0x00, 0x10, 0x89, 0x00, 0x30, 0x89, 0x00, 0x37, 0xE9, 0x00, 0x50, 0x89, 0x00, 0x10, 0x89, 0x00, 0x11, 0xC9, 0x00, 0x11, 0xA9, 0x00, 0x12, 0xA9, 0x00, 0x12, 0x89, 0x00, 0x14, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FD1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x24, 0x00, 0x18, 0x18, 0x00, 0x1B, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FD2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x12, 0x01, 0x00, 0x30, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x50, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x88, 0x80, 0x11, 0x89, 0x80, 0x13, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FD3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x19, 0x24, 0x00, 0x19, 0x24, 0x00, 0x28, 0x92, 0x00, 0x28, 0x49, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FD4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x80, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FD7, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x82, 0x00, 0x09, 0x01, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x18, 0x28, 0x00, 0x28, 0x44, 0x00, 0x28, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FD8, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x1E, 0x00, 0x0F, 0xF2, 0x00, 0x08, 0x93, 0x00, 0x19, 0x21, 0x00, 0x10, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x50, 0x06, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FDA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FDB, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0xFC, 0x00, 0x0C, 0x84, 0x00, 0x09, 0x8C, 0x00, 0x1B, 0x08, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x51, 0x11, 0x00, 0x11, 0x31, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x68, 0x00, 0x10, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x88, 0x80, 0x11, 0x89, 0x80, 0x13, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FDC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FDD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x94, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FDE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x1B, 0xE7, 0x00, 0x60, 0x02, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x04, 0x00, 0x13, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FDF, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x3F, 0x00, 0x1B, 0xC0, 0x80, 0x18, 0x80, 0x00, 0x28, 0x80, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FE0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x18, 0x92, 0x00, 0x28, 0x92, 0x00, 0x29, 0x55, 0x00, 0x0A, 0x38, 0x80, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FE1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FE2, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x06, 0xFF, 0x80, 0x04, 0x82, 0x00, 0x0D, 0x46, 0x00, 0x08, 0x6C, 0x00, 0x18, 0x38, 0x00, 0x38, 0xEE, 0x00, 0x6B, 0x83, 0x80, 0x08, 0x30, 0x00, 0x08, 0xE6, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF1, 0x80, 0x08, 0x07, 0x00, 0x08, 0x3C, 0x00, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FE3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FE4, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0xC6, 0x00, 0x0C, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x11, 0x00, 0x10, 0x11, 0x00, 0x33, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x30, 0x80, 0x10, 0x50, 0x80, 0x10, 0xD1, 0x80, 0x11, 0x91, 0x00, 0x17, 0x17, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FE5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FE6, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0B, 0xFC, 0x00, 0x18, 0x80, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x88, 0x00, 0x09, 0x0A, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FE8, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x50, 0x00, 0x0A, 0x52, 0x00, 0x09, 0x54, 0x00, 0x18, 0x50, 0x00, 0x2B, 0xFF, 0x00, 0x4A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FE9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x10, 0x92, 0x00, 0x37, 0xFF, 0x00, 0x54, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x15, 0x6A, 0x00, 0x16, 0x46, 0x00, 0x14, 0x02, 0x00, 0x14, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x14, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FEA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x1B, 0xDF, 0x00, 0x2A, 0x52, 0x00, 0x4A, 0x52, 0x00, 0x0B, 0x5A, 0x00, 0x0A, 0xD6, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0xD6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FED, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x19, 0x04, 0x00, 0x2A, 0xFB, 0x00, 0x4C, 0x02, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA6, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FEE, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x09, 0x22, 0x00, 0x19, 0x54, 0x00, 0x19, 0x88, 0x00, 0x29, 0x16, 0x00, 0x29, 0x21, 0x80, 0x09, 0xC8, 0x00, 0x09, 0x12, 0x00, 0x09, 0x24, 0x80, 0x09, 0xC9, 0x00, 0x09, 0x12, 0x00, 0x09, 0x64, 0x00, 0x09, 0x18, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FEF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x19, 0x12, 0x00, 0x19, 0x22, 0x00, 0x29, 0x62, 0x00, 0x29, 0xBF, 0x80, 0x09, 0x22, 0x00, 0x09, 0x32, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FF0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0xE0, 0x00, 0x0B, 0x8F, 0x80, 0x18, 0x88, 0x80, 0x10, 0x88, 0x80, 0x37, 0xF8, 0x80, 0x30, 0x88, 0x80, 0x50, 0x88, 0x80, 0x11, 0xC8, 0x80, 0x11, 0xA8, 0x80, 0x13, 0xA8, 0x80, 0x12, 0x88, 0x80, 0x16, 0x88, 0x80, 0x14, 0x8F, 0x80, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FF1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x29, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x84, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FF2, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x0F, 0xF4, 0x00, 0x18, 0x0F, 0x80, 0x11, 0x44, 0x80, 0x33, 0x64, 0x80, 0x52, 0x24, 0x80, 0x11, 0x44, 0x80, 0x11, 0x44, 0x80, 0x11, 0xC4, 0x80, 0x10, 0x84, 0x80, 0x10, 0x8C, 0x80, 0x11, 0xC9, 0x80, 0x11, 0x59, 0x00, 0x13, 0x73, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FF3, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x1F, 0xCF, 0x80, 0x18, 0x48, 0x00, 0x28, 0x48, 0x00, 0x2F, 0xCF, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xCF, 0x80, 0x08, 0x48, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FF5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x08, 0xC8, 0x80, 0x09, 0x49, 0x00, 0x0E, 0x46, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7A, 0x00, 0x0B, 0x81, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FF6, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x3F, 0x00, 0x09, 0xD1, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x1B, 0x00, 0x3F, 0xEA, 0x00, 0x51, 0x0A, 0x00, 0x11, 0x0E, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x19, 0x2E, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x1B, 0x00, 0x13, 0x11, 0x00, 0x10, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FF8, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x18, 0x28, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FFA, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x18, 0x46, 0x00, 0x19, 0x91, 0x80, 0x2E, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FFC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x18, 0x22, 0x00, 0x10, 0x4F, 0x00, 0x30, 0xF1, 0x00, 0x50, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FFD, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0xC8, 0x00, 0x0F, 0x88, 0x00, 0x0A, 0x0F, 0x80, 0x1A, 0x18, 0x80, 0x13, 0xF5, 0x00, 0x32, 0x44, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x4E, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4B, 0x00, 0x14, 0x59, 0x00, 0x10, 0x51, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x4FFE, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x51, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x4FFF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x1F, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x00, 0x80, 0x11, 0x11, 0x00, 0x31, 0x1C, 0x00, 0x51, 0x70, 0x00, 0x11, 0x11, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x00, 0x00, 0x11, 0x24, 0x00, 0x13, 0x24, 0x00, 0x12, 0x24, 0x80, 0x16, 0x64, 0x80, 0x10, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5000, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x80, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x80, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x80, 0x00, 0x38, 0x80, 0x00, 0x6B, 0xFF, 0x80, 0x08, 0x91, 0x00, 0x08, 0x9B, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5001, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0C, 0x87, 0x80, 0x09, 0xF4, 0x80, 0x1A, 0x44, 0x80, 0x10, 0x44, 0x80, 0x30, 0x44, 0x80, 0x53, 0xFC, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0xE4, 0x80, 0x10, 0xA4, 0x80, 0x11, 0xB7, 0x80, 0x13, 0x18, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5002, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFF, 0x80, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x28, 0x84, 0x00, 0x08, 0xE4, 0x00, 0x0F, 0xBF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5004, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0x8C, 0x00, 0x0C, 0x70, 0x00, 0x09, 0x8E, 0x00, 0x18, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x30, 0x40, 0x00, 0x50, 0xFE, 0x00, 0x11, 0x82, 0x00, 0x16, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5005, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x18, 0x82, 0x00, 0x10, 0x82, 0x00, 0x31, 0x45, 0x00, 0x52, 0x28, 0x80, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5006, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0xBB, 0x00, 0x09, 0xBB, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5007, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x10, 0x80, 0x00, 0x30, 0xEF, 0x00, 0x50, 0xA9, 0x00, 0x11, 0xA9, 0x00, 0x11, 0x29, 0x00, 0x13, 0xE9, 0x00, 0x16, 0x4B, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x88, 0x80, 0x11, 0x89, 0x80, 0x13, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5009, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x05, 0xF6, 0x00, 0x38, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x04, 0x00, 0x17, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x500A, { 0x00, 0x00, 0x00, 0x02, 0x2E, 0x00, 0x02, 0x22, 0x00, 0x06, 0x63, 0x00, 0x04, 0xD1, 0x80, 0x0C, 0x10, 0x00, 0x08, 0x32, 0x00, 0x18, 0x22, 0x00, 0x38, 0x3F, 0x00, 0x68, 0xE1, 0x80, 0x08, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x24, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x80, 0x09, 0xB2, 0x80, 0x09, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x500B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x500C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x19, 0x00, 0x80, 0x10, 0x7E, 0x00, 0x30, 0x42, 0x00, 0x50, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x500D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x18, 0x82, 0x00, 0x28, 0x44, 0x00, 0x2F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x500E, { 0x00, 0x00, 0x00, 0x02, 0x28, 0x00, 0x02, 0x28, 0x00, 0x06, 0x28, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x18, 0xAA, 0x00, 0x38, 0xFE, 0x00, 0x68, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x500F, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x0C, 0xC2, 0x00, 0x09, 0x86, 0x00, 0x18, 0x6C, 0x00, 0x14, 0x38, 0x00, 0x34, 0xEE, 0x00, 0x57, 0x83, 0x80, 0x14, 0x14, 0x00, 0x14, 0x12, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5010, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x0C, 0xC2, 0x00, 0x09, 0x86, 0x00, 0x18, 0x6C, 0x00, 0x14, 0x38, 0x00, 0x34, 0xEE, 0x00, 0x57, 0x83, 0x80, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x91, 0x00, 0x15, 0xBB, 0x00, 0x15, 0x2A, 0x00, 0x14, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5011, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x09, 0xE7, 0x80, 0x19, 0x24, 0x80, 0x19, 0xE7, 0x80, 0x29, 0x00, 0x80, 0x29, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5012, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x07, 0xF4, 0x80, 0x08, 0x84, 0x80, 0x09, 0x14, 0x80, 0x1A, 0x74, 0x80, 0x1F, 0x8C, 0x80, 0x28, 0x44, 0x80, 0x28, 0x44, 0x80, 0x08, 0x44, 0x80, 0x0B, 0xF4, 0x80, 0x08, 0x44, 0x80, 0x08, 0x44, 0x80, 0x08, 0x7C, 0x80, 0x0B, 0xC4, 0x80, 0x08, 0x00, 0x80, 0x08, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5013, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x05, 0x22, 0x00, 0x0D, 0x26, 0x00, 0x0B, 0x74, 0x00, 0x1A, 0x58, 0x00, 0x10, 0xCC, 0x00, 0x31, 0x86, 0x00, 0x53, 0x23, 0x80, 0x10, 0x20, 0x00, 0x11, 0x23, 0x00, 0x13, 0x76, 0x00, 0x12, 0x50, 0x00, 0x10, 0xD8, 0x00, 0x10, 0x8C, 0x00, 0x11, 0x86, 0x00, 0x13, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5014, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x31, 0x08, 0x00, 0x51, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x13, 0x08, 0x00, 0x12, 0x49, 0x00, 0x16, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5016, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x28, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5017, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xEF, 0x00, 0x0D, 0x29, 0x00, 0x09, 0x29, 0x00, 0x19, 0x29, 0x00, 0x11, 0xAD, 0x00, 0x31, 0x6B, 0x00, 0x51, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0xAD, 0x00, 0x11, 0x6B, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x69, 0x00, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5018, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x92, 0x00, 0x0D, 0x93, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x10, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5019, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x1A, 0xFF, 0x80, 0x1A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x7F, 0x00, 0x0A, 0x88, 0x00, 0x0B, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x41, 0x00, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x501A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x18, 0x44, 0x00, 0x18, 0x82, 0x00, 0x2B, 0x01, 0x80, 0x28, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x501B, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x30, 0x42, 0x00, 0x50, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC3, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x501C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x09, 0x10, 0x80, 0x19, 0x7E, 0x80, 0x19, 0x10, 0x80, 0x29, 0x10, 0x80, 0x29, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x7E, 0x80, 0x09, 0x42, 0x80, 0x09, 0x7E, 0x80, 0x09, 0x42, 0x80, 0x09, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x501D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x9C, 0x00, 0x3F, 0x94, 0x00, 0x04, 0x14, 0x00, 0x7F, 0xF6, 0x00, 0x04, 0x22, 0x00, 0x04, 0x63, 0x00, 0x04, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x501E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x501F, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x84, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x2F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5021, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5022, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x11, 0xD0, 0x00, 0x13, 0x70, 0x00, 0x16, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5023, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xEF, 0x80, 0x19, 0x09, 0x00, 0x19, 0x09, 0x00, 0x29, 0xF9, 0x00, 0x29, 0x25, 0x00, 0x09, 0x25, 0x00, 0x09, 0x25, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x25, 0x00, 0x0A, 0x25, 0x00, 0x0A, 0x29, 0x00, 0x0C, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5024, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x1A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5025, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0x44, 0x80, 0x1A, 0x44, 0x80, 0x10, 0xC4, 0x00, 0x31, 0x87, 0x80, 0x53, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5026, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x28, 0x00, 0x18, 0x44, 0x00, 0x2F, 0xFF, 0x80, 0x29, 0x02, 0x00, 0x0A, 0x01, 0x00, 0x0C, 0xFC, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9D, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5027, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5028, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5029, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x502A, { 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x05, 0x87, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xC7, 0x00, 0x19, 0x01, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x45, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x502B, { 0x00, 0x00, 0x00, 0x04, 0x30, 0x00, 0x04, 0x48, 0x00, 0x08, 0x84, 0x00, 0x09, 0x02, 0x00, 0x1A, 0x01, 0x00, 0x1C, 0xFC, 0x80, 0x28, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x502C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x502D, { 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x05, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x38, 0x00, 0x18, 0x54, 0x00, 0x28, 0x92, 0x00, 0x2B, 0x11, 0x80, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x09, 0xC8, 0x00, 0x0A, 0x38, 0x00, 0x08, 0xC6, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x502E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0x56, 0x00, 0x10, 0xD2, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5030, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x30, 0xC4, 0x00, 0x53, 0x87, 0x80, 0x10, 0x20, 0x00, 0x10, 0x3E, 0x00, 0x10, 0x62, 0x00, 0x10, 0xC6, 0x00, 0x11, 0xAC, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6E, 0x00, 0x13, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5032, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x17, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5033, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x50, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5035, { 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x05, 0xF4, 0x80, 0x0C, 0x04, 0x80, 0x08, 0x04, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x30, 0x44, 0x00, 0x51, 0x44, 0x00, 0x11, 0x74, 0x00, 0x11, 0x44, 0x00, 0x11, 0x46, 0x00, 0x11, 0x42, 0x00, 0x11, 0x42, 0x00, 0x11, 0xFA, 0x80, 0x17, 0x03, 0x80, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5036, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x31, 0x02, 0x00, 0x51, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x11, 0x86, 0x00, 0x13, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5039, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x1B, 0x83, 0x80, 0x10, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x503A, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x04, 0x00, 0x49, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x58, 0x00, 0x08, 0x84, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x503B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x19, 0xE5, 0x00, 0x19, 0x24, 0x80, 0x29, 0x24, 0x80, 0x29, 0xE4, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0xFC, 0x80, 0x0F, 0x24, 0x80, 0x08, 0x24, 0x80, 0x08, 0x27, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x503C, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x19, 0xFE, 0x00, 0x29, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x503E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x14, 0x22, 0x00, 0x14, 0xFF, 0x00, 0x34, 0x82, 0x00, 0x57, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x15, 0x92, 0x00, 0x16, 0x92, 0x00, 0x14, 0x28, 0x00, 0x10, 0x26, 0x00, 0x10, 0x43, 0x00, 0x11, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5040, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5041, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x3C, 0x00, 0x0B, 0xE4, 0x00, 0x18, 0xB6, 0x00, 0x11, 0x93, 0x00, 0x31, 0x01, 0x00, 0x30, 0x20, 0x00, 0x51, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5042, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0xC6, 0x00, 0x0C, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x11, 0xE1, 0x00, 0x31, 0x29, 0x00, 0x51, 0x29, 0x00, 0x11, 0xA9, 0x00, 0x11, 0x69, 0x00, 0x11, 0x29, 0x00, 0x11, 0xA9, 0x00, 0x11, 0x61, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5043, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0A, 0x7E, 0x00, 0x0A, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x1A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x22, 0x00, 0x0A, 0x64, 0x00, 0x0A, 0x98, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0xC2, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5045, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x04, 0x1C, 0x00, 0x0D, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5046, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x28, 0x00, 0x31, 0xFF, 0x80, 0x50, 0x44, 0x00, 0x10, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x12, 0x82, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5047, { 0x00, 0x00, 0x00, 0x05, 0xEF, 0x80, 0x05, 0x20, 0x80, 0x09, 0x20, 0x80, 0x09, 0x20, 0x80, 0x19, 0xEF, 0x80, 0x19, 0x00, 0x00, 0x29, 0x00, 0x00, 0x29, 0x1F, 0x80, 0x09, 0xE8, 0x80, 0x09, 0x05, 0x00, 0x09, 0x05, 0x00, 0x09, 0xE2, 0x00, 0x09, 0x02, 0x00, 0x09, 0x05, 0x00, 0x09, 0x09, 0x00, 0x09, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5048, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x18, 0x20, 0x00, 0x28, 0x40, 0x00, 0x28, 0xFF, 0x80, 0x09, 0x88, 0x80, 0x0A, 0x94, 0x80, 0x08, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5049, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x504A, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x1E, 0x00, 0x0D, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x14, 0x80, 0x12, 0x1E, 0x80, 0x12, 0xF2, 0x80, 0x12, 0x00, 0x80, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x504C, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0x20, 0x00, 0x30, 0x20, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x504E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x91, 0x00, 0x10, 0x9B, 0x00, 0x10, 0x8A, 0x00, 0x10, 0x8C, 0x00, 0x10, 0xE6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x504F, { 0x00, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x05, 0xF0, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x19, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x94, 0x80, 0x09, 0x94, 0x80, 0x09, 0xFF, 0x80, 0x0A, 0x94, 0x80, 0x0A, 0x94, 0x80, 0x0A, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5050, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0xC6, 0x00, 0x18, 0x38, 0x00, 0x10, 0xC6, 0x00, 0x33, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x12, 0x3C, 0x00, 0x12, 0xE0, 0x00, 0x12, 0x0E, 0x00, 0x12, 0x38, 0x00, 0x16, 0xE0, 0x00, 0x14, 0x07, 0x00, 0x1C, 0x1C, 0x00, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5051, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x1A, 0x1A, 0x00, 0x12, 0xF2, 0x00, 0x32, 0x22, 0x00, 0x32, 0xFA, 0x00, 0x52, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x3A, 0x80, 0x12, 0xEA, 0x80, 0x14, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5052, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x06, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x38, 0x00, 0x00, 0x6B, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x0B, 0x24, 0x80, 0x08, 0x6C, 0x80, 0x09, 0xD9, 0x80, 0x08, 0x31, 0x00, 0x08, 0xE7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5053, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x31, 0x7F, 0x00, 0x51, 0x10, 0x00, 0x11, 0x22, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x08, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x16, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5055, { 0x00, 0x00, 0x00, 0x05, 0x08, 0x00, 0x05, 0x08, 0x00, 0x09, 0x09, 0x80, 0x09, 0xEE, 0x00, 0x19, 0x08, 0x00, 0x19, 0x08, 0x00, 0x29, 0x78, 0x80, 0x2F, 0x8F, 0x80, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5056, { 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x18, 0x26, 0x00, 0x10, 0x24, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x18, 0x00, 0x10, 0x24, 0x00, 0x10, 0xFE, 0x00, 0x11, 0x82, 0x00, 0x16, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5057, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x56, 0x00, 0x0C, 0xD3, 0x00, 0x0B, 0x91, 0x80, 0x18, 0x34, 0x00, 0x10, 0x0C, 0x00, 0x30, 0xFF, 0x00, 0x57, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5059, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x30, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x52, 0x10, 0x80, 0x12, 0x10, 0x80, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x505A, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8F, 0x80, 0x1F, 0xF1, 0x00, 0x28, 0x91, 0x00, 0x28, 0x91, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xEA, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x2A, 0x00, 0x0B, 0xEA, 0x00, 0x0A, 0x31, 0x00, 0x08, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x505C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x505F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x20, 0x00, 0x06, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x38, 0xFE, 0x00, 0x68, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5060, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x0C, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x24, 0x80, 0x11, 0x24, 0x80, 0x31, 0x3C, 0x80, 0x50, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x46, 0x00, 0x10, 0xF4, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x77, 0x00, 0x11, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5062, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x09, 0xC8, 0x00, 0x0F, 0x09, 0x00, 0x19, 0x29, 0x00, 0x11, 0x2B, 0x00, 0x37, 0xEA, 0x00, 0x31, 0x2A, 0x00, 0x51, 0x08, 0x00, 0x13, 0x88, 0x00, 0x13, 0x5C, 0x00, 0x15, 0x54, 0x00, 0x15, 0x14, 0x00, 0x19, 0x16, 0x00, 0x11, 0x32, 0x00, 0x11, 0x23, 0x00, 0x11, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5063, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x18, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5065, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x19, 0xFF, 0x80, 0x19, 0x09, 0x00, 0x2A, 0x7F, 0x00, 0x2B, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x0B, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5066, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x80, 0x19, 0x3D, 0x00, 0x11, 0x20, 0x00, 0x33, 0xF0, 0x00, 0x36, 0x1F, 0x80, 0x54, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x12, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5067, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x19, 0x86, 0x00, 0x16, 0x79, 0x80, 0x30, 0x88, 0x00, 0x53, 0xD8, 0x00, 0x10, 0x30, 0x00, 0x10, 0xE0, 0x00, 0x13, 0x9E, 0x00, 0x10, 0x22, 0x00, 0x10, 0xF6, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x38, 0x00, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x506A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x506C, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0C, 0xFF, 0x00, 0x09, 0xA9, 0x00, 0x19, 0x29, 0x00, 0x12, 0xE9, 0x00, 0x30, 0x71, 0x00, 0x50, 0x9B, 0x00, 0x11, 0x22, 0x00, 0x10, 0x4E, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x59, 0x00, 0x11, 0x49, 0x80, 0x13, 0x62, 0x80, 0x12, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x506D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x18, 0x60, 0x00, 0x10, 0x40, 0x00, 0x33, 0xFF, 0x00, 0x32, 0x49, 0x00, 0x52, 0x49, 0x00, 0x12, 0x79, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x79, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5070, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x0B, 0xEF, 0x00, 0x08, 0x85, 0x00, 0x18, 0x85, 0x00, 0x13, 0xE5, 0x00, 0x30, 0x85, 0x00, 0x30, 0xED, 0x00, 0x53, 0x89, 0x00, 0x10, 0x9B, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5071, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x1E, 0x00, 0x0D, 0xF0, 0x00, 0x09, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x31, 0x7F, 0x00, 0x51, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x13, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5072, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x50, 0x00, 0x11, 0x59, 0x00, 0x11, 0x49, 0x80, 0x13, 0x42, 0x80, 0x12, 0x46, 0x00, 0x10, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5074, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x05, 0xF0, 0x80, 0x09, 0x14, 0x80, 0x09, 0x14, 0x80, 0x19, 0x14, 0x80, 0x19, 0xF4, 0x80, 0x29, 0x14, 0x80, 0x29, 0x14, 0x80, 0x09, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x09, 0x14, 0x80, 0x09, 0x14, 0x80, 0x09, 0xF4, 0x80, 0x08, 0x00, 0x80, 0x09, 0x20, 0x80, 0x0A, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5075, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5076, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x14, 0x80, 0x0A, 0x12, 0x80, 0x0A, 0x1D, 0x80, 0x0B, 0xE0, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5077, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xA0, 0x00, 0x11, 0x10, 0x00, 0x12, 0x08, 0x00, 0x35, 0xF7, 0x00, 0x58, 0x02, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x54, 0x00, 0x13, 0xD4, 0x00, 0x12, 0x54, 0x00, 0x13, 0xD4, 0x00, 0x12, 0x54, 0x00, 0x12, 0x44, 0x00, 0x12, 0x54, 0x00, 0x12, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5078, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xF8, 0x00, 0x09, 0x28, 0x00, 0x08, 0xC4, 0x00, 0x19, 0x82, 0x00, 0x1E, 0xFD, 0x80, 0x28, 0x00, 0x00, 0x2B, 0xE5, 0x00, 0x0A, 0x25, 0x00, 0x0B, 0xEA, 0x00, 0x0A, 0x34, 0x00, 0x0B, 0xEA, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x25, 0x00, 0x0A, 0x25, 0x00, 0x0A, 0x65, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x507B, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x05, 0x24, 0x00, 0x04, 0xA8, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x18, 0x70, 0x00, 0x28, 0xA8, 0x00, 0x49, 0x26, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x08, 0x90, 0x00, 0x08, 0x60, 0x00, 0x08, 0x98, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x507D, { 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFE, 0x00, 0x18, 0x22, 0x00, 0x10, 0x24, 0x00, 0x30, 0x7F, 0x00, 0x50, 0xC1, 0x00, 0x10, 0x82, 0x00, 0x11, 0xFF, 0x80, 0x13, 0x00, 0x80, 0x16, 0x04, 0x80, 0x11, 0x52, 0x80, 0x11, 0x51, 0x80, 0x12, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x507E, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0xAA, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x48, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x58, 0x00, 0x08, 0x86, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x507F, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x05, 0x24, 0x00, 0x04, 0xA8, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x2C, 0x0A, 0x00, 0x49, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x48, 0x00, 0x08, 0x84, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5080, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x4D, 0x00, 0x08, 0x4B, 0x00, 0x08, 0x8C, 0x80, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5081, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x50, 0x00, 0x0D, 0xD7, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0xD7, 0x00, 0x31, 0x11, 0x00, 0x51, 0x11, 0x00, 0x11, 0xD7, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x4C, 0x00, 0x10, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5083, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x50, 0x22, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x29, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x80, 0x10, 0x54, 0x00, 0x11, 0xD7, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5084, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x19, 0x45, 0x00, 0x10, 0x82, 0x00, 0x31, 0xFF, 0x00, 0x56, 0x82, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5085, { 0x00, 0x00, 0x00, 0x04, 0x14, 0x00, 0x04, 0x12, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x13, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x12, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5086, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x04, 0x00, 0x09, 0x08, 0x00, 0x19, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x31, 0x41, 0x00, 0x51, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x13, 0x2A, 0x00, 0x12, 0x6B, 0x00, 0x16, 0xC9, 0x80, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5088, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x52, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x52, 0x00, 0x32, 0x52, 0x00, 0x52, 0x52, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x70, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x27, 0x00, 0x16, 0x22, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x508A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFE, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x52, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x11, 0x02, 0x00, 0x13, 0x03, 0x00, 0x16, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x508D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x41, 0x00, 0x18, 0x22, 0x00, 0x18, 0x22, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x41, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x508E, { 0x00, 0x00, 0x00, 0x04, 0x86, 0x00, 0x04, 0xFC, 0x00, 0x0C, 0x81, 0x80, 0x08, 0x7F, 0x00, 0x18, 0x00, 0x00, 0x11, 0x7E, 0x00, 0x31, 0x42, 0x00, 0x51, 0x7E, 0x00, 0x11, 0x42, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x42, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x508F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x19, 0x7F, 0x00, 0x11, 0x09, 0x00, 0x31, 0xFF, 0x80, 0x51, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x13, 0x41, 0x00, 0x12, 0x41, 0x00, 0x16, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5090, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x50, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x00, 0x80, 0x12, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5091, { 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x05, 0x04, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x54, 0x00, 0x1A, 0x54, 0x00, 0x1D, 0x94, 0x00, 0x29, 0x7F, 0x80, 0x2A, 0x04, 0x00, 0x0C, 0x24, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x70, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x22, 0x00, 0x0C, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5092, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xE2, 0x00, 0x19, 0x33, 0x00, 0x13, 0x11, 0x00, 0x32, 0x20, 0x00, 0x30, 0x64, 0x00, 0x50, 0xC8, 0x00, 0x10, 0x52, 0x00, 0x10, 0x3F, 0x00, 0x11, 0xE1, 0x80, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5093, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x0B, 0xFC, 0x00, 0x0A, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x33, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x73, 0x80, 0x13, 0xDE, 0x80, 0x12, 0x10, 0x80, 0x16, 0x73, 0x80, 0x15, 0xDE, 0x80, 0x1C, 0x10, 0x80, 0x10, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5094, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x49, 0x00, 0x30, 0x49, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x4C, 0x00, 0x10, 0xCA, 0x00, 0x11, 0xCB, 0x00, 0x13, 0x49, 0x80, 0x10, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5096, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x1B, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x30, 0xFE, 0x00, 0x50, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x11, 0x80, 0x00, 0x11, 0x7F, 0x00, 0x13, 0x41, 0x00, 0x16, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5098, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x46, 0x00, 0x32, 0x49, 0x80, 0x06, 0x54, 0x00, 0x09, 0x62, 0x00, 0x10, 0xC1, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5099, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x509A, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x1F, 0xEF, 0x80, 0x10, 0x09, 0x00, 0x32, 0x99, 0x00, 0x36, 0xD1, 0x00, 0x54, 0x4B, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x8E, 0x00, 0x13, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x13, 0x8A, 0x00, 0x12, 0x9B, 0x00, 0x16, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x509B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x45, 0x00, 0x10, 0xC6, 0x00, 0x31, 0x93, 0x00, 0x50, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x509C, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x3E, 0x00, 0x0C, 0x62, 0x00, 0x08, 0xD6, 0x00, 0x19, 0xAC, 0x00, 0x10, 0x18, 0x00, 0x30, 0x60, 0x00, 0x53, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x509E, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0x44, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x50, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x88, 0x00, 0x16, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x509F, { 0x00, 0x00, 0x00, 0x02, 0x5C, 0x00, 0x02, 0x44, 0x00, 0x06, 0xC6, 0x00, 0x05, 0xA3, 0x00, 0x0C, 0x64, 0x00, 0x08, 0x46, 0x00, 0x18, 0xFB, 0x00, 0x38, 0x00, 0x00, 0x6B, 0xEF, 0x00, 0x08, 0x21, 0x00, 0x09, 0x29, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x63, 0x00, 0x08, 0xA5, 0x00, 0x09, 0x29, 0x00, 0x08, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A0, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xC2, 0x00, 0x08, 0x02, 0x00, 0x1F, 0xE2, 0x00, 0x10, 0x1F, 0x80, 0x33, 0xC2, 0x00, 0x30, 0x12, 0x00, 0x50, 0x1A, 0x00, 0x13, 0xCA, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x02, 0x00, 0x13, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x13, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A1, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x1F, 0xDF, 0x80, 0x10, 0x00, 0x00, 0x32, 0x51, 0x00, 0x32, 0x51, 0x00, 0x52, 0x51, 0x00, 0x12, 0xDB, 0x00, 0x12, 0x8A, 0x00, 0x10, 0x8A, 0x00, 0x10, 0xEA, 0x00, 0x13, 0x8A, 0x00, 0x16, 0x02, 0x00, 0x10, 0x3F, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x10, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x50, 0xD1, 0x00, 0x13, 0x13, 0x00, 0x10, 0x2A, 0x00, 0x10, 0xC8, 0x00, 0x13, 0x1C, 0x00, 0x10, 0x2A, 0x00, 0x10, 0xCB, 0x00, 0x13, 0x09, 0x80, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A3, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFC, 0x00, 0x30, 0x80, 0x00, 0x5F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x12, 0x48, 0x00, 0x16, 0x4F, 0x00, 0x19, 0x52, 0x00, 0x10, 0xE0, 0x00, 0x11, 0x50, 0x00, 0x12, 0x4C, 0x00, 0x14, 0x44, 0x00, 0x10, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A5, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x05, 0x24, 0x00, 0x04, 0xA8, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x2D, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x54, 0x00, 0x08, 0x50, 0x00, 0x08, 0x51, 0x00, 0x08, 0x91, 0x00, 0x0B, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A7, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x1A, 0x00, 0x18, 0xE0, 0x00, 0x28, 0x84, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x86, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0C, 0x24, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x28, 0x00, 0x30, 0x32, 0x00, 0x5E, 0xFF, 0x00, 0x12, 0x44, 0x00, 0x12, 0xFE, 0x00, 0x13, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0xFC, 0x00, 0x13, 0x44, 0x00, 0x12, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50A9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x14, 0x00, 0x17, 0xBF, 0x00, 0x10, 0xA4, 0x00, 0x38, 0xE4, 0x00, 0x55, 0x3F, 0x00, 0x15, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x3F, 0x00, 0x15, 0x24, 0x00, 0x14, 0xA4, 0x00, 0x18, 0xA4, 0x00, 0x10, 0x3F, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50AA, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x7C, 0x00, 0x09, 0x02, 0x00, 0x1A, 0x44, 0x80, 0x13, 0xC7, 0x80, 0x30, 0x10, 0x00, 0x50, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x93, 0x80, 0x10, 0x20, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x33, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50AC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x18, 0x00, 0x00, 0x28, 0x88, 0x00, 0x29, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50AD, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x05, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x19, 0x09, 0x00, 0x19, 0xFF, 0x80, 0x29, 0x09, 0x00, 0x29, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50AF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x21, 0x00, 0x12, 0xBD, 0x00, 0x32, 0x45, 0x00, 0x32, 0xA9, 0x00, 0x52, 0x31, 0x00, 0x12, 0xE9, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x12, 0x99, 0x00, 0x12, 0x89, 0x80, 0x16, 0x82, 0x80, 0x14, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50B0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x11, 0x00, 0x0D, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x31, 0x29, 0x00, 0x51, 0x29, 0x00, 0x11, 0xAD, 0x00, 0x11, 0x6B, 0x00, 0x11, 0x29, 0x00, 0x11, 0xAD, 0x00, 0x11, 0x6B, 0x00, 0x11, 0x29, 0x00, 0x11, 0x69, 0x00, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50B2, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xE7, 0x80, 0x18, 0x85, 0x00, 0x1F, 0xFD, 0x00, 0x28, 0x95, 0x00, 0x28, 0x85, 0x00, 0x0B, 0xF5, 0x00, 0x08, 0x85, 0x00, 0x08, 0xFA, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x15, 0x00, 0x09, 0x25, 0x00, 0x0A, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50B3, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x3F, 0x80, 0x0F, 0xC4, 0x80, 0x08, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50B4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x00, 0x00, 0x09, 0x3E, 0x00, 0x19, 0x22, 0x00, 0x11, 0x22, 0x00, 0x31, 0x3E, 0x00, 0x51, 0x00, 0x00, 0x11, 0x77, 0x00, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x77, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50B5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50B7, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x0B, 0x24, 0x80, 0x08, 0x48, 0x80, 0x08, 0x91, 0x00, 0x0B, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50B9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x82, 0x00, 0x10, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x80, 0x11, 0x84, 0x80, 0x17, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50BA, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0xEF, 0x00, 0x09, 0x91, 0x00, 0x1B, 0x53, 0x00, 0x10, 0xAA, 0x00, 0x30, 0x44, 0x00, 0x30, 0x82, 0x00, 0x53, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50BB, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x72, 0x00, 0x32, 0x8A, 0x00, 0x53, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x12, 0x83, 0x00, 0x14, 0xFD, 0x00, 0x11, 0x84, 0x00, 0x12, 0x48, 0x00, 0x14, 0x30, 0x00, 0x10, 0x48, 0x00, 0x11, 0x87, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50BD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x18, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50BE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x3F, 0x80, 0x09, 0x04, 0x00, 0x09, 0x1F, 0x00, 0x19, 0x11, 0x00, 0x19, 0x71, 0x00, 0x29, 0x9F, 0x00, 0x29, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x1F, 0x00, 0x09, 0x11, 0x00, 0x09, 0x51, 0x00, 0x09, 0x5F, 0x00, 0x09, 0xD1, 0x00, 0x08, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50C0, { 0x00, 0x00, 0x00, 0x04, 0xAA, 0x00, 0x04, 0xAA, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0xAA, 0x00, 0x19, 0xAA, 0x00, 0x13, 0x3B, 0x80, 0x30, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50C2, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x19, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0xE4, 0x00, 0x10, 0x3E, 0x00, 0x13, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50C3, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x11, 0x44, 0x00, 0x31, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x56, 0x00, 0x80, 0x15, 0xFC, 0x80, 0x11, 0x24, 0x80, 0x11, 0xFC, 0x80, 0x11, 0x24, 0x80, 0x11, 0xFC, 0x80, 0x11, 0x24, 0x80, 0x11, 0x2D, 0x80, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50C4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x0C, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x24, 0x80, 0x11, 0x24, 0x80, 0x31, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50C5, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x44, 0x00, 0x0A, 0x7C, 0x00, 0x2A, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50C7, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xEF, 0x00, 0x0C, 0x63, 0x00, 0x08, 0xA5, 0x00, 0x18, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x30, 0x11, 0x00, 0x50, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x10, 0x10, 0x00, 0x10, 0xE4, 0x00, 0x10, 0x19, 0x00, 0x10, 0xE2, 0x00, 0x10, 0x0C, 0x00, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50C9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x05, 0x14, 0x00, 0x08, 0xA2, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50CA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x24, 0x80, 0x19, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x09, 0xFE, 0x00, 0x0E, 0x45, 0x80, 0x08, 0x4C, 0x00, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50CC, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xF4, 0x00, 0x18, 0x8F, 0x80, 0x13, 0xE9, 0x00, 0x32, 0xB9, 0x00, 0x32, 0xA9, 0x00, 0x53, 0xED, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xA7, 0x00, 0x13, 0xE2, 0x00, 0x10, 0x82, 0x00, 0x17, 0xF7, 0x00, 0x10, 0x85, 0x00, 0x10, 0x8D, 0x80, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50CD, { 0x00, 0x00, 0x00, 0x08, 0x64, 0x00, 0x0B, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xF4, 0x00, 0x10, 0x8F, 0x80, 0x37, 0xF4, 0x80, 0x34, 0x94, 0x80, 0x57, 0xF4, 0x80, 0x14, 0x94, 0x80, 0x17, 0xF4, 0x80, 0x10, 0x84, 0x80, 0x17, 0xF4, 0x80, 0x10, 0x8C, 0x80, 0x11, 0xE9, 0x80, 0x17, 0x19, 0x00, 0x10, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50CE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x0A, 0x28, 0x80, 0x1B, 0xEF, 0x80, 0x12, 0x08, 0x00, 0x32, 0x28, 0x80, 0x31, 0xE7, 0x80, 0x50, 0x00, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50CF, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x1B, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x71, 0x00, 0x08, 0x92, 0x00, 0x09, 0x2C, 0x00, 0x0E, 0x48, 0x00, 0x08, 0x9C, 0x00, 0x0B, 0x2A, 0x00, 0x08, 0xC9, 0x00, 0x0B, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50D0, { 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x51, 0x11, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50D1, { 0x00, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x05, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x19, 0xFE, 0x00, 0x2E, 0x45, 0x80, 0x28, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x7C, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x7C, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50D3, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x50, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x11, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50D4, { 0x00, 0x00, 0x00, 0x08, 0x9E, 0x00, 0x09, 0x01, 0x00, 0x0A, 0xFE, 0x80, 0x18, 0x28, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x29, 0x00, 0x31, 0xCF, 0x00, 0x51, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50D5, { 0x00, 0x00, 0x00, 0x04, 0x28, 0x00, 0x05, 0x29, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x28, 0x28, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50D6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50D8, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xA4, 0x00, 0x1C, 0x97, 0x80, 0x10, 0x85, 0x00, 0x37, 0xF5, 0x00, 0x34, 0x1D, 0x00, 0x54, 0x15, 0x00, 0x15, 0xD5, 0x00, 0x15, 0x57, 0x00, 0x15, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0xD7, 0x00, 0x14, 0x15, 0x00, 0x14, 0x35, 0x00, 0x10, 0x0D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50DA, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x09, 0x29, 0x00, 0x18, 0xC6, 0x00, 0x18, 0x82, 0x00, 0x2B, 0x01, 0x80, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50DC, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF4, 0x00, 0x0A, 0x28, 0x80, 0x19, 0x45, 0x00, 0x10, 0x82, 0x00, 0x33, 0x7D, 0x80, 0x30, 0x00, 0x00, 0x50, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50DD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x1B, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x32, 0x7E, 0x00, 0x32, 0x04, 0x00, 0x52, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x12, 0x18, 0x00, 0x12, 0xE7, 0x00, 0x12, 0x21, 0x00, 0x12, 0x72, 0x00, 0x13, 0xCF, 0x80, 0x14, 0x42, 0x00, 0x10, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50DE, { 0x00, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x04, 0xF1, 0x00, 0x08, 0x88, 0x80, 0x09, 0x04, 0x00, 0x18, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x29, 0x00, 0x80, 0x29, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x02, 0x80, 0x09, 0x05, 0x80, 0x09, 0x14, 0x80, 0x09, 0x54, 0x80, 0x0A, 0x51, 0x00, 0x0A, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50DF, { 0x00, 0x00, 0x00, 0x08, 0x91, 0x00, 0x09, 0x12, 0x00, 0x0B, 0x56, 0x80, 0x18, 0x91, 0x00, 0x11, 0x12, 0x80, 0x31, 0x57, 0x80, 0x33, 0xD2, 0x00, 0x50, 0x11, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x11, 0x89, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x44, 0x00, 0x13, 0x0A, 0x80, 0x12, 0x13, 0x80, 0x16, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50E2, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x0B, 0xF1, 0x00, 0x19, 0x23, 0x00, 0x10, 0x92, 0x00, 0x33, 0xFF, 0x80, 0x32, 0x00, 0x80, 0x52, 0x82, 0x80, 0x10, 0xE2, 0x00, 0x11, 0xAF, 0x80, 0x11, 0x2A, 0x00, 0x12, 0xEA, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xDF, 0x80, 0x11, 0x82, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50E3, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xEF, 0x80, 0x18, 0x82, 0x00, 0x10, 0x82, 0x00, 0x33, 0xEF, 0x80, 0x31, 0x45, 0x00, 0x51, 0x29, 0x00, 0x12, 0x00, 0x80, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50E4, { 0x00, 0x00, 0x00, 0x05, 0xEF, 0x00, 0x05, 0x29, 0x00, 0x0D, 0xEF, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50E5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x2F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0xE4, 0x00, 0x0F, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x08, 0x88, 0x80, 0x0B, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50E6, { 0x00, 0x00, 0x00, 0x04, 0x85, 0x00, 0x04, 0x85, 0x80, 0x0C, 0x84, 0x80, 0x0B, 0xE4, 0x00, 0x18, 0x1F, 0x80, 0x13, 0xE4, 0x00, 0x32, 0x24, 0x00, 0x52, 0x24, 0x00, 0x12, 0x2E, 0x00, 0x13, 0xEA, 0x00, 0x10, 0x8A, 0x00, 0x12, 0xCA, 0x00, 0x12, 0xAA, 0x00, 0x14, 0x9A, 0x80, 0x10, 0x92, 0x80, 0x11, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50E7, { 0x00, 0x00, 0x00, 0x04, 0x38, 0x00, 0x04, 0x04, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x1B, 0xFF, 0x80, 0x1D, 0x93, 0x00, 0x29, 0x55, 0x00, 0x29, 0x55, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50E8, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x82, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x30, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50E9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x0A, 0x28, 0x80, 0x1B, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x33, 0xEF, 0x80, 0x32, 0x00, 0x80, 0x52, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x4C, 0x80, 0x12, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50EC, { 0x00, 0x00, 0x00, 0x04, 0xA0, 0x00, 0x04, 0x92, 0x00, 0x04, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x0B, 0x14, 0x00, 0x1D, 0xFE, 0x00, 0x29, 0x10, 0x00, 0x49, 0x14, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x10, 0x00, 0x09, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0x49, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50ED, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x09, 0x54, 0x00, 0x09, 0x54, 0x00, 0x1F, 0xFF, 0x00, 0x19, 0x54, 0x00, 0x29, 0x54, 0x00, 0x29, 0x54, 0x80, 0x0A, 0x67, 0x80, 0x0D, 0x80, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50EE, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x18, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x50, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50EF, { 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x30, 0xD6, 0x00, 0x33, 0x93, 0x80, 0x50, 0x90, 0x00, 0x10, 0xE2, 0x00, 0x11, 0xAF, 0x80, 0x13, 0x2A, 0x00, 0x10, 0xEA, 0x00, 0x10, 0x5F, 0x80, 0x10, 0xC2, 0x00, 0x11, 0x82, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50F1, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x09, 0xF8, 0x00, 0x09, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x31, 0x12, 0x00, 0x51, 0x24, 0x00, 0x11, 0x7F, 0x00, 0x11, 0xC8, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x48, 0x00, 0x13, 0x7E, 0x00, 0x12, 0x48, 0x00, 0x16, 0x7F, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50F2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x1B, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x33, 0xFF, 0x00, 0x51, 0x02, 0x00, 0x11, 0xC2, 0x00, 0x13, 0x5F, 0x80, 0x12, 0x42, 0x00, 0x15, 0xCA, 0x00, 0x10, 0x92, 0x00, 0x11, 0xBF, 0x80, 0x13, 0x02, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50F3, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x52, 0x00, 0x32, 0x52, 0x00, 0x53, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x17, 0xFF, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x24, 0x00, 0x12, 0x23, 0x00, 0x14, 0x22, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50F5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x92, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50F6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x52, 0x00, 0x1A, 0x52, 0x00, 0x13, 0xDE, 0x00, 0x30, 0x50, 0x00, 0x37, 0xDF, 0x00, 0x54, 0x51, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x10, 0x50, 0x00, 0x10, 0x60, 0x80, 0x10, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50F9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x49, 0x00, 0x1B, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50FA, { 0x00, 0x00, 0x00, 0x02, 0x7C, 0x00, 0x02, 0x44, 0x00, 0x06, 0x44, 0x00, 0x04, 0x7C, 0x00, 0x0C, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x19, 0x29, 0x00, 0x39, 0x29, 0x00, 0x69, 0xEF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50FB, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0xE4, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x20, 0x00, 0x19, 0x29, 0x00, 0x19, 0xEA, 0x00, 0x29, 0x0A, 0x00, 0x29, 0x1F, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0xE4, 0x00, 0x0B, 0x24, 0x00, 0x0D, 0x3F, 0x80, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xE4, 0x00, 0x09, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x50FE, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x0B, 0xFC, 0x00, 0x09, 0x21, 0x00, 0x18, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x10, 0x80, 0x31, 0x49, 0x00, 0x51, 0x42, 0x80, 0x12, 0x3E, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x11, 0x82, 0x00, 0x13, 0x4C, 0x00, 0x10, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x50FF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x44, 0x80, 0x18, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0xFE, 0x80, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5100, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x72, 0x00, 0x0B, 0xD1, 0x00, 0x08, 0x90, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x89, 0x00, 0x08, 0xFA, 0x00, 0x0F, 0x84, 0x80, 0x08, 0x8A, 0x80, 0x09, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5101, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x04, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x19, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x0B, 0xC7, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x7C, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5102, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x49, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x48, 0x00, 0x12, 0x45, 0x00, 0x14, 0x72, 0x00, 0x11, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5103, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x31, 0x7D, 0x00, 0x31, 0x45, 0x00, 0x51, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5104, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x18, 0x28, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x09, 0x48, 0x80, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5106, { 0x00, 0x00, 0x00, 0x05, 0x22, 0x00, 0x05, 0x22, 0x00, 0x0F, 0xFC, 0x00, 0x09, 0x27, 0x80, 0x19, 0x29, 0x00, 0x18, 0x8D, 0x00, 0x29, 0x15, 0x00, 0x29, 0xF5, 0x00, 0x0A, 0x15, 0x00, 0x0D, 0xD5, 0x00, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0xD6, 0x00, 0x08, 0x15, 0x00, 0x08, 0x29, 0x00, 0x08, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5107, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x49, 0x00, 0x09, 0x49, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x50, 0x80, 0x10, 0x93, 0x00, 0x11, 0x8C, 0x00, 0x12, 0xB3, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5108, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x0C, 0xC6, 0x00, 0x0B, 0xBB, 0x80, 0x18, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x51, 0x55, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5109, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x83, 0x00, 0x1B, 0x00, 0x80, 0x18, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x29, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0x45, 0x00, 0x0A, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x510B, { 0x00, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x88, 0x00, 0x0B, 0xFF, 0x80, 0x19, 0x22, 0x00, 0x11, 0xC3, 0x80, 0x31, 0x3E, 0x00, 0x31, 0x00, 0x00, 0x51, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x510C, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0B, 0xE4, 0x00, 0x1A, 0x2F, 0x80, 0x13, 0xE9, 0x00, 0x32, 0x39, 0x00, 0x33, 0xE9, 0x00, 0x50, 0x8D, 0x00, 0x17, 0xF5, 0x00, 0x11, 0x07, 0x00, 0x11, 0xE2, 0x00, 0x11, 0x22, 0x00, 0x13, 0x27, 0x00, 0x12, 0x65, 0x00, 0x16, 0x4D, 0x80, 0x14, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x510D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x45, 0x00, 0x0D, 0x29, 0x00, 0x09, 0x93, 0x00, 0x19, 0x29, 0x00, 0x11, 0x45, 0x00, 0x31, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x13, 0x03, 0x80, 0x10, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x13, 0xA4, 0x00, 0x10, 0x18, 0x00, 0x10, 0x6E, 0x00, 0x13, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x510E, { 0x00, 0x00, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x8B, 0x00, 0x0B, 0xE9, 0x00, 0x18, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x30, 0x88, 0x00, 0x33, 0xEA, 0x00, 0x50, 0x8A, 0x00, 0x13, 0xEA, 0x00, 0x12, 0xAA, 0x00, 0x13, 0xEE, 0x00, 0x12, 0xA4, 0x00, 0x13, 0xE4, 0x80, 0x10, 0x8E, 0x80, 0x13, 0xEB, 0x80, 0x10, 0x99, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5110, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x00, 0x80, 0x08, 0xFF, 0x00, 0x18, 0x52, 0x00, 0x11, 0x94, 0x00, 0x30, 0x18, 0x00, 0x50, 0xFF, 0x00, 0x13, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5112, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x10, 0x80, 0x19, 0xD7, 0x00, 0x28, 0x10, 0x00, 0x29, 0xD7, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x2B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5114, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x80, 0x50, 0xFE, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x01, 0x00, 0x13, 0xDF, 0x80, 0x12, 0x49, 0x00, 0x13, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5115, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x1B, 0xD7, 0x80, 0x11, 0x55, 0x00, 0x31, 0x55, 0x00, 0x52, 0xD6, 0x80, 0x10, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x13, 0x01, 0x00, 0x16, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5116, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xE4, 0x00, 0x0A, 0x84, 0x00, 0x1A, 0x8F, 0x80, 0x13, 0xE8, 0x00, 0x32, 0x38, 0x00, 0x33, 0xE0, 0x00, 0x52, 0x87, 0x80, 0x12, 0x80, 0x00, 0x13, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5117, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x5F, 0x80, 0x0B, 0x81, 0x00, 0x1A, 0x0A, 0x00, 0x12, 0x44, 0x00, 0x31, 0xDF, 0x80, 0x32, 0x04, 0x80, 0x53, 0xC5, 0x00, 0x15, 0x14, 0x00, 0x11, 0x17, 0x00, 0x17, 0xD4, 0x00, 0x11, 0x14, 0x00, 0x11, 0x94, 0x00, 0x11, 0x5C, 0x00, 0x12, 0x36, 0x00, 0x14, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5118, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x12, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x12, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x11, 0x49, 0x00, 0x12, 0x24, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5119, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x7F, 0x00, 0x0B, 0x49, 0x00, 0x19, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x33, 0x7F, 0x80, 0x31, 0x00, 0x00, 0x50, 0x7E, 0x00, 0x17, 0x42, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x40, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x80, 0x00, 0x16, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x511A, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x31, 0xFF, 0x00, 0x50, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x20, 0x80, 0x12, 0x7E, 0x80, 0x10, 0xC2, 0x00, 0x11, 0xB6, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x38, 0x00, 0x11, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x511B, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0E, 0xAA, 0x00, 0x18, 0xAA, 0x00, 0x13, 0xFF, 0x80, 0x30, 0xAA, 0x00, 0x30, 0xAA, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0x02, 0x00, 0x11, 0xEF, 0x00, 0x13, 0x2A, 0x00, 0x16, 0xAA, 0x00, 0x10, 0x7F, 0x80, 0x11, 0xC2, 0x00, 0x17, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x511C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x20, 0x80, 0x12, 0x50, 0x80, 0x31, 0x45, 0x00, 0x32, 0x7C, 0x80, 0x50, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x511D, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x19, 0x45, 0x00, 0x12, 0x28, 0x80, 0x30, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x01, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x511E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x19, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x31, 0x11, 0x00, 0x31, 0xBB, 0x00, 0x51, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x511F, { 0x00, 0x00, 0x00, 0x04, 0x92, 0x00, 0x04, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x1A, 0xFE, 0x80, 0x18, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5121, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x0A, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x0B, 0xEF, 0x80, 0x0A, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x0B, 0xEF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5123, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x42, 0x00, 0x1A, 0xFF, 0x00, 0x12, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x32, 0x00, 0x00, 0x52, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x16, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x1C, 0x42, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5127, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0x82, 0x00, 0x1B, 0xEF, 0x80, 0x10, 0x82, 0x00, 0x31, 0x45, 0x00, 0x32, 0x28, 0x80, 0x50, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x11, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5128, { 0x00, 0x00, 0x00, 0x08, 0x61, 0x80, 0x0B, 0xCF, 0x00, 0x0A, 0x08, 0x00, 0x1B, 0xEF, 0x80, 0x12, 0x8A, 0x00, 0x34, 0x92, 0x00, 0x30, 0x00, 0x00, 0x51, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x17, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x512A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x50, 0x80, 0x09, 0x4B, 0x00, 0x0A, 0x7E, 0x80, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x28, 0x00, 0x08, 0x78, 0x00, 0x0B, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x512C, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x8F, 0x00, 0x0F, 0xF9, 0x00, 0x18, 0x89, 0x00, 0x13, 0xEF, 0x00, 0x30, 0x89, 0x00, 0x37, 0xF9, 0x00, 0x50, 0x0F, 0x00, 0x13, 0xE9, 0x00, 0x12, 0xA9, 0x00, 0x12, 0xAF, 0x00, 0x12, 0xAA, 0x00, 0x13, 0xEA, 0x00, 0x12, 0x2A, 0x80, 0x12, 0x2A, 0x80, 0x12, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x512D, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x9F, 0x00, 0x0F, 0xF1, 0x00, 0x09, 0x51, 0x00, 0x19, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x33, 0xF1, 0x00, 0x50, 0x9F, 0x00, 0x10, 0x91, 0x00, 0x13, 0xF1, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xCA, 0x00, 0x12, 0xAA, 0x00, 0x14, 0x9A, 0x80, 0x10, 0x92, 0x80, 0x10, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x512F, { 0x00, 0x00, 0x00, 0x08, 0xA4, 0x00, 0x09, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x48, 0x00, 0x17, 0xFF, 0x80, 0x31, 0x02, 0x00, 0x33, 0xFF, 0x00, 0x55, 0x10, 0x80, 0x11, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x12, 0xA8, 0x80, 0x16, 0xA4, 0x80, 0x14, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5131, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xF7, 0x80, 0x1A, 0x24, 0x00, 0x11, 0x47, 0x80, 0x37, 0xF0, 0x80, 0x30, 0x07, 0x80, 0x53, 0xE4, 0x00, 0x12, 0x27, 0x80, 0x13, 0xE4, 0x00, 0x12, 0x27, 0x80, 0x13, 0xE4, 0x00, 0x12, 0x27, 0x80, 0x12, 0x24, 0x00, 0x12, 0x24, 0x80, 0x12, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5132, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0xC4, 0x80, 0x08, 0x1F, 0x00, 0x0F, 0xE5, 0x00, 0x18, 0x06, 0x00, 0x18, 0x3F, 0x80, 0x2B, 0xC6, 0x00, 0x28, 0x09, 0x00, 0x0B, 0xD0, 0x00, 0x08, 0x2F, 0x00, 0x08, 0x49, 0x00, 0x0B, 0xCF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xCF, 0x00, 0x0A, 0x49, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5133, { 0x00, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x0B, 0x08, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x88, 0x00, 0x30, 0xEF, 0x00, 0x50, 0x88, 0x80, 0x11, 0xE7, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xC8, 0x80, 0x13, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5134, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x19, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x31, 0xEF, 0x00, 0x30, 0x44, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x80, 0x13, 0x85, 0x00, 0x10, 0xF2, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5135, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x0B, 0x66, 0x00, 0x18, 0x3C, 0x00, 0x14, 0x66, 0x00, 0x37, 0xFF, 0x80, 0x34, 0x92, 0x00, 0x54, 0xD6, 0x00, 0x14, 0xBA, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0xAA, 0x00, 0x11, 0x29, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5137, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xEF, 0x00, 0x1A, 0xAB, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x84, 0x00, 0x0A, 0xF7, 0x80, 0x0A, 0x84, 0x00, 0x0A, 0xB4, 0x80, 0x0D, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5138, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x30, 0x85, 0x00, 0x33, 0x0F, 0x80, 0x51, 0x5A, 0x00, 0x10, 0x8A, 0x00, 0x11, 0x2F, 0x00, 0x13, 0xEA, 0x00, 0x10, 0xAA, 0x00, 0x10, 0x8F, 0x00, 0x12, 0xAA, 0x00, 0x14, 0xAA, 0x00, 0x10, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5139, { 0x00, 0x00, 0x00, 0x0A, 0x8A, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x92, 0x00, 0x1B, 0xEF, 0x80, 0x11, 0x45, 0x00, 0x31, 0x65, 0x00, 0x32, 0x49, 0x80, 0x51, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x513A, { 0x00, 0x00, 0x00, 0x05, 0x45, 0x00, 0x05, 0x45, 0x00, 0x0F, 0xFA, 0x00, 0x09, 0x4F, 0x80, 0x0B, 0xFA, 0x00, 0x1A, 0xAA, 0x00, 0x1A, 0xAF, 0x80, 0x2B, 0xEA, 0x00, 0x08, 0x8A, 0x00, 0x0B, 0xEA, 0x00, 0x08, 0x8F, 0x80, 0x0F, 0xFA, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x2F, 0x80, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x513B, { 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x08, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x82, 0x80, 0x12, 0xFE, 0x80, 0x30, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x93, 0x00, 0x11, 0x55, 0x00, 0x11, 0x39, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x49, 0x00, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x513C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x18, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x2A, 0xF4, 0x00, 0x2A, 0x44, 0x00, 0x0B, 0xF7, 0x80, 0x0A, 0xA9, 0x00, 0x0A, 0xF5, 0x00, 0x0A, 0xA2, 0x00, 0x0A, 0xE2, 0x00, 0x0A, 0xB5, 0x00, 0x0D, 0xE5, 0x00, 0x0C, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x513F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x80, 0x08, 0x08, 0x80, 0x10, 0x0F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5141, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x04, 0x7F, 0x00, 0x1F, 0x90, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5142, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0xA0, 0x00, 0x03, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5143, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5145, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0x91, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x04, 0x1F, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5146, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x11, 0x11, 0x80, 0x09, 0x16, 0x00, 0x05, 0x18, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x18, 0x00, 0x03, 0x14, 0x00, 0x0D, 0x12, 0x00, 0x31, 0x11, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5147, { 0x00, 0x00, 0x00, 0x13, 0x09, 0x00, 0x10, 0xD1, 0x00, 0x10, 0x21, 0x00, 0x10, 0x51, 0x00, 0x10, 0x89, 0x00, 0x13, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5148, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5149, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x80, 0x08, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x514A, { 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x1D, 0x0E, 0x00, 0x73, 0x03, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x1C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x514B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x80, 0x08, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x514C, { 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x03, 0x80, 0x37, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x514D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x80, 0x08, 0x20, 0x80, 0x30, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x514E, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xC1, 0x00, 0x00, 0xC8, 0x00, 0x01, 0x44, 0x00, 0x01, 0x40, 0x80, 0x02, 0x40, 0x80, 0x0C, 0x7F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x514F, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x30, 0x88, 0x00, 0x21, 0x88, 0x00, 0x61, 0x08, 0x80, 0x03, 0x09, 0x80, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5150, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5151, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x28, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x0A, 0x28, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x08, 0x1F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5152, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x1E, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5153, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x1F, 0x9F, 0x80, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x7F, 0xBF, 0x80, 0x02, 0x02, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x0E, 0x0E, 0x00, 0x0A, 0x8A, 0x00, 0x1A, 0x9A, 0x80, 0x31, 0xB2, 0x80, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5154, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x18, 0x40, 0x00, 0x7F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0x20, 0x00, 0x02, 0x2C, 0x00, 0x06, 0x26, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x13, 0xF2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5156, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x09, 0x0C, 0x00, 0x11, 0x06, 0x00, 0x22, 0x22, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x48, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x42, 0x00, 0x04, 0x42, 0x00, 0x08, 0x3E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5157, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x0C, 0x1C, 0x00, 0x18, 0x06, 0x00, 0x3F, 0xFF, 0x00, 0x68, 0x05, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5158, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x22, 0x00, 0x00, 0x62, 0x00, 0x7F, 0x4F, 0x00, 0x14, 0xF9, 0x00, 0x14, 0x00, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x34, 0x7E, 0x00, 0x24, 0x00, 0x80, 0x66, 0x01, 0x80, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x515A, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x18, 0x86, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xFC, 0x80, 0x48, 0x04, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x515C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06, 0x80, 0x00, 0x19, 0xF7, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xF7, 0x00, 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x515F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x7F, 0x7F, 0x00, 0x48, 0x48, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x35, 0x64, 0x00, 0x26, 0x44, 0x80, 0x64, 0xC4, 0x80, 0x41, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5162, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x80, 0x20, 0xA0, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xBF, 0x80, 0x0A, 0x0A, 0x00, 0x0A, 0x0A, 0x00, 0x0A, 0x92, 0x80, 0x13, 0x12, 0x80, 0x14, 0x23, 0x80, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5164, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x4A, 0xA2, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xA2, 0x00, 0x08, 0xBE, 0x00, 0x7F, 0x80, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x14, 0xBE, 0x00, 0x14, 0xAA, 0x00, 0x14, 0xBE, 0x00, 0x35, 0x2A, 0x00, 0x24, 0x3E, 0x80, 0x66, 0x41, 0x80, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0x01, 0x00, 0x30, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5166, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x47, 0xC0, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0xE0, 0x00, 0x40, 0xA0, 0x00, 0x41, 0xB0, 0x00, 0x41, 0x10, 0x00, 0x43, 0x18, 0x00, 0x46, 0x0C, 0x00, 0x4C, 0x06, 0x00, 0x60, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5167, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x11, 0x00, 0x12, 0x09, 0x00, 0x1C, 0x07, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5168, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x06, 0x06, 0x00, 0x38, 0x01, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1E, 0x79, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x15, 0x55, 0x00, 0x18, 0xE3, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x516A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x06, 0x06, 0x00, 0x3B, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x0F, 0x12, 0x00, 0x09, 0x12, 0x00, 0x0F, 0x24, 0x00, 0x09, 0x48, 0x00, 0x0F, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x12, 0x00, 0x0B, 0x12, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x516B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x516C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x81, 0x00, 0x20, 0x80, 0x80, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x1E, 0x00, 0x09, 0xE1, 0x00, 0x3E, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x516D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x516E, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x22, 0x00, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5170, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5171, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5173, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x04, 0x0C, 0x00, 0x02, 0x10, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x07, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5174, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x10, 0x84, 0x00, 0x08, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x06, 0x10, 0x00, 0x08, 0x0C, 0x00, 0x10, 0x06, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5175, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0x01, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5176, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x04, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5178, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5179, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x11, 0x22, 0x00, 0x12, 0x24, 0x00, 0x3C, 0x78, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x3F, 0x7E, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x517B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x44, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x1A, 0x27, 0x00, 0x62, 0x22, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x517C, { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x31, 0x11, 0x80, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x03, 0x18, 0x00, 0x05, 0x14, 0x00, 0x09, 0x12, 0x00, 0x31, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x517D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x02, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x517E, { 0x00, 0x00, 0x00, 0x05, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5180, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x01, 0x10, 0x00, 0x07, 0x10, 0x80, 0x39, 0x1F, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5181, { 0x00, 0x00, 0x00, 0x22, 0x02, 0x00, 0x12, 0xFF, 0x00, 0x14, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0xA4, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x3E, 0xFF, 0x00, 0x09, 0x52, 0x00, 0x7F, 0x54, 0x00, 0x09, 0x48, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x63, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5184, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5185, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x21, 0xC1, 0x00, 0x21, 0x61, 0x00, 0x23, 0x31, 0x00, 0x26, 0x19, 0x00, 0x2C, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5186, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5188, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x24, 0x12, 0x00, 0x22, 0x32, 0x00, 0x21, 0x42, 0x00, 0x20, 0x82, 0x00, 0x21, 0x42, 0x00, 0x22, 0x32, 0x00, 0x24, 0x1A, 0x00, 0x28, 0x0A, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5189, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x518A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x518B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x518C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x31, 0x62, 0x00, 0x27, 0x42, 0x00, 0x60, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x518D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x518E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x518F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x26, 0x3D, 0x00, 0x2C, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5191, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5193, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5195, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x37, 0xFE, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x07, 0xFE, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x20, 0x80, 0x06, 0x20, 0x80, 0x38, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x08, 0x0F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5198, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x03, 0x40, 0x00, 0x02, 0x40, 0x00, 0x06, 0x40, 0x00, 0x0C, 0x40, 0x80, 0x18, 0x61, 0x80, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0x01, 0x00, 0x23, 0xF9, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x519B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x41, 0x0A, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x519C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x82, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8C, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x60, 0x00, 0x14, 0x40, 0x00, 0x24, 0x20, 0x00, 0x44, 0x18, 0x00, 0x05, 0x07, 0x00, 0x06, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x519D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x02, 0x80, 0x00, 0x03, 0x00, 0x0F, 0x02, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x02, 0x00, 0x3F, 0xD2, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x0E, 0x00, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x06, 0x83, 0x00, 0x38, 0xC6, 0x00, 0x03, 0x4C, 0x00, 0x0E, 0x60, 0x00, 0x38, 0xF0, 0x00, 0x03, 0x58, 0x00, 0x0E, 0x4E, 0x00, 0x78, 0xC3, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x06, 0x82, 0x00, 0x38, 0x86, 0x00, 0x05, 0x4C, 0x00, 0x06, 0x60, 0x00, 0x3A, 0xF0, 0x00, 0x03, 0x58, 0x00, 0x0E, 0x4E, 0x00, 0x78, 0xC3, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x3F, 0x00, 0x00, 0x12, 0xFC, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x6C, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x38, 0x00, 0x12, 0x10, 0x00, 0x12, 0x38, 0x00, 0x1E, 0x2C, 0x00, 0x32, 0x66, 0x00, 0x02, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x20, 0x00, 0x7F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x03, 0x2C, 0x00, 0x06, 0x26, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x40, 0x08, 0x80, 0x3F, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x7F, 0xA2, 0x00, 0x12, 0x36, 0x00, 0x12, 0x14, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x36, 0x00, 0x12, 0x63, 0x00, 0x32, 0x00, 0x80, 0x23, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x23, 0x81, 0x00, 0x0E, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x11, 0x00, 0x72, 0x49, 0x00, 0x09, 0x2B, 0x00, 0x09, 0x22, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51AA, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x37, 0xFD, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x4C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51AC, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x08, 0x00, 0x20, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0xB0, 0x00, 0x03, 0x0C, 0x00, 0x0C, 0x43, 0x80, 0x30, 0x20, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51AD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x19, 0xC6, 0x00, 0x70, 0x73, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51AF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x23, 0xFC, 0x00, 0x18, 0x08, 0x00, 0x09, 0x08, 0x00, 0x01, 0x08, 0x00, 0x05, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x0A, 0x00, 0x11, 0xFF, 0x00, 0x70, 0x02, 0x00, 0x10, 0x12, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x21, 0x00, 0x07, 0xA3, 0x00, 0x00, 0xB6, 0x00, 0x00, 0xB4, 0x00, 0x00, 0xA8, 0x00, 0x09, 0xA8, 0x00, 0x09, 0x2C, 0x00, 0x19, 0x24, 0x00, 0x13, 0x26, 0x00, 0x32, 0x23, 0x00, 0x26, 0x21, 0x80, 0x60, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x09, 0x84, 0x00, 0x09, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x30, 0x08, 0x00, 0x20, 0x08, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x50, 0x00, 0x18, 0x58, 0x00, 0x10, 0xC8, 0x00, 0x30, 0x8C, 0x00, 0x21, 0x86, 0x00, 0x63, 0x03, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x44, 0x00, 0x08, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x01, 0xFF, 0x80, 0x04, 0x14, 0x00, 0x0C, 0x34, 0x00, 0x08, 0x24, 0x00, 0x18, 0x64, 0x00, 0x10, 0xC4, 0x00, 0x31, 0x84, 0x00, 0x67, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x18, 0x48, 0x00, 0x10, 0x48, 0x00, 0x30, 0xC8, 0x00, 0x20, 0x88, 0x80, 0x61, 0x89, 0x80, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B6, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x1F, 0x80, 0x03, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B7, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x28, 0x00, 0x08, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x4E, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51B8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x92, 0x00, 0x19, 0x93, 0x00, 0x09, 0x11, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x19, 0x08, 0x00, 0x11, 0x0C, 0x00, 0x31, 0x04, 0x00, 0x21, 0x66, 0x80, 0x61, 0xC3, 0x80, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51BB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x90, 0x00, 0x00, 0x92, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x30, 0x50, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x11, 0x11, 0x00, 0x12, 0x11, 0x00, 0x10, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51BC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x90, 0x00, 0x18, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x01, 0x90, 0x00, 0x03, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0x44, 0x00, 0x30, 0xC4, 0x00, 0x20, 0x84, 0x80, 0x61, 0x84, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51BD, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x80, 0x10, 0x00, 0x80, 0x03, 0xF4, 0x80, 0x00, 0x84, 0x80, 0x00, 0x84, 0x80, 0x01, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x0A, 0x94, 0x80, 0x0A, 0x64, 0x80, 0x0C, 0x24, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x84, 0x80, 0x11, 0x04, 0x80, 0x22, 0x00, 0x80, 0x24, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51BE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0x82, 0x00, 0x20, 0x82, 0x00, 0x60, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51BF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x11, 0x00, 0x08, 0x11, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x41, 0xF8, 0x00, 0x32, 0x10, 0x00, 0x14, 0x24, 0x00, 0x03, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x70, 0x44, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x44, 0x00, 0x10, 0x40, 0x00, 0x11, 0x40, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x7E, 0x00, 0x18, 0xC4, 0x00, 0x09, 0x8C, 0x00, 0x03, 0x08, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0x31, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x68, 0x00, 0x10, 0x48, 0x00, 0x30, 0xC8, 0x00, 0x20, 0x88, 0x80, 0x61, 0x89, 0x80, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C4, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x11, 0xC8, 0x00, 0x12, 0x38, 0x00, 0x20, 0xE6, 0x00, 0x27, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x0A, 0x10, 0x80, 0x02, 0xFE, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x7C, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x1A, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x32, 0x00, 0x80, 0x22, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C6, { 0x00, 0x00, 0x00, 0x20, 0x44, 0x00, 0x10, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x88, 0x00, 0x01, 0x88, 0x00, 0x02, 0x88, 0x00, 0x02, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x20, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C7, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x0F, 0xE2, 0x00, 0x01, 0x22, 0x00, 0x13, 0x49, 0x00, 0x13, 0x88, 0x00, 0x15, 0x48, 0x00, 0x25, 0x50, 0x00, 0x69, 0x10, 0x00, 0x21, 0x24, 0x00, 0x21, 0x22, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C8, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x1E, 0x00, 0x19, 0xF3, 0x00, 0x08, 0x51, 0x80, 0x00, 0x88, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x18, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51C9, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x11, 0x00, 0x22, 0x10, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51CB, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0xFE, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x24, 0x44, 0x80, 0x24, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51CC, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x48, 0x00, 0x00, 0x88, 0x80, 0x09, 0x4F, 0x80, 0x0A, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x11, 0x84, 0x00, 0x16, 0x48, 0x00, 0x10, 0x30, 0x00, 0x10, 0x68, 0x00, 0x21, 0x86, 0x00, 0x26, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51CD, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x21, 0x11, 0x00, 0x22, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51CF, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x30, 0x09, 0x00, 0x18, 0x09, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0xEB, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAE, 0x00, 0x1A, 0xA4, 0x00, 0x12, 0xE4, 0x00, 0x32, 0x0E, 0x80, 0x26, 0x1A, 0x80, 0x64, 0x33, 0x80, 0x0C, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51D1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x08, 0x9A, 0x00, 0x0B, 0x71, 0x80, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x28, 0x00, 0x20, 0x6C, 0x00, 0x60, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51D2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x30, 0x6C, 0x00, 0x20, 0x28, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x08, 0x48, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x49, 0x00, 0x01, 0x49, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x30, 0x92, 0x00, 0x21, 0x93, 0x00, 0x63, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x0A, 0xFE, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x20, 0x44, 0x00, 0x60, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51D6, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x88, 0x00, 0x19, 0xFF, 0x00, 0x03, 0x10, 0x00, 0x05, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x10, 0x00, 0x31, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51D8, { 0x00, 0x00, 0x00, 0x02, 0x41, 0x00, 0x62, 0x47, 0x00, 0x37, 0xEC, 0x00, 0x12, 0x48, 0x00, 0x02, 0x48, 0x00, 0x03, 0xCF, 0x80, 0x02, 0x4A, 0x00, 0x02, 0x4A, 0x00, 0x13, 0xCA, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x37, 0xEA, 0x00, 0x22, 0x8A, 0x00, 0x22, 0xCA, 0x00, 0x66, 0x52, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51DB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x7D, 0x00, 0x01, 0x45, 0x00, 0x01, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x92, 0x00, 0x03, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51DC, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x39, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x21, 0x92, 0x00, 0x26, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51DD, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x12, 0x6F, 0x00, 0x03, 0x81, 0x00, 0x02, 0x2A, 0x00, 0x03, 0xE4, 0x00, 0x01, 0x1F, 0x80, 0x09, 0x05, 0x00, 0x0B, 0xE4, 0x00, 0x0C, 0x84, 0x00, 0x08, 0x97, 0x80, 0x17, 0xF4, 0x00, 0x10, 0x94, 0x00, 0x11, 0x54, 0x00, 0x11, 0x34, 0x00, 0x22, 0x2F, 0x80, 0x2C, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51DE, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x13, 0xEF, 0x00, 0x02, 0x49, 0x00, 0x02, 0xE9, 0x00, 0x0A, 0xA9, 0x00, 0x0A, 0xAF, 0x00, 0x0A, 0xA8, 0x00, 0x12, 0xE8, 0x00, 0x12, 0x48, 0x00, 0x22, 0x48, 0x80, 0x23, 0xEF, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x11, 0x00, 0x11, 0x08, 0x80, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x80, 0x30, 0x19, 0x80, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x84, 0x00, 0x04, 0x44, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x80, 0x08, 0x04, 0x80, 0x10, 0x07, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51E2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51E4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x17, 0xF8, 0x00, 0x10, 0x28, 0x00, 0x14, 0x28, 0x00, 0x12, 0x48, 0x00, 0x11, 0x48, 0x00, 0x10, 0x88, 0x00, 0x11, 0x48, 0x00, 0x12, 0x68, 0x00, 0x14, 0x28, 0x00, 0x10, 0x09, 0x00, 0x20, 0x05, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x31, 0x08, 0x00, 0x23, 0x08, 0x80, 0x66, 0x0D, 0x80, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51E6, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3E, 0x00, 0x10, 0x22, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x33, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x04, 0x62, 0x80, 0x0E, 0x42, 0x80, 0x0A, 0xC1, 0x80, 0x1B, 0x00, 0x00, 0x31, 0x80, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0xB6, 0x00, 0x30, 0x82, 0x80, 0x20, 0x83, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0xC4, 0x00, 0x11, 0xC4, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x14, 0x96, 0x00, 0x30, 0x82, 0x80, 0x20, 0x83, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x74, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x46, 0x00, 0x32, 0x42, 0x80, 0x2F, 0xFB, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51EB, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x12, 0x10, 0x00, 0x11, 0x50, 0x00, 0x10, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD4, 0x00, 0x04, 0x48, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x41, 0x00, 0x10, 0x41, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51ED, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x0C, 0x1C, 0x00, 0x18, 0xF0, 0x00, 0x30, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x13, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x13, 0xF4, 0x00, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x13, 0xF4, 0x00, 0x12, 0x14, 0x00, 0x12, 0x16, 0x00, 0x32, 0x12, 0x80, 0x23, 0xF3, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51EF, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x24, 0xBE, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xA4, 0x00, 0x01, 0x24, 0x00, 0x7F, 0xA4, 0x00, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x24, 0x00, 0x20, 0x24, 0x00, 0x23, 0x45, 0x00, 0x2C, 0x45, 0x00, 0x30, 0x83, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x04, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x82, 0x00, 0x2F, 0xFA, 0x80, 0x20, 0x01, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51F1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x01, 0x12, 0x00, 0x11, 0x22, 0x00, 0x0B, 0xE2, 0x80, 0x3E, 0x42, 0x80, 0x00, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x51F2, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x92, 0x00, 0x11, 0x22, 0x00, 0x17, 0xFA, 0x00, 0x11, 0x42, 0x00, 0x13, 0xF2, 0x00, 0x11, 0x52, 0x00, 0x17, 0xFA, 0x00, 0x11, 0x52, 0x00, 0x13, 0xF2, 0x00, 0x11, 0x62, 0x00, 0x13, 0x52, 0x00, 0x37, 0x5A, 0x80, 0x25, 0x4B, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F3, { 0x00, 0x00, 0x00, 0x0F, 0xC4, 0x00, 0x21, 0x29, 0x00, 0x12, 0x12, 0x00, 0x0F, 0xFC, 0x00, 0x70, 0x03, 0x80, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F4, { 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x10, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFE, 0x00, 0x09, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x30, 0x04, 0x80, 0x62, 0x92, 0x80, 0x04, 0x49, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F5, { 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F6, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x12, 0x09, 0x00, 0x11, 0x09, 0x00, 0x10, 0x91, 0x00, 0x10, 0x61, 0x00, 0x10, 0x21, 0x00, 0x10, 0x51, 0x00, 0x10, 0x91, 0x00, 0x11, 0x09, 0x00, 0x16, 0x09, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51FA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51FB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51FC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x9A, 0x00, 0x2F, 0xA2, 0x00, 0x21, 0xC2, 0x00, 0x22, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x24, 0x92, 0x00, 0x28, 0x92, 0x00, 0x30, 0x8E, 0x00, 0x22, 0x82, 0x00, 0x21, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x11, 0xE1, 0x00, 0x11, 0x25, 0x00, 0x14, 0x29, 0x00, 0x12, 0x21, 0x00, 0x10, 0x71, 0x00, 0x10, 0xA9, 0x00, 0x11, 0x27, 0x00, 0x16, 0x61, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xFD, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0x91, 0x00, 0x2E, 0x99, 0x00, 0x20, 0xAD, 0x00, 0x23, 0x81, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x51FF, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x0A, 0x28, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x11, 0x44, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x10, 0xA4, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x08, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x39, 0x00, 0x01, 0xE1, 0x00, 0x0F, 0x01, 0x00, 0x38, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5202, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x08, 0x41, 0x00, 0x04, 0x41, 0x00, 0x02, 0x41, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x04, 0x01, 0x00, 0x08, 0x02, 0x00, 0x10, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5204, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x10, 0x82, 0x00, 0x19, 0x82, 0x00, 0x0D, 0x02, 0x00, 0x07, 0x02, 0x00, 0x03, 0x86, 0x00, 0x02, 0xC4, 0x00, 0x06, 0x74, 0x00, 0x04, 0x1C, 0x00, 0x0C, 0x0F, 0x80, 0x18, 0x18, 0x00, 0x30, 0x10, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x11, 0x05, 0x00, 0x11, 0x05, 0x00, 0x33, 0x05, 0x00, 0x22, 0x05, 0x80, 0x62, 0x04, 0x80, 0x46, 0x04, 0x80, 0x04, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x70, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x80, 0x20, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5207, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0xD0, 0x80, 0x07, 0x10, 0x80, 0x3C, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x90, 0x80, 0x04, 0x90, 0x80, 0x07, 0xA0, 0x80, 0x00, 0x20, 0x80, 0x00, 0xC1, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5208, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x32, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x06, 0x11, 0x00, 0x02, 0x11, 0x00, 0x05, 0x11, 0x00, 0x05, 0x11, 0x00, 0x04, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x11, 0x00, 0x10, 0x11, 0x00, 0x20, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x520A, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x01, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x520B, { 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x07, 0x91, 0x00, 0x7C, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x0C, 0x01, 0x00, 0x08, 0x01, 0x00, 0x18, 0x01, 0x00, 0x30, 0x01, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x520D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x08, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x520E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x08, 0x04, 0x80, 0x0F, 0xF4, 0x80, 0x12, 0x54, 0x80, 0x22, 0x54, 0x80, 0x04, 0x94, 0x80, 0x04, 0x94, 0x80, 0x09, 0x14, 0x80, 0x11, 0x14, 0x80, 0x22, 0x14, 0x80, 0x04, 0x14, 0x80, 0x08, 0x24, 0x80, 0x10, 0x24, 0x80, 0x20, 0x44, 0x80, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5211, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xE9, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x81, 0x00, 0x10, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5212, { 0x00, 0x00, 0x00, 0x04, 0x81, 0x00, 0x04, 0xC9, 0x00, 0x04, 0x49, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x49, 0x00, 0x04, 0xC9, 0x00, 0x05, 0x89, 0x00, 0x07, 0x09, 0x00, 0x02, 0x09, 0x00, 0x07, 0x01, 0x00, 0x0D, 0x01, 0x00, 0x19, 0xA1, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5213, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x7F, 0xE9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0x21, 0x00, 0x31, 0xC1, 0x00, 0x63, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5214, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x7F, 0xE9, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0B, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0x81, 0x00, 0x30, 0xC1, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x86, 0x00, 0x07, 0x04, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x31, 0x18, 0x80, 0x21, 0x10, 0x80, 0x63, 0x31, 0x80, 0x46, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5216, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x20, 0x41, 0x00, 0x61, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5217, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xE1, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0F, 0xE9, 0x00, 0x08, 0x49, 0x00, 0x18, 0x49, 0x00, 0x14, 0x89, 0x00, 0x22, 0x89, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5218, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x1B, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0E, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x1B, 0x01, 0x00, 0x31, 0x81, 0x00, 0x60, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5219, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x1F, 0xE1, 0x00, 0x10, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x41, 0x00, 0x05, 0x01, 0x00, 0x04, 0x81, 0x00, 0x08, 0x45, 0x00, 0x30, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x521A, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xC2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x31, 0x92, 0x00, 0x31, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x24, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x29, 0x92, 0x00, 0x31, 0x92, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x22, 0x8A, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x521B, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x05, 0x01, 0x00, 0x04, 0x89, 0x00, 0x08, 0x69, 0x00, 0x08, 0x29, 0x00, 0x1F, 0x89, 0x00, 0x28, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0A, 0x89, 0x00, 0x09, 0x09, 0x00, 0x08, 0x01, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x07, 0xC5, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x521D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x1F, 0x08, 0x80, 0x01, 0x08, 0x80, 0x02, 0x08, 0x80, 0x04, 0x88, 0x80, 0x0D, 0x08, 0x80, 0x16, 0x08, 0x80, 0x25, 0x08, 0x80, 0x04, 0x08, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x20, 0x80, 0x04, 0x41, 0x00, 0x05, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5220, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1E, 0xF9, 0x00, 0x12, 0x91, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x3F, 0xFD, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x12, 0x91, 0x00, 0x16, 0x91, 0x00, 0x10, 0x95, 0x00, 0x21, 0x32, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5222, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x07, 0x04, 0x80, 0x0D, 0x84, 0x80, 0x18, 0xC4, 0x80, 0x30, 0x64, 0x80, 0x6F, 0xB4, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x04, 0x24, 0x80, 0x04, 0x24, 0x80, 0x04, 0x20, 0x80, 0x04, 0x20, 0x80, 0x04, 0xE0, 0x80, 0x04, 0x00, 0x80, 0x04, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5224, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x12, 0x89, 0x00, 0x12, 0x89, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x02, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x03, 0xE9, 0x00, 0x3E, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xC0, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x04, 0x04, 0x80, 0x04, 0x04, 0x80, 0x07, 0xE4, 0x80, 0x04, 0x24, 0x80, 0x04, 0x24, 0x80, 0x08, 0x24, 0x80, 0x08, 0x24, 0x80, 0x10, 0x40, 0x80, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5227, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x08, 0x09, 0x00, 0x08, 0x09, 0x00, 0x09, 0x09, 0x00, 0x19, 0x19, 0x00, 0x11, 0x13, 0x00, 0x17, 0x92, 0x00, 0x3C, 0xB2, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5228, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x32, 0x49, 0x00, 0x72, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x11, 0xC9, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x21, 0x00, 0x18, 0x61, 0x00, 0x0F, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5229, { 0x00, 0x00, 0x00, 0x03, 0x81, 0x00, 0x1E, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x06, 0x09, 0x00, 0x07, 0x09, 0x00, 0x0A, 0x89, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x09, 0x00, 0x22, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x522A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xE4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x3F, 0xFC, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x522B, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x0F, 0xE1, 0x00, 0x08, 0x41, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0F, 0xC9, 0x00, 0x0A, 0x09, 0x00, 0x02, 0x49, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x41, 0x00, 0x09, 0x41, 0x00, 0x10, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x522D, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xE1, 0x00, 0x00, 0x41, 0x00, 0x00, 0x89, 0x00, 0x01, 0x09, 0x00, 0x02, 0xC9, 0x00, 0x0C, 0x29, 0x00, 0x30, 0x09, 0x00, 0x0F, 0xE9, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, 0x00, 0x01, 0xE1, 0x00, 0x1F, 0x01, 0x00, 0x08, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x522E, { 0x00, 0x00, 0x00, 0x01, 0xC1, 0x00, 0x1E, 0x01, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC1, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5230, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x08, 0x89, 0x00, 0x13, 0xC9, 0x00, 0x3C, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x07, 0xC9, 0x00, 0x3C, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5231, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x09, 0x00, 0x7F, 0x89, 0x00, 0x12, 0x29, 0x00, 0x12, 0x29, 0x00, 0x12, 0x69, 0x00, 0x7F, 0xD9, 0x80, 0x12, 0x53, 0x80, 0x12, 0x52, 0x80, 0x12, 0x12, 0x80, 0x12, 0x12, 0x00, 0x12, 0x32, 0x00, 0x32, 0x26, 0x00, 0x22, 0x64, 0x00, 0x62, 0xDC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5232, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x7F, 0xE1, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5233, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x60, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x08, 0x09, 0x00, 0x1F, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5235, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xC9, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x01, 0x00, 0x71, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5236, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x22, 0x08, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0x40, 0x80, 0x12, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xF0, 0x80, 0x10, 0x14, 0x80, 0x10, 0x14, 0x80, 0x1F, 0xF4, 0x80, 0x10, 0x84, 0x80, 0x10, 0x84, 0x80, 0x17, 0xF4, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0xB4, 0x80, 0x20, 0x80, 0x80, 0x20, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5238, { 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x0C, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5239, { 0x00, 0x00, 0x00, 0x31, 0x81, 0x00, 0x0A, 0x11, 0x00, 0x04, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x11, 0x11, 0x00, 0x24, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x0C, 0x11, 0x00, 0x0E, 0x11, 0x00, 0x15, 0x11, 0x00, 0x14, 0x11, 0x00, 0x24, 0x11, 0x00, 0x04, 0x01, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x523A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x16, 0xC8, 0x80, 0x06, 0x08, 0x80, 0x0B, 0x08, 0x80, 0x0A, 0x88, 0x80, 0x12, 0x48, 0x80, 0x22, 0x00, 0x80, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x523B, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x04, 0x09, 0x00, 0x29, 0x09, 0x00, 0x11, 0x09, 0x00, 0x0A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x31, 0x09, 0x00, 0x03, 0x09, 0x00, 0x04, 0x89, 0x00, 0x08, 0x41, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x523C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x09, 0x00, 0x3E, 0x09, 0x00, 0x08, 0x09, 0x00, 0x08, 0x49, 0x00, 0x08, 0x69, 0x00, 0x7F, 0x59, 0x00, 0x10, 0x09, 0x00, 0x10, 0x0D, 0x00, 0x12, 0x1B, 0x00, 0x33, 0x11, 0x80, 0x21, 0x11, 0x00, 0x27, 0xB3, 0x00, 0x7C, 0xE2, 0x00, 0x40, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x523D, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x05, 0x01, 0x00, 0x08, 0x89, 0x00, 0x10, 0x69, 0x00, 0x2F, 0xA9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x81, 0x00, 0x1F, 0xC1, 0x00, 0x00, 0x45, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x523F, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x12, 0x42, 0x00, 0x12, 0x52, 0x00, 0x1F, 0xD2, 0x00, 0x04, 0x52, 0x00, 0x04, 0x12, 0x00, 0x07, 0xD2, 0x00, 0x08, 0x52, 0x00, 0x08, 0x92, 0x00, 0x18, 0x92, 0x00, 0x25, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5240, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x02, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x02, 0x00, 0x1C, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5241, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x0F, 0xC1, 0x00, 0x08, 0x81, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x12, 0x69, 0x00, 0x02, 0x49, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x07, 0x09, 0x00, 0x0A, 0xC9, 0x00, 0x12, 0x41, 0x00, 0x22, 0x01, 0x00, 0x02, 0x05, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5242, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x21, 0x00, 0x1F, 0xF1, 0x00, 0x04, 0x49, 0x00, 0x02, 0x89, 0x00, 0x01, 0x09, 0x00, 0x02, 0x89, 0x00, 0x0C, 0x69, 0x00, 0x34, 0x59, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x41, 0x00, 0x08, 0x41, 0x00, 0x10, 0x45, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5243, { 0x00, 0x00, 0x00, 0x08, 0x81, 0x00, 0x05, 0x01, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x22, 0x29, 0x00, 0x06, 0x29, 0x00, 0x06, 0x29, 0x00, 0x0A, 0x29, 0x00, 0x0A, 0xC9, 0x00, 0x12, 0x01, 0x00, 0x22, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5244, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x24, 0x89, 0x00, 0x49, 0x09, 0x00, 0x24, 0x89, 0x00, 0x12, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x05, 0xC1, 0x00, 0x1F, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5245, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x31, 0x81, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x07, 0xC1, 0x00, 0x7C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5247, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x81, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x81, 0x00, 0x20, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5249, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x47, 0x14, 0x80, 0x02, 0x04, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0xF0, 0x80, 0x7E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x524A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x0A, 0x80, 0x80, 0x12, 0x48, 0x80, 0x22, 0x28, 0x80, 0x02, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x10, 0x40, 0x80, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x524B, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x05, 0x09, 0x00, 0x05, 0x03, 0x00, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x524C, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x07, 0x09, 0x00, 0x06, 0x89, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x01, 0x00, 0x22, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x524D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x01, 0x00, 0x23, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x524F, { 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x33, 0x7F, 0x00, 0x12, 0x09, 0x00, 0x7F, 0x89, 0x00, 0x12, 0x09, 0x00, 0x12, 0x29, 0x00, 0x12, 0x29, 0x00, 0x7F, 0xB9, 0x00, 0x12, 0x13, 0x00, 0x12, 0x12, 0x00, 0x12, 0x1A, 0x00, 0x12, 0x16, 0x00, 0x12, 0x33, 0x80, 0x32, 0x26, 0x00, 0x22, 0x64, 0x00, 0x62, 0xDC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5250, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xE2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4A, 0x00, 0x1F, 0xCA, 0x00, 0x12, 0x4A, 0x00, 0x02, 0x0A, 0x00, 0x3F, 0xEA, 0x00, 0x22, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x25, 0x2A, 0x00, 0x28, 0xA2, 0x00, 0x20, 0x22, 0x00, 0x20, 0xAA, 0x00, 0x20, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5251, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x81, 0x00, 0x04, 0x49, 0x00, 0x08, 0x29, 0x00, 0x10, 0x99, 0x00, 0x2F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x09, 0x29, 0x00, 0x05, 0x29, 0x00, 0x05, 0x49, 0x00, 0x05, 0x49, 0x00, 0x00, 0xE1, 0x00, 0x1F, 0x01, 0x00, 0x08, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xE4, 0x80, 0x08, 0x24, 0x80, 0x0F, 0xE4, 0x80, 0x08, 0x24, 0x80, 0x0F, 0xE4, 0x80, 0x04, 0x04, 0x80, 0x08, 0x04, 0x80, 0x1F, 0xF4, 0x80, 0x22, 0x54, 0x80, 0x04, 0x94, 0x80, 0x09, 0x14, 0x80, 0x32, 0x24, 0x80, 0x04, 0x20, 0x80, 0x18, 0x40, 0x80, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5255, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x80, 0x04, 0x84, 0x80, 0x04, 0x84, 0x80, 0x3C, 0xF4, 0x80, 0x04, 0x84, 0x80, 0x04, 0x84, 0x80, 0x3C, 0xF4, 0x80, 0x04, 0x84, 0x80, 0x04, 0x84, 0x80, 0x1C, 0xF4, 0x80, 0x74, 0x84, 0x80, 0x04, 0x80, 0x80, 0x04, 0x80, 0x80, 0x0C, 0x80, 0x80, 0x18, 0x80, 0x80, 0x30, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5256, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x04, 0x80, 0x01, 0x04, 0x80, 0x1F, 0xF4, 0x80, 0x08, 0x24, 0x80, 0x04, 0x44, 0x80, 0x04, 0x44, 0x80, 0x3F, 0xFC, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x0F, 0xE4, 0x80, 0x08, 0x24, 0x80, 0x08, 0x24, 0x80, 0x08, 0x24, 0x80, 0x0F, 0xE0, 0x80, 0x08, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5257, { 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xC9, 0x00, 0x3C, 0x09, 0x00, 0x06, 0xC9, 0x00, 0x03, 0x09, 0x00, 0x0D, 0xA9, 0x00, 0x30, 0xE9, 0x00, 0x09, 0x09, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xC9, 0x00, 0x3C, 0x01, 0x00, 0x06, 0xC1, 0x00, 0x03, 0x01, 0x00, 0x0D, 0xA1, 0x00, 0x70, 0xE7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5258, { 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x7F, 0xC1, 0x00, 0x00, 0x01, 0x00, 0x13, 0x01, 0x00, 0x31, 0x81, 0x00, 0x60, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x525A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x04, 0x80, 0x7F, 0xF4, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE4, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x02, 0x24, 0x80, 0x7F, 0xF4, 0x80, 0x02, 0x20, 0x80, 0x3F, 0xE0, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x06, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x525B, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xE1, 0x00, 0x20, 0x29, 0x00, 0x28, 0xA9, 0x00, 0x25, 0x29, 0x00, 0x3F, 0xE9, 0x00, 0x22, 0x29, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x2F, 0xA9, 0x00, 0x28, 0xA9, 0x00, 0x20, 0x29, 0x00, 0x20, 0x21, 0x00, 0x20, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x525C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x20, 0x24, 0x80, 0x20, 0x24, 0x80, 0x10, 0x04, 0x80, 0x1D, 0xE4, 0x80, 0x15, 0x24, 0x80, 0x35, 0x24, 0x80, 0x25, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x09, 0x60, 0x80, 0x19, 0x00, 0x80, 0x11, 0x10, 0x80, 0x31, 0x30, 0x80, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x525D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x04, 0x20, 0x80, 0x07, 0xE4, 0x80, 0x08, 0x24, 0x80, 0x08, 0x44, 0x80, 0x17, 0xC4, 0x80, 0x01, 0x04, 0x80, 0x3F, 0xFC, 0x80, 0x01, 0x04, 0x80, 0x09, 0x24, 0x80, 0x05, 0x44, 0x80, 0x01, 0x84, 0x80, 0x03, 0x44, 0x80, 0x0D, 0x20, 0x80, 0x31, 0x10, 0x80, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x525E, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x7F, 0xE9, 0x00, 0x00, 0x89, 0x00, 0x3C, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x525F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3D, 0xE4, 0x80, 0x04, 0x24, 0x80, 0x35, 0xA4, 0x80, 0x08, 0x44, 0x80, 0x14, 0xA4, 0x80, 0x21, 0x14, 0x80, 0x00, 0x04, 0x80, 0x3D, 0xE4, 0x80, 0x04, 0x24, 0x80, 0x24, 0x24, 0x80, 0x19, 0x40, 0x80, 0x09, 0x40, 0x80, 0x14, 0x80, 0x80, 0x25, 0x40, 0x80, 0x42, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5260, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x04, 0x80, 0x02, 0x04, 0x80, 0x7F, 0xF4, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x32, 0x60, 0x80, 0x62, 0x30, 0x80, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5261, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x40, 0x80, 0x12, 0x88, 0x80, 0x13, 0x08, 0x80, 0x15, 0x08, 0x80, 0x04, 0x88, 0x80, 0x08, 0x48, 0x80, 0x10, 0x28, 0x80, 0x22, 0x08, 0x80, 0x02, 0x08, 0x80, 0x12, 0x48, 0x80, 0x12, 0x88, 0x80, 0x15, 0x08, 0x80, 0x04, 0x80, 0x80, 0x08, 0x40, 0x80, 0x30, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5263, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0x09, 0x00, 0x0D, 0x89, 0x00, 0x18, 0xC9, 0x00, 0x30, 0x69, 0x00, 0x6F, 0x89, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x22, 0x29, 0x00, 0x22, 0x29, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x01, 0x00, 0x07, 0x01, 0x00, 0x0D, 0x81, 0x00, 0x18, 0xC1, 0x00, 0x70, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5264, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x09, 0x00, 0x7F, 0xF9, 0x00, 0x10, 0x49, 0x00, 0x0D, 0x89, 0x00, 0x07, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x70, 0x79, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC1, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5265, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x09, 0x00, 0x01, 0x09, 0x00, 0x3F, 0x09, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x24, 0x89, 0x00, 0x35, 0x89, 0x00, 0x15, 0x09, 0x00, 0x0E, 0x01, 0x00, 0x15, 0x01, 0x00, 0x35, 0x81, 0x00, 0x64, 0xC1, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5266, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x04, 0x04, 0x80, 0x7F, 0xFC, 0x80, 0x08, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x12, 0x24, 0x80, 0x3F, 0xF4, 0x80, 0x52, 0x2C, 0x80, 0x12, 0x24, 0x80, 0x1F, 0xE4, 0x80, 0x12, 0x24, 0x80, 0x12, 0x24, 0x80, 0x1F, 0xE0, 0x80, 0x02, 0x08, 0x80, 0x03, 0x18, 0x80, 0x01, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5267, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x0F, 0xF1, 0x00, 0x08, 0x29, 0x00, 0x08, 0x29, 0x00, 0x0F, 0xE9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x49, 0x00, 0x0F, 0xE9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x29, 0x00, 0x0F, 0xF9, 0x00, 0x14, 0x29, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x27, 0xE5, 0x00, 0x04, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5269, { 0x00, 0x00, 0x00, 0x03, 0xC1, 0x00, 0x1E, 0x01, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x3F, 0xE9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x3F, 0xE9, 0x00, 0x06, 0x09, 0x00, 0x0B, 0x09, 0x00, 0x0A, 0x89, 0x00, 0x12, 0x41, 0x00, 0x22, 0x01, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x526A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x08, 0x92, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x82, 0x00, 0x11, 0x86, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x03, 0x01, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x526E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xC4, 0x80, 0x20, 0x44, 0x80, 0x20, 0x44, 0x80, 0x27, 0xC4, 0x80, 0x24, 0x44, 0x80, 0x24, 0x44, 0x80, 0x7F, 0xE4, 0x80, 0x40, 0x24, 0x80, 0x4F, 0x24, 0x80, 0x49, 0x24, 0x80, 0x49, 0x20, 0x80, 0x49, 0x20, 0x80, 0x4F, 0x20, 0x80, 0x40, 0x20, 0x80, 0x40, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x526F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xE0, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE0, 0x80, 0x20, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5270, { 0x00, 0x00, 0x00, 0x01, 0xC1, 0x00, 0x1F, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x7F, 0xF9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x3F, 0xE9, 0x00, 0x0A, 0x09, 0x00, 0x0B, 0x89, 0x00, 0x1A, 0xC1, 0x00, 0x32, 0x61, 0x00, 0x62, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5271, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x00, 0x1B, 0x09, 0x00, 0x71, 0xC9, 0x00, 0x1F, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xA9, 0x00, 0x24, 0x99, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8D, 0x00, 0x3F, 0x8B, 0x00, 0x0A, 0x09, 0x80, 0x1A, 0x09, 0x00, 0x13, 0x1B, 0x00, 0x31, 0x12, 0x00, 0x61, 0xB6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5272, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x3F, 0xE9, 0x00, 0x22, 0x29, 0x00, 0x03, 0xC9, 0x00, 0x1E, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC1, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5273, { 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x11, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x1B, 0x09, 0x00, 0x71, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5274, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x01, 0x00, 0x19, 0x01, 0x00, 0x0B, 0xC1, 0x00, 0x1E, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x80, 0x04, 0x84, 0x80, 0x08, 0x64, 0x80, 0x3F, 0xC4, 0x80, 0x00, 0x04, 0x80, 0x0F, 0xC4, 0x80, 0x08, 0x44, 0x80, 0x0F, 0xC4, 0x80, 0x08, 0x44, 0x80, 0x0F, 0xC4, 0x80, 0x08, 0x04, 0x80, 0x0F, 0xC4, 0x80, 0x18, 0x44, 0x80, 0x1F, 0xC0, 0x80, 0x28, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5277, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x08, 0x84, 0x80, 0x07, 0x04, 0x80, 0x18, 0xC4, 0x80, 0x3F, 0xE4, 0x80, 0x20, 0x04, 0x80, 0x29, 0x04, 0x80, 0x2F, 0xC4, 0x80, 0x29, 0x04, 0x80, 0x21, 0x00, 0x80, 0x27, 0xC0, 0x80, 0x61, 0x00, 0x80, 0x41, 0x00, 0x80, 0x1F, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5278, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x04, 0x80, 0x7F, 0xF4, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE4, 0x80, 0x02, 0x44, 0x80, 0x0F, 0xE4, 0x80, 0x78, 0x30, 0x80, 0x00, 0x40, 0x80, 0x7F, 0xF0, 0x80, 0x10, 0x40, 0x80, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xC9, 0x00, 0x18, 0xC9, 0x00, 0x29, 0x49, 0x00, 0x18, 0xC9, 0x00, 0x29, 0x49, 0x00, 0x04, 0x49, 0x00, 0x0E, 0x09, 0x00, 0x1B, 0x89, 0x00, 0x70, 0xE9, 0x00, 0x04, 0x09, 0x00, 0x39, 0x01, 0x00, 0x06, 0x41, 0x00, 0x38, 0x81, 0x00, 0x03, 0x01, 0x00, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x527D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xF0, 0x80, 0x04, 0x84, 0x80, 0x1F, 0xE4, 0x80, 0x14, 0xA4, 0x80, 0x14, 0xA4, 0x80, 0x1F, 0xE4, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xE4, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xF4, 0x80, 0x02, 0x04, 0x80, 0x12, 0x44, 0x80, 0x12, 0x24, 0x80, 0x22, 0x10, 0x80, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x527F, { 0x00, 0x00, 0x00, 0x08, 0x90, 0x80, 0x11, 0x20, 0x80, 0x22, 0x44, 0x80, 0x11, 0x24, 0x80, 0x08, 0x94, 0x80, 0x1F, 0xF4, 0x80, 0x11, 0x14, 0x80, 0x1F, 0xF4, 0x80, 0x11, 0x14, 0x80, 0x1F, 0xF4, 0x80, 0x01, 0x04, 0x80, 0x3F, 0xFC, 0x80, 0x03, 0x84, 0x80, 0x05, 0x40, 0x80, 0x09, 0x20, 0x80, 0x31, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xC0, 0x80, 0x08, 0x84, 0x80, 0x05, 0x04, 0x80, 0x7F, 0xE4, 0x80, 0x0A, 0x44, 0x80, 0x12, 0x84, 0x80, 0x26, 0x04, 0x80, 0x7F, 0xE4, 0x80, 0x49, 0x24, 0x80, 0x51, 0x24, 0x80, 0x6F, 0xE0, 0x80, 0x49, 0x20, 0x80, 0x49, 0x20, 0x80, 0x4F, 0x20, 0x80, 0x40, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5281, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x09, 0x41, 0x00, 0x0F, 0xE1, 0x00, 0x09, 0x09, 0x00, 0x09, 0x49, 0x00, 0x1F, 0xE9, 0x00, 0x29, 0x09, 0x00, 0x09, 0x49, 0x00, 0x0F, 0xE9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x49, 0x00, 0x0F, 0xE1, 0x00, 0x08, 0x01, 0x00, 0x15, 0x21, 0x00, 0x12, 0x95, 0x00, 0x22, 0x92, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xFE, 0x80, 0x28, 0x82, 0x80, 0x2D, 0xC2, 0x80, 0x25, 0x42, 0x80, 0x3F, 0xFE, 0x80, 0x22, 0x46, 0x80, 0x2A, 0x92, 0x80, 0x2A, 0x92, 0x80, 0x2A, 0x92, 0x80, 0x2A, 0x92, 0x80, 0x2F, 0xB8, 0x80, 0x62, 0x28, 0x80, 0x46, 0x28, 0x80, 0x4C, 0x6C, 0x80, 0x18, 0x45, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5283, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x1F, 0xC0, 0x80, 0x02, 0x44, 0x80, 0x3F, 0xF4, 0x80, 0x02, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x3F, 0xE4, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE4, 0x80, 0x01, 0xF0, 0x80, 0x3E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xF2, 0x80, 0x24, 0x92, 0x80, 0x24, 0x92, 0x80, 0x3F, 0xF2, 0x80, 0x08, 0x02, 0x80, 0x1F, 0xFA, 0x80, 0x32, 0x0A, 0x80, 0x7F, 0xCA, 0x80, 0x12, 0x4A, 0x80, 0x12, 0x4A, 0x80, 0x1F, 0xC8, 0x80, 0x02, 0x88, 0x80, 0x0F, 0xD8, 0x80, 0x38, 0x50, 0x80, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5287, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x03, 0xF0, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xFC, 0x80, 0x12, 0xC4, 0x80, 0x1F, 0x14, 0x80, 0x13, 0xF4, 0x80, 0x10, 0x04, 0x80, 0x1F, 0xF4, 0x80, 0x13, 0x04, 0x80, 0x15, 0xA4, 0x80, 0x1A, 0xC4, 0x80, 0x15, 0xC4, 0x80, 0x2A, 0xA4, 0x80, 0x24, 0x90, 0x80, 0x2B, 0x09, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5288, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xBF, 0x80, 0x38, 0x84, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x06, 0x02, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5289, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x19, 0xF4, 0x80, 0x10, 0x94, 0x80, 0x12, 0x94, 0x80, 0x11, 0x14, 0x80, 0x1F, 0x34, 0x80, 0x31, 0x84, 0x80, 0x02, 0x44, 0x80, 0x0C, 0x34, 0x80, 0x37, 0xC4, 0x80, 0x01, 0x04, 0x80, 0x1F, 0xE4, 0x80, 0x01, 0x44, 0x80, 0x09, 0x44, 0x80, 0x05, 0xF0, 0x80, 0x1F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x528A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x05, 0x04, 0x80, 0x18, 0xC4, 0x80, 0x77, 0x74, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x22, 0x24, 0x80, 0x2A, 0xA4, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xE4, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xC0, 0x80, 0x10, 0x40, 0x80, 0x1F, 0xC0, 0x80, 0x10, 0x40, 0x80, 0x1F, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x528C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x09, 0xF2, 0x80, 0x09, 0x02, 0x80, 0x3F, 0xFA, 0x80, 0x00, 0x52, 0x80, 0x00, 0x4A, 0x80, 0x3F, 0xFA, 0x80, 0x20, 0x22, 0x80, 0x2F, 0xA2, 0x80, 0x22, 0x22, 0x80, 0x2A, 0xAA, 0x80, 0x3A, 0xF0, 0x80, 0x23, 0x20, 0x80, 0x2C, 0x68, 0x80, 0x20, 0xA8, 0x80, 0x43, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x528D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0x05, 0x00, 0x80, 0x08, 0x84, 0x80, 0x10, 0x44, 0x80, 0x20, 0x24, 0x80, 0x3F, 0xC4, 0x80, 0x00, 0x04, 0x80, 0x3D, 0xE4, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x3D, 0xE4, 0x80, 0x08, 0x44, 0x80, 0x08, 0x44, 0x80, 0x14, 0xA0, 0x80, 0x23, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5290, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x08, 0x82, 0x00, 0x09, 0x12, 0x00, 0x1F, 0xD2, 0x00, 0x29, 0x12, 0x00, 0x0F, 0xD2, 0x00, 0x09, 0x12, 0x00, 0x09, 0xD2, 0x00, 0x08, 0x12, 0x00, 0x1F, 0xD2, 0x00, 0x08, 0x82, 0x00, 0x05, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0D, 0x8A, 0x00, 0x30, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5291, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x3F, 0xF8, 0x80, 0x02, 0xB4, 0x80, 0x3D, 0x44, 0x80, 0x15, 0x64, 0x80, 0x15, 0x54, 0x80, 0x15, 0xEC, 0x80, 0x29, 0x04, 0x80, 0x10, 0x14, 0x80, 0x10, 0x14, 0x80, 0x1F, 0xF4, 0x80, 0x10, 0x14, 0x80, 0x1F, 0xF4, 0x80, 0x10, 0x10, 0x80, 0x20, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5292, { 0x00, 0x00, 0x00, 0x02, 0x3F, 0x80, 0x05, 0x04, 0x80, 0x08, 0x84, 0x80, 0x10, 0x44, 0x80, 0x20, 0x24, 0x80, 0x1F, 0xC4, 0x80, 0x00, 0x0C, 0x80, 0x3D, 0xF4, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x3D, 0xE4, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x14, 0xA8, 0x80, 0x23, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5293, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x81, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xC1, 0x00, 0x11, 0x01, 0x00, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5294, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x00, 0x1B, 0x09, 0x00, 0x31, 0x89, 0x00, 0x60, 0xC9, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x29, 0x00, 0x3B, 0x99, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x8D, 0x00, 0x3B, 0x8B, 0x00, 0x00, 0x09, 0x80, 0x11, 0x09, 0x00, 0x11, 0x1B, 0x00, 0x3B, 0x92, 0x00, 0x6A, 0xB6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5295, { 0x00, 0x00, 0x00, 0x06, 0x18, 0x80, 0x3C, 0xF2, 0x80, 0x20, 0x82, 0x80, 0x3E, 0xFA, 0x80, 0x28, 0xA2, 0x80, 0x49, 0x22, 0x80, 0x00, 0x02, 0x80, 0x1F, 0xE2, 0x80, 0x10, 0x22, 0x80, 0x1F, 0xE2, 0x80, 0x10, 0x22, 0x80, 0x1F, 0xE0, 0x80, 0x10, 0x20, 0x80, 0x1F, 0xE0, 0x80, 0x08, 0x40, 0x80, 0x70, 0x39, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5296, { 0x00, 0x00, 0x00, 0x0F, 0x00, 0x80, 0x12, 0x04, 0x80, 0x7F, 0xC4, 0x80, 0x20, 0x44, 0x80, 0x3F, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x1D, 0xC4, 0x80, 0x11, 0x24, 0x80, 0x3C, 0xE4, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xC4, 0x80, 0x24, 0x40, 0x80, 0x3F, 0xC0, 0x80, 0x0A, 0x80, 0x80, 0x1A, 0x20, 0x80, 0x31, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5297, { 0x00, 0x00, 0x00, 0x28, 0xA0, 0x80, 0x3F, 0xFA, 0x80, 0x49, 0x22, 0x80, 0x3E, 0xFA, 0x80, 0x14, 0x52, 0x80, 0x16, 0x52, 0x80, 0x24, 0x9A, 0x80, 0x1F, 0xF2, 0x80, 0x10, 0x12, 0x80, 0x1F, 0xF2, 0x80, 0x10, 0x12, 0x80, 0x1F, 0xF0, 0x80, 0x10, 0x10, 0x80, 0x1F, 0xF0, 0x80, 0x08, 0x20, 0x80, 0x30, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5298, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x3F, 0xFA, 0x80, 0x24, 0x22, 0x80, 0x3E, 0xFA, 0x80, 0x24, 0x22, 0x80, 0x2D, 0x6A, 0x80, 0x2D, 0x6A, 0x80, 0x35, 0xAA, 0x80, 0x22, 0x42, 0x80, 0x2E, 0x72, 0x80, 0x22, 0x42, 0x80, 0x2E, 0x70, 0x80, 0x22, 0x40, 0x80, 0x6E, 0x70, 0x80, 0x42, 0x40, 0x80, 0x04, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x529A, { 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x80, 0x20, 0x0A, 0x80, 0x3F, 0xFA, 0x80, 0x20, 0x82, 0x80, 0x2E, 0xBA, 0x80, 0x20, 0x82, 0x80, 0x2F, 0xF2, 0x80, 0x2A, 0x52, 0x80, 0x2F, 0xFA, 0x80, 0x25, 0x0A, 0x80, 0x3F, 0xEA, 0x80, 0x29, 0x28, 0x80, 0x2F, 0xE8, 0x80, 0x21, 0x58, 0x80, 0x43, 0xD0, 0x80, 0x1E, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x529B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x04, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x529C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x18, 0x90, 0x00, 0x10, 0x90, 0x00, 0x11, 0x90, 0x00, 0x31, 0x10, 0x80, 0x21, 0x19, 0x80, 0x63, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x529D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x01, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x04, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x11, 0x42, 0x00, 0x21, 0x42, 0x00, 0x40, 0x82, 0x00, 0x01, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x529E, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0x18, 0x00, 0x19, 0x16, 0x00, 0x11, 0x13, 0x00, 0x22, 0x11, 0x00, 0x42, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x50, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x529F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0F, 0x21, 0x00, 0x38, 0x21, 0x00, 0x00, 0x41, 0x00, 0x00, 0x82, 0x00, 0x03, 0x02, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A0, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0F, 0x80, 0x1F, 0xE8, 0x80, 0x02, 0x28, 0x80, 0x02, 0x28, 0x80, 0x02, 0x28, 0x80, 0x02, 0x28, 0x80, 0x02, 0x28, 0x80, 0x04, 0x28, 0x80, 0x04, 0x28, 0x80, 0x04, 0x28, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x11, 0x8F, 0x80, 0x20, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x52A1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x13, 0x60, 0x00, 0x20, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0D, 0x18, 0x00, 0x71, 0x07, 0x00, 0x0F, 0xFA, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x50, 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xD0, 0x00, 0x08, 0x12, 0x00, 0x08, 0x7F, 0x00, 0x09, 0x12, 0x00, 0x0F, 0x92, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x25, 0x42, 0x00, 0x42, 0x54, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A3, { 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x40, 0x80, 0x00, 0x42, 0x00, 0x01, 0xCC, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x3E, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x06, 0x02, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A4, { 0x00, 0x00, 0x00, 0x01, 0x84, 0x00, 0x1E, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x3F, 0x80, 0x1F, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x11, 0x10, 0x80, 0x21, 0x11, 0x00, 0x21, 0x21, 0x00, 0x21, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A5, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x11, 0x0C, 0x80, 0x11, 0x48, 0x80, 0x31, 0x99, 0x80, 0x21, 0x31, 0x00, 0x60, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x01, 0x82, 0x00, 0x03, 0x06, 0x00, 0x0E, 0x04, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x88, 0x80, 0x18, 0x98, 0x80, 0x11, 0x91, 0x80, 0x31, 0x31, 0x00, 0x67, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A7, { 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x07, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x7F, 0xC8, 0x80, 0x04, 0x08, 0x80, 0x04, 0x18, 0x80, 0x04, 0x10, 0x80, 0x04, 0x31, 0x80, 0x04, 0x61, 0x00, 0x1C, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x00, 0x22, 0x00, 0x02, 0xFF, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x10, 0x22, 0x00, 0x12, 0x22, 0x00, 0x21, 0x42, 0x00, 0x7F, 0x42, 0x00, 0x20, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52A9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x21, 0x00, 0x17, 0xA1, 0x00, 0x38, 0x41, 0x00, 0x00, 0x8E, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52AA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x21, 0x00, 0x12, 0x12, 0x00, 0x12, 0x0C, 0x00, 0x2C, 0x0C, 0x00, 0x24, 0x32, 0x00, 0x0A, 0xC1, 0x80, 0x11, 0x00, 0x00, 0x20, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x04, 0x00, 0x38, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52AB, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xDF, 0x80, 0x02, 0x04, 0x80, 0x02, 0x04, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x04, 0x04, 0x80, 0x04, 0x04, 0x80, 0x08, 0x88, 0x80, 0x08, 0x48, 0x80, 0x13, 0xF0, 0x80, 0x3C, 0x10, 0x80, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52AC, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0xFF, 0x80, 0x60, 0x88, 0x80, 0x3C, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3C, 0x98, 0x80, 0x00, 0x90, 0x80, 0x01, 0x91, 0x80, 0x01, 0x31, 0x00, 0x07, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52AD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0xBF, 0x80, 0x11, 0x88, 0x80, 0x31, 0x08, 0x80, 0x67, 0x08, 0x80, 0x00, 0x08, 0x80, 0x3F, 0x08, 0x80, 0x21, 0x08, 0x80, 0x21, 0x18, 0x80, 0x21, 0x10, 0x80, 0x21, 0x11, 0x80, 0x21, 0x31, 0x00, 0x3F, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52AF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x80, 0x1F, 0x08, 0x80, 0x11, 0x08, 0x80, 0x31, 0x08, 0x80, 0x31, 0x08, 0x80, 0x51, 0x18, 0x80, 0x11, 0x10, 0x80, 0x11, 0x11, 0x80, 0x1F, 0x31, 0x00, 0x00, 0x21, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x22, 0x21, 0x00, 0x3E, 0x23, 0x00, 0x00, 0x62, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x99, 0x00, 0x64, 0x93, 0x00, 0x4D, 0x92, 0x00, 0x49, 0x32, 0x00, 0x1B, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x01, 0x10, 0x00, 0x02, 0x12, 0x00, 0x06, 0x7F, 0x00, 0x09, 0x12, 0x00, 0x10, 0x92, 0x00, 0x20, 0x12, 0x00, 0x7F, 0x12, 0x00, 0x04, 0x12, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x07, 0xC2, 0x00, 0x38, 0x82, 0x00, 0x11, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B3, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x41, 0x0A, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x50, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B4, { 0x00, 0x00, 0x00, 0x10, 0x81, 0x00, 0x18, 0xC3, 0x00, 0x08, 0x46, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x00, 0x03, 0x02, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x04, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B5, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B6, { 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x07, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x3F, 0x80, 0x3F, 0xC8, 0x80, 0x20, 0x08, 0x80, 0x20, 0x08, 0x80, 0x20, 0x08, 0x80, 0x2F, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x48, 0x98, 0x80, 0x08, 0x91, 0x80, 0x08, 0x91, 0x00, 0x0F, 0xB3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B7, { 0x00, 0x00, 0x00, 0x22, 0x10, 0x00, 0x36, 0x10, 0x00, 0x14, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0F, 0x11, 0x00, 0x78, 0x31, 0x00, 0x08, 0x21, 0x00, 0x18, 0x23, 0x00, 0x10, 0x62, 0x00, 0x30, 0x42, 0x00, 0x60, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x04, 0x18, 0x80, 0x04, 0x10, 0x80, 0x07, 0x91, 0x80, 0x1C, 0x31, 0x00, 0x70, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52B9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x11, 0x3F, 0x80, 0x31, 0x88, 0x80, 0x60, 0xC8, 0x80, 0x11, 0x08, 0x80, 0x1B, 0x08, 0x80, 0x0A, 0x08, 0x80, 0x0E, 0x18, 0x80, 0x04, 0x10, 0x80, 0x0E, 0x11, 0x80, 0x1B, 0x31, 0x00, 0x31, 0x21, 0x00, 0x60, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52BA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x19, 0x08, 0x00, 0x11, 0x08, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x44, 0x09, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xD9, 0x00, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x04, 0x32, 0x00, 0x04, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52BB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x40, 0x10, 0x00, 0x40, 0x10, 0x00, 0x5F, 0x7F, 0x00, 0x44, 0x11, 0x00, 0x44, 0x11, 0x00, 0x5F, 0x11, 0x00, 0x44, 0x11, 0x00, 0x44, 0x11, 0x00, 0x44, 0x11, 0x00, 0x5F, 0x11, 0x00, 0x40, 0x33, 0x00, 0x40, 0x22, 0x00, 0x7F, 0xA2, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52BC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x08, 0x80, 0x08, 0x08, 0x80, 0x3F, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x3F, 0x08, 0x80, 0x21, 0x18, 0x80, 0x21, 0x10, 0x80, 0x21, 0x11, 0x80, 0x21, 0x31, 0x00, 0x3F, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52BD, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x18, 0x89, 0x00, 0x35, 0x89, 0x00, 0x03, 0x09, 0x00, 0x06, 0x01, 0x00, 0x1C, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x07, 0x03, 0x00, 0x3C, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52BE, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x02, 0x1F, 0x80, 0x14, 0x84, 0x80, 0x08, 0x84, 0x80, 0x05, 0x04, 0x80, 0x02, 0x44, 0x80, 0x04, 0x44, 0x80, 0x08, 0x88, 0x80, 0x31, 0x08, 0x80, 0x02, 0x90, 0x80, 0x04, 0x50, 0x80, 0x08, 0x61, 0x00, 0x30, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52BF, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3E, 0xFE, 0x00, 0x04, 0x24, 0x00, 0x0E, 0x24, 0x00, 0x74, 0xC4, 0x00, 0x04, 0x65, 0x00, 0x14, 0x95, 0x00, 0x09, 0x03, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x44, 0x00, 0x08, 0x28, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C0, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x80, 0x20, 0x84, 0x80, 0x20, 0x84, 0x80, 0x20, 0x84, 0x80, 0x3F, 0x84, 0x80, 0x0A, 0x04, 0x80, 0x0A, 0x04, 0x80, 0x1A, 0x0D, 0x80, 0x12, 0x49, 0x00, 0x33, 0x89, 0x00, 0x66, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xE8, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x88, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x3F, 0xC8, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x07, 0xE1, 0x00, 0x38, 0x41, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C3, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x24, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x00, 0x84, 0x80, 0x03, 0x04, 0x80, 0x02, 0xE8, 0x80, 0x3F, 0x08, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x21, 0x00, 0x0E, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C4, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x20, 0x04, 0x00, 0x60, 0x1F, 0x80, 0x1F, 0xC4, 0x80, 0x10, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x7F, 0xE4, 0x80, 0x20, 0x44, 0x80, 0x24, 0x44, 0x80, 0x24, 0x4C, 0x80, 0x3F, 0xE9, 0x80, 0x00, 0x99, 0x00, 0x07, 0xB7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xE8, 0x00, 0x02, 0x3F, 0x80, 0x1F, 0xC8, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x06, 0x08, 0x80, 0x07, 0x08, 0x80, 0x0A, 0x90, 0x80, 0x0A, 0x50, 0x80, 0x12, 0x23, 0x00, 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0xBF, 0x80, 0x3F, 0x88, 0x80, 0x20, 0x88, 0x80, 0x20, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x20, 0x08, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x25, 0x18, 0x80, 0x3F, 0x11, 0x80, 0x61, 0xB1, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x01, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x40, 0x80, 0x00, 0x80, 0x80, 0x03, 0x01, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x12, 0x08, 0x00, 0x0C, 0x7F, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x99, 0x80, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x25, 0xB3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52C9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0F, 0x88, 0x00, 0x11, 0x08, 0x00, 0x22, 0x3F, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xD1, 0x00, 0x05, 0x11, 0x00, 0x05, 0x21, 0x00, 0x09, 0x46, 0x00, 0x09, 0x80, 0x00, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x52CB, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x12, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xA2, 0x00, 0x0A, 0x22, 0x00, 0x11, 0xCA, 0x00, 0x60, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52CC, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x35, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x08, 0x80, 0x7F, 0xC8, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x71, 0x48, 0x80, 0x11, 0x08, 0x80, 0x17, 0x19, 0x80, 0x10, 0x51, 0x00, 0x10, 0xD1, 0x00, 0x0F, 0xB3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52CD, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0xC4, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x0A, 0x84, 0x80, 0x12, 0x88, 0x80, 0x12, 0x48, 0x80, 0x22, 0x53, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52CF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x20, 0x88, 0x00, 0x31, 0xBF, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x7F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x20, 0x88, 0x80, 0x20, 0x99, 0x80, 0x20, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0xB3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x01, 0x10, 0x00, 0x02, 0x12, 0x00, 0x3F, 0x7F, 0x00, 0x02, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x7F, 0xC2, 0x00, 0x00, 0x54, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x04, 0x08, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x55, 0x48, 0x80, 0x55, 0x48, 0x80, 0x0E, 0x08, 0x80, 0x0E, 0x08, 0x80, 0x15, 0x08, 0x80, 0x35, 0x99, 0x80, 0x64, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D2, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x7F, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x42, 0x00, 0x04, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xBF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2E, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2E, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x98, 0x80, 0x2A, 0x91, 0x80, 0x3F, 0xB1, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D5, { 0x00, 0x00, 0x00, 0x01, 0xC4, 0x00, 0x1E, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x02, 0x1F, 0x80, 0x1F, 0xC4, 0x80, 0x12, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x12, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x08, 0x80, 0x03, 0xE8, 0x80, 0x3C, 0x11, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D6, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x20, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x44, 0x80, 0x3F, 0xC4, 0x80, 0x00, 0x04, 0x80, 0x1F, 0x84, 0x80, 0x10, 0x84, 0x80, 0x1F, 0x84, 0x80, 0x10, 0x88, 0x80, 0x1F, 0x88, 0x80, 0x10, 0x90, 0x80, 0x1F, 0x91, 0x00, 0x10, 0xA1, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D7, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x7F, 0x80, 0x3F, 0x08, 0x80, 0x21, 0x08, 0x80, 0x3F, 0x18, 0x80, 0x21, 0x10, 0x80, 0x3F, 0xB1, 0x80, 0x60, 0x61, 0x00, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D8, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xDF, 0x00, 0x08, 0x89, 0x00, 0x0F, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0F, 0x89, 0x00, 0x08, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x15, 0x09, 0x00, 0x15, 0x49, 0x00, 0x1D, 0xD1, 0x00, 0x10, 0x11, 0x00, 0x1F, 0xE1, 0x00, 0x10, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52D9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x01, 0x3F, 0x80, 0x0A, 0x31, 0x00, 0x04, 0x4A, 0x00, 0x3F, 0xC4, 0x00, 0x04, 0x8A, 0x00, 0x05, 0x11, 0x00, 0x0C, 0x30, 0x80, 0x0C, 0xD0, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x11, 0x00, 0x24, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x4E, 0x00, 0x0C, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52DB, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x00, 0x04, 0x80, 0x3F, 0x84, 0x80, 0x20, 0x84, 0x80, 0x3F, 0x84, 0x80, 0x20, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x20, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x00, 0x10, 0x80, 0x11, 0x10, 0x80, 0x20, 0xA3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52DC, { 0x00, 0x00, 0x00, 0x0E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x33, 0x08, 0x00, 0x69, 0x88, 0x00, 0x1A, 0x3F, 0x80, 0x13, 0x08, 0x80, 0x3D, 0x08, 0x80, 0x00, 0x08, 0x80, 0x7F, 0x88, 0x80, 0x19, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x4C, 0x98, 0x80, 0x19, 0x90, 0x80, 0x2A, 0x91, 0x80, 0x4C, 0xB1, 0x00, 0x19, 0xA7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52DD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x54, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x28, 0x00, 0x12, 0x46, 0x00, 0x13, 0x91, 0x80, 0x1E, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x12, 0x21, 0x00, 0x12, 0x41, 0x00, 0x22, 0x82, 0x00, 0x27, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52DE, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x0A, 0x55, 0x00, 0x0A, 0x96, 0x00, 0x13, 0x24, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x04, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52DF, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0x85, 0x80, 0x01, 0x04, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC4, 0x00, 0x29, 0x44, 0x00, 0x4A, 0x44, 0x00, 0x29, 0x5F, 0x80, 0x4A, 0x44, 0x80, 0x04, 0x44, 0x80, 0x0A, 0x04, 0x80, 0x11, 0x04, 0x80, 0x64, 0xC4, 0x80, 0x09, 0x04, 0x80, 0x32, 0x44, 0x80, 0x0C, 0x8C, 0x80, 0x31, 0x09, 0x80, 0x06, 0x19, 0x00, 0x38, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x0A, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x2A, 0xBF, 0x80, 0x2A, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x00, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x00, 0x08, 0x80, 0x7F, 0xC8, 0x80, 0x04, 0x08, 0x80, 0x15, 0x19, 0x80, 0x35, 0x91, 0x00, 0x64, 0xD1, 0x00, 0x0C, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E2, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x04, 0x7E, 0x00, 0x3F, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x17, 0xB2, 0x00, 0x24, 0x12, 0x80, 0x3F, 0x2B, 0x80, 0x04, 0x40, 0x00, 0x07, 0xC0, 0x00, 0x38, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x81, 0x00, 0x03, 0x02, 0x00, 0x3C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E3, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xDF, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x10, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x10, 0x44, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x1F, 0xD0, 0x80, 0x10, 0x50, 0x80, 0x20, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E4, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xBF, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x12, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xC8, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xF0, 0x80, 0x02, 0x11, 0x00, 0x03, 0xA1, 0x00, 0x1C, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x62, 0x00, 0x02, 0x4F, 0x00, 0x3E, 0xF9, 0x80, 0x20, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x88, 0x80, 0x02, 0xFF, 0x80, 0x06, 0x09, 0x00, 0x05, 0xFF, 0x80, 0x1C, 0x00, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x06, 0x03, 0x00, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E6, { 0x00, 0x00, 0x00, 0x24, 0x88, 0x00, 0x49, 0x08, 0x00, 0x6D, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x7F, 0xC8, 0x80, 0x0E, 0x08, 0x80, 0x15, 0x18, 0x80, 0x34, 0x91, 0x80, 0x64, 0x31, 0x00, 0x04, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E7, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x08, 0x00, 0x44, 0x3F, 0x80, 0x3F, 0xC8, 0x80, 0x09, 0x08, 0x80, 0x12, 0x08, 0x80, 0x3F, 0xC8, 0x80, 0x52, 0x18, 0x80, 0x1F, 0x90, 0x80, 0x12, 0x10, 0x80, 0x1F, 0xB1, 0x80, 0x12, 0x21, 0x00, 0x1F, 0xE1, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E8, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x31, 0x04, 0x00, 0x22, 0x04, 0x00, 0x7F, 0xDF, 0x80, 0x24, 0x44, 0x80, 0x24, 0x44, 0x80, 0x3F, 0xC4, 0x80, 0x04, 0x04, 0x80, 0x18, 0x44, 0x80, 0x64, 0xC4, 0x80, 0x1A, 0x8C, 0x80, 0x67, 0x08, 0x80, 0x1A, 0x89, 0x80, 0x62, 0x99, 0x00, 0x0E, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52E9, { 0x00, 0x00, 0x00, 0x24, 0x84, 0x00, 0x7F, 0xE4, 0x00, 0x24, 0x84, 0x00, 0x27, 0x84, 0x00, 0x20, 0x1F, 0x80, 0x3F, 0xC4, 0x80, 0x00, 0x04, 0x80, 0x3F, 0x84, 0x80, 0x20, 0x84, 0x80, 0x3F, 0x84, 0x80, 0x20, 0x84, 0x80, 0x3F, 0x8C, 0x80, 0x20, 0x88, 0x80, 0x3F, 0x89, 0x80, 0x11, 0x19, 0x00, 0x60, 0xD3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52EA, { 0x00, 0x00, 0x00, 0x03, 0x84, 0x00, 0x3E, 0x04, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xE4, 0x00, 0x09, 0x1F, 0x80, 0x1F, 0x84, 0x80, 0x69, 0x64, 0x80, 0x0F, 0x04, 0x80, 0x00, 0x04, 0x80, 0x3F, 0xC4, 0x80, 0x20, 0x44, 0x80, 0x2F, 0x4C, 0x80, 0x29, 0x48, 0x80, 0x2F, 0x49, 0x80, 0x20, 0x59, 0x00, 0x21, 0xD3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52EC, { 0x00, 0x00, 0x00, 0x15, 0x04, 0x00, 0x24, 0x84, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x09, 0x1F, 0x80, 0x7F, 0xE4, 0x80, 0x10, 0x84, 0x80, 0x24, 0x44, 0x80, 0x59, 0x24, 0x80, 0x0A, 0x04, 0x80, 0x04, 0x84, 0x80, 0x3F, 0xCC, 0x80, 0x04, 0x48, 0x80, 0x15, 0x09, 0x80, 0x35, 0x99, 0x00, 0x64, 0xD3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F0, { 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x15, 0x00, 0x3F, 0x95, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x95, 0x00, 0x18, 0x95, 0x00, 0x31, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x21, 0x04, 0x00, 0x7B, 0xC2, 0x00, 0x29, 0x44, 0x00, 0x29, 0x55, 0x00, 0x29, 0x54, 0x80, 0x29, 0x55, 0x00, 0x29, 0x45, 0x00, 0x5A, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F1, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x11, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x80, 0x3F, 0x84, 0x80, 0x24, 0x84, 0x80, 0x3F, 0x84, 0x80, 0x04, 0x04, 0x80, 0x7F, 0xC4, 0x80, 0x44, 0x4C, 0x80, 0x45, 0x48, 0x80, 0x5F, 0x49, 0x80, 0x41, 0x59, 0x00, 0x40, 0xD3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F2, { 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x3F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x98, 0x80, 0x04, 0x11, 0x80, 0x3F, 0x91, 0x00, 0x04, 0x33, 0x00, 0x7F, 0xC0, 0x00, 0x22, 0x11, 0x00, 0x41, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x52F3, { 0x00, 0x00, 0x00, 0x01, 0xC4, 0x00, 0x1E, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x1A, 0xC4, 0x80, 0x17, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x15, 0x50, 0x80, 0x25, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F4, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x03, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x24, 0x2F, 0x80, 0x3F, 0x84, 0x80, 0x24, 0x24, 0x80, 0x2F, 0xE4, 0x80, 0x2A, 0x44, 0x80, 0x2F, 0xC4, 0x80, 0x2A, 0x44, 0x80, 0x2F, 0xC4, 0x80, 0x22, 0x0C, 0x80, 0x55, 0x49, 0x80, 0x14, 0xA9, 0x00, 0x23, 0x9B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F5, { 0x00, 0x00, 0x00, 0x1F, 0xF4, 0x00, 0x12, 0x84, 0x00, 0x1F, 0xF4, 0x00, 0x12, 0x84, 0x00, 0x17, 0xDF, 0x80, 0x15, 0x44, 0x80, 0x17, 0xC4, 0x80, 0x15, 0x44, 0x80, 0x17, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x1F, 0xE4, 0x80, 0x19, 0x24, 0x80, 0x19, 0xE4, 0x80, 0x1F, 0x68, 0x80, 0x28, 0x28, 0x80, 0x28, 0x73, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F6, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x1B, 0xE4, 0x00, 0x31, 0x0F, 0x80, 0x4A, 0x49, 0x00, 0x1B, 0xF9, 0x00, 0x30, 0x25, 0x00, 0x53, 0xE7, 0x00, 0x12, 0x22, 0x00, 0x13, 0xE7, 0x00, 0x12, 0x2D, 0x80, 0x12, 0x68, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x06, 0x03, 0x00, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F7, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC4, 0x00, 0x4A, 0x5F, 0x80, 0x7B, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x7F, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x7F, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x7F, 0xC4, 0x80, 0x19, 0x04, 0x80, 0x71, 0x44, 0x80, 0x1C, 0x88, 0x80, 0x70, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x52F8, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xDF, 0x80, 0x12, 0x44, 0x80, 0x1F, 0xC4, 0x80, 0x04, 0x84, 0x80, 0x09, 0x04, 0x80, 0x1F, 0xE4, 0x80, 0x31, 0x04, 0x80, 0x1F, 0xE4, 0x80, 0x11, 0x08, 0x80, 0x1F, 0xE8, 0x80, 0x11, 0x08, 0x80, 0x1F, 0xD1, 0x00, 0x10, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52F9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x01, 0x00, 0x60, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52FA, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x10, 0x00, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x80, 0x07, 0xF0, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52FB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x07, 0xF1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0F, 0xF9, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52FE, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x11, 0x01, 0x00, 0x22, 0x01, 0x00, 0x02, 0x01, 0x00, 0x04, 0x01, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x13, 0xF1, 0x00, 0x3C, 0x11, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x52FF, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x21, 0x09, 0x00, 0x01, 0x11, 0x00, 0x02, 0x11, 0x00, 0x04, 0x21, 0x00, 0x08, 0x21, 0x00, 0x30, 0x41, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x04, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5300, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x01, 0x00, 0x6F, 0xF1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0xF1, 0x00, 0x07, 0x83, 0x00, 0x1C, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5301, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x14, 0x42, 0x00, 0x36, 0xC2, 0x00, 0x62, 0x82, 0x00, 0x03, 0x82, 0x00, 0x01, 0x06, 0x00, 0x03, 0xC4, 0x00, 0x06, 0x74, 0x00, 0x0C, 0x1C, 0x00, 0x18, 0x0F, 0x80, 0x70, 0x08, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5302, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x01, 0x00, 0x10, 0x01, 0x00, 0x34, 0x01, 0x00, 0x64, 0x31, 0x00, 0x04, 0xE1, 0x00, 0x07, 0x81, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x09, 0x00, 0x06, 0x19, 0x00, 0x03, 0xF3, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5303, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x81, 0x00, 0x68, 0x81, 0x00, 0x08, 0x81, 0x00, 0x09, 0xC1, 0x00, 0x09, 0x41, 0x00, 0x0B, 0x63, 0x00, 0x0E, 0x32, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xF6, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5305, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x01, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5306, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x33, 0x11, 0x00, 0x62, 0x31, 0x00, 0x0E, 0x21, 0x00, 0x07, 0x21, 0x00, 0x0D, 0xE1, 0x00, 0x18, 0x43, 0x00, 0x30, 0xE2, 0x00, 0x01, 0xB2, 0x00, 0x07, 0x06, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5308, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x00, 0x80, 0x28, 0x14, 0x80, 0x0B, 0x14, 0x80, 0x08, 0xA4, 0x80, 0x08, 0x44, 0x80, 0x08, 0xA4, 0x80, 0x09, 0x14, 0x80, 0x0A, 0x14, 0x80, 0x0F, 0xFC, 0x80, 0x08, 0x05, 0x00, 0x08, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x530A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x00, 0x80, 0x10, 0x80, 0x80, 0x34, 0x90, 0x80, 0x66, 0xB0, 0x80, 0x02, 0xA0, 0x80, 0x00, 0x80, 0x80, 0x1F, 0xFC, 0x80, 0x01, 0x80, 0x80, 0x03, 0xE0, 0x80, 0x06, 0xB1, 0x80, 0x0C, 0x99, 0x00, 0x10, 0x83, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x530B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x01, 0x00, 0x34, 0x01, 0x00, 0x67, 0xF9, 0x00, 0x0C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x1F, 0xFD, 0x00, 0x00, 0x81, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xFB, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x530C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x31, 0xC1, 0x00, 0x63, 0x61, 0x00, 0x06, 0x31, 0x00, 0x1C, 0x1D, 0x00, 0x03, 0xE1, 0x00, 0x00, 0x01, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x07, 0xF2, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x530D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x20, 0x81, 0x00, 0x1F, 0xFD, 0x00, 0x00, 0x81, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x99, 0x00, 0x00, 0x82, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x530F, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x81, 0x00, 0x21, 0x7D, 0x00, 0x1F, 0x45, 0x00, 0x00, 0x45, 0x00, 0x3F, 0xFD, 0x00, 0x08, 0x41, 0x00, 0x1F, 0x46, 0x00, 0x11, 0x40, 0x00, 0x01, 0x40, 0x80, 0x02, 0x7F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5310, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x1F, 0xFC, 0x80, 0x23, 0xF0, 0x80, 0x02, 0x10, 0x80, 0x03, 0xF0, 0x80, 0x00, 0x00, 0x80, 0x07, 0xF8, 0x80, 0x04, 0x88, 0x80, 0x07, 0xF8, 0x80, 0x04, 0x89, 0x00, 0x07, 0xF9, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5311, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x32, 0x00, 0x80, 0x64, 0x7C, 0x80, 0x0F, 0x04, 0x80, 0x09, 0x04, 0x80, 0x0F, 0x7C, 0x80, 0x09, 0x40, 0x80, 0x0F, 0x40, 0x80, 0x09, 0x7C, 0x80, 0x3F, 0x04, 0x80, 0x05, 0x04, 0x80, 0x0D, 0x05, 0x80, 0x19, 0x0D, 0x00, 0x03, 0x3B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5313, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x32, 0x00, 0x80, 0x64, 0x38, 0x80, 0x1F, 0x28, 0x80, 0x11, 0x4E, 0x80, 0x1F, 0x00, 0x80, 0x11, 0x7C, 0x80, 0x1F, 0x24, 0x80, 0x00, 0x2C, 0x80, 0x13, 0x18, 0x80, 0x1C, 0x10, 0x80, 0x11, 0x39, 0x80, 0x1F, 0x6D, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5315, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x01, 0x80, 0x10, 0x0E, 0x00, 0x10, 0x70, 0x00, 0x13, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5316, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x21, 0x00, 0x18, 0x22, 0x00, 0x18, 0x24, 0x00, 0x28, 0x28, 0x00, 0x28, 0x30, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5317, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x11, 0x80, 0x01, 0x16, 0x00, 0x3F, 0x18, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x03, 0x10, 0x00, 0x0D, 0x10, 0x80, 0x31, 0x10, 0x80, 0x01, 0x1F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5318, { 0x00, 0x00, 0x00, 0x40, 0x49, 0x00, 0x40, 0x92, 0x00, 0x41, 0x24, 0x00, 0x40, 0x92, 0x00, 0x4C, 0x49, 0x00, 0x58, 0x00, 0x00, 0x70, 0x20, 0x00, 0x41, 0xFF, 0x00, 0x41, 0x01, 0x00, 0x41, 0x45, 0x00, 0x41, 0x29, 0x00, 0x41, 0x11, 0x00, 0x45, 0x29, 0x00, 0x6D, 0x45, 0x00, 0x39, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5319, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xC8, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xC8, 0x00, 0x08, 0x49, 0x80, 0x0F, 0xCE, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0xE8, 0x80, 0x09, 0x0F, 0x80, 0x09, 0x00, 0x00, 0x15, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x531A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x531B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x21, 0xF8, 0x00, 0x23, 0x08, 0x00, 0x26, 0x18, 0x00, 0x20, 0x30, 0x00, 0x20, 0x20, 0x00, 0x20, 0x70, 0x00, 0x20, 0xD8, 0x00, 0x21, 0x8C, 0x00, 0x2F, 0x07, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x531C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x22, 0x40, 0x00, 0x22, 0x4C, 0x00, 0x22, 0x74, 0x00, 0x23, 0xC4, 0x00, 0x2E, 0x44, 0x00, 0x22, 0x4C, 0x00, 0x22, 0x40, 0x00, 0x22, 0x02, 0x00, 0x23, 0x06, 0x00, 0x21, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x531D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x5C, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x531E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x531F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x21, 0xF0, 0x00, 0x21, 0x10, 0x00, 0x21, 0x10, 0x00, 0x23, 0x10, 0x00, 0x22, 0x12, 0x00, 0x26, 0x12, 0x00, 0x2C, 0x0E, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xE0, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x12, 0x08, 0x00, 0x14, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5321, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x00, 0x00, 0x23, 0x10, 0x00, 0x22, 0x78, 0x00, 0x27, 0x8C, 0x00, 0x20, 0x00, 0x00, 0x21, 0x10, 0x00, 0x2F, 0xFE, 0x00, 0x21, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x24, 0x10, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5326, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x25, 0x20, 0x00, 0x3F, 0xA8, 0x00, 0x28, 0x7C, 0x00, 0x2A, 0x28, 0x00, 0x3F, 0xA8, 0x00, 0x22, 0x28, 0x00, 0x22, 0x28, 0x00, 0x3F, 0xAA, 0x00, 0x22, 0x2A, 0x00, 0x22, 0x46, 0x00, 0x22, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x22, 0x48, 0x00, 0x22, 0x48, 0x00, 0x25, 0x54, 0x00, 0x28, 0xE2, 0x00, 0x21, 0xB0, 0x00, 0x23, 0x18, 0x00, 0x2E, 0x0E, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x21, 0x08, 0x00, 0x25, 0x08, 0x00, 0x25, 0x08, 0x00, 0x27, 0x7F, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x2F, 0x08, 0x00, 0x25, 0x08, 0x00, 0x25, 0x08, 0x00, 0x29, 0x3E, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5329, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x23, 0xF8, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x532A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x17, 0xCF, 0x80, 0x10, 0x48, 0x00, 0x13, 0xCF, 0x00, 0x10, 0x48, 0x00, 0x13, 0xCF, 0x80, 0x1C, 0x48, 0x00, 0x10, 0x88, 0x00, 0x11, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x532B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x27, 0xFE, 0x00, 0x2C, 0x92, 0x00, 0x21, 0xB6, 0x00, 0x23, 0x64, 0x00, 0x20, 0x0C, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x532C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x21, 0xF0, 0x00, 0x27, 0x1C, 0x00, 0x3C, 0xE7, 0x00, 0x20, 0x00, 0x00, 0x2F, 0x89, 0x00, 0x2C, 0x9B, 0x00, 0x2B, 0x92, 0x00, 0x2C, 0x92, 0x00, 0x2B, 0x9A, 0x00, 0x28, 0x8B, 0x00, 0x29, 0x89, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x532D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x2F, 0x90, 0x00, 0x22, 0x7C, 0x00, 0x2F, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2F, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2F, 0x94, 0x00, 0x22, 0x35, 0x00, 0x2F, 0xA5, 0x00, 0x22, 0x63, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x532E, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x04, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x21, 0xB0, 0x00, 0x26, 0x0C, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x532F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x14, 0x24, 0x00, 0x12, 0x24, 0x00, 0x18, 0x48, 0x00, 0x14, 0xFF, 0x00, 0x11, 0x48, 0x00, 0x10, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x14, 0x48, 0x00, 0x14, 0x7F, 0x80, 0x18, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5330, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xBE, 0x00, 0x28, 0xA2, 0x00, 0x2F, 0xBE, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x23, 0xFC, 0x00, 0x22, 0x44, 0x00, 0x23, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x21, 0x08, 0x00, 0x21, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x21, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x21, 0xF8, 0x00, 0x23, 0x0C, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x2F, 0xFE, 0x00, 0x21, 0x10, 0x00, 0x27, 0xFC, 0x00, 0x3D, 0x17, 0x00, 0x21, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x27, 0xBC, 0x00, 0x24, 0xA4, 0x00, 0x27, 0xBC, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x20, 0xA0, 0x00, 0x23, 0x18, 0x00, 0x2C, 0xE6, 0x00, 0x20, 0x00, 0x00, 0x27, 0xBC, 0x00, 0x24, 0xA4, 0x00, 0x27, 0xBC, 0x00, 0x22, 0x08, 0x00, 0x27, 0x1C, 0x00, 0x2D, 0xB6, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5335, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xFE, 0x00, 0x29, 0x12, 0x00, 0x2F, 0xFE, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x23, 0x18, 0x00, 0x26, 0x0C, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x12, 0x1F, 0x00, 0x14, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x533A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x04, 0x00, 0x26, 0x0C, 0x00, 0x23, 0x08, 0x00, 0x21, 0x98, 0x00, 0x20, 0xF0, 0x00, 0x20, 0x60, 0x00, 0x20, 0xF0, 0x00, 0x21, 0x98, 0x00, 0x23, 0x0C, 0x00, 0x2E, 0x04, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x533B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x2C, 0x40, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0xA0, 0x00, 0x21, 0xB0, 0x00, 0x21, 0x10, 0x00, 0x23, 0x18, 0x00, 0x26, 0x0C, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x533C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x70, 0x00, 0x10, 0xD8, 0x00, 0x11, 0x8C, 0x00, 0x17, 0x07, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x18, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x533D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x80, 0x00, 0x2F, 0xFE, 0x00, 0x21, 0x10, 0x00, 0x23, 0xE0, 0x00, 0x20, 0xB8, 0x00, 0x27, 0x0C, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x533E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x16, 0x49, 0x00, 0x1B, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x4B, 0x00, 0x18, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x533F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0xA8, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x11, 0xFE, 0x00, 0x13, 0x02, 0x00, 0x15, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5340, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x23, 0xF8, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x23, 0xF8, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xBE, 0x00, 0x28, 0xA2, 0x00, 0x28, 0xA2, 0x00, 0x2F, 0xBE, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5341, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5342, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x7F, 0xF4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x06, 0x00, 0x02, 0x02, 0x80, 0x02, 0x03, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5343, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5344, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5345, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x18, 0x84, 0x00, 0x10, 0x84, 0x00, 0x30, 0x84, 0x00, 0x60, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5346, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x01, 0x10, 0x00, 0x03, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x80, 0x0C, 0x19, 0x80, 0x38, 0x8F, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5347, { 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x03, 0x88, 0x00, 0x1E, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5348, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5349, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x02, 0x48, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x534A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x534B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x534C, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x534D, { 0x00, 0x00, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x534E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x04, 0x2C, 0x00, 0x04, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x14, 0xA0, 0x00, 0x25, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x9E, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x534F, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x7D, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x12, 0x46, 0x00, 0x12, 0x45, 0x00, 0x12, 0x45, 0x00, 0x14, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x12, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5351, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5352, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x05, 0x14, 0x00, 0x08, 0xA2, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5353, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5354, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x21, 0x00, 0x3E, 0x42, 0x00, 0x09, 0x8C, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x0A, 0xCB, 0x00, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5355, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5356, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0x44, 0x00, 0x11, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x04, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5357, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x09, 0x00, 0x11, 0x11, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFD, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5358, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x19, 0x86, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5359, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0xC4, 0x00, 0x30, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x535A, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x12, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x535B, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x40, 0x08, 0x00, 0x29, 0xE5, 0x00, 0x10, 0x02, 0x00, 0x25, 0xE4, 0x80, 0x7C, 0x0F, 0x80, 0x11, 0xE2, 0x00, 0x55, 0x2A, 0x80, 0x55, 0xEA, 0x80, 0x10, 0x82, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x535C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x90, 0x00, 0x00, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x535E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x535F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x50, 0x00, 0x24, 0x4C, 0x00, 0x24, 0x46, 0x00, 0x24, 0x42, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5360, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5361, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x86, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5362, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5363, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5364, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFC, 0x00, 0x20, 0x08, 0x00, 0x28, 0x28, 0x00, 0x24, 0x68, 0x00, 0x22, 0x88, 0x00, 0x21, 0x08, 0x00, 0x21, 0x88, 0x00, 0x22, 0x48, 0x00, 0x24, 0x28, 0x00, 0x28, 0x18, 0x00, 0x3F, 0xF8, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5365, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x20, 0x04, 0x00, 0x20, 0x94, 0x00, 0x2C, 0x94, 0x00, 0x23, 0x24, 0x00, 0x2C, 0xC4, 0x00, 0x21, 0x24, 0x00, 0x26, 0x14, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5366, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x06, 0x00, 0x3F, 0xE5, 0x00, 0x02, 0x04, 0x80, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5367, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x3F, 0x30, 0x00, 0x21, 0x28, 0x00, 0x21, 0x24, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x25, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5368, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x08, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x08, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5369, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x78, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x536B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x14, 0x00, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x536C, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x2F, 0x41, 0x00, 0x78, 0x41, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x536D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x41, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x536E, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0E, 0x00, 0x32, 0x00, 0x00, 0x22, 0x00, 0x80, 0x63, 0x01, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x536F, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x3F, 0x00, 0x10, 0x21, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x17, 0xA1, 0x00, 0x38, 0xA1, 0x00, 0x01, 0x27, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5370, { 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x38, 0x3F, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0x2E, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5371, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x1C, 0x00, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5372, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x80, 0x08, 0x50, 0x80, 0x08, 0x50, 0x80, 0x18, 0x50, 0x80, 0x10, 0xD0, 0x80, 0x30, 0x90, 0x80, 0x63, 0x90, 0x80, 0x00, 0x10, 0x80, 0x3F, 0xD0, 0x80, 0x20, 0x50, 0x80, 0x20, 0x50, 0x80, 0x20, 0x53, 0x80, 0x20, 0x50, 0x00, 0x20, 0x50, 0x00, 0x3F, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5373, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x20, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x27, 0xAF, 0x00, 0x3C, 0xA0, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5374, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x1F, 0xD1, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x08, 0x91, 0x00, 0x08, 0x51, 0x00, 0x13, 0xD1, 0x00, 0x3C, 0x33, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5375, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x1E, 0x1F, 0x80, 0x10, 0x10, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x18, 0x94, 0x80, 0x14, 0x92, 0x80, 0x12, 0x91, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x13, 0x90, 0x80, 0x3D, 0x10, 0x80, 0x01, 0x13, 0x80, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5377, { 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x41, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x18, 0x03, 0x00, 0x67, 0xF8, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x38, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5378, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0x21, 0x00, 0x44, 0x21, 0x00, 0x04, 0x21, 0x00, 0x7F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x24, 0x21, 0x00, 0x27, 0xA1, 0x00, 0x24, 0x21, 0x00, 0x24, 0x21, 0x00, 0x27, 0xA7, 0x00, 0x3C, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5379, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x1F, 0x00, 0x08, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xD1, 0x00, 0x2B, 0x91, 0x00, 0x2E, 0x17, 0x00, 0x38, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x537A, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC4, 0x00, 0x1E, 0xD8, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x98, 0x00, 0x19, 0x87, 0x00, 0x60, 0x82, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x32, 0x00, 0x08, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x537B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x1F, 0x00, 0x1B, 0x11, 0x00, 0x31, 0x91, 0x00, 0x64, 0xD1, 0x00, 0x0E, 0x11, 0x00, 0x1B, 0x11, 0x00, 0x31, 0x91, 0x00, 0x60, 0xD1, 0x00, 0x00, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0x97, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x537D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x00, 0x21, 0x00, 0x20, 0x21, 0x00, 0x23, 0xA1, 0x00, 0x3C, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0xA7, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x537E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x4A, 0x51, 0x00, 0x7B, 0xD1, 0x00, 0x00, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x08, 0x11, 0x00, 0x10, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x97, 0x00, 0x00, 0x90, 0x00, 0x01, 0x90, 0x00, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x537F, { 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x18, 0x47, 0x80, 0x12, 0xF4, 0x80, 0x12, 0x94, 0x80, 0x12, 0x94, 0x80, 0x12, 0xF4, 0x80, 0x12, 0x94, 0x80, 0x12, 0x94, 0x80, 0x12, 0xF4, 0x80, 0x12, 0x04, 0x80, 0x12, 0x84, 0x80, 0x3C, 0x9C, 0x80, 0x04, 0xE4, 0x80, 0x08, 0x85, 0x80, 0x10, 0x94, 0x00, 0x20, 0xF4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5382, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5383, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x20, 0x00, 0x30, 0x40, 0x00, 0x5F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x3C, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5385, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x41, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5386, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0x02, 0x00, 0x21, 0x02, 0x00, 0x22, 0x22, 0x00, 0x44, 0x14, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5387, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x3C, 0x00, 0x17, 0xE0, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x41, 0x00, 0x60, 0x63, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5388, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x30, 0x20, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5389, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x44, 0x00, 0x44, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x538B, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x50, 0x00, 0x10, 0x4C, 0x00, 0x10, 0x44, 0x00, 0x20, 0x40, 0x00, 0x20, 0x42, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x538C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x50, 0x00, 0x10, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x10, 0x00, 0x21, 0x10, 0x00, 0x22, 0x08, 0x00, 0x44, 0x07, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x538D, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x84, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x12, 0x28, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x538E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x13, 0xF0, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x18, 0x00, 0x13, 0xC8, 0x00, 0x36, 0x0C, 0x00, 0x20, 0x05, 0x00, 0x6F, 0xF7, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x11, 0x84, 0x00, 0x11, 0x3E, 0x00, 0x17, 0xE3, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5395, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xC2, 0x00, 0x14, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0x52, 0x00, 0x11, 0x12, 0x00, 0x22, 0x82, 0x00, 0x22, 0x42, 0x00, 0x44, 0x4A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x22, 0x82, 0x00, 0x22, 0x46, 0x00, 0x22, 0x0C, 0x00, 0x2F, 0xD9, 0x00, 0x22, 0x03, 0x00, 0x22, 0x06, 0x00, 0x22, 0x1C, 0x80, 0x27, 0x01, 0x80, 0x25, 0x03, 0x00, 0x65, 0x06, 0x00, 0x4D, 0x1C, 0x80, 0x49, 0x81, 0x80, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x539A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x539D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x21, 0x02, 0x00, 0x61, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x539F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x12, 0x22, 0x00, 0x24, 0x21, 0x00, 0x28, 0x20, 0x80, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x01, 0x00, 0x17, 0xC1, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x17, 0xC9, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x17, 0xC9, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x17, 0xC9, 0x00, 0x20, 0x09, 0x00, 0x24, 0x41, 0x00, 0x28, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x80, 0x17, 0xB1, 0x80, 0x10, 0xAB, 0x00, 0x31, 0xAC, 0x00, 0x23, 0x26, 0x00, 0x6E, 0x23, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A2, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x02, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0xE2, 0x00, 0x11, 0x22, 0x00, 0x13, 0x3E, 0x00, 0x13, 0xA2, 0x00, 0x15, 0x62, 0x00, 0x15, 0x3E, 0x00, 0x19, 0x22, 0x00, 0x21, 0x22, 0x00, 0x21, 0x22, 0x00, 0x41, 0x3E, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A3, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x0F, 0x8F, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x21, 0x8E, 0x00, 0x2F, 0x38, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2F, 0xBF, 0x00, 0x22, 0x08, 0x00, 0x27, 0x1C, 0x00, 0x26, 0x9C, 0x00, 0x6A, 0xAA, 0x00, 0x4A, 0x2A, 0x00, 0x52, 0x49, 0x00, 0x02, 0x08, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x14, 0x48, 0x00, 0x12, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x14, 0x80, 0x15, 0x65, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x17, 0xCA, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x12, 0x00, 0x21, 0x11, 0x00, 0x22, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFE, 0x00, 0x12, 0x84, 0x00, 0x2C, 0x58, 0x00, 0x20, 0xF0, 0x00, 0x27, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x20, 0x02, 0x00, 0x2F, 0xC2, 0x00, 0x20, 0x02, 0x00, 0x27, 0xBF, 0x80, 0x24, 0x82, 0x00, 0x24, 0x92, 0x00, 0x24, 0x9A, 0x00, 0x27, 0x8A, 0x00, 0x20, 0x02, 0x00, 0x64, 0x82, 0x00, 0x44, 0x82, 0x00, 0x43, 0xC2, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x2F, 0x9F, 0x00, 0x28, 0x94, 0x00, 0x28, 0x94, 0x00, 0x2F, 0x94, 0x00, 0x28, 0x94, 0x00, 0x28, 0xBF, 0x80, 0x2F, 0x84, 0x00, 0x28, 0x0C, 0x00, 0x29, 0x0C, 0x00, 0x69, 0x1C, 0x00, 0x4F, 0x94, 0x80, 0x58, 0xB4, 0x80, 0x00, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x2F, 0xFF, 0x00, 0x21, 0x08, 0x00, 0x21, 0xF8, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFE, 0x00, 0x60, 0x40, 0x00, 0x43, 0xFC, 0x00, 0x40, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x27, 0xC8, 0x00, 0x21, 0x1F, 0x80, 0x27, 0xD1, 0x00, 0x21, 0x09, 0x00, 0x2F, 0xEB, 0x00, 0x22, 0x0A, 0x00, 0x23, 0xCE, 0x00, 0x22, 0x44, 0x00, 0x62, 0x44, 0x00, 0x46, 0x4E, 0x00, 0x44, 0x4B, 0x00, 0x0C, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x17, 0xC6, 0x00, 0x14, 0x45, 0x00, 0x17, 0xC4, 0x00, 0x10, 0x3F, 0x80, 0x17, 0xC4, 0x00, 0x14, 0x44, 0x00, 0x17, 0xC4, 0x00, 0x14, 0x44, 0x00, 0x17, 0xCA, 0x00, 0x24, 0x4A, 0x00, 0x24, 0x51, 0x00, 0x24, 0xD1, 0x00, 0x20, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x24, 0x83, 0x00, 0x2F, 0xDE, 0x00, 0x24, 0x90, 0x00, 0x27, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x24, 0x92, 0x00, 0x27, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x6F, 0xD2, 0x00, 0x44, 0x92, 0x00, 0x4C, 0xD2, 0x00, 0x18, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x23, 0x8E, 0x00, 0x2D, 0x55, 0x80, 0x21, 0x04, 0x00, 0x20, 0x00, 0x00, 0x22, 0xC0, 0x00, 0x22, 0x63, 0x00, 0x62, 0x21, 0x80, 0x42, 0x04, 0x80, 0x43, 0x0C, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x25, 0x44, 0x00, 0x2D, 0x64, 0x00, 0x29, 0x24, 0x00, 0x21, 0x0F, 0x80, 0x2F, 0xE9, 0x00, 0x28, 0x39, 0x00, 0x2B, 0xA5, 0x00, 0x2A, 0xA7, 0x00, 0x2A, 0xA2, 0x00, 0x6B, 0xA2, 0x00, 0x48, 0x27, 0x00, 0x48, 0x25, 0x00, 0x08, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x2F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x68, 0x20, 0x80, 0x48, 0x28, 0x80, 0x4B, 0xFC, 0x80, 0x08, 0x05, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53B3, { 0x00, 0x00, 0x00, 0x10, 0x81, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x2F, 0x88, 0x00, 0x22, 0x08, 0x00, 0x3F, 0xDF, 0x80, 0x28, 0x92, 0x00, 0x2F, 0xB2, 0x00, 0x28, 0x8A, 0x00, 0x2F, 0x8E, 0x00, 0x28, 0x84, 0x00, 0x68, 0x8E, 0x00, 0x4F, 0x8A, 0x00, 0x58, 0x9B, 0x00, 0x00, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53B4, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x85, 0x00, 0x2F, 0x84, 0x80, 0x20, 0x3F, 0x80, 0x2F, 0x84, 0x00, 0x28, 0x8E, 0x00, 0x2F, 0x8A, 0x00, 0x28, 0x9B, 0x00, 0x29, 0xB1, 0x80, 0x2F, 0xFE, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFE, 0x00, 0x64, 0x42, 0x00, 0x47, 0xFE, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53B5, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x31, 0x24, 0x00, 0x23, 0x26, 0x00, 0x66, 0xE3, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x22, 0x22, 0x00, 0x2F, 0xAF, 0x80, 0x28, 0xA8, 0x80, 0x2F, 0xAF, 0x80, 0x62, 0x22, 0x00, 0x4A, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53B6, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x06, 0x00, 0x18, 0x02, 0x00, 0x10, 0x7F, 0x00, 0x1F, 0xC1, 0x80, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53B7, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0xC8, 0x00, 0x08, 0x8C, 0x00, 0x18, 0x84, 0x00, 0x31, 0x86, 0x00, 0x61, 0x02, 0x00, 0x01, 0x3F, 0x00, 0x03, 0xE1, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53B8, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x14, 0x12, 0x00, 0x34, 0x12, 0x00, 0x26, 0x13, 0x00, 0x22, 0x31, 0x00, 0x22, 0x21, 0x00, 0x2F, 0x27, 0x80, 0x79, 0x7C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53BA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x71, 0x83, 0x80, 0x01, 0x10, 0x00, 0x03, 0x18, 0x00, 0x06, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x0F, 0x84, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53BB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53BD, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x08, 0x00, 0x02, 0x0C, 0x00, 0x06, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x19, 0x19, 0x00, 0x11, 0x11, 0x00, 0x31, 0x31, 0x00, 0x27, 0xA7, 0x80, 0x7C, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53BF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53C0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x06, 0x00, 0x0F, 0xFF, 0x00, 0x78, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53C1, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x27, 0x00, 0x67, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53C2, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x04, 0x0C, 0x00, 0x0F, 0xF4, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x1C, 0xCE, 0x00, 0x71, 0x83, 0x80, 0x07, 0x30, 0x00, 0x1C, 0x60, 0x00, 0x03, 0xC6, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53C3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x04, 0x00, 0x02, 0x3E, 0x00, 0x1F, 0xC1, 0x00, 0x04, 0x04, 0x00, 0x09, 0x09, 0x00, 0x13, 0x93, 0x80, 0x3C, 0xFC, 0x80, 0x00, 0x90, 0x00, 0x01, 0x28, 0x00, 0x06, 0x46, 0x00, 0x3B, 0x99, 0x80, 0x00, 0x60, 0x00, 0x07, 0x86, 0x00, 0x00, 0x38, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53C5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x10, 0x08, 0x00, 0x24, 0x91, 0x00, 0x7D, 0xDE, 0x80, 0x07, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x80, 0x00, 0x08, 0x86, 0x00, 0x08, 0xB3, 0x00, 0x18, 0x99, 0x00, 0x30, 0x88, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x06, 0x02, 0x00, 0x09, 0x04, 0x00, 0x11, 0x04, 0x00, 0x00, 0x88, 0x00, 0x00, 0x90, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x01, 0x04, 0x00, 0x06, 0x02, 0x00, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x04, 0x44, 0x00, 0x02, 0x24, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x06, 0x10, 0x00, 0x06, 0x20, 0x00, 0x05, 0x3E, 0x00, 0x05, 0x02, 0x00, 0x04, 0x82, 0x00, 0x04, 0x84, 0x00, 0x04, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0x38, 0x00, 0x08, 0x10, 0x00, 0x10, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53CB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x05, 0x04, 0x00, 0x04, 0x88, 0x00, 0x08, 0x50, 0x00, 0x08, 0x30, 0x00, 0x10, 0x48, 0x00, 0x21, 0x86, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x01, 0x21, 0x00, 0x01, 0x21, 0x00, 0x01, 0x23, 0x00, 0x03, 0x22, 0x00, 0x32, 0x32, 0x00, 0x1A, 0x16, 0x00, 0x0E, 0x14, 0x00, 0x04, 0x1C, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x1C, 0x00, 0x19, 0x34, 0x00, 0x10, 0x66, 0x00, 0x30, 0xC3, 0x00, 0x63, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x23, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53CE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x41, 0x00, 0x24, 0x43, 0x00, 0x24, 0x42, 0x00, 0x24, 0x66, 0x00, 0x24, 0x24, 0x00, 0x24, 0x2C, 0x00, 0x24, 0x38, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x64, 0x2C, 0x00, 0x04, 0x66, 0x00, 0x04, 0xC3, 0x00, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53CF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x03, 0x08, 0x00, 0x05, 0x10, 0x00, 0x04, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x10, 0xA0, 0x00, 0x21, 0x18, 0x00, 0x46, 0x07, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53D2, { 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x21, 0x21, 0x00, 0x33, 0x33, 0x00, 0x16, 0x16, 0x00, 0x0C, 0x0C, 0x00, 0x36, 0x36, 0x00, 0x63, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x07, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xCA, 0x00, 0x04, 0x0A, 0x00, 0x15, 0x0C, 0x00, 0x15, 0x04, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x8A, 0x00, 0x24, 0x12, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x21, 0x21, 0x00, 0x33, 0x33, 0x00, 0x16, 0x16, 0x00, 0x0C, 0x0C, 0x00, 0x36, 0x36, 0x00, 0x63, 0x63, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x21, 0x21, 0x00, 0x33, 0x33, 0x00, 0x16, 0x16, 0x00, 0x0C, 0x0C, 0x00, 0x36, 0x36, 0x00, 0x63, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x14, 0x00, 0x31, 0x22, 0x00, 0x01, 0x41, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D7, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x01, 0x00, 0x04, 0x22, 0x00, 0x02, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0xB0, 0x00, 0x03, 0x0C, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53D8, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x26, 0x00, 0x22, 0x22, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x60, 0x00, 0x06, 0x1E, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53D9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x0B, 0x21, 0x00, 0x19, 0xA1, 0x00, 0x10, 0xA3, 0x00, 0x3F, 0x32, 0x00, 0x64, 0x16, 0x00, 0x04, 0x14, 0x00, 0x7F, 0x9C, 0x00, 0x04, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x1C, 0x00, 0x35, 0x94, 0x00, 0x24, 0xB6, 0x00, 0x64, 0x23, 0x00, 0x0C, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x42, 0x02, 0x00, 0x42, 0x02, 0x00, 0x42, 0x02, 0x00, 0x7E, 0xFE, 0x00, 0x40, 0x00, 0x00, 0x41, 0xFE, 0x00, 0x7E, 0x42, 0x00, 0x40, 0x46, 0x00, 0x40, 0x6C, 0x00, 0x40, 0x38, 0x00, 0x7E, 0x10, 0x00, 0x40, 0x38, 0x00, 0x40, 0xEC, 0x00, 0x43, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53DB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x29, 0x40, 0x00, 0x28, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x61, 0x00, 0x08, 0x51, 0x00, 0x08, 0x52, 0x00, 0x0F, 0x4A, 0x00, 0x38, 0x4C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x8C, 0x00, 0x10, 0x8A, 0x00, 0x10, 0x91, 0x00, 0x21, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53DD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x47, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x00, 0x10, 0x51, 0x00, 0x10, 0x51, 0x00, 0x10, 0x5B, 0x00, 0x34, 0x4A, 0x00, 0x24, 0xCE, 0x00, 0x3E, 0x84, 0x00, 0x62, 0x8E, 0x00, 0x01, 0x9B, 0x00, 0x03, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x11, 0x00, 0x20, 0x1B, 0x00, 0x2F, 0x8A, 0x00, 0x20, 0x0A, 0x00, 0x2F, 0x8E, 0x00, 0x22, 0x04, 0x00, 0x2A, 0x84, 0x00, 0x6A, 0x8E, 0x00, 0x4A, 0x8A, 0x00, 0x52, 0x9B, 0x00, 0x06, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53DF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x9E, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1C, 0x9E, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x0C, 0x00, 0x03, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53E0, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x12, 0x12, 0x00, 0x7F, 0xFF, 0x80, 0x48, 0x04, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53E1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x02, 0x1F, 0x00, 0x3F, 0xE9, 0x00, 0x20, 0x29, 0x00, 0x07, 0x09, 0x00, 0x08, 0x8A, 0x00, 0x10, 0x4A, 0x00, 0x08, 0x86, 0x00, 0x1F, 0xC4, 0x00, 0x28, 0xA4, 0x00, 0x0F, 0x8A, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0x89, 0x00, 0x08, 0x91, 0x00, 0x0F, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53E2, { 0x00, 0x00, 0x00, 0x04, 0xA4, 0x00, 0x02, 0xA8, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x0F, 0xA1, 0x00, 0x08, 0x92, 0x00, 0x0F, 0x8C, 0x00, 0x08, 0x8C, 0x00, 0x0F, 0x92, 0x00, 0x38, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53E4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53E5, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x03, 0x03, 0x00, 0x06, 0x02, 0x00, 0x1C, 0x06, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x03, 0x03, 0x00, 0x06, 0x02, 0x00, 0x1C, 0x06, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x10, 0x80, 0x44, 0x10, 0x80, 0x44, 0x10, 0x80, 0x44, 0x10, 0x80, 0x44, 0x10, 0x80, 0x44, 0x10, 0x80, 0x44, 0x30, 0x80, 0x44, 0x20, 0x80, 0x44, 0x21, 0x80, 0x7C, 0x61, 0x00, 0x00, 0x41, 0x00, 0x00, 0xC3, 0x00, 0x01, 0x82, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53EB, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x47, 0x80, 0x3C, 0x7C, 0x00, 0x03, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x84, 0x00, 0x3D, 0x04, 0x00, 0x25, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x01, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x7C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x80, 0x3E, 0x41, 0x00, 0x22, 0x42, 0x00, 0x22, 0x44, 0x00, 0x22, 0x48, 0x00, 0x22, 0x50, 0x00, 0x22, 0x60, 0x00, 0x22, 0x40, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x80, 0x00, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x80, 0x10, 0x40, 0x80, 0x10, 0x40, 0x80, 0x10, 0x40, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x06, 0x70, 0x00, 0x38, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53F3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x14, 0x02, 0x00, 0x24, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x23, 0xF0, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x23, 0xF0, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xF9, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0F, 0xF1, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0F, 0xF1, 0x00, 0x08, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0x04, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x3C, 0x50, 0x00, 0x24, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x07, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x38, 0x00, 0x44, 0x28, 0x00, 0x44, 0x28, 0x00, 0x44, 0x6C, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x82, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x53FB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x14, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x0A, 0x00, 0x24, 0x12, 0x00, 0x24, 0x22, 0x00, 0x24, 0x42, 0x00, 0x24, 0xC2, 0x00, 0x3D, 0x82, 0x00, 0x24, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x53FD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x3E, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x25, 0x09, 0x00, 0x01, 0x09, 0x00, 0x02, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5402, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5403, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x7F, 0x80, 0x24, 0x80, 0x00, 0x25, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x06, 0x00, 0x24, 0x08, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5404, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x08, 0x00, 0x09, 0x10, 0x00, 0x30, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xB0, 0x00, 0x03, 0x0C, 0x00, 0x0C, 0x03, 0x80, 0x37, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5406, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x40, 0x00, 0x24, 0x42, 0x00, 0x24, 0x82, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x24, 0x08, 0x00, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x84, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5408, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5409, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x540A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x540B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7C, 0x08, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x47, 0xFF, 0x00, 0x44, 0x08, 0x00, 0x44, 0x08, 0x00, 0x45, 0x88, 0x00, 0x44, 0xC8, 0x00, 0x44, 0x48, 0x00, 0x44, 0x08, 0x00, 0x7C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x540C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x540D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x04, 0x04, 0x00, 0x19, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x07, 0xFF, 0x00, 0x3A, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x540E, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x540F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x40, 0x00, 0x02, 0x40, 0x00, 0x01, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x06, 0x38, 0x00, 0x38, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5410, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5411, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5412, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x3E, 0xF0, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x22, 0x00, 0x24, 0x3F, 0x00, 0x27, 0xE0, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x1C, 0x00, 0x44, 0x16, 0x00, 0x44, 0x13, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5415, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x3E, 0x86, 0x00, 0x24, 0x48, 0x00, 0x24, 0x50, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5417, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0xFC, 0x00, 0x3E, 0x08, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x8A, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xFA, 0x00, 0x24, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x541A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x11, 0x00, 0x48, 0x11, 0x00, 0x48, 0x11, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x11, 0x00, 0x48, 0x11, 0x00, 0x48, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x78, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x541B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x12, 0x01, 0x00, 0x22, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x541D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xB0, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x541E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x17, 0xF7, 0x00, 0x24, 0x12, 0x00, 0x44, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x541F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x82, 0x00, 0x27, 0x01, 0x80, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x02, 0x00, 0x24, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5420, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x20, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5421, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x79, 0x10, 0x00, 0x49, 0x11, 0x00, 0x49, 0x13, 0x00, 0x49, 0xDE, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x79, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x80, 0x01, 0xD9, 0x80, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5423, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x24, 0x50, 0x00, 0x24, 0x40, 0x00, 0x25, 0x44, 0x00, 0x25, 0x42, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x3D, 0x45, 0x00, 0x22, 0x45, 0x00, 0x00, 0x44, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x58, 0x00, 0x02, 0x46, 0x00, 0x0C, 0x41, 0x00, 0x30, 0x40, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5427, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x00, 0x00, 0x45, 0x00, 0x00, 0x45, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x81, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5428, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0x00, 0x7C, 0x1E, 0x00, 0x45, 0xF0, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x92, 0x00, 0x44, 0x92, 0x00, 0x44, 0x92, 0x00, 0x44, 0x92, 0x00, 0x44, 0x92, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x80, 0x00, 0x19, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x38, 0x84, 0x00, 0x28, 0x82, 0x00, 0x29, 0x01, 0x00, 0x2A, 0x00, 0x80, 0x2D, 0xFE, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x38, 0x42, 0x00, 0x28, 0x42, 0x00, 0x20, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x04, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x542A, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x50, 0x00, 0x78, 0xD0, 0x00, 0x48, 0x92, 0x00, 0x48, 0x96, 0x00, 0x49, 0x9C, 0x00, 0x4A, 0xB0, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x78, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x91, 0x00, 0x00, 0x93, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x542B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x542C, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x7C, 0xF8, 0x00, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0xFF, 0x80, 0x44, 0x84, 0x00, 0x44, 0x84, 0x00, 0x44, 0x84, 0x00, 0x44, 0x84, 0x00, 0x44, 0x84, 0x00, 0x7D, 0x84, 0x00, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x06, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x542D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x7C, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x80, 0x01, 0x84, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x542E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x7C, 0x42, 0x00, 0x44, 0xC2, 0x00, 0x44, 0x9F, 0x00, 0x47, 0xF5, 0x80, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x80, 0x01, 0x84, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x542F, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x3E, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x34, 0x01, 0x00, 0x24, 0x01, 0x00, 0x67, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5431, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xC6, 0x00, 0x44, 0x6C, 0x00, 0x44, 0x38, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5432, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05, 0xFA, 0x00, 0x3E, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x25, 0xF2, 0x00, 0x25, 0x02, 0x00, 0x25, 0x02, 0x00, 0x25, 0x12, 0x00, 0x25, 0xFA, 0x00, 0x24, 0x12, 0x00, 0x3C, 0x12, 0x00, 0x24, 0x12, 0x00, 0x01, 0x12, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5435, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x54, 0x00, 0x44, 0x56, 0x00, 0x44, 0xD3, 0x00, 0x45, 0x91, 0x80, 0x44, 0x10, 0x00, 0x44, 0x11, 0x00, 0x44, 0x13, 0x00, 0x44, 0x72, 0x00, 0x7C, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5436, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x39, 0x00, 0x49, 0x29, 0x00, 0x49, 0x6D, 0x00, 0x49, 0x45, 0x00, 0x79, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x3C, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFF, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xA2, 0x00, 0x3D, 0x12, 0x00, 0x25, 0x14, 0x00, 0x02, 0x08, 0x00, 0x02, 0x18, 0x00, 0x04, 0x24, 0x00, 0x08, 0xC2, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5439, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x91, 0x00, 0x25, 0x12, 0x00, 0x26, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x84, 0x00, 0x01, 0x02, 0x00, 0x02, 0x01, 0x00, 0x0C, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x543B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x92, 0x80, 0x25, 0x12, 0x80, 0x24, 0x24, 0x80, 0x24, 0x24, 0x80, 0x24, 0x48, 0x80, 0x24, 0x88, 0x80, 0x3D, 0x10, 0x80, 0x24, 0x20, 0x80, 0x20, 0x41, 0x00, 0x00, 0x81, 0x00, 0x03, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x543C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x39, 0xF4, 0x00, 0x28, 0x24, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x5C, 0x00, 0x28, 0xE4, 0x00, 0x2F, 0x44, 0x00, 0x38, 0x44, 0x00, 0x28, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x80, 0x00, 0x47, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x543D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x7C, 0x90, 0x00, 0x44, 0x90, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x10, 0x00, 0x47, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x543E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x14, 0x00, 0x44, 0x34, 0x00, 0x7C, 0x24, 0x00, 0x00, 0x64, 0x00, 0x00, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x79, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x26, 0x00, 0x79, 0x20, 0x00, 0x03, 0x20, 0x00, 0x02, 0x20, 0x80, 0x06, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5444, { 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x0F, 0x00, 0x03, 0x01, 0x00, 0x06, 0x01, 0x00, 0x1C, 0x03, 0x00, 0x70, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5447, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x83, 0x00, 0x7E, 0xC6, 0x00, 0x02, 0xEC, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x544A, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x544B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x3C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x01, 0x04, 0x00, 0x02, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x544D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0xC4, 0x00, 0x7C, 0x86, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9F, 0x00, 0x01, 0xF1, 0x80, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x544E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x7C, 0x8C, 0x00, 0x00, 0x84, 0x00, 0x01, 0x86, 0x00, 0x01, 0x02, 0x00, 0x03, 0x03, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x544F, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x72, 0x00, 0x7B, 0xC2, 0x00, 0x48, 0x42, 0x00, 0x48, 0x42, 0x00, 0x48, 0x42, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x42, 0x00, 0x48, 0x42, 0x00, 0x48, 0x42, 0x00, 0x48, 0x42, 0x00, 0x78, 0x42, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x82, 0x00, 0x01, 0x82, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5450, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x52, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x8A, 0x00, 0x25, 0x02, 0x00, 0x3D, 0x02, 0x00, 0x25, 0x02, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5451, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5452, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x3E, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x90, 0x00, 0x3C, 0x90, 0x00, 0x25, 0x11, 0x00, 0x01, 0x11, 0x00, 0x02, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5453, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4A, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x48, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x08, 0x00, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0x40, 0x00, 0x24, 0x80, 0x00, 0x3D, 0x00, 0x00, 0x25, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5454, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x3C, 0xC8, 0x00, 0x25, 0x24, 0x00, 0x02, 0x24, 0x00, 0x04, 0x03, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5455, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x3F, 0x00, 0x00, 0x25, 0x84, 0x00, 0x25, 0x44, 0x00, 0x25, 0x28, 0x00, 0x25, 0x28, 0x00, 0x25, 0x10, 0x00, 0x25, 0x10, 0x00, 0x25, 0x28, 0x00, 0x25, 0x28, 0x00, 0x25, 0x44, 0x00, 0x3D, 0x84, 0x00, 0x25, 0x02, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5456, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x3F, 0x20, 0x00, 0x25, 0x20, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x3D, 0x22, 0x00, 0x22, 0x42, 0x00, 0x02, 0x42, 0x00, 0x04, 0x94, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5457, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x3E, 0x82, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x20, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x83, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5458, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x30, 0x00, 0x0C, 0x0C, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5459, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x42, 0x00, 0x21, 0x22, 0x00, 0x22, 0x12, 0x00, 0x24, 0x12, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x545B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0x07, 0x00, 0x26, 0xFA, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0xA8, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x545C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x44, 0x00, 0x3E, 0xFE, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x94, 0x00, 0x24, 0x88, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x3C, 0x12, 0x00, 0x23, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x545E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x7C, 0x01, 0x00, 0x44, 0x01, 0x00, 0x44, 0xF9, 0x00, 0x44, 0x01, 0x00, 0x44, 0x01, 0x00, 0x44, 0xF9, 0x00, 0x44, 0x89, 0x00, 0x44, 0x89, 0x00, 0x44, 0x89, 0x00, 0x7C, 0xF9, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x545F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x20, 0x00, 0x44, 0x60, 0x00, 0x44, 0xC4, 0x00, 0x45, 0x8C, 0x00, 0x44, 0xC8, 0x00, 0x44, 0x58, 0x00, 0x44, 0x30, 0x00, 0x7C, 0x20, 0x00, 0x00, 0x62, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x9F, 0x00, 0x03, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x00, 0x00, 0x49, 0x20, 0x00, 0x49, 0x21, 0x00, 0x49, 0x27, 0x00, 0x49, 0x3C, 0x00, 0x79, 0x20, 0x00, 0x03, 0x20, 0x00, 0x02, 0x20, 0x80, 0x06, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5464, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x45, 0x83, 0x00, 0x47, 0x7D, 0x80, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x21, 0x00, 0x44, 0x21, 0x00, 0x7C, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5466, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x79, 0x84, 0x00, 0x49, 0x04, 0x00, 0x4B, 0x1F, 0x80, 0x4A, 0x44, 0x80, 0x4B, 0x44, 0x80, 0x49, 0xC4, 0x80, 0x48, 0x84, 0x80, 0x48, 0x84, 0x80, 0x49, 0x8C, 0x80, 0x79, 0x28, 0x80, 0x01, 0x29, 0x80, 0x03, 0xF9, 0x00, 0x06, 0x11, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5467, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x7C, 0xF8, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0xFF, 0x80, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0x8C, 0x00, 0x7C, 0x84, 0x00, 0x00, 0xE4, 0x00, 0x03, 0x86, 0x00, 0x00, 0x02, 0x80, 0x03, 0xFB, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x0B, 0xFE, 0x80, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x09, 0xFC, 0x80, 0x09, 0x04, 0x80, 0x09, 0x04, 0x80, 0x09, 0xFC, 0x80, 0x11, 0x04, 0x80, 0x10, 0x00, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x92, 0x00, 0x7C, 0x93, 0x00, 0x01, 0x91, 0x00, 0x01, 0x11, 0x80, 0x03, 0x10, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x546A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x80, 0x02, 0x07, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x546B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x3F, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x45, 0xFE, 0x00, 0x45, 0x02, 0x00, 0x7D, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x546D, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x78, 0x92, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x9E, 0x00, 0x78, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x546E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5470, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x21, 0x00, 0x24, 0x27, 0x00, 0x27, 0xBC, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x80, 0x27, 0xB1, 0x80, 0x3C, 0x1F, 0x00, 0x60, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5471, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0xF4, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x22, 0x00, 0x3D, 0x2A, 0x00, 0x02, 0x2A, 0x00, 0x02, 0x3D, 0x00, 0x04, 0xC5, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5472, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x04, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x24, 0x48, 0x00, 0x25, 0x49, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x7C, 0x00, 0x25, 0x48, 0x00, 0x25, 0x48, 0x00, 0x25, 0x48, 0x00, 0x25, 0x48, 0x00, 0x3D, 0x58, 0x00, 0x25, 0x69, 0x00, 0x01, 0x89, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5473, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x38, 0x00, 0x3C, 0x38, 0x00, 0x24, 0x54, 0x00, 0x20, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0x12, 0x00, 0x02, 0x11, 0x00, 0x04, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5474, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x78, 0x80, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x4B, 0x01, 0x00, 0x48, 0xF9, 0x00, 0x48, 0x89, 0x00, 0x48, 0x89, 0x00, 0x48, 0x89, 0x00, 0x48, 0x89, 0x00, 0x78, 0xF9, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3C, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x02, 0x00, 0x24, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5476, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x1F, 0x00, 0x79, 0x09, 0x00, 0x4F, 0xE9, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x2B, 0x00, 0x4B, 0x2A, 0x00, 0x4A, 0x6A, 0x00, 0x4E, 0x4E, 0x00, 0x4B, 0x44, 0x00, 0x79, 0xC4, 0x00, 0x00, 0x8E, 0x00, 0x01, 0xCA, 0x00, 0x03, 0x5B, 0x00, 0x06, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x79, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5478, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0x60, 0x00, 0x24, 0x60, 0x00, 0x24, 0xA8, 0x00, 0x24, 0xA6, 0x00, 0x25, 0x23, 0x00, 0x26, 0x21, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x547B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x547C, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x3D, 0xD0, 0x00, 0x24, 0x11, 0x00, 0x25, 0x11, 0x00, 0x24, 0x92, 0x00, 0x24, 0x52, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x547D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x2E, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x547F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x62, 0x00, 0x00, 0x42, 0x00, 0x00, 0x5F, 0x00, 0x00, 0xF1, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5481, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x44, 0x42, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x7E, 0x00, 0x44, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5482, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x3D, 0x10, 0x00, 0x25, 0x14, 0x00, 0x25, 0x7E, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x3D, 0x5C, 0x00, 0x25, 0x10, 0x00, 0x01, 0x12, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5483, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0xA8, 0x00, 0x78, 0xA8, 0x00, 0x49, 0xAB, 0x00, 0x49, 0x2D, 0x00, 0x4B, 0x39, 0x00, 0x4B, 0x29, 0x00, 0x4D, 0x69, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x2B, 0x00, 0x79, 0x28, 0x00, 0x01, 0x28, 0x00, 0x01, 0x20, 0x80, 0x01, 0x31, 0x80, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5484, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x79, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x79, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5485, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5486, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3C, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x26, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0xF9, 0x00, 0x3C, 0x81, 0x00, 0x24, 0x86, 0x00, 0x20, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5488, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x49, 0x00, 0x48, 0x49, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x48, 0x00, 0x4A, 0x48, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x48, 0x80, 0x48, 0x48, 0x80, 0x78, 0x49, 0x80, 0x00, 0xC9, 0x00, 0x00, 0x8B, 0x00, 0x01, 0x88, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5489, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x28, 0x00, 0x78, 0x6C, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x548B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x44, 0xFF, 0x80, 0x44, 0x90, 0x00, 0x45, 0x90, 0x00, 0x47, 0x10, 0x00, 0x44, 0x1F, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x548C, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x06, 0x11, 0x00, 0x07, 0x11, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0x51, 0x00, 0x12, 0x11, 0x00, 0x22, 0x11, 0x00, 0x02, 0x11, 0x00, 0x02, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x548D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x78, 0xC0, 0x00, 0x48, 0x84, 0x00, 0x49, 0x84, 0x00, 0x49, 0x3E, 0x00, 0x4B, 0xE3, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x548E, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x04, 0x00, 0x07, 0xE4, 0x00, 0x08, 0x4A, 0x00, 0x18, 0x91, 0x00, 0x25, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x548F, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x78, 0x00, 0x00, 0x49, 0xF0, 0x00, 0x48, 0x11, 0x00, 0x48, 0x13, 0x00, 0x4B, 0xD2, 0x00, 0x48, 0x58, 0x00, 0x48, 0xD8, 0x00, 0x48, 0x94, 0x00, 0x79, 0x96, 0x00, 0x03, 0x13, 0x00, 0x06, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5490, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x38, 0x82, 0x00, 0x28, 0x82, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xA2, 0x00, 0x28, 0x92, 0x00, 0x28, 0x8A, 0x00, 0x28, 0x82, 0x00, 0x38, 0x82, 0x00, 0x28, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5491, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x78, 0xBF, 0x80, 0x48, 0x84, 0x00, 0x4B, 0xE4, 0x00, 0x48, 0x84, 0x00, 0x48, 0x84, 0x00, 0x48, 0x84, 0x00, 0x48, 0xE4, 0x00, 0x4B, 0x84, 0x00, 0x48, 0x84, 0x00, 0x78, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5494, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x3E, 0x7E, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x24, 0x50, 0x00, 0x24, 0x48, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5495, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5496, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x79, 0x0F, 0x00, 0x49, 0x09, 0x00, 0x4F, 0xE9, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x7B, 0x29, 0x00, 0x02, 0x29, 0x00, 0x02, 0x69, 0x00, 0x06, 0x4F, 0x00, 0x0C, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5499, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x50, 0x00, 0x3E, 0x48, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x24, 0x52, 0x00, 0x24, 0x52, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x24, 0x98, 0x00, 0x3D, 0x10, 0x00, 0x21, 0x31, 0x00, 0x02, 0x51, 0x00, 0x05, 0x8F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x549A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3E, 0x7C, 0x00, 0x24, 0x84, 0x00, 0x24, 0x88, 0x00, 0x25, 0x50, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0x47, 0x00, 0x26, 0x32, 0x00, 0x3C, 0x10, 0x00, 0x24, 0xC0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x549B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x02, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x549C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x45, 0x00, 0x80, 0x45, 0x00, 0x80, 0x44, 0x40, 0x00, 0x44, 0x43, 0x00, 0x44, 0x4E, 0x00, 0x44, 0x78, 0x00, 0x44, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x80, 0x00, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x549D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x3C, 0x84, 0x00, 0x28, 0x84, 0x00, 0x29, 0x08, 0x00, 0x29, 0x4A, 0x00, 0x2B, 0xDE, 0x00, 0x28, 0x84, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x2A, 0x10, 0x00, 0x3B, 0xDE, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x549F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x08, 0x00, 0x44, 0x18, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x7E, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x7E, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x7C, 0x43, 0x80, 0x00, 0x7E, 0x00, 0x01, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3D, 0x24, 0x00, 0x24, 0xA6, 0x00, 0x24, 0xA8, 0x00, 0x24, 0xA8, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x3C, 0x90, 0x00, 0x25, 0x11, 0x00, 0x01, 0x11, 0x00, 0x02, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x24, 0x1E, 0x00, 0x24, 0xF0, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x1F, 0x80, 0x3D, 0xF0, 0x00, 0x24, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x40, 0x00, 0x44, 0x42, 0x00, 0x44, 0xC2, 0x00, 0x44, 0x9F, 0x00, 0x45, 0xF1, 0x80, 0x44, 0x00, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x48, 0x28, 0x80, 0x78, 0x28, 0x80, 0x00, 0x6D, 0x80, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x07, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xF4, 0x80, 0x78, 0x84, 0x80, 0x48, 0x84, 0x80, 0x48, 0x84, 0x80, 0x49, 0xE4, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x4B, 0xA4, 0x80, 0x4A, 0xE4, 0x80, 0x48, 0x44, 0x80, 0x78, 0xC0, 0x80, 0x00, 0x80, 0x80, 0x01, 0x80, 0x80, 0x03, 0x00, 0x80, 0x06, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54A8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x89, 0x00, 0x01, 0x08, 0x00, 0x07, 0x14, 0x00, 0x38, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54A9, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0xC6, 0x00, 0x7C, 0x44, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54AA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x44, 0xD2, 0x00, 0x44, 0x56, 0x00, 0x44, 0x54, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x38, 0x00, 0x44, 0x38, 0x00, 0x7C, 0x54, 0x00, 0x00, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x10, 0xC0, 0x80, 0x10, 0x80, 0x00, 0x10, 0x40, 0x00, 0x10, 0x30, 0x00, 0x20, 0x0F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54AC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x48, 0x00, 0x48, 0x84, 0x00, 0x49, 0x02, 0x00, 0x4A, 0x85, 0x00, 0x48, 0x84, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x78, 0x30, 0x00, 0x48, 0x30, 0x00, 0x00, 0x48, 0x00, 0x01, 0x86, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54AD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x78, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54AE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x78, 0x90, 0x00, 0x48, 0x90, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x48, 0x54, 0x00, 0x78, 0xD6, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54AF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x4B, 0x8C, 0x00, 0x4E, 0xD8, 0x00, 0x48, 0x70, 0x00, 0x49, 0xDC, 0x00, 0x4F, 0x07, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x79, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54B1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x7C, 0x10, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54B2, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x83, 0x00, 0x00, 0xC6, 0x00, 0x7C, 0x44, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x28, 0x00, 0x44, 0x28, 0x00, 0x7C, 0x6C, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54B3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x25, 0x44, 0x00, 0x24, 0x84, 0x00, 0x24, 0x49, 0x00, 0x24, 0x31, 0x00, 0x3C, 0x22, 0x00, 0x24, 0xC4, 0x00, 0x03, 0x0A, 0x00, 0x00, 0x11, 0x00, 0x00, 0x60, 0x80, 0x03, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54B4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x42, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x24, 0x50, 0x00, 0x24, 0x90, 0x00, 0x24, 0x92, 0x00, 0x25, 0x56, 0x00, 0x26, 0x58, 0x00, 0x24, 0x90, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x87, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54B7, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x78, 0x49, 0x00, 0x4B, 0x4B, 0x00, 0x49, 0xCA, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x48, 0x4E, 0x00, 0x49, 0xCB, 0x00, 0x4B, 0x49, 0x80, 0x78, 0x48, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54B8, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x17, 0xA1, 0x00, 0x10, 0x21, 0x00, 0x10, 0x22, 0x00, 0x17, 0xA2, 0x00, 0x14, 0xA4, 0x00, 0x14, 0x94, 0x00, 0x17, 0x98, 0x00, 0x14, 0x98, 0x00, 0x20, 0x24, 0x80, 0x20, 0xC2, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54B9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x21, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x42, 0x00, 0x48, 0xC6, 0x00, 0x48, 0x84, 0x00, 0x79, 0xEC, 0x00, 0x00, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54BB, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x79, 0x88, 0x00, 0x49, 0x08, 0x00, 0x4B, 0x7F, 0x00, 0x4B, 0x08, 0x00, 0x4D, 0x08, 0x00, 0x49, 0x1C, 0x00, 0x49, 0x1C, 0x00, 0x49, 0x2A, 0x00, 0x49, 0x2A, 0x00, 0x79, 0x49, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x3C, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x94, 0x80, 0x24, 0x94, 0x80, 0x24, 0xA2, 0x80, 0x3C, 0xC1, 0x80, 0x24, 0x80, 0x80, 0x20, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54BE, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x22, 0x00, 0x44, 0x26, 0x00, 0x44, 0x24, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x30, 0x00, 0x44, 0x63, 0x00, 0x44, 0xFE, 0x00, 0x7D, 0xA0, 0x00, 0x03, 0x20, 0x00, 0x00, 0x20, 0x80, 0x00, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54BF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xBF, 0x00, 0x79, 0x89, 0x00, 0x49, 0x09, 0x00, 0x4B, 0x09, 0x00, 0x4B, 0x7F, 0x80, 0x4D, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x09, 0x00, 0x49, 0x3F, 0x00, 0x49, 0x08, 0x00, 0x79, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x18, 0x00, 0x01, 0x10, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54C0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x80, 0x03, 0x09, 0x00, 0x0D, 0x06, 0x00, 0x31, 0x02, 0x00, 0x01, 0xF9, 0x00, 0x1F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x21, 0x10, 0x80, 0x21, 0x10, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x78, 0x48, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x4A, 0xC9, 0x00, 0x4B, 0x8F, 0x00, 0x7A, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54C4, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54C6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3E, 0x00, 0x7C, 0x62, 0x00, 0x44, 0xC6, 0x00, 0x45, 0xAC, 0x00, 0x44, 0x18, 0x00, 0x44, 0x30, 0x00, 0x44, 0xE8, 0x00, 0x44, 0x0F, 0x00, 0x44, 0x19, 0x00, 0x44, 0x33, 0x00, 0x7C, 0xEA, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54C7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54C8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x82, 0x00, 0x27, 0x01, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54C9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x14, 0x00, 0x02, 0x12, 0x00, 0x1F, 0xD1, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x94, 0x00, 0x10, 0x88, 0x00, 0x10, 0x98, 0x80, 0x1F, 0xA4, 0x80, 0x10, 0xC2, 0x80, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54CA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x48, 0x40, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x49, 0x82, 0x00, 0x4A, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0x82, 0x00, 0x78, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54CC, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1E, 0x00, 0x3D, 0xE0, 0x00, 0x25, 0x02, 0x00, 0x25, 0x0C, 0x00, 0x25, 0x70, 0x00, 0x25, 0x50, 0x00, 0x25, 0x52, 0x00, 0x25, 0x54, 0x00, 0x25, 0x48, 0x00, 0x25, 0x48, 0x00, 0x3D, 0x48, 0x00, 0x22, 0x44, 0x00, 0x02, 0x57, 0x00, 0x04, 0x62, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54CD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x00, 0x80, 0x49, 0x00, 0x80, 0x49, 0x3C, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x79, 0x3C, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54CE, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x44, 0x00, 0x00, 0x44, 0x82, 0x00, 0x44, 0xC2, 0x00, 0x44, 0x46, 0x00, 0x44, 0x64, 0x00, 0x44, 0x2C, 0x00, 0x44, 0x18, 0x00, 0x7C, 0x38, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x66, 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54CF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x3E, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xA4, 0x00, 0x24, 0x98, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x88, 0x00, 0x00, 0xA7, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x3F, 0x00, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x10, 0x00, 0x25, 0x10, 0x00, 0x25, 0x7C, 0x00, 0x25, 0x10, 0x00, 0x25, 0x10, 0x00, 0x25, 0x14, 0x00, 0x3D, 0xFE, 0x00, 0x25, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D1, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x3E, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x26, 0x49, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x24, 0xCC, 0x00, 0x24, 0x48, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x00, 0x00, 0x4A, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x38, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x29, 0x12, 0x00, 0x29, 0x7F, 0x00, 0x28, 0x10, 0x00, 0x2F, 0x10, 0x00, 0x29, 0x10, 0x00, 0x29, 0x28, 0x00, 0x29, 0x24, 0x00, 0x39, 0x46, 0x00, 0x29, 0x82, 0x00, 0x03, 0x00, 0x00, 0x04, 0x83, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x3E, 0x7E, 0x00, 0x25, 0xC0, 0x00, 0x24, 0x24, 0x00, 0x24, 0x28, 0x00, 0x24, 0x31, 0x00, 0x25, 0xC9, 0x00, 0x24, 0x07, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x90, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x91, 0x00, 0x01, 0x11, 0x00, 0x02, 0x0F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D4, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3D, 0x12, 0x00, 0x25, 0xD4, 0x00, 0x25, 0x18, 0x00, 0x25, 0x12, 0x00, 0x25, 0x52, 0x00, 0x25, 0x8E, 0x00, 0x24, 0x20, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x22, 0x00, 0x24, 0x20, 0x00, 0x24, 0x7E, 0x00, 0x24, 0xC2, 0x00, 0x25, 0x22, 0x00, 0x3C, 0x14, 0x00, 0x24, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D7, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x04, 0x52, 0x00, 0x3E, 0x96, 0x00, 0x24, 0x98, 0x00, 0x25, 0xB0, 0x00, 0x26, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x8F, 0x00, 0x24, 0xA0, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x4F, 0x00, 0x78, 0x80, 0x00, 0x49, 0x00, 0x00, 0x4A, 0x40, 0x00, 0x48, 0x40, 0x00, 0x48, 0x9F, 0x80, 0x49, 0x82, 0x00, 0x4A, 0x82, 0x00, 0x48, 0x82, 0x00, 0x48, 0x82, 0x00, 0x78, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54D9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x04, 0x50, 0x00, 0x3E, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0x04, 0x00, 0x26, 0xFB, 0x00, 0x24, 0x00, 0x00, 0x24, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x88, 0x00, 0x01, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54DA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFC, 0x00, 0x04, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x25, 0x26, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x70, 0x00, 0x3C, 0x68, 0x00, 0x24, 0xA4, 0x00, 0x01, 0x27, 0x00, 0x06, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54DC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x84, 0x00, 0x24, 0x48, 0x00, 0x24, 0x30, 0x00, 0x24, 0x48, 0x00, 0x24, 0x87, 0x00, 0x27, 0x4A, 0x00, 0x24, 0x48, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x00, 0x00, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54DD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0xA1, 0x00, 0x25, 0x22, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x24, 0x52, 0x00, 0x24, 0x94, 0x00, 0x24, 0xC8, 0x00, 0x3D, 0x48, 0x00, 0x22, 0x44, 0x00, 0x04, 0x57, 0x00, 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54DE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x04, 0x44, 0x00, 0x3E, 0x82, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x94, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x90, 0x00, 0x25, 0x10, 0x00, 0x24, 0x12, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54DF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x90, 0x00, 0x3C, 0x92, 0x00, 0x29, 0x1F, 0x00, 0x29, 0x22, 0x00, 0x2A, 0x42, 0x00, 0x2F, 0x82, 0x00, 0x29, 0x22, 0x00, 0x2A, 0x12, 0x00, 0x2F, 0xD2, 0x00, 0x28, 0x02, 0x00, 0x38, 0xC2, 0x00, 0x27, 0x02, 0x00, 0x02, 0x22, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x78, 0x90, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x78, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0x44, 0x00, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E6, { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0xEB, 0x00, 0x7B, 0x89, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x4F, 0xFF, 0x80, 0x48, 0x88, 0x00, 0x48, 0x89, 0x00, 0x48, 0x89, 0x00, 0x48, 0xEB, 0x00, 0x4B, 0x8A, 0x00, 0x78, 0x8E, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8E, 0x80, 0x00, 0x9B, 0x80, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x3D, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x25, 0x54, 0x00, 0x25, 0x52, 0x00, 0x3D, 0x52, 0x00, 0x22, 0x92, 0x00, 0x04, 0x90, 0x00, 0x01, 0x10, 0x00, 0x02, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x54, 0x00, 0x00, 0x92, 0x00, 0x3D, 0x11, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x3D, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF7, 0x80, 0x78, 0x94, 0x80, 0x48, 0x94, 0x80, 0x48, 0x94, 0x80, 0x4B, 0xF5, 0x00, 0x48, 0x95, 0x00, 0x48, 0x95, 0x00, 0x48, 0x94, 0x80, 0x4B, 0xF4, 0x80, 0x48, 0x94, 0x80, 0x78, 0x94, 0x80, 0x01, 0x94, 0x80, 0x01, 0x35, 0x80, 0x03, 0x24, 0x00, 0x06, 0xE4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54EC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x78, 0x82, 0x00, 0x49, 0x82, 0x00, 0x49, 0x3A, 0x00, 0x4B, 0x2A, 0x00, 0x4B, 0x2A, 0x00, 0x4D, 0x2A, 0x00, 0x49, 0x2A, 0x00, 0x49, 0x2A, 0x00, 0x49, 0x3A, 0x00, 0x79, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54EE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x80, 0x3C, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x12, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x04, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x3C, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x78, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0xC8, 0x80, 0x01, 0x89, 0x80, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54F2, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x04, 0x38, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x00, 0x04, 0xBF, 0x80, 0x07, 0x22, 0x00, 0x3C, 0x22, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x0C, 0x82, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54F3, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x06, 0x00, 0x39, 0x38, 0x00, 0x2F, 0xE0, 0x00, 0x29, 0x20, 0x00, 0x29, 0x22, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x64, 0x00, 0x29, 0xA4, 0x00, 0x2F, 0x24, 0x00, 0x29, 0x24, 0x00, 0x39, 0x24, 0x00, 0x29, 0x44, 0x00, 0x01, 0x44, 0x00, 0x05, 0x84, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54F6, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xC7, 0x80, 0x48, 0x44, 0x00, 0x48, 0x44, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54FA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54FC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x01, 0x00, 0x48, 0x06, 0x00, 0x78, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x01, 0x30, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x70, 0x00, 0x00, 0xDC, 0x00, 0x03, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x54FE, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0x00, 0x78, 0xCC, 0x00, 0x49, 0x86, 0x00, 0x4B, 0x03, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x48, 0x00, 0x78, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0xC9, 0x00, 0x00, 0x89, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x54FF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x7F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x18, 0x91, 0x00, 0x30, 0x91, 0x00, 0x63, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5500, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x79, 0xF0, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x48, 0xD6, 0x00, 0x4B, 0x93, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x24, 0x00, 0x78, 0x27, 0x00, 0x00, 0x61, 0x00, 0x00, 0x41, 0x00, 0x00, 0xC1, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x78, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x78, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x24, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5505, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x78, 0xCC, 0x00, 0x49, 0x86, 0x00, 0x4F, 0x7B, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x02, 0x00, 0x48, 0x04, 0x00, 0x48, 0x08, 0x00, 0x48, 0x10, 0x00, 0x79, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5506, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x42, 0x00, 0x00, 0x8F, 0x00, 0x3B, 0xF8, 0x80, 0x28, 0x48, 0x00, 0x28, 0x88, 0x80, 0x29, 0x0F, 0x80, 0x2E, 0x40, 0x00, 0x28, 0x40, 0x00, 0x38, 0xFE, 0x00, 0x29, 0x84, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x50, 0x00, 0x01, 0x8C, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5507, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x14, 0x00, 0x22, 0x0C, 0x00, 0x23, 0xC3, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x79, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xFE, 0x00, 0x7A, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x03, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5509, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x78, 0xC2, 0x00, 0x48, 0x9F, 0x00, 0x4B, 0xF1, 0x80, 0x48, 0x80, 0x00, 0x48, 0x80, 0x00, 0x49, 0xFF, 0x00, 0x4B, 0x10, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x28, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x550C, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0xC7, 0x00, 0x78, 0x9C, 0x00, 0x48, 0x84, 0x00, 0x49, 0x04, 0x00, 0x49, 0x14, 0x00, 0x4B, 0xD7, 0x00, 0x48, 0x54, 0x00, 0x49, 0x54, 0x00, 0x49, 0x54, 0x00, 0x49, 0x54, 0x00, 0x49, 0xD4, 0x00, 0x78, 0xBF, 0x80, 0x01, 0xC0, 0x00, 0x03, 0x70, 0x00, 0x06, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x550D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x01, 0x00, 0x4A, 0x01, 0x00, 0x48, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x78, 0x48, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x550E, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x01, 0xC4, 0x80, 0x3C, 0x44, 0x80, 0x24, 0x44, 0x80, 0x25, 0xF4, 0x80, 0x24, 0x44, 0x80, 0x24, 0xC4, 0x80, 0x24, 0xE4, 0x80, 0x25, 0x54, 0x80, 0x25, 0x44, 0x80, 0x3E, 0x44, 0x80, 0x24, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0x40, 0x80, 0x00, 0x40, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x550F, { 0x00, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0xE6, 0x00, 0x78, 0x3C, 0x00, 0x48, 0xE6, 0x00, 0x4B, 0x83, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x80, 0x48, 0x40, 0x00, 0x48, 0x90, 0x00, 0x49, 0xFF, 0x00, 0x4F, 0x11, 0x00, 0x79, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5510, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5511, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x01, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x26, 0xAA, 0x00, 0x24, 0x71, 0x00, 0x24, 0x20, 0x00, 0x24, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5514, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x20, 0x00, 0x44, 0x20, 0x00, 0x45, 0xFE, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5515, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5516, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x78, 0x48, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x78, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x551B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x3D, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x24, 0x88, 0x00, 0x3D, 0x50, 0x00, 0x22, 0x20, 0x00, 0x00, 0x58, 0x00, 0x01, 0x87, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x551C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x40, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x91, 0x80, 0x10, 0x9E, 0x00, 0x10, 0x90, 0x80, 0x1F, 0x90, 0x80, 0x10, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5520, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4A, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x21, 0x00, 0x26, 0x22, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x24, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x84, 0x00, 0x01, 0x04, 0x00, 0x02, 0x28, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5522, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x22, 0x00, 0x04, 0xA6, 0x00, 0x3E, 0xA8, 0x00, 0x24, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x54, 0x00, 0x00, 0x48, 0x00, 0x00, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5523, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x44, 0x00, 0x3D, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x20, 0x00, 0x3C, 0x22, 0x00, 0x20, 0x3F, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5524, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x7C, 0x00, 0x24, 0x88, 0x00, 0x25, 0x12, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x83, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5527, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x03, 0xE2, 0x00, 0x3A, 0x5F, 0x00, 0x2A, 0x52, 0x00, 0x2B, 0xD2, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2B, 0xD2, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x92, 0x00, 0x3A, 0x5A, 0x00, 0x2A, 0x94, 0x00, 0x03, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x552A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x28, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x48, 0x92, 0x00, 0x4B, 0x11, 0x80, 0x48, 0xFE, 0x00, 0x78, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x552B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x78, 0x28, 0x00, 0x48, 0x6C, 0x00, 0x48, 0xC6, 0x00, 0x49, 0x83, 0x00, 0x4B, 0x7D, 0x80, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x79, 0x11, 0x00, 0x01, 0x93, 0x00, 0x00, 0x92, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x552C, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0x3E, 0x00, 0x3E, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x21, 0x00, 0x25, 0x2E, 0x00, 0x25, 0xF0, 0x00, 0x25, 0x22, 0x00, 0x25, 0x1E, 0x00, 0x25, 0x08, 0x00, 0x25, 0x7C, 0x00, 0x3D, 0x48, 0x00, 0x26, 0x48, 0x00, 0x04, 0x49, 0x00, 0x08, 0x89, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x552E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x30, 0x40, 0x00, 0x5F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x552F, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x88, 0x00, 0x3C, 0xFF, 0x00, 0x25, 0x88, 0x00, 0x25, 0x88, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x20, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5530, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0B, 0xE2, 0x00, 0x3E, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x2B, 0xEA, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2B, 0xEA, 0x00, 0x2A, 0xAA, 0x00, 0x3A, 0xAA, 0x00, 0x26, 0xAA, 0x00, 0x0A, 0xA2, 0x00, 0x0A, 0xA2, 0x00, 0x12, 0xE2, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x3D, 0x00, 0x80, 0x25, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5532, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x79, 0xCF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xEF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x78, 0x48, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x10, 0x00, 0x7B, 0x38, 0x00, 0x02, 0x28, 0x00, 0x06, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5535, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x24, 0x54, 0x00, 0x24, 0x92, 0x00, 0x27, 0x11, 0x80, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x92, 0x00, 0x00, 0x10, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5536, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x48, 0x44, 0x00, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x78, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5537, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x24, 0x84, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x3C, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5538, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x47, 0x83, 0x80, 0x44, 0x7C, 0x00, 0x44, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x02, 0x00, 0x44, 0x04, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x18, 0x00, 0x01, 0x49, 0x00, 0x01, 0x41, 0x80, 0x03, 0x42, 0x80, 0x02, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5539, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x79, 0x0E, 0x00, 0x4F, 0xEA, 0x00, 0x49, 0x1B, 0x00, 0x49, 0x11, 0x00, 0x49, 0xF1, 0x80, 0x49, 0x20, 0x00, 0x49, 0x2C, 0x00, 0x49, 0x26, 0x00, 0x49, 0x22, 0x00, 0x7B, 0x20, 0x00, 0x02, 0x6C, 0x00, 0x02, 0x46, 0x00, 0x06, 0x43, 0x00, 0x0C, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x553B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x49, 0xD7, 0x00, 0x49, 0x55, 0x00, 0x4B, 0x39, 0x80, 0x48, 0x38, 0x00, 0x78, 0x54, 0x00, 0x00, 0xD6, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x553C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x82, 0x00, 0x48, 0xC6, 0x00, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x42, 0x00, 0x78, 0x86, 0x00, 0x01, 0xEC, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE7, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x553D, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x79, 0x1C, 0x00, 0x4F, 0xD0, 0x00, 0x49, 0x10, 0x00, 0x49, 0x1F, 0x80, 0x49, 0x92, 0x00, 0x4B, 0x52, 0x00, 0x4B, 0x52, 0x00, 0x4D, 0x12, 0x00, 0x49, 0x12, 0x00, 0x79, 0x12, 0x00, 0x01, 0x32, 0x00, 0x01, 0x22, 0x00, 0x01, 0x62, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x553E, { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x553F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x82, 0x00, 0x3E, 0xFF, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x26, 0x4A, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x25, 0x2A, 0x00, 0x24, 0x04, 0x00, 0x24, 0xA0, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x91, 0x00, 0x04, 0x85, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5540, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x79, 0x00, 0x00, 0x49, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x00, 0x00, 0x49, 0x08, 0x00, 0x79, 0x08, 0x00, 0x03, 0x7F, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5541, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x01, 0x00, 0x49, 0x11, 0x00, 0x49, 0x7D, 0x00, 0x49, 0x11, 0x00, 0x49, 0x7D, 0x00, 0x49, 0x11, 0x00, 0x49, 0x01, 0x00, 0x49, 0x7D, 0x00, 0x49, 0x45, 0x00, 0x79, 0x45, 0x00, 0x01, 0x7D, 0x00, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5543, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0xA4, 0x00, 0x3E, 0xBE, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA2, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x04, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x3D, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x14, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x38, 0x30, 0x00, 0x28, 0x50, 0x00, 0x29, 0x91, 0x00, 0x2E, 0x52, 0x00, 0x28, 0x34, 0x00, 0x28, 0x28, 0x00, 0x2A, 0x58, 0x00, 0x39, 0x98, 0x00, 0x2A, 0xB4, 0x00, 0x04, 0x54, 0x00, 0x18, 0x92, 0x00, 0x01, 0x12, 0x00, 0x06, 0x21, 0x00, 0x18, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5545, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x3E, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x78, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5546, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x12, 0x1F, 0x00, 0x1C, 0x01, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5547, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5549, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x78, 0x84, 0x00, 0x4B, 0xDF, 0x80, 0x48, 0x84, 0x00, 0x48, 0x84, 0x00, 0x49, 0xCE, 0x00, 0x49, 0xAE, 0x00, 0x4A, 0x95, 0x00, 0x4A, 0x95, 0x00, 0x4C, 0xA4, 0x80, 0x78, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x554A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0x80, 0x7A, 0x41, 0x00, 0x4A, 0x41, 0x00, 0x4A, 0xDD, 0x00, 0x4A, 0x95, 0x00, 0x4A, 0x95, 0x00, 0x4A, 0x55, 0x00, 0x4A, 0x55, 0x00, 0x4A, 0x55, 0x00, 0x4A, 0x5D, 0x00, 0x7A, 0xC1, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x554C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x48, 0x48, 0x00, 0x48, 0xC8, 0x00, 0x49, 0x8F, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x79, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x554D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x06, 0x00, 0x48, 0x18, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x554F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5550, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x48, 0x44, 0x00, 0x48, 0x44, 0x00, 0x48, 0xEE, 0x00, 0x49, 0xAB, 0x00, 0x48, 0x00, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5551, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x11, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x90, 0x00, 0x78, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x01, 0xD0, 0x00, 0x03, 0x70, 0x00, 0x06, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5553, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x9F, 0x80, 0x10, 0xB1, 0x00, 0x10, 0xCA, 0x00, 0x1F, 0x84, 0x00, 0x10, 0x8A, 0x00, 0x20, 0x31, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5555, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0x02, 0x00, 0x3D, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x2D, 0x12, 0x00, 0x29, 0xFA, 0x00, 0x2A, 0x42, 0x00, 0x28, 0x4A, 0x00, 0x2F, 0xFE, 0x00, 0x28, 0x42, 0x00, 0x2A, 0x4A, 0x00, 0x3A, 0x4A, 0x00, 0x2B, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5556, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x92, 0x00, 0x3C, 0x94, 0x00, 0x24, 0x10, 0x00, 0x24, 0x28, 0x00, 0x24, 0x46, 0x00, 0x25, 0x91, 0x80, 0x24, 0x12, 0x00, 0x24, 0x94, 0x00, 0x3C, 0x98, 0x00, 0x24, 0xA8, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5557, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x78, 0xC2, 0x00, 0x48, 0x86, 0x00, 0x49, 0x84, 0x00, 0x4B, 0x1C, 0x00, 0x48, 0x00, 0x00, 0x48, 0x60, 0x00, 0x49, 0xCF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x79, 0xEF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5558, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x48, 0x80, 0x00, 0x48, 0xEF, 0x00, 0x48, 0xA9, 0x00, 0x49, 0xA9, 0x00, 0x49, 0x29, 0x00, 0x4B, 0xE9, 0x00, 0x78, 0x4B, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x555A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x13, 0xF2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x555B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x11, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x42, 0x00, 0x00, 0x84, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x2F, 0x00, 0x03, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x555C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xDF, 0x00, 0x78, 0x41, 0x00, 0x49, 0x4A, 0x00, 0x48, 0x84, 0x00, 0x49, 0x4A, 0x00, 0x4A, 0x11, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xDF, 0x00, 0x48, 0x41, 0x00, 0x4A, 0x49, 0x00, 0x79, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x01, 0x44, 0x00, 0x02, 0x4A, 0x00, 0x04, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x555D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x7B, 0x87, 0x80, 0x48, 0x84, 0x80, 0x48, 0x84, 0x80, 0x4F, 0xF4, 0x80, 0x48, 0x84, 0x80, 0x48, 0x84, 0x80, 0x49, 0xC4, 0x80, 0x49, 0xA4, 0x80, 0x4B, 0xB4, 0x80, 0x7A, 0x97, 0x80, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x555E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x48, 0x00, 0x38, 0x48, 0x00, 0x28, 0x48, 0x00, 0x2B, 0xCF, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x3B, 0xCF, 0x00, 0x28, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5560, { 0x00, 0x00, 0x00, 0x01, 0x83, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xBF, 0x80, 0x12, 0x24, 0x00, 0x32, 0x64, 0x00, 0x62, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5561, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x7C, 0x24, 0x00, 0x45, 0xE7, 0x80, 0x44, 0x24, 0x00, 0x44, 0x24, 0x00, 0x44, 0x24, 0x00, 0x45, 0xE7, 0x80, 0x44, 0x24, 0x00, 0x44, 0x24, 0x00, 0x44, 0x64, 0x00, 0x7D, 0xA7, 0x80, 0x00, 0x24, 0x00, 0x00, 0x64, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5563, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x39, 0x07, 0x80, 0x2B, 0xF4, 0x80, 0x2C, 0x84, 0x80, 0x28, 0x84, 0x80, 0x2F, 0xFC, 0x80, 0x28, 0x84, 0x80, 0x28, 0x84, 0x80, 0x2A, 0xF4, 0x80, 0x2A, 0x84, 0x80, 0x2A, 0x84, 0x80, 0x3A, 0x84, 0x80, 0x2A, 0xF7, 0x00, 0x07, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5564, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x21, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x78, 0x88, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5565, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0xFF, 0x00, 0x26, 0x22, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x3D, 0x04, 0x00, 0x25, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5566, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x78, 0x84, 0x00, 0x48, 0x9F, 0x80, 0x4B, 0xE0, 0x00, 0x48, 0x91, 0x00, 0x48, 0x91, 0x00, 0x48, 0x91, 0x00, 0x48, 0xDB, 0x00, 0x4B, 0x8A, 0x00, 0x48, 0x8A, 0x00, 0x78, 0x8A, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x82, 0x00, 0x00, 0xBF, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5567, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x04, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x24, 0x00, 0x00, 0x58, 0x00, 0x00, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x556A, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x09, 0x08, 0x00, 0x3D, 0x12, 0x00, 0x2F, 0xFF, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x62, 0x00, 0x29, 0xBE, 0x00, 0x2F, 0x22, 0x00, 0x29, 0x22, 0x00, 0x39, 0x22, 0x00, 0x29, 0x22, 0x00, 0x01, 0x22, 0x00, 0x05, 0x3E, 0x00, 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x556C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x556D, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3C, 0x8A, 0x00, 0x2B, 0xFF, 0x00, 0x29, 0x08, 0x00, 0x29, 0x0A, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x88, 0x00, 0x2F, 0xC8, 0x00, 0x28, 0x90, 0x00, 0x28, 0xBF, 0x00, 0x39, 0xC2, 0x00, 0x26, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x86, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x556E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3E, 0xBE, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA2, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x5A, 0x00, 0x3D, 0x8A, 0x00, 0x25, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5575, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x39, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x2C, 0x49, 0x00, 0x2A, 0x4A, 0x00, 0x28, 0x48, 0x00, 0x29, 0x7E, 0x00, 0x29, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2E, 0x54, 0x00, 0x3A, 0x48, 0x00, 0x2A, 0x94, 0x00, 0x02, 0x94, 0x00, 0x03, 0x23, 0x00, 0x02, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5576, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x26, 0x02, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x90, 0x00, 0x24, 0x9E, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x90, 0x00, 0x01, 0x50, 0x00, 0x02, 0x30, 0x00, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5577, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0B, 0xDE, 0x00, 0x3E, 0x52, 0x00, 0x2A, 0x54, 0x00, 0x2B, 0xD4, 0x00, 0x2A, 0x58, 0x00, 0x2A, 0x54, 0x00, 0x2B, 0xD2, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x3A, 0x92, 0x00, 0x2A, 0x5A, 0x00, 0x02, 0xD4, 0x00, 0x03, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5578, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x3D, 0xFE, 0x00, 0x24, 0x24, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x25, 0x24, 0x00, 0x25, 0x74, 0x00, 0x25, 0x6C, 0x00, 0x3D, 0xAC, 0x00, 0x21, 0x24, 0x00, 0x02, 0x24, 0x00, 0x04, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x557B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x8C, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x557C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x26, 0x10, 0x80, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x557E, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0xE4, 0x00, 0x7B, 0x84, 0x80, 0x48, 0x94, 0x80, 0x48, 0x95, 0x80, 0x4B, 0xF5, 0x00, 0x48, 0x95, 0x00, 0x48, 0x84, 0x00, 0x49, 0xC4, 0x00, 0x49, 0xAE, 0x00, 0x79, 0x8A, 0x00, 0x02, 0x8A, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x9B, 0x00, 0x00, 0x91, 0x00, 0x00, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x557F, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x82, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0x82, 0x00, 0x4F, 0xFF, 0x80, 0x79, 0x24, 0x00, 0x01, 0x24, 0x00, 0x01, 0xC7, 0x80, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5580, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x20, 0x80, 0x48, 0x20, 0x00, 0x48, 0x7E, 0x00, 0x48, 0xC4, 0x00, 0x49, 0x28, 0x00, 0x4E, 0x10, 0x00, 0x48, 0x6C, 0x00, 0x79, 0x83, 0x80, 0x4E, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x44, 0x91, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x91, 0x00, 0x44, 0x91, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x45, 0x10, 0x80, 0x7D, 0x14, 0x80, 0x01, 0x1E, 0x80, 0x01, 0x72, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x91, 0x00, 0x78, 0x9B, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x8C, 0x00, 0x00, 0xE6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5583, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x8A, 0x00, 0x4A, 0x52, 0x00, 0x4A, 0xFA, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x7A, 0xFA, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5584, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5586, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5587, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x28, 0x89, 0x00, 0x2B, 0xE9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x2B, 0xE9, 0x00, 0x28, 0x89, 0x00, 0x39, 0x89, 0x00, 0x01, 0xC9, 0x00, 0x02, 0xA9, 0x00, 0x04, 0x81, 0x00, 0x08, 0x81, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5588, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x09, 0x80, 0x79, 0xEF, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x80, 0x49, 0xC7, 0x80, 0x4B, 0x10, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x79, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5589, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xBE, 0x00, 0x39, 0x02, 0x00, 0x29, 0x02, 0x00, 0x2B, 0xFF, 0x80, 0x2B, 0x10, 0x00, 0x2D, 0x20, 0x00, 0x2D, 0x7F, 0x00, 0x29, 0x88, 0x00, 0x29, 0x08, 0x00, 0x39, 0xFF, 0x80, 0x29, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x12, 0x00, 0x01, 0x21, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x558A, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0x00, 0x3B, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2B, 0xF8, 0x00, 0x2A, 0x09, 0x00, 0x2A, 0x09, 0x00, 0x2A, 0xEA, 0x00, 0x3A, 0xAA, 0x00, 0x2A, 0xAC, 0x00, 0x22, 0xE4, 0x00, 0x02, 0x0A, 0x80, 0x04, 0x12, 0x80, 0x04, 0x21, 0x80, 0x08, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x558B, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x9E, 0x00, 0x48, 0x80, 0x00, 0x48, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x54, 0x00, 0x00, 0x54, 0x00, 0x00, 0xD6, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x558E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x01, 0x00, 0x4A, 0x79, 0x00, 0x4A, 0x49, 0x00, 0x7A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x79, 0x00, 0x02, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x558F, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0xFF, 0x00, 0x7D, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5591, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x82, 0x00, 0x48, 0xC6, 0x00, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x78, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5592, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0xF4, 0x00, 0x78, 0x94, 0x00, 0x49, 0x97, 0x80, 0x4B, 0x34, 0x00, 0x4E, 0xA4, 0x00, 0x48, 0x64, 0x00, 0x48, 0xD8, 0x00, 0x49, 0x8E, 0x00, 0x4B, 0x03, 0x80, 0x48, 0x00, 0x00, 0x79, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5593, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x44, 0x80, 0x4A, 0x44, 0x80, 0x4A, 0x7C, 0x80, 0x48, 0x20, 0x00, 0x48, 0x40, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x82, 0x00, 0x78, 0x86, 0x00, 0x01, 0xE4, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x67, 0x00, 0x03, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5594, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x45, 0x01, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x00, 0x00, 0x45, 0x7F, 0x00, 0x45, 0x10, 0x00, 0x45, 0x22, 0x00, 0x45, 0x7F, 0x00, 0x45, 0x09, 0x00, 0x7D, 0x08, 0x00, 0x03, 0x7F, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5597, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x00, 0x80, 0x4A, 0x10, 0x80, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x79, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5598, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x28, 0x00, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x28, 0x40, 0x00, 0x3B, 0xFF, 0x00, 0x2A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5599, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x38, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0xFC, 0x00, 0x28, 0x08, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x68, 0x00, 0x28, 0x99, 0x00, 0x2B, 0x2A, 0x00, 0x38, 0x4C, 0x00, 0x29, 0x9C, 0x00, 0x06, 0x2A, 0x00, 0x00, 0xCA, 0x00, 0x07, 0x11, 0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x559A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x84, 0x00, 0x25, 0x08, 0x00, 0x26, 0xFF, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xC7, 0x00, 0x24, 0x91, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x559C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x559D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x88, 0x80, 0x3D, 0x94, 0x80, 0x02, 0xA2, 0x80, 0x04, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x559E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x8F, 0x80, 0x7B, 0xE8, 0x80, 0x4A, 0x28, 0x80, 0x4A, 0x28, 0x80, 0x4B, 0xE8, 0x80, 0x4A, 0x28, 0x80, 0x4A, 0x28, 0x80, 0x4B, 0xE8, 0x80, 0x4A, 0x08, 0x80, 0x4A, 0x08, 0x80, 0x7B, 0xE8, 0x80, 0x02, 0x0B, 0x80, 0x02, 0x08, 0x00, 0x03, 0xE8, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x559F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7D, 0x10, 0x80, 0x45, 0xFF, 0x80, 0x45, 0x10, 0x80, 0x45, 0x10, 0x80, 0x45, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55A3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x27, 0x01, 0x00, 0x24, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3C, 0xF9, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55A4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x79, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55A7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x2A, 0x00, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55A8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x80, 0x4A, 0x44, 0x80, 0x78, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC4, 0x80, 0x01, 0x84, 0x80, 0x07, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x39, 0x82, 0x00, 0x2E, 0xFD, 0x80, 0x28, 0x00, 0x00, 0x29, 0xE5, 0x00, 0x29, 0x25, 0x00, 0x29, 0xEA, 0x00, 0x29, 0x34, 0x00, 0x29, 0xF2, 0x00, 0x39, 0x2A, 0x00, 0x29, 0x29, 0x00, 0x01, 0x25, 0x00, 0x01, 0x65, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55AA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x40, 0x00, 0x04, 0x21, 0x00, 0x04, 0x12, 0x00, 0x04, 0xEC, 0x00, 0x07, 0x06, 0x00, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55AB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x38, 0x9F, 0x00, 0x28, 0x85, 0x00, 0x2B, 0xE5, 0x00, 0x28, 0x85, 0x00, 0x2B, 0xE9, 0x00, 0x38, 0x89, 0x00, 0x2F, 0xF6, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55AC, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x32, 0x0B, 0x80, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55AD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x48, 0x38, 0x00, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x04, 0x00, 0x49, 0x1C, 0x00, 0x49, 0x73, 0x00, 0x49, 0x06, 0x00, 0x79, 0x1D, 0x80, 0x03, 0x73, 0x00, 0x02, 0x06, 0x00, 0x06, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x47, 0x93, 0x80, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x80, 0x44, 0x91, 0x80, 0x7C, 0x9B, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x86, 0x00, 0x00, 0xF3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55B1, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3A, 0x14, 0x00, 0x24, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x08, 0x12, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B2, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x78, 0x84, 0x00, 0x4B, 0x2F, 0x80, 0x49, 0x68, 0x80, 0x48, 0xD8, 0x80, 0x48, 0x80, 0x80, 0x49, 0x20, 0x80, 0x4B, 0xF7, 0x80, 0x48, 0x90, 0x80, 0x48, 0x80, 0x80, 0x7A, 0xA0, 0x80, 0x02, 0xB0, 0x80, 0x06, 0x91, 0x80, 0x04, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x24, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x70, 0x00, 0x24, 0xA8, 0x00, 0x25, 0x27, 0x00, 0x26, 0x22, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x3D, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B5, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x3A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x02, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B6, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x19, 0x86, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B7, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x05, 0xFE, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x8A, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0x04, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x24, 0x00, 0x00, 0x48, 0x00, 0x00, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55B9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x22, 0x00, 0x3B, 0xFF, 0x00, 0x28, 0x50, 0x00, 0x28, 0xA8, 0x00, 0x29, 0xFC, 0x00, 0x2E, 0x23, 0x00, 0x29, 0xFC, 0x00, 0x28, 0x20, 0x00, 0x28, 0x24, 0x00, 0x3B, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x00, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55BB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x60, 0x00, 0x3C, 0x90, 0x00, 0x29, 0x08, 0x00, 0x2A, 0xF7, 0x00, 0x2C, 0x02, 0x00, 0x2B, 0xC4, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x2B, 0xD4, 0x00, 0x2A, 0x54, 0x00, 0x3A, 0x54, 0x00, 0x2B, 0xD4, 0x00, 0x02, 0x44, 0x00, 0x02, 0x54, 0x00, 0x02, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55BD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x05, 0x24, 0x00, 0x3E, 0xA8, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x24, 0xA8, 0x00, 0x25, 0x24, 0x00, 0x24, 0x40, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x3D, 0x08, 0x00, 0x24, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0x98, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55BE, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x08, 0x88, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x48, 0x92, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55BF, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55C1, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3E, 0x00, 0x7B, 0xE8, 0x00, 0x4A, 0x0F, 0x00, 0x4A, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x4A, 0x88, 0x80, 0x4A, 0x8E, 0x00, 0x4A, 0xB8, 0x80, 0x4A, 0x8F, 0x80, 0x4A, 0x80, 0x00, 0x7A, 0x92, 0x00, 0x02, 0x92, 0x00, 0x04, 0x92, 0x80, 0x01, 0x32, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55C3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x7D, 0x00, 0x79, 0x45, 0x00, 0x01, 0x45, 0x00, 0x01, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x78, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x78, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x07, 0x04, 0x00, 0x00, 0x88, 0x00, 0x00, 0x70, 0x00, 0x07, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55C5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x14, 0x00, 0x3C, 0x12, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55C6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x78, 0x6C, 0x00, 0x48, 0xC6, 0x00, 0x4B, 0xBB, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x79, 0x80, 0x00, 0x01, 0x7F, 0x00, 0x03, 0x41, 0x00, 0x06, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55C7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x09, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55C9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x48, 0x22, 0x00, 0x48, 0xC4, 0x00, 0x48, 0x29, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x10, 0x80, 0x00, 0x54, 0x00, 0x00, 0xD6, 0x00, 0x03, 0x93, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55CB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x61, 0x00, 0x49, 0x87, 0x00, 0x48, 0x82, 0x00, 0x4B, 0xEF, 0x80, 0x49, 0x24, 0x80, 0x4B, 0x69, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x79, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55CC, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x8C, 0x00, 0x79, 0x86, 0x00, 0x4B, 0x7B, 0x00, 0x48, 0x00, 0x00, 0x48, 0x7C, 0x00, 0x49, 0x06, 0x00, 0x4B, 0x03, 0x00, 0x4E, 0x01, 0x80, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x7A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55CD, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x02, 0x2F, 0x00, 0x09, 0x4A, 0x00, 0x3F, 0xFA, 0x00, 0x28, 0x8A, 0x00, 0x2A, 0xAE, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAE, 0x00, 0x2B, 0xEA, 0x00, 0x38, 0xAA, 0x00, 0x28, 0x92, 0x00, 0x01, 0x12, 0x00, 0x02, 0x2A, 0x00, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x78, 0x00, 0x80, 0x00, 0x08, 0x80, 0x02, 0xAC, 0x80, 0x06, 0xA5, 0x80, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55D1, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x79, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x48, 0x84, 0x00, 0x49, 0x3E, 0x00, 0x4B, 0xE3, 0x00, 0x48, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55D2, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x48, 0x10, 0x00, 0x48, 0x38, 0x00, 0x48, 0x6C, 0x00, 0x48, 0xC6, 0x00, 0x4B, 0xBB, 0x80, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x78, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55D3, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x24, 0x00, 0x78, 0x18, 0x00, 0x48, 0xE7, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xEF, 0x80, 0x49, 0x45, 0x00, 0x48, 0x82, 0x00, 0x4B, 0x6D, 0x80, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x54, 0x00, 0x00, 0xD6, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55D4, { 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0xF8, 0x00, 0x3C, 0x80, 0x80, 0x24, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x25, 0x7E, 0x00, 0x25, 0x42, 0x00, 0x25, 0x7E, 0x00, 0x25, 0x42, 0x00, 0x25, 0x7E, 0x00, 0x3D, 0x42, 0x00, 0x25, 0x7E, 0x00, 0x21, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55D6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xA4, 0x00, 0x3D, 0x2E, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0xAC, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x3D, 0xFC, 0x00, 0x24, 0x88, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0xD8, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55D7, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x78, 0x9E, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x80, 0x4A, 0x00, 0x80, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x78, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55D8, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x00, 0x79, 0xE2, 0x00, 0x49, 0x33, 0x00, 0x4B, 0x11, 0x00, 0x4A, 0x20, 0x00, 0x48, 0x64, 0x00, 0x48, 0xC8, 0x00, 0x48, 0x52, 0x00, 0x48, 0x3F, 0x00, 0x49, 0xE1, 0x80, 0x78, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55DA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x84, 0x80, 0x20, 0x12, 0x80, 0x00, 0x09, 0x80, 0x02, 0x48, 0x80, 0x02, 0x21, 0x00, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55DB, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x48, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x49, 0x00, 0x48, 0x49, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x49, 0x00, 0x48, 0x49, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x4C, 0x00, 0x00, 0xCA, 0x00, 0x01, 0xCB, 0x00, 0x03, 0x49, 0x80, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55DC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x14, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x67, 0x00, 0x25, 0xB8, 0x00, 0x26, 0xC1, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55DD, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x3D, 0xFE, 0x00, 0x29, 0x04, 0x00, 0x29, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x28, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x52, 0x00, 0x3A, 0xFA, 0x00, 0x2A, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x2A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55DE, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x48, 0x00, 0x00, 0x48, 0x82, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x4A, 0x49, 0x00, 0x49, 0x45, 0x00, 0x48, 0x82, 0x00, 0x78, 0x82, 0x00, 0x01, 0x45, 0x00, 0x01, 0x45, 0x00, 0x03, 0xEF, 0x80, 0x02, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55DF, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x3C, 0x80, 0x00, 0x25, 0xFF, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55E1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x50, 0x00, 0x3C, 0x88, 0x00, 0x29, 0x24, 0x00, 0x2A, 0x43, 0x00, 0x2C, 0x8A, 0x00, 0x29, 0xFC, 0x00, 0x28, 0x00, 0x00, 0x2B, 0xDE, 0x00, 0x28, 0x42, 0x00, 0x2A, 0x52, 0x00, 0x39, 0x4A, 0x00, 0x2A, 0x52, 0x00, 0x00, 0x42, 0x00, 0x01, 0x4A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x72, 0x00, 0x49, 0x5A, 0x00, 0x49, 0x86, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x7A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x9F, 0x80, 0x10, 0x80, 0x80, 0x10, 0x80, 0x80, 0x1F, 0xBF, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xDE, 0x80, 0x15, 0x52, 0x80, 0x15, 0x52, 0x80, 0x1F, 0xDE, 0x80, 0x15, 0x52, 0x80, 0x15, 0x40, 0x80, 0x35, 0x40, 0x80, 0x35, 0xC0, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55E4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x21, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55E5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x44, 0x00, 0x3D, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x24, 0xA8, 0x00, 0x3D, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x04, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55E6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x3C, 0x20, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x21, 0x00, 0x2C, 0x4A, 0x00, 0x29, 0xF8, 0x00, 0x28, 0x20, 0x00, 0x28, 0x44, 0x00, 0x2B, 0xFE, 0x00, 0x38, 0xA8, 0x00, 0x29, 0x26, 0x00, 0x02, 0x22, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55E8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x3A, 0xFE, 0x00, 0x28, 0x80, 0x00, 0x29, 0xFC, 0x00, 0x2C, 0x84, 0x00, 0x2A, 0xA4, 0x00, 0x28, 0x94, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xA4, 0x00, 0x3A, 0x94, 0x00, 0x2C, 0x84, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55E9, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x79, 0x11, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55EA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x05, 0xFE, 0x00, 0x3E, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x40, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0xFC, 0x00, 0x26, 0x23, 0x00, 0x3D, 0xFC, 0x00, 0x24, 0x60, 0x00, 0x00, 0xB8, 0x00, 0x03, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55EB, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x39, 0x08, 0x00, 0x29, 0xF8, 0x00, 0x29, 0x08, 0x00, 0x29, 0xF8, 0x00, 0x29, 0x0A, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x08, 0x00, 0x2F, 0xDE, 0x00, 0x28, 0x42, 0x00, 0x3A, 0x52, 0x00, 0x2A, 0x94, 0x00, 0x01, 0x08, 0x00, 0x02, 0x94, 0x00, 0x04, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55EC, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x94, 0x00, 0x0B, 0xFE, 0x00, 0x3C, 0x90, 0x00, 0x28, 0x82, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x04, 0x00, 0x2B, 0x04, 0x00, 0x2D, 0x74, 0x00, 0x29, 0x54, 0x00, 0x29, 0x54, 0x00, 0x39, 0x74, 0x00, 0x29, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x14, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55EF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x24, 0x00, 0x25, 0x54, 0x00, 0x25, 0x8C, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x3C, 0x00, 0x00, 0x22, 0xA2, 0x00, 0x02, 0x91, 0x00, 0x04, 0x85, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55F2, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x8C, 0x00, 0x05, 0x52, 0x00, 0x3E, 0x20, 0x00, 0x24, 0xD8, 0x00, 0x27, 0x27, 0x00, 0x24, 0x78, 0x00, 0x25, 0xC8, 0x00, 0x24, 0x30, 0x00, 0x25, 0xD0, 0x00, 0x24, 0x3C, 0x00, 0x3D, 0xC4, 0x00, 0x24, 0x48, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55F3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x3C, 0x00, 0x3D, 0xC0, 0x00, 0x29, 0x24, 0x00, 0x28, 0xA8, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x41, 0x00, 0x2C, 0x42, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x80, 0x00, 0x28, 0xF8, 0x00, 0x39, 0x88, 0x00, 0x29, 0x50, 0x00, 0x02, 0x20, 0x00, 0x04, 0x58, 0x00, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55F5, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x3A, 0x28, 0x00, 0x2A, 0x12, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x92, 0x00, 0x2E, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x3A, 0x92, 0x00, 0x2A, 0x96, 0x00, 0x05, 0x03, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x79, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55F7, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x7B, 0xE4, 0x00, 0x48, 0x87, 0x80, 0x48, 0x8D, 0x00, 0x4B, 0xE9, 0x00, 0x48, 0x99, 0x00, 0x48, 0x85, 0x00, 0x4F, 0xF5, 0x00, 0x49, 0x07, 0x00, 0x49, 0xE2, 0x00, 0x79, 0x22, 0x00, 0x01, 0x27, 0x00, 0x03, 0x25, 0x00, 0x02, 0x2D, 0x80, 0x06, 0xE8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55F9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7B, 0xFF, 0x80, 0x49, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x4B, 0x49, 0x00, 0x49, 0x49, 0x00, 0x48, 0x7F, 0x00, 0x4F, 0x49, 0x00, 0x49, 0x49, 0x00, 0x49, 0x7F, 0x00, 0x79, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x03, 0x08, 0x00, 0x02, 0x88, 0x00, 0x06, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55FD, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x38, 0x84, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x8D, 0x00, 0x2B, 0xF4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2B, 0xE4, 0x00, 0x39, 0x84, 0x00, 0x21, 0xC4, 0x00, 0x02, 0xAA, 0x00, 0x04, 0x8A, 0x00, 0x08, 0x91, 0x00, 0x10, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x55FE, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x39, 0x10, 0x00, 0x2F, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x29, 0x48, 0x00, 0x29, 0xC8, 0x00, 0x29, 0x5F, 0x00, 0x29, 0x64, 0x00, 0x29, 0x44, 0x00, 0x39, 0x7F, 0x80, 0x29, 0x44, 0x00, 0x02, 0x4A, 0x00, 0x02, 0x4A, 0x00, 0x04, 0x91, 0x00, 0x0B, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x55FF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x00, 0x78, 0xC6, 0x00, 0x4B, 0xBB, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x04, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x79, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5600, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x28, 0x52, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xFA, 0x00, 0x3A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x02, 0xFA, 0x00, 0x02, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5601, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x3B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0xF2, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2B, 0xF4, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x3D, 0xC8, 0x00, 0x26, 0xA8, 0x00, 0x08, 0x95, 0x00, 0x11, 0xA5, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5605, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x1F, 0x00, 0x7B, 0xC2, 0x00, 0x4A, 0x52, 0x00, 0x4B, 0xD2, 0x00, 0x4A, 0x52, 0x00, 0x4A, 0x52, 0x00, 0x4B, 0xDF, 0x80, 0x48, 0x02, 0x00, 0x4A, 0x62, 0x00, 0x4B, 0xC6, 0x00, 0x7A, 0x06, 0x00, 0x02, 0x2A, 0x00, 0x01, 0xEA, 0x80, 0x00, 0x12, 0x80, 0x00, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5606, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x38, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5608, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x44, 0x80, 0x4B, 0xFF, 0x80, 0x4A, 0x44, 0x80, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5609, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x3F, 0x3E, 0x00, 0x09, 0x22, 0x00, 0x11, 0x22, 0x00, 0x13, 0x3E, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x560A, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x00, 0x4A, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x4A, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x7A, 0x00, 0x00, 0x02, 0x08, 0x00, 0x06, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x560C, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFF, 0x00, 0x38, 0x50, 0x00, 0x28, 0x52, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0xA8, 0x00, 0x01, 0x26, 0x00, 0x02, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x560D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x4B, 0xFF, 0x80, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x3E, 0x00, 0x03, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x560E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x78, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x78, 0x81, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x48, 0x00, 0x00, 0x30, 0x00, 0x01, 0xCC, 0x80, 0x0F, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x560F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x7D, 0x21, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x1F, 0x00, 0x7D, 0xE9, 0x00, 0x45, 0x0B, 0x00, 0x45, 0x0A, 0x00, 0x45, 0xEE, 0x00, 0x45, 0x04, 0x00, 0x7D, 0x0E, 0x00, 0x01, 0x1B, 0x00, 0x01, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5610, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x78, 0x63, 0x00, 0x48, 0xA5, 0x00, 0x48, 0x63, 0x00, 0x48, 0xA5, 0x00, 0x48, 0x11, 0x00, 0x48, 0x38, 0x00, 0x48, 0xEE, 0x00, 0x4B, 0x83, 0x80, 0x48, 0x10, 0x00, 0x78, 0xE4, 0x00, 0x00, 0x19, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5611, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x20, 0x80, 0x4A, 0x38, 0x80, 0x4A, 0xE2, 0x00, 0x4A, 0x3E, 0x00, 0x4A, 0x00, 0x00, 0x4A, 0x0F, 0x00, 0x7A, 0xF8, 0x00, 0x06, 0x49, 0x00, 0x04, 0x2A, 0x00, 0x0D, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5612, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x7B, 0xEF, 0x80, 0x48, 0x82, 0x00, 0x4B, 0xEF, 0x80, 0x48, 0x82, 0x00, 0x48, 0xEF, 0x80, 0x4B, 0x82, 0x00, 0x48, 0x82, 0x00, 0x48, 0x00, 0x00, 0x79, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5614, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x3D, 0x1E, 0x00, 0x25, 0x12, 0x00, 0x25, 0x12, 0x00, 0x25, 0x1E, 0x00, 0x25, 0x00, 0x00, 0x25, 0x3F, 0x00, 0x25, 0x2D, 0x00, 0x25, 0x2D, 0x00, 0x3D, 0x3F, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5616, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x79, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5617, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x23, 0xF8, 0x80, 0x02, 0x08, 0x00, 0x13, 0xF8, 0x00, 0x10, 0x1F, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5618, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x20, 0x80, 0x4A, 0x3D, 0x00, 0x4A, 0xE0, 0x00, 0x4A, 0x21, 0x00, 0x4A, 0x1F, 0x00, 0x4A, 0x00, 0x00, 0x7A, 0x24, 0x00, 0x06, 0xA4, 0x80, 0x04, 0xA5, 0x00, 0x0C, 0xA5, 0x00, 0x18, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5619, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0x04, 0x00, 0x71, 0xBF, 0x80, 0x56, 0x24, 0x80, 0x53, 0x3F, 0x00, 0x50, 0x29, 0x00, 0x51, 0xAA, 0x00, 0x53, 0x64, 0x00, 0x56, 0xCA, 0x00, 0x50, 0x31, 0x80, 0x50, 0x40, 0x00, 0x77, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x01, 0xE8, 0x00, 0x00, 0x3C, 0x00, 0x03, 0xE7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x561B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x77, 0xFF, 0x80, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x57, 0xEF, 0x80, 0x54, 0x82, 0x00, 0x56, 0xAA, 0x80, 0x56, 0xAA, 0x80, 0x56, 0xAA, 0x80, 0x76, 0xAA, 0x80, 0x06, 0xAA, 0x80, 0x0E, 0x8A, 0x00, 0x0A, 0x8A, 0x00, 0x18, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x561E, { 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x09, 0x48, 0x00, 0x3F, 0xF8, 0x00, 0x29, 0x4A, 0x00, 0x29, 0xDF, 0x00, 0x28, 0x8A, 0x00, 0x2B, 0xEA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2B, 0xEA, 0x00, 0x28, 0x8A, 0x00, 0x2F, 0xFA, 0x00, 0x38, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0xAA, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x561F, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0x1E, 0x00, 0x3F, 0xD2, 0x00, 0x29, 0x12, 0x00, 0x29, 0x52, 0x00, 0x2F, 0xF4, 0x00, 0x29, 0x12, 0x00, 0x2B, 0xD2, 0x00, 0x2E, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x2B, 0xD1, 0x00, 0x3A, 0x5A, 0x00, 0x2A, 0x54, 0x00, 0x03, 0xD0, 0x00, 0x02, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5623, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x02, 0x00, 0x2B, 0xDF, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2B, 0xDE, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x3B, 0xDE, 0x00, 0x2A, 0x52, 0x00, 0x04, 0x52, 0x00, 0x05, 0x6A, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5624, { 0x00, 0x00, 0x00, 0x03, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x3E, 0xD6, 0x00, 0x2A, 0xD6, 0x00, 0x2B, 0x5A, 0x00, 0x2B, 0x5A, 0x00, 0x2A, 0x94, 0x00, 0x2C, 0x62, 0x00, 0x28, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x39, 0x08, 0x00, 0x28, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0x98, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5627, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x3A, 0x01, 0x00, 0x2C, 0x4A, 0x00, 0x28, 0xA8, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xA5, 0x00, 0x2C, 0xC5, 0x00, 0x29, 0x7C, 0x00, 0x2E, 0x20, 0x00, 0x39, 0x24, 0x00, 0x29, 0x24, 0x00, 0x01, 0x24, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5629, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x562C, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x78, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x49, 0x20, 0x00, 0x49, 0xEF, 0x00, 0x49, 0x25, 0x00, 0x49, 0xE5, 0x00, 0x79, 0x27, 0x00, 0x01, 0x22, 0x00, 0x01, 0xE7, 0x00, 0x03, 0x2D, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x562D, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0xA2, 0x00, 0x07, 0xF2, 0x00, 0x38, 0x84, 0x00, 0x2B, 0xE4, 0x00, 0x28, 0x08, 0x00, 0x2B, 0xE2, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x24, 0x00, 0x2B, 0xE9, 0x00, 0x28, 0x01, 0x00, 0x3A, 0x22, 0x00, 0x29, 0x42, 0x00, 0x07, 0xF4, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x562F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x38, 0x22, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x29, 0xFE, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2B, 0xA7, 0x00, 0x2A, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x03, 0xA7, 0x00, 0x02, 0xA5, 0x00, 0x04, 0xA5, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5630, { 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x01, 0x12, 0x00, 0x7B, 0x56, 0x80, 0x48, 0x91, 0x00, 0x49, 0x12, 0x80, 0x49, 0x57, 0x80, 0x4B, 0xD2, 0x00, 0x48, 0x11, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x10, 0x00, 0x49, 0x09, 0x00, 0x79, 0x8A, 0x00, 0x01, 0x44, 0x00, 0x03, 0x4A, 0x80, 0x02, 0x13, 0x80, 0x06, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5631, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x00, 0x80, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x00, 0x4A, 0xFF, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0xFF, 0x00, 0x4A, 0x91, 0x00, 0x4A, 0xFF, 0x00, 0x7A, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x05, 0x14, 0x80, 0x0D, 0x1E, 0x80, 0x19, 0x72, 0x80, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5632, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x87, 0x80, 0x07, 0xF4, 0x80, 0x38, 0x84, 0x80, 0x2B, 0xE4, 0x80, 0x2A, 0x27, 0x80, 0x2A, 0x24, 0x80, 0x2B, 0xE4, 0x80, 0x2A, 0x24, 0x80, 0x2A, 0x27, 0x80, 0x3B, 0xE4, 0x80, 0x2A, 0xA4, 0x80, 0x00, 0x84, 0x80, 0x07, 0xF4, 0x80, 0x00, 0x88, 0x80, 0x00, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5633, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFC, 0x00, 0x79, 0x24, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x79, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5634, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x02, 0xE9, 0x80, 0x3A, 0x8E, 0x00, 0x2A, 0xF8, 0x80, 0x2F, 0x8F, 0x80, 0x28, 0x40, 0x00, 0x28, 0xFC, 0x00, 0x29, 0x10, 0x00, 0x3B, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5635, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x48, 0x82, 0x00, 0x4B, 0xEF, 0x80, 0x48, 0x82, 0x00, 0x48, 0xE2, 0x00, 0x4B, 0x8F, 0x80, 0x48, 0x00, 0x00, 0x79, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0x44, 0x80, 0x00, 0xC4, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5636, { 0x00, 0x00, 0x00, 0x01, 0x23, 0x00, 0x01, 0x2C, 0x00, 0x39, 0x28, 0x00, 0x2F, 0xF8, 0x00, 0x29, 0x28, 0x00, 0x29, 0x2F, 0x80, 0x29, 0xE9, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x29, 0xE9, 0x00, 0x29, 0x29, 0x00, 0x39, 0x29, 0x00, 0x27, 0xF9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x29, 0x00, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5637, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFC, 0x00, 0x79, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xAE, 0x00, 0x78, 0x20, 0x00, 0x03, 0xAE, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5638, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7B, 0xFE, 0x00, 0x4F, 0x54, 0x00, 0x49, 0x54, 0x00, 0x49, 0x54, 0x00, 0x4F, 0xFF, 0x00, 0x49, 0x54, 0x00, 0x49, 0x54, 0x00, 0x49, 0x54, 0x00, 0x79, 0x54, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x54, 0x00, 0x03, 0x56, 0x00, 0x06, 0x53, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5639, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x49, 0x45, 0x00, 0x48, 0x82, 0x00, 0x49, 0xFF, 0x00, 0x4A, 0x82, 0x80, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x78, 0x10, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x563B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x82, 0x00, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x563C, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x563D, { 0x00, 0x00, 0x00, 0x03, 0xDE, 0x00, 0x02, 0x52, 0x00, 0x7B, 0xDE, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x79, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x563F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x49, 0x93, 0x00, 0x49, 0x55, 0x00, 0x49, 0x39, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0x49, 0x00, 0x03, 0x6D, 0x80, 0x02, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5640, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x7A, 0x28, 0x80, 0x4B, 0xEF, 0x80, 0x4A, 0x08, 0x00, 0x4A, 0x28, 0x80, 0x49, 0xE7, 0x80, 0x48, 0x00, 0x00, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x78, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5641, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x28, 0x00, 0x49, 0xEF, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xEF, 0x00, 0x48, 0x28, 0x00, 0x48, 0x28, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x78, 0x18, 0x00, 0x01, 0x49, 0x00, 0x01, 0x41, 0x80, 0x03, 0x42, 0x80, 0x02, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5642, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x28, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x29, 0x00, 0x49, 0xCF, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x02, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x42, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5643, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF8, 0x00, 0x79, 0x11, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x48, 0xD6, 0x00, 0x49, 0x93, 0x00, 0x4B, 0x11, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5644, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xEF, 0x80, 0x7B, 0x84, 0x80, 0x48, 0xE4, 0x80, 0x4B, 0x8C, 0x80, 0x48, 0xE9, 0x80, 0x4B, 0x9B, 0x00, 0x48, 0x80, 0x00, 0x48, 0x44, 0x00, 0x48, 0x88, 0x00, 0x48, 0x51, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x10, 0x80, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5646, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x07, 0xDF, 0x00, 0x7A, 0x8A, 0x00, 0x4A, 0x8A, 0x00, 0x4F, 0xDF, 0x80, 0x49, 0x86, 0x00, 0x4A, 0xCA, 0x80, 0x4C, 0x93, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x79, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5649, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0xF4, 0x00, 0x78, 0x84, 0x00, 0x48, 0x87, 0x80, 0x4B, 0xF5, 0x00, 0x49, 0x29, 0x00, 0x49, 0x25, 0x00, 0x49, 0xE5, 0x00, 0x49, 0x25, 0x00, 0x49, 0x27, 0x00, 0x49, 0xE2, 0x00, 0x79, 0x22, 0x00, 0x01, 0x27, 0x00, 0x01, 0xE5, 0x00, 0x07, 0x2D, 0x80, 0x00, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x564B, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xF4, 0x00, 0x48, 0x0F, 0x80, 0x4B, 0xE9, 0x00, 0x4A, 0x39, 0x00, 0x4B, 0xEB, 0x00, 0x48, 0x0A, 0x00, 0x4B, 0xEA, 0x00, 0x48, 0x4E, 0x00, 0x48, 0x84, 0x00, 0x78, 0xE4, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x9B, 0x00, 0x03, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x564C, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x80, 0x45, 0x10, 0x80, 0x45, 0x10, 0x80, 0x45, 0xFF, 0x80, 0x45, 0x10, 0x80, 0x45, 0x10, 0x80, 0x45, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x564D, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x90, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x4B, 0x10, 0x00, 0x4D, 0xFE, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x4A, 0x00, 0x03, 0x4B, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x564E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x02, 0x00, 0x4A, 0xFA, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x79, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x88, 0x00, 0x00, 0x50, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x564F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x00, 0x78, 0xC6, 0x00, 0x4B, 0xBB, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xEF, 0x80, 0x48, 0xA2, 0x80, 0x7B, 0x2C, 0x80, 0x00, 0x61, 0x80, 0x01, 0xA6, 0x80, 0x02, 0x28, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5650, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5653, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3E, 0x00, 0x38, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x21, 0x00, 0x2A, 0x3E, 0x00, 0x2B, 0xE1, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x00, 0x00, 0x3A, 0x28, 0x00, 0x2A, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x02, 0xEE, 0x00, 0x04, 0x28, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5654, { 0x00, 0x00, 0x00, 0x01, 0xF9, 0x00, 0x02, 0x2A, 0x80, 0x79, 0x6D, 0x00, 0x48, 0xC6, 0x00, 0x49, 0x83, 0x00, 0x4B, 0x7D, 0x80, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0x82, 0x00, 0x78, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5657, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x01, 0x54, 0x00, 0x3C, 0xD8, 0x00, 0x24, 0x52, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0x50, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5658, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFF, 0x00, 0x3A, 0x04, 0x00, 0x2B, 0x14, 0x00, 0x2A, 0xA7, 0x00, 0x2B, 0xF9, 0x00, 0x2A, 0x42, 0x00, 0x2B, 0x54, 0x00, 0x2B, 0x54, 0x00, 0x2B, 0x54, 0x00, 0x3D, 0xF4, 0x00, 0x24, 0x54, 0x00, 0x04, 0x44, 0x00, 0x08, 0x8A, 0x00, 0x11, 0x12, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5659, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x08, 0x50, 0x00, 0x3C, 0x88, 0x00, 0x29, 0x24, 0x00, 0x2A, 0xFB, 0x00, 0x2C, 0x50, 0x00, 0x29, 0x24, 0x00, 0x29, 0x54, 0x00, 0x29, 0xFC, 0x00, 0x28, 0x22, 0x00, 0x3B, 0xFF, 0x00, 0x2A, 0x4A, 0x00, 0x02, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x565B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x78, 0x9F, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x4B, 0xFF, 0x80, 0x49, 0x01, 0x00, 0x49, 0x55, 0x00, 0x49, 0x11, 0x00, 0x49, 0x7D, 0x00, 0x49, 0x11, 0x00, 0x79, 0x39, 0x00, 0x01, 0x55, 0x00, 0x01, 0x11, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x565C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0xF8, 0x00, 0x3D, 0x10, 0x00, 0x2B, 0xFE, 0x00, 0x2E, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x39, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x565E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x78, 0x6C, 0x00, 0x48, 0xC6, 0x00, 0x4B, 0x83, 0x80, 0x48, 0x7C, 0x00, 0x48, 0x00, 0x00, 0x49, 0xEF, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0xEF, 0x00, 0x78, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0xC7, 0x00, 0x03, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5660, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7B, 0x7F, 0x00, 0x49, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x4B, 0x22, 0x00, 0x49, 0x14, 0x00, 0x48, 0x7F, 0x00, 0x4F, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x08, 0x00, 0x79, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x02, 0x80, 0x00, 0x06, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5661, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x88, 0x00, 0x7B, 0xFF, 0x80, 0x49, 0x22, 0x00, 0x49, 0xC3, 0x80, 0x49, 0x3E, 0x00, 0x49, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x00, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x00, 0x00, 0x79, 0x3E, 0x00, 0x01, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5662, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x05, 0x00, 0x49, 0x79, 0x00, 0x49, 0x55, 0x00, 0x49, 0x11, 0x00, 0x49, 0x7D, 0x00, 0x49, 0x39, 0x00, 0x49, 0x55, 0x00, 0x49, 0x21, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5663, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x7A, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x49, 0xFF, 0x80, 0x4B, 0x20, 0x80, 0x4F, 0xFC, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x79, 0xFC, 0x80, 0x00, 0x28, 0x80, 0x00, 0xFD, 0x80, 0x03, 0x85, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5664, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x48, 0xEE, 0x00, 0x49, 0x55, 0x00, 0x4A, 0x44, 0x80, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5666, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x9F, 0x00, 0x78, 0x90, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x05, 0x00, 0x48, 0x04, 0x80, 0x4B, 0xFF, 0x80, 0x4A, 0x02, 0x00, 0x4A, 0xFA, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0xAA, 0x80, 0x7B, 0xAB, 0x00, 0x02, 0x32, 0x00, 0x02, 0xC6, 0x80, 0x02, 0x0A, 0x80, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5668, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0C, 0x0C, 0x00, 0x30, 0x03, 0x80, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5669, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1E, 0xBC, 0x00, 0x12, 0xA4, 0x00, 0x1E, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1E, 0xBC, 0x00, 0x12, 0xA4, 0x00, 0x1E, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x566A, { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x48, 0xF8, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xDE, 0x00, 0x4A, 0x52, 0x00, 0x4A, 0x52, 0x00, 0x4B, 0xDE, 0x00, 0x78, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xA8, 0x00, 0x01, 0xAC, 0x00, 0x03, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x566B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x28, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x00, 0x21, 0x00, 0x02, 0x90, 0x80, 0x02, 0x82, 0x80, 0x04, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x566C, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x7B, 0xDF, 0x00, 0x4A, 0x94, 0x00, 0x4C, 0xA4, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x7B, 0xAE, 0x00, 0x02, 0xAA, 0x00, 0x04, 0x71, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x566D, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x7B, 0xE4, 0x00, 0x4A, 0x2F, 0x80, 0x4B, 0xE9, 0x00, 0x4A, 0x39, 0x00, 0x4B, 0xE9, 0x00, 0x48, 0x8D, 0x00, 0x4F, 0xF5, 0x00, 0x49, 0x07, 0x00, 0x49, 0xE2, 0x00, 0x79, 0x22, 0x00, 0x03, 0x27, 0x00, 0x02, 0x65, 0x00, 0x06, 0x4D, 0x80, 0x0C, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x566F, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x03, 0xFC, 0x00, 0x79, 0x21, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x10, 0x80, 0x49, 0x49, 0x00, 0x49, 0x42, 0x80, 0x4A, 0x3E, 0x00, 0x48, 0x40, 0x00, 0x48, 0xFE, 0x00, 0x79, 0x82, 0x00, 0x03, 0x4C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5671, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x20, 0x80, 0x4A, 0xFC, 0x00, 0x4A, 0x21, 0x00, 0x4A, 0x1F, 0x00, 0x4A, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x20, 0x00, 0x7A, 0xD1, 0x00, 0x02, 0x2A, 0x00, 0x02, 0xDC, 0x00, 0x04, 0x2A, 0x00, 0x01, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5672, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x78, 0xC6, 0x00, 0x4B, 0xBB, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x55, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x78, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5674, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x82, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5675, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x79, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5676, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x07, 0xFF, 0x00, 0x3C, 0x88, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x22, 0x00, 0x3E, 0x32, 0x00, 0x25, 0x4A, 0x00, 0x01, 0x02, 0x00, 0x01, 0xF2, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5678, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x3F, 0x80, 0x71, 0xC4, 0x00, 0x57, 0x1F, 0x00, 0x51, 0x11, 0x00, 0x55, 0x51, 0x00, 0x55, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x00, 0x57, 0xDF, 0x00, 0x51, 0x11, 0x00, 0x71, 0x11, 0x00, 0x01, 0x5F, 0x00, 0x00, 0xCA, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x567A, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x80, 0x00, 0x8F, 0x00, 0x77, 0xF8, 0x00, 0x52, 0x28, 0x00, 0x53, 0x68, 0x00, 0x51, 0x4F, 0x80, 0x57, 0xF9, 0x00, 0x50, 0x89, 0x00, 0x50, 0x89, 0x00, 0x57, 0xF9, 0x00, 0x50, 0x89, 0x00, 0x71, 0xC9, 0x00, 0x01, 0xA9, 0x00, 0x02, 0x89, 0x00, 0x04, 0x89, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x567B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x3B, 0xFF, 0x00, 0x2A, 0x89, 0x00, 0x2D, 0xFE, 0x00, 0x28, 0x88, 0x00, 0x29, 0xFC, 0x00, 0x28, 0x88, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0xA8, 0x00, 0x29, 0x24, 0x00, 0x3A, 0xFB, 0x00, 0x24, 0x20, 0x00, 0x00, 0x24, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x567C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE4, 0x00, 0x3A, 0x3F, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x2A, 0x00, 0x2B, 0xEA, 0x00, 0x2A, 0x1F, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0xE4, 0x00, 0x2B, 0x24, 0x00, 0x3B, 0x3F, 0x00, 0x25, 0x24, 0x00, 0x05, 0x24, 0x00, 0x09, 0xE4, 0x00, 0x11, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5680, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x4A, 0x20, 0x80, 0x4A, 0x50, 0x80, 0x49, 0x45, 0x00, 0x4A, 0x7C, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x49, 0x00, 0x79, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5684, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x44, 0x00, 0x48, 0x88, 0x00, 0x49, 0xFF, 0x80, 0x4B, 0x10, 0x00, 0x4D, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x78, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x46, 0x00, 0x00, 0x38, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5685, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x10, 0x80, 0x4A, 0xD6, 0x80, 0x4A, 0x10, 0x80, 0x48, 0xD6, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x20, 0x00, 0x7B, 0xFF, 0x80, 0x02, 0x48, 0x80, 0x02, 0x48, 0x80, 0x02, 0x48, 0x80, 0x02, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5686, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x54, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x2A, 0x00, 0x80, 0x22, 0x7C, 0x80, 0x02, 0x44, 0x80, 0x02, 0x7C, 0x80, 0x02, 0x44, 0x80, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5687, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x77, 0xDF, 0x00, 0x51, 0x04, 0x00, 0x51, 0x04, 0x00, 0x51, 0x04, 0x00, 0x5F, 0xFF, 0x80, 0x52, 0x8A, 0x00, 0x52, 0x8A, 0x00, 0x5A, 0xDB, 0x00, 0x7A, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x12, 0x8A, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x09, 0xA6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5688, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x74, 0x00, 0x00, 0x55, 0xE3, 0x00, 0x55, 0x22, 0x80, 0x55, 0xE2, 0x00, 0x55, 0x2F, 0x80, 0x55, 0xE2, 0x00, 0x54, 0x02, 0x00, 0x55, 0xE2, 0x00, 0x55, 0x22, 0x00, 0x75, 0xE7, 0x00, 0x05, 0x25, 0x00, 0x09, 0xE5, 0x00, 0x01, 0x2D, 0x80, 0x01, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x568A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x21, 0x00, 0x4B, 0xFF, 0x00, 0x7A, 0x21, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x568B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x80, 0x48, 0xFE, 0x80, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x01, 0x00, 0x03, 0xDF, 0x80, 0x02, 0x49, 0x00, 0x03, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x568C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x28, 0x00, 0x4B, 0xD7, 0x80, 0x49, 0x55, 0x00, 0x49, 0x55, 0x00, 0x4A, 0xD6, 0x80, 0x48, 0x00, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x568E, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x48, 0xF8, 0x00, 0x48, 0x88, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x01, 0x00, 0x4D, 0xFE, 0x00, 0x48, 0x40, 0x00, 0x48, 0xA4, 0x00, 0x4B, 0x78, 0x00, 0x78, 0xA8, 0x00, 0x4B, 0x67, 0x00, 0x00, 0xA2, 0x00, 0x03, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x568F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x80, 0x48, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x48, 0xFE, 0x00, 0x78, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x90, 0x80, 0x00, 0x9F, 0x00, 0x01, 0x50, 0x00, 0x06, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5693, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x3B, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2C, 0xDE, 0x00, 0x29, 0x54, 0x00, 0x2B, 0x58, 0x00, 0x28, 0x88, 0x00, 0x29, 0xFC, 0x00, 0x2A, 0x03, 0x00, 0x2D, 0xFC, 0x00, 0x38, 0x20, 0x00, 0x28, 0xA8, 0x00, 0x01, 0x26, 0x00, 0x02, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5694, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x80, 0x48, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x48, 0xFE, 0x00, 0x78, 0x41, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x90, 0x80, 0x00, 0x9F, 0x00, 0x01, 0x50, 0x00, 0x06, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5695, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xFC, 0x00, 0x79, 0x88, 0x00, 0x4F, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x49, 0x00, 0x4A, 0x24, 0x80, 0x48, 0x00, 0x00, 0x79, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5699, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x78, 0x9F, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x4B, 0xFF, 0x80, 0x49, 0x45, 0x00, 0x49, 0x45, 0x00, 0x49, 0xAB, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x45, 0x00, 0x01, 0x45, 0x00, 0x01, 0xAB, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x569A, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x569D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x42, 0x00, 0x4A, 0xFF, 0x00, 0x4A, 0x42, 0x00, 0x4A, 0x7E, 0x00, 0x4A, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x10, 0x00, 0x4A, 0xFF, 0x00, 0x4A, 0x91, 0x00, 0x7A, 0xFF, 0x00, 0x06, 0x91, 0x00, 0x04, 0xFF, 0x00, 0x0C, 0x42, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x569E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x569F, { 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x03, 0x9F, 0x80, 0x70, 0xB2, 0x80, 0x57, 0xE6, 0x80, 0x52, 0x8C, 0x80, 0x56, 0xE1, 0x80, 0x54, 0x87, 0x00, 0x50, 0xB0, 0x00, 0x50, 0x78, 0x00, 0x51, 0xCE, 0x00, 0x57, 0x03, 0x80, 0x70, 0x20, 0x00, 0x03, 0x27, 0x00, 0x00, 0xF8, 0x00, 0x01, 0xAE, 0x00, 0x07, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A0, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x06, 0x7A, 0x80, 0x74, 0x2A, 0x80, 0x55, 0x2A, 0x80, 0x57, 0x4A, 0x80, 0x54, 0x9A, 0x80, 0x51, 0x42, 0x80, 0x52, 0x22, 0x80, 0x55, 0xD2, 0x80, 0x50, 0x82, 0x80, 0x53, 0xE2, 0x80, 0x70, 0x80, 0x80, 0x04, 0x90, 0x80, 0x02, 0xA0, 0x80, 0x00, 0xF0, 0x80, 0x07, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x48, 0x04, 0x80, 0x12, 0x12, 0x00, 0x6F, 0xFD, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x24, 0x00, 0x78, 0x18, 0x00, 0x0F, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A3, { 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x09, 0x48, 0x00, 0x02, 0x20, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56A5, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x38, 0x48, 0x00, 0x28, 0x78, 0x00, 0x29, 0x02, 0x00, 0x2F, 0x7A, 0x80, 0x29, 0x4B, 0x00, 0x29, 0x4A, 0x00, 0x3F, 0x7A, 0x80, 0x29, 0x4B, 0x80, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x48, 0x80, 0x04, 0x48, 0x80, 0x04, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x22, 0x00, 0x4A, 0xEE, 0x00, 0x4A, 0x44, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0xEE, 0x00, 0x4B, 0x55, 0x00, 0x4A, 0x44, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0x90, 0x00, 0x7A, 0x9F, 0x00, 0x02, 0x90, 0x00, 0x04, 0x90, 0x00, 0x00, 0x90, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3C, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x21, 0x00, 0x4A, 0xFC, 0x00, 0x4A, 0x21, 0x00, 0x4A, 0xFF, 0x00, 0x4A, 0x92, 0x00, 0x4A, 0xFE, 0x00, 0x4A, 0x92, 0x00, 0x7A, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x01, 0x49, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A8, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x49, 0x14, 0x00, 0x48, 0xA7, 0x80, 0x4B, 0xF8, 0x80, 0x48, 0x07, 0x80, 0x49, 0xF4, 0x00, 0x49, 0x17, 0x80, 0x49, 0xF4, 0x00, 0x49, 0x17, 0x80, 0x79, 0xF4, 0x00, 0x01, 0x17, 0x80, 0x01, 0x14, 0x00, 0x01, 0x14, 0x80, 0x01, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56A9, { 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x01, 0x85, 0x00, 0x71, 0x3F, 0x80, 0x56, 0x44, 0x00, 0x52, 0xDF, 0x00, 0x51, 0x95, 0x00, 0x51, 0x1F, 0x00, 0x52, 0x55, 0x00, 0x57, 0xDF, 0x00, 0x51, 0x55, 0x00, 0x51, 0x02, 0x00, 0x75, 0x5F, 0x80, 0x0D, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x01, 0x02, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56AB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x9F, 0x00, 0x7B, 0xF1, 0x00, 0x49, 0x51, 0x00, 0x49, 0x5F, 0x00, 0x49, 0x51, 0x00, 0x4B, 0xF1, 0x00, 0x48, 0x9F, 0x00, 0x48, 0x91, 0x00, 0x4B, 0xF1, 0x00, 0x48, 0x9F, 0x00, 0x79, 0xCA, 0x00, 0x02, 0xAA, 0x00, 0x04, 0x9A, 0x80, 0x00, 0x92, 0x80, 0x00, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56AC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x9F, 0x80, 0x00, 0x82, 0x00, 0x3A, 0xE4, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x2F, 0xF9, 0x00, 0x28, 0x8F, 0x00, 0x28, 0x99, 0x00, 0x2A, 0x99, 0x00, 0x2A, 0xAF, 0x00, 0x3D, 0xC9, 0x00, 0x28, 0x49, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56AD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x04, 0x00, 0x3F, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x3F, 0x3A, 0x00, 0x21, 0x6B, 0x00, 0x3F, 0x49, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56AE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xF7, 0x80, 0x33, 0x14, 0x80, 0x0D, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x33, 0xF4, 0x80, 0x0D, 0x04, 0x80, 0x09, 0xF5, 0x80, 0x31, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56AF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x38, 0x20, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x2C, 0x72, 0x00, 0x28, 0xA8, 0x00, 0x28, 0x90, 0x00, 0x29, 0xFE, 0x00, 0x2B, 0x10, 0x00, 0x2D, 0xFE, 0x00, 0x39, 0x10, 0x00, 0x29, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56B1, { 0x00, 0x00, 0x00, 0x01, 0x05, 0x00, 0x01, 0xE5, 0x80, 0x71, 0x04, 0x80, 0x57, 0xE4, 0x00, 0x55, 0x27, 0x80, 0x57, 0xDC, 0x00, 0x55, 0x24, 0x00, 0x54, 0xE5, 0x00, 0x54, 0x05, 0x00, 0x57, 0xF7, 0x00, 0x54, 0x02, 0x00, 0x77, 0xE2, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xE6, 0x80, 0x19, 0x4D, 0x80, 0x03, 0xE8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56B3, { 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x1C, 0xCE, 0x00, 0x11, 0x22, 0x00, 0x1C, 0x0E, 0x00, 0x11, 0x22, 0x00, 0x1C, 0xCE, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x08, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56B4, { 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x17, 0xC4, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xEF, 0x80, 0x14, 0x49, 0x00, 0x17, 0xD1, 0x00, 0x14, 0x6A, 0x00, 0x17, 0xC6, 0x00, 0x14, 0x44, 0x00, 0x15, 0xCA, 0x00, 0x2E, 0x51, 0x00, 0x20, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x7A, 0x28, 0x80, 0x4B, 0xEF, 0x80, 0x4A, 0x28, 0x80, 0x4B, 0xEF, 0x80, 0x4A, 0x28, 0x80, 0x4B, 0xEF, 0x80, 0x49, 0x45, 0x00, 0x4A, 0x28, 0x80, 0x78, 0x40, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x3C, 0x00, 0x03, 0xE7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56B7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x00, 0x00, 0x49, 0xEF, 0x00, 0x49, 0x29, 0x00, 0x49, 0xEF, 0x00, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x00, 0x48, 0x80, 0x03, 0x85, 0x00, 0x00, 0xF2, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56BC, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x01, 0xE1, 0x00, 0x01, 0x10, 0x80, 0x3A, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x44, 0x80, 0x2B, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x2B, 0xE2, 0x00, 0x2A, 0x22, 0x00, 0x3B, 0xFF, 0x80, 0x2B, 0xE2, 0x00, 0x02, 0x12, 0x00, 0x03, 0xEA, 0x00, 0x03, 0xE2, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56BE, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0xC7, 0x80, 0x78, 0x44, 0x00, 0x49, 0xEF, 0x00, 0x49, 0x29, 0x00, 0x49, 0xEF, 0x00, 0x48, 0x42, 0x00, 0x48, 0x44, 0x00, 0x48, 0xFF, 0x00, 0x49, 0x88, 0x00, 0x4A, 0xFE, 0x00, 0x78, 0x88, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56C0, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x3F, 0x80, 0x77, 0xC4, 0x00, 0x51, 0x1F, 0x80, 0x57, 0xD4, 0x80, 0x55, 0x5F, 0x80, 0x55, 0x54, 0x80, 0x57, 0xDF, 0x80, 0x55, 0x49, 0x00, 0x55, 0x5E, 0x80, 0x57, 0xC1, 0x00, 0x71, 0x3F, 0x80, 0x07, 0xC1, 0x00, 0x01, 0x11, 0x00, 0x01, 0x09, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56C1, { 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x78, 0xFC, 0x00, 0x48, 0x84, 0x00, 0x48, 0xFC, 0x00, 0x48, 0x87, 0x00, 0x4B, 0xFC, 0x00, 0x48, 0x04, 0x00, 0x4F, 0xFF, 0x80, 0x4A, 0x49, 0x00, 0x4B, 0xCF, 0x00, 0x7A, 0x49, 0x00, 0x03, 0xCF, 0x00, 0x02, 0x49, 0x00, 0x0F, 0xDF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56C2, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x70, 0x03, 0x80, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56C3, { 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x77, 0xD2, 0x00, 0x50, 0x1F, 0x80, 0x52, 0xB2, 0x00, 0x52, 0x92, 0x00, 0x55, 0x52, 0x00, 0x50, 0x1F, 0x80, 0x51, 0x12, 0x00, 0x57, 0xD2, 0x00, 0x51, 0x12, 0x00, 0x73, 0x9F, 0x80, 0x03, 0x52, 0x00, 0x05, 0x52, 0x00, 0x09, 0x12, 0x00, 0x01, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x77, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0x4A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0x54, 0x80, 0x08, 0x55, 0x00, 0x7F, 0x56, 0x00, 0x08, 0x9B, 0x00, 0x08, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56C8, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x78, 0x48, 0x00, 0x48, 0x84, 0x00, 0x4B, 0xE4, 0x00, 0x48, 0x8F, 0x00, 0x4F, 0xF5, 0x00, 0x4A, 0x2D, 0x00, 0x4C, 0xB7, 0x00, 0x49, 0xC5, 0x00, 0x78, 0x85, 0x00, 0x07, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x01, 0x02, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x49, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x48, 0x85, 0x00, 0x4B, 0x0F, 0x80, 0x49, 0x5A, 0x00, 0x48, 0x8A, 0x00, 0x49, 0x2F, 0x00, 0x4B, 0xEA, 0x00, 0x78, 0xAA, 0x00, 0x00, 0x8F, 0x00, 0x01, 0xAA, 0x00, 0x02, 0xAA, 0x00, 0x00, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56CA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0xA2, 0x80, 0x0F, 0xBE, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xA2, 0x00, 0x3E, 0x14, 0x00, 0x03, 0xCC, 0x00, 0x1E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56CB, { 0x00, 0x00, 0x00, 0x05, 0x14, 0x00, 0x07, 0xDF, 0x00, 0x75, 0x14, 0x00, 0x51, 0x04, 0x00, 0x5F, 0xDF, 0x80, 0x52, 0x8A, 0x00, 0x52, 0x4A, 0x80, 0x57, 0xFF, 0x80, 0x52, 0x02, 0x00, 0x53, 0xFE, 0x00, 0x52, 0x02, 0x00, 0x73, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56CC, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x07, 0xFF, 0x80, 0x70, 0x84, 0x00, 0x52, 0x01, 0x80, 0x53, 0xC3, 0x00, 0x52, 0x4E, 0x00, 0x57, 0xE2, 0x00, 0x52, 0xAF, 0x80, 0x53, 0xE2, 0x00, 0x52, 0xA7, 0x00, 0x52, 0xA7, 0x00, 0x73, 0xEA, 0x80, 0x00, 0x0A, 0x00, 0x05, 0x52, 0x00, 0x05, 0x52, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56CD, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56CE, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x91, 0x80, 0x74, 0xB0, 0x80, 0x54, 0x80, 0x00, 0x57, 0xBF, 0x80, 0x54, 0xB5, 0x80, 0x54, 0xAE, 0x80, 0x54, 0xA4, 0x80, 0x57, 0xBF, 0x80, 0x54, 0x80, 0x00, 0x54, 0x9F, 0x00, 0x74, 0x91, 0x00, 0x07, 0x9F, 0x00, 0x02, 0x11, 0x00, 0x06, 0x91, 0x00, 0x0C, 0x5F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56CF, { 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x14, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x36, 0x41, 0x00, 0x62, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56D0, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0xE2, 0x80, 0x71, 0x02, 0x80, 0x5F, 0xF2, 0x00, 0x51, 0x12, 0x00, 0x57, 0xCF, 0x80, 0x51, 0x12, 0x00, 0x5F, 0xF2, 0x00, 0x52, 0x42, 0x00, 0x53, 0xC2, 0x00, 0x50, 0x02, 0x00, 0x7F, 0xF7, 0x00, 0x1A, 0x55, 0x00, 0x1C, 0x75, 0x00, 0x2B, 0x9D, 0x00, 0x09, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56D1, { 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3A, 0x01, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0xD6, 0x00, 0x2A, 0xD6, 0x00, 0x2B, 0xFF, 0x00, 0x2B, 0x49, 0x00, 0x2B, 0xFF, 0x00, 0x3A, 0x40, 0x00, 0x2A, 0xFF, 0x80, 0x03, 0x20, 0x80, 0x03, 0xFC, 0x80, 0x03, 0x24, 0x80, 0x05, 0xFC, 0x80, 0x04, 0x3E, 0x80, 0x0B, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56D3, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xDF, 0x80, 0x71, 0x04, 0x80, 0x57, 0xC4, 0x80, 0x51, 0x08, 0x80, 0x57, 0xD1, 0x80, 0x50, 0x9E, 0x00, 0x50, 0x90, 0x00, 0x5F, 0xFF, 0x80, 0x54, 0x89, 0x00, 0x74, 0x89, 0x00, 0x05, 0x55, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x89, 0x00, 0x05, 0x55, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56D4, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x3C, 0x20, 0x00, 0x29, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x89, 0x00, 0x2D, 0xFE, 0x00, 0x28, 0x88, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0xA4, 0x00, 0x01, 0x98, 0x00, 0x06, 0xCF, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x09, 0x00, 0x23, 0x19, 0x00, 0x21, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xE1, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x20, 0x21, 0x00, 0x3F, 0xE1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x21, 0x41, 0x00, 0x21, 0x21, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x28, 0x05, 0x00, 0x30, 0x03, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x13, 0x00, 0x24, 0x1F, 0x00, 0x38, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x21, 0x81, 0x00, 0x21, 0x01, 0x00, 0x21, 0x11, 0x00, 0x23, 0x19, 0x00, 0x22, 0x09, 0x00, 0x22, 0xF9, 0x00, 0x27, 0x8D, 0x00, 0x2C, 0x05, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x11, 0x00, 0x20, 0x21, 0x00, 0x20, 0x41, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x21, 0xC1, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56DF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x20, 0x12, 0x00, 0x24, 0x32, 0x00, 0x22, 0x22, 0x00, 0x21, 0x62, 0x00, 0x20, 0xC2, 0x00, 0x21, 0xA2, 0x00, 0x23, 0x32, 0x00, 0x2E, 0x12, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x11, 0x00, 0x12, 0x09, 0x00, 0x1C, 0x07, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x27, 0xA1, 0x00, 0x20, 0xE1, 0x00, 0x21, 0xB1, 0x00, 0x27, 0x19, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E2, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x42, 0x00, 0x20, 0x42, 0x00, 0x20, 0x4A, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0xC2, 0x00, 0x21, 0x42, 0x00, 0x22, 0x42, 0x00, 0x24, 0x42, 0x00, 0x28, 0x42, 0x00, 0x30, 0x42, 0x00, 0x21, 0x42, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x11, 0x00, 0x20, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0x11, 0x00, 0x21, 0x11, 0x00, 0x20, 0x11, 0x00, 0x20, 0x11, 0x00, 0x20, 0x71, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x99, 0x00, 0x20, 0xF1, 0x00, 0x2F, 0x81, 0x00, 0x20, 0x81, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x27, 0xF1, 0x00, 0x20, 0x85, 0x00, 0x20, 0x8D, 0x00, 0x20, 0x79, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x23, 0x21, 0x00, 0x22, 0x25, 0x00, 0x26, 0x25, 0x00, 0x2C, 0x1D, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x45, 0x00, 0x2F, 0x4D, 0x00, 0x21, 0x59, 0x00, 0x23, 0x61, 0x00, 0x22, 0x51, 0x00, 0x26, 0x4D, 0x00, 0x2C, 0x47, 0x00, 0x20, 0x41, 0x00, 0x21, 0xC1, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x26, 0x3D, 0x00, 0x2C, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x21, 0x81, 0x00, 0x23, 0xB1, 0x00, 0x26, 0x99, 0x00, 0x3C, 0x8F, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x24, 0x01, 0x00, 0x27, 0xFD, 0x00, 0x25, 0x25, 0x00, 0x2D, 0x25, 0x00, 0x29, 0x25, 0x00, 0x23, 0x65, 0x00, 0x26, 0x45, 0x00, 0x2C, 0xCD, 0x00, 0x21, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x23, 0x25, 0x00, 0x26, 0x25, 0x00, 0x2C, 0x1D, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x21, 0x41, 0x00, 0x21, 0x49, 0x00, 0x22, 0x59, 0x00, 0x26, 0x71, 0x00, 0x2A, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x45, 0x00, 0x22, 0x45, 0x00, 0x22, 0x3D, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0xE1, 0x00, 0x11, 0x51, 0x00, 0x12, 0x4D, 0x00, 0x14, 0x43, 0x00, 0x18, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x42, 0x00, 0x22, 0xFA, 0x00, 0x21, 0x8A, 0x00, 0x23, 0x1A, 0x00, 0x2E, 0xB2, 0x00, 0x20, 0x62, 0x00, 0x20, 0xC2, 0x00, 0x23, 0xA2, 0x00, 0x2E, 0x12, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x2C, 0x11, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x21, 0x81, 0x00, 0x2C, 0xC5, 0x00, 0x26, 0x4D, 0x00, 0x22, 0x09, 0x00, 0x20, 0x19, 0x00, 0x21, 0xB1, 0x00, 0x20, 0x61, 0x00, 0x20, 0xB1, 0x00, 0x23, 0x99, 0x00, 0x2E, 0x09, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F4, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x8A, 0x00, 0x20, 0xAA, 0x00, 0x20, 0x92, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F5, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x42, 0x00, 0x22, 0x22, 0x00, 0x24, 0x12, 0x00, 0x2A, 0x2E, 0x00, 0x32, 0x42, 0x00, 0x22, 0x82, 0x00, 0x23, 0x02, 0x00, 0x22, 0x12, 0x00, 0x21, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x21, 0xE1, 0x00, 0x20, 0x21, 0x00, 0x23, 0x31, 0x00, 0x26, 0x19, 0x00, 0x2C, 0x8D, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x19, 0x00, 0x20, 0xF1, 0x00, 0x27, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0xA1, 0x00, 0x22, 0xA1, 0x00, 0x22, 0xB1, 0x00, 0x26, 0x99, 0x00, 0x2C, 0x8D, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x41, 0x00, 0x20, 0xA1, 0x00, 0x21, 0x11, 0x00, 0x22, 0x09, 0x00, 0x2C, 0x07, 0x00, 0x23, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x09, 0x00, 0x21, 0x09, 0x00, 0x21, 0x71, 0x00, 0x21, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x2F, 0xFE, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x27, 0xFC, 0x80, 0x24, 0x04, 0x80, 0x24, 0x04, 0x80, 0x27, 0xFC, 0x80, 0x24, 0x04, 0x80, 0x20, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x56FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x91, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56FE, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x23, 0xF2, 0x00, 0x26, 0x22, 0x00, 0x29, 0x42, 0x00, 0x20, 0x82, 0x00, 0x21, 0x42, 0x00, 0x23, 0x22, 0x00, 0x24, 0x9E, 0x00, 0x38, 0x4A, 0x00, 0x23, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x42, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x56FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x01, 0x00, 0x23, 0xF9, 0x00, 0x26, 0x09, 0x00, 0x2B, 0xF9, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF9, 0x00, 0x22, 0x09, 0x00, 0x22, 0x19, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x24, 0x21, 0x00, 0x28, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x01, 0x00, 0x21, 0xF9, 0x00, 0x21, 0x09, 0x00, 0x23, 0x09, 0x00, 0x26, 0x19, 0x00, 0x2C, 0x71, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5701, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5702, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x21, 0x01, 0x00, 0x22, 0x89, 0x00, 0x24, 0x99, 0x00, 0x21, 0x51, 0x00, 0x22, 0x41, 0x00, 0x2C, 0xE1, 0x00, 0x21, 0x71, 0x00, 0x22, 0x59, 0x00, 0x2C, 0x4D, 0x00, 0x21, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5703, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x51, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFD, 0x00, 0x14, 0x45, 0x00, 0x17, 0xFD, 0x00, 0x14, 0x45, 0x00, 0x17, 0xFD, 0x00, 0x14, 0x45, 0x00, 0x14, 0x4D, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5704, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xF9, 0x00, 0x21, 0x09, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5706, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x2F, 0xFA, 0x00, 0x28, 0x0A, 0x00, 0x28, 0x8A, 0x00, 0x28, 0x8A, 0x00, 0x29, 0x4A, 0x00, 0x22, 0x22, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5707, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x40, 0x81, 0x00, 0x41, 0xC1, 0x00, 0x47, 0x71, 0x00, 0x5C, 0x1D, 0x00, 0x43, 0xE1, 0x00, 0x40, 0x01, 0x00, 0x4F, 0xFD, 0x00, 0x49, 0x25, 0x00, 0x4F, 0xFD, 0x00, 0x49, 0x25, 0x00, 0x49, 0x25, 0x00, 0x49, 0x2D, 0x00, 0x40, 0x01, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5708, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x51, 0x00, 0x24, 0x49, 0x00, 0x2F, 0xFD, 0x00, 0x30, 0xA3, 0x00, 0x3F, 0xFF, 0x00, 0x26, 0x19, 0x00, 0x3B, 0xE7, 0x00, 0x22, 0x21, 0x00, 0x22, 0xE1, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5709, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x570A, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x24, 0x19, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x570B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x41, 0x00, 0x20, 0x49, 0x00, 0x3F, 0xC5, 0x00, 0x20, 0x41, 0x00, 0x2F, 0x43, 0x00, 0x29, 0x25, 0x00, 0x2F, 0x29, 0x00, 0x20, 0x11, 0x00, 0x23, 0xB1, 0x00, 0x3C, 0x4B, 0x00, 0x21, 0x87, 0x00, 0x26, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x570C, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x41, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x29, 0x25, 0x00, 0x29, 0x25, 0x00, 0x29, 0x25, 0x00, 0x29, 0x2D, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x570D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xFF, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x41, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x41, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x41, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x570F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x22, 0x91, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x27, 0xE9, 0x00, 0x38, 0x27, 0x00, 0x23, 0xE1, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5711, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0xA1, 0x00, 0x20, 0x91, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x20, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x11, 0x00, 0x20, 0x31, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5712, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x41, 0x00, 0x27, 0xFD, 0x00, 0x20, 0x41, 0x00, 0x2F, 0xFF, 0x00, 0x23, 0xF9, 0x00, 0x22, 0x09, 0x00, 0x23, 0xF9, 0x00, 0x20, 0xC5, 0x00, 0x23, 0x29, 0x00, 0x3D, 0x19, 0x00, 0x21, 0xE7, 0x00, 0x2E, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5713, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x28, 0x05, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5715, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5716, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0xC9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5718, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x3F, 0xFF, 0x80, 0x27, 0xFC, 0x80, 0x24, 0x44, 0x80, 0x27, 0xFC, 0x80, 0x24, 0x44, 0x80, 0x27, 0xFC, 0x80, 0x20, 0x48, 0x80, 0x20, 0x7F, 0x80, 0x2F, 0xC8, 0x80, 0x21, 0x08, 0x80, 0x20, 0x98, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x571A, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x22, 0x11, 0x00, 0x24, 0x09, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x571B, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x29, 0x25, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x571C, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x25, 0x49, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF5, 0x00, 0x21, 0x49, 0x00, 0x2E, 0x31, 0x00, 0x23, 0x8D, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x571D, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x48, 0x84, 0x80, 0x48, 0x84, 0x80, 0x51, 0xE8, 0x80, 0x54, 0x0A, 0x80, 0x48, 0xC4, 0x80, 0x52, 0x09, 0x80, 0x7E, 0xDF, 0x80, 0x4A, 0x05, 0x80, 0x59, 0xEC, 0x80, 0x6F, 0x37, 0x80, 0x49, 0x24, 0x80, 0x49, 0xE4, 0x80, 0x40, 0x00, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x571F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5720, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x80, 0x00, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5722, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5723, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5724, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x38, 0x00, 0x08, 0x2E, 0x00, 0x08, 0x23, 0x00, 0x08, 0x21, 0x80, 0x0F, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5725, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5726, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x1C, 0x28, 0x00, 0x70, 0x6C, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5727, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x30, 0x20, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5728, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5729, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x572A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7F, 0x80, 0x7C, 0xC0, 0x00, 0x11, 0x80, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x06, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x1C, 0x30, 0x00, 0x70, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x80, 0x00, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x572C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x1C, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x572D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x572E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x7C, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x70, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x572F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x7C, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x70, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5730, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x93, 0x00, 0x3E, 0x9D, 0x00, 0x08, 0xB1, 0x00, 0x08, 0xD1, 0x00, 0x0B, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x97, 0x00, 0x38, 0x90, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5733, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x78, 0x49, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5734, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x7C, 0xC1, 0x00, 0x10, 0x81, 0x00, 0x11, 0x81, 0x00, 0x10, 0x01, 0x00, 0x10, 0x79, 0x00, 0x10, 0x01, 0x00, 0x1C, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5737, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x16, 0x00, 0x10, 0x13, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5738, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x7C, 0x08, 0x00, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x1C, 0x88, 0x80, 0x70, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5739, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x79, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x573A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x40, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1D, 0x12, 0x00, 0x71, 0x22, 0x00, 0x22, 0x22, 0x00, 0x04, 0x42, 0x00, 0x08, 0x94, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x573B, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x30, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x573D, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x10, 0xA4, 0x80, 0x7D, 0xA4, 0x80, 0x11, 0x24, 0x80, 0x13, 0x24, 0x80, 0x10, 0x64, 0x80, 0x10, 0x4C, 0x80, 0x1C, 0xC8, 0x80, 0x71, 0x98, 0x80, 0x03, 0x10, 0x80, 0x00, 0x31, 0x80, 0x00, 0x61, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x573E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x8C, 0x00, 0x10, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x42, 0x00, 0x11, 0x62, 0x00, 0x11, 0x26, 0x00, 0x1D, 0x34, 0x00, 0x31, 0x1C, 0x00, 0x63, 0x08, 0x00, 0x02, 0x1C, 0x00, 0x02, 0x36, 0x00, 0x06, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x573F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x11, 0xC7, 0x00, 0x13, 0x45, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5740, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x48, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5742, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0xC2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x0E, 0x88, 0x00, 0x39, 0x08, 0x00, 0x01, 0x14, 0x00, 0x02, 0x22, 0x00, 0x04, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5745, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x02, 0x00, 0x70, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5746, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x7C, 0x82, 0x00, 0x11, 0xC2, 0x00, 0x13, 0x46, 0x00, 0x10, 0x64, 0x00, 0x10, 0x2C, 0x00, 0x10, 0x38, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5747, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x08, 0x7C, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x09, 0x80, 0x80, 0x0E, 0xFE, 0x80, 0x30, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x574A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x0F, 0x41, 0x00, 0x38, 0x41, 0x00, 0x00, 0x81, 0x00, 0x01, 0x02, 0x00, 0x06, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x574C, { 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x38, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x574D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x8A, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x31, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x574E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x91, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x0F, 0x44, 0x00, 0x38, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x574F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x7C, 0x18, 0x00, 0x10, 0x10, 0x00, 0x10, 0x34, 0x00, 0x10, 0x76, 0x00, 0x10, 0xD3, 0x00, 0x11, 0x91, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5750, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x20, 0xE0, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5751, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x38, 0x22, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x80, 0x00, 0x82, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5752, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x23, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x80, 0x10, 0x21, 0x80, 0x1F, 0x3F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5757, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFE, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x0E, 0x40, 0x00, 0x78, 0xA0, 0x00, 0x20, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x575A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0xFC, 0x00, 0x12, 0x84, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x30, 0x00, 0x12, 0x10, 0x00, 0x12, 0x68, 0x00, 0x13, 0x87, 0x00, 0x02, 0x82, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x575B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x48, 0x00, 0x0E, 0x84, 0x00, 0x78, 0x82, 0x00, 0x21, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x575C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x7F, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x79, 0x22, 0x00, 0x22, 0x42, 0x00, 0x02, 0x42, 0x00, 0x04, 0x94, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x575D, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0x92, 0x00, 0x20, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x575E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7E, 0x84, 0x00, 0x08, 0x94, 0x00, 0x08, 0x88, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x0E, 0x12, 0x00, 0x79, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x575F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x28, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x28, 0x00, 0x20, 0x44, 0x00, 0x00, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5760, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x24, 0x50, 0x00, 0x28, 0x50, 0x00, 0x24, 0x50, 0x00, 0x22, 0x88, 0x00, 0x32, 0x84, 0x00, 0x2D, 0x07, 0x00, 0x22, 0x02, 0x00, 0x20, 0x80, 0x00, 0x2F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5761, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x00, 0x3E, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0x92, 0x00, 0x08, 0x94, 0x00, 0x0E, 0x8C, 0x00, 0x39, 0x08, 0x00, 0x01, 0x14, 0x00, 0x02, 0x22, 0x00, 0x02, 0x41, 0x00, 0x05, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5762, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x11, 0x11, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5764, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x0F, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5765, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5766, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5767, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x30, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x10, 0x61, 0x00, 0x10, 0xE1, 0x00, 0x1D, 0xA1, 0x00, 0x30, 0x21, 0x00, 0x40, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5768, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7D, 0x00, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x47, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x70, 0x40, 0x00, 0x00, 0x40, 0x80, 0x00, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5769, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x576A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x91, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x576B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x78, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x576D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x20, 0x00, 0x11, 0x23, 0x00, 0x11, 0x2E, 0x00, 0x1D, 0x38, 0x00, 0x31, 0x20, 0x00, 0x63, 0x20, 0x00, 0x02, 0x20, 0x80, 0x06, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x576E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x4F, 0x00, 0x08, 0xF0, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x30, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x576F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x34, 0x00, 0x10, 0x36, 0x00, 0x10, 0x72, 0x00, 0x10, 0xD3, 0x00, 0x11, 0x91, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5770, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x0F, 0xBD, 0x00, 0x38, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5771, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x1C, 0x6C, 0x00, 0x70, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5773, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x84, 0x00, 0x11, 0x04, 0x00, 0x7B, 0x1F, 0x80, 0x12, 0x44, 0x80, 0x13, 0x44, 0x80, 0x11, 0xC4, 0x80, 0x10, 0x84, 0x80, 0x10, 0x84, 0x80, 0x1D, 0x8C, 0x80, 0x71, 0x28, 0x80, 0x01, 0x29, 0x80, 0x03, 0xF9, 0x00, 0x06, 0x11, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5774, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x9F, 0x00, 0x38, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5775, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0x84, 0x00, 0x38, 0x84, 0x00, 0x00, 0x84, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5776, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x7E, 0x94, 0x00, 0x08, 0x85, 0x00, 0x0B, 0xFF, 0x00, 0x09, 0x04, 0x00, 0x09, 0x44, 0x00, 0x0F, 0x24, 0x00, 0x79, 0x24, 0x00, 0x21, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5777, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x7C, 0xF2, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1C, 0xF2, 0x00, 0x70, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5779, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x3C, 0x80, 0x10, 0x04, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x1C, 0x66, 0x00, 0x70, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x577A, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x26, 0x00, 0x10, 0x22, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x10, 0x72, 0x00, 0x10, 0x56, 0x00, 0x10, 0x54, 0x00, 0x1C, 0xDC, 0x00, 0x30, 0x88, 0x00, 0x61, 0x9C, 0x00, 0x03, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x577B, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8C, 0x00, 0x1C, 0x84, 0x00, 0x70, 0xE4, 0x00, 0x03, 0x86, 0x00, 0x00, 0x02, 0x80, 0x03, 0xFB, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x577C, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x86, 0x00, 0x0E, 0x85, 0x00, 0x39, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x577E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x577F, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x82, 0x00, 0x7D, 0xBF, 0x80, 0x11, 0x82, 0x00, 0x12, 0x82, 0x00, 0x14, 0x92, 0x00, 0x10, 0x9A, 0x00, 0x10, 0x8A, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5781, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x7D, 0x90, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x38, 0x00, 0x70, 0x28, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5782, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5783, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x4C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5784, { 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x01, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x80, 0x00, 0x02, 0x88, 0x00, 0x04, 0x90, 0x00, 0x08, 0xE2, 0x00, 0x13, 0x82, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5785, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x94, 0x00, 0x0E, 0x94, 0x00, 0x78, 0x98, 0x00, 0x21, 0x31, 0x00, 0x01, 0x51, 0x00, 0x02, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5786, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x7F, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x0F, 0x04, 0x00, 0x79, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5788, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x40, 0x00, 0x18, 0x4F, 0x80, 0x1B, 0xF0, 0x00, 0x28, 0x40, 0x00, 0x08, 0x20, 0x00, 0x08, 0x18, 0x80, 0x08, 0x47, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5789, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x81, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xF9, 0x00, 0x13, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0xFB, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x578B, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xE9, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x81, 0x00, 0x20, 0x43, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x578C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x45, 0x00, 0x1D, 0x45, 0x00, 0x71, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5792, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x12, 0x24, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5793, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x09, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x49, 0x00, 0x08, 0x31, 0x00, 0x0E, 0x22, 0x00, 0x38, 0xC4, 0x00, 0x03, 0x0A, 0x00, 0x00, 0x11, 0x00, 0x00, 0x60, 0x80, 0x03, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5794, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x40, 0x00, 0x1F, 0xFC, 0x00, 0x12, 0x44, 0x00, 0x14, 0x44, 0x00, 0x18, 0x7C, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5795, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5797, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x12, 0x49, 0x00, 0x13, 0x4B, 0x00, 0x11, 0x4E, 0x00, 0x7D, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x11, 0xCE, 0x00, 0x13, 0x4B, 0x00, 0x10, 0x49, 0x00, 0x1C, 0x48, 0x00, 0x70, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5799, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x80, 0x01, 0x84, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x579A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x78, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x579B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0B, 0x26, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x60, 0x00, 0x0E, 0x70, 0x00, 0x78, 0xA8, 0x00, 0x21, 0x24, 0x00, 0x02, 0x23, 0x00, 0x04, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x579C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x12, 0x00, 0x10, 0x13, 0x80, 0x7C, 0x30, 0x80, 0x10, 0x60, 0x80, 0x10, 0xC1, 0x80, 0x11, 0x97, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x54, 0x00, 0x70, 0xD6, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x579D, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x88, 0x00, 0x7D, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xBE, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x1C, 0xA2, 0x00, 0x70, 0xA6, 0x00, 0x01, 0xA0, 0x00, 0x01, 0x20, 0x80, 0x03, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x579E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x11, 0x06, 0x80, 0x7C, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x00, 0x20, 0x80, 0x00, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x579F, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x90, 0x80, 0x08, 0x91, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x8C, 0x00, 0x30, 0x88, 0x00, 0x00, 0xF4, 0x00, 0x03, 0x02, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57A1, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x42, 0x00, 0x1B, 0xFF, 0x80, 0x70, 0x20, 0x00, 0x10, 0x22, 0x00, 0x10, 0x36, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x78, 0x80, 0x13, 0xCD, 0x80, 0x10, 0x87, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A2, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x41, 0x00, 0x01, 0x41, 0x00, 0x02, 0x41, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x82, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x7C, 0xC2, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xF1, 0x80, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A6, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x11, 0x04, 0x00, 0x10, 0xC8, 0x00, 0x12, 0x30, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A7, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x30, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x3C, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x1D, 0x24, 0x80, 0x71, 0x3C, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57A8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7D, 0x00, 0x80, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1C, 0xC4, 0x00, 0x70, 0x64, 0x00, 0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x11, 0x22, 0x00, 0x19, 0x26, 0x00, 0x09, 0x24, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57AA, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57AB, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x7E, 0x00, 0x04, 0x24, 0x00, 0x05, 0x64, 0x00, 0x0E, 0x34, 0x00, 0x34, 0x2C, 0x00, 0x04, 0x45, 0x00, 0x15, 0x83, 0x00, 0x08, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57AC, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57AD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0x54, 0x00, 0x09, 0x54, 0x00, 0x0E, 0x50, 0x00, 0x78, 0x50, 0x00, 0x20, 0x50, 0x00, 0x00, 0x52, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57AE, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x7C, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x07, 0x00, 0x12, 0xFA, 0x00, 0x14, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x1C, 0x40, 0x00, 0x70, 0xFC, 0x00, 0x20, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57B0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x1E, 0x00, 0x00, 0x13, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57B2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x7E, 0x02, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x0F, 0x04, 0x00, 0x79, 0x00, 0x00, 0x21, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57B3, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x5F, 0x00, 0x10, 0x80, 0x00, 0x11, 0x00, 0x00, 0x7C, 0x40, 0x00, 0x10, 0x5F, 0x80, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x12, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57B4, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x08, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x22, 0x00, 0x12, 0x52, 0x00, 0x1E, 0x4A, 0x00, 0x72, 0x8A, 0x00, 0x22, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57B8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x1C, 0x48, 0x00, 0x70, 0x48, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57BD, { 0x00, 0x00, 0x00, 0x18, 0x07, 0x00, 0x0C, 0xFC, 0x00, 0x60, 0x80, 0x00, 0x30, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x0C, 0x88, 0x00, 0x39, 0x88, 0x00, 0x61, 0x08, 0x00, 0x03, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57C0, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x04, 0x92, 0x00, 0x3C, 0x9C, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x91, 0x00, 0x34, 0x8F, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57C2, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x1E, 0x22, 0x00, 0x71, 0xA0, 0x00, 0x20, 0x40, 0x00, 0x00, 0xB0, 0x00, 0x03, 0x0F, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57C3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0x47, 0x00, 0x08, 0xF8, 0x80, 0x3E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0E, 0xFF, 0x80, 0x30, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x24, 0x00, 0x00, 0xC2, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57C6, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7F, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x84, 0x00, 0x7C, 0xFF, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x1C, 0xFF, 0x80, 0x70, 0x80, 0x80, 0x00, 0x80, 0x80, 0x01, 0x80, 0x80, 0x01, 0x00, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57C7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x0F, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57C8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0x4F, 0x00, 0x09, 0xF4, 0x80, 0x3E, 0x24, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x0E, 0x82, 0x00, 0x39, 0x44, 0x00, 0x06, 0x28, 0x00, 0x00, 0x18, 0x00, 0x00, 0x66, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57CB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x3F, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57CC, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x7D, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x10, 0x80, 0x1D, 0x19, 0x80, 0x71, 0x0B, 0x00, 0x01, 0x0C, 0x00, 0x01, 0x66, 0x00, 0x01, 0xC3, 0x00, 0x07, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57CE, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x12, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0xF1, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x0F, 0x2C, 0x00, 0x39, 0x28, 0x00, 0x01, 0x4C, 0x00, 0x02, 0x14, 0x80, 0x02, 0x22, 0x80, 0x04, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57CF, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x13, 0xC7, 0x00, 0x10, 0x5C, 0x00, 0x10, 0x44, 0x00, 0x7C, 0x84, 0x00, 0x10, 0x94, 0x00, 0x11, 0xD7, 0x00, 0x10, 0x54, 0x00, 0x11, 0x54, 0x00, 0x11, 0x54, 0x00, 0x1D, 0x54, 0x00, 0x71, 0xD4, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x80, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57D2, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x0B, 0x00, 0x7C, 0x99, 0x80, 0x11, 0x90, 0x80, 0x11, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x1C, 0xC2, 0x00, 0x70, 0x62, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57D3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x31, 0x00, 0x10, 0x6B, 0x00, 0x11, 0xC6, 0x00, 0x7C, 0x2C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x70, 0x00, 0x11, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x80, 0x1C, 0x02, 0x00, 0x70, 0xC2, 0x00, 0x00, 0x62, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57D4, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57D5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x0F, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57D6, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x28, 0x00, 0x10, 0x28, 0x00, 0x10, 0x69, 0x80, 0x10, 0x4B, 0x00, 0x10, 0xCE, 0x00, 0x1D, 0xC8, 0x00, 0x73, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x80, 0x00, 0x49, 0x80, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57D8, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x44, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x44, 0x00, 0x12, 0x45, 0x00, 0x7E, 0x7F, 0x00, 0x12, 0x44, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x64, 0x00, 0x12, 0x54, 0x00, 0x12, 0x54, 0x00, 0x1E, 0x44, 0x00, 0x73, 0xC4, 0x00, 0x22, 0x44, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57D9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x7E, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x0F, 0x12, 0x00, 0x79, 0x22, 0x00, 0x21, 0x22, 0x00, 0x00, 0x4C, 0x00, 0x01, 0x82, 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57DA, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x7E, 0xA4, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x79, 0x5A, 0x00, 0x21, 0x8A, 0x00, 0x01, 0x02, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57DC, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x35, 0x6B, 0x00, 0x24, 0x49, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57DD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x80, 0x10, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x1C, 0x34, 0x00, 0x70, 0x18, 0x00, 0x01, 0x4B, 0x00, 0x01, 0x41, 0x80, 0x03, 0x62, 0x80, 0x02, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57DE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x1C, 0x90, 0x00, 0x70, 0x90, 0x00, 0x00, 0x90, 0x00, 0x01, 0xD0, 0x00, 0x01, 0x70, 0x00, 0x03, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57DF, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x80, 0x09, 0xE8, 0x80, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEA, 0x00, 0x0E, 0x0A, 0x00, 0x38, 0x7C, 0x00, 0x07, 0x88, 0x80, 0x00, 0x14, 0x80, 0x00, 0x62, 0x80, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57E0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x90, 0x00, 0x30, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x7D, 0xC7, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xC7, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x44, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57E3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC7, 0x00, 0x13, 0x6D, 0x80, 0x10, 0x00, 0x00, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57E4, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x21, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x1C, 0x88, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57E6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7C, 0x80, 0x00, 0x10, 0xEF, 0x00, 0x10, 0xA9, 0x00, 0x11, 0xA9, 0x00, 0x13, 0x29, 0x00, 0x10, 0xE9, 0x00, 0x1C, 0x4B, 0x00, 0x70, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57E7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x70, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57E9, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF2, 0x00, 0x10, 0x53, 0x00, 0x7C, 0x89, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x1C, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57ED, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x22, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x11, 0x23, 0x00, 0x11, 0xA6, 0x00, 0x10, 0xAC, 0x00, 0x1C, 0x30, 0x00, 0x71, 0xAC, 0x00, 0x03, 0x26, 0x00, 0x06, 0x23, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57EF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x7E, 0xA8, 0x00, 0x09, 0xFC, 0x00, 0x0B, 0x27, 0x00, 0x0D, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x0F, 0x24, 0x00, 0x79, 0x24, 0x00, 0x21, 0xFC, 0x00, 0x01, 0x25, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57F0, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x71, 0x00, 0x08, 0x48, 0x80, 0x08, 0x84, 0x00, 0x3F, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0E, 0x38, 0x00, 0x30, 0x34, 0x00, 0x00, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57F4, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x0F, 0x21, 0x00, 0x39, 0x3F, 0x00, 0x01, 0x21, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57F5, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x70, 0x92, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57F6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x92, 0x00, 0x12, 0x12, 0x00, 0x12, 0x52, 0x00, 0x63, 0xB2, 0x00, 0x08, 0x12, 0x00, 0x08, 0x1A, 0x00, 0x3F, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x22, 0x80, 0x0F, 0x62, 0x80, 0x78, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57F7, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x7E, 0x00, 0x3F, 0x92, 0x00, 0x11, 0x52, 0x00, 0x0A, 0x32, 0x00, 0x3F, 0x9A, 0x00, 0x04, 0x16, 0x00, 0x04, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x04, 0x22, 0x80, 0x04, 0x22, 0x80, 0x04, 0x41, 0x80, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x57F8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x1D, 0x92, 0x80, 0x73, 0x36, 0x80, 0x00, 0x64, 0x80, 0x00, 0xCD, 0x80, 0x00, 0x19, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57F9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x30, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57FA, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57FC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0E, 0xFA, 0x00, 0x30, 0x8A, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57FD, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x02, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x33, 0x00, 0x11, 0x16, 0x00, 0x11, 0x0C, 0x00, 0x1F, 0x1E, 0x00, 0x71, 0x73, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x57FF, { 0x00, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x00, 0x00, 0x01, 0x46, 0x00, 0x0D, 0x5C, 0x00, 0x39, 0x70, 0x00, 0x63, 0x40, 0x80, 0x06, 0x61, 0x80, 0x00, 0xBF, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5800, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x0F, 0x08, 0x00, 0x39, 0x49, 0x00, 0x01, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5802, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5803, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x33, 0x33, 0x00, 0x22, 0x22, 0x00, 0x6E, 0xEE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5804, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x60, 0x00, 0x11, 0xCF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x1C, 0x48, 0x00, 0x70, 0x48, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5805, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x21, 0x00, 0x24, 0x22, 0x00, 0x3F, 0x12, 0x00, 0x21, 0x14, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x14, 0x00, 0x24, 0x23, 0x00, 0x3F, 0xC0, 0x80, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5806, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC8, 0x00, 0x3E, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5807, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5808, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xA2, 0x80, 0x08, 0x94, 0x80, 0x3E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x0F, 0xAA, 0x80, 0x38, 0xBE, 0x80, 0x00, 0xA2, 0x80, 0x00, 0x80, 0x80, 0x00, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5809, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x9F, 0x00, 0x09, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x580A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x580B, { 0x00, 0x00, 0x00, 0x11, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x1D, 0x24, 0x80, 0x71, 0x24, 0x80, 0x01, 0x24, 0x80, 0x03, 0x24, 0x80, 0x02, 0x24, 0x80, 0x06, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x580C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x7E, 0xFD, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0x79, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x72, 0x79, 0x00, 0x02, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x580D, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0xC4, 0x00, 0x11, 0x8C, 0x00, 0x11, 0x08, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x31, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x1C, 0x6E, 0x00, 0x70, 0x4B, 0x00, 0x00, 0xC8, 0x80, 0x01, 0x89, 0x80, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5811, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x7F, 0x78, 0x00, 0x10, 0x40, 0x00, 0x14, 0x42, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x48, 0x00, 0x07, 0xC8, 0x00, 0x7C, 0x88, 0x00, 0x25, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5815, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x28, 0x3F, 0x00, 0x24, 0x61, 0x00, 0x22, 0xBF, 0x00, 0x22, 0x21, 0x00, 0x2E, 0x3F, 0x00, 0x20, 0x21, 0x00, 0x20, 0x23, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5819, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x581B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x31, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x581D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x9E, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x1D, 0x45, 0x00, 0x71, 0x45, 0x00, 0x01, 0x45, 0x00, 0x01, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x581E, { 0x00, 0x00, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0xA2, 0x00, 0x3E, 0xA2, 0x00, 0x08, 0xBE, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x0E, 0x08, 0x00, 0x39, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x49, 0x00, 0x01, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x581F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x7C, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x51, 0x00, 0x09, 0x9B, 0x00, 0x0C, 0x2A, 0x00, 0x38, 0x48, 0x00, 0x61, 0x9C, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x49, 0x00, 0x01, 0x88, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5820, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0xBE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x13, 0x20, 0x00, 0x15, 0x3F, 0x00, 0x11, 0x48, 0x00, 0x11, 0x08, 0x00, 0x1D, 0x7F, 0x80, 0x31, 0x08, 0x00, 0x61, 0x1C, 0x00, 0x01, 0x14, 0x00, 0x01, 0x36, 0x00, 0x01, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5821, { 0x00, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x38, 0x00, 0x08, 0xD6, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x50, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5824, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x0E, 0x90, 0x00, 0x30, 0x90, 0x00, 0x01, 0x50, 0x00, 0x02, 0x3F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5826, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x11, 0x09, 0x80, 0x11, 0xEF, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x08, 0x80, 0x11, 0xE7, 0x80, 0x13, 0x10, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x31, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5827, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x29, 0x00, 0x3F, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x2B, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x582A, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xFF, 0x80, 0x31, 0x24, 0x80, 0x01, 0x47, 0x80, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x582D, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x30, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x582F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x07, 0x84, 0x00, 0x38, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5830, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x7E, 0x00, 0x09, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x3F, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x0F, 0x64, 0x00, 0x39, 0x98, 0x00, 0x02, 0x24, 0x00, 0x02, 0xC2, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5831, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x1F, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x3F, 0xC7, 0x00, 0x00, 0x40, 0x00, 0x11, 0x7F, 0x00, 0x0A, 0x51, 0x00, 0x3F, 0xD1, 0x00, 0x04, 0x4A, 0x00, 0x04, 0x4A, 0x00, 0x3F, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x04, 0x49, 0x00, 0x04, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5832, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x27, 0x21, 0x00, 0x3C, 0x2F, 0x00, 0x21, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5834, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x0E, 0x92, 0x80, 0x33, 0x22, 0x80, 0x00, 0x44, 0x80, 0x00, 0x88, 0x80, 0x03, 0x31, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5835, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x14, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x0E, 0x40, 0x00, 0x39, 0xFF, 0x00, 0x06, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5839, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x583A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x24, 0x00, 0x0F, 0x66, 0x00, 0x30, 0xA5, 0x00, 0x01, 0x24, 0x80, 0x06, 0x44, 0x00, 0x18, 0x44, 0x00, 0x00, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x583D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1D, 0x0F, 0x00, 0x71, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x583F, { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x10, 0x04, 0x80, 0x10, 0x04, 0x80, 0x11, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x7D, 0x74, 0x00, 0x11, 0x05, 0x00, 0x11, 0x75, 0x00, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x1D, 0x57, 0x00, 0x31, 0x72, 0x00, 0x61, 0x06, 0x80, 0x03, 0x0E, 0x80, 0x02, 0x1B, 0x80, 0x06, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5840, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x42, 0x00, 0x12, 0x24, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x1F, 0xFF, 0x80, 0x72, 0x24, 0x00, 0x06, 0x64, 0x00, 0x04, 0x44, 0x00, 0x0C, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5841, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x30, 0x03, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5844, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x7F, 0xFE, 0x00, 0x09, 0x22, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0E, 0x7C, 0x00, 0x78, 0x44, 0x00, 0x20, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x14, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5849, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xD7, 0x00, 0x10, 0x38, 0x00, 0x7D, 0xAB, 0x00, 0x10, 0x44, 0x00, 0x10, 0xFE, 0x00, 0x13, 0x83, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x584A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x4A, 0x00, 0x0F, 0x4D, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x8C, 0x80, 0x00, 0x88, 0x80, 0x03, 0x0F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x584B, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x14, 0x94, 0x80, 0x15, 0x15, 0x00, 0x24, 0x24, 0x00, 0x06, 0x0A, 0x00, 0x09, 0x11, 0x00, 0x10, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x584C, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x61, 0x80, 0x10, 0xA2, 0x80, 0x1D, 0x65, 0x80, 0x30, 0x61, 0x80, 0x60, 0xA2, 0x80, 0x01, 0x24, 0x80, 0x02, 0x28, 0x80, 0x00, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x584D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x34, 0x48, 0x00, 0x2C, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x86, 0x00, 0x35, 0x93, 0x00, 0x2F, 0x11, 0x80, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4D, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x584F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x42, 0x00, 0x00, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5850, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x48, 0x00, 0x10, 0x92, 0x00, 0x1C, 0x61, 0x00, 0x71, 0xFF, 0x80, 0x00, 0x10, 0x80, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x01, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5851, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0A, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x04, 0x1F, 0x00, 0x24, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x08, 0x21, 0x00, 0x30, 0x43, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5852, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x5F, 0x00, 0x12, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x41, 0x00, 0x1E, 0x51, 0x00, 0x73, 0xD9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5854, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x3E, 0x54, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x80, 0x0E, 0xFE, 0x00, 0x38, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5855, { 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x13, 0x21, 0x80, 0x10, 0x24, 0x00, 0x7C, 0x42, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xEF, 0x80, 0x10, 0xA2, 0x80, 0x1D, 0x24, 0x80, 0x70, 0x61, 0x80, 0x00, 0xA2, 0x80, 0x01, 0x24, 0x80, 0x02, 0x28, 0x80, 0x00, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5857, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x28, 0x00, 0x00, 0xC6, 0x00, 0x23, 0x01, 0x80, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x10, 0x94, 0x00, 0x11, 0x12, 0x00, 0x20, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5858, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x3F, 0x09, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x09, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x39, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x02, 0x41, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5859, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x1E, 0x7C, 0x80, 0x72, 0x44, 0x80, 0x02, 0x44, 0x80, 0x02, 0x7C, 0x80, 0x02, 0x00, 0x80, 0x02, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x585A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x51, 0x00, 0x09, 0x9A, 0x00, 0x08, 0x2C, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x9C, 0x00, 0x03, 0x2A, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x91, 0x00, 0x03, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x585E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x585F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x23, 0x00, 0x71, 0x3E, 0x00, 0x1A, 0x20, 0x80, 0x0C, 0x21, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5861, { 0x00, 0x00, 0x00, 0x08, 0x8F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x7F, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5862, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x84, 0x80, 0x38, 0x12, 0x80, 0x00, 0x09, 0x80, 0x02, 0x48, 0x80, 0x06, 0x21, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5864, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5865, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x8A, 0x00, 0x0E, 0x52, 0x00, 0x7A, 0xFA, 0x00, 0x22, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x2A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5867, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x10, 0x8C, 0x00, 0x11, 0x86, 0x00, 0x13, 0x7B, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x7C, 0x00, 0x11, 0x06, 0x00, 0x13, 0x03, 0x00, 0x16, 0x01, 0x80, 0x10, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x72, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5868, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x13, 0x21, 0x80, 0x10, 0x20, 0x00, 0x1C, 0xA9, 0x00, 0x70, 0xA9, 0x80, 0x01, 0xAC, 0x80, 0x03, 0x24, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5869, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x16, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x7D, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x72, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x586B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x586C, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0x22, 0x00, 0x09, 0x7F, 0x00, 0x7F, 0x42, 0x00, 0x09, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x09, 0x42, 0x00, 0x09, 0x42, 0x00, 0x0F, 0x7E, 0x00, 0x79, 0x10, 0x00, 0x22, 0x54, 0x00, 0x02, 0x93, 0x00, 0x05, 0x11, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5870, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x31, 0xFF, 0x80, 0x1B, 0x00, 0x00, 0x06, 0xFF, 0x00, 0x60, 0x91, 0x00, 0x30, 0x89, 0x00, 0x03, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x19, 0x09, 0x00, 0x31, 0xFF, 0x80, 0x60, 0x02, 0x00, 0x00, 0x86, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5872, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x13, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x80, 0x00, 0x71, 0xFF, 0x00, 0x03, 0x49, 0x00, 0x00, 0x91, 0x00, 0x03, 0x23, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5875, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x09, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xD3, 0x80, 0x12, 0x1C, 0x00, 0x13, 0xF0, 0x80, 0x1E, 0x3F, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5878, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3C, 0x00, 0x7D, 0x24, 0x00, 0x11, 0x3C, 0x00, 0x11, 0x00, 0x00, 0x11, 0x77, 0x00, 0x11, 0x55, 0x00, 0x1D, 0x55, 0x00, 0x31, 0x77, 0x00, 0x61, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5879, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x3F, 0xB8, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x587C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x0A, 0x1F, 0x80, 0x0F, 0xE4, 0x80, 0x08, 0x04, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x00, 0x44, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x587E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x0A, 0x00, 0x1F, 0x0A, 0x00, 0x00, 0x2A, 0x00, 0x1F, 0x12, 0x00, 0x02, 0x1A, 0x00, 0x07, 0xA2, 0x80, 0x3C, 0x23, 0x80, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x587F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x13, 0xFF, 0x80, 0x7D, 0x22, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0xFE, 0x00, 0x1C, 0x80, 0x00, 0x33, 0xFF, 0x80, 0x60, 0x88, 0x00, 0x01, 0xD8, 0x00, 0x00, 0x70, 0x00, 0x03, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5880, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x6B, 0x00, 0x11, 0x08, 0x00, 0x11, 0x6B, 0x00, 0x11, 0x00, 0x00, 0x11, 0x28, 0x00, 0x1D, 0x3F, 0x00, 0x31, 0x48, 0x00, 0x61, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x03, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5881, { 0x00, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x7A, 0x00, 0x11, 0x02, 0x00, 0x7D, 0x7A, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1D, 0xFE, 0x00, 0x30, 0x84, 0x00, 0x60, 0x58, 0x00, 0x00, 0x30, 0x00, 0x00, 0xEC, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5883, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x24, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0F, 0x82, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x80, 0x00, 0x88, 0x80, 0x03, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5885, { 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x09, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x07, 0xC8, 0x00, 0x3C, 0x18, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5887, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x30, 0xFF, 0x00, 0x60, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5888, { 0x00, 0x00, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x17, 0xFF, 0x80, 0x7A, 0x24, 0x80, 0x13, 0xE4, 0x80, 0x12, 0x24, 0x80, 0x13, 0xE4, 0x80, 0x12, 0x24, 0x80, 0x17, 0xF4, 0x80, 0x1A, 0xA4, 0x80, 0x32, 0xA4, 0x80, 0x62, 0xA8, 0x80, 0x03, 0x30, 0x80, 0x02, 0x05, 0x80, 0x01, 0xF3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5889, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x09, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x0F, 0x49, 0x00, 0x39, 0x7F, 0x00, 0x01, 0x49, 0x00, 0x01, 0x7F, 0x00, 0x02, 0x49, 0x00, 0x04, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x588A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x7E, 0x00, 0x08, 0x12, 0x00, 0x7F, 0x92, 0x00, 0x12, 0x12, 0x00, 0x7F, 0xB2, 0x00, 0x08, 0x1A, 0x00, 0x7F, 0xA2, 0x80, 0x08, 0x42, 0x80, 0x08, 0x03, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x588C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x7C, 0x00, 0x1E, 0x00, 0x00, 0x32, 0xA9, 0x00, 0x62, 0xA9, 0x00, 0x06, 0x94, 0x80, 0x0C, 0x94, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x588D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x26, 0x14, 0x00, 0x3C, 0x14, 0x00, 0x21, 0x25, 0x00, 0x3F, 0x43, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x588F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x22, 0x3F, 0x00, 0x22, 0xE9, 0x00, 0x3E, 0x2E, 0x00, 0x02, 0xF8, 0x00, 0x7E, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x12, 0x62, 0x00, 0x32, 0x22, 0x00, 0x62, 0x0E, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5890, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5892, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x7E, 0x4A, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x86, 0x00, 0x09, 0x7A, 0x00, 0x0F, 0x4A, 0x00, 0x79, 0x4A, 0x00, 0x21, 0x7A, 0x00, 0x01, 0x02, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5893, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x90, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5894, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x7C, 0x90, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x13, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x10, 0x00, 0x31, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5896, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x7C, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5897, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x7D, 0x10, 0x80, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x70, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5899, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x7D, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x1D, 0x74, 0x00, 0x71, 0x54, 0x00, 0x21, 0x74, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x589A, { 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x11, 0x7E, 0x00, 0x14, 0x24, 0x00, 0x12, 0x64, 0x00, 0x10, 0xA4, 0x00, 0x7E, 0x44, 0x00, 0x12, 0x54, 0x00, 0x14, 0x88, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x1C, 0x20, 0x00, 0x70, 0x70, 0x00, 0x20, 0xA8, 0x00, 0x01, 0x27, 0x00, 0x06, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x589C, { 0x00, 0x00, 0x00, 0x3C, 0x18, 0x00, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x2B, 0x7D, 0x80, 0x24, 0x30, 0x00, 0x24, 0xDA, 0x00, 0x27, 0x1C, 0x00, 0x24, 0x6C, 0x00, 0x25, 0x9A, 0x00, 0x3C, 0x69, 0x80, 0x21, 0xB0, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x589D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x82, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x82, 0x00, 0x10, 0xE2, 0x00, 0x13, 0x8F, 0x80, 0x1C, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x60, 0x48, 0x00, 0x00, 0x48, 0x80, 0x00, 0xC8, 0x80, 0x03, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x589E, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x02, 0x00, 0x08, 0x41, 0x80, 0x09, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xAA, 0x80, 0x08, 0x9C, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x589F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x3F, 0x1F, 0x00, 0x09, 0xF1, 0x00, 0x09, 0x1F, 0x00, 0x09, 0x00, 0x00, 0x09, 0x55, 0x00, 0x0F, 0x55, 0x00, 0x39, 0x55, 0x00, 0x01, 0x77, 0x00, 0x02, 0x14, 0x00, 0x02, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58A0, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58A1, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x91, 0x00, 0x10, 0x52, 0x00, 0x11, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x70, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58A2, { 0x00, 0x00, 0x00, 0x00, 0xF2, 0x00, 0x10, 0x14, 0x80, 0x11, 0xA9, 0x00, 0x10, 0x46, 0x00, 0x13, 0x81, 0x80, 0x7C, 0x00, 0x00, 0x11, 0xCE, 0x00, 0x10, 0x4A, 0x00, 0x11, 0xCA, 0x80, 0x11, 0x11, 0x80, 0x1D, 0xC0, 0x00, 0x30, 0x7F, 0x80, 0x60, 0x51, 0x00, 0x00, 0x4A, 0x00, 0x00, 0xC4, 0x00, 0x01, 0xBB, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58A6, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x13, 0xF0, 0x00, 0x11, 0x22, 0x00, 0x10, 0xA4, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0xA4, 0x00, 0x10, 0xA6, 0x00, 0x11, 0xA3, 0x00, 0x13, 0x21, 0x80, 0x1D, 0xFE, 0x00, 0x31, 0x22, 0x00, 0x61, 0xFE, 0x00, 0x01, 0x22, 0x00, 0x01, 0x22, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x21, 0x48, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58A9, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x15, 0x00, 0x09, 0x15, 0x00, 0x09, 0xF9, 0x00, 0x08, 0x0D, 0x00, 0x09, 0xF7, 0x00, 0x0E, 0x22, 0x00, 0x30, 0x7A, 0x00, 0x01, 0xC5, 0x00, 0x06, 0x45, 0x00, 0x00, 0x48, 0x80, 0x00, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58AB, { 0x00, 0x00, 0x00, 0x10, 0x9E, 0x00, 0x11, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x28, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xCF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x02, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x42, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58AE, { 0x00, 0x00, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x22, 0x88, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x2E, 0x3F, 0x00, 0x20, 0x21, 0x00, 0x20, 0x47, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58B1, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0xF4, 0x00, 0x11, 0x18, 0x80, 0x10, 0xA5, 0x00, 0x10, 0x42, 0x00, 0x7D, 0xBD, 0x80, 0x10, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x30, 0x00, 0x00, 0x60, 0x42, 0x00, 0x00, 0x66, 0x00, 0x00, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58B2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x80, 0x13, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x7C, 0xAA, 0x00, 0x13, 0xFF, 0x80, 0x10, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x1B, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x01, 0xAB, 0x00, 0x03, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58B3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x0F, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58B8, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x21, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x22, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x1C, 0x64, 0x00, 0x71, 0xFF, 0x00, 0x07, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58B9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x7E, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x00, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x1E, 0x44, 0x80, 0x72, 0x44, 0x80, 0x02, 0x7C, 0x80, 0x02, 0x00, 0x80, 0x02, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58BA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x1D, 0x00, 0x09, 0x71, 0x00, 0x3F, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x39, 0x00, 0x09, 0x55, 0x00, 0x09, 0x93, 0x00, 0x0F, 0x11, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58BB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x3E, 0x5D, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x80, 0x80, 0x30, 0xBE, 0x80, 0x00, 0xBE, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58BC, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x80, 0x24, 0xA3, 0x80, 0x3F, 0x80, 0x00, 0x24, 0xBF, 0x80, 0x7F, 0xD1, 0x00, 0x04, 0x0A, 0x00, 0x24, 0x84, 0x00, 0x3F, 0xBB, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58BE, { 0x00, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x0D, 0x22, 0x00, 0x32, 0x3E, 0x00, 0x0E, 0x22, 0x00, 0x33, 0x3E, 0x00, 0x05, 0x28, 0x00, 0x09, 0x29, 0x00, 0x33, 0x26, 0x00, 0x05, 0x3C, 0x00, 0x09, 0xE2, 0x00, 0x36, 0x01, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58C1, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xBF, 0x80, 0x38, 0x84, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x84, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58C2, { 0x00, 0x00, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x29, 0x12, 0x80, 0x3F, 0xA3, 0x80, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x80, 0x3F, 0xA1, 0x00, 0x2A, 0x12, 0x00, 0x29, 0x0C, 0x00, 0x50, 0xBB, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58C4, { 0x00, 0x00, 0x00, 0x13, 0xE4, 0x00, 0x11, 0x24, 0x00, 0x7C, 0xDF, 0x80, 0x13, 0xE4, 0x00, 0x30, 0xAC, 0x00, 0x38, 0xCE, 0x00, 0x5C, 0x97, 0x00, 0x56, 0x95, 0x80, 0x10, 0x84, 0x00, 0x11, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58C5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x24, 0x00, 0x28, 0x7F, 0x00, 0x12, 0xC8, 0x00, 0x0D, 0x7F, 0x00, 0x09, 0x48, 0x00, 0x32, 0x7F, 0x00, 0x0C, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x30, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58C7, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x3D, 0x39, 0x00, 0x11, 0x39, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1C, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58C8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x30, 0xFE, 0x00, 0x60, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x92, 0x00, 0x03, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58CA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x48, 0x00, 0x30, 0xCC, 0x80, 0x61, 0x85, 0x00, 0x06, 0x86, 0x00, 0x00, 0xF3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58CC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x13, 0x83, 0x80, 0x7C, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x49, 0x00, 0x70, 0xCA, 0x00, 0x07, 0x8C, 0x00, 0x00, 0xF6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58CD, { 0x00, 0x00, 0x00, 0x21, 0x07, 0x80, 0x17, 0xD8, 0x00, 0x01, 0x10, 0x00, 0x47, 0xDF, 0x80, 0x25, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x15, 0x52, 0x00, 0x17, 0xD2, 0x00, 0x21, 0x12, 0x00, 0x27, 0xD2, 0x00, 0x41, 0x22, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58CE, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x93, 0x00, 0x09, 0x55, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x02, 0x49, 0x00, 0x04, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D0, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x6A, 0x95, 0x80, 0x24, 0x89, 0x00, 0x2A, 0x95, 0x00, 0x20, 0x81, 0x00, 0x2A, 0x95, 0x00, 0x24, 0x89, 0x00, 0x2A, 0x95, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xD1, 0x00, 0x2F, 0x4A, 0x00, 0x00, 0x0A, 0x00, 0x16, 0x84, 0x00, 0x29, 0x4C, 0x00, 0x10, 0x8A, 0x00, 0x3F, 0x51, 0x00, 0x11, 0x20, 0x80, 0x1F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D2, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x61, 0x29, 0x00, 0x01, 0x29, 0x00, 0x01, 0x29, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x17, 0x86, 0x00, 0x14, 0x85, 0x00, 0x17, 0xBF, 0x80, 0x17, 0x84, 0x00, 0x14, 0x8A, 0x00, 0x17, 0x8A, 0x00, 0x17, 0x91, 0x00, 0x14, 0xE0, 0x80, 0x15, 0xA0, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58D4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x7D, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x52, 0x00, 0x01, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58D5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x09, 0xFF, 0x00, 0x08, 0x51, 0x00, 0x0E, 0xAA, 0x00, 0x3B, 0x4C, 0x00, 0x0C, 0x9C, 0x00, 0x03, 0x2A, 0x00, 0x0C, 0xC9, 0x00, 0x03, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x7E, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x70, 0x20, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x48, 0x80, 0x02, 0x48, 0x80, 0x02, 0x4B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D7, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x11, 0x49, 0x00, 0x12, 0x24, 0x80, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x01, 0x49, 0x00, 0x01, 0x49, 0x00, 0x01, 0x49, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D8, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58D9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x3F, 0x22, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x0F, 0x49, 0x00, 0x31, 0x7F, 0x00, 0x01, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x02, 0x22, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58DA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x7D, 0x7E, 0x00, 0x11, 0x10, 0x80, 0x11, 0x7F, 0x80, 0x11, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x49, 0x00, 0x71, 0x7F, 0x00, 0x01, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x03, 0x55, 0x00, 0x06, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58DC, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x10, 0x10, 0x00, 0x1C, 0xFE, 0x00, 0x70, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x9F, 0x00, 0x01, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58DD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x13, 0x3F, 0x00, 0x11, 0x29, 0x00, 0x12, 0x3F, 0x00, 0x13, 0x08, 0x00, 0x7D, 0x7F, 0x80, 0x10, 0x00, 0x00, 0x13, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x1D, 0x21, 0x00, 0x31, 0x3F, 0x00, 0x61, 0x21, 0x00, 0x01, 0x3F, 0x00, 0x03, 0x40, 0x80, 0x04, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58DE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x94, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xEB, 0x80, 0x08, 0x08, 0x00, 0x0E, 0xEB, 0x80, 0x38, 0x15, 0x00, 0x00, 0x66, 0x00, 0x01, 0xA2, 0x00, 0x06, 0x3D, 0x00, 0x00, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58DF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x9F, 0x00, 0x09, 0x10, 0x00, 0x3F, 0xDF, 0x00, 0x1F, 0x81, 0x00, 0x10, 0x9F, 0x00, 0x1F, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x90, 0x80, 0x11, 0x9F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58E1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xBF, 0x80, 0x04, 0x10, 0x80, 0x7F, 0xC9, 0x00, 0x40, 0x4A, 0x00, 0x0F, 0x04, 0x00, 0x20, 0x8A, 0x00, 0x5F, 0x51, 0x80, 0x20, 0x84, 0x00, 0x7F, 0xE4, 0x00, 0x20, 0x84, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x73, 0x80, 0x13, 0xCE, 0x00, 0x7E, 0x42, 0x00, 0x13, 0xFF, 0x80, 0x12, 0xC6, 0x00, 0x13, 0x6B, 0x00, 0x12, 0x52, 0x80, 0x1E, 0x52, 0x00, 0x32, 0x10, 0x00, 0x62, 0x9E, 0x00, 0x06, 0x90, 0x00, 0x04, 0x90, 0x00, 0x0D, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58E4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0xE7, 0x00, 0x08, 0xA5, 0x00, 0x3E, 0xE7, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x0F, 0x24, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x69, 0x00, 0x01, 0xC6, 0x00, 0x06, 0x7A, 0x00, 0x01, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58E5, { 0x00, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x6B, 0x00, 0x7E, 0x5D, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x72, 0x55, 0x00, 0x06, 0x88, 0x80, 0x04, 0x7F, 0x00, 0x0C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58E9, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x7A, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x11, 0x40, 0x00, 0x13, 0xEF, 0x80, 0x11, 0x48, 0x80, 0x1B, 0xEF, 0x80, 0x32, 0xA8, 0x80, 0x63, 0xEF, 0x80, 0x00, 0x88, 0x80, 0x03, 0xE8, 0x80, 0x00, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x58EB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58EC, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58EE, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x34, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x34, 0x10, 0x00, 0x64, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58EF, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x48, 0x18, 0x80, 0x08, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x0C, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0x21, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xF8, 0x80, 0x40, 0x00, 0x80, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x11, 0x00, 0x08, 0x11, 0x00, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x42, 0x20, 0x00, 0x12, 0x24, 0x00, 0x0A, 0x2C, 0x00, 0x06, 0x30, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58F9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58FA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x10, 0x00, 0x0F, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0x1E, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58FB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x80, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x3E, 0x90, 0x00, 0x08, 0xD0, 0x00, 0x09, 0x3F, 0x80, 0x0A, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x30, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58FC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x01, 0x20, 0x00, 0x0F, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x3C, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x58FD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x01, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x1E, 0x24, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5902, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x1A, 0x18, 0x00, 0x33, 0x10, 0x00, 0x01, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5904, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x11, 0x30, 0x00, 0x11, 0x28, 0x00, 0x11, 0x26, 0x00, 0x2A, 0x22, 0x00, 0x4A, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x11, 0x03, 0x00, 0x20, 0xFE, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5905, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0E, 0x08, 0x00, 0x34, 0x10, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0x7C, 0x00, 0x78, 0x27, 0x80, 0x00, 0x20, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5906, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0E, 0x08, 0x00, 0x34, 0x30, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x78, 0x00, 0x70, 0x87, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5907, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x20, 0x00, 0x11, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0F, 0x00, 0x6F, 0xFA, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5909, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x12, 0x12, 0x00, 0x32, 0x13, 0x00, 0x66, 0x11, 0x80, 0x0C, 0x10, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x3B, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x590A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x80, 0x00, 0x18, 0x80, 0x00, 0x09, 0xFC, 0x00, 0x0D, 0x04, 0x00, 0x07, 0x0C, 0x00, 0x02, 0x08, 0x00, 0x07, 0x18, 0x00, 0x0D, 0x30, 0x00, 0x19, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x590B, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x10, 0x00, 0x06, 0x18, 0x00, 0x1F, 0xEC, 0x00, 0x00, 0x06, 0x00, 0x03, 0x20, 0x00, 0x0E, 0x31, 0x00, 0x38, 0x1F, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x1D, 0xB0, 0x00, 0x00, 0x60, 0x00, 0x01, 0xB0, 0x00, 0x0F, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x590C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0E, 0x18, 0x00, 0x78, 0x0F, 0x80, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x1F, 0xB0, 0x00, 0x00, 0x60, 0x00, 0x01, 0xB0, 0x00, 0x0F, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x590D, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xF8, 0x00, 0x24, 0x08, 0x00, 0x47, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x10, 0x00, 0x09, 0x20, 0x00, 0x10, 0xC0, 0x00, 0x21, 0x20, 0x00, 0x02, 0x18, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x590F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x05, 0x04, 0x00, 0x38, 0x98, 0x00, 0x00, 0x60, 0x00, 0x03, 0x9C, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5910, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x18, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x20, 0xC1, 0x00, 0x23, 0x31, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x3A, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5912, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0xEF, 0x00, 0x2F, 0x29, 0x00, 0x29, 0xE9, 0x00, 0x29, 0x2F, 0x00, 0x29, 0xE8, 0x80, 0x3F, 0x28, 0x80, 0x61, 0xE7, 0x80, 0x06, 0x18, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x7A, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5913, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xF7, 0x00, 0x30, 0x81, 0x00, 0x23, 0xF1, 0x00, 0x3A, 0x17, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x3A, 0x17, 0x00, 0x03, 0xF2, 0x00, 0x1E, 0x1E, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x7A, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5914, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x09, 0xF7, 0x80, 0x29, 0x14, 0x80, 0x2F, 0xF7, 0x80, 0x29, 0x14, 0x00, 0x29, 0xF4, 0x00, 0x2F, 0x14, 0x80, 0x31, 0xF7, 0x80, 0x00, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x07, 0x04, 0x00, 0x18, 0x98, 0x00, 0x00, 0xF0, 0x00, 0x3F, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5915, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x04, 0x82, 0x00, 0x08, 0x44, 0x00, 0x10, 0x28, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5916, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x54, 0x00, 0x14, 0x8C, 0x00, 0x22, 0x84, 0x00, 0x01, 0x06, 0x00, 0x01, 0x05, 0x00, 0x02, 0x04, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5918, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x0F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x18, 0x91, 0x00, 0x10, 0x91, 0x00, 0x39, 0x91, 0x00, 0x6D, 0x11, 0x00, 0x07, 0x11, 0x00, 0x02, 0x11, 0x00, 0x06, 0x11, 0x00, 0x04, 0x11, 0x00, 0x0C, 0x17, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5919, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x8A, 0x00, 0x09, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x10, 0x82, 0x80, 0x11, 0x01, 0x80, 0x26, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x591A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x10, 0x00, 0x06, 0x20, 0x00, 0x09, 0x50, 0x00, 0x30, 0xA0, 0x00, 0x01, 0x3F, 0x80, 0x02, 0x41, 0x00, 0x0C, 0xC2, 0x00, 0x33, 0x24, 0x00, 0x0C, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x591B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0E, 0x06, 0x00, 0x39, 0x8C, 0x00, 0x00, 0xD8, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x591C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x3F, 0x80, 0x04, 0x21, 0x00, 0x0C, 0x49, 0x00, 0x0C, 0xA6, 0x00, 0x15, 0x14, 0x00, 0x26, 0x18, 0x00, 0x04, 0x08, 0x00, 0x04, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x05, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x591D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x48, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x32, 0xC8, 0x00, 0x22, 0x88, 0x00, 0x72, 0x08, 0x00, 0x5A, 0x08, 0x00, 0x0E, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x591F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0x3E, 0x00, 0x1F, 0xA2, 0x00, 0x21, 0x44, 0x00, 0x41, 0xA8, 0x00, 0x3D, 0x10, 0x00, 0x25, 0x28, 0x00, 0x25, 0x4F, 0x00, 0x25, 0x91, 0x00, 0x25, 0x22, 0x00, 0x3D, 0x54, 0x00, 0x21, 0x08, 0x00, 0x05, 0x10, 0x00, 0x02, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5921, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x88, 0x00, 0x18, 0x88, 0x00, 0x31, 0x7F, 0x00, 0x5B, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x04, 0x08, 0x00, 0x18, 0x3E, 0x00, 0x6F, 0x80, 0x00, 0x18, 0x80, 0x00, 0x31, 0x7F, 0x00, 0x5B, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x04, 0x41, 0x00, 0x18, 0x41, 0x00, 0x70, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5922, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x03, 0xFC, 0x00, 0x05, 0x08, 0x00, 0x18, 0x90, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5923, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x04, 0x78, 0x00, 0x1F, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x41, 0x00, 0x80, 0x43, 0xFC, 0x80, 0x0E, 0x18, 0x00, 0x19, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5924, { 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x07, 0x0C, 0x00, 0x1D, 0xB8, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x47, 0xFC, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x1E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5925, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x99, 0x00, 0x24, 0xB3, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x86, 0x00, 0x24, 0x8C, 0x00, 0x3F, 0xB8, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC7, 0x80, 0x15, 0x0C, 0x80, 0x15, 0x99, 0x80, 0x34, 0x85, 0x00, 0x24, 0xC3, 0x00, 0x64, 0x06, 0x00, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5927, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5928, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5929, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x592A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x90, 0x00, 0x01, 0x10, 0x00, 0x01, 0x48, 0x00, 0x02, 0x28, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x592B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x592C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x592D, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x592E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x592F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x00, 0x03, 0x02, 0x00, 0x06, 0x06, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5930, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5931, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5932, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5933, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x70, 0x03, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5934, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x03, 0x40, 0x00, 0x11, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x04, 0x40, 0x00, 0x00, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0xB0, 0x00, 0x01, 0x08, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5935, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8C, 0x00, 0x10, 0x86, 0x00, 0x30, 0x83, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5936, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x16, 0x16, 0x00, 0x32, 0x32, 0x00, 0x22, 0x22, 0x00, 0x63, 0x63, 0x00, 0x41, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5937, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x80, 0x00, 0xA0, 0x80, 0x01, 0x10, 0x80, 0x02, 0x0B, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5938, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5939, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x07, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x593A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x07, 0x00, 0x60, 0x12, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x593C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x07, 0x00, 0x64, 0x92, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x10, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x593E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x20, 0xE0, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x593F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x7F, 0xFB, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0C, 0x06, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5941, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x68, 0x13, 0x00, 0x0A, 0x20, 0x00, 0x09, 0x40, 0x00, 0x08, 0x80, 0x00, 0x09, 0x40, 0x00, 0x0A, 0x30, 0x00, 0x0C, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5942, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x10, 0x48, 0x00, 0x2F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x30, 0x00, 0x0C, 0x0E, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5943, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0xF3, 0x80, 0x0F, 0x80, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x0F, 0x90, 0x00, 0x38, 0x19, 0x00, 0x00, 0x0F, 0x00, 0x3F, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5944, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x0C, 0x00, 0x0C, 0x43, 0x80, 0x30, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5946, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFE, 0x00, 0x78, 0x03, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5947, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x07, 0xE2, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x07, 0xE2, 0x00, 0x04, 0x22, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5948, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x40, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5949, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xA0, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x594B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0F, 0x00, 0x6F, 0xFA, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x594E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x594F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5950, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x30, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x1E, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5951, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x42, 0x00, 0x04, 0x8C, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5952, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x06, 0x64, 0x00, 0x0C, 0xCC, 0x00, 0x03, 0x98, 0x00, 0x0E, 0x30, 0x00, 0x00, 0xEC, 0x00, 0x1F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5953, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x8E, 0x00, 0x71, 0xF3, 0x80, 0x07, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x01, 0xC2, 0x00, 0x1E, 0x84, 0x00, 0x00, 0x48, 0x00, 0x00, 0x70, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5954, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x40, 0x00, 0x02, 0x48, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5955, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x05, 0x14, 0x00, 0x09, 0x12, 0x00, 0x12, 0x11, 0x00, 0x0C, 0x70, 0x00, 0x30, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5956, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x22, 0x20, 0x00, 0x12, 0x3E, 0x00, 0x02, 0x42, 0x00, 0x0A, 0xA4, 0x00, 0x12, 0x18, 0x00, 0x32, 0x10, 0x00, 0x02, 0x20, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x07, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5957, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x03, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5958, { 0x00, 0x00, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x64, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5959, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x08, 0x00, 0x06, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x86, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xC0, 0x00, 0x07, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x6F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x80, 0x00, 0x80, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x595A, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xE1, 0x00, 0x08, 0x10, 0x80, 0x10, 0x88, 0x00, 0x05, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0x22, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x595B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x7F, 0x80, 0x1F, 0x42, 0x00, 0x11, 0x42, 0x00, 0x11, 0x7E, 0x00, 0x1F, 0x42, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x42, 0x00, 0x1F, 0x42, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x595D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x7C, 0x0F, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x09, 0xF2, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x42, 0x00, 0x09, 0xF2, 0x00, 0x19, 0x12, 0x00, 0x11, 0xF2, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x595E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x72, 0x23, 0x80, 0x04, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x595F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x7F, 0x7F, 0x80, 0x11, 0x42, 0x00, 0x19, 0x72, 0x00, 0x17, 0x4E, 0x00, 0x11, 0x42, 0x00, 0x19, 0x72, 0x00, 0x17, 0x4E, 0x00, 0x11, 0x42, 0x00, 0x31, 0x42, 0x00, 0x67, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5960, { 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x31, 0x11, 0x80, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0E, 0x0E, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5961, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x3A, 0x1E, 0x00, 0x66, 0x13, 0x80, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5962, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x37, 0xF5, 0x80, 0x00, 0x48, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xD0, 0x00, 0x07, 0x08, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5963, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x40, 0x00, 0x07, 0x70, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x3E, 0xC2, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5965, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x14, 0x92, 0x00, 0x12, 0xA2, 0x00, 0x17, 0xFA, 0x00, 0x11, 0xC2, 0x00, 0x12, 0xA2, 0x00, 0x14, 0x9A, 0x00, 0x10, 0x82, 0x00, 0x11, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5967, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x4A, 0x00, 0x09, 0x52, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0xE2, 0x00, 0x09, 0x52, 0x00, 0x0A, 0x4A, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5968, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x24, 0xFC, 0x00, 0x34, 0x10, 0x80, 0x14, 0x89, 0x00, 0x04, 0x42, 0x00, 0x05, 0xFF, 0x80, 0x1C, 0x02, 0x00, 0x74, 0x62, 0x00, 0x04, 0x32, 0x00, 0x04, 0x06, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5969, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x06, 0x18, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x03, 0x80, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x92, 0x00, 0x17, 0x9E, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x596A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x06, 0x2C, 0x00, 0x3A, 0x43, 0x80, 0x07, 0xFE, 0x00, 0x0C, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x24, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x40, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x596B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xB0, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x11, 0x29, 0x00, 0x09, 0x29, 0x00, 0x21, 0xEF, 0x00, 0x11, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x21, 0x29, 0x00, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x596C, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0x22, 0x00, 0x11, 0xD4, 0x00, 0x01, 0x1A, 0x00, 0x3F, 0x62, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x12, 0x00, 0x11, 0x4E, 0x00, 0x21, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x596D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x1F, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x1F, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x1F, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x596E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x05, 0x28, 0x00, 0x0A, 0x46, 0x00, 0x37, 0xFD, 0x80, 0x08, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x28, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x596F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x0E, 0x1C, 0x00, 0x70, 0x43, 0x80, 0x08, 0x7C, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x0A, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x08, 0x00, 0x2F, 0x8E, 0x00, 0x22, 0x04, 0x80, 0x2A, 0x8E, 0x80, 0x69, 0x9B, 0x80, 0x43, 0x71, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5972, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xBB, 0x80, 0x13, 0x2A, 0x80, 0x29, 0xFB, 0x80, 0x48, 0x80, 0x00, 0x3F, 0x3F, 0x80, 0x0C, 0x24, 0x80, 0x7F, 0xBF, 0x80, 0x1A, 0x64, 0x80, 0x3F, 0x3F, 0x80, 0x71, 0x04, 0x00, 0x1F, 0x7F, 0x80, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5973, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x12, 0x20, 0x00, 0x21, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x30, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5974, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x11, 0x22, 0x00, 0x11, 0x12, 0x00, 0x12, 0x12, 0x00, 0x22, 0x14, 0x00, 0x32, 0x0C, 0x00, 0x2C, 0x08, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x12, 0x00, 0x09, 0x22, 0x00, 0x10, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5975, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x31, 0x08, 0x00, 0x23, 0x08, 0x00, 0x22, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x07, 0x08, 0x00, 0x0D, 0x08, 0x00, 0x18, 0x08, 0x00, 0x70, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5976, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x47, 0x80, 0x32, 0x40, 0x80, 0x26, 0x40, 0x80, 0x24, 0x40, 0x80, 0x7C, 0xC0, 0x80, 0x0A, 0x81, 0x80, 0x19, 0x81, 0x00, 0x31, 0x81, 0x00, 0x63, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5978, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x34, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x12, 0x08, 0x00, 0x21, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5979, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4B, 0x00, 0x7E, 0x4F, 0x00, 0x12, 0x79, 0x00, 0x13, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x32, 0x4B, 0x00, 0x26, 0x48, 0x00, 0x24, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x0A, 0x40, 0x00, 0x18, 0x40, 0x80, 0x30, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x597B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x31, 0x00, 0x23, 0x23, 0x00, 0x22, 0x22, 0x00, 0x7E, 0x7E, 0x00, 0x07, 0x07, 0x00, 0x0D, 0x8D, 0x80, 0x18, 0x18, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x597C, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x32, 0x10, 0x00, 0x26, 0x10, 0x00, 0x24, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x18, 0x10, 0x80, 0x30, 0x19, 0x80, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x597D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x02, 0x00, 0x3F, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x34, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x12, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5981, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x11, 0xC1, 0x00, 0x11, 0x01, 0x00, 0x11, 0x31, 0x00, 0x31, 0x19, 0x00, 0x23, 0x09, 0x00, 0x22, 0x01, 0x00, 0x7E, 0x01, 0x00, 0x07, 0x01, 0x00, 0x0D, 0x83, 0x00, 0x18, 0x82, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5982, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x09, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x12, 0x21, 0x00, 0x22, 0x21, 0x00, 0x32, 0x21, 0x00, 0x2C, 0x21, 0x00, 0x06, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x10, 0xA1, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5983, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x01, 0x00, 0x3F, 0x81, 0x00, 0x09, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x20, 0x00, 0x12, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x26, 0x20, 0x00, 0x05, 0x20, 0x00, 0x09, 0x20, 0x80, 0x08, 0xA0, 0x80, 0x10, 0xBF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5984, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x02, 0x08, 0x00, 0x05, 0x90, 0x00, 0x00, 0x78, 0x00, 0x03, 0x86, 0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5986, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x24, 0x40, 0x00, 0x14, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x15, 0x04, 0x00, 0x24, 0x88, 0x00, 0x64, 0x50, 0x00, 0x04, 0x20, 0x00, 0x04, 0x58, 0x00, 0x04, 0x86, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5987, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x14, 0x02, 0x00, 0x08, 0x02, 0x00, 0x14, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x42, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5988, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x8A, 0x00, 0x12, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x14, 0x12, 0x00, 0x09, 0xFA, 0x00, 0x14, 0x02, 0x00, 0x22, 0x02, 0x00, 0x42, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x598A, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x38, 0x00, 0x09, 0xD0, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x34, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x598B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x32, 0xFF, 0x80, 0x26, 0x10, 0x00, 0x24, 0x38, 0x00, 0x7E, 0x28, 0x00, 0x0A, 0x6C, 0x00, 0x18, 0x44, 0x00, 0x30, 0xC6, 0x00, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x598C, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x32, 0x22, 0x00, 0x26, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x0A, 0x62, 0x00, 0x18, 0x42, 0x00, 0x30, 0xC2, 0x00, 0x61, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x598D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x32, 0x22, 0x00, 0x26, 0x22, 0x00, 0x24, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x0B, 0x22, 0x00, 0x19, 0x62, 0x00, 0x30, 0x42, 0x00, 0x60, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x598E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x7E, 0x36, 0x00, 0x12, 0x22, 0x00, 0x12, 0x63, 0x00, 0x12, 0xC1, 0x80, 0x32, 0x22, 0x00, 0x26, 0x22, 0x00, 0x24, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x18, 0x62, 0x00, 0x30, 0x42, 0x00, 0x60, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5992, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x80, 0x08, 0x7C, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x7F, 0x80, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x32, 0x7F, 0x80, 0x26, 0x40, 0x00, 0x24, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x18, 0xC0, 0x00, 0x30, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5993, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x24, 0x42, 0x00, 0x34, 0x22, 0x00, 0x28, 0x24, 0x00, 0x0C, 0x18, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x14, 0x00, 0x10, 0x62, 0x00, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5995, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x32, 0x88, 0x80, 0x26, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5996, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x0A, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x24, 0x10, 0x00, 0x34, 0x28, 0x00, 0x28, 0x28, 0x00, 0x2C, 0x28, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x82, 0x00, 0x21, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5997, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x3F, 0x14, 0x00, 0x12, 0x22, 0x00, 0x12, 0x41, 0x00, 0x12, 0xBE, 0x80, 0x12, 0x00, 0x00, 0x24, 0x00, 0x00, 0x34, 0x7E, 0x00, 0x2C, 0x02, 0x00, 0x24, 0x02, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x12, 0x04, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5999, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x29, 0x00, 0x3F, 0x48, 0x80, 0x12, 0x48, 0x00, 0x12, 0x88, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x80, 0x34, 0x09, 0x00, 0x2C, 0x39, 0x00, 0x24, 0x02, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x12, 0x30, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x599B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x18, 0x00, 0x1F, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x3C, 0x00, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x599D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x46, 0x00, 0x7C, 0xC4, 0x00, 0x24, 0x84, 0x00, 0x24, 0x8C, 0x00, 0x25, 0xE8, 0x00, 0x24, 0x38, 0x00, 0x24, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x05, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x599E, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0xFC, 0x00, 0x12, 0x44, 0x00, 0x22, 0x44, 0x00, 0x14, 0x44, 0x00, 0x08, 0x44, 0x00, 0x14, 0x44, 0x00, 0x22, 0x44, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x599F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x18, 0x00, 0x0F, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59A3, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x80, 0x7E, 0x45, 0x80, 0x12, 0x77, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x32, 0x44, 0x00, 0x26, 0x44, 0x00, 0x24, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x19, 0x44, 0x80, 0x30, 0x74, 0x80, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59A4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x03, 0x00, 0x08, 0x34, 0x00, 0x7E, 0x18, 0x00, 0x12, 0x0C, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x08, 0x80, 0x32, 0x08, 0x80, 0x26, 0x08, 0x80, 0x24, 0x0B, 0x80, 0x7E, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x18, 0x08, 0x00, 0x70, 0x08, 0x00, 0x40, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59A5, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x82, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x10, 0x00, 0x0F, 0x20, 0x00, 0x10, 0xE0, 0x00, 0x01, 0x98, 0x00, 0x06, 0x06, 0x00, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59A7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x32, 0x24, 0x00, 0x26, 0x24, 0x00, 0x24, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x0A, 0x64, 0x80, 0x18, 0x44, 0x80, 0x30, 0xC4, 0x80, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59A8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x1F, 0x00, 0x22, 0x11, 0x00, 0x24, 0x21, 0x00, 0x34, 0x21, 0x00, 0x28, 0x21, 0x00, 0x0C, 0x41, 0x00, 0x0A, 0x42, 0x00, 0x10, 0x82, 0x00, 0x23, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59A9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x22, 0x28, 0x00, 0x14, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x49, 0x00, 0x22, 0x89, 0x00, 0x41, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59AA, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xC2, 0x00, 0x12, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x22, 0x94, 0x00, 0x14, 0xA2, 0x00, 0x08, 0xC2, 0x00, 0x14, 0x80, 0x00, 0x22, 0x82, 0x00, 0x42, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59AB, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x7E, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x14, 0x52, 0x00, 0x08, 0x4A, 0x00, 0x14, 0x82, 0x00, 0x22, 0x82, 0x00, 0x41, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59AC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x3F, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x00, 0x22, 0xFF, 0x00, 0x25, 0x41, 0x00, 0x26, 0x41, 0x00, 0x34, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59AD, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x26, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x22, 0x00, 0x12, 0x72, 0x00, 0x32, 0x56, 0x00, 0x26, 0x54, 0x00, 0x24, 0xDC, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x9C, 0x00, 0x1B, 0x36, 0x00, 0x30, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59AE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x40, 0x00, 0x12, 0x50, 0x00, 0x32, 0x50, 0x00, 0x26, 0x53, 0x00, 0x24, 0x5C, 0x00, 0x7E, 0x50, 0x00, 0x0A, 0xD0, 0x80, 0x18, 0x90, 0x80, 0x31, 0x90, 0x80, 0x63, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59AF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x32, 0x88, 0x80, 0x26, 0xFF, 0x80, 0x24, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x18, 0x88, 0x80, 0x30, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59B0, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x7E, 0xD0, 0x00, 0x12, 0x90, 0x00, 0x12, 0x90, 0x00, 0x12, 0x1F, 0x00, 0x32, 0x10, 0x00, 0x26, 0x10, 0x00, 0x24, 0x10, 0x00, 0x7E, 0x1F, 0x00, 0x0A, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59B2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x32, 0x41, 0x00, 0x26, 0x41, 0x00, 0x24, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x0B, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59B3, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x7E, 0xC8, 0x80, 0x13, 0x89, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x32, 0x49, 0x00, 0x26, 0x49, 0x00, 0x24, 0x49, 0x00, 0x7E, 0xC9, 0x80, 0x0A, 0x88, 0x80, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59B7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0xC8, 0x00, 0x12, 0x88, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x26, 0x08, 0x00, 0x24, 0x1C, 0x00, 0x7E, 0x14, 0x00, 0x0A, 0x36, 0x00, 0x18, 0x22, 0x00, 0x30, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59B9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x34, 0x38, 0x00, 0x2C, 0x38, 0x00, 0x0A, 0x54, 0x00, 0x12, 0x52, 0x00, 0x10, 0x91, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59BA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x54, 0x00, 0x26, 0x54, 0x00, 0x24, 0x54, 0x00, 0x7E, 0xD6, 0x00, 0x0A, 0x92, 0x00, 0x19, 0x93, 0x00, 0x31, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59BB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x07, 0x88, 0x00, 0x08, 0x70, 0x00, 0x01, 0xCE, 0x00, 0x3E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59BC, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x26, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x32, 0xAC, 0x00, 0x26, 0xAB, 0x00, 0x25, 0xB9, 0x80, 0x7D, 0x30, 0x80, 0x0A, 0x20, 0x00, 0x18, 0xE1, 0x00, 0x33, 0xB3, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59BE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x07, 0x88, 0x00, 0x08, 0x70, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x03, 0x00, 0x3C, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59C1, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x13, 0x80, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x32, 0x44, 0x80, 0x26, 0x44, 0x80, 0x24, 0x44, 0x80, 0x7E, 0x7C, 0x80, 0x0A, 0x00, 0x80, 0x18, 0x00, 0x80, 0x30, 0x01, 0x80, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59C3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x4F, 0x80, 0x22, 0x48, 0x00, 0x24, 0x48, 0x00, 0x34, 0x48, 0x00, 0x28, 0x48, 0x00, 0x0C, 0x48, 0x00, 0x14, 0x48, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59C4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x32, 0xFF, 0x80, 0x26, 0x88, 0x00, 0x24, 0x88, 0x00, 0x7E, 0x8C, 0x00, 0x0A, 0x84, 0x00, 0x18, 0xB6, 0x80, 0x30, 0xE3, 0x80, 0x61, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59C6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x3F, 0x29, 0x00, 0x12, 0x25, 0x00, 0x12, 0x21, 0x00, 0x12, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x34, 0x52, 0x00, 0x28, 0x4A, 0x00, 0x0C, 0x42, 0x00, 0x16, 0xFF, 0x80, 0x12, 0x84, 0x00, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59C8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x66, 0x00, 0x7E, 0xC3, 0x00, 0x13, 0x81, 0x80, 0x12, 0x7E, 0x00, 0x12, 0x00, 0x00, 0x32, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x7E, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x18, 0x17, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59C9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x24, 0x49, 0x00, 0x34, 0x49, 0x00, 0x2C, 0x49, 0x00, 0x04, 0x49, 0x00, 0x0A, 0x4B, 0x00, 0x12, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59CA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x13, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x90, 0x00, 0x12, 0x90, 0x00, 0x12, 0x90, 0x00, 0x12, 0x90, 0x00, 0x32, 0xFF, 0x80, 0x26, 0x10, 0x80, 0x24, 0x30, 0x80, 0x7E, 0x30, 0x80, 0x0A, 0x50, 0x80, 0x18, 0x90, 0x80, 0x31, 0x11, 0x80, 0x60, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59CB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x12, 0x41, 0x00, 0x12, 0x4F, 0x80, 0x12, 0xF0, 0x80, 0x12, 0x00, 0x00, 0x24, 0x00, 0x00, 0x34, 0x7F, 0x00, 0x2C, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59CD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x7E, 0xA9, 0x00, 0x12, 0xA9, 0x00, 0x12, 0xA9, 0x00, 0x13, 0xFF, 0x80, 0x32, 0xA9, 0x00, 0x26, 0xA9, 0x00, 0x24, 0xA9, 0x00, 0x7C, 0xA9, 0x00, 0x0A, 0xA9, 0x00, 0x18, 0xA9, 0x00, 0x31, 0xA9, 0x00, 0x63, 0x2B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59D0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3F, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x22, 0x42, 0x00, 0x24, 0x42, 0x00, 0x34, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x2C, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x12, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59D1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x11, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x2C, 0x41, 0x00, 0x24, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x09, 0x41, 0x00, 0x11, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59D2, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x12, 0xB1, 0x00, 0x12, 0x99, 0x00, 0x12, 0x89, 0x00, 0x32, 0x81, 0x00, 0x26, 0x83, 0x00, 0x24, 0x92, 0x00, 0x7E, 0xA2, 0x00, 0x0A, 0xC7, 0x00, 0x18, 0xCD, 0x00, 0x31, 0x99, 0x80, 0x60, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59D3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3F, 0x48, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x08, 0x00, 0x24, 0x08, 0x00, 0x34, 0x7F, 0x00, 0x2C, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x12, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59D4, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x10, 0x00, 0x0F, 0x20, 0x00, 0x10, 0xE0, 0x00, 0x07, 0x1C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59D7, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xEF, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x7E, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x13, 0xFF, 0x00, 0x12, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x14, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x14, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x41, 0x76, 0x00, 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59D8, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x44, 0x00, 0x14, 0x44, 0x00, 0x08, 0x44, 0x00, 0x14, 0x44, 0x00, 0x22, 0x44, 0x00, 0x40, 0x84, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59D9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x23, 0x00, 0x08, 0x4C, 0x00, 0x0A, 0xB8, 0x00, 0x3F, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x34, 0x88, 0x00, 0x28, 0x88, 0x00, 0x08, 0x88, 0x00, 0x14, 0x88, 0x00, 0x14, 0xBF, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59DA, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0x24, 0x80, 0x12, 0xA5, 0x00, 0x3F, 0x66, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x22, 0x24, 0x00, 0x24, 0x66, 0x00, 0x34, 0xA5, 0x00, 0x29, 0x24, 0x80, 0x2C, 0x24, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x44, 0x80, 0x12, 0x87, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59DC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x17, 0x20, 0x00, 0x00, 0xF0, 0x00, 0x03, 0x0E, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59DD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x3F, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x88, 0x00, 0x22, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x0C, 0x00, 0x34, 0x1C, 0x00, 0x08, 0x1A, 0x00, 0x0C, 0x2A, 0x00, 0x14, 0x29, 0x00, 0x12, 0x49, 0x00, 0x22, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59DE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x18, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59DF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x12, 0x60, 0x00, 0x12, 0xC4, 0x00, 0x12, 0x6C, 0x00, 0x32, 0x18, 0x00, 0x26, 0x32, 0x00, 0x24, 0x66, 0x00, 0x7D, 0xCC, 0x00, 0x0A, 0x18, 0x00, 0x18, 0x36, 0x00, 0x30, 0x63, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59E3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x44, 0x00, 0x12, 0xC6, 0x00, 0x13, 0x83, 0x00, 0x13, 0x45, 0x80, 0x32, 0x44, 0x00, 0x26, 0x6C, 0x00, 0x24, 0x38, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59E4, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x12, 0x80, 0x00, 0x32, 0x80, 0x00, 0x26, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x7E, 0xA1, 0x00, 0x0A, 0xA1, 0x00, 0x18, 0xA1, 0x00, 0x31, 0xA1, 0x00, 0x63, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59E5, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x12, 0x00, 0x7E, 0x16, 0x00, 0x12, 0x14, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x18, 0x00, 0x32, 0x30, 0x00, 0x26, 0xE3, 0x00, 0x25, 0xAE, 0x00, 0x74, 0x38, 0x00, 0x0C, 0x20, 0x00, 0x1A, 0x20, 0x80, 0x32, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59E6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x05, 0x90, 0x00, 0x08, 0x78, 0x00, 0x03, 0x87, 0x00, 0x1C, 0x04, 0x00, 0x09, 0x0A, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x12, 0x44, 0x00, 0x2C, 0xB8, 0x00, 0x0A, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x20, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59E7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x80, 0x7F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x21, 0x04, 0x00, 0x7E, 0x04, 0x00, 0x0D, 0x84, 0x00, 0x70, 0x7F, 0x80, 0x08, 0x04, 0x00, 0x7F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x31, 0x04, 0x00, 0x23, 0x04, 0x00, 0x7E, 0x04, 0x00, 0x0D, 0x84, 0x00, 0x78, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59E8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x90, 0x00, 0x24, 0x90, 0x00, 0x25, 0xFF, 0x80, 0x39, 0x10, 0x80, 0x2C, 0x10, 0x80, 0x0A, 0x2B, 0x00, 0x12, 0x44, 0x00, 0x10, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59EA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3F, 0x42, 0x00, 0x12, 0x41, 0x00, 0x12, 0xBF, 0x00, 0x23, 0xD0, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x35, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59EB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x36, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x0B, 0x44, 0x00, 0x19, 0x44, 0x00, 0x30, 0x7F, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59EC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x34, 0x88, 0x00, 0x28, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x12, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59EE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x22, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x34, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2C, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59EF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x52, 0x00, 0x7E, 0x52, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x24, 0x00, 0x26, 0x24, 0x00, 0x24, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x0A, 0x64, 0x00, 0x18, 0x44, 0x80, 0x30, 0xC4, 0x80, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59F1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0x66, 0x00, 0x13, 0xC3, 0x80, 0x12, 0x3C, 0x00, 0x12, 0x00, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x10, 0x00, 0x24, 0x20, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x01, 0x00, 0x18, 0x01, 0x00, 0x30, 0x03, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59F2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0xA2, 0x80, 0x12, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x32, 0x62, 0x00, 0x26, 0x42, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x66, 0x00, 0x0A, 0x34, 0x00, 0x18, 0x1C, 0x00, 0x30, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59F4, { 0x00, 0x00, 0x00, 0x3F, 0xC1, 0x00, 0x04, 0x11, 0x00, 0x0F, 0x91, 0x00, 0x18, 0x91, 0x00, 0x35, 0x91, 0x00, 0x03, 0x11, 0x00, 0x06, 0x01, 0x00, 0x3C, 0x07, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x18, 0x00, 0x0F, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xBC, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59F6, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x14, 0x00, 0x10, 0x36, 0x00, 0x7E, 0x63, 0x00, 0x12, 0xC1, 0x80, 0x12, 0x00, 0x00, 0x32, 0x3E, 0x00, 0x26, 0x00, 0x00, 0x24, 0x00, 0x00, 0x74, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59F7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x12, 0x7F, 0x00, 0x12, 0xC1, 0x00, 0x13, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x24, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x18, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59F8, { 0x00, 0x00, 0x00, 0x08, 0x1B, 0x00, 0x08, 0xEC, 0x00, 0x08, 0x24, 0x00, 0x12, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x2C, 0x00, 0x22, 0x74, 0x00, 0x25, 0xAF, 0x00, 0x24, 0x24, 0x00, 0x34, 0x24, 0x00, 0x2C, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59F9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x7E, 0x02, 0x00, 0x12, 0x1C, 0x00, 0x12, 0xE0, 0x00, 0x12, 0x20, 0x00, 0x12, 0x22, 0x00, 0x23, 0xFF, 0x00, 0x14, 0x20, 0x00, 0x08, 0x20, 0x00, 0x14, 0x21, 0x00, 0x22, 0x21, 0x00, 0x42, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x59FB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x12, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x22, 0x88, 0x80, 0x24, 0x94, 0x80, 0x24, 0x94, 0x80, 0x34, 0xA2, 0x80, 0x28, 0xC1, 0x80, 0x0C, 0x80, 0x80, 0x12, 0x80, 0x80, 0x12, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x59FF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x89, 0x00, 0x01, 0x08, 0x00, 0x07, 0x14, 0x00, 0x38, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0x90, 0x00, 0x08, 0x70, 0x00, 0x03, 0x8C, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A00, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x08, 0x05, 0x80, 0x08, 0x04, 0x80, 0x08, 0x04, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x04, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x32, 0xFC, 0x80, 0x26, 0x25, 0x80, 0x24, 0x25, 0x00, 0x7E, 0x67, 0x00, 0x0A, 0x42, 0x00, 0x18, 0xC6, 0x80, 0x31, 0x8B, 0x80, 0x60, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A01, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x1F, 0xE1, 0x00, 0x11, 0x21, 0x00, 0x12, 0x12, 0x00, 0x1F, 0xF2, 0x00, 0x12, 0x94, 0x00, 0x14, 0x8C, 0x00, 0x1D, 0x08, 0x00, 0x13, 0x18, 0x00, 0x22, 0x94, 0x80, 0x24, 0x62, 0x80, 0x29, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A03, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x3F, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x34, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x12, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A04, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x0C, 0x98, 0x00, 0x02, 0xA0, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x38, 0x8F, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x18, 0x00, 0x0F, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A05, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x49, 0x00, 0x13, 0x4A, 0x00, 0x12, 0xCC, 0x00, 0x22, 0x48, 0x00, 0x14, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x48, 0x00, 0x22, 0x4A, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A06, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x2E, 0x00, 0x09, 0xF0, 0x00, 0x7E, 0x24, 0x00, 0x12, 0x29, 0x00, 0x12, 0x31, 0x00, 0x13, 0xCF, 0x00, 0x12, 0x00, 0x00, 0x23, 0xFC, 0x00, 0x14, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x48, 0x00, 0x22, 0x49, 0x00, 0x40, 0x89, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A07, { 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x50, 0x00, 0x12, 0x88, 0x00, 0x13, 0x8F, 0x00, 0x22, 0x8A, 0x00, 0x14, 0x88, 0x00, 0x08, 0x88, 0x00, 0x14, 0x88, 0x00, 0x22, 0x88, 0x00, 0x41, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A08, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x12, 0x26, 0x00, 0x22, 0x22, 0x00, 0x02, 0xA0, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x03, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A09, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x00, 0x00, 0x26, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x7C, 0x7F, 0x00, 0x0A, 0x01, 0x00, 0x1A, 0x01, 0x00, 0x30, 0x03, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A0C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x26, 0x10, 0x00, 0x24, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A0D, { 0x00, 0x00, 0x00, 0x20, 0x12, 0x00, 0x20, 0x13, 0x00, 0x20, 0x11, 0x00, 0x23, 0xFF, 0x80, 0x7A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xF1, 0x00, 0x2A, 0x59, 0x00, 0x6A, 0x4B, 0x00, 0x4A, 0x4A, 0x00, 0x5A, 0x4E, 0x00, 0x72, 0x44, 0x00, 0x12, 0x4E, 0x00, 0x3A, 0xDA, 0x80, 0x2E, 0x33, 0x80, 0x64, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A0E, { 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x78, 0x00, 0x7F, 0x40, 0x00, 0x04, 0x7F, 0x80, 0x05, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x74, 0x44, 0x00, 0x04, 0x44, 0x00, 0x05, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x18, 0x00, 0x0F, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A11, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x49, 0x00, 0x24, 0x88, 0x80, 0x15, 0x08, 0x00, 0x08, 0x19, 0x00, 0x08, 0x06, 0x00, 0x10, 0x38, 0x00, 0x11, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0x90, 0x00, 0x08, 0x70, 0x00, 0x03, 0x8E, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A12, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x81, 0x00, 0x7E, 0x91, 0x00, 0x0A, 0x91, 0x00, 0x18, 0xFF, 0x80, 0x30, 0x02, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A13, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x7E, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x12, 0x83, 0x00, 0x12, 0xBE, 0x00, 0x32, 0x88, 0x00, 0x26, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x7C, 0xFF, 0x80, 0x0B, 0x88, 0x00, 0x19, 0x08, 0x80, 0x33, 0x0C, 0x80, 0x60, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A18, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x3F, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x22, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x34, 0x49, 0x00, 0x2C, 0x4A, 0x00, 0x2A, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x42, 0x00, 0x10, 0x7D, 0x00, 0x21, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A1A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x26, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x7C, 0x11, 0x00, 0x0A, 0x31, 0x00, 0x1A, 0x23, 0x00, 0x30, 0x62, 0x00, 0x61, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A1B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x0A, 0xA2, 0x00, 0x3F, 0xA2, 0x00, 0x12, 0xBE, 0x00, 0x12, 0x80, 0x00, 0x12, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x34, 0x11, 0x00, 0x28, 0x11, 0x00, 0x2D, 0xFF, 0x80, 0x0A, 0x28, 0x00, 0x12, 0x44, 0x00, 0x10, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A1C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x54, 0x80, 0x3F, 0x54, 0x80, 0x0A, 0x54, 0x80, 0x0B, 0xFC, 0x80, 0x12, 0x54, 0x80, 0x12, 0x54, 0x80, 0x14, 0x54, 0x80, 0x25, 0xFC, 0x80, 0x38, 0x54, 0x80, 0x28, 0x54, 0x80, 0x0C, 0x54, 0x80, 0x14, 0x55, 0x80, 0x14, 0x94, 0x00, 0x21, 0x64, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A1E, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x12, 0x00, 0x7E, 0x5B, 0x00, 0x12, 0xC9, 0x80, 0x12, 0x80, 0x80, 0x12, 0x10, 0x00, 0x32, 0xFF, 0x80, 0x26, 0x22, 0x00, 0x24, 0x62, 0x00, 0x7C, 0x46, 0x00, 0x0A, 0xF4, 0x00, 0x18, 0x1E, 0x00, 0x30, 0x33, 0x00, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A1F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x12, 0x42, 0x00, 0x3F, 0x7E, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x34, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x0A, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A20, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x3F, 0xC0, 0x00, 0x09, 0x7F, 0x80, 0x09, 0x40, 0x00, 0x11, 0x40, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x54, 0x00, 0x32, 0x55, 0x80, 0x2C, 0x56, 0x00, 0x24, 0x54, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x9E, 0x00, 0x10, 0xF1, 0x00, 0x21, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A23, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x7E, 0x11, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x90, 0x00, 0x12, 0x90, 0x00, 0x32, 0xFF, 0x80, 0x26, 0x30, 0x80, 0x24, 0x30, 0x80, 0x7C, 0x51, 0x80, 0x0A, 0x51, 0x00, 0x18, 0x97, 0x00, 0x31, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A24, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x32, 0x08, 0x00, 0x62, 0x7F, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x0F, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A25, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x3A, 0x00, 0x08, 0xE9, 0x00, 0x0A, 0x28, 0x00, 0x3F, 0x28, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x28, 0x00, 0x12, 0x28, 0x80, 0x24, 0x28, 0x80, 0x24, 0x39, 0x00, 0x34, 0x65, 0x00, 0x29, 0xA6, 0x00, 0x0C, 0x22, 0x00, 0x12, 0x26, 0x80, 0x12, 0x29, 0x80, 0x20, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A27, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x7F, 0x81, 0x80, 0x12, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x32, 0x81, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x18, 0x64, 0x80, 0x30, 0x44, 0x80, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A28, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x10, 0x00, 0x24, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A29, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x44, 0x00, 0x3F, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x24, 0x91, 0x00, 0x34, 0xFF, 0x00, 0x2C, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x12, 0x48, 0x80, 0x10, 0x88, 0x80, 0x23, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A2A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x7C, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x18, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A2D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x90, 0x00, 0x26, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x7C, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x18, 0x66, 0x00, 0x30, 0xC3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A2F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x5E, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x7E, 0x52, 0x00, 0x12, 0x5E, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x00, 0x36, 0x7F, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x7C, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x1A, 0x22, 0x00, 0x30, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A30, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x50, 0x80, 0x7E, 0xD0, 0x80, 0x12, 0x94, 0x80, 0x12, 0x96, 0x80, 0x33, 0x92, 0x80, 0x23, 0x90, 0x80, 0x26, 0x90, 0x80, 0x24, 0x90, 0x80, 0x7C, 0x91, 0x80, 0x0A, 0x99, 0x00, 0x18, 0xF3, 0x00, 0x30, 0x86, 0x80, 0x60, 0x8C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A31, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7E, 0xFC, 0x00, 0x12, 0x84, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFC, 0x00, 0x12, 0x20, 0x00, 0x22, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x41, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A32, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x15, 0x11, 0x00, 0x09, 0x29, 0x00, 0x15, 0x45, 0x00, 0x23, 0x01, 0x00, 0x41, 0x05, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A34, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x5F, 0x00, 0x08, 0x42, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xBA, 0x00, 0x22, 0xB6, 0x00, 0x14, 0xD6, 0x00, 0x08, 0x92, 0x00, 0x14, 0x92, 0x00, 0x22, 0x82, 0x00, 0x42, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A35, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x7D, 0x3F, 0x80, 0x15, 0xE8, 0x80, 0x15, 0x28, 0x80, 0x35, 0x2D, 0x80, 0x25, 0x25, 0x00, 0x2D, 0xE5, 0x00, 0x29, 0x27, 0x00, 0x79, 0x22, 0x00, 0x15, 0x27, 0x00, 0x15, 0xE5, 0x00, 0x33, 0x2D, 0x80, 0x60, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x36, 0x00, 0x17, 0xC1, 0x80, 0x39, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0x10, 0x00, 0x08, 0xE0, 0x00, 0x03, 0x9C, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A3C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x34, 0x80, 0x80, 0x28, 0x80, 0x80, 0x0C, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x12, 0x80, 0x80, 0x12, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A40, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xDF, 0x80, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x7D, 0x5D, 0x00, 0x15, 0x95, 0x00, 0x15, 0x95, 0x00, 0x35, 0x55, 0x00, 0x25, 0x55, 0x00, 0x2D, 0x55, 0x00, 0x29, 0x5D, 0x00, 0x79, 0x41, 0x00, 0x15, 0xC1, 0x00, 0x15, 0x01, 0x00, 0x31, 0x01, 0x00, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A41, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0x10, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A44, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x12, 0x66, 0x00, 0x12, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x26, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x0A, 0x81, 0x00, 0x18, 0x81, 0x00, 0x30, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A45, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x7E, 0x40, 0x80, 0x12, 0x90, 0x80, 0x12, 0x92, 0x80, 0x12, 0x54, 0x80, 0x32, 0xFE, 0x80, 0x26, 0x30, 0x80, 0x24, 0x7C, 0x80, 0x7E, 0x56, 0x80, 0x0A, 0xD2, 0x80, 0x19, 0x91, 0x80, 0x30, 0x11, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A46, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x89, 0x00, 0x20, 0x88, 0x00, 0x14, 0xFF, 0x00, 0x08, 0xC2, 0x00, 0x08, 0xA4, 0x00, 0x10, 0x98, 0x00, 0x21, 0x16, 0x00, 0x01, 0x61, 0x80, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0x10, 0x00, 0x08, 0xE0, 0x00, 0x03, 0x9C, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A47, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x11, 0x00, 0x7E, 0x59, 0x80, 0x12, 0xC8, 0x80, 0x12, 0x80, 0x00, 0x12, 0x08, 0x00, 0x32, 0x08, 0x00, 0x26, 0xFF, 0x80, 0x24, 0x2A, 0x00, 0x7E, 0x2A, 0x00, 0x0A, 0x6B, 0x00, 0x18, 0x49, 0x00, 0x30, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A48, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0xC4, 0x00, 0x13, 0xA7, 0x80, 0x32, 0x20, 0x00, 0x26, 0x7E, 0x00, 0x24, 0xC2, 0x00, 0x3D, 0x86, 0x00, 0x0A, 0x6C, 0x00, 0x18, 0x38, 0x00, 0x30, 0x6E, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A49, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3F, 0x00, 0x80, 0x15, 0x40, 0x80, 0x14, 0x40, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x99, 0x00, 0x25, 0x99, 0x00, 0x2A, 0x69, 0x00, 0x38, 0x2B, 0x00, 0x2C, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x12, 0x88, 0x80, 0x11, 0x0F, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A4A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x20, 0x00, 0x14, 0x52, 0x00, 0x08, 0xD4, 0x00, 0x15, 0x48, 0x00, 0x22, 0x44, 0x00, 0x40, 0x63, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A4C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x74, 0x80, 0x08, 0x44, 0x80, 0x7E, 0x44, 0x80, 0x12, 0x45, 0x80, 0x13, 0xF5, 0x00, 0x12, 0x45, 0x00, 0x32, 0x47, 0x00, 0x26, 0xE2, 0x00, 0x25, 0xF2, 0x00, 0x7D, 0x57, 0x00, 0x09, 0x55, 0x00, 0x18, 0x45, 0x00, 0x30, 0x4D, 0x80, 0x60, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A50, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x7C, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x18, 0x91, 0x00, 0x31, 0x10, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A55, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFE, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x32, 0xFE, 0x00, 0x26, 0x10, 0x00, 0x24, 0x90, 0x00, 0x7C, 0x9E, 0x00, 0x0A, 0x90, 0x00, 0x18, 0xD0, 0x00, 0x31, 0x70, 0x00, 0x63, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A5A, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x88, 0x00, 0x12, 0x84, 0x00, 0x12, 0xF2, 0x80, 0x23, 0x81, 0x80, 0x24, 0x00, 0x00, 0x34, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x0C, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A5E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x12, 0x66, 0x00, 0x32, 0x24, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A62, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3F, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x22, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x34, 0x44, 0x00, 0x2D, 0xFF, 0x80, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x10, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A63, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x7E, 0xF7, 0x80, 0x12, 0x80, 0x80, 0x12, 0x80, 0x80, 0x12, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x26, 0x80, 0x80, 0x24, 0xF7, 0x80, 0x7C, 0x94, 0x80, 0x0A, 0x94, 0x80, 0x19, 0x94, 0x80, 0x31, 0x14, 0x80, 0x63, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A65, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x26, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A66, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x80, 0x3F, 0x02, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x14, 0x88, 0x80, 0x24, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x38, 0x49, 0x00, 0x2C, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x11, 0x49, 0x00, 0x10, 0x4B, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A67, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x49, 0x00, 0x24, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A6A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x17, 0x2A, 0x00, 0x35, 0xEB, 0x00, 0x64, 0x49, 0x80, 0x04, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0x3C, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A6C, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x08, 0x02, 0x00, 0x7E, 0x53, 0x00, 0x12, 0xD9, 0x00, 0x12, 0x88, 0x00, 0x12, 0x03, 0x00, 0x32, 0x7E, 0x00, 0x26, 0x08, 0x00, 0x24, 0x08, 0x00, 0x7C, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A6D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x12, 0xE7, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x32, 0x81, 0x00, 0x26, 0xE7, 0x00, 0x24, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x18, 0x24, 0x00, 0x30, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A74, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x7E, 0x00, 0x11, 0x44, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x0A, 0x28, 0x00, 0x31, 0x44, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x02, 0x30, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A75, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x22, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x22, 0x10, 0x00, 0x42, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A76, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x7E, 0x10, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x92, 0x00, 0x14, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x92, 0x00, 0x22, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A77, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x32, 0xFF, 0x80, 0x26, 0x80, 0x80, 0x24, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A7A, { 0x00, 0x00, 0x00, 0x3F, 0xA0, 0x00, 0x09, 0x3F, 0x80, 0x06, 0x20, 0x80, 0x7F, 0xD1, 0x00, 0x0A, 0x8A, 0x00, 0x12, 0x04, 0x00, 0x22, 0x0A, 0x00, 0x06, 0x71, 0x80, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x0C, 0x00, 0x04, 0x18, 0x00, 0x0F, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xBC, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A7B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0xA2, 0x80, 0x12, 0xB6, 0x80, 0x32, 0x94, 0x80, 0x26, 0xBE, 0x80, 0x24, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x0A, 0x88, 0x80, 0x18, 0x88, 0x80, 0x30, 0x88, 0x80, 0x60, 0x8B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A7E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x7F, 0xBB, 0x80, 0x12, 0x00, 0x00, 0x12, 0xF2, 0x80, 0x12, 0x92, 0x80, 0x32, 0x92, 0x80, 0x26, 0xD5, 0x00, 0x24, 0xB5, 0x00, 0x7E, 0x95, 0x00, 0x0A, 0xD5, 0x00, 0x18, 0xB2, 0x80, 0x30, 0x92, 0x80, 0x60, 0xB2, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A7F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x80, 0x08, 0x4F, 0x00, 0x7E, 0x48, 0x00, 0x12, 0x68, 0x00, 0x12, 0xDF, 0x80, 0x12, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x0B, 0x7F, 0x00, 0x19, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A8B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x32, 0x81, 0x00, 0x27, 0x7E, 0x80, 0x24, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x0A, 0x7E, 0x00, 0x18, 0x42, 0x00, 0x30, 0x42, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xBF, 0x00, 0x44, 0x21, 0x00, 0x57, 0x21, 0x00, 0x51, 0x3F, 0x00, 0x57, 0x20, 0x80, 0x44, 0x20, 0x80, 0x7F, 0x9F, 0x80, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x18, 0x00, 0x1F, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A92, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x24, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x2C, 0x0C, 0x00, 0x0A, 0x1A, 0x00, 0x12, 0x2A, 0x00, 0x10, 0x49, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A93, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0x7E, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A96, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x7E, 0x52, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x32, 0x91, 0x00, 0x26, 0x91, 0x00, 0x25, 0xFF, 0x80, 0x7C, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x18, 0x66, 0x00, 0x30, 0xC3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A99, { 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x10, 0x04, 0x80, 0x10, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x04, 0x00, 0x15, 0x74, 0x00, 0x15, 0x04, 0x80, 0x35, 0x24, 0x80, 0x25, 0xFD, 0x80, 0x2D, 0x55, 0x00, 0x29, 0x57, 0x00, 0x79, 0x72, 0x00, 0x15, 0x2A, 0x80, 0x15, 0x46, 0x80, 0x31, 0x0B, 0x80, 0x62, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A9A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x22, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x34, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x0C, 0xBF, 0x00, 0x0A, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x11, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5A9B, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x79, 0x00, 0x08, 0x48, 0x80, 0x12, 0x84, 0x00, 0x3F, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x34, 0x3F, 0x00, 0x28, 0x42, 0x00, 0x0C, 0x64, 0x00, 0x14, 0x98, 0x00, 0x11, 0x36, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A9C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x26, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x0A, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x24, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A9E, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x26, 0x08, 0x00, 0x24, 0x88, 0x00, 0x7E, 0x8F, 0x00, 0x0A, 0x88, 0x00, 0x18, 0xC8, 0x00, 0x31, 0x78, 0x00, 0x61, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5A9F, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x12, 0x9E, 0x00, 0x12, 0x80, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x7E, 0x54, 0x00, 0x0A, 0xD6, 0x00, 0x18, 0x93, 0x00, 0x31, 0x91, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AA0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x7C, 0xFF, 0x00, 0x15, 0x88, 0x00, 0x14, 0x7F, 0x80, 0x34, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x78, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x30, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AA2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x7E, 0x80, 0x80, 0x12, 0xBE, 0x80, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AA4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x34, 0x08, 0x00, 0x2C, 0x05, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0xA2, 0x80, 0x12, 0xA2, 0x80, 0x11, 0x3E, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AA7, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x12, 0x80, 0x80, 0x32, 0xBE, 0x80, 0x26, 0xA2, 0x80, 0x24, 0xA2, 0x80, 0x7E, 0xA2, 0x80, 0x0A, 0xBE, 0x80, 0x18, 0x80, 0x80, 0x30, 0x80, 0x80, 0x60, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AAA, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x7D, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x2A, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x47, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AAC, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x5F, 0x00, 0x08, 0x51, 0x00, 0x08, 0xD1, 0x00, 0x7E, 0x91, 0x00, 0x12, 0x9F, 0x00, 0x13, 0x84, 0x00, 0x13, 0x84, 0x00, 0x33, 0xBF, 0x80, 0x26, 0x84, 0x00, 0x24, 0x8E, 0x00, 0x7E, 0x8E, 0x00, 0x0A, 0x95, 0x00, 0x18, 0x95, 0x00, 0x30, 0xA4, 0x80, 0x60, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AB1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x62, 0x00, 0x09, 0xD6, 0x00, 0x7E, 0x2C, 0x00, 0x12, 0x18, 0x00, 0x12, 0x70, 0x00, 0x13, 0xC0, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x90, 0x00, 0x24, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x18, 0x91, 0x00, 0x30, 0x91, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AB2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0xA5, 0x00, 0x12, 0x99, 0x00, 0x12, 0xA5, 0x00, 0x12, 0x81, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x88, 0x00, 0x24, 0x88, 0x00, 0x7E, 0xEB, 0x00, 0x0A, 0x8E, 0x00, 0x18, 0x88, 0x80, 0x30, 0xE8, 0x80, 0x61, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AB3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x32, 0x81, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x7E, 0x18, 0x00, 0x0A, 0x29, 0x00, 0x18, 0xA1, 0x80, 0x30, 0xA2, 0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AB5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x48, 0x00, 0x34, 0x48, 0x00, 0x2F, 0xFF, 0x80, 0x24, 0x86, 0x00, 0x25, 0x83, 0x00, 0x37, 0x21, 0x80, 0x2D, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x24, 0x4C, 0x00, 0x24, 0xF8, 0x00, 0x64, 0x2C, 0x00, 0x4D, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AB8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x91, 0x00, 0x24, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x18, 0x11, 0x00, 0x30, 0x1F, 0x00, 0x61, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ABA, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xAF, 0x80, 0x7F, 0xE9, 0x00, 0x14, 0x19, 0x00, 0x14, 0x01, 0x00, 0x17, 0xF5, 0x00, 0x35, 0x45, 0x00, 0x25, 0x47, 0x00, 0x2D, 0x42, 0x00, 0x79, 0x42, 0x00, 0x15, 0x57, 0x00, 0x31, 0x65, 0x00, 0x23, 0x4D, 0x80, 0x62, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ABB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x15, 0x23, 0x80, 0x7F, 0xC0, 0x00, 0x11, 0x3F, 0x00, 0x15, 0x11, 0x00, 0x15, 0x12, 0x00, 0x11, 0x0C, 0x00, 0x23, 0x33, 0x80, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0x90, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ABC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x5D, 0x00, 0x12, 0x55, 0x00, 0x12, 0x63, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x24, 0x55, 0x00, 0x7C, 0x55, 0x00, 0x0A, 0x55, 0x00, 0x1A, 0x55, 0x00, 0x30, 0x55, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ABD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x48, 0x00, 0x26, 0x48, 0x00, 0x24, 0x7F, 0x80, 0x7E, 0x00, 0x80, 0x0A, 0xAA, 0x80, 0x18, 0xAA, 0x80, 0x31, 0x01, 0x80, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ABE, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0xFF, 0x00, 0x12, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x81, 0x00, 0x30, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ABF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x28, 0x00, 0x24, 0x2A, 0x00, 0x7E, 0x2A, 0x80, 0x0A, 0x6F, 0x80, 0x18, 0x48, 0x00, 0x30, 0xC8, 0x80, 0x60, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AC1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x80, 0x80, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x28, 0x00, 0x12, 0x55, 0x00, 0x24, 0x9E, 0x00, 0x25, 0x2C, 0x00, 0x34, 0x4C, 0x00, 0x28, 0x9A, 0x00, 0x08, 0x2A, 0x00, 0x14, 0x49, 0x00, 0x12, 0x89, 0x00, 0x20, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AC2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x0A, 0x6B, 0x00, 0x3F, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x00, 0x34, 0x42, 0x00, 0x2C, 0x24, 0x00, 0x0A, 0x18, 0x00, 0x12, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AC4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0A, 0x88, 0x00, 0x3F, 0xBF, 0x00, 0x12, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x12, 0xA1, 0x00, 0x24, 0xBF, 0x00, 0x24, 0x88, 0x00, 0x34, 0x88, 0x00, 0x28, 0xA9, 0x00, 0x0C, 0xC9, 0x00, 0x14, 0x88, 0x80, 0x15, 0x08, 0x80, 0x21, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AC6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0xA2, 0x80, 0x12, 0x63, 0x00, 0x12, 0xC9, 0x80, 0x12, 0x1C, 0x00, 0x32, 0x36, 0x00, 0x26, 0x63, 0x00, 0x24, 0xC1, 0x80, 0x7C, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x18, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AC8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x21, 0x01, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0F, 0x90, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AC9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7F, 0x80, 0x3F, 0x48, 0x00, 0x12, 0x48, 0x00, 0x13, 0x5F, 0x00, 0x12, 0xD4, 0x00, 0x12, 0x64, 0x00, 0x14, 0x44, 0x00, 0x34, 0xFF, 0x80, 0x2D, 0x44, 0x00, 0x24, 0x4A, 0x00, 0x0A, 0x4A, 0x00, 0x0A, 0x91, 0x00, 0x12, 0xA1, 0x00, 0x21, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ACB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x20, 0x80, 0x10, 0x20, 0x80, 0x7D, 0xEF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x35, 0xEF, 0x80, 0x24, 0x61, 0x80, 0x2C, 0xA2, 0x80, 0x29, 0x24, 0x80, 0x78, 0x61, 0x80, 0x14, 0xA2, 0x80, 0x15, 0x24, 0x80, 0x30, 0x61, 0x80, 0x61, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ACC, { 0x00, 0x00, 0x00, 0x08, 0x3B, 0x00, 0x08, 0xEE, 0x00, 0x08, 0x28, 0x00, 0x10, 0x28, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x28, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x2A, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x2A, 0x00, 0x34, 0xFE, 0x00, 0x2C, 0x6C, 0x00, 0x0A, 0x6A, 0x00, 0x12, 0xAA, 0x00, 0x11, 0x29, 0x00, 0x22, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ACF, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x87, 0x80, 0x11, 0xF4, 0x80, 0x11, 0x15, 0x80, 0x7D, 0x15, 0x00, 0x15, 0xF7, 0x00, 0x15, 0x16, 0x00, 0x15, 0x15, 0x00, 0x35, 0xF4, 0x80, 0x25, 0x04, 0x80, 0x2D, 0x54, 0x80, 0x79, 0x54, 0x80, 0x09, 0xE6, 0x80, 0x1B, 0x25, 0x80, 0x36, 0x14, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AD0, { 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x23, 0xE4, 0x00, 0x22, 0xA4, 0x00, 0x22, 0xA4, 0x00, 0x7B, 0xFF, 0x80, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2B, 0xE5, 0x00, 0x28, 0x85, 0x00, 0x6B, 0xED, 0x00, 0x48, 0xA9, 0x00, 0x78, 0xAF, 0x00, 0x14, 0xA2, 0x00, 0x35, 0xA7, 0x00, 0x21, 0x25, 0x80, 0x63, 0x6C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AD2, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x92, 0x00, 0x10, 0x54, 0x00, 0x7D, 0xFF, 0x00, 0x25, 0x21, 0x00, 0x26, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x44, 0x40, 0x00, 0x28, 0xFE, 0x00, 0x11, 0x44, 0x00, 0x12, 0x28, 0x00, 0x28, 0x10, 0x00, 0x44, 0x6C, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AD4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x7E, 0x0E, 0x00, 0x12, 0x70, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x44, 0x00, 0x22, 0x44, 0x00, 0x14, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x22, 0x44, 0x00, 0x42, 0x83, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AD6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x55, 0x00, 0x12, 0x55, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x7C, 0x08, 0x00, 0x0A, 0x2A, 0x00, 0x1A, 0x6B, 0x00, 0x30, 0xC9, 0x80, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AD7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x7E, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0x9F, 0x00, 0x12, 0x80, 0x00, 0x32, 0xBB, 0x80, 0x26, 0xAA, 0x80, 0x24, 0xAA, 0x80, 0x7C, 0xAA, 0x80, 0x0A, 0xBB, 0x80, 0x1A, 0x80, 0x00, 0x30, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AD8, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x12, 0x42, 0x00, 0x12, 0xFC, 0x00, 0x22, 0x10, 0x00, 0x14, 0x24, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x54, 0x00, 0x22, 0x93, 0x00, 0x43, 0x11, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ADA, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x5D, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x5D, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x32, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x7C, 0x63, 0x00, 0x0A, 0x36, 0x00, 0x18, 0x1C, 0x00, 0x30, 0x36, 0x00, 0x61, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ADC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AE0, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xD4, 0x00, 0x0E, 0x08, 0x00, 0x15, 0x14, 0x00, 0x24, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x24, 0x08, 0x00, 0x2F, 0x90, 0x00, 0x60, 0xF8, 0x00, 0x4F, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AE1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x12, 0x22, 0x00, 0x12, 0x14, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x34, 0x88, 0x80, 0x28, 0xBE, 0x80, 0x0C, 0xA2, 0x80, 0x12, 0xBE, 0x80, 0x12, 0x80, 0x80, 0x20, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AE3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x4F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x40, 0x00, 0x26, 0x7F, 0x80, 0x24, 0x40, 0x00, 0x7C, 0x7F, 0x80, 0x0A, 0x00, 0x80, 0x1A, 0xAA, 0x80, 0x30, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AE5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x11, 0x00, 0x26, 0xFF, 0x80, 0x24, 0x02, 0x80, 0x7E, 0xFF, 0x80, 0x0A, 0x02, 0x00, 0x18, 0x22, 0x00, 0x30, 0x12, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AE6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x80, 0x80, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x34, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x0C, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x20, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AE9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x13, 0xF9, 0x00, 0x13, 0x59, 0x00, 0x25, 0x59, 0x00, 0x25, 0x5A, 0x00, 0x35, 0xFE, 0x00, 0x2C, 0x4A, 0x00, 0x04, 0xE2, 0x00, 0x0A, 0xD5, 0x00, 0x09, 0x4C, 0x80, 0x11, 0x48, 0x80, 0x22, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AEA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x63, 0x00, 0x08, 0xA5, 0x00, 0x7E, 0x63, 0x00, 0x12, 0xA5, 0x00, 0x12, 0x11, 0x00, 0x12, 0x38, 0x00, 0x32, 0xEE, 0x00, 0x27, 0x83, 0x80, 0x24, 0x10, 0x00, 0x7C, 0xE4, 0x00, 0x0A, 0x19, 0x00, 0x18, 0xE2, 0x00, 0x30, 0x0C, 0x00, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AEB, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x22, 0x28, 0x00, 0x42, 0x47, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AEE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x12, 0xAA, 0x80, 0x12, 0x88, 0x80, 0x12, 0x2A, 0x00, 0x32, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x24, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x18, 0x3F, 0x00, 0x30, 0x01, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AF1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x92, 0x00, 0x12, 0x54, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x14, 0xBA, 0x00, 0x08, 0xAA, 0x00, 0x14, 0xBA, 0x00, 0x22, 0x82, 0x00, 0x42, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AF5, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0xD5, 0x00, 0x7E, 0x55, 0x00, 0x12, 0x55, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x55, 0x00, 0x32, 0x55, 0x00, 0x26, 0x55, 0x00, 0x25, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x18, 0x55, 0x00, 0x30, 0xD5, 0x80, 0x60, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AF6, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC8, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x32, 0xFF, 0x00, 0x26, 0x88, 0x00, 0x24, 0x88, 0x00, 0x7C, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x18, 0xA9, 0x00, 0x31, 0xAD, 0x80, 0x61, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5AFA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7D, 0x29, 0x00, 0x15, 0xEF, 0x00, 0x15, 0x01, 0x00, 0x35, 0x7D, 0x00, 0x25, 0x45, 0x00, 0x2D, 0x7D, 0x00, 0x29, 0x45, 0x00, 0x79, 0x7D, 0x00, 0x15, 0x45, 0x00, 0x15, 0x45, 0x00, 0x31, 0x4D, 0x00, 0x61, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AFB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7D, 0x29, 0x00, 0x15, 0xEF, 0x00, 0x15, 0x01, 0x00, 0x35, 0x11, 0x00, 0x25, 0x7D, 0x00, 0x2D, 0x11, 0x00, 0x29, 0x39, 0x00, 0x79, 0x39, 0x00, 0x15, 0x55, 0x00, 0x15, 0x11, 0x00, 0x31, 0x11, 0x00, 0x61, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5AFD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0xA5, 0x00, 0x12, 0x42, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x26, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x7C, 0x10, 0x00, 0x0A, 0x92, 0x00, 0x18, 0x93, 0x00, 0x31, 0x91, 0x80, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B00, { 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x10, 0xF8, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x12, 0x00, 0x7D, 0xFE, 0x00, 0x15, 0x02, 0x00, 0x15, 0x02, 0x00, 0x35, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x2D, 0x01, 0x00, 0x29, 0xFF, 0x80, 0x7D, 0x00, 0x80, 0x15, 0x0A, 0x80, 0x12, 0xAA, 0x80, 0x31, 0xA1, 0x80, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B01, { 0x00, 0x00, 0x00, 0x08, 0x72, 0x00, 0x08, 0x14, 0x00, 0x08, 0xB8, 0x80, 0x08, 0x6D, 0x00, 0x7E, 0xC6, 0x00, 0x13, 0xBB, 0x00, 0x13, 0x01, 0x80, 0x32, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x26, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x7E, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x18, 0x6C, 0x00, 0x30, 0x28, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B05, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x3E, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x35, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B08, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x12, 0x42, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x42, 0x00, 0x32, 0x72, 0x00, 0x27, 0xCF, 0x80, 0x24, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x0A, 0x44, 0x00, 0x18, 0x44, 0x80, 0x30, 0xC4, 0x80, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B09, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x24, 0x14, 0x00, 0x34, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x0C, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B0B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x77, 0x00, 0x08, 0x55, 0x00, 0x0A, 0x55, 0x00, 0x3F, 0x77, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x49, 0x00, 0x34, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B0C, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x12, 0x7E, 0x00, 0x13, 0xA5, 0x80, 0x14, 0x3C, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x38, 0x81, 0x00, 0x28, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x14, 0xBD, 0x00, 0x14, 0x81, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B16, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xBF, 0x80, 0x18, 0x84, 0x00, 0x18, 0xBF, 0x00, 0x2F, 0x84, 0x00, 0x08, 0x44, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x05, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B17, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x12, 0xBD, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xBD, 0x00, 0x32, 0x81, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x0A, 0x42, 0x00, 0x18, 0x7E, 0x00, 0x30, 0x42, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B19, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x13, 0x55, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x7E, 0xBD, 0x00, 0x0A, 0xA5, 0x00, 0x18, 0xBD, 0x00, 0x30, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B1B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x7E, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x7E, 0x14, 0x80, 0x0A, 0x35, 0x00, 0x18, 0xE6, 0x00, 0x30, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B1D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC1, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x40, 0x00, 0x26, 0x7F, 0x80, 0x24, 0x10, 0x80, 0x7E, 0xFE, 0x80, 0x0A, 0x34, 0x80, 0x18, 0x68, 0x80, 0x30, 0xA4, 0x80, 0x60, 0x32, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B21, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x91, 0x00, 0x08, 0x4A, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0xD5, 0x00, 0x12, 0x52, 0x80, 0x32, 0x9E, 0x00, 0x26, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x7E, 0xC1, 0x00, 0x0A, 0x26, 0x00, 0x18, 0x1C, 0x00, 0x30, 0x77, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B22, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x7D, 0x81, 0x80, 0x14, 0x24, 0x00, 0x14, 0xFF, 0x00, 0x34, 0x24, 0x00, 0x24, 0xFF, 0x00, 0x2C, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x78, 0x24, 0x00, 0x14, 0x65, 0x00, 0x15, 0xC2, 0x00, 0x30, 0x73, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B25, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x52, 0x80, 0x08, 0xB5, 0x80, 0x7E, 0x52, 0x80, 0x12, 0x94, 0x80, 0x12, 0x22, 0x00, 0x12, 0x44, 0x00, 0x32, 0xFF, 0x80, 0x27, 0x88, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x0A, 0xFF, 0x00, 0x18, 0x88, 0x00, 0x30, 0x88, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B2A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x80, 0x80, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x4B, 0x00, 0x24, 0x8C, 0x00, 0x25, 0x38, 0x00, 0x34, 0xFF, 0x00, 0x2C, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B2C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x12, 0xEE, 0x80, 0x12, 0x88, 0x80, 0x12, 0x6E, 0x00, 0x36, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x7C, 0xFF, 0x80, 0x0A, 0xA4, 0x80, 0x1A, 0xA4, 0x80, 0x30, 0xA4, 0x80, 0x60, 0xA5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B2D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0xDD, 0x80, 0x12, 0xAA, 0x80, 0x32, 0xDD, 0x80, 0x26, 0x88, 0x80, 0x24, 0x88, 0x80, 0x7E, 0xDD, 0x80, 0x0A, 0xAA, 0x80, 0x18, 0xDD, 0x80, 0x30, 0x88, 0x80, 0x60, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B30, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x21, 0x21, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x30, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B32, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x8F, 0x80, 0x54, 0x8A, 0x80, 0x54, 0x8A, 0x80, 0x7F, 0xFF, 0x80, 0x54, 0xAA, 0x80, 0x54, 0xAA, 0x80, 0x7D, 0xAF, 0x80, 0x11, 0x22, 0x00, 0x7D, 0x6F, 0x80, 0x15, 0x42, 0x80, 0x15, 0xC2, 0x80, 0x34, 0x46, 0x80, 0x24, 0xE4, 0x80, 0x24, 0xA4, 0x80, 0x6D, 0x8D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B34, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3C, 0xAF, 0x00, 0x27, 0xF9, 0x00, 0x3D, 0x2D, 0x00, 0x25, 0x2B, 0x00, 0x3C, 0xA9, 0x00, 0x24, 0xC9, 0x00, 0x4D, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B36, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x35, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x2D, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x84, 0x00, 0x63, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B37, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x20, 0x12, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x44, 0x00, 0x7A, 0x44, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xEE, 0x00, 0x2B, 0x55, 0x00, 0x4A, 0x20, 0x00, 0x2A, 0x48, 0x00, 0x12, 0x90, 0x00, 0x12, 0x24, 0x00, 0x2A, 0x42, 0x00, 0x44, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B38, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x1E, 0x80, 0x7E, 0xF2, 0x00, 0x12, 0x54, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x38, 0x00, 0x32, 0x54, 0x00, 0x27, 0x93, 0x80, 0x24, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x30, 0x91, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B3E, { 0x00, 0x00, 0x00, 0x20, 0x8F, 0x80, 0x20, 0x82, 0x80, 0x23, 0xE6, 0x80, 0x20, 0x8D, 0x80, 0x7B, 0xE0, 0x00, 0x2A, 0xAF, 0x80, 0x2A, 0xA8, 0x80, 0x2A, 0xAF, 0x80, 0x2B, 0xE8, 0x80, 0x68, 0x8F, 0x80, 0x49, 0xC8, 0x80, 0x79, 0xC8, 0x80, 0x12, 0xAF, 0x80, 0x3A, 0xA2, 0x00, 0x28, 0x8B, 0x00, 0x60, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B40, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x3F, 0x88, 0x80, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x00, 0x00, 0x24, 0x47, 0x80, 0x25, 0xF4, 0x80, 0x34, 0x47, 0x80, 0x28, 0xE4, 0x80, 0x09, 0x57, 0x80, 0x16, 0x44, 0x80, 0x14, 0x47, 0x80, 0x20, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B41, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B43, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x12, 0xE7, 0x00, 0x3F, 0xA5, 0x00, 0x12, 0xE7, 0x00, 0x12, 0x24, 0x00, 0x12, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x24, 0xFF, 0x00, 0x34, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x69, 0x00, 0x14, 0xC6, 0x00, 0x17, 0x7A, 0x00, 0x21, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B45, { 0x00, 0x00, 0x00, 0x11, 0x14, 0x00, 0x11, 0x15, 0x00, 0x12, 0xAD, 0x80, 0x12, 0xAC, 0x80, 0x7C, 0x04, 0x00, 0x17, 0xFF, 0x80, 0x14, 0xA4, 0x00, 0x35, 0xB5, 0x00, 0x24, 0xA5, 0x00, 0x2D, 0xB5, 0x00, 0x28, 0xA7, 0x00, 0x7D, 0xB2, 0x00, 0x14, 0xA6, 0x00, 0x10, 0xF6, 0x80, 0x33, 0x8B, 0x80, 0x60, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B4B, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x11, 0x2A, 0x80, 0x7D, 0x6A, 0x80, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x24, 0x00, 0x35, 0xFF, 0x80, 0x25, 0x24, 0x80, 0x2D, 0xFF, 0x80, 0x79, 0x44, 0x00, 0x15, 0x77, 0x00, 0x35, 0x44, 0x00, 0x63, 0x74, 0x80, 0x42, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B4C, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x68, 0x0D, 0x00, 0x11, 0xE2, 0x00, 0x24, 0x04, 0x80, 0x7D, 0xEF, 0x80, 0x10, 0x02, 0x00, 0x55, 0xEA, 0x80, 0x55, 0x2A, 0x80, 0x11, 0xE2, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0x90, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x41, 0x80, 0x00, 0x46, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x08, 0xC0, 0x00, 0x04, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x98, 0x00, 0x00, 0x86, 0x00, 0x00, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B54, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xD0, 0x00, 0x00, 0x90, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x70, 0x00, 0x07, 0x90, 0x00, 0x3A, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x02, 0x3F, 0x80, 0x04, 0x00, 0x80, 0x0B, 0xF8, 0x80, 0x10, 0x11, 0x00, 0x20, 0x26, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x03, 0x03, 0x00, 0x06, 0x06, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x05, 0x84, 0x00, 0x07, 0x7F, 0x80, 0x1C, 0x04, 0x00, 0x74, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B57, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B58, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x02, 0x02, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x08, 0x00, 0x17, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B59, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0x58, 0x00, 0x06, 0x54, 0x00, 0x1C, 0x92, 0x00, 0x64, 0x93, 0x00, 0x05, 0x11, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x14, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B5A, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x82, 0x00, 0x08, 0x41, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B5B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B5C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x01, 0x20, 0x00, 0x02, 0x3F, 0x80, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0xA2, 0x00, 0x05, 0xA4, 0x00, 0x0E, 0x14, 0x00, 0x34, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x14, 0x00, 0x04, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x0D, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B5D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x41, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x02, 0x0C, 0x00, 0x0C, 0x30, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x63, 0x00, 0x12, 0x21, 0x80, 0x12, 0x04, 0x80, 0x33, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B62, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x44, 0x00, 0x02, 0xFE, 0x00, 0x05, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xF4, 0x00, 0x0F, 0x14, 0x00, 0x19, 0x14, 0x00, 0x69, 0xF4, 0x00, 0x09, 0x04, 0x00, 0x09, 0x14, 0x00, 0x09, 0x09, 0x00, 0x09, 0x01, 0x00, 0x28, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B63, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B64, { 0x00, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x02, 0xF4, 0x00, 0x04, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0xA4, 0x00, 0x0C, 0xA4, 0x00, 0x18, 0xA4, 0x00, 0x28, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x26, 0x00, 0x09, 0x3D, 0x00, 0x0A, 0xC5, 0x00, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B65, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0xA1, 0x00, 0x19, 0xB3, 0x00, 0x11, 0x16, 0x00, 0x3F, 0x0C, 0x00, 0x05, 0xB6, 0x00, 0x18, 0x03, 0x80, 0x67, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B66, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x19, 0x86, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x3E, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x07, 0x7F, 0x00, 0x3C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B69, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0x44, 0x00, 0x0C, 0x84, 0x00, 0x18, 0x49, 0x00, 0x28, 0x31, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC4, 0x00, 0x0B, 0x0A, 0x00, 0x08, 0x11, 0x00, 0x08, 0x60, 0x80, 0x1B, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B6A, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x12, 0x26, 0x00, 0x22, 0x22, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0F, 0x00, 0x02, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x08, 0x24, 0x00, 0x08, 0xC8, 0x00, 0x0A, 0x51, 0x00, 0x0C, 0x2F, 0x00, 0x1B, 0xF0, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B6C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x80, 0x00, 0x02, 0xB0, 0x00, 0x0C, 0x8C, 0x00, 0x30, 0x82, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x7F, 0x04, 0x00, 0x11, 0x08, 0x00, 0x11, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x50, 0x00, 0x31, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B6E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x05, 0xFF, 0x80, 0x0D, 0x00, 0x80, 0x19, 0x00, 0x80, 0x10, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x11, 0x11, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x26, 0x00, 0x21, 0x1C, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x3C, 0x00, 0x3F, 0x67, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B70, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x7E, 0x00, 0x11, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x00, 0x32, 0x00, 0x1F, 0x1A, 0x00, 0x02, 0x16, 0x00, 0x04, 0x12, 0x00, 0x07, 0x92, 0x00, 0x3C, 0x22, 0x00, 0x04, 0x22, 0x80, 0x04, 0x43, 0x80, 0x0C, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B71, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x3F, 0x80, 0x17, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x10, 0x30, 0x00, 0x17, 0xCF, 0x80, 0x10, 0x81, 0x00, 0x11, 0xE3, 0x80, 0x2F, 0x1E, 0x00, 0x21, 0x02, 0x00, 0x23, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B73, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x19, 0x32, 0x00, 0x0A, 0x14, 0x00, 0x05, 0x0A, 0x00, 0x3E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B75, { 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x19, 0xED, 0x00, 0x15, 0x2A, 0x80, 0x15, 0x31, 0x00, 0x15, 0x20, 0x00, 0x1D, 0xBF, 0x80, 0x15, 0x61, 0x00, 0x15, 0x22, 0x00, 0x15, 0x3F, 0x80, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x1D, 0x24, 0x00, 0x35, 0x64, 0x00, 0x05, 0x04, 0x00, 0x09, 0x04, 0x00, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B78, { 0x00, 0x00, 0x00, 0x03, 0xA0, 0x00, 0x0C, 0x5E, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0x3E, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0x5E, 0x00, 0x08, 0xA2, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x09, 0xD7, 0x00, 0x08, 0x10, 0x00, 0x0D, 0xD7, 0x00, 0x18, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x19, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B7C, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x24, 0x84, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x11, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0xFF, 0x80, 0x1F, 0x04, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x17, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B7D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x20, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEF, 0x00, 0x05, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x1D, 0xEF, 0x00, 0x70, 0xAA, 0x00, 0x11, 0x11, 0x00, 0x10, 0x40, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x11, 0xE4, 0x00, 0x10, 0x3E, 0x00, 0x71, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B7F, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x68, 0x0D, 0x00, 0x11, 0xE2, 0x00, 0x24, 0x04, 0x80, 0x7D, 0xEF, 0x80, 0x11, 0xE2, 0x00, 0x55, 0x2A, 0x80, 0x55, 0xEA, 0x80, 0x10, 0x02, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B81, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B83, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x03, 0x00, 0x06, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B84, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x21, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x02, 0x09, 0x00, 0x06, 0x0D, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B85, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x0C, 0x80, 0x20, 0x30, 0x80, 0x01, 0xC0, 0x00, 0x0E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x87, 0x80, 0x01, 0xF8, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B86, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B87, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B88, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x04, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B89, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x13, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xB0, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B8A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x99, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x20, 0x00, 0x02, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B8B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B8C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B8D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x30, 0x03, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5B8E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x79, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B8F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x44, 0x00, 0x04, 0x82, 0x00, 0x09, 0x3E, 0x00, 0x17, 0xC1, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B90, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0x01, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0D, 0x8C, 0x00, 0x18, 0xC8, 0x00, 0x00, 0x68, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B91, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0x11, 0x00, 0x22, 0x10, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B93, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x84, 0x00, 0x04, 0x48, 0x00, 0x14, 0x10, 0x00, 0x14, 0x22, 0x00, 0x24, 0x41, 0x00, 0x04, 0x80, 0x80, 0x05, 0x02, 0x00, 0x06, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B94, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B95, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B96, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x89, 0x00, 0x00, 0x91, 0x00, 0x00, 0x97, 0x80, 0x01, 0x78, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B97, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B98, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B99, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B9A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B9B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x22, 0x00, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x51, 0x00, 0x0C, 0x91, 0x00, 0x12, 0x91, 0x00, 0x21, 0x17, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B9C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B9D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B9E, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x43, 0x42, 0x00, 0x01, 0x40, 0x00, 0x08, 0x40, 0x00, 0x06, 0x40, 0x00, 0x02, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5B9F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BA0, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x41, 0x42, 0x00, 0x01, 0x28, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x01, 0x48, 0x00, 0x02, 0x58, 0x00, 0x02, 0x60, 0x00, 0x04, 0x40, 0x00, 0x04, 0xC1, 0x00, 0x09, 0x41, 0x00, 0x10, 0x3F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA1, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x82, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x21, 0x00, 0x80, 0x03, 0xFC, 0x00, 0x06, 0x08, 0x00, 0x09, 0x10, 0x00, 0x30, 0xA0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x07, 0x80, 0x37, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0xC1, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x06, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0x21, 0x00, 0x02, 0x24, 0x00, 0x1A, 0x2C, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x0E, 0x3C, 0x00, 0x3A, 0x26, 0x00, 0x06, 0x20, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x31, 0x00, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BA9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x08, 0x88, 0x00, 0x0C, 0x98, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8C, 0x00, 0x30, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BAA, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x44, 0x92, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x41, 0x00, 0x02, 0x41, 0x00, 0x0C, 0x3F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BAB, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x40, 0x12, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BAC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x24, 0x00, 0x11, 0x18, 0x00, 0x11, 0x18, 0x00, 0x16, 0x24, 0x80, 0x20, 0xC2, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BAD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x32, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BAE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BAF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x89, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x24, 0x81, 0x00, 0x04, 0x80, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x20, 0x00, 0x1B, 0x20, 0x00, 0x18, 0x3E, 0x00, 0x28, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0x90, 0x00, 0x08, 0x70, 0x00, 0x03, 0x8C, 0x00, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x2F, 0xFE, 0x80, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x02, 0xA2, 0x00, 0x04, 0xD4, 0x00, 0x09, 0x58, 0x00, 0x32, 0x68, 0x00, 0x0C, 0xA8, 0x00, 0x31, 0x24, 0x00, 0x06, 0x22, 0x00, 0x18, 0x21, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x88, 0x00, 0x0C, 0x98, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x90, 0x00, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BB8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x04, 0x00, 0x23, 0xF2, 0x00, 0x2E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BB9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x08, 0x00, 0x04, 0x44, 0x00, 0x18, 0xA3, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BBA, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x09, 0x10, 0x00, 0x09, 0x11, 0x00, 0x19, 0x1B, 0x00, 0x31, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BBC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x1F, 0x90, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x12, 0x00, 0x3F, 0xA2, 0x00, 0x09, 0x26, 0x00, 0x09, 0x7C, 0x00, 0x09, 0x0E, 0x00, 0x09, 0x73, 0x00, 0x19, 0x01, 0x00, 0x11, 0x81, 0x00, 0x30, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BBD, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x42, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x28, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x02, 0x41, 0x00, 0x04, 0x41, 0x00, 0x38, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BBE, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x20, 0x74, 0x00, 0x07, 0x80, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x04, 0x18, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BBF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BC0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x3C, 0x00, 0x07, 0xC2, 0x00, 0x08, 0x21, 0x00, 0x10, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BC1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x14, 0x80, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BC2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xBF, 0x80, 0x04, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x04, 0x0A, 0x00, 0x0E, 0x0C, 0x00, 0x0D, 0x04, 0x00, 0x14, 0x8A, 0x00, 0x24, 0x12, 0x00, 0x04, 0x21, 0x00, 0x0C, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BC3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x01, 0xFD, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x30, 0x00, 0x37, 0xFE, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x07, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x80, 0x0C, 0x3F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BC4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x03, 0x18, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x07, 0xE2, 0x00, 0x04, 0x22, 0x00, 0x07, 0xE2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BC5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BC6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x00, 0x80, 0x00, 0x0A, 0x42, 0x00, 0x12, 0x05, 0x00, 0x22, 0x04, 0x80, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BC7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x08, 0x80, 0x0F, 0x08, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x24, 0x00, 0x09, 0x18, 0x00, 0x09, 0x14, 0x00, 0x09, 0x62, 0x00, 0x11, 0x80, 0x80, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BC9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x26, 0x11, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x40, 0x00, 0x38, 0x40, 0x00, 0x6F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BCC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BCD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0xC1, 0x00, 0x04, 0x66, 0x00, 0x14, 0x23, 0x00, 0x14, 0x01, 0x00, 0x36, 0x04, 0x00, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BCF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x04, 0x20, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x0B, 0x24, 0x00, 0x0E, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BD0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0x1C, 0x00, 0x11, 0x1C, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x21, 0x49, 0x00, 0x21, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BD2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x26, 0x00, 0x33, 0x81, 0x80, 0x00, 0x70, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BD3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x44, 0x80, 0x20, 0x7E, 0x80, 0x2F, 0xC1, 0x80, 0x20, 0x00, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BD4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x40, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BD6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x38, 0xFD, 0x00, 0x0C, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x30, 0x04, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x02, 0xFD, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x31, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BD7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x0A, 0x42, 0x00, 0x0A, 0x05, 0x00, 0x13, 0xFC, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BD8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x04, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xF8, 0x00, 0x0A, 0x08, 0x00, 0x0B, 0xF8, 0x00, 0x0A, 0x08, 0x00, 0x0B, 0xF8, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BD9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x41, 0x86, 0x80, 0x07, 0x0C, 0x00, 0x1C, 0x3A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0xAA, 0x00, 0x14, 0xEA, 0x00, 0x15, 0x2A, 0x00, 0x37, 0x6E, 0x80, 0x2D, 0x5B, 0x80, 0x60, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BDA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BDB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x42, 0x10, 0x80, 0x5F, 0xFE, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x80, 0x0E, 0x11, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BDD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x28, 0xFD, 0x00, 0x08, 0x04, 0x00, 0x48, 0xFC, 0x00, 0x68, 0x04, 0x00, 0x28, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x3A, 0x01, 0x00, 0x68, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x08, 0x38, 0x00, 0x0B, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BDE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BDF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x01, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x05, 0x52, 0x00, 0x0C, 0x8C, 0x00, 0x33, 0x06, 0x00, 0x06, 0x01, 0x80, 0x3B, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x06, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFA, 0x00, 0x31, 0x09, 0x80, 0x06, 0x10, 0x00, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x12, 0x7E, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x1E, 0x02, 0x00, 0x12, 0x7E, 0x00, 0x02, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x12, 0x7F, 0x00, 0x12, 0x24, 0x00, 0x12, 0x18, 0x00, 0x22, 0x2C, 0x00, 0x22, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BE4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7E, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x22, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x04, 0x89, 0x00, 0x19, 0x93, 0x00, 0x06, 0xE5, 0x00, 0x18, 0x89, 0x00, 0x00, 0xE1, 0x00, 0x03, 0x18, 0x00, 0x3C, 0x67, 0x80, 0x03, 0x98, 0x00, 0x1C, 0x62, 0x00, 0x03, 0x8C, 0x00, 0x1C, 0x70, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFE, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0A, 0x22, 0x00, 0x0A, 0x05, 0x00, 0x13, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BE8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BE9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x60, 0x00, 0x02, 0x58, 0x00, 0x0C, 0x46, 0x00, 0x37, 0xFD, 0x80, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BEB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x80, 0x80, 0x0E, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x04, 0x80, 0x10, 0x22, 0x80, 0x21, 0x10, 0x80, 0x08, 0x81, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BEC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x80, 0x06, 0x10, 0x80, 0x38, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BEE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0xA2, 0x00, 0x07, 0x1C, 0x00, 0x3C, 0x07, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BEF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x10, 0x80, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BF0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFD, 0x00, 0x02, 0x43, 0x00, 0x0C, 0x32, 0x00, 0x77, 0x9C, 0x00, 0x0C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BF1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x21, 0x00, 0x22, 0x41, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x1E, 0x82, 0x00, 0x02, 0xFE, 0x00, 0x02, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x54, 0x00, 0x62, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BF3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x21, 0x00, 0x1F, 0x3E, 0x00, 0x04, 0x48, 0x00, 0x1F, 0x2A, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BF4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x44, 0x00, 0x80, 0x44, 0x3E, 0x80, 0x3F, 0xA2, 0x00, 0x11, 0x3E, 0x00, 0x1B, 0x22, 0x00, 0x0A, 0x3E, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xBE, 0x00, 0x15, 0x14, 0x00, 0x15, 0x94, 0x80, 0x34, 0x94, 0x80, 0x64, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BF5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x00, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xDF, 0x00, 0x08, 0x90, 0x00, 0x05, 0x1F, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x0F, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x0F, 0x90, 0x00, 0x08, 0x90, 0x80, 0x09, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5BF6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x10, 0x80, 0x1F, 0xDF, 0x00, 0x02, 0x24, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0xC4, 0x80, 0x1E, 0x3F, 0x80, 0x0F, 0xFE, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BF8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BF9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x0A, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x24, 0x08, 0x00, 0x14, 0x88, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BFA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BFB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BFC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BFD, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x0F, 0xC8, 0x00, 0x08, 0x8C, 0x00, 0x08, 0xC4, 0x00, 0x18, 0x46, 0x00, 0x30, 0x43, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BFE, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xC2, 0x00, 0x01, 0x3F, 0x80, 0x01, 0x02, 0x00, 0x33, 0x02, 0x00, 0x1A, 0x32, 0x00, 0x0E, 0x1A, 0x00, 0x04, 0x0A, 0x00, 0x0E, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x19, 0x82, 0x00, 0x30, 0x82, 0x00, 0x60, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5BFF, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x02, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x0D, 0x84, 0x00, 0x18, 0xC4, 0x00, 0x30, 0x44, 0x00, 0x60, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C01, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x04, 0x12, 0x00, 0x04, 0x0A, 0x00, 0x1F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xE2, 0x00, 0x3C, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C02, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x06, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C04, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0x92, 0x00, 0x10, 0xCA, 0x00, 0x17, 0x82, 0x00, 0x39, 0x82, 0x00, 0x02, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x31, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C05, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x9A, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x32, 0x0E, 0x80, 0x23, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C06, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xF0, 0x80, 0x48, 0x21, 0x80, 0x69, 0x33, 0x00, 0x29, 0x92, 0x00, 0x08, 0x80, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x02, 0x00, 0x38, 0xC2, 0x00, 0x68, 0x62, 0x00, 0x08, 0x22, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C07, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x62, 0x00, 0x22, 0x94, 0x00, 0x23, 0x98, 0x00, 0x3E, 0x50, 0x00, 0x22, 0x64, 0x00, 0x03, 0x84, 0x00, 0x02, 0x04, 0x00, 0x3E, 0xFF, 0x80, 0x12, 0x04, 0x00, 0x12, 0x44, 0x00, 0x12, 0x24, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C08, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0xFF, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C09, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x1F, 0x80, 0x10, 0x02, 0x00, 0x17, 0xC2, 0x00, 0x10, 0x12, 0x00, 0x1F, 0xEA, 0x00, 0x11, 0x02, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x25, 0x22, 0x00, 0x29, 0x22, 0x00, 0x23, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C0A, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x37, 0xFD, 0x80, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0E, 0x1E, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x00, 0x44, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x07, 0xBF, 0x00, 0x38, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C0C, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x7F, 0xC1, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x01, 0x00, 0x3F, 0x81, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x99, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x81, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C0D, { 0x00, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x2A, 0x84, 0x00, 0x1B, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x07, 0x80, 0x11, 0x7C, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x14, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C0E, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x39, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C0F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x42, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x10, 0x40, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C11, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x40, 0x80, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x01, 0xC4, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C13, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x30, 0x80, 0x00, 0x60, 0x80, 0x00, 0x04, 0x88, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x18, 0x86, 0x00, 0x30, 0x83, 0x00, 0x60, 0x81, 0x80, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C14, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x10, 0x44, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x02, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x04, 0x46, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x12, 0x00, 0x02, 0x3F, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x8A, 0x00, 0x10, 0x84, 0x00, 0x24, 0x80, 0x00, 0x44, 0x90, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x86, 0x00, 0x02, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C16, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C17, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x30, 0x83, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C18, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x02, 0xA0, 0x00, 0x06, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x10, 0x86, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C19, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C1A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x18, 0x86, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C1C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x88, 0x00, 0x08, 0x84, 0x00, 0x11, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x8F, 0x00, 0x64, 0x92, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x12, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C1D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x40, 0x12, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C1E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x13, 0x32, 0x00, 0x0A, 0x14, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x37, 0xFB, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C1F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x2A, 0x00, 0x21, 0x2A, 0x00, 0x21, 0x2B, 0x00, 0x3F, 0x49, 0x80, 0x00, 0x08, 0x00, 0x7F, 0x99, 0x00, 0x04, 0x03, 0x00, 0x24, 0x02, 0x00, 0x27, 0x86, 0x00, 0x24, 0x0C, 0x00, 0x34, 0x38, 0x00, 0x6C, 0x00, 0x00, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C20, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x11, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x11, 0x2B, 0x00, 0x1F, 0x49, 0x80, 0x11, 0x08, 0x00, 0x7F, 0xC9, 0x00, 0x2A, 0x19, 0x00, 0x2A, 0x03, 0x00, 0x2B, 0x82, 0x00, 0x30, 0x06, 0x00, 0x20, 0x0C, 0x00, 0x3F, 0x98, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C22, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x03, 0x40, 0x00, 0x02, 0x40, 0x00, 0x06, 0x40, 0x00, 0x0C, 0x40, 0x80, 0x18, 0x61, 0x80, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C23, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x1A, 0x26, 0x00, 0x72, 0x23, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x31, 0x00, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C24, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x80, 0x04, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C25, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x10, 0x7E, 0x00, 0x7E, 0x84, 0x00, 0x14, 0x84, 0x00, 0x15, 0x44, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x04, 0x00, 0x14, 0x04, 0x00, 0x14, 0x44, 0x00, 0x14, 0x29, 0x00, 0x24, 0x11, 0x00, 0x23, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C26, { 0x00, 0x00, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x36, 0x20, 0x00, 0x22, 0x3F, 0x80, 0x63, 0x60, 0x80, 0x41, 0x40, 0x80, 0x55, 0xC0, 0x80, 0x14, 0x00, 0x80, 0x14, 0x3C, 0x80, 0x14, 0x01, 0x80, 0x14, 0x01, 0x00, 0x14, 0x01, 0x00, 0x14, 0x03, 0x00, 0x34, 0x0E, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C27, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x42, 0x00, 0x03, 0xB2, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x21, 0x00, 0x04, 0x21, 0x00, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C28, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x04, 0x00, 0x03, 0x08, 0x80, 0x05, 0x11, 0x00, 0x05, 0x62, 0x00, 0x05, 0x04, 0x00, 0x09, 0x18, 0x00, 0x09, 0x60, 0x80, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C29, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x36, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x63, 0x10, 0x00, 0x40, 0x10, 0x00, 0x54, 0x10, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x34, 0x00, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x34, 0x00, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C2C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x7E, 0xC6, 0x00, 0x11, 0x83, 0x80, 0x14, 0x00, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0xC4, 0x00, 0x14, 0x84, 0x00, 0x35, 0x84, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C2D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x80, 0x0C, 0x19, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C2E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x44, 0x00, 0x10, 0x47, 0x00, 0x7E, 0x41, 0x00, 0x10, 0xC1, 0x00, 0x15, 0x87, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x54, 0x00, 0x14, 0x54, 0x00, 0x14, 0xD6, 0x00, 0x15, 0x93, 0x00, 0x34, 0x10, 0x00, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C30, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x35, 0xFF, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C31, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x0A, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE8, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x10, 0x4C, 0x00, 0x1F, 0xCC, 0x00, 0x02, 0x0C, 0x00, 0x0A, 0x8C, 0x00, 0x0A, 0x94, 0x00, 0x12, 0x54, 0x80, 0x22, 0x54, 0x80, 0x02, 0x27, 0x80, 0x06, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C32, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x36, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x24, 0x00, 0x11, 0xFF, 0x00, 0x14, 0x25, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x25, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x24, 0x00, 0x14, 0x66, 0x00, 0x14, 0xA5, 0x00, 0x34, 0x24, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C34, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x11, 0x48, 0x00, 0x11, 0x50, 0x00, 0x11, 0x7E, 0x00, 0x7F, 0x40, 0x00, 0x15, 0x48, 0x00, 0x14, 0x44, 0x00, 0x14, 0x40, 0x00, 0x15, 0xFC, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C35, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x34, 0xFE, 0x80, 0x27, 0x01, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C36, { 0x00, 0x00, 0x00, 0x01, 0xF4, 0x00, 0x7F, 0x44, 0x00, 0x15, 0xEF, 0x80, 0x15, 0x28, 0x00, 0x15, 0xF0, 0x00, 0x15, 0x47, 0x80, 0x15, 0xF0, 0x00, 0x14, 0x00, 0x00, 0x14, 0xFF, 0x00, 0x14, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x35, 0xFF, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x80, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x08, 0x00, 0x10, 0x06, 0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0B, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x80, 0x11, 0x04, 0x80, 0x12, 0x07, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x83, 0x00, 0x10, 0x9C, 0x00, 0x10, 0xE0, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x80, 0x10, 0x80, 0x80, 0x20, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0x8C, 0x00, 0x18, 0xE4, 0x00, 0x10, 0x26, 0x00, 0x30, 0x03, 0x00, 0x63, 0x01, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x70, 0x00, 0x13, 0xC0, 0x00, 0x10, 0x7E, 0x00, 0x17, 0xC0, 0x00, 0x10, 0x5F, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x7F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x80, 0x0F, 0xD1, 0x00, 0x08, 0x5A, 0x00, 0x08, 0x98, 0x00, 0x08, 0x94, 0x00, 0x09, 0x14, 0x00, 0x09, 0x12, 0x00, 0x12, 0x12, 0x00, 0x14, 0x11, 0x00, 0x20, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x13, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x13, 0x00, 0x13, 0xDE, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x32, 0x10, 0x00, 0x22, 0x10, 0x80, 0x63, 0xD9, 0x80, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C42, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x11, 0x08, 0x00, 0x12, 0x04, 0x00, 0x27, 0xFE, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x15, 0xFD, 0x00, 0x24, 0x01, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C49, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x4A, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x78, 0x00, 0x12, 0x00, 0x00, 0x22, 0x04, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x21, 0x00, 0x24, 0x21, 0x00, 0x64, 0x21, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x82, 0x00, 0x11, 0x3F, 0x00, 0x17, 0xE1, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x28, 0x00, 0x0B, 0xF9, 0x80, 0x0A, 0x2E, 0x00, 0x0D, 0x48, 0x00, 0x10, 0x88, 0x00, 0x11, 0x08, 0x80, 0x12, 0x08, 0x80, 0x2C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x70, 0x00, 0x08, 0x68, 0x00, 0x08, 0xA4, 0x00, 0x11, 0x22, 0x00, 0x12, 0x21, 0x00, 0x24, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x31, 0x88, 0x00, 0x21, 0x08, 0x00, 0x63, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x13, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x1C, 0x08, 0x00, 0x11, 0x7E, 0x00, 0x13, 0x22, 0x00, 0x1E, 0x36, 0x00, 0x32, 0x14, 0x00, 0x22, 0x1C, 0x00, 0x62, 0x36, 0x00, 0x02, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x37, 0xFF, 0x00, 0x21, 0x04, 0x00, 0x63, 0x06, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x11, 0x0A, 0x00, 0x21, 0x04, 0x00, 0x21, 0xE2, 0x00, 0x2E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xBF, 0x80, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x15, 0x39, 0x00, 0x14, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x35, 0xB9, 0x00, 0x24, 0x01, 0x00, 0x64, 0x01, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x15, 0x29, 0x00, 0x14, 0xA5, 0x00, 0x34, 0x21, 0x00, 0x25, 0x29, 0x00, 0x64, 0xA5, 0x00, 0x04, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C5B, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0xC8, 0x00, 0x1F, 0x7F, 0x80, 0x11, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x12, 0x20, 0x00, 0x12, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x15, 0xFF, 0x80, 0x19, 0x2A, 0x00, 0x13, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x36, 0x2E, 0x00, 0x2A, 0x20, 0x00, 0x62, 0x20, 0x00, 0x02, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x29, 0x00, 0x24, 0x3D, 0x00, 0x65, 0xE5, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x60, 0x00, 0x10, 0x80, 0x00, 0x13, 0xFE, 0x00, 0x2E, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x44, 0x00, 0x12, 0x48, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x48, 0x00, 0x16, 0x47, 0x00, 0x10, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x63, 0xF0, 0x00, 0x00, 0x4C, 0x00, 0x0F, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C62, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x23, 0x0C, 0x00, 0x20, 0xF0, 0x00, 0x2F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x08, 0x00, 0x12, 0x28, 0x00, 0x12, 0x2F, 0x00, 0x16, 0x28, 0x00, 0x15, 0x28, 0x00, 0x19, 0x7F, 0x80, 0x13, 0x08, 0x00, 0x12, 0x08, 0x00, 0x36, 0x4F, 0x00, 0x2A, 0x68, 0x00, 0x62, 0x58, 0x00, 0x02, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C64, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x38, 0x00, 0x11, 0x04, 0x00, 0x12, 0x03, 0x80, 0x1F, 0xFF, 0x00, 0x15, 0x25, 0x00, 0x14, 0xA9, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C65, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x14, 0x3F, 0x00, 0x19, 0x40, 0x00, 0x12, 0xBF, 0x00, 0x16, 0x21, 0x00, 0x1A, 0x3F, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x20, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x52, 0x00, 0x22, 0x8C, 0x00, 0x22, 0x36, 0x00, 0x22, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C66, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x12, 0x54, 0x00, 0x14, 0x10, 0x00, 0x19, 0xFE, 0x00, 0x12, 0x54, 0x00, 0x16, 0x92, 0x00, 0x1A, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x44, 0x00, 0x22, 0x38, 0x00, 0x42, 0x24, 0x00, 0x02, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C67, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x12, 0x52, 0x00, 0x12, 0xFF, 0x80, 0x16, 0x52, 0x00, 0x15, 0x5E, 0x00, 0x19, 0x40, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x3A, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x62, 0x6B, 0x00, 0x02, 0xC9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C68, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x15, 0xFF, 0x80, 0x19, 0x49, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x1A, 0x49, 0x00, 0x32, 0xFF, 0x80, 0x22, 0x32, 0x00, 0x62, 0x1C, 0x00, 0x02, 0xF7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C69, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x10, 0x00, 0x16, 0x7F, 0x00, 0x15, 0x24, 0x00, 0x19, 0x7E, 0x00, 0x13, 0xA5, 0x00, 0x12, 0xFF, 0x80, 0x16, 0x81, 0x00, 0x3A, 0xBD, 0x00, 0x22, 0xA5, 0x00, 0x62, 0xBD, 0x00, 0x02, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C6C, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x13, 0xAE, 0x00, 0x13, 0xAE, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x89, 0x00, 0x17, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x1B, 0xF9, 0x00, 0x12, 0x49, 0x00, 0x13, 0xF9, 0x00, 0x20, 0x45, 0x00, 0x20, 0xFF, 0x00, 0x27, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C6D, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x17, 0x9F, 0x00, 0x14, 0x91, 0x00, 0x37, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x67, 0x9F, 0x00, 0x0C, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C6E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C6F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x8F, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C70, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C71, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C74, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x06, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C75, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C76, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x02, 0x01, 0x00, 0x06, 0x01, 0x00, 0x0C, 0x03, 0x00, 0x18, 0x02, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C79, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x80, 0x00, 0x2B, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x06, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x40, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C7A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x54, 0x01, 0x00, 0x54, 0x01, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C7B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x54, 0x10, 0x80, 0x54, 0x90, 0x80, 0x54, 0x90, 0x80, 0x55, 0xB0, 0x80, 0x55, 0x20, 0x80, 0x55, 0x60, 0x80, 0x54, 0x40, 0x80, 0x7C, 0xC1, 0x80, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C7C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x48, 0x00, 0x54, 0x48, 0x00, 0x54, 0x48, 0x00, 0x54, 0x48, 0x00, 0x54, 0x48, 0x00, 0x54, 0x48, 0x00, 0x54, 0x48, 0x00, 0x54, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x8C, 0x80, 0x03, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C7D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C7F, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0x12, 0x00, 0x2B, 0xFA, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C81, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x09, 0x04, 0x00, 0x10, 0x88, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C82, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x10, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C87, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x27, 0x41, 0x00, 0x78, 0x47, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C88, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x80, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x12, 0x00, 0x54, 0x12, 0x00, 0x54, 0x32, 0x00, 0x7C, 0x22, 0x00, 0x00, 0x62, 0x00, 0x00, 0xC2, 0x00, 0x03, 0x82, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x3F, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x20, 0x02, 0x00, 0x30, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C8C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x07, 0xFE, 0x00, 0x05, 0x06, 0x00, 0x0D, 0x8C, 0x00, 0x18, 0xD8, 0x00, 0x30, 0x70, 0x00, 0x60, 0xD8, 0x00, 0x03, 0x8E, 0x00, 0x1E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C8D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x84, 0x00, 0x02, 0x84, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C8F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x7C, 0x64, 0x00, 0x00, 0x44, 0x80, 0x00, 0xC4, 0x80, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C90, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x18, 0x00, 0x22, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0xC2, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5C91, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x0C, 0x00, 0x0D, 0xF3, 0x80, 0x30, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C92, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x54, 0xC6, 0x00, 0x55, 0x83, 0x00, 0x57, 0x7D, 0x80, 0x54, 0x00, 0x00, 0x54, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x02, 0x00, 0x7C, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C94, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x38, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C96, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xA2, 0x00, 0x3E, 0xC0, 0x00, 0x02, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C97, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x24, 0x12, 0x00, 0x22, 0x22, 0x00, 0x21, 0x42, 0x00, 0x20, 0x82, 0x00, 0x21, 0x42, 0x00, 0x22, 0x22, 0x00, 0x24, 0x1A, 0x00, 0x28, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C98, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xB4, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x50, 0x00, 0x3E, 0x91, 0x00, 0x02, 0x91, 0x00, 0x01, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C99, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x87, 0x00, 0x60, 0x82, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C9A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x28, 0x00, 0x09, 0x48, 0x00, 0x08, 0x88, 0x00, 0x09, 0x48, 0x00, 0x12, 0x28, 0x00, 0x14, 0x29, 0x00, 0x20, 0x05, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C9B, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x09, 0x20, 0x00, 0x08, 0x60, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x02, 0x04, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3F, 0xE4, 0x00, 0x20, 0x34, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C9C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x20, 0x08, 0x00, 0x20, 0x00, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C9D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x80, 0x00, 0x30, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5C9F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0x92, 0x00, 0x54, 0x92, 0x00, 0x54, 0x92, 0x00, 0x54, 0x92, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x28, 0x00, 0x7C, 0x6C, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CA0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x24, 0x11, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CA2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CA3, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x54, 0x80, 0x80, 0x55, 0x80, 0x80, 0x54, 0x7C, 0x80, 0x54, 0x44, 0x80, 0x54, 0x44, 0x80, 0x54, 0x44, 0x80, 0x54, 0x44, 0x80, 0x7C, 0x7C, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CA6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x18, 0x00, 0x06, 0x10, 0x00, 0x02, 0x30, 0x00, 0x02, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CA9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x34, 0x01, 0x00, 0x04, 0x01, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CAA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x06, 0x21, 0x00, 0x0C, 0x23, 0x00, 0x38, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CAB, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xA4, 0x80, 0x20, 0xBF, 0x80, 0x20, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CAC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CAD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xA7, 0x00, 0x2B, 0x12, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x02, 0x00, 0x2E, 0x04, 0x00, 0x3A, 0x28, 0x00, 0x22, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CB1, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x40, 0x00, 0x18, 0x5F, 0x80, 0x1B, 0xE0, 0x00, 0x28, 0x40, 0x00, 0x08, 0x20, 0x00, 0x08, 0x18, 0x80, 0x08, 0x07, 0x80, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CB2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x7C, 0x64, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC4, 0x80, 0x01, 0x84, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CB3, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CB4, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x10, 0xF0, 0x00, 0x10, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CB5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CB6, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x10, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x7C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CB7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x90, 0x00, 0x3E, 0x88, 0x00, 0x22, 0x88, 0x00, 0x00, 0xBC, 0x80, 0x01, 0xC2, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CB8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CBA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x31, 0xF1, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x18, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CBB, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x88, 0x00, 0x54, 0x88, 0x00, 0x54, 0x88, 0x00, 0x54, 0xFF, 0x80, 0x54, 0x88, 0x00, 0x54, 0x88, 0x00, 0x54, 0x8C, 0x00, 0x54, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x00, 0xF6, 0x00, 0x03, 0x82, 0x80, 0x00, 0x03, 0x80, 0x03, 0xF9, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CBC, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x54, 0x92, 0x00, 0x55, 0x93, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x54, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CBD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x02, 0x40, 0x00, 0x04, 0x48, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x04, 0x48, 0x00, 0x08, 0x46, 0x00, 0x31, 0x42, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CBE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0F, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CBF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x04, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x28, 0x02, 0x00, 0x08, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CC0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CC1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x02, 0x00, 0x3C, 0x7F, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x27, 0x42, 0x00, 0x39, 0x52, 0x00, 0x02, 0x4C, 0x00, 0x02, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CC4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x6C, 0x00, 0x2B, 0x83, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CC5, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x54, 0x9F, 0x00, 0x55, 0xF5, 0x80, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CC7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CC9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x08, 0x00, 0x3F, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x7C, 0x0F, 0x80, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CCB, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x11, 0x80, 0x80, 0x55, 0x00, 0x80, 0x54, 0x7C, 0x80, 0x54, 0x44, 0x80, 0x54, 0x44, 0x80, 0x54, 0x7C, 0x80, 0x54, 0x44, 0x80, 0x54, 0x44, 0x80, 0x7C, 0x7C, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CD2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x55, 0x7D, 0x00, 0x55, 0x01, 0x00, 0x55, 0x01, 0x00, 0x55, 0x7D, 0x00, 0x55, 0x45, 0x00, 0x55, 0x45, 0x00, 0x55, 0x45, 0x00, 0x7D, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CD7, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7E, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x88, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0xBE, 0x00, 0x54, 0xA2, 0x00, 0x54, 0xA2, 0x00, 0x54, 0xA2, 0x00, 0x7C, 0xA6, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x80, 0x00, 0xB1, 0x80, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CD9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x04, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CDD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CE0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x0F, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x24, 0x8C, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x89, 0x00, 0x20, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CE1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x55, 0x11, 0x00, 0x55, 0x93, 0x00, 0x54, 0x92, 0x00, 0x54, 0x92, 0x00, 0x54, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x28, 0x00, 0x7C, 0x6C, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CE4, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x54, 0x22, 0x00, 0x57, 0xFF, 0x00, 0x54, 0x50, 0x00, 0x54, 0x88, 0x00, 0x54, 0x8C, 0x00, 0x55, 0x8B, 0x00, 0x56, 0x88, 0x00, 0x54, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x04, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CE5, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x88, 0x00, 0x2B, 0x12, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x12, 0x00, 0x02, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CE6, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x22, 0x20, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CE8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x3A, 0x00, 0x08, 0xE9, 0x00, 0x08, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x80, 0x2A, 0x28, 0x80, 0x2A, 0x39, 0x00, 0x2A, 0x65, 0x00, 0x2B, 0xA6, 0x00, 0x2A, 0x22, 0x00, 0x3E, 0x26, 0x80, 0x22, 0x29, 0x80, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CE9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0x22, 0x00, 0x3C, 0x23, 0x00, 0x08, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x12, 0x00, 0x08, 0x16, 0x00, 0x0F, 0x1C, 0x00, 0x78, 0x08, 0x00, 0x08, 0x1C, 0x80, 0x08, 0x76, 0x80, 0x39, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CEA, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x55, 0x83, 0x00, 0x54, 0x10, 0x00, 0x54, 0x38, 0x00, 0x54, 0x6C, 0x00, 0x54, 0xC6, 0x00, 0x57, 0x83, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CED, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x52, 0x00, 0x10, 0xD3, 0x00, 0x10, 0x91, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CEE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x22, 0x00, 0x54, 0x22, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x40, 0x00, 0x54, 0x40, 0x00, 0x54, 0xFF, 0x00, 0x7D, 0xC1, 0x00, 0x03, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CEF, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x01, 0xFC, 0x00, 0x07, 0x08, 0x00, 0x18, 0x90, 0x00, 0x00, 0x60, 0x00, 0x03, 0x9F, 0x80, 0x3C, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CF0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x42, 0x00, 0x2A, 0xA4, 0x00, 0x2B, 0x18, 0x00, 0x2A, 0x2C, 0x00, 0x2A, 0x53, 0x80, 0x2B, 0x90, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CF1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFC, 0x00, 0x28, 0x24, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x49, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CF2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x1E, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x0D, 0x22, 0x00, 0x14, 0x82, 0x00, 0x24, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CF4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x28, 0x00, 0x22, 0x28, 0x00, 0x00, 0x48, 0x80, 0x00, 0x8F, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CF6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x22, 0x10, 0x80, 0x22, 0x10, 0x80, 0x3F, 0xF1, 0x00, 0x20, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5CFA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x7C, 0x50, 0x00, 0x00, 0x30, 0x00, 0x00, 0x78, 0x00, 0x00, 0xCE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CFB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0x4F, 0x00, 0x09, 0xF4, 0x80, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x80, 0x2A, 0x47, 0x80, 0x2B, 0xA0, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0xA2, 0x00, 0x3F, 0x14, 0x00, 0x22, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x66, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5CFD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0xAA, 0x80, 0x2A, 0xAC, 0x80, 0x2B, 0x08, 0x00, 0x2A, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D01, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x09, 0x93, 0x00, 0x08, 0x12, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x0E, 0x2C, 0x00, 0x78, 0x66, 0x00, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D02, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x2B, 0x21, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x44, 0x00, 0x02, 0x44, 0x00, 0x00, 0x94, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D03, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x38, 0x00, 0x2A, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x02, 0x92, 0x00, 0x01, 0x11, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D06, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x44, 0x80, 0x55, 0x44, 0x80, 0x54, 0x44, 0x00, 0x54, 0xC4, 0x00, 0x55, 0x83, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D07, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D0B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D0D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0xAA, 0x80, 0x2B, 0x1C, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x22, 0x2C, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x89, 0x00, 0x01, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D0E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x28, 0x00, 0x2A, 0x46, 0x00, 0x2B, 0x81, 0x80, 0x2A, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x02, 0x00, 0x2A, 0xF2, 0x00, 0x3E, 0x92, 0x00, 0x22, 0xF2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D11, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x13, 0x80, 0x0F, 0x9C, 0x00, 0x08, 0x10, 0x80, 0x0F, 0xD0, 0x80, 0x38, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D12, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x1B, 0x36, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D14, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x04, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D15, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x55, 0x08, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x55, 0x08, 0x00, 0x7D, 0x7F, 0x00, 0x03, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D16, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D17, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x21, 0x10, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x24, 0x44, 0x80, 0x24, 0x44, 0x80, 0x24, 0x44, 0x80, 0x27, 0xFC, 0x80, 0x24, 0x04, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D18, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x54, 0xC6, 0x00, 0x57, 0x83, 0x80, 0x54, 0x7C, 0x00, 0x54, 0x00, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x7D, 0xFF, 0x00, 0x01, 0x49, 0x00, 0x01, 0x49, 0x00, 0x01, 0x49, 0x00, 0x01, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D19, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xC1, 0x00, 0x01, 0x20, 0x00, 0x02, 0x18, 0x00, 0x0D, 0xF6, 0x00, 0x30, 0x01, 0x80, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D1A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x44, 0x00, 0x54, 0xC4, 0x00, 0x55, 0xA7, 0x80, 0x54, 0x20, 0x00, 0x54, 0x7E, 0x00, 0x54, 0xC2, 0x00, 0x7D, 0x86, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D1B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x55, 0x01, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x00, 0x00, 0x55, 0x08, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x7D, 0x08, 0x00, 0x03, 0x49, 0x00, 0x02, 0x49, 0x00, 0x06, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D1E, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x30, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D1F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x02, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D22, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF2, 0x00, 0x54, 0x53, 0x00, 0x54, 0x89, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x11, 0x00, 0x54, 0x11, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x11, 0x00, 0x54, 0x11, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D23, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x38, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x90, 0x00, 0x38, 0x8E, 0x00, 0x01, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x07, 0x20, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D24, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x38, 0x00, 0x11, 0xC6, 0x00, 0x54, 0x20, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x54, 0x7F, 0x00, 0x54, 0xC1, 0x00, 0x55, 0x7F, 0x00, 0x54, 0x41, 0x00, 0x7C, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D26, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x54, 0x54, 0x00, 0x54, 0x92, 0x00, 0x55, 0xFF, 0x00, 0x56, 0x92, 0x80, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x10, 0x80, 0x00, 0x19, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D27, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x0E, 0x00, 0x02, 0x02, 0x00, 0x1F, 0xD1, 0x00, 0x02, 0x21, 0x00, 0x07, 0x48, 0x80, 0x06, 0x88, 0x00, 0x0A, 0x52, 0x00, 0x12, 0x11, 0x00, 0x22, 0x27, 0x00, 0x02, 0x78, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D29, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x23, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D2B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x20, 0x00, 0x12, 0x21, 0x00, 0x32, 0x21, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D2D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0x70, 0x00, 0x10, 0x40, 0x00, 0x24, 0x42, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x48, 0x00, 0x07, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x24, 0x88, 0x00, 0x04, 0x88, 0x00, 0x05, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D2E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D31, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x81, 0x00, 0x20, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x0A, 0x01, 0x00, 0x31, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D34, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x2F, 0xD2, 0x00, 0x22, 0x1A, 0x00, 0x2F, 0xCA, 0x00, 0x24, 0x8E, 0x00, 0x2E, 0x84, 0x80, 0x63, 0x0E, 0x80, 0x4E, 0xDB, 0x80, 0x40, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D39, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x54, 0x66, 0x00, 0x54, 0x24, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x10, 0x80, 0x55, 0x10, 0x80, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x7C, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0x93, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D3D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x32, 0x25, 0x80, 0x63, 0x0C, 0x80, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D3E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x08, 0x2A, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x48, 0x00, 0x02, 0x30, 0x00, 0x00, 0x4C, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D3F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x55, 0xEF, 0x00, 0x54, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x54, 0x40, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D42, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x11, 0x00, 0x63, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D43, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x3C, 0x00, 0x54, 0x42, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x02, 0x00, 0x55, 0x0E, 0x00, 0x55, 0x79, 0x00, 0x55, 0x03, 0x00, 0x55, 0x1E, 0x00, 0x7D, 0x70, 0x80, 0x01, 0x01, 0x80, 0x01, 0x03, 0x00, 0x02, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D46, { 0x00, 0x00, 0x00, 0x01, 0x16, 0x00, 0x1E, 0x13, 0x00, 0x04, 0x10, 0x00, 0x7F, 0x7F, 0x80, 0x04, 0x10, 0x00, 0x0E, 0x38, 0x00, 0x0D, 0x28, 0x00, 0x14, 0x68, 0x80, 0x24, 0x4C, 0x80, 0x04, 0x87, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D47, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06, 0x50, 0x00, 0x78, 0x4A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x50, 0x00, 0x08, 0x91, 0x00, 0x18, 0x91, 0x00, 0x1D, 0x0F, 0x00, 0x2A, 0x20, 0x00, 0x28, 0x20, 0x00, 0x49, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D48, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x13, 0xFC, 0x00, 0x10, 0xA2, 0x00, 0x55, 0xB3, 0x00, 0x55, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x20, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x40, 0x00, 0x54, 0x7E, 0x00, 0x54, 0xC2, 0x00, 0x7D, 0x86, 0x00, 0x03, 0x6C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D4A, { 0x00, 0x00, 0x00, 0x10, 0x0F, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x54, 0x54, 0x00, 0x54, 0x54, 0x00, 0x55, 0xD7, 0x80, 0x54, 0x54, 0x00, 0x54, 0x54, 0x80, 0x55, 0xD4, 0x80, 0x54, 0x53, 0x80, 0x7C, 0x38, 0x00, 0x00, 0x7C, 0x00, 0x00, 0xD6, 0x00, 0x03, 0x93, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D4B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x3E, 0xBF, 0x00, 0x22, 0xA1, 0x00, 0x00, 0xBF, 0x00, 0x01, 0x21, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D4C, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x3F, 0x80, 0x3F, 0xA9, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x21, 0x00, 0x12, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D4E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x54, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x10, 0x80, 0x7D, 0x14, 0x80, 0x01, 0x1E, 0x80, 0x01, 0x72, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D50, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0xE4, 0x00, 0x17, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x94, 0x80, 0x10, 0xFA, 0x80, 0x27, 0x05, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D51, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x40, 0x00, 0x54, 0xFF, 0x80, 0x55, 0x90, 0x80, 0x57, 0x10, 0x80, 0x7D, 0x38, 0x80, 0x01, 0x6C, 0x80, 0x01, 0x01, 0x80, 0x01, 0xF9, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D52, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D55, { 0x00, 0x00, 0x00, 0x10, 0x81, 0x00, 0x10, 0xA5, 0x00, 0x10, 0x99, 0x00, 0x10, 0xA5, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x44, 0x00, 0x54, 0xC4, 0x00, 0x55, 0xA3, 0x80, 0x54, 0x7E, 0x00, 0x54, 0xC2, 0x00, 0x7D, 0xA6, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x76, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D58, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2B, 0x12, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x38, 0x00, 0x3E, 0x54, 0x00, 0x02, 0x93, 0x00, 0x01, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D59, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x7C, 0x62, 0x00, 0x08, 0x32, 0x00, 0x08, 0x02, 0x00, 0x7F, 0x62, 0x00, 0x08, 0x32, 0x00, 0x1C, 0x03, 0x80, 0x3A, 0x1E, 0x00, 0x29, 0x72, 0x00, 0x48, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D5B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x1C, 0x18, 0x00, 0x67, 0xF7, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x13, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D5C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D5D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x20, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x84, 0x00, 0x3E, 0x48, 0x00, 0x02, 0x30, 0x00, 0x00, 0x4C, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D5F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x12, 0x20, 0x00, 0x17, 0xFE, 0x00, 0x1C, 0x20, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x20, 0x00, 0x37, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x64, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D60, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xE2, 0x00, 0x10, 0xB3, 0x00, 0x55, 0x91, 0x00, 0x55, 0x20, 0x00, 0x54, 0x64, 0x00, 0x54, 0xC8, 0x00, 0x54, 0x52, 0x00, 0x54, 0x3F, 0x00, 0x55, 0xE1, 0x80, 0x7C, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D61, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x87, 0x00, 0x01, 0x10, 0x00, 0x03, 0xF8, 0x00, 0x0E, 0x0C, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x31, 0x31, 0x00, 0x07, 0x07, 0x00, 0x09, 0x09, 0x00, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D62, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x55, 0xBB, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x7C, 0x80, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x41, 0x00, 0x03, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D64, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D69, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D6A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x54, 0x7E, 0x00, 0x54, 0x42, 0x00, 0x54, 0x7E, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x55, 0x7E, 0x80, 0x7D, 0x42, 0x80, 0x01, 0x42, 0x80, 0x01, 0x7E, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D6B, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xAA, 0x00, 0x2B, 0xDC, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x8A, 0x00, 0x3F, 0x52, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D6C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x2A, 0x00, 0x01, 0x37, 0x00, 0x02, 0x39, 0x00, 0x0C, 0x20, 0x80, 0x30, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D6D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x54, 0x24, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x55, 0x10, 0x80, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x7C, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x61, 0x00, 0x00, 0xC1, 0x00, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D6F, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x3E, 0x80, 0x00, 0x22, 0xFF, 0x00, 0x21, 0x08, 0x00, 0x02, 0x08, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D70, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x48, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x49, 0x00, 0x54, 0x49, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x49, 0x00, 0x54, 0x49, 0x00, 0x55, 0xFF, 0x00, 0x7C, 0x4C, 0x00, 0x00, 0xCA, 0x00, 0x01, 0x4B, 0x00, 0x02, 0x49, 0x80, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D73, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D74, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x55, 0x24, 0x00, 0x54, 0x50, 0x00, 0x54, 0x88, 0x00, 0x55, 0xFF, 0x00, 0x56, 0x8A, 0x00, 0x54, 0x88, 0x00, 0x54, 0xF8, 0x00, 0x54, 0x88, 0x00, 0x54, 0x88, 0x00, 0x7C, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D76, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x20, 0x80, 0x54, 0x20, 0x80, 0x55, 0xE7, 0x80, 0x55, 0x04, 0x00, 0x55, 0x04, 0x00, 0x55, 0xE7, 0x80, 0x54, 0x61, 0x80, 0x55, 0xA6, 0x80, 0x57, 0x2C, 0x80, 0x7C, 0xE3, 0x80, 0x01, 0xA6, 0x80, 0x03, 0x2C, 0x80, 0x00, 0x61, 0x80, 0x01, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D79, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x7C, 0xC4, 0x00, 0x04, 0x8E, 0x00, 0x05, 0xFB, 0x00, 0x3C, 0x20, 0x00, 0x21, 0xFE, 0x00, 0x21, 0x22, 0x00, 0x3D, 0x22, 0x00, 0x05, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x39, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D7A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x54, 0x63, 0x00, 0x54, 0xA5, 0x00, 0x54, 0x10, 0x00, 0x54, 0x38, 0x00, 0x54, 0xEE, 0x00, 0x57, 0x83, 0x80, 0x54, 0x10, 0x00, 0x7C, 0xE4, 0x00, 0x00, 0x19, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D7E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x12, 0x22, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x0C, 0x6C, 0x00, 0x77, 0x83, 0x80, 0x00, 0x70, 0x00, 0x07, 0x84, 0x00, 0x00, 0x38, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D7F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x38, 0x42, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D81, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x15, 0xFF, 0x80, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x20, 0x00, 0x7D, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x3C, 0x00, 0x01, 0xE7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D82, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x54, 0x44, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D83, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x80, 0x10, 0x41, 0x80, 0x13, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x55, 0xF4, 0x00, 0x55, 0x57, 0x80, 0x55, 0x55, 0x00, 0x55, 0xF5, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0xF5, 0x00, 0x7C, 0x45, 0x00, 0x03, 0xFD, 0x00, 0x00, 0x49, 0x00, 0x00, 0x51, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D84, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xC3, 0x00, 0x04, 0x1E, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xF2, 0x00, 0x04, 0x22, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D87, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9E, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xAD, 0x00, 0x2A, 0xAD, 0x00, 0x3E, 0xBF, 0x00, 0x22, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D88, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x3F, 0x00, 0x22, 0xE9, 0x00, 0x3E, 0x2E, 0x00, 0x02, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0x24, 0x00, 0x32, 0x04, 0x00, 0x62, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D8A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x48, 0x00, 0x3E, 0xFF, 0x00, 0x09, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7E, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x7E, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D8B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x84, 0x80, 0x20, 0x12, 0x80, 0x00, 0x48, 0x80, 0x01, 0x21, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D8C, { 0x00, 0x00, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x24, 0x90, 0x80, 0x62, 0x49, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D90, { 0x00, 0x00, 0x00, 0x41, 0x02, 0x00, 0x41, 0x02, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7C, 0xFC, 0x00, 0x45, 0x8C, 0x00, 0x4B, 0x58, 0x00, 0x50, 0x30, 0x00, 0x50, 0xEC, 0x00, 0x4B, 0xBB, 0x00, 0x48, 0x90, 0x00, 0x49, 0xFF, 0x00, 0x5B, 0x10, 0x00, 0x40, 0xFE, 0x00, 0x40, 0x10, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D92, { 0x00, 0x00, 0x00, 0x10, 0x78, 0x00, 0x10, 0x0C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x55, 0x00, 0x55, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D93, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x10, 0x78, 0x00, 0x10, 0x91, 0x00, 0x10, 0x52, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x54, 0x00, 0x54, 0xD6, 0x00, 0x55, 0x93, 0x00, 0x55, 0x11, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D94, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x1B, 0x3F, 0x00, 0x30, 0x21, 0x00, 0x3F, 0x6B, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x35, 0x1C, 0x00, 0x14, 0x14, 0x00, 0x07, 0xB6, 0x00, 0x3C, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D95, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x48, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x55, 0x88, 0x00, 0x56, 0xFE, 0x00, 0x54, 0x88, 0x00, 0x54, 0x88, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x88, 0x00, 0x54, 0x88, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x01, 0xAB, 0x00, 0x03, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D99, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x92, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x54, 0x54, 0x00, 0x54, 0xD6, 0x00, 0x57, 0x93, 0x80, 0x54, 0x90, 0x00, 0x54, 0xE2, 0x00, 0x55, 0xAF, 0x80, 0x57, 0x2A, 0x00, 0x7C, 0xEA, 0x00, 0x00, 0x5F, 0x80, 0x00, 0xC2, 0x00, 0x01, 0x82, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D9B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x55, 0x45, 0x00, 0x54, 0x82, 0x00, 0x55, 0xFF, 0x00, 0x56, 0x82, 0x80, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5D9D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFA, 0x00, 0x08, 0x14, 0x80, 0x08, 0xA5, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x81, 0x80, 0x2B, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x00, 0x00, 0x20, 0x42, 0x00, 0x00, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5D9F, { 0x00, 0x00, 0x00, 0x10, 0x5E, 0x00, 0x10, 0x81, 0x00, 0x11, 0x7E, 0x80, 0x10, 0x28, 0x00, 0x54, 0xFF, 0x00, 0x54, 0xA9, 0x00, 0x54, 0xCF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x02, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x22, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DA0, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x78, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x24, 0x00, 0x2A, 0x7E, 0x00, 0x2B, 0xA5, 0x80, 0x2A, 0x3C, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xBD, 0x00, 0x3E, 0xA5, 0x00, 0x22, 0xBD, 0x00, 0x00, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DA2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x44, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x74, 0x00, 0x2B, 0x9F, 0x80, 0x2A, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x00, 0x44, 0x00, 0x00, 0x84, 0x80, 0x03, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x42, 0x00, 0x54, 0x24, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DAA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x09, 0x12, 0x00, 0x05, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DAB, { 0x00, 0x00, 0x00, 0x11, 0x29, 0x00, 0x11, 0xAB, 0x00, 0x10, 0xAA, 0x00, 0x11, 0xFF, 0x80, 0x54, 0x42, 0x00, 0x54, 0x24, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x7C, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0xD3, 0x00, 0x01, 0x91, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DAC, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x02, 0x00, 0x55, 0xE9, 0x00, 0x54, 0x88, 0x00, 0x57, 0xFF, 0x80, 0x7C, 0x89, 0x00, 0x00, 0xEA, 0x00, 0x03, 0x84, 0x80, 0x00, 0x8A, 0x80, 0x01, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DAE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x54, 0xC6, 0x00, 0x57, 0x83, 0x80, 0x54, 0x7C, 0x00, 0x54, 0x00, 0x00, 0x55, 0xEF, 0x00, 0x55, 0x29, 0x00, 0x55, 0x29, 0x00, 0x55, 0xEF, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0xC7, 0x00, 0x03, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DB0, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0xEF, 0x80, 0x10, 0xA4, 0x80, 0x11, 0x24, 0x80, 0x55, 0xFB, 0x00, 0x55, 0x52, 0x00, 0x55, 0x5A, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x52, 0x00, 0x55, 0x52, 0x00, 0x55, 0xFF, 0x80, 0x7D, 0x12, 0x00, 0x01, 0x12, 0x00, 0x03, 0x12, 0x00, 0x02, 0x12, 0x00, 0x02, 0x32, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DB2, { 0x00, 0x00, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x79, 0x10, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x38, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x1F, 0x80, 0x43, 0xF0, 0x80, 0x40, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DB4, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x34, 0x00, 0x0F, 0xD4, 0x00, 0x0A, 0xA4, 0x00, 0x0F, 0xFC, 0x00, 0x09, 0xC4, 0x00, 0x0A, 0xA4, 0x00, 0x0C, 0x94, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DB7, { 0x00, 0x00, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x3C, 0x02, 0x00, 0x21, 0x14, 0x00, 0x3F, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x3F, 0x08, 0x80, 0x24, 0x28, 0x00, 0x7F, 0xAF, 0x00, 0x04, 0x28, 0x00, 0x0E, 0x38, 0x00, 0x1B, 0x6E, 0x00, 0x70, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DB8, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x09, 0x54, 0x80, 0x09, 0x75, 0x00, 0x08, 0x4A, 0x00, 0x2A, 0xA9, 0x00, 0x2B, 0x10, 0x80, 0x2B, 0xFF, 0x80, 0x2B, 0x10, 0x80, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x30, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0x11, 0x00, 0x06, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DB9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x01, 0x00, 0x54, 0x7D, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x52, 0x00, 0x01, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DBA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x0A, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x20, 0xBF, 0x00, 0x1F, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x17, 0x3F, 0x00, 0x10, 0x12, 0x00, 0x10, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DBC, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0xCE, 0x00, 0x08, 0xA2, 0x00, 0x2A, 0xBA, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DBD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x21, 0xE3, 0x80, 0x13, 0xF6, 0x00, 0x08, 0x02, 0x00, 0x15, 0xEF, 0x80, 0x24, 0x02, 0x00, 0x0D, 0xE2, 0x00, 0x14, 0x02, 0x00, 0x25, 0xE5, 0x00, 0x05, 0x25, 0x00, 0x05, 0xE9, 0x00, 0x19, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DC3, { 0x00, 0x00, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x11, 0x20, 0x00, 0x0A, 0x3F, 0x00, 0x7F, 0xC1, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x20, 0x80, 0x13, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DC5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x7F, 0xAA, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x13, 0x00, 0x31, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DC7, { 0x00, 0x00, 0x00, 0x10, 0x85, 0x00, 0x10, 0xF5, 0x80, 0x10, 0x84, 0x80, 0x17, 0xF4, 0x00, 0x54, 0x95, 0x80, 0x57, 0xEE, 0x00, 0x54, 0x94, 0x00, 0x54, 0x74, 0x80, 0x54, 0x04, 0x80, 0x55, 0xF7, 0x00, 0x54, 0x03, 0x00, 0x7D, 0xF6, 0x00, 0x05, 0x16, 0x00, 0x05, 0xFA, 0x80, 0x08, 0xA3, 0x80, 0x01, 0xF1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DC9, { 0x00, 0x00, 0x00, 0x10, 0xFC, 0x00, 0x13, 0x08, 0x00, 0x11, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x54, 0xEF, 0x00, 0x54, 0x88, 0x80, 0x55, 0xE7, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x4A, 0x00, 0x00, 0xC8, 0x80, 0x03, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DCB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x3F, 0x7F, 0x80, 0x20, 0x01, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x2F, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x2F, 0x4B, 0x00, 0x78, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DCC, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x2F, 0x88, 0x00, 0x22, 0x1F, 0x80, 0x3F, 0xD2, 0x00, 0x28, 0xB2, 0x00, 0x2F, 0x8A, 0x00, 0x28, 0x8E, 0x00, 0x2F, 0x84, 0x00, 0x68, 0x8E, 0x00, 0x4F, 0x9B, 0x00, 0x18, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DCD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xFF, 0x00, 0x0E, 0x49, 0x00, 0x15, 0x7F, 0x80, 0x24, 0x95, 0x00, 0x3F, 0xD6, 0x80, 0x11, 0x27, 0x00, 0x3A, 0x24, 0x80, 0x06, 0x47, 0x80, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DCE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0x3B, 0x80, 0x55, 0xEA, 0x80, 0x55, 0x3B, 0x80, 0x55, 0x2A, 0x00, 0x55, 0x7A, 0x80, 0x57, 0xAB, 0x80, 0x54, 0x44, 0x00, 0x55, 0xA3, 0x00, 0x7C, 0x7E, 0x00, 0x01, 0xCC, 0x00, 0x00, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x03, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DD0, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x41, 0x02, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x04, 0x00, 0x00, 0x74, 0x00, 0x7F, 0x24, 0x00, 0x41, 0xFF, 0x00, 0x5D, 0x24, 0x00, 0x55, 0x24, 0x00, 0x5D, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DD2, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x08, 0x05, 0x00, 0x35, 0xF9, 0x00, 0x14, 0x06, 0x00, 0x1A, 0xE5, 0x00, 0x3F, 0x0F, 0x80, 0x08, 0xE2, 0x00, 0x2A, 0x0A, 0x80, 0x2A, 0xEA, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DD3, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x26, 0x00, 0x00, 0x3C, 0x7F, 0x80, 0x21, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x52, 0x21, 0x00, 0x5E, 0x3F, 0x00, 0x52, 0x21, 0x00, 0x5E, 0x3F, 0x00, 0x52, 0x21, 0x00, 0x5E, 0x21, 0x00, 0x40, 0x3F, 0x00, 0x7F, 0x12, 0x00, 0x22, 0x33, 0x00, 0x41, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DD6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0x1E, 0x00, 0x09, 0x12, 0x00, 0x0F, 0x1E, 0x00, 0x1F, 0xFF, 0x80, 0x1F, 0x88, 0x00, 0x12, 0x0F, 0x80, 0x1F, 0xD1, 0x00, 0x14, 0xB2, 0x00, 0x17, 0xCA, 0x00, 0x14, 0x84, 0x00, 0x27, 0x8C, 0x00, 0x2C, 0x92, 0x00, 0x20, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DD8, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0xE3, 0x00, 0x10, 0x82, 0x80, 0x17, 0xF2, 0x00, 0x54, 0x8F, 0x80, 0x57, 0xE2, 0x00, 0x54, 0x92, 0x00, 0x57, 0xF2, 0x00, 0x55, 0x22, 0x00, 0x57, 0xF7, 0x00, 0x55, 0x55, 0x00, 0x7E, 0x75, 0x00, 0x04, 0x15, 0x00, 0x05, 0xD5, 0x00, 0x0C, 0x95, 0x00, 0x04, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DD9, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x55, 0x3B, 0x80, 0x55, 0xEA, 0x80, 0x55, 0x3B, 0x80, 0x55, 0x6A, 0x00, 0x57, 0xBB, 0x80, 0x54, 0x44, 0x00, 0x55, 0x83, 0x00, 0x7C, 0x3E, 0x00, 0x03, 0xE4, 0x00, 0x00, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x07, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DDB, { 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x63, 0x00, 0x08, 0xC6, 0x00, 0x18, 0x84, 0x00, 0x11, 0x8C, 0x00, 0x33, 0x18, 0x00, 0x22, 0x10, 0x00, 0x33, 0x18, 0x00, 0x11, 0x8C, 0x00, 0x18, 0x84, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x42, 0x00, 0x0C, 0x63, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DDD, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DDE, { 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x15, 0x29, 0x00, 0x14, 0xA5, 0x00, 0x14, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x24, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x10, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x0C, 0xCC, 0x00, 0x08, 0x88, 0x00, 0x19, 0x98, 0x00, 0x0C, 0xCC, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x92, 0x00, 0x01, 0x24, 0x00, 0x22, 0x48, 0x00, 0x12, 0x44, 0x00, 0x01, 0x24, 0x00, 0x00, 0x92, 0x00, 0x38, 0x92, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE2, { 0x00, 0x00, 0x00, 0x02, 0x22, 0x00, 0x04, 0x44, 0x00, 0x08, 0x88, 0x00, 0x04, 0x44, 0x00, 0x02, 0x22, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DE3, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x19, 0x86, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE4, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x0C, 0xCC, 0x00, 0x19, 0x98, 0x00, 0x0C, 0xCC, 0x00, 0x04, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x13, 0x32, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x32, 0x00, 0x1F, 0xFE, 0x00, 0x14, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x14, 0xA6, 0x00, 0x12, 0x92, 0x80, 0x1C, 0xE3, 0x80, 0x73, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x01, 0x00, 0x0F, 0x01, 0x00, 0x38, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x7E, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0xF4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x38, 0x84, 0x00, 0x60, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x80, 0x01, 0x04, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DEE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DEF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x7D, 0xFF, 0x00, 0x04, 0x40, 0x00, 0x08, 0x40, 0x00, 0x16, 0x84, 0x00, 0x61, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x3E, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x0E, 0xA9, 0x00, 0x79, 0x29, 0x00, 0x22, 0x27, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5DF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF5, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x00, 0x00, 0x34, 0x00, 0x00, 0x24, 0x00, 0x80, 0x66, 0x01, 0x80, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF7, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0B, 0xFA, 0x00, 0x32, 0x09, 0x80, 0x03, 0xF8, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x57, 0x42, 0x00, 0x51, 0x42, 0x00, 0x51, 0x42, 0x00, 0x51, 0x7E, 0x00, 0x57, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DF9, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x20, 0x00, 0x1E, 0xC6, 0x00, 0x02, 0x98, 0x00, 0x02, 0x90, 0x00, 0x0C, 0x88, 0x00, 0x70, 0x87, 0x80, 0x01, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x18, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DFB, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x16, 0x00, 0x70, 0x13, 0x80, 0x07, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x06, 0x06, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DFD, { 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5DFE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x47, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E01, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x94, 0x00, 0x10, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E02, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E03, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x24, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E05, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x24, 0x12, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x04, 0x92, 0x00, 0x08, 0x9A, 0x00, 0x08, 0x94, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E06, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2E, 0x84, 0x00, 0x08, 0x84, 0x80, 0x09, 0x04, 0x80, 0x09, 0x07, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E07, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E08, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x12, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x08, 0x9A, 0x00, 0x08, 0x94, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E0B, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x30, 0x80, 0x1F, 0x1D, 0x80, 0x70, 0x87, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E0C, { 0x00, 0x00, 0x00, 0x0E, 0x06, 0x00, 0x01, 0xD8, 0x00, 0x00, 0x70, 0x00, 0x03, 0x8C, 0x00, 0x3C, 0x82, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x14, 0x42, 0x00, 0x24, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x46, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E0D, { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x1A, 0x21, 0x00, 0x12, 0x21, 0x00, 0x32, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E0F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2E, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x08, 0x15, 0x00, 0x08, 0x12, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E10, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x3F, 0x44, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x42, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x48, 0x00, 0x2E, 0x48, 0x00, 0x08, 0x44, 0x00, 0x08, 0x47, 0x00, 0x08, 0x62, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E11, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x11, 0x0A, 0x00, 0x3E, 0x04, 0x00, 0x05, 0x0A, 0x00, 0x09, 0x31, 0x80, 0x30, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E12, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x4C, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x7F, 0x00, 0x1B, 0xE0, 0x00, 0x28, 0x30, 0x00, 0x08, 0x19, 0x00, 0x08, 0x8F, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x86, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E14, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0x88, 0x80, 0x52, 0x89, 0x00, 0x52, 0x88, 0x00, 0x52, 0xFF, 0x00, 0x52, 0xA1, 0x00, 0x52, 0xA3, 0x00, 0x56, 0xB2, 0x00, 0x10, 0x96, 0x00, 0x11, 0x8C, 0x00, 0x11, 0x1E, 0x00, 0x13, 0x33, 0x00, 0x10, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E15, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x49, 0x40, 0x80, 0x49, 0x40, 0x80, 0x49, 0x40, 0x80, 0x49, 0x40, 0x80, 0x49, 0x7F, 0x80, 0x49, 0x40, 0x80, 0x4B, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E16, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x0F, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E18, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0F, 0x80, 0x70, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E19, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2E, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E1B, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E1C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x3F, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x00, 0x00, 0x2E, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x83, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E1D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E1F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x12, 0x12, 0x00, 0x32, 0x13, 0x00, 0x66, 0x11, 0x80, 0x0C, 0x10, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E20, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E25, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x49, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E26, { 0x00, 0x00, 0x00, 0x04, 0x90, 0x00, 0x04, 0x94, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x82, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E27, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x08, 0x1F, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2E, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E28, { 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x04, 0x00, 0x10, 0x66, 0x00, 0x7E, 0xC3, 0x00, 0x53, 0x81, 0x80, 0x52, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x52, 0x81, 0x00, 0x52, 0x81, 0x00, 0x52, 0xFF, 0x00, 0x56, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x64, 0x80, 0x10, 0x44, 0x80, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E2B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x49, 0x00, 0x20, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x21, 0x49, 0x00, 0x21, 0x49, 0x00, 0x21, 0x49, 0x00, 0x3F, 0x4B, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E2D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E2E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x22, 0x00, 0x04, 0x21, 0x00, 0x7F, 0xA1, 0x00, 0x08, 0x27, 0x00, 0x10, 0x20, 0x00, 0x60, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E2F, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E30, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x02, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x02, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x13, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E31, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x3E, 0x20, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x20, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xFF, 0x00, 0x2E, 0x84, 0x00, 0x29, 0x44, 0x00, 0x0A, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E32, { 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x10, 0x33, 0x00, 0x10, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x52, 0xF7, 0x80, 0x52, 0x22, 0x00, 0x52, 0x22, 0x00, 0x52, 0x22, 0x00, 0x52, 0x32, 0x00, 0x52, 0xE7, 0x80, 0x56, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x62, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x11, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E33, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x40, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x48, 0x00, 0x2A, 0x49, 0x00, 0x2E, 0x4A, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7A, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E35, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x55, 0x01, 0x00, 0x54, 0x80, 0x00, 0x54, 0xEF, 0x00, 0x54, 0xA9, 0x00, 0x55, 0xA9, 0x00, 0x55, 0x29, 0x00, 0x54, 0xA9, 0x00, 0x10, 0x6B, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x80, 0x10, 0xC9, 0x80, 0x11, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E36, { 0x00, 0x00, 0x00, 0x09, 0x14, 0x00, 0x09, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x15, 0x00, 0x09, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4E, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E37, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x36, 0x00, 0x10, 0x24, 0x00, 0x7E, 0x7F, 0x80, 0x52, 0xC8, 0x00, 0x53, 0x48, 0x00, 0x52, 0x48, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x48, 0x00, 0x52, 0x48, 0x00, 0x56, 0x48, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E38, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E3B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x08, 0x90, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x43, 0x00, 0x09, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E3C, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x9A, 0x00, 0x2A, 0x96, 0x00, 0x2E, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E3D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E3E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x11, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x12, 0x00, 0x52, 0x16, 0x00, 0x52, 0x14, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x08, 0x00, 0x52, 0x14, 0x00, 0x52, 0x7F, 0x00, 0x56, 0xC1, 0x00, 0x11, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E3F, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x5E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0xFF, 0x80, 0x2B, 0x88, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x9F, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xC4, 0x00, 0x2A, 0xFF, 0x80, 0x2E, 0x84, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x91, 0x00, 0x08, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E40, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0F, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x4F, 0xFA, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x90, 0x00, 0x0F, 0xF8, 0x00, 0x14, 0x97, 0x00, 0x64, 0x92, 0x00, 0x04, 0xB0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E43, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0x7E, 0x00, 0x52, 0x42, 0x00, 0x52, 0x7E, 0x00, 0x52, 0x04, 0x00, 0x56, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E44, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x90, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xA7, 0x80, 0x2A, 0xF8, 0x80, 0x2A, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x08, 0xBF, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E45, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E47, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x82, 0x00, 0x04, 0x22, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E49, { 0x00, 0x00, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x92, 0x00, 0x52, 0x92, 0x00, 0x52, 0x9E, 0x00, 0x52, 0x80, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x56, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x10, 0x93, 0x00, 0x11, 0x91, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E4B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x15, 0x23, 0x80, 0x7F, 0xC0, 0x00, 0x11, 0x3F, 0x00, 0x15, 0x13, 0x00, 0x35, 0x0C, 0x00, 0x63, 0x37, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E4C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x54, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x24, 0x00, 0x2E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E4E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x7D, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x7C, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x7C, 0x00, 0x5C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E50, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x34, 0x48, 0x00, 0x2C, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x86, 0x00, 0x25, 0xA3, 0x00, 0x37, 0x21, 0x80, 0x2D, 0xFE, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x65, 0x2E, 0x00, 0x4C, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E51, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x1A, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x32, 0xAF, 0x80, 0x63, 0xE9, 0x00, 0x08, 0x19, 0x00, 0x1B, 0xE5, 0x00, 0x10, 0x85, 0x00, 0x30, 0x85, 0x00, 0x73, 0xE7, 0x00, 0x12, 0xA2, 0x00, 0x12, 0xA2, 0x00, 0x12, 0xA7, 0x00, 0x12, 0xA5, 0x00, 0x10, 0x8D, 0x80, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E54, { 0x00, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x7C, 0x42, 0x00, 0x54, 0x7E, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x24, 0x80, 0x55, 0xFF, 0x80, 0x54, 0x00, 0x00, 0x5D, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x24, 0x00, 0x10, 0x18, 0x00, 0x10, 0x76, 0x00, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E55, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x45, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x4C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E56, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0xA4, 0x80, 0x52, 0xA4, 0x80, 0x52, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x00, 0x00, 0x56, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xCB, 0x00, 0x11, 0x89, 0x80, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E57, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x80, 0x7D, 0x0A, 0x80, 0x55, 0xFF, 0x80, 0x55, 0x04, 0x80, 0x55, 0x74, 0x80, 0x55, 0x55, 0x80, 0x55, 0x76, 0x80, 0x55, 0x04, 0x80, 0x5D, 0x75, 0x80, 0x11, 0x0B, 0x80, 0x11, 0x32, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E58, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x52, 0x08, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x56, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x22, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E5B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x42, 0x00, 0x52, 0x24, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x52, 0xFF, 0x00, 0x56, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E5C, { 0x00, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x56, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x52, 0x00, 0x10, 0xD3, 0x00, 0x11, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E5E, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x11, 0x24, 0x80, 0x10, 0xA5, 0x00, 0x7E, 0x24, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x42, 0x00, 0x52, 0x24, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x56, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x10, 0x66, 0x00, 0x10, 0xC3, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E5F, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x49, 0x00, 0x09, 0xF8, 0x00, 0x3E, 0xA8, 0x00, 0x2A, 0xA8, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0xE9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xEA, 0x00, 0x2E, 0xA4, 0x00, 0x08, 0xE4, 0x00, 0x08, 0xAA, 0x80, 0x08, 0x31, 0x80, 0x08, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E61, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x3F, 0xFF, 0x80, 0x2A, 0x1C, 0x00, 0x2A, 0x6A, 0x00, 0x2B, 0x89, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E62, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E63, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0x88, 0x00, 0x24, 0x5F, 0x80, 0x04, 0x11, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xD4, 0x00, 0x2E, 0x8C, 0x00, 0x35, 0x8A, 0x00, 0x24, 0x91, 0x80, 0x25, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E64, { 0x00, 0x00, 0x00, 0x2A, 0x20, 0x00, 0x6B, 0x20, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x44, 0x00, 0x41, 0xEC, 0x00, 0x5D, 0x38, 0x00, 0x55, 0x10, 0x00, 0x5D, 0x3C, 0x00, 0x43, 0x67, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x21, 0x1C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E68, { 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x48, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x92, 0x00, 0x52, 0xE3, 0x80, 0x52, 0x9E, 0x00, 0x52, 0x80, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x80, 0x00, 0x52, 0x9E, 0x00, 0x56, 0x80, 0x00, 0x10, 0x9E, 0x00, 0x10, 0x80, 0x00, 0x10, 0xBF, 0x00, 0x11, 0x21, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E6A, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0x80, 0x80, 0x52, 0x7F, 0x00, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x10, 0x00, 0x52, 0x68, 0x80, 0x56, 0x95, 0x00, 0x10, 0x6E, 0x00, 0x10, 0x95, 0x00, 0x10, 0x25, 0x00, 0x10, 0xC4, 0x80, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E6B, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x7F, 0x80, 0x04, 0x02, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x1A, 0x00, 0x3F, 0x4A, 0x00, 0x04, 0x82, 0x00, 0x7F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E6C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x00, 0x80, 0x54, 0xFE, 0x80, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x01, 0x00, 0x13, 0xDF, 0x80, 0x12, 0x49, 0x00, 0x13, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E6D, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x29, 0x00, 0x55, 0x29, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x04, 0x80, 0x55, 0xFF, 0x80, 0x55, 0x04, 0x00, 0x11, 0x85, 0x00, 0x11, 0x45, 0x00, 0x13, 0x06, 0x80, 0x12, 0x0A, 0x80, 0x16, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E6E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x41, 0x00, 0x53, 0xF9, 0x00, 0x52, 0x41, 0x00, 0x52, 0xF7, 0x80, 0x52, 0x01, 0x00, 0x52, 0xF5, 0x00, 0x52, 0x95, 0x00, 0x56, 0xF5, 0x00, 0x12, 0x01, 0x00, 0x12, 0x91, 0x00, 0x12, 0xD1, 0x00, 0x14, 0x79, 0x00, 0x11, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E70, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x7E, 0xFE, 0x80, 0x54, 0x10, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x11, 0x80, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x29, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0x4B, 0x00, 0x11, 0x45, 0x80, 0x13, 0x3C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E74, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E76, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E77, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xC8, 0x00, 0x3C, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E78, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E79, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E7A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x06, 0x40, 0x00, 0x02, 0xC0, 0x00, 0x01, 0x84, 0x00, 0x03, 0x06, 0x00, 0x06, 0x02, 0x00, 0x0C, 0x3F, 0x00, 0x1F, 0xE1, 0x00, 0x70, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E7B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x12, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x09, 0x01, 0x00, 0x08, 0x81, 0x00, 0x13, 0xC2, 0x00, 0x3C, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E7C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x29, 0x09, 0x00, 0x11, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x06, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x13, 0xD1, 0x00, 0x3C, 0x51, 0x00, 0x00, 0x21, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E7D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x22, 0x48, 0x80, 0x22, 0x48, 0x80, 0x34, 0x50, 0x80, 0x29, 0x64, 0x80, 0x25, 0x54, 0x80, 0x22, 0x48, 0x80, 0x25, 0x52, 0x80, 0x2B, 0xEF, 0x80, 0x3C, 0xF1, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E7E, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x94, 0x00, 0x34, 0xA4, 0x00, 0x08, 0x99, 0x00, 0x0A, 0x93, 0x00, 0x17, 0xFC, 0x80, 0x39, 0x88, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x14, 0x18, 0x00, 0x12, 0x38, 0x80, 0x20, 0xC6, 0x80, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E7F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E80, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x06, 0x00, 0x11, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x31, 0x00, 0x00, 0x21, 0x00, 0x80, 0x61, 0x81, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E81, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E83, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0x88, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x04, 0x00, 0x13, 0x06, 0x00, 0x32, 0x02, 0x00, 0x22, 0x3F, 0x00, 0x67, 0xE1, 0x00, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E84, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E86, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x22, 0x08, 0x00, 0x44, 0x07, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E87, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x39, 0x80, 0x11, 0xCE, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0xE8, 0x80, 0x27, 0x0F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E8A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x60, 0x00, 0x10, 0xB0, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x28, 0x00, 0x12, 0x24, 0x00, 0x24, 0x22, 0x00, 0x28, 0x21, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E8B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x86, 0x00, 0x10, 0xCC, 0x00, 0x30, 0x78, 0x00, 0x20, 0x30, 0x00, 0x60, 0xF8, 0x00, 0x07, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E8E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x70, 0x00, 0x10, 0xD8, 0x00, 0x11, 0x8C, 0x00, 0x13, 0x06, 0x00, 0x1E, 0x8B, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x30, 0x88, 0x00, 0x21, 0x88, 0x00, 0x61, 0x08, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E8F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x90, 0x00, 0x10, 0x60, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x21, 0x00, 0x10, 0x22, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E90, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x12, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E91, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x08, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x21, 0x20, 0x00, 0x21, 0x21, 0x00, 0x42, 0x21, 0x00, 0x0C, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E93, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x00, 0x00, 0x12, 0x40, 0x00, 0x14, 0x48, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E94, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x14, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x20, 0x10, 0x00, 0x20, 0x22, 0x00, 0x4F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E95, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x13, 0xD0, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xF4, 0x00, 0x1F, 0x04, 0x80, 0x20, 0x02, 0x80, 0x21, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E96, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x17, 0xF2, 0x00, 0x1C, 0x12, 0x00, 0x10, 0x12, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x0E, 0x00, 0x32, 0x00, 0x00, 0x22, 0x00, 0x80, 0x63, 0x01, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E97, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E99, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x17, 0xFC, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x47, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E9A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x23, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5E9C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x15, 0x02, 0x00, 0x19, 0x22, 0x00, 0x11, 0x12, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x21, 0x02, 0x00, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E9E, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x00, 0x00, 0x21, 0x20, 0x00, 0x21, 0x14, 0x00, 0x3F, 0xFE, 0x00, 0x21, 0x40, 0x00, 0x21, 0x40, 0x00, 0x22, 0x44, 0x00, 0x22, 0x48, 0x00, 0x22, 0x50, 0x00, 0x24, 0x61, 0x00, 0x25, 0xC1, 0x00, 0x48, 0x41, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5E9F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x12, 0x48, 0x00, 0x12, 0x44, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x12, 0x88, 0x00, 0x12, 0x50, 0x00, 0x14, 0x20, 0x00, 0x18, 0x58, 0x00, 0x21, 0x87, 0x00, 0x46, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EA0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EA2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EA4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x31, 0x84, 0x00, 0x20, 0x84, 0x00, 0x60, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EA5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x13, 0x7F, 0x80, 0x12, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x1A, 0x2A, 0x00, 0x12, 0x6B, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0xC9, 0x80, 0x62, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EA6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x70, 0x00, 0x21, 0x8C, 0x00, 0x2E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EA7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x12, 0xAA, 0x00, 0x14, 0xB2, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EA8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x24, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x70, 0x00, 0x11, 0xC0, 0x00, 0x1F, 0x7E, 0x00, 0x10, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EAA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x80, 0x17, 0x88, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x23, 0x00, 0x13, 0xA2, 0x00, 0x16, 0x36, 0x00, 0x32, 0x1C, 0x00, 0x22, 0x1C, 0x00, 0x62, 0x36, 0x00, 0x06, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EAB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EAC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x12, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x04, 0x00, 0x12, 0x88, 0x00, 0x12, 0xB2, 0x00, 0x12, 0x84, 0x00, 0x12, 0x89, 0x00, 0x12, 0xB2, 0x00, 0x32, 0x84, 0x00, 0x26, 0xB8, 0x80, 0x64, 0xC0, 0x80, 0x0C, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EAD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x17, 0xC7, 0x00, 0x10, 0xBC, 0x00, 0x11, 0x04, 0x00, 0x12, 0x04, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x84, 0x00, 0x14, 0x84, 0x00, 0x13, 0x3F, 0x00, 0x22, 0x80, 0x00, 0x24, 0x7F, 0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EB1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x11, 0x88, 0x00, 0x17, 0x4F, 0x80, 0x10, 0xFC, 0x00, 0x11, 0x84, 0x00, 0x37, 0x4C, 0x00, 0x20, 0x30, 0x00, 0x60, 0xDC, 0x00, 0x07, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EB3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x42, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x11, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EB5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xA8, 0x00, 0x13, 0x26, 0x00, 0x1C, 0x21, 0x80, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x20, 0x20, 0x80, 0x20, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EB6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x22, 0x44, 0x80, 0x24, 0x44, 0x80, 0x28, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EB7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFC, 0x00, 0x14, 0x62, 0x00, 0x12, 0x64, 0x00, 0x10, 0xD8, 0x00, 0x11, 0x48, 0x00, 0x12, 0x46, 0x00, 0x2C, 0x41, 0x80, 0x21, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EB8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x22, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EB9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x13, 0xF8, 0x00, 0x12, 0x08, 0x00, 0x13, 0xF8, 0x00, 0x12, 0x40, 0x00, 0x22, 0x20, 0x00, 0x24, 0x18, 0x00, 0x44, 0x07, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EBD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x34, 0x29, 0x00, 0x24, 0x7D, 0x00, 0x65, 0xC5, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EBE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x11, 0xA0, 0x00, 0x16, 0x2F, 0x00, 0x14, 0x21, 0x00, 0x17, 0xAF, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x20, 0x88, 0x00, 0x23, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EBF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x62, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EC1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x27, 0xC1, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x27, 0xC9, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x27, 0xC9, 0x00, 0x24, 0x49, 0x00, 0x64, 0x41, 0x00, 0x47, 0xC1, 0x00, 0x42, 0x81, 0x00, 0x0C, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EC2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x13, 0x9F, 0x00, 0x15, 0x51, 0x00, 0x15, 0x11, 0x00, 0x19, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x21, 0x11, 0x00, 0x21, 0x1F, 0x00, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EC3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x17, 0xE2, 0x00, 0x10, 0x54, 0x80, 0x14, 0x89, 0x00, 0x13, 0x06, 0x00, 0x1D, 0xFD, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x30, 0x88, 0x00, 0x21, 0x88, 0x80, 0x63, 0x09, 0x80, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EC6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x42, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x11, 0x2A, 0x00, 0x31, 0x2B, 0x00, 0x23, 0x2D, 0x00, 0x62, 0x30, 0x80, 0x06, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EC8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFC, 0x00, 0x12, 0x88, 0x00, 0x2C, 0x70, 0x00, 0x21, 0xD8, 0x00, 0x2E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EC9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xEE, 0x00, 0x17, 0xB8, 0x00, 0x10, 0x90, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x90, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x98, 0x00, 0x22, 0x94, 0x00, 0x24, 0x92, 0x00, 0x28, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ECA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x92, 0x00, 0x17, 0x94, 0x00, 0x14, 0x92, 0x00, 0x17, 0x91, 0x00, 0x14, 0x11, 0x00, 0x14, 0x91, 0x00, 0x14, 0x51, 0x00, 0x17, 0xD6, 0x00, 0x2C, 0x50, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ECB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0xA0, 0x00, 0x13, 0x2E, 0x00, 0x12, 0x22, 0x00, 0x13, 0xAE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x30, 0x88, 0x00, 0x20, 0x70, 0x00, 0x61, 0xDC, 0x00, 0x0F, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ECC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x30, 0x00, 0x80, 0x25, 0x24, 0x80, 0x6D, 0xB6, 0x80, 0x08, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ECE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x08, 0x00, 0x15, 0xBF, 0x00, 0x17, 0x21, 0x00, 0x14, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x14, 0x3F, 0x00, 0x14, 0xA1, 0x00, 0x34, 0xA1, 0x00, 0x23, 0xBF, 0x00, 0x60, 0x12, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ECF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x2F, 0x9E, 0x00, 0x28, 0x92, 0x00, 0x2F, 0x92, 0x00, 0x28, 0x93, 0x80, 0x28, 0xA0, 0x00, 0x2F, 0x80, 0x00, 0x20, 0x3F, 0x00, 0x29, 0x91, 0x00, 0x6F, 0x0A, 0x00, 0x48, 0x04, 0x00, 0x48, 0x8A, 0x00, 0x07, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ED0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x17, 0xBF, 0x00, 0x14, 0x94, 0x00, 0x17, 0x94, 0x00, 0x14, 0xA4, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x0C, 0x00, 0x14, 0x6C, 0x00, 0x15, 0x94, 0x00, 0x16, 0x14, 0x00, 0x24, 0x64, 0x80, 0x27, 0xC4, 0x80, 0x20, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ED1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x23, 0xFE, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ED2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x1F, 0xDF, 0x80, 0x11, 0x31, 0x00, 0x11, 0x21, 0x00, 0x1F, 0xF1, 0x00, 0x11, 0x13, 0x00, 0x11, 0x1A, 0x00, 0x1F, 0xEE, 0x00, 0x12, 0x04, 0x00, 0x33, 0xCE, 0x00, 0x26, 0x4A, 0x00, 0x64, 0x5B, 0x00, 0x0C, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ED3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x1F, 0xEF, 0x00, 0x10, 0x09, 0x00, 0x17, 0xC9, 0x00, 0x14, 0x4A, 0x00, 0x17, 0xC9, 0x00, 0x10, 0x08, 0x80, 0x17, 0xC8, 0x80, 0x10, 0x88, 0x80, 0x11, 0xF8, 0x80, 0x2F, 0x08, 0x80, 0x21, 0x0B, 0x00, 0x23, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ED4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x31, 0x08, 0x00, 0x23, 0x90, 0x00, 0x60, 0xF8, 0x00, 0x07, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5ED5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x2F, 0x1C, 0x00, 0x29, 0x36, 0x00, 0x29, 0x6B, 0x00, 0x2A, 0xC1, 0x80, 0x2A, 0x3E, 0x00, 0x29, 0x04, 0x00, 0x29, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x2B, 0x00, 0x00, 0x68, 0xFF, 0x80, 0x48, 0x12, 0x00, 0x48, 0x27, 0x00, 0x08, 0xFD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5ED6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x45, 0x00, 0x12, 0xCB, 0x00, 0x15, 0x55, 0x00, 0x12, 0xCB, 0x00, 0x10, 0x30, 0x00, 0x10, 0x48, 0x00, 0x11, 0xB6, 0x00, 0x16, 0xC9, 0x80, 0x13, 0x30, 0x00, 0x23, 0xC6, 0x00, 0x20, 0x38, 0x00, 0x27, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EDA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x02, 0x00, 0x17, 0xC2, 0x00, 0x11, 0x02, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x17, 0xD2, 0x00, 0x14, 0x4A, 0x00, 0x17, 0xC2, 0x00, 0x14, 0x82, 0x00, 0x22, 0xE2, 0x00, 0x2F, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EDB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x13, 0xFE, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x91, 0x00, 0x13, 0x2F, 0x00, 0x1C, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EDC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x01, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x24, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x64, 0x00, 0x29, 0xFE, 0x00, 0x6E, 0x82, 0x00, 0x58, 0xFE, 0x00, 0x50, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EDD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x24, 0x83, 0x00, 0x2F, 0xDE, 0x00, 0x24, 0x90, 0x00, 0x27, 0x9F, 0x80, 0x24, 0x92, 0x00, 0x27, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x6F, 0xD2, 0x00, 0x44, 0x92, 0x00, 0x4C, 0xD2, 0x00, 0x18, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EDE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x27, 0x08, 0x00, 0x25, 0x88, 0x00, 0x2C, 0xCF, 0x80, 0x28, 0x78, 0x80, 0x3F, 0xD1, 0x80, 0x21, 0x35, 0x00, 0x2F, 0xC4, 0x00, 0x21, 0x04, 0x00, 0x2D, 0x44, 0x00, 0x65, 0x0E, 0x00, 0x41, 0xCA, 0x00, 0x47, 0x1B, 0x00, 0x1C, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EDF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x0F, 0x00, 0x1F, 0xE9, 0x00, 0x11, 0x0D, 0x00, 0x17, 0xCB, 0x00, 0x14, 0x49, 0x00, 0x17, 0xCD, 0x00, 0x14, 0x4B, 0x00, 0x17, 0xC9, 0x00, 0x11, 0x09, 0x00, 0x2F, 0xE9, 0x00, 0x21, 0x11, 0x00, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EE0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x14, 0x94, 0x00, 0x18, 0x8F, 0x80, 0x10, 0x89, 0x00, 0x17, 0xF9, 0x00, 0x14, 0x15, 0x00, 0x15, 0xD5, 0x00, 0x15, 0x56, 0x00, 0x15, 0x52, 0x00, 0x15, 0x55, 0x00, 0x25, 0xD5, 0x00, 0x24, 0x15, 0x00, 0x24, 0x38, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EE1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x24, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x34, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x2F, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x44, 0x92, 0x00, 0x4C, 0xDB, 0x00, 0x18, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EE2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x17, 0xD9, 0x00, 0x10, 0x4A, 0x00, 0x11, 0x86, 0x00, 0x1E, 0x01, 0x80, 0x17, 0x9C, 0x00, 0x10, 0x95, 0x00, 0x17, 0xA7, 0x00, 0x14, 0x40, 0x00, 0x17, 0xBF, 0x00, 0x10, 0x92, 0x00, 0x10, 0x8C, 0x00, 0x20, 0x96, 0x00, 0x23, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EE3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0xF8, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EE5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x70, 0x00, 0x10, 0x88, 0x00, 0x11, 0x74, 0x00, 0x12, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x1A, 0xAA, 0x80, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x31, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x61, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EE8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x27, 0xBF, 0x00, 0x28, 0x89, 0x00, 0x31, 0x09, 0x00, 0x2F, 0xD3, 0x00, 0x2A, 0x40, 0x00, 0x2F, 0xD4, 0x00, 0x2A, 0x5F, 0x00, 0x2F, 0xE4, 0x00, 0x68, 0x44, 0x00, 0x48, 0x7F, 0x80, 0x48, 0x44, 0x00, 0x11, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EE9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x22, 0x02, 0x00, 0x22, 0xFA, 0x00, 0x22, 0x8A, 0x00, 0x22, 0xFA, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x20, 0x03, 0x00, 0x27, 0xFE, 0x00, 0x60, 0x20, 0x00, 0x4F, 0xFF, 0x80, 0x41, 0x24, 0x00, 0x0E, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EEA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x15, 0x14, 0x00, 0x15, 0xF4, 0x00, 0x15, 0x14, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x13, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x2F, 0xFE, 0x00, 0x21, 0x50, 0x00, 0x46, 0x4C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EEB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x2F, 0xF7, 0x80, 0x29, 0x31, 0x80, 0x29, 0x52, 0x80, 0x29, 0x31, 0x80, 0x2F, 0x52, 0x80, 0x29, 0x08, 0x00, 0x29, 0x36, 0x00, 0x2F, 0xC5, 0x80, 0x29, 0x38, 0x00, 0x69, 0x03, 0x00, 0x49, 0x3C, 0x00, 0x59, 0x01, 0x80, 0x13, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EEC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x5F, 0x00, 0x17, 0xE0, 0x00, 0x14, 0x7F, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x29, 0x29, 0x00, 0x2B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EF0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3F, 0x88, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x2F, 0x7F, 0x00, 0x29, 0x55, 0x00, 0x29, 0x55, 0x00, 0x2F, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x69, 0x15, 0x00, 0x4F, 0x50, 0x80, 0x59, 0x52, 0x00, 0x01, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EF1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x32, 0x49, 0x00, 0x29, 0x2A, 0x00, 0x20, 0x1F, 0x80, 0x27, 0xB2, 0x00, 0x24, 0x92, 0x00, 0x27, 0x9F, 0x80, 0x20, 0x12, 0x00, 0x2F, 0xD2, 0x00, 0x2A, 0x5F, 0x80, 0x6F, 0xD2, 0x00, 0x48, 0x12, 0x00, 0x48, 0x52, 0x00, 0x07, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EF3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x1F, 0xE4, 0x00, 0x14, 0xBF, 0x80, 0x17, 0x88, 0x00, 0x14, 0xBF, 0x80, 0x17, 0xAA, 0x80, 0x15, 0xBF, 0x80, 0x1E, 0x80, 0x00, 0x1F, 0xBF, 0x80, 0x12, 0x88, 0x00, 0x1F, 0x95, 0x00, 0x12, 0xB2, 0x80, 0x2F, 0xDE, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x28, 0x00, 0x00, 0x38, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EF6, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x1C, 0x00, 0x04, 0x68, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x48, 0x00, 0x1E, 0x4F, 0x00, 0x22, 0x48, 0x00, 0x02, 0x48, 0x00, 0x22, 0x48, 0x00, 0x24, 0x48, 0x00, 0x15, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x02, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x24, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EF8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x05, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x2D, 0x11, 0x00, 0x29, 0x11, 0x00, 0x39, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EFA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x05, 0xFE, 0x00, 0x08, 0x12, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x12, 0x00, 0x11, 0xFE, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x16, 0x10, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x10, 0xA5, 0x00, 0x3E, 0xA5, 0x00, 0x02, 0xA5, 0x00, 0x02, 0xBD, 0x00, 0x02, 0xA5, 0x00, 0x24, 0x81, 0x00, 0x14, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x0C, 0x81, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x04, 0x28, 0x00, 0x08, 0x28, 0x00, 0x10, 0xFF, 0x00, 0x3C, 0xA9, 0x00, 0x04, 0xA9, 0x00, 0x04, 0xA9, 0x00, 0x24, 0xAF, 0x00, 0x34, 0xC1, 0x00, 0x1C, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x00, 0x00, 0x33, 0x80, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5EFE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5EFF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F00, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F01, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0x81, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x01, 0x00, 0x18, 0x03, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F03, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x1F, 0x96, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F06, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x1F, 0x86, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F07, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F08, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x12, 0x12, 0x00, 0x36, 0x13, 0x00, 0x6C, 0x71, 0x80, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F09, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F0A, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x24, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0x91, 0x00, 0x2E, 0xAA, 0x00, 0x35, 0xC4, 0x00, 0x24, 0x8A, 0x00, 0x25, 0x91, 0x80, 0x00, 0x60, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F0B, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F0C, { 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x23, 0x00, 0x00, 0x21, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x98, 0x00, 0x00, 0x08, 0x80, 0x00, 0x0D, 0x80, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F0D, { 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x23, 0x00, 0x00, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x80, 0x7F, 0xCD, 0x80, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F0E, { 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x23, 0x00, 0x00, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x80, 0x7F, 0xCD, 0x80, 0x00, 0x07, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F0F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xE0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0xE8, 0x00, 0x3C, 0x04, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F10, { 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x1F, 0x23, 0x00, 0x00, 0x21, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x98, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x01, 0xC4, 0x00, 0x1F, 0x06, 0x80, 0x70, 0x03, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F11, { 0x00, 0x00, 0x00, 0x11, 0x05, 0x00, 0x0A, 0x04, 0x80, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x7F, 0x80, 0x20, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x7C, 0x00, 0x3F, 0x94, 0x00, 0x0C, 0x14, 0x00, 0x0E, 0x14, 0x00, 0x15, 0x14, 0x00, 0x14, 0x12, 0x00, 0x24, 0x1E, 0x80, 0x04, 0x61, 0x80, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x80, 0x00, 0x40, 0x80, 0x00, 0x41, 0x00, 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F15, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x1F, 0x81, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0x81, 0x00, 0x20, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F17, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x21, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x11, 0x00, 0x30, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F18, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x3F, 0x20, 0x00, 0x21, 0x20, 0x00, 0x01, 0x22, 0x00, 0x01, 0x41, 0x00, 0x01, 0x41, 0x00, 0x01, 0x4F, 0x80, 0x03, 0xF8, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F1B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x02, 0x48, 0x00, 0x02, 0x4B, 0x00, 0x1E, 0x4D, 0x00, 0x10, 0x59, 0x00, 0x20, 0xE9, 0x00, 0x3F, 0x49, 0x00, 0x21, 0x49, 0x00, 0x01, 0x49, 0x00, 0x01, 0x4B, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48, 0x80, 0x01, 0x40, 0x80, 0x02, 0x7F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x3F, 0x3F, 0x80, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x3F, 0x3F, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x03, 0x01, 0x80, 0x02, 0x01, 0x00, 0x06, 0x03, 0x00, 0x1C, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x05, 0x11, 0x00, 0x05, 0x11, 0x00, 0x05, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x21, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x80, 0x0D, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F1F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xC0, 0x80, 0x11, 0x40, 0x80, 0x02, 0x40, 0x80, 0x04, 0x41, 0x00, 0x08, 0x46, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F20, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x7E, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x88, 0x00, 0x04, 0x90, 0x00, 0x3C, 0xA0, 0x00, 0x20, 0x82, 0x00, 0x23, 0xFF, 0x00, 0x20, 0xA0, 0x00, 0x3C, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x88, 0x00, 0x04, 0xA7, 0x00, 0x28, 0xC2, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x3C, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F22, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7D, 0x11, 0x00, 0x05, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x21, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0xC6, 0x00, 0x3C, 0x6C, 0x00, 0x04, 0x38, 0x00, 0x04, 0x10, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x3B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F23, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x04, 0xC2, 0x00, 0x04, 0x82, 0x00, 0x05, 0xBF, 0x80, 0x3D, 0x82, 0x00, 0x22, 0x82, 0x00, 0x24, 0x92, 0x00, 0x20, 0x9A, 0x00, 0x3C, 0x8A, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x38, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F24, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7C, 0x0E, 0x00, 0x04, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x04, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x20, 0xFF, 0x80, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3C, 0x8C, 0x00, 0x04, 0x84, 0x00, 0x04, 0xE4, 0x00, 0x07, 0x86, 0x00, 0x0C, 0x02, 0x80, 0x0B, 0xFB, 0x80, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F25, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x3D, 0x88, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0xC9, 0x80, 0x04, 0x88, 0x80, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F26, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x20, 0x20, 0x00, 0x20, 0xC4, 0x00, 0x3E, 0x48, 0x00, 0x02, 0x30, 0x00, 0x02, 0x10, 0x00, 0x02, 0x22, 0x00, 0x02, 0x41, 0x00, 0x02, 0x8F, 0x80, 0x03, 0xF0, 0x80, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F27, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x1C, 0x00, 0x04, 0xE4, 0x00, 0x04, 0xA4, 0x00, 0x04, 0xA4, 0x00, 0x3C, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x3C, 0xA4, 0x00, 0x04, 0xA4, 0x00, 0x04, 0xA2, 0x00, 0x04, 0xA2, 0x00, 0x04, 0xAA, 0x00, 0x05, 0x3D, 0x00, 0x05, 0xC5, 0x00, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x61, 0x00, 0x3C, 0x43, 0x00, 0x20, 0xC2, 0x00, 0x21, 0x8E, 0x00, 0x20, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x04, 0x81, 0x00, 0x04, 0x81, 0x00, 0x0C, 0x81, 0x00, 0x08, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F29, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xA1, 0x00, 0x11, 0x12, 0x00, 0x12, 0x0C, 0x00, 0x2C, 0x0C, 0x00, 0x0A, 0x12, 0x00, 0x11, 0x61, 0x80, 0x2F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F2A, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xFE, 0x00, 0x02, 0x04, 0x00, 0x02, 0x18, 0x00, 0x02, 0x2C, 0x00, 0x3E, 0x43, 0x00, 0x21, 0x81, 0x00, 0x20, 0x04, 0x00, 0x20, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x12, 0x00, 0x15, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x01, 0x44, 0x00, 0x01, 0x44, 0x00, 0x01, 0x44, 0x00, 0x3F, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x01, 0x44, 0x00, 0x01, 0x44, 0x00, 0x03, 0x44, 0x00, 0x02, 0x44, 0x00, 0x06, 0x7F, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x01, 0x44, 0x00, 0x01, 0x44, 0x00, 0x01, 0x44, 0x00, 0x3F, 0x57, 0x00, 0x20, 0x51, 0x00, 0x20, 0x51, 0x00, 0x20, 0x51, 0x00, 0x3F, 0x57, 0x00, 0x01, 0x44, 0x00, 0x01, 0x44, 0x00, 0x03, 0x44, 0x00, 0x02, 0x44, 0x00, 0x06, 0x7F, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x20, 0x42, 0x00, 0x20, 0x42, 0x00, 0x20, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x05, 0xC2, 0x00, 0x0C, 0x02, 0x00, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F2E, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0B, 0xF4, 0x00, 0x10, 0x12, 0x00, 0x67, 0xF1, 0x80, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F2F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x12, 0x12, 0x00, 0x32, 0x13, 0x00, 0x64, 0x11, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F30, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x05, 0x93, 0x00, 0x05, 0x11, 0x00, 0x04, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x3D, 0x01, 0x00, 0x05, 0x01, 0x00, 0x05, 0xFF, 0x00, 0x05, 0x01, 0x00, 0x0D, 0x01, 0x00, 0x09, 0x01, 0x00, 0x39, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x20, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x22, 0xA4, 0x80, 0x04, 0x88, 0x80, 0x09, 0x91, 0x80, 0x32, 0xE2, 0x80, 0x04, 0x84, 0x80, 0x08, 0x98, 0x80, 0x31, 0x60, 0x80, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F34, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x3C, 0x06, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x02, 0x40, 0x00, 0x02, 0x7E, 0x00, 0x02, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x90, 0x00, 0x02, 0x91, 0x00, 0x02, 0x8A, 0x00, 0x02, 0x8C, 0x00, 0x02, 0x84, 0x00, 0x04, 0xF2, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F36, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x0D, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F37, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x42, 0x00, 0x04, 0xC2, 0x00, 0x04, 0x9F, 0x00, 0x05, 0xF1, 0x80, 0x3C, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x21, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x11, 0x00, 0x0C, 0x11, 0x00, 0x08, 0x7F, 0x80, 0x3B, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEF, 0x00, 0x05, 0x29, 0x00, 0x05, 0x29, 0x00, 0x05, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x21, 0x29, 0x00, 0x21, 0x29, 0x00, 0x21, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x05, 0x29, 0x00, 0x05, 0x29, 0x00, 0x05, 0x29, 0x00, 0x0D, 0x29, 0x00, 0x09, 0x69, 0x00, 0x3A, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F39, { 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x3E, 0x88, 0x00, 0x04, 0x50, 0x00, 0x05, 0xFC, 0x00, 0x05, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x21, 0x24, 0x00, 0x21, 0x24, 0x00, 0x3D, 0xFC, 0x00, 0x04, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x28, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F3A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x02, 0x22, 0x00, 0x02, 0x5F, 0x00, 0x02, 0xE8, 0x80, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x02, 0x0A, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x70, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF7, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x7B, 0xF7, 0x80, 0x42, 0x54, 0x00, 0x42, 0x54, 0x00, 0x7A, 0xF7, 0x80, 0x0A, 0xB0, 0x80, 0x0B, 0xB0, 0x80, 0x0B, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x1A, 0x11, 0x80, 0x12, 0x11, 0x00, 0x73, 0xF7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xF7, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x80, 0x80, 0x3D, 0xF7, 0x80, 0x21, 0x14, 0x00, 0x21, 0x14, 0x00, 0x21, 0x17, 0x80, 0x3D, 0xF0, 0x80, 0x05, 0x10, 0x80, 0x05, 0x10, 0x80, 0x05, 0x10, 0x80, 0x05, 0x10, 0x80, 0x05, 0xF0, 0x80, 0x19, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F3D, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x78, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x78, 0x9E, 0x00, 0x40, 0x80, 0x00, 0x40, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x19, 0x93, 0x00, 0x13, 0x11, 0x80, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F3E, { 0x00, 0x00, 0x00, 0x01, 0x21, 0x00, 0x7D, 0xB3, 0x00, 0x04, 0x92, 0x00, 0x05, 0xFF, 0x00, 0x05, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x21, 0x11, 0x00, 0x3D, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F3F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x13, 0x80, 0x07, 0xF0, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F40, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x9E, 0x00, 0x08, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xA3, 0x80, 0x40, 0x80, 0x00, 0x5E, 0xBF, 0x00, 0x00, 0x11, 0x00, 0x1E, 0x13, 0x00, 0x02, 0x12, 0x00, 0x3E, 0x16, 0x00, 0x20, 0x0C, 0x00, 0x3F, 0x1E, 0x00, 0x01, 0x33, 0x00, 0x1E, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x04, 0x02, 0x00, 0x04, 0xF2, 0x00, 0x04, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x20, 0xF2, 0x00, 0x20, 0x06, 0x00, 0x20, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x04, 0x02, 0x00, 0x04, 0xF2, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x0C, 0xF2, 0x00, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x05, 0x00, 0x00, 0x05, 0x3E, 0x00, 0x05, 0x22, 0x00, 0x3D, 0x22, 0x00, 0x21, 0x3E, 0x00, 0x21, 0x00, 0x00, 0x21, 0x77, 0x00, 0x3D, 0x55, 0x00, 0x05, 0x55, 0x00, 0x05, 0x55, 0x00, 0x05, 0x77, 0x00, 0x0D, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F45, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7C, 0x44, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x05, 0xE1, 0x00, 0x3D, 0xA9, 0x00, 0x21, 0x69, 0x00, 0x21, 0xA9, 0x00, 0x21, 0x69, 0x00, 0x3D, 0x21, 0x00, 0x05, 0x67, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x11, 0x00, 0x08, 0x73, 0x00, 0x39, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F47, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x09, 0x00, 0x02, 0xFF, 0x80, 0x02, 0x09, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x08, 0x00, 0x20, 0xAA, 0x80, 0x20, 0xEB, 0x80, 0x3E, 0x88, 0x80, 0x02, 0xFF, 0x80, 0x02, 0x88, 0x80, 0x02, 0xEB, 0x80, 0x06, 0xAA, 0x80, 0x04, 0xAA, 0x80, 0x1D, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x05, 0x29, 0x00, 0x05, 0xEF, 0x00, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F4A, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x05, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x05, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x92, 0x00, 0x05, 0x11, 0x00, 0x3E, 0x10, 0x80, 0x25, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x21, 0xBB, 0x00, 0x3D, 0x55, 0x00, 0x25, 0xBB, 0x00, 0x05, 0x11, 0x00, 0x05, 0xBB, 0x00, 0x05, 0x55, 0x00, 0x05, 0xBB, 0x00, 0x05, 0x11, 0x00, 0x19, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F4D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7D, 0xFF, 0x80, 0x05, 0x22, 0x00, 0x05, 0x7F, 0x00, 0x05, 0x22, 0x00, 0x3D, 0x3E, 0x00, 0x21, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x3D, 0x7F, 0x00, 0x05, 0x49, 0x00, 0x05, 0x7F, 0x00, 0x05, 0x49, 0x00, 0x0D, 0x7F, 0x00, 0x0A, 0x22, 0x00, 0x38, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F4E, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x33, 0xF9, 0x00, 0x14, 0x06, 0x00, 0x1A, 0xE5, 0x00, 0x3F, 0x0F, 0x80, 0x08, 0xE2, 0x00, 0x2A, 0x0A, 0x80, 0x2A, 0xEA, 0x80, 0x00, 0xE0, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F51, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F52, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F53, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x18, 0x86, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F54, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x18, 0x82, 0x00, 0x0C, 0x86, 0x00, 0x04, 0xCC, 0x00, 0x00, 0xE0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F55, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x08, 0x88, 0x00, 0x04, 0xD0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8F, 0x00, 0x32, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F56, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x0D, 0x52, 0x00, 0x32, 0x74, 0x00, 0x04, 0xA8, 0x00, 0x09, 0x28, 0x00, 0x32, 0x24, 0x00, 0x0C, 0x22, 0x00, 0x31, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F57, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xBF, 0x80, 0x3C, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F58, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x23, 0xE8, 0x00, 0x3A, 0x8F, 0x00, 0x20, 0x88, 0x00, 0x23, 0xE8, 0x00, 0x20, 0x88, 0x00, 0x21, 0xC8, 0x80, 0x25, 0x4D, 0x80, 0x7B, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F59, { 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x07, 0x5C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F5B, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x24, 0x87, 0x00, 0x15, 0x11, 0x00, 0x3F, 0xE0, 0x80, 0x0E, 0x1F, 0x00, 0x15, 0x09, 0x00, 0x24, 0x91, 0x00, 0x00, 0x62, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F5C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x12, 0x00, 0x2A, 0x21, 0x00, 0x7F, 0x5E, 0x80, 0x1C, 0x0A, 0x00, 0x2A, 0x12, 0x00, 0x49, 0x66, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F5D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x2A, 0x32, 0x00, 0x7F, 0x0C, 0x80, 0x1C, 0xFF, 0x80, 0x2A, 0x2A, 0x00, 0x49, 0x49, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F60, { 0x00, 0x00, 0x00, 0x3E, 0x12, 0x00, 0x02, 0xFF, 0x80, 0x3E, 0x12, 0x00, 0x02, 0x24, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0xC4, 0x00, 0x77, 0x7F, 0x00, 0x25, 0x44, 0x00, 0x25, 0x7F, 0x00, 0x77, 0x44, 0x00, 0x02, 0x7F, 0x80, 0x7F, 0x00, 0x00, 0x32, 0xFF, 0x00, 0x1A, 0x22, 0x00, 0x02, 0x1C, 0x00, 0x0E, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F61, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xF1, 0x00, 0x04, 0x82, 0x00, 0x04, 0x84, 0x00, 0x04, 0x89, 0x00, 0x04, 0x91, 0x00, 0x3F, 0xF2, 0x00, 0x04, 0x84, 0x00, 0x04, 0x88, 0x80, 0x04, 0x90, 0x80, 0x04, 0x81, 0x00, 0x08, 0x82, 0x00, 0x08, 0x84, 0x00, 0x10, 0x88, 0x00, 0x20, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F63, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x04, 0x0C, 0x00, 0x7F, 0xD8, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x33, 0x06, 0x00, 0x1A, 0x0C, 0x00, 0x0E, 0x18, 0x80, 0x04, 0x01, 0x80, 0x0E, 0x03, 0x00, 0x0A, 0x06, 0x00, 0x1B, 0x1C, 0x00, 0x31, 0x80, 0x00, 0x60, 0xE0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F64, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x83, 0x00, 0x10, 0x86, 0x00, 0x10, 0x8C, 0x00, 0x14, 0x98, 0x00, 0x16, 0x81, 0x00, 0x12, 0x83, 0x00, 0x10, 0xE6, 0x00, 0x1F, 0x8C, 0x00, 0x70, 0x98, 0x00, 0x10, 0x80, 0x80, 0x10, 0x81, 0x80, 0x10, 0x83, 0x00, 0x10, 0x86, 0x00, 0x30, 0x8C, 0x00, 0x63, 0xB8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F66, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x08, 0xC8, 0x00, 0x0B, 0x11, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC4, 0x00, 0x13, 0x18, 0x00, 0x10, 0x60, 0x00, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F67, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x1F, 0xA5, 0x00, 0x10, 0xA9, 0x00, 0x10, 0x9A, 0x00, 0x1F, 0x94, 0x80, 0x10, 0xA9, 0x00, 0x00, 0x5A, 0x00, 0x07, 0xAC, 0x00, 0x38, 0x0C, 0x80, 0x00, 0x32, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F69, { 0x00, 0x00, 0x00, 0x03, 0xC1, 0x00, 0x1C, 0x01, 0x00, 0x02, 0x42, 0x00, 0x12, 0x44, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x11, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xE4, 0x00, 0x06, 0x08, 0x80, 0x07, 0x10, 0x80, 0x0A, 0x81, 0x00, 0x0A, 0x42, 0x00, 0x12, 0x04, 0x00, 0x22, 0x08, 0x00, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F6A, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xE1, 0x00, 0x01, 0x02, 0x00, 0x1F, 0xFA, 0x00, 0x11, 0x14, 0x00, 0x11, 0xF0, 0x80, 0x1F, 0x09, 0x00, 0x11, 0xFA, 0x00, 0x10, 0x04, 0x00, 0x12, 0x48, 0x80, 0x12, 0x41, 0x00, 0x12, 0x42, 0x00, 0x12, 0x44, 0x80, 0x24, 0x40, 0x80, 0x24, 0x7F, 0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE1, 0x00, 0x22, 0x22, 0x00, 0x22, 0x24, 0x00, 0x2F, 0xA8, 0x00, 0x22, 0x30, 0x80, 0x22, 0x21, 0x00, 0x3F, 0xE2, 0x00, 0x20, 0x24, 0x00, 0x2F, 0xA8, 0x00, 0x28, 0xB0, 0x80, 0x28, 0xA1, 0x00, 0x2F, 0xA2, 0x00, 0x28, 0xA4, 0x00, 0x20, 0x28, 0x00, 0x20, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F6C, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xE8, 0x00, 0x08, 0x91, 0x00, 0x1C, 0xC2, 0x00, 0x1B, 0xA2, 0x00, 0x3A, 0x84, 0x00, 0x2A, 0x88, 0x80, 0x28, 0x91, 0x00, 0x08, 0x81, 0x00, 0x08, 0x82, 0x00, 0x08, 0x84, 0x00, 0x08, 0x88, 0x00, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F6D, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xE8, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xC1, 0x00, 0x10, 0x42, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC8, 0x80, 0x00, 0x30, 0x80, 0x10, 0x81, 0x00, 0x09, 0x02, 0x00, 0x03, 0xC4, 0x00, 0x3C, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F6F, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xE6, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0xCC, 0x00, 0x2A, 0x59, 0x00, 0x2A, 0x43, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x06, 0x00, 0x3F, 0xCC, 0x00, 0x00, 0x18, 0x80, 0x7F, 0xE1, 0x80, 0x04, 0x01, 0x00, 0x14, 0x83, 0x00, 0x34, 0xC6, 0x00, 0x64, 0x6C, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F70, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x88, 0x80, 0x05, 0x10, 0x80, 0x3F, 0xE1, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x40, 0x80, 0x1F, 0xC1, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xE4, 0x00, 0x02, 0x08, 0x00, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F71, { 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xD0, 0x00, 0x02, 0x01, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE4, 0x00, 0x20, 0x28, 0x00, 0x20, 0x20, 0x80, 0x3F, 0xE1, 0x00, 0x02, 0x01, 0x00, 0x0A, 0x82, 0x00, 0x12, 0x44, 0x00, 0x26, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F72, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3D, 0xE2, 0x00, 0x00, 0x06, 0x00, 0x3D, 0xEC, 0x00, 0x2D, 0x68, 0x00, 0x02, 0x01, 0x00, 0x3F, 0xE3, 0x00, 0x25, 0x02, 0x00, 0x3F, 0xE6, 0x00, 0x25, 0x2C, 0x00, 0x3F, 0xE0, 0x80, 0x29, 0x01, 0x80, 0x2D, 0xE1, 0x00, 0x69, 0x03, 0x00, 0x4D, 0x26, 0x00, 0x18, 0xEC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F73, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC4, 0x00, 0x03, 0x8C, 0x00, 0x0E, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x0E, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F74, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x18, 0xFF, 0x80, 0x30, 0x80, 0x80, 0x65, 0x80, 0x80, 0x0C, 0x00, 0x80, 0x08, 0x60, 0x80, 0x18, 0x30, 0x80, 0x38, 0x18, 0x80, 0x68, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x80, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F75, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x17, 0x00, 0x31, 0x1D, 0x00, 0x65, 0x71, 0x00, 0x0D, 0xD1, 0x00, 0x0B, 0x11, 0x00, 0x19, 0x11, 0x00, 0x39, 0x13, 0x00, 0x69, 0x10, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x80, 0x09, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F77, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x18, 0x21, 0x00, 0x28, 0x21, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F78, { 0x00, 0x00, 0x00, 0x04, 0x3C, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x46, 0x00, 0x18, 0x42, 0x00, 0x30, 0xC3, 0x00, 0x64, 0x81, 0x00, 0x0D, 0xA1, 0x80, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x38, 0x20, 0x00, 0x68, 0x62, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x79, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F79, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x24, 0x44, 0x00, 0x04, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x00, 0x00, 0x18, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F7A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x64, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x38, 0x10, 0x00, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F7B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x02, 0x00, 0x09, 0x7F, 0x00, 0x11, 0x12, 0x00, 0x21, 0x12, 0x00, 0x49, 0x52, 0x00, 0x09, 0xF2, 0x00, 0x17, 0x12, 0x00, 0x31, 0x12, 0x00, 0x51, 0x32, 0x00, 0x11, 0x52, 0x00, 0x11, 0x92, 0x00, 0x10, 0x22, 0x00, 0x10, 0x42, 0x00, 0x10, 0x94, 0x00, 0x11, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F7C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x89, 0x00, 0x04, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x18, 0xA1, 0x00, 0x28, 0xA2, 0x00, 0x08, 0x94, 0x00, 0x08, 0x98, 0x00, 0x08, 0x88, 0x00, 0x08, 0x94, 0x00, 0x09, 0x24, 0x00, 0x09, 0x42, 0x00, 0x0A, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F7D, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0C, 0x0E, 0x00, 0x09, 0xF8, 0x00, 0x19, 0x08, 0x00, 0x31, 0x08, 0x00, 0x65, 0x08, 0x00, 0x0D, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x19, 0x08, 0x00, 0x39, 0x0C, 0x00, 0x69, 0x04, 0x00, 0x09, 0xE4, 0x00, 0x0B, 0x06, 0x00, 0x08, 0x02, 0x80, 0x0B, 0xF3, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F7E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x31, 0x83, 0x00, 0x65, 0x7D, 0x80, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x38, 0x21, 0x00, 0x68, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x27, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F7F, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x08, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x49, 0x00, 0x04, 0x49, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x08, 0x88, 0x80, 0x08, 0x8B, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F80, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F81, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x48, 0x00, 0x18, 0x4F, 0x80, 0x28, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F82, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x30, 0x82, 0x00, 0x64, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x30, 0x82, 0x00, 0x70, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F83, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x90, 0x00, 0x10, 0x90, 0x00, 0x30, 0x90, 0x00, 0x61, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x1B, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x70, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F84, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x60, 0xC6, 0x00, 0x00, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x18, 0xEE, 0x00, 0x33, 0x83, 0x80, 0x70, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F85, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x24, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x28, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F87, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x80, 0x00, 0x25, 0xFF, 0x80, 0x05, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x1C, 0xFC, 0x80, 0x18, 0x84, 0x80, 0x28, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x08, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F88, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0D, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x31, 0x02, 0x00, 0x65, 0xFE, 0x00, 0x0D, 0x02, 0x00, 0x19, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x71, 0x10, 0x80, 0x11, 0x11, 0x80, 0x11, 0x1B, 0x00, 0x11, 0x08, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x06, 0x00, 0x11, 0xE3, 0x00, 0x17, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F89, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xC6, 0x00, 0x08, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x64, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x38, 0x10, 0x00, 0x68, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F8A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x11, 0x00, 0x80, 0x25, 0x3C, 0x80, 0x05, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x19, 0x24, 0x80, 0x29, 0x3C, 0x80, 0x09, 0x24, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F8B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x22, 0x12, 0x00, 0x05, 0xFF, 0x80, 0x0C, 0x12, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F8C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x10, 0x22, 0x00, 0x24, 0xC4, 0x00, 0x04, 0x48, 0x00, 0x08, 0x31, 0x00, 0x08, 0x2F, 0x00, 0x1B, 0xF0, 0x80, 0x28, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC2, 0x00, 0x0B, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F8D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x64, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x18, 0x10, 0x00, 0x38, 0x10, 0x00, 0x69, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F8F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x18, 0x90, 0x00, 0x30, 0x90, 0x00, 0x65, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x08, 0x51, 0x00, 0x18, 0xD1, 0x00, 0x39, 0x93, 0x00, 0x68, 0x12, 0x00, 0x08, 0x36, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x70, 0x00, 0x09, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F90, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x08, 0x44, 0x00, 0x10, 0x82, 0x00, 0x25, 0x01, 0x80, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x94, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x11, 0x00, 0x08, 0x10, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F91, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x10, 0x92, 0x00, 0x24, 0x92, 0x00, 0x05, 0x24, 0x00, 0x09, 0x24, 0x00, 0x18, 0x92, 0x00, 0x18, 0x92, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F92, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x10, 0x00, 0x09, 0x90, 0x00, 0x0A, 0x7F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F93, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x18, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x30, 0x44, 0x00, 0x63, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x90, 0x00, 0x30, 0x9F, 0x00, 0x70, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x11, 0xD0, 0x00, 0x11, 0x70, 0x00, 0x13, 0x1C, 0x00, 0x16, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F95, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x05, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x1B, 0xFF, 0x00, 0x28, 0x20, 0x00, 0x48, 0x70, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x27, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F96, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x00, 0x80, 0x31, 0x00, 0x80, 0x64, 0x7E, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x68, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x00, 0x09, 0x11, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F97, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F98, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x10, 0x48, 0x00, 0x23, 0xCF, 0x80, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x08, 0x48, 0x00, 0x1B, 0xCF, 0x00, 0x28, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xCF, 0x80, 0x08, 0x48, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F99, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x24, 0x90, 0x00, 0x04, 0x90, 0x00, 0x08, 0x90, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x28, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x90, 0x00, 0x0A, 0x7F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5F9C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x52, 0x00, 0x08, 0x52, 0x00, 0x18, 0xD3, 0x00, 0x30, 0x91, 0x00, 0x65, 0xFF, 0x80, 0x0D, 0x00, 0x80, 0x09, 0x00, 0x80, 0x19, 0x7E, 0x80, 0x39, 0x42, 0x80, 0x69, 0x42, 0x80, 0x09, 0x42, 0x80, 0x09, 0x7E, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F9D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x30, 0x7F, 0x00, 0x65, 0x41, 0x00, 0x0D, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x19, 0x41, 0x00, 0x39, 0x41, 0x00, 0x69, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5F9E, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x08, 0x42, 0x00, 0x10, 0xA5, 0x00, 0x25, 0x18, 0x80, 0x04, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x90, 0x00, 0x28, 0x9F, 0x80, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x50, 0x00, 0x09, 0x3F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FA0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x04, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x19, 0x55, 0x00, 0x2A, 0x38, 0x80, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FA1, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x87, 0x80, 0x11, 0xF4, 0x80, 0x22, 0x44, 0x80, 0x04, 0x44, 0x80, 0x04, 0x44, 0x80, 0x0F, 0xFC, 0x80, 0x18, 0x44, 0x80, 0x29, 0x44, 0x80, 0x09, 0x7C, 0x80, 0x09, 0x44, 0x80, 0x09, 0x44, 0x80, 0x09, 0x7C, 0x80, 0x0F, 0xC5, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FA2, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x64, 0x11, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x68, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x09, 0xD0, 0x00, 0x0B, 0x70, 0x00, 0x0A, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FA4, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xBF, 0x00, 0x30, 0x89, 0x00, 0x21, 0x09, 0x00, 0x4A, 0x7F, 0x80, 0x0F, 0x89, 0x00, 0x18, 0x89, 0x00, 0x10, 0xBF, 0x00, 0x32, 0x88, 0x00, 0x72, 0xBF, 0x00, 0x13, 0x88, 0x00, 0x11, 0x7F, 0x80, 0x11, 0x08, 0x00, 0x13, 0x08, 0x00, 0x12, 0x80, 0x00, 0x16, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FA7, { 0x00, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x0D, 0xF8, 0x00, 0x09, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x65, 0x01, 0x00, 0x0D, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x3B, 0xA4, 0x80, 0x6A, 0xA4, 0x80, 0x0A, 0xFF, 0x80, 0x0A, 0xA4, 0x80, 0x0C, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FA8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x10, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FA9, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x18, 0x00, 0x08, 0x66, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FAA, { 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x09, 0xE0, 0x00, 0x11, 0x08, 0x00, 0x25, 0x08, 0x00, 0x05, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FAB, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0D, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x33, 0xFF, 0x80, 0x64, 0x00, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x38, 0x04, 0x00, 0x68, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FAC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x42, 0x00, 0x30, 0x24, 0x00, 0x65, 0xFF, 0x80, 0x0D, 0x00, 0x80, 0x09, 0x10, 0x80, 0x18, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x68, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x61, 0x00, 0x08, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FAD, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x3E, 0x00, 0x18, 0x62, 0x00, 0x30, 0xD6, 0x00, 0x65, 0xAC, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x60, 0x00, 0x33, 0x80, 0x00, 0x70, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FAE, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x09, 0x52, 0x00, 0x11, 0x52, 0x00, 0x25, 0x57, 0x80, 0x05, 0x55, 0x00, 0x09, 0xF9, 0x00, 0x08, 0x0D, 0x00, 0x1B, 0xF5, 0x00, 0x28, 0x15, 0x00, 0x09, 0xE5, 0x00, 0x09, 0x26, 0x00, 0x09, 0x22, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x35, 0x00, 0x0A, 0x69, 0x00, 0x08, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FAF, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0C, 0x1E, 0x00, 0x09, 0xE2, 0x00, 0x18, 0xB3, 0x00, 0x31, 0x91, 0x00, 0x65, 0x20, 0x00, 0x0C, 0x64, 0x00, 0x08, 0xC8, 0x00, 0x18, 0x52, 0x00, 0x38, 0x3F, 0x00, 0x69, 0xE1, 0x80, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FB0, { 0x00, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x9E, 0x00, 0x30, 0x90, 0x00, 0x64, 0x90, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x9E, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FB1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x49, 0x00, 0x65, 0x49, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x6B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FB3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x30, 0x20, 0x00, 0x63, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x33, 0xFF, 0x00, 0x70, 0x00, 0x00, 0x10, 0x60, 0x00, 0x10, 0xB3, 0x00, 0x12, 0x91, 0x80, 0x12, 0x82, 0x80, 0x16, 0xC6, 0x00, 0x14, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FB4, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x1A, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x32, 0xAF, 0x80, 0x63, 0xE9, 0x00, 0x08, 0x19, 0x00, 0x18, 0x05, 0x00, 0x13, 0xE5, 0x00, 0x30, 0x85, 0x00, 0x70, 0x87, 0x00, 0x13, 0xE2, 0x00, 0x10, 0x82, 0x00, 0x10, 0x87, 0x00, 0x10, 0xE5, 0x00, 0x13, 0x8D, 0x80, 0x10, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FB5, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x05, 0x52, 0x00, 0x09, 0x52, 0x00, 0x11, 0x54, 0x00, 0x25, 0xF7, 0x80, 0x05, 0x15, 0x00, 0x0B, 0xF9, 0x00, 0x08, 0x09, 0x00, 0x19, 0xF5, 0x00, 0x28, 0x45, 0x00, 0x09, 0xF6, 0x00, 0x08, 0x42, 0x00, 0x08, 0x72, 0x00, 0x0B, 0x85, 0x00, 0x08, 0x09, 0x00, 0x08, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FB7, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x06, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1B, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x81, 0x00, 0x0A, 0x82, 0x80, 0x0C, 0xFE, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FB8, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x42, 0x00, 0x30, 0x24, 0x00, 0x65, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x38, 0xFF, 0x00, 0x68, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FB9, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x13, 0xF4, 0x00, 0x14, 0x8F, 0x80, 0x25, 0x29, 0x00, 0x0B, 0xF1, 0x00, 0x08, 0x11, 0x00, 0x1B, 0xFA, 0x00, 0x2A, 0x2A, 0x00, 0x0B, 0xEA, 0x00, 0x0A, 0x2A, 0x00, 0x0B, 0xE4, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x29, 0x00, 0x0A, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FBC, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x19, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x32, 0x2F, 0x80, 0x63, 0xE9, 0x00, 0x0A, 0x39, 0x00, 0x1B, 0xE5, 0x00, 0x10, 0x85, 0x00, 0x37, 0xF5, 0x00, 0x71, 0x07, 0x00, 0x11, 0xE2, 0x00, 0x11, 0x22, 0x00, 0x11, 0x27, 0x00, 0x13, 0x25, 0x00, 0x12, 0x2D, 0x80, 0x16, 0xE8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FBD, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x09, 0x52, 0x00, 0x11, 0x52, 0x00, 0x25, 0x54, 0x00, 0x05, 0xF7, 0x80, 0x08, 0x85, 0x00, 0x08, 0xAD, 0x00, 0x1B, 0x35, 0x00, 0x29, 0x45, 0x00, 0x08, 0x95, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x42, 0x00, 0x09, 0x52, 0x00, 0x09, 0x55, 0x00, 0x0A, 0x55, 0x00, 0x08, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x14, 0x01, 0x00, 0x14, 0x00, 0x80, 0x14, 0x00, 0x80, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FC4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x02, 0x50, 0x00, 0x02, 0x58, 0x00, 0x02, 0x4C, 0x00, 0x06, 0x44, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FC5, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x42, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x21, 0x00, 0x12, 0x40, 0x80, 0x22, 0x80, 0x80, 0x03, 0x00, 0x80, 0x02, 0x02, 0x00, 0x06, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FC6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x28, 0x40, 0x00, 0x48, 0x80, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FC7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2C, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x6A, 0x10, 0x80, 0x48, 0x10, 0x80, 0x08, 0x10, 0x80, 0x08, 0x30, 0x80, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x08, 0x61, 0x80, 0x08, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x02, 0x60, 0x00, 0x12, 0x23, 0x00, 0x12, 0x01, 0x80, 0x32, 0x04, 0x80, 0x63, 0x0C, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FC9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x10, 0x80, 0x2C, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x6A, 0x10, 0x80, 0x48, 0x30, 0x80, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x08, 0x61, 0x80, 0x08, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x09, 0x87, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FCB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x28, 0x01, 0x00, 0x2C, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x41, 0x00, 0x14, 0x01, 0x00, 0x14, 0x02, 0x80, 0x24, 0x02, 0x80, 0x27, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x04, 0x41, 0x00, 0x08, 0x41, 0x00, 0x10, 0x81, 0x00, 0x01, 0x02, 0x00, 0x06, 0x1C, 0x00, 0x38, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x41, 0x00, 0x04, 0x21, 0x00, 0x14, 0x04, 0x80, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FCF, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x2C, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x28, 0x22, 0x00, 0x4B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x86, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD2, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x13, 0x00, 0x00, 0x11, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x06, 0x10, 0x00, 0x02, 0x18, 0x00, 0x08, 0xC8, 0x00, 0x28, 0x68, 0x00, 0x28, 0x2C, 0x00, 0x28, 0x84, 0x00, 0x6D, 0x86, 0x80, 0x47, 0x03, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD4, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x28, 0xFF, 0x80, 0x2C, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x6B, 0x7F, 0x00, 0x48, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x30, 0x00, 0x08, 0x60, 0x00, 0x08, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD6, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x04, 0x00, 0x28, 0x04, 0x00, 0x28, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x14, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x81, 0x00, 0x04, 0x40, 0x80, 0x14, 0x02, 0x80, 0x14, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x02, 0x20, 0x00, 0x12, 0x01, 0x00, 0x12, 0x04, 0x80, 0x22, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FD9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x28, 0x80, 0x00, 0x28, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FDC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x60, 0x00, 0x10, 0x30, 0x00, 0x10, 0x98, 0x00, 0x10, 0x88, 0x00, 0x12, 0x80, 0x00, 0x12, 0x82, 0x00, 0x12, 0x83, 0x00, 0x16, 0x81, 0x80, 0x34, 0x80, 0x80, 0x24, 0x82, 0x00, 0x60, 0xC6, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FDD, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x1D, 0x0E, 0x00, 0x71, 0x03, 0x80, 0x01, 0x00, 0x00, 0x09, 0x24, 0x00, 0x09, 0x36, 0x00, 0x19, 0x1B, 0x00, 0x31, 0x09, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FDE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x70, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FE0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x41, 0x00, 0x14, 0x05, 0x00, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FE1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x28, 0x08, 0x00, 0x2C, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x6A, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FE4, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x29, 0x90, 0x00, 0x2D, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x68, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FE7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x2C, 0x42, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0xA0, 0x00, 0x48, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x09, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FE8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0xFF, 0x80, 0x48, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0x44, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FE9, { 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x71, 0x93, 0x80, 0x03, 0x10, 0x00, 0x06, 0x78, 0x00, 0x1F, 0x8C, 0x00, 0x00, 0x06, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FEA, { 0x00, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x46, 0x00, 0x28, 0x42, 0x00, 0x2C, 0xC3, 0x00, 0x2A, 0x81, 0x00, 0x6B, 0xA1, 0x80, 0x48, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x62, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x79, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FEB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x28, 0x12, 0x00, 0x28, 0x12, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FEC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x03, 0x00, 0x28, 0x34, 0x00, 0x2C, 0x18, 0x00, 0x2A, 0x0C, 0x00, 0x6A, 0xFF, 0x80, 0x48, 0x08, 0x80, 0x08, 0x08, 0x80, 0x08, 0x08, 0x80, 0x08, 0x0B, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FED, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0x1C, 0x00, 0x08, 0x16, 0x00, 0x08, 0x13, 0x00, 0x08, 0x11, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FEE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x41, 0x00, 0x08, 0x63, 0x00, 0x08, 0x36, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FEF, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x28, 0x88, 0x00, 0x2C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0x88, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x08, 0x82, 0x80, 0x08, 0xF3, 0x80, 0x0B, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FF0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x28, 0x24, 0x00, 0x2C, 0x64, 0x00, 0x2A, 0x44, 0x80, 0x68, 0xC4, 0x80, 0x49, 0x83, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FF1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x10, 0x80, 0x2D, 0x10, 0x80, 0x6A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x68, 0x00, 0x08, 0x48, 0x80, 0x08, 0xC9, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FF2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x9B, 0x00, 0x09, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FF3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x13, 0x00, 0x08, 0x1E, 0x00, 0x28, 0xF0, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x92, 0x00, 0x6A, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x19, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FF5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF1, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x01, 0x10, 0x00, 0x04, 0xA1, 0x00, 0x14, 0x49, 0x00, 0x14, 0x08, 0x80, 0x27, 0xF8, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FF6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x64, 0x00, 0x08, 0x46, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4F, 0x00, 0x08, 0xF9, 0x80, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FF8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x28, 0x22, 0x00, 0x2C, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FFA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x28, 0x7F, 0x80, 0x2C, 0x48, 0x80, 0x2A, 0xC9, 0x80, 0x6A, 0x09, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FFB, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x28, 0x80, 0x00, 0x2C, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x84, 0x00, 0x48, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FFC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0x7C, 0x00, 0x48, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x80, 0x09, 0x84, 0x80, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x5FFD, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x04, 0x49, 0x00, 0x08, 0x89, 0x00, 0x31, 0x11, 0x00, 0x06, 0x21, 0x00, 0x1C, 0x42, 0x00, 0x01, 0x9C, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x21, 0x00, 0x12, 0x25, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FFE, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x2D, 0xFC, 0x00, 0x2A, 0x00, 0x00, 0x29, 0xF8, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x09, 0x00, 0x08, 0x05, 0x00, 0x08, 0x03, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x5FFF, { 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x30, 0x00, 0x30, 0x82, 0x00, 0x02, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6000, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x28, 0x20, 0x00, 0x48, 0x68, 0x00, 0x08, 0xA6, 0x00, 0x09, 0x23, 0x00, 0x0A, 0x21, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6001, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x05, 0x18, 0x00, 0x18, 0x87, 0x00, 0x60, 0x02, 0x00, 0x01, 0x00, 0x00, 0x14, 0x88, 0x00, 0x14, 0x84, 0x00, 0x14, 0x12, 0x00, 0x24, 0x12, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6002, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x11, 0x47, 0x00, 0x20, 0x82, 0x00, 0x40, 0x00, 0x00, 0x15, 0x08, 0x00, 0x14, 0xC4, 0x00, 0x14, 0x52, 0x00, 0x24, 0x12, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6003, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x2C, 0x20, 0x00, 0x2A, 0x22, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6004, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x09, 0x02, 0x00, 0x2D, 0x42, 0x00, 0x2B, 0x24, 0x00, 0x29, 0x24, 0x00, 0x49, 0x18, 0x00, 0x09, 0x08, 0x00, 0x09, 0x14, 0x00, 0x09, 0x24, 0x00, 0x09, 0x42, 0x00, 0x09, 0x82, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6005, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x88, 0x00, 0x08, 0x90, 0x00, 0x2C, 0xA0, 0x00, 0x2A, 0xC0, 0x00, 0x28, 0x82, 0x00, 0x4F, 0xFF, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA7, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6006, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x2C, 0x84, 0x00, 0x2B, 0x07, 0x00, 0x2A, 0x02, 0x00, 0x48, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6007, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x28, 0x80, 0x00, 0x2C, 0x80, 0x00, 0x2A, 0xFF, 0x00, 0x6A, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x600A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x10, 0x80, 0x28, 0x10, 0x80, 0x2C, 0x30, 0x80, 0x2A, 0x21, 0x80, 0x6A, 0x61, 0x00, 0x48, 0xC7, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x600D, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x28, 0xFF, 0x80, 0x2C, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x6B, 0x10, 0x00, 0x48, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x600E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x80, 0x00, 0x30, 0x80, 0x00, 0x60, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x02, 0x60, 0x00, 0x12, 0x33, 0x00, 0x12, 0x15, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x600F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6010, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x29, 0xFF, 0x00, 0x2D, 0x01, 0x00, 0x2B, 0x01, 0x00, 0x68, 0xF9, 0x00, 0x48, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6012, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xA1, 0x00, 0x11, 0x12, 0x00, 0x12, 0x0C, 0x00, 0x2C, 0x0C, 0x00, 0x0A, 0x12, 0x00, 0x11, 0x61, 0x00, 0x20, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x14, 0x41, 0x00, 0x14, 0x04, 0x80, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6013, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x9F, 0x80, 0x10, 0x88, 0x80, 0x50, 0x88, 0x80, 0x5B, 0xE8, 0x80, 0x55, 0x28, 0x80, 0x55, 0x2D, 0x80, 0x55, 0x25, 0x00, 0x51, 0x25, 0x00, 0x13, 0x67, 0x00, 0x12, 0x42, 0x00, 0x17, 0xE7, 0x00, 0x10, 0xA5, 0x00, 0x10, 0x85, 0x00, 0x11, 0x8D, 0x80, 0x13, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6014, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6015, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6016, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x28, 0x00, 0x2A, 0x48, 0x00, 0x28, 0x88, 0x00, 0x29, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x4B, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6017, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2C, 0x1F, 0x80, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6018, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x12, 0xE3, 0x00, 0x12, 0x31, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6019, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x601A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x28, 0x82, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x6A, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x601B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x28, 0x82, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x6A, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x601C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x0C, 0x81, 0x00, 0x2A, 0x00, 0x80, 0x2A, 0x7E, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x26, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x601D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x02, 0x22, 0x00, 0x0A, 0x01, 0x00, 0x12, 0x04, 0x80, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x601F, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x28, 0x88, 0x00, 0x2C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0xFF, 0x80, 0x48, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0xE4, 0x00, 0x0B, 0x86, 0x00, 0x08, 0x02, 0x80, 0x0B, 0xFB, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6020, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x02, 0x40, 0x00, 0x02, 0x21, 0x00, 0x12, 0x02, 0x80, 0x13, 0xFE, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6021, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x41, 0x00, 0x2A, 0x8F, 0x00, 0x29, 0xF0, 0x80, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6024, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x04, 0x00, 0x31, 0x84, 0x00, 0x50, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x1C, 0x00, 0x00, 0xC0, 0x00, 0x02, 0x63, 0x00, 0x12, 0x21, 0x80, 0x12, 0x04, 0x80, 0x33, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6025, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x30, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x14, 0x21, 0x00, 0x14, 0x00, 0x80, 0x24, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6026, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x28, 0x54, 0x00, 0x2C, 0xD6, 0x00, 0x2A, 0x92, 0x00, 0x68, 0x92, 0x00, 0x48, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6027, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6028, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xBF, 0x00, 0x0F, 0xE1, 0x00, 0x08, 0xA1, 0x00, 0x19, 0x21, 0x00, 0x25, 0x27, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x31, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x41, 0x00, 0x04, 0x01, 0x00, 0x14, 0x04, 0x80, 0x17, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6029, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x29, 0x01, 0x00, 0x2D, 0xFF, 0x00, 0x2B, 0x00, 0x00, 0x69, 0x20, 0x00, 0x49, 0x20, 0x00, 0x09, 0x27, 0x00, 0x09, 0x3C, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0B, 0x20, 0x00, 0x0A, 0x20, 0x80, 0x0E, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x602A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x0A, 0x42, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x18, 0x00, 0x28, 0x18, 0x00, 0x28, 0x66, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x602B, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x49, 0x00, 0x50, 0x49, 0x00, 0x5B, 0xFF, 0x00, 0x56, 0x48, 0x00, 0x52, 0x48, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x10, 0x49, 0x80, 0x10, 0xC9, 0x00, 0x10, 0x8B, 0x00, 0x11, 0x88, 0x00, 0x13, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x602D, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x28, 0x22, 0x00, 0x2C, 0x22, 0x00, 0x2A, 0x26, 0x00, 0x6A, 0x24, 0x00, 0x48, 0xAC, 0x00, 0x08, 0xAF, 0x00, 0x08, 0xB9, 0x80, 0x09, 0xB0, 0x80, 0x09, 0x20, 0x00, 0x08, 0x60, 0x00, 0x08, 0xA0, 0x80, 0x0B, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x602F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x9F, 0x00, 0x0B, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6031, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x6D, 0x91, 0x00, 0x07, 0x31, 0x00, 0x0D, 0xA1, 0x00, 0x38, 0xE3, 0x00, 0x03, 0xB2, 0x00, 0x1E, 0x0E, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x63, 0x00, 0x12, 0x21, 0x80, 0x12, 0x04, 0x80, 0x33, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6033, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x28, 0x81, 0x00, 0x2C, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6035, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x08, 0x11, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x12, 0x00, 0x09, 0x13, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x603A, { 0x00, 0x00, 0x00, 0x08, 0x60, 0x00, 0x08, 0x38, 0x00, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00, 0x2C, 0xF0, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x11, 0x00, 0x69, 0xDB, 0x00, 0x48, 0x5A, 0x00, 0x08, 0x5C, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x603B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x01, 0x00, 0x00, 0x28, 0xC2, 0x00, 0x28, 0x49, 0x00, 0x48, 0x09, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x603C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x0A, 0x00, 0x01, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x0A, 0x48, 0x00, 0x04, 0x28, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x28, 0x00, 0x20, 0x10, 0x00, 0x15, 0x04, 0x00, 0x14, 0xC2, 0x00, 0x24, 0x49, 0x00, 0x44, 0x09, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x603F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x2C, 0x20, 0x00, 0x2A, 0x50, 0x00, 0x28, 0xA8, 0x00, 0x49, 0x27, 0x00, 0x0A, 0xFA, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6040, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x62, 0x00, 0x28, 0xC6, 0x00, 0x2D, 0xAC, 0x00, 0x2A, 0x18, 0x00, 0x6A, 0x30, 0x00, 0x48, 0xE8, 0x00, 0x08, 0x0F, 0x80, 0x08, 0x18, 0x80, 0x08, 0x71, 0x80, 0x08, 0xC9, 0x00, 0x08, 0x0B, 0x00, 0x08, 0x06, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6041, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x04, 0x38, 0x00, 0x09, 0xD0, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, 0x12, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6042, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0A, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x2B, 0x00, 0x80, 0x28, 0x7C, 0x80, 0x28, 0x44, 0x80, 0x08, 0x7C, 0x80, 0x08, 0x44, 0x80, 0x08, 0x7C, 0x80, 0x08, 0x44, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6043, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6046, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x28, 0x80, 0x00, 0x2C, 0xFC, 0x00, 0x2A, 0x84, 0x00, 0x6A, 0xA4, 0x00, 0x48, 0x94, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x08, 0x84, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6047, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x28, 0xBF, 0x80, 0x2C, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x6A, 0x84, 0x00, 0x48, 0x84, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xBF, 0x80, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6048, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x62, 0x00, 0x08, 0x42, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x01, 0x00, 0x2A, 0x48, 0x00, 0x6A, 0x48, 0x00, 0x48, 0xFF, 0x00, 0x09, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6049, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x87, 0x00, 0x08, 0xFC, 0x00, 0x28, 0x80, 0x00, 0x2C, 0x80, 0x80, 0x2A, 0xC1, 0x80, 0x6A, 0x7F, 0x00, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x604A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x58, 0x62, 0x00, 0x54, 0xC6, 0x00, 0x51, 0x8C, 0x00, 0x50, 0x00, 0x00, 0x11, 0x04, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x13, 0x2C, 0x80, 0x12, 0x69, 0x80, 0x16, 0xDB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x604B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x19, 0x26, 0x00, 0x33, 0x23, 0x00, 0x62, 0x21, 0x80, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x604C, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0x24, 0x80, 0x29, 0xA5, 0x80, 0x2C, 0xA7, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x27, 0x00, 0x08, 0xE5, 0x80, 0x09, 0xA4, 0x80, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x604D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x80, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x64, 0x00, 0x08, 0x54, 0x80, 0x0F, 0x44, 0x80, 0x38, 0x87, 0x80, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x42, 0x00, 0x14, 0x21, 0x00, 0x14, 0x04, 0x80, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6051, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x62, 0x00, 0x28, 0x84, 0x00, 0x2D, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x6A, 0x80, 0x00, 0x48, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA7, 0x00, 0x08, 0xA0, 0x00, 0x09, 0xA0, 0x80, 0x09, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6052, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6054, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x42, 0x00, 0x2A, 0xC3, 0x00, 0x6B, 0x81, 0x80, 0x48, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6055, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x11, 0x21, 0x00, 0x12, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x24, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x20, 0x40, 0x00, 0x02, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x04, 0x80, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6056, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x13, 0x12, 0x00, 0x11, 0xB2, 0x00, 0x10, 0xE2, 0x00, 0x11, 0xB2, 0x00, 0x17, 0x1A, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6057, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x2C, 0x42, 0x00, 0x2A, 0x81, 0x80, 0x6A, 0x7E, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6059, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x02, 0x41, 0x00, 0x12, 0x02, 0x80, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x605A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x605D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x21, 0x00, 0x3E, 0x21, 0x00, 0x08, 0x42, 0x00, 0x09, 0x8C, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x82, 0x00, 0x14, 0x45, 0x00, 0x24, 0x04, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x605F, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x29, 0x81, 0x00, 0x2D, 0x01, 0x00, 0x2A, 0x51, 0x00, 0x69, 0x55, 0x00, 0x49, 0x25, 0x00, 0x09, 0x25, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x05, 0x00, 0x09, 0xFD, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6060, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x2C, 0x40, 0x00, 0x2A, 0x44, 0x00, 0x68, 0xC4, 0x00, 0x48, 0x84, 0x00, 0x09, 0x9F, 0x00, 0x0B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xBF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6061, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x66, 0x00, 0x08, 0x18, 0x00, 0x28, 0x3C, 0x00, 0x2C, 0xE6, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0x40, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0xDA, 0x00, 0x08, 0x92, 0x00, 0x09, 0x92, 0x00, 0x0B, 0x3F, 0x00, 0x08, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6062, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x40, 0x00, 0x0A, 0x48, 0x00, 0x28, 0x48, 0x80, 0x28, 0x59, 0x00, 0x28, 0x6A, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x09, 0x22, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6063, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x91, 0x00, 0x01, 0x12, 0x00, 0x00, 0x28, 0x00, 0x07, 0x44, 0x00, 0x38, 0x82, 0x00, 0x01, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x00, 0x80, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6064, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x90, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0xA0, 0x00, 0x1E, 0xA1, 0x00, 0x13, 0x20, 0x80, 0x12, 0x20, 0x80, 0x17, 0x22, 0x80, 0x3A, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x3E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6068, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x90, 0x00, 0x08, 0x91, 0x00, 0x08, 0x92, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x88, 0x00, 0x08, 0xF4, 0x00, 0x0B, 0x82, 0x00, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6069, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x0A, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x00, 0x80, 0x00, 0x04, 0x41, 0x00, 0x14, 0x05, 0x00, 0x14, 0x04, 0x80, 0x17, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x606A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x42, 0x00, 0x0A, 0xA4, 0x00, 0x2B, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x28, 0x00, 0x28, 0x46, 0x00, 0x09, 0x81, 0x80, 0x0E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x606B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x29, 0x01, 0x00, 0x2D, 0x7D, 0x00, 0x2B, 0x01, 0x00, 0x69, 0x01, 0x00, 0x49, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x09, 0x45, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x606C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x09, 0xF0, 0x00, 0x0C, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x606D, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x04, 0x52, 0x00, 0x08, 0x49, 0x00, 0x10, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x606F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x25, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6070, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x0A, 0x42, 0x00, 0x0B, 0x81, 0x80, 0x2A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6071, { 0x00, 0x00, 0x00, 0x08, 0x5C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x29, 0xA3, 0x80, 0x2C, 0x20, 0x00, 0x2A, 0x64, 0x00, 0x6A, 0x44, 0x00, 0x48, 0x5E, 0x00, 0x08, 0xF3, 0x00, 0x08, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x68, 0x80, 0x08, 0xCD, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6073, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x11, 0x04, 0x00, 0x10, 0xC8, 0x00, 0x12, 0x30, 0x00, 0x1C, 0x0E, 0x00, 0x01, 0x04, 0x00, 0x28, 0xC2, 0x00, 0x28, 0x49, 0x00, 0x48, 0x09, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6075, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6076, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x0A, 0x2C, 0x00, 0x0A, 0x30, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x14, 0xC4, 0x00, 0x14, 0x52, 0x00, 0x24, 0x12, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6077, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x30, 0xA8, 0x00, 0x50, 0xAC, 0x00, 0x11, 0xA6, 0x00, 0x13, 0x23, 0x00, 0x16, 0x21, 0x80, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6078, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x88, 0x00, 0x17, 0xC8, 0x00, 0x18, 0x0A, 0x00, 0x54, 0x3F, 0x00, 0x50, 0x0A, 0x00, 0x5F, 0xEA, 0x00, 0x51, 0x0A, 0x00, 0x11, 0x0A, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x92, 0x00, 0x14, 0x52, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x22, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6079, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x12, 0x28, 0x00, 0x5A, 0x24, 0x00, 0x56, 0x20, 0x00, 0x53, 0xFF, 0x00, 0x52, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x50, 0x00, 0x12, 0x50, 0x00, 0x14, 0x50, 0x00, 0x14, 0x88, 0x00, 0x18, 0x87, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x607A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x2D, 0xFC, 0x00, 0x2A, 0x00, 0x00, 0x29, 0xFC, 0x00, 0x48, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x607B, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x09, 0xF9, 0x00, 0x09, 0x11, 0x00, 0x09, 0x15, 0x00, 0x2D, 0x55, 0x00, 0x2B, 0x55, 0x00, 0x29, 0x55, 0x00, 0x29, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x08, 0x41, 0x00, 0x08, 0xA1, 0x00, 0x08, 0x91, 0x00, 0x09, 0x15, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x607C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x2C, 0x00, 0x00, 0x29, 0x0A, 0x00, 0x29, 0x8A, 0x00, 0x49, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0x22, 0x00, 0x09, 0x52, 0x00, 0x09, 0x8E, 0x00, 0x09, 0x06, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x607D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x14, 0x42, 0x00, 0x5B, 0xFC, 0x00, 0x54, 0x80, 0x00, 0x50, 0xA0, 0x00, 0x51, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x607E, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x44, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x607F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x30, 0x00, 0x02, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x20, 0x86, 0x00, 0x00, 0x61, 0x00, 0x12, 0x21, 0x80, 0x12, 0x04, 0x80, 0x33, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6081, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x28, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6082, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8B, 0x00, 0x28, 0xEE, 0x00, 0x2C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0x88, 0x80, 0x48, 0xE7, 0x80, 0x09, 0x80, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6083, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x29, 0x11, 0x00, 0x2D, 0x11, 0x00, 0x2B, 0x7D, 0x00, 0x69, 0x11, 0x00, 0x49, 0x39, 0x00, 0x09, 0x39, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6084, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x28, 0x91, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x6A, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6085, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x02, 0x00, 0x0C, 0x81, 0x00, 0x0B, 0x00, 0x80, 0x2A, 0xFF, 0x00, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x80, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6086, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x04, 0x08, 0x00, 0x1B, 0xF6, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x04, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x19, 0x86, 0x00, 0x00, 0x00, 0x00, 0x12, 0xE3, 0x00, 0x12, 0x31, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6088, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x08, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x08, 0x00, 0x2A, 0xA8, 0x00, 0x6A, 0xA9, 0x00, 0x48, 0xA9, 0x00, 0x09, 0xFB, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAE, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xAE, 0x80, 0x09, 0x1A, 0x80, 0x08, 0x33, 0x80, 0x08, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6089, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x04, 0x42, 0x00, 0x02, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x31, 0x41, 0x80, 0x00, 0x80, 0x00, 0x02, 0x42, 0x00, 0x02, 0x01, 0x00, 0x0A, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x608A, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x7C, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x84, 0x00, 0x18, 0x04, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x608B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x2C, 0xC6, 0x00, 0x2A, 0x6C, 0x00, 0x68, 0x38, 0x00, 0x48, 0xEE, 0x00, 0x0B, 0x83, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x608C, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x28, 0x00, 0x0A, 0xFF, 0x00, 0x2A, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x08, 0x30, 0x80, 0x08, 0x50, 0x80, 0x08, 0x91, 0x00, 0x09, 0x16, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x608D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x608E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x28, 0xFF, 0x00, 0x2D, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6091, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x6A, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6092, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x28, 0x82, 0x00, 0x2C, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x69, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x80, 0x09, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6093, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x28, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6094, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x51, 0x00, 0x28, 0x49, 0x00, 0x08, 0x41, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6095, { 0x00, 0x00, 0x00, 0x08, 0x62, 0x00, 0x08, 0x36, 0x00, 0x08, 0x1C, 0x00, 0x28, 0x76, 0x00, 0x2D, 0xC3, 0x00, 0x2A, 0x20, 0x00, 0x6A, 0xFF, 0x80, 0x48, 0x40, 0x00, 0x08, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x93, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6096, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x2B, 0x00, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6097, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x2D, 0x8C, 0x00, 0x2B, 0x08, 0x00, 0x29, 0xFF, 0x00, 0x69, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0x31, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x68, 0x00, 0x08, 0x48, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x88, 0x80, 0x09, 0x89, 0x80, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6098, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x40, 0x00, 0x14, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x609A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x609B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x5F, 0x00, 0x0A, 0xE4, 0x80, 0x2A, 0x24, 0x00, 0x28, 0x44, 0x80, 0x28, 0x97, 0x80, 0x2B, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x42, 0x00, 0x08, 0xA4, 0x00, 0x0B, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x609D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x28, 0x91, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x6A, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x609E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0xA2, 0x00, 0x28, 0xA2, 0x00, 0x2C, 0xA2, 0x00, 0x2A, 0xBE, 0x00, 0x6A, 0x80, 0x00, 0x48, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x609F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x29, 0xFE, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60A0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x09, 0x20, 0x00, 0x09, 0x3F, 0x80, 0x19, 0x42, 0x00, 0x19, 0xA4, 0x00, 0x29, 0x14, 0x00, 0x09, 0x08, 0x00, 0x09, 0x16, 0x00, 0x09, 0x21, 0x80, 0x08, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x11, 0x00, 0x12, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60A2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x6A, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x90, 0x80, 0x08, 0x99, 0x80, 0x08, 0x8B, 0x00, 0x08, 0x8E, 0x00, 0x08, 0x84, 0x00, 0x08, 0xF6, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60A3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x01, 0x40, 0x00, 0x00, 0x81, 0x00, 0x12, 0x85, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60A4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x09, 0xF2, 0x00, 0x0B, 0x22, 0x00, 0x0C, 0xC2, 0x00, 0x09, 0xB2, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x81, 0x00, 0x14, 0x05, 0x00, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60A5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x12, 0xE3, 0x00, 0x12, 0x31, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60A6, { 0x00, 0x00, 0x00, 0x08, 0x81, 0x00, 0x08, 0xC3, 0x00, 0x08, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x68, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60A7, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x80, 0x09, 0xC4, 0x80, 0x08, 0x44, 0x80, 0x0C, 0x44, 0x80, 0x2B, 0xF4, 0x80, 0x2A, 0x44, 0x80, 0x28, 0xC4, 0x80, 0x28, 0xE4, 0x80, 0x09, 0x54, 0x80, 0x09, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x0C, 0x44, 0x80, 0x08, 0x44, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60A8, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x12, 0x21, 0x00, 0x30, 0x22, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x13, 0x26, 0x00, 0x12, 0x23, 0x00, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x12, 0xE3, 0x00, 0x12, 0x31, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60A9, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x12, 0x31, 0x80, 0x13, 0x11, 0x00, 0x11, 0x13, 0x00, 0x59, 0x02, 0x00, 0x54, 0x00, 0x00, 0x54, 0x04, 0x00, 0x51, 0x4D, 0x00, 0x11, 0x69, 0x00, 0x11, 0x39, 0x00, 0x11, 0x11, 0x00, 0x11, 0x39, 0x00, 0x11, 0x6D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60AB, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x47, 0xF2, 0x00, 0x04, 0x10, 0x00, 0x04, 0x14, 0x00, 0x18, 0x1C, 0x00, 0x05, 0x00, 0x00, 0x14, 0xC2, 0x00, 0x24, 0x49, 0x00, 0x44, 0x09, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60AC, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x0A, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x28, 0xC2, 0x00, 0x28, 0x41, 0x00, 0x48, 0x09, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60AD, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x12, 0x80, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x5A, 0x94, 0x00, 0x56, 0x88, 0x00, 0x52, 0x94, 0x00, 0x52, 0xA3, 0x00, 0x12, 0xC0, 0x00, 0x10, 0x40, 0x00, 0x10, 0x48, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60AF, { 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x08, 0xBF, 0x00, 0x08, 0x02, 0x00, 0x09, 0x22, 0x00, 0x2D, 0x12, 0x00, 0x2B, 0xFE, 0x00, 0x29, 0x4A, 0x00, 0x49, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x12, 0x00, 0x09, 0x2A, 0x00, 0x09, 0xC6, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x2A, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B1, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x29, 0xE7, 0x80, 0x2C, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x48, 0xE7, 0x80, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0xE4, 0x00, 0x09, 0xA7, 0x80, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B2, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x07, 0x9F, 0x80, 0x38, 0x90, 0x00, 0x01, 0x10, 0x00, 0x06, 0x10, 0x00, 0x18, 0x92, 0x00, 0x02, 0x41, 0x00, 0x0A, 0x24, 0x80, 0x12, 0x04, 0x00, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x03, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x04, 0x41, 0x00, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x82, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x28, 0xFE, 0x00, 0x2C, 0x80, 0x00, 0x2A, 0xFE, 0x00, 0x68, 0x80, 0x00, 0x48, 0x80, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x91, 0x00, 0x08, 0x9B, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x20, 0x41, 0x00, 0x22, 0x09, 0x00, 0x2A, 0x15, 0x00, 0x2A, 0x13, 0x00, 0x2B, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60B7, { 0x00, 0x00, 0x00, 0x10, 0x0F, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x59, 0x01, 0x00, 0x55, 0x01, 0x00, 0x55, 0xFF, 0x00, 0x51, 0x10, 0x00, 0x51, 0x11, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x11, 0x38, 0x00, 0x13, 0x28, 0x00, 0x12, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60B8, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x38, 0x00, 0x2A, 0x54, 0x00, 0x28, 0x92, 0x00, 0x2B, 0x11, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60BB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x6A, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60BC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x0A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60BD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x11, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0xE4, 0x00, 0x09, 0x1C, 0x00, 0x08, 0x73, 0x00, 0x0B, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60BE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x28, 0xA4, 0x80, 0x2C, 0xA4, 0x80, 0x2A, 0x64, 0x00, 0x6A, 0xC7, 0x80, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x28, 0x61, 0x00, 0x2C, 0x41, 0x00, 0x2A, 0xC3, 0x00, 0x6A, 0x02, 0x00, 0x48, 0x0E, 0x00, 0x08, 0x60, 0x00, 0x08, 0xCF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xEF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x7F, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xB6, 0x00, 0x04, 0x1C, 0x00, 0x15, 0x08, 0x00, 0x35, 0x1C, 0x00, 0x25, 0xB6, 0x00, 0x2C, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x29, 0x11, 0x00, 0x2D, 0x7D, 0x00, 0x2B, 0x11, 0x00, 0x69, 0x11, 0x00, 0x49, 0x7D, 0x00, 0x09, 0x11, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x28, 0x91, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x6A, 0x91, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60C9, { 0x00, 0x00, 0x00, 0x18, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x24, 0x3F, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x05, 0x02, 0x00, 0x09, 0x02, 0x00, 0x39, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60CA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x6A, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60CB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x2D, 0x01, 0x00, 0x2A, 0x80, 0x00, 0x6A, 0xEF, 0x00, 0x48, 0xA9, 0x00, 0x09, 0xA9, 0x00, 0x09, 0x29, 0x00, 0x08, 0xA9, 0x00, 0x08, 0x6B, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x80, 0x08, 0xC9, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60CE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0xC6, 0x00, 0x62, 0x61, 0x80, 0x0A, 0x26, 0x00, 0x0A, 0x03, 0x00, 0x1B, 0x04, 0x00, 0x31, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60CF, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x53, 0xDF, 0x80, 0x58, 0x84, 0x00, 0x54, 0x84, 0x00, 0x55, 0xCE, 0x00, 0x51, 0xAE, 0x00, 0x12, 0x95, 0x00, 0x12, 0x95, 0x00, 0x14, 0xA4, 0x80, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60D1, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x11, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x94, 0x00, 0x0F, 0x88, 0x80, 0x00, 0x1C, 0x80, 0x1F, 0xA3, 0x80, 0x00, 0xC0, 0x00, 0x03, 0x21, 0x00, 0x12, 0x11, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60D3, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x00, 0x2D, 0xFF, 0x00, 0x2A, 0x28, 0x00, 0x28, 0x28, 0x00, 0x6B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x85, 0x80, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x81, 0x00, 0x08, 0x83, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60D4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x80, 0x08, 0x49, 0x80, 0x28, 0xDD, 0x00, 0x2C, 0x94, 0x00, 0x2A, 0x36, 0x00, 0x6A, 0x63, 0x00, 0x48, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x48, 0x80, 0x08, 0x49, 0x80, 0x08, 0xDD, 0x00, 0x08, 0x94, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60D5, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x6A, 0xFE, 0x00, 0x48, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0xA4, 0x80, 0x08, 0x64, 0x80, 0x08, 0xCC, 0x80, 0x09, 0x98, 0x80, 0x08, 0x31, 0x80, 0x08, 0x61, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60D8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x29, 0x45, 0x00, 0x2D, 0x29, 0x00, 0x2B, 0xFF, 0x00, 0x69, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x3D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60D9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x51, 0xAD, 0x00, 0x58, 0x42, 0x00, 0x54, 0xA5, 0x00, 0x55, 0x08, 0x80, 0x50, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x11, 0x21, 0x00, 0x10, 0xCA, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x2A, 0x00, 0x12, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60DA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x95, 0x00, 0x0B, 0x25, 0x00, 0x28, 0x49, 0x00, 0x29, 0x91, 0x00, 0x28, 0x22, 0x00, 0x08, 0xCC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x51, 0x00, 0x09, 0x41, 0x00, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60DB, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x28, 0x88, 0x00, 0x2C, 0xFF, 0x80, 0x2A, 0x84, 0x00, 0x6A, 0x84, 0x00, 0x48, 0xE2, 0x80, 0x09, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60DC, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0D, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60DD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x2C, 0x49, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x80, 0x80, 0x48, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60DE, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x13, 0x88, 0x00, 0x52, 0x1F, 0x80, 0x52, 0x14, 0x80, 0x5B, 0xF4, 0x80, 0x56, 0x45, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x4E, 0x00, 0x12, 0x4A, 0x00, 0x16, 0x4A, 0x00, 0x14, 0x4B, 0x00, 0x14, 0x59, 0x00, 0x10, 0x51, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60DF, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x88, 0x00, 0x0C, 0xFF, 0x00, 0x2B, 0x88, 0x00, 0x29, 0x88, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x45, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x02, 0x42, 0x00, 0x12, 0x21, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E2, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x12, 0x66, 0x00, 0x12, 0x23, 0x00, 0x32, 0x01, 0x00, 0x22, 0x00, 0x00, 0x23, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x06, 0x86, 0x80, 0x2A, 0xAA, 0x80, 0x28, 0xA8, 0x80, 0x28, 0x28, 0x00, 0x29, 0x29, 0x00, 0x2D, 0x2D, 0x00, 0x47, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E3, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x28, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x69, 0x25, 0x00, 0x0B, 0x6D, 0x00, 0x08, 0x49, 0x00, 0x0E, 0xD9, 0x00, 0x79, 0x93, 0x00, 0x08, 0x32, 0x00, 0x08, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E5, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x10, 0xBE, 0x00, 0x10, 0x82, 0x00, 0x1E, 0xBE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0xC7, 0x00, 0x02, 0x60, 0x00, 0x12, 0x23, 0x00, 0x12, 0x05, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x2D, 0x10, 0x00, 0x2B, 0x12, 0x00, 0x29, 0x1F, 0x00, 0x49, 0x10, 0x00, 0x09, 0x12, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x42, 0x00, 0x09, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E7, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x6A, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x62, 0x00, 0x08, 0x43, 0x00, 0x08, 0xFD, 0x00, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x6A, 0x24, 0x00, 0x48, 0x42, 0x00, 0x09, 0x89, 0x80, 0x08, 0x30, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x18, 0x80, 0x08, 0xE1, 0x80, 0x08, 0x07, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60E9, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x06, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x14, 0x00, 0x04, 0x9E, 0x00, 0x06, 0x90, 0x00, 0x0C, 0x90, 0x00, 0x14, 0x92, 0x00, 0x25, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x84, 0x00, 0x0A, 0x62, 0x00, 0x0A, 0x29, 0x00, 0x12, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60EB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x0A, 0x20, 0x00, 0x09, 0x40, 0x00, 0x11, 0xC0, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0F, 0x00, 0x6F, 0xFA, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x14, 0xC4, 0x00, 0x14, 0x4A, 0x00, 0x23, 0xFA, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60EC, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x14, 0x00, 0x2E, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x54, 0x00, 0x4A, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x44, 0x00, 0x0A, 0x82, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60ED, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x83, 0x00, 0x10, 0x9C, 0x00, 0x17, 0xF0, 0x00, 0x59, 0x10, 0x00, 0x56, 0x90, 0x00, 0x52, 0x9F, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x94, 0x00, 0x10, 0x94, 0x00, 0x10, 0xF4, 0x00, 0x17, 0x94, 0x00, 0x12, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60EE, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x09, 0xFC, 0x00, 0x2D, 0x24, 0x00, 0x2B, 0x24, 0x00, 0x29, 0xFC, 0x00, 0x49, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60EF, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFF, 0x00, 0x2D, 0x24, 0x00, 0x2B, 0xFC, 0x00, 0x28, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x58, 0x00, 0x08, 0x86, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x2A, 0x40, 0x00, 0x28, 0xFF, 0x00, 0x29, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x92, 0x00, 0x0D, 0x24, 0x00, 0x2A, 0x92, 0x00, 0x28, 0x49, 0x00, 0x28, 0x10, 0x00, 0x28, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x45, 0x00, 0x09, 0x29, 0x00, 0x09, 0x11, 0x00, 0x09, 0x29, 0x00, 0x09, 0x45, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x29, 0x10, 0x80, 0x2C, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x14, 0xA1, 0x00, 0x24, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x12, 0x41, 0x00, 0x12, 0x21, 0x00, 0x22, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x28, 0x91, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x69, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F5, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x2C, 0x92, 0x00, 0x2A, 0x9E, 0x00, 0x6A, 0x80, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x0B, 0x80, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x40, 0x00, 0x12, 0x23, 0x00, 0x32, 0x09, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60F8, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x29, 0x80, 0x80, 0x2C, 0x7C, 0x80, 0x2A, 0x44, 0x80, 0x6A, 0x7C, 0x80, 0x48, 0x44, 0x80, 0x08, 0x7D, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60F9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x01, 0x21, 0x00, 0x09, 0x10, 0x80, 0x11, 0x02, 0x80, 0x21, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60FA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x90, 0x00, 0x28, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x60FB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x08, 0xF0, 0x80, 0x08, 0x94, 0x80, 0x0A, 0x94, 0x80, 0x0A, 0x94, 0x80, 0x2A, 0xF4, 0x80, 0x28, 0x94, 0x80, 0x28, 0x94, 0x80, 0x08, 0xF4, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0xF4, 0x80, 0x08, 0x00, 0x80, 0x08, 0x90, 0x80, 0x09, 0x09, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60FC, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x09, 0x94, 0x80, 0x09, 0xFF, 0x80, 0x0A, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x60FD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x88, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x8C, 0x00, 0x48, 0xE4, 0x80, 0x09, 0x87, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6100, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x11, 0xC8, 0x00, 0x17, 0x09, 0x00, 0x51, 0x29, 0x00, 0x59, 0x2B, 0x00, 0x57, 0xEA, 0x00, 0x51, 0x2A, 0x00, 0x11, 0x08, 0x00, 0x13, 0x88, 0x00, 0x13, 0x5C, 0x00, 0x15, 0x54, 0x00, 0x15, 0x14, 0x00, 0x19, 0x16, 0x00, 0x11, 0x32, 0x00, 0x11, 0x23, 0x00, 0x11, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6101, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xAA, 0x00, 0x0C, 0x48, 0x00, 0x0E, 0x08, 0x00, 0x15, 0x14, 0x00, 0x14, 0x22, 0x00, 0x24, 0xC1, 0x80, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6102, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xC9, 0x00, 0x20, 0x49, 0x00, 0x1F, 0x99, 0x00, 0x01, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x02, 0x11, 0x00, 0x0E, 0x37, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6103, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x29, 0x00, 0x80, 0x2D, 0x7E, 0x80, 0x2A, 0x00, 0x00, 0x68, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6106, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x10, 0xBF, 0x00, 0x20, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x31, 0x04, 0x00, 0x11, 0x04, 0x00, 0x12, 0x04, 0x00, 0x12, 0x1C, 0x00, 0x00, 0x82, 0x00, 0x02, 0x41, 0x00, 0x12, 0x20, 0x80, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6107, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x28, 0x22, 0x00, 0x2D, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x6A, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6108, { 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x01, 0x90, 0x00, 0x06, 0x0C, 0x00, 0x39, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x0F, 0x92, 0x00, 0x08, 0xA4, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x89, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6109, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x28, 0x00, 0x0C, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x29, 0xE5, 0x00, 0x29, 0x25, 0x00, 0x09, 0xEA, 0x00, 0x09, 0x34, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x29, 0x00, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x610A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x2C, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x610C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0xC2, 0x00, 0x28, 0x84, 0x00, 0x2D, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x6A, 0xA9, 0x00, 0x48, 0xA9, 0x00, 0x08, 0xCF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x610D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x90, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x8C, 0x00, 0x11, 0x0C, 0x00, 0x16, 0x92, 0x00, 0x38, 0x61, 0x80, 0x00, 0x80, 0x00, 0x04, 0x42, 0x00, 0x14, 0x01, 0x00, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x610E, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x80, 0x00, 0x0B, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC2, 0x00, 0x0B, 0x2C, 0x00, 0x08, 0x10, 0x00, 0x08, 0x6C, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x610F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x12, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6110, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x28, 0x10, 0x00, 0x2C, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x6A, 0x94, 0x80, 0x48, 0x9C, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x9C, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6111, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x6A, 0x91, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x81, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x80, 0x08, 0x31, 0x80, 0x08, 0x61, 0x00, 0x08, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6112, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x6A, 0xFE, 0x00, 0x48, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x90, 0x80, 0x0B, 0x10, 0x80, 0x09, 0x38, 0x80, 0x09, 0x6C, 0x80, 0x09, 0x01, 0x80, 0x09, 0xF9, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6113, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x6A, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x0A, 0x6C, 0x80, 0x08, 0xC8, 0x80, 0x09, 0x99, 0x80, 0x08, 0x31, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6114, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x2C, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x6A, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6115, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x0A, 0x94, 0x80, 0x0A, 0xF7, 0x80, 0x2A, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x80, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6116, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x42, 0x00, 0x2C, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x6A, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0xA7, 0x80, 0x08, 0xC0, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6117, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x11, 0x3F, 0x00, 0x0A, 0x22, 0x00, 0x3F, 0xF6, 0x00, 0x0C, 0x9C, 0x00, 0x0D, 0x08, 0x00, 0x14, 0x1C, 0x00, 0x24, 0x36, 0x00, 0x0C, 0x23, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6119, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x13, 0xF2, 0x00, 0x06, 0x20, 0x00, 0x19, 0xC0, 0x00, 0x03, 0x38, 0x00, 0x3C, 0x0F, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x12, 0x40, 0x00, 0x12, 0x63, 0x00, 0x32, 0x25, 0x80, 0x23, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x611A, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x44, 0x80, 0x20, 0x7E, 0x80, 0x2F, 0x82, 0x80, 0x20, 0x81, 0x80, 0x00, 0x40, 0x00, 0x02, 0x21, 0x00, 0x12, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x611B, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0x80, 0x00, 0x08, 0x22, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0x45, 0x00, 0x0A, 0x04, 0x80, 0x13, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x02, 0x84, 0x00, 0x0C, 0x48, 0x00, 0x30, 0x30, 0x00, 0x01, 0xD8, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x611C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x52, 0x10, 0x00, 0x5B, 0xFF, 0x80, 0x56, 0x92, 0x00, 0x52, 0x92, 0x00, 0x52, 0x92, 0x00, 0x13, 0x55, 0x00, 0x13, 0x54, 0x80, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x12, 0x46, 0x00, 0x13, 0x81, 0x80, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x611E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x24, 0x80, 0x2D, 0x24, 0x80, 0x6B, 0x24, 0x80, 0x49, 0x25, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x611F, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x1F, 0xD2, 0x00, 0x10, 0x14, 0x00, 0x17, 0x88, 0x00, 0x14, 0x94, 0x00, 0x17, 0xA2, 0x80, 0x10, 0xC1, 0x80, 0x23, 0x02, 0x00, 0x20, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6120, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x5B, 0xFC, 0x00, 0x56, 0x04, 0x00, 0x52, 0x04, 0x00, 0x53, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6121, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x5A, 0xC9, 0x00, 0x54, 0x71, 0x00, 0x50, 0x99, 0x00, 0x51, 0x2B, 0x00, 0x10, 0x42, 0x00, 0x10, 0x0E, 0x00, 0x10, 0x20, 0x00, 0x10, 0xB0, 0x00, 0x12, 0x93, 0x00, 0x12, 0x85, 0x80, 0x16, 0x8C, 0x80, 0x14, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6122, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x28, 0x91, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x6A, 0x91, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0x1B, 0x00, 0x09, 0x49, 0x80, 0x09, 0x40, 0x80, 0x09, 0x40, 0x00, 0x0B, 0x63, 0x00, 0x0A, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6123, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x2F, 0xFE, 0x00, 0x2A, 0x40, 0x00, 0x28, 0x22, 0x00, 0x4F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x14, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6124, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x2C, 0xAA, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x49, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x50, 0x00, 0x08, 0x8C, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6126, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x0D, 0x24, 0x00, 0x29, 0xFC, 0x00, 0x28, 0x20, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x58, 0x00, 0x08, 0x84, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6127, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x4D, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x88, 0x80, 0x09, 0x08, 0x80, 0x0A, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6128, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x43, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x22, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x36, 0x00, 0x00, 0xC1, 0x80, 0x12, 0x60, 0x00, 0x12, 0x25, 0x00, 0x33, 0x0D, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x612A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x28, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x612B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x28, 0xFE, 0x00, 0x2C, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x6A, 0x10, 0x00, 0x48, 0x24, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x32, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x612C, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x31, 0x9F, 0x00, 0x11, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x1F, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x9F, 0x00, 0x08, 0x11, 0x00, 0x18, 0x11, 0x00, 0x70, 0x27, 0x00, 0x02, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6130, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x29, 0x11, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6131, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0xA0, 0x00, 0x29, 0xA0, 0x00, 0x2C, 0xBF, 0x00, 0x6A, 0xC8, 0x00, 0x48, 0x88, 0x00, 0x09, 0x88, 0x00, 0x0A, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x9C, 0x00, 0x09, 0x94, 0x00, 0x09, 0x36, 0x00, 0x09, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6134, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0xBE, 0x80, 0x2A, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC1, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6135, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x10, 0x20, 0x80, 0x10, 0x20, 0x80, 0x51, 0xEF, 0x80, 0x59, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0xEF, 0x80, 0x50, 0x20, 0x80, 0x10, 0x63, 0x80, 0x10, 0xA4, 0x80, 0x11, 0x28, 0x80, 0x10, 0x63, 0x80, 0x10, 0xA4, 0x80, 0x11, 0x28, 0x80, 0x10, 0x61, 0x80, 0x10, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6136, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x62, 0x00, 0x51, 0x8C, 0x00, 0x51, 0x04, 0x00, 0x5B, 0xEF, 0x80, 0x55, 0x24, 0x80, 0x52, 0x69, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x12, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6137, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6139, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x2C, 0xA2, 0x80, 0x2A, 0x63, 0x00, 0x6A, 0xC9, 0x80, 0x48, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x613C, { 0x00, 0x00, 0x00, 0x08, 0x87, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x80, 0x80, 0x0C, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x0A, 0x81, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x81, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x613D, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x00, 0x2B, 0x11, 0x00, 0x69, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x42, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x613E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x80, 0x00, 0x2B, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x29, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xB2, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x08, 0x72, 0x80, 0x08, 0xA9, 0x80, 0x0B, 0x26, 0x80, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x613F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x22, 0x22, 0x00, 0x24, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x12, 0x45, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6141, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFA, 0x00, 0x11, 0xC2, 0x00, 0x17, 0x66, 0x00, 0x10, 0xBA, 0x00, 0x17, 0x72, 0x00, 0x10, 0xAA, 0x00, 0x17, 0x26, 0x00, 0x10, 0xC2, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x43, 0x00, 0x12, 0x61, 0x80, 0x32, 0x24, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6142, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x4C, 0x00, 0x20, 0x30, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x21, 0x00, 0x22, 0x23, 0x00, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6144, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x0D, 0xFF, 0x00, 0x2B, 0x29, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x18, 0x00, 0x08, 0x34, 0x00, 0x08, 0x52, 0x00, 0x08, 0x91, 0x00, 0x0B, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6145, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x51, 0x00, 0x09, 0x4A, 0x00, 0x29, 0xA4, 0x00, 0x2C, 0xA8, 0x00, 0x2A, 0x18, 0x00, 0x6A, 0x26, 0x00, 0x49, 0xC1, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x1F, 0x80, 0x09, 0xF0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6146, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xF0, 0x00, 0x28, 0x52, 0x00, 0x2C, 0xDB, 0x00, 0x2A, 0x89, 0x00, 0x6A, 0x00, 0x00, 0x48, 0x70, 0x00, 0x09, 0xC7, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xE7, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6147, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x1E, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x12, 0x80, 0x1F, 0x23, 0x80, 0x11, 0xC0, 0x00, 0x1F, 0x7F, 0x00, 0x10, 0x21, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x26, 0x21, 0x80, 0x00, 0xC0, 0x00, 0x12, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6148, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x05, 0x52, 0x00, 0x29, 0x22, 0x00, 0x12, 0x14, 0x00, 0x0C, 0x89, 0x00, 0x09, 0xD7, 0x80, 0x3E, 0x78, 0x80, 0x01, 0x00, 0x00, 0x04, 0x81, 0x00, 0x14, 0x41, 0x00, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6149, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x2C, 0x24, 0x00, 0x2A, 0xF9, 0x00, 0x6A, 0x11, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x614A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x0A, 0x82, 0x00, 0x0B, 0xFF, 0x00, 0x2A, 0x48, 0x80, 0x28, 0x48, 0x00, 0x29, 0xFE, 0x00, 0x08, 0x4A, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x4A, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x08, 0xCC, 0x00, 0x09, 0x4A, 0x00, 0x0A, 0x49, 0x00, 0x08, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x614B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x13, 0xA7, 0x00, 0x3C, 0x78, 0x00, 0x00, 0x20, 0x80, 0x1F, 0xBF, 0x80, 0x10, 0x80, 0x00, 0x1F, 0xA3, 0x80, 0x10, 0xBC, 0x00, 0x1F, 0xA0, 0x80, 0x10, 0xBF, 0x80, 0x13, 0x80, 0x00, 0x00, 0x42, 0x00, 0x12, 0x21, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x614C, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x80, 0x00, 0x28, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x80, 0x09, 0x13, 0x80, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x614D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2C, 0xBA, 0x00, 0x2A, 0xAA, 0x00, 0x6A, 0xC6, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x614E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x58, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x50, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6151, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x2C, 0xFC, 0x00, 0x2A, 0x84, 0x00, 0x28, 0xFC, 0x00, 0x48, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x09, 0x54, 0x00, 0x08, 0x88, 0x00, 0x09, 0x54, 0x00, 0x0A, 0x23, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6153, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6155, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x49, 0x80, 0x04, 0x64, 0x00, 0x08, 0x52, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6158, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x4F, 0x00, 0x0B, 0xF0, 0x80, 0x0A, 0x44, 0x00, 0x2A, 0x89, 0x00, 0x29, 0x3F, 0x80, 0x2B, 0xE8, 0x80, 0x28, 0x24, 0x00, 0x08, 0xD3, 0x80, 0x0B, 0x24, 0x00, 0x08, 0x48, 0x00, 0x09, 0xB1, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x18, 0x00, 0x09, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6159, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x3F, 0xB8, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x04, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x20, 0x80, 0x12, 0x02, 0x80, 0x23, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x615A, { 0x00, 0x00, 0x00, 0x10, 0x81, 0x80, 0x10, 0x8F, 0x00, 0x17, 0xF8, 0x00, 0x50, 0x88, 0x00, 0x5B, 0xE8, 0x00, 0x56, 0xAF, 0x80, 0x52, 0xA9, 0x00, 0x13, 0xE9, 0x00, 0x12, 0xA9, 0x00, 0x12, 0xA9, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x89, 0x00, 0x17, 0xF9, 0x00, 0x10, 0x89, 0x00, 0x10, 0x91, 0x00, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x615D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x1D, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x20, 0x80, 0x12, 0x02, 0x80, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x615E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x28, 0x42, 0x00, 0x2C, 0x24, 0x00, 0x2B, 0xFF, 0x80, 0x6A, 0x00, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x615F, { 0x00, 0x00, 0x00, 0x04, 0x72, 0x00, 0x05, 0xC2, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x18, 0x4F, 0x80, 0x19, 0xF2, 0x80, 0x29, 0x52, 0x80, 0x29, 0xF2, 0x80, 0x09, 0x52, 0x80, 0x09, 0xF2, 0x80, 0x08, 0x44, 0x80, 0x0B, 0xF4, 0x80, 0x08, 0x44, 0x80, 0x08, 0x78, 0x80, 0x0B, 0xC8, 0x80, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6160, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x13, 0xE8, 0x00, 0x50, 0x8F, 0x80, 0x58, 0x99, 0x00, 0x57, 0xF9, 0x00, 0x54, 0x89, 0x00, 0x50, 0x8D, 0x00, 0x13, 0xE5, 0x00, 0x10, 0x85, 0x00, 0x10, 0xE7, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xA7, 0x00, 0x11, 0x25, 0x00, 0x11, 0x2D, 0x80, 0x12, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6162, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x0A, 0x44, 0x80, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x66, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6163, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x92, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6164, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBE, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x80, 0x20, 0xA3, 0x80, 0x3F, 0x40, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x14, 0x00, 0x1F, 0x0C, 0x00, 0x11, 0x53, 0x80, 0x21, 0xA0, 0x00, 0x04, 0x41, 0x00, 0x14, 0x24, 0x80, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6165, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x12, 0x28, 0x00, 0x13, 0x28, 0x00, 0x51, 0x7F, 0x00, 0x5A, 0x48, 0x00, 0x57, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x17, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x3E, 0x00, 0x13, 0x80, 0x00, 0x16, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6167, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x1F, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x07, 0xBF, 0x80, 0x3C, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6168, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x0D, 0x2A, 0x00, 0x2B, 0x2A, 0x00, 0x29, 0xEA, 0x00, 0x29, 0x2A, 0x00, 0x29, 0x3F, 0x80, 0x09, 0xE2, 0x00, 0x09, 0x02, 0x00, 0x09, 0xE6, 0x00, 0x09, 0x06, 0x00, 0x09, 0xEA, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x80, 0x09, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x616B, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0xAA, 0x00, 0x23, 0x11, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x9F, 0x00, 0x28, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x50, 0x00, 0x0A, 0x3F, 0x80, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x02, 0x80, 0x13, 0xFE, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x616C, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x42, 0x00, 0x2C, 0x7E, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x616E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBC, 0x80, 0x1F, 0xC1, 0x00, 0x10, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x41, 0x00, 0x25, 0x20, 0x80, 0x25, 0x02, 0x80, 0x29, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x616F, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x68, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x08, 0x91, 0x00, 0x09, 0x23, 0x00, 0x08, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6170, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xC2, 0x00, 0x22, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x86, 0x00, 0x02, 0x00, 0x00, 0x05, 0x01, 0x00, 0x14, 0x84, 0x80, 0x17, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6171, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x00, 0x2B, 0x11, 0x00, 0x69, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x12, 0x00, 0x08, 0x7F, 0x00, 0x0B, 0xC1, 0x80, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6172, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x50, 0x44, 0x00, 0x50, 0x7C, 0x00, 0x58, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x52, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x52, 0x80, 0x12, 0x52, 0x80, 0x12, 0xB5, 0x80, 0x13, 0x39, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6173, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xE0, 0x00, 0x12, 0x9F, 0x00, 0x52, 0x89, 0x00, 0x5B, 0xEB, 0x00, 0x56, 0x2E, 0x00, 0x53, 0xE4, 0x00, 0x12, 0x8E, 0x00, 0x12, 0x9B, 0x00, 0x13, 0xE1, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6174, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0xA2, 0x80, 0x2D, 0x24, 0x80, 0x2A, 0x61, 0x80, 0x28, 0xA2, 0x80, 0x69, 0x24, 0x80, 0x48, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6175, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x5A, 0x11, 0x00, 0x57, 0xFF, 0x80, 0x52, 0x11, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x16, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x1C, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x10, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6176, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x15, 0x26, 0x00, 0x19, 0xFD, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFE, 0x00, 0x12, 0x88, 0x00, 0x2C, 0x70, 0x00, 0x21, 0xDC, 0x00, 0x2E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6177, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x88, 0x00, 0x0A, 0xBE, 0x00, 0x2A, 0x8A, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x8A, 0x00, 0x08, 0xBE, 0x00, 0x08, 0xC9, 0x00, 0x08, 0xAA, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x9C, 0x00, 0x08, 0xAA, 0x00, 0x09, 0x29, 0x00, 0x09, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6178, { 0x00, 0x00, 0x00, 0x05, 0x28, 0x00, 0x05, 0x28, 0x00, 0x3F, 0xFF, 0x00, 0x05, 0x28, 0x00, 0x19, 0x26, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x00, 0x80, 0x00, 0x14, 0xE3, 0x00, 0x34, 0x21, 0x80, 0x26, 0x04, 0x80, 0x63, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x617B, { 0x00, 0x00, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x92, 0x00, 0x29, 0xFF, 0x00, 0x2C, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x6B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x82, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x617C, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0xD0, 0x00, 0x11, 0x12, 0x00, 0x1F, 0xDA, 0x00, 0x11, 0x0A, 0x00, 0x15, 0x4C, 0x00, 0x19, 0x55, 0x00, 0x13, 0x17, 0x00, 0x20, 0x12, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x32, 0x25, 0x80, 0x23, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x617D, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x05, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x0D, 0x24, 0x00, 0x2B, 0x3C, 0x80, 0x29, 0x24, 0x80, 0x29, 0xFD, 0x00, 0x09, 0x25, 0x00, 0x09, 0x75, 0x00, 0x09, 0xAE, 0x00, 0x09, 0x24, 0x00, 0x09, 0x26, 0x00, 0x09, 0x6A, 0x80, 0x0A, 0x12, 0x80, 0x0A, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x617E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x10, 0x00, 0x24, 0xBF, 0x80, 0x0A, 0x41, 0x00, 0x11, 0x08, 0x00, 0x20, 0x88, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x41, 0x80, 0x11, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x12, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x617F, { 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x32, 0x20, 0x00, 0x1B, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x03, 0xFC, 0x00, 0x1A, 0x20, 0x00, 0x33, 0xFF, 0x00, 0x01, 0x21, 0x00, 0x1F, 0xFD, 0x00, 0x02, 0x21, 0x00, 0x04, 0x23, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x32, 0x25, 0x80, 0x23, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6180, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x63, 0x00, 0x28, 0xA5, 0x00, 0x2C, 0x63, 0x00, 0x2A, 0xA5, 0x00, 0x68, 0x10, 0x00, 0x48, 0x38, 0x00, 0x08, 0xEE, 0x00, 0x0B, 0x83, 0x80, 0x08, 0x10, 0x00, 0x08, 0xE4, 0x00, 0x08, 0x19, 0x00, 0x08, 0xE2, 0x00, 0x08, 0x0C, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6181, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0xA1, 0x00, 0x0A, 0xBD, 0x00, 0x2A, 0xE5, 0x00, 0x28, 0x99, 0x00, 0x28, 0x95, 0x00, 0x08, 0xA3, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0x49, 0x00, 0x09, 0x48, 0x80, 0x0A, 0x42, 0x80, 0x0A, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6182, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x0A, 0x4A, 0x00, 0x13, 0xF9, 0x00, 0x21, 0x01, 0x00, 0x03, 0xFC, 0x00, 0x0D, 0x18, 0x00, 0x30, 0xE0, 0x00, 0x03, 0xB0, 0x00, 0x3C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6183, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x88, 0x00, 0x0F, 0x3C, 0x00, 0x34, 0x0B, 0x00, 0x07, 0x38, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x12, 0x41, 0x00, 0x32, 0x25, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6184, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x25, 0x7E, 0x00, 0x0D, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x19, 0x42, 0x00, 0x29, 0x7E, 0x00, 0x09, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6187, { 0x00, 0x00, 0x00, 0x03, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x78, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x7F, 0xA2, 0x00, 0x08, 0x3E, 0x00, 0x3F, 0x22, 0x00, 0x21, 0x22, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x618A, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0x93, 0x00, 0x00, 0x40, 0x00, 0x0A, 0x21, 0x00, 0x12, 0x02, 0x80, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x618B, { 0x00, 0x00, 0x00, 0x15, 0x10, 0x00, 0x24, 0x90, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xF6, 0x00, 0x2E, 0x9C, 0x00, 0x35, 0x88, 0x00, 0x24, 0x9E, 0x00, 0x25, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x618D, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x20, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x44, 0x00, 0x2A, 0xFE, 0x00, 0x6B, 0x45, 0x80, 0x48, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x618E, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x02, 0x00, 0x08, 0x41, 0x80, 0x0B, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x28, 0xAA, 0x80, 0x28, 0x9C, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6190, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x38, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x92, 0x00, 0x29, 0x11, 0x80, 0x08, 0x82, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x2A, 0x00, 0x0A, 0xCA, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x1F, 0x80, 0x0A, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6191, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x04, 0x80, 0x20, 0x92, 0x80, 0x24, 0x49, 0x00, 0x09, 0x06, 0x00, 0x02, 0x80, 0x00, 0x0A, 0x45, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6192, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x2C, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6193, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x2D, 0x11, 0x00, 0x2B, 0xFF, 0x00, 0x69, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x80, 0x08, 0xB3, 0x00, 0x0A, 0x91, 0x80, 0x0A, 0x82, 0x80, 0x0A, 0xC6, 0x00, 0x0A, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6194, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x50, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x90, 0x00, 0x29, 0x90, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x29, 0x00, 0x09, 0x14, 0x80, 0x0A, 0x14, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6196, { 0x00, 0x00, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x0B, 0x00, 0x7F, 0xC9, 0x00, 0x04, 0x3F, 0x80, 0x15, 0x08, 0x00, 0x2E, 0x9C, 0x00, 0x04, 0x14, 0x00, 0x0E, 0x16, 0x00, 0x15, 0x33, 0x00, 0x64, 0x61, 0x80, 0x04, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6197, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xBF, 0x80, 0x04, 0x22, 0x00, 0x15, 0x56, 0x00, 0x15, 0x1C, 0x00, 0x2E, 0x88, 0x00, 0x4E, 0x5C, 0x00, 0x15, 0x37, 0x00, 0x64, 0xA1, 0x80, 0x04, 0x40, 0x00, 0x02, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6198, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6199, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x14, 0x40, 0x80, 0x14, 0x02, 0x80, 0x27, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x619A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x0B, 0xEF, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x619C, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0x88, 0x00, 0x12, 0xBF, 0x80, 0x12, 0x90, 0x00, 0x53, 0xBF, 0x00, 0x5B, 0x44, 0x00, 0x57, 0x3F, 0x80, 0x52, 0x80, 0x00, 0x52, 0x9F, 0x00, 0x12, 0x91, 0x00, 0x13, 0x9F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x619D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x76, 0x00, 0x3F, 0x9C, 0x00, 0x02, 0x08, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x36, 0x00, 0x04, 0x23, 0x00, 0x0C, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x619F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x29, 0xFF, 0x00, 0x2D, 0x49, 0x00, 0x2B, 0x49, 0x00, 0x69, 0xFF, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61A0, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x50, 0x00, 0x12, 0x90, 0x00, 0x1F, 0xDF, 0x00, 0x11, 0x29, 0x00, 0x15, 0x4A, 0x00, 0x15, 0x48, 0x00, 0x17, 0xDC, 0x00, 0x31, 0x14, 0x00, 0x23, 0x36, 0x00, 0x0E, 0x23, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61A4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0C, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61A5, { 0x00, 0x00, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x1C, 0x38, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x32, 0x25, 0x80, 0x23, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61A7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0C, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61A8, { 0x00, 0x00, 0x00, 0x0F, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xBF, 0x00, 0x09, 0x22, 0x00, 0x0F, 0x76, 0x00, 0x09, 0x1C, 0x00, 0x0F, 0x08, 0x00, 0x09, 0x1C, 0x00, 0x3F, 0xB6, 0x00, 0x01, 0x23, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61A9, { 0x00, 0x00, 0x00, 0x03, 0x22, 0x00, 0x3C, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xBE, 0x00, 0x20, 0xA2, 0x00, 0x20, 0xA2, 0x00, 0x3F, 0xBE, 0x00, 0x00, 0xA2, 0x00, 0x00, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61AA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x51, 0x24, 0x80, 0x59, 0xE7, 0x80, 0x55, 0x00, 0x80, 0x51, 0x3C, 0x80, 0x51, 0x24, 0x80, 0x11, 0x3C, 0x80, 0x11, 0x24, 0x80, 0x11, 0x3C, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x2C, 0x80, 0x11, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61AB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x0D, 0xE7, 0x80, 0x2B, 0x24, 0x80, 0x2B, 0xE7, 0x80, 0x29, 0x00, 0x80, 0x29, 0x08, 0x80, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x80, 0x09, 0x14, 0x80, 0x09, 0x08, 0x80, 0x09, 0x18, 0x80, 0x09, 0x24, 0x80, 0x09, 0x42, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61AC, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61AD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x28, 0x44, 0x00, 0x2D, 0x45, 0x00, 0x2A, 0x82, 0x00, 0x69, 0xFF, 0x00, 0x4A, 0x82, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61AE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x0B, 0xFF, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0x25, 0x00, 0x09, 0x25, 0x00, 0x09, 0x25, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61B2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x12, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61B6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0C, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x09, 0x48, 0x80, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61B7, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x2D, 0xDC, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0x88, 0x00, 0x4B, 0xFE, 0x00, 0x08, 0x24, 0x00, 0x09, 0x20, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x20, 0x00, 0x09, 0xA0, 0x00, 0x09, 0x60, 0x00, 0x0A, 0x23, 0x00, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61B8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x28, 0xC6, 0x00, 0x2D, 0x83, 0x80, 0x2A, 0x7C, 0x00, 0x6A, 0x00, 0x00, 0x49, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0xC7, 0x00, 0x0B, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61B9, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x51, 0xFF, 0x00, 0x59, 0x49, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x91, 0x00, 0x12, 0x9B, 0x00, 0x14, 0xEE, 0x00, 0x11, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61BA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x0A, 0x84, 0x00, 0x0B, 0xFF, 0x80, 0x2B, 0x28, 0x80, 0x2B, 0xC7, 0x80, 0x29, 0x7F, 0x00, 0x29, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61BC, { 0x00, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x0A, 0x3F, 0x00, 0x10, 0x22, 0x00, 0x3F, 0xF6, 0x00, 0x20, 0x9C, 0x00, 0x1C, 0x88, 0x00, 0x14, 0x9E, 0x00, 0x1D, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x21, 0x80, 0x32, 0x04, 0x80, 0x23, 0x0C, 0x00, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61BE, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x0B, 0x10, 0x00, 0x2B, 0xF8, 0x00, 0x2B, 0x08, 0x00, 0x29, 0x74, 0x80, 0x09, 0x52, 0x80, 0x09, 0x71, 0x80, 0x09, 0x00, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x48, 0x80, 0x0D, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61C0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0xC6, 0x00, 0x2B, 0xBB, 0x80, 0x2C, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x6B, 0x11, 0x00, 0x49, 0x55, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61C1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x29, 0x49, 0x00, 0x2D, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x6B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x50, 0x80, 0x08, 0x93, 0x00, 0x09, 0x8C, 0x00, 0x0A, 0xB3, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61C2, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x6A, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61C3, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x3F, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x4C, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61C6, { 0x00, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x2C, 0x7C, 0x00, 0x2A, 0x00, 0x00, 0x29, 0xEF, 0x00, 0x69, 0x29, 0x00, 0x49, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61C7, { 0x00, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x0D, 0x22, 0x00, 0x32, 0x3E, 0x00, 0x0E, 0x22, 0x00, 0x33, 0x3E, 0x00, 0x05, 0x28, 0x00, 0x09, 0x29, 0x00, 0x33, 0x26, 0x00, 0x05, 0x3C, 0x00, 0x09, 0xE2, 0x00, 0x36, 0x01, 0x80, 0x00, 0x80, 0x00, 0x04, 0x45, 0x00, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61C8, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x8F, 0x00, 0x09, 0xF5, 0x00, 0x09, 0x25, 0x00, 0x0E, 0x45, 0x00, 0x2D, 0xF9, 0x00, 0x29, 0x56, 0x00, 0x29, 0x52, 0x00, 0x09, 0xFA, 0x00, 0x09, 0x5F, 0x80, 0x09, 0x5A, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x1F, 0x80, 0x09, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x0C, 0x32, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61C9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x11, 0x28, 0x00, 0x12, 0x7F, 0x00, 0x16, 0x48, 0x00, 0x1A, 0xFF, 0x00, 0x13, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x80, 0x12, 0xC0, 0x00, 0x10, 0x41, 0x00, 0x25, 0x20, 0x80, 0x25, 0x02, 0x80, 0x29, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61CA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x1D, 0x00, 0x0D, 0x71, 0x00, 0x2B, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x39, 0x00, 0x09, 0x55, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61CB, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x3E, 0x2F, 0x80, 0x0B, 0xFA, 0x00, 0x1C, 0x56, 0x00, 0x1A, 0xC7, 0x00, 0x29, 0x4A, 0x80, 0x2A, 0x52, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x00, 0x40, 0x00, 0x02, 0x22, 0x00, 0x12, 0x01, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61CC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x2D, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x68, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61CD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x2A, 0xBA, 0x00, 0x6A, 0xAA, 0x00, 0x48, 0xBA, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x01, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x0B, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61CE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2D, 0x55, 0x00, 0x6A, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xBD, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61CF, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x88, 0x00, 0x2D, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x3C, 0x80, 0x09, 0x00, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61D0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x59, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x10, 0xCC, 0x80, 0x11, 0x85, 0x00, 0x16, 0x86, 0x00, 0x10, 0xF3, 0x00, 0x13, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61D1, { 0x00, 0x00, 0x00, 0x20, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x43, 0xFE, 0x00, 0x30, 0x88, 0x00, 0x17, 0xFE, 0x00, 0x0A, 0x8A, 0x00, 0x13, 0x56, 0x00, 0x72, 0x22, 0x00, 0x12, 0x06, 0x00, 0x00, 0x00, 0x00, 0x15, 0x04, 0x00, 0x14, 0xC2, 0x00, 0x24, 0x49, 0x00, 0x44, 0x09, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61D2, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xEE, 0x00, 0x11, 0x12, 0x00, 0x57, 0xE4, 0x00, 0x55, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x55, 0x55, 0x00, 0x17, 0xD5, 0x00, 0x11, 0x15, 0x00, 0x13, 0x95, 0x00, 0x15, 0x55, 0x00, 0x19, 0x15, 0x00, 0x11, 0x04, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61D4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x2E, 0x8A, 0x00, 0x2A, 0xFA, 0x00, 0x2A, 0x8A, 0x00, 0x4B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61D5, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x2F, 0x8A, 0x00, 0x20, 0x09, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x2F, 0x9C, 0x00, 0x28, 0x94, 0x00, 0x6F, 0x96, 0x00, 0x48, 0xB2, 0x00, 0x49, 0xA3, 0x00, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61DC, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xC7, 0x80, 0x10, 0x44, 0x00, 0x51, 0xFF, 0x00, 0x51, 0x29, 0x00, 0x59, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x12, 0x20, 0x80, 0x12, 0x7E, 0x80, 0x10, 0xC4, 0x00, 0x11, 0xAC, 0x00, 0x10, 0x18, 0x00, 0x10, 0x30, 0x00, 0x11, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61DD, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x5F, 0x00, 0x13, 0x81, 0x00, 0x12, 0x12, 0x00, 0x52, 0x4C, 0x00, 0x59, 0xC4, 0x00, 0x56, 0xBF, 0x80, 0x53, 0xC4, 0x80, 0x52, 0x85, 0x00, 0x14, 0x94, 0x00, 0x13, 0xD7, 0x00, 0x10, 0x94, 0x00, 0x11, 0x54, 0x00, 0x11, 0x3C, 0x00, 0x12, 0x16, 0x00, 0x12, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61DE, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x00, 0x80, 0x2D, 0x7E, 0x80, 0x6A, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x51, 0x80, 0x09, 0xAB, 0x00, 0x08, 0x48, 0x00, 0x09, 0x9C, 0x00, 0x08, 0x6A, 0x00, 0x09, 0x89, 0x80, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61DF, { 0x00, 0x00, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0xC2, 0x00, 0x1A, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xDA, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x3F, 0xCE, 0x00, 0x00, 0x40, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61E1, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x42, 0x00, 0x5A, 0xCA, 0x80, 0x57, 0x6A, 0x80, 0x52, 0x52, 0x80, 0x12, 0x00, 0x00, 0x12, 0x24, 0x00, 0x12, 0x4C, 0x00, 0x16, 0xD9, 0x00, 0x14, 0x31, 0x00, 0x14, 0x67, 0x00, 0x11, 0xFD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61E2, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xF4, 0x00, 0x12, 0x84, 0x00, 0x13, 0xEF, 0x80, 0x52, 0x28, 0x00, 0x5A, 0x38, 0x00, 0x57, 0xE7, 0x00, 0x52, 0x80, 0x00, 0x53, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61E3, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x60, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0x55, 0x00, 0x19, 0xBB, 0x00, 0x31, 0x11, 0x00, 0x61, 0x13, 0x00, 0x00, 0x00, 0x00, 0x12, 0xC3, 0x00, 0x12, 0x65, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61E5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x52, 0x00, 0x80, 0x58, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x50, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x41, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x90, 0x80, 0x10, 0x9E, 0x00, 0x11, 0xF0, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61E6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x2B, 0x10, 0x80, 0x29, 0xD7, 0x00, 0x28, 0x10, 0x00, 0x09, 0xD7, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61E7, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x20, 0x80, 0x52, 0x50, 0x80, 0x59, 0x45, 0x00, 0x56, 0x7C, 0x80, 0x54, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61E9, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x50, 0xFE, 0x00, 0x58, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x92, 0x00, 0x51, 0xFF, 0x00, 0x12, 0x82, 0x80, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x80, 0x10, 0x89, 0x00, 0x10, 0xE6, 0x00, 0x11, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61EC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x27, 0xFE, 0x00, 0x21, 0x08, 0x00, 0x20, 0xF0, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x64, 0x44, 0x00, 0x47, 0xFC, 0x00, 0x5C, 0x07, 0x00, 0x02, 0xC0, 0x00, 0x12, 0x65, 0x00, 0x33, 0x0D, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61ED, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x2D, 0x7F, 0x00, 0x2B, 0x22, 0x00, 0x29, 0x3E, 0x00, 0x69, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61EF, { 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xB2, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x8E, 0x00, 0x08, 0x04, 0x00, 0x3F, 0x8E, 0x00, 0x08, 0x0A, 0x00, 0x0F, 0x1B, 0x00, 0x19, 0x31, 0x80, 0x33, 0x00, 0x00, 0x02, 0x43, 0x00, 0x32, 0x25, 0x80, 0x61, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61F2, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x09, 0x52, 0x00, 0x11, 0x52, 0x00, 0x25, 0xF7, 0x80, 0x05, 0x15, 0x00, 0x08, 0x0D, 0x00, 0x19, 0xF5, 0x00, 0x28, 0x42, 0x00, 0x09, 0xF6, 0x00, 0x08, 0x45, 0x00, 0x09, 0xF8, 0x80, 0x00, 0x80, 0x00, 0x04, 0x41, 0x00, 0x14, 0x40, 0x80, 0x14, 0x04, 0x80, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61F4, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x85, 0x00, 0x13, 0xE5, 0x80, 0x50, 0x84, 0x80, 0x58, 0x84, 0x00, 0x57, 0xFF, 0x80, 0x51, 0x44, 0x00, 0x17, 0x75, 0x00, 0x11, 0x45, 0x00, 0x17, 0x75, 0x00, 0x11, 0x47, 0x00, 0x17, 0x72, 0x00, 0x11, 0x46, 0x00, 0x11, 0xF6, 0x80, 0x17, 0x0B, 0x80, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61F5, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x11, 0xFC, 0x00, 0x59, 0x54, 0x00, 0x55, 0xFC, 0x00, 0x50, 0x00, 0x00, 0x57, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x19, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61F6, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x44, 0x80, 0x0B, 0xF4, 0x80, 0x2C, 0x48, 0x80, 0x2B, 0xF3, 0x00, 0x29, 0x50, 0x00, 0x09, 0x57, 0x80, 0x09, 0x54, 0x80, 0x09, 0xF7, 0x80, 0x08, 0x44, 0x80, 0x08, 0xE7, 0x80, 0x08, 0xD4, 0x80, 0x09, 0x47, 0x80, 0x09, 0x42, 0x80, 0x0A, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61F7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0xA5, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x29, 0xD7, 0x00, 0x08, 0x10, 0x00, 0x09, 0xD7, 0x00, 0x08, 0x28, 0x80, 0x08, 0x69, 0x00, 0x08, 0xA6, 0x00, 0x0B, 0x22, 0x00, 0x08, 0x3D, 0x00, 0x09, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61F8, { 0x00, 0x00, 0x00, 0x0F, 0x88, 0x00, 0x28, 0x88, 0x00, 0x2F, 0xD2, 0x00, 0x28, 0xA2, 0x00, 0x2F, 0x94, 0x00, 0x2F, 0x89, 0x00, 0x20, 0x17, 0x00, 0x3F, 0xB8, 0x80, 0x24, 0x0A, 0x00, 0x15, 0x29, 0x00, 0x14, 0xC8, 0x80, 0x21, 0x00, 0x00, 0x04, 0x82, 0x00, 0x14, 0x85, 0x00, 0x14, 0x05, 0x00, 0x27, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61FA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x29, 0x00, 0x0A, 0xA8, 0x00, 0x0C, 0x58, 0x00, 0x2C, 0x88, 0x00, 0x2F, 0xFF, 0x80, 0x29, 0x48, 0x00, 0x0B, 0x69, 0x00, 0x09, 0x49, 0x00, 0x0B, 0x6A, 0x00, 0x09, 0x4C, 0x00, 0x09, 0xF4, 0x00, 0x0F, 0x0A, 0x80, 0x08, 0x11, 0x80, 0x08, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61FC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xE7, 0x00, 0x08, 0xA5, 0x00, 0x0A, 0xE7, 0x00, 0x0A, 0xA5, 0x00, 0x2A, 0xE7, 0x00, 0x28, 0x28, 0x00, 0x28, 0x48, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61FD, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x29, 0xEF, 0x00, 0x29, 0x29, 0x00, 0x2D, 0xEF, 0x00, 0x6A, 0x44, 0x00, 0x48, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x88, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x61FE, { 0x00, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x50, 0x84, 0x00, 0x58, 0xFC, 0x00, 0x54, 0x87, 0x00, 0x53, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x17, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x13, 0xCF, 0x00, 0x12, 0x49, 0x00, 0x13, 0xCF, 0x00, 0x12, 0x49, 0x00, 0x17, 0xDF, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x61FF, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x3F, 0xA8, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xD5, 0x00, 0x00, 0x24, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x94, 0x00, 0x1F, 0x6A, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x60, 0x80, 0x11, 0x10, 0x00, 0x1F, 0x28, 0x00, 0x12, 0x61, 0x00, 0x0B, 0xA2, 0x80, 0x3C, 0xBE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6200, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x08, 0x04, 0x00, 0x33, 0xF9, 0x00, 0x14, 0x1A, 0x00, 0x1A, 0xE5, 0x00, 0x3E, 0x1F, 0x80, 0x08, 0xE2, 0x00, 0x2A, 0x0A, 0x80, 0x2A, 0xEA, 0x80, 0x08, 0xE2, 0x00, 0x01, 0x00, 0x00, 0x02, 0x82, 0x00, 0x12, 0x01, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6201, { 0x00, 0x00, 0x00, 0x11, 0x09, 0x00, 0x7F, 0xCB, 0x00, 0x11, 0x1F, 0x80, 0x3F, 0xB2, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x9F, 0x80, 0x04, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0x92, 0x00, 0x0A, 0x12, 0x00, 0x1B, 0x1F, 0x80, 0x71, 0xC0, 0x00, 0x02, 0x43, 0x00, 0x32, 0x25, 0x80, 0x61, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6203, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x82, 0x80, 0x52, 0xFE, 0x80, 0x58, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x93, 0x00, 0x11, 0x55, 0x00, 0x11, 0x39, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x49, 0x00, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6204, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x51, 0xEF, 0x00, 0x59, 0x29, 0x00, 0x55, 0xFF, 0x80, 0x57, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x10, 0x78, 0x00, 0x17, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6206, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7F, 0xBF, 0x00, 0x0A, 0x54, 0x00, 0x7F, 0x88, 0x00, 0x11, 0x77, 0x00, 0x1F, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x1F, 0x22, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x14, 0x00, 0x05, 0x22, 0x00, 0x28, 0xC2, 0x00, 0x28, 0x49, 0x00, 0x48, 0x09, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6207, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x3F, 0x00, 0x0A, 0x62, 0x00, 0x3F, 0x9C, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0xC8, 0x00, 0x1F, 0x7F, 0x80, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x01, 0x12, 0x00, 0x14, 0xA1, 0x00, 0x24, 0x04, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6208, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x01, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3F, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x80, 0x03, 0x10, 0x80, 0x0C, 0x0C, 0x80, 0x30, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6209, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x46, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0x66, 0x00, 0x10, 0x24, 0x00, 0x10, 0x2C, 0x00, 0x10, 0x38, 0x00, 0x13, 0x10, 0x00, 0x1E, 0x38, 0x80, 0x70, 0x6D, 0x80, 0x01, 0xC7, 0x00, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x620A, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x42, 0x00, 0x10, 0x44, 0x00, 0x10, 0x48, 0x00, 0x10, 0x30, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x20, 0x88, 0x80, 0x23, 0x04, 0x80, 0x2C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x620B, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x24, 0x00, 0x02, 0x7E, 0x00, 0x3F, 0x80, 0x00, 0x02, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x7F, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x88, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x22, 0x00, 0x1C, 0x12, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x620C, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x42, 0x00, 0x1F, 0x64, 0x00, 0x10, 0x28, 0x00, 0x10, 0x30, 0x00, 0x10, 0x30, 0x00, 0x10, 0x48, 0x00, 0x10, 0x84, 0x80, 0x23, 0x02, 0x80, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x620D, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x14, 0x12, 0x00, 0x12, 0x12, 0x00, 0x11, 0x14, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x10, 0x14, 0x00, 0x10, 0x24, 0x80, 0x20, 0xC2, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x620E, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0x18, 0x00, 0x04, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x80, 0x10, 0x82, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x620F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x24, 0x00, 0x01, 0x20, 0x00, 0x21, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x04, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x09, 0x28, 0x00, 0x11, 0x10, 0x00, 0x20, 0x30, 0x00, 0x40, 0x49, 0x00, 0x00, 0x85, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6210, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xA4, 0x00, 0x10, 0x98, 0x00, 0x10, 0x90, 0x00, 0x17, 0x28, 0x80, 0x10, 0x44, 0x80, 0x21, 0x82, 0x80, 0x26, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6211, { 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x03, 0x12, 0x00, 0x0D, 0x11, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x80, 0x01, 0x11, 0x00, 0x01, 0x71, 0x00, 0x07, 0x92, 0x00, 0x39, 0x0A, 0x00, 0x01, 0x0C, 0x80, 0x01, 0x0C, 0x80, 0x01, 0x12, 0x80, 0x07, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6212, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x09, 0x22, 0x00, 0x3F, 0xE4, 0x00, 0x09, 0x24, 0x00, 0x09, 0x18, 0x00, 0x09, 0x10, 0x00, 0x09, 0x18, 0x00, 0x11, 0x24, 0x80, 0x11, 0x42, 0x80, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6213, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x26, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x33, 0x00, 0x21, 0x12, 0x00, 0x21, 0x16, 0x00, 0x21, 0x1C, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x1C, 0x80, 0x00, 0x76, 0x80, 0x01, 0xC3, 0x80, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6214, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x61, 0x00, 0x03, 0x9B, 0x00, 0x3C, 0x06, 0x00, 0x02, 0x20, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x80, 0x03, 0x99, 0x80, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6215, { 0x00, 0x00, 0x00, 0x04, 0x16, 0x00, 0x24, 0x13, 0x00, 0x24, 0x11, 0x00, 0x24, 0x10, 0x00, 0x24, 0x1F, 0x80, 0x3D, 0xF0, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x7C, 0x13, 0x00, 0x24, 0x16, 0x00, 0x24, 0x1C, 0x00, 0x24, 0x08, 0x00, 0x24, 0x1C, 0x00, 0x24, 0x36, 0x80, 0x44, 0x63, 0x80, 0x05, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6216, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x14, 0x00, 0x00, 0xC8, 0x00, 0x07, 0x18, 0x00, 0x38, 0x24, 0x80, 0x00, 0xC2, 0x80, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6217, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x28, 0x00, 0x0A, 0x24, 0x00, 0x09, 0xA4, 0x00, 0x10, 0xA0, 0x00, 0x20, 0x3F, 0x00, 0x5F, 0xE0, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x15, 0x14, 0x00, 0x12, 0x14, 0x00, 0x10, 0x08, 0x00, 0x11, 0x09, 0x00, 0x11, 0x15, 0x00, 0x0F, 0x25, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6218, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xA4, 0x00, 0x08, 0x3F, 0x00, 0x09, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x21, 0x24, 0x00, 0x21, 0x14, 0x00, 0x21, 0x18, 0x00, 0x21, 0x10, 0x00, 0x21, 0x28, 0x00, 0x3F, 0x49, 0x00, 0x20, 0x85, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x621A, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0xD1, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xEA, 0x00, 0x11, 0x0A, 0x00, 0x15, 0x4C, 0x00, 0x15, 0x24, 0x00, 0x19, 0x0C, 0x80, 0x21, 0x12, 0x80, 0x23, 0x21, 0x80, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x621B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x90, 0x00, 0x00, 0x60, 0x80, 0x03, 0x99, 0x80, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x621C, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x26, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x33, 0x00, 0x00, 0x12, 0x00, 0x7F, 0x96, 0x00, 0x08, 0x1C, 0x00, 0x3F, 0x88, 0x00, 0x08, 0x1C, 0x80, 0x0F, 0xB6, 0x80, 0x78, 0x63, 0x80, 0x01, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x621D, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3E, 0x13, 0x00, 0x22, 0x11, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x1F, 0x80, 0x22, 0xF0, 0x00, 0x22, 0x11, 0x00, 0x22, 0x19, 0x00, 0x3E, 0x0B, 0x00, 0x22, 0x0A, 0x00, 0x22, 0x0E, 0x00, 0x22, 0x04, 0x00, 0x3E, 0x0E, 0x00, 0x14, 0x1A, 0x80, 0x36, 0x33, 0x80, 0x62, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x621E, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x20, 0x80, 0x41, 0x10, 0x80, 0x1F, 0xFE, 0x00, 0x01, 0x08, 0x00, 0x00, 0xB1, 0x00, 0x03, 0xE3, 0x00, 0x3E, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x621F, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x11, 0x80, 0x3F, 0x9E, 0x00, 0x20, 0xF0, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x91, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x14, 0x80, 0x04, 0x62, 0x80, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6220, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x0B, 0x00, 0x7F, 0x89, 0x00, 0x21, 0x08, 0x00, 0x33, 0x0F, 0x80, 0x12, 0x78, 0x00, 0x7F, 0x88, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x0B, 0x00, 0x21, 0x0A, 0x00, 0x21, 0x0E, 0x00, 0x3F, 0x04, 0x00, 0x21, 0x0E, 0x00, 0x21, 0x1A, 0x80, 0x3F, 0x33, 0x80, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6221, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xC8, 0x00, 0x09, 0x7F, 0x80, 0x0F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x09, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xEA, 0x00, 0x15, 0x0A, 0x00, 0x15, 0x44, 0x00, 0x19, 0xCC, 0x80, 0x10, 0x12, 0x80, 0x1F, 0xE1, 0x80, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6222, { 0x00, 0x00, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x0B, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xCF, 0x80, 0x11, 0x38, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x0B, 0x00, 0x11, 0x0A, 0x00, 0x1F, 0x0E, 0x00, 0x11, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x1F, 0x1A, 0x80, 0x71, 0x33, 0x80, 0x01, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6223, { 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x3E, 0x8B, 0x00, 0x4A, 0x29, 0x00, 0x3B, 0x48, 0x00, 0x11, 0x0F, 0x80, 0x31, 0xB8, 0x00, 0x60, 0xC8, 0x00, 0x1F, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0B, 0x00, 0x3F, 0x8E, 0x00, 0x08, 0x04, 0x00, 0x0E, 0x0E, 0x80, 0x1B, 0x1A, 0x80, 0x31, 0x33, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6224, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xD4, 0x00, 0x10, 0x92, 0x00, 0x11, 0x12, 0x00, 0x1E, 0x90, 0x00, 0x2A, 0xFF, 0x00, 0x24, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x41, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x99, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x45, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6225, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x3F, 0xD4, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x15, 0x10, 0x00, 0x1F, 0x92, 0x00, 0x24, 0x12, 0x00, 0x5F, 0x14, 0x00, 0x04, 0x08, 0x00, 0x07, 0x99, 0x00, 0x7C, 0x25, 0x00, 0x20, 0x45, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6226, { 0x00, 0x00, 0x00, 0x48, 0x4A, 0x00, 0x6C, 0xCB, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x8F, 0x80, 0x24, 0xF8, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8B, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xCE, 0x00, 0x04, 0x1A, 0x80, 0x04, 0x33, 0x80, 0x04, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6227, { 0x00, 0x00, 0x00, 0x04, 0x0A, 0x00, 0x0E, 0x0B, 0x00, 0x1B, 0x09, 0x00, 0x31, 0x88, 0x00, 0x6E, 0xCF, 0x80, 0x00, 0x38, 0x00, 0x1F, 0x89, 0x00, 0x10, 0x89, 0x00, 0x1F, 0x8B, 0x00, 0x10, 0x8A, 0x00, 0x1F, 0x8E, 0x00, 0x10, 0x04, 0x00, 0x3F, 0x8E, 0x80, 0x28, 0x8A, 0x80, 0x68, 0x9B, 0x80, 0x0F, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6229, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x7F, 0xCB, 0x00, 0x21, 0x09, 0x00, 0x21, 0x0F, 0x80, 0x42, 0x38, 0x00, 0x52, 0x88, 0x00, 0x6B, 0x49, 0x00, 0x00, 0x09, 0x00, 0x7F, 0xCB, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x8E, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x8E, 0x80, 0x20, 0x8A, 0x80, 0x20, 0x9B, 0x80, 0x3F, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x622A, { 0x00, 0x00, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x09, 0x00, 0x1F, 0xE8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x05, 0x08, 0x80, 0x0F, 0xE8, 0x80, 0x19, 0x09, 0x00, 0x2F, 0xEA, 0x00, 0x09, 0x06, 0x00, 0x0F, 0xE4, 0x00, 0x09, 0x0C, 0x80, 0x0F, 0xF2, 0x80, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x622B, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x08, 0x04, 0x80, 0x7F, 0x04, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x22, 0xF4, 0x80, 0x22, 0x94, 0x80, 0x7E, 0x95, 0x80, 0x22, 0x95, 0x00, 0x22, 0xF7, 0x00, 0x3E, 0x02, 0x00, 0x22, 0xF6, 0x00, 0x22, 0x0A, 0x80, 0x22, 0x3B, 0x80, 0x2E, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x622C, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x94, 0x00, 0x0A, 0x12, 0x00, 0x2A, 0x92, 0x00, 0x1B, 0x10, 0x00, 0x0A, 0x7F, 0x00, 0x7F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x19, 0x00, 0x11, 0x25, 0x00, 0x1F, 0x45, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x622E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xCA, 0x00, 0x15, 0x49, 0x00, 0x26, 0xC8, 0x00, 0x0D, 0x4B, 0x80, 0x16, 0x7C, 0x00, 0x2C, 0xC8, 0x00, 0x02, 0x08, 0x00, 0x05, 0x08, 0x80, 0x0A, 0xC9, 0x00, 0x34, 0xBA, 0x00, 0x09, 0x0C, 0x00, 0x36, 0x48, 0x00, 0x19, 0x94, 0x80, 0x06, 0x62, 0x80, 0x39, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x622F, { 0x00, 0x00, 0x00, 0x04, 0x0A, 0x00, 0x07, 0x89, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xC9, 0x80, 0x24, 0x4F, 0x00, 0x27, 0x38, 0x00, 0x3C, 0x49, 0x00, 0x27, 0xC9, 0x00, 0x20, 0x0B, 0x00, 0x25, 0x0A, 0x00, 0x35, 0x4E, 0x00, 0x2D, 0x84, 0x00, 0x25, 0x0E, 0x00, 0x25, 0x0A, 0x80, 0x47, 0xDB, 0x80, 0x1C, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6230, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3B, 0x94, 0x00, 0x2A, 0x92, 0x00, 0x3B, 0x90, 0x00, 0x00, 0x13, 0x80, 0x3F, 0x9C, 0x00, 0x24, 0xF0, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x8A, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0xC8, 0x00, 0x04, 0x14, 0x80, 0x04, 0x62, 0x80, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6231, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0xE5, 0x00, 0x01, 0x04, 0x80, 0x1F, 0xF4, 0x00, 0x11, 0x14, 0x00, 0x11, 0xE7, 0x80, 0x1F, 0x3C, 0x00, 0x11, 0xE4, 0x80, 0x10, 0x04, 0x80, 0x11, 0x45, 0x00, 0x15, 0x55, 0x00, 0x15, 0x56, 0x00, 0x17, 0x72, 0x00, 0x25, 0x56, 0x80, 0x21, 0x49, 0x80, 0x27, 0xF0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6232, { 0x00, 0x00, 0x00, 0x04, 0x0A, 0x00, 0x07, 0xCB, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x4F, 0x80, 0x3F, 0xB8, 0x00, 0x24, 0x49, 0x00, 0x23, 0xC9, 0x00, 0x20, 0x0B, 0x00, 0x3F, 0xCA, 0x00, 0x20, 0x0E, 0x00, 0x2F, 0x84, 0x00, 0x28, 0x8E, 0x00, 0x2F, 0x8A, 0x80, 0x45, 0x1B, 0x80, 0x1F, 0xD1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6233, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x7B, 0xCB, 0x00, 0x29, 0x49, 0x00, 0x5A, 0xC8, 0x00, 0x29, 0x4F, 0x80, 0x4A, 0x78, 0x00, 0x11, 0x09, 0x00, 0x12, 0x09, 0x00, 0x3F, 0xCB, 0x00, 0x64, 0x0A, 0x00, 0x3F, 0x8E, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x8E, 0x00, 0x24, 0x0A, 0x80, 0x3F, 0xDB, 0x80, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6234, { 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x1F, 0xD2, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x1F, 0xD1, 0x00, 0x12, 0x51, 0x00, 0x1F, 0xD1, 0x00, 0x12, 0x52, 0x00, 0x1F, 0xCA, 0x00, 0x08, 0x8A, 0x00, 0x3F, 0xEC, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xEA, 0x80, 0x08, 0x92, 0x80, 0x10, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6236, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6237, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6238, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6239, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x38, 0x00, 0x30, 0xE0, 0x00, 0x23, 0x80, 0x00, 0x66, 0x00, 0x80, 0x04, 0x01, 0x80, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x623B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0xE0, 0x00, 0x30, 0xB0, 0x00, 0x21, 0x98, 0x00, 0x63, 0x0E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x623D, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0x88, 0x00, 0x10, 0xC8, 0x00, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x20, 0x0F, 0x80, 0x60, 0xF8, 0x00, 0x0F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x623E, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x10, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x23, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x623F, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x11, 0x01, 0x00, 0x12, 0x02, 0x00, 0x2C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6240, { 0x00, 0x00, 0x00, 0x03, 0x87, 0x00, 0x1C, 0x38, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xA0, 0x00, 0x10, 0xBF, 0x80, 0x10, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x1F, 0xA2, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x42, 0x00, 0x20, 0x42, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6241, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x18, 0x88, 0x80, 0x18, 0x88, 0x80, 0x1F, 0xFF, 0x80, 0x18, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6242, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x40, 0x00, 0x30, 0x40, 0x00, 0x27, 0xFE, 0x00, 0x64, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6243, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x15, 0xFD, 0x00, 0x35, 0x05, 0x00, 0x25, 0x05, 0x00, 0x65, 0xFD, 0x00, 0x04, 0x01, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6244, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x80, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x35, 0xFD, 0x00, 0x25, 0x05, 0x00, 0x65, 0xFD, 0x00, 0x04, 0x01, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6246, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0xA0, 0x00, 0x23, 0xB3, 0x00, 0x2E, 0x16, 0x00, 0x62, 0x18, 0x00, 0x03, 0xCE, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6247, { 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x45, 0x00, 0x12, 0x49, 0x00, 0x14, 0xD3, 0x00, 0x29, 0x65, 0x00, 0x22, 0x49, 0x00, 0x24, 0xD3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6248, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0xF8, 0x00, 0x09, 0x08, 0x00, 0x09, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x14, 0x42, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x00, 0x80, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6249, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x1F, 0x9F, 0x80, 0x10, 0x90, 0x00, 0x17, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x13, 0x9F, 0x80, 0x1C, 0x90, 0x00, 0x21, 0x10, 0x00, 0x26, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x624B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x624C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x624D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x22, 0x00, 0x00, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0xA0, 0x00, 0x06, 0x20, 0x00, 0x38, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x624E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x78, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6250, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0E, 0x11, 0x00, 0x78, 0x31, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x63, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x39, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6251, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x16, 0x00, 0x0F, 0x13, 0x00, 0x78, 0x11, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6252, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0x83, 0x00, 0x11, 0x01, 0x00, 0x73, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6253, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6254, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x23, 0x80, 0x08, 0x20, 0x80, 0x0E, 0x20, 0x80, 0x78, 0x60, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0xC0, 0x80, 0x08, 0x81, 0x80, 0x09, 0x81, 0x00, 0x3B, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6255, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x60, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0E, 0x40, 0x00, 0x78, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x83, 0x00, 0x08, 0x81, 0x00, 0x08, 0x9F, 0x00, 0x09, 0xF1, 0x80, 0x3B, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6256, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x3B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6258, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF0, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x17, 0x80, 0x0D, 0xF8, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x625A, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0xC1, 0x00, 0x08, 0x81, 0x00, 0x09, 0x81, 0x00, 0x08, 0x01, 0x00, 0x0E, 0x01, 0x00, 0x78, 0x79, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x38, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x625B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x625C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x08, 0x00, 0x78, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x625E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x08, 0x00, 0x78, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6260, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xA2, 0x00, 0x7E, 0x92, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x44, 0x00, 0x08, 0x6C, 0x00, 0x0E, 0x28, 0x00, 0x78, 0x38, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x3B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6263, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x0E, 0x81, 0x00, 0x78, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6264, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x78, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x80, 0x09, 0x8C, 0x80, 0x3B, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6266, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x20, 0x00, 0x68, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x28, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6267, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x48, 0x00, 0x7F, 0xFC, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0C, 0x48, 0x00, 0x18, 0xC8, 0x00, 0x68, 0x48, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA9, 0x00, 0x08, 0x89, 0x00, 0x09, 0x09, 0x00, 0x2A, 0x07, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6268, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x7C, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0xA2, 0x00, 0x10, 0xE2, 0x00, 0x1C, 0x62, 0x00, 0x70, 0x72, 0x00, 0x10, 0x5A, 0x00, 0x10, 0x4E, 0x00, 0x10, 0xC7, 0x00, 0x10, 0x85, 0x80, 0x11, 0x84, 0x00, 0x33, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6269, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x19, 0x00, 0x00, 0x69, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x626A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x02, 0x00, 0x08, 0xBF, 0x00, 0x09, 0x42, 0x00, 0x7F, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x19, 0x02, 0x00, 0x69, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x29, 0x0A, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x626B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0xFE, 0x00, 0x18, 0x02, 0x00, 0x68, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x28, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x626C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x52, 0x00, 0x18, 0x52, 0x00, 0x68, 0x52, 0x00, 0x08, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x42, 0x00, 0x28, 0x94, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x626D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x22, 0x00, 0x78, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x626E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x84, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x09, 0xFE, 0x00, 0x0E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x1A, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x626F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x78, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6270, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x30, 0x00, 0x18, 0x50, 0x00, 0x68, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x29, 0x0F, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6271, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4F, 0x00, 0x0B, 0x41, 0x00, 0x0C, 0x42, 0x00, 0x38, 0xA2, 0x00, 0x08, 0x94, 0x00, 0x08, 0x8C, 0x00, 0x09, 0x0C, 0x00, 0x09, 0x12, 0x00, 0x09, 0x21, 0x00, 0x1A, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6273, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA3, 0x00, 0x0E, 0xB2, 0x00, 0x78, 0x96, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x88, 0x00, 0x09, 0x9C, 0x00, 0x09, 0x16, 0x00, 0x0B, 0x33, 0x00, 0x38, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6276, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x14, 0x00, 0x38, 0x14, 0x00, 0x08, 0x24, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x00, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6279, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x89, 0x80, 0x08, 0xEE, 0x00, 0x08, 0x88, 0x00, 0x0B, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x38, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x80, 0x08, 0xF8, 0x80, 0x0B, 0x8F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x627A, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x88, 0x00, 0x78, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x08, 0x82, 0x80, 0x08, 0xF3, 0x80, 0x3B, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x627C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x22, 0x00, 0x0B, 0x22, 0x00, 0x0D, 0x22, 0x00, 0x39, 0x2E, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x80, 0x0A, 0x20, 0x80, 0x0A, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x627D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x13, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x7C, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0x11, 0x00, 0x71, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x80, 0x10, 0x19, 0x80, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x627E, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x08, 0x11, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x11, 0x00, 0x08, 0x13, 0x00, 0x0E, 0x16, 0x00, 0x78, 0x1C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x34, 0x00, 0x08, 0x66, 0x80, 0x09, 0xC3, 0x80, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x627F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0x48, 0x80, 0x3F, 0xFB, 0x00, 0x02, 0x4C, 0x00, 0x02, 0x48, 0x00, 0x03, 0xF8, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0B, 0xFC, 0x00, 0x08, 0x42, 0x00, 0x10, 0x42, 0x00, 0x20, 0x41, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6280, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x0B, 0x41, 0x00, 0x0C, 0x42, 0x00, 0x38, 0x22, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0xC2, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6282, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6283, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x16, 0x00, 0x0E, 0x13, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6284, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x4A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x09, 0x08, 0x80, 0x08, 0x08, 0x00, 0x0E, 0x09, 0x00, 0x38, 0x09, 0x00, 0x08, 0x3A, 0x00, 0x08, 0x02, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x30, 0x00, 0x18, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6289, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x0B, 0x12, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x628A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x40, 0x00, 0x38, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x628D, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x72, 0x00, 0x09, 0xC2, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x78, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x39, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x628E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x32, 0x00, 0x08, 0x22, 0x00, 0x08, 0x23, 0x00, 0x08, 0x61, 0x00, 0x08, 0x4F, 0x00, 0x38, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x628F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x0E, 0x24, 0x00, 0x78, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x39, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6290, { 0x00, 0x00, 0x00, 0x10, 0x70, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x39, 0x00, 0x1D, 0x29, 0x00, 0x71, 0x6D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6291, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0xDF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x38, 0x88, 0x80, 0x08, 0xF8, 0x80, 0x0B, 0x88, 0x80, 0x08, 0x0B, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6292, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x01, 0x00, 0x14, 0x22, 0x00, 0x3F, 0x14, 0x00, 0x24, 0x08, 0x00, 0x25, 0xFF, 0x80, 0x04, 0x09, 0x00, 0x05, 0x8A, 0x00, 0x0E, 0x08, 0x00, 0x34, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6293, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x3C, 0x00, 0x11, 0xE4, 0x00, 0x11, 0x04, 0x00, 0x7D, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1D, 0x24, 0x00, 0x71, 0x26, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x13, 0x23, 0x00, 0x12, 0x21, 0x00, 0x36, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6294, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x30, 0x00, 0x10, 0x20, 0x00, 0x10, 0x64, 0x00, 0x10, 0x66, 0x00, 0x1C, 0xE2, 0x00, 0x71, 0xA3, 0x00, 0x13, 0x21, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6295, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0xC2, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6296, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x62, 0x00, 0x08, 0x32, 0x00, 0x08, 0x12, 0x00, 0x7F, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x62, 0x00, 0x08, 0x32, 0x00, 0x0F, 0x12, 0x00, 0x78, 0x02, 0x00, 0x08, 0x03, 0x80, 0x08, 0x1E, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6297, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x38, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6298, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x78, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0x02, 0x00, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x629A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x20, 0x00, 0x18, 0x20, 0x00, 0x68, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x90, 0x00, 0x08, 0x91, 0x00, 0x09, 0x11, 0x00, 0x2A, 0x0F, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x629B, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3E, 0x9F, 0x00, 0x08, 0x85, 0x00, 0x09, 0xE5, 0x00, 0x08, 0xA5, 0x00, 0x0A, 0xA5, 0x00, 0x0C, 0xA5, 0x00, 0x38, 0xA9, 0x00, 0x09, 0xA9, 0x00, 0x09, 0x31, 0x00, 0x09, 0x36, 0x00, 0x0A, 0x20, 0x80, 0x0A, 0x20, 0x80, 0x1C, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x629C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x70, 0xE6, 0x00, 0x10, 0xA4, 0x00, 0x11, 0xBC, 0x00, 0x13, 0x18, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x66, 0x00, 0x31, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x629E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x7C, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x70, 0x88, 0x00, 0x10, 0x8C, 0x00, 0x10, 0x84, 0x00, 0x11, 0x86, 0x00, 0x11, 0x02, 0x00, 0x13, 0x03, 0x00, 0x36, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x629F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x18, 0xFC, 0x00, 0x68, 0x04, 0x00, 0x09, 0x88, 0x00, 0x08, 0x68, 0x00, 0x08, 0x10, 0x00, 0x28, 0x08, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A0, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x09, 0x84, 0x00, 0x7F, 0x44, 0x00, 0x09, 0x28, 0x00, 0x0B, 0x28, 0x00, 0x0D, 0x10, 0x00, 0x19, 0x10, 0x00, 0x69, 0x28, 0x00, 0x09, 0x4C, 0x00, 0x09, 0x84, 0x00, 0x09, 0x00, 0x00, 0x09, 0x02, 0x00, 0x29, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x84, 0x00, 0x09, 0x07, 0x00, 0x0E, 0x82, 0x00, 0x18, 0x88, 0x00, 0x68, 0x98, 0x00, 0x08, 0xE0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x28, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x07, 0x00, 0x0A, 0xFA, 0x00, 0x0C, 0x88, 0x00, 0x18, 0x88, 0x00, 0x68, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x28, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A4, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x30, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x02, 0x00, 0x09, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x69, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A5, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7E, 0x94, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x80, 0x00, 0x0C, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x68, 0xC8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xC7, 0x00, 0x28, 0x82, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A6, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x39, 0x00, 0x1D, 0x29, 0x00, 0x71, 0x6D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62A8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x52, 0x00, 0x7C, 0xD3, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x70, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62AB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x89, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA1, 0x00, 0x0E, 0xA2, 0x00, 0x38, 0x92, 0x00, 0x08, 0x94, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8C, 0x00, 0x09, 0x14, 0x00, 0x09, 0x22, 0x00, 0x1A, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62AC, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x60, 0x00, 0x08, 0x42, 0x00, 0x7E, 0xC2, 0x00, 0x08, 0x9F, 0x00, 0x09, 0xF1, 0x80, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62B1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x81, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x79, 0x00, 0x08, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x79, 0x00, 0x08, 0x41, 0x00, 0x08, 0x46, 0x00, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62B3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x20, 0x00, 0x1D, 0x23, 0x00, 0x71, 0x2E, 0x00, 0x11, 0x38, 0x00, 0x11, 0x20, 0x00, 0x13, 0x20, 0x00, 0x12, 0x20, 0x80, 0x16, 0x31, 0x80, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62B5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0E, 0x88, 0x00, 0x38, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xB8, 0x00, 0x0B, 0xC4, 0x80, 0x08, 0x02, 0x80, 0x08, 0xFD, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62B6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0xFF, 0x00, 0x7D, 0x90, 0x00, 0x11, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x2C, 0x00, 0x10, 0x64, 0x00, 0x10, 0x46, 0x00, 0x10, 0xC3, 0x00, 0x31, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62B7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x18, 0x00, 0x08, 0x10, 0x00, 0x08, 0x34, 0x00, 0x08, 0x76, 0x00, 0x0E, 0xD3, 0x00, 0x79, 0x91, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62B9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x38, 0x00, 0x08, 0x58, 0x00, 0x08, 0x54, 0x00, 0x08, 0x94, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x11, 0x00, 0x18, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62BA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x54, 0x00, 0x70, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62BB, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x71, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62BC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62BD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x18, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62BE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x70, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x62, 0x00, 0x10, 0x42, 0x00, 0x10, 0x5F, 0x00, 0x10, 0xF1, 0x00, 0x31, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62BF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0xB6, 0x80, 0x08, 0xE3, 0x80, 0x3B, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C2, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0B, 0xFF, 0x00, 0x0D, 0x48, 0x00, 0x1A, 0x48, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x08, 0x88, 0x80, 0x08, 0x8B, 0x00, 0x09, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C4, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C6, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1C, 0xB8, 0x00, 0x70, 0x8F, 0x00, 0x10, 0x89, 0x80, 0x10, 0x88, 0x00, 0x11, 0x88, 0x00, 0x11, 0x08, 0x00, 0x13, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x51, 0x00, 0x08, 0x49, 0x00, 0x08, 0x45, 0x00, 0x08, 0x41, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x82, 0x00, 0x38, 0xA2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x82, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x18, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62C9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x0B, 0x44, 0x00, 0x0C, 0x24, 0x00, 0x38, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62CA, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x7C, 0xBF, 0x80, 0x11, 0x82, 0x00, 0x12, 0x82, 0x00, 0x10, 0x92, 0x00, 0x1C, 0x9A, 0x00, 0x70, 0x8A, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62CC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x3E, 0x10, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62CD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x0F, 0x7F, 0x80, 0x38, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62CE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x27, 0x00, 0x10, 0x20, 0x00, 0x30, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62CF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0xA1, 0x00, 0x11, 0x22, 0x00, 0x11, 0x14, 0x00, 0x2A, 0x08, 0x00, 0x06, 0x16, 0x00, 0x09, 0x21, 0x80, 0x30, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x09, 0x90, 0x00, 0x0E, 0x10, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x21, 0x00, 0x08, 0x41, 0x00, 0x19, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D1, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x30, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0B, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x38, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0xC1, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D4, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0B, 0x34, 0x00, 0x0C, 0x54, 0x00, 0x38, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x92, 0x00, 0x09, 0x21, 0x00, 0x1A, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62D5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x20, 0x00, 0x08, 0x23, 0x00, 0x0E, 0x2E, 0x00, 0x78, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x4B, 0x00, 0x0A, 0x5D, 0x00, 0x0C, 0x69, 0x00, 0x3B, 0xC9, 0x00, 0x08, 0x49, 0x00, 0x08, 0x4B, 0x00, 0x08, 0x48, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D7, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x3E, 0x9F, 0x80, 0x09, 0x04, 0x80, 0x09, 0x24, 0x80, 0x0A, 0x24, 0x80, 0x09, 0x44, 0x80, 0x0C, 0xC4, 0x80, 0x38, 0xA4, 0x80, 0x09, 0x14, 0x80, 0x0A, 0x74, 0x80, 0x0F, 0x98, 0x80, 0x08, 0x08, 0x80, 0x08, 0x10, 0x80, 0x18, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x80, 0x80, 0x09, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x08, 0x7C, 0x80, 0x0B, 0x44, 0x80, 0x0C, 0x44, 0x80, 0x38, 0x7C, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62D9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x18, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62DA, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x9F, 0x00, 0x7D, 0xF5, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1D, 0xFF, 0x80, 0x70, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x11, 0x84, 0x00, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62DB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x21, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x4C, 0x00, 0x0D, 0x80, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62DC, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x3C, 0x7F, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x07, 0x84, 0x00, 0x3C, 0x04, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62DD, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62DF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x44, 0x00, 0x09, 0x24, 0x00, 0x7F, 0x34, 0x00, 0x09, 0x14, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x19, 0x04, 0x00, 0x69, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x44, 0x00, 0x09, 0x8A, 0x00, 0x09, 0x11, 0x00, 0x28, 0x21, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E0, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x1E, 0x00, 0x13, 0xD2, 0x00, 0x12, 0x52, 0x00, 0x7A, 0x52, 0x00, 0x16, 0x52, 0x00, 0x14, 0xD2, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x1B, 0x92, 0x00, 0x71, 0x12, 0x80, 0x11, 0x12, 0x80, 0x13, 0xA1, 0x80, 0x12, 0xC0, 0x00, 0x16, 0x70, 0x00, 0x34, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62E1, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x1D, 0x30, 0x00, 0x71, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x23, 0x00, 0x11, 0x61, 0x00, 0x13, 0x41, 0x00, 0x12, 0x4F, 0x80, 0x36, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62E2, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x42, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0x50, 0x00, 0x18, 0x92, 0x00, 0x68, 0x92, 0x00, 0x08, 0x94, 0x00, 0x09, 0x19, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x31, 0x00, 0x2A, 0x4F, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x90, 0x00, 0x0F, 0x12, 0x00, 0x19, 0xFF, 0x00, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x2A, 0x51, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E5, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x32, 0x22, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x58, 0x2A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x52, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x19, 0xFE, 0x00, 0x68, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x2F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E7, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x0A, 0x02, 0x00, 0x08, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x50, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x09, 0x24, 0x00, 0x09, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x0C, 0x7C, 0x00, 0x08, 0x84, 0x00, 0x18, 0xC8, 0x00, 0x69, 0x28, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x44, 0x00, 0x28, 0x87, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62E9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x88, 0x00, 0x0D, 0x27, 0x00, 0x1A, 0xFA, 0x00, 0x68, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x28, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62EA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x1D, 0x24, 0x80, 0x71, 0x44, 0x80, 0x11, 0x83, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62EC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x78, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62ED, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x3E, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x0D, 0xF8, 0x00, 0x38, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x0B, 0x82, 0x80, 0x08, 0x01, 0x80, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62EE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62EF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x11, 0x00, 0x0B, 0xDA, 0x00, 0x08, 0x5C, 0x00, 0x0E, 0x54, 0x00, 0x38, 0x94, 0x00, 0x08, 0x92, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x11, 0x00, 0x08, 0x30, 0x80, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62F1, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x0B, 0x24, 0x00, 0x0C, 0x24, 0x00, 0x39, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x00, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62F2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x76, 0x00, 0x77, 0xC3, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62F3, { 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0xA1, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x0C, 0x7A, 0x00, 0x37, 0xC1, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62F4, { 0x00, 0x00, 0x00, 0x10, 0xF0, 0x00, 0x10, 0x18, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x00, 0x13, 0x01, 0x80, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62F5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xDF, 0x00, 0x10, 0x82, 0x00, 0x1D, 0x84, 0x00, 0x72, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x30, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62F6, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x80, 0x11, 0x99, 0x80, 0x11, 0x11, 0x00, 0x13, 0x33, 0x00, 0x7D, 0x99, 0x80, 0x10, 0x88, 0x80, 0x10, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x1C, 0x61, 0x00, 0x70, 0xC3, 0x00, 0x11, 0xA2, 0x00, 0x10, 0x16, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x70, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62F7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x80, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x14, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0A, 0xFF, 0x80, 0x0D, 0x40, 0x00, 0x3A, 0x7F, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62FC, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x08, 0x63, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x39, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62FD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x10, 0x00, 0x10, 0x11, 0x00, 0x10, 0x1B, 0x00, 0x10, 0x0E, 0x00, 0x10, 0x38, 0x80, 0x10, 0xEE, 0x80, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x62FE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x81, 0x00, 0x09, 0x00, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x62FF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x07, 0xFC, 0x00, 0x38, 0x03, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6301, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x38, 0x04, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6302, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6303, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x7C, 0xC2, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6304, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x52, 0x00, 0x7E, 0x52, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x24, 0x00, 0x78, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x39, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6307, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x47, 0x80, 0x3E, 0x78, 0x00, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6308, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xBF, 0x00, 0x7C, 0x09, 0x00, 0x07, 0x89, 0x00, 0x3C, 0x19, 0x00, 0x04, 0x11, 0x00, 0x07, 0xB1, 0x00, 0x7C, 0x07, 0x00, 0x00, 0x60, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6309, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x22, 0x00, 0x38, 0x42, 0x00, 0x08, 0x44, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x18, 0x00, 0x08, 0x14, 0x00, 0x08, 0x62, 0x00, 0x19, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x630A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x13, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x630B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x0E, 0x81, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x630C, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7D, 0xC6, 0x00, 0x13, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x1C, 0xC6, 0x00, 0x73, 0x83, 0x80, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x630D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x78, 0x36, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x38, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x630E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x7C, 0x50, 0x00, 0x08, 0x88, 0x00, 0x0D, 0x07, 0x00, 0x1A, 0xFA, 0x00, 0x68, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x28, 0x48, 0x00, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6310, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x11, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x05, 0xBF, 0x00, 0x18, 0x00, 0x00, 0x60, 0x70, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6311, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x49, 0x00, 0x09, 0x4A, 0x00, 0x08, 0xCC, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0C, 0xC8, 0x00, 0x39, 0x4F, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6313, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7D, 0x06, 0x80, 0x10, 0x1C, 0x00, 0x10, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x80, 0x10, 0x19, 0x80, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6316, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x7D, 0x49, 0x00, 0x10, 0xC8, 0x00, 0x11, 0x8F, 0x00, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x70, 0x00, 0x10, 0xC0, 0x00, 0x11, 0x80, 0x80, 0x11, 0x81, 0x80, 0x30, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6318, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x52, 0x00, 0x10, 0xD3, 0x00, 0x11, 0x91, 0x80, 0x7C, 0x12, 0x00, 0x10, 0x36, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x70, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x10, 0x31, 0x00, 0x10, 0x23, 0x00, 0x10, 0x62, 0x00, 0x31, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6319, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x19, 0x86, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x73, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x631A, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x7E, 0x00, 0x04, 0x24, 0x00, 0x07, 0x64, 0x00, 0x7C, 0x34, 0x00, 0x24, 0x45, 0x00, 0x0C, 0x9B, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x631B, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x1A, 0x26, 0x00, 0x22, 0x3A, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x631D, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x09, 0x04, 0x00, 0x7C, 0x7F, 0x00, 0x08, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x24, 0x00, 0x19, 0x14, 0x00, 0x69, 0x14, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x14, 0x00, 0x0A, 0x8B, 0x00, 0x2C, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x631E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x0B, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x18, 0x94, 0x00, 0x68, 0x94, 0x00, 0x08, 0xA3, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x09, 0x43, 0x00, 0x2A, 0x3E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x631F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6320, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x0B, 0xC0, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x19, 0x00, 0x08, 0x69, 0x00, 0x0F, 0x87, 0x00, 0x18, 0x04, 0x00, 0x6B, 0xFE, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x29, 0x0F, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6321, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x08, 0xA6, 0x00, 0x7E, 0xA8, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x02, 0x00, 0x18, 0x02, 0x00, 0x68, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x2B, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6322, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1E, 0x00, 0x0B, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x42, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x88, 0x00, 0x0D, 0x04, 0x00, 0x1A, 0x8B, 0x00, 0x6C, 0x8A, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x29, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6323, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFC, 0x00, 0x09, 0x08, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFC, 0x00, 0x0A, 0x24, 0x00, 0x0C, 0x24, 0x00, 0x1B, 0xFF, 0x00, 0x68, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x24, 0x00, 0x08, 0x20, 0x00, 0x28, 0xA0, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6324, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0xD8, 0x00, 0x1B, 0x07, 0x00, 0x68, 0x8A, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x29, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6325, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x24, 0x00, 0x7D, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x90, 0x00, 0x0D, 0x14, 0x00, 0x19, 0xFE, 0x00, 0x68, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6327, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x10, 0x41, 0x00, 0x10, 0xC3, 0x00, 0x7D, 0x45, 0x00, 0x13, 0x4D, 0x00, 0x16, 0x59, 0x00, 0x10, 0x41, 0x00, 0x1C, 0xC3, 0x00, 0x71, 0x45, 0x00, 0x13, 0x4D, 0x00, 0x16, 0x59, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x31, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6328, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x7C, 0x9F, 0x00, 0x13, 0xF1, 0x80, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x1B, 0x10, 0x00, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6329, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x7F, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x0E, 0x81, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0x44, 0x80, 0x39, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x632A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xF7, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x7C, 0x94, 0x80, 0x13, 0xFD, 0x00, 0x10, 0x95, 0x00, 0x10, 0x95, 0x00, 0x1C, 0x94, 0x80, 0x73, 0xFC, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x11, 0x94, 0x80, 0x11, 0x35, 0x80, 0x13, 0x24, 0x00, 0x36, 0xE4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x632B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x55, 0x00, 0x0A, 0x38, 0x80, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x632D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x91, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xD0, 0x00, 0x08, 0x70, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6E, 0x00, 0x39, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x632F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0D, 0x48, 0x00, 0x39, 0x49, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x44, 0x00, 0x09, 0x44, 0x00, 0x09, 0x7A, 0x00, 0x0A, 0xC1, 0x00, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6332, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x04, 0xA8, 0x00, 0x20, 0xA6, 0x00, 0x13, 0x2A, 0x00, 0x04, 0x30, 0x00, 0x38, 0x60, 0x00, 0x11, 0x80, 0x00, 0x06, 0x78, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6335, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1C, 0x44, 0x00, 0x70, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x11, 0x84, 0x00, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6336, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x80, 0x80, 0x78, 0xBC, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x09, 0xA4, 0x80, 0x09, 0x3D, 0x80, 0x0B, 0x01, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6339, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0x11, 0x00, 0x71, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x80, 0x11, 0x81, 0x80, 0x30, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x633A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xE3, 0x00, 0x08, 0x3C, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x84, 0x00, 0x09, 0xE4, 0x00, 0x08, 0x3F, 0x80, 0x0A, 0x24, 0x00, 0x0C, 0x24, 0x00, 0x3A, 0x24, 0x00, 0x09, 0x44, 0x00, 0x09, 0x5F, 0x80, 0x08, 0x80, 0x00, 0x08, 0xC0, 0x00, 0x09, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x633B, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x80, 0x09, 0xE6, 0x00, 0x08, 0x5C, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x94, 0x00, 0x09, 0xD7, 0x80, 0x0A, 0x54, 0x00, 0x0E, 0x54, 0x00, 0x38, 0x54, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x54, 0x00, 0x09, 0xFF, 0x80, 0x08, 0xC0, 0x00, 0x09, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x633C, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x12, 0x00, 0x7E, 0x5B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x90, 0x80, 0x08, 0x10, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x46, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x33, 0x00, 0x38, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x633D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x84, 0x00, 0x09, 0x08, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x91, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x80, 0x1B, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x633E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0A, 0xAA, 0x80, 0x0D, 0x2C, 0x80, 0x38, 0x08, 0x00, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x18, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x633F, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6341, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x10, 0x00, 0x12, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6342, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x1D, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x30, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6343, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x40, 0x00, 0x70, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x11, 0xC1, 0x00, 0x13, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6344, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x13, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x96, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x18, 0x00, 0x10, 0x5C, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6345, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x50, 0x00, 0x7C, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x16, 0x22, 0x00, 0x1B, 0xFE, 0x00, 0x72, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x52, 0x2A, 0x00, 0x22, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6346, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x11, 0x00, 0x11, 0x39, 0x00, 0x1D, 0x39, 0x00, 0x71, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6349, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x50, 0x00, 0x09, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x634A, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x13, 0xF4, 0x00, 0x10, 0xA6, 0x00, 0x7D, 0xB3, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x1C, 0x0C, 0x00, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x634B, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF2, 0x00, 0x10, 0x23, 0x00, 0x7C, 0xB1, 0x80, 0x11, 0x90, 0x80, 0x11, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1D, 0xFF, 0x80, 0x70, 0x02, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x62, 0x00, 0x10, 0x22, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x634C, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x09, 0xF1, 0x00, 0x09, 0x15, 0x00, 0x3F, 0x15, 0x00, 0x09, 0x15, 0x00, 0x09, 0xF5, 0x00, 0x09, 0x55, 0x00, 0x08, 0x45, 0x00, 0x0E, 0x45, 0x00, 0x39, 0xF5, 0x00, 0x08, 0x95, 0x00, 0x08, 0x95, 0x00, 0x08, 0x95, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x1A, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x634D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x634E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x11, 0x11, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x634F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6350, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x18, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6352, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x91, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6353, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF7, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x25, 0x00, 0x17, 0xF5, 0x00, 0x10, 0xA5, 0x00, 0x1C, 0xA4, 0x80, 0x70, 0xA4, 0x80, 0x11, 0xA4, 0x80, 0x11, 0x24, 0x80, 0x13, 0x24, 0x80, 0x16, 0x25, 0x80, 0x10, 0x24, 0x00, 0x30, 0xE4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6354, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7F, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x84, 0x00, 0x7C, 0xFF, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x70, 0x88, 0x80, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0x80, 0x80, 0x11, 0x80, 0x80, 0x11, 0x00, 0x80, 0x33, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6355, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x12, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x0B, 0x11, 0x00, 0x0D, 0xFF, 0x00, 0x39, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x13, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6357, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x7C, 0x90, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x1D, 0x93, 0x00, 0x73, 0x11, 0x80, 0x10, 0x12, 0x00, 0x10, 0x76, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x70, 0x00, 0x31, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6358, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x49, 0x00, 0x10, 0xC8, 0x00, 0x11, 0x8F, 0x80, 0x13, 0x40, 0x00, 0x1C, 0x7E, 0x00, 0x70, 0xC2, 0x00, 0x11, 0x86, 0x00, 0x13, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x635B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x30, 0x00, 0x78, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x635C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x4C, 0x00, 0x10, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x635E, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x7C, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0x42, 0x00, 0x19, 0xFC, 0x00, 0x68, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x28, 0x94, 0x00, 0x17, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x635F, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x18, 0x92, 0x00, 0x68, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x28, 0x00, 0x28, 0x46, 0x00, 0x11, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6361, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x07, 0x00, 0x0A, 0xFA, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x20, 0x00, 0x69, 0x24, 0x00, 0x08, 0xA6, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6362, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xF8, 0x00, 0x09, 0x10, 0x00, 0x7E, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x24, 0x00, 0x0F, 0x24, 0x00, 0x19, 0x24, 0x00, 0x69, 0x24, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x29, 0x07, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6363, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x7E, 0xA4, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x94, 0x00, 0x0C, 0x88, 0x00, 0x18, 0x80, 0x00, 0x68, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xF9, 0x00, 0x28, 0x05, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6365, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x10, 0x80, 0x00, 0x10, 0xEF, 0x00, 0x10, 0xA9, 0x00, 0x1D, 0xA9, 0x00, 0x71, 0x29, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x4B, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x88, 0x80, 0x11, 0x89, 0x80, 0x33, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6366, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6367, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x0D, 0x11, 0x00, 0x3A, 0x10, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6368, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x81, 0x00, 0x09, 0x00, 0x80, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6369, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x1D, 0x10, 0x00, 0x71, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x13, 0x38, 0x00, 0x12, 0x28, 0x00, 0x16, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x636B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x7E, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x1E, 0x00, 0x80, 0x72, 0x00, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x32, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x636C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x7D, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x7F, 0x80, 0x11, 0x42, 0x00, 0x1D, 0xD2, 0x00, 0x71, 0x5A, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x42, 0x00, 0x11, 0x42, 0x00, 0x11, 0x42, 0x00, 0x12, 0x42, 0x00, 0x30, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x636D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x21, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x48, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x636E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x88, 0x00, 0x38, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6371, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x1D, 0x00, 0x00, 0x71, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x12, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6372, { 0x00, 0x00, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x82, 0x00, 0x0D, 0x01, 0x00, 0x3A, 0xFC, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6374, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xD1, 0x80, 0x7E, 0x10, 0x00, 0x08, 0x32, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x0E, 0xE1, 0x80, 0x78, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x24, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x80, 0x09, 0xB2, 0x80, 0x39, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6375, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x49, 0x00, 0x71, 0x49, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x11, 0x83, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6376, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x92, 0x00, 0x70, 0x92, 0x00, 0x10, 0x92, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6377, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x0C, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x50, 0x00, 0x09, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6378, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x1D, 0x91, 0x80, 0x70, 0xDB, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x76, 0x00, 0x11, 0xD3, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x637A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x46, 0x00, 0x09, 0x81, 0x80, 0x0A, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x637B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x82, 0x00, 0x09, 0x01, 0x80, 0x0A, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x38, 0x04, 0x00, 0x08, 0x48, 0x00, 0x08, 0x21, 0x00, 0x08, 0x91, 0x00, 0x0A, 0x84, 0x80, 0x0A, 0xFC, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x637C, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x10, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x80, 0x1C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x84, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x2E, 0x00, 0x33, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x637D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0xEE, 0x00, 0x11, 0xAB, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x637F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x12, 0x00, 0x0E, 0xFE, 0x00, 0x38, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x09, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0xEC, 0x00, 0x1B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6380, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x13, 0x88, 0x00, 0x12, 0x0F, 0x80, 0x7E, 0x18, 0x80, 0x13, 0xF5, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x72, 0x44, 0x00, 0x12, 0x4E, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4B, 0x00, 0x14, 0x59, 0x00, 0x30, 0x51, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6382, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x7D, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x0F, 0x80, 0x11, 0x08, 0x00, 0x1D, 0x08, 0x00, 0x71, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x13, 0x41, 0x00, 0x12, 0x41, 0x00, 0x16, 0x41, 0x00, 0x10, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6383, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x10, 0x80, 0x38, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x96, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6384, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x80, 0x10, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x49, 0x00, 0x71, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x31, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6387, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x11, 0xAD, 0x00, 0x7C, 0x42, 0x00, 0x10, 0xA5, 0x00, 0x11, 0x08, 0x80, 0x10, 0x00, 0x00, 0x1D, 0xEF, 0x00, 0x70, 0x21, 0x00, 0x11, 0x21, 0x00, 0x10, 0xCA, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x2A, 0x00, 0x32, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6388, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x3E, 0x01, 0x00, 0x08, 0x49, 0x00, 0x08, 0x4A, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x0E, 0x00, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6389, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x638A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x638C, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x638E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x7C, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x02, 0x00, 0x70, 0xF2, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xF2, 0x00, 0x10, 0x02, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x638F, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x80, 0x13, 0x00, 0x80, 0x7C, 0x80, 0x80, 0x10, 0xFC, 0x80, 0x11, 0xA0, 0x80, 0x10, 0x20, 0x80, 0x1B, 0xFE, 0x80, 0x70, 0x20, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0xFD, 0x80, 0x10, 0x01, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6390, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x61, 0x00, 0x7E, 0x43, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x30, 0x00, 0x78, 0xE7, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xE7, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6392, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x27, 0xCF, 0x80, 0x10, 0x48, 0x00, 0x00, 0x48, 0x00, 0x03, 0xCF, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xCF, 0x80, 0x10, 0x48, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x21, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x12, 0x00, 0x21, 0x0A, 0x00, 0x3F, 0x0C, 0x00, 0x24, 0x36, 0x00, 0x3F, 0x83, 0x80, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6395, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x11, 0xA7, 0x80, 0x1C, 0x20, 0x00, 0x70, 0x7E, 0x00, 0x10, 0xC2, 0x00, 0x11, 0x86, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6396, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x1F, 0x00, 0x0B, 0x19, 0x00, 0x0D, 0x26, 0x00, 0x39, 0x52, 0x00, 0x09, 0x94, 0x00, 0x09, 0x08, 0x00, 0x09, 0x0C, 0x00, 0x09, 0x12, 0x00, 0x09, 0x21, 0x00, 0x19, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6398, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x08, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0B, 0x49, 0x00, 0x1D, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6399, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF2, 0x00, 0x10, 0x53, 0x00, 0x7C, 0x89, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x1B, 0xFF, 0x80, 0x70, 0x11, 0x00, 0x10, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x639A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xDD, 0x00, 0x1D, 0x55, 0x00, 0x71, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x639B, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xF2, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFB, 0x00, 0x0C, 0x42, 0x80, 0x38, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7A, 0x00, 0x0B, 0xC2, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x639E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x91, 0x00, 0x10, 0x93, 0x00, 0x11, 0xBA, 0x00, 0x7D, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x91, 0x00, 0x10, 0x93, 0x00, 0x11, 0xBA, 0x00, 0x11, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x639F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x90, 0x00, 0x70, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x11, 0xD0, 0x00, 0x11, 0x70, 0x00, 0x33, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63A0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x09, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63A1, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x79, 0x00, 0x08, 0x48, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x80, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x1A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x1B, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63A2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x3E, 0x24, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x1B, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63A3, { 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x1F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x24, 0x41, 0x00, 0x24, 0xC1, 0x00, 0x20, 0x37, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63A4, { 0x00, 0x00, 0x00, 0x11, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0xA6, 0x80, 0x11, 0x65, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x1D, 0xA6, 0x80, 0x71, 0x65, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x13, 0x24, 0x80, 0x12, 0x24, 0x80, 0x36, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63A5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x42, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x28, 0x00, 0x08, 0x18, 0x00, 0x08, 0x66, 0x00, 0x19, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63A6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x20, 0x00, 0x78, 0x7F, 0x80, 0x08, 0xCA, 0x80, 0x0B, 0x92, 0x80, 0x08, 0x24, 0x80, 0x08, 0xC9, 0x80, 0x08, 0x11, 0x00, 0x38, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63A7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x94, 0x80, 0x08, 0x14, 0x00, 0x08, 0x24, 0x80, 0x08, 0x47, 0x80, 0x0B, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63A8, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x88, 0x00, 0x3E, 0xFF, 0x00, 0x09, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x0E, 0x88, 0x00, 0x38, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63A9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x09, 0xFF, 0x00, 0x0F, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63AA, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x00, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63AB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x7D, 0x3F, 0x00, 0x11, 0xE9, 0x00, 0x11, 0x29, 0x00, 0x11, 0x2B, 0x00, 0x1D, 0x2A, 0x00, 0x71, 0xEE, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x2E, 0x00, 0x11, 0xEA, 0x00, 0x13, 0x33, 0x00, 0x30, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63AC, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x00, 0x80, 0x12, 0x20, 0x80, 0x11, 0x24, 0x80, 0x10, 0xA8, 0x80, 0x1B, 0xFE, 0x80, 0x70, 0x60, 0x80, 0x10, 0xF8, 0x80, 0x10, 0xAC, 0x80, 0x11, 0xA4, 0x80, 0x13, 0x21, 0x80, 0x10, 0x21, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63AD, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x10, 0xCC, 0x00, 0x1D, 0x86, 0x00, 0x73, 0x23, 0x80, 0x10, 0x20, 0x00, 0x11, 0x29, 0x00, 0x11, 0x2D, 0x80, 0x13, 0x24, 0x80, 0x12, 0x24, 0x80, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63AE, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x1D, 0x7F, 0x00, 0x71, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x16, 0x41, 0x00, 0x30, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63AF, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x4F, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x70, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x30, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x43, 0x00, 0x79, 0x5C, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x24, 0x00, 0x3C, 0x1F, 0x00, 0x0B, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x0F, 0x44, 0x00, 0x79, 0x7F, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x44, 0x00, 0x14, 0xC4, 0x00, 0x20, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B2, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1C, 0xFF, 0x80, 0x71, 0x80, 0x80, 0x17, 0x18, 0x80, 0x11, 0xF0, 0x80, 0x11, 0x00, 0x80, 0x11, 0x09, 0x80, 0x10, 0xF9, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B3, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x22, 0x00, 0x09, 0x38, 0x00, 0x0B, 0xE2, 0x00, 0x0D, 0x3E, 0x00, 0x19, 0x00, 0x00, 0x69, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x42, 0x00, 0x2A, 0x4A, 0x00, 0x14, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0xFD, 0x00, 0x7E, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0xFD, 0x00, 0x1E, 0x21, 0x00, 0x72, 0x29, 0x00, 0x12, 0x25, 0x00, 0x12, 0x21, 0x00, 0x12, 0xFD, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1D, 0xEF, 0x00, 0x71, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEB, 0x00, 0x10, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B7, { 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x12, 0xBE, 0x00, 0x10, 0x22, 0x00, 0x17, 0xE2, 0x00, 0x79, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x28, 0x00, 0x15, 0x24, 0x00, 0x1F, 0xE2, 0x00, 0x71, 0x21, 0x00, 0x11, 0x21, 0x00, 0x12, 0xB1, 0x00, 0x12, 0x6A, 0x00, 0x14, 0x24, 0x00, 0x58, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63B8, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x92, 0x00, 0x18, 0x92, 0x00, 0x68, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63BA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x09, 0xFC, 0x00, 0x7C, 0x40, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x0C, 0x88, 0x00, 0x19, 0x24, 0x00, 0x6A, 0x47, 0x00, 0x0C, 0x92, 0x00, 0x09, 0x20, 0x00, 0x08, 0x48, 0x00, 0x08, 0x90, 0x00, 0x28, 0x20, 0x00, 0x11, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63BB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x7C, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x10, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x11, 0x00, 0x10, 0x7F, 0x80, 0x33, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63BC, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x24, 0x00, 0x0B, 0xFF, 0x00, 0x7D, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0D, 0xFC, 0x00, 0x19, 0x04, 0x00, 0x69, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x58, 0x00, 0x28, 0x84, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63BD, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x66, 0x00, 0x10, 0x24, 0x00, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x11, 0x24, 0x80, 0x1D, 0x24, 0x80, 0x71, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63BE, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x11, 0xFC, 0x00, 0x7C, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0xA1, 0x00, 0x1B, 0x23, 0x00, 0x70, 0x56, 0x00, 0x10, 0x90, 0x00, 0x13, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x13, 0x11, 0x80, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63C0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0B, 0xAA, 0x80, 0x0C, 0x9C, 0x80, 0x38, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x19, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63C1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x78, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x39, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63C3, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x11, 0xE1, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x1D, 0xE9, 0x00, 0x71, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0xE9, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x31, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63C4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x28, 0x00, 0x3E, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xE5, 0x00, 0x0F, 0x25, 0x00, 0x39, 0xEA, 0x00, 0x09, 0x34, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x29, 0x00, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x1F, 0x7F, 0x80, 0x31, 0x12, 0x00, 0x51, 0x32, 0x00, 0x1F, 0x62, 0x00, 0x00, 0x18, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63C6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFA, 0x00, 0x09, 0x1C, 0x80, 0x08, 0xA5, 0x00, 0x3E, 0x42, 0x00, 0x09, 0x81, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x0B, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63C8, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x80, 0x13, 0x00, 0x80, 0x7C, 0xF8, 0x80, 0x10, 0x00, 0x80, 0x13, 0xFE, 0x80, 0x10, 0x00, 0x80, 0x1C, 0xF8, 0x80, 0x70, 0x00, 0x80, 0x10, 0xF8, 0x80, 0x10, 0x00, 0x80, 0x11, 0xFC, 0x80, 0x11, 0x05, 0x80, 0x11, 0xFD, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63C9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x29, 0x00, 0x10, 0x6A, 0x00, 0x10, 0xC8, 0x00, 0x1D, 0x88, 0x00, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63CD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x7D, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x88, 0x00, 0x19, 0x07, 0x00, 0x6E, 0xFA, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x58, 0x00, 0x28, 0x86, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63CE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7D, 0x7E, 0x80, 0x10, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63CF, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x18, 0x49, 0x00, 0x28, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63D0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x0E, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x09, 0x50, 0x00, 0x09, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63D1, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x11, 0xCF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7D, 0xCF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63D2, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0xD0, 0x00, 0x1D, 0x97, 0x00, 0x71, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xD7, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63D3, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x7A, 0x20, 0x00, 0x12, 0x64, 0x00, 0x13, 0x95, 0x80, 0x12, 0x96, 0x80, 0x1A, 0x9C, 0x80, 0x72, 0xB4, 0x80, 0x12, 0xD5, 0x80, 0x12, 0x94, 0x00, 0x16, 0x94, 0x00, 0x14, 0x90, 0x80, 0x14, 0x99, 0x80, 0x3D, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63D4, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x29, 0x00, 0x12, 0xC9, 0x00, 0x10, 0x71, 0x00, 0x10, 0x99, 0x00, 0x11, 0x2B, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x0E, 0x00, 0x10, 0x30, 0x00, 0x10, 0x98, 0x00, 0x12, 0x83, 0x00, 0x12, 0x85, 0x80, 0x16, 0x8C, 0x80, 0x34, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63D5, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x7C, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x73, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x47, 0x80, 0x11, 0x80, 0x00, 0x11, 0x00, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63D6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9F, 0x80, 0x0B, 0xE2, 0x00, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63DA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x40, 0x00, 0x0C, 0xFF, 0x80, 0x39, 0x11, 0x80, 0x0E, 0x22, 0x80, 0x08, 0x44, 0x80, 0x08, 0x88, 0x80, 0x0B, 0x31, 0x00, 0x18, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63DB, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x84, 0x00, 0x09, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x0A, 0xA5, 0x00, 0x0C, 0xC7, 0x00, 0x38, 0x91, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63DC, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x31, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63DE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x52, 0x00, 0x0F, 0xFF, 0x00, 0x0A, 0x04, 0x00, 0x0D, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x69, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63E0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x1E, 0x10, 0x00, 0x72, 0xFF, 0x00, 0x12, 0x24, 0x00, 0x12, 0x6C, 0x00, 0x12, 0x18, 0x00, 0x12, 0xE7, 0x00, 0x12, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63E1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x20, 0x00, 0x09, 0x21, 0x00, 0x0F, 0x4F, 0x00, 0x39, 0xF8, 0x80, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63E3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x1C, 0x20, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x31, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63E5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x7C, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63E9, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x09, 0x80, 0x11, 0xEF, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x08, 0x00, 0x11, 0x08, 0x80, 0x11, 0xE7, 0x80, 0x13, 0x10, 0x00, 0x18, 0x20, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63EA, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0xE4, 0x00, 0x13, 0x84, 0x80, 0x10, 0x94, 0x80, 0x7C, 0x95, 0x80, 0x13, 0xF5, 0x00, 0x10, 0x95, 0x00, 0x10, 0x84, 0x00, 0x1D, 0xC4, 0x00, 0x71, 0xAE, 0x00, 0x11, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x14, 0x9B, 0x00, 0x10, 0x91, 0x00, 0x30, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63EC, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x10, 0x64, 0x00, 0x10, 0xC7, 0x80, 0x11, 0x80, 0x00, 0x1C, 0x14, 0x00, 0x70, 0x12, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x37, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63ED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0B, 0x40, 0x00, 0x0C, 0xFF, 0x80, 0x39, 0x88, 0x80, 0x0A, 0x94, 0x80, 0x08, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x81, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63EE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63F2, { 0x00, 0x00, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x9E, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63F3, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0xEF, 0x00, 0x13, 0x85, 0x00, 0x10, 0x85, 0x00, 0x7C, 0xE5, 0x00, 0x13, 0x85, 0x00, 0x10, 0x8D, 0x00, 0x10, 0xE9, 0x00, 0x1B, 0x9B, 0x00, 0x70, 0x80, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x10, 0xCC, 0x00, 0x11, 0x86, 0x00, 0x37, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63F4, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x79, 0x00, 0x08, 0x48, 0x80, 0x3E, 0x84, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x38, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x42, 0x00, 0x08, 0x64, 0x00, 0x08, 0x98, 0x00, 0x09, 0x36, 0x00, 0x1A, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63F5, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x17, 0xBF, 0x00, 0x10, 0x89, 0x00, 0x11, 0x09, 0x00, 0x7A, 0x7F, 0x80, 0x13, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0xBF, 0x00, 0x1A, 0x88, 0x00, 0x72, 0xBF, 0x00, 0x13, 0x88, 0x00, 0x11, 0x7F, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x12, 0x80, 0x00, 0x36, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x63F6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x09, 0xE5, 0x00, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0xE4, 0x80, 0x0B, 0x24, 0x80, 0x3D, 0x24, 0x80, 0x09, 0x7C, 0x80, 0x0B, 0xA4, 0x80, 0x08, 0x27, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63F7, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0x78, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x18, 0x00, 0x08, 0x6B, 0x00, 0x0A, 0x49, 0x00, 0x0C, 0x49, 0x00, 0x38, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63F8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x7C, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x01, 0x80, 0x1C, 0xFE, 0x00, 0x70, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63F9, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x13, 0xC9, 0x80, 0x10, 0x4F, 0x00, 0x7C, 0x48, 0x00, 0x11, 0xC8, 0x80, 0x16, 0x4C, 0x80, 0x10, 0x47, 0x80, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63FA, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x13, 0xF1, 0x00, 0x11, 0x23, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63FD, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4F, 0x00, 0x09, 0x54, 0x00, 0x7F, 0x62, 0x00, 0x09, 0x42, 0x00, 0x0A, 0x44, 0x00, 0x0D, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x69, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x34, 0x00, 0x09, 0x54, 0x00, 0x08, 0x51, 0x00, 0x28, 0x91, 0x00, 0x13, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x63FF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xD2, 0x00, 0x7A, 0x1F, 0x00, 0x14, 0x22, 0x00, 0x1B, 0xD4, 0x00, 0x11, 0x10, 0x00, 0x19, 0x10, 0x00, 0x17, 0xD0, 0x00, 0x71, 0x10, 0x00, 0x11, 0x28, 0x00, 0x11, 0xA8, 0x00, 0x11, 0x44, 0x00, 0x50, 0x47, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6400, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0xF8, 0x00, 0x09, 0x10, 0x00, 0x7F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x0B, 0x24, 0x00, 0x0D, 0xFC, 0x00, 0x18, 0x50, 0x00, 0x68, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x0E, 0x60, 0x00, 0x08, 0x18, 0x00, 0x08, 0xC0, 0x00, 0x28, 0x30, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6401, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x7A, 0x00, 0x0A, 0x8A, 0x00, 0x0B, 0x52, 0x00, 0x0E, 0x22, 0x00, 0x1A, 0x52, 0x00, 0x6B, 0x8E, 0x00, 0x0A, 0xFA, 0x00, 0x0A, 0x8A, 0x00, 0x0A, 0x8A, 0x00, 0x0A, 0xFA, 0x00, 0x2A, 0x8A, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6402, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x0E, 0x22, 0x00, 0x18, 0x40, 0x00, 0x6B, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x08, 0xD8, 0x00, 0x08, 0x20, 0x00, 0x28, 0xD8, 0x00, 0x13, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6405, { 0x00, 0x00, 0x00, 0x09, 0x22, 0x00, 0x08, 0x92, 0x00, 0x08, 0x94, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x01, 0x00, 0x0A, 0x02, 0x00, 0x09, 0xFC, 0x00, 0x0D, 0x04, 0x00, 0x19, 0x24, 0x00, 0x69, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x51, 0x00, 0x28, 0x91, 0x00, 0x13, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6406, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6409, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x20, 0x80, 0x7D, 0x62, 0x80, 0x10, 0x44, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x88, 0x00, 0x1A, 0x88, 0x00, 0x70, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x30, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x640A, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x91, 0x00, 0x13, 0x55, 0x00, 0x7C, 0x55, 0x00, 0x10, 0x7D, 0x00, 0x10, 0x23, 0x00, 0x10, 0x46, 0x00, 0x1C, 0x80, 0x00, 0x70, 0xFF, 0x00, 0x11, 0x91, 0x00, 0x13, 0x55, 0x00, 0x10, 0x55, 0x00, 0x10, 0x7D, 0x00, 0x10, 0x23, 0x00, 0x30, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x640B, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x3E, 0x00, 0x0B, 0xD0, 0x00, 0x0A, 0x1E, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0xFC, 0x00, 0x0E, 0x92, 0x00, 0x1A, 0x9E, 0x00, 0x6A, 0x80, 0x00, 0x0A, 0xBC, 0x00, 0x0A, 0xA4, 0x00, 0x0B, 0x25, 0x00, 0x2C, 0x45, 0x00, 0x11, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x640C, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x7F, 0xFE, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x48, 0x00, 0x0B, 0xFE, 0x00, 0x0D, 0x48, 0x00, 0x19, 0x4A, 0x00, 0x69, 0xFF, 0x00, 0x0A, 0xA0, 0x00, 0x0A, 0x94, 0x00, 0x0A, 0x88, 0x00, 0x2C, 0xC7, 0x00, 0x10, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x640D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x81, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x81, 0x00, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x640F, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x12, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x11, 0x00, 0x0D, 0xFF, 0x00, 0x38, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6410, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x7C, 0x44, 0x00, 0x11, 0x89, 0x00, 0x10, 0xD1, 0x00, 0x10, 0x3F, 0x80, 0x1B, 0xE0, 0x80, 0x70, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6412, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x7C, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x21, 0x00, 0x1C, 0x20, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x11, 0x82, 0x00, 0x33, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6413, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x20, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x88, 0x00, 0x16, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6414, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x52, 0x00, 0x3E, 0xA4, 0x00, 0x08, 0x58, 0x00, 0x08, 0x16, 0x00, 0x08, 0x61, 0x80, 0x09, 0x90, 0x00, 0x0E, 0x10, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x12, 0x00, 0x08, 0x1F, 0x00, 0x09, 0xE0, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6416, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x62, 0x00, 0x3E, 0x94, 0x00, 0x09, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x0B, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0x39, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6417, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x09, 0x80, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x48, 0x80, 0x0A, 0x48, 0x80, 0x0B, 0xF8, 0x80, 0x0A, 0x09, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6418, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x11, 0xFD, 0x80, 0x10, 0x23, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x30, 0x00, 0x10, 0xC7, 0x00, 0x13, 0x7C, 0x00, 0x10, 0x40, 0x80, 0x1C, 0x3F, 0x80, 0x70, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x30, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x641B, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x52, 0x00, 0x0B, 0xFF, 0x00, 0x7C, 0x50, 0x00, 0x08, 0x52, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x52, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x52, 0x00, 0x6B, 0xFE, 0x00, 0x08, 0xD8, 0x00, 0x09, 0x54, 0x00, 0x0A, 0x53, 0x00, 0x2C, 0x52, 0x00, 0x10, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x641C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x08, 0xCB, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xEB, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x08, 0x41, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x00, 0x08, 0x66, 0x00, 0x19, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x641E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x14, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x32, 0x00, 0x80, 0x52, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x00, 0x80, 0x32, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6420, { 0x00, 0x00, 0x00, 0x12, 0x20, 0x00, 0x13, 0x6F, 0x80, 0x11, 0x48, 0x80, 0x17, 0xF8, 0x80, 0x78, 0x88, 0x80, 0x10, 0x8F, 0x80, 0x12, 0xA8, 0x80, 0x12, 0xA8, 0x80, 0x1A, 0xA8, 0x80, 0x72, 0xAF, 0x80, 0x12, 0xA8, 0x80, 0x13, 0xE8, 0x80, 0x10, 0x88, 0x80, 0x11, 0x88, 0x80, 0x13, 0x08, 0x80, 0x36, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6421, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x70, 0x00, 0x7D, 0x8C, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x0D, 0x8C, 0x00, 0x1A, 0x52, 0x00, 0x68, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x24, 0x00, 0x2A, 0x23, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6422, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x99, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x80, 0x0A, 0x00, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6424, { 0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0x10, 0x8C, 0x00, 0x11, 0x86, 0x00, 0x13, 0x7B, 0x00, 0x7C, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x11, 0x06, 0x00, 0x13, 0x03, 0x00, 0x1A, 0x01, 0x80, 0x70, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x37, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6425, { 0x00, 0x00, 0x00, 0x13, 0x04, 0x00, 0x11, 0x88, 0x00, 0x10, 0xBF, 0x00, 0x13, 0x21, 0x00, 0x7D, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0x3F, 0x00, 0x13, 0xA0, 0x00, 0x1C, 0xA0, 0x00, 0x70, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x11, 0xBF, 0x00, 0x13, 0x40, 0x00, 0x36, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6426, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x20, 0x80, 0x7C, 0x20, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0xEF, 0x80, 0x1C, 0x61, 0x80, 0x71, 0xA6, 0x80, 0x13, 0x2C, 0x80, 0x10, 0xE3, 0x80, 0x11, 0xA6, 0x80, 0x13, 0x2C, 0x80, 0x10, 0x61, 0x80, 0x31, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6428, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x1C, 0x61, 0x80, 0x71, 0xA6, 0x80, 0x13, 0x2C, 0x80, 0x10, 0xE3, 0x80, 0x11, 0xA6, 0x80, 0x13, 0x2C, 0x80, 0x10, 0x20, 0x80, 0x30, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6429, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x11, 0x2F, 0x80, 0x13, 0xAA, 0x00, 0x7A, 0xEA, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xDF, 0x80, 0x11, 0x82, 0x00, 0x1B, 0x02, 0x00, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x642A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x7D, 0x7F, 0x00, 0x11, 0x09, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x09, 0x00, 0x1D, 0x09, 0x00, 0x71, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x13, 0x41, 0x00, 0x12, 0x41, 0x00, 0x16, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x642C, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x09, 0x0E, 0x00, 0x0B, 0xEA, 0x00, 0x3E, 0x2A, 0x00, 0x0A, 0xAA, 0x80, 0x0A, 0xAB, 0x80, 0x0A, 0xB0, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x3A, 0x29, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xA6, 0x00, 0x0A, 0xA4, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x29, 0x00, 0x1C, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x642D, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x54, 0x00, 0x18, 0x28, 0x00, 0x1C, 0x44, 0x00, 0x3A, 0x82, 0x00, 0x29, 0x01, 0x80, 0x2A, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x642F, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x24, 0x00, 0x7C, 0xB6, 0x00, 0x11, 0x93, 0x00, 0x11, 0x01, 0x00, 0x10, 0x60, 0x00, 0x1D, 0xCF, 0x00, 0x71, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6430, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x9E, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x1C, 0xFE, 0x00, 0x70, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6434, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1B, 0xF6, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6435, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x7C, 0xBA, 0x00, 0x10, 0xEE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6436, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x13, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x70, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x41, 0x00, 0x13, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x643A, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0xFF, 0x00, 0x3F, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x80, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x80, 0x80, 0x09, 0x00, 0x80, 0x1A, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x643D, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x14, 0xC6, 0x00, 0x1B, 0x93, 0x80, 0x30, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x643E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3F, 0x28, 0x80, 0x09, 0x49, 0x00, 0x08, 0x8F, 0x00, 0x09, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0E, 0x7F, 0x80, 0x38, 0x90, 0x00, 0x09, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x643F, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x80, 0x0C, 0x83, 0x00, 0x78, 0x8E, 0x00, 0x11, 0xC2, 0x00, 0x11, 0x42, 0x00, 0x7B, 0x6F, 0x80, 0x16, 0x32, 0x00, 0x15, 0xD2, 0x00, 0x10, 0x02, 0x00, 0x1D, 0xDF, 0x80, 0x71, 0x42, 0x00, 0x11, 0x42, 0x00, 0x11, 0x42, 0x00, 0x31, 0x42, 0x00, 0x21, 0xC2, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6441, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x09, 0x54, 0x00, 0x0B, 0x8C, 0x00, 0x0D, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x68, 0x00, 0x00, 0x08, 0xA0, 0x00, 0x0A, 0xA2, 0x00, 0x0A, 0x89, 0x00, 0x2C, 0x89, 0x00, 0x10, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6442, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x02, 0x00, 0x70, 0x00, 0x00, 0x11, 0x83, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x00, 0x00, 0x10, 0x6C, 0x00, 0x11, 0xC7, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6444, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x7E, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x0A, 0x84, 0x00, 0x0D, 0xFF, 0x00, 0x18, 0x04, 0x00, 0x6B, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x09, 0x54, 0x00, 0x08, 0x88, 0x00, 0x09, 0x54, 0x00, 0x2A, 0x23, 0x00, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6445, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x7F, 0x22, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x0B, 0x20, 0x00, 0x0D, 0x22, 0x00, 0x19, 0x1E, 0x00, 0x69, 0x00, 0x00, 0x0A, 0x50, 0x00, 0x0D, 0x4A, 0x00, 0x09, 0x41, 0x00, 0x2A, 0x45, 0x00, 0x10, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6446, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x7F, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x28, 0x00, 0x0D, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x68, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x88, 0x00, 0x09, 0x04, 0x00, 0x2B, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6447, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1E, 0x00, 0x0B, 0xE0, 0x00, 0x09, 0x24, 0x00, 0x7E, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x0B, 0x00, 0x00, 0x0D, 0xFE, 0x00, 0x1A, 0x20, 0x00, 0x68, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x29, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6448, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x7E, 0x1A, 0x00, 0x08, 0xE0, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0xFC, 0x00, 0x18, 0x88, 0x00, 0x68, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0xC8, 0x00, 0x28, 0x86, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x644A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x28, 0x00, 0x10, 0x22, 0x00, 0x17, 0x7F, 0x00, 0x79, 0xC8, 0x00, 0x15, 0x48, 0x00, 0x15, 0x7E, 0x00, 0x1D, 0x48, 0x00, 0x35, 0x48, 0x00, 0x52, 0x7E, 0x00, 0x15, 0x48, 0x00, 0x14, 0xC8, 0x00, 0x18, 0xCA, 0x00, 0x10, 0x7F, 0x00, 0x50, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x644B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x12, 0x27, 0x00, 0x11, 0x45, 0x00, 0x10, 0x85, 0x00, 0x7D, 0x45, 0x00, 0x12, 0x29, 0x80, 0x10, 0x80, 0x00, 0x10, 0xAF, 0x80, 0x1C, 0x84, 0x80, 0x73, 0xF5, 0x80, 0x10, 0x85, 0x00, 0x11, 0xC7, 0x00, 0x11, 0xA2, 0x00, 0x12, 0xA7, 0x00, 0x14, 0x8D, 0x00, 0x30, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x644E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xCF, 0x00, 0x11, 0x45, 0x00, 0x12, 0xCB, 0x00, 0x7D, 0x45, 0x00, 0x12, 0x49, 0x00, 0x10, 0x51, 0x00, 0x10, 0x38, 0x00, 0x1C, 0xEE, 0x00, 0x73, 0x83, 0x80, 0x10, 0x10, 0x00, 0x10, 0xE4, 0x00, 0x10, 0x19, 0x00, 0x10, 0xE2, 0x00, 0x10, 0x0C, 0x00, 0x30, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x644F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x7D, 0xFE, 0x00, 0x10, 0x50, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x19, 0x86, 0x00, 0x77, 0x63, 0x80, 0x11, 0xCE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xCE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6451, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x15, 0x00, 0x14, 0x13, 0x00, 0x7F, 0xFF, 0x00, 0x14, 0x11, 0x00, 0x15, 0xD1, 0x00, 0x15, 0x53, 0x00, 0x1D, 0xD5, 0x00, 0x74, 0x09, 0x00, 0x15, 0xD9, 0x00, 0x17, 0x2B, 0x00, 0x14, 0x45, 0x00, 0x14, 0x01, 0x00, 0x17, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6452, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0x21, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xEF, 0x80, 0x72, 0x42, 0x00, 0x12, 0x72, 0x00, 0x13, 0xCF, 0x80, 0x12, 0x42, 0x00, 0x12, 0xC2, 0x00, 0x14, 0x82, 0x00, 0x31, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6453, { 0x00, 0x00, 0x00, 0x12, 0x10, 0x00, 0x13, 0x1F, 0x00, 0x11, 0x21, 0x00, 0x12, 0x52, 0x00, 0x7F, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x10, 0x61, 0x80, 0x13, 0x08, 0x00, 0x1D, 0x3F, 0x00, 0x71, 0x08, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x80, 0x13, 0x08, 0x00, 0x12, 0x80, 0x00, 0x34, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6454, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7C, 0xA2, 0x00, 0x11, 0x29, 0x00, 0x10, 0x10, 0x00, 0x10, 0xA2, 0x00, 0x1D, 0x49, 0x00, 0x70, 0x74, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6458, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x41, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0E, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x18, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x645A, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x92, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x7C, 0x00, 0x70, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x645B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0xA5, 0x00, 0x08, 0x99, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x81, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x20, 0x80, 0x09, 0x24, 0x80, 0x09, 0x7A, 0x80, 0x09, 0x00, 0x80, 0x39, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x645C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x645D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1B, 0xFF, 0x00, 0x72, 0x00, 0x00, 0x12, 0x88, 0x00, 0x12, 0xEB, 0x00, 0x12, 0x8E, 0x00, 0x12, 0x88, 0x00, 0x14, 0xE8, 0x80, 0x31, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x645E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x7E, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x42, 0x00, 0x08, 0x88, 0x00, 0x0D, 0xF0, 0x00, 0x18, 0x20, 0x00, 0x68, 0x44, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x2A, 0x22, 0x00, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x645F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0xE4, 0x00, 0x10, 0x3E, 0x00, 0x33, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6460, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0xA1, 0x00, 0x08, 0xBD, 0x00, 0x08, 0xE5, 0x00, 0x08, 0x99, 0x00, 0x0A, 0x95, 0x00, 0x0C, 0xA3, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0x49, 0x00, 0x09, 0x48, 0x80, 0x0A, 0x42, 0x80, 0x0A, 0x7E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6461, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x11, 0x8F, 0x00, 0x11, 0x0A, 0x00, 0x13, 0xCA, 0x00, 0x7E, 0x4A, 0x00, 0x13, 0xCA, 0x00, 0x12, 0x4A, 0x00, 0x13, 0xDF, 0x80, 0x1C, 0x02, 0x00, 0x72, 0x02, 0x00, 0x12, 0x66, 0x00, 0x13, 0xC6, 0x00, 0x12, 0x0A, 0x00, 0x13, 0x2A, 0x80, 0x11, 0xEA, 0x80, 0x30, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6463, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x10, 0x80, 0x11, 0x1C, 0x00, 0x11, 0x71, 0x00, 0x11, 0x1F, 0x00, 0x1D, 0x00, 0x00, 0x71, 0x7E, 0x00, 0x11, 0x42, 0x00, 0x11, 0x7E, 0x00, 0x13, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x16, 0x42, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6467, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x48, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x1D, 0x88, 0x00, 0x72, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x30, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6469, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x24, 0x00, 0x10, 0x1C, 0x00, 0x13, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x646D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x7D, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x7F, 0x80, 0x11, 0x12, 0x00, 0x1D, 0x12, 0x00, 0x71, 0x12, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x00, 0x00, 0x13, 0x00, 0x00, 0x12, 0x55, 0x00, 0x16, 0xD5, 0x80, 0x30, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x646F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x3E, 0x00, 0x3F, 0x8A, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0x9A, 0x80, 0x04, 0x1A, 0x80, 0x1F, 0x21, 0x80, 0x04, 0x5C, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6473, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x7D, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x00, 0x00, 0x1D, 0x77, 0x00, 0x71, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x77, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6474, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6476, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x70, 0x12, 0x00, 0x10, 0x7F, 0x00, 0x13, 0xC1, 0x80, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x30, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6478, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x81, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6479, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x78, 0x00, 0x0B, 0xC6, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x647A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x3D, 0x29, 0x00, 0x0A, 0x73, 0x00, 0x08, 0xA5, 0x00, 0x0B, 0x39, 0x00, 0x08, 0x63, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x647B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x82, 0x00, 0x7D, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x1C, 0xC6, 0x00, 0x73, 0x93, 0x80, 0x10, 0x20, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x33, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x1C, 0x00, 0x31, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x647D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x70, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6482, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x7F, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x0A, 0x40, 0x00, 0x0C, 0xFC, 0x00, 0x19, 0x88, 0x00, 0x68, 0x70, 0x00, 0x09, 0x8C, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6483, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x24, 0xA3, 0x80, 0x3F, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x0C, 0x00, 0x7F, 0xD3, 0x80, 0x04, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6484, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0xD6, 0x00, 0x7E, 0xD6, 0x00, 0x0B, 0x1A, 0x00, 0x09, 0x8C, 0x00, 0x0A, 0x52, 0x00, 0x0C, 0x40, 0x00, 0x1B, 0xFF, 0x00, 0x68, 0x88, 0x00, 0x09, 0x08, 0x00, 0x08, 0x90, 0x00, 0x08, 0x70, 0x00, 0x28, 0xCC, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6485, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x13, 0x14, 0x00, 0x7E, 0xA4, 0x00, 0x13, 0xF7, 0x80, 0x12, 0x4C, 0x80, 0x12, 0x4A, 0x80, 0x1E, 0xD2, 0x00, 0x72, 0xD2, 0x00, 0x12, 0xF2, 0x00, 0x12, 0x47, 0x00, 0x12, 0x45, 0x00, 0x12, 0xC5, 0x00, 0x14, 0x8D, 0x80, 0x31, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6487, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x16, 0xB7, 0x80, 0x14, 0x9D, 0x00, 0x78, 0x89, 0x00, 0x17, 0xF5, 0x00, 0x14, 0x95, 0x00, 0x14, 0x95, 0x00, 0x1C, 0x95, 0x00, 0x75, 0xD7, 0x00, 0x16, 0xB2, 0x00, 0x14, 0x92, 0x00, 0x14, 0x97, 0x00, 0x14, 0x95, 0x00, 0x14, 0x95, 0x00, 0x34, 0x3D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6488, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xAA, 0x80, 0x0A, 0xCB, 0x00, 0x08, 0x82, 0x00, 0x3F, 0x45, 0x00, 0x0A, 0x28, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x41, 0x00, 0x08, 0x82, 0x00, 0x1B, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x648F, { 0x00, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x7D, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x00, 0x10, 0x89, 0x00, 0x1C, 0xE9, 0x00, 0x73, 0x8F, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6490, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x00, 0x80, 0x12, 0xFE, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x70, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x14, 0x00, 0x10, 0x64, 0x00, 0x13, 0x84, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6491, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x0F, 0x00, 0x38, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6492, { 0x00, 0x00, 0x00, 0x09, 0x44, 0x00, 0x09, 0x44, 0x00, 0x09, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x15, 0x00, 0x0F, 0xE5, 0x00, 0x3A, 0x26, 0x00, 0x0B, 0xE2, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xE5, 0x00, 0x0A, 0x25, 0x00, 0x0A, 0x28, 0x80, 0x1A, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6493, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x74, 0x00, 0x3B, 0xBF, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x80, 0x1B, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6495, { 0x00, 0x00, 0x00, 0x12, 0x41, 0x00, 0x12, 0x43, 0x00, 0x17, 0xEE, 0x00, 0x12, 0x48, 0x00, 0x7A, 0x48, 0x00, 0x13, 0xCF, 0x80, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1B, 0xC9, 0x00, 0x72, 0x49, 0x00, 0x12, 0x49, 0x00, 0x17, 0xE9, 0x00, 0x10, 0x09, 0x00, 0x12, 0x49, 0x00, 0x12, 0x51, 0x00, 0x34, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6496, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0xC8, 0x00, 0x10, 0x92, 0x00, 0x7D, 0x1F, 0x00, 0x17, 0xE2, 0x00, 0x12, 0x52, 0x00, 0x13, 0xD4, 0x00, 0x16, 0x54, 0x00, 0x1B, 0xD4, 0x00, 0x72, 0x48, 0x00, 0x12, 0x68, 0x00, 0x1F, 0xD4, 0x00, 0x10, 0x54, 0x00, 0x50, 0x63, 0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6498, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x94, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x1C, 0xC6, 0x00, 0x73, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6499, { 0x00, 0x00, 0x00, 0x10, 0x9E, 0x00, 0x11, 0x01, 0x00, 0x12, 0xFE, 0x80, 0x10, 0x28, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xCF, 0x00, 0x11, 0x01, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x42, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x649A, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x85, 0x00, 0x09, 0xE4, 0x80, 0x3F, 0x24, 0x00, 0x0A, 0xBF, 0x80, 0x0E, 0x44, 0x00, 0x09, 0x8A, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0x11, 0x00, 0x3A, 0x20, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x49, 0x00, 0x09, 0x24, 0x80, 0x0A, 0x24, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x649B, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x92, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x13, 0x93, 0x80, 0x10, 0x90, 0x00, 0x1C, 0xE2, 0x00, 0x71, 0xAF, 0x80, 0x13, 0x2A, 0x00, 0x10, 0xEA, 0x00, 0x10, 0x5F, 0x80, 0x10, 0xC2, 0x00, 0x11, 0x82, 0x00, 0x33, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x649D, { 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x11, 0xFA, 0x00, 0x10, 0xA3, 0x00, 0x11, 0x11, 0x00, 0x7D, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x71, 0x01, 0x00, 0x11, 0xFF, 0x80, 0x13, 0x00, 0x80, 0x12, 0x0A, 0x80, 0x16, 0xAA, 0x80, 0x11, 0xA1, 0x80, 0x31, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x649E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x28, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x0F, 0xFF, 0x00, 0x39, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x649F, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x10, 0xFE, 0x00, 0x13, 0x45, 0x80, 0x10, 0x7C, 0x00, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x31, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64A1, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x82, 0x00, 0x7D, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x1C, 0xC6, 0x00, 0x73, 0x83, 0x80, 0x10, 0x20, 0x00, 0x10, 0xA3, 0x00, 0x11, 0xA9, 0x80, 0x13, 0x2C, 0x80, 0x10, 0x24, 0x00, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64A3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7C, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1C, 0xFE, 0x00, 0x70, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64A4, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0B, 0xF4, 0x00, 0x3E, 0x8F, 0x80, 0x09, 0x29, 0x00, 0x0B, 0xF1, 0x00, 0x08, 0x11, 0x00, 0x0B, 0xFA, 0x00, 0x0E, 0x2A, 0x00, 0x3B, 0xEA, 0x00, 0x0A, 0x2A, 0x00, 0x0B, 0xE4, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x2A, 0x00, 0x0A, 0x29, 0x00, 0x1A, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64A5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFA, 0x00, 0x08, 0xAC, 0x80, 0x3E, 0x45, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x0B, 0xDE, 0x00, 0x08, 0x52, 0x80, 0x0F, 0xD3, 0x80, 0x3A, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x51, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x44, 0x00, 0x08, 0x9A, 0x00, 0x1B, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64A6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x13, 0xA3, 0x80, 0x10, 0x28, 0x00, 0x11, 0xFE, 0x00, 0x1C, 0x30, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xFE, 0x00, 0x13, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64A8, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x48, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x7D, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1C, 0xFF, 0x00, 0x70, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0xA9, 0x00, 0x11, 0xAD, 0x80, 0x31, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64A9, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7D, 0x45, 0x00, 0x10, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x12, 0x82, 0x80, 0x1C, 0xFE, 0x00, 0x70, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64AB, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0xAA, 0x00, 0x38, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0x25, 0x00, 0x09, 0x25, 0x00, 0x19, 0x25, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64AC, { 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x7C, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x21, 0x00, 0x10, 0x1F, 0x00, 0x1C, 0xC2, 0x00, 0x73, 0x9C, 0x00, 0x11, 0x04, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xDF, 0x00, 0x11, 0x24, 0x80, 0x30, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64AD, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x92, 0x00, 0x0D, 0x11, 0x80, 0x3A, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64AE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0D, 0x20, 0x00, 0x39, 0xFF, 0x80, 0x09, 0x29, 0x00, 0x09, 0xEA, 0x00, 0x09, 0x24, 0x00, 0x09, 0xE6, 0x00, 0x0E, 0x29, 0x00, 0x18, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64B0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x3F, 0xEF, 0x00, 0x09, 0x08, 0x00, 0x09, 0x18, 0x80, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x19, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64B2, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x09, 0x29, 0x00, 0x08, 0xAA, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x1B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64B3, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x11, 0xC8, 0x00, 0x11, 0x68, 0x00, 0x13, 0x2F, 0x80, 0x7C, 0x18, 0x80, 0x13, 0xE5, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1B, 0xE4, 0x00, 0x70, 0x84, 0x00, 0x12, 0xAE, 0x00, 0x12, 0xAA, 0x00, 0x12, 0x8A, 0x00, 0x10, 0xEB, 0x00, 0x17, 0x89, 0x00, 0x30, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64B5, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x88, 0x00, 0x7F, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x11, 0x57, 0x00, 0x1E, 0x42, 0x00, 0x33, 0xFC, 0x00, 0x50, 0x80, 0x00, 0x11, 0x20, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x50, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64B7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x02, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x08, 0x00, 0x7F, 0xD2, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x22, 0x00, 0x0B, 0xEA, 0x00, 0x0C, 0x2A, 0x00, 0x1B, 0xAA, 0x00, 0x6A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0B, 0x90, 0x00, 0x28, 0x26, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64B8, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x09, 0xF8, 0x00, 0x0A, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x68, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64B9, { 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x11, 0xB3, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x00, 0x80, 0x12, 0xFE, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x80, 0x10, 0xC9, 0x80, 0x33, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64BA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x89, 0x00, 0x7D, 0x24, 0x00, 0x0A, 0x22, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x0D, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x6B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x28, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64BB, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0x84, 0x00, 0x08, 0xBF, 0x00, 0x3E, 0x84, 0x00, 0x09, 0x7F, 0x80, 0x09, 0x11, 0x00, 0x0B, 0x8A, 0x00, 0x08, 0xFF, 0x80, 0x0C, 0x84, 0x00, 0x3A, 0xBF, 0x80, 0x0A, 0x84, 0x00, 0x09, 0xBF, 0x80, 0x09, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x3F, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64BC, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x7E, 0xF9, 0x00, 0x12, 0x0B, 0x00, 0x12, 0xEE, 0x00, 0x12, 0xA4, 0x00, 0x1E, 0xEE, 0x80, 0x72, 0x1B, 0x80, 0x14, 0x71, 0x00, 0x10, 0x00, 0x00, 0x11, 0x53, 0x00, 0x11, 0x49, 0x80, 0x13, 0x42, 0x80, 0x36, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64BD, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x7E, 0x2F, 0x80, 0x13, 0xE9, 0x00, 0x12, 0x39, 0x00, 0x13, 0xE9, 0x00, 0x1C, 0x8D, 0x00, 0x70, 0x85, 0x00, 0x17, 0xF7, 0x00, 0x11, 0x02, 0x00, 0x11, 0xE2, 0x00, 0x11, 0x27, 0x00, 0x13, 0x25, 0x00, 0x12, 0x2D, 0x80, 0x36, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64BE, { 0x00, 0x00, 0x00, 0x10, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x13, 0x22, 0x00, 0x11, 0x2E, 0x00, 0x7A, 0x2A, 0x00, 0x13, 0x2A, 0x00, 0x11, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x1B, 0x5D, 0x00, 0x71, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x5D, 0x00, 0x11, 0x41, 0x00, 0x13, 0x43, 0x00, 0x12, 0x80, 0x00, 0x36, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64BF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x7C, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x1D, 0x29, 0x00, 0x71, 0xEF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC7, 0x00, 0x33, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64C0, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x17, 0xD4, 0x00, 0x79, 0x22, 0x00, 0x17, 0xC1, 0x00, 0x14, 0x7E, 0x00, 0x17, 0xC8, 0x00, 0x1C, 0x48, 0x00, 0x77, 0xCA, 0x00, 0x11, 0x3F, 0x00, 0x17, 0xC8, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x51, 0x08, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64C1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x89, 0x00, 0x08, 0x8A, 0x00, 0x0D, 0x5F, 0x80, 0x0A, 0x52, 0x00, 0x09, 0xB2, 0x00, 0x0F, 0x5F, 0x80, 0x3A, 0x32, 0x00, 0x0F, 0xD2, 0x00, 0x08, 0x5F, 0x80, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x1F, 0x80, 0x1A, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64C2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64C4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x17, 0x00, 0x09, 0xF8, 0x00, 0x09, 0x1F, 0x80, 0x09, 0x7F, 0x00, 0x0F, 0x49, 0x00, 0x39, 0xFF, 0x80, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x11, 0x00, 0x1A, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64C5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xBA, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x38, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x1B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64C7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x0C, 0x22, 0x00, 0x38, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64C9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x7B, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x80, 0x13, 0x20, 0x80, 0x1F, 0xFC, 0x80, 0x71, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0xFC, 0x80, 0x10, 0x28, 0x80, 0x10, 0xFD, 0x80, 0x13, 0x85, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64CA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBE, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x80, 0x24, 0xA3, 0x80, 0x3F, 0xC0, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x11, 0x00, 0x3F, 0x8E, 0x00, 0x04, 0xF3, 0x80, 0x0F, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64CB, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x11, 0x93, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x00, 0x80, 0x12, 0xFE, 0x80, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64CC, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x92, 0x00, 0x7C, 0x41, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x1C, 0x92, 0x00, 0x70, 0x92, 0x00, 0x11, 0x55, 0x00, 0x11, 0x39, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x33, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64CD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x0B, 0x29, 0x00, 0x0D, 0xEF, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x1B, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64CE, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x3F, 0xD0, 0x00, 0x09, 0x1F, 0x80, 0x1F, 0xA1, 0x00, 0x20, 0xD2, 0x00, 0x0E, 0x8C, 0x00, 0x0A, 0x8B, 0x80, 0x0E, 0x90, 0x00, 0x01, 0xBE, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64D0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x50, 0x80, 0x10, 0x93, 0x00, 0x11, 0x8C, 0x00, 0x12, 0xB3, 0x00, 0x30, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64D1, { 0x00, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x13, 0xCB, 0x00, 0x12, 0x49, 0x00, 0x12, 0x48, 0x00, 0x7B, 0xCF, 0x80, 0x10, 0x38, 0x00, 0x17, 0xE9, 0x00, 0x12, 0x49, 0x00, 0x1B, 0xCB, 0x00, 0x72, 0x4A, 0x00, 0x13, 0xCE, 0x00, 0x12, 0x44, 0x00, 0x13, 0xCE, 0x00, 0x16, 0x4A, 0x80, 0x10, 0x59, 0x80, 0x30, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64D2, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0x4A, 0x00, 0x3E, 0x89, 0x80, 0x09, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x99, 0x00, 0x0A, 0xA5, 0x00, 0x0C, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x09, 0x4C, 0x80, 0x09, 0xF2, 0x80, 0x09, 0x00, 0x80, 0x19, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64D4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x09, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x28, 0x80, 0x09, 0xC7, 0x80, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x39, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x1A, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64D5, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x90, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x15, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x10, 0x00, 0x71, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xCF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x79, 0x00, 0x12, 0x01, 0x00, 0x32, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64D7, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x5F, 0x00, 0x12, 0x40, 0x00, 0x7A, 0x51, 0x00, 0x12, 0x5B, 0x00, 0x13, 0xCA, 0x00, 0x12, 0x3F, 0x80, 0x1A, 0x04, 0x00, 0x73, 0xC4, 0x00, 0x16, 0x5F, 0x00, 0x16, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x12, 0x44, 0x00, 0x13, 0xC4, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64D8, { 0x00, 0x00, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x04, 0x00, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64DA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x2F, 0x00, 0x09, 0xF0, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x39, 0x31, 0x00, 0x09, 0x5A, 0x00, 0x09, 0xAC, 0x00, 0x09, 0x5C, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64DE, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x15, 0x48, 0x00, 0x13, 0x88, 0x00, 0x11, 0x0A, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x22, 0x00, 0x1B, 0x92, 0x00, 0x15, 0x52, 0x00, 0x31, 0x14, 0x00, 0x5F, 0xF4, 0x00, 0x12, 0x48, 0x00, 0x14, 0x48, 0x00, 0x12, 0x94, 0x00, 0x11, 0x14, 0x00, 0x52, 0xA3, 0x00, 0x24, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x7B, 0xD7, 0x80, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x12, 0xD6, 0x80, 0x18, 0x00, 0x00, 0x71, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x13, 0x01, 0x00, 0x36, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x0D, 0xFE, 0x00, 0x38, 0x41, 0x00, 0x08, 0xBF, 0x00, 0x0B, 0xD0, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64E2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x3F, 0x6B, 0x00, 0x0A, 0xB5, 0x00, 0x09, 0x39, 0x00, 0x08, 0x68, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0xFF, 0x00, 0x39, 0x90, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x80, 0x10, 0xFE, 0x80, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x01, 0x00, 0x13, 0xDF, 0x80, 0x12, 0x49, 0x00, 0x33, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E4, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x31, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E5, { 0x00, 0x00, 0x00, 0x3F, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x80, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x55, 0x00, 0x20, 0xFF, 0x80, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E6, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x3F, 0x52, 0x00, 0x0B, 0x34, 0x00, 0x08, 0xCC, 0x00, 0x08, 0x83, 0x80, 0x0B, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x1A, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64E7, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x8F, 0x00, 0x10, 0xF1, 0x00, 0x1E, 0x87, 0x00, 0x10, 0xF1, 0x00, 0x1E, 0xAF, 0x00, 0x10, 0x21, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x78, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64E9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x1C, 0x00, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x32, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64EA, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x2F, 0x91, 0x00, 0x20, 0x7F, 0x80, 0x2F, 0x94, 0x00, 0x28, 0x94, 0x00, 0x2F, 0x96, 0x00, 0x28, 0xB2, 0x00, 0x2F, 0xA3, 0x00, 0x29, 0xF9, 0x80, 0x20, 0x20, 0x00, 0x27, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x5F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64EC, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x6F, 0x00, 0x0B, 0x81, 0x00, 0x3E, 0x2A, 0x00, 0x0B, 0xE4, 0x00, 0x09, 0x1F, 0x80, 0x09, 0x05, 0x00, 0x0B, 0xE4, 0x00, 0x0C, 0x84, 0x00, 0x38, 0x97, 0x80, 0x0F, 0xF4, 0x00, 0x08, 0x94, 0x00, 0x09, 0x54, 0x00, 0x09, 0x34, 0x00, 0x0A, 0x2F, 0x80, 0x1C, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64ED, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x88, 0x00, 0x7D, 0xFF, 0x80, 0x13, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x46, 0x00, 0x10, 0x38, 0x00, 0x33, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64EF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x11, 0xFF, 0x00, 0x7C, 0x12, 0x00, 0x10, 0x94, 0x00, 0x13, 0x18, 0x00, 0x10, 0xFF, 0x00, 0x1B, 0x81, 0x00, 0x70, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x31, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64F0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x20, 0x80, 0x12, 0x50, 0x80, 0x11, 0x45, 0x00, 0x12, 0x7C, 0x80, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64F1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x7E, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x20, 0x80, 0x12, 0x7C, 0x80, 0x1E, 0xC4, 0x80, 0x72, 0x38, 0x80, 0x12, 0xC6, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x32, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64F2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xE7, 0x80, 0x09, 0x14, 0x80, 0x3F, 0xFC, 0x80, 0x0A, 0x45, 0x00, 0x09, 0xF4, 0x80, 0x09, 0x54, 0x80, 0x09, 0xB4, 0x80, 0x0D, 0x14, 0x80, 0x39, 0xF4, 0x80, 0x08, 0x44, 0x80, 0x0F, 0xFC, 0x80, 0x08, 0x44, 0x80, 0x08, 0xA7, 0x00, 0x09, 0x24, 0x00, 0x1A, 0x14, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64F4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x0D, 0x08, 0x00, 0x39, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x22, 0x00, 0x1A, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64F5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x12, 0xD6, 0x80, 0x13, 0x5A, 0x80, 0x1E, 0x06, 0x00, 0x72, 0x7C, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64F6, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0xEF, 0x80, 0x12, 0x94, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1D, 0xE1, 0x00, 0x71, 0x29, 0x00, 0x11, 0xE9, 0x00, 0x11, 0x29, 0x00, 0x11, 0xE9, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x31, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64F7, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x9F, 0x80, 0x10, 0x84, 0x00, 0x13, 0xEF, 0x00, 0x7C, 0x89, 0x00, 0x10, 0x89, 0x00, 0x13, 0xEF, 0x00, 0x10, 0x09, 0x00, 0x1C, 0x09, 0x00, 0x73, 0xEF, 0x00, 0x12, 0x29, 0x00, 0x12, 0x29, 0x00, 0x12, 0x2F, 0x00, 0x13, 0xE0, 0x00, 0x10, 0x09, 0x00, 0x30, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64FA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x09, 0x69, 0x80, 0x0B, 0xBE, 0x00, 0x08, 0x08, 0x80, 0x0F, 0xEF, 0x80, 0x39, 0x20, 0x00, 0x09, 0xE8, 0x00, 0x09, 0x2B, 0x00, 0x09, 0xEC, 0x00, 0x09, 0x28, 0x80, 0x09, 0x2F, 0x80, 0x19, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64FB, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x13, 0xE4, 0x00, 0x12, 0xA4, 0x00, 0x17, 0xFF, 0x80, 0x7A, 0xA9, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x89, 0x00, 0x13, 0xED, 0x00, 0x1A, 0xA5, 0x00, 0x73, 0xE7, 0x00, 0x11, 0x02, 0x00, 0x17, 0xF2, 0x00, 0x12, 0x67, 0x00, 0x17, 0xC5, 0x00, 0x11, 0x6D, 0x80, 0x36, 0x38, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64FD, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x13, 0x23, 0x00, 0x12, 0x3A, 0x00, 0x12, 0xAA, 0x80, 0x7D, 0x29, 0x00, 0x11, 0x39, 0x00, 0x12, 0x2A, 0x00, 0x12, 0xAA, 0x80, 0x1F, 0xBB, 0x80, 0x70, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x64FE, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x20, 0x80, 0x39, 0x93, 0x00, 0x0A, 0xFE, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x0B, 0x8C, 0x00, 0x08, 0x70, 0x00, 0x1B, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x64FF, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0x7F, 0x80, 0x11, 0x21, 0x00, 0x7A, 0x12, 0x00, 0x13, 0x7F, 0x80, 0x11, 0x48, 0x80, 0x10, 0x7F, 0x80, 0x1B, 0x48, 0x80, 0x71, 0x5E, 0x80, 0x11, 0x52, 0x80, 0x11, 0x5E, 0x80, 0x11, 0x40, 0x80, 0x13, 0x41, 0x80, 0x12, 0x80, 0x00, 0x36, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6500, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x08, 0xC4, 0x00, 0x3E, 0xBF, 0x80, 0x0D, 0x2E, 0x00, 0x1A, 0xD5, 0x00, 0x29, 0x24, 0x80, 0x08, 0xA4, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x78, 0x00, 0x0B, 0xC6, 0x00, 0x30, 0x41, 0x80, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6501, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x7D, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x75, 0x05, 0x80, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFD, 0x00, 0x11, 0x12, 0x00, 0x11, 0xDC, 0x00, 0x37, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6504, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x2F, 0x00, 0x09, 0xF0, 0x80, 0x09, 0x3F, 0x80, 0x0B, 0x7F, 0x00, 0x0D, 0x49, 0x00, 0x39, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x10, 0x00, 0x09, 0xA9, 0x00, 0x0A, 0xA2, 0x80, 0x1A, 0xBE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6505, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x82, 0x00, 0x13, 0xEF, 0x80, 0x7C, 0x82, 0x00, 0x11, 0x45, 0x00, 0x12, 0x28, 0x80, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x31, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6508, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x7E, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x12, 0xEE, 0x00, 0x1E, 0x88, 0x80, 0x73, 0xEF, 0x80, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x33, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6509, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x7E, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x88, 0x00, 0x71, 0xFF, 0x80, 0x13, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x650A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0xCC, 0x00, 0x7A, 0x44, 0x00, 0x13, 0xFF, 0x00, 0x12, 0xEE, 0x00, 0x13, 0x55, 0x00, 0x1A, 0x44, 0x00, 0x72, 0x10, 0x00, 0x12, 0x90, 0x00, 0x12, 0x9F, 0x00, 0x12, 0x90, 0x00, 0x14, 0x90, 0x00, 0x10, 0x90, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x650F, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF7, 0x80, 0x12, 0x24, 0x00, 0x79, 0x47, 0x80, 0x17, 0xF0, 0x80, 0x10, 0x07, 0x80, 0x13, 0xE4, 0x00, 0x1A, 0x27, 0x80, 0x73, 0xE4, 0x00, 0x12, 0x27, 0x80, 0x13, 0xE4, 0x00, 0x12, 0x27, 0x80, 0x12, 0x24, 0x00, 0x12, 0x24, 0x80, 0x32, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6512, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x15, 0x14, 0x00, 0x17, 0xDF, 0x00, 0x19, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x14, 0xD3, 0x00, 0x19, 0xFC, 0x00, 0x71, 0x04, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x10, 0x50, 0x00, 0x51, 0x8C, 0x00, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6513, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x48, 0x80, 0x15, 0xFE, 0x80, 0x78, 0x48, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x18, 0x84, 0x00, 0x73, 0xFF, 0x00, 0x16, 0x85, 0x80, 0x10, 0xFC, 0x00, 0x10, 0x50, 0x00, 0x10, 0xDE, 0x00, 0x11, 0xB0, 0x00, 0x33, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6514, { 0x00, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x7B, 0xEF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x10, 0x80, 0x1A, 0xFE, 0x80, 0x72, 0xD6, 0x80, 0x12, 0xBA, 0x80, 0x12, 0x92, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x54, 0x80, 0x12, 0x92, 0x80, 0x32, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6516, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7D, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x1C, 0xAA, 0x00, 0x71, 0x11, 0x00, 0x10, 0x40, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x11, 0xE4, 0x00, 0x10, 0x3E, 0x00, 0x31, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6518, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0xE7, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xE7, 0x00, 0x08, 0x24, 0x00, 0x0A, 0xFF, 0x00, 0x0C, 0x24, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x69, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x7A, 0x00, 0x19, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6519, { 0x00, 0x00, 0x00, 0x10, 0xFC, 0x00, 0x13, 0x08, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0xEF, 0x00, 0x10, 0x88, 0x80, 0x1D, 0xE7, 0x80, 0x70, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xC8, 0x80, 0x33, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x651B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x17, 0x8F, 0x80, 0x78, 0x60, 0x00, 0x13, 0xCF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xCF, 0x00, 0x1A, 0x01, 0x00, 0x73, 0xFF, 0x00, 0x11, 0x12, 0x00, 0x11, 0xDA, 0x00, 0x11, 0x12, 0x80, 0x11, 0xDA, 0x80, 0x11, 0x11, 0x80, 0x33, 0xBC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x651C, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x7D, 0xFF, 0x00, 0x13, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x12, 0xFF, 0x00, 0x13, 0x49, 0x00, 0x12, 0x79, 0x00, 0x32, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x651D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x4F, 0x80, 0x09, 0xF2, 0x00, 0x0D, 0xFF, 0x00, 0x38, 0xAA, 0x00, 0x08, 0xEE, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xEE, 0x00, 0x08, 0xFB, 0x80, 0x0B, 0x2E, 0x00, 0x18, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x651E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x10, 0x85, 0x00, 0x13, 0x0F, 0x80, 0x11, 0x5A, 0x00, 0x1C, 0x8A, 0x00, 0x71, 0x2F, 0x00, 0x13, 0xEA, 0x00, 0x10, 0xAA, 0x00, 0x10, 0x8F, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x30, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x651F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x7C, 0x89, 0x00, 0x17, 0xFF, 0x00, 0x15, 0x08, 0x00, 0x15, 0xEE, 0x00, 0x1D, 0x08, 0x80, 0x77, 0xFF, 0x80, 0x15, 0x7D, 0x00, 0x15, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x19, 0x39, 0x00, 0x11, 0x55, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6522, { 0x00, 0x00, 0x00, 0x12, 0x8A, 0x00, 0x13, 0xFF, 0x80, 0x14, 0x92, 0x00, 0x13, 0xEF, 0x80, 0x7D, 0x45, 0x00, 0x11, 0x65, 0x00, 0x12, 0x49, 0x80, 0x11, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x33, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6523, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x13, 0xF9, 0x00, 0x24, 0x0A, 0x00, 0x1A, 0xE5, 0x00, 0x3E, 0x1F, 0x80, 0x08, 0xE2, 0x00, 0x2A, 0x0A, 0x80, 0x2A, 0xEA, 0x80, 0x08, 0xFC, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6524, { 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x80, 0x17, 0xF5, 0x00, 0x11, 0x4F, 0x80, 0x7D, 0xDA, 0x00, 0x10, 0x8A, 0x00, 0x13, 0xEA, 0x00, 0x12, 0xAF, 0x80, 0x1B, 0xEA, 0x00, 0x70, 0x8A, 0x00, 0x13, 0xEA, 0x00, 0x10, 0x8F, 0x80, 0x17, 0xFA, 0x00, 0x11, 0x4A, 0x00, 0x13, 0x6A, 0x00, 0x36, 0x2F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6525, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0xEF, 0x00, 0x0A, 0x94, 0x00, 0x09, 0xFC, 0x00, 0x7F, 0x44, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x0C, 0x40, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0xA8, 0x00, 0x69, 0x4C, 0x00, 0x0E, 0xF3, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFC, 0x00, 0x28, 0xA8, 0x00, 0x13, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6526, { 0x00, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x7A, 0xAA, 0x80, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x48, 0x00, 0x1B, 0xFF, 0x00, 0x72, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x12, 0xEF, 0x00, 0x12, 0x88, 0x00, 0x14, 0xE8, 0x80, 0x31, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6529, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x82, 0x80, 0x7A, 0xFE, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x93, 0x00, 0x1D, 0x55, 0x00, 0x71, 0x39, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x49, 0x00, 0x32, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x652A, { 0x00, 0x00, 0x00, 0x08, 0xDB, 0x00, 0x08, 0xE7, 0x00, 0x08, 0x99, 0x00, 0x3E, 0xEF, 0x00, 0x08, 0x81, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x08, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x64, 0x80, 0x1B, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x652B, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x3F, 0xEF, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x48, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x46, 0x00, 0x08, 0x38, 0x00, 0x1B, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x652C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xAB, 0x80, 0x09, 0x10, 0x80, 0x3F, 0xEB, 0x80, 0x09, 0x10, 0x80, 0x09, 0xEB, 0x80, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x0E, 0xFF, 0x00, 0x38, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x80, 0x08, 0xC4, 0x80, 0x1B, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x652E, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x21, 0xFC, 0x00, 0x71, 0x24, 0x00, 0x2F, 0xFF, 0x80, 0x2A, 0x52, 0x80, 0x23, 0xDE, 0x00, 0x20, 0x88, 0x00, 0x33, 0xFE, 0x00, 0x60, 0x88, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x88, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x92, 0x00, 0x27, 0x0C, 0x00, 0x61, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x652F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x01, 0x90, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6531, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x32, 0x21, 0x00, 0x12, 0x23, 0x00, 0x16, 0x32, 0x00, 0x14, 0x16, 0x00, 0x04, 0x1C, 0x00, 0x07, 0x08, 0x00, 0x3C, 0x1C, 0x00, 0x60, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6534, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6535, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x34, 0x18, 0x00, 0x66, 0x10, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6536, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x11, 0x20, 0x00, 0x11, 0x3F, 0x80, 0x11, 0x21, 0x00, 0x11, 0x51, 0x00, 0x11, 0x52, 0x00, 0x11, 0x92, 0x00, 0x11, 0x0C, 0x00, 0x17, 0x08, 0x00, 0x39, 0x0C, 0x00, 0x01, 0x14, 0x00, 0x01, 0x12, 0x00, 0x01, 0x21, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6537, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x1F, 0x42, 0x00, 0x21, 0xA2, 0x00, 0x21, 0x14, 0x00, 0x01, 0x14, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x02, 0x22, 0x00, 0x02, 0x41, 0x00, 0x1D, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6538, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x3F, 0x80, 0x19, 0x21, 0x00, 0x29, 0x42, 0x00, 0x29, 0xA2, 0x00, 0x09, 0x14, 0x00, 0x09, 0x14, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x14, 0x00, 0x09, 0x22, 0x00, 0x09, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6539, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x02, 0x20, 0x00, 0x02, 0x3F, 0x00, 0x02, 0x22, 0x00, 0x02, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x20, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x21, 0x14, 0x00, 0x20, 0x18, 0x00, 0x20, 0x08, 0x00, 0x21, 0x14, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x653A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x42, 0x7F, 0x00, 0x42, 0x44, 0x00, 0x42, 0xC4, 0x00, 0x7E, 0xA4, 0x00, 0x41, 0xAC, 0x00, 0x40, 0x28, 0x00, 0x40, 0x38, 0x00, 0x40, 0x10, 0x00, 0x42, 0x38, 0x00, 0x62, 0x28, 0x00, 0x3E, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x653B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x28, 0x00, 0x08, 0x10, 0x00, 0x0B, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x30, 0x44, 0x00, 0x01, 0x82, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x653C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x7F, 0x52, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x14, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x653D, { 0x00, 0x00, 0x00, 0x1E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0x1F, 0x80, 0x31, 0x32, 0x00, 0x61, 0xA2, 0x00, 0x40, 0xD6, 0x00, 0x3F, 0x14, 0x00, 0x09, 0x14, 0x00, 0x09, 0x1C, 0x00, 0x09, 0x08, 0x00, 0x09, 0x1C, 0x00, 0x19, 0x14, 0x00, 0x13, 0x36, 0x00, 0x32, 0x23, 0x00, 0x66, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x653E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0x62, 0x00, 0x0F, 0xA2, 0x00, 0x09, 0x24, 0x00, 0x09, 0x14, 0x00, 0x09, 0x14, 0x00, 0x09, 0x08, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x12, 0x21, 0x00, 0x2C, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x653F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x02, 0x10, 0x00, 0x02, 0x1F, 0x80, 0x12, 0x21, 0x00, 0x12, 0x51, 0x00, 0x13, 0xD1, 0x00, 0x12, 0x12, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x04, 0x00, 0x12, 0x0C, 0x00, 0x3F, 0xD2, 0x00, 0x00, 0x21, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6543, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x20, 0x48, 0x00, 0x20, 0x4F, 0x80, 0x20, 0x59, 0x00, 0x3F, 0xD1, 0x00, 0x24, 0x33, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x24, 0x0E, 0x00, 0x24, 0x04, 0x00, 0x26, 0x0E, 0x00, 0x22, 0x4A, 0x00, 0x23, 0x4B, 0x00, 0x39, 0xD9, 0x00, 0x60, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6545, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xDF, 0x80, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x51, 0x00, 0x04, 0x92, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x8C, 0x00, 0x20, 0x84, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x92, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6547, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x32, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xE6, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x25, 0x9C, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x15, 0x14, 0x00, 0x34, 0xB6, 0x00, 0x64, 0x23, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6548, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xBF, 0x80, 0x0A, 0x21, 0x00, 0x11, 0x61, 0x00, 0x10, 0x92, 0x00, 0x21, 0x52, 0x00, 0x09, 0x14, 0x00, 0x06, 0x0C, 0x00, 0x02, 0x08, 0x00, 0x05, 0x14, 0x00, 0x04, 0x94, 0x00, 0x08, 0x22, 0x00, 0x10, 0xC1, 0x00, 0x23, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6549, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x49, 0x10, 0x00, 0x6B, 0x10, 0x00, 0x2A, 0x1F, 0x80, 0x08, 0x32, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x66, 0x00, 0x08, 0x14, 0x00, 0x1C, 0x14, 0x00, 0x1A, 0x1C, 0x00, 0x29, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x48, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x654C, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x03, 0x90, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x22, 0x00, 0x04, 0x3F, 0x00, 0x05, 0x44, 0x00, 0x7F, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x05, 0x24, 0x00, 0x1F, 0xA4, 0x00, 0x11, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x28, 0x00, 0x11, 0x47, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x654D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x08, 0x00, 0x20, 0x0F, 0x80, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x12, 0x00, 0x15, 0x14, 0x00, 0x15, 0x08, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x92, 0x00, 0x04, 0x21, 0x00, 0x0C, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x654E, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x06, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x15, 0x08, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0x91, 0x00, 0x08, 0x31, 0x00, 0x0F, 0xD1, 0x00, 0x11, 0x12, 0x00, 0x22, 0x0A, 0x00, 0x07, 0xCC, 0x00, 0x3C, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x12, 0x00, 0x04, 0x21, 0x00, 0x0C, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x654F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0xE8, 0x00, 0x10, 0x10, 0x00, 0x20, 0x1F, 0x80, 0x1F, 0xD1, 0x00, 0x12, 0x71, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x3F, 0xEC, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x84, 0x00, 0x24, 0x8A, 0x00, 0x3F, 0xD2, 0x00, 0x21, 0x21, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6550, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x10, 0x00, 0x20, 0x1F, 0x80, 0x2F, 0x32, 0x00, 0x20, 0x22, 0x00, 0x20, 0x66, 0x00, 0x3F, 0x94, 0x00, 0x28, 0x14, 0x00, 0x28, 0x5C, 0x00, 0x2A, 0x88, 0x00, 0x29, 0x1C, 0x00, 0x29, 0x14, 0x00, 0x2B, 0xB6, 0x00, 0x4C, 0xA3, 0x00, 0x18, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6551, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x1F, 0x80, 0x04, 0xA1, 0x00, 0x25, 0x21, 0x00, 0x14, 0x52, 0x00, 0x04, 0x92, 0x00, 0x0E, 0x0C, 0x00, 0x0D, 0x08, 0x00, 0x14, 0x8C, 0x00, 0x14, 0x14, 0x00, 0x24, 0x22, 0x00, 0x04, 0x41, 0x00, 0x0D, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6552, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x1F, 0xCF, 0x80, 0x15, 0x59, 0x00, 0x35, 0x51, 0x00, 0x35, 0x73, 0x00, 0x57, 0xCA, 0x00, 0x15, 0x4A, 0x00, 0x15, 0x4E, 0x00, 0x15, 0x44, 0x00, 0x17, 0xC4, 0x00, 0x11, 0x0E, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x1B, 0x00, 0x11, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6554, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x3E, 0x32, 0x00, 0x12, 0x22, 0x00, 0x12, 0x66, 0x00, 0x12, 0x14, 0x00, 0x7F, 0x94, 0x00, 0x00, 0x1C, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x1C, 0x00, 0x21, 0x14, 0x00, 0x21, 0x36, 0x00, 0x21, 0x23, 0x00, 0x3F, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6555, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x32, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xE6, 0x00, 0x24, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x04, 0x1C, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x15, 0x14, 0x00, 0x34, 0xB6, 0x00, 0x64, 0x23, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6556, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xA2, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x14, 0x00, 0x0F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x11, 0x22, 0x00, 0x21, 0x41, 0x00, 0x26, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6557, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x3F, 0x80, 0x22, 0x22, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0xA4, 0x00, 0x3F, 0x24, 0x00, 0x22, 0x18, 0x00, 0x22, 0x08, 0x00, 0x22, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x00, 0x22, 0x00, 0x12, 0x41, 0x00, 0x22, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6558, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x1B, 0x10, 0x00, 0x31, 0x9F, 0x80, 0x60, 0x32, 0x00, 0x1F, 0x22, 0x00, 0x04, 0x66, 0x00, 0x04, 0x14, 0x00, 0x7F, 0x94, 0x00, 0x04, 0x1C, 0x00, 0x15, 0x08, 0x00, 0x15, 0x9C, 0x00, 0x34, 0xD4, 0x00, 0x64, 0x36, 0x00, 0x04, 0x63, 0x00, 0x1C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6559, { 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, 0x04, 0x50, 0x00, 0x3F, 0x90, 0x00, 0x04, 0xBF, 0x80, 0x05, 0x22, 0x00, 0x7F, 0xA2, 0x00, 0x02, 0x52, 0x00, 0x3F, 0x16, 0x00, 0x09, 0x14, 0x00, 0x12, 0x1C, 0x00, 0x64, 0x08, 0x00, 0x07, 0x9C, 0x00, 0x7C, 0x14, 0x00, 0x04, 0x36, 0x00, 0x04, 0x63, 0x00, 0x1C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x655B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x09, 0x92, 0x00, 0x10, 0xBF, 0x00, 0x20, 0x42, 0x00, 0x5F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x08, 0xA4, 0x00, 0x24, 0x94, 0x00, 0x15, 0x14, 0x00, 0x15, 0x08, 0x00, 0x15, 0x14, 0x00, 0x03, 0x94, 0x00, 0x3C, 0x23, 0x00, 0x10, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x655D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x64, 0xC8, 0x00, 0x44, 0x4F, 0x80, 0x04, 0x19, 0x00, 0x7F, 0xD1, 0x00, 0x44, 0x73, 0x00, 0x44, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x4E, 0x00, 0x75, 0xC4, 0x00, 0x64, 0xCE, 0x00, 0x44, 0x4A, 0x00, 0x44, 0x4B, 0x00, 0x44, 0x59, 0x00, 0x40, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x655E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x15, 0x08, 0x00, 0x24, 0x90, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xD2, 0x00, 0x20, 0x92, 0x00, 0x2E, 0x8C, 0x00, 0x2A, 0x88, 0x00, 0x2E, 0x8C, 0x00, 0x2A, 0x94, 0x00, 0x20, 0x92, 0x00, 0x20, 0xA1, 0x00, 0x21, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x655F, { 0x00, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x2A, 0xB2, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xE6, 0x00, 0x3F, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x9C, 0x00, 0x2A, 0x88, 0x00, 0x7F, 0xDC, 0x00, 0x00, 0x14, 0x00, 0x12, 0x36, 0x00, 0x33, 0x23, 0x00, 0x21, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6560, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC4, 0x00, 0x08, 0x47, 0x80, 0x6B, 0x44, 0x00, 0x10, 0x84, 0x00, 0x29, 0x7F, 0x00, 0x42, 0x11, 0x00, 0x00, 0x11, 0x00, 0x7B, 0xDB, 0x00, 0x08, 0x4A, 0x00, 0x4A, 0x4E, 0x00, 0x31, 0x84, 0x00, 0x10, 0x8E, 0x00, 0x29, 0x4A, 0x00, 0x2A, 0x5B, 0x00, 0x44, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6562, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xDF, 0x80, 0x11, 0x11, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x52, 0x00, 0x11, 0x94, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x14, 0x00, 0x3F, 0x12, 0x00, 0x01, 0x21, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6563, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x09, 0x1F, 0x80, 0x09, 0x11, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x32, 0x00, 0x1F, 0xD2, 0x00, 0x10, 0x8A, 0x00, 0x1F, 0x8C, 0x00, 0x10, 0x84, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x8A, 0x00, 0x10, 0x91, 0x00, 0x11, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6566, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x52, 0x00, 0x00, 0x94, 0x00, 0x1F, 0x14, 0x00, 0x02, 0x08, 0x00, 0x07, 0xC8, 0x00, 0x3C, 0x14, 0x00, 0x04, 0x12, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6567, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC7, 0x80, 0x0A, 0x04, 0x00, 0x1B, 0x04, 0x00, 0x31, 0xBF, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x01, 0x1B, 0x00, 0x3D, 0x0A, 0x00, 0x25, 0x0E, 0x00, 0x25, 0x04, 0x00, 0x3D, 0x0E, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x1B, 0x00, 0x07, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x656B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x21, 0x1F, 0x80, 0x3F, 0x32, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x66, 0x00, 0x04, 0x14, 0x00, 0x7F, 0x94, 0x00, 0x08, 0x1C, 0x00, 0x0F, 0x08, 0x00, 0x09, 0x1C, 0x00, 0x19, 0x14, 0x00, 0x13, 0x36, 0x00, 0x32, 0x63, 0x00, 0x66, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x656C, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x3F, 0xE8, 0x00, 0x09, 0x0F, 0x80, 0x09, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0F, 0xF1, 0x00, 0x10, 0x4A, 0x00, 0x20, 0x4A, 0x00, 0x1E, 0x46, 0x00, 0x12, 0x44, 0x00, 0x12, 0x4A, 0x00, 0x1E, 0x4A, 0x00, 0x00, 0x91, 0x00, 0x00, 0xA1, 0x00, 0x07, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x656D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x90, 0x00, 0x1F, 0x9F, 0x80, 0x10, 0xA1, 0x00, 0x1F, 0xB1, 0x00, 0x04, 0x51, 0x00, 0x04, 0x92, 0x00, 0x08, 0x0A, 0x00, 0x1F, 0xCA, 0x00, 0x24, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x12, 0x4A, 0x00, 0x24, 0x92, 0x00, 0x08, 0xA1, 0x00, 0x13, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6570, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x90, 0x00, 0x35, 0x90, 0x00, 0x15, 0x3F, 0x80, 0x7F, 0xA2, 0x00, 0x14, 0x62, 0x00, 0x17, 0x12, 0x00, 0x35, 0x96, 0x00, 0x64, 0x94, 0x00, 0x08, 0x1C, 0x00, 0x7F, 0xC8, 0x00, 0x11, 0x08, 0x00, 0x13, 0x1C, 0x00, 0x3E, 0x16, 0x00, 0x0B, 0x33, 0x00, 0x71, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6572, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x0F, 0x80, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xA2, 0x00, 0x20, 0x92, 0x00, 0x2E, 0x94, 0x00, 0x2A, 0x8C, 0x00, 0x2A, 0x8C, 0x00, 0x2E, 0x8A, 0x00, 0x20, 0x91, 0x00, 0x21, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6574, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x02, 0x0F, 0x80, 0x1F, 0xD0, 0x80, 0x12, 0x71, 0x00, 0x1F, 0xCA, 0x00, 0x07, 0x04, 0x00, 0x0A, 0x8A, 0x00, 0x12, 0x51, 0x00, 0x22, 0x60, 0x80, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6575, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x01, 0x10, 0x00, 0x11, 0x1F, 0x80, 0x0A, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0xD2, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x8C, 0x00, 0x24, 0x88, 0x00, 0x2E, 0x8C, 0x00, 0x2A, 0x94, 0x00, 0x2E, 0x92, 0x00, 0x20, 0xA1, 0x00, 0x21, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6577, { 0x00, 0x00, 0x00, 0x05, 0x08, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xD0, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x3F, 0xD1, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x8C, 0x00, 0x08, 0x94, 0x00, 0x08, 0x92, 0x00, 0x11, 0x21, 0x00, 0x26, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6578, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x3F, 0xEF, 0x80, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x11, 0x00, 0x1F, 0xDA, 0x00, 0x12, 0x6A, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xC6, 0x00, 0x11, 0x0A, 0x00, 0x2A, 0x09, 0x00, 0x07, 0x11, 0x00, 0x38, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x657A, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x40, 0x07, 0x80, 0x4F, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0x3F, 0x00, 0x4F, 0x11, 0x00, 0x40, 0x11, 0x00, 0x5D, 0xDB, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x44, 0x00, 0x5D, 0xCE, 0x00, 0x40, 0x0A, 0x00, 0x7F, 0xDB, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x657D, { 0x00, 0x00, 0x00, 0x03, 0x84, 0x00, 0x3E, 0x04, 0x00, 0x04, 0x07, 0x80, 0x7F, 0xC4, 0x00, 0x09, 0x04, 0x00, 0x1F, 0xBF, 0x00, 0x69, 0x51, 0x00, 0x0F, 0x11, 0x00, 0x00, 0x1B, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x8E, 0x00, 0x2E, 0x84, 0x00, 0x2A, 0x8E, 0x00, 0x2E, 0x8A, 0x00, 0x20, 0x9B, 0x00, 0x21, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x657E, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xE8, 0x00, 0x02, 0x1F, 0x80, 0x1F, 0xD1, 0x00, 0x02, 0x31, 0x00, 0x3F, 0xD1, 0x00, 0x12, 0x51, 0x00, 0x0A, 0x8A, 0x00, 0x3F, 0xEA, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4A, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6581, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x8F, 0x80, 0x3F, 0x99, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xB3, 0x00, 0x04, 0x0A, 0x00, 0x7F, 0xCA, 0x00, 0x11, 0x0E, 0x00, 0x0A, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x0E, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x1B, 0x00, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6582, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x08, 0x00, 0x20, 0x9F, 0x80, 0x1F, 0x11, 0x00, 0x00, 0x21, 0x00, 0x3B, 0xA1, 0x00, 0x2A, 0xD2, 0x00, 0x2A, 0x92, 0x00, 0x3B, 0x8A, 0x00, 0x00, 0x0C, 0x00, 0x11, 0x04, 0x00, 0x11, 0x0A, 0x00, 0x2A, 0x8A, 0x00, 0x24, 0x91, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6583, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x24, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xD1, 0x00, 0x2E, 0xAA, 0x00, 0x35, 0xC4, 0x00, 0x24, 0x8A, 0x00, 0x25, 0x91, 0x80, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x50, 0x00, 0x07, 0xD3, 0x80, 0x0C, 0x9C, 0x00, 0x33, 0x10, 0x00, 0x06, 0x10, 0x80, 0x38, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6585, { 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x1A, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1D, 0xC7, 0x80, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x31, 0x00, 0x0F, 0x8A, 0x00, 0x01, 0x0A, 0x00, 0x03, 0xE4, 0x00, 0x3E, 0x04, 0x00, 0x02, 0x0A, 0x00, 0x02, 0x11, 0x00, 0x06, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6587, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6588, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6589, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x30, 0x04, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x658A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x0F, 0x80, 0x7F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x658B, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x38, 0x00, 0x70, 0x07, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x658C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x69, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x02, 0xFF, 0x80, 0x22, 0x28, 0x00, 0x12, 0x28, 0x00, 0x0C, 0xA8, 0x00, 0x04, 0xB8, 0x00, 0x06, 0xA8, 0x00, 0x0A, 0xA4, 0x00, 0x0A, 0xA4, 0x00, 0x10, 0xBA, 0x80, 0x13, 0xC1, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x658E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x70, 0x00, 0x0E, 0x1C, 0x00, 0x7B, 0xE7, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xF4, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xA4, 0x00, 0x1C, 0x94, 0x00, 0x11, 0x84, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6590, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x07, 0x9F, 0x80, 0x39, 0x10, 0x00, 0x02, 0x50, 0x00, 0x0C, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6591, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x4F, 0x80, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3E, 0xAF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0E, 0xA2, 0x00, 0x38, 0xA3, 0x80, 0x01, 0x2E, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6592, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x80, 0x08, 0x7E, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x02, 0x41, 0x00, 0x66, 0x7F, 0x00, 0x34, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x08, 0x54, 0x80, 0x1C, 0x54, 0x80, 0x36, 0xFF, 0x80, 0x60, 0xD4, 0x80, 0x41, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6593, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x21, 0x7F, 0x00, 0x10, 0x22, 0x00, 0x02, 0x2A, 0x00, 0x7F, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x2A, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xFA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xFA, 0x00, 0x26, 0x72, 0x00, 0x46, 0xAA, 0x00, 0x03, 0x26, 0x00, 0x02, 0x2A, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6595, { 0x00, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x7E, 0x28, 0x80, 0x0B, 0xEF, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0xFE, 0x80, 0x3A, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x1A, 0xD6, 0x80, 0x2A, 0xBA, 0x80, 0x22, 0x92, 0x80, 0x22, 0xFE, 0x80, 0x42, 0x54, 0x80, 0x02, 0x92, 0x80, 0x02, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6597, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6598, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0x32, 0x00, 0x1F, 0x1A, 0x00, 0x11, 0x0A, 0x00, 0x31, 0x02, 0x00, 0x21, 0x62, 0x00, 0x71, 0x32, 0x00, 0x5B, 0x12, 0x00, 0x0A, 0x02, 0x00, 0x0E, 0x03, 0x80, 0x04, 0x1E, 0x00, 0x0C, 0x72, 0x00, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x30, 0x02, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6599, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x29, 0x24, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x05, 0x80, 0x1A, 0x1E, 0x00, 0x28, 0xE4, 0x00, 0x28, 0x04, 0x00, 0x28, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x659B, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x11, 0x14, 0x00, 0x22, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x64, 0x00, 0x12, 0x54, 0x00, 0x1F, 0xC5, 0x80, 0x12, 0x46, 0x00, 0x12, 0x5C, 0x00, 0x1F, 0xE4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x20, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x659C, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x12, 0x00, 0x20, 0x8A, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x22, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x03, 0x80, 0x15, 0x0E, 0x00, 0x15, 0x32, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x04, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x659D, { 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0x11, 0x00, 0x01, 0x90, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x06, 0x10, 0x00, 0x00, 0x1F, 0x80, 0x03, 0xF0, 0x00, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x659F, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x92, 0x00, 0x3F, 0xEA, 0x00, 0x08, 0x82, 0x00, 0x0F, 0x82, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x82, 0x00, 0x3F, 0xE3, 0x80, 0x15, 0x1E, 0x00, 0x15, 0x02, 0x00, 0x1C, 0xE2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xE2, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A0, { 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x12, 0x00, 0x7F, 0xDA, 0x00, 0x0A, 0x0A, 0x00, 0x3F, 0x82, 0x00, 0x0A, 0x12, 0x00, 0x7F, 0xDA, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x83, 0x80, 0x7F, 0xCE, 0x00, 0x24, 0xBA, 0x00, 0x7F, 0xC2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x21, 0x00, 0x04, 0x40, 0x80, 0x1F, 0x82, 0x00, 0x11, 0x12, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x13, 0x80, 0x15, 0x0E, 0x00, 0x04, 0x72, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A3, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xE9, 0x00, 0x49, 0x2D, 0x00, 0x49, 0x25, 0x00, 0x7F, 0xE1, 0x00, 0x10, 0x09, 0x00, 0x3F, 0xED, 0x00, 0x64, 0x25, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0xA1, 0x80, 0x3F, 0xA7, 0x00, 0x04, 0x3D, 0x00, 0x05, 0x21, 0x00, 0x0F, 0x61, 0x00, 0x39, 0x41, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A4, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A5, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x14, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A6, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x07, 0x07, 0x00, 0x1C, 0x3C, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xBF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x32, 0x62, 0x00, 0x22, 0x42, 0x00, 0x62, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A7, { 0x00, 0x00, 0x00, 0x03, 0x18, 0x00, 0x0C, 0x06, 0x00, 0x34, 0x09, 0x80, 0x03, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x1F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65A9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x0A, 0x70, 0x00, 0x7F, 0x40, 0x00, 0x10, 0x40, 0x00, 0x14, 0x42, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x48, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x07, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x24, 0x88, 0x00, 0x04, 0x88, 0x00, 0x05, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65AB, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3F, 0xB8, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3F, 0x80, 0x1F, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x42, 0x00, 0x0F, 0x42, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65AC, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x04, 0x38, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65AD, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x44, 0x0E, 0x00, 0x55, 0x78, 0x00, 0x55, 0x40, 0x00, 0x55, 0x40, 0x00, 0x44, 0x40, 0x00, 0x5F, 0x7F, 0x00, 0x44, 0x44, 0x00, 0x4E, 0x44, 0x00, 0x4D, 0x44, 0x00, 0x55, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x40, 0x44, 0x00, 0x7F, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65AE, { 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x09, 0x07, 0x00, 0x3F, 0xDC, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x1F, 0x80, 0x7F, 0xF2, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1F, 0xB2, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xE2, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65AF, { 0x00, 0x00, 0x00, 0x08, 0x83, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x90, 0x00, 0x3F, 0xF0, 0x00, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x80, 0x0F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xF1, 0x00, 0x00, 0x11, 0x00, 0x08, 0xA1, 0x00, 0x10, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65B0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x07, 0x00, 0x3F, 0xB8, 0x00, 0x11, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x0C, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x15, 0x22, 0x00, 0x24, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65B2, { 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x73, 0xC7, 0x00, 0x4A, 0x5C, 0x00, 0x4A, 0x50, 0x00, 0x7B, 0xD0, 0x00, 0x0A, 0x1F, 0x80, 0x0A, 0x12, 0x00, 0x7B, 0xD2, 0x00, 0x40, 0x52, 0x00, 0x40, 0x52, 0x00, 0x7B, 0xD2, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x0B, 0xD2, 0x00, 0x1E, 0x22, 0x00, 0x70, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65B3, { 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x7F, 0xDC, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x32, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x62, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65B4, { 0x00, 0x00, 0x00, 0x24, 0x81, 0x00, 0x15, 0x07, 0x00, 0x04, 0x1C, 0x00, 0x7F, 0xD0, 0x00, 0x15, 0x10, 0x00, 0x35, 0x9F, 0x80, 0x64, 0xD2, 0x00, 0x24, 0x12, 0x00, 0x38, 0x92, 0x00, 0x6B, 0xD2, 0x00, 0x4A, 0x92, 0x00, 0x3A, 0x92, 0x00, 0x1F, 0xD2, 0x00, 0x30, 0x92, 0x00, 0x60, 0xA2, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65B7, { 0x00, 0x00, 0x00, 0x24, 0x03, 0x00, 0x25, 0x3C, 0x00, 0x29, 0x60, 0x00, 0x32, 0xA0, 0x00, 0x2D, 0x60, 0x00, 0x25, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x2B, 0x62, 0x00, 0x35, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x3F, 0xE2, 0x00, 0x22, 0x62, 0x00, 0x3F, 0xE2, 0x00, 0x20, 0x22, 0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65B9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x10, 0x04, 0x00, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65BC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x3F, 0x94, 0x00, 0x08, 0x12, 0x00, 0x08, 0x22, 0x00, 0x08, 0x21, 0x00, 0x0F, 0xC0, 0x80, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x10, 0x82, 0x00, 0x10, 0x80, 0x00, 0x10, 0x90, 0x00, 0x11, 0x08, 0x00, 0x21, 0x04, 0x00, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65BD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x09, 0x24, 0x00, 0x08, 0x25, 0x80, 0x1E, 0x3E, 0x80, 0x12, 0xE4, 0x80, 0x12, 0x24, 0x80, 0x12, 0x24, 0x80, 0x12, 0x25, 0x80, 0x12, 0x20, 0x00, 0x12, 0x20, 0x80, 0x22, 0x3F, 0x80, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65BF, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x3F, 0x00, 0x0F, 0x01, 0x00, 0x09, 0x02, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x19, 0x7F, 0x80, 0x13, 0x04, 0x00, 0x12, 0x04, 0x00, 0x32, 0x04, 0x00, 0x6E, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65C1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x04, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65C2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0x40, 0x00, 0x10, 0xC7, 0x00, 0x1E, 0x3C, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x3F, 0x80, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x64, 0x00, 0x32, 0x44, 0x00, 0x22, 0xC4, 0x00, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65C3, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x11, 0x80, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x41, 0x00, 0x32, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x6E, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65C4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0xC0, 0x00, 0x10, 0x06, 0x00, 0x1E, 0x7C, 0x00, 0x12, 0x10, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x22, 0x10, 0x80, 0x22, 0x19, 0x80, 0x6E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65C5, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0x07, 0x00, 0x08, 0x78, 0x00, 0x0F, 0x49, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4C, 0x00, 0x11, 0x48, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x7A, 0x00, 0x21, 0xC1, 0x00, 0x26, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65C6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0xC8, 0x00, 0x10, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x22, 0x08, 0x00, 0x6E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65C8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x20, 0x00, 0x10, 0x21, 0x00, 0x10, 0x4F, 0x80, 0x1E, 0xF8, 0x80, 0x12, 0x00, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x32, 0x6A, 0x80, 0x22, 0x4A, 0x80, 0x66, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65C9, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65CB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x08, 0x7F, 0x80, 0x0F, 0x09, 0x00, 0x09, 0x08, 0x00, 0x09, 0x28, 0x00, 0x11, 0x2F, 0x80, 0x11, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x5F, 0x80, 0x26, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65CC, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x08, 0x80, 0x00, 0x09, 0x08, 0x00, 0x08, 0x28, 0x00, 0x0E, 0x28, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x88, 0x00, 0x13, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65CE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x11, 0x80, 0x00, 0x11, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x50, 0x00, 0x12, 0x53, 0x00, 0x12, 0x5E, 0x00, 0x12, 0x50, 0x00, 0x32, 0xD0, 0x80, 0x22, 0x99, 0x80, 0x66, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65CF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x08, 0x90, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x7F, 0x00, 0x09, 0x88, 0x00, 0x09, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x12, 0x14, 0x00, 0x22, 0x22, 0x00, 0x2C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65D0, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x11, 0x80, 0x00, 0x10, 0x24, 0x00, 0x1C, 0x24, 0x80, 0x15, 0xA5, 0x80, 0x14, 0xA5, 0x00, 0x14, 0x24, 0x00, 0x14, 0xE7, 0x00, 0x17, 0xA5, 0x80, 0x14, 0x24, 0x00, 0x34, 0x64, 0x80, 0x24, 0xC4, 0x80, 0x6D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65D2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x88, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x12, 0x00, 0x0F, 0x27, 0x00, 0x09, 0xF8, 0x80, 0x09, 0x08, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x80, 0x26, 0x8B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65D4, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xDF, 0x00, 0x08, 0x45, 0x00, 0x7E, 0x85, 0x00, 0x10, 0xBF, 0x80, 0x11, 0x05, 0x00, 0x1D, 0xC5, 0x00, 0x14, 0x5F, 0x00, 0x14, 0x44, 0x00, 0x15, 0x5F, 0x00, 0x15, 0x44, 0x00, 0x14, 0xBF, 0x80, 0x34, 0x84, 0x00, 0x24, 0x84, 0x00, 0x25, 0xC0, 0x00, 0x6D, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65D6, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x11, 0x88, 0x00, 0x10, 0x7F, 0x80, 0x1E, 0x12, 0x00, 0x12, 0x61, 0x80, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x01, 0x00, 0x12, 0x3D, 0x00, 0x12, 0x25, 0x00, 0x32, 0x3D, 0x00, 0x22, 0x01, 0x00, 0x6E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65D7, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x10, 0xA2, 0x00, 0x10, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x22, 0x22, 0x00, 0x2C, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65D8, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x45, 0x00, 0x09, 0xF5, 0x80, 0x7E, 0x04, 0x80, 0x11, 0x14, 0x00, 0x10, 0xA4, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x04, 0x00, 0x12, 0xF5, 0x00, 0x12, 0x95, 0x00, 0x12, 0x97, 0x00, 0x12, 0xF2, 0x00, 0x12, 0x92, 0x00, 0x32, 0x92, 0x80, 0x22, 0xF7, 0x80, 0x6E, 0x0D, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65D9, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7F, 0x49, 0x00, 0x10, 0x2A, 0x00, 0x10, 0xFF, 0x80, 0x1E, 0x2A, 0x00, 0x12, 0x6B, 0x00, 0x12, 0xC9, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x32, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x6E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65DB, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x10, 0x07, 0x00, 0x10, 0xFC, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x2A, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x6E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65DF, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x10, 0x60, 0x00, 0x11, 0xD3, 0x00, 0x1D, 0x1D, 0x00, 0x15, 0xD3, 0x00, 0x15, 0x19, 0x00, 0x15, 0x09, 0x00, 0x15, 0xAB, 0x00, 0x15, 0x29, 0x00, 0x15, 0x29, 0x00, 0x37, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x6D, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x20, 0x80, 0x02, 0x20, 0x80, 0x0C, 0x3F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0xA0, 0x00, 0x03, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x24, 0x00, 0x21, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x24, 0x00, 0x21, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x04, 0x00, 0x20, 0x0C, 0x00, 0x22, 0x0C, 0x00, 0x22, 0x1C, 0x00, 0x2F, 0x14, 0x00, 0x39, 0x34, 0x80, 0x60, 0x64, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65E3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x0C, 0x00, 0x20, 0x0C, 0x00, 0x20, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x20, 0x24, 0x80, 0x3E, 0x44, 0x80, 0x20, 0x87, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3E, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65EC, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x10, 0x00, 0x80, 0x23, 0xF8, 0x80, 0x02, 0x08, 0x80, 0x03, 0xF8, 0x80, 0x02, 0x08, 0x80, 0x03, 0xF8, 0x80, 0x02, 0x08, 0x80, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65ED, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x1F, 0x22, 0x00, 0x05, 0x22, 0x00, 0x05, 0x22, 0x00, 0x05, 0x3E, 0x00, 0x05, 0x22, 0x00, 0x05, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x22, 0x00, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65EE, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xF8, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x11, 0x00, 0x08, 0x11, 0x00, 0x10, 0x0F, 0x00, 0x6F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65EF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xF8, 0x00, 0x02, 0x10, 0x00, 0x02, 0x11, 0x00, 0x04, 0x11, 0x00, 0x08, 0x0F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F6, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x22, 0x04, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x24, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x00, 0x00, 0x25, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x25, 0x00, 0x00, 0x25, 0x00, 0x00, 0x25, 0x00, 0x00, 0x25, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65F9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65FA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x00, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x08, 0x00, 0x09, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x1C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65FC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x18, 0x00, 0x24, 0x24, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x65FD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x1F, 0x00, 0x25, 0xF0, 0x00, 0x24, 0x10, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x80, 0x20, 0x10, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65FE, { 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x80, 0x00, 0x81, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x65FF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x80, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x26, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6600, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x22, 0xC1, 0x00, 0x22, 0x81, 0x00, 0x23, 0x81, 0x00, 0x3E, 0x79, 0x00, 0x22, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0xFD, 0x00, 0x22, 0x01, 0x00, 0x3E, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6602, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6603, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x70, 0x00, 0x30, 0xD8, 0x00, 0x21, 0x8C, 0x00, 0x63, 0x06, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6604, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0xFE, 0x00, 0x44, 0xA2, 0x00, 0x7C, 0xA2, 0x00, 0x44, 0xB6, 0x00, 0x44, 0x94, 0x00, 0x44, 0x9C, 0x00, 0x44, 0x88, 0x00, 0x7D, 0x9C, 0x00, 0x01, 0x14, 0x00, 0x03, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6606, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x21, 0x80, 0x0F, 0xA6, 0x00, 0x08, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x0F, 0xA0, 0x80, 0x38, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6607, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x01, 0xE8, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6608, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x7C, 0xF8, 0x00, 0x44, 0x80, 0x00, 0x44, 0xFF, 0x80, 0x44, 0x80, 0x80, 0x44, 0x80, 0x80, 0x7C, 0x80, 0x80, 0x44, 0xFF, 0x80, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6609, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x81, 0x00, 0x20, 0x81, 0x00, 0x01, 0x01, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x660A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x660C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x660D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x660E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x21, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x81, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x660F, { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x04, 0x08, 0x80, 0x07, 0xF4, 0x80, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6610, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x3C, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x82, 0x00, 0x25, 0x01, 0x00, 0x24, 0x00, 0x80, 0x3F, 0xFE, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x21, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6611, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x25, 0x7D, 0x00, 0x3E, 0x00, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x24, 0x04, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6612, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x44, 0xFF, 0x80, 0x44, 0xA4, 0x80, 0x45, 0xA4, 0x80, 0x45, 0x24, 0x80, 0x7C, 0x24, 0x80, 0x44, 0x6C, 0x80, 0x44, 0x48, 0x80, 0x44, 0xC8, 0x80, 0x45, 0x98, 0x80, 0x7C, 0x10, 0x80, 0x00, 0x31, 0x80, 0x00, 0x61, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6613, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x45, 0x00, 0x30, 0x89, 0x00, 0x01, 0x11, 0x00, 0x06, 0x21, 0x00, 0x18, 0xC2, 0x00, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6614, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6615, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x3C, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x80, 0x3C, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3C, 0x84, 0x00, 0x24, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6616, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x7C, 0x46, 0x00, 0x44, 0x42, 0x00, 0x44, 0xC3, 0x00, 0x44, 0x81, 0x00, 0x45, 0xA1, 0x80, 0x7C, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x62, 0x00, 0x44, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x79, 0x00, 0x01, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6619, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x661C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x73, 0x31, 0x00, 0x06, 0x23, 0x00, 0x1C, 0x62, 0x00, 0x01, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x661D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x31, 0x1C, 0x00, 0x63, 0x16, 0x00, 0x16, 0x33, 0x00, 0x0C, 0x61, 0x80, 0x1B, 0x00, 0x00, 0x31, 0xE0, 0x00, 0x60, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x661E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x29, 0x00, 0x25, 0x45, 0x00, 0x25, 0x85, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x3D, 0x01, 0x00, 0x25, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x661F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6620, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x24, 0x48, 0x00, 0x3E, 0x44, 0x00, 0x20, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6621, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x20, 0x00, 0x44, 0x60, 0x00, 0x44, 0x44, 0x00, 0x7C, 0xC4, 0x00, 0x45, 0x8C, 0x00, 0x44, 0xF8, 0x00, 0x44, 0x10, 0x00, 0x44, 0x32, 0x00, 0x7C, 0x63, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x80, 0x03, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6622, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6623, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x45, 0x83, 0x00, 0x47, 0x11, 0x80, 0x44, 0x30, 0x00, 0x7C, 0x62, 0x00, 0x45, 0xC6, 0x00, 0x44, 0x0C, 0x00, 0x44, 0x38, 0x80, 0x45, 0xE1, 0x80, 0x7C, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6624, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x45, 0x83, 0x00, 0x47, 0x7D, 0x80, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x21, 0x00, 0x44, 0x21, 0x00, 0x44, 0x21, 0x00, 0x7C, 0x21, 0x00, 0x00, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6625, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6626, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x72, 0x13, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6627, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x38, 0x00, 0x24, 0x38, 0x00, 0x3C, 0x54, 0x00, 0x24, 0x94, 0x00, 0x00, 0x92, 0x00, 0x01, 0x12, 0x00, 0x02, 0x11, 0x00, 0x04, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6628, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x24, 0xA0, 0x00, 0x25, 0x20, 0x00, 0x26, 0x20, 0x00, 0x3C, 0x3F, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6629, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x54, 0x00, 0x44, 0x54, 0x00, 0x44, 0x54, 0x00, 0x44, 0xD6, 0x00, 0x7C, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x662A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0x00, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x7C, 0x00, 0x3F, 0xC7, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x662B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x44, 0xFF, 0x80, 0x44, 0x80, 0x80, 0x45, 0x80, 0x80, 0x44, 0x7C, 0x80, 0x7C, 0x44, 0x80, 0x44, 0x44, 0x80, 0x44, 0x44, 0x80, 0x44, 0x44, 0x80, 0x44, 0x7C, 0x80, 0x7C, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x662C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x31, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x662D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x11, 0x00, 0x24, 0x11, 0x00, 0x24, 0x21, 0x00, 0x24, 0x21, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x8C, 0x00, 0x27, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x24, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x662E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x0E, 0x61, 0x00, 0x38, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x662F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x09, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6630, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6631, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6633, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x7C, 0x90, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x10, 0x00, 0x45, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x28, 0x00, 0x44, 0x28, 0x00, 0x44, 0x6C, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6634, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x18, 0x3F, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x17, 0xA1, 0x00, 0x38, 0xA1, 0x00, 0x01, 0x27, 0x00, 0x06, 0x20, 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6635, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x00, 0x00, 0x79, 0x20, 0x00, 0x49, 0x21, 0x00, 0x49, 0x27, 0x00, 0x49, 0x3C, 0x00, 0x49, 0x20, 0x00, 0x7B, 0x20, 0x00, 0x02, 0x20, 0x80, 0x06, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6636, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xCF, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x01, 0x2F, 0x00, 0x01, 0x49, 0x00, 0x1F, 0x89, 0x00, 0x03, 0x89, 0x00, 0x05, 0x4F, 0x00, 0x05, 0x49, 0x00, 0x09, 0x20, 0x00, 0x09, 0x10, 0x00, 0x11, 0x08, 0x00, 0x11, 0x06, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6637, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6639, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x08, 0x00, 0x44, 0x00, 0x00, 0x44, 0xF0, 0x00, 0x44, 0x10, 0x00, 0x44, 0x11, 0x00, 0x7D, 0xDB, 0x00, 0x44, 0x5E, 0x00, 0x44, 0x54, 0x00, 0x44, 0x54, 0x00, 0x44, 0xD6, 0x00, 0x7C, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x663A, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x11, 0x00, 0x12, 0x0D, 0x00, 0x1C, 0x07, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x663B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x07, 0xA1, 0x00, 0x38, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x663C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x18, 0x04, 0x00, 0x17, 0xFE, 0x00, 0x34, 0x0B, 0x00, 0x67, 0xF9, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x663E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x0A, 0x28, 0x00, 0x22, 0x22, 0x00, 0x1A, 0x26, 0x00, 0x0A, 0x28, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x663F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x10, 0x00, 0x79, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0x30, 0x00, 0x49, 0x20, 0x00, 0x49, 0x22, 0x00, 0x79, 0x63, 0x00, 0x03, 0x41, 0x00, 0x02, 0x4F, 0x80, 0x06, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6640, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x7A, 0x49, 0x00, 0x4B, 0x4B, 0x00, 0x49, 0x4E, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x78, 0x48, 0x00, 0x48, 0x4E, 0x00, 0x49, 0xCB, 0x00, 0x4B, 0x49, 0x00, 0x48, 0x48, 0x00, 0x78, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6641, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x09, 0x12, 0x00, 0x05, 0x14, 0x00, 0x01, 0x18, 0x00, 0x07, 0x14, 0x00, 0x39, 0x13, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6642, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x04, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x04, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6643, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6644, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x54, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x84, 0x80, 0x00, 0x84, 0x80, 0x01, 0x07, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6645, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6646, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6649, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0xA1, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x664A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x62, 0x00, 0x44, 0x4E, 0x00, 0x45, 0xFB, 0x00, 0x7C, 0x00, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x664B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x05, 0x14, 0x00, 0x05, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x664C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x7C, 0x20, 0x00, 0x45, 0xFF, 0x80, 0x45, 0x00, 0x80, 0x45, 0x00, 0x80, 0x45, 0x3C, 0x80, 0x7D, 0x24, 0x80, 0x45, 0x24, 0x80, 0x45, 0x24, 0x80, 0x45, 0x24, 0x80, 0x45, 0x3C, 0x80, 0x7D, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x664E, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x44, 0x44, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x664F, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x10, 0x00, 0x09, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x38, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6651, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6652, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x28, 0x00, 0x48, 0x28, 0x00, 0x48, 0x28, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x29, 0x00, 0x79, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x29, 0x00, 0x49, 0x4F, 0x00, 0x49, 0x81, 0x00, 0x79, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6653, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x3E, 0x7E, 0x00, 0x27, 0xC0, 0x00, 0x24, 0x28, 0x00, 0x24, 0x11, 0x00, 0x3C, 0x69, 0x00, 0x25, 0x87, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x50, 0x00, 0x3C, 0x50, 0x00, 0x24, 0x91, 0x00, 0x00, 0x91, 0x00, 0x01, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6654, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x04, 0x52, 0x00, 0x3E, 0x96, 0x00, 0x24, 0x98, 0x00, 0x25, 0x90, 0x00, 0x26, 0xB1, 0x00, 0x24, 0xD1, 0x00, 0x3C, 0x8F, 0x00, 0x24, 0xA0, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6655, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x4F, 0xFA, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6656, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3D, 0x01, 0x00, 0x25, 0x22, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x40, 0x00, 0x3C, 0x94, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6657, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x28, 0x00, 0x44, 0x6C, 0x00, 0x44, 0xC6, 0x00, 0x47, 0xBB, 0x80, 0x44, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x04, 0x00, 0x44, 0x08, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6658, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6659, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x22, 0x00, 0x3C, 0x4F, 0x00, 0x25, 0xF4, 0x80, 0x24, 0x24, 0x00, 0x24, 0x24, 0x80, 0x3C, 0x47, 0x80, 0x27, 0xA0, 0x00, 0x24, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x3C, 0xA2, 0x00, 0x25, 0x14, 0x00, 0x06, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x66, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x665A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3E, 0xFC, 0x00, 0x25, 0x08, 0x00, 0x26, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x22, 0x00, 0x3D, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x32, 0x00, 0x24, 0x50, 0x00, 0x3C, 0x51, 0x00, 0x24, 0x91, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x665B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x80, 0x00, 0x88, 0x80, 0x01, 0x0F, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x665C, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x80, 0x80, 0x06, 0x80, 0x80, 0x1C, 0x81, 0x80, 0x70, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x665D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x665E, { 0x00, 0x00, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x34, 0x00, 0x3C, 0x1C, 0x00, 0x24, 0x62, 0x00, 0x25, 0xA1, 0x00, 0x24, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x90, 0x00, 0x25, 0x90, 0x00, 0x26, 0xFF, 0x00, 0x3C, 0x91, 0x00, 0x24, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0x93, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x665F, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x12, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x08, 0x00, 0x11, 0x18, 0x00, 0x16, 0x24, 0x80, 0x20, 0xC2, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6660, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0B, 0x00, 0x7C, 0x09, 0x00, 0x45, 0xFF, 0x80, 0x45, 0x08, 0x00, 0x45, 0x08, 0x00, 0x45, 0xF9, 0x00, 0x7D, 0x29, 0x00, 0x45, 0x2B, 0x00, 0x45, 0x2E, 0x00, 0x45, 0x26, 0x00, 0x45, 0x24, 0x00, 0x7D, 0x2E, 0x00, 0x03, 0x6A, 0x80, 0x02, 0x1B, 0x80, 0x06, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6661, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x11, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6662, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x0E, 0x44, 0x00, 0x78, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x19, 0x84, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6664, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x22, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6665, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x00, 0x44, 0x00, 0x00, 0x84, 0x80, 0x01, 0x07, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6666, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x25, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x24, 0x51, 0x00, 0x3C, 0x49, 0x00, 0x24, 0x41, 0x00, 0x25, 0xFF, 0x80, 0x24, 0xA2, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6667, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x3C, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x25, 0x10, 0x00, 0x26, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6668, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x11, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x22, 0xF2, 0x00, 0x2F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6669, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x84, 0x00, 0x25, 0x08, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x3C, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x00, 0x44, 0x00, 0x01, 0x84, 0x80, 0x06, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x666A, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x49, 0x00, 0x45, 0x49, 0x00, 0x45, 0x49, 0x00, 0x7D, 0xFF, 0x00, 0x45, 0x49, 0x00, 0x45, 0x49, 0x00, 0x45, 0x49, 0x00, 0x47, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x666B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x1F, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x666C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x45, 0xC6, 0x00, 0x7D, 0x6D, 0x00, 0x46, 0x00, 0x80, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x666E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x09, 0x12, 0x00, 0x05, 0x14, 0x00, 0x05, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x666F, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x21, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6670, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x79, 0x1C, 0x00, 0x4F, 0xD0, 0x00, 0x49, 0x10, 0x00, 0x49, 0x1F, 0x80, 0x49, 0x92, 0x00, 0x7B, 0x52, 0x00, 0x4B, 0x52, 0x00, 0x4D, 0x12, 0x00, 0x49, 0x12, 0x00, 0x49, 0x12, 0x00, 0x79, 0x32, 0x00, 0x01, 0x22, 0x00, 0x01, 0x62, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6673, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x04, 0x38, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x00, 0x0E, 0x3F, 0x80, 0x15, 0x22, 0x00, 0x14, 0x22, 0x00, 0x24, 0x42, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6674, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6675, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x3E, 0x10, 0x00, 0x20, 0x3F, 0x80, 0x3F, 0x22, 0x00, 0x21, 0x66, 0x00, 0x21, 0x14, 0x00, 0x3F, 0x1C, 0x00, 0x20, 0x36, 0x00, 0x20, 0x63, 0x00, 0x60, 0x01, 0x80, 0x4F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6676, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6677, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x07, 0xE4, 0x00, 0x0C, 0x24, 0x00, 0x34, 0x47, 0x80, 0x03, 0x84, 0x00, 0x02, 0xC4, 0x00, 0x0C, 0x3F, 0x80, 0x30, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6678, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x21, 0x00, 0x17, 0xD2, 0x00, 0x14, 0x8C, 0x00, 0x14, 0x08, 0x00, 0x17, 0x94, 0x00, 0x38, 0x62, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6679, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x40, 0x00, 0x44, 0xFF, 0x80, 0x45, 0x94, 0x80, 0x47, 0x14, 0x80, 0x44, 0x24, 0x80, 0x7C, 0xC8, 0x80, 0x00, 0x10, 0x80, 0x00, 0x61, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x667A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xDF, 0x00, 0x22, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xF1, 0x00, 0x05, 0x11, 0x00, 0x08, 0x9F, 0x00, 0x10, 0x91, 0x00, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x667B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x44, 0x54, 0x00, 0x44, 0x92, 0x00, 0x45, 0xFF, 0x00, 0x7E, 0x92, 0x80, 0x44, 0x92, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x92, 0x00, 0x44, 0x92, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x10, 0x80, 0x00, 0x19, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x667C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x45, 0x01, 0x00, 0x45, 0x01, 0x00, 0x44, 0x80, 0x00, 0x44, 0xEF, 0x00, 0x7D, 0xA9, 0x00, 0x45, 0x29, 0x00, 0x47, 0x29, 0x00, 0x44, 0xA9, 0x00, 0x44, 0x6B, 0x00, 0x7C, 0x48, 0x00, 0x00, 0xC8, 0x80, 0x01, 0x8D, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x667E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x44, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x667F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x7C, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x45, 0xFF, 0x80, 0x45, 0x00, 0x80, 0x45, 0x00, 0x80, 0x7D, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6680, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x01, 0x98, 0x00, 0x79, 0x08, 0x00, 0x4A, 0x7F, 0x80, 0x4C, 0x88, 0x00, 0x48, 0x88, 0x00, 0x49, 0x88, 0x00, 0x79, 0x08, 0x00, 0x4B, 0x3F, 0x00, 0x4D, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x79, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x7F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6681, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x92, 0x00, 0x48, 0x82, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x82, 0x00, 0x48, 0x82, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x78, 0x44, 0x00, 0x00, 0xC4, 0x80, 0x01, 0x84, 0x80, 0x07, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6682, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x3F, 0x78, 0x00, 0x08, 0x40, 0x00, 0x14, 0x42, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x48, 0x00, 0x7F, 0x48, 0x00, 0x04, 0x88, 0x00, 0x05, 0x08, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6683, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x1E, 0x1F, 0x80, 0x72, 0x10, 0x00, 0x06, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6684, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x2A, 0x00, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6687, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x10, 0x80, 0x25, 0x10, 0x80, 0x25, 0x10, 0x80, 0x25, 0xF7, 0x80, 0x25, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x08, 0x80, 0x25, 0x09, 0x00, 0x25, 0xE6, 0x00, 0x25, 0x04, 0x00, 0x3D, 0x0A, 0x00, 0x01, 0x11, 0x00, 0x01, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6688, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6689, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x3A, 0x10, 0x80, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x39, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x668B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x62, 0x00, 0x24, 0x52, 0x00, 0x3F, 0x94, 0x00, 0x22, 0x08, 0x00, 0x29, 0x14, 0x00, 0x30, 0xA3, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x668C, { 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0x00, 0x2A, 0x00, 0x7E, 0x6C, 0x80, 0x45, 0x45, 0x00, 0x44, 0xC6, 0x00, 0x45, 0x83, 0x00, 0x47, 0x7D, 0x80, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x24, 0x00, 0x7C, 0x64, 0x00, 0x00, 0x46, 0x00, 0x00, 0xC3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x668D, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x40, 0x00, 0x44, 0xFF, 0x80, 0x45, 0x88, 0x80, 0x47, 0x88, 0x80, 0x44, 0x9C, 0x80, 0x7C, 0xB6, 0x80, 0x00, 0x80, 0x80, 0x00, 0xF9, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x668E, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x54, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6690, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x21, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x08, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6691, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x58, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x90, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6692, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x90, 0x00, 0x44, 0xFF, 0x00, 0x45, 0x90, 0x00, 0x45, 0x10, 0x00, 0x7C, 0x7E, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6696, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x01, 0xE1, 0x00, 0x78, 0x90, 0x80, 0x49, 0x08, 0x00, 0x4A, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x80, 0x48, 0x40, 0x00, 0x78, 0x7F, 0x00, 0x48, 0xC2, 0x00, 0x41, 0x24, 0x00, 0x06, 0x18, 0x00, 0x00, 0x66, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6697, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6698, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x40, 0x00, 0x3C, 0xFF, 0x80, 0x25, 0x11, 0x80, 0x02, 0x22, 0x80, 0x0C, 0x44, 0x80, 0x00, 0x88, 0x80, 0x03, 0x11, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6699, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x28, 0x00, 0x47, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x44, 0x82, 0x00, 0x45, 0xFF, 0x00, 0x46, 0x82, 0x80, 0x44, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x669A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3E, 0x00, 0x7C, 0x62, 0x00, 0x45, 0xD6, 0x00, 0x44, 0x2C, 0x00, 0x44, 0x18, 0x00, 0x44, 0x70, 0x00, 0x7D, 0xC0, 0x00, 0x44, 0x7F, 0x00, 0x44, 0x90, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x669B, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x40, 0x00, 0x44, 0x40, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x669C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x36, 0x33, 0x00, 0x14, 0x12, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x669D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3D, 0x00, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x24, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x669F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x91, 0x00, 0x7C, 0x91, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x42, 0x00, 0x7C, 0x66, 0x00, 0x00, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66A0, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66A2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x20, 0x00, 0x3E, 0x7F, 0x80, 0x28, 0x92, 0x80, 0x0B, 0x22, 0x80, 0x08, 0x44, 0x80, 0x09, 0x88, 0x80, 0x08, 0x11, 0x00, 0x08, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66A4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x7C, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x44, 0xC6, 0x00, 0x45, 0x93, 0x00, 0x7D, 0x11, 0x80, 0x00, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x23, 0x8E, 0x00, 0x2D, 0x55, 0x80, 0x21, 0x04, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x67, 0xFF, 0x00, 0x44, 0x01, 0x00, 0x44, 0x01, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66A7, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x05, 0xF0, 0x00, 0x3E, 0x92, 0x00, 0x24, 0x54, 0x00, 0x27, 0xFF, 0x00, 0x26, 0x21, 0x00, 0x24, 0x22, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x24, 0x7C, 0x00, 0x24, 0x84, 0x00, 0x24, 0xA8, 0x00, 0x3D, 0x10, 0x00, 0x26, 0x28, 0x00, 0x00, 0xC7, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66A8, { 0x00, 0x00, 0x00, 0x3E, 0xFC, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x92, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x24, 0x29, 0x00, 0x2E, 0x49, 0x00, 0x31, 0x87, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66AB, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x3F, 0xB8, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66AD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x7C, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x81, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x44, 0xD7, 0x00, 0x44, 0x10, 0x00, 0x44, 0xD7, 0x00, 0x44, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66AE, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x32, 0x09, 0x80, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7D, 0x00, 0x00, 0x45, 0x22, 0x00, 0x45, 0x7F, 0x00, 0x45, 0x22, 0x00, 0x45, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x45, 0x20, 0x00, 0x45, 0x7F, 0x00, 0x45, 0xA1, 0x00, 0x45, 0x21, 0x00, 0x7D, 0x3F, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66B2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66B3, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x38, 0x84, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x2B, 0xEF, 0x00, 0x28, 0x84, 0x00, 0x38, 0xFF, 0x80, 0x2F, 0x84, 0x00, 0x28, 0x84, 0x00, 0x28, 0x84, 0x00, 0x29, 0xFE, 0x00, 0x28, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66B4, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0E, 0x4E, 0x00, 0x31, 0x71, 0x80, 0x01, 0xD0, 0x00, 0x06, 0x4C, 0x00, 0x38, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66B5, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x44, 0x7C, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x7C, 0x28, 0x00, 0x00, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66B8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x49, 0x45, 0x00, 0x48, 0x82, 0x00, 0x49, 0xFF, 0x00, 0x7A, 0x82, 0x80, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x78, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66B9, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x01, 0x10, 0x00, 0x03, 0xFF, 0x00, 0x05, 0xFF, 0x00, 0x39, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0D, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66BB, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x92, 0x00, 0x01, 0x11, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66BC, { 0x00, 0x00, 0x00, 0x2A, 0x20, 0x00, 0x49, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x64, 0x00, 0x49, 0xC4, 0x00, 0x5D, 0x28, 0x00, 0x6B, 0x10, 0x00, 0x49, 0x2C, 0x00, 0x4B, 0x43, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66BE, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x38, 0x84, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x05, 0x00, 0x2B, 0xE9, 0x00, 0x2A, 0x29, 0x00, 0x3B, 0xEA, 0x00, 0x28, 0x1A, 0x00, 0x2B, 0xF6, 0x00, 0x28, 0x44, 0x00, 0x28, 0xF4, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x01, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66BF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x42, 0x7F, 0x00, 0x42, 0x00, 0x00, 0x42, 0x7F, 0x00, 0x42, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x42, 0x22, 0x00, 0x42, 0x14, 0x00, 0x42, 0xFF, 0x80, 0x42, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66C0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x45, 0x7D, 0x00, 0x44, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66C1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x3F, 0x80, 0x3F, 0x0C, 0x00, 0x26, 0x14, 0x00, 0x3C, 0x64, 0x80, 0x23, 0x03, 0x80, 0x1F, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66C2, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x44, 0x00, 0x44, 0x7C, 0x00, 0x44, 0x00, 0x00, 0x47, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66C3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7B, 0x7F, 0x00, 0x49, 0x09, 0x00, 0x4A, 0x7F, 0x80, 0x4B, 0x09, 0x00, 0x49, 0x7F, 0x00, 0x78, 0x08, 0x00, 0x4F, 0x49, 0x00, 0x49, 0x2B, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x6B, 0x00, 0x79, 0x49, 0x80, 0x03, 0x18, 0x00, 0x02, 0x80, 0x00, 0x06, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66C4, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xC7, 0x00, 0x17, 0x1C, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x24, 0x80, 0x11, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66C7, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x2F, 0x5E, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66C8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x82, 0x00, 0x44, 0x44, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x92, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x92, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66C9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x38, 0x84, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0xF4, 0x00, 0x2F, 0x9F, 0x80, 0x38, 0x00, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x48, 0x00, 0x00, 0x88, 0x80, 0x01, 0x0F, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66CC, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x83, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0xF0, 0x00, 0x06, 0x1C, 0x00, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x49, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x44, 0x82, 0x00, 0x44, 0x44, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66CF, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x33, 0xEF, 0x80, 0x6A, 0x28, 0x80, 0x5B, 0xE9, 0x00, 0x32, 0x2A, 0x00, 0x23, 0xEB, 0x00, 0x7A, 0x08, 0x80, 0x0B, 0xC8, 0x80, 0x1A, 0x0B, 0x80, 0x32, 0x28, 0x00, 0x61, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66D4, { 0x00, 0x00, 0x00, 0x01, 0x48, 0x00, 0x01, 0x48, 0x00, 0x7B, 0xE8, 0x00, 0x49, 0x4F, 0x80, 0x49, 0x59, 0x00, 0x4A, 0x11, 0x00, 0x4B, 0xE9, 0x00, 0x7C, 0x2B, 0x00, 0x4B, 0xAA, 0x00, 0x4A, 0xAA, 0x00, 0x4A, 0xAE, 0x00, 0x4A, 0xA4, 0x00, 0x7B, 0xAE, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x4B, 0x00, 0x00, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66D6, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x38, 0x92, 0x00, 0x28, 0x52, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x28, 0x49, 0x00, 0x39, 0x42, 0x80, 0x2A, 0x7E, 0x00, 0x28, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x28, 0xC4, 0x00, 0x39, 0x28, 0x00, 0x2E, 0x10, 0x00, 0x20, 0x6C, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3A, 0x49, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x20, 0x00, 0x28, 0x21, 0x00, 0x29, 0xFE, 0x00, 0x38, 0x2C, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x68, 0x00, 0x29, 0xFE, 0x00, 0x2E, 0x82, 0x00, 0x38, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66DA, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x07, 0xFF, 0x80, 0x78, 0x84, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x01, 0x00, 0x4A, 0xFD, 0x00, 0x48, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x48, 0x40, 0x00, 0x48, 0xA3, 0x00, 0x4B, 0x56, 0x00, 0x48, 0x98, 0x00, 0x7B, 0x34, 0x00, 0x00, 0xD2, 0x00, 0x07, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66DB, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF8, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x45, 0x93, 0x00, 0x7D, 0x55, 0x00, 0x45, 0x39, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x49, 0x00, 0x02, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x38, 0xA2, 0x80, 0x29, 0x24, 0x80, 0x2E, 0x69, 0x80, 0x29, 0xA2, 0x80, 0x2E, 0x2C, 0x80, 0x38, 0x50, 0x00, 0x28, 0xFF, 0x00, 0x29, 0x90, 0x00, 0x2A, 0xFF, 0x00, 0x38, 0x90, 0x00, 0x28, 0xFF, 0x00, 0x00, 0x90, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66DD, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x39, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x38, 0x44, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x39, 0x92, 0x00, 0x2E, 0xBD, 0x80, 0x20, 0x54, 0x00, 0x01, 0x92, 0x00, 0x06, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66DF, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x34, 0x84, 0x00, 0x24, 0xEC, 0x00, 0x67, 0xB8, 0x00, 0x4E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66E0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x55, 0x3E, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x7D, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x02, 0x22, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66E6, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x38, 0x7A, 0x00, 0x2B, 0xC9, 0x00, 0x28, 0x48, 0x00, 0x2F, 0xFF, 0x80, 0x38, 0xE9, 0x00, 0x29, 0x59, 0x00, 0x27, 0xF6, 0x00, 0x00, 0x96, 0x80, 0x01, 0x29, 0x80, 0x02, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66E8, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x4A, 0x28, 0x00, 0x49, 0x4F, 0x00, 0x4F, 0xF1, 0x00, 0x48, 0x0F, 0x00, 0x7B, 0xE8, 0x00, 0x4A, 0x2F, 0x00, 0x4B, 0xE8, 0x00, 0x4A, 0x2F, 0x00, 0x4B, 0xE8, 0x00, 0x7A, 0x2F, 0x00, 0x02, 0x28, 0x00, 0x02, 0x2C, 0x80, 0x02, 0x67, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66E9, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x06, 0x48, 0x00, 0x38, 0x30, 0x00, 0x0F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66EB, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x68, 0x05, 0x00, 0x11, 0xE2, 0x00, 0x24, 0x04, 0x80, 0x7D, 0xEF, 0x80, 0x11, 0x22, 0x00, 0x59, 0x2B, 0x00, 0x55, 0xEA, 0x80, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66EC, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x00, 0x00, 0x00, 0x7B, 0xEF, 0x80, 0x4A, 0x28, 0x80, 0x4A, 0xAA, 0x80, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x7A, 0x48, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x88, 0x00, 0x7A, 0xEF, 0x00, 0x02, 0x88, 0x00, 0x04, 0xE8, 0x80, 0x01, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66EE, { 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x79, 0xEF, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x00, 0x4A, 0xF4, 0x00, 0x7A, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x99, 0x00, 0x4A, 0xF5, 0x00, 0x4A, 0x97, 0x00, 0x7A, 0xF2, 0x00, 0x06, 0x97, 0x00, 0x04, 0xFD, 0x80, 0x01, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66F2, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66F3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x00, 0x42, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC8, 0x80, 0x07, 0x06, 0x80, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x04, 0x80, 0x00, 0x03, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x0C, 0x38, 0x00, 0x30, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66F5, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x00, 0xCC, 0x00, 0x00, 0x58, 0x80, 0x00, 0xF0, 0x80, 0x07, 0x9C, 0x80, 0x7C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x20, 0x80, 0x28, 0x50, 0x80, 0x08, 0x88, 0x80, 0x09, 0x04, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66F8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66F9, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66FA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x3F, 0x80, 0x39, 0x24, 0x00, 0x69, 0x24, 0x00, 0x07, 0x24, 0x00, 0x06, 0xFF, 0x80, 0x1C, 0x04, 0x00, 0x70, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66FC, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x01, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x66FD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66FE, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x1F, 0xFF, 0x80, 0x2A, 0x4A, 0x00, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x66FF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x05, 0x14, 0x00, 0x08, 0xA2, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6700, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x08, 0x00, 0x17, 0x08, 0x00, 0x39, 0x14, 0x00, 0x01, 0x22, 0x00, 0x01, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6703, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x3B, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x4A, 0x00, 0x09, 0x52, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6705, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0xC8, 0x80, 0x11, 0xC8, 0x80, 0x32, 0x5C, 0x80, 0x22, 0x76, 0x80, 0x3F, 0x40, 0x80, 0x61, 0x7D, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6707, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0E, 0x08, 0x00, 0x11, 0x1F, 0x80, 0x6E, 0xD4, 0x80, 0x00, 0x14, 0x80, 0x7F, 0xDF, 0x80, 0x44, 0x54, 0x80, 0x55, 0x54, 0x80, 0x44, 0x5F, 0x80, 0x7F, 0xCA, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x92, 0x00, 0x20, 0xFF, 0x80, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6708, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6709, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x670A, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1E, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x22, 0x49, 0x00, 0x22, 0x89, 0x00, 0x4B, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x670B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x9F, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x1F, 0x9F, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x1F, 0x9F, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x20, 0xA0, 0x80, 0x21, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x670D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x47, 0x00, 0x11, 0x40, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x62, 0x00, 0x11, 0x52, 0x00, 0x11, 0x54, 0x00, 0x11, 0x48, 0x00, 0x11, 0x4C, 0x00, 0x21, 0x52, 0x00, 0x23, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x670E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x6C, 0x00, 0x22, 0xC6, 0x00, 0x23, 0x83, 0x80, 0x3E, 0x7C, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x27, 0x00, 0x62, 0x20, 0x00, 0x4E, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x670F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x62, 0x91, 0x00, 0x4E, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6710, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x12, 0x7A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x1E, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x7A, 0x00, 0x22, 0x42, 0x00, 0x22, 0x02, 0x00, 0x4A, 0x0A, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6713, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x28, 0x00, 0x25, 0x29, 0x00, 0x25, 0xAB, 0x00, 0x24, 0xAE, 0x00, 0x3C, 0xA8, 0x00, 0x24, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x2E, 0x00, 0x3C, 0xEB, 0x00, 0x27, 0xA9, 0x00, 0x24, 0x28, 0x00, 0x24, 0x68, 0x00, 0x24, 0x48, 0x80, 0x64, 0xC9, 0x80, 0x4D, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6714, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x04, 0x9F, 0x80, 0x04, 0x90, 0x80, 0x01, 0x10, 0x80, 0x3F, 0xF0, 0x80, 0x02, 0x1F, 0x80, 0x12, 0x50, 0x80, 0x12, 0x50, 0x80, 0x12, 0x50, 0x80, 0x12, 0x5F, 0x80, 0x1F, 0xD0, 0x80, 0x12, 0x50, 0x80, 0x04, 0x10, 0x80, 0x04, 0x20, 0x80, 0x08, 0x20, 0x80, 0x10, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6715, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x00, 0x12, 0x04, 0x00, 0x12, 0x42, 0x00, 0x1A, 0x81, 0x80, 0x17, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x12, 0x18, 0x00, 0x12, 0x14, 0x00, 0x12, 0x24, 0x00, 0x12, 0x22, 0x00, 0x22, 0x41, 0x00, 0x26, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6716, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x48, 0x80, 0x22, 0x49, 0x80, 0x22, 0x4D, 0x00, 0x22, 0x44, 0x00, 0x22, 0x46, 0x00, 0x62, 0x7B, 0x00, 0x4E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6717, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x1F, 0x90, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x1F, 0x9F, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x1F, 0x90, 0x80, 0x10, 0x5F, 0x80, 0x14, 0x90, 0x80, 0x13, 0x10, 0x80, 0x11, 0x10, 0x80, 0x1E, 0xA0, 0x80, 0x30, 0x40, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6719, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x4A, 0x51, 0x00, 0x4A, 0x51, 0x00, 0x4A, 0x5F, 0x00, 0x52, 0x51, 0x00, 0x61, 0xD1, 0x00, 0x40, 0x51, 0x00, 0x4E, 0x5F, 0x00, 0x4A, 0x51, 0x00, 0x4A, 0x51, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x31, 0x00, 0x00, 0x21, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x671B, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x10, 0x1F, 0x00, 0x10, 0x11, 0x00, 0x10, 0x3F, 0x00, 0x1F, 0xE1, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x671C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x04, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x62, 0x08, 0x00, 0x4E, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x671D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x80, 0x3F, 0xF0, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x1F, 0xDF, 0x80, 0x10, 0x50, 0x80, 0x1F, 0xD0, 0x80, 0x10, 0x50, 0x80, 0x1F, 0xDF, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x3F, 0xF0, 0x80, 0x02, 0x10, 0x80, 0x02, 0x20, 0x80, 0x02, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x671E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x05, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x671F, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xF1, 0x00, 0x08, 0x91, 0x00, 0x08, 0x9F, 0x00, 0x0F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xF1, 0x00, 0x00, 0x11, 0x00, 0x11, 0x11, 0x00, 0x20, 0xA3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6720, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x14, 0x00, 0x22, 0x14, 0x00, 0x22, 0x36, 0x00, 0x62, 0x63, 0x00, 0x4E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6722, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0x21, 0x00, 0x3F, 0xC3, 0x00, 0x00, 0x1C, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6726, { 0x00, 0x00, 0x00, 0x1C, 0x42, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x42, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x00, 0x80, 0x1C, 0x7E, 0x00, 0x14, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x34, 0x00, 0x14, 0x5C, 0x80, 0x1C, 0xAF, 0x00, 0x17, 0x4A, 0x00, 0x15, 0x95, 0x00, 0x14, 0x65, 0x00, 0x25, 0x84, 0x80, 0x2C, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6727, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x17, 0xEF, 0x80, 0x15, 0x48, 0x00, 0x15, 0x4F, 0x80, 0x1F, 0xF0, 0x80, 0x14, 0x0F, 0x80, 0x15, 0xE8, 0x00, 0x15, 0x28, 0x00, 0x1D, 0xEF, 0x80, 0x15, 0x28, 0x00, 0x15, 0xE8, 0x00, 0x15, 0x2F, 0x80, 0x15, 0x28, 0x00, 0x25, 0x28, 0x80, 0x2D, 0x6F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6728, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x672A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x672B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x672C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x672D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x16, 0x10, 0x00, 0x15, 0x10, 0x00, 0x14, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x1F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x672E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0x44, 0x80, 0x10, 0x47, 0x80, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x672F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x98, 0x00, 0x00, 0x88, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x87, 0x00, 0x60, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6731, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x60, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6733, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x7E, 0x04, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x18, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0x46, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x83, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6734, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x07, 0x06, 0x00, 0x06, 0x85, 0x00, 0x0A, 0x44, 0x80, 0x0A, 0x04, 0x00, 0x12, 0x04, 0x00, 0x22, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6735, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x18, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8E, 0x00, 0x30, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6736, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x1F, 0x80, 0x02, 0x10, 0x80, 0x02, 0x20, 0x80, 0x04, 0x00, 0x80, 0x08, 0x07, 0x00, 0x30, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6737, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x7E, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x1C, 0x21, 0x00, 0x1A, 0x21, 0x00, 0x1A, 0x21, 0x00, 0x28, 0x61, 0x00, 0x28, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0xC3, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x0B, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6738, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x1C, 0x11, 0x00, 0x1A, 0x11, 0x00, 0x1A, 0x11, 0x00, 0x28, 0x31, 0x00, 0x28, 0x21, 0x00, 0x48, 0x21, 0x00, 0x08, 0x63, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x673A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x15, 0x44, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x84, 0x80, 0x04, 0x84, 0x80, 0x05, 0x07, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x673D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x1F, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x15, 0x3F, 0x80, 0x14, 0x40, 0x80, 0x14, 0x00, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x01, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x673E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x1A, 0x04, 0x00, 0x19, 0x04, 0x00, 0x28, 0x04, 0x00, 0x28, 0x04, 0x00, 0x48, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x673F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC2, 0x00, 0x11, 0xEE, 0x00, 0x02, 0xB0, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6740, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x04, 0x18, 0x00, 0x03, 0x60, 0x00, 0x00, 0x80, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x84, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8E, 0x00, 0x30, 0x84, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6741, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x19, 0x38, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x48, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6742, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x08, 0x8E, 0x00, 0x10, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x12, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6743, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x09, 0x04, 0x00, 0x18, 0x84, 0x00, 0x1C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x50, 0x00, 0x48, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x09, 0x07, 0x00, 0x0A, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6745, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0xFF, 0x80, 0x19, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6746, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0D, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6747, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x40, 0x00, 0x1A, 0x40, 0x00, 0x18, 0x40, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6748, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x7E, 0x21, 0x00, 0x08, 0xB3, 0x00, 0x08, 0x92, 0x00, 0x1D, 0x96, 0x00, 0x1B, 0x44, 0x00, 0x19, 0x4C, 0x00, 0x28, 0x68, 0x00, 0x28, 0x38, 0x00, 0x48, 0x30, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6749, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x21, 0x00, 0x0E, 0xC2, 0x00, 0x15, 0x04, 0x00, 0x14, 0x88, 0x00, 0x24, 0x10, 0x80, 0x24, 0x21, 0x00, 0x04, 0xC2, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x04, 0x30, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x674C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x24, 0x00, 0x1A, 0x24, 0x00, 0x19, 0x24, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x674E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x03, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x674F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6750, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0E, 0x0A, 0x00, 0x15, 0x0A, 0x00, 0x14, 0x92, 0x00, 0x14, 0x12, 0x00, 0x24, 0x22, 0x00, 0x24, 0x42, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6751, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x3A, 0x44, 0x00, 0x28, 0x24, 0x00, 0x28, 0x14, 0x00, 0x28, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6753, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x04, 0x7F, 0x80, 0x0C, 0x80, 0x80, 0x0E, 0x00, 0x80, 0x15, 0x00, 0x80, 0x14, 0x7C, 0x80, 0x14, 0x00, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x01, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6754, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x80, 0x19, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x19, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6755, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x18, 0x38, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x48, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x83, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6756, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x18, 0x48, 0x00, 0x18, 0xC8, 0x00, 0x3D, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x28, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0xC2, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6759, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x08, 0x11, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x1A, 0x18, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x0C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x06, 0x80, 0x08, 0x03, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x675C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x14, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x675D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x7E, 0x93, 0x00, 0x08, 0x9D, 0x00, 0x08, 0xB1, 0x00, 0x1C, 0xD1, 0x00, 0x1B, 0x91, 0x00, 0x18, 0x91, 0x00, 0x28, 0x93, 0x00, 0x28, 0x90, 0x00, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x675E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x1F, 0x01, 0x00, 0x04, 0x01, 0x00, 0x0C, 0x01, 0x00, 0x0E, 0x01, 0x00, 0x15, 0x7F, 0x00, 0x14, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x675F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6760, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6761, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x3B, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x0F, 0x78, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6762, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6763, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0x88, 0x80, 0x1A, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6764, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x3F, 0x00, 0x1A, 0x21, 0x00, 0x1A, 0x21, 0x00, 0x28, 0x21, 0x00, 0x28, 0x21, 0x00, 0x48, 0x61, 0x00, 0x08, 0x43, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6765, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x02, 0xB0, 0x00, 0x06, 0x90, 0x00, 0x04, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6766, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x46, 0x00, 0x1C, 0xC4, 0x00, 0x1A, 0x04, 0x00, 0x19, 0x0C, 0x00, 0x28, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x48, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6768, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x42, 0x00, 0x19, 0xFF, 0x00, 0x1C, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x28, 0x52, 0x00, 0x48, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x42, 0x00, 0x08, 0x94, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6769, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x2A, 0x8A, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x02, 0x00, 0x08, 0x12, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x676A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x54, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x19, 0x91, 0x80, 0x1C, 0x10, 0x00, 0x1A, 0x11, 0x00, 0x2A, 0x13, 0x00, 0x28, 0x72, 0x00, 0x48, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x30, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x676C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x24, 0x00, 0x19, 0x24, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x676D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1C, 0x7C, 0x00, 0x1A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x676E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x88, 0x80, 0x18, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0x8B, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x676F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x1F, 0x01, 0x00, 0x04, 0x02, 0x00, 0x0C, 0x04, 0x00, 0x0E, 0x0C, 0x00, 0x15, 0x1A, 0x00, 0x14, 0x29, 0x00, 0x24, 0x48, 0x80, 0x05, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6770, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6771, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6772, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6773, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6774, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x68, 0x80, 0x08, 0x49, 0x80, 0x1C, 0xC9, 0x00, 0x1A, 0x08, 0x00, 0x19, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x28, 0x14, 0x00, 0x48, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6775, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x88, 0x00, 0x19, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x3A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6776, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x13, 0x00, 0x08, 0x1E, 0x00, 0x7E, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x18, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x19, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6777, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x04, 0x49, 0x00, 0x0C, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x14, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x677B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x08, 0x11, 0x00, 0x1C, 0x11, 0x00, 0x1A, 0x11, 0x00, 0x18, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x677C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x08, 0x80, 0x1A, 0x09, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x677E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x22, 0x00, 0x18, 0x42, 0x00, 0x1C, 0x41, 0x00, 0x3A, 0x90, 0x80, 0x29, 0x10, 0x00, 0x28, 0x20, 0x00, 0x28, 0x44, 0x00, 0x08, 0x42, 0x00, 0x08, 0x9E, 0x00, 0x09, 0xE1, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x677F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x18, 0xFF, 0x00, 0x1C, 0xC2, 0x00, 0x3A, 0xA2, 0x00, 0x28, 0xA4, 0x00, 0x28, 0x94, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x08, 0x94, 0x00, 0x09, 0x22, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6781, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x26, 0x00, 0x08, 0x24, 0x00, 0x08, 0x3F, 0x00, 0x1C, 0x21, 0x00, 0x1A, 0x71, 0x00, 0x19, 0x53, 0x00, 0x28, 0x5A, 0x00, 0x28, 0x4E, 0x00, 0x48, 0xC4, 0x00, 0x08, 0x8E, 0x00, 0x09, 0x9A, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6784, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0xD0, 0x80, 0x1C, 0x90, 0x80, 0x1A, 0x10, 0x80, 0x19, 0x34, 0x80, 0x28, 0x24, 0x80, 0x28, 0x64, 0x80, 0x48, 0x5E, 0x80, 0x08, 0xF2, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6785, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6787, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0x89, 0x80, 0x1C, 0xEE, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x80, 0x08, 0xF8, 0x80, 0x0B, 0x8F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6789, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x678B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x3F, 0x00, 0x28, 0x21, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x678C, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x7E, 0x82, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x18, 0xFE, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x28, 0x22, 0x00, 0x48, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x46, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x678E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x48, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x678F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6790, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x04, 0x78, 0x00, 0x04, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x0E, 0x7F, 0x80, 0x15, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x24, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6791, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x18, 0xC2, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6793, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x24, 0x00, 0x04, 0x14, 0x00, 0x1F, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x44, 0x00, 0x0E, 0x24, 0x00, 0x15, 0x04, 0x00, 0x14, 0x04, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x80, 0x04, 0x3C, 0x00, 0x05, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6795, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x18, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x3A, 0x18, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x28, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6796, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x08, 0x00, 0x19, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x28, 0x14, 0x00, 0x48, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6797, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x0D, 0x1A, 0x00, 0x14, 0xAA, 0x00, 0x14, 0x29, 0x00, 0x24, 0x48, 0x80, 0x24, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6798, { 0x00, 0x00, 0x00, 0x08, 0x78, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0x9C, 0x80, 0x18, 0xB6, 0x80, 0x28, 0xE3, 0x80, 0x28, 0x80, 0x80, 0x48, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6799, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x1C, 0xA1, 0x00, 0x1A, 0xA1, 0x00, 0x18, 0xA1, 0x00, 0x28, 0xA1, 0x00, 0x28, 0xA3, 0x00, 0x49, 0xA0, 0x00, 0x09, 0x20, 0x00, 0x0B, 0x20, 0x80, 0x08, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x679A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x10, 0x00, 0x04, 0x1F, 0x80, 0x0C, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x52, 0x00, 0x14, 0x92, 0x00, 0x15, 0x14, 0x00, 0x24, 0x08, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x05, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x679B, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF2, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x18, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x00, 0x09, 0x11, 0x00, 0x0B, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x679C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x679D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x3A, 0xFF, 0x80, 0x28, 0x21, 0x00, 0x28, 0x22, 0x00, 0x28, 0x12, 0x00, 0x08, 0x14, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x08, 0x62, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x679E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x29, 0x54, 0x00, 0x49, 0x54, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x22, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x81, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFC, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x64, 0x00, 0x0C, 0x44, 0x80, 0x1A, 0xC4, 0x80, 0x19, 0x83, 0x80, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A1, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x72, 0x00, 0x09, 0xC2, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x08, 0x81, 0x00, 0x08, 0xB3, 0x00, 0x1C, 0x9A, 0x00, 0x1A, 0x8E, 0x00, 0x1A, 0x84, 0x00, 0x28, 0x8E, 0x00, 0x28, 0x9B, 0x00, 0x48, 0xB1, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x11, 0xC4, 0x00, 0x12, 0xA8, 0x00, 0x04, 0x98, 0x00, 0x18, 0x07, 0x00, 0x63, 0x82, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x07, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x09, 0x22, 0x00, 0x19, 0xFF, 0x00, 0x1D, 0x22, 0x00, 0x2B, 0x22, 0x00, 0x29, 0x22, 0x00, 0x49, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x94, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x80, 0x00, 0x28, 0x80, 0x00, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x09, 0x80, 0x00, 0x09, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A7, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x94, 0x00, 0x7E, 0x94, 0x00, 0x08, 0x94, 0x00, 0x18, 0x94, 0x00, 0x1C, 0x94, 0x00, 0x2A, 0xA4, 0x00, 0x28, 0xA4, 0x00, 0x48, 0x30, 0x00, 0x08, 0x50, 0x00, 0x08, 0x51, 0x00, 0x08, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A8, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x90, 0x00, 0x7E, 0xA0, 0x00, 0x08, 0xC0, 0x00, 0x18, 0x82, 0x00, 0x1D, 0xFF, 0x00, 0x2A, 0xA0, 0x00, 0x28, 0x90, 0x00, 0x48, 0x90, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA7, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67A9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x01, 0xF0, 0x00, 0x04, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x72, 0x03, 0x80, 0x02, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0xF6, 0x00, 0x3F, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67AA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x07, 0x00, 0x1A, 0xFA, 0x00, 0x1C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x48, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67AB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x09, 0x04, 0x00, 0x1D, 0x8C, 0x00, 0x1B, 0x54, 0x00, 0x29, 0x24, 0x00, 0x29, 0x24, 0x00, 0x49, 0x54, 0x00, 0x09, 0x8C, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x05, 0x00, 0x0A, 0x05, 0x00, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67AD, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xB0, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x01, 0xCA, 0x00, 0x02, 0xA4, 0x00, 0x0C, 0x98, 0x00, 0x30, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67AF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x52, 0x00, 0x1C, 0x52, 0x00, 0x3A, 0x91, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x62, 0x00, 0x7E, 0x43, 0x00, 0x08, 0xC1, 0x00, 0x08, 0x9F, 0x00, 0x1D, 0xF1, 0x80, 0x1A, 0x00, 0x80, 0x18, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B2, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x7C, 0x00, 0x3F, 0xC6, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x18, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x3A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67B4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x21, 0x00, 0x28, 0x21, 0x00, 0x48, 0x61, 0x00, 0x08, 0x41, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x82, 0x00, 0x0B, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x80, 0x19, 0x20, 0x00, 0x28, 0x40, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B6, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xDF, 0x00, 0x02, 0x51, 0x00, 0x04, 0x51, 0x00, 0x04, 0x51, 0x00, 0x08, 0x51, 0x00, 0x11, 0xDF, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67B7, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x47, 0x80, 0x3F, 0xF4, 0x80, 0x04, 0x54, 0x80, 0x0E, 0x54, 0x80, 0x0D, 0x54, 0x80, 0x15, 0x54, 0x80, 0x14, 0x54, 0x80, 0x14, 0x54, 0x80, 0x24, 0x54, 0x80, 0x24, 0x54, 0x80, 0x04, 0x54, 0x80, 0x04, 0x94, 0x80, 0x04, 0xB7, 0x80, 0x05, 0x04, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67B8, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x0C, 0x40, 0x80, 0x0C, 0x80, 0x80, 0x16, 0x80, 0x80, 0x15, 0x7C, 0x80, 0x14, 0x44, 0x80, 0x24, 0x44, 0x80, 0x24, 0x7C, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67B9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0xC1, 0x00, 0x08, 0x81, 0x00, 0x09, 0xF9, 0x00, 0x18, 0x89, 0x00, 0x1C, 0x89, 0x00, 0x1A, 0x89, 0x00, 0x2A, 0xFB, 0x00, 0x28, 0x82, 0x00, 0x48, 0x8E, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67BB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x18, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x9E, 0x00, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67BC, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67BD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67BE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x15, 0x49, 0x00, 0x14, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x05, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x00, 0x1C, 0x88, 0x00, 0x1A, 0xFF, 0x00, 0x18, 0xA1, 0x00, 0x28, 0xA3, 0x00, 0x28, 0xB2, 0x00, 0x48, 0x96, 0x00, 0x09, 0x8C, 0x00, 0x09, 0x1E, 0x00, 0x0B, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67C1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x1C, 0x20, 0x00, 0x1A, 0x23, 0x00, 0x1A, 0x2E, 0x00, 0x28, 0x38, 0x00, 0x28, 0x20, 0x00, 0x48, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C2, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0x88, 0x00, 0x1C, 0x4B, 0x00, 0x1A, 0x4D, 0x00, 0x18, 0x59, 0x00, 0x28, 0x69, 0x00, 0x28, 0xCB, 0x00, 0x48, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x40, 0x80, 0x08, 0x61, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x3C, 0x00, 0x7E, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x09, 0xBD, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x21, 0x00, 0x28, 0x21, 0x00, 0x48, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x27, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x3A, 0x88, 0x80, 0x28, 0x94, 0x80, 0x28, 0xA2, 0x80, 0x28, 0xC2, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67C5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x80, 0x00, 0x1A, 0xA0, 0x00, 0x18, 0xA3, 0x00, 0x28, 0xAE, 0x00, 0x28, 0xB8, 0x00, 0x48, 0xA0, 0x00, 0x09, 0xA0, 0x00, 0x09, 0x20, 0x80, 0x0B, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x1A, 0x66, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x18, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67C9, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x02, 0x00, 0x18, 0x06, 0x00, 0x28, 0x04, 0x00, 0x28, 0x0C, 0x00, 0x48, 0x18, 0x00, 0x08, 0x30, 0x00, 0x08, 0x78, 0x00, 0x09, 0xCC, 0x00, 0x08, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67CA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x7E, 0xC4, 0x00, 0x09, 0x8C, 0x00, 0x08, 0x58, 0x00, 0x1C, 0x30, 0x00, 0x1A, 0x78, 0x00, 0x18, 0xCE, 0x00, 0x2B, 0x83, 0x80, 0x28, 0x70, 0x00, 0x48, 0x18, 0x00, 0x08, 0x00, 0x00, 0x08, 0xE0, 0x00, 0x08, 0x38, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67CE, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x7E, 0xC2, 0x00, 0x08, 0xBF, 0x80, 0x08, 0x82, 0x00, 0x1D, 0x82, 0x00, 0x1A, 0x92, 0x00, 0x18, 0x9A, 0x00, 0x28, 0x8A, 0x00, 0x28, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67CF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x7F, 0x80, 0x04, 0x40, 0x80, 0x0C, 0x40, 0x80, 0x0C, 0x40, 0x80, 0x16, 0x40, 0x80, 0x15, 0x7F, 0x80, 0x14, 0x40, 0x80, 0x24, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x04, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67D0, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67D1, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0xFF, 0x80, 0x0C, 0x22, 0x00, 0x0C, 0x22, 0x00, 0x16, 0x22, 0x00, 0x15, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x24, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67D2, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x2F, 0x80, 0x23, 0xF0, 0x00, 0x10, 0x20, 0x00, 0x04, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67D3, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFC, 0x00, 0x20, 0x24, 0x00, 0x14, 0x24, 0x00, 0x04, 0x44, 0x80, 0x08, 0x44, 0x80, 0x10, 0x87, 0x80, 0x23, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67D4, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xB0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC1, 0x00, 0x01, 0x42, 0x00, 0x06, 0x40, 0x00, 0x38, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67D7, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x63, 0x00, 0x08, 0x41, 0x00, 0x08, 0xC1, 0x80, 0x1C, 0x80, 0x80, 0x1A, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67D8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x30, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x7F, 0x00, 0x18, 0xC1, 0x00, 0x29, 0xC1, 0x00, 0x28, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67D9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0x88, 0x80, 0x18, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67DA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x88, 0x80, 0x1C, 0x88, 0x80, 0x3A, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67DC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x81, 0x00, 0x18, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67DD, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x18, 0xFF, 0x80, 0x18, 0x84, 0x00, 0x3C, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x28, 0x94, 0x00, 0x28, 0x8C, 0x00, 0x28, 0x86, 0x00, 0x08, 0x85, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67DE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x90, 0x00, 0x09, 0x90, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x1F, 0x00, 0x1A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x01, 0x00, 0x0A, 0x02, 0x00, 0x18, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x1A, 0x11, 0x00, 0x19, 0xD3, 0x00, 0x28, 0x5A, 0x00, 0x28, 0x5C, 0x00, 0x48, 0xD4, 0x00, 0x08, 0x96, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E2, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x88, 0x00, 0x1A, 0x88, 0x00, 0x28, 0x8C, 0x00, 0x28, 0x84, 0x00, 0x48, 0xE4, 0x00, 0x0B, 0x86, 0x00, 0x08, 0x02, 0x80, 0x0B, 0xFB, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xFF, 0x00, 0x68, 0x0A, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x19, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67E7, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF2, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x93, 0x00, 0x09, 0x95, 0x00, 0x09, 0x7D, 0x00, 0x0B, 0x05, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67E9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x90, 0x00, 0x3E, 0x9F, 0x00, 0x08, 0xA2, 0x00, 0x18, 0xA2, 0x00, 0x1C, 0xD4, 0x00, 0x3A, 0x94, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x94, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67EC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x45, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x11, 0x51, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xE1, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67EE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67EF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x1C, 0xF2, 0x00, 0x2A, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x28, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67F0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x40, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67F1, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0D, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67F2, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x26, 0x00, 0x1A, 0xA4, 0x00, 0x18, 0xAF, 0x00, 0x28, 0xA9, 0x80, 0x29, 0xB8, 0x80, 0x49, 0x30, 0x00, 0x08, 0x20, 0x00, 0x08, 0xE1, 0x00, 0x0B, 0xB3, 0x00, 0x08, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67F3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x6F, 0x00, 0x09, 0x89, 0x00, 0x3F, 0x29, 0x00, 0x09, 0x29, 0x00, 0x19, 0x29, 0x00, 0x1D, 0x29, 0x00, 0x1B, 0x29, 0x00, 0x29, 0x29, 0x00, 0x29, 0xE9, 0x00, 0x2B, 0x29, 0x00, 0x08, 0x49, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67F4, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0x13, 0x80, 0x09, 0xFC, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x80, 0x09, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67F5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x18, 0xAA, 0x00, 0x1C, 0xAA, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67F6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x18, 0x94, 0x80, 0x1C, 0x94, 0x80, 0x3A, 0x94, 0x80, 0x28, 0xA7, 0x80, 0x28, 0xC0, 0x80, 0x28, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67F7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x67F9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x17, 0x00, 0x7E, 0xFC, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x1C, 0x90, 0x00, 0x1A, 0x90, 0x00, 0x18, 0xFF, 0x80, 0x28, 0x50, 0x80, 0x28, 0x50, 0x80, 0x48, 0x50, 0x80, 0x08, 0xD0, 0x80, 0x08, 0x90, 0x80, 0x09, 0x91, 0x80, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67FB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67FD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x50, 0x00, 0x08, 0x20, 0x00, 0x18, 0x58, 0x00, 0x1D, 0x87, 0x00, 0x2A, 0x22, 0x00, 0x28, 0x28, 0x00, 0x49, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67FE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x48, 0x00, 0x18, 0x48, 0x00, 0x3C, 0x4F, 0x80, 0x2A, 0x48, 0x00, 0x28, 0x48, 0x00, 0x28, 0x48, 0x00, 0x28, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x67FF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x1B, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x17, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6800, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xF0, 0x00, 0x09, 0x00, 0x00, 0x7F, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x00, 0x00, 0x1D, 0x7C, 0x00, 0x2B, 0x44, 0x00, 0x29, 0x44, 0x00, 0x49, 0x54, 0x00, 0x09, 0x48, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0x3F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6802, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x99, 0x00, 0x08, 0x89, 0x00, 0x1C, 0x81, 0x00, 0x1B, 0xFF, 0x80, 0x19, 0x01, 0x00, 0x29, 0x21, 0x00, 0x29, 0x31, 0x00, 0x49, 0x11, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6803, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF0, 0x00, 0x7E, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x90, 0x00, 0x1C, 0x90, 0x00, 0x1A, 0x9F, 0x00, 0x1A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x28, 0x91, 0x00, 0x49, 0xB1, 0x00, 0x09, 0x23, 0x00, 0x0B, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6804, { 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x31, 0x86, 0x00, 0x18, 0x8C, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x04, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6805, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xDF, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x7E, 0x52, 0x00, 0x12, 0x52, 0x00, 0x3A, 0x52, 0x00, 0x37, 0xFF, 0x00, 0x52, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x14, 0xD2, 0x00, 0x18, 0x2A, 0x00, 0x10, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6807, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x02, 0x00, 0x1B, 0xFF, 0x00, 0x1C, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x28, 0xA8, 0x00, 0x48, 0xA4, 0x00, 0x09, 0x26, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6808, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x48, 0x00, 0x08, 0x44, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x7C, 0x00, 0x09, 0xC0, 0x00, 0x18, 0x44, 0x00, 0x1C, 0x7E, 0x00, 0x2B, 0xC0, 0x00, 0x28, 0x24, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC9, 0x00, 0x0B, 0x05, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6809, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x04, 0x00, 0x19, 0xFE, 0x00, 0x1C, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0x54, 0x00, 0x08, 0x48, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x680A, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x18, 0x50, 0x00, 0x1C, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x28, 0x54, 0x00, 0x48, 0x94, 0x00, 0x08, 0x98, 0x00, 0x09, 0x31, 0x00, 0x09, 0x51, 0x00, 0x0A, 0x0F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x680B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x7E, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x50, 0x00, 0x1A, 0x92, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x94, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x680C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x02, 0x00, 0x1D, 0x02, 0x00, 0x2B, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x680E, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xF0, 0x00, 0x09, 0x00, 0x00, 0x7F, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x12, 0x00, 0x1D, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x680F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x52, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x1C, 0x04, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6811, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xE4, 0x00, 0x7E, 0x3F, 0x00, 0x0A, 0x24, 0x00, 0x19, 0x44, 0x00, 0x1D, 0x54, 0x00, 0x28, 0x8C, 0x00, 0x28, 0x84, 0x00, 0x49, 0x44, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6812, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x19, 0x00, 0x80, 0x1C, 0x7C, 0x80, 0x3A, 0x44, 0x80, 0x29, 0x7C, 0x80, 0x28, 0x44, 0x80, 0x28, 0x7C, 0x80, 0x28, 0x44, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6813, { 0x00, 0x00, 0x00, 0x08, 0x78, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x41, 0x00, 0x09, 0x80, 0x80, 0x18, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x3A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6814, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x18, 0x80, 0x1F, 0x91, 0x80, 0x74, 0x33, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6816, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x14, 0x00, 0x1F, 0x14, 0x00, 0x04, 0x14, 0x00, 0x0C, 0x7F, 0x00, 0x0E, 0x55, 0x00, 0x15, 0x55, 0x00, 0x14, 0x55, 0x00, 0x14, 0x57, 0x00, 0x24, 0x61, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6817, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6819, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0xC2, 0x00, 0x09, 0xA4, 0x00, 0x08, 0x18, 0x00, 0x1C, 0x6E, 0x00, 0x1B, 0xC3, 0x80, 0x18, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x88, 0x00, 0x48, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x681D, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x19, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x681E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x84, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x681F, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x08, 0x63, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x1A, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x48, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6821, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x0C, 0x41, 0x00, 0x0E, 0x80, 0x80, 0x15, 0x42, 0x00, 0x14, 0x22, 0x00, 0x24, 0x24, 0x00, 0x24, 0x14, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x04, 0x14, 0x00, 0x04, 0x62, 0x00, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6822, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x3E, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x38, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6827, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x28, 0x19, 0x00, 0x48, 0x0B, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x1C, 0x80, 0x08, 0x76, 0x80, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6828, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x3F, 0x80, 0x13, 0xA0, 0x80, 0x10, 0x69, 0x80, 0x38, 0x49, 0x00, 0x34, 0x08, 0x00, 0x54, 0x08, 0x00, 0x50, 0x88, 0x00, 0x10, 0x9C, 0x00, 0x11, 0x94, 0x00, 0x11, 0x16, 0x00, 0x13, 0x32, 0x00, 0x12, 0x23, 0x00, 0x10, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6829, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x7C, 0x21, 0x00, 0x10, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x39, 0xAD, 0x00, 0x35, 0x29, 0x00, 0x54, 0x63, 0x00, 0x50, 0xA5, 0x00, 0x11, 0xAD, 0x00, 0x13, 0x39, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0xE7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x682A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x3E, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x3A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x38, 0x00, 0x28, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x682B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x08, 0x60, 0x00, 0x0C, 0x5F, 0x00, 0x1A, 0xC1, 0x00, 0x18, 0x82, 0x00, 0x19, 0x84, 0x00, 0x2A, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x48, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x682C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x08, 0xC4, 0x00, 0x7E, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0x91, 0x00, 0x18, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x80, 0x00, 0x48, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x682D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x1C, 0x94, 0x80, 0x1A, 0x94, 0x80, 0x1A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0x94, 0x80, 0x48, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x682F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x18, 0x40, 0x00, 0x1C, 0x7E, 0x00, 0x3A, 0xC2, 0x00, 0x29, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6830, { 0x00, 0x00, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x2B, 0x00, 0x08, 0x69, 0x00, 0x7E, 0x48, 0x00, 0x08, 0xC8, 0x00, 0x08, 0xBF, 0x80, 0x1D, 0x88, 0x00, 0x1A, 0x89, 0x00, 0x1A, 0x89, 0x00, 0x28, 0x8A, 0x00, 0x28, 0x8A, 0x00, 0x48, 0x8C, 0x00, 0x08, 0x84, 0x80, 0x08, 0x86, 0x80, 0x08, 0x8B, 0x80, 0x08, 0x91, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6831, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x24, 0x00, 0x1A, 0x24, 0x00, 0x1A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6832, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x12, 0x00, 0x08, 0x14, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x1A, 0x3F, 0x00, 0x18, 0xE0, 0x00, 0x2B, 0x20, 0x00, 0x28, 0x3F, 0x00, 0x48, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6833, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x12, 0x00, 0x08, 0x16, 0x00, 0x08, 0x14, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x18, 0x00, 0x1A, 0x30, 0x00, 0x28, 0xE3, 0x00, 0x29, 0xAE, 0x00, 0x48, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6834, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x09, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x1A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6837, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x0B, 0xFE, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x28, 0x00, 0x1D, 0xFC, 0x00, 0x1A, 0x20, 0x00, 0x28, 0x20, 0x00, 0x28, 0x22, 0x00, 0x4F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6838, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x1C, 0xA2, 0x00, 0x3A, 0x42, 0x00, 0x28, 0x24, 0x80, 0x28, 0x18, 0x80, 0x28, 0x11, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x31, 0x00, 0x08, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6839, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x1F, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x15, 0x7E, 0x00, 0x14, 0x48, 0x80, 0x14, 0x49, 0x00, 0x24, 0x4A, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x7A, 0x00, 0x05, 0xC1, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x683B, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x05, 0x00, 0x08, 0x05, 0x80, 0x7E, 0x04, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x1A, 0xF4, 0x00, 0x1A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x46, 0x00, 0x48, 0x72, 0x00, 0x09, 0xC2, 0x00, 0x08, 0x02, 0x80, 0x08, 0x03, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x683C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x42, 0x00, 0x18, 0xA4, 0x00, 0x1D, 0x18, 0x00, 0x1A, 0x18, 0x00, 0x28, 0x26, 0x00, 0x28, 0xC1, 0x80, 0x2B, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x683D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x14, 0x00, 0x1F, 0xD2, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xD2, 0x00, 0x06, 0x0A, 0x00, 0x0B, 0x0C, 0x00, 0x0A, 0x88, 0x00, 0x12, 0x14, 0x80, 0x22, 0x22, 0x80, 0x02, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x683E, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x22, 0x00, 0x22, 0xA2, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x98, 0x00, 0x08, 0x87, 0x00, 0x30, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x683F, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x80, 0x11, 0x88, 0x80, 0x7D, 0x08, 0x00, 0x11, 0x7F, 0x80, 0x13, 0x08, 0x00, 0x39, 0x08, 0x00, 0x35, 0x1C, 0x00, 0x55, 0x14, 0x00, 0x51, 0x14, 0x00, 0x11, 0x16, 0x00, 0x11, 0x32, 0x00, 0x11, 0x23, 0x00, 0x11, 0x21, 0x00, 0x11, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6840, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0xA4, 0x00, 0x19, 0x24, 0x00, 0x26, 0x24, 0x00, 0x04, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x30, 0x44, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6841, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x09, 0x20, 0x00, 0x1A, 0x3F, 0x80, 0x1C, 0x42, 0x00, 0x3A, 0x82, 0x00, 0x29, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6842, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6843, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x49, 0x00, 0x09, 0x4A, 0x00, 0x18, 0xCC, 0x00, 0x1C, 0x48, 0x00, 0x3A, 0x48, 0x00, 0x28, 0x4E, 0x00, 0x28, 0xC9, 0x00, 0x29, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6844, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0xD3, 0x00, 0x7E, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x24, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6845, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0xC4, 0x00, 0x7E, 0x88, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x1A, 0xBE, 0x00, 0x18, 0xA2, 0x00, 0x28, 0xA2, 0x00, 0x28, 0xA2, 0x00, 0x48, 0xA6, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x80, 0x09, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6846, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x1D, 0x08, 0x00, 0x1B, 0x3E, 0x00, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x49, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6848, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0x90, 0x00, 0x08, 0x78, 0x00, 0x01, 0x86, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6849, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x01, 0x00, 0x0A, 0x22, 0x00, 0x18, 0x20, 0x00, 0x1C, 0x42, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x48, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0x48, 0x00, 0x08, 0x86, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x684A, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x40, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x06, 0x18, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x77, 0xFB, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x684C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x684D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x19, 0xBD, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x20, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x684E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x42, 0x00, 0x18, 0x81, 0x00, 0x1D, 0x3F, 0x00, 0x3B, 0xD0, 0x80, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6850, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x3A, 0xBD, 0x00, 0x28, 0xA5, 0x00, 0x28, 0xA5, 0x00, 0x28, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6851, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x11, 0x11, 0x00, 0x0E, 0x0E, 0x00, 0x39, 0xB3, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6852, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6853, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x3A, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6854, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6855, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x08, 0x20, 0x00, 0x7E, 0xC7, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x18, 0xE7, 0x00, 0x28, 0x81, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6857, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x12, 0x00, 0x7E, 0x13, 0x80, 0x08, 0x30, 0x80, 0x08, 0x20, 0x80, 0x1C, 0x61, 0x80, 0x1A, 0xD7, 0x00, 0x18, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x48, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6858, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x19, 0x40, 0x00, 0x28, 0x40, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6859, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x7E, 0x9F, 0x00, 0x09, 0xF1, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x50, 0x00, 0x1A, 0x50, 0x00, 0x18, 0xFF, 0x00, 0x29, 0x90, 0x00, 0x28, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x685B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x1E, 0x00, 0x08, 0x13, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x685C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x80, 0x09, 0x31, 0x80, 0x09, 0x91, 0x00, 0x7E, 0x93, 0x00, 0x08, 0x82, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x20, 0x00, 0x19, 0xFF, 0x80, 0x28, 0x42, 0x00, 0x28, 0xC2, 0x00, 0x48, 0x86, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x685D, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x7D, 0xE2, 0x00, 0x11, 0x2F, 0x80, 0x11, 0x2A, 0x00, 0x33, 0xAA, 0x00, 0x3A, 0xEA, 0x00, 0x54, 0x4A, 0x00, 0x50, 0x4A, 0x00, 0x10, 0xDF, 0x80, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x11, 0x02, 0x00, 0x13, 0x02, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x685F, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x08, 0x11, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x80, 0x1A, 0x10, 0x00, 0x28, 0x19, 0x00, 0x28, 0x0B, 0x00, 0x48, 0x0E, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x76, 0x80, 0x09, 0xC3, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6860, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x19, 0x4A, 0x00, 0x1D, 0x4A, 0x00, 0x2A, 0xCA, 0x00, 0x28, 0x4C, 0x00, 0x48, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6861, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4E, 0x00, 0x09, 0xF0, 0x00, 0x7E, 0x28, 0x00, 0x08, 0x10, 0x00, 0x18, 0x29, 0x00, 0x1C, 0xC7, 0x00, 0x2A, 0x00, 0x00, 0x29, 0xFE, 0x00, 0x48, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x89, 0x00, 0x09, 0x09, 0x00, 0x0A, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6862, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x1D, 0x24, 0x00, 0x2B, 0x24, 0x00, 0x29, 0x24, 0x00, 0x49, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x40, 0x00, 0x08, 0x58, 0x00, 0x08, 0x86, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6863, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0x93, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x1A, 0x01, 0x00, 0x28, 0x01, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6864, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFC, 0x00, 0x1C, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6865, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x42, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x90, 0x00, 0x1C, 0x88, 0x00, 0x2B, 0x07, 0x00, 0x2A, 0x8A, 0x00, 0x4C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6866, { 0x00, 0x00, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x52, 0x00, 0x08, 0x94, 0x00, 0x7E, 0x98, 0x00, 0x09, 0xB0, 0x00, 0x1A, 0xD2, 0x00, 0x1C, 0x8E, 0x00, 0x2A, 0xA0, 0x00, 0x28, 0x22, 0x00, 0x4B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6867, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x2C, 0x00, 0x7E, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x1C, 0x7E, 0x00, 0x1A, 0x00, 0x00, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x48, 0x24, 0x00, 0x08, 0x66, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7F, 0x00, 0x09, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6868, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x22, 0x20, 0x00, 0x12, 0x3E, 0x00, 0x02, 0x42, 0x00, 0x0A, 0xA4, 0x00, 0x12, 0x18, 0x00, 0x32, 0x10, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x87, 0x00, 0x60, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6869, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x09, 0x10, 0x00, 0x19, 0x10, 0x00, 0x1D, 0x14, 0x00, 0x2B, 0xFE, 0x00, 0x29, 0x10, 0x00, 0x49, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x12, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x686B, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0x84, 0x00, 0x7E, 0xD5, 0x00, 0x08, 0x55, 0x00, 0x08, 0x35, 0x80, 0x1D, 0xA4, 0x80, 0x1A, 0xC4, 0x00, 0x18, 0x45, 0x00, 0x28, 0x0D, 0x00, 0x28, 0x43, 0x00, 0x48, 0x42, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x84, 0x00, 0x09, 0x8C, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x686D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x29, 0x28, 0x00, 0x29, 0x29, 0x00, 0x29, 0x2A, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x3A, 0x00, 0x0A, 0xE1, 0x00, 0x0A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x686E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x18, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x6B, 0x00, 0x1C, 0xC9, 0x80, 0x1A, 0x08, 0x00, 0x19, 0x08, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x686F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0x07, 0x00, 0x18, 0xFC, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x7E, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6870, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7E, 0x84, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x1C, 0x84, 0x00, 0x1A, 0xE2, 0x80, 0x19, 0x81, 0x80, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6871, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x24, 0x80, 0x08, 0x49, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x49, 0x00, 0x1A, 0x24, 0x80, 0x19, 0x24, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6872, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x80, 0x80, 0x1A, 0x80, 0x80, 0x18, 0x7F, 0x00, 0x28, 0x02, 0x00, 0x28, 0x04, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6874, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xFA, 0x00, 0x7E, 0x4B, 0x00, 0x08, 0xD9, 0x80, 0x08, 0x90, 0x80, 0x1C, 0xFF, 0x00, 0x1A, 0x02, 0x00, 0x1A, 0x04, 0x00, 0x28, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6875, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF0, 0x00, 0x7E, 0x12, 0x00, 0x08, 0x5B, 0x00, 0x08, 0xC9, 0x80, 0x1C, 0x90, 0x80, 0x1A, 0x10, 0x00, 0x18, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x62, 0x00, 0x48, 0x46, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x33, 0x00, 0x08, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6876, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x02, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x18, 0x00, 0x18, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x3A, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6877, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x08, 0xC4, 0x00, 0x7E, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x09, 0x81, 0x00, 0x09, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6879, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x1A, 0x82, 0x00, 0x18, 0xFE, 0x80, 0x28, 0x89, 0x80, 0x28, 0x8B, 0x00, 0x48, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x687A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xE7, 0x80, 0x1D, 0x24, 0x80, 0x1B, 0x24, 0x80, 0x19, 0x24, 0x80, 0x29, 0x24, 0x80, 0x29, 0xE7, 0x80, 0x48, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x687B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x62, 0x00, 0x7E, 0xC6, 0x00, 0x09, 0xAC, 0x00, 0x08, 0x38, 0x00, 0x1C, 0x6E, 0x00, 0x1B, 0xC3, 0x80, 0x18, 0x10, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x687C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x88, 0x00, 0x18, 0x98, 0x00, 0x0A, 0xE0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x9C, 0x00, 0x1B, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x687E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0xFE, 0x00, 0x1A, 0x40, 0x00, 0x28, 0x40, 0x00, 0x28, 0xFF, 0x00, 0x49, 0xC1, 0x00, 0x0B, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x687F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x24, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6881, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x20, 0x22, 0x00, 0x10, 0xA3, 0x00, 0x05, 0x22, 0x80, 0x0A, 0x22, 0x80, 0x08, 0x42, 0x80, 0x10, 0x82, 0x00, 0x23, 0x0C, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6882, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x08, 0x11, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x1C, 0xD3, 0x00, 0x1A, 0x56, 0x00, 0x18, 0x10, 0x00, 0x28, 0x18, 0x00, 0x28, 0x5C, 0x00, 0x48, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x80, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6883, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x13, 0xC7, 0x00, 0x10, 0x5C, 0x00, 0x7C, 0x84, 0x00, 0x11, 0x04, 0x00, 0x13, 0xC4, 0x00, 0x38, 0x7F, 0x80, 0x34, 0x44, 0x00, 0x50, 0x44, 0x00, 0x52, 0x44, 0x00, 0x13, 0x44, 0x00, 0x11, 0xC4, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xC0, 0x00, 0x13, 0x70, 0x00, 0x16, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6884, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x7F, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x1C, 0x94, 0x80, 0x1A, 0x94, 0x80, 0x19, 0x94, 0x80, 0x38, 0xA4, 0x80, 0x28, 0xC3, 0x80, 0x48, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6885, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x80, 0x00, 0x19, 0x7F, 0x00, 0x1C, 0x49, 0x00, 0x3A, 0x49, 0x00, 0x28, 0x49, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6886, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x09, 0xF8, 0x80, 0x7E, 0x49, 0x80, 0x08, 0x4B, 0x00, 0x09, 0xFA, 0x00, 0x1C, 0x49, 0x00, 0x1A, 0x48, 0x80, 0x18, 0x48, 0x80, 0x28, 0x78, 0x80, 0x29, 0xC8, 0x80, 0x48, 0x4B, 0x80, 0x08, 0x48, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x88, 0x00, 0x09, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6888, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x18, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x02, 0x00, 0x48, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x688D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x1A, 0x82, 0x00, 0x1A, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x28, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x688F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x28, 0x00, 0x04, 0x28, 0x00, 0x1F, 0x7F, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6893, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x41, 0x00, 0x0E, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6894, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x80, 0x00, 0x1C, 0xBE, 0x00, 0x3A, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x28, 0xBE, 0x00, 0x28, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x09, 0x20, 0x80, 0x09, 0x3F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6896, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6897, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x24, 0x88, 0x00, 0x04, 0x50, 0x00, 0x04, 0x30, 0x00, 0x04, 0x28, 0x00, 0x04, 0xC6, 0x00, 0x07, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6898, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x689A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x64, 0x00, 0x7E, 0xCC, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0x91, 0x00, 0x18, 0xB1, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x28, 0x00, 0x48, 0x28, 0x00, 0x08, 0x68, 0x00, 0x08, 0x48, 0x80, 0x08, 0xCD, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x689B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xF7, 0x80, 0x10, 0x94, 0x80, 0x7C, 0x94, 0x80, 0x10, 0x94, 0x80, 0x13, 0xF5, 0x00, 0x38, 0x95, 0x00, 0x34, 0x95, 0x00, 0x50, 0x94, 0x80, 0x53, 0xF4, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x11, 0x94, 0x80, 0x11, 0x35, 0x80, 0x13, 0x24, 0x00, 0x16, 0xE4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x689C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1B, 0x55, 0x00, 0x19, 0x55, 0x00, 0x28, 0x38, 0x80, 0x28, 0x28, 0x00, 0x48, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x83, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x689D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x1A, 0xA8, 0x00, 0x1B, 0x18, 0x00, 0x2A, 0x66, 0x00, 0x2B, 0x91, 0x80, 0x0A, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x0A, 0x38, 0x00, 0x0A, 0x34, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x91, 0x80, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x689F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x40, 0x80, 0x00, 0x43, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68A0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x10, 0x00, 0x1A, 0x30, 0x00, 0x28, 0x20, 0x00, 0x29, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x88, 0x80, 0x08, 0x08, 0x00, 0x18, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x3A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x1C, 0x36, 0x00, 0x1A, 0x63, 0x00, 0x18, 0xDD, 0x80, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x22, 0xF1, 0x00, 0x0E, 0x1C, 0x00, 0x19, 0x06, 0x00, 0x01, 0x10, 0x00, 0x06, 0x78, 0x00, 0x1F, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x17, 0x2A, 0x00, 0x35, 0xEB, 0x00, 0x64, 0x49, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0x18, 0x00, 0x39, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0x42, 0x00, 0x38, 0x42, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68A8, { 0x00, 0x00, 0x00, 0x03, 0x81, 0x00, 0x1E, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x06, 0x11, 0x00, 0x07, 0x11, 0x00, 0x0A, 0x91, 0x00, 0x12, 0x11, 0x00, 0x22, 0x07, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68A9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68AA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x19, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x28, 0x22, 0x00, 0x48, 0x32, 0x00, 0x08, 0x16, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68AD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x8F, 0x80, 0x09, 0xF4, 0x80, 0x18, 0x24, 0x00, 0x1C, 0x44, 0x80, 0x2A, 0xA7, 0x80, 0x29, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x84, 0x00, 0x0B, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68AE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x1A, 0xFF, 0x80, 0x18, 0x80, 0x80, 0x28, 0xBC, 0x80, 0x28, 0xA4, 0x80, 0x49, 0xA4, 0x80, 0x09, 0x24, 0x80, 0x09, 0x3D, 0x80, 0x0A, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68AF, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x28, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x18, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x3B, 0x10, 0x00, 0x29, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x08, 0x30, 0x80, 0x08, 0x50, 0x80, 0x08, 0x91, 0x00, 0x09, 0x16, 0x00, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68B0, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x1C, 0xA8, 0x80, 0x1A, 0xA8, 0x80, 0x18, 0xA9, 0x00, 0x2B, 0xF9, 0x00, 0x28, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x08, 0xAC, 0x00, 0x09, 0x2C, 0x00, 0x09, 0x14, 0x80, 0x0A, 0x22, 0x80, 0x08, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68B1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x18, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0x9C, 0x80, 0x28, 0x9A, 0x80, 0x28, 0xA9, 0x80, 0x28, 0xC8, 0x80, 0x28, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68B2, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x66, 0x00, 0x7E, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x08, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x18, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0x44, 0x80, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68B3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x18, 0x4F, 0x00, 0x1C, 0xF0, 0x80, 0x3A, 0x00, 0x00, 0x28, 0x10, 0x00, 0x28, 0x52, 0x00, 0x28, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x80, 0x09, 0x13, 0x80, 0x0A, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68B5, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x0C, 0x0C, 0x00, 0x16, 0x16, 0x00, 0x15, 0x25, 0x00, 0x24, 0x44, 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x88, 0x80, 0x02, 0x48, 0x80, 0x04, 0x28, 0x80, 0x08, 0x0F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68B6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x3F, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x06, 0x00, 0x1D, 0x18, 0x00, 0x3B, 0x70, 0x00, 0x29, 0x1F, 0x00, 0x29, 0xF0, 0x00, 0x09, 0x17, 0x80, 0x09, 0xF8, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68B9, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF0, 0x00, 0x7E, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x1C, 0x84, 0x00, 0x1A, 0x84, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68BA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x17, 0x2A, 0x00, 0x35, 0xEB, 0x00, 0x64, 0x49, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x86, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68BB, { 0x00, 0x00, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x8A, 0x80, 0x09, 0x8A, 0x80, 0x09, 0xBF, 0x80, 0x1A, 0xAA, 0x00, 0x1C, 0xAA, 0x00, 0x1A, 0xBF, 0x80, 0x28, 0x8A, 0x80, 0x28, 0x8A, 0x80, 0x48, 0x8A, 0x80, 0x08, 0x9A, 0x80, 0x08, 0x92, 0x80, 0x08, 0x92, 0x80, 0x08, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68BC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x20, 0x00, 0x18, 0x22, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x42, 0x00, 0x48, 0xD2, 0x00, 0x08, 0x9A, 0x00, 0x09, 0x8A, 0x00, 0x0B, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68C0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x07, 0x00, 0x1A, 0xFA, 0x00, 0x18, 0x00, 0x00, 0x2C, 0x20, 0x00, 0x2B, 0x24, 0x00, 0x48, 0xA6, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68C2, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x7E, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x1D, 0xFC, 0x00, 0x2A, 0x20, 0x00, 0x28, 0xA4, 0x00, 0x48, 0xA4, 0x00, 0x09, 0x28, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x08, 0x87, 0x00, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68C4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x02, 0x7E, 0x00, 0x1F, 0xC1, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68C5, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x12, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x12, 0x00, 0x28, 0xFE, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68C6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x7E, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x08, 0x7C, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x49, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68C8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x19, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x49, 0x00, 0x48, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68C9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x7F, 0x00, 0x1F, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0E, 0x7F, 0x00, 0x0D, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x24, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68CA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x62, 0x91, 0x80, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68CB, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x0C, 0x22, 0x00, 0x0E, 0x3E, 0x00, 0x15, 0x22, 0x00, 0x14, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68CC, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x59, 0x80, 0x08, 0xC8, 0x80, 0x1C, 0x80, 0x00, 0x1A, 0x08, 0x00, 0x19, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x2A, 0x00, 0x48, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68CD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x80, 0x28, 0x7D, 0x00, 0x28, 0x46, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0x7C, 0x80, 0x09, 0xC7, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68CF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x28, 0x04, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x1E, 0x1E, 0x00, 0x02, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x1F, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D1, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x7F, 0x73, 0x80, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x1C, 0x12, 0x00, 0x1A, 0x73, 0x80, 0x19, 0x12, 0x00, 0x28, 0x12, 0x00, 0x28, 0x72, 0x00, 0x48, 0xD3, 0x80, 0x08, 0x12, 0x00, 0x08, 0x32, 0x00, 0x08, 0x62, 0x00, 0x08, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x28, 0x00, 0x1D, 0xFF, 0x80, 0x3A, 0x82, 0x00, 0x29, 0x11, 0x00, 0x2A, 0x10, 0x80, 0x28, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D4, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x0C, 0x84, 0x00, 0x1A, 0x84, 0x00, 0x18, 0xE2, 0x80, 0x19, 0x81, 0x80, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x18, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x3A, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68D6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x40, 0x00, 0x1A, 0x40, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x49, 0x00, 0x68, 0x4B, 0x00, 0x48, 0x4E, 0x00, 0x08, 0x44, 0x00, 0x08, 0x46, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68D7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0xE2, 0x00, 0x09, 0x52, 0x00, 0x06, 0x4E, 0x00, 0x38, 0x03, 0x80, 0x00, 0x40, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0xE2, 0x00, 0x09, 0x52, 0x00, 0x06, 0x4E, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68D8, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x25, 0xA5, 0x80, 0x0E, 0x06, 0x00, 0x0E, 0x0E, 0x00, 0x15, 0x15, 0x00, 0x15, 0x15, 0x00, 0x14, 0xA5, 0x00, 0x24, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68D9, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x88, 0x00, 0x1A, 0x89, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x00, 0x48, 0x9C, 0x00, 0x08, 0x94, 0x00, 0x09, 0xB6, 0x00, 0x09, 0x23, 0x00, 0x0B, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68DA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x08, 0xD6, 0x80, 0x18, 0xB5, 0x80, 0x1C, 0x94, 0x80, 0x3A, 0xD6, 0x80, 0x28, 0xB5, 0x80, 0x28, 0x94, 0x80, 0x28, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x09, 0x18, 0x80, 0x09, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68DC, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x7F, 0xEA, 0x00, 0x11, 0x1B, 0x00, 0x11, 0x11, 0x80, 0x11, 0xE0, 0x00, 0x39, 0x20, 0x00, 0x35, 0x2C, 0x00, 0x57, 0x26, 0x00, 0x52, 0x23, 0x00, 0x12, 0x20, 0x00, 0x12, 0x6C, 0x00, 0x16, 0x46, 0x00, 0x14, 0x43, 0x00, 0x14, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68DD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0x88, 0x80, 0x1A, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x28, 0xA2, 0x80, 0x48, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68DF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0xFF, 0x80, 0x38, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x1C, 0x00, 0x28, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68E0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68E1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x45, 0x00, 0x11, 0x29, 0x00, 0x11, 0x01, 0x00, 0x39, 0x7D, 0x00, 0x35, 0x11, 0x00, 0x55, 0x11, 0x00, 0x51, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68E3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x18, 0x91, 0x00, 0x28, 0xDB, 0x00, 0x28, 0x5A, 0x00, 0x48, 0x14, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68E5, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x22, 0x00, 0x7D, 0x2F, 0x80, 0x08, 0xC2, 0x00, 0x08, 0x42, 0x00, 0x1C, 0xA6, 0x00, 0x1B, 0x07, 0x00, 0x1A, 0x06, 0x80, 0x28, 0x2A, 0x80, 0x29, 0x2A, 0x00, 0x48, 0xD2, 0x00, 0x08, 0x42, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68E7, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x2F, 0x80, 0x09, 0xF0, 0x00, 0x18, 0x10, 0x00, 0x1C, 0x0C, 0x80, 0x3A, 0x23, 0x80, 0x28, 0x28, 0x00, 0x28, 0x27, 0x80, 0x28, 0x38, 0x00, 0x2B, 0xD2, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x80, 0x08, 0x66, 0x80, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68E8, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x10, 0x1F, 0x80, 0x1F, 0xA1, 0x00, 0x10, 0xE2, 0x00, 0x10, 0x94, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x36, 0x00, 0x20, 0xC1, 0x80, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68EA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x80, 0x08, 0x49, 0x80, 0x7E, 0xDD, 0x00, 0x08, 0x94, 0x00, 0x08, 0x36, 0x00, 0x1C, 0x63, 0x00, 0x1A, 0xC9, 0x80, 0x1A, 0x08, 0x00, 0x28, 0x48, 0x80, 0x28, 0x49, 0x80, 0x48, 0xDD, 0x00, 0x08, 0x94, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68EB, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x08, 0x09, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x09, 0xE8, 0x00, 0x1D, 0x28, 0x80, 0x1B, 0x28, 0x80, 0x19, 0x2D, 0x80, 0x29, 0xE5, 0x00, 0x28, 0x07, 0x00, 0x48, 0xE4, 0x00, 0x09, 0x8E, 0x80, 0x08, 0x12, 0x80, 0x08, 0x63, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68EC, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x44, 0x00, 0x18, 0x82, 0x00, 0x29, 0xFF, 0x00, 0x2A, 0x85, 0x80, 0x48, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x81, 0x00, 0x08, 0x83, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68ED, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0xCF, 0x00, 0x1C, 0x89, 0x00, 0x1B, 0x99, 0x00, 0x19, 0x95, 0x00, 0x2A, 0xB3, 0x00, 0x28, 0x8A, 0x00, 0x48, 0x8E, 0x00, 0x08, 0x84, 0x00, 0x08, 0x8E, 0x00, 0x08, 0x9B, 0x00, 0x08, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68EE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x04, 0x44, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x0E, 0x0E, 0x00, 0x0D, 0x0D, 0x00, 0x14, 0x94, 0x80, 0x24, 0x24, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68EF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x7E, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x08, 0x7C, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x02, 0x00, 0x28, 0x04, 0x00, 0x28, 0x10, 0x00, 0x48, 0x18, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA1, 0x80, 0x09, 0xA2, 0x80, 0x09, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68F0, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF0, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68F1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x1C, 0xC4, 0x00, 0x1B, 0xA7, 0x80, 0x18, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x28, 0xC2, 0x00, 0x49, 0x86, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6E, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68F2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x12, 0x00, 0x1D, 0xFF, 0x80, 0x3A, 0x12, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x09, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0xEC, 0x00, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x68F5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x48, 0x56, 0x00, 0x08, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68F6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1B, 0x55, 0x00, 0x19, 0x55, 0x00, 0x28, 0x38, 0x00, 0x28, 0x38, 0x00, 0x48, 0x54, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68F9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x3A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68FA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x04, 0x80, 0x80, 0x0C, 0x00, 0x00, 0x0E, 0x7E, 0x00, 0x15, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x24, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68FB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0xF0, 0x00, 0x0E, 0x18, 0x00, 0x1B, 0xFE, 0x00, 0x31, 0x0B, 0x00, 0x03, 0x18, 0x00, 0x06, 0x30, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68FC, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x35, 0x6B, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x01, 0xE0, 0x00, 0x04, 0x18, 0x00, 0x18, 0x06, 0x00, 0x77, 0xFB, 0x80, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x06, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x68FD, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x35, 0x6B, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x88, 0x00, 0x03, 0x60, 0x00, 0x1C, 0x1C, 0x00, 0x73, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6900, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x3F, 0x00, 0x80, 0x09, 0x00, 0x80, 0x18, 0x40, 0x00, 0x1C, 0x7F, 0x00, 0x3A, 0x99, 0x00, 0x28, 0x99, 0x00, 0x29, 0x69, 0x00, 0x2A, 0x2B, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6901, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x06, 0x00, 0x28, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6904, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x66, 0x00, 0x08, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x18, 0x20, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x48, 0x46, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x77, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6905, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x28, 0x00, 0x08, 0x44, 0x00, 0x18, 0x82, 0x00, 0x1D, 0x01, 0x80, 0x3A, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x28, 0xF2, 0x00, 0x28, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6906, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x1C, 0xBE, 0x80, 0x1A, 0x88, 0x80, 0x1A, 0x80, 0x80, 0x28, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x48, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x09, 0x80, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6908, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x01, 0x00, 0x08, 0x21, 0x00, 0x09, 0x25, 0x00, 0x18, 0xA9, 0x00, 0x1D, 0xFD, 0x00, 0x1A, 0x21, 0x00, 0x28, 0x71, 0x00, 0x28, 0x69, 0x00, 0x48, 0xA5, 0x00, 0x09, 0xA1, 0x00, 0x0B, 0x23, 0x00, 0x08, 0x22, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6909, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x0F, 0x7F, 0x00, 0x39, 0x24, 0x00, 0x0B, 0x24, 0x00, 0x0E, 0x3F, 0x00, 0x78, 0x04, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x690A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x1C, 0x63, 0x00, 0x1A, 0x94, 0x80, 0x19, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x690B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x48, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x88, 0x80, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x690C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x49, 0x00, 0x09, 0x49, 0x00, 0x08, 0xC8, 0x00, 0x1D, 0x8F, 0x00, 0x1A, 0x00, 0x00, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x690D, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0xBF, 0x00, 0x1C, 0xA1, 0x00, 0x3A, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x28, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x690E, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x88, 0x00, 0x3E, 0xFF, 0x00, 0x09, 0x88, 0x00, 0x1A, 0x88, 0x00, 0x1C, 0xFF, 0x00, 0x3A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x690F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0xE7, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x28, 0xE7, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6910, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x1A, 0xFF, 0x80, 0x1A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0xBF, 0x00, 0x48, 0xA1, 0x00, 0x09, 0xA1, 0x00, 0x09, 0x21, 0x00, 0x0B, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6911, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xA1, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x48, 0x00, 0x28, 0x88, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6912, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x80, 0x3E, 0xE9, 0x00, 0x08, 0x89, 0x00, 0x18, 0x89, 0x00, 0x1F, 0xFA, 0x00, 0x3A, 0x8A, 0x00, 0x28, 0x86, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x0A, 0xA6, 0x00, 0x0A, 0xAA, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x91, 0x00, 0x09, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6913, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x7E, 0x60, 0x00, 0x08, 0xD1, 0x00, 0x09, 0x93, 0x00, 0x1D, 0xBA, 0x00, 0x1A, 0xE8, 0x00, 0x18, 0xC8, 0x00, 0x29, 0xDC, 0x00, 0x28, 0x2C, 0x00, 0x48, 0x6A, 0x00, 0x08, 0xCB, 0x00, 0x09, 0x89, 0x80, 0x08, 0x18, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6916, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x88, 0x00, 0x1A, 0x88, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x90, 0x00, 0x48, 0x9F, 0x00, 0x09, 0x91, 0x00, 0x09, 0x31, 0x00, 0x0B, 0x21, 0x00, 0x08, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6917, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x7F, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x1A, 0x48, 0x00, 0x28, 0x4F, 0x00, 0x28, 0x48, 0x00, 0x48, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0xE8, 0x00, 0x08, 0xB8, 0x00, 0x09, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6919, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x1A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x691A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x7D, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x39, 0x01, 0x00, 0x35, 0x01, 0x00, 0x55, 0x01, 0x00, 0x51, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x691B, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x1C, 0x68, 0x00, 0x1A, 0x49, 0x80, 0x18, 0xCB, 0x00, 0x29, 0xCE, 0x00, 0x2B, 0x48, 0x00, 0x48, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x80, 0x08, 0x49, 0x80, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x691C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x0B, 0x83, 0x80, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x1B, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x691F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x1C, 0x52, 0x00, 0x2B, 0x10, 0x00, 0x28, 0x90, 0x00, 0x48, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x2C, 0x00, 0x08, 0xC3, 0x00, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6920, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0x06, 0x00, 0x3F, 0xB8, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x1F, 0xBF, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xA4, 0x00, 0x02, 0x44, 0x00, 0x02, 0x84, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x0C, 0x98, 0x00, 0x30, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6921, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x17, 0xF1, 0x00, 0x11, 0x05, 0x00, 0x7D, 0x25, 0x00, 0x11, 0x25, 0x00, 0x13, 0xF5, 0x00, 0x38, 0x95, 0x00, 0x34, 0x85, 0x00, 0x50, 0x85, 0x00, 0x53, 0xE5, 0x00, 0x10, 0x85, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xF1, 0x00, 0x17, 0x81, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6922, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x7E, 0xFD, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x3A, 0x21, 0x00, 0x36, 0xFD, 0x00, 0x52, 0x21, 0x00, 0x52, 0x29, 0x00, 0x12, 0x25, 0x00, 0x12, 0x21, 0x00, 0x12, 0xFD, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6923, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x39, 0x49, 0x00, 0x35, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x51, 0x49, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6924, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x40, 0x00, 0x1C, 0x44, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x49, 0x44, 0x00, 0x0A, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x60, 0x00, 0x09, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6925, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x0F, 0x80, 0x7D, 0xE8, 0x80, 0x12, 0x88, 0x80, 0x10, 0x88, 0x80, 0x38, 0x88, 0x80, 0x37, 0xF8, 0x80, 0x50, 0x88, 0x80, 0x50, 0x88, 0x80, 0x10, 0x88, 0x80, 0x11, 0xC8, 0x80, 0x11, 0x48, 0x80, 0x11, 0x68, 0x80, 0x13, 0x2F, 0x80, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6926, { 0x00, 0x00, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x18, 0xD3, 0x00, 0x29, 0x91, 0x80, 0x28, 0x7E, 0x00, 0x48, 0x12, 0x00, 0x08, 0x32, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6927, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x81, 0x00, 0x09, 0x00, 0x80, 0x18, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x29, 0xEF, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x09, 0xE9, 0x00, 0x09, 0x2B, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6928, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x3A, 0x7F, 0x80, 0x36, 0x42, 0x00, 0x52, 0xD2, 0x00, 0x53, 0x5A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x14, 0x42, 0x00, 0x10, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x692A, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x66, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x0C, 0x24, 0x00, 0x1A, 0x24, 0x00, 0x18, 0x24, 0x00, 0x19, 0x24, 0x80, 0x29, 0xA5, 0x80, 0x28, 0xA5, 0x00, 0x48, 0xA5, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x692D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0xC8, 0x00, 0x12, 0x4A, 0x00, 0x12, 0xBF, 0x00, 0x7E, 0x88, 0x00, 0x13, 0x12, 0x00, 0x3A, 0xBF, 0x00, 0x36, 0xD2, 0x00, 0x52, 0x52, 0x00, 0x12, 0x5E, 0x00, 0x13, 0x52, 0x00, 0x12, 0x92, 0x00, 0x12, 0x1E, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x12, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6930, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x09, 0xE5, 0x00, 0x19, 0x24, 0x80, 0x1D, 0x24, 0x80, 0x3B, 0xE4, 0x80, 0x29, 0x24, 0x80, 0x29, 0x24, 0x80, 0x29, 0x7C, 0x80, 0x2B, 0xA4, 0x80, 0x08, 0x27, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6931, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x28, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x48, 0xC2, 0x00, 0x09, 0xB6, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6933, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x91, 0x00, 0x48, 0x93, 0x00, 0x08, 0x9A, 0x00, 0x08, 0xAC, 0x00, 0x08, 0xE6, 0x00, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6934, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0xDE, 0x00, 0x13, 0x92, 0x00, 0x7E, 0x12, 0x00, 0x12, 0x12, 0x00, 0x13, 0x92, 0x00, 0x3A, 0x23, 0x80, 0x36, 0x00, 0x00, 0x53, 0xBF, 0x00, 0x52, 0x11, 0x00, 0x12, 0x1B, 0x00, 0x12, 0x0E, 0x00, 0x13, 0x84, 0x00, 0x16, 0x0E, 0x00, 0x12, 0x1B, 0x00, 0x12, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6935, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x21, 0x00, 0x7D, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x00, 0x00, 0x39, 0x1F, 0x00, 0x35, 0xE1, 0x00, 0x55, 0x13, 0x00, 0x51, 0x0A, 0x00, 0x11, 0x0E, 0x00, 0x11, 0xE4, 0x00, 0x11, 0x0E, 0x00, 0x11, 0x1B, 0x00, 0x11, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6936, { 0x00, 0x00, 0x00, 0x08, 0x81, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x99, 0x00, 0x7E, 0xA5, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x44, 0x00, 0x1A, 0xC4, 0x00, 0x19, 0xA3, 0x80, 0x28, 0x7E, 0x00, 0x28, 0xC2, 0x00, 0x49, 0xA6, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x76, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6938, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x10, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x20, 0x00, 0x11, 0x04, 0x00, 0x11, 0xD5, 0x80, 0x39, 0x56, 0x80, 0x35, 0x5C, 0x80, 0x55, 0x74, 0x80, 0x51, 0x55, 0x80, 0x12, 0x54, 0x00, 0x12, 0x50, 0x00, 0x12, 0x50, 0x80, 0x16, 0x59, 0x80, 0x10, 0xCF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6939, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x29, 0xFF, 0x80, 0x28, 0xA4, 0x00, 0x48, 0xA4, 0x00, 0x08, 0xC7, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x693B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x1D, 0x41, 0x00, 0x1B, 0x7F, 0x00, 0x19, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x22, 0x00, 0x49, 0x74, 0x00, 0x09, 0x1E, 0x00, 0x09, 0x73, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x693D, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x3E, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x20, 0x00, 0x3A, 0x71, 0x00, 0x28, 0x9A, 0x00, 0x2B, 0x2C, 0x00, 0x28, 0x4C, 0x00, 0x08, 0x9A, 0x00, 0x0B, 0x2A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x0B, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x693F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x28, 0x00, 0x1D, 0xFF, 0x80, 0x3A, 0x44, 0x00, 0x28, 0x82, 0x00, 0x2B, 0x01, 0x80, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6942, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x08, 0x93, 0x00, 0x1D, 0x91, 0x80, 0x1A, 0x10, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6945, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x00, 0x00, 0x1A, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x48, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6949, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x80, 0x19, 0x20, 0x00, 0x28, 0x20, 0x00, 0x28, 0x7F, 0x80, 0x48, 0xE0, 0x80, 0x09, 0xA0, 0x80, 0x08, 0x20, 0x80, 0x08, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x694A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x29, 0x40, 0x00, 0x28, 0xFF, 0x80, 0x29, 0x11, 0x80, 0x0E, 0x22, 0x80, 0x08, 0xC4, 0x80, 0x0B, 0x08, 0x80, 0x08, 0x31, 0x00, 0x08, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x694E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x7F, 0x10, 0x80, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6953, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x3F, 0x3A, 0x00, 0x09, 0xE2, 0x00, 0x19, 0x22, 0x00, 0x1D, 0xFA, 0x00, 0x3B, 0xAA, 0x00, 0x29, 0xAA, 0x00, 0x29, 0xFA, 0x00, 0x29, 0x22, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x3A, 0x80, 0x09, 0xE5, 0x80, 0x09, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6954, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x45, 0x00, 0x09, 0xF5, 0x00, 0x18, 0x45, 0x00, 0x1D, 0xF9, 0x00, 0x3A, 0x49, 0x00, 0x28, 0x56, 0x00, 0x28, 0x30, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6955, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x88, 0x00, 0x1D, 0xFF, 0x80, 0x3A, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6957, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xC8, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x4A, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x8A, 0x00, 0x1D, 0x7E, 0x00, 0x1B, 0xC8, 0x00, 0x18, 0x7F, 0x00, 0x28, 0x48, 0x00, 0x2A, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x09, 0x68, 0x00, 0x09, 0x1F, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6959, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xE4, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0xA4, 0x00, 0x18, 0x8E, 0x00, 0x1D, 0x8E, 0x00, 0x3B, 0x95, 0x00, 0x29, 0x95, 0x00, 0x2A, 0xA4, 0x80, 0x0C, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x695A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0x1C, 0x00, 0x0A, 0xAA, 0x00, 0x12, 0x49, 0x00, 0x22, 0x88, 0x80, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x00, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x695B, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x1A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x695C, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x8F, 0x00, 0x10, 0x89, 0x00, 0x7C, 0x89, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x8F, 0x00, 0x38, 0x89, 0x00, 0x34, 0x89, 0x00, 0x53, 0xE9, 0x00, 0x52, 0x2F, 0x00, 0x12, 0x29, 0x00, 0x12, 0x29, 0x00, 0x12, 0x29, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x695D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x39, 0x93, 0x00, 0x35, 0x55, 0x00, 0x55, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x695E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x09, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x28, 0x20, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6960, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x1C, 0x80, 0x80, 0x3A, 0xA2, 0x80, 0x28, 0x94, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6961, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x78, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x09, 0x81, 0x80, 0x18, 0x7E, 0x00, 0x1C, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x28, 0xF2, 0x80, 0x28, 0x94, 0x80, 0x28, 0xF9, 0x00, 0x28, 0x9A, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x95, 0x00, 0x08, 0x92, 0x80, 0x08, 0xB2, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6962, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x81, 0x00, 0x09, 0x00, 0x80, 0x18, 0xFF, 0x00, 0x1C, 0x24, 0x00, 0x3A, 0xFF, 0x00, 0x28, 0xA5, 0x00, 0x28, 0xA5, 0x00, 0x28, 0xC7, 0x00, 0x28, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6963, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x88, 0x80, 0x1F, 0x88, 0x80, 0x04, 0xFF, 0x80, 0x0C, 0x80, 0x00, 0x0E, 0x80, 0x00, 0x15, 0xBF, 0x00, 0x14, 0xA1, 0x00, 0x24, 0xBF, 0x00, 0x04, 0xA1, 0x00, 0x04, 0xBF, 0x00, 0x04, 0xA1, 0x00, 0x05, 0x3F, 0x00, 0x05, 0x21, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6964, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0xA9, 0x00, 0x09, 0x29, 0x00, 0x08, 0xC9, 0x00, 0x1C, 0x71, 0x00, 0x1A, 0x99, 0x00, 0x19, 0x23, 0x00, 0x28, 0x46, 0x00, 0x28, 0x10, 0x00, 0x48, 0x58, 0x00, 0x09, 0x4B, 0x00, 0x09, 0x45, 0x80, 0x0B, 0x4C, 0x80, 0x0A, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6965, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x52, 0x00, 0x7E, 0xDB, 0x00, 0x08, 0x89, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x28, 0xC2, 0x00, 0x49, 0x86, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6E, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6966, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x00, 0x80, 0x09, 0x7E, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x42, 0x00, 0x18, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6968, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x18, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6969, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x7D, 0x88, 0x00, 0x11, 0x7F, 0x80, 0x13, 0x48, 0x80, 0x13, 0x7F, 0x80, 0x39, 0x48, 0x80, 0x35, 0x7F, 0x80, 0x55, 0x08, 0x00, 0x51, 0x28, 0x00, 0x11, 0x18, 0x00, 0x11, 0x1C, 0x00, 0x11, 0x16, 0x00, 0x11, 0x33, 0x00, 0x11, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x696A, { 0x00, 0x00, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x9E, 0x00, 0x38, 0x80, 0x00, 0x34, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x696B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9F, 0x80, 0x0B, 0xE2, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x696C, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x40, 0x00, 0x18, 0xFF, 0x80, 0x29, 0x90, 0x80, 0x2B, 0x10, 0x80, 0x49, 0x38, 0x80, 0x09, 0x6C, 0x80, 0x09, 0x01, 0x80, 0x09, 0xF9, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x696D, { 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x08, 0xA2, 0x00, 0x04, 0xA4, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x696E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x80, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x14, 0x00, 0x1B, 0xFF, 0x80, 0x1C, 0x14, 0x00, 0x3A, 0x22, 0x00, 0x28, 0xC0, 0x00, 0x2B, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x696F, { 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x09, 0xE0, 0x00, 0x09, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x10, 0x00, 0x1D, 0x10, 0x00, 0x3B, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6970, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0xD0, 0x00, 0x09, 0x97, 0x00, 0x7F, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xD7, 0x00, 0x1D, 0x11, 0x00, 0x1B, 0x11, 0x00, 0x19, 0xD7, 0x00, 0x28, 0x10, 0x00, 0x28, 0x38, 0x00, 0x48, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6971, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x28, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x44, 0x00, 0x18, 0x82, 0x00, 0x29, 0x7D, 0x80, 0x28, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6972, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x08, 0x04, 0x80, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x09, 0x74, 0x00, 0x1D, 0x04, 0x80, 0x1B, 0x24, 0x80, 0x19, 0xFD, 0x80, 0x29, 0x55, 0x00, 0x29, 0x57, 0x00, 0x49, 0x72, 0x00, 0x09, 0x2A, 0x80, 0x09, 0x46, 0x80, 0x09, 0x0B, 0x80, 0x0A, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6973, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x1A, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x48, 0x56, 0x00, 0x08, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6974, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x08, 0x66, 0x00, 0x08, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x1B, 0x10, 0x80, 0x19, 0x10, 0x80, 0x28, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x97, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6975, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xF0, 0x00, 0x1C, 0x17, 0x00, 0x1A, 0x11, 0x00, 0x39, 0xD1, 0x00, 0x29, 0x5A, 0x00, 0x29, 0x56, 0x00, 0x29, 0xD3, 0x00, 0x08, 0x14, 0x80, 0x08, 0x68, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6977, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x89, 0x80, 0x3E, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x18, 0x88, 0x80, 0x1C, 0xB8, 0x80, 0x3B, 0xCF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x20, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6978, { 0x00, 0x00, 0x00, 0x08, 0x34, 0x00, 0x09, 0xC5, 0x00, 0x08, 0x44, 0x80, 0x3E, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x1C, 0xC4, 0x00, 0x3A, 0xE4, 0x00, 0x29, 0x54, 0x00, 0x29, 0x44, 0x00, 0x29, 0x4A, 0x00, 0x0A, 0x4A, 0x00, 0x0A, 0x4A, 0x00, 0x08, 0x51, 0x00, 0x08, 0x51, 0x00, 0x08, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6979, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x90, 0x80, 0x1D, 0x50, 0x80, 0x1A, 0x20, 0x80, 0x38, 0xD9, 0x00, 0x2B, 0x06, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x697A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x26, 0x00, 0x7F, 0x18, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x29, 0x00, 0x1C, 0x2A, 0x00, 0x1A, 0x48, 0x00, 0x1A, 0x88, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x697B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x697C, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x08, 0x49, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x1C, 0x6B, 0x00, 0x1A, 0xC9, 0x80, 0x1A, 0x00, 0x00, 0x28, 0x10, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x22, 0x00, 0x08, 0x46, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x17, 0x00, 0x08, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x697D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x83, 0x00, 0x1B, 0xF6, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x1A, 0x16, 0x00, 0x33, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x697E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x1A, 0xFE, 0x00, 0x1A, 0x11, 0x00, 0x29, 0xD3, 0x00, 0x28, 0x5A, 0x00, 0x48, 0xD4, 0x00, 0x08, 0x96, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x697F, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF0, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x1C, 0xD6, 0x00, 0x1B, 0x93, 0x00, 0x19, 0x11, 0x80, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6980, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x00, 0x00, 0x19, 0xEF, 0x80, 0x29, 0x28, 0x80, 0x29, 0x28, 0x80, 0x49, 0x28, 0x80, 0x09, 0x28, 0x80, 0x09, 0x28, 0x80, 0x09, 0xEF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6981, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x01, 0x00, 0x09, 0x01, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x44, 0x00, 0x1A, 0xFE, 0x00, 0x28, 0x12, 0x00, 0x28, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6982, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xDF, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x7F, 0xCA, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x3B, 0xDF, 0x80, 0x36, 0x02, 0x00, 0x32, 0x02, 0x00, 0x52, 0x46, 0x00, 0x12, 0x46, 0x00, 0x12, 0x6A, 0x00, 0x13, 0xAA, 0x80, 0x16, 0x12, 0x80, 0x10, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6984, { 0x00, 0x00, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x90, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0x9F, 0x00, 0x7E, 0xA8, 0x00, 0x0A, 0xC4, 0x00, 0x18, 0x04, 0x00, 0x1D, 0xFE, 0x00, 0x2B, 0x04, 0x00, 0x29, 0x24, 0x00, 0x49, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x54, 0x00, 0x08, 0x51, 0x00, 0x08, 0x91, 0x00, 0x0B, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6986, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x30, 0x00, 0x08, 0x48, 0x00, 0x08, 0x84, 0x00, 0x7F, 0x7B, 0x00, 0x0A, 0x00, 0x00, 0x19, 0xE2, 0x00, 0x1D, 0x2A, 0x00, 0x2B, 0x2A, 0x00, 0x29, 0xEA, 0x00, 0x49, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0xE2, 0x00, 0x09, 0x22, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x64, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6987, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x52, 0x00, 0x1B, 0xFF, 0x00, 0x1C, 0x20, 0x00, 0x2A, 0x24, 0x00, 0x2B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x0A, 0x22, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6988, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x0A, 0xFA, 0x00, 0x1A, 0x8A, 0x00, 0x1E, 0x8A, 0x00, 0x2A, 0xFA, 0x00, 0x2A, 0x02, 0x00, 0x4A, 0xFA, 0x00, 0x0A, 0x8A, 0x00, 0x0A, 0x8A, 0x00, 0x0A, 0xFA, 0x00, 0x0A, 0x0A, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6989, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x24, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x50, 0x00, 0x1C, 0x88, 0x00, 0x2B, 0x24, 0x00, 0x2A, 0xFB, 0x00, 0x4C, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x698A, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7F, 0xEF, 0x80, 0x08, 0x2A, 0x80, 0x08, 0x6A, 0x80, 0x1C, 0x4A, 0x80, 0x1A, 0xCF, 0x80, 0x18, 0xAA, 0x80, 0x29, 0xAA, 0x80, 0x2A, 0x8A, 0x80, 0x48, 0x8F, 0x80, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x698D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x1C, 0x95, 0x00, 0x1A, 0xA4, 0x80, 0x18, 0xBF, 0x80, 0x28, 0xA0, 0x80, 0x28, 0xBF, 0x80, 0x48, 0xA0, 0x80, 0x09, 0xBF, 0x80, 0x09, 0x20, 0x80, 0x0B, 0x20, 0x80, 0x08, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x698E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x20, 0x00, 0x48, 0x7F, 0x00, 0x09, 0xC3, 0x00, 0x08, 0x66, 0x00, 0x08, 0x3C, 0x00, 0x09, 0xE7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6991, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x35, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6992, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x20, 0x80, 0x7C, 0x20, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x3B, 0xEF, 0x80, 0x34, 0xA2, 0x80, 0x55, 0xA6, 0x80, 0x53, 0x2C, 0x80, 0x10, 0xE3, 0x80, 0x11, 0xA6, 0x80, 0x13, 0x2C, 0x80, 0x10, 0x61, 0x80, 0x11, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6994, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x8F, 0x80, 0x13, 0xE8, 0x80, 0x7E, 0x29, 0x80, 0x12, 0x29, 0x00, 0x13, 0xEB, 0x00, 0x3A, 0x2A, 0x00, 0x36, 0x29, 0x00, 0x53, 0xE8, 0x80, 0x52, 0x08, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x12, 0xEB, 0x80, 0x13, 0xA8, 0x00, 0x16, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6995, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x08, 0x14, 0x00, 0x18, 0x22, 0x00, 0x1C, 0xC9, 0x80, 0x3A, 0x14, 0x00, 0x28, 0x22, 0x00, 0x28, 0xC1, 0x80, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6996, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x23, 0x80, 0x7F, 0x80, 0x00, 0x40, 0xBF, 0x00, 0x5E, 0x91, 0x00, 0x00, 0x11, 0x00, 0x04, 0x1B, 0x00, 0x7F, 0x8E, 0x00, 0x15, 0x04, 0x00, 0x35, 0x8E, 0x00, 0x64, 0xDB, 0x00, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6998, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3F, 0x80, 0x3F, 0x90, 0x00, 0x64, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x0A, 0x1F, 0x00, 0x1B, 0x10, 0x00, 0x31, 0xBF, 0x80, 0x60, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x699B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x28, 0x00, 0x1D, 0xFF, 0x80, 0x3A, 0x44, 0x00, 0x28, 0x9E, 0x00, 0x2B, 0x71, 0x80, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x699C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x24, 0x00, 0x18, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x3B, 0x10, 0x80, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x41, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69A0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x7F, 0x7D, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x7C, 0x00, 0x1A, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x28, 0x7C, 0x00, 0x28, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69A1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x30, 0x00, 0x1A, 0x46, 0x00, 0x19, 0x98, 0x00, 0x28, 0x61, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x11, 0x80, 0x08, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69A5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x3B, 0x11, 0x00, 0x28, 0x92, 0x00, 0x28, 0x54, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69A6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x7F, 0x94, 0x00, 0x08, 0x36, 0x00, 0x3F, 0x63, 0x00, 0x21, 0xC9, 0x80, 0x21, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x08, 0x00, 0x21, 0x1C, 0x00, 0x3F, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x7F, 0xAB, 0x00, 0x08, 0x49, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69A7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x3E, 0x94, 0x00, 0x08, 0x94, 0x00, 0x18, 0xF7, 0x80, 0x1C, 0x94, 0x00, 0x3A, 0xF7, 0x00, 0x28, 0x94, 0x00, 0x28, 0xF7, 0x80, 0x28, 0x94, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69A8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x24, 0x80, 0x09, 0x64, 0x80, 0x08, 0xC4, 0x00, 0x1D, 0x87, 0x80, 0x1A, 0x40, 0x00, 0x18, 0x7F, 0x80, 0x28, 0xD0, 0x00, 0x29, 0x9F, 0x80, 0x48, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69AB, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0xCC, 0x00, 0x08, 0x88, 0x00, 0x7E, 0xFF, 0x80, 0x09, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x88, 0x00, 0x1A, 0xFF, 0x00, 0x18, 0x88, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69AD, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x81, 0x00, 0x11, 0xE1, 0x00, 0x7D, 0x21, 0x00, 0x11, 0x3F, 0x80, 0x11, 0xE1, 0x00, 0x11, 0x21, 0x00, 0x39, 0xE1, 0x00, 0x35, 0x29, 0x00, 0x55, 0x2D, 0x00, 0x53, 0xF5, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x11, 0xA1, 0x00, 0x13, 0x21, 0x00, 0x10, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69AE, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x14, 0x94, 0x80, 0x15, 0x15, 0x00, 0x24, 0x24, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69AF, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x1B, 0x21, 0x00, 0x19, 0x21, 0x00, 0x29, 0x3F, 0x80, 0x29, 0x21, 0x00, 0x49, 0xE9, 0x00, 0x08, 0x0D, 0x00, 0x08, 0x05, 0x00, 0x08, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69B1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x28, 0x28, 0x80, 0x28, 0x69, 0x80, 0x49, 0xCD, 0x00, 0x08, 0x44, 0x00, 0x08, 0x46, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69B2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0xBA, 0x00, 0x08, 0xAA, 0x00, 0x1C, 0xC6, 0x00, 0x1A, 0xFE, 0x00, 0x1A, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x49, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69B4, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0xDF, 0x80, 0x08, 0x84, 0x80, 0x3E, 0x84, 0x80, 0x08, 0x94, 0x80, 0x18, 0x98, 0x80, 0x1C, 0xF7, 0x00, 0x3B, 0x80, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69B7, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x20, 0x80, 0x09, 0x64, 0x80, 0x08, 0x48, 0x00, 0x1C, 0xFF, 0x00, 0x1B, 0x88, 0x00, 0x18, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x48, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69B8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x3F, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x3F, 0x80, 0x13, 0xE4, 0x80, 0x11, 0x24, 0x80, 0x39, 0x3F, 0x80, 0x35, 0x04, 0x00, 0x55, 0x04, 0x00, 0x51, 0x3F, 0x80, 0x11, 0xC4, 0x00, 0x13, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x7F, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69BA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x34, 0x48, 0x00, 0x2C, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x86, 0x00, 0x35, 0x93, 0x00, 0x2F, 0x11, 0x80, 0x25, 0xFF, 0x00, 0x24, 0x54, 0x00, 0x24, 0xD6, 0x00, 0x65, 0x93, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69BB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x52, 0x80, 0x28, 0x94, 0x80, 0x09, 0x39, 0x80, 0x0A, 0x52, 0x80, 0x08, 0x94, 0x80, 0x09, 0x18, 0x80, 0x0A, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69BC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x20, 0x00, 0x1A, 0x24, 0x00, 0x18, 0x5E, 0x00, 0x29, 0xF3, 0x00, 0x28, 0x00, 0x00, 0x48, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69BE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x9E, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x33, 0xFF, 0x80, 0x3A, 0x00, 0x80, 0x54, 0xFE, 0x00, 0x50, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69BF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x38, 0x00, 0x00, 0x34, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x50, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x28, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69C1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0C, 0x3E, 0x00, 0x0E, 0x22, 0x00, 0x15, 0x3E, 0x00, 0x14, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x04, 0x5D, 0x00, 0x04, 0x55, 0x00, 0x04, 0x55, 0x00, 0x04, 0x5D, 0x00, 0x04, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69C3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x80, 0x15, 0x23, 0x80, 0x17, 0xC0, 0x00, 0x3D, 0x7F, 0x00, 0x15, 0x22, 0x00, 0x15, 0x14, 0x00, 0x21, 0x0C, 0x00, 0x23, 0x53, 0x80, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69C5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x80, 0x19, 0x94, 0x80, 0x28, 0xA4, 0x80, 0x28, 0xC3, 0x80, 0x48, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69C7, { 0x00, 0x00, 0x00, 0x08, 0x43, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x40, 0x80, 0x7E, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x08, 0xBF, 0x00, 0x1C, 0xA1, 0x00, 0x1A, 0xBF, 0x00, 0x1A, 0xA1, 0x00, 0x28, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x48, 0xBF, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69C8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7F, 0xBF, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0xB1, 0x00, 0x1A, 0xAA, 0x00, 0x19, 0xB4, 0x00, 0x28, 0xA3, 0x80, 0x28, 0x82, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x09, 0xA2, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69CA, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0A, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x1F, 0x00, 0x24, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x08, 0x23, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69CB, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x1C, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69CC, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x1F, 0x00, 0x3E, 0x11, 0x00, 0x09, 0x11, 0x00, 0x18, 0x9F, 0x00, 0x1C, 0x10, 0x00, 0x3A, 0x10, 0x00, 0x28, 0x1F, 0x00, 0x29, 0xD1, 0x00, 0x28, 0x51, 0x00, 0x28, 0x51, 0x00, 0x08, 0x5F, 0x00, 0x08, 0x50, 0x00, 0x08, 0xBF, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69CD, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x3F, 0x81, 0x80, 0x08, 0x7E, 0x00, 0x18, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69CE, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x20, 0x00, 0x28, 0x40, 0x00, 0x48, 0xFF, 0x00, 0x0B, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69D0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x38, 0xFE, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x4D, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x88, 0x80, 0x09, 0x08, 0x80, 0x0A, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x0C, 0x0C, 0x00, 0x0E, 0x1C, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x24, 0xC9, 0x00, 0x44, 0xC8, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69D3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69D4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x7F, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x1C, 0x40, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x49, 0x24, 0x00, 0x0A, 0x23, 0x00, 0x0D, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69D6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x1A, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69D7, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xC1, 0x00, 0x1D, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x1A, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x48, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69D8, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x29, 0x91, 0x80, 0x28, 0xDB, 0x00, 0x48, 0x1C, 0x00, 0x08, 0x76, 0x00, 0x09, 0xD3, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69D9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69DB, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x48, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x5F, 0x00, 0x7F, 0x68, 0x00, 0x09, 0x46, 0x00, 0x19, 0x42, 0x00, 0x1C, 0x40, 0x00, 0x2A, 0x04, 0x00, 0x29, 0xFE, 0x00, 0x49, 0x54, 0x00, 0x09, 0x54, 0x00, 0x09, 0x54, 0x00, 0x09, 0x54, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69DD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x80, 0x00, 0x1A, 0xFF, 0x80, 0x28, 0x80, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x41, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xFB, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69DE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x80, 0x08, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69DF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x7C, 0x1A, 0x00, 0x08, 0xE0, 0x00, 0x18, 0x84, 0x00, 0x1C, 0xFE, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x48, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x88, 0x00, 0x09, 0x06, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69E0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x09, 0x12, 0x00, 0x09, 0x7E, 0x00, 0x7C, 0x14, 0x00, 0x0B, 0x18, 0x00, 0x19, 0xFF, 0x00, 0x1D, 0x20, 0x00, 0x2B, 0x7E, 0x00, 0x29, 0xA2, 0x00, 0x49, 0x22, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x62, 0x00, 0x09, 0xA2, 0x00, 0x09, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69E2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x80, 0x08, 0x61, 0x80, 0x7D, 0xA6, 0x80, 0x08, 0x2C, 0x80, 0x08, 0xE3, 0x80, 0x1D, 0xAE, 0x80, 0x1A, 0x20, 0x80, 0x1A, 0x10, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69E5, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xEF, 0x80, 0x7E, 0x42, 0x00, 0x08, 0xE7, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x6F, 0x80, 0x1A, 0xC2, 0x00, 0x1A, 0x42, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x01, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69E7, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x7F, 0xC7, 0x00, 0x04, 0x1C, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x22, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x0C, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69E8, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x47, 0x80, 0x0B, 0xFC, 0x80, 0x3E, 0x04, 0x80, 0x09, 0xF5, 0x00, 0x19, 0x14, 0x80, 0x1D, 0xF4, 0x80, 0x3A, 0x04, 0x80, 0x29, 0xF4, 0x80, 0x28, 0x24, 0x80, 0x28, 0x44, 0x80, 0x2B, 0xFC, 0x80, 0x08, 0x44, 0x80, 0x08, 0x44, 0x80, 0x08, 0x45, 0x00, 0x08, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69EA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x3F, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x19, 0xEA, 0x00, 0x1D, 0x2A, 0x00, 0x1B, 0x3F, 0x80, 0x29, 0xE2, 0x00, 0x29, 0x02, 0x00, 0x29, 0xE6, 0x00, 0x09, 0x06, 0x00, 0x09, 0xEA, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x80, 0x09, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69EB, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x35, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x50, 0x12, 0x00, 0x10, 0x7F, 0x00, 0x13, 0xC1, 0x80, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69ED, { 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x10, 0x04, 0x80, 0x10, 0x04, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0x24, 0x00, 0x39, 0x34, 0x80, 0x35, 0x24, 0x80, 0x55, 0xFD, 0x80, 0x51, 0x25, 0x00, 0x11, 0x27, 0x00, 0x11, 0x72, 0x00, 0x11, 0xAA, 0x00, 0x13, 0x26, 0x80, 0x12, 0x6A, 0x80, 0x16, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69EE, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x01, 0x00, 0x08, 0x42, 0x00, 0x08, 0x94, 0x80, 0x1D, 0xFF, 0x80, 0x1A, 0x18, 0x00, 0x18, 0x66, 0x00, 0x29, 0xC3, 0x80, 0x28, 0x08, 0x00, 0x48, 0xF2, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x71, 0x00, 0x08, 0x06, 0x00, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69EF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0x48, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x88, 0x00, 0x19, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x48, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69F1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0xFF, 0x80, 0x08, 0xA4, 0x80, 0x1C, 0xA4, 0x80, 0x1A, 0xC3, 0x80, 0x29, 0x80, 0x80, 0x28, 0xFF, 0x80, 0x48, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69F2, { 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x11, 0xE1, 0x00, 0x13, 0x29, 0x00, 0x7A, 0x4D, 0x00, 0x17, 0xE5, 0x00, 0x12, 0xA1, 0x00, 0x3A, 0xA9, 0x00, 0x37, 0xED, 0x00, 0x52, 0xA5, 0x00, 0x52, 0xA1, 0x00, 0x13, 0xE1, 0x80, 0x12, 0x27, 0x00, 0x12, 0x2D, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x14, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69F3, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x22, 0x3F, 0x00, 0x22, 0xE9, 0x00, 0x3E, 0x2E, 0x00, 0x02, 0xF8, 0x00, 0x7E, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x32, 0x62, 0x00, 0x62, 0x26, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0E, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69F5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x18, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x08, 0x00, 0x08, 0xAD, 0x80, 0x08, 0xA4, 0x80, 0x09, 0xB1, 0x00, 0x09, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69F9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x1A, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x19, 0xD7, 0x00, 0x28, 0x10, 0x00, 0x29, 0xD7, 0x00, 0x48, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69FB, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xF1, 0x00, 0x08, 0x9F, 0x00, 0x18, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1B, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x28, 0xD1, 0x00, 0x28, 0xBF, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x80, 0x0A, 0x12, 0x80, 0x0A, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69FD, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x24, 0x80, 0x1D, 0xFF, 0x80, 0x3B, 0x24, 0x80, 0x29, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x69FE, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x5D, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x5D, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x94, 0x80, 0x18, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x63, 0x00, 0x08, 0x36, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x76, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x69FF, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0xFF, 0x80, 0x1F, 0x22, 0x00, 0x04, 0x3E, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A00, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x1D, 0x00, 0x80, 0x1B, 0x10, 0x80, 0x19, 0x7E, 0x80, 0x29, 0x10, 0x80, 0x29, 0x7E, 0x80, 0x49, 0x42, 0x80, 0x09, 0x42, 0x80, 0x09, 0x7E, 0x80, 0x09, 0x00, 0x80, 0x09, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A01, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x18, 0x91, 0x00, 0x29, 0x66, 0x80, 0x28, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x6E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A02, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x11, 0xF9, 0x00, 0x25, 0x15, 0x00, 0x15, 0xF2, 0x00, 0x09, 0x15, 0x00, 0x15, 0xFB, 0x80, 0x3B, 0x1C, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A03, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x87, 0x80, 0x09, 0xF4, 0x80, 0x7F, 0x14, 0x80, 0x09, 0x14, 0x80, 0x09, 0xF7, 0x80, 0x1D, 0x14, 0x80, 0x1B, 0x14, 0x80, 0x19, 0xF4, 0x80, 0x29, 0x07, 0x80, 0x29, 0x4C, 0x80, 0x49, 0x54, 0x80, 0x09, 0x24, 0x80, 0x09, 0xE4, 0x80, 0x0B, 0x14, 0x80, 0x08, 0x09, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A05, { 0x00, 0x00, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x11, 0x77, 0x00, 0x7D, 0x55, 0x00, 0x12, 0x55, 0x00, 0x18, 0x88, 0x00, 0x34, 0x88, 0x00, 0x31, 0x08, 0x00, 0x53, 0x2F, 0x00, 0x51, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x38, 0x00, 0x11, 0x6E, 0x00, 0x11, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A0A, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0x22, 0x00, 0x3E, 0xDF, 0x80, 0x19, 0x26, 0x00, 0x1C, 0x07, 0x00, 0x2A, 0xAA, 0x80, 0x28, 0xD2, 0x00, 0x09, 0x22, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x0C, 0x0C, 0x00, 0x30, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A0B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x13, 0x02, 0x00, 0x7D, 0x34, 0x00, 0x10, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x38, 0x49, 0x00, 0x37, 0x7F, 0x00, 0x51, 0x49, 0x00, 0x51, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x13, 0x4B, 0x00, 0x12, 0x80, 0x00, 0x16, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A0C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0xFE, 0x00, 0x1A, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A0F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x24, 0x00, 0x1A, 0xC9, 0x00, 0x28, 0x51, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x10, 0x80, 0x08, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x91, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A11, { 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x08, 0xBF, 0x00, 0x0A, 0x49, 0x00, 0x3D, 0x99, 0x00, 0x08, 0x49, 0x00, 0x18, 0x95, 0x00, 0x1D, 0x21, 0x00, 0x3A, 0x06, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A12, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x21, 0x00, 0x11, 0x15, 0x00, 0x10, 0xA4, 0x00, 0x38, 0xA9, 0x00, 0x35, 0x30, 0x80, 0x54, 0x62, 0x00, 0x51, 0xDE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A13, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0B, 0x88, 0x00, 0x08, 0x7C, 0x00, 0x0B, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A14, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x92, 0x00, 0x08, 0xDB, 0x00, 0x7E, 0x49, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A15, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x13, 0xE4, 0x00, 0x7C, 0x8F, 0x80, 0x13, 0xE8, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xB2, 0x80, 0x3A, 0xA2, 0x00, 0x37, 0xE2, 0x00, 0x54, 0x86, 0x00, 0x51, 0xC5, 0x00, 0x11, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x12, 0x8D, 0x00, 0x10, 0x89, 0x80, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A17, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x18, 0x6B, 0x00, 0x1C, 0x6B, 0x00, 0x3A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A18, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x0A, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x18, 0xFA, 0x00, 0x1C, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x28, 0xF8, 0x00, 0x48, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A19, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x18, 0x94, 0x80, 0x1C, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A1A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x1D, 0x24, 0x80, 0x1B, 0x24, 0x80, 0x19, 0xFF, 0x80, 0x29, 0x44, 0x00, 0x29, 0x45, 0x80, 0x49, 0x77, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0A, 0x74, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A1B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x63, 0x00, 0x7E, 0xA5, 0x00, 0x08, 0x63, 0x00, 0x08, 0xA5, 0x00, 0x1C, 0x11, 0x00, 0x1A, 0x38, 0x00, 0x18, 0xEE, 0x00, 0x2B, 0x83, 0x80, 0x28, 0x10, 0x00, 0x48, 0xE4, 0x00, 0x08, 0x19, 0x00, 0x08, 0xE2, 0x00, 0x08, 0x0C, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A1D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x90, 0x80, 0x08, 0xFF, 0x00, 0x1C, 0x90, 0x00, 0x1A, 0x8F, 0x00, 0x18, 0x80, 0x00, 0x28, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x48, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A1E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x18, 0x91, 0x00, 0x1C, 0x9F, 0x00, 0x3A, 0x80, 0x00, 0x28, 0x80, 0x00, 0x28, 0xBB, 0x80, 0x28, 0xAA, 0x80, 0x08, 0xBB, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A1F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A20, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0xFF, 0x80, 0x1A, 0x88, 0x80, 0x28, 0xEE, 0x80, 0x28, 0xAA, 0x80, 0x48, 0xAA, 0x80, 0x08, 0xDD, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A21, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A22, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x80, 0x00, 0x1A, 0xFF, 0x80, 0x28, 0x80, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x01, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x0A, 0x03, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A23, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x28, 0x78, 0x80, 0x28, 0x09, 0x00, 0x29, 0xFE, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x0B, 0x08, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A24, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x9F, 0x80, 0x7D, 0x11, 0x00, 0x11, 0x2A, 0x00, 0x13, 0x44, 0x00, 0x11, 0x4A, 0x00, 0x39, 0x71, 0x80, 0x35, 0x44, 0x00, 0x55, 0x44, 0x00, 0x51, 0x7F, 0x80, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x35, 0x80, 0x11, 0x24, 0x80, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A28, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7F, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x1C, 0xEB, 0x00, 0x1A, 0x88, 0x00, 0x1A, 0xEB, 0x00, 0x28, 0x80, 0x00, 0x28, 0xA8, 0x00, 0x48, 0xBF, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x7F, 0x80, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A29, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0xA0, 0x00, 0x09, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x1C, 0x48, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x29, 0xFF, 0x00, 0x4A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A2A, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x1B, 0x11, 0x00, 0x19, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A2B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xE0, 0x00, 0x12, 0x9F, 0x00, 0x7E, 0x89, 0x00, 0x13, 0xEB, 0x00, 0x12, 0x2E, 0x00, 0x1B, 0xE4, 0x00, 0x36, 0x8E, 0x00, 0x32, 0x9B, 0x00, 0x33, 0xE1, 0x80, 0x50, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A2E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x39, 0x49, 0x00, 0x35, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x50, 0x11, 0x00, 0x10, 0x93, 0x00, 0x11, 0xBA, 0x00, 0x11, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A2F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x7D, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x1B, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x2B, 0xFE, 0x00, 0x2A, 0x02, 0x00, 0x4A, 0xFA, 0x00, 0x0A, 0x8A, 0x00, 0x0A, 0xFA, 0x00, 0x0A, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A30, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x08, 0xD6, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xD6, 0x00, 0x1A, 0x10, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x01, 0x00, 0x48, 0x01, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A31, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0xD6, 0x00, 0x7E, 0xD6, 0x00, 0x0B, 0x5A, 0x00, 0x1D, 0x8C, 0x00, 0x1A, 0x52, 0x00, 0x28, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x08, 0xD8, 0x00, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A32, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x08, 0x04, 0x80, 0x09, 0xFF, 0x80, 0x7E, 0x04, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x04, 0x00, 0x1D, 0xFE, 0x00, 0x1A, 0x02, 0x00, 0x1A, 0xFA, 0x00, 0x28, 0x8A, 0x00, 0x28, 0xFA, 0x00, 0x48, 0x8B, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x09, 0x8D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A34, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x45, 0x00, 0x09, 0xF5, 0x80, 0x7E, 0x04, 0x80, 0x09, 0x14, 0x00, 0x08, 0xA4, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x04, 0x00, 0x19, 0xF5, 0x00, 0x29, 0x15, 0x00, 0x29, 0x17, 0x00, 0x49, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x80, 0x09, 0xF7, 0x80, 0x08, 0x0D, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A35, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x28, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x18, 0x7F, 0x00, 0x1C, 0x48, 0x00, 0x3A, 0x48, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x48, 0x00, 0x28, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x08, 0x00, 0x00, 0x08, 0xA5, 0x00, 0x09, 0x12, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A36, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x35, 0x20, 0x00, 0x55, 0xEF, 0x00, 0x51, 0x25, 0x00, 0x11, 0xE5, 0x00, 0x11, 0x27, 0x00, 0x11, 0x22, 0x00, 0x11, 0xE7, 0x00, 0x13, 0x2D, 0x80, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A37, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x35, 0x6B, 0x00, 0x64, 0xC9, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x84, 0x00, 0x1F, 0x8A, 0x00, 0x70, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A38, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x09, 0x29, 0x00, 0x08, 0xAA, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x18, 0x44, 0x00, 0x1D, 0xFF, 0x00, 0x3A, 0x10, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A39, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFA, 0x00, 0x08, 0x42, 0x00, 0x1B, 0xFF, 0x80, 0x1C, 0x02, 0x00, 0x3B, 0xF2, 0x00, 0x29, 0x1A, 0x00, 0x29, 0x16, 0x00, 0x29, 0xF2, 0x00, 0x08, 0x22, 0x00, 0x09, 0x22, 0x00, 0x08, 0xBA, 0x00, 0x0B, 0xC2, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A3A, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x3E, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A3B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0x7F, 0x00, 0x19, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A3D, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x18, 0xFF, 0x00, 0x1C, 0xA5, 0x00, 0x3A, 0xC7, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A3E, { 0x00, 0x00, 0x00, 0x10, 0x85, 0x00, 0x10, 0x85, 0x80, 0x13, 0xE4, 0x80, 0x78, 0x9F, 0x80, 0x10, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x95, 0x00, 0x38, 0x95, 0x00, 0x34, 0xF5, 0x00, 0x50, 0x92, 0x00, 0x52, 0x9A, 0x00, 0x12, 0xB2, 0x80, 0x12, 0x85, 0x80, 0x13, 0x89, 0x00, 0x16, 0x60, 0x00, 0x14, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A3F, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x80, 0x09, 0x28, 0x80, 0x09, 0x28, 0x80, 0x7D, 0xEF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A44, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x19, 0x29, 0x00, 0x1D, 0x29, 0x00, 0x2B, 0xF9, 0x00, 0x29, 0x29, 0x00, 0x29, 0x26, 0x00, 0x29, 0xE6, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0xE5, 0x00, 0x0F, 0x29, 0x00, 0x08, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A45, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0xD5, 0x00, 0x09, 0x55, 0x00, 0x08, 0x55, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x55, 0x00, 0x18, 0x55, 0x00, 0x28, 0x55, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x55, 0x00, 0x08, 0xD5, 0x80, 0x08, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A46, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x29, 0x24, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x14, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x35, 0x6B, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A47, { 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x7D, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x38, 0x21, 0x00, 0x34, 0x1F, 0x00, 0x50, 0xC2, 0x00, 0x53, 0x9C, 0x00, 0x11, 0x04, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x04, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x24, 0x80, 0x10, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A48, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x1D, 0xFF, 0x00, 0x3A, 0x44, 0x00, 0x28, 0x74, 0x00, 0x29, 0xDF, 0x80, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x88, 0x80, 0x0B, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A49, { 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x1D, 0x93, 0x80, 0x1A, 0x90, 0x00, 0x18, 0xE2, 0x00, 0x29, 0x3F, 0x80, 0x29, 0x2A, 0x00, 0x49, 0xAA, 0x00, 0x08, 0x6F, 0x80, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A4A, { 0x00, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x7E, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x1C, 0xF7, 0x80, 0x1A, 0x14, 0x00, 0x19, 0x14, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A4B, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x18, 0xFE, 0x00, 0x1D, 0x45, 0x80, 0x3A, 0x7C, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A4E, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x54, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x54, 0x00, 0x1A, 0x56, 0x00, 0x18, 0xD3, 0x00, 0x29, 0x91, 0x80, 0x28, 0xFF, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A50, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x1A, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A51, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x42, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x18, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x48, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A52, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x19, 0xD7, 0x00, 0x1C, 0x10, 0x00, 0x3B, 0xD7, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x82, 0x00, 0x09, 0x3F, 0x00, 0x0B, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A53, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x89, 0x00, 0x08, 0x49, 0x00, 0x19, 0xFF, 0x80, 0x1D, 0x00, 0x80, 0x3A, 0x82, 0x00, 0x28, 0x82, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x32, 0x00, 0x0A, 0xD2, 0x00, 0x0C, 0x7F, 0x80, 0x08, 0x82, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A55, { 0x00, 0x00, 0x00, 0x08, 0x91, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x52, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x7E, 0x80, 0x1C, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x1A, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x42, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x12, 0x00, 0x08, 0x32, 0x00, 0x08, 0x62, 0x00, 0x08, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A56, { 0x00, 0x00, 0x00, 0x08, 0x91, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x52, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x7E, 0x80, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x18, 0x7E, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A58, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x02, 0x00, 0x1F, 0x7F, 0x80, 0x04, 0x0C, 0x00, 0x0E, 0x14, 0x00, 0x0D, 0x24, 0x00, 0x14, 0x4C, 0x00, 0x14, 0x80, 0x00, 0x24, 0x7F, 0x80, 0x04, 0x52, 0x80, 0x04, 0x73, 0x80, 0x04, 0x5E, 0x80, 0x04, 0x52, 0x80, 0x04, 0x5E, 0x80, 0x04, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A59, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFA, 0x00, 0x08, 0x14, 0x80, 0x3E, 0xA5, 0x00, 0x08, 0x42, 0x00, 0x19, 0x81, 0x80, 0x1C, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A5B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x8A, 0x00, 0x7E, 0x8A, 0x00, 0x12, 0x52, 0x00, 0x12, 0xFB, 0x80, 0x12, 0x24, 0x80, 0x3A, 0x25, 0x00, 0x36, 0xAA, 0x00, 0x52, 0xAA, 0x00, 0x52, 0xFA, 0x00, 0x12, 0x22, 0x00, 0x12, 0x27, 0x00, 0x12, 0x65, 0x00, 0x14, 0x4D, 0x80, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A5F, { 0x00, 0x00, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x09, 0x29, 0x00, 0x3E, 0x71, 0x00, 0x0B, 0xAE, 0x00, 0x18, 0xA4, 0x00, 0x1D, 0x3F, 0x80, 0x3B, 0xF4, 0x00, 0x28, 0x22, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x91, 0x00, 0x08, 0x92, 0x00, 0x09, 0x4C, 0x00, 0x09, 0x0C, 0x80, 0x0A, 0x32, 0x80, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A61, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x3A, 0xFF, 0x00, 0x28, 0x38, 0x00, 0x28, 0xC9, 0x00, 0x2B, 0x1E, 0x00, 0x08, 0x6C, 0x00, 0x0B, 0x9A, 0x00, 0x08, 0x2A, 0x00, 0x09, 0xC9, 0x00, 0x08, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A62, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0xC8, 0x00, 0x12, 0x7F, 0x80, 0x7E, 0x48, 0x00, 0x12, 0x9F, 0x00, 0x12, 0xA4, 0x00, 0x3A, 0x5F, 0x80, 0x36, 0x40, 0x00, 0x52, 0x5F, 0x00, 0x52, 0x51, 0x00, 0x12, 0x5F, 0x00, 0x12, 0xD1, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A64, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x44, 0x00, 0x13, 0x10, 0x00, 0x01, 0xF0, 0x00, 0x0A, 0x0A, 0x00, 0x55, 0x55, 0x00, 0x50, 0x50, 0x00, 0x59, 0x58, 0x80, 0x0F, 0x0F, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A65, { 0x00, 0x00, 0x00, 0x22, 0x24, 0x00, 0x14, 0xF8, 0x00, 0x08, 0x2A, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x40, 0x00, 0x0C, 0xFC, 0x00, 0x15, 0x84, 0x00, 0x26, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x14, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x0C, 0x98, 0x00, 0x30, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A66, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A67, { 0x00, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x7F, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x09, 0x92, 0x80, 0x1D, 0x54, 0x80, 0x1B, 0x10, 0x80, 0x19, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A6A, { 0x00, 0x00, 0x00, 0x10, 0x85, 0x00, 0x10, 0x85, 0x80, 0x11, 0xE4, 0x80, 0x7D, 0x24, 0x00, 0x11, 0xBF, 0x80, 0x12, 0x64, 0x00, 0x13, 0x44, 0x00, 0x38, 0xCE, 0x00, 0x38, 0x8B, 0x00, 0x51, 0x99, 0x80, 0x53, 0x30, 0x80, 0x10, 0x00, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x13, 0x6D, 0x80, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A6B, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x18, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x3A, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A71, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x7E, 0x01, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x01, 0x00, 0x12, 0xEF, 0x80, 0x3A, 0xA1, 0x00, 0x36, 0xA9, 0x00, 0x52, 0xAD, 0x00, 0x52, 0xE5, 0x00, 0x12, 0x01, 0x00, 0x12, 0xA1, 0x00, 0x14, 0xA1, 0x00, 0x18, 0x71, 0x00, 0x11, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A72, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x42, 0x00, 0x28, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A73, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xD5, 0x00, 0x12, 0x64, 0x80, 0x7E, 0x44, 0x00, 0x13, 0x5F, 0x00, 0x12, 0xC4, 0x00, 0x12, 0x4A, 0x00, 0x3A, 0x7F, 0x80, 0x36, 0x51, 0x00, 0x53, 0x64, 0x80, 0x52, 0xC4, 0x00, 0x12, 0x5F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0xD3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A78, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x38, 0x82, 0x00, 0x34, 0xFE, 0x00, 0x50, 0x00, 0x00, 0x53, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A79, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0xF8, 0x00, 0x09, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x1E, 0x22, 0x00, 0x1B, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A7C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0x3C, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x7A, 0x7C, 0x00, 0x17, 0x84, 0x00, 0x19, 0x7F, 0x00, 0x36, 0x10, 0x00, 0x32, 0x2A, 0x00, 0x57, 0xDC, 0x00, 0x10, 0x28, 0x00, 0x11, 0xDC, 0x00, 0x16, 0x2A, 0x00, 0x10, 0x49, 0x00, 0x10, 0x88, 0x00, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A7E, { 0x00, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x1C, 0x94, 0x80, 0x1A, 0x94, 0x80, 0x19, 0xF7, 0x80, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A7F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x92, 0x00, 0x3B, 0xFF, 0x80, 0x34, 0x00, 0x00, 0x50, 0xFE, 0x00, 0x50, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A80, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x18, 0xBD, 0x00, 0x1C, 0xBD, 0x00, 0x3A, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A81, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x1C, 0xA2, 0x80, 0x1A, 0xBE, 0x80, 0x18, 0x80, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x49, 0x00, 0x09, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A83, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3D, 0xFC, 0x00, 0x24, 0x49, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x25, 0xFF, 0x80, 0x2C, 0x01, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0E, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A84, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x09, 0xE2, 0x00, 0x09, 0x22, 0x00, 0x3F, 0xE4, 0x00, 0x09, 0x27, 0x80, 0x1D, 0xE5, 0x00, 0x1A, 0x89, 0x00, 0x18, 0x89, 0x00, 0x2B, 0xED, 0x00, 0x28, 0x96, 0x00, 0x28, 0xE2, 0x00, 0x29, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x25, 0x00, 0x09, 0x25, 0x00, 0x0A, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A86, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x7E, 0xA4, 0x00, 0x11, 0xC7, 0x80, 0x11, 0x44, 0x00, 0x13, 0x64, 0x00, 0x3A, 0x34, 0x00, 0x38, 0x84, 0x00, 0x56, 0xAF, 0x80, 0x52, 0xA8, 0x80, 0x12, 0xA8, 0x80, 0x11, 0xC8, 0x80, 0x11, 0x48, 0x80, 0x13, 0x68, 0x80, 0x12, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A87, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x44, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x88, 0x00, 0x18, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x29, 0xE7, 0x80, 0x49, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x3C, 0x80, 0x09, 0x00, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A89, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xF0, 0x00, 0x09, 0x2F, 0x00, 0x3F, 0xE9, 0x00, 0x09, 0x29, 0x00, 0x19, 0xE9, 0x00, 0x1D, 0x29, 0x00, 0x3B, 0x2F, 0x00, 0x29, 0xE9, 0x00, 0x2B, 0x20, 0x00, 0x28, 0x2F, 0x00, 0x28, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A8B, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x1C, 0xFE, 0x00, 0x1B, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x92, 0x80, 0x28, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A8D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x28, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x09, 0x48, 0x80, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A8E, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x08, 0x4A, 0x00, 0x3E, 0x89, 0x80, 0x09, 0xFF, 0x00, 0x18, 0xA5, 0x00, 0x1C, 0x99, 0x00, 0x3A, 0xA5, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x09, 0x4C, 0x80, 0x09, 0xF2, 0x80, 0x09, 0x00, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A90, { 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFF, 0x80, 0x7D, 0x22, 0x00, 0x11, 0xC3, 0x80, 0x11, 0x3E, 0x00, 0x39, 0x00, 0x00, 0x35, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x51, 0x3E, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x13, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A91, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x08, 0xD6, 0x80, 0x1C, 0x10, 0x80, 0x1A, 0xD6, 0x00, 0x18, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A97, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xBF, 0x80, 0x38, 0x84, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x84, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A9B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x3F, 0x00, 0x13, 0x21, 0x00, 0x7D, 0x2F, 0x00, 0x12, 0x29, 0x00, 0x13, 0x29, 0x00, 0x11, 0x7F, 0x80, 0x38, 0x40, 0x80, 0x3B, 0x5E, 0x80, 0x55, 0x52, 0x80, 0x51, 0x52, 0x80, 0x11, 0x5E, 0x80, 0x11, 0x40, 0x80, 0x11, 0x41, 0x80, 0x13, 0x80, 0x00, 0x12, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6A9C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xC1, 0x80, 0x08, 0x3E, 0x00, 0x18, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x3A, 0xAA, 0x80, 0x28, 0x9C, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A9D, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xE5, 0x00, 0x11, 0x25, 0x80, 0x7D, 0xE4, 0x80, 0x10, 0x04, 0x00, 0x13, 0xEF, 0x80, 0x11, 0x24, 0x00, 0x39, 0xE4, 0x00, 0x35, 0x25, 0x00, 0x55, 0xE5, 0x00, 0x51, 0x27, 0x00, 0x11, 0x32, 0x00, 0x11, 0xE6, 0x00, 0x13, 0x26, 0x80, 0x10, 0x2B, 0x80, 0x10, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A9E, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x13, 0x24, 0x80, 0x7E, 0x44, 0x80, 0x13, 0xEC, 0x80, 0x12, 0xB9, 0x80, 0x12, 0xA0, 0x00, 0x3B, 0xEA, 0x00, 0x36, 0xAA, 0x00, 0x52, 0xBF, 0x80, 0x53, 0xF2, 0x00, 0x12, 0x22, 0x00, 0x12, 0x3F, 0x80, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x14, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6A9F, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x19, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AA0, { 0x00, 0x00, 0x00, 0x12, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x12, 0x3F, 0x80, 0x3F, 0x62, 0x00, 0x21, 0x12, 0x00, 0x7D, 0x16, 0x00, 0x25, 0x0C, 0x00, 0x3D, 0x16, 0x00, 0x03, 0x63, 0x80, 0x0E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x0C, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AA2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x83, 0x00, 0x09, 0x00, 0x80, 0x18, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x2B, 0xEF, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0x45, 0x00, 0x0A, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AA3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x18, 0x5D, 0x00, 0x1C, 0x08, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x28, 0xBE, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AA5, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x02, 0x00, 0x19, 0xE9, 0x00, 0x28, 0x48, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x49, 0x00, 0x08, 0x6A, 0x00, 0x09, 0xC4, 0x80, 0x08, 0x4A, 0x80, 0x08, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AA9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x7E, 0x8A, 0x00, 0x0A, 0xFA, 0x00, 0x1A, 0x8A, 0x00, 0x1F, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x0A, 0xA2, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AAA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x12, 0x20, 0x80, 0x13, 0x7D, 0x80, 0x7D, 0x45, 0x00, 0x10, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x39, 0x45, 0x00, 0x37, 0x45, 0x80, 0x52, 0x7C, 0x80, 0x50, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AAB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x00, 0x80, 0x09, 0x7F, 0x80, 0x08, 0xA9, 0x00, 0x1D, 0x6A, 0x00, 0x1A, 0xA4, 0x00, 0x1A, 0x42, 0x00, 0x28, 0xBD, 0x80, 0x29, 0x00, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AAC, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x11, 0x7E, 0x80, 0x38, 0x00, 0x00, 0x35, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x50, 0x51, 0x80, 0x11, 0xAB, 0x00, 0x10, 0x48, 0x00, 0x11, 0x9C, 0x00, 0x10, 0x6A, 0x00, 0x11, 0x89, 0x80, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AAE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x1C, 0x01, 0x00, 0x1A, 0x7D, 0x00, 0x18, 0x10, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x52, 0x00, 0x09, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AAF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x1B, 0xFF, 0x80, 0x19, 0x00, 0x80, 0x28, 0xFF, 0x00, 0x28, 0x42, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AB0, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x11, 0x88, 0x00, 0x13, 0x1F, 0x00, 0x7E, 0x51, 0x00, 0x12, 0xDF, 0x00, 0x11, 0x91, 0x00, 0x13, 0x11, 0x00, 0x3A, 0x5F, 0x00, 0x37, 0xC4, 0x00, 0x51, 0x5F, 0x80, 0x51, 0x14, 0x80, 0x13, 0x54, 0x80, 0x13, 0x54, 0x80, 0x15, 0x35, 0x80, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AB1, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xF7, 0x80, 0x7D, 0x4A, 0x00, 0x08, 0x21, 0x00, 0x08, 0x42, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AB3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x08, 0x7F, 0x00, 0x1C, 0x08, 0x80, 0x1A, 0x4B, 0x00, 0x38, 0x9C, 0x00, 0x28, 0x7F, 0x00, 0x2B, 0xC1, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AB4, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0x48, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x88, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x88, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x28, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x46, 0x00, 0x08, 0x38, 0x00, 0x09, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AB8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x20, 0x80, 0x12, 0x50, 0x80, 0x11, 0x45, 0x00, 0x32, 0x7C, 0x80, 0x38, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ABB, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xF2, 0x00, 0x08, 0xA4, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x98, 0x00, 0x18, 0x90, 0x00, 0x1C, 0xF0, 0x00, 0x3A, 0xAF, 0x80, 0x28, 0xF0, 0x00, 0x28, 0x80, 0x00, 0x28, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ABD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x09, 0x56, 0x80, 0x1D, 0x10, 0x80, 0x1A, 0x56, 0x00, 0x18, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ABE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x24, 0x11, 0x00, 0x1F, 0x7E, 0x00, 0x04, 0x10, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x15, 0x55, 0x00, 0x24, 0x93, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ABF, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x2F, 0x8A, 0x00, 0x20, 0x09, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x88, 0x00, 0x2F, 0x9C, 0x00, 0x28, 0x94, 0x00, 0x6F, 0xB6, 0x00, 0x48, 0xA3, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0E, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AC1, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x20, 0x80, 0x12, 0x14, 0x80, 0x11, 0x49, 0x00, 0x32, 0x52, 0x80, 0x38, 0x3E, 0x00, 0x55, 0xC0, 0x00, 0x50, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x12, 0x00, 0x10, 0x7F, 0x00, 0x13, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AC2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x3F, 0x6B, 0x00, 0x0A, 0xB5, 0x00, 0x19, 0x6B, 0x00, 0x1C, 0x24, 0x00, 0x3A, 0x48, 0x00, 0x28, 0xFF, 0x00, 0x29, 0x90, 0x00, 0x2A, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AC3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x19, 0x7F, 0x00, 0x1D, 0x08, 0x00, 0x3B, 0xFF, 0x80, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x22, 0x00, 0x09, 0x41, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AC6, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x81, 0x00, 0x13, 0xF5, 0x00, 0x7E, 0x93, 0x00, 0x12, 0x91, 0x00, 0x13, 0xF5, 0x00, 0x12, 0x93, 0x00, 0x3A, 0x91, 0x00, 0x37, 0xF1, 0x80, 0x55, 0x4F, 0x00, 0x51, 0x51, 0x00, 0x11, 0x55, 0x00, 0x11, 0x7D, 0x00, 0x13, 0x40, 0x80, 0x12, 0x61, 0x80, 0x16, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AC8, { 0x00, 0x00, 0x00, 0x08, 0x72, 0x00, 0x09, 0x14, 0x80, 0x08, 0xBD, 0x00, 0x7E, 0xC3, 0x00, 0x09, 0xBD, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x42, 0x00, 0x18, 0x7E, 0x00, 0x28, 0x24, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AC9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x7E, 0x41, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x41, 0x00, 0x12, 0xEF, 0x80, 0x3A, 0x01, 0x00, 0x36, 0xF1, 0x00, 0x56, 0x95, 0x00, 0x52, 0xF3, 0x00, 0x12, 0x01, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x14, 0x79, 0x00, 0x11, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ACC, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x1D, 0xFF, 0x80, 0x1B, 0x08, 0x80, 0x18, 0xA5, 0x00, 0x28, 0xA2, 0x80, 0x29, 0x1E, 0x00, 0x48, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x09, 0xA2, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AD0, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x90, 0x00, 0x0E, 0x9C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AD1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x38, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x53, 0xEF, 0x80, 0x52, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x13, 0xEF, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x13, 0xEF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AD3, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x18, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x09, 0x00, 0x29, 0x24, 0x80, 0x29, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AD4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x09, 0x7F, 0x00, 0x1D, 0x49, 0x00, 0x1B, 0x7F, 0x00, 0x19, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x49, 0x7F, 0x80, 0x09, 0x4A, 0x80, 0x09, 0x4E, 0x80, 0x0A, 0x7A, 0x80, 0x08, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AD5, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0xEF, 0x00, 0x08, 0x42, 0x00, 0x7E, 0xEF, 0x80, 0x08, 0x46, 0x00, 0x08, 0xAD, 0x00, 0x1D, 0x18, 0x80, 0x1A, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AD6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x20, 0x80, 0x09, 0xFE, 0x00, 0x1D, 0x20, 0x80, 0x1B, 0x7F, 0x80, 0x19, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x49, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x0A, 0xA5, 0x00, 0x0C, 0xA2, 0x80, 0x09, 0x1E, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ADA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x3F, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x19, 0xE7, 0x80, 0x1D, 0x00, 0x80, 0x3B, 0x3C, 0x80, 0x29, 0x24, 0x80, 0x29, 0x3C, 0x80, 0x29, 0x10, 0x80, 0x09, 0x7E, 0x80, 0x09, 0x42, 0x80, 0x09, 0x7E, 0x80, 0x09, 0x00, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ADB, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x8A, 0x00, 0x3E, 0x51, 0x00, 0x08, 0x00, 0x00, 0x19, 0xEF, 0x00, 0x1D, 0x29, 0x00, 0x3B, 0xE9, 0x00, 0x29, 0x29, 0x00, 0x29, 0xE9, 0x00, 0x29, 0x09, 0x00, 0x09, 0xE9, 0x00, 0x09, 0x09, 0x00, 0x09, 0xEB, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ADC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x47, 0x90, 0x80, 0x5C, 0x9C, 0x80, 0x03, 0x10, 0x00, 0x1C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ADD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x94, 0x80, 0x1A, 0xFF, 0x80, 0x19, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ADE, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x1F, 0x00, 0x12, 0x11, 0x00, 0x7E, 0x9F, 0x00, 0x12, 0x82, 0x00, 0x19, 0x3F, 0x80, 0x35, 0x08, 0x00, 0x32, 0x54, 0x00, 0x57, 0xC6, 0x80, 0x51, 0x4B, 0x00, 0x11, 0x12, 0x00, 0x15, 0x46, 0x00, 0x15, 0x4B, 0x00, 0x15, 0x52, 0x80, 0x19, 0x02, 0x00, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ADF, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x13, 0x23, 0x00, 0x12, 0x3A, 0x00, 0x7E, 0xAA, 0x80, 0x11, 0x29, 0x00, 0x11, 0x39, 0x00, 0x3A, 0x2A, 0x00, 0x36, 0xAA, 0x80, 0x53, 0xBB, 0x80, 0x50, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AE4, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0xF7, 0x80, 0x09, 0x4A, 0x00, 0x7E, 0x21, 0x00, 0x08, 0x41, 0x00, 0x08, 0x22, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x18, 0xF8, 0x80, 0x28, 0x8A, 0x80, 0x28, 0xEA, 0x80, 0x48, 0x9A, 0x80, 0x08, 0xCA, 0x80, 0x08, 0xB8, 0x80, 0x08, 0x88, 0x80, 0x08, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AE7, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xC4, 0x80, 0x10, 0x1F, 0x80, 0x7F, 0xE5, 0x00, 0x10, 0x05, 0x00, 0x13, 0xC6, 0x00, 0x10, 0x3F, 0x80, 0x38, 0x06, 0x00, 0x37, 0xC9, 0x00, 0x54, 0x1F, 0x80, 0x50, 0x28, 0x80, 0x13, 0xC8, 0x80, 0x12, 0x4F, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x13, 0xCF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AE8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x7E, 0x21, 0x00, 0x12, 0xFC, 0x00, 0x12, 0x21, 0x00, 0x3A, 0xFF, 0x00, 0x36, 0x92, 0x00, 0x32, 0xFE, 0x00, 0x52, 0x92, 0x00, 0x52, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AEA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x66, 0x00, 0x7E, 0xCC, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x44, 0x00, 0x3A, 0xEE, 0x00, 0x37, 0x55, 0x00, 0x52, 0x44, 0x00, 0x52, 0x10, 0x00, 0x12, 0x90, 0x00, 0x12, 0x9F, 0x00, 0x14, 0x90, 0x00, 0x10, 0x90, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AEC, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x9F, 0x00, 0x13, 0xF1, 0x00, 0x7D, 0x51, 0x00, 0x11, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x13, 0xF1, 0x00, 0x38, 0x9F, 0x00, 0x34, 0x91, 0x00, 0x57, 0xF1, 0x00, 0x50, 0x9F, 0x00, 0x11, 0xCA, 0x00, 0x12, 0xAA, 0x00, 0x14, 0x9A, 0x00, 0x10, 0x92, 0x80, 0x10, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AF0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x09, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x1B, 0xD7, 0x00, 0x1A, 0x10, 0x00, 0x29, 0xD7, 0x00, 0x28, 0x38, 0x80, 0x48, 0x69, 0x80, 0x09, 0xCD, 0x00, 0x08, 0x46, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AF1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x25, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x3F, 0x36, 0x00, 0x21, 0x14, 0x00, 0x3F, 0x7F, 0x00, 0x20, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x98, 0x00, 0x3C, 0x8F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AF2, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0xCF, 0x00, 0x10, 0x51, 0x00, 0x7E, 0xA2, 0x00, 0x11, 0x9F, 0x80, 0x11, 0x14, 0x80, 0x13, 0xF4, 0x80, 0x39, 0x3F, 0x80, 0x35, 0x48, 0x00, 0x51, 0x14, 0x80, 0x51, 0x2A, 0x80, 0x11, 0x17, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x13, 0x00, 0x11, 0x22, 0x80, 0x13, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AF6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x0F, 0x00, 0x08, 0x78, 0x00, 0x18, 0xFF, 0x00, 0x1C, 0x08, 0x00, 0x3A, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x94, 0x80, 0x28, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x09, 0x51, 0x00, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AFA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x3A, 0x10, 0x80, 0x34, 0xD6, 0x00, 0x50, 0x10, 0x00, 0x50, 0x00, 0x00, 0x13, 0xBB, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x13, 0xBB, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AFB, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x19, 0x29, 0x00, 0x1D, 0xEF, 0x00, 0x3B, 0x29, 0x00, 0x2A, 0x30, 0x80, 0x28, 0x40, 0x00, 0x2F, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6AFC, { 0x00, 0x00, 0x00, 0x11, 0x24, 0x00, 0x11, 0x25, 0x00, 0x12, 0xD5, 0x80, 0x7E, 0xD4, 0x80, 0x10, 0x04, 0x00, 0x13, 0xFF, 0x80, 0x10, 0xA4, 0x00, 0x3B, 0xBD, 0x00, 0x34, 0xA5, 0x00, 0x57, 0xBD, 0x00, 0x50, 0xA7, 0x00, 0x13, 0xBA, 0x00, 0x10, 0xA6, 0x00, 0x10, 0xFE, 0x80, 0x13, 0x8B, 0x80, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6AFD, { 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x54, 0x00, 0x24, 0xFE, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x01, 0x00, 0x2C, 0xFF, 0x00, 0x21, 0x51, 0x00, 0x23, 0x4A, 0x80, 0x22, 0x3E, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B02, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x05, 0x00, 0x13, 0x3F, 0x80, 0x11, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x3B, 0x24, 0x80, 0x35, 0xBF, 0x80, 0x54, 0xA4, 0x80, 0x50, 0x3F, 0x80, 0x10, 0xA4, 0x80, 0x11, 0x81, 0x00, 0x11, 0x3F, 0x80, 0x13, 0x11, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B03, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x09, 0x84, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x77, 0x00, 0x1A, 0x44, 0x80, 0x18, 0xF3, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x68, 0x80, 0x09, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B04, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x19, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x3B, 0x11, 0x00, 0x29, 0x7D, 0x00, 0x29, 0x55, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x39, 0x00, 0x09, 0x55, 0x00, 0x09, 0x93, 0x00, 0x09, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B05, { 0x00, 0x00, 0x00, 0x08, 0xD0, 0x00, 0x09, 0x9B, 0x00, 0x09, 0x11, 0x00, 0x7F, 0x9B, 0x00, 0x09, 0x29, 0x00, 0x09, 0xAB, 0x00, 0x1D, 0x29, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x28, 0xBA, 0x00, 0x29, 0x11, 0x00, 0x4A, 0xFE, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B06, { 0x00, 0x00, 0x00, 0x08, 0x52, 0x80, 0x08, 0xA5, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0xA5, 0x00, 0x08, 0xF7, 0x80, 0x08, 0xA5, 0x00, 0x1C, 0xF7, 0x80, 0x1A, 0xA5, 0x00, 0x18, 0xF7, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x41, 0x00, 0x08, 0x36, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x76, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B07, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x47, 0x00, 0x1D, 0xFC, 0x00, 0x18, 0x04, 0x00, 0x1B, 0xFF, 0x80, 0x29, 0x29, 0x00, 0x29, 0xEF, 0x00, 0x49, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x80, 0x0B, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B09, { 0x00, 0x00, 0x00, 0x11, 0x29, 0x00, 0x10, 0xAA, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x82, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x51, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x29, 0x00, 0x11, 0xE6, 0x00, 0x13, 0x2B, 0x00, 0x10, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B0A, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x99, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x44, 0x00, 0x18, 0x88, 0x00, 0x29, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B0C, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x3E, 0x05, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x84, 0x00, 0x1E, 0xFC, 0x00, 0x1B, 0xD4, 0x80, 0x28, 0xF4, 0x80, 0x28, 0xD5, 0x00, 0x2B, 0xD5, 0x00, 0x0A, 0xF6, 0x00, 0x0A, 0xD2, 0x00, 0x09, 0x56, 0x80, 0x09, 0x79, 0x80, 0x0A, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B0F, { 0x00, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x7F, 0xFF, 0x80, 0x10, 0x89, 0x00, 0x11, 0x12, 0x00, 0x12, 0x3F, 0x80, 0x39, 0x52, 0x00, 0x34, 0x92, 0x00, 0x55, 0x3F, 0x80, 0x53, 0xF2, 0x00, 0x10, 0x92, 0x00, 0x12, 0xBF, 0x80, 0x12, 0xB2, 0x00, 0x12, 0xB2, 0x00, 0x10, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B10, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x80, 0x7F, 0x28, 0x80, 0x09, 0x6A, 0x80, 0x08, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x1B, 0x24, 0x00, 0x19, 0xFF, 0x80, 0x29, 0x24, 0x80, 0x29, 0xFF, 0x80, 0x49, 0x44, 0x00, 0x09, 0x77, 0x80, 0x09, 0x44, 0x00, 0x0A, 0x74, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B11, { 0x00, 0x00, 0x00, 0x09, 0x4A, 0x00, 0x09, 0xEF, 0x80, 0x08, 0x42, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x1D, 0x39, 0x80, 0x1A, 0xFF, 0x00, 0x1A, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B12, { 0x00, 0x00, 0x00, 0x08, 0xE2, 0x00, 0x30, 0x04, 0x00, 0x15, 0xF9, 0x00, 0x08, 0x06, 0x00, 0x14, 0xE4, 0x80, 0x3E, 0x0F, 0x80, 0x08, 0xE2, 0x00, 0x2A, 0x0A, 0x80, 0x2A, 0xEA, 0x80, 0x08, 0xE2, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B16, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xAB, 0x80, 0x09, 0x10, 0x80, 0x3F, 0xEB, 0x80, 0x09, 0x10, 0x80, 0x19, 0xEB, 0x80, 0x1D, 0xFF, 0x80, 0x3B, 0x00, 0x80, 0x28, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0xC4, 0x80, 0x1B, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B17, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7F, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x3B, 0xEF, 0x80, 0x36, 0x10, 0x80, 0x56, 0xFE, 0x80, 0x52, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x12, 0xBA, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x54, 0x80, 0x12, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B1B, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x39, 0x40, 0x00, 0x37, 0xFF, 0x80, 0x55, 0x48, 0x80, 0x53, 0xEF, 0x80, 0x12, 0xA8, 0x80, 0x13, 0xEF, 0x80, 0x10, 0x88, 0x80, 0x17, 0xF8, 0x80, 0x10, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B1D, { 0x00, 0x00, 0x00, 0x11, 0x22, 0x00, 0x7C, 0xCF, 0x80, 0x11, 0x22, 0x00, 0x38, 0xC7, 0x00, 0x55, 0x2A, 0x80, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x21, 0x7F, 0x80, 0x3F, 0x02, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x12, 0x00, 0x22, 0x02, 0x00, 0x7D, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B1E, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7E, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x38, 0x00, 0x00, 0x37, 0xBB, 0x80, 0x52, 0xAA, 0x80, 0x53, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x11, 0x55, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B1F, { 0x00, 0x00, 0x00, 0x11, 0x40, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x7B, 0xE9, 0x00, 0x12, 0xAF, 0x00, 0x1B, 0xE9, 0x00, 0x35, 0x49, 0x00, 0x33, 0xEF, 0x00, 0x56, 0x89, 0x00, 0x53, 0xE9, 0x00, 0x12, 0x8F, 0x00, 0x13, 0xEA, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x8A, 0x80, 0x13, 0xFA, 0x80, 0x10, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B20, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x41, 0x00, 0x10, 0x42, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B21, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x01, 0x01, 0x00, 0x01, 0x32, 0x00, 0x02, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x02, 0x20, 0x00, 0x0C, 0x50, 0x00, 0x30, 0x50, 0x00, 0x00, 0x88, 0x00, 0x01, 0x04, 0x00, 0x06, 0x02, 0x00, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B22, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x02, 0x7E, 0x00, 0x22, 0x82, 0x00, 0x23, 0x24, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x08, 0x20, 0x00, 0x14, 0x20, 0x00, 0x12, 0x50, 0x00, 0x22, 0x50, 0x00, 0x40, 0x88, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B23, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x1C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x1F, 0x80, 0x10, 0x29, 0x00, 0x1F, 0xA9, 0x00, 0x11, 0x48, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x12, 0x00, 0x11, 0x22, 0x00, 0x21, 0x21, 0x00, 0x21, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B24, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xBF, 0x80, 0x08, 0x20, 0x80, 0x08, 0x69, 0x80, 0x08, 0x09, 0x00, 0x7F, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x9C, 0x00, 0x06, 0x94, 0x00, 0x1C, 0x94, 0x00, 0x71, 0x96, 0x00, 0x01, 0x32, 0x00, 0x01, 0x23, 0x00, 0x07, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B27, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x7F, 0x00, 0x54, 0xC1, 0x00, 0x54, 0x93, 0x00, 0x49, 0x92, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x48, 0x38, 0x00, 0x54, 0x28, 0x00, 0x54, 0x28, 0x00, 0x40, 0x6C, 0x00, 0x40, 0x44, 0x00, 0x7E, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B28, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x80, 0x40, 0xE9, 0x80, 0x3C, 0x89, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x9C, 0x00, 0x24, 0x94, 0x00, 0x3C, 0x94, 0x00, 0x01, 0x96, 0x00, 0x01, 0x32, 0x00, 0x01, 0x23, 0x00, 0x07, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B2B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x3F, 0x80, 0x44, 0x20, 0x80, 0x04, 0x69, 0x80, 0x3F, 0x89, 0x00, 0x04, 0x08, 0x00, 0x24, 0x08, 0x00, 0x27, 0x9C, 0x00, 0x24, 0x14, 0x00, 0x24, 0x14, 0x00, 0x27, 0xB6, 0x00, 0x3C, 0x22, 0x00, 0x60, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B2C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x20, 0x80, 0x18, 0x69, 0x80, 0x31, 0x09, 0x00, 0x63, 0x08, 0x00, 0x36, 0x08, 0x00, 0x0C, 0x88, 0x00, 0x19, 0x9C, 0x00, 0x33, 0x14, 0x00, 0x66, 0x16, 0x00, 0x0D, 0x32, 0x00, 0x19, 0xA3, 0x00, 0x70, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B2F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x20, 0x80, 0x08, 0x69, 0x80, 0x08, 0x09, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x1C, 0x00, 0x21, 0x14, 0x00, 0x21, 0x16, 0x00, 0x21, 0x32, 0x00, 0x21, 0x23, 0x00, 0x3F, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B32, { 0x00, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x11, 0x10, 0x00, 0x20, 0x90, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x29, 0x00, 0x0A, 0x29, 0x00, 0x11, 0x48, 0x00, 0x20, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x12, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B35, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x27, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x20, 0x7F, 0x80, 0x21, 0x40, 0x80, 0x1F, 0x89, 0x80, 0x20, 0x09, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x08, 0x00, 0x44, 0x08, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x14, 0x00, 0x0E, 0x16, 0x00, 0x1B, 0x32, 0x00, 0x31, 0xA3, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B36, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xA0, 0x80, 0x24, 0xC9, 0x80, 0x24, 0x89, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x15, 0x14, 0x00, 0x14, 0x96, 0x00, 0x24, 0x32, 0x00, 0x44, 0x23, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B37, { 0x00, 0x00, 0x00, 0x11, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0A, 0x3F, 0x80, 0x31, 0x60, 0x80, 0x04, 0x49, 0x80, 0x7F, 0xC9, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x54, 0x9C, 0x00, 0x14, 0x94, 0x00, 0x14, 0x96, 0x00, 0x15, 0xB2, 0x00, 0x04, 0x23, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B38, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x19, 0x20, 0x00, 0x11, 0x20, 0x00, 0x17, 0xBF, 0x80, 0x7C, 0xE0, 0x80, 0x10, 0x49, 0x80, 0x3F, 0x89, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xDC, 0x00, 0x04, 0x14, 0x00, 0x0E, 0x14, 0x00, 0x0B, 0x36, 0x00, 0x19, 0xA2, 0x00, 0x30, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B39, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x0A, 0x3F, 0x80, 0x1B, 0x20, 0x80, 0x31, 0x69, 0x80, 0x00, 0x09, 0x00, 0x7F, 0xC8, 0x00, 0x01, 0x08, 0x00, 0x3D, 0x08, 0x00, 0x25, 0x1C, 0x00, 0x25, 0x14, 0x00, 0x3D, 0x16, 0x00, 0x01, 0x32, 0x00, 0x01, 0x23, 0x00, 0x07, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B3A, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x3F, 0xD0, 0x00, 0x09, 0x1F, 0x80, 0x09, 0x28, 0x80, 0x0F, 0x49, 0x00, 0x09, 0x8A, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x0C, 0x00, 0x3F, 0xD4, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x09, 0x21, 0x00, 0x10, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B3B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x90, 0x00, 0x25, 0x90, 0x00, 0x6D, 0x3F, 0x80, 0x4A, 0x20, 0x80, 0x1B, 0x49, 0x80, 0x31, 0x89, 0x00, 0x64, 0x88, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x25, 0x9C, 0x00, 0x6D, 0x14, 0x00, 0x4A, 0x16, 0x00, 0x1B, 0x32, 0x00, 0x31, 0xA3, 0x00, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B3D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x3E, 0x49, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x28, 0x22, 0x00, 0x0F, 0x42, 0x00, 0x38, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B3E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x48, 0x80, 0x00, 0x89, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x14, 0x00, 0x15, 0x14, 0x00, 0x14, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x24, 0x41, 0x00, 0x0C, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B3F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x10, 0xBF, 0x80, 0x20, 0xA0, 0x80, 0x20, 0xE9, 0x80, 0x43, 0x89, 0x00, 0x18, 0x08, 0x00, 0x63, 0x88, 0x00, 0x40, 0x88, 0x00, 0x40, 0x9C, 0x00, 0x7B, 0x94, 0x00, 0x40, 0x96, 0x00, 0x40, 0xB2, 0x00, 0x40, 0xA3, 0x00, 0x7F, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B43, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x07, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x20, 0x80, 0x7F, 0xC9, 0x80, 0x04, 0x09, 0x00, 0x14, 0x08, 0x00, 0x35, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x9C, 0x00, 0x35, 0x94, 0x00, 0x24, 0x96, 0x00, 0x24, 0xB2, 0x00, 0x3F, 0xA3, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B46, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x3F, 0x80, 0x11, 0x49, 0x00, 0x0A, 0x8A, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x22, 0x00, 0x11, 0x42, 0x00, 0x1F, 0x81, 0x00, 0x11, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B47, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xDF, 0x80, 0x10, 0x54, 0x80, 0x1F, 0xE5, 0x00, 0x04, 0x44, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xE4, 0x00, 0x32, 0x24, 0x00, 0x12, 0x24, 0x00, 0x15, 0x2A, 0x00, 0x18, 0xAA, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x51, 0x00, 0x11, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B49, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x09, 0x08, 0x00, 0x7F, 0xE8, 0x00, 0x0A, 0x0F, 0x80, 0x3F, 0xD8, 0x80, 0x0A, 0x55, 0x80, 0x7F, 0xF5, 0x00, 0x0A, 0x44, 0x00, 0x3F, 0xC4, 0x00, 0x0A, 0x04, 0x00, 0x1B, 0x0E, 0x00, 0x1B, 0x0A, 0x00, 0x2A, 0x8A, 0x00, 0x4A, 0x5B, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B4A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x00, 0x1F, 0x80, 0x1F, 0x30, 0x80, 0x11, 0x25, 0x80, 0x1F, 0x45, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x2E, 0x8E, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2E, 0x9B, 0x00, 0x20, 0x91, 0x00, 0x21, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B4C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x00, 0x44, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x4F, 0x80, 0x1E, 0x54, 0x80, 0x00, 0x54, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x4A, 0x00, 0x1E, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x1E, 0x51, 0x00, 0x00, 0x51, 0x00, 0x00, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B4D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x21, 0x3F, 0x80, 0x21, 0x20, 0x80, 0x21, 0x65, 0x80, 0x3F, 0x05, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xCE, 0x00, 0x01, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5B, 0x00, 0x54, 0xD1, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B4E, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xE8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0x9F, 0x80, 0x02, 0x15, 0x00, 0x1F, 0xE4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xEA, 0x00, 0x02, 0x0A, 0x00, 0x05, 0x09, 0x00, 0x08, 0x91, 0x00, 0x30, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B50, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x20, 0x10, 0x00, 0x27, 0x9F, 0x80, 0x24, 0xA0, 0x80, 0x24, 0xA1, 0x00, 0x27, 0xC8, 0x00, 0x20, 0x88, 0x00, 0x20, 0x08, 0x00, 0x2F, 0xC8, 0x00, 0x2B, 0x4C, 0x00, 0x2B, 0x54, 0x00, 0x2F, 0xD2, 0x00, 0x20, 0x22, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B52, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x12, 0x3F, 0x80, 0x12, 0x20, 0x80, 0x12, 0x69, 0x80, 0x7F, 0x89, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x7F, 0x88, 0x00, 0x48, 0x9C, 0x00, 0x5E, 0x94, 0x00, 0x52, 0x96, 0x00, 0x52, 0xB2, 0x00, 0x5E, 0xA3, 0x00, 0x41, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B53, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x68, 0x1F, 0x80, 0x08, 0x30, 0x80, 0x7F, 0xA9, 0x80, 0x12, 0x69, 0x00, 0x14, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x64, 0x1C, 0x00, 0x3F, 0x14, 0x00, 0x24, 0x14, 0x00, 0x3F, 0x36, 0x00, 0x24, 0x22, 0x00, 0x3F, 0xE3, 0x00, 0x00, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B54, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x07, 0x88, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xDF, 0x80, 0x24, 0x50, 0x80, 0x3F, 0x35, 0x80, 0x24, 0x45, 0x00, 0x23, 0xC4, 0x00, 0x20, 0x04, 0x00, 0x25, 0x04, 0x00, 0x35, 0x4E, 0x00, 0x3D, 0xCA, 0x00, 0x25, 0x0A, 0x00, 0x25, 0xDB, 0x00, 0x47, 0x11, 0x00, 0x1C, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B56, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x08, 0x3F, 0x80, 0x3F, 0x20, 0x80, 0x00, 0x69, 0x80, 0x3F, 0x09, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x12, 0x08, 0x00, 0x7F, 0x9C, 0x00, 0x00, 0x14, 0x00, 0x3F, 0x16, 0x00, 0x21, 0x32, 0x00, 0x21, 0x23, 0x00, 0x3F, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B58, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x90, 0x00, 0x25, 0x90, 0x00, 0x6D, 0x3F, 0x80, 0x4A, 0x20, 0x80, 0x1B, 0x69, 0x80, 0x31, 0x89, 0x00, 0x60, 0x88, 0x00, 0x11, 0x08, 0x00, 0x51, 0x48, 0x00, 0x5B, 0x5C, 0x00, 0x55, 0x94, 0x00, 0x33, 0x16, 0x00, 0x2A, 0xB2, 0x00, 0x66, 0xA3, 0x00, 0x44, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B59, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x08, 0x00, 0x6E, 0xCF, 0x80, 0x00, 0x18, 0x80, 0x1F, 0x15, 0x80, 0x11, 0x35, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC4, 0x00, 0x29, 0x4E, 0x00, 0x4A, 0x4A, 0x00, 0x18, 0xCA, 0x00, 0x29, 0x5B, 0x00, 0x4A, 0x51, 0x00, 0x18, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B5B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x1B, 0x08, 0x00, 0x31, 0x8F, 0x80, 0x60, 0xD8, 0x80, 0x1F, 0x15, 0x80, 0x00, 0x35, 0x00, 0x3B, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x3B, 0x8E, 0x00, 0x00, 0x0A, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x1B, 0x00, 0x3B, 0x91, 0x00, 0x6A, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B5D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x20, 0x80, 0x3F, 0xC9, 0x80, 0x04, 0x09, 0x00, 0x7F, 0xC8, 0x00, 0x11, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x14, 0x00, 0x3F, 0x96, 0x00, 0x04, 0x32, 0x00, 0x04, 0x23, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B5F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x1A, 0xC8, 0x00, 0x13, 0x48, 0x00, 0x12, 0x5F, 0x80, 0x1B, 0xD5, 0x00, 0x12, 0x64, 0x00, 0x10, 0x44, 0x00, 0x1A, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x3F, 0xEA, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x00, 0x08, 0x92, 0x00, 0x08, 0x51, 0x00, 0x10, 0x51, 0x00, 0x20, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B60, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x08, 0x90, 0x00, 0x33, 0x1F, 0x80, 0x4C, 0xD0, 0x80, 0x7F, 0xE5, 0x80, 0x08, 0x85, 0x00, 0x33, 0x04, 0x00, 0x4C, 0xC4, 0x00, 0x7F, 0xC4, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0xCA, 0x00, 0x4A, 0x4A, 0x00, 0x7F, 0xDB, 0x00, 0x40, 0x51, 0x00, 0x7F, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B61, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xE8, 0x00, 0x08, 0x88, 0x00, 0x1D, 0xDF, 0x80, 0x15, 0x54, 0x80, 0x1D, 0xE5, 0x00, 0x01, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x12, 0x0A, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x11, 0x00, 0x1F, 0xE1, 0x00, 0x10, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B62, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B64, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x13, 0x80, 0x09, 0xFC, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x80, 0x0F, 0xF0, 0x80, 0x38, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B65, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x41, 0x00, 0x08, 0x42, 0x00, 0x10, 0x44, 0x00, 0x21, 0xC8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B66, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x1F, 0xA1, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x12, 0x20, 0x00, 0x13, 0xD0, 0x00, 0x12, 0x10, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x17, 0xC4, 0x80, 0x38, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B67, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x00, 0x2F, 0x41, 0x00, 0x28, 0x63, 0x00, 0x28, 0x22, 0x00, 0x28, 0x36, 0x00, 0x28, 0x1C, 0x00, 0x28, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x2F, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B69, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x8B, 0x80, 0x03, 0x98, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x60, 0x00, 0x00, 0xD0, 0x00, 0x01, 0x4C, 0x00, 0x06, 0x43, 0x80, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B6B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x7E, 0x00, 0x27, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x27, 0x40, 0x00, 0x3C, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B6E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x28, 0x00, 0x13, 0xAF, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x17, 0xA8, 0x00, 0x7C, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B6F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x14, 0x92, 0x00, 0x12, 0xA2, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC2, 0x00, 0x12, 0xA2, 0x00, 0x14, 0x9A, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B70, { 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x84, 0x80, 0x24, 0xA4, 0x80, 0x2C, 0xAC, 0x80, 0x19, 0x99, 0x80, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x28, 0x00, 0x13, 0xAF, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x17, 0xA8, 0x00, 0x7C, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B72, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x7E, 0x00, 0x02, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x24, 0x00, 0x00, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x21, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x12, 0x00, 0x16, 0xB4, 0x00, 0x1A, 0x48, 0x00, 0x16, 0x94, 0x80, 0x23, 0x22, 0x80, 0x2C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B73, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x17, 0xD9, 0x00, 0x11, 0x0B, 0x00, 0x15, 0x4E, 0x00, 0x15, 0x44, 0x80, 0x31, 0x0E, 0x80, 0x23, 0x1B, 0x80, 0x60, 0x71, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x23, 0x8E, 0x00, 0x2D, 0x55, 0x80, 0x21, 0x04, 0x00, 0x20, 0x20, 0x00, 0x22, 0x20, 0x00, 0x62, 0x3F, 0x00, 0x42, 0x20, 0x00, 0x42, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B75, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x2F, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x2F, 0x7F, 0x00, 0x38, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0xC7, 0x00, 0x17, 0x1C, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x24, 0x80, 0x11, 0x04, 0x00, 0x10, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x21, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B78, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x01, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x01, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x08, 0x00, 0x2E, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x49, 0x00, 0x2F, 0x49, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x06, 0x04, 0x00, 0x0D, 0x8C, 0x00, 0x38, 0xC8, 0x00, 0x00, 0x58, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x07, 0xD0, 0x00, 0x04, 0x51, 0x80, 0x0C, 0x56, 0x00, 0x0A, 0x98, 0x00, 0x11, 0x90, 0x00, 0x21, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B7C, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x12, 0x00, 0x31, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x06, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B7D, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x10, 0x78, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1E, 0x7F, 0x80, 0x12, 0x44, 0x00, 0x32, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x66, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x18, 0x84, 0x00, 0x31, 0x84, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B7E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x10, 0x3F, 0x80, 0x10, 0x2A, 0x80, 0x1E, 0x6A, 0x80, 0x12, 0x4A, 0x80, 0x32, 0xDA, 0x80, 0x22, 0x12, 0x80, 0x3A, 0x36, 0x80, 0x6E, 0x24, 0x80, 0x04, 0x6C, 0x80, 0x0C, 0xC8, 0x80, 0x08, 0x19, 0x80, 0x18, 0x31, 0x00, 0x30, 0x61, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B7F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x11, 0x00, 0x0F, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x10, 0xC2, 0x00, 0x19, 0x0C, 0x00, 0x15, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x02, 0x42, 0x00, 0x04, 0x24, 0x00, 0x04, 0x18, 0x00, 0x08, 0x18, 0x00, 0x10, 0x66, 0x00, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B80, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x10, 0x78, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3A, 0x08, 0x00, 0x6E, 0x1C, 0x00, 0x04, 0x14, 0x00, 0x0C, 0x14, 0x00, 0x08, 0x36, 0x00, 0x18, 0x22, 0x00, 0x30, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B81, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x7E, 0x00, 0x7F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1E, 0x87, 0x00, 0x13, 0x00, 0x00, 0x22, 0xFC, 0x00, 0x32, 0x04, 0x00, 0x4C, 0x44, 0x00, 0x04, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x10, 0x48, 0x00, 0x20, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1E, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x3A, 0x42, 0x00, 0x6E, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x31, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B83, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x2B, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x10, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B84, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xA8, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x89, 0x80, 0x0F, 0x08, 0x00, 0x11, 0x12, 0x00, 0x11, 0x22, 0x00, 0x2A, 0x44, 0x00, 0x26, 0x88, 0x80, 0x04, 0x11, 0x00, 0x04, 0x22, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x08, 0x00, 0x10, 0x30, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B85, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0xFF, 0x00, 0x3C, 0x90, 0x00, 0x25, 0x10, 0x00, 0x24, 0x10, 0x00, 0x54, 0x10, 0x00, 0x4C, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x41, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B86, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xCF, 0x00, 0x11, 0x70, 0x80, 0x11, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x06, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B87, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x42, 0x00, 0x7F, 0x7F, 0x00, 0x10, 0x80, 0x00, 0x11, 0x7C, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x12, 0x00, 0x22, 0xFF, 0x00, 0x32, 0x4A, 0x00, 0x4C, 0x4A, 0x00, 0x04, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x22, 0x00, 0x12, 0x42, 0x00, 0x20, 0x94, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B89, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x0F, 0x80, 0x80, 0x11, 0x7C, 0x80, 0x11, 0x44, 0x80, 0x1A, 0x7C, 0x80, 0x26, 0x44, 0x80, 0x02, 0x7C, 0x80, 0x04, 0x44, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x10, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B8A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x28, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x88, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x26, 0x1C, 0x00, 0x02, 0x2C, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x22, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B8B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x10, 0x11, 0x00, 0x10, 0xFF, 0x80, 0x1E, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x3A, 0x10, 0x00, 0x6E, 0x19, 0x00, 0x04, 0x0B, 0x00, 0x0C, 0x0E, 0x00, 0x08, 0x1C, 0x00, 0x18, 0x76, 0x80, 0x31, 0xC3, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B8D, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x10, 0x7A, 0x00, 0x10, 0x53, 0x00, 0x1E, 0xD9, 0x80, 0x12, 0x88, 0x80, 0x32, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x3A, 0x04, 0x00, 0x6E, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B92, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0xFF, 0x00, 0x7F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1E, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x32, 0x92, 0x00, 0x4C, 0x92, 0x00, 0x04, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x28, 0x00, 0x20, 0x46, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B93, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x1F, 0x05, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x00, 0x00, 0x32, 0x22, 0x00, 0x4C, 0x92, 0x00, 0x04, 0x92, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x10, 0x08, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B95, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x66, 0x00, 0x12, 0x24, 0x00, 0x32, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x3A, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x30, 0x42, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B96, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0xBF, 0x00, 0x11, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x26, 0xBF, 0x00, 0x04, 0xA1, 0x00, 0x04, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA0, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B97, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x1C, 0x54, 0x00, 0x14, 0x92, 0x00, 0x35, 0xFF, 0x00, 0x26, 0x92, 0x80, 0x74, 0x92, 0x00, 0x1C, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x10, 0x80, 0x30, 0x19, 0x80, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B98, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x24, 0x00, 0x08, 0x20, 0x00, 0x08, 0x2F, 0x80, 0x09, 0xF0, 0x00, 0x0F, 0x10, 0x00, 0x09, 0x0C, 0x80, 0x11, 0x23, 0x80, 0x1A, 0x28, 0x00, 0x26, 0x27, 0x80, 0x04, 0x38, 0x00, 0x05, 0xD2, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x80, 0x10, 0x66, 0x80, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B9A, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x02, 0x44, 0x00, 0x7F, 0x08, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x92, 0x00, 0x32, 0x92, 0x00, 0x4C, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1C, 0x78, 0x00, 0x14, 0x08, 0x00, 0x35, 0xCF, 0x80, 0x25, 0x48, 0x80, 0x75, 0x4A, 0x80, 0x1D, 0x49, 0x00, 0x09, 0xDB, 0x00, 0x08, 0x14, 0x80, 0x18, 0x70, 0x00, 0x10, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6B9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x0F, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x19, 0x40, 0x80, 0x15, 0x7F, 0x80, 0x22, 0x40, 0x80, 0x02, 0x7F, 0x80, 0x04, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x10, 0x21, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6B9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1C, 0xBA, 0x00, 0x14, 0xEE, 0x00, 0x34, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x74, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x19, 0x49, 0x00, 0x11, 0x49, 0x00, 0x33, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BA0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x20, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x32, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x3A, 0xFE, 0x00, 0x6E, 0x10, 0x00, 0x04, 0x11, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x18, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BA1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x12, 0x1A, 0x00, 0x1E, 0xE0, 0x00, 0x12, 0x84, 0x00, 0x22, 0xFE, 0x00, 0x32, 0x88, 0x00, 0x4C, 0x88, 0x00, 0x04, 0x8A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x10, 0x88, 0x00, 0x21, 0x06, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BA2, { 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x7C, 0xAA, 0x00, 0x13, 0xFF, 0x80, 0x10, 0xAA, 0x00, 0x1D, 0xAA, 0x00, 0x17, 0x3B, 0x80, 0x34, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x75, 0x10, 0x80, 0x1D, 0x10, 0x80, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x18, 0x91, 0x00, 0x10, 0x91, 0x00, 0x30, 0x93, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BA3, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x1E, 0x3E, 0x00, 0x12, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3A, 0x49, 0x00, 0x6E, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BA4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7E, 0xFF, 0x00, 0x11, 0x80, 0x00, 0x10, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x32, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x3A, 0x00, 0x00, 0x6F, 0xFF, 0x80, 0x04, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0x09, 0xA5, 0x00, 0x18, 0x49, 0x00, 0x30, 0x93, 0x00, 0x60, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BA8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3A, 0x41, 0x00, 0x6E, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEF, 0x00, 0x10, 0x81, 0x00, 0x11, 0xEA, 0x00, 0x1D, 0x24, 0x00, 0x16, 0xAA, 0x00, 0x34, 0x51, 0x80, 0x25, 0x80, 0x00, 0x74, 0x92, 0x00, 0x1C, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x18, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x33, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BAA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x32, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x3A, 0xBE, 0x80, 0x6E, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x22, 0x00, 0x30, 0x14, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BAB, { 0x00, 0x00, 0x00, 0x00, 0xF7, 0x80, 0x7E, 0x94, 0x80, 0x10, 0xF7, 0x80, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3A, 0x49, 0x00, 0x6E, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x10, 0x55, 0x00, 0x10, 0x55, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3A, 0xFF, 0x80, 0x6E, 0x22, 0x00, 0x04, 0x14, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x49, 0x00, 0x22, 0xFF, 0x80, 0x3A, 0x00, 0x00, 0x6E, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x0C, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x00, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BAE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x94, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x1F, 0x7F, 0x00, 0x11, 0x00, 0x00, 0x11, 0x77, 0x00, 0x29, 0x55, 0x00, 0x06, 0x55, 0x00, 0x02, 0x77, 0x00, 0x04, 0x00, 0x00, 0x04, 0x22, 0x00, 0x08, 0x22, 0x00, 0x10, 0x55, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BAF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0x7F, 0x00, 0x1E, 0x28, 0x80, 0x12, 0x4B, 0x00, 0x12, 0x0C, 0x00, 0x2A, 0x7F, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x1E, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x32, 0xA4, 0x80, 0x22, 0xFF, 0x80, 0x3A, 0x41, 0x00, 0x6E, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB1, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x45, 0x00, 0x11, 0xF5, 0x80, 0x10, 0x44, 0x80, 0x1C, 0x44, 0x00, 0x17, 0xFF, 0x80, 0x34, 0xA4, 0x00, 0x25, 0xB5, 0x00, 0x74, 0xA5, 0x00, 0x1D, 0xB5, 0x00, 0x08, 0xA7, 0x00, 0x09, 0xB2, 0x00, 0x18, 0xA6, 0x00, 0x10, 0xF6, 0x80, 0x33, 0x8B, 0x80, 0x60, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BB2, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xA5, 0x00, 0x08, 0xA4, 0x80, 0x09, 0x54, 0x00, 0x0A, 0x4C, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0xA4, 0x00, 0x13, 0xBC, 0x80, 0x2A, 0xA5, 0x00, 0x27, 0xBD, 0x00, 0x04, 0xA6, 0x00, 0x07, 0xBC, 0x00, 0x08, 0xEC, 0x00, 0x0F, 0x12, 0x80, 0x10, 0x61, 0x80, 0x21, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x1F, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x0C, 0x00, 0x03, 0x18, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB0, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7C, 0x00, 0x40, 0x44, 0x00, 0x40, 0x44, 0x00, 0x54, 0xC4, 0x00, 0x55, 0x87, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x42, 0x00, 0x54, 0x66, 0x00, 0x54, 0x2C, 0x00, 0x40, 0x38, 0x00, 0x40, 0x10, 0x00, 0x7E, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x01, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BB5, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x80, 0x1E, 0x47, 0x80, 0x10, 0x80, 0x00, 0x11, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x24, 0x00, 0x17, 0x18, 0x00, 0x38, 0x18, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB7, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x3E, 0x00, 0x10, 0x22, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x22, 0x80, 0x1F, 0x43, 0x80, 0x11, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x21, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x94, 0x00, 0x10, 0x88, 0x00, 0x10, 0x94, 0x00, 0x11, 0x22, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB8, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xA3, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x9B, 0x00, 0x20, 0x0E, 0x00, 0x20, 0x04, 0x00, 0x20, 0x0E, 0x00, 0x20, 0x1B, 0x00, 0x40, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDE, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x2F, 0x92, 0x00, 0x3A, 0x23, 0x80, 0x22, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0x9B, 0x00, 0x2C, 0xCE, 0x00, 0x38, 0x44, 0x00, 0x20, 0x0E, 0x00, 0x1F, 0xDB, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BBA, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x11, 0x22, 0x80, 0x20, 0x43, 0x80, 0x04, 0x40, 0x00, 0x04, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x21, 0x00, 0x0E, 0x12, 0x00, 0x0D, 0x14, 0x00, 0x14, 0x88, 0x00, 0x24, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BBB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x3F, 0x23, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xBF, 0x00, 0x40, 0x91, 0x00, 0x5E, 0x93, 0x00, 0x12, 0x12, 0x00, 0x12, 0x16, 0x00, 0x12, 0x0C, 0x00, 0x32, 0x9E, 0x00, 0x21, 0xB3, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BBC, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x80, 0x3F, 0xA2, 0x80, 0x20, 0xA3, 0x80, 0x1F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x21, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x92, 0x00, 0x26, 0x61, 0x00, 0x21, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BBD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x33, 0x1E, 0x00, 0x0C, 0x12, 0x00, 0x33, 0x92, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xA3, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x31, 0x11, 0x00, 0x5F, 0x11, 0x00, 0x11, 0x1B, 0x00, 0x1F, 0x0E, 0x00, 0x11, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x11, 0x1B, 0x00, 0x13, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BBE, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9E, 0x00, 0x3F, 0x92, 0x00, 0x09, 0x12, 0x00, 0x0B, 0x12, 0x00, 0x0A, 0x23, 0x80, 0x7F, 0x80, 0x00, 0x0C, 0x3F, 0x00, 0x12, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x51, 0x1B, 0x00, 0x11, 0x0E, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x11, 0x1B, 0x00, 0x1F, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xDE, 0x00, 0x10, 0x52, 0x00, 0x10, 0x52, 0x00, 0x1F, 0xD2, 0x80, 0x10, 0x13, 0x80, 0x15, 0x20, 0x00, 0x15, 0x40, 0x00, 0x1F, 0xDF, 0x80, 0x15, 0x09, 0x00, 0x15, 0x0A, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x25, 0x0A, 0x00, 0x25, 0x11, 0x00, 0x28, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x67, 0x3E, 0x00, 0x41, 0x22, 0x00, 0x41, 0x22, 0x00, 0x77, 0x22, 0x00, 0x41, 0x43, 0x80, 0x41, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x21, 0x00, 0x08, 0x33, 0x00, 0x7F, 0x12, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x0C, 0x00, 0x0F, 0x1E, 0x00, 0x38, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC1, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x33, 0x9E, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x80, 0x3B, 0x92, 0x80, 0x20, 0xA3, 0x80, 0x20, 0xC0, 0x00, 0x3F, 0x80, 0x00, 0x24, 0xBF, 0x80, 0x04, 0x11, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x04, 0x00, 0x07, 0xCA, 0x00, 0x38, 0x31, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC2, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBE, 0x00, 0x04, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x00, 0x24, 0x00, 0x7F, 0xA4, 0x00, 0x48, 0xC3, 0x00, 0x49, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x14, 0x42, 0x00, 0x14, 0x44, 0x00, 0x3F, 0x28, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xA8, 0x00, 0x04, 0x47, 0x00, 0x05, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BC3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x00, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x23, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x91, 0x00, 0x2E, 0x9B, 0x00, 0x2A, 0x8E, 0x00, 0x2A, 0x84, 0x00, 0x2E, 0x8E, 0x00, 0x20, 0x9B, 0x00, 0x21, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x24, 0xA3, 0x80, 0x3F, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xDB, 0x00, 0x04, 0x0E, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x8E, 0x00, 0x20, 0x9B, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x3F, 0xA2, 0x00, 0x11, 0x22, 0x00, 0x0A, 0x22, 0x80, 0x3F, 0xC3, 0x80, 0x04, 0x40, 0x00, 0x0A, 0xFF, 0x00, 0x17, 0x21, 0x00, 0x2A, 0x12, 0x00, 0x13, 0x14, 0x00, 0x26, 0x88, 0x00, 0x0A, 0x4C, 0x00, 0x12, 0x32, 0x00, 0x22, 0x21, 0x00, 0x0C, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDE, 0x00, 0x20, 0x12, 0x00, 0x27, 0x92, 0x00, 0x24, 0x92, 0x80, 0x24, 0xA3, 0x80, 0x27, 0xA0, 0x00, 0x20, 0x40, 0x00, 0x20, 0x3F, 0x80, 0x2F, 0xD1, 0x00, 0x2B, 0x52, 0x00, 0x2B, 0x4C, 0x00, 0x2F, 0xCC, 0x00, 0x20, 0x12, 0x00, 0x3F, 0xE1, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BC9, { 0x00, 0x00, 0x00, 0x3F, 0xDE, 0x00, 0x24, 0x12, 0x00, 0x27, 0x93, 0x80, 0x2A, 0x20, 0x00, 0x3F, 0xDF, 0x00, 0x25, 0x0A, 0x00, 0x28, 0x84, 0x00, 0x3F, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1C, 0x8E, 0x00, 0x36, 0x9B, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x1F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x04, 0x41, 0x00, 0x04, 0x21, 0x00, 0x04, 0x11, 0x00, 0x04, 0x01, 0x00, 0x1F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x42, 0x00, 0x08, 0x22, 0x00, 0x08, 0x02, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BCE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x67, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BCF, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x20, 0x22, 0x00, 0x1F, 0x4F, 0x00, 0x19, 0xF0, 0x80, 0x15, 0x00, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x32, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x3F, 0x4A, 0x80, 0x22, 0x4B, 0x80, 0x06, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x21, 0x80, 0x0F, 0xA6, 0x00, 0x08, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0xE0, 0x80, 0x0F, 0x20, 0x80, 0x38, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD5, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x4C, 0x00, 0x1F, 0x70, 0x00, 0x10, 0x40, 0x00, 0x11, 0x42, 0x00, 0x16, 0x42, 0x00, 0x38, 0x3E, 0x00, 0x10, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x21, 0x80, 0x0F, 0xA6, 0x00, 0x08, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x0B, 0xE0, 0x80, 0x3C, 0x3F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x02, 0x12, 0x00, 0x0A, 0x21, 0x00, 0x12, 0xC2, 0x80, 0x23, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD7, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x2A, 0x89, 0x80, 0x2A, 0x8E, 0x00, 0x2A, 0xF8, 0x00, 0x3E, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x22, 0x88, 0x80, 0x20, 0xF8, 0x80, 0x03, 0x8F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x21, 0x80, 0x0F, 0xE6, 0x00, 0x08, 0x38, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x0F, 0xA0, 0x80, 0x38, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BD9, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x4C, 0x00, 0x1F, 0x70, 0x00, 0x10, 0x40, 0x00, 0x17, 0x44, 0x00, 0x18, 0x3C, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0x44, 0x00, 0x11, 0x4C, 0x00, 0x29, 0x50, 0x00, 0x06, 0x60, 0x00, 0x04, 0x42, 0x00, 0x08, 0x42, 0x00, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BDA, { 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x80, 0x08, 0x21, 0x80, 0x7F, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x24, 0x00, 0x0E, 0x20, 0x80, 0x78, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BDB, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xBF, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xBF, 0x80, 0x3F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BDF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8E, 0x00, 0x18, 0x83, 0x80, 0x73, 0x98, 0x00, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x00, 0x7C, 0x38, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x8C, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x83, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BE1, { 0x00, 0x00, 0x00, 0x06, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x7E, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x7F, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x00, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BE3, { 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x05, 0x05, 0x00, 0x19, 0x19, 0x00, 0x67, 0x67, 0x00, 0x1D, 0x1D, 0x00, 0x71, 0x71, 0x00, 0x01, 0x01, 0x00, 0x00, 0x38, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BE6, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x22, 0x78, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x62, 0x10, 0x80, 0x02, 0x19, 0x80, 0x02, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BE7, { 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x1C, 0x04, 0x80, 0x70, 0x04, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x7E, 0x24, 0x80, 0x10, 0x24, 0x80, 0x10, 0xFD, 0x00, 0x10, 0x25, 0x00, 0x7E, 0x26, 0x00, 0x10, 0x62, 0x80, 0x10, 0x43, 0x80, 0x10, 0xC5, 0x00, 0x11, 0x98, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BEA, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x78, 0x44, 0x00, 0x08, 0x42, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x94, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x90, 0x00, 0x0F, 0x12, 0x00, 0x79, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BEB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x38, 0x80, 0x07, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BEC, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x07, 0x09, 0x00, 0x38, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0F, 0x49, 0x00, 0x38, 0x2A, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x2C, 0x00, 0x0F, 0x4A, 0x00, 0x38, 0x89, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BEE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x7D, 0xB3, 0x00, 0x13, 0x0D, 0x80, 0x10, 0x38, 0x00, 0x11, 0xE0, 0x00, 0x10, 0x06, 0x00, 0x1C, 0xFC, 0x00, 0x70, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x18, 0x80, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BEF, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x1C, 0x51, 0x00, 0x70, 0xD3, 0x00, 0x10, 0xBA, 0x00, 0x10, 0x28, 0x00, 0x1E, 0x6C, 0x00, 0x70, 0xC6, 0x00, 0x10, 0x10, 0x00, 0x10, 0x51, 0x00, 0x1E, 0xD3, 0x00, 0x70, 0xBA, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BF1, { 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x70, 0xFF, 0x00, 0x11, 0x81, 0x00, 0x10, 0x55, 0x00, 0x7E, 0x55, 0x00, 0x10, 0x11, 0x00, 0x10, 0x7D, 0x00, 0x10, 0x11, 0x00, 0x7E, 0x39, 0x00, 0x10, 0x55, 0x00, 0x10, 0x93, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BF3, { 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x02, 0x00, 0x00, 0xFE, 0x00, 0x06, 0x04, 0x00, 0x3C, 0x38, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x88, 0x80, 0x07, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6BF5, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1E, 0x00, 0x12, 0xF0, 0x00, 0x3F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x94, 0x00, 0x14, 0x7E, 0x00, 0x26, 0x10, 0x00, 0x49, 0x10, 0x00, 0x12, 0x12, 0x00, 0x24, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x32, 0x10, 0x00, 0x04, 0x11, 0x00, 0x18, 0x11, 0x00, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BF7, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x41, 0x78, 0x00, 0x5D, 0x10, 0x00, 0x41, 0x10, 0x00, 0x5D, 0x7F, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x80, 0x22, 0x19, 0x80, 0x3E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BF9, { 0x00, 0x00, 0x00, 0x3C, 0x03, 0x00, 0x06, 0x0E, 0x00, 0x0A, 0x38, 0x00, 0x1B, 0x08, 0x00, 0x31, 0x88, 0x00, 0x6E, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x79, 0x48, 0x00, 0x49, 0x48, 0x00, 0x69, 0x7F, 0x80, 0x5A, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x6A, 0x88, 0x00, 0x59, 0x48, 0x80, 0x49, 0x49, 0x80, 0x59, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BFD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x14, 0x00, 0x70, 0x7E, 0x00, 0x17, 0x14, 0x00, 0x11, 0xFF, 0x00, 0x12, 0x14, 0x00, 0x7A, 0x7C, 0x00, 0x17, 0x10, 0x00, 0x11, 0x7C, 0x00, 0x11, 0x10, 0x00, 0x7D, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x15, 0x11, 0x00, 0x18, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6BFF, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x12, 0x0E, 0x00, 0x1E, 0x38, 0x00, 0x21, 0x08, 0x00, 0x4A, 0x48, 0x00, 0x7B, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x31, 0x88, 0x00, 0x64, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x32, 0x08, 0x00, 0x0C, 0xC8, 0x00, 0x31, 0x88, 0x80, 0x07, 0x09, 0x80, 0x7C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C02, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xD2, 0x00, 0x15, 0x0C, 0x00, 0x64, 0xB3, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x23, 0xF0, 0x00, 0x20, 0x80, 0x00, 0x27, 0xFC, 0x00, 0x20, 0x80, 0x00, 0x2F, 0xFE, 0x80, 0x40, 0x81, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C04, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x3F, 0xC7, 0x00, 0x08, 0x9C, 0x00, 0x05, 0x04, 0x00, 0x7F, 0xE4, 0x00, 0x0A, 0x5F, 0x80, 0x12, 0x84, 0x00, 0x26, 0x04, 0x00, 0x7F, 0xE4, 0x00, 0x49, 0x3F, 0x80, 0x51, 0x24, 0x00, 0x6F, 0xE4, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x80, 0x4F, 0x24, 0x80, 0x40, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C05, { 0x00, 0x00, 0x00, 0x15, 0x10, 0x00, 0x24, 0x90, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xE2, 0x00, 0x2E, 0x94, 0x00, 0x2A, 0x88, 0x00, 0x2E, 0x96, 0x00, 0x21, 0xA1, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x80, 0x01, 0x01, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C06, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x1C, 0x90, 0x00, 0x73, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x12, 0x94, 0x00, 0x11, 0x98, 0x00, 0x78, 0x92, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF8, 0x00, 0x7D, 0x08, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x11, 0xF9, 0x00, 0x10, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C07, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1C, 0xF8, 0x00, 0x71, 0x10, 0x00, 0x13, 0xFC, 0x00, 0x15, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x79, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFD, 0x00, 0x10, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C08, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x38, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x2E, 0x8F, 0x00, 0x20, 0xB8, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x0F, 0x00, 0x11, 0x38, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x80, 0x17, 0x8F, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C09, { 0x00, 0x00, 0x00, 0x1F, 0x03, 0x00, 0x11, 0x0E, 0x00, 0x11, 0x38, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x3B, 0x88, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xC8, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x35, 0x88, 0x80, 0x64, 0xC9, 0x80, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C0D, { 0x00, 0x00, 0x00, 0x3B, 0x83, 0x00, 0x2A, 0x8E, 0x00, 0x3B, 0xB8, 0x00, 0x2A, 0x88, 0x00, 0x3B, 0x88, 0x00, 0x2A, 0xBF, 0x00, 0x3B, 0x88, 0x00, 0x12, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x64, 0x3F, 0x80, 0x3F, 0xC8, 0x00, 0x24, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x08, 0x80, 0x3F, 0xC9, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C0E, { 0x00, 0x00, 0x00, 0x1F, 0xC1, 0x80, 0x12, 0x4F, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x7F, 0xF2, 0x00, 0x55, 0x5F, 0x80, 0x7D, 0xF2, 0x00, 0x55, 0x52, 0x00, 0x7D, 0xF2, 0x00, 0x02, 0x0F, 0x80, 0x7F, 0xF2, 0x00, 0x48, 0x12, 0x00, 0x1F, 0xC2, 0x00, 0x34, 0x42, 0x80, 0x02, 0x82, 0x80, 0x7F, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C0F, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0xF4, 0x80, 0x0F, 0x02, 0x80, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C10, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x30, 0x00, 0x10, 0x10, 0x00, 0x10, 0x18, 0x00, 0x1F, 0x08, 0x00, 0x70, 0x0C, 0x00, 0x00, 0x06, 0x80, 0x3F, 0xF3, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x17, 0x88, 0x80, 0x38, 0x04, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C12, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x30, 0x80, 0x1E, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C13, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x3F, 0xC1, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x1F, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x7A, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C14, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x80, 0x00, 0x02, 0x80, 0x00, 0x03, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C15, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x05, 0x00, 0x04, 0x05, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C16, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x4F, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xE4, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0xF4, 0x00, 0x04, 0x14, 0x00, 0x08, 0x15, 0x00, 0x08, 0x15, 0x00, 0x10, 0xA5, 0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C17, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x00, 0x0C, 0x64, 0x00, 0x06, 0xC4, 0x00, 0x03, 0x84, 0x00, 0x06, 0xC6, 0x80, 0x0C, 0x62, 0x80, 0x18, 0x23, 0x80, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C18, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x45, 0x00, 0x10, 0x45, 0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C19, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x26, 0x80, 0x22, 0x22, 0x80, 0x3F, 0xE3, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C1A, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0x25, 0x00, 0x11, 0x25, 0x00, 0x20, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C1B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x01, 0xC4, 0x00, 0x0C, 0x64, 0x00, 0x38, 0x3C, 0x00, 0x0F, 0xE4, 0x00, 0x02, 0x26, 0x80, 0x06, 0x62, 0x80, 0x1C, 0x43, 0x80, 0x71, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C1F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x1F, 0xF4, 0x00, 0x04, 0x94, 0x00, 0x3F, 0xF4, 0x00, 0x24, 0x84, 0x00, 0x3F, 0xF6, 0x80, 0x04, 0x92, 0x80, 0x0C, 0xB3, 0x80, 0x18, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C21, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x07, 0xE4, 0x00, 0x08, 0x44, 0x00, 0x36, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0xC4, 0x00, 0x3B, 0x3C, 0x00, 0x00, 0x85, 0x00, 0x06, 0x05, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C22, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x08, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xC8, 0x00, 0x01, 0x08, 0x00, 0x06, 0xC8, 0x00, 0x38, 0x38, 0x00, 0x0F, 0xE8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x29, 0x00, 0x3F, 0xF5, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C23, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x2F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x22, 0x28, 0x00, 0x12, 0x48, 0x00, 0x0A, 0x88, 0x00, 0x3F, 0xF8, 0x00, 0x07, 0x08, 0x00, 0x0A, 0x88, 0x00, 0x12, 0x44, 0x80, 0x22, 0x32, 0x80, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C24, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xF4, 0x00, 0x11, 0x14, 0x00, 0x17, 0xD4, 0x00, 0x11, 0x14, 0x00, 0x13, 0x96, 0x80, 0x16, 0xD2, 0x80, 0x10, 0x13, 0x80, 0x1F, 0xF1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C26, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x04, 0x84, 0x00, 0x03, 0x36, 0x80, 0x1C, 0x42, 0x80, 0x01, 0xA3, 0x80, 0x3E, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C27, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x24, 0x00, 0x04, 0x44, 0x00, 0x1F, 0xF4, 0x00, 0x01, 0x04, 0x00, 0x0F, 0xE4, 0x00, 0x01, 0x06, 0x80, 0x3F, 0xFA, 0x80, 0x01, 0x03, 0x80, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C28, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xE4, 0x00, 0x10, 0x24, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x08, 0x46, 0x80, 0x1E, 0xC2, 0x80, 0x03, 0x83, 0x80, 0x1C, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C29, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x04, 0x84, 0x00, 0x24, 0x94, 0x00, 0x14, 0xA4, 0x00, 0x14, 0xC4, 0x00, 0x04, 0x84, 0x00, 0x04, 0x85, 0x00, 0x7F, 0xFD, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C2A, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x05, 0x04, 0x00, 0x05, 0x15, 0x00, 0x09, 0x15, 0x00, 0x30, 0xF2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C2C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xF4, 0x00, 0x02, 0x84, 0x00, 0x1E, 0xF4, 0x00, 0x10, 0x14, 0x00, 0x1E, 0xF6, 0x80, 0x02, 0x82, 0x80, 0x3F, 0xFB, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C2E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x09, 0x14, 0x00, 0x13, 0xA4, 0x00, 0x06, 0xC4, 0x00, 0x1D, 0x74, 0x00, 0x09, 0x16, 0x80, 0x13, 0xA2, 0x80, 0x06, 0xC3, 0x80, 0x1C, 0x71, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C2F, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x24, 0x00, 0x1F, 0xF4, 0x00, 0x00, 0x24, 0x00, 0x0F, 0xE4, 0x00, 0x00, 0x24, 0x00, 0x7F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x05, 0x45, 0x00, 0x19, 0x35, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C30, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x08, 0x00, 0x5F, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xC8, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xC8, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xE8, 0x00, 0x00, 0x48, 0x00, 0x04, 0x89, 0x00, 0x03, 0x05, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C32, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x5F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xE4, 0x00, 0x13, 0x24, 0x00, 0x1F, 0xE4, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x24, 0x94, 0x00, 0x24, 0x95, 0x00, 0x7F, 0xFD, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C33, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xE4, 0x00, 0x09, 0x24, 0x00, 0x0A, 0xA4, 0x00, 0x0F, 0xE4, 0x00, 0x00, 0x06, 0x00, 0x1F, 0xF2, 0x80, 0x12, 0x53, 0x80, 0x3F, 0xF9, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C34, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC2, 0x00, 0x7E, 0x86, 0x00, 0x02, 0x8C, 0x00, 0x06, 0xD8, 0x00, 0x04, 0xE0, 0x00, 0x0C, 0xB0, 0x00, 0x08, 0x98, 0x00, 0x18, 0x8C, 0x00, 0x30, 0x86, 0x00, 0x60, 0x83, 0x80, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C37, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x20, 0x00, 0x04, 0x20, 0x80, 0x02, 0x21, 0x00, 0x00, 0x22, 0x00, 0x1F, 0xB4, 0x00, 0x00, 0xB0, 0x00, 0x01, 0x30, 0x00, 0x01, 0x28, 0x00, 0x02, 0x28, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x08, 0x22, 0x00, 0x10, 0x21, 0x00, 0x20, 0x20, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C38, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x20, 0x80, 0x00, 0x31, 0x00, 0x1F, 0xB2, 0x00, 0x00, 0xB0, 0x00, 0x00, 0xA8, 0x00, 0x01, 0x28, 0x00, 0x01, 0x28, 0x00, 0x02, 0x24, 0x00, 0x04, 0x24, 0x00, 0x08, 0x22, 0x00, 0x30, 0x21, 0x00, 0x00, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C3A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x18, 0x86, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x98, 0x00, 0x00, 0x90, 0x00, 0x02, 0x80, 0x00, 0x06, 0xF0, 0x00, 0x0C, 0x9C, 0x00, 0x38, 0x86, 0x00, 0x60, 0x83, 0x00, 0x00, 0x81, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C3B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x60, 0x21, 0x00, 0x30, 0x21, 0x00, 0x10, 0x21, 0x00, 0x00, 0x21, 0x00, 0x08, 0x61, 0x00, 0x08, 0x41, 0x00, 0x18, 0x41, 0x00, 0x10, 0xC1, 0x00, 0x30, 0x83, 0x00, 0x21, 0x82, 0x00, 0x63, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C3D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x98, 0x00, 0x18, 0x87, 0x00, 0x60, 0x82, 0x00, 0x1E, 0xC8, 0x00, 0x02, 0xB0, 0x00, 0x04, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x87, 0x00, 0x20, 0x82, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C3E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x20, 0x81, 0x00, 0x10, 0x81, 0x00, 0x00, 0x81, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C3F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x40, 0x00, 0x18, 0x40, 0x00, 0x08, 0x40, 0x00, 0x03, 0xFC, 0x00, 0x60, 0x44, 0x00, 0x30, 0x44, 0x00, 0x10, 0x44, 0x00, 0x00, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x31, 0x84, 0x80, 0x23, 0x04, 0x80, 0x66, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C40, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x20, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C41, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C42, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x10, 0x42, 0x00, 0x08, 0xE4, 0x00, 0x04, 0xE8, 0x00, 0x01, 0x50, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x48, 0x00, 0x08, 0x44, 0x00, 0x10, 0x42, 0x00, 0x21, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C46, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x8C, 0x00, 0x60, 0x83, 0x00, 0x00, 0x80, 0x00, 0x1E, 0xC8, 0x00, 0x02, 0xB0, 0x00, 0x04, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x87, 0x00, 0x20, 0x82, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x00, 0x00, 0x02, 0x00, 0x00, 0x42, 0x00, 0x00, 0x32, 0x00, 0x00, 0x12, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x72, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x41, 0x04, 0x00, 0x31, 0x04, 0x00, 0x11, 0x08, 0x00, 0x04, 0x88, 0x00, 0x08, 0x90, 0x00, 0x10, 0x50, 0x00, 0x70, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x04, 0x00, 0x12, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x22, 0x00, 0x01, 0xB2, 0x00, 0x60, 0x96, 0x00, 0x30, 0xC4, 0x00, 0x10, 0x4C, 0x00, 0x00, 0x68, 0x00, 0x08, 0x38, 0x00, 0x08, 0x10, 0x00, 0x18, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x21, 0x83, 0x00, 0x67, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C4B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x01, 0x81, 0x00, 0x61, 0x01, 0x00, 0x33, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0x79, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x18, 0x01, 0x00, 0x10, 0x01, 0x00, 0x30, 0x03, 0x00, 0x20, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C4D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x03, 0xFC, 0x00, 0x60, 0x24, 0x00, 0x30, 0x24, 0x00, 0x11, 0xA4, 0x00, 0x00, 0xE4, 0x00, 0x08, 0x64, 0x00, 0x08, 0x74, 0x00, 0x18, 0xD4, 0x00, 0x10, 0x84, 0x00, 0x31, 0x84, 0x80, 0x23, 0x04, 0x80, 0x66, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C4E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x21, 0x44, 0x00, 0x11, 0x24, 0x00, 0x01, 0x24, 0x00, 0x05, 0x14, 0x00, 0x05, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x80, 0x12, 0x04, 0x80, 0x12, 0x07, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C4F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x67, 0xFF, 0x80, 0x30, 0x50, 0x00, 0x10, 0x50, 0x00, 0x00, 0x50, 0x00, 0x08, 0xD8, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8C, 0x00, 0x11, 0x84, 0x00, 0x31, 0x06, 0x00, 0x23, 0x03, 0x00, 0x66, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C50, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x20, 0x40, 0x80, 0x10, 0x81, 0x00, 0x01, 0x21, 0x00, 0x02, 0x12, 0x00, 0x08, 0x14, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x21, 0x80, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C52, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x61, 0x00, 0x00, 0x31, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0x00, 0x00, 0x11, 0x00, 0x00, 0x31, 0x80, 0x00, 0x20, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C54, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x63, 0x00, 0x00, 0x36, 0xFE, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x08, 0x30, 0x00, 0x08, 0x60, 0x00, 0x18, 0xC0, 0x00, 0x11, 0x80, 0x00, 0x31, 0x00, 0x80, 0x21, 0x81, 0x80, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C55, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x21, 0x11, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C57, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x60, 0x10, 0x00, 0x30, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C5A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFC, 0x00, 0x18, 0x44, 0x00, 0x08, 0x44, 0x00, 0x00, 0x44, 0x00, 0x60, 0x44, 0x00, 0x30, 0x44, 0x00, 0x11, 0xF4, 0x00, 0x00, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x30, 0x82, 0x80, 0x21, 0x83, 0x80, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x01, 0x01, 0x00, 0x61, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0x00, 0x00, 0x11, 0x00, 0x80, 0x31, 0x81, 0x80, 0x20, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C5D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x44, 0x00, 0x10, 0x84, 0x00, 0x00, 0x84, 0x00, 0x09, 0x08, 0x00, 0x09, 0x88, 0x00, 0x0A, 0x70, 0x00, 0x12, 0x18, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x20, 0x81, 0x00, 0x23, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x51, 0x00, 0x1F, 0x52, 0x00, 0x01, 0x54, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C5F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C60, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x01, 0x20, 0x00, 0x21, 0x23, 0x00, 0x11, 0x2D, 0x00, 0x01, 0x71, 0x00, 0x07, 0xA1, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x11, 0x2F, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x80, 0x21, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C61, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x02, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x84, 0x00, 0x11, 0xFE, 0x00, 0x70, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x44, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C62, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x60, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x0C, 0x08, 0x00, 0x04, 0x10, 0x00, 0x40, 0x20, 0x00, 0x30, 0x42, 0x00, 0x11, 0xFF, 0x00, 0x04, 0x52, 0x00, 0x08, 0x52, 0x00, 0x10, 0x92, 0x00, 0x70, 0xA2, 0x00, 0x11, 0x22, 0x00, 0x12, 0x42, 0x00, 0x14, 0x82, 0x00, 0x11, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xEF, 0x80, 0x18, 0x82, 0x00, 0x08, 0x82, 0x00, 0x00, 0x82, 0x00, 0x60, 0x82, 0x00, 0x30, 0xE2, 0x00, 0x13, 0x8F, 0x80, 0x00, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x11, 0x82, 0x00, 0x31, 0x02, 0x00, 0x23, 0x02, 0x00, 0x66, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C68, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0x01, 0x00, 0x05, 0x01, 0x00, 0x05, 0xFF, 0x00, 0x05, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x42, 0x02, 0x00, 0x22, 0x02, 0x00, 0x26, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x72, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C6A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C6B, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x44, 0x00, 0x18, 0x44, 0x00, 0x08, 0x44, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x44, 0x00, 0x30, 0x44, 0x00, 0x10, 0x44, 0x00, 0x00, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x30, 0x84, 0x00, 0x21, 0x84, 0x00, 0x63, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C6D, { 0x00, 0x00, 0x00, 0x10, 0x70, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x45, 0x00, 0x09, 0x83, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C6F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x40, 0x00, 0x18, 0x40, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x60, 0x40, 0x00, 0x30, 0xC8, 0x00, 0x10, 0x88, 0x00, 0x00, 0x88, 0x00, 0x08, 0x98, 0x00, 0x09, 0x90, 0x00, 0x19, 0x12, 0x00, 0x13, 0x32, 0x00, 0x32, 0x22, 0x00, 0x26, 0x3F, 0x00, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C70, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x10, 0x44, 0x00, 0x10, 0x52, 0x00, 0x10, 0x8A, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C72, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x20, 0x88, 0x00, 0x10, 0x88, 0x00, 0x00, 0x8F, 0x00, 0x08, 0xC1, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x12, 0x00, 0x11, 0x14, 0x00, 0x11, 0x0C, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x12, 0x00, 0x24, 0x21, 0x00, 0x28, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x61, 0xFE, 0x00, 0x31, 0x42, 0x00, 0x11, 0x46, 0x00, 0x01, 0x64, 0x00, 0x09, 0x2C, 0x00, 0x09, 0x38, 0x00, 0x19, 0x10, 0x00, 0x13, 0x38, 0x00, 0x32, 0x6C, 0x00, 0x26, 0xC6, 0x00, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C74, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x30, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x60, 0x10, 0x00, 0x30, 0x10, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x16, 0x00, 0x08, 0x13, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C76, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C78, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x60, 0x20, 0x00, 0x30, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x18, 0x61, 0x00, 0x10, 0x43, 0x00, 0x30, 0xC2, 0x00, 0x21, 0x82, 0x00, 0x63, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x04, 0x00, 0x1A, 0x05, 0x00, 0x0A, 0xC5, 0x00, 0x02, 0x6D, 0x00, 0x62, 0x29, 0x00, 0x32, 0x39, 0x00, 0x12, 0x11, 0x00, 0x02, 0x39, 0x00, 0x0A, 0x29, 0x00, 0x0A, 0x6D, 0x00, 0x1A, 0xC5, 0x00, 0x12, 0x01, 0x00, 0x32, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C7A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x20, 0x22, 0x00, 0x10, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x10, 0x88, 0x00, 0x10, 0x84, 0x00, 0x11, 0x02, 0x00, 0x22, 0x01, 0x00, 0x24, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C7B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x03, 0x10, 0x00, 0x60, 0x10, 0x00, 0x30, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C7D, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x10, 0x80, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x15, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x80, 0x20, 0x02, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C7E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x21, 0x02, 0x00, 0x12, 0x01, 0x00, 0x04, 0x00, 0x80, 0x03, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0x04, 0x00, 0x22, 0x04, 0x00, 0x24, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C81, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x20, 0x00, 0x00, 0x90, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x10, 0x80, 0x00, 0x00, 0x81, 0x00, 0x09, 0x81, 0x00, 0x09, 0x80, 0x80, 0x0A, 0x80, 0x80, 0x0A, 0x80, 0x80, 0x12, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C82, { 0x00, 0x00, 0x00, 0x20, 0x07, 0x00, 0x11, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x12, 0x04, 0x00, 0x22, 0x04, 0x00, 0x24, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C83, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x08, 0x38, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x11, 0x04, 0x00, 0x22, 0x02, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C85, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x80, 0x11, 0x04, 0x80, 0x22, 0x07, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C86, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x80, 0x22, 0x0F, 0x80, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C87, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x82, 0x00, 0x20, 0x81, 0x00, 0x11, 0x3F, 0x80, 0x07, 0xC8, 0x80, 0x00, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x21, 0x0F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C88, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x88, 0x80, 0x21, 0x0F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x02, 0x00, 0x80, 0x60, 0x7C, 0x00, 0x30, 0x44, 0x00, 0x10, 0x44, 0x00, 0x00, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x30, 0x84, 0x80, 0x21, 0x84, 0x80, 0x63, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C8C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0x80, 0x23, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x20, 0x1F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x60, 0x7C, 0x00, 0x30, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x18, 0x04, 0x00, 0x10, 0x04, 0x00, 0x30, 0x04, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C8F, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x0A, 0x7F, 0x00, 0x02, 0x12, 0x00, 0x42, 0x92, 0x00, 0x2F, 0xD2, 0x00, 0x22, 0x12, 0x00, 0x02, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x12, 0x12, 0x00, 0x72, 0xA2, 0x00, 0x13, 0x22, 0x00, 0x12, 0x22, 0x00, 0x10, 0x42, 0x00, 0x10, 0x8A, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C90, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x00, 0x38, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x10, 0x92, 0x00, 0x11, 0x12, 0x00, 0x12, 0x11, 0x00, 0x14, 0x10, 0x80, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C92, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x20, 0x84, 0x80, 0x11, 0x07, 0x80, 0x02, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x10, 0x44, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x20, 0xC6, 0x00, 0x27, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6C93, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x61, 0x00, 0x1F, 0xE2, 0x00, 0x01, 0x54, 0x00, 0x02, 0x58, 0x00, 0x04, 0x48, 0x00, 0x08, 0x44, 0x00, 0x10, 0x42, 0x00, 0x20, 0x41, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C94, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x21, 0x10, 0x00, 0x11, 0x1F, 0x80, 0x01, 0x10, 0x80, 0x09, 0x10, 0x80, 0x09, 0x10, 0x80, 0x09, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x20, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C95, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x01, 0x24, 0x80, 0x22, 0x24, 0x80, 0x14, 0x44, 0x80, 0x00, 0x48, 0x80, 0x04, 0x88, 0x80, 0x04, 0x90, 0x80, 0x09, 0x10, 0x80, 0x0A, 0x20, 0x80, 0x08, 0x21, 0x00, 0x10, 0x41, 0x00, 0x10, 0x82, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C96, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x0C, 0x8C, 0x00, 0x06, 0xB8, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C98, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x31, 0x10, 0x00, 0x19, 0x10, 0x00, 0x09, 0x11, 0x00, 0x01, 0x13, 0x00, 0x61, 0xDE, 0x00, 0x31, 0x10, 0x00, 0x11, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x10, 0x00, 0x11, 0x10, 0x00, 0x31, 0x10, 0x80, 0x21, 0xD9, 0x80, 0x67, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C99, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x92, 0x00, 0x00, 0x91, 0x00, 0x21, 0x10, 0x80, 0x11, 0x10, 0x00, 0x02, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x11, 0x00, 0x10, 0x72, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x20, 0x30, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C9A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x20, 0x88, 0x00, 0x10, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x8F, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C9B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x13, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C9C, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x31, 0x08, 0x00, 0x19, 0x08, 0x00, 0x09, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x61, 0x00, 0x00, 0x31, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x19, 0x04, 0x00, 0x11, 0x04, 0x00, 0x33, 0x04, 0x00, 0x22, 0x04, 0x00, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6C9F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x63, 0x21, 0x00, 0x30, 0x21, 0x00, 0x10, 0x61, 0x00, 0x00, 0x49, 0x00, 0x08, 0xC9, 0x00, 0x08, 0x9D, 0x00, 0x19, 0xF5, 0x00, 0x10, 0x03, 0x00, 0x30, 0x02, 0x00, 0x20, 0x06, 0x00, 0x60, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x61, 0x87, 0x80, 0x33, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xC6, 0x00, 0x18, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x30, 0x6C, 0x00, 0x20, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x08, 0x81, 0x00, 0x00, 0x81, 0x00, 0x60, 0x81, 0x00, 0x30, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x00, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8C, 0x00, 0x18, 0x84, 0x00, 0x11, 0x86, 0x00, 0x31, 0x02, 0x00, 0x23, 0x03, 0x00, 0x66, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CA3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x40, 0x20, 0x00, 0x24, 0x28, 0x00, 0x25, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x22, 0x00, 0x77, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CA4, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x00, 0x00, 0x09, 0x84, 0x00, 0x41, 0x44, 0x00, 0x31, 0x28, 0x00, 0x11, 0x28, 0x00, 0x05, 0x10, 0x00, 0x09, 0x10, 0x00, 0x11, 0x28, 0x00, 0x71, 0x28, 0x00, 0x11, 0x44, 0x00, 0x11, 0x84, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CA5, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x1A, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x02, 0x22, 0x00, 0x42, 0x22, 0x00, 0x33, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x06, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x72, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x8A, 0x00, 0x19, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CA6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x50, 0x00, 0x08, 0x50, 0x00, 0x00, 0x88, 0x00, 0x41, 0x04, 0x00, 0x32, 0x07, 0x00, 0x14, 0x82, 0x00, 0x08, 0x88, 0x00, 0x08, 0x98, 0x00, 0x70, 0xE0, 0x00, 0x10, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CA7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x18, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x41, 0x10, 0x00, 0x22, 0x08, 0x00, 0x24, 0x07, 0x00, 0x09, 0xFA, 0x00, 0x09, 0x08, 0x00, 0x11, 0x08, 0x00, 0x71, 0x28, 0x00, 0x11, 0x10, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CA9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x1A, 0x20, 0x00, 0x09, 0xA0, 0x00, 0x40, 0xA2, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x10, 0x62, 0x00, 0x70, 0x9A, 0x00, 0x10, 0x8A, 0x00, 0x11, 0x02, 0x00, 0x11, 0x22, 0x00, 0x12, 0x14, 0x00, 0x14, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CAA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x30, 0x00, 0x18, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x41, 0x02, 0x00, 0x31, 0x02, 0x00, 0x11, 0x02, 0x00, 0x05, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0x00, 0x00, 0x71, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CAB, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x11, 0x12, 0x00, 0x22, 0x11, 0x00, 0x24, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CAD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x28, 0x00, 0x18, 0x26, 0x00, 0x08, 0x22, 0x00, 0x43, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x70, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x11, 0x24, 0x00, 0x71, 0x24, 0x00, 0x12, 0x22, 0x00, 0x14, 0x23, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CAE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x21, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x60, 0x60, 0x00, 0x30, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x00, 0xC1, 0x00, 0x09, 0xC1, 0x00, 0x0B, 0x41, 0x00, 0x18, 0x41, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x62, 0x00, 0x80, 0x30, 0x40, 0x00, 0x10, 0x43, 0x00, 0x00, 0x4E, 0x00, 0x08, 0x78, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x10, 0x40, 0x00, 0x30, 0x40, 0x80, 0x20, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x63, 0x10, 0x00, 0x30, 0x93, 0x00, 0x10, 0x9D, 0x00, 0x00, 0xB1, 0x00, 0x08, 0xD1, 0x00, 0x0B, 0x93, 0x00, 0x18, 0x90, 0x00, 0x10, 0x90, 0x00, 0x30, 0x80, 0x80, 0x20, 0xC1, 0x80, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x11, 0xF2, 0x00, 0x01, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0xF2, 0x00, 0x11, 0x12, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x63, 0x11, 0x80, 0x30, 0x30, 0x00, 0x10, 0x62, 0x00, 0x01, 0xC6, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x38, 0x80, 0x19, 0xE1, 0x80, 0x10, 0x03, 0x00, 0x30, 0x0E, 0x00, 0x20, 0x38, 0x00, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB8, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x48, 0x00, 0x00, 0x48, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x49, 0x00, 0x10, 0x49, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x48, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x11, 0x0B, 0x00, 0x22, 0x08, 0x00, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CB9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x23, 0xFF, 0x80, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x02, 0x21, 0x00, 0x62, 0x21, 0x00, 0x32, 0x21, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x1A, 0x21, 0x00, 0x12, 0x21, 0x00, 0x32, 0x21, 0x00, 0x23, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CBB, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x44, 0x00, 0x20, 0x82, 0x00, 0x10, 0x87, 0x00, 0x01, 0x38, 0x80, 0x03, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CBC, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x20, 0x21, 0x00, 0x10, 0x21, 0x00, 0x00, 0x42, 0x00, 0x00, 0x8C, 0x00, 0x0B, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CBD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CBE, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x20, 0x3F, 0x80, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CBF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x20, 0x42, 0x00, 0x10, 0x42, 0x80, 0x00, 0x83, 0x80, 0x01, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CC1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x21, 0x02, 0x00, 0x11, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x4A, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x80, 0x11, 0x08, 0x80, 0x22, 0x0F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CC2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x21, 0x00, 0x80, 0x11, 0x3C, 0x80, 0x01, 0x24, 0x80, 0x01, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x3C, 0x80, 0x09, 0x24, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x21, 0x00, 0x80, 0x21, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CC4, { 0x00, 0x00, 0x00, 0x11, 0x24, 0x00, 0x09, 0x24, 0x00, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x21, 0x24, 0x00, 0x17, 0xFF, 0x80, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x3C, 0x00, 0x11, 0x24, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x0A, 0x21, 0x00, 0x02, 0x21, 0x00, 0x62, 0x21, 0x00, 0x32, 0x21, 0x00, 0x12, 0x71, 0x00, 0x02, 0x51, 0x00, 0x0A, 0x51, 0x00, 0x0A, 0x59, 0x00, 0x1A, 0xC9, 0x00, 0x12, 0x8D, 0x00, 0x32, 0x01, 0x00, 0x22, 0x01, 0x00, 0x63, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CC6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x90, 0x00, 0x18, 0x90, 0x00, 0x08, 0x90, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x10, 0x00, 0x33, 0x10, 0x00, 0x10, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x18, 0x6C, 0x00, 0x10, 0x44, 0x00, 0x30, 0xC6, 0x00, 0x21, 0x83, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CC9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x61, 0x00, 0x1F, 0x62, 0x00, 0x01, 0x54, 0x00, 0x02, 0x58, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CCA, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x20, 0x80, 0x80, 0x10, 0x80, 0x80, 0x00, 0x80, 0x80, 0x04, 0xFF, 0x80, 0x04, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CCC, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x22, 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x00, 0x20, 0x84, 0x00, 0x10, 0x84, 0x00, 0x00, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x91, 0x00, 0x0A, 0x91, 0x00, 0x12, 0xA0, 0x80, 0x14, 0xA0, 0x80, 0x14, 0xC2, 0x00, 0x18, 0x82, 0x00, 0x23, 0x7E, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CCD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x60, 0xA8, 0x00, 0x30, 0xA8, 0x00, 0x10, 0xAC, 0x00, 0x01, 0xA4, 0x00, 0x09, 0x26, 0x00, 0x09, 0x22, 0x00, 0x1B, 0x23, 0x00, 0x16, 0xFD, 0x80, 0x30, 0x20, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CCF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x61, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x33, 0xC4, 0x00, 0x1A, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x02, 0xDF, 0x80, 0x62, 0x84, 0x80, 0x32, 0x84, 0x80, 0x12, 0x44, 0x80, 0x02, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x1A, 0xC4, 0x80, 0x12, 0x0C, 0x80, 0x32, 0x09, 0x80, 0x22, 0x19, 0x00, 0x62, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD1, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x30, 0x84, 0x00, 0x19, 0x84, 0x00, 0x09, 0x04, 0x00, 0x03, 0x1F, 0x80, 0x62, 0x44, 0x80, 0x33, 0x44, 0x80, 0x11, 0xC4, 0x80, 0x00, 0x84, 0x80, 0x08, 0x84, 0x80, 0x09, 0x8C, 0x80, 0x19, 0x28, 0x80, 0x11, 0x29, 0x80, 0x33, 0xF9, 0x00, 0x26, 0x11, 0x00, 0x60, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD2, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x1E, 0x00, 0x19, 0xF2, 0x00, 0x09, 0x02, 0x00, 0x01, 0x22, 0x00, 0x61, 0x22, 0x00, 0x31, 0x22, 0x00, 0x11, 0x22, 0x00, 0x01, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x19, 0x2A, 0x00, 0x11, 0x2B, 0x00, 0x33, 0x3D, 0x00, 0x22, 0xE5, 0x00, 0x66, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CD3, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x23, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0B, 0xC4, 0x00, 0x0A, 0x44, 0x00, 0x08, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x48, 0x80, 0x10, 0x57, 0x80, 0x20, 0x78, 0x80, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD4, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x30, 0x84, 0x00, 0x18, 0x84, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x60, 0x84, 0x00, 0x30, 0x84, 0x00, 0x10, 0x84, 0x00, 0x00, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x18, 0x84, 0x00, 0x10, 0x84, 0x00, 0x30, 0x84, 0x00, 0x20, 0x84, 0x00, 0x60, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0x81, 0x00, 0x11, 0x3F, 0x80, 0x27, 0xC0, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x60, 0x00, 0x19, 0xC7, 0x80, 0x09, 0x24, 0x80, 0x01, 0x24, 0x80, 0x61, 0x24, 0x80, 0x31, 0x24, 0x80, 0x11, 0x24, 0x80, 0x01, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x19, 0xE4, 0x80, 0x13, 0x27, 0x80, 0x30, 0x24, 0x00, 0x20, 0x64, 0x00, 0x60, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CD7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x24, 0x80, 0x01, 0x24, 0x80, 0x21, 0x24, 0x80, 0x11, 0x24, 0x80, 0x01, 0x24, 0x80, 0x01, 0x24, 0x80, 0x09, 0x47, 0x80, 0x09, 0x80, 0x80, 0x09, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x08, 0x92, 0x00, 0x01, 0x93, 0x00, 0x61, 0x11, 0x00, 0x31, 0x11, 0x00, 0x10, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CDA, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x30, 0x88, 0x00, 0x18, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x02, 0x89, 0x80, 0x62, 0xEF, 0x00, 0x32, 0x88, 0x00, 0x12, 0x88, 0x00, 0x02, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x1A, 0x88, 0x00, 0x12, 0x88, 0x00, 0x32, 0x88, 0x80, 0x22, 0xE8, 0x80, 0x67, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CDB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x30, 0x00, 0x12, 0xC0, 0x00, 0x13, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CDC, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x0E, 0x00, 0x19, 0xF8, 0x00, 0x09, 0x08, 0x00, 0x01, 0x08, 0x00, 0x61, 0x08, 0x00, 0x31, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x01, 0x08, 0x00, 0x09, 0x0C, 0x00, 0x09, 0x04, 0x00, 0x19, 0xE4, 0x00, 0x13, 0x06, 0x00, 0x30, 0x02, 0x80, 0x23, 0xFB, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CDD, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x0E, 0x00, 0x18, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, 0x60, 0xFF, 0x80, 0x30, 0x84, 0x00, 0x10, 0x84, 0x00, 0x00, 0x9C, 0x00, 0x08, 0x87, 0x00, 0x08, 0x85, 0x80, 0x18, 0x84, 0x00, 0x11, 0x84, 0x00, 0x31, 0x04, 0x00, 0x23, 0x04, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CDE, { 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x42, 0x01, 0x00, 0x34, 0x02, 0x00, 0x10, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x70, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0xA0, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x63, 0x7D, 0x80, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x18, 0x21, 0x00, 0x10, 0x21, 0x00, 0x30, 0x27, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE1, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x12, 0x01, 0x00, 0x05, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0xF9, 0x00, 0x09, 0x07, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x21, 0x11, 0x00, 0x11, 0x12, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x42, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0x18, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x22, 0x46, 0x00, 0x24, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CE3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x08, 0x42, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x09, 0x23, 0x80, 0x11, 0x3C, 0x00, 0x11, 0x20, 0x00, 0x12, 0x20, 0x80, 0x12, 0x20, 0x80, 0x22, 0x3F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE7, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x30, 0x0B, 0x00, 0x18, 0x09, 0x00, 0x08, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x61, 0x08, 0x00, 0x31, 0x09, 0x00, 0x11, 0x09, 0x00, 0x01, 0x0B, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x0E, 0x00, 0x19, 0x04, 0x00, 0x11, 0xCE, 0x80, 0x37, 0x1A, 0x80, 0x20, 0x33, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE8, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CE9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x90, 0x00, 0x18, 0x90, 0x00, 0x08, 0x90, 0x00, 0x00, 0xFF, 0x00, 0x61, 0x90, 0x00, 0x33, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x04, 0x41, 0x00, 0x00, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x08, 0x41, 0x00, 0x00, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x08, 0x41, 0x00, 0x18, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CEB, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x01, 0x44, 0x00, 0x00, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0x20, 0x00, 0x10, 0x42, 0x00, 0x10, 0x81, 0x00, 0x11, 0x3F, 0x80, 0x27, 0xC0, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CEC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x62, 0x00, 0x80, 0x32, 0x7C, 0x80, 0x10, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x30, 0x82, 0x00, 0x21, 0x83, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CEE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CEF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x01, 0x10, 0x00, 0x05, 0x10, 0x00, 0x05, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x04, 0x00, 0x11, 0xF4, 0x80, 0x17, 0x02, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CF0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x0C, 0x46, 0x00, 0x30, 0x45, 0x80, 0x04, 0x68, 0x00, 0x02, 0xF0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CF1, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x22, 0x00, 0x61, 0x22, 0x00, 0x31, 0x22, 0x00, 0x11, 0x22, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x50, 0x00, 0x08, 0x58, 0x00, 0x18, 0xC8, 0x00, 0x10, 0x8C, 0x00, 0x31, 0x86, 0x00, 0x23, 0x03, 0x00, 0x66, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CF2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x11, 0x80, 0x18, 0x1F, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x61, 0x10, 0x00, 0x31, 0x10, 0x00, 0x11, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x08, 0x30, 0x80, 0x08, 0x30, 0x80, 0x18, 0x51, 0x80, 0x10, 0xD1, 0x00, 0x31, 0x97, 0x00, 0x23, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CF3, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x80, 0x03, 0xF9, 0x00, 0x00, 0x3A, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x10, 0x94, 0x00, 0x10, 0x92, 0x00, 0x11, 0x12, 0x00, 0x22, 0x11, 0x00, 0x24, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6CF4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x81, 0x00, 0x3E, 0x83, 0x00, 0x02, 0xCE, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CF5, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x14, 0x08, 0x00, 0x64, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x84, 0x00, 0x00, 0x8C, 0x00, 0x3E, 0xD0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8F, 0x00, 0x30, 0x82, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CF6, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x08, 0x8C, 0x00, 0x04, 0x90, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x82, 0x00, 0x00, 0x88, 0x00, 0x1E, 0xD0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x10, 0x87, 0x00, 0x60, 0x82, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CF7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x90, 0x00, 0x18, 0x88, 0x00, 0x08, 0x82, 0x00, 0x47, 0xFF, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x11, 0x28, 0x00, 0x71, 0x30, 0x00, 0x11, 0x20, 0x00, 0x12, 0x61, 0x00, 0x12, 0xA1, 0x00, 0x14, 0x1F, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CF8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x22, 0x00, 0x18, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x40, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x71, 0x02, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CFA, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x3E, 0x00, 0x1B, 0xC0, 0x00, 0x0A, 0x20, 0x00, 0x42, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x70, 0xA8, 0x00, 0x11, 0x24, 0x00, 0x12, 0x23, 0x00, 0x14, 0x21, 0x00, 0x10, 0xA0, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CFB, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x04, 0x82, 0x00, 0x40, 0x80, 0x00, 0x30, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x04, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x70, 0x12, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CFC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x28, 0x00, 0x19, 0x24, 0x00, 0x0A, 0x20, 0x00, 0x43, 0xFF, 0x00, 0x30, 0x40, 0x00, 0x10, 0x40, 0x00, 0x04, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x11, 0x88, 0x00, 0x71, 0x48, 0x00, 0x12, 0x50, 0x00, 0x14, 0x20, 0x00, 0x10, 0x58, 0x00, 0x10, 0x87, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CFD, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x19, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x00, 0x50, 0x00, 0x40, 0x20, 0x00, 0x30, 0x50, 0x00, 0x10, 0x88, 0x00, 0x05, 0x27, 0x00, 0x0A, 0xFA, 0x00, 0x10, 0x20, 0x00, 0x70, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6CFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x1B, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x40, 0x10, 0x00, 0x24, 0x60, 0x00, 0x24, 0x8C, 0x00, 0x09, 0x03, 0x00, 0x0A, 0x01, 0x00, 0x13, 0xFE, 0x00, 0x70, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D01, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x40, 0x24, 0x00, 0x33, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x04, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x71, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x79, 0x00, 0x62, 0x49, 0x00, 0x32, 0x49, 0x00, 0x12, 0x49, 0x00, 0x02, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x79, 0x00, 0x1A, 0x01, 0x00, 0x12, 0x01, 0x00, 0x32, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x61, 0x7D, 0x00, 0x31, 0x11, 0x00, 0x11, 0x11, 0x00, 0x01, 0x39, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x19, 0x45, 0x00, 0x11, 0x01, 0x00, 0x31, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D0A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x60, 0x40, 0x00, 0x30, 0xDF, 0x00, 0x10, 0x82, 0x00, 0x01, 0x84, 0x00, 0x0A, 0x84, 0x00, 0x08, 0xBF, 0x80, 0x18, 0x84, 0x00, 0x10, 0x84, 0x00, 0x30, 0x84, 0x00, 0x20, 0x84, 0x00, 0x60, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D0B, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0x44, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D0C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x08, 0x00, 0x80, 0x03, 0xF4, 0x80, 0x00, 0x84, 0x80, 0x21, 0x04, 0x80, 0x11, 0xF4, 0x80, 0x02, 0x14, 0x80, 0x0B, 0x24, 0x80, 0x0C, 0xA4, 0x80, 0x08, 0x44, 0x80, 0x10, 0x44, 0x80, 0x10, 0x84, 0x80, 0x11, 0x04, 0x80, 0x12, 0x04, 0x80, 0x24, 0x00, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D0E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x60, 0x00, 0x18, 0x40, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x62, 0x01, 0x00, 0x32, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x1B, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x32, 0x01, 0x00, 0x22, 0x01, 0x00, 0x63, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x08, 0x30, 0x00, 0x00, 0x20, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x49, 0x00, 0x12, 0x49, 0x00, 0x02, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x49, 0x00, 0x62, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D11, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x23, 0x7F, 0x80, 0x13, 0x08, 0x00, 0x05, 0x08, 0x00, 0x01, 0x14, 0x00, 0x09, 0x14, 0x00, 0x09, 0x14, 0x00, 0x09, 0x14, 0x00, 0x11, 0x12, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x21, 0x21, 0x00, 0x21, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x08, 0x48, 0x00, 0x00, 0x48, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x49, 0x00, 0x12, 0x49, 0x00, 0x02, 0x49, 0x00, 0x0A, 0xC9, 0x00, 0x0A, 0x8F, 0x00, 0x1B, 0x81, 0x00, 0x12, 0x01, 0x00, 0x32, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D13, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x21, 0x00, 0x12, 0x21, 0x00, 0x02, 0x21, 0x00, 0x0A, 0x73, 0x00, 0x08, 0x70, 0x00, 0x18, 0xA8, 0x00, 0x11, 0xAC, 0x00, 0x33, 0x26, 0x00, 0x26, 0x23, 0x80, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D17, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x90, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x80, 0x11, 0x04, 0x80, 0x22, 0x07, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D19, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x50, 0x00, 0x00, 0x50, 0x00, 0x00, 0x90, 0x00, 0x20, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x58, 0x00, 0x10, 0x54, 0x00, 0x10, 0x94, 0x00, 0x11, 0x12, 0x00, 0x22, 0x11, 0x00, 0x24, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D1A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x40, 0x00, 0x18, 0xFE, 0x00, 0x09, 0x82, 0x00, 0x03, 0x64, 0x00, 0x66, 0x18, 0x00, 0x30, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x19, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D1B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x82, 0x00, 0x21, 0x44, 0x00, 0x12, 0x28, 0x00, 0x00, 0x18, 0x00, 0x08, 0x26, 0x00, 0x08, 0x41, 0x80, 0x09, 0x80, 0x00, 0x16, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D1E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x22, 0xFE, 0x80, 0x12, 0x00, 0x80, 0x02, 0x00, 0x80, 0x0A, 0x7C, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x40, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x22, 0x00, 0x80, 0x22, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D1F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x03, 0xFE, 0x00, 0x60, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x02, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x51, 0x00, 0x18, 0x51, 0x00, 0x10, 0xDB, 0x00, 0x30, 0x8C, 0x00, 0x21, 0x86, 0x00, 0x67, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D25, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x12, 0x00, 0x43, 0xFF, 0x80, 0x60, 0x12, 0x00, 0x11, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x08, 0x30, 0x00, 0x00, 0x20, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D27, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x11, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x00, 0x0D, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x21, 0x02, 0x00, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D28, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x60, 0xC6, 0x00, 0x31, 0x83, 0x00, 0x13, 0x45, 0x80, 0x00, 0x44, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x18, 0x10, 0x00, 0x10, 0x38, 0x00, 0x30, 0x6C, 0x00, 0x20, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D29, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x22, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x21, 0x00, 0x08, 0x22, 0x00, 0x10, 0x24, 0x00, 0x10, 0x18, 0x00, 0x10, 0x28, 0x80, 0x20, 0xC4, 0x80, 0x23, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D2A, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x03, 0xFF, 0x00, 0x20, 0x84, 0x00, 0x10, 0x84, 0x00, 0x00, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x02, 0x00, 0x22, 0x01, 0x00, 0x24, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D2B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x30, 0x00, 0x18, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x52, 0x00, 0x61, 0x52, 0x00, 0x31, 0x52, 0x00, 0x11, 0x52, 0x00, 0x01, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x19, 0x52, 0x00, 0x11, 0x52, 0x00, 0x31, 0x52, 0x00, 0x27, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D2E, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x30, 0x48, 0x00, 0x1A, 0x49, 0x00, 0x0B, 0x4B, 0x00, 0x01, 0x4E, 0x00, 0x61, 0x48, 0x00, 0x30, 0x48, 0x00, 0x10, 0x48, 0x00, 0x00, 0x4E, 0x00, 0x09, 0xCB, 0x00, 0x0B, 0x49, 0x00, 0x18, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x30, 0x88, 0x80, 0x21, 0x89, 0x80, 0x63, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D2F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xBF, 0x00, 0x7C, 0x09, 0x00, 0x07, 0x89, 0x00, 0x3C, 0x19, 0x00, 0x07, 0x91, 0x00, 0x7C, 0x33, 0x00, 0x04, 0x66, 0x00, 0x00, 0x80, 0x00, 0x00, 0x81, 0x00, 0x3E, 0xC3, 0x00, 0x02, 0xB6, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x82, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x30, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0x83, 0x80, 0x10, 0xFE, 0x00, 0x33, 0x82, 0x00, 0x20, 0x02, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D32, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x80, 0x08, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x20, 0x88, 0x80, 0x10, 0xAA, 0x80, 0x02, 0xAA, 0x80, 0x02, 0xAA, 0x80, 0x0A, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x11, 0x08, 0x80, 0x21, 0x08, 0x80, 0x22, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D33, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0x87, 0x80, 0x08, 0x84, 0x80, 0x07, 0xF4, 0x80, 0x61, 0x14, 0x80, 0x31, 0x14, 0x80, 0x11, 0x34, 0x80, 0x03, 0x24, 0x80, 0x0A, 0x24, 0x80, 0x0A, 0x64, 0x80, 0x1B, 0xC4, 0x80, 0x10, 0xE4, 0x80, 0x31, 0xB4, 0x80, 0x23, 0x17, 0x80, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D35, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x12, 0x00, 0x80, 0x04, 0xFC, 0x80, 0x00, 0x84, 0x80, 0x08, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x08, 0xFC, 0x80, 0x10, 0x84, 0x80, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x20, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D36, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x13, 0x02, 0x80, 0x05, 0x4A, 0x80, 0x01, 0x2A, 0x80, 0x09, 0x12, 0x80, 0x09, 0x32, 0x80, 0x09, 0x4A, 0x80, 0x11, 0x8A, 0x80, 0x11, 0xFE, 0x80, 0x11, 0x02, 0x80, 0x20, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D38, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0x11, 0x00, 0x00, 0x92, 0x00, 0x20, 0x92, 0x00, 0x10, 0x92, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x80, 0x21, 0x04, 0x80, 0x26, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D39, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x10, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D3B, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x08, 0x3C, 0x00, 0x01, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D3C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x60, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D3D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0x42, 0x00, 0x21, 0x81, 0x80, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D3E, { 0x00, 0x00, 0x00, 0x10, 0x0F, 0x00, 0x09, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x01, 0x03, 0x00, 0x21, 0x1C, 0x00, 0x11, 0x68, 0x00, 0x01, 0x49, 0x00, 0x01, 0x4A, 0x00, 0x09, 0x4C, 0x00, 0x09, 0x48, 0x00, 0x09, 0x44, 0x00, 0x11, 0x44, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7A, 0x00, 0x23, 0xC1, 0x00, 0x24, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D3F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x01, 0x86, 0x00, 0x66, 0x01, 0x80, 0x31, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x30, 0x01, 0x00, 0x20, 0x03, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D41, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x20, 0x41, 0x00, 0x10, 0x9F, 0x00, 0x03, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x26, 0x12, 0x80, 0x24, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D43, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x40, 0x20, 0x00, 0x25, 0x24, 0x00, 0x24, 0xA8, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x70, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x10, 0x84, 0x00, 0x11, 0x07, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D44, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x7E, 0x00, 0x18, 0xC4, 0x00, 0x09, 0x88, 0x00, 0x00, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x11, 0x00, 0x10, 0x11, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D45, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x30, 0x22, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x20, 0x00, 0x10, 0x20, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x11, 0x00, 0x18, 0x1B, 0x00, 0x10, 0x0E, 0x00, 0x30, 0x1C, 0x80, 0x20, 0x76, 0x80, 0x63, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D46, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x22, 0x20, 0x00, 0x12, 0x3E, 0x00, 0x02, 0x42, 0x00, 0x0A, 0xA4, 0x00, 0x12, 0x18, 0x00, 0x32, 0x10, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x84, 0x00, 0x3E, 0xCC, 0x00, 0x02, 0xB0, 0x00, 0x04, 0x90, 0x00, 0x04, 0x88, 0x00, 0x08, 0x87, 0x00, 0x32, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D47, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x18, 0x84, 0x00, 0x08, 0x7E, 0x00, 0x03, 0xC0, 0x00, 0x40, 0x50, 0x00, 0x30, 0x22, 0x00, 0x10, 0x52, 0x00, 0x05, 0x8E, 0x00, 0x08, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x70, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0x91, 0x00, 0x11, 0x11, 0x00, 0x16, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D48, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x22, 0x00, 0x18, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x40, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0x24, 0x00, 0x71, 0x24, 0x00, 0x11, 0x24, 0x00, 0x10, 0x50, 0x00, 0x10, 0x48, 0x00, 0x10, 0x86, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D4A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x22, 0x00, 0x43, 0xFF, 0x00, 0x32, 0x22, 0x00, 0x12, 0x22, 0x00, 0x06, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x72, 0x22, 0x00, 0x10, 0x28, 0x00, 0x10, 0x24, 0x00, 0x10, 0x3E, 0x00, 0x17, 0xE2, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x09, 0xF9, 0x00, 0x09, 0x15, 0x00, 0x21, 0x55, 0x00, 0x19, 0x55, 0x00, 0x09, 0x55, 0x00, 0x03, 0x55, 0x00, 0x05, 0x55, 0x00, 0x09, 0x55, 0x00, 0x39, 0x55, 0x00, 0x08, 0x41, 0x00, 0x08, 0xA1, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x15, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D4D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x50, 0x00, 0x08, 0x88, 0x00, 0x41, 0x04, 0x00, 0x26, 0x07, 0x00, 0x24, 0xFA, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x70, 0x20, 0x00, 0x10, 0x40, 0x00, 0x10, 0x88, 0x00, 0x11, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D4E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x22, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x40, 0x50, 0x00, 0x30, 0x20, 0x00, 0x10, 0xD8, 0x00, 0x07, 0x07, 0x00, 0x08, 0x8A, 0x00, 0x10, 0x88, 0x00, 0x70, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x11, 0x08, 0x00, 0x12, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D4F, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x10, 0x41, 0x00, 0x0C, 0x45, 0x00, 0x07, 0xFD, 0x00, 0x20, 0x15, 0x00, 0x11, 0x15, 0x00, 0x10, 0xA5, 0x00, 0x04, 0xA5, 0x00, 0x04, 0x45, 0x00, 0x08, 0x45, 0x00, 0x38, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x08, 0x05, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D51, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x42, 0x00, 0x04, 0x44, 0x00, 0x40, 0x80, 0x00, 0x33, 0xFE, 0x00, 0x10, 0xA0, 0x00, 0x05, 0x20, 0x00, 0x0A, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x70, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D52, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x24, 0x20, 0x00, 0x12, 0x24, 0x00, 0x12, 0x7E, 0x00, 0x40, 0x50, 0x00, 0x28, 0x90, 0x00, 0x2E, 0x10, 0x00, 0x0A, 0x12, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x72, 0x10, 0x00, 0x12, 0x90, 0x00, 0x13, 0x10, 0x00, 0x12, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D53, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x18, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x44, 0x24, 0x00, 0x30, 0x40, 0x00, 0x10, 0x42, 0x00, 0x04, 0xA6, 0x00, 0x09, 0xA8, 0x00, 0x12, 0x90, 0x00, 0x74, 0x90, 0x00, 0x10, 0x88, 0x00, 0x10, 0x87, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xC0, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D54, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0xFE, 0x00, 0x18, 0x04, 0x00, 0x08, 0x04, 0x00, 0x41, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x0A, 0x00, 0x17, 0xFF, 0x00, 0x71, 0x08, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x08, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D57, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x30, 0x13, 0x00, 0x18, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x61, 0x11, 0x00, 0x31, 0x93, 0x00, 0x10, 0x96, 0x00, 0x00, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x5C, 0x00, 0x18, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x33, 0x11, 0x80, 0x20, 0x10, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D59, { 0x00, 0x00, 0x00, 0x11, 0x03, 0x00, 0x09, 0x1C, 0x00, 0x01, 0x10, 0x00, 0x07, 0xD0, 0x00, 0x21, 0x10, 0x00, 0x11, 0x1F, 0x80, 0x01, 0x12, 0x00, 0x01, 0x12, 0x00, 0x09, 0xD2, 0x00, 0x0F, 0x12, 0x00, 0x09, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x21, 0x22, 0x00, 0x23, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D5A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x42, 0x00, 0x00, 0x8F, 0x00, 0x01, 0xF4, 0x80, 0x22, 0x44, 0x00, 0x10, 0x44, 0x80, 0x00, 0x87, 0x80, 0x01, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC2, 0x00, 0x11, 0x24, 0x00, 0x16, 0x18, 0x00, 0x10, 0x28, 0x00, 0x20, 0xC6, 0x00, 0x27, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D5C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x01, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x01, 0x01, 0x00, 0x61, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x18, 0x90, 0x00, 0x11, 0x90, 0x00, 0x31, 0x50, 0x00, 0x23, 0x38, 0x00, 0x66, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D5F, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x30, 0x48, 0x00, 0x18, 0xC8, 0x00, 0x08, 0x8F, 0x80, 0x01, 0x99, 0x00, 0x61, 0x51, 0x00, 0x33, 0x73, 0x00, 0x15, 0x4A, 0x00, 0x01, 0x4A, 0x00, 0x09, 0x4E, 0x00, 0x09, 0x44, 0x00, 0x19, 0x4E, 0x00, 0x11, 0x4A, 0x00, 0x31, 0x4B, 0x00, 0x21, 0x19, 0x00, 0x61, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D60, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x20, 0xD8, 0x00, 0x18, 0x20, 0x00, 0x08, 0xD8, 0x00, 0x41, 0x24, 0x00, 0x20, 0x40, 0x00, 0x27, 0xFF, 0x00, 0x08, 0xA0, 0x00, 0x09, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x75, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x2C, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D61, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x11, 0x01, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D63, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x20, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x84, 0x80, 0x21, 0x07, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D64, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x02, 0x21, 0x00, 0x60, 0x20, 0x00, 0x37, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0xD0, 0x00, 0x08, 0x90, 0x00, 0x19, 0xB0, 0x00, 0x11, 0x22, 0x00, 0x33, 0x62, 0x00, 0x26, 0x4F, 0x00, 0x60, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x00, 0x00, 0x11, 0x00, 0x00, 0x31, 0x00, 0x80, 0x21, 0x81, 0x80, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D66, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x08, 0x12, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x13, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x02, 0x00, 0x01, 0x02, 0x00, 0x61, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x01, 0xF8, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x30, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D69, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x90, 0x00, 0x00, 0x90, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x10, 0x00, 0x12, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D6A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x21, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x10, 0x80, 0x11, 0x09, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFA, 0x00, 0x27, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D6C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D6E, { 0x00, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x08, 0xE2, 0x00, 0x00, 0x91, 0x00, 0x01, 0x08, 0x80, 0x22, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x06, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x60, 0x42, 0x00, 0x30, 0x42, 0x00, 0x10, 0x42, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x11, 0x01, 0x00, 0x31, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D70, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x30, 0xE9, 0x00, 0x1B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x00, 0x89, 0x00, 0x67, 0xE9, 0x00, 0x30, 0x89, 0x00, 0x10, 0x89, 0x00, 0x01, 0xC9, 0x00, 0x09, 0xA9, 0x00, 0x0A, 0xA9, 0x00, 0x1A, 0x89, 0x00, 0x14, 0x81, 0x00, 0x30, 0x81, 0x00, 0x20, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D74, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x10, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D77, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF, 0x80, 0x22, 0x80, 0x00, 0x14, 0xFF, 0x80, 0x00, 0x91, 0x00, 0x00, 0x89, 0x00, 0x08, 0x81, 0x00, 0x0B, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x11, 0x12, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x21, 0x02, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D78, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x80, 0x20, 0x02, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x09, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x10, 0x24, 0x00, 0x10, 0x18, 0x00, 0x10, 0x28, 0x00, 0x20, 0xC6, 0x00, 0x27, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D79, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x10, 0x92, 0x00, 0x00, 0x92, 0x00, 0x01, 0x55, 0x00, 0x0A, 0x38, 0x80, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x21, 0x01, 0x00, 0x26, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D7C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x7E, 0x00, 0x18, 0xC4, 0x00, 0x09, 0x8C, 0x00, 0x03, 0x08, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x11, 0x11, 0x00, 0x01, 0x31, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x68, 0x00, 0x18, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x30, 0x88, 0x80, 0x21, 0x89, 0x80, 0x67, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D7F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D82, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x70, 0x00, 0x18, 0x50, 0x00, 0x08, 0xD8, 0x00, 0x01, 0x8C, 0x00, 0x63, 0x06, 0x00, 0x36, 0xFB, 0x80, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x19, 0x24, 0x00, 0x11, 0x24, 0x00, 0x33, 0x26, 0x00, 0x26, 0x23, 0x00, 0x60, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D85, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D87, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x20, 0x92, 0x00, 0x11, 0x24, 0x00, 0x01, 0x24, 0x00, 0x00, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D88, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D89, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x90, 0x00, 0x00, 0x9F, 0x00, 0x20, 0x90, 0x00, 0x10, 0x90, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x10, 0x32, 0x00, 0x10, 0x04, 0x00, 0x10, 0x18, 0x00, 0x20, 0x60, 0x00, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D8C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x00, 0x20, 0x18, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x22, 0x10, 0x80, 0x22, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D8D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x21, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x20, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x0B, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D8E, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x80, 0x0B, 0xC6, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x84, 0x00, 0x20, 0x84, 0x00, 0x11, 0x14, 0x00, 0x01, 0xD7, 0x80, 0x02, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x12, 0x54, 0x00, 0x11, 0xFF, 0x80, 0x10, 0xC0, 0x00, 0x21, 0x3F, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D91, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x21, 0x11, 0x00, 0x26, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x18, 0x22, 0x00, 0x08, 0x22, 0x00, 0x03, 0xFF, 0x80, 0x60, 0x22, 0x00, 0x30, 0x22, 0x00, 0x11, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x19, 0x81, 0x00, 0x12, 0x81, 0x00, 0x30, 0x81, 0x00, 0x20, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D93, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D94, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x10, 0x00, 0x30, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x0B, 0xBB, 0x80, 0x08, 0x00, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x30, 0x06, 0x00, 0x20, 0x0C, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D95, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x28, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x11, 0x00, 0x20, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x30, 0x80, 0x08, 0x50, 0x80, 0x10, 0x50, 0x80, 0x10, 0x90, 0x80, 0x11, 0x11, 0x00, 0x22, 0x16, 0x00, 0x2C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D96, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x30, 0x88, 0x00, 0x19, 0x88, 0x00, 0x09, 0x7F, 0x00, 0x01, 0x00, 0x00, 0x63, 0x22, 0x00, 0x35, 0x22, 0x00, 0x11, 0x22, 0x00, 0x01, 0x36, 0x00, 0x09, 0x14, 0x00, 0x09, 0x14, 0x00, 0x19, 0x14, 0x00, 0x11, 0x14, 0x00, 0x31, 0x04, 0x00, 0x21, 0x7F, 0x80, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D97, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x30, 0x08, 0x00, 0x18, 0xCC, 0x00, 0x09, 0x86, 0x00, 0x03, 0x03, 0x00, 0x61, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x11, 0x02, 0x00, 0x01, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x18, 0x48, 0x00, 0x10, 0x48, 0x00, 0x30, 0xC8, 0x80, 0x21, 0x89, 0x80, 0x67, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D98, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x42, 0x00, 0x18, 0xC2, 0x00, 0x08, 0x9F, 0x00, 0x03, 0xF1, 0x80, 0x60, 0x80, 0x00, 0x30, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x03, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x21, 0x83, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x61, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x1B, 0x38, 0x00, 0x12, 0x28, 0x00, 0x36, 0x6C, 0x00, 0x20, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D9B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x20, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x00, 0x42, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x19, 0xA2, 0x00, 0x11, 0x32, 0x00, 0x33, 0x12, 0x00, 0x26, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D9C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x0A, 0x44, 0x80, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0x44, 0x00, 0x30, 0xC4, 0x80, 0x21, 0x84, 0x80, 0x63, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6D9D, { 0x00, 0x00, 0x00, 0x20, 0x88, 0x00, 0x18, 0x88, 0x00, 0x0B, 0xFE, 0x00, 0x40, 0x88, 0x00, 0x30, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x08, 0x42, 0x00, 0x08, 0x44, 0x00, 0x13, 0xFE, 0x00, 0x70, 0x44, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x12, 0x28, 0x00, 0x14, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D9E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x40, 0x20, 0x00, 0x21, 0x24, 0x00, 0x24, 0xA8, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x68, 0x00, 0x70, 0xA8, 0x00, 0x11, 0x24, 0x00, 0x12, 0x27, 0x00, 0x14, 0x22, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6D9F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x44, 0x14, 0x00, 0x32, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x00, 0x50, 0x00, 0x40, 0x94, 0x00, 0x36, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0A, 0x12, 0x00, 0x73, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x15, 0x13, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA0, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x1A, 0x22, 0x00, 0x0A, 0x2A, 0x00, 0x43, 0xFE, 0x00, 0x26, 0x22, 0x00, 0x26, 0xFA, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFA, 0x00, 0x12, 0x2A, 0x00, 0x72, 0x2A, 0x00, 0x12, 0x3A, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA1, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x09, 0x04, 0x00, 0x41, 0x04, 0x00, 0x31, 0xFC, 0x00, 0x10, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x22, 0x00, 0x72, 0x22, 0x00, 0x12, 0x52, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA3, { 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x18, 0x40, 0x00, 0x08, 0xF8, 0x00, 0x01, 0x10, 0x00, 0x42, 0x24, 0x00, 0x31, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x05, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x77, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x07, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x18, 0xFC, 0x00, 0x09, 0x88, 0x00, 0x42, 0x50, 0x00, 0x30, 0x20, 0x00, 0x10, 0x50, 0x00, 0x04, 0x88, 0x00, 0x09, 0x27, 0x00, 0x12, 0x20, 0x00, 0x75, 0xFE, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x26, 0x00, 0x12, 0x22, 0x00, 0x10, 0xA0, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA6, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x21, 0xBF, 0x00, 0x18, 0x82, 0x00, 0x0A, 0x12, 0x00, 0x42, 0xFA, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0xFA, 0x00, 0x12, 0x22, 0x00, 0x72, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA7, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0xDF, 0x00, 0x1A, 0x42, 0x00, 0x0A, 0x02, 0x00, 0x42, 0x02, 0x00, 0x32, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x06, 0x8A, 0x00, 0x0A, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x72, 0x8A, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA8, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x17, 0xA0, 0x00, 0x10, 0xA2, 0x00, 0x00, 0xA2, 0x00, 0x40, 0xA4, 0x00, 0x27, 0xA8, 0x00, 0x24, 0x22, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x28, 0x00, 0x17, 0xA8, 0x00, 0x70, 0xA8, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA2, 0x00, 0x15, 0x31, 0x00, 0x12, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DA9, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x04, 0x22, 0x00, 0x40, 0xA2, 0x00, 0x31, 0x22, 0x00, 0x10, 0x42, 0x00, 0x04, 0x8A, 0x00, 0x09, 0x04, 0x00, 0x12, 0x20, 0x00, 0x71, 0x24, 0x00, 0x11, 0x3E, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DAA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x01, 0x86, 0x00, 0x60, 0x84, 0x00, 0x30, 0x84, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x11, 0x02, 0x00, 0x31, 0x02, 0x00, 0x21, 0x02, 0x00, 0x61, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DAB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x44, 0x02, 0x00, 0x21, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x00, 0x00, 0x71, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DAC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x00, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DAE, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0xF9, 0x00, 0x0D, 0x11, 0x00, 0x05, 0x15, 0x00, 0x21, 0xF5, 0x00, 0x11, 0x45, 0x00, 0x13, 0x55, 0x00, 0x05, 0xFD, 0x00, 0x05, 0x55, 0x00, 0x0B, 0x55, 0x00, 0x3B, 0x55, 0x00, 0x0D, 0x55, 0x00, 0x09, 0x51, 0x00, 0x09, 0x71, 0x00, 0x08, 0x45, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DAF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x12, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x14, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DB2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x88, 0x00, 0x10, 0x88, 0x00, 0x01, 0x1F, 0x00, 0x01, 0x19, 0x00, 0x0B, 0x26, 0x00, 0x0D, 0x52, 0x00, 0x09, 0x94, 0x00, 0x11, 0x08, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x21, 0x21, 0x00, 0x21, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DB4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x01, 0x01, 0x00, 0x60, 0x80, 0x00, 0x30, 0xEF, 0x00, 0x10, 0xA9, 0x00, 0x01, 0xA9, 0x00, 0x09, 0x29, 0x00, 0x0B, 0xE9, 0x00, 0x18, 0x4B, 0x00, 0x10, 0xC8, 0x00, 0x30, 0x88, 0x80, 0x21, 0x89, 0x80, 0x63, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DB5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x20, 0x40, 0x00, 0x12, 0x72, 0x80, 0x02, 0x14, 0x80, 0x0A, 0x98, 0x80, 0x0A, 0x50, 0x80, 0x0A, 0x38, 0x80, 0x12, 0x54, 0x80, 0x13, 0x92, 0x80, 0x12, 0x71, 0x80, 0x12, 0x00, 0x80, 0x23, 0xFF, 0x80, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DB7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x54, 0x00, 0x18, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x0A, 0x21, 0x00, 0x02, 0x21, 0x00, 0x62, 0xFD, 0x00, 0x32, 0x21, 0x00, 0x12, 0x21, 0x00, 0x02, 0x79, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x49, 0x00, 0x12, 0x79, 0x00, 0x32, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DB9, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x30, 0x1C, 0x00, 0x19, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x60, 0x54, 0x00, 0x30, 0xD6, 0x00, 0x13, 0x93, 0x80, 0x00, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x42, 0x00, 0x10, 0x84, 0x00, 0x31, 0xF8, 0x00, 0x20, 0x2E, 0x00, 0x63, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DBC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x60, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x18, 0x92, 0x00, 0x10, 0x92, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DBD, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x33, 0xFC, 0x00, 0x1A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x62, 0x08, 0x00, 0x32, 0x0C, 0x00, 0x13, 0x86, 0x80, 0x06, 0x03, 0x80, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x21, 0x02, 0x00, 0x61, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0xD1, 0x00, 0x63, 0x93, 0x00, 0x31, 0x3A, 0x00, 0x11, 0x68, 0x00, 0x00, 0xC8, 0x00, 0x0B, 0x9C, 0x00, 0x08, 0xAC, 0x00, 0x18, 0x6A, 0x00, 0x10, 0xCB, 0x00, 0x31, 0x89, 0x80, 0x27, 0x18, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x11, 0x50, 0x00, 0x11, 0x50, 0x00, 0x22, 0x3F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC3, { 0x00, 0x00, 0x00, 0x20, 0x54, 0x00, 0x10, 0x92, 0x00, 0x01, 0xFF, 0x00, 0x02, 0x10, 0x80, 0x20, 0x28, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x09, 0x02, 0x00, 0x0A, 0xFD, 0x80, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x9C, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x49, 0x00, 0x00, 0x92, 0x00, 0x01, 0x24, 0x00, 0x20, 0x92, 0x00, 0x10, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC5, { 0x00, 0x00, 0x00, 0x10, 0x83, 0x00, 0x08, 0x9C, 0x00, 0x00, 0x90, 0x00, 0x03, 0xF0, 0x00, 0x20, 0x90, 0x00, 0x11, 0x9F, 0x80, 0x01, 0xD2, 0x00, 0x03, 0xB2, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xA2, 0x00, 0x20, 0xA2, 0x00, 0x20, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC6, { 0x00, 0x00, 0x00, 0x11, 0x86, 0x00, 0x08, 0x78, 0x00, 0x00, 0x2C, 0x00, 0x00, 0xC3, 0x00, 0x23, 0x20, 0x00, 0x10, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x09, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC7, { 0x00, 0x00, 0x00, 0x21, 0x04, 0x00, 0x11, 0x04, 0x00, 0x01, 0x04, 0x00, 0x07, 0xFF, 0x00, 0x21, 0x04, 0x00, 0x11, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x21, 0x04, 0x00, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x00, 0x00, 0x31, 0x08, 0x00, 0x11, 0x49, 0x00, 0x01, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x19, 0x08, 0x00, 0x11, 0x49, 0x00, 0x33, 0x49, 0x00, 0x22, 0x49, 0x00, 0x66, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DCA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x40, 0x00, 0x18, 0x7F, 0x00, 0x08, 0xC1, 0x00, 0x00, 0x83, 0x00, 0x61, 0x82, 0x00, 0x33, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x60, 0x00, 0x09, 0xCF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0xEF, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DCB, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x84, 0x00, 0x11, 0x8E, 0x00, 0x01, 0xCE, 0x00, 0x0A, 0xB5, 0x00, 0x0A, 0x95, 0x00, 0x0C, 0xA4, 0x80, 0x14, 0xA4, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DCC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x92, 0x00, 0x19, 0x93, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x60, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x19, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DCE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x28, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x00, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DCF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DD1, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x10, 0x8A, 0x00, 0x07, 0xFA, 0x00, 0x00, 0x86, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xA4, 0x00, 0x0A, 0xA4, 0x00, 0x14, 0xAA, 0x00, 0x14, 0xAA, 0x00, 0x10, 0x91, 0x00, 0x20, 0x91, 0x00, 0x21, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DD2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x11, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x42, 0x00, 0x10, 0x84, 0x00, 0x31, 0xF8, 0x00, 0x20, 0x2F, 0x00, 0x63, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DD5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x01, 0x87, 0x80, 0x0B, 0x10, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DD6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x01, 0x00, 0x31, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DD8, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x11, 0x00, 0x80, 0x03, 0xFE, 0x80, 0x0C, 0x20, 0x80, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x80, 0x12, 0x22, 0x80, 0x12, 0x22, 0x80, 0x13, 0xFE, 0x80, 0x12, 0x02, 0x80, 0x20, 0x01, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DD9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x20, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x11, 0x00, 0x22, 0x10, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DDA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x12, 0x22, 0x00, 0x22, 0x41, 0x00, 0x24, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DDB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x32, 0x84, 0x80, 0x1A, 0x84, 0x80, 0x0B, 0xF4, 0x80, 0x04, 0x84, 0x80, 0x60, 0x84, 0x80, 0x37, 0xF4, 0x80, 0x10, 0x84, 0x80, 0x00, 0x84, 0x80, 0x07, 0xF4, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x34, 0x90, 0x80, 0x24, 0x90, 0x80, 0x24, 0xB0, 0x80, 0x60, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xDF, 0x00, 0x1A, 0x55, 0x00, 0x0A, 0x55, 0x00, 0x02, 0x55, 0x00, 0x63, 0xD5, 0x00, 0x32, 0x55, 0x00, 0x12, 0x5F, 0x00, 0x02, 0x50, 0x00, 0x0B, 0xD0, 0x00, 0x0A, 0x50, 0x00, 0x1A, 0x50, 0x00, 0x12, 0x50, 0x00, 0x32, 0x50, 0x80, 0x26, 0x59, 0x80, 0x64, 0xCF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DDE, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x8E, 0x00, 0x00, 0x82, 0x00, 0x03, 0xEA, 0x00, 0x20, 0x89, 0x00, 0x11, 0x91, 0x00, 0x01, 0xE0, 0x80, 0x03, 0xA8, 0x00, 0x0A, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0A, 0x92, 0x00, 0x10, 0x91, 0x00, 0x10, 0xA7, 0x00, 0x10, 0xF8, 0x80, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DDF, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x30, 0x48, 0x00, 0x18, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x62, 0x49, 0x00, 0x32, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x30, 0x84, 0x00, 0x21, 0x86, 0x00, 0x63, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x31, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x10, 0x44, 0x00, 0x30, 0xC4, 0x00, 0x20, 0x84, 0x00, 0x61, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE1, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x22, 0x00, 0x01, 0x24, 0x00, 0x01, 0x28, 0x00, 0x20, 0x20, 0x00, 0x10, 0x50, 0x00, 0x00, 0x8C, 0x00, 0x0B, 0x23, 0x80, 0x08, 0x20, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x28, 0x00, 0x12, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x23, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DE2, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x30, 0x12, 0x00, 0x18, 0x12, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x60, 0x10, 0x00, 0x33, 0xD1, 0x00, 0x12, 0x59, 0x00, 0x02, 0x4B, 0x00, 0x0A, 0x4A, 0x00, 0x0B, 0xCE, 0x00, 0x18, 0x04, 0x00, 0x11, 0xCC, 0x80, 0x37, 0x16, 0x80, 0x20, 0x63, 0x80, 0x61, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE4, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x31, 0x04, 0x00, 0x19, 0x0E, 0x00, 0x0F, 0xEA, 0x00, 0x02, 0x0A, 0x00, 0x62, 0x1B, 0x00, 0x33, 0xD1, 0x00, 0x12, 0x71, 0x80, 0x02, 0x4C, 0x00, 0x02, 0x46, 0x00, 0x12, 0x42, 0x00, 0x12, 0x40, 0x00, 0x36, 0x40, 0x00, 0x24, 0x4C, 0x00, 0x24, 0x46, 0x00, 0x6C, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x7E, 0x00, 0x18, 0xC2, 0x00, 0x08, 0x86, 0x00, 0x01, 0xFC, 0x00, 0x60, 0x04, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x01, 0x91, 0x00, 0x08, 0xD3, 0x00, 0x08, 0x5A, 0x00, 0x18, 0x3C, 0x00, 0x10, 0xD6, 0x00, 0x31, 0x93, 0x00, 0x27, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x61, 0x83, 0x00, 0x33, 0x7D, 0x80, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x19, 0x11, 0x00, 0x11, 0x93, 0x00, 0x30, 0x92, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE8, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x88, 0x80, 0x01, 0x04, 0x00, 0x22, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DE9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x60, 0x44, 0x00, 0x30, 0xC4, 0x00, 0x11, 0x87, 0x80, 0x00, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x62, 0x00, 0x18, 0xC6, 0x00, 0x11, 0xAC, 0x00, 0x30, 0x38, 0x00, 0x20, 0x6E, 0x00, 0x63, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DEA, { 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x08, 0x48, 0x00, 0x00, 0x84, 0x00, 0x01, 0x02, 0x00, 0x26, 0x01, 0x80, 0x10, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DEB, { 0x00, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x09, 0xE1, 0x00, 0x01, 0x10, 0x80, 0x02, 0x08, 0x00, 0x24, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DEC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x44, 0x00, 0x60, 0x44, 0x00, 0x30, 0xEE, 0x00, 0x11, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DEE, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x21, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x04, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DEF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x00, 0x82, 0x00, 0x61, 0xFF, 0x00, 0x37, 0x01, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x21, 0x02, 0x00, 0x61, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x60, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x34, 0x00, 0x18, 0x18, 0x00, 0x11, 0x4B, 0x00, 0x31, 0x41, 0x80, 0x23, 0x62, 0x80, 0x62, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x28, 0x80, 0x00, 0x28, 0x00, 0x20, 0x48, 0x80, 0x10, 0x8F, 0x80, 0x03, 0x10, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x21, 0x11, 0x00, 0x26, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DF3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x29, 0x00, 0x06, 0x49, 0x00, 0x60, 0x91, 0x00, 0x31, 0x23, 0x00, 0x10, 0x42, 0x00, 0x00, 0x8E, 0x00, 0x08, 0x00, 0x00, 0x08, 0x30, 0x00, 0x18, 0x98, 0x00, 0x12, 0x83, 0x00, 0x32, 0x85, 0x80, 0x26, 0x8C, 0x80, 0x64, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF5, { 0x00, 0x00, 0x00, 0x11, 0x24, 0x80, 0x09, 0x24, 0x80, 0x01, 0x24, 0x80, 0x01, 0x24, 0x80, 0x21, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x09, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x12, 0x24, 0x80, 0x22, 0x24, 0x80, 0x24, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DF6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x00, 0x92, 0x00, 0x60, 0x92, 0x00, 0x30, 0x92, 0x00, 0x11, 0xD7, 0x00, 0x01, 0x55, 0x00, 0x0B, 0x39, 0x80, 0x08, 0x38, 0x00, 0x18, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0xF9, 0x80, 0x11, 0x0E, 0x00, 0x11, 0x08, 0x00, 0x11, 0x78, 0x80, 0x27, 0x8F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DF9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x20, 0x44, 0x00, 0x10, 0x92, 0x00, 0x03, 0x11, 0x80, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x80, 0x20, 0x1F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DFA, { 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x08, 0x27, 0x80, 0x00, 0x3D, 0x00, 0x03, 0xE2, 0x00, 0x20, 0x14, 0x00, 0x10, 0x18, 0x80, 0x00, 0x67, 0x80, 0x03, 0xA8, 0x00, 0x08, 0x24, 0x00, 0x08, 0x2F, 0x80, 0x0B, 0xF1, 0x00, 0x10, 0x22, 0x00, 0x10, 0x14, 0x00, 0x10, 0x18, 0x80, 0x20, 0x64, 0x80, 0x23, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6DFB, { 0x00, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x0B, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x00, 0x88, 0x00, 0x01, 0x06, 0x00, 0x0E, 0x01, 0x80, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x11, 0x29, 0x00, 0x11, 0x25, 0x00, 0x12, 0x24, 0x80, 0x22, 0x24, 0x80, 0x24, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6DFC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x83, 0x00, 0x3E, 0xCE, 0x00, 0x02, 0xB0, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x01, 0x80, 0x00, 0x04, 0x08, 0x00, 0x75, 0x89, 0x80, 0x17, 0x7B, 0x00, 0x16, 0x1C, 0x00, 0x35, 0xAA, 0x00, 0x64, 0x6B, 0x00, 0x04, 0xC9, 0x80, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E00, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x01, 0x86, 0x00, 0x67, 0x23, 0x80, 0x30, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x84, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x31, 0x84, 0x00, 0x21, 0x04, 0x00, 0x63, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E04, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x30, 0x24, 0x00, 0x18, 0x24, 0x00, 0x09, 0xE7, 0x80, 0x00, 0x24, 0x00, 0x60, 0x24, 0x00, 0x30, 0x24, 0x00, 0x11, 0xE7, 0x80, 0x00, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0xE4, 0x00, 0x1B, 0xA7, 0x80, 0x10, 0x24, 0x00, 0x30, 0x64, 0x00, 0x20, 0xC4, 0x00, 0x61, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E05, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x20, 0x82, 0x00, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E07, { 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x61, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x09, 0x80, 0x80, 0x0B, 0x18, 0x80, 0x1F, 0xF0, 0x80, 0x11, 0x00, 0x80, 0x31, 0x09, 0x80, 0x20, 0xF9, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E08, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x00, 0x6C, 0x00, 0x60, 0x38, 0x00, 0x30, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x00, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x31, 0x82, 0x00, 0x21, 0x02, 0x00, 0x63, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E09, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x90, 0x00, 0x18, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x00, 0x90, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x10, 0x92, 0x00, 0x01, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x12, 0x00, 0x18, 0x36, 0x00, 0x10, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x20, 0x70, 0x00, 0x63, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E0A, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x31, 0x11, 0x00, 0x19, 0x55, 0x00, 0x09, 0x55, 0x00, 0x01, 0x39, 0x00, 0x61, 0x11, 0x00, 0x31, 0x7D, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0x39, 0x00, 0x09, 0x39, 0x00, 0x19, 0x55, 0x00, 0x13, 0x55, 0x00, 0x32, 0x11, 0x00, 0x26, 0x11, 0x00, 0x6C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E0B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x90, 0x00, 0x08, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x60, 0x90, 0x00, 0x30, 0x90, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0x83, 0x00, 0x08, 0xC6, 0x00, 0x18, 0x44, 0x00, 0x10, 0x00, 0x00, 0x30, 0xC6, 0x00, 0x21, 0x83, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E0C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x18, 0x04, 0x00, 0x08, 0x04, 0x00, 0x41, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x12, 0x22, 0x00, 0x71, 0x74, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x24, 0x00, 0x16, 0x27, 0x00, 0x10, 0xA2, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E0D, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x23, 0xFE, 0x00, 0x18, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x40, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x11, 0x24, 0x00, 0x71, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x10, 0x58, 0x00, 0x11, 0x86, 0x00, 0x16, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E0E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x40, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x91, 0x00, 0x08, 0x52, 0x00, 0x09, 0x30, 0x00, 0x10, 0x90, 0x00, 0x70, 0x52, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E10, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x06, 0x00, 0x11, 0x18, 0x00, 0x17, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x42, 0x92, 0x00, 0x34, 0x9F, 0x00, 0x17, 0xF4, 0x00, 0x08, 0x94, 0x00, 0x10, 0x94, 0x00, 0x70, 0xF4, 0x00, 0x1F, 0x94, 0x00, 0x14, 0x94, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E11, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x09, 0x04, 0x00, 0x41, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x72, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x21, 0x00, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E13, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x1E, 0x00, 0x19, 0xF0, 0x00, 0x08, 0x21, 0x00, 0x01, 0x33, 0x00, 0x61, 0x96, 0x00, 0x30, 0x84, 0x00, 0x10, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x30, 0x6C, 0x00, 0x20, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E14, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x18, 0xFC, 0x00, 0x09, 0x08, 0x00, 0x42, 0x12, 0x00, 0x37, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x06, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x72, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x32, 0x24, 0x80, 0x1B, 0x64, 0x80, 0x09, 0x44, 0x80, 0x07, 0xF4, 0x80, 0x60, 0x84, 0x80, 0x30, 0x84, 0x80, 0x17, 0xF4, 0x80, 0x00, 0x84, 0x80, 0x08, 0x84, 0x80, 0x09, 0xC4, 0x80, 0x19, 0x44, 0x80, 0x13, 0x60, 0x80, 0x32, 0x20, 0x80, 0x26, 0x30, 0x80, 0x60, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E16, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x44, 0x20, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x72, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E17, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x42, 0x00, 0x00, 0x8F, 0x00, 0x03, 0xF0, 0x80, 0x20, 0x40, 0x00, 0x10, 0x82, 0x00, 0x01, 0x1F, 0x00, 0x07, 0xE0, 0x80, 0x08, 0x30, 0x00, 0x08, 0x4C, 0x00, 0x09, 0xB3, 0x80, 0x16, 0xC8, 0x00, 0x10, 0x31, 0x00, 0x11, 0xC6, 0x00, 0x20, 0x38, 0x00, 0x21, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E19, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x24, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x0B, 0x8F, 0x00, 0x0A, 0x21, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x21, 0x06, 0x00, 0x26, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E1A, { 0x00, 0x00, 0x00, 0x10, 0x21, 0x00, 0x08, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x24, 0x00, 0x20, 0x28, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x09, 0x80, 0x00, 0x0E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E1B, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x10, 0x12, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x22, 0x10, 0x80, 0x13, 0xF0, 0x80, 0x02, 0x11, 0x00, 0x02, 0xF1, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xA4, 0x00, 0x12, 0xEC, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x12, 0x80, 0x24, 0x21, 0x80, 0x24, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E1D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x03, 0xBB, 0x80, 0x60, 0x00, 0x00, 0x31, 0xE4, 0x80, 0x11, 0x24, 0x80, 0x01, 0xA4, 0x80, 0x09, 0x6D, 0x80, 0x09, 0x29, 0x00, 0x19, 0xA9, 0x00, 0x11, 0x6D, 0x80, 0x31, 0x24, 0x80, 0x21, 0x24, 0x80, 0x61, 0x64, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E1E, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0xC6, 0x00, 0x18, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x60, 0x20, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E1F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E20, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x01, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E21, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x21, 0x22, 0x00, 0x11, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x09, 0x3E, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x42, 0x00, 0x11, 0x24, 0x00, 0x12, 0x18, 0x00, 0x12, 0x18, 0x00, 0x22, 0x66, 0x00, 0x25, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x1A, 0x02, 0x00, 0x0A, 0x1A, 0x00, 0x02, 0xF2, 0x00, 0x62, 0x22, 0x00, 0x32, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x02, 0xAA, 0x00, 0x0A, 0xFA, 0x00, 0x0A, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x32, 0x3A, 0x80, 0x22, 0xEA, 0x80, 0x64, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E23, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x38, 0x00, 0x20, 0x54, 0x00, 0x10, 0x92, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E24, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x07, 0xF4, 0x00, 0x00, 0x8F, 0x80, 0x23, 0xE4, 0x80, 0x10, 0x04, 0x80, 0x03, 0xE4, 0x80, 0x08, 0x44, 0x80, 0x08, 0x84, 0x80, 0x08, 0xF8, 0x80, 0x1F, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x91, 0x00, 0x20, 0x91, 0x00, 0x21, 0xA6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E25, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x03, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x0A, 0x42, 0x00, 0x0A, 0x8F, 0x00, 0x0B, 0xF8, 0x80, 0x0A, 0x10, 0x00, 0x12, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E26, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x20, 0xBE, 0x00, 0x10, 0xA2, 0x00, 0x00, 0xA2, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x7C, 0x80, 0x0A, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x22, 0x00, 0x80, 0x22, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E27, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x00, 0xC6, 0x00, 0x60, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x02, 0x10, 0x80, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x13, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x61, 0x02, 0x00, 0x31, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x49, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E2B, { 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x09, 0x44, 0x00, 0x01, 0x44, 0x00, 0x07, 0xFF, 0x80, 0x21, 0x44, 0x00, 0x11, 0x44, 0x00, 0x01, 0x7C, 0x00, 0x01, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x21, 0x11, 0x00, 0x26, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E2C, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x0B, 0xE1, 0x00, 0x02, 0x29, 0x00, 0x02, 0x29, 0x00, 0x22, 0x29, 0x00, 0x13, 0xE9, 0x00, 0x02, 0x29, 0x00, 0x02, 0x29, 0x00, 0x0B, 0xE9, 0x00, 0x0A, 0x29, 0x00, 0x0A, 0x29, 0x00, 0x12, 0x29, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x01, 0x00, 0x22, 0x21, 0x00, 0x24, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E2D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x03, 0xFF, 0x80, 0x22, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E2E, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x00, 0x44, 0x00, 0x60, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x01, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x19, 0x12, 0x00, 0x11, 0xF2, 0x00, 0x30, 0x02, 0x00, 0x20, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E2F, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x48, 0x00, 0x00, 0x48, 0x00, 0x03, 0xFF, 0x00, 0x20, 0x48, 0x00, 0x10, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x09, 0x02, 0x00, 0x0E, 0xFD, 0x80, 0x08, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E32, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x80, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x10, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x88, 0x80, 0x0A, 0x94, 0x80, 0x14, 0xA2, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E36, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x20, 0x54, 0x00, 0x10, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E38, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x09, 0x04, 0x00, 0x01, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x1F, 0x00, 0x01, 0xE2, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x27, 0x80, 0x0A, 0x3C, 0x00, 0x12, 0x24, 0x00, 0x12, 0x44, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x29, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E39, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x0B, 0x00, 0x80, 0x02, 0x78, 0x80, 0x66, 0x00, 0x80, 0x31, 0xFE, 0x80, 0x10, 0x00, 0x80, 0x00, 0x78, 0x80, 0x08, 0x00, 0x80, 0x08, 0x78, 0x80, 0x18, 0x00, 0x80, 0x10, 0xFC, 0x80, 0x30, 0x85, 0x80, 0x20, 0xFD, 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E3A, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x0B, 0x84, 0x00, 0x02, 0x84, 0x00, 0x02, 0x95, 0x00, 0x22, 0x94, 0x80, 0x13, 0xA4, 0x80, 0x02, 0xC4, 0x00, 0x0A, 0x84, 0x80, 0x0A, 0x84, 0x80, 0x0B, 0x8D, 0x00, 0x12, 0x81, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x13, 0x84, 0x00, 0x22, 0x88, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E3B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x56, 0x00, 0x18, 0xD3, 0x00, 0x0B, 0x91, 0x80, 0x00, 0x34, 0x00, 0x60, 0x0C, 0x00, 0x30, 0xFF, 0x00, 0x13, 0x81, 0x00, 0x00, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x18, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x30, 0x81, 0x00, 0x20, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E3C, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E3D, { 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x08, 0x94, 0x00, 0x07, 0xF2, 0x00, 0x00, 0x90, 0x00, 0x20, 0x90, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x0B, 0xD2, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x54, 0x00, 0x12, 0x48, 0x00, 0x13, 0xD8, 0x00, 0x10, 0x24, 0x80, 0x20, 0x42, 0x80, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E3E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E43, { 0x00, 0x00, 0x00, 0x10, 0xE0, 0x00, 0x0B, 0xBF, 0x80, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x24, 0x9F, 0x00, 0x13, 0xE4, 0x00, 0x00, 0x84, 0x00, 0x08, 0x9F, 0x00, 0x08, 0xE4, 0x00, 0x09, 0x84, 0x00, 0x16, 0xBF, 0x80, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x22, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E44, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x10, 0x80, 0x01, 0x10, 0x80, 0x21, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x7F, 0x00, 0x05, 0x41, 0x00, 0x05, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E45, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x31, 0x93, 0x00, 0x11, 0x55, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x54, 0x00, 0x18, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E48, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0x82, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x30, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x18, 0xD6, 0x00, 0x10, 0x92, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E49, { 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x30, 0x86, 0x00, 0x18, 0x9C, 0x00, 0x0A, 0x84, 0x00, 0x02, 0xC4, 0x00, 0x62, 0xA4, 0x00, 0x36, 0xBF, 0x80, 0x14, 0x84, 0x00, 0x00, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9F, 0x00, 0x18, 0x91, 0x00, 0x10, 0x91, 0x00, 0x30, 0x91, 0x00, 0x20, 0x91, 0x00, 0x60, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E4A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x7D, 0x80, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E4B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x31, 0xFE, 0x00, 0x18, 0x42, 0x00, 0x08, 0x42, 0x00, 0x03, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x08, 0x00, 0x11, 0x08, 0x00, 0x31, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E4D, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x22, 0x44, 0x80, 0x22, 0x45, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x08, 0x60, 0x00, 0x00, 0x40, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x49, 0x00, 0x12, 0x49, 0x00, 0x02, 0x79, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x79, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x49, 0x00, 0x63, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x61, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x82, 0x00, 0x21, 0x83, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x20, 0x80, 0x09, 0x3D, 0x00, 0x01, 0x20, 0x00, 0x63, 0xA0, 0x00, 0x36, 0x7F, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x21, 0x02, 0x00, 0x61, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x83, 0x80, 0x10, 0xFE, 0x00, 0x33, 0x82, 0x00, 0x20, 0x02, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E53, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x30, 0x86, 0x00, 0x19, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x00, 0xFE, 0x00, 0x60, 0x22, 0x00, 0x30, 0x62, 0x00, 0x10, 0xC2, 0x00, 0x01, 0x8E, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x49, 0x00, 0x11, 0x49, 0x00, 0x31, 0x49, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E54, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0xC6, 0x00, 0x18, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x61, 0xE1, 0x00, 0x31, 0x29, 0x00, 0x11, 0x29, 0x00, 0x01, 0xA9, 0x00, 0x09, 0x69, 0x00, 0x09, 0x29, 0x00, 0x19, 0xA9, 0x00, 0x11, 0x61, 0x00, 0x31, 0x21, 0x00, 0x21, 0x21, 0x00, 0x61, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E56, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x8F, 0x80, 0x00, 0x88, 0x80, 0x07, 0xF8, 0x80, 0x00, 0x88, 0x80, 0x20, 0x8F, 0x80, 0x10, 0x88, 0x80, 0x03, 0xE8, 0x80, 0x0A, 0x28, 0x80, 0x0A, 0x2F, 0x80, 0x0A, 0x28, 0x80, 0x12, 0x28, 0x80, 0x12, 0x28, 0x80, 0x13, 0xE8, 0x80, 0x22, 0x30, 0x80, 0x22, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E57, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x30, 0x81, 0x00, 0x1B, 0xE1, 0x00, 0x08, 0x81, 0x00, 0x00, 0x8F, 0x80, 0x67, 0xF1, 0x00, 0x30, 0x01, 0x00, 0x10, 0x89, 0x00, 0x00, 0x8D, 0x00, 0x0B, 0xE5, 0x00, 0x08, 0x81, 0x00, 0x18, 0x81, 0x00, 0x10, 0x81, 0x00, 0x30, 0xE1, 0x00, 0x23, 0x81, 0x00, 0x66, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E58, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x8F, 0x80, 0x00, 0x88, 0x80, 0x07, 0xE8, 0x80, 0x20, 0x88, 0x80, 0x11, 0x8F, 0x80, 0x01, 0xC8, 0x80, 0x03, 0xA8, 0x80, 0x0A, 0x88, 0x80, 0x0A, 0x8F, 0x80, 0x0A, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x20, 0x8F, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E5B, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x20, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0x44, 0x00, 0x12, 0x44, 0x80, 0x13, 0x83, 0x80, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E5C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x11, 0x10, 0x00, 0x11, 0x90, 0x00, 0x22, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E5D, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x31, 0x09, 0x80, 0x19, 0xEF, 0x00, 0x09, 0x08, 0x00, 0x01, 0x08, 0x00, 0x61, 0x08, 0x80, 0x31, 0xC7, 0x80, 0x17, 0x10, 0x00, 0x00, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E5E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E5F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x61, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x1A, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x32, 0x10, 0x80, 0x22, 0x10, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E63, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x19, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x08, 0x00, 0x61, 0x08, 0x00, 0x31, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x01, 0x04, 0x80, 0x09, 0xC2, 0x80, 0x0B, 0x01, 0x80, 0x19, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E67, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x24, 0x00, 0x20, 0x18, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x20, 0x80, 0x10, 0x40, 0x80, 0x21, 0x81, 0x00, 0x26, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x14, 0x00, 0x08, 0x16, 0x00, 0x08, 0x12, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x30, 0x6C, 0x00, 0x20, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E6B, { 0x00, 0x00, 0x00, 0x10, 0x34, 0x00, 0x09, 0xC5, 0x00, 0x00, 0x44, 0x80, 0x00, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0xE4, 0x00, 0x09, 0x54, 0x00, 0x09, 0x44, 0x00, 0x09, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x10, 0x51, 0x00, 0x20, 0x51, 0x00, 0x20, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E6E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x07, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x15, 0x0F, 0x00, 0x06, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E6F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x12, 0x80, 0x16, 0x24, 0x80, 0x10, 0xC8, 0x80, 0x17, 0x10, 0x80, 0x20, 0x21, 0x00, 0x20, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E72, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x08, 0xF9, 0x00, 0x00, 0x90, 0x80, 0x01, 0x08, 0x00, 0x20, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x42, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x18, 0x00, 0x22, 0x36, 0x00, 0x24, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E73, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x28, 0x80, 0x0A, 0xFE, 0x80, 0x12, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x22, 0x10, 0x80, 0x22, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E76, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x20, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x30, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x80, 0x0B, 0xD1, 0x80, 0x08, 0x5B, 0x00, 0x18, 0xD4, 0x00, 0x10, 0x96, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E7A, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0xBE, 0x00, 0x01, 0x22, 0x00, 0x01, 0x22, 0x00, 0x23, 0x22, 0x00, 0x13, 0x3E, 0x00, 0x05, 0x08, 0x00, 0x01, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x0C, 0x00, 0x09, 0x1C, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x49, 0x00, 0x21, 0x88, 0x80, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E7B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x30, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E7D, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x31, 0x11, 0x00, 0x1A, 0x22, 0x00, 0x0F, 0xFF, 0x80, 0x02, 0x22, 0x00, 0x61, 0x11, 0x00, 0x30, 0x88, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x21, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E7E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x01, 0x45, 0x00, 0x62, 0x44, 0x80, 0x30, 0x84, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x30, 0x00, 0x80, 0x20, 0x01, 0x80, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x61, 0x02, 0x00, 0x31, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x49, 0x00, 0x1B, 0x4B, 0x00, 0x11, 0x4A, 0x00, 0x30, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E80, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x00, 0x44, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x19, 0x55, 0x00, 0x11, 0x7D, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E82, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x30, 0x89, 0x00, 0x1F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x03, 0xE9, 0x00, 0x62, 0xA9, 0x00, 0x32, 0xA9, 0x00, 0x12, 0xA9, 0x00, 0x03, 0xE9, 0x00, 0x08, 0x89, 0x00, 0x09, 0x89, 0x00, 0x19, 0xC1, 0x00, 0x12, 0xA1, 0x00, 0x36, 0x91, 0x00, 0x2C, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E83, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x24, 0x00, 0x19, 0xFE, 0x00, 0x09, 0x24, 0x00, 0x41, 0xFC, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x71, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x10, 0x58, 0x00, 0x10, 0x86, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E85, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x17, 0xD2, 0x00, 0x14, 0x57, 0x00, 0x05, 0x78, 0x00, 0x45, 0x50, 0x00, 0x25, 0x57, 0x00, 0x25, 0x78, 0x00, 0x0D, 0x52, 0x00, 0x15, 0x52, 0x00, 0x65, 0x54, 0x00, 0x25, 0x48, 0x00, 0x21, 0x18, 0x00, 0x22, 0xA5, 0x00, 0x24, 0x45, 0x00, 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E86, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x1A, 0x82, 0x00, 0x0A, 0x7F, 0x00, 0x44, 0x22, 0x00, 0x2B, 0xA2, 0x00, 0x21, 0x22, 0x00, 0x09, 0x14, 0x00, 0x0F, 0xD4, 0x00, 0x11, 0x14, 0x00, 0x73, 0x88, 0x00, 0x15, 0x48, 0x00, 0x19, 0x14, 0x00, 0x11, 0x14, 0x00, 0x15, 0x22, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E89, { 0x00, 0x00, 0x00, 0x20, 0x82, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x04, 0x88, 0x00, 0x47, 0xA8, 0x00, 0x24, 0xA8, 0x00, 0x24, 0xAA, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x65, 0x10, 0x00, 0x25, 0x98, 0x00, 0x26, 0xA9, 0x00, 0x24, 0x29, 0x00, 0x20, 0x47, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E8C, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xFA, 0x00, 0x1A, 0x28, 0x80, 0x09, 0x6D, 0x00, 0x00, 0xC6, 0x00, 0x61, 0x83, 0x00, 0x33, 0x01, 0x80, 0x10, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x10, 0x44, 0x00, 0x30, 0xC4, 0x80, 0x21, 0x84, 0x80, 0x63, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x82, 0x00, 0x08, 0x82, 0x00, 0x01, 0x04, 0x00, 0x61, 0x45, 0x00, 0x33, 0xAE, 0x80, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E8F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x02, 0xFF, 0x00, 0x62, 0x11, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x11, 0x00, 0x02, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x32, 0x81, 0x00, 0x24, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E90, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x02, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x08, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x24, 0x89, 0x00, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E93, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x30, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x49, 0x00, 0x30, 0x49, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x49, 0x00, 0x08, 0x49, 0x00, 0x09, 0xFF, 0x00, 0x18, 0xCC, 0x00, 0x11, 0x4A, 0x00, 0x33, 0x4B, 0x00, 0x26, 0x49, 0x80, 0x60, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E96, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x48, 0x00, 0x20, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x01, 0xFF, 0x00, 0x0A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E98, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x19, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x63, 0xFF, 0x00, 0x30, 0x80, 0x00, 0x10, 0x84, 0x00, 0x01, 0x3E, 0x00, 0x0B, 0xE3, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x49, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E99, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x28, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x44, 0x00, 0x10, 0x82, 0x00, 0x03, 0x11, 0x80, 0x08, 0x10, 0x00, 0x09, 0x93, 0x00, 0x18, 0xD6, 0x00, 0x10, 0x3C, 0x00, 0x30, 0xD7, 0x00, 0x23, 0x91, 0x80, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E9C, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x09, 0x9F, 0x80, 0x01, 0x04, 0x80, 0x01, 0x04, 0x80, 0x21, 0x14, 0x80, 0x11, 0x74, 0x80, 0x03, 0x98, 0x80, 0x08, 0x13, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x21, 0x10, 0x80, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6E9D, { 0x00, 0x00, 0x00, 0x20, 0x88, 0x00, 0x10, 0x88, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x27, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6E9F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EA0, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x60, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x10, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x18, 0xFF, 0x00, 0x11, 0x88, 0x00, 0x36, 0x08, 0x00, 0x20, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EA2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x82, 0x00, 0x21, 0x7D, 0x00, 0x12, 0x00, 0x80, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x0A, 0x00, 0x80, 0x11, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EA5, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x08, 0x12, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x11, 0x13, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x20, 0x22, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x08, 0x48, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x49, 0x00, 0x31, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x18, 0xD6, 0x00, 0x10, 0x92, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EAA, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x91, 0x00, 0x01, 0x08, 0x80, 0x20, 0x20, 0x00, 0x10, 0x28, 0x00, 0x01, 0x48, 0x00, 0x00, 0x92, 0x00, 0x08, 0x6E, 0x00, 0x0B, 0xF1, 0x00, 0x08, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x30, 0x00, 0x10, 0x48, 0x00, 0x21, 0x86, 0x00, 0x22, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EAB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x22, 0x52, 0x00, 0x12, 0x8A, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x89, 0x00, 0x14, 0x89, 0x00, 0x14, 0x89, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x03, 0x87, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x19, 0x86, 0x00, 0x17, 0x6C, 0x00, 0x30, 0x38, 0x00, 0x20, 0xEE, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EAE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x31, 0x1F, 0x80, 0x1B, 0xC4, 0x00, 0x0A, 0x44, 0x00, 0x02, 0x5F, 0x80, 0x62, 0x54, 0x80, 0x33, 0xD4, 0x80, 0x12, 0x14, 0x80, 0x02, 0x14, 0x80, 0x0B, 0xD4, 0x80, 0x0A, 0x54, 0x80, 0x1A, 0x54, 0x80, 0x12, 0x54, 0x80, 0x32, 0x55, 0x80, 0x23, 0xC4, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EAF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0A, 0x27, 0x80, 0x01, 0x44, 0x80, 0x00, 0x04, 0x80, 0x27, 0xF4, 0x80, 0x10, 0x87, 0x80, 0x02, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x0B, 0xE7, 0x80, 0x0A, 0xA4, 0x80, 0x10, 0x84, 0x80, 0x11, 0x04, 0x80, 0x11, 0x08, 0x80, 0x22, 0x08, 0x80, 0x24, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EB1, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x20, 0xFE, 0x00, 0x10, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x08, 0x9E, 0x00, 0x0B, 0x71, 0x80, 0x08, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x20, 0x92, 0x00, 0x23, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EB2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0xD0, 0x00, 0x19, 0x97, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x61, 0xD7, 0x00, 0x31, 0x11, 0x00, 0x11, 0x11, 0x00, 0x01, 0xD7, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x82, 0x00, 0x10, 0x4C, 0x00, 0x30, 0x38, 0x00, 0x20, 0xEE, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x82, 0x00, 0x21, 0x83, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EB4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x84, 0x00, 0x1B, 0xFE, 0x00, 0x0A, 0x04, 0x00, 0x43, 0xFC, 0x00, 0x22, 0x04, 0x00, 0x23, 0xFC, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0xFC, 0x00, 0x10, 0x50, 0x00, 0x70, 0x4A, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xA0, 0x00, 0x10, 0x90, 0x00, 0x11, 0x08, 0x00, 0x16, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EB6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x20, 0x44, 0x00, 0x10, 0x92, 0x00, 0x03, 0x29, 0x80, 0x00, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x08, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x0A, 0xFD, 0x00, 0x02, 0x21, 0x00, 0x62, 0x41, 0x00, 0x32, 0xA5, 0x00, 0x12, 0x29, 0x00, 0x02, 0x51, 0x00, 0x0A, 0x91, 0x00, 0x0A, 0x39, 0x00, 0x1A, 0x55, 0x00, 0x12, 0x93, 0x00, 0x32, 0x31, 0x00, 0x22, 0x01, 0x00, 0x63, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EBA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xE7, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x21, 0xE7, 0x80, 0x11, 0x04, 0x00, 0x02, 0x08, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0x62, 0x80, 0x08, 0xA4, 0x80, 0x11, 0x28, 0x80, 0x12, 0x71, 0x80, 0x10, 0xA2, 0x80, 0x11, 0x24, 0x80, 0x22, 0x28, 0x80, 0x24, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x1A, 0x02, 0x00, 0x0A, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x62, 0xFA, 0x00, 0x30, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x00, 0xC3, 0x00, 0x0B, 0x4D, 0x00, 0x08, 0x51, 0x00, 0x18, 0xC7, 0x00, 0x13, 0x4D, 0x00, 0x36, 0x59, 0x00, 0x20, 0x41, 0x00, 0x61, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x80, 0x19, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x01, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x31, 0x49, 0x00, 0x11, 0x4A, 0x00, 0x01, 0x44, 0x00, 0x0A, 0x72, 0x00, 0x08, 0xC1, 0x80, 0x18, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x82, 0x00, 0x20, 0xC2, 0x00, 0x60, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EBF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x37, 0xD5, 0x00, 0x1D, 0x55, 0x80, 0x05, 0x74, 0x80, 0x05, 0x44, 0x00, 0x65, 0x5F, 0x00, 0x37, 0xC4, 0x00, 0x15, 0x44, 0x00, 0x05, 0x44, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x37, 0xC4, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x00, 0x84, 0x00, 0x63, 0x88, 0x00, 0x30, 0xD1, 0x00, 0x10, 0x3F, 0x80, 0x07, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x21, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC1, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x33, 0xCE, 0x00, 0x1A, 0x4B, 0x00, 0x0A, 0x59, 0x80, 0x02, 0xD0, 0x80, 0x62, 0xBF, 0x00, 0x32, 0x84, 0x00, 0x12, 0x44, 0x00, 0x02, 0x7F, 0x80, 0x0A, 0x44, 0x00, 0x0A, 0x55, 0x00, 0x1A, 0xD5, 0x00, 0x12, 0x35, 0x80, 0x32, 0x24, 0x80, 0x22, 0x04, 0x00, 0x62, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x20, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x10, 0x41, 0x00, 0x10, 0x82, 0x00, 0x23, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC3, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x30, 0x86, 0x00, 0x19, 0x83, 0x00, 0x0B, 0x21, 0x80, 0x00, 0x64, 0x00, 0x60, 0xCE, 0x00, 0x31, 0xF3, 0x00, 0x10, 0x00, 0x00, 0x03, 0xEF, 0x00, 0x08, 0x63, 0x00, 0x08, 0xA5, 0x00, 0x19, 0x29, 0x00, 0x10, 0x63, 0x00, 0x30, 0xA5, 0x00, 0x21, 0x29, 0x00, 0x60, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC4, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x23, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x13, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC5, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x08, 0x12, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x12, 0x11, 0x00, 0x03, 0xF1, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0B, 0x6C, 0x00, 0x13, 0x5C, 0x00, 0x12, 0x48, 0x00, 0x12, 0x14, 0x80, 0x12, 0x22, 0x80, 0x24, 0x41, 0x80, 0x24, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EC7, { 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x31, 0xFC, 0x00, 0x19, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x62, 0xFE, 0x00, 0x32, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x02, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x1A, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x20, 0x44, 0x00, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x7D, 0x00, 0x19, 0x45, 0x00, 0x11, 0x45, 0x00, 0x31, 0x7D, 0x00, 0x21, 0x01, 0x00, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EC9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x00, 0x92, 0x00, 0x08, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x84, 0x80, 0x21, 0x07, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ECA, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x00, 0x00, 0x06, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x10, 0x42, 0x00, 0x02, 0x4A, 0x00, 0x09, 0x52, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0xE2, 0x00, 0x11, 0x52, 0x80, 0x33, 0x5A, 0x80, 0x26, 0x4D, 0x80, 0x60, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ECB, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x44, 0x00, 0x00, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x84, 0x00, 0x05, 0x29, 0x00, 0x0A, 0x31, 0x00, 0x09, 0x4A, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xFF, 0x80, 0x20, 0x20, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ECC, { 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x08, 0x90, 0x00, 0x01, 0x3F, 0x80, 0x01, 0x21, 0x00, 0x22, 0xD2, 0x00, 0x12, 0x8C, 0x00, 0x06, 0x96, 0x00, 0x0A, 0xE9, 0x80, 0x0A, 0x88, 0x00, 0x0A, 0xFF, 0x80, 0x0A, 0x88, 0x00, 0x12, 0x9C, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xC9, 0x00, 0x22, 0x88, 0x80, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ECD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x60, 0x40, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x30, 0x11, 0x00, 0x20, 0x7F, 0x80, 0x63, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ECE, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x14, 0x94, 0x80, 0x15, 0x15, 0x00, 0x24, 0x24, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x60, 0x80, 0x1F, 0x62, 0x00, 0x01, 0x54, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x31, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6ECF, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x30, 0x6C, 0x00, 0x19, 0xC7, 0x00, 0x08, 0x6C, 0x00, 0x00, 0x38, 0x00, 0x60, 0xEE, 0x00, 0x33, 0x83, 0x80, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x92, 0x00, 0x10, 0xD6, 0x00, 0x30, 0x54, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ED1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x3E, 0x00, 0x21, 0x22, 0x00, 0x17, 0xFF, 0x80, 0x04, 0x00, 0x80, 0x01, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x21, 0x02, 0x00, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ED3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ED4, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x08, 0xF2, 0x00, 0x00, 0x91, 0x00, 0x01, 0x08, 0x80, 0x22, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x09, 0xC7, 0x00, 0x09, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ED5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x54, 0x00, 0x24, 0x92, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x28, 0x00, 0x3C, 0x28, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0xD6, 0x00, 0x3D, 0x93, 0x00, 0x27, 0x55, 0x80, 0x24, 0x38, 0x00, 0x24, 0x54, 0x00, 0x24, 0xD6, 0x00, 0x65, 0x93, 0x00, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6ED7, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x12, 0x00, 0x19, 0xDF, 0x00, 0x0A, 0xA8, 0x00, 0x44, 0x44, 0x00, 0x20, 0x1E, 0x00, 0x27, 0xE0, 0x00, 0x08, 0x48, 0x00, 0x0B, 0xFC, 0x00, 0x10, 0x40, 0x00, 0x70, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EDA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x41, 0xA6, 0x00, 0x32, 0x22, 0x00, 0x10, 0x40, 0x00, 0x04, 0x88, 0x00, 0x09, 0xFC, 0x00, 0x10, 0x40, 0x00, 0x70, 0xA2, 0x00, 0x11, 0x94, 0x00, 0x12, 0x88, 0x00, 0x14, 0xA7, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EDD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x00, 0x44, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x20, 0x10, 0x80, 0x60, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EDE, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x30, 0x92, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x00, 0x92, 0x00, 0x60, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x11, 0x00, 0x21, 0x13, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EDF, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x10, 0x00, 0x11, 0x1E, 0x00, 0x17, 0xA4, 0x00, 0x41, 0x4A, 0x00, 0x21, 0x3F, 0x00, 0x27, 0xEA, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x77, 0xFE, 0x00, 0x11, 0x20, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x27, 0xFE, 0x00, 0x19, 0x08, 0x00, 0x09, 0xF8, 0x00, 0x41, 0x08, 0x00, 0x25, 0xF8, 0x00, 0x25, 0x0A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x17, 0xFE, 0x00, 0x74, 0x42, 0x00, 0x12, 0x94, 0x00, 0x11, 0x08, 0x00, 0x12, 0x94, 0x00, 0x14, 0x63, 0x00, 0x18, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE1, { 0x00, 0x00, 0x00, 0x20, 0x90, 0x00, 0x18, 0x92, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x90, 0x00, 0x40, 0x04, 0x00, 0x37, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x00, 0x92, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x92, 0x00, 0x74, 0x92, 0x00, 0x15, 0x6A, 0x00, 0x16, 0x06, 0x00, 0x14, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x14, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE2, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x8A, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x47, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x24, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x10, 0x28, 0x00, 0x71, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x10, 0x28, 0x00, 0x10, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE4, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x20, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFF, 0x00, 0x04, 0x41, 0x00, 0x44, 0x7A, 0x00, 0x2F, 0xC0, 0x00, 0x24, 0x44, 0x00, 0x0C, 0x3C, 0x00, 0x14, 0x00, 0x00, 0x64, 0xA0, 0x00, 0x25, 0x92, 0x00, 0x26, 0x95, 0x00, 0x28, 0x85, 0x00, 0x28, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE5, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x20, 0x90, 0x00, 0x1A, 0x92, 0x00, 0x0A, 0x9F, 0x00, 0x42, 0xA8, 0x00, 0x32, 0xC4, 0x00, 0x12, 0x84, 0x00, 0x00, 0x80, 0x00, 0x08, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x72, 0x94, 0x00, 0x12, 0x94, 0x00, 0x12, 0x94, 0x00, 0x12, 0x94, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x03, 0x18, 0x00, 0x45, 0x16, 0x00, 0x29, 0x12, 0x00, 0x21, 0x50, 0x00, 0x08, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x60, 0xE0, 0x00, 0x21, 0x50, 0x00, 0x22, 0x48, 0x00, 0x24, 0x47, 0x00, 0x28, 0x42, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x08, 0x32, 0x00, 0x41, 0xC0, 0x00, 0x29, 0x08, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x10, 0x00, 0x11, 0x10, 0x00, 0x71, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0x90, 0x00, 0x11, 0x0C, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EE9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x14, 0x00, 0x18, 0x10, 0x00, 0x0F, 0xBF, 0x00, 0x40, 0xA4, 0x00, 0x34, 0xE4, 0x00, 0x14, 0xBE, 0x00, 0x03, 0x24, 0x00, 0x09, 0x24, 0x00, 0x12, 0xBE, 0x00, 0x74, 0xA4, 0x00, 0x18, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x3F, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EEB, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x30, 0x90, 0x00, 0x19, 0xBF, 0x80, 0x09, 0x61, 0x00, 0x03, 0x13, 0x00, 0x62, 0x8E, 0x00, 0x36, 0xBB, 0x00, 0x1A, 0xE1, 0x80, 0x02, 0xBF, 0x00, 0x02, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x12, 0xA1, 0x00, 0x32, 0xBF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x62, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x12, 0x7E, 0x00, 0x02, 0x42, 0x00, 0x0A, 0x7E, 0x00, 0x0A, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x24, 0x80, 0x80, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x10, 0x92, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EEE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x70, 0x80, 0x18, 0x41, 0x80, 0x07, 0xFB, 0x00, 0x04, 0x8A, 0x00, 0x64, 0xF0, 0x80, 0x37, 0x81, 0x80, 0x14, 0x93, 0x00, 0x04, 0x76, 0x00, 0x14, 0x04, 0x80, 0x15, 0x21, 0x80, 0x15, 0x23, 0x00, 0x35, 0x26, 0x00, 0x25, 0x24, 0x80, 0x29, 0x31, 0x80, 0x62, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EEF, { 0x00, 0x00, 0x00, 0x10, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x03, 0xFF, 0x80, 0x00, 0xAA, 0x00, 0x20, 0xAA, 0x80, 0x11, 0x3B, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x11, 0x00, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EF2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x82, 0x00, 0x19, 0xFD, 0x00, 0x08, 0x82, 0x00, 0x01, 0x45, 0x00, 0x63, 0xAE, 0x80, 0x30, 0x38, 0x00, 0x10, 0xC6, 0x00, 0x03, 0x09, 0x80, 0x08, 0x30, 0x00, 0x09, 0xC4, 0x00, 0x18, 0x19, 0x00, 0x11, 0xE3, 0x00, 0x30, 0x0E, 0x00, 0x20, 0x38, 0x00, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EF4, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x20, 0x44, 0x00, 0x10, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x22, 0x00, 0x80, 0x22, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EF7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x32, 0x20, 0x80, 0x12, 0x92, 0x80, 0x02, 0x44, 0x80, 0x0B, 0x28, 0x80, 0x0A, 0x92, 0x80, 0x1A, 0x29, 0x80, 0x12, 0x44, 0x80, 0x32, 0x92, 0x80, 0x22, 0x08, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EF8, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x0B, 0xC8, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x20, 0x04, 0x00, 0x13, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x23, 0xC4, 0x00, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EF9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x1F, 0x00, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x10, 0x80, 0x61, 0x7E, 0x00, 0x31, 0x10, 0x80, 0x11, 0x0F, 0x80, 0x01, 0x01, 0x00, 0x09, 0x7E, 0x00, 0x09, 0x49, 0x00, 0x19, 0x2A, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x26, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EFB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x00, 0x38, 0x00, 0x60, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x02, 0x48, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x88, 0x00, 0x1A, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x08, 0x00, 0x24, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EFD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x02, 0x11, 0x00, 0x63, 0xFF, 0x80, 0x32, 0x11, 0x00, 0x12, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x60, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6EFE, { 0x00, 0x00, 0x00, 0x22, 0x10, 0x00, 0x12, 0x10, 0x00, 0x02, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x50, 0x00, 0x10, 0x91, 0x00, 0x31, 0x8A, 0x00, 0x12, 0x8C, 0x00, 0x14, 0x84, 0x00, 0x10, 0xF2, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6EFF, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0xDC, 0x80, 0x12, 0x54, 0x80, 0x12, 0x54, 0x80, 0x13, 0xBB, 0x80, 0x12, 0x10, 0x80, 0x22, 0x10, 0x80, 0x22, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F01, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x21, 0x08, 0x00, 0x13, 0xFF, 0x00, 0x05, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x12, 0x49, 0x00, 0x22, 0x24, 0x80, 0x24, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F02, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x44, 0x80, 0x22, 0x44, 0x80, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x11, 0x00, 0x22, 0x10, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F04, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x31, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x32, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x1A, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x21, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F06, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x38, 0x00, 0x20, 0x54, 0x00, 0x11, 0x92, 0x00, 0x06, 0x29, 0x80, 0x00, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x11, 0x80, 0x09, 0x92, 0x00, 0x10, 0x54, 0x00, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x21, 0x92, 0x00, 0x2E, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F08, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0xEF, 0x00, 0x19, 0x91, 0x00, 0x0B, 0x53, 0x00, 0x00, 0xAA, 0x00, 0x60, 0x44, 0x00, 0x30, 0x82, 0x00, 0x13, 0x7D, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x10, 0x92, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F09, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x0A, 0x48, 0x00, 0x02, 0x48, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x49, 0x00, 0x12, 0x49, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x12, 0x88, 0x00, 0x12, 0xEB, 0x00, 0x16, 0x8E, 0x00, 0x34, 0x88, 0x00, 0x2C, 0xE8, 0x80, 0x61, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F0A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x30, 0xE4, 0x00, 0x20, 0x3C, 0x00, 0x61, 0xE7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F0C, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x60, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x14, 0x80, 0x0A, 0x12, 0x80, 0x03, 0xFF, 0x80, 0x62, 0x10, 0x80, 0x32, 0xE8, 0x80, 0x12, 0xAA, 0x80, 0x02, 0xAA, 0x80, 0x0A, 0xEE, 0x80, 0x0A, 0x04, 0x80, 0x1A, 0xED, 0x80, 0x12, 0x1B, 0x80, 0x32, 0x72, 0x80, 0x22, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F0F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x23, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0xEB, 0x80, 0x12, 0x88, 0x80, 0x12, 0xEB, 0x80, 0x24, 0x88, 0x80, 0x24, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F11, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x80, 0x00, 0x0B, 0xDF, 0x80, 0x02, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x13, 0xCA, 0x00, 0x02, 0x4A, 0x00, 0x02, 0x7F, 0x80, 0x0B, 0xC2, 0x00, 0x0A, 0x02, 0x00, 0x0B, 0xC6, 0x00, 0x12, 0x06, 0x00, 0x13, 0xCA, 0x00, 0x12, 0x12, 0x00, 0x22, 0x22, 0x80, 0x22, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F13, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x60, 0x92, 0x00, 0x30, 0xAA, 0x00, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x21, 0x00, 0x11, 0x49, 0x00, 0x31, 0x75, 0x00, 0x21, 0x01, 0x00, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F14, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F15, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x48, 0x00, 0x23, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x21, 0xFE, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F16, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x31, 0xB4, 0x00, 0x18, 0xE4, 0x00, 0x0B, 0xB7, 0x80, 0x00, 0x0D, 0x00, 0x60, 0x49, 0x00, 0x33, 0xF5, 0x00, 0x10, 0x85, 0x00, 0x01, 0x05, 0x00, 0x0A, 0xF7, 0x00, 0x08, 0x22, 0x00, 0x18, 0x42, 0x00, 0x10, 0x77, 0x00, 0x33, 0xC5, 0x00, 0x20, 0x45, 0x00, 0x60, 0xCD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F18, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x31, 0x00, 0x00, 0x19, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x61, 0x25, 0x00, 0x31, 0x26, 0x00, 0x11, 0x3B, 0x00, 0x01, 0xE1, 0x80, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x19, 0x7F, 0x00, 0x13, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x02, 0x22, 0x00, 0x62, 0x22, 0x00, 0x32, 0x3E, 0x00, 0x12, 0x00, 0x00, 0x02, 0xF7, 0x80, 0x0A, 0x94, 0x80, 0x0A, 0x94, 0x80, 0x1A, 0x94, 0x80, 0x12, 0xF7, 0x80, 0x32, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F1B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x54, 0x00, 0x18, 0x92, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x28, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x44, 0x00, 0x11, 0x93, 0x00, 0x03, 0x65, 0x80, 0x08, 0x28, 0x00, 0x08, 0x12, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x11, 0x80, 0x30, 0x54, 0x00, 0x20, 0xD6, 0x00, 0x61, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F20, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F22, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x44, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x20, 0xC6, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F23, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0A, 0xFF, 0x80, 0x01, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0F, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x88, 0x00, 0x22, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F24, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x21, 0x08, 0x00, 0x17, 0xFE, 0x00, 0x09, 0x08, 0x00, 0x43, 0x9C, 0x00, 0x25, 0x6A, 0x00, 0x29, 0x09, 0x00, 0x09, 0x48, 0x00, 0x08, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x70, 0x88, 0x00, 0x11, 0x08, 0x00, 0x10, 0x90, 0x00, 0x10, 0x60, 0x00, 0x11, 0x98, 0x00, 0x16, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F26, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xE2, 0x00, 0x15, 0x14, 0x00, 0x24, 0x88, 0x00, 0x44, 0x16, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x46, 0x00, 0x2F, 0x4C, 0x00, 0x21, 0x70, 0x00, 0x42, 0x5C, 0x00, 0x1C, 0x47, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F29, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x31, 0x08, 0x00, 0x19, 0x1F, 0x80, 0x0F, 0xD0, 0x00, 0x02, 0x20, 0x00, 0x62, 0x1F, 0x80, 0x33, 0x84, 0x80, 0x12, 0x85, 0x00, 0x02, 0x94, 0x00, 0x0A, 0x94, 0x00, 0x0A, 0x97, 0x80, 0x1A, 0x94, 0x00, 0x12, 0x94, 0x00, 0x36, 0x9C, 0x00, 0x24, 0xB6, 0x00, 0x6D, 0xA3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F2A, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x24, 0x44, 0x00, 0x32, 0xBF, 0x80, 0x11, 0x04, 0x00, 0x01, 0x0A, 0x00, 0x42, 0x91, 0x00, 0x64, 0x80, 0x00, 0x20, 0xBF, 0x80, 0x01, 0x81, 0x00, 0x11, 0x9D, 0x00, 0x12, 0x95, 0x00, 0x14, 0x95, 0x00, 0x30, 0x9D, 0x00, 0x20, 0x81, 0x00, 0x21, 0x81, 0x00, 0x67, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F2B, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x44, 0x80, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x10, 0x38, 0x00, 0x20, 0xEC, 0x00, 0x27, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F2C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F2D, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x8A, 0x00, 0x08, 0x8B, 0x00, 0x00, 0x21, 0x00, 0x67, 0xFF, 0x80, 0x30, 0x48, 0x00, 0x11, 0xCE, 0x00, 0x07, 0x03, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x31, 0x84, 0x00, 0x23, 0x04, 0x00, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x10, 0x64, 0x00, 0x01, 0x88, 0x00, 0x08, 0x51, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x80, 0x10, 0x92, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F30, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x61, 0xEF, 0x00, 0x31, 0x29, 0x00, 0x11, 0xAD, 0x00, 0x01, 0x6B, 0x00, 0x09, 0x29, 0x00, 0x09, 0xAD, 0x00, 0x19, 0x6B, 0x00, 0x11, 0x29, 0x00, 0x31, 0x29, 0x00, 0x21, 0x69, 0x00, 0x62, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F31, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x8D, 0x00, 0x13, 0xF4, 0x00, 0x02, 0xA4, 0x00, 0x02, 0xA4, 0x00, 0x0B, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x09, 0xC4, 0x00, 0x12, 0xAA, 0x00, 0x12, 0x8A, 0x00, 0x14, 0x89, 0x00, 0x28, 0x91, 0x00, 0x20, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F32, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xBF, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xBE, 0x00, 0x20, 0xA0, 0x00, 0x17, 0xBE, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0xA8, 0x00, 0x08, 0xA9, 0x00, 0x10, 0xA6, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA2, 0x00, 0x21, 0x39, 0x00, 0x26, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F33, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x00, 0x44, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F36, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x60, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x20, 0x00, 0x12, 0xB3, 0x00, 0x32, 0x91, 0x80, 0x26, 0x84, 0x80, 0x64, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F38, { 0x00, 0x00, 0x00, 0x10, 0x83, 0x00, 0x08, 0x8C, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x88, 0x00, 0x23, 0xE8, 0x00, 0x12, 0xAF, 0x80, 0x02, 0xA9, 0x00, 0x03, 0xE9, 0x00, 0x0A, 0xA9, 0x00, 0x0A, 0xA9, 0x00, 0x0B, 0xE9, 0x00, 0x12, 0xA9, 0x00, 0x10, 0x89, 0x00, 0x17, 0xF1, 0x00, 0x20, 0x91, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xEF, 0x00, 0x18, 0x63, 0x00, 0x08, 0xA5, 0x00, 0x00, 0x63, 0x00, 0x60, 0xA5, 0x00, 0x30, 0x11, 0x00, 0x10, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x0B, 0x83, 0x80, 0x08, 0x10, 0x00, 0x18, 0xE4, 0x00, 0x10, 0x19, 0x00, 0x30, 0xE2, 0x00, 0x20, 0x0C, 0x00, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F3C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x60, 0x90, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x03, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x21, 0x10, 0x00, 0x21, 0x10, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F3E, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x00, 0x18, 0x00, 0x09, 0xF1, 0x00, 0x08, 0x13, 0x00, 0x1B, 0xDA, 0x00, 0x10, 0x54, 0x00, 0x30, 0x92, 0x00, 0x23, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F3F, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x32, 0x00, 0x1F, 0x4C, 0x00, 0x11, 0xA8, 0x00, 0x01, 0x12, 0x00, 0x01, 0x62, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x12, 0x00, 0x11, 0x4A, 0x00, 0x21, 0x4E, 0x80, 0x1F, 0x63, 0x00, 0x01, 0x54, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x31, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F41, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x27, 0x7F, 0x80, 0x38, 0x08, 0x00, 0x20, 0x10, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x7F, 0x00, 0x06, 0xA1, 0x00, 0x3F, 0x21, 0x00, 0x0E, 0x3F, 0x00, 0x0D, 0x21, 0x00, 0x15, 0x21, 0x00, 0x14, 0xBF, 0x00, 0x14, 0xA1, 0x00, 0x24, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F45, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x60, 0x44, 0x00, 0x30, 0x88, 0x00, 0x11, 0xFF, 0x00, 0x03, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x19, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x10, 0x00, 0x21, 0x10, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F46, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x8A, 0x00, 0x17, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x43, 0xFF, 0x00, 0x22, 0x41, 0x00, 0x24, 0x8A, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x40, 0x00, 0x10, 0x84, 0x00, 0x73, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x11, 0x28, 0x00, 0x12, 0x26, 0x00, 0x14, 0xA2, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F47, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x27, 0xFF, 0x00, 0x18, 0x88, 0x00, 0x08, 0x20, 0x00, 0x43, 0xFE, 0x00, 0x20, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x72, 0x22, 0x00, 0x12, 0xB2, 0x00, 0x12, 0xAA, 0x00, 0x13, 0x2A, 0x00, 0x14, 0x22, 0x00, 0x18, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F4B, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x21, 0x08, 0x00, 0x1A, 0x88, 0x00, 0x0A, 0x52, 0x00, 0x44, 0x3F, 0x00, 0x2B, 0xD2, 0x00, 0x20, 0x12, 0x00, 0x0D, 0x52, 0x00, 0x0D, 0x54, 0x00, 0x15, 0x54, 0x00, 0x75, 0x48, 0x00, 0x10, 0x88, 0x00, 0x11, 0xD4, 0x00, 0x1E, 0x14, 0x00, 0x14, 0x22, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F4D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x22, 0x28, 0x00, 0x12, 0x22, 0x00, 0x12, 0x7F, 0x00, 0x44, 0x48, 0x00, 0x2F, 0xC8, 0x00, 0x21, 0x7E, 0x00, 0x02, 0x48, 0x00, 0x14, 0x48, 0x00, 0x2F, 0xFE, 0x00, 0x60, 0x48, 0x00, 0x20, 0x48, 0x00, 0x21, 0xCA, 0x00, 0x2E, 0x7F, 0x00, 0x24, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x18, 0x44, 0x00, 0x08, 0x28, 0x00, 0x03, 0xFF, 0x00, 0x60, 0x52, 0x00, 0x30, 0x94, 0x00, 0x11, 0x30, 0x00, 0x03, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x89, 0x00, 0x1B, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x22, 0x79, 0x00, 0x62, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F51, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFA, 0x00, 0x00, 0xAC, 0x80, 0x00, 0x45, 0x00, 0x21, 0x82, 0x00, 0x16, 0x01, 0x80, 0x03, 0xDE, 0x00, 0x08, 0x52, 0x80, 0x0B, 0xD3, 0x80, 0x0A, 0x20, 0x00, 0x0A, 0x7F, 0x00, 0x13, 0xD1, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4C, 0x00, 0x20, 0x9A, 0x00, 0x23, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F52, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0xFE, 0x00, 0x19, 0x84, 0x00, 0x09, 0x08, 0x00, 0x03, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x31, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x08, 0x61, 0x00, 0x09, 0x93, 0x00, 0x18, 0x6A, 0x00, 0x11, 0x9C, 0x00, 0x30, 0x6A, 0x00, 0x23, 0x89, 0x80, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F53, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x11, 0x80, 0x19, 0x58, 0x00, 0x11, 0x4D, 0x00, 0x33, 0x41, 0x80, 0x26, 0x62, 0x80, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F54, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x8F, 0x80, 0x07, 0xF4, 0x80, 0x00, 0x84, 0x80, 0x27, 0xF8, 0x80, 0x10, 0x89, 0x00, 0x07, 0xF6, 0x00, 0x00, 0x20, 0x00, 0x09, 0x44, 0x00, 0x08, 0x88, 0x00, 0x08, 0x51, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x80, 0x11, 0x24, 0x00, 0x22, 0x22, 0x00, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F57, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x08, 0x90, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x23, 0xFF, 0x00, 0x15, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x08, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x21, 0x92, 0x00, 0x26, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F58, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x09, 0xF1, 0x00, 0x00, 0x92, 0x00, 0x00, 0x54, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x38, 0x00, 0x10, 0x54, 0x00, 0x00, 0x92, 0x00, 0x07, 0x11, 0x80, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F59, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x30, 0xFA, 0x00, 0x18, 0xA3, 0x00, 0x09, 0x11, 0x00, 0x01, 0xFE, 0x00, 0x61, 0x02, 0x00, 0x31, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x80, 0x1B, 0x00, 0x80, 0x12, 0x0A, 0x80, 0x36, 0xAA, 0x80, 0x21, 0xA1, 0x80, 0x61, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F5A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x11, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x02, 0x54, 0x80, 0x0A, 0x54, 0x80, 0x0B, 0xD7, 0x80, 0x0A, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x13, 0xD7, 0x80, 0x22, 0x54, 0x80, 0x24, 0x54, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F5B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x01, 0x4A, 0x00, 0x01, 0x4A, 0x00, 0x21, 0x4A, 0x00, 0x17, 0xFF, 0x80, 0x01, 0x4A, 0x00, 0x01, 0x6A, 0x80, 0x0A, 0xD3, 0x80, 0x0C, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F5C, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0x82, 0x00, 0x1B, 0xEF, 0x80, 0x08, 0x82, 0x00, 0x03, 0xEF, 0x80, 0x60, 0x82, 0x00, 0x31, 0x45, 0x00, 0x12, 0x28, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F5D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0xEE, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x7C, 0x00, 0x60, 0x00, 0x00, 0x30, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x18, 0xA2, 0x80, 0x13, 0x2C, 0x80, 0x30, 0xE3, 0x80, 0x23, 0x2C, 0x80, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F5E, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x09, 0xE4, 0x00, 0x01, 0x27, 0x80, 0x01, 0x29, 0x00, 0x21, 0x29, 0x00, 0x11, 0x36, 0x00, 0x01, 0xE2, 0x00, 0x08, 0x45, 0x00, 0x08, 0x48, 0x80, 0x09, 0x70, 0x00, 0x11, 0x4F, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x79, 0x00, 0x23, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F5F, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x09, 0x8F, 0x00, 0x01, 0x01, 0x00, 0x01, 0xEF, 0x00, 0x21, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x41, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x04, 0x80, 0x14, 0x12, 0x80, 0x10, 0x48, 0x80, 0x11, 0x29, 0x00, 0x21, 0x21, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F61, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x30, 0x84, 0x00, 0x1F, 0xF4, 0x00, 0x08, 0x0F, 0x80, 0x03, 0xE9, 0x00, 0x62, 0x39, 0x00, 0x33, 0xEB, 0x00, 0x10, 0x0A, 0x00, 0x03, 0xEA, 0x00, 0x08, 0x4E, 0x00, 0x08, 0x84, 0x00, 0x18, 0xE4, 0x00, 0x13, 0x8E, 0x00, 0x30, 0x8A, 0x00, 0x20, 0x9B, 0x00, 0x63, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F62, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x20, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F64, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x02, 0x28, 0x80, 0x03, 0xEF, 0x80, 0x22, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x02, 0x00, 0x80, 0x02, 0xFE, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0xFE, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x22, 0x00, 0x80, 0x22, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F66, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x01, 0x45, 0x00, 0x60, 0x82, 0x00, 0x31, 0xFF, 0x00, 0x12, 0x82, 0x80, 0x00, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x10, 0x92, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F68, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x67, 0xFF, 0x80, 0x30, 0x18, 0x00, 0x11, 0xF1, 0x00, 0x00, 0xAB, 0x00, 0x09, 0xAA, 0x00, 0x0B, 0x2C, 0x00, 0x18, 0x64, 0x00, 0x10, 0xE6, 0x00, 0x31, 0xA3, 0x00, 0x27, 0x21, 0x80, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F6C, { 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x31, 0x29, 0x00, 0x19, 0xEF, 0x00, 0x08, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x92, 0x00, 0x30, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F6D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x29, 0x00, 0x11, 0xCF, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F6E, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x87, 0x80, 0x07, 0xF4, 0x80, 0x00, 0x84, 0x80, 0x23, 0xE4, 0x80, 0x12, 0x27, 0x80, 0x03, 0xE4, 0x80, 0x02, 0x24, 0x80, 0x0B, 0xE4, 0x80, 0x0A, 0xA7, 0x80, 0x08, 0x84, 0x80, 0x10, 0x84, 0x80, 0x17, 0xF4, 0x80, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x20, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F6F, { 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x30, 0x02, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x60, 0x00, 0x00, 0x33, 0xEF, 0x00, 0x10, 0x89, 0x00, 0x00, 0xE9, 0x00, 0x0B, 0x8F, 0x00, 0x08, 0x02, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x30, 0xC2, 0x00, 0x20, 0x42, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F70, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F72, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x64, 0x00, 0x0B, 0x95, 0x00, 0x04, 0x8E, 0x00, 0x20, 0x84, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x05, 0x91, 0x00, 0x05, 0xDF, 0x00, 0x0A, 0xB1, 0x00, 0x3A, 0x91, 0x00, 0x0C, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x95, 0x00, 0x08, 0x92, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F74, { 0x00, 0x00, 0x00, 0x24, 0x48, 0x80, 0x36, 0x48, 0x80, 0x12, 0xBF, 0x80, 0x03, 0x89, 0x00, 0x41, 0x0B, 0x00, 0x63, 0x0A, 0x00, 0x25, 0x7F, 0x80, 0x09, 0x06, 0x00, 0x01, 0x0A, 0x00, 0x13, 0x1F, 0x00, 0x15, 0x31, 0x00, 0x19, 0xD1, 0x00, 0x31, 0x1F, 0x00, 0x21, 0x11, 0x00, 0x23, 0x11, 0x00, 0x66, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F78, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0x82, 0x00, 0x1B, 0xEF, 0x80, 0x08, 0x82, 0x00, 0x02, 0xAA, 0x80, 0x62, 0xAA, 0x80, 0x30, 0x82, 0x00, 0x10, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x21, 0x82, 0x00, 0x63, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F7A, { 0x00, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x22, 0x3E, 0x00, 0x12, 0x04, 0x00, 0x02, 0x0F, 0x80, 0x03, 0xF8, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x18, 0x00, 0x0B, 0xEF, 0x80, 0x12, 0x41, 0x00, 0x12, 0x73, 0x80, 0x13, 0xCE, 0x00, 0x24, 0x42, 0x00, 0x24, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F7C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x20, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F7D, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x03, 0xFF, 0x00, 0x20, 0x48, 0x00, 0x12, 0x49, 0x00, 0x01, 0x4A, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x21, 0x02, 0x00, 0x21, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F7E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x92, 0x00, 0x00, 0x54, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x38, 0x00, 0x10, 0x54, 0x00, 0x00, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x84, 0x00, 0x09, 0xFF, 0x00, 0x13, 0x34, 0x00, 0x14, 0xD4, 0x00, 0x10, 0xBF, 0x80, 0x11, 0x04, 0x00, 0x22, 0x04, 0x00, 0x24, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xDF, 0x00, 0x19, 0x45, 0x00, 0x09, 0x45, 0x00, 0x05, 0x55, 0x00, 0x65, 0x55, 0x00, 0x32, 0x49, 0x00, 0x14, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xEB, 0x80, 0x1A, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x32, 0xEA, 0x00, 0x23, 0x9F, 0x80, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F81, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x90, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x20, 0x90, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x8A, 0x00, 0x0A, 0xEB, 0x80, 0x12, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x12, 0xFA, 0x00, 0x27, 0x8F, 0x80, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F82, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x32, 0xA4, 0x00, 0x1A, 0xA4, 0x00, 0x0A, 0xAF, 0x80, 0x03, 0xE9, 0x00, 0x60, 0x19, 0x00, 0x33, 0xE5, 0x00, 0x10, 0x05, 0x00, 0x03, 0xE5, 0x00, 0x08, 0x87, 0x00, 0x08, 0x82, 0x00, 0x1B, 0xE2, 0x00, 0x10, 0x87, 0x00, 0x30, 0xE5, 0x00, 0x23, 0x8D, 0x80, 0x60, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F83, { 0x00, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x70, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x70, 0x81, 0x00, 0x04, 0xFF, 0x00, 0x0C, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x70, 0x24, 0x00, 0x01, 0xC3, 0x80, 0x3E, 0x82, 0x00, 0x02, 0xC4, 0x00, 0x0C, 0xB8, 0x00, 0x78, 0x87, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F84, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xF9, 0x00, 0x00, 0x1A, 0x00, 0x01, 0x24, 0x80, 0x20, 0xC3, 0x00, 0x11, 0x81, 0x00, 0x06, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F86, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x60, 0x82, 0x00, 0x33, 0xEF, 0x80, 0x10, 0x82, 0x00, 0x00, 0xE2, 0x00, 0x0B, 0x8F, 0x80, 0x08, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x30, 0x44, 0x80, 0x20, 0xC4, 0x80, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F87, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x32, 0xAA, 0x80, 0x1A, 0xAA, 0x80, 0x08, 0x82, 0x00, 0x01, 0x45, 0x00, 0x62, 0x28, 0x80, 0x30, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x0A, 0x20, 0x80, 0x09, 0xFF, 0x00, 0x18, 0x21, 0x00, 0x10, 0x61, 0x00, 0x30, 0x43, 0x00, 0x20, 0xC2, 0x00, 0x63, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F88, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x07, 0xF4, 0x00, 0x00, 0x8F, 0x80, 0x21, 0x29, 0x00, 0x17, 0xF1, 0x00, 0x00, 0x11, 0x00, 0x03, 0xFA, 0x00, 0x0A, 0x2A, 0x00, 0x0B, 0xEA, 0x00, 0x0A, 0x26, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x26, 0x00, 0x12, 0x2A, 0x00, 0x22, 0x29, 0x00, 0x22, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F89, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x23, 0xC8, 0x00, 0x18, 0x48, 0x00, 0x08, 0x92, 0x00, 0x47, 0xFF, 0x00, 0x22, 0x52, 0x00, 0x26, 0x52, 0x00, 0x0B, 0xD2, 0x00, 0x0A, 0x54, 0x00, 0x12, 0x54, 0x00, 0x73, 0xC8, 0x00, 0x12, 0x48, 0x00, 0x12, 0x54, 0x00, 0x1F, 0xD4, 0x00, 0x10, 0x62, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x61, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x10, 0x94, 0x00, 0x31, 0x96, 0x00, 0x23, 0x13, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F8C, { 0x00, 0x00, 0x00, 0x02, 0x41, 0x80, 0x32, 0x4F, 0x00, 0x1F, 0xE8, 0x00, 0x0A, 0x48, 0x00, 0x02, 0x48, 0x00, 0x63, 0xCF, 0x80, 0x32, 0x49, 0x00, 0x12, 0x49, 0x00, 0x03, 0xC9, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1F, 0xE9, 0x00, 0x12, 0x89, 0x00, 0x32, 0xC9, 0x00, 0x26, 0x51, 0x00, 0x6C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F8D, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0x82, 0x00, 0x03, 0xE2, 0x00, 0x00, 0x82, 0x00, 0x07, 0xF2, 0x00, 0x20, 0x1F, 0x80, 0x13, 0xE2, 0x00, 0x02, 0x22, 0x00, 0x0A, 0x2A, 0x00, 0x0B, 0xE6, 0x00, 0x08, 0x02, 0x00, 0x12, 0x42, 0x00, 0x11, 0x42, 0x00, 0x11, 0x7A, 0x00, 0x27, 0x82, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F8E, { 0x00, 0x00, 0x00, 0x10, 0x81, 0x00, 0x08, 0x81, 0x00, 0x03, 0xE2, 0x00, 0x00, 0x82, 0x00, 0x27, 0xF4, 0x00, 0x10, 0x09, 0x00, 0x03, 0xE1, 0x00, 0x02, 0x22, 0x00, 0x0B, 0xE2, 0x00, 0x0A, 0x24, 0x80, 0x08, 0x08, 0x80, 0x12, 0x21, 0x00, 0x11, 0x42, 0x00, 0x11, 0xF4, 0x00, 0x27, 0x08, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F90, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x10, 0x80, 0x11, 0xD7, 0x00, 0x00, 0x10, 0x00, 0x01, 0xD7, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x10, 0x82, 0x00, 0x21, 0x3F, 0x00, 0x27, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x28, 0x00, 0x09, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x61, 0x29, 0x00, 0x31, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x00, 0x28, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x21, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x7F, 0x80, 0x37, 0x88, 0x00, 0x12, 0x3F, 0x00, 0x02, 0x21, 0x00, 0x42, 0x21, 0x00, 0x62, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x02, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x13, 0xA1, 0x00, 0x16, 0x21, 0x00, 0x30, 0x3F, 0x00, 0x20, 0x12, 0x00, 0x20, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F93, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x21, 0x90, 0x00, 0x33, 0x3F, 0x80, 0x16, 0x60, 0x00, 0x00, 0x1F, 0x00, 0x40, 0x91, 0x00, 0x61, 0x9F, 0x00, 0x23, 0x11, 0x00, 0x07, 0x1F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x31, 0x00, 0x31, 0x6B, 0x00, 0x21, 0x0E, 0x00, 0x21, 0x1B, 0x00, 0x61, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F94, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x94, 0x00, 0x01, 0x14, 0x00, 0x03, 0xDF, 0x00, 0x02, 0x64, 0x00, 0x22, 0x44, 0x00, 0x12, 0x7F, 0x80, 0x02, 0x44, 0x00, 0x0B, 0xC4, 0x00, 0x0A, 0x5F, 0x00, 0x0A, 0x51, 0x00, 0x12, 0x51, 0x00, 0x12, 0x51, 0x00, 0x13, 0xDF, 0x00, 0x22, 0x51, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xEF, 0x80, 0x1A, 0x28, 0x80, 0x0B, 0xEF, 0x80, 0x02, 0x28, 0x80, 0x63, 0xEF, 0x80, 0x32, 0x00, 0x80, 0x12, 0x10, 0x80, 0x02, 0xFE, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x38, 0x80, 0x1A, 0x38, 0x80, 0x12, 0x54, 0x80, 0x32, 0x92, 0x80, 0x22, 0x10, 0x80, 0x62, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x01, 0xE7, 0x80, 0x21, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x09, 0x3C, 0x80, 0x09, 0x24, 0x80, 0x09, 0x3C, 0x80, 0x11, 0x24, 0x80, 0x11, 0x3C, 0x80, 0x11, 0x00, 0x80, 0x21, 0x00, 0x80, 0x21, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6F9A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x20, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x09, 0x00, 0x01, 0x71, 0x00, 0x61, 0x55, 0x00, 0x31, 0x11, 0x00, 0x11, 0x7D, 0x00, 0x01, 0x39, 0x00, 0x09, 0x55, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x30, 0x01, 0x00, 0x20, 0x03, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F9C, { 0x00, 0x00, 0x00, 0x21, 0x02, 0x00, 0x18, 0xBF, 0x00, 0x0A, 0x82, 0x00, 0x02, 0x2A, 0x00, 0x43, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x12, 0xFA, 0x00, 0x06, 0xAA, 0x00, 0x0A, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x72, 0xFA, 0x00, 0x12, 0x72, 0x00, 0x12, 0xAA, 0x00, 0x13, 0x26, 0x00, 0x12, 0x22, 0x00, 0x12, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6F9F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x60, 0xBA, 0x00, 0x30, 0xAA, 0x00, 0x10, 0xBA, 0x00, 0x00, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x01, 0x00, 0x19, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x20, 0x54, 0x00, 0x63, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x03, 0xCF, 0x00, 0x60, 0x48, 0x00, 0x30, 0x48, 0x00, 0x13, 0xCF, 0x00, 0x02, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xCF, 0x00, 0x1A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x33, 0xCF, 0x00, 0x20, 0x60, 0x80, 0x60, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FA1, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x30, 0x44, 0x00, 0x18, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x61, 0xEF, 0x00, 0x31, 0x29, 0x00, 0x11, 0x29, 0x00, 0x01, 0xEF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FA3, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x07, 0xFA, 0x00, 0x20, 0x89, 0x00, 0x13, 0xF0, 0x80, 0x02, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x0A, 0x24, 0x00, 0x0B, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FA4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x44, 0x80, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FA5, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x31, 0xFF, 0x80, 0x1B, 0x24, 0x80, 0x0E, 0x44, 0x80, 0x03, 0xEC, 0x80, 0x62, 0xBB, 0x80, 0x32, 0xA0, 0x00, 0x13, 0xE2, 0x00, 0x02, 0xAA, 0x00, 0x0A, 0xAF, 0x80, 0x0B, 0xF2, 0x00, 0x1A, 0x22, 0x00, 0x12, 0x3F, 0x80, 0x32, 0x22, 0x00, 0x22, 0x22, 0x00, 0x64, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xBF, 0x80, 0x30, 0x84, 0x00, 0x15, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x42, 0x11, 0x00, 0x6F, 0xDF, 0x00, 0x22, 0x51, 0x00, 0x02, 0x91, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x32, 0x1F, 0x00, 0x22, 0x0A, 0x00, 0x22, 0x1B, 0x00, 0x66, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FA7, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x08, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xA5, 0x00, 0x20, 0xFF, 0x00, 0x10, 0xA5, 0x00, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x20, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FA8, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x30, 0x84, 0x00, 0x19, 0xEF, 0x80, 0x09, 0x4A, 0x00, 0x02, 0x52, 0x00, 0x60, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x00, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xD7, 0x00, 0x19, 0x55, 0x00, 0x12, 0x38, 0x80, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x62, 0xD6, 0x80, 0x32, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x00, 0x38, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x39, 0x80, 0x18, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x30, 0x11, 0x00, 0x20, 0x13, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FAE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x23, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x92, 0x80, 0x0A, 0x54, 0x80, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FAF, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0xFF, 0x80, 0x01, 0x99, 0x00, 0x22, 0x6A, 0x00, 0x15, 0x44, 0x00, 0x00, 0x8A, 0x00, 0x01, 0x31, 0x80, 0x0A, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x21, 0x92, 0x00, 0x26, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FB0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x60, 0x7C, 0x00, 0x30, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x18, 0x00, 0x00, 0x10, 0x82, 0x00, 0x30, 0x82, 0x00, 0x21, 0xC7, 0x00, 0x63, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FB1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xEE, 0x00, 0x02, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x13, 0xEA, 0x80, 0x02, 0x0B, 0x80, 0x02, 0xB0, 0x00, 0x02, 0xA0, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0xA9, 0x00, 0x0A, 0xA9, 0x00, 0x13, 0xF6, 0x00, 0x12, 0x04, 0x00, 0x12, 0xA6, 0x00, 0x22, 0xA9, 0x00, 0x25, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FB3, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x1D, 0x00, 0x01, 0x71, 0x00, 0x21, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x39, 0x00, 0x09, 0x55, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FB5, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x80, 0x20, 0x8F, 0x00, 0x37, 0xF8, 0x00, 0x12, 0x28, 0x00, 0x03, 0x68, 0x00, 0x41, 0x4F, 0x80, 0x67, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x00, 0x89, 0x00, 0x17, 0xF9, 0x00, 0x10, 0x89, 0x00, 0x11, 0xC9, 0x00, 0x32, 0xA9, 0x00, 0x24, 0x89, 0x00, 0x20, 0x91, 0x00, 0x60, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FB6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x61, 0x7D, 0x00, 0x31, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FB9, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x84, 0x00, 0x01, 0xFF, 0x80, 0x23, 0x28, 0x80, 0x11, 0xC7, 0x80, 0x01, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FBC, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x33, 0xC4, 0x00, 0x1A, 0x5F, 0x00, 0x0A, 0x40, 0x00, 0x02, 0x51, 0x00, 0x62, 0x5B, 0x00, 0x33, 0xCA, 0x00, 0x12, 0x3F, 0x80, 0x02, 0x04, 0x00, 0x13, 0xC4, 0x00, 0x16, 0x5F, 0x00, 0x16, 0x44, 0x00, 0x3A, 0x44, 0x00, 0x22, 0x44, 0x00, 0x23, 0xC4, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FBE, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x0B, 0x84, 0x00, 0x00, 0xBF, 0x00, 0x00, 0x84, 0x00, 0x21, 0x7F, 0x80, 0x12, 0x11, 0x00, 0x03, 0x8A, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0A, 0xBF, 0x80, 0x12, 0x84, 0x00, 0x11, 0xBF, 0x80, 0x10, 0x84, 0x00, 0x10, 0xC4, 0x00, 0x21, 0x3F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FC0, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x0B, 0xE2, 0x00, 0x02, 0x22, 0x00, 0x03, 0xE4, 0x00, 0x22, 0x27, 0x80, 0x13, 0xE5, 0x00, 0x05, 0x09, 0x00, 0x05, 0x09, 0x00, 0x0F, 0xFD, 0x00, 0x09, 0x16, 0x00, 0x09, 0xE2, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x12, 0x25, 0x00, 0x22, 0x25, 0x00, 0x24, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FC1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x44, 0x80, 0x03, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x12, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x20, 0x80, 0x0B, 0xFE, 0x80, 0x0A, 0x22, 0x80, 0x0B, 0xFE, 0x80, 0x10, 0x22, 0x80, 0x10, 0x7F, 0x80, 0x17, 0xC1, 0x80, 0x20, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FC2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x37, 0x00, 0x02, 0xEC, 0x00, 0x22, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x24, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x25, 0x00, 0x0B, 0xFF, 0x80, 0x12, 0x25, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x66, 0x00, 0x12, 0xA5, 0x00, 0x25, 0x25, 0x00, 0x26, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FC3, { 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x29, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x29, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x91, 0x00, 0x12, 0x8A, 0x00, 0x24, 0xF6, 0x00, 0x25, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FC5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x0A, 0xFE, 0x80, 0x00, 0x02, 0x00, 0x61, 0xFF, 0x80, 0x30, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x0A, 0xFE, 0x80, 0x08, 0x92, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x83, 0x00, 0x20, 0x7C, 0x00, 0x67, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FC6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x08, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x60, 0x82, 0x00, 0x30, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FC7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x08, 0x92, 0x00, 0x00, 0x92, 0x00, 0x61, 0x55, 0x00, 0x30, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x31, 0x7D, 0x00, 0x21, 0x01, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FC8, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x27, 0x8B, 0x00, 0x34, 0x89, 0x00, 0x14, 0x88, 0x00, 0x07, 0x8F, 0x80, 0x40, 0x38, 0x00, 0x6F, 0xC9, 0x00, 0x24, 0x89, 0x00, 0x07, 0x8B, 0x00, 0x14, 0x8A, 0x00, 0x17, 0x8E, 0x00, 0x14, 0xC4, 0x00, 0x37, 0x8E, 0x00, 0x2C, 0x8A, 0x80, 0x20, 0x9B, 0x80, 0x60, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FC9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x18, 0x00, 0x17, 0xA4, 0x00, 0x14, 0xBF, 0x00, 0x44, 0xE4, 0x00, 0x24, 0xA4, 0x00, 0x2F, 0xBF, 0x00, 0x0C, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x17, 0xBF, 0x00, 0x74, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x17, 0xBF, 0x00, 0x14, 0xA0, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FCA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x0A, 0x00, 0x10, 0x09, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x09, 0x00, 0x0B, 0xF9, 0x00, 0x0A, 0x4A, 0x00, 0x0A, 0xEA, 0x00, 0x13, 0x54, 0x00, 0x12, 0x44, 0x00, 0x12, 0xCA, 0x80, 0x22, 0x11, 0x80, 0x24, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FD1, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x22, 0x10, 0x00, 0x1F, 0xBE, 0x00, 0x12, 0x44, 0x00, 0x42, 0x08, 0x00, 0x2F, 0xBE, 0x00, 0x0A, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x2F, 0xAA, 0x00, 0x22, 0x2A, 0x00, 0x66, 0x2A, 0x00, 0x27, 0x2A, 0x00, 0x2A, 0xAA, 0x00, 0x32, 0x14, 0x00, 0x22, 0x23, 0x00, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FD2, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x21, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x15, 0xD2, 0x00, 0x05, 0x3F, 0x00, 0x45, 0x22, 0x00, 0x2F, 0xEA, 0x00, 0x01, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x6A, 0x00, 0x69, 0xAA, 0x00, 0x21, 0x2A, 0x00, 0x22, 0x08, 0x00, 0x24, 0x14, 0x00, 0x28, 0x23, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x92, 0x00, 0x09, 0x11, 0x00, 0x03, 0xFF, 0x80, 0x61, 0x11, 0x00, 0x31, 0xBB, 0x00, 0x11, 0x55, 0x00, 0x01, 0xBB, 0x00, 0x09, 0x11, 0x00, 0x09, 0xBB, 0x00, 0x19, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x31, 0x11, 0x00, 0x21, 0x11, 0x00, 0x61, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FD5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x48, 0x00, 0x02, 0xB2, 0x00, 0x09, 0x4C, 0x00, 0x08, 0x89, 0x00, 0x09, 0x77, 0x80, 0x13, 0x98, 0x00, 0x10, 0x00, 0x00, 0x12, 0x24, 0x80, 0x22, 0x24, 0x80, 0x24, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FD8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x0A, 0x20, 0x80, 0x02, 0x50, 0x80, 0x61, 0x45, 0x00, 0x32, 0x7C, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x20, 0x10, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FDA, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x09, 0x54, 0x80, 0x01, 0x75, 0x00, 0x00, 0x4A, 0x00, 0x20, 0xA9, 0x00, 0x11, 0x10, 0x80, 0x03, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x30, 0x00, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x10, 0x92, 0x00, 0x21, 0x11, 0x00, 0x26, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FDB, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x62, 0xFD, 0x00, 0x30, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x08, 0xA3, 0x00, 0x0B, 0x36, 0x00, 0x18, 0xD8, 0x00, 0x13, 0x34, 0x00, 0x30, 0xD3, 0x00, 0x27, 0x11, 0x80, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FDE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x60, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x33, 0xFF, 0x80, 0x20, 0x82, 0x00, 0x61, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FDF, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x27, 0xA3, 0x00, 0x12, 0xAC, 0x00, 0x02, 0xAA, 0x00, 0x04, 0xA9, 0x80, 0x09, 0xBE, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x28, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FE0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x09, 0xFF, 0x00, 0x08, 0x51, 0x00, 0x08, 0xAA, 0x00, 0x11, 0x4C, 0x00, 0x16, 0x9C, 0x00, 0x11, 0x2A, 0x00, 0x26, 0xC9, 0x00, 0x23, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FE1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x10, 0x80, 0x11, 0xD7, 0x00, 0x00, 0x10, 0x00, 0x01, 0xD7, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x21, 0x29, 0x00, 0x21, 0x2B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FE4, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x11, 0xDF, 0x80, 0x21, 0xD2, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FE8, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x82, 0x00, 0x08, 0x00, 0x00, 0x00, 0x82, 0x00, 0x61, 0x04, 0x00, 0x32, 0x49, 0x00, 0x11, 0x86, 0x00, 0x01, 0x45, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0x20, 0x80, 0x18, 0x10, 0x00, 0x11, 0x59, 0x00, 0x31, 0x49, 0x80, 0x23, 0x62, 0x80, 0x62, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FE9, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x4C, 0x00, 0x00, 0x90, 0x00, 0x21, 0xFF, 0x00, 0x13, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x86, 0x00, 0x20, 0x78, 0x00, 0x27, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FEB, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xF2, 0x00, 0x02, 0x44, 0x00, 0x03, 0xF7, 0x80, 0x22, 0x18, 0x00, 0x13, 0xF0, 0x00, 0x02, 0x40, 0x00, 0x0B, 0xF7, 0x80, 0x0A, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FEC, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x7C, 0x80, 0x10, 0x84, 0x00, 0x01, 0x32, 0x00, 0x02, 0x49, 0x00, 0x08, 0x86, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FEE, { 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x31, 0x54, 0x80, 0x19, 0x55, 0x00, 0x0B, 0x14, 0x00, 0x02, 0xFF, 0x80, 0x62, 0x22, 0x00, 0x36, 0x14, 0x00, 0x12, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x14, 0x00, 0x22, 0x36, 0x00, 0x22, 0x63, 0x00, 0x62, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FEF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0xA5, 0x00, 0x01, 0x6B, 0x00, 0x22, 0xB5, 0x00, 0x11, 0x39, 0x00, 0x00, 0x68, 0x00, 0x00, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FF0, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x21, 0x89, 0x00, 0x31, 0x1B, 0x00, 0x16, 0x12, 0x00, 0x02, 0xBF, 0x80, 0x41, 0x92, 0x00, 0x61, 0x12, 0x00, 0x22, 0x5F, 0x80, 0x07, 0xD2, 0x00, 0x11, 0x52, 0x00, 0x11, 0x12, 0x00, 0x15, 0x5F, 0x80, 0x35, 0x52, 0x00, 0x25, 0x52, 0x00, 0x21, 0x12, 0x00, 0x61, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FF1, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x21, 0xFF, 0x00, 0x10, 0x51, 0x00, 0x00, 0x96, 0x00, 0x01, 0x18, 0x00, 0x08, 0xFF, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x21, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FF3, { 0x00, 0x00, 0x00, 0x25, 0x14, 0x00, 0x37, 0xDF, 0x00, 0x15, 0x14, 0x00, 0x01, 0x04, 0x00, 0x0F, 0xDF, 0x80, 0x42, 0x8A, 0x00, 0x62, 0xCA, 0x80, 0x24, 0x93, 0x80, 0x00, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x33, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x63, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FF5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x00, 0x80, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x31, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x01, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x1B, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x20, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FF6, { 0x00, 0x00, 0x00, 0x27, 0xDF, 0x00, 0x34, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x04, 0x51, 0x00, 0x47, 0xDF, 0x00, 0x64, 0x01, 0x00, 0x24, 0x19, 0x00, 0x04, 0xF1, 0x00, 0x04, 0x21, 0x00, 0x15, 0xFD, 0x00, 0x14, 0x21, 0x00, 0x14, 0xF9, 0x00, 0x34, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0xF9, 0x00, 0x64, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0xAA, 0x00, 0x1B, 0x11, 0x80, 0x10, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FFA, { 0x00, 0x00, 0x00, 0x20, 0x0A, 0x00, 0x37, 0x89, 0x00, 0x14, 0x8F, 0x80, 0x04, 0xB8, 0x00, 0x07, 0x8A, 0x00, 0x44, 0x84, 0x00, 0x64, 0x8A, 0x80, 0x27, 0xB1, 0x80, 0x04, 0x8A, 0x00, 0x14, 0x89, 0x00, 0x14, 0x8F, 0x80, 0x17, 0xB8, 0x00, 0x30, 0x0A, 0x00, 0x24, 0x84, 0x00, 0x24, 0x4A, 0x80, 0x68, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FFC, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x33, 0x23, 0x00, 0x1A, 0x3A, 0x00, 0x0A, 0xAA, 0x80, 0x01, 0x29, 0x00, 0x61, 0x39, 0x00, 0x32, 0x2A, 0x00, 0x12, 0xAA, 0x80, 0x03, 0xBB, 0x80, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x31, 0x93, 0x00, 0x23, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x6FFD, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x33, 0xEF, 0x80, 0x18, 0x82, 0x00, 0x0B, 0xEF, 0x80, 0x00, 0x82, 0x00, 0x61, 0x45, 0x00, 0x32, 0x28, 0x80, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x31, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x63, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x6FFE, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x2E, 0x00, 0x13, 0xF0, 0x80, 0x02, 0x3F, 0x80, 0x0A, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x11, 0x00, 0x14, 0x48, 0x80, 0x25, 0x42, 0x80, 0x2A, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7000, { 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x01, 0x49, 0x00, 0x09, 0x42, 0x80, 0x0A, 0x3E, 0x00, 0x18, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x33, 0x42, 0x00, 0x20, 0x3C, 0x00, 0x63, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7001, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x30, 0x00, 0x00, 0x4C, 0x00, 0x09, 0xFE, 0x00, 0x0F, 0x03, 0x80, 0x09, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x80, 0x11, 0x11, 0x00, 0x21, 0xFE, 0x00, 0x27, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7005, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0xAA, 0x80, 0x02, 0xCB, 0x00, 0x04, 0x92, 0x00, 0x21, 0x45, 0x00, 0x12, 0x28, 0x80, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x14, 0x00, 0x20, 0x12, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7006, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7007, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x24, 0x00, 0x0A, 0xFF, 0x00, 0x02, 0x24, 0x00, 0x62, 0x3C, 0x00, 0x32, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x16, 0x91, 0x00, 0x34, 0xFF, 0x00, 0x2C, 0x42, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7009, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x60, 0x80, 0x01, 0x8F, 0x00, 0x21, 0x01, 0x00, 0x11, 0xEF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x41, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x12, 0x04, 0x80, 0x14, 0x12, 0x80, 0x10, 0x48, 0x80, 0x21, 0x21, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x700B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x00, 0x1F, 0x00, 0x21, 0xF0, 0x00, 0x11, 0x12, 0x00, 0x00, 0x94, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0xD6, 0x00, 0x0F, 0x11, 0x80, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x700D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x31, 0xFF, 0x80, 0x19, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x01, 0x49, 0x00, 0x61, 0x7F, 0x00, 0x31, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x01, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x19, 0xC7, 0x80, 0x13, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x26, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x700F, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x80, 0x0B, 0x7A, 0x80, 0x02, 0x2A, 0x80, 0x02, 0x2A, 0x80, 0x22, 0xAA, 0x80, 0x13, 0xCA, 0x80, 0x02, 0x52, 0x80, 0x08, 0xA2, 0x80, 0x09, 0x12, 0x80, 0x0B, 0xFA, 0x80, 0x14, 0x46, 0x80, 0x13, 0xFA, 0x80, 0x10, 0x52, 0x80, 0x11, 0x52, 0x80, 0x20, 0xF8, 0x80, 0x23, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7011, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x00, 0x44, 0x00, 0x01, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x11, 0x92, 0x00, 0x16, 0xBD, 0x80, 0x10, 0x54, 0x00, 0x21, 0x92, 0x00, 0x26, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7015, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x9F, 0x80, 0x00, 0x82, 0x00, 0x02, 0xE4, 0x00, 0x22, 0x8F, 0x00, 0x12, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x00, 0x8F, 0x00, 0x08, 0x99, 0x00, 0x0A, 0x99, 0x00, 0x0A, 0xAF, 0x00, 0x15, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x8F, 0x00, 0x21, 0x09, 0x00, 0x26, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7017, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x34, 0x21, 0x00, 0x15, 0xFD, 0x00, 0x00, 0x20, 0x00, 0x41, 0xFC, 0x00, 0x60, 0x23, 0x00, 0x27, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x4A, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x22, 0x91, 0x00, 0x26, 0x85, 0x80, 0x6C, 0x7C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7018, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x2E, 0x80, 0x13, 0xF0, 0x00, 0x02, 0x3F, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x24, 0x55, 0x00, 0x24, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x701A, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x07, 0xFA, 0x00, 0x20, 0x89, 0x00, 0x13, 0xF0, 0x80, 0x02, 0x20, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x2D, 0x80, 0x0B, 0xF6, 0x80, 0x08, 0x84, 0x80, 0x17, 0xED, 0x80, 0x10, 0x96, 0x80, 0x10, 0xA4, 0x80, 0x20, 0x84, 0x80, 0x20, 0x8D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x701B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x0B, 0xA7, 0x00, 0x0A, 0xFD, 0x00, 0x0B, 0x95, 0x00, 0x12, 0xD7, 0x00, 0x13, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x22, 0xD5, 0x80, 0x25, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x701C, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xE2, 0x00, 0x00, 0x02, 0x00, 0x03, 0xEF, 0x80, 0x22, 0x2A, 0x80, 0x13, 0xEA, 0x80, 0x00, 0x0A, 0x80, 0x0F, 0xFF, 0x80, 0x0D, 0x5A, 0x80, 0x0D, 0x52, 0x00, 0x16, 0x72, 0x00, 0x14, 0x12, 0x00, 0x17, 0xF2, 0x80, 0x14, 0x93, 0x80, 0x24, 0x9C, 0x80, 0x24, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x701D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x3B, 0x80, 0x22, 0xEE, 0x00, 0x12, 0x22, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x77, 0x00, 0x0A, 0xAA, 0x80, 0x0B, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x48, 0x00, 0x12, 0x4F, 0x00, 0x12, 0x48, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x701E, { 0x00, 0x00, 0x00, 0x10, 0x83, 0x00, 0x08, 0x8D, 0x00, 0x07, 0xEA, 0x80, 0x00, 0x91, 0x00, 0x23, 0xE4, 0x00, 0x10, 0x8F, 0x00, 0x0F, 0xF5, 0x00, 0x00, 0x05, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x25, 0x00, 0x0B, 0xE5, 0x00, 0x12, 0x2F, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x6C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x701F, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x01, 0x24, 0x00, 0x03, 0xFE, 0x00, 0x20, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x0A, 0xA5, 0x00, 0x0B, 0xA7, 0x00, 0x0A, 0x21, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x21, 0x00, 0x13, 0xA7, 0x00, 0x22, 0xA5, 0x00, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7020, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x32, 0xAA, 0x80, 0x1A, 0xAA, 0x80, 0x09, 0x45, 0x00, 0x02, 0x28, 0x80, 0x60, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x02, 0x22, 0x80, 0x08, 0xC4, 0x00, 0x08, 0x29, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x10, 0x80, 0x30, 0x92, 0x00, 0x21, 0x93, 0x00, 0x63, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7023, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0xE0, 0x00, 0x02, 0x9F, 0x80, 0x03, 0xE9, 0x00, 0x22, 0x46, 0x00, 0x15, 0x46, 0x00, 0x08, 0x89, 0x00, 0x01, 0x58, 0x80, 0x0A, 0x48, 0x00, 0x0B, 0xCF, 0x00, 0x08, 0x48, 0x00, 0x13, 0xCF, 0x00, 0x10, 0x48, 0x00, 0x13, 0xCF, 0x00, 0x20, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7026, { 0x00, 0x00, 0x00, 0x20, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x12, 0x1F, 0x80, 0x02, 0x05, 0x00, 0x05, 0x25, 0x00, 0x49, 0x46, 0x00, 0x63, 0xBF, 0x80, 0x25, 0x04, 0x00, 0x09, 0x08, 0x00, 0x01, 0x1F, 0x00, 0x13, 0x29, 0x00, 0x15, 0x89, 0x00, 0x19, 0x4F, 0x00, 0x31, 0x29, 0x00, 0x23, 0x09, 0x00, 0x66, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7027, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x08, 0x88, 0x00, 0x03, 0xEF, 0x80, 0x01, 0x48, 0x00, 0x21, 0x4F, 0x80, 0x17, 0xF0, 0x80, 0x00, 0x0F, 0x80, 0x0B, 0xE8, 0x00, 0x0A, 0x28, 0x00, 0x0B, 0xEF, 0x80, 0x12, 0x28, 0x00, 0x13, 0xE8, 0x00, 0x12, 0x2F, 0x80, 0x12, 0x28, 0x00, 0x22, 0x28, 0x80, 0x22, 0x6F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7028, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x03, 0xE9, 0x00, 0x00, 0x89, 0x00, 0x20, 0x96, 0x00, 0x13, 0xE0, 0x00, 0x02, 0xAF, 0x00, 0x0A, 0xA9, 0x00, 0x0A, 0xAF, 0x00, 0x0B, 0xE9, 0x00, 0x10, 0x8F, 0x00, 0x11, 0xC9, 0x00, 0x12, 0xAF, 0x00, 0x12, 0x80, 0x00, 0x24, 0x89, 0x00, 0x20, 0x90, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x702C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x3F, 0x80, 0x37, 0xC4, 0x00, 0x11, 0x1F, 0x00, 0x07, 0xD1, 0x00, 0x45, 0x51, 0x00, 0x65, 0x5F, 0x00, 0x25, 0x51, 0x00, 0x07, 0xD1, 0x00, 0x11, 0x1F, 0x00, 0x13, 0x11, 0x00, 0x13, 0x91, 0x00, 0x35, 0x5F, 0x00, 0x25, 0x4A, 0x00, 0x29, 0x1B, 0x00, 0x61, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x702F, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x09, 0x54, 0x80, 0x01, 0x75, 0x00, 0x00, 0x4A, 0x00, 0x20, 0xA9, 0x00, 0x11, 0x10, 0x80, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7030, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x12, 0x2A, 0x00, 0x02, 0x49, 0x00, 0x4E, 0xFF, 0x80, 0x68, 0x88, 0x80, 0x28, 0xDD, 0x80, 0x08, 0xAA, 0x80, 0x0E, 0xDD, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0xDD, 0x80, 0x32, 0xAA, 0x80, 0x26, 0xDD, 0x80, 0x24, 0x88, 0x80, 0x6C, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7032, { 0x00, 0x00, 0x00, 0x20, 0x84, 0x00, 0x31, 0xC4, 0x00, 0x13, 0x64, 0x00, 0x06, 0x37, 0x80, 0x41, 0xCD, 0x00, 0x60, 0x09, 0x00, 0x27, 0x75, 0x00, 0x05, 0x55, 0x00, 0x05, 0x57, 0x00, 0x17, 0x72, 0x00, 0x10, 0x02, 0x00, 0x12, 0x22, 0x00, 0x32, 0x27, 0x00, 0x27, 0x55, 0x00, 0x25, 0x55, 0x80, 0x68, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xEF, 0x00, 0x19, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x61, 0xEF, 0x00, 0x31, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x00, 0xAA, 0x00, 0x09, 0x11, 0x00, 0x08, 0x40, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x31, 0xE4, 0x00, 0x20, 0x3E, 0x00, 0x61, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7035, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x10, 0xA8, 0x00, 0x41, 0x24, 0x00, 0x27, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x70, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x04, 0x00, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7037, { 0x00, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x01, 0x29, 0x00, 0x06, 0x73, 0x00, 0x21, 0xA5, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x82, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7039, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0xEE, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x7C, 0x00, 0x60, 0x00, 0x00, 0x33, 0xBB, 0x80, 0x12, 0xAA, 0x80, 0x03, 0xBB, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x49, 0x00, 0x21, 0x49, 0x00, 0x61, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x703C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x61, 0xEF, 0x00, 0x30, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x64, 0x00, 0x31, 0xC5, 0x00, 0x20, 0x72, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x703E, { 0x00, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x0A, 0x28, 0x80, 0x03, 0xEF, 0x80, 0x02, 0x28, 0x80, 0x23, 0xEF, 0x80, 0x12, 0x10, 0x80, 0x03, 0xFF, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0xFE, 0x80, 0x0A, 0xD6, 0x80, 0x12, 0xBA, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x38, 0x80, 0x12, 0x54, 0x80, 0x22, 0x92, 0x80, 0x23, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7043, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x80, 0x6B, 0xAE, 0x80, 0x39, 0x24, 0x80, 0x0B, 0xAE, 0x80, 0x09, 0x24, 0x80, 0x6B, 0xAE, 0x80, 0x39, 0x24, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x20, 0x88, 0x00, 0x6F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7044, { 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x30, 0x84, 0x00, 0x18, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x60, 0x87, 0x00, 0x33, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x07, 0xFF, 0x80, 0x0A, 0x49, 0x00, 0x0B, 0xCF, 0x00, 0x1A, 0x49, 0x00, 0x13, 0xCF, 0x00, 0x32, 0x49, 0x00, 0x2F, 0xDF, 0x00, 0x60, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7048, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x32, 0x28, 0x80, 0x1B, 0xEF, 0x80, 0x0A, 0x28, 0x80, 0x03, 0xEF, 0x80, 0x62, 0x28, 0x80, 0x33, 0xEF, 0x80, 0x10, 0x44, 0x00, 0x00, 0x88, 0x00, 0x09, 0xFF, 0x80, 0x0B, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x21, 0x10, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7049, { 0x00, 0x00, 0x00, 0x05, 0x49, 0x00, 0x45, 0x4B, 0x00, 0x6A, 0x8A, 0x00, 0x2A, 0x9F, 0x80, 0x05, 0x52, 0x00, 0x45, 0x72, 0x00, 0x60, 0x12, 0x00, 0x27, 0xDF, 0x80, 0x04, 0x52, 0x00, 0x17, 0xD2, 0x00, 0x10, 0x12, 0x00, 0x17, 0xDF, 0x80, 0x35, 0x52, 0x00, 0x27, 0xD2, 0x00, 0x24, 0x32, 0x00, 0x63, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x704A, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x27, 0xDF, 0x00, 0x32, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x07, 0xDF, 0x80, 0x41, 0x86, 0x00, 0x62, 0xCA, 0x80, 0x24, 0x93, 0x80, 0x00, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x32, 0x49, 0x00, 0x23, 0x8F, 0x00, 0x22, 0x71, 0x00, 0x62, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x704B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x1A, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x63, 0xFF, 0x00, 0x32, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x0A, 0xAA, 0x80, 0x0B, 0x11, 0x80, 0x1A, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x33, 0xFF, 0x00, 0x24, 0x42, 0x00, 0x60, 0xFD, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x704C, { 0x00, 0x00, 0x00, 0x20, 0x44, 0x00, 0x10, 0x44, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x21, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x01, 0xEF, 0x00, 0x08, 0x90, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x704E, { 0x00, 0x00, 0x00, 0x05, 0x04, 0x00, 0x5F, 0xC4, 0x00, 0x35, 0x5F, 0x00, 0x1F, 0xC4, 0x00, 0x15, 0x44, 0x00, 0x5F, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x1F, 0xD9, 0x00, 0x00, 0x13, 0x80, 0x2F, 0xBC, 0x80, 0x28, 0x80, 0x00, 0x28, 0x9F, 0x00, 0x6F, 0x95, 0x00, 0x45, 0x15, 0x00, 0x47, 0xD5, 0x00, 0x5C, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x704F, { 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x1F, 0xBF, 0x00, 0x18, 0x88, 0x00, 0x4F, 0x92, 0x00, 0x28, 0xBF, 0x00, 0x2F, 0xA2, 0x00, 0x02, 0x2A, 0x00, 0x1F, 0xAA, 0x00, 0x10, 0x2A, 0x00, 0x2F, 0xAA, 0x00, 0x68, 0xAA, 0x00, 0x2F, 0xAA, 0x00, 0x22, 0x10, 0x00, 0x2A, 0x94, 0x00, 0x32, 0x23, 0x00, 0x26, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7050, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0xAA, 0x80, 0x02, 0xCB, 0x00, 0x04, 0x92, 0x00, 0x21, 0x45, 0x00, 0x12, 0x28, 0x80, 0x03, 0xFF, 0x80, 0x02, 0x30, 0x80, 0x08, 0x48, 0x00, 0x09, 0x86, 0x00, 0x0E, 0xF9, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x20, 0xA8, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7051, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x02, 0xAA, 0x80, 0x22, 0x38, 0x80, 0x13, 0xFF, 0x80, 0x02, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x44, 0x80, 0x0B, 0xFF, 0x80, 0x12, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x24, 0xB8, 0x80, 0x29, 0xCF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7054, { 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x27, 0xF3, 0x80, 0x35, 0x54, 0x80, 0x17, 0xF9, 0x00, 0x05, 0x52, 0x00, 0x47, 0xFF, 0x80, 0x60, 0x0A, 0x80, 0x27, 0xFA, 0x80, 0x00, 0x0A, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x33, 0xE8, 0x00, 0x21, 0x48, 0x80, 0x21, 0xF8, 0x80, 0x67, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7055, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x80, 0x41, 0x05, 0x80, 0x2F, 0xE5, 0x00, 0x20, 0x0F, 0x80, 0x0A, 0xBA, 0x00, 0x49, 0x2A, 0x00, 0x2A, 0xAA, 0x00, 0x2F, 0xEF, 0x00, 0x01, 0x0A, 0x00, 0x2F, 0xEA, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0xAF, 0x00, 0x2F, 0x6A, 0x00, 0x68, 0x2A, 0x00, 0x48, 0x2A, 0x00, 0x48, 0x6F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7058, { 0x00, 0x00, 0x00, 0x11, 0x45, 0x00, 0x0F, 0xF5, 0x00, 0x01, 0x4A, 0x00, 0x01, 0xCF, 0x80, 0x20, 0x9A, 0x00, 0x13, 0xEA, 0x00, 0x02, 0xAA, 0x00, 0x03, 0xEF, 0x80, 0x08, 0x8A, 0x00, 0x0B, 0xEA, 0x00, 0x08, 0x8F, 0x80, 0x17, 0xFA, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x22, 0x2F, 0x80, 0x2C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x705D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x02, 0x22, 0x00, 0x03, 0xE4, 0x00, 0x22, 0x2F, 0x00, 0x13, 0xE9, 0x00, 0x00, 0x89, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x09, 0x00, 0x0B, 0xE9, 0x00, 0x0A, 0x2F, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x89, 0x00, 0x12, 0xAF, 0x00, 0x24, 0x99, 0x00, 0x21, 0x90, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x705E, { 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x37, 0xFF, 0x80, 0x14, 0x20, 0x80, 0x05, 0xAE, 0x80, 0x40, 0x20, 0x00, 0x61, 0xAE, 0x00, 0x21, 0x40, 0x00, 0x07, 0xF7, 0x80, 0x11, 0x44, 0x80, 0x13, 0xE7, 0x80, 0x12, 0xA4, 0x80, 0x33, 0xE7, 0x80, 0x20, 0x84, 0x80, 0x27, 0xF4, 0x80, 0x60, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7063, { 0x00, 0x00, 0x00, 0x11, 0x32, 0x00, 0x09, 0x02, 0x00, 0x02, 0xFD, 0x00, 0x05, 0x85, 0x00, 0x22, 0xBA, 0x80, 0x13, 0xFF, 0x80, 0x01, 0x42, 0x00, 0x0B, 0x36, 0x80, 0x0D, 0x36, 0x80, 0x0B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x24, 0x00, 0x80, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7064, { 0x00, 0x00, 0x00, 0x04, 0x62, 0x00, 0x48, 0x04, 0x00, 0x2A, 0xFD, 0x00, 0x24, 0x02, 0x00, 0x09, 0x64, 0x80, 0x5F, 0x0F, 0x80, 0x25, 0x62, 0x80, 0x24, 0x02, 0x00, 0x0E, 0x77, 0x00, 0x15, 0x5A, 0x80, 0x24, 0x72, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x70, 0x00, 0x43, 0xAE, 0x00, 0x4E, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7065, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x83, 0x00, 0x3E, 0xE6, 0x00, 0x0C, 0x98, 0x00, 0x71, 0x87, 0x80, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x08, 0x88, 0x80, 0x7B, 0x7B, 0x00, 0x1E, 0x1E, 0x00, 0x69, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x706B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x41, 0x00, 0x04, 0x42, 0x00, 0x04, 0x44, 0x00, 0x08, 0x48, 0x00, 0x10, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x706C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x44, 0x00, 0x12, 0x66, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x706D, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x90, 0x00, 0x10, 0xA0, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x08, 0x07, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x706E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x82, 0x00, 0x09, 0xC6, 0x00, 0x19, 0x4C, 0x00, 0x13, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x72, 0x27, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x706F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x7F, 0x80, 0x09, 0x04, 0x00, 0x2B, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x68, 0x04, 0x00, 0x48, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x14, 0x04, 0x00, 0x16, 0x04, 0x00, 0x32, 0x04, 0x00, 0x23, 0x04, 0x00, 0x60, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7070, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x09, 0x21, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x21, 0x04, 0x00, 0x22, 0x02, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x08, 0x82, 0x00, 0x09, 0xC6, 0x00, 0x19, 0x4C, 0x00, 0x13, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7076, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x29, 0x08, 0x00, 0x2B, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x14, 0x08, 0x00, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x20, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7078, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x30, 0x30, 0x00, 0x00, 0x48, 0x00, 0x01, 0x86, 0x00, 0x06, 0x01, 0x80, 0x38, 0x42, 0x00, 0x04, 0x44, 0x00, 0x08, 0x48, 0x00, 0x10, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x707C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x80, 0x80, 0x28, 0x80, 0x80, 0x09, 0x00, 0x80, 0x08, 0x7C, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x14, 0x00, 0x80, 0x12, 0x01, 0x00, 0x22, 0x01, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x707D, { 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x08, 0x42, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x08, 0x42, 0x00, 0x04, 0x21, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x04, 0x44, 0x00, 0x04, 0x48, 0x00, 0x08, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x707E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x08, 0x86, 0x00, 0x08, 0x8C, 0x00, 0x19, 0xC0, 0x00, 0x11, 0x40, 0x00, 0x03, 0x60, 0x00, 0x02, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x707F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x05, 0x08, 0x00, 0x15, 0x08, 0x00, 0x16, 0x49, 0x00, 0x14, 0x49, 0x00, 0x24, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x09, 0x49, 0x00, 0x11, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7080, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x2C, 0x42, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x0C, 0x92, 0x00, 0x12, 0xA2, 0x00, 0x11, 0x22, 0x00, 0x22, 0x42, 0x00, 0x40, 0x94, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xA0, 0x00, 0x03, 0x20, 0x80, 0x0E, 0x31, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7085, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x04, 0x42, 0x00, 0x08, 0x44, 0x00, 0x10, 0xA8, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7086, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x68, 0x22, 0x00, 0x48, 0x36, 0x00, 0x08, 0x14, 0x00, 0x08, 0x1C, 0x00, 0x1C, 0x08, 0x00, 0x14, 0x1C, 0x00, 0x16, 0x14, 0x00, 0x32, 0x36, 0x00, 0x20, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7089, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0x00, 0x00, 0x2B, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x68, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x14, 0x40, 0x00, 0x16, 0x40, 0x00, 0x32, 0xC0, 0x00, 0x20, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x708A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x7F, 0x80, 0x2C, 0x51, 0x00, 0x28, 0x92, 0x00, 0x29, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x14, 0x24, 0x00, 0x14, 0x42, 0x00, 0x10, 0x81, 0x00, 0x23, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x708E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x41, 0x00, 0x04, 0x42, 0x00, 0x08, 0x44, 0x00, 0x10, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x43, 0x80, 0x04, 0x42, 0x00, 0x04, 0x44, 0x00, 0x08, 0x48, 0x00, 0x10, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7092, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0x0A, 0x00, 0x0A, 0x49, 0x00, 0x2C, 0x48, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x00, 0x09, 0x09, 0x00, 0x08, 0x09, 0x00, 0x08, 0x1A, 0x00, 0x08, 0x02, 0x00, 0x08, 0x04, 0x00, 0x14, 0x08, 0x00, 0x14, 0x30, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7094, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x68, 0x12, 0x00, 0x48, 0x12, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x1C, 0x28, 0x00, 0x14, 0x2C, 0x00, 0x16, 0x64, 0x00, 0x32, 0x46, 0x00, 0x20, 0xC3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7095, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x68, 0x3E, 0x00, 0x48, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x14, 0x22, 0x00, 0x16, 0x62, 0x00, 0x32, 0x42, 0x80, 0x20, 0xC2, 0x80, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7096, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x09, 0x80, 0x08, 0x0F, 0x00, 0x0A, 0xF8, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x49, 0x00, 0x68, 0x49, 0x00, 0x48, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0x08, 0x80, 0x20, 0x09, 0x80, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7097, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x82, 0x00, 0x08, 0x86, 0x00, 0x19, 0xCC, 0x00, 0x11, 0x40, 0x00, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7098, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x78, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x28, 0x7F, 0x80, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x82, 0x00, 0x24, 0x82, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7099, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFC, 0x00, 0x02, 0x88, 0x00, 0x06, 0x50, 0x00, 0x19, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x40, 0x00, 0x3C, 0x41, 0x00, 0x04, 0x42, 0x00, 0x04, 0x44, 0x00, 0x08, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x709A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x80, 0x24, 0x91, 0x00, 0x24, 0x92, 0x00, 0x25, 0x14, 0x00, 0x25, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x00, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x709B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x82, 0x00, 0x09, 0xC6, 0x00, 0x19, 0x4C, 0x00, 0x13, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x01, 0x20, 0x00, 0x03, 0x20, 0x00, 0x06, 0x23, 0x00, 0x1C, 0x3E, 0x00, 0x74, 0x60, 0x00, 0x04, 0x20, 0x80, 0x04, 0x31, 0x80, 0x04, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x709C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x2C, 0x24, 0x00, 0x29, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x22, 0x24, 0x00, 0x40, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x709D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x50, 0x00, 0x2A, 0x88, 0x00, 0x2C, 0x88, 0x00, 0x29, 0x07, 0x00, 0x4A, 0xFA, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x14, 0xA8, 0x00, 0x12, 0x92, 0x00, 0x22, 0x82, 0x00, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70A1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x48, 0x00, 0x28, 0x4F, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x48, 0x00, 0x14, 0x48, 0x00, 0x15, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70A4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0A, 0x21, 0x00, 0x2C, 0x21, 0x00, 0x28, 0x42, 0x00, 0x28, 0x8C, 0x00, 0x0B, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x14, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70AB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x20, 0x00, 0x28, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x0C, 0x41, 0x00, 0x14, 0x9F, 0x80, 0x15, 0xE0, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70AC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x80, 0x00, 0x0A, 0x80, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x80, 0x00, 0x14, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70AD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x12, 0x42, 0x00, 0x12, 0x44, 0x00, 0x14, 0x68, 0x00, 0x14, 0xA0, 0x00, 0x10, 0x90, 0x00, 0x21, 0x08, 0x00, 0x22, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70AE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0xC1, 0x00, 0x2A, 0x81, 0x00, 0x2C, 0xF9, 0x00, 0x69, 0x89, 0x00, 0x48, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0xFB, 0x00, 0x1C, 0x82, 0x00, 0x14, 0x8E, 0x00, 0x16, 0x80, 0x00, 0x32, 0x80, 0x80, 0x20, 0xC1, 0x80, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70AF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x0A, 0x80, 0x80, 0x0A, 0x80, 0x80, 0x2A, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x28, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x14, 0x80, 0x80, 0x14, 0x80, 0x80, 0x20, 0x80, 0x80, 0x20, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70B0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x70, 0x22, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xE6, 0x00, 0x10, 0x04, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x00, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70B1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x06, 0x00, 0x0F, 0xFF, 0x00, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x19, 0xC6, 0x00, 0x33, 0x6C, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70B3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x2C, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x08, 0x94, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xC2, 0x80, 0x08, 0x80, 0x80, 0x14, 0x80, 0x80, 0x12, 0x80, 0x80, 0x22, 0x80, 0x80, 0x20, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70B4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x68, 0x92, 0x00, 0x48, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x1C, 0x28, 0x00, 0x14, 0x2C, 0x00, 0x16, 0x64, 0x00, 0x32, 0x46, 0x00, 0x20, 0xC3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70B7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x00, 0x00, 0x2D, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70B8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x7F, 0x80, 0x0A, 0xA0, 0x00, 0x2B, 0x20, 0x00, 0x28, 0x20, 0x00, 0x28, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x20, 0x00, 0x14, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70B9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70BA, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x19, 0x00, 0x00, 0x09, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x0C, 0x02, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0x00, 0x80, 0x60, 0x08, 0x80, 0x0A, 0x44, 0x80, 0x09, 0x25, 0x80, 0x11, 0x21, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70BB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x40, 0x00, 0x2C, 0x40, 0x00, 0x48, 0x84, 0x00, 0x09, 0xFE, 0x00, 0x0A, 0x84, 0x00, 0x08, 0x84, 0x00, 0x14, 0x84, 0x00, 0x12, 0x84, 0x00, 0x22, 0x84, 0x00, 0x20, 0xFC, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70BC, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x40, 0x00, 0x2C, 0x50, 0x00, 0x2B, 0xF8, 0x00, 0x28, 0x90, 0x00, 0x48, 0x90, 0x00, 0x09, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x14, 0x54, 0x00, 0x12, 0x93, 0x00, 0x21, 0x11, 0x00, 0x42, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70BD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x7F, 0x00, 0x05, 0x42, 0x00, 0x16, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x24, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x24, 0x00, 0x09, 0x62, 0x00, 0x10, 0x83, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70C0, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x56, 0x00, 0x2C, 0x58, 0x00, 0x48, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x20, 0x50, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70C1, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xF0, 0x00, 0x0B, 0x00, 0x00, 0x2D, 0x10, 0x00, 0x29, 0x10, 0x00, 0x29, 0x12, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x54, 0x00, 0x14, 0x92, 0x00, 0x13, 0x11, 0x00, 0x22, 0x11, 0x00, 0x40, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70C2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x50, 0x00, 0x2C, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x48, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x20, 0x02, 0x00, 0x47, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70C3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x2C, 0x10, 0x00, 0x28, 0x2C, 0x00, 0x28, 0xC3, 0x00, 0x4B, 0x01, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x12, 0x10, 0x00, 0x20, 0x12, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70C8, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xE9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0F, 0xC9, 0x00, 0x08, 0x49, 0x00, 0x14, 0x89, 0x00, 0x22, 0x89, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x01, 0x00, 0x08, 0x07, 0x00, 0x30, 0x00, 0x00, 0x09, 0x11, 0x00, 0x10, 0x89, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70CA, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x08, 0x63, 0x00, 0x08, 0x22, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x68, 0x08, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x32, 0x08, 0x00, 0x20, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70CB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x38, 0x00, 0x18, 0x54, 0x00, 0x28, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70CF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x04, 0x80, 0x00, 0x22, 0x80, 0x12, 0x10, 0x80, 0x11, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70D1, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0x94, 0x80, 0x0A, 0xD5, 0x80, 0x2A, 0x57, 0x00, 0x2A, 0x14, 0x00, 0x68, 0x14, 0x00, 0x48, 0x14, 0x00, 0x08, 0x17, 0x00, 0x08, 0x75, 0x80, 0x1C, 0xD4, 0x80, 0x14, 0x14, 0x00, 0x16, 0x34, 0x00, 0x32, 0x24, 0x80, 0x20, 0x64, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70D3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x68, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x08, 0x00, 0x12, 0x08, 0x00, 0x30, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70D4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x0A, 0x81, 0x00, 0x2A, 0xBD, 0x00, 0x2A, 0x81, 0x00, 0x68, 0x81, 0x00, 0x48, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x1C, 0xA5, 0x00, 0x14, 0xBD, 0x00, 0x16, 0x81, 0x00, 0x32, 0x81, 0x00, 0x20, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70D5, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x26, 0x00, 0x00, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x2F, 0xA0, 0x00, 0x20, 0x22, 0x00, 0x22, 0x32, 0x00, 0x2A, 0x56, 0x00, 0x2A, 0x94, 0x00, 0x22, 0x1C, 0x00, 0x27, 0x08, 0x00, 0x25, 0x9C, 0x80, 0x6C, 0xB6, 0x80, 0x58, 0x63, 0x80, 0x40, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70D6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x93, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x04, 0x11, 0x00, 0x24, 0x59, 0x00, 0x24, 0xCB, 0x00, 0x65, 0x8A, 0x00, 0x4E, 0x0E, 0x00, 0x0B, 0x04, 0x00, 0x19, 0x8E, 0x80, 0x30, 0x3B, 0x80, 0x61, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70D8, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x44, 0x00, 0x12, 0x82, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70D9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x29, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2C, 0x18, 0x00, 0x08, 0x26, 0x00, 0x08, 0x41, 0x80, 0x09, 0x80, 0x00, 0x0E, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0x82, 0x00, 0x12, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70DB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x12, 0x00, 0x2A, 0xFF, 0x00, 0x2C, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x14, 0x10, 0x00, 0x12, 0x12, 0x00, 0x22, 0x1E, 0x00, 0x41, 0xF1, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70DC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x68, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x16, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x30, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x61, 0x00, 0x1F, 0x52, 0x00, 0x01, 0x54, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x31, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70DF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x94, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xC1, 0x80, 0x0C, 0x80, 0x80, 0x12, 0x80, 0x80, 0x12, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70E4, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x12, 0x00, 0x2A, 0x14, 0x00, 0x2D, 0xFF, 0x80, 0x68, 0x10, 0x00, 0x48, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x14, 0x7F, 0x00, 0x16, 0x01, 0x00, 0x32, 0x01, 0x00, 0x20, 0x03, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70E6, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x44, 0x00, 0x2C, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x28, 0x94, 0x00, 0x48, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x12, 0x40, 0x00, 0x22, 0x48, 0x00, 0x40, 0x86, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70E7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x7E, 0x00, 0x2F, 0xC0, 0x00, 0x28, 0x28, 0x00, 0x28, 0x11, 0x00, 0x48, 0x69, 0x00, 0x0B, 0x87, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x14, 0x90, 0x00, 0x12, 0x90, 0x00, 0x22, 0x91, 0x00, 0x41, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70E8, { 0x00, 0x00, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x92, 0x00, 0x2A, 0x94, 0x00, 0x2C, 0x98, 0x00, 0x29, 0xB2, 0x00, 0x4A, 0x8E, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x14, 0x20, 0x00, 0x12, 0x20, 0x00, 0x22, 0x20, 0x00, 0x20, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70E9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x48, 0x00, 0x2C, 0x84, 0x00, 0x29, 0x13, 0x00, 0x2A, 0xFA, 0x00, 0x48, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x14, 0x20, 0x00, 0x12, 0x48, 0x00, 0x20, 0x84, 0x00, 0x41, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70EB, { 0x00, 0x00, 0x00, 0x11, 0xF8, 0x00, 0x08, 0x20, 0x00, 0x20, 0x42, 0x00, 0x11, 0xFF, 0x00, 0x04, 0x92, 0x00, 0x38, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x2A, 0x00, 0x0A, 0x44, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x05, 0x50, 0x00, 0x09, 0x40, 0x00, 0x02, 0x30, 0x00, 0x0C, 0x0E, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70EC, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x84, 0x00, 0x2C, 0xFC, 0x00, 0x28, 0x94, 0x00, 0x28, 0x90, 0x00, 0x49, 0x08, 0x00, 0x09, 0x07, 0x00, 0x0A, 0x62, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x14, 0x60, 0x00, 0x22, 0x18, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70ED, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x24, 0x00, 0x05, 0x24, 0x00, 0x0E, 0x64, 0x00, 0x34, 0x24, 0x00, 0x04, 0x54, 0x00, 0x04, 0x45, 0x00, 0x14, 0x85, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, 0x24, 0x44, 0x00, 0x22, 0x23, 0x00, 0x42, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70EF, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x6C, 0x00, 0x2C, 0x82, 0x00, 0x28, 0x40, 0x00, 0x2B, 0xFF, 0x00, 0x48, 0x50, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x92, 0x00, 0x16, 0x92, 0x00, 0x14, 0x9A, 0x00, 0x22, 0x94, 0x00, 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70F1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x0A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x28, 0xC7, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x14, 0xBD, 0x00, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70F7, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x01, 0x00, 0x2D, 0x0A, 0x00, 0x28, 0xFC, 0x00, 0x28, 0x00, 0x00, 0x48, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x48, 0x00, 0x12, 0x89, 0x00, 0x22, 0x89, 0x00, 0x41, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x70F9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x11, 0x09, 0x00, 0x10, 0x84, 0x80, 0x20, 0x84, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70FA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x68, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x80, 0x08, 0x89, 0x80, 0x1C, 0x8B, 0x00, 0x14, 0x8C, 0x00, 0x16, 0x84, 0x00, 0x32, 0x86, 0x00, 0x20, 0xF3, 0x00, 0x63, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x70FD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0xC2, 0x00, 0x2D, 0x24, 0x00, 0x28, 0x18, 0x00, 0x28, 0x2C, 0x00, 0x08, 0xD3, 0x80, 0x0F, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7103, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x2B, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x68, 0xFF, 0x80, 0x48, 0x24, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x1D, 0xA5, 0x80, 0x15, 0x24, 0x80, 0x16, 0x24, 0x00, 0x32, 0x64, 0x00, 0x20, 0x44, 0x00, 0x60, 0xCC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10, 0x89, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7105, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x08, 0x00, 0x68, 0x08, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x16, 0x41, 0x00, 0x32, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7106, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x09, 0x41, 0x00, 0x2B, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x68, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x14, 0x41, 0x00, 0x16, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7107, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x0A, 0x88, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x68, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x32, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x02, 0x7E, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x04, 0x80, 0x00, 0x22, 0x80, 0x11, 0x10, 0x80, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x710A, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x15, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x710B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x00, 0x82, 0x00, 0x08, 0x86, 0x00, 0x19, 0xCC, 0x00, 0x11, 0x60, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x710C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x9F, 0x80, 0x2D, 0xE4, 0x80, 0x28, 0x24, 0x00, 0x28, 0x44, 0x80, 0x29, 0xA7, 0x80, 0x0E, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x24, 0x00, 0x16, 0x18, 0x00, 0x14, 0x28, 0x00, 0x20, 0xC6, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x710F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xBF, 0x00, 0x3E, 0x91, 0x00, 0x22, 0x9B, 0x00, 0x22, 0x8E, 0x00, 0x22, 0x84, 0x00, 0x3E, 0x8E, 0x00, 0x00, 0x9B, 0x00, 0x03, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7110, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x44, 0x00, 0x2B, 0xFE, 0x00, 0x2C, 0x84, 0x00, 0x28, 0x84, 0x00, 0x48, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x12, 0x82, 0x00, 0x22, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7113, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x50, 0x00, 0x2A, 0x88, 0x00, 0x2C, 0xC8, 0x00, 0x29, 0x24, 0x00, 0x4A, 0xFB, 0x00, 0x0C, 0x0A, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x13, 0x04, 0x00, 0x23, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7114, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x2B, 0x63, 0x00, 0x2A, 0xC6, 0x00, 0x28, 0x04, 0x00, 0x68, 0x9F, 0x80, 0x48, 0x90, 0x80, 0x08, 0x90, 0x80, 0x1C, 0x90, 0x80, 0x14, 0x9F, 0x80, 0x16, 0x90, 0x80, 0x32, 0x90, 0x80, 0x20, 0x90, 0x80, 0x60, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7115, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7C, 0x00, 0x0A, 0x88, 0x00, 0x2D, 0x12, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0B, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x12, 0x28, 0x00, 0x20, 0x44, 0x00, 0x40, 0x83, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7116, { 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x11, 0x7F, 0x00, 0x10, 0x02, 0x00, 0x12, 0x02, 0x00, 0x56, 0x22, 0x00, 0x5A, 0x12, 0x00, 0x52, 0x52, 0x00, 0x12, 0x42, 0x00, 0x12, 0xCA, 0x00, 0x13, 0x56, 0x00, 0x12, 0x52, 0x00, 0x12, 0x72, 0x00, 0x2A, 0x02, 0x00, 0x26, 0x02, 0x00, 0x42, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7118, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x21, 0x10, 0x00, 0x40, 0x50, 0x00, 0x00, 0x20, 0x00, 0x12, 0x44, 0x00, 0x11, 0x22, 0x00, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7119, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x82, 0x00, 0x2C, 0x44, 0x00, 0x28, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x711A, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x06, 0x0E, 0x00, 0x0D, 0x15, 0x00, 0x14, 0xA4, 0x80, 0x24, 0x44, 0x00, 0x04, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x04, 0x44, 0x00, 0x08, 0xA8, 0x00, 0x11, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x711C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x68, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x88, 0x00, 0x1C, 0x8B, 0x00, 0x14, 0xEE, 0x00, 0x16, 0x88, 0x00, 0x32, 0x88, 0x80, 0x20, 0xE9, 0x80, 0x61, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x711E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0F, 0x80, 0x09, 0xF8, 0x00, 0x14, 0x08, 0x00, 0x12, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7120, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x2B, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x68, 0x77, 0x00, 0x48, 0xD5, 0x80, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0x08, 0x00, 0x20, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7121, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x29, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7126, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x28, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x11, 0x00, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x712B, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x30, 0x00, 0x68, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x1C, 0xB9, 0x00, 0x14, 0xAD, 0x00, 0x16, 0xC5, 0x00, 0x32, 0x81, 0x00, 0x20, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x712D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x29, 0x52, 0x00, 0x2A, 0x54, 0x00, 0x14, 0x28, 0x00, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x07, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x21, 0x00, 0x18, 0x33, 0x00, 0x70, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x712F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0F, 0x80, 0x09, 0x08, 0x00, 0x2B, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x68, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7130, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x81, 0x00, 0x0A, 0x81, 0x00, 0x29, 0x01, 0x00, 0x2A, 0x0E, 0x00, 0x28, 0x00, 0x00, 0x28, 0x30, 0x00, 0x08, 0xC7, 0x00, 0x08, 0x81, 0x00, 0x08, 0xEF, 0x00, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7131, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x82, 0x00, 0x08, 0x86, 0x00, 0x19, 0xCC, 0x00, 0x11, 0x60, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x04, 0x08, 0x00, 0x15, 0xA9, 0x00, 0x37, 0x2B, 0x00, 0x24, 0x4A, 0x00, 0x0E, 0x1C, 0x00, 0x1B, 0x16, 0x00, 0x31, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7136, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x0A, 0x00, 0x07, 0xE9, 0x00, 0x04, 0x48, 0x00, 0x0A, 0x7F, 0x80, 0x09, 0x88, 0x00, 0x14, 0x94, 0x00, 0x23, 0x14, 0x00, 0x02, 0x22, 0x00, 0x04, 0x41, 0x00, 0x08, 0x80, 0x80, 0x30, 0x00, 0x00, 0x01, 0x11, 0x00, 0x09, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x08, 0x82, 0x00, 0x09, 0xC6, 0x00, 0x19, 0x4C, 0x00, 0x13, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x713C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0xFF, 0x80, 0x68, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x16, 0x24, 0x00, 0x32, 0x64, 0x80, 0x20, 0xC4, 0x80, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7141, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x68, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x16, 0xC7, 0x00, 0x32, 0x80, 0x00, 0x20, 0x80, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7145, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x11, 0xDE, 0x00, 0x11, 0x12, 0x00, 0x15, 0x12, 0x00, 0x55, 0xD2, 0x00, 0x59, 0x23, 0x80, 0x51, 0x00, 0x00, 0x51, 0xC0, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x1B, 0x00, 0x39, 0xCE, 0x00, 0x2B, 0x04, 0x00, 0x2D, 0x0E, 0x00, 0x65, 0x1B, 0x00, 0x41, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7146, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x21, 0x00, 0x15, 0x21, 0x00, 0x55, 0x21, 0x00, 0x59, 0xEF, 0x00, 0x51, 0x00, 0x00, 0x51, 0x1F, 0x00, 0x11, 0xE9, 0x00, 0x11, 0x0B, 0x00, 0x11, 0x0A, 0x00, 0x39, 0xEE, 0x00, 0x29, 0x04, 0x00, 0x2D, 0x0E, 0x00, 0x65, 0x1B, 0x00, 0x41, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7147, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7149, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x2C, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0x93, 0x00, 0x09, 0x55, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x18, 0x00, 0x14, 0x34, 0x00, 0x14, 0x52, 0x00, 0x14, 0x91, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x714A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x0C, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x714B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x50, 0xFE, 0x00, 0x50, 0x10, 0x00, 0x10, 0x90, 0x00, 0x11, 0xFF, 0x00, 0x13, 0x10, 0x00, 0x38, 0xFE, 0x00, 0x2C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x714C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x714E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x91, 0x00, 0x14, 0x91, 0x00, 0x12, 0x91, 0x00, 0x10, 0x91, 0x00, 0x14, 0x91, 0x00, 0x12, 0x91, 0x00, 0x11, 0x83, 0x00, 0x00, 0x00, 0x00, 0x12, 0x11, 0x00, 0x11, 0x08, 0x80, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7150, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x44, 0x00, 0x0C, 0x54, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x14, 0x28, 0x00, 0x14, 0x44, 0x00, 0x14, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7152, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x68, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x48, 0x00, 0x16, 0x48, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x22, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x2B, 0xA1, 0x00, 0x28, 0xA1, 0x00, 0x28, 0xBF, 0x00, 0x2B, 0xA0, 0x00, 0x2A, 0x20, 0x00, 0x22, 0x20, 0x80, 0x22, 0x31, 0x80, 0x3F, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7156, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF1, 0x00, 0x08, 0x48, 0x80, 0x0A, 0x84, 0x00, 0x2D, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC2, 0x00, 0x15, 0x24, 0x00, 0x16, 0x18, 0x00, 0x14, 0x6C, 0x00, 0x23, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7157, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x55, 0x24, 0x80, 0x59, 0x24, 0x80, 0x51, 0x24, 0x80, 0x51, 0x24, 0x80, 0x11, 0x25, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x28, 0x28, 0x00, 0x2C, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x43, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7159, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x0C, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x715A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x80, 0x00, 0x22, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x18, 0x86, 0x00, 0x11, 0xCC, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x715C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x14, 0x82, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x715E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x07, 0x88, 0x00, 0x08, 0x9F, 0x80, 0x11, 0x11, 0x00, 0x22, 0x2A, 0x00, 0x1F, 0xCA, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x8A, 0x00, 0x1F, 0x91, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7160, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x9E, 0x00, 0x68, 0x80, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x54, 0x00, 0x16, 0x54, 0x00, 0x12, 0xD6, 0x00, 0x30, 0x93, 0x00, 0x21, 0x91, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7162, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x29, 0x52, 0x00, 0x2A, 0x54, 0x00, 0x14, 0x28, 0x00, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x3F, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xE8, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7164, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2C, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x14, 0x54, 0x00, 0x12, 0x92, 0x00, 0x11, 0x11, 0x00, 0x22, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7165, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x7E, 0x00, 0x0A, 0x84, 0x00, 0x0B, 0x08, 0x00, 0x28, 0xFF, 0x00, 0x28, 0xA5, 0x00, 0x28, 0xA5, 0x00, 0x08, 0xC7, 0x00, 0x08, 0x91, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x14, 0x28, 0x00, 0x14, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7166, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x80, 0x80, 0x13, 0x00, 0x80, 0x1E, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x1E, 0x01, 0x00, 0x12, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x08, 0x88, 0x80, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x46, 0x00, 0x11, 0x80, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7168, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x15, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x51, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x91, 0x00, 0x38, 0x9B, 0x00, 0x2C, 0x8A, 0x00, 0x24, 0x8C, 0x00, 0x60, 0xE6, 0x00, 0x43, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7169, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x09, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x14, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x42, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x716C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x11, 0x80, 0x0A, 0x22, 0x80, 0x14, 0xC4, 0x80, 0x15, 0x08, 0x80, 0x14, 0x31, 0x00, 0x20, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x716E, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x42, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x68, 0x00, 0x01, 0x84, 0x00, 0x07, 0xFE, 0x00, 0x3C, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x02, 0x21, 0x00, 0x11, 0x10, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7172, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x05, 0xFE, 0x00, 0x05, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x70, 0x00, 0x08, 0xA8, 0x00, 0x0B, 0x27, 0x00, 0x08, 0xA0, 0x00, 0x04, 0x88, 0x00, 0x04, 0x90, 0x00, 0x09, 0x60, 0x00, 0x02, 0x20, 0x00, 0x0C, 0x18, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7173, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x92, 0x00, 0x17, 0xF2, 0x00, 0x54, 0x92, 0x00, 0x58, 0x9E, 0x00, 0x50, 0x92, 0x00, 0x13, 0xD2, 0x00, 0x12, 0x52, 0x00, 0x12, 0x5E, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x2B, 0xD2, 0x00, 0x24, 0x22, 0x00, 0x40, 0x4A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7178, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x2B, 0x02, 0x00, 0x2D, 0xFE, 0x00, 0x29, 0x00, 0x00, 0x49, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x14, 0xFE, 0x00, 0x12, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x20, 0xAA, 0x00, 0x40, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7179, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x24, 0x00, 0x51, 0xFF, 0x80, 0x50, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x11, 0xFF, 0x80, 0x38, 0x91, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x81, 0x00, 0x64, 0x81, 0x00, 0x40, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x717A, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x0A, 0x44, 0x00, 0x09, 0x44, 0x00, 0x2B, 0x7C, 0x00, 0x2C, 0x44, 0x00, 0x28, 0x44, 0x00, 0x4B, 0x7C, 0x00, 0x09, 0x52, 0x00, 0x09, 0x54, 0x00, 0x09, 0x48, 0x00, 0x15, 0x64, 0x00, 0x13, 0x42, 0x00, 0x22, 0x83, 0x00, 0x44, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x717D, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x80, 0x08, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x2C, 0xFF, 0x80, 0x28, 0x80, 0x00, 0x28, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x99, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xCC, 0x80, 0x14, 0x99, 0x80, 0x14, 0xAA, 0x80, 0x24, 0xCC, 0x80, 0x21, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7180, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x51, 0x11, 0x00, 0x51, 0x93, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2C, 0xC4, 0x00, 0x24, 0x84, 0x80, 0x61, 0x84, 0x80, 0x43, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7184, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x10, 0x00, 0x14, 0x29, 0x00, 0x14, 0xA0, 0x80, 0x14, 0xA2, 0x80, 0x21, 0x3E, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7185, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x52, 0x00, 0x09, 0x52, 0x00, 0x2B, 0x5A, 0x00, 0x2A, 0x6E, 0x00, 0x68, 0x42, 0x00, 0x48, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x16, 0xA9, 0x00, 0x32, 0xA9, 0x00, 0x21, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7187, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x68, 0x7E, 0x00, 0x48, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0xBD, 0x00, 0x14, 0xA5, 0x00, 0x16, 0xA5, 0x00, 0x32, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x60, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xDF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x27, 0xD1, 0x00, 0x24, 0x51, 0x00, 0x24, 0x5F, 0x00, 0x27, 0xD0, 0x00, 0x25, 0x10, 0x00, 0x65, 0x10, 0x80, 0x45, 0x19, 0x80, 0x47, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7189, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x2C, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x14, 0x80, 0x80, 0x14, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x22, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x718A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x23, 0x80, 0x17, 0x3C, 0x00, 0x38, 0xA0, 0x00, 0x00, 0x20, 0x80, 0x3F, 0x3F, 0x80, 0x21, 0x00, 0x00, 0x3F, 0x20, 0x00, 0x21, 0x27, 0x80, 0x3F, 0x38, 0x00, 0x21, 0x20, 0x80, 0x23, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x12, 0x11, 0x00, 0x11, 0x08, 0x80, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x718C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x17, 0xEF, 0x80, 0x5A, 0x28, 0x80, 0x53, 0xEF, 0x80, 0x52, 0x00, 0x80, 0x52, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0x10, 0x80, 0x12, 0x38, 0x80, 0x3A, 0x28, 0x80, 0x2A, 0x6C, 0x80, 0x26, 0xC6, 0x80, 0x62, 0x00, 0x80, 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x718F, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x4A, 0x00, 0x09, 0x52, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7192, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x15, 0x14, 0x80, 0x16, 0x15, 0x00, 0x24, 0xA6, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x20, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x42, 0x80, 0x04, 0x44, 0x00, 0x04, 0x48, 0x00, 0x08, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7194, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x0C, 0x14, 0x00, 0x28, 0x22, 0x00, 0x28, 0xC9, 0x80, 0x28, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7195, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x68, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x16, 0x7F, 0x00, 0x32, 0x22, 0x00, 0x20, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7198, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x13, 0xBF, 0x00, 0x12, 0x12, 0x00, 0x12, 0x92, 0x00, 0x56, 0x52, 0x00, 0x5A, 0xD2, 0x00, 0x53, 0x2A, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x26, 0x22, 0x00, 0x43, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x91, 0x00, 0x28, 0x9F, 0x00, 0x28, 0x90, 0x00, 0x2F, 0x90, 0x00, 0x22, 0x10, 0x80, 0x22, 0x10, 0x80, 0x3F, 0xDF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x719A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x68, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x08, 0x52, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x52, 0x00, 0x14, 0xFF, 0x00, 0x16, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x719B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x15, 0xFF, 0x80, 0x55, 0x24, 0x80, 0x59, 0x24, 0x80, 0x51, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x2C, 0x92, 0x00, 0x25, 0x93, 0x00, 0x63, 0x11, 0x80, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x719F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x0A, 0x00, 0x1F, 0x0A, 0x00, 0x00, 0x2A, 0x00, 0x1F, 0x12, 0x00, 0x02, 0x1A, 0x00, 0x07, 0xA2, 0x80, 0x3C, 0x23, 0x80, 0x04, 0x40, 0x00, 0x0C, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71A0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x10, 0xA2, 0x80, 0x15, 0x24, 0x80, 0x54, 0x61, 0x80, 0x54, 0xA2, 0x80, 0x51, 0x24, 0x80, 0x50, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x38, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x64, 0x81, 0x00, 0x40, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71A2, { 0x00, 0x00, 0x00, 0x09, 0x10, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x21, 0x00, 0x0A, 0x52, 0x00, 0x0D, 0x8C, 0x00, 0x28, 0x0A, 0x00, 0x28, 0x31, 0x80, 0x28, 0xC8, 0x00, 0x08, 0x7F, 0x00, 0x0B, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x15, 0x88, 0x00, 0x22, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71A8, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x02, 0x00, 0x2F, 0xA2, 0x00, 0x20, 0x32, 0x00, 0x2F, 0x92, 0x00, 0x62, 0x02, 0x00, 0x4A, 0x8E, 0x00, 0x16, 0x40, 0x00, 0x00, 0x86, 0x00, 0x19, 0xCC, 0x00, 0x33, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71AC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x08, 0x64, 0x00, 0x3F, 0x94, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x0C, 0x00, 0x09, 0x12, 0x00, 0x11, 0x21, 0x80, 0x2E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71AF, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x28, 0x00, 0x2C, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x43, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71B0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x0A, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x68, 0x9F, 0x00, 0x48, 0x80, 0x00, 0x08, 0xBB, 0x80, 0x08, 0xAA, 0x80, 0x1C, 0xAA, 0x80, 0x14, 0xAA, 0x80, 0x16, 0xBB, 0x80, 0x32, 0x80, 0x00, 0x20, 0x7F, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71B1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x0A, 0x00, 0x3F, 0xEA, 0x00, 0x09, 0x1A, 0x00, 0x13, 0xEA, 0x00, 0x22, 0x0E, 0x00, 0x1F, 0xD2, 0x80, 0x02, 0x13, 0x80, 0x3F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71B2, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x23, 0x7F, 0x80, 0x3E, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x20, 0xA1, 0x00, 0x1F, 0xA1, 0x00, 0x00, 0x3F, 0x00, 0x14, 0xA1, 0x00, 0x15, 0xA1, 0x00, 0x35, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x0B, 0x3F, 0x00, 0x19, 0x92, 0x00, 0x30, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71B3, { 0x00, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x0A, 0x81, 0x00, 0x2A, 0xBD, 0x00, 0x2A, 0x00, 0x00, 0x69, 0xFF, 0x80, 0x49, 0x24, 0x80, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x14, 0x42, 0x00, 0x16, 0x24, 0x00, 0x32, 0x18, 0x00, 0x20, 0x76, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71B5, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x54, 0x52, 0x00, 0x5B, 0xFF, 0x00, 0x52, 0x52, 0x00, 0x12, 0x8A, 0x00, 0x13, 0x06, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x2A, 0xFA, 0x00, 0x26, 0x02, 0x00, 0x42, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71B9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x12, 0x21, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71BA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71BE, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFA, 0x00, 0x0A, 0xA9, 0x00, 0x0C, 0xA8, 0x00, 0x28, 0xA8, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x08, 0xE9, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xEA, 0x00, 0x08, 0xA4, 0x00, 0x14, 0xEC, 0x80, 0x14, 0x92, 0x80, 0x10, 0x21, 0x80, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71BF, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x14, 0x7C, 0x00, 0x58, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x50, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x39, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x2C, 0x82, 0x00, 0x65, 0x83, 0x00, 0x41, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71C0, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x14, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x50, 0x92, 0x00, 0x50, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x38, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2C, 0x10, 0x00, 0x64, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71C1, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x2C, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71C3, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x85, 0x00, 0x09, 0xF4, 0x80, 0x0B, 0x14, 0x00, 0x0C, 0xBF, 0x80, 0x2A, 0x44, 0x00, 0x29, 0x44, 0x00, 0x28, 0x8A, 0x00, 0x09, 0x0A, 0x00, 0x0A, 0x11, 0x00, 0x0C, 0x20, 0x80, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x15, 0x24, 0x80, 0x21, 0x24, 0x80, 0x22, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71C4, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x48, 0x80, 0x1E, 0x49, 0x80, 0x12, 0xDD, 0x00, 0x36, 0x94, 0x00, 0x24, 0x36, 0x00, 0x6C, 0x63, 0x00, 0x00, 0xC9, 0x80, 0x10, 0x08, 0x00, 0x76, 0x48, 0x80, 0x42, 0x49, 0x80, 0x42, 0xDD, 0x00, 0x76, 0x94, 0x00, 0x42, 0x36, 0x00, 0x42, 0x63, 0x00, 0x7E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71C8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFA, 0x00, 0x08, 0x14, 0x80, 0x0A, 0x25, 0x00, 0x2C, 0x42, 0x00, 0x29, 0x81, 0x80, 0x28, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x0C, 0x00, 0x00, 0x12, 0x42, 0x00, 0x10, 0x24, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71C9, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFC, 0x00, 0x0A, 0x07, 0x80, 0x2D, 0xFD, 0x00, 0x29, 0x15, 0x00, 0x29, 0xFD, 0x00, 0x08, 0x05, 0x00, 0x09, 0xFD, 0x00, 0x08, 0x22, 0x00, 0x08, 0x7A, 0x00, 0x17, 0xC5, 0x00, 0x14, 0x45, 0x00, 0x12, 0x48, 0x80, 0x20, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71CB, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x48, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x88, 0x00, 0x59, 0x88, 0x00, 0x52, 0xFF, 0x00, 0x50, 0x88, 0x00, 0x50, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x38, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x2C, 0xA5, 0x00, 0x65, 0xA5, 0x80, 0x41, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71CC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x22, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x68, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71CE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x09, 0x29, 0x00, 0x0A, 0xC6, 0x00, 0x2C, 0x82, 0x00, 0x2B, 0x01, 0x80, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x14, 0x92, 0x00, 0x11, 0x11, 0x00, 0x22, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71D0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x38, 0x00, 0x2C, 0x54, 0x00, 0x28, 0x92, 0x00, 0x29, 0x11, 0x80, 0x08, 0x84, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x34, 0x00, 0x0D, 0x54, 0x00, 0x08, 0xFF, 0x80, 0x14, 0x84, 0x00, 0x15, 0x04, 0x00, 0x22, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71D2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x2C, 0x42, 0x00, 0x28, 0x42, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x12, 0x44, 0x00, 0x10, 0x84, 0x80, 0x23, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71D3, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0x22, 0x00, 0x7C, 0xCF, 0x80, 0x11, 0x22, 0x00, 0x10, 0x02, 0x00, 0x39, 0x27, 0x00, 0x34, 0xCB, 0x00, 0x51, 0x22, 0x80, 0x10, 0x02, 0x00, 0x00, 0x80, 0x00, 0x08, 0x86, 0x00, 0x19, 0xCC, 0x00, 0x31, 0x60, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71D4, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x91, 0x00, 0x0A, 0x52, 0x00, 0x0D, 0xFF, 0x80, 0x28, 0x38, 0x00, 0x28, 0x54, 0x00, 0x28, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x0C, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71D5, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x05, 0xF4, 0x00, 0x3C, 0x05, 0x80, 0x05, 0xF6, 0x00, 0x05, 0x14, 0x00, 0x05, 0x14, 0x00, 0x0D, 0xF4, 0x80, 0x35, 0x17, 0x80, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x21, 0x00, 0x11, 0x10, 0x80, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71D6, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x14, 0x02, 0x00, 0x54, 0xFE, 0x00, 0x58, 0x00, 0x00, 0x53, 0xEF, 0x00, 0x50, 0x89, 0x00, 0x10, 0xE9, 0x00, 0x13, 0x8F, 0x00, 0x10, 0x02, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x2C, 0xC2, 0x00, 0x64, 0x42, 0x00, 0x40, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71D7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x17, 0xEF, 0x80, 0x5A, 0x28, 0x80, 0x53, 0xEF, 0x80, 0x52, 0x00, 0x80, 0x52, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x3A, 0x7C, 0x80, 0x2A, 0x44, 0x80, 0x26, 0x44, 0x80, 0x62, 0x4C, 0x80, 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71D9, { 0x00, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x60, 0x84, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x31, 0xFF, 0x00, 0x22, 0x49, 0x00, 0x60, 0x93, 0x00, 0x00, 0x80, 0x00, 0x19, 0xCE, 0x00, 0x33, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71DA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x48, 0x80, 0x24, 0xC9, 0x80, 0x6E, 0x9D, 0x00, 0x4A, 0x14, 0x00, 0x1B, 0x36, 0x00, 0x31, 0x63, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x24, 0x48, 0x80, 0x64, 0xC9, 0x80, 0x4E, 0x9D, 0x00, 0x0A, 0x14, 0x00, 0x1B, 0x36, 0x00, 0x31, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71DC, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x17, 0xEF, 0x80, 0x5A, 0x28, 0x80, 0x53, 0xEF, 0x80, 0x52, 0x00, 0x80, 0x52, 0x10, 0x80, 0x12, 0x08, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xA1, 0x80, 0x3B, 0x20, 0x80, 0x2A, 0x24, 0x80, 0x26, 0x1C, 0x80, 0x62, 0x00, 0x80, 0x42, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71DF, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x14, 0xA4, 0x80, 0x15, 0x25, 0x00, 0x24, 0x4A, 0x00, 0x0B, 0x11, 0x00, 0x10, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71E0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x15, 0x19, 0x00, 0x55, 0x71, 0x00, 0x55, 0x55, 0x00, 0x51, 0x39, 0x00, 0x51, 0x7D, 0x00, 0x11, 0x39, 0x00, 0x11, 0x55, 0x00, 0x10, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x28, 0x00, 0x2C, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x41, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71E5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x09, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2C, 0x00, 0x00, 0x29, 0xEF, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x14, 0x38, 0x00, 0x12, 0x54, 0x00, 0x10, 0x92, 0x00, 0x23, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71E6, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0A, 0xFF, 0x80, 0x2D, 0x59, 0x00, 0x2B, 0x2A, 0x00, 0x2C, 0xC4, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x31, 0x80, 0x0A, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x14, 0x38, 0x00, 0x14, 0x54, 0x00, 0x11, 0x92, 0x00, 0x22, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71E7, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0x8E, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0xBE, 0x80, 0x2A, 0x19, 0x00, 0x29, 0x2E, 0x00, 0x28, 0xD4, 0x00, 0x28, 0x26, 0x00, 0x0B, 0x4D, 0x00, 0x09, 0x15, 0x00, 0x09, 0x64, 0x80, 0x15, 0x18, 0x80, 0x15, 0x80, 0x00, 0x12, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71EC, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x13, 0x6E, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x57, 0x6A, 0x00, 0x5A, 0x33, 0x80, 0x52, 0x20, 0x00, 0x53, 0xFF, 0x00, 0x10, 0x89, 0x00, 0x10, 0x8B, 0x00, 0x13, 0xEA, 0x00, 0x38, 0x8E, 0x00, 0x2C, 0x84, 0x00, 0x24, 0xEE, 0x00, 0x63, 0x9B, 0x00, 0x40, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71ED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x24, 0x80, 0x0B, 0xFF, 0x80, 0x0C, 0x40, 0x00, 0x28, 0x80, 0x00, 0x29, 0xFF, 0x80, 0x2A, 0x20, 0x80, 0x09, 0xFE, 0x80, 0x09, 0x22, 0x80, 0x09, 0xFE, 0x80, 0x08, 0x24, 0x80, 0x08, 0x3E, 0x80, 0x15, 0xE1, 0x80, 0x14, 0x01, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71EE, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x08, 0x04, 0x00, 0x2B, 0xF4, 0x80, 0x2C, 0x05, 0x00, 0x28, 0xE4, 0x00, 0x08, 0x04, 0x00, 0x14, 0xEA, 0x00, 0x12, 0xA9, 0x00, 0x22, 0xF0, 0x80, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x38, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71F5, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x54, 0xFF, 0x80, 0x56, 0x22, 0x00, 0x5B, 0x14, 0x00, 0x51, 0x7F, 0x00, 0x10, 0x08, 0x00, 0x17, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x39, 0xFF, 0x80, 0x29, 0x08, 0x00, 0x25, 0x08, 0x00, 0x63, 0x80, 0x00, 0x46, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71F8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x5A, 0x10, 0x80, 0x52, 0xD6, 0x80, 0x52, 0x10, 0x80, 0x50, 0xD6, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x39, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x2D, 0x49, 0x00, 0x65, 0x49, 0x00, 0x41, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x11, 0x08, 0x80, 0x6A, 0x35, 0x00, 0x14, 0x0A, 0x00, 0x6E, 0x37, 0x00, 0x15, 0x0A, 0x80, 0x64, 0x32, 0x00, 0x1C, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x09, 0xC6, 0x00, 0x19, 0x6C, 0x00, 0x13, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71FB, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0x78, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x28, 0xC9, 0x80, 0x28, 0xAA, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x24, 0xA5, 0x00, 0x21, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71FC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x12, 0x00, 0x2D, 0xFF, 0x80, 0x28, 0x12, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0xA5, 0x00, 0x09, 0x25, 0x00, 0x08, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x29, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x71FE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x0F, 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x0E, 0xFF, 0x80, 0x0E, 0x12, 0x00, 0x00, 0x02, 0x00, 0x12, 0x27, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x71FF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0xA2, 0x80, 0x09, 0x24, 0x80, 0x0A, 0x69, 0x80, 0x2D, 0xA2, 0x80, 0x2A, 0x2C, 0x80, 0x28, 0x50, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x90, 0x00, 0x14, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7200, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x84, 0x00, 0x28, 0x84, 0x00, 0x2F, 0xFF, 0x80, 0x29, 0x4A, 0x00, 0x0B, 0x6B, 0x00, 0x0B, 0x5A, 0x80, 0x0D, 0x5A, 0x80, 0x09, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x22, 0xD2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7206, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x01, 0x00, 0x0D, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x29, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x09, 0x92, 0x00, 0x0E, 0xBD, 0x80, 0x14, 0x54, 0x00, 0x11, 0x92, 0x00, 0x26, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7207, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3E, 0x00, 0x7F, 0xCA, 0x00, 0x11, 0x2A, 0x00, 0x65, 0xBA, 0x00, 0x1F, 0x12, 0x00, 0x04, 0x3A, 0x80, 0x7F, 0xA9, 0x80, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7208, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x1E, 0x00, 0x10, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x7C, 0x00, 0x51, 0x11, 0x00, 0x51, 0x7F, 0x00, 0x11, 0x52, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x52, 0x00, 0x39, 0x7E, 0x00, 0x29, 0x10, 0x00, 0x2A, 0xA9, 0x00, 0x64, 0xA2, 0x80, 0x41, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7209, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x12, 0x22, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFE, 0x00, 0x52, 0x52, 0x00, 0x56, 0x22, 0x00, 0x5A, 0x52, 0x00, 0x53, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0x32, 0x00, 0x12, 0xAA, 0x00, 0x3B, 0x32, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0x22, 0x80, 0x63, 0xBA, 0x80, 0x46, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x720D, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x13, 0x23, 0x00, 0x12, 0x3A, 0x00, 0x16, 0xAA, 0x80, 0x55, 0x29, 0x00, 0x55, 0x39, 0x00, 0x52, 0x2A, 0x00, 0x52, 0xAA, 0x80, 0x13, 0xBB, 0x80, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x38, 0x54, 0x00, 0x2C, 0xD6, 0x00, 0x25, 0x93, 0x00, 0x63, 0x11, 0x80, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7210, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0B, 0x2E, 0x80, 0x2D, 0xF0, 0x00, 0x29, 0x3F, 0x80, 0x29, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x24, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7213, { 0x00, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x16, 0x28, 0x80, 0x5B, 0xEF, 0x80, 0x52, 0x00, 0x80, 0x52, 0x20, 0x80, 0x52, 0x7E, 0x80, 0x12, 0xC4, 0x80, 0x12, 0x08, 0x80, 0x12, 0x4E, 0x80, 0x3A, 0x82, 0x80, 0x2A, 0xEE, 0x80, 0x2A, 0x82, 0x80, 0x66, 0xFE, 0x80, 0x42, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7217, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x44, 0x00, 0x51, 0xFF, 0x00, 0x50, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x38, 0x92, 0x00, 0x2D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x721A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x54, 0x7C, 0x00, 0x58, 0x00, 0x00, 0x53, 0xBB, 0x80, 0x52, 0xAA, 0x80, 0x13, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x39, 0x49, 0x00, 0x29, 0xFF, 0x00, 0x2D, 0x49, 0x00, 0x65, 0x49, 0x00, 0x41, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x721B, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x0B, 0x29, 0x00, 0x2D, 0xEF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x55, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x39, 0x00, 0x15, 0x55, 0x00, 0x15, 0x93, 0x00, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x721D, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x13, 0xFC, 0x00, 0x10, 0xA2, 0x00, 0x11, 0x11, 0x00, 0x57, 0xFF, 0x00, 0x5A, 0x49, 0x00, 0x53, 0xFF, 0x00, 0x50, 0x00, 0x00, 0x13, 0xE1, 0x00, 0x12, 0x2F, 0x80, 0x13, 0xE1, 0x00, 0x3A, 0x29, 0x00, 0x2B, 0xED, 0x00, 0x2A, 0x45, 0x00, 0x63, 0xE1, 0x00, 0x46, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x721F, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xC7, 0x80, 0x10, 0x44, 0x00, 0x15, 0xEF, 0x00, 0x55, 0x29, 0x00, 0x55, 0xEF, 0x00, 0x50, 0x44, 0x00, 0x50, 0x48, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x38, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x88, 0x00, 0x64, 0x88, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7224, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x17, 0xEF, 0x80, 0x5A, 0x28, 0x80, 0x53, 0xEF, 0x80, 0x52, 0x28, 0x80, 0x53, 0xEF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x10, 0x80, 0x3A, 0xFE, 0x80, 0x2A, 0xBA, 0x80, 0x2A, 0xFE, 0x80, 0x66, 0x54, 0x80, 0x42, 0x92, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7228, { 0x00, 0x00, 0x00, 0x3B, 0xF7, 0x00, 0x22, 0x11, 0x00, 0x3B, 0xD7, 0x00, 0x22, 0x11, 0x00, 0x3B, 0xD7, 0x00, 0x22, 0x51, 0x00, 0x7F, 0xFF, 0x80, 0x44, 0x08, 0x80, 0x3F, 0x7F, 0x00, 0x16, 0x2A, 0x00, 0x25, 0x49, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x75, 0xD7, 0x80, 0x07, 0x70, 0x00, 0x3C, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x722A, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x722B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x86, 0x00, 0x18, 0xC3, 0x00, 0x10, 0x41, 0x80, 0x30, 0x40, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x722C, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1D, 0x3E, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x3E, 0x00, 0x15, 0x20, 0x00, 0x14, 0xA0, 0x00, 0x14, 0xA0, 0x00, 0x14, 0xA0, 0x80, 0x14, 0xBF, 0x80, 0x14, 0x40, 0x00, 0x14, 0x40, 0x00, 0x14, 0x20, 0x00, 0x24, 0x18, 0x00, 0x24, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x722D, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x07, 0x84, 0x00, 0x08, 0x42, 0x00, 0x10, 0x21, 0x00, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x722F, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x0F, 0xC8, 0x00, 0x08, 0x84, 0x00, 0x18, 0xC6, 0x00, 0x30, 0x43, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7230, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x07, 0x84, 0x00, 0x04, 0x42, 0x00, 0x08, 0x20, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x03, 0x08, 0x00, 0x04, 0x90, 0x00, 0x08, 0x60, 0x00, 0x10, 0xD8, 0x00, 0x27, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7231, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xC0, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x41, 0x02, 0x00, 0x3F, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x05, 0x10, 0x00, 0x04, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x08, 0xB0, 0x00, 0x11, 0x0E, 0x00, 0x06, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7232, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xC4, 0x00, 0x08, 0x42, 0x00, 0x08, 0x21, 0x00, 0x10, 0x00, 0x00, 0x2F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x04, 0x80, 0x08, 0x22, 0x80, 0x09, 0x12, 0x80, 0x10, 0x90, 0x80, 0x14, 0x80, 0x80, 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7234, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x7F, 0xC7, 0x00, 0x4A, 0x5D, 0x00, 0x49, 0x55, 0x00, 0x7F, 0xD5, 0x00, 0x48, 0x55, 0x00, 0x74, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x77, 0x55, 0x00, 0x42, 0x55, 0x00, 0x76, 0xD5, 0x00, 0x4D, 0xD5, 0x00, 0x79, 0x55, 0x80, 0x40, 0x64, 0x80, 0x7F, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7235, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC2, 0x00, 0x10, 0x21, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7236, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x22, 0x04, 0x80, 0x04, 0x04, 0x00, 0x0C, 0x08, 0x00, 0x12, 0x10, 0x00, 0x02, 0x10, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x18, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7237, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x70, 0x07, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x28, 0x00, 0x01, 0x10, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7238, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x3B, 0x37, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x80, 0x0C, 0x01, 0x80, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7239, { 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x3B, 0x37, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x7A, 0x07, 0x80, 0x03, 0xF8, 0x00, 0x1E, 0x18, 0x00, 0x01, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0xFE, 0x00, 0x07, 0x86, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x723A, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x02, 0x00, 0x12, 0x05, 0x00, 0x05, 0x98, 0x00, 0x09, 0xF0, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0B, 0x91, 0x00, 0x3C, 0x97, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x723B, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1C, 0x08, 0x00, 0x03, 0xB0, 0x00, 0x00, 0x60, 0x00, 0x01, 0x98, 0x00, 0x06, 0x07, 0x00, 0x18, 0x04, 0x00, 0x0C, 0x08, 0x00, 0x12, 0x08, 0x00, 0x21, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x18, 0x00, 0x06, 0x06, 0x00, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x723C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x36, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x36, 0x7E, 0x00, 0x60, 0x42, 0x00, 0x00, 0x42, 0x00, 0x02, 0x42, 0x00, 0x36, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x36, 0x42, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x723D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x49, 0x00, 0x0A, 0x46, 0x00, 0x0C, 0x45, 0x00, 0x12, 0x48, 0x80, 0x00, 0x40, 0x00, 0x12, 0x49, 0x00, 0x0C, 0x46, 0x00, 0x14, 0xA5, 0x00, 0x23, 0x18, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x723E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x1F, 0xFF, 0x00, 0x10, 0x55, 0x00, 0x15, 0x49, 0x00, 0x12, 0x55, 0x00, 0x15, 0x43, 0x00, 0x10, 0x41, 0x00, 0x15, 0x55, 0x00, 0x12, 0x49, 0x00, 0x15, 0x55, 0x00, 0x10, 0x41, 0x00, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x723F, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x03, 0x04, 0x00, 0x02, 0x04, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7240, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x1F, 0x08, 0x00, 0x11, 0x1C, 0x00, 0x01, 0x1C, 0x00, 0x01, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x49, 0x00, 0x09, 0x88, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7241, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0xF2, 0x00, 0x3C, 0x92, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xF2, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x44, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7242, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x24, 0xC6, 0x00, 0x24, 0x44, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x44, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7243, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x38, 0x9E, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x28, 0x54, 0x00, 0x28, 0xD6, 0x00, 0x29, 0x93, 0x00, 0x4B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7245, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x11, 0x00, 0x3B, 0xFF, 0x80, 0x0A, 0x11, 0x00, 0x0A, 0xFF, 0x00, 0x7A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x4C, 0x91, 0x00, 0x08, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7246, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x22, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x5D, 0x00, 0x02, 0x08, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x12, 0xBE, 0x80, 0x12, 0xBE, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7247, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7248, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x40, 0x00, 0x12, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x61, 0x00, 0x10, 0x51, 0x00, 0x10, 0x52, 0x00, 0x1E, 0x4A, 0x00, 0x12, 0x4C, 0x00, 0x12, 0x4C, 0x00, 0x12, 0x54, 0x00, 0x12, 0x92, 0x00, 0x12, 0xA1, 0x00, 0x23, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x724B, { 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x24, 0x22, 0x00, 0x24, 0x3F, 0x00, 0x24, 0xF0, 0x00, 0x3E, 0x1B, 0x00, 0x20, 0x0C, 0x00, 0x20, 0x36, 0x80, 0x20, 0xC3, 0x80, 0x3C, 0x24, 0x00, 0x24, 0x22, 0x00, 0x24, 0x3F, 0x00, 0x25, 0xF0, 0x00, 0x24, 0x1B, 0x00, 0x24, 0x0C, 0x00, 0x64, 0x36, 0x80, 0x45, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x724C, { 0x00, 0x00, 0x00, 0x12, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x1E, 0x28, 0x00, 0x12, 0x48, 0x00, 0x12, 0x88, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x724D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x24, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x3E, 0x01, 0x00, 0x20, 0x92, 0x00, 0x20, 0x50, 0x00, 0x3D, 0x10, 0x00, 0x24, 0x90, 0x00, 0x24, 0x12, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x28, 0x00, 0x44, 0x46, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x724E, { 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x25, 0x94, 0x80, 0x24, 0x64, 0x80, 0x3E, 0x38, 0x80, 0x20, 0x4C, 0x80, 0x20, 0x95, 0x80, 0x20, 0x21, 0x00, 0x3C, 0x07, 0x00, 0x24, 0x08, 0x00, 0x24, 0x2D, 0x00, 0x24, 0xA5, 0x80, 0x24, 0xA0, 0x80, 0x65, 0xA2, 0x00, 0x45, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x724F, { 0x00, 0x00, 0x00, 0x28, 0xF0, 0x00, 0x28, 0x18, 0x00, 0x28, 0x6C, 0x00, 0x28, 0xC6, 0x00, 0x3D, 0xBB, 0x80, 0x20, 0x00, 0x00, 0x21, 0xE4, 0x80, 0x21, 0x24, 0x80, 0x39, 0x6D, 0x80, 0x29, 0xA9, 0x00, 0x29, 0x29, 0x00, 0x29, 0x69, 0x00, 0x29, 0xAD, 0x80, 0x29, 0x24, 0x80, 0x69, 0x24, 0x80, 0x49, 0x64, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7250, { 0x00, 0x00, 0x00, 0x24, 0x03, 0x00, 0x24, 0x0E, 0x00, 0x24, 0xF8, 0x00, 0x24, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x68, 0x00, 0x3C, 0xCB, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0xEB, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x64, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7252, { 0x00, 0x00, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x92, 0x00, 0x1C, 0x9E, 0x00, 0x14, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x1C, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x1C, 0x00, 0x14, 0x1A, 0x00, 0x14, 0x2A, 0x00, 0x24, 0x49, 0x00, 0x25, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7253, { 0x00, 0x00, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x3E, 0x24, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x21, 0x10, 0x80, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x24, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x24, 0x61, 0x00, 0x64, 0xC1, 0x00, 0x45, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7255, { 0x00, 0x00, 0x00, 0x24, 0x08, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x3E, 0xDD, 0x00, 0x20, 0xA5, 0x00, 0x20, 0xD5, 0x00, 0x20, 0x89, 0x00, 0x3C, 0x95, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x08, 0x00, 0x24, 0xAD, 0x00, 0x24, 0xA5, 0x80, 0x65, 0xA2, 0x80, 0x45, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7256, { 0x00, 0x00, 0x00, 0x28, 0x07, 0x00, 0x29, 0xFC, 0x00, 0x29, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x3D, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x0A, 0x00, 0x21, 0xFF, 0x80, 0x39, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x68, 0x49, 0x00, 0x48, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7258, { 0x00, 0x00, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x15, 0xFF, 0x00, 0x1D, 0x29, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x15, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7259, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0x48, 0x00, 0x00, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x725A, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x18, 0x8C, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x90, 0x00, 0x07, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x725B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x725C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x70, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x725D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x3F, 0xA1, 0x80, 0x24, 0x26, 0x00, 0x24, 0x38, 0x00, 0x04, 0x20, 0x00, 0x04, 0xE0, 0x00, 0x07, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x04, 0x20, 0x80, 0x04, 0x20, 0x80, 0x04, 0x3F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x725E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x68, 0x11, 0x00, 0x48, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0E, 0x11, 0x00, 0x78, 0x11, 0x00, 0x08, 0x31, 0x00, 0x08, 0x23, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x725F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x40, 0x80, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7260, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x90, 0x00, 0x28, 0x90, 0x00, 0x28, 0x93, 0x00, 0x3E, 0x9D, 0x00, 0x68, 0xB1, 0x00, 0x48, 0xD1, 0x00, 0x0B, 0x91, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x91, 0x00, 0x38, 0x93, 0x00, 0x68, 0x90, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7261, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x05, 0x88, 0x00, 0x0E, 0x08, 0x00, 0x34, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7262, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7263, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x11, 0x00, 0x28, 0x11, 0x00, 0x3E, 0x51, 0x00, 0x68, 0x51, 0x00, 0x48, 0x51, 0x00, 0x08, 0xD1, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x31, 0x00, 0x38, 0x21, 0x00, 0x68, 0x21, 0x00, 0x08, 0x63, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7266, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x15, 0xF0, 0x00, 0x14, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x24, 0x2E, 0x00, 0x24, 0xF0, 0x00, 0x44, 0x20, 0x00, 0x07, 0x22, 0x00, 0x0C, 0x3F, 0x00, 0x35, 0xE0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7267, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x1F, 0x7F, 0x00, 0x24, 0x42, 0x00, 0x24, 0xA2, 0x00, 0x04, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x05, 0x94, 0x00, 0x0E, 0x18, 0x00, 0x34, 0x18, 0x00, 0x04, 0x24, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7268, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x68, 0x00, 0x00, 0x48, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x44, 0x00, 0x68, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x80, 0x09, 0x84, 0x80, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7269, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x14, 0x20, 0x00, 0x14, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x24, 0x92, 0x80, 0x24, 0x92, 0x80, 0x25, 0x24, 0x80, 0x04, 0x24, 0x80, 0x04, 0x44, 0x80, 0x07, 0xC8, 0x80, 0x3C, 0x90, 0x80, 0x05, 0x10, 0x80, 0x04, 0x21, 0x00, 0x04, 0x41, 0x00, 0x04, 0x82, 0x00, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x726B, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x28, 0x13, 0x00, 0x28, 0x11, 0x00, 0x28, 0x10, 0x00, 0x7E, 0x1F, 0x80, 0x49, 0xF0, 0x00, 0x08, 0x11, 0x00, 0x08, 0x19, 0x00, 0x08, 0x0B, 0x00, 0x0E, 0x0A, 0x00, 0x78, 0x0E, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x3A, 0x80, 0x09, 0xE3, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x726E, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x0C, 0x26, 0x00, 0x18, 0x22, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x10, 0x00, 0x10, 0x18, 0x00, 0x10, 0x0C, 0x00, 0x10, 0x06, 0x80, 0x08, 0x83, 0x80, 0x08, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x726F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x68, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x7F, 0x00, 0x78, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7271, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x48, 0xF2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7272, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x28, 0x00, 0x14, 0x28, 0x00, 0x1F, 0xC8, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x88, 0x00, 0x24, 0x08, 0x00, 0x05, 0x88, 0x00, 0x0E, 0x7F, 0x00, 0x34, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7274, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x28, 0x0E, 0x00, 0x28, 0xF8, 0x00, 0x28, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x48, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x0E, 0x88, 0x00, 0x38, 0x8C, 0x00, 0x68, 0x84, 0x00, 0x08, 0xE4, 0x00, 0x0B, 0x86, 0x00, 0x08, 0x02, 0x80, 0x0B, 0xFB, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7275, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x02, 0x30, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x44, 0x92, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7277, { 0x00, 0x00, 0x00, 0x08, 0x78, 0x00, 0x28, 0x0C, 0x00, 0x28, 0x36, 0x00, 0x28, 0x63, 0x00, 0x7E, 0xC1, 0x80, 0x48, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7278, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x68, 0x7F, 0x00, 0x48, 0x02, 0x00, 0x08, 0x04, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x68, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7279, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x27, 0xFF, 0x80, 0x04, 0x02, 0x00, 0x05, 0x82, 0x00, 0x0E, 0xFF, 0x80, 0x34, 0x02, 0x00, 0x04, 0x22, 0x00, 0x04, 0x12, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x727A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x28, 0x4A, 0x00, 0x4B, 0xFF, 0x00, 0x0D, 0x4A, 0x00, 0x19, 0x4A, 0x00, 0x69, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x46, 0x00, 0x09, 0x82, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x727B, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x28, 0x4C, 0x00, 0x28, 0x44, 0x00, 0x29, 0xFF, 0x80, 0x3E, 0x42, 0x00, 0x68, 0x46, 0x00, 0x48, 0x4C, 0x00, 0x08, 0x59, 0x00, 0x08, 0x43, 0x00, 0x0E, 0x46, 0x00, 0x38, 0xEC, 0x80, 0x68, 0xA1, 0x80, 0x08, 0xA3, 0x00, 0x09, 0xAE, 0x80, 0x09, 0x30, 0x80, 0x0B, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x727C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0E, 0x00, 0x00, 0x38, 0xFF, 0x00, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x727D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x01, 0x90, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x04, 0x7E, 0x00, 0x1F, 0xC1, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x727E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x7E, 0xFE, 0x00, 0x48, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x00, 0x00, 0x38, 0xFF, 0x00, 0x68, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x727F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x28, 0x48, 0x00, 0x28, 0x48, 0x00, 0x28, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0E, 0x00, 0x00, 0x78, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x17, 0xAF, 0x00, 0x10, 0x20, 0x00, 0x17, 0x8F, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x14, 0x20, 0x00, 0x10, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7281, { 0x00, 0x00, 0x00, 0x01, 0xC1, 0x00, 0x1E, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x06, 0x11, 0x00, 0x0B, 0x11, 0x00, 0x12, 0x91, 0x00, 0x22, 0x11, 0x00, 0x02, 0x43, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7282, { 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0x69, 0x00, 0x14, 0xC9, 0x00, 0x16, 0x19, 0x00, 0x35, 0x33, 0x00, 0x64, 0x62, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7284, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x28, 0x00, 0x3E, 0x6C, 0x00, 0x68, 0xC6, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0E, 0xF2, 0x00, 0x78, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7287, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x28, 0x94, 0x00, 0x28, 0x14, 0x00, 0x7E, 0x3F, 0x00, 0x48, 0x24, 0x00, 0x08, 0x04, 0x00, 0x0E, 0x7F, 0x80, 0x78, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7289, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x68, 0x42, 0x00, 0x48, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x06, 0x00, 0x68, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x728A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x49, 0x00, 0x0A, 0x2A, 0x00, 0x0C, 0x88, 0x00, 0x18, 0x4A, 0x00, 0x6B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x46, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x728B, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x14, 0x84, 0x00, 0x14, 0xFC, 0x00, 0x1F, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x25, 0x84, 0x00, 0x46, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x37, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x04, 0x88, 0x00, 0x04, 0x84, 0x00, 0x05, 0x02, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x728D, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x29, 0xDF, 0x00, 0x28, 0x45, 0x00, 0x28, 0x85, 0x00, 0x7E, 0xBF, 0x80, 0x49, 0x05, 0x00, 0x09, 0xC5, 0x00, 0x08, 0x5F, 0x00, 0x0E, 0x44, 0x00, 0x39, 0x5F, 0x00, 0x69, 0x44, 0x00, 0x08, 0xBF, 0x80, 0x08, 0x84, 0x00, 0x09, 0x84, 0x00, 0x09, 0x40, 0x00, 0x0B, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x728E, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xC2, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x9A, 0x00, 0x04, 0x0A, 0x00, 0x07, 0xC2, 0x00, 0x7C, 0x0E, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x728F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x02, 0x00, 0x3F, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x09, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x19, 0xAA, 0x00, 0x69, 0xAA, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0xAA, 0x00, 0x0C, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7292, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x81, 0x00, 0x68, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xBD, 0x00, 0x08, 0x81, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7293, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x28, 0xFF, 0x80, 0x29, 0x10, 0x80, 0x28, 0x92, 0x80, 0x7E, 0x92, 0x80, 0x48, 0xFE, 0x80, 0x08, 0x21, 0x80, 0x08, 0x43, 0x00, 0x0E, 0x40, 0x00, 0x38, 0xFF, 0x80, 0x69, 0x10, 0x80, 0x08, 0x92, 0x80, 0x08, 0x92, 0x80, 0x08, 0xFE, 0x80, 0x08, 0x21, 0x80, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7296, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x24, 0x81, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x729B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xE2, 0x00, 0x15, 0x14, 0x00, 0x24, 0x88, 0x00, 0x44, 0x16, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x40, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x40, 0x00, 0x5F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x729F, { 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x02, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x10, 0x00, 0x20, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x02, 0xFE, 0x00, 0x14, 0x14, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x81, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72A0, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x28, 0x44, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x68, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x09, 0xC9, 0x00, 0x0C, 0x88, 0x00, 0x3B, 0xFF, 0x80, 0x68, 0x89, 0x00, 0x08, 0xEA, 0x00, 0x0B, 0x84, 0x80, 0x08, 0x8A, 0x80, 0x09, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72A2, { 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x24, 0xFF, 0x80, 0x24, 0x94, 0x80, 0x04, 0xFF, 0x80, 0x05, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x34, 0x80, 0x80, 0x04, 0xFF, 0x80, 0x04, 0x80, 0x80, 0x04, 0xFF, 0x80, 0x04, 0xFF, 0x80, 0x04, 0x41, 0x00, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72A7, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x7A, 0x00, 0x09, 0xC9, 0x00, 0x0A, 0x48, 0x00, 0x0F, 0xFF, 0x80, 0x38, 0xE9, 0x00, 0x0B, 0x59, 0x00, 0x09, 0xF6, 0x00, 0x08, 0x96, 0x80, 0x09, 0x29, 0x80, 0x08, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72A8, { 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x3F, 0xBF, 0x80, 0x64, 0x64, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x24, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x24, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72AC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72AD, { 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x01, 0x90, 0x00, 0x00, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0xA0, 0x00, 0x07, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0xD0, 0x00, 0x01, 0x90, 0x00, 0x07, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72AE, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x06, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x07, 0x08, 0x00, 0x05, 0x18, 0x00, 0x05, 0x90, 0x00, 0x0C, 0xB0, 0x00, 0x18, 0xE0, 0x00, 0x30, 0x70, 0x00, 0x60, 0xD8, 0x00, 0x03, 0x8E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72AF, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x04, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x41, 0x00, 0x22, 0x41, 0x00, 0x02, 0x4F, 0x00, 0x06, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x12, 0x40, 0x00, 0x22, 0x40, 0x00, 0x02, 0x40, 0x80, 0x02, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72B0, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x44, 0x40, 0x00, 0x28, 0x40, 0x00, 0x10, 0x48, 0x00, 0x2B, 0xFC, 0x00, 0x44, 0x48, 0x00, 0x04, 0x48, 0x00, 0x0C, 0x48, 0x00, 0x14, 0x48, 0x00, 0x24, 0x88, 0x00, 0x44, 0x88, 0x00, 0x04, 0x88, 0x00, 0x05, 0x09, 0x00, 0x05, 0x09, 0x00, 0x2A, 0x07, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72B1, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x44, 0x20, 0x00, 0x28, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0xA4, 0x00, 0x18, 0x64, 0x00, 0x18, 0x24, 0x00, 0x28, 0x34, 0x00, 0x48, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0xC4, 0x80, 0x19, 0x86, 0x80, 0x73, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72B2, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x44, 0x04, 0x00, 0x28, 0x04, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x48, 0x14, 0x00, 0x08, 0x14, 0x00, 0x18, 0x34, 0x00, 0x18, 0x24, 0x00, 0x28, 0x64, 0x00, 0x48, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x84, 0x00, 0x18, 0x04, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72B4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72B6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x24, 0x13, 0x00, 0x34, 0x11, 0x00, 0x14, 0x10, 0x00, 0x05, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1C, 0x38, 0x00, 0x34, 0x28, 0x00, 0x64, 0x2C, 0x00, 0x04, 0x64, 0x00, 0x04, 0x46, 0x00, 0x04, 0xC3, 0x00, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72B7, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x44, 0x10, 0x00, 0x28, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x28, 0x80, 0x00, 0x44, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0C, 0x80, 0x00, 0x14, 0x80, 0x00, 0x24, 0x80, 0x00, 0x44, 0x80, 0x00, 0x04, 0x80, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72B8, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0xFC, 0x00, 0x28, 0x08, 0x00, 0x10, 0x88, 0x00, 0x28, 0x88, 0x00, 0x44, 0x88, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8A, 0x00, 0x14, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x44, 0x12, 0x00, 0x07, 0xFA, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x28, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72B9, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x44, 0x26, 0x00, 0x28, 0x22, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x48, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x70, 0x00, 0x18, 0x50, 0x00, 0x28, 0x50, 0x00, 0x48, 0x50, 0x00, 0x08, 0xD0, 0x00, 0x08, 0x90, 0x80, 0x19, 0x99, 0x80, 0x73, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72BE, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x16, 0x00, 0x28, 0x13, 0x00, 0x10, 0x11, 0x00, 0x10, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x38, 0x00, 0x18, 0x28, 0x00, 0x28, 0x28, 0x00, 0x48, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x19, 0x83, 0x00, 0x73, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72C0, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x09, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x14, 0x00, 0x1F, 0x14, 0x00, 0x09, 0x24, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x21, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72C1, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x44, 0x60, 0x00, 0x28, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x9F, 0x00, 0x2B, 0xF5, 0x80, 0x48, 0x44, 0x00, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x18, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x80, 0x19, 0x84, 0x80, 0x73, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72C2, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x24, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0xFF, 0x00, 0x06, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72C3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFC, 0x00, 0x28, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x18, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72C4, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x90, 0x80, 0x18, 0x91, 0x00, 0x25, 0x12, 0x00, 0x05, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x14, 0x28, 0x00, 0x14, 0x28, 0x00, 0x24, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x82, 0x00, 0x05, 0x01, 0x00, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72C6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x28, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72C7, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x28, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x48, 0x54, 0x00, 0x08, 0x54, 0x00, 0x18, 0xD6, 0x00, 0x18, 0x92, 0x00, 0x29, 0x93, 0x00, 0x49, 0x11, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72C8, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x22, 0x02, 0x00, 0x14, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x14, 0x92, 0x00, 0x24, 0x92, 0x00, 0x44, 0x92, 0x00, 0x04, 0x92, 0x00, 0x0C, 0x92, 0x00, 0x14, 0x92, 0x00, 0x24, 0x92, 0x00, 0x44, 0xA2, 0x00, 0x04, 0x28, 0x00, 0x04, 0x44, 0x00, 0x28, 0x83, 0x00, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72C9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, 0xFF, 0x00, 0x28, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x28, 0x10, 0x00, 0x48, 0x34, 0x00, 0x08, 0x76, 0x00, 0x18, 0xD3, 0x00, 0x19, 0x91, 0x80, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72CC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x90, 0x00, 0x28, 0x90, 0x00, 0x10, 0x90, 0x00, 0x10, 0xFF, 0x00, 0x29, 0x90, 0x00, 0x49, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72CD, { 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x44, 0x82, 0x00, 0x28, 0xFF, 0x00, 0x11, 0x02, 0x00, 0x29, 0x12, 0x00, 0x46, 0xFA, 0x00, 0x04, 0x92, 0x00, 0x0C, 0x92, 0x00, 0x14, 0x92, 0x00, 0x24, 0xF2, 0x00, 0x44, 0x94, 0x00, 0x04, 0x88, 0x00, 0x04, 0x81, 0x00, 0x04, 0x81, 0x00, 0x28, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72CE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x18, 0x88, 0x80, 0x08, 0x88, 0x80, 0x14, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x04, 0x88, 0x80, 0x06, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x0A, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x22, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72D0, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x24, 0x1C, 0x00, 0x18, 0xE4, 0x00, 0x08, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x04, 0xA4, 0x00, 0x0C, 0xA4, 0x00, 0x0C, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x14, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x05, 0x22, 0x00, 0x05, 0x3D, 0x00, 0x0A, 0xE1, 0x00, 0x32, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72D2, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x44, 0x48, 0x00, 0x2B, 0xFF, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x2B, 0xFF, 0x00, 0x4A, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x48, 0x80, 0x28, 0x48, 0x80, 0x48, 0x49, 0x80, 0x08, 0xC9, 0x00, 0x08, 0x8B, 0x00, 0x19, 0x88, 0x00, 0x73, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72D5, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x44, 0x84, 0x00, 0x29, 0x84, 0x00, 0x11, 0x04, 0x00, 0x13, 0x1F, 0x80, 0x2A, 0x44, 0x80, 0x4B, 0x44, 0x80, 0x09, 0xC4, 0x80, 0x18, 0x84, 0x80, 0x18, 0x84, 0x80, 0x29, 0x8C, 0x80, 0x49, 0x28, 0x80, 0x09, 0x29, 0x80, 0x0B, 0xF9, 0x00, 0x1E, 0x11, 0x00, 0x70, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72D6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x28, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x29, 0x01, 0x00, 0x49, 0x7D, 0x00, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x18, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x82, 0x00, 0x19, 0x83, 0x00, 0x73, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72D7, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x24, 0x40, 0x00, 0x18, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x15, 0x00, 0x80, 0x26, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x7C, 0x80, 0x0C, 0x44, 0x80, 0x0C, 0x44, 0x80, 0x14, 0x7C, 0x80, 0x24, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72D8, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x44, 0x13, 0x00, 0x28, 0x11, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x29, 0x10, 0x00, 0x49, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x1B, 0x00, 0x19, 0x0A, 0x00, 0x29, 0x0E, 0x00, 0x49, 0x04, 0x00, 0x09, 0xCE, 0x00, 0x0B, 0x1A, 0x80, 0x18, 0x33, 0x80, 0x70, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72D9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x7E, 0x00, 0x18, 0x42, 0x00, 0x08, 0x42, 0x00, 0x14, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x24, 0x42, 0x00, 0x04, 0x42, 0x00, 0x05, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72DB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x28, 0x30, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x49, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x49, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72DE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x22, 0x10, 0x00, 0x16, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x26, 0x02, 0x00, 0x44, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x14, 0x10, 0x00, 0x24, 0x10, 0x00, 0x44, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x28, 0x50, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72DF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x18, 0x82, 0x00, 0x28, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72E0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x80, 0x18, 0x89, 0x80, 0x28, 0x8B, 0x00, 0x48, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x18, 0xF3, 0x00, 0x73, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72E1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x08, 0x00, 0x18, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x22, 0x00, 0x14, 0x41, 0x00, 0x24, 0xC2, 0x80, 0x05, 0x42, 0x00, 0x0C, 0x22, 0x00, 0x0C, 0x24, 0x00, 0x14, 0x14, 0x00, 0x14, 0x08, 0x00, 0x24, 0x18, 0x00, 0x04, 0x24, 0x00, 0x04, 0x42, 0x00, 0x19, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72E2, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x44, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0xE6, 0x00, 0x29, 0xAC, 0x00, 0x48, 0x18, 0x00, 0x08, 0x3C, 0x00, 0x18, 0x66, 0x00, 0x19, 0xC3, 0x80, 0x28, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x70, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72E5, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x44, 0x80, 0x00, 0x28, 0xFF, 0x00, 0x11, 0x81, 0x00, 0x11, 0x01, 0x00, 0x2B, 0xF9, 0x00, 0x48, 0x89, 0x00, 0x08, 0x89, 0x00, 0x18, 0xF9, 0x00, 0x18, 0x89, 0x00, 0x28, 0x89, 0x00, 0x48, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x03, 0x00, 0x18, 0x02, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72E8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x44, 0x14, 0x00, 0x28, 0x12, 0x00, 0x10, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x24, 0x94, 0x00, 0x44, 0x94, 0x00, 0x04, 0x88, 0x00, 0x04, 0x89, 0x00, 0x05, 0x15, 0x00, 0x28, 0x63, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72E9, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x00, 0x80, 0x14, 0x04, 0x00, 0x22, 0x04, 0x00, 0x02, 0x04, 0x00, 0x07, 0xFF, 0x80, 0x06, 0x04, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x14, 0x00, 0x22, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72EC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x28, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x29, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x1F, 0x00, 0x18, 0xF1, 0x00, 0x73, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72ED, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x29, 0x11, 0x00, 0x49, 0x93, 0x00, 0x0C, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x44, 0x28, 0x00, 0x04, 0x6C, 0x00, 0x04, 0x44, 0x00, 0x04, 0xC6, 0x00, 0x0D, 0x83, 0x00, 0x3B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72EE, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x12, 0x88, 0x00, 0x2A, 0xBE, 0x00, 0x4A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x1A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x4A, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x09, 0x2E, 0x00, 0x2A, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72EF, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x44, 0x20, 0x00, 0x28, 0x50, 0x00, 0x10, 0x88, 0x00, 0x29, 0x07, 0x00, 0x46, 0x12, 0x00, 0x04, 0xF8, 0x00, 0x0C, 0x00, 0x00, 0x14, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x44, 0x20, 0x00, 0x04, 0x40, 0x00, 0x04, 0x88, 0x00, 0x05, 0x04, 0x00, 0x29, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F0, { 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x22, 0x40, 0x00, 0x14, 0xFC, 0x00, 0x09, 0x08, 0x00, 0x14, 0x10, 0x00, 0x25, 0xFC, 0x00, 0x44, 0x24, 0x00, 0x04, 0x24, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x24, 0x00, 0x24, 0x24, 0x00, 0x45, 0xFC, 0x00, 0x04, 0x24, 0x00, 0x04, 0x20, 0x00, 0x14, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F1, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x44, 0x10, 0x00, 0x2A, 0x18, 0x00, 0x11, 0x14, 0x00, 0x29, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x0F, 0x10, 0x00, 0x09, 0x10, 0x00, 0x19, 0x10, 0x00, 0x29, 0x10, 0x00, 0x49, 0x68, 0x00, 0x09, 0xA8, 0x00, 0x09, 0x44, 0x00, 0x08, 0x44, 0x00, 0x50, 0x83, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F2, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x44, 0x08, 0x00, 0x2B, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x28, 0x88, 0x00, 0x49, 0x08, 0x00, 0x09, 0x6C, 0x00, 0x19, 0xAA, 0x00, 0x2B, 0x2A, 0x00, 0x4D, 0x29, 0x00, 0x09, 0x49, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0D, 0x08, 0x00, 0x52, 0x28, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F3, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x38, 0x00, 0x28, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x29, 0x83, 0x00, 0x4B, 0x7D, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F4, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x44, 0x88, 0x00, 0x28, 0x8B, 0x00, 0x10, 0xEE, 0x00, 0x10, 0x88, 0x00, 0x28, 0x88, 0x00, 0x48, 0x88, 0x80, 0x08, 0xE7, 0x80, 0x19, 0x80, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F7, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x49, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x71, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F8, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x05, 0x11, 0x00, 0x07, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x12, 0x10, 0x00, 0x23, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72F9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x08, 0x00, 0x18, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x14, 0x49, 0x00, 0x24, 0x49, 0x00, 0x04, 0xAA, 0x80, 0x0D, 0x2C, 0x80, 0x0C, 0x08, 0x00, 0x14, 0x14, 0x00, 0x24, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x19, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72FA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x72FB, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x45, 0x82, 0x00, 0x29, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x49, 0x00, 0x28, 0xC8, 0x00, 0x49, 0x8F, 0x80, 0x0B, 0x40, 0x00, 0x18, 0x7E, 0x00, 0x18, 0xC2, 0x00, 0x29, 0x86, 0x00, 0x4B, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72FC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x20, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x14, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x0C, 0xA1, 0x00, 0x14, 0xA2, 0x00, 0x24, 0x94, 0x00, 0x04, 0x88, 0x00, 0x04, 0xFC, 0x00, 0x07, 0x82, 0x00, 0x18, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72FD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x08, 0x81, 0x00, 0x14, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x0C, 0x81, 0x00, 0x0C, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x24, 0x81, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x42, 0x00, 0x04, 0x81, 0x00, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x72FE, { 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x49, 0x07, 0x00, 0x29, 0x1C, 0x00, 0x31, 0x10, 0x00, 0x17, 0xD0, 0x00, 0x31, 0x1F, 0x80, 0x51, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0xD2, 0x00, 0x37, 0x12, 0x00, 0x51, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x32, 0x00, 0x11, 0x22, 0x00, 0x11, 0x62, 0x00, 0x63, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7301, { 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x22, 0x31, 0x00, 0x15, 0xC1, 0x00, 0x08, 0x45, 0x00, 0x14, 0x45, 0x00, 0x24, 0x55, 0x00, 0x07, 0xFD, 0x00, 0x0C, 0x45, 0x00, 0x14, 0xC5, 0x00, 0x24, 0xE5, 0x00, 0x05, 0x55, 0x00, 0x05, 0x45, 0x00, 0x06, 0x41, 0x00, 0x04, 0x41, 0x00, 0x28, 0x45, 0x00, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7302, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x28, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7303, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x44, 0x20, 0x00, 0x28, 0x50, 0x00, 0x10, 0x88, 0x00, 0x29, 0x04, 0x00, 0x46, 0x03, 0x00, 0x05, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x14, 0x04, 0x00, 0x25, 0x24, 0x00, 0x44, 0xA4, 0x00, 0x04, 0xA8, 0x00, 0x04, 0xA8, 0x00, 0x04, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7304, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x28, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7305, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x44, 0x24, 0x00, 0x28, 0x24, 0x00, 0x11, 0xE7, 0x80, 0x10, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x24, 0x00, 0x09, 0xE7, 0x80, 0x18, 0x24, 0x00, 0x18, 0x24, 0x00, 0x28, 0xE4, 0x00, 0x4B, 0xA7, 0x80, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x18, 0xC4, 0x00, 0x71, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7307, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x1F, 0x00, 0x28, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x29, 0x11, 0x00, 0x49, 0x1C, 0x00, 0x09, 0x70, 0x00, 0x19, 0x11, 0x00, 0x19, 0x0F, 0x00, 0x29, 0x00, 0x00, 0x49, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x80, 0x1A, 0x64, 0x80, 0x70, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x730A, { 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x25, 0x87, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x15, 0xC7, 0x00, 0x25, 0x01, 0x00, 0x05, 0x01, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x45, 0x00, 0x0C, 0x44, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x80, 0x05, 0x07, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x730B, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0A, 0x00, 0x09, 0x09, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0x14, 0x00, 0x1C, 0x14, 0x00, 0x36, 0x36, 0x00, 0x62, 0x63, 0x00, 0x40, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x730D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x09, 0xD7, 0x00, 0x19, 0x55, 0x00, 0x1B, 0x39, 0x80, 0x28, 0x38, 0x00, 0x48, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x730E, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x22, 0x48, 0x00, 0x16, 0x48, 0x00, 0x09, 0xFE, 0x00, 0x14, 0x48, 0x00, 0x24, 0x4A, 0x00, 0x47, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x0C, 0xFE, 0x00, 0x14, 0x84, 0x00, 0x24, 0x84, 0x00, 0x44, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x28, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7312, { 0x00, 0x00, 0x00, 0x7E, 0x10, 0x00, 0x42, 0x14, 0x00, 0x42, 0x16, 0x00, 0x7E, 0x12, 0x00, 0x42, 0x10, 0x00, 0x42, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x42, 0x38, 0x00, 0x7E, 0x28, 0x00, 0x42, 0x28, 0x00, 0x7E, 0x2C, 0x00, 0x42, 0x64, 0x00, 0x42, 0x46, 0x00, 0x46, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7313, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x49, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x48, 0x56, 0x00, 0x08, 0xD2, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7315, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x47, 0x90, 0x00, 0x28, 0x90, 0x00, 0x10, 0xA0, 0x00, 0x28, 0xBF, 0x00, 0x4B, 0xC1, 0x00, 0x0A, 0x0A, 0x00, 0x1A, 0x08, 0x00, 0x2A, 0x2A, 0x00, 0x4B, 0xAA, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xC9, 0x00, 0x08, 0x88, 0x00, 0x55, 0x28, 0x00, 0x22, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7316, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x0C, 0x00, 0x00, 0x0D, 0xFF, 0x80, 0x15, 0x00, 0x80, 0x15, 0x00, 0x80, 0x25, 0xFF, 0x80, 0x05, 0x00, 0x80, 0x05, 0x00, 0x80, 0x05, 0xFF, 0x80, 0x19, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7317, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x28, 0xC6, 0x00, 0x48, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x02, 0x00, 0x18, 0xF2, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x18, 0x02, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7318, { 0x00, 0x00, 0x00, 0x08, 0x81, 0x00, 0x4A, 0x85, 0x00, 0x2A, 0x85, 0x00, 0x37, 0xF5, 0x00, 0x14, 0x85, 0x00, 0x30, 0x85, 0x00, 0x57, 0xF5, 0x00, 0x10, 0x85, 0x00, 0x10, 0x85, 0x00, 0x37, 0xF5, 0x00, 0x54, 0x95, 0x00, 0x14, 0x95, 0x00, 0x14, 0x91, 0x00, 0x14, 0x91, 0x00, 0x14, 0xB1, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7319, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x44, 0x3C, 0x00, 0x2B, 0xE4, 0x00, 0x10, 0xA6, 0x00, 0x11, 0x12, 0x00, 0x29, 0xFE, 0x00, 0x48, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x22, 0x00, 0x28, 0x22, 0x00, 0x49, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x731B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x18, 0x04, 0x00, 0x08, 0x08, 0x00, 0x14, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x14, 0x70, 0x00, 0x24, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x05, 0x29, 0x00, 0x05, 0x29, 0x00, 0x07, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x731C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0C, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x06, 0x00, 0x00, 0x06, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x02, 0x41, 0x00, 0x04, 0x41, 0x00, 0x18, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x731D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x04, 0xAA, 0x00, 0x0D, 0x11, 0x00, 0x0C, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x731E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x38, 0x00, 0x28, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x28, 0x7C, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x731F, { 0x00, 0x00, 0x00, 0x05, 0x22, 0x00, 0x45, 0xB6, 0x00, 0x28, 0x94, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x29, 0x22, 0x00, 0x49, 0x22, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x22, 0x00, 0x19, 0x22, 0x00, 0x29, 0xFE, 0x00, 0x49, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x80, 0x1B, 0x22, 0x80, 0x76, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7321, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x47, 0xFF, 0x00, 0x2A, 0x52, 0x00, 0x12, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x4B, 0xFE, 0x00, 0x0A, 0x42, 0x00, 0x08, 0x40, 0x00, 0x18, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x4A, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0x20, 0x00, 0x50, 0xC0, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7322, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x44, 0x8F, 0x80, 0x28, 0x88, 0x80, 0x10, 0x88, 0x80, 0x17, 0xF8, 0x80, 0x28, 0x8F, 0x80, 0x48, 0x88, 0x80, 0x08, 0x88, 0x80, 0x1B, 0xE8, 0x80, 0x1A, 0x2F, 0x80, 0x2A, 0x28, 0x80, 0x4A, 0x28, 0x80, 0x0A, 0x28, 0x80, 0x0A, 0x28, 0x80, 0x1B, 0xE8, 0x80, 0x70, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7324, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x45, 0xFA, 0x00, 0x2A, 0x28, 0x80, 0x11, 0x6D, 0x00, 0x10, 0xC6, 0x00, 0x29, 0x83, 0x00, 0x4B, 0x01, 0x80, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7325, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x0C, 0x90, 0x00, 0x14, 0x91, 0x00, 0x24, 0x8A, 0x00, 0x04, 0x84, 0x00, 0x04, 0xBC, 0x00, 0x07, 0xC2, 0x00, 0x18, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7327, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x10, 0x9E, 0x00, 0x10, 0x92, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x19, 0x7D, 0x00, 0x29, 0x45, 0x00, 0x49, 0x45, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x19, 0x01, 0x00, 0x71, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7328, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x44, 0x1E, 0x00, 0x2B, 0xF2, 0x00, 0x10, 0xA3, 0x00, 0x11, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x40, 0x00, 0x18, 0x7E, 0x00, 0x28, 0xC2, 0x00, 0x49, 0x86, 0x00, 0x0B, 0x6C, 0x00, 0x08, 0x38, 0x00, 0x18, 0xEE, 0x00, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7329, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x0C, 0x90, 0x00, 0x0D, 0xFF, 0x00, 0x15, 0x10, 0x00, 0x26, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x732A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x80, 0x24, 0x11, 0x00, 0x18, 0xFF, 0x00, 0x08, 0x12, 0x00, 0x14, 0x14, 0x00, 0x27, 0xFF, 0x80, 0x04, 0x14, 0x00, 0x04, 0x22, 0x00, 0x0C, 0xC0, 0x00, 0x0F, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x732B, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x14, 0x22, 0x00, 0x0C, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x06, 0x49, 0x00, 0x06, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x22, 0x49, 0x00, 0x02, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x732C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x29, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0x01, 0x00, 0x71, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x732E, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x05, 0x00, 0x7F, 0xC5, 0x80, 0x04, 0x04, 0x80, 0x04, 0x04, 0x00, 0x7F, 0xDF, 0x80, 0x40, 0x44, 0x00, 0x51, 0x44, 0x00, 0x4A, 0x44, 0x00, 0x5F, 0x4E, 0x00, 0x44, 0x4A, 0x00, 0x5F, 0x4A, 0x00, 0x44, 0x4A, 0x00, 0x44, 0x4B, 0x00, 0x44, 0x59, 0x00, 0x40, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x732F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x45, 0x11, 0x00, 0x29, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x20, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x49, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x19, 0x49, 0x00, 0x71, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7331, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x28, 0x42, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x28, 0x29, 0x00, 0x48, 0x6A, 0x00, 0x08, 0xC8, 0x00, 0x19, 0x88, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7332, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x19, 0xA0, 0x80, 0x1B, 0x20, 0x80, 0x29, 0x78, 0x80, 0x49, 0xCC, 0x80, 0x09, 0x00, 0x80, 0x09, 0xFD, 0x80, 0x18, 0x01, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7334, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x49, 0x7E, 0x00, 0x2B, 0x02, 0x00, 0x32, 0x02, 0x00, 0x12, 0xFF, 0x80, 0x36, 0x20, 0x00, 0x5A, 0x20, 0x00, 0x12, 0x7F, 0x00, 0x12, 0xC8, 0x00, 0x32, 0x08, 0x00, 0x52, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x12, 0x36, 0x00, 0x12, 0x63, 0x00, 0x62, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7335, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x80, 0x45, 0xFE, 0x00, 0x29, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x29, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x19, 0x7F, 0x00, 0x19, 0x55, 0x00, 0x29, 0x55, 0x00, 0x49, 0x7F, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x1A, 0x55, 0x00, 0x70, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7336, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0x1E, 0x00, 0x18, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x0C, 0x94, 0x80, 0x15, 0x14, 0x00, 0x24, 0xFF, 0x80, 0x04, 0x94, 0x80, 0x0C, 0xA4, 0x80, 0x0C, 0xC7, 0x80, 0x14, 0x80, 0x80, 0x24, 0xFF, 0x80, 0x04, 0x80, 0x80, 0x04, 0x80, 0x80, 0x04, 0xFF, 0x80, 0x18, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7337, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x04, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x25, 0x24, 0x00, 0x05, 0x3F, 0x80, 0x1F, 0xC4, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x19, 0xCA, 0x00, 0x10, 0x4A, 0x00, 0x1F, 0xCA, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x51, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7338, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x12, 0x00, 0x11, 0x12, 0x00, 0x29, 0xFE, 0x00, 0x45, 0x00, 0x00, 0x05, 0x7E, 0x00, 0x0D, 0x42, 0x00, 0x15, 0x7E, 0x00, 0x25, 0x42, 0x00, 0x45, 0x42, 0x00, 0x05, 0x7E, 0x00, 0x05, 0x42, 0x00, 0x05, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7339, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x44, 0x24, 0x00, 0x2B, 0xFE, 0x00, 0x10, 0x70, 0x00, 0x28, 0xA8, 0x00, 0x49, 0x24, 0x00, 0x0A, 0x23, 0x00, 0x1D, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x08, 0x00, 0x00, 0x57, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x733A, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x44, 0x3E, 0x00, 0x28, 0x62, 0x00, 0x10, 0xD6, 0x00, 0x11, 0xAC, 0x00, 0x28, 0x18, 0x00, 0x48, 0x60, 0x00, 0x0B, 0x80, 0x00, 0x18, 0xFF, 0x00, 0x19, 0x10, 0x00, 0x28, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x733B, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x4F, 0xCE, 0x00, 0x28, 0x78, 0x00, 0x30, 0x88, 0x00, 0x11, 0x11, 0x00, 0x31, 0x0B, 0x00, 0x51, 0x06, 0x00, 0x11, 0xCC, 0x00, 0x17, 0x09, 0x00, 0x31, 0x3F, 0x80, 0x51, 0x04, 0x80, 0x11, 0x15, 0x00, 0x11, 0x15, 0x00, 0x11, 0x35, 0x80, 0x11, 0x24, 0x80, 0x63, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x733D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x80, 0x29, 0x00, 0x80, 0x11, 0x7E, 0x80, 0x10, 0x42, 0x00, 0x28, 0x42, 0x00, 0x48, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x18, 0x7E, 0x00, 0x28, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x24, 0x00, 0x18, 0x66, 0x00, 0x71, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x733E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0xBE, 0x00, 0x0C, 0xA2, 0x00, 0x17, 0xFF, 0x80, 0x26, 0x00, 0x80, 0x04, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x18, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x733F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x05, 0x01, 0x00, 0x0D, 0xFF, 0x00, 0x0D, 0x29, 0x00, 0x14, 0x68, 0x80, 0x14, 0xA5, 0x00, 0x25, 0x26, 0x00, 0x06, 0x3E, 0x00, 0x05, 0xE1, 0x00, 0x18, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7343, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x8A, 0x00, 0x24, 0x8B, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x9C, 0x00, 0x11, 0x14, 0x00, 0x11, 0x16, 0x00, 0x0B, 0xB2, 0x00, 0x1E, 0x23, 0x00, 0x70, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7344, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x29, 0xE2, 0x00, 0x18, 0x03, 0x00, 0x08, 0x02, 0x80, 0x1B, 0xF2, 0x00, 0x14, 0x1F, 0x80, 0x24, 0x02, 0x00, 0x05, 0xE2, 0x00, 0x0C, 0x02, 0x00, 0x0D, 0xE5, 0x00, 0x14, 0x05, 0x00, 0x14, 0x05, 0x00, 0x25, 0xE5, 0x00, 0x05, 0x28, 0x80, 0x05, 0xE8, 0x80, 0x19, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7345, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x25, 0x3F, 0x80, 0x19, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x5F, 0x00, 0x25, 0xD5, 0x00, 0x05, 0x15, 0x00, 0x0D, 0x15, 0x00, 0x0D, 0x15, 0x00, 0x15, 0xD5, 0x00, 0x15, 0x55, 0x00, 0x25, 0x55, 0x00, 0x05, 0x55, 0x00, 0x05, 0xD7, 0x00, 0x19, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x734D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x80, 0x19, 0x84, 0x80, 0x77, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x734E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x22, 0x3F, 0x00, 0x22, 0xE9, 0x00, 0x3E, 0x2E, 0x00, 0x02, 0xF8, 0x00, 0x7E, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x32, 0x62, 0x00, 0x62, 0x26, 0x00, 0x00, 0x88, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x734F, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x44, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7350, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x14, 0x44, 0x00, 0x17, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7352, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x08, 0x62, 0x00, 0x3F, 0x54, 0x00, 0x09, 0x88, 0x00, 0x09, 0x16, 0x00, 0x11, 0x21, 0x80, 0x26, 0x50, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7356, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x28, 0x82, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x82, 0x00, 0x73, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7357, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x19, 0x02, 0x00, 0x09, 0x8A, 0x00, 0x15, 0x52, 0x00, 0x15, 0xFF, 0x80, 0x25, 0x06, 0x80, 0x05, 0xAB, 0x00, 0x0D, 0xAA, 0x00, 0x0D, 0xAA, 0x00, 0x15, 0xFA, 0x00, 0x15, 0x22, 0x00, 0x25, 0x25, 0x00, 0x05, 0x25, 0x00, 0x05, 0x48, 0x80, 0x1A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7358, { 0x00, 0x00, 0x00, 0x2A, 0x10, 0x00, 0x6B, 0x10, 0x00, 0x49, 0x3F, 0x80, 0x7F, 0x23, 0x00, 0x49, 0x76, 0x00, 0x5D, 0x1C, 0x00, 0x6B, 0x08, 0x00, 0x49, 0x1E, 0x00, 0x4B, 0x73, 0x80, 0x00, 0x84, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x735D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFE, 0x00, 0x28, 0x44, 0x00, 0x10, 0x28, 0x00, 0x13, 0xFF, 0x00, 0x28, 0x52, 0x00, 0x48, 0x94, 0x00, 0x09, 0x30, 0x00, 0x1B, 0xFF, 0x00, 0x1A, 0x49, 0x00, 0x2A, 0x89, 0x00, 0x4B, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1A, 0x79, 0x00, 0x72, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x735E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x92, 0x00, 0x18, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x735F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x28, 0x82, 0x00, 0x4B, 0xEF, 0x80, 0x08, 0x82, 0x00, 0x18, 0xE2, 0x00, 0x1B, 0x8F, 0x80, 0x28, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x80, 0x18, 0xC4, 0x80, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7360, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x44, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x11, 0x45, 0x00, 0x28, 0x82, 0x00, 0x49, 0xFF, 0x00, 0x0A, 0x82, 0x80, 0x18, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7363, { 0x00, 0x00, 0x00, 0x48, 0x48, 0x00, 0x24, 0x8A, 0x00, 0x00, 0x0B, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xDC, 0x00, 0x00, 0x14, 0x00, 0x3F, 0x94, 0x00, 0x20, 0x96, 0x00, 0x20, 0xB2, 0x00, 0x3F, 0xA3, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7366, { 0x00, 0x00, 0x00, 0x04, 0x84, 0x00, 0x47, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x80, 0x00, 0x19, 0xFF, 0x80, 0x2B, 0x10, 0x80, 0x4D, 0x38, 0x80, 0x09, 0x6C, 0x80, 0x09, 0x01, 0x80, 0x19, 0xF9, 0x00, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7367, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x28, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x48, 0x50, 0x80, 0x08, 0x93, 0x00, 0x09, 0x8C, 0x00, 0x1A, 0xB3, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7368, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x19, 0x24, 0x80, 0x09, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x2C, 0x40, 0x00, 0x04, 0xFF, 0x80, 0x0D, 0x20, 0x80, 0x0F, 0xFC, 0x80, 0x15, 0x24, 0x80, 0x25, 0xFC, 0x80, 0x04, 0x24, 0x80, 0x04, 0x3E, 0x80, 0x07, 0xC2, 0x80, 0x08, 0x01, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7369, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x9F, 0x00, 0x28, 0x90, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x05, 0x00, 0x28, 0x04, 0x80, 0x4B, 0xFF, 0x80, 0x0A, 0x02, 0x00, 0x1A, 0xFA, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0xAA, 0x80, 0x4B, 0xAB, 0x00, 0x0A, 0x32, 0x00, 0x0A, 0xC6, 0x80, 0x1A, 0x0A, 0x80, 0x74, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x736A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x14, 0x00, 0x18, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x14, 0x3E, 0x00, 0x14, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x04, 0xAA, 0x80, 0x0C, 0x9C, 0x80, 0x0C, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x736B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x38, 0x00, 0x28, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x28, 0x7C, 0x00, 0x48, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x19, 0x29, 0x00, 0x19, 0x29, 0x00, 0x29, 0xEF, 0x00, 0x48, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x19, 0xC7, 0x00, 0x73, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x736C, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x4B, 0xDF, 0x80, 0x2E, 0x42, 0x80, 0x10, 0x82, 0x80, 0x13, 0xE6, 0x80, 0x2A, 0xAC, 0x80, 0x4A, 0xA9, 0x80, 0x0B, 0xE0, 0x00, 0x1A, 0xAA, 0x00, 0x1A, 0xAF, 0x80, 0x2B, 0xEA, 0x00, 0x4A, 0x22, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x74, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x736D, { 0x00, 0x00, 0x00, 0x45, 0x08, 0x00, 0x29, 0x08, 0x00, 0x17, 0xCE, 0x00, 0x31, 0x12, 0x00, 0x57, 0xE4, 0x00, 0x15, 0x5F, 0x00, 0x15, 0x51, 0x00, 0x35, 0x55, 0x00, 0x57, 0xD5, 0x00, 0x11, 0x15, 0x00, 0x13, 0x95, 0x00, 0x15, 0x55, 0x00, 0x19, 0x04, 0x00, 0x11, 0x0A, 0x00, 0x51, 0x11, 0x00, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x736E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x29, 0x11, 0x00, 0x49, 0xBB, 0x00, 0x09, 0x55, 0x00, 0x19, 0xBB, 0x00, 0x19, 0x11, 0x00, 0x29, 0xBB, 0x00, 0x49, 0x55, 0x00, 0x09, 0xBB, 0x00, 0x09, 0x11, 0x00, 0x19, 0x11, 0x00, 0x71, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x736F, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x45, 0xFC, 0x00, 0x28, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x49, 0x93, 0x00, 0x09, 0x55, 0x00, 0x19, 0x39, 0x00, 0x19, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x19, 0x49, 0x00, 0x72, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7370, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x1A, 0x20, 0x80, 0x08, 0x51, 0x00, 0x15, 0x42, 0x80, 0x16, 0x7E, 0x80, 0x24, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x0D, 0x29, 0x00, 0x15, 0x29, 0x00, 0x17, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7371, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x29, 0x00, 0x80, 0x10, 0xFF, 0x00, 0x10, 0x52, 0x00, 0x29, 0x94, 0x00, 0x48, 0x18, 0x00, 0x08, 0xFF, 0x00, 0x1B, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x42, 0x00, 0x71, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7372, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x25, 0xFF, 0x80, 0x18, 0x24, 0x00, 0x08, 0x48, 0x00, 0x14, 0xFF, 0x00, 0x25, 0x90, 0x00, 0x06, 0xFF, 0x00, 0x04, 0x90, 0x00, 0x0C, 0xFE, 0x00, 0x0C, 0x90, 0x00, 0x14, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x04, 0x38, 0x00, 0x19, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7375, { 0x00, 0x00, 0x00, 0x04, 0x92, 0x00, 0x25, 0x24, 0x00, 0x18, 0x92, 0x00, 0x08, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x25, 0x55, 0x00, 0x05, 0x29, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x12, 0x00, 0x15, 0x12, 0x00, 0x25, 0xDE, 0x00, 0x05, 0x12, 0x00, 0x05, 0xDE, 0x00, 0x05, 0x12, 0x00, 0x09, 0xDE, 0x80, 0x36, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7377, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x47, 0xFF, 0x80, 0x2A, 0x24, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x24, 0x00, 0x2A, 0x3C, 0x00, 0x4A, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x1A, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x4A, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x42, 0x00, 0x71, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7378, { 0x00, 0x00, 0x00, 0x3D, 0xE4, 0x00, 0x25, 0x25, 0x00, 0x3D, 0xE4, 0x80, 0x00, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x22, 0x3F, 0x80, 0x3F, 0xE4, 0x00, 0x22, 0x24, 0x00, 0x3F, 0xE4, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xEA, 0x00, 0x00, 0x0A, 0x00, 0x1F, 0xCA, 0x00, 0x10, 0x51, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7379, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x44, 0x1E, 0x00, 0x28, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x29, 0x7E, 0x00, 0x49, 0x10, 0x80, 0x09, 0x7F, 0x80, 0x19, 0x49, 0x00, 0x19, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x49, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x18, 0xA9, 0x00, 0x71, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x737A, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x14, 0x4F, 0x80, 0x08, 0x44, 0x80, 0x0B, 0xF4, 0x80, 0x14, 0x49, 0x80, 0x25, 0xF0, 0x00, 0x05, 0x57, 0x80, 0x05, 0x54, 0x80, 0x0D, 0x57, 0x80, 0x0D, 0xF4, 0x80, 0x14, 0x47, 0x80, 0x24, 0xE4, 0x80, 0x04, 0xD7, 0x80, 0x05, 0x48, 0x00, 0x05, 0x42, 0x80, 0x1A, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x737B, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0xE5, 0x00, 0x01, 0x04, 0x80, 0x1F, 0xF4, 0x00, 0x12, 0xE4, 0x00, 0x1F, 0x3F, 0x80, 0x13, 0xE4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xF4, 0x00, 0x17, 0xE4, 0x00, 0x14, 0x24, 0x00, 0x17, 0xE6, 0x00, 0x1F, 0xEA, 0x00, 0x1A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x28, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x737C, { 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x52, 0x49, 0x00, 0x22, 0x88, 0x80, 0x26, 0xFF, 0x80, 0x54, 0x88, 0x80, 0x14, 0xDD, 0x80, 0x14, 0xAA, 0x80, 0x14, 0xDD, 0x80, 0x36, 0x88, 0x80, 0x52, 0xDD, 0x80, 0x12, 0xAA, 0x80, 0x12, 0xDD, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x64, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x737E, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x47, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x13, 0xDE, 0x00, 0x2A, 0x52, 0x00, 0x4B, 0xDE, 0x00, 0x08, 0xA0, 0x00, 0x19, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x4D, 0x10, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x10, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7380, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x28, 0x85, 0x00, 0x4B, 0x0F, 0x80, 0x09, 0x5A, 0x00, 0x18, 0x8A, 0x00, 0x19, 0x2F, 0x00, 0x29, 0xEA, 0x00, 0x48, 0xAA, 0x00, 0x08, 0x8F, 0x00, 0x09, 0xAA, 0x00, 0x1A, 0xAA, 0x00, 0x70, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7381, { 0x00, 0x00, 0x00, 0x13, 0xCF, 0x00, 0x12, 0x49, 0x00, 0x53, 0xCF, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x54, 0x04, 0x00, 0x15, 0xE4, 0x00, 0x14, 0x87, 0x80, 0x17, 0xFD, 0x00, 0x35, 0x29, 0x00, 0x55, 0xE5, 0x00, 0x15, 0x27, 0x00, 0x15, 0xE2, 0x00, 0x19, 0x27, 0x00, 0x11, 0xE5, 0x00, 0x63, 0x2D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7383, { 0x00, 0x00, 0x00, 0x05, 0xEF, 0x00, 0x45, 0x29, 0x00, 0x29, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x29, 0x29, 0x00, 0x4B, 0xFF, 0x80, 0x0E, 0x10, 0x00, 0x1B, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x46, 0x00, 0x18, 0x38, 0x00, 0x73, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7384, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x10, 0x80, 0x00, 0x09, 0x10, 0x00, 0x06, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x7F, 0x00, 0x3F, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7385, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x52, 0x00, 0x08, 0x52, 0x00, 0x18, 0x53, 0x00, 0x10, 0xD1, 0x00, 0x62, 0x91, 0x80, 0x36, 0x12, 0x00, 0x14, 0x12, 0x00, 0x0C, 0x36, 0x00, 0x18, 0x04, 0x00, 0x12, 0x0C, 0x00, 0x32, 0x18, 0x00, 0x2F, 0x30, 0x00, 0x79, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7386, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x50, 0x00, 0x29, 0x22, 0x00, 0x11, 0x12, 0x00, 0x0A, 0x14, 0x00, 0x04, 0x08, 0x00, 0x05, 0x08, 0x00, 0x08, 0x91, 0x00, 0x13, 0xE7, 0x80, 0x3C, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7387, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x10, 0x81, 0x00, 0x09, 0x22, 0x00, 0x02, 0x44, 0x00, 0x09, 0x82, 0x00, 0x11, 0x09, 0x00, 0x02, 0x7C, 0x80, 0x1F, 0xC2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7389, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x00, 0x42, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x738B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x738E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x7C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x71, 0x83, 0x00, 0x01, 0x01, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7391, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0x08, 0x00, 0x39, 0x09, 0x00, 0x12, 0x09, 0x00, 0x04, 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7393, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x10, 0xC1, 0x00, 0x10, 0x81, 0x00, 0x11, 0x81, 0x00, 0x7C, 0x01, 0x00, 0x10, 0x79, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1C, 0x03, 0x00, 0x70, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7394, { 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0B, 0x49, 0x00, 0x0C, 0x49, 0x00, 0x30, 0x89, 0x00, 0x00, 0x89, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7396, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x38, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x00, 0x0C, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0E, 0x80, 0x80, 0x30, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x739B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0xFC, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x0E, 0x12, 0x00, 0x79, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x739C, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x7C, 0x46, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC3, 0x00, 0x10, 0x81, 0x00, 0x11, 0xA1, 0x80, 0x7C, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x62, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x4F, 0x00, 0x00, 0x79, 0x00, 0x01, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x739E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x1C, 0x44, 0x00, 0x70, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x739F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x18, 0x00, 0x38, 0x24, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73A0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0xC7, 0x00, 0x13, 0x45, 0x80, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1C, 0xC4, 0x00, 0x70, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73A2, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x46, 0x00, 0x10, 0xC2, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x7C, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x62, 0x00, 0x1C, 0x42, 0x00, 0x70, 0xC6, 0x00, 0x01, 0x84, 0x00, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x7C, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x1D, 0x81, 0x00, 0x71, 0x01, 0x00, 0x03, 0x01, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73A6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x7C, 0x12, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x28, 0x00, 0x10, 0x2C, 0x00, 0x1C, 0x64, 0x00, 0x70, 0x46, 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73A7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x00, 0x09, 0x1F, 0x00, 0x3F, 0xE4, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x44, 0x00, 0x00, 0x84, 0x80, 0x00, 0x84, 0x80, 0x01, 0x07, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x0E, 0x24, 0x00, 0x38, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x84, 0x80, 0x03, 0x07, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73AA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x1C, 0x04, 0x00, 0x70, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73AB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x10, 0x46, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x28, 0x00, 0x10, 0x38, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x38, 0x00, 0x70, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73AD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x80, 0x08, 0xFB, 0x00, 0x3E, 0x8C, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0E, 0xF8, 0x80, 0x33, 0x88, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73AE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x22, 0x00, 0x10, 0x2A, 0x00, 0x00, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73AF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x10, 0x68, 0x00, 0x10, 0xA6, 0x00, 0x11, 0x23, 0x00, 0x12, 0x21, 0x00, 0x10, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73B0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x7E, 0x84, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x3E, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x20, 0x00, 0x0E, 0x50, 0x00, 0x78, 0x50, 0x00, 0x20, 0x91, 0x00, 0x01, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73B2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x00, 0x09, 0x00, 0x80, 0x08, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x30, 0x21, 0x00, 0x00, 0x26, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73B3, { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x29, 0x00, 0x3E, 0x48, 0x00, 0x08, 0xC8, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x4F, 0x80, 0x0A, 0x78, 0x00, 0x3E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x30, 0x44, 0x00, 0x00, 0x44, 0x80, 0x00, 0x42, 0x80, 0x00, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73B5, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73B7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x1D, 0x02, 0x00, 0x71, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73B9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x20, 0x00, 0x3E, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x22, 0x00, 0x0C, 0x41, 0x00, 0x30, 0x9F, 0x80, 0x03, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73BA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x24, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x11, 0x84, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73BB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x11, 0x00, 0x7D, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x41, 0x00, 0x11, 0x43, 0x00, 0x11, 0x66, 0x00, 0x1F, 0x2C, 0x00, 0x72, 0x18, 0x00, 0x06, 0x3C, 0x00, 0x00, 0x66, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73BC, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x45, 0x80, 0x11, 0x77, 0x00, 0x7D, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x1D, 0x44, 0x00, 0x71, 0x74, 0x80, 0x01, 0xC4, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73BD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x13, 0x01, 0x00, 0x10, 0xF9, 0x00, 0x7C, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0xF9, 0x00, 0x1C, 0x01, 0x00, 0x70, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x61, 0x00, 0x10, 0x43, 0x00, 0x10, 0xC2, 0x00, 0x7D, 0x8E, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x70, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73C0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x3E, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x0E, 0x40, 0x80, 0x30, 0x7F, 0x80, 0x00, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73C5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x7D, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73C6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x60, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xF1, 0x80, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x70, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73C8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x10, 0x87, 0x80, 0x13, 0xF4, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x7C, 0x94, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x11, 0x94, 0x80, 0x11, 0x14, 0x80, 0x1D, 0x34, 0x80, 0x73, 0x24, 0x80, 0x02, 0x27, 0x80, 0x06, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0E, 0x84, 0x00, 0x30, 0xF4, 0x80, 0x01, 0x82, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x0E, 0xA5, 0x00, 0x30, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73CB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x60, 0x00, 0x11, 0xC7, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x1D, 0xE4, 0x80, 0x73, 0x27, 0x80, 0x00, 0x24, 0x00, 0x00, 0x64, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73CC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x11, 0x00, 0x3E, 0x09, 0x00, 0x08, 0x01, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0A, 0x50, 0x80, 0x08, 0x50, 0x80, 0x0E, 0x61, 0x00, 0x38, 0x41, 0x00, 0x00, 0xBF, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73CD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x89, 0x80, 0x09, 0x08, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x44, 0x00, 0x08, 0x88, 0x80, 0x08, 0x11, 0x00, 0x0A, 0x22, 0x00, 0x0C, 0xC4, 0x00, 0x30, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73CE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x11, 0x88, 0x00, 0x10, 0x08, 0x00, 0x7C, 0x08, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0xC9, 0x80, 0x1C, 0x88, 0x80, 0x70, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x0E, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73D0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x1C, 0x84, 0x00, 0x71, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73D1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x50, 0x00, 0x3E, 0x4C, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x3E, 0x50, 0x00, 0x08, 0x52, 0x00, 0x08, 0x92, 0x00, 0x08, 0x94, 0x00, 0x08, 0x98, 0x00, 0x0F, 0x10, 0x00, 0x39, 0x31, 0x00, 0x12, 0x51, 0x00, 0x04, 0x0F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73D2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x7C, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73D3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x10, 0x10, 0x00, 0x1C, 0x38, 0x00, 0x70, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73D6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x30, 0x84, 0x00, 0x00, 0x84, 0x80, 0x01, 0x04, 0x80, 0x06, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73D9, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x38, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x11, 0x80, 0x08, 0x32, 0x80, 0x08, 0x54, 0x80, 0x08, 0x98, 0x80, 0x09, 0x10, 0x80, 0x3E, 0x11, 0x80, 0x08, 0x11, 0x80, 0x08, 0x32, 0x80, 0x08, 0x54, 0x80, 0x0E, 0x98, 0x80, 0x39, 0x10, 0x80, 0x02, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73DE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x24, 0x00, 0x08, 0x18, 0x00, 0x3E, 0x16, 0x00, 0x08, 0x21, 0x80, 0x08, 0xC0, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x30, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73E0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x09, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x0E, 0x54, 0x00, 0x38, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x3F, 0x80, 0x78, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73E3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x0C, 0xFC, 0x80, 0x3E, 0x84, 0x80, 0x08, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x08, 0xFC, 0x80, 0x08, 0x84, 0x80, 0x0E, 0x00, 0x80, 0x30, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73E4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3E, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x0E, 0x91, 0x00, 0x30, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0E, 0x4F, 0x80, 0x31, 0xF2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73E6, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x3E, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xBD, 0x00, 0x08, 0x81, 0x00, 0x0E, 0x81, 0x00, 0x38, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73E7, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x12, 0x49, 0x00, 0x13, 0x4B, 0x00, 0x11, 0x4E, 0x00, 0x11, 0x48, 0x00, 0x7C, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x4E, 0x00, 0x11, 0xCB, 0x00, 0x17, 0x49, 0x00, 0x10, 0x48, 0x00, 0x1C, 0xC8, 0x00, 0x70, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x3E, 0x80, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x9F, 0x80, 0x3F, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x30, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73EA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73ED, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x2F, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x3F, 0x22, 0x00, 0x09, 0x2F, 0x80, 0x0A, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x38, 0x83, 0x80, 0x01, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x7E, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x12, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x1E, 0xBA, 0x00, 0x72, 0x22, 0x00, 0x06, 0x22, 0x80, 0x04, 0x22, 0x80, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73F1, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x01, 0x31, 0x80, 0x7D, 0x91, 0x00, 0x10, 0x93, 0x00, 0x10, 0x82, 0x00, 0x10, 0x00, 0x00, 0x10, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x86, 0x00, 0x1C, 0xF4, 0x00, 0x70, 0x1E, 0x00, 0x00, 0x73, 0x00, 0x01, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x7D, 0x21, 0x00, 0x12, 0x22, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x7C, 0x50, 0x00, 0x10, 0x94, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x14, 0x12, 0x00, 0x1B, 0xFF, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73F4, { 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x7C, 0xCB, 0x00, 0x13, 0x89, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x88, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0xEB, 0x00, 0x13, 0x8A, 0x00, 0x10, 0x8E, 0x00, 0x1C, 0x84, 0x80, 0x70, 0x8E, 0x80, 0x00, 0x9B, 0x80, 0x03, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x07, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73F7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x00, 0x3E, 0xE9, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x09, 0x78, 0x00, 0x09, 0x48, 0x00, 0x09, 0x48, 0x00, 0x0F, 0x48, 0x00, 0x31, 0x74, 0x00, 0x03, 0x84, 0x80, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x7C, 0x22, 0x00, 0x10, 0x22, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x70, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73F9, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xE9, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2C, 0x00, 0x0F, 0xCC, 0x00, 0x32, 0x08, 0x00, 0x02, 0x14, 0x80, 0x04, 0x62, 0x80, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x73FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x7C, 0x22, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x1D, 0xC1, 0x00, 0x73, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73FB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x13, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x11, 0x02, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x22, 0x00, 0x71, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE3, 0x00, 0x3E, 0x5C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0xE4, 0x00, 0x3E, 0x3F, 0x80, 0x08, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x09, 0x44, 0x00, 0x0E, 0x9F, 0x00, 0x30, 0x80, 0x00, 0x01, 0x60, 0x00, 0x02, 0x1F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x48, 0x00, 0x00, 0x88, 0x80, 0x01, 0x0F, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x73FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x90, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x1D, 0x90, 0x00, 0x71, 0x50, 0x00, 0x03, 0x38, 0x00, 0x06, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7400, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7401, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x80, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x09, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x30, 0x88, 0x00, 0x00, 0xC8, 0x00, 0x01, 0x3F, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7403, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x34, 0x00, 0x08, 0x18, 0x00, 0x08, 0x34, 0x00, 0x08, 0x54, 0x00, 0x3E, 0x92, 0x00, 0x03, 0x12, 0x00, 0x0C, 0x11, 0x00, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7405, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x94, 0x00, 0x0E, 0x88, 0x00, 0x30, 0xFC, 0x00, 0x03, 0x82, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3F, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x30, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7407, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x88, 0x80, 0x09, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x08, 0x27, 0x80, 0x0E, 0x40, 0x80, 0x30, 0x40, 0x80, 0x00, 0x81, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7409, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x42, 0x00, 0x08, 0x9F, 0x00, 0x3F, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x0E, 0x52, 0x00, 0x30, 0x92, 0x00, 0x00, 0x92, 0x00, 0x01, 0x12, 0x80, 0x06, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x740A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF7, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x25, 0x00, 0x7D, 0x25, 0x00, 0x13, 0xF5, 0x00, 0x10, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x1D, 0xA4, 0x80, 0x71, 0x24, 0x80, 0x03, 0x25, 0x80, 0x06, 0x24, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x740F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x7D, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0x28, 0x00, 0x7D, 0x48, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x08, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x08, 0x00, 0x71, 0x08, 0x00, 0x22, 0x8B, 0x00, 0x04, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7410, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x92, 0x00, 0x7E, 0x52, 0x00, 0x08, 0x54, 0x00, 0x08, 0x12, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0x10, 0x00, 0x20, 0x2C, 0x00, 0x00, 0xC2, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7411, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x7D, 0x11, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x1D, 0x01, 0x00, 0x71, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7413, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0x44, 0x00, 0x38, 0x44, 0x00, 0x00, 0x84, 0x80, 0x01, 0x07, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x741A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x41, 0x00, 0x73, 0x41, 0x00, 0x02, 0x41, 0x00, 0x06, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x741B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0x28, 0x80, 0x08, 0x29, 0x00, 0x08, 0x4F, 0x00, 0x09, 0x80, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x38, 0x00, 0x0E, 0x54, 0x00, 0x38, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7420, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x00, 0x00, 0x30, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7421, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x9F, 0x00, 0x3E, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x8A, 0x00, 0x0B, 0xFA, 0x00, 0x3E, 0x86, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xA4, 0x00, 0x0C, 0xA4, 0x00, 0x08, 0xAA, 0x00, 0x0E, 0x8A, 0x00, 0x30, 0x91, 0x00, 0x00, 0x91, 0x00, 0x01, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0x48, 0x80, 0x08, 0xC9, 0x00, 0x0B, 0x26, 0x00, 0x3E, 0x34, 0x00, 0x09, 0x5C, 0x00, 0x08, 0x8C, 0x00, 0x0B, 0x5A, 0x00, 0x0E, 0x2A, 0x00, 0x38, 0x4A, 0x00, 0x00, 0x89, 0x00, 0x03, 0x11, 0x00, 0x0C, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7424, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x00, 0x7D, 0xF2, 0x00, 0x10, 0x53, 0x00, 0x10, 0x89, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x11, 0x00, 0x7C, 0x11, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x10, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7425, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x00, 0x3E, 0x20, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x21, 0x00, 0x09, 0x3E, 0x00, 0x09, 0xE0, 0x80, 0x3F, 0x3F, 0x80, 0x09, 0x00, 0x00, 0x09, 0x3C, 0x00, 0x09, 0x24, 0x00, 0x0F, 0x24, 0x00, 0x39, 0x44, 0x00, 0x02, 0x44, 0x80, 0x02, 0x87, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7426, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3E, 0x28, 0x00, 0x08, 0x46, 0x00, 0x09, 0x81, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0xF2, 0x00, 0x0E, 0x92, 0x00, 0x30, 0xF2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7428, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x80, 0x08, 0x89, 0x00, 0x08, 0xFA, 0x00, 0x0B, 0x8C, 0x00, 0x0C, 0x88, 0x00, 0x30, 0xF8, 0x80, 0x03, 0x8F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x11, 0x00, 0x80, 0x1D, 0xFF, 0x80, 0x71, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x742A, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x0D, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x742B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x82, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x08, 0xFE, 0x00, 0x0E, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x742C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x09, 0x00, 0x80, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x99, 0x00, 0x08, 0x99, 0x00, 0x09, 0x69, 0x00, 0x0A, 0x2B, 0x00, 0x0E, 0x48, 0x00, 0x30, 0x48, 0x00, 0x00, 0x88, 0x80, 0x01, 0x0F, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x742D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x7C, 0xC2, 0x00, 0x10, 0x86, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x10, 0x91, 0x00, 0x10, 0xD3, 0x00, 0x10, 0x5A, 0x00, 0x10, 0x3C, 0x00, 0x1C, 0x56, 0x00, 0x70, 0xD3, 0x00, 0x01, 0x91, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x742E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x4A, 0x00, 0x00, 0x89, 0x00, 0x01, 0x08, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x742F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0x7F, 0x00, 0x38, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7430, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x51, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x94, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x08, 0x51, 0x00, 0x0E, 0x52, 0x00, 0x38, 0x94, 0x00, 0x00, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x11, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x11, 0x00, 0x11, 0x7D, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x11, 0x45, 0x00, 0x1D, 0x7D, 0x00, 0x71, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7432, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x7C, 0x24, 0x00, 0x11, 0xE7, 0x80, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x7C, 0x24, 0x00, 0x11, 0xE7, 0x80, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x1C, 0xE7, 0x80, 0x73, 0xA4, 0x00, 0x00, 0x24, 0x00, 0x00, 0x64, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7433, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3C, 0x84, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x11, 0x8E, 0x00, 0x11, 0xCE, 0x00, 0x3E, 0xB5, 0x00, 0x12, 0x95, 0x00, 0x14, 0xA4, 0x80, 0x10, 0x84, 0x00, 0x1C, 0x84, 0x00, 0x30, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x07, 0xBF, 0x80, 0x38, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x06, 0x00, 0x0D, 0xF9, 0x80, 0x30, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7435, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x07, 0x84, 0x00, 0x38, 0x7F, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x0F, 0xD3, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x10, 0x80, 0x08, 0x10, 0x80, 0x0F, 0xDF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x1F, 0x9F, 0x80, 0x02, 0x04, 0x00, 0x3F, 0xDF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7438, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7439, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x78, 0xBF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x743A, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x44, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x09, 0x3F, 0x00, 0x08, 0x84, 0x00, 0x08, 0x04, 0x00, 0x3E, 0x84, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x10, 0x00, 0x31, 0x11, 0x00, 0x01, 0x27, 0x00, 0x02, 0x78, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x743C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x20, 0x00, 0x7C, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x7D, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x1C, 0xA8, 0x00, 0x71, 0xA6, 0x00, 0x22, 0x22, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x743F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7440, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x78, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x8A, 0x80, 0x0E, 0x8E, 0x80, 0x30, 0xF1, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x0E, 0x42, 0x00, 0x30, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7443, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x0B, 0xFF, 0x80, 0x3C, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x08, 0xFE, 0x00, 0x0E, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7444, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0x00, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x90, 0x00, 0x11, 0xFF, 0x00, 0x13, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7447, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x11, 0x02, 0x00, 0x1D, 0x12, 0x00, 0x71, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x744B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0xFF, 0x00, 0x30, 0x88, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x744D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x7D, 0x84, 0x00, 0x11, 0x08, 0x00, 0x13, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x7D, 0x29, 0x00, 0x11, 0x4F, 0x00, 0x11, 0x81, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x28, 0x00, 0x70, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7451, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x7C, 0xA1, 0x00, 0x11, 0x33, 0x00, 0x10, 0x56, 0x00, 0x10, 0x98, 0x00, 0x11, 0x34, 0x00, 0x1C, 0x56, 0x00, 0x70, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7452, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x13, 0x29, 0x00, 0x1C, 0x49, 0x00, 0x71, 0x93, 0x00, 0x00, 0x22, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x3F, 0x21, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x00, 0x00, 0x3F, 0x1F, 0x00, 0x09, 0xD1, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x31, 0x0A, 0x00, 0x01, 0x11, 0x00, 0x01, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7457, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF9, 0x00, 0x3E, 0x90, 0x80, 0x09, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x0E, 0x42, 0x00, 0x30, 0xA4, 0x00, 0x01, 0x18, 0x00, 0x02, 0x36, 0x00, 0x0C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x92, 0x00, 0x09, 0x24, 0x00, 0x08, 0x92, 0x00, 0x08, 0x49, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x45, 0x00, 0x0F, 0x29, 0x00, 0x31, 0x19, 0x00, 0x01, 0x65, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x745A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x47, 0x80, 0x3E, 0x44, 0x80, 0x08, 0x44, 0x80, 0x0B, 0xFC, 0x80, 0x08, 0x47, 0x80, 0x08, 0x44, 0x80, 0x3E, 0x44, 0x80, 0x08, 0x44, 0x80, 0x09, 0xF7, 0x80, 0x09, 0x14, 0x80, 0x09, 0x14, 0x80, 0x0F, 0x14, 0x80, 0x39, 0x14, 0x80, 0x01, 0xF4, 0x80, 0x01, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x745B, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x54, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3F, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x0E, 0x28, 0x00, 0x30, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x745C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x80, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xF2, 0x80, 0x08, 0x94, 0x80, 0x08, 0xF9, 0x00, 0x08, 0x9A, 0x00, 0x0E, 0xF9, 0x00, 0x30, 0x95, 0x00, 0x00, 0x92, 0x80, 0x00, 0xB2, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x745D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x745E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0E, 0xFF, 0x80, 0x30, 0x94, 0x80, 0x00, 0x94, 0x80, 0x00, 0x94, 0x80, 0x00, 0x94, 0x80, 0x00, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x745F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x07, 0x84, 0x00, 0x38, 0x7F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x12, 0x51, 0x00, 0x12, 0x21, 0x00, 0x22, 0x44, 0x80, 0x23, 0x84, 0x80, 0x0F, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7460, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x01, 0xDF, 0x80, 0x3F, 0x04, 0x80, 0x09, 0x04, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0xD8, 0x80, 0x3F, 0x13, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x09, 0x10, 0x80, 0x0F, 0xFF, 0x80, 0x31, 0x10, 0x80, 0x01, 0x10, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7462, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xC9, 0x80, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7463, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x7D, 0x93, 0x00, 0x11, 0x11, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x71, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7464, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x00, 0x3E, 0x62, 0x00, 0x08, 0x94, 0x00, 0x09, 0x48, 0x00, 0x0A, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x3F, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x10, 0x00, 0x31, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xC6, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x0F, 0x29, 0x00, 0x39, 0x29, 0x00, 0x01, 0x29, 0x00, 0x01, 0x29, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7466, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x7D, 0xFE, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1C, 0x01, 0x00, 0x71, 0x55, 0x00, 0x03, 0x55, 0x00, 0x06, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7467, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x28, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x9A, 0x00, 0x13, 0x71, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x1C, 0xD6, 0x00, 0x71, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x99, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x80, 0x3E, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x81, 0x00, 0x0C, 0xFF, 0x00, 0x30, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7469, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x15, 0x14, 0x80, 0x16, 0x15, 0x00, 0x24, 0xA6, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x20, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x746A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x84, 0x80, 0x30, 0x22, 0x80, 0x00, 0x90, 0x80, 0x02, 0x41, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x746B, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x00, 0x7D, 0xF0, 0x00, 0x10, 0x24, 0x00, 0x10, 0xB6, 0x00, 0x11, 0x93, 0x00, 0x11, 0x01, 0x00, 0x7C, 0x60, 0x00, 0x11, 0xCF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xEF, 0x00, 0x1D, 0x01, 0x00, 0x71, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x746D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x09, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x41, 0x00, 0x71, 0x41, 0x00, 0x02, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x746E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x48, 0x00, 0x10, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x1C, 0x92, 0x00, 0x71, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x746F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xF7, 0x80, 0x3F, 0x14, 0x80, 0x09, 0x14, 0x80, 0x09, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x09, 0x14, 0x80, 0x3F, 0xF4, 0x80, 0x09, 0x04, 0x80, 0x09, 0x4C, 0x80, 0x09, 0x34, 0x80, 0x0F, 0x14, 0x80, 0x31, 0xF5, 0x80, 0x03, 0x14, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7470, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4A, 0x80, 0x1C, 0xCF, 0x80, 0x70, 0x88, 0x00, 0x01, 0x88, 0x80, 0x03, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7471, { 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0xFC, 0x00, 0x7C, 0x80, 0x80, 0x10, 0x7F, 0x80, 0x10, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x7D, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x00, 0x00, 0x71, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7472, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x41, 0x00, 0x03, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7473, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x1C, 0xFF, 0x00, 0x71, 0x88, 0x00, 0x06, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7476, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x00, 0x7D, 0xF1, 0x00, 0x10, 0x23, 0x00, 0x11, 0x12, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1D, 0x11, 0x00, 0x71, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7477, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x0B, 0xE0, 0x00, 0x7D, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x7C, 0x42, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x1D, 0x50, 0x00, 0x72, 0x20, 0x00, 0x24, 0x50, 0x00, 0x00, 0x8F, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x747E, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0E, 0x08, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7480, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x90, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x13, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x1D, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7481, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x5D, 0x00, 0x11, 0x25, 0x00, 0x11, 0x55, 0x00, 0x7D, 0x09, 0x00, 0x11, 0x15, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x1D, 0x59, 0x00, 0x71, 0x49, 0x80, 0x03, 0x62, 0x80, 0x02, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7482, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x0E, 0x7F, 0x00, 0x38, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7483, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0xAA, 0x00, 0x08, 0x92, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x25, 0x00, 0x0B, 0x4F, 0x00, 0x0D, 0xF3, 0x00, 0x31, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7485, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x7D, 0x24, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x1C, 0xD6, 0x00, 0x71, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x7C, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x10, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x10, 0x11, 0x00, 0x7C, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x10, 0x10, 0x00, 0x10, 0xE4, 0x00, 0x1C, 0x19, 0x00, 0x70, 0xE2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7487, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xDF, 0x80, 0x11, 0x20, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3F, 0x80, 0x3D, 0xC5, 0x00, 0x11, 0x44, 0x00, 0x11, 0x54, 0x00, 0x11, 0x57, 0x80, 0x1D, 0x54, 0x00, 0x32, 0x54, 0x00, 0x02, 0x54, 0x00, 0x04, 0xAC, 0x00, 0x09, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7489, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x38, 0x7F, 0x00, 0x10, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x38, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x17, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x08, 0x00, 0x31, 0x88, 0x00, 0x02, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x748B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x3F, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x748E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x7E, 0xD6, 0x00, 0x12, 0xD6, 0x00, 0x13, 0x5A, 0x00, 0x13, 0x5A, 0x00, 0x7D, 0x8C, 0x00, 0x12, 0x52, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x1C, 0x88, 0x00, 0x70, 0x50, 0x00, 0x20, 0x20, 0x00, 0x00, 0xD8, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x748F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x7C, 0xC2, 0x00, 0x10, 0x86, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x20, 0x00, 0x12, 0x3A, 0x00, 0x12, 0x52, 0x80, 0x13, 0x93, 0x00, 0x12, 0x7A, 0x00, 0x1E, 0x12, 0x00, 0x72, 0x12, 0x00, 0x03, 0xAA, 0x80, 0x06, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7490, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0xC4, 0x00, 0x7A, 0x4F, 0x00, 0x12, 0x59, 0x00, 0x12, 0x73, 0x00, 0x12, 0x4E, 0x00, 0x13, 0xC4, 0x00, 0x78, 0x8E, 0x00, 0x12, 0x9B, 0x00, 0x12, 0xD1, 0x80, 0x12, 0x80, 0x00, 0x12, 0x9F, 0x00, 0x1A, 0x91, 0x00, 0x72, 0xF1, 0x00, 0x03, 0x91, 0x00, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7491, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7D, 0xFF, 0x80, 0x13, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0xAA, 0x00, 0x01, 0xAB, 0x00, 0x03, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7492, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF4, 0x00, 0x7D, 0x18, 0x80, 0x10, 0xA5, 0x00, 0x10, 0x42, 0x00, 0x11, 0xBD, 0x80, 0x10, 0x00, 0x00, 0x7C, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x1C, 0x42, 0x00, 0x70, 0x66, 0x00, 0x00, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7498, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x3F, 0x11, 0x80, 0x08, 0x84, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x34, 0x00, 0x0B, 0x54, 0x00, 0x0C, 0xFF, 0x80, 0x30, 0x84, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7499, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x11, 0x45, 0x00, 0x10, 0x82, 0x00, 0x7D, 0xFF, 0x00, 0x12, 0x82, 0x80, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x749A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x22, 0x00, 0x10, 0x14, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x29, 0x00, 0x10, 0x4A, 0x00, 0x7C, 0x98, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0x44, 0x80, 0x11, 0xBF, 0x80, 0x1D, 0x24, 0x80, 0x71, 0x24, 0x80, 0x01, 0x3C, 0x80, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x749C, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x0E, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x749E, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x01, 0x29, 0x00, 0x00, 0xAA, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x10, 0x00, 0x30, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x749F, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x30, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0x11, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74A0, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF8, 0x00, 0x7D, 0x11, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x7D, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74A1, { 0x00, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x92, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0x24, 0x00, 0x09, 0x3F, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x0B, 0x3F, 0x00, 0x09, 0x24, 0x00, 0x0F, 0x24, 0x00, 0x39, 0x3F, 0x80, 0x01, 0xA0, 0x00, 0x02, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x28, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x7D, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x28, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0x11, 0x00, 0x71, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74A3, { 0x00, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0xA4, 0x00, 0x3F, 0x29, 0x00, 0x08, 0x71, 0x00, 0x09, 0xAE, 0x00, 0x08, 0xA4, 0x00, 0x09, 0x3F, 0x80, 0x3F, 0xF4, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x91, 0x00, 0x08, 0x92, 0x00, 0x0D, 0x4C, 0x00, 0x32, 0x0C, 0x80, 0x00, 0x32, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74A5, { 0x00, 0x00, 0x00, 0x01, 0x22, 0x00, 0x01, 0x22, 0x00, 0x03, 0xF4, 0x00, 0x39, 0x27, 0x80, 0x11, 0x25, 0x00, 0x10, 0x8D, 0x00, 0x11, 0xF5, 0x00, 0x3A, 0x15, 0x00, 0x15, 0xD5, 0x00, 0x11, 0x56, 0x00, 0x11, 0x52, 0x00, 0x1F, 0x52, 0x00, 0x31, 0xD2, 0x00, 0x00, 0x15, 0x00, 0x00, 0x25, 0x00, 0x00, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74A6, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x03, 0xFC, 0x00, 0x7D, 0x21, 0x00, 0x10, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x7D, 0x49, 0x00, 0x11, 0x42, 0x80, 0x12, 0x3E, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x1D, 0x82, 0x00, 0x73, 0x4C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74A7, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0xBF, 0x80, 0x38, 0x84, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x84, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74A8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x09, 0x59, 0x00, 0x0B, 0x2A, 0x00, 0x0C, 0xC4, 0x00, 0x08, 0x8A, 0x00, 0x3F, 0x31, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x54, 0x00, 0x0F, 0xFF, 0x80, 0x30, 0x38, 0x00, 0x00, 0x54, 0x00, 0x01, 0x92, 0x00, 0x06, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74A9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x3F, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x20, 0x80, 0x12, 0xFC, 0x00, 0x7E, 0x21, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x1E, 0xD1, 0x00, 0x72, 0x2A, 0x00, 0x02, 0xDC, 0x00, 0x04, 0x2A, 0x00, 0x01, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x38, 0x00, 0x30, 0x54, 0x00, 0x00, 0x92, 0x00, 0x03, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74AB, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x01, 0x93, 0x00, 0x7C, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x12, 0xFE, 0x80, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74AE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x7D, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74AF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x7C, 0xC6, 0x00, 0x13, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x55, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x28, 0x00, 0x0E, 0x69, 0x00, 0x38, 0xA6, 0x00, 0x07, 0x24, 0x00, 0x00, 0x7A, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74B1, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x13, 0xE7, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xEF, 0x80, 0x13, 0xA0, 0x00, 0x10, 0x30, 0x00, 0x10, 0x14, 0x00, 0x10, 0xA5, 0x00, 0x10, 0xAD, 0x80, 0x1D, 0xA8, 0x80, 0x71, 0x32, 0x00, 0x00, 0xE2, 0x00, 0x03, 0x9E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74B2, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x41, 0x00, 0x0A, 0xBE, 0x80, 0x09, 0x19, 0x00, 0x08, 0x2E, 0x00, 0x3E, 0xD4, 0x00, 0x08, 0x26, 0x00, 0x0B, 0x4D, 0x00, 0x09, 0x15, 0x00, 0x0F, 0x64, 0x80, 0x31, 0x18, 0x80, 0x01, 0x80, 0x00, 0x02, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74B5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0xD3, 0x00, 0x3E, 0x99, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xDF, 0x00, 0x3E, 0x81, 0x00, 0x08, 0x9D, 0x00, 0x08, 0xE7, 0x00, 0x08, 0x95, 0x00, 0x0E, 0x95, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74B9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x7E, 0x00, 0x3E, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0E, 0xEA, 0x00, 0x30, 0xA6, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74BA, { 0x00, 0x00, 0x00, 0x07, 0xF2, 0x00, 0x3C, 0x1F, 0x00, 0x25, 0xD2, 0x00, 0x34, 0x16, 0x00, 0x25, 0xD2, 0x00, 0x35, 0x56, 0x00, 0x25, 0xD2, 0x00, 0x24, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x40, 0x01, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74BB, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x00, 0xA2, 0x80, 0x7D, 0x2C, 0x80, 0x10, 0xE3, 0x80, 0x13, 0xAE, 0x80, 0x10, 0x20, 0x80, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC7, 0x00, 0x13, 0x6D, 0x80, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74BD, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x1F, 0xFF, 0x00, 0x15, 0x55, 0x00, 0x13, 0x4D, 0x00, 0x14, 0xD3, 0x00, 0x15, 0x55, 0x00, 0x12, 0x49, 0x00, 0x15, 0x55, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74BF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x9C, 0x80, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x3E, 0x18, 0x00, 0x08, 0x66, 0x00, 0x09, 0x81, 0x80, 0x08, 0xFE, 0x00, 0x0E, 0x42, 0x00, 0x30, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74C6, { 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x01, 0xCE, 0x00, 0x3F, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x29, 0x00, 0x0A, 0x31, 0x00, 0x0A, 0x21, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74C8, { 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x03, 0xC8, 0x00, 0x7C, 0x9F, 0x80, 0x10, 0x92, 0x80, 0x17, 0xE6, 0x80, 0x12, 0x8C, 0x80, 0x16, 0xE0, 0x80, 0x7C, 0x93, 0x80, 0x10, 0x38, 0x00, 0x10, 0xEE, 0x00, 0x13, 0x83, 0x80, 0x10, 0x10, 0x00, 0x1D, 0x93, 0x00, 0x70, 0x7C, 0x00, 0x00, 0xD6, 0x00, 0x03, 0xB3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74C9, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x03, 0xEF, 0x80, 0x7C, 0x82, 0x00, 0x13, 0xEF, 0x80, 0x10, 0x82, 0x00, 0x11, 0x45, 0x00, 0x12, 0x28, 0x80, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74CA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7E, 0x00, 0x3E, 0x84, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x28, 0x80, 0x09, 0xCF, 0x80, 0x08, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0B, 0x7E, 0x00, 0x3C, 0xA4, 0x00, 0x01, 0x18, 0x00, 0x02, 0x67, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74CC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x00, 0x00, 0x13, 0xD7, 0x80, 0x10, 0x10, 0x00, 0x13, 0xD7, 0x80, 0x1C, 0x38, 0x00, 0x70, 0xE8, 0x80, 0x07, 0x8D, 0x00, 0x00, 0x86, 0x00, 0x00, 0xF3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74CF, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3B, 0xEF, 0x80, 0x12, 0x48, 0x00, 0x11, 0x4F, 0x80, 0x17, 0xF0, 0x80, 0x10, 0x0F, 0x80, 0x3B, 0xE8, 0x00, 0x12, 0x28, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x28, 0x00, 0x13, 0xE8, 0x00, 0x1E, 0x2F, 0x80, 0x32, 0x28, 0x00, 0x02, 0x28, 0x80, 0x02, 0x6F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74D0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x7E, 0x00, 0x11, 0x10, 0x80, 0x7D, 0x7F, 0x80, 0x11, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x1D, 0x00, 0x00, 0x72, 0xFF, 0x00, 0x00, 0xA9, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74D2, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x02, 0x94, 0x00, 0x7B, 0xDE, 0x00, 0x14, 0xA4, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x8C, 0x00, 0x7A, 0xD5, 0x00, 0x14, 0xA7, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x24, 0x00, 0x1D, 0x24, 0x00, 0x71, 0x24, 0x00, 0x20, 0x58, 0x00, 0x00, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74D3, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x02, 0x28, 0x80, 0x7F, 0xEF, 0x80, 0x12, 0x28, 0x80, 0x13, 0xEF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x7E, 0x10, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x92, 0x80, 0x12, 0xD6, 0x80, 0x12, 0xBA, 0x80, 0x1E, 0xFE, 0x80, 0x72, 0x54, 0x80, 0x02, 0x92, 0x80, 0x02, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x0A, 0x50, 0x80, 0x0F, 0xFF, 0x80, 0x38, 0x84, 0x00, 0x01, 0xC8, 0x00, 0x02, 0x30, 0x00, 0x00, 0xCC, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74D8, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x0E, 0xFF, 0x00, 0x30, 0x90, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74DA, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x03, 0xFF, 0x00, 0x3E, 0x84, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x09, 0x4A, 0x00, 0x0A, 0x31, 0x80, 0x3F, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x0B, 0x01, 0x00, 0x0D, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74DB, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0xE2, 0x80, 0x70, 0x82, 0x80, 0x2F, 0xF2, 0x00, 0x28, 0x92, 0x00, 0x2B, 0xEF, 0x80, 0x28, 0x92, 0x00, 0x7F, 0xF2, 0x00, 0x29, 0x22, 0x00, 0x29, 0xE2, 0x00, 0x28, 0x02, 0x00, 0x3F, 0xF7, 0x00, 0x6D, 0x55, 0x00, 0x0E, 0x75, 0x00, 0x15, 0xDD, 0x00, 0x04, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74DC, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x92, 0x00, 0x10, 0x8A, 0x00, 0x10, 0xFA, 0x00, 0x2F, 0x05, 0x00, 0x20, 0x05, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74DE, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x0E, 0x28, 0x00, 0x3A, 0x28, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x16, 0x00, 0x2B, 0x33, 0x00, 0x29, 0x61, 0x00, 0x29, 0x80, 0x00, 0x6A, 0xC0, 0x00, 0x4E, 0x70, 0x00, 0x5A, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74DF, { 0x00, 0x00, 0x00, 0x03, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x3A, 0x3F, 0x00, 0x22, 0x61, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0xFD, 0x00, 0x2A, 0x25, 0x00, 0x2A, 0x25, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0x26, 0x00, 0x29, 0x20, 0x80, 0x29, 0xB1, 0x80, 0x6A, 0xDF, 0x00, 0x4E, 0x60, 0x00, 0x5A, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74E0, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x80, 0x04, 0x7E, 0x00, 0x3F, 0xD2, 0x00, 0x0A, 0x52, 0x00, 0x11, 0x52, 0x00, 0x20, 0xD2, 0x00, 0x1F, 0x52, 0x00, 0x00, 0x52, 0x00, 0x3F, 0xD2, 0x00, 0x10, 0x51, 0x00, 0x1F, 0x51, 0x00, 0x21, 0x55, 0x00, 0x01, 0x53, 0x00, 0x01, 0x5F, 0x00, 0x02, 0xF0, 0x80, 0x0D, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74E2, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x8E, 0x00, 0x0A, 0x3A, 0x00, 0x3F, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3F, 0xAA, 0x00, 0x00, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x4D, 0x00, 0x24, 0x71, 0x00, 0x0C, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74E3, { 0x00, 0x00, 0x00, 0x08, 0x62, 0x00, 0x09, 0x82, 0x00, 0x09, 0x12, 0x00, 0x3F, 0x5F, 0x80, 0x01, 0x50, 0x00, 0x23, 0x58, 0x80, 0x15, 0x55, 0x00, 0x3F, 0x5F, 0x80, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x0F, 0x52, 0x00, 0x39, 0x5F, 0x80, 0x09, 0x52, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x24, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74E4, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x80, 0x7F, 0xC7, 0x00, 0x00, 0x3D, 0x00, 0x3B, 0xA1, 0x00, 0x2A, 0xA9, 0x00, 0x3B, 0xA9, 0x00, 0x11, 0x29, 0x00, 0x3F, 0xA9, 0x00, 0x11, 0x29, 0x00, 0x3F, 0xA9, 0x00, 0x11, 0x29, 0x00, 0x7F, 0xE9, 0x00, 0x0A, 0x29, 0x80, 0x72, 0xAA, 0x80, 0x1D, 0x2E, 0x80, 0x30, 0xDA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x88, 0x00, 0x04, 0x48, 0x00, 0x04, 0x28, 0x00, 0x08, 0x08, 0x00, 0x08, 0x78, 0x00, 0x0F, 0x90, 0x80, 0x38, 0x10, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74E7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x32, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2E, 0x08, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xB4, 0x00, 0x1C, 0x94, 0x00, 0x71, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x80, 0x01, 0xE4, 0x80, 0x07, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74E9, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x20, 0x78, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x32, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2E, 0x08, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x51, 0x00, 0x22, 0x5B, 0x00, 0x32, 0x4A, 0x00, 0x2A, 0x4E, 0x00, 0x2A, 0xC4, 0x00, 0x22, 0x8E, 0x00, 0x23, 0x9B, 0x00, 0x22, 0x31, 0x80, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74EB, { 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x77, 0xFB, 0x80, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x05, 0x08, 0x00, 0x0D, 0x88, 0x00, 0x08, 0x88, 0x80, 0x0F, 0xF9, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x04, 0x82, 0x00, 0x09, 0x09, 0x00, 0x32, 0x7C, 0x80, 0x0F, 0x82, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x04, 0x44, 0x80, 0x08, 0xFC, 0x80, 0x3F, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x2F, 0x20, 0x00, 0x21, 0x3E, 0x00, 0x25, 0x22, 0x00, 0x27, 0x22, 0x00, 0x22, 0x32, 0x00, 0x27, 0x2A, 0x00, 0x2D, 0x2A, 0x00, 0x20, 0x22, 0x00, 0x30, 0x22, 0x00, 0x1F, 0x22, 0x80, 0x00, 0x3E, 0x80, 0x00, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74F0, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x20, 0x66, 0x00, 0x20, 0x42, 0x00, 0x3E, 0xC3, 0x00, 0x23, 0x81, 0x80, 0x22, 0x7E, 0x00, 0x32, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x32, 0x00, 0x22, 0x22, 0x00, 0x22, 0x62, 0x00, 0x22, 0xCE, 0x00, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74F1, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x7F, 0x1C, 0x00, 0x20, 0x70, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x80, 0x22, 0x11, 0x80, 0x22, 0x0F, 0x00, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74F2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x13, 0x00, 0x20, 0x1E, 0x00, 0x20, 0xF0, 0x00, 0x20, 0x10, 0x00, 0x3E, 0x52, 0x00, 0x22, 0x52, 0x00, 0x22, 0x52, 0x00, 0x32, 0x52, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x11, 0x00, 0x22, 0x13, 0x00, 0x22, 0x0E, 0x00, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74F4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x80, 0x1A, 0x20, 0x00, 0x33, 0x20, 0x00, 0x61, 0xA0, 0x00, 0x1E, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x32, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0B, 0x22, 0x80, 0x08, 0x3E, 0x80, 0x08, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74F6, { 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x33, 0x7F, 0x80, 0x12, 0x20, 0x00, 0x7F, 0xA0, 0x00, 0x12, 0x20, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xA2, 0x00, 0x12, 0x32, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x32, 0x22, 0x80, 0x22, 0x3A, 0x80, 0x62, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74F7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x89, 0x00, 0x00, 0x0A, 0x00, 0x07, 0x94, 0x00, 0x38, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x04, 0x48, 0x00, 0x08, 0xF8, 0x80, 0x3F, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x10, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x10, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3E, 0x00, 0x1F, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x32, 0x00, 0x7F, 0xAA, 0x00, 0x10, 0x2A, 0x00, 0x11, 0x22, 0x00, 0x31, 0x22, 0x00, 0x27, 0xA2, 0x80, 0x7C, 0xBE, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74FB, { 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x1B, 0x7F, 0x80, 0x0E, 0x10, 0x00, 0x1B, 0x10, 0x00, 0x71, 0x90, 0x00, 0x08, 0x1E, 0x00, 0x7F, 0x92, 0x00, 0x10, 0x12, 0x00, 0x24, 0x1A, 0x00, 0x7F, 0x96, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x80, 0x25, 0x9E, 0x80, 0x04, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x74FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x00, 0x20, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0xFE, 0x00, 0x32, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x22, 0x10, 0x00, 0x23, 0xFF, 0x00, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x74FF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x20, 0x00, 0x22, 0x20, 0x00, 0x36, 0x20, 0x00, 0x14, 0x3E, 0x00, 0x14, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x32, 0x00, 0x00, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x80, 0x22, 0x3E, 0x80, 0x3E, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7501, { 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x05, 0x7F, 0x00, 0x0A, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x1E, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x1A, 0x00, 0x3F, 0xA6, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x22, 0x80, 0x12, 0x3E, 0x80, 0x22, 0xC3, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7503, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x3E, 0x09, 0x00, 0x04, 0x2B, 0x00, 0x7F, 0x6A, 0x00, 0x14, 0x5C, 0x00, 0x16, 0x16, 0x00, 0x35, 0x33, 0x00, 0x64, 0x61, 0x80, 0x04, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0D, 0x08, 0x00, 0x08, 0x88, 0x80, 0x0F, 0xF9, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x05, 0x10, 0x00, 0x05, 0x10, 0x00, 0x1F, 0xD0, 0x00, 0x15, 0x50, 0x00, 0x1D, 0xDE, 0x00, 0x10, 0x52, 0x00, 0x1F, 0xD2, 0x00, 0x02, 0x1A, 0x00, 0x02, 0x26, 0x00, 0x1F, 0xE2, 0x00, 0x02, 0x22, 0x00, 0x03, 0xE6, 0x80, 0x3C, 0x3A, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x00, 0x20, 0x80, 0x00, 0x20, 0xBE, 0x00, 0x20, 0xAA, 0x00, 0x3E, 0xBE, 0x00, 0x22, 0xAA, 0x00, 0x22, 0xBE, 0x00, 0x32, 0x88, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0x88, 0x00, 0x23, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x2E, 0x00, 0x80, 0x3B, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7506, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x12, 0x12, 0x00, 0x36, 0x36, 0x00, 0x1C, 0x1C, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x80, 0x80, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xF8, 0x80, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x750C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x20, 0x00, 0x4E, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x4A, 0x3E, 0x00, 0x4E, 0x22, 0x00, 0x40, 0x22, 0x00, 0x5F, 0x32, 0x00, 0x55, 0x2A, 0x00, 0x55, 0x2A, 0x00, 0x55, 0x22, 0x00, 0x5F, 0x22, 0x00, 0x40, 0x22, 0x80, 0x7F, 0xBE, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x750D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x5F, 0xFE, 0x80, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x48, 0x80, 0x0F, 0xF9, 0x80, 0x78, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x750E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x90, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x05, 0x1A, 0x00, 0x1F, 0x96, 0x00, 0x70, 0xD2, 0x00, 0x01, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x11, 0x12, 0x80, 0x19, 0x1E, 0x80, 0x0B, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x750F, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x3A, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x3A, 0x00, 0x1F, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x3F, 0xB0, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x90, 0x00, 0x04, 0x52, 0x00, 0x07, 0x12, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7511, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x7F, 0x80, 0x10, 0x90, 0x00, 0x20, 0x50, 0x00, 0x3F, 0x90, 0x00, 0x35, 0x9E, 0x00, 0x2E, 0xB2, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xB2, 0x00, 0x00, 0x2A, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x2E, 0x80, 0x1F, 0x71, 0x80, 0x11, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7512, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x3F, 0x80, 0x3F, 0xD0, 0x00, 0x6A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x9E, 0x00, 0x7F, 0xD2, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x9A, 0x00, 0x2A, 0x96, 0x00, 0x2A, 0x92, 0x00, 0x7F, 0xD2, 0x00, 0x00, 0x12, 0x00, 0x2A, 0x92, 0x80, 0x6A, 0x9E, 0x80, 0x4A, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7513, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xBF, 0x80, 0x10, 0x91, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x28, 0xBF, 0x80, 0x68, 0x84, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x80, 0x0F, 0xF9, 0x80, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7515, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x24, 0x00, 0x28, 0x7F, 0x00, 0x12, 0xC8, 0x00, 0x0D, 0x7F, 0x00, 0x09, 0x48, 0x00, 0x32, 0x7F, 0x00, 0x0C, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x32, 0x40, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x04, 0x44, 0x80, 0x08, 0xFC, 0x80, 0x3F, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7516, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xF8, 0x80, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7517, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xBF, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xD0, 0x00, 0x22, 0x50, 0x00, 0x2F, 0x9E, 0x00, 0x22, 0x52, 0x00, 0x3F, 0xD2, 0x00, 0x24, 0x9A, 0x00, 0x27, 0x96, 0x00, 0x20, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x35, 0x52, 0x00, 0x39, 0xD2, 0x80, 0x57, 0x5E, 0x80, 0x12, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7518, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7519, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0xC0, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x7F, 0xE0, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x751A, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x751B, { 0x00, 0x00, 0x00, 0x11, 0x07, 0x00, 0x11, 0x38, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x751C, { 0x00, 0x00, 0x00, 0x03, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x78, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x751E, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x18, 0x8C, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x751F, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7520, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x90, 0x00, 0x7C, 0x90, 0x00, 0x44, 0x90, 0x00, 0x44, 0xFF, 0x00, 0x45, 0x90, 0x00, 0x45, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7521, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x24, 0x24, 0x00, 0x24, 0x24, 0x00, 0x24, 0x24, 0x00, 0x3F, 0xBF, 0x80, 0x64, 0x64, 0x00, 0x44, 0x44, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x3F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x78, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7523, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x20, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x14, 0x20, 0x00, 0x18, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7524, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0x94, 0x00, 0x08, 0x14, 0x00, 0x19, 0x3F, 0x80, 0x33, 0x24, 0x00, 0x6A, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x34, 0x1F, 0x00, 0x66, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x1D, 0x04, 0x00, 0x35, 0x04, 0x00, 0x65, 0xBF, 0x80, 0x04, 0xC0, 0x00, 0x0C, 0x70, 0x00, 0x38, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7525, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x3F, 0x80, 0x14, 0x24, 0x80, 0x14, 0x24, 0x80, 0x1F, 0xBF, 0x80, 0x24, 0x24, 0x80, 0x24, 0x24, 0x80, 0x24, 0x3F, 0x80, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x07, 0xD0, 0x80, 0x3C, 0x21, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7526, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x94, 0x00, 0x04, 0x14, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xA4, 0x00, 0x24, 0xC4, 0x00, 0x3F, 0x84, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x04, 0x04, 0x00, 0x24, 0x7F, 0x80, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7527, { 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x24, 0x24, 0x00, 0x7F, 0x7F, 0x80, 0x44, 0x44, 0x00, 0x3F, 0x3F, 0x00, 0x04, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x78, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7528, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7529, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x7F, 0xFC, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x7F, 0xFC, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x01, 0x01, 0x00, 0x01, 0x03, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x752A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x752B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x752C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x752D, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x03, 0xB0, 0x00, 0x0C, 0x8C, 0x00, 0x70, 0x82, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x20, 0x94, 0x00, 0x40, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x752F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2A, 0x45, 0x00, 0x1A, 0x16, 0x00, 0x33, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7531, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7533, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7535, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFC, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7536, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7537, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x0C, 0x02, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7538, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7539, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x753A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x753B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x753C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x753D, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x81, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x753E, { 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x63, 0x00, 0x18, 0xC6, 0x00, 0x31, 0x8C, 0x00, 0x21, 0x08, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0x63, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x753F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7540, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7543, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x3F, 0x00, 0x49, 0x61, 0x00, 0x49, 0x41, 0x00, 0x49, 0xC1, 0x00, 0x7F, 0x01, 0x00, 0x49, 0x3D, 0x00, 0x49, 0x01, 0x00, 0x49, 0x01, 0x00, 0x7F, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x31, 0x83, 0x00, 0x18, 0xC6, 0x00, 0x0C, 0x4C, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7545, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x20, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x82, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x4A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3F, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0x94, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7546, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x99, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x97, 0x80, 0x00, 0x3C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7547, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x2B, 0x00, 0x80, 0x3E, 0x7C, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0xFE, 0x80, 0x3E, 0x00, 0x80, 0x22, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7548, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0x80, 0x00, 0x54, 0xFE, 0x00, 0x54, 0xA2, 0x00, 0x7C, 0xA2, 0x00, 0x54, 0xB6, 0x00, 0x54, 0x94, 0x00, 0x54, 0x9C, 0x00, 0x54, 0x88, 0x00, 0x7D, 0x9C, 0x00, 0x01, 0x14, 0x00, 0x03, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7549, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0x38, 0x00, 0x54, 0x28, 0x00, 0x54, 0x6C, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x754A, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x54, 0x44, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x754B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x54, 0x7F, 0x80, 0x54, 0xC2, 0x00, 0x54, 0x82, 0x00, 0x55, 0xC6, 0x00, 0x7C, 0x44, 0x00, 0x54, 0x6C, 0x00, 0x54, 0x38, 0x00, 0x54, 0x10, 0x00, 0x54, 0x38, 0x00, 0x7C, 0x2C, 0x00, 0x00, 0x66, 0x00, 0x00, 0xC3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x754C, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x0E, 0x00, 0x32, 0x09, 0x80, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x754D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x28, 0x00, 0x54, 0x6C, 0x00, 0x54, 0xC6, 0x00, 0x57, 0xC7, 0x80, 0x7C, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x754E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x16, 0x00, 0x7C, 0x13, 0x00, 0x54, 0x11, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x54, 0x38, 0x00, 0x54, 0x28, 0x00, 0x54, 0x28, 0x00, 0x54, 0x6C, 0x00, 0x7C, 0x44, 0x00, 0x00, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x754F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x42, 0x00, 0x04, 0x24, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF6, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7551, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x2C, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7552, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x9C, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x24, 0xB6, 0x00, 0x3F, 0xA2, 0x00, 0x00, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7553, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x61, 0x00, 0x1F, 0xE2, 0x00, 0x01, 0x54, 0x00, 0x02, 0x58, 0x00, 0x04, 0x48, 0x00, 0x08, 0x44, 0x00, 0x10, 0x42, 0x00, 0x20, 0x41, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7554, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x55, 0x11, 0x00, 0x56, 0x10, 0x80, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7557, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7559, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x3F, 0x80, 0x10, 0x08, 0x80, 0x10, 0x08, 0x80, 0x11, 0x08, 0x80, 0x10, 0x90, 0x80, 0x17, 0xD0, 0x80, 0x38, 0x63, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x755A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xF6, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x18, 0x06, 0x00, 0x6F, 0xFD, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x755B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x89, 0x80, 0x2B, 0x08, 0x00, 0x3E, 0x12, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x88, 0x80, 0x3E, 0x11, 0x00, 0x22, 0x22, 0x00, 0x20, 0xC4, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x755C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x90, 0x00, 0x04, 0x90, 0x00, 0x03, 0x21, 0x00, 0x01, 0x7F, 0x00, 0x3F, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x755D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xEF, 0x80, 0x00, 0x10, 0x80, 0x1F, 0xD1, 0x00, 0x12, 0x61, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x46, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x61, 0x00, 0x10, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x755E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0xA2, 0x00, 0x3E, 0xE6, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x8E, 0x00, 0x2A, 0x8A, 0x00, 0x3E, 0x9B, 0x00, 0x00, 0xB1, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x755F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x80, 0x1C, 0x1F, 0x80, 0x72, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x3B, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7560, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7561, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x54, 0x64, 0x00, 0x54, 0xCC, 0x00, 0x7D, 0x89, 0x00, 0x54, 0xDB, 0x00, 0x54, 0x32, 0x00, 0x54, 0x66, 0x00, 0x54, 0xCC, 0x00, 0x7D, 0x98, 0x00, 0x00, 0x36, 0x00, 0x00, 0xE3, 0x00, 0x07, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7562, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7564, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x7C, 0x02, 0x00, 0x54, 0x02, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x02, 0x00, 0x54, 0xC2, 0x00, 0x7C, 0x62, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7565, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x42, 0x00, 0x2A, 0xC4, 0x00, 0x2B, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x46, 0x00, 0x2A, 0x81, 0x80, 0x2B, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x22, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7566, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7567, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x3B, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7569, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x54, 0x20, 0x00, 0x54, 0x71, 0x00, 0x7C, 0x53, 0x00, 0x54, 0xD6, 0x00, 0x55, 0x9C, 0x00, 0x56, 0x88, 0x00, 0x54, 0x8C, 0x00, 0x7C, 0x84, 0x00, 0x00, 0xB6, 0x00, 0x00, 0xE3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x756A, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x756B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x756D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x7C, 0x28, 0x00, 0x54, 0x6C, 0x00, 0x54, 0xC6, 0x00, 0x55, 0x83, 0x00, 0x7F, 0x7D, 0x80, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x01, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x756F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x9F, 0x80, 0x2B, 0xE4, 0x80, 0x2A, 0x24, 0x00, 0x3E, 0x44, 0x80, 0x2B, 0xA7, 0x80, 0x2A, 0x20, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0xC2, 0x00, 0x23, 0x24, 0x00, 0x06, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7570, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7571, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7572, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x0B, 0xE8, 0x00, 0x70, 0x07, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x12, 0x84, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7573, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7574, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x54, 0x40, 0x00, 0x54, 0x42, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x82, 0x00, 0x7D, 0xA2, 0x00, 0x01, 0x32, 0x00, 0x03, 0x12, 0x00, 0x06, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7575, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x17, 0xFD, 0x00, 0x17, 0xFD, 0x00, 0x14, 0x45, 0x00, 0x17, 0xFD, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7576, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x7C, 0x21, 0x00, 0x54, 0xA5, 0x00, 0x54, 0x42, 0x00, 0x54, 0xA5, 0x00, 0x55, 0x08, 0x80, 0x7C, 0x00, 0x00, 0x54, 0x00, 0x00, 0x57, 0xFF, 0x00, 0x54, 0x29, 0x00, 0x55, 0x49, 0x00, 0x7C, 0x8A, 0x00, 0x00, 0xC4, 0x00, 0x01, 0x4A, 0x00, 0x06, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7578, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x46, 0x00, 0x2B, 0x81, 0x80, 0x2A, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x02, 0x00, 0x2A, 0xF2, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x22, 0xF2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7579, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x55, 0x01, 0x00, 0x54, 0x80, 0x00, 0x54, 0xEF, 0x00, 0x7C, 0xA9, 0x00, 0x55, 0xA9, 0x00, 0x55, 0x29, 0x00, 0x57, 0xE9, 0x00, 0x54, 0x4B, 0x00, 0x7C, 0xC8, 0x00, 0x00, 0x88, 0x80, 0x01, 0x89, 0x80, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x757A, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x757B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x54, 0x00, 0x7C, 0x92, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x24, 0x00, 0x54, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x54, 0x42, 0x00, 0x54, 0xC3, 0x00, 0x55, 0x91, 0x80, 0x54, 0x10, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x757C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x54, 0xFC, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x54, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x80, 0x00, 0x55, 0xFF, 0x00, 0x57, 0x29, 0x00, 0x7C, 0x49, 0x00, 0x01, 0x93, 0x00, 0x00, 0x22, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x757D, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x7C, 0xF0, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x757E, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x7F, 0x3F, 0x80, 0x49, 0x24, 0x80, 0x49, 0x24, 0x80, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x757F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x32, 0x92, 0x00, 0x14, 0xA4, 0x00, 0x08, 0x99, 0x00, 0x12, 0xFF, 0x80, 0x3F, 0x88, 0x80, 0x01, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x3F, 0xC2, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0x98, 0x00, 0x24, 0x98, 0x80, 0x3F, 0xE6, 0x80, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x7C, 0x63, 0x00, 0x54, 0xA5, 0x00, 0x54, 0x63, 0x00, 0x54, 0xA5, 0x00, 0x54, 0x11, 0x00, 0x7C, 0x38, 0x00, 0x54, 0xEE, 0x00, 0x57, 0x83, 0x80, 0x54, 0x10, 0x00, 0x54, 0xE4, 0x00, 0x7C, 0x19, 0x00, 0x00, 0xE2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7582, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x07, 0x38, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7583, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0xFE, 0x00, 0x3F, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x7F, 0xFF, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x7C, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7586, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x3D, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7587, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x3E, 0x7F, 0x00, 0x2A, 0x3E, 0x00, 0x2A, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x02, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x72, 0x00, 0x00, 0x52, 0x00, 0x00, 0x72, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7589, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x29, 0x00, 0x3E, 0x3F, 0x00, 0x2A, 0x29, 0x00, 0x3E, 0xBF, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x07, 0xF8, 0x00, 0x0D, 0x08, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x758A, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x758B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x09, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x758E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x01, 0xFF, 0x80, 0x06, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x17, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x1C, 0x00, 0x14, 0x1C, 0x00, 0x17, 0xAA, 0x00, 0x38, 0x4A, 0x00, 0x00, 0x89, 0x00, 0x01, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x758F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x01, 0xFF, 0x80, 0x06, 0x10, 0x00, 0x04, 0x22, 0x00, 0x04, 0x4F, 0x00, 0x04, 0xF0, 0x80, 0x17, 0x10, 0x00, 0x14, 0x52, 0x00, 0x14, 0x52, 0x00, 0x14, 0x52, 0x00, 0x14, 0x52, 0x00, 0x17, 0x92, 0x00, 0x38, 0x92, 0x80, 0x01, 0x13, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7590, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xF9, 0x00, 0x14, 0x80, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7591, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x38, 0x02, 0x00, 0x21, 0x14, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x09, 0x00, 0x08, 0x0A, 0x00, 0x1F, 0x48, 0x00, 0x24, 0x4F, 0x00, 0x04, 0x48, 0x00, 0x3F, 0xC8, 0x00, 0x04, 0x48, 0x00, 0x0A, 0x68, 0x00, 0x11, 0x9F, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7592, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x00, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x68, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7593, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x00, 0x00, 0x2B, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x38, 0x88, 0x00, 0x68, 0x8F, 0x00, 0x08, 0x81, 0x00, 0x18, 0x81, 0x00, 0x11, 0x81, 0x00, 0x31, 0x03, 0x00, 0x63, 0x02, 0x00, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7594, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x00, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x38, 0x10, 0x00, 0x68, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7595, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x00, 0x00, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x06, 0x00, 0x39, 0x3C, 0x00, 0x69, 0xE0, 0x00, 0x09, 0x00, 0x00, 0x19, 0x00, 0x00, 0x11, 0x00, 0x80, 0x31, 0x01, 0x80, 0x61, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7596, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x48, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x42, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x28, 0x42, 0x00, 0x68, 0x52, 0x00, 0x08, 0x4A, 0x00, 0x10, 0x44, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7597, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x48, 0x00, 0x00, 0x2B, 0xFC, 0x00, 0x28, 0x08, 0x00, 0x08, 0x10, 0x00, 0x18, 0x20, 0x00, 0x28, 0x20, 0x00, 0x68, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0x20, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7599, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x31, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x16, 0x00, 0x00, 0x14, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x50, 0x1C, 0x00, 0x10, 0x70, 0x00, 0x11, 0xC0, 0x00, 0x33, 0x00, 0x00, 0x22, 0x00, 0x80, 0x63, 0x01, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x759A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x80, 0x00, 0x30, 0x80, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x13, 0x18, 0x00, 0x36, 0x10, 0x00, 0x50, 0x30, 0x00, 0x10, 0x20, 0x00, 0x30, 0x70, 0x00, 0x20, 0xD8, 0x00, 0x61, 0x8C, 0x00, 0x03, 0x06, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x759C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x00, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x38, 0x10, 0x00, 0x68, 0x1C, 0x00, 0x08, 0x16, 0x00, 0x18, 0x13, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x759D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x21, 0x00, 0x1A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x759F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x48, 0x04, 0x00, 0x29, 0xFE, 0x00, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0x02, 0x00, 0x2F, 0xFF, 0x00, 0x69, 0x00, 0x00, 0x09, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75A0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x48, 0x02, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x80, 0x00, 0x08, 0x84, 0x00, 0x18, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x68, 0x84, 0x00, 0x09, 0x04, 0x00, 0x11, 0x04, 0x00, 0x12, 0x04, 0x00, 0x24, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75A1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x4B, 0xF8, 0x00, 0x28, 0x20, 0x00, 0x28, 0x40, 0x00, 0x08, 0x82, 0x00, 0x1B, 0xFF, 0x00, 0x28, 0x92, 0x00, 0x68, 0x92, 0x00, 0x09, 0x22, 0x00, 0x11, 0x22, 0x00, 0x12, 0x42, 0x00, 0x24, 0x94, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75A2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x40, 0x00, 0x10, 0x40, 0x00, 0x12, 0x42, 0x00, 0x12, 0x46, 0x00, 0x36, 0x4C, 0x00, 0x54, 0x40, 0x00, 0x10, 0xE0, 0x00, 0x30, 0xA0, 0x00, 0x21, 0xB0, 0x00, 0x63, 0x18, 0x00, 0x06, 0x0E, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75A3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x44, 0x00, 0x10, 0x46, 0x00, 0x10, 0x42, 0x00, 0x17, 0xFF, 0x80, 0x30, 0x40, 0x00, 0x50, 0x40, 0x00, 0x10, 0xE0, 0x00, 0x30, 0xA0, 0x00, 0x20, 0xA0, 0x00, 0x61, 0xA0, 0x80, 0x03, 0x31, 0x80, 0x0E, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75A4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x39, 0x11, 0x00, 0x69, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x19, 0x00, 0x00, 0x11, 0x00, 0x80, 0x31, 0x81, 0x80, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75A5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x28, 0x88, 0x00, 0x19, 0x06, 0x00, 0x0E, 0x01, 0x80, 0x08, 0x84, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x11, 0x04, 0x00, 0x12, 0x04, 0x00, 0x24, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75AB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x08, 0x84, 0x80, 0x09, 0x07, 0x80, 0x0E, 0x00, 0x00, 0x1B, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x30, 0x00, 0x10, 0x58, 0x00, 0x11, 0x86, 0x00, 0x26, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75AC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x28, 0x94, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75AE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x48, 0xA0, 0x00, 0x29, 0x10, 0x00, 0x2A, 0x08, 0x00, 0x0D, 0xF7, 0x00, 0x19, 0x12, 0x00, 0x29, 0x10, 0x00, 0x69, 0x50, 0x00, 0x09, 0x20, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75AF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x4B, 0xFE, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0x0C, 0x00, 0x0A, 0x8C, 0x00, 0x1A, 0x54, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x0A, 0x54, 0x00, 0x12, 0x8C, 0x00, 0x15, 0x0D, 0x00, 0x24, 0x05, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x48, 0x40, 0x00, 0x28, 0x24, 0x00, 0x2B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x28, 0x28, 0x00, 0x69, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B1, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x28, 0x80, 0x00, 0x19, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x0D, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x19, 0x12, 0x00, 0x29, 0xF2, 0x00, 0x09, 0x04, 0x00, 0x09, 0x18, 0x00, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x28, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x1A, 0x84, 0x00, 0x2A, 0x48, 0x00, 0x0A, 0x30, 0x00, 0x0A, 0x30, 0x00, 0x14, 0x48, 0x00, 0x14, 0x86, 0x00, 0x2B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75B3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x28, 0x84, 0x00, 0x18, 0x84, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x18, 0x84, 0x00, 0x28, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x31, 0xE4, 0x00, 0x51, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x31, 0xE4, 0x00, 0x20, 0x04, 0x00, 0x60, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x48, 0x00, 0x18, 0x48, 0x00, 0x0A, 0x49, 0x80, 0x0A, 0x4E, 0x00, 0x0A, 0x78, 0x00, 0x1A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0A, 0x48, 0x80, 0x12, 0x78, 0x80, 0x17, 0x8F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x19, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x29, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75B9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x28, 0x50, 0x00, 0x18, 0x88, 0x00, 0x09, 0x06, 0x00, 0x0E, 0x21, 0x80, 0x08, 0x40, 0x00, 0x18, 0x88, 0x00, 0x2B, 0x10, 0x00, 0x08, 0x22, 0x00, 0x10, 0xC4, 0x00, 0x13, 0x08, 0x00, 0x20, 0x30, 0x00, 0x23, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75BA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x1E, 0x00, 0x13, 0xF0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x50, 0x06, 0x00, 0x10, 0x0C, 0x00, 0x30, 0x18, 0x00, 0x20, 0x70, 0x00, 0x63, 0xC0, 0x00, 0x0E, 0x78, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75BC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x28, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x50, 0x00, 0x18, 0x30, 0x00, 0x28, 0xCC, 0x00, 0x0F, 0x23, 0x80, 0x08, 0x10, 0x00, 0x08, 0x06, 0x00, 0x10, 0x38, 0x00, 0x11, 0xC0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75BD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x13, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75BE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x80, 0x00, 0x28, 0x80, 0x00, 0x19, 0xFE, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x2F, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x11, 0x04, 0x00, 0x12, 0x02, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75BF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x90, 0x00, 0x30, 0x90, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x37, 0xFE, 0x00, 0x54, 0x90, 0x00, 0x14, 0x90, 0x00, 0x37, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x61, 0x11, 0x00, 0x03, 0x17, 0x00, 0x0E, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x80, 0x00, 0x28, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x3B, 0x01, 0x00, 0x68, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x18, 0x89, 0x00, 0x10, 0xF9, 0x00, 0x30, 0x03, 0x00, 0x60, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x20, 0x00, 0x28, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x20, 0x00, 0x38, 0x20, 0x00, 0x68, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x11, 0x02, 0x00, 0x31, 0x02, 0x00, 0x61, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x29, 0x00, 0x00, 0x1F, 0xEF, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x19, 0x29, 0x00, 0x29, 0x29, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x0A, 0x29, 0x00, 0x12, 0x29, 0x00, 0x14, 0xEF, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0xC0, 0x00, 0x31, 0x88, 0x00, 0x53, 0x18, 0x00, 0x11, 0xB0, 0x00, 0x30, 0xE0, 0x00, 0x20, 0xC2, 0x00, 0x61, 0x82, 0x00, 0x01, 0x3F, 0x00, 0x0F, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75C4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x40, 0x00, 0x28, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x09, 0xA0, 0x00, 0x3B, 0x20, 0x00, 0x68, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0x3F, 0x00, 0x30, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0x52, 0x00, 0x0A, 0x8A, 0x00, 0x0B, 0x0A, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x52, 0x43, 0x00, 0x12, 0x4E, 0x00, 0x32, 0x78, 0x00, 0x26, 0x40, 0x00, 0x64, 0x40, 0x80, 0x0C, 0x61, 0x80, 0x18, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x19, 0x3E, 0x00, 0x29, 0x20, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x11, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x6B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x24, 0x2A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75C9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x2B, 0xFC, 0x00, 0x18, 0x18, 0x00, 0x08, 0x60, 0x00, 0x09, 0x9C, 0x00, 0x1E, 0x03, 0x00, 0x28, 0x00, 0x00, 0x4B, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75CA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x70, 0x00, 0x10, 0xD8, 0x00, 0x13, 0x8E, 0x00, 0x1E, 0x03, 0x80, 0x33, 0xFE, 0x00, 0x50, 0x20, 0x00, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75CC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x14, 0x01, 0x00, 0x15, 0xFD, 0x00, 0x34, 0x01, 0x00, 0x54, 0xF9, 0x00, 0x14, 0x89, 0x00, 0x34, 0x89, 0x00, 0x24, 0x89, 0x00, 0x64, 0xF9, 0x00, 0x04, 0x01, 0x00, 0x04, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75CD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x2F, 0xFF, 0x00, 0x18, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x1A, 0x20, 0x00, 0x2F, 0xFF, 0x00, 0x0C, 0x21, 0x00, 0x08, 0x56, 0x00, 0x10, 0x88, 0x00, 0x13, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75CE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x64, 0x00, 0x36, 0xCC, 0x00, 0x53, 0x19, 0x00, 0x11, 0xB3, 0x00, 0x30, 0x66, 0x00, 0x21, 0xCC, 0x00, 0x67, 0x1B, 0x00, 0x00, 0x71, 0x80, 0x07, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75CF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x40, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x31, 0xFE, 0x00, 0x53, 0x02, 0x00, 0x15, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x21, 0x02, 0x00, 0x61, 0x02, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75D2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x28, 0x88, 0x00, 0x18, 0x50, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75D4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x28, 0x20, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x04, 0x00, 0x28, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x04, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75D5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x28, 0x40, 0x00, 0x19, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x29, 0x42, 0x00, 0x09, 0x24, 0x00, 0x09, 0x18, 0x00, 0x11, 0xE8, 0x00, 0x17, 0x06, 0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75D6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x4F, 0xFE, 0x00, 0x28, 0x90, 0x00, 0x28, 0x90, 0x00, 0x0C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x2A, 0x94, 0x00, 0x6A, 0x94, 0x00, 0x0A, 0x98, 0x00, 0x10, 0x90, 0x00, 0x10, 0x92, 0x00, 0x2F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75D7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x80, 0x00, 0x68, 0x80, 0x00, 0x29, 0xFF, 0x00, 0x0B, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x68, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x19, 0x02, 0x00, 0x11, 0x22, 0x00, 0x31, 0xFF, 0x80, 0x60, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75D8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x1A, 0x02, 0x00, 0x2B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0x04, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75D9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x18, 0x92, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x48, 0x00, 0x09, 0x24, 0x00, 0x18, 0x92, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75DB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x29, 0xFC, 0x00, 0x18, 0x48, 0x00, 0x08, 0x30, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x1B, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x22, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75DC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x0E, 0x00, 0x28, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x38, 0x54, 0x00, 0x68, 0xD6, 0x00, 0x0B, 0x93, 0x80, 0x18, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x30, 0x44, 0x00, 0x60, 0xC4, 0x80, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75DE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x60, 0x00, 0x10, 0xE8, 0x00, 0x11, 0xAC, 0x00, 0x33, 0x26, 0x00, 0x5E, 0x23, 0x80, 0x10, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x62, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75DF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x68, 0x92, 0x00, 0x29, 0x93, 0x00, 0x09, 0x11, 0x00, 0x08, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x69, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x61, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x82, 0x00, 0x31, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x49, 0x00, 0x10, 0xC8, 0x00, 0x37, 0x8F, 0x80, 0x51, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x33, 0x06, 0x00, 0x26, 0xCC, 0x00, 0x60, 0x78, 0x00, 0x01, 0xCE, 0x00, 0x0F, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75E1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x28, 0x00, 0x10, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x52, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x62, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xE1, 0x00, 0x2B, 0x89, 0x00, 0x18, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xE9, 0x00, 0x19, 0x89, 0x00, 0x29, 0xC9, 0x00, 0x0A, 0xA9, 0x00, 0x0A, 0x89, 0x00, 0x14, 0x89, 0x00, 0x14, 0x89, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x50, 0x00, 0x00, 0x10, 0x20, 0x00, 0x30, 0xB0, 0x00, 0x22, 0x91, 0x00, 0x62, 0x85, 0x80, 0x06, 0x8C, 0x80, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x31, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x12, 0xAA, 0x00, 0x32, 0xAA, 0x00, 0x54, 0x71, 0x00, 0x10, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x28, 0x40, 0x00, 0x29, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8A, 0x00, 0x2F, 0xFF, 0x00, 0x68, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x32, 0x08, 0x00, 0x13, 0x08, 0x00, 0x11, 0x2A, 0x00, 0x14, 0x6B, 0x00, 0x36, 0xC9, 0x80, 0x52, 0x08, 0x00, 0x10, 0x09, 0x00, 0x31, 0x3B, 0x00, 0x23, 0x06, 0x00, 0x66, 0x0C, 0x00, 0x0C, 0x38, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x4B, 0xFE, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x41, 0x00, 0x2C, 0x42, 0x00, 0x69, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x84, 0x00, 0x21, 0x14, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75E9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x53, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x57, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x30, 0x88, 0x00, 0x20, 0x70, 0x00, 0x61, 0xDC, 0x00, 0x0F, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75EA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x28, 0xF8, 0x00, 0x19, 0x10, 0x00, 0x0A, 0x24, 0x00, 0x19, 0xFE, 0x00, 0x29, 0x24, 0x00, 0x69, 0x24, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x21, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75EB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0x22, 0x00, 0x0B, 0xFA, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0x62, 0x00, 0x6A, 0x72, 0x00, 0x0A, 0xAA, 0x00, 0x13, 0x26, 0x00, 0x12, 0x22, 0x00, 0x22, 0x2A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75EC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x33, 0xFE, 0x00, 0x51, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x44, 0x80, 0x26, 0xCC, 0x80, 0x6C, 0x99, 0x80, 0x01, 0xB1, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75EE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x00, 0x00, 0x31, 0xFC, 0x00, 0x51, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x31, 0x22, 0x00, 0x21, 0x34, 0x00, 0x61, 0x18, 0x00, 0x01, 0xCC, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75EF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x00, 0x80, 0x14, 0xFC, 0x80, 0x30, 0x84, 0x00, 0x50, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x30, 0x80, 0x00, 0x20, 0xFE, 0x00, 0x60, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75F0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x09, 0x24, 0x00, 0x28, 0x50, 0x00, 0x18, 0x88, 0x00, 0x09, 0x06, 0x00, 0x0E, 0x21, 0x80, 0x18, 0x20, 0x00, 0x29, 0x22, 0x00, 0x09, 0x24, 0x00, 0x08, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x06, 0x00, 0x26, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x75F1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x88, 0x00, 0x10, 0x88, 0x00, 0x17, 0x8F, 0x00, 0x10, 0x88, 0x00, 0x30, 0x88, 0x00, 0x57, 0x8F, 0x00, 0x10, 0x88, 0x00, 0x33, 0x88, 0x00, 0x2C, 0x8F, 0x80, 0x61, 0x88, 0x00, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75F2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x29, 0x08, 0x00, 0x19, 0x08, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x08, 0x00, 0x0B, 0x6A, 0x00, 0x1B, 0x6A, 0x00, 0x2B, 0x6A, 0x00, 0x0B, 0x6A, 0x80, 0x0B, 0x2A, 0x80, 0x11, 0x2B, 0x80, 0x11, 0x48, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75F3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x31, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xDF, 0x80, 0x11, 0x04, 0x00, 0x31, 0x04, 0x00, 0x53, 0x8E, 0x00, 0x13, 0x4E, 0x00, 0x35, 0x55, 0x00, 0x25, 0x15, 0x00, 0x69, 0x24, 0x80, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75F4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x2A, 0x0F, 0x00, 0x1B, 0xE9, 0x00, 0x0C, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xF9, 0x00, 0x28, 0x89, 0x00, 0x08, 0x89, 0x00, 0x09, 0x49, 0x00, 0x11, 0x2F, 0x00, 0x12, 0x29, 0x00, 0x2C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75F9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x50, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x30, 0x88, 0x00, 0x20, 0x88, 0x00, 0x61, 0x88, 0x00, 0x03, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75FA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x28, 0x40, 0x00, 0x1B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x1A, 0x22, 0x00, 0x2B, 0xFE, 0x00, 0x08, 0x90, 0x00, 0x09, 0x10, 0x00, 0x12, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75FC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x1A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x1A, 0xFD, 0x00, 0x2A, 0x85, 0x00, 0x0A, 0x85, 0x00, 0x0A, 0xFD, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75FE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xBF, 0x80, 0x14, 0x82, 0x00, 0x14, 0x82, 0x00, 0x15, 0x3A, 0x00, 0x35, 0x2A, 0x00, 0x54, 0xAA, 0x00, 0x14, 0xAA, 0x00, 0x34, 0xBA, 0x00, 0x25, 0x82, 0x00, 0x64, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x75FF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0xA8, 0x00, 0x31, 0x24, 0x00, 0x56, 0x23, 0x00, 0x10, 0x40, 0x00, 0x37, 0xFF, 0x00, 0x21, 0x04, 0x00, 0x63, 0xC8, 0x00, 0x00, 0x7C, 0x00, 0x07, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7600, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x29, 0x0A, 0x00, 0x1F, 0xE9, 0x00, 0x0A, 0x10, 0x80, 0x0A, 0x24, 0x00, 0x0B, 0xC2, 0x00, 0x1A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x0A, 0x41, 0x80, 0x14, 0x46, 0x00, 0x14, 0x58, 0x00, 0x29, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7601, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x32, 0x8A, 0x00, 0x54, 0x51, 0x00, 0x10, 0x00, 0x00, 0x30, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7602, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x37, 0x8F, 0x00, 0x54, 0x01, 0x00, 0x14, 0x01, 0x00, 0x37, 0x8F, 0x00, 0x20, 0x88, 0x00, 0x60, 0x88, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7603, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x11, 0xA1, 0x00, 0x36, 0x33, 0x00, 0x52, 0x56, 0x00, 0x11, 0x98, 0x00, 0x37, 0x38, 0x00, 0x20, 0xD4, 0x00, 0x63, 0x96, 0x00, 0x0E, 0x33, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7604, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x88, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x30, 0x88, 0x00, 0x5F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x63, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7605, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x51, 0x10, 0x00, 0x37, 0xFC, 0x00, 0x14, 0x44, 0x00, 0x17, 0xFC, 0x00, 0x34, 0x44, 0x00, 0x57, 0xFC, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7607, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x0C, 0x00, 0x51, 0xF8, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x63, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7608, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x31, 0xDF, 0x00, 0x17, 0x09, 0x00, 0x11, 0xC9, 0x00, 0x17, 0x09, 0x00, 0x31, 0xD9, 0x00, 0x57, 0x11, 0x00, 0x11, 0x37, 0x00, 0x30, 0x40, 0x00, 0x2F, 0xFF, 0x80, 0x61, 0x8C, 0x00, 0x03, 0x06, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7609, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x50, 0x00, 0x11, 0x8C, 0x00, 0x1E, 0x03, 0x80, 0x11, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x57, 0xC9, 0x00, 0x14, 0x49, 0x00, 0x37, 0x5B, 0x00, 0x24, 0xD2, 0x00, 0x66, 0x5B, 0x00, 0x05, 0xC9, 0x00, 0x04, 0x49, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x760A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x31, 0x7E, 0x00, 0x11, 0x02, 0x00, 0x13, 0x02, 0x00, 0x12, 0xFF, 0x80, 0x36, 0x20, 0x00, 0x5E, 0x7F, 0x00, 0x12, 0xC8, 0x00, 0x32, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x62, 0x14, 0x00, 0x02, 0x36, 0x00, 0x02, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x760B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x22, 0x00, 0x32, 0xFA, 0x00, 0x52, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x32, 0xFA, 0x00, 0x22, 0x22, 0x00, 0x66, 0x2A, 0x80, 0x04, 0x7A, 0x80, 0x0D, 0xCD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x760C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x01, 0x00, 0x31, 0x09, 0x00, 0x1F, 0xE9, 0x00, 0x11, 0x09, 0x00, 0x17, 0xC9, 0x00, 0x35, 0x49, 0x00, 0x55, 0x49, 0x00, 0x17, 0xC9, 0x00, 0x31, 0x01, 0x00, 0x23, 0x81, 0x00, 0x67, 0x41, 0x00, 0x0D, 0x21, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x760D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x19, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x29, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x45, 0x00, 0x10, 0x89, 0x00, 0x13, 0x32, 0x00, 0x2C, 0xCC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x760F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x24, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x28, 0x00, 0x37, 0xFF, 0x80, 0x50, 0x44, 0x00, 0x11, 0xFE, 0x00, 0x37, 0x02, 0x00, 0x2D, 0xFE, 0x00, 0x61, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7610, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x40, 0x00, 0x56, 0x5C, 0x00, 0x34, 0x44, 0x00, 0x14, 0x44, 0x00, 0x17, 0x5C, 0x00, 0x34, 0x44, 0x00, 0x54, 0x44, 0x00, 0x17, 0xFC, 0x00, 0x14, 0x44, 0x00, 0x20, 0xA0, 0x00, 0x21, 0x10, 0x00, 0x46, 0x0F, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7612, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x57, 0xFF, 0x00, 0x34, 0x01, 0x00, 0x14, 0x21, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x52, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7613, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x31, 0xF8, 0x00, 0x13, 0x08, 0x00, 0x16, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x32, 0x52, 0x00, 0x52, 0x9E, 0x00, 0x13, 0x02, 0x00, 0x30, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x88, 0x00, 0x03, 0x8E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7615, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xBF, 0x00, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x17, 0xBF, 0x00, 0x34, 0x00, 0x00, 0x54, 0x3F, 0x00, 0x17, 0x91, 0x00, 0x34, 0x11, 0x00, 0x24, 0x1B, 0x00, 0x67, 0x8E, 0x00, 0x04, 0x1B, 0x00, 0x04, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7616, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x30, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x04, 0x00, 0x30, 0x88, 0x00, 0x5F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x63, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7617, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x57, 0xFC, 0x00, 0x32, 0x48, 0x00, 0x11, 0x52, 0x00, 0x1F, 0xFF, 0x00, 0x31, 0x10, 0x00, 0x52, 0x48, 0x00, 0x14, 0x47, 0x00, 0x1B, 0xFA, 0x00, 0x20, 0x40, 0x00, 0x20, 0x44, 0x00, 0x4F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7618, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x49, 0x24, 0x00, 0x28, 0xA8, 0x00, 0x2B, 0xFE, 0x00, 0x08, 0xA8, 0x00, 0x1B, 0x26, 0x00, 0x28, 0x40, 0x00, 0x6F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x11, 0x90, 0x00, 0x10, 0x60, 0x00, 0x20, 0x98, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7619, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x29, 0x22, 0x00, 0x1A, 0x94, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x70, 0x00, 0x19, 0xAF, 0x80, 0x2E, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x10, 0x3F, 0x00, 0x27, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x761B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x31, 0xDF, 0x00, 0x17, 0x09, 0x00, 0x11, 0xC9, 0x00, 0x17, 0x09, 0x00, 0x31, 0xD9, 0x00, 0x57, 0x11, 0x00, 0x11, 0x37, 0x00, 0x30, 0x40, 0x00, 0x25, 0x63, 0x00, 0x65, 0x25, 0x80, 0x0D, 0x8C, 0x80, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x761C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x80, 0x00, 0x33, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x33, 0xFC, 0x00, 0x52, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x30, 0x40, 0x00, 0x25, 0x63, 0x00, 0x65, 0x25, 0x80, 0x0D, 0x8C, 0x80, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x761D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x14, 0x89, 0x00, 0x14, 0x89, 0x00, 0x17, 0xFF, 0x00, 0x30, 0x20, 0x00, 0x50, 0xA0, 0x00, 0x13, 0xB1, 0x80, 0x36, 0x2B, 0x00, 0x20, 0xAC, 0x00, 0x63, 0xA6, 0x00, 0x0E, 0x23, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x761E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x35, 0x75, 0x00, 0x55, 0x55, 0x00, 0x10, 0xD8, 0x00, 0x33, 0xAE, 0x00, 0x2E, 0x23, 0x80, 0x61, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x761F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x29, 0xFE, 0x00, 0x19, 0x22, 0x00, 0x09, 0x32, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x86, 0x00, 0x19, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7620, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x0B, 0xA7, 0x00, 0x28, 0x20, 0x00, 0x1B, 0xD7, 0x00, 0x08, 0x8C, 0x00, 0x0F, 0x03, 0x80, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7621, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x29, 0x8C, 0x00, 0x1E, 0xFB, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x15, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7622, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x2B, 0xDE, 0x00, 0x1A, 0x52, 0x00, 0x0A, 0xD2, 0x80, 0x0A, 0xD3, 0x80, 0x0A, 0x60, 0x00, 0x1A, 0xFF, 0x00, 0x2F, 0xD1, 0x00, 0x0A, 0x4A, 0x00, 0x0A, 0xC4, 0x00, 0x12, 0xCC, 0x00, 0x14, 0x52, 0x00, 0x24, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7623, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x40, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x53, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x30, 0x94, 0x00, 0x21, 0x95, 0x00, 0x61, 0x1F, 0x00, 0x03, 0x10, 0x80, 0x0E, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7624, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x60, 0x00, 0x2B, 0x9F, 0x00, 0x1A, 0x09, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xB1, 0x00, 0x1E, 0x2E, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x21, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7625, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x04, 0x00, 0x30, 0x88, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x57, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x30, 0x80, 0x00, 0x23, 0xFF, 0x00, 0x6E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7626, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x50, 0x00, 0x09, 0x97, 0x00, 0x29, 0x11, 0x00, 0x19, 0xD7, 0x00, 0x09, 0x11, 0x00, 0x09, 0xF7, 0x00, 0x19, 0x11, 0x00, 0x28, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x10, 0x30, 0x00, 0x10, 0xCC, 0x00, 0x27, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7627, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x50, 0x7E, 0x00, 0x30, 0x40, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x40, 0x80, 0x15, 0xFC, 0x00, 0x34, 0x41, 0x00, 0x54, 0x7F, 0x00, 0x14, 0x00, 0x00, 0x34, 0xFE, 0x00, 0x24, 0x80, 0x00, 0x6D, 0xFF, 0x00, 0x18, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7629, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x31, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x10, 0x70, 0x00, 0x30, 0xD8, 0x00, 0x53, 0x8E, 0x00, 0x1E, 0x73, 0x80, 0x30, 0x00, 0x00, 0x21, 0xFC, 0x00, 0x61, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x762A, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x53, 0xFC, 0x00, 0x32, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x32, 0x04, 0x00, 0x53, 0xFC, 0x00, 0x10, 0x90, 0x00, 0x11, 0x08, 0x00, 0x13, 0x37, 0x00, 0x1D, 0xC2, 0x00, 0x21, 0x04, 0x00, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x762B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x48, 0x14, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0xA4, 0x00, 0x0C, 0xE4, 0x00, 0x1A, 0xBF, 0x00, 0x29, 0x24, 0x00, 0x49, 0x24, 0x00, 0x0A, 0xBF, 0x00, 0x12, 0xA4, 0x00, 0x14, 0x24, 0x00, 0x20, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x762D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x33, 0xFF, 0x00, 0x50, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x60, 0x10, 0x00, 0x03, 0x13, 0x00, 0x06, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7630, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x33, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x50, 0x48, 0x00, 0x11, 0x90, 0x00, 0x30, 0x62, 0x00, 0x27, 0xFF, 0x00, 0x60, 0x21, 0x00, 0x01, 0x24, 0x00, 0x06, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7632, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x22, 0x00, 0x31, 0x22, 0x00, 0x13, 0x22, 0x00, 0x16, 0x55, 0x00, 0x1D, 0x55, 0x00, 0x31, 0x00, 0x00, 0x53, 0x08, 0x00, 0x12, 0x48, 0x00, 0x36, 0x4E, 0x00, 0x2A, 0x48, 0x00, 0x62, 0x68, 0x00, 0x02, 0x5C, 0x00, 0x02, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7633, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x57, 0xDF, 0x00, 0x31, 0x45, 0x00, 0x12, 0xCB, 0x00, 0x11, 0x45, 0x00, 0x12, 0x28, 0x00, 0x30, 0x70, 0x00, 0x51, 0xDC, 0x00, 0x1E, 0x33, 0x80, 0x31, 0xC4, 0x00, 0x20, 0x18, 0x00, 0x61, 0xE3, 0x00, 0x00, 0x1E, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7634, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x31, 0xFC, 0x00, 0x51, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x31, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7635, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x33, 0xDF, 0x00, 0x1C, 0x51, 0x00, 0x12, 0x8A, 0x00, 0x15, 0x06, 0x00, 0x32, 0xFA, 0x00, 0x5C, 0x01, 0x80, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x22, 0x24, 0x00, 0x66, 0x26, 0x00, 0x0C, 0x23, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7638, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x37, 0xDF, 0x00, 0x11, 0x51, 0x00, 0x12, 0x51, 0x00, 0x1C, 0xDF, 0x00, 0x30, 0x00, 0x00, 0x50, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x51, 0x00, 0x24, 0x89, 0x00, 0x64, 0x21, 0x00, 0x04, 0x51, 0x00, 0x04, 0x8B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7639, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x08, 0x00, 0x33, 0x88, 0x00, 0x16, 0xC8, 0x00, 0x1C, 0x5F, 0x80, 0x17, 0x90, 0x80, 0x31, 0x30, 0x80, 0x57, 0xC0, 0x80, 0x11, 0x0E, 0x80, 0x35, 0x40, 0x80, 0x25, 0x40, 0x80, 0x65, 0x01, 0x80, 0x01, 0xC1, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x763A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x57, 0xFF, 0x00, 0x34, 0x01, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x15, 0x99, 0x00, 0x35, 0x55, 0x00, 0x2D, 0x11, 0x00, 0x69, 0x99, 0x00, 0x19, 0x55, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x763B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0B, 0xFE, 0x00, 0x1A, 0x02, 0x00, 0x2B, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFF, 0x80, 0x13, 0x08, 0x00, 0x10, 0xF0, 0x00, 0x2F, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x763C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x04, 0x00, 0x37, 0xFF, 0x00, 0x11, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x33, 0xFE, 0x00, 0x52, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x88, 0x00, 0x03, 0x8E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x763E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x17, 0x3C, 0x00, 0x55, 0x48, 0x00, 0x35, 0x7E, 0x00, 0x16, 0x02, 0x00, 0x15, 0x7E, 0x00, 0x34, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x16, 0x90, 0x00, 0x15, 0x08, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xA5, 0x00, 0x45, 0x25, 0x00, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x763F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xBC, 0x00, 0x54, 0xA4, 0x00, 0x35, 0xAC, 0x00, 0x15, 0xAC, 0x00, 0x13, 0x18, 0x00, 0x34, 0xA4, 0x00, 0x50, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x23, 0x20, 0x00, 0x20, 0xE0, 0x00, 0x41, 0x18, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7640, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x57, 0xFF, 0x00, 0x31, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0x20, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x61, 0x04, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7641, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x20, 0x00, 0x33, 0x7F, 0x80, 0x16, 0xC0, 0x00, 0x1C, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x33, 0x3F, 0x00, 0x56, 0x21, 0x00, 0x1E, 0x3F, 0x00, 0x32, 0x10, 0x00, 0x22, 0x3F, 0x00, 0x62, 0xE2, 0x00, 0x02, 0x1C, 0x00, 0x02, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7642, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x2A, 0x52, 0x00, 0x19, 0x8C, 0x00, 0x0B, 0x06, 0x00, 0x0D, 0xFD, 0x80, 0x09, 0x04, 0x00, 0x19, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x11, 0x24, 0x00, 0x12, 0x22, 0x00, 0x24, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7643, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x57, 0x9F, 0x00, 0x34, 0xB3, 0x00, 0x15, 0x0E, 0x00, 0x15, 0x3B, 0x80, 0x14, 0x80, 0x00, 0x34, 0x8E, 0x00, 0x54, 0x80, 0x00, 0x14, 0xA4, 0x00, 0x35, 0xBF, 0x00, 0x24, 0x64, 0x00, 0x64, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7644, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x10, 0x00, 0x31, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x16, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x20, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x33, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x62, 0x92, 0x00, 0x06, 0xDB, 0x00, 0x0C, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7645, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x13, 0xDE, 0x00, 0x12, 0x52, 0x00, 0x33, 0xDE, 0x00, 0x50, 0x50, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x62, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7646, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x04, 0x00, 0x35, 0x55, 0x00, 0x12, 0x8A, 0x00, 0x14, 0x51, 0x00, 0x10, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x54, 0x01, 0x00, 0x14, 0x41, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x42, 0x00, 0x60, 0xC2, 0x00, 0x01, 0x86, 0x00, 0x07, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7647, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x37, 0xFF, 0x00, 0x54, 0x89, 0x00, 0x14, 0xF9, 0x00, 0x34, 0x89, 0x00, 0x24, 0xF9, 0x00, 0x64, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x9B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7648, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x02, 0x00, 0x37, 0xF4, 0x00, 0x18, 0x98, 0x80, 0x15, 0x8D, 0x00, 0x13, 0x06, 0x00, 0x3F, 0x9F, 0x80, 0x50, 0x92, 0x00, 0x17, 0xB3, 0x00, 0x34, 0x00, 0x00, 0x27, 0xBE, 0x00, 0x60, 0x92, 0x00, 0x00, 0x8C, 0x00, 0x03, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7649, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x53, 0xDE, 0x00, 0x32, 0x52, 0x00, 0x13, 0xDE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x6F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x764A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0x8C, 0x00, 0x14, 0x92, 0x00, 0x14, 0xAD, 0x00, 0x15, 0x40, 0x80, 0x35, 0x3E, 0x00, 0x54, 0x84, 0x00, 0x14, 0xBF, 0x00, 0x35, 0x80, 0x00, 0x24, 0x7F, 0x80, 0x64, 0x12, 0x00, 0x04, 0x27, 0x00, 0x04, 0x79, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x764B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x13, 0xDE, 0x00, 0x12, 0x02, 0x00, 0x33, 0xDE, 0x00, 0x50, 0x50, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0x20, 0x00, 0x21, 0x33, 0x00, 0x65, 0x11, 0x80, 0x0D, 0x84, 0x80, 0x18, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x764C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0xF8, 0x00, 0x18, 0x88, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xCF, 0x00, 0x1A, 0x49, 0x00, 0x2B, 0xCF, 0x00, 0x08, 0x20, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x764D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x40, 0x00, 0x5E, 0x0F, 0x00, 0x35, 0xF4, 0x00, 0x14, 0x24, 0x00, 0x14, 0xA4, 0x00, 0x34, 0xA4, 0x00, 0x5E, 0xAE, 0x00, 0x14, 0x44, 0x00, 0x14, 0xA4, 0x00, 0x25, 0x14, 0x00, 0x27, 0x04, 0x00, 0x5C, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x764E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xCF, 0x00, 0x2A, 0x49, 0x00, 0x1B, 0xCF, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xCF, 0x00, 0x0A, 0x01, 0x00, 0x1A, 0x79, 0x00, 0x2A, 0x49, 0x00, 0x0A, 0x79, 0x00, 0x12, 0x49, 0x00, 0x12, 0x79, 0x00, 0x22, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7652, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x70, 0x00, 0x08, 0x88, 0x00, 0x29, 0x06, 0x00, 0x1E, 0xF9, 0x80, 0x0B, 0xE5, 0x00, 0x0A, 0x25, 0x00, 0x0B, 0xEA, 0x00, 0x1B, 0xEA, 0x00, 0x2A, 0x25, 0x00, 0x0A, 0xE5, 0x00, 0x08, 0x40, 0x00, 0x12, 0xA1, 0x00, 0x14, 0x82, 0x80, 0x28, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7654, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFC, 0x00, 0x51, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFC, 0x00, 0x34, 0x04, 0x00, 0x57, 0xFC, 0x00, 0x14, 0x04, 0x00, 0x17, 0xFC, 0x00, 0x20, 0x40, 0x00, 0x25, 0x22, 0x00, 0x49, 0x0A, 0x00, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7655, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x11, 0x12, 0x00, 0x12, 0x14, 0x00, 0x34, 0xBF, 0x80, 0x55, 0x64, 0x00, 0x12, 0x3F, 0x00, 0x34, 0xA4, 0x00, 0x2F, 0xBF, 0x00, 0x61, 0x24, 0x00, 0x02, 0x3F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7656, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x09, 0xE4, 0x00, 0x29, 0x24, 0x00, 0x19, 0x3F, 0x80, 0x09, 0x20, 0x00, 0x09, 0xEA, 0x00, 0x09, 0x0A, 0x00, 0x19, 0x1F, 0x00, 0x2B, 0xE4, 0x00, 0x0B, 0x24, 0x00, 0x0B, 0x3F, 0x80, 0x15, 0x24, 0x00, 0x15, 0xE4, 0x00, 0x11, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7658, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x88, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x33, 0xFE, 0x00, 0x52, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x64, 0x29, 0x00, 0x05, 0xF5, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7659, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x31, 0x80, 0x00, 0x17, 0x1E, 0x00, 0x14, 0x02, 0x00, 0x17, 0x9E, 0x00, 0x34, 0x02, 0x00, 0x57, 0xFE, 0x00, 0x14, 0x44, 0x00, 0x37, 0x74, 0x00, 0x24, 0x44, 0x00, 0x67, 0x76, 0x80, 0x04, 0x42, 0x80, 0x0E, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x765C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xEF, 0x00, 0x14, 0x29, 0x00, 0x17, 0xE9, 0x00, 0x15, 0x51, 0x80, 0x37, 0xE0, 0x00, 0x55, 0x5F, 0x00, 0x15, 0x49, 0x00, 0x17, 0xED, 0x00, 0x34, 0x07, 0x00, 0x25, 0x42, 0x00, 0x6B, 0x67, 0x00, 0x06, 0x2D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x765E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0x1E, 0x00, 0x57, 0xD2, 0x00, 0x31, 0x24, 0x00, 0x17, 0xDF, 0x00, 0x15, 0x51, 0x00, 0x35, 0x55, 0x00, 0x57, 0xD5, 0x00, 0x11, 0x15, 0x00, 0x13, 0x95, 0x00, 0x25, 0x55, 0x00, 0x29, 0x08, 0x00, 0x41, 0x0A, 0x00, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x765F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x51, 0xFC, 0x00, 0x31, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x31, 0x04, 0x00, 0x53, 0xFE, 0x00, 0x1E, 0x03, 0x80, 0x33, 0xFE, 0x00, 0x22, 0x52, 0x00, 0x63, 0xFE, 0x00, 0x02, 0x52, 0x00, 0x02, 0x56, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7661, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0xC0, 0x00, 0x2B, 0x1E, 0x00, 0x1A, 0x44, 0x00, 0x0B, 0xC8, 0x00, 0x09, 0x7F, 0x80, 0x0A, 0x09, 0x00, 0x1F, 0xC8, 0x00, 0x29, 0x2F, 0x00, 0x0F, 0xE8, 0x00, 0x09, 0x28, 0x00, 0x12, 0xA8, 0x00, 0x14, 0xDF, 0x80, 0x28, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7662, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x88, 0x00, 0x37, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x53, 0x06, 0x00, 0x15, 0xFD, 0x00, 0x39, 0x04, 0x80, 0x21, 0xFD, 0x00, 0x61, 0x13, 0x00, 0x01, 0xCE, 0x00, 0x07, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7663, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x52, 0x14, 0x00, 0x37, 0xBE, 0x00, 0x19, 0x08, 0x00, 0x17, 0xC8, 0x00, 0x35, 0x7E, 0x00, 0x57, 0xC8, 0x00, 0x15, 0x4A, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x08, 0x00, 0x21, 0xC8, 0x00, 0x4E, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7664, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x2D, 0x12, 0x00, 0x18, 0xA1, 0x00, 0x0B, 0xEF, 0x80, 0x0A, 0x28, 0x80, 0x0B, 0xE8, 0x80, 0x1A, 0x28, 0x80, 0x2B, 0xE8, 0x80, 0x0A, 0x08, 0x80, 0x0A, 0x68, 0x80, 0x13, 0x8B, 0x80, 0x12, 0x28, 0x00, 0x23, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7665, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x52, 0x44, 0x00, 0x37, 0x54, 0x00, 0x1D, 0x57, 0x80, 0x11, 0xF5, 0x00, 0x12, 0x0D, 0x00, 0x36, 0xE5, 0x00, 0x5C, 0x07, 0x00, 0x15, 0xF2, 0x00, 0x34, 0x42, 0x00, 0x25, 0xF2, 0x00, 0x64, 0x47, 0x00, 0x05, 0xF5, 0x00, 0x04, 0x0D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7667, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x14, 0x63, 0x00, 0x14, 0xC6, 0x00, 0x15, 0xFF, 0x80, 0x34, 0xE7, 0x00, 0x55, 0x5A, 0x80, 0x14, 0x42, 0x00, 0x34, 0x10, 0x00, 0x2C, 0x9F, 0x00, 0x68, 0x90, 0x00, 0x18, 0x90, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7668, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x53, 0xFF, 0x00, 0x30, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x20, 0x80, 0x15, 0xAE, 0x80, 0x30, 0x20, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x33, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x61, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7669, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x2B, 0xE5, 0x00, 0x18, 0x89, 0x00, 0x0B, 0xF6, 0x00, 0x0A, 0xAF, 0x00, 0x0B, 0xE9, 0x00, 0x18, 0x8F, 0x00, 0x29, 0xC9, 0x00, 0x09, 0xAF, 0x00, 0x0A, 0x89, 0x00, 0x12, 0x8F, 0x00, 0x14, 0x89, 0x00, 0x20, 0x90, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x766A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x50, 0x08, 0x00, 0x31, 0xBF, 0x00, 0x1F, 0x08, 0x00, 0x12, 0x3F, 0x00, 0x1F, 0x88, 0x00, 0x32, 0x7F, 0x80, 0x53, 0x21, 0x00, 0x16, 0xBF, 0x00, 0x36, 0xA1, 0x00, 0x2A, 0x3F, 0x00, 0x62, 0x21, 0x00, 0x02, 0x3F, 0x00, 0x02, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x766B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x5F, 0xFF, 0x00, 0x31, 0x08, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x37, 0xD5, 0x00, 0x54, 0x55, 0x00, 0x17, 0xD5, 0x00, 0x14, 0x55, 0x00, 0x17, 0xD5, 0x00, 0x24, 0x55, 0x00, 0x2F, 0xE8, 0x00, 0x42, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x766C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x09, 0xD1, 0x00, 0x2A, 0x4A, 0x00, 0x1C, 0xBF, 0x80, 0x0B, 0xE4, 0x00, 0x0A, 0xA4, 0x00, 0x1B, 0xFF, 0x00, 0x2A, 0xA4, 0x00, 0x0B, 0xE4, 0x00, 0x0A, 0x1F, 0x80, 0x10, 0x54, 0x00, 0x15, 0x54, 0x00, 0x29, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x766D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x57, 0xDF, 0x00, 0x34, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x34, 0x51, 0x00, 0x57, 0xDF, 0x00, 0x12, 0x8A, 0x00, 0x34, 0x51, 0x00, 0x2F, 0xFF, 0x80, 0x63, 0x08, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x766E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x03, 0x00, 0x57, 0xBE, 0x00, 0x34, 0xA5, 0x00, 0x14, 0xC8, 0x80, 0x15, 0x3F, 0x00, 0x15, 0x08, 0x00, 0x34, 0xFF, 0x80, 0x54, 0x81, 0x00, 0x14, 0xBF, 0x80, 0x35, 0x81, 0x00, 0x24, 0x3F, 0x00, 0x64, 0x55, 0x00, 0x04, 0x52, 0x80, 0x04, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x766F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x51, 0x00, 0x57, 0xDF, 0x00, 0x34, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x31, 0x10, 0x00, 0x53, 0xFF, 0x00, 0x16, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x63, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7670, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0xA5, 0x00, 0x0D, 0x45, 0x00, 0x2A, 0xAA, 0x00, 0x18, 0x1F, 0x80, 0x0B, 0xEA, 0x00, 0x0A, 0x4A, 0x00, 0x1B, 0xCF, 0x80, 0x28, 0x0A, 0x00, 0x0F, 0xEA, 0x00, 0x0D, 0x2F, 0x80, 0x17, 0xEA, 0x00, 0x14, 0x0A, 0x00, 0x14, 0x2F, 0x80, 0x27, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7671, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x89, 0x00, 0x5F, 0xEA, 0x00, 0x32, 0x9F, 0x00, 0x13, 0x94, 0x00, 0x11, 0x14, 0x00, 0x17, 0xD4, 0x00, 0x35, 0x5F, 0x00, 0x57, 0xD4, 0x00, 0x11, 0x14, 0x00, 0x37, 0xDF, 0x00, 0x21, 0x14, 0x00, 0x6F, 0xF4, 0x00, 0x02, 0x94, 0x00, 0x0C, 0xDF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7672, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0x60, 0x00, 0x0B, 0x9F, 0x80, 0x2A, 0x04, 0x00, 0x1B, 0xEF, 0x00, 0x08, 0x09, 0x00, 0x0A, 0xE9, 0x00, 0x0A, 0xAF, 0x00, 0x1A, 0xE9, 0x00, 0x2A, 0xA9, 0x00, 0x0A, 0xEF, 0x00, 0x0A, 0xA9, 0x00, 0x13, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x22, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7674, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x55, 0x75, 0x00, 0x32, 0x02, 0x00, 0x15, 0x74, 0x80, 0x1F, 0x5F, 0x80, 0x12, 0x72, 0x00, 0x3B, 0x06, 0x80, 0x52, 0xFA, 0x80, 0x10, 0x20, 0x00, 0x33, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x6F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7676, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE4, 0x00, 0x01, 0x28, 0x00, 0x23, 0x31, 0x00, 0x16, 0x1A, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7678, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC4, 0x00, 0x10, 0xA8, 0x00, 0x09, 0x11, 0x00, 0x06, 0x0A, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x0C, 0x00, 0x30, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x767A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE4, 0x00, 0x01, 0x28, 0x00, 0x23, 0x31, 0x00, 0x16, 0x1A, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFE, 0x00, 0x72, 0x13, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x767B, { 0x00, 0x00, 0x00, 0x0F, 0xC2, 0x00, 0x00, 0x64, 0x00, 0x10, 0x98, 0x80, 0x09, 0x09, 0x00, 0x02, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x767C, { 0x00, 0x00, 0x00, 0x0F, 0xE4, 0x00, 0x08, 0x69, 0x00, 0x04, 0x92, 0x00, 0x03, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x1F, 0x7C, 0x00, 0x01, 0x45, 0x00, 0x1F, 0x47, 0x00, 0x10, 0x80, 0x00, 0x20, 0xFE, 0x00, 0x3F, 0x44, 0x00, 0x01, 0x28, 0x00, 0x01, 0x10, 0x00, 0x02, 0x6C, 0x00, 0x0D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x767D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x767E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7680, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x00, 0x21, 0xF0, 0x00, 0x3F, 0x00, 0x00, 0x20, 0x02, 0x00, 0x30, 0x06, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7681, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7682, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7683, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7684, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x80, 0x80, 0x23, 0x00, 0x80, 0x22, 0x20, 0x80, 0x3E, 0x10, 0x80, 0x22, 0x08, 0x80, 0x22, 0x00, 0x80, 0x22, 0x00, 0x80, 0x22, 0x00, 0x80, 0x3E, 0x00, 0x80, 0x22, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7685, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0x11, 0x00, 0x45, 0xFF, 0x00, 0x7D, 0x00, 0x00, 0x45, 0x00, 0x00, 0x45, 0x00, 0x00, 0x45, 0x00, 0x00, 0x45, 0x00, 0x80, 0x7D, 0x81, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7686, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x11, 0x80, 0x08, 0x12, 0x00, 0x0F, 0x9C, 0x00, 0x08, 0x10, 0x80, 0x08, 0x10, 0x80, 0x0B, 0xDF, 0x80, 0x3C, 0x80, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7687, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7688, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0xFF, 0x00, 0x44, 0xA1, 0x00, 0x7C, 0xA3, 0x00, 0x44, 0xB2, 0x00, 0x44, 0x96, 0x00, 0x44, 0x9C, 0x00, 0x7D, 0x88, 0x00, 0x01, 0x1C, 0x00, 0x03, 0x36, 0x00, 0x06, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x768B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x768C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x7C, 0x54, 0x00, 0x44, 0x54, 0x00, 0x44, 0x54, 0x00, 0x44, 0xD6, 0x00, 0x44, 0x92, 0x00, 0x7D, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x768D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3F, 0x00, 0x10, 0x21, 0x00, 0x1F, 0xA1, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x1F, 0xA7, 0x00, 0x70, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x768E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x22, 0x42, 0x00, 0x22, 0x81, 0x00, 0x23, 0x42, 0x80, 0x3E, 0x42, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x18, 0x00, 0x22, 0x18, 0x00, 0x3E, 0x24, 0x00, 0x22, 0xC2, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7690, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0x5F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0x5F, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7691, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFE, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x80, 0x00, 0x3E, 0x81, 0x00, 0x22, 0x81, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7693, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x10, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x88, 0x00, 0x22, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7695, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x04, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7696, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x45, 0x01, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x7C, 0xC4, 0x00, 0x00, 0x84, 0x80, 0x01, 0x84, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7699, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x1C, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x28, 0xC4, 0x00, 0x49, 0x84, 0x00, 0x08, 0x44, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x769A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x19, 0x11, 0x00, 0x11, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x44, 0x00, 0x7C, 0x6C, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x769B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x769C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x44, 0x7E, 0x00, 0x44, 0x42, 0x00, 0x44, 0x7E, 0x00, 0x44, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x45, 0x00, 0x80, 0x45, 0x3C, 0x80, 0x45, 0x24, 0x80, 0x45, 0x24, 0x80, 0x7D, 0x3C, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x769D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x10, 0x49, 0x00, 0x3E, 0x6B, 0x00, 0x22, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x64, 0x00, 0x0F, 0x44, 0x80, 0x78, 0xC4, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x769F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76A0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x88, 0x80, 0x10, 0x88, 0x80, 0x7C, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x44, 0x48, 0x00, 0x44, 0xFF, 0x80, 0x44, 0x88, 0x00, 0x7D, 0x88, 0x00, 0x46, 0xFF, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76A2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x44, 0x82, 0x00, 0x45, 0xEF, 0x80, 0x44, 0x82, 0x00, 0x7C, 0xE2, 0x00, 0x45, 0x8F, 0x80, 0x44, 0x00, 0x00, 0x45, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x7C, 0x44, 0x80, 0x00, 0xC4, 0x80, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76A3, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x30, 0x44, 0x00, 0x23, 0xFF, 0x80, 0x78, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x92, 0x00, 0x48, 0x92, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76A4, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x18, 0xF8, 0x00, 0x11, 0x11, 0x00, 0x7C, 0x92, 0x00, 0x47, 0xFF, 0x80, 0x44, 0x54, 0x00, 0x44, 0x56, 0x00, 0x44, 0xD3, 0x00, 0x7D, 0x91, 0x80, 0x44, 0x00, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x91, 0x00, 0x44, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76A5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x20, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x45, 0xD7, 0x00, 0x44, 0x10, 0x00, 0x45, 0xD7, 0x00, 0x7C, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76A6, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x31, 0x04, 0x00, 0x23, 0xE4, 0x00, 0x7A, 0x2F, 0x80, 0x4B, 0xE9, 0x00, 0x4A, 0x39, 0x00, 0x4B, 0xE9, 0x00, 0x48, 0x8D, 0x00, 0x78, 0x85, 0x00, 0x4F, 0xF7, 0x00, 0x49, 0x02, 0x00, 0x49, 0xE2, 0x00, 0x49, 0x27, 0x00, 0x7B, 0x25, 0x00, 0x02, 0x2D, 0x80, 0x06, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76A7, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x33, 0xFC, 0x00, 0x21, 0x21, 0x00, 0x78, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x10, 0x80, 0x49, 0x49, 0x00, 0x49, 0x42, 0x80, 0x7A, 0x3E, 0x00, 0x48, 0x40, 0x00, 0x48, 0xFE, 0x00, 0x49, 0x82, 0x00, 0x4B, 0x4C, 0x00, 0x78, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76A8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76AA, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x33, 0x23, 0x00, 0x22, 0x3A, 0x00, 0x7A, 0xAA, 0x80, 0x49, 0x29, 0x00, 0x49, 0x39, 0x00, 0x4A, 0x2A, 0x00, 0x4A, 0xAA, 0x80, 0x7B, 0xBB, 0x80, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x48, 0xD6, 0x00, 0x79, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76AD, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x33, 0xFC, 0x00, 0x20, 0xA2, 0x00, 0x79, 0x11, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x7B, 0xE1, 0x00, 0x4A, 0x2F, 0x80, 0x4B, 0xE1, 0x00, 0x4A, 0x09, 0x00, 0x4B, 0xED, 0x00, 0x7A, 0x05, 0x00, 0x03, 0xE1, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76AE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x21, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x08, 0x30, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x13, 0x06, 0x00, 0x2C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76B0, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x25, 0x61, 0x00, 0x24, 0x41, 0x00, 0x24, 0xFD, 0x00, 0x3F, 0x25, 0x00, 0x21, 0x25, 0x00, 0x23, 0x3D, 0x00, 0x3A, 0x23, 0x00, 0x2E, 0x22, 0x00, 0x24, 0x26, 0x00, 0x6E, 0x20, 0x00, 0x4A, 0x20, 0x80, 0x1B, 0x31, 0x80, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76B1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x62, 0x49, 0x00, 0x04, 0x4A, 0x00, 0x3F, 0x48, 0x00, 0x01, 0x7E, 0x00, 0x01, 0x42, 0x00, 0x3F, 0x62, 0x00, 0x01, 0x54, 0x00, 0x01, 0x54, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x94, 0x00, 0x01, 0x27, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76B2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x29, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x08, 0x92, 0x00, 0x14, 0x90, 0x00, 0x14, 0xFE, 0x00, 0x3E, 0xC4, 0x00, 0x04, 0xA8, 0x00, 0x04, 0x90, 0x00, 0x7E, 0xA8, 0x00, 0x05, 0x28, 0x00, 0x05, 0x44, 0x00, 0x06, 0x87, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76B4, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x32, 0x04, 0x00, 0x22, 0x04, 0x00, 0x7F, 0x7F, 0x80, 0x15, 0x44, 0x80, 0x34, 0x45, 0x00, 0x67, 0x44, 0x00, 0x10, 0x7F, 0x00, 0x1E, 0x51, 0x00, 0x32, 0x5B, 0x00, 0x66, 0x4A, 0x00, 0x14, 0x4E, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x4E, 0x00, 0x36, 0x9B, 0x00, 0x60, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76B7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x80, 0x3E, 0x48, 0x80, 0x00, 0x49, 0x00, 0x3E, 0x48, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x51, 0x00, 0x3E, 0x53, 0x00, 0x00, 0x5A, 0x00, 0x22, 0x4E, 0x00, 0x36, 0x44, 0x00, 0x14, 0x8E, 0x00, 0x1E, 0x1B, 0x00, 0x70, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76B8, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x40, 0x44, 0x00, 0x44, 0x7F, 0x80, 0x3F, 0xA4, 0x80, 0x04, 0x25, 0x00, 0x3F, 0xA4, 0x00, 0x24, 0xBF, 0x00, 0x3F, 0xA9, 0x00, 0x24, 0xAB, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x2E, 0x00, 0x7F, 0xA4, 0x00, 0x04, 0x4E, 0x00, 0x04, 0x1B, 0x00, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76B9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3A, 0x49, 0x00, 0x2E, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x6E, 0x08, 0x00, 0x4B, 0xFF, 0x80, 0x19, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76BA, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xBF, 0x80, 0x24, 0xA4, 0x00, 0x15, 0xA4, 0x00, 0x15, 0xBF, 0x80, 0x1F, 0xA0, 0x80, 0x18, 0xA1, 0x00, 0x09, 0x29, 0x00, 0x1F, 0xAA, 0x00, 0x34, 0xA6, 0x00, 0x15, 0xA4, 0x00, 0x1F, 0xA6, 0x00, 0x09, 0xAA, 0x00, 0x10, 0xC9, 0x00, 0x23, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76BD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x7F, 0x7F, 0x80, 0x41, 0x44, 0x80, 0x5D, 0x45, 0x00, 0x55, 0x44, 0x00, 0x5D, 0x7F, 0x00, 0x41, 0x51, 0x00, 0x7F, 0x5B, 0x00, 0x22, 0x4A, 0x00, 0x3E, 0x4E, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x4E, 0x00, 0x00, 0x9B, 0x00, 0x7F, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x0F, 0x00, 0x03, 0x01, 0x00, 0x06, 0x01, 0x00, 0x0C, 0x01, 0x00, 0x18, 0x03, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x60, 0x00, 0x00, 0xD8, 0x00, 0x01, 0x46, 0x00, 0x02, 0x41, 0x00, 0x0C, 0x40, 0x80, 0x30, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76C5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76C6, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x0F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x30, 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x0F, 0xA1, 0x00, 0x18, 0x81, 0x00, 0x25, 0x01, 0x00, 0x02, 0x02, 0x00, 0x05, 0x0C, 0x00, 0x09, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76C9, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76CA, { 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0B, 0xFA, 0x00, 0x30, 0x01, 0x80, 0x00, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76CB, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0x84, 0x00, 0x06, 0xEC, 0x00, 0x0C, 0x38, 0x00, 0x18, 0xEE, 0x00, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76CC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xBF, 0x00, 0x18, 0xA1, 0x00, 0x11, 0xA1, 0x00, 0x39, 0x27, 0x00, 0x6B, 0x20, 0x00, 0x06, 0x20, 0x80, 0x0C, 0x31, 0x80, 0x18, 0x1F, 0x00, 0x70, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76CD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x1F, 0x86, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76CE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76CF, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFC, 0x00, 0x3F, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xC1, 0x00, 0x07, 0x31, 0x00, 0x38, 0x0F, 0x00, 0x1F, 0xFC, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D0, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA8, 0x00, 0x04, 0x24, 0x00, 0x04, 0x22, 0x00, 0x07, 0xA2, 0x00, 0x3C, 0x20, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D1, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x50, 0x00, 0x12, 0x8C, 0x00, 0x12, 0x04, 0x00, 0x12, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x40, 0x00, 0x12, 0x46, 0x00, 0x16, 0x4C, 0x00, 0x14, 0xE0, 0x00, 0x11, 0xB0, 0x00, 0x33, 0x1C, 0x00, 0x2E, 0x07, 0x80, 0x60, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D6, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x21, 0x00, 0x03, 0x22, 0x00, 0x08, 0x70, 0x00, 0x18, 0xD8, 0x00, 0x31, 0x8E, 0x00, 0x63, 0x03, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D8, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x10, 0xA8, 0x00, 0x20, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76D9, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76DB, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x41, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x24, 0x00, 0x11, 0x18, 0x00, 0x11, 0x18, 0x00, 0x16, 0x24, 0x80, 0x20, 0xC2, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76DC, { 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0xFF, 0x00, 0x21, 0x22, 0x00, 0x16, 0x24, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x06, 0x00, 0x26, 0x01, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76DE, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x03, 0x98, 0x80, 0x3C, 0xA7, 0x80, 0x00, 0x90, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x88, 0x00, 0x00, 0x70, 0x00, 0x03, 0x98, 0x80, 0x3C, 0x07, 0x80, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x47, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76E0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA1, 0x00, 0x1C, 0x96, 0x00, 0x03, 0x58, 0x00, 0x3C, 0x4C, 0x00, 0x01, 0xC6, 0x00, 0x7E, 0x43, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76E1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76E3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x12, 0x10, 0x00, 0x12, 0x1F, 0x80, 0x1F, 0xA0, 0x00, 0x10, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x12, 0x00, 0x00, 0x12, 0x1F, 0x00, 0x1F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76E4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x80, 0x11, 0x43, 0x80, 0x17, 0x80, 0x00, 0x39, 0x7F, 0x00, 0x15, 0x22, 0x00, 0x15, 0x14, 0x00, 0x21, 0x08, 0x00, 0x23, 0x36, 0x00, 0x00, 0xC1, 0x80, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76E5, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x87, 0x00, 0x20, 0x91, 0x00, 0x3B, 0xA7, 0x00, 0x20, 0xC1, 0x00, 0x21, 0xC1, 0x00, 0x3A, 0xA7, 0x00, 0x24, 0x91, 0x00, 0x21, 0x81, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76E6, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0xC7, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x0F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x0E, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76E7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBD, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0xFE, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76E8, { 0x00, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x1C, 0x10, 0x00, 0x70, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x72, 0xFF, 0x00, 0x06, 0x81, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x42, 0x00, 0x71, 0x81, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x60, 0x84, 0x00, 0x30, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x31, 0xFF, 0x00, 0x22, 0x49, 0x00, 0x60, 0x93, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76EC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x7F, 0x00, 0x48, 0xC8, 0x00, 0x48, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x42, 0x08, 0x00, 0x42, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x48, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76F2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76F4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x78, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x78, 0x48, 0x00, 0x48, 0x48, 0x00, 0x48, 0x48, 0x00, 0x48, 0xC8, 0x00, 0x78, 0x89, 0x00, 0x01, 0x89, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76F8, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x80, 0x02, 0x10, 0x80, 0x1F, 0xD0, 0x80, 0x02, 0x10, 0x80, 0x06, 0x1F, 0x80, 0x07, 0x10, 0x80, 0x0A, 0x90, 0x80, 0x0A, 0x50, 0x80, 0x12, 0x10, 0x80, 0x12, 0x1F, 0x80, 0x22, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x10, 0x80, 0x02, 0x1F, 0x80, 0x02, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x76F9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x27, 0x00, 0x48, 0x3C, 0x00, 0x4B, 0xE0, 0x00, 0x48, 0x20, 0x00, 0x79, 0x24, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x79, 0x24, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x21, 0x00, 0x00, 0x23, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76FB, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x88, 0x00, 0x49, 0x8C, 0x00, 0x4B, 0x06, 0x00, 0x4E, 0x03, 0x00, 0x79, 0xFC, 0x00, 0x48, 0x40, 0x00, 0x48, 0xC0, 0x00, 0x48, 0x80, 0x00, 0x79, 0xFC, 0x00, 0x48, 0x04, 0x00, 0x48, 0x04, 0x00, 0x48, 0x04, 0x00, 0x78, 0x0C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7C, 0x00, 0x48, 0x44, 0x00, 0x48, 0x42, 0x00, 0x48, 0x81, 0x00, 0x79, 0x00, 0x80, 0x4A, 0x00, 0x00, 0x4C, 0xFF, 0x00, 0x48, 0x21, 0x00, 0x78, 0x21, 0x00, 0x48, 0x41, 0x00, 0x48, 0x41, 0x00, 0x48, 0x82, 0x00, 0x78, 0x82, 0x00, 0x49, 0x04, 0x00, 0x46, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x76FE, { 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0xC1, 0x00, 0x3E, 0x81, 0x00, 0x01, 0x81, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7701, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x45, 0x00, 0x20, 0x48, 0x80, 0x01, 0xD0, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7704, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0x10, 0x00, 0x3D, 0x1F, 0x80, 0x25, 0x10, 0x80, 0x25, 0x10, 0x80, 0x25, 0x10, 0x80, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x24, 0x00, 0x80, 0x24, 0x00, 0x80, 0x3C, 0x00, 0x80, 0x24, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7706, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x78, 0x40, 0x00, 0x48, 0x40, 0x00, 0x48, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x78, 0x42, 0x00, 0x48, 0x42, 0x00, 0x48, 0xC2, 0x00, 0x48, 0x86, 0x00, 0x78, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7707, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x7B, 0x26, 0x00, 0x4A, 0x23, 0x00, 0x4E, 0x20, 0x00, 0x48, 0x24, 0x00, 0x78, 0xEC, 0x00, 0x48, 0x08, 0x00, 0x48, 0x18, 0x00, 0x48, 0x30, 0x00, 0x78, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7708, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x10, 0x80, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x18, 0x00, 0x24, 0x28, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x80, 0x3C, 0x88, 0x80, 0x25, 0x0F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7709, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x770A, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x1C, 0x00, 0x49, 0xF0, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x79, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x21, 0x00, 0x00, 0x33, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x770B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x17, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x770C, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x27, 0xF8, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x27, 0xF8, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x27, 0xF8, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8C, 0x00, 0x70, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x770D, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x80, 0x00, 0x22, 0x82, 0x00, 0x22, 0xC2, 0x00, 0x3E, 0xA4, 0x00, 0x22, 0x94, 0x00, 0x22, 0x88, 0x00, 0x3E, 0x94, 0x00, 0x22, 0x94, 0x00, 0x22, 0xA2, 0x00, 0x22, 0xC2, 0x00, 0x3E, 0x80, 0x00, 0x22, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x770E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x78, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x79, 0x24, 0x00, 0x49, 0x24, 0x00, 0x4B, 0x26, 0x00, 0x4A, 0x23, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7712, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7714, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x18, 0x86, 0x00, 0x0C, 0x8C, 0x00, 0x00, 0xD8, 0x00, 0x02, 0xE0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x38, 0x8E, 0x00, 0x60, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7715, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x70, 0x00, 0x48, 0xD8, 0x00, 0x49, 0x8C, 0x00, 0x7B, 0x06, 0x00, 0x4E, 0x23, 0x00, 0x48, 0x60, 0x00, 0x48, 0xC4, 0x00, 0x7B, 0x8C, 0x00, 0x48, 0x18, 0x00, 0x48, 0x71, 0x00, 0x4B, 0xC3, 0x00, 0x78, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7717, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x3D, 0x81, 0x00, 0x24, 0x79, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x79, 0x00, 0x24, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7719, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x44, 0x60, 0x00, 0x44, 0x42, 0x00, 0x44, 0xC2, 0x00, 0x7C, 0x9F, 0x00, 0x45, 0xF1, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x771A, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x30, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x771B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0xA8, 0x00, 0x78, 0xA8, 0x00, 0x48, 0xA8, 0x00, 0x49, 0xAC, 0x00, 0x49, 0x24, 0x00, 0x7B, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x771C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0xA8, 0x00, 0x78, 0xA8, 0x00, 0x48, 0xA8, 0x00, 0x49, 0xAC, 0x00, 0x49, 0x24, 0x00, 0x7B, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x771E, { 0x00, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x771F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7720, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x3C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3C, 0xBA, 0x80, 0x25, 0xC1, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7722, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xBE, 0x00, 0x18, 0xA2, 0x00, 0x31, 0xA2, 0x00, 0x6D, 0x26, 0x00, 0x03, 0x20, 0x80, 0x0E, 0x31, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7724, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFE, 0x00, 0x4A, 0x02, 0x00, 0x4A, 0x02, 0x00, 0x7A, 0x02, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x00, 0x00, 0x4A, 0x40, 0x00, 0x7A, 0x46, 0x00, 0x4A, 0x5C, 0x00, 0x4A, 0x70, 0x00, 0x4A, 0x40, 0x00, 0x7A, 0x40, 0x00, 0x02, 0x41, 0x00, 0x04, 0x63, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7725, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x24, 0x23, 0x00, 0x27, 0xBE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x80, 0x27, 0xA1, 0x80, 0x3C, 0x1F, 0x00, 0x60, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7726, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x48, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x7A, 0x8B, 0x00, 0x4A, 0xEE, 0x00, 0x4A, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x7A, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x7A, 0xE9, 0x00, 0x03, 0x89, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7728, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x7C, 0x1C, 0x00, 0x44, 0xF0, 0x00, 0x44, 0x00, 0x00, 0x44, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x02, 0x00, 0x44, 0x06, 0x00, 0x7C, 0x04, 0x00, 0x44, 0x0C, 0x00, 0x44, 0x18, 0x00, 0x44, 0x30, 0x00, 0x7C, 0x60, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7729, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x24, 0x08, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0xC4, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x10, 0x00, 0x24, 0x22, 0x00, 0x24, 0x41, 0x00, 0x3C, 0x9F, 0x80, 0x25, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x772D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x772E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xBD, 0x00, 0x3C, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xBD, 0x00, 0x24, 0xA5, 0x00, 0x3C, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xBD, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x772F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x49, 0x24, 0x00, 0x49, 0xA4, 0x00, 0x48, 0xAC, 0x00, 0x78, 0xA8, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0xA8, 0x00, 0x78, 0xA8, 0x00, 0x48, 0xA8, 0x00, 0x49, 0xAC, 0x00, 0x49, 0x24, 0x00, 0x7B, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7734, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3C, 0x80, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x81, 0x00, 0x3D, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3C, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3C, 0xF9, 0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7735, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x78, 0x40, 0x00, 0x48, 0x7C, 0x00, 0x48, 0xC4, 0x00, 0x49, 0x8C, 0x00, 0x7B, 0x58, 0x00, 0x48, 0x30, 0x00, 0x48, 0xE8, 0x00, 0x4B, 0x8F, 0x00, 0x78, 0x19, 0x00, 0x48, 0x33, 0x00, 0x48, 0xEA, 0x00, 0x48, 0x06, 0x00, 0x78, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7736, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x00, 0x00, 0x4A, 0xFE, 0x00, 0x4A, 0x10, 0x00, 0x7A, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0x7C, 0x00, 0x4A, 0x10, 0x00, 0x7A, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0xFE, 0x00, 0x7A, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7737, { 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x37, 0xFD, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7738, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x50, 0x80, 0x24, 0x90, 0x00, 0x25, 0xFF, 0x00, 0x26, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7739, { 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x79, 0x0C, 0x00, 0x4B, 0x06, 0x00, 0x4E, 0x03, 0x00, 0x4B, 0xFE, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x78, 0x50, 0x00, 0x48, 0x50, 0x00, 0x48, 0xD8, 0x00, 0x48, 0x88, 0x00, 0x79, 0x8C, 0x00, 0x03, 0x06, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x773A, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x25, 0x29, 0x00, 0x24, 0xAA, 0x00, 0x3C, 0xAC, 0x00, 0x24, 0x28, 0x00, 0x24, 0x2C, 0x00, 0x24, 0x6A, 0x00, 0x25, 0xA9, 0x00, 0x3E, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x48, 0x00, 0x24, 0x88, 0x80, 0x3D, 0x0F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x773C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x91, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x8C, 0x00, 0x22, 0x88, 0x00, 0x22, 0x84, 0x00, 0x3E, 0xBA, 0x00, 0x23, 0xC1, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x773D, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x78, 0x38, 0x00, 0x49, 0xE0, 0x00, 0x49, 0x06, 0x00, 0x49, 0x3C, 0x00, 0x79, 0x20, 0x00, 0x49, 0x22, 0x00, 0x49, 0x26, 0x00, 0x49, 0x2C, 0x00, 0x79, 0x30, 0x00, 0x49, 0x28, 0x00, 0x49, 0x28, 0x00, 0x49, 0x2C, 0x00, 0x79, 0x24, 0x00, 0x02, 0x2E, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x773E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x08, 0x64, 0x00, 0x08, 0xC4, 0x00, 0x0B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1C, 0x8E, 0x00, 0x14, 0x8A, 0x00, 0x36, 0x9B, 0x00, 0x62, 0xB1, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7740, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x17, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7741, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x24, 0xFC, 0x00, 0x25, 0x08, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xFC, 0x00, 0x24, 0x24, 0x00, 0x24, 0x24, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x24, 0x00, 0x3C, 0x20, 0x00, 0x24, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7742, { 0x00, 0x00, 0x00, 0x03, 0x81, 0x00, 0x0E, 0x71, 0x00, 0x38, 0x19, 0x00, 0x03, 0x81, 0x00, 0x0E, 0x71, 0x00, 0x38, 0x19, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x44, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7743, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x48, 0x00, 0x24, 0x84, 0x00, 0x25, 0xFE, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x86, 0x00, 0x25, 0x42, 0x00, 0x3C, 0x7C, 0x00, 0x24, 0x84, 0x00, 0x24, 0x88, 0x00, 0x25, 0x50, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x50, 0x00, 0x00, 0x8C, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7745, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x79, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7746, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x02, 0x00, 0x4A, 0x02, 0x00, 0x79, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x78, 0x90, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x49, 0x90, 0x00, 0x79, 0x11, 0x00, 0x03, 0x13, 0x00, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7747, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x78, 0x88, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x22, 0x00, 0x48, 0x22, 0x00, 0x7B, 0xFE, 0x00, 0x4A, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x78, 0x61, 0x00, 0x48, 0x61, 0x00, 0x48, 0xA3, 0x00, 0x49, 0xA2, 0x00, 0x7B, 0x2E, 0x00, 0x06, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x774A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x774D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x28, 0x00, 0x24, 0x28, 0x80, 0x3C, 0x48, 0x80, 0x24, 0x8F, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x774E, { 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x78, 0x6C, 0x00, 0x48, 0x38, 0x00, 0x48, 0x6C, 0x00, 0x49, 0xC6, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x48, 0x90, 0x00, 0x79, 0xFE, 0x00, 0x4A, 0x92, 0x00, 0x48, 0x92, 0x00, 0x48, 0x92, 0x00, 0x78, 0x92, 0x00, 0x00, 0x96, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x774F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x7D, 0x00, 0x25, 0x11, 0x00, 0x25, 0x39, 0x00, 0x25, 0x39, 0x00, 0x3D, 0x55, 0x00, 0x25, 0x55, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7750, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x24, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x3D, 0x24, 0x00, 0x24, 0xA8, 0x00, 0x24, 0x32, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x60, 0x00, 0x24, 0x70, 0x00, 0x24, 0xA8, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x27, 0x00, 0x02, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7751, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0x07, 0x00, 0x3E, 0x12, 0x00, 0x24, 0xF8, 0x00, 0x24, 0x00, 0x00, 0x3D, 0x24, 0x00, 0x25, 0x24, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA8, 0x00, 0x3C, 0xA8, 0x00, 0x24, 0x12, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7752, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x79, 0x22, 0x00, 0x49, 0x26, 0x00, 0x4B, 0x74, 0x00, 0x4A, 0x50, 0x00, 0x78, 0xD8, 0x00, 0x49, 0x8C, 0x00, 0x4B, 0x07, 0x00, 0x48, 0x20, 0x00, 0x79, 0x22, 0x00, 0x49, 0x26, 0x00, 0x4B, 0x74, 0x00, 0x4A, 0x50, 0x00, 0x78, 0xD8, 0x00, 0x01, 0x8C, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7756, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x78, 0x88, 0x00, 0x49, 0x88, 0x00, 0x4B, 0x0F, 0x00, 0x48, 0x40, 0x00, 0x78, 0x7C, 0x00, 0x48, 0xC4, 0x00, 0x49, 0x8C, 0x00, 0x4B, 0x58, 0x00, 0x78, 0x70, 0x00, 0x00, 0xDC, 0x00, 0x07, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7757, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x79, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x80, 0x00, 0x79, 0xFF, 0x00, 0x4E, 0x49, 0x00, 0x48, 0x89, 0x00, 0x4B, 0x11, 0x00, 0x78, 0x23, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x775A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x7A, 0xFE, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x4B, 0xFF, 0x00, 0x7A, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0xFE, 0x00, 0x4A, 0x10, 0x00, 0x7A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x775B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x3C, 0x41, 0x00, 0x24, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x775C, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x3C, 0x00, 0x4B, 0xE4, 0x00, 0x48, 0xA6, 0x00, 0x49, 0x12, 0x00, 0x79, 0xFE, 0x00, 0x48, 0x22, 0x00, 0x48, 0x22, 0x00, 0x4B, 0xFF, 0x00, 0x78, 0x22, 0x00, 0x48, 0x22, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x775E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x49, 0x24, 0x00, 0x79, 0x24, 0x00, 0x49, 0x24, 0x00, 0x4B, 0xAE, 0x00, 0x4A, 0xAA, 0x00, 0x7E, 0x73, 0x00, 0x48, 0x70, 0x00, 0x48, 0xA8, 0x00, 0x49, 0xAC, 0x00, 0x7B, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x775F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x48, 0x88, 0x00, 0x78, 0x88, 0x00, 0x49, 0xDC, 0x00, 0x4B, 0x56, 0x00, 0x48, 0x00, 0x00, 0x78, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7760, { 0x00, 0x00, 0x00, 0x01, 0x24, 0x00, 0x7B, 0x26, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x50, 0x00, 0x78, 0x50, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x88, 0x00, 0x49, 0x04, 0x00, 0x7B, 0xFE, 0x00, 0x4F, 0x0B, 0x00, 0x49, 0x08, 0x00, 0x49, 0x38, 0x00, 0x79, 0x02, 0x00, 0x01, 0x06, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7761, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x39, 0xF0, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x38, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x92, 0x00, 0x38, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x38, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7762, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x78, 0x66, 0x00, 0x48, 0x44, 0x00, 0x48, 0xFF, 0x00, 0x49, 0x88, 0x00, 0x7A, 0x88, 0x00, 0x48, 0x88, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x88, 0x00, 0x78, 0x88, 0x00, 0x48, 0x88, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x88, 0x00, 0x78, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7763, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xBF, 0x80, 0x02, 0x11, 0x00, 0x3F, 0xEA, 0x00, 0x02, 0x0A, 0x00, 0x12, 0x84, 0x00, 0x22, 0x4A, 0x00, 0x0E, 0x11, 0x80, 0x00, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7764, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFE, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x7B, 0xFE, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xFE, 0x00, 0x78, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x78, 0x88, 0x00, 0x01, 0x88, 0x00, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7765, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x40, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x7B, 0xFE, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xFE, 0x00, 0x78, 0x50, 0x00, 0x48, 0x90, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7766, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x48, 0x00, 0x24, 0x88, 0x80, 0x25, 0x0F, 0x80, 0x3E, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7767, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x79, 0xF8, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0xC5, 0x00, 0x4B, 0x03, 0x00, 0x79, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7768, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x7B, 0x9E, 0x00, 0x4A, 0x02, 0x00, 0x4A, 0x02, 0x00, 0x4B, 0xDE, 0x00, 0x7A, 0x02, 0x00, 0x4A, 0x02, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x90, 0x00, 0x78, 0x90, 0x00, 0x48, 0x90, 0x00, 0x48, 0x90, 0x00, 0x49, 0x90, 0x00, 0x79, 0x11, 0x00, 0x03, 0x13, 0x00, 0x06, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x776A, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x776B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x11, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x11, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x9F, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x25, 0x50, 0x00, 0x3D, 0x3F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x776C, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x3C, 0x00, 0x4B, 0xE0, 0x00, 0x48, 0x44, 0x00, 0x79, 0x66, 0x00, 0x4B, 0x22, 0x00, 0x4A, 0x00, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0xA8, 0x00, 0x48, 0xA8, 0x00, 0x79, 0xAC, 0x00, 0x03, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7770, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x78, 0x84, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x84, 0x00, 0x48, 0x84, 0x00, 0x78, 0x40, 0x00, 0x48, 0x40, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x80, 0x00, 0x78, 0x80, 0x00, 0x49, 0xFE, 0x00, 0x4A, 0x82, 0x00, 0x48, 0x82, 0x00, 0x78, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7772, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x79, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x49, 0x20, 0x00, 0x7B, 0xFE, 0x00, 0x4E, 0x20, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x78, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7773, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x48, 0x92, 0x00, 0x7B, 0x7D, 0x80, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x78, 0x00, 0x00, 0x48, 0x10, 0x00, 0x48, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x78, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7774, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x01, 0x00, 0x4A, 0x21, 0x00, 0x79, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x22, 0x00, 0x79, 0xFE, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0xFE, 0x00, 0x78, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7779, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x80, 0x3C, 0xFF, 0x80, 0x24, 0x11, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x0C, 0x00, 0x24, 0x12, 0x00, 0x24, 0x60, 0x00, 0x3D, 0xFF, 0x00, 0x26, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x3C, 0x41, 0x00, 0x24, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x777A, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x79, 0x7E, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x4A, 0xFF, 0x80, 0x7A, 0x00, 0x00, 0x4E, 0x40, 0x00, 0x4A, 0x7F, 0x00, 0x4A, 0x88, 0x00, 0x7A, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x4A, 0x14, 0x00, 0x4A, 0x36, 0x00, 0x7A, 0x22, 0x00, 0x02, 0x63, 0x00, 0x02, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x777D, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x79, 0xFA, 0x00, 0x4A, 0x28, 0x80, 0x49, 0x6D, 0x00, 0x48, 0xC6, 0x00, 0x79, 0x83, 0x00, 0x4B, 0x01, 0x80, 0x48, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x28, 0x00, 0x48, 0x28, 0x00, 0x78, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x777E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x777F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x03, 0xFC, 0x00, 0x04, 0x42, 0x00, 0x18, 0xA1, 0x80, 0x03, 0x18, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x05, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7780, { 0x00, 0x00, 0x00, 0x3F, 0x20, 0x00, 0x02, 0x3F, 0x80, 0x14, 0x62, 0x00, 0x7F, 0x92, 0x00, 0x0D, 0x14, 0x00, 0x14, 0x0C, 0x00, 0x64, 0x32, 0x00, 0x0C, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7784, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x78, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x48, 0x44, 0x00, 0x78, 0x00, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x79, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x79, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7785, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0xE8, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x89, 0x00, 0x24, 0xAB, 0x00, 0x3F, 0xDC, 0x00, 0x24, 0x88, 0x00, 0x25, 0xC8, 0x00, 0x25, 0xA8, 0x00, 0x3E, 0x88, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x3C, 0xA3, 0x00, 0x24, 0xC2, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x778B, { 0x00, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x3C, 0xF8, 0x00, 0x24, 0x80, 0x80, 0x24, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x3C, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xBF, 0x00, 0x3C, 0xA1, 0x00, 0x24, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x3C, 0xBF, 0x00, 0x24, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x778C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x40, 0x00, 0x48, 0xC2, 0x00, 0x48, 0x8F, 0x00, 0x79, 0xF9, 0x80, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x7A, 0x49, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x778D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0xD0, 0x00, 0x49, 0x97, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x79, 0xD7, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xD7, 0x00, 0x78, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x82, 0x00, 0x48, 0x4C, 0x00, 0x78, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x778E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x02, 0x00, 0x4A, 0x22, 0x00, 0x79, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x79, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7791, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7792, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x3C, 0x8A, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x48, 0x00, 0x24, 0x4A, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x25, 0xB6, 0x00, 0x25, 0x02, 0x00, 0x3D, 0x02, 0x00, 0x25, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7794, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x7B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x79, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7795, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x84, 0x00, 0x48, 0x48, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x79, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x7B, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7796, { 0x00, 0x00, 0x00, 0x7F, 0xBC, 0x00, 0x48, 0x24, 0x00, 0x4F, 0x27, 0x00, 0x54, 0x40, 0x00, 0x7F, 0xBE, 0x00, 0x4A, 0x14, 0x00, 0x51, 0x08, 0x00, 0x7F, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x779A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x80, 0x4A, 0xFE, 0x80, 0x78, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x79, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x49, 0x11, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x82, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x779E, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x44, 0x00, 0x28, 0x7C, 0x00, 0x38, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0xD6, 0x80, 0x3A, 0x52, 0x80, 0x2A, 0x52, 0x80, 0x2A, 0xB5, 0x80, 0x2A, 0x10, 0x80, 0x3A, 0x10, 0x80, 0x2A, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x779F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x49, 0x00, 0x7A, 0x49, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x78, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x49, 0x24, 0x00, 0x7B, 0x26, 0x00, 0x06, 0x23, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77A0, { 0x00, 0x00, 0x00, 0x02, 0x22, 0x00, 0x7B, 0x26, 0x00, 0x49, 0x24, 0x00, 0x4B, 0xFE, 0x00, 0x7A, 0x02, 0x00, 0x4A, 0xFA, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x78, 0xF8, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFC, 0x00, 0x78, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77A2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7E, 0x1F, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77A5, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x24, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xA1, 0x00, 0x24, 0xD2, 0x00, 0x2E, 0x8C, 0x00, 0x35, 0x8C, 0x00, 0x24, 0x92, 0x00, 0x25, 0xA1, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77A7, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x78, 0x48, 0x00, 0x48, 0xFF, 0x80, 0x48, 0x88, 0x00, 0x49, 0x88, 0x00, 0x7A, 0xFF, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x48, 0xFF, 0x00, 0x78, 0x88, 0x00, 0x48, 0x88, 0x00, 0x48, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x78, 0xA9, 0x00, 0x01, 0xAD, 0x80, 0x01, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77A9, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFF, 0x00, 0x3A, 0x02, 0x00, 0x2B, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x3A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x3A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3B, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x09, 0x15, 0x00, 0x11, 0x7D, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77AA, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x79, 0xE8, 0x00, 0x4A, 0x31, 0x00, 0x49, 0x4A, 0x00, 0x48, 0x84, 0x00, 0x7B, 0x7B, 0x00, 0x48, 0x00, 0x00, 0x48, 0xFC, 0x00, 0x48, 0x84, 0x00, 0x78, 0x84, 0x00, 0x48, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x48, 0x84, 0x00, 0x78, 0xCC, 0x00, 0x00, 0x48, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77AC, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x38, 0xF0, 0x00, 0x28, 0x01, 0x00, 0x28, 0x89, 0x00, 0x28, 0x49, 0x00, 0x39, 0xFF, 0x80, 0x29, 0x00, 0x80, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x39, 0xFF, 0x80, 0x29, 0x32, 0x00, 0x2A, 0xD2, 0x00, 0x2C, 0x7F, 0x80, 0x38, 0x82, 0x00, 0x29, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77AD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x29, 0x29, 0x00, 0x28, 0xC6, 0x00, 0x38, 0x82, 0x00, 0x2B, 0x01, 0x80, 0x28, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x38, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x38, 0x92, 0x00, 0x29, 0x11, 0x00, 0x02, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77AE, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x78, 0x84, 0x00, 0x4F, 0xF4, 0x00, 0x49, 0x07, 0x80, 0x49, 0x4D, 0x00, 0x7A, 0x69, 0x00, 0x4B, 0xA5, 0x00, 0x48, 0x05, 0x00, 0x4B, 0xE5, 0x00, 0x7A, 0x27, 0x00, 0x4B, 0xE2, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xE7, 0x00, 0x7A, 0x25, 0x00, 0x02, 0x25, 0x00, 0x02, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x7D, 0x00, 0x25, 0x45, 0x00, 0x3D, 0x7D, 0x00, 0x25, 0x45, 0x00, 0x25, 0x7D, 0x00, 0x25, 0x45, 0x00, 0x3D, 0x4D, 0x00, 0x01, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77B0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0xE4, 0x00, 0x28, 0x88, 0x00, 0x28, 0x8F, 0x00, 0x2F, 0xFA, 0x00, 0x2A, 0x4A, 0x00, 0x3A, 0x52, 0x00, 0x2B, 0xD2, 0x00, 0x2A, 0x6A, 0x00, 0x2E, 0x4A, 0x00, 0x3B, 0xCC, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2B, 0xCA, 0x00, 0x3E, 0x49, 0x00, 0x28, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77B1, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x78, 0x44, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x78, 0x92, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x92, 0x00, 0x78, 0x92, 0x00, 0x49, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77B3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x24, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77B5, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x78, 0x92, 0x00, 0x48, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x54, 0x00, 0x78, 0xD6, 0x00, 0x4B, 0x93, 0x80, 0x48, 0x90, 0x00, 0x48, 0xE2, 0x00, 0x79, 0xAF, 0x80, 0x4B, 0x2A, 0x00, 0x48, 0xEA, 0x00, 0x48, 0x5F, 0x80, 0x78, 0xC2, 0x00, 0x01, 0x82, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77B6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x24, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x79, 0xFC, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77B9, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7B, 0xFC, 0x00, 0x49, 0x21, 0x00, 0x48, 0x92, 0x00, 0x4B, 0xFF, 0x80, 0x7A, 0x10, 0x80, 0x49, 0x49, 0x00, 0x49, 0x42, 0x80, 0x4A, 0x3E, 0x00, 0x78, 0x40, 0x00, 0x48, 0xFE, 0x00, 0x49, 0x82, 0x00, 0x4B, 0x4C, 0x00, 0x78, 0x38, 0x00, 0x00, 0xEE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77BB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x3E, 0x00, 0x24, 0x44, 0x00, 0x24, 0xFF, 0x80, 0x25, 0x94, 0x80, 0x3E, 0xA7, 0x80, 0x24, 0xC0, 0x00, 0x24, 0x9E, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x3C, 0x9E, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x3C, 0xA1, 0x00, 0x25, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77BC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x44, 0x00, 0x24, 0x83, 0x00, 0x25, 0x00, 0x80, 0x26, 0xFE, 0x00, 0x3C, 0x00, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x3D, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x25, 0x45, 0x00, 0x3E, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77BD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x04, 0x00, 0x7F, 0xBF, 0x00, 0x21, 0x11, 0x00, 0x3F, 0x1B, 0x00, 0x12, 0x0E, 0x00, 0x0F, 0x9B, 0x00, 0x78, 0x31, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77BE, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2E, 0x11, 0x00, 0x78, 0x9F, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77BF, { 0x00, 0x00, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77C3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x20, 0x80, 0x4A, 0x50, 0x80, 0x79, 0x45, 0x00, 0x4A, 0x7C, 0x80, 0x48, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x79, 0x49, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77C7, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x4B, 0xFF, 0x00, 0x4A, 0x01, 0x00, 0x7A, 0xFD, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x78, 0xA3, 0x00, 0x4B, 0x56, 0x00, 0x48, 0x90, 0x00, 0x4B, 0x38, 0x00, 0x78, 0xD4, 0x00, 0x03, 0x13, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77C9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x80, 0x49, 0x00, 0x80, 0x48, 0xFF, 0x00, 0x48, 0x52, 0x00, 0x79, 0x94, 0x00, 0x48, 0x18, 0x00, 0x48, 0xFF, 0x00, 0x4B, 0x81, 0x00, 0x78, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x48, 0x81, 0x00, 0x78, 0xFF, 0x00, 0x00, 0x42, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77CD, { 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x68, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77D1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x1E, 0x00, 0x48, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x10, 0x80, 0x79, 0x7E, 0x00, 0x49, 0x10, 0x80, 0x49, 0x7F, 0x80, 0x49, 0x49, 0x00, 0x79, 0x7F, 0x00, 0x49, 0x49, 0x00, 0x49, 0x7F, 0x00, 0x4B, 0x00, 0x00, 0x7A, 0xFF, 0x00, 0x06, 0xA9, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77D2, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xC7, 0x80, 0x48, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x29, 0x00, 0x79, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x00, 0x80, 0x7A, 0xFE, 0x80, 0x48, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x78, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77D5, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x68, 0x05, 0x00, 0x11, 0xE2, 0x00, 0x24, 0x04, 0x80, 0x7D, 0xEF, 0x80, 0x11, 0x22, 0x00, 0x55, 0xEB, 0x00, 0x54, 0x0A, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77D7, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0B, 0xFC, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0xFC, 0x00, 0x0A, 0x04, 0x00, 0x0B, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xDF, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77D9, { 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x74, 0x48, 0x80, 0x57, 0xCF, 0x80, 0x54, 0x48, 0x80, 0x57, 0xCF, 0x80, 0x74, 0x00, 0x80, 0x55, 0xC8, 0x80, 0x54, 0x8F, 0x80, 0x57, 0xFA, 0x80, 0x74, 0x0A, 0x80, 0x57, 0xEE, 0x80, 0x55, 0x44, 0x80, 0x55, 0xCE, 0x80, 0x75, 0x4B, 0x80, 0x07, 0xD8, 0x80, 0x04, 0x51, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77DA, { 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x74, 0x01, 0x00, 0x57, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x75, 0xD7, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x75, 0xFF, 0x80, 0x54, 0xA0, 0x80, 0x57, 0xFE, 0x80, 0x55, 0x22, 0x80, 0x75, 0xFE, 0x80, 0x04, 0x29, 0x80, 0x08, 0x7D, 0x00, 0x03, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC1, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x40, 0x00, 0x30, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77DC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x14, 0x00, 0x02, 0x12, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xC0, 0x80, 0x04, 0x3E, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x7F, 0x00, 0x14, 0x01, 0x00, 0x14, 0x02, 0x00, 0x24, 0x02, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77DE, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x03, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xC2, 0x00, 0x06, 0x44, 0x00, 0x38, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x22, 0x39, 0x00, 0x24, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x15, 0x00, 0x23, 0xF3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77DF, { 0x00, 0x00, 0x00, 0x3F, 0x88, 0x00, 0x01, 0x2A, 0x00, 0x0A, 0x6B, 0x00, 0x04, 0x49, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x00, 0x0D, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x44, 0x41, 0x00, 0x04, 0x41, 0x00, 0x14, 0x41, 0x00, 0x0C, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77E0, { 0x00, 0x00, 0x00, 0x3F, 0x92, 0x00, 0x01, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x04, 0x7F, 0x80, 0x02, 0x12, 0x00, 0x7F, 0x92, 0x00, 0x0D, 0x12, 0x00, 0x0E, 0x7F, 0x80, 0x14, 0x00, 0x00, 0x14, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x24, 0x21, 0x00, 0x44, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x14, 0x21, 0x00, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77E2, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77E3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x02, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0xC1, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77E4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7C, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x90, 0x00, 0x3D, 0x10, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x04, 0x28, 0x00, 0x04, 0x6C, 0x00, 0x04, 0x44, 0x00, 0x0C, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x3B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77E5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x1F, 0xD1, 0x00, 0x12, 0x11, 0x00, 0x22, 0x11, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x05, 0x11, 0x00, 0x04, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x5F, 0x00, 0x10, 0x51, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77E6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x10, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x11, 0xFC, 0x00, 0x13, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x70, 0x00, 0x30, 0x50, 0x00, 0x20, 0xD8, 0x00, 0x61, 0x8C, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77E7, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x28, 0x11, 0x00, 0x68, 0xF1, 0x00, 0x08, 0x81, 0x00, 0x7F, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xF1, 0x00, 0x1C, 0x11, 0x00, 0x14, 0x11, 0x00, 0x16, 0x11, 0x00, 0x32, 0x31, 0x00, 0x60, 0x21, 0x00, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77E9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x14, 0x20, 0x00, 0x24, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x06, 0x20, 0x00, 0x05, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x10, 0x3F, 0x80, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77EA, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x3E, 0x10, 0x00, 0x68, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x52, 0x00, 0x08, 0x4A, 0x00, 0x7F, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x1C, 0x52, 0x00, 0x14, 0x4A, 0x00, 0x36, 0x4A, 0x00, 0x22, 0xCA, 0x00, 0x60, 0x82, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77EB, { 0x00, 0x00, 0x00, 0x10, 0x0C, 0x00, 0x11, 0xF0, 0x00, 0x14, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x28, 0x22, 0x00, 0x4B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x8F, 0x00, 0x0A, 0x8A, 0x00, 0x08, 0x88, 0x00, 0x14, 0x88, 0x00, 0x12, 0x88, 0x00, 0x20, 0x88, 0x00, 0x41, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77EC, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x92, 0x00, 0x68, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0xD7, 0x00, 0x7F, 0x55, 0x00, 0x0A, 0x38, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x16, 0x10, 0x00, 0x32, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77ED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x3F, 0xC1, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x14, 0x00, 0x11, 0x14, 0x00, 0x10, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77EE, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x10, 0x78, 0x00, 0x1F, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0xC9, 0x80, 0x3F, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0C, 0x22, 0x00, 0x12, 0x64, 0x00, 0x12, 0x98, 0x00, 0x10, 0x36, 0x00, 0x21, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77EF, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x09, 0x45, 0x80, 0x3F, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x13, 0x7D, 0x00, 0x13, 0x45, 0x00, 0x11, 0x7D, 0x00, 0x21, 0x01, 0x00, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77F0, { 0x00, 0x00, 0x00, 0x10, 0x2E, 0x00, 0x10, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x68, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0xAA, 0x80, 0x7F, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x16, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x60, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77F1, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x10, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x68, 0x44, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x48, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x1C, 0x7F, 0x80, 0x36, 0x00, 0x00, 0x62, 0x7F, 0x00, 0x00, 0x26, 0x00, 0x00, 0x1C, 0x00, 0x00, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x77F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x34, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x04, 0x01, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77F6, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x32, 0x44, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x85, 0x00, 0x1E, 0x85, 0x00, 0x11, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77FB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x60, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x12, 0x03, 0x00, 0x32, 0x06, 0x00, 0x52, 0x0C, 0x00, 0x12, 0x18, 0x00, 0x12, 0x30, 0x00, 0x12, 0x60, 0x00, 0x1E, 0x40, 0x80, 0x00, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x32, 0x08, 0x00, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77FD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x10, 0x41, 0x00, 0x10, 0x42, 0x00, 0x3E, 0xA2, 0x00, 0x53, 0x12, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77FE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7E, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x14, 0xC8, 0x00, 0x3E, 0xA8, 0x00, 0x54, 0xA8, 0x00, 0x14, 0x88, 0x00, 0x14, 0x88, 0x00, 0x14, 0x88, 0x00, 0x14, 0x88, 0x00, 0x1D, 0x09, 0x00, 0x15, 0x09, 0x00, 0x02, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x77FF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x10, 0x80, 0x00, 0x12, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x32, 0x80, 0x00, 0x52, 0x80, 0x00, 0x12, 0x80, 0x00, 0x12, 0x80, 0x00, 0x1E, 0x80, 0x00, 0x11, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7800, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0x42, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0x2A, 0x00, 0x52, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x52, 0x00, 0x12, 0x92, 0x00, 0x1E, 0xA2, 0x00, 0x11, 0x2A, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7801, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x12, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x32, 0x8A, 0x00, 0x52, 0xFF, 0x00, 0x12, 0x02, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFA, 0x00, 0x12, 0x02, 0x00, 0x1E, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7802, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x25, 0x00, 0x08, 0x25, 0x00, 0x08, 0x24, 0x80, 0x10, 0x44, 0x80, 0x1F, 0x44, 0x00, 0x29, 0x04, 0x80, 0x29, 0x04, 0x80, 0x09, 0x1D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x02, 0x00, 0x09, 0x04, 0x00, 0x0F, 0x08, 0x00, 0x09, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7805, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x80, 0x13, 0xD1, 0x80, 0x10, 0x5B, 0x00, 0x3C, 0x5A, 0x00, 0x24, 0x54, 0x00, 0x64, 0xD4, 0x00, 0x24, 0x96, 0x00, 0x24, 0x92, 0x00, 0x25, 0x93, 0x00, 0x25, 0x11, 0x80, 0x3F, 0x10, 0x80, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7806, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x14, 0x00, 0x12, 0x36, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7809, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x1C, 0x02, 0x00, 0x74, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x780C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7E, 0x9F, 0x80, 0x10, 0x84, 0x80, 0x10, 0x84, 0x80, 0x10, 0xE4, 0x80, 0x13, 0x84, 0x80, 0x3C, 0x84, 0x80, 0x24, 0x84, 0x80, 0x64, 0x84, 0x80, 0x24, 0x84, 0x80, 0x24, 0xAC, 0x80, 0x24, 0xA8, 0x80, 0x24, 0x68, 0x80, 0x3C, 0x19, 0x80, 0x00, 0x31, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x780D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x80, 0x10, 0xC0, 0x80, 0x10, 0x91, 0x80, 0x3D, 0x91, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x24, 0x38, 0x00, 0x24, 0x28, 0x00, 0x24, 0x6C, 0x00, 0x24, 0x44, 0x00, 0x3C, 0xC6, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x780E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x11, 0xC7, 0x00, 0x3F, 0x45, 0x80, 0x24, 0x44, 0x00, 0x64, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0xC4, 0x00, 0x3C, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7811, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7F, 0x02, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFF, 0x80, 0x1E, 0x06, 0x00, 0x12, 0x0E, 0x00, 0x32, 0x0A, 0x00, 0x52, 0x1A, 0x00, 0x12, 0x12, 0x00, 0x12, 0x22, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x82, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7812, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xC4, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x80, 0x08, 0x7D, 0x00, 0x08, 0x46, 0x00, 0x10, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x29, 0x44, 0x00, 0x09, 0x44, 0x00, 0x09, 0x44, 0x00, 0x09, 0x44, 0x80, 0x09, 0x7C, 0x80, 0x0F, 0xC7, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7814, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x18, 0x22, 0x00, 0x10, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x32, 0x22, 0x00, 0x52, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x62, 0x00, 0x1E, 0x42, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7815, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x24, 0x00, 0x10, 0x64, 0x00, 0x10, 0x44, 0x80, 0x3C, 0xC4, 0x80, 0x25, 0x83, 0x80, 0x64, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7816, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x20, 0x00, 0x7F, 0x24, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x10, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x52, 0x40, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x30, 0x00, 0x12, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7817, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x10, 0x50, 0x00, 0x10, 0x90, 0x00, 0x1E, 0x94, 0x00, 0x33, 0xFE, 0x00, 0x52, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7818, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x32, 0x92, 0x00, 0x52, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x12, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x11, 0x00, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x781A, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x94, 0x00, 0x10, 0x94, 0x00, 0x12, 0x94, 0x00, 0x3F, 0xA4, 0x00, 0x52, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x12, 0x30, 0x00, 0x12, 0x50, 0x00, 0x1E, 0x51, 0x00, 0x12, 0x91, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x781C, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x7F, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x11, 0x8C, 0x00, 0x11, 0x4C, 0x00, 0x1D, 0x54, 0x00, 0x35, 0x54, 0x00, 0x55, 0x24, 0x00, 0x15, 0x24, 0x00, 0x15, 0x54, 0x00, 0x15, 0x4C, 0x00, 0x1D, 0x8D, 0x00, 0x12, 0x05, 0x00, 0x04, 0x05, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x781D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x52, 0x18, 0x00, 0x12, 0x30, 0x00, 0x12, 0x21, 0x00, 0x12, 0x61, 0x00, 0x1E, 0x4F, 0x80, 0x00, 0xF8, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x781F, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7F, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x20, 0x00, 0x1E, 0x24, 0x00, 0x32, 0x3E, 0x00, 0x52, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x24, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7820, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x42, 0x00, 0x32, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x52, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7821, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7822, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x79, 0x00, 0x08, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x52, 0x49, 0x00, 0x12, 0x79, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x1E, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7823, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x1E, 0x20, 0x00, 0x12, 0x20, 0x00, 0x32, 0x26, 0x00, 0x52, 0x38, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x1E, 0x20, 0x80, 0x00, 0x30, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7825, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3E, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0x88, 0x00, 0x32, 0x88, 0x00, 0x32, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0xF4, 0x80, 0x13, 0x82, 0x80, 0x1E, 0x01, 0x80, 0x12, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7826, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0x13, 0x80, 0x09, 0xFC, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0xF0, 0x80, 0x1E, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0C, 0x01, 0x00, 0x34, 0x01, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7827, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x0F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x09, 0x41, 0x00, 0x0F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7829, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x7E, 0x4A, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4A, 0x00, 0x11, 0xFE, 0x00, 0x3D, 0x48, 0x00, 0x55, 0x48, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x4D, 0x00, 0x1C, 0x4A, 0x00, 0x00, 0x88, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x782C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x81, 0x00, 0x3E, 0x41, 0x00, 0x32, 0x42, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x04, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x782D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x0E, 0x00, 0x08, 0x70, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x32, 0x02, 0x00, 0x52, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0x10, 0x00, 0x12, 0xA0, 0x00, 0x1E, 0xE0, 0x00, 0x00, 0x98, 0x00, 0x00, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x782E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xC1, 0x00, 0x09, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x0C, 0x0A, 0x00, 0x0A, 0x11, 0x00, 0x11, 0x20, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x34, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7830, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x52, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7832, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x81, 0x00, 0x09, 0x01, 0x00, 0x08, 0x7D, 0x00, 0x1F, 0x45, 0x00, 0x19, 0x45, 0x00, 0x29, 0x7D, 0x00, 0x09, 0x41, 0x00, 0x09, 0x46, 0x00, 0x09, 0x40, 0x80, 0x09, 0x40, 0x80, 0x0F, 0x7F, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7834, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x3E, 0xFF, 0x00, 0x32, 0xA1, 0x00, 0x32, 0x92, 0x00, 0x12, 0x94, 0x00, 0x12, 0x88, 0x00, 0x12, 0x8C, 0x00, 0x1E, 0x92, 0x00, 0x12, 0xA1, 0x00, 0x11, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7835, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x1E, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x32, 0x2A, 0x00, 0x52, 0x49, 0x00, 0x12, 0x88, 0x80, 0x12, 0x3E, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7837, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x52, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7838, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0xBE, 0x00, 0x12, 0xAA, 0x00, 0x3F, 0xAA, 0x00, 0x52, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAE, 0x00, 0x1E, 0x88, 0x00, 0x12, 0x8A, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7839, { 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x82, 0x00, 0x32, 0x82, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x28, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x44, 0x00, 0x10, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x783A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x90, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x9F, 0x00, 0x64, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x25, 0x91, 0x00, 0x3D, 0x31, 0x00, 0x03, 0x21, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x783B, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x14, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x80, 0x00, 0x02, 0x98, 0x00, 0x04, 0xE2, 0x00, 0x1B, 0x82, 0x00, 0x60, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x0C, 0x08, 0x00, 0x14, 0x08, 0x00, 0x67, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x783C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x10, 0x44, 0x00, 0x12, 0x82, 0x00, 0x1F, 0x01, 0x00, 0x32, 0x04, 0x00, 0x52, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x783E, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x7E, 0xF0, 0x00, 0x08, 0x80, 0x00, 0x08, 0x90, 0x00, 0x10, 0x90, 0x00, 0x12, 0x92, 0x00, 0x3F, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x54, 0x00, 0x12, 0x92, 0x00, 0x1E, 0x91, 0x00, 0x11, 0x11, 0x00, 0x02, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x783F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x3C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x64, 0x88, 0x00, 0x24, 0x98, 0x00, 0x24, 0x90, 0x00, 0x24, 0x92, 0x00, 0x24, 0xB3, 0x00, 0x3D, 0xA1, 0x00, 0x01, 0x2F, 0x80, 0x03, 0x78, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7840, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x08, 0x49, 0x00, 0x09, 0x49, 0x00, 0x1F, 0xFF, 0x00, 0x29, 0x08, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x0F, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7843, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x1C, 0x00, 0x52, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x88, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7844, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x89, 0x00, 0x08, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x1E, 0x1C, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x14, 0x00, 0x52, 0x14, 0x00, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x12, 0x24, 0x00, 0x1E, 0x24, 0x80, 0x00, 0x44, 0x80, 0x00, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7845, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x19, 0x08, 0x00, 0x29, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7847, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x1E, 0x82, 0x80, 0x12, 0xA2, 0x80, 0x32, 0x94, 0x80, 0x52, 0x88, 0x80, 0x12, 0x94, 0x80, 0x12, 0xA6, 0x80, 0x12, 0xC2, 0x80, 0x1E, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7848, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x00, 0x00, 0x52, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x784C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x24, 0x00, 0x1E, 0x18, 0x00, 0x12, 0x18, 0x00, 0x32, 0x24, 0x00, 0x52, 0x42, 0x00, 0x12, 0x81, 0x00, 0x13, 0x7E, 0x80, 0x12, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x784E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0xF8, 0x80, 0x08, 0x90, 0x80, 0x08, 0x92, 0x80, 0x08, 0x92, 0x80, 0x08, 0x92, 0x80, 0x1F, 0xFE, 0x80, 0x12, 0x92, 0x80, 0x32, 0x92, 0x80, 0x52, 0x92, 0x80, 0x12, 0x92, 0x80, 0x12, 0x90, 0x80, 0x12, 0x90, 0x80, 0x1E, 0x90, 0x80, 0x01, 0x92, 0x80, 0x03, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x784F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x1F, 0x9B, 0x80, 0x19, 0x76, 0x00, 0x29, 0x12, 0x00, 0x29, 0x12, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0F, 0x42, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7850, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x11, 0x7A, 0x00, 0x11, 0x02, 0x00, 0x1D, 0x02, 0x00, 0x35, 0x7A, 0x00, 0x55, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x15, 0x7A, 0x00, 0x15, 0x4A, 0x00, 0x1D, 0x02, 0x00, 0x11, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7852, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x1E, 0x94, 0x80, 0x12, 0x94, 0x80, 0x32, 0x94, 0x80, 0x52, 0xA7, 0x80, 0x12, 0xA0, 0x80, 0x12, 0xC0, 0x80, 0x12, 0x80, 0x80, 0x1E, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7855, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x10, 0xFF, 0x00, 0x12, 0x82, 0x00, 0x1F, 0x92, 0x00, 0x32, 0x92, 0x00, 0x52, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x2C, 0x00, 0x00, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7856, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x11, 0x24, 0x00, 0x10, 0xA4, 0x00, 0x1C, 0xA8, 0x00, 0x34, 0x22, 0x00, 0x57, 0xFF, 0x00, 0x14, 0x50, 0x00, 0x14, 0x50, 0x00, 0x14, 0x88, 0x00, 0x14, 0x88, 0x00, 0x1D, 0x04, 0x00, 0x12, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7857, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x3E, 0x00, 0x09, 0xE0, 0x00, 0x10, 0x14, 0x00, 0x10, 0x09, 0x00, 0x1E, 0x35, 0x00, 0x32, 0xC3, 0x00, 0x52, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x89, 0x00, 0x10, 0x89, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x785C, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x08, 0x24, 0x80, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x92, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x32, 0x24, 0x80, 0x52, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x785D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x08, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x785E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x88, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7860, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x52, 0x50, 0x00, 0x12, 0x51, 0x80, 0x12, 0x4E, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x46, 0x00, 0x00, 0x73, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7861, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x90, 0x80, 0x1E, 0x10, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x10, 0x00, 0x52, 0x34, 0x00, 0x12, 0x24, 0x00, 0x12, 0x64, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x89, 0x80, 0x00, 0x9F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7863, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x7D, 0x00, 0x08, 0x12, 0x00, 0x08, 0x14, 0x00, 0x09, 0xFF, 0x80, 0x1E, 0x10, 0x00, 0x12, 0x60, 0x00, 0x33, 0xBE, 0x00, 0x52, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7864, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x29, 0x00, 0x1E, 0x29, 0x00, 0x12, 0x29, 0x00, 0x32, 0x5A, 0x80, 0x52, 0x9C, 0x80, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7868, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x49, 0x00, 0x52, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x786A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x2A, 0x00, 0x08, 0x69, 0x00, 0x09, 0xC9, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFF, 0x80, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x32, 0x59, 0x00, 0x52, 0x69, 0x00, 0x13, 0xC6, 0x00, 0x12, 0x44, 0x00, 0x12, 0x4A, 0x00, 0x1E, 0x52, 0x80, 0x00, 0x41, 0x80, 0x01, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x786B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x42, 0x00, 0x10, 0x9F, 0x00, 0x3F, 0xE0, 0x80, 0x32, 0x00, 0x00, 0x32, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x11, 0x12, 0x80, 0x12, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x786C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x28, 0x00, 0x09, 0x10, 0x00, 0x09, 0x28, 0x00, 0x0F, 0x46, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x786D, { 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x12, 0x00, 0x33, 0xFF, 0x00, 0x52, 0x80, 0x00, 0x12, 0x80, 0x00, 0x12, 0x80, 0x00, 0x12, 0x80, 0x00, 0x12, 0x80, 0x00, 0x1E, 0x84, 0x00, 0x10, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x786E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x88, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x49, 0x00, 0x52, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x786F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x19, 0x21, 0x00, 0x29, 0x21, 0x00, 0x29, 0x3F, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x80, 0x0F, 0x43, 0x80, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7872, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC9, 0x80, 0x18, 0x1C, 0x00, 0x10, 0x14, 0x00, 0x1E, 0x36, 0x00, 0x32, 0x63, 0x00, 0x32, 0xC1, 0x80, 0x52, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7874, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x28, 0x00, 0x3C, 0x68, 0x00, 0x24, 0x49, 0x80, 0x64, 0xCB, 0x00, 0x25, 0xCE, 0x00, 0x27, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3C, 0x48, 0x80, 0x00, 0x49, 0x80, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7877, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x11, 0x07, 0x00, 0x16, 0xFA, 0x00, 0x3C, 0x00, 0x00, 0x54, 0x20, 0x00, 0x15, 0x24, 0x00, 0x14, 0xA6, 0x00, 0x14, 0xA4, 0x00, 0x14, 0xA8, 0x00, 0x1C, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x787A, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x21, 0x00, 0x08, 0x51, 0x00, 0x08, 0x9A, 0x00, 0x1E, 0x6C, 0x00, 0x12, 0x48, 0x00, 0x32, 0xBC, 0x00, 0x52, 0x2C, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x09, 0x00, 0x1E, 0x10, 0x80, 0x00, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x787C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0xD6, 0x80, 0x10, 0xB5, 0x80, 0x10, 0x94, 0x80, 0x1C, 0xD6, 0x80, 0x34, 0xB5, 0x80, 0x34, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x1D, 0x18, 0x80, 0x15, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x787E, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7F, 0x3C, 0x00, 0x08, 0x68, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x33, 0xFF, 0x80, 0x52, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7881, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0x81, 0x80, 0x01, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x1A, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7886, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x31, 0xFE, 0x00, 0x09, 0x42, 0x00, 0x1B, 0x66, 0x00, 0x32, 0x3C, 0x00, 0x66, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x1C, 0x02, 0x00, 0x74, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7887, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x32, 0x48, 0x00, 0x12, 0x4F, 0x80, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0xA8, 0x00, 0x1E, 0x9F, 0x80, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7889, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x1F, 0x92, 0x00, 0x32, 0xFE, 0x00, 0x52, 0x82, 0x00, 0x12, 0xBA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xBA, 0x00, 0x1E, 0x82, 0x00, 0x11, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x788A, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x7F, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x80, 0x1E, 0x34, 0x80, 0x12, 0xC3, 0x80, 0x32, 0x24, 0x00, 0x52, 0x22, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x12, 0x14, 0x00, 0x1E, 0x18, 0x80, 0x00, 0x34, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x788C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x3E, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x12, 0x89, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x1E, 0x4A, 0x00, 0x12, 0x89, 0x00, 0x11, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x788D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x29, 0x02, 0x00, 0x29, 0x02, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x09, 0x12, 0x00, 0x0F, 0x02, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x788E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x55, 0x00, 0x10, 0x88, 0x80, 0x1F, 0x00, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x788F, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x52, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7891, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0x7F, 0x00, 0x29, 0x24, 0x00, 0x09, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7893, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x36, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x7F, 0x80, 0x08, 0xC4, 0x00, 0x19, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x44, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7894, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0x05, 0x00, 0x08, 0xF4, 0x80, 0x08, 0x04, 0x80, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x1E, 0x04, 0x00, 0x12, 0x24, 0x00, 0x32, 0x24, 0x00, 0x52, 0x24, 0x00, 0x12, 0x3E, 0x00, 0x12, 0xA2, 0x80, 0x12, 0xA2, 0x80, 0x1E, 0xA3, 0x80, 0x00, 0xB9, 0x80, 0x01, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7895, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x3C, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x02, 0x00, 0x64, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3C, 0xF2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7897, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x1E, 0x99, 0x00, 0x32, 0x99, 0x00, 0x33, 0x69, 0x00, 0x12, 0x2B, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x88, 0x80, 0x1F, 0x0F, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7898, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x7F, 0x14, 0x00, 0x08, 0x14, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x1E, 0x55, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x55, 0x00, 0x52, 0x55, 0x00, 0x12, 0x55, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x1E, 0x21, 0x00, 0x00, 0x40, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x789A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x66, 0x00, 0x10, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x25, 0xFF, 0x80, 0x64, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x789B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x52, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x1E, 0x2C, 0x00, 0x10, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x789C, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x84, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x1C, 0x48, 0x00, 0x34, 0x94, 0x00, 0x55, 0x23, 0x00, 0x16, 0xCA, 0x00, 0x14, 0x10, 0x00, 0x14, 0x64, 0x00, 0x15, 0x88, 0x00, 0x1C, 0x10, 0x00, 0x10, 0x60, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x789D, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x1E, 0x55, 0x00, 0x12, 0x55, 0x00, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x1E, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x789E, { 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x14, 0x04, 0x00, 0x64, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x789F, { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x2E, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x3F, 0x00, 0x32, 0x08, 0x00, 0x52, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x88, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78A1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1E, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x49, 0x00, 0x52, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x7F, 0x80, 0x00, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x20, 0x00, 0x1E, 0x40, 0x00, 0x1A, 0x7F, 0x80, 0x2A, 0xC8, 0x80, 0x2B, 0x54, 0x80, 0x0A, 0x62, 0x80, 0x0A, 0x40, 0x80, 0x0A, 0x7F, 0x80, 0x0E, 0x40, 0x80, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78A4, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x22, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x52, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x14, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78A5, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x1D, 0x00, 0x00, 0x35, 0x02, 0x00, 0x55, 0xFF, 0x00, 0x15, 0xAA, 0x00, 0x15, 0xAA, 0x00, 0x16, 0xFE, 0x00, 0x14, 0xAA, 0x00, 0x1C, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78A7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x07, 0xA1, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x14, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78A8, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x52, 0x40, 0x00, 0x12, 0x51, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x52, 0x00, 0x00, 0x61, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x1F, 0xA1, 0x00, 0x18, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x0F, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78AA, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x64, 0x42, 0x00, 0x25, 0xFF, 0x80, 0x24, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xC7, 0x80, 0x3C, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78AC, { 0x00, 0x00, 0x00, 0x00, 0xF7, 0x80, 0x7F, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0xF7, 0x80, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1E, 0x80, 0x00, 0x12, 0xF7, 0x80, 0x32, 0x80, 0x80, 0x52, 0x85, 0x80, 0x12, 0x85, 0x00, 0x12, 0xF3, 0x00, 0x12, 0x82, 0x00, 0x1E, 0x87, 0x00, 0x00, 0x84, 0x80, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78AD, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x32, 0x3F, 0x80, 0x52, 0x2A, 0x80, 0x12, 0x4A, 0x80, 0x12, 0x92, 0x80, 0x12, 0x24, 0x80, 0x1E, 0x49, 0x00, 0x00, 0x11, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78AF, { 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x7E, 0x92, 0x00, 0x11, 0x24, 0x00, 0x10, 0x92, 0x00, 0x10, 0x49, 0x00, 0x10, 0x00, 0x00, 0x3C, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x65, 0x01, 0x00, 0x25, 0x45, 0x00, 0x25, 0x29, 0x00, 0x25, 0x11, 0x00, 0x25, 0x29, 0x00, 0x3D, 0x45, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78B0, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x24, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x12, 0xA5, 0x00, 0x32, 0xA5, 0x00, 0x52, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xE7, 0x00, 0x12, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x00, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78B1, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7E, 0x05, 0x00, 0x10, 0x04, 0x80, 0x10, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x3D, 0x74, 0x00, 0x25, 0x04, 0x00, 0x65, 0x74, 0x00, 0x25, 0x54, 0x00, 0x25, 0x55, 0x00, 0x25, 0x76, 0x00, 0x25, 0x06, 0x80, 0x3E, 0x0A, 0x80, 0x02, 0x11, 0x80, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78B2, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x32, 0x88, 0x80, 0x52, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78B3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x1E, 0x80, 0x00, 0x12, 0x88, 0x00, 0x32, 0xC9, 0x00, 0x52, 0xAA, 0x00, 0x12, 0x88, 0x00, 0x12, 0x94, 0x00, 0x12, 0x94, 0x00, 0x1F, 0x22, 0x00, 0x01, 0x41, 0x00, 0x02, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78B4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x70, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x27, 0x00, 0x3E, 0x22, 0x00, 0x55, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x15, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x15, 0xFC, 0x00, 0x1C, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78B5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x0F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x32, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78B9, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x12, 0x02, 0x00, 0x10, 0xFE, 0x00, 0x1E, 0x00, 0x00, 0x32, 0xFE, 0x00, 0x52, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x1E, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78BA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x32, 0xC8, 0x00, 0x33, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x80, 0x1E, 0x40, 0x00, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78BB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x32, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x12, 0xBE, 0x80, 0x12, 0xA2, 0x80, 0x12, 0xBE, 0x80, 0x12, 0xA2, 0x80, 0x1E, 0x80, 0x80, 0x12, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x3E, 0xFF, 0x00, 0x32, 0x90, 0x00, 0x12, 0x90, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x84, 0x80, 0x12, 0x12, 0x80, 0x12, 0x48, 0x80, 0x1E, 0xA1, 0x00, 0x12, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78BD, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x24, 0x00, 0x3D, 0x24, 0x00, 0x25, 0xFF, 0x00, 0x65, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x49, 0x00, 0x25, 0x4A, 0x00, 0x3D, 0x4C, 0x00, 0x02, 0x76, 0x00, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78BF, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x7F, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x49, 0x00, 0x3D, 0x88, 0x80, 0x25, 0x7F, 0x00, 0x65, 0x41, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x3D, 0x41, 0x00, 0x02, 0x41, 0x00, 0x04, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78C1, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x44, 0x00, 0x3E, 0x94, 0x80, 0x33, 0x18, 0x80, 0x32, 0xA5, 0x00, 0x12, 0x42, 0x00, 0x12, 0x84, 0x00, 0x13, 0x29, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78C5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x41, 0x00, 0x08, 0x22, 0x00, 0x08, 0x14, 0x00, 0x11, 0xFF, 0x80, 0x1F, 0x10, 0x80, 0x32, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x32, 0x20, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x82, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x5E, 0x00, 0x10, 0x52, 0x00, 0x10, 0x52, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x65, 0x7E, 0x80, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78C7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x99, 0x00, 0x1E, 0xA5, 0x00, 0x12, 0x81, 0x00, 0x32, 0xFF, 0x00, 0x52, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x77, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78C8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x32, 0xFE, 0x00, 0x52, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x54, 0x80, 0x12, 0x57, 0x80, 0x1E, 0x90, 0x80, 0x00, 0x90, 0x80, 0x01, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78C9, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x26, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x73, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x1E, 0x55, 0x00, 0x12, 0x22, 0x00, 0x32, 0xDD, 0x80, 0x52, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x1C, 0x00, 0x1E, 0x2A, 0x00, 0x00, 0x49, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x0E, 0x02, 0x00, 0x32, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xBF, 0x00, 0x28, 0xD1, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78CB, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x24, 0x00, 0x08, 0x14, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x32, 0x20, 0x00, 0x32, 0x20, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x88, 0x00, 0x1E, 0xFF, 0x80, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78CC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x40, 0x80, 0x08, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x1E, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x32, 0xA1, 0x00, 0x52, 0xBF, 0x00, 0x12, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x12, 0x80, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78CE, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3F, 0x72, 0x00, 0x08, 0x51, 0x00, 0x08, 0x88, 0x80, 0x10, 0x20, 0x00, 0x10, 0x28, 0x00, 0x20, 0xC8, 0x00, 0x3E, 0x52, 0x00, 0x32, 0x2F, 0x00, 0x13, 0xF0, 0x80, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x46, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78D0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x15, 0x22, 0x80, 0x15, 0x23, 0x80, 0x17, 0x40, 0x00, 0x39, 0xFF, 0x00, 0x15, 0x22, 0x00, 0x25, 0x14, 0x00, 0x23, 0x0C, 0x00, 0x00, 0x93, 0x80, 0x01, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78D1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x64, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x44, 0x00, 0x24, 0x6C, 0x00, 0x3C, 0x28, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78D2, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x64, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78D3, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7D, 0x08, 0x00, 0x11, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x21, 0x00, 0x11, 0xA1, 0x00, 0x3C, 0xBF, 0x00, 0x24, 0x20, 0x00, 0x65, 0xA0, 0x00, 0x24, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x3D, 0xBF, 0x00, 0x01, 0x40, 0x00, 0x03, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78D4, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7C, 0xE2, 0x00, 0x11, 0xAF, 0x80, 0x11, 0x2A, 0x00, 0x13, 0xEA, 0x00, 0x10, 0x4A, 0x00, 0x3C, 0xDF, 0x80, 0x25, 0x82, 0x00, 0x67, 0x02, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x24, 0x56, 0x00, 0x3C, 0xD3, 0x00, 0x01, 0x91, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78D5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x3C, 0x40, 0x00, 0x24, 0xC2, 0x00, 0x64, 0x8F, 0x00, 0x25, 0xF9, 0x80, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0x29, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEF, 0x80, 0x10, 0x61, 0x80, 0x11, 0xA6, 0x80, 0x10, 0x2C, 0x80, 0x10, 0xE3, 0x80, 0x3D, 0xAE, 0x80, 0x24, 0x20, 0x80, 0x64, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78D9, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x11, 0x23, 0x00, 0x12, 0x49, 0x00, 0x1C, 0x84, 0x00, 0x35, 0xFE, 0x00, 0x54, 0x40, 0x00, 0x14, 0x44, 0x00, 0x14, 0xA8, 0x00, 0x15, 0x90, 0x00, 0x16, 0x88, 0x00, 0x1C, 0xA4, 0x00, 0x10, 0xC7, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78DA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x64, 0xFF, 0x00, 0x24, 0x12, 0x00, 0x24, 0x7F, 0x00, 0x25, 0xC1, 0x80, 0x24, 0x02, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78DB, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x7F, 0xC7, 0x00, 0x04, 0x1C, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0xB2, 0x00, 0x04, 0x22, 0x00, 0x7F, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEF, 0x00, 0x10, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x10, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x3C, 0x11, 0x00, 0x24, 0x38, 0x00, 0x64, 0xEE, 0x00, 0x27, 0x83, 0x80, 0x24, 0x10, 0x00, 0x24, 0xE4, 0x00, 0x24, 0x19, 0x00, 0x3C, 0xE2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78E0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x10, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x45, 0x00, 0x65, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0x93, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x3D, 0x45, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78E1, { 0x00, 0x00, 0x00, 0x01, 0x24, 0x00, 0x7D, 0x24, 0x00, 0x13, 0xF4, 0x00, 0x11, 0x24, 0x00, 0x11, 0xEF, 0x80, 0x11, 0x24, 0x80, 0x39, 0xE4, 0x80, 0x29, 0x24, 0x80, 0x6B, 0xF4, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x2B, 0x34, 0x80, 0x2A, 0x04, 0x80, 0x3A, 0x0C, 0x80, 0x03, 0xE8, 0x80, 0x00, 0x1B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78E4, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x7D, 0xCF, 0x00, 0x11, 0x09, 0x00, 0x11, 0xE9, 0x00, 0x11, 0x29, 0x00, 0x11, 0xF1, 0x80, 0x39, 0x20, 0x00, 0x29, 0x3F, 0x80, 0x69, 0xE9, 0x80, 0x29, 0x09, 0x00, 0x29, 0xEB, 0x00, 0x29, 0x2A, 0x00, 0x2B, 0x26, 0x00, 0x3A, 0x6C, 0x00, 0x06, 0x4B, 0x00, 0x00, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x3D, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x64, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x92, 0x00, 0x3D, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78E7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x64, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78E8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x00, 0x13, 0x01, 0x00, 0x15, 0x01, 0x00, 0x29, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78EA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x90, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x67, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x25, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78EC, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xDE, 0x00, 0x02, 0x12, 0x80, 0x3F, 0xF3, 0x80, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x1F, 0xD2, 0x00, 0x10, 0x0C, 0x00, 0x20, 0x33, 0x80, 0x00, 0xC0, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78EF, { 0x00, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x09, 0x29, 0x00, 0x0A, 0x71, 0x00, 0x09, 0xAE, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x3F, 0x80, 0x3F, 0xF4, 0x00, 0x32, 0x22, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x91, 0x00, 0x12, 0x92, 0x00, 0x13, 0x4C, 0x00, 0x12, 0x0C, 0x80, 0x1E, 0x32, 0x80, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x9F, 0x80, 0x10, 0xD0, 0x00, 0x13, 0x1F, 0x00, 0x11, 0x91, 0x00, 0x10, 0x5F, 0x00, 0x3C, 0xD0, 0x00, 0x25, 0x9F, 0x80, 0x65, 0x00, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x24, 0xD6, 0x00, 0x3D, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78F3, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x7E, 0xC3, 0x00, 0x11, 0x81, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x11, 0x92, 0x80, 0x3D, 0x54, 0x80, 0x25, 0x10, 0x80, 0x65, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78F4, { 0x00, 0x00, 0x00, 0x01, 0xF9, 0x00, 0x7E, 0x2A, 0x80, 0x11, 0x6D, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x64, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x6C, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x08, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x08, 0xF7, 0x80, 0x10, 0x80, 0x80, 0x1E, 0x80, 0x80, 0x1A, 0x9C, 0x80, 0x1A, 0x94, 0x80, 0x2A, 0x9C, 0x80, 0x2A, 0x94, 0x80, 0x0A, 0x9C, 0x80, 0x0A, 0x80, 0x80, 0x0A, 0x80, 0x80, 0x0E, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78F6, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x7E, 0xCF, 0x00, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0xEF, 0x00, 0x10, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x64, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x25, 0x80, 0x80, 0x27, 0x02, 0x80, 0x24, 0xAA, 0x80, 0x3C, 0xA8, 0x80, 0x01, 0x01, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78F7, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x7C, 0x92, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x3D, 0x93, 0x00, 0x27, 0x11, 0x80, 0x64, 0xE2, 0x00, 0x24, 0xAF, 0x00, 0x25, 0x2A, 0x00, 0x24, 0xAA, 0x00, 0x24, 0x5F, 0x80, 0x3C, 0xC2, 0x00, 0x01, 0x82, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78FA, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x65, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x82, 0x00, 0x01, 0x83, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78FB, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3E, 0xF8, 0x00, 0x08, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x09, 0xFF, 0x80, 0x10, 0x1C, 0x00, 0x10, 0x2A, 0x00, 0x3E, 0x49, 0x00, 0x33, 0x88, 0x80, 0x32, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x78FD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x42, 0x00, 0x3D, 0xEF, 0x80, 0x24, 0x42, 0x00, 0x64, 0x72, 0x00, 0x25, 0xCF, 0x80, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x80, 0x00, 0xC4, 0x80, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x78FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0xC7, 0x00, 0x27, 0x1C, 0x00, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x23, 0x8E, 0x00, 0x2D, 0x55, 0x80, 0x21, 0x04, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x80, 0x00, 0x41, 0xFE, 0x00, 0x47, 0x02, 0x00, 0x1D, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7900, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xEF, 0x80, 0x11, 0x28, 0x80, 0x11, 0xEF, 0x80, 0x11, 0x28, 0x80, 0x11, 0xEF, 0x80, 0x3D, 0x00, 0x80, 0x25, 0x3C, 0x80, 0x65, 0x24, 0x80, 0x25, 0x3C, 0x80, 0x25, 0x24, 0x80, 0x25, 0x3C, 0x80, 0x25, 0x24, 0x80, 0x3D, 0x2C, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7901, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x48, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x32, 0xFF, 0x00, 0x32, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x12, 0x00, 0x00, 0x1E, 0xA9, 0x00, 0x13, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7905, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x0B, 0xE8, 0x00, 0x08, 0x0F, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xEA, 0x00, 0x34, 0x0A, 0x00, 0x57, 0xEA, 0x00, 0x14, 0x4A, 0x00, 0x14, 0x84, 0x00, 0x14, 0xE4, 0x00, 0x17, 0x8A, 0x00, 0x1C, 0x8A, 0x00, 0x12, 0x91, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7906, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x10, 0x7C, 0x00, 0x3C, 0x00, 0x00, 0x25, 0xEF, 0x00, 0x65, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x01, 0xC7, 0x00, 0x03, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7907, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x19, 0x00, 0x11, 0x71, 0x00, 0x11, 0x55, 0x00, 0x3D, 0x39, 0x00, 0x25, 0x7D, 0x00, 0x65, 0x39, 0x00, 0x25, 0x55, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x3C, 0x6C, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x790C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x56, 0x80, 0x3D, 0x10, 0x80, 0x25, 0x56, 0x00, 0x64, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x790E, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0xE6, 0x00, 0x09, 0x5D, 0x00, 0x12, 0x54, 0x80, 0x10, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x32, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x11, 0x00, 0x12, 0x90, 0x00, 0x12, 0x9F, 0x00, 0x13, 0x50, 0x00, 0x1F, 0x3F, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7910, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1D, 0x2E, 0x00, 0x10, 0xC2, 0x00, 0x1D, 0x2E, 0x00, 0x10, 0x02, 0x00, 0x1D, 0x2E, 0x00, 0x10, 0xC2, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x1C, 0x04, 0x00, 0x74, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7911, { 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x7E, 0xD3, 0x00, 0x10, 0x52, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x11, 0x7E, 0x80, 0x3C, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x64, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7912, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7E, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x02, 0x00, 0x65, 0xE9, 0x00, 0x24, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x49, 0x00, 0x24, 0x6A, 0x00, 0x3D, 0xC4, 0x80, 0x00, 0x4A, 0x80, 0x00, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7913, { 0x00, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x1F, 0xFF, 0x00, 0x32, 0x00, 0x00, 0x52, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x1E, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7916, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0xD3, 0x00, 0x08, 0x99, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x10, 0xDF, 0x00, 0x10, 0x81, 0x00, 0x1E, 0x9D, 0x00, 0x32, 0xE7, 0x00, 0x32, 0x95, 0x00, 0x32, 0x95, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x81, 0x00, 0x13, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7919, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7E, 0x5F, 0x80, 0x13, 0x81, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x44, 0x00, 0x11, 0xDF, 0x80, 0x3A, 0x04, 0x80, 0x2B, 0xC5, 0x00, 0x2D, 0x14, 0x00, 0x69, 0x17, 0x00, 0x2F, 0xD4, 0x00, 0x29, 0x14, 0x00, 0x29, 0x94, 0x00, 0x39, 0x5C, 0x00, 0x02, 0x36, 0x00, 0x04, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x791A, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x64, 0x44, 0x00, 0x24, 0x82, 0x00, 0x25, 0xFD, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x29, 0x00, 0x01, 0x29, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x791C, { 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x1C, 0xEE, 0x00, 0x10, 0x82, 0x00, 0x1C, 0xEE, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x2E, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x18, 0x06, 0x00, 0x37, 0xFB, 0x00, 0x62, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x1C, 0x04, 0x00, 0x74, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x791E, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x11, 0x7E, 0x80, 0x3C, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x64, 0x20, 0x00, 0x24, 0x51, 0x80, 0x25, 0xAB, 0x00, 0x24, 0x48, 0x00, 0x25, 0x9C, 0x00, 0x3C, 0x6A, 0x00, 0x01, 0x89, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x791F, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xE9, 0x00, 0x12, 0x47, 0x00, 0x12, 0x42, 0x00, 0x13, 0xE5, 0x00, 0x12, 0x58, 0x80, 0x3A, 0x40, 0x00, 0x2B, 0xE8, 0x80, 0x6A, 0x48, 0x80, 0x2A, 0x48, 0x80, 0x2B, 0xF5, 0x00, 0x28, 0x15, 0x00, 0x2A, 0xB2, 0x00, 0x3A, 0xB5, 0x00, 0x05, 0x55, 0x00, 0x00, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7920, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x11, 0x04, 0x00, 0x3A, 0x49, 0x00, 0x2A, 0x8A, 0x00, 0x69, 0x24, 0x80, 0x2B, 0xEF, 0x80, 0x28, 0x20, 0x80, 0x28, 0x10, 0x00, 0x29, 0x59, 0x00, 0x39, 0x49, 0x80, 0x03, 0x62, 0x80, 0x02, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7924, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x7F, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x11, 0x10, 0x00, 0x11, 0xDE, 0x00, 0x22, 0x52, 0x00, 0x3D, 0x8C, 0x00, 0x6B, 0x04, 0x00, 0x2A, 0xFA, 0x00, 0x2C, 0x01, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x28, 0xA8, 0x00, 0x39, 0x26, 0x00, 0x22, 0x22, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7925, { 0x00, 0x00, 0x00, 0x01, 0xF7, 0x80, 0x7F, 0x40, 0x80, 0x11, 0xE4, 0x80, 0x11, 0x25, 0x00, 0x11, 0xE2, 0x00, 0x11, 0x45, 0x00, 0x3D, 0xF4, 0x80, 0x24, 0x00, 0x00, 0x64, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7926, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x22, 0x00, 0x11, 0x3E, 0x00, 0x3D, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x65, 0x08, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x25, 0x7F, 0x00, 0x3D, 0x49, 0x00, 0x01, 0x7F, 0x00, 0x02, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7927, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x38, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x6B, 0xEF, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2B, 0xEF, 0x80, 0x2A, 0xAA, 0x80, 0x3A, 0xAA, 0x80, 0x03, 0xEF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7929, { 0x00, 0x00, 0x00, 0x00, 0x61, 0x80, 0x7D, 0xCF, 0x00, 0x11, 0x08, 0x00, 0x11, 0xEF, 0x80, 0x11, 0x4A, 0x00, 0x12, 0x52, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x64, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x03, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x792A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x94, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x00, 0x10, 0xBE, 0x00, 0x10, 0xAA, 0x00, 0x20, 0xBE, 0x00, 0x3E, 0xAA, 0x00, 0x32, 0xBE, 0x00, 0x12, 0x88, 0x00, 0x12, 0xFF, 0x80, 0x12, 0xCA, 0x80, 0x12, 0xCE, 0x80, 0x1F, 0x71, 0x80, 0x11, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x792B, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0xBC, 0x00, 0x09, 0x29, 0x00, 0x09, 0xEE, 0x00, 0x13, 0x7A, 0x00, 0x10, 0xAA, 0x00, 0x3F, 0x6D, 0x80, 0x33, 0xBE, 0x80, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x38, 0x00, 0x1E, 0x54, 0x00, 0x12, 0x92, 0x00, 0x13, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x792C, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x08, 0xC4, 0x00, 0x3E, 0xBF, 0x80, 0x0D, 0x2E, 0x00, 0x1A, 0xD5, 0x00, 0x29, 0x24, 0x80, 0x08, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x18, 0x00, 0x0C, 0x06, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x792D, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x55, 0x00, 0x11, 0x11, 0x00, 0x3C, 0x54, 0x00, 0x24, 0x00, 0x00, 0x64, 0x44, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x88, 0x00, 0x26, 0xFE, 0x00, 0x24, 0x88, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7931, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1E, 0x00, 0x11, 0x10, 0x80, 0x13, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7934, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x05, 0x00, 0x13, 0x3F, 0x80, 0x11, 0x84, 0x00, 0x3C, 0xBF, 0x80, 0x27, 0x24, 0x80, 0x65, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x24, 0x3F, 0x80, 0x24, 0xA4, 0x80, 0x25, 0x81, 0x00, 0x3D, 0x3F, 0x80, 0x03, 0x11, 0x00, 0x02, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7935, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x56, 0x80, 0x3D, 0x10, 0x80, 0x24, 0x56, 0x00, 0x64, 0x00, 0x00, 0x24, 0x47, 0x80, 0x25, 0xF4, 0x80, 0x24, 0x47, 0x80, 0x24, 0xE4, 0x80, 0x3D, 0x57, 0x80, 0x00, 0x44, 0x80, 0x00, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x793A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x793B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x793C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x18, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x6B, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x793D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x23, 0x80, 0x2A, 0x20, 0x80, 0x2A, 0x20, 0x80, 0x2A, 0x20, 0x80, 0x6A, 0x60, 0x80, 0x48, 0x41, 0x80, 0x08, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x793E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x25, 0x08, 0x00, 0x25, 0x08, 0x00, 0x25, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x793F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x7E, 0xC1, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x2A, 0x3D, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x6A, 0x01, 0x00, 0x48, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7940, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x15, 0x20, 0x00, 0x15, 0x20, 0x00, 0x15, 0x20, 0x00, 0x25, 0x20, 0x00, 0x25, 0x20, 0x80, 0x25, 0x20, 0x80, 0x04, 0x3F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7941, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x3F, 0xF2, 0x00, 0x02, 0x11, 0x00, 0x0A, 0x90, 0x80, 0x0A, 0x90, 0x80, 0x0A, 0x90, 0x80, 0x0A, 0x90, 0x80, 0x12, 0x90, 0x80, 0x12, 0x90, 0x80, 0x12, 0x97, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7944, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x00, 0x36, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x63, 0x00, 0x08, 0xA2, 0x80, 0x08, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x48, 0x22, 0x00, 0x08, 0x62, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7945, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x14, 0x00, 0x6A, 0x14, 0x00, 0x48, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7946, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x28, 0x00, 0x54, 0x28, 0x00, 0x54, 0x2C, 0x00, 0x54, 0x64, 0x00, 0x50, 0x46, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x83, 0x00, 0x13, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7947, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x04, 0x3F, 0x80, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x22, 0x80, 0x04, 0x3A, 0x80, 0x04, 0xE1, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7948, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x38, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x3F, 0x80, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7949, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x15, 0x27, 0x80, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x794A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x6A, 0x21, 0x00, 0x48, 0x61, 0x00, 0x08, 0x43, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x794B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7C, 0xC4, 0x00, 0x11, 0x87, 0x80, 0x10, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x42, 0x00, 0x54, 0x66, 0x00, 0x54, 0x2C, 0x00, 0x50, 0x18, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x66, 0x00, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x794F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x30, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x61, 0x00, 0x2A, 0xA1, 0x00, 0x2B, 0x21, 0x00, 0x6A, 0x21, 0x00, 0x48, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7950, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x15, 0x10, 0x00, 0x15, 0x20, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x31, 0x00, 0x25, 0x51, 0x00, 0x25, 0x51, 0x00, 0x24, 0x91, 0x00, 0x04, 0x9F, 0x00, 0x05, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7951, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x1C, 0x00, 0x6A, 0x14, 0x00, 0x48, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7953, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x26, 0x00, 0x00, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x72, 0x00, 0x2A, 0x56, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0xDC, 0x00, 0x6A, 0x88, 0x00, 0x49, 0x9C, 0x00, 0x09, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7954, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x38, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0xC2, 0x00, 0x00, 0xBF, 0x80, 0x7C, 0x82, 0x00, 0x11, 0x82, 0x00, 0x12, 0x92, 0x00, 0x54, 0x9A, 0x00, 0x54, 0x8A, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x50, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7955, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x3E, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x7F, 0x23, 0x00, 0x08, 0x22, 0x00, 0x08, 0xA6, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xAD, 0x80, 0x2A, 0xA8, 0x80, 0x6A, 0xB0, 0x00, 0x48, 0x20, 0x00, 0x08, 0x61, 0x00, 0x09, 0xB3, 0x00, 0x08, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7956, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x21, 0x00, 0x25, 0x21, 0x00, 0x25, 0x21, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7957, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x3F, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x74, 0x80, 0x09, 0xC2, 0x80, 0x08, 0x01, 0x80, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7958, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x6A, 0x6B, 0x00, 0x48, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x795A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xC8, 0x00, 0x04, 0x88, 0x00, 0x04, 0x08, 0x00, 0x15, 0x0F, 0x80, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x0F, 0x80, 0x25, 0x08, 0x00, 0x25, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x795B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x10, 0x00, 0x25, 0x10, 0x00, 0x25, 0x22, 0x00, 0x24, 0x4F, 0x00, 0x04, 0xF0, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x795C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x795D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3F, 0xC1, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x14, 0x00, 0x15, 0x14, 0x00, 0x15, 0x14, 0x00, 0x15, 0x14, 0x00, 0x15, 0x14, 0x00, 0x15, 0x24, 0x80, 0x25, 0x24, 0x80, 0x24, 0x47, 0x80, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x795E, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xE4, 0x80, 0x04, 0x24, 0x80, 0x04, 0x24, 0x80, 0x15, 0x3F, 0x80, 0x15, 0x24, 0x80, 0x15, 0x24, 0x80, 0x15, 0x24, 0x80, 0x25, 0x3F, 0x80, 0x25, 0x24, 0x80, 0x25, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x795F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x3B, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7960, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0x80, 0x3F, 0x80, 0x80, 0x04, 0x00, 0x80, 0x04, 0x3E, 0x80, 0x15, 0x22, 0x80, 0x15, 0x22, 0x80, 0x15, 0x3E, 0x80, 0x25, 0x22, 0x80, 0x25, 0x00, 0x80, 0x25, 0x00, 0x80, 0x04, 0x00, 0x80, 0x04, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7962, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x7F, 0x80, 0x02, 0x48, 0x00, 0x06, 0xC8, 0x00, 0x05, 0x88, 0x00, 0x0C, 0x2A, 0x00, 0x18, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x6B, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7965, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x15, 0x04, 0x00, 0x15, 0x04, 0x00, 0x15, 0x04, 0x00, 0x15, 0x7F, 0x80, 0x25, 0x04, 0x00, 0x25, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7967, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x00, 0x24, 0x80, 0x01, 0xA5, 0x80, 0x00, 0x67, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x2A, 0x27, 0x00, 0x2A, 0x65, 0x80, 0x2B, 0xA4, 0x80, 0x6A, 0x24, 0x00, 0x48, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7968, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7969, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x6A, 0x6B, 0x00, 0x48, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x796B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x64, 0x00, 0x00, 0x46, 0x00, 0x7E, 0xC3, 0x00, 0x09, 0xBD, 0x80, 0x08, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x6A, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x796D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x40, 0x00, 0x07, 0xFF, 0x00, 0x0C, 0xA2, 0x00, 0x33, 0x14, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x796F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x04, 0x12, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x10, 0x00, 0x02, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x04, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x15, 0x92, 0x00, 0x24, 0x92, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x04, 0x28, 0x00, 0x04, 0x26, 0x00, 0x04, 0x43, 0x00, 0x05, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7972, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7E, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x7C, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x55, 0x7E, 0x80, 0x54, 0x42, 0x00, 0x54, 0x66, 0x00, 0x50, 0x2C, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6E, 0x00, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7977, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x20, 0x00, 0x10, 0x22, 0x00, 0x3D, 0xFF, 0x80, 0x56, 0x42, 0x00, 0x10, 0xD2, 0x00, 0x10, 0x9A, 0x00, 0x11, 0x8A, 0x00, 0x13, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7978, { 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x01, 0x04, 0x00, 0x7D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x38, 0x22, 0x00, 0x57, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x5A, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7979, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x00, 0xFF, 0x80, 0x01, 0x80, 0x80, 0x01, 0x40, 0x80, 0x7E, 0x7C, 0x80, 0x08, 0xD0, 0x80, 0x08, 0x10, 0x80, 0x2A, 0xFE, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0x54, 0x80, 0x6A, 0x54, 0x80, 0x48, 0x54, 0x80, 0x08, 0x7D, 0x80, 0x08, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x797A, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x04, 0x3E, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x3E, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x797B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x6A, 0xA2, 0x80, 0x48, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x797C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x54, 0x00, 0x6A, 0x56, 0x00, 0x48, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x797E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x47, 0x80, 0x2A, 0xA0, 0x00, 0x2A, 0x3E, 0x00, 0x2A, 0x62, 0x00, 0x6A, 0xC6, 0x00, 0x49, 0xAC, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6E, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x797F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x22, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x49, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x1C, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x4A, 0x00, 0x04, 0x89, 0x00, 0x05, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7980, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xF4, 0x00, 0x0A, 0x14, 0x00, 0x0B, 0xF4, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x31, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7981, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0x0E, 0x00, 0x0A, 0x95, 0x00, 0x12, 0x24, 0x80, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7984, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x7E, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x06, 0x02, 0x00, 0x05, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x18, 0x91, 0x00, 0x3E, 0xD3, 0x00, 0x6B, 0x5A, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7985, { 0x00, 0x00, 0x00, 0x08, 0x90, 0x80, 0x08, 0xD9, 0x80, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x49, 0x00, 0x06, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x18, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x6B, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x798A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3B, 0xEF, 0x00, 0x00, 0x85, 0x00, 0x00, 0x85, 0x00, 0x03, 0xE5, 0x00, 0x7C, 0x85, 0x00, 0x10, 0x8D, 0x00, 0x10, 0xE9, 0x00, 0x57, 0x9B, 0x00, 0x54, 0x80, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x50, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x798B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xA9, 0x00, 0x7F, 0xA9, 0x00, 0x08, 0xCF, 0x00, 0x08, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x798C, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x38, 0x66, 0x00, 0x00, 0x24, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x55, 0x29, 0x00, 0x54, 0xA5, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x50, 0xA5, 0x00, 0x10, 0xA5, 0x00, 0x11, 0xEF, 0x80, 0x11, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x798D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xAF, 0x00, 0x04, 0x29, 0x00, 0x04, 0x29, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x40, 0x80, 0x15, 0x5E, 0x80, 0x15, 0x52, 0x80, 0x25, 0x5E, 0x80, 0x25, 0x52, 0x80, 0x24, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x798E, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x20, 0x80, 0x04, 0x20, 0x80, 0x15, 0x3F, 0x80, 0x15, 0x20, 0x80, 0x15, 0x20, 0x80, 0x15, 0x3F, 0x80, 0x25, 0x20, 0x80, 0x25, 0x20, 0x80, 0x24, 0x3F, 0x80, 0x04, 0x11, 0x00, 0x04, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x798F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x48, 0x80, 0x15, 0x48, 0x80, 0x25, 0x7F, 0x80, 0x25, 0x48, 0x80, 0x25, 0x48, 0x80, 0x04, 0x7F, 0x80, 0x04, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7991, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3E, 0x78, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x8A, 0x80, 0x2A, 0x8E, 0x80, 0x2A, 0xF1, 0x80, 0x2A, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7993, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x80, 0x00, 0x54, 0xFF, 0x80, 0x55, 0x24, 0x80, 0x50, 0x44, 0x80, 0x11, 0x89, 0x80, 0x10, 0x11, 0x00, 0x10, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7994, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x2A, 0x90, 0x00, 0x6A, 0x9F, 0x00, 0x48, 0x90, 0x00, 0x09, 0xD0, 0x00, 0x09, 0x70, 0x00, 0x0B, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7995, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0xFF, 0x00, 0x6A, 0x84, 0x00, 0x48, 0x84, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7996, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x54, 0x00, 0x6A, 0x56, 0x00, 0x48, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7998, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x00, 0x36, 0x00, 0x7F, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x48, 0x49, 0x00, 0x08, 0x4B, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x799A, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0x44, 0x00, 0x00, 0x28, 0x00, 0x7D, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x48, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0x52, 0x00, 0x09, 0x29, 0x00, 0x0A, 0x29, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x799B, { 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x40, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x7E, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x6A, 0xBF, 0x00, 0x48, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x799C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x73, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x799D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x2A, 0xC7, 0x80, 0x2A, 0x20, 0x00, 0x2A, 0x3E, 0x00, 0x6A, 0x62, 0x00, 0x48, 0xD6, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFE, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFE, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x00, 0x80, 0x48, 0xAA, 0x80, 0x09, 0xAA, 0x80, 0x09, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79A6, { 0x00, 0x00, 0x00, 0x08, 0x87, 0x80, 0x11, 0xF4, 0x80, 0x26, 0x44, 0x80, 0x04, 0x44, 0x80, 0x0B, 0xFC, 0x80, 0x18, 0x44, 0x80, 0x29, 0x54, 0x80, 0x09, 0xF5, 0x80, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79A7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x22, 0x00, 0x15, 0x14, 0x00, 0x15, 0xFF, 0x80, 0x25, 0x00, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79A8, { 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x39, 0x12, 0x00, 0x03, 0x56, 0x80, 0x00, 0x91, 0x00, 0x01, 0x12, 0x80, 0x7D, 0x57, 0x80, 0x13, 0xD2, 0x00, 0x10, 0x11, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x10, 0x00, 0x55, 0x09, 0x00, 0x55, 0x8A, 0x00, 0x51, 0x44, 0x00, 0x13, 0x4A, 0x80, 0x12, 0x13, 0x80, 0x12, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x66, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x77, 0x00, 0x00, 0x55, 0x00, 0x00, 0x55, 0x00, 0x3F, 0xF7, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x25, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xA9, 0x00, 0x7E, 0xB9, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x6A, 0x7E, 0x00, 0x48, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79AE, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xD5, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x22, 0x00, 0x04, 0x14, 0x00, 0x05, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79AF, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x80, 0x00, 0x6A, 0xFF, 0x80, 0x48, 0xA9, 0x00, 0x08, 0xAD, 0x00, 0x09, 0x36, 0x00, 0x08, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79B0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x7D, 0x11, 0x00, 0x07, 0xFF, 0x80, 0x0D, 0x11, 0x00, 0x09, 0xBB, 0x00, 0x19, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x39, 0x11, 0x00, 0x55, 0xBB, 0x00, 0x11, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79B1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x80, 0x04, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x15, 0x7F, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x02, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x6A, 0x00, 0x04, 0x02, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79B3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xE7, 0x00, 0x00, 0xA5, 0x00, 0x3E, 0xE7, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x24, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x69, 0x00, 0x2A, 0xC6, 0x00, 0x2B, 0x7A, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79B4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0xDD, 0x80, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x94, 0x80, 0x48, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79B8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x21, 0x81, 0x00, 0x21, 0x11, 0x00, 0x23, 0x11, 0x00, 0x27, 0xF9, 0x00, 0x2C, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79B9, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x42, 0x80, 0x20, 0x7E, 0x80, 0x2F, 0x81, 0x80, 0x20, 0x00, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x91, 0x00, 0x20, 0xF9, 0x00, 0x2F, 0x8D, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79BB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0B, 0x34, 0x00, 0x08, 0xC4, 0x00, 0x0B, 0x34, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0xF1, 0x00, 0x27, 0x99, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79BD, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x03, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x37, 0xFD, 0x80, 0x05, 0x94, 0x00, 0x04, 0x64, 0x00, 0x05, 0x94, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x12, 0x79, 0x00, 0x1F, 0x85, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79BE, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79BF, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x80, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C0, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x1F, 0x00, 0x02, 0x01, 0x00, 0x0C, 0x02, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C1, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x20, 0x00, 0x14, 0xA0, 0x00, 0x14, 0x21, 0x00, 0x24, 0x41, 0x00, 0x04, 0x4F, 0x00, 0x05, 0xF0, 0x80, 0x04, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C2, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x20, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79C3, { 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x88, 0x00, 0x13, 0xE7, 0x00, 0x22, 0x22, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x08, 0x1F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C4, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x7F, 0x80, 0x78, 0x03, 0x00, 0x08, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C6, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0E, 0xFE, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x12, 0x00, 0x1D, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C7, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x78, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFC, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x1C, 0xA4, 0x00, 0x1A, 0x64, 0x00, 0x2A, 0x24, 0x00, 0x28, 0x74, 0x00, 0x48, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79C8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79C9, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79CA, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x02, 0x4C, 0x00, 0x0C, 0x43, 0x80, 0x30, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79CB, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x80, 0x3F, 0xA9, 0x00, 0x04, 0x2A, 0x00, 0x0C, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x15, 0x08, 0x00, 0x14, 0x88, 0x00, 0x14, 0x14, 0x00, 0x24, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79CD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x12, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79CF, { 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x70, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x7E, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x19, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79D1, { 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x04, 0x24, 0x00, 0x04, 0x14, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x0E, 0x24, 0x00, 0x0D, 0x14, 0x00, 0x14, 0x87, 0x80, 0x14, 0x7C, 0x00, 0x24, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79D2, { 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x04, 0x05, 0x00, 0x04, 0x15, 0x00, 0x3F, 0x94, 0x80, 0x04, 0x24, 0x80, 0x0E, 0x24, 0x00, 0x0D, 0x44, 0x00, 0x14, 0x04, 0x80, 0x14, 0x04, 0x80, 0x14, 0x0D, 0x00, 0x24, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x04, 0x18, 0x00, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79D4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x48, 0xC4, 0x00, 0x08, 0x84, 0x80, 0x09, 0x84, 0x80, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79D5, { 0x00, 0x00, 0x00, 0x03, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xC4, 0x80, 0x0C, 0x7D, 0x00, 0x0E, 0x46, 0x00, 0x15, 0x44, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x80, 0x04, 0x7C, 0x80, 0x05, 0xC7, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79D6, { 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x0E, 0x0E, 0x00, 0x78, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x88, 0x00, 0x1A, 0x8C, 0x00, 0x2A, 0x84, 0x00, 0x28, 0x84, 0x00, 0x48, 0x86, 0x00, 0x08, 0x82, 0x80, 0x08, 0xF3, 0x80, 0x0B, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79D8, { 0x00, 0x00, 0x00, 0x03, 0x40, 0x00, 0x1C, 0x22, 0x00, 0x04, 0x12, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x24, 0x00, 0x0C, 0x24, 0x00, 0x0E, 0x24, 0x00, 0x15, 0x28, 0x00, 0x14, 0xA9, 0x00, 0x24, 0xA8, 0x80, 0x25, 0x30, 0x80, 0x04, 0x30, 0x00, 0x04, 0x21, 0x00, 0x04, 0x61, 0x00, 0x04, 0xBF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79DA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x2A, 0x00, 0x78, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79DD, { 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0E, 0x0E, 0x00, 0x78, 0x78, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x1A, 0x1A, 0x00, 0x29, 0x29, 0x00, 0x28, 0x28, 0x80, 0x48, 0x48, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79DE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x28, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79DF, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x0C, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x21, 0x00, 0x14, 0x21, 0x00, 0x14, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79E0, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x34, 0x00, 0x08, 0x76, 0x00, 0x1C, 0xD3, 0x00, 0x1A, 0x91, 0x80, 0x2A, 0x10, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79E1, { 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x0E, 0x26, 0x00, 0x78, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x72, 0x00, 0x1C, 0x56, 0x00, 0x1A, 0x54, 0x00, 0x2A, 0xDC, 0x00, 0x28, 0x88, 0x00, 0x49, 0x9C, 0x00, 0x0B, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79E2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x80, 0x7E, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x28, 0x11, 0x00, 0x48, 0x11, 0x00, 0x08, 0x17, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79E3, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x1C, 0x54, 0x00, 0x1A, 0x54, 0x00, 0x2A, 0xD6, 0x00, 0x28, 0x92, 0x00, 0x49, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79E4, { 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x2A, 0x00, 0x06, 0x2A, 0x00, 0x0D, 0x08, 0x00, 0x0D, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79E5, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79E6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xA0, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x76, 0x00, 0x33, 0xC1, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79E7, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x3B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79E9, { 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x28, 0x00, 0x04, 0x28, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x48, 0x00, 0x0E, 0x88, 0x00, 0x0D, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x14, 0x14, 0x00, 0x24, 0x14, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x79EA, { 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x0E, 0x0E, 0x00, 0x78, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x1A, 0x8C, 0x00, 0x2A, 0x84, 0x00, 0x28, 0x84, 0x00, 0x48, 0xF6, 0x00, 0x0B, 0x82, 0x80, 0x08, 0x03, 0x80, 0x0B, 0xF1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79EB, { 0x00, 0x00, 0x00, 0x02, 0x12, 0x00, 0x0E, 0x13, 0x00, 0x78, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x28, 0x92, 0x00, 0x49, 0x12, 0x00, 0x09, 0x13, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79EC, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x29, 0x40, 0x00, 0x28, 0x40, 0x00, 0x48, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79ED, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x13, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x90, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x1C, 0xFF, 0x80, 0x1A, 0x10, 0x80, 0x2A, 0x30, 0x80, 0x28, 0x30, 0x80, 0x48, 0x50, 0x80, 0x08, 0x90, 0x80, 0x09, 0x11, 0x80, 0x08, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79EF, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0x02, 0x00, 0x3C, 0x7F, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x7F, 0x42, 0x00, 0x04, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x0E, 0x7E, 0x00, 0x15, 0x42, 0x00, 0x14, 0x00, 0x00, 0x24, 0x44, 0x00, 0x44, 0x62, 0x00, 0x04, 0x83, 0x00, 0x05, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79F0, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x78, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x48, 0x00, 0x7E, 0xC8, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x1C, 0x2A, 0x00, 0x1A, 0x2A, 0x00, 0x2A, 0x6B, 0x00, 0x28, 0x49, 0x00, 0x48, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79F1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x7E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x1C, 0xA5, 0x00, 0x1A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x28, 0xBD, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79F8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x2A, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79FB, { 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x04, 0x0F, 0x80, 0x04, 0x11, 0x00, 0x3F, 0xB2, 0x00, 0x04, 0x4C, 0x00, 0x05, 0x88, 0x00, 0x0E, 0x14, 0x00, 0x0D, 0x64, 0x00, 0x14, 0x8F, 0x80, 0x14, 0x11, 0x00, 0x24, 0x2A, 0x00, 0x04, 0xC4, 0x00, 0x04, 0x08, 0x00, 0x04, 0x30, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79FC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x48, 0x00, 0x78, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC8, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x2A, 0x00, 0x1A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x48, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x09, 0x88, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x79FD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0xA2, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x7F, 0x00, 0x28, 0x82, 0x00, 0x29, 0x42, 0x00, 0x48, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x00, 0x08, 0x60, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A00, { 0x00, 0x00, 0x00, 0x07, 0x31, 0x00, 0x1C, 0x0A, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x71, 0x00, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x0E, 0x28, 0x00, 0x15, 0x48, 0x00, 0x14, 0xFF, 0x00, 0x15, 0x49, 0x00, 0x24, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x4B, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A02, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x1A, 0x90, 0x80, 0x2A, 0x99, 0x80, 0x28, 0x8B, 0x00, 0x48, 0x8C, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x0B, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A03, { 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x0E, 0x1E, 0x00, 0x79, 0xF2, 0x00, 0x08, 0x53, 0x00, 0x08, 0x89, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x06, 0x00, 0x1C, 0x0C, 0x00, 0x1A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A05, { 0x00, 0x00, 0x00, 0x03, 0x1C, 0x00, 0x1C, 0x02, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x3F, 0x80, 0x80, 0x05, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x15, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x14, 0x00, 0x24, 0x14, 0x00, 0x04, 0x24, 0x00, 0x04, 0x44, 0x80, 0x04, 0x87, 0x80, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A06, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0xFE, 0x00, 0x78, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7E, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x18, 0x00, 0x00, 0x1C, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x29, 0x02, 0x00, 0x49, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A07, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x80, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x7E, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x08, 0x9C, 0x80, 0x1C, 0x9C, 0x80, 0x1A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x28, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A08, { 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x0E, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A09, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x50, 0x00, 0x48, 0x30, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6E, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A0A, { 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x0E, 0x66, 0x00, 0x78, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x7E, 0x11, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x1C, 0x90, 0x00, 0x1A, 0xFF, 0x80, 0x2A, 0x30, 0x80, 0x28, 0x30, 0x80, 0x48, 0x51, 0x80, 0x08, 0xD1, 0x00, 0x09, 0x97, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A0B, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x0E, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A0C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x7F, 0x83, 0x00, 0x09, 0x7D, 0x80, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A0D, { 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x1C, 0x29, 0x00, 0x04, 0x29, 0x00, 0x04, 0x48, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x7F, 0x00, 0x0D, 0x41, 0x00, 0x14, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x24, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A0E, { 0x00, 0x00, 0x00, 0x02, 0x81, 0x00, 0x0E, 0xC3, 0x00, 0x78, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x48, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A11, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1C, 0xC3, 0x80, 0x1A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A14, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x09, 0xBD, 0x80, 0x18, 0x00, 0x00, 0x1C, 0x7E, 0x00, 0x3A, 0x04, 0x00, 0x28, 0x08, 0x00, 0x28, 0x20, 0x00, 0x28, 0x11, 0x00, 0x29, 0x49, 0x00, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A15, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x79, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x06, 0x00, 0x2A, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A17, { 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x1E, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x14, 0x28, 0x00, 0x14, 0x48, 0x00, 0x24, 0x88, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A18, { 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x79, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x1A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A19, { 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x5F, 0x00, 0x0C, 0x51, 0x00, 0x0E, 0x5F, 0x00, 0x15, 0x51, 0x00, 0x14, 0x5F, 0x00, 0x24, 0x51, 0x00, 0x24, 0x5F, 0x00, 0x04, 0x51, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A1A, { 0x00, 0x00, 0x00, 0x07, 0x24, 0x00, 0x1C, 0x24, 0x00, 0x04, 0x48, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xC8, 0x00, 0x0C, 0xC8, 0x00, 0x0D, 0x48, 0x00, 0x16, 0x7F, 0x00, 0x15, 0x48, 0x00, 0x14, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A1B, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x80, 0x80, 0x08, 0x8E, 0x80, 0x08, 0xB8, 0x80, 0x7E, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x1C, 0x9C, 0x80, 0x1A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x28, 0x88, 0x80, 0x48, 0x88, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A1C, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x38, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x1C, 0x88, 0x80, 0x1B, 0x4F, 0x80, 0x3A, 0x40, 0x00, 0x28, 0xFE, 0x00, 0x29, 0x84, 0x00, 0x2A, 0x48, 0x00, 0x08, 0x30, 0x00, 0x08, 0x68, 0x00, 0x09, 0x86, 0x00, 0x0A, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A1E, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x2A, 0x54, 0x00, 0x28, 0x56, 0x00, 0x48, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A1F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0xF2, 0x00, 0x09, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x80, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x3E, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x18, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x3A, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x28, 0xA2, 0x80, 0x28, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x09, 0x00, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A21, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x77, 0x00, 0x08, 0xD5, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A23, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0E, 0x00, 0x1E, 0xF0, 0x00, 0x24, 0x10, 0x00, 0x48, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x2A, 0x34, 0x00, 0x2A, 0x54, 0x00, 0x3E, 0x93, 0x00, 0x01, 0x12, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A27, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x1C, 0xEF, 0x80, 0x73, 0x84, 0x80, 0x10, 0x84, 0x80, 0x10, 0xE4, 0x80, 0x7D, 0x84, 0x80, 0x10, 0x8C, 0x80, 0x10, 0xE8, 0x80, 0x3B, 0x9B, 0x80, 0x34, 0x80, 0x00, 0x50, 0x20, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0xC6, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A2B, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x28, 0x88, 0x80, 0x48, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A2D, { 0x00, 0x00, 0x00, 0x02, 0x88, 0x00, 0x0E, 0x89, 0x80, 0x78, 0xEF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x80, 0x08, 0xE7, 0x80, 0x09, 0x88, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x28, 0x81, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A2E, { 0x00, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x1C, 0x78, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x24, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A2F, { 0x00, 0x00, 0x00, 0x02, 0x41, 0x00, 0x0E, 0x55, 0x00, 0x78, 0x49, 0x00, 0x08, 0x55, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x1C, 0xD3, 0x80, 0x1A, 0x3E, 0x00, 0x2A, 0x62, 0x00, 0x28, 0xD6, 0x00, 0x48, 0x14, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x3B, 0x00, 0x08, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A30, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x08, 0x80, 0x08, 0x4F, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x68, 0x00, 0x08, 0xDF, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A31, { 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x1C, 0x39, 0x00, 0x04, 0x24, 0x80, 0x04, 0x4A, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x7F, 0x00, 0x0E, 0x49, 0x00, 0x0D, 0x49, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x24, 0xFF, 0x80, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A32, { 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x0E, 0x1E, 0x00, 0x78, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xDB, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x9F, 0x00, 0x1A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x28, 0x9F, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A33, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x78, 0x7C, 0x00, 0x08, 0x88, 0x00, 0x09, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x1C, 0x02, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x4A, 0x92, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0x85, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A34, { 0x00, 0x00, 0x00, 0x02, 0x12, 0x00, 0x0E, 0x24, 0x00, 0x79, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x29, 0x00, 0x08, 0x29, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x29, 0x00, 0x1A, 0x29, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x2C, 0x00, 0x48, 0x6A, 0x00, 0x08, 0xAB, 0x00, 0x09, 0x29, 0x80, 0x08, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A35, { 0x00, 0x00, 0x00, 0x02, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x78, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1D, 0x29, 0x00, 0x1A, 0xA5, 0x00, 0x2A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x48, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x09, 0xEF, 0x80, 0x09, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A36, { 0x00, 0x00, 0x00, 0x06, 0x14, 0x00, 0x38, 0x12, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x09, 0xD2, 0x00, 0x19, 0x54, 0x00, 0x1D, 0x59, 0x00, 0x3B, 0xDA, 0x00, 0x28, 0x6C, 0x80, 0x29, 0x99, 0x00, 0x08, 0x6A, 0x00, 0x0B, 0x84, 0x00, 0x08, 0x0A, 0x80, 0x08, 0x31, 0x80, 0x09, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A37, { 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x7F, 0x00, 0x0E, 0x14, 0x80, 0x0D, 0x27, 0x80, 0x14, 0x50, 0x00, 0x15, 0x90, 0x00, 0x14, 0x3F, 0x00, 0x24, 0x62, 0x00, 0x04, 0x94, 0x00, 0x07, 0x18, 0x00, 0x04, 0x66, 0x00, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A38, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x79, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x7E, 0xF9, 0x00, 0x08, 0x11, 0x00, 0x09, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A39, { 0x00, 0x00, 0x00, 0x02, 0x46, 0x00, 0x0E, 0x7C, 0x00, 0x78, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x1C, 0xA1, 0x00, 0x1A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x28, 0xBF, 0x00, 0x48, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A3A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0xA2, 0x00, 0x1A, 0x94, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x00, 0x49, 0x88, 0x00, 0x09, 0x7F, 0x00, 0x0B, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A3B, { 0x00, 0x00, 0x00, 0x0E, 0x0F, 0x00, 0x38, 0x71, 0x00, 0x08, 0x48, 0x80, 0x08, 0x84, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x18, 0x00, 0x1A, 0xE7, 0x80, 0x38, 0x80, 0x80, 0x28, 0x80, 0x80, 0x28, 0xF7, 0x80, 0x28, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A3C, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x80, 0x80, 0x3F, 0xFF, 0x80, 0x04, 0x24, 0x00, 0x0E, 0x34, 0x80, 0x0D, 0x4D, 0x00, 0x14, 0x9A, 0x00, 0x15, 0x26, 0x00, 0x24, 0x4E, 0x00, 0x05, 0x95, 0x00, 0x04, 0x25, 0x00, 0x04, 0x44, 0x80, 0x05, 0x84, 0x00, 0x04, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A3D, { 0x00, 0x00, 0x00, 0x06, 0x24, 0x00, 0x38, 0x4E, 0x00, 0x09, 0xF9, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x48, 0x80, 0x08, 0x8F, 0x80, 0x19, 0x10, 0x00, 0x1C, 0x1E, 0x00, 0x1A, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A3E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A3F, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x3F, 0xBE, 0x00, 0x04, 0x22, 0x00, 0x0C, 0x3E, 0x00, 0x0E, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x55, 0x00, 0x04, 0x55, 0x00, 0x04, 0x5D, 0x00, 0x04, 0x41, 0x00, 0x04, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A40, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x80, 0x3F, 0xA2, 0x80, 0x20, 0xC3, 0x80, 0x07, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xA1, 0x00, 0x0C, 0x12, 0x00, 0x0E, 0x0C, 0x00, 0x15, 0x0C, 0x00, 0x14, 0x12, 0x00, 0x24, 0x21, 0x00, 0x04, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A42, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x79, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x28, 0x18, 0x00, 0x48, 0xA9, 0x00, 0x08, 0xA1, 0x80, 0x09, 0xA2, 0x80, 0x09, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A43, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x45, 0x00, 0x7C, 0xC6, 0x00, 0x11, 0x93, 0x00, 0x10, 0x38, 0x00, 0x38, 0x6C, 0x00, 0x34, 0xC6, 0x00, 0x53, 0x83, 0x80, 0x50, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A44, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x1C, 0xEF, 0x00, 0x71, 0x91, 0x00, 0x13, 0x53, 0x00, 0x10, 0xAA, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x82, 0x00, 0x13, 0x7D, 0x80, 0x38, 0x00, 0x00, 0x34, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x50, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A45, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0xBF, 0x00, 0x7E, 0x89, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x89, 0x00, 0x1C, 0xBF, 0x00, 0x1A, 0x88, 0x00, 0x2A, 0xC9, 0x00, 0x28, 0xAA, 0x00, 0x49, 0x9C, 0x00, 0x09, 0x2A, 0x00, 0x0B, 0x49, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A46, { 0x00, 0x00, 0x00, 0x03, 0x18, 0x00, 0x1C, 0x67, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xC1, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x49, 0x00, 0x15, 0x98, 0x80, 0x14, 0x03, 0x00, 0x24, 0x1C, 0x00, 0x24, 0x63, 0x00, 0x04, 0x1C, 0x00, 0x04, 0x61, 0x80, 0x04, 0x0E, 0x00, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A47, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x24, 0x00, 0x78, 0x3C, 0x00, 0x08, 0x42, 0x00, 0x08, 0x94, 0x80, 0x7E, 0xF7, 0x80, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x1C, 0x63, 0x00, 0x1A, 0xC9, 0x80, 0x2A, 0x10, 0x00, 0x28, 0x64, 0x00, 0x48, 0x19, 0x00, 0x08, 0x63, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A48, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x25, 0x05, 0x00, 0x25, 0x55, 0x00, 0x29, 0x54, 0x80, 0x20, 0x0E, 0x00, 0x23, 0xF8, 0x00, 0x20, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x60, 0xA8, 0x00, 0x43, 0xAE, 0x00, 0x4E, 0x23, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A49, { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x88, 0x00, 0x08, 0xEB, 0x80, 0x18, 0xEB, 0x80, 0x1C, 0x80, 0x00, 0x3A, 0xA8, 0x00, 0x28, 0xA8, 0x00, 0x28, 0xBF, 0x00, 0x28, 0xC8, 0x00, 0x09, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A4C, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1F, 0x06, 0x00, 0x31, 0x3C, 0x00, 0x22, 0x04, 0x00, 0x7F, 0x84, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x8E, 0x00, 0x24, 0x8D, 0x00, 0x3F, 0x95, 0x80, 0x00, 0x14, 0x80, 0x2A, 0xA4, 0x00, 0x2A, 0x84, 0x00, 0x6A, 0x84, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A4D, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x88, 0x00, 0x04, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A4E, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x27, 0x7F, 0x80, 0x38, 0x08, 0x00, 0x21, 0x10, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x03, 0x3F, 0x00, 0x1C, 0x21, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x0E, 0x21, 0x00, 0x0D, 0x21, 0x00, 0x14, 0xBF, 0x00, 0x14, 0x21, 0x00, 0x24, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A4F, { 0x00, 0x00, 0x00, 0x06, 0x03, 0x00, 0x1C, 0x1E, 0x00, 0x73, 0xF1, 0x00, 0x11, 0x23, 0x00, 0x10, 0x92, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x35, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x50, 0x10, 0x00, 0x51, 0x59, 0x00, 0x11, 0x49, 0x80, 0x13, 0x42, 0x80, 0x12, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A50, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x1C, 0xF8, 0x00, 0x71, 0x10, 0x00, 0x13, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x7D, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x19, 0xFE, 0x00, 0x34, 0x20, 0x00, 0x33, 0xFF, 0x00, 0x32, 0x21, 0x00, 0x53, 0xFF, 0x00, 0x12, 0x21, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x80, 0x10, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A51, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x06, 0x24, 0x00, 0x7B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x7C, 0xA8, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFA, 0x00, 0x4A, 0x8A, 0x00, 0x0A, 0xFA, 0x00, 0x0A, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A55, { 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x0E, 0x48, 0x00, 0x78, 0xFF, 0x00, 0x09, 0x88, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x88, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x52, 0x00, 0x48, 0x52, 0x00, 0x08, 0xD3, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A56, { 0x00, 0x00, 0x00, 0x04, 0x91, 0x00, 0x1D, 0x12, 0x00, 0x73, 0x56, 0x80, 0x10, 0x91, 0x00, 0x11, 0x12, 0x80, 0x7D, 0x57, 0x80, 0x13, 0xD2, 0x00, 0x10, 0x11, 0x00, 0x39, 0xFF, 0x80, 0x35, 0x10, 0x00, 0x51, 0x09, 0x00, 0x51, 0x8A, 0x00, 0x11, 0x44, 0x00, 0x13, 0x4A, 0x80, 0x12, 0x13, 0x80, 0x16, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A57, { 0x00, 0x00, 0x00, 0x06, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x0A, 0x00, 0x14, 0x0F, 0x00, 0x14, 0xF0, 0x80, 0x24, 0x10, 0x00, 0x04, 0xAB, 0x00, 0x04, 0xA2, 0x80, 0x05, 0x3E, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A59, { 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x0E, 0x94, 0x80, 0x78, 0x55, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A5C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x92, 0x00, 0x1A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x28, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A5D, { 0x00, 0x00, 0x00, 0x02, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x78, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x90, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x95, 0x00, 0x2A, 0xF5, 0x00, 0x28, 0x97, 0x00, 0x48, 0x92, 0x00, 0x08, 0xF7, 0x00, 0x09, 0x9D, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A5F, { 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x1D, 0x23, 0x00, 0x71, 0x61, 0x80, 0x10, 0xDE, 0x80, 0x11, 0x08, 0x00, 0x7D, 0x90, 0x80, 0x10, 0xA9, 0x80, 0x10, 0x09, 0x00, 0x39, 0x94, 0x00, 0x34, 0xA6, 0x00, 0x50, 0x8D, 0x00, 0x50, 0x94, 0x80, 0x10, 0xA4, 0x00, 0x11, 0x8C, 0x00, 0x11, 0x40, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A60, { 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x0E, 0x7F, 0x00, 0x78, 0x55, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x80, 0x00, 0x1A, 0xBF, 0x00, 0x2A, 0x80, 0x00, 0x28, 0xFF, 0x80, 0x48, 0xA9, 0x00, 0x09, 0xAD, 0x00, 0x0B, 0x36, 0x00, 0x08, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A61, { 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x2A, 0x00, 0x3F, 0x5D, 0x00, 0x04, 0x08, 0x00, 0x0E, 0xFF, 0x80, 0x0D, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x24, 0x5D, 0x00, 0x04, 0x55, 0x00, 0x04, 0x5D, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A62, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x38, 0x5F, 0x00, 0x08, 0x50, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x1D, 0xFF, 0x80, 0x1B, 0x09, 0x00, 0x39, 0xF9, 0x00, 0x29, 0x2A, 0x00, 0x29, 0x7A, 0x00, 0x09, 0xAC, 0x00, 0x09, 0x24, 0x00, 0x09, 0x6A, 0x80, 0x09, 0x11, 0x80, 0x0A, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A63, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x79, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x09, 0x81, 0x80, 0x7E, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x24, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x48, 0x65, 0x00, 0x09, 0xC2, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A65, { 0x00, 0x00, 0x00, 0x04, 0xC0, 0x00, 0x1D, 0xA7, 0x00, 0x71, 0x39, 0x00, 0x11, 0x21, 0x00, 0x11, 0xA3, 0x00, 0x7D, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0xAB, 0x00, 0x39, 0x29, 0x00, 0x35, 0x29, 0x00, 0x51, 0x29, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x82, 0x00, 0x11, 0x83, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A67, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x13, 0xD7, 0x80, 0x7D, 0x55, 0x00, 0x11, 0x55, 0x00, 0x12, 0xD6, 0x80, 0x38, 0x00, 0x00, 0x35, 0x01, 0x00, 0x51, 0xFF, 0x00, 0x51, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x13, 0x01, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A69, { 0x00, 0x00, 0x00, 0x0E, 0x07, 0x00, 0x38, 0x79, 0x00, 0x08, 0x48, 0x80, 0x08, 0x84, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x1C, 0x7E, 0x00, 0x3A, 0x02, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x21, 0x00, 0x09, 0x50, 0x80, 0x09, 0x42, 0x80, 0x0A, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A6A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x70, 0x92, 0x00, 0x11, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7D, 0x11, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x55, 0x00, 0x39, 0xBB, 0x00, 0x35, 0x11, 0x00, 0x51, 0xBB, 0x00, 0x51, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A6B, { 0x00, 0x00, 0x00, 0x0E, 0x24, 0x00, 0x39, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x48, 0x00, 0x3E, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x1A, 0xFF, 0x00, 0x1C, 0x90, 0x00, 0x3A, 0xFF, 0x00, 0x28, 0x90, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x42, 0x00, 0x08, 0x3C, 0x00, 0x0B, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A6D, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x0E, 0x7C, 0x00, 0x78, 0xC8, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x55, 0x00, 0x1A, 0x94, 0x80, 0x2A, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A70, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x38, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0xE7, 0x00, 0x3E, 0xA5, 0x00, 0x08, 0xE7, 0x00, 0x18, 0x24, 0x00, 0x1C, 0xFF, 0x00, 0x3A, 0x24, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x69, 0x00, 0x09, 0xC6, 0x00, 0x0E, 0x7A, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A74, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A75, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x38, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x01, 0x00, 0x18, 0x03, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A76, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x10, 0x80, 0x22, 0x10, 0x80, 0x02, 0x11, 0x00, 0x04, 0x9F, 0x00, 0x08, 0x80, 0x00, 0x37, 0xF8, 0x00, 0x00, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x80, 0x0C, 0x08, 0x80, 0x30, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A77, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x42, 0x22, 0x00, 0x06, 0x18, 0x00, 0x09, 0x08, 0x00, 0x01, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x44, 0x00, 0x08, 0x28, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A78, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x07, 0x02, 0x00, 0x1C, 0x06, 0x00, 0x03, 0x0C, 0x00, 0x01, 0x98, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A79, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0C, 0x1F, 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A7A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x21, 0x10, 0x80, 0x02, 0x10, 0x00, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A7D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x11, 0x00, 0x06, 0x1F, 0x00, 0x3A, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A7E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A7F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0C, 0x0F, 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x14, 0x00, 0x00, 0x24, 0x00, 0x00, 0xC4, 0x00, 0x07, 0x04, 0x00, 0x38, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A80, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x9F, 0x80, 0x70, 0x80, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A81, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x40, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A82, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x00, 0x00, 0x04, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x80, 0x00, 0x70, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A83, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x26, 0x21, 0x00, 0x1C, 0x3F, 0x80, 0x70, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1E, 0x21, 0x00, 0x70, 0x21, 0x00, 0x10, 0x21, 0x00, 0x12, 0x61, 0x00, 0x0E, 0x43, 0x00, 0x00, 0xC2, 0x00, 0x03, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A84, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0D, 0x1F, 0x00, 0x32, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A85, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x06, 0x20, 0x00, 0x1C, 0x3F, 0x80, 0x70, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A86, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x3C, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x00, 0x00, 0x33, 0xC0, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A88, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x11, 0x00, 0x06, 0x1F, 0x00, 0x38, 0x08, 0x00, 0x04, 0x08, 0x00, 0x05, 0x08, 0x00, 0x29, 0x3F, 0x00, 0x12, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x08, 0x91, 0x00, 0x13, 0xD1, 0x00, 0x3C, 0xA1, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A8A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x94, 0x00, 0x18, 0x96, 0x00, 0x10, 0xFA, 0x00, 0x37, 0x8B, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A8B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A8D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x44, 0x1A, 0x00, 0x08, 0x08, 0x00, 0x01, 0xFE, 0x00, 0x3F, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0x04, 0x00, 0x3C, 0x44, 0x00, 0x10, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A90, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A91, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x72, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x38, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A92, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x06, 0x11, 0x00, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x02, 0x3E, 0x00, 0x1F, 0xC1, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A93, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0C, 0x1F, 0x00, 0x31, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x7C, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x0A, 0x02, 0x80, 0x13, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A94, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x3A, 0x17, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7A95, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x38, 0x00, 0x00, 0x01, 0x11, 0x00, 0x11, 0x12, 0x00, 0x09, 0x14, 0x00, 0x05, 0x10, 0x00, 0x03, 0x18, 0x00, 0x0D, 0x14, 0x00, 0x31, 0x13, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x0F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A96, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2E, 0x11, 0x00, 0x78, 0x9F, 0x80, 0x04, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A97, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x24, 0x11, 0x00, 0x18, 0x9F, 0x80, 0x61, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x12, 0xF2, 0x00, 0x11, 0x12, 0x00, 0x12, 0xA2, 0x00, 0x10, 0xC2, 0x00, 0x17, 0x22, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A98, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x22, 0x80, 0x02, 0x3E, 0x00, 0x0C, 0x00, 0x00, 0x37, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A9C, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x4C, 0x9A, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A9D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x44, 0x12, 0x00, 0x0F, 0xF8, 0x00, 0x14, 0x14, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x11, 0x44, 0x00, 0x16, 0x34, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A9E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x0F, 0x80, 0x72, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x18, 0x1E, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7A9F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x06, 0x1F, 0x00, 0x38, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AA0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x78, 0x0F, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0E, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AA3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x1C, 0x1F, 0x80, 0x70, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x1B, 0x36, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AA5, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x44, 0x12, 0x00, 0x04, 0x7C, 0x00, 0x1F, 0x44, 0x00, 0x04, 0x54, 0x00, 0x04, 0x54, 0x00, 0x3F, 0x54, 0x00, 0x04, 0x54, 0x00, 0x04, 0x18, 0x00, 0x0A, 0x29, 0x00, 0x09, 0x29, 0x00, 0x10, 0x47, 0x00, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AA6, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x48, 0x8A, 0x00, 0x17, 0xF4, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x42, 0x00, 0x02, 0x44, 0x00, 0x09, 0x40, 0x00, 0x04, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AA8, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x49, 0x0A, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AA9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0C, 0x1F, 0x00, 0x37, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x08, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x08, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AAA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0C, 0x1F, 0x00, 0x30, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AAC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x7B, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x0E, 0x1C, 0x00, 0x7B, 0xF7, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x12, 0x00, 0x19, 0x36, 0x00, 0x17, 0x24, 0x00, 0x19, 0x24, 0x00, 0x17, 0x36, 0x00, 0x11, 0x12, 0x00, 0x13, 0x12, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AAD, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x48, 0x8A, 0x00, 0x14, 0x94, 0x00, 0x02, 0xA0, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x18, 0x8C, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x07, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x38, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AAE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x11, 0x00, 0x0D, 0x1F, 0x00, 0x3F, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x0F, 0x81, 0x00, 0x08, 0x9F, 0x00, 0x0F, 0x90, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0xA0, 0x80, 0x03, 0x80, 0x80, 0x0C, 0x81, 0x00, 0x31, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AAF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x02, 0x1F, 0x00, 0x0E, 0x08, 0x00, 0x31, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AB0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2C, 0x11, 0x00, 0x71, 0x1F, 0x80, 0x07, 0xF8, 0x00, 0x3C, 0x90, 0x00, 0x02, 0x60, 0x00, 0x03, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AB3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x78, 0x1F, 0x80, 0x01, 0x82, 0x00, 0x1E, 0x3C, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0xAA, 0x00, 0x14, 0xEA, 0x00, 0x15, 0x2A, 0x00, 0x37, 0x6E, 0x80, 0x2D, 0x5B, 0x80, 0x60, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AB5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x1F, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AB6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x9F, 0x80, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AB9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x3E, 0x7E, 0x00, 0x02, 0x22, 0x00, 0x02, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x32, 0x41, 0x00, 0x22, 0x41, 0x00, 0x62, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ABA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x06, 0x11, 0x00, 0x38, 0x1F, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x1F, 0x22, 0x00, 0x04, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xBE, 0x00, 0x04, 0x22, 0x00, 0x0A, 0x3E, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x24, 0x80, 0x21, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7ABB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x9F, 0x80, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x12, 0xF2, 0x00, 0x17, 0x12, 0x00, 0x10, 0xA2, 0x00, 0x17, 0xC2, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x40, 0x00, 0x32, 0x25, 0x80, 0x61, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7ABC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x09, 0x00, 0x7C, 0x8F, 0x80, 0x11, 0x10, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0E, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7ABF, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x1F, 0x80, 0x00, 0x20, 0x00, 0x3C, 0x7E, 0x00, 0x25, 0xC4, 0x00, 0x24, 0x38, 0x00, 0x28, 0xEE, 0x00, 0x2B, 0xBB, 0x80, 0x24, 0x50, 0x00, 0x24, 0xFE, 0x00, 0x25, 0x10, 0x00, 0x2C, 0xFE, 0x00, 0x20, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AC3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x7B, 0xEF, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AC4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x11, 0x80, 0x06, 0x1F, 0x00, 0x39, 0x80, 0x00, 0x0E, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x32, 0x00, 0x09, 0x2A, 0x00, 0x0A, 0x32, 0x00, 0x09, 0x2A, 0x80, 0x0F, 0xBF, 0x80, 0x38, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AC5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x06, 0x11, 0x00, 0x38, 0x1F, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1F, 0x80, 0x11, 0x21, 0x00, 0x1F, 0x52, 0x00, 0x04, 0x94, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x8C, 0x00, 0x08, 0x92, 0x00, 0x11, 0x21, 0x00, 0x26, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AC6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x1F, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x05, 0x41, 0x00, 0x19, 0x41, 0x00, 0x61, 0x41, 0x00, 0x07, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AC7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x1E, 0x5F, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AC8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x7B, 0xEF, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AC9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x7C, 0x1F, 0x80, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x11, 0x20, 0x00, 0x0A, 0x3F, 0x00, 0x7F, 0xC1, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x20, 0x80, 0x13, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7ACA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x11, 0x00, 0x06, 0x1F, 0x00, 0x38, 0x08, 0x00, 0x03, 0x0F, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xAD, 0x00, 0x0C, 0x33, 0x00, 0x0E, 0x7F, 0x80, 0x15, 0x4A, 0x80, 0x14, 0x57, 0x80, 0x24, 0x78, 0x80, 0x04, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7ACB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ACC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x00, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x32, 0x24, 0x00, 0x16, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x07, 0x24, 0x00, 0x1C, 0x64, 0x00, 0x70, 0x44, 0x80, 0x00, 0xC4, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7ACD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x16, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x07, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x70, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ACE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ACF, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x07, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x70, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AD1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x32, 0x34, 0x00, 0x16, 0x24, 0x00, 0x14, 0x2C, 0x00, 0x14, 0x68, 0x00, 0x07, 0x49, 0x00, 0x1C, 0xD9, 0x00, 0x70, 0x11, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AD2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AD3, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x38, 0x10, 0x00, 0x60, 0x10, 0x80, 0x00, 0x19, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AD5, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x66, 0x00, 0x00, 0x42, 0x00, 0x24, 0xC3, 0x00, 0x25, 0x81, 0x80, 0x24, 0x7E, 0x00, 0x2C, 0x12, 0x00, 0x28, 0x12, 0x00, 0x08, 0x12, 0x00, 0x0E, 0x32, 0x00, 0x38, 0x22, 0x00, 0x60, 0x66, 0x00, 0x00, 0xC4, 0x00, 0x01, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AD6, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0x44, 0x00, 0x12, 0x28, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x47, 0x00, 0x03, 0x82, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AD7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x29, 0x00, 0x3E, 0x48, 0x80, 0x00, 0x48, 0x00, 0x22, 0x88, 0x00, 0x22, 0x08, 0x80, 0x14, 0x08, 0x80, 0x14, 0x09, 0x00, 0x00, 0x39, 0x00, 0x07, 0x02, 0x00, 0x38, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AD9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x8F, 0x80, 0x00, 0x08, 0x00, 0x21, 0x08, 0x00, 0x11, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x41, 0x00, 0x07, 0xC1, 0x00, 0x38, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ADA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x80, 0x80, 0x00, 0x80, 0x80, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x16, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x07, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x70, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ADB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x22, 0x3E, 0x00, 0x22, 0x00, 0x00, 0x32, 0x00, 0x00, 0x16, 0x7F, 0x00, 0x14, 0x11, 0x00, 0x14, 0x11, 0x00, 0x07, 0x11, 0x00, 0x1C, 0x11, 0x00, 0x70, 0x17, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ADC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x80, 0x00, 0x81, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ADD, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x11, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x00, 0x38, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ADE, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x0A, 0x28, 0x00, 0x02, 0x20, 0x00, 0x02, 0x21, 0x00, 0x04, 0x21, 0x00, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ADF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AE0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AE1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x18, 0x00, 0x00, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x32, 0x41, 0x00, 0x16, 0x41, 0x00, 0x14, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x07, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x70, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AE2, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x7E, 0x8F, 0x00, 0x01, 0xF9, 0x80, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFF, 0x00, 0x2D, 0x90, 0x00, 0x28, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x28, 0x00, 0x38, 0x6C, 0x00, 0x60, 0x46, 0x00, 0x00, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AE3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x9F, 0x80, 0x01, 0xE4, 0x80, 0x22, 0x24, 0x00, 0x22, 0x44, 0x80, 0x15, 0xA7, 0x80, 0x14, 0x20, 0x00, 0x14, 0x7F, 0x00, 0x04, 0xC2, 0x00, 0x07, 0x24, 0x00, 0x3A, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0xC6, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AE5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AE6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x2C, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x54, 0x00, 0x0E, 0x54, 0x00, 0x38, 0xD6, 0x00, 0x61, 0x93, 0x00, 0x03, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AE8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x2C, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AE9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x00, 0x80, 0x01, 0x00, 0x80, 0x24, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x2C, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0E, 0x7E, 0x00, 0x38, 0x42, 0x00, 0x60, 0x42, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x8A, 0x00, 0x10, 0x8C, 0x00, 0x1F, 0x84, 0x00, 0x14, 0x0A, 0x00, 0x1F, 0xB1, 0x80, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AEB, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xF2, 0x00, 0x7E, 0x53, 0x00, 0x00, 0x89, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x2D, 0xFF, 0x80, 0x28, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AEC, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF0, 0x00, 0x7E, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x2C, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x09, 0x10, 0x80, 0x0F, 0x14, 0x80, 0x39, 0x1E, 0x80, 0x61, 0x72, 0x80, 0x01, 0x00, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x10, 0x00, 0x22, 0x20, 0x00, 0x12, 0x7F, 0x80, 0x14, 0xC8, 0x80, 0x15, 0x54, 0x80, 0x14, 0x62, 0x80, 0x04, 0x40, 0x80, 0x07, 0x7F, 0x80, 0x38, 0x40, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AEF, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x14, 0x10, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x94, 0x80, 0x07, 0x94, 0x80, 0x38, 0x94, 0x80, 0x00, 0x94, 0x80, 0x00, 0x94, 0x80, 0x00, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AF0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x01, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x2D, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x39, 0x7F, 0x00, 0x61, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AF1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x2C, 0xFF, 0x00, 0x28, 0x12, 0x00, 0x08, 0x3F, 0x00, 0x0E, 0xE1, 0x80, 0x38, 0x02, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AF4, { 0x00, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xC3, 0x00, 0x09, 0xBD, 0x80, 0x7E, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xC7, 0x00, 0x24, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x02, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x42, 0x00, 0x00, 0x22, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AF6, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x13, 0xA4, 0x80, 0x2C, 0x44, 0x80, 0x20, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AF8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x35, 0x34, 0x80, 0x26, 0x24, 0x80, 0x64, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7AF9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x24, 0x24, 0x00, 0x24, 0x44, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AFA, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AFB, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x00, 0x03, 0x02, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x04, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AFD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xBF, 0x80, 0x24, 0x48, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AFE, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x44, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4E, 0x00, 0x09, 0xFA, 0x00, 0x0F, 0x42, 0x00, 0x78, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4E, 0x00, 0x08, 0x00, 0x80, 0x0C, 0x01, 0x80, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7AFF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B02, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x0D, 0x08, 0x00, 0x07, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0x08, 0x80, 0x0D, 0x89, 0x80, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B03, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B04, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xD0, 0x00, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B06, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B07, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x84, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B08, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xBF, 0x80, 0x34, 0x48, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x02, 0x1F, 0x00, 0x07, 0x06, 0x00, 0x05, 0x8C, 0x00, 0x0C, 0xD8, 0x00, 0x18, 0x70, 0x00, 0x30, 0xD8, 0x00, 0x63, 0x8E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B0A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xD0, 0x00, 0x66, 0x18, 0x00, 0x02, 0x0E, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x18, 0x86, 0x00, 0x10, 0x82, 0x00, 0x30, 0x83, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B0B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xD0, 0x00, 0x62, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B0F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x49, 0x00, 0x10, 0x89, 0x00, 0x21, 0x11, 0x00, 0x02, 0x11, 0x00, 0x0C, 0x21, 0x00, 0x30, 0x41, 0x00, 0x00, 0x82, 0x00, 0x03, 0x04, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B11, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B14, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B15, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x09, 0x48, 0x00, 0x02, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B18, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B19, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B1B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B1E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x46, 0x00, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B1F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xD0, 0x00, 0x66, 0x18, 0x00, 0x02, 0x0E, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x94, 0x00, 0x18, 0x96, 0x00, 0x10, 0xFA, 0x00, 0x37, 0x8B, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B20, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B23, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x30, 0x02, 0x00, 0x6F, 0xE2, 0x00, 0x08, 0x22, 0x00, 0x08, 0x26, 0x00, 0x0F, 0xE4, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x00, 0x80, 0x0C, 0x01, 0x80, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B24, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x08, 0x00, 0x02, 0x28, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x68, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B25, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x34, 0x48, 0x00, 0x66, 0x8C, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xF1, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xF1, 0x00, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x1F, 0xF1, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B26, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x22, 0x44, 0x00, 0x01, 0x02, 0x00, 0x04, 0x04, 0x00, 0x04, 0x06, 0x00, 0x08, 0x05, 0x00, 0x1B, 0xFF, 0x80, 0x18, 0x04, 0x00, 0x28, 0x84, 0x00, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B27, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B28, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x84, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x04, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x77, 0xFB, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B29, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x0C, 0x26, 0x00, 0x18, 0x22, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x10, 0x30, 0x00, 0x10, 0x18, 0x00, 0x10, 0x0C, 0x80, 0x10, 0x07, 0x80, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B2A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B2B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x84, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x81, 0x00, 0x06, 0x81, 0x00, 0x1C, 0x83, 0x00, 0x70, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B2C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xC0, 0x80, 0x01, 0x40, 0x80, 0x02, 0x40, 0x80, 0x0C, 0x43, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B2D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B2E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x1C, 0x80, 0x00, 0x70, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B2F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x7F, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xB3, 0x00, 0x19, 0x92, 0x00, 0x11, 0x1E, 0x00, 0x3F, 0x0C, 0x00, 0x05, 0x9E, 0x00, 0x18, 0xB3, 0x00, 0x70, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B30, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x06, 0x21, 0x00, 0x0C, 0x23, 0x00, 0x38, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B31, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x37, 0xF1, 0x00, 0x64, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x07, 0xF3, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B33, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x91, 0x00, 0x04, 0x91, 0x00, 0x04, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x08, 0x91, 0x00, 0x19, 0x91, 0x00, 0x31, 0x1F, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B34, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B35, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x30, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x60, 0x81, 0x00, 0x30, 0x81, 0x00, 0x04, 0x87, 0x00, 0x0C, 0x80, 0x00, 0x18, 0x80, 0x80, 0x30, 0xC1, 0x80, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B36, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B38, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0xF8, 0x00, 0x12, 0x08, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B39, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B3A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x24, 0x00, 0x1F, 0x7E, 0x00, 0x24, 0x10, 0x00, 0x01, 0x40, 0x00, 0x01, 0x28, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x03, 0xA2, 0x00, 0x1C, 0x12, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B3C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x01, 0x20, 0x00, 0x01, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x01, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x50, 0x00, 0x04, 0x61, 0x00, 0x04, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x13, 0x3F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B3D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B3E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x10, 0x40, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFE, 0x00, 0x38, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x14, 0x00, 0x16, 0x08, 0x00, 0x22, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B3F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x18, 0x00, 0x3B, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B40, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B41, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x32, 0xC8, 0x00, 0x61, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B45, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B46, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B47, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4C, 0x00, 0x08, 0x42, 0x00, 0x08, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x78, 0x41, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B48, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0x50, 0x00, 0x62, 0x88, 0x00, 0x00, 0x1C, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B49, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B4B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x26, 0x00, 0x23, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B4C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x06, 0x06, 0x00, 0x3F, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B4D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x13, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x03, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x03, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B4E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x19, 0x91, 0x00, 0x11, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x05, 0x91, 0x00, 0x18, 0xDF, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B4F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, 0x04, 0x48, 0x00, 0x08, 0x4F, 0x80, 0x1B, 0xF0, 0x00, 0x18, 0x21, 0x00, 0x28, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x00, 0x08, 0x28, 0x80, 0x08, 0xC6, 0x80, 0x0B, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B50, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B51, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x04, 0x32, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x22, 0x00, 0x07, 0xC2, 0x80, 0x38, 0x42, 0x80, 0x00, 0x83, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B52, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xFD, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B54, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x02, 0x42, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B55, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x70, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0D, 0xFF, 0x80, 0x38, 0x04, 0x00, 0x68, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B56, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0xE1, 0x00, 0x09, 0x53, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B58, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7F, 0x7F, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x07, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B5A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x08, 0x40, 0x00, 0x0F, 0x4C, 0x00, 0x08, 0x70, 0x00, 0x08, 0x42, 0x00, 0x0F, 0x7E, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B5B, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x04, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x08, 0x9A, 0x00, 0x08, 0x94, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B5D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x07, 0xF0, 0x00, 0x0C, 0x20, 0x00, 0x30, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B60, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x22, 0x44, 0x00, 0x09, 0x22, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x3F, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x08, 0x79, 0x00, 0x08, 0x01, 0x00, 0x0F, 0x1D, 0x00, 0x38, 0xE2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B62, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x04, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x92, 0x00, 0x06, 0x92, 0x00, 0x0C, 0xFE, 0x00, 0x34, 0x82, 0x00, 0x04, 0x80, 0x00, 0x04, 0x81, 0x00, 0x14, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B64, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x23, 0x00, 0x08, 0x36, 0x00, 0x08, 0x18, 0x00, 0x0F, 0x8E, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B65, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B66, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B67, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x80, 0x0E, 0x11, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B69, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x20, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B6A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B6C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x41, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x24, 0x00, 0x11, 0x18, 0x00, 0x11, 0x18, 0x00, 0x16, 0x24, 0x80, 0x20, 0xC2, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B6D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B6E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B6F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x31, 0x00, 0x11, 0x21, 0x00, 0x17, 0xA1, 0x00, 0x7C, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B70, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xBF, 0x80, 0x34, 0x68, 0x00, 0x62, 0x04, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0xFF, 0x80, 0x19, 0xA0, 0x00, 0x3B, 0x20, 0x00, 0x68, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B71, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x12, 0x3F, 0x80, 0x32, 0x62, 0x00, 0x72, 0xD2, 0x00, 0x12, 0x16, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x10, 0x36, 0x00, 0x10, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B72, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x88, 0x00, 0x08, 0x84, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B73, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x06, 0x00, 0x7E, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x2C, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B74, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x1D, 0xDC, 0x00, 0x35, 0x56, 0x00, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B75, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x07, 0x00, 0x02, 0x78, 0x00, 0x04, 0x08, 0x00, 0x08, 0x48, 0x00, 0x1E, 0x4F, 0x00, 0x02, 0x48, 0x00, 0x22, 0x48, 0x00, 0x15, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B77, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFE, 0x00, 0x2C, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x68, 0x22, 0x00, 0x4B, 0xFF, 0x80, 0x08, 0x50, 0x00, 0x08, 0x58, 0x00, 0x08, 0xCC, 0x00, 0x09, 0x86, 0x00, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B79, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x12, 0x08, 0x00, 0x21, 0x08, 0x00, 0x01, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B7A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x10, 0x28, 0x00, 0x10, 0x24, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B7B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x22, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x14, 0x84, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x06, 0x70, 0x00, 0x38, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B7D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B7E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x27, 0x00, 0x67, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x04, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B80, { 0x00, 0x00, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x48, 0x04, 0x00, 0x15, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B84, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B85, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B86, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x68, 0xC8, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x11, 0x62, 0x00, 0x16, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x10, 0x23, 0x00, 0x1F, 0x2E, 0x00, 0x10, 0x38, 0x00, 0x10, 0x20, 0x80, 0x1F, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B87, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFD, 0x00, 0x10, 0x41, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B89, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x1C, 0x3F, 0x00, 0x70, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x61, 0x00, 0x10, 0xC1, 0x00, 0x33, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B8B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x52, 0x00, 0x00, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x88, 0x00, 0x00, 0x70, 0x00, 0x03, 0x90, 0x80, 0x3C, 0x4F, 0x80, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0x28, 0x00, 0x01, 0xF0, 0x80, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B8D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x66, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7E, 0x88, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA9, 0x00, 0x0E, 0xA9, 0x00, 0x78, 0xAB, 0x00, 0x08, 0x88, 0x00, 0x08, 0x80, 0x00, 0x18, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B8E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x88, 0x00, 0x02, 0x44, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xF8, 0x00, 0x17, 0x82, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x31, 0x10, 0x00, 0x21, 0x10, 0x80, 0x63, 0x19, 0x80, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B8F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xE2, 0x00, 0x08, 0x11, 0x00, 0x10, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B90, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B91, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x1C, 0x80, 0x00, 0x36, 0x80, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B92, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x84, 0x00, 0x08, 0x8C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B94, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x08, 0x00, 0x10, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x20, 0x81, 0x00, 0x10, 0x81, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B95, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B96, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x0D, 0x1C, 0x00, 0x14, 0xAA, 0x00, 0x34, 0x6B, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B97, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B98, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0xA1, 0x00, 0x26, 0xB1, 0x00, 0x2C, 0x9D, 0x00, 0x20, 0x81, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B99, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x51, 0x00, 0x12, 0x5B, 0x00, 0x1E, 0x4A, 0x00, 0x12, 0x4E, 0x00, 0x12, 0x44, 0x00, 0x32, 0x4F, 0x00, 0x26, 0x59, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B9A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x09, 0x09, 0x00, 0x30, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x1F, 0x81, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B9B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x0F, 0x00, 0x7D, 0xFA, 0x00, 0x05, 0x02, 0x00, 0x09, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x22, 0x00, 0x71, 0x22, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2B, 0x00, 0x13, 0x3D, 0x00, 0x12, 0xE5, 0x00, 0x76, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B9C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x7C, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7B9D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x38, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B9E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x08, 0x84, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x1C, 0x16, 0x00, 0x74, 0x13, 0x80, 0x04, 0x70, 0x00, 0x04, 0x02, 0x00, 0x06, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7B9F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x08, 0x26, 0x00, 0x0F, 0xBC, 0x00, 0x08, 0x20, 0x80, 0x0F, 0xA1, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BA0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x1C, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BA1, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BA2, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x47, 0x7A, 0x00, 0x09, 0x48, 0x00, 0x09, 0x48, 0x00, 0x19, 0x48, 0x00, 0x26, 0x68, 0x00, 0x04, 0x50, 0x00, 0x08, 0x41, 0x00, 0x10, 0x41, 0x00, 0x20, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BA5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x08, 0x00, 0x30, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x09, 0x08, 0x80, 0x61, 0x08, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x41, 0x00, 0x09, 0x63, 0x00, 0x1B, 0x36, 0x00, 0x12, 0x1C, 0x00, 0x36, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BA6, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x09, 0x68, 0x00, 0x02, 0x18, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BA7, { 0x00, 0x00, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x62, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x48, 0x00, 0x17, 0xFC, 0x00, 0x12, 0x48, 0x00, 0x11, 0x50, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x18, 0x00, 0x12, 0x0A, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BA8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xBF, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x70, 0x00, 0x08, 0x88, 0x00, 0x09, 0x27, 0x00, 0x0E, 0xFA, 0x00, 0x78, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x28, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BA9, { 0x00, 0x00, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xBF, 0x00, 0x28, 0x50, 0x00, 0x44, 0x8A, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x14, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BAA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x50, 0x00, 0x42, 0x08, 0x00, 0x10, 0x82, 0x00, 0x08, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BAB, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x12, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0x8C, 0x00, 0x18, 0x8C, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BAC, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x02, 0x00, 0x74, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BAD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x81, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x21, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BAF, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xB0, 0x00, 0x10, 0x60, 0x00, 0x13, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BB0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x0A, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x70, 0x01, 0x00, 0x07, 0xF9, 0x00, 0x04, 0x09, 0x00, 0x07, 0xF9, 0x00, 0x04, 0x0B, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BB1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x0E, 0x3F, 0x00, 0x0D, 0x21, 0x00, 0x14, 0xA1, 0x00, 0x14, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BB2, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x10, 0x00, 0x30, 0x90, 0x00, 0x18, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x63, 0x10, 0x00, 0x30, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xC4, 0x80, 0x31, 0x84, 0x80, 0x63, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BB4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x21, 0x41, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x1F, 0xF1, 0x00, 0x10, 0x11, 0x00, 0x17, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x8C, 0x00, 0x17, 0x88, 0x00, 0x24, 0x94, 0x80, 0x20, 0x62, 0x80, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BB5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x04, 0x8E, 0x00, 0x1C, 0x83, 0x80, 0x73, 0x98, 0x00, 0x00, 0x60, 0x00, 0x0F, 0xFE, 0x00, 0x78, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BB6, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0x31, 0x00, 0x1F, 0x21, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BB8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x21, 0x61, 0x00, 0x00, 0x42, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x68, 0x00, 0x01, 0x84, 0x00, 0x07, 0xFE, 0x00, 0x3A, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BBA, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x0B, 0x80, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BBB, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x11, 0x00, 0x63, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BBC, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x02, 0x00, 0x12, 0x3F, 0x00, 0x17, 0xE1, 0x00, 0x30, 0x20, 0x00, 0x23, 0xFE, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BBD, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BC0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x10, 0x11, 0x00, 0x13, 0x91, 0x00, 0x1C, 0x11, 0x00, 0x10, 0x57, 0x00, 0x1F, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BC1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BC2, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x30, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BC4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0xA7, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x80, 0x3F, 0xA0, 0x80, 0x04, 0x3F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BC5, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x84, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BC6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x22, 0x00, 0x0C, 0xD4, 0x00, 0x31, 0x28, 0x00, 0x06, 0x54, 0x00, 0x39, 0x92, 0x00, 0x0E, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BC7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0x80, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x88, 0x80, 0x18, 0x88, 0x80, 0x1F, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BC8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xB2, 0x00, 0x04, 0x12, 0x00, 0x04, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BC9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x04, 0x32, 0x80, 0x07, 0xAB, 0x80, 0x3C, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BCA, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x30, 0x44, 0x00, 0x18, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x60, 0x44, 0x00, 0x30, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x10, 0x44, 0x00, 0x30, 0xC6, 0x00, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BCB, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x15, 0x54, 0x00, 0x10, 0xE0, 0x00, 0x11, 0xB8, 0x00, 0x17, 0x0E, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BCC, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x04, 0x00, 0x00, 0x0C, 0xFC, 0x00, 0x18, 0x04, 0x00, 0x33, 0xFF, 0x80, 0x70, 0x80, 0x00, 0x10, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BCF, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x00, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x3F, 0x80, 0x7F, 0xE0, 0x80, 0x11, 0x49, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x1C, 0x00, 0x11, 0x14, 0x00, 0x11, 0x36, 0x00, 0x1F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BD1, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x20, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x03, 0x30, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BD2, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x70, 0x00, 0x06, 0x8C, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x42, 0x00, 0x04, 0x34, 0x00, 0x05, 0xE8, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BD3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA4, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x06, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x02, 0x30, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BD4, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BD6, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x44, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x30, 0x20, 0x00, 0x23, 0xFE, 0x00, 0x62, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BD7, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x1C, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BD9, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xFB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BDA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x17, 0x9E, 0x00, 0x10, 0x90, 0x00, 0x17, 0x9E, 0x00, 0x10, 0x90, 0x00, 0x17, 0x9E, 0x00, 0x10, 0x90, 0x00, 0x11, 0x90, 0x00, 0x13, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BDB, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x7F, 0x7F, 0x00, 0x01, 0x01, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x09, 0x09, 0x00, 0x31, 0x31, 0x00, 0x47, 0x47, 0x00, 0x19, 0x19, 0x00, 0x63, 0x63, 0x00, 0x02, 0x02, 0x00, 0x0E, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BDD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x14, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BE0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x10, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x31, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x84, 0x00, 0x19, 0x1B, 0x00, 0x29, 0x64, 0x80, 0x09, 0x7F, 0x80, 0x09, 0x0C, 0x00, 0x09, 0x16, 0x00, 0x09, 0x25, 0x00, 0x08, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BE1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x2F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x05, 0x10, 0x00, 0x19, 0x4F, 0x00, 0x62, 0x22, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BE4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x08, 0x80, 0x02, 0x24, 0x80, 0x11, 0x11, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BE5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BE6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0x48, 0x00, 0x62, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x08, 0x26, 0x00, 0x0F, 0xBC, 0x00, 0x08, 0x20, 0x80, 0x0F, 0xA1, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BE8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x6C, 0x00, 0x24, 0xC6, 0x00, 0x29, 0x83, 0x00, 0x2B, 0x7D, 0x80, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x2C, 0x92, 0x00, 0x21, 0x93, 0x00, 0x23, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BE9, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3F, 0x80, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x24, 0x80, 0x10, 0x24, 0x80, 0x1F, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x1F, 0xA5, 0x80, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BEA, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xC0, 0x00, 0x20, 0x7E, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x28, 0xF8, 0x00, 0x2B, 0x82, 0x00, 0x68, 0xFE, 0x00, 0x48, 0x90, 0x80, 0x51, 0x99, 0x80, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BED, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xBF, 0x80, 0x34, 0x48, 0x00, 0x62, 0x04, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BEE, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x42, 0x40, 0x00, 0x12, 0x7E, 0x00, 0x12, 0xA0, 0x00, 0x13, 0x10, 0x00, 0x12, 0x10, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BF1, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x28, 0x00, 0x09, 0xC8, 0x00, 0x0A, 0x28, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x13, 0xF4, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BF2, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BF3, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BF4, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x30, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x68, 0x40, 0x00, 0x31, 0xA1, 0x00, 0x12, 0x53, 0x00, 0x01, 0x9A, 0x00, 0x7A, 0x34, 0x00, 0x08, 0xD2, 0x00, 0x0B, 0x11, 0x80, 0x18, 0x70, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BF5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x31, 0x45, 0x00, 0x63, 0x6D, 0x80, 0x08, 0x00, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x70, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x11, 0x90, 0x00, 0x13, 0x50, 0x00, 0x16, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BF6, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BF7, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x24, 0x00, 0x30, 0x7E, 0x00, 0x19, 0xC4, 0x00, 0x00, 0x38, 0x00, 0x30, 0x6E, 0x00, 0x1B, 0x93, 0x80, 0x00, 0xFE, 0x00, 0x70, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7BF8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x3F, 0x80, 0x64, 0xE4, 0x00, 0x09, 0x12, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x12, 0x22, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x0C, 0x6C, 0x00, 0x77, 0x83, 0x80, 0x00, 0x70, 0x00, 0x07, 0x84, 0x00, 0x00, 0x38, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BF9, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x0C, 0x00, 0x1F, 0xFA, 0x00, 0x68, 0x01, 0x80, 0x08, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BFA, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x24, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x38, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BFC, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x80, 0x00, 0x3B, 0xF7, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3B, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7BFE, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x1A, 0x00, 0x17, 0xCE, 0x00, 0x30, 0x1C, 0x80, 0x20, 0x76, 0x80, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C00, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x48, 0x00, 0x02, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C01, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x10, 0x00, 0x18, 0x90, 0x00, 0x30, 0x9F, 0x00, 0x60, 0x90, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x70, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x11, 0x90, 0x00, 0x13, 0x50, 0x00, 0x16, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C02, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x25, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x21, 0x00, 0x27, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x27, 0xA9, 0x00, 0x20, 0x15, 0x00, 0x2F, 0xB5, 0x00, 0x20, 0x49, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C03, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x03, 0x10, 0x00, 0x0E, 0x3F, 0x00, 0x78, 0x63, 0x00, 0x08, 0xD6, 0x00, 0x7F, 0x0C, 0x00, 0x08, 0x78, 0x00, 0x1C, 0x0F, 0x80, 0x1A, 0x18, 0x80, 0x29, 0x75, 0x80, 0x48, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C04, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x07, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x04, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x22, 0x00, 0x37, 0xFE, 0x00, 0x24, 0x00, 0x80, 0x66, 0x01, 0x80, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C06, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x92, 0x00, 0x12, 0x22, 0x00, 0x12, 0x74, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x36, 0x80, 0x33, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C07, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x90, 0x00, 0x0F, 0x20, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x88, 0x00, 0x09, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x12, 0x22, 0x00, 0x2C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C09, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x30, 0x90, 0x00, 0x18, 0xFF, 0x00, 0x69, 0x10, 0x00, 0x30, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C0B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x64, 0x00, 0x0F, 0x18, 0x00, 0x78, 0x07, 0x80, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C0C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xA0, 0x80, 0x24, 0xC9, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x15, 0x16, 0x00, 0x64, 0xB3, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C0D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x48, 0x00, 0x02, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C0E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1C, 0xFE, 0x00, 0x70, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C0F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x33, 0xDE, 0x00, 0x22, 0x10, 0x80, 0x67, 0xD1, 0x80, 0x1C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C11, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x48, 0x00, 0x02, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFD, 0x00, 0x02, 0x23, 0x00, 0x0C, 0x32, 0x00, 0x77, 0x9C, 0x00, 0x0C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C12, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x27, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x09, 0x16, 0x00, 0x32, 0x79, 0x80, 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C13, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7F, 0x80, 0x34, 0xC8, 0x00, 0x62, 0x04, 0x00, 0x1F, 0xC1, 0x00, 0x10, 0x43, 0x00, 0x12, 0x46, 0x00, 0x17, 0x5D, 0x00, 0x12, 0x43, 0x00, 0x17, 0x46, 0x00, 0x12, 0x5C, 0x80, 0x17, 0x41, 0x80, 0x35, 0x43, 0x00, 0x27, 0x46, 0x00, 0x60, 0xDC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C14, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x48, 0x00, 0x02, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x21, 0x00, 0x0C, 0x32, 0x00, 0x77, 0x9C, 0x00, 0x0C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C16, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0x88, 0x00, 0x04, 0x06, 0x00, 0x35, 0x78, 0x00, 0x2E, 0x40, 0x00, 0x24, 0x42, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x48, 0x00, 0x2C, 0x48, 0x00, 0x35, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3F, 0x48, 0x00, 0x00, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C17, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC4, 0x00, 0x02, 0x02, 0x00, 0x30, 0xFC, 0x00, 0x18, 0x24, 0x00, 0x61, 0x65, 0x00, 0x2A, 0x44, 0x80, 0x18, 0xC4, 0x00, 0x31, 0x9C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x0C, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C19, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x12, 0x15, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C1B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x12, 0x07, 0x00, 0x12, 0x3C, 0x00, 0x7F, 0xA0, 0x00, 0x12, 0x20, 0x00, 0x1E, 0x3F, 0x80, 0x12, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xA4, 0x00, 0x00, 0x44, 0x00, 0x12, 0x44, 0x00, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C1E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x24, 0x48, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C1F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C20, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x86, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C21, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x21, 0x22, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C23, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x48, 0x00, 0x02, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C25, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1B, 0xF6, 0x00, 0x62, 0x11, 0x80, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C26, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC6, 0x00, 0x01, 0x6C, 0x00, 0x33, 0x31, 0x80, 0x16, 0x1B, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x06, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C27, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x03, 0x4A, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C28, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x20, 0x00, 0x21, 0x21, 0x00, 0x1F, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C2A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x14, 0x00, 0x13, 0xA4, 0x80, 0x2E, 0x47, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C2B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x52, 0x00, 0x0F, 0x5E, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0x5E, 0x00, 0x11, 0x52, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C2C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x62, 0x00, 0x22, 0xD6, 0x00, 0x3E, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x2E, 0xE3, 0x80, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C31, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x10, 0x3E, 0x00, 0x1E, 0x22, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x22, 0x22, 0x00, 0x6E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C33, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x22, 0xBE, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C34, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x88, 0x00, 0x02, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0xF8, 0x00, 0x17, 0x02, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x14, 0x92, 0x00, 0x32, 0x94, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x90, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C36, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x40, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x7C, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x54, 0x91, 0x00, 0x54, 0x52, 0x00, 0x54, 0x3A, 0x00, 0x54, 0x56, 0x00, 0x11, 0x91, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C37, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x68, 0x88, 0x00, 0x07, 0xF4, 0x00, 0x0C, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x12, 0x04, 0x00, 0x1C, 0xF7, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x30, 0x00, 0x00, 0x27, 0xFE, 0x00, 0x64, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C38, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x68, 0xD0, 0x00, 0x00, 0x04, 0x00, 0x12, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x44, 0x80, 0x1E, 0x44, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x51, 0x00, 0x12, 0x5B, 0x00, 0x7F, 0xCE, 0x00, 0x14, 0x44, 0x00, 0x36, 0x8A, 0x00, 0x63, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C39, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x84, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C3A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x86, 0x00, 0x67, 0xF9, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C3D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x01, 0xB0, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x02, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x09, 0x12, 0x00, 0x10, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C3E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x90, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x98, 0x00, 0x22, 0x96, 0x00, 0x2C, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C3F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x00, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x01, 0xFE, 0x00, 0x09, 0x22, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x09, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C40, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x88, 0x00, 0x12, 0x60, 0x00, 0x11, 0xDF, 0x00, 0x11, 0x05, 0x00, 0x7D, 0x45, 0x00, 0x11, 0xED, 0x00, 0x13, 0x1B, 0x00, 0x18, 0x00, 0x00, 0x70, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x30, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C41, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x14, 0x50, 0x00, 0x22, 0xA8, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBC, 0x00, 0x04, 0x48, 0x00, 0x1F, 0xFE, 0x00, 0x15, 0x42, 0x00, 0x15, 0x4A, 0x00, 0x1F, 0x4A, 0x00, 0x0C, 0x52, 0x00, 0x16, 0x5A, 0x00, 0x25, 0x24, 0x00, 0x44, 0x23, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C43, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x02, 0x02, 0x00, 0x1F, 0x88, 0x00, 0x12, 0x10, 0x00, 0x1F, 0xBF, 0x80, 0x10, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x12, 0x1F, 0x00, 0x1F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C46, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x68, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C4A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x7F, 0x7F, 0x00, 0x33, 0x33, 0x00, 0x4D, 0x4D, 0x00, 0x31, 0x31, 0x00, 0x44, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C4C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x21, 0x21, 0x00, 0x1F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x84, 0x00, 0x03, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C4D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x04, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x04, 0x7F, 0x80, 0x1F, 0x12, 0x00, 0x04, 0xFF, 0x80, 0x3F, 0x80, 0x00, 0x0C, 0x3F, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C4F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x1E, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x32, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x6E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C50, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x54, 0x00, 0x3C, 0x92, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x28, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x92, 0x00, 0x3D, 0x55, 0x80, 0x24, 0x38, 0x00, 0x24, 0x56, 0x00, 0x65, 0x91, 0x80, 0x4C, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C51, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0x0C, 0x00, 0x17, 0xFA, 0x00, 0x64, 0x09, 0x80, 0x07, 0xF8, 0x00, 0x04, 0x26, 0x00, 0x07, 0x98, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C52, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x7E, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x08, 0xF7, 0x80, 0x08, 0x14, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C53, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x30, 0x0F, 0x00, 0x19, 0xF8, 0x00, 0x00, 0x92, 0x00, 0x00, 0x54, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x54, 0x00, 0x00, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x92, 0x00, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C54, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x8F, 0x80, 0x7F, 0xDA, 0x00, 0x24, 0xB2, 0x00, 0x3F, 0x8A, 0x00, 0x15, 0x0A, 0x00, 0x1F, 0x0E, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xCE, 0x00, 0x11, 0x0A, 0x00, 0x0E, 0x1B, 0x00, 0x71, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C55, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x30, 0x00, 0x08, 0xE7, 0x80, 0x7E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x18, 0xD5, 0x80, 0x1C, 0x24, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x48, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C56, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xD0, 0x00, 0x02, 0x0A, 0x00, 0x3F, 0xEB, 0x00, 0x02, 0x09, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x39, 0xC9, 0x00, 0x09, 0x0B, 0x00, 0x39, 0xCA, 0x00, 0x09, 0x0E, 0x00, 0x39, 0xC4, 0x00, 0x09, 0x0E, 0x80, 0x0F, 0xDA, 0x80, 0x78, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C58, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x00, 0x54, 0x00, 0x3C, 0x92, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x25, 0x91, 0x80, 0x3C, 0x24, 0x00, 0x24, 0x19, 0x00, 0x24, 0xFE, 0x80, 0x64, 0x52, 0x00, 0x4D, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C59, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x7F, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x2A, 0x00, 0x2A, 0x1C, 0x00, 0x2F, 0x2A, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C5A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x88, 0x00, 0x02, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x17, 0xF8, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x48, 0x00, 0x13, 0xF8, 0x00, 0x32, 0x48, 0x00, 0x27, 0xFE, 0x00, 0x64, 0x92, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C5B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x3F, 0x00, 0x16, 0xF4, 0x00, 0x20, 0x18, 0x00, 0x7E, 0x2C, 0x80, 0x08, 0xC7, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x4A, 0xF4, 0x00, 0x28, 0x18, 0x00, 0x1E, 0x2C, 0x80, 0x70, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C5C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1C, 0x44, 0x00, 0x73, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C5D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x3D, 0x1E, 0x00, 0x27, 0xD2, 0x00, 0x3D, 0x52, 0x00, 0x25, 0x5A, 0x00, 0x3D, 0x92, 0x80, 0x24, 0xD2, 0x80, 0x45, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C5E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x09, 0x07, 0x80, 0x19, 0xF4, 0x80, 0x72, 0x44, 0x80, 0x0B, 0xF4, 0x80, 0x19, 0x44, 0x80, 0x71, 0x75, 0x80, 0x13, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x73, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C5F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x09, 0x00, 0x08, 0x3B, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x3F, 0x00, 0x49, 0x21, 0x00, 0x7F, 0x39, 0x00, 0x18, 0x2F, 0x00, 0x3C, 0x21, 0x00, 0x2A, 0x3F, 0x00, 0x49, 0x12, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C60, { 0x00, 0x00, 0x00, 0x48, 0x08, 0x00, 0x5F, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x02, 0x00, 0x00, 0x5F, 0x90, 0x00, 0x49, 0x1F, 0x80, 0x09, 0x10, 0x00, 0x3F, 0xDF, 0x80, 0x00, 0x00, 0x80, 0x1F, 0x9F, 0x80, 0x10, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x90, 0x80, 0x11, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C61, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x08, 0x6C, 0x00, 0x7E, 0xC6, 0x00, 0x09, 0xBB, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xEF, 0x00, 0x79, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x82, 0x00, 0x09, 0x45, 0x00, 0x3A, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C63, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x25, 0xA9, 0x00, 0x27, 0xF9, 0x00, 0x22, 0xA1, 0x00, 0x2C, 0x9B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C64, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x08, 0x90, 0x00, 0x08, 0x94, 0x00, 0x15, 0x52, 0x00, 0x00, 0x30, 0x00, 0x3F, 0xFF, 0x80, 0x05, 0x10, 0x00, 0x1D, 0xD1, 0x00, 0x05, 0x0A, 0x00, 0x1D, 0xCC, 0x00, 0x05, 0x0C, 0x80, 0x07, 0xF2, 0x80, 0x3C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C65, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0x84, 0x00, 0x03, 0xE2, 0x00, 0x0E, 0x3C, 0x00, 0x79, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C67, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x1F, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x69, 0x10, 0x80, 0x31, 0x7C, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x80, 0x79, 0x31, 0x00, 0x09, 0x5A, 0x00, 0x0A, 0x2E, 0x00, 0x18, 0xD5, 0x80, 0x34, 0x2C, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C69, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x68, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x02, 0x44, 0x80, 0x78, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x18, 0x7E, 0x00, 0x34, 0x82, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C6C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x01, 0x02, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0xD4, 0x00, 0x1B, 0x3F, 0x80, 0x15, 0x64, 0x00, 0x1B, 0xA4, 0x00, 0x1F, 0x3F, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x3F, 0xBF, 0x80, 0x21, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C6D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x22, 0x11, 0x00, 0x2A, 0x95, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x67, 0xBE, 0x80, 0x44, 0x20, 0x80, 0x1F, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C6E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x11, 0x00, 0x32, 0x22, 0x00, 0x14, 0x7F, 0x80, 0x0A, 0xC4, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x44, 0x00, 0x2A, 0x7F, 0x00, 0x6B, 0x44, 0x00, 0x49, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C70, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x02, 0x84, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x1C, 0x0E, 0x00, 0x07, 0xF8, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C72, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x64, 0xC8, 0x00, 0x0F, 0x04, 0x00, 0x39, 0xDF, 0x80, 0x6F, 0x64, 0x00, 0x00, 0x1F, 0x80, 0x77, 0x70, 0x80, 0x55, 0x5F, 0x80, 0x77, 0x70, 0x80, 0x00, 0x1F, 0x80, 0x3F, 0xD0, 0x80, 0x2A, 0x50, 0x80, 0x3F, 0xDF, 0x80, 0x2A, 0x49, 0x00, 0x2A, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C73, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x01, 0x50, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x01, 0x48, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C74, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x8C, 0x00, 0x60, 0x83, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8E, 0x00, 0x30, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C75, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x49, 0x08, 0x00, 0x6B, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C79, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x49, 0x10, 0x00, 0x6B, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x66, 0x00, 0x1A, 0x44, 0x00, 0x29, 0x44, 0x00, 0x28, 0xFC, 0x00, 0x48, 0x0E, 0x00, 0x08, 0x3B, 0x00, 0x08, 0x61, 0x80, 0x09, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C7B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x98, 0x00, 0x08, 0x88, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x0E, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C7C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x28, 0x91, 0x00, 0x48, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C7D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x49, 0x7F, 0x80, 0x6B, 0x03, 0x00, 0x2A, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C7E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x00, 0x6A, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x08, 0x11, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x51, 0x00, 0x08, 0x51, 0x00, 0x1C, 0x71, 0x00, 0x1A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x28, 0x71, 0x00, 0x48, 0x53, 0x00, 0x08, 0x52, 0x00, 0x08, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C81, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x49, 0x0E, 0x00, 0x6B, 0x78, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C82, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x20, 0x00, 0x38, 0x60, 0x00, 0x01, 0xB0, 0x00, 0x07, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x83, 0x80, 0x08, 0x84, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB8, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C83, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x25, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x3F, 0xC4, 0x80, 0x0C, 0x7D, 0x00, 0x0E, 0x46, 0x00, 0x15, 0x44, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x80, 0x04, 0x7C, 0x80, 0x05, 0xC7, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C86, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x2A, 0x54, 0x00, 0x08, 0x56, 0x00, 0x7E, 0xD3, 0x00, 0x08, 0x91, 0x80, 0x09, 0x90, 0x00, 0x1C, 0x11, 0x00, 0x1A, 0x11, 0x00, 0x2A, 0x73, 0x00, 0x28, 0x02, 0x00, 0x48, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x38, 0x00, 0x08, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C87, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x28, 0x22, 0x00, 0x48, 0x22, 0x00, 0x08, 0x62, 0x80, 0x08, 0x42, 0x80, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C89, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x29, 0x04, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x22, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x81, 0x00, 0x09, 0x00, 0x80, 0x18, 0xFE, 0x00, 0x3C, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x84, 0x00, 0x09, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C8B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x49, 0x10, 0x00, 0x6B, 0x7E, 0x00, 0x2A, 0x12, 0x00, 0x08, 0x32, 0x00, 0x7F, 0x22, 0x80, 0x08, 0x62, 0x80, 0x08, 0xC1, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C8D, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x49, 0x1C, 0x00, 0x6B, 0x70, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x1F, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x1F, 0x00, 0x2A, 0xF0, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x80, 0x08, 0x19, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C8F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x1C, 0x2C, 0x00, 0x1A, 0x24, 0x00, 0x2A, 0x64, 0x00, 0x28, 0x46, 0x00, 0x48, 0x52, 0x00, 0x08, 0x5A, 0x00, 0x08, 0xCB, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7C90, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x28, 0x40, 0x00, 0x48, 0x40, 0x00, 0x08, 0xC0, 0x00, 0x08, 0x80, 0x00, 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C91, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x4A, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x2C, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x18, 0x92, 0x00, 0x1C, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x80, 0x00, 0x48, 0x80, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C92, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x29, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x81, 0x00, 0x18, 0x41, 0x00, 0x1C, 0x42, 0x00, 0x3A, 0x22, 0x00, 0x29, 0x22, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C94, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x28, 0x40, 0x00, 0x48, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C95, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x24, 0x88, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x40, 0x80, 0x04, 0x40, 0x80, 0x3F, 0xC0, 0x80, 0x04, 0x40, 0x80, 0x0E, 0x7F, 0x80, 0x0D, 0x40, 0x80, 0x14, 0x40, 0x80, 0x14, 0x40, 0x80, 0x24, 0x40, 0x80, 0x04, 0x7F, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C97, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x22, 0x42, 0x00, 0x14, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x3F, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C98, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x14, 0x88, 0x00, 0x15, 0x0F, 0x80, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x0C, 0x08, 0x00, 0x0C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x15, 0x41, 0x00, 0x14, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C9B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x14, 0x8A, 0x00, 0x12, 0x92, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC2, 0x00, 0x12, 0xA2, 0x00, 0x34, 0x9A, 0x00, 0x20, 0x82, 0x00, 0x60, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C9C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x04, 0x98, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xB0, 0x00, 0x0C, 0x8E, 0x00, 0x30, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C9D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x4A, 0xFF, 0x00, 0x2A, 0x80, 0x00, 0x2C, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0xA0, 0x00, 0x18, 0xA2, 0x00, 0x1C, 0xBF, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x48, 0xA2, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x4A, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C9E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x1C, 0xA4, 0x80, 0x1A, 0xA3, 0x80, 0x2A, 0xC0, 0x80, 0x28, 0x80, 0x80, 0x48, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7C9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CA0, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x4A, 0x44, 0x00, 0x6A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x48, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CA1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x7D, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x7D, 0x00, 0x39, 0x45, 0x00, 0x35, 0x45, 0x00, 0x55, 0x45, 0x00, 0x51, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CA2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x39, 0xFF, 0x00, 0x03, 0x21, 0x00, 0x00, 0x22, 0x00, 0x08, 0x70, 0x00, 0x18, 0xD8, 0x00, 0x31, 0x8E, 0x00, 0x63, 0x03, 0x80, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CA4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x14, 0x92, 0x00, 0x12, 0xA2, 0x00, 0x17, 0xFA, 0x00, 0x11, 0xC2, 0x00, 0x12, 0xA2, 0x00, 0x14, 0x92, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CA5, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x3D, 0x5F, 0x00, 0x05, 0x51, 0x00, 0x05, 0x61, 0x00, 0x04, 0x41, 0x00, 0x1F, 0xF7, 0x00, 0x10, 0x44, 0x00, 0x20, 0xC8, 0x00, 0x3C, 0xEF, 0x80, 0x05, 0x50, 0x80, 0x05, 0x48, 0x80, 0x05, 0x40, 0x80, 0x06, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x18, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CA6, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x08, 0x04, 0x00, 0x0F, 0x3F, 0x80, 0x39, 0x24, 0x00, 0x69, 0x24, 0x00, 0x07, 0xFF, 0x80, 0x06, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x70, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CA7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x18, 0x88, 0x00, 0x1C, 0xFF, 0x00, 0x3A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x29, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CA8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x6A, 0x10, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x20, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CAA, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x06, 0x98, 0x00, 0x02, 0xA0, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x0C, 0x9E, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CAB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x6A, 0x10, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x20, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x1C, 0xA9, 0x00, 0x1A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x28, 0xA9, 0x00, 0x48, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x08, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CAD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x54, 0x38, 0x00, 0x54, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x7D, 0x83, 0x00, 0x13, 0x7D, 0x80, 0x10, 0x00, 0x00, 0x38, 0x00, 0x00, 0x34, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x50, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CAE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x29, 0x10, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x1C, 0x7E, 0x00, 0x3A, 0x49, 0x00, 0x28, 0x4A, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x08, 0x5E, 0x00, 0x09, 0xE1, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CB0, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x4A, 0x0E, 0x00, 0x6A, 0xFA, 0x00, 0x2A, 0x53, 0x00, 0x08, 0xD9, 0x00, 0x7E, 0x89, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x1C, 0x04, 0x00, 0x1A, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CB1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x12, 0x00, 0x24, 0x52, 0x00, 0x14, 0x93, 0x00, 0x09, 0x22, 0x80, 0x10, 0xC2, 0x80, 0x13, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x60, 0x00, 0x02, 0x50, 0x00, 0x0C, 0x4C, 0x00, 0x30, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CB2, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x0A, 0x3F, 0x80, 0x0F, 0xD1, 0x00, 0x08, 0x8A, 0x00, 0x15, 0x04, 0x00, 0x22, 0x0A, 0x00, 0x04, 0x11, 0x80, 0x08, 0x60, 0x00, 0x34, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CB3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xC9, 0x00, 0x0C, 0x7F, 0x00, 0x0E, 0x49, 0x00, 0x15, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x24, 0x48, 0x00, 0x04, 0x30, 0x00, 0x04, 0x1C, 0x00, 0x04, 0x23, 0x80, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CB6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x1C, 0xC9, 0x00, 0x1A, 0x6B, 0x00, 0x2A, 0x0A, 0x00, 0x28, 0x1C, 0x00, 0x48, 0x2E, 0x00, 0x08, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CB7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x4A, 0x40, 0x00, 0x6A, 0x7F, 0x80, 0x2A, 0x80, 0x80, 0x09, 0x10, 0x80, 0x7E, 0x92, 0x80, 0x08, 0x54, 0x80, 0x08, 0xFE, 0x80, 0x1C, 0x10, 0x80, 0x1A, 0x38, 0x80, 0x2A, 0x34, 0x80, 0x28, 0x52, 0x80, 0x48, 0x50, 0x80, 0x08, 0x91, 0x80, 0x08, 0x11, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CB9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3E, 0xA5, 0x00, 0x09, 0x18, 0x80, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x38, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CBA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x08, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0xA1, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x48, 0x00, 0x2A, 0x88, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CBB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x00, 0x6A, 0x80, 0x00, 0x2A, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x1D, 0xFF, 0x80, 0x1A, 0x91, 0x00, 0x2A, 0x9B, 0x00, 0x28, 0x8A, 0x00, 0x48, 0x8C, 0x00, 0x08, 0x86, 0x00, 0x08, 0xF3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CBC, { 0x00, 0x00, 0x00, 0x24, 0x88, 0x80, 0x15, 0x08, 0x80, 0x04, 0x19, 0x80, 0x7F, 0xD1, 0x00, 0x15, 0x33, 0x00, 0x35, 0xA2, 0x00, 0x64, 0xC4, 0x00, 0x24, 0x44, 0x00, 0x38, 0xA2, 0x00, 0x6F, 0xE2, 0x00, 0x4A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x1A, 0x99, 0x80, 0x17, 0xC8, 0x80, 0x30, 0x88, 0x80, 0x60, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CBD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x54, 0x92, 0x00, 0x50, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CBE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x25, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x88, 0x00, 0x04, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CBF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x00, 0x6A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x2A, 0x54, 0x00, 0x28, 0x56, 0x00, 0x48, 0xD2, 0x00, 0x08, 0x93, 0x00, 0x09, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CC0, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x54, 0x44, 0x00, 0x55, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x7C, 0x28, 0x00, 0x10, 0x68, 0x00, 0x10, 0x49, 0x80, 0x38, 0xCB, 0x00, 0x35, 0xCE, 0x00, 0x53, 0x48, 0x00, 0x50, 0x48, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x80, 0x10, 0x49, 0x80, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CC1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x4A, 0x44, 0x00, 0x2A, 0xFE, 0x00, 0x2C, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x28, 0x00, 0x18, 0x4C, 0x00, 0x1C, 0x92, 0x00, 0x2B, 0x65, 0x00, 0x2A, 0x08, 0x00, 0x48, 0x32, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x18, 0x00, 0x08, 0x60, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CC2, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x54, 0x42, 0x00, 0x55, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x18, 0x42, 0x00, 0x34, 0x42, 0x00, 0x33, 0xFF, 0x80, 0x50, 0xA4, 0x00, 0x50, 0xA4, 0x00, 0x10, 0xC7, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CC4, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x4A, 0x7C, 0x00, 0x6A, 0x40, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x28, 0xFF, 0x00, 0x48, 0xD5, 0x00, 0x09, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CC5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x02, 0x00, 0x10, 0x2C, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x29, 0x00, 0x10, 0x4A, 0x00, 0x39, 0x98, 0x00, 0x34, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x50, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CC7, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x54, 0xBF, 0x00, 0x54, 0x81, 0x00, 0x11, 0x81, 0x00, 0x11, 0x7F, 0x80, 0x7D, 0x20, 0x00, 0x13, 0x20, 0x00, 0x11, 0x7F, 0x00, 0x39, 0x88, 0x00, 0x35, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x51, 0x08, 0x00, 0x11, 0x1C, 0x00, 0x11, 0x14, 0x00, 0x11, 0x36, 0x00, 0x11, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CC8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x08, 0x80, 0x2A, 0x4F, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x68, 0x00, 0x08, 0xDF, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CC9, { 0x00, 0x00, 0x00, 0x08, 0x81, 0x00, 0x4A, 0xA5, 0x00, 0x6A, 0x99, 0x00, 0x2A, 0xA5, 0x00, 0x08, 0x81, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x1D, 0xA3, 0x80, 0x1A, 0x7E, 0x00, 0x2A, 0xC2, 0x00, 0x29, 0xA6, 0x00, 0x48, 0x2C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x76, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CCA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x2A, 0x47, 0x80, 0x2A, 0x44, 0x80, 0x2B, 0xFC, 0x80, 0x08, 0x44, 0x80, 0x3E, 0x47, 0x80, 0x08, 0x44, 0x80, 0x1C, 0x44, 0x80, 0x1B, 0xF4, 0x80, 0x39, 0x17, 0x80, 0x29, 0x14, 0x80, 0x29, 0x14, 0x80, 0x29, 0x14, 0x80, 0x29, 0x14, 0x80, 0x09, 0xF8, 0x80, 0x09, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CCC, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x4A, 0xE8, 0x00, 0x2A, 0xAC, 0x00, 0x2D, 0x2A, 0x00, 0x08, 0xA8, 0x00, 0x7F, 0x48, 0x00, 0x18, 0xAB, 0x00, 0x1D, 0x1E, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0xFE, 0x00, 0x48, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CCD, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x4A, 0x66, 0x00, 0x6A, 0x24, 0x00, 0x2B, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1D, 0x29, 0x00, 0x1A, 0xA5, 0x00, 0x2A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x48, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x09, 0xEF, 0x80, 0x09, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CCE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x55, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x7D, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x39, 0x49, 0x00, 0x35, 0x7F, 0x00, 0x51, 0x08, 0x00, 0x51, 0x08, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x16, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CCF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x11, 0x00, 0x80, 0x11, 0xFF, 0x80, 0x7D, 0x08, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x49, 0x00, 0x39, 0x7F, 0x00, 0x35, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x51, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x13, 0x41, 0x00, 0x12, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CD2, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x54, 0x44, 0x00, 0x55, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x39, 0x49, 0x00, 0x35, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x51, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x12, 0x49, 0x00, 0x10, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CD3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x23, 0x80, 0x7F, 0x80, 0x00, 0x40, 0xBF, 0x00, 0x5E, 0x91, 0x00, 0x04, 0x11, 0x00, 0x24, 0x9B, 0x00, 0x15, 0x0E, 0x00, 0x7F, 0x84, 0x00, 0x15, 0x0E, 0x00, 0x35, 0x9B, 0x00, 0x24, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CD4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x00, 0x6A, 0x51, 0x00, 0x2A, 0x4A, 0x00, 0x08, 0xA4, 0x00, 0x7E, 0x98, 0x00, 0x08, 0x6E, 0x00, 0x09, 0x83, 0x80, 0x1C, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x08, 0x11, 0x00, 0x08, 0x1F, 0x80, 0x08, 0xF0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CD5, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x4A, 0xC6, 0x00, 0x6A, 0x44, 0x00, 0x2A, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x1A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x48, 0x00, 0x00, 0x09, 0x49, 0x00, 0x0B, 0x6D, 0x80, 0x0A, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CD6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x89, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x89, 0x00, 0x1C, 0xFF, 0x00, 0x3A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CD7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x12, 0x00, 0x2A, 0x11, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x24, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CD8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x10, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x51, 0x00, 0x39, 0x93, 0x00, 0x34, 0x2A, 0x00, 0x54, 0x48, 0x00, 0x51, 0x9C, 0x00, 0x10, 0x2A, 0x00, 0x10, 0x4B, 0x00, 0x11, 0x89, 0x80, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CD9, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x55, 0x24, 0x00, 0x55, 0xA4, 0x00, 0x10, 0xBF, 0x00, 0x11, 0x24, 0x00, 0x7D, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x10, 0x04, 0x00, 0x3B, 0x80, 0x00, 0x34, 0x9F, 0x00, 0x54, 0x91, 0x00, 0x50, 0x91, 0x00, 0x10, 0x91, 0x00, 0x11, 0x9F, 0x00, 0x11, 0x40, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CDA, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x54, 0x44, 0x00, 0x57, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x10, 0x00, 0x00, 0x7C, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x39, 0x7F, 0x80, 0x35, 0xC4, 0x00, 0x54, 0x44, 0x00, 0x53, 0xC4, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x12, 0x5F, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CDC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x25, 0x55, 0x00, 0x29, 0x55, 0x80, 0x20, 0x00, 0x00, 0x22, 0x22, 0x00, 0x21, 0x24, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0xA8, 0x00, 0x21, 0xAC, 0x00, 0x43, 0x26, 0x00, 0x0E, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CDD, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x54, 0x44, 0x00, 0x54, 0x7C, 0x00, 0x10, 0x82, 0x00, 0x11, 0x24, 0x80, 0x7D, 0xE7, 0x80, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x38, 0xC6, 0x00, 0x35, 0x93, 0x80, 0x54, 0x20, 0x00, 0x50, 0xC8, 0x00, 0x10, 0x33, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CDE, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CDF, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x25, 0x7F, 0x80, 0x15, 0x12, 0x00, 0x15, 0x7F, 0x80, 0x04, 0x52, 0x80, 0x3F, 0xFF, 0x80, 0x04, 0x52, 0x80, 0x0C, 0x7F, 0x80, 0x0E, 0x00, 0x00, 0x15, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CE0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x00, 0x2A, 0xBE, 0x00, 0x08, 0x8A, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x8A, 0x00, 0x1C, 0xBE, 0x00, 0x1A, 0xC9, 0x00, 0x18, 0xAA, 0x00, 0x28, 0x9C, 0x00, 0x28, 0x9C, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x29, 0x00, 0x0A, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CE2, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x4A, 0x24, 0x00, 0x6B, 0xFF, 0x80, 0x2A, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x24, 0x00, 0x08, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CE6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CE7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x1C, 0x7F, 0x00, 0x3A, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CE8, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x17, 0xBF, 0x00, 0x10, 0xA2, 0x00, 0x54, 0xA2, 0x00, 0x38, 0xBE, 0x00, 0x13, 0x88, 0x00, 0x7E, 0x0A, 0x00, 0x12, 0x3F, 0x00, 0x3B, 0xAA, 0x00, 0x34, 0xAA, 0x00, 0x54, 0xBE, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8A, 0x00, 0x15, 0x7F, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CE9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x54, 0x28, 0x00, 0x54, 0xC6, 0x00, 0x13, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x55, 0x00, 0x39, 0x11, 0x00, 0x35, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x50, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CEB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x14, 0x80, 0x48, 0x35, 0x00, 0x08, 0xE6, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CEF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x7E, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x18, 0xD6, 0x00, 0x34, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x50, 0x20, 0x00, 0x51, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CF2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x7D, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x39, 0x49, 0x00, 0x35, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x51, 0x7F, 0x80, 0x11, 0x4A, 0x80, 0x11, 0x4E, 0x80, 0x12, 0x5A, 0x80, 0x10, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xF7, 0x80, 0x08, 0x52, 0x80, 0x08, 0xB5, 0x80, 0x1C, 0x52, 0x80, 0x36, 0x94, 0x80, 0x63, 0x12, 0x00, 0x08, 0x24, 0x00, 0x2A, 0x7F, 0x80, 0x08, 0xC8, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x1C, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x49, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CF5, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x14, 0x00, 0x20, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x3E, 0x00, 0x3F, 0x88, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CF6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x2A, 0xF7, 0x80, 0x3E, 0x52, 0x80, 0x08, 0xB5, 0x80, 0x2A, 0x52, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0x12, 0x00, 0x00, 0x24, 0x00, 0x2A, 0x7F, 0x80, 0x08, 0xC8, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x1C, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x49, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7CF8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x08, 0x00, 0x06, 0x18, 0x00, 0x18, 0x30, 0x00, 0x0C, 0x62, 0x00, 0x06, 0xC3, 0x00, 0x01, 0x81, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x18, 0x86, 0x00, 0x30, 0x83, 0x00, 0x60, 0x81, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CFA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x30, 0x20, 0x00, 0x62, 0x20, 0x00, 0x36, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x18, 0x20, 0x00, 0x32, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x09, 0x20, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2B, 0x20, 0x00, 0x69, 0x20, 0x80, 0x48, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CFB, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x44, 0x00, 0x08, 0x88, 0x00, 0x05, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x42, 0x00, 0x00, 0x9F, 0x00, 0x3F, 0xE0, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7CFE, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x12, 0x24, 0x00, 0x22, 0x24, 0x00, 0x14, 0x24, 0x00, 0x08, 0x24, 0x00, 0x12, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x27, 0x80, 0x2A, 0xFC, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x28, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D00, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x12, 0x01, 0x00, 0x22, 0x01, 0x00, 0x14, 0x01, 0x00, 0x08, 0x01, 0x00, 0x11, 0x3F, 0x00, 0x3F, 0xA0, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x80, 0x2A, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D02, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x12, 0x04, 0x00, 0x22, 0x04, 0x00, 0x14, 0x7F, 0x80, 0x08, 0x04, 0x00, 0x12, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x09, 0x24, 0x00, 0x08, 0x14, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D03, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x18, 0x49, 0x00, 0x30, 0x49, 0x00, 0x62, 0x49, 0x00, 0x36, 0x49, 0x00, 0x0C, 0x49, 0x00, 0x18, 0x49, 0x00, 0x32, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x09, 0x49, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x6A, 0xC1, 0x00, 0x48, 0x81, 0x00, 0x09, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D04, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x10, 0x00, 0x22, 0x20, 0x00, 0x14, 0x3F, 0x80, 0x08, 0x40, 0x80, 0x12, 0x40, 0x80, 0x3F, 0x90, 0x80, 0x09, 0x08, 0x80, 0x08, 0x04, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D05, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x14, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D06, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x14, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x08, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D07, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x12, 0x40, 0x00, 0x22, 0xFF, 0x80, 0x15, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x06, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D08, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x12, 0x20, 0x00, 0x22, 0xFC, 0x00, 0x14, 0x24, 0x00, 0x08, 0x24, 0x00, 0x12, 0x24, 0x00, 0x3F, 0x64, 0x00, 0x09, 0x34, 0x00, 0x08, 0x2C, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x44, 0x80, 0x2A, 0x44, 0x80, 0x08, 0x87, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D09, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x30, 0x08, 0x80, 0x62, 0x08, 0x80, 0x36, 0x28, 0x80, 0x0C, 0x28, 0x80, 0x18, 0x68, 0x80, 0x32, 0x48, 0x80, 0x7E, 0xD8, 0x80, 0x0A, 0x90, 0x80, 0x08, 0x30, 0x80, 0x2A, 0x20, 0x80, 0x2A, 0x61, 0x80, 0x6A, 0x41, 0x00, 0x48, 0xC1, 0x00, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D0A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x98, 0x00, 0x3C, 0x87, 0x80, 0x03, 0x10, 0x00, 0x01, 0x22, 0x00, 0x00, 0xDF, 0x00, 0x3F, 0xE0, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D0B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x18, 0x41, 0x00, 0x0A, 0x42, 0x00, 0x11, 0x22, 0x00, 0x3F, 0x24, 0x00, 0x09, 0x14, 0x00, 0x08, 0x18, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D0D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x88, 0x80, 0x08, 0x88, 0x80, 0x12, 0x88, 0x80, 0x27, 0x88, 0x80, 0x39, 0x94, 0x80, 0x08, 0x92, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xC0, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D0F, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x18, 0x32, 0x00, 0x30, 0x1A, 0x00, 0x62, 0x0A, 0x00, 0x36, 0x02, 0x00, 0x0C, 0x62, 0x00, 0x18, 0x32, 0x00, 0x32, 0x12, 0x00, 0x7F, 0x02, 0x00, 0x09, 0x03, 0x80, 0x08, 0x1E, 0x00, 0x2A, 0xF2, 0x00, 0x2B, 0x02, 0x00, 0x69, 0x02, 0x00, 0x48, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D10, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x11, 0x00, 0x22, 0x11, 0x00, 0x14, 0x11, 0x00, 0x08, 0x11, 0x00, 0x12, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x08, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D11, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x30, 0x08, 0x00, 0x62, 0x08, 0x00, 0x36, 0x18, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x34, 0x00, 0x32, 0x76, 0x00, 0x7E, 0xD3, 0x00, 0x0A, 0x91, 0x80, 0x08, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0x10, 0x00, 0x69, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D12, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x1C, 0x00, 0x30, 0x14, 0x00, 0x62, 0x36, 0x00, 0x36, 0x63, 0x00, 0x0C, 0xE3, 0x80, 0x19, 0xA2, 0x80, 0x32, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x62, 0x00, 0x6A, 0x42, 0x00, 0x48, 0xC2, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D13, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x01, 0x00, 0x62, 0x32, 0x00, 0x36, 0x1C, 0x00, 0x0C, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x08, 0x80, 0x7F, 0x09, 0x80, 0x09, 0x09, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2B, 0x08, 0x00, 0x69, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D14, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x1F, 0x00, 0x22, 0xF0, 0x00, 0x14, 0x10, 0x00, 0x08, 0x92, 0x00, 0x12, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x09, 0x92, 0x00, 0x08, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D15, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x18, 0x88, 0x00, 0x30, 0x88, 0x00, 0x62, 0x89, 0x00, 0x36, 0x8B, 0x00, 0x0C, 0xEE, 0x00, 0x18, 0x88, 0x00, 0x32, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x08, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0x88, 0x80, 0x48, 0xE9, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D16, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x19, 0xF1, 0x00, 0x10, 0x11, 0x00, 0x64, 0x11, 0x00, 0x2C, 0x11, 0x00, 0x19, 0xF1, 0x00, 0x11, 0x01, 0x00, 0x25, 0x01, 0x00, 0x7D, 0x01, 0x00, 0x15, 0xF1, 0x00, 0x10, 0x11, 0x00, 0x54, 0x11, 0x00, 0x54, 0x31, 0x00, 0x54, 0x21, 0x00, 0x10, 0x61, 0x00, 0x11, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D17, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x29, 0x00, 0x14, 0x29, 0x00, 0x08, 0x48, 0x80, 0x12, 0x48, 0x80, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x80, 0x08, 0x19, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D18, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x15, 0xFF, 0x80, 0x24, 0x40, 0x00, 0x18, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x13, 0x48, 0x00, 0x3D, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x90, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA1, 0x00, 0x29, 0x2F, 0x00, 0x09, 0x70, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D19, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0xF8, 0x00, 0x12, 0x88, 0x00, 0x22, 0x88, 0x00, 0x14, 0x88, 0x00, 0x08, 0x88, 0x00, 0x12, 0xFF, 0x00, 0x3F, 0x88, 0x00, 0x09, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xF4, 0x80, 0x0B, 0x82, 0x80, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D1A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x14, 0x24, 0x00, 0x08, 0x24, 0x00, 0x12, 0x27, 0x00, 0x3F, 0x21, 0x00, 0x09, 0x61, 0x00, 0x0A, 0x51, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x84, 0x00, 0x28, 0x8A, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D1B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x1C, 0x41, 0x00, 0x08, 0x81, 0x00, 0x12, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x42, 0x00, 0x08, 0x84, 0x00, 0x0B, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D1C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x00, 0x00, 0x62, 0x00, 0x00, 0x36, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x09, 0x10, 0x00, 0x08, 0x32, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0x23, 0x00, 0x69, 0x21, 0x00, 0x48, 0x2F, 0x00, 0x08, 0x79, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D1D, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x18, 0x0E, 0x00, 0x30, 0x78, 0x00, 0x62, 0x08, 0x00, 0x36, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2B, 0x08, 0x00, 0x69, 0x08, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D1E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x62, 0xFF, 0x00, 0x36, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x18, 0x91, 0x00, 0x32, 0x10, 0x00, 0x7E, 0x38, 0x00, 0x0A, 0x28, 0x00, 0x08, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x68, 0x00, 0x6A, 0x48, 0x80, 0x48, 0xCD, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D20, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x90, 0x00, 0x05, 0x10, 0x00, 0x02, 0x22, 0x00, 0x01, 0x5F, 0x00, 0x3F, 0xE0, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D21, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x12, 0x20, 0x00, 0x23, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x18, 0x20, 0x00, 0x12, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D22, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x48, 0x80, 0x24, 0x88, 0x80, 0x03, 0x10, 0x00, 0x01, 0x21, 0x00, 0x00, 0xDF, 0x80, 0x3F, 0xE0, 0x80, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D23, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x30, 0xFC, 0x00, 0x62, 0x24, 0x00, 0x36, 0x24, 0x00, 0x0C, 0x64, 0x80, 0x18, 0x44, 0x80, 0x32, 0xC3, 0x80, 0x7E, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D26, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x91, 0x00, 0x62, 0x91, 0x00, 0x36, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x18, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x7E, 0x80, 0x00, 0x0A, 0x80, 0x00, 0x08, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x80, 0x6A, 0xC1, 0x80, 0x48, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D27, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0xFC, 0x00, 0x12, 0x88, 0x00, 0x12, 0x50, 0x00, 0x12, 0x20, 0x00, 0x12, 0x58, 0x00, 0x03, 0x87, 0x00, 0x02, 0x12, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x31, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D2A, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x18, 0x48, 0x00, 0x10, 0x48, 0x00, 0x65, 0x48, 0x00, 0x2D, 0x48, 0x00, 0x19, 0x48, 0x00, 0x11, 0x79, 0x80, 0x25, 0x4F, 0x00, 0x7D, 0x48, 0x00, 0x15, 0x48, 0x00, 0x11, 0x48, 0x00, 0x55, 0x48, 0x00, 0x55, 0x48, 0x00, 0x55, 0x78, 0x80, 0x11, 0xCD, 0x80, 0x13, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D2B, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x12, 0x23, 0x80, 0x12, 0x3C, 0x00, 0x13, 0xE0, 0x00, 0x12, 0x20, 0x80, 0x17, 0xFF, 0x80, 0x38, 0x80, 0x00, 0x00, 0x90, 0x00, 0x05, 0x10, 0x00, 0x02, 0x22, 0x00, 0x01, 0x4F, 0x00, 0x3F, 0xF0, 0x80, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D2C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x09, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D2D, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x19, 0xE2, 0x00, 0x10, 0x22, 0x00, 0x64, 0x22, 0x00, 0x2C, 0x22, 0x00, 0x19, 0xE6, 0x00, 0x11, 0x04, 0x00, 0x25, 0x04, 0x00, 0x7D, 0x04, 0x00, 0x15, 0xE5, 0x00, 0x10, 0x25, 0x00, 0x54, 0x2D, 0x00, 0x54, 0x69, 0x00, 0x54, 0x49, 0x00, 0x10, 0xCF, 0x80, 0x11, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D2E, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x0E, 0x20, 0x80, 0x15, 0x20, 0x80, 0x24, 0xBF, 0x80, 0x04, 0x00, 0x00, 0x01, 0x10, 0x00, 0x05, 0x10, 0x00, 0x02, 0x22, 0x00, 0x01, 0x41, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x80, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x09, 0x10, 0x00, 0x06, 0x21, 0x00, 0x02, 0x5F, 0x00, 0x3F, 0xE0, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D30, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x24, 0x49, 0x00, 0x14, 0x49, 0x00, 0x08, 0x49, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D31, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x18, 0x26, 0x00, 0x10, 0x22, 0x00, 0x65, 0xFF, 0x80, 0x2C, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0x22, 0x00, 0x24, 0x72, 0x00, 0x7C, 0x56, 0x00, 0x14, 0xD4, 0x00, 0x10, 0x9C, 0x00, 0x55, 0x88, 0x00, 0x54, 0x1C, 0x00, 0x54, 0x36, 0x00, 0x10, 0x63, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D32, { 0x00, 0x00, 0x00, 0x08, 0x4A, 0x00, 0x18, 0x4A, 0x00, 0x30, 0x4A, 0x00, 0x62, 0x4A, 0x00, 0x36, 0xFF, 0x80, 0x0C, 0x4A, 0x00, 0x18, 0x4A, 0x00, 0x32, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x08, 0x4E, 0x00, 0x2A, 0x40, 0x00, 0x2B, 0x40, 0x00, 0x69, 0x40, 0x00, 0x48, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D33, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x12, 0x04, 0x00, 0x22, 0x3F, 0x80, 0x14, 0x24, 0x80, 0x09, 0x24, 0x80, 0x17, 0xA4, 0x80, 0x3C, 0xBF, 0x80, 0x04, 0x24, 0x80, 0x15, 0x24, 0x80, 0x15, 0x24, 0x80, 0x25, 0x3F, 0x80, 0x25, 0x24, 0x80, 0x25, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D35, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D39, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x22, 0x11, 0x00, 0x14, 0x21, 0x00, 0x08, 0x21, 0x00, 0x12, 0x42, 0x00, 0x3F, 0x8C, 0x00, 0x09, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D3A, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x08, 0x22, 0x00, 0x32, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x0C, 0x22, 0x00, 0x08, 0x22, 0x00, 0x12, 0x22, 0x00, 0x3D, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D3C, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x18, 0x48, 0x00, 0x11, 0xFF, 0x00, 0x64, 0x49, 0x00, 0x2C, 0x49, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x48, 0x00, 0x25, 0x48, 0x00, 0x7D, 0xFF, 0x80, 0x14, 0x48, 0x80, 0x10, 0x48, 0x80, 0x54, 0x49, 0x80, 0x54, 0xC9, 0x00, 0x54, 0x8B, 0x00, 0x11, 0x88, 0x00, 0x13, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D3D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x80, 0x80, 0x0C, 0x80, 0x80, 0x18, 0x20, 0x00, 0x32, 0x23, 0x00, 0x7E, 0x2E, 0x00, 0x0A, 0x38, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x6A, 0x20, 0x80, 0x48, 0x31, 0x80, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D3E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x1C, 0x00, 0x30, 0x14, 0x00, 0x62, 0x36, 0x00, 0x36, 0x63, 0x00, 0x0C, 0xC9, 0x80, 0x18, 0x18, 0x00, 0x32, 0x32, 0x00, 0x7F, 0x66, 0x00, 0x09, 0x0C, 0x00, 0x08, 0x18, 0x80, 0x2A, 0x71, 0x80, 0x2B, 0x03, 0x00, 0x69, 0x06, 0x00, 0x48, 0x1C, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D3F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x30, 0x00, 0x62, 0x21, 0x00, 0x36, 0x61, 0x00, 0x0C, 0x4F, 0x80, 0x18, 0xF8, 0x80, 0x32, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2B, 0x41, 0x00, 0x69, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D40, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x88, 0x80, 0x30, 0x88, 0x80, 0x62, 0x88, 0x80, 0x36, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x18, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0x88, 0x80, 0x08, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x6A, 0x88, 0x80, 0x48, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D41, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x30, 0x40, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x80, 0x00, 0x0D, 0x08, 0x00, 0x18, 0x4B, 0x00, 0x32, 0x4D, 0x00, 0x7E, 0x59, 0x00, 0x0A, 0x69, 0x00, 0x08, 0xCB, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x6A, 0x40, 0x80, 0x48, 0x61, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D42, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x42, 0x00, 0x14, 0xA4, 0x00, 0x09, 0x18, 0x00, 0x12, 0x08, 0x00, 0x3F, 0x16, 0x00, 0x09, 0x21, 0x80, 0x08, 0xC8, 0x00, 0x08, 0x04, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x30, 0x00, 0x2A, 0x0C, 0x00, 0x2A, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D43, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x20, 0x00, 0x3F, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x08, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x9F, 0x80, 0x09, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D44, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x25, 0x42, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x0D, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x05, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D45, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x08, 0x20, 0x80, 0x32, 0x20, 0x80, 0x12, 0x20, 0x80, 0x0C, 0x2E, 0x80, 0x09, 0x2A, 0x80, 0x11, 0x2A, 0x80, 0x3E, 0xAA, 0x80, 0x04, 0x2A, 0x80, 0x15, 0x2E, 0x80, 0x15, 0x20, 0x80, 0x25, 0x20, 0x80, 0x25, 0x20, 0x80, 0x24, 0x20, 0x80, 0x04, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D46, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x2A, 0x00, 0x22, 0x49, 0x00, 0x14, 0x88, 0x80, 0x08, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D47, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x20, 0x00, 0x30, 0x20, 0x00, 0x62, 0x7F, 0x80, 0x36, 0x40, 0x80, 0x0C, 0xC0, 0x80, 0x18, 0x3C, 0x80, 0x32, 0x24, 0x80, 0x7F, 0x24, 0x80, 0x09, 0x24, 0x80, 0x08, 0x24, 0x80, 0x2A, 0x3C, 0x80, 0x2B, 0x00, 0x80, 0x69, 0x01, 0x80, 0x48, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D48, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x30, 0x10, 0x00, 0x62, 0x7F, 0x00, 0x36, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x18, 0x41, 0x00, 0x32, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2B, 0x41, 0x00, 0x69, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D4B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x80, 0x00, 0x0C, 0x80, 0x00, 0x18, 0x88, 0x00, 0x32, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x0A, 0x98, 0x00, 0x08, 0x90, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xB3, 0x00, 0x6A, 0xA1, 0x00, 0x49, 0x2F, 0x80, 0x08, 0x78, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D4C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x41, 0x00, 0x62, 0x63, 0x00, 0x36, 0x36, 0x00, 0x0C, 0x1C, 0x00, 0x18, 0x36, 0x00, 0x32, 0xE3, 0x80, 0x7F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D4D, { 0x00, 0x00, 0x00, 0x08, 0x43, 0x00, 0x18, 0x46, 0x00, 0x10, 0x5C, 0x00, 0x64, 0xC4, 0x00, 0x2C, 0x84, 0x00, 0x19, 0x84, 0x00, 0x12, 0x84, 0x00, 0x24, 0xBF, 0x80, 0x7C, 0x84, 0x00, 0x14, 0x84, 0x00, 0x10, 0x84, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D4E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x6F, 0x00, 0x10, 0x40, 0x00, 0x64, 0xC0, 0x00, 0x2D, 0x80, 0x00, 0x18, 0x20, 0x00, 0x10, 0x7F, 0x80, 0x24, 0x42, 0x00, 0x7C, 0xC2, 0x00, 0x15, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D4F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0xFF, 0x00, 0x62, 0x91, 0x00, 0x36, 0x91, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x32, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x0A, 0x10, 0x80, 0x08, 0x19, 0x80, 0x2A, 0x0B, 0x00, 0x2B, 0x0E, 0x00, 0x69, 0x1C, 0x80, 0x48, 0x76, 0x80, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D50, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x18, 0x08, 0x00, 0x12, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x29, 0x41, 0x00, 0x29, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D51, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x28, 0x00, 0x30, 0x28, 0x00, 0x62, 0x7F, 0x00, 0x36, 0x48, 0x00, 0x0C, 0xC8, 0x00, 0x18, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x7E, 0x2A, 0x00, 0x0A, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x2A, 0x6B, 0x00, 0x2A, 0x49, 0x00, 0x6A, 0xC9, 0x80, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D53, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x7F, 0x00, 0x62, 0x08, 0x00, 0x36, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D56, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x91, 0x00, 0x30, 0xD3, 0x00, 0x62, 0x52, 0x00, 0x36, 0x52, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x32, 0xFF, 0x80, 0x7F, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2B, 0x24, 0x00, 0x69, 0x64, 0x80, 0x48, 0x44, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D57, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x81, 0x00, 0x62, 0x81, 0x00, 0x36, 0x81, 0x00, 0x0C, 0xBD, 0x00, 0x18, 0xA5, 0x00, 0x32, 0xA5, 0x00, 0x7E, 0xA5, 0x00, 0x0A, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x2A, 0xBD, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D59, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x62, 0x00, 0x00, 0x36, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x18, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x08, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D5A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x40, 0x00, 0x62, 0x40, 0x00, 0x36, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x18, 0x52, 0x00, 0x32, 0x4A, 0x00, 0x7E, 0x42, 0x00, 0x0A, 0x52, 0x00, 0x08, 0x4A, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x02, 0x00, 0x6A, 0x02, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D5B, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0xFF, 0x80, 0x09, 0x84, 0x00, 0x18, 0x6C, 0x00, 0x14, 0x38, 0x00, 0x34, 0xEE, 0x00, 0x57, 0x83, 0x80, 0x14, 0x20, 0x00, 0x14, 0xC8, 0x00, 0x14, 0x51, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x10, 0x80, 0x14, 0x54, 0x00, 0x10, 0xD6, 0x00, 0x13, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D5C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x3F, 0x00, 0x07, 0x89, 0x00, 0x3C, 0x09, 0x00, 0x04, 0x19, 0x00, 0x07, 0x91, 0x00, 0x7C, 0x33, 0x00, 0x04, 0x86, 0x00, 0x01, 0x10, 0x00, 0x06, 0x20, 0x00, 0x02, 0x41, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D5D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x14, 0x00, 0x36, 0x22, 0x00, 0x0C, 0xC1, 0x80, 0x18, 0x3E, 0x00, 0x32, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x01, 0x00, 0x6A, 0x01, 0x00, 0x48, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D5E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x08, 0x41, 0x00, 0x12, 0xA2, 0x80, 0x26, 0x22, 0x00, 0x39, 0x24, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x18, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x24, 0x00, 0x28, 0x42, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D61, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x14, 0xC2, 0x00, 0x09, 0x24, 0x00, 0x12, 0x18, 0x00, 0x3F, 0x16, 0x00, 0x09, 0x21, 0x80, 0x08, 0xC0, 0x00, 0x29, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D62, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x20, 0x00, 0x22, 0x3F, 0x80, 0x14, 0x40, 0x80, 0x08, 0x80, 0x80, 0x12, 0x3C, 0x80, 0x3F, 0x24, 0x80, 0x09, 0x3C, 0x80, 0x08, 0x24, 0x80, 0x2A, 0x3C, 0x80, 0x2A, 0x24, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0x00, 0x80, 0x08, 0x01, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D63, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x18, 0x63, 0x00, 0x30, 0x22, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x22, 0x00, 0x0C, 0x22, 0x00, 0x18, 0x22, 0x00, 0x32, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x22, 0x00, 0x08, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2B, 0x22, 0x00, 0x69, 0x62, 0x00, 0x48, 0x42, 0x00, 0x08, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D65, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x18, 0x45, 0x00, 0x10, 0x45, 0x80, 0x64, 0xC4, 0x80, 0x2C, 0x84, 0x00, 0x19, 0xBF, 0x80, 0x12, 0x84, 0x00, 0x24, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x14, 0x8E, 0x00, 0x10, 0x8A, 0x00, 0x54, 0x8A, 0x00, 0x54, 0x8A, 0x00, 0x54, 0x9B, 0x00, 0x10, 0x91, 0x00, 0x10, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D66, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x14, 0x00, 0x22, 0x22, 0x00, 0x14, 0x41, 0x00, 0x08, 0x80, 0x80, 0x12, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D67, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x81, 0x00, 0x62, 0x81, 0x00, 0x36, 0xBD, 0x00, 0x0C, 0x81, 0x00, 0x18, 0x81, 0x00, 0x32, 0xBD, 0x00, 0x7E, 0xA5, 0x00, 0x0A, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x2A, 0xBD, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D68, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x09, 0x4A, 0x00, 0x09, 0xFA, 0x00, 0x2A, 0x4C, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x4C, 0x00, 0x2A, 0x8A, 0x80, 0x08, 0x91, 0x80, 0x09, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D6A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x22, 0x88, 0x80, 0x14, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x09, 0x94, 0x80, 0x08, 0x94, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xC1, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D6E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x2C, 0x21, 0x00, 0x26, 0x3F, 0x00, 0x09, 0x40, 0x00, 0x14, 0x88, 0x00, 0x23, 0x10, 0x00, 0x01, 0x21, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0x40, 0x80, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D70, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x20, 0x00, 0x62, 0x62, 0x00, 0x36, 0x42, 0x00, 0x0C, 0x4F, 0x00, 0x18, 0xF9, 0x00, 0x32, 0x00, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D71, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x10, 0x00, 0x08, 0x22, 0x00, 0x12, 0x4F, 0x00, 0x3F, 0xB4, 0x80, 0x09, 0x24, 0x00, 0x08, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x44, 0x80, 0x2A, 0x44, 0x80, 0x08, 0x87, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D72, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x09, 0x12, 0x00, 0x31, 0x62, 0x00, 0x12, 0x24, 0x00, 0x0C, 0x18, 0x00, 0x09, 0x11, 0x00, 0x17, 0xA7, 0x80, 0x3C, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x15, 0x15, 0x00, 0x15, 0x15, 0x00, 0x15, 0x15, 0x00, 0x25, 0x25, 0x00, 0x25, 0x25, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D73, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x32, 0x62, 0x00, 0x12, 0x94, 0x00, 0x0D, 0x18, 0x00, 0x08, 0x26, 0x00, 0x12, 0xC5, 0x80, 0x3F, 0x04, 0x00, 0x09, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D75, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x38, 0x00, 0x30, 0x2C, 0x00, 0x62, 0x66, 0x00, 0x36, 0xC3, 0x00, 0x0D, 0x81, 0x80, 0x18, 0x7E, 0x00, 0x32, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x62, 0x00, 0x6A, 0x42, 0x00, 0x48, 0x5F, 0x00, 0x08, 0xF1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D76, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x12, 0x7E, 0x00, 0x22, 0x44, 0x00, 0x14, 0x88, 0x00, 0x09, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x09, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D77, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x7F, 0x7E, 0x00, 0x04, 0x24, 0x00, 0x1F, 0x64, 0x00, 0x64, 0x35, 0x00, 0x14, 0xC5, 0x00, 0x09, 0x13, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x10, 0x84, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D78, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x62, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x18, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x64, 0x80, 0x48, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D79, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x22, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x11, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0xC1, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x29, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D7A, { 0x00, 0x00, 0x00, 0x08, 0x62, 0x00, 0x18, 0x36, 0x00, 0x30, 0x1C, 0x00, 0x62, 0x36, 0x00, 0x36, 0xE3, 0x00, 0x0C, 0x10, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x20, 0x00, 0x7E, 0x48, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x48, 0x4B, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D7B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x3E, 0x00, 0x30, 0x22, 0x00, 0x62, 0x66, 0x00, 0x36, 0xC4, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x49, 0x00, 0x32, 0x49, 0x00, 0x7E, 0x59, 0x00, 0x0A, 0x7F, 0x00, 0x08, 0x14, 0x00, 0x2A, 0x34, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x64, 0x80, 0x48, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D7D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x62, 0x41, 0x00, 0x36, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x32, 0x08, 0x00, 0x7F, 0x18, 0x00, 0x09, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2B, 0x41, 0x00, 0x69, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D7F, { 0x00, 0x00, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x09, 0x00, 0x08, 0x08, 0x00, 0x32, 0x08, 0x00, 0x12, 0x7F, 0x80, 0x0C, 0x08, 0x00, 0x09, 0x49, 0x00, 0x13, 0x2A, 0x00, 0x3C, 0x9C, 0x00, 0x04, 0x0C, 0x00, 0x15, 0x0A, 0x00, 0x15, 0x1A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x49, 0x00, 0x04, 0x89, 0x00, 0x04, 0x38, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D81, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x4F, 0x80, 0x11, 0xE8, 0x80, 0x64, 0x49, 0x80, 0x2C, 0x49, 0x00, 0x19, 0xEB, 0x00, 0x10, 0x4A, 0x00, 0x24, 0x49, 0x00, 0x7C, 0x48, 0x80, 0x15, 0xF8, 0x80, 0x10, 0x48, 0x80, 0x54, 0x48, 0x80, 0x54, 0xCB, 0x80, 0x54, 0x88, 0x00, 0x11, 0x88, 0x00, 0x13, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D82, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x31, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x36, 0x00, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x32, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x64, 0x00, 0x6A, 0x44, 0x80, 0x48, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D83, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x49, 0x00, 0x30, 0xC9, 0x80, 0x62, 0x88, 0x80, 0x36, 0x08, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x32, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2B, 0x41, 0x00, 0x69, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D85, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x30, 0x02, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x02, 0x00, 0x0C, 0x7E, 0x00, 0x18, 0x00, 0x00, 0x32, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x0A, 0xFE, 0x80, 0x08, 0x22, 0x00, 0x2A, 0x36, 0x00, 0x2A, 0x1C, 0x00, 0x6A, 0x08, 0x00, 0x48, 0x3E, 0x00, 0x08, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D86, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x62, 0xFF, 0x00, 0x36, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x18, 0xFF, 0x00, 0x32, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x50, 0x00, 0x6A, 0x38, 0x00, 0x48, 0x6E, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D88, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x18, 0x24, 0x00, 0x30, 0xFF, 0x00, 0x62, 0x11, 0x00, 0x36, 0x11, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x90, 0x00, 0x32, 0x90, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x30, 0x80, 0x08, 0x30, 0x80, 0x2A, 0x51, 0x80, 0x2A, 0xD1, 0x00, 0x6A, 0x97, 0x00, 0x49, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D89, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x18, 0x0E, 0x00, 0x30, 0x78, 0x00, 0x62, 0x08, 0x00, 0x36, 0xFF, 0x80, 0x0C, 0x2A, 0x00, 0x18, 0x6B, 0x00, 0x32, 0xC9, 0x80, 0x7F, 0x00, 0x00, 0x09, 0x7E, 0x00, 0x08, 0x12, 0x00, 0x2A, 0x13, 0x80, 0x2B, 0x30, 0x80, 0x69, 0x20, 0x80, 0x48, 0x60, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D8B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0xFF, 0x00, 0x62, 0x81, 0x00, 0x36, 0x91, 0x00, 0x0C, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x32, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x0A, 0x68, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x58, 0x00, 0x2A, 0xD2, 0x00, 0x6A, 0xB2, 0x00, 0x49, 0xA7, 0x00, 0x08, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D8C, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x18, 0x22, 0x00, 0x30, 0x63, 0x00, 0x62, 0xC1, 0x80, 0x36, 0x08, 0x00, 0x0C, 0x1C, 0x00, 0x18, 0x36, 0x00, 0x32, 0x63, 0x00, 0x7E, 0xC1, 0x80, 0x0A, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D8D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x31, 0xFF, 0x80, 0x62, 0x10, 0x00, 0x36, 0x10, 0x00, 0x0C, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x32, 0x81, 0x00, 0x7E, 0x7E, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D8E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF1, 0x80, 0x12, 0x1E, 0x00, 0x22, 0x22, 0x00, 0x14, 0x22, 0x00, 0x08, 0x42, 0x00, 0x12, 0xF2, 0x00, 0x3F, 0x1F, 0x80, 0x0A, 0x12, 0x00, 0x08, 0x92, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0x62, 0x00, 0x2A, 0x4F, 0x80, 0x2A, 0x60, 0x00, 0x08, 0x9F, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D8F, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x38, 0x00, 0x12, 0x49, 0x00, 0x22, 0x44, 0x80, 0x14, 0x84, 0x80, 0x08, 0x10, 0x00, 0x12, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x08, 0x42, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xB8, 0x00, 0x2A, 0x0C, 0x00, 0x2A, 0x12, 0x00, 0x08, 0x61, 0x00, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D91, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x30, 0x80, 0x80, 0x62, 0x88, 0x80, 0x36, 0x88, 0x80, 0x0C, 0xBE, 0x80, 0x18, 0x88, 0x80, 0x32, 0x9C, 0x80, 0x7E, 0x9C, 0x80, 0x0A, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x6A, 0x80, 0x80, 0x48, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D93, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x25, 0x00, 0x32, 0x4A, 0x00, 0x12, 0x94, 0x00, 0x0C, 0x52, 0x00, 0x09, 0x29, 0x00, 0x11, 0x14, 0x80, 0x3E, 0x80, 0x00, 0x04, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x25, 0x08, 0x00, 0x25, 0x08, 0x00, 0x24, 0x08, 0x00, 0x05, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D96, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x1B, 0xC7, 0x00, 0x10, 0x5C, 0x00, 0x64, 0x84, 0x00, 0x2D, 0x04, 0x00, 0x1B, 0xD4, 0x00, 0x10, 0x57, 0x80, 0x24, 0x54, 0x00, 0x7C, 0x54, 0x00, 0x15, 0x54, 0x00, 0x11, 0x54, 0x00, 0x55, 0x94, 0x00, 0x54, 0x9F, 0x80, 0x55, 0xC0, 0x00, 0x13, 0x70, 0x00, 0x16, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D97, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0xA9, 0x00, 0x62, 0xA9, 0x00, 0x36, 0xA9, 0x00, 0x0C, 0xA7, 0x00, 0x18, 0xC1, 0x00, 0x32, 0x81, 0x00, 0x7E, 0xBD, 0x00, 0x0A, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xBD, 0x00, 0x6A, 0x81, 0x00, 0x48, 0x81, 0x00, 0x08, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D99, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x18, 0xA4, 0x80, 0x30, 0x95, 0x00, 0x62, 0x95, 0x00, 0x36, 0x84, 0x00, 0x0C, 0xBF, 0x80, 0x18, 0x84, 0x00, 0x32, 0x8E, 0x00, 0x7E, 0x8E, 0x00, 0x0A, 0x95, 0x00, 0x08, 0x95, 0x00, 0x2A, 0xA4, 0x80, 0x2A, 0x84, 0x00, 0x6A, 0x80, 0x00, 0x48, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D9A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x08, 0x00, 0x36, 0x08, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x00, 0x00, 0x32, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x0A, 0xA4, 0x80, 0x08, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2B, 0x24, 0x00, 0x69, 0x64, 0x80, 0x48, 0x44, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D9B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x09, 0x00, 0x62, 0x69, 0x00, 0x36, 0x39, 0x00, 0x0C, 0x11, 0x00, 0x18, 0x3B, 0x00, 0x32, 0x6A, 0x00, 0x7E, 0xC6, 0x00, 0x0A, 0x00, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x2C, 0x00, 0x2A, 0xA5, 0x00, 0x6A, 0xA1, 0x80, 0x49, 0xA2, 0x80, 0x09, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D9C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x80, 0x80, 0x08, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x89, 0x00, 0x2B, 0x08, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D9D, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x10, 0x42, 0x00, 0x65, 0xFF, 0x80, 0x2C, 0x42, 0x00, 0x18, 0x42, 0x00, 0x10, 0x42, 0x00, 0x24, 0xE7, 0x00, 0x7C, 0xE7, 0x00, 0x15, 0x5A, 0x80, 0x11, 0x4A, 0x80, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7D9E, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x18, 0x0E, 0x00, 0x30, 0x78, 0x00, 0x62, 0x08, 0x00, 0x36, 0xFF, 0x80, 0x0C, 0x49, 0x00, 0x18, 0x49, 0x00, 0x32, 0x49, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x49, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0xFF, 0x80, 0x6A, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7D9F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x64, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x18, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x14, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x54, 0x9C, 0x00, 0x55, 0x94, 0x00, 0x55, 0x36, 0x00, 0x13, 0x63, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DA0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x32, 0x21, 0x00, 0x12, 0x22, 0x00, 0x0C, 0x7E, 0x00, 0x0A, 0x44, 0x00, 0x11, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DA2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x10, 0x88, 0x80, 0x24, 0x88, 0x80, 0x14, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x12, 0x88, 0x80, 0x3F, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DA3, { 0x00, 0x00, 0x00, 0x08, 0x52, 0x00, 0x18, 0xD3, 0x00, 0x30, 0x91, 0x00, 0x62, 0xFF, 0x00, 0x36, 0x28, 0x00, 0x0C, 0x28, 0x00, 0x19, 0xFF, 0x80, 0x32, 0x44, 0x00, 0x7E, 0x42, 0x00, 0x0A, 0xFF, 0x00, 0x09, 0xC5, 0x80, 0x2A, 0x44, 0x00, 0x2A, 0x4C, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x43, 0x00, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DA6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x18, 0x86, 0x00, 0x65, 0x11, 0x80, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DA7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x18, 0x7F, 0x00, 0x32, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x06, 0x00, 0x08, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DAA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x63, 0x08, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x08, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DAB, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x18, 0x22, 0x00, 0x30, 0x3F, 0x00, 0x62, 0xF0, 0x00, 0x36, 0x1B, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x36, 0x80, 0x32, 0xC3, 0x80, 0x7F, 0x04, 0x00, 0x09, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x2A, 0xF0, 0x00, 0x2B, 0x1B, 0x00, 0x69, 0x0C, 0x00, 0x48, 0x36, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DAC, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x78, 0x00, 0x10, 0x01, 0x00, 0x20, 0x49, 0x00, 0x14, 0x25, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x09, 0x7F, 0x00, 0x08, 0x21, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x14, 0x00, 0x08, 0x62, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DAD, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x12, 0x48, 0x00, 0x22, 0x7F, 0x00, 0x14, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x12, 0x48, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x48, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DAE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0x62, 0x00, 0x11, 0x16, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x0E, 0x00, 0x30, 0x1B, 0x00, 0x20, 0x31, 0x80, 0x60, 0x80, 0x00, 0x05, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DAF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x80, 0x80, 0x37, 0xA0, 0x80, 0x0C, 0x3C, 0x80, 0x18, 0x50, 0x80, 0x32, 0x10, 0x80, 0x7E, 0xFE, 0x80, 0x0A, 0x10, 0x80, 0x08, 0x54, 0x80, 0x2A, 0x54, 0x80, 0x2B, 0x54, 0x80, 0x69, 0x7D, 0x80, 0x48, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DB0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x80, 0x80, 0x36, 0x80, 0x80, 0x0C, 0x3E, 0x00, 0x18, 0x22, 0x00, 0x32, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x09, 0x20, 0x00, 0x08, 0x20, 0x00, 0x2A, 0x3F, 0x00, 0x2B, 0x21, 0x00, 0x69, 0x21, 0x00, 0x48, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DB1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x24, 0xA2, 0x80, 0x1C, 0x94, 0x80, 0x08, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x3F, 0xAA, 0x80, 0x09, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DB2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x24, 0xA2, 0x80, 0x14, 0x94, 0x80, 0x08, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x3F, 0xFF, 0x80, 0x09, 0xA0, 0x80, 0x08, 0xA0, 0x80, 0x2A, 0xA0, 0x80, 0x2A, 0xBF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DB3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x65, 0x24, 0x80, 0x2D, 0x24, 0x80, 0x19, 0xA6, 0x80, 0x11, 0x65, 0x80, 0x25, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x15, 0xA6, 0x80, 0x11, 0x65, 0x80, 0x55, 0x24, 0x80, 0x55, 0x24, 0x80, 0x55, 0x24, 0x80, 0x11, 0x24, 0x80, 0x12, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DB4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x22, 0xA6, 0x00, 0x14, 0x62, 0x00, 0x08, 0x55, 0x00, 0x12, 0x88, 0x80, 0x3F, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x6A, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x56, 0x00, 0x08, 0x89, 0x00, 0x09, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DB5, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x08, 0x79, 0x00, 0x12, 0x48, 0x80, 0x22, 0x44, 0x00, 0x14, 0x80, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x1A, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x49, 0x00, 0x08, 0x88, 0x80, 0x0B, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DB6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x91, 0x00, 0x62, 0x91, 0x00, 0x36, 0xFF, 0x00, 0x0C, 0x91, 0x00, 0x18, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x2A, 0x56, 0x00, 0x2A, 0xD2, 0x00, 0x6A, 0x93, 0x00, 0x49, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DB7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x00, 0x00, 0x2C, 0x44, 0x00, 0x18, 0x44, 0x00, 0x10, 0xEE, 0x00, 0x25, 0xAB, 0x00, 0x7C, 0x00, 0x00, 0x14, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x54, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DB8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x12, 0x22, 0x00, 0x22, 0x41, 0x00, 0x14, 0xBE, 0x80, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x55, 0x00, 0x08, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DB9, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x18, 0xF4, 0x00, 0x10, 0x94, 0x00, 0x65, 0x94, 0x00, 0x2D, 0x37, 0x80, 0x1B, 0xE4, 0x00, 0x10, 0x44, 0x00, 0x24, 0xE4, 0x00, 0x7D, 0xB8, 0x00, 0x17, 0x0F, 0x80, 0x10, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DBA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x24, 0x14, 0x00, 0x14, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x12, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x02, 0x00, 0x08, 0x02, 0x00, 0x2A, 0x7A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x7A, 0x00, 0x2A, 0x02, 0x00, 0x28, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DBB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x80, 0x80, 0x08, 0x00, 0x00, 0x12, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x4F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x28, 0x48, 0x00, 0x08, 0xBF, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DBD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x0F, 0x80, 0x22, 0x08, 0x00, 0x14, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DBE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x14, 0xFF, 0x00, 0x24, 0x08, 0x00, 0x1B, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x3E, 0x44, 0x80, 0x09, 0xA7, 0x80, 0x0B, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0xC2, 0x00, 0x2B, 0x24, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x14, 0x00, 0x08, 0x62, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DBF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x10, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DC2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x48, 0x80, 0x30, 0x49, 0x80, 0x62, 0xDD, 0x00, 0x36, 0x94, 0x00, 0x0C, 0x36, 0x00, 0x18, 0x63, 0x00, 0x32, 0xC9, 0x80, 0x7E, 0x08, 0x00, 0x0A, 0x48, 0x80, 0x08, 0x49, 0x80, 0x2A, 0xDD, 0x00, 0x2A, 0x94, 0x00, 0x6A, 0x36, 0x00, 0x48, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DC3, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x30, 0x42, 0x00, 0x62, 0xE7, 0x00, 0x36, 0xA5, 0x00, 0x0D, 0xBD, 0x80, 0x18, 0x00, 0x00, 0x32, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x4F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x6A, 0xE8, 0x00, 0x48, 0xB8, 0x00, 0x09, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DC4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x62, 0x82, 0x00, 0x36, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x18, 0x82, 0x00, 0x32, 0xFE, 0x00, 0x7E, 0x00, 0x00, 0x0A, 0x88, 0x00, 0x08, 0x8B, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0x88, 0x80, 0x48, 0xE9, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DC5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x11, 0x20, 0x00, 0x65, 0x20, 0x00, 0x2D, 0x3F, 0x80, 0x19, 0xE8, 0x80, 0x11, 0x28, 0x80, 0x25, 0x2D, 0x80, 0x7D, 0x25, 0x00, 0x15, 0xE5, 0x00, 0x11, 0x27, 0x00, 0x55, 0x22, 0x00, 0x55, 0x27, 0x00, 0x55, 0xE5, 0x00, 0x13, 0x2D, 0x80, 0x10, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DC6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x30, 0x42, 0x00, 0x62, 0x42, 0x00, 0x36, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x18, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x7E, 0x20, 0x00, 0x0A, 0x7F, 0x80, 0x08, 0xCA, 0x80, 0x2B, 0x92, 0x80, 0x2A, 0x24, 0x80, 0x6A, 0xC9, 0x80, 0x48, 0x11, 0x00, 0x08, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DC7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x24, 0x80, 0x12, 0x49, 0x00, 0x22, 0x92, 0x00, 0x14, 0x49, 0x00, 0x08, 0x24, 0x80, 0x12, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x22, 0x01, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x8C, 0x00, 0x3F, 0x8A, 0x00, 0x22, 0x11, 0x80, 0x3F, 0xA0, 0x00, 0x05, 0x10, 0x00, 0x02, 0x24, 0x00, 0x01, 0x42, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x80, 0x08, 0x84, 0x00, 0x10, 0x82, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DCB, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x14, 0x00, 0x12, 0x14, 0x00, 0x22, 0xF7, 0x80, 0x14, 0x14, 0x00, 0x08, 0x14, 0x00, 0x12, 0x14, 0x00, 0x3F, 0xF7, 0x80, 0x09, 0x14, 0x00, 0x08, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x77, 0x80, 0x2B, 0xA4, 0x00, 0x2A, 0x24, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DCC, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x18, 0x0E, 0x00, 0x30, 0x78, 0x00, 0x62, 0x08, 0x00, 0x36, 0xFF, 0x80, 0x0C, 0x2A, 0x00, 0x18, 0x6B, 0x00, 0x32, 0xC9, 0x80, 0x7E, 0x08, 0x00, 0x0A, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x21, 0x00, 0x2A, 0x42, 0x00, 0x6A, 0x7C, 0x00, 0x48, 0x0F, 0x00, 0x08, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DCD, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x18, 0x7C, 0x00, 0x30, 0x44, 0x00, 0x62, 0x44, 0x00, 0x36, 0x7F, 0x80, 0x0C, 0x44, 0x00, 0x18, 0x44, 0x00, 0x32, 0x72, 0x80, 0x7E, 0xC1, 0x80, 0x0A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DCE, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x18, 0x09, 0x00, 0x30, 0x09, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x18, 0xFC, 0x80, 0x32, 0x94, 0x80, 0x7E, 0x95, 0x80, 0x0A, 0x95, 0x00, 0x08, 0xF7, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0x76, 0x00, 0x6A, 0xCA, 0x80, 0x48, 0x13, 0x80, 0x08, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DCF, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x18, 0x22, 0x00, 0x30, 0x63, 0x00, 0x62, 0xD1, 0x80, 0x36, 0x10, 0x00, 0x0C, 0x32, 0x00, 0x18, 0x22, 0x00, 0x32, 0x3F, 0x00, 0x7E, 0xE1, 0x80, 0x0A, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x51, 0x00, 0x6A, 0x51, 0x80, 0x48, 0xD2, 0x80, 0x08, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DD1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x30, 0x02, 0x00, 0x62, 0x7E, 0x00, 0x36, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x7E, 0xC9, 0x00, 0x0A, 0x6B, 0x00, 0x08, 0x0A, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x2E, 0x00, 0x6A, 0x6B, 0x00, 0x48, 0xC9, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DD2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x11, 0x00, 0x30, 0x7F, 0x00, 0x62, 0x12, 0x00, 0x36, 0x12, 0x00, 0x0C, 0x14, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x7E, 0x10, 0x00, 0x0A, 0x3F, 0x00, 0x08, 0xE1, 0x00, 0x2A, 0x21, 0x00, 0x2B, 0x3F, 0x00, 0x69, 0x21, 0x00, 0x48, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DD5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x31, 0xFF, 0x80, 0x62, 0x42, 0x00, 0x36, 0x66, 0x00, 0x0C, 0x3C, 0x00, 0x18, 0x66, 0x00, 0x33, 0xC3, 0x80, 0x7E, 0x42, 0x00, 0x0A, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x6A, 0xC2, 0x00, 0x48, 0x82, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DD6, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x80, 0x12, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x24, 0x12, 0x00, 0x19, 0xFF, 0x80, 0x12, 0x04, 0x00, 0x3F, 0x0A, 0x00, 0x09, 0x30, 0x00, 0x08, 0xFF, 0x00, 0x2B, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DD7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x4F, 0x80, 0x10, 0x48, 0x80, 0x65, 0xF8, 0x80, 0x2C, 0x48, 0x80, 0x18, 0x4F, 0x80, 0x10, 0xC8, 0x80, 0x24, 0xE8, 0x80, 0x7C, 0xE8, 0x80, 0x15, 0x5F, 0x80, 0x11, 0x48, 0x80, 0x54, 0x48, 0x80, 0x54, 0x48, 0x80, 0x54, 0x48, 0x80, 0x10, 0x4F, 0x80, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DD8, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x08, 0x05, 0x00, 0x12, 0x04, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x84, 0x00, 0x08, 0xFC, 0x80, 0x12, 0x84, 0x80, 0x3E, 0x85, 0x00, 0x09, 0xBD, 0x00, 0x2A, 0xAE, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x86, 0x80, 0x2B, 0x09, 0x80, 0x09, 0x11, 0x80, 0x0A, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DD9, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x31, 0xFF, 0x80, 0x62, 0x42, 0x00, 0x36, 0x42, 0x00, 0x0C, 0x7E, 0x00, 0x18, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x0A, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x6A, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DDA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x10, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x08, 0x80, 0x09, 0xFB, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x2C, 0x00, 0x2A, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DDC, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x80, 0x08, 0x3E, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x18, 0x00, 0x21, 0x32, 0x00, 0x3F, 0x16, 0x00, 0x21, 0x0C, 0x00, 0x21, 0x19, 0x00, 0x3F, 0x3F, 0x80, 0x08, 0x04, 0x80, 0x7F, 0x84, 0x00, 0x48, 0x95, 0x00, 0x48, 0x95, 0x00, 0x48, 0xB5, 0x80, 0x49, 0xA4, 0x80, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DDD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x08, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x3F, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x4F, 0x80, 0x2A, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DDE, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0xCE, 0x00, 0x10, 0x8A, 0x00, 0x24, 0x8A, 0x00, 0x14, 0xEA, 0x80, 0x08, 0x93, 0x80, 0x12, 0xA0, 0x00, 0x3F, 0x80, 0x00, 0x09, 0xE0, 0x00, 0x08, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xEA, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x8C, 0x00, 0x08, 0x92, 0x00, 0x08, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DE0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x14, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x3F, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x08, 0x4B, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DE1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x14, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x44, 0x00, 0x3F, 0x7A, 0x80, 0x09, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DE2, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x18, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x42, 0x00, 0x2C, 0x42, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x14, 0x91, 0x00, 0x10, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DE3, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x14, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x13, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x0A, 0x51, 0x00, 0x08, 0x9A, 0x00, 0x2B, 0x2C, 0x00, 0x2A, 0x4C, 0x00, 0x2B, 0x9A, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x49, 0x00, 0x08, 0x89, 0x00, 0x0B, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DE4, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x18, 0x92, 0x00, 0x13, 0xFF, 0x80, 0x64, 0x92, 0x00, 0x2C, 0x92, 0x00, 0x18, 0x9E, 0x00, 0x10, 0x80, 0x00, 0x24, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x54, 0x54, 0x00, 0x54, 0xD6, 0x00, 0x54, 0x93, 0x00, 0x11, 0x91, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DE5, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x5F, 0x00, 0x10, 0x51, 0x00, 0x64, 0xD1, 0x00, 0x2C, 0x91, 0x00, 0x19, 0x9F, 0x00, 0x12, 0x84, 0x00, 0x24, 0x84, 0x00, 0x7C, 0xBF, 0x80, 0x14, 0x84, 0x00, 0x10, 0x8E, 0x00, 0x54, 0x8E, 0x00, 0x54, 0x95, 0x00, 0x54, 0x95, 0x00, 0x10, 0xA4, 0x80, 0x10, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DE6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x64, 0x91, 0x00, 0x2C, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x10, 0x91, 0x00, 0x24, 0x91, 0x00, 0x7C, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x10, 0x08, 0x00, 0x54, 0x2C, 0x00, 0x54, 0xA5, 0x00, 0x54, 0xA1, 0x80, 0x11, 0xA2, 0x80, 0x11, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DE8, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF0, 0x00, 0x12, 0x80, 0x00, 0x22, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x08, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x09, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0xFF, 0x80, 0x29, 0x94, 0x80, 0x09, 0x94, 0x80, 0x0A, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DE9, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0x72, 0x00, 0x12, 0x49, 0x00, 0x22, 0x84, 0x00, 0x14, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x8C, 0x00, 0x29, 0x0C, 0x00, 0x0A, 0x32, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DEA, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x18, 0xBF, 0x80, 0x10, 0x88, 0x00, 0x64, 0x88, 0x00, 0x2C, 0x8F, 0x00, 0x19, 0xC9, 0x00, 0x11, 0xAD, 0x00, 0x26, 0x93, 0x00, 0x7C, 0x91, 0x00, 0x14, 0x99, 0x00, 0x10, 0xA6, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x10, 0xBF, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DEB, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x10, 0xFF, 0x00, 0x64, 0xA9, 0x00, 0x2D, 0x29, 0x00, 0x18, 0x69, 0x00, 0x10, 0x9F, 0x00, 0x24, 0x22, 0x00, 0x7C, 0x46, 0x00, 0x14, 0x00, 0x00, 0x10, 0x30, 0x00, 0x54, 0x58, 0x00, 0x55, 0x43, 0x00, 0x55, 0x45, 0x80, 0x11, 0x4C, 0x80, 0x11, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DEC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x24, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x3F, 0xBD, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xBD, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x30, 0x88, 0x80, 0x62, 0xFF, 0x80, 0x36, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x18, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DEF, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x17, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DF1, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x18, 0xBF, 0x00, 0x10, 0x81, 0x00, 0x65, 0x81, 0x00, 0x2D, 0x7F, 0x80, 0x1B, 0x20, 0x00, 0x11, 0x20, 0x00, 0x25, 0x7F, 0x00, 0x7D, 0x88, 0x00, 0x15, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x55, 0x1C, 0x00, 0x55, 0x14, 0x00, 0x11, 0x36, 0x00, 0x11, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DF2, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x19, 0xC4, 0x00, 0x11, 0x44, 0x00, 0x65, 0x55, 0x00, 0x2D, 0xD5, 0x00, 0x19, 0x55, 0x80, 0x11, 0x64, 0x80, 0x25, 0x44, 0x00, 0x7D, 0xC5, 0x00, 0x15, 0x4D, 0x00, 0x11, 0x43, 0x00, 0x55, 0x42, 0x00, 0x55, 0xC6, 0x00, 0x54, 0x0C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7DF4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x14, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x6B, 0x00, 0x09, 0x5D, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x1A, 0x00, 0x2A, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DF5, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x18, 0x55, 0x00, 0x30, 0x49, 0x00, 0x62, 0x55, 0x00, 0x36, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x24, 0x00, 0x32, 0x64, 0x00, 0x7E, 0xD3, 0x80, 0x0A, 0x3E, 0x00, 0x08, 0x62, 0x00, 0x2A, 0xD6, 0x00, 0x2A, 0x14, 0x00, 0x6A, 0x0C, 0x00, 0x48, 0x3B, 0x00, 0x08, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DF6, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x18, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x65, 0xFF, 0x80, 0x2D, 0x48, 0x80, 0x1B, 0x48, 0x80, 0x11, 0x7F, 0x80, 0x25, 0x48, 0x80, 0x7D, 0x48, 0x80, 0x15, 0x7F, 0x80, 0x11, 0x08, 0x00, 0x55, 0x48, 0x00, 0x55, 0x38, 0x00, 0x55, 0x10, 0x00, 0x11, 0x3C, 0x00, 0x11, 0x67, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DF9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x30, 0x42, 0x00, 0x62, 0x7E, 0x00, 0x36, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x18, 0x7E, 0x00, 0x32, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x4F, 0x00, 0x2A, 0x48, 0x00, 0x6A, 0xE8, 0x00, 0x48, 0xB8, 0x00, 0x09, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DFA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x62, 0x4F, 0x00, 0x36, 0x49, 0x00, 0x0C, 0x49, 0x00, 0x18, 0x49, 0x00, 0x32, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x0A, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x6A, 0xBE, 0x80, 0x48, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7DFB, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x12, 0x84, 0x00, 0x22, 0x84, 0x00, 0x15, 0x2F, 0x80, 0x09, 0x29, 0x00, 0x12, 0xF9, 0x00, 0x3F, 0x19, 0x00, 0x08, 0xAA, 0x00, 0x08, 0x86, 0x00, 0x2A, 0x84, 0x00, 0x2B, 0xE4, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2B, 0xF1, 0x00, 0x08, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E00, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xEF, 0x80, 0x11, 0x20, 0x80, 0x65, 0x20, 0x80, 0x2D, 0x20, 0x80, 0x19, 0xEF, 0x80, 0x11, 0x00, 0x00, 0x25, 0x1F, 0x80, 0x7D, 0xE8, 0x80, 0x15, 0x09, 0x80, 0x11, 0x0D, 0x00, 0x55, 0xE7, 0x00, 0x55, 0x02, 0x00, 0x55, 0x07, 0x00, 0x11, 0x0D, 0x00, 0x11, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E01, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFE, 0x00, 0x30, 0x02, 0x00, 0x62, 0xFE, 0x00, 0x36, 0x02, 0x00, 0x0D, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x32, 0x51, 0x00, 0x7E, 0x9A, 0x00, 0x0A, 0x2C, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x9C, 0x00, 0x2A, 0x2A, 0x00, 0x6A, 0x49, 0x00, 0x48, 0x88, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E04, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x91, 0x00, 0x62, 0xFF, 0x00, 0x36, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x18, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x6A, 0xFF, 0x00, 0x48, 0x10, 0x80, 0x08, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E05, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x18, 0x04, 0x80, 0x10, 0x04, 0x00, 0x65, 0xFF, 0x80, 0x2D, 0x04, 0x00, 0x19, 0x74, 0x00, 0x11, 0x04, 0x80, 0x25, 0x24, 0x80, 0x7D, 0xFD, 0x80, 0x15, 0x55, 0x00, 0x11, 0x57, 0x00, 0x55, 0x72, 0x00, 0x55, 0x2A, 0x80, 0x55, 0x46, 0x80, 0x11, 0x0B, 0x80, 0x12, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E08, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x23, 0x11, 0x00, 0x0C, 0x60, 0x00, 0x02, 0x81, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x04, 0x88, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E09, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x22, 0x44, 0x00, 0x14, 0x99, 0x00, 0x0B, 0xFF, 0x80, 0x12, 0x08, 0x80, 0x3F, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E0A, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x12, 0x81, 0x00, 0x23, 0x7C, 0x80, 0x14, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x12, 0x02, 0x00, 0x3E, 0x81, 0x00, 0x0B, 0x00, 0x80, 0x08, 0xFF, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E0B, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x19, 0x08, 0x00, 0x11, 0xBF, 0x00, 0x64, 0xA1, 0x00, 0x2C, 0x21, 0x00, 0x18, 0x21, 0x00, 0x10, 0x3F, 0x00, 0x25, 0xA0, 0x00, 0x7C, 0xA0, 0x00, 0x14, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x54, 0xA1, 0x00, 0x54, 0xA1, 0x00, 0x55, 0xBF, 0x00, 0x11, 0x40, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E10, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x91, 0x00, 0x62, 0x55, 0x00, 0x36, 0x55, 0x00, 0x0C, 0x7D, 0x00, 0x18, 0x23, 0x00, 0x32, 0x46, 0x00, 0x7F, 0x20, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x91, 0x00, 0x2A, 0x55, 0x00, 0x2B, 0x55, 0x00, 0x69, 0x7D, 0x00, 0x48, 0x23, 0x00, 0x08, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E11, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x18, 0x44, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x48, 0x00, 0x2D, 0xFF, 0x00, 0x18, 0x49, 0x00, 0x10, 0x49, 0x00, 0x27, 0xFF, 0x80, 0x7C, 0x49, 0x00, 0x14, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x4C, 0x00, 0x54, 0xCA, 0x00, 0x55, 0x4B, 0x00, 0x12, 0x49, 0x80, 0x10, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E12, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x18, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x64, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x24, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x14, 0x20, 0x00, 0x10, 0x40, 0x00, 0x54, 0xFF, 0x00, 0x55, 0x88, 0x00, 0x54, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E15, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x22, 0x92, 0x00, 0x14, 0xAA, 0x00, 0x08, 0xC6, 0x00, 0x12, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x0A, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x2B, 0x29, 0x00, 0x2B, 0x29, 0x00, 0x2B, 0x29, 0x00, 0x29, 0x29, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E17, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x64, 0x00, 0x00, 0x2C, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x24, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x14, 0x51, 0x00, 0x10, 0x5B, 0x00, 0x54, 0xCA, 0x00, 0x55, 0x4C, 0x00, 0x54, 0x46, 0x00, 0x10, 0x73, 0x00, 0x11, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E1B, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x12, 0x00, 0x13, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x3F, 0x91, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x44, 0x00, 0x2A, 0x24, 0x00, 0x28, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E1C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x62, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2B, 0x7F, 0x00, 0x69, 0x22, 0x00, 0x48, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E1D, { 0x00, 0x00, 0x00, 0x08, 0x8F, 0x00, 0x08, 0xF8, 0x00, 0x12, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x08, 0xBF, 0x00, 0x12, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x09, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E1E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E1F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x24, 0xFF, 0x00, 0x14, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x12, 0xA9, 0x00, 0x3F, 0xA6, 0x00, 0x09, 0xBA, 0x80, 0x2A, 0xE1, 0x80, 0x2A, 0x82, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0xA2, 0x00, 0x2A, 0x92, 0x00, 0x08, 0x82, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E20, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x23, 0x80, 0x7F, 0x80, 0x00, 0x40, 0xBF, 0x00, 0x5E, 0x91, 0x00, 0x24, 0x11, 0x00, 0x68, 0x1B, 0x00, 0x11, 0x0E, 0x00, 0x7E, 0x84, 0x00, 0x08, 0x0E, 0x00, 0x2A, 0x1B, 0x00, 0x49, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E21, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x14, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x3F, 0x22, 0x00, 0x09, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E22, { 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x24, 0x91, 0x00, 0x25, 0x64, 0x80, 0x3C, 0x28, 0x00, 0x24, 0x12, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x54, 0x00, 0x64, 0xD6, 0x00, 0x4D, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E23, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0F, 0xB8, 0x00, 0x28, 0x88, 0x00, 0x2F, 0xCA, 0x00, 0x28, 0xB2, 0x00, 0x2F, 0x94, 0x00, 0x28, 0x89, 0x00, 0x2F, 0x97, 0x80, 0x20, 0x7C, 0x80, 0x3F, 0xC8, 0x00, 0x24, 0x0A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x29, 0x00, 0x24, 0xA9, 0x00, 0x24, 0x88, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E26, { 0x00, 0x00, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x21, 0x8A, 0x00, 0x29, 0x0A, 0x00, 0x4B, 0x3F, 0x80, 0x30, 0x84, 0x00, 0x10, 0x84, 0x00, 0x25, 0xA4, 0x00, 0x7D, 0x24, 0x00, 0x13, 0x27, 0x00, 0x11, 0x24, 0x00, 0x59, 0x24, 0x00, 0x55, 0x24, 0x00, 0x51, 0x34, 0x00, 0x11, 0x2C, 0x00, 0x11, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E27, { 0x00, 0x00, 0x00, 0x08, 0x90, 0x00, 0x18, 0x90, 0x00, 0x10, 0x9F, 0x80, 0x65, 0xB1, 0x00, 0x2D, 0x2B, 0x00, 0x19, 0x4E, 0x00, 0x13, 0x44, 0x00, 0x25, 0x5E, 0x00, 0x7D, 0x73, 0x80, 0x15, 0x44, 0x00, 0x11, 0x7F, 0x80, 0x55, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x55, 0x00, 0x11, 0x24, 0x80, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E28, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x62, 0x7F, 0x00, 0x36, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x88, 0x80, 0x32, 0xC9, 0x80, 0x7E, 0x49, 0x00, 0x0A, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x6A, 0x64, 0x80, 0x48, 0x44, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E2B, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x4F, 0x80, 0x12, 0x10, 0x80, 0x22, 0x29, 0x00, 0x14, 0x46, 0x00, 0x09, 0x06, 0x00, 0x12, 0x99, 0x80, 0x3D, 0x64, 0x00, 0x08, 0x3F, 0x80, 0x09, 0x84, 0x00, 0x2A, 0xBF, 0x80, 0x2A, 0x84, 0x00, 0x2A, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E2C, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x18, 0x04, 0x80, 0x10, 0x04, 0x00, 0x65, 0xFF, 0x80, 0x2D, 0x04, 0x00, 0x19, 0x24, 0x00, 0x11, 0x3C, 0x80, 0x25, 0x24, 0x80, 0x7D, 0xFD, 0x80, 0x15, 0x25, 0x00, 0x11, 0x77, 0x00, 0x55, 0x6A, 0x00, 0x55, 0xAA, 0x80, 0x55, 0x26, 0x80, 0x11, 0x6B, 0x80, 0x12, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E2D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x36, 0x55, 0x00, 0x0C, 0x49, 0x00, 0x18, 0x55, 0x00, 0x32, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x90, 0x80, 0x2A, 0x94, 0x80, 0x6A, 0xBA, 0x80, 0x48, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E2E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x14, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x14, 0x84, 0x00, 0x3E, 0x88, 0x00, 0x29, 0xBF, 0x00, 0x0A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E2F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x14, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E31, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x12, 0x89, 0x00, 0x22, 0x96, 0x80, 0x15, 0x12, 0x80, 0x08, 0x44, 0x00, 0x14, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x0A, 0x94, 0x00, 0x08, 0x97, 0x80, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0xB4, 0x00, 0x2A, 0xAF, 0x80, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E32, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x49, 0x00, 0x62, 0x7F, 0x00, 0x36, 0x49, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x08, 0x00, 0x32, 0x12, 0x00, 0x7F, 0x24, 0x00, 0x09, 0x19, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x08, 0x80, 0x2B, 0x2A, 0x00, 0x69, 0x6B, 0x00, 0x48, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E33, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x10, 0x00, 0x2C, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x7C, 0xFF, 0x00, 0x14, 0x12, 0x00, 0x10, 0x3F, 0x00, 0x55, 0xE1, 0x80, 0x54, 0x02, 0x00, 0x55, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x10, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E35, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x18, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x64, 0x42, 0x00, 0x2C, 0x7E, 0x00, 0x18, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x25, 0x24, 0x80, 0x7D, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x42, 0x00, 0x54, 0x24, 0x00, 0x54, 0x18, 0x00, 0x10, 0x76, 0x00, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E36, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x7E, 0x00, 0x7F, 0x92, 0x00, 0x11, 0x32, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x2A, 0x80, 0x3F, 0x4A, 0x80, 0x04, 0x01, 0x80, 0x00, 0x80, 0x00, 0x05, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E37, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x14, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x09, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x2A, 0x40, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x84, 0x00, 0x2B, 0xE8, 0x00, 0x08, 0x3C, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E39, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x65, 0xFF, 0x80, 0x2D, 0x24, 0x80, 0x19, 0x24, 0x80, 0x11, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x54, 0x92, 0x00, 0x55, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E3A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x19, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x88, 0x00, 0x2D, 0x3F, 0x00, 0x19, 0xA9, 0x00, 0x10, 0xA9, 0x00, 0x24, 0x3F, 0x00, 0x7D, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x10, 0xBF, 0x00, 0x54, 0x88, 0x00, 0x54, 0xFF, 0x80, 0x55, 0x88, 0x00, 0x11, 0x48, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E3B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x25, 0x55, 0x00, 0x29, 0x55, 0x80, 0x21, 0x00, 0x00, 0x20, 0x44, 0x00, 0x22, 0x88, 0x00, 0x21, 0x11, 0x00, 0x2F, 0xFF, 0x80, 0x60, 0x20, 0x80, 0x41, 0x24, 0x00, 0x43, 0x26, 0x00, 0x0E, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E3D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x14, 0xA1, 0x00, 0x08, 0xBD, 0x00, 0x12, 0xE5, 0x00, 0x3F, 0x99, 0x00, 0x09, 0x95, 0x00, 0x08, 0xA3, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x49, 0x00, 0x29, 0x42, 0x80, 0x09, 0x7E, 0x80, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E3E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E3F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x18, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x64, 0x82, 0x00, 0x2D, 0x24, 0x80, 0x1B, 0xE7, 0x80, 0x10, 0x10, 0x00, 0x24, 0x28, 0x00, 0x7C, 0xC6, 0x00, 0x17, 0x93, 0x80, 0x10, 0x20, 0x00, 0x54, 0xC8, 0x00, 0x54, 0x33, 0x00, 0x54, 0xC6, 0x00, 0x10, 0x1C, 0x00, 0x11, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E41, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x10, 0x3F, 0x80, 0x2F, 0xA1, 0x00, 0x0A, 0xD2, 0x00, 0x3F, 0x8C, 0x00, 0x15, 0x16, 0x00, 0x3F, 0x61, 0x80, 0x05, 0x08, 0x00, 0x02, 0x10, 0x00, 0x01, 0x21, 0x00, 0x01, 0xFF, 0x80, 0x3F, 0x40, 0x80, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x18, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E43, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x80, 0x10, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x14, 0x80, 0x80, 0x08, 0xF7, 0x80, 0x12, 0x94, 0x80, 0x3F, 0xD6, 0x80, 0x09, 0xB5, 0x80, 0x08, 0x94, 0x80, 0x2A, 0xD6, 0x80, 0x2A, 0xB5, 0x80, 0x2A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x08, 0x94, 0x80, 0x09, 0x39, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDE, 0x00, 0x28, 0x12, 0x00, 0x2F, 0x93, 0x80, 0x32, 0x20, 0x00, 0x2F, 0x9F, 0x00, 0x25, 0x09, 0x00, 0x28, 0x86, 0x00, 0x3F, 0xD9, 0x80, 0x00, 0x80, 0x00, 0x05, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E45, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x18, 0x92, 0x00, 0x30, 0xDB, 0x00, 0x62, 0x49, 0x00, 0x36, 0xFF, 0x00, 0x0C, 0x91, 0x00, 0x18, 0xFF, 0x00, 0x32, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x34, 0x00, 0x2A, 0x56, 0x00, 0x6A, 0xD3, 0x00, 0x49, 0x91, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E46, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x2A, 0x80, 0x22, 0x5D, 0x80, 0x14, 0xAA, 0x80, 0x08, 0x4C, 0x80, 0x12, 0x19, 0x80, 0x3F, 0x18, 0x00, 0x09, 0x26, 0x00, 0x08, 0xC9, 0x80, 0x2A, 0x32, 0x00, 0x2A, 0xCC, 0x00, 0x2A, 0x31, 0x00, 0x2A, 0xC6, 0x00, 0x08, 0x18, 0x00, 0x08, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E47, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x07, 0x00, 0x0F, 0xB8, 0x00, 0x15, 0x0A, 0x00, 0x36, 0x32, 0x00, 0x0C, 0x14, 0x00, 0x18, 0x09, 0x00, 0x28, 0x7F, 0x80, 0x0F, 0xC4, 0x80, 0x12, 0x04, 0x00, 0x3F, 0xF5, 0x00, 0x02, 0x15, 0x00, 0x12, 0x54, 0x80, 0x12, 0x64, 0x80, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E4A, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x18, 0x45, 0x00, 0x11, 0xF5, 0x80, 0x64, 0x44, 0x80, 0x2C, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0xA4, 0x00, 0x24, 0xA5, 0x00, 0x7E, 0xAD, 0x00, 0x09, 0xB5, 0x00, 0x08, 0xA7, 0x00, 0x2C, 0xA2, 0x00, 0x2A, 0xA6, 0x00, 0x68, 0xF6, 0x80, 0x4B, 0x8B, 0x80, 0x08, 0x19, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E4B, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xA3, 0x80, 0x24, 0xC0, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xDB, 0x80, 0x04, 0x80, 0x00, 0x03, 0x10, 0x00, 0x01, 0xA1, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x80, 0x38, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E4D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x09, 0x00, 0x62, 0xFF, 0x80, 0x36, 0x09, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x08, 0x00, 0x32, 0xAA, 0x80, 0x7E, 0xAA, 0x80, 0x0A, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x9C, 0x80, 0x6A, 0xAA, 0x80, 0x48, 0x88, 0x80, 0x09, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E4E, { 0x00, 0x00, 0x00, 0x08, 0x85, 0x00, 0x18, 0x84, 0x80, 0x10, 0xF4, 0x00, 0x64, 0x9F, 0x80, 0x2D, 0x54, 0x00, 0x19, 0x34, 0x00, 0x12, 0xAE, 0x00, 0x24, 0x6A, 0x00, 0x7C, 0xCB, 0x00, 0x15, 0x91, 0x80, 0x10, 0x00, 0x00, 0x54, 0x00, 0x00, 0x55, 0x49, 0x00, 0x51, 0x49, 0x00, 0x13, 0x6D, 0x80, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E50, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x10, 0x00, 0x2C, 0xFF, 0x00, 0x18, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x7C, 0xFF, 0x00, 0x14, 0x12, 0x00, 0x10, 0x7F, 0x00, 0x55, 0xC1, 0x80, 0x54, 0x10, 0x00, 0x54, 0xA9, 0x00, 0x10, 0xA2, 0x80, 0x11, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E52, { 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x22, 0x00, 0x12, 0x41, 0x00, 0x23, 0x80, 0x80, 0x14, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x12, 0xAA, 0x80, 0x3F, 0x9C, 0x80, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E54, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x12, 0x49, 0x00, 0x23, 0xF8, 0x00, 0x14, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x13, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x0A, 0xE9, 0x00, 0x08, 0xA9, 0x00, 0x2A, 0xEA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xE4, 0x80, 0x2A, 0xAA, 0x80, 0x08, 0x31, 0x80, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E55, { 0x00, 0x00, 0x00, 0x08, 0x21, 0x00, 0x08, 0x12, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x18, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x3F, 0x2A, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E56, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x19, 0x24, 0x00, 0x13, 0xF4, 0x00, 0x65, 0x27, 0x80, 0x2D, 0x2D, 0x00, 0x1B, 0xF9, 0x00, 0x10, 0x05, 0x00, 0x25, 0xE5, 0x00, 0x7D, 0x25, 0x00, 0x15, 0xE7, 0x00, 0x11, 0x22, 0x00, 0x55, 0xE2, 0x00, 0x55, 0x27, 0x00, 0x55, 0x25, 0x00, 0x11, 0x25, 0x00, 0x11, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E58, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x30, 0x22, 0x00, 0x62, 0x14, 0x00, 0x37, 0xFF, 0x80, 0x0C, 0x29, 0x00, 0x18, 0x4A, 0x00, 0x32, 0x98, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x94, 0x80, 0x08, 0xA4, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0xA4, 0x80, 0x6A, 0xA4, 0x80, 0x48, 0xBC, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E59, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x18, 0xF8, 0x00, 0x11, 0x11, 0x00, 0x64, 0x92, 0x00, 0x2D, 0xFF, 0x80, 0x18, 0x54, 0x00, 0x10, 0x56, 0x00, 0x24, 0xD3, 0x00, 0x7D, 0x91, 0x80, 0x14, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E5A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x64, 0x24, 0x00, 0x2C, 0xA5, 0x00, 0x18, 0x42, 0x00, 0x10, 0xFF, 0x00, 0x25, 0x42, 0x80, 0x7C, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x54, 0x10, 0x00, 0x54, 0x52, 0x00, 0x54, 0xD3, 0x00, 0x11, 0x91, 0x80, 0x10, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E5D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x65, 0xEF, 0x00, 0x2D, 0x29, 0x00, 0x19, 0xEF, 0x00, 0x11, 0x01, 0x00, 0x25, 0x7D, 0x00, 0x7D, 0x45, 0x00, 0x15, 0x7D, 0x00, 0x11, 0x45, 0x00, 0x55, 0x7D, 0x00, 0x55, 0x45, 0x00, 0x55, 0x45, 0x00, 0x11, 0x4D, 0x00, 0x11, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E5E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x3F, 0x22, 0x00, 0x09, 0x3A, 0x00, 0x08, 0xEF, 0x80, 0x2A, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x08, 0x44, 0x80, 0x09, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E5F, { 0x00, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x18, 0x94, 0x80, 0x30, 0xF7, 0x80, 0x62, 0x00, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x49, 0x00, 0x18, 0x49, 0x00, 0x32, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x09, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x69, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E61, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x09, 0x00, 0x24, 0xFF, 0x80, 0x14, 0x09, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x3E, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x08, 0xEB, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xEB, 0x80, 0x08, 0xAA, 0x80, 0x09, 0x2A, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E62, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x49, 0x00, 0x62, 0x7F, 0x00, 0x36, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x6A, 0x7F, 0x00, 0x48, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E65, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x62, 0x08, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x6A, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E66, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xDF, 0x00, 0x10, 0x51, 0x00, 0x64, 0x51, 0x00, 0x2C, 0x5F, 0x00, 0x19, 0xC4, 0x00, 0x11, 0x1F, 0x00, 0x25, 0x15, 0x00, 0x7D, 0x15, 0x00, 0x15, 0xD5, 0x00, 0x10, 0x5F, 0x00, 0x54, 0x44, 0x00, 0x54, 0x45, 0x00, 0x54, 0x45, 0x00, 0x10, 0xCF, 0x80, 0x11, 0xB8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E67, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x1A, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x24, 0xD6, 0x00, 0x7C, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x40, 0x00, 0x54, 0xC2, 0x00, 0x10, 0x9F, 0x00, 0x11, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E69, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x10, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x14, 0xEE, 0x00, 0x08, 0x28, 0x00, 0x12, 0x28, 0x00, 0x3E, 0xEE, 0x00, 0x09, 0xAA, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0xA8, 0x00, 0x2A, 0x28, 0x80, 0x08, 0x3F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E6A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x12, 0x22, 0x00, 0x22, 0xC1, 0x80, 0x14, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x3E, 0xAA, 0x80, 0x09, 0x9C, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E6B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBE, 0x00, 0x04, 0x22, 0x80, 0x3F, 0xA3, 0x80, 0x24, 0xC0, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0xA1, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x8C, 0x00, 0x3F, 0xAB, 0x80, 0x02, 0x52, 0x00, 0x01, 0x9F, 0x00, 0x3F, 0xE0, 0x80, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E6D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x29, 0xFD, 0x00, 0x32, 0xD5, 0x00, 0x2C, 0xD5, 0x00, 0x3F, 0xFD, 0x00, 0x24, 0x95, 0x00, 0x2E, 0x9F, 0x00, 0x35, 0xE3, 0x00, 0x24, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E6E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x64, 0xFE, 0x00, 0x2C, 0x92, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E6F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x30, 0x55, 0x00, 0x62, 0x55, 0x00, 0x36, 0x7F, 0x00, 0x0C, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x14, 0x80, 0x2A, 0x35, 0x00, 0x6A, 0xE6, 0x00, 0x48, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E70, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x14, 0x00, 0x00, 0x0A, 0xE7, 0x00, 0x3F, 0xA5, 0x00, 0x09, 0xA5, 0x00, 0x08, 0xE7, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x38, 0x00, 0x28, 0x54, 0x00, 0x08, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E73, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x18, 0x84, 0x00, 0x11, 0xE4, 0x00, 0x61, 0x2F, 0x80, 0x29, 0xE9, 0x00, 0x19, 0x39, 0x00, 0x11, 0xE9, 0x00, 0x24, 0x8D, 0x00, 0x7D, 0xF5, 0x00, 0x14, 0x87, 0x00, 0x10, 0xF2, 0x00, 0x54, 0x92, 0x00, 0x55, 0x97, 0x00, 0x55, 0x35, 0x00, 0x13, 0x2D, 0x80, 0x16, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E78, { 0x00, 0x00, 0x00, 0x09, 0x0E, 0x00, 0x19, 0xA3, 0x00, 0x10, 0xE1, 0x80, 0x65, 0x5E, 0x80, 0x2D, 0x88, 0x00, 0x18, 0x90, 0x80, 0x10, 0x29, 0x80, 0x25, 0x89, 0x00, 0x7C, 0x94, 0x00, 0x14, 0xA6, 0x00, 0x10, 0x8D, 0x00, 0x54, 0x94, 0x80, 0x54, 0xA4, 0x00, 0x55, 0x8C, 0x00, 0x11, 0x40, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E79, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x22, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x08, 0x14, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E7B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x2A, 0x10, 0x80, 0x1A, 0xD6, 0x80, 0x12, 0x10, 0x80, 0x24, 0xD6, 0x00, 0x7C, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E7C, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x12, 0xA4, 0x80, 0x22, 0xCB, 0x00, 0x14, 0xB2, 0x00, 0x08, 0xED, 0x80, 0x12, 0x94, 0x80, 0x3D, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x0A, 0xA2, 0x80, 0x2A, 0xCC, 0x80, 0x2A, 0xD3, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0xAB, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E7D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x64, 0xFF, 0x00, 0x2C, 0x52, 0x00, 0x19, 0x94, 0x00, 0x10, 0x18, 0x00, 0x24, 0xFF, 0x00, 0x7D, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E7E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x19, 0x3F, 0x00, 0x11, 0xA9, 0x00, 0x64, 0xBF, 0x00, 0x2D, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x24, 0x3F, 0x00, 0x7D, 0xA1, 0x00, 0x14, 0xBF, 0x00, 0x10, 0xA0, 0x00, 0x54, 0xBF, 0x00, 0x54, 0xA1, 0x00, 0x55, 0xBF, 0x00, 0x11, 0x40, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E7F, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x19, 0xF2, 0x00, 0x11, 0x42, 0x00, 0x65, 0x47, 0x80, 0x2D, 0xF4, 0x00, 0x19, 0x10, 0x00, 0x11, 0xF0, 0x00, 0x25, 0x47, 0x80, 0x7D, 0x40, 0x00, 0x15, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x54, 0xA9, 0x00, 0x54, 0xA9, 0x00, 0x10, 0xA9, 0x00, 0x11, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E81, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x18, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x67, 0xFF, 0x80, 0x2C, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x24, 0xD6, 0x00, 0x7C, 0xBA, 0x00, 0x14, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x57, 0xFF, 0x80, 0x11, 0x49, 0x00, 0x12, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E82, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x27, 0xFE, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0xE1, 0x80, 0x03, 0x58, 0x00, 0x1C, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E83, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x60, 0x28, 0x00, 0x2B, 0xD7, 0x80, 0x19, 0x55, 0x00, 0x11, 0x55, 0x00, 0x26, 0xD6, 0x80, 0x7C, 0x00, 0x00, 0x15, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x11, 0x01, 0x00, 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E86, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x92, 0x00, 0x10, 0xD6, 0x00, 0x64, 0xBA, 0x00, 0x2C, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x14, 0xA9, 0x00, 0x11, 0x24, 0x80, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E87, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x49, 0x7F, 0x80, 0x2A, 0x08, 0x00, 0x7F, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x49, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x10, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x68, 0x21, 0x00, 0x11, 0x21, 0x00, 0x7E, 0xBF, 0x00, 0x08, 0x12, 0x00, 0x2A, 0x33, 0x00, 0x49, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E88, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x18, 0x9F, 0x80, 0x10, 0x84, 0x00, 0x63, 0xEF, 0x00, 0x28, 0x89, 0x00, 0x18, 0x89, 0x00, 0x13, 0xEF, 0x00, 0x24, 0x09, 0x00, 0x7C, 0x09, 0x00, 0x15, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x55, 0x29, 0x00, 0x55, 0x2F, 0x00, 0x55, 0xE0, 0x00, 0x10, 0x09, 0x00, 0x10, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E89, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x19, 0xEF, 0x80, 0x10, 0x42, 0x00, 0x65, 0xEF, 0x80, 0x2C, 0x42, 0x00, 0x18, 0xA5, 0x00, 0x11, 0x00, 0x80, 0x24, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x11, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E8A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x65, 0x7F, 0x00, 0x2D, 0x22, 0x00, 0x19, 0x3E, 0x00, 0x11, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x7D, 0x08, 0x00, 0x15, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x12, 0x22, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E8C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x3F, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E8D, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x05, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E8E, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x18, 0x45, 0x00, 0x11, 0xF5, 0x80, 0x64, 0x44, 0x80, 0x2C, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0xA4, 0x00, 0x25, 0xB5, 0x00, 0x7C, 0xA5, 0x00, 0x15, 0xB5, 0x00, 0x10, 0xA7, 0x00, 0x55, 0xB2, 0x00, 0x54, 0xA6, 0x00, 0x54, 0xF6, 0x80, 0x13, 0x8B, 0x80, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E8F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x12, 0xBE, 0x00, 0x22, 0xAA, 0x00, 0x14, 0xBE, 0x00, 0x08, 0xAA, 0x00, 0x12, 0xBE, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0xA7, 0x80, 0x2A, 0xC8, 0x00, 0x2A, 0xFF, 0x00, 0x09, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E90, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x18, 0x9F, 0x80, 0x10, 0x84, 0x00, 0x63, 0xEF, 0x00, 0x28, 0x09, 0x00, 0x19, 0x49, 0x00, 0x12, 0x2F, 0x00, 0x25, 0x49, 0x00, 0x7D, 0x49, 0x00, 0x15, 0xCF, 0x00, 0x10, 0x89, 0x00, 0x54, 0x89, 0x00, 0x55, 0xCF, 0x00, 0x51, 0x40, 0x00, 0x13, 0x69, 0x00, 0x10, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E91, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x65, 0xFF, 0x80, 0x2D, 0x10, 0x80, 0x19, 0x7E, 0x00, 0x11, 0x10, 0x80, 0x25, 0x7F, 0x80, 0x7D, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x56, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x10, 0xA9, 0x00, 0x11, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E92, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x19, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x65, 0x49, 0x00, 0x2D, 0x7F, 0x00, 0x19, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x25, 0x08, 0x00, 0x7D, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x55, 0x55, 0x00, 0x55, 0x88, 0x80, 0x55, 0x3E, 0x00, 0x12, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E93, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x12, 0x94, 0x80, 0x22, 0xF7, 0x80, 0x14, 0x94, 0x80, 0x0A, 0xF7, 0x80, 0x13, 0x94, 0x80, 0x3D, 0xF7, 0x80, 0x08, 0x54, 0x80, 0x0A, 0xA8, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x42, 0x00, 0x2A, 0xE4, 0x00, 0x2B, 0x18, 0x00, 0x08, 0x66, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E94, { 0x00, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x1B, 0x08, 0x00, 0x11, 0xFF, 0x00, 0x65, 0x01, 0x00, 0x2D, 0xFF, 0x00, 0x18, 0x88, 0x00, 0x10, 0xEF, 0x00, 0x24, 0x88, 0x80, 0x7D, 0xE7, 0x80, 0x14, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x4A, 0x00, 0x10, 0xC8, 0x80, 0x13, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E95, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x64, 0xEE, 0x00, 0x2C, 0xAA, 0x00, 0x18, 0xEE, 0x00, 0x10, 0x44, 0x00, 0x24, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x14, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x24, 0x00, 0x55, 0xC5, 0x00, 0x10, 0x72, 0x00, 0x11, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E96, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xA5, 0x00, 0x14, 0xA4, 0x80, 0x15, 0x54, 0x00, 0x2A, 0x4C, 0x00, 0x1B, 0xFF, 0x80, 0x12, 0x54, 0x00, 0x3F, 0xDC, 0x80, 0x0A, 0x55, 0x00, 0x09, 0xDD, 0x00, 0x2A, 0x56, 0x00, 0x2B, 0xDC, 0x00, 0x2A, 0x6C, 0x00, 0x29, 0x92, 0x80, 0x08, 0x61, 0x80, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E98, { 0x00, 0x00, 0x00, 0x09, 0x54, 0x00, 0x09, 0xFF, 0x00, 0x12, 0x44, 0x00, 0x23, 0xFF, 0x80, 0x14, 0xAA, 0x00, 0x08, 0xAA, 0x80, 0x15, 0x33, 0x80, 0x3E, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E9A, { 0x00, 0x00, 0x00, 0x09, 0xEF, 0x80, 0x18, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x65, 0x28, 0x80, 0x2D, 0x6A, 0x80, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x25, 0x24, 0x00, 0x7D, 0xFF, 0x00, 0x15, 0x25, 0x00, 0x11, 0xFF, 0x00, 0x55, 0x44, 0x00, 0x55, 0x77, 0x00, 0x55, 0x44, 0x00, 0x12, 0x74, 0x80, 0x10, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E9B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x17, 0x8C, 0x00, 0x1F, 0xB7, 0x00, 0x14, 0x94, 0x80, 0x3F, 0xFF, 0x80, 0x15, 0x55, 0x00, 0x25, 0x14, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E9C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xAB, 0x80, 0x11, 0x10, 0x80, 0x15, 0xEB, 0x80, 0x25, 0x10, 0x80, 0x19, 0xEB, 0x80, 0x15, 0xFF, 0x80, 0x27, 0x00, 0x80, 0x3A, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x24, 0x00, 0x08, 0xC4, 0x80, 0x0B, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7E9D, { 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x64, 0x92, 0x00, 0x2F, 0xFF, 0x80, 0x1A, 0xAA, 0x80, 0x13, 0xEF, 0x80, 0x22, 0xAA, 0x80, 0x7F, 0xEF, 0x80, 0x14, 0x24, 0x00, 0x10, 0xC8, 0x00, 0x54, 0x51, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x10, 0x80, 0x10, 0x92, 0x00, 0x11, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E9E, { 0x00, 0x00, 0x00, 0x08, 0x99, 0x00, 0x19, 0x02, 0x00, 0x11, 0x5A, 0x80, 0x64, 0x81, 0x00, 0x2D, 0x5A, 0x80, 0x19, 0xC3, 0x80, 0x10, 0x99, 0x00, 0x24, 0x81, 0x00, 0x7D, 0xFB, 0x80, 0x16, 0xAD, 0x00, 0x10, 0xB9, 0x00, 0x54, 0x00, 0x00, 0x54, 0x11, 0x00, 0x54, 0xA8, 0x80, 0x10, 0xA2, 0x80, 0x11, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7E9F, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x09, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA0, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x42, 0x00, 0x11, 0x42, 0x00, 0x3F, 0x42, 0x00, 0x02, 0x42, 0x00, 0x04, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0x5E, 0x00, 0x10, 0x62, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x38, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x90, 0x00, 0x11, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0x10, 0x00, 0x38, 0x10, 0x00, 0x10, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x22, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x12, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA3, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0x04, 0x00, 0x12, 0x04, 0x00, 0x3E, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x44, 0x00, 0x3F, 0x24, 0x00, 0x10, 0x24, 0x00, 0x00, 0x04, 0x00, 0x07, 0x04, 0x00, 0x38, 0x04, 0x00, 0x10, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA4, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x11, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA5, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x08, 0x42, 0x00, 0x09, 0x7F, 0x00, 0x12, 0x80, 0x00, 0x3E, 0x00, 0x00, 0x04, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x10, 0x08, 0x00, 0x3F, 0x10, 0x00, 0x10, 0x20, 0x00, 0x00, 0x40, 0x00, 0x07, 0x81, 0x00, 0x38, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA6, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x82, 0x00, 0x22, 0xFF, 0x00, 0x7D, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x10, 0x42, 0x00, 0x20, 0x32, 0x00, 0x7E, 0x12, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x70, 0x22, 0x00, 0x20, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA7, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x24, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x08, 0x9E, 0x00, 0x10, 0xC2, 0x00, 0x20, 0xC4, 0x00, 0x7C, 0xA4, 0x00, 0x01, 0x28, 0x00, 0x01, 0x10, 0x00, 0x0D, 0x28, 0x00, 0x72, 0x44, 0x00, 0x24, 0x87, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA8, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x12, 0xFE, 0x00, 0x3E, 0x24, 0x00, 0x04, 0x24, 0x00, 0x08, 0xA4, 0x00, 0x10, 0x64, 0x00, 0x3F, 0x24, 0x00, 0x10, 0x54, 0x00, 0x00, 0x44, 0x00, 0x07, 0x45, 0x00, 0x38, 0x85, 0x00, 0x10, 0x85, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EA9, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x12, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x10, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x10, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0x00, 0x39, 0x00, 0x00, 0x12, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EAA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x12, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7E, 0x80, 0x00, 0x20, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0E, 0x81, 0x00, 0x70, 0x81, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EAB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x22, 0x00, 0x22, 0x22, 0x00, 0x7C, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x11, 0x22, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x70, 0x82, 0x00, 0x21, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EAC, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x7C, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x20, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x0E, 0x2A, 0x00, 0x70, 0x24, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EAD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x12, 0x00, 0x00, 0x3E, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x07, 0x44, 0x00, 0x38, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EAF, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x7D, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0x24, 0x00, 0x21, 0x24, 0x00, 0x7D, 0xFC, 0x00, 0x21, 0x24, 0x00, 0x00, 0x20, 0x00, 0x0C, 0x21, 0x00, 0x70, 0x21, 0x00, 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB0, { 0x00, 0x00, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x08, 0x90, 0x00, 0x09, 0x90, 0x00, 0x12, 0x92, 0x00, 0x3E, 0x96, 0x00, 0x04, 0xF8, 0x00, 0x08, 0x90, 0x00, 0x10, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x10, 0x90, 0x00, 0x00, 0x90, 0x00, 0x07, 0xB1, 0x00, 0x38, 0xD1, 0x00, 0x10, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x24, 0xA8, 0x00, 0x7C, 0xA4, 0x00, 0x09, 0x23, 0x00, 0x11, 0x21, 0x00, 0x22, 0x24, 0x00, 0x7C, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x70, 0x40, 0x00, 0x21, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB2, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x02, 0x00, 0x25, 0x02, 0x00, 0x25, 0x86, 0x00, 0x79, 0x46, 0x00, 0x09, 0x2A, 0x00, 0x11, 0x12, 0x00, 0x21, 0x12, 0x00, 0x7D, 0x2A, 0x00, 0x21, 0x46, 0x00, 0x01, 0x86, 0x00, 0x0D, 0x02, 0x00, 0x71, 0x02, 0x00, 0x21, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x25, 0x22, 0x00, 0x7D, 0x22, 0x00, 0x09, 0x22, 0x00, 0x11, 0x22, 0x00, 0x21, 0x52, 0x00, 0x7D, 0x4A, 0x00, 0x01, 0x8A, 0x00, 0x01, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x71, 0x02, 0x00, 0x21, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB5, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x22, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x20, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x21, 0x54, 0x00, 0x01, 0x54, 0x00, 0x0E, 0x24, 0x00, 0x72, 0x22, 0x00, 0x24, 0x41, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x10, 0x50, 0x00, 0x12, 0x88, 0x00, 0x3F, 0x07, 0x00, 0x02, 0x02, 0x00, 0x04, 0x80, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x98, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x06, 0x82, 0x00, 0x38, 0x82, 0x00, 0x10, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x48, 0x00, 0x24, 0x48, 0x00, 0x7C, 0x84, 0x00, 0x08, 0x87, 0x00, 0x11, 0x02, 0x00, 0x22, 0xFC, 0x00, 0x7C, 0x44, 0x00, 0x20, 0x44, 0x00, 0x00, 0x44, 0x00, 0x0C, 0x84, 0x00, 0x70, 0x84, 0x00, 0x21, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x11, 0xF0, 0x00, 0x11, 0x10, 0x00, 0x23, 0x10, 0x00, 0x7D, 0x10, 0x00, 0x09, 0x14, 0x00, 0x11, 0xFE, 0x00, 0x21, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x0F, 0x08, 0x00, 0x71, 0x49, 0x00, 0x21, 0x85, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EB9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x7D, 0x04, 0x00, 0x08, 0x88, 0x00, 0x10, 0x88, 0x00, 0x20, 0x50, 0x00, 0x7E, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x0E, 0x50, 0x00, 0x70, 0x88, 0x00, 0x21, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EBA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x7E, 0x40, 0x00, 0x08, 0x44, 0x00, 0x10, 0x7E, 0x00, 0x20, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x20, 0x44, 0x00, 0x00, 0x44, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x84, 0x00, 0x21, 0x28, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EBD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x24, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x08, 0x84, 0x00, 0x13, 0xFC, 0x00, 0x20, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x70, 0x84, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EBE, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x08, 0x28, 0x00, 0x12, 0x10, 0x00, 0x3E, 0x08, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x10, 0x12, 0x00, 0x3F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0x10, 0x00, 0x38, 0x10, 0x00, 0x10, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EBF, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x20, 0x00, 0x11, 0x3E, 0x00, 0x3F, 0xE0, 0x00, 0x04, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x11, 0xE0, 0x00, 0x3E, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x30, 0x00, 0x70, 0x49, 0x00, 0x21, 0x85, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC0, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0x44, 0x00, 0x13, 0xFF, 0x00, 0x3E, 0x44, 0x00, 0x04, 0x44, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x3F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x00, 0x44, 0x00, 0x07, 0x44, 0x00, 0x38, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC1, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x7E, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x00, 0xBC, 0x00, 0x0E, 0x80, 0x00, 0x70, 0x80, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC2, { 0x00, 0x00, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x10, 0x48, 0x00, 0x12, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x7C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0xFC, 0x00, 0x20, 0x84, 0x00, 0x7E, 0x84, 0x00, 0x21, 0x48, 0x00, 0x01, 0x30, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x28, 0x00, 0x24, 0x47, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x24, 0x50, 0x00, 0x7D, 0xF8, 0x00, 0x08, 0x90, 0x00, 0x10, 0x90, 0x00, 0x21, 0x12, 0x00, 0x7D, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x54, 0x00, 0x1C, 0x93, 0x00, 0x61, 0x11, 0x00, 0x22, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x22, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x7E, 0x84, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x84, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x22, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x20, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x0E, 0x92, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x22, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x20, 0xFE, 0x00, 0x7E, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x70, 0x92, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x22, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x0E, 0x24, 0x00, 0x70, 0x42, 0x00, 0x20, 0x81, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC8, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x84, 0x00, 0x22, 0xC8, 0x00, 0x7D, 0x28, 0x00, 0x08, 0x10, 0x00, 0x10, 0x28, 0x00, 0x20, 0x44, 0x00, 0x7E, 0x87, 0x00, 0x01, 0x32, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x04, 0x00, 0x70, 0x60, 0x00, 0x20, 0x18, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EC9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x7C, 0x00, 0x12, 0x84, 0x00, 0x25, 0x08, 0x00, 0x7C, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x20, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x70, 0x02, 0x00, 0x21, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ECA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x92, 0x00, 0x10, 0x56, 0x00, 0x22, 0x58, 0x00, 0x7C, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x7E, 0x12, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ECB, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x13, 0xFF, 0x00, 0x24, 0x4A, 0x00, 0x7C, 0x4A, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x48, 0x00, 0x23, 0x48, 0x00, 0x7D, 0xFF, 0x00, 0x20, 0x49, 0x00, 0x00, 0x49, 0x00, 0x0E, 0x4D, 0x00, 0x70, 0x8A, 0x00, 0x20, 0x88, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ECC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x12, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x10, 0x92, 0x00, 0x00, 0x92, 0x00, 0x06, 0x92, 0x00, 0x38, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ECD, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x22, 0x42, 0x00, 0x7C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x0A, 0x00, 0x22, 0x04, 0x00, 0x7E, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ECE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x10, 0x28, 0x00, 0x22, 0x10, 0x00, 0x7C, 0x28, 0x00, 0x08, 0x47, 0x00, 0x11, 0x92, 0x00, 0x20, 0x10, 0x00, 0x7E, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x0E, 0xFF, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ECF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x22, 0x18, 0x00, 0x7E, 0x24, 0x00, 0x04, 0x43, 0x00, 0x09, 0x81, 0x00, 0x10, 0x00, 0x00, 0x20, 0xFE, 0x00, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x12, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x24, 0x44, 0x00, 0x7C, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED1, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x10, 0x91, 0x00, 0x13, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x78, 0x94, 0x00, 0x13, 0xF2, 0x00, 0x20, 0x92, 0x00, 0x7C, 0x91, 0x00, 0x23, 0xF1, 0x00, 0x00, 0x91, 0x00, 0x0C, 0x9A, 0x00, 0x71, 0x14, 0x00, 0x21, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x10, 0x14, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x94, 0x00, 0x23, 0xF4, 0x00, 0x7C, 0x94, 0x00, 0x00, 0x98, 0x00, 0x00, 0x90, 0x00, 0x0D, 0x28, 0x00, 0x71, 0x49, 0x00, 0x22, 0x85, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED3, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x06, 0x82, 0x00, 0x38, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x50, 0x00, 0x24, 0x50, 0x00, 0x7C, 0x88, 0x00, 0x09, 0xFC, 0x00, 0x12, 0x03, 0x00, 0x21, 0xFE, 0x00, 0x7E, 0x80, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x70, 0x44, 0x00, 0x20, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED5, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x44, 0x00, 0x10, 0x7E, 0x00, 0x23, 0xC0, 0x00, 0x7C, 0x28, 0x00, 0x08, 0x11, 0x00, 0x10, 0x69, 0x00, 0x23, 0x87, 0x00, 0x7C, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x90, 0x00, 0x0C, 0x90, 0x00, 0x70, 0x91, 0x00, 0x21, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x10, 0xBE, 0x00, 0x12, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x11, 0x84, 0x00, 0x22, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x84, 0x00, 0x20, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x24, 0x88, 0x00, 0x7D, 0x07, 0x00, 0x0A, 0xFA, 0x00, 0x10, 0x00, 0x00, 0x20, 0x04, 0x00, 0x7D, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0C, 0x48, 0x00, 0x70, 0x84, 0x00, 0x21, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7ED9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x50, 0x00, 0x24, 0x88, 0x00, 0x7D, 0x07, 0x00, 0x0A, 0x02, 0x00, 0x11, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x7C, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x71, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EDA, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7F, 0x00, 0x22, 0x82, 0x00, 0x7D, 0x02, 0x00, 0x08, 0xFA, 0x00, 0x10, 0x8A, 0x00, 0x20, 0x8A, 0x00, 0x7E, 0xFA, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x8A, 0x00, 0x0E, 0xFA, 0x00, 0x70, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EDB, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x11, 0x88, 0x00, 0x12, 0x50, 0x00, 0x20, 0x20, 0x00, 0x7C, 0x50, 0x00, 0x08, 0xAC, 0x00, 0x13, 0x23, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x20, 0x00, 0x21, 0x24, 0x00, 0x03, 0xFE, 0x00, 0x0C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EDC, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x82, 0x00, 0x25, 0x44, 0x00, 0x7C, 0x28, 0x00, 0x08, 0x10, 0x00, 0x10, 0x28, 0x00, 0x20, 0xC7, 0x00, 0x7D, 0xFE, 0x00, 0x02, 0x82, 0x00, 0x00, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EDD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3C, 0x00, 0x10, 0x48, 0x00, 0x22, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x7E, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x80, 0x00, 0x0E, 0x80, 0x00, 0x70, 0x81, 0x00, 0x20, 0x81, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EDE, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x7C, 0x44, 0x00, 0x08, 0x83, 0x00, 0x11, 0x01, 0x00, 0x20, 0x44, 0x00, 0x7E, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x0E, 0x28, 0x00, 0x70, 0x44, 0x00, 0x20, 0x83, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EDF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x24, 0x40, 0x00, 0x7C, 0x88, 0x00, 0x09, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x20, 0x92, 0x00, 0x7C, 0x90, 0x00, 0x20, 0x90, 0x00, 0x00, 0x90, 0x00, 0x0D, 0x11, 0x00, 0x71, 0x11, 0x00, 0x22, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE0, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x25, 0x24, 0x00, 0x7D, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x21, 0x24, 0x00, 0x7D, 0xFC, 0x00, 0x21, 0x20, 0x00, 0x00, 0xA0, 0x00, 0x0C, 0x40, 0x00, 0x70, 0xB0, 0x00, 0x21, 0x0F, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE1, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x92, 0x00, 0x08, 0x54, 0x00, 0x08, 0x58, 0x00, 0x12, 0x12, 0x00, 0x3E, 0xFF, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x3F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x07, 0x82, 0x00, 0x38, 0x82, 0x00, 0x10, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE2, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x7E, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x70, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE3, { 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x09, 0xF0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x27, 0xFE, 0x00, 0x7C, 0x70, 0x00, 0x08, 0xA8, 0x00, 0x11, 0x27, 0x00, 0x22, 0xFC, 0x00, 0x7C, 0x44, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4E, 0x00, 0x0C, 0x82, 0x00, 0x70, 0x82, 0x00, 0x21, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE5, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x0B, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x11, 0x24, 0x00, 0x20, 0xA8, 0x00, 0x7C, 0x10, 0x00, 0x08, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x20, 0x84, 0x00, 0x7C, 0x84, 0x00, 0x21, 0x08, 0x00, 0x00, 0x88, 0x00, 0x0C, 0x50, 0x00, 0x70, 0x20, 0x00, 0x20, 0xD8, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE6, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0xFC, 0x00, 0x11, 0x88, 0x00, 0x26, 0x50, 0x00, 0x7C, 0x20, 0x00, 0x08, 0x50, 0x00, 0x10, 0x88, 0x00, 0x23, 0x27, 0x00, 0x7C, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x0C, 0xA8, 0x00, 0x71, 0x26, 0x00, 0x22, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x92, 0x00, 0x25, 0x56, 0x00, 0x7D, 0x38, 0x00, 0x09, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x21, 0x10, 0x00, 0x7D, 0x38, 0x00, 0x21, 0x56, 0x00, 0x01, 0x92, 0x00, 0x0D, 0x10, 0x00, 0x71, 0x12, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE8, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x10, 0x50, 0x00, 0x13, 0xFC, 0x00, 0x24, 0x24, 0x00, 0x7C, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x20, 0x00, 0x21, 0x22, 0x00, 0x7D, 0xFF, 0x00, 0x20, 0x62, 0x00, 0x02, 0x62, 0x00, 0x0C, 0xAA, 0x00, 0x71, 0x24, 0x00, 0x22, 0x20, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EE9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x24, 0xF8, 0x00, 0x7C, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x7D, 0x04, 0x00, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x0D, 0x24, 0x00, 0x70, 0x48, 0x00, 0x20, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EEA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x28, 0x00, 0x24, 0x30, 0x00, 0x7C, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x21, 0xFE, 0x00, 0x7E, 0x84, 0x00, 0x04, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x84, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EEB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x10, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x24, 0x12, 0x00, 0x7D, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x10, 0xA3, 0x00, 0x21, 0x3D, 0x00, 0x7E, 0x44, 0x00, 0x20, 0x48, 0x00, 0x00, 0xA8, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x28, 0x00, 0x20, 0xC7, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EED, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x24, 0x20, 0x00, 0x7F, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x10, 0x54, 0x00, 0x21, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x0E, 0x30, 0x00, 0x70, 0x48, 0x00, 0x20, 0x86, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EEE, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x24, 0x58, 0x00, 0x7C, 0x8A, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x21, 0xE4, 0x00, 0x7D, 0x24, 0x00, 0x21, 0x24, 0x00, 0x01, 0x24, 0x00, 0x0D, 0xE4, 0x00, 0x71, 0x04, 0x00, 0x20, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EEF, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x10, 0x2A, 0x00, 0x11, 0xEF, 0x00, 0x24, 0x28, 0x00, 0x7C, 0x28, 0x00, 0x08, 0x2A, 0x00, 0x11, 0xEF, 0x00, 0x20, 0x28, 0x00, 0x7E, 0x28, 0x00, 0x20, 0x2A, 0x00, 0x01, 0xEF, 0x00, 0x0E, 0x28, 0x00, 0x70, 0x28, 0x00, 0x20, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF0, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x25, 0xFE, 0x00, 0x7D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x7C, 0x20, 0x00, 0x20, 0x22, 0x00, 0x03, 0xFF, 0x00, 0x0C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA8, 0x00, 0x24, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0xFA, 0x00, 0x7E, 0x8A, 0x00, 0x22, 0x8A, 0x00, 0x02, 0x8A, 0x00, 0x0E, 0xFA, 0x00, 0x72, 0x02, 0x00, 0x22, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF2, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x08, 0x00, 0x3E, 0x89, 0x00, 0x10, 0x8B, 0x00, 0x00, 0xEC, 0x00, 0x06, 0x88, 0x00, 0x38, 0xA9, 0x00, 0x10, 0xC9, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF3, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x7C, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x7F, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x02, 0x22, 0x00, 0x0F, 0xFE, 0x00, 0x72, 0x20, 0x00, 0x20, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF4, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x7D, 0x88, 0x00, 0x0A, 0xFE, 0x00, 0x10, 0x88, 0x00, 0x20, 0x88, 0x00, 0x7E, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x0E, 0x8A, 0x00, 0x70, 0xFF, 0x00, 0x20, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF5, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x44, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x10, 0x22, 0x00, 0x23, 0xFF, 0x00, 0x7E, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x22, 0x00, 0x0E, 0x2A, 0x00, 0x72, 0x24, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF6, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x0B, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x11, 0x24, 0x00, 0x20, 0xA8, 0x00, 0x7B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x14, 0x02, 0x00, 0x20, 0xF8, 0x00, 0x7E, 0x08, 0x00, 0x20, 0x88, 0x00, 0x00, 0x50, 0x00, 0x0E, 0x20, 0x00, 0x70, 0x50, 0x00, 0x20, 0x8F, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF7, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xDF, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x22, 0x52, 0x00, 0x7F, 0xDE, 0x00, 0x0A, 0x52, 0x00, 0x12, 0x52, 0x00, 0x22, 0x52, 0x00, 0x7F, 0xDE, 0x00, 0x22, 0x52, 0x00, 0x02, 0x52, 0x00, 0x0E, 0x52, 0x00, 0x72, 0x62, 0x00, 0x25, 0x4A, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EF8, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x26, 0xFA, 0x00, 0x7E, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x12, 0xFA, 0x00, 0x22, 0x02, 0x00, 0x7E, 0xFA, 0x00, 0x02, 0x8A, 0x00, 0x02, 0x8A, 0x00, 0x0E, 0x8A, 0x00, 0x72, 0xFA, 0x00, 0x24, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EFA, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x10, 0xE8, 0x00, 0x12, 0xAC, 0x00, 0x25, 0x2B, 0x00, 0x7D, 0xA9, 0x00, 0x0A, 0x48, 0x00, 0x10, 0xA8, 0x00, 0x21, 0x1F, 0x00, 0x7E, 0x04, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x84, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EFB, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x10, 0x20, 0x00, 0x23, 0xFE, 0x00, 0x7C, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x20, 0x88, 0x00, 0x7D, 0xFF, 0x00, 0x22, 0x8A, 0x00, 0x00, 0x88, 0x00, 0x0E, 0xA8, 0x00, 0x70, 0x92, 0x00, 0x20, 0x82, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EFC, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x22, 0x02, 0x00, 0x7C, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x21, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x54, 0x00, 0x00, 0x92, 0x00, 0x0C, 0x91, 0x00, 0x71, 0x11, 0x00, 0x20, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EFD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x22, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x20, 0x54, 0x00, 0x7E, 0x5E, 0x00, 0x20, 0x50, 0x00, 0x00, 0x90, 0x00, 0x0E, 0xD0, 0x00, 0x71, 0x33, 0x00, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EFE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x20, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x26, 0x01, 0x00, 0x79, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x11, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x7F, 0x00, 0x00, 0x21, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x0F, 0x02, 0x00, 0x71, 0x02, 0x00, 0x21, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7EFF, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0xFC, 0x00, 0x22, 0x04, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x11, 0x22, 0x00, 0x20, 0xA6, 0x00, 0x7C, 0xA8, 0x00, 0x00, 0x70, 0x00, 0x00, 0xA8, 0x00, 0x0D, 0x24, 0x00, 0x72, 0x27, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F00, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x12, 0x52, 0x00, 0x11, 0x54, 0x00, 0x20, 0x88, 0x00, 0x7D, 0x54, 0x00, 0x09, 0x53, 0x00, 0x12, 0x20, 0x00, 0x23, 0xDE, 0x00, 0x7E, 0x52, 0x00, 0x02, 0x52, 0x00, 0x01, 0x54, 0x00, 0x0C, 0x88, 0x00, 0x71, 0x54, 0x00, 0x22, 0x23, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F01, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x11, 0x24, 0x00, 0x12, 0x48, 0x00, 0x25, 0x24, 0x00, 0x7C, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x7E, 0x22, 0x00, 0x22, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x0E, 0x22, 0x00, 0x72, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F02, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x24, 0xF8, 0x00, 0x7C, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x21, 0x24, 0x00, 0x7D, 0xFC, 0x00, 0x20, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x0C, 0x20, 0x00, 0x70, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F03, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x7C, 0x92, 0x00, 0x09, 0x9E, 0x00, 0x11, 0xD2, 0x00, 0x22, 0xB2, 0x00, 0x7E, 0x92, 0x00, 0x24, 0x9E, 0x00, 0x00, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x70, 0x92, 0x00, 0x20, 0x9E, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F04, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x10, 0x0A, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0xE8, 0x00, 0x12, 0x0A, 0x00, 0x22, 0xEA, 0x00, 0x7E, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x02, 0xAC, 0x00, 0x0E, 0xE8, 0x00, 0x72, 0x95, 0x00, 0x24, 0x23, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F05, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x42, 0x00, 0x25, 0xFF, 0x00, 0x7D, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x11, 0x7A, 0x00, 0x21, 0x4A, 0x00, 0x7D, 0x4A, 0x00, 0x01, 0x7A, 0x00, 0x01, 0x4A, 0x00, 0x0D, 0x4A, 0x00, 0x71, 0x4A, 0x00, 0x21, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F06, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x09, 0x48, 0x00, 0x11, 0x4F, 0x00, 0x11, 0x54, 0x00, 0x21, 0x62, 0x00, 0x7F, 0x42, 0x00, 0x04, 0x44, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x7F, 0x24, 0x00, 0x01, 0x24, 0x00, 0x01, 0x34, 0x00, 0x0E, 0x50, 0x00, 0x70, 0x51, 0x00, 0x20, 0x91, 0x00, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F07, { 0x00, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x7D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x7C, 0x20, 0x00, 0x01, 0x24, 0x00, 0x01, 0x3E, 0x00, 0x0D, 0x20, 0x00, 0x71, 0xA0, 0x00, 0x22, 0x63, 0x00, 0x0C, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F08, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x13, 0xE8, 0x00, 0x12, 0x48, 0x00, 0x26, 0x5C, 0x00, 0x7E, 0x5B, 0x00, 0x0B, 0xE9, 0x00, 0x12, 0x48, 0x00, 0x22, 0x4A, 0x00, 0x7F, 0xCA, 0x00, 0x22, 0x4C, 0x00, 0x02, 0x44, 0x00, 0x0E, 0x48, 0x00, 0x73, 0xD0, 0x00, 0x22, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F09, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x7C, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x20, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x73, 0xFF, 0x00, 0x20, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F0B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x7C, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x21, 0x24, 0x00, 0x01, 0x24, 0x00, 0x0D, 0x44, 0x00, 0x70, 0x58, 0x00, 0x20, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F0C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x25, 0x24, 0x00, 0x7D, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x11, 0x24, 0x00, 0x21, 0xFC, 0x00, 0x7C, 0x40, 0x00, 0x20, 0xA0, 0x00, 0x02, 0x92, 0x00, 0x0E, 0x81, 0x00, 0x72, 0x85, 0x00, 0x24, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F0D, { 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x09, 0xF0, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x24, 0xA8, 0x00, 0x7C, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x13, 0xFE, 0x00, 0x20, 0xA8, 0x00, 0x7C, 0xA8, 0x00, 0x20, 0xAA, 0x00, 0x03, 0xFF, 0x00, 0x0C, 0x20, 0x00, 0x70, 0x24, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F0E, { 0x00, 0x00, 0x00, 0x10, 0xC4, 0x00, 0x13, 0x3E, 0x00, 0x12, 0x24, 0x00, 0x22, 0x24, 0x00, 0x27, 0xA4, 0x00, 0x7A, 0x24, 0x00, 0x12, 0x43, 0x00, 0x23, 0x80, 0x00, 0x22, 0xFE, 0x00, 0x7E, 0x44, 0x00, 0x02, 0x28, 0x00, 0x07, 0x90, 0x00, 0x1A, 0x28, 0x00, 0x62, 0x44, 0x00, 0x02, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F0F, { 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x12, 0xFE, 0x00, 0x26, 0x92, 0x00, 0x7A, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x22, 0x92, 0x00, 0x7E, 0xFE, 0x00, 0x22, 0x50, 0x00, 0x02, 0x50, 0x00, 0x0E, 0x20, 0x00, 0x72, 0x30, 0x00, 0x22, 0x4C, 0x00, 0x03, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F11, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0xBE, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x25, 0xFF, 0x00, 0x7B, 0x20, 0x00, 0x0D, 0x24, 0x00, 0x11, 0x7E, 0x00, 0x21, 0x90, 0x00, 0x7D, 0x12, 0x00, 0x21, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x0D, 0x10, 0x00, 0x71, 0x28, 0x00, 0x21, 0x47, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F12, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x24, 0x00, 0x11, 0x7E, 0x00, 0x11, 0x44, 0x00, 0x24, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x0B, 0x7C, 0x00, 0x11, 0x40, 0x00, 0x21, 0x7C, 0x00, 0x7D, 0x44, 0x00, 0x21, 0x44, 0x00, 0x01, 0x44, 0x00, 0x0D, 0x7C, 0x00, 0x72, 0x80, 0x00, 0x24, 0x43, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F13, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x09, 0xF8, 0x00, 0x11, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x22, 0x10, 0x00, 0x7D, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0xC4, 0x00, 0x00, 0xA8, 0x00, 0x0D, 0x10, 0x00, 0x72, 0x28, 0x00, 0x24, 0xC7, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F14, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x88, 0x00, 0x24, 0x50, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x21, 0x00, 0x14, 0x22, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x24, 0x00, 0x21, 0x24, 0x00, 0x01, 0x24, 0x00, 0x0D, 0x24, 0x00, 0x71, 0x2C, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F15, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x10, 0x20, 0x00, 0x23, 0xFF, 0x00, 0x7C, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x12, 0x22, 0x00, 0x20, 0x40, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x0C, 0xD8, 0x00, 0x70, 0x20, 0x00, 0x20, 0xD8, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F16, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x25, 0x04, 0x00, 0x7D, 0xFC, 0x00, 0x09, 0x00, 0x00, 0x11, 0x02, 0x00, 0x21, 0xFF, 0x00, 0x7B, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x01, 0xFE, 0x00, 0x0D, 0x4A, 0x00, 0x71, 0x4A, 0x00, 0x21, 0x4A, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F17, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x25, 0x20, 0x00, 0x7D, 0xFE, 0x00, 0x09, 0x10, 0x00, 0x11, 0x49, 0x00, 0x21, 0x87, 0x00, 0x7E, 0xFC, 0x00, 0x20, 0x84, 0x00, 0x00, 0x84, 0x00, 0x0E, 0xFC, 0x00, 0x70, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F18, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x10, 0x84, 0x00, 0x11, 0xF8, 0x00, 0x24, 0x0A, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x10, 0xC4, 0x00, 0x21, 0x28, 0x00, 0x7E, 0x70, 0x00, 0x00, 0xB0, 0x00, 0x01, 0x28, 0x00, 0x0E, 0x64, 0x00, 0x70, 0xA7, 0x00, 0x23, 0x22, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F19, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x11, 0x4A, 0x00, 0x24, 0xCC, 0x00, 0x7C, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x20, 0xFE, 0x00, 0x7E, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x84, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F1A, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x24, 0x00, 0x20, 0x08, 0x00, 0x03, 0xFF, 0x00, 0x0D, 0x08, 0x00, 0x70, 0x88, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F1B, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFC, 0x00, 0x26, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x0A, 0xA4, 0x00, 0x12, 0x98, 0x00, 0x22, 0xC7, 0x00, 0x7E, 0x08, 0x00, 0x23, 0xFF, 0x00, 0x02, 0x48, 0x00, 0x0E, 0x28, 0x00, 0x72, 0x08, 0x00, 0x24, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F1C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x0F, 0xFF, 0x00, 0x70, 0x88, 0x00, 0x21, 0x06, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F1D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x12, 0x44, 0x00, 0x11, 0xA8, 0x00, 0x25, 0x10, 0x00, 0x7C, 0x6C, 0x00, 0x0B, 0x93, 0x00, 0x11, 0x7C, 0x00, 0x21, 0x10, 0x00, 0x7D, 0x7C, 0x00, 0x21, 0x10, 0x00, 0x01, 0xFE, 0x00, 0x0D, 0x10, 0x00, 0x71, 0x10, 0x00, 0x22, 0x93, 0x00, 0x04, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F1F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x24, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x10, 0x02, 0x00, 0x21, 0xFF, 0x00, 0x7D, 0x02, 0x00, 0x21, 0x7A, 0x00, 0x01, 0x4A, 0x00, 0x0D, 0x4A, 0x00, 0x71, 0x7A, 0x00, 0x21, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F20, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x26, 0xFE, 0x00, 0x7A, 0x92, 0x00, 0x12, 0x92, 0x00, 0x22, 0xFE, 0x00, 0x7E, 0x92, 0x00, 0x02, 0x92, 0x00, 0x02, 0xFE, 0x00, 0x0E, 0x10, 0x00, 0x72, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F21, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x25, 0x54, 0x00, 0x7D, 0x24, 0x00, 0x09, 0x54, 0x00, 0x11, 0xFC, 0x00, 0x20, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x02, 0x4A, 0x00, 0x0E, 0xFA, 0x00, 0x72, 0x02, 0x00, 0x22, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F22, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x00, 0x00, 0x25, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x08, 0x88, 0x00, 0x11, 0x04, 0x00, 0x22, 0x02, 0x00, 0x7D, 0xFC, 0x00, 0x21, 0x54, 0x00, 0x01, 0x54, 0x00, 0x0D, 0x54, 0x00, 0x71, 0x54, 0x00, 0x27, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F23, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x52, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x25, 0xFC, 0x00, 0x7C, 0x54, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x20, 0x54, 0x00, 0x7D, 0xFC, 0x00, 0x20, 0x50, 0x00, 0x00, 0xD8, 0x00, 0x0D, 0x54, 0x00, 0x72, 0x57, 0x00, 0x24, 0x52, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F24, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x24, 0x1A, 0x00, 0x7C, 0xE0, 0x00, 0x08, 0x84, 0x00, 0x10, 0xFE, 0x00, 0x20, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x20, 0x8A, 0x00, 0x03, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x88, 0x00, 0x21, 0x06, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F25, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x50, 0x00, 0x14, 0x52, 0x00, 0x27, 0xFF, 0x00, 0x7A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x13, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x7D, 0xFC, 0x00, 0x20, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0C, 0xA8, 0x00, 0x71, 0x26, 0x00, 0x22, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F26, { 0x00, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x12, 0x52, 0x00, 0x23, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x21, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x0C, 0xD8, 0x00, 0x70, 0x20, 0x00, 0x21, 0xD8, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F27, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x17, 0xFE, 0x00, 0x2A, 0x22, 0x00, 0x7B, 0xFE, 0x00, 0x0A, 0x42, 0x00, 0x10, 0x88, 0x00, 0x21, 0xF0, 0x00, 0x7C, 0x20, 0x00, 0x20, 0x44, 0x00, 0x03, 0xFE, 0x00, 0x0C, 0xA8, 0x00, 0x71, 0x26, 0x00, 0x22, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F28, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x12, 0x52, 0x00, 0x12, 0xD6, 0x00, 0x22, 0xD6, 0x00, 0x7F, 0x5A, 0x00, 0x09, 0x8C, 0x00, 0x12, 0x52, 0x00, 0x20, 0x40, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x48, 0x00, 0x00, 0x88, 0x00, 0x0E, 0x50, 0x00, 0x70, 0x20, 0x00, 0x20, 0xD8, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F29, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x24, 0x82, 0x00, 0x78, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x13, 0x22, 0x00, 0x25, 0x7F, 0x00, 0x7D, 0x42, 0x00, 0x21, 0x42, 0x00, 0x01, 0x7E, 0x00, 0x0D, 0x42, 0x00, 0x71, 0x42, 0x00, 0x21, 0x7E, 0x00, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F2A, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xDF, 0x00, 0x12, 0x52, 0x00, 0x11, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x7A, 0x52, 0x00, 0x08, 0x28, 0x00, 0x10, 0x44, 0x00, 0x20, 0x92, 0x00, 0x7D, 0x21, 0x00, 0x22, 0xC8, 0x00, 0x00, 0x30, 0x00, 0x0C, 0xC4, 0x00, 0x70, 0x18, 0x00, 0x20, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F2B, { 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x12, 0x48, 0x00, 0x11, 0x24, 0x00, 0x25, 0x24, 0x00, 0x7B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x7B, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x0C, 0x70, 0x00, 0x70, 0xA8, 0x00, 0x23, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F2C, { 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x09, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x17, 0xD2, 0x00, 0x21, 0x3F, 0x00, 0x7D, 0x22, 0x00, 0x0B, 0xAA, 0x00, 0x10, 0x2A, 0x00, 0x23, 0xAA, 0x00, 0x7E, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x02, 0xAA, 0x00, 0x0E, 0xAA, 0x00, 0x73, 0x94, 0x00, 0x20, 0x13, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F2D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x25, 0x54, 0x00, 0x7C, 0x88, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x06, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x00, 0xA8, 0x00, 0x0D, 0x26, 0x00, 0x72, 0x22, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F2E, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x08, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x7C, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x20, 0xA8, 0x00, 0x7F, 0xFF, 0x00, 0x20, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x0D, 0x04, 0x00, 0x71, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F2F, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x13, 0x55, 0x00, 0x3F, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x06, 0x82, 0x00, 0x38, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F30, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x26, 0x22, 0x00, 0x7F, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x0E, 0x22, 0x00, 0x73, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F31, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0xFF, 0x00, 0x12, 0x92, 0x00, 0x11, 0xFE, 0x00, 0x25, 0x10, 0x00, 0x7C, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x17, 0x7C, 0x00, 0x21, 0x44, 0x00, 0x7D, 0x7C, 0x00, 0x21, 0x40, 0x00, 0x01, 0x7C, 0x00, 0x0D, 0x44, 0x00, 0x72, 0xFC, 0x00, 0x24, 0x43, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F32, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFC, 0x00, 0x10, 0x88, 0x00, 0x12, 0x88, 0x00, 0x24, 0xF8, 0x00, 0x7C, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x12, 0x52, 0x00, 0x22, 0x52, 0x00, 0x7F, 0xDE, 0x00, 0x20, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x0C, 0x70, 0x00, 0x70, 0xA8, 0x00, 0x23, 0x27, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F33, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x11, 0x54, 0x00, 0x13, 0x54, 0x00, 0x25, 0xFC, 0x00, 0x7C, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x00, 0xA2, 0x00, 0x0D, 0xA4, 0x00, 0x72, 0x98, 0x00, 0x24, 0xC7, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F34, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x12, 0x48, 0x00, 0x17, 0xE8, 0x00, 0x24, 0x4A, 0x00, 0x27, 0xDF, 0x00, 0x7C, 0x62, 0x00, 0x0F, 0xD2, 0x00, 0x11, 0x14, 0x00, 0x2F, 0xF4, 0x00, 0x42, 0x14, 0x00, 0x7B, 0xC8, 0x00, 0x02, 0x48, 0x00, 0x1A, 0x54, 0x00, 0x64, 0x54, 0x00, 0x24, 0xE3, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F35, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x94, 0x00, 0x13, 0xDE, 0x00, 0x14, 0xA4, 0x00, 0x23, 0xDF, 0x00, 0x7D, 0x8C, 0x00, 0x0A, 0x95, 0x00, 0x14, 0xA7, 0x00, 0x21, 0xFC, 0x00, 0x7D, 0x04, 0x00, 0x21, 0x24, 0x00, 0x01, 0x24, 0x00, 0x0D, 0x24, 0x00, 0x70, 0x58, 0x00, 0x20, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F36, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F38, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x1F, 0x88, 0x00, 0x24, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F3A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x24, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x7F, 0x80, 0x24, 0x88, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xA2, 0x00, 0x20, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F3B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x68, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x52, 0x00, 0x2A, 0x5A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0xC2, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0xBA, 0x80, 0x00, 0xE2, 0x80, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F3C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x68, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0xC9, 0x80, 0x7F, 0x89, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x29, 0x1C, 0x00, 0x29, 0x14, 0x00, 0x29, 0x14, 0x00, 0x29, 0x36, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F3D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x68, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x54, 0x00, 0x7E, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x2A, 0xD6, 0x00, 0x2A, 0x92, 0x00, 0x2B, 0x93, 0x00, 0x2A, 0x7D, 0x80, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F3E, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x63, 0x00, 0x3E, 0x22, 0x00, 0x68, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x62, 0x00, 0x3E, 0x42, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F3F, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x3E, 0xF8, 0x00, 0x68, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x3E, 0xA1, 0x00, 0x01, 0xA1, 0x00, 0x03, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F42, { 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F43, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x28, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F44, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xA3, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xBE, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x8C, 0x00, 0x20, 0x73, 0x80, 0x48, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F45, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x20, 0x1F, 0x00, 0x7C, 0x10, 0x00, 0x51, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x1E, 0x00, 0x7D, 0x70, 0x80, 0x11, 0x1F, 0x80, 0x11, 0x02, 0x00, 0x55, 0x3C, 0x00, 0x55, 0x49, 0x00, 0x55, 0x2A, 0x00, 0x55, 0xFF, 0x80, 0x7D, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F47, { 0x00, 0x00, 0x00, 0x20, 0x5E, 0x00, 0x20, 0x81, 0x00, 0x7D, 0x7E, 0x80, 0x50, 0x28, 0x00, 0x10, 0xFF, 0x00, 0x10, 0xA9, 0x00, 0x7E, 0xCF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x02, 0x00, 0x55, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x00, 0x22, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F4C, { 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x91, 0x00, 0x24, 0x60, 0x80, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F4D, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F4E, { 0x00, 0x00, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x50, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x12, 0xD6, 0x80, 0x10, 0x10, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x7C, 0x42, 0x00, 0x00, 0x9E, 0x00, 0x01, 0xF3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F4F, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x20, 0x1F, 0x00, 0x7C, 0x10, 0x00, 0x51, 0xFF, 0x80, 0x11, 0x10, 0x80, 0x11, 0x7E, 0x00, 0x7F, 0x10, 0x80, 0x11, 0x7F, 0x80, 0x11, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x56, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0xA5, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F50, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x1F, 0x22, 0x00, 0x14, 0x7F, 0x00, 0x24, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x24, 0x00, 0x04, 0x7F, 0x00, 0x15, 0xA4, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x24, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x24, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x09, 0x00, 0x21, 0x09, 0x00, 0x21, 0x09, 0x00, 0x29, 0x49, 0x00, 0x27, 0x39, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x27, 0x39, 0x00, 0x25, 0x2D, 0x00, 0x2C, 0x65, 0x00, 0x38, 0xC1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x26, 0x19, 0x00, 0x23, 0xB1, 0x00, 0x20, 0xE1, 0x00, 0x21, 0xB1, 0x00, 0x27, 0x19, 0x00, 0x2C, 0x0D, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x22, 0x08, 0x80, 0x21, 0x10, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x2F, 0xFE, 0x80, 0x22, 0x00, 0x80, 0x22, 0x00, 0x80, 0x22, 0x00, 0x80, 0x23, 0xFC, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x11, 0x00, 0x06, 0x1F, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F57, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x21, 0x02, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x10, 0x00, 0x31, 0x60, 0x00, 0x00, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0xA0, 0x00, 0x03, 0xB0, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F5A, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x04, 0x44, 0x00, 0x00, 0x44, 0x00, 0x78, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x94, 0x00, 0x10, 0x96, 0x00, 0x30, 0xFA, 0x00, 0x27, 0x8B, 0x00, 0x60, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x30, 0x80, 0x1F, 0x1D, 0x80, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F62, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x81, 0x00, 0x0E, 0x81, 0x00, 0x78, 0x83, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F65, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x88, 0x00, 0x08, 0x44, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x35, 0x6B, 0x00, 0x24, 0x49, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F68, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x68, 0x85, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x80, 0x00, 0x81, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F69, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x01, 0x90, 0x00, 0x07, 0x1F, 0x80, 0x39, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x06, 0x00, 0x3F, 0xE5, 0x00, 0x02, 0x04, 0x80, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x03, 0xE4, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x3F, 0x32, 0x00, 0x21, 0x16, 0x00, 0x21, 0x1C, 0x00, 0x3F, 0x08, 0x80, 0x00, 0x1C, 0x80, 0x0F, 0x37, 0x80, 0x78, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F70, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x81, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0F, 0x81, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x42, 0x00, 0x00, 0x44, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC8, 0x00, 0x07, 0xFE, 0x00, 0x3C, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F74, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x12, 0x44, 0x00, 0x11, 0x22, 0x00, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x04, 0x80, 0x04, 0x42, 0x80, 0x12, 0x21, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x09, 0x13, 0x80, 0x13, 0x9C, 0x00, 0x3C, 0x50, 0x80, 0x00, 0x1F, 0x80, 0x1F, 0x80, 0x00, 0x10, 0x90, 0x00, 0x1F, 0x93, 0x80, 0x10, 0x9C, 0x00, 0x1F, 0x90, 0x80, 0x10, 0x9F, 0x80, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F78, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xBF, 0x80, 0x00, 0x02, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x32, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x02, 0x00, 0x21, 0x02, 0x00, 0x3F, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x88, 0x00, 0x2D, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F7D, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x25, 0x21, 0x00, 0x29, 0x49, 0x00, 0x22, 0x89, 0x00, 0x2C, 0x69, 0x00, 0x21, 0x09, 0x00, 0x25, 0x29, 0x00, 0x29, 0x41, 0x00, 0x62, 0x81, 0x00, 0x4C, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F7E, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x34, 0x93, 0x00, 0x52, 0xA2, 0x80, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F7F, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F80, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x29, 0x25, 0x00, 0x26, 0x19, 0x00, 0x29, 0x25, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F81, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x11, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x24, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xA4, 0x00, 0x24, 0xBE, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x7A, 0x00, 0x7F, 0x82, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F82, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x62, 0x41, 0x00, 0x34, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x6B, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F83, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x68, 0x85, 0x80, 0x08, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x24, 0x48, 0x00, 0x18, 0xFF, 0x00, 0x0B, 0x48, 0x00, 0x3D, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F86, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x21, 0x26, 0x00, 0x7F, 0xBC, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x1F, 0x00, 0x21, 0x20, 0x00, 0x3F, 0x3C, 0x00, 0x21, 0x21, 0x00, 0x23, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F87, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x49, 0x01, 0x00, 0x7F, 0x3D, 0x00, 0x08, 0x25, 0x00, 0x7F, 0x3D, 0x00, 0x08, 0x01, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F88, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x15, 0x24, 0x00, 0x1F, 0x3F, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x02, 0x80, 0x04, 0x0A, 0x80, 0x3F, 0xA8, 0x80, 0x04, 0x21, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F8A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F8B, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x04, 0x88, 0x00, 0x7C, 0x8F, 0x80, 0x04, 0x88, 0x00, 0x04, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F8C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F8D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x1A, 0x16, 0x00, 0x73, 0x33, 0x80, 0x01, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F8E, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F8F, { 0x00, 0x00, 0x00, 0x22, 0x02, 0x00, 0x36, 0x06, 0x00, 0x14, 0x0C, 0x00, 0x7F, 0x18, 0x00, 0x08, 0x71, 0x00, 0x08, 0x03, 0x00, 0x3E, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x0F, 0x70, 0x80, 0x78, 0x01, 0x80, 0x08, 0x03, 0x00, 0x18, 0x06, 0x00, 0x10, 0x0C, 0x00, 0x30, 0x38, 0x00, 0x60, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F90, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7E, 0x1F, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0E, 0x18, 0x00, 0x38, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0xF0, 0x00, 0x0F, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F91, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x38, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB0, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F94, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F96, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x36, 0x3E, 0x00, 0x14, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x62, 0x00, 0x3E, 0xC3, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x0F, 0x21, 0x00, 0x78, 0x33, 0x00, 0x08, 0x16, 0x00, 0x18, 0x0C, 0x00, 0x10, 0x1E, 0x00, 0x30, 0x33, 0x00, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7F97, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x40, 0x00, 0x02, 0x48, 0x00, 0x02, 0x4A, 0x00, 0x06, 0x53, 0x00, 0x04, 0x5D, 0x00, 0x0C, 0x40, 0x80, 0x18, 0x61, 0x80, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F9A, { 0x00, 0x00, 0x00, 0x22, 0x10, 0x00, 0x12, 0x18, 0x00, 0x14, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x81, 0x00, 0x09, 0x00, 0x80, 0x08, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0xFF, 0x00, 0x38, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x10, 0x26, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F9C, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x36, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x78, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F9D, { 0x00, 0x00, 0x00, 0x22, 0x01, 0x80, 0x36, 0x07, 0x00, 0x14, 0x7C, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0x44, 0x00, 0x78, 0x44, 0x00, 0x08, 0x76, 0x00, 0x19, 0xC2, 0x00, 0x10, 0x02, 0x80, 0x31, 0xFB, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F9E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7F9F, { 0x00, 0x00, 0x00, 0x22, 0x04, 0x00, 0x12, 0xFE, 0x00, 0x14, 0x04, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x83, 0x00, 0x09, 0x00, 0x00, 0x7F, 0x7C, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x12, 0x00, 0x21, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FA1, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x38, 0xD1, 0x00, 0x01, 0x92, 0x00, 0x04, 0x38, 0x00, 0x0C, 0x28, 0x00, 0x18, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FA2, { 0x00, 0x00, 0x00, 0x22, 0x05, 0x00, 0x36, 0x05, 0x80, 0x14, 0x04, 0x80, 0x7F, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFC, 0x80, 0x0F, 0x25, 0x80, 0x78, 0x25, 0x00, 0x08, 0x67, 0x00, 0x18, 0x42, 0x00, 0x10, 0xC6, 0x80, 0x31, 0x8B, 0x80, 0x60, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FA3, { 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FA4, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x8A, 0x00, 0x04, 0x8A, 0x00, 0x04, 0xBF, 0x80, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x1F, 0xBF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x18, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FA6, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x36, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x0F, 0x24, 0x00, 0x78, 0x24, 0x00, 0x08, 0x24, 0x00, 0x18, 0x64, 0x00, 0x10, 0x44, 0x80, 0x30, 0xC4, 0x80, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FA7, { 0x00, 0x00, 0x00, 0x22, 0x10, 0x00, 0x12, 0x10, 0x00, 0x14, 0x28, 0x00, 0x7F, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x83, 0x00, 0x09, 0x41, 0x00, 0x08, 0x7C, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xA8, 0x00, 0x11, 0x10, 0x00, 0x10, 0x28, 0x00, 0x20, 0x47, 0x00, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FA8, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x20, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x06, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x10, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FA9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xD4, 0x00, 0x1F, 0x12, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x11, 0x00, 0x03, 0xCA, 0x00, 0x3E, 0x04, 0x00, 0x02, 0x1A, 0x80, 0x0E, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FAA, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x36, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0F, 0x48, 0x80, 0x78, 0x49, 0x80, 0x08, 0x4D, 0x00, 0x18, 0x44, 0x00, 0x10, 0x46, 0x00, 0x30, 0x7B, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FAD, { 0x00, 0x00, 0x00, 0x44, 0xF0, 0x00, 0x6C, 0x18, 0x00, 0x28, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x11, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x7D, 0xE4, 0x80, 0x11, 0x24, 0x80, 0x11, 0xAD, 0x80, 0x1D, 0x69, 0x00, 0x71, 0x29, 0x00, 0x11, 0xA9, 0x00, 0x11, 0x6D, 0x80, 0x31, 0x24, 0x80, 0x21, 0x24, 0x80, 0x61, 0x64, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FAE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FAF, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x36, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x0F, 0x68, 0x80, 0x78, 0x48, 0x80, 0x08, 0xDC, 0x80, 0x18, 0x76, 0x80, 0x10, 0x41, 0x80, 0x30, 0x7D, 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FB0, { 0x00, 0x00, 0x00, 0x22, 0x10, 0x00, 0x12, 0x92, 0x00, 0x14, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x42, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x7F, 0x48, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAC, 0x00, 0x11, 0x54, 0x00, 0x11, 0x14, 0x00, 0x22, 0x22, 0x00, 0x44, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FB2, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x92, 0x00, 0x1E, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0x10, 0x00, 0x0A, 0xD1, 0x00, 0x3F, 0xD2, 0x00, 0x04, 0x0C, 0x00, 0x0F, 0x8C, 0x80, 0x08, 0x92, 0x80, 0x13, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FB4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x22, 0x21, 0x00, 0x14, 0x12, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x3F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FB6, { 0x00, 0x00, 0x00, 0x44, 0x10, 0x00, 0x6D, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xBD, 0x00, 0x7C, 0xA5, 0x00, 0x10, 0xBD, 0x00, 0x10, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x70, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x30, 0x7E, 0x00, 0x20, 0x42, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FB8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x1E, 0xAF, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xFD, 0x00, 0x12, 0x4B, 0x00, 0x1F, 0xF9, 0x00, 0x12, 0x49, 0x00, 0x13, 0xF9, 0x80, 0x26, 0x51, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FB9, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x12, 0x00, 0x11, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x03, 0x18, 0x00, 0x1C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FBC, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x12, 0xAA, 0x00, 0x17, 0xDF, 0x00, 0x11, 0x04, 0x00, 0x37, 0xDF, 0x00, 0x21, 0x04, 0x00, 0x6F, 0xDF, 0x80, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x85, 0x00, 0x02, 0x85, 0x00, 0x04, 0x89, 0x00, 0x08, 0x91, 0x00, 0x10, 0xA3, 0x00, 0x21, 0xC3, 0x00, 0x01, 0x85, 0x00, 0x02, 0x89, 0x00, 0x04, 0x91, 0x00, 0x08, 0xA1, 0x00, 0x10, 0xC1, 0x00, 0x20, 0x81, 0x00, 0x00, 0x81, 0x00, 0x03, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x05, 0x05, 0x00, 0x19, 0x19, 0x00, 0x61, 0x23, 0x00, 0x07, 0x0D, 0x00, 0x19, 0x31, 0x00, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FC0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x5F, 0x80, 0x08, 0x54, 0x80, 0x39, 0xD4, 0x80, 0x6B, 0x54, 0x80, 0x08, 0x54, 0x80, 0x08, 0x54, 0x80, 0x08, 0x54, 0x80, 0x39, 0xDF, 0x80, 0x6B, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x39, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x04, 0xA4, 0x00, 0x09, 0x12, 0x00, 0x32, 0x79, 0x80, 0x0F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x85, 0x00, 0x04, 0x89, 0x00, 0x09, 0x93, 0x00, 0x32, 0xE3, 0x00, 0x04, 0x85, 0x00, 0x08, 0x89, 0x00, 0x31, 0xB3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FC3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xF7, 0x80, 0x08, 0x10, 0x80, 0x08, 0x10, 0x80, 0x7E, 0x10, 0x80, 0x10, 0x73, 0x80, 0x10, 0xD6, 0x80, 0x14, 0x10, 0x80, 0x34, 0x10, 0x80, 0x24, 0x10, 0x80, 0x2C, 0x73, 0x80, 0x68, 0xD6, 0x80, 0x4A, 0x10, 0x80, 0x4A, 0x10, 0x80, 0x1F, 0x10, 0x80, 0x31, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FC5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x1F, 0x89, 0x80, 0x04, 0x1A, 0x80, 0x04, 0x2C, 0x80, 0x3F, 0xC8, 0x80, 0x11, 0x08, 0x80, 0x11, 0x19, 0x80, 0x0A, 0x19, 0x80, 0x0A, 0x2A, 0x80, 0x0A, 0x4C, 0x80, 0x04, 0x08, 0x80, 0x04, 0x19, 0x80, 0x0A, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x0D, 0x0D, 0x00, 0x33, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xF0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x11, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xF7, 0x80, 0x4A, 0x10, 0x80, 0x4A, 0x10, 0x80, 0x4A, 0x10, 0x80, 0x7E, 0x73, 0x80, 0x4A, 0xD6, 0x80, 0x4A, 0x10, 0x80, 0x4A, 0x10, 0x80, 0x4A, 0x10, 0x80, 0x7E, 0x73, 0x80, 0x08, 0xD6, 0x80, 0x08, 0x10, 0x80, 0x08, 0x10, 0x80, 0x08, 0x10, 0x80, 0x08, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FCA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x19, 0x80, 0x04, 0x19, 0x80, 0x3F, 0xAA, 0x80, 0x00, 0x4C, 0x80, 0x11, 0x88, 0x80, 0x11, 0x19, 0x80, 0x0A, 0x19, 0x80, 0x0A, 0x2A, 0x80, 0x0A, 0x2A, 0x80, 0x0B, 0xCC, 0x80, 0x3C, 0x88, 0x80, 0x01, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x85, 0x00, 0x08, 0x89, 0x00, 0x31, 0x93, 0x00, 0x02, 0xA5, 0x00, 0x0C, 0x89, 0x00, 0x31, 0x93, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FCE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0xF7, 0x80, 0x11, 0x10, 0x80, 0x20, 0x10, 0x80, 0x00, 0x11, 0x80, 0x3F, 0x32, 0x80, 0x00, 0x54, 0x80, 0x00, 0x90, 0x80, 0x3F, 0x10, 0x80, 0x11, 0x11, 0x80, 0x11, 0x32, 0x80, 0x11, 0x54, 0x80, 0x16, 0x90, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x10, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x73, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x01, 0xC1, 0x00, 0x07, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0xC7, 0x80, 0x03, 0x80, 0x00, 0x0E, 0x70, 0x00, 0x01, 0xC6, 0x00, 0x0F, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x89, 0x00, 0x09, 0x91, 0x00, 0x32, 0xE3, 0x00, 0x04, 0x8D, 0x00, 0x08, 0xB1, 0x00, 0x33, 0x87, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FD4, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x7F, 0x80, 0x12, 0x08, 0x80, 0x02, 0x19, 0x80, 0x3F, 0x19, 0x80, 0x04, 0x2A, 0x80, 0x04, 0x2C, 0x80, 0x1F, 0x48, 0x80, 0x04, 0x99, 0x80, 0x04, 0x1A, 0x80, 0x07, 0xAA, 0x80, 0x3C, 0x2C, 0x80, 0x04, 0x48, 0x80, 0x08, 0x88, 0x80, 0x08, 0x08, 0x80, 0x10, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FD5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x3B, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x89, 0x00, 0x09, 0x93, 0x00, 0x32, 0xE5, 0x00, 0x0C, 0x89, 0x00, 0x31, 0xB3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FD8, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xEF, 0x00, 0x7F, 0x22, 0x00, 0x14, 0x22, 0x00, 0x08, 0xAA, 0x00, 0x15, 0x66, 0x00, 0x63, 0x22, 0x00, 0x00, 0x66, 0x00, 0x7E, 0xAA, 0x00, 0x15, 0x32, 0x00, 0x14, 0x22, 0x00, 0x14, 0xAA, 0x00, 0x14, 0x44, 0x00, 0x14, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FDB, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x86, 0x00, 0x19, 0x6C, 0x00, 0x14, 0x38, 0x00, 0x34, 0x6E, 0x00, 0x55, 0xC3, 0x80, 0x14, 0x00, 0x00, 0x15, 0xEF, 0x80, 0x14, 0xA2, 0x80, 0x15, 0x24, 0x80, 0x14, 0x61, 0x80, 0x14, 0xA2, 0x80, 0x11, 0x24, 0x80, 0x10, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x0C, 0xD3, 0x00, 0x31, 0x65, 0x00, 0x06, 0x49, 0x00, 0x1A, 0x71, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x04, 0x89, 0x00, 0x09, 0x93, 0x00, 0x12, 0xA5, 0x00, 0x24, 0xC9, 0x00, 0x08, 0x50, 0x00, 0x1F, 0xFF, 0x00, 0x03, 0x08, 0x00, 0x04, 0x94, 0x00, 0x08, 0x62, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FE1, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x07, 0x9F, 0x80, 0x39, 0x10, 0x00, 0x06, 0x10, 0x00, 0x38, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x04, 0x89, 0x00, 0x09, 0x93, 0x00, 0x12, 0xA5, 0x00, 0x24, 0xC9, 0x00, 0x08, 0x91, 0x00, 0x11, 0xA3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x73, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0x10, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FE5, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0xA0, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x78, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x33, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FE6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x00, 0x19, 0x22, 0x00, 0x17, 0x22, 0x00, 0x19, 0x22, 0x00, 0x17, 0x02, 0x00, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x0D, 0x0D, 0x00, 0x33, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x31, 0x31, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x33, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x00, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x80, 0x00, 0x04, 0xFE, 0x00, 0x0A, 0x80, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FE9, { 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x1F, 0x80, 0x08, 0x04, 0x80, 0x0F, 0xE5, 0x80, 0x08, 0x2D, 0x80, 0x08, 0x2E, 0x80, 0x0F, 0xF4, 0x80, 0x08, 0x24, 0x80, 0x08, 0x05, 0x80, 0x0F, 0xED, 0x80, 0x0A, 0xAE, 0x80, 0x1A, 0xB4, 0x80, 0x1F, 0xE4, 0x80, 0x1A, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xED, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x15, 0x40, 0x00, 0x26, 0xC0, 0x00, 0x0D, 0x40, 0x00, 0x16, 0x7F, 0x80, 0x2D, 0xD2, 0x00, 0x02, 0x12, 0x00, 0x04, 0x12, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1F, 0x92, 0x80, 0x10, 0x92, 0x80, 0x10, 0xA3, 0x80, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FEC, { 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x73, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5F, 0xFE, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xF7, 0x80, 0x00, 0x10, 0x80, 0x3E, 0x10, 0x80, 0x22, 0x10, 0x80, 0x3E, 0x73, 0x80, 0x00, 0xD6, 0x80, 0x7F, 0x10, 0x80, 0x55, 0x10, 0x80, 0x55, 0x10, 0x80, 0x67, 0x73, 0x80, 0x41, 0xD6, 0x80, 0x5D, 0x10, 0x80, 0x49, 0x10, 0x80, 0x49, 0x10, 0x80, 0x4B, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FEF, { 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x73, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FF0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x3E, 0x00, 0x00, 0x22, 0xF7, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x33, 0x00, 0x3E, 0x55, 0x00, 0x09, 0x99, 0x00, 0x08, 0x33, 0x00, 0x3E, 0x55, 0x00, 0x09, 0x99, 0x00, 0x08, 0x11, 0x00, 0x08, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FF1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x3E, 0xEF, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xAA, 0x00, 0x3E, 0x66, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x14, 0x66, 0x00, 0x2A, 0xAA, 0x00, 0x49, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xAA, 0x00, 0x08, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x77, 0x80, 0x14, 0x10, 0x80, 0x7F, 0x10, 0x80, 0x55, 0x10, 0x80, 0x55, 0x33, 0x80, 0x7F, 0x76, 0x80, 0x00, 0x10, 0x80, 0x3E, 0x10, 0x80, 0x00, 0x10, 0x80, 0x7F, 0x33, 0x80, 0x08, 0x76, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x49, 0x10, 0x80, 0x18, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDE, 0x00, 0x28, 0x12, 0x00, 0x2F, 0x93, 0x80, 0x32, 0x20, 0x00, 0x2F, 0x9F, 0x00, 0x25, 0x09, 0x00, 0x28, 0x86, 0x00, 0x3F, 0xD9, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x0D, 0x0D, 0x00, 0x33, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x31, 0x31, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FF9, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xDB, 0x00, 0x09, 0x2D, 0x00, 0x09, 0x09, 0x00, 0x1F, 0x9B, 0x00, 0x09, 0x2D, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x09, 0x1B, 0x00, 0x09, 0x00, 0x80, 0x11, 0x00, 0x80, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FFA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x77, 0x80, 0x7F, 0x10, 0x80, 0x41, 0x10, 0x80, 0x7F, 0x10, 0x80, 0x41, 0x33, 0x80, 0x7F, 0x76, 0x80, 0x41, 0x10, 0x80, 0x7F, 0x10, 0x80, 0x08, 0x10, 0x80, 0x6B, 0x33, 0x80, 0x08, 0x76, 0x80, 0x6B, 0x10, 0x80, 0x08, 0x10, 0x80, 0x7F, 0x10, 0x80, 0x08, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FFB, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0xF7, 0x80, 0x38, 0x10, 0x80, 0x49, 0x10, 0x80, 0x2A, 0x54, 0x80, 0x7F, 0x32, 0x80, 0x1C, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x49, 0x10, 0x80, 0x00, 0x31, 0x80, 0x3E, 0x52, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x2A, 0x10, 0x80, 0x3E, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FFC, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x0C, 0xD3, 0x00, 0x31, 0x65, 0x00, 0x06, 0x49, 0x00, 0x38, 0x61, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x7FFD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x17, 0xBB, 0x80, 0x14, 0x08, 0x80, 0x7F, 0xC8, 0x80, 0x01, 0x99, 0x80, 0x01, 0x6A, 0x80, 0x3F, 0xC8, 0x80, 0x20, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x99, 0x80, 0x2C, 0xAA, 0x80, 0x35, 0xC8, 0x80, 0x26, 0x88, 0x80, 0x28, 0x88, 0x80, 0x21, 0x88, 0x80, 0x46, 0x59, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBB, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x3F, 0x99, 0x80, 0x00, 0x2A, 0x80, 0x7F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x20, 0x99, 0x80, 0x3F, 0xAA, 0x80, 0x0A, 0x08, 0x80, 0x1A, 0x48, 0x80, 0x73, 0x48, 0x80, 0x19, 0x88, 0x80, 0x30, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x7FFF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x7B, 0x80, 0x08, 0x08, 0x80, 0x3E, 0x08, 0x80, 0x00, 0x19, 0x80, 0x7F, 0xAA, 0x80, 0x00, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x08, 0x80, 0x3E, 0x19, 0x80, 0x00, 0x2A, 0x80, 0x7F, 0x88, 0x80, 0x01, 0x08, 0x80, 0x7F, 0x88, 0x80, 0x55, 0x08, 0x80, 0x73, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8000, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x29, 0x2A, 0x80, 0x2A, 0x4C, 0x80, 0x2A, 0x99, 0x80, 0x08, 0x2A, 0x80, 0x3F, 0x54, 0x80, 0x14, 0x48, 0x00, 0x14, 0xFF, 0x00, 0x15, 0x88, 0x00, 0x16, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x14, 0xFF, 0x00, 0x17, 0x88, 0x00, 0x2C, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8001, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x41, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x48, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x03, 0x0F, 0x00, 0x0D, 0xF0, 0x00, 0x31, 0x00, 0x00, 0x01, 0x00, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8003, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x48, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x9E, 0x00, 0x03, 0xE0, 0x00, 0x0E, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8004, { 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x1F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x79, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x80, 0x01, 0x01, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8005, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x41, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x32, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8006, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x60, 0x00, 0x00, 0x9E, 0x00, 0x03, 0xE0, 0x00, 0x0D, 0x00, 0x80, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8007, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x83, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x80, 0x00, 0x0E, 0x00, 0x00, 0x73, 0xFF, 0x00, 0x06, 0x01, 0x00, 0x0D, 0xF1, 0x00, 0x39, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xF3, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8008, { 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x1F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x71, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x30, 0x01, 0x00, 0x67, 0xE1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x07, 0xE3, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8009, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x90, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x03, 0x1F, 0x00, 0x0F, 0xE0, 0x00, 0x34, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x07, 0xF2, 0x00, 0x04, 0x12, 0x00, 0x07, 0xF2, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x800A, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x83, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x72, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x800B, { 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x1F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x71, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF4, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x800C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x800D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x23, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x01, 0x3C, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x800E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x23, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x800F, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xC6, 0x00, 0x04, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x3F, 0xB1, 0x00, 0x2A, 0x83, 0x00, 0x2A, 0x86, 0x00, 0x2A, 0x8C, 0x00, 0x2A, 0x98, 0x00, 0x2A, 0xB0, 0x80, 0x2A, 0x81, 0x80, 0x2A, 0x83, 0x00, 0x2A, 0x86, 0x00, 0x2A, 0x8C, 0x00, 0x2A, 0x98, 0x00, 0x21, 0xB0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8010, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x21, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8011, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8012, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x02, 0xB0, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8013, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8014, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x80, 0x78, 0x03, 0x00, 0x08, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8015, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x0C, 0x7F, 0x80, 0x0E, 0x12, 0x00, 0x15, 0x12, 0x00, 0x14, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x42, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8016, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x78, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x08, 0x49, 0x80, 0x08, 0xC8, 0x00, 0x7F, 0x09, 0x00, 0x08, 0x09, 0x00, 0x1C, 0x3B, 0x00, 0x1A, 0x02, 0x00, 0x2A, 0x06, 0x00, 0x48, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8017, { 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x3C, 0x38, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x0F, 0x80, 0x04, 0x78, 0x00, 0x3F, 0x88, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x0F, 0x80, 0x15, 0xF8, 0x00, 0x14, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x80, 0x04, 0x08, 0x80, 0x04, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8018, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xBF, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x7F, 0x80, 0x7F, 0xC8, 0x00, 0x0C, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x15, 0x10, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x24, 0x4F, 0x80, 0x04, 0xF0, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8019, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x00, 0x78, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x1A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x48, 0x40, 0x80, 0x08, 0x61, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x801C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x00, 0x78, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x801D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7E, 0x00, 0x78, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x48, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x801E, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x70, 0x80, 0x00, 0x10, 0x87, 0x80, 0x13, 0xF4, 0x80, 0x7C, 0x94, 0x80, 0x10, 0x94, 0x80, 0x10, 0x94, 0x80, 0x7C, 0x94, 0x80, 0x10, 0x94, 0x80, 0x39, 0x94, 0x80, 0x35, 0x14, 0x80, 0x55, 0x34, 0x80, 0x53, 0x24, 0x80, 0x12, 0x27, 0x80, 0x16, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x801F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x80, 0x78, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x48, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8020, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x38, 0x00, 0x78, 0x2C, 0x00, 0x08, 0x64, 0x00, 0x08, 0x46, 0x00, 0x3E, 0xC3, 0x00, 0x09, 0xBD, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8021, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1D, 0xE4, 0x00, 0x71, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x3F, 0x80, 0x7D, 0xE4, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x11, 0xE4, 0x80, 0x39, 0x24, 0x80, 0x35, 0x24, 0x80, 0x55, 0x2C, 0x80, 0x51, 0xE9, 0x80, 0x13, 0x19, 0x00, 0x10, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8022, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x7E, 0x42, 0x00, 0x18, 0x40, 0x00, 0x1D, 0xFC, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x48, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x14, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8024, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x78, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8025, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA6, 0x00, 0x7E, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x3E, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x02, 0x00, 0x19, 0x7A, 0x00, 0x1D, 0x4A, 0x00, 0x2B, 0x4A, 0x00, 0x2B, 0x4A, 0x00, 0x49, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8026, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x00, 0x78, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1C, 0x88, 0x80, 0x1A, 0x8A, 0x80, 0x2A, 0x9E, 0x80, 0x48, 0xB2, 0x80, 0x08, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8027, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x7E, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0xA8, 0x00, 0x09, 0x26, 0x00, 0x7E, 0x22, 0x00, 0x1C, 0x40, 0x00, 0x1B, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x29, 0x08, 0x00, 0x48, 0xD0, 0x00, 0x08, 0x20, 0x00, 0x08, 0xD8, 0x00, 0x0B, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8028, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x78, 0x80, 0x00, 0x08, 0xBF, 0x00, 0x08, 0x80, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0xA8, 0x80, 0x08, 0xA5, 0x00, 0x7F, 0xBA, 0x00, 0x08, 0xE1, 0x80, 0x1C, 0x82, 0x00, 0x1A, 0xFF, 0x80, 0x28, 0xA2, 0x00, 0x48, 0xB2, 0x00, 0x09, 0x12, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8029, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0B, 0xFE, 0x00, 0x7C, 0x88, 0x00, 0x09, 0xFC, 0x00, 0x3C, 0x88, 0x00, 0x0B, 0xFF, 0x00, 0x7C, 0x20, 0x00, 0x19, 0xFC, 0x00, 0x1D, 0x24, 0x00, 0x2B, 0xFC, 0x00, 0x29, 0x24, 0x00, 0x4F, 0xFF, 0x00, 0x09, 0x04, 0x00, 0x09, 0x14, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x802A, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x28, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x21, 0x00, 0x7E, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x1C, 0x40, 0x00, 0x1A, 0x7C, 0x00, 0x28, 0x44, 0x00, 0x48, 0x44, 0x00, 0x08, 0x84, 0x00, 0x09, 0x14, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x802C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x7F, 0x00, 0x78, 0x49, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0xFF, 0x80, 0x2A, 0x21, 0x00, 0x48, 0x72, 0x00, 0x08, 0x1E, 0x00, 0x08, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x802D, { 0x00, 0x00, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x3F, 0x29, 0x00, 0x0A, 0x71, 0x00, 0x3F, 0xAE, 0x00, 0x08, 0xA4, 0x00, 0x09, 0x3F, 0x80, 0x3F, 0xF4, 0x00, 0x08, 0x22, 0x00, 0x1B, 0xFF, 0x80, 0x1C, 0x91, 0x00, 0x2A, 0x92, 0x00, 0x29, 0x4C, 0x00, 0x2A, 0x0C, 0x80, 0x08, 0x32, 0x80, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x802E, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x0F, 0x54, 0x80, 0x79, 0x6D, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x29, 0x00, 0x3C, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x7F, 0x10, 0x80, 0x08, 0xFF, 0x00, 0x1C, 0x11, 0x00, 0x1A, 0x11, 0x00, 0x2A, 0x31, 0x00, 0x48, 0x23, 0x00, 0x08, 0x62, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8030, { 0x00, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x0E, 0x10, 0x00, 0x78, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x08, 0x80, 0x7E, 0xA5, 0x00, 0x08, 0xA2, 0x80, 0x1D, 0x1E, 0x00, 0x1A, 0x20, 0x00, 0x2A, 0x7E, 0x00, 0x49, 0xA2, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8031, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x24, 0x00, 0x09, 0xFF, 0x00, 0x3F, 0x2C, 0x00, 0x09, 0x76, 0x00, 0x7F, 0xA5, 0x00, 0x19, 0x24, 0x00, 0x1D, 0xFF, 0x00, 0x2B, 0x20, 0x00, 0x29, 0x7E, 0x00, 0x49, 0x42, 0x00, 0x0A, 0xC2, 0x00, 0x0D, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8034, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x62, 0x20, 0x80, 0x02, 0x31, 0x80, 0x02, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x62, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x50, 0x80, 0x08, 0x51, 0x00, 0x0F, 0xD2, 0x00, 0x08, 0x51, 0x00, 0x08, 0x50, 0x80, 0x0F, 0xD0, 0x80, 0x08, 0x50, 0x80, 0x08, 0x50, 0x80, 0x0B, 0xF0, 0x80, 0x3C, 0x50, 0x80, 0x00, 0x50, 0x80, 0x00, 0x57, 0x00, 0x00, 0x50, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8037, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8038, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x12, 0x44, 0x00, 0x21, 0x83, 0x00, 0x41, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8039, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x38, 0x00, 0x22, 0x28, 0x00, 0x22, 0x6C, 0x00, 0x3E, 0x46, 0x00, 0x22, 0xC3, 0x00, 0x23, 0xBD, 0x80, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x02, 0x00, 0x22, 0x06, 0x00, 0x3E, 0x04, 0x00, 0x62, 0x0C, 0x00, 0x02, 0x08, 0x00, 0x02, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x803A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x32, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x23, 0x00, 0x62, 0x21, 0x00, 0x02, 0x2F, 0x00, 0x02, 0x79, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x803B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x4F, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3C, 0x48, 0x00, 0x64, 0x48, 0x00, 0x05, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x803C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x64, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x803D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x90, 0x80, 0x1E, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x18, 0x00, 0x1E, 0x28, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x48, 0x00, 0x32, 0x48, 0x80, 0x02, 0x88, 0x80, 0x03, 0x0F, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x803E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x34, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x2C, 0x00, 0x22, 0x68, 0x00, 0x22, 0x49, 0x00, 0x3E, 0xD9, 0x00, 0x62, 0x11, 0x00, 0x02, 0x3F, 0x80, 0x02, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x803F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x80, 0x12, 0x29, 0x00, 0x1E, 0x2A, 0x00, 0x12, 0x48, 0x00, 0x12, 0x88, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x14, 0x00, 0x16, 0x14, 0x00, 0x3A, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0x41, 0x00, 0x02, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8040, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x7F, 0x13, 0x00, 0x22, 0x11, 0x00, 0x22, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x11, 0x00, 0x22, 0x13, 0x00, 0x3E, 0x16, 0x00, 0x22, 0x1C, 0x00, 0x22, 0x08, 0x00, 0x22, 0x1C, 0x00, 0x3E, 0x34, 0x00, 0x62, 0x66, 0x80, 0x03, 0xC3, 0x80, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8042, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x14, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x7E, 0x00, 0x01, 0x02, 0x00, 0x12, 0x24, 0x00, 0x0A, 0x14, 0x00, 0x04, 0x08, 0x00, 0x0B, 0x17, 0x00, 0x31, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8043, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x71, 0x41, 0x00, 0x01, 0x41, 0x00, 0x01, 0x41, 0x00, 0x01, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8044, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x1C, 0x00, 0x22, 0x14, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x22, 0xC9, 0x80, 0x22, 0x18, 0x00, 0x22, 0x32, 0x00, 0x3E, 0x66, 0x00, 0x22, 0x0C, 0x00, 0x22, 0x18, 0x80, 0x22, 0x71, 0x80, 0x3E, 0x03, 0x00, 0x62, 0x06, 0x00, 0x02, 0x1C, 0x00, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8046, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x98, 0x00, 0x12, 0x24, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x81, 0x00, 0x13, 0x00, 0x80, 0x12, 0x7E, 0x00, 0x12, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x21, 0x00, 0x1E, 0x21, 0x00, 0x32, 0x21, 0x00, 0x02, 0x26, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x804A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x37, 0x80, 0x12, 0xC4, 0x80, 0x12, 0x94, 0x80, 0x12, 0x94, 0x80, 0x1E, 0x94, 0x80, 0x12, 0x94, 0x80, 0x12, 0x94, 0x80, 0x1E, 0x94, 0x80, 0x12, 0x94, 0x80, 0x12, 0xF4, 0x80, 0x1F, 0x94, 0x80, 0x32, 0x15, 0x80, 0x02, 0x24, 0x00, 0x02, 0x24, 0x00, 0x02, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x804B, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x50, 0x00, 0x02, 0x62, 0x00, 0x0C, 0x7E, 0x00, 0x11, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x804C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x13, 0xA4, 0x00, 0x7E, 0x24, 0x00, 0x22, 0x42, 0x00, 0x02, 0x43, 0x00, 0x02, 0x81, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x804D, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x7F, 0x90, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x81, 0x00, 0x13, 0x02, 0x00, 0x12, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0x90, 0x00, 0x1E, 0x10, 0x00, 0x72, 0x10, 0x00, 0x22, 0x10, 0x00, 0x02, 0x50, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8052, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x0E, 0x00, 0x22, 0xF8, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x62, 0x41, 0x00, 0x02, 0x41, 0x00, 0x02, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8054, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0x66, 0x00, 0x12, 0x28, 0x00, 0x12, 0x00, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x72, 0x44, 0x00, 0x02, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8056, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x17, 0xBF, 0x00, 0x39, 0x21, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8058, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0xFF, 0x80, 0x1E, 0x88, 0x80, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x1E, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x16, 0x40, 0x00, 0x1A, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x02, 0x00, 0x80, 0x02, 0x01, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x805A, { 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x16, 0x00, 0x1F, 0x21, 0x80, 0x31, 0xC0, 0x00, 0x01, 0x7F, 0x00, 0x1F, 0xC0, 0x00, 0x02, 0x62, 0x00, 0x0C, 0x64, 0x00, 0x31, 0x58, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x805E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x2E, 0x11, 0x00, 0x20, 0x17, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x805F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x21, 0x00, 0x7F, 0xE1, 0x00, 0x0A, 0x21, 0x00, 0x1B, 0x21, 0x00, 0x31, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x0F, 0x80, 0x7F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8060, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x63, 0x00, 0x22, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x62, 0x00, 0x62, 0x42, 0x00, 0x02, 0x42, 0x00, 0x02, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8061, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x22, 0x63, 0x00, 0x22, 0xD1, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x32, 0x00, 0x22, 0x22, 0x00, 0x22, 0x3F, 0x00, 0x3E, 0xE1, 0x80, 0x22, 0x08, 0x00, 0x22, 0x0C, 0x00, 0x22, 0x14, 0x00, 0x3E, 0x51, 0x00, 0x62, 0x51, 0x80, 0x02, 0xD2, 0x80, 0x02, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8062, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x48, 0x00, 0x22, 0x4F, 0x00, 0x22, 0x48, 0x00, 0x22, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x62, 0xE8, 0x00, 0x02, 0xB8, 0x00, 0x02, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8064, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x3C, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x25, 0x7E, 0x80, 0x24, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8066, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x24, 0x7F, 0x00, 0x24, 0xD5, 0x00, 0x3C, 0xA5, 0x00, 0x25, 0x39, 0x00, 0x24, 0x4D, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x26, 0x00, 0x24, 0x00, 0x00, 0x24, 0x18, 0x00, 0x24, 0x2C, 0x00, 0x3C, 0xA1, 0x00, 0x64, 0xA1, 0x80, 0x05, 0xA2, 0x80, 0x05, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8068, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x84, 0x00, 0x25, 0x08, 0x00, 0x24, 0xA5, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x84, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x44, 0x00, 0x64, 0x44, 0x00, 0x04, 0xC4, 0x00, 0x05, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8069, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x7F, 0x92, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x92, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x13, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x72, 0x92, 0x00, 0x22, 0x28, 0x00, 0x02, 0x46, 0x00, 0x02, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x806A, { 0x00, 0x00, 0x00, 0x02, 0x82, 0x00, 0x7F, 0x66, 0x00, 0x12, 0x28, 0x00, 0x12, 0x02, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0xA2, 0x00, 0x12, 0x10, 0x00, 0x12, 0x52, 0x00, 0x7E, 0xC5, 0x00, 0x03, 0x45, 0x00, 0x02, 0x3C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x806D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x20, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x28, 0x00, 0x22, 0x2A, 0x00, 0x22, 0x2A, 0x80, 0x3E, 0x6F, 0x80, 0x62, 0x48, 0x00, 0x02, 0xC8, 0x80, 0x03, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x806F, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x12, 0x44, 0x00, 0x13, 0xA9, 0x00, 0x12, 0xAA, 0x00, 0x1E, 0x44, 0x00, 0x12, 0xA9, 0x00, 0x13, 0xDF, 0x80, 0x1E, 0x00, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x1E, 0xA5, 0x00, 0x32, 0xE7, 0x00, 0x02, 0xA5, 0x00, 0x02, 0x44, 0x00, 0x02, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8070, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x10, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x51, 0x00, 0x1E, 0x5F, 0x00, 0x12, 0x75, 0x00, 0x12, 0x59, 0x00, 0x12, 0x65, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x24, 0x00, 0x32, 0xA5, 0x00, 0x02, 0xA2, 0x80, 0x03, 0x3E, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8071, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x7F, 0xF1, 0x00, 0x08, 0x1B, 0x00, 0x0F, 0x8E, 0x00, 0x18, 0x9A, 0x00, 0x31, 0xB3, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x0F, 0x80, 0x7F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8072, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xDE, 0x00, 0x02, 0x12, 0x80, 0x3F, 0xF3, 0x80, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x52, 0x00, 0x1F, 0xCC, 0x00, 0x10, 0x33, 0x80, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0xFE, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8073, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x25, 0x4A, 0x00, 0x0A, 0x31, 0x00, 0x18, 0xA0, 0x00, 0x28, 0xBF, 0x00, 0x09, 0xA0, 0x00, 0x0A, 0x7F, 0x80, 0x0C, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x07, 0x80, 0x3F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8074, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x3D, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0x08, 0x00, 0x24, 0x2C, 0x00, 0x3C, 0xA5, 0x00, 0x64, 0xA1, 0x80, 0x05, 0xA2, 0x80, 0x05, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8075, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x62, 0x7F, 0x00, 0x02, 0x22, 0x00, 0x02, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8076, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x1E, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xBF, 0x80, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x7F, 0x3F, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8077, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x3F, 0x4A, 0x00, 0x12, 0x49, 0x00, 0x13, 0xF8, 0x00, 0x12, 0xA8, 0x00, 0x1E, 0xA8, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0xE9, 0x00, 0x12, 0xA9, 0x00, 0x12, 0xEA, 0x00, 0x1E, 0xAA, 0x00, 0x32, 0xE4, 0x80, 0x02, 0xAA, 0x80, 0x02, 0x31, 0x80, 0x02, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8079, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x10, 0x80, 0x3D, 0x28, 0x80, 0x24, 0xA5, 0x00, 0x25, 0x3C, 0x80, 0x24, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0xA9, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x64, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x807D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x10, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x55, 0x00, 0x12, 0x55, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x0A, 0x29, 0x00, 0x3E, 0xA0, 0x80, 0x0B, 0x22, 0x80, 0x3E, 0x3E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x807E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x9F, 0x00, 0x09, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x1F, 0x81, 0x00, 0x10, 0x9F, 0x00, 0x1F, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x9F, 0x00, 0x11, 0x90, 0x80, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x807F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8080, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8081, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x37, 0xFE, 0x00, 0x20, 0x40, 0x00, 0x6F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8083, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x14, 0x94, 0x00, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8084, { 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x27, 0x08, 0x00, 0x38, 0x7F, 0x00, 0x21, 0x09, 0x00, 0x21, 0xFF, 0x00, 0x3F, 0x09, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x11, 0x08, 0x00, 0x20, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8085, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x11, 0x51, 0x00, 0x11, 0x51, 0x00, 0x1F, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x21, 0x51, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8086, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x9F, 0x00, 0x08, 0x05, 0x00, 0x0F, 0x85, 0x00, 0x08, 0x3F, 0x80, 0x0F, 0x85, 0x00, 0x08, 0x05, 0x00, 0x3F, 0xDF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x3F, 0x80, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xFF, 0x80, 0x38, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8087, { 0x00, 0x00, 0x00, 0x03, 0x88, 0x00, 0x1C, 0x1F, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xD4, 0x00, 0x10, 0x8C, 0x00, 0x1F, 0x93, 0x80, 0x20, 0x60, 0x00, 0x27, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8088, { 0x00, 0x00, 0x00, 0x3E, 0x12, 0x00, 0x20, 0x7F, 0x80, 0x3F, 0x11, 0x00, 0x21, 0x1A, 0x00, 0x3F, 0x0C, 0x80, 0x20, 0xB7, 0x80, 0x4F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8089, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x19, 0x00, 0x16, 0x47, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x13, 0x19, 0x00, 0x1C, 0x07, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x808B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x1E, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x21, 0x00, 0x12, 0x22, 0x00, 0x22, 0x42, 0x00, 0x26, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x808C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7C, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x22, 0x87, 0x80, 0x26, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x808E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8093, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8096, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8098, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x64, 0x00, 0x22, 0x34, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x62, 0x04, 0x00, 0x46, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x809A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x62, 0xFF, 0x80, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x809B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x809C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x0C, 0x00, 0x22, 0x18, 0x00, 0x22, 0x30, 0x00, 0x22, 0x62, 0x00, 0x3E, 0x06, 0x00, 0x22, 0x04, 0x00, 0x22, 0x0C, 0x00, 0x22, 0x38, 0x00, 0x3E, 0x61, 0x00, 0x22, 0x03, 0x00, 0x22, 0x02, 0x00, 0x22, 0x06, 0x00, 0x22, 0x0C, 0x00, 0x62, 0x38, 0x00, 0x4E, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x809D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x809E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xA2, 0x00, 0x24, 0x92, 0x00, 0x24, 0xD2, 0x00, 0x3C, 0x46, 0x00, 0x25, 0x44, 0x00, 0x25, 0x6C, 0x00, 0x26, 0x28, 0x00, 0x3C, 0x38, 0x00, 0x24, 0x10, 0x00, 0x24, 0x38, 0x00, 0x24, 0x6C, 0x00, 0x24, 0x46, 0x00, 0x64, 0xC3, 0x00, 0x4D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x809F, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0x7E, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x00, 0x12, 0x42, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x22, 0x00, 0x4A, 0x14, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80A0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0x40, 0x00, 0x3C, 0x82, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x4A, 0x00, 0x24, 0x4A, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x25, 0x22, 0x00, 0x26, 0x22, 0x00, 0x24, 0x42, 0x00, 0x24, 0x94, 0x00, 0x4C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7C, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x80, 0x12, 0x44, 0x80, 0x1E, 0x87, 0x80, 0x12, 0x80, 0x00, 0x13, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x24, 0x00, 0x12, 0x14, 0x00, 0x12, 0x08, 0x00, 0x12, 0x14, 0x00, 0x22, 0x22, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80A2, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x41, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x14, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x14, 0x00, 0x22, 0x22, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80A4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x12, 0x14, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x26, 0x83, 0x00, 0x43, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x11, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x40, 0x00, 0x11, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x11, 0x40, 0x00, 0x11, 0x40, 0x00, 0x11, 0x40, 0x80, 0x11, 0x40, 0x80, 0x21, 0x7F, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80A6, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x04, 0x00, 0x24, 0x46, 0x00, 0x24, 0xC2, 0x00, 0x25, 0x83, 0x00, 0x3F, 0x01, 0x80, 0x24, 0xFE, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x3C, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x62, 0x00, 0x24, 0x46, 0x00, 0x64, 0xC4, 0x00, 0x4D, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x30, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x68, 0x00, 0x24, 0xEC, 0x00, 0x25, 0xA6, 0x00, 0x3F, 0x23, 0x80, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x64, 0x20, 0x00, 0x4C, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80A9, { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x0F, 0xE0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x01, 0x00, 0x12, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80AA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x1E, 0x21, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x81, 0x00, 0x22, 0x82, 0x00, 0x27, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80AB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x13, 0x00, 0x24, 0x1E, 0x00, 0x25, 0xF0, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3C, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x80, 0x64, 0x19, 0x80, 0x4C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80AC, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3C, 0x13, 0x00, 0x24, 0x11, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x38, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x68, 0x00, 0x24, 0x48, 0x80, 0x64, 0xC9, 0x80, 0x4D, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80AD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x39, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x3D, 0x6D, 0x00, 0x25, 0x45, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x65, 0x01, 0x00, 0x4D, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80AE, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x10, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x7C, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x49, 0x00, 0x22, 0x89, 0x00, 0x4B, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80AF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80B1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x12, 0x88, 0x00, 0x1E, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x90, 0x00, 0x12, 0x90, 0x00, 0x1E, 0x90, 0x00, 0x12, 0xA0, 0x00, 0x12, 0xA1, 0x00, 0x12, 0xA1, 0x00, 0x12, 0xCF, 0x80, 0x22, 0xF0, 0x80, 0x2E, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80B2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x04, 0x02, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80B4, { 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x01, 0xD8, 0x00, 0x00, 0x70, 0x00, 0x03, 0x8C, 0x00, 0x1C, 0x42, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x06, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x32, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80B7, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x92, 0x00, 0x13, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x4A, 0x83, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80B8, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x04, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0xC6, 0x00, 0x3D, 0x83, 0x00, 0x27, 0x01, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80B9, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x04, 0x00, 0x24, 0x44, 0x00, 0x24, 0xC6, 0x00, 0x25, 0x83, 0x00, 0x3F, 0x01, 0x80, 0x24, 0x7C, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x64, 0x06, 0x00, 0x4C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80BA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x4B, 0x00, 0x22, 0x08, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80BC, { 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x84, 0x00, 0x4A, 0x84, 0x00, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80BD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x28, 0x00, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x22, 0x64, 0x00, 0x22, 0x54, 0x00, 0x4A, 0x83, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80BE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x88, 0x00, 0x24, 0x50, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0x07, 0x00, 0x0F, 0xFA, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80BF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C0, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x1F, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x44, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x50, 0x00, 0x12, 0x42, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x50, 0x00, 0x1E, 0x50, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x44, 0x00, 0x22, 0x47, 0x00, 0x4A, 0x62, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C1, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x24, 0x40, 0x00, 0x24, 0x44, 0x00, 0x25, 0xFE, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x25, 0x46, 0x00, 0x25, 0x45, 0x00, 0x3D, 0x45, 0x00, 0x26, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x25, 0x04, 0x00, 0x26, 0x14, 0x00, 0x4C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x12, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x22, 0x92, 0x00, 0x22, 0x10, 0x00, 0x4A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x65, 0xFF, 0x80, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80C8, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x26, 0x00, 0x24, 0x22, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x76, 0x00, 0x3C, 0x54, 0x00, 0x24, 0xDC, 0x00, 0x24, 0x88, 0x00, 0x25, 0x9C, 0x00, 0x27, 0x36, 0x00, 0x64, 0x63, 0x00, 0x4C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80CC, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x23, 0x80, 0x3F, 0x3C, 0x00, 0x01, 0x20, 0x00, 0x01, 0x20, 0x00, 0x07, 0x20, 0x80, 0x39, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80CD, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x1E, 0x00, 0x24, 0xF2, 0x00, 0x24, 0x82, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x93, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x25, 0x95, 0x00, 0x25, 0x15, 0x80, 0x65, 0x1C, 0x80, 0x4D, 0x76, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80CE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x20, 0x00, 0x12, 0x22, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x8F, 0x00, 0x13, 0xF0, 0x80, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80CF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x13, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x90, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0xFF, 0x80, 0x3C, 0x10, 0x80, 0x24, 0x30, 0x80, 0x24, 0x30, 0x80, 0x24, 0x50, 0x80, 0x24, 0x90, 0x80, 0x65, 0x11, 0x80, 0x4C, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA6, 0x00, 0x3C, 0xBC, 0x00, 0x24, 0xA0, 0x00, 0x25, 0xA0, 0x00, 0x25, 0x20, 0x00, 0x27, 0x21, 0x00, 0x64, 0x33, 0x00, 0x4C, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80D4, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x24, 0x23, 0x00, 0x27, 0xBE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x80, 0x27, 0xB1, 0x80, 0x3C, 0x1F, 0x00, 0x60, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x16, 0x9A, 0x00, 0x10, 0x82, 0x00, 0x11, 0x42, 0x00, 0x16, 0x3A, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80D5, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0xC2, 0x00, 0x24, 0xBF, 0x80, 0x3C, 0x82, 0x00, 0x25, 0x82, 0x00, 0x26, 0x92, 0x00, 0x24, 0x9A, 0x00, 0x3C, 0x8A, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x64, 0x82, 0x00, 0x4C, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80D6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x92, 0x00, 0x25, 0x93, 0x00, 0x25, 0x11, 0x00, 0x24, 0x10, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80D7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x24, 0x28, 0x00, 0x24, 0x6C, 0x00, 0x24, 0xC6, 0x00, 0x3D, 0x93, 0x00, 0x27, 0x31, 0x80, 0x24, 0x64, 0x00, 0x24, 0xCC, 0x00, 0x3C, 0x18, 0x00, 0x24, 0x31, 0x00, 0x24, 0xE3, 0x00, 0x24, 0x06, 0x00, 0x24, 0x0C, 0x00, 0x64, 0x38, 0x00, 0x4C, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80D8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x30, 0x00, 0x24, 0x62, 0x00, 0x24, 0xC6, 0x00, 0x24, 0x64, 0x00, 0x3C, 0x2C, 0x00, 0x24, 0x18, 0x00, 0x24, 0x32, 0x00, 0x24, 0x23, 0x00, 0x24, 0x61, 0x00, 0x64, 0xCF, 0x80, 0x4D, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80D9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x50, 0x00, 0x3E, 0xD0, 0x00, 0x23, 0x90, 0x00, 0x22, 0x1F, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x1F, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x62, 0x10, 0x00, 0x4E, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x02, 0x00, 0x12, 0x04, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x88, 0x80, 0x13, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x26, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x1E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x1E, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80DC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0x94, 0x00, 0x3C, 0xFE, 0x00, 0x25, 0x10, 0x00, 0x26, 0x10, 0x00, 0x24, 0x14, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80DD, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x0E, 0x00, 0x24, 0xF8, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3C, 0x8C, 0x00, 0x24, 0x84, 0x00, 0x24, 0xE4, 0x00, 0x25, 0x86, 0x00, 0x24, 0x02, 0x80, 0x65, 0xF3, 0x80, 0x4C, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80DE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x81, 0x00, 0x1F, 0x01, 0x00, 0x12, 0x7D, 0x00, 0x12, 0x45, 0x00, 0x12, 0x45, 0x00, 0x1E, 0x7D, 0x00, 0x12, 0x41, 0x00, 0x12, 0x46, 0x00, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x22, 0x7F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80E0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x62, 0x00, 0x24, 0x43, 0x00, 0x24, 0x41, 0x00, 0x24, 0xCF, 0x80, 0x64, 0xF8, 0x80, 0x4D, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80E1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0F, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x0F, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x4F, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x50, 0x80, 0x10, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80E4, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0xA4, 0x00, 0x15, 0x24, 0x00, 0x12, 0x44, 0x00, 0x11, 0x94, 0x00, 0x11, 0x3C, 0x00, 0x17, 0xCC, 0x00, 0x10, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x80, 0x14, 0x24, 0x80, 0x28, 0x67, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80E7, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x1F, 0x50, 0x00, 0x12, 0x48, 0x00, 0x12, 0x4A, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x50, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x54, 0x00, 0x1E, 0x54, 0x00, 0x12, 0x58, 0x00, 0x12, 0x50, 0x00, 0x22, 0xB1, 0x00, 0x22, 0x91, 0x00, 0x4B, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80E8, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x40, 0x00, 0x1E, 0x50, 0x00, 0x12, 0x90, 0x00, 0x12, 0x92, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x54, 0x00, 0x12, 0x52, 0x00, 0x22, 0x93, 0x00, 0x23, 0x11, 0x00, 0x4A, 0x50, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80E9, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x12, 0x24, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x30, 0x00, 0x12, 0x28, 0x00, 0x22, 0x26, 0x00, 0x22, 0x22, 0x00, 0x4A, 0x20, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80EA, { 0x00, 0x00, 0x00, 0x02, 0x12, 0x00, 0x1F, 0x1F, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x82, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x1E, 0x82, 0x00, 0x12, 0x80, 0x00, 0x12, 0x80, 0x00, 0x22, 0x80, 0x00, 0x22, 0x80, 0x00, 0x4A, 0x80, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80EB, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x12, 0x08, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x2C, 0x00, 0x12, 0x43, 0x00, 0x13, 0x81, 0x00, 0x12, 0x00, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x12, 0x00, 0x4B, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80EC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x09, 0x04, 0x00, 0x1A, 0x28, 0x00, 0x06, 0x10, 0x00, 0x19, 0x6C, 0x00, 0x60, 0x83, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x11, 0x44, 0x00, 0x12, 0x24, 0x00, 0x10, 0x84, 0x00, 0x11, 0x44, 0x00, 0x12, 0x24, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x7D, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0x39, 0x00, 0x3D, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0x45, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x65, 0xFF, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80EE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x7E, 0x00, 0x24, 0xC2, 0x00, 0x25, 0xA4, 0x00, 0x3C, 0x18, 0x00, 0x24, 0x6E, 0x00, 0x25, 0xC3, 0x80, 0x24, 0x08, 0x00, 0x3C, 0x7F, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x64, 0x08, 0x00, 0x4C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80EF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x24, 0x42, 0x00, 0x3D, 0x81, 0x80, 0x24, 0x7E, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x64, 0x03, 0x00, 0x4C, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80F0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x25, 0xFE, 0x00, 0x3C, 0x22, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x20, 0x00, 0x25, 0x20, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x51, 0x00, 0x24, 0x51, 0x00, 0x24, 0xDB, 0x00, 0x24, 0x8C, 0x00, 0x65, 0x86, 0x00, 0x4F, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80F1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x88, 0x80, 0x12, 0x88, 0x80, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x80, 0x22, 0x82, 0x80, 0x2F, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80F2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x3C, 0x60, 0x00, 0x24, 0xC4, 0x00, 0x25, 0x8C, 0x00, 0x24, 0xD8, 0x00, 0x3C, 0x32, 0x00, 0x24, 0x66, 0x00, 0x24, 0xCC, 0x00, 0x25, 0x98, 0x00, 0x24, 0x36, 0x00, 0x64, 0x63, 0x00, 0x4D, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80F3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x25, 0xC6, 0x00, 0x3F, 0x6C, 0x00, 0x24, 0x38, 0x00, 0x24, 0x6C, 0x00, 0x24, 0xC6, 0x00, 0x3F, 0x83, 0x80, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x64, 0x82, 0x00, 0x4C, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xBD, 0x00, 0x12, 0xA5, 0x00, 0x1E, 0xA5, 0x00, 0x12, 0xBD, 0x00, 0x12, 0xA5, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x22, 0x81, 0x00, 0x26, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80F6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x3C, 0xC6, 0x00, 0x25, 0x83, 0x80, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x6C, 0x00, 0x24, 0x38, 0x00, 0x24, 0x10, 0x00, 0x24, 0x38, 0x00, 0x24, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x4D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80F8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x80, 0x80, 0x1F, 0x02, 0x80, 0x12, 0xCA, 0x80, 0x12, 0xAA, 0x80, 0x12, 0x92, 0x80, 0x1E, 0xB2, 0x80, 0x12, 0xCA, 0x80, 0x12, 0x8A, 0x80, 0x12, 0xFE, 0x80, 0x12, 0x82, 0x80, 0x22, 0x01, 0x00, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x80, 0x3D, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x3D, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x65, 0x24, 0x80, 0x4D, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80FA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x3D, 0x20, 0x80, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x46, 0x00, 0x24, 0xF4, 0x00, 0x24, 0x0C, 0x00, 0x24, 0x1E, 0x00, 0x64, 0x73, 0x00, 0x4D, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80FC, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x3C, 0xC6, 0x00, 0x24, 0x44, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0xC4, 0x00, 0x64, 0x84, 0x00, 0x4D, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x80FD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x11, 0x23, 0x00, 0x27, 0xBC, 0x00, 0x38, 0xA0, 0x00, 0x00, 0x20, 0x80, 0x3F, 0x3F, 0x80, 0x21, 0x00, 0x00, 0x21, 0x20, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x26, 0x00, 0x21, 0x38, 0x00, 0x3F, 0x20, 0x00, 0x21, 0x20, 0x80, 0x21, 0x20, 0x80, 0x23, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x80FE, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x13, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xD9, 0x00, 0x24, 0x4B, 0x00, 0x2A, 0x4A, 0x00, 0x35, 0xCE, 0x00, 0x24, 0x44, 0x00, 0x2A, 0x4E, 0x80, 0x31, 0xCA, 0x80, 0x20, 0x5B, 0x80, 0x20, 0xD1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8102, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1E, 0x47, 0x00, 0x12, 0x78, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x80, 0x1E, 0x7F, 0x80, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x21, 0x00, 0x24, 0x61, 0x00, 0x24, 0xC3, 0x00, 0x3C, 0x86, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x00, 0x00, 0x25, 0x00, 0x00, 0x25, 0x00, 0x80, 0x65, 0x81, 0x80, 0x4C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8105, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x08, 0x00, 0x06, 0x74, 0x00, 0x1F, 0xDF, 0x80, 0x04, 0x84, 0x80, 0x08, 0x88, 0x80, 0x17, 0x17, 0x00, 0x20, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8106, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x84, 0x00, 0x13, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x12, 0xBE, 0x00, 0x12, 0xA2, 0x00, 0x1E, 0xA2, 0x00, 0x12, 0xAE, 0x00, 0x12, 0xA0, 0x00, 0x12, 0xA0, 0x80, 0x12, 0xA0, 0x80, 0x22, 0xBF, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8107, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x11, 0x00, 0x14, 0x21, 0x00, 0x1C, 0x42, 0x00, 0x14, 0x8C, 0x00, 0x15, 0x82, 0x00, 0x14, 0x82, 0x00, 0x17, 0xEF, 0x80, 0x1C, 0xA2, 0x80, 0x14, 0xA2, 0x80, 0x15, 0x24, 0x80, 0x15, 0x24, 0x80, 0x26, 0xCB, 0x00, 0x2C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8108, { 0x00, 0x00, 0x00, 0x1E, 0x07, 0x00, 0x12, 0xF8, 0x00, 0x12, 0x80, 0x00, 0x12, 0x86, 0x00, 0x1E, 0x98, 0x00, 0x12, 0xE0, 0x00, 0x12, 0xA1, 0x00, 0x12, 0xB2, 0x00, 0x12, 0xB4, 0x00, 0x1E, 0xA8, 0x00, 0x12, 0xA8, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA4, 0x00, 0x12, 0xA2, 0x00, 0x22, 0xA1, 0x00, 0x26, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8109, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x3C, 0x38, 0x00, 0x24, 0x08, 0x00, 0x24, 0x00, 0x00, 0x24, 0xF0, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x11, 0x00, 0x25, 0xD3, 0x00, 0x24, 0x5A, 0x00, 0x3C, 0x54, 0x00, 0x24, 0xD4, 0x00, 0x24, 0x92, 0x00, 0x25, 0x93, 0x00, 0x27, 0x11, 0x80, 0x64, 0x10, 0x00, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x810A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1E, 0x4F, 0x00, 0x00, 0x40, 0x00, 0x1E, 0xAF, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x810B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x82, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x80, 0x11, 0x08, 0x80, 0x66, 0x33, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x810D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x12, 0x83, 0x00, 0x1F, 0x08, 0x00, 0x12, 0x7C, 0x00, 0x12, 0x00, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x22, 0x24, 0x00, 0x22, 0x42, 0x00, 0x4A, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x810E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x84, 0x00, 0x12, 0x48, 0x00, 0x12, 0x30, 0x00, 0x12, 0x28, 0x00, 0x1E, 0x46, 0x00, 0x12, 0x92, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x54, 0x00, 0x12, 0x93, 0x00, 0x23, 0x11, 0x00, 0x22, 0x10, 0x00, 0x4A, 0x50, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x810F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x0A, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x80, 0x00, 0x12, 0x88, 0x00, 0x1E, 0x88, 0x00, 0x12, 0x8A, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x88, 0x00, 0x1E, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x22, 0x8A, 0x00, 0x4A, 0xFF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8110, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x24, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x88, 0x00, 0x24, 0x50, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x58, 0x00, 0x24, 0x87, 0x00, 0x27, 0x0A, 0x00, 0x3C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x25, 0x08, 0x00, 0x46, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8111, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x3D, 0x0A, 0x00, 0x25, 0x8A, 0x00, 0x25, 0x52, 0x00, 0x25, 0x52, 0x00, 0x3D, 0x22, 0x00, 0x25, 0x52, 0x00, 0x25, 0x8E, 0x00, 0x25, 0x06, 0x00, 0x25, 0x02, 0x00, 0x25, 0xFE, 0x00, 0x4D, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8112, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x12, 0x92, 0x00, 0x12, 0x52, 0x00, 0x12, 0x54, 0x00, 0x1E, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x30, 0x00, 0x1E, 0x38, 0x00, 0x12, 0x54, 0x00, 0x12, 0x54, 0x00, 0x22, 0x93, 0x00, 0x23, 0x12, 0x00, 0x4A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8113, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x22, 0x00, 0x26, 0x24, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x42, 0x00, 0x24, 0xA6, 0x00, 0x25, 0xA8, 0x00, 0x3E, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0x88, 0x00, 0x24, 0x87, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xC0, 0x00, 0x4C, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8114, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x12, 0x26, 0x00, 0x22, 0xA2, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x11, 0x44, 0x00, 0x12, 0x34, 0x00, 0x14, 0x94, 0x00, 0x11, 0x44, 0x00, 0x12, 0x34, 0x00, 0x14, 0x14, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8116, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x04, 0x00, 0x24, 0x08, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8117, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3C, 0x80, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x29, 0x00, 0x26, 0x49, 0x00, 0x3C, 0x91, 0x00, 0x25, 0x23, 0x00, 0x24, 0x42, 0x00, 0x24, 0x8E, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x64, 0x82, 0x00, 0x4C, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8118, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x16, 0x00, 0x80, 0x14, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x84, 0x80, 0x25, 0x07, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x811A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1C, 0x47, 0x80, 0x14, 0x44, 0x80, 0x15, 0xF4, 0x80, 0x14, 0x44, 0x80, 0x1C, 0x44, 0x80, 0x14, 0x44, 0x80, 0x14, 0x44, 0x80, 0x17, 0xFC, 0x80, 0x1C, 0x84, 0x80, 0x14, 0xA4, 0x80, 0x15, 0x14, 0x80, 0x15, 0x74, 0x80, 0x17, 0x8D, 0x80, 0x24, 0x04, 0x00, 0x2C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x811B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0x49, 0x00, 0x12, 0x92, 0x00, 0x1F, 0x24, 0x00, 0x12, 0x92, 0x00, 0x12, 0x49, 0x00, 0x12, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x811C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x3C, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x64, 0x7F, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x811E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3D, 0x55, 0x00, 0x25, 0x55, 0x00, 0x26, 0x38, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x67, 0xFF, 0x80, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8120, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3D, 0xC7, 0x00, 0x24, 0x5C, 0x00, 0x24, 0x44, 0x00, 0x24, 0x84, 0x00, 0x3D, 0xD4, 0x00, 0x24, 0x57, 0x80, 0x24, 0x54, 0x00, 0x24, 0x54, 0x00, 0x3D, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0xD4, 0x00, 0x24, 0x9F, 0x80, 0x25, 0xC0, 0x00, 0x65, 0x70, 0x00, 0x4F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x13, 0xD8, 0x00, 0x1E, 0x07, 0x80, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8124, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x3C, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x80, 0x24, 0xA4, 0x00, 0x3C, 0xA4, 0x80, 0x24, 0xA5, 0x80, 0x24, 0xA5, 0x00, 0x25, 0xA6, 0x00, 0x25, 0x22, 0x00, 0x67, 0x3B, 0x00, 0x4C, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8127, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x62, 0x00, 0x24, 0x42, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x49, 0x00, 0x3C, 0x48, 0x00, 0x24, 0xCF, 0x80, 0x25, 0xA0, 0x00, 0x24, 0x3E, 0x00, 0x3C, 0x62, 0x00, 0x24, 0xC6, 0x00, 0x25, 0xAC, 0x00, 0x24, 0x18, 0x00, 0x24, 0x3C, 0x00, 0x64, 0x66, 0x00, 0x4D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8129, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x62, 0x00, 0x1A, 0xA4, 0x00, 0x1B, 0x18, 0x00, 0x2A, 0x14, 0x00, 0x0A, 0x63, 0x80, 0x0B, 0x80, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x812B, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1E, 0x02, 0x00, 0x12, 0x41, 0x00, 0x12, 0x80, 0x80, 0x13, 0xFF, 0x00, 0x1E, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x80, 0x22, 0x47, 0x80, 0x26, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x812C, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3C, 0x1C, 0x00, 0x27, 0xF4, 0x00, 0x24, 0xA6, 0x00, 0x25, 0xB3, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x24, 0x0C, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4C, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x812F, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x09, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8130, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x82, 0x00, 0x24, 0xC6, 0x00, 0x24, 0x44, 0x00, 0x24, 0x04, 0x00, 0x65, 0xFF, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8131, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x66, 0x00, 0x22, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x64, 0x80, 0x62, 0x44, 0x80, 0x46, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8132, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x02, 0x00, 0x25, 0x02, 0x00, 0x25, 0xFE, 0x00, 0x3D, 0x10, 0x00, 0x25, 0x12, 0x00, 0x25, 0xD4, 0x00, 0x25, 0x58, 0x00, 0x3D, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x52, 0x00, 0x25, 0x92, 0x00, 0x25, 0x11, 0x00, 0x56, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8133, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x3D, 0x31, 0x80, 0x25, 0x91, 0x00, 0x24, 0x93, 0x00, 0x24, 0x82, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x82, 0x80, 0x24, 0xA6, 0x80, 0x24, 0xB4, 0x80, 0x3C, 0x9C, 0x80, 0x24, 0x88, 0x80, 0x24, 0x9C, 0x80, 0x24, 0xB6, 0x80, 0x24, 0xA2, 0x80, 0x64, 0x80, 0x80, 0x4C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x24, 0x2C, 0x00, 0x24, 0x66, 0x00, 0x64, 0xC3, 0x00, 0x4D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8136, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x1E, 0xFE, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0xAA, 0x00, 0x22, 0xC6, 0x00, 0x22, 0x82, 0x00, 0x4A, 0x8A, 0x00, 0x04, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8138, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x3D, 0x07, 0x00, 0x26, 0xFA, 0x00, 0x24, 0x00, 0x00, 0x25, 0x44, 0x00, 0x3D, 0x24, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA8, 0x00, 0x24, 0xA8, 0x00, 0x24, 0x12, 0x00, 0x27, 0xFF, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8139, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x40, 0x00, 0x1E, 0x7E, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x00, 0x13, 0xFF, 0x80, 0x1E, 0x48, 0x00, 0x12, 0x49, 0x00, 0x12, 0x46, 0x00, 0x12, 0x44, 0x00, 0x12, 0x42, 0x00, 0x22, 0x7D, 0x00, 0x26, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x813A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x24, 0xE7, 0x00, 0x25, 0xBD, 0x80, 0x24, 0x00, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x813C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xDD, 0x00, 0x25, 0x55, 0x00, 0x3D, 0x55, 0x00, 0x25, 0x55, 0x00, 0x25, 0xBB, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x65, 0x11, 0x00, 0x4D, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x813E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x44, 0x00, 0x12, 0x84, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x04, 0x00, 0x22, 0x04, 0x00, 0x26, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8145, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x91, 0x00, 0x24, 0x93, 0x00, 0x25, 0xBA, 0x00, 0x25, 0x28, 0x00, 0x3C, 0x6C, 0x00, 0x24, 0xC6, 0x00, 0x25, 0x93, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x91, 0x00, 0x24, 0x93, 0x00, 0x25, 0xBA, 0x00, 0x25, 0x28, 0x00, 0x24, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x4D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8146, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0xFE, 0x00, 0x24, 0xAA, 0x00, 0x3C, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xFE, 0x00, 0x24, 0xAA, 0x00, 0x3C, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0x44, 0x00, 0x64, 0xC6, 0x00, 0x4D, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8147, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3D, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x3C, 0xD6, 0x00, 0x25, 0x93, 0x00, 0x27, 0x11, 0x80, 0x24, 0x10, 0x00, 0x3C, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x8C, 0x00, 0x25, 0xF8, 0x00, 0x64, 0x2E, 0x00, 0x4D, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8148, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x1F, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0xFE, 0x00, 0x1E, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x1E, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x4A, 0x8A, 0x00, 0x04, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x814A, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x64, 0x82, 0x00, 0x4C, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x814B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x88, 0x00, 0x38, 0x88, 0x00, 0x29, 0x1F, 0x00, 0x29, 0x19, 0x00, 0x2B, 0x26, 0x00, 0x3D, 0x52, 0x00, 0x29, 0x94, 0x00, 0x29, 0x08, 0x00, 0x29, 0x0C, 0x00, 0x29, 0x12, 0x00, 0x39, 0x21, 0x00, 0x29, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x814C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x54, 0x00, 0x3C, 0x92, 0x00, 0x25, 0xFF, 0x00, 0x26, 0x91, 0x80, 0x24, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x64, 0x18, 0x80, 0x4C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x814E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x1F, 0xCA, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xCA, 0x00, 0x12, 0x11, 0x00, 0x1F, 0xE0, 0x80, 0x10, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8150, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x06, 0x00, 0x12, 0x05, 0x00, 0x16, 0xFF, 0x80, 0x1A, 0x44, 0x00, 0x12, 0x24, 0x00, 0x12, 0x0C, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x51, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x25, 0x00, 0x24, 0x51, 0x00, 0x25, 0x8D, 0x00, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8151, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x12, 0x00, 0x15, 0x12, 0x00, 0x1D, 0x22, 0x00, 0x15, 0x7F, 0x80, 0x15, 0xA2, 0x00, 0x15, 0x22, 0x00, 0x1D, 0x2A, 0x00, 0x15, 0x26, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x25, 0x22, 0x00, 0x2D, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8152, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x08, 0x00, 0x25, 0x08, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x08, 0x00, 0x3D, 0x08, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x26, 0x41, 0x00, 0x64, 0x41, 0x00, 0x4C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8153, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x25, 0xE7, 0x80, 0x24, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x25, 0xE7, 0x80, 0x24, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x64, 0x00, 0x25, 0xA7, 0x80, 0x24, 0x24, 0x00, 0x24, 0x64, 0x00, 0x64, 0x44, 0x00, 0x4C, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8154, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x12, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x44, 0x80, 0x12, 0x87, 0x80, 0x13, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8155, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x16, 0x00, 0x80, 0x14, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x99, 0x00, 0x14, 0x99, 0x00, 0x15, 0x69, 0x00, 0x1E, 0x2B, 0x00, 0x14, 0x48, 0x00, 0x14, 0x48, 0x00, 0x14, 0x88, 0x80, 0x25, 0x0F, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8157, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x62, 0x00, 0x24, 0x42, 0x00, 0x64, 0xC2, 0x00, 0x4D, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8159, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3D, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x26, 0x02, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x24, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x90, 0x00, 0x24, 0x94, 0x00, 0x24, 0x93, 0x00, 0x25, 0x11, 0x00, 0x54, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x815A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x26, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x94, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x25, 0x53, 0x00, 0x56, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x815F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x25, 0x00, 0x80, 0x3C, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x64, 0x00, 0x24, 0x46, 0x00, 0x3C, 0xFB, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x64, 0x10, 0x00, 0x4D, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8160, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x28, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x7D, 0x80, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x28, 0x00, 0x24, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x4F, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x3D, 0x3D, 0x00, 0x25, 0x25, 0x00, 0x25, 0x25, 0x00, 0x25, 0x25, 0x00, 0x25, 0x3D, 0x00, 0x65, 0x01, 0x00, 0x4D, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x88, 0x00, 0x13, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x24, 0x80, 0x12, 0x49, 0x00, 0x12, 0x92, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x24, 0x80, 0x12, 0x00, 0x00, 0x12, 0x08, 0x00, 0x12, 0x10, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0xA2, 0x80, 0x12, 0x94, 0x80, 0x12, 0x9C, 0x80, 0x22, 0xA2, 0x80, 0x22, 0xFF, 0x80, 0x26, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8167, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3C, 0x18, 0x00, 0x24, 0x6C, 0x00, 0x24, 0xC6, 0x00, 0x27, 0x83, 0x80, 0x3C, 0x7C, 0x00, 0x24, 0x00, 0x00, 0x25, 0xE4, 0x80, 0x25, 0x24, 0x80, 0x3D, 0xAD, 0x80, 0x25, 0x69, 0x00, 0x25, 0x29, 0x00, 0x25, 0xA9, 0x00, 0x25, 0x6D, 0x80, 0x65, 0x24, 0x80, 0x4D, 0x64, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8168, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0x10, 0x80, 0x25, 0x10, 0x80, 0x25, 0x10, 0x80, 0x25, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x20, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x65, 0x24, 0x80, 0x4D, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8169, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x45, 0x00, 0x25, 0x29, 0x00, 0x25, 0x7D, 0x00, 0x3D, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0x7D, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x65, 0x11, 0x00, 0x4D, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x816B, { 0x00, 0x00, 0x00, 0x1E, 0x0F, 0x00, 0x12, 0x78, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x816D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x20, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x64, 0x06, 0x00, 0x4C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x816E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x08, 0x00, 0x24, 0x2C, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xA1, 0x80, 0x65, 0xA2, 0x80, 0x4D, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x816F, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x1E, 0x00, 0x25, 0xF0, 0x00, 0x25, 0x08, 0x00, 0x25, 0xFF, 0x80, 0x3D, 0x08, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x3D, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x25, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x64, 0x41, 0x00, 0x4C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x12, 0xFF, 0x00, 0x12, 0xA5, 0x00, 0x1E, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x1E, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0xC8, 0x00, 0x13, 0x38, 0x00, 0x22, 0x26, 0x00, 0x26, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8171, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1D, 0xC8, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x4A, 0x00, 0x14, 0xFF, 0x80, 0x1C, 0x8A, 0x00, 0x15, 0xFE, 0x00, 0x16, 0x48, 0x00, 0x14, 0x7F, 0x00, 0x1E, 0x48, 0x00, 0x15, 0x48, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x88, 0x00, 0x25, 0x48, 0x00, 0x25, 0x3F, 0x80, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8174, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xD0, 0x00, 0x25, 0x97, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0xD7, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xD7, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x38, 0x00, 0x24, 0x2C, 0x00, 0x24, 0x64, 0x00, 0x24, 0x46, 0x00, 0x64, 0xC3, 0x00, 0x4D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x65, 0x11, 0x00, 0x4D, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x14, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x40, 0x00, 0x14, 0xFF, 0x80, 0x1D, 0x12, 0x80, 0x16, 0x22, 0x80, 0x14, 0x44, 0x80, 0x15, 0x88, 0x80, 0x24, 0x31, 0x00, 0x2C, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8179, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x40, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x80, 0x00, 0x13, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x62, 0x00, 0x13, 0x94, 0x00, 0x12, 0x08, 0x00, 0x22, 0x36, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x817A, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x08, 0x80, 0x1E, 0xF9, 0x00, 0x12, 0x1A, 0x00, 0x12, 0x2C, 0x00, 0x12, 0x4A, 0x00, 0x22, 0x8A, 0x00, 0x23, 0x09, 0x00, 0x26, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x817B, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x3C, 0x08, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x08, 0x00, 0x25, 0xE8, 0x00, 0x3C, 0x08, 0x00, 0x27, 0xF8, 0x00, 0x24, 0x08, 0x00, 0x25, 0xF4, 0x00, 0x3D, 0x14, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x55, 0x00, 0x25, 0x55, 0x00, 0x24, 0xA5, 0x00, 0x4D, 0x12, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x817C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3E, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x42, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x7A, 0x00, 0x3D, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x7A, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x55, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x817D, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x3E, 0xFE, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x3C, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFE, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x25, 0x4A, 0x00, 0x57, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x817E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3D, 0x24, 0x00, 0x24, 0xA8, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x25, 0x07, 0x00, 0x26, 0xFA, 0x00, 0x3C, 0x08, 0x00, 0x24, 0x8A, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x44, 0x0A, 0x00, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x817F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1E, 0x5F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x12, 0x1F, 0x00, 0x1F, 0x11, 0x00, 0x12, 0x91, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x18, 0x80, 0x1E, 0xD5, 0x00, 0x12, 0x52, 0x00, 0x12, 0x53, 0x00, 0x12, 0x5C, 0x80, 0x22, 0x70, 0x00, 0x22, 0xBF, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8180, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x42, 0x00, 0x12, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x13, 0x10, 0x80, 0x12, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x41, 0x00, 0x22, 0x82, 0x00, 0x27, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8181, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3C, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x48, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x49, 0x00, 0x24, 0x49, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x4C, 0x00, 0x24, 0xCA, 0x00, 0x25, 0x4B, 0x00, 0x66, 0x49, 0x80, 0x4C, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8182, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0xC0, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x24, 0x80, 0x32, 0x25, 0x00, 0x22, 0x36, 0x00, 0x6E, 0x63, 0x00, 0x00, 0x01, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xBA, 0x00, 0x3C, 0xAA, 0x00, 0x24, 0xC6, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x67, 0xFF, 0x80, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8184, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xD0, 0x00, 0x25, 0x97, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x3D, 0xD7, 0x00, 0x25, 0x11, 0x00, 0x25, 0x11, 0x00, 0x25, 0xD7, 0x00, 0x3C, 0x00, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x24, 0x4C, 0x00, 0x24, 0x38, 0x00, 0x64, 0xEE, 0x00, 0x4F, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8185, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x08, 0x00, 0x25, 0x7F, 0x00, 0x3D, 0x09, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x09, 0x00, 0x25, 0x09, 0x00, 0x3D, 0x7F, 0x00, 0x25, 0x08, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x26, 0x41, 0x00, 0x64, 0x41, 0x00, 0x4C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8186, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x24, 0x00, 0x24, 0xC8, 0x00, 0x3C, 0x32, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x54, 0x00, 0x24, 0xD6, 0x00, 0x65, 0x93, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x1E, 0xF7, 0x80, 0x12, 0x80, 0x80, 0x12, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x22, 0x88, 0x80, 0x26, 0x8B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x818A, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x12, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x04, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0x24, 0x00, 0x22, 0x04, 0x00, 0x2E, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x818B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0xA9, 0x00, 0x15, 0x2A, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x04, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x818E, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x1E, 0x00, 0x24, 0xF1, 0x00, 0x24, 0x99, 0x80, 0x25, 0x88, 0x80, 0x3D, 0x20, 0x00, 0x24, 0x48, 0x00, 0x24, 0x90, 0x00, 0x24, 0x62, 0x00, 0x3C, 0x3F, 0x00, 0x25, 0xE1, 0x80, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x64, 0x46, 0x00, 0x4D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x818F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8190, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0xC0, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x24, 0x80, 0x32, 0x25, 0x00, 0x22, 0x36, 0x00, 0x6E, 0x63, 0x00, 0x00, 0x81, 0x80, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x16, 0x9A, 0x00, 0x11, 0x42, 0x00, 0x16, 0x3A, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8191, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x26, 0x1A, 0x00, 0x3C, 0xE0, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x24, 0x8A, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x48, 0x00, 0x54, 0x86, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8193, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3D, 0xFF, 0x00, 0x27, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x80, 0x00, 0x25, 0xFF, 0x00, 0x27, 0x25, 0x00, 0x24, 0x49, 0x00, 0x64, 0x91, 0x00, 0x4C, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x2A, 0x14, 0x80, 0x2A, 0x12, 0x80, 0x2B, 0xFF, 0x80, 0x3A, 0x10, 0x80, 0x2A, 0xE8, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x3A, 0xEE, 0x80, 0x2A, 0x04, 0x80, 0x2A, 0xED, 0x80, 0x2A, 0x1B, 0x80, 0x2A, 0x72, 0x80, 0x6A, 0x00, 0x80, 0x5B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8196, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0x1F, 0x00, 0x25, 0xB1, 0x00, 0x24, 0xAA, 0x00, 0x25, 0x0E, 0x00, 0x3D, 0x9B, 0x00, 0x24, 0xF1, 0x80, 0x24, 0x04, 0x00, 0x27, 0xBF, 0x80, 0x3C, 0x84, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x65, 0xC0, 0x00, 0x4F, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x24, 0xFF, 0x00, 0x24, 0xA9, 0x00, 0x3C, 0xA9, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x92, 0x00, 0x24, 0x93, 0x00, 0x65, 0x91, 0x80, 0x4C, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x819A, { 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBD, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0xFC, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x819B, { 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x3C, 0xD3, 0x00, 0x24, 0x52, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x3D, 0x7E, 0x80, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x65, 0xFF, 0x80, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x819C, { 0x00, 0x00, 0x00, 0x1C, 0x44, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x44, 0x00, 0x14, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x1C, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x28, 0x00, 0x14, 0x44, 0x00, 0x24, 0x82, 0x00, 0x2F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x819D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x38, 0x00, 0x12, 0x54, 0x00, 0x1E, 0x92, 0x00, 0x13, 0x29, 0x80, 0x12, 0x46, 0x00, 0x13, 0x91, 0x80, 0x1E, 0x92, 0x00, 0x12, 0x54, 0x00, 0x12, 0x38, 0x00, 0x12, 0x54, 0x00, 0x12, 0x92, 0x00, 0x23, 0x11, 0x00, 0x26, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x819E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x12, 0x00, 0x24, 0x7F, 0x00, 0x27, 0xC1, 0x80, 0x24, 0x02, 0x00, 0x27, 0xFF, 0x80, 0x64, 0x82, 0x00, 0x4C, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xEF, 0x00, 0x14, 0x63, 0x00, 0x14, 0xA5, 0x00, 0x15, 0x6B, 0x00, 0x1C, 0xA5, 0x00, 0x15, 0x21, 0x00, 0x14, 0x18, 0x00, 0x14, 0x24, 0x00, 0x1C, 0xCA, 0x00, 0x17, 0x35, 0x80, 0x14, 0xC8, 0x00, 0x14, 0x12, 0x00, 0x14, 0x64, 0x00, 0x25, 0x98, 0x00, 0x2C, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x92, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x42, 0x00, 0x24, 0xE4, 0x00, 0x64, 0x3C, 0x00, 0x4D, 0xE7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x12, 0x25, 0x00, 0x1E, 0x47, 0x00, 0x13, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x21, 0x00, 0x1E, 0x47, 0x00, 0x12, 0xF8, 0x80, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x10, 0x80, 0x3D, 0xD6, 0x80, 0x25, 0x10, 0x80, 0x24, 0xD6, 0x00, 0x24, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x01, 0x00, 0x64, 0x01, 0x00, 0x4C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3D, 0x24, 0x00, 0x24, 0xA8, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x70, 0x00, 0x3C, 0xA8, 0x00, 0x25, 0x24, 0x00, 0x25, 0x04, 0x00, 0x25, 0xDF, 0x00, 0x3D, 0x54, 0x00, 0x26, 0x54, 0x00, 0x25, 0x94, 0x00, 0x24, 0xBF, 0x00, 0x25, 0x04, 0x00, 0x56, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A8, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x15, 0xF2, 0x00, 0x14, 0x42, 0x00, 0x17, 0xFC, 0x00, 0x1C, 0x09, 0x00, 0x15, 0xF1, 0x00, 0x15, 0x12, 0x00, 0x15, 0xF2, 0x00, 0x1D, 0x14, 0x80, 0x14, 0x08, 0x80, 0x15, 0x31, 0x00, 0x14, 0xA2, 0x00, 0x14, 0xF4, 0x00, 0x27, 0x08, 0x00, 0x2C, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81A9, { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3C, 0x04, 0x80, 0x27, 0xFF, 0x00, 0x24, 0x04, 0x00, 0x24, 0xF4, 0x00, 0x3C, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x24, 0xF4, 0x00, 0x3C, 0x94, 0x00, 0x24, 0xF6, 0x00, 0x24, 0x92, 0x00, 0x24, 0xF2, 0x00, 0x24, 0x92, 0x80, 0x64, 0xF3, 0x80, 0x4D, 0x99, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81AA, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x24, 0x44, 0x00, 0x24, 0x28, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x11, 0x00, 0x26, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3C, 0x96, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81AE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x3C, 0x82, 0x00, 0x27, 0xEF, 0x80, 0x24, 0x82, 0x00, 0x24, 0xE2, 0x00, 0x3F, 0x8F, 0x80, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x44, 0x80, 0x64, 0xC4, 0x80, 0x4F, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81B0, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3C, 0xF8, 0x00, 0x25, 0x11, 0x00, 0x24, 0x92, 0x00, 0x27, 0xFF, 0x80, 0x3C, 0x54, 0x00, 0x24, 0xD6, 0x00, 0x25, 0x93, 0x00, 0x27, 0x11, 0x80, 0x3C, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x65, 0x11, 0x00, 0x4D, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81B2, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x48, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x90, 0x00, 0x25, 0x90, 0x00, 0x3E, 0xFE, 0x00, 0x24, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0xFE, 0x00, 0x3C, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0xAA, 0x00, 0x65, 0xAB, 0x00, 0x4F, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81B3, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x1E, 0x12, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x12, 0x2A, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81B4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x25, 0xD5, 0x00, 0x24, 0x55, 0x00, 0x3C, 0x55, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x55, 0x00, 0x24, 0x55, 0x00, 0x3C, 0x55, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x55, 0x00, 0x64, 0xD5, 0x80, 0x4D, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81B5, { 0x00, 0x00, 0x00, 0x1E, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0x54, 0x00, 0x1E, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0xAA, 0x00, 0x13, 0x11, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x26, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81B8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x7F, 0x80, 0x25, 0x90, 0x00, 0x24, 0xBF, 0x00, 0x25, 0x64, 0x00, 0x3D, 0x9F, 0x80, 0x24, 0x80, 0x00, 0x24, 0x1F, 0x00, 0x27, 0x91, 0x00, 0x3C, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x24, 0x93, 0x00, 0x65, 0x40, 0x00, 0x4D, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81BA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x11, 0x28, 0x00, 0x12, 0x7F, 0x00, 0x16, 0xC8, 0x00, 0x1B, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x13, 0x7F, 0x80, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81BB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xBD, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xBD, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x64, 0x00, 0x00, 0x4D, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81BD, { 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x84, 0x00, 0x15, 0xFF, 0x80, 0x1F, 0x28, 0x80, 0x15, 0xC7, 0x80, 0x15, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x1D, 0xFF, 0x80, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x2E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81BE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x22, 0x00, 0x12, 0xC1, 0x80, 0x12, 0x3E, 0x00, 0x1E, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0xAA, 0x80, 0x12, 0x9C, 0x80, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x26, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81BF, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x1E, 0xBF, 0x00, 0x12, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x12, 0x93, 0x00, 0x23, 0x1D, 0x00, 0x27, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81C0, { 0x00, 0x00, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x92, 0x80, 0x3F, 0x93, 0x80, 0x2A, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x12, 0x00, 0x3F, 0x8C, 0x00, 0x2A, 0x16, 0x00, 0x31, 0x69, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81C1, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3E, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x44, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x28, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x2A, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x2A, 0x00, 0x25, 0xFE, 0x00, 0x25, 0x28, 0x00, 0x25, 0x6C, 0x00, 0x25, 0x6A, 0x00, 0x56, 0xA9, 0x00, 0x08, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81C2, { 0x00, 0x00, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x3F, 0x80, 0x1F, 0x84, 0x00, 0x38, 0xFF, 0x80, 0x2F, 0x84, 0x00, 0x28, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81C3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x89, 0x00, 0x28, 0x8A, 0x00, 0x39, 0x9F, 0x80, 0x2B, 0x12, 0x00, 0x29, 0x52, 0x00, 0x28, 0xDF, 0x00, 0x38, 0x92, 0x00, 0x29, 0x32, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x52, 0x00, 0x28, 0xD2, 0x00, 0x49, 0x92, 0x00, 0x5B, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x80, 0x00, 0x25, 0xFF, 0x80, 0x27, 0x20, 0x80, 0x24, 0xFC, 0x80, 0x3C, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xFC, 0x80, 0x24, 0x28, 0x80, 0x24, 0x7D, 0x80, 0x65, 0xC5, 0x00, 0x4C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81C6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x24, 0x28, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x25, 0x48, 0x80, 0x3D, 0x42, 0x80, 0x26, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81C8, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x40, 0x00, 0x3C, 0xFF, 0x80, 0x25, 0x88, 0x80, 0x26, 0x9C, 0x80, 0x24, 0xB6, 0x80, 0x24, 0x81, 0x80, 0x64, 0xF9, 0x00, 0x4C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81C9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x24, 0x6C, 0x00, 0x24, 0xC6, 0x00, 0x27, 0x83, 0x80, 0x3C, 0x7C, 0x00, 0x24, 0x00, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x64, 0xE7, 0x00, 0x4D, 0xAD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81CA, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x7C, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x24, 0xD6, 0x00, 0x25, 0x93, 0x00, 0x67, 0x11, 0x80, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81CB, { 0x00, 0x00, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x92, 0x00, 0x3F, 0xA3, 0x80, 0x29, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x29, 0x11, 0x00, 0x7F, 0xCE, 0x00, 0x49, 0x31, 0x80, 0x10, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x16, 0x9A, 0x00, 0x11, 0x42, 0x00, 0x16, 0x3A, 0x00, 0x10, 0x02, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81CC, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3C, 0x84, 0x00, 0x27, 0xE4, 0x00, 0x24, 0x9F, 0x00, 0x25, 0xC4, 0x00, 0x3C, 0x04, 0x00, 0x25, 0xDF, 0x00, 0x25, 0x51, 0x00, 0x25, 0x51, 0x00, 0x3D, 0x4A, 0x00, 0x25, 0xCA, 0x00, 0x24, 0x04, 0x00, 0x25, 0x44, 0x00, 0x24, 0xEA, 0x00, 0x57, 0x0A, 0x00, 0x08, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81CD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x11, 0x00, 0x17, 0xD6, 0x00, 0x1D, 0x56, 0x00, 0x15, 0x55, 0x00, 0x16, 0xD6, 0x80, 0x14, 0x1C, 0x00, 0x15, 0x11, 0x00, 0x1D, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x01, 0x00, 0x15, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x2E, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x24, 0x63, 0x00, 0x24, 0xA5, 0x00, 0x24, 0x63, 0x00, 0x3C, 0xA5, 0x00, 0x24, 0x21, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x44, 0x00, 0x24, 0xC6, 0x00, 0x25, 0xAB, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x64, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81CF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x24, 0xFF, 0x00, 0x24, 0x52, 0x00, 0x3D, 0x94, 0x00, 0x24, 0x18, 0x00, 0x24, 0xFF, 0x00, 0x27, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x64, 0x42, 0x00, 0x4D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x3D, 0xDD, 0x00, 0x25, 0x11, 0x00, 0x24, 0xCC, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x65, 0x49, 0x00, 0x4D, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81D3, { 0x00, 0x00, 0x00, 0x38, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x45, 0x00, 0x28, 0x44, 0x80, 0x38, 0x02, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x02, 0x00, 0x2A, 0xFA, 0x00, 0x3A, 0xA2, 0x80, 0x2A, 0xFB, 0x80, 0x2A, 0x8B, 0x00, 0x2A, 0xFA, 0x00, 0x2A, 0xA6, 0x00, 0x2A, 0xFE, 0x80, 0x6C, 0x0B, 0x80, 0x58, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81D5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x24, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x24, 0x80, 0x3D, 0x24, 0x80, 0x25, 0xFF, 0x80, 0x25, 0x44, 0x00, 0x25, 0x77, 0x80, 0x3D, 0x44, 0x00, 0x25, 0x54, 0x80, 0x25, 0x33, 0x80, 0x25, 0x00, 0x00, 0x26, 0x55, 0x00, 0x64, 0xD5, 0x80, 0x4C, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81D7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x28, 0x80, 0x24, 0xFE, 0x80, 0x24, 0x28, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x49, 0x00, 0x64, 0xCC, 0x80, 0x4D, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x89, 0x00, 0x15, 0x12, 0x00, 0x14, 0x89, 0x00, 0x15, 0xFF, 0x00, 0x1D, 0x29, 0x00, 0x15, 0x49, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x1D, 0x11, 0x00, 0x15, 0xDD, 0x00, 0x15, 0x11, 0x00, 0x15, 0xDD, 0x00, 0x25, 0x11, 0x00, 0x25, 0xDD, 0x00, 0x2F, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81D9, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x7C, 0x00, 0x3C, 0x82, 0x00, 0x27, 0xBA, 0x80, 0x24, 0xAB, 0x00, 0x24, 0xAA, 0x00, 0x3C, 0xAA, 0x00, 0x25, 0xBA, 0x80, 0x26, 0x81, 0x80, 0x24, 0x00, 0x00, 0x24, 0xA9, 0x00, 0x65, 0xAD, 0x80, 0x4D, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81DA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x1E, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x10, 0x80, 0x3D, 0x7E, 0x00, 0x25, 0x10, 0x80, 0x25, 0x7F, 0x80, 0x25, 0x49, 0x00, 0x3D, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x64, 0xA9, 0x00, 0x4D, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81DB, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0x55, 0x00, 0x3D, 0x11, 0x00, 0x24, 0x54, 0x00, 0x24, 0x00, 0x00, 0x24, 0x44, 0x00, 0x3C, 0xFF, 0x00, 0x25, 0x88, 0x00, 0x26, 0xFE, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFE, 0x00, 0x64, 0x88, 0x00, 0x4C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81DD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xF7, 0x00, 0x25, 0x55, 0x00, 0x3D, 0xF5, 0x00, 0x25, 0x57, 0x00, 0x3D, 0xF5, 0x00, 0x24, 0xE5, 0x00, 0x4D, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81DE, { 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x3D, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x3D, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x24, 0x90, 0x00, 0x27, 0xFF, 0x80, 0x3D, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x10, 0x00, 0x65, 0x10, 0x00, 0x4D, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81DF, { 0x00, 0x00, 0x00, 0x38, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x28, 0x05, 0x00, 0x2A, 0xFF, 0x80, 0x3A, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2B, 0xD4, 0x80, 0x28, 0xF4, 0x80, 0x28, 0xD5, 0x00, 0x3B, 0xD5, 0x00, 0x2A, 0xF6, 0x00, 0x2A, 0xD2, 0x00, 0x2A, 0xD6, 0x80, 0x29, 0x79, 0x80, 0x2A, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81E0, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x68, 0x0D, 0x00, 0x11, 0xE2, 0x00, 0x24, 0x04, 0x80, 0x7D, 0xEF, 0x80, 0x11, 0x22, 0x00, 0x55, 0xEA, 0x80, 0x54, 0x0A, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x16, 0x9A, 0x00, 0x11, 0x42, 0x00, 0x16, 0x3A, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81E1, { 0x00, 0x00, 0x00, 0x0A, 0x12, 0x00, 0x3F, 0xA4, 0x00, 0x0A, 0x7F, 0x00, 0x3F, 0xA4, 0x00, 0x24, 0xBF, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA4, 0x00, 0x11, 0x3F, 0x00, 0x20, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x16, 0x9A, 0x00, 0x11, 0x42, 0x00, 0x16, 0x3A, 0x00, 0x10, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x48, 0x21, 0x00, 0x48, 0x21, 0x00, 0x48, 0x21, 0x00, 0x7F, 0x23, 0x00, 0x41, 0x32, 0x00, 0x41, 0x16, 0x00, 0x41, 0x14, 0x00, 0x7F, 0x1C, 0x00, 0x48, 0x08, 0x00, 0x48, 0x1C, 0x00, 0x48, 0x14, 0x00, 0x48, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81E5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x94, 0x00, 0x24, 0x14, 0x00, 0x24, 0x14, 0x00, 0x24, 0x22, 0x00, 0x3F, 0xE2, 0x00, 0x20, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81E7, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3D, 0xF1, 0x00, 0x25, 0x51, 0x00, 0x05, 0x52, 0x00, 0x05, 0xF2, 0x00, 0x3F, 0x34, 0x00, 0x15, 0x2C, 0x00, 0x15, 0xE8, 0x00, 0x25, 0x4C, 0x00, 0x25, 0xF4, 0x80, 0x29, 0x22, 0x80, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81E8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x80, 0x00, 0x25, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x21, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x3F, 0x00, 0x00, 0x24, 0xF7, 0x80, 0x24, 0x94, 0x80, 0x24, 0x94, 0x80, 0x24, 0x94, 0x80, 0x3F, 0xF7, 0x80, 0x20, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81EA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81EB, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x10, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x42, 0x40, 0x00, 0x42, 0x40, 0x00, 0x42, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x42, 0x40, 0x00, 0x42, 0x40, 0x00, 0x42, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x42, 0x40, 0x00, 0x42, 0x41, 0x00, 0x42, 0x63, 0x00, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81EC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81ED, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81F0, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x1F, 0x23, 0x80, 0x71, 0x3E, 0x00, 0x0B, 0x20, 0x80, 0x06, 0x30, 0x80, 0x7C, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81F1, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x24, 0x89, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x00, 0x06, 0x06, 0x00, 0x1C, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81F2, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x10, 0x7E, 0x00, 0x7E, 0xC4, 0x00, 0x42, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x42, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x42, 0xBE, 0x00, 0x7E, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x7E, 0xA2, 0x00, 0x10, 0xA6, 0x00, 0x38, 0xA0, 0x00, 0x34, 0xA0, 0x80, 0x53, 0x31, 0x80, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x3F, 0xC1, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81F4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x9F, 0x80, 0x13, 0xD1, 0x00, 0x3C, 0x61, 0x00, 0x04, 0x52, 0x00, 0x04, 0x92, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0x8C, 0x00, 0x04, 0x08, 0x00, 0x04, 0x14, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81F5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x10, 0x7F, 0x80, 0x34, 0x42, 0x00, 0x24, 0xC6, 0x00, 0x3E, 0x2C, 0x00, 0x62, 0x18, 0x00, 0x08, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81F6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x10, 0xFF, 0x80, 0x34, 0x20, 0x00, 0x24, 0x40, 0x00, 0x3E, 0x5F, 0x00, 0x62, 0xC2, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x44, 0x00, 0x60, 0x44, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0x10, 0x00, 0x32, 0x32, 0x00, 0x22, 0x22, 0x00, 0x3F, 0x3F, 0x00, 0x61, 0x61, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x88, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81F9, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x7F, 0x0B, 0x00, 0x10, 0x09, 0x00, 0x34, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x63, 0xFD, 0x00, 0x08, 0x95, 0x00, 0x08, 0x95, 0x00, 0x3E, 0x95, 0x00, 0x08, 0x97, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x39, 0xB6, 0x80, 0x61, 0x0D, 0x80, 0x03, 0x19, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81FA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x80, 0x02, 0x3E, 0x00, 0x1F, 0xC1, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81FB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x3F, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x0B, 0x1F, 0x80, 0x08, 0xF0, 0x00, 0x3E, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x3E, 0x92, 0x00, 0x03, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x3C, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0x7F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81FD, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x08, 0x00, 0x30, 0x38, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x81FE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x03, 0x40, 0x00, 0x1C, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x81FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x06, 0x80, 0x00, 0x1C, 0x9E, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1E, 0x9E, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8200, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x86, 0x00, 0x10, 0xC3, 0x00, 0x30, 0x41, 0x80, 0x60, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8201, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8202, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x19, 0x86, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x0F, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8203, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x24, 0x90, 0x80, 0x66, 0xD9, 0x80, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8204, { 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x1C, 0x7E, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x74, 0x92, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x42, 0x00, 0x20, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8205, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x03, 0x02, 0x00, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8206, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x84, 0x00, 0x18, 0x9E, 0x00, 0x13, 0xE4, 0x00, 0x11, 0x04, 0x00, 0x1E, 0x9C, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x84, 0x00, 0x1C, 0x9C, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x84, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x18, 0x06, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8207, { 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x0C, 0xEE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0E, 0xEE, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x22, 0x00, 0x0E, 0xAE, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8208, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1B, 0xFB, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x1E, 0x0F, 0x00, 0x12, 0xE9, 0x00, 0x12, 0xA9, 0x00, 0x1E, 0xAF, 0x00, 0x12, 0xE9, 0x00, 0x12, 0xA9, 0x00, 0x12, 0x09, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8209, { 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x1C, 0xEE, 0x00, 0x10, 0x82, 0x00, 0x1C, 0xEE, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x2E, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x77, 0xFB, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x820A, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x05, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x80, 0x00, 0x0E, 0x3E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0x3E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x820C, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x820D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x33, 0xF9, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x820E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x820F, { 0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0x07, 0x11, 0x00, 0x3C, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x71, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8210, { 0x00, 0x00, 0x00, 0x03, 0x01, 0x80, 0x0E, 0x07, 0x00, 0x78, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x46, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x80, 0x3E, 0x73, 0x80, 0x01, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8212, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x11, 0x01, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x14, 0x00, 0x1F, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x09, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x98, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8213, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x78, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x80, 0x3E, 0xCA, 0x80, 0x22, 0x12, 0x80, 0x22, 0x64, 0x80, 0x22, 0x09, 0x80, 0x22, 0x31, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8214, { 0x00, 0x00, 0x00, 0x03, 0x06, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x48, 0x00, 0x08, 0xCC, 0x00, 0x08, 0x86, 0x00, 0x09, 0xA3, 0x80, 0x3E, 0x20, 0x00, 0x22, 0xA9, 0x00, 0x22, 0xAD, 0x80, 0x22, 0xA4, 0x80, 0x23, 0x24, 0x80, 0x3E, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8216, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x1C, 0x09, 0x00, 0x36, 0xFF, 0x80, 0x63, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8217, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x1C, 0x09, 0x00, 0x16, 0xFF, 0x80, 0x33, 0x08, 0x00, 0x60, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8218, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x33, 0x80, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8219, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x03, 0x03, 0x00, 0x3C, 0x3C, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x821A, { 0x00, 0x00, 0x00, 0x06, 0x7C, 0x00, 0x1C, 0x88, 0x00, 0x73, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x11, 0xC3, 0x80, 0x11, 0x3E, 0x00, 0x7F, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x3D, 0x00, 0x00, 0x25, 0x3E, 0x00, 0x25, 0x00, 0x00, 0x26, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x821B, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xA4, 0x00, 0x18, 0xA4, 0x00, 0x25, 0x24, 0x00, 0x03, 0x24, 0x00, 0x02, 0x24, 0x00, 0x02, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x821C, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x01, 0x00, 0x08, 0x42, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x07, 0xFF, 0x80, 0x0C, 0x64, 0x00, 0x32, 0xA4, 0x00, 0x01, 0x24, 0x00, 0x02, 0xFF, 0x80, 0x0C, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x821D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x08, 0x88, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x24, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x46, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x821E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x92, 0x00, 0x04, 0x92, 0x00, 0x1F, 0xFF, 0x80, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0xFF, 0x00, 0x29, 0x24, 0x00, 0x06, 0x24, 0x00, 0x04, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x821F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x42, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x02, 0x00, 0x1F, 0xFF, 0x80, 0x04, 0x02, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x10, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8221, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x11, 0xC8, 0x00, 0x17, 0x08, 0x00, 0x39, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x11, 0x08, 0x00, 0x21, 0x7F, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8222, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x22, 0x88, 0x80, 0x7F, 0x88, 0x80, 0x22, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x22, 0x88, 0x80, 0x62, 0xFF, 0x80, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8223, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x12, 0x22, 0x00, 0x3F, 0x12, 0x00, 0x22, 0x92, 0x00, 0x32, 0x94, 0x00, 0x2A, 0x44, 0x00, 0x22, 0x44, 0x00, 0x7E, 0x48, 0x00, 0x22, 0x28, 0x00, 0x32, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x22, 0x44, 0x00, 0x22, 0x87, 0x00, 0x2B, 0x02, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8228, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7F, 0x00, 0x22, 0x51, 0x00, 0x7F, 0x51, 0x00, 0x22, 0x5B, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x4E, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xCE, 0x00, 0x22, 0x8A, 0x00, 0x63, 0x9B, 0x00, 0x46, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8229, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x24, 0x00, 0x2A, 0x66, 0x00, 0x2A, 0x42, 0x00, 0x22, 0xC3, 0x00, 0x7F, 0x91, 0x80, 0x22, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x30, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x26, 0x00, 0x22, 0x62, 0x00, 0x62, 0x4F, 0x00, 0x46, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x822A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x00, 0x00, 0x15, 0x00, 0x00, 0x15, 0x3E, 0x00, 0x13, 0xA2, 0x00, 0x3D, 0x22, 0x00, 0x11, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x80, 0x15, 0x42, 0x80, 0x21, 0x43, 0x80, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x822B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x10, 0x00, 0x15, 0x10, 0x00, 0x11, 0x10, 0x00, 0x17, 0x9F, 0x00, 0x39, 0x11, 0x00, 0x11, 0x11, 0x00, 0x15, 0x21, 0x00, 0x15, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x41, 0x00, 0x21, 0x42, 0x00, 0x23, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x822C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x80, 0x15, 0x22, 0x80, 0x15, 0x23, 0x80, 0x15, 0x40, 0x00, 0x13, 0x80, 0x00, 0x1D, 0x7F, 0x80, 0x11, 0x21, 0x00, 0x15, 0x12, 0x00, 0x15, 0x0C, 0x00, 0x15, 0x0C, 0x00, 0x21, 0x12, 0x00, 0x21, 0x21, 0x00, 0x27, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x822D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x12, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x22, 0x90, 0x00, 0x32, 0x90, 0x00, 0x2A, 0x92, 0x00, 0x22, 0xF6, 0x00, 0x7E, 0x98, 0x00, 0x22, 0x90, 0x00, 0x32, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x22, 0xB1, 0x00, 0x22, 0xD1, 0x00, 0x2A, 0x8F, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x822E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x21, 0x00, 0x22, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x22, 0x60, 0x00, 0x62, 0x40, 0x00, 0x46, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x822F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x12, 0x10, 0x00, 0x3F, 0x12, 0x00, 0x22, 0xFF, 0x00, 0x32, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x22, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x32, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x44, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8230, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x02, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x42, 0x00, 0x11, 0x4A, 0x00, 0x19, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x7F, 0x52, 0x00, 0x11, 0x52, 0x00, 0x19, 0x10, 0x00, 0x15, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x29, 0x00, 0x25, 0x49, 0x00, 0x42, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8231, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1E, 0x28, 0x00, 0x12, 0x28, 0x00, 0x1A, 0x44, 0x00, 0x16, 0x83, 0x00, 0x13, 0x02, 0x00, 0x7E, 0x7C, 0x00, 0x12, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x16, 0x54, 0x00, 0x12, 0x48, 0x00, 0x12, 0x40, 0x00, 0x12, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x44, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8232, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x36, 0x00, 0x2A, 0x63, 0x00, 0x2A, 0xDD, 0x80, 0x22, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x2A, 0x17, 0x00, 0x22, 0x10, 0x00, 0x62, 0x10, 0x00, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8233, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x22, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x22, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x22, 0x49, 0x00, 0x62, 0x49, 0x00, 0x46, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8234, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x2A, 0x50, 0x00, 0x2A, 0xD0, 0x00, 0x22, 0x90, 0x00, 0x7F, 0x1F, 0x00, 0x22, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x1F, 0x00, 0x2A, 0x10, 0x00, 0x22, 0x10, 0x00, 0x62, 0x10, 0x00, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8235, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x80, 0x80, 0x15, 0x00, 0x00, 0x11, 0x10, 0x00, 0x17, 0x90, 0x00, 0x39, 0x13, 0x80, 0x11, 0x1C, 0x00, 0x15, 0x10, 0x00, 0x15, 0x10, 0x00, 0x15, 0x10, 0x80, 0x11, 0x10, 0x80, 0x21, 0x1F, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8236, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x3F, 0x80, 0x15, 0x20, 0x80, 0x15, 0x20, 0x80, 0x15, 0x20, 0x80, 0x13, 0xE0, 0x80, 0x3D, 0x3F, 0x80, 0x11, 0x20, 0x80, 0x15, 0x20, 0x80, 0x15, 0x20, 0x80, 0x15, 0x20, 0x80, 0x21, 0x3F, 0x80, 0x21, 0x20, 0x80, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8237, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x10, 0x00, 0x15, 0x10, 0x00, 0x15, 0x20, 0x00, 0x11, 0xC4, 0x00, 0x17, 0x44, 0x00, 0x39, 0x28, 0x00, 0x15, 0x10, 0x00, 0x15, 0x12, 0x00, 0x15, 0x21, 0x00, 0x15, 0x4F, 0x80, 0x21, 0xF0, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8238, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x02, 0x00, 0x22, 0x02, 0x00, 0x2A, 0x7A, 0x00, 0x2A, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x7A, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0x02, 0x00, 0x22, 0x02, 0x00, 0x62, 0x02, 0x00, 0x46, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8239, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x22, 0x00, 0x15, 0x22, 0x00, 0x15, 0x22, 0x80, 0x11, 0x43, 0x80, 0x11, 0x80, 0x00, 0x17, 0x00, 0x00, 0x39, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x21, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x23, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x823A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x22, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x22, 0x88, 0x80, 0x7F, 0x88, 0x80, 0x22, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x22, 0x08, 0x00, 0x62, 0x08, 0x00, 0x46, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x823B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x12, 0x12, 0x00, 0x3F, 0x1F, 0x00, 0x22, 0x10, 0x00, 0x32, 0x12, 0x00, 0x2A, 0xFF, 0x00, 0x22, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x22, 0x82, 0x00, 0x32, 0xFE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x22, 0x80, 0x00, 0x22, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x823E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0x28, 0x00, 0x22, 0x28, 0x00, 0x32, 0x2A, 0x00, 0x2A, 0xFF, 0x00, 0x22, 0xAA, 0x00, 0x7E, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x32, 0xAA, 0x00, 0x2A, 0xAE, 0x00, 0x2A, 0xC2, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8240, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x08, 0x79, 0x00, 0x1F, 0x48, 0x80, 0x11, 0x44, 0x00, 0x15, 0x80, 0x00, 0x15, 0x00, 0x00, 0x11, 0x3F, 0x00, 0x17, 0x82, 0x00, 0x3D, 0x04, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x11, 0x08, 0x00, 0x21, 0x08, 0x00, 0x23, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8243, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x22, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x22, 0x08, 0x00, 0x62, 0x08, 0x00, 0x46, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8244, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x52, 0x00, 0x3E, 0xD3, 0x00, 0x22, 0x91, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x7F, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x22, 0x81, 0x00, 0x62, 0x81, 0x00, 0x46, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8245, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x14, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x41, 0x00, 0x15, 0x80, 0x80, 0x15, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x17, 0x88, 0x00, 0x39, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x49, 0x00, 0x11, 0x89, 0x00, 0x21, 0x08, 0x80, 0x23, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8246, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x48, 0x80, 0x2A, 0x49, 0x80, 0x2A, 0x4F, 0x00, 0x2A, 0x44, 0x00, 0x22, 0x46, 0x00, 0x62, 0x73, 0x00, 0x46, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8247, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xF1, 0x80, 0x1E, 0x1E, 0x00, 0x12, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x1A, 0x42, 0x00, 0x12, 0xF2, 0x00, 0x17, 0x1F, 0x80, 0x3A, 0x12, 0x00, 0x12, 0x92, 0x00, 0x1A, 0xA2, 0x00, 0x1A, 0xA2, 0x00, 0x12, 0x4F, 0x80, 0x12, 0x60, 0x00, 0x22, 0x9F, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8249, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x12, 0xFF, 0x00, 0x3F, 0x82, 0x00, 0x22, 0x82, 0x00, 0x32, 0xFE, 0x00, 0x2A, 0x80, 0x00, 0x22, 0xFE, 0x00, 0x7E, 0x90, 0x00, 0x22, 0xFE, 0x00, 0x32, 0x90, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x90, 0x00, 0x22, 0x90, 0x00, 0x22, 0x91, 0x00, 0x2B, 0x11, 0x00, 0x44, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x824B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x2B, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x22, 0x38, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x22, 0xA9, 0x00, 0x63, 0xFF, 0x80, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x824E, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x22, 0x08, 0x00, 0x62, 0xFF, 0x80, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x824F, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x66, 0x00, 0x3E, 0x24, 0x00, 0x22, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x22, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x62, 0x41, 0x00, 0x46, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8251, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x08, 0x7C, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xD5, 0x00, 0x23, 0x55, 0x00, 0x62, 0x55, 0x00, 0x46, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8256, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x08, 0x24, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x7E, 0x00, 0x22, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0xFF, 0x00, 0x2B, 0x88, 0x00, 0x22, 0x08, 0x00, 0x62, 0x08, 0x00, 0x46, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8258, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x68, 0x00, 0x3E, 0xCB, 0x80, 0x22, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xEB, 0x80, 0x22, 0x88, 0x80, 0x7F, 0x88, 0x80, 0x22, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x22, 0x00, 0x22, 0x1C, 0x00, 0x62, 0x36, 0x00, 0x46, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8259, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x14, 0x00, 0x1E, 0x22, 0x00, 0x12, 0xC1, 0x80, 0x1A, 0x3E, 0x00, 0x1A, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x17, 0x41, 0x00, 0x3A, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x1A, 0x40, 0x00, 0x1A, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x22, 0xFF, 0x00, 0x27, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x825A, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x08, 0x24, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0xA4, 0x80, 0x22, 0xFF, 0x80, 0x7F, 0xA4, 0x80, 0x22, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x62, 0x41, 0x00, 0x46, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x825C, { 0x00, 0x00, 0x00, 0x08, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x7D, 0xFF, 0x80, 0x44, 0xAA, 0x00, 0x54, 0xAA, 0x00, 0x55, 0x3B, 0x80, 0x44, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x45, 0x10, 0x80, 0x55, 0x10, 0x80, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x44, 0x93, 0x00, 0x44, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x825D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xEE, 0x80, 0x22, 0x88, 0x80, 0x7F, 0x66, 0x00, 0x22, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0xFF, 0x80, 0x22, 0x01, 0x00, 0x62, 0x01, 0x00, 0x46, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x825F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x22, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x62, 0x08, 0x00, 0x46, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8260, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x08, 0xF4, 0x00, 0x3F, 0x18, 0x80, 0x22, 0xA5, 0x00, 0x2A, 0x42, 0x00, 0x2B, 0xBD, 0x80, 0x22, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x42, 0x00, 0x22, 0x66, 0x00, 0x62, 0x24, 0x00, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8262, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0xAA, 0x80, 0x22, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x5D, 0x00, 0x2A, 0x55, 0x00, 0x22, 0x5D, 0x00, 0x62, 0x41, 0x00, 0x46, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8263, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x10, 0x1E, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x80, 0x55, 0x10, 0x80, 0x55, 0xFF, 0x00, 0x45, 0x10, 0x80, 0x7F, 0x7F, 0x80, 0x45, 0x49, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x10, 0x00, 0x46, 0xFF, 0x00, 0x44, 0x11, 0x00, 0x4C, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8264, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x08, 0x28, 0x00, 0x1F, 0xFF, 0x80, 0x1A, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x16, 0x7A, 0x00, 0x3B, 0xC9, 0x00, 0x12, 0x48, 0x00, 0x1B, 0xFF, 0x80, 0x1A, 0x48, 0x00, 0x1A, 0x78, 0x00, 0x13, 0xC4, 0x80, 0x22, 0x42, 0x80, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8266, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x08, 0x7A, 0x00, 0x1F, 0x54, 0x00, 0x11, 0x57, 0x80, 0x15, 0x78, 0x00, 0x15, 0x48, 0x00, 0x11, 0x78, 0x00, 0x17, 0xD0, 0x00, 0x39, 0x57, 0x80, 0x11, 0x78, 0x00, 0x15, 0x40, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x55, 0x00, 0x11, 0x55, 0x00, 0x21, 0x55, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8267, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x44, 0x48, 0x00, 0x54, 0xFF, 0x80, 0x55, 0x88, 0x00, 0x44, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x44, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x54, 0xFF, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x44, 0x42, 0x00, 0x44, 0x3C, 0x00, 0x4D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8268, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xBD, 0x00, 0x22, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x22, 0x20, 0x00, 0x2A, 0x51, 0x80, 0x2A, 0xAB, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x9C, 0x00, 0x22, 0x2A, 0x00, 0x62, 0xC9, 0x80, 0x46, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x826A, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x08, 0x7C, 0x00, 0x3E, 0xC8, 0x00, 0x22, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x55, 0x00, 0x2A, 0x94, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x62, 0x41, 0x00, 0x46, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x826B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x0F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xBE, 0x00, 0x22, 0x88, 0x80, 0x7F, 0xBF, 0x80, 0x22, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x80, 0x00, 0x23, 0x7F, 0x00, 0x62, 0x55, 0x00, 0x46, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x826D, { 0x00, 0x00, 0x00, 0x08, 0xA5, 0x00, 0x11, 0x4A, 0x00, 0x7D, 0xEF, 0x80, 0x47, 0x5A, 0x00, 0x55, 0xEF, 0x80, 0x55, 0x4A, 0x00, 0x45, 0xEF, 0x80, 0x7F, 0x4A, 0x00, 0x45, 0xEF, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x42, 0x00, 0x54, 0x2C, 0x00, 0x44, 0x38, 0x00, 0x44, 0x6E, 0x00, 0x4D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x826E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x08, 0x83, 0x00, 0x08, 0x4C, 0x00, 0x08, 0x30, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xCC, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x826F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x08, 0x86, 0x00, 0x08, 0x58, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xD8, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8270, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x84, 0x00, 0x02, 0x84, 0x00, 0x22, 0xFC, 0x00, 0x14, 0x84, 0x00, 0x14, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0xA2, 0x00, 0x14, 0xA6, 0x00, 0x14, 0x98, 0x00, 0x22, 0x90, 0x00, 0x42, 0x88, 0x00, 0x00, 0xA7, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x3F, 0xE2, 0x00, 0x15, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xBE, 0x00, 0x3F, 0xA8, 0x00, 0x04, 0x29, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xA4, 0x00, 0x0A, 0x3A, 0x00, 0x11, 0x61, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8272, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8273, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7C, 0x00, 0x7F, 0x88, 0x00, 0x08, 0x92, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x80, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8274, { 0x00, 0x00, 0x00, 0x14, 0x10, 0x00, 0x14, 0x1F, 0x00, 0x7F, 0x91, 0x00, 0x14, 0xB3, 0x00, 0x14, 0xE2, 0x00, 0x7F, 0xBF, 0x80, 0x54, 0x24, 0x80, 0x54, 0x24, 0x80, 0x54, 0x24, 0x80, 0x7F, 0xBF, 0x80, 0x14, 0xA0, 0x00, 0x14, 0xA0, 0x00, 0x14, 0xA0, 0x00, 0x34, 0xA0, 0x80, 0x27, 0xB0, 0x80, 0x64, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8276, { 0x00, 0x00, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x3F, 0x9F, 0x00, 0x2A, 0xA2, 0x00, 0x3F, 0xC4, 0x00, 0x2A, 0xBF, 0x80, 0x3F, 0xA4, 0x80, 0x00, 0x24, 0x80, 0x3F, 0xA4, 0x80, 0x00, 0x3F, 0x80, 0x1F, 0x20, 0x00, 0x11, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x0A, 0x20, 0x80, 0x0B, 0xA0, 0x80, 0x3C, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8277, { 0x00, 0x00, 0x00, 0x55, 0x48, 0x00, 0x7F, 0xCF, 0x00, 0x55, 0x59, 0x00, 0x7F, 0xF2, 0x00, 0x55, 0x5F, 0x80, 0x7F, 0xD4, 0x80, 0x55, 0x54, 0x80, 0x7F, 0xD4, 0x80, 0x00, 0x14, 0x80, 0x7F, 0xDF, 0x80, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x80, 0x11, 0x10, 0x80, 0x7F, 0xCF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8278, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8279, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x827A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x827B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x82, 0x00, 0x01, 0x02, 0x00, 0x03, 0x02, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x04, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x827D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x03, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x80, 0x0C, 0x09, 0x80, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x827E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x60, 0x00, 0x01, 0x90, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x827F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x06, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0C, 0x06, 0x00, 0x18, 0x04, 0x00, 0x30, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8280, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x03, 0x02, 0x00, 0x02, 0x02, 0x00, 0x06, 0x02, 0x00, 0x0C, 0x06, 0x00, 0x18, 0x04, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8281, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8282, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x24, 0x00, 0x01, 0x14, 0x00, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8283, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0x90, 0x00, 0x04, 0xD0, 0x00, 0x04, 0x50, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8284, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x0D, 0x08, 0x00, 0x07, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0x08, 0x80, 0x0D, 0x89, 0x80, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8287, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8288, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x94, 0x00, 0x3C, 0x9E, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x04, 0x94, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8289, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x828A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x828B, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x828D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x10, 0x01, 0x00, 0x23, 0xF9, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x828E, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x828F, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8291, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x18, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8292, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8294, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x05, 0x04, 0x00, 0x04, 0x04, 0x00, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x18, 0x04, 0x00, 0x70, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8296, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x60, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8297, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x01, 0x90, 0x00, 0x06, 0x10, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8298, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x23, 0x00, 0x1F, 0x2E, 0x00, 0x10, 0x38, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x17, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8299, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x829A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x87, 0x80, 0x01, 0xF8, 0x00, 0x3E, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x829B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x829C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x02, 0x41, 0x00, 0x04, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x829D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x04, 0x60, 0x00, 0x0F, 0x80, 0x00, 0x12, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x829F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x80, 0x04, 0x08, 0x80, 0x08, 0x0F, 0x80, 0x30, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x30, 0x00, 0x38, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82A0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0x60, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82A1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x01, 0x00, 0x30, 0x83, 0x00, 0x60, 0x86, 0x00, 0x01, 0xC4, 0x00, 0x01, 0x40, 0x00, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x70, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82A3, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xA0, 0x00, 0x07, 0xB8, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82A4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x03, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0x90, 0x00, 0x1E, 0x10, 0x00, 0x74, 0x10, 0x00, 0x04, 0x10, 0x80, 0x04, 0x19, 0x80, 0x1C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82A5, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x0C, 0x0C, 0x00, 0x32, 0x13, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82A6, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82A7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x18, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x00, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82A8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x03, 0xFF, 0x00, 0x07, 0x06, 0x00, 0x05, 0x8C, 0x00, 0x0C, 0xD8, 0x00, 0x18, 0x70, 0x00, 0x30, 0xD8, 0x00, 0x63, 0x8E, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82A9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x39, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82AA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x30, 0x00, 0x10, 0x10, 0x00, 0x10, 0x18, 0x80, 0x1F, 0x0D, 0x80, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82AB, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82AC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82AD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82AE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x03, 0xC8, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x11, 0x00, 0x12, 0x09, 0x00, 0x1C, 0x07, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82AF, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x02, 0x40, 0x00, 0x02, 0x21, 0x00, 0x02, 0x01, 0x00, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xF8, 0x00, 0x04, 0x18, 0x00, 0x06, 0x30, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x70, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82B1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x11, 0x00, 0x04, 0x12, 0x00, 0x0C, 0x14, 0x00, 0x0C, 0x18, 0x00, 0x14, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x1F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B2, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x74, 0x33, 0x80, 0x04, 0xE0, 0x00, 0x07, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x06, 0x06, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B3, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x63, 0x31, 0x00, 0x06, 0x21, 0x00, 0x0C, 0x61, 0x00, 0x38, 0xC3, 0x00, 0x01, 0x82, 0x00, 0x07, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B7, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B8, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0x1F, 0x00, 0x13, 0xE0, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82B9, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82BA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82BB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x89, 0x00, 0x24, 0x89, 0x00, 0x07, 0xF9, 0x00, 0x04, 0x09, 0x00, 0x02, 0x06, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x28, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x03, 0x0A, 0x00, 0x3C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82BC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x01, 0xE0, 0x00, 0x0E, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82BD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x18, 0x00, 0x00, 0x28, 0x00, 0x00, 0x48, 0x00, 0x01, 0x88, 0x00, 0x06, 0x08, 0x00, 0x38, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82BE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82BF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x18, 0x4F, 0x80, 0x18, 0x48, 0x80, 0x28, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x09, 0x01, 0x00, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82C1, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x28, 0x00, 0x04, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x09, 0x44, 0x00, 0x10, 0x44, 0x00, 0x20, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82C4, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x03, 0x20, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x98, 0x00, 0x00, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82C5, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x81, 0x00, 0x30, 0x91, 0x00, 0x19, 0x91, 0x00, 0x0D, 0x11, 0x00, 0x07, 0x11, 0x00, 0x02, 0x11, 0x00, 0x07, 0x11, 0x00, 0x0D, 0x81, 0x00, 0x18, 0xC1, 0x00, 0x30, 0x41, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82C6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x16, 0x21, 0x00, 0x1C, 0x21, 0x00, 0x70, 0x21, 0x00, 0x10, 0x21, 0x00, 0x11, 0x21, 0x00, 0x13, 0x61, 0x00, 0x0E, 0x43, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82C7, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x90, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82C8, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x84, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x21, 0x04, 0x00, 0x22, 0x04, 0x00, 0x44, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82CA, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xF8, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x12, 0x50, 0x00, 0x12, 0x20, 0x00, 0x22, 0x02, 0x00, 0x42, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82CB, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x09, 0x48, 0x00, 0x02, 0x40, 0x00, 0x04, 0x42, 0x00, 0x18, 0x42, 0x00, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82CC, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x60, 0x00, 0x05, 0x80, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x05, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x05, 0x10, 0x00, 0x06, 0x0E, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82CD, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x0C, 0x18, 0x00, 0x37, 0xF7, 0x00, 0x44, 0x12, 0x00, 0x04, 0x50, 0x00, 0x04, 0x20, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82CE, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x03, 0x20, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82CF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x05, 0x10, 0x00, 0x01, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x11, 0x0C, 0x00, 0x12, 0x0B, 0x00, 0x22, 0x09, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x10, 0x28, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D0, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x81, 0x00, 0x06, 0x81, 0x00, 0x1C, 0x83, 0x00, 0x70, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x0F, 0xE1, 0x00, 0x08, 0xA1, 0x00, 0x18, 0xA1, 0x00, 0x25, 0x21, 0x00, 0x02, 0x27, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x80, 0x10, 0x3F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D2, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D3, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x77, 0xF7, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x1C, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D4, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x04, 0x00, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D7, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D8, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x10, 0x24, 0x00, 0x13, 0xF4, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82D9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x02, 0x30, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82DA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x20, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82DB, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82DC, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82DE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x17, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x04, 0x12, 0x00, 0x07, 0xF2, 0x00, 0x04, 0x02, 0x00, 0x04, 0x0C, 0x80, 0x04, 0x00, 0x80, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82DF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x10, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x07, 0xF1, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x30, 0x00, 0x10, 0x18, 0x80, 0x1F, 0x8D, 0x80, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x09, 0xD4, 0x00, 0x0E, 0x22, 0x00, 0x30, 0x41, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82E2, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E3, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xA0, 0x00, 0x07, 0xB8, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x32, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E6, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E7, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82E8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x0E, 0x00, 0x11, 0xF8, 0x00, 0x31, 0x00, 0x00, 0x21, 0x00, 0x80, 0x61, 0x81, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82EA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x11, 0xC2, 0x00, 0x13, 0x72, 0x00, 0x16, 0x1A, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82EB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82ED, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1A, 0x7F, 0x00, 0x32, 0x11, 0x00, 0x66, 0x11, 0x00, 0x34, 0x11, 0x00, 0x0D, 0x11, 0x00, 0x19, 0x31, 0x00, 0x13, 0x23, 0x00, 0x3D, 0x62, 0x00, 0x60, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82EF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8C, 0x00, 0x30, 0x86, 0x00, 0x67, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82F1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82F3, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x0E, 0x18, 0x00, 0x3B, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x79, 0xC7, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82F4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82F6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8C, 0x00, 0x30, 0x86, 0x00, 0x60, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82F7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82F9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82FA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x42, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82FB, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0D, 0xFF, 0x80, 0x18, 0x04, 0x00, 0x38, 0x84, 0x00, 0x68, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x82FD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x3C, 0x00, 0x0F, 0xC8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x10, 0xF2, 0x00, 0x13, 0x8A, 0x00, 0x10, 0x05, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x82FE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x82, 0x00, 0x00, 0x42, 0x00, 0x01, 0x24, 0x00, 0x01, 0x08, 0x00, 0x09, 0x11, 0x00, 0x09, 0x21, 0x00, 0x11, 0x40, 0x80, 0x11, 0x82, 0x80, 0x03, 0x02, 0x00, 0x0D, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8300, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x06, 0x21, 0x00, 0x0C, 0x23, 0x00, 0x38, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8301, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8302, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x50, 0x00, 0x00, 0x48, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0x24, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x10, 0x30, 0x00, 0x10, 0x48, 0x80, 0x21, 0x84, 0x80, 0x26, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8303, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x41, 0x00, 0x20, 0x41, 0x00, 0x14, 0x41, 0x00, 0x04, 0x4F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x80, 0x10, 0x40, 0x80, 0x10, 0x7F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8304, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x13, 0x9F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8305, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x40, 0x00, 0x02, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x30, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8306, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x3E, 0x3F, 0x00, 0x20, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x61, 0x21, 0x00, 0x03, 0x27, 0x00, 0x0E, 0x20, 0x00, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8307, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0x08, 0x00, 0x02, 0x08, 0x00, 0x07, 0x18, 0x00, 0x0D, 0xB0, 0x00, 0x18, 0xE0, 0x00, 0x30, 0xF0, 0x00, 0x63, 0x9C, 0x00, 0x0E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8308, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x24, 0x23, 0x80, 0x27, 0xAE, 0x00, 0x24, 0x38, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x27, 0xA0, 0x80, 0x3C, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8309, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x830A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x830B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x30, 0x00, 0x1F, 0x10, 0x00, 0x70, 0x18, 0x80, 0x00, 0x0D, 0x80, 0x3F, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x830C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x20, 0x00, 0x28, 0x20, 0x00, 0x48, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x830E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x830F, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x01, 0x10, 0x00, 0x01, 0x0A, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x01, 0x44, 0x00, 0x02, 0x4C, 0x00, 0x02, 0x50, 0x00, 0x04, 0x60, 0x00, 0x04, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x13, 0x3F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8311, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x05, 0x10, 0x00, 0x04, 0xB0, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xE4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8314, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x82, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8315, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x4F, 0xF2, 0x00, 0x02, 0x10, 0x00, 0x02, 0x90, 0x00, 0x1F, 0xD0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x12, 0x00, 0x02, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8316, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x0C, 0x18, 0x00, 0x3B, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8317, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x88, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x02, 0x04, 0x00, 0x05, 0x08, 0x00, 0x18, 0x90, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xFE, 0x00, 0x07, 0x02, 0x00, 0x3A, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8318, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x01, 0x84, 0x00, 0x03, 0x0C, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x18, 0x98, 0x80, 0x31, 0xB1, 0x80, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x831A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x03, 0x04, 0x00, 0x1C, 0x7E, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0x54, 0x00, 0x1C, 0x48, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x831B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x23, 0x00, 0x08, 0x36, 0x00, 0x08, 0x18, 0x00, 0x0F, 0x8E, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x831C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x26, 0x21, 0x00, 0x3C, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x831D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x7E, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x831E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x831F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8321, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8322, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x08, 0x89, 0x00, 0x19, 0x89, 0x00, 0x35, 0x09, 0x00, 0x03, 0x01, 0x00, 0x06, 0x01, 0x00, 0x0C, 0x01, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8323, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x1E, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8327, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x90, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8328, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x28, 0x00, 0x00, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x51, 0x00, 0x00, 0x92, 0x00, 0x01, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x07, 0x2C, 0x00, 0x38, 0x44, 0x00, 0x01, 0x82, 0x00, 0x06, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x832B, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x12, 0x08, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x14, 0x80, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x832C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x69, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x832D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x07, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x1E, 0x1E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x832E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x18, 0x8C, 0x00, 0x30, 0x86, 0x00, 0x60, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x832F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x28, 0x00, 0x04, 0x24, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x28, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8330, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x80, 0x00, 0x03, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x78, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8331, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8332, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x30, 0x00, 0x31, 0x62, 0x00, 0x1B, 0x36, 0x00, 0x0E, 0x1C, 0x00, 0x04, 0x08, 0x00, 0x0D, 0x1A, 0x00, 0x19, 0x32, 0x00, 0x17, 0xAF, 0x00, 0x7C, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8333, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x30, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x60, 0x10, 0x00, 0x30, 0x10, 0x00, 0x10, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8334, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8335, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFD, 0x00, 0x10, 0x41, 0x00, 0x10, 0xA1, 0x00, 0x11, 0x11, 0x00, 0x16, 0x0D, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8336, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8337, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0x23, 0x00, 0x0C, 0x21, 0x00, 0x19, 0xFF, 0x80, 0x38, 0x12, 0x00, 0x68, 0x16, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x80, 0x08, 0x76, 0x80, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8338, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFF, 0x80, 0x3F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8339, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1A, 0x11, 0x00, 0x26, 0x11, 0x00, 0x05, 0x1F, 0x00, 0x08, 0x91, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x833A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x04, 0x7C, 0x00, 0x1F, 0xC6, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x833C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x833D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x19, 0x10, 0x80, 0x39, 0x10, 0x80, 0x69, 0x10, 0x80, 0x09, 0x10, 0x80, 0x09, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8340, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x08, 0x01, 0x00, 0x13, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x03, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x03, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8342, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x04, 0x08, 0x00, 0x1B, 0xF6, 0x00, 0x60, 0x01, 0x80, 0x1F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8343, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x05, 0x88, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x77, 0xFB, 0x80, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8344, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x80, 0x00, 0x1B, 0x20, 0x00, 0x0C, 0x64, 0x00, 0x06, 0xCC, 0x00, 0x01, 0x98, 0x00, 0x07, 0x70, 0x00, 0x3C, 0xD8, 0x00, 0x03, 0x8E, 0x00, 0x3E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8345, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8346, { 0x00, 0x00, 0x00, 0x04, 0x81, 0x00, 0x04, 0xA1, 0x00, 0x3F, 0xF1, 0x00, 0x04, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xE9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xA9, 0x00, 0x3F, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x08, 0x81, 0x00, 0x10, 0x85, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8347, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x18, 0x04, 0x00, 0x28, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8349, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x834A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1F, 0xE9, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x81, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x834D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x42, 0x00, 0x22, 0xA2, 0x00, 0x22, 0x36, 0x00, 0x2E, 0x1C, 0x00, 0x3A, 0x08, 0x00, 0x62, 0x1C, 0x00, 0x02, 0x36, 0x00, 0x02, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x834E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x06, 0x08, 0x00, 0x04, 0xFC, 0x00, 0x1F, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x834F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x06, 0x00, 0x04, 0x18, 0x00, 0x08, 0xF0, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8350, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0D, 0xFE, 0x00, 0x18, 0x0C, 0x00, 0x68, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8351, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x80, 0x00, 0xA3, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8352, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x80, 0x04, 0x44, 0x80, 0x08, 0x47, 0x80, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8353, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x04, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x3F, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8354, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x84, 0x00, 0x03, 0x0C, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x88, 0x80, 0x18, 0x98, 0x80, 0x31, 0x91, 0x80, 0x63, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8355, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x31, 0x00, 0x31, 0x21, 0x00, 0x63, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8356, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x00, 0x98, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x1E, 0x0E, 0x00, 0x73, 0xF8, 0x00, 0x02, 0x00, 0x80, 0x03, 0x01, 0x80, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8357, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x44, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x14, 0x2C, 0x00, 0x16, 0x38, 0x00, 0x13, 0x10, 0x00, 0x31, 0x38, 0x80, 0x20, 0x6D, 0x80, 0x61, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8358, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x34, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x64, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x835A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x07, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x835B, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x90, 0x00, 0x00, 0xA2, 0x00, 0x01, 0xC2, 0x00, 0x1E, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x02, 0x41, 0x00, 0x04, 0x41, 0x00, 0x38, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x835C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x10, 0x40, 0x00, 0x10, 0x4C, 0x00, 0x1F, 0x70, 0x00, 0x10, 0x40, 0x00, 0x13, 0x42, 0x00, 0x1C, 0xBE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x835E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x1A, 0x27, 0x00, 0x62, 0x22, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x835F, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x18, 0x27, 0x00, 0x67, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8360, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x03, 0x60, 0x00, 0x00, 0x80, 0x00, 0x01, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1A, 0x27, 0x00, 0x62, 0x22, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8361, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x23, 0xF8, 0x00, 0x18, 0x20, 0x00, 0x08, 0x40, 0x00, 0x40, 0x82, 0x00, 0x23, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x71, 0x22, 0x00, 0x11, 0x22, 0x00, 0x12, 0x42, 0x00, 0x14, 0x94, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8363, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x82, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0xC0, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8E, 0x00, 0x30, 0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8364, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x02, 0x00, 0x41, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x80, 0x00, 0x04, 0x90, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8365, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x8A, 0x00, 0x5E, 0x90, 0x00, 0x02, 0xE0, 0x00, 0x04, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x08, 0x90, 0x00, 0x30, 0x8E, 0x00, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8366, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x44, 0x92, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x10, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8367, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x8A, 0x00, 0x04, 0x98, 0x00, 0x04, 0xA0, 0x00, 0x08, 0x80, 0x00, 0x01, 0x40, 0x00, 0x01, 0x20, 0x00, 0x02, 0x18, 0x00, 0x0C, 0x07, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8368, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8369, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x20, 0x00, 0x09, 0x10, 0x00, 0x08, 0xC8, 0x00, 0x10, 0x47, 0x00, 0x10, 0x02, 0x00, 0x21, 0x80, 0x00, 0x40, 0x60, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x836A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x50, 0x00, 0x07, 0x54, 0x00, 0x1C, 0x52, 0x00, 0x64, 0x92, 0x00, 0x04, 0x91, 0x00, 0x05, 0x11, 0x00, 0x04, 0x10, 0x00, 0x14, 0x50, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x836B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x24, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x32, 0x42, 0x00, 0x2C, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x0A, 0x00, 0x22, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x836C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x06, 0x48, 0x00, 0x01, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x02, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0x30, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x836D, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x13, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x10, 0x10, 0x00, 0x07, 0x12, 0x00, 0x39, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x836E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3E, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x08, 0x44, 0x00, 0x13, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x00, 0x04, 0x00, 0x07, 0x04, 0x00, 0x38, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x836F, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x22, 0x00, 0x11, 0x3F, 0x00, 0x3E, 0x42, 0x00, 0x04, 0x82, 0x00, 0x08, 0x22, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x12, 0x00, 0x07, 0x02, 0x00, 0x38, 0x02, 0x00, 0x10, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8370, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x18, 0x7F, 0x00, 0x1C, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x48, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8373, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8375, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x0D, 0x86, 0x00, 0x07, 0x04, 0x00, 0x0D, 0x9C, 0x00, 0x38, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x12, 0x63, 0x00, 0x12, 0x25, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8377, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x18, 0xF2, 0x00, 0x28, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8378, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xF9, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x837B, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x0A, 0x51, 0x00, 0x12, 0x52, 0x00, 0x26, 0x90, 0x00, 0x06, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x12, 0x28, 0x00, 0x22, 0x44, 0x00, 0x02, 0x82, 0x00, 0x0D, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x837C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x01, 0xC0, 0x00, 0x07, 0x70, 0x00, 0x1C, 0x1C, 0x00, 0x77, 0xF7, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x837D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xC8, 0x00, 0x09, 0x0C, 0x00, 0x10, 0x84, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x18, 0x00, 0x0F, 0xF0, 0x00, 0x01, 0x9C, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x837F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x44, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x1F, 0xAC, 0x00, 0x11, 0x38, 0x00, 0x11, 0x10, 0x00, 0x33, 0x38, 0x80, 0x26, 0x6D, 0x80, 0x61, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8380, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x12, 0x33, 0x00, 0x12, 0x16, 0x00, 0x32, 0x18, 0x00, 0x23, 0xCE, 0x00, 0x6E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8382, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x81, 0x00, 0x20, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x08, 0x11, 0x00, 0x0F, 0x91, 0x00, 0x08, 0x91, 0x00, 0x18, 0x91, 0x00, 0x10, 0x81, 0x00, 0x31, 0x81, 0x00, 0x67, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8384, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x78, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8385, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x31, 0x02, 0x00, 0x51, 0x86, 0x00, 0x10, 0x84, 0x00, 0x10, 0x8C, 0x00, 0x10, 0x08, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8386, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x84, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8387, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x31, 0x00, 0x22, 0x21, 0x00, 0x23, 0x21, 0x00, 0x3E, 0x63, 0x00, 0x60, 0xC2, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8389, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0xC1, 0x00, 0x1E, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x06, 0x09, 0x00, 0x0B, 0x09, 0x00, 0x0A, 0x89, 0x00, 0x12, 0x09, 0x00, 0x22, 0x01, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x838A, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x838D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x84, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x18, 0x86, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0xD8, 0x00, 0x02, 0xE0, 0x00, 0x06, 0xB8, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x838E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x10, 0x10, 0x00, 0x08, 0x12, 0x00, 0x00, 0x91, 0x00, 0x21, 0x10, 0x80, 0x12, 0x10, 0x00, 0x00, 0x10, 0x80, 0x08, 0x11, 0x00, 0x08, 0x72, 0x00, 0x10, 0x04, 0x00, 0x10, 0x18, 0x00, 0x20, 0x60, 0x00, 0x23, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8392, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8393, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8394, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x26, 0x11, 0x00, 0x3C, 0x1F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8395, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB8, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8396, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x08, 0x88, 0x00, 0x11, 0x10, 0x00, 0x08, 0x88, 0x00, 0x04, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8398, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8399, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x1C, 0x01, 0x00, 0x74, 0x01, 0x00, 0x04, 0x01, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x839A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x07, 0x00, 0x09, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x3C, 0x90, 0x00, 0x04, 0x9E, 0x00, 0x4C, 0x90, 0x00, 0x68, 0x90, 0x00, 0x38, 0x90, 0x00, 0x10, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x839B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x06, 0x00, 0x02, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x2C, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x839C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x7F, 0x80, 0x18, 0x42, 0x00, 0x3A, 0xA2, 0x00, 0x6A, 0x36, 0x00, 0x0A, 0x1C, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x839D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x1C, 0x9C, 0x00, 0x16, 0xB6, 0x00, 0x32, 0xA3, 0x00, 0x60, 0x81, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x839E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x839F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x70, 0x00, 0x0E, 0x1C, 0x00, 0x79, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83A0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x78, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0C, 0x8C, 0x00, 0x77, 0xF3, 0x80, 0x01, 0x10, 0x00, 0x03, 0x1E, 0x00, 0x06, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x38, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83A2, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x90, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83A6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x84, 0x00, 0x18, 0x86, 0x00, 0x30, 0x83, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83A7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x19, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83A8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x23, 0x00, 0x08, 0x36, 0x00, 0x08, 0x18, 0x00, 0x0F, 0x8E, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83A9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC2, 0x00, 0x08, 0x41, 0x00, 0x10, 0x20, 0x80, 0x27, 0xF8, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83AA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x01, 0xD4, 0x00, 0x1E, 0x12, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0xD1, 0x00, 0x07, 0x12, 0x00, 0x3A, 0x0C, 0x00, 0x02, 0x0C, 0x80, 0x02, 0x32, 0x80, 0x06, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83AB, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83AC, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83AD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x23, 0x21, 0x00, 0x3E, 0x27, 0x00, 0x20, 0x20, 0x00, 0x33, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B0, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x82, 0x00, 0x09, 0x24, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x0E, 0x50, 0x00, 0x70, 0x88, 0x00, 0x21, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B1, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x18, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B2, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x20, 0x00, 0x08, 0x48, 0x00, 0x0B, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x38, 0xA8, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x14, 0x23, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B3, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x0A, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x48, 0x00, 0x22, 0x28, 0x00, 0x22, 0x28, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B4, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x64, 0x00, 0x16, 0x24, 0x00, 0x10, 0x14, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B5, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x11, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x03, 0x2C, 0x00, 0x06, 0x26, 0x00, 0x0C, 0x20, 0x80, 0x18, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B6, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 0x18, 0x00, 0x1F, 0xF7, 0x00, 0x60, 0x02, 0x00, 0x01, 0x08, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x00, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B7, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x12, 0x14, 0x00, 0x0C, 0x12, 0x00, 0x08, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x14, 0x28, 0x00, 0x64, 0x28, 0x00, 0x04, 0x44, 0x00, 0x14, 0x83, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B8, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x10, 0x28, 0x00, 0x0A, 0x24, 0x00, 0x05, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x32, 0x30, 0x00, 0x06, 0x50, 0x00, 0x0A, 0x50, 0x00, 0x12, 0x50, 0x00, 0x62, 0x91, 0x00, 0x02, 0x91, 0x00, 0x15, 0x0F, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83B9, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x5F, 0xFA, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83BA, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x47, 0xF2, 0x00, 0x04, 0x10, 0x00, 0x05, 0x90, 0x00, 0x04, 0x50, 0x00, 0x04, 0x24, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83BC, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x24, 0x00, 0x05, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x3E, 0x24, 0x00, 0x00, 0x20, 0x00, 0x07, 0x21, 0x00, 0x38, 0x21, 0x00, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83BD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x3A, 0x0B, 0x80, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83BE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x77, 0xFB, 0x80, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83BF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x7F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x2E, 0xC9, 0x00, 0x1D, 0x01, 0x00, 0x34, 0xC1, 0x00, 0x64, 0x01, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83C0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x28, 0x01, 0x00, 0x0F, 0xBE, 0x00, 0x18, 0xA2, 0x00, 0x31, 0xA2, 0x00, 0x6D, 0x26, 0x00, 0x03, 0x20, 0x00, 0x06, 0x20, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83C1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83C5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83C7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x36, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x7C, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x31, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83C9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x43, 0x00, 0x08, 0xEC, 0x00, 0x05, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83CA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x14, 0x91, 0x00, 0x22, 0xA1, 0x00, 0x0F, 0xF9, 0x00, 0x01, 0xC1, 0x00, 0x02, 0xA1, 0x00, 0x04, 0x91, 0x00, 0x08, 0x89, 0x00, 0x10, 0x82, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83CC, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x79, 0x00, 0x13, 0xC1, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFD, 0x00, 0x10, 0xE1, 0x00, 0x11, 0x51, 0x00, 0x16, 0x4D, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83CE, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x08, 0x26, 0x00, 0x0F, 0xBC, 0x00, 0x08, 0x20, 0x80, 0x0F, 0xA1, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83CF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x30, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x61, 0xE2, 0x00, 0x31, 0x22, 0x00, 0x11, 0x22, 0x00, 0x09, 0x22, 0x00, 0x19, 0xE2, 0x00, 0x10, 0x02, 0x00, 0x30, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83D0, { 0x00, 0x00, 0x00, 0x11, 0x22, 0x00, 0x19, 0x26, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83D1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x42, 0x00, 0x18, 0xC6, 0x00, 0x31, 0x8C, 0x00, 0x18, 0xC6, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83D3, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83D4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x43, 0x00, 0x3A, 0x40, 0x00, 0x2E, 0x7F, 0x00, 0x22, 0x51, 0x00, 0x3A, 0x5B, 0x00, 0x2E, 0x4E, 0x00, 0x22, 0x44, 0x00, 0x62, 0x4E, 0x00, 0x46, 0x5B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83D6, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83D8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x66, 0x00, 0x08, 0xC3, 0x00, 0x19, 0x91, 0x80, 0x1C, 0x10, 0x00, 0x2A, 0x30, 0x00, 0x2A, 0x22, 0x00, 0x48, 0x62, 0x00, 0x08, 0x4F, 0x00, 0x08, 0xF9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83DC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x01, 0x00, 0x08, 0x42, 0x00, 0x04, 0x24, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83DD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x22, 0x00, 0x10, 0x21, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x20, 0x00, 0x10, 0x62, 0x00, 0x10, 0x42, 0x00, 0x1C, 0xE6, 0x00, 0x70, 0xAC, 0x00, 0x11, 0x98, 0x00, 0x13, 0x3C, 0x00, 0x10, 0x66, 0x00, 0x31, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83DF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x28, 0x00, 0x02, 0x2C, 0x00, 0x06, 0x24, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83E0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x08, 0x00, 0x30, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x09, 0x08, 0x80, 0x61, 0x08, 0x00, 0x31, 0xFF, 0x00, 0x11, 0x41, 0x00, 0x09, 0x63, 0x00, 0x1B, 0x36, 0x00, 0x12, 0x1C, 0x00, 0x36, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83E1, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x20, 0x22, 0x00, 0x28, 0xCA, 0x00, 0x24, 0x92, 0x00, 0x22, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x24, 0x9A, 0x00, 0x29, 0x8A, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83E5, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x70, 0x00, 0x7F, 0x40, 0x00, 0x04, 0x42, 0x00, 0x0E, 0x7F, 0x00, 0x0D, 0x48, 0x00, 0x14, 0x48, 0x00, 0x24, 0x48, 0x00, 0x44, 0x88, 0x00, 0x04, 0x88, 0x00, 0x05, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83E8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x30, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83E9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83EA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83EB, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83EF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83F0, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x0F, 0x00, 0x3E, 0xF4, 0x00, 0x04, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0xA4, 0x00, 0x0C, 0xA4, 0x00, 0x18, 0xA2, 0x00, 0x29, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x3D, 0x00, 0x0A, 0xC5, 0x00, 0x1A, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83F1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x11, 0x00, 0x02, 0x1F, 0x00, 0x0C, 0x80, 0x00, 0x31, 0xFC, 0x00, 0x03, 0x08, 0x00, 0x04, 0x90, 0x00, 0x18, 0x60, 0x00, 0x03, 0x98, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83F2, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x01, 0x10, 0x00, 0x03, 0x90, 0x00, 0x3D, 0x1F, 0x80, 0x02, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83F4, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x58, 0x00, 0x06, 0x46, 0x00, 0x3F, 0xFD, 0x80, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x80, 0x00, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83F6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x06, 0x18, 0x00, 0x18, 0x86, 0x00, 0x67, 0xF9, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83F7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83F8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x7F, 0xB6, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x0F, 0x18, 0x00, 0x09, 0x0C, 0x00, 0x09, 0x06, 0x00, 0x19, 0x00, 0x00, 0x13, 0x06, 0x00, 0x32, 0x1C, 0x00, 0x66, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83F9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x20, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83FB, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x0D, 0x1C, 0x00, 0x14, 0xAA, 0x00, 0x34, 0x6B, 0x00, 0x64, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x83FC, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x86, 0x00, 0x18, 0x8C, 0x00, 0x11, 0xC0, 0x00, 0x07, 0x78, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x80, 0x00, 0x08, 0x86, 0x00, 0x18, 0x8C, 0x00, 0x31, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x83FD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x04, 0x3F, 0x00, 0x07, 0x91, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x04, 0x14, 0x00, 0x15, 0x0C, 0x00, 0x14, 0x88, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x92, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8401, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8403, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x05, 0x14, 0x00, 0x08, 0xA2, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8404, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x12, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x08, 0x81, 0x00, 0x1F, 0xFD, 0x00, 0x04, 0x91, 0x00, 0x04, 0x91, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x12, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8406, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8407, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x08, 0x66, 0x00, 0x08, 0x38, 0x00, 0x0F, 0x8E, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x840A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x20, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x840B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x840C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x00, 0x41, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x840D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x11, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x52, 0x00, 0x10, 0x91, 0x00, 0x09, 0x10, 0x80, 0x00, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x840E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0x30, 0x00, 0x01, 0xF8, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x840F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x06, 0x02, 0x00, 0x0C, 0x06, 0x00, 0x19, 0x9C, 0x00, 0x07, 0x00, 0x00, 0x1C, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8411, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8413, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8415, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x04, 0x00, 0x30, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8418, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF8, 0x00, 0x18, 0x07, 0x00, 0x6F, 0xFA, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x08, 0x8C, 0x00, 0x12, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8419, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x18, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x2A, 0x38, 0x00, 0x2A, 0x28, 0x00, 0x48, 0x68, 0x80, 0x08, 0xC9, 0x80, 0x09, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x841C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x1F, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x841D, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x0C, 0x04, 0x00, 0x32, 0x08, 0x00, 0x01, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8420, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x3A, 0x00, 0x17, 0x2E, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x3A, 0x00, 0x17, 0x2E, 0x00, 0x11, 0x22, 0x00, 0x31, 0x22, 0x00, 0x21, 0x62, 0x00, 0x63, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8422, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x19, 0xFF, 0x00, 0x0B, 0x01, 0x00, 0x60, 0xF9, 0x00, 0x30, 0x09, 0x00, 0x10, 0x0B, 0x00, 0x04, 0xFA, 0x00, 0x0C, 0x86, 0x00, 0x18, 0x80, 0x80, 0x30, 0xC1, 0x80, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8424, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x40, 0x8A, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8425, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x47, 0xF2, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8426, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x42, 0x12, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x90, 0x00, 0x04, 0x8C, 0x00, 0x18, 0x84, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8427, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x90, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x12, 0x94, 0x00, 0x14, 0x94, 0x00, 0x20, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8428, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFE, 0x00, 0x24, 0x44, 0x00, 0x28, 0x28, 0x00, 0x24, 0xFF, 0x00, 0x22, 0x80, 0x00, 0x22, 0x80, 0x00, 0x32, 0x80, 0x00, 0x2C, 0x80, 0x00, 0x20, 0x80, 0x00, 0x21, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8429, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x04, 0x00, 0x03, 0x04, 0x00, 0x1C, 0x04, 0x80, 0x04, 0x05, 0x00, 0x04, 0x16, 0x00, 0x3F, 0x94, 0x00, 0x0C, 0x24, 0x00, 0x0E, 0x04, 0x00, 0x15, 0x0A, 0x00, 0x14, 0x0A, 0x00, 0x24, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x842A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x03, 0x82, 0x00, 0x3E, 0x32, 0x00, 0x04, 0x1A, 0x00, 0x7F, 0x82, 0x00, 0x14, 0x62, 0x00, 0x16, 0x32, 0x00, 0x35, 0x03, 0x80, 0x25, 0x1E, 0x00, 0x64, 0x72, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x842C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x48, 0x80, 0x20, 0x7C, 0x80, 0x27, 0x82, 0x80, 0x20, 0x00, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x842F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x38, 0x60, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8431, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8435, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8438, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x03, 0x40, 0x00, 0x1C, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8439, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x0E, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x34, 0x92, 0x00, 0x27, 0xFE, 0x00, 0x64, 0x92, 0x00, 0x04, 0x96, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x843C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x843D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x42, 0x00, 0x10, 0xA4, 0x00, 0x09, 0x18, 0x00, 0x0A, 0x1C, 0x00, 0x08, 0x23, 0x80, 0x10, 0xFE, 0x00, 0x13, 0x42, 0x00, 0x10, 0x42, 0x00, 0x20, 0x7E, 0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8445, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x36, 0x3E, 0x00, 0x63, 0x22, 0x00, 0x00, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x36, 0x22, 0x00, 0x63, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8446, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x38, 0x10, 0x00, 0x6B, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8447, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x18, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x42, 0x00, 0x06, 0x44, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0C, 0x8C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8448, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0C, 0x00, 0x0F, 0xF7, 0x00, 0x38, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0C, 0x8C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8449, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x844A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x03, 0x70, 0x00, 0x0C, 0x0C, 0x00, 0x77, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x844D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x844E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x11, 0x00, 0x63, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x30, 0x10, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x844F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8451, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xC2, 0x00, 0x00, 0x22, 0x00, 0x04, 0x32, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0x82, 0x00, 0x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8452, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x18, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x16, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x19, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x68, 0xFF, 0x80, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8456, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x06, 0x3E, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8457, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x50, 0x00, 0x01, 0x88, 0x00, 0x07, 0xFE, 0x00, 0x3A, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8458, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x44, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x08, 0x88, 0x00, 0x04, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8459, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x21, 0x00, 0x1C, 0x3F, 0x00, 0x1A, 0x21, 0x00, 0x29, 0x21, 0x00, 0x48, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x845A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1E, 0x1F, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x845B, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x41, 0x00, 0x28, 0xA1, 0x00, 0x09, 0x11, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x845C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xBF, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x19, 0x00, 0x3F, 0xB3, 0x00, 0x64, 0x66, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8460, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x18, 0xFE, 0x00, 0x30, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x12, 0xFE, 0x80, 0x10, 0x4C, 0x00, 0x10, 0x38, 0x00, 0x11, 0xCF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8461, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x41, 0x00, 0x07, 0xFD, 0x00, 0x04, 0x45, 0x00, 0x07, 0xFD, 0x00, 0x04, 0x45, 0x00, 0x07, 0xFD, 0x00, 0x04, 0x45, 0x00, 0x04, 0x4D, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8462, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x06, 0x18, 0x00, 0x1D, 0x8E, 0x00, 0x70, 0xC3, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8463, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8464, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x02, 0x00, 0x18, 0x02, 0x00, 0x32, 0x02, 0x00, 0x16, 0x7F, 0x80, 0x0C, 0x02, 0x00, 0x19, 0x22, 0x00, 0x7F, 0x32, 0x00, 0x09, 0x12, 0x00, 0x2A, 0x02, 0x00, 0x2B, 0x02, 0x00, 0x69, 0x02, 0x00, 0x48, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8465, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x11, 0x22, 0x00, 0x1D, 0x22, 0x00, 0x13, 0x22, 0x00, 0x19, 0x22, 0x00, 0x17, 0x02, 0x00, 0x11, 0x02, 0x00, 0x13, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8466, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8467, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xC9, 0x00, 0x40, 0x49, 0x00, 0x1F, 0x09, 0x00, 0x02, 0x19, 0x00, 0x07, 0xD1, 0x00, 0x7C, 0x11, 0x00, 0x04, 0x33, 0x00, 0x04, 0x62, 0x00, 0x1C, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8469, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x40, 0x80, 0x00, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x846A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x11, 0x00, 0x22, 0x11, 0x00, 0x7F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x60, 0x81, 0x00, 0x43, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x846B, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x3F, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x02, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x5F, 0x00, 0x10, 0x51, 0x00, 0x10, 0x51, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x846C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x07, 0xD3, 0x80, 0x0C, 0x9C, 0x00, 0x33, 0x10, 0x80, 0x02, 0x1F, 0x80, 0x0D, 0x08, 0x00, 0x31, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x06, 0x08, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x846D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x01, 0x00, 0x21, 0x01, 0x00, 0x3F, 0x7F, 0x00, 0x20, 0x00, 0x00, 0x20, 0x7F, 0x00, 0x3F, 0x23, 0x00, 0x20, 0x36, 0x00, 0x3F, 0x1C, 0x00, 0x20, 0x36, 0x00, 0x20, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x846E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3E, 0x00, 0x3C, 0x22, 0x00, 0x20, 0x62, 0x00, 0x3E, 0xC3, 0x80, 0x20, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x23, 0x00, 0x20, 0x36, 0x00, 0x3E, 0x1C, 0x00, 0x60, 0x36, 0x00, 0x20, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x846F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x20, 0x00, 0x32, 0x20, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x12, 0x81, 0x00, 0x3F, 0x11, 0x00, 0x09, 0x09, 0x00, 0x2A, 0x05, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0x02, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8470, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x40, 0x00, 0x04, 0x82, 0x00, 0x0D, 0xFD, 0x00, 0x08, 0x48, 0x00, 0x18, 0x8F, 0x80, 0x33, 0x40, 0x00, 0x50, 0xFE, 0x00, 0x11, 0x86, 0x00, 0x13, 0x4C, 0x00, 0x10, 0x38, 0x00, 0x10, 0xEC, 0x00, 0x13, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8471, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x89, 0x00, 0x77, 0x11, 0x00, 0x03, 0xE3, 0x00, 0x1C, 0x72, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x12, 0xC3, 0x00, 0x12, 0x65, 0x80, 0x33, 0x0C, 0x80, 0x61, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8473, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x17, 0xD0, 0x00, 0x11, 0x19, 0x00, 0x17, 0xEB, 0x00, 0x12, 0x4E, 0x00, 0x17, 0x84, 0x00, 0x30, 0xCE, 0x80, 0x27, 0x3B, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8474, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x17, 0xD0, 0x00, 0x10, 0x19, 0x00, 0x17, 0xCB, 0x00, 0x14, 0x4E, 0x00, 0x14, 0x44, 0x00, 0x37, 0xCE, 0x80, 0x20, 0x3B, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8475, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x54, 0x00, 0x04, 0x89, 0x00, 0x03, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8476, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xFC, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8477, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8478, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x12, 0x43, 0x00, 0x32, 0x09, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8479, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x7E, 0xC8, 0x00, 0x11, 0xA8, 0x00, 0x10, 0x2F, 0x00, 0x1E, 0x39, 0x00, 0x12, 0xE9, 0x00, 0x12, 0x2B, 0x00, 0x12, 0x28, 0x00, 0x32, 0x20, 0x80, 0x22, 0x31, 0x80, 0x6E, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x847A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x847C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x13, 0x32, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x32, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x06, 0x3F, 0x80, 0x7A, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x7A, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x847D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xE2, 0x00, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0x18, 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8481, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x30, 0x44, 0x00, 0x18, 0x12, 0x00, 0x08, 0x11, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8482, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8484, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x1E, 0x02, 0x00, 0x00, 0x7F, 0x80, 0x7F, 0xA2, 0x00, 0x12, 0x32, 0x00, 0x12, 0x12, 0x00, 0x12, 0x02, 0x00, 0x12, 0x0E, 0x80, 0x33, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8485, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x18, 0x40, 0x00, 0x0D, 0xFC, 0x00, 0x60, 0x44, 0x00, 0x30, 0x44, 0x00, 0x0C, 0xC4, 0x00, 0x39, 0x84, 0x80, 0x63, 0x03, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8487, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x28, 0x00, 0x00, 0x14, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x17, 0xD0, 0x00, 0x14, 0x52, 0x00, 0x15, 0x52, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x15, 0x48, 0x00, 0x22, 0x99, 0x00, 0x22, 0x65, 0x00, 0x4C, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8488, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x4C, 0x00, 0x10, 0x70, 0x00, 0x17, 0x42, 0x00, 0x39, 0x3E, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8489, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x48, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x848B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x49, 0xF0, 0x80, 0x68, 0x89, 0x00, 0x28, 0x40, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x80, 0x38, 0x42, 0x00, 0x68, 0x62, 0x00, 0x08, 0x22, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x848C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0xA0, 0x00, 0x1C, 0x9C, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x848E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x10, 0x0E, 0x00, 0x0D, 0xF0, 0x00, 0x25, 0x06, 0x00, 0x11, 0x78, 0x00, 0x05, 0x52, 0x00, 0x09, 0x54, 0x00, 0x11, 0x48, 0x00, 0x32, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x54, 0x00, 0x14, 0x67, 0x00, 0x18, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8490, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x28, 0x00, 0x02, 0x32, 0x00, 0x02, 0x3D, 0x00, 0x04, 0x20, 0x80, 0x08, 0x3F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8492, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8493, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x09, 0x80, 0x18, 0x0F, 0x00, 0x32, 0xF8, 0x00, 0x16, 0x08, 0x00, 0x0C, 0x49, 0x00, 0x1A, 0x49, 0x00, 0x7D, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2B, 0x08, 0x80, 0x69, 0x09, 0x80, 0x48, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8494, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1E, 0x04, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x04, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8495, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x34, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8497, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x40, 0x00, 0x10, 0x24, 0x00, 0x0D, 0xFE, 0x00, 0x05, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x13, 0x04, 0x00, 0x05, 0xFC, 0x00, 0x09, 0x44, 0x00, 0x39, 0x28, 0x00, 0x09, 0x10, 0x00, 0x09, 0x48, 0x00, 0x09, 0x87, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8499, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xA0, 0x00, 0x02, 0x53, 0x00, 0x0C, 0x6C, 0x00, 0x31, 0x98, 0x00, 0x06, 0x34, 0x00, 0x38, 0xD2, 0x00, 0x03, 0x11, 0x80, 0x1C, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x849C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x29, 0x00, 0x15, 0x29, 0x00, 0x15, 0x48, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x849E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x31, 0x08, 0x00, 0x19, 0x08, 0x00, 0x0B, 0x7F, 0x00, 0x62, 0x00, 0x00, 0x32, 0x41, 0x00, 0x16, 0x63, 0x00, 0x0A, 0x22, 0x00, 0x1A, 0x26, 0x00, 0x12, 0x04, 0x00, 0x32, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x849F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0xC1, 0x00, 0x22, 0x79, 0x00, 0x32, 0x49, 0x00, 0x16, 0x49, 0x00, 0x14, 0x49, 0x00, 0x04, 0x79, 0x00, 0x1E, 0x03, 0x00, 0x70, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84A1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x04, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84A6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x30, 0x40, 0x00, 0x5F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x03, 0xF8, 0x00, 0x7E, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84A8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x50, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84A9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3C, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84AA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x14, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84AD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x31, 0x01, 0x00, 0x09, 0x11, 0x00, 0x0F, 0xF3, 0x00, 0x04, 0x0E, 0x00, 0x3A, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x34, 0x89, 0x00, 0x07, 0xFB, 0x00, 0x01, 0x02, 0x00, 0x3E, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84AF, { 0x00, 0x00, 0x00, 0x04, 0x81, 0x00, 0x04, 0x85, 0x00, 0x7F, 0xF5, 0x00, 0x04, 0x85, 0x00, 0x00, 0x05, 0x00, 0x3C, 0xF5, 0x00, 0x24, 0x95, 0x00, 0x24, 0x95, 0x00, 0x34, 0xD5, 0x00, 0x2C, 0xB5, 0x00, 0x24, 0x95, 0x00, 0x34, 0xD1, 0x00, 0x2C, 0xB1, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x4D, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84B1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x31, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84B2, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x13, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84B4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x20, 0x80, 0x00, 0x11, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x11, 0x00, 0x0C, 0x31, 0x00, 0x18, 0x61, 0x00, 0x30, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84B8, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x62, 0x00, 0x01, 0x54, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x09, 0xC2, 0x00, 0x30, 0x01, 0x80, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84B9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x88, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x05, 0x28, 0x00, 0x0D, 0x2C, 0x00, 0x19, 0x26, 0x00, 0x71, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84BA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x51, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x16, 0x20, 0x00, 0x30, 0x20, 0x00, 0x5F, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x30, 0xD8, 0x00, 0x21, 0x8C, 0x00, 0x63, 0x06, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84BB, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x81, 0x00, 0x0F, 0x9F, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xBF, 0x80, 0x02, 0x84, 0x80, 0x0D, 0x99, 0x80, 0x32, 0xE2, 0x80, 0x0C, 0x8C, 0x80, 0x30, 0xB0, 0x80, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84BC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x68, 0x00, 0x01, 0x90, 0x00, 0x06, 0x0C, 0x00, 0x3B, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x04, 0x00, 0x17, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84BD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x17, 0xFA, 0x00, 0x11, 0x22, 0x00, 0x12, 0x12, 0x00, 0x14, 0x0A, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x12, 0x43, 0x00, 0x32, 0x09, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84BE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x30, 0x10, 0x00, 0x19, 0x11, 0x00, 0x09, 0x93, 0x00, 0x30, 0x92, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x54, 0x00, 0x78, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84BF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C0, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x3C, 0x00, 0x02, 0x08, 0x00, 0x04, 0x52, 0x00, 0x04, 0x24, 0x00, 0x05, 0x99, 0x00, 0x0E, 0x1F, 0x80, 0x35, 0xF0, 0x80, 0x04, 0x10, 0x00, 0x04, 0x52, 0x00, 0x04, 0x91, 0x00, 0x05, 0x10, 0x80, 0x0C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C1, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x18, 0x36, 0x00, 0x67, 0xE1, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C2, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C4, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x20, 0x00, 0x02, 0x44, 0x00, 0x01, 0x9E, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C6, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x23, 0x00, 0x21, 0x26, 0x00, 0x3F, 0x24, 0x00, 0x20, 0x22, 0x00, 0x24, 0xA1, 0x00, 0x25, 0x21, 0x00, 0x2E, 0x21, 0x00, 0x3B, 0x2E, 0x00, 0x61, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84C9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x06, 0x4C, 0x00, 0x18, 0xA3, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84CA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0xF8, 0x00, 0x1C, 0x0E, 0x00, 0x71, 0x13, 0x80, 0x06, 0x78, 0x00, 0x0F, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x0D, 0x0D, 0x00, 0x33, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x31, 0x31, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84CB, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84CC, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x1C, 0x96, 0x00, 0x62, 0xA3, 0x80, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x7A, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84CD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x9C, 0x00, 0x07, 0xE0, 0x00, 0x3A, 0x00, 0x80, 0x03, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84CF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x83, 0x00, 0x07, 0x0E, 0x00, 0x1D, 0x3A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0xAA, 0x00, 0x14, 0xEA, 0x00, 0x15, 0x2A, 0x00, 0x37, 0x6E, 0x80, 0x2D, 0x5B, 0x80, 0x60, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84D0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x13, 0xCC, 0x00, 0x16, 0x03, 0x80, 0x10, 0x04, 0x00, 0x37, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x61, 0x84, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84D1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x01, 0x11, 0x00, 0x07, 0x0A, 0x00, 0x39, 0x04, 0x00, 0x01, 0xF2, 0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84D3, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x19, 0x86, 0x00, 0x10, 0x84, 0x00, 0x37, 0xFF, 0x80, 0x50, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84D6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x09, 0x24, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x24, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x23, 0x00, 0x0F, 0xBE, 0x00, 0x08, 0x20, 0x80, 0x0F, 0xA1, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84D9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x13, 0xAE, 0x00, 0x16, 0xAB, 0x00, 0x10, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84DA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x05, 0x3F, 0x00, 0x09, 0x62, 0x00, 0x09, 0x94, 0x00, 0x19, 0x0C, 0x00, 0x19, 0x33, 0x80, 0x29, 0xD8, 0x00, 0x09, 0x62, 0x00, 0x09, 0x0C, 0x00, 0x09, 0x33, 0x00, 0x09, 0x0C, 0x00, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84DC, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x0A, 0x01, 0x00, 0x3F, 0x81, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x9F, 0x00, 0x2A, 0x90, 0x00, 0x33, 0x90, 0x00, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x99, 0x80, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84DD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x02, 0x48, 0x00, 0x12, 0x7C, 0x00, 0x12, 0x80, 0x00, 0x13, 0x20, 0x00, 0x12, 0x10, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84DF, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x02, 0x00, 0x0F, 0x92, 0x00, 0x11, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x12, 0x52, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x52, 0x00, 0x1F, 0xD2, 0x00, 0x10, 0x02, 0x00, 0x01, 0xC2, 0x00, 0x3E, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84E0, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x28, 0x00, 0x09, 0xC8, 0x00, 0x0A, 0x28, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x02, 0x00, 0x22, 0x12, 0x00, 0x27, 0xFA, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84E3, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3E, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x14, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x82, 0x00, 0x0A, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x2C, 0x00, 0x28, 0x42, 0x00, 0x11, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84E5, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x41, 0x42, 0x00, 0x06, 0x30, 0x00, 0x1B, 0xEF, 0x00, 0x60, 0x82, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA4, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84E6, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x0A, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x60, 0x13, 0x00, 0x04, 0x10, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xE4, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84E7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x15, 0x82, 0x00, 0x14, 0x44, 0x00, 0x34, 0x38, 0x00, 0x55, 0xC7, 0x80, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x54, 0x00, 0x14, 0xD6, 0x00, 0x11, 0x93, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84EA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x30, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x46, 0x00, 0x30, 0x28, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x19, 0x13, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84EC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x10, 0x7E, 0x00, 0x08, 0x84, 0x00, 0x01, 0x48, 0x00, 0x26, 0x30, 0x00, 0x10, 0x2C, 0x00, 0x00, 0xD3, 0x80, 0x03, 0x7E, 0x00, 0x38, 0x10, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84EE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x39, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84EF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x31, 0x45, 0x00, 0x63, 0x6D, 0x80, 0x08, 0x00, 0x00, 0x18, 0x10, 0x00, 0x30, 0x10, 0x00, 0x70, 0x9F, 0x00, 0x11, 0x90, 0x00, 0x13, 0x50, 0x00, 0x16, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84F0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x90, 0x00, 0x30, 0x9F, 0x00, 0x60, 0x90, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x30, 0x10, 0x00, 0x70, 0x9F, 0x00, 0x11, 0x90, 0x00, 0x13, 0x50, 0x00, 0x16, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84F1, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x41, 0x00, 0x18, 0x82, 0x00, 0x0B, 0xEF, 0x80, 0x60, 0x82, 0x00, 0x30, 0x82, 0x00, 0x10, 0xE2, 0x00, 0x03, 0x8F, 0x80, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x31, 0x82, 0x00, 0x63, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84F2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x23, 0xF8, 0x00, 0x22, 0x08, 0x00, 0x23, 0xF8, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xBE, 0x00, 0x28, 0xA2, 0x00, 0x2F, 0xBE, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84F4, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xC4, 0x80, 0x00, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84F7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x22, 0x00, 0x10, 0x44, 0x00, 0x10, 0xFF, 0x80, 0x7D, 0x88, 0x00, 0x12, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x1C, 0x88, 0x00, 0x70, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x30, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84FA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3E, 0x00, 0x7F, 0xCA, 0x00, 0x11, 0x0A, 0x00, 0x25, 0xCA, 0x00, 0x5F, 0x3A, 0x00, 0x04, 0x12, 0x00, 0x0F, 0xBA, 0x80, 0x78, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84FB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x92, 0x00, 0x12, 0x12, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x72, 0x00, 0x3F, 0x22, 0x00, 0x08, 0x72, 0x80, 0x08, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x84FC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xBF, 0x00, 0x04, 0x89, 0x00, 0x09, 0x93, 0x00, 0x12, 0xA5, 0x00, 0x05, 0xCB, 0x00, 0x08, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x4C, 0x00, 0x39, 0x93, 0x80, 0x0E, 0x62, 0x00, 0x03, 0x8C, 0x00, 0x00, 0x70, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84FD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x84FF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x28, 0x01, 0x00, 0x1B, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x51, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8500, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x9F, 0x80, 0x21, 0x10, 0x80, 0x33, 0x11, 0x00, 0x12, 0x12, 0x00, 0x7F, 0x91, 0x00, 0x00, 0x10, 0x80, 0x3F, 0x10, 0x80, 0x21, 0x10, 0x80, 0x21, 0x13, 0x80, 0x21, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8502, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x05, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8503, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x7C, 0xC2, 0x00, 0x04, 0x9F, 0x00, 0x05, 0xF1, 0x80, 0x3C, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x11, 0x00, 0x08, 0x7F, 0x80, 0x3B, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8506, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x30, 0x44, 0x00, 0x10, 0x87, 0x80, 0x05, 0x20, 0x00, 0x0C, 0x7E, 0x00, 0x09, 0xC4, 0x00, 0x18, 0x38, 0x00, 0x30, 0xEE, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8507, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x24, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x04, 0x00, 0x27, 0x0C, 0x00, 0x3C, 0x1C, 0x00, 0x20, 0x34, 0x80, 0x33, 0x64, 0x80, 0x1E, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x850C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0x9F, 0x80, 0x04, 0x30, 0x80, 0x3F, 0xA0, 0x80, 0x24, 0xC9, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x15, 0x16, 0x00, 0x64, 0xB3, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x850E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x3D, 0x87, 0x80, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x2C, 0x00, 0x24, 0x38, 0x00, 0x24, 0x6E, 0x00, 0x3D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8510, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8511, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x12, 0x24, 0x00, 0x11, 0x18, 0x00, 0x10, 0x28, 0x80, 0x20, 0xC6, 0x80, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8513, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x03, 0x18, 0x00, 0x01, 0xE0, 0x00, 0x3E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8514, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x07, 0xF1, 0x00, 0x00, 0x01, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFA, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8515, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x11, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8517, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x24, 0x91, 0x00, 0x24, 0x48, 0x80, 0x28, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8518, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x88, 0x00, 0x01, 0x02, 0x00, 0x02, 0x3F, 0x00, 0x3F, 0xC0, 0x80, 0x04, 0x08, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x80, 0x02, 0x68, 0x00, 0x0D, 0x96, 0x00, 0x36, 0x61, 0x80, 0x03, 0x8C, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x851A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE2, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xE2, 0x00, 0x10, 0x1F, 0x80, 0x17, 0xC2, 0x00, 0x10, 0x12, 0x00, 0x1F, 0xEA, 0x00, 0x11, 0x02, 0x00, 0x15, 0x42, 0x00, 0x25, 0x42, 0x00, 0x29, 0x42, 0x00, 0x23, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x851C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x7F, 0xD1, 0x00, 0x04, 0x33, 0x00, 0x7F, 0xCA, 0x00, 0x08, 0x0E, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x8E, 0x00, 0x18, 0x9B, 0x00, 0x73, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x851E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0B, 0xF0, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x851F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0xC0, 0x00, 0x11, 0xA0, 0x00, 0x10, 0x3F, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x32, 0x36, 0x00, 0x22, 0x63, 0x00, 0x6E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8521, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0C, 0xA2, 0x00, 0x33, 0x14, 0x00, 0x0E, 0x0C, 0x00, 0x0C, 0x03, 0x80, 0x37, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8522, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x61, 0x11, 0x00, 0x31, 0xFE, 0x00, 0x03, 0x42, 0x00, 0x36, 0x3C, 0x00, 0x61, 0xE7, 0x80, 0x02, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0x90, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8523, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x11, 0x10, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x4A, 0x00, 0x1F, 0xA4, 0x00, 0x11, 0x1A, 0x00, 0x01, 0x32, 0x00, 0x01, 0xC2, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x02, 0x00, 0x09, 0x22, 0x00, 0x11, 0x12, 0x00, 0x11, 0x02, 0x00, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8524, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x22, 0x50, 0x00, 0x12, 0x23, 0x00, 0x32, 0x45, 0x80, 0x07, 0xFC, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8525, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x09, 0xF2, 0x00, 0x0F, 0x22, 0x00, 0x08, 0xC2, 0x00, 0x0B, 0x3A, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x14, 0x80, 0x00, 0x14, 0x41, 0x00, 0x24, 0x04, 0x80, 0x27, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8526, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x66, 0xD9, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8527, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x3E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x3F, 0x3F, 0x80, 0x68, 0x04, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x852A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x01, 0x00, 0x7F, 0xC7, 0x00, 0x04, 0x1C, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xF2, 0x00, 0x04, 0x22, 0x00, 0x04, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x852B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x64, 0x91, 0x80, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x852C, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x7F, 0x80, 0x02, 0x12, 0x00, 0x04, 0x2F, 0x00, 0x04, 0xF0, 0x80, 0x17, 0x00, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x1F, 0x4A, 0x80, 0x30, 0x8B, 0x80, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x852D, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x00, 0x18, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x42, 0x00, 0x15, 0xBD, 0x80, 0x14, 0x00, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x04, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x22, 0x00, 0x10, 0x4F, 0x00, 0x11, 0xF0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x852F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x14, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x38, 0x00, 0x1C, 0x54, 0x00, 0x10, 0x92, 0x00, 0x13, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8532, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x40, 0x10, 0x80, 0x3F, 0x10, 0x00, 0x00, 0x3F, 0x80, 0x7F, 0xA2, 0x00, 0x12, 0x56, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x3B, 0x00, 0x33, 0x00, 0x80, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8533, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x60, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x92, 0x00, 0x10, 0x92, 0x00, 0x30, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8534, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x25, 0x55, 0x00, 0x25, 0x55, 0x00, 0x65, 0x55, 0x00, 0x49, 0x25, 0x80, 0x41, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8535, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x12, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x17, 0xE9, 0x00, 0x14, 0x8B, 0x00, 0x17, 0xEA, 0x00, 0x14, 0x2E, 0x00, 0x17, 0xE4, 0x00, 0x14, 0x8E, 0x00, 0x37, 0xFA, 0x80, 0x20, 0x33, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8536, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8537, { 0x00, 0x00, 0x00, 0x04, 0x14, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xE8, 0x00, 0x0A, 0x28, 0x00, 0x0B, 0xE8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8538, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x05, 0x04, 0x00, 0x1B, 0xFE, 0x00, 0x12, 0x24, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x17, 0xE4, 0x00, 0x18, 0x1C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x21, 0x00, 0x18, 0x21, 0x00, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8539, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x12, 0x00, 0x11, 0x1F, 0x00, 0x20, 0xA2, 0x00, 0x5F, 0x52, 0x00, 0x00, 0x12, 0x00, 0x24, 0x92, 0x00, 0x14, 0x94, 0x00, 0x15, 0x08, 0x00, 0x03, 0x94, 0x00, 0x3C, 0x23, 0x00, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x853A, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x52, 0x00, 0x27, 0xFA, 0x00, 0x2C, 0x42, 0x00, 0x37, 0xF2, 0x00, 0x24, 0x42, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x42, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x853B, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x21, 0x00, 0x42, 0x3A, 0x00, 0x1F, 0x20, 0x00, 0x00, 0x7C, 0x00, 0x7F, 0x84, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x12, 0xC5, 0x00, 0x22, 0x01, 0x00, 0x41, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x853C, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x21, 0xFC, 0x00, 0x19, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x79, 0xFC, 0x00, 0x08, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x22, 0x00, 0x0B, 0x52, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xEA, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x853D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x15, 0x08, 0x00, 0x24, 0x90, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xB1, 0x00, 0x24, 0xD2, 0x00, 0x2E, 0x8A, 0x00, 0x35, 0x84, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x92, 0x00, 0x25, 0xA1, 0x00, 0x04, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x853F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0xFC, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x42, 0x00, 0x10, 0x20, 0x00, 0x2F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x80, 0x10, 0x04, 0x80, 0x14, 0x92, 0x80, 0x14, 0x48, 0x80, 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8540, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x2B, 0x2B, 0x00, 0x1C, 0x1C, 0x00, 0x1A, 0x1A, 0x00, 0x29, 0x2B, 0x00, 0x48, 0x49, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8541, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8543, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC4, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8546, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x14, 0x00, 0x00, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x2F, 0xA0, 0x00, 0x28, 0xB2, 0x00, 0x2F, 0x96, 0x00, 0x28, 0x9C, 0x00, 0x2F, 0x88, 0x00, 0x28, 0x9C, 0x00, 0x6F, 0xB6, 0x80, 0x45, 0x63, 0x80, 0x48, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8548, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8549, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x854A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x02, 0x40, 0x00, 0x12, 0x44, 0x00, 0x12, 0x12, 0x00, 0x21, 0xF2, 0x00, 0x08, 0x00, 0x00, 0x04, 0x08, 0x00, 0x09, 0x05, 0x00, 0x28, 0xA8, 0x80, 0x28, 0x28, 0x00, 0x49, 0x49, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x854B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7C, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x17, 0xAF, 0x00, 0x14, 0x28, 0x00, 0x14, 0x28, 0x00, 0x1F, 0xA8, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x854E, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x00, 0x7C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x1C, 0x00, 0x3B, 0xFB, 0x80, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x854F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x44, 0x21, 0x00, 0x29, 0xFF, 0x00, 0x10, 0x22, 0x00, 0x28, 0x24, 0x00, 0x4B, 0xFF, 0x80, 0x18, 0x28, 0x00, 0x28, 0xFE, 0x00, 0x4B, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8550, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x14, 0x94, 0x00, 0x22, 0xA3, 0x00, 0x08, 0x88, 0x00, 0x14, 0x94, 0x00, 0x22, 0xA3, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8551, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x26, 0x11, 0x00, 0x24, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8552, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8553, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8555, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x5C, 0x00, 0x45, 0x83, 0x00, 0x2B, 0x7D, 0x80, 0x10, 0x28, 0x00, 0x29, 0xFF, 0x00, 0x49, 0x29, 0x00, 0x15, 0x49, 0x00, 0x25, 0x8F, 0x00, 0x45, 0x01, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8556, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x30, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x61, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x31, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x0C, 0x9C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8557, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x62, 0x00, 0x22, 0xD6, 0x00, 0x3E, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x2E, 0xE3, 0x80, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8558, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x3F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x80, 0x78, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8559, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x80, 0x00, 0x80, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x855A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x855C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x02, 0x20, 0x00, 0x7E, 0x3F, 0x80, 0x04, 0x20, 0x00, 0x18, 0x20, 0x00, 0x00, 0x80, 0x00, 0x12, 0x43, 0x00, 0x32, 0x09, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x855D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x11, 0x00, 0x32, 0x21, 0x00, 0x16, 0xC2, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x2B, 0x40, 0x80, 0x69, 0x61, 0x80, 0x48, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x855E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x33, 0x00, 0x11, 0x16, 0x00, 0x1F, 0x0C, 0x00, 0x71, 0x1E, 0x00, 0x01, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x855F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xC4, 0x00, 0x21, 0x29, 0x00, 0x12, 0x12, 0x00, 0x0C, 0x0C, 0x00, 0x70, 0x03, 0x80, 0x1E, 0x7C, 0x00, 0x02, 0x44, 0x00, 0x1E, 0x47, 0x00, 0x10, 0x80, 0x00, 0x1E, 0x7E, 0x00, 0x02, 0x22, 0x00, 0x06, 0x1C, 0x00, 0x1C, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8560, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x21, 0xA1, 0x00, 0x3B, 0x21, 0x00, 0x06, 0x3F, 0x00, 0x1C, 0x80, 0x00, 0x75, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8561, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8562, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8563, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x0F, 0xC0, 0x00, 0x04, 0x42, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x04, 0x80, 0x07, 0xC4, 0x00, 0x08, 0xFF, 0x00, 0x15, 0x24, 0x00, 0x26, 0x24, 0x00, 0x04, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8564, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x28, 0x00, 0x19, 0x7F, 0x00, 0x33, 0x48, 0x00, 0x6A, 0x08, 0x00, 0x1C, 0x3E, 0x00, 0x36, 0x08, 0x00, 0x6D, 0x08, 0x00, 0x1D, 0x08, 0x00, 0x35, 0x7F, 0x00, 0x65, 0x00, 0x00, 0x0D, 0x80, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8568, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x48, 0x00, 0x12, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x14, 0x80, 0x15, 0x55, 0x00, 0x15, 0x64, 0x00, 0x15, 0x44, 0x00, 0x17, 0xCA, 0x00, 0x15, 0x4A, 0x00, 0x11, 0x11, 0x00, 0x22, 0x11, 0x00, 0x24, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8569, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x21, 0xFF, 0x80, 0x14, 0x20, 0x00, 0x04, 0x7F, 0x80, 0x08, 0x92, 0x80, 0x0B, 0x24, 0x80, 0x10, 0xC8, 0x80, 0x13, 0x30, 0x80, 0x20, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x856A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x14, 0x92, 0x00, 0x04, 0x92, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x856B, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x856D, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x4F, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1E, 0x4F, 0x00, 0x12, 0x49, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x856F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x86, 0x00, 0x25, 0x4C, 0x00, 0x28, 0x38, 0x00, 0x28, 0x6E, 0x00, 0x25, 0xBB, 0x80, 0x24, 0x50, 0x00, 0x24, 0xFF, 0x00, 0x2D, 0x10, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8572, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x11, 0x06, 0x00, 0x0A, 0x38, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xA0, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x7F, 0xA4, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x84, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8574, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x24, 0x00, 0x08, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x22, 0xFC, 0x00, 0x3C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x4A, 0x00, 0x0F, 0x4A, 0x00, 0x71, 0x4A, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8577, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x38, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8579, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x18, 0x12, 0x00, 0x32, 0x24, 0x00, 0x66, 0x7F, 0x80, 0x18, 0xC4, 0x00, 0x22, 0x7F, 0x00, 0x7E, 0x44, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x44, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x857A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x09, 0x00, 0x1F, 0x0F, 0x80, 0x00, 0x78, 0x00, 0x7F, 0x89, 0x00, 0x11, 0x0B, 0x00, 0x1F, 0x0E, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x0E, 0x00, 0x11, 0x0A, 0x80, 0x1F, 0x13, 0x80, 0x71, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x857B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x12, 0x00, 0x10, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x10, 0x7F, 0x80, 0x1F, 0x12, 0x00, 0x10, 0x12, 0x00, 0x7F, 0x92, 0x00, 0x10, 0x7F, 0x80, 0x32, 0x12, 0x00, 0x23, 0x33, 0x00, 0x3D, 0xA1, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x857D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x01, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x22, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x63, 0x9C, 0x00, 0x0E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x857E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x857F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x07, 0x00, 0x09, 0xFC, 0x00, 0x0A, 0x52, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0xFF, 0x00, 0x68, 0x10, 0x00, 0x49, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x1C, 0x7E, 0x00, 0x14, 0xC2, 0x00, 0x37, 0xAC, 0x00, 0x22, 0x18, 0x00, 0x61, 0xE7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8580, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFC, 0x00, 0x19, 0x24, 0x00, 0x09, 0x74, 0x00, 0x61, 0x8C, 0x00, 0x31, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x1A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x32, 0x49, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8581, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x1A, 0x00, 0x17, 0xF2, 0x00, 0x12, 0xA2, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0xA2, 0x00, 0x12, 0x92, 0x00, 0x14, 0x8A, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8584, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x10, 0x14, 0x00, 0x08, 0x12, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x08, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x88, 0x00, 0x20, 0x58, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8585, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x12, 0xBF, 0x00, 0x12, 0x80, 0x00, 0x36, 0xFF, 0x80, 0x24, 0xA5, 0x00, 0x25, 0x3A, 0x00, 0x7D, 0x61, 0x80, 0x0A, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x30, 0x42, 0x00, 0x60, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8586, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x0E, 0x00, 0x3F, 0xF9, 0x00, 0x08, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x0A, 0x46, 0x80, 0x1A, 0x0B, 0x00, 0x33, 0xF9, 0x00, 0x04, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x76, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8587, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x08, 0x42, 0x00, 0x09, 0x52, 0x00, 0x15, 0x54, 0x00, 0x25, 0x57, 0x80, 0x09, 0xF5, 0x00, 0x18, 0x19, 0x00, 0x2B, 0xF5, 0x00, 0x09, 0x25, 0x00, 0x09, 0x22, 0x00, 0x09, 0x26, 0x00, 0x09, 0x35, 0x00, 0x09, 0x49, 0x00, 0x0A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8588, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x01, 0x40, 0x00, 0x03, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x93, 0x80, 0x12, 0xA2, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8589, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x17, 0xD9, 0x00, 0x11, 0x0B, 0x00, 0x15, 0x4E, 0x00, 0x35, 0x44, 0x80, 0x21, 0x9E, 0x80, 0x63, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x858A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x01, 0x00, 0x22, 0x11, 0x00, 0x7F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x01, 0x00, 0x2A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x858B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x3C, 0xFF, 0x00, 0x01, 0x91, 0x00, 0x0C, 0x2A, 0x00, 0x38, 0x44, 0x00, 0x6F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x858C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x11, 0x00, 0x00, 0x33, 0xEF, 0x80, 0x62, 0x28, 0x80, 0x4B, 0xE9, 0x80, 0x3A, 0x2B, 0x00, 0x13, 0xEA, 0x00, 0x20, 0x09, 0x00, 0x7A, 0x68, 0x80, 0x0B, 0xC8, 0x80, 0x1A, 0x08, 0x80, 0x33, 0x2B, 0x80, 0x61, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x858F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x12, 0x41, 0x00, 0x12, 0x04, 0x80, 0x23, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8590, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x10, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x44, 0x00, 0x08, 0x87, 0x80, 0x1C, 0x20, 0x00, 0x1A, 0x7E, 0x00, 0x29, 0xC4, 0x00, 0x48, 0x38, 0x00, 0x08, 0x6E, 0x00, 0x09, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8591, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8593, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x02, 0x00, 0x0B, 0xFF, 0x80, 0x60, 0x02, 0x00, 0x33, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x02, 0xFE, 0x80, 0x08, 0x92, 0x00, 0x18, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x30, 0xC6, 0x00, 0x20, 0x38, 0x00, 0x63, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8594, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x09, 0xF2, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8597, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x8D, 0x00, 0x2E, 0xF1, 0x00, 0x20, 0x8D, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8598, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x30, 0x10, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x79, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8599, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x22, 0x00, 0x10, 0x24, 0x00, 0x3E, 0x7F, 0x80, 0x28, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x44, 0x00, 0x32, 0x44, 0x00, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x859B, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x14, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x859C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x36, 0x00, 0x10, 0x14, 0x00, 0x10, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x69, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x859D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x01, 0xFC, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x11, 0x74, 0x00, 0x1E, 0x03, 0x80, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF8, 0x00, 0x30, 0x00, 0x00, 0x23, 0xFC, 0x00, 0x62, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x859F, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x84, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x1C, 0x00, 0x1B, 0x36, 0x00, 0x70, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85A0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x2B, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x48, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x23, 0x22, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85A2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x24, 0x11, 0x00, 0x7F, 0xB1, 0x00, 0x24, 0xE7, 0x00, 0x3F, 0x80, 0x00, 0x24, 0x94, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0x84, 0x00, 0x20, 0xFF, 0x80, 0x60, 0x84, 0x00, 0x41, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85A4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x24, 0x00, 0x10, 0xE7, 0x00, 0x10, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0xE7, 0x00, 0x66, 0x24, 0x00, 0x14, 0x24, 0x00, 0x0C, 0xE7, 0x00, 0x18, 0x24, 0x00, 0x30, 0x24, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85A5, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x7F, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xF1, 0x00, 0x01, 0x23, 0x00, 0x01, 0xF2, 0x00, 0x1F, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85A6, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x04, 0x80, 0x25, 0x12, 0x80, 0x28, 0x8B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85A7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x5F, 0xFE, 0x80, 0x04, 0x20, 0x00, 0x1F, 0x23, 0x00, 0x71, 0x3E, 0x00, 0x1A, 0x20, 0x80, 0x0C, 0x21, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85A8, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x07, 0xF3, 0x80, 0x0C, 0xDC, 0x00, 0x33, 0x10, 0x80, 0x06, 0x1F, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85A9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x28, 0x14, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x28, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x88, 0x00, 0x25, 0x7F, 0x00, 0x2D, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85AA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x00, 0x1F, 0xDC, 0x00, 0x08, 0x90, 0x00, 0x05, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x11, 0x00, 0x1F, 0xD1, 0x00, 0x06, 0x11, 0x00, 0x0B, 0x11, 0x00, 0x12, 0xA1, 0x00, 0x22, 0x21, 0x00, 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85AB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x24, 0x21, 0x00, 0x42, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85AC, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x33, 0xF3, 0x00, 0x1A, 0x16, 0x00, 0x03, 0xF0, 0x00, 0x1A, 0x16, 0x00, 0x33, 0xF3, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85AD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x24, 0x00, 0x1A, 0x44, 0x00, 0x29, 0xFF, 0x80, 0x48, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85AE, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x15, 0x1F, 0x80, 0x7F, 0x92, 0x00, 0x0E, 0x32, 0x00, 0x15, 0x0A, 0x00, 0x64, 0xCA, 0x00, 0x08, 0x0E, 0x00, 0x7F, 0xC4, 0x00, 0x11, 0x0E, 0x00, 0x3A, 0x0A, 0x00, 0x0E, 0x1B, 0x00, 0x71, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85AF, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85B0, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x3C, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x4A, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x21, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85B4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2A, 0x45, 0x00, 0x1A, 0x16, 0x00, 0x33, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85B6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x62, 0x49, 0x00, 0x14, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x74, 0x49, 0x00, 0x04, 0x49, 0x00, 0x1A, 0x7F, 0x00, 0x62, 0x08, 0x00, 0x06, 0x7F, 0x00, 0x1A, 0x08, 0x00, 0x62, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85B7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85B8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x01, 0xFF, 0x00, 0x61, 0x49, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x30, 0x10, 0x00, 0x21, 0x93, 0x00, 0x63, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85B9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF4, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85BA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x13, 0x00, 0x1F, 0xAC, 0x00, 0x05, 0x4A, 0x00, 0x05, 0x4A, 0x00, 0x09, 0x4B, 0x00, 0x36, 0x5C, 0x80, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85BC, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x33, 0xDE, 0x00, 0x22, 0x10, 0x80, 0x6F, 0xCF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85BD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x0A, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x2A, 0xBE, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x32, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x2A, 0x00, 0x07, 0xA2, 0x80, 0x1C, 0x3E, 0x80, 0x70, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85BE, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x60, 0x81, 0x80, 0x2A, 0x95, 0x00, 0x24, 0x89, 0x00, 0x2A, 0x95, 0x00, 0x20, 0x81, 0x00, 0x2A, 0x95, 0x00, 0x24, 0x89, 0x00, 0x2A, 0x95, 0x00, 0x20, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85BF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x27, 0x7F, 0x00, 0x3C, 0x02, 0x00, 0x21, 0x14, 0x00, 0x1F, 0x08, 0x00, 0x20, 0x7F, 0x80, 0x3F, 0x09, 0x00, 0x44, 0x28, 0x00, 0x3F, 0xAF, 0x00, 0x0C, 0x68, 0x00, 0x1A, 0x58, 0x00, 0x31, 0x4E, 0x00, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85C1, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x27, 0xFC, 0x80, 0x24, 0x04, 0x80, 0x27, 0xFD, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xE0, 0x00, 0x06, 0x58, 0x00, 0x38, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85C2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x7F, 0xBF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1B, 0x00, 0x11, 0x0E, 0x00, 0x1F, 0x0E, 0x00, 0x11, 0xBB, 0x00, 0x1F, 0x01, 0x80, 0x70, 0x78, 0x00, 0x03, 0xC0, 0x00, 0x38, 0x83, 0x00, 0x60, 0xEE, 0x00, 0x1C, 0xB8, 0x00, 0x70, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85C7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x39, 0x0F, 0x00, 0x21, 0xE1, 0x00, 0x3D, 0x0F, 0x00, 0x21, 0xE1, 0x00, 0x20, 0x21, 0x00, 0x3D, 0x2F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1C, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85C9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x07, 0x12, 0x00, 0x1C, 0x12, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x92, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x80, 0x00, 0x0C, 0x3F, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85CA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x06, 0x00, 0x78, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x80, 0x00, 0x1A, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x49, 0xFF, 0x00, 0x09, 0xA9, 0x00, 0x0A, 0xA9, 0x00, 0x08, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85CB, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x73, 0x33, 0x00, 0x0D, 0x0D, 0x00, 0x71, 0x31, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85CD, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x88, 0x00, 0x12, 0x10, 0x00, 0x1F, 0xBF, 0x80, 0x10, 0xC0, 0x00, 0x1F, 0x80, 0x00, 0x12, 0x1F, 0x00, 0x1F, 0x80, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85CE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x11, 0x00, 0x21, 0x08, 0x80, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85CF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x25, 0xF1, 0x00, 0x3D, 0x51, 0x00, 0x25, 0xF2, 0x00, 0x05, 0x2A, 0x00, 0x3D, 0xE4, 0x00, 0x25, 0x44, 0x00, 0x25, 0xFA, 0x80, 0x28, 0x31, 0x80, 0x28, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85D0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x15, 0x10, 0x00, 0x62, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x74, 0x81, 0x00, 0x04, 0xFF, 0x00, 0x1A, 0x24, 0x00, 0x62, 0x24, 0x00, 0x06, 0x64, 0x00, 0x1A, 0x44, 0x80, 0x62, 0xC4, 0x80, 0x0D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85D3, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x22, 0x00, 0x1F, 0x14, 0x00, 0x22, 0x7F, 0x00, 0x44, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x24, 0xBE, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x07, 0x88, 0x00, 0x78, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85D5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x0E, 0xFF, 0x80, 0x0D, 0x8A, 0x80, 0x14, 0x8F, 0x80, 0x24, 0xB9, 0x80, 0x04, 0x80, 0x80, 0x04, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85D8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x17, 0xF8, 0x00, 0x10, 0x82, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x48, 0x00, 0x13, 0xF8, 0x00, 0x32, 0x48, 0x00, 0x27, 0xFB, 0x00, 0x6D, 0x05, 0x80, 0x18, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85DA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85DC, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x03, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xC9, 0x00, 0x0E, 0x91, 0x00, 0x15, 0x26, 0x00, 0x24, 0xC0, 0x00, 0x01, 0x30, 0x00, 0x06, 0x4C, 0x00, 0x3A, 0x4F, 0x80, 0x01, 0xF0, 0x00, 0x07, 0x58, 0x00, 0x38, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85DD, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x18, 0x00, 0x1F, 0x7E, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x09, 0x32, 0x00, 0x15, 0xDA, 0x80, 0x3F, 0x13, 0x80, 0x07, 0xA0, 0x00, 0x3C, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x3F, 0x00, 0x1F, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85DF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85E0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x50, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x04, 0x00, 0x10, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85E4, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x92, 0x00, 0x12, 0x54, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x46, 0x00, 0x1F, 0x99, 0x80, 0x12, 0x92, 0x00, 0x12, 0x7C, 0x00, 0x12, 0x58, 0x00, 0x22, 0x96, 0x00, 0x27, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85E5, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x28, 0x00, 0x10, 0x44, 0x00, 0x15, 0xF5, 0x00, 0x25, 0x19, 0x00, 0x19, 0xF6, 0x00, 0x17, 0x15, 0x80, 0x39, 0xFE, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85E6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x25, 0x55, 0x00, 0x25, 0x55, 0x00, 0x29, 0x0E, 0x80, 0x23, 0xF8, 0x00, 0x20, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x60, 0x20, 0x00, 0x4F, 0xFF, 0x80, 0x40, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85E8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0x9F, 0x80, 0x30, 0x00, 0x00, 0x24, 0x92, 0x00, 0x6C, 0xDB, 0x00, 0x18, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85E9, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x10, 0x1E, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x92, 0x00, 0x20, 0x54, 0x00, 0x13, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x56, 0x00, 0x09, 0x91, 0x80, 0x16, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x20, 0x92, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85EA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x0C, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x48, 0x00, 0x3F, 0xCF, 0x80, 0x12, 0x51, 0x00, 0x1F, 0xF1, 0x00, 0x12, 0x51, 0x00, 0x1F, 0xCA, 0x00, 0x02, 0x0A, 0x00, 0x3F, 0xE4, 0x00, 0x08, 0x8A, 0x00, 0x19, 0x0A, 0x00, 0x07, 0x11, 0x00, 0x38, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85ED, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x0C, 0x1F, 0x80, 0x72, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x81, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA0, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x81, 0x00, 0x7F, 0x81, 0x00, 0x08, 0x83, 0x00, 0x73, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85F3, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x48, 0x04, 0x80, 0x4F, 0xFC, 0x80, 0x00, 0x03, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85F6, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x2F, 0xDF, 0x00, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x23, 0x8E, 0x00, 0x25, 0x55, 0x00, 0x29, 0x04, 0x80, 0x60, 0x20, 0x00, 0x42, 0x3F, 0x00, 0x42, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85F7, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x80, 0x00, 0x7F, 0x00, 0x3F, 0x0A, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x0A, 0x00, 0x00, 0x11, 0x00, 0x1E, 0x7F, 0x00, 0x01, 0xA1, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85F9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x7F, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0xC8, 0x80, 0x3E, 0x5C, 0x80, 0x22, 0x63, 0x80, 0x22, 0x7D, 0x00, 0x3E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85FA, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x11, 0x21, 0x00, 0x13, 0xF9, 0x00, 0x16, 0x41, 0x00, 0x1B, 0xF9, 0x00, 0x12, 0x41, 0x00, 0x13, 0xF9, 0x00, 0x13, 0xFD, 0x00, 0x12, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x85FB, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x7C, 0x00, 0x20, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x21, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x09, 0xEF, 0x00, 0x08, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x21, 0x92, 0x00, 0x26, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85FC, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x89, 0x00, 0x2F, 0xF1, 0x00, 0x00, 0x84, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x0A, 0x43, 0x00, 0x32, 0x29, 0x80, 0x61, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85FE, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x09, 0x00, 0x08, 0x3B, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x3F, 0x00, 0x49, 0x21, 0x00, 0x7F, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x1C, 0x3F, 0x00, 0x1A, 0x21, 0x00, 0x29, 0x3F, 0x00, 0x48, 0x12, 0x00, 0x08, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x85FF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8600, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x1C, 0x44, 0x00, 0x71, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8602, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x01, 0x21, 0x00, 0x09, 0x04, 0x80, 0x11, 0xFC, 0x80, 0x22, 0x08, 0x00, 0x05, 0x35, 0x00, 0x14, 0x52, 0x80, 0x27, 0xDE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8604, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x00, 0x01, 0x80, 0x7B, 0xC7, 0x00, 0x4A, 0x5C, 0x00, 0x7B, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x32, 0x00, 0x7F, 0xA2, 0x00, 0x04, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8605, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x19, 0xEF, 0x00, 0x13, 0x20, 0x00, 0x36, 0x40, 0x00, 0x6B, 0xEF, 0x80, 0x1A, 0xA2, 0x00, 0x13, 0xE2, 0x00, 0x32, 0xA2, 0x00, 0x73, 0xE2, 0x00, 0x10, 0x82, 0x00, 0x17, 0xF2, 0x00, 0x11, 0x42, 0x00, 0x13, 0x62, 0x00, 0x16, 0x36, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8606, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBD, 0x00, 0x1F, 0xC1, 0x00, 0x10, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8607, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x08, 0x00, 0x04, 0x00, 0x00, 0x0F, 0x83, 0x00, 0x11, 0x1C, 0x00, 0x22, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x7F, 0x80, 0x1F, 0xCC, 0x00, 0x12, 0x4E, 0x00, 0x1F, 0xD6, 0x00, 0x10, 0x55, 0x00, 0x01, 0x65, 0x00, 0x15, 0x44, 0x80, 0x25, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x860A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x24, 0x49, 0x00, 0x18, 0x55, 0x00, 0x12, 0x63, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x860B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x00, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x28, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x1B, 0x41, 0x00, 0x06, 0x7F, 0x00, 0x0C, 0x22, 0x00, 0x18, 0x63, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x860D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xC8, 0x00, 0x24, 0xBF, 0x80, 0x35, 0x88, 0x80, 0x2E, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x18, 0x80, 0x7F, 0xD1, 0x80, 0x2A, 0xB1, 0x00, 0x4A, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x860E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x00, 0x80, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x80, 0x46, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8610, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x07, 0x00, 0x3D, 0xFC, 0x00, 0x00, 0x52, 0x00, 0x7E, 0x89, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x20, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0xC2, 0x00, 0x25, 0xAC, 0x00, 0x24, 0x18, 0x00, 0x3D, 0xE7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8611, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x25, 0x05, 0x00, 0x25, 0x55, 0x00, 0x29, 0x55, 0x80, 0x20, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x60, 0x80, 0x00, 0x43, 0xFF, 0x00, 0x4E, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8612, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x3E, 0x00, 0x78, 0x44, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x52, 0x00, 0x7E, 0x7E, 0x00, 0x08, 0x52, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x48, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x80, 0x08, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8613, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x40, 0x00, 0x0E, 0x7C, 0x00, 0x78, 0xC4, 0x00, 0x09, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x08, 0xA5, 0x00, 0x09, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8616, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x11, 0x00, 0x1F, 0x0A, 0x00, 0x10, 0x7F, 0x80, 0x1F, 0x04, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8617, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x7F, 0x80, 0x11, 0x11, 0x00, 0x1F, 0x0A, 0x00, 0x10, 0x3F, 0x00, 0x2F, 0x04, 0x00, 0x29, 0x7F, 0x80, 0x0F, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8618, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x0F, 0x3C, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0x22, 0x00, 0x74, 0x34, 0x00, 0x07, 0x9E, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8619, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x3F, 0xDE, 0x00, 0x28, 0x13, 0x80, 0x2F, 0xA0, 0x00, 0x32, 0x1F, 0x00, 0x2F, 0x89, 0x00, 0x25, 0x06, 0x00, 0x3F, 0xD9, 0x80, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x09, 0x00, 0x35, 0x35, 0x00, 0x09, 0x09, 0x00, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x861A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x00, 0x00, 0x07, 0x91, 0x00, 0x09, 0x0A, 0x00, 0x12, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x14, 0x84, 0x00, 0x14, 0x9F, 0x00, 0x1F, 0x84, 0x00, 0x14, 0x84, 0x00, 0x1F, 0xBF, 0x80, 0x00, 0x44, 0x00, 0x15, 0x44, 0x00, 0x25, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x861B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x11, 0x04, 0x00, 0x7F, 0xBF, 0x80, 0x11, 0x08, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x00, 0x80, 0x11, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x2A, 0x1F, 0x00, 0x2A, 0x11, 0x00, 0x33, 0x9F, 0x00, 0x20, 0x11, 0x00, 0x3F, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x861E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x1B, 0x08, 0x00, 0x31, 0x8F, 0x80, 0x6E, 0xD9, 0x00, 0x00, 0x11, 0x00, 0x3B, 0xB3, 0x00, 0x2A, 0x8A, 0x00, 0x3B, 0x8E, 0x00, 0x00, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x3B, 0x9B, 0x00, 0x6A, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8621, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0x90, 0x00, 0x00, 0xFC, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8622, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x80, 0x13, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8627, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x18, 0x00, 0x30, 0x1F, 0x00, 0x18, 0x10, 0x00, 0x69, 0xFF, 0x80, 0x31, 0x10, 0x80, 0x11, 0x7C, 0x00, 0x01, 0x11, 0x00, 0x79, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x09, 0x3D, 0x00, 0x0A, 0xD6, 0x00, 0x18, 0x25, 0x80, 0x34, 0xCC, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8629, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x3F, 0xD0, 0x00, 0x60, 0x3F, 0x80, 0x1F, 0x62, 0x00, 0x15, 0x16, 0x00, 0x7F, 0xCC, 0x00, 0x29, 0x16, 0x00, 0x3F, 0xE1, 0x80, 0x05, 0x10, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x862D, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x51, 0x00, 0x1F, 0x5F, 0x00, 0x17, 0xFD, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFD, 0x00, 0x15, 0x55, 0x00, 0x17, 0xFD, 0x00, 0x10, 0xE1, 0x00, 0x11, 0x59, 0x00, 0x16, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x862F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x30, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x60, 0xFC, 0x00, 0x30, 0x84, 0x00, 0x07, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x31, 0xFF, 0x00, 0x22, 0x49, 0x00, 0x60, 0x93, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8630, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x3E, 0x00, 0x18, 0x22, 0x00, 0x32, 0x3E, 0x00, 0x16, 0x22, 0x00, 0x0C, 0x7F, 0x00, 0x19, 0x55, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x2A, 0x21, 0x00, 0x6B, 0x12, 0x00, 0x49, 0x0C, 0x00, 0x08, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8636, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x49, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x7F, 0xAA, 0x80, 0x22, 0x2F, 0x80, 0x3C, 0x68, 0x00, 0x16, 0x48, 0x80, 0x62, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8638, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x7F, 0x22, 0x00, 0x14, 0x24, 0x00, 0x7F, 0x7F, 0x80, 0x55, 0xC8, 0x00, 0x67, 0x7F, 0x00, 0x41, 0x48, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x48, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x863A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x12, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x24, 0x00, 0x55, 0x7F, 0x80, 0x49, 0xA4, 0x00, 0x55, 0x24, 0x00, 0x7F, 0x3F, 0x00, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x51, 0x3F, 0x00, 0x57, 0x24, 0x00, 0x79, 0x24, 0x00, 0x43, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x863C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x25, 0x55, 0x00, 0x25, 0x55, 0x00, 0x29, 0x05, 0x80, 0x20, 0x90, 0x00, 0x2F, 0x9F, 0x00, 0x20, 0x90, 0x00, 0x6F, 0x9F, 0x00, 0x40, 0x90, 0x00, 0x5F, 0x9F, 0x80, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x863D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x15, 0x00, 0x3E, 0x1F, 0x00, 0x2A, 0x15, 0x00, 0x3E, 0x9F, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0x8C, 0x00, 0x78, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x863F, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x0A, 0x48, 0x00, 0x32, 0xFF, 0x00, 0x15, 0x48, 0x00, 0x0B, 0x7F, 0x00, 0x3D, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8640, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3D, 0x5F, 0x00, 0x14, 0x92, 0x00, 0x6C, 0x99, 0x80, 0x01, 0x20, 0x00, 0x3F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8641, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7E, 0x1F, 0x80, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x09, 0xEF, 0x00, 0x2F, 0x29, 0x00, 0x29, 0xEF, 0x00, 0x2F, 0x28, 0x80, 0x79, 0xE7, 0x80, 0x06, 0x18, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x7A, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x7E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8642, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x00, 0x90, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0xE2, 0x00, 0x3E, 0x1C, 0x00, 0x08, 0xE3, 0x80, 0x2E, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8646, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x15, 0x00, 0x3E, 0x9F, 0x00, 0x2B, 0x35, 0x00, 0x3E, 0x5F, 0x00, 0x02, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x04, 0x88, 0x00, 0x38, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x864D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x80, 0x10, 0x81, 0x00, 0x10, 0x80, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x30, 0x80, 0x00, 0x20, 0x80, 0x80, 0x60, 0xC1, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x864E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x81, 0x00, 0x10, 0xFA, 0x00, 0x1F, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x22, 0x1F, 0x80, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x864F, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFA, 0x00, 0x17, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x80, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x41, 0x14, 0x00, 0x0E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8650, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x81, 0x00, 0x10, 0xFE, 0x00, 0x1F, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8651, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x10, 0xFA, 0x00, 0x17, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x10, 0x40, 0x00, 0x15, 0x24, 0x00, 0x25, 0x23, 0x00, 0x29, 0x09, 0x00, 0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8652, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3F, 0xF8, 0x00, 0x20, 0x40, 0x00, 0x20, 0x7E, 0x00, 0x20, 0x40, 0x00, 0x2F, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x28, 0xFD, 0x00, 0x2B, 0x81, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x28, 0x90, 0x00, 0x28, 0x90, 0x00, 0x28, 0x90, 0x80, 0x69, 0x99, 0x80, 0x17, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8653, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x0F, 0x00, 0x10, 0x08, 0x00, 0x7E, 0x7F, 0x80, 0x12, 0x40, 0x80, 0x12, 0x48, 0x00, 0x12, 0x4F, 0x00, 0x12, 0x78, 0x00, 0x12, 0x48, 0x80, 0x12, 0x47, 0x80, 0x12, 0x40, 0x00, 0x12, 0x52, 0x00, 0x13, 0xD2, 0x00, 0x36, 0x52, 0x80, 0x20, 0x92, 0x80, 0x60, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8654, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x10, 0xFE, 0x00, 0x1F, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x04, 0x00, 0x11, 0x08, 0x00, 0x10, 0xD0, 0x00, 0x20, 0x60, 0x00, 0x21, 0x9C, 0x00, 0x2E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8655, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x1F, 0x80, 0x80, 0x10, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x17, 0xBC, 0x00, 0x14, 0xA4, 0x00, 0x19, 0x24, 0x80, 0x16, 0x47, 0x80, 0x26, 0x80, 0x00, 0x29, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8656, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFD, 0x00, 0x17, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3E, 0x00, 0x13, 0xE4, 0x00, 0x11, 0x28, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x60, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8657, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFD, 0x00, 0x17, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x10, 0x38, 0x00, 0x13, 0xC0, 0x00, 0x12, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x22, 0x08, 0x00, 0x62, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8658, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFD, 0x00, 0x17, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x62, 0x02, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8659, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFD, 0x00, 0x17, 0x80, 0x00, 0x10, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x20, 0x00, 0x10, 0xB0, 0x00, 0x12, 0x93, 0x00, 0x36, 0x89, 0x80, 0x2C, 0xB2, 0x80, 0x61, 0xE6, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x865A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFD, 0x00, 0x17, 0x80, 0x00, 0x10, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x10, 0x88, 0x00, 0x14, 0x89, 0x00, 0x36, 0x8B, 0x00, 0x22, 0x8A, 0x00, 0x60, 0x88, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x865B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x81, 0x00, 0x10, 0xFE, 0x00, 0x1F, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x17, 0x9E, 0x00, 0x10, 0x90, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x865C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBD, 0x00, 0x1F, 0xC0, 0x80, 0x10, 0x7F, 0x80, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x20, 0xC1, 0x00, 0x27, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x865D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xAA, 0x80, 0x24, 0x6A, 0x80, 0x27, 0x4A, 0x80, 0x3C, 0x5A, 0x80, 0x24, 0x96, 0x80, 0x23, 0xB4, 0x80, 0x20, 0x2D, 0x80, 0x29, 0x09, 0x00, 0x29, 0x01, 0x00, 0x29, 0x07, 0x80, 0x49, 0x80, 0x80, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x865E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBD, 0x00, 0x1F, 0xE1, 0x00, 0x10, 0xFF, 0x00, 0x11, 0xFE, 0x00, 0x15, 0x02, 0x00, 0x15, 0xFE, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x20, 0x50, 0x00, 0x21, 0x8C, 0x00, 0x2E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x865F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x91, 0x00, 0x3E, 0x9E, 0x00, 0x00, 0xF0, 0x80, 0x3F, 0x9F, 0x80, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x3E, 0x9E, 0x00, 0x22, 0x92, 0x00, 0x02, 0x92, 0x00, 0x02, 0x92, 0x80, 0x05, 0x23, 0x80, 0x3A, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8660, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x40, 0x80, 0x33, 0x48, 0x00, 0x61, 0xCF, 0x00, 0x12, 0x78, 0x00, 0x12, 0x48, 0x80, 0x0C, 0x47, 0x80, 0x04, 0x40, 0x00, 0x0C, 0x52, 0x00, 0x1A, 0x52, 0x00, 0x13, 0x52, 0x80, 0x31, 0x92, 0x80, 0x60, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8661, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x10, 0xFD, 0x00, 0x17, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x88, 0x00, 0x14, 0x89, 0x00, 0x14, 0x89, 0x00, 0x17, 0x8F, 0x00, 0x30, 0x88, 0x00, 0x2F, 0xFF, 0x80, 0x61, 0x04, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8662, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x0E, 0x0F, 0x00, 0x78, 0x08, 0x00, 0x02, 0x7F, 0x80, 0x2B, 0x40, 0x80, 0x6D, 0x48, 0x00, 0x44, 0x4F, 0x00, 0x02, 0x78, 0x00, 0x7F, 0xC8, 0x80, 0x02, 0x47, 0x80, 0x22, 0x40, 0x00, 0x32, 0x52, 0x00, 0x12, 0x52, 0x00, 0x02, 0x52, 0x80, 0x02, 0x92, 0x80, 0x0E, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8663, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3A, 0x8F, 0x00, 0x02, 0x88, 0x00, 0x02, 0x7F, 0x80, 0x7F, 0xC0, 0x80, 0x02, 0x48, 0x00, 0x0A, 0x4F, 0x00, 0x2A, 0x78, 0x00, 0x2E, 0x48, 0x80, 0x2A, 0x47, 0x80, 0x2A, 0x40, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x3E, 0xD2, 0x80, 0x62, 0x92, 0x80, 0x01, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8664, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x07, 0x0F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x24, 0x48, 0x00, 0x27, 0x4F, 0x00, 0x3C, 0x78, 0x00, 0x24, 0x48, 0x80, 0x23, 0xC7, 0x80, 0x20, 0x40, 0x00, 0x29, 0x52, 0x00, 0x29, 0x52, 0x00, 0x29, 0xD2, 0x80, 0x48, 0x52, 0x80, 0x10, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8667, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0xE8, 0x00, 0x24, 0x48, 0x00, 0x27, 0xBF, 0x80, 0x3C, 0x48, 0x00, 0x27, 0xD0, 0x00, 0x25, 0x1F, 0x80, 0x2F, 0xD0, 0x80, 0x39, 0x00, 0x80, 0x2F, 0xC0, 0x80, 0x2F, 0xC0, 0x80, 0x29, 0x01, 0x00, 0x2F, 0xC1, 0x00, 0x28, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8669, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x15, 0x0F, 0x00, 0x35, 0x88, 0x00, 0x64, 0xFF, 0x80, 0x04, 0x20, 0x80, 0x3F, 0xA8, 0x00, 0x20, 0xAF, 0x00, 0x3F, 0xB8, 0x00, 0x20, 0xA8, 0x80, 0x3F, 0xA7, 0x80, 0x04, 0x20, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x35, 0xAA, 0x80, 0x64, 0xCA, 0x80, 0x1C, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x866B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0xFE, 0x00, 0x07, 0x83, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x866C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0x20, 0x80, 0x39, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x866E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7C, 0x00, 0x0A, 0x48, 0x00, 0x3F, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x28, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0E, 0x89, 0x00, 0x72, 0x89, 0x00, 0x21, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x866F, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x1F, 0x00, 0x05, 0x71, 0x00, 0x05, 0x01, 0x00, 0x07, 0x81, 0x00, 0x1C, 0x81, 0x00, 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8671, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x74, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x04, 0x00, 0x1F, 0xF4, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x1F, 0xF4, 0x00, 0x01, 0x04, 0x00, 0x01, 0x26, 0x00, 0x03, 0xF2, 0x80, 0x3E, 0x1B, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8675, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7F, 0x4B, 0x00, 0x49, 0x4D, 0x00, 0x49, 0x59, 0x00, 0x49, 0x69, 0x00, 0x49, 0xC9, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x4B, 0x00, 0x0A, 0x48, 0x00, 0x0A, 0x40, 0x00, 0x0F, 0x40, 0x80, 0x39, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8676, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x39, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8677, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x39, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8679, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x39, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x867A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x71, 0x00, 0x32, 0x00, 0x80, 0x23, 0x00, 0x80, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x867B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0F, 0xB0, 0x00, 0x78, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x867C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x0A, 0xFE, 0x00, 0x3F, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x28, 0x20, 0x00, 0x0A, 0x40, 0x00, 0x0E, 0x81, 0x00, 0x72, 0x81, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x867D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x867E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x28, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x79, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x867F, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x18, 0xA8, 0x00, 0x60, 0x94, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8680, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x12, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x92, 0x00, 0x24, 0x92, 0x00, 0x20, 0x92, 0x00, 0x50, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x12, 0x10, 0x00, 0x14, 0x12, 0x00, 0x18, 0x1F, 0x00, 0x11, 0xE1, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8681, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x32, 0x00, 0x09, 0x12, 0x00, 0x3F, 0x02, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x48, 0x00, 0x3E, 0x50, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x50, 0x00, 0x0E, 0x48, 0x00, 0x7A, 0x84, 0x00, 0x21, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8682, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x15, 0x7F, 0x00, 0x1F, 0x01, 0x00, 0x04, 0x09, 0x00, 0x05, 0xFD, 0x00, 0x07, 0x01, 0x00, 0x39, 0x01, 0x00, 0x10, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8688, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF7, 0x80, 0x10, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x72, 0x00, 0x53, 0xCF, 0x80, 0x7E, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x3E, 0xC2, 0x00, 0x62, 0x82, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x868A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x41, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x14, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x31, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x868B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x55, 0x39, 0x00, 0x55, 0x29, 0x00, 0x55, 0x29, 0x00, 0x7D, 0x6D, 0x00, 0x11, 0x45, 0x00, 0x15, 0x01, 0x00, 0x15, 0x01, 0x00, 0x3D, 0x01, 0x00, 0x65, 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x868C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x0F, 0x80, 0x2A, 0xF8, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x0F, 0x08, 0x00, 0x39, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x868D, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x7E, 0x89, 0x00, 0x52, 0x8B, 0x00, 0x52, 0xEE, 0x00, 0x52, 0x88, 0x00, 0x52, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x14, 0x88, 0x00, 0x14, 0x88, 0x00, 0x3E, 0x88, 0x80, 0x62, 0xE9, 0x80, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8691, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x52, 0xFE, 0x00, 0x52, 0x42, 0x00, 0x7E, 0x46, 0x00, 0x10, 0x6C, 0x00, 0x10, 0x38, 0x00, 0x14, 0x10, 0x00, 0x14, 0x38, 0x00, 0x3E, 0x6C, 0x00, 0x62, 0xC6, 0x00, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8693, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x08, 0x79, 0x00, 0x08, 0x09, 0x00, 0x3E, 0x09, 0x00, 0x2A, 0x79, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0xF9, 0x00, 0x3E, 0x89, 0x00, 0x08, 0x09, 0x00, 0x08, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0F, 0x09, 0x00, 0x38, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8695, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x06, 0x18, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x03, 0xFF, 0x80, 0x7E, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8696, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x64, 0x00, 0x3E, 0x44, 0x80, 0x62, 0xC4, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8698, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x13, 0x00, 0x10, 0x11, 0x00, 0x7E, 0x10, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x7E, 0x38, 0x00, 0x10, 0x28, 0x00, 0x10, 0x28, 0x00, 0x14, 0x28, 0x00, 0x14, 0x68, 0x00, 0x3E, 0x48, 0x80, 0x62, 0xC9, 0x80, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x869A, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x10, 0x78, 0x00, 0x7E, 0x40, 0x00, 0x52, 0x40, 0x00, 0x52, 0x7F, 0x80, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0xC2, 0x00, 0x3E, 0x82, 0x00, 0x62, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x869C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x53, 0xFF, 0x80, 0x7E, 0x12, 0x00, 0x10, 0x12, 0x00, 0x10, 0x12, 0x00, 0x14, 0x32, 0x00, 0x14, 0x22, 0x00, 0x1E, 0x62, 0x00, 0x32, 0xC2, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x869D, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x09, 0xF0, 0x00, 0x0A, 0x20, 0x00, 0x3F, 0x24, 0x00, 0x2A, 0x3E, 0x00, 0x2B, 0xE0, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x22, 0x00, 0x3E, 0x3F, 0x00, 0x29, 0xE0, 0x00, 0x0A, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x72, 0x21, 0x00, 0x20, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86A1, { 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x04, 0x00, 0x10, 0x24, 0x00, 0x7E, 0x66, 0x00, 0x52, 0x42, 0x00, 0x52, 0xC3, 0x00, 0x53, 0x81, 0x80, 0x52, 0x7E, 0x00, 0x7E, 0x12, 0x00, 0x10, 0x12, 0x00, 0x10, 0x32, 0x00, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x3E, 0x66, 0x00, 0x62, 0xC4, 0x00, 0x01, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86A3, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x88, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x21, 0x00, 0x0F, 0x4F, 0x00, 0x39, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0x22, 0x00, 0x08, 0x94, 0x00, 0x04, 0x48, 0x00, 0x00, 0x70, 0x00, 0x03, 0x8C, 0x00, 0x3C, 0x43, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86A6, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x52, 0x42, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x62, 0x42, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86A7, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x28, 0x00, 0x7E, 0x6C, 0x00, 0x52, 0x46, 0x00, 0x52, 0x83, 0x00, 0x53, 0x45, 0x80, 0x52, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x62, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86A8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0x36, 0x00, 0x0F, 0x22, 0x00, 0x39, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86A9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x02, 0x02, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xC0, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86AA, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x32, 0x00, 0x08, 0x1A, 0x00, 0x7F, 0x0A, 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x00, 0x49, 0x62, 0x00, 0x49, 0x32, 0x00, 0x7F, 0x12, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x03, 0x80, 0x0A, 0x1E, 0x00, 0x0F, 0x72, 0x00, 0x39, 0x02, 0x00, 0x60, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86AB, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x7E, 0xC1, 0x00, 0x52, 0x81, 0x00, 0x52, 0xF9, 0x00, 0x53, 0xC9, 0x00, 0x52, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x10, 0x7B, 0x00, 0x10, 0x42, 0x00, 0x14, 0x4E, 0x00, 0x14, 0x40, 0x00, 0x1E, 0x40, 0x80, 0x72, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86AC, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x28, 0xD4, 0x00, 0x0A, 0x50, 0x00, 0x0E, 0x50, 0x00, 0x72, 0x91, 0x00, 0x21, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86AD, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x52, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x40, 0x00, 0x52, 0x50, 0x00, 0x7E, 0x53, 0x00, 0x10, 0x56, 0x00, 0x10, 0x5C, 0x00, 0x14, 0x50, 0x00, 0x14, 0xD0, 0x00, 0x3E, 0x90, 0x80, 0x63, 0x99, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86AF, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x38, 0x00, 0x7F, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x3F, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x39, 0x22, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86B0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x49, 0x00, 0x49, 0x49, 0x00, 0x49, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0F, 0x49, 0x00, 0x39, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x49, 0x50, 0x00, 0x49, 0xD0, 0x00, 0x49, 0x10, 0x00, 0x49, 0x1F, 0x00, 0x49, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x1F, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x39, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B3, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x10, 0x7C, 0x00, 0x7E, 0x44, 0x00, 0x52, 0x44, 0x00, 0x52, 0x44, 0x00, 0x52, 0x7F, 0x80, 0x52, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x14, 0x76, 0x00, 0x14, 0xC2, 0x00, 0x3E, 0x02, 0x80, 0x62, 0xFB, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B4, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x7D, 0x84, 0x00, 0x55, 0x2F, 0x80, 0x57, 0x24, 0x80, 0x55, 0xA4, 0x80, 0x54, 0xC4, 0x80, 0x54, 0x44, 0x80, 0x7C, 0x84, 0x80, 0x10, 0xAC, 0x80, 0x15, 0x28, 0x80, 0x15, 0xE8, 0x80, 0x3C, 0x29, 0x80, 0x64, 0x19, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x49, 0x7A, 0x00, 0x49, 0x4A, 0x00, 0x49, 0x4A, 0x00, 0x49, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x7A, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0F, 0x02, 0x00, 0x39, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B6, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x39, 0x22, 0x00, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x3F, 0x00, 0x49, 0x21, 0x00, 0x49, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x39, 0x7F, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B8, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x10, 0x78, 0x00, 0x7E, 0x40, 0x00, 0x52, 0x40, 0x00, 0x52, 0x7F, 0x80, 0x52, 0x44, 0x00, 0x52, 0x44, 0x00, 0x52, 0x5C, 0x00, 0x7E, 0x47, 0x00, 0x10, 0x45, 0x80, 0x14, 0x44, 0x00, 0x14, 0xC4, 0x00, 0x3E, 0x84, 0x00, 0x62, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86B9, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x7C, 0xC2, 0x00, 0x54, 0xBF, 0x80, 0x54, 0x82, 0x00, 0x55, 0x82, 0x00, 0x56, 0x92, 0x00, 0x54, 0x9A, 0x00, 0x7C, 0x8A, 0x00, 0x10, 0x82, 0x00, 0x14, 0x82, 0x00, 0x14, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x64, 0x82, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86BA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0A, 0xFF, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x28, 0x92, 0x00, 0x0B, 0xFF, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86BF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x49, 0x08, 0x00, 0x49, 0x18, 0x00, 0x49, 0x10, 0x00, 0x49, 0x32, 0x00, 0x7F, 0x66, 0x00, 0x08, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x19, 0x00, 0x0F, 0x31, 0x00, 0x39, 0x27, 0x80, 0x60, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86C0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x62, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86C1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x21, 0x00, 0x7E, 0x21, 0x00, 0x52, 0x61, 0x00, 0x52, 0x43, 0x00, 0x52, 0xC2, 0x00, 0x52, 0x8E, 0x00, 0x7E, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x62, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86C3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0x91, 0x00, 0x52, 0xB9, 0x00, 0x7E, 0xA9, 0x00, 0x10, 0xAD, 0x00, 0x10, 0xC5, 0x00, 0x14, 0x81, 0x00, 0x14, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x62, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86C4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86C5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x0F, 0x80, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86C6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x39, 0x22, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86C7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x3E, 0x21, 0x80, 0x2A, 0x26, 0x00, 0x08, 0x38, 0x00, 0x0A, 0x20, 0x00, 0x09, 0x20, 0x80, 0x0F, 0xA0, 0x80, 0x38, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86C9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x49, 0xC1, 0x80, 0x49, 0x3E, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x0F, 0x11, 0x00, 0x39, 0x17, 0x00, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86CA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xFC, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x02, 0x40, 0x00, 0x02, 0x7E, 0x00, 0x06, 0x40, 0x00, 0x09, 0xFF, 0x80, 0x30, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x80, 0x1F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86CD, { 0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0x30, 0xC3, 0x00, 0x18, 0x46, 0x00, 0x08, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x40, 0x80, 0x80, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x07, 0xFF, 0x00, 0x7C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86CE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x54, 0xFF, 0x80, 0x54, 0x90, 0x00, 0x54, 0x90, 0x00, 0x54, 0x9F, 0x00, 0x7C, 0x91, 0x00, 0x10, 0x91, 0x00, 0x14, 0x91, 0x00, 0x1D, 0x91, 0x00, 0x35, 0x31, 0x00, 0x63, 0x23, 0x00, 0x06, 0x62, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86CF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x44, 0x00, 0x3F, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x47, 0x00, 0x2B, 0x92, 0x00, 0x3E, 0x10, 0x00, 0x28, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x12, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86D0, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x0A, 0x2A, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xFE, 0x00, 0x28, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0E, 0xAA, 0x00, 0x72, 0xAA, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86D1, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x10, 0x64, 0x00, 0x7E, 0x4E, 0x00, 0x52, 0xFB, 0x00, 0x52, 0x00, 0x00, 0x52, 0x08, 0x00, 0x52, 0x48, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0xC8, 0x00, 0x10, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x62, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86D2, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x7E, 0x00, 0x7E, 0xC6, 0x00, 0x53, 0xAC, 0x00, 0x52, 0x18, 0x00, 0x52, 0x30, 0x00, 0x52, 0x6C, 0x00, 0x7F, 0xC7, 0x80, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x62, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86D4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x3E, 0xA2, 0x80, 0x2A, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x0A, 0x80, 0x80, 0x0F, 0x80, 0x80, 0x38, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86D5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x52, 0x20, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x41, 0x00, 0x52, 0xC1, 0x00, 0x7F, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x62, 0x41, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86D7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86D8, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x46, 0x00, 0x08, 0x28, 0x00, 0x08, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x29, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86D9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x31, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86DA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x11, 0xF8, 0x80, 0x10, 0x40, 0x80, 0x7E, 0x44, 0x80, 0x52, 0x44, 0x80, 0x52, 0xF4, 0x80, 0x52, 0x94, 0x80, 0x52, 0x94, 0x80, 0x7F, 0xD4, 0x80, 0x10, 0x74, 0x80, 0x10, 0x10, 0x80, 0x14, 0x10, 0x80, 0x14, 0x30, 0x80, 0x3E, 0x20, 0x80, 0x62, 0x60, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86DB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x1C, 0x00, 0x08, 0x1C, 0x00, 0x0A, 0x2A, 0x00, 0x0E, 0x2A, 0x00, 0x39, 0x29, 0x00, 0x00, 0x49, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86DC, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x7C, 0xC9, 0x00, 0x54, 0x89, 0x00, 0x54, 0xFF, 0x80, 0x55, 0x89, 0x00, 0x56, 0x89, 0x00, 0x54, 0x89, 0x00, 0x7C, 0xBF, 0x00, 0x10, 0x88, 0x00, 0x14, 0x88, 0x00, 0x14, 0x98, 0x00, 0x3C, 0x90, 0x00, 0x64, 0xB0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86DE, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86DF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0xA2, 0x80, 0x2A, 0x22, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x00, 0x0A, 0x08, 0x00, 0x0E, 0x14, 0x00, 0x31, 0x62, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86E0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x7C, 0x22, 0x00, 0x54, 0x62, 0x00, 0x54, 0xC6, 0x00, 0x55, 0x8C, 0x00, 0x54, 0x00, 0x00, 0x54, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0xA4, 0x80, 0x14, 0xA4, 0x80, 0x14, 0xA4, 0x80, 0x3D, 0xAC, 0x80, 0x65, 0x29, 0x80, 0x03, 0x7B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86E3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86E4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x42, 0x00, 0x2B, 0x81, 0x80, 0x2A, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0x42, 0x00, 0x0F, 0xC2, 0x00, 0x38, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86E5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x31, 0x00, 0x7F, 0x63, 0x00, 0x49, 0xD6, 0x00, 0x49, 0x0C, 0x00, 0x49, 0x18, 0x00, 0x49, 0x74, 0x00, 0x7F, 0x0F, 0x80, 0x08, 0x18, 0x80, 0x08, 0x31, 0x80, 0x0A, 0xED, 0x00, 0x0A, 0x03, 0x00, 0x0F, 0x06, 0x00, 0x39, 0x1C, 0x00, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86E7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7D, 0xFE, 0x80, 0x55, 0x12, 0x80, 0x55, 0x52, 0x80, 0x55, 0x52, 0x80, 0x55, 0x5A, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x34, 0x80, 0x11, 0x4A, 0x80, 0x15, 0x49, 0x80, 0x15, 0x90, 0x80, 0x3D, 0x00, 0x80, 0x65, 0x00, 0x80, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0xE4, 0x00, 0x08, 0xB4, 0x00, 0x0E, 0x94, 0x80, 0x39, 0x84, 0x80, 0x63, 0x03, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86EC, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x68, 0x85, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x00, 0xFE, 0x00, 0x3F, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86ED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x8F, 0x00, 0x3F, 0xF0, 0x80, 0x2A, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x31, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86EE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x12, 0x12, 0x00, 0x36, 0x13, 0x00, 0x6C, 0x11, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x00, 0x7E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86EF, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x12, 0x00, 0x49, 0x12, 0x00, 0x49, 0x14, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x08, 0x00, 0x7F, 0x18, 0x00, 0x08, 0x33, 0x00, 0x08, 0x7E, 0x00, 0x0A, 0xD0, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x80, 0x39, 0x19, 0x80, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F0, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x7F, 0xFE, 0x00, 0x04, 0x24, 0x00, 0x07, 0x64, 0x00, 0x3C, 0x24, 0x00, 0x04, 0x35, 0x00, 0x14, 0xC5, 0x00, 0x08, 0x83, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x0A, 0xFE, 0x00, 0x3F, 0x10, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x56, 0x00, 0x2A, 0x58, 0x00, 0x2A, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x0E, 0x48, 0x00, 0x72, 0x44, 0x00, 0x20, 0x83, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F2, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x2E, 0x00, 0x0A, 0xF0, 0x00, 0x3F, 0x28, 0x00, 0x2A, 0x11, 0x00, 0x2A, 0x69, 0x00, 0x2B, 0x87, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x28, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0E, 0x49, 0x00, 0x72, 0x49, 0x00, 0x20, 0x87, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F3, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x11, 0x5F, 0x00, 0x15, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x55, 0x5F, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x7D, 0x55, 0x00, 0x51, 0x55, 0x00, 0x15, 0x55, 0x00, 0x1C, 0x57, 0x00, 0x64, 0x84, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0A, 0xFF, 0x00, 0x3F, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x6C, 0x00, 0x2B, 0x83, 0x00, 0x3E, 0x44, 0x00, 0x28, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x72, 0x44, 0x00, 0x20, 0x84, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x80, 0x08, 0xC9, 0x80, 0x7F, 0x49, 0x00, 0x49, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x71, 0x41, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86F9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x7C, 0x64, 0x00, 0x54, 0x18, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x65, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86FA, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x52, 0x49, 0x00, 0x52, 0x49, 0x00, 0x52, 0x49, 0x00, 0x52, 0xAA, 0x80, 0x7E, 0xAA, 0x80, 0x10, 0x1C, 0x00, 0x10, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x36, 0x00, 0x3E, 0x22, 0x00, 0x62, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86FB, { 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x04, 0x00, 0x10, 0x66, 0x00, 0x7C, 0xC3, 0x00, 0x55, 0x81, 0x80, 0x54, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x7C, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x1E, 0x64, 0x80, 0x72, 0x44, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86FC, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0x91, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x62, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x86FD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0F, 0x7F, 0x00, 0x39, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x86FE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x3A, 0x00, 0x08, 0xE9, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x80, 0x2A, 0x28, 0x80, 0x3E, 0x39, 0x00, 0x28, 0x65, 0x00, 0x09, 0xA6, 0x00, 0x0A, 0x22, 0x00, 0x0E, 0x26, 0x80, 0x39, 0x29, 0x80, 0x00, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x0F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x40, 0x80, 0x17, 0xFC, 0x80, 0x24, 0x44, 0x80, 0x07, 0xFC, 0x80, 0x00, 0x40, 0x80, 0x00, 0x44, 0x80, 0x00, 0xFE, 0x80, 0x0F, 0x02, 0x80, 0x00, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8702, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x3E, 0x62, 0x00, 0x2B, 0x94, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x36, 0x00, 0x2A, 0xC9, 0x80, 0x2A, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x31, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8703, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x12, 0x24, 0x00, 0x12, 0xF8, 0x00, 0x2F, 0x07, 0x80, 0x28, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x28, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8704, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x52, 0xBF, 0x00, 0x52, 0x80, 0x00, 0x52, 0x80, 0x00, 0x52, 0xFF, 0x80, 0x7E, 0xA4, 0x00, 0x10, 0xA4, 0x80, 0x10, 0xA5, 0x80, 0x14, 0xA5, 0x00, 0x15, 0xA6, 0x00, 0x3F, 0x22, 0x00, 0x62, 0x3B, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8705, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x52, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x62, 0x91, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8706, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x14, 0x00, 0x0F, 0x34, 0x00, 0x39, 0x24, 0x80, 0x60, 0x64, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8707, { 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x78, 0x00, 0x7F, 0x40, 0x00, 0x04, 0x7F, 0x80, 0x05, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x74, 0x44, 0x00, 0x04, 0x44, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8708, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0xA2, 0x00, 0x3E, 0xA2, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x0B, 0xFF, 0x80, 0x0E, 0x18, 0x00, 0x39, 0x24, 0x00, 0x00, 0x42, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8709, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x80, 0x10, 0xFE, 0x00, 0x10, 0x29, 0x00, 0x7E, 0x6D, 0x80, 0x52, 0x44, 0x80, 0x52, 0x00, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x02, 0x00, 0x7E, 0x04, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x72, 0x08, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x870A, { 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x10, 0x71, 0x00, 0x11, 0xC5, 0x00, 0x7C, 0x45, 0x00, 0x54, 0x45, 0x00, 0x55, 0xF5, 0x00, 0x54, 0x45, 0x00, 0x54, 0x45, 0x00, 0x54, 0xE5, 0x00, 0x7C, 0xD5, 0x00, 0x11, 0x55, 0x00, 0x11, 0x45, 0x00, 0x14, 0x41, 0x00, 0x3C, 0x41, 0x00, 0x64, 0x41, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x870B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x52, 0x82, 0x00, 0x52, 0xFE, 0x00, 0x52, 0x82, 0x00, 0x52, 0x82, 0x00, 0x7E, 0xFE, 0x80, 0x10, 0x89, 0x80, 0x10, 0x8B, 0x00, 0x14, 0x8C, 0x00, 0x14, 0x84, 0x00, 0x3E, 0x86, 0x00, 0x62, 0xF3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x870D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x14, 0x00, 0x7E, 0x36, 0x00, 0x52, 0x63, 0x00, 0x52, 0xC1, 0x80, 0x52, 0x3E, 0x00, 0x52, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x1E, 0x6B, 0x00, 0x72, 0xC9, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x870E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x00, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0F, 0x41, 0x00, 0x39, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x870F, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x2A, 0x00, 0x49, 0x6B, 0x00, 0x49, 0xC9, 0x80, 0x7F, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x12, 0x00, 0x0A, 0x13, 0x80, 0x0A, 0x30, 0x80, 0x0F, 0x20, 0x80, 0x39, 0x60, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8710, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x7F, 0xE4, 0x00, 0x54, 0x9F, 0x80, 0x54, 0x84, 0x80, 0x54, 0x84, 0x80, 0x54, 0x84, 0x80, 0x57, 0xF4, 0x80, 0x7C, 0x84, 0x80, 0x10, 0x8C, 0x80, 0x15, 0xA8, 0x80, 0x15, 0x28, 0x80, 0x3D, 0x69, 0x80, 0x65, 0xD9, 0x00, 0x03, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8711, { 0x00, 0x00, 0x00, 0x7C, 0x03, 0x80, 0x09, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x3C, 0x9F, 0x00, 0x04, 0x90, 0x00, 0x2C, 0x90, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8712, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x13, 0xC7, 0x00, 0x10, 0x5C, 0x00, 0x7C, 0x44, 0x00, 0x54, 0x84, 0x00, 0x54, 0x94, 0x00, 0x55, 0xD7, 0x00, 0x54, 0x54, 0x00, 0x55, 0x54, 0x00, 0x7D, 0x54, 0x00, 0x11, 0x54, 0x00, 0x15, 0xD4, 0x00, 0x14, 0x9F, 0x00, 0x3C, 0x80, 0x00, 0x65, 0xE0, 0x00, 0x03, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8713, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x80, 0x13, 0xC7, 0x00, 0x10, 0xBC, 0x00, 0x7C, 0x84, 0x00, 0x55, 0x84, 0x00, 0x55, 0x04, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x44, 0x00, 0x54, 0x44, 0x00, 0x7D, 0x44, 0x00, 0x13, 0x44, 0x00, 0x15, 0xC4, 0x00, 0x14, 0xBF, 0x80, 0x3D, 0xC0, 0x00, 0x65, 0x70, 0x00, 0x03, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8714, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0x80, 0x80, 0x53, 0x80, 0x80, 0x52, 0x7C, 0x80, 0x52, 0x54, 0x80, 0x7E, 0x54, 0x80, 0x10, 0x7C, 0x80, 0x10, 0x54, 0x80, 0x14, 0x54, 0x80, 0x14, 0x7C, 0x80, 0x3E, 0x01, 0x80, 0x62, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8715, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x3E, 0x48, 0x00, 0x28, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x0E, 0x89, 0x00, 0x7A, 0x89, 0x00, 0x21, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8717, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x3F, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x08, 0xAA, 0x00, 0x0A, 0xC6, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8718, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x47, 0x80, 0x3E, 0x44, 0x80, 0x2B, 0xF4, 0x80, 0x2A, 0x44, 0x80, 0x2A, 0x44, 0x80, 0x2A, 0x44, 0x80, 0x3F, 0xFC, 0x80, 0x2A, 0x44, 0x80, 0x08, 0xA4, 0x80, 0x08, 0x94, 0x80, 0x0F, 0x97, 0x80, 0x39, 0x14, 0x80, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8719, { 0x00, 0x00, 0x00, 0x10, 0x8E, 0x00, 0x10, 0x82, 0x00, 0x10, 0x92, 0x00, 0x7F, 0xD2, 0x00, 0x54, 0xB3, 0x00, 0x54, 0xA1, 0x00, 0x54, 0xA9, 0x80, 0x55, 0xC8, 0x00, 0x55, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x10, 0x98, 0x00, 0x14, 0x91, 0x00, 0x14, 0x91, 0x00, 0x3C, 0x97, 0x00, 0x64, 0x9D, 0x00, 0x00, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x871A, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x07, 0xDF, 0x80, 0x39, 0x10, 0x00, 0x06, 0x10, 0x00, 0x38, 0x50, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x871C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x00, 0x40, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x05, 0x00, 0x23, 0xFC, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x871E, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0A, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x0F, 0x22, 0x00, 0x39, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x871F, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x52, 0x21, 0x00, 0x52, 0x4F, 0x80, 0x52, 0xF0, 0x80, 0x52, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x62, 0x41, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8721, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x24, 0x00, 0x52, 0x24, 0x00, 0x52, 0x24, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x62, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8722, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x18, 0x00, 0x3F, 0x12, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x22, 0x00, 0x3E, 0xFF, 0x00, 0x28, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0E, 0xAA, 0x00, 0x72, 0xAA, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8723, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0xC6, 0x00, 0x10, 0x44, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x10, 0x00, 0x52, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x64, 0x00, 0x3E, 0x44, 0x80, 0x62, 0xC6, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8725, { 0x00, 0x00, 0x00, 0x10, 0x83, 0x00, 0x10, 0x9E, 0x00, 0x10, 0x90, 0x00, 0x7C, 0x90, 0x00, 0x57, 0xF0, 0x00, 0x54, 0x9F, 0x80, 0x54, 0x92, 0x00, 0x55, 0xD2, 0x00, 0x7D, 0xB2, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x10, 0x92, 0x00, 0x14, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x64, 0xA2, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8728, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x09, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x09, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0x08, 0x00, 0x10, 0x48, 0x00, 0x14, 0x4F, 0x00, 0x14, 0x48, 0x00, 0x3E, 0xE8, 0x00, 0x62, 0xB8, 0x00, 0x01, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8729, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x52, 0xBE, 0x80, 0x52, 0x88, 0x80, 0x52, 0x88, 0x80, 0x52, 0xBE, 0x80, 0x7E, 0x88, 0x80, 0x10, 0xBE, 0x80, 0x10, 0xA2, 0x80, 0x14, 0xA2, 0x80, 0x14, 0xBE, 0x80, 0x1E, 0x80, 0x80, 0x72, 0x80, 0x80, 0x01, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x872E, { 0x00, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x7D, 0xFF, 0x80, 0x54, 0x08, 0x00, 0x54, 0x08, 0x00, 0x55, 0xE9, 0x00, 0x55, 0x29, 0x00, 0x7D, 0x2B, 0x00, 0x11, 0x2A, 0x00, 0x11, 0xEA, 0x00, 0x14, 0x0C, 0x00, 0x14, 0xEC, 0x80, 0x3D, 0x96, 0x80, 0x64, 0x23, 0x80, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x872F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x52, 0xFE, 0x00, 0x52, 0x28, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x44, 0x00, 0x7E, 0x92, 0x00, 0x11, 0x11, 0x80, 0x10, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x62, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8731, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x52, 0x91, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0xA1, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x10, 0x88, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x62, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8732, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x52, 0x54, 0x00, 0x52, 0x56, 0x00, 0x52, 0xD3, 0x00, 0x53, 0x91, 0x80, 0x7E, 0x10, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x14, 0x46, 0x00, 0x3E, 0xFC, 0x00, 0x62, 0x36, 0x00, 0x00, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8734, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x52, 0x7E, 0x00, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x7E, 0x00, 0x7E, 0x20, 0x00, 0x10, 0x7F, 0x80, 0x10, 0xCA, 0x80, 0x15, 0x92, 0x80, 0x14, 0x24, 0x80, 0x1E, 0xC9, 0x80, 0x72, 0x11, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8737, { 0x00, 0x00, 0x00, 0x10, 0x52, 0x00, 0x10, 0xD3, 0x00, 0x10, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0x28, 0x00, 0x52, 0x28, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x24, 0x00, 0x7E, 0x42, 0x00, 0x10, 0xFF, 0x00, 0x11, 0xC5, 0x80, 0x14, 0x44, 0x00, 0x14, 0x5C, 0x00, 0x1E, 0x41, 0x00, 0x72, 0x43, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8739, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x44, 0x00, 0x52, 0x70, 0x00, 0x52, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x10, 0xB9, 0x00, 0x10, 0xA9, 0x00, 0x14, 0xAD, 0x00, 0x14, 0xC5, 0x00, 0x3E, 0x81, 0x00, 0x62, 0x81, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x873A, { 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x10, 0xE7, 0x00, 0x10, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x52, 0xE7, 0x00, 0x52, 0x81, 0x00, 0x52, 0x81, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x64, 0x00, 0x3E, 0x44, 0x80, 0x62, 0xC4, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x873B, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x08, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x72, 0x41, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x873C, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x10, 0xCC, 0x00, 0x7E, 0x88, 0x00, 0x52, 0xFF, 0x80, 0x53, 0x88, 0x00, 0x52, 0x88, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x62, 0x88, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x873D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x55, 0xDD, 0x00, 0x7D, 0x55, 0x00, 0x11, 0x55, 0x00, 0x11, 0x55, 0x00, 0x15, 0xBB, 0x00, 0x15, 0x11, 0x00, 0x3D, 0x11, 0x00, 0x65, 0x11, 0x00, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x873E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0x91, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x14, 0x56, 0x00, 0x14, 0xD2, 0x00, 0x3E, 0x93, 0x00, 0x62, 0x91, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x873F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x55, 0x01, 0x00, 0x54, 0x80, 0x00, 0x54, 0xEF, 0x00, 0x54, 0xA9, 0x00, 0x54, 0xA9, 0x00, 0x7D, 0x29, 0x00, 0x10, 0xA9, 0x00, 0x14, 0x6B, 0x00, 0x14, 0x48, 0x00, 0x3C, 0x48, 0x80, 0x64, 0xC9, 0x80, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8740, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x14, 0x54, 0x00, 0x14, 0x56, 0x00, 0x3E, 0xD3, 0x00, 0x62, 0x91, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8743, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x7D, 0xAD, 0x00, 0x54, 0x42, 0x00, 0x54, 0xA5, 0x00, 0x55, 0x08, 0x80, 0x54, 0x00, 0x00, 0x55, 0xEF, 0x00, 0x7C, 0x21, 0x00, 0x11, 0x21, 0x00, 0x14, 0xCA, 0x00, 0x14, 0x4A, 0x00, 0x3C, 0xA4, 0x00, 0x65, 0x2A, 0x00, 0x02, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8745, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8747, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x0A, 0x44, 0x00, 0x3F, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x0E, 0xFE, 0x00, 0x7A, 0x10, 0x00, 0x20, 0x11, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8748, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x8A, 0x00, 0x3F, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x9A, 0x00, 0x28, 0x96, 0x00, 0x0A, 0xFE, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8749, { 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x11, 0xB3, 0x00, 0x10, 0x92, 0x00, 0x7C, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x62, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x874B, { 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x11, 0xB3, 0x00, 0x10, 0x92, 0x00, 0x7C, 0x00, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x54, 0x92, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x80, 0x3C, 0x92, 0x80, 0x65, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x874C, { 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x10, 0x71, 0x00, 0x11, 0xC9, 0x00, 0x7C, 0x4D, 0x00, 0x54, 0x45, 0x00, 0x55, 0xF1, 0x00, 0x54, 0x49, 0x00, 0x54, 0x4D, 0x00, 0x54, 0xE5, 0x00, 0x7C, 0xD1, 0x00, 0x11, 0x41, 0x80, 0x11, 0x4F, 0x00, 0x14, 0x41, 0x00, 0x3C, 0x41, 0x00, 0x64, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x874D, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x11, 0xF7, 0x80, 0x11, 0x14, 0x80, 0x7D, 0x14, 0x80, 0x55, 0xF4, 0x80, 0x55, 0x14, 0x80, 0x55, 0x14, 0x80, 0x55, 0x14, 0x80, 0x7D, 0xF4, 0x80, 0x10, 0x04, 0x80, 0x11, 0x34, 0x80, 0x15, 0xE4, 0x80, 0x15, 0x05, 0x80, 0x3D, 0x04, 0x00, 0x65, 0x94, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x874E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0xC8, 0x80, 0x09, 0x54, 0x80, 0x08, 0x62, 0x80, 0x0A, 0x40, 0x80, 0x0E, 0x7F, 0x80, 0x31, 0x40, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8753, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x7C, 0xC6, 0x00, 0x57, 0xBB, 0x80, 0x54, 0x00, 0x00, 0x55, 0xE4, 0x80, 0x55, 0x24, 0x80, 0x55, 0xA4, 0x80, 0x7D, 0x6D, 0x80, 0x11, 0x29, 0x00, 0x15, 0xA9, 0x00, 0x15, 0x6D, 0x80, 0x3D, 0x24, 0x80, 0x65, 0x24, 0x80, 0x01, 0x64, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8755, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x0A, 0x00, 0x3E, 0x09, 0x00, 0x20, 0x0F, 0x80, 0x3E, 0xF0, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8757, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x10, 0x00, 0x39, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8758, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x7D, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x15, 0x74, 0x00, 0x15, 0x1E, 0x00, 0x3D, 0x73, 0x00, 0x65, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8759, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x52, 0x41, 0x00, 0x52, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x40, 0x00, 0x7E, 0x7F, 0x80, 0x10, 0x54, 0x80, 0x10, 0xD4, 0x80, 0x14, 0xFF, 0x80, 0x15, 0x54, 0x80, 0x1E, 0x54, 0x80, 0x72, 0x54, 0x80, 0x00, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x875D, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x52, 0x04, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x20, 0x00, 0x52, 0x51, 0x00, 0x7E, 0x9A, 0x00, 0x10, 0x2C, 0x00, 0x10, 0x48, 0x00, 0x14, 0x9C, 0x00, 0x14, 0x2A, 0x00, 0x3E, 0x49, 0x00, 0x62, 0x88, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x875F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0F, 0x7F, 0x00, 0x38, 0xC1, 0x00, 0x00, 0x41, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8760, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x52, 0x41, 0x00, 0x52, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x14, 0xFF, 0x80, 0x14, 0x88, 0x80, 0x1E, 0x88, 0x80, 0x72, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8761, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0x94, 0x80, 0x52, 0x94, 0x80, 0x52, 0x94, 0x80, 0x52, 0x95, 0x80, 0x7E, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x3E, 0x36, 0x00, 0x62, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8763, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x7F, 0xEF, 0x80, 0x55, 0x18, 0x00, 0x55, 0x00, 0x00, 0x55, 0x0F, 0x80, 0x55, 0xE1, 0x00, 0x7D, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x2F, 0x80, 0x15, 0x22, 0x00, 0x1D, 0x22, 0x00, 0x37, 0x22, 0x00, 0x62, 0x22, 0x00, 0x06, 0xE6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8764, { 0x00, 0x00, 0x00, 0x10, 0x5E, 0x00, 0x10, 0xC3, 0x00, 0x11, 0x81, 0x80, 0x7F, 0x7E, 0x80, 0x52, 0x28, 0x00, 0x52, 0x28, 0x00, 0x52, 0xFF, 0x00, 0x52, 0xA9, 0x00, 0x7E, 0xA9, 0x00, 0x10, 0xA9, 0x00, 0x10, 0xCF, 0x00, 0x14, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x62, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8765, { 0x00, 0x00, 0x00, 0x3F, 0xA0, 0x00, 0x09, 0x3F, 0x80, 0x06, 0x20, 0x80, 0x7F, 0xD1, 0x00, 0x0A, 0x8A, 0x00, 0x12, 0x04, 0x00, 0x22, 0x0A, 0x00, 0x06, 0x71, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8766, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x00, 0x08, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xF7, 0x00, 0x2A, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x89, 0x00, 0x08, 0x8A, 0x00, 0x0A, 0x86, 0x00, 0x0E, 0xE4, 0x00, 0x31, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8768, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x0F, 0xE2, 0x80, 0x02, 0x01, 0x80, 0x06, 0x08, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x3E, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x1F, 0x3E, 0x00, 0x04, 0x08, 0x00, 0x04, 0x89, 0x00, 0x07, 0xCF, 0x80, 0x38, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x876A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x52, 0x42, 0x00, 0x52, 0x42, 0x00, 0x52, 0x7E, 0x00, 0x52, 0x00, 0x00, 0x53, 0xFF, 0x80, 0x7E, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x15, 0x92, 0x80, 0x14, 0x24, 0x80, 0x1E, 0xC9, 0x80, 0x72, 0x11, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x876E, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x53, 0x7F, 0x00, 0x52, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0x20, 0x00, 0x10, 0x3E, 0x00, 0x14, 0x62, 0x00, 0x14, 0xD6, 0x00, 0x1E, 0x1C, 0x00, 0x72, 0x36, 0x00, 0x00, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x876F, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xF2, 0x00, 0x7E, 0x53, 0x00, 0x52, 0x89, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x20, 0x00, 0x53, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x14, 0xE6, 0x00, 0x15, 0xB4, 0x00, 0x3E, 0x1C, 0x00, 0x62, 0x36, 0x00, 0x00, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8770, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x93, 0x00, 0x2B, 0x7C, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x0A, 0x7C, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x12, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8771, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8772, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x45, 0x00, 0x7D, 0xF5, 0x00, 0x54, 0x45, 0x00, 0x55, 0xF5, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x7D, 0x55, 0x00, 0x11, 0xF5, 0x00, 0x10, 0x45, 0x00, 0x14, 0xE1, 0x00, 0x14, 0xD1, 0x00, 0x3D, 0x51, 0x00, 0x65, 0x51, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8774, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x47, 0x80, 0x08, 0x44, 0x80, 0x3E, 0x44, 0x80, 0x2B, 0xFC, 0x80, 0x2A, 0x47, 0x80, 0x2A, 0x44, 0x80, 0x3E, 0x44, 0x80, 0x2B, 0xF4, 0x80, 0x09, 0x17, 0x80, 0x09, 0x14, 0x80, 0x0B, 0x14, 0x80, 0x0F, 0x14, 0x80, 0x39, 0x14, 0x80, 0x01, 0xF8, 0x80, 0x01, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8776, { 0x00, 0x00, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x3F, 0xFF, 0x80, 0x2A, 0x94, 0x00, 0x2A, 0x9C, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x0A, 0x1C, 0x00, 0x0F, 0x2A, 0x00, 0x31, 0x49, 0x00, 0x01, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8778, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x4F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x2A, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x0A, 0xA2, 0x80, 0x0F, 0xBE, 0x80, 0x31, 0xA2, 0x80, 0x00, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x877B, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x52, 0x08, 0x00, 0x52, 0xFF, 0x80, 0x52, 0xA2, 0x80, 0x52, 0x94, 0x80, 0x7E, 0xBE, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x14, 0xBE, 0x80, 0x14, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x62, 0x88, 0x80, 0x00, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x877C, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x14, 0x20, 0x00, 0x7F, 0xFE, 0x00, 0x54, 0x70, 0x00, 0x54, 0xAC, 0x00, 0x55, 0x24, 0x00, 0x54, 0x40, 0x00, 0x7F, 0xFF, 0x00, 0x50, 0x88, 0x00, 0x15, 0x08, 0x00, 0x1C, 0xD0, 0x00, 0x74, 0x20, 0x00, 0x00, 0xD8, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x877D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x7D, 0xFC, 0x00, 0x54, 0x40, 0x00, 0x57, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x55, 0xFC, 0x00, 0x7F, 0x06, 0x00, 0x55, 0x05, 0x00, 0x11, 0xFC, 0x00, 0x1D, 0x04, 0x00, 0x65, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x877E, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2B, 0xFF, 0x00, 0x2B, 0x01, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x28, 0x38, 0x00, 0x0A, 0x34, 0x00, 0x0E, 0x54, 0x00, 0x72, 0x93, 0x00, 0x21, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x877F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x7C, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x14, 0x91, 0x00, 0x1E, 0xFF, 0x00, 0x72, 0x10, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8782, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0xF7, 0x80, 0x3E, 0x94, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0xF4, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0xF4, 0x80, 0x08, 0x84, 0x80, 0x08, 0xAC, 0x80, 0x0A, 0xB4, 0x80, 0x0F, 0x95, 0x80, 0x38, 0xF4, 0x00, 0x01, 0x94, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8783, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x52, 0x24, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x52, 0x91, 0x00, 0x7E, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x14, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x3E, 0x61, 0x00, 0x62, 0xC1, 0x00, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8784, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x11, 0x1F, 0x80, 0x11, 0xC4, 0x00, 0x7D, 0x44, 0x00, 0x55, 0x5F, 0x80, 0x55, 0x54, 0x80, 0x55, 0xD4, 0x80, 0x55, 0x14, 0x80, 0x7D, 0x14, 0x80, 0x11, 0xD4, 0x80, 0x11, 0x54, 0x80, 0x15, 0x54, 0x80, 0x15, 0x54, 0x80, 0x3D, 0x55, 0x80, 0x65, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8785, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x52, 0xFE, 0x00, 0x52, 0x82, 0x00, 0x52, 0xFE, 0x00, 0x52, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x14, 0x1B, 0x00, 0x15, 0x49, 0x80, 0x3D, 0x42, 0x80, 0x67, 0x62, 0x00, 0x02, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8786, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xEF, 0x80, 0x7C, 0x00, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x54, 0x84, 0x00, 0x54, 0x84, 0x00, 0x55, 0x29, 0x00, 0x7C, 0xA5, 0x00, 0x10, 0x42, 0x00, 0x14, 0x42, 0x00, 0x14, 0xA5, 0x00, 0x3C, 0xA5, 0x00, 0x65, 0xEF, 0x80, 0x01, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8787, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x1E, 0x00, 0x10, 0xE2, 0x00, 0x7C, 0xB3, 0x00, 0x55, 0x91, 0x00, 0x55, 0x20, 0x00, 0x54, 0x64, 0x00, 0x54, 0xC8, 0x00, 0x54, 0x52, 0x00, 0x7C, 0x3F, 0x00, 0x10, 0xE1, 0x80, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x3C, 0x28, 0x00, 0x64, 0x66, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8788, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x7E, 0x88, 0x00, 0x52, 0xBF, 0x00, 0x52, 0xA1, 0x00, 0x52, 0xA1, 0x00, 0x52, 0xBF, 0x00, 0x7E, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x10, 0xBF, 0x00, 0x14, 0x88, 0x00, 0x15, 0xAA, 0x00, 0x3D, 0x2B, 0x00, 0x67, 0x69, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8789, { 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x7F, 0x21, 0x80, 0x52, 0x24, 0x00, 0x52, 0x42, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x01, 0x00, 0x7F, 0xEF, 0x80, 0x10, 0xA2, 0x80, 0x11, 0x24, 0x80, 0x14, 0x69, 0x80, 0x14, 0xA2, 0x80, 0x3F, 0x24, 0x80, 0x62, 0x28, 0x80, 0x00, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x878B, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x68, 0x00, 0x10, 0xCB, 0x80, 0x7E, 0x88, 0x80, 0x52, 0x88, 0x80, 0x52, 0xEB, 0x80, 0x52, 0x88, 0x80, 0x52, 0x88, 0x80, 0x7E, 0xEB, 0x80, 0x10, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x14, 0x41, 0x00, 0x14, 0x26, 0x00, 0x3E, 0x1C, 0x00, 0x62, 0x76, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x878C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x15, 0x23, 0x80, 0x7F, 0xC0, 0x00, 0x11, 0x3F, 0x00, 0x15, 0x21, 0x00, 0x15, 0x12, 0x00, 0x31, 0x0C, 0x00, 0x63, 0x33, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x878D, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x15, 0x00, 0x1F, 0x15, 0x00, 0x00, 0x15, 0x00, 0x3F, 0x95, 0x00, 0x2A, 0x9F, 0x00, 0x33, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x85, 0x00, 0x24, 0x87, 0x80, 0x24, 0x98, 0x80, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8790, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x52, 0x82, 0x00, 0x52, 0x82, 0x00, 0x52, 0xFE, 0x00, 0x52, 0x80, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x00, 0x80, 0x14, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x62, 0x81, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8793, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x52, 0x7E, 0x00, 0x52, 0x28, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x44, 0x00, 0x7E, 0x82, 0x00, 0x11, 0x7D, 0x80, 0x10, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x54, 0x00, 0x3E, 0xD6, 0x00, 0x62, 0x93, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8795, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x52, 0xA5, 0x00, 0x52, 0x99, 0x00, 0x52, 0xA5, 0x00, 0x52, 0x81, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x88, 0x00, 0x14, 0xE9, 0x80, 0x14, 0x8F, 0x00, 0x3E, 0x88, 0x00, 0x62, 0xE8, 0x80, 0x01, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8797, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x88, 0x00, 0x52, 0xBF, 0x00, 0x52, 0x89, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x89, 0x00, 0x7E, 0x89, 0x00, 0x10, 0xBF, 0x00, 0x10, 0x88, 0x00, 0x14, 0xBF, 0x00, 0x15, 0xA1, 0x00, 0x3D, 0x21, 0x00, 0x63, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8798, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x52, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x14, 0x22, 0x00, 0x14, 0x36, 0x00, 0x3E, 0x14, 0x00, 0x62, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8799, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x9C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x879E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x88, 0x00, 0x52, 0x88, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x00, 0x80, 0x14, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x62, 0x81, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x879F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x0F, 0x00, 0x00, 0x31, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87A0, { 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x10, 0x46, 0x00, 0x10, 0xC3, 0x00, 0x7F, 0xBD, 0x80, 0x52, 0x00, 0x00, 0x52, 0x1E, 0x00, 0x52, 0xC3, 0x00, 0x53, 0x81, 0x80, 0x7E, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x14, 0xA5, 0x00, 0x14, 0xA5, 0x00, 0x3E, 0xA5, 0x00, 0x62, 0xA5, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87A2, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x15, 0x14, 0x80, 0x16, 0x15, 0x00, 0x24, 0xA6, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x20, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x41, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87A3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFF, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x00, 0x27, 0xFF, 0x80, 0x24, 0xA6, 0x00, 0x3D, 0xA3, 0x00, 0x26, 0xFD, 0x80, 0x24, 0xA4, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x24, 0x00, 0x64, 0x3E, 0x00, 0x4D, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87A7, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x10, 0xFA, 0x00, 0x7E, 0x24, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x10, 0x00, 0x52, 0x66, 0x00, 0x53, 0xB8, 0x00, 0x7E, 0x20, 0x80, 0x10, 0x1F, 0x80, 0x10, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x62, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87A8, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x13, 0xFF, 0x00, 0x14, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x55, 0xFE, 0x00, 0x54, 0x48, 0x00, 0x55, 0x4A, 0x00, 0x55, 0xFF, 0x00, 0x7D, 0x4A, 0x00, 0x51, 0x4A, 0x00, 0x15, 0xB6, 0x00, 0x1D, 0x22, 0x00, 0x65, 0x02, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87AB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x7F, 0xD1, 0x00, 0x0A, 0x31, 0x00, 0x2A, 0x8A, 0x00, 0x4A, 0x44, 0x00, 0x12, 0x0A, 0x00, 0x26, 0x31, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87AC, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x52, 0xFF, 0x80, 0x52, 0xA4, 0x80, 0x52, 0xFF, 0x80, 0x52, 0xA4, 0x80, 0x7E, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x62, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87AD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x52, 0xA5, 0x00, 0x52, 0x99, 0x00, 0x52, 0xA5, 0x00, 0x52, 0x81, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x20, 0x80, 0x15, 0x24, 0x80, 0x3D, 0x7A, 0x80, 0x63, 0x00, 0x80, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87AE, { 0x00, 0x00, 0x00, 0x10, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0xAA, 0x00, 0x54, 0xAA, 0x00, 0x55, 0x3B, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x10, 0x80, 0x7D, 0x10, 0x80, 0x10, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x14, 0x91, 0x00, 0x3C, 0x93, 0x00, 0x64, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87AF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xE1, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xDB, 0x00, 0x08, 0x0E, 0x00, 0x1F, 0x8A, 0x00, 0x30, 0x9B, 0x00, 0x63, 0xB1, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87B1, { 0x00, 0x00, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x02, 0x00, 0x2F, 0xA2, 0x00, 0x22, 0x12, 0x00, 0x6A, 0x92, 0x00, 0x4A, 0x82, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87B3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x3E, 0x00, 0x2A, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x39, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87B5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0xA4, 0x80, 0x52, 0xA4, 0x80, 0x52, 0xFF, 0x80, 0x52, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x10, 0x00, 0x14, 0x52, 0x00, 0x3E, 0xD3, 0x00, 0x63, 0x91, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87BA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x20, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x29, 0x00, 0x08, 0x17, 0x00, 0x0A, 0xF8, 0x80, 0x0E, 0x08, 0x00, 0x31, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87BB, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0x49, 0x00, 0x52, 0x7F, 0x00, 0x52, 0x08, 0x00, 0x52, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x10, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x1E, 0x74, 0x00, 0x72, 0x1E, 0x00, 0x00, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87BD, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x0E, 0x08, 0x00, 0x3B, 0x10, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0xC7, 0x80, 0x00, 0x60, 0x00, 0x03, 0x80, 0x00, 0x08, 0xE8, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87BE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7F, 0x00, 0x80, 0x52, 0x7E, 0x80, 0x52, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x14, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x3E, 0x42, 0x00, 0x62, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87BF, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x22, 0x3F, 0x00, 0x22, 0xE9, 0x00, 0x3E, 0x2E, 0x00, 0x02, 0xF8, 0x00, 0x7E, 0x02, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x42, 0x00, 0x32, 0x62, 0x00, 0x62, 0x26, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87C0, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x52, 0x51, 0x00, 0x52, 0x94, 0x80, 0x52, 0x08, 0x00, 0x52, 0x51, 0x00, 0x7E, 0xA4, 0x80, 0x10, 0x3A, 0x00, 0x10, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x72, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87C1, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x17, 0x99, 0x00, 0x7C, 0x07, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87C4, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x04, 0x7E, 0x00, 0x3F, 0x92, 0x00, 0x11, 0x32, 0x00, 0x0A, 0x1A, 0x80, 0x3F, 0xD7, 0x80, 0x04, 0x20, 0x00, 0x1F, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87C6, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x52, 0x24, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x1E, 0x66, 0x00, 0x72, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87C7, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x8B, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFD, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87C8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x0A, 0x80, 0x7D, 0x0A, 0x80, 0x55, 0xFF, 0x80, 0x55, 0x08, 0x80, 0x55, 0x74, 0x80, 0x55, 0x54, 0x80, 0x55, 0x54, 0x80, 0x7D, 0x75, 0x80, 0x11, 0x02, 0x80, 0x15, 0x76, 0x80, 0x15, 0x0D, 0x80, 0x3D, 0x39, 0x80, 0x65, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87C9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x63, 0x00, 0x7E, 0xA5, 0x00, 0x52, 0x63, 0x00, 0x52, 0xA5, 0x00, 0x52, 0x11, 0x00, 0x52, 0x38, 0x00, 0x7E, 0xEE, 0x00, 0x11, 0x83, 0x80, 0x10, 0x10, 0x00, 0x14, 0xE4, 0x00, 0x14, 0x19, 0x00, 0x3E, 0xE2, 0x00, 0x62, 0x0C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87CA, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x18, 0x00, 0x00, 0xA0, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x21, 0x00, 0x06, 0x26, 0x00, 0x38, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87CB, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x88, 0x80, 0x7E, 0x49, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x2A, 0x00, 0x52, 0x2A, 0x00, 0x52, 0x6B, 0x00, 0x7E, 0xC1, 0x80, 0x10, 0x08, 0x00, 0x10, 0x0C, 0x00, 0x14, 0x14, 0x00, 0x14, 0x51, 0x00, 0x1E, 0x51, 0x80, 0x72, 0xD2, 0x80, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87CE, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x52, 0x24, 0x00, 0x52, 0x3C, 0x00, 0x52, 0x08, 0x00, 0x52, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x10, 0xEE, 0x80, 0x10, 0xAA, 0x80, 0x14, 0xAA, 0x80, 0x14, 0xDD, 0x80, 0x3E, 0x88, 0x80, 0x62, 0x88, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87D0, { 0x00, 0x00, 0x00, 0x10, 0x49, 0x00, 0x10, 0x6B, 0x00, 0x10, 0x2A, 0x00, 0x7E, 0xFF, 0x80, 0x52, 0x80, 0x80, 0x52, 0xBE, 0x80, 0x52, 0x22, 0x00, 0x52, 0x22, 0x00, 0x7E, 0x3E, 0x00, 0x10, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x72, 0x4B, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87D1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x28, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x72, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87D2, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x28, 0x00, 0x54, 0x44, 0x00, 0x55, 0x83, 0x00, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x14, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x64, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87D3, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x88, 0x00, 0x09, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x62, 0x00, 0x3E, 0x94, 0x00, 0x29, 0x38, 0x00, 0x0A, 0x58, 0x00, 0x0F, 0xB4, 0x00, 0x72, 0x57, 0x00, 0x21, 0x92, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87D5, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0xA5, 0x80, 0x10, 0xBF, 0x00, 0x7E, 0xA4, 0x00, 0x52, 0xBC, 0x80, 0x53, 0xE3, 0x80, 0x52, 0x3C, 0x00, 0x52, 0x48, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x62, 0x81, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87D6, { 0x00, 0x00, 0x00, 0x11, 0x21, 0x80, 0x11, 0x23, 0x00, 0x11, 0x2E, 0x00, 0x7F, 0xF8, 0x00, 0x55, 0x28, 0x00, 0x55, 0xEF, 0x80, 0x55, 0x29, 0x00, 0x55, 0x29, 0x00, 0x55, 0xE9, 0x00, 0x7D, 0x29, 0x00, 0x11, 0x29, 0x00, 0x17, 0xF9, 0x00, 0x15, 0x29, 0x00, 0x3D, 0x29, 0x00, 0x67, 0x31, 0x00, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87D9, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x45, 0x00, 0x11, 0xF5, 0x80, 0x7C, 0x04, 0x80, 0x55, 0x14, 0x00, 0x54, 0xA4, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x04, 0x00, 0x55, 0xF5, 0x00, 0x7F, 0x15, 0x00, 0x11, 0x17, 0x00, 0x15, 0xF2, 0x00, 0x15, 0x12, 0x00, 0x3D, 0x12, 0x80, 0x65, 0xF7, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87DA, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xCC, 0x00, 0x02, 0x32, 0x00, 0x3F, 0xC6, 0x00, 0x10, 0x8C, 0x00, 0x1F, 0xB9, 0x00, 0x09, 0x03, 0x00, 0x0B, 0xCE, 0x00, 0x3E, 0x38, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87DB, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x10, 0x51, 0x00, 0x13, 0xFA, 0x00, 0x10, 0x42, 0x00, 0x7D, 0xF4, 0x00, 0x54, 0x09, 0x00, 0x55, 0xF1, 0x00, 0x55, 0x12, 0x00, 0x55, 0x14, 0x00, 0x7D, 0xF8, 0x00, 0x50, 0x01, 0x00, 0x15, 0x11, 0x00, 0x1C, 0xA2, 0x00, 0x67, 0xF4, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87DC, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x52, 0x24, 0x00, 0x52, 0x7E, 0x00, 0x53, 0xA5, 0x80, 0x52, 0x3C, 0x00, 0x7E, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x14, 0xBD, 0x00, 0x14, 0xA5, 0x00, 0x3E, 0xBD, 0x00, 0x62, 0x81, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87DF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x52, 0xA5, 0x00, 0x52, 0x42, 0x00, 0x52, 0x7F, 0x00, 0x52, 0xC2, 0x80, 0x7F, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x14, 0x10, 0x00, 0x14, 0x92, 0x00, 0x3D, 0x93, 0x00, 0x63, 0x11, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87E0, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x2A, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x88, 0x80, 0x09, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x0F, 0x49, 0x00, 0x39, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87E2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x42, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x14, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x62, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87E3, { 0x00, 0x00, 0x00, 0x10, 0x91, 0x00, 0x11, 0x12, 0x00, 0x13, 0x56, 0x80, 0x7C, 0x91, 0x00, 0x55, 0x12, 0x80, 0x55, 0x57, 0x80, 0x57, 0xD2, 0x00, 0x54, 0x11, 0x00, 0x55, 0xFF, 0x80, 0x7D, 0x10, 0x00, 0x11, 0x09, 0x00, 0x15, 0x8A, 0x00, 0x15, 0x44, 0x00, 0x3D, 0x4A, 0x80, 0x67, 0x13, 0x80, 0x02, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87E4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x11, 0x28, 0x80, 0x7D, 0xEF, 0x80, 0x55, 0x08, 0x00, 0x55, 0x28, 0x80, 0x54, 0xE7, 0x80, 0x54, 0x00, 0x00, 0x7C, 0x24, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x15, 0xFF, 0x80, 0x3E, 0x24, 0x00, 0x62, 0x66, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87E5, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x0E, 0x00, 0x00, 0x72, 0x44, 0x00, 0x20, 0x83, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87EA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x91, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x12, 0x00, 0x10, 0x7F, 0x00, 0x15, 0xC1, 0x80, 0x14, 0x10, 0x00, 0x3E, 0xA9, 0x00, 0x62, 0xA2, 0x80, 0x01, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87EB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0xA9, 0x00, 0x52, 0xB9, 0x00, 0x52, 0x00, 0x00, 0x52, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x62, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87EC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x77, 0x00, 0x08, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x2A, 0x77, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x31, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87ED, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0xC8, 0x00, 0x7F, 0xFF, 0x00, 0x52, 0x88, 0x00, 0x52, 0x88, 0x00, 0x52, 0xFF, 0x00, 0x52, 0x88, 0x00, 0x7E, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x3E, 0xA9, 0x00, 0x63, 0xAD, 0x80, 0x01, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87EE, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x54, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87EF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x3E, 0x3A, 0x00, 0x2A, 0xEF, 0x80, 0x08, 0x00, 0x00, 0x0A, 0xFF, 0x80, 0x0F, 0x24, 0x00, 0x39, 0x24, 0x00, 0x00, 0x44, 0x80, 0x01, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87F1, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0xD5, 0x00, 0x53, 0x55, 0x00, 0x52, 0x55, 0x00, 0x53, 0xFF, 0x80, 0x52, 0x55, 0x00, 0x7E, 0x55, 0x00, 0x10, 0x55, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x3E, 0x55, 0x00, 0x62, 0xD5, 0x80, 0x00, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87F2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0xC0, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x85, 0x00, 0x07, 0xCF, 0x80, 0x38, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87F3, { 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x02, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x55, 0xEF, 0x00, 0x54, 0x49, 0x00, 0x54, 0x69, 0x00, 0x7D, 0xCF, 0x00, 0x10, 0x02, 0x00, 0x15, 0xFF, 0x80, 0x14, 0x42, 0x00, 0x3C, 0x62, 0x00, 0x64, 0x22, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87F6, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x97, 0x80, 0x7C, 0xF4, 0x80, 0x54, 0x94, 0x80, 0x54, 0xF4, 0x80, 0x54, 0x97, 0x80, 0x55, 0xF0, 0x00, 0x54, 0x10, 0x00, 0x7C, 0x03, 0x00, 0x10, 0x7E, 0x00, 0x14, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x3C, 0x08, 0x00, 0x64, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87F7, { 0x00, 0x00, 0x00, 0x10, 0x91, 0x00, 0x10, 0xD3, 0x00, 0x10, 0x52, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x55, 0x7E, 0x80, 0x54, 0x42, 0x00, 0x54, 0x7E, 0x00, 0x54, 0x00, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x14, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x1E, 0x91, 0x00, 0x72, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87F8, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x80, 0x00, 0x06, 0xC0, 0x00, 0x39, 0xA7, 0x00, 0x06, 0x78, 0x00, 0x39, 0xA0, 0x00, 0x06, 0x78, 0x00, 0x39, 0xCF, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87F9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x3F, 0x00, 0x12, 0x09, 0x00, 0x3F, 0x91, 0x00, 0x14, 0xA6, 0x00, 0x1F, 0x94, 0x00, 0x14, 0xBF, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0xFF, 0x80, 0x23, 0x84, 0x00, 0x20, 0x44, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87FA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0x81, 0x00, 0x52, 0xBD, 0x00, 0x52, 0xA5, 0x00, 0x52, 0xBD, 0x00, 0x7E, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x62, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87FB, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x7A, 0x00, 0x3F, 0xC9, 0x00, 0x08, 0x48, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x0A, 0x78, 0x00, 0x0F, 0xC4, 0x80, 0x3A, 0x42, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x87FE, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x2A, 0x94, 0x00, 0x2A, 0xF7, 0x80, 0x2A, 0x80, 0x00, 0x2A, 0xBE, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0xBE, 0x00, 0x08, 0xBE, 0x00, 0x0A, 0x80, 0x00, 0x0F, 0xFF, 0x00, 0x31, 0x41, 0x00, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x87FF, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x80, 0x3F, 0xB3, 0x80, 0x24, 0x80, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x91, 0x00, 0x7F, 0xCE, 0x00, 0x24, 0x9B, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8801, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x1B, 0xEF, 0x80, 0x32, 0x28, 0x80, 0x6B, 0xE9, 0x00, 0x3A, 0x2B, 0x00, 0x13, 0xE8, 0x80, 0x7A, 0x08, 0x80, 0x0A, 0x2B, 0x80, 0x19, 0xE8, 0x00, 0x70, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x7F, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8803, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x38, 0x8E, 0x00, 0x2B, 0xEA, 0x00, 0x3A, 0xAA, 0x00, 0x2B, 0xEE, 0x00, 0x38, 0x8A, 0x80, 0x28, 0xEA, 0x80, 0x5B, 0xB3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8805, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0xEE, 0x00, 0x3E, 0xAA, 0x00, 0x08, 0xEE, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xEE, 0x00, 0x0A, 0xA8, 0x00, 0x0E, 0x28, 0x80, 0x31, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8806, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x91, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8809, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x49, 0x00, 0x7D, 0x49, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x14, 0x50, 0x80, 0x14, 0x93, 0x00, 0x3D, 0x8C, 0x00, 0x66, 0xB3, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x880A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x12, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x24, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x25, 0x00, 0x55, 0xFF, 0x80, 0x7D, 0x25, 0x00, 0x11, 0x7F, 0x00, 0x15, 0x24, 0x00, 0x15, 0x66, 0x00, 0x3D, 0x65, 0x00, 0x66, 0xA4, 0x80, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x880B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x7D, 0x29, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x80, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x20, 0x80, 0x7F, 0xFC, 0x80, 0x10, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x14, 0xFC, 0x80, 0x14, 0x28, 0x80, 0x3C, 0x7D, 0x80, 0x65, 0xC5, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x880D, { 0x00, 0x00, 0x00, 0x11, 0xE4, 0x00, 0x11, 0x24, 0x00, 0x11, 0x2F, 0x80, 0x7D, 0xE8, 0x80, 0x55, 0x3A, 0x80, 0x55, 0x23, 0x00, 0x55, 0xE2, 0x00, 0x54, 0x82, 0x00, 0x7D, 0xF2, 0x00, 0x11, 0x52, 0x00, 0x13, 0x57, 0x00, 0x15, 0xB5, 0x00, 0x15, 0x15, 0x00, 0x3D, 0xD5, 0x00, 0x64, 0x35, 0x80, 0x00, 0x6C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x880E, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x28, 0x00, 0x54, 0x44, 0x00, 0x55, 0x93, 0x00, 0x54, 0x7C, 0x00, 0x7C, 0x10, 0x00, 0x10, 0x42, 0x00, 0x13, 0xFF, 0x80, 0x14, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x64, 0xC2, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x880F, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x11, 0xEF, 0x80, 0x13, 0x22, 0x80, 0x7C, 0x42, 0x80, 0x55, 0xF6, 0x80, 0x55, 0x54, 0x80, 0x55, 0x5D, 0x80, 0x55, 0xF0, 0x00, 0x55, 0x55, 0x00, 0x7D, 0x57, 0x80, 0x11, 0xF5, 0x00, 0x15, 0x11, 0x00, 0x15, 0x17, 0x80, 0x3D, 0x11, 0x00, 0x65, 0x11, 0x00, 0x02, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8810, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x28, 0x00, 0x57, 0xD7, 0x80, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x56, 0xD6, 0x80, 0x54, 0x00, 0x00, 0x7C, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x65, 0x81, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8811, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x12, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x7D, 0x45, 0x00, 0x56, 0x28, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x14, 0x54, 0x00, 0x1C, 0xD6, 0x00, 0x35, 0x93, 0x00, 0x63, 0x11, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8812, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x6A, 0x95, 0x80, 0x24, 0x89, 0x00, 0x2A, 0x95, 0x00, 0x20, 0x81, 0x00, 0x2A, 0x95, 0x00, 0x24, 0x89, 0x00, 0x2A, 0x95, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8813, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x55, 0x7E, 0x80, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x20, 0x00, 0x7C, 0x51, 0x80, 0x11, 0x9B, 0x00, 0x14, 0x6C, 0x00, 0x15, 0x9A, 0x00, 0x3C, 0x69, 0x80, 0x65, 0x88, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8814, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x80, 0x7D, 0x7E, 0x80, 0x10, 0x30, 0x00, 0x14, 0xD9, 0x00, 0x14, 0x2A, 0x00, 0x3C, 0xDC, 0x00, 0x64, 0x2A, 0x00, 0x01, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8815, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x10, 0x80, 0x55, 0xD6, 0x80, 0x55, 0x10, 0x80, 0x54, 0xD6, 0x00, 0x54, 0x00, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x14, 0xFF, 0x00, 0x14, 0xA9, 0x00, 0x3C, 0xA9, 0x00, 0x64, 0xA9, 0x00, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8816, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x7C, 0x48, 0x00, 0x54, 0xFF, 0x80, 0x55, 0x88, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x88, 0x00, 0x10, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x3C, 0x42, 0x00, 0x64, 0x3C, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8818, { 0x00, 0x00, 0x00, 0x10, 0x45, 0x00, 0x10, 0x45, 0x80, 0x11, 0xF4, 0x80, 0x7C, 0x44, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x94, 0x00, 0x54, 0xA4, 0x00, 0x55, 0xFC, 0x00, 0x57, 0x26, 0x00, 0x7D, 0x22, 0x00, 0x11, 0xFA, 0x00, 0x15, 0x22, 0x00, 0x15, 0xFA, 0x00, 0x3D, 0x22, 0x80, 0x65, 0x23, 0x80, 0x01, 0xF9, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8819, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7C, 0xFF, 0x00, 0x54, 0x52, 0x00, 0x55, 0x94, 0x00, 0x54, 0x18, 0x00, 0x54, 0xFF, 0x00, 0x55, 0x81, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x64, 0x42, 0x00, 0x01, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x881A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x64, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x1F, 0x1F, 0x00, 0x71, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x881B, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x44, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x29, 0x00, 0x55, 0x29, 0x00, 0x55, 0xFF, 0x00, 0x7C, 0x09, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x15, 0x0A, 0x00, 0x15, 0x8E, 0x00, 0x3D, 0x44, 0x80, 0x67, 0x0E, 0x80, 0x02, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x881C, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0x22, 0x00, 0x7C, 0xCF, 0x80, 0x11, 0x22, 0x00, 0x38, 0x07, 0x00, 0x35, 0x2B, 0x00, 0x50, 0xC2, 0x80, 0x11, 0x22, 0x00, 0x14, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x8B, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFD, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x881E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x28, 0x48, 0x00, 0x7F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3C, 0x21, 0x00, 0x21, 0x27, 0x00, 0x3E, 0x20, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x81, 0x00, 0x7F, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x881F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x92, 0x00, 0x08, 0x49, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0x95, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFD, 0x00, 0x0A, 0x91, 0x00, 0x0F, 0xFD, 0x00, 0x30, 0x91, 0x00, 0x00, 0xDD, 0x00, 0x01, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8821, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x00, 0x00, 0x1C, 0x86, 0x00, 0x03, 0x4C, 0x00, 0x1C, 0xB0, 0x00, 0x03, 0x2C, 0x00, 0x3C, 0xE3, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x7D, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8822, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xA0, 0x00, 0x3F, 0xFF, 0x80, 0x0C, 0x06, 0x00, 0x37, 0xFD, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xBF, 0x00, 0x14, 0xA5, 0x00, 0x1F, 0xBF, 0x00, 0x07, 0xC7, 0x80, 0x3C, 0x7C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8823, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x94, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xBE, 0x00, 0x2A, 0xAA, 0x00, 0x08, 0xBE, 0x00, 0x08, 0x88, 0x00, 0x0A, 0xFF, 0x80, 0x0F, 0xCA, 0x80, 0x38, 0xCE, 0x80, 0x01, 0x71, 0x80, 0x01, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8827, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x0F, 0xFE, 0x00, 0x3A, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x7D, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8828, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x10, 0x00, 0x55, 0xFF, 0x00, 0x54, 0x11, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x11, 0x55, 0x00, 0x15, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x3D, 0x39, 0x00, 0x67, 0x55, 0x00, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x882D, { 0x00, 0x00, 0x00, 0x30, 0x7C, 0x00, 0x18, 0xC4, 0x00, 0x63, 0x38, 0x00, 0x30, 0x66, 0x00, 0x03, 0x91, 0x80, 0x78, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x7D, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x882E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xF7, 0x00, 0x11, 0x45, 0x00, 0x7D, 0x75, 0x80, 0x55, 0xA8, 0x00, 0x55, 0x77, 0x00, 0x55, 0x25, 0x00, 0x55, 0x52, 0x00, 0x55, 0xF5, 0x80, 0x7C, 0x00, 0x00, 0x11, 0xEF, 0x80, 0x14, 0xA4, 0x80, 0x15, 0x69, 0x80, 0x3C, 0xA2, 0x80, 0x65, 0x2C, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8830, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7C, 0xEE, 0x00, 0x54, 0xAA, 0x00, 0x54, 0xEE, 0x00, 0x54, 0x44, 0x00, 0x55, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x3D, 0xC5, 0x00, 0x64, 0x72, 0x00, 0x01, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8831, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x85, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8832, { 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x23, 0x7F, 0x00, 0x21, 0x55, 0x00, 0x5E, 0xD5, 0x00, 0x00, 0x7F, 0x00, 0x0E, 0x20, 0x00, 0x23, 0x7F, 0x80, 0x21, 0xC8, 0x80, 0x40, 0xBE, 0x80, 0x3F, 0xAA, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x8A, 0x80, 0x2A, 0xDF, 0x80, 0x2F, 0xB1, 0x00, 0x78, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8835, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x88, 0x00, 0x55, 0xFF, 0x00, 0x56, 0x90, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x90, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x11, 0xFF, 0x80, 0x15, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x3D, 0xC9, 0x00, 0x65, 0x79, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8836, { 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x14, 0x80, 0x13, 0xA7, 0x80, 0x2E, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x3F, 0x00, 0x25, 0x25, 0x00, 0x3F, 0x3F, 0x00, 0x05, 0xC5, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8839, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x0F, 0xFE, 0x00, 0x3A, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x7D, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x883A, { 0x00, 0x00, 0x00, 0x1F, 0x7E, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x0A, 0x0A, 0x00, 0x7D, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x883B, { 0x00, 0x00, 0x00, 0x10, 0xE4, 0x00, 0x17, 0xF5, 0x00, 0x28, 0x0A, 0x00, 0x12, 0xE4, 0x80, 0x3E, 0x0F, 0x80, 0x09, 0xE2, 0x00, 0x2A, 0x0A, 0x80, 0x2A, 0xEA, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x42, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x883C, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7D, 0x29, 0x00, 0x55, 0xEF, 0x00, 0x55, 0x29, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x88, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x15, 0xFF, 0x80, 0x3C, 0x42, 0x00, 0x64, 0x3C, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8840, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8841, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8842, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x7F, 0x00, 0x08, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0x99, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x99, 0x00, 0x2A, 0x95, 0x00, 0x2B, 0xF3, 0x00, 0x3E, 0x21, 0x80, 0x60, 0x63, 0x00, 0x00, 0xC2, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8843, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x3F, 0x86, 0x00, 0x2A, 0x8C, 0x00, 0x2A, 0x98, 0x00, 0x2A, 0xAC, 0x00, 0x2A, 0xCB, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x00, 0x2B, 0xC8, 0x00, 0x3E, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8844, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x7E, 0x00, 0x08, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2B, 0xD2, 0x00, 0x3E, 0x12, 0x00, 0x60, 0x12, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8845, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0C, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x3F, 0xC9, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x00, 0x2B, 0xC8, 0x00, 0x3E, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8846, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x01, 0x61, 0x00, 0x02, 0x62, 0x00, 0x0C, 0xD4, 0x00, 0x31, 0x48, 0x00, 0x02, 0x48, 0x00, 0x0C, 0xC4, 0x00, 0x31, 0x42, 0x00, 0x06, 0x41, 0x80, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8848, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x7F, 0x80, 0x08, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2B, 0xE1, 0x00, 0x3E, 0x3F, 0x80, 0x60, 0x61, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8849, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x2A, 0xF3, 0x00, 0x2A, 0x96, 0x00, 0x2A, 0x8C, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0xB3, 0x00, 0x2A, 0xE1, 0x80, 0x2A, 0xBF, 0x00, 0x2B, 0xE1, 0x00, 0x3E, 0x21, 0x00, 0x60, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x884A, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x0C, 0x24, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0xA4, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x84, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x84, 0x00, 0x2B, 0xE5, 0x00, 0x3E, 0xB6, 0x00, 0x60, 0x8C, 0x80, 0x00, 0x9A, 0x80, 0x01, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x884B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x884C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x22, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x884D, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0x9F, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x09, 0x3F, 0x80, 0x18, 0x04, 0x00, 0x28, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x884E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xF7, 0x80, 0x30, 0x40, 0x00, 0x60, 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1B, 0xF7, 0x80, 0x30, 0x41, 0x00, 0x70, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8851, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x18, 0x87, 0x80, 0x31, 0xC0, 0x00, 0x61, 0x60, 0x00, 0x03, 0x30, 0x00, 0x0E, 0x18, 0x00, 0x19, 0xE7, 0x80, 0x30, 0x01, 0x00, 0x70, 0x01, 0x00, 0x13, 0xF1, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0xB1, 0x00, 0x10, 0x81, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8852, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x47, 0x80, 0x08, 0x40, 0x00, 0x13, 0xF8, 0x00, 0x24, 0x80, 0x00, 0x04, 0x80, 0x00, 0x0B, 0x0F, 0x80, 0x19, 0x22, 0x00, 0x28, 0xA2, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x08, 0x92, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x7A, 0x00, 0x0F, 0x8A, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8853, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x47, 0x80, 0x10, 0x40, 0x00, 0x25, 0xF0, 0x00, 0x04, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x09, 0x52, 0x00, 0x19, 0x52, 0x00, 0x19, 0x52, 0x00, 0x29, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8854, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9F, 0x00, 0x08, 0x80, 0x00, 0x11, 0xE0, 0x00, 0x21, 0x02, 0x00, 0x06, 0x3F, 0x00, 0x09, 0xC4, 0x00, 0x18, 0x84, 0x00, 0x28, 0x84, 0x00, 0x4B, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x14, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8855, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x34, 0x10, 0x00, 0x64, 0x10, 0x00, 0x05, 0xD0, 0x00, 0x0C, 0x10, 0x00, 0x1C, 0x1F, 0x80, 0x35, 0xD1, 0x00, 0x75, 0x51, 0x00, 0x15, 0x51, 0x00, 0x15, 0x51, 0x00, 0x15, 0xD1, 0x00, 0x14, 0x11, 0x00, 0x14, 0x11, 0x00, 0x14, 0x11, 0x00, 0x14, 0x33, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8856, { 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x19, 0x27, 0x80, 0x31, 0x20, 0x00, 0x61, 0x20, 0x00, 0x07, 0xF8, 0x00, 0x09, 0x20, 0x00, 0x19, 0x27, 0x80, 0x31, 0x21, 0x00, 0x71, 0x21, 0x00, 0x11, 0x21, 0x00, 0x17, 0xF9, 0x00, 0x10, 0x01, 0x00, 0x11, 0x21, 0x00, 0x13, 0x31, 0x00, 0x12, 0x11, 0x00, 0x16, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8857, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x10, 0x40, 0x00, 0x21, 0xF0, 0x00, 0x04, 0x40, 0x00, 0x04, 0x4F, 0x80, 0x0B, 0xFA, 0x00, 0x18, 0x42, 0x00, 0x28, 0x42, 0x00, 0x09, 0xF2, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8858, { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x19, 0x07, 0x80, 0x11, 0xF0, 0x00, 0x32, 0x40, 0x00, 0x62, 0x40, 0x00, 0x08, 0x40, 0x00, 0x1B, 0xF7, 0x80, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x72, 0x79, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x79, 0x00, 0x13, 0xC1, 0x00, 0x16, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8859, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xF7, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x05, 0xF0, 0x00, 0x08, 0x9F, 0x80, 0x08, 0x92, 0x00, 0x18, 0x92, 0x00, 0x2B, 0xFA, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x885A, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x7B, 0x80, 0x32, 0x48, 0x00, 0x22, 0x48, 0x00, 0x6F, 0xC8, 0x00, 0x12, 0x78, 0x00, 0x12, 0x4F, 0x80, 0x32, 0x49, 0x00, 0x27, 0x49, 0x00, 0x65, 0x79, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x27, 0x49, 0x00, 0x20, 0x9B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x885B, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xF7, 0x80, 0x10, 0x50, 0x00, 0x27, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x19, 0xF1, 0x00, 0x28, 0x01, 0x00, 0x0B, 0xF9, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x0F, 0xFD, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x885C, { 0x00, 0x00, 0x00, 0x0A, 0x10, 0x00, 0x1B, 0x37, 0x80, 0x11, 0x20, 0x00, 0x37, 0xF8, 0x00, 0x60, 0x80, 0x00, 0x09, 0x00, 0x00, 0x1B, 0xF7, 0x80, 0x12, 0x11, 0x00, 0x32, 0x11, 0x00, 0x73, 0xF1, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x13, 0xF3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x885D, { 0x00, 0x00, 0x00, 0x08, 0x70, 0x00, 0x0B, 0xC7, 0x80, 0x10, 0x40, 0x00, 0x24, 0x40, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x47, 0x80, 0x1B, 0xF9, 0x00, 0x1A, 0x49, 0x00, 0x2B, 0xF9, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xF9, 0x00, 0x08, 0x41, 0x00, 0x0B, 0xF9, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFD, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x885E, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x1B, 0xF7, 0x80, 0x31, 0x10, 0x00, 0x67, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xF7, 0x80, 0x1A, 0x11, 0x00, 0x33, 0xF1, 0x00, 0x70, 0x01, 0x00, 0x17, 0xF9, 0x00, 0x10, 0x81, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0xB1, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x885F, { 0x00, 0x00, 0x00, 0x09, 0x50, 0x00, 0x19, 0x57, 0x80, 0x12, 0xA0, 0x00, 0x32, 0xA0, 0x00, 0x61, 0x50, 0x00, 0x09, 0x50, 0x00, 0x18, 0x07, 0x80, 0x13, 0xF1, 0x00, 0x31, 0x01, 0x00, 0x73, 0xF1, 0x00, 0x12, 0x11, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x11, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x11, 0x00, 0x13, 0xF3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8860, { 0x00, 0x00, 0x00, 0x0A, 0x30, 0x00, 0x1A, 0xC7, 0x80, 0x13, 0x08, 0x00, 0x31, 0xF8, 0x00, 0x60, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x1D, 0x17, 0x80, 0x15, 0xF1, 0x00, 0x35, 0x11, 0x00, 0x75, 0xF1, 0x00, 0x15, 0x11, 0x00, 0x15, 0xF1, 0x00, 0x14, 0x01, 0x00, 0x17, 0xFD, 0x00, 0x11, 0x21, 0x00, 0x12, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8861, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x47, 0x80, 0x10, 0xF8, 0x00, 0x25, 0x10, 0x00, 0x06, 0x20, 0x00, 0x09, 0xF0, 0x00, 0x09, 0x5F, 0x80, 0x19, 0xF1, 0x00, 0x29, 0x51, 0x00, 0x09, 0xF1, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFD, 0x00, 0x08, 0x41, 0x00, 0x08, 0xA1, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8862, { 0x00, 0x00, 0x00, 0x0B, 0xB8, 0x00, 0x12, 0xAB, 0x80, 0x23, 0xB8, 0x00, 0x02, 0xA8, 0x00, 0x0B, 0xB8, 0x00, 0x12, 0xAF, 0x80, 0x33, 0xB9, 0x00, 0x11, 0x41, 0x00, 0x13, 0xF1, 0x00, 0x16, 0x41, 0x00, 0x1B, 0xF1, 0x00, 0x12, 0x41, 0x00, 0x13, 0xF1, 0x00, 0x12, 0x41, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8863, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x21, 0x00, 0x02, 0x22, 0x00, 0x0E, 0x14, 0x00, 0x32, 0x18, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x03, 0xF2, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8864, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC8, 0x00, 0x01, 0x90, 0x00, 0x03, 0xE0, 0x00, 0x06, 0xB0, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8865, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x01, 0x10, 0x00, 0x02, 0x18, 0x00, 0x02, 0x94, 0x00, 0x07, 0x13, 0x00, 0x0A, 0x91, 0x00, 0x12, 0x10, 0x00, 0x22, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8868, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x90, 0x00, 0x01, 0x11, 0x00, 0x03, 0x0A, 0x00, 0x0D, 0x0C, 0x00, 0x31, 0x04, 0x00, 0x01, 0x02, 0x00, 0x01, 0xF1, 0x00, 0x1E, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8869, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x51, 0x00, 0x02, 0x49, 0x00, 0x06, 0x6B, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x36, 0x00, 0x1A, 0x14, 0x00, 0x3C, 0x1C, 0x00, 0x6A, 0x08, 0x00, 0x09, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x886B, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x10, 0x80, 0x02, 0x21, 0x00, 0x04, 0x82, 0x00, 0x0D, 0x04, 0x00, 0x16, 0x08, 0x00, 0x25, 0x10, 0x80, 0x04, 0xA1, 0x00, 0x04, 0x02, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x886C, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x0A, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x2C, 0x88, 0x00, 0x4A, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x886E, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x09, 0x0C, 0x00, 0x11, 0x26, 0x00, 0x22, 0x12, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x00, 0x00, 0x03, 0x0C, 0x00, 0x06, 0x88, 0x00, 0x0A, 0x50, 0x00, 0x12, 0x20, 0x00, 0x62, 0x98, 0x00, 0x03, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8870, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xA1, 0x00, 0x03, 0x12, 0x00, 0x0D, 0x14, 0x00, 0x31, 0x08, 0x00, 0x01, 0x06, 0x00, 0x01, 0xF9, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8871, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x26, 0x00, 0x02, 0x24, 0x00, 0x06, 0x3F, 0x00, 0x0C, 0x21, 0x00, 0x08, 0x71, 0x00, 0x1A, 0x53, 0x00, 0x3C, 0x5A, 0x00, 0x6A, 0x4E, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x8E, 0x00, 0x09, 0x9A, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8872, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x88, 0x80, 0x04, 0x88, 0x80, 0x05, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x1C, 0x94, 0x80, 0x2A, 0x92, 0x80, 0x09, 0xA2, 0x80, 0x08, 0xC0, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8875, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x02, 0x41, 0x00, 0x06, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x3C, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x09, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8877, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0xC2, 0x00, 0x01, 0x21, 0x00, 0x02, 0x22, 0x00, 0x0E, 0x14, 0x00, 0x32, 0x08, 0x00, 0x02, 0x74, 0x00, 0x03, 0x82, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8879, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7E, 0x88, 0x00, 0x02, 0x88, 0x00, 0x06, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x88, 0x00, 0x3C, 0x8C, 0x00, 0x6A, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x86, 0x00, 0x08, 0x82, 0x80, 0x08, 0xF3, 0x80, 0x0B, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x887B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x02, 0x42, 0x00, 0x06, 0xFF, 0x80, 0x0C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1A, 0x42, 0x00, 0x3C, 0xFF, 0x80, 0x6A, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x887D, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x7E, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x887E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0D, 0xF6, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xA4, 0x00, 0x06, 0x18, 0x00, 0x3A, 0x08, 0x00, 0x03, 0xE6, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x887F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x02, 0x22, 0x00, 0x04, 0x41, 0x00, 0x09, 0x00, 0x80, 0x0A, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8880, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x7F, 0x80, 0x02, 0x40, 0x80, 0x06, 0xC0, 0x80, 0x0C, 0x3C, 0x80, 0x08, 0x00, 0x80, 0x1A, 0x00, 0x80, 0x3C, 0x0C, 0x80, 0x6A, 0x38, 0x80, 0x08, 0x60, 0x80, 0x08, 0x01, 0x80, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8881, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x91, 0x00, 0x03, 0x12, 0x00, 0x0D, 0x0C, 0x00, 0x31, 0x04, 0x00, 0x01, 0xF2, 0x00, 0x1F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8882, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x7E, 0x00, 0x02, 0x12, 0x00, 0x04, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x1C, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x18, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x09, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8884, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x09, 0xE0, 0x00, 0x7E, 0x20, 0x00, 0x04, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x1B, 0xFF, 0x00, 0x2C, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x09, 0x07, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8885, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x09, 0x50, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0x02, 0x00, 0x00, 0x92, 0x00, 0x7F, 0xFA, 0x00, 0x02, 0x8A, 0x00, 0x06, 0x54, 0x00, 0x0A, 0x20, 0x00, 0x32, 0x9E, 0x00, 0x03, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8888, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x13, 0xBF, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x22, 0x00, 0x0D, 0x14, 0x00, 0x31, 0x68, 0x00, 0x03, 0x86, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x888B, { 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x7F, 0x80, 0x1F, 0xC0, 0x00, 0x28, 0x20, 0x00, 0x08, 0x18, 0x80, 0x08, 0x07, 0x80, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x21, 0x00, 0x02, 0x22, 0x00, 0x0E, 0x14, 0x00, 0x32, 0x0C, 0x00, 0x03, 0xE6, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x888D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x7F, 0x00, 0x02, 0x81, 0x00, 0x05, 0x01, 0x00, 0x0A, 0x7D, 0x00, 0x0C, 0x45, 0x00, 0x1A, 0x45, 0x00, 0x28, 0x7D, 0x00, 0x08, 0x41, 0x00, 0x08, 0x46, 0x00, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8892, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x02, 0x41, 0x00, 0x04, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8896, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x01, 0x24, 0x80, 0x02, 0x24, 0x80, 0x04, 0xA4, 0x80, 0x05, 0x24, 0x80, 0x0E, 0x3F, 0x80, 0x15, 0x24, 0x80, 0x24, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x04, 0x24, 0x80, 0x04, 0x24, 0x80, 0x04, 0x3F, 0x80, 0x04, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8897, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x02, 0x89, 0x80, 0x05, 0x08, 0x00, 0x08, 0x12, 0x00, 0x0A, 0x22, 0x00, 0x1C, 0x44, 0x00, 0x2A, 0x88, 0x80, 0x08, 0x11, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x08, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8898, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x80, 0x00, 0x06, 0x88, 0x00, 0x0D, 0x4B, 0x00, 0x08, 0x4D, 0x00, 0x1A, 0x59, 0x00, 0x3C, 0x69, 0x00, 0x6A, 0xCB, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x40, 0x80, 0x08, 0x61, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8899, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x06, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x09, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x3C, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x09, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x889A, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x26, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x06, 0x20, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x72, 0x00, 0x1A, 0x56, 0x00, 0x3C, 0x54, 0x00, 0x6A, 0xDC, 0x00, 0x08, 0x88, 0x00, 0x09, 0x9C, 0x00, 0x0B, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x889B, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF8, 0x00, 0x7E, 0x88, 0x00, 0x02, 0x88, 0x00, 0x06, 0x88, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x1A, 0x88, 0x00, 0x3C, 0x8C, 0x00, 0x6A, 0x84, 0x00, 0x08, 0xE4, 0x00, 0x09, 0x86, 0x80, 0x08, 0x02, 0x80, 0x09, 0xFB, 0x80, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x889C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x1A, 0x2A, 0x00, 0x3C, 0x2A, 0x00, 0x6A, 0x2A, 0x00, 0x09, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x889E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x20, 0x80, 0x03, 0x11, 0x00, 0x05, 0x12, 0x00, 0x09, 0x0C, 0x00, 0x31, 0x04, 0x00, 0x01, 0xE2, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x889F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0xC8, 0x00, 0x06, 0x88, 0x00, 0x0C, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x6A, 0x1C, 0x00, 0x09, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88A0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x1C, 0x1C, 0x00, 0x71, 0x47, 0x80, 0x07, 0x62, 0x00, 0x1C, 0x34, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88A2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x7E, 0x88, 0x80, 0x02, 0x08, 0x00, 0x06, 0x7F, 0x00, 0x0C, 0x08, 0x00, 0x09, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x3C, 0xFF, 0x80, 0x6A, 0x08, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88A4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x18, 0x00, 0x00, 0xA0, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x41, 0x00, 0x06, 0x42, 0x00, 0x39, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC3, 0x00, 0x07, 0x66, 0x00, 0x7C, 0x38, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88A8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x08, 0x62, 0x00, 0x1A, 0x36, 0x00, 0x3C, 0x1C, 0x00, 0x6A, 0x08, 0x00, 0x08, 0x18, 0x00, 0x08, 0x31, 0x00, 0x08, 0x21, 0x00, 0x08, 0x6F, 0x80, 0x08, 0xF8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88AA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1A, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x08, 0x32, 0x00, 0x08, 0x22, 0x00, 0x08, 0x2F, 0x00, 0x08, 0x79, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88AB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x89, 0x00, 0x04, 0x88, 0x00, 0x0A, 0xFF, 0x00, 0x0C, 0xA1, 0x00, 0x1C, 0xA2, 0x00, 0x2A, 0x92, 0x00, 0x08, 0x94, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8C, 0x00, 0x09, 0x14, 0x00, 0x09, 0x22, 0x00, 0x0A, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88AD, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x14, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x40, 0x00, 0x02, 0x78, 0x00, 0x05, 0xC2, 0x00, 0x08, 0x3E, 0x00, 0x11, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x84, 0x00, 0x04, 0x88, 0x00, 0x1C, 0x50, 0x00, 0x65, 0x30, 0x00, 0x06, 0x0E, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88AE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x88, 0x00, 0x07, 0x88, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1A, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x88, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x06, 0x34, 0x00, 0x7C, 0x18, 0x00, 0x07, 0xCE, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88B1, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x10, 0x45, 0x00, 0x10, 0x45, 0x80, 0x7C, 0xC4, 0x80, 0x04, 0x84, 0x00, 0x0D, 0xBF, 0x80, 0x1A, 0x84, 0x00, 0x10, 0x84, 0x00, 0x34, 0x84, 0x00, 0x58, 0x8E, 0x00, 0x14, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x10, 0x8A, 0x00, 0x10, 0x9B, 0x00, 0x10, 0x91, 0x00, 0x10, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88B4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x24, 0x00, 0x04, 0x42, 0x00, 0x04, 0xBD, 0x00, 0x0B, 0x00, 0x80, 0x1C, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88B5, { 0x00, 0x00, 0x00, 0x10, 0x43, 0x00, 0x10, 0x46, 0x00, 0x10, 0x5C, 0x00, 0x7C, 0xC4, 0x00, 0x04, 0x84, 0x00, 0x0D, 0x84, 0x00, 0x1A, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x34, 0x84, 0x00, 0x58, 0x84, 0x00, 0x14, 0x84, 0x00, 0x12, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x9F, 0x00, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88B7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x7E, 0x36, 0x00, 0x02, 0x63, 0x00, 0x06, 0xC1, 0x80, 0x0C, 0x00, 0x00, 0x09, 0x3E, 0x00, 0x1B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x6B, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88BA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x1A, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x6A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88BC, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x00, 0xC4, 0x00, 0x7E, 0xA8, 0x00, 0x05, 0x10, 0x00, 0x08, 0x28, 0x00, 0x1A, 0x44, 0x00, 0x2D, 0x83, 0x00, 0x4A, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88BD, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x47, 0x80, 0x7C, 0x44, 0x80, 0x07, 0xF4, 0x80, 0x0C, 0x94, 0x80, 0x18, 0x94, 0x80, 0x10, 0x94, 0x80, 0x35, 0x94, 0x80, 0x59, 0x34, 0x80, 0x15, 0x24, 0x80, 0x13, 0xE4, 0x80, 0x10, 0x54, 0x80, 0x10, 0xD4, 0x80, 0x11, 0x87, 0x80, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88BE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x48, 0x00, 0x06, 0xC8, 0x00, 0x0C, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x2A, 0x00, 0x3C, 0x2A, 0x00, 0x6A, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88BF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x09, 0x00, 0x00, 0x1A, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88C0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x02, 0x88, 0x80, 0x06, 0xBE, 0x80, 0x0C, 0x88, 0x80, 0x08, 0x88, 0x80, 0x1A, 0x9C, 0x80, 0x3C, 0x94, 0x80, 0x6A, 0x94, 0x80, 0x08, 0xA2, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88C1, { 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x02, 0x22, 0x00, 0x1F, 0xE0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x02, 0x21, 0x00, 0x3F, 0xD1, 0x00, 0x05, 0x32, 0x00, 0x09, 0x52, 0x00, 0x38, 0x8C, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xB4, 0x80, 0x38, 0x22, 0x80, 0x00, 0xC1, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88C2, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xE9, 0x00, 0x04, 0x09, 0x00, 0x07, 0xC9, 0x00, 0x08, 0x49, 0x00, 0x14, 0x89, 0x00, 0x23, 0x09, 0x00, 0x06, 0x43, 0x00, 0x18, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x22, 0x00, 0x0D, 0x14, 0x00, 0x31, 0x08, 0x00, 0x01, 0xF6, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88C3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x7E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1A, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x09, 0x1E, 0x00, 0x08, 0x13, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88C4, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x4F, 0x00, 0x10, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x05, 0x00, 0x00, 0x0C, 0x40, 0x00, 0x18, 0x5F, 0x80, 0x10, 0x82, 0x00, 0x34, 0x82, 0x00, 0x59, 0x82, 0x00, 0x14, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88C5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x10, 0x00, 0x37, 0xFF, 0x80, 0x14, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x75, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x42, 0x00, 0x06, 0x66, 0x00, 0x7C, 0x34, 0x00, 0x04, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88C6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x00, 0x56, 0x00, 0x7E, 0x58, 0x00, 0x04, 0x12, 0x00, 0x08, 0xFF, 0x00, 0x1A, 0x02, 0x00, 0x2C, 0x02, 0x00, 0x4A, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88C9, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x7E, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1A, 0xFC, 0x00, 0x2C, 0xA2, 0x00, 0x4A, 0xA4, 0x00, 0x08, 0x98, 0x00, 0x08, 0x90, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA7, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88CA, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x87, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x22, 0x00, 0x0C, 0x34, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88CB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x02, 0x7E, 0x00, 0x06, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x6A, 0x42, 0x00, 0x08, 0x66, 0x00, 0x08, 0x24, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88CC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x02, 0x49, 0x00, 0x06, 0x49, 0x00, 0x0C, 0x49, 0x00, 0x08, 0xAA, 0x80, 0x1A, 0xAA, 0x80, 0x3C, 0x1C, 0x00, 0x6A, 0x14, 0x00, 0x09, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88CD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x02, 0x88, 0x80, 0x06, 0xBE, 0x80, 0x0C, 0x88, 0x80, 0x08, 0x9C, 0x80, 0x1A, 0x9C, 0x80, 0x3C, 0xAA, 0x80, 0x6A, 0xAA, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88CE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x02, 0x42, 0x00, 0x06, 0x7E, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x1A, 0xF8, 0x00, 0x3C, 0x10, 0x00, 0x6A, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88CF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x12, 0x00, 0x3E, 0x0C, 0x00, 0x03, 0xF6, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88D1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x02, 0x42, 0x00, 0x06, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x09, 0x42, 0x00, 0x1A, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x6A, 0x43, 0x80, 0x09, 0xFE, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x32, 0x00, 0x09, 0xC2, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88D2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x41, 0x00, 0x06, 0x63, 0x00, 0x1C, 0x36, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88D3, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0xA8, 0x00, 0x0C, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x1B, 0xFB, 0x00, 0x3C, 0xAA, 0x00, 0x6A, 0xAE, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x8E, 0x80, 0x09, 0x1A, 0x80, 0x08, 0x33, 0x80, 0x08, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88D4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x90, 0x00, 0x07, 0x0C, 0x00, 0x39, 0x03, 0x80, 0x01, 0xF8, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x12, 0x1F, 0x00, 0x1D, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88D5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x41, 0x00, 0x02, 0x88, 0x80, 0x04, 0x14, 0x00, 0x04, 0x22, 0x00, 0x0A, 0x41, 0x00, 0x1C, 0x80, 0x80, 0x2A, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88D8, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x18, 0x86, 0x00, 0x0C, 0xDC, 0x00, 0x02, 0xB0, 0x00, 0x0E, 0x9C, 0x00, 0x38, 0x07, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x22, 0x00, 0x0C, 0x34, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88D9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x02, 0xFF, 0x80, 0x04, 0x12, 0x00, 0x05, 0x12, 0x00, 0x0A, 0x7E, 0x00, 0x1C, 0x20, 0x00, 0x1A, 0x20, 0x00, 0x28, 0x7E, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x09, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88DB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x18, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x01, 0x62, 0x00, 0x07, 0x34, 0x00, 0x7C, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88DC, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x0A, 0x88, 0x80, 0x0C, 0x88, 0x80, 0x1A, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88DD, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x09, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x21, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x21, 0x00, 0x05, 0x12, 0x00, 0x09, 0x0C, 0x00, 0x31, 0xF6, 0x00, 0x0E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88DE, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x04, 0x00, 0x08, 0x66, 0x00, 0x7E, 0xC3, 0x00, 0x03, 0x81, 0x80, 0x06, 0xFF, 0x00, 0x0C, 0x81, 0x00, 0x08, 0x81, 0x00, 0x1A, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x6A, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88DF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x92, 0x00, 0x21, 0x11, 0x00, 0x1A, 0x10, 0x80, 0x08, 0x10, 0x00, 0x10, 0x71, 0x80, 0x10, 0x0E, 0x00, 0x21, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xA1, 0x00, 0x07, 0x12, 0x00, 0x39, 0x0C, 0x00, 0x01, 0xE6, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88E1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x05, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x1C, 0x08, 0x00, 0x1A, 0x08, 0x00, 0x29, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88E2, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x12, 0x10, 0x00, 0x11, 0x14, 0x00, 0x01, 0x7E, 0x00, 0x7C, 0x20, 0x00, 0x08, 0x28, 0x00, 0x13, 0x48, 0x00, 0x15, 0x7E, 0x00, 0x39, 0x08, 0x00, 0x55, 0x0A, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x12, 0x8B, 0x00, 0x14, 0x7E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88E3, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x00, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x05, 0x14, 0x00, 0x0A, 0xFB, 0x00, 0x1A, 0x00, 0x00, 0x2D, 0x24, 0x00, 0x4A, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88E4, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x18, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x7F, 0x24, 0x00, 0x05, 0xFE, 0x00, 0x09, 0x40, 0x00, 0x1B, 0x94, 0x00, 0x2D, 0xFE, 0x00, 0x4B, 0x10, 0x00, 0x09, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88E5, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x08, 0xDF, 0x00, 0x08, 0x42, 0x00, 0x01, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x05, 0x7A, 0x00, 0x09, 0x4A, 0x00, 0x1B, 0x4A, 0x00, 0x2D, 0x7A, 0x00, 0x4B, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88E7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x80, 0x08, 0x49, 0x80, 0x7E, 0xDD, 0x00, 0x02, 0x94, 0x00, 0x06, 0x36, 0x00, 0x0C, 0x63, 0x00, 0x08, 0xC9, 0x80, 0x1A, 0x08, 0x00, 0x3C, 0x48, 0x80, 0x6A, 0x49, 0x80, 0x08, 0xDD, 0x00, 0x08, 0x94, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88E8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x02, 0x91, 0x00, 0x04, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x1C, 0x91, 0x00, 0x2A, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88EF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x02, 0xBE, 0x80, 0x06, 0x88, 0x80, 0x0C, 0xBE, 0x80, 0x08, 0x88, 0x80, 0x1A, 0x80, 0x80, 0x3C, 0xBE, 0x80, 0x6A, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x09, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88F0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x7D, 0xAD, 0x00, 0x04, 0x42, 0x00, 0x0C, 0xA5, 0x00, 0x19, 0x08, 0x80, 0x10, 0x00, 0x00, 0x35, 0xEF, 0x00, 0x58, 0x21, 0x00, 0x15, 0x21, 0x00, 0x10, 0xCA, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x2A, 0x00, 0x12, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88F1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x1A, 0x28, 0x00, 0x3C, 0x68, 0x80, 0x6A, 0x4D, 0x80, 0x08, 0xC5, 0x00, 0x09, 0x46, 0x00, 0x08, 0x42, 0x00, 0x08, 0x73, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88F2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x11, 0x00, 0x19, 0x11, 0x00, 0x11, 0xDD, 0x00, 0x35, 0x55, 0x00, 0x59, 0x55, 0x00, 0x15, 0x55, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88F3, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xA0, 0x00, 0x03, 0x13, 0x00, 0x0D, 0x0C, 0x00, 0x31, 0x04, 0x00, 0x01, 0xE2, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88F4, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x1F, 0x9F, 0x80, 0x00, 0x90, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x90, 0x00, 0x03, 0xDF, 0x80, 0x1D, 0x10, 0x00, 0x02, 0x50, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x90, 0x00, 0x07, 0x09, 0x00, 0x39, 0x36, 0x00, 0x01, 0xC1, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88F5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x01, 0xD0, 0x00, 0x3F, 0x1F, 0x80, 0x02, 0x10, 0x00, 0x04, 0xD0, 0x00, 0x19, 0x22, 0x00, 0x03, 0x14, 0x00, 0x0D, 0x08, 0x00, 0x31, 0x06, 0x00, 0x01, 0xF1, 0x80, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88F7, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x52, 0x00, 0x08, 0x91, 0x00, 0x7E, 0x10, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x24, 0x00, 0x0C, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x3C, 0x81, 0x00, 0x6D, 0x7E, 0x80, 0x0A, 0x42, 0x00, 0x08, 0x46, 0x00, 0x08, 0x40, 0x00, 0x08, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88F8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x02, 0xFF, 0x80, 0x04, 0x88, 0x80, 0x0A, 0x88, 0x80, 0x0C, 0xFF, 0x80, 0x1A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88F9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x44, 0x00, 0x32, 0x62, 0x00, 0x0C, 0x35, 0x80, 0x74, 0x18, 0x00, 0x07, 0xCE, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88FC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x02, 0x7E, 0x00, 0x06, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x1A, 0x20, 0x00, 0x3C, 0x7F, 0x80, 0x6A, 0xCA, 0x80, 0x09, 0x92, 0x80, 0x08, 0x24, 0x80, 0x08, 0xC9, 0x80, 0x08, 0x11, 0x00, 0x08, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x88FD, { 0x00, 0x00, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x22, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0xC3, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x11, 0x00, 0x0D, 0x0A, 0x00, 0x31, 0xF6, 0x00, 0x1F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x88FE, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x7C, 0x81, 0x00, 0x04, 0xFF, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x1A, 0xFF, 0x80, 0x14, 0x88, 0x00, 0x38, 0x88, 0x00, 0x54, 0xBF, 0x00, 0x14, 0xA1, 0x00, 0x11, 0xA1, 0x00, 0x11, 0x21, 0x00, 0x13, 0x21, 0x00, 0x10, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8901, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0C, 0x8C, 0x00, 0x70, 0x83, 0x80, 0x01, 0x46, 0x00, 0x07, 0x6C, 0x00, 0x7C, 0x38, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8902, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x11, 0xF2, 0x00, 0x7C, 0x42, 0x00, 0x04, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x1B, 0xFB, 0x00, 0x10, 0x02, 0x80, 0x34, 0x42, 0x80, 0x58, 0x42, 0x00, 0x15, 0xF2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x7A, 0x00, 0x13, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8904, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x04, 0xFF, 0x00, 0x0C, 0x11, 0x00, 0x19, 0xFF, 0x80, 0x10, 0x11, 0x00, 0x34, 0xFF, 0x00, 0x58, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x10, 0x22, 0x00, 0x10, 0x46, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x17, 0x00, 0x11, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8906, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x06, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x1A, 0xFF, 0x80, 0x3C, 0x08, 0x00, 0x6A, 0x48, 0x00, 0x08, 0x4F, 0x00, 0x08, 0x48, 0x00, 0x08, 0xE8, 0x00, 0x09, 0xB8, 0x00, 0x0B, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8907, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x28, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x42, 0x00, 0x08, 0xA4, 0x00, 0x0B, 0x18, 0x00, 0x08, 0x66, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x890A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x05, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x35, 0x7F, 0x00, 0x59, 0x55, 0x00, 0x15, 0x55, 0x00, 0x11, 0x7F, 0x00, 0x13, 0x55, 0x00, 0x12, 0x55, 0x00, 0x16, 0x55, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x890C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x80, 0x7D, 0x10, 0x80, 0x04, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x18, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x34, 0xFF, 0x00, 0x58, 0x91, 0x00, 0x14, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x890D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x02, 0xFF, 0x80, 0x06, 0x00, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x1A, 0x10, 0x00, 0x3C, 0xFF, 0x80, 0x6A, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x890E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x06, 0x0E, 0x00, 0x3C, 0x78, 0x00, 0x20, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x2A, 0x00, 0x20, 0x6B, 0x00, 0x3E, 0xC9, 0x80, 0x00, 0x08, 0x00, 0x01, 0xC6, 0x00, 0x07, 0x6C, 0x00, 0x7C, 0x38, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x890F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x06, 0x10, 0x00, 0x3C, 0xFF, 0x00, 0x20, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x91, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC6, 0x00, 0x07, 0x6C, 0x00, 0x7C, 0x38, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8910, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x05, 0x10, 0x00, 0x0A, 0x20, 0x00, 0x1C, 0x7F, 0x80, 0x2A, 0xC8, 0x80, 0x09, 0x54, 0x80, 0x08, 0x62, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8912, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x04, 0x38, 0x00, 0x04, 0x56, 0x00, 0x05, 0x91, 0x80, 0x00, 0xA2, 0x00, 0x01, 0x24, 0x00, 0x07, 0x18, 0x00, 0x39, 0x08, 0x00, 0x01, 0xF6, 0x00, 0x1F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8913, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0xA2, 0x00, 0x3E, 0xA2, 0x00, 0x03, 0xA2, 0x00, 0x05, 0xBE, 0x00, 0x0A, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x8C, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x9A, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xC9, 0x00, 0x08, 0x88, 0x80, 0x08, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8915, { 0x00, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x08, 0x18, 0x00, 0x08, 0x6C, 0x00, 0x7E, 0xC6, 0x00, 0x03, 0xBB, 0x80, 0x06, 0x00, 0x00, 0x0D, 0xE4, 0x80, 0x09, 0x24, 0x80, 0x1B, 0xAD, 0x80, 0x3D, 0x69, 0x00, 0x6B, 0x29, 0x00, 0x09, 0xA9, 0x00, 0x09, 0x6D, 0x80, 0x09, 0x24, 0x80, 0x09, 0x24, 0x80, 0x09, 0x64, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8916, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x02, 0x04, 0x00, 0x07, 0xFF, 0x80, 0x0C, 0x20, 0x00, 0x08, 0x51, 0x00, 0x1A, 0x9A, 0x00, 0x3C, 0x2C, 0x00, 0x6A, 0x48, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8918, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x22, 0x00, 0x03, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x90, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8919, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xE7, 0x80, 0x3E, 0x24, 0x00, 0x02, 0x64, 0x00, 0x05, 0xA4, 0x80, 0x0A, 0x27, 0x80, 0x0C, 0x00, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x891A, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x12, 0x00, 0x02, 0x16, 0x00, 0x06, 0x14, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x0C, 0x00, 0x1A, 0x12, 0x00, 0x3C, 0x3F, 0x00, 0x6A, 0xE1, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x891B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0xA8, 0x00, 0x09, 0x24, 0x00, 0x1A, 0x23, 0x00, 0x2C, 0x40, 0x00, 0x4B, 0xFF, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x08, 0x00, 0x08, 0xD0, 0x00, 0x08, 0x20, 0x00, 0x08, 0xD8, 0x00, 0x0B, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x891C, { 0x00, 0x00, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x81, 0x00, 0x3E, 0xF9, 0x00, 0x23, 0x49, 0x00, 0x3E, 0x79, 0x00, 0x22, 0x47, 0x00, 0x62, 0x60, 0x80, 0x4E, 0x3F, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x22, 0x00, 0x0C, 0x34, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x891D, { 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x11, 0xB3, 0x00, 0x10, 0x92, 0x00, 0x7C, 0xFE, 0x00, 0x04, 0x92, 0x00, 0x0C, 0x92, 0x00, 0x18, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x34, 0x92, 0x00, 0x58, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x891E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x02, 0x5D, 0x00, 0x06, 0x55, 0x00, 0x0C, 0x63, 0x00, 0x09, 0x7F, 0x00, 0x1A, 0x00, 0x00, 0x3C, 0x7F, 0x00, 0x6A, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8920, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x24, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x3C, 0x91, 0x00, 0x6B, 0xFF, 0x80, 0x08, 0x91, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x08, 0x97, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8921, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x7E, 0x20, 0x00, 0x04, 0x50, 0x00, 0x08, 0x88, 0x00, 0x1D, 0x04, 0x00, 0x2A, 0xFB, 0x00, 0x4C, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8925, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x3E, 0xFF, 0x00, 0x02, 0x80, 0x00, 0x04, 0xFF, 0x80, 0x04, 0xA9, 0x00, 0x0A, 0xA6, 0x00, 0x1C, 0xBA, 0x80, 0x2C, 0xE1, 0x80, 0x0A, 0x82, 0x00, 0x08, 0xFF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x82, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8926, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8B, 0x00, 0x11, 0xAE, 0x00, 0x7D, 0x28, 0x00, 0x07, 0xD8, 0x80, 0x0C, 0x09, 0x80, 0x19, 0xE7, 0x00, 0x11, 0x20, 0x00, 0x35, 0x20, 0x00, 0x59, 0xE8, 0x00, 0x15, 0x2B, 0x00, 0x11, 0x2E, 0x00, 0x11, 0xE8, 0x00, 0x11, 0x28, 0x80, 0x11, 0x29, 0x80, 0x11, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8927, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x08, 0x00, 0x22, 0x48, 0x80, 0x3E, 0x49, 0x80, 0x22, 0xDD, 0x00, 0x3E, 0x94, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x62, 0x41, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x22, 0x00, 0x0C, 0x34, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8928, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x02, 0x10, 0x00, 0x06, 0x7E, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1A, 0xFF, 0x00, 0x3C, 0x10, 0x00, 0x6A, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x892A, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x5F, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x04, 0x1F, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x91, 0x00, 0x1C, 0x1F, 0x00, 0x1A, 0x18, 0x80, 0x29, 0xD5, 0x00, 0x08, 0x52, 0x00, 0x08, 0x53, 0x00, 0x08, 0x5C, 0x80, 0x08, 0x70, 0x00, 0x08, 0x9F, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x892B, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x10, 0x0E, 0x00, 0x11, 0xF8, 0x00, 0x7D, 0x0F, 0x00, 0x05, 0x08, 0x00, 0x0D, 0x7F, 0x80, 0x19, 0x48, 0x80, 0x11, 0x4E, 0x00, 0x35, 0x78, 0x80, 0x59, 0x4F, 0x80, 0x15, 0x40, 0x00, 0x11, 0x52, 0x00, 0x11, 0x52, 0x00, 0x12, 0x52, 0x80, 0x10, 0xB2, 0x80, 0x10, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8930, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1C, 0x8E, 0x00, 0x70, 0x83, 0x80, 0x0F, 0xFC, 0x00, 0x02, 0x42, 0x00, 0x3C, 0x34, 0x00, 0x07, 0x98, 0x00, 0x1C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8931, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1E, 0x9E, 0x00, 0x00, 0x80, 0x00, 0x1E, 0x9E, 0x00, 0x00, 0x81, 0x00, 0x06, 0x63, 0x00, 0x1C, 0x36, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8932, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x00, 0x02, 0x88, 0x00, 0x06, 0xFF, 0x80, 0x0C, 0x88, 0x00, 0x08, 0xBF, 0x00, 0x1A, 0xA9, 0x00, 0x3C, 0xBF, 0x00, 0x6A, 0xA9, 0x00, 0x08, 0xBF, 0x00, 0x09, 0x88, 0x00, 0x09, 0x7F, 0x80, 0x0B, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8934, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x09, 0x48, 0x00, 0x09, 0x4A, 0x00, 0x01, 0x5F, 0x00, 0x7F, 0x50, 0x00, 0x05, 0x68, 0x00, 0x09, 0x44, 0x00, 0x1A, 0x40, 0x00, 0x2C, 0x02, 0x00, 0x4B, 0xFF, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8935, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x02, 0x55, 0x00, 0x06, 0x49, 0x00, 0x0C, 0x55, 0x00, 0x08, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x3C, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x08, 0x90, 0x80, 0x08, 0x94, 0x80, 0x08, 0xBA, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8936, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x52, 0x80, 0x3E, 0x94, 0x80, 0x03, 0x39, 0x80, 0x04, 0x52, 0x80, 0x04, 0x9C, 0x80, 0x0A, 0x31, 0x80, 0x1C, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8938, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x92, 0x00, 0x04, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0xFE, 0x00, 0x1C, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x09, 0xE8, 0x00, 0x08, 0x3C, 0x00, 0x0B, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8939, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x13, 0xE4, 0x00, 0x7C, 0x84, 0x00, 0x04, 0x9F, 0x00, 0x0F, 0xE5, 0x00, 0x19, 0x45, 0x00, 0x11, 0x45, 0x00, 0x36, 0x75, 0x00, 0x58, 0x8D, 0x00, 0x14, 0x87, 0x00, 0x13, 0xE5, 0x00, 0x10, 0x8D, 0x00, 0x10, 0x89, 0x00, 0x13, 0xE9, 0x00, 0x10, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x893A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3E, 0x00, 0x7F, 0xCA, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0x9A, 0x00, 0x04, 0x16, 0x80, 0x3F, 0xB2, 0x80, 0x04, 0x61, 0x80, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x22, 0x00, 0x0C, 0x34, 0x00, 0x74, 0x18, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x893B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x04, 0x7E, 0x00, 0x3F, 0x92, 0x00, 0x0A, 0x32, 0x00, 0x35, 0x1A, 0x80, 0x1F, 0xA3, 0x80, 0x04, 0x40, 0x00, 0x3F, 0xA3, 0x00, 0x01, 0x2C, 0x00, 0x06, 0x10, 0x00, 0x3C, 0x0C, 0x00, 0x05, 0xE3, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x893E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0xA4, 0x80, 0x06, 0xA4, 0x80, 0x0C, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1A, 0x7F, 0x00, 0x3C, 0x00, 0x00, 0x6A, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x4A, 0x00, 0x08, 0xCB, 0x00, 0x09, 0x89, 0x80, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8940, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x08, 0x00, 0x06, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1A, 0x41, 0x00, 0x3C, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8941, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xCE, 0x00, 0x08, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x02, 0x4A, 0x00, 0x05, 0xCE, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x1F, 0x00, 0x1D, 0x15, 0x00, 0x2B, 0xD5, 0x00, 0x08, 0x55, 0x00, 0x08, 0x5F, 0x00, 0x08, 0x44, 0x00, 0x08, 0x45, 0x00, 0x08, 0x87, 0x00, 0x0B, 0x38, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8942, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x08, 0x3C, 0x00, 0x7E, 0x42, 0x00, 0x02, 0x94, 0x80, 0x06, 0xF7, 0x80, 0x0C, 0x08, 0x00, 0x08, 0x14, 0x00, 0x1A, 0x22, 0x00, 0x3C, 0xC9, 0x80, 0x6A, 0x10, 0x00, 0x08, 0x64, 0x00, 0x08, 0x1B, 0x00, 0x08, 0x66, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8943, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x06, 0x3E, 0x00, 0x3C, 0x22, 0x00, 0x20, 0x3E, 0x00, 0x3E, 0x08, 0x00, 0x20, 0xFF, 0x80, 0x20, 0x2A, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x88, 0x80, 0x01, 0xC6, 0x00, 0x07, 0x6C, 0x00, 0x7C, 0x38, 0x00, 0x07, 0x8E, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8944, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xBE, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xA1, 0x00, 0x07, 0x12, 0x00, 0x39, 0x0C, 0x00, 0x03, 0xF6, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8945, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x02, 0x88, 0x80, 0x06, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x08, 0x49, 0x00, 0x1A, 0xFF, 0x80, 0x3C, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8946, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x94, 0x80, 0x08, 0x55, 0x00, 0x7E, 0x14, 0x00, 0x02, 0xFF, 0x80, 0x06, 0x41, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x1A, 0x08, 0x00, 0x3C, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8949, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x7E, 0xF7, 0x80, 0x02, 0x94, 0x80, 0x06, 0xF7, 0x80, 0x0C, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x1A, 0xA2, 0x80, 0x3C, 0xBE, 0x80, 0x6A, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x08, 0xA6, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x894C, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7C, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x92, 0x00, 0x18, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x34, 0x92, 0x00, 0x58, 0x92, 0x00, 0x14, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x894D, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x24, 0x00, 0x08, 0x7F, 0x80, 0x7E, 0xC8, 0x00, 0x02, 0x7F, 0x00, 0x06, 0x48, 0x00, 0x0C, 0x7F, 0x00, 0x09, 0x48, 0x00, 0x1A, 0x7F, 0x80, 0x3C, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x09, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x894F, { 0x00, 0x00, 0x00, 0x10, 0xF2, 0x00, 0x10, 0x14, 0x80, 0x11, 0xA9, 0x00, 0x7C, 0x46, 0x00, 0x07, 0x81, 0x80, 0x0C, 0x00, 0x00, 0x19, 0xCE, 0x00, 0x10, 0x4A, 0x00, 0x35, 0xCA, 0x80, 0x59, 0x11, 0x80, 0x15, 0xC0, 0x00, 0x10, 0x7F, 0x80, 0x10, 0x51, 0x00, 0x10, 0x4A, 0x00, 0x10, 0xC4, 0x00, 0x11, 0xBB, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8952, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x11, 0x52, 0x00, 0x13, 0x5B, 0x80, 0x7E, 0x4E, 0x80, 0x04, 0x44, 0x80, 0x0F, 0xFA, 0x80, 0x1A, 0x4A, 0x80, 0x12, 0x4A, 0x80, 0x36, 0x4B, 0x80, 0x5A, 0xE9, 0x00, 0x17, 0x59, 0x00, 0x12, 0x49, 0x00, 0x12, 0x4B, 0x00, 0x12, 0x4A, 0x80, 0x12, 0x4A, 0x80, 0x12, 0x1C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8956, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x05, 0x55, 0x00, 0x0D, 0x11, 0x00, 0x09, 0x7D, 0x00, 0x19, 0x39, 0x00, 0x35, 0x55, 0x00, 0x79, 0x11, 0x00, 0x14, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8957, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x7E, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x06, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x1A, 0x42, 0x00, 0x3C, 0x24, 0x00, 0x6A, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x895A, { 0x00, 0x00, 0x00, 0x12, 0x0E, 0x00, 0x13, 0x23, 0x00, 0x11, 0x61, 0x80, 0x7C, 0x5E, 0x80, 0x05, 0x08, 0x00, 0x0D, 0x90, 0x80, 0x18, 0xA9, 0x80, 0x10, 0x09, 0x00, 0x35, 0x94, 0x00, 0x58, 0xA6, 0x00, 0x14, 0x8D, 0x00, 0x10, 0x94, 0x80, 0x10, 0xA4, 0x00, 0x11, 0x8C, 0x00, 0x11, 0x40, 0x00, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x895B, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x55, 0x00, 0x06, 0x7F, 0x00, 0x0C, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x80, 0x00, 0x3C, 0xBF, 0x00, 0x6A, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0xA9, 0x00, 0x08, 0xAD, 0x00, 0x09, 0x36, 0x00, 0x08, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x895C, { 0x00, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x48, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x92, 0x00, 0x02, 0xE3, 0x80, 0x06, 0x9E, 0x00, 0x0C, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x1A, 0x80, 0x00, 0x3C, 0x9E, 0x00, 0x6A, 0x80, 0x00, 0x08, 0x9E, 0x00, 0x08, 0x80, 0x00, 0x08, 0xBF, 0x00, 0x09, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x895E, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xBF, 0x80, 0x10, 0x91, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x28, 0xBF, 0x80, 0x68, 0x84, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x06, 0x34, 0x00, 0x7C, 0x18, 0x00, 0x07, 0xCE, 0x00, 0x1C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x895F, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x42, 0x00, 0x02, 0xE7, 0x00, 0x05, 0x5A, 0x80, 0x0A, 0x52, 0x00, 0x0C, 0x42, 0x00, 0x1C, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8960, { 0x00, 0x00, 0x00, 0x10, 0x91, 0x00, 0x10, 0xD3, 0x00, 0x10, 0x52, 0x00, 0x7D, 0xFF, 0x80, 0x05, 0x00, 0x80, 0x0D, 0x7E, 0x80, 0x18, 0x42, 0x00, 0x10, 0x7E, 0x00, 0x34, 0x00, 0x00, 0x58, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8961, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x7E, 0xA9, 0x00, 0x02, 0xFF, 0x00, 0x06, 0x20, 0x00, 0x0C, 0x7F, 0x80, 0x08, 0xD0, 0x80, 0x1A, 0x7C, 0x80, 0x3C, 0x54, 0x80, 0x6A, 0x54, 0x80, 0x09, 0x7C, 0x80, 0x08, 0x14, 0x80, 0x08, 0x3D, 0x80, 0x08, 0xE5, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8962, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x41, 0x00, 0x06, 0x5D, 0x00, 0x0C, 0x55, 0x00, 0x09, 0x5D, 0x00, 0x1A, 0x41, 0x00, 0x3C, 0x7F, 0x00, 0x6A, 0x22, 0x00, 0x09, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8963, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x02, 0x42, 0x00, 0x06, 0x7E, 0x00, 0x0C, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x1A, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x6A, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8964, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x44, 0x00, 0x3F, 0xF7, 0x80, 0x05, 0x18, 0x00, 0x05, 0xF0, 0x00, 0x09, 0x40, 0x00, 0x0B, 0xF7, 0x80, 0x1D, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x29, 0x00, 0x09, 0x29, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8966, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x05, 0x10, 0x80, 0x0D, 0xD6, 0x80, 0x19, 0x10, 0x80, 0x10, 0xD6, 0x00, 0x34, 0x00, 0x00, 0x59, 0xFF, 0x80, 0x14, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x896A, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x02, 0xFF, 0x80, 0x04, 0xA2, 0x80, 0x09, 0xFF, 0x80, 0x0A, 0x0A, 0x00, 0x1C, 0x89, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x86, 0x00, 0x09, 0x04, 0x00, 0x09, 0x1A, 0x80, 0x0A, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x896B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x05, 0xD7, 0x00, 0x0C, 0x92, 0x00, 0x19, 0xD7, 0x00, 0x11, 0x55, 0x00, 0x35, 0xD7, 0x00, 0x59, 0x55, 0x00, 0x15, 0x55, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x28, 0x00, 0x10, 0x6C, 0x00, 0x10, 0xC6, 0x00, 0x13, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x896D, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x9F, 0x80, 0x10, 0x84, 0x00, 0x7F, 0xEF, 0x00, 0x04, 0x89, 0x00, 0x0C, 0x89, 0x00, 0x1B, 0xEF, 0x00, 0x10, 0x09, 0x00, 0x34, 0x09, 0x00, 0x59, 0xEF, 0x00, 0x15, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x2F, 0x00, 0x11, 0xE0, 0x00, 0x10, 0x09, 0x00, 0x10, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x896E, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x02, 0x7E, 0x00, 0x06, 0x24, 0x00, 0x0C, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x1A, 0xFF, 0x80, 0x3C, 0x24, 0x00, 0x6A, 0x52, 0x00, 0x09, 0xD5, 0x80, 0x08, 0x38, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x896F, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x9F, 0x00, 0x13, 0xF1, 0x00, 0x7D, 0x51, 0x00, 0x05, 0x5F, 0x00, 0x0D, 0x51, 0x00, 0x1B, 0xF1, 0x00, 0x10, 0x9F, 0x00, 0x34, 0x91, 0x00, 0x5B, 0xF1, 0x00, 0x14, 0x9F, 0x00, 0x11, 0xCA, 0x00, 0x12, 0xAA, 0x00, 0x14, 0x9A, 0x80, 0x10, 0x92, 0x80, 0x10, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8970, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x9F, 0x80, 0x13, 0xE4, 0x80, 0x78, 0x89, 0x80, 0x0B, 0xE0, 0x00, 0x0A, 0xAF, 0x80, 0x1A, 0xA8, 0x80, 0x12, 0xAF, 0x80, 0x37, 0xE8, 0x80, 0x58, 0x8F, 0x80, 0x15, 0x88, 0x80, 0x11, 0xC8, 0x80, 0x12, 0xAF, 0x80, 0x12, 0xA5, 0x00, 0x14, 0x8D, 0x80, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8972, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x1F, 0x01, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x80, 0x11, 0x3F, 0x80, 0x13, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x42, 0x00, 0x0A, 0x34, 0x00, 0x33, 0xEC, 0x00, 0x1E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8973, { 0x00, 0x00, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA5, 0x00, 0x11, 0x55, 0x80, 0x7D, 0x54, 0x80, 0x04, 0x04, 0x00, 0x0D, 0xFF, 0x80, 0x18, 0xA4, 0x00, 0x11, 0xB5, 0x00, 0x34, 0xA5, 0x00, 0x59, 0xB5, 0x00, 0x14, 0xA7, 0x00, 0x11, 0xB2, 0x00, 0x10, 0xA6, 0x00, 0x10, 0xF6, 0x80, 0x13, 0x8B, 0x80, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8974, { 0x00, 0x00, 0x00, 0x11, 0xE7, 0x80, 0x11, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x7D, 0x24, 0x80, 0x05, 0xE7, 0x80, 0x0D, 0x10, 0x80, 0x19, 0x7E, 0x80, 0x11, 0x10, 0x80, 0x35, 0x7E, 0x80, 0x59, 0x56, 0x80, 0x15, 0x7A, 0x80, 0x11, 0x52, 0x80, 0x11, 0x7E, 0x80, 0x11, 0x34, 0x80, 0x11, 0x52, 0x80, 0x11, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8975, { 0x00, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x10, 0x78, 0x00, 0x7C, 0x48, 0x00, 0x04, 0x78, 0x00, 0x0C, 0x4E, 0x00, 0x19, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x37, 0xFF, 0x80, 0x59, 0x4A, 0x00, 0x15, 0xCE, 0x00, 0x11, 0x4A, 0x00, 0x11, 0xCE, 0x00, 0x11, 0x4A, 0x00, 0x13, 0xDE, 0x00, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8977, { 0x00, 0x00, 0x00, 0x10, 0xD0, 0x00, 0x11, 0x9B, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x9B, 0x00, 0x05, 0x29, 0x00, 0x0D, 0xAB, 0x00, 0x19, 0x29, 0x00, 0x13, 0xFF, 0x80, 0x34, 0x44, 0x00, 0x58, 0xBA, 0x00, 0x15, 0x11, 0x00, 0x12, 0xFE, 0x80, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x897A, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7C, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x0E, 0x54, 0x80, 0x1A, 0x94, 0x80, 0x13, 0xBF, 0x80, 0x36, 0x55, 0x80, 0x5A, 0x95, 0x80, 0x17, 0xFF, 0x80, 0x12, 0x54, 0x80, 0x12, 0xF6, 0x80, 0x13, 0x5D, 0x80, 0x12, 0x50, 0x80, 0x12, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x897B, { 0x00, 0x00, 0x00, 0x10, 0xAA, 0x00, 0x13, 0xD7, 0x80, 0x10, 0xAA, 0x00, 0x7D, 0xD7, 0x00, 0x06, 0xAA, 0x80, 0x0C, 0x82, 0x00, 0x18, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x34, 0x44, 0x00, 0x58, 0xFA, 0x00, 0x1B, 0x11, 0x80, 0x14, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x897C, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x48, 0x00, 0x7C, 0x84, 0x00, 0x05, 0xE4, 0x00, 0x0C, 0x8F, 0x00, 0x1B, 0xF5, 0x00, 0x11, 0x2D, 0x00, 0x36, 0xB7, 0x00, 0x59, 0xC5, 0x00, 0x18, 0x85, 0x00, 0x15, 0xE9, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x11, 0xFD, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x897D, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x24, 0x00, 0x7D, 0xE7, 0x80, 0x05, 0x24, 0x80, 0x0D, 0xE7, 0x80, 0x19, 0x24, 0x80, 0x11, 0xE7, 0x80, 0x35, 0x10, 0x80, 0x59, 0xFF, 0x80, 0x15, 0x52, 0x80, 0x11, 0x76, 0x80, 0x11, 0x5A, 0x80, 0x11, 0x7E, 0x80, 0x11, 0x38, 0x80, 0x11, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x897E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x897F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x12, 0x13, 0x00, 0x14, 0x1F, 0x00, 0x18, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8981, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x04, 0x08, 0x00, 0x0F, 0x90, 0x00, 0x10, 0x78, 0x00, 0x03, 0x86, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8983, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8986, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x3F, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x15, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x7F, 0x00, 0x28, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x09, 0xC4, 0x00, 0x08, 0x38, 0x00, 0x0B, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8987, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x0A, 0x91, 0x00, 0x0F, 0x91, 0x00, 0x02, 0x1F, 0x00, 0x1F, 0xD1, 0x00, 0x12, 0x51, 0x00, 0x1F, 0xDF, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xE1, 0x00, 0x02, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8988, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x23, 0xE1, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x1F, 0x80, 0x1F, 0x11, 0x00, 0x11, 0x33, 0x00, 0x7F, 0xCA, 0x00, 0x08, 0x0E, 0x00, 0x0F, 0x04, 0x00, 0x19, 0x0E, 0x00, 0x31, 0x1B, 0x00, 0x67, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8989, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x23, 0xE1, 0x00, 0x12, 0x08, 0x00, 0x7F, 0xBF, 0x80, 0x12, 0x12, 0x00, 0x1E, 0x21, 0x80, 0x08, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x29, 0x01, 0x00, 0x3F, 0x39, 0x00, 0x08, 0x29, 0x00, 0x7F, 0xB9, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x898A, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x23, 0xE1, 0x00, 0x14, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x44, 0x00, 0x1C, 0x7F, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x7E, 0xAA, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x898B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x80, 0x08, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x898D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x60, 0x81, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x80, 0x0C, 0x19, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x898F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x1F, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0x24, 0x80, 0x11, 0x44, 0x80, 0x20, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8990, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x91, 0x00, 0x20, 0xA0, 0x00, 0x3F, 0x80, 0x00, 0x20, 0x91, 0x00, 0x20, 0x8A, 0x00, 0x3F, 0x84, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x11, 0x00, 0x12, 0x20, 0x80, 0x33, 0x00, 0x80, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8993, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xC2, 0x00, 0x08, 0x21, 0x00, 0x10, 0x10, 0x80, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8994, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x0C, 0x8C, 0x00, 0x38, 0x87, 0x00, 0x6F, 0xFD, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x80, 0x0C, 0x19, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8995, { 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x13, 0x21, 0x00, 0x12, 0x21, 0x00, 0x56, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x5D, 0xA1, 0x00, 0x58, 0xBF, 0x00, 0x10, 0x14, 0x00, 0x30, 0x14, 0x00, 0x51, 0x14, 0x80, 0x1B, 0x34, 0x80, 0x0E, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8996, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xE1, 0x00, 0x04, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x25, 0x14, 0x00, 0x25, 0x14, 0x00, 0x25, 0x24, 0x80, 0x04, 0x47, 0x80, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8997, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x00, 0x01, 0x21, 0x00, 0x01, 0x21, 0x00, 0x3D, 0x3F, 0x00, 0x01, 0x21, 0x00, 0x01, 0x21, 0x00, 0x3D, 0x3F, 0x00, 0x25, 0x21, 0x00, 0x25, 0x21, 0x00, 0x25, 0x3F, 0x00, 0x3D, 0x12, 0x00, 0x01, 0x12, 0x00, 0x01, 0x12, 0x80, 0x01, 0x32, 0x80, 0x07, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8998, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x42, 0x41, 0x00, 0x42, 0x7F, 0x00, 0x42, 0x24, 0x00, 0x42, 0x24, 0x00, 0x42, 0x24, 0x80, 0x7E, 0x64, 0x80, 0x01, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x899A, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x19, 0x86, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x06, 0x10, 0x80, 0x1C, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x899B, { 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x07, 0x3F, 0x00, 0x3C, 0x21, 0x00, 0x20, 0x21, 0x00, 0x23, 0xBF, 0x00, 0x2E, 0x21, 0x00, 0x28, 0x21, 0x00, 0x28, 0xBF, 0x00, 0x2D, 0xA1, 0x00, 0x2D, 0x21, 0x00, 0x2E, 0x3F, 0x00, 0x2A, 0x14, 0x00, 0x6B, 0x14, 0x00, 0x49, 0x14, 0x80, 0x49, 0xB4, 0x80, 0x08, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x899C, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x1F, 0x00, 0x0A, 0x51, 0x00, 0x6A, 0xD1, 0x00, 0x3A, 0x9F, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x1F, 0x00, 0x0B, 0x91, 0x00, 0x3A, 0xD1, 0x00, 0x6A, 0x1F, 0x00, 0x0A, 0x0A, 0x00, 0x1A, 0x0A, 0x00, 0x12, 0x4A, 0x80, 0x32, 0xDA, 0x80, 0x61, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x899F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x00, 0x11, 0x00, 0x04, 0x11, 0x00, 0x16, 0x9F, 0x00, 0x52, 0xCA, 0x00, 0x50, 0x4A, 0x00, 0x51, 0x0A, 0x80, 0x59, 0x1A, 0x80, 0x0F, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x7F, 0xFF, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x1F, 0xBF, 0x00, 0x30, 0x94, 0x00, 0x50, 0x94, 0x00, 0x10, 0x94, 0x80, 0x10, 0xB4, 0x80, 0x1F, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x2E, 0xA1, 0x00, 0x2C, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x07, 0xD2, 0x00, 0x38, 0x12, 0x00, 0x00, 0x22, 0x80, 0x00, 0x42, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89A5, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x3F, 0x00, 0x0A, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x7F, 0xD4, 0x00, 0x00, 0x14, 0x00, 0x11, 0x14, 0x80, 0x31, 0xB4, 0x80, 0x60, 0xA3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89A6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x00, 0x1B, 0x21, 0x00, 0x31, 0xA1, 0x00, 0x60, 0xFF, 0x00, 0x1F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x7A, 0xBF, 0x00, 0x4A, 0xA1, 0x00, 0x6A, 0xA1, 0x00, 0x5D, 0x3F, 0x00, 0x6D, 0x14, 0x00, 0x5A, 0x94, 0x00, 0x4A, 0x94, 0x80, 0x4A, 0xB4, 0x80, 0x5A, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89A7, { 0x00, 0x00, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x1F, 0x80, 0x3F, 0xA0, 0x00, 0x20, 0x80, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x80, 0x0E, 0x11, 0x80, 0x78, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89A9, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x3F, 0x00, 0x1F, 0xD1, 0x00, 0x02, 0x51, 0x00, 0x02, 0x9F, 0x00, 0x3F, 0xF1, 0x00, 0x02, 0x11, 0x00, 0x05, 0x1F, 0x00, 0x08, 0x91, 0x00, 0x1F, 0x91, 0x00, 0x28, 0x9F, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0x8A, 0x00, 0x08, 0x92, 0x80, 0x08, 0xA2, 0x80, 0x0F, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89AA, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x0A, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xE1, 0x00, 0x04, 0x3F, 0x00, 0x0E, 0x14, 0x00, 0x0D, 0x14, 0x00, 0x14, 0x24, 0x80, 0x24, 0x47, 0x80, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89AC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x7F, 0xA1, 0x00, 0x00, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x21, 0x14, 0x00, 0x33, 0x14, 0x00, 0x12, 0x14, 0x80, 0x1F, 0x34, 0x80, 0x70, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89AF, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x3F, 0x9F, 0x00, 0x11, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x11, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x8A, 0x00, 0x7F, 0xCA, 0x00, 0x20, 0x8A, 0x80, 0x20, 0x9A, 0x80, 0x21, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x9F, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x24, 0x5F, 0x00, 0x27, 0x11, 0x00, 0x3C, 0x51, 0x00, 0x27, 0xDF, 0x00, 0x20, 0x11, 0x00, 0x2F, 0x91, 0x00, 0x28, 0x9F, 0x00, 0x2F, 0x8A, 0x00, 0x68, 0x8A, 0x00, 0x4F, 0x8A, 0x80, 0x48, 0x9A, 0x80, 0x1F, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B2, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x12, 0x80, 0x3F, 0xA2, 0x80, 0x00, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x68, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0xC1, 0x00, 0x12, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x64, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x14, 0x00, 0x3F, 0x34, 0x00, 0x24, 0x24, 0x80, 0x3F, 0x64, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B4, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7A, 0x3F, 0x00, 0x4C, 0x61, 0x00, 0x2A, 0xA1, 0x00, 0x11, 0x3F, 0x00, 0x2E, 0xA1, 0x00, 0x40, 0x61, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x14, 0x00, 0x11, 0x14, 0x00, 0x1A, 0x14, 0x80, 0x0F, 0xB4, 0x80, 0x78, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x7B, 0xD1, 0x00, 0x4A, 0x5F, 0x00, 0x7B, 0xD1, 0x00, 0x40, 0x51, 0x00, 0x5F, 0x5F, 0x00, 0x51, 0x51, 0x00, 0x5F, 0x51, 0x00, 0x51, 0x5F, 0x00, 0x5F, 0x4A, 0x00, 0x51, 0x4A, 0x00, 0x53, 0x4A, 0x80, 0x40, 0x5A, 0x80, 0x40, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B6, { 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x7F, 0x1F, 0x00, 0x14, 0x91, 0x00, 0x22, 0x51, 0x00, 0x3F, 0xDF, 0x00, 0x00, 0x51, 0x00, 0x3F, 0xD1, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x29, 0x51, 0x00, 0x2E, 0xDF, 0x00, 0x20, 0x4A, 0x00, 0x3F, 0x4A, 0x00, 0x29, 0x4A, 0x80, 0x26, 0x5A, 0x80, 0x29, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89B7, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x9F, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x24, 0x5F, 0x00, 0x27, 0x91, 0x00, 0x3C, 0x11, 0x00, 0x24, 0x5F, 0x00, 0x23, 0xD1, 0x00, 0x20, 0x11, 0x00, 0x25, 0x1F, 0x00, 0x35, 0x4A, 0x00, 0x75, 0x4A, 0x00, 0x5D, 0xCA, 0x80, 0x45, 0x1A, 0x80, 0x1F, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89BA, { 0x00, 0x00, 0x00, 0x06, 0x0E, 0x00, 0x08, 0xA2, 0x00, 0x0E, 0x4E, 0x00, 0x08, 0xA2, 0x00, 0x0E, 0x4E, 0x00, 0x08, 0xA2, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x06, 0x10, 0x80, 0x38, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x15, 0x11, 0x00, 0x24, 0x91, 0x00, 0x7F, 0xDF, 0x00, 0x44, 0x51, 0x00, 0x6E, 0xD1, 0x00, 0x55, 0x5F, 0x00, 0x6E, 0xD1, 0x00, 0x44, 0x51, 0x00, 0x6E, 0xDF, 0x00, 0x55, 0x4A, 0x00, 0x6E, 0xCA, 0x00, 0x44, 0x4A, 0x80, 0x44, 0x5A, 0x80, 0x45, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89BD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x80, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x55, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x03, 0x10, 0x80, 0x3C, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89BF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x52, 0x51, 0x00, 0x7F, 0xDF, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x8A, 0x00, 0x3F, 0x8A, 0x80, 0x11, 0x1A, 0x80, 0x60, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89C0, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x1F, 0xD1, 0x00, 0x12, 0x5F, 0x00, 0x1F, 0xD1, 0x00, 0x08, 0x91, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0x91, 0x00, 0x32, 0x11, 0x00, 0x1F, 0x9F, 0x00, 0x12, 0x0A, 0x00, 0x1F, 0x8A, 0x00, 0x12, 0x12, 0x80, 0x1F, 0xD2, 0x80, 0x10, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89C1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x09, 0x48, 0x00, 0x02, 0x40, 0x00, 0x02, 0x41, 0x00, 0x04, 0x41, 0x00, 0x18, 0x3F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C2, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x84, 0x00, 0x02, 0x94, 0x00, 0x22, 0x94, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x12, 0xB4, 0x00, 0x22, 0x50, 0x00, 0x40, 0x50, 0x00, 0x00, 0x91, 0x00, 0x03, 0x11, 0x00, 0x0C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x94, 0x00, 0x3E, 0x94, 0x00, 0x08, 0x94, 0x00, 0x0A, 0x94, 0x00, 0x7F, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x20, 0x00, 0x14, 0x48, 0x00, 0x12, 0x48, 0x00, 0x20, 0x89, 0x00, 0x41, 0x09, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C5, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x48, 0x00, 0x01, 0x40, 0x00, 0x02, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C6, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x01, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x05, 0x24, 0x00, 0x09, 0x24, 0x00, 0x19, 0x24, 0x00, 0x2D, 0x24, 0x00, 0x4B, 0x34, 0x00, 0x09, 0x54, 0x00, 0x08, 0x50, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C7, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x82, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x9A, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x22, 0x49, 0x00, 0x00, 0x89, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C8, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x24, 0x42, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x90, 0x00, 0x25, 0x08, 0x00, 0x24, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x02, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89C9, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x04, 0x88, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x40, 0x0A, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xC8, 0x00, 0x09, 0x48, 0x00, 0x09, 0x48, 0x00, 0x02, 0x42, 0x00, 0x04, 0x42, 0x00, 0x38, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89CA, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x24, 0xBF, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0xAA, 0x00, 0x00, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x00, 0xAA, 0x00, 0x00, 0xAA, 0x00, 0x1F, 0xAA, 0x00, 0x10, 0x8C, 0x00, 0x10, 0x14, 0x00, 0x11, 0x94, 0x00, 0x16, 0x25, 0x00, 0x18, 0x45, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89CB, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xBF, 0x00, 0x7F, 0xE2, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x2E, 0xAA, 0x00, 0x44, 0x6A, 0x00, 0x04, 0x0C, 0x00, 0x07, 0xD4, 0x00, 0x7C, 0x14, 0x00, 0x20, 0x25, 0x00, 0x00, 0x45, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89CC, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x05, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x7F, 0xEA, 0x00, 0x12, 0xAA, 0x00, 0x0A, 0x2A, 0x00, 0x32, 0x2A, 0x00, 0x0A, 0x2A, 0x00, 0x7F, 0x8C, 0x00, 0x02, 0x14, 0x00, 0x04, 0x14, 0x00, 0x06, 0x25, 0x00, 0x09, 0x45, 0x00, 0x30, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89CE, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x3F, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x40, 0x6A, 0x00, 0x38, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3A, 0xAA, 0x00, 0x2A, 0x8C, 0x00, 0x3A, 0x94, 0x00, 0x28, 0x94, 0x00, 0x2A, 0xA5, 0x00, 0x29, 0x45, 0x00, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89CF, { 0x00, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x0A, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x0A, 0x2A, 0x00, 0x7F, 0xEA, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0x8C, 0x00, 0x24, 0x94, 0x00, 0x7F, 0xD4, 0x00, 0x20, 0xA5, 0x00, 0x22, 0xC5, 0x00, 0x21, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89D0, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x11, 0x3F, 0x00, 0x7F, 0xE2, 0x00, 0x11, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0x8C, 0x00, 0x04, 0x14, 0x00, 0x3F, 0x94, 0x00, 0x04, 0x25, 0x00, 0x7F, 0xC5, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89D1, { 0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x07, 0xBF, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xEA, 0x00, 0x24, 0xAA, 0x00, 0x27, 0x2A, 0x00, 0x3C, 0xAA, 0x00, 0x27, 0xAA, 0x00, 0x20, 0x2A, 0x00, 0x25, 0x2A, 0x00, 0x35, 0x4C, 0x00, 0x2D, 0x94, 0x00, 0x25, 0x14, 0x00, 0x25, 0x25, 0x00, 0x5F, 0xC5, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89D2, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x2F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89D4, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x29, 0x08, 0x80, 0x29, 0x08, 0x80, 0x3F, 0x08, 0x80, 0x29, 0x08, 0x80, 0x29, 0x08, 0x80, 0x3F, 0x08, 0x80, 0x21, 0x18, 0x80, 0x21, 0x10, 0x80, 0x21, 0x31, 0x80, 0x61, 0x61, 0x00, 0x47, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89D5, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x1E, 0x00, 0x14, 0x32, 0x00, 0x14, 0x24, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x48, 0x80, 0x64, 0x48, 0x80, 0x04, 0x7F, 0x80, 0x07, 0x48, 0x80, 0x1C, 0x48, 0x80, 0x74, 0x7F, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0xC0, 0x80, 0x04, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89D6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x10, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x11, 0x00, 0x29, 0x11, 0x00, 0x29, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x14, 0x00, 0x3F, 0x14, 0x00, 0x21, 0x16, 0x00, 0x21, 0x32, 0x00, 0x21, 0x23, 0x00, 0x61, 0x61, 0x00, 0x47, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89D7, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x0E, 0x00, 0x32, 0x78, 0x00, 0x24, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x3E, 0x7F, 0x80, 0x2A, 0x48, 0x00, 0x2A, 0x4C, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x46, 0x00, 0x22, 0x42, 0x80, 0x62, 0x73, 0x80, 0x47, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89D8, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x29, 0x6B, 0x00, 0x29, 0x49, 0x00, 0x3F, 0xC9, 0x80, 0x29, 0x08, 0x00, 0x29, 0x39, 0x00, 0x3F, 0x03, 0x00, 0x21, 0x02, 0x00, 0x21, 0x06, 0x00, 0x21, 0x0C, 0x00, 0x61, 0x18, 0x00, 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89DA, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x0E, 0x00, 0x32, 0x7A, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x22, 0x53, 0x00, 0x22, 0x55, 0x00, 0x22, 0x5D, 0x00, 0x62, 0xB5, 0x80, 0x46, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89DC, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x14, 0x26, 0x00, 0x17, 0xBC, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x80, 0x1F, 0xB1, 0x80, 0x72, 0x1F, 0x00, 0x07, 0xE0, 0x00, 0x0C, 0x40, 0x00, 0x3F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x02, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89DD, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x1E, 0x07, 0x00, 0x32, 0x3C, 0x00, 0x24, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x29, 0x24, 0x00, 0x29, 0x3F, 0x80, 0x3F, 0x24, 0x00, 0x29, 0x24, 0x00, 0x29, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x36, 0x00, 0x21, 0x62, 0x00, 0x21, 0x02, 0x80, 0x61, 0x7B, 0x80, 0x47, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89DE, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x0F, 0x7F, 0x00, 0x12, 0x80, 0x00, 0x14, 0x7C, 0x00, 0x3F, 0x10, 0x00, 0x55, 0x22, 0x00, 0x15, 0x7F, 0x00, 0x1F, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x1F, 0x4A, 0x00, 0x15, 0x52, 0x00, 0x25, 0x92, 0x00, 0x21, 0x2A, 0x00, 0x43, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89E3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x0F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x22, 0x11, 0x00, 0x1F, 0xA6, 0x00, 0x14, 0xC0, 0x00, 0x14, 0x94, 0x00, 0x1F, 0x94, 0x00, 0x14, 0xBF, 0x00, 0x14, 0xC4, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x21, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89E5, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x49, 0x00, 0x32, 0x6B, 0x00, 0x24, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x29, 0x14, 0x00, 0x29, 0x14, 0x00, 0x3F, 0x14, 0x00, 0x21, 0x14, 0x00, 0x21, 0x34, 0x00, 0x21, 0x24, 0x80, 0x61, 0x64, 0x80, 0x47, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89E6, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x31, 0x04, 0x00, 0x22, 0x3F, 0x80, 0x7F, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xBF, 0x80, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x85, 0x00, 0x20, 0x85, 0x00, 0x60, 0x8F, 0x80, 0x43, 0xB8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89E7, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x1E, 0x63, 0x00, 0x32, 0x22, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x61, 0x08, 0x00, 0x47, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89E9, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x1E, 0x13, 0x00, 0x32, 0x11, 0x00, 0x25, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xD3, 0x00, 0x3E, 0x56, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x18, 0x00, 0x3E, 0x5C, 0x00, 0x22, 0x56, 0x00, 0x22, 0xD3, 0x00, 0x23, 0x91, 0x80, 0x62, 0x10, 0x00, 0x46, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89EB, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x22, 0x6B, 0x00, 0x22, 0x49, 0x00, 0x62, 0xC9, 0x80, 0x46, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89ED, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x14, 0x00, 0x29, 0x22, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x29, 0x01, 0x00, 0x29, 0x39, 0x00, 0x3F, 0x29, 0x00, 0x21, 0x29, 0x00, 0x21, 0x39, 0x00, 0x21, 0x01, 0x00, 0x61, 0x01, 0x00, 0x47, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89EF, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x1E, 0x28, 0x00, 0x24, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x22, 0x10, 0x00, 0x46, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89F1, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x20, 0x00, 0x2F, 0xB2, 0x00, 0x20, 0x16, 0x00, 0x2F, 0x98, 0x00, 0x28, 0x8C, 0x80, 0x6F, 0xF6, 0x80, 0x42, 0x13, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFE, 0x00, 0x30, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89F3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x23, 0x80, 0x7F, 0x80, 0x00, 0x40, 0xBF, 0x00, 0x3F, 0x11, 0x00, 0x12, 0x11, 0x00, 0x3F, 0x9B, 0x00, 0x24, 0x8E, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x8E, 0x00, 0x3F, 0x9B, 0x00, 0x60, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89F4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x3F, 0x80, 0x09, 0x40, 0x00, 0x12, 0xBF, 0x00, 0x24, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x15, 0x20, 0x00, 0x15, 0x7F, 0x80, 0x1F, 0x89, 0x80, 0x11, 0x12, 0x80, 0x11, 0x24, 0x80, 0x21, 0xC9, 0x00, 0x23, 0x36, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89F6, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xF7, 0x80, 0x32, 0x94, 0x80, 0x24, 0xF7, 0x80, 0x7F, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x61, 0x08, 0x00, 0x47, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89F8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x80, 0x11, 0x52, 0x80, 0x12, 0x7F, 0x80, 0x24, 0x10, 0x00, 0x1F, 0x20, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x90, 0x80, 0x1F, 0x7E, 0x80, 0x15, 0x52, 0x80, 0x15, 0x7E, 0x80, 0x1F, 0x12, 0x80, 0x11, 0x1F, 0x80, 0x11, 0xF1, 0x80, 0x11, 0x00, 0x80, 0x23, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x89F9, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x1E, 0x24, 0x00, 0x32, 0x7F, 0x80, 0x24, 0xA4, 0x00, 0x7F, 0x3F, 0x00, 0x29, 0x24, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x24, 0x00, 0x29, 0x3F, 0x80, 0x29, 0x00, 0x00, 0x3F, 0x73, 0x80, 0x21, 0x52, 0x80, 0x21, 0x5E, 0x80, 0x21, 0x40, 0x80, 0x61, 0x40, 0x80, 0x47, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89FD, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x88, 0x80, 0x32, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x7F, 0x24, 0x00, 0x29, 0x7F, 0x80, 0x29, 0xA4, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x24, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x7F, 0x80, 0x21, 0x52, 0x80, 0x21, 0x5E, 0x80, 0x61, 0x40, 0x80, 0x47, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x89FF, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x88, 0x80, 0x32, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x7F, 0x24, 0x00, 0x29, 0x7F, 0x80, 0x29, 0xA4, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x24, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x7F, 0x80, 0x21, 0x52, 0x80, 0x21, 0x5F, 0x80, 0x61, 0x72, 0x80, 0x47, 0x5E, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A03, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x1F, 0x0A, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A04, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x12, 0x3C, 0x00, 0x12, 0x00, 0x00, 0x12, 0x3C, 0x00, 0x12, 0x00, 0x00, 0x12, 0x3C, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x3C, 0x00, 0x32, 0x00, 0x80, 0x23, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A05, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x00, 0x7E, 0x00, 0x3E, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x00, 0x3E, 0x32, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x80, 0x22, 0x62, 0x80, 0x3E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A07, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0x00, 0x80, 0x67, 0xE0, 0x80, 0x00, 0x00, 0x80, 0x3F, 0xFC, 0x80, 0x00, 0x00, 0x80, 0x07, 0xE0, 0x80, 0x00, 0x00, 0x80, 0x07, 0xE0, 0x80, 0x00, 0x00, 0x80, 0x0F, 0xF0, 0x80, 0x08, 0x11, 0x80, 0x08, 0x11, 0x00, 0x0F, 0xF3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A08, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0x80, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x1E, 0xFA, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x12, 0x42, 0x80, 0x12, 0x42, 0x80, 0x1E, 0x81, 0x80, 0x12, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A0E, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xFF, 0x80, 0x1F, 0x02, 0x00, 0x00, 0x22, 0x00, 0x1F, 0x12, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A11, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x48, 0x00, 0x7F, 0x4B, 0x00, 0x00, 0x4D, 0x00, 0x3E, 0x59, 0x00, 0x00, 0x69, 0x00, 0x00, 0xC9, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x48, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x00, 0x22, 0x40, 0x80, 0x22, 0x61, 0x80, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x10, 0x80, 0x7F, 0x10, 0x80, 0x00, 0x10, 0x80, 0x3E, 0x50, 0x80, 0x00, 0x50, 0x80, 0x00, 0xD0, 0x80, 0x3E, 0x90, 0x80, 0x00, 0xB0, 0x80, 0x00, 0x20, 0x80, 0x3E, 0x20, 0x80, 0x22, 0x21, 0x80, 0x22, 0x61, 0x00, 0x22, 0x41, 0x00, 0x3E, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A13, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x89, 0x00, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A14, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A15, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A16, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x06, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x40, 0x00, 0x12, 0x80, 0x80, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A17, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1F, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x00, 0x13, 0x80, 0x1F, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x1F, 0x1F, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x81, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x20, 0x80, 0x11, 0x20, 0x80, 0x1F, 0x3F, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A1B, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x00, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x00, 0x64, 0x80, 0x00, 0x65, 0x00, 0x1E, 0xA6, 0x00, 0x01, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x80, 0x1E, 0x27, 0x80, 0x12, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x01, 0xFF, 0x80, 0x1E, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x24, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x84, 0x00, 0x13, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A1E, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x36, 0x00, 0x22, 0x22, 0x00, 0x22, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x42, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x90, 0x80, 0x1F, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x47, 0x00, 0x12, 0xB8, 0x80, 0x1F, 0xC0, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A20, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0xF9, 0x00, 0x00, 0x09, 0x00, 0x7F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3E, 0x79, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x79, 0x00, 0x00, 0x09, 0x00, 0x3E, 0x09, 0x00, 0x22, 0x19, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x3E, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A22, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0xC4, 0x00, 0x22, 0x84, 0x00, 0x23, 0x84, 0x00, 0x3E, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A23, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1E, 0x09, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x14, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A24, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x63, 0x00, 0x00, 0x36, 0x00, 0x7F, 0x1C, 0x00, 0x00, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x00, 0x00, 0x66, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x3C, 0x00, 0x22, 0x18, 0x00, 0x22, 0x3C, 0x00, 0x22, 0x66, 0x00, 0x3E, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A25, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x1E, 0x88, 0x80, 0x00, 0x94, 0x80, 0x1E, 0xA2, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x80, 0x80, 0x1E, 0x80, 0x80, 0x12, 0x80, 0x80, 0x12, 0x80, 0x80, 0x1E, 0x80, 0x80, 0x12, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A26, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x3C, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x68, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x80, 0x24, 0xCD, 0x80, 0x3D, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A2A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x1F, 0x00, 0x1E, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x21, 0x00, 0x1E, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A2B, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x18, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0xA3, 0x00, 0x00, 0xA1, 0x00, 0x00, 0xA1, 0x80, 0x3E, 0xA0, 0x80, 0x22, 0xA2, 0x00, 0x22, 0x22, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A2C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x4A, 0x00, 0x00, 0x4B, 0x00, 0x3C, 0xC9, 0x80, 0x00, 0x88, 0x80, 0x01, 0x88, 0x00, 0x3C, 0x09, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x02, 0x00, 0x3C, 0x06, 0x00, 0x24, 0x0C, 0x00, 0x24, 0x18, 0x00, 0x24, 0x70, 0x00, 0x3D, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x00, 0x24, 0x00, 0x3F, 0x24, 0x80, 0x00, 0x24, 0x80, 0x00, 0x47, 0x80, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x12, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x08, 0x00, 0x12, 0x14, 0x00, 0x1E, 0x22, 0x00, 0x12, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x26, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x71, 0x00, 0x3E, 0x53, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x4E, 0x00, 0x3E, 0xC4, 0x00, 0x22, 0x8E, 0x00, 0x23, 0x9A, 0x00, 0x22, 0x33, 0x00, 0x3E, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A31, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x46, 0x00, 0x22, 0x42, 0x00, 0x22, 0xC3, 0x00, 0x3E, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A34, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x38, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x1F, 0x2A, 0x00, 0x00, 0x26, 0x00, 0x00, 0x23, 0x00, 0x1F, 0x22, 0x80, 0x11, 0x42, 0x00, 0x11, 0x42, 0x00, 0x1F, 0x42, 0x00, 0x11, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x94, 0x80, 0x00, 0x94, 0x80, 0x3C, 0x94, 0x80, 0x00, 0x94, 0x80, 0x00, 0x94, 0x80, 0x3C, 0xB4, 0x80, 0x00, 0xA7, 0x80, 0x00, 0xE0, 0x80, 0x3C, 0x80, 0x80, 0x24, 0x80, 0x80, 0x24, 0x80, 0x80, 0x24, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x02, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x4A, 0x00, 0x1E, 0x4A, 0x00, 0x00, 0x4A, 0x00, 0x1E, 0x7A, 0x00, 0x00, 0x4A, 0x00, 0x1E, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1E, 0x02, 0x00, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A37, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x48, 0x80, 0x3E, 0x48, 0x80, 0x00, 0x48, 0x80, 0x00, 0x7F, 0x80, 0x3E, 0x48, 0x80, 0x00, 0x48, 0x80, 0x00, 0x48, 0x80, 0x3E, 0x7F, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A3A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x24, 0x00, 0x3F, 0x42, 0x00, 0x00, 0x89, 0x80, 0x01, 0x08, 0x00, 0x1E, 0x12, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x44, 0x00, 0x00, 0x88, 0x80, 0x00, 0x11, 0x00, 0x1E, 0x22, 0x00, 0x12, 0xC4, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x30, 0x00, 0x12, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A3B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4F, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A3D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x40, 0x80, 0x3E, 0x80, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x44, 0x80, 0x3E, 0x44, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0x80, 0x3E, 0x7C, 0x80, 0x22, 0x00, 0x80, 0x22, 0x01, 0x80, 0x22, 0x01, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A3E, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x24, 0x23, 0x00, 0x27, 0xBE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x80, 0x27, 0xB1, 0x80, 0x3C, 0x1F, 0x00, 0x61, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A40, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x0F, 0x80, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A41, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A43, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x32, 0x00, 0x3E, 0x66, 0x00, 0x00, 0x34, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x19, 0x00, 0x22, 0x31, 0x00, 0x22, 0x27, 0x80, 0x3E, 0xFC, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A45, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x63, 0x00, 0x3E, 0xDD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x17, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A46, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x07, 0x00, 0x00, 0x7C, 0x00, 0x7F, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x76, 0x00, 0x22, 0xC2, 0x00, 0x22, 0x02, 0x80, 0x22, 0xFB, 0x80, 0x3E, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A47, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x52, 0x00, 0x3C, 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x6C, 0x00, 0x24, 0x44, 0x00, 0x24, 0xC6, 0x00, 0x24, 0x83, 0x00, 0x3D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A48, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A49, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x38, 0x8F, 0x80, 0x00, 0x84, 0x80, 0x7D, 0xF4, 0x80, 0x00, 0x94, 0x80, 0x38, 0x94, 0x80, 0x00, 0x95, 0x80, 0x01, 0x95, 0x00, 0x39, 0x35, 0x00, 0x03, 0x27, 0x00, 0x01, 0xA2, 0x00, 0x38, 0xE2, 0x00, 0x28, 0x47, 0x00, 0x28, 0xE5, 0x00, 0x29, 0xAD, 0x80, 0x3B, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x00, 0x92, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0x9E, 0x00, 0x3C, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3E, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A50, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x48, 0x00, 0x00, 0x48, 0x00, 0x1E, 0x88, 0x00, 0x00, 0x0F, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A51, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x00, 0x20, 0x00, 0x00, 0x23, 0x00, 0x3E, 0x2E, 0x00, 0x00, 0x38, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x80, 0x22, 0x31, 0x80, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A52, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x30, 0x00, 0x7F, 0x21, 0x00, 0x00, 0x61, 0x00, 0x3E, 0x4F, 0x80, 0x00, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A53, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x62, 0x00, 0x24, 0x42, 0x00, 0x24, 0x5F, 0x00, 0x24, 0xF1, 0x00, 0x3D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x00, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x1F, 0x27, 0x00, 0x00, 0x40, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x20, 0x80, 0x1F, 0x20, 0x80, 0x11, 0x20, 0x80, 0x11, 0x20, 0x80, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x88, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A56, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x3C, 0x89, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0xA1, 0x00, 0x00, 0xA3, 0x00, 0x00, 0xB2, 0x00, 0x3C, 0x96, 0x00, 0x25, 0x8C, 0x00, 0x25, 0x1E, 0x00, 0x27, 0x33, 0x00, 0x3C, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x00, 0xBD, 0x00, 0x3C, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x3C, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x3C, 0xBD, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A58, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x00, 0x88, 0x80, 0x3C, 0x88, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x88, 0x80, 0x3C, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A5C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x88, 0x80, 0x00, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x63, 0x00, 0x00, 0x36, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x1C, 0x00, 0x22, 0x36, 0x00, 0x22, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A5D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x80, 0x80, 0x00, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x1E, 0x00, 0x80, 0x00, 0x3C, 0x80, 0x1E, 0x24, 0x80, 0x00, 0x24, 0x80, 0x00, 0x3C, 0x80, 0x1E, 0x24, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x1E, 0x00, 0x80, 0x12, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A60, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x78, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x80, 0x00, 0xFD, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x2A, 0x00, 0x1E, 0x2A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x89, 0x00, 0x13, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x10, 0x80, 0x7E, 0x10, 0x80, 0x00, 0x10, 0x80, 0x3C, 0x73, 0x80, 0x00, 0xD6, 0x80, 0x00, 0x10, 0x80, 0x3C, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x73, 0x80, 0x3C, 0xD6, 0x80, 0x24, 0x10, 0x80, 0x24, 0x10, 0x80, 0x24, 0x10, 0x80, 0x3C, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A62, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x80, 0x80, 0x01, 0x00, 0x80, 0x02, 0x7C, 0x80, 0x1E, 0x44, 0x80, 0x00, 0x7C, 0x80, 0x1E, 0x44, 0x80, 0x00, 0x7C, 0x80, 0x1E, 0x44, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x1E, 0x01, 0x00, 0x12, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A63, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0x47, 0x00, 0x00, 0x78, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A65, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x7F, 0x36, 0x00, 0x00, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A66, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x0A, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x01, 0xF8, 0x00, 0x1E, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x1E, 0x74, 0x00, 0x12, 0xC2, 0x00, 0x12, 0x02, 0x80, 0x1E, 0x01, 0x80, 0x12, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A67, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xBF, 0x00, 0x18, 0xC1, 0x00, 0x35, 0xE3, 0x00, 0x63, 0x36, 0x00, 0x16, 0xD8, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x03, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A69, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x1E, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x24, 0x00, 0x12, 0x04, 0x00, 0x1E, 0x04, 0x00, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A6B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x00, 0x86, 0x80, 0x3C, 0x1C, 0x00, 0x00, 0x70, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x1F, 0x80, 0x00, 0xF0, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x80, 0x24, 0x19, 0x80, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A6C, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x51, 0x00, 0x3E, 0x51, 0x00, 0x22, 0x91, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A6D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0x22, 0x00, 0x00, 0xC4, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x5F, 0x00, 0x1E, 0x51, 0x00, 0x00, 0x51, 0x00, 0x1E, 0x51, 0x00, 0x00, 0x53, 0x00, 0x1E, 0x50, 0x00, 0x12, 0x50, 0x80, 0x12, 0x90, 0x80, 0x1E, 0x9F, 0x80, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A6E, { 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x14, 0x00, 0x00, 0x22, 0x00, 0x3F, 0x41, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A70, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A71, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1E, 0x0C, 0x00, 0x00, 0x78, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A72, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x1E, 0xA2, 0x00, 0x00, 0x42, 0x00, 0x1E, 0x24, 0x80, 0x00, 0x18, 0x80, 0x00, 0x11, 0x00, 0x1E, 0x22, 0x00, 0x12, 0xC4, 0x00, 0x12, 0x0A, 0x00, 0x1E, 0x31, 0x00, 0x12, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A73, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x1F, 0x22, 0x00, 0x00, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A75, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x28, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x48, 0x00, 0x1E, 0x88, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x44, 0x80, 0x1E, 0x44, 0x80, 0x12, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A76, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3C, 0x49, 0x00, 0x00, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3D, 0x6D, 0x00, 0x01, 0x5B, 0x00, 0x01, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x24, 0xC9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x81, 0x00, 0x3D, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x00, 0xBD, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xBD, 0x00, 0x3C, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x3C, 0xBD, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A79, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x80, 0x29, 0x11, 0x00, 0x09, 0x1F, 0x00, 0x0A, 0x00, 0x00, 0x0D, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0B, 0xFE, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A7A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x1F, 0x00, 0x7F, 0x31, 0x00, 0x00, 0x23, 0x00, 0x3E, 0x72, 0x00, 0x00, 0xD6, 0x00, 0x00, 0x0C, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x70, 0x80, 0x3E, 0x10, 0x80, 0x22, 0x10, 0x80, 0x22, 0x10, 0x80, 0x22, 0x10, 0x80, 0x3E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A7B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x00, 0xE6, 0x00, 0x3D, 0xAC, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x66, 0x00, 0x01, 0xC3, 0x80, 0x00, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A7C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x40, 0x00, 0x00, 0x44, 0x80, 0x3C, 0x54, 0x80, 0x00, 0x55, 0x80, 0x00, 0xD5, 0x00, 0x3C, 0x94, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3C, 0x8E, 0x00, 0x24, 0x0A, 0x00, 0x24, 0x1B, 0x00, 0x24, 0x11, 0x00, 0x3C, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A7E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x01, 0x80, 0x80, 0x3C, 0x28, 0x80, 0x00, 0xAA, 0x80, 0x00, 0x92, 0x80, 0x3C, 0x92, 0x80, 0x00, 0xAA, 0x80, 0x00, 0xAA, 0x80, 0x3C, 0x82, 0x80, 0x24, 0xFE, 0x80, 0x24, 0x01, 0x80, 0x24, 0x01, 0x00, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A7F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x43, 0x80, 0x24, 0x7E, 0x00, 0x25, 0xC2, 0x00, 0x24, 0x02, 0x00, 0x3C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A82, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x01, 0xA4, 0x80, 0x7E, 0xE5, 0x80, 0x00, 0x27, 0x00, 0x3C, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x27, 0x00, 0x00, 0xE5, 0x80, 0x01, 0xA4, 0x80, 0x3C, 0x24, 0x00, 0x24, 0x64, 0x00, 0x24, 0x44, 0x80, 0x24, 0xC4, 0x80, 0x3D, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A83, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x31, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xD6, 0x00, 0x3E, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x74, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x0C, 0x80, 0x00, 0x19, 0x80, 0x3E, 0x75, 0x00, 0x22, 0x03, 0x00, 0x22, 0x06, 0x00, 0x22, 0x1C, 0x00, 0x3E, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A84, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x22, 0x49, 0x00, 0x22, 0xC9, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A85, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x28, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x48, 0x00, 0x1E, 0x88, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x1E, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x13, 0x29, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x7E, 0xBF, 0x00, 0x00, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x9E, 0x00, 0x3C, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x24, 0xBF, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A87, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0xBE, 0x80, 0x1E, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x10, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x01, 0x00, 0x1E, 0x01, 0x00, 0x12, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A89, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0D, 0xEC, 0x00, 0x08, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x60, 0x01, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A8A, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x04, 0x90, 0x00, 0x1F, 0xFF, 0x00, 0x60, 0x02, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x80, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x99, 0x00, 0x24, 0xA9, 0x80, 0x24, 0xA2, 0x80, 0x25, 0xA2, 0x00, 0x3D, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A8C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x24, 0x00, 0x1E, 0xA1, 0x00, 0x12, 0xA1, 0x00, 0x13, 0x22, 0x80, 0x1E, 0x3E, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x21, 0x00, 0x1E, 0x21, 0x00, 0x00, 0x46, 0x00, 0x1E, 0x90, 0x00, 0x01, 0x08, 0x00, 0x00, 0x01, 0x00, 0x1E, 0xA0, 0x80, 0x12, 0xA0, 0x00, 0x13, 0x21, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A8F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x90, 0x80, 0x00, 0x99, 0x80, 0x3C, 0x8B, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x86, 0x00, 0x24, 0xF3, 0x00, 0x3D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A90, { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x3C, 0x4B, 0x00, 0x01, 0xC9, 0x00, 0x7E, 0x48, 0x00, 0x00, 0x48, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x48, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x00, 0x6B, 0x00, 0x01, 0xCA, 0x00, 0x3C, 0x46, 0x00, 0x24, 0x44, 0x00, 0x24, 0x4E, 0x80, 0x24, 0x4B, 0x80, 0x3C, 0xD9, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A91, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x39, 0x5F, 0x00, 0x01, 0xC4, 0x00, 0x7C, 0x84, 0x00, 0x00, 0x84, 0x00, 0x39, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x02, 0x5F, 0x00, 0x38, 0x44, 0x00, 0x00, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x3A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0xFF, 0x80, 0x39, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A92, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x22, 0x00, 0x7E, 0x42, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x41, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x3C, 0x90, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x24, 0x66, 0x00, 0x24, 0xC3, 0x00, 0x3D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A93, { 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x3F, 0xB8, 0x00, 0x04, 0x20, 0x00, 0x07, 0xBF, 0x80, 0x3C, 0x24, 0x00, 0x04, 0x44, 0x00, 0x1D, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xE7, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x84, 0x00, 0x01, 0x14, 0x00, 0x1D, 0xD7, 0x80, 0x00, 0x54, 0x00, 0x1C, 0x54, 0x00, 0x02, 0x54, 0x00, 0x01, 0x54, 0x00, 0x1C, 0x94, 0x00, 0x14, 0xBF, 0x80, 0x15, 0x60, 0x00, 0x1D, 0x1F, 0x80, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A96, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x3E, 0x7F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A97, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x3C, 0x70, 0x80, 0x01, 0xC4, 0x80, 0x7E, 0x44, 0x80, 0x00, 0x44, 0x80, 0x3D, 0xF4, 0x80, 0x00, 0x44, 0x80, 0x00, 0x44, 0x80, 0x3C, 0xE4, 0x80, 0x00, 0xD4, 0x80, 0x01, 0x54, 0x80, 0x3D, 0x40, 0x80, 0x24, 0x40, 0x80, 0x24, 0x40, 0x80, 0x24, 0x40, 0x80, 0x3C, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8A98, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x2A, 0x00, 0x1E, 0x49, 0x00, 0x01, 0x88, 0x80, 0x1E, 0x08, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x27, 0x80, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x1E, 0x80, 0x80, 0x13, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A9A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x49, 0x00, 0x00, 0xC9, 0x80, 0x7F, 0x88, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8A9F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x11, 0x00, 0x00, 0x7D, 0x00, 0x7E, 0x12, 0x00, 0x00, 0x14, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x3D, 0xBE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AA0, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x09, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x1E, 0x88, 0x80, 0x00, 0xF8, 0x80, 0x1E, 0x95, 0x00, 0x00, 0x95, 0x00, 0x00, 0x96, 0x00, 0x1E, 0x94, 0x00, 0x12, 0xA6, 0x80, 0x12, 0x8A, 0x80, 0x1F, 0x11, 0x80, 0x12, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AA1, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1E, 0x09, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0xA8, 0x80, 0x1E, 0xA8, 0x80, 0x00, 0xA9, 0x00, 0x03, 0xF9, 0x00, 0x1E, 0xAA, 0x00, 0x00, 0xAA, 0x00, 0x1E, 0xA4, 0x00, 0x12, 0xAC, 0x80, 0x12, 0x12, 0x80, 0x1E, 0x61, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0xAA, 0x80, 0x00, 0x9C, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x00, 0xA2, 0x00, 0x00, 0xBE, 0x00, 0x1E, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x1E, 0x91, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x82, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AA5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x28, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x48, 0x00, 0x00, 0x88, 0x00, 0x1E, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x88, 0x80, 0x00, 0x88, 0x80, 0x1E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x1E, 0xFF, 0x80, 0x12, 0x88, 0x80, 0x12, 0x88, 0x80, 0x1E, 0x88, 0x80, 0x12, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AA7, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3C, 0x11, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3C, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AA8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x45, 0x00, 0x1E, 0x41, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x92, 0x00, 0x1E, 0x8A, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x82, 0x00, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x80, 0x80, 0x01, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x44, 0x80, 0x1E, 0x47, 0x80, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AAC, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x63, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x64, 0x80, 0x22, 0x44, 0x80, 0x3E, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AAD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x3C, 0x80, 0x80, 0x00, 0xA4, 0x80, 0x00, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x24, 0x24, 0x80, 0x24, 0x64, 0x80, 0x3C, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AAE, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x3C, 0x49, 0x80, 0x00, 0x4F, 0x00, 0x00, 0xD8, 0x00, 0x3D, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x80, 0x24, 0x4C, 0x80, 0x3C, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x80, 0x3E, 0x40, 0x80, 0x22, 0x7F, 0x80, 0x22, 0x40, 0x80, 0x22, 0x40, 0x80, 0x3E, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AB0, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x00, 0x48, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x01, 0x48, 0x00, 0x1E, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x7F, 0x80, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x1E, 0x2C, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x4A, 0x00, 0x1E, 0x89, 0x00, 0x13, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x00, 0x44, 0x00, 0x00, 0x54, 0x80, 0x3E, 0x54, 0x80, 0x00, 0x5F, 0x80, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0xD4, 0x80, 0x22, 0x94, 0x80, 0x23, 0x94, 0x80, 0x3E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AB6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x00, 0xEE, 0x00, 0x01, 0xAB, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x7E, 0xA2, 0x80, 0x00, 0x94, 0x80, 0x3C, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x00, 0x88, 0x80, 0x3C, 0xFF, 0x80, 0x00, 0x90, 0x80, 0x00, 0x90, 0x80, 0x3C, 0x90, 0x80, 0x24, 0x9E, 0x80, 0x24, 0x80, 0x80, 0x24, 0x80, 0x80, 0x3C, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AB9, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x00, 0x14, 0x00, 0x3F, 0xF7, 0x80, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x00, 0xF7, 0x80, 0x1E, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x1E, 0xF7, 0x80, 0x12, 0x14, 0x00, 0x12, 0x24, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ABB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x09, 0x00, 0x00, 0xEB, 0x00, 0x7F, 0x2C, 0x00, 0x00, 0x2E, 0x00, 0x3E, 0x6B, 0x00, 0x00, 0xC9, 0x80, 0x00, 0x18, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ABC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ABE, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ABF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, 0xBE, 0x80, 0x1E, 0x88, 0x80, 0x00, 0xFF, 0x80, 0x1E, 0x88, 0x80, 0x00, 0xBE, 0x80, 0x00, 0xA2, 0x80, 0x1E, 0xA2, 0x80, 0x12, 0xBE, 0x80, 0x12, 0xA2, 0x80, 0x1E, 0x80, 0x80, 0x12, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AC2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0x20, 0x80, 0x00, 0x40, 0x80, 0x00, 0x81, 0x00, 0x1F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x67, 0x80, 0x00, 0x40, 0x80, 0x1E, 0x7F, 0x80, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x1E, 0x7F, 0x80, 0x12, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AC3, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x42, 0x00, 0x7E, 0xEF, 0x80, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x00, 0xE7, 0x00, 0x00, 0xD7, 0x00, 0x3D, 0x4A, 0x80, 0x01, 0x4A, 0x80, 0x01, 0x4A, 0x80, 0x3C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AC4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E, 0x00, 0x00, 0x04, 0x00, 0x1E, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AC6, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x22, 0x22, 0x00, 0x22, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AC7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x11, 0x00, 0x00, 0x92, 0x00, 0x3F, 0x94, 0x00, 0x00, 0x10, 0x00, 0x00, 0x28, 0x00, 0x1E, 0x46, 0x00, 0x01, 0x91, 0x80, 0x1E, 0x12, 0x00, 0x00, 0x94, 0x00, 0x00, 0x98, 0x00, 0x1E, 0x28, 0x00, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x82, 0x00, 0x13, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AC8, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3C, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x7E, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x3D, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AC9, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3C, 0x7C, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x00, 0x54, 0x00, 0x3C, 0x56, 0x00, 0x00, 0xD3, 0x00, 0x01, 0x91, 0x80, 0x3C, 0x10, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x22, 0x00, 0x24, 0x46, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x36, 0x00, 0x3C, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ACA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x7E, 0x80, 0x80, 0x01, 0x10, 0x80, 0x3C, 0x92, 0x80, 0x00, 0x54, 0x80, 0x00, 0xFE, 0x80, 0x3C, 0x10, 0x80, 0x00, 0x38, 0x80, 0x00, 0x34, 0x80, 0x3C, 0x52, 0x80, 0x24, 0x50, 0x80, 0x24, 0x91, 0x80, 0x24, 0x11, 0x00, 0x3C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ACB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ACC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x3C, 0x54, 0x00, 0x24, 0x56, 0x00, 0x24, 0xD3, 0x00, 0x25, 0x91, 0x80, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ACD, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1E, 0x39, 0x00, 0x00, 0x48, 0x80, 0x3F, 0x84, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x09, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ACF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0xA9, 0x00, 0x00, 0xA9, 0x00, 0x00, 0xAA, 0x00, 0x1C, 0xEA, 0x00, 0x00, 0xAA, 0x00, 0x1C, 0xA6, 0x00, 0x00, 0xE4, 0x00, 0x00, 0xA4, 0x00, 0x1C, 0xA6, 0x00, 0x14, 0xE6, 0x00, 0x15, 0xA9, 0x00, 0x1C, 0x29, 0x00, 0x14, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x7E, 0x60, 0x00, 0x00, 0xD1, 0x00, 0x3D, 0x93, 0x00, 0x00, 0xBA, 0x00, 0x00, 0xE8, 0x00, 0x3C, 0xC8, 0x00, 0x01, 0xDC, 0x00, 0x00, 0x6C, 0x00, 0x3C, 0x6A, 0x00, 0x24, 0xCB, 0x00, 0x25, 0x89, 0x80, 0x27, 0x18, 0x00, 0x3C, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AD2, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x88, 0x80, 0x12, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AD3, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x22, 0x00, 0x00, 0x3F, 0x00, 0x7E, 0xF0, 0x00, 0x00, 0x1B, 0x00, 0x3C, 0x0C, 0x00, 0x00, 0x36, 0x80, 0x00, 0xC3, 0x80, 0x3C, 0x24, 0x00, 0x00, 0x22, 0x00, 0x00, 0x3F, 0x00, 0x3D, 0xF0, 0x00, 0x24, 0x1B, 0x00, 0x24, 0x0C, 0x00, 0x24, 0x36, 0x80, 0x3D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AD4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x38, 0x9F, 0x00, 0x00, 0x89, 0x00, 0x7C, 0xE9, 0x00, 0x00, 0x89, 0x00, 0x38, 0x8B, 0x00, 0x00, 0x8A, 0x00, 0x03, 0xEA, 0x00, 0x38, 0x8E, 0x00, 0x00, 0x84, 0x00, 0x02, 0xA4, 0x00, 0x3A, 0xAE, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAB, 0x00, 0x28, 0x89, 0x00, 0x39, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AD5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x3C, 0x91, 0x00, 0x00, 0x9C, 0x00, 0x00, 0xF0, 0x00, 0x3C, 0x91, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x80, 0x00, 0x3C, 0x94, 0x00, 0x25, 0x94, 0x00, 0x25, 0x14, 0x80, 0x27, 0x34, 0x80, 0x3C, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AD6, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x14, 0x00, 0x00, 0x22, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x7F, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x94, 0x80, 0x00, 0x94, 0x80, 0x1E, 0xFF, 0x80, 0x12, 0x94, 0x80, 0x12, 0x94, 0x80, 0x1E, 0x94, 0x80, 0x12, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AD7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x7E, 0xC7, 0x00, 0x01, 0x81, 0x80, 0x3C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x18, 0x00, 0x24, 0xA9, 0x00, 0x24, 0xA1, 0x80, 0x25, 0xA2, 0x80, 0x3D, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ADA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x00, 0x80, 0x80, 0x3C, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x48, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x48, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0xE8, 0x00, 0x24, 0xB8, 0x00, 0x3D, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8ADB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x28, 0x00, 0x00, 0xCB, 0x80, 0x3F, 0x88, 0x80, 0x00, 0x88, 0x80, 0x00, 0xEB, 0x80, 0x1E, 0x88, 0x80, 0x00, 0x88, 0x80, 0x1E, 0xEB, 0x80, 0x00, 0x88, 0x80, 0x00, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8ADC, { 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x1E, 0x52, 0x00, 0x00, 0x52, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x52, 0x00, 0x00, 0x5E, 0x00, 0x1E, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x1E, 0x48, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8ADD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x08, 0x80, 0x7F, 0x4F, 0x00, 0x00, 0x48, 0x00, 0x3E, 0x68, 0x00, 0x00, 0xDF, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ADE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0xD4, 0x80, 0x00, 0xD4, 0x80, 0x3D, 0x7F, 0x80, 0x25, 0x54, 0x80, 0x24, 0x54, 0x80, 0x24, 0x54, 0x80, 0x3C, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8ADF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x5F, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0xB8, 0x00, 0x3D, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AE0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x00, 0x80, 0x80, 0x3C, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3C, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3C, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0x02, 0x00, 0x00, 0x41, 0x00, 0x3F, 0xBE, 0x80, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x00, 0x1E, 0x21, 0x00, 0x00, 0x02, 0x00, 0x1E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x12, 0x55, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x7E, 0x88, 0x80, 0x00, 0x7F, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x94, 0x80, 0x7E, 0x94, 0x80, 0x00, 0xF7, 0x80, 0x3C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x3F, 0x00, 0x24, 0x01, 0x00, 0x24, 0x01, 0x00, 0x24, 0x03, 0x00, 0x3C, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AE6, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x14, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x88, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x4B, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AE7, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x00, 0x45, 0x80, 0x3F, 0x7E, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x80, 0x1E, 0x7C, 0x80, 0x01, 0xC7, 0x80, 0x1E, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AEA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x1E, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AEB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0xC9, 0x80, 0x1E, 0xAA, 0x80, 0x00, 0x9C, 0x80, 0x1E, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x1E, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AEC, { 0x00, 0x00, 0x00, 0x01, 0x12, 0x00, 0x1E, 0x11, 0x00, 0x04, 0x7F, 0x80, 0x7F, 0x10, 0x00, 0x0E, 0x38, 0x80, 0x15, 0x4C, 0x80, 0x24, 0x07, 0x80, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x78, 0x00, 0x00, 0x14, 0x00, 0x3F, 0x62, 0x00, 0x01, 0x81, 0x80, 0x00, 0x7E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xF2, 0x80, 0x00, 0x92, 0x80, 0x00, 0xF5, 0x00, 0x1E, 0x9A, 0x00, 0x12, 0xF9, 0x00, 0x12, 0x95, 0x00, 0x1E, 0x94, 0x80, 0x12, 0xB2, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AEE, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1E, 0xE4, 0x00, 0x00, 0x0F, 0x80, 0x3F, 0x15, 0x00, 0x00, 0x04, 0x00, 0x01, 0xEA, 0x00, 0x1E, 0x11, 0x00, 0x00, 0x20, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x1E, 0x81, 0x00, 0x12, 0x81, 0x00, 0x12, 0x81, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x7E, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x91, 0x00, 0x00, 0x91, 0x00, 0x00, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x18, 0x00, 0x24, 0xA9, 0x00, 0x24, 0xA1, 0x80, 0x25, 0xA2, 0x80, 0x3D, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AF1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x11, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x13, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AF3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x7E, 0x42, 0x00, 0x00, 0x66, 0x00, 0x3C, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AF4, { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3C, 0x04, 0x80, 0x00, 0x04, 0x80, 0x7F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x3D, 0x74, 0x80, 0x01, 0x04, 0x80, 0x01, 0x75, 0x80, 0x3D, 0x55, 0x00, 0x01, 0x57, 0x00, 0x01, 0x52, 0x00, 0x3D, 0x72, 0x00, 0x25, 0x06, 0x80, 0x25, 0x0E, 0x80, 0x26, 0x1B, 0x80, 0x3C, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AF5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0xA2, 0x80, 0x3C, 0x94, 0x80, 0x00, 0xBE, 0x80, 0x00, 0x88, 0x80, 0x3C, 0xBE, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3C, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AF6, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x01, 0xFF, 0x80, 0x00, 0xA4, 0x00, 0x1E, 0xA5, 0x00, 0x12, 0xC7, 0x00, 0x12, 0x80, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x3F, 0x3A, 0x00, 0x01, 0xE2, 0x00, 0x01, 0x22, 0x00, 0x1D, 0xFA, 0x00, 0x01, 0xAA, 0x00, 0x1D, 0xAA, 0x00, 0x01, 0xFA, 0x00, 0x01, 0x22, 0x00, 0x1D, 0x2A, 0x00, 0x15, 0x3A, 0x80, 0x15, 0xE6, 0x80, 0x1D, 0x01, 0x80, 0x16, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AF8, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x80, 0x00, 0x11, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x14, 0x00, 0x1E, 0x22, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AFA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x24, 0x00, 0x00, 0x18, 0x00, 0x00, 0x26, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x1E, 0x84, 0x00, 0x00, 0x99, 0x00, 0x00, 0xE2, 0x00, 0x1E, 0x8C, 0x00, 0x12, 0xB0, 0x80, 0x12, 0x83, 0x00, 0x1F, 0x0C, 0x00, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AFC, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x1E, 0x00, 0x01, 0xF2, 0x00, 0x7E, 0x53, 0x00, 0x00, 0x89, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x20, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x3C, 0x76, 0x00, 0x25, 0xD4, 0x00, 0x24, 0x1C, 0x00, 0x24, 0x36, 0x00, 0x3D, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8AFE, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x1E, 0x40, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8AFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x43, 0x80, 0x24, 0x7E, 0x00, 0x25, 0xC2, 0x00, 0x24, 0x02, 0x00, 0x3C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B00, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x1E, 0x2A, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x51, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x7F, 0x80, 0x00, 0xC8, 0x80, 0x01, 0x48, 0x80, 0x1E, 0x54, 0x80, 0x12, 0x62, 0x80, 0x12, 0x7F, 0x80, 0x1E, 0x41, 0x00, 0x12, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x00, 0xFF, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B04, { 0x00, 0x00, 0x00, 0x1C, 0x54, 0x00, 0x14, 0x92, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x28, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x82, 0x00, 0x17, 0x7D, 0x80, 0x15, 0xFF, 0x00, 0x1C, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x2C, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B05, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0xFF, 0x00, 0x01, 0x21, 0x00, 0x7E, 0xA9, 0x00, 0x00, 0xA9, 0x00, 0x3C, 0xF9, 0x00, 0x00, 0x43, 0x00, 0x00, 0x8E, 0x00, 0x3C, 0x40, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x21, 0x00, 0x3C, 0xA9, 0x00, 0x24, 0xA9, 0x00, 0x24, 0xF9, 0x00, 0x24, 0x43, 0x00, 0x3C, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B06, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3C, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7E, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x91, 0x80, 0x00, 0xB2, 0x80, 0x3C, 0xD4, 0x80, 0x25, 0x91, 0x80, 0x25, 0x32, 0x80, 0x27, 0x54, 0x80, 0x3C, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B07, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x03, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B0A, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x3C, 0x52, 0x00, 0x24, 0x52, 0x00, 0x24, 0x52, 0x80, 0x24, 0xD2, 0x80, 0x3D, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B0B, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x3C, 0xF1, 0x00, 0x00, 0x97, 0x80, 0x7D, 0xD5, 0x00, 0x01, 0x75, 0x00, 0x3C, 0x25, 0x00, 0x00, 0x6F, 0x80, 0x00, 0xC1, 0x00, 0x3D, 0x81, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x54, 0x00, 0x24, 0x56, 0x00, 0x24, 0xD3, 0x00, 0x25, 0x91, 0x80, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x7E, 0xF2, 0x00, 0x00, 0x92, 0x00, 0x3C, 0x92, 0x00, 0x00, 0xF2, 0x00, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x3C, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xF2, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B0E, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x1C, 0xA4, 0x80, 0x00, 0x15, 0x00, 0x3E, 0x15, 0x00, 0x02, 0x04, 0x00, 0x01, 0x7F, 0x80, 0x1C, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x1C, 0x0E, 0x00, 0x03, 0x95, 0x00, 0x00, 0x95, 0x00, 0x1C, 0xA4, 0x80, 0x14, 0xC4, 0x00, 0x14, 0xC4, 0x00, 0x1D, 0x3F, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B10, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x1E, 0x11, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x22, 0x80, 0x00, 0xA4, 0x80, 0x01, 0x29, 0x00, 0x1E, 0x31, 0x00, 0x00, 0x3F, 0x00, 0x1E, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x55, 0x00, 0x12, 0x55, 0x00, 0x12, 0x55, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B11, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x00, 0x79, 0x00, 0x7E, 0x4D, 0x80, 0x00, 0xC4, 0x80, 0x3E, 0x90, 0x00, 0x00, 0x24, 0x00, 0x00, 0x48, 0x00, 0x3E, 0x32, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF1, 0x80, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x14, 0x00, 0x22, 0x22, 0x00, 0x3E, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B14, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x91, 0x00, 0x00, 0x9F, 0x00, 0x1E, 0xF0, 0x80, 0x00, 0x9F, 0x80, 0x1E, 0x80, 0x00, 0x00, 0xBF, 0x00, 0x00, 0xA0, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0xA0, 0x00, 0x12, 0xBF, 0x00, 0x1F, 0x20, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x14, 0x00, 0x00, 0x24, 0x80, 0x1E, 0x47, 0x80, 0x01, 0xA0, 0x00, 0x00, 0x3F, 0x00, 0x1E, 0x62, 0x00, 0x13, 0x94, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x36, 0x00, 0x12, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B17, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x00, 0x3F, 0x42, 0x00, 0x00, 0x24, 0x00, 0x00, 0x14, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0x10, 0x80, 0x1E, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x82, 0x00, 0x13, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x7C, 0x00, 0x00, 0x82, 0x00, 0x03, 0xFF, 0x00, 0x3E, 0x48, 0x80, 0x00, 0x48, 0x00, 0x01, 0xFE, 0x00, 0x38, 0x4A, 0x00, 0x03, 0xFF, 0x80, 0x38, 0x4A, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x4C, 0x00, 0x38, 0xCA, 0x00, 0x29, 0x4A, 0x00, 0x2A, 0x49, 0x00, 0x3C, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x80, 0x1E, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x1E, 0x42, 0x00, 0x00, 0x81, 0x00, 0x01, 0x00, 0x80, 0x1E, 0xFF, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xA5, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B1B, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x7E, 0x88, 0x00, 0x00, 0xBF, 0x00, 0x3C, 0xA1, 0x00, 0x00, 0xA1, 0x00, 0x00, 0xBF, 0x00, 0x3C, 0xA1, 0x00, 0x00, 0xA1, 0x00, 0x00, 0xBF, 0x00, 0x3C, 0x88, 0x00, 0x25, 0xAA, 0x00, 0x25, 0x6B, 0x00, 0x27, 0x49, 0x80, 0x3C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B1D, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x1C, 0xE2, 0x00, 0x00, 0xA2, 0x00, 0x3E, 0xA2, 0x00, 0x00, 0xE2, 0x00, 0x00, 0xBF, 0x80, 0x1C, 0xA2, 0x00, 0x00, 0xE2, 0x00, 0x1C, 0xB2, 0x00, 0x00, 0xEA, 0x00, 0x01, 0xA2, 0x00, 0x1C, 0x62, 0x00, 0x14, 0xA2, 0x00, 0x14, 0xA2, 0x00, 0x1D, 0x22, 0x00, 0x16, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B1E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0xBD, 0x00, 0x3C, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xBD, 0x00, 0x24, 0x81, 0x00, 0x3C, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B1F, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x7E, 0x12, 0x00, 0x00, 0x5B, 0x00, 0x3C, 0xC9, 0x80, 0x00, 0x80, 0x80, 0x00, 0x30, 0x00, 0x3C, 0xE7, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x3C, 0xE7, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B20, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x1F, 0x80, 0x00, 0x31, 0x00, 0x3E, 0x4A, 0x00, 0x00, 0xA4, 0x00, 0x01, 0x18, 0x00, 0x1C, 0x60, 0x00, 0x01, 0xA0, 0x00, 0x1C, 0x7F, 0x80, 0x00, 0x88, 0x00, 0x01, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x14, 0x88, 0x80, 0x14, 0x88, 0x80, 0x1C, 0xFF, 0x80, 0x14, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B21, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x91, 0x00, 0x3C, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3C, 0x08, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B26, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x23, 0x80, 0x3F, 0x80, 0x00, 0x15, 0x3F, 0x00, 0x1F, 0x11, 0x00, 0x30, 0x0E, 0x00, 0x67, 0xF9, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B28, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B2B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x41, 0x00, 0x00, 0x22, 0x00, 0x00, 0x14, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x1E, 0x88, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x1E, 0xBE, 0x80, 0x12, 0xA2, 0x80, 0x12, 0xBE, 0x80, 0x1E, 0x80, 0x80, 0x12, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x2A, 0x80, 0x3F, 0x4C, 0x80, 0x00, 0x99, 0x80, 0x00, 0x2A, 0x80, 0x1E, 0x59, 0x80, 0x00, 0x0C, 0x00, 0x1E, 0x32, 0x00, 0x00, 0xC5, 0x80, 0x00, 0x18, 0x00, 0x1E, 0x66, 0x00, 0x12, 0x18, 0x80, 0x12, 0x63, 0x00, 0x1E, 0x0C, 0x00, 0x12, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B2D, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7E, 0xF1, 0x00, 0x00, 0xD5, 0x00, 0x3C, 0xB5, 0x00, 0x00, 0xD5, 0x00, 0x00, 0xB1, 0x00, 0x3C, 0x91, 0x00, 0x00, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x20, 0x80, 0x24, 0x20, 0x80, 0x24, 0x61, 0x80, 0x3C, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B30, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x39, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x88, 0x00, 0x01, 0x3F, 0x00, 0x39, 0xA9, 0x00, 0x00, 0xA9, 0x00, 0x00, 0x3F, 0x00, 0x3B, 0xA9, 0x00, 0x00, 0xA9, 0x00, 0x00, 0xBF, 0x00, 0x38, 0x88, 0x00, 0x28, 0xFF, 0x80, 0x29, 0x88, 0x00, 0x29, 0x48, 0x00, 0x3B, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xBE, 0x00, 0x00, 0xA2, 0x00, 0x1E, 0xBE, 0x00, 0x00, 0x80, 0x00, 0x1E, 0xBF, 0x00, 0x00, 0xAD, 0x00, 0x00, 0xAD, 0x00, 0x1E, 0xAD, 0x00, 0x12, 0xBF, 0x00, 0x12, 0x80, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B37, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xE1, 0x00, 0x08, 0x1B, 0x00, 0x1F, 0x8E, 0x00, 0x30, 0x9B, 0x00, 0x63, 0xF1, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B39, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x1E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B3C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x00, 0x90, 0x80, 0x3C, 0xFE, 0x80, 0x00, 0x91, 0x00, 0x00, 0x8F, 0x00, 0x3C, 0x82, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xA9, 0x00, 0x3C, 0x9A, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x08, 0x00, 0x27, 0x08, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B3E, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x24, 0x80, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x24, 0x00, 0x24, 0x18, 0x00, 0x24, 0x76, 0x00, 0x3D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B41, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x01, 0xFF, 0x80, 0x1E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x94, 0x80, 0x7E, 0xF7, 0x80, 0x00, 0x00, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B43, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x00, 0x90, 0x80, 0x3C, 0xFE, 0x80, 0x00, 0x91, 0x00, 0x00, 0x8F, 0x00, 0x3C, 0x80, 0x00, 0x00, 0x8A, 0x00, 0x00, 0xAA, 0x80, 0x3C, 0xAA, 0x80, 0x25, 0xAA, 0x80, 0x25, 0x3B, 0x80, 0x27, 0x0A, 0x00, 0x3C, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B44, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x3C, 0xC3, 0x00, 0x01, 0x81, 0x80, 0x7F, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x3D, 0x92, 0x80, 0x01, 0x54, 0x80, 0x01, 0x10, 0x80, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xEF, 0x80, 0x01, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x03, 0x2C, 0x80, 0x39, 0x24, 0x80, 0x01, 0x24, 0x80, 0x02, 0x69, 0x80, 0x38, 0x00, 0x00, 0x00, 0x82, 0x00, 0x02, 0xEB, 0x80, 0x3A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xEA, 0x00, 0x2B, 0x9F, 0x80, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B46, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x22, 0x00, 0x00, 0x14, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B48, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x01, 0xF4, 0x00, 0x7E, 0x07, 0x80, 0x01, 0xF5, 0x00, 0x3D, 0x19, 0x00, 0x01, 0xF5, 0x00, 0x00, 0x05, 0x00, 0x3D, 0xF5, 0x00, 0x00, 0x27, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x72, 0x00, 0x25, 0xC7, 0x00, 0x24, 0x45, 0x00, 0x24, 0x4D, 0x80, 0x3D, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7C, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x55, 0x00, 0x00, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x1E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x22, 0x00, 0x12, 0x14, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B4C, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3C, 0xFD, 0x00, 0x00, 0x51, 0x80, 0x7E, 0x88, 0x80, 0x00, 0xFE, 0x00, 0x3C, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0xFF, 0x80, 0x3D, 0x00, 0x80, 0x27, 0x0A, 0x80, 0x24, 0xAA, 0x80, 0x24, 0xA1, 0x80, 0x3D, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B4D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x44, 0x00, 0x24, 0xFF, 0x00, 0x2D, 0x88, 0x00, 0x34, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x23, 0xFC, 0x00, 0x60, 0x00, 0x00, 0x47, 0xFE, 0x00, 0x44, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x19, 0x00, 0x00, 0x28, 0x00, 0x1E, 0xC8, 0x00, 0x00, 0x18, 0x00, 0x1E, 0xFF, 0x00, 0x00, 0xA5, 0x00, 0x00, 0xC7, 0x00, 0x1E, 0xBD, 0x00, 0x12, 0xA5, 0x00, 0x12, 0xBD, 0x00, 0x1E, 0xA5, 0x00, 0x12, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B4F, { 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x1E, 0x52, 0x00, 0x00, 0x94, 0x80, 0x3F, 0x38, 0x80, 0x00, 0xD7, 0x00, 0x00, 0x52, 0x00, 0x1E, 0x9F, 0x80, 0x01, 0xFA, 0x00, 0x00, 0x11, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x48, 0x80, 0x1E, 0x49, 0x00, 0x12, 0xAE, 0x00, 0x12, 0x04, 0x80, 0x1E, 0x1A, 0x80, 0x12, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B52, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3C, 0x1C, 0x00, 0x01, 0xF0, 0x00, 0x7E, 0x92, 0x00, 0x00, 0x54, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x54, 0x00, 0x00, 0xD6, 0x00, 0x3D, 0x93, 0x00, 0x03, 0x01, 0x80, 0x00, 0xFE, 0x00, 0x3C, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B53, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x12, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x11, 0x80, 0x3C, 0x58, 0x00, 0x25, 0x49, 0x00, 0x25, 0x41, 0x80, 0x25, 0x62, 0x80, 0x3D, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x94, 0x80, 0x7E, 0xF7, 0x80, 0x00, 0x84, 0x00, 0x3C, 0x94, 0x80, 0x00, 0x73, 0x80, 0x00, 0x00, 0x00, 0x3C, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x24, 0x66, 0x00, 0x3D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B56, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0xA5, 0x00, 0x7E, 0xA5, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x63, 0x00, 0x00, 0xB5, 0x00, 0x01, 0x29, 0x80, 0x3C, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B58, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x25, 0x00, 0x00, 0x24, 0x80, 0x01, 0xFC, 0x00, 0x3F, 0x54, 0x00, 0x00, 0x54, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x1E, 0x74, 0x80, 0x00, 0x55, 0x00, 0x00, 0x75, 0x00, 0x1E, 0x52, 0x00, 0x12, 0x76, 0x80, 0x12, 0x56, 0x80, 0x1E, 0x09, 0x80, 0x12, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B59, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x48, 0x00, 0x00, 0xFF, 0x80, 0x7E, 0x88, 0x00, 0x01, 0x88, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x24, 0xA9, 0x00, 0x25, 0xAD, 0x80, 0x3D, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x94, 0x80, 0x00, 0xFF, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B5B, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x01, 0xEF, 0x80, 0x7E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3D, 0xEF, 0x80, 0x00, 0x42, 0x00, 0x00, 0xA5, 0x00, 0x3D, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x3C, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B5C, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x22, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x14, 0x00, 0x3F, 0x94, 0x80, 0x00, 0x55, 0x00, 0x1E, 0x55, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x14, 0x80, 0x22, 0x35, 0x00, 0x22, 0xE6, 0x00, 0x22, 0x33, 0x00, 0x3E, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B5F, { 0x00, 0x00, 0x00, 0x3C, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x94, 0x80, 0x00, 0x94, 0x80, 0x3C, 0xF7, 0x80, 0x00, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3C, 0x2A, 0x00, 0x24, 0x2A, 0x00, 0x24, 0x6B, 0x00, 0x24, 0xC9, 0x80, 0x3C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B63, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x38, 0x00, 0x00, 0x6C, 0x00, 0x7E, 0xC6, 0x00, 0x01, 0x83, 0x80, 0x3C, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x00, 0x3C, 0xA9, 0x00, 0x00, 0xA9, 0x00, 0x00, 0xEF, 0x00, 0x3C, 0x00, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0xC7, 0x00, 0x3D, 0xAD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B66, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x3F, 0xC8, 0x00, 0x09, 0x1F, 0x80, 0x1F, 0xA1, 0x00, 0x20, 0xD2, 0x00, 0x1E, 0x8C, 0x00, 0x12, 0x96, 0x00, 0x1E, 0xE1, 0x80, 0x07, 0xF8, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B6B, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x48, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x92, 0x00, 0x00, 0xE3, 0x80, 0x3C, 0x9E, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x3C, 0x80, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x80, 0x00, 0x3C, 0x9E, 0x00, 0x24, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x25, 0x21, 0x00, 0x3C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B6C, { 0x00, 0x00, 0x00, 0x1F, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x1F, 0x91, 0x00, 0x10, 0x3F, 0x80, 0x1F, 0x84, 0x00, 0x28, 0xFF, 0x80, 0x2F, 0x84, 0x00, 0x03, 0xF8, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B6D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3B, 0x6E, 0x00, 0x02, 0x2A, 0x00, 0x7E, 0x2A, 0x00, 0x03, 0x6A, 0x00, 0x3A, 0x33, 0x80, 0x02, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x38, 0x89, 0x00, 0x00, 0x8B, 0x00, 0x03, 0xEA, 0x00, 0x38, 0x8E, 0x00, 0x28, 0x84, 0x00, 0x28, 0xEE, 0x00, 0x2B, 0x9B, 0x00, 0x38, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x94, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x1E, 0x22, 0x00, 0x00, 0x14, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B70, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0x14, 0x00, 0x00, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x35, 0x00, 0x1E, 0xC4, 0x80, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x1E, 0x45, 0x00, 0x12, 0x7D, 0x00, 0x13, 0xC6, 0x80, 0x1E, 0x46, 0x80, 0x12, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B71, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1C, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x7E, 0xBF, 0x80, 0x00, 0x80, 0x00, 0x1C, 0x8E, 0x00, 0x00, 0x80, 0x00, 0x3E, 0x9F, 0x00, 0x22, 0x91, 0x00, 0x3E, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B72, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x42, 0x00, 0x01, 0x81, 0x80, 0x3C, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x24, 0x00, 0x24, 0x65, 0x00, 0x25, 0xC2, 0x00, 0x24, 0x73, 0x00, 0x3D, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B74, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3C, 0xBE, 0x00, 0x00, 0x2A, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x02, 0xFF, 0x80, 0x3D, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x3C, 0x3E, 0x00, 0x07, 0x20, 0x00, 0x01, 0x3E, 0x00, 0x3D, 0x22, 0x00, 0x25, 0x3E, 0x00, 0x25, 0xA0, 0x00, 0x3D, 0x7F, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B76, { 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B77, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3F, 0x24, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x48, 0x00, 0x1E, 0xFF, 0x00, 0x01, 0x48, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x48, 0x00, 0x00, 0x7F, 0x80, 0x1E, 0x40, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x1C, 0x00, 0x12, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B78, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7E, 0x80, 0x3C, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x01, 0x00, 0x24, 0xFF, 0x80, 0x24, 0xA9, 0x00, 0x3C, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B79, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3D, 0x00, 0x80, 0x01, 0x7E, 0x80, 0x00, 0x20, 0x00, 0x3C, 0xD1, 0x00, 0x24, 0x2A, 0x00, 0x24, 0xDC, 0x00, 0x24, 0x2A, 0x00, 0x3C, 0xD9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B7C, { 0x00, 0x00, 0x00, 0x3F, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x21, 0xBF, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B7D, { 0x00, 0x00, 0x00, 0x06, 0x80, 0x00, 0x18, 0xEF, 0x00, 0x10, 0x81, 0x00, 0x1E, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x1E, 0xAF, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x09, 0xF2, 0x00, 0x1F, 0xFF, 0x00, 0x2F, 0xFE, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B7E, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x7E, 0xF1, 0x00, 0x00, 0xD5, 0x00, 0x3C, 0xB5, 0x00, 0x00, 0xD5, 0x00, 0x00, 0xB1, 0x00, 0x3C, 0x97, 0x00, 0x00, 0x00, 0x00, 0x01, 0xEF, 0x80, 0x3C, 0xA2, 0x80, 0x25, 0x6D, 0x80, 0x24, 0xA2, 0x80, 0x25, 0x2C, 0x80, 0x3C, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B80, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0xA2, 0x80, 0x00, 0xFF, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B81, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3A, 0x08, 0x00, 0x03, 0x7F, 0x80, 0x7D, 0x21, 0x00, 0x02, 0x12, 0x00, 0x3B, 0x7F, 0x80, 0x01, 0x48, 0x80, 0x00, 0x7F, 0x80, 0x3B, 0x48, 0x80, 0x01, 0x5E, 0x80, 0x01, 0x52, 0x80, 0x39, 0x5E, 0x80, 0x29, 0x40, 0x80, 0x2B, 0x41, 0x80, 0x2A, 0x80, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B83, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3C, 0xF7, 0x80, 0x00, 0x22, 0x00, 0x7E, 0xF7, 0x80, 0x00, 0x22, 0x00, 0x3C, 0x55, 0x00, 0x00, 0x80, 0x80, 0x00, 0x7F, 0x00, 0x3C, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3C, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x3C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x00, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x38, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x38, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x02, 0xAA, 0x80, 0x3A, 0xAA, 0x80, 0x2B, 0xEF, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x3B, 0xEF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B85, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x7D, 0x0E, 0x80, 0x00, 0xF8, 0x00, 0x3C, 0x92, 0x00, 0x00, 0x54, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x54, 0x00, 0x00, 0x92, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x91, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3C, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B8A, { 0x00, 0x00, 0x00, 0x10, 0xE4, 0x00, 0x14, 0x05, 0x00, 0x25, 0xF9, 0x00, 0x18, 0x0A, 0x00, 0x12, 0xE4, 0x80, 0x3E, 0xFF, 0x80, 0x08, 0xEA, 0x80, 0x28, 0xAA, 0x80, 0x29, 0xE0, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x0A, 0x08, 0x00, 0x31, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B8B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1E, 0x00, 0x11, 0x10, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B8C, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x01, 0xFF, 0x80, 0x7E, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x3C, 0x82, 0x00, 0x03, 0xBA, 0x80, 0x00, 0xAB, 0x00, 0x3C, 0xAA, 0x00, 0x00, 0xAA, 0x00, 0x03, 0xBA, 0x80, 0x3C, 0x81, 0x80, 0x24, 0x00, 0x00, 0x24, 0xA9, 0x00, 0x25, 0xAD, 0x80, 0x3D, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x7D, 0xD7, 0x00, 0x01, 0x55, 0x00, 0x39, 0xD7, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xD7, 0x00, 0x39, 0x55, 0x00, 0x29, 0xD7, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B8E, { 0x00, 0x00, 0x00, 0x12, 0x04, 0x80, 0x12, 0xE4, 0x80, 0x24, 0x09, 0x00, 0x3F, 0xFF, 0x80, 0x68, 0x0A, 0x00, 0x29, 0xEA, 0x00, 0x28, 0x0A, 0x00, 0x3C, 0x0F, 0x80, 0x29, 0xEA, 0x00, 0x28, 0x0A, 0x00, 0x28, 0x0A, 0x00, 0x3D, 0xEF, 0x80, 0x29, 0x2A, 0x00, 0x29, 0x2A, 0x00, 0x29, 0x2A, 0x00, 0x3D, 0xEF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B8F, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x13, 0xF7, 0x80, 0x21, 0x10, 0x00, 0x4B, 0xF8, 0x00, 0x10, 0x87, 0x80, 0x33, 0xF1, 0x00, 0x52, 0x91, 0x00, 0x12, 0xB3, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B90, { 0x00, 0x00, 0x00, 0x0A, 0x14, 0x00, 0x1F, 0xBF, 0x00, 0x32, 0x64, 0x00, 0x1F, 0xBF, 0x00, 0x12, 0x24, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B92, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x7C, 0x00, 0x00, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x8B, 0x80, 0x1E, 0xFC, 0x00, 0x00, 0x88, 0x80, 0x1E, 0xBF, 0x80, 0x01, 0xC8, 0x00, 0x00, 0xFF, 0x00, 0x1E, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x2C, 0x00, 0x1E, 0x4A, 0x80, 0x13, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B93, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0xE7, 0x00, 0x00, 0xA5, 0x00, 0x00, 0xE7, 0x00, 0x1C, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x1C, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x14, 0x69, 0x00, 0x15, 0xC6, 0x00, 0x1E, 0x7A, 0x00, 0x15, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B94, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3B, 0xBE, 0x00, 0x02, 0xA9, 0x00, 0x7E, 0xC4, 0x80, 0x03, 0xBF, 0x00, 0x3B, 0x08, 0x00, 0x03, 0x7F, 0x80, 0x02, 0x80, 0x00, 0x3A, 0xBF, 0x00, 0x02, 0x81, 0x00, 0x02, 0xFF, 0x80, 0x3B, 0x81, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x52, 0x80, 0x3A, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B95, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x3A, 0x28, 0x80, 0x03, 0xEF, 0x80, 0x7E, 0x28, 0x80, 0x03, 0xEF, 0x80, 0x3A, 0x10, 0x80, 0x02, 0xFE, 0x80, 0x02, 0x10, 0x80, 0x3A, 0xFE, 0x80, 0x02, 0xD6, 0x80, 0x02, 0xBA, 0x80, 0x3A, 0x92, 0x80, 0x2A, 0xFE, 0x80, 0x2A, 0x38, 0x80, 0x2A, 0x54, 0x80, 0x3A, 0x93, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B96, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1D, 0x2A, 0x00, 0x01, 0x29, 0x00, 0x3E, 0xA8, 0x00, 0x04, 0x58, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFF, 0x80, 0x01, 0x48, 0x00, 0x1F, 0x69, 0x00, 0x01, 0x49, 0x00, 0x03, 0x6A, 0x00, 0x1D, 0x44, 0x00, 0x15, 0xF4, 0x00, 0x17, 0x0A, 0x80, 0x1C, 0x11, 0x80, 0x14, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B99, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x7E, 0xEF, 0x00, 0x00, 0xA9, 0x00, 0x3C, 0xEF, 0x00, 0x00, 0x42, 0x00, 0x00, 0x44, 0x00, 0x3C, 0xFF, 0x00, 0x01, 0x88, 0x00, 0x02, 0xFE, 0x00, 0x3C, 0x88, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B9A, { 0x00, 0x00, 0x00, 0x01, 0x54, 0x00, 0x1D, 0xFF, 0x00, 0x02, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xAA, 0x00, 0x00, 0xAA, 0x80, 0x1D, 0x33, 0x80, 0x02, 0x00, 0x00, 0x1C, 0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x1C, 0x82, 0x00, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8B9C, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x38, 0x92, 0x00, 0x03, 0xFF, 0x80, 0x7E, 0x82, 0x80, 0x02, 0xFE, 0x80, 0x38, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x93, 0x00, 0x39, 0x55, 0x00, 0x01, 0x39, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x29, 0x49, 0x00, 0x3A, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B9E, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x38, 0xF2, 0x80, 0x00, 0x82, 0x80, 0x7F, 0xFA, 0x00, 0x02, 0x8A, 0x00, 0x3B, 0xF7, 0x80, 0x02, 0x8A, 0x00, 0x03, 0xFA, 0x00, 0x3A, 0x92, 0x00, 0x02, 0xF2, 0x00, 0x02, 0x07, 0x00, 0x3B, 0xFD, 0x00, 0x2E, 0xA9, 0x00, 0x2B, 0x19, 0x00, 0x2A, 0xE9, 0x80, 0x3A, 0x58, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8B9F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3B, 0xF7, 0x00, 0x00, 0x80, 0x00, 0x7D, 0xEF, 0x80, 0x00, 0x00, 0x00, 0x37, 0xFB, 0x00, 0x05, 0x48, 0x00, 0x07, 0xF8, 0x00, 0x32, 0x13, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x3B, 0xF7, 0x00, 0x2A, 0x15, 0x00, 0x2B, 0xF5, 0x00, 0x29, 0x25, 0x00, 0x3A, 0x17, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA1, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x22, 0x00, 0x7B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x04, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x23, 0x00, 0x08, 0x21, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0D, 0x04, 0x00, 0x09, 0x04, 0x00, 0x02, 0x03, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x89, 0x00, 0x09, 0x09, 0x00, 0x02, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA6, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0xFE, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA8, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x18, 0x04, 0x00, 0x08, 0x04, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x78, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BA9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x3E, 0x00, 0x78, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BAA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x39, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0B, 0x11, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BAB, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x84, 0x00, 0x10, 0xFE, 0x00, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x75, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x10, 0x20, 0x00, 0x10, 0x40, 0x00, 0x10, 0x80, 0x00, 0x15, 0x01, 0x00, 0x19, 0x01, 0x00, 0x10, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BAD, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x10, 0x41, 0x00, 0x0C, 0x49, 0x00, 0x04, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3C, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x05, 0x89, 0x00, 0x06, 0x81, 0x00, 0x05, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x18, 0x22, 0x00, 0x09, 0x22, 0x00, 0x01, 0x02, 0x00, 0x01, 0x04, 0x00, 0x78, 0x84, 0x00, 0x08, 0x88, 0x00, 0x08, 0x48, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x04, 0x00, 0x02, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BAF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x23, 0xFC, 0x00, 0x18, 0x08, 0x00, 0x08, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x0B, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x85, 0x00, 0x0C, 0x85, 0x00, 0x08, 0x83, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x78, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x00, 0x0B, 0x01, 0x00, 0x0D, 0x01, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB2, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x10, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB3, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x00, 0x24, 0x00, 0x03, 0xFE, 0x00, 0x70, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x12, 0x22, 0x00, 0x14, 0x2A, 0x00, 0x18, 0x24, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB4, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x12, 0x02, 0x00, 0x02, 0x82, 0x00, 0x02, 0x44, 0x00, 0x72, 0x28, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x12, 0x86, 0x00, 0x13, 0x02, 0x00, 0x16, 0x00, 0x00, 0x1A, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB5, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB6, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0xFE, 0x00, 0x10, 0x08, 0x00, 0x11, 0x08, 0x00, 0x01, 0x08, 0x00, 0x02, 0x0A, 0x00, 0x77, 0xFF, 0x00, 0x10, 0x08, 0x00, 0x10, 0x18, 0x00, 0x10, 0x28, 0x00, 0x12, 0x48, 0x00, 0x14, 0x88, 0x00, 0x19, 0x08, 0x00, 0x12, 0x08, 0x00, 0x04, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x22, 0x00, 0x72, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x8A, 0x00, 0x17, 0x06, 0x00, 0x1A, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB8, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x04, 0x00, 0x19, 0xFE, 0x00, 0x09, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BB9, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x20, 0x90, 0x00, 0x18, 0x90, 0x00, 0x08, 0x92, 0x00, 0x00, 0x96, 0x00, 0x01, 0x98, 0x00, 0x7A, 0x90, 0x00, 0x0C, 0xB0, 0x00, 0x08, 0xD0, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x08, 0x8F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BBA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x50, 0x00, 0x08, 0x50, 0x00, 0x00, 0x88, 0x00, 0x01, 0x07, 0x00, 0x7A, 0x02, 0x00, 0x08, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x98, 0x00, 0x08, 0xE0, 0x00, 0x08, 0x80, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BBC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x10, 0x00, 0x18, 0x90, 0x00, 0x08, 0x90, 0x00, 0x00, 0x88, 0x00, 0x01, 0x04, 0x00, 0x79, 0x07, 0x00, 0x0A, 0x22, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x84, 0x00, 0x0D, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BBD, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x03, 0x0C, 0x00, 0x02, 0x8C, 0x00, 0x72, 0x54, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x54, 0x00, 0x12, 0x8C, 0x00, 0x17, 0x0C, 0x00, 0x1A, 0x04, 0x00, 0x12, 0x05, 0x00, 0x04, 0x05, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BBE, { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x10, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x00, 0x88, 0x00, 0x01, 0x07, 0x00, 0x7A, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x88, 0x00, 0x08, 0x48, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x58, 0x00, 0x09, 0x87, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BBF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x02, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x78, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x09, 0x28, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC0, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x18, 0x40, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x78, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0A, 0xA0, 0x00, 0x0C, 0x90, 0x00, 0x09, 0x08, 0x00, 0x02, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC1, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x90, 0x00, 0x0C, 0x92, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x22, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x00, 0x24, 0x00, 0x01, 0xF4, 0x00, 0x79, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0xE4, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC4, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x23, 0xFE, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x02, 0x22, 0x00, 0x01, 0xA6, 0x00, 0x78, 0xA8, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC5, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x78, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x09, 0x84, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC6, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3C, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x04, 0x00, 0x00, 0x05, 0x48, 0x00, 0x06, 0x44, 0x00, 0x04, 0x82, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x18, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x01, 0x40, 0x00, 0x7A, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x40, 0x00, 0x0C, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BC9, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x21, 0xF0, 0x00, 0x19, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x79, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x30, 0x00, 0x0B, 0x18, 0x00, 0x0D, 0x16, 0x00, 0x0A, 0x12, 0x00, 0x04, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BCA, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x17, 0x00, 0x74, 0x22, 0x00, 0x10, 0x48, 0x00, 0x11, 0x90, 0x00, 0x10, 0x20, 0x00, 0x10, 0x44, 0x00, 0x11, 0x88, 0x00, 0x14, 0x10, 0x00, 0x18, 0x60, 0x00, 0x11, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BCB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x3C, 0x00, 0x13, 0xE0, 0x00, 0x12, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x24, 0x00, 0x73, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x20, 0x00, 0x12, 0x10, 0x00, 0x12, 0x50, 0x00, 0x16, 0x89, 0x00, 0x1B, 0x49, 0x00, 0x12, 0x25, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BCC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x11, 0x08, 0x00, 0x02, 0x10, 0x00, 0x04, 0x22, 0x00, 0x73, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x14, 0x02, 0x00, 0x18, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BCD, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x00, 0x12, 0x00, 0x03, 0xFA, 0x00, 0x78, 0x02, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFA, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0xF2, 0x00, 0x0B, 0x12, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BCE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x00, 0x92, 0x00, 0x00, 0x92, 0x00, 0x38, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0B, 0x11, 0x00, 0x0D, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BCF, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x18, 0x42, 0x00, 0x08, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x82, 0x00, 0x78, 0x8A, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x10, 0xD8, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x71, 0x8F, 0x00, 0x16, 0x22, 0x00, 0x10, 0x28, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x12, 0x24, 0x00, 0x17, 0xFE, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x40, 0x00, 0x08, 0x84, 0x00, 0x01, 0x02, 0x00, 0x03, 0xFF, 0x00, 0x78, 0x01, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD3, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x00, 0x00, 0x09, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x79, 0x10, 0x00, 0x09, 0x7C, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x14, 0x00, 0x09, 0xFE, 0x00, 0x0B, 0x00, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x00, 0x28, 0x00, 0x01, 0xFC, 0x00, 0x78, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x60, 0x00, 0x08, 0x70, 0x00, 0x0A, 0xA8, 0x00, 0x0C, 0xA4, 0x00, 0x09, 0x27, 0x00, 0x02, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x14, 0x00, 0x10, 0x12, 0x00, 0x10, 0x10, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x70, 0x10, 0x00, 0x13, 0xF0, 0x00, 0x10, 0x90, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x14, 0xE9, 0x00, 0x1B, 0x89, 0x00, 0x11, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x28, 0x00, 0x19, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x7B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x00, 0x22, 0x00, 0x03, 0xFF, 0x00, 0x78, 0x08, 0x00, 0x08, 0x0A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x08, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x00, 0x24, 0x00, 0x7B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BD9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x18, 0x42, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x78, 0x90, 0x00, 0x09, 0x52, 0x00, 0x09, 0x56, 0x00, 0x0A, 0x58, 0x00, 0x0C, 0x90, 0x00, 0x08, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x87, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BDA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x14, 0x00, 0x10, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x72, 0x12, 0x00, 0x13, 0xD2, 0x00, 0x12, 0x54, 0x00, 0x12, 0x54, 0x00, 0x12, 0x48, 0x00, 0x17, 0x48, 0x00, 0x1A, 0x98, 0x00, 0x12, 0x25, 0x00, 0x04, 0x45, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BDB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x20, 0x00, 0x11, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x02, 0x20, 0x00, 0x70, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x60, 0x00, 0x10, 0x70, 0x00, 0x10, 0xB0, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x27, 0x00, 0x12, 0x22, 0x00, 0x04, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BDC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x20, 0x00, 0x19, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x00, 0x20, 0x00, 0x78, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0D, 0x09, 0x00, 0x09, 0x09, 0x00, 0x02, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BDD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x1C, 0x00, 0x19, 0xE0, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x22, 0x00, 0x7B, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BDE, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x0E, 0x00, 0x17, 0xB8, 0x00, 0x10, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x77, 0xAE, 0x00, 0x10, 0xA8, 0x00, 0x14, 0xA8, 0x00, 0x12, 0xA8, 0x00, 0x11, 0x28, 0x00, 0x15, 0x3E, 0x00, 0x19, 0x80, 0x00, 0x12, 0x40, 0x00, 0x04, 0x23, 0x00, 0x08, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BDF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x0E, 0x00, 0x19, 0xF0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x00, 0x00, 0x09, 0x02, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x42, 0x00, 0x09, 0x42, 0x00, 0x0B, 0x42, 0x00, 0x0D, 0x42, 0x00, 0x09, 0x42, 0x00, 0x02, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x18, 0x50, 0x00, 0x08, 0x88, 0x00, 0x01, 0x07, 0x00, 0x06, 0x02, 0x00, 0x79, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x10, 0xF8, 0x00, 0x11, 0x10, 0x00, 0x02, 0x22, 0x00, 0x05, 0xFF, 0x00, 0x71, 0x00, 0x00, 0x11, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x54, 0x00, 0x13, 0x48, 0x00, 0x15, 0x41, 0x00, 0x19, 0x41, 0x00, 0x12, 0x3F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE2, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x02, 0x00, 0x19, 0xFF, 0x00, 0x0A, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0xFA, 0x00, 0x78, 0x8A, 0x00, 0x08, 0x8A, 0x00, 0x08, 0xFA, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x8A, 0x00, 0x09, 0xFA, 0x00, 0x0A, 0x8A, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE3, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x1C, 0x00, 0x19, 0xE0, 0x00, 0x09, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x78, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x18, 0xF8, 0x00, 0x09, 0x10, 0x00, 0x02, 0x24, 0x00, 0x05, 0xFE, 0x00, 0x78, 0x24, 0x00, 0x08, 0x24, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x0A, 0x24, 0x00, 0x0C, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x71, 0x08, 0x00, 0x13, 0xF0, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x48, 0x00, 0x12, 0x90, 0x00, 0x15, 0x28, 0x00, 0x18, 0x44, 0x00, 0x11, 0x82, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE6, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x20, 0x88, 0x00, 0x18, 0x50, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x28, 0x00, 0x79, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x38, 0x00, 0x7B, 0xC0, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x08, 0x7E, 0x00, 0x0B, 0xC0, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xFE, 0x00, 0x1A, 0x42, 0x00, 0x0C, 0x44, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x78, 0xA0, 0x00, 0x09, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x1B, 0xDF, 0x00, 0x08, 0x42, 0x00, 0x00, 0x42, 0x00, 0x02, 0x52, 0x00, 0x79, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x08, 0x42, 0x00, 0x08, 0xC6, 0x00, 0x0B, 0x5A, 0x00, 0x08, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x09, 0x4A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BEB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x14, 0x00, 0x10, 0x12, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x72, 0x90, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x17, 0xF4, 0x00, 0x12, 0x94, 0x00, 0x12, 0x98, 0x00, 0x16, 0x90, 0x00, 0x1A, 0xB0, 0x00, 0x12, 0x49, 0x00, 0x04, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BEC, { 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x01, 0x24, 0x00, 0x71, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x12, 0xAA, 0x00, 0x14, 0xB2, 0x00, 0x10, 0x20, 0x00, 0x14, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BED, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x27, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x88, 0x00, 0x03, 0xFC, 0x00, 0x01, 0x08, 0x00, 0x71, 0x0A, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x16, 0x04, 0x00, 0x1A, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BEE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x92, 0x00, 0x0C, 0x56, 0x00, 0x04, 0x58, 0x00, 0x00, 0x12, 0x00, 0x00, 0xFF, 0x00, 0x3C, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x05, 0x82, 0x00, 0x06, 0x82, 0x00, 0x04, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BEF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x04, 0x00, 0x09, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x73, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x14, 0x50, 0x00, 0x18, 0x88, 0x00, 0x11, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x20, 0x00, 0x19, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x04, 0x22, 0x00, 0x7B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF1, { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x23, 0xE0, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xB0, 0x00, 0x71, 0x28, 0x00, 0x12, 0x27, 0x00, 0x15, 0xFA, 0x00, 0x10, 0x88, 0x00, 0x10, 0x90, 0x00, 0x10, 0x9E, 0x00, 0x15, 0x02, 0x00, 0x19, 0x02, 0x00, 0x12, 0x14, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x84, 0x00, 0x18, 0xFE, 0x00, 0x09, 0x00, 0x00, 0x02, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x78, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x0B, 0xFF, 0x00, 0x09, 0x04, 0x00, 0x09, 0x44, 0x00, 0x09, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF3, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x22, 0x82, 0x00, 0x19, 0x7F, 0x00, 0x0A, 0x88, 0x00, 0x04, 0x88, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x09, 0x88, 0x00, 0x0A, 0xBE, 0x00, 0x0C, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x8A, 0x00, 0x0A, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x08, 0x88, 0x00, 0x08, 0x50, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x79, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x54, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x10, 0x50, 0x00, 0x00, 0x22, 0x00, 0x03, 0xFF, 0x00, 0x72, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF6, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x18, 0x88, 0x00, 0x09, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x78, 0x88, 0x00, 0x08, 0xFC, 0x00, 0x09, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0x48, 0x00, 0x08, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF7, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x23, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x77, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x19, 0x04, 0x00, 0x11, 0x14, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x22, 0x00, 0x0D, 0xFC, 0x00, 0x04, 0x28, 0x00, 0x00, 0x32, 0x00, 0x03, 0xFF, 0x00, 0x78, 0x40, 0x00, 0x08, 0x84, 0x00, 0x09, 0xFE, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BF9, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2F, 0xFF, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x00, 0x03, 0xDF, 0x00, 0x02, 0x41, 0x00, 0x72, 0x51, 0x00, 0x13, 0xCA, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x44, 0x00, 0x17, 0xE4, 0x00, 0x14, 0x4A, 0x00, 0x18, 0x4A, 0x00, 0x10, 0x51, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BFA, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x88, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x22, 0x00, 0x77, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x84, 0x00, 0x11, 0xFE, 0x00, 0x16, 0x84, 0x00, 0x10, 0x84, 0x00, 0x14, 0x84, 0x00, 0x18, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BFB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x14, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x00, 0x78, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x88, 0x00, 0x08, 0x4A, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x46, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BFC, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x80, 0x00, 0x01, 0x82, 0x00, 0x02, 0x46, 0x00, 0x74, 0x68, 0x00, 0x12, 0xB0, 0x00, 0x11, 0x30, 0x00, 0x13, 0x28, 0x00, 0x14, 0xE8, 0x00, 0x10, 0xA4, 0x00, 0x15, 0x27, 0x00, 0x1A, 0x22, 0x00, 0x10, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BFD, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x03, 0xCF, 0x00, 0x00, 0x48, 0x00, 0x78, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0xCE, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x0B, 0xCF, 0x00, 0x0A, 0x48, 0x00, 0x0C, 0x48, 0x00, 0x08, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BFE, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x24, 0x00, 0x71, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x70, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x24, 0x00, 0x12, 0x27, 0x00, 0x04, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8BFF, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0xE0, 0x00, 0x18, 0x20, 0x00, 0x08, 0x24, 0x00, 0x03, 0xFE, 0x00, 0x00, 0xA8, 0x00, 0x79, 0x27, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0x30, 0x00, 0x08, 0xCC, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C00, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0xA2, 0x00, 0x1B, 0x2F, 0x00, 0x0A, 0x22, 0x00, 0x02, 0x22, 0x00, 0x03, 0xAE, 0x00, 0x7A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x84, 0x00, 0x09, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C01, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x50, 0x00, 0x08, 0x8A, 0x00, 0x08, 0xFF, 0x00, 0x01, 0x88, 0x00, 0x02, 0x88, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x8A, 0x00, 0x0C, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C02, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x01, 0x44, 0x00, 0x02, 0x23, 0x00, 0x74, 0x02, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x10, 0x80, 0x00, 0x16, 0xA4, 0x00, 0x1A, 0x92, 0x00, 0x12, 0x82, 0x00, 0x04, 0x88, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C03, { 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x02, 0x22, 0x00, 0x02, 0xFA, 0x00, 0x72, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x16, 0x8A, 0x00, 0x1A, 0xFA, 0x00, 0x12, 0x82, 0x00, 0x04, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C04, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x18, 0x7E, 0x00, 0x08, 0x84, 0x00, 0x01, 0x08, 0x00, 0x02, 0x10, 0x00, 0x78, 0x42, 0x00, 0x09, 0x9F, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xDE, 0x00, 0x09, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C05, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x71, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x12, 0x20, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x26, 0x00, 0x12, 0x23, 0x00, 0x04, 0xA1, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C06, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x18, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x79, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C07, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x79, 0x54, 0x00, 0x0A, 0x22, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C08, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00, 0x19, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x78, 0x87, 0x00, 0x0B, 0x22, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C0A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x01, 0x00, 0x08, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x71, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x19, 0x04, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C0B, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x21, 0x04, 0x00, 0x1F, 0xFF, 0x00, 0x09, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x79, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x70, 0x00, 0x0A, 0xA8, 0x00, 0x0D, 0x27, 0x00, 0x0A, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C0C, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x88, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x88, 0x00, 0x78, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x09, 0x48, 0x00, 0x0B, 0x84, 0x00, 0x0D, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C0D, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x20, 0xA8, 0x00, 0x18, 0xAA, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0xA8, 0x00, 0x00, 0xA8, 0x00, 0x78, 0xB8, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x38, 0x00, 0x0A, 0x54, 0x00, 0x0C, 0x93, 0x00, 0x09, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C0E, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x8A, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x00, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x71, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x15, 0x24, 0x00, 0x19, 0x25, 0x00, 0x12, 0x25, 0x00, 0x04, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C0F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x72, 0xAA, 0x00, 0x12, 0x72, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0xB0, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x24, 0x00, 0x12, 0x27, 0x00, 0x04, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C10, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x12, 0x12, 0x00, 0x0B, 0xD4, 0x00, 0x0A, 0x18, 0x00, 0x02, 0x11, 0x00, 0x02, 0xD1, 0x00, 0x7B, 0x2F, 0x00, 0x08, 0x44, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C11, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x20, 0x3E, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x02, 0x3E, 0x00, 0x73, 0xE0, 0x00, 0x12, 0x22, 0x00, 0x12, 0x3E, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x16, 0x80, 0x00, 0x1B, 0xFF, 0x00, 0x14, 0x80, 0x00, 0x04, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C12, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x70, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x14, 0x22, 0x00, 0x11, 0x5A, 0x00, 0x11, 0x8A, 0x00, 0x15, 0x02, 0x00, 0x19, 0xFA, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C13, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x70, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x19, 0x04, 0x00, 0x11, 0x14, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C14, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xDF, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x71, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x14, 0x04, 0x00, 0x18, 0x44, 0x00, 0x10, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C15, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x10, 0x00, 0x02, 0x08, 0x00, 0x05, 0xF7, 0x00, 0x78, 0x02, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x54, 0x00, 0x13, 0xD4, 0x00, 0x12, 0x54, 0x00, 0x13, 0xD4, 0x00, 0x16, 0x54, 0x00, 0x1A, 0x44, 0x00, 0x12, 0x54, 0x00, 0x02, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C16, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0xE0, 0x00, 0x10, 0x44, 0x00, 0x11, 0x24, 0x00, 0x00, 0xA8, 0x00, 0x07, 0xFE, 0x00, 0x70, 0x40, 0x00, 0x10, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0xF8, 0x00, 0x15, 0x88, 0x00, 0x19, 0x50, 0x00, 0x12, 0x20, 0x00, 0x04, 0x58, 0x00, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C17, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x10, 0x80, 0x00, 0x08, 0xF8, 0x00, 0x09, 0x10, 0x00, 0x03, 0xFC, 0x00, 0x01, 0x24, 0x00, 0x79, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x51, 0x00, 0x08, 0x91, 0x00, 0x0B, 0x0F, 0x00, 0x08, 0x60, 0x00, 0x08, 0x18, 0x00, 0x0A, 0xC0, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C18, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x24, 0x40, 0x00, 0x12, 0x40, 0x00, 0x12, 0x7E, 0x00, 0x00, 0x82, 0x00, 0x03, 0x24, 0x00, 0x74, 0x20, 0x00, 0x18, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x07, 0x00, 0x13, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x15, 0x04, 0x00, 0x19, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C19, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x09, 0x08, 0x00, 0x00, 0x88, 0x00, 0x00, 0x52, 0x00, 0x7B, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x0B, 0x04, 0x00, 0x0D, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C1A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x12, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x00, 0x28, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x08, 0x00, 0x09, 0x10, 0x00, 0x09, 0x24, 0x00, 0x09, 0x48, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x00, 0x0B, 0x44, 0x00, 0x0D, 0x08, 0x00, 0x0A, 0x30, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C1B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x00, 0x50, 0x00, 0x03, 0xFF, 0x00, 0x7A, 0x21, 0x00, 0x0C, 0x22, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x0B, 0x24, 0x00, 0x0D, 0x2C, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C1C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x14, 0x92, 0x00, 0x12, 0x54, 0x00, 0x02, 0x10, 0x00, 0x00, 0x12, 0x00, 0x71, 0xFF, 0x00, 0x16, 0x10, 0x00, 0x12, 0x38, 0x00, 0x12, 0x34, 0x00, 0x12, 0x52, 0x00, 0x16, 0x92, 0x00, 0x1A, 0x10, 0x00, 0x12, 0x10, 0x00, 0x05, 0x03, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C1D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x02, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x72, 0x00, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x52, 0x00, 0x16, 0x52, 0x00, 0x1B, 0xFE, 0x00, 0x12, 0x52, 0x00, 0x16, 0x52, 0x00, 0x1A, 0x5A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C1F, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x8A, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C20, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x24, 0x00, 0x10, 0xA8, 0x00, 0x17, 0xFF, 0x00, 0x04, 0x01, 0x00, 0x09, 0xFE, 0x00, 0x71, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x50, 0x00, 0x10, 0x90, 0x00, 0x14, 0x91, 0x00, 0x19, 0x11, 0x00, 0x12, 0x0F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C21, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x71, 0x04, 0x00, 0x12, 0x82, 0x00, 0x14, 0xFD, 0x00, 0x11, 0x04, 0x00, 0x12, 0x88, 0x00, 0x10, 0x50, 0x00, 0x14, 0x20, 0x00, 0x18, 0x58, 0x00, 0x11, 0x87, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C22, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x22, 0x44, 0x00, 0x17, 0xE4, 0x00, 0x14, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x7F, 0x00, 0x77, 0xC4, 0x00, 0x14, 0x44, 0x00, 0x14, 0x64, 0x00, 0x1F, 0xD4, 0x00, 0x10, 0xD4, 0x00, 0x15, 0x44, 0x00, 0x1A, 0x44, 0x00, 0x14, 0x44, 0x00, 0x09, 0x54, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C23, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x1E, 0x00, 0x13, 0xE0, 0x00, 0x11, 0x24, 0x00, 0x00, 0xA4, 0x00, 0x00, 0xA8, 0x00, 0x71, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x15, 0x24, 0x00, 0x19, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C24, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x24, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x00, 0x50, 0x00, 0x07, 0xFF, 0x00, 0x74, 0x42, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x80, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x88, 0x00, 0x14, 0x88, 0x00, 0x18, 0x88, 0x00, 0x11, 0x28, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C25, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x21, 0x04, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x71, 0x06, 0x00, 0x12, 0x02, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x54, 0x00, 0x11, 0x54, 0x00, 0x11, 0x54, 0x00, 0x15, 0x54, 0x00, 0x19, 0x54, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C26, { 0x00, 0x00, 0x00, 0x21, 0x08, 0x00, 0x10, 0x90, 0x00, 0x17, 0xFE, 0x00, 0x00, 0x90, 0x00, 0x03, 0xFC, 0x00, 0x70, 0x94, 0x00, 0x10, 0x94, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x94, 0x00, 0x10, 0x94, 0x00, 0x13, 0xFC, 0x00, 0x14, 0x90, 0x00, 0x19, 0x98, 0x00, 0x12, 0x97, 0x00, 0x04, 0x92, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C27, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x64, 0x00, 0x18, 0x24, 0x00, 0x0A, 0x8A, 0x00, 0x02, 0x91, 0x00, 0x04, 0xA1, 0x00, 0x78, 0xC4, 0x00, 0x09, 0x7C, 0x00, 0x0A, 0x00, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x54, 0x00, 0x09, 0x54, 0x00, 0x0B, 0x54, 0x00, 0x0D, 0x54, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C28, { 0x00, 0x00, 0x00, 0x20, 0x88, 0x00, 0x10, 0x8A, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x00, 0xF8, 0x00, 0x70, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x15, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C29, { 0x00, 0x00, 0x00, 0x23, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x02, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x70, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x92, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x02, 0x00, 0x11, 0xF8, 0x00, 0x11, 0x08, 0x00, 0x14, 0x90, 0x00, 0x18, 0x60, 0x00, 0x11, 0x98, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C2A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x00, 0x52, 0x00, 0x03, 0xFF, 0x00, 0x72, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x16, 0x8A, 0x00, 0x1A, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C2B, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x20, 0x48, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x01, 0xEA, 0x00, 0x01, 0x2A, 0x00, 0x79, 0xEA, 0x00, 0x09, 0x2A, 0x00, 0x09, 0xE2, 0x00, 0x09, 0x26, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x8A, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C2C, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x12, 0x52, 0x00, 0x11, 0x4A, 0x00, 0x02, 0x52, 0x00, 0x70, 0x62, 0x00, 0x10, 0x90, 0x00, 0x11, 0x28, 0x00, 0x16, 0x47, 0x00, 0x10, 0x92, 0x00, 0x11, 0x20, 0x00, 0x10, 0x48, 0x00, 0x15, 0x90, 0x00, 0x18, 0x20, 0x00, 0x10, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C2D, { 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x52, 0x00, 0x73, 0xFE, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x14, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C2E, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x27, 0xDF, 0x00, 0x11, 0x04, 0x00, 0x15, 0x14, 0x00, 0x07, 0xDF, 0x00, 0x01, 0x04, 0x00, 0x73, 0x4C, 0x00, 0x15, 0x95, 0x00, 0x19, 0x27, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x15, 0xFC, 0x00, 0x19, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C2F, { 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x20, 0x92, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x03, 0x14, 0x00, 0x05, 0xFE, 0x00, 0x71, 0x10, 0x00, 0x11, 0x14, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x11, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x15, 0x00, 0x00, 0x1A, 0x92, 0x00, 0x12, 0x49, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C30, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x20, 0xBF, 0x00, 0x12, 0x82, 0x00, 0x12, 0x2A, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x22, 0x00, 0x72, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x72, 0x00, 0x16, 0xAA, 0x00, 0x1B, 0x26, 0x00, 0x12, 0x22, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C31, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x20, 0x50, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x50, 0x00, 0x01, 0x54, 0x00, 0x00, 0xD8, 0x00, 0x77, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x19, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xFC, 0x00, 0x10, 0x48, 0x00, 0x10, 0x30, 0x00, 0x07, 0xFF, 0x00, 0x00, 0xA2, 0x00, 0x71, 0x20, 0x00, 0x16, 0x62, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x52, 0x00, 0x13, 0x8E, 0x00, 0x12, 0xFA, 0x00, 0x16, 0x8A, 0x00, 0x1A, 0xFA, 0x00, 0x12, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C33, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x20, 0x84, 0x00, 0x10, 0xA6, 0x00, 0x17, 0xF4, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x84, 0x00, 0x77, 0xF4, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x1C, 0xBA, 0x00, 0x14, 0x12, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C34, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x14, 0x92, 0x00, 0x02, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x77, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x80, 0x00, 0x16, 0xFE, 0x00, 0x1A, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x05, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C35, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0xFC, 0x00, 0x11, 0x08, 0x00, 0x13, 0xFF, 0x00, 0x06, 0x44, 0x00, 0x02, 0x92, 0x00, 0x73, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x16, 0x00, 0x00, 0x1A, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C36, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x22, 0x48, 0x00, 0x12, 0x4C, 0x00, 0x15, 0xAA, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFF, 0x00, 0x71, 0x48, 0x00, 0x17, 0x78, 0x00, 0x11, 0x4A, 0x00, 0x17, 0x7A, 0x00, 0x11, 0x4A, 0x00, 0x17, 0x74, 0x00, 0x15, 0x4D, 0x00, 0x19, 0x55, 0x00, 0x17, 0xF3, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x43, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C38, { 0x00, 0x00, 0x00, 0x03, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x78, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C39, { 0x00, 0x00, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x33, 0x08, 0x00, 0x61, 0xBF, 0x80, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x18, 0x00, 0x33, 0x12, 0x00, 0x61, 0x92, 0x00, 0x00, 0x36, 0x00, 0x3F, 0x24, 0x00, 0x21, 0x65, 0x00, 0x21, 0xCD, 0x00, 0x21, 0x09, 0x00, 0x21, 0x0F, 0x80, 0x3F, 0x38, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C3A, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0x1F, 0x00, 0x33, 0x12, 0x00, 0x61, 0x92, 0x00, 0x08, 0x12, 0x00, 0x1C, 0x12, 0x00, 0x16, 0x12, 0x00, 0x33, 0x7F, 0x80, 0x61, 0x8A, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x1A, 0x00, 0x21, 0x12, 0x00, 0x21, 0x32, 0x00, 0x21, 0x62, 0x00, 0x21, 0x02, 0x00, 0x3F, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C3D, { 0x00, 0x00, 0x00, 0x12, 0x08, 0x00, 0x12, 0x1C, 0x00, 0x33, 0x14, 0x00, 0x61, 0xB6, 0x00, 0x08, 0x63, 0x00, 0x1C, 0x5D, 0x80, 0x16, 0x00, 0x00, 0x33, 0x3F, 0x00, 0x61, 0x84, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C3E, { 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x36, 0xFF, 0x80, 0x63, 0x80, 0x80, 0x08, 0xA4, 0x80, 0x1C, 0x24, 0x00, 0x14, 0x67, 0x80, 0x36, 0xC0, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C3F, { 0x00, 0x00, 0x00, 0x07, 0x0A, 0x00, 0x38, 0x11, 0x00, 0x04, 0x20, 0x80, 0x08, 0x00, 0x00, 0x32, 0x04, 0x00, 0x14, 0x0A, 0x00, 0x09, 0x11, 0x00, 0x13, 0x20, 0x80, 0x3C, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x11, 0x1F, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C41, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0x92, 0x00, 0x24, 0xA1, 0x00, 0x07, 0x00, 0x00, 0x3C, 0x08, 0x00, 0x04, 0x14, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0xC1, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C45, { 0x00, 0x00, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x35, 0xFF, 0x80, 0x66, 0x94, 0x00, 0x08, 0x97, 0x80, 0x1D, 0xF8, 0x80, 0x14, 0x07, 0x80, 0x36, 0xF4, 0x00, 0x62, 0x97, 0x80, 0x00, 0xF4, 0x00, 0x3E, 0x97, 0x80, 0x22, 0xF4, 0x00, 0x22, 0x97, 0x80, 0x22, 0x94, 0x00, 0x22, 0x94, 0x80, 0x3E, 0xB3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x36, 0x10, 0x00, 0x14, 0x10, 0x00, 0x1E, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C48, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C49, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x63, 0x00, 0x22, 0x36, 0x00, 0x22, 0x1C, 0x00, 0x36, 0x08, 0x00, 0x14, 0x1C, 0x00, 0x1E, 0x36, 0x00, 0x70, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C4A, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x08, 0x00, 0x00, 0x90, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C4B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xBF, 0x00, 0x18, 0xC1, 0x00, 0x35, 0xE3, 0x00, 0x63, 0x36, 0x00, 0x16, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x03, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C4C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x99, 0x00, 0x00, 0x99, 0x00, 0x01, 0x69, 0x00, 0x06, 0x2B, 0x00, 0x24, 0x48, 0x00, 0x14, 0x48, 0x00, 0x1E, 0x88, 0x80, 0x31, 0x0F, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C4E, { 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x1B, 0x00, 0x21, 0x0A, 0x00, 0x3F, 0x0E, 0x00, 0x24, 0x1B, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C4F, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x7E, 0x24, 0x00, 0x01, 0xFF, 0x80, 0x3C, 0x28, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x29, 0x00, 0x24, 0x29, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x29, 0x00, 0x24, 0x29, 0x00, 0x24, 0xFF, 0x00, 0x34, 0x2C, 0x00, 0x14, 0x6A, 0x00, 0x1E, 0xAB, 0x00, 0x71, 0x29, 0x80, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C50, { 0x00, 0x00, 0x00, 0x04, 0x90, 0x00, 0x2E, 0xBD, 0x00, 0x24, 0x91, 0x00, 0x2E, 0xBD, 0x00, 0x24, 0x91, 0x00, 0x2E, 0xBD, 0x00, 0x24, 0x91, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C51, { 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x7F, 0x14, 0x00, 0x55, 0x7F, 0x00, 0x7F, 0x09, 0x00, 0x55, 0x09, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x48, 0x00, 0x7F, 0x48, 0x00, 0x00, 0x7F, 0x80, 0x7F, 0x18, 0x80, 0x41, 0x18, 0x80, 0x7F, 0x29, 0x80, 0x22, 0x29, 0x00, 0x36, 0x6B, 0x00, 0x14, 0xC8, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C53, { 0x00, 0x00, 0x00, 0x55, 0x44, 0x00, 0x7F, 0xC4, 0x00, 0x55, 0x44, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x44, 0x00, 0x7F, 0xCA, 0x00, 0x55, 0x4A, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x24, 0x80, 0x7F, 0xC2, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xAA, 0x80, 0x3F, 0xAA, 0x80, 0x11, 0x2A, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C54, { 0x00, 0x00, 0x00, 0x55, 0x44, 0x00, 0x7F, 0xC4, 0x00, 0x55, 0x5F, 0x00, 0x7F, 0xC4, 0x00, 0x55, 0x44, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x48, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x3E, 0x80, 0x7F, 0xC0, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xAA, 0x80, 0x3F, 0xAA, 0x80, 0x11, 0x2A, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x50, 0x00, 0x00, 0x90, 0x00, 0x01, 0x91, 0x00, 0x06, 0x52, 0x00, 0x38, 0xF4, 0x00, 0x01, 0x28, 0x00, 0x02, 0x28, 0x00, 0x0C, 0x68, 0x00, 0x30, 0xA4, 0x00, 0x01, 0x24, 0x80, 0x06, 0x22, 0x80, 0x18, 0x21, 0x80, 0x00, 0x40, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x14, 0x22, 0x00, 0x14, 0x66, 0x00, 0x14, 0x94, 0x00, 0x14, 0x28, 0x00, 0x14, 0x48, 0x00, 0x14, 0x9C, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x49, 0x00, 0x14, 0x98, 0x00, 0x34, 0x30, 0x80, 0x26, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C58, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x09, 0x80, 0x08, 0x0F, 0x00, 0x19, 0xF8, 0x00, 0x33, 0x08, 0x00, 0x6A, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x34, 0x49, 0x00, 0x66, 0x49, 0x00, 0x0D, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x34, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x80, 0x0C, 0x09, 0x80, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C59, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x07, 0x82, 0x00, 0x38, 0xC6, 0x00, 0x03, 0x4C, 0x00, 0x3C, 0x70, 0x00, 0x00, 0xD8, 0x00, 0x07, 0x4E, 0x00, 0x7C, 0x43, 0x80, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x40, 0x00, 0x12, 0x20, 0x00, 0x12, 0x51, 0x00, 0x1E, 0x92, 0x00, 0x13, 0x2C, 0x00, 0x12, 0x48, 0x00, 0x12, 0x88, 0x00, 0x1F, 0x1C, 0x00, 0x12, 0x2C, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x8A, 0x00, 0x13, 0x09, 0x00, 0x22, 0x11, 0x00, 0x26, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3C, 0x00, 0x08, 0x24, 0x00, 0x19, 0x24, 0x00, 0x33, 0x24, 0x00, 0x6A, 0x64, 0x00, 0x1C, 0xC7, 0x80, 0x34, 0x00, 0x00, 0x66, 0x7E, 0x00, 0x0D, 0x22, 0x00, 0x1C, 0x36, 0x00, 0x34, 0x1C, 0x00, 0x64, 0x08, 0x00, 0x04, 0x1C, 0x00, 0x0C, 0x36, 0x00, 0x38, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x19, 0x49, 0x00, 0x33, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x34, 0x7F, 0x00, 0x66, 0x40, 0x00, 0x0D, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x34, 0x40, 0x00, 0x64, 0x40, 0x00, 0x04, 0x40, 0x80, 0x0C, 0x61, 0x80, 0x38, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C61, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x32, 0x00, 0x0C, 0x54, 0x00, 0x31, 0x98, 0x00, 0x06, 0x38, 0x00, 0x38, 0xD4, 0x00, 0x03, 0x12, 0x00, 0x1C, 0x11, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C62, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x71, 0x03, 0x80, 0x06, 0x8C, 0x00, 0x19, 0xD8, 0x00, 0x06, 0x60, 0x00, 0x18, 0xD0, 0x00, 0x03, 0x4C, 0x00, 0x3C, 0x43, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xF7, 0x80, 0x08, 0x42, 0x00, 0x10, 0x42, 0x00, 0x22, 0x42, 0x00, 0x54, 0x42, 0x00, 0x18, 0x72, 0x00, 0x28, 0xCF, 0x80, 0x4C, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x18, 0x42, 0x00, 0x28, 0x42, 0x00, 0x48, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x18, 0x82, 0x00, 0x31, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x19, 0x42, 0x00, 0x33, 0x7E, 0x00, 0x6A, 0x42, 0x00, 0x1C, 0x42, 0x00, 0x34, 0x7E, 0x00, 0x66, 0x48, 0x80, 0x0D, 0x49, 0x80, 0x1C, 0xCF, 0x00, 0x34, 0x44, 0x00, 0x64, 0x46, 0x00, 0x04, 0x42, 0x00, 0x0C, 0x7B, 0x00, 0x39, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C66, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x21, 0xFC, 0x00, 0x2F, 0x01, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x21, 0x80, 0x00, 0x2E, 0x63, 0x00, 0x61, 0xB6, 0x00, 0x4E, 0x68, 0x00, 0x41, 0xAC, 0x00, 0x0E, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C68, { 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x1C, 0x00, 0x19, 0x36, 0x00, 0x33, 0x63, 0x00, 0x6A, 0x10, 0x00, 0x1C, 0xFF, 0x80, 0x34, 0x20, 0x00, 0x66, 0x48, 0x00, 0x0D, 0x7F, 0x00, 0x1C, 0xC9, 0x00, 0x35, 0x49, 0x00, 0x64, 0x49, 0x00, 0x04, 0x49, 0x00, 0x0C, 0x4B, 0x00, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x19, 0x19, 0x00, 0x33, 0x33, 0x00, 0x6A, 0x6A, 0x00, 0x1C, 0x1C, 0x00, 0x34, 0x34, 0x00, 0x66, 0x66, 0x00, 0x0D, 0x0D, 0x00, 0x1C, 0x1D, 0x80, 0x34, 0x34, 0x00, 0x64, 0x64, 0x00, 0x04, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C6A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x0F, 0xFF, 0x00, 0x01, 0x62, 0x00, 0x06, 0x94, 0x00, 0x39, 0x38, 0x00, 0x1E, 0x54, 0x00, 0x01, 0x92, 0x00, 0x1E, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C6B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x44, 0x00, 0x12, 0x88, 0x00, 0x0D, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xFF, 0x00, 0x05, 0x30, 0x00, 0x04, 0x49, 0x00, 0x04, 0x9A, 0x00, 0x07, 0x2C, 0x00, 0x04, 0x4C, 0x00, 0x05, 0x9A, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x49, 0x00, 0x0D, 0xB0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C6C, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x7F, 0x00, 0x19, 0x12, 0x00, 0x33, 0x16, 0x00, 0x6A, 0x14, 0x00, 0x1C, 0xFF, 0x80, 0x34, 0x0C, 0x00, 0x66, 0x12, 0x00, 0x0D, 0x3F, 0x00, 0x1C, 0x61, 0x00, 0x34, 0xA1, 0x00, 0x64, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x21, 0x00, 0x38, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xF7, 0x80, 0x08, 0x90, 0x80, 0x10, 0x90, 0x80, 0x22, 0x90, 0x80, 0x54, 0xF7, 0x80, 0x18, 0x80, 0x00, 0x28, 0x8F, 0x80, 0x4C, 0xF4, 0x80, 0x0A, 0x85, 0x80, 0x18, 0x85, 0x00, 0x28, 0xF7, 0x00, 0x48, 0x82, 0x00, 0x08, 0x87, 0x00, 0x18, 0x8D, 0x80, 0x30, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C73, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x89, 0x00, 0x28, 0x91, 0x00, 0x35, 0xAB, 0x00, 0x26, 0x8D, 0x00, 0x2A, 0x95, 0x00, 0x33, 0xA7, 0x00, 0x26, 0x8D, 0x00, 0x2A, 0x95, 0x00, 0x32, 0xA5, 0x00, 0x2C, 0x99, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C75, { 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x7C, 0x91, 0x00, 0x09, 0x91, 0x00, 0x11, 0x2A, 0x80, 0x23, 0x2A, 0x80, 0x54, 0x80, 0x00, 0x18, 0x84, 0x00, 0x29, 0x84, 0x00, 0x4D, 0x24, 0x00, 0x0B, 0x27, 0x00, 0x19, 0x24, 0x00, 0x29, 0x24, 0x00, 0x49, 0x24, 0x00, 0x09, 0x34, 0x00, 0x19, 0x2C, 0x00, 0x31, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C76, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x19, 0x22, 0x00, 0x33, 0xFF, 0x80, 0x6A, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x34, 0x7F, 0x00, 0x66, 0x41, 0x00, 0x0D, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x34, 0x7F, 0x00, 0x64, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x0C, 0x22, 0x00, 0x38, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C78, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x70, 0x00, 0x0F, 0xC2, 0x00, 0x02, 0x6E, 0x00, 0x03, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x1F, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0xD0, 0x00, 0x03, 0xB8, 0x00, 0x1E, 0x68, 0x00, 0x00, 0xC8, 0x00, 0x03, 0x88, 0x00, 0x1E, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C79, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x90, 0x00, 0x15, 0x20, 0x00, 0x2A, 0x7F, 0x80, 0x04, 0x80, 0x80, 0x0B, 0x00, 0x80, 0x12, 0x00, 0x80, 0x23, 0x3E, 0x80, 0x05, 0x00, 0x80, 0x09, 0x00, 0x80, 0x33, 0x00, 0x80, 0x05, 0x00, 0x80, 0x09, 0x00, 0x80, 0x31, 0x00, 0x80, 0x02, 0x01, 0x00, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C7A, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x84, 0x00, 0x0A, 0x84, 0x00, 0x11, 0x04, 0x00, 0x2A, 0xFF, 0x80, 0x06, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x36, 0x0C, 0x00, 0x06, 0x14, 0x00, 0x09, 0x14, 0x00, 0x33, 0x24, 0x00, 0x05, 0x44, 0x00, 0x09, 0x84, 0x00, 0x31, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C7B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x65, 0x08, 0x00, 0x12, 0x08, 0x00, 0x04, 0x08, 0x00, 0x18, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x12, 0x08, 0x00, 0x66, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x12, 0x08, 0x00, 0x62, 0x08, 0x00, 0x06, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C7C, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x18, 0x44, 0x00, 0x65, 0x44, 0x00, 0x12, 0x44, 0x00, 0x04, 0x45, 0x80, 0x18, 0x77, 0x00, 0x64, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x44, 0x00, 0x66, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x44, 0x00, 0x62, 0x44, 0x80, 0x06, 0x74, 0x80, 0x1D, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C7E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x65, 0x08, 0x00, 0x12, 0x08, 0x00, 0x04, 0x18, 0x00, 0x18, 0x10, 0x00, 0x64, 0x34, 0x00, 0x04, 0x36, 0x00, 0x0A, 0x53, 0x00, 0x12, 0xD1, 0x80, 0x66, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x12, 0x10, 0x00, 0x62, 0x00, 0x00, 0x06, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C82, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x2A, 0x11, 0x00, 0x04, 0x11, 0x00, 0x0C, 0x21, 0x00, 0x12, 0x41, 0x00, 0x25, 0x8E, 0x00, 0x09, 0x00, 0x00, 0x13, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x09, 0x41, 0x00, 0x11, 0x41, 0x00, 0x21, 0x41, 0x00, 0x02, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C85, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x18, 0x24, 0x00, 0x65, 0x64, 0x00, 0x12, 0x44, 0x00, 0x04, 0x7F, 0x80, 0x18, 0xC4, 0x00, 0x65, 0x44, 0x00, 0x04, 0x4E, 0x00, 0x0A, 0x4E, 0x00, 0x12, 0x55, 0x00, 0x66, 0x55, 0x00, 0x0A, 0x64, 0x80, 0x12, 0x44, 0x00, 0x62, 0x44, 0x00, 0x06, 0x44, 0x00, 0x1C, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C86, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0xFF, 0x00, 0x65, 0x00, 0x00, 0x12, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x18, 0x42, 0x00, 0x64, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x0A, 0x42, 0x00, 0x12, 0x42, 0x00, 0x66, 0x42, 0x00, 0x0A, 0x7E, 0x00, 0x12, 0x00, 0x00, 0x62, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C87, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x7E, 0x00, 0x65, 0x42, 0x00, 0x12, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x18, 0x42, 0x00, 0x64, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x0A, 0x48, 0x80, 0x12, 0x49, 0x80, 0x66, 0x4F, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x46, 0x00, 0x62, 0x42, 0x00, 0x06, 0x7B, 0x00, 0x1D, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C89, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x65, 0x3F, 0x00, 0x12, 0x61, 0x00, 0x04, 0xD3, 0x00, 0x18, 0x16, 0x00, 0x64, 0x0C, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x33, 0x00, 0x12, 0xE1, 0x80, 0x66, 0x00, 0x00, 0x0A, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x62, 0x21, 0x00, 0x06, 0x21, 0x00, 0x1C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C8A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x15, 0x08, 0x00, 0x32, 0x10, 0x00, 0x0C, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x11, 0x41, 0x00, 0x23, 0x41, 0x00, 0x03, 0x7F, 0x00, 0x05, 0x41, 0x00, 0x09, 0x41, 0x00, 0x31, 0x41, 0x00, 0x01, 0x41, 0x00, 0x02, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C8B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x65, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x18, 0x41, 0x00, 0x64, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x66, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x62, 0x08, 0x00, 0x06, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C8C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x15, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x14, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x12, 0x41, 0x00, 0x23, 0x7F, 0x00, 0x05, 0x14, 0x00, 0x05, 0x14, 0x00, 0x09, 0x24, 0x00, 0x11, 0x24, 0x00, 0x01, 0x44, 0x80, 0x02, 0x84, 0x80, 0x0D, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C8D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0x7F, 0x00, 0x65, 0x49, 0x00, 0x12, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x18, 0x49, 0x00, 0x64, 0x49, 0x00, 0x04, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x66, 0x08, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x62, 0x08, 0x00, 0x06, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C8E, { 0x00, 0x00, 0x00, 0x04, 0x30, 0x00, 0x08, 0x67, 0x00, 0x15, 0x41, 0x00, 0x62, 0x41, 0x00, 0x14, 0x77, 0x00, 0x08, 0x41, 0x00, 0x14, 0x41, 0x00, 0x64, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x14, 0x00, 0x66, 0x14, 0x00, 0x0A, 0x14, 0x00, 0x12, 0x34, 0x00, 0x62, 0x24, 0x80, 0x06, 0x64, 0x80, 0x1C, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C90, { 0x00, 0x00, 0x00, 0x04, 0xF0, 0x00, 0x18, 0x18, 0x00, 0x64, 0x6C, 0x00, 0x12, 0xC6, 0x00, 0x05, 0xBB, 0x80, 0x18, 0x00, 0x00, 0x64, 0xF4, 0x80, 0x04, 0x94, 0x80, 0x0A, 0x9D, 0x80, 0x12, 0xD9, 0x00, 0x66, 0xB9, 0x00, 0x0A, 0x99, 0x00, 0x12, 0xDD, 0x80, 0x62, 0xB4, 0x80, 0x06, 0x94, 0x80, 0x1C, 0xB4, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C92, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x18, 0x88, 0x80, 0x65, 0x88, 0x80, 0x12, 0x88, 0x80, 0x04, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x64, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x0A, 0x10, 0x00, 0x12, 0xFF, 0x80, 0x66, 0xA4, 0x80, 0x0A, 0xA4, 0x80, 0x12, 0xA4, 0x80, 0x62, 0xA4, 0x80, 0x06, 0xA4, 0x80, 0x1C, 0xA5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C93, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x18, 0x22, 0x00, 0x65, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x04, 0x22, 0x00, 0x18, 0x00, 0x00, 0x64, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x49, 0x00, 0x66, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x62, 0x49, 0x00, 0x06, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C94, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x18, 0x10, 0x00, 0x65, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x04, 0x55, 0x00, 0x18, 0x49, 0x00, 0x64, 0x55, 0x00, 0x04, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x66, 0x44, 0x00, 0x0A, 0x75, 0x80, 0x12, 0x47, 0x00, 0x62, 0x44, 0x00, 0x06, 0x74, 0x80, 0x1C, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C98, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x10, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x44, 0x44, 0x00, 0x28, 0x44, 0x00, 0x10, 0xFE, 0x00, 0x68, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x64, 0xFE, 0x00, 0x0C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x64, 0x28, 0x00, 0x04, 0x6C, 0x00, 0x0C, 0xC6, 0x00, 0x39, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C99, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x18, 0xFF, 0x80, 0x65, 0x80, 0x00, 0x12, 0x9E, 0x00, 0x04, 0x92, 0x00, 0x18, 0x92, 0x00, 0x64, 0x9E, 0x00, 0x04, 0x80, 0x00, 0x0A, 0x80, 0x00, 0x12, 0xBB, 0x80, 0x66, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x62, 0xBB, 0x80, 0x06, 0x80, 0x00, 0x1C, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C9B, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x18, 0xE3, 0x80, 0x65, 0x22, 0x00, 0x12, 0x77, 0x00, 0x04, 0x55, 0x00, 0x18, 0x77, 0x00, 0x64, 0x22, 0x00, 0x04, 0x24, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0xC4, 0x00, 0x67, 0x7E, 0x00, 0x0A, 0x44, 0x00, 0x12, 0x7E, 0x00, 0x62, 0x44, 0x00, 0x06, 0x44, 0x00, 0x1C, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C9C, { 0x00, 0x00, 0x00, 0x05, 0xEF, 0x00, 0x19, 0x29, 0x00, 0x65, 0xEF, 0x00, 0x13, 0x29, 0x00, 0x05, 0xEF, 0x00, 0x19, 0x29, 0x00, 0x71, 0xFF, 0x80, 0x0B, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x15, 0x10, 0x00, 0x65, 0xFF, 0x00, 0x0D, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x64, 0x84, 0x00, 0x0C, 0x78, 0x00, 0x1B, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8C9D, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8C9E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CA0, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x28, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CA1, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x06, 0x00, 0x22, 0x06, 0x00, 0x22, 0x0A, 0x00, 0x22, 0x0A, 0x00, 0x3E, 0x12, 0x00, 0x22, 0x12, 0x00, 0x22, 0x22, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x82, 0x00, 0x14, 0x02, 0x00, 0x22, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CA4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x48, 0x00, 0x22, 0x48, 0x00, 0x22, 0x4B, 0x00, 0x3E, 0x4D, 0x00, 0x22, 0x59, 0x00, 0x22, 0x69, 0x00, 0x23, 0xC9, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x22, 0x48, 0x00, 0x3E, 0x40, 0x00, 0x14, 0x40, 0x80, 0x36, 0x61, 0x80, 0x62, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CA7, { 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x31, 0x05, 0x80, 0x02, 0x04, 0x00, 0x0C, 0x08, 0x00, 0x30, 0x30, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CA8, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x47, 0x00, 0x08, 0x78, 0x00, 0x18, 0x40, 0x00, 0x28, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x61, 0x00, 0x3E, 0x51, 0x00, 0x22, 0x52, 0x00, 0x22, 0x4A, 0x00, 0x3E, 0x4C, 0x00, 0x22, 0x4C, 0x00, 0x00, 0x54, 0x00, 0x12, 0x92, 0x00, 0x12, 0xA1, 0x00, 0x23, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CAA, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x20, 0x00, 0x02, 0x18, 0x00, 0x0D, 0xF6, 0x00, 0x30, 0x01, 0x80, 0x07, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CAC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CAD, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x32, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x61, 0x04, 0x00, 0x03, 0x06, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CAE, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x4C, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC6, 0x00, 0x08, 0x82, 0x80, 0x18, 0xC3, 0x80, 0x30, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CAF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CB0, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CB2, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x14, 0x23, 0x00, 0x17, 0xBE, 0x00, 0x14, 0x20, 0x80, 0x14, 0x21, 0x80, 0x1F, 0x9F, 0x00, 0x70, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CB3, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x0F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x50, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x80, 0x08, 0x82, 0x80, 0x10, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CB4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CB6, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x1C, 0x00, 0x22, 0xE8, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x01, 0x00, 0x22, 0x02, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x08, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x20, 0x00, 0x01, 0x40, 0x00, 0x14, 0xC0, 0x00, 0x13, 0x3F, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x21, 0x10, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CB8, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x5F, 0x80, 0x1B, 0xE0, 0x00, 0x28, 0x20, 0x80, 0x08, 0x18, 0x80, 0x08, 0x07, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CB9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x48, 0x00, 0x22, 0x48, 0x00, 0x22, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0xC8, 0x00, 0x22, 0x88, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x14, 0x08, 0x00, 0x36, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x64, 0x00, 0x14, 0x44, 0x80, 0x36, 0xC4, 0x80, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CBB, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x10, 0x80, 0x0C, 0x11, 0x00, 0x3F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CBC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x0F, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CBD, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x47, 0x00, 0x11, 0xF8, 0x80, 0x1F, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x12, 0x41, 0x00, 0x11, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CBF, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x7F, 0x00, 0x10, 0x11, 0x00, 0x11, 0x11, 0x00, 0x17, 0xA1, 0x00, 0x38, 0x4E, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x26, 0x21, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x48, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x42, 0x00, 0x1E, 0xA4, 0x00, 0x13, 0x18, 0x00, 0x12, 0x18, 0x00, 0x12, 0x26, 0x00, 0x1E, 0xC1, 0x80, 0x13, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x26, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC3, { 0x00, 0x00, 0x00, 0x04, 0x0F, 0x00, 0x04, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x19, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x1E, 0x40, 0x00, 0x12, 0xFF, 0x00, 0x13, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x12, 0x41, 0x00, 0x21, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x30, 0x00, 0x22, 0x62, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x0C, 0x00, 0x22, 0x19, 0x00, 0x22, 0x33, 0x00, 0x22, 0xE6, 0x00, 0x3E, 0x0C, 0x00, 0x14, 0x1A, 0x00, 0x36, 0x33, 0x00, 0x62, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CC6, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x66, 0x00, 0x22, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x64, 0x00, 0x14, 0x44, 0x00, 0x36, 0xC4, 0x00, 0x63, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC7, { 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x04, 0xFF, 0x00, 0x05, 0x12, 0x00, 0x0A, 0x10, 0x00, 0x10, 0x28, 0x00, 0x10, 0xC6, 0x00, 0x23, 0x01, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CC9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x18, 0x00, 0x22, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x55, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x14, 0x55, 0x00, 0x36, 0xFF, 0x80, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CCA, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x3C, 0x09, 0x00, 0x24, 0x08, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x3C, 0x48, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x27, 0xFA, 0x00, 0x3C, 0x4A, 0x00, 0x24, 0x8C, 0x00, 0x24, 0x88, 0x00, 0x3C, 0x8C, 0x00, 0x00, 0x14, 0x80, 0x24, 0x22, 0x80, 0x22, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CCB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x22, 0x63, 0x00, 0x22, 0xC1, 0x80, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x36, 0x00, 0x22, 0x1C, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x14, 0x36, 0x00, 0x36, 0x63, 0x00, 0x62, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CCD, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x5F, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x14, 0x84, 0x00, 0x36, 0x04, 0x00, 0x62, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CCE, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x12, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x19, 0x00, 0x22, 0x0B, 0x00, 0x22, 0x0E, 0x00, 0x3E, 0x04, 0x00, 0x14, 0x1E, 0x80, 0x36, 0xF3, 0x80, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x33, 0x33, 0x00, 0x61, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x80, 0x00, 0x22, 0x80, 0x00, 0x22, 0x80, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x80, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0xA8, 0x00, 0x22, 0xA9, 0x00, 0x22, 0xA6, 0x00, 0x22, 0xA4, 0x00, 0x3E, 0xA2, 0x00, 0x00, 0xBE, 0x00, 0x15, 0x61, 0x00, 0x23, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CD3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x02, 0x44, 0x00, 0x04, 0x58, 0x00, 0x18, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x38, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CD5, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3E, 0x13, 0x00, 0x22, 0x11, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x91, 0x00, 0x22, 0xD3, 0x00, 0x22, 0x56, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x18, 0x00, 0x22, 0x5C, 0x00, 0x22, 0x56, 0x00, 0x3E, 0xD3, 0x00, 0x15, 0x91, 0x80, 0x36, 0x10, 0x00, 0x62, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CD6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x28, 0x00, 0x22, 0x6C, 0x00, 0x3E, 0x46, 0x00, 0x22, 0xC3, 0x00, 0x23, 0xBD, 0x80, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x14, 0xD6, 0x00, 0x36, 0x93, 0x00, 0x62, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x80, 0x22, 0x48, 0x80, 0x3E, 0x5E, 0x80, 0x22, 0x48, 0x80, 0x22, 0x5E, 0x80, 0x22, 0x48, 0x80, 0x3E, 0x40, 0x80, 0x22, 0x5E, 0x80, 0x22, 0x52, 0x80, 0x22, 0x52, 0x80, 0x3E, 0x5E, 0x80, 0x14, 0x40, 0x80, 0x36, 0xC0, 0x80, 0x62, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CDA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0xF1, 0x00, 0x03, 0x58, 0x00, 0x0C, 0x46, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CDB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x60, 0x01, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x12, 0x80, 0x24, 0x22, 0x80, 0x24, 0x44, 0x80, 0x25, 0x88, 0x80, 0x3C, 0x10, 0x80, 0x10, 0x21, 0x00, 0x24, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x3C, 0x68, 0x00, 0x24, 0xCF, 0x80, 0x25, 0x80, 0x00, 0x24, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x54, 0x00, 0x24, 0x54, 0x00, 0x3C, 0xD6, 0x00, 0x14, 0x93, 0x00, 0x37, 0x91, 0x80, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CDE, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CE0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x82, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x26, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CE1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xA2, 0x00, 0x17, 0xFE, 0x00, 0x12, 0x04, 0x00, 0x17, 0xFE, 0x00, 0x1A, 0x05, 0x80, 0x13, 0xFC, 0x00, 0x32, 0x04, 0x00, 0x23, 0xFC, 0x00, 0x61, 0x08, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CE2, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x21, 0x00, 0x3F, 0x12, 0x00, 0x21, 0x0C, 0x00, 0x3F, 0x0C, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xA1, 0x80, 0x20, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CE3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CE4, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3E, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x18, 0x80, 0x22, 0x6C, 0x80, 0x23, 0x83, 0x80, 0x22, 0x28, 0x00, 0x3E, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x11, 0x00, 0x22, 0x0A, 0x00, 0x3E, 0x0C, 0x80, 0x14, 0x36, 0x80, 0x22, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CE6, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1E, 0x05, 0x00, 0x12, 0x7C, 0x80, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x12, 0x14, 0x00, 0x1E, 0x54, 0x00, 0x12, 0x5C, 0x00, 0x12, 0x54, 0x00, 0x12, 0x54, 0x00, 0x1E, 0x5A, 0x80, 0x01, 0xE2, 0x80, 0x12, 0x01, 0x80, 0x21, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CE8, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x19, 0x86, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CEA, { 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x1C, 0x38, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x40, 0x00, 0x22, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x22, 0x4E, 0x00, 0x3E, 0x44, 0x00, 0x14, 0x46, 0x00, 0x36, 0x73, 0x00, 0x62, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CED, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x80, 0x22, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x12, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x0C, 0x00, 0x22, 0x12, 0x00, 0x3E, 0x20, 0x00, 0x22, 0xFE, 0x00, 0x23, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x12, 0x42, 0x00, 0x21, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CEF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0xFF, 0x80, 0x23, 0x80, 0x80, 0x3E, 0x7C, 0x80, 0x22, 0x44, 0x80, 0x22, 0x7C, 0x80, 0x22, 0x44, 0x80, 0x3E, 0x7D, 0x80, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x36, 0x08, 0x00, 0x62, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CF0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x28, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x22, 0xFF, 0x00, 0x23, 0x42, 0x80, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x14, 0x42, 0x00, 0x36, 0x42, 0x00, 0x62, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CF2, { 0x00, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x30, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x11, 0x11, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CF4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x04, 0x13, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xFF, 0x80, 0x24, 0xA0, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x20, 0x80, 0x0E, 0x3F, 0x80, 0x0D, 0x20, 0x80, 0x14, 0xBF, 0x80, 0x14, 0x00, 0x00, 0x24, 0x11, 0x00, 0x04, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0xBE, 0x80, 0x3E, 0x80, 0x80, 0x22, 0xBE, 0x80, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x36, 0x41, 0x00, 0x62, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CF7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x3E, 0xBE, 0x00, 0x22, 0xA2, 0x00, 0x3E, 0xBE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x48, 0x04, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CF8, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x48, 0x00, 0x34, 0x48, 0x00, 0x2F, 0xFF, 0x80, 0x24, 0x84, 0x00, 0x25, 0xFE, 0x00, 0x36, 0x85, 0x80, 0x2C, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x64, 0xFC, 0x00, 0x4D, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CFA, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3E, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x28, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x29, 0x00, 0x22, 0x29, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x29, 0x00, 0x22, 0x29, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x2C, 0x00, 0x3E, 0x6A, 0x00, 0x14, 0xAB, 0x00, 0x37, 0x29, 0x80, 0x62, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CFB, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x12, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x93, 0x00, 0x12, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x12, 0x24, 0x00, 0x21, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CFC, { 0x00, 0x00, 0x00, 0x1E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x26, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CFD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x05, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8CFE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x44, 0x08, 0x00, 0x44, 0x3F, 0x00, 0x44, 0x08, 0x00, 0x57, 0x7F, 0x80, 0x51, 0x00, 0x00, 0x51, 0x3F, 0x00, 0x51, 0x21, 0x00, 0x57, 0x3F, 0x00, 0x44, 0x21, 0x00, 0x44, 0x3F, 0x00, 0x44, 0x21, 0x00, 0x44, 0x3F, 0x00, 0x7F, 0x12, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8CFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xEF, 0x00, 0x22, 0x63, 0x00, 0x22, 0xA5, 0x00, 0x3E, 0x63, 0x00, 0x22, 0xA5, 0x00, 0x22, 0x11, 0x00, 0x22, 0x38, 0x00, 0x3E, 0xEE, 0x00, 0x23, 0x83, 0x80, 0x22, 0x10, 0x00, 0x22, 0x64, 0x00, 0x3E, 0x19, 0x00, 0x14, 0x62, 0x00, 0x36, 0x0C, 0x00, 0x62, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D01, { 0x00, 0x00, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x42, 0x00, 0x22, 0xC2, 0x00, 0x3E, 0x22, 0x00, 0x41, 0x36, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x1C, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x1C, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x41, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D03, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x05, 0x00, 0x3E, 0x52, 0x80, 0x14, 0x50, 0x00, 0x36, 0xD9, 0x00, 0x62, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D04, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x3E, 0x00, 0x3F, 0xCA, 0x00, 0x11, 0x1A, 0x00, 0x3F, 0x8E, 0x80, 0x04, 0x12, 0x80, 0x1F, 0x21, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D05, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xD4, 0x00, 0x04, 0x0C, 0x00, 0x0F, 0x92, 0x00, 0x11, 0x61, 0x80, 0x26, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D07, { 0x00, 0x00, 0x00, 0x08, 0xEA, 0x00, 0x08, 0x09, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x28, 0x00, 0x14, 0xBC, 0x00, 0x08, 0xA2, 0x80, 0x16, 0xBD, 0x80, 0x21, 0xE0, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D08, { 0x00, 0x00, 0x00, 0x1E, 0x0C, 0x00, 0x12, 0x22, 0x00, 0x12, 0x41, 0x00, 0x13, 0x80, 0x80, 0x12, 0xFF, 0x80, 0x1E, 0x88, 0x80, 0x12, 0xAA, 0x80, 0x13, 0x9C, 0x80, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x28, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0xA9, 0x00, 0x22, 0xB9, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x36, 0x10, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D0A, { 0x00, 0x00, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0x14, 0x00, 0x1F, 0xBF, 0x80, 0x22, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x4A, 0x80, 0x31, 0xF3, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D0B, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x44, 0x00, 0x24, 0xFF, 0x80, 0x2D, 0x88, 0x00, 0x36, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x62, 0x02, 0x00, 0x43, 0xFE, 0x00, 0x0E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D0D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1E, 0x7E, 0x00, 0x12, 0x84, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x94, 0x00, 0x1E, 0xF7, 0x80, 0x12, 0x80, 0x00, 0x12, 0xBE, 0x00, 0x12, 0x80, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0xBE, 0x00, 0x12, 0xBE, 0x00, 0x12, 0x80, 0x00, 0x12, 0xFF, 0x00, 0x22, 0xC1, 0x00, 0x27, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D0F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xED, 0x00, 0x25, 0x2B, 0x00, 0x3D, 0xE9, 0x00, 0x24, 0xC9, 0x00, 0x4D, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D10, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0x11, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x80, 0x3C, 0xA5, 0x00, 0x25, 0x24, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0xA9, 0x00, 0x14, 0xA9, 0x00, 0x32, 0xA9, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D12, { 0x00, 0x00, 0x00, 0x7F, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x7E, 0x92, 0x00, 0x42, 0xFE, 0x00, 0x7E, 0x15, 0x00, 0x48, 0xA2, 0x00, 0x7F, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D13, { 0x00, 0x00, 0x00, 0x38, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x28, 0x05, 0x00, 0x3A, 0xFF, 0x80, 0x2A, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2B, 0xD4, 0x80, 0x38, 0xF4, 0x80, 0x28, 0xD5, 0x00, 0x2B, 0xD5, 0x00, 0x2A, 0xF6, 0x00, 0x3A, 0xD2, 0x00, 0x02, 0xD6, 0x80, 0x29, 0x79, 0x80, 0x26, 0x50, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D14, { 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x0C, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x61, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D16, { 0x00, 0x00, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0x29, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x14, 0x82, 0x00, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D17, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x2C, 0x82, 0x00, 0x34, 0xFF, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x80, 0x65, 0x54, 0x80, 0x45, 0x2A, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D1B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x3F, 0x80, 0x22, 0x52, 0x00, 0x14, 0x0C, 0x00, 0x7F, 0x73, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D1D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x01, 0x20, 0x00, 0x02, 0x10, 0x00, 0x04, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D1E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x20, 0x00, 0x02, 0x18, 0x00, 0x0C, 0x04, 0x00, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D1F, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x08, 0x24, 0x00, 0x17, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x00, 0xB0, 0x00, 0x01, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D21, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D22, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2A, 0x0A, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x88, 0x00, 0x15, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0x08, 0x00, 0x40, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D23, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D24, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x88, 0x00, 0x24, 0x50, 0x00, 0x24, 0x20, 0x00, 0x24, 0x50, 0x00, 0x25, 0x8F, 0x00, 0x0F, 0xFA, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D25, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x22, 0x22, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x08, 0x10, 0x00, 0x14, 0x28, 0x00, 0x12, 0x47, 0x00, 0x22, 0x82, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D26, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x3F, 0x42, 0x00, 0x22, 0x42, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x42, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x08, 0x44, 0x00, 0x14, 0x47, 0x00, 0x22, 0x62, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D27, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x4C, 0x00, 0x18, 0x70, 0x00, 0x2B, 0xC1, 0x00, 0x48, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D28, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x04, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x14, 0x44, 0x00, 0x24, 0x84, 0x00, 0x21, 0x38, 0x00, 0x46, 0x06, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D29, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x0E, 0x00, 0x22, 0xF0, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA8, 0x00, 0x2A, 0x98, 0x00, 0x2A, 0x90, 0x00, 0x08, 0xA8, 0x00, 0x15, 0x24, 0x00, 0x22, 0x47, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D2A, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x03, 0x20, 0x00, 0x04, 0x98, 0x00, 0x1B, 0xE7, 0x00, 0x60, 0x22, 0x00, 0x00, 0x48, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x02, 0x60, 0x00, 0x04, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D2B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x02, 0x20, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xE8, 0x00, 0x12, 0x27, 0x00, 0x62, 0x22, 0x00, 0x04, 0xA0, 0x00, 0x18, 0x48, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D2C, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x0E, 0x00, 0x22, 0xF0, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x20, 0x00, 0x14, 0x40, 0x00, 0x23, 0xA3, 0x00, 0x41, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D2D, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x3F, 0x40, 0x00, 0x22, 0x42, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x82, 0x00, 0x2B, 0x02, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xFA, 0x00, 0x08, 0x0A, 0x00, 0x14, 0x02, 0x00, 0x22, 0x14, 0x00, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D2E, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x10, 0x00, 0x22, 0x10, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x2B, 0x02, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x08, 0x02, 0x00, 0x15, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D2F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x30, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D30, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x49, 0x00, 0x05, 0x05, 0x00, 0x08, 0xC5, 0x00, 0x30, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D31, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x28, 0x00, 0x22, 0x24, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x3E, 0x00, 0x2A, 0xE0, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x3E, 0x00, 0x2B, 0xE0, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x30, 0x00, 0x14, 0x49, 0x00, 0x23, 0x85, 0x00, 0x42, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D32, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x02, 0x10, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D33, { 0x00, 0x00, 0x00, 0x09, 0x10, 0x00, 0x09, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x02, 0x10, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D34, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x22, 0x22, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x08, 0x82, 0x00, 0x14, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D35, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D36, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x08, 0x48, 0x00, 0x14, 0x49, 0x00, 0x12, 0x89, 0x00, 0x21, 0x09, 0x00, 0x42, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D37, { 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, 0x04, 0x48, 0x00, 0x08, 0x5E, 0x00, 0x1B, 0xE0, 0x00, 0x28, 0x21, 0x00, 0x48, 0x19, 0x00, 0x08, 0x07, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D38, { 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x3C, 0x7F, 0x00, 0x20, 0x22, 0x00, 0x24, 0x22, 0x00, 0x27, 0x2A, 0x00, 0x39, 0x44, 0x00, 0x60, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x1C, 0x00, 0x38, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D39, { 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x24, 0x00, 0x3F, 0xFC, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x04, 0x25, 0x00, 0x1F, 0xFA, 0x00, 0x68, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D3A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x12, 0xBE, 0x00, 0x21, 0x08, 0x00, 0x4F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D3B, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x22, 0x20, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x82, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x08, 0x82, 0x00, 0x14, 0x82, 0x00, 0x12, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D3C, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x14, 0x00, 0x22, 0x12, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x4A, 0x00, 0x2B, 0xFA, 0x00, 0x2A, 0x4C, 0x00, 0x2A, 0x4C, 0x00, 0x2A, 0x48, 0x00, 0x14, 0x94, 0x00, 0x12, 0x95, 0x00, 0x21, 0x25, 0x00, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D3D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x24, 0x00, 0x0E, 0xE4, 0x00, 0x78, 0x54, 0x00, 0x08, 0x85, 0x00, 0x31, 0x03, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D3E, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x30, 0x00, 0x06, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D3F, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x22, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0xFF, 0x00, 0x2B, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x22, 0x4A, 0x00, 0x40, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D40, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x42, 0x00, 0x17, 0x4C, 0x00, 0x14, 0x70, 0x00, 0x14, 0x41, 0x00, 0x17, 0x41, 0x00, 0x78, 0x3F, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x02, 0x18, 0x00, 0x1C, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D41, { 0x00, 0x00, 0x00, 0x04, 0x0C, 0x00, 0x0B, 0xF0, 0x00, 0x18, 0x22, 0x00, 0x2F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D42, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x22, 0x7E, 0x00, 0x2A, 0xC4, 0x00, 0x2B, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x47, 0x00, 0x2B, 0x82, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x14, 0x82, 0x00, 0x12, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D43, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x0A, 0x00, 0x22, 0xFF, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x14, 0x8A, 0x00, 0x22, 0xFF, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D44, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFE, 0x00, 0x05, 0x22, 0x00, 0x1A, 0x24, 0x00, 0x70, 0x50, 0x00, 0x10, 0x88, 0x00, 0x13, 0x07, 0x00, 0x0F, 0xFA, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D45, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x10, 0x00, 0x22, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xFA, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x44, 0x00, 0x08, 0x88, 0x00, 0x14, 0x14, 0x00, 0x12, 0x22, 0x00, 0x22, 0x41, 0x00, 0x40, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D46, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x3F, 0x7F, 0x00, 0x22, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x50, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xA7, 0x00, 0x2B, 0x12, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x00, 0x00, 0x14, 0x60, 0x00, 0x12, 0x18, 0x00, 0x22, 0x0C, 0x00, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D47, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x14, 0x00, 0x22, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x58, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x34, 0x00, 0x2A, 0x54, 0x00, 0x09, 0x92, 0x00, 0x14, 0x11, 0x00, 0x12, 0x10, 0x00, 0x22, 0x50, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D48, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x15, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x24, 0x31, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D49, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA2, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0xA0, 0x00, 0x04, 0x90, 0x00, 0x1F, 0xFC, 0x00, 0x68, 0x0B, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x60, 0x00, 0x02, 0x10, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D4A, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x22, 0x28, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x83, 0x00, 0x2B, 0x7C, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x08, 0x54, 0x00, 0x14, 0xD3, 0x00, 0x13, 0x11, 0x00, 0x22, 0x50, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D4B, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x22, 0x16, 0x00, 0x2A, 0xFD, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xBC, 0x00, 0x2A, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x14, 0xBC, 0x00, 0x13, 0xE5, 0x00, 0x22, 0x85, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D4C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x22, 0x22, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x28, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0xC4, 0x00, 0x2B, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x14, 0x44, 0x00, 0x22, 0x7C, 0x00, 0x42, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D4D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x04, 0x90, 0x00, 0x0A, 0xA8, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x4F, 0xFA, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x02, 0x10, 0x00, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D4E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x14, 0x00, 0x22, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x0A, 0x00, 0x2A, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x12, 0x28, 0x00, 0x22, 0x46, 0x00, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D4F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x47, 0xF2, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x01, 0x60, 0x00, 0x06, 0x18, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D50, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0xFF, 0x00, 0x2B, 0x2A, 0x00, 0x2A, 0x4A, 0x00, 0x08, 0x92, 0x00, 0x15, 0x22, 0x00, 0x22, 0x42, 0x00, 0x40, 0x94, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D53, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFC, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x17, 0xFC, 0x00, 0x11, 0x10, 0x00, 0x13, 0xF8, 0x00, 0x16, 0x0F, 0x00, 0x1A, 0x4A, 0x00, 0x12, 0x48, 0x00, 0x20, 0xA0, 0x00, 0x21, 0x18, 0x00, 0x46, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D54, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x08, 0x82, 0x00, 0x14, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D55, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x12, 0x00, 0x22, 0x56, 0x00, 0x2A, 0x58, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x26, 0x00, 0x2A, 0xD2, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x54, 0x00, 0x08, 0x98, 0x00, 0x14, 0x28, 0x00, 0x12, 0x24, 0x00, 0x22, 0x47, 0x00, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D56, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x7F, 0x3E, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x8A, 0x00, 0x2B, 0x7F, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x1C, 0x52, 0x00, 0x1A, 0x52, 0x00, 0x2A, 0x10, 0x00, 0x48, 0x2C, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D58, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x3F, 0x00, 0x1F, 0x42, 0x00, 0x04, 0x62, 0x00, 0x7F, 0x94, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x14, 0x00, 0x11, 0x23, 0x00, 0x66, 0x48, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x03, 0x60, 0x00, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D59, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3E, 0x14, 0x00, 0x23, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x04, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x84, 0x00, 0x12, 0x44, 0x00, 0x22, 0x54, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D5A, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x28, 0x00, 0x23, 0xFF, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x14, 0xAB, 0x00, 0x23, 0x2A, 0x00, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D5B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x4F, 0xFA, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x14, 0x17, 0x00, 0x64, 0x92, 0x00, 0x04, 0x90, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D5C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x2F, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2E, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x28, 0x00, 0x3F, 0x26, 0x00, 0x00, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D5D, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x28, 0x00, 0x12, 0x7E, 0x00, 0x16, 0xC8, 0x00, 0x1B, 0x7E, 0x00, 0x12, 0x48, 0x00, 0x12, 0x4F, 0x00, 0x12, 0x40, 0x00, 0x17, 0xFC, 0x00, 0x14, 0x04, 0x00, 0x14, 0x44, 0x00, 0x24, 0x44, 0x00, 0x20, 0xB0, 0x00, 0x43, 0x0C, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D5E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0x28, 0x00, 0x1F, 0x3E, 0x00, 0x24, 0x48, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x14, 0x00, 0x0B, 0x14, 0x00, 0x12, 0x25, 0x00, 0x20, 0x43, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x48, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D60, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x28, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xD6, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x44, 0x00, 0x10, 0x7C, 0x00, 0x14, 0x44, 0x00, 0x22, 0x7C, 0x00, 0x40, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D61, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x84, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xC9, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0xBE, 0x00, 0x15, 0x22, 0x00, 0x22, 0x22, 0x00, 0x44, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D62, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xEE, 0x00, 0x2A, 0x2A, 0x00, 0x3A, 0xAA, 0x00, 0x2A, 0xAE, 0x00, 0x38, 0x8A, 0x00, 0x29, 0x4B, 0x00, 0x5A, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D63, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x3C, 0x00, 0x22, 0x68, 0x00, 0x14, 0x90, 0x00, 0x7F, 0x2C, 0x00, 0x00, 0xC3, 0x00, 0x3E, 0x7C, 0x00, 0x22, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x7F, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x2C, 0x00, 0x08, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D64, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, 0x04, 0x94, 0x00, 0x04, 0x92, 0x00, 0x09, 0x12, 0x00, 0x11, 0x11, 0x00, 0x22, 0x11, 0x00, 0x04, 0x10, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D65, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x08, 0xC9, 0x80, 0x7F, 0x89, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x1C, 0x00, 0x36, 0x14, 0x00, 0x55, 0x14, 0x00, 0x14, 0x36, 0x00, 0x34, 0x22, 0x00, 0x24, 0x63, 0x00, 0x6C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D66, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xD0, 0x00, 0x02, 0x1F, 0x80, 0x3F, 0xE2, 0x00, 0x09, 0x62, 0x00, 0x09, 0xA2, 0x00, 0x29, 0x54, 0x00, 0x29, 0x54, 0x00, 0x29, 0x4C, 0x00, 0x29, 0x48, 0x00, 0x29, 0x54, 0x00, 0x11, 0x12, 0x00, 0x11, 0x21, 0x00, 0x23, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D67, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xE0, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x3F, 0x00, 0x2A, 0x29, 0x00, 0x2B, 0x2B, 0x00, 0x6A, 0xAE, 0x00, 0x4A, 0x24, 0x00, 0x1A, 0x2E, 0x00, 0x12, 0x3B, 0x00, 0x36, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D69, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x3E, 0x62, 0x00, 0x08, 0x44, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x36, 0x40, 0x00, 0x55, 0x40, 0x00, 0x14, 0x40, 0x00, 0x34, 0x40, 0x80, 0x24, 0x61, 0x80, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D6B, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x3F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x0A, 0x00, 0x0A, 0x0A, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x0A, 0x4A, 0x00, 0x0A, 0x12, 0x00, 0x12, 0x12, 0x00, 0x26, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D6C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x0F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x14, 0x41, 0x00, 0x34, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x6C, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D6D, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x12, 0x00, 0x08, 0x16, 0x00, 0x08, 0x14, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x18, 0x00, 0x14, 0x24, 0x00, 0x14, 0x7F, 0x00, 0x36, 0xA1, 0x00, 0x55, 0x21, 0x00, 0x14, 0x3F, 0x00, 0x34, 0x21, 0x00, 0x24, 0x21, 0x00, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D6E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x3E, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0xF7, 0x80, 0x7F, 0x80, 0x00, 0x14, 0x8F, 0x80, 0x14, 0xF4, 0x80, 0x14, 0x85, 0x80, 0x36, 0x85, 0x00, 0x55, 0x87, 0x00, 0x14, 0xF2, 0x00, 0x34, 0x87, 0x00, 0x24, 0x8D, 0x80, 0x6C, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D70, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D71, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x02, 0x30, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x00, 0x1E, 0x00, 0x00, 0x73, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D73, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x1F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x14, 0x12, 0x00, 0x17, 0xD7, 0x80, 0x14, 0x3A, 0x00, 0x14, 0x02, 0x00, 0x14, 0x02, 0x00, 0x1E, 0x02, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D74, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF6, 0x00, 0x02, 0x05, 0x00, 0x12, 0x04, 0x80, 0x12, 0x04, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x04, 0x00, 0x1A, 0x04, 0x00, 0x16, 0x04, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D75, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x44, 0x00, 0x3F, 0x44, 0x00, 0x04, 0x28, 0x00, 0x05, 0x28, 0x00, 0x7F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x14, 0x28, 0x00, 0x17, 0x24, 0x00, 0x14, 0x46, 0x00, 0x1C, 0x82, 0x00, 0x24, 0x00, 0x00, 0x22, 0x03, 0x00, 0x41, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D76, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x04, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x24, 0x03, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D77, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x1F, 0xC1, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x1F, 0x00, 0x3F, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xD0, 0x80, 0x12, 0x10, 0x80, 0x12, 0x1F, 0x80, 0x1A, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D7F, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x06, 0x00, 0x3F, 0x3C, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x7F, 0xBF, 0x80, 0x04, 0x24, 0x00, 0x24, 0x24, 0x00, 0x27, 0x26, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x24, 0x3A, 0x80, 0x34, 0xE1, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D81, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x1C, 0x00, 0x3F, 0x14, 0x00, 0x04, 0x36, 0x00, 0x04, 0x63, 0x00, 0x04, 0x0D, 0x80, 0x7F, 0x98, 0x00, 0x04, 0x33, 0x00, 0x24, 0x06, 0x00, 0x27, 0x1C, 0x00, 0x24, 0x31, 0x80, 0x24, 0x03, 0x00, 0x24, 0x0E, 0x00, 0x34, 0x38, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D82, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x69, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x04, 0x2A, 0x00, 0x24, 0x2A, 0x00, 0x27, 0x2A, 0x00, 0x24, 0x6B, 0x00, 0x24, 0x49, 0x00, 0x24, 0x08, 0x00, 0x34, 0x18, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D84, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x24, 0x21, 0x00, 0x27, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x24, 0x21, 0x00, 0x24, 0x21, 0x00, 0x34, 0x7F, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D85, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x1F, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xA6, 0x00, 0x04, 0x40, 0x00, 0x04, 0x3F, 0x00, 0x17, 0xA1, 0x00, 0x14, 0x21, 0x00, 0x14, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x2C, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D88, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x04, 0x0F, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x27, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x34, 0x7F, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D8A, { 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x04, 0x04, 0x80, 0x04, 0x04, 0x00, 0x1F, 0xBF, 0x80, 0x04, 0x24, 0x00, 0x04, 0x24, 0x80, 0x3F, 0xE5, 0x00, 0x04, 0x25, 0x00, 0x04, 0x26, 0x00, 0x17, 0xA6, 0x00, 0x14, 0x24, 0x80, 0x14, 0x3A, 0x80, 0x14, 0xD1, 0x80, 0x1C, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D8B, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x3C, 0x00, 0x3F, 0x44, 0x00, 0x04, 0x88, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x14, 0x02, 0x00, 0x17, 0x7E, 0x00, 0x14, 0x02, 0x00, 0x14, 0x02, 0x00, 0x14, 0xFE, 0x00, 0x2C, 0x00, 0x00, 0x44, 0x03, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D8D, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x1E, 0x00, 0x3F, 0x32, 0x00, 0x04, 0x56, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x18, 0x00, 0x7F, 0xF4, 0x00, 0x04, 0x07, 0x80, 0x24, 0x08, 0x80, 0x27, 0x11, 0x80, 0x24, 0x6B, 0x00, 0x24, 0x06, 0x00, 0x24, 0x1C, 0x00, 0x34, 0xF0, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D90, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x77, 0x80, 0x3F, 0x10, 0x80, 0x04, 0x11, 0x80, 0x04, 0x32, 0x80, 0x04, 0x54, 0x80, 0x7F, 0x90, 0x80, 0x04, 0x11, 0x80, 0x24, 0x32, 0x80, 0x27, 0x54, 0x80, 0x24, 0x10, 0x80, 0x24, 0x10, 0x80, 0x24, 0x10, 0x80, 0x34, 0x73, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D91, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3E, 0x0F, 0x80, 0x04, 0xD8, 0x80, 0x04, 0x11, 0x80, 0x04, 0x15, 0x00, 0x7F, 0x04, 0x00, 0x04, 0x44, 0x00, 0x24, 0x4E, 0x00, 0x26, 0x4A, 0x00, 0x24, 0xCA, 0x00, 0x24, 0x9B, 0x00, 0x24, 0x91, 0x00, 0x34, 0x31, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D94, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xF2, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x8A, 0x00, 0x08, 0xEA, 0x00, 0x7E, 0xAA, 0x00, 0x09, 0x2A, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0x6A, 0x00, 0x2E, 0x4A, 0x00, 0x28, 0x82, 0x00, 0x39, 0x0A, 0x00, 0x28, 0x04, 0x00, 0x24, 0x03, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D95, { 0x00, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0x80, 0x00, 0x04, 0x7F, 0x80, 0x24, 0x08, 0x00, 0x27, 0x08, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x34, 0x08, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D99, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x2A, 0x00, 0x1F, 0x49, 0x00, 0x04, 0x88, 0x80, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x17, 0xFF, 0x00, 0x14, 0x41, 0x00, 0x14, 0x43, 0x00, 0x2C, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8D9E, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x04, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x27, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x34, 0x7E, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8D9F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0x2A, 0x00, 0x04, 0x6B, 0x00, 0x04, 0x49, 0x00, 0x04, 0x7F, 0x80, 0x7F, 0xC0, 0x80, 0x04, 0x40, 0x80, 0x24, 0x5E, 0x80, 0x27, 0x52, 0x80, 0x24, 0x52, 0x80, 0x24, 0x5E, 0x80, 0x24, 0x40, 0x80, 0x34, 0x41, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DA0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x0F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x27, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x34, 0x08, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DA3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x04, 0x48, 0x00, 0x1F, 0x48, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x48, 0x80, 0x3F, 0xCD, 0x00, 0x04, 0x7B, 0x00, 0x04, 0x49, 0x00, 0x17, 0x5B, 0x00, 0x14, 0xEA, 0x80, 0x14, 0x0C, 0x80, 0x14, 0x08, 0x80, 0x1C, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DA6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3E, 0xCF, 0x80, 0x04, 0x10, 0x80, 0x04, 0x15, 0x00, 0x04, 0x04, 0x00, 0x7F, 0x4E, 0x00, 0x04, 0x4A, 0x00, 0x24, 0xD1, 0x00, 0x26, 0xBF, 0x80, 0x24, 0x91, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x34, 0x1F, 0x00, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DA8, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x3F, 0x80, 0x1F, 0x48, 0x80, 0x04, 0x2A, 0x80, 0x04, 0x3E, 0x80, 0x3F, 0xA2, 0x80, 0x04, 0x13, 0x00, 0x04, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x6A, 0x80, 0x14, 0xAA, 0x80, 0x14, 0x3E, 0x80, 0x2C, 0x21, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DAB, { 0x00, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x80, 0x04, 0x12, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x52, 0x80, 0x7F, 0x9E, 0x00, 0x04, 0x00, 0x00, 0x24, 0x7F, 0x80, 0x27, 0x40, 0x80, 0x24, 0x5E, 0x80, 0x24, 0x52, 0x80, 0x24, 0x5E, 0x80, 0x34, 0x41, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DAC, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x22, 0x00, 0x04, 0xF7, 0x80, 0x7F, 0x22, 0x00, 0x04, 0xF7, 0x80, 0x24, 0x00, 0x00, 0x26, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x24, 0x24, 0x80, 0x24, 0x64, 0x80, 0x34, 0xC3, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DAF, { 0x00, 0x00, 0x00, 0x04, 0xF7, 0x80, 0x04, 0x52, 0x80, 0x3F, 0xB5, 0x80, 0x04, 0x52, 0x80, 0x04, 0x94, 0x80, 0x04, 0x31, 0x80, 0x7F, 0x44, 0x00, 0x04, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x27, 0x7F, 0x80, 0x24, 0x44, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x44, 0x00, 0x34, 0x7F, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DB1, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x94, 0x00, 0x3F, 0xDE, 0x00, 0x0C, 0xA4, 0x00, 0x0B, 0xFF, 0x00, 0x7D, 0x8C, 0x00, 0x0A, 0xD5, 0x00, 0x2C, 0xA7, 0x00, 0x2B, 0xFC, 0x00, 0x2D, 0x04, 0x00, 0x29, 0x24, 0x00, 0x39, 0x24, 0x00, 0x29, 0x5C, 0x00, 0x24, 0x84, 0x00, 0x43, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DB2, { 0x00, 0x00, 0x00, 0x04, 0xA5, 0x00, 0x04, 0xF7, 0x80, 0x3E, 0x21, 0x00, 0x04, 0xF7, 0x80, 0x04, 0xA5, 0x00, 0x04, 0x31, 0x80, 0x7F, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x26, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x34, 0x80, 0x80, 0x6E, 0x00, 0x00, 0x43, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x02, 0x7F, 0x00, 0x02, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DB4, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0x48, 0x00, 0x22, 0x48, 0x00, 0x22, 0x48, 0x00, 0x22, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x2E, 0x48, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x2F, 0x04, 0x00, 0x71, 0x07, 0x00, 0x22, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DB5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x22, 0xC1, 0x00, 0x22, 0x81, 0x00, 0x3F, 0x81, 0x00, 0x08, 0x01, 0x00, 0x28, 0x79, 0x00, 0x2E, 0x01, 0x00, 0x28, 0x01, 0x00, 0x28, 0x01, 0x00, 0x28, 0x01, 0x00, 0x2E, 0x03, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DB7, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x22, 0xC0, 0x00, 0x23, 0x80, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x06, 0x00, 0x28, 0x0C, 0x00, 0x2E, 0x18, 0x00, 0x28, 0x30, 0x00, 0x28, 0x20, 0x00, 0x28, 0x60, 0x00, 0x2E, 0x40, 0x80, 0x38, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DB8, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x04, 0x48, 0x00, 0x18, 0x30, 0x00, 0x6F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x80, 0x00, 0x04, 0xFC, 0x00, 0x0C, 0x80, 0x00, 0x13, 0x83, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DB9, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x11, 0x00, 0x29, 0xFF, 0x80, 0x2E, 0x10, 0x00, 0x28, 0x50, 0x00, 0x28, 0x70, 0x00, 0x28, 0x28, 0x00, 0x2E, 0x6C, 0x00, 0x38, 0xC6, 0x00, 0x61, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DBA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x17, 0x08, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x22, 0x00, 0x17, 0x22, 0x00, 0x38, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DBB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x28, 0x00, 0x22, 0x6C, 0x00, 0x22, 0x46, 0x00, 0x22, 0xC3, 0x00, 0x3F, 0xBD, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2E, 0x7E, 0x00, 0x28, 0x02, 0x00, 0x28, 0x06, 0x00, 0x28, 0x0C, 0x00, 0x2E, 0x08, 0x00, 0x38, 0x18, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xF7, 0x80, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x32, 0x00, 0x08, 0xE7, 0x80, 0x28, 0x22, 0x00, 0x2E, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x62, 0x00, 0x2E, 0x42, 0x00, 0x38, 0xC2, 0x00, 0x61, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DBE, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x15, 0x24, 0x00, 0x04, 0x27, 0x80, 0x04, 0x24, 0x00, 0x17, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x17, 0x24, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DBF, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x42, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x48, 0x00, 0x2A, 0x5E, 0x00, 0x08, 0x42, 0x00, 0x28, 0x62, 0x00, 0x2E, 0x54, 0x00, 0x28, 0x94, 0x00, 0x28, 0x88, 0x00, 0x2E, 0x94, 0x00, 0x79, 0x14, 0x00, 0x22, 0x23, 0x00, 0x04, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2E, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2E, 0xC1, 0x00, 0x38, 0x81, 0x00, 0x61, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC2, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x21, 0x00, 0x24, 0x23, 0x00, 0x27, 0x36, 0x00, 0x24, 0x1C, 0x00, 0x24, 0x08, 0x00, 0x24, 0x1C, 0x00, 0x27, 0x36, 0x00, 0x3C, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DC3, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x0E, 0x00, 0x23, 0xF0, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x2E, 0x20, 0x00, 0x28, 0x50, 0x00, 0x28, 0x50, 0x00, 0x28, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x79, 0x04, 0x00, 0x22, 0x07, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC4, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x22, 0x50, 0x00, 0x22, 0x50, 0x00, 0x22, 0x48, 0x00, 0x3E, 0x84, 0x00, 0x2B, 0x0B, 0x00, 0x08, 0xFC, 0x00, 0x28, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0xA8, 0x00, 0x2E, 0x90, 0x00, 0x78, 0x82, 0x00, 0x20, 0x82, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC5, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x0E, 0x00, 0x22, 0x78, 0x00, 0x22, 0x40, 0x00, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x28, 0x5C, 0x00, 0x2E, 0x47, 0x00, 0x28, 0x45, 0x80, 0x28, 0x44, 0x00, 0x28, 0xC4, 0x00, 0x2E, 0x84, 0x00, 0x39, 0x84, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x20, 0x00, 0x22, 0x22, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x8F, 0x00, 0x29, 0xF0, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2F, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2F, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x28, 0x92, 0x00, 0x2E, 0x92, 0x00, 0x28, 0x9E, 0x00, 0x28, 0x80, 0x00, 0x28, 0x80, 0x00, 0x2E, 0x80, 0x00, 0x38, 0xFF, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DC8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x22, 0x14, 0x00, 0x22, 0x36, 0x00, 0x22, 0x63, 0x00, 0x22, 0xC9, 0x80, 0x3E, 0x18, 0x00, 0x08, 0x32, 0x00, 0x28, 0x66, 0x00, 0x2E, 0x0C, 0x00, 0x28, 0x18, 0x80, 0x28, 0x71, 0x80, 0x28, 0x03, 0x00, 0x2E, 0x06, 0x00, 0x38, 0x1C, 0x00, 0x60, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DCA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x54, 0x00, 0x2E, 0x54, 0x00, 0x28, 0x54, 0x00, 0x28, 0xD6, 0x00, 0x28, 0x92, 0x00, 0x2E, 0x93, 0x00, 0x39, 0x91, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DCB, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x1F, 0x10, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x14, 0x1A, 0x00, 0x17, 0xAA, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x24, 0x00, 0x14, 0x44, 0x00, 0x17, 0x4A, 0x00, 0x38, 0x91, 0x00, 0x01, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DCC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x28, 0x00, 0x22, 0x28, 0x00, 0x22, 0x48, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x88, 0x00, 0x3F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x2E, 0x14, 0x00, 0x28, 0x14, 0x00, 0x28, 0x12, 0x00, 0x2F, 0x22, 0x00, 0x38, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DCE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0x80, 0x80, 0x3E, 0x20, 0x00, 0x08, 0x23, 0x00, 0x28, 0x2E, 0x00, 0x2E, 0x38, 0x00, 0x28, 0x20, 0x00, 0x28, 0x20, 0x00, 0x28, 0x20, 0x00, 0x2E, 0x20, 0x80, 0x38, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DCF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0x40, 0x00, 0x11, 0xF7, 0x80, 0x11, 0x54, 0x80, 0x11, 0x54, 0x80, 0x1F, 0x54, 0x80, 0x04, 0x54, 0x80, 0x04, 0x54, 0x80, 0x14, 0x54, 0x80, 0x17, 0x54, 0x80, 0x14, 0x54, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x14, 0x94, 0x80, 0x3F, 0x37, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DD1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0xF9, 0x00, 0x3E, 0xC9, 0x00, 0x09, 0xC9, 0x00, 0x28, 0x49, 0x00, 0x2E, 0x79, 0x00, 0x28, 0x47, 0x00, 0x28, 0x40, 0x00, 0x28, 0x40, 0x00, 0x2E, 0x40, 0x80, 0x38, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DD4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x23, 0x80, 0x80, 0x3E, 0x7C, 0x80, 0x08, 0x44, 0x80, 0x28, 0x44, 0x80, 0x2E, 0x44, 0x80, 0x28, 0x44, 0x80, 0x28, 0x7C, 0x80, 0x28, 0x00, 0x80, 0x2E, 0x00, 0x80, 0x38, 0x01, 0x80, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DD5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x1F, 0x80, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2E, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0x81, 0x00, 0x28, 0x81, 0x00, 0x2E, 0x81, 0x00, 0x38, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x30, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x28, 0x61, 0x00, 0x2E, 0x61, 0x00, 0x28, 0xA1, 0x00, 0x28, 0x21, 0x00, 0x28, 0x21, 0x00, 0x2E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DD7, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0xC2, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x82, 0x00, 0x3D, 0x82, 0x00, 0x0A, 0x92, 0x00, 0x28, 0x9A, 0x00, 0x2C, 0x8A, 0x00, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x28, 0x82, 0x00, 0x2C, 0x82, 0x00, 0x38, 0x82, 0x00, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x28, 0x42, 0x00, 0x2E, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x2E, 0x42, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x22, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x55, 0x00, 0x2E, 0x55, 0x00, 0x28, 0x55, 0x00, 0x28, 0x55, 0x00, 0x28, 0x55, 0x00, 0x2E, 0x55, 0x00, 0x38, 0x55, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DDB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x49, 0x00, 0x3E, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x2F, 0x62, 0x00, 0x28, 0x52, 0x00, 0x28, 0x54, 0x00, 0x28, 0x88, 0x00, 0x2F, 0x8C, 0x00, 0x38, 0x92, 0x00, 0x01, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x1F, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x14, 0x21, 0x00, 0x17, 0xA1, 0x00, 0x14, 0x3F, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x17, 0xA0, 0x00, 0x38, 0x3F, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DDE, { 0x00, 0x00, 0x00, 0x02, 0x0E, 0x00, 0x3F, 0xF0, 0x00, 0x22, 0x80, 0x00, 0x22, 0x90, 0x00, 0x22, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x2A, 0x92, 0x00, 0x08, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x10, 0x00, 0x28, 0x54, 0x00, 0x28, 0x93, 0x00, 0x2F, 0x11, 0x00, 0x78, 0x10, 0x00, 0x20, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x48, 0x80, 0x2E, 0x49, 0x80, 0x28, 0x4B, 0x00, 0x28, 0x4C, 0x00, 0x28, 0x44, 0x00, 0x2E, 0x46, 0x00, 0x38, 0x7B, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DE1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x2E, 0x55, 0x00, 0x28, 0x94, 0x80, 0x28, 0xA4, 0x80, 0x28, 0x24, 0x00, 0x2E, 0x44, 0x00, 0x30, 0x84, 0x00, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DE3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x28, 0x00, 0x11, 0x28, 0x00, 0x11, 0x48, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x88, 0x00, 0x05, 0x08, 0x00, 0x04, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x17, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x14, 0x44, 0x00, 0x1F, 0x44, 0x80, 0x30, 0x84, 0x80, 0x01, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DE4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x08, 0x22, 0x00, 0x28, 0x22, 0x00, 0x2E, 0x36, 0x00, 0x28, 0x1C, 0x00, 0x28, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x2E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x12, 0x00, 0x22, 0x13, 0x80, 0x22, 0x30, 0x80, 0x22, 0x20, 0x80, 0x3E, 0x61, 0x80, 0x08, 0xCB, 0x00, 0x28, 0x08, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x2E, 0xC9, 0x80, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DE7, { 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x3E, 0x18, 0x00, 0x22, 0x2C, 0x00, 0x22, 0x66, 0x00, 0x22, 0xC3, 0x00, 0x23, 0x81, 0x80, 0x3E, 0x7E, 0x00, 0x08, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x10, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DE8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x80, 0x11, 0x12, 0x00, 0x1F, 0x21, 0x00, 0x04, 0x5E, 0x80, 0x04, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x17, 0x88, 0x00, 0x14, 0x10, 0x00, 0x14, 0x3F, 0x00, 0x14, 0x01, 0x00, 0x17, 0x81, 0x00, 0x38, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DEA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0xC4, 0x00, 0x22, 0x88, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xBE, 0x00, 0x28, 0xA2, 0x00, 0x2E, 0xA2, 0x00, 0x28, 0xA2, 0x00, 0x28, 0xA6, 0x00, 0x28, 0xA0, 0x00, 0x2E, 0xA0, 0x80, 0x39, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x08, 0x52, 0x00, 0x08, 0x5A, 0x00, 0x0E, 0x4A, 0x80, 0x78, 0x81, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x40, 0x00, 0x0C, 0x7E, 0x00, 0x1A, 0x40, 0x00, 0x71, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8DEC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x08, 0x00, 0x2E, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x2E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DEF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x62, 0x00, 0x22, 0x94, 0x00, 0x3F, 0x08, 0x00, 0x08, 0x16, 0x00, 0x08, 0x21, 0x80, 0x2F, 0x40, 0x00, 0x28, 0xFF, 0x00, 0x29, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2F, 0x41, 0x00, 0x38, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF0, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x63, 0x00, 0x22, 0x22, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x28, 0xFF, 0x80, 0x2E, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x62, 0x00, 0x2E, 0x42, 0x00, 0x38, 0xC2, 0x00, 0x61, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x28, 0x02, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x28, 0x42, 0x00, 0x28, 0x62, 0x00, 0x2E, 0x22, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x2C, 0x00, 0x22, 0x64, 0x00, 0x22, 0x46, 0x00, 0x22, 0xC3, 0x00, 0x3F, 0xBD, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2E, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x2E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF3, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x22, 0x28, 0x00, 0x23, 0x29, 0x00, 0x22, 0xAA, 0x00, 0x3E, 0x6C, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x28, 0x2C, 0x00, 0x2F, 0x6A, 0x00, 0x28, 0xA9, 0x00, 0x29, 0x28, 0x00, 0x28, 0x28, 0x80, 0x2E, 0x48, 0x80, 0x38, 0x8F, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x14, 0x00, 0x22, 0x14, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x28, 0x94, 0x80, 0x2E, 0xA4, 0x80, 0x28, 0xC3, 0x80, 0x28, 0x80, 0x80, 0x28, 0x80, 0x80, 0x2E, 0x80, 0x80, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF5, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x12, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x2E, 0x19, 0x00, 0x28, 0x0B, 0x00, 0x28, 0x0E, 0x00, 0x28, 0x04, 0x00, 0x2E, 0x0E, 0x80, 0x38, 0x3B, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF7, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x24, 0x00, 0x22, 0x3E, 0x00, 0x23, 0xE0, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x11, 0x00, 0x2A, 0x69, 0x00, 0x09, 0x87, 0x00, 0x28, 0x04, 0x00, 0x2E, 0xFE, 0x00, 0x28, 0x50, 0x00, 0x28, 0x50, 0x00, 0x2E, 0x50, 0x00, 0x78, 0x91, 0x00, 0x21, 0x11, 0x00, 0x02, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x88, 0x00, 0x22, 0x89, 0x00, 0x22, 0xEA, 0x00, 0x22, 0x8C, 0x00, 0x3E, 0x89, 0x00, 0x2A, 0xA9, 0x00, 0x08, 0xC7, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x12, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x10, 0x00, 0x78, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DF9, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0x06, 0x00, 0x22, 0xB8, 0x00, 0x22, 0x88, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x0A, 0x00, 0x2B, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x28, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x79, 0x43, 0x00, 0x22, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DFA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3E, 0xFC, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3D, 0x06, 0x00, 0x08, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x2C, 0x60, 0x00, 0x28, 0x70, 0x00, 0x28, 0xA8, 0x00, 0x2E, 0xA7, 0x00, 0x71, 0x22, 0x00, 0x22, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DFB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x12, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x44, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x08, 0x47, 0x00, 0x29, 0x82, 0x00, 0x2E, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x44, 0x00, 0x2E, 0x44, 0x00, 0x78, 0x44, 0x00, 0x20, 0x84, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x2E, 0xBC, 0x80, 0x28, 0xA4, 0x80, 0x28, 0xA4, 0x80, 0x28, 0xA4, 0x80, 0x2E, 0xBD, 0x80, 0x39, 0x01, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x80, 0x00, 0x3E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x00, 0x00, 0x28, 0x10, 0x00, 0x28, 0x99, 0x00, 0x28, 0xA9, 0x80, 0x2E, 0xA2, 0x80, 0x39, 0xA2, 0x00, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8DFF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x28, 0x08, 0x00, 0x2E, 0x48, 0x00, 0x28, 0x4F, 0x00, 0x28, 0x48, 0x00, 0x28, 0x48, 0x00, 0x2E, 0xE8, 0x00, 0x38, 0xB8, 0x00, 0x61, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x49, 0x00, 0x28, 0x49, 0x00, 0x2E, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E04, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x50, 0x00, 0x22, 0x5F, 0x00, 0x22, 0x50, 0x00, 0x22, 0x50, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0x50, 0x00, 0x28, 0xD1, 0x00, 0x2E, 0x93, 0x00, 0x28, 0x12, 0x00, 0x28, 0x36, 0x00, 0x28, 0x0C, 0x00, 0x2E, 0x18, 0x00, 0x38, 0x70, 0x00, 0x61, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E05, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x0E, 0x44, 0x00, 0x78, 0xC4, 0x00, 0x09, 0x84, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x07, 0x7E, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E06, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x62, 0x00, 0x22, 0x42, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x25, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x47, 0x80, 0x08, 0xA0, 0x00, 0x28, 0x3E, 0x00, 0x2E, 0x62, 0x00, 0x28, 0xC6, 0x00, 0x28, 0x2C, 0x00, 0x28, 0x18, 0x00, 0x2E, 0x3C, 0x00, 0x38, 0x66, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E08, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x2E, 0x49, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E09, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x28, 0xFE, 0x80, 0x2E, 0x89, 0x80, 0x28, 0x8B, 0x00, 0x28, 0x8C, 0x00, 0x28, 0x84, 0x00, 0x2E, 0x86, 0x00, 0x38, 0xF3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x02, 0x00, 0x22, 0x14, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x28, 0x88, 0x80, 0x2E, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x2E, 0x88, 0x80, 0x30, 0x88, 0x80, 0x00, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E0B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x47, 0x80, 0x24, 0x44, 0x80, 0x25, 0xF4, 0x80, 0x24, 0x44, 0x80, 0x24, 0x44, 0x80, 0x3C, 0x44, 0x80, 0x0B, 0xFC, 0x80, 0x28, 0x84, 0x80, 0x2C, 0x84, 0x80, 0x29, 0x94, 0x80, 0x29, 0x14, 0x80, 0x29, 0x74, 0x80, 0x2F, 0xD5, 0x80, 0x38, 0x04, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E0C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x24, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x23, 0xFC, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x2F, 0xFF, 0x00, 0x28, 0x84, 0x00, 0x28, 0xA4, 0x00, 0x2D, 0x14, 0x00, 0x72, 0x04, 0x00, 0x24, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E0F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xE9, 0x00, 0x22, 0x2E, 0x00, 0x22, 0x4C, 0x00, 0x3E, 0x4A, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x09, 0x00, 0x08, 0x18, 0x80, 0x2F, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x2F, 0x41, 0x00, 0x38, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x34, 0x00, 0x22, 0x20, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3D, 0x00, 0x2A, 0x09, 0x00, 0x08, 0x67, 0x00, 0x0A, 0xB0, 0x00, 0x2C, 0x2D, 0x00, 0x29, 0xFA, 0x00, 0x28, 0x14, 0x00, 0x28, 0x09, 0x00, 0x2F, 0x39, 0x00, 0x30, 0xC7, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E11, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x28, 0x3E, 0x00, 0x2E, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x2E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E14, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x1F, 0x00, 0x22, 0x10, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x2E, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x2E, 0x10, 0x00, 0x38, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E16, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2E, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x2E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x2E, 0x49, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x7F, 0x80, 0x14, 0x44, 0x00, 0x17, 0xC4, 0x00, 0x14, 0x5F, 0x00, 0x14, 0x51, 0x00, 0x14, 0x51, 0x00, 0x17, 0x51, 0x00, 0x38, 0x9F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E1F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3C, 0x80, 0x00, 0x24, 0x80, 0x00, 0x25, 0xF7, 0x80, 0x25, 0x44, 0x80, 0x24, 0x44, 0x80, 0x3C, 0x44, 0x80, 0x09, 0xF4, 0x80, 0x28, 0x44, 0x80, 0x2E, 0x44, 0x80, 0x28, 0x44, 0x80, 0x28, 0xE4, 0x80, 0x28, 0xA4, 0x80, 0x2E, 0xB7, 0x80, 0x39, 0x98, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E20, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x01, 0x00, 0x24, 0x80, 0x00, 0x3C, 0xEF, 0x00, 0x08, 0xA9, 0x00, 0x29, 0xA9, 0x00, 0x2D, 0x29, 0x00, 0x2A, 0xE9, 0x00, 0x28, 0x4B, 0x00, 0x28, 0xC8, 0x00, 0x2C, 0x88, 0x80, 0x39, 0x89, 0x80, 0x63, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E21, { 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x3E, 0xD3, 0x00, 0x22, 0x91, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x28, 0x00, 0x22, 0x28, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x28, 0x42, 0x00, 0x2E, 0xFF, 0x00, 0x29, 0xC5, 0x80, 0x28, 0x44, 0x00, 0x28, 0x4C, 0x00, 0x2E, 0x41, 0x00, 0x38, 0x43, 0x00, 0x60, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x2E, 0x7F, 0x80, 0x28, 0xCA, 0x80, 0x29, 0x92, 0x80, 0x28, 0x24, 0x80, 0x2E, 0xC9, 0x80, 0x38, 0x11, 0x00, 0x60, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E23, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x42, 0x00, 0x22, 0x66, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x42, 0x00, 0x28, 0x42, 0x00, 0x2E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E26, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x14, 0x00, 0x22, 0x36, 0x00, 0x22, 0x63, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x01, 0x00, 0x2E, 0x3D, 0x00, 0x28, 0x25, 0x00, 0x28, 0x25, 0x00, 0x28, 0x3D, 0x00, 0x2E, 0x01, 0x00, 0x38, 0x01, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E27, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3C, 0x9F, 0x00, 0x24, 0x89, 0x00, 0x24, 0xE9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8B, 0x00, 0x3C, 0x8A, 0x00, 0x0B, 0xEA, 0x00, 0x28, 0x8E, 0x00, 0x2C, 0x84, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xAE, 0x00, 0x2A, 0xAA, 0x00, 0x2E, 0xAB, 0x00, 0x38, 0x89, 0x00, 0x61, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E29, { 0x00, 0x00, 0x00, 0x02, 0x0E, 0x00, 0x3F, 0xF0, 0x00, 0x22, 0x22, 0x00, 0x22, 0x93, 0x00, 0x22, 0x54, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x2E, 0x10, 0x00, 0x28, 0x30, 0x00, 0x28, 0x38, 0x00, 0x28, 0x54, 0x00, 0x2E, 0x93, 0x00, 0x71, 0x12, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E2A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x28, 0x00, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x4A, 0x00, 0x2E, 0x89, 0x00, 0x31, 0x08, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E2C, { 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x3F, 0xF8, 0x00, 0x22, 0x88, 0x00, 0x22, 0x8A, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x88, 0x00, 0x2A, 0xBE, 0x00, 0x08, 0xA2, 0x00, 0x28, 0xAA, 0x00, 0x2E, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x28, 0xAA, 0x00, 0x2F, 0x10, 0x00, 0x79, 0x14, 0x00, 0x22, 0x23, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E2E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x08, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x90, 0x00, 0x22, 0x92, 0x00, 0x3E, 0x9F, 0x00, 0x2A, 0x90, 0x00, 0x08, 0x90, 0x00, 0x28, 0x92, 0x00, 0x2E, 0xFF, 0x00, 0x29, 0x42, 0x00, 0x29, 0x42, 0x00, 0x2E, 0x42, 0x00, 0x7A, 0x42, 0x00, 0x24, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E2F, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3D, 0x2F, 0x00, 0x25, 0x49, 0x00, 0x24, 0x0A, 0x00, 0x27, 0xEA, 0x00, 0x3C, 0x8C, 0x00, 0x28, 0x8A, 0x00, 0x08, 0xAA, 0x00, 0x2F, 0xF9, 0x00, 0x2C, 0x89, 0x00, 0x28, 0x8D, 0x00, 0x28, 0x8A, 0x00, 0x2D, 0x48, 0x00, 0x79, 0x28, 0x00, 0x22, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x78, 0x00, 0x22, 0x14, 0x00, 0x22, 0x62, 0x00, 0x23, 0x81, 0x80, 0x3E, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF2, 0x80, 0x2E, 0x92, 0x80, 0x28, 0xF5, 0x00, 0x28, 0x9A, 0x00, 0x28, 0xF9, 0x00, 0x2E, 0x95, 0x00, 0x30, 0x94, 0x80, 0x00, 0xB2, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E31, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x00, 0x22, 0x92, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x92, 0x00, 0x08, 0x9E, 0x00, 0x28, 0x80, 0x00, 0x2E, 0xFF, 0x00, 0x28, 0xA1, 0x00, 0x28, 0xB3, 0x00, 0x28, 0x96, 0x00, 0x2E, 0x9C, 0x00, 0x39, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E33, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x28, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x28, 0x42, 0x00, 0x2E, 0xFF, 0x00, 0x29, 0x42, 0x80, 0x28, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x2E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x60, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x02, 0x00, 0x22, 0x14, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x49, 0x00, 0x28, 0x10, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x10, 0x80, 0x2E, 0x30, 0x80, 0x38, 0x61, 0x80, 0x61, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E35, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3E, 0x78, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x2E, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x2E, 0x08, 0x00, 0x28, 0x48, 0x00, 0x28, 0x4F, 0x00, 0x28, 0x48, 0x00, 0x2E, 0xE8, 0x00, 0x38, 0xB8, 0x00, 0x61, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E37, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x12, 0x00, 0x22, 0x16, 0x00, 0x22, 0x14, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x0C, 0x00, 0x28, 0x12, 0x00, 0x2E, 0x3F, 0x00, 0x28, 0x61, 0x00, 0x29, 0xA1, 0x00, 0x28, 0x3F, 0x00, 0x2E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E38, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x28, 0x22, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x52, 0x00, 0x28, 0x52, 0x00, 0x28, 0x63, 0x80, 0x2E, 0x40, 0x00, 0x38, 0x40, 0x00, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E39, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x28, 0x20, 0x00, 0x2E, 0xFF, 0x00, 0x28, 0xA9, 0x00, 0x28, 0xA9, 0x00, 0x28, 0xA9, 0x00, 0x2E, 0xA9, 0x00, 0x38, 0xA9, 0x00, 0x60, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E3A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x27, 0xBE, 0x00, 0x24, 0x8A, 0x00, 0x24, 0xFF, 0x00, 0x3D, 0x0A, 0x00, 0x2B, 0xBE, 0x00, 0x08, 0x88, 0x00, 0x28, 0xBE, 0x00, 0x2E, 0x88, 0x00, 0x2A, 0xFF, 0x00, 0x29, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x79, 0x4B, 0x00, 0x22, 0x3E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E3D, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3E, 0x1E, 0x00, 0x22, 0xF0, 0x00, 0x22, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2F, 0xFF, 0x80, 0x29, 0x10, 0x80, 0x29, 0x14, 0x80, 0x29, 0x1E, 0x80, 0x2F, 0x72, 0x80, 0x39, 0x00, 0x80, 0x61, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E40, { 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x22, 0x4E, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x2E, 0x49, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E41, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3E, 0xF8, 0x00, 0x22, 0x80, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x28, 0xFF, 0x80, 0x2E, 0xD4, 0x80, 0x28, 0xD4, 0x80, 0x29, 0x7F, 0x80, 0x29, 0x54, 0x80, 0x2E, 0x54, 0x80, 0x38, 0x54, 0x80, 0x60, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x12, 0x00, 0x22, 0x0C, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x19, 0x00, 0x2A, 0x6A, 0x00, 0x09, 0x88, 0x00, 0x08, 0x38, 0x00, 0x2E, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x1C, 0x00, 0x2E, 0x2A, 0x00, 0x30, 0x49, 0x00, 0x01, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E44, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x3E, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x08, 0x00, 0x2F, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x49, 0x00, 0x28, 0x49, 0x00, 0x2F, 0x49, 0x00, 0x30, 0x4B, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E47, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0C, 0x06, 0x00, 0x37, 0xFD, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x14, 0x40, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x22, 0x71, 0x00, 0x22, 0x48, 0x80, 0x22, 0x84, 0x00, 0x3F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x33, 0x80, 0x28, 0xC0, 0x80, 0x2F, 0x80, 0x80, 0x28, 0x80, 0x80, 0x28, 0xF3, 0x80, 0x28, 0x80, 0x80, 0x2F, 0x80, 0x80, 0x38, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E49, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x14, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x2E, 0x20, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x48, 0x00, 0x28, 0x48, 0x00, 0x2F, 0x88, 0x00, 0x39, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x22, 0xF0, 0x00, 0x22, 0x24, 0x00, 0x22, 0xC4, 0x00, 0x3E, 0x48, 0x00, 0x2A, 0x32, 0x00, 0x08, 0x2F, 0x00, 0x2E, 0xF0, 0x80, 0x28, 0x08, 0x00, 0x28, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x2E, 0x22, 0x00, 0x30, 0x41, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x28, 0x31, 0x80, 0x2E, 0x52, 0x80, 0x28, 0x94, 0x80, 0x28, 0x31, 0x80, 0x28, 0x52, 0x80, 0x2E, 0x94, 0x80, 0x38, 0x10, 0x80, 0x60, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E4C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x6C, 0x00, 0x22, 0xC6, 0x00, 0x23, 0xBB, 0x80, 0x22, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x2E, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x28, 0x40, 0x00, 0x28, 0xFF, 0x00, 0x2E, 0xA1, 0x00, 0x39, 0xA1, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x94, 0x00, 0x3E, 0x94, 0x00, 0x08, 0xFF, 0x00, 0x28, 0x94, 0x00, 0x2E, 0x94, 0x00, 0x28, 0xFF, 0x80, 0x28, 0xA9, 0x00, 0x28, 0xAA, 0x00, 0x2E, 0xAC, 0x00, 0x39, 0x36, 0x00, 0x60, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E4E, { 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x3E, 0x7C, 0x00, 0x22, 0x41, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x00, 0x00, 0x22, 0xBF, 0x00, 0x3E, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x2E, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x28, 0xBF, 0x00, 0x28, 0x80, 0x00, 0x2E, 0xFF, 0x80, 0x38, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E4F, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3C, 0x3E, 0x00, 0x25, 0xE8, 0x00, 0x25, 0x0F, 0x00, 0x25, 0x08, 0x00, 0x25, 0x7F, 0x80, 0x3D, 0x48, 0x80, 0x09, 0x4E, 0x00, 0x29, 0x58, 0x80, 0x2D, 0x4F, 0x80, 0x29, 0x40, 0x00, 0x29, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x2D, 0x4A, 0x80, 0x3A, 0x9A, 0x80, 0x60, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E50, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xEB, 0x80, 0x22, 0x08, 0x00, 0x22, 0xDD, 0x80, 0x22, 0x14, 0x00, 0x3E, 0x36, 0x00, 0x08, 0x22, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0xA2, 0x80, 0x28, 0x3E, 0x00, 0x28, 0x22, 0x00, 0x28, 0x3E, 0x00, 0x2E, 0x22, 0x00, 0x38, 0x22, 0x00, 0x60, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E51, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x3C, 0xFC, 0x00, 0x28, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x28, 0x04, 0x00, 0x2F, 0xDF, 0x00, 0x2A, 0x51, 0x00, 0x29, 0x4A, 0x00, 0x2C, 0x84, 0x00, 0x79, 0x4A, 0x00, 0x22, 0x12, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E52, { 0x00, 0x00, 0x00, 0x04, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x48, 0x00, 0x24, 0x4A, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x48, 0x00, 0x09, 0xFE, 0x00, 0x29, 0x4A, 0x00, 0x2F, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x29, 0xB6, 0x00, 0x2F, 0x96, 0x00, 0x79, 0x22, 0x00, 0x21, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E54, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x7F, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x22, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x07, 0x7E, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x91, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x52, 0x00, 0x29, 0xFF, 0x80, 0x2E, 0x52, 0x00, 0x28, 0x52, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2E, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E59, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x21, 0x00, 0x13, 0xD1, 0x00, 0x12, 0x0A, 0x00, 0x1F, 0xE4, 0x80, 0x2A, 0x8A, 0x80, 0x32, 0x51, 0x80, 0x26, 0x60, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x80, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E5B, { 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x3C, 0xAA, 0x00, 0x25, 0xFF, 0x80, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x25, 0x3B, 0x80, 0x3C, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x29, 0x10, 0x80, 0x2D, 0x10, 0x80, 0x28, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x28, 0x91, 0x00, 0x2C, 0x91, 0x00, 0x38, 0x93, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E5C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x01, 0x00, 0x25, 0x41, 0x00, 0x24, 0x7F, 0x80, 0x3C, 0x44, 0x00, 0x08, 0xC8, 0x00, 0x28, 0x9F, 0x00, 0x2D, 0x91, 0x00, 0x28, 0x91, 0x00, 0x28, 0x9F, 0x00, 0x28, 0x91, 0x00, 0x2C, 0x91, 0x00, 0x38, 0x91, 0x00, 0x60, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E5D, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0xA7, 0x00, 0x25, 0x24, 0x00, 0x27, 0x24, 0x00, 0x24, 0xA4, 0x00, 0x3C, 0xFF, 0x80, 0x09, 0x84, 0x00, 0x29, 0x04, 0x00, 0x2F, 0x24, 0x00, 0x29, 0x27, 0x00, 0x29, 0x24, 0x00, 0x29, 0x24, 0x00, 0x2D, 0x34, 0x00, 0x39, 0x2C, 0x00, 0x61, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3F, 0x80, 0x24, 0x04, 0x00, 0x25, 0x08, 0x00, 0x25, 0x1F, 0x00, 0x25, 0x51, 0x00, 0x3D, 0x91, 0x00, 0x09, 0x1F, 0x00, 0x29, 0x11, 0x00, 0x2D, 0x11, 0x00, 0x29, 0x1F, 0x00, 0x29, 0x51, 0x00, 0x29, 0x91, 0x00, 0x2C, 0x1F, 0x00, 0x38, 0x0A, 0x00, 0x60, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E5F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2F, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x2F, 0x7F, 0x00, 0x30, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E60, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0xFF, 0x80, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x2E, 0x92, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x80, 0x00, 0x28, 0x80, 0x00, 0x2F, 0xAA, 0x80, 0x38, 0xAA, 0x80, 0x01, 0x2A, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E61, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x3D, 0x4F, 0x00, 0x25, 0x59, 0x00, 0x25, 0x75, 0x00, 0x25, 0x4B, 0x00, 0x25, 0xC6, 0x00, 0x3C, 0x4C, 0x00, 0x08, 0x59, 0x00, 0x28, 0x41, 0x00, 0x2D, 0xDF, 0x80, 0x29, 0x41, 0x00, 0x29, 0x49, 0x00, 0x29, 0x4D, 0x00, 0x2D, 0x45, 0x00, 0x3A, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E62, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x41, 0x00, 0x22, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x08, 0x88, 0x80, 0x28, 0xBE, 0x80, 0x2E, 0x88, 0x80, 0x28, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x28, 0xA2, 0x80, 0x2E, 0xBE, 0x80, 0x38, 0x80, 0x80, 0x60, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E63, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x3E, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x2E, 0xEE, 0x80, 0x28, 0xAA, 0x80, 0x28, 0xAA, 0x80, 0x28, 0xDD, 0x80, 0x2E, 0x88, 0x80, 0x38, 0x88, 0x80, 0x60, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E64, { 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x3C, 0x51, 0x00, 0x24, 0xD1, 0x00, 0x24, 0xBB, 0x80, 0x25, 0xAA, 0x80, 0x24, 0x44, 0x00, 0x3C, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x28, 0x94, 0x00, 0x2D, 0x97, 0x00, 0x28, 0x94, 0x00, 0x28, 0x94, 0x00, 0x28, 0x94, 0x00, 0x2C, 0x94, 0x00, 0x38, 0xAC, 0x00, 0x60, 0xA7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E66, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3D, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x3D, 0xDF, 0x00, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0xDE, 0x00, 0x2D, 0x52, 0x00, 0x29, 0x52, 0x00, 0x29, 0xDE, 0x00, 0x2D, 0x52, 0x00, 0x71, 0x52, 0x00, 0x22, 0x52, 0x00, 0x04, 0xE6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E69, { 0x00, 0x00, 0x00, 0x15, 0x10, 0x00, 0x35, 0x90, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0xA2, 0x00, 0x24, 0xF6, 0x00, 0x2E, 0x9C, 0x00, 0x35, 0x88, 0x00, 0x24, 0x9E, 0x00, 0x25, 0xB3, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x07, 0x7E, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E6C, { 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x3E, 0x8A, 0x80, 0x22, 0x5D, 0x00, 0x22, 0x36, 0x00, 0x22, 0x63, 0x00, 0x22, 0xC1, 0x80, 0x3E, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x22, 0x00, 0x2E, 0x36, 0x00, 0x38, 0x14, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E6D, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3E, 0x63, 0x00, 0x22, 0xC1, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x22, 0xC9, 0x80, 0x3E, 0xAA, 0x80, 0x08, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x2E, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E6F, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3E, 0x78, 0x00, 0x22, 0x91, 0x00, 0x22, 0x52, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x54, 0x00, 0x3E, 0x56, 0x00, 0x08, 0xD3, 0x00, 0x29, 0x91, 0x80, 0x2E, 0x00, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x2E, 0x91, 0x00, 0x38, 0x91, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x80, 0x4A, 0x00, 0x00, 0x4A, 0x01, 0x00, 0x4B, 0xF9, 0x00, 0x4A, 0x01, 0x00, 0x7A, 0xF7, 0x80, 0x12, 0x91, 0x00, 0x52, 0x95, 0x00, 0x5A, 0x95, 0x00, 0x52, 0xF5, 0x00, 0x52, 0x01, 0x00, 0x52, 0x91, 0x00, 0x5A, 0xD1, 0x00, 0x74, 0x79, 0x00, 0x41, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E71, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x2E, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x2E, 0x7F, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E72, { 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x3E, 0x41, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x14, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x55, 0x00, 0x3E, 0x67, 0x00, 0x08, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x02, 0x00, 0x28, 0xFF, 0x80, 0x2E, 0x22, 0x00, 0x38, 0x12, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E74, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x45, 0x00, 0x22, 0x44, 0x80, 0x23, 0xF4, 0x00, 0x22, 0x1F, 0x80, 0x3E, 0xE4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA6, 0x00, 0x2E, 0xA6, 0x00, 0x28, 0xE6, 0x00, 0x28, 0x4A, 0x00, 0x28, 0xEA, 0x00, 0x29, 0x5A, 0x80, 0x2E, 0x4A, 0x80, 0x30, 0x4B, 0x80, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x02, 0x00, 0x25, 0x8A, 0x00, 0x25, 0x54, 0x00, 0x3D, 0xFF, 0x80, 0x09, 0x0A, 0x80, 0x09, 0x53, 0x00, 0x29, 0x52, 0x00, 0x2F, 0x52, 0x00, 0x29, 0x52, 0x00, 0x29, 0xF2, 0x00, 0x29, 0x55, 0x00, 0x2F, 0x45, 0x00, 0x3A, 0x85, 0x00, 0x02, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E79, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x22, 0x00, 0x22, 0xDD, 0x80, 0x22, 0x00, 0x00, 0x22, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x28, 0x00, 0x00, 0x2E, 0xF7, 0x80, 0x28, 0x52, 0x80, 0x28, 0x94, 0x80, 0x28, 0x31, 0x80, 0x2E, 0x52, 0x80, 0x38, 0x94, 0x80, 0x60, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E7A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x82, 0x00, 0x3D, 0xEF, 0x80, 0x08, 0x82, 0x00, 0x28, 0xE2, 0x00, 0x2D, 0x8F, 0x80, 0x28, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x44, 0x00, 0x2C, 0x44, 0x80, 0x38, 0xC4, 0x80, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E7B, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3E, 0x7C, 0x00, 0x22, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x24, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0xA5, 0x80, 0x08, 0x3C, 0x00, 0x28, 0x00, 0x00, 0x2E, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x28, 0xBD, 0x00, 0x28, 0xA5, 0x00, 0x2E, 0xBD, 0x00, 0x38, 0x81, 0x00, 0x60, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E7C, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x94, 0x80, 0x22, 0x55, 0x00, 0x22, 0x14, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x41, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x2E, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x2E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E7F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x45, 0x00, 0x26, 0x92, 0x00, 0x3C, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x2E, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x2F, 0xFF, 0x00, 0x71, 0x11, 0x00, 0x20, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x00, 0x00, 0x04, 0xF7, 0x80, 0x04, 0x94, 0x80, 0x04, 0xF7, 0x80, 0x17, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x1C, 0x00, 0x17, 0x2A, 0x00, 0x38, 0x49, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E82, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3D, 0x04, 0x00, 0x25, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x25, 0x3F, 0x80, 0x25, 0x91, 0x00, 0x3C, 0x8A, 0x00, 0x08, 0x3F, 0x80, 0x29, 0x84, 0x00, 0x2C, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x28, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x2C, 0x84, 0x00, 0x39, 0xC0, 0x00, 0x63, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E83, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3C, 0xE2, 0x00, 0x24, 0xAF, 0x80, 0x24, 0xA0, 0x00, 0x24, 0xA8, 0x80, 0x24, 0xAD, 0x80, 0x3C, 0xE5, 0x00, 0x08, 0x8F, 0x80, 0x28, 0x82, 0x00, 0x2C, 0xE2, 0x00, 0x29, 0xAF, 0x80, 0x29, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x2C, 0xA2, 0x00, 0x38, 0xE2, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E84, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xBF, 0x80, 0x10, 0x91, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x28, 0x9F, 0x00, 0x6F, 0x84, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x07, 0x7E, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0xA9, 0x00, 0x22, 0xA9, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0xD0, 0x80, 0x28, 0x7C, 0x80, 0x2E, 0x54, 0x80, 0x28, 0x54, 0x80, 0x28, 0x7C, 0x80, 0x28, 0x14, 0x80, 0x2E, 0x3D, 0x80, 0x38, 0xE5, 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E87, { 0x00, 0x00, 0x00, 0x3E, 0x42, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x42, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x11, 0x00, 0x2A, 0xFE, 0x00, 0x08, 0x14, 0x00, 0x0B, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x2E, 0x22, 0x00, 0x28, 0xFF, 0x00, 0x2B, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E89, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x91, 0x00, 0x2F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x2F, 0xFD, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x07, 0x7E, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E8A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x3F, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x00, 0x80, 0x2A, 0x3E, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x72, 0x00, 0x2E, 0x52, 0x00, 0x30, 0x72, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E8B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x14, 0x00, 0x23, 0xE9, 0x80, 0x22, 0xAB, 0x00, 0x3E, 0xAA, 0x80, 0x09, 0x2A, 0x80, 0x28, 0x00, 0x00, 0x2E, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x38, 0xC1, 0x00, 0x61, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x35, 0x00, 0x08, 0x48, 0x00, 0x08, 0xFF, 0x00, 0x2F, 0x88, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x2E, 0x88, 0x00, 0x30, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E8F, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x00, 0x48, 0x88, 0x00, 0x4A, 0x02, 0x00, 0x49, 0x7F, 0x00, 0x7A, 0xA2, 0x00, 0x52, 0xFA, 0x00, 0x12, 0xA2, 0x00, 0x52, 0xFA, 0x00, 0x5E, 0xA2, 0x00, 0x52, 0xFA, 0x00, 0x52, 0xA2, 0x00, 0x5E, 0xFE, 0x00, 0x72, 0x82, 0x00, 0x42, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E90, { 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x49, 0x00, 0x22, 0xFE, 0x00, 0x22, 0xAA, 0x00, 0x22, 0x92, 0x00, 0x3E, 0xAA, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x2E, 0xDA, 0x00, 0x28, 0xB6, 0x00, 0x28, 0xDA, 0x00, 0x28, 0xB6, 0x00, 0x2E, 0x92, 0x00, 0x38, 0xDA, 0x80, 0x61, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E91, { 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0x7A, 0x0B, 0x80, 0x4F, 0xFE, 0x80, 0x48, 0xA2, 0x80, 0x4B, 0xFA, 0x80, 0x4A, 0xAA, 0x80, 0x7B, 0x3B, 0x00, 0x12, 0x0B, 0x00, 0x53, 0xFA, 0x80, 0x5A, 0x0A, 0x80, 0x53, 0xFA, 0x80, 0x50, 0x42, 0x80, 0x57, 0xFE, 0x80, 0x58, 0xA3, 0x80, 0x71, 0xB2, 0x00, 0x43, 0x1A, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E92, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x7B, 0x23, 0x00, 0x4A, 0x3A, 0x00, 0x4A, 0xAA, 0x80, 0x49, 0x29, 0x00, 0x49, 0x39, 0x00, 0x7A, 0x2A, 0x00, 0x12, 0xAA, 0x80, 0x53, 0xBB, 0x80, 0x58, 0x10, 0x00, 0x53, 0xFF, 0x80, 0x50, 0x54, 0x00, 0x50, 0xD6, 0x00, 0x59, 0x93, 0x00, 0x73, 0x11, 0x80, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E93, { 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x3E, 0xE7, 0x00, 0x22, 0x84, 0x00, 0x22, 0xF7, 0x80, 0x22, 0xA5, 0x00, 0x23, 0x29, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x2E, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x2E, 0x7F, 0x00, 0x38, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E94, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0xFF, 0x80, 0x25, 0x00, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x25, 0x7F, 0x00, 0x3D, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x2D, 0xFF, 0x80, 0x29, 0x24, 0x00, 0x29, 0xC7, 0x80, 0x29, 0x08, 0x00, 0x2D, 0x7F, 0x00, 0x3A, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E95, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x4A, 0x41, 0x00, 0x4B, 0xF9, 0x00, 0x4A, 0x41, 0x00, 0x7A, 0xF7, 0x80, 0x12, 0x01, 0x00, 0x52, 0xF5, 0x00, 0x5A, 0x95, 0x00, 0x52, 0xF5, 0x00, 0x52, 0x01, 0x00, 0x52, 0x91, 0x00, 0x5A, 0xD1, 0x00, 0x74, 0x79, 0x00, 0x41, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xE7, 0x80, 0x25, 0x24, 0x80, 0x25, 0xE7, 0x80, 0x25, 0x24, 0x80, 0x25, 0xE7, 0x80, 0x3D, 0x00, 0x80, 0x09, 0x28, 0x80, 0x29, 0x3E, 0x80, 0x2D, 0x68, 0x80, 0x29, 0x3C, 0x80, 0x29, 0x28, 0x80, 0x29, 0x3C, 0x80, 0x2D, 0x28, 0x80, 0x39, 0x3E, 0x80, 0x61, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xFF, 0x80, 0x4B, 0x14, 0x00, 0x49, 0x7F, 0x00, 0x4A, 0x55, 0x00, 0x4B, 0x5D, 0x00, 0x79, 0x10, 0x00, 0x10, 0xFF, 0x80, 0x53, 0x22, 0x00, 0x59, 0x7F, 0x00, 0x51, 0xE5, 0x80, 0x51, 0x2C, 0x00, 0x51, 0x21, 0x00, 0x59, 0x3F, 0x00, 0x73, 0x80, 0x00, 0x42, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E9B, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x13, 0xF7, 0x80, 0x21, 0x10, 0x00, 0x4B, 0xF8, 0x00, 0x10, 0x87, 0x80, 0x33, 0xF1, 0x00, 0x52, 0x91, 0x00, 0x12, 0xB1, 0x00, 0x10, 0x83, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x07, 0x7E, 0x00, 0x1D, 0xC0, 0x00, 0x70, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8E9C, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x7A, 0x94, 0x00, 0x4B, 0xDE, 0x00, 0x4C, 0xA4, 0x00, 0x4B, 0xDF, 0x00, 0x79, 0x8C, 0x00, 0x52, 0xD5, 0x00, 0x14, 0xA7, 0x00, 0x51, 0xFC, 0x00, 0x5D, 0x06, 0x00, 0x51, 0x24, 0x00, 0x51, 0x24, 0x00, 0x5D, 0x24, 0x00, 0x70, 0x58, 0x00, 0x40, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E9D, { 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x3D, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x11, 0x00, 0x3D, 0x7D, 0x00, 0x09, 0x11, 0x00, 0x29, 0x7D, 0x00, 0x2D, 0x55, 0x00, 0x29, 0x7D, 0x00, 0x29, 0x55, 0x00, 0x29, 0x7D, 0x00, 0x2D, 0x39, 0x00, 0x39, 0x55, 0x00, 0x61, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8E9E, { 0x00, 0x00, 0x00, 0x01, 0x32, 0x00, 0x79, 0x02, 0x00, 0x4D, 0x7A, 0x80, 0x4D, 0x02, 0x80, 0x4B, 0xB7, 0x00, 0x49, 0x02, 0x00, 0x79, 0x32, 0x00, 0x13, 0x87, 0x00, 0x52, 0xFD, 0x00, 0x5A, 0x49, 0x00, 0x56, 0x79, 0x80, 0x50, 0x00, 0x00, 0x53, 0xFE, 0x00, 0x58, 0x84, 0x00, 0x70, 0x78, 0x00, 0x47, 0xCF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EA1, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x3C, 0x00, 0x22, 0x24, 0x00, 0x22, 0x3C, 0x00, 0x22, 0x27, 0x00, 0x3E, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x29, 0xFF, 0x80, 0x2E, 0xA5, 0x00, 0x28, 0xE7, 0x00, 0x28, 0xA5, 0x00, 0x28, 0xE7, 0x00, 0x2E, 0xA5, 0x00, 0x39, 0xEF, 0x00, 0x60, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EA2, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x7A, 0x28, 0x80, 0x4B, 0xEF, 0x80, 0x4A, 0x28, 0x80, 0x4B, 0xEF, 0x80, 0x4A, 0x00, 0x80, 0x7A, 0xFE, 0x80, 0x12, 0x82, 0x80, 0x52, 0xBA, 0x80, 0x5A, 0x82, 0x80, 0x52, 0xBA, 0x80, 0x52, 0x00, 0x80, 0x52, 0xEE, 0x80, 0x5A, 0xAA, 0x80, 0x72, 0x66, 0x80, 0x42, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EA7, { 0x00, 0x00, 0x00, 0x01, 0xEF, 0x80, 0x3C, 0x00, 0x00, 0x25, 0xEF, 0x80, 0x25, 0x28, 0x80, 0x25, 0x6A, 0x80, 0x24, 0x10, 0x00, 0x3D, 0xFF, 0x80, 0x09, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x2D, 0x24, 0x80, 0x29, 0xFF, 0x80, 0x29, 0x44, 0x00, 0x29, 0x77, 0x80, 0x2D, 0x44, 0x00, 0x3A, 0x74, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EA9, { 0x00, 0x00, 0x00, 0x01, 0xEF, 0x00, 0x3D, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xFF, 0x80, 0x08, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x2C, 0x88, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x88, 0x00, 0x29, 0xFF, 0x80, 0x2C, 0x42, 0x00, 0x38, 0x3C, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EAA, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x25, 0xE7, 0x80, 0x25, 0x24, 0x80, 0x3D, 0xE7, 0x80, 0x09, 0x24, 0x80, 0x09, 0xE7, 0x80, 0x2F, 0x28, 0x80, 0x29, 0x7E, 0x80, 0x29, 0xD0, 0x80, 0x29, 0x7E, 0x80, 0x29, 0x50, 0x80, 0x2F, 0x7E, 0x80, 0x31, 0x7E, 0x80, 0x01, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EAB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x80, 0x08, 0x7D, 0x00, 0x0F, 0x86, 0x00, 0x38, 0x0C, 0x00, 0x00, 0x14, 0x00, 0x00, 0x64, 0x00, 0x01, 0x84, 0x00, 0x0E, 0x04, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EAC, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0x9F, 0x00, 0x08, 0x81, 0x00, 0x0F, 0x81, 0x00, 0x08, 0x9F, 0x00, 0x0F, 0x90, 0x00, 0x08, 0xD0, 0x00, 0x0F, 0xA0, 0x00, 0x38, 0xBF, 0x80, 0x01, 0xA0, 0x80, 0x02, 0x80, 0x80, 0x04, 0x80, 0x80, 0x08, 0x80, 0x80, 0x10, 0x81, 0x00, 0x23, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EAD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x1E, 0x91, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x1E, 0x38, 0x00, 0x12, 0x28, 0x00, 0x12, 0x28, 0x00, 0x7E, 0x28, 0x00, 0x0A, 0x68, 0x00, 0x12, 0x48, 0x80, 0x62, 0x49, 0x80, 0x06, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EAE, { 0x00, 0x00, 0x00, 0x04, 0x1C, 0x00, 0x08, 0x04, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x26, 0x00, 0x12, 0x62, 0x00, 0x1E, 0xC3, 0x00, 0x13, 0x81, 0x80, 0x12, 0x7E, 0x00, 0x1E, 0x12, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x7E, 0x32, 0x00, 0x0A, 0x22, 0x00, 0x12, 0x66, 0x00, 0x62, 0xC4, 0x00, 0x06, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EAF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x21, 0x40, 0x00, 0x21, 0x51, 0x00, 0x3F, 0x5B, 0x00, 0x21, 0x4A, 0x00, 0x21, 0x4E, 0x00, 0x3F, 0x44, 0x00, 0x21, 0x44, 0x00, 0x21, 0x4E, 0x00, 0x7F, 0x4A, 0x00, 0x05, 0x5B, 0x00, 0x09, 0x51, 0x00, 0x11, 0x40, 0x00, 0x67, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EB0, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x1E, 0x2A, 0x00, 0x12, 0x6B, 0x00, 0x12, 0x49, 0x00, 0x7E, 0xC9, 0x80, 0x0A, 0x3E, 0x00, 0x12, 0x08, 0x00, 0x62, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EB1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x1E, 0x24, 0x00, 0x12, 0x24, 0x00, 0x12, 0x27, 0x00, 0x1E, 0x61, 0x00, 0x12, 0x41, 0x00, 0x12, 0xCB, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x2A, 0x00, 0x7E, 0x2A, 0x00, 0x0A, 0x6B, 0x00, 0x12, 0x49, 0x00, 0x62, 0xC9, 0x80, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EB2, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1E, 0x93, 0x00, 0x12, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x30, 0x00, 0x0A, 0x38, 0x00, 0x12, 0x58, 0x00, 0x12, 0x54, 0x00, 0x22, 0x93, 0x00, 0x4B, 0x12, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EB3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1F, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x18, 0x00, 0x11, 0x10, 0x00, 0x11, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x09, 0x41, 0x00, 0x11, 0x41, 0x00, 0x61, 0x41, 0x00, 0x07, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EB5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x1E, 0x11, 0x00, 0x12, 0x51, 0x00, 0x12, 0xD1, 0x00, 0x1E, 0x33, 0x00, 0x12, 0x62, 0x00, 0x12, 0xC6, 0x00, 0x1E, 0x00, 0x00, 0x12, 0x10, 0x00, 0x12, 0x18, 0x00, 0x7E, 0x29, 0x00, 0x0A, 0xA1, 0x80, 0x12, 0xA2, 0x80, 0x62, 0xA2, 0x00, 0x06, 0x9E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EBA, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x88, 0x80, 0x1E, 0xC9, 0x80, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1E, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x1E, 0x80, 0x80, 0x12, 0xBE, 0x80, 0x12, 0xA2, 0x80, 0x7E, 0xA2, 0x80, 0x0A, 0xBE, 0x80, 0x12, 0x80, 0x80, 0x62, 0x80, 0x80, 0x06, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EBB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0xA4, 0x80, 0x12, 0xA4, 0x80, 0x1E, 0x64, 0x00, 0x12, 0xC7, 0x80, 0x12, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x12, 0x08, 0x00, 0x62, 0xFF, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EBE, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x08, 0x14, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x14, 0x00, 0x12, 0x36, 0x00, 0x62, 0x63, 0x00, 0x06, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EC0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x1E, 0x80, 0x00, 0x12, 0x80, 0x00, 0x12, 0xBF, 0x00, 0x1E, 0xA1, 0x00, 0x12, 0xBF, 0x00, 0x12, 0x80, 0x00, 0x1E, 0xBF, 0x00, 0x12, 0xAD, 0x00, 0x13, 0xAD, 0x00, 0x1E, 0xAD, 0x00, 0x32, 0xBF, 0x00, 0x02, 0x80, 0x00, 0x02, 0xFF, 0x80, 0x06, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EC1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x49, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x10, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x21, 0x00, 0x12, 0x72, 0x00, 0x62, 0x1E, 0x00, 0x06, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EC3, { 0x00, 0x00, 0x00, 0x04, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x1E, 0xF7, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x62, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EC4, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x10, 0x45, 0x00, 0x3D, 0xF5, 0x80, 0x24, 0x04, 0x80, 0x25, 0x14, 0x00, 0x3C, 0xA4, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x04, 0x00, 0x3D, 0xF5, 0x00, 0x25, 0x15, 0x00, 0x25, 0x17, 0x00, 0x7D, 0xF2, 0x00, 0x15, 0x12, 0x00, 0x25, 0x12, 0x80, 0x45, 0xF7, 0x80, 0x0C, 0x0D, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EC5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x3D, 0x20, 0x00, 0x25, 0x29, 0x00, 0x25, 0x4A, 0x00, 0x3D, 0x5F, 0x80, 0x25, 0xD2, 0x00, 0x25, 0x72, 0x00, 0x3D, 0x5F, 0x00, 0x25, 0x52, 0x00, 0x25, 0x52, 0x00, 0x7D, 0x5F, 0x00, 0x15, 0x52, 0x00, 0x26, 0x52, 0x00, 0x44, 0x52, 0x00, 0x0C, 0x5F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EC6, { 0x00, 0x00, 0x00, 0x04, 0x14, 0x00, 0x08, 0x14, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x55, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x12, 0x22, 0x00, 0x62, 0x14, 0x00, 0x06, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EC7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x12, 0x00, 0x80, 0x12, 0x3E, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x0A, 0x01, 0x00, 0x12, 0xFF, 0x80, 0x62, 0xA9, 0x00, 0x06, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EC8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x3D, 0x20, 0x00, 0x25, 0x6A, 0x00, 0x25, 0x5F, 0x80, 0x3D, 0xF2, 0x00, 0x25, 0x5F, 0x00, 0x25, 0x52, 0x00, 0x3D, 0x5F, 0x00, 0x25, 0x52, 0x00, 0x26, 0x5F, 0x80, 0x7C, 0x08, 0x00, 0x14, 0x2D, 0x00, 0x24, 0xA5, 0x80, 0x44, 0xA2, 0x80, 0x0D, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ECA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ECB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xD0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xD0, 0x80, 0x04, 0x10, 0x80, 0x04, 0x1F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ECC, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x80, 0x04, 0x22, 0x80, 0x3F, 0xA2, 0x80, 0x04, 0x43, 0x80, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ECD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ECE, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ECF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x24, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x64, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8ED1, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x8E, 0x00, 0x24, 0x8A, 0x00, 0x24, 0x8A, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x1B, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x31, 0x80, 0x04, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8ED2, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8ED4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x2A, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x3E, 0x51, 0x00, 0x2A, 0xD1, 0x00, 0x2A, 0x91, 0x00, 0x3E, 0x31, 0x00, 0x08, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x63, 0x00, 0x08, 0x42, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EDB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x3E, 0x5F, 0x00, 0x2A, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x3E, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x3E, 0x53, 0x00, 0x08, 0x50, 0x00, 0x7F, 0x50, 0x00, 0x08, 0x50, 0x80, 0x08, 0x99, 0x80, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EDC, { 0x00, 0x00, 0x00, 0x08, 0x70, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x3E, 0xB9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xAD, 0x00, 0x3E, 0xC5, 0x00, 0x08, 0x81, 0x00, 0x7F, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EDF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x29, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x94, 0x00, 0x04, 0x14, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x04, 0x41, 0x00, 0x04, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EE2, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xC0, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x19, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x17, 0x80, 0x04, 0x3C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EE3, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1C, 0x0E, 0x00, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EE8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x2A, 0x3E, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x11, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x17, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EEB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x89, 0x80, 0x3F, 0x08, 0x00, 0x2A, 0x12, 0x00, 0x3E, 0x22, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x88, 0x80, 0x2A, 0x11, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC4, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EED, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x80, 0x00, 0x08, 0xBF, 0x80, 0x3E, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x3E, 0x9F, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xBF, 0x80, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EEE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x08, 0x14, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EF0, { 0x00, 0x00, 0x00, 0x02, 0x23, 0x00, 0x7E, 0x3E, 0x00, 0x02, 0x20, 0x80, 0x1E, 0x31, 0x80, 0x72, 0x1F, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EF1, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x7F, 0x7A, 0x00, 0x08, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x53, 0x00, 0x7F, 0x55, 0x00, 0x08, 0x5D, 0x00, 0x08, 0xB5, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EF7, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x13, 0x00, 0x7F, 0x11, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x11, 0x00, 0x3E, 0x39, 0x00, 0x2A, 0x2B, 0x00, 0x2A, 0x2A, 0x00, 0x3E, 0x6E, 0x00, 0x08, 0x44, 0x00, 0x7F, 0x4E, 0x00, 0x08, 0xCA, 0x00, 0x09, 0x9B, 0x00, 0x08, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EF8, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x3F, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x04, 0x3F, 0x80, 0x04, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EF9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xE1, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x3F, 0xA1, 0x00, 0x24, 0xBF, 0x00, 0x24, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x33, 0x00, 0x04, 0x21, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EFA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x11, 0x00, 0x08, 0x11, 0x00, 0x3E, 0x31, 0x00, 0x2A, 0x23, 0x00, 0x2A, 0x62, 0x00, 0x3E, 0xCE, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EFB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x3E, 0x02, 0x00, 0x2A, 0x7A, 0x00, 0x2A, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x4A, 0x00, 0x3E, 0x7A, 0x00, 0x2A, 0x02, 0x00, 0x08, 0x02, 0x00, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EFC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x7F, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0xC8, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8EFD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x33, 0x00, 0x3E, 0x16, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x36, 0x00, 0x3E, 0xE3, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8EFE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0A, 0x00, 0x3E, 0x09, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xF8, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x3C, 0x00, 0x3E, 0xC4, 0x00, 0x08, 0x02, 0x80, 0x08, 0x01, 0x80, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F00, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x18, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x54, 0x80, 0x3E, 0x54, 0x80, 0x2A, 0x54, 0x80, 0x2A, 0x54, 0x80, 0x3E, 0x54, 0x80, 0x08, 0x54, 0x80, 0x7F, 0x54, 0x80, 0x08, 0x54, 0x80, 0x08, 0x54, 0x80, 0x08, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F02, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x60, 0x81, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F03, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x22, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0xA2, 0x80, 0x2A, 0x22, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x14, 0x00, 0x08, 0x18, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x14, 0x00, 0x08, 0x62, 0x00, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F05, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x3E, 0x62, 0x00, 0x2A, 0x94, 0x00, 0x2B, 0x08, 0x00, 0x3E, 0x16, 0x00, 0x2A, 0x21, 0x80, 0x2A, 0xC0, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F07, { 0x00, 0x00, 0x00, 0x08, 0x78, 0x00, 0x08, 0x0C, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x63, 0x00, 0x3E, 0xC1, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F08, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x52, 0x00, 0x2A, 0x5A, 0x00, 0x2A, 0x4A, 0x00, 0x3E, 0x42, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x42, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x52, 0x00, 0x7F, 0x52, 0x00, 0x08, 0xD2, 0x00, 0x08, 0x82, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F09, { 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x0F, 0x92, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x3F, 0xD0, 0x80, 0x02, 0x10, 0x80, 0x1F, 0xD1, 0x00, 0x12, 0x51, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x4A, 0x00, 0x1F, 0xCC, 0x00, 0x02, 0x0C, 0x80, 0x3F, 0xD2, 0x80, 0x02, 0x21, 0x80, 0x02, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F0A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x32, 0x00, 0x3E, 0x22, 0x00, 0x2A, 0x2F, 0x00, 0x2A, 0x79, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F0C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x7F, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F0F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x14, 0x00, 0x08, 0x14, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x57, 0x00, 0x3E, 0x61, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F10, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x3E, 0x40, 0x80, 0x2A, 0x3F, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x12, 0x00, 0x7F, 0x12, 0x00, 0x08, 0x32, 0x80, 0x08, 0x22, 0x80, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F12, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0x94, 0x00, 0x3E, 0xF4, 0x00, 0x2A, 0x94, 0x00, 0x3E, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x3E, 0xF4, 0x00, 0x2A, 0x94, 0x00, 0x08, 0x94, 0x00, 0x3E, 0xF4, 0x80, 0x09, 0x94, 0x80, 0x08, 0x17, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F13, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x1F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x44, 0x00, 0x7F, 0xFF, 0x00, 0x49, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x49, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x18, 0x00, 0x08, 0x18, 0x00, 0x7F, 0x28, 0x00, 0x08, 0x48, 0x80, 0x08, 0x8F, 0x80, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F14, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x09, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F15, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x80, 0x00, 0x04, 0x15, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0xD2, 0x00, 0x24, 0xA9, 0x00, 0x3F, 0x94, 0x80, 0x24, 0x80, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F16, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x80, 0x80, 0x08, 0x88, 0x80, 0x3E, 0xBE, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xBE, 0x80, 0x3E, 0x88, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0xBE, 0x80, 0x3E, 0xA2, 0x80, 0x08, 0xA2, 0x80, 0x7F, 0xBE, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x09, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F17, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x08, 0x67, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x77, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x64, 0x80, 0x08, 0x44, 0x80, 0x08, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F18, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x7D, 0xFF, 0x80, 0x54, 0x24, 0x00, 0x54, 0x64, 0x00, 0x7D, 0xC7, 0x80, 0x54, 0x20, 0x00, 0x54, 0x3E, 0x00, 0x7C, 0x62, 0x00, 0x11, 0xC6, 0x00, 0x7C, 0x2C, 0x00, 0x10, 0x18, 0x00, 0x10, 0x76, 0x00, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F19, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x7C, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x7C, 0xFF, 0x00, 0x54, 0xA9, 0x00, 0x54, 0xA9, 0x00, 0x7C, 0xAB, 0x00, 0x54, 0xEA, 0x00, 0x54, 0xAE, 0x00, 0x7C, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x7C, 0xEE, 0x00, 0x13, 0xAB, 0x00, 0x10, 0x39, 0x80, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F1B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x3E, 0xDD, 0x80, 0x08, 0xDD, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F1C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x24, 0x80, 0x3E, 0x49, 0x00, 0x08, 0x92, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x24, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F1D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x1A, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x17, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F1E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x3E, 0xA2, 0x80, 0x08, 0x94, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0xA0, 0x80, 0x3E, 0xA0, 0x80, 0x08, 0xA0, 0x80, 0x08, 0xBE, 0x80, 0x3E, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x08, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F1F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x11, 0x00, 0x08, 0xA6, 0x00, 0x08, 0x62, 0x00, 0x3E, 0x55, 0x00, 0x2A, 0x88, 0x80, 0x3F, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x11, 0x00, 0x2A, 0x92, 0x00, 0x08, 0x6A, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x56, 0x00, 0x08, 0x89, 0x00, 0x09, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F20, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x7F, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F21, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x1F, 0x80, 0x08, 0x30, 0x80, 0x3E, 0x21, 0x80, 0x2A, 0x61, 0x00, 0x2A, 0xC7, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x18, 0x00, 0x2A, 0x73, 0x80, 0x3E, 0x40, 0x80, 0x08, 0x40, 0x80, 0x7F, 0x73, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F23, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xE7, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x55, 0xA6, 0x80, 0x55, 0x65, 0x80, 0x7D, 0x24, 0x80, 0x55, 0x24, 0x80, 0x55, 0xA6, 0x80, 0x7D, 0x65, 0x80, 0x11, 0x24, 0x80, 0x7D, 0x24, 0x80, 0x11, 0x24, 0x80, 0x11, 0x24, 0x80, 0x12, 0x69, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F25, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x54, 0x00, 0x00, 0x54, 0x88, 0x00, 0x7C, 0x8B, 0x00, 0x10, 0xEE, 0x00, 0x7C, 0x88, 0x00, 0x10, 0x88, 0x80, 0x10, 0xE9, 0x80, 0x13, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F26, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x16, 0x00, 0x31, 0x61, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F27, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x44, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x74, 0x00, 0x3F, 0xDF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F28, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x2A, 0x3E, 0x00, 0x2A, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x2A, 0x3E, 0x00, 0x2A, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F29, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x07, 0x9F, 0x80, 0x3C, 0x50, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F2A, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x81, 0x00, 0x3F, 0x00, 0x80, 0x2A, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F2C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F2D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x3E, 0xA4, 0x80, 0x2A, 0xA5, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x14, 0x00, 0x08, 0x36, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F2E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x54, 0x29, 0x00, 0x54, 0x6A, 0x00, 0x7C, 0xC8, 0x00, 0x55, 0x88, 0x00, 0x54, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x54, 0x00, 0x7C, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x11, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F2F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x5F, 0x80, 0x09, 0xE2, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F33, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x14, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x42, 0x00, 0x2A, 0x81, 0x00, 0x3F, 0x7F, 0x80, 0x2A, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x14, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F34, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x0E, 0x00, 0x7E, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x7F, 0xBF, 0x00, 0x09, 0x21, 0x00, 0x0B, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F35, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x3E, 0x20, 0x00, 0x2A, 0x3F, 0x80, 0x2A, 0x68, 0x80, 0x3E, 0xC8, 0x80, 0x08, 0x5C, 0x80, 0x7F, 0x76, 0x80, 0x08, 0x41, 0x80, 0x08, 0x7D, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F36, { 0x00, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x43, 0x00, 0x7F, 0xC1, 0x80, 0x08, 0xBE, 0x80, 0x3E, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x67, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F37, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0xC0, 0x80, 0x3E, 0x38, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0xFE, 0x80, 0x3E, 0x00, 0x80, 0x2A, 0x7C, 0x80, 0x2A, 0x00, 0x80, 0x3E, 0x7C, 0x80, 0x08, 0x00, 0x80, 0x7F, 0x7C, 0x80, 0x08, 0x45, 0x80, 0x08, 0x7D, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F38, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x3E, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x71, 0x00, 0x2A, 0x55, 0x00, 0x3E, 0x75, 0x00, 0x08, 0x55, 0x00, 0x08, 0x75, 0x00, 0x3E, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x95, 0x00, 0x08, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F39, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x42, 0x00, 0x3E, 0xA4, 0x00, 0x09, 0x18, 0x00, 0x08, 0x66, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F3A, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x92, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x92, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F3B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F3E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x94, 0x00, 0x08, 0x95, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x9E, 0x00, 0x09, 0x71, 0x00, 0x09, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F3F, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x0D, 0xF6, 0x00, 0x08, 0x42, 0x00, 0x09, 0xF2, 0x00, 0x0F, 0x5E, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x52, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F40, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x5D, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x55, 0x00, 0x08, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F41, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x08, 0x1E, 0x00, 0x7E, 0xF0, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x5B, 0x00, 0x2A, 0xC9, 0x80, 0x2A, 0x80, 0x80, 0x3E, 0x30, 0x00, 0x2A, 0xE7, 0x00, 0x2A, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x08, 0xE7, 0x00, 0x7F, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F42, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xCE, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x8A, 0x00, 0x00, 0x0A, 0x00, 0x7F, 0xD3, 0x80, 0x40, 0x40, 0x00, 0x1F, 0x1F, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xCB, 0x00, 0x15, 0x0A, 0x00, 0x1F, 0x0E, 0x00, 0x15, 0x04, 0x00, 0x7F, 0xCE, 0x00, 0x04, 0x1B, 0x00, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F43, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x28, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x44, 0x00, 0x7C, 0x9A, 0x00, 0x57, 0x71, 0x80, 0x54, 0x10, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x54, 0x00, 0x7C, 0xD6, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F44, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x0F, 0x00, 0x2A, 0x78, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F45, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x29, 0x00, 0x2A, 0x68, 0x80, 0x08, 0xA5, 0x00, 0x09, 0x26, 0x00, 0x3E, 0x3E, 0x00, 0x09, 0xE1, 0x00, 0x08, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F46, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0xA4, 0x80, 0x3E, 0xA4, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x3E, 0xA5, 0x80, 0x08, 0xBF, 0x00, 0x7E, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x09, 0x3C, 0x80, 0x08, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F47, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x7C, 0x63, 0x00, 0x10, 0xA5, 0x00, 0x7C, 0x63, 0x00, 0x54, 0xA5, 0x00, 0x54, 0x11, 0x00, 0x7C, 0x38, 0x00, 0x54, 0x6E, 0x00, 0x55, 0xC3, 0x80, 0x7C, 0x10, 0x00, 0x10, 0xE4, 0x00, 0x7C, 0x19, 0x00, 0x10, 0xE2, 0x00, 0x10, 0x0C, 0x00, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F49, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x0A, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x05, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x08, 0x24, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F4C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x2A, 0xEE, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0x66, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x3F, 0x00, 0x3E, 0x01, 0x00, 0x08, 0x01, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F4D, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x52, 0x00, 0x3E, 0xBA, 0x00, 0x09, 0xCF, 0x80, 0x08, 0x05, 0x00, 0x3E, 0xF9, 0x00, 0x2A, 0x9D, 0x00, 0x3E, 0x95, 0x00, 0x2A, 0xF5, 0x00, 0x3E, 0x95, 0x00, 0x2A, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x95, 0x00, 0x08, 0x95, 0x00, 0x08, 0xB8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F4E, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x08, 0x78, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x3E, 0x7D, 0x00, 0x2B, 0xA4, 0x80, 0x3E, 0x3C, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x3E, 0xA5, 0x00, 0x08, 0xBD, 0x00, 0x08, 0x81, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F4F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x00, 0x00, 0x55, 0x3E, 0x00, 0x55, 0x04, 0x00, 0x7D, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0x18, 0x00, 0x7D, 0xE7, 0x00, 0x11, 0x21, 0x00, 0x7D, 0x72, 0x00, 0x11, 0xCF, 0x80, 0x12, 0x42, 0x00, 0x10, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F51, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x44, 0x00, 0x7D, 0x45, 0x00, 0x54, 0x82, 0x00, 0x55, 0xFF, 0x00, 0x7E, 0x82, 0x80, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x92, 0x00, 0x11, 0x93, 0x00, 0x13, 0x11, 0x80, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F52, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F53, { 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0x10, 0x1C, 0x00, 0x7D, 0xF0, 0x00, 0x10, 0x92, 0x00, 0x7C, 0x54, 0x00, 0x57, 0xFF, 0x80, 0x54, 0x54, 0x00, 0x7C, 0xD6, 0x00, 0x55, 0x93, 0x00, 0x57, 0x01, 0x80, 0x7C, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F54, { 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x92, 0x00, 0x7C, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x54, 0x00, 0x54, 0xD6, 0x00, 0x55, 0x93, 0x00, 0x7F, 0x11, 0x80, 0x54, 0xE2, 0x00, 0x54, 0xAF, 0x00, 0x7D, 0x2A, 0x00, 0x12, 0xAA, 0x00, 0x7C, 0x5F, 0x80, 0x10, 0xC2, 0x00, 0x11, 0x82, 0x00, 0x13, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F55, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0xC8, 0x80, 0x09, 0x5C, 0x80, 0x7F, 0x76, 0x80, 0x08, 0x41, 0x80, 0x08, 0x7D, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F57, { 0x00, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x09, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x7D, 0x7D, 0x00, 0x55, 0x05, 0x00, 0x55, 0x77, 0x00, 0x7D, 0x52, 0x00, 0x55, 0x76, 0x80, 0x56, 0x0B, 0x80, 0x7C, 0x01, 0x00, 0x10, 0x10, 0x00, 0x7C, 0x59, 0x00, 0x11, 0x49, 0x80, 0x11, 0x42, 0x80, 0x12, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F58, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x49, 0x00, 0x11, 0x49, 0x00, 0x7D, 0xFF, 0x00, 0x54, 0x00, 0x00, 0x57, 0xFF, 0x80, 0x7C, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x01, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x50, 0x80, 0x7C, 0x93, 0x00, 0x11, 0x8C, 0x00, 0x12, 0xB3, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F5C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x2A, 0xEE, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0x66, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xA5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F5D, { 0x00, 0x00, 0x00, 0x0B, 0x76, 0x00, 0x0C, 0x42, 0x00, 0x0E, 0x76, 0x00, 0x08, 0x52, 0x00, 0x0E, 0x56, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x44, 0x00, 0x0F, 0xFE, 0x00, 0x30, 0x41, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F5E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x00, 0x7F, 0xA2, 0x00, 0x08, 0xA7, 0x80, 0x3E, 0xFC, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xF8, 0x00, 0x3E, 0xA7, 0x80, 0x2A, 0xA0, 0x00, 0x2A, 0xF8, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F5F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x1F, 0xBF, 0x00, 0x14, 0xA5, 0x00, 0x1F, 0xBF, 0x00, 0x14, 0xA5, 0x00, 0x1F, 0xBF, 0x80, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F61, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xE4, 0x00, 0x48, 0x89, 0x00, 0x33, 0xE6, 0x00, 0x2A, 0xA4, 0x80, 0x7B, 0xEF, 0x80, 0x12, 0xA2, 0x00, 0x5B, 0xE6, 0x80, 0x54, 0x8A, 0x80, 0x53, 0xE2, 0x80, 0x10, 0x82, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F62, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xBC, 0x00, 0x3F, 0x29, 0x00, 0x09, 0xEE, 0x00, 0x3F, 0x7A, 0x00, 0x2A, 0xAA, 0x00, 0x3F, 0x6D, 0x80, 0x2B, 0xBE, 0x80, 0x3E, 0x10, 0x00, 0x2A, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F63, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x33, 0x00, 0x11, 0x66, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x55, 0x77, 0x00, 0x7D, 0xAA, 0x80, 0x55, 0x22, 0x00, 0x55, 0x08, 0x00, 0x7D, 0x48, 0x00, 0x11, 0x4F, 0x00, 0x7D, 0x48, 0x00, 0x12, 0x48, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F64, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x2A, 0xBE, 0x00, 0x2A, 0x88, 0x80, 0x3E, 0xBF, 0x80, 0x2A, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x08, 0xBF, 0x00, 0x7E, 0x80, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F65, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x11, 0xE7, 0x80, 0x7D, 0x24, 0x80, 0x55, 0xE7, 0x80, 0x55, 0x24, 0x80, 0x7D, 0xE7, 0x80, 0x55, 0x28, 0x80, 0x55, 0x3E, 0x80, 0x7D, 0x68, 0x80, 0x11, 0x3C, 0x80, 0x7D, 0x28, 0x80, 0x11, 0x3C, 0x80, 0x11, 0x28, 0x80, 0x11, 0x3E, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8F66, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x04, 0x80, 0x00, 0x08, 0x80, 0x00, 0x10, 0x90, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F67, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x7F, 0xA0, 0x00, 0x10, 0x20, 0x00, 0x14, 0x20, 0x00, 0x25, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x07, 0xA0, 0x00, 0x7C, 0x20, 0x00, 0x24, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F68, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x7F, 0x24, 0x00, 0x10, 0xFE, 0x00, 0x14, 0x24, 0x00, 0x24, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x7F, 0x44, 0x00, 0x04, 0x45, 0x00, 0x04, 0x45, 0x00, 0x04, 0x83, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F69, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x14, 0x10, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F6B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x7F, 0x12, 0x00, 0x10, 0x12, 0x00, 0x14, 0x52, 0x00, 0x24, 0x52, 0x00, 0x3F, 0x52, 0x00, 0x04, 0x92, 0x00, 0x04, 0x12, 0x00, 0x07, 0x12, 0x00, 0x7C, 0x22, 0x00, 0x24, 0x22, 0x00, 0x04, 0x42, 0x00, 0x04, 0x94, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F6C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x7E, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x14, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0xFE, 0x00, 0x0E, 0x04, 0x00, 0x74, 0x08, 0x00, 0x24, 0x48, 0x00, 0x04, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F6D, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x20, 0x82, 0x00, 0x28, 0xBF, 0x00, 0x48, 0xA2, 0x00, 0x7E, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xAA, 0x00, 0x0E, 0xA4, 0x00, 0x79, 0x20, 0x00, 0x29, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0C, 0x1F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F6E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x10, 0x50, 0x00, 0x7E, 0x50, 0x00, 0x10, 0x88, 0x00, 0x28, 0x84, 0x00, 0x29, 0x07, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x88, 0x00, 0x08, 0x98, 0x00, 0x0E, 0xE0, 0x00, 0x78, 0x80, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F6F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x7F, 0x3E, 0x00, 0x10, 0x42, 0x00, 0x14, 0x84, 0x00, 0x24, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0x28, 0x00, 0x7C, 0x28, 0x00, 0x24, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x83, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F70, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0x7E, 0x00, 0x11, 0x44, 0x00, 0x0A, 0x28, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x47, 0x00, 0x60, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F71, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x24, 0x10, 0x00, 0x3F, 0x12, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x82, 0x00, 0x07, 0x82, 0x00, 0x7C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F72, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x7F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x14, 0xF4, 0x00, 0x24, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x04, 0x94, 0x00, 0x04, 0x94, 0x00, 0x07, 0xF4, 0x00, 0x7C, 0x94, 0x00, 0x24, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x14, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F73, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0A, 0x1F, 0x00, 0x7F, 0x10, 0x00, 0x10, 0x12, 0x00, 0x14, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x24, 0x80, 0x00, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F74, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x92, 0x00, 0x07, 0x92, 0x00, 0x7C, 0x92, 0x00, 0x24, 0x92, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F75, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x7F, 0x00, 0x7F, 0x42, 0x00, 0x10, 0x42, 0x00, 0x14, 0x42, 0x00, 0x24, 0x42, 0x00, 0x3F, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x07, 0x00, 0x00, 0x7C, 0x24, 0x00, 0x24, 0x24, 0x00, 0x04, 0x42, 0x00, 0x04, 0x83, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F76, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x50, 0x00, 0x7F, 0x54, 0x00, 0x10, 0x7E, 0x00, 0x14, 0x90, 0x00, 0x24, 0x10, 0x00, 0x3F, 0x12, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x07, 0x10, 0x00, 0x7C, 0x28, 0x00, 0x24, 0x28, 0x00, 0x04, 0x44, 0x00, 0x04, 0x47, 0x00, 0x05, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F77, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x0A, 0xF0, 0x00, 0x7F, 0x10, 0x00, 0x10, 0x12, 0x00, 0x14, 0x92, 0x00, 0x24, 0x54, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x12, 0x00, 0x04, 0xFF, 0x00, 0x07, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x50, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F78, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x14, 0x50, 0x00, 0x7E, 0x50, 0x00, 0x20, 0x8C, 0x00, 0x29, 0x13, 0x00, 0x4A, 0x20, 0x00, 0x7E, 0x40, 0x00, 0x08, 0x88, 0x00, 0x08, 0x10, 0x00, 0x0C, 0x20, 0x00, 0x78, 0xC4, 0x00, 0x28, 0x08, 0x00, 0x08, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F79, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x0A, 0xF0, 0x00, 0x7F, 0x80, 0x00, 0x10, 0x90, 0x00, 0x14, 0x90, 0x00, 0x24, 0x90, 0x00, 0x3F, 0x92, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x07, 0x54, 0x00, 0x7C, 0x52, 0x00, 0x24, 0x93, 0x00, 0x05, 0x11, 0x00, 0x04, 0x50, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F7A, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x10, 0x22, 0x00, 0x14, 0x22, 0x00, 0x24, 0x4A, 0x00, 0x3F, 0x44, 0x00, 0x04, 0x82, 0x00, 0x04, 0x7F, 0x00, 0x07, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x24, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F7B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x04, 0x00, 0x7F, 0x08, 0x00, 0x10, 0x1C, 0x00, 0x14, 0x66, 0x00, 0x25, 0x81, 0x00, 0x3E, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0xFE, 0x00, 0x07, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x12, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F7C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x0A, 0x0A, 0x00, 0x7F, 0x0A, 0x00, 0x10, 0xFF, 0x00, 0x14, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3E, 0xF8, 0x00, 0x04, 0x48, 0x00, 0x04, 0x48, 0x00, 0x07, 0x48, 0x00, 0x7C, 0x78, 0x00, 0x25, 0xC4, 0x00, 0x04, 0x05, 0x00, 0x04, 0x03, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F7D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x05, 0x28, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x04, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x7F, 0xA0, 0x00, 0x10, 0x24, 0x00, 0x14, 0x24, 0x00, 0x3F, 0x18, 0x00, 0x04, 0x10, 0x00, 0x07, 0xB0, 0x00, 0x7C, 0x49, 0x00, 0x04, 0x85, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F7E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x10, 0x44, 0x00, 0x14, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x3F, 0x11, 0x00, 0x04, 0x10, 0x00, 0x04, 0x14, 0x00, 0x07, 0xFE, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x12, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F7F, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x09, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x10, 0x22, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x48, 0x00, 0x7E, 0x8C, 0x00, 0x09, 0x8F, 0x00, 0x0A, 0x8A, 0x00, 0x0E, 0x88, 0x00, 0x78, 0x88, 0x00, 0x28, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F81, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x7F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x14, 0x82, 0x00, 0x25, 0x7D, 0x00, 0x3F, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x07, 0x7C, 0x00, 0x7C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x04, 0x12, 0x00, 0x05, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F82, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x7E, 0x00, 0x7F, 0x82, 0x00, 0x10, 0xC4, 0x00, 0x15, 0x28, 0x00, 0x24, 0x10, 0x00, 0x3F, 0x28, 0x00, 0x04, 0x44, 0x00, 0x04, 0x83, 0x00, 0x07, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x24, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F83, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x10, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x28, 0x44, 0x00, 0x28, 0x83, 0x00, 0x7F, 0x01, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x0F, 0x10, 0x00, 0x78, 0x28, 0x00, 0x28, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x87, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F84, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x90, 0x00, 0x7F, 0x94, 0x00, 0x10, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x24, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x04, 0xF4, 0x00, 0x04, 0x94, 0x00, 0x07, 0x94, 0x00, 0x7C, 0x9D, 0x00, 0x25, 0xF5, 0x00, 0x04, 0x97, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F85, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x08, 0x12, 0x00, 0x0A, 0xFF, 0x00, 0x7F, 0x10, 0x00, 0x10, 0x12, 0x00, 0x14, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0xFE, 0x00, 0x04, 0x92, 0x00, 0x07, 0x92, 0x00, 0x7C, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x04, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F86, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x19, 0xFF, 0x00, 0x29, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x0F, 0xAA, 0x00, 0x79, 0x16, 0x00, 0x29, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F87, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x7E, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x7E, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x21, 0x03, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x80, 0x00, 0x04, 0x90, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F88, { 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x3E, 0x7E, 0x00, 0x02, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x02, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x03, 0x40, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F89, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x4A, 0x82, 0x00, 0x2B, 0x20, 0x00, 0x1C, 0x24, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x40, 0x00, 0x14, 0x90, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x14, 0x12, 0x00, 0x15, 0xFF, 0x00, 0x26, 0x10, 0x00, 0x24, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F8A, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x21, 0x04, 0x00, 0x49, 0x04, 0x00, 0x7F, 0xFC, 0x00, 0x09, 0x12, 0x00, 0x09, 0x16, 0x00, 0x0F, 0xD8, 0x00, 0x79, 0x10, 0x00, 0x29, 0x11, 0x00, 0x09, 0x51, 0x00, 0x09, 0x8F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F8B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x02, 0x00, 0x15, 0xFF, 0x00, 0x7F, 0x02, 0x00, 0x21, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x49, 0xFE, 0x00, 0x7F, 0x22, 0x00, 0x09, 0x12, 0x00, 0x09, 0xFE, 0x00, 0x0F, 0x42, 0x00, 0x79, 0x42, 0x00, 0x29, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F8D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x12, 0x52, 0x00, 0x7E, 0x94, 0x00, 0x21, 0x08, 0x00, 0x2A, 0x94, 0x00, 0x48, 0x62, 0x00, 0x7C, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x08, 0x42, 0x00, 0x0C, 0x62, 0x00, 0x7A, 0x94, 0x00, 0x29, 0x08, 0x00, 0x0A, 0x94, 0x00, 0x0C, 0x67, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F8E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x92, 0x00, 0x14, 0x92, 0x00, 0x7F, 0x24, 0x00, 0x21, 0x24, 0x00, 0x28, 0x92, 0x00, 0x48, 0x92, 0x00, 0x7E, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0xFE, 0x00, 0x28, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F8F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x3F, 0x28, 0x00, 0x04, 0x44, 0x00, 0x04, 0xFE, 0x00, 0x07, 0x11, 0x00, 0x7C, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x04, 0x2C, 0x00, 0x04, 0x43, 0x00, 0x05, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F90, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x7D, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x29, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x7C, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F91, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x7E, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x14, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x3E, 0x84, 0x00, 0x04, 0xFC, 0x00, 0x04, 0x84, 0x00, 0x07, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x24, 0x84, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F93, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x14, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x11, 0x07, 0x00, 0x22, 0xFA, 0x00, 0x28, 0x00, 0x00, 0x49, 0xE2, 0x00, 0x7D, 0x2A, 0x00, 0x09, 0xEA, 0x00, 0x1D, 0x2A, 0x00, 0x69, 0xEA, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x22, 0x00, 0x09, 0x22, 0x00, 0x09, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F94, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x13, 0xE8, 0x00, 0x11, 0x08, 0x00, 0x3E, 0x9E, 0x00, 0x0B, 0xE4, 0x00, 0x10, 0x88, 0x00, 0x3C, 0x9E, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x9F, 0x00, 0x00, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F95, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x7E, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x20, 0x04, 0x00, 0x49, 0xFE, 0x00, 0x7F, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x0E, 0xA2, 0x00, 0x78, 0x94, 0x00, 0x29, 0x88, 0x00, 0x0A, 0xA7, 0x00, 0x08, 0xC2, 0x00, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F96, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x7F, 0x11, 0x00, 0x12, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x28, 0xFC, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x0E, 0xFF, 0x00, 0x78, 0x82, 0x00, 0x28, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F97, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x15, 0x02, 0x00, 0x7F, 0xFE, 0x00, 0x21, 0x28, 0x00, 0x29, 0x28, 0x00, 0x49, 0xFE, 0x00, 0x7F, 0x28, 0x00, 0x09, 0x2A, 0x00, 0x09, 0xFF, 0x00, 0x0F, 0x52, 0x00, 0x79, 0x54, 0x00, 0x2A, 0x48, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x67, 0x00, 0x08, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F98, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x12, 0x00, 0x15, 0xFF, 0x00, 0x7F, 0x28, 0x00, 0x21, 0x2A, 0x00, 0x29, 0xFF, 0x00, 0x49, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x49, 0x00, 0x0F, 0x4A, 0x00, 0x79, 0x7C, 0x00, 0x29, 0x48, 0x00, 0x09, 0x59, 0x00, 0x0A, 0x69, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F99, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x10, 0x90, 0x00, 0x13, 0xF2, 0x00, 0x7D, 0x1F, 0x00, 0x12, 0x62, 0x00, 0x2B, 0xD2, 0x00, 0x28, 0x52, 0x00, 0x7F, 0xD2, 0x00, 0x0A, 0x52, 0x00, 0x0B, 0xD4, 0x00, 0x0E, 0x48, 0x00, 0x7B, 0xC8, 0x00, 0x2A, 0x54, 0x00, 0x0A, 0x54, 0x00, 0x0A, 0x63, 0x00, 0x0A, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F9A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x14, 0xA8, 0x00, 0x7F, 0xFF, 0x00, 0x20, 0xA8, 0x00, 0x29, 0x26, 0x00, 0x4A, 0x22, 0x00, 0x7D, 0x04, 0x00, 0x09, 0xDF, 0x00, 0x09, 0x44, 0x00, 0x0D, 0x54, 0x00, 0x7A, 0xD4, 0x00, 0x28, 0x9F, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F9B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F9C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F9D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0xFF, 0x80, 0x22, 0x41, 0x00, 0x22, 0x63, 0x00, 0x2F, 0x22, 0x00, 0x79, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F9E, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0xFF, 0x80, 0x08, 0x41, 0x00, 0x08, 0x63, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8F9F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x22, 0x00, 0x11, 0x36, 0x00, 0x1F, 0x14, 0x00, 0x10, 0x14, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x69, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x22, 0x21, 0x00, 0x36, 0x33, 0x00, 0x14, 0x12, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x78, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x18, 0x08, 0x00, 0x10, 0x08, 0x00, 0x30, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x08, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x89, 0x00, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FA4, { 0x00, 0x00, 0x00, 0x01, 0x84, 0x00, 0x07, 0x04, 0x00, 0x7C, 0x3F, 0x80, 0x24, 0x91, 0x00, 0x12, 0x9B, 0x00, 0x7F, 0xCA, 0x00, 0x40, 0x7F, 0x80, 0x40, 0x44, 0x00, 0x3F, 0x84, 0x00, 0x10, 0x84, 0x00, 0x19, 0xBF, 0x80, 0x0B, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x1B, 0x04, 0x00, 0x31, 0x04, 0x00, 0x60, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA5, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x24, 0xA1, 0x00, 0x3F, 0xB3, 0x00, 0x10, 0x12, 0x00, 0x64, 0x12, 0x00, 0x08, 0x7F, 0x80, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA6, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x9F, 0x80, 0x01, 0xE0, 0x00, 0x22, 0xA8, 0x80, 0x14, 0xA5, 0x00, 0x3F, 0xAF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x0E, 0xA2, 0x00, 0x38, 0xAF, 0x80, 0x09, 0x22, 0x00, 0x11, 0x22, 0x00, 0x12, 0x22, 0x00, 0x24, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA7, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xE2, 0x00, 0x7D, 0x2F, 0x80, 0x29, 0x25, 0x00, 0x29, 0x25, 0x00, 0x29, 0x25, 0x00, 0x7D, 0x2F, 0x80, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x7D, 0x2F, 0x80, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x11, 0x22, 0x00, 0x33, 0x22, 0x00, 0x22, 0x22, 0x00, 0x66, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA8, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xA2, 0x00, 0x3E, 0xAF, 0x80, 0x00, 0xA0, 0x00, 0x14, 0xA5, 0x00, 0x14, 0xA5, 0x00, 0x3E, 0xBF, 0x80, 0x08, 0xA2, 0x00, 0x0F, 0xA2, 0x00, 0x38, 0xAF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0x22, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FA9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0x08, 0x00, 0x08, 0x88, 0x00, 0x3E, 0xBE, 0x00, 0x04, 0x04, 0x00, 0x17, 0x94, 0x00, 0x14, 0x94, 0x00, 0x7E, 0xBF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0xBE, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xC8, 0x00, 0x10, 0x88, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FAB, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x9F, 0x00, 0x04, 0x82, 0x00, 0x15, 0xEA, 0x00, 0x14, 0x2A, 0x00, 0x7E, 0x5F, 0x00, 0x08, 0x84, 0x00, 0x09, 0xE4, 0x00, 0x7E, 0x1F, 0x00, 0x08, 0x04, 0x00, 0x08, 0x64, 0x00, 0x09, 0x84, 0x00, 0x10, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FAD, { 0x00, 0x00, 0x00, 0x03, 0x84, 0x00, 0x1E, 0x84, 0x00, 0x14, 0x44, 0x00, 0x22, 0x3F, 0x80, 0x1F, 0x91, 0x00, 0x09, 0x09, 0x00, 0x06, 0x0A, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x29, 0x44, 0x00, 0x3F, 0xC4, 0x00, 0x20, 0x7F, 0x80, 0x3F, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x26, 0x44, 0x00, 0x29, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FAE, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC2, 0x00, 0x7C, 0x8F, 0x80, 0x2B, 0x25, 0x00, 0x29, 0x65, 0x00, 0x28, 0xC5, 0x00, 0x7C, 0x8F, 0x80, 0x11, 0x22, 0x00, 0x13, 0xF2, 0x00, 0x7C, 0x9F, 0x80, 0x10, 0x82, 0x00, 0x12, 0xA2, 0x00, 0x16, 0xB2, 0x00, 0x34, 0x92, 0x00, 0x20, 0x82, 0x00, 0x60, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FAF, { 0x00, 0x00, 0x00, 0x08, 0xE2, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x3E, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x14, 0xE5, 0x00, 0x14, 0x05, 0x00, 0x3E, 0x0F, 0x80, 0x08, 0xE2, 0x00, 0x0E, 0x02, 0x00, 0x38, 0x0F, 0x80, 0x08, 0xE2, 0x00, 0x08, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x10, 0xE2, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x24, 0x00, 0x12, 0x18, 0x00, 0x12, 0x10, 0x00, 0x12, 0x08, 0x00, 0x13, 0xE4, 0x00, 0x2E, 0x02, 0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x11, 0x0A, 0x00, 0x21, 0xF6, 0x00, 0x2F, 0x05, 0x80, 0x00, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FB2, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x12, 0x14, 0x00, 0x23, 0xEC, 0x00, 0x2E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FB5, { 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x03, 0xC4, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0x71, 0x80, 0x03, 0xC7, 0x00, 0x3E, 0x1C, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x00, 0x80, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x1C, 0x80, 0x00, 0x16, 0x80, 0x00, 0x33, 0x80, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FB6, { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFC, 0x00, 0x18, 0x44, 0x00, 0x08, 0x44, 0x00, 0x30, 0x44, 0x00, 0x18, 0x47, 0x80, 0x08, 0x40, 0x80, 0x00, 0x40, 0x80, 0x78, 0x40, 0x80, 0x08, 0xC0, 0x80, 0x08, 0x81, 0x80, 0x09, 0x81, 0x00, 0x0B, 0x07, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FB9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x78, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x10, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x78, 0x21, 0x00, 0x08, 0x61, 0x00, 0x08, 0x41, 0x00, 0x08, 0xC3, 0x00, 0x09, 0x82, 0x00, 0x0B, 0x0E, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FBB, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xF0, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x00, 0x78, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x09, 0x83, 0x00, 0x0B, 0x01, 0x80, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FBD, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x1B, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x38, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x08, 0x40, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FBE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x08, 0x38, 0x00, 0x00, 0x28, 0x00, 0x78, 0x2C, 0x00, 0x08, 0x64, 0x00, 0x08, 0x46, 0x00, 0x08, 0xC3, 0x00, 0x0B, 0x81, 0x80, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FBF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x79, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FC1, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x30, 0x1C, 0x00, 0x19, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FC2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FC4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x19, 0xFF, 0x80, 0x0B, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x18, 0x00, 0x78, 0x30, 0x00, 0x08, 0x60, 0x00, 0x08, 0xC0, 0x00, 0x09, 0x80, 0x00, 0x09, 0x01, 0x00, 0x09, 0x83, 0x00, 0x18, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FC5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x44, 0x00, 0x20, 0x44, 0x00, 0x10, 0x44, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x38, 0x44, 0x00, 0x08, 0x84, 0x80, 0x08, 0x82, 0x80, 0x09, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FC6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x90, 0x00, 0x18, 0x90, 0x00, 0x08, 0x93, 0x00, 0x30, 0x9D, 0x00, 0x18, 0xB1, 0x00, 0x08, 0xD1, 0x00, 0x03, 0x91, 0x00, 0x78, 0x93, 0x00, 0x08, 0x90, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x18, 0x7F, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FC7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x08, 0x00, 0x10, 0x08, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x78, 0x88, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x28, 0x00, 0x08, 0x10, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FC8, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x18, 0x80, 0x00, 0x08, 0x84, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x84, 0x00, 0x78, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x28, 0x00, 0x08, 0x10, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x79, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x17, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FCD, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x23, 0x00, 0x18, 0x3E, 0x00, 0x0B, 0xE0, 0x00, 0x30, 0x20, 0x00, 0x19, 0x22, 0x00, 0x09, 0x22, 0x00, 0x01, 0x22, 0x00, 0x79, 0x22, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x80, 0x08, 0x31, 0x80, 0x18, 0x1F, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FCE, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x09, 0x9F, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x21, 0x11, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x39, 0x11, 0x00, 0x09, 0x71, 0x00, 0x0B, 0x97, 0x00, 0x08, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x78, 0x44, 0x00, 0x08, 0xC6, 0x00, 0x08, 0x82, 0x00, 0x08, 0x8F, 0x00, 0x09, 0xF9, 0x80, 0x1B, 0x00, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FD1, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x20, 0x80, 0x00, 0x10, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x38, 0x84, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x17, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FD2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x08, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x78, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x80, 0x08, 0x84, 0x80, 0x19, 0x83, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0x00, 0x18, 0x84, 0x00, 0x08, 0x84, 0x00, 0x30, 0x84, 0x00, 0x18, 0x84, 0x00, 0x09, 0xFF, 0x80, 0x00, 0x14, 0x00, 0x78, 0x34, 0x00, 0x08, 0x64, 0x00, 0x08, 0xC4, 0x00, 0x09, 0x84, 0x00, 0x0B, 0x04, 0x00, 0x18, 0x1C, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FD4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x41, 0x00, 0x01, 0x22, 0x00, 0x39, 0x24, 0x00, 0x09, 0x18, 0x00, 0x09, 0x18, 0x00, 0x0A, 0x26, 0x00, 0x0A, 0x41, 0x80, 0x0C, 0x80, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FD5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x18, 0xFF, 0x00, 0x09, 0x90, 0x00, 0x33, 0x10, 0x00, 0x18, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x70, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0xD0, 0x00, 0x11, 0x4C, 0x00, 0x12, 0x46, 0x00, 0x14, 0x42, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x28, 0x03, 0x00, 0x47, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FD9, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x20, 0x00, 0x18, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x08, 0x00, 0x01, 0x08, 0x00, 0x78, 0x90, 0x00, 0x08, 0x50, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x88, 0x00, 0x09, 0x08, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FDA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0x11, 0x00, 0x01, 0x11, 0x00, 0x79, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FDB, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x10, 0x00, 0x11, 0x14, 0x00, 0x17, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x71, 0x10, 0x00, 0x11, 0x14, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x12, 0x10, 0x00, 0x28, 0x13, 0x00, 0x47, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FDC, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x21, 0xFC, 0x00, 0x18, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x78, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x92, 0x00, 0x09, 0x12, 0x00, 0x09, 0x0E, 0x00, 0x0A, 0x00, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FDD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x00, 0x48, 0x00, 0x03, 0xFC, 0x00, 0x70, 0x40, 0x00, 0x10, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x54, 0x00, 0x10, 0x48, 0x00, 0x28, 0x43, 0x00, 0x47, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FDE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x28, 0x00, 0x73, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x28, 0x23, 0x00, 0x47, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FDF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x71, 0x04, 0x00, 0x11, 0x40, 0x00, 0x11, 0x40, 0x00, 0x11, 0x20, 0x00, 0x11, 0x10, 0x00, 0x12, 0x0E, 0x00, 0x14, 0x00, 0x00, 0x28, 0x03, 0x00, 0x47, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FE0, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x30, 0x20, 0x00, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x21, 0x00, 0x08, 0x21, 0x00, 0x30, 0x63, 0x00, 0x18, 0xC2, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FE3, { 0x00, 0x00, 0x00, 0x01, 0x24, 0x00, 0x31, 0x24, 0x00, 0x19, 0x24, 0x00, 0x09, 0x24, 0x00, 0x37, 0xFF, 0x80, 0x19, 0x24, 0x00, 0x09, 0x24, 0x00, 0x01, 0x24, 0x00, 0x79, 0x24, 0x00, 0x09, 0x3C, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FE4, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x31, 0x00, 0x00, 0x19, 0xFF, 0x80, 0x0B, 0x00, 0x00, 0x36, 0x10, 0x00, 0x18, 0x93, 0x00, 0x08, 0x9D, 0x00, 0x00, 0xF1, 0x00, 0x7B, 0x91, 0x00, 0x08, 0x93, 0x00, 0x08, 0x90, 0x00, 0x08, 0x80, 0x80, 0x08, 0xC1, 0x80, 0x18, 0x7F, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x31, 0x7D, 0x00, 0x19, 0x45, 0x00, 0x09, 0x45, 0x00, 0x01, 0x45, 0x00, 0x79, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x07, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FE6, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x17, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x01, 0x29, 0x00, 0x21, 0x29, 0x00, 0x11, 0x29, 0x00, 0x01, 0x29, 0x00, 0x01, 0x29, 0x00, 0x39, 0x29, 0x00, 0x09, 0x29, 0x00, 0x0A, 0x2F, 0x00, 0x0A, 0xC9, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FE8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x40, 0x00, 0x18, 0xC2, 0x00, 0x09, 0x82, 0x00, 0x31, 0x1F, 0x00, 0x1B, 0xF1, 0x80, 0x08, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FE9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0x80, 0x00, 0x19, 0xFF, 0x80, 0x09, 0x10, 0x00, 0x03, 0x10, 0x00, 0x06, 0x10, 0x00, 0x00, 0x92, 0x00, 0x78, 0x92, 0x00, 0x08, 0x92, 0x00, 0x09, 0x93, 0x00, 0x09, 0x11, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x18, 0x70, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FEA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x11, 0x00, 0x11, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FEB, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x20, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x39, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FED, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x90, 0x00, 0x00, 0x90, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x10, 0x00, 0x12, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x38, 0x28, 0x00, 0x08, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x81, 0x80, 0x0D, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FEE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x40, 0x00, 0x18, 0x40, 0x00, 0x08, 0xFF, 0x80, 0x31, 0x90, 0x00, 0x1B, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x78, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FEF, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x31, 0x04, 0x00, 0x19, 0xE4, 0x00, 0x09, 0x24, 0x00, 0x33, 0x24, 0x00, 0x1A, 0xA4, 0x00, 0x0A, 0xA7, 0x00, 0x00, 0x65, 0x80, 0x78, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x09, 0x84, 0x00, 0x0B, 0x04, 0x00, 0x18, 0x04, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FF0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x39, 0x24, 0x00, 0x09, 0x24, 0x80, 0x09, 0x27, 0x80, 0x0A, 0x20, 0x00, 0x14, 0x20, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FF1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x80, 0x09, 0x00, 0x80, 0x31, 0x00, 0x80, 0x18, 0x40, 0x00, 0x08, 0x46, 0x00, 0x00, 0x5C, 0x00, 0x78, 0x70, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x80, 0x08, 0x61, 0x80, 0x18, 0x3F, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FF2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x38, 0x24, 0x00, 0x08, 0x42, 0x00, 0x08, 0x9F, 0x00, 0x0B, 0xE0, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFC, 0x00, 0x18, 0x08, 0x00, 0x08, 0x30, 0x00, 0x00, 0xCC, 0x00, 0x03, 0x02, 0x00, 0x78, 0x08, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x14, 0x03, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0x02, 0x00, 0x31, 0x7A, 0x00, 0x19, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x01, 0x4A, 0x00, 0x79, 0x4A, 0x00, 0x09, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x31, 0x7D, 0x00, 0x19, 0x01, 0x00, 0x09, 0x7D, 0x00, 0x01, 0x45, 0x00, 0x79, 0x45, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0x07, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FF6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x08, 0x20, 0x00, 0x30, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x01, 0xFF, 0x00, 0x7B, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x18, 0x47, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FF7, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x01, 0x24, 0x00, 0x00, 0xA8, 0x00, 0x20, 0x20, 0x00, 0x17, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x38, 0xA8, 0x00, 0x09, 0x24, 0x00, 0x0A, 0x22, 0x00, 0x0C, 0x21, 0x80, 0x0C, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FF8, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x30, 0xC6, 0x00, 0x18, 0x44, 0x00, 0x09, 0xFF, 0x00, 0x30, 0x44, 0x00, 0x18, 0x44, 0x00, 0x08, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x19, 0x84, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FF9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x24, 0x00, 0x10, 0xA5, 0x00, 0x00, 0xA5, 0x00, 0x01, 0x24, 0x80, 0x01, 0x24, 0x80, 0x3A, 0x44, 0x80, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x0B, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x18, 0x48, 0x00, 0x08, 0x48, 0x00, 0x30, 0x48, 0x00, 0x1B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x02, 0x49, 0x00, 0x7A, 0xC9, 0x00, 0x0B, 0x8F, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FFB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x7C, 0x00, 0x18, 0xC4, 0x00, 0x0B, 0x8C, 0x00, 0x30, 0x58, 0x00, 0x18, 0x30, 0x00, 0x08, 0xE4, 0x00, 0x03, 0x8F, 0x80, 0x78, 0x18, 0x80, 0x08, 0x71, 0x80, 0x08, 0x0B, 0x00, 0x08, 0x06, 0x00, 0x08, 0x1C, 0x00, 0x18, 0xF0, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x8FFD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x21, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x39, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x8FFE, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0xE9, 0x00, 0x18, 0x89, 0x00, 0x08, 0x89, 0x00, 0x31, 0xE9, 0x00, 0x19, 0x29, 0x00, 0x09, 0x29, 0x00, 0x03, 0xA9, 0x00, 0x7A, 0xE9, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC1, 0x00, 0x08, 0x81, 0x00, 0x09, 0x81, 0x00, 0x1B, 0x07, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9000, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x91, 0x00, 0x38, 0x8A, 0x00, 0x08, 0x84, 0x00, 0x08, 0xBA, 0x00, 0x0B, 0xC1, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9001, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x38, 0x00, 0x00, 0x04, 0x00, 0x00, 0x82, 0x00, 0x21, 0x01, 0x80, 0x16, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x38, 0x28, 0x00, 0x08, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9002, { 0x00, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x39, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9003, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x08, 0x49, 0x00, 0x00, 0x4A, 0x00, 0x02, 0x4C, 0x00, 0x21, 0x48, 0x00, 0x10, 0xC8, 0x00, 0x00, 0x4C, 0x00, 0x00, 0xCA, 0x00, 0x01, 0x49, 0x00, 0x3A, 0x48, 0x00, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0A, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9004, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x7E, 0x00, 0x08, 0xC2, 0x00, 0x31, 0xA4, 0x00, 0x18, 0x18, 0x00, 0x08, 0x6E, 0x00, 0x03, 0xC3, 0x80, 0x78, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x34, 0x08, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9005, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x01, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x21, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0x7E, 0x00, 0x01, 0x42, 0x00, 0x39, 0x42, 0x00, 0x09, 0x42, 0x00, 0x0A, 0x7E, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9006, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x08, 0x44, 0x00, 0x00, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x39, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x21, 0x00, 0x08, 0x40, 0x00, 0x0C, 0x80, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9008, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x20, 0x00, 0x03, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x12, 0x01, 0x00, 0x02, 0x79, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x79, 0x00, 0x3A, 0x49, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9009, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x20, 0x00, 0x19, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x02, 0x22, 0x00, 0x7B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x16, 0x00, 0x00, 0x22, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x900A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x08, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x88, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x72, 0x2C, 0x00, 0x13, 0xAA, 0x00, 0x1E, 0x4A, 0x00, 0x12, 0x49, 0x00, 0x12, 0x89, 0x00, 0x12, 0x28, 0x00, 0x16, 0x10, 0x00, 0x2A, 0x00, 0x00, 0x44, 0x03, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x900B, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x08, 0x12, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x13, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x900C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x01, 0x00, 0x09, 0x01, 0x00, 0x01, 0xF9, 0x00, 0x79, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0xF9, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x900D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x900E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x28, 0x00, 0x08, 0x28, 0x00, 0x31, 0xFF, 0x00, 0x19, 0x29, 0x00, 0x09, 0x29, 0x00, 0x01, 0x6F, 0x00, 0x79, 0xC1, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x900F, { 0x00, 0x00, 0x00, 0x10, 0x1E, 0x00, 0x09, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x20, 0x38, 0x00, 0x10, 0x54, 0x00, 0x01, 0x92, 0x00, 0x06, 0x11, 0x80, 0x01, 0xFC, 0x00, 0x38, 0x48, 0x00, 0x08, 0x9F, 0x80, 0x08, 0x80, 0x80, 0x09, 0x01, 0x00, 0x0E, 0x06, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9010, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x21, 0x00, 0x20, 0x52, 0x00, 0x11, 0x9C, 0x00, 0x06, 0x2C, 0x00, 0x00, 0xCA, 0x00, 0x03, 0x1A, 0x00, 0x38, 0x29, 0x00, 0x08, 0xC9, 0x00, 0x0B, 0x08, 0x80, 0x08, 0x70, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9011, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x08, 0x12, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x01, 0x11, 0x00, 0x00, 0x92, 0x00, 0x00, 0x54, 0x00, 0x00, 0x18, 0x00, 0x38, 0x34, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x0B, 0x11, 0x00, 0x0C, 0x30, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9012, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x21, 0x14, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x00, 0x44, 0x00, 0x07, 0xFC, 0x00, 0x74, 0x40, 0x00, 0x14, 0x44, 0x00, 0x17, 0xFE, 0x00, 0x10, 0xC4, 0x00, 0x11, 0x44, 0x00, 0x12, 0x54, 0x00, 0x14, 0x48, 0x00, 0x28, 0x40, 0x00, 0x44, 0x43, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9013, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x1E, 0x00, 0x33, 0xF0, 0x00, 0x12, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x72, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x12, 0x91, 0x00, 0x14, 0x93, 0x00, 0x30, 0x10, 0x00, 0x28, 0x00, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9014, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x28, 0x00, 0x00, 0x44, 0x00, 0x00, 0x82, 0x00, 0x23, 0x01, 0x80, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3B, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0A, 0x30, 0x80, 0x14, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9015, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x20, 0x92, 0x00, 0x11, 0x24, 0x00, 0x00, 0x92, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9016, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x24, 0x88, 0x00, 0x35, 0x08, 0x80, 0x12, 0x29, 0x80, 0x22, 0x2B, 0x00, 0x35, 0x6A, 0x00, 0x11, 0x48, 0x00, 0x01, 0x1C, 0x00, 0x73, 0x14, 0x00, 0x15, 0x14, 0x00, 0x11, 0x36, 0x00, 0x11, 0x22, 0x00, 0x11, 0x63, 0x00, 0x36, 0xC1, 0x80, 0x28, 0x00, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9017, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x38, 0x84, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9018, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x30, 0x42, 0x00, 0x18, 0xC2, 0x00, 0x08, 0x9F, 0x00, 0x33, 0xF1, 0x80, 0x18, 0x80, 0x00, 0x09, 0xFF, 0x00, 0x03, 0x10, 0x00, 0x78, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x08, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x1B, 0x83, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9019, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x901A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x00, 0x48, 0x00, 0x20, 0x30, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x13, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x901B, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x31, 0x5F, 0x00, 0x18, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x31, 0xC4, 0x00, 0x19, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x00, 0x5F, 0x00, 0x78, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x19, 0xBF, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x901D, { 0x00, 0x00, 0x00, 0x11, 0x06, 0x00, 0x09, 0x18, 0x00, 0x01, 0x10, 0x00, 0x07, 0xD0, 0x00, 0x21, 0x1F, 0x80, 0x11, 0x12, 0x00, 0x01, 0x72, 0x00, 0x01, 0x92, 0x00, 0x07, 0x12, 0x00, 0x39, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x00, 0x0B, 0x22, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x901E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x01, 0xF0, 0x00, 0x38, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x901F, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x18, 0x00, 0x08, 0x34, 0x00, 0x08, 0x52, 0x00, 0x08, 0x91, 0x00, 0x0D, 0x10, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9020, { 0x00, 0x00, 0x00, 0x10, 0x50, 0x00, 0x08, 0x50, 0x00, 0x00, 0x90, 0x00, 0x01, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x10, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x39, 0x01, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9021, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x42, 0x00, 0x00, 0x8F, 0x00, 0x23, 0xF8, 0x80, 0x10, 0x48, 0x80, 0x00, 0x8F, 0x80, 0x01, 0x20, 0x00, 0x06, 0x3F, 0x00, 0x00, 0x42, 0x00, 0x38, 0xA4, 0x00, 0x09, 0x18, 0x00, 0x0E, 0x14, 0x00, 0x08, 0x63, 0x80, 0x0D, 0x80, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9022, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x42, 0x00, 0x00, 0xA4, 0x00, 0x23, 0x18, 0x00, 0x10, 0x2C, 0x00, 0x00, 0xC3, 0x80, 0x03, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9023, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9026, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x0B, 0xDE, 0x00, 0x02, 0x52, 0x00, 0x02, 0x52, 0x00, 0x7B, 0x5A, 0x00, 0x0A, 0xD6, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0xD6, 0x00, 0x0A, 0x52, 0x00, 0x14, 0x01, 0x00, 0x23, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9027, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0xC6, 0x00, 0x19, 0x83, 0x00, 0x08, 0x10, 0x00, 0x30, 0x38, 0x00, 0x18, 0x6C, 0x00, 0x08, 0xC6, 0x00, 0x03, 0x83, 0x80, 0x78, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9028, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x30, 0x92, 0x00, 0x18, 0x92, 0x00, 0x09, 0xD7, 0x00, 0x01, 0x55, 0x00, 0x7B, 0x39, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x1B, 0x11, 0x80, 0x34, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9029, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x48, 0x00, 0x31, 0x86, 0x00, 0x1F, 0x23, 0x80, 0x08, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x78, 0xA4, 0x00, 0x08, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x19, 0x04, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x902A, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x30, 0x44, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x30, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x78, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x902C, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x30, 0xC3, 0x00, 0x18, 0x82, 0x00, 0x0B, 0xEF, 0x80, 0x30, 0x82, 0x00, 0x18, 0x82, 0x00, 0x08, 0xB2, 0x00, 0x00, 0xC2, 0x00, 0x7B, 0x8F, 0x80, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x09, 0x02, 0x00, 0x1B, 0x02, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x902D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x0A, 0x00, 0x80, 0x32, 0x00, 0x80, 0x18, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x82, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x18, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x902E, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x12, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x12, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x01, 0x12, 0x00, 0x38, 0x94, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x09, 0x92, 0x00, 0x0C, 0x31, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x902F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x30, 0x04, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x01, 0x93, 0x00, 0x78, 0xD6, 0x00, 0x08, 0x38, 0x00, 0x08, 0xDC, 0x00, 0x09, 0x96, 0x00, 0x0F, 0x13, 0x00, 0x18, 0x70, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9031, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x22, 0xFD, 0x00, 0x12, 0x11, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x02, 0x7D, 0x00, 0x3A, 0x45, 0x00, 0x0A, 0x45, 0x00, 0x0A, 0x7D, 0x00, 0x0A, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9032, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x08, 0x44, 0x00, 0x00, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x21, 0x88, 0x00, 0x11, 0x88, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x38, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x0C, 0x80, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9033, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x20, 0x00, 0x08, 0x42, 0x00, 0x30, 0xFF, 0x00, 0x1B, 0x81, 0x80, 0x08, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x79, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x19, 0x06, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9034, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x18, 0x1F, 0x80, 0x08, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x78, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9035, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x28, 0x00, 0x00, 0x48, 0x80, 0x00, 0x8F, 0x80, 0x03, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9036, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x30, 0x1C, 0x00, 0x19, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x54, 0x00, 0x08, 0xD6, 0x00, 0x03, 0x93, 0x80, 0x78, 0x20, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x09, 0xE4, 0x00, 0x08, 0x3E, 0x00, 0x19, 0xE3, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9037, { 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x31, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x01, 0xFF, 0x80, 0x79, 0x24, 0x80, 0x0B, 0x24, 0x80, 0x0E, 0x6C, 0x80, 0x08, 0xC8, 0x80, 0x09, 0x99, 0x80, 0x18, 0x37, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9038, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x40, 0x00, 0x00, 0xFC, 0x00, 0x01, 0x08, 0x00, 0x22, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x09, 0x0F, 0x80, 0x0E, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9039, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x00, 0x44, 0x00, 0x7B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x903B, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x42, 0x00, 0x70, 0x80, 0x00, 0x11, 0xFC, 0x00, 0x13, 0x04, 0x00, 0x14, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x60, 0x00, 0x13, 0x80, 0x00, 0x28, 0x03, 0x00, 0x47, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x903C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x903E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xF0, 0x00, 0x00, 0x48, 0x00, 0x01, 0x86, 0x00, 0x26, 0xFD, 0x80, 0x10, 0x00, 0x00, 0x03, 0xC9, 0x00, 0x02, 0x49, 0x00, 0x03, 0xD2, 0x00, 0x3A, 0x64, 0x00, 0x0B, 0xD2, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0xC9, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x903F, { 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x31, 0xFE, 0x00, 0x18, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x79, 0xFF, 0x80, 0x0B, 0x24, 0x80, 0x0E, 0x6C, 0x80, 0x08, 0xC8, 0x80, 0x09, 0x99, 0x80, 0x18, 0x37, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9041, { 0x00, 0x00, 0x00, 0x10, 0x0F, 0x00, 0x09, 0xF0, 0x00, 0x01, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x11, 0x10, 0x00, 0x01, 0x7F, 0x00, 0x01, 0x41, 0x00, 0x39, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0E, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9042, { 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x08, 0x04, 0x00, 0x01, 0x02, 0x00, 0x06, 0xFD, 0x80, 0x20, 0x60, 0x00, 0x10, 0x92, 0x00, 0x01, 0x3C, 0x00, 0x06, 0x48, 0x00, 0x00, 0x9C, 0x00, 0x3B, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x09, 0x88, 0x80, 0x08, 0x30, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9043, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x80, 0x18, 0x44, 0x00, 0x08, 0x38, 0x00, 0x30, 0x44, 0x00, 0x19, 0xFF, 0x80, 0x09, 0x02, 0x00, 0x01, 0x0E, 0x00, 0x79, 0x79, 0x00, 0x09, 0x03, 0x00, 0x09, 0x0E, 0x80, 0x09, 0x79, 0x80, 0x09, 0x07, 0x00, 0x1A, 0x7C, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9044, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0x11, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x30, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x00, 0x20, 0x00, 0x79, 0xFF, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x09, 0x49, 0x00, 0x19, 0x4B, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x1A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x82, 0x00, 0x02, 0x44, 0x00, 0x7A, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9047, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x39, 0x15, 0x00, 0x09, 0x1D, 0x00, 0x09, 0xE3, 0x00, 0x09, 0x01, 0x00, 0x09, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9049, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x20, 0x00, 0x18, 0x3F, 0x00, 0x08, 0x20, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x79, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x09, 0x86, 0x00, 0x1B, 0x03, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x904A, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x88, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x90, 0x00, 0x10, 0xA0, 0x00, 0x01, 0xEF, 0x00, 0x01, 0x22, 0x00, 0x01, 0x24, 0x00, 0x39, 0x3F, 0x80, 0x0A, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x904B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x10, 0x80, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x904C, { 0x00, 0x00, 0x00, 0x01, 0xE7, 0x80, 0x31, 0x24, 0x80, 0x19, 0x24, 0x80, 0x09, 0xE7, 0x80, 0x30, 0x00, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x78, 0x40, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x06, 0x00, 0x18, 0x1C, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x904D, { 0x00, 0x00, 0x00, 0x10, 0x1F, 0x00, 0x09, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x24, 0x80, 0x39, 0xFF, 0x80, 0x0B, 0x24, 0x80, 0x0B, 0x24, 0x80, 0x0D, 0x25, 0x80, 0x14, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x904E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x20, 0x92, 0x00, 0x10, 0x92, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x02, 0x7C, 0x80, 0x3A, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x7C, 0x80, 0x0A, 0x00, 0x80, 0x0A, 0x03, 0x80, 0x14, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x904F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFE, 0x00, 0x19, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x00, 0xFF, 0x00, 0x79, 0x91, 0x00, 0x0B, 0x39, 0x00, 0x09, 0x6D, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFB, 0x00, 0x18, 0x06, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9050, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xEF, 0x00, 0x02, 0x21, 0x00, 0x02, 0x21, 0x00, 0x23, 0xEF, 0x00, 0x12, 0x00, 0x00, 0x02, 0x3F, 0x00, 0x03, 0xD1, 0x00, 0x02, 0x0A, 0x00, 0x3A, 0x04, 0x00, 0x0B, 0xCA, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x60, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9051, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x20, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9052, { 0x00, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x31, 0x83, 0x00, 0x1B, 0x01, 0x80, 0x0A, 0xFE, 0x80, 0x30, 0x28, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x29, 0x00, 0x01, 0x29, 0x00, 0x79, 0x6F, 0x00, 0x09, 0xC1, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9053, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x48, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x20, 0x40, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x39, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9054, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x00, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9055, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0xFE, 0x00, 0x38, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9056, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x19, 0xFF, 0x00, 0x09, 0x45, 0x00, 0x01, 0x29, 0x00, 0x79, 0x7D, 0x00, 0x09, 0x11, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x13, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9057, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x21, 0xFE, 0x00, 0x19, 0x24, 0x00, 0x09, 0xFC, 0x00, 0x00, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x78, 0x04, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x08, 0x50, 0x00, 0x08, 0x8C, 0x00, 0x15, 0x04, 0x00, 0x22, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9058, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x30, 0x44, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x78, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x82, 0x00, 0x18, 0x86, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9059, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x40, 0x00, 0x00, 0xFE, 0x00, 0x01, 0x24, 0x00, 0x26, 0x98, 0x00, 0x10, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x08, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x0C, 0x81, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x905B, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x33, 0xDF, 0x80, 0x1A, 0x04, 0x80, 0x0A, 0x44, 0x80, 0x32, 0x64, 0x80, 0x1B, 0xA9, 0x80, 0x0A, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x79, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x905C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xE7, 0x80, 0x00, 0x3C, 0x00, 0x00, 0x45, 0x00, 0x20, 0x9A, 0x00, 0x10, 0x8C, 0x00, 0x00, 0xC5, 0x00, 0x01, 0xBF, 0x80, 0x06, 0x84, 0x80, 0x38, 0x95, 0x00, 0x08, 0x94, 0x80, 0x08, 0xA4, 0x80, 0x09, 0x84, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x905D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x01, 0x22, 0x00, 0x02, 0x21, 0x00, 0x00, 0x20, 0x00, 0x38, 0xA4, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x21, 0x00, 0x08, 0x60, 0x00, 0x14, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x905E, { 0x00, 0x00, 0x00, 0x10, 0x1F, 0x00, 0x0B, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x02, 0x3F, 0x00, 0x22, 0x20, 0x00, 0x12, 0xFF, 0x80, 0x02, 0xBD, 0x00, 0x02, 0xE1, 0x00, 0x02, 0xBF, 0x00, 0x3A, 0x80, 0x00, 0x0A, 0xBC, 0x00, 0x0C, 0xA4, 0x80, 0x09, 0x47, 0x80, 0x0C, 0x80, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9060, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x28, 0x80, 0x08, 0xC9, 0x00, 0x0F, 0x46, 0x00, 0x08, 0x7A, 0x00, 0x0D, 0xC1, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9061, { 0x00, 0x00, 0x00, 0x12, 0x20, 0x00, 0x09, 0x2F, 0x00, 0x01, 0x49, 0x00, 0x07, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x12, 0xAF, 0x00, 0x02, 0xA9, 0x00, 0x02, 0xA9, 0x00, 0x03, 0xEF, 0x00, 0x3A, 0xA9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x09, 0x13, 0x00, 0x0E, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9062, { 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x31, 0x02, 0x00, 0x19, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x31, 0x7A, 0x00, 0x18, 0x00, 0x00, 0x0F, 0xDF, 0x00, 0x00, 0xC3, 0x00, 0x7B, 0x4D, 0x00, 0x0E, 0x59, 0x00, 0x08, 0xC3, 0x00, 0x0B, 0x4D, 0x00, 0x0E, 0x59, 0x00, 0x19, 0xC7, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9063, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x15, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9065, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x31, 0xFC, 0x00, 0x18, 0x00, 0x00, 0x09, 0x21, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0xFF, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9066, { 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x31, 0x11, 0x00, 0x1B, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x79, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x18, 0x82, 0x00, 0x35, 0x01, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9067, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x31, 0xFF, 0x00, 0x18, 0x82, 0x00, 0x08, 0x44, 0x00, 0x33, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x10, 0x00, 0x34, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9068, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x21, 0x08, 0x00, 0x37, 0xC8, 0x00, 0x11, 0x1F, 0x80, 0x27, 0xD1, 0x00, 0x31, 0x09, 0x00, 0x1F, 0xEB, 0x00, 0x02, 0x0A, 0x00, 0x73, 0xCE, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x4E, 0x00, 0x12, 0x4B, 0x00, 0x34, 0xD9, 0x80, 0x28, 0x00, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9069, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x44, 0x00, 0x20, 0x28, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0x7D, 0x00, 0x09, 0x45, 0x00, 0x09, 0x7D, 0x00, 0x09, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x906C, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x30, 0x88, 0x00, 0x1B, 0xE8, 0x00, 0x08, 0x9F, 0x80, 0x33, 0xF4, 0x80, 0x1A, 0xA5, 0x00, 0x0A, 0xA4, 0x00, 0x03, 0xE4, 0x00, 0x78, 0x8E, 0x00, 0x09, 0xCA, 0x00, 0x09, 0xAA, 0x00, 0x0A, 0xAB, 0x00, 0x0C, 0x99, 0x00, 0x18, 0xB1, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x906D, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x48, 0x00, 0x03, 0xFF, 0x00, 0x22, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x39, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x19, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x14, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x906E, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x08, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x21, 0x22, 0x00, 0x11, 0xFF, 0x80, 0x01, 0x22, 0x00, 0x01, 0x22, 0x00, 0x01, 0x3E, 0x00, 0x39, 0x00, 0x00, 0x09, 0xA5, 0x00, 0x0A, 0x92, 0x80, 0x0A, 0x92, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x906F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xBF, 0x00, 0x02, 0x88, 0x00, 0x02, 0x90, 0x00, 0x23, 0xA9, 0x00, 0x12, 0xCE, 0x00, 0x02, 0x94, 0x00, 0x02, 0xA4, 0x00, 0x3B, 0xCE, 0x00, 0x0A, 0x96, 0x00, 0x0A, 0xA5, 0x00, 0x0C, 0xC5, 0x00, 0x09, 0x98, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9070, { 0x00, 0x00, 0x00, 0x00, 0xAA, 0x00, 0x30, 0xAA, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0xAA, 0x00, 0x31, 0xAA, 0x00, 0x1B, 0x3B, 0x80, 0x08, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x19, 0x13, 0x00, 0x34, 0x10, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9072, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x01, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x11, 0xEB, 0x80, 0x01, 0x08, 0x00, 0x01, 0xEB, 0x80, 0x01, 0x28, 0x00, 0x39, 0x7F, 0x00, 0x09, 0x88, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9074, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x30, 0x92, 0x00, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x30, 0x54, 0x00, 0x18, 0xD6, 0x00, 0x0B, 0x93, 0x80, 0x00, 0x90, 0x00, 0x79, 0xE2, 0x00, 0x09, 0x2F, 0x80, 0x0A, 0xAA, 0x00, 0x08, 0x6A, 0x00, 0x08, 0xDF, 0x80, 0x1B, 0x82, 0x00, 0x34, 0x02, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9075, { 0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0x08, 0x84, 0x00, 0x01, 0x02, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x03, 0x8F, 0x00, 0x03, 0xFF, 0x00, 0x3A, 0x01, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x14, 0x4C, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9076, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x30, 0x82, 0x00, 0x1B, 0xEF, 0x80, 0x08, 0x82, 0x00, 0x00, 0xE2, 0x00, 0x7B, 0x8F, 0x80, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0xC4, 0x80, 0x1B, 0x83, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9077, { 0x00, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x08, 0x48, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x23, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x07, 0xFF, 0x80, 0x00, 0xCC, 0x00, 0x07, 0x03, 0x80, 0x39, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x00, 0x80, 0x09, 0xFF, 0x80, 0x14, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9078, { 0x00, 0x00, 0x00, 0x21, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x01, 0xEF, 0x00, 0x01, 0x08, 0x00, 0x21, 0x28, 0x80, 0x11, 0xEF, 0x80, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x01, 0xFF, 0x00, 0x38, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x0C, 0x82, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9079, { 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x30, 0x44, 0x00, 0x18, 0x28, 0x00, 0x0B, 0xFF, 0x00, 0x30, 0x52, 0x00, 0x18, 0x94, 0x00, 0x09, 0x30, 0x00, 0x03, 0xFF, 0x00, 0x7A, 0x49, 0x00, 0x0A, 0x89, 0x00, 0x0B, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x79, 0x00, 0x1A, 0x03, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x907A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x39, 0xFF, 0x00, 0x09, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x09, 0xFF, 0x00, 0x0D, 0x01, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x907C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x29, 0x80, 0x11, 0xC6, 0x00, 0x06, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0E, 0x70, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x907D, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x10, 0x3E, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFF, 0x80, 0x22, 0x2E, 0x00, 0x13, 0xF0, 0x00, 0x02, 0x3F, 0x00, 0x02, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x3E, 0x72, 0x00, 0x0A, 0x9C, 0x00, 0x0B, 0x2C, 0x00, 0x0A, 0x4B, 0x80, 0x0E, 0xB0, 0x00, 0x11, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x907F, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x0B, 0xC4, 0x00, 0x02, 0x44, 0x00, 0x02, 0x7F, 0x80, 0x22, 0x51, 0x00, 0x13, 0xCA, 0x00, 0x02, 0x0A, 0x00, 0x02, 0x3F, 0x80, 0x3B, 0xC4, 0x00, 0x0A, 0x44, 0x00, 0x0A, 0x5F, 0x00, 0x0A, 0x44, 0x00, 0x0B, 0xC4, 0x00, 0x0E, 0x04, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9080, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x0B, 0xE4, 0x00, 0x02, 0x28, 0x00, 0x03, 0xEF, 0x80, 0x22, 0x31, 0x00, 0x13, 0xF1, 0x00, 0x00, 0x92, 0x00, 0x00, 0xAA, 0x00, 0x3B, 0xE4, 0x00, 0x08, 0xA4, 0x00, 0x09, 0x2A, 0x00, 0x0A, 0x29, 0x00, 0x0D, 0xD0, 0x80, 0x0C, 0x20, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9081, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x13, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x0A, 0x12, 0x80, 0x0A, 0x1F, 0x80, 0x0A, 0xE0, 0x80, 0x0E, 0x01, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9082, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x01, 0xE5, 0x00, 0x02, 0x49, 0x00, 0x24, 0x93, 0x00, 0x1B, 0xE4, 0x00, 0x02, 0xB4, 0x00, 0x03, 0xFF, 0x00, 0x02, 0xA4, 0x00, 0x3B, 0xE4, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x24, 0x00, 0x0A, 0x64, 0x00, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9083, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x48, 0x80, 0x00, 0x89, 0x00, 0x23, 0x4F, 0x00, 0x10, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x62, 0x00, 0x00, 0x94, 0x00, 0x3B, 0x28, 0x00, 0x08, 0x5C, 0x00, 0x09, 0xAA, 0x00, 0x08, 0x49, 0x80, 0x0D, 0xB0, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9084, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x03, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x3B, 0xFF, 0x00, 0x08, 0x71, 0x00, 0x08, 0xAA, 0x00, 0x09, 0x26, 0x00, 0x0E, 0x21, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9085, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x19, 0x01, 0x00, 0x09, 0x7D, 0x00, 0x31, 0x45, 0x00, 0x19, 0x7D, 0x00, 0x09, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x78, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x1B, 0xFF, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9087, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x23, 0xFF, 0x80, 0x13, 0x5A, 0x80, 0x02, 0x94, 0x80, 0x03, 0x5A, 0x80, 0x03, 0x50, 0x80, 0x3A, 0x9A, 0x80, 0x0B, 0x54, 0x80, 0x0A, 0x1A, 0x80, 0x0A, 0x11, 0x80, 0x0C, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9088, { 0x00, 0x00, 0x00, 0x21, 0x04, 0x00, 0x11, 0x44, 0x00, 0x03, 0x48, 0x00, 0x04, 0x9F, 0x00, 0x2D, 0x91, 0x00, 0x12, 0x5F, 0x00, 0x04, 0xD1, 0x00, 0x01, 0x5F, 0x00, 0x02, 0x4A, 0x00, 0x38, 0xCA, 0x00, 0x09, 0x4A, 0x00, 0x0A, 0x52, 0x80, 0x09, 0xA3, 0x80, 0x0C, 0x40, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9089, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x30, 0x82, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x03, 0xFF, 0x80, 0x7A, 0x00, 0x80, 0x0A, 0x1C, 0x80, 0x08, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x0B, 0x83, 0x80, 0x18, 0xFE, 0x00, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x908A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x52, 0x80, 0x39, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x42, 0x00, 0x15, 0x8C, 0x00, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x908B, { 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x32, 0x22, 0x00, 0x19, 0x11, 0x00, 0x09, 0xFE, 0x00, 0x31, 0x4A, 0x00, 0x19, 0x32, 0x00, 0x09, 0x4A, 0x00, 0x01, 0xFE, 0x00, 0x78, 0x00, 0x00, 0x09, 0xB2, 0x00, 0x09, 0x6A, 0x00, 0x09, 0xB2, 0x80, 0x09, 0x6A, 0x80, 0x19, 0xFA, 0x80, 0x35, 0x21, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x908C, { 0x00, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x27, 0x88, 0x00, 0x31, 0x1F, 0x80, 0x17, 0xF2, 0x80, 0x23, 0x06, 0x80, 0x35, 0xCD, 0x80, 0x19, 0x01, 0x00, 0x00, 0x77, 0x00, 0x71, 0xDC, 0x00, 0x1F, 0x07, 0x80, 0x10, 0x20, 0x00, 0x17, 0x27, 0x00, 0x10, 0xF8, 0x00, 0x33, 0xAF, 0x80, 0x2E, 0x20, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x908E, { 0x00, 0x00, 0x00, 0x01, 0xE1, 0x80, 0x23, 0x3F, 0x00, 0x36, 0xA4, 0x00, 0x11, 0x44, 0x00, 0x20, 0x89, 0x00, 0x33, 0x9A, 0x00, 0x10, 0x04, 0x00, 0x07, 0xC9, 0x00, 0x70, 0x1F, 0x80, 0x13, 0x82, 0x80, 0x10, 0x0A, 0x00, 0x17, 0xCA, 0x80, 0x14, 0x52, 0x80, 0x37, 0xC2, 0x00, 0x28, 0x00, 0x00, 0x67, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x908F, { 0x00, 0x00, 0x00, 0x20, 0x84, 0x00, 0x17, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x07, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x17, 0xFF, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x94, 0x00, 0x03, 0x3F, 0x00, 0x3F, 0xF4, 0x00, 0x11, 0x1F, 0x00, 0x15, 0x54, 0x00, 0x15, 0x5F, 0x80, 0x19, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9090, { 0x00, 0x00, 0x00, 0x03, 0xEF, 0x80, 0x30, 0x00, 0x00, 0x1B, 0xEF, 0x80, 0x0A, 0x28, 0x80, 0x32, 0xAA, 0x80, 0x18, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x49, 0x00, 0x7B, 0xFF, 0x00, 0x0A, 0x88, 0x00, 0x0A, 0xEF, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0xE8, 0x80, 0x19, 0x87, 0x80, 0x34, 0x00, 0x00, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9091, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9093, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0xA1, 0x00, 0x10, 0xA2, 0x00, 0x09, 0x22, 0x00, 0x09, 0x24, 0x00, 0x06, 0x28, 0x00, 0x02, 0x26, 0x00, 0x06, 0x21, 0x00, 0x05, 0x21, 0x00, 0x09, 0x21, 0x00, 0x08, 0xB1, 0x00, 0x10, 0xAA, 0x00, 0x20, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9095, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x10, 0x84, 0x00, 0x21, 0x08, 0x00, 0x10, 0x84, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9097, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x04, 0x10, 0x80, 0x04, 0x11, 0x80, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x13, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9098, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x04, 0x10, 0x80, 0x04, 0x11, 0x80, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x13, 0x80, 0x04, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9099, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xF2, 0x00, 0x10, 0x12, 0x00, 0x10, 0x11, 0x00, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x1F, 0xD7, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x909B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x11, 0x80, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x04, 0x12, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x07, 0xD0, 0x80, 0x7C, 0x10, 0x80, 0x00, 0x13, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x909D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x3E, 0x00, 0x1F, 0xE2, 0x00, 0x10, 0x22, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x10, 0x28, 0x00, 0x10, 0x24, 0x00, 0x10, 0x22, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x31, 0x00, 0x20, 0x2A, 0x00, 0x20, 0x24, 0x00, 0x40, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A0, { 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x01, 0x1F, 0x80, 0x11, 0x90, 0x80, 0x30, 0x91, 0x80, 0x60, 0xD1, 0x00, 0x00, 0x13, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x91, 0x00, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x18, 0x90, 0x80, 0x10, 0x93, 0x80, 0x31, 0x90, 0x00, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x10, 0x80, 0x7F, 0xD1, 0x80, 0x08, 0x11, 0x00, 0x08, 0x13, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x91, 0x00, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x18, 0x90, 0x80, 0x10, 0x93, 0x80, 0x31, 0x90, 0x00, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xEF, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x89, 0x00, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x3F, 0xF8, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x04, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x8B, 0x00, 0x10, 0x88, 0x00, 0x20, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x9F, 0x00, 0x04, 0x91, 0x00, 0x04, 0x92, 0x00, 0x04, 0x92, 0x00, 0x1F, 0xD1, 0x00, 0x04, 0x90, 0x80, 0x04, 0x90, 0x80, 0x04, 0x90, 0x80, 0x1F, 0xD0, 0x80, 0x04, 0x90, 0x80, 0x04, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x97, 0x00, 0x13, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x10, 0x80, 0x04, 0x11, 0x80, 0x04, 0x11, 0x00, 0x7F, 0xF3, 0x00, 0x44, 0x52, 0x00, 0x46, 0x91, 0x00, 0x06, 0x10, 0x80, 0x06, 0x10, 0x80, 0x06, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x12, 0x53, 0x80, 0x22, 0x90, 0x00, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x24, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x07, 0xA1, 0x00, 0x3C, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x2E, 0x00, 0x08, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x9F, 0x80, 0x3C, 0x10, 0x80, 0x04, 0x11, 0x00, 0x04, 0x12, 0x00, 0x24, 0x91, 0x00, 0x24, 0x90, 0x80, 0x24, 0x90, 0x80, 0x24, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x24, 0x90, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x53, 0x00, 0x07, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xDF, 0x80, 0x00, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x91, 0x00, 0x08, 0x92, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xF0, 0x80, 0x01, 0x90, 0x80, 0x01, 0x90, 0x80, 0x02, 0x90, 0x80, 0x02, 0x90, 0x80, 0x04, 0x90, 0x80, 0x08, 0x90, 0x80, 0x10, 0x97, 0x00, 0x21, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90AC, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0x1E, 0x00, 0x1F, 0x92, 0x00, 0x11, 0x12, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x15, 0x18, 0x00, 0x12, 0x14, 0x00, 0x10, 0x52, 0x00, 0x1F, 0xF1, 0x00, 0x00, 0x51, 0x00, 0x02, 0x51, 0x00, 0x7F, 0x5A, 0x00, 0x00, 0x54, 0x00, 0x01, 0x50, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90AE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xBE, 0x00, 0x3F, 0xE2, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA8, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xB1, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0xA4, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90AF, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xF2, 0x00, 0x08, 0x92, 0x00, 0x08, 0x91, 0x00, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x0F, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x90, 0x80, 0x08, 0x93, 0x00, 0x0F, 0x90, 0x00, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x0F, 0x80, 0x04, 0x08, 0x80, 0x08, 0x88, 0x80, 0x08, 0x49, 0x00, 0x13, 0xE8, 0x80, 0x3C, 0x28, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x1F, 0xE8, 0x80, 0x10, 0x28, 0x80, 0x10, 0x28, 0x80, 0x10, 0x28, 0x80, 0x10, 0x2B, 0x80, 0x1F, 0xE8, 0x00, 0x10, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B1, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x1F, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x1F, 0xD0, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x13, 0xD7, 0x00, 0x3C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x02, 0x10, 0x80, 0x00, 0x11, 0x80, 0x08, 0x91, 0x00, 0x08, 0x93, 0x00, 0x09, 0x12, 0x00, 0x29, 0x11, 0x00, 0x2A, 0x90, 0x80, 0x4A, 0x50, 0x80, 0x4C, 0x50, 0x80, 0x08, 0x10, 0x80, 0x14, 0x10, 0x80, 0x24, 0x53, 0x80, 0x42, 0x50, 0x00, 0x01, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x80, 0x01, 0x10, 0x80, 0x03, 0x11, 0x80, 0x02, 0x11, 0x00, 0x06, 0x13, 0x00, 0x0C, 0x12, 0x00, 0x0D, 0x11, 0x00, 0x14, 0x90, 0x80, 0x24, 0x50, 0x80, 0x44, 0x50, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x13, 0x80, 0x7F, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x04, 0x10, 0x80, 0x04, 0x11, 0x80, 0x04, 0x11, 0x00, 0x7F, 0xD3, 0x00, 0x44, 0x52, 0x00, 0x44, 0x51, 0x00, 0x4A, 0x50, 0x80, 0x4A, 0x50, 0x80, 0x51, 0x50, 0x80, 0x51, 0x50, 0x80, 0x60, 0xD0, 0x80, 0x40, 0x53, 0x80, 0x40, 0x50, 0x00, 0x41, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x04, 0x51, 0x00, 0x04, 0x51, 0x00, 0x08, 0x52, 0x00, 0x08, 0x51, 0x00, 0x10, 0x90, 0x80, 0x23, 0x10, 0x80, 0x00, 0x10, 0x80, 0x1F, 0xD0, 0x80, 0x10, 0x50, 0x80, 0x10, 0x50, 0x80, 0x10, 0x50, 0x80, 0x10, 0x57, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B6, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x1F, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x11, 0x80, 0x7A, 0xD1, 0x00, 0x0B, 0x13, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x1A, 0x50, 0x80, 0x6A, 0x50, 0x80, 0x09, 0xD3, 0x80, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B8, { 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x0F, 0x80, 0x12, 0x08, 0x80, 0x12, 0x08, 0x80, 0x12, 0x09, 0x00, 0x1F, 0xE9, 0x00, 0x12, 0x08, 0x80, 0x12, 0x08, 0x80, 0x12, 0x08, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x17, 0xA8, 0x80, 0x38, 0xA8, 0x80, 0x00, 0x6B, 0x00, 0x1F, 0x88, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90B9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x1F, 0xA2, 0x00, 0x21, 0x24, 0x00, 0x42, 0x24, 0x00, 0x3F, 0xA8, 0x00, 0x00, 0xA4, 0x00, 0x00, 0xA2, 0x00, 0x1F, 0xA1, 0x00, 0x00, 0xA1, 0x00, 0x00, 0xB1, 0x00, 0x3F, 0xAA, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90BA, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x4A, 0x64, 0x00, 0x2A, 0x64, 0x00, 0x2A, 0xA8, 0x00, 0x1A, 0xA4, 0x00, 0x1B, 0x22, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x0B, 0xF1, 0x00, 0x7C, 0x2A, 0x00, 0x20, 0x24, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90BB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x22, 0x00, 0x10, 0xE4, 0x00, 0x28, 0x64, 0x00, 0x44, 0x28, 0x00, 0x00, 0x24, 0x00, 0x3F, 0xA2, 0x00, 0x00, 0xA1, 0x00, 0x01, 0x21, 0x00, 0x0A, 0x31, 0x00, 0x04, 0x2A, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90BD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x11, 0x80, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x07, 0xD3, 0x80, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90BE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x1F, 0x80, 0x14, 0x10, 0x80, 0x1F, 0x91, 0x80, 0x24, 0x11, 0x00, 0x44, 0x13, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x0C, 0x10, 0x80, 0x0E, 0x10, 0x80, 0x15, 0x10, 0x80, 0x14, 0x90, 0x80, 0x24, 0x10, 0x80, 0x44, 0x13, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90C1, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x0F, 0x80, 0x3F, 0xE8, 0x80, 0x04, 0x08, 0x80, 0x08, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x28, 0x48, 0x80, 0x08, 0x48, 0x80, 0x0F, 0xC8, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x0F, 0xC8, 0x80, 0x08, 0x48, 0x80, 0x08, 0x4B, 0x00, 0x08, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x0E, 0x10, 0x80, 0x1B, 0x11, 0x80, 0x31, 0x91, 0x00, 0x60, 0xD3, 0x00, 0x40, 0x52, 0x00, 0x1F, 0x11, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x93, 0x80, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90C4, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x19, 0x1F, 0x80, 0x06, 0x10, 0x80, 0x0A, 0x11, 0x80, 0x11, 0x11, 0x00, 0x64, 0x93, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x08, 0x10, 0x80, 0x09, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x12, 0x10, 0x80, 0x24, 0x90, 0x80, 0x45, 0xD3, 0x80, 0x0E, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x80, 0x04, 0x10, 0x80, 0x09, 0x11, 0x80, 0x10, 0x91, 0x00, 0x23, 0xD3, 0x00, 0x3C, 0x52, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x12, 0x80, 0x07, 0xD1, 0x80, 0x7C, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90C7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x1F, 0x80, 0x10, 0x10, 0x80, 0x3F, 0xD1, 0x80, 0x20, 0x51, 0x00, 0x20, 0x53, 0x00, 0x5E, 0x52, 0x00, 0x12, 0x51, 0x00, 0x12, 0x50, 0x80, 0x1E, 0x50, 0x80, 0x12, 0x50, 0x80, 0x12, 0x50, 0x80, 0x1E, 0x52, 0x80, 0x00, 0x91, 0x80, 0x02, 0x90, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xDF, 0x80, 0x3E, 0x10, 0x80, 0x20, 0x11, 0x80, 0x20, 0x11, 0x00, 0x20, 0x13, 0x00, 0x3F, 0xD2, 0x00, 0x20, 0x11, 0x00, 0x20, 0x10, 0x80, 0x2F, 0xD0, 0x80, 0x28, 0x50, 0x80, 0x28, 0x50, 0x80, 0x28, 0x52, 0x80, 0x48, 0x51, 0x80, 0x0F, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90CA, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0F, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x00, 0x09, 0x00, 0x08, 0x8A, 0x00, 0x10, 0x49, 0x00, 0x28, 0xA8, 0x80, 0x08, 0x88, 0x80, 0x05, 0x08, 0x80, 0x05, 0x08, 0x80, 0x02, 0x08, 0x80, 0x05, 0x08, 0x80, 0x08, 0x8B, 0x00, 0x10, 0x48, 0x00, 0x20, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90CC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x78, 0x41, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90CE, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x91, 0x80, 0x20, 0x91, 0x00, 0x3F, 0x93, 0x00, 0x20, 0x92, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x90, 0x80, 0x20, 0x10, 0x80, 0x21, 0x10, 0x80, 0x21, 0x10, 0x80, 0x27, 0x90, 0x80, 0x3C, 0x93, 0x80, 0x60, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90CF, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x04, 0xA2, 0x00, 0x7F, 0xE2, 0x00, 0x04, 0x24, 0x00, 0x24, 0xA4, 0x00, 0x14, 0xA8, 0x00, 0x15, 0x24, 0x00, 0x7F, 0xE2, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x0A, 0x31, 0x00, 0x09, 0x2A, 0x00, 0x11, 0xA4, 0x00, 0x60, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x22, 0x00, 0x10, 0xA4, 0x00, 0x10, 0x24, 0x00, 0x3F, 0xE8, 0x00, 0x40, 0x24, 0x00, 0x00, 0xA2, 0x00, 0x7F, 0xE1, 0x00, 0x08, 0x21, 0x00, 0x0A, 0x31, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0xA4, 0x00, 0x10, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D1, { 0x00, 0x00, 0x00, 0x20, 0x80, 0x00, 0x11, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0xA8, 0x00, 0x7F, 0xE4, 0x00, 0x04, 0x22, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x0A, 0x31, 0x00, 0x09, 0x2A, 0x00, 0x11, 0x24, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x3F, 0x11, 0x00, 0x21, 0x11, 0x00, 0x21, 0x1F, 0x00, 0x3F, 0x00, 0x00, 0x21, 0x3F, 0x80, 0x21, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x20, 0x24, 0x80, 0x21, 0x3F, 0x80, 0x2A, 0x20, 0x00, 0x24, 0x20, 0x00, 0x22, 0x20, 0x80, 0x39, 0x20, 0x80, 0x60, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x90D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x28, 0x62, 0x00, 0x48, 0xA2, 0x00, 0x1F, 0xA4, 0x00, 0x08, 0x24, 0x00, 0x0A, 0x28, 0x00, 0x12, 0xA4, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x21, 0x00, 0x02, 0x21, 0x00, 0x03, 0xF1, 0x00, 0x7E, 0x2A, 0x00, 0x22, 0x24, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D5, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x4F, 0x80, 0x01, 0x28, 0x80, 0x01, 0x09, 0x80, 0x3F, 0xE9, 0x00, 0x21, 0x0B, 0x00, 0x21, 0x0A, 0x00, 0x3D, 0x09, 0x00, 0x25, 0x28, 0x80, 0x25, 0x28, 0x80, 0x25, 0x48, 0x80, 0x24, 0x88, 0x80, 0x2C, 0xAA, 0x80, 0x41, 0xA9, 0x80, 0x42, 0x68, 0x00, 0x04, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x19, 0x1F, 0x80, 0x06, 0x10, 0x80, 0x19, 0x11, 0x80, 0x64, 0x91, 0x00, 0x04, 0x13, 0x00, 0x7F, 0xF2, 0x00, 0x08, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x12, 0x10, 0x80, 0x1F, 0xD0, 0x80, 0x32, 0x50, 0x80, 0x52, 0x52, 0x80, 0x12, 0x51, 0x80, 0x12, 0xD0, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x20, 0x90, 0x80, 0x20, 0x91, 0x80, 0x20, 0x91, 0x00, 0x3F, 0x93, 0x00, 0x08, 0x12, 0x00, 0x10, 0x11, 0x00, 0x20, 0x10, 0x80, 0x7F, 0xD0, 0x80, 0x40, 0x50, 0x80, 0x40, 0x50, 0x80, 0x40, 0x52, 0x80, 0x40, 0x51, 0x80, 0x7F, 0xD0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90D9, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x09, 0x3F, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x23, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x26, 0x00, 0x49, 0x24, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x21, 0x00, 0x49, 0x21, 0x00, 0x49, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x49, 0x25, 0x00, 0x49, 0x23, 0x00, 0x49, 0x20, 0x00, 0x4B, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90DB, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x9F, 0x80, 0x7C, 0x90, 0x80, 0x14, 0xD1, 0x80, 0x22, 0x51, 0x00, 0x00, 0x13, 0x00, 0x3F, 0x92, 0x00, 0x01, 0x11, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x07, 0xD0, 0x80, 0x7C, 0x10, 0x80, 0x04, 0x10, 0x80, 0x04, 0x13, 0x80, 0x04, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90DC, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x1F, 0x80, 0x14, 0x10, 0x80, 0x1F, 0x91, 0x80, 0x24, 0x11, 0x00, 0x44, 0x13, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x10, 0x80, 0x00, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x92, 0x80, 0x20, 0x91, 0x80, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90DD, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x91, 0x80, 0x04, 0x11, 0x00, 0x04, 0x13, 0x00, 0x7F, 0xD2, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x10, 0x80, 0x2A, 0x90, 0x80, 0x2A, 0x50, 0x80, 0x2A, 0x50, 0x80, 0x4A, 0x52, 0x80, 0x12, 0x11, 0x80, 0x26, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90DE, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x91, 0x00, 0x10, 0x90, 0x80, 0x1F, 0x90, 0x80, 0x10, 0x10, 0x80, 0x10, 0x50, 0x80, 0x12, 0x90, 0x80, 0x11, 0x10, 0x80, 0x17, 0x97, 0x00, 0x38, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90DF, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0F, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE9, 0x80, 0x02, 0x09, 0x00, 0x12, 0x4B, 0x00, 0x12, 0x4A, 0x00, 0x2A, 0xA9, 0x00, 0x26, 0x98, 0x80, 0x43, 0x08, 0x80, 0x02, 0x08, 0x80, 0x05, 0x08, 0x80, 0x05, 0x0A, 0x80, 0x08, 0x89, 0x80, 0x10, 0x48, 0x00, 0x20, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xCF, 0x80, 0x02, 0x48, 0x80, 0x02, 0x49, 0x00, 0x3F, 0xFA, 0x00, 0x04, 0x49, 0x00, 0x04, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x08, 0x08, 0x80, 0x10, 0x08, 0x80, 0x2F, 0xC8, 0x80, 0x08, 0x48, 0x80, 0x08, 0x48, 0x80, 0x08, 0x4B, 0x00, 0x0F, 0xC8, 0x00, 0x08, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x20, 0x90, 0x80, 0x20, 0x91, 0x80, 0x3F, 0x91, 0x00, 0x00, 0x13, 0x00, 0x01, 0xD2, 0x00, 0x7F, 0x11, 0x00, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x04, 0x10, 0x80, 0x1F, 0xD3, 0x80, 0x70, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x1F, 0x80, 0x1B, 0x10, 0x80, 0x31, 0x91, 0x80, 0x64, 0xD1, 0x00, 0x0E, 0x13, 0x00, 0x1B, 0x12, 0x00, 0x31, 0x91, 0x00, 0x60, 0xD0, 0x80, 0x00, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x93, 0x80, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x20, 0x90, 0x80, 0x20, 0x91, 0x80, 0x20, 0x91, 0x00, 0x3F, 0x93, 0x00, 0x20, 0x92, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x92, 0x80, 0x11, 0x11, 0x80, 0x20, 0x90, 0x00, 0x40, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x09, 0x00, 0x00, 0x29, 0x00, 0x3D, 0xFA, 0x00, 0x25, 0x2A, 0x00, 0x25, 0x2C, 0x00, 0x25, 0x2A, 0x00, 0x35, 0xAA, 0x00, 0x2D, 0x69, 0x00, 0x25, 0x29, 0x00, 0x25, 0x2D, 0x00, 0x25, 0x2A, 0x00, 0x25, 0x28, 0x00, 0x2D, 0x68, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E7, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1F, 0xBE, 0x00, 0x11, 0x22, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x00, 0xA8, 0x00, 0x3F, 0xE4, 0x00, 0x20, 0xA2, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x24, 0xB1, 0x00, 0x24, 0xAA, 0x00, 0x0A, 0x24, 0x00, 0x09, 0x20, 0x00, 0x10, 0xA0, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90E8, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x1F, 0xD1, 0x00, 0x08, 0x92, 0x00, 0x05, 0x11, 0x00, 0x05, 0x10, 0x80, 0x3F, 0xF0, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x1F, 0xD0, 0x80, 0x10, 0x50, 0x80, 0x10, 0x50, 0x80, 0x10, 0x57, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90EB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x1F, 0x80, 0x1F, 0xD0, 0x80, 0x12, 0x51, 0x80, 0x12, 0x51, 0x00, 0x1F, 0xD3, 0x00, 0x12, 0x52, 0x00, 0x12, 0x51, 0x00, 0x1F, 0xD0, 0x80, 0x04, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x12, 0x10, 0x80, 0x7F, 0xF2, 0x80, 0x02, 0x11, 0x80, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90ED, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0F, 0x80, 0x3F, 0xE8, 0x80, 0x00, 0x09, 0x00, 0x1F, 0xCA, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x01, 0x08, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x02, 0x0B, 0x00, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x49, 0x21, 0x00, 0x29, 0x23, 0x00, 0x2A, 0x22, 0x00, 0x08, 0x26, 0x00, 0x14, 0x24, 0x00, 0x63, 0x22, 0x00, 0x00, 0x21, 0x00, 0x08, 0x21, 0x00, 0x49, 0x21, 0x00, 0x29, 0x21, 0x00, 0x2A, 0x25, 0x00, 0x08, 0x23, 0x00, 0x14, 0x20, 0x00, 0x63, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90F0, { 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x24, 0x0F, 0x80, 0x24, 0x08, 0x80, 0x25, 0xF9, 0x80, 0x3C, 0x19, 0x00, 0x24, 0x1B, 0x00, 0x25, 0x2A, 0x00, 0x24, 0xA9, 0x00, 0x3C, 0x48, 0x80, 0x24, 0x68, 0x80, 0x24, 0xA8, 0x80, 0x24, 0x98, 0x80, 0x7D, 0x1A, 0x80, 0x06, 0x09, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90F4, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x08, 0x48, 0x80, 0x08, 0x49, 0x80, 0x7F, 0xF9, 0x00, 0x08, 0x4B, 0x00, 0x1C, 0xEA, 0x00, 0x1A, 0xD9, 0x00, 0x18, 0xC8, 0x80, 0x29, 0x48, 0x80, 0x29, 0x48, 0x80, 0x4A, 0x48, 0x80, 0x08, 0x4A, 0x80, 0x08, 0x49, 0x80, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90F5, { 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x0F, 0x80, 0x02, 0x08, 0x80, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x3F, 0xE8, 0x80, 0x12, 0x48, 0x80, 0x12, 0x48, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x03, 0xEB, 0x00, 0x3C, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90F6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x11, 0x1F, 0x00, 0x1B, 0x00, 0x00, 0x0A, 0x3F, 0x80, 0x7F, 0xE4, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0x80, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x20, 0x80, 0x1F, 0x20, 0x80, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x90F7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x33, 0xEF, 0x80, 0x22, 0x28, 0x80, 0x62, 0x29, 0x80, 0x4B, 0xE9, 0x00, 0x2A, 0x2B, 0x00, 0x1A, 0x2A, 0x00, 0x13, 0xE9, 0x00, 0x32, 0x08, 0x80, 0x22, 0x08, 0x80, 0x7A, 0x48, 0x80, 0x0A, 0x48, 0x80, 0x1A, 0xE8, 0x80, 0x13, 0xAB, 0x80, 0x36, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90F8, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x08, 0x9F, 0x00, 0x05, 0x11, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x52, 0x00, 0x12, 0x54, 0x00, 0x1F, 0xD4, 0x00, 0x12, 0x52, 0x00, 0x12, 0x51, 0x00, 0x1F, 0xD1, 0x00, 0x02, 0x11, 0x00, 0x02, 0x19, 0x00, 0x3F, 0xF5, 0x00, 0x02, 0x12, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90FD, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x2F, 0x80, 0x1F, 0xE8, 0x80, 0x02, 0x48, 0x80, 0x02, 0x89, 0x00, 0x03, 0x09, 0x00, 0x3F, 0xF8, 0x80, 0x02, 0x88, 0x80, 0x04, 0x48, 0x80, 0x0F, 0xC8, 0x80, 0x18, 0x48, 0x80, 0x28, 0x48, 0x80, 0x0F, 0xC8, 0x80, 0x08, 0x4B, 0x80, 0x08, 0x48, 0x00, 0x0F, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90FE, { 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x20, 0x0F, 0x80, 0x2F, 0xC8, 0x80, 0x28, 0x49, 0x80, 0x2F, 0xC9, 0x00, 0x28, 0x4B, 0x00, 0x2F, 0xCA, 0x00, 0x21, 0x09, 0x00, 0x22, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x24, 0x88, 0x80, 0x29, 0x08, 0x80, 0x26, 0x0A, 0x80, 0x25, 0x09, 0x80, 0x28, 0x88, 0x00, 0x1F, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x90FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xEF, 0x80, 0x22, 0x28, 0x80, 0x22, 0x29, 0x80, 0x3F, 0xE9, 0x00, 0x20, 0x0B, 0x00, 0x2F, 0xCA, 0x00, 0x28, 0x49, 0x00, 0x28, 0x48, 0x80, 0x2F, 0xC8, 0x80, 0x28, 0x48, 0x80, 0x28, 0x48, 0x80, 0x2F, 0xCA, 0x80, 0x48, 0x49, 0x80, 0x08, 0x48, 0x00, 0x0F, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9100, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x1F, 0x80, 0x7F, 0xD0, 0x80, 0x11, 0x11, 0x80, 0x11, 0x11, 0x00, 0x08, 0x13, 0x00, 0x08, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x10, 0x10, 0x80, 0x10, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x50, 0x90, 0x80, 0x10, 0x92, 0x80, 0x10, 0x91, 0x80, 0x1F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9102, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x80, 0x25, 0x28, 0x80, 0x25, 0x28, 0x80, 0x3D, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x08, 0x08, 0x80, 0x0F, 0xE8, 0x80, 0x10, 0x28, 0x80, 0x00, 0x2B, 0x00, 0x00, 0x48, 0x00, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x13, 0x00, 0x7F, 0xD2, 0x00, 0x4A, 0x56, 0x00, 0x53, 0xD4, 0x00, 0x40, 0x52, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x15, 0x00, 0x04, 0x13, 0x00, 0x07, 0xD0, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCF, 0x80, 0x7C, 0x08, 0x80, 0x04, 0x09, 0x80, 0x3F, 0xC9, 0x00, 0x24, 0x4B, 0x00, 0x24, 0x4A, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x08, 0x80, 0x7F, 0xE8, 0x80, 0x44, 0x28, 0x80, 0x45, 0x28, 0x80, 0x5F, 0xAA, 0x80, 0x40, 0xA9, 0x80, 0x40, 0x28, 0x00, 0x40, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9106, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xEF, 0x80, 0x22, 0x28, 0x80, 0x02, 0x09, 0x80, 0x3F, 0xE9, 0x00, 0x02, 0x0B, 0x00, 0x1F, 0xCA, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC8, 0x80, 0x12, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x02, 0x08, 0x80, 0x7F, 0xFA, 0x80, 0x02, 0x09, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9108, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x0F, 0x80, 0x05, 0x48, 0x80, 0x28, 0x89, 0x80, 0x18, 0xA9, 0x00, 0x10, 0x4B, 0x00, 0x20, 0x2A, 0x00, 0x4F, 0x99, 0x00, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x02, 0x0A, 0x80, 0x05, 0x09, 0x80, 0x08, 0x88, 0x00, 0x30, 0x68, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x910D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x40, 0x51, 0x00, 0x5F, 0x53, 0x00, 0x51, 0x52, 0x00, 0x1F, 0x16, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x12, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x11, 0x00, 0x11, 0x15, 0x00, 0x20, 0x93, 0x00, 0x40, 0x50, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9110, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x13, 0x00, 0x09, 0x12, 0x00, 0x12, 0x16, 0x00, 0x0D, 0x14, 0x00, 0x10, 0x92, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x51, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x95, 0x00, 0x24, 0x93, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9112, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x0F, 0x80, 0x0F, 0xE8, 0x80, 0x12, 0x29, 0x00, 0x2A, 0xAA, 0x00, 0x0A, 0xA9, 0x00, 0x0F, 0xA8, 0x80, 0x0C, 0xC8, 0x80, 0x04, 0x88, 0x80, 0x0F, 0xE8, 0x80, 0x1A, 0x28, 0x80, 0x2A, 0xA8, 0x80, 0x0F, 0xA8, 0x80, 0x0A, 0xAB, 0x00, 0x04, 0x48, 0x00, 0x09, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9114, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x0F, 0x80, 0x08, 0x08, 0x80, 0x1F, 0x89, 0x80, 0x10, 0x89, 0x00, 0x10, 0x8B, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xE8, 0x80, 0x10, 0x08, 0x80, 0x1F, 0xE8, 0x80, 0x00, 0x28, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xA9, 0x80, 0x29, 0x28, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9115, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x47, 0x80, 0x11, 0xF4, 0x80, 0x11, 0x14, 0x80, 0x25, 0xF5, 0x00, 0x15, 0x14, 0x80, 0x09, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x16, 0x04, 0x80, 0x3B, 0x04, 0x80, 0x03, 0x34, 0x80, 0x05, 0xC4, 0x80, 0x05, 0x07, 0x00, 0x09, 0x14, 0x00, 0x11, 0xF4, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x20, 0x90, 0x80, 0x20, 0x91, 0x80, 0x3F, 0x91, 0x00, 0x00, 0x13, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x92, 0x80, 0x11, 0x11, 0x80, 0x20, 0x90, 0x00, 0x40, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9117, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x13, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x16, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x40, 0x51, 0x00, 0x5F, 0x51, 0x00, 0x51, 0x51, 0x00, 0x51, 0x55, 0x00, 0x5F, 0x53, 0x00, 0x40, 0x50, 0x00, 0x41, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9118, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xEF, 0x80, 0x21, 0x08, 0x80, 0x2F, 0xE9, 0x80, 0x21, 0x29, 0x00, 0x3F, 0xFB, 0x00, 0x21, 0x2A, 0x00, 0x2F, 0xE9, 0x00, 0x21, 0x08, 0x80, 0x2F, 0xE8, 0x80, 0x29, 0x28, 0x80, 0x2F, 0xE8, 0x80, 0x29, 0x2A, 0x80, 0x4F, 0xE9, 0x80, 0x09, 0x28, 0x00, 0x09, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xDF, 0x00, 0x10, 0x51, 0x00, 0x10, 0x51, 0x00, 0x1F, 0xD2, 0x00, 0x02, 0x11, 0x00, 0x3F, 0xF0, 0x80, 0x00, 0x10, 0x80, 0x1F, 0xD0, 0x80, 0x15, 0x50, 0x80, 0x17, 0x50, 0x80, 0x15, 0x50, 0x80, 0x17, 0x50, 0x80, 0x15, 0x57, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x911A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1F, 0x80, 0x7F, 0xD0, 0x80, 0x11, 0x11, 0x80, 0x00, 0x11, 0x00, 0x3F, 0x93, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x7F, 0xD0, 0x80, 0x04, 0x12, 0x80, 0x0A, 0x11, 0x80, 0x11, 0x10, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x911C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0F, 0x80, 0x3F, 0xE8, 0x80, 0x25, 0x09, 0x80, 0x25, 0x09, 0x00, 0x3F, 0xEB, 0x00, 0x25, 0x2A, 0x00, 0x25, 0x29, 0x00, 0x3F, 0xE8, 0x80, 0x28, 0x88, 0x80, 0x28, 0x88, 0x80, 0x2E, 0xE8, 0x80, 0x28, 0x8A, 0x80, 0x48, 0x89, 0x80, 0x1E, 0x88, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x911E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1F, 0x80, 0x7F, 0xD0, 0x80, 0x11, 0x11, 0x80, 0x1F, 0x11, 0x00, 0x04, 0x13, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x92, 0x80, 0x04, 0x11, 0x80, 0x07, 0xD0, 0x00, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9120, { 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x02, 0x07, 0x80, 0x7F, 0xF4, 0x80, 0x42, 0x15, 0x80, 0x5A, 0xD5, 0x00, 0x42, 0x15, 0x00, 0x5A, 0xD4, 0x80, 0x00, 0x04, 0x80, 0x1F, 0xC4, 0x80, 0x00, 0x04, 0x80, 0x7F, 0xF4, 0x80, 0x08, 0x04, 0x80, 0x0F, 0xC4, 0x80, 0x00, 0x45, 0x80, 0x04, 0xC4, 0x00, 0x03, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xCF, 0x80, 0x02, 0x08, 0x80, 0x0B, 0x89, 0x80, 0x0A, 0x09, 0x00, 0x7F, 0xEB, 0x00, 0x10, 0x0A, 0x00, 0x1F, 0x89, 0x00, 0x10, 0x08, 0x80, 0x1F, 0xE8, 0x80, 0x00, 0x28, 0x80, 0x2A, 0xA8, 0x80, 0x2A, 0xAA, 0x80, 0x28, 0x29, 0x80, 0x42, 0x48, 0x00, 0x01, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9123, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x80, 0x0A, 0x11, 0x80, 0x7F, 0xD1, 0x00, 0x00, 0x13, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x10, 0x80, 0x7F, 0xD2, 0x80, 0x04, 0x11, 0x80, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9125, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x0F, 0x80, 0x1F, 0x88, 0x80, 0x10, 0x89, 0x80, 0x1F, 0x89, 0x00, 0x10, 0x8B, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xE8, 0x80, 0x10, 0x08, 0x80, 0x1F, 0xE8, 0x80, 0x00, 0x28, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xA9, 0x80, 0x29, 0x28, 0x00, 0x40, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x2F, 0x80, 0x01, 0x48, 0x80, 0x12, 0x99, 0x00, 0x0C, 0x6A, 0x00, 0x30, 0x39, 0x00, 0x1F, 0xC8, 0x80, 0x00, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x10, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x08, 0x88, 0x80, 0x05, 0xFB, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9129, { 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x01, 0x3F, 0x00, 0x7F, 0xA1, 0x00, 0x01, 0x23, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x26, 0x00, 0x77, 0xA4, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xA1, 0x00, 0x77, 0xA1, 0x00, 0x02, 0x21, 0x00, 0x7F, 0xA1, 0x00, 0x02, 0x25, 0x00, 0x22, 0x23, 0x00, 0x12, 0x20, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x912D, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0x8F, 0x80, 0x10, 0x48, 0x80, 0x3F, 0xE8, 0x80, 0x05, 0x19, 0x00, 0x1F, 0xC8, 0x80, 0x15, 0x48, 0x80, 0x19, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x1F, 0xC8, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x05, 0x0B, 0x00, 0x08, 0x88, 0x00, 0x30, 0x68, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x912E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x63, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x4A, 0x53, 0x00, 0x4A, 0x52, 0x00, 0x7A, 0xD6, 0x00, 0x0A, 0x14, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x95, 0x00, 0x3F, 0x93, 0x00, 0x11, 0x10, 0x00, 0x20, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x912F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x80, 0x05, 0x08, 0x80, 0x3F, 0xE9, 0x80, 0x02, 0x09, 0x00, 0x1F, 0xCB, 0x00, 0x02, 0x0A, 0x00, 0x3F, 0xE9, 0x00, 0x12, 0x48, 0x80, 0x0A, 0x88, 0x80, 0x7F, 0xF8, 0x80, 0x00, 0x08, 0x80, 0x1F, 0xCA, 0x80, 0x10, 0x49, 0x80, 0x1F, 0xC8, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9130, { 0x00, 0x00, 0x00, 0x24, 0x80, 0x00, 0x15, 0x1F, 0x80, 0x04, 0x10, 0x80, 0x7F, 0xD1, 0x80, 0x15, 0x11, 0x00, 0x35, 0x93, 0x00, 0x64, 0xD2, 0x00, 0x24, 0x11, 0x00, 0x38, 0x90, 0x80, 0x2F, 0xD0, 0x80, 0x2A, 0x90, 0x80, 0x7A, 0x90, 0x80, 0x5F, 0xD0, 0x80, 0x10, 0x93, 0x80, 0x30, 0x90, 0x00, 0x60, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x9F, 0x80, 0x7C, 0x10, 0x80, 0x24, 0x91, 0x80, 0x15, 0x11, 0x00, 0x7F, 0xD3, 0x00, 0x0E, 0x12, 0x00, 0x15, 0x11, 0x00, 0x64, 0xD0, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x24, 0x90, 0x80, 0x3F, 0x92, 0x80, 0x24, 0x91, 0x80, 0x3F, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x3B, 0x92, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x24, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x24, 0x90, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x97, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9134, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x4A, 0x5F, 0x00, 0x2A, 0x91, 0x00, 0x7F, 0xD3, 0x00, 0x11, 0x12, 0x00, 0x0A, 0x16, 0x00, 0x7F, 0xD4, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x0E, 0x11, 0x00, 0x15, 0x15, 0x00, 0x24, 0x93, 0x00, 0x44, 0x50, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x80, 0x08, 0x88, 0x80, 0x10, 0x49, 0x80, 0x2F, 0xA9, 0x00, 0x40, 0x1B, 0x00, 0x3F, 0xEA, 0x00, 0x2A, 0xA9, 0x00, 0x27, 0x28, 0x80, 0x3F, 0xE8, 0x80, 0x00, 0x08, 0x80, 0x1F, 0xC8, 0x80, 0x10, 0x4A, 0x80, 0x1F, 0xC9, 0x80, 0x10, 0x48, 0x00, 0x1F, 0xC8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9137, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x1F, 0x80, 0x7F, 0xD0, 0x80, 0x4A, 0x51, 0x80, 0x7F, 0xD1, 0x00, 0x4A, 0x53, 0x00, 0x7F, 0xD2, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xD0, 0x80, 0x00, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x92, 0x80, 0x11, 0x11, 0x80, 0x0A, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9139, { 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x25, 0xEF, 0x80, 0x3C, 0x28, 0x80, 0x25, 0x49, 0x80, 0x3C, 0xC9, 0x00, 0x24, 0xCB, 0x00, 0x7D, 0x2A, 0x00, 0x06, 0x29, 0x00, 0x04, 0x88, 0x80, 0x03, 0x08, 0x80, 0x1E, 0x28, 0x80, 0x23, 0x48, 0x80, 0x42, 0x8A, 0x80, 0x12, 0x49, 0x80, 0x22, 0x28, 0x00, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x913A, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xF7, 0x80, 0x24, 0x44, 0x80, 0x3F, 0xF5, 0x80, 0x24, 0x45, 0x00, 0x27, 0xC5, 0x00, 0x20, 0x04, 0x80, 0x3F, 0xF4, 0x80, 0x21, 0x04, 0x80, 0x2F, 0xE4, 0x80, 0x29, 0x24, 0x80, 0x2F, 0xE4, 0x80, 0x29, 0x24, 0x80, 0x4F, 0xE5, 0x80, 0x04, 0x44, 0x00, 0x08, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x913C, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x3B, 0x9F, 0x80, 0x11, 0x10, 0x80, 0x7F, 0xD1, 0x80, 0x11, 0x11, 0x00, 0x6E, 0xD3, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x92, 0x80, 0x3F, 0x91, 0x80, 0x11, 0x10, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x913D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0xEF, 0x80, 0x20, 0x08, 0x80, 0x2F, 0xE9, 0x80, 0x29, 0x29, 0x00, 0x2F, 0xEB, 0x00, 0x29, 0x2A, 0x00, 0x2F, 0xE9, 0x00, 0x21, 0x08, 0x80, 0x2F, 0xE8, 0x80, 0x22, 0x88, 0x80, 0x2C, 0xE8, 0x80, 0x21, 0x0A, 0x80, 0x47, 0xC9, 0x80, 0x01, 0x08, 0x00, 0x0F, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9143, { 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x00, 0x02, 0x07, 0x80, 0x7F, 0xF4, 0x80, 0x42, 0x15, 0x80, 0x5A, 0xD5, 0x00, 0x42, 0x15, 0x00, 0x5A, 0xD4, 0x80, 0x42, 0x14, 0x80, 0x00, 0x04, 0x80, 0x77, 0x74, 0x80, 0x55, 0x54, 0x80, 0x55, 0x54, 0x80, 0x55, 0x54, 0x80, 0x55, 0x55, 0x80, 0x77, 0x74, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9146, { 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x3F, 0x9E, 0x00, 0x55, 0x52, 0x00, 0x7F, 0xD2, 0x00, 0x55, 0x54, 0x00, 0x7F, 0xD4, 0x00, 0x55, 0x58, 0x00, 0x7F, 0xD4, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x91, 0x00, 0x3F, 0xD1, 0x00, 0x20, 0x9A, 0x00, 0x3F, 0x94, 0x00, 0x11, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9147, { 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x3B, 0xDF, 0x80, 0x55, 0x10, 0x80, 0x7F, 0xD1, 0x80, 0x2A, 0x91, 0x00, 0x4C, 0xD3, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x90, 0x80, 0x3F, 0x90, 0x80, 0x20, 0x92, 0x80, 0x3F, 0x91, 0x80, 0x11, 0x10, 0x00, 0x60, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9148, { 0x00, 0x00, 0x00, 0x3D, 0xE0, 0x00, 0x00, 0x0F, 0x80, 0x3D, 0xE8, 0x80, 0x2D, 0x69, 0x80, 0x2D, 0x69, 0x00, 0x02, 0x0B, 0x00, 0x3F, 0xEA, 0x00, 0x25, 0x09, 0x00, 0x3F, 0xC8, 0x80, 0x25, 0x48, 0x80, 0x3F, 0xC8, 0x80, 0x29, 0x08, 0x80, 0x2F, 0xCA, 0x80, 0x29, 0x09, 0x80, 0x49, 0x08, 0x00, 0x1E, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x12, 0x13, 0x00, 0x1C, 0x1F, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x914A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2B, 0x84, 0x00, 0x30, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x914B, { 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x0F, 0xFE, 0x00, 0x31, 0x11, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x16, 0x1F, 0x00, 0x18, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x914C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x3F, 0x80, 0x3F, 0xC0, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x90, 0x80, 0x2B, 0x88, 0x80, 0x30, 0x80, 0x80, 0x20, 0x80, 0x80, 0x3F, 0x80, 0x80, 0x20, 0x80, 0x80, 0x20, 0x80, 0x80, 0x3F, 0x81, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x914D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x01, 0x00, 0x3F, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x31, 0xA0, 0x00, 0x20, 0xA0, 0x00, 0x20, 0xA0, 0x00, 0x3F, 0xA0, 0x00, 0x20, 0xA0, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xBF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x914E, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x3F, 0x80, 0x1F, 0xC2, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x19, 0x5A, 0x00, 0x10, 0xCA, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x914F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x48, 0x00, 0x14, 0x48, 0x00, 0x14, 0x4B, 0x00, 0x7F, 0x4D, 0x00, 0x55, 0x59, 0x00, 0x55, 0x69, 0x00, 0x55, 0xC9, 0x00, 0x67, 0x49, 0x00, 0x41, 0x49, 0x00, 0x41, 0x4B, 0x00, 0x7F, 0x48, 0x00, 0x41, 0x40, 0x00, 0x41, 0x40, 0x80, 0x7F, 0x61, 0x80, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9150, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xC4, 0x00, 0x0A, 0x3E, 0x00, 0x0A, 0x88, 0x00, 0x3F, 0xC8, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xFF, 0x00, 0x2B, 0x88, 0x00, 0x30, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9152, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x20, 0x28, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x29, 0x00, 0x01, 0x29, 0x00, 0x09, 0x4F, 0x00, 0x09, 0x81, 0x00, 0x09, 0x01, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9153, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x71, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9154, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x12, 0x00, 0x7F, 0x12, 0x00, 0x55, 0x32, 0x80, 0x55, 0x22, 0x80, 0x55, 0x61, 0x80, 0x55, 0x08, 0x00, 0x67, 0x08, 0x00, 0x41, 0x7F, 0x80, 0x41, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x41, 0x08, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9156, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x33, 0x84, 0x00, 0x20, 0x8E, 0x00, 0x20, 0x8A, 0x00, 0x3F, 0x8A, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x9A, 0x80, 0x3F, 0x92, 0x80, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x14, 0x42, 0x80, 0x14, 0x5A, 0x80, 0x7F, 0x4A, 0x80, 0x55, 0x4A, 0x80, 0x55, 0x4E, 0x80, 0x55, 0x44, 0x80, 0x67, 0x4E, 0x80, 0x41, 0x4A, 0x80, 0x41, 0x4A, 0x80, 0x7F, 0x5A, 0x80, 0x41, 0x50, 0x80, 0x41, 0x40, 0x80, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9158, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDE, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0xA3, 0x80, 0x2A, 0x80, 0x00, 0x2A, 0xBF, 0x00, 0x33, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0x9B, 0x00, 0x3F, 0x8E, 0x00, 0x20, 0x84, 0x00, 0x20, 0x8E, 0x00, 0x3F, 0x9B, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9159, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0x32, 0x00, 0x14, 0x1A, 0x00, 0x14, 0x0A, 0x00, 0x7F, 0x02, 0x00, 0x55, 0x62, 0x00, 0x55, 0x32, 0x00, 0x55, 0x12, 0x00, 0x67, 0x02, 0x00, 0x41, 0x03, 0x80, 0x41, 0x1E, 0x00, 0x7F, 0x72, 0x00, 0x41, 0x02, 0x00, 0x41, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x915A, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x7F, 0x02, 0x00, 0x14, 0x12, 0x00, 0x14, 0x33, 0x00, 0x7F, 0x21, 0x00, 0x55, 0x61, 0x80, 0x55, 0x40, 0x80, 0x55, 0x3F, 0x00, 0x67, 0x09, 0x00, 0x41, 0x09, 0x00, 0x41, 0x09, 0x00, 0x7F, 0x19, 0x00, 0x41, 0x11, 0x00, 0x41, 0x33, 0x00, 0x7F, 0x62, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x915B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3F, 0x00, 0x14, 0x00, 0x00, 0x14, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x12, 0x00, 0x67, 0x12, 0x00, 0x41, 0x12, 0x00, 0x41, 0x12, 0x00, 0x7F, 0x12, 0x00, 0x41, 0x12, 0x00, 0x41, 0x32, 0x80, 0x7F, 0x22, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x915D, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xC4, 0x00, 0x0A, 0x3E, 0x00, 0x0A, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x29, 0x88, 0x00, 0x30, 0x88, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x20, 0xA2, 0x00, 0x20, 0xFF, 0x00, 0x3F, 0x81, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x915E, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x7F, 0xC8, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x3F, 0x8A, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2B, 0x94, 0x00, 0x30, 0x94, 0x00, 0x20, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x20, 0xA2, 0x00, 0x20, 0xAA, 0x00, 0x3F, 0xC1, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9161, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0x7F, 0x80, 0x7F, 0x40, 0x80, 0x55, 0x40, 0x80, 0x55, 0x20, 0x00, 0x55, 0x23, 0x00, 0x67, 0x2E, 0x00, 0x41, 0x38, 0x00, 0x41, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x41, 0x20, 0x00, 0x41, 0x20, 0x80, 0x7F, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9162, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x3F, 0x80, 0x3F, 0xA8, 0x00, 0x2A, 0xC8, 0x00, 0x2B, 0x88, 0x00, 0x30, 0x8F, 0x80, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x8F, 0x80, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9163, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x7F, 0x80, 0x3F, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x33, 0x9E, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x92, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9164, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x67, 0x7F, 0x00, 0x41, 0x41, 0x00, 0x41, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x41, 0x00, 0x41, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9165, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x7F, 0xC7, 0x00, 0x0A, 0x3C, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x2A, 0xBF, 0x80, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x33, 0x8E, 0x00, 0x20, 0x8E, 0x00, 0x20, 0x95, 0x00, 0x3F, 0x95, 0x00, 0x20, 0xA4, 0x80, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9167, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x55, 0x02, 0x00, 0x55, 0x02, 0x00, 0x55, 0x7F, 0x80, 0x67, 0x02, 0x00, 0x41, 0x32, 0x00, 0x41, 0x1A, 0x00, 0x7F, 0x0A, 0x00, 0x41, 0x02, 0x00, 0x41, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9169, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x0A, 0x1F, 0x00, 0x0A, 0x31, 0x00, 0x0A, 0x4A, 0x00, 0x3F, 0x8C, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0xA0, 0x00, 0x33, 0xFF, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x916A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x0A, 0x1F, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x62, 0x00, 0x3F, 0x94, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x96, 0x00, 0x33, 0xA1, 0x80, 0x20, 0xC0, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x916C, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x0C, 0x24, 0x80, 0x0C, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x2D, 0x24, 0x80, 0x2D, 0xB6, 0x80, 0x2F, 0xB6, 0x80, 0x31, 0xB6, 0x80, 0x21, 0x24, 0x80, 0x21, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x21, 0x24, 0x80, 0x21, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x21, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x916D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x10, 0x00, 0x7F, 0x30, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x61, 0x00, 0x55, 0xE1, 0x00, 0x67, 0x3F, 0x00, 0x41, 0x21, 0x00, 0x41, 0x21, 0x00, 0x7F, 0x3F, 0x00, 0x41, 0x21, 0x00, 0x41, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x916E, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x57, 0x5D, 0x00, 0x61, 0x55, 0x00, 0x41, 0x55, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x5D, 0x00, 0x41, 0x41, 0x00, 0x41, 0x41, 0x00, 0x7F, 0x45, 0x00, 0x41, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x916F, { 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x7F, 0xE2, 0x00, 0x0A, 0x26, 0x00, 0x0A, 0x28, 0x00, 0x3F, 0xB1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x82, 0x00, 0x2B, 0xBF, 0x00, 0x30, 0xA2, 0x00, 0x20, 0xA2, 0x00, 0x3F, 0xBE, 0x00, 0x20, 0xA2, 0x00, 0x20, 0xA2, 0x00, 0x3F, 0xBE, 0x00, 0x20, 0xA2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9170, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x7F, 0xC8, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x3E, 0x00, 0x3F, 0xA8, 0x00, 0x2A, 0xC8, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xFF, 0x00, 0x2B, 0x94, 0x00, 0x30, 0x94, 0x00, 0x20, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x20, 0x95, 0x00, 0x20, 0xA5, 0x00, 0x3F, 0xC3, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9171, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x22, 0x7C, 0x00, 0x12, 0x44, 0x00, 0x06, 0xC8, 0x00, 0x0B, 0x30, 0x00, 0x32, 0x20, 0x00, 0x02, 0x42, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x12, 0x24, 0x00, 0x1C, 0x1C, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x2A, 0x9F, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x83, 0x00, 0x33, 0x9E, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x9F, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9173, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xC8, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x0A, 0x00, 0x3F, 0x84, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0xBF, 0x80, 0x2A, 0x80, 0x80, 0x33, 0x9F, 0x00, 0x20, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9174, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x1C, 0x00, 0x14, 0x14, 0x00, 0x14, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x55, 0xC1, 0x80, 0x55, 0x3E, 0x00, 0x55, 0x08, 0x00, 0x67, 0x08, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x2A, 0x00, 0x41, 0x2A, 0x00, 0x41, 0x6B, 0x00, 0x7F, 0xC9, 0x80, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9175, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x0C, 0x11, 0x00, 0x0C, 0xFE, 0x00, 0x0C, 0x12, 0x00, 0x3F, 0x14, 0x00, 0x2D, 0xFF, 0x80, 0x2D, 0x10, 0x00, 0x2F, 0x3E, 0x00, 0x31, 0xC4, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9176, { 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xA2, 0x00, 0x14, 0x3F, 0x00, 0x15, 0x40, 0x00, 0x7F, 0x82, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x22, 0x00, 0x57, 0x32, 0x00, 0x61, 0x2A, 0x00, 0x41, 0xFF, 0x00, 0x41, 0x42, 0x00, 0x7F, 0x52, 0x00, 0x41, 0x4A, 0x00, 0x41, 0x7E, 0x00, 0x7F, 0x02, 0x00, 0x41, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9177, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x28, 0x00, 0x0C, 0x28, 0x00, 0x0C, 0x7F, 0x00, 0x0C, 0x48, 0x00, 0x3F, 0x88, 0x00, 0x2D, 0x08, 0x00, 0x2D, 0xFF, 0x80, 0x2F, 0x08, 0x00, 0x31, 0x00, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x21, 0x41, 0x00, 0x21, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9178, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x92, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x4F, 0x80, 0x3F, 0xF4, 0x80, 0x2A, 0x94, 0x00, 0x2A, 0xA4, 0x80, 0x2A, 0xC7, 0x80, 0x33, 0x90, 0x00, 0x20, 0x9F, 0x80, 0x20, 0xA1, 0x00, 0x3F, 0xD2, 0x00, 0x20, 0x8C, 0x00, 0x20, 0x8C, 0x00, 0x3F, 0xB2, 0x00, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9179, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x7F, 0x0F, 0x00, 0x14, 0x78, 0x00, 0x14, 0x09, 0x00, 0x7F, 0x2D, 0x80, 0x55, 0x64, 0x80, 0x55, 0x40, 0x00, 0x55, 0x01, 0x00, 0x67, 0x7F, 0x80, 0x41, 0x01, 0x00, 0x41, 0x31, 0x00, 0x7F, 0x19, 0x00, 0x41, 0x09, 0x00, 0x41, 0x01, 0x00, 0x7F, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x917A, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x7F, 0x09, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x67, 0x7F, 0x00, 0x41, 0x49, 0x00, 0x41, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x49, 0x00, 0x41, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x917B, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x7F, 0x07, 0x00, 0x14, 0xFD, 0x00, 0x14, 0x29, 0x80, 0x7F, 0x6C, 0x80, 0x55, 0x44, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x00, 0x80, 0x67, 0x03, 0x00, 0x41, 0x04, 0x00, 0x41, 0x7F, 0x80, 0x7F, 0x04, 0x00, 0x41, 0x04, 0x00, 0x41, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x917D, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x14, 0x14, 0x00, 0x14, 0x55, 0x00, 0x7F, 0x36, 0x00, 0x55, 0x14, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x40, 0x00, 0x57, 0x40, 0x00, 0x61, 0x40, 0x00, 0x41, 0x40, 0x00, 0x7F, 0x40, 0x00, 0x41, 0x40, 0x00, 0x41, 0x40, 0x00, 0x7F, 0x80, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x917E, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x14, 0x00, 0x00, 0x14, 0x02, 0x00, 0x3E, 0xEF, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x36, 0xAA, 0x00, 0x22, 0xEE, 0x00, 0x22, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x22, 0xAA, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x917F, { 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x7F, 0xCA, 0x00, 0x0A, 0x3F, 0x00, 0x0A, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0xA2, 0x00, 0x2B, 0xA2, 0x00, 0x30, 0xBE, 0x00, 0x20, 0xB0, 0x00, 0x20, 0xA9, 0x00, 0x3F, 0xAA, 0x00, 0x20, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x3F, 0xB2, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9181, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x3E, 0x00, 0x14, 0x62, 0x00, 0x14, 0x46, 0x00, 0x7F, 0x7C, 0x00, 0x55, 0x04, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x67, 0x49, 0x00, 0x41, 0x6B, 0x00, 0x41, 0x2E, 0x00, 0x7F, 0x1C, 0x00, 0x41, 0x2E, 0x00, 0x41, 0x6B, 0x00, 0x7F, 0xC9, 0x80, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9182, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x14, 0x22, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x55, 0x22, 0x00, 0x55, 0x22, 0x00, 0x55, 0x77, 0x00, 0x67, 0x77, 0x00, 0x41, 0xAA, 0x80, 0x41, 0xAA, 0x80, 0x7F, 0x22, 0x00, 0x41, 0x22, 0x00, 0x41, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9183, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x7F, 0x2A, 0x00, 0x55, 0x49, 0x00, 0x55, 0xFF, 0x80, 0x55, 0xC9, 0x80, 0x67, 0x49, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x08, 0x80, 0x7F, 0x09, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9185, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x41, 0x00, 0x7F, 0x63, 0x00, 0x55, 0x22, 0x00, 0x55, 0x22, 0x00, 0x55, 0xFF, 0x80, 0x67, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x41, 0x00, 0x41, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9186, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x7F, 0x22, 0x00, 0x14, 0x3F, 0x00, 0x14, 0xF0, 0x00, 0x7F, 0x1B, 0x00, 0x55, 0x0C, 0x00, 0x55, 0x36, 0x80, 0x55, 0xC3, 0x80, 0x67, 0x24, 0x00, 0x41, 0x22, 0x00, 0x41, 0x3F, 0x00, 0x7F, 0xF0, 0x00, 0x41, 0x1B, 0x00, 0x41, 0x0C, 0x00, 0x7F, 0x36, 0x80, 0x00, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9187, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x0C, 0x00, 0x00, 0x0C, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x2D, 0x7F, 0x00, 0x2D, 0x41, 0x00, 0x2F, 0x00, 0x00, 0x31, 0x7E, 0x00, 0x21, 0x04, 0x00, 0x3F, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9189, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x7F, 0x80, 0x0A, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x2A, 0xAA, 0x80, 0x2A, 0xA4, 0x80, 0x2B, 0x80, 0x00, 0x30, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x918A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x77, 0x00, 0x14, 0x11, 0x00, 0x14, 0x55, 0x00, 0x7F, 0x22, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x00, 0x00, 0x67, 0x77, 0x00, 0x41, 0x11, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x41, 0x22, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x918B, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x0A, 0x12, 0x00, 0x0A, 0x3F, 0x00, 0x0A, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFF, 0x80, 0x33, 0x80, 0x00, 0x20, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xBF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x918C, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x42, 0x00, 0x14, 0x42, 0x00, 0x7F, 0x7E, 0x00, 0x55, 0x42, 0x00, 0x55, 0x42, 0x00, 0x55, 0x7E, 0x00, 0x57, 0x08, 0x00, 0x61, 0x48, 0x00, 0x41, 0x49, 0x00, 0x7F, 0x7A, 0x00, 0x41, 0x4C, 0x00, 0x41, 0x59, 0x00, 0x7F, 0x69, 0x00, 0x41, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x918D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x0C, 0x21, 0x00, 0x0C, 0x3F, 0x00, 0x0C, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x2D, 0x21, 0x00, 0x2D, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x4F, 0x80, 0x21, 0x48, 0x00, 0x21, 0x48, 0x00, 0x3F, 0xBF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x918E, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x7F, 0x82, 0x80, 0x14, 0x02, 0x00, 0x14, 0x7F, 0x80, 0x7F, 0x42, 0x00, 0x55, 0x7A, 0x00, 0x55, 0x42, 0x00, 0x55, 0x7A, 0x80, 0x67, 0x4A, 0x80, 0x41, 0x4B, 0x00, 0x41, 0x4B, 0x00, 0x7F, 0x7A, 0x00, 0x41, 0x46, 0x00, 0x41, 0x46, 0x80, 0x7F, 0x4B, 0x80, 0x00, 0x89, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9190, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x27, 0x80, 0x14, 0x24, 0x80, 0x14, 0x24, 0x80, 0x7F, 0xFC, 0x80, 0x55, 0x27, 0x80, 0x55, 0x24, 0x80, 0x55, 0x24, 0x80, 0x67, 0x74, 0x80, 0x41, 0x57, 0x80, 0x41, 0x54, 0x80, 0x7F, 0x54, 0x80, 0x41, 0x54, 0x80, 0x41, 0x54, 0x80, 0x7F, 0x74, 0x80, 0x00, 0x09, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x08, 0x80, 0x14, 0x4F, 0x00, 0x7F, 0x48, 0x00, 0x55, 0x68, 0x00, 0x55, 0xDF, 0x80, 0x55, 0x00, 0x00, 0x67, 0x7F, 0x00, 0x41, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x0C, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x2D, 0x28, 0x00, 0x33, 0x28, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x48, 0x00, 0x3F, 0x88, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9193, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x55, 0x08, 0x00, 0x55, 0x1C, 0x00, 0x55, 0x14, 0x80, 0x67, 0x35, 0x80, 0x41, 0x67, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x55, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9194, { 0x00, 0x00, 0x00, 0x06, 0x08, 0x00, 0x3C, 0x48, 0x80, 0x08, 0x49, 0x80, 0x7E, 0xDD, 0x00, 0x1C, 0x94, 0x00, 0x3A, 0x36, 0x00, 0x68, 0x63, 0x00, 0x09, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9195, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x00, 0x00, 0x7F, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x55, 0x21, 0x00, 0x55, 0x3F, 0x00, 0x67, 0x00, 0x00, 0x41, 0x7F, 0x80, 0x41, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x41, 0x7F, 0x80, 0x41, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7D, 0x00, 0x14, 0x12, 0x00, 0x14, 0x52, 0x80, 0x7F, 0x33, 0x00, 0x55, 0x21, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x12, 0x00, 0x67, 0x12, 0x00, 0x41, 0x12, 0x00, 0x41, 0x7F, 0x80, 0x7F, 0x12, 0x00, 0x41, 0x12, 0x00, 0x41, 0x32, 0x80, 0x7F, 0x22, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9198, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x3E, 0x00, 0x14, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x55, 0x10, 0x00, 0x55, 0x32, 0x00, 0x55, 0x27, 0x00, 0x67, 0x7D, 0x00, 0x41, 0x00, 0x00, 0x41, 0x7F, 0x00, 0x7F, 0x55, 0x00, 0x41, 0x55, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x919A, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x14, 0x29, 0x00, 0x14, 0x9A, 0x00, 0x7F, 0x5C, 0x00, 0x55, 0x08, 0x00, 0x55, 0x3F, 0x00, 0x57, 0xC8, 0x00, 0x61, 0x58, 0x00, 0x41, 0x5C, 0x00, 0x41, 0x6B, 0x00, 0x7F, 0x49, 0x00, 0x41, 0x48, 0x00, 0x41, 0x48, 0x00, 0x7F, 0xA3, 0x00, 0x41, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x919B, { 0x00, 0x00, 0x00, 0x02, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x44, 0x00, 0x7F, 0x10, 0x00, 0x55, 0x28, 0x00, 0x55, 0x47, 0x00, 0x55, 0x82, 0x00, 0x63, 0x7C, 0x00, 0x41, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x41, 0x7C, 0x00, 0x41, 0x10, 0x00, 0x7F, 0x12, 0x00, 0x41, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x919C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x10, 0x00, 0x0C, 0x7E, 0x00, 0x0C, 0x52, 0x00, 0x0C, 0x52, 0x00, 0x3F, 0x7E, 0x00, 0x2D, 0x52, 0x00, 0x2D, 0x52, 0x00, 0x37, 0x7E, 0x00, 0x21, 0x2A, 0x00, 0x21, 0x2D, 0x00, 0x3F, 0x2F, 0x80, 0x21, 0x28, 0x00, 0x21, 0x48, 0x80, 0x3F, 0x4F, 0x80, 0x21, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x919E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x3E, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x55, 0x36, 0x00, 0x55, 0x22, 0x00, 0x55, 0x3E, 0x00, 0x67, 0x00, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x41, 0x55, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91A1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x92, 0x80, 0x7F, 0x32, 0x80, 0x55, 0x62, 0x00, 0x55, 0xC3, 0x80, 0x55, 0x20, 0x00, 0x67, 0x3F, 0x80, 0x41, 0x68, 0x00, 0x41, 0xCF, 0x00, 0x7F, 0x08, 0x00, 0x41, 0x0F, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91A2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x55, 0x7F, 0x00, 0x55, 0xA1, 0x00, 0x55, 0x21, 0x00, 0x67, 0x3F, 0x00, 0x41, 0x00, 0x00, 0x41, 0x7F, 0x00, 0x7F, 0x55, 0x00, 0x41, 0x55, 0x00, 0x41, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91A3, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0x0A, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x88, 0x00, 0x3E, 0xBE, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x8A, 0x00, 0x36, 0xBE, 0x00, 0x22, 0x88, 0x00, 0x22, 0xBE, 0x00, 0x3E, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x3F, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91A4, { 0x00, 0x00, 0x00, 0x24, 0x07, 0x00, 0x35, 0xFC, 0x00, 0x14, 0x91, 0x00, 0x04, 0x4A, 0x00, 0x1F, 0xFF, 0x80, 0x74, 0x82, 0x00, 0x04, 0x46, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x1E, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91A6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x24, 0x00, 0x14, 0x3C, 0x00, 0x14, 0x42, 0x00, 0x7F, 0x94, 0x80, 0x55, 0xF7, 0x80, 0x55, 0x08, 0x00, 0x55, 0x14, 0x00, 0x67, 0x22, 0x00, 0x41, 0xC9, 0x80, 0x41, 0x10, 0x00, 0x7F, 0x64, 0x00, 0x41, 0x19, 0x00, 0x41, 0x63, 0x00, 0x7F, 0x0E, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91A8, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x00, 0x00, 0x3F, 0xAA, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xBF, 0x80, 0x33, 0x84, 0x00, 0x20, 0xBF, 0x80, 0x20, 0xA8, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xBD, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xA0, 0x80, 0x00, 0x21, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x77, 0x00, 0x14, 0x33, 0x00, 0x14, 0x55, 0x00, 0x7F, 0x33, 0x00, 0x55, 0x55, 0x00, 0x55, 0x08, 0x00, 0x55, 0x1C, 0x00, 0x67, 0x36, 0x00, 0x41, 0xE3, 0x80, 0x41, 0x08, 0x00, 0x7F, 0x32, 0x00, 0x41, 0x0C, 0x80, 0x41, 0x31, 0x00, 0x7F, 0x06, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91AB, { 0x00, 0x00, 0x00, 0x3F, 0xDE, 0x00, 0x24, 0x12, 0x00, 0x2F, 0x92, 0x80, 0x32, 0x23, 0x80, 0x3F, 0xC0, 0x00, 0x25, 0x7F, 0x00, 0x28, 0xA2, 0x00, 0x3F, 0x9C, 0x00, 0x20, 0x77, 0x80, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91AC, { 0x00, 0x00, 0x00, 0x22, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x3F, 0xA6, 0x00, 0x22, 0x5A, 0x00, 0x02, 0xE2, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x22, 0x0E, 0x00, 0x22, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x1F, 0xFF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0x3F, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91AD, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x7F, 0x55, 0x00, 0x14, 0x55, 0x00, 0x14, 0x14, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x55, 0x14, 0x00, 0x55, 0xFF, 0x80, 0x67, 0x08, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x14, 0x00, 0x41, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91AE, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3F, 0xA4, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x64, 0x00, 0x0A, 0xA4, 0x00, 0x3F, 0xBF, 0x80, 0x2A, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x33, 0xBF, 0x80, 0x20, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x00, 0x20, 0x80, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xCA, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91AF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x0C, 0x12, 0x00, 0x0C, 0x27, 0x00, 0x3F, 0xF8, 0x80, 0x2D, 0x2A, 0x00, 0x2D, 0x2A, 0x00, 0x2F, 0x4A, 0x80, 0x31, 0x8B, 0x80, 0x21, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x55, 0x00, 0x21, 0x55, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x14, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x55, 0x00, 0x55, 0x5D, 0x00, 0x55, 0x00, 0x00, 0x55, 0x3E, 0x00, 0x67, 0x22, 0x00, 0x41, 0x3E, 0x00, 0x41, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x41, 0x08, 0x00, 0x41, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFA, 0x00, 0x08, 0x14, 0x80, 0x08, 0xA3, 0x00, 0x08, 0x41, 0x80, 0x3F, 0x80, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0x2A, 0x80, 0x36, 0xEB, 0x80, 0x22, 0x90, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0xA9, 0x00, 0x22, 0x26, 0x00, 0x22, 0x26, 0x00, 0x3E, 0x29, 0x00, 0x22, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91B2, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x55, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x55, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x00, 0x00, 0x55, 0x7F, 0x80, 0x67, 0x40, 0x00, 0x41, 0x5F, 0x00, 0x41, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x41, 0x55, 0x00, 0x41, 0x56, 0x00, 0x7F, 0x9B, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91B3, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x7F, 0x94, 0x80, 0x14, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x67, 0x36, 0x00, 0x41, 0x14, 0x00, 0x41, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91B4, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3F, 0x14, 0x00, 0x0C, 0x7F, 0x00, 0x0C, 0x55, 0x00, 0x0C, 0x7F, 0x00, 0x3F, 0x55, 0x00, 0x2D, 0x7F, 0x00, 0x2D, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x14, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91B5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x0C, 0x7F, 0x80, 0x0C, 0x50, 0x00, 0x0C, 0x7F, 0x80, 0x3F, 0x50, 0x00, 0x2D, 0x5F, 0x80, 0x2D, 0x40, 0x00, 0x37, 0x7F, 0x80, 0x21, 0x49, 0x00, 0x21, 0x5E, 0x00, 0x3F, 0x57, 0x00, 0x21, 0x6B, 0x00, 0x21, 0x52, 0x80, 0x3F, 0x62, 0x80, 0x21, 0x8C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91B6, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x1C, 0x00, 0x14, 0x36, 0x00, 0x14, 0x63, 0x00, 0x7F, 0x41, 0x80, 0x55, 0x3E, 0x00, 0x55, 0x00, 0x00, 0x55, 0x77, 0x00, 0x67, 0x55, 0x00, 0x41, 0x55, 0x00, 0x41, 0x77, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x22, 0x00, 0x41, 0x22, 0x00, 0x7F, 0x77, 0x00, 0x00, 0xD5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91B8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x12, 0x00, 0x7F, 0x61, 0x80, 0x55, 0x12, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x12, 0x00, 0x67, 0x3F, 0x00, 0x41, 0x12, 0x00, 0x41, 0x7F, 0x80, 0x7F, 0x12, 0x00, 0x41, 0x32, 0x80, 0x41, 0x63, 0x00, 0x7F, 0x39, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91BA, { 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7F, 0x7C, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x6B, 0x00, 0x55, 0x5D, 0x00, 0x67, 0x49, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x41, 0xFF, 0x80, 0x7F, 0x55, 0x00, 0x00, 0x54, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91BB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x14, 0x3E, 0x00, 0x7F, 0x00, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x00, 0x80, 0x55, 0x3E, 0x80, 0x67, 0x08, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x7F, 0x80, 0x41, 0x01, 0x00, 0x41, 0x7F, 0x80, 0x7F, 0x55, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91BC, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x55, 0x41, 0x00, 0x55, 0x5D, 0x80, 0x55, 0xD5, 0x00, 0x67, 0x55, 0x00, 0x41, 0x55, 0x00, 0x41, 0x5D, 0x00, 0x7F, 0xC1, 0x80, 0x41, 0x00, 0x00, 0x41, 0x55, 0x00, 0x7F, 0xD5, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xBF, 0x80, 0x0A, 0x04, 0x00, 0x0A, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x2A, 0xB6, 0x80, 0x2A, 0xA4, 0x00, 0x2A, 0x92, 0x00, 0x33, 0x80, 0x00, 0x20, 0xBF, 0x80, 0x20, 0xAA, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xAA, 0x80, 0x20, 0xAA, 0x80, 0x3F, 0xAA, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91BF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x51, 0x00, 0x14, 0x7B, 0x80, 0x7F, 0x51, 0x00, 0x55, 0x7B, 0x80, 0x55, 0x55, 0x00, 0x55, 0x51, 0x00, 0x67, 0x48, 0x00, 0x41, 0x52, 0x00, 0x41, 0x54, 0x00, 0x7F, 0x49, 0x00, 0x41, 0x7E, 0x80, 0x41, 0x84, 0x00, 0x7F, 0x15, 0x00, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91C0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0xE7, 0x00, 0x08, 0xA5, 0x00, 0x3E, 0xE7, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0xFF, 0x00, 0x36, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x69, 0x00, 0x23, 0xC6, 0x00, 0x3E, 0x7A, 0x00, 0x23, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91C1, { 0x00, 0x00, 0x00, 0x3B, 0xF7, 0x00, 0x22, 0x11, 0x00, 0x3B, 0xD7, 0x00, 0x22, 0x51, 0x00, 0x7F, 0xFF, 0x80, 0x41, 0x20, 0x80, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1C, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x71, 0x0B, 0x80, 0x07, 0x08, 0x00, 0x1C, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91C2, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x7E, 0xFF, 0x00, 0x14, 0x52, 0x00, 0x14, 0x89, 0x00, 0x7F, 0x7F, 0x00, 0x55, 0x55, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x00, 0x00, 0x67, 0x71, 0x00, 0x41, 0x57, 0x80, 0x41, 0x71, 0x00, 0x7F, 0x55, 0x00, 0x41, 0x75, 0x00, 0x41, 0x41, 0x00, 0x7F, 0x71, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x77, 0x80, 0x14, 0x00, 0x00, 0x14, 0x77, 0x80, 0x7F, 0x54, 0x80, 0x55, 0x08, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x54, 0x00, 0x67, 0x7F, 0x80, 0x41, 0x54, 0x80, 0x41, 0x7F, 0x80, 0x7F, 0x52, 0x00, 0x41, 0x5B, 0x80, 0x41, 0x92, 0x00, 0x7F, 0x1A, 0x80, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91C5, { 0x00, 0x00, 0x00, 0x00, 0xF7, 0x80, 0x7E, 0x94, 0x80, 0x14, 0xF7, 0x80, 0x14, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x55, 0x7A, 0x00, 0x55, 0x22, 0x00, 0x67, 0xFB, 0x80, 0x41, 0x4E, 0x80, 0x41, 0x7A, 0x80, 0x7F, 0x4B, 0x80, 0x41, 0x79, 0x00, 0x41, 0x4B, 0x80, 0x7F, 0x7A, 0x80, 0x02, 0xCA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91C6, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x7C, 0x00, 0x3F, 0xC0, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x06, 0x98, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x30, 0x83, 0x00, 0x60, 0x81, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91C7, { 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x21, 0x00, 0x08, 0x10, 0x80, 0x10, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91C8, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x78, 0x41, 0x00, 0x08, 0x41, 0x00, 0x49, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x48, 0x00, 0x08, 0x48, 0x00, 0x18, 0x48, 0x00, 0x1C, 0x4C, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x46, 0x00, 0x48, 0xC2, 0x00, 0x08, 0x83, 0x00, 0x09, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91C9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x14, 0x88, 0x00, 0x15, 0x08, 0x00, 0x15, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x0D, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x14, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91CA, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x1C, 0x10, 0x00, 0x08, 0x28, 0x00, 0x7F, 0x47, 0x00, 0x09, 0x92, 0x00, 0x18, 0x10, 0x00, 0x1C, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x28, 0x12, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91CB, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x55, 0x00, 0x25, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x88, 0x00, 0x04, 0xFF, 0x80, 0x0E, 0x22, 0x00, 0x0D, 0x14, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91CD, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x81, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x8C, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x85, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x38, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91CF, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91D0, { 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x1C, 0x1F, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xD4, 0x00, 0x0E, 0x8C, 0x00, 0x15, 0x13, 0x80, 0x24, 0xA0, 0x00, 0x1F, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91D1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91D3, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x0B, 0x20, 0x00, 0x19, 0xA0, 0x00, 0x10, 0xA0, 0x00, 0x3F, 0x20, 0x00, 0x64, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0x20, 0x00, 0x25, 0x20, 0x00, 0x35, 0x20, 0x00, 0x14, 0x20, 0x00, 0x07, 0xA0, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91D4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x00, 0x0B, 0x02, 0x00, 0x19, 0x86, 0x00, 0x10, 0x04, 0x00, 0x3F, 0x0C, 0x00, 0x64, 0x08, 0x00, 0x04, 0x18, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x10, 0x00, 0x25, 0x30, 0x00, 0x35, 0x20, 0x00, 0x14, 0x20, 0x00, 0x07, 0xA0, 0x80, 0x1C, 0x31, 0x80, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91D6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x80, 0x0B, 0x08, 0x80, 0x19, 0x88, 0x80, 0x10, 0x08, 0x80, 0x3F, 0x08, 0x80, 0x64, 0x08, 0x80, 0x04, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x18, 0x80, 0x25, 0x10, 0x80, 0x35, 0x10, 0x80, 0x14, 0x31, 0x80, 0x07, 0xA1, 0x00, 0x1C, 0x61, 0x00, 0x70, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91D7, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0A, 0x11, 0x00, 0x11, 0x11, 0x00, 0x20, 0x11, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x91, 0x00, 0x25, 0x11, 0x00, 0x15, 0x11, 0x00, 0x14, 0x11, 0x00, 0x07, 0xC1, 0x00, 0x38, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91D8, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x20, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x24, 0x88, 0x00, 0x25, 0x08, 0x00, 0x15, 0x08, 0x00, 0x14, 0x08, 0x00, 0x07, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91D9, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x0B, 0x10, 0x00, 0x19, 0x90, 0x00, 0x10, 0x90, 0x00, 0x3F, 0x18, 0x00, 0x64, 0x1C, 0x00, 0x04, 0x16, 0x00, 0x3F, 0x93, 0x00, 0x04, 0x11, 0x80, 0x25, 0x10, 0x00, 0x35, 0x10, 0x00, 0x14, 0x10, 0x00, 0x07, 0x90, 0x00, 0x1C, 0x10, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91DA, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x0B, 0x10, 0x00, 0x19, 0x90, 0x00, 0x10, 0x7E, 0x00, 0x3F, 0x12, 0x00, 0x64, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x25, 0x32, 0x00, 0x35, 0x22, 0x00, 0x14, 0x22, 0x00, 0x07, 0x62, 0x80, 0x1C, 0x42, 0x80, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91DB, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x7F, 0x80, 0x3F, 0x08, 0x80, 0x64, 0x08, 0x80, 0x04, 0x08, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x18, 0x80, 0x25, 0x10, 0x80, 0x35, 0x10, 0x80, 0x14, 0x31, 0x80, 0x07, 0xA1, 0x00, 0x1C, 0x61, 0x00, 0x70, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91DC, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x32, 0x05, 0x80, 0x05, 0x08, 0x00, 0x00, 0x90, 0x00, 0x00, 0x60, 0x00, 0x03, 0x98, 0x00, 0x3C, 0x07, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91DD, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x25, 0x04, 0x00, 0x15, 0x04, 0x00, 0x15, 0x04, 0x00, 0x07, 0x84, 0x00, 0x3C, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91DE, { 0x00, 0x00, 0x00, 0x04, 0x38, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x14, 0x00, 0x25, 0x14, 0x00, 0x35, 0x14, 0x00, 0x14, 0x36, 0x00, 0x07, 0xA2, 0x00, 0x1C, 0x63, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91DF, { 0x00, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x1C, 0x04, 0x00, 0x16, 0x04, 0x00, 0x32, 0x24, 0x00, 0x20, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x66, 0x00, 0x4A, 0x42, 0x00, 0x6A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x0E, 0xC3, 0x00, 0x38, 0x81, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91E1, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x8C, 0x00, 0x39, 0xC7, 0x00, 0x03, 0x60, 0x00, 0x06, 0x38, 0x00, 0x1C, 0x0E, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x84, 0x00, 0x0C, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91E3, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x11, 0x10, 0x00, 0x20, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0x40, 0x80, 0x04, 0x40, 0x80, 0x04, 0x80, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x08, 0x80, 0x25, 0x04, 0x80, 0x15, 0x00, 0x80, 0x14, 0x00, 0x80, 0x07, 0x80, 0x80, 0x38, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91E4, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0E, 0x06, 0x00, 0x0B, 0x0C, 0x00, 0x19, 0x98, 0x00, 0x10, 0x31, 0x00, 0x3F, 0x03, 0x00, 0x64, 0x06, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0x98, 0x00, 0x04, 0x30, 0x80, 0x25, 0x01, 0x80, 0x35, 0x03, 0x00, 0x14, 0x06, 0x00, 0x07, 0x8C, 0x00, 0x1C, 0x18, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91E5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x7F, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x4A, 0xC9, 0x80, 0x6A, 0x88, 0x80, 0x28, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91E6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x3F, 0x80, 0x19, 0xA0, 0x80, 0x10, 0x20, 0x80, 0x3F, 0x20, 0x80, 0x64, 0x20, 0x80, 0x04, 0x20, 0x80, 0x7F, 0xA0, 0x80, 0x04, 0x20, 0x80, 0x25, 0x20, 0x80, 0x35, 0x20, 0x80, 0x14, 0x20, 0x80, 0x07, 0xA0, 0x80, 0x1C, 0x3F, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91E7, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x14, 0x49, 0x00, 0x22, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x28, 0x49, 0x00, 0x0F, 0x49, 0x00, 0x38, 0x49, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91E9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3E, 0x00, 0x0B, 0x22, 0x00, 0x19, 0xA2, 0x00, 0x10, 0x22, 0x00, 0x3F, 0x2A, 0x00, 0x64, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x22, 0x00, 0x25, 0x22, 0x00, 0x35, 0x22, 0x00, 0x14, 0x22, 0x00, 0x07, 0x62, 0x80, 0x1C, 0x42, 0x80, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91EA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x00, 0x22, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91EC, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x80, 0x0B, 0x04, 0x00, 0x19, 0x84, 0x00, 0x10, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x64, 0x04, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x25, 0x04, 0x00, 0x35, 0x04, 0x00, 0x14, 0x04, 0x00, 0x07, 0x84, 0x00, 0x1C, 0x04, 0x00, 0x70, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91ED, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x7F, 0x00, 0x19, 0x88, 0x00, 0x10, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x25, 0x08, 0x00, 0x35, 0x08, 0x00, 0x14, 0x08, 0x00, 0x07, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91EE, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x19, 0x82, 0x00, 0x10, 0x7F, 0x80, 0x3F, 0x0A, 0x00, 0x64, 0x0A, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x9A, 0x00, 0x04, 0x12, 0x00, 0x25, 0x12, 0x00, 0x35, 0x32, 0x00, 0x14, 0x62, 0x00, 0x07, 0x02, 0x00, 0x1C, 0x02, 0x00, 0x70, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91EF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x20, 0x7F, 0x80, 0x7E, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x08, 0x40, 0x00, 0x4A, 0x40, 0x00, 0x6A, 0x40, 0x00, 0x28, 0x40, 0x00, 0x0E, 0x60, 0x00, 0x38, 0x3F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91F0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x0B, 0x09, 0x00, 0x19, 0x89, 0x00, 0x10, 0x29, 0x00, 0x3F, 0x29, 0x00, 0x64, 0x29, 0x00, 0x04, 0x69, 0x00, 0x3F, 0x49, 0x00, 0x04, 0x09, 0x00, 0x25, 0x19, 0x00, 0x35, 0x11, 0x00, 0x14, 0x11, 0x00, 0x07, 0xB3, 0x00, 0x1C, 0x62, 0x00, 0x70, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91F1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x7F, 0x80, 0x3F, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x1C, 0x00, 0x25, 0x14, 0x00, 0x35, 0x14, 0x00, 0x14, 0x36, 0x00, 0x07, 0xA2, 0x00, 0x1C, 0x63, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91F5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x18, 0x00, 0x28, 0x28, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x82, 0x00, 0x01, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91F6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x48, 0x00, 0x16, 0x48, 0x00, 0x33, 0x4B, 0x00, 0x20, 0x4D, 0x00, 0x7E, 0x59, 0x00, 0x08, 0x69, 0x00, 0x08, 0xC9, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x4B, 0x00, 0x6A, 0x48, 0x00, 0x28, 0x40, 0x00, 0x0E, 0x40, 0x80, 0x38, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91F7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x64, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x25, 0x08, 0x00, 0x35, 0x08, 0x00, 0x14, 0x08, 0x00, 0x07, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91F9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x7F, 0x80, 0x3F, 0x11, 0x00, 0x64, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xB3, 0x00, 0x04, 0x22, 0x00, 0x25, 0x22, 0x00, 0x35, 0x7E, 0x00, 0x14, 0x07, 0x00, 0x07, 0x8D, 0x80, 0x1C, 0x18, 0x80, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91FB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x0B, 0x10, 0x00, 0x19, 0x90, 0x00, 0x10, 0x7E, 0x00, 0x3F, 0x12, 0x00, 0x64, 0x12, 0x00, 0x04, 0x52, 0x00, 0x3F, 0xB2, 0x00, 0x04, 0x12, 0x00, 0x25, 0x1A, 0x00, 0x35, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x07, 0x62, 0x80, 0x1C, 0x42, 0x80, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91FC, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x0B, 0x09, 0x00, 0x19, 0x89, 0x00, 0x10, 0x09, 0x00, 0x3F, 0x09, 0x00, 0x64, 0x29, 0x00, 0x04, 0x19, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0D, 0x00, 0x25, 0x1B, 0x00, 0x35, 0x11, 0x80, 0x14, 0x11, 0x00, 0x07, 0xB3, 0x00, 0x1C, 0x62, 0x00, 0x70, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x91FD, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x1C, 0x1C, 0x00, 0x16, 0x74, 0x00, 0x32, 0x44, 0x00, 0x20, 0x54, 0x00, 0x7E, 0x54, 0x00, 0x08, 0x54, 0x00, 0x08, 0x54, 0x00, 0x7E, 0x54, 0x00, 0x08, 0x56, 0x00, 0x4A, 0x52, 0x00, 0x6A, 0x52, 0x00, 0x28, 0x52, 0x00, 0x0E, 0xD3, 0x00, 0x38, 0x91, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x91FF, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0E, 0x0E, 0x00, 0x0B, 0x38, 0x00, 0x19, 0xA0, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x3F, 0x80, 0x64, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x25, 0x22, 0x00, 0x35, 0x22, 0x00, 0x14, 0x62, 0x00, 0x07, 0x42, 0x00, 0x1C, 0xC2, 0x00, 0x70, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9200, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x33, 0x49, 0x00, 0x20, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x4A, 0x40, 0x00, 0x6A, 0x40, 0x00, 0x28, 0x40, 0x80, 0x0F, 0x61, 0x80, 0x38, 0x3F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9201, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x7F, 0x80, 0x10, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x64, 0x10, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x25, 0x11, 0x00, 0x35, 0x31, 0x00, 0x14, 0x23, 0x00, 0x07, 0xA2, 0x00, 0x1C, 0x62, 0x00, 0x70, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9204, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x0B, 0x32, 0x00, 0x19, 0x9A, 0x00, 0x10, 0x0A, 0x00, 0x3F, 0x02, 0x00, 0x64, 0x32, 0x00, 0x04, 0x1A, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x02, 0x00, 0x25, 0x03, 0x80, 0x35, 0x1E, 0x00, 0x14, 0x72, 0x00, 0x07, 0x02, 0x00, 0x1C, 0x02, 0x00, 0x70, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9205, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x1F, 0x00, 0x0B, 0x11, 0x00, 0x19, 0x91, 0x00, 0x10, 0x11, 0x00, 0x3F, 0x1F, 0x00, 0x64, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x1F, 0x00, 0x25, 0x11, 0x00, 0x35, 0x11, 0x00, 0x14, 0x11, 0x00, 0x07, 0xB1, 0x00, 0x1C, 0x21, 0x00, 0x70, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9206, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x0E, 0x00, 0x0B, 0x02, 0x00, 0x19, 0x92, 0x00, 0x10, 0x13, 0x00, 0x3F, 0x31, 0x00, 0x64, 0x21, 0x00, 0x04, 0x61, 0x80, 0x3F, 0x00, 0x00, 0x04, 0x10, 0x00, 0x25, 0x12, 0x00, 0x35, 0x12, 0x00, 0x14, 0x33, 0x00, 0x07, 0xA1, 0x00, 0x1C, 0x27, 0x00, 0x70, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9207, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x4A, 0x1C, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x36, 0x00, 0x0F, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9209, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x5D, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x55, 0x00, 0x4A, 0x63, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x920A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x0C, 0x00, 0x16, 0x04, 0x00, 0x33, 0x04, 0x00, 0x20, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x11, 0x00, 0x7E, 0x51, 0x80, 0x08, 0x50, 0x80, 0x4A, 0x50, 0x80, 0x6A, 0xD0, 0x00, 0x28, 0x91, 0x00, 0x0E, 0x11, 0x00, 0x38, 0x19, 0x00, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x920C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x7F, 0x00, 0x10, 0x09, 0x00, 0x3F, 0x09, 0x00, 0x64, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x7F, 0x80, 0x04, 0x14, 0x00, 0x25, 0x14, 0x00, 0x35, 0x14, 0x00, 0x14, 0x36, 0x00, 0x07, 0x22, 0x00, 0x1C, 0x63, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x920D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x1F, 0x00, 0x00, 0xF0, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x28, 0x10, 0x00, 0x0E, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x920E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x20, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x7E, 0xC1, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x7F, 0x69, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x7D, 0x00, 0x6A, 0xC5, 0x00, 0x28, 0x01, 0x00, 0x0E, 0x03, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9210, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x20, 0x41, 0x00, 0x00, 0x80, 0x80, 0x1F, 0x3E, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x7F, 0x00, 0x25, 0x01, 0x00, 0x15, 0x01, 0x00, 0x14, 0x02, 0x00, 0x07, 0x82, 0x00, 0x38, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9211, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x22, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xC2, 0x00, 0x3E, 0xA2, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0x94, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x94, 0x00, 0x0F, 0x22, 0x00, 0x31, 0x41, 0x00, 0x02, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9212, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x7E, 0x00, 0x11, 0x22, 0x00, 0x20, 0x22, 0x00, 0x1F, 0x24, 0x00, 0x04, 0x24, 0x00, 0x04, 0x2F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x51, 0x00, 0x05, 0x52, 0x00, 0x25, 0x4A, 0x00, 0x15, 0x44, 0x00, 0x14, 0x44, 0x00, 0x07, 0x8A, 0x00, 0x3C, 0x91, 0x00, 0x01, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9213, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x38, 0x7F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9214, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0xAA, 0x00, 0x10, 0x2A, 0x00, 0x3F, 0x2B, 0x00, 0x64, 0x69, 0x80, 0x04, 0x48, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x25, 0x3B, 0x00, 0x35, 0x02, 0x00, 0x14, 0x06, 0x00, 0x07, 0x8C, 0x00, 0x1C, 0x18, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9215, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFE, 0x00, 0x16, 0x22, 0x00, 0x33, 0x22, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x28, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9216, { 0x00, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x1C, 0x04, 0x00, 0x16, 0x24, 0x00, 0x32, 0x66, 0x00, 0x20, 0x42, 0x00, 0x7E, 0xC3, 0x00, 0x09, 0x81, 0x80, 0x08, 0x7E, 0x00, 0x7E, 0x12, 0x00, 0x08, 0x12, 0x00, 0x4A, 0x12, 0x00, 0x6A, 0x32, 0x00, 0x28, 0x22, 0x00, 0x0E, 0x66, 0x00, 0x38, 0xC4, 0x00, 0x61, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9217, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x20, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x81, 0x00, 0x09, 0x1F, 0x00, 0x0B, 0xE4, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x08, 0x84, 0x80, 0x0E, 0x84, 0x80, 0x31, 0x07, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9218, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x63, 0x00, 0x08, 0x36, 0x00, 0x4A, 0x1C, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x0E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x921C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x10, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x34, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x2C, 0x00, 0x4A, 0x68, 0x00, 0x6A, 0x49, 0x00, 0x28, 0xD9, 0x00, 0x0E, 0x11, 0x00, 0x38, 0x3F, 0x80, 0x60, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x921D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x28, 0x00, 0x16, 0x28, 0x00, 0x33, 0x28, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x88, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x921E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x14, 0x20, 0x00, 0x22, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x09, 0x01, 0x00, 0x3E, 0x79, 0x00, 0x08, 0x01, 0x00, 0x2A, 0x01, 0x00, 0x2A, 0xFD, 0x00, 0x2A, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0x01, 0x00, 0x30, 0x02, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9223, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x32, 0x08, 0x00, 0x20, 0x48, 0x00, 0x7E, 0x4F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x01, 0x00, 0x4A, 0x01, 0x00, 0x6A, 0x01, 0x00, 0x28, 0x01, 0x00, 0x0E, 0x03, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9224, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x00, 0x0B, 0x21, 0x00, 0x19, 0xA1, 0x00, 0x10, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x64, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x25, 0x21, 0x00, 0x35, 0x21, 0x00, 0x14, 0x21, 0x00, 0x07, 0xA1, 0x00, 0x1C, 0x3F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9225, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x80, 0x32, 0x48, 0x80, 0x20, 0x49, 0x80, 0x7E, 0x49, 0x00, 0x08, 0xC9, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x1C, 0x00, 0x08, 0x14, 0x00, 0x4A, 0x14, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x36, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9226, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x7F, 0x80, 0x3F, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x14, 0x00, 0x25, 0x14, 0x00, 0x35, 0x36, 0x00, 0x14, 0x22, 0x00, 0x07, 0xB2, 0x00, 0x1C, 0x6B, 0x00, 0x70, 0xC9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9228, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x00, 0x0B, 0x00, 0x00, 0x19, 0x80, 0x00, 0x10, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x64, 0x7F, 0x80, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x25, 0x12, 0x00, 0x35, 0x12, 0x00, 0x14, 0x12, 0x00, 0x07, 0xB2, 0x80, 0x1C, 0x22, 0x80, 0x70, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9229, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x80, 0x0B, 0x00, 0x00, 0x19, 0x80, 0x00, 0x10, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x64, 0x21, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x20, 0x00, 0x25, 0x20, 0x00, 0x35, 0x20, 0x00, 0x14, 0x20, 0x00, 0x07, 0x60, 0x00, 0x1C, 0x40, 0x00, 0x70, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x922C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x4A, 0x44, 0x00, 0x6A, 0x46, 0x00, 0x28, 0x42, 0x00, 0x0E, 0xC2, 0x00, 0x38, 0x83, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x922E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x53, 0x00, 0x08, 0x56, 0x00, 0x4A, 0x5C, 0x00, 0x6A, 0x50, 0x00, 0x28, 0xD0, 0x00, 0x0E, 0x90, 0x80, 0x39, 0x99, 0x80, 0x60, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x922F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x49, 0x00, 0x19, 0x49, 0x00, 0x10, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x64, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x04, 0x08, 0x00, 0x25, 0x49, 0x00, 0x35, 0x49, 0x00, 0x14, 0x49, 0x00, 0x07, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9230, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x4B, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9233, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x02, 0x00, 0x32, 0x02, 0x00, 0x20, 0x7A, 0x00, 0x7E, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x7E, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x4A, 0x7A, 0x00, 0x6A, 0x02, 0x00, 0x28, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9234, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x14, 0x00, 0x22, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x28, 0x21, 0x00, 0x0E, 0x26, 0x00, 0x30, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9235, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x5D, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x55, 0x00, 0x4A, 0x63, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9236, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x32, 0x00, 0x33, 0x23, 0x00, 0x20, 0x61, 0x00, 0x7E, 0x4F, 0x80, 0x08, 0xF8, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9237, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0x08, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9238, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x1C, 0x13, 0x00, 0x16, 0x11, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x11, 0x00, 0x08, 0x39, 0x00, 0x7E, 0x2B, 0x00, 0x08, 0x6A, 0x00, 0x4A, 0x4E, 0x00, 0x6A, 0xC4, 0x00, 0x29, 0x8E, 0x00, 0x0E, 0x1A, 0x00, 0x38, 0x33, 0x00, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9239, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x80, 0x7E, 0x89, 0x00, 0x08, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x7E, 0xA1, 0x00, 0x08, 0xA3, 0x00, 0x4A, 0xB2, 0x00, 0x6A, 0x96, 0x00, 0x28, 0x8C, 0x00, 0x0E, 0x9A, 0x00, 0x39, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x923A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x0A, 0x00, 0x2A, 0x09, 0x00, 0x28, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x923C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x0B, 0x10, 0x00, 0x19, 0xBF, 0x80, 0x10, 0x28, 0x00, 0x3F, 0x68, 0x00, 0x64, 0x48, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x25, 0x08, 0x00, 0x35, 0x0F, 0x00, 0x14, 0x08, 0x00, 0x07, 0x88, 0x00, 0x1C, 0x08, 0x00, 0x70, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x923E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x64, 0x49, 0x00, 0x04, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x04, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x35, 0x49, 0x00, 0x14, 0x49, 0x00, 0x07, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x70, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x923F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x3F, 0x80, 0x11, 0x24, 0x80, 0x20, 0x24, 0x80, 0x00, 0x24, 0x80, 0x1F, 0x24, 0x80, 0x04, 0x24, 0x80, 0x04, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x24, 0xA4, 0x80, 0x14, 0xA4, 0x80, 0x15, 0x24, 0x80, 0x07, 0xBF, 0x80, 0x38, 0x20, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9240, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x3F, 0x80, 0x09, 0x24, 0x80, 0x10, 0xA4, 0x80, 0x20, 0x24, 0x80, 0x1F, 0x24, 0x80, 0x04, 0x3F, 0x80, 0x04, 0x24, 0x80, 0x3F, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x24, 0xA4, 0x80, 0x25, 0x3F, 0x80, 0x14, 0x04, 0x00, 0x07, 0x84, 0x00, 0x38, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9242, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x48, 0x00, 0x4A, 0x68, 0x00, 0x6A, 0x38, 0x00, 0x28, 0x18, 0x00, 0x0E, 0x3C, 0x00, 0x38, 0x66, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9243, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x16, 0x7F, 0x00, 0x32, 0xC8, 0x00, 0x20, 0x88, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x1C, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x36, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9244, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x48, 0x00, 0x16, 0x48, 0x00, 0x32, 0x7F, 0x00, 0x20, 0xC8, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x1C, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x36, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9245, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x0A, 0x7F, 0x80, 0x11, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x25, 0x7E, 0x00, 0x15, 0x40, 0x00, 0x14, 0x40, 0x00, 0x07, 0xC0, 0x00, 0x38, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9246, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x08, 0x00, 0x19, 0x88, 0x00, 0x10, 0x0F, 0x80, 0x3F, 0x08, 0x00, 0x64, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3F, 0x00, 0x25, 0x21, 0x00, 0x35, 0x21, 0x00, 0x14, 0x21, 0x00, 0x07, 0xA1, 0x00, 0x1C, 0x21, 0x00, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9247, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x16, 0x40, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x7E, 0x88, 0x00, 0x09, 0x4B, 0x00, 0x08, 0x4D, 0x00, 0x7E, 0x59, 0x00, 0x08, 0x69, 0x00, 0x4A, 0xCB, 0x00, 0x6A, 0x48, 0x00, 0x28, 0x48, 0x00, 0x0E, 0x40, 0x80, 0x38, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9248, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x80, 0x80, 0x08, 0x20, 0x00, 0x08, 0x23, 0x00, 0x7E, 0x2E, 0x00, 0x08, 0x38, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0x20, 0x00, 0x28, 0x20, 0x00, 0x0E, 0x20, 0x80, 0x38, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9249, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3E, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x22, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x9F, 0x80, 0x31, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x924A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x11, 0x00, 0x33, 0x11, 0x00, 0x20, 0x31, 0x00, 0x7E, 0x23, 0x00, 0x08, 0x62, 0x00, 0x08, 0xCE, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x924B, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x21, 0x81, 0x00, 0x7E, 0x79, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x7B, 0x00, 0x4A, 0x42, 0x00, 0x6A, 0x4E, 0x00, 0x28, 0x40, 0x00, 0x0E, 0x40, 0x80, 0x38, 0x61, 0x80, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x924D, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x1C, 0x18, 0x00, 0x16, 0x08, 0x00, 0x32, 0x21, 0x00, 0x20, 0x21, 0x00, 0x7E, 0x23, 0x00, 0x08, 0x22, 0x00, 0x08, 0xA6, 0x00, 0x7E, 0xA5, 0x00, 0x08, 0xAD, 0x80, 0x4A, 0xA8, 0x80, 0x6A, 0xB0, 0x00, 0x28, 0x20, 0x00, 0x0E, 0x61, 0x00, 0x39, 0xB3, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x924E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x48, 0x00, 0x16, 0x48, 0x00, 0x32, 0x48, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0xC8, 0x00, 0x08, 0x88, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x924F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3E, 0x00, 0x0B, 0x22, 0x00, 0x19, 0xA2, 0x00, 0x10, 0x22, 0x00, 0x3F, 0x3E, 0x00, 0x64, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x22, 0x00, 0x25, 0x3E, 0x00, 0x35, 0x22, 0x00, 0x14, 0x22, 0x00, 0x07, 0xA2, 0x00, 0x1C, 0x22, 0x00, 0x70, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9250, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x20, 0x18, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x7E, 0x61, 0x00, 0x08, 0xA1, 0x00, 0x4A, 0x21, 0x00, 0x6A, 0x21, 0x00, 0x28, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x3F, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9251, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0E, 0x0C, 0x00, 0x0B, 0x08, 0x00, 0x19, 0xBF, 0x00, 0x10, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x64, 0x21, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x21, 0x00, 0x25, 0x21, 0x00, 0x35, 0x21, 0x00, 0x14, 0x21, 0x00, 0x07, 0xA1, 0x00, 0x1C, 0x3F, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9257, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x0A, 0x22, 0x00, 0x11, 0x22, 0x00, 0x20, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x1F, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x3E, 0x00, 0x25, 0x22, 0x00, 0x15, 0x22, 0x00, 0x14, 0x22, 0x00, 0x07, 0xA2, 0x00, 0x38, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9258, { 0x00, 0x00, 0x00, 0x04, 0x14, 0x00, 0x0E, 0x14, 0x00, 0x0B, 0x7F, 0x00, 0x19, 0x15, 0x00, 0x10, 0x15, 0x00, 0x3F, 0x7F, 0x00, 0x64, 0x54, 0x00, 0x04, 0x54, 0x00, 0x3F, 0x7F, 0x80, 0x04, 0x14, 0x80, 0x25, 0x14, 0x80, 0x35, 0x14, 0x80, 0x14, 0x35, 0x80, 0x07, 0x24, 0x00, 0x1C, 0x64, 0x00, 0x70, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9259, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x00, 0x0B, 0x41, 0x00, 0x19, 0x41, 0x00, 0x10, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x64, 0x41, 0x00, 0x04, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x25, 0x00, 0x00, 0x35, 0x22, 0x00, 0x14, 0x22, 0x00, 0x07, 0x63, 0x00, 0x1C, 0x41, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x925A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x30, 0x00, 0x16, 0xE7, 0x80, 0x32, 0x94, 0x80, 0x20, 0x94, 0x80, 0x7E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x08, 0x94, 0x80, 0x7E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x4A, 0x94, 0x80, 0x6A, 0xF4, 0x80, 0x29, 0x97, 0x80, 0x08, 0x14, 0x00, 0x1E, 0x34, 0x00, 0x70, 0x64, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x925B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x80, 0x08, 0x43, 0x80, 0x3E, 0x80, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0F, 0x41, 0x00, 0x38, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x925C, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0x62, 0x00, 0x32, 0x42, 0x00, 0x20, 0x5F, 0x80, 0x7E, 0xC2, 0x00, 0x08, 0xD2, 0x00, 0x09, 0x5A, 0x00, 0x7E, 0x4A, 0x00, 0x08, 0x4A, 0x00, 0x4A, 0x42, 0x00, 0x6A, 0x42, 0x00, 0x28, 0x42, 0x00, 0x0E, 0x42, 0x00, 0x38, 0x42, 0x00, 0x60, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x925D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x7E, 0x66, 0x00, 0x08, 0x24, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x04, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x925E, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x14, 0x09, 0x00, 0x22, 0x08, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x80, 0x3E, 0x48, 0x80, 0x08, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x4E, 0x00, 0x28, 0x74, 0x00, 0x0E, 0xCC, 0x80, 0x38, 0x12, 0x80, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9260, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x4A, 0x14, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x36, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9261, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x2A, 0x00, 0x16, 0x6B, 0x00, 0x33, 0x49, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9262, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x1C, 0x00, 0x3E, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0x88, 0x80, 0x2A, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9264, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x40, 0x80, 0x3E, 0x80, 0x80, 0x09, 0x00, 0x80, 0x08, 0x3C, 0x80, 0x3E, 0x24, 0x80, 0x08, 0x24, 0x80, 0x2A, 0x3C, 0x80, 0x2A, 0x00, 0x80, 0x28, 0x00, 0x80, 0x0F, 0x00, 0x80, 0x30, 0x01, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9265, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x14, 0x00, 0x22, 0x12, 0x00, 0x00, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x54, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x28, 0x94, 0x00, 0x0E, 0x94, 0x80, 0x39, 0x17, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9266, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x3F, 0x4F, 0x80, 0x08, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x28, 0x48, 0x00, 0x0F, 0x48, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9267, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x32, 0x59, 0x00, 0x20, 0x4D, 0x00, 0x7E, 0x45, 0x00, 0x08, 0x41, 0x00, 0x09, 0xFF, 0x80, 0x7E, 0x81, 0x00, 0x08, 0xB1, 0x00, 0x4A, 0x99, 0x00, 0x6A, 0x89, 0x00, 0x28, 0x81, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9268, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x20, 0x00, 0x33, 0x7F, 0x80, 0x20, 0x48, 0x80, 0x7E, 0xC8, 0x80, 0x08, 0x09, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0xC9, 0x80, 0x28, 0x88, 0x80, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9269, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x16, 0x14, 0x00, 0x33, 0x36, 0x00, 0x20, 0x63, 0x00, 0x7E, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0xC9, 0x80, 0x28, 0x88, 0x80, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x926E, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x0B, 0x04, 0x00, 0x19, 0xBF, 0x80, 0x10, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x64, 0x24, 0x80, 0x04, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x25, 0x24, 0x80, 0x35, 0x3F, 0x80, 0x14, 0x04, 0x00, 0x07, 0x84, 0x00, 0x1C, 0x04, 0x00, 0x70, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x926F, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x16, 0x82, 0x00, 0x32, 0x82, 0x00, 0x20, 0xB2, 0x00, 0x7E, 0x9A, 0x00, 0x08, 0x8A, 0x00, 0x08, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x86, 0x00, 0x4A, 0x84, 0x00, 0x6A, 0x84, 0x00, 0x28, 0x8E, 0x00, 0x0E, 0xEB, 0x00, 0x39, 0x99, 0x00, 0x63, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9270, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x01, 0x00, 0x32, 0x01, 0x00, 0x20, 0x79, 0x00, 0x7E, 0x01, 0x00, 0x08, 0x01, 0x00, 0x08, 0x79, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x79, 0x00, 0x28, 0x01, 0x00, 0x0E, 0x01, 0x00, 0x38, 0x01, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9271, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x98, 0x00, 0x4A, 0x90, 0x00, 0x6A, 0x92, 0x00, 0x28, 0xB3, 0x00, 0x0F, 0xA1, 0x00, 0x39, 0x2F, 0x80, 0x63, 0x78, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9274, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x12, 0x7E, 0x00, 0x12, 0xA0, 0x00, 0x13, 0x18, 0x00, 0x12, 0x88, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x37, 0xF7, 0x00, 0x40, 0x82, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA4, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9275, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x4A, 0x08, 0x00, 0x6A, 0x09, 0x00, 0x28, 0x09, 0x00, 0x0E, 0x0F, 0x00, 0x38, 0x39, 0x80, 0x60, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9276, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x39, 0xF4, 0x80, 0x2C, 0xA4, 0x80, 0x64, 0xA4, 0x80, 0x00, 0xA4, 0x80, 0x7C, 0xA4, 0x80, 0x11, 0xF4, 0x80, 0x10, 0xA4, 0x80, 0x7C, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x54, 0xA4, 0x80, 0x54, 0xA0, 0x80, 0x50, 0xA0, 0x80, 0x1D, 0xA0, 0x80, 0x31, 0x20, 0x80, 0x63, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9277, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0x22, 0x00, 0x32, 0x22, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x00, 0x00, 0x28, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9278, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x22, 0x00, 0x7E, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x36, 0x00, 0x4A, 0x1C, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x1C, 0x00, 0x0E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9279, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x1F, 0x00, 0x16, 0x31, 0x00, 0x32, 0x63, 0x00, 0x20, 0xD6, 0x00, 0x7E, 0x0C, 0x00, 0x08, 0x18, 0x00, 0x08, 0x74, 0x00, 0x7E, 0x07, 0x80, 0x08, 0x0C, 0x80, 0x4A, 0x19, 0x80, 0x6A, 0x75, 0x00, 0x28, 0x03, 0x00, 0x0E, 0x06, 0x00, 0x38, 0x1C, 0x00, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x927B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x3E, 0x00, 0x32, 0x62, 0x00, 0x20, 0xC6, 0x00, 0x7E, 0x34, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x7E, 0xE3, 0x80, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x927C, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x63, 0x00, 0x16, 0x22, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x28, 0x22, 0x00, 0x0E, 0x62, 0x00, 0x38, 0x42, 0x00, 0x60, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x927D, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x1C, 0x05, 0x80, 0x16, 0x04, 0x80, 0x32, 0x04, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFC, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x26, 0x00, 0x28, 0x3A, 0x00, 0x0E, 0xE2, 0x80, 0x38, 0x03, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x927E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x32, 0x00, 0x33, 0x22, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x01, 0x00, 0x08, 0x08, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x88, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x927F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x16, 0x14, 0x00, 0x33, 0x36, 0x00, 0x20, 0x63, 0x00, 0x7E, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9280, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x90, 0x80, 0x08, 0x91, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x8C, 0x00, 0x28, 0x88, 0x00, 0x0E, 0xF4, 0x00, 0x33, 0x82, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9283, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x4F, 0x00, 0x3F, 0xF4, 0x80, 0x08, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x44, 0x00, 0x28, 0x44, 0x00, 0x0E, 0x84, 0x80, 0x31, 0x07, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9285, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x08, 0x81, 0x00, 0x08, 0xBD, 0x00, 0x3F, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x2A, 0xBD, 0x00, 0x2A, 0xA5, 0x00, 0x28, 0x81, 0x00, 0x0E, 0x81, 0x00, 0x30, 0x81, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9288, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9289, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x09, 0x00, 0x32, 0x09, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x09, 0x00, 0x08, 0x09, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x928A, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x1C, 0x0B, 0x00, 0x16, 0x09, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x89, 0x00, 0x08, 0xE9, 0x00, 0x7E, 0x8B, 0x00, 0x08, 0x8A, 0x00, 0x4A, 0x8E, 0x00, 0x6A, 0x84, 0x00, 0x28, 0x8E, 0x80, 0x0E, 0x9A, 0x80, 0x38, 0xB3, 0x80, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x928D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x20, 0x00, 0x32, 0x22, 0x00, 0x20, 0x62, 0x00, 0x7E, 0x4F, 0x00, 0x08, 0xF9, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x928E, { 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x10, 0xE4, 0x00, 0x10, 0xB4, 0x00, 0x10, 0x94, 0x00, 0x1D, 0x84, 0x80, 0x73, 0x04, 0x80, 0x00, 0x83, 0x80, 0x03, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9291, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x28, 0x00, 0x22, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x48, 0x00, 0x08, 0x88, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x0F, 0x44, 0x00, 0x30, 0x84, 0x80, 0x03, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9292, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xF7, 0x80, 0x16, 0x22, 0x00, 0x33, 0x22, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x3A, 0x00, 0x08, 0xE7, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x28, 0x62, 0x00, 0x0E, 0x42, 0x00, 0x38, 0xC2, 0x00, 0x61, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9293, { 0x00, 0x00, 0x00, 0x08, 0x78, 0x00, 0x14, 0x14, 0x00, 0x22, 0x22, 0x00, 0x00, 0x41, 0x00, 0x01, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9295, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x09, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x4A, 0x08, 0x80, 0x6A, 0x1C, 0x80, 0x28, 0x15, 0x80, 0x0E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9296, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x28, 0x00, 0x22, 0x28, 0x00, 0x00, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x88, 0x00, 0x09, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x18, 0x00, 0x0A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x0F, 0x49, 0x00, 0x38, 0x89, 0x00, 0x01, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9297, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x40, 0x00, 0x20, 0x40, 0x00, 0x7E, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x5F, 0x00, 0x08, 0x51, 0x00, 0x4A, 0x51, 0x00, 0x6A, 0x51, 0x00, 0x28, 0xD1, 0x00, 0x0E, 0x91, 0x00, 0x39, 0x91, 0x00, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9298, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x1F, 0x00, 0x00, 0x31, 0x00, 0x00, 0x4A, 0x00, 0x3E, 0x8C, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x60, 0x00, 0x09, 0xBF, 0x00, 0x0A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x28, 0x21, 0x00, 0x0F, 0x21, 0x00, 0x38, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9299, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x14, 0x00, 0x20, 0x22, 0x00, 0x7E, 0xC1, 0x80, 0x08, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x01, 0x00, 0x0E, 0x01, 0x00, 0x38, 0x03, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x929A, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x24, 0x00, 0x16, 0x24, 0x80, 0x32, 0xA5, 0x80, 0x20, 0x67, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x27, 0x00, 0x08, 0x65, 0x80, 0x4A, 0xA4, 0x80, 0x6A, 0x24, 0x00, 0x28, 0x64, 0x00, 0x0E, 0x44, 0x80, 0x38, 0xC4, 0x80, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x929B, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x929C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x67, 0x00, 0x10, 0x90, 0x00, 0x25, 0x00, 0x00, 0x05, 0xF0, 0x00, 0x08, 0x40, 0x00, 0x18, 0x4F, 0x80, 0x19, 0xF2, 0x00, 0x28, 0x42, 0x00, 0x08, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0x52, 0x00, 0x09, 0x42, 0x00, 0x08, 0x72, 0x00, 0x09, 0x82, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x929F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x88, 0x80, 0x16, 0x88, 0x80, 0x32, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x4A, 0x88, 0x80, 0x6A, 0x88, 0x80, 0x28, 0x88, 0x80, 0x0E, 0x8B, 0x80, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92A0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x11, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x12, 0x00, 0x20, 0x16, 0x00, 0x7E, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x18, 0x00, 0x08, 0x30, 0x00, 0x4A, 0xE3, 0x00, 0x6A, 0x3E, 0x00, 0x28, 0x20, 0x00, 0x0E, 0x20, 0x80, 0x38, 0x31, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92A4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x49, 0x00, 0x33, 0x69, 0x00, 0x20, 0x2B, 0x00, 0x7E, 0x2A, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x4A, 0x1C, 0x00, 0x6A, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x88, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92A5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x39, 0x00, 0x08, 0x29, 0x00, 0x7E, 0x6B, 0x00, 0x08, 0xAA, 0x00, 0x4A, 0x2E, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x26, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x3B, 0x00, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92A7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x49, 0x00, 0x16, 0x6B, 0x00, 0x32, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x64, 0x80, 0x38, 0x44, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92A8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x41, 0x00, 0x20, 0x51, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x12, 0x00, 0x7E, 0x32, 0x00, 0x08, 0x26, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x74, 0x00, 0x28, 0x1C, 0x00, 0x0E, 0x16, 0x00, 0x38, 0x33, 0x00, 0x60, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92AB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0E, 0x1F, 0x00, 0x0B, 0x11, 0x00, 0x19, 0xB3, 0x00, 0x10, 0x62, 0x00, 0x3F, 0x3F, 0x80, 0x64, 0x24, 0x80, 0x04, 0x24, 0x80, 0x3F, 0xA4, 0x80, 0x04, 0x3F, 0x80, 0x25, 0x20, 0x00, 0x35, 0x20, 0x00, 0x14, 0x20, 0x00, 0x07, 0xA0, 0x80, 0x1C, 0x20, 0x80, 0x70, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92AD, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x1C, 0x12, 0x00, 0x16, 0x10, 0x00, 0x32, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x10, 0x00, 0x08, 0x19, 0x00, 0x4A, 0x0B, 0x00, 0x6A, 0x0E, 0x00, 0x28, 0x04, 0x00, 0x0E, 0x0E, 0x80, 0x38, 0x3B, 0x80, 0x60, 0xE1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92AE, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x12, 0xA6, 0x00, 0x21, 0x42, 0x00, 0x06, 0x18, 0x00, 0x1B, 0xF7, 0x00, 0x60, 0x82, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA4, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92AF, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x18, 0x00, 0x0B, 0x30, 0x00, 0x19, 0x61, 0x00, 0x10, 0x33, 0x00, 0x3F, 0x16, 0x00, 0x64, 0x0C, 0x00, 0x04, 0x19, 0x00, 0x3F, 0x7F, 0x80, 0x04, 0x08, 0x80, 0x25, 0x08, 0x00, 0x35, 0x29, 0x00, 0x14, 0x29, 0x00, 0x07, 0x69, 0x80, 0x1C, 0x48, 0x80, 0x70, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92B2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92B3, { 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x14, 0x24, 0x00, 0x22, 0x22, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x80, 0x80, 0x09, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0A, 0x7E, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x24, 0x80, 0x30, 0x47, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92B6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x0A, 0x00, 0x22, 0x09, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x88, 0x80, 0x3E, 0x49, 0x00, 0x08, 0x2A, 0x00, 0x0A, 0x1C, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x49, 0x00, 0x30, 0x89, 0x00, 0x01, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92B7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x2A, 0x00, 0x11, 0x49, 0x00, 0x20, 0x88, 0x80, 0x00, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x41, 0x00, 0x25, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x07, 0xC1, 0x00, 0x38, 0x41, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92B8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1D, 0xFF, 0x80, 0x16, 0x52, 0x00, 0x32, 0x52, 0x00, 0x20, 0x72, 0x00, 0x7E, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x7E, 0x72, 0x00, 0x08, 0x52, 0x00, 0x4A, 0x52, 0x00, 0x6A, 0x52, 0x00, 0x28, 0x72, 0x00, 0x0E, 0xD2, 0x80, 0x38, 0x12, 0x80, 0x60, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92B9, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x14, 0x78, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x1C, 0x00, 0x3E, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x3F, 0x08, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x2A, 0x27, 0x80, 0x28, 0x40, 0x80, 0x0E, 0x40, 0x80, 0x38, 0x81, 0x00, 0x03, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92BA, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x62, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92BB, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x24, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x09, 0x00, 0x20, 0x09, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x7F, 0x80, 0x08, 0x18, 0x80, 0x4A, 0x18, 0x80, 0x6A, 0x28, 0x80, 0x28, 0x28, 0x80, 0x0E, 0x6B, 0x80, 0x38, 0xC8, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92BC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x2A, 0x00, 0x16, 0x2A, 0x00, 0x33, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x7E, 0x5D, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92BD, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1C, 0x7C, 0x00, 0x16, 0x48, 0x00, 0x33, 0x48, 0x00, 0x20, 0x7F, 0x80, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x72, 0x80, 0x7E, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92BF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x02, 0x00, 0x32, 0x34, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x4A, 0x88, 0x80, 0x6A, 0xFF, 0x80, 0x28, 0x88, 0x80, 0x0E, 0x88, 0x80, 0x38, 0x88, 0x80, 0x60, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92C0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x00, 0x00, 0x32, 0x00, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x63, 0x00, 0x28, 0x22, 0x00, 0x0E, 0x02, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92C1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x18, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92C2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x7F, 0x80, 0x32, 0x40, 0x00, 0x20, 0xC0, 0x00, 0x7E, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x29, 0x00, 0x7E, 0x29, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x41, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x49, 0x00, 0x0E, 0x7F, 0x80, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92C3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFE, 0x00, 0x32, 0x82, 0x00, 0x20, 0x82, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xFE, 0x80, 0x08, 0x89, 0x80, 0x4A, 0x8B, 0x00, 0x6A, 0x8C, 0x00, 0x28, 0x84, 0x00, 0x0E, 0x86, 0x00, 0x38, 0xF3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92C5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x00, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x63, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92C6, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x00, 0x80, 0x13, 0x78, 0x80, 0x10, 0x00, 0x80, 0x10, 0xFD, 0x80, 0x1C, 0x01, 0x00, 0x70, 0x87, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92C7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92C8, { 0x00, 0x00, 0x00, 0x18, 0x0E, 0x00, 0x0D, 0xF8, 0x00, 0x60, 0x10, 0x00, 0x33, 0xFF, 0x80, 0x00, 0x28, 0x00, 0x0C, 0x6C, 0x00, 0x18, 0xC6, 0x00, 0x33, 0x83, 0x00, 0x60, 0x81, 0x00, 0x03, 0x60, 0x00, 0x1C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92CB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x80, 0x1C, 0xE3, 0x80, 0x16, 0x2E, 0x00, 0x32, 0x22, 0x00, 0x20, 0x42, 0x00, 0x7E, 0x4A, 0x00, 0x08, 0xEB, 0x80, 0x08, 0x2A, 0x00, 0x7E, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x4A, 0xAA, 0x00, 0x6A, 0xEA, 0x00, 0x28, 0x4F, 0x80, 0x0E, 0x40, 0x00, 0x38, 0xF0, 0x00, 0x61, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92CC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xF1, 0x80, 0x22, 0x1E, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0xF2, 0x00, 0x3F, 0x1F, 0x80, 0x08, 0x12, 0x00, 0x0A, 0x92, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x28, 0x4F, 0x80, 0x0E, 0x60, 0x00, 0x38, 0x9F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92CD, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x7E, 0x7F, 0x00, 0x08, 0x02, 0x00, 0x4A, 0x04, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92CE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x64, 0x00, 0x0E, 0x44, 0x80, 0x38, 0xC4, 0x80, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92CF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0xAA, 0x80, 0x08, 0x2C, 0x80, 0x0A, 0x08, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x28, 0x22, 0x00, 0x0F, 0x22, 0x00, 0x30, 0x41, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92D0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x20, 0x91, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x24, 0x00, 0x4A, 0x64, 0x00, 0x6A, 0x4C, 0x00, 0x28, 0xC9, 0x00, 0x0E, 0x99, 0x00, 0x39, 0x93, 0x80, 0x60, 0x3E, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92D2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x3F, 0x00, 0x00, 0x62, 0x00, 0x01, 0x94, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x36, 0x00, 0x08, 0xC9, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0xFF, 0x80, 0x30, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92D3, { 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x38, 0x71, 0x00, 0x2D, 0xC5, 0x00, 0x64, 0x45, 0x00, 0x00, 0x45, 0x00, 0x7D, 0xF5, 0x00, 0x10, 0x45, 0x00, 0x10, 0x45, 0x00, 0x7C, 0xE5, 0x00, 0x10, 0xD5, 0x00, 0x55, 0x55, 0x00, 0x55, 0x45, 0x00, 0x50, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x30, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92D5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x0C, 0x00, 0x6A, 0x15, 0x00, 0x28, 0x51, 0x80, 0x0E, 0x52, 0x80, 0x38, 0xD2, 0x00, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92D7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92D8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x5E, 0x00, 0x16, 0x52, 0x00, 0x33, 0x52, 0x00, 0x20, 0x52, 0x00, 0x7E, 0x5E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x09, 0x00, 0x4A, 0x09, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x0E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92D9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x10, 0x00, 0x32, 0x10, 0x00, 0x20, 0x7E, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92DC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x48, 0x00, 0x4A, 0x4F, 0x00, 0x6A, 0x48, 0x00, 0x28, 0xC8, 0x00, 0x0E, 0xA8, 0x00, 0x39, 0x9C, 0x00, 0x63, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92DD, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0xFA, 0x00, 0x32, 0x13, 0x00, 0x20, 0x59, 0x80, 0x7E, 0xC8, 0x80, 0x08, 0x80, 0x00, 0x08, 0x02, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0x32, 0x00, 0x28, 0x12, 0x00, 0x0E, 0x02, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92DF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x01, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x01, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x08, 0x7F, 0x00, 0x4A, 0x21, 0x00, 0x6A, 0x33, 0x00, 0x28, 0x16, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92E0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x80, 0x00, 0x32, 0x80, 0x00, 0x20, 0xBF, 0x00, 0x7E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0xA4, 0x00, 0x08, 0xA4, 0x80, 0x4A, 0xA5, 0x80, 0x6A, 0xA5, 0x00, 0x28, 0xA6, 0x00, 0x0E, 0xA2, 0x00, 0x38, 0xBB, 0x00, 0x61, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92E1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x16, 0x36, 0x00, 0x32, 0x63, 0x00, 0x20, 0xDD, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x02, 0x00, 0x7E, 0x04, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92E3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0xF7, 0x80, 0x2D, 0x24, 0x80, 0x65, 0x24, 0x80, 0x01, 0x24, 0x80, 0x7D, 0x25, 0x00, 0x11, 0x25, 0x00, 0x13, 0xF5, 0x00, 0x7C, 0xA4, 0x80, 0x10, 0xA4, 0x80, 0x54, 0xA4, 0x80, 0x54, 0xA4, 0x80, 0x50, 0xA4, 0x80, 0x1D, 0xA5, 0x80, 0x31, 0x24, 0x00, 0x63, 0x64, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92E4, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0xF2, 0x00, 0x22, 0x92, 0x00, 0x00, 0x9F, 0x80, 0x3E, 0x92, 0x80, 0x08, 0xF2, 0x80, 0x08, 0x92, 0x80, 0x3E, 0x92, 0x80, 0x08, 0x92, 0x80, 0x0A, 0xF2, 0x80, 0x2A, 0x92, 0x80, 0x2A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x0E, 0xBC, 0x80, 0x39, 0xCB, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92E5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x03, 0x00, 0x7E, 0x7E, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92E7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x34, 0x00, 0x0E, 0x24, 0x80, 0x38, 0x64, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92E8, { 0x00, 0x00, 0x00, 0x08, 0x15, 0x00, 0x1C, 0x24, 0x80, 0x16, 0xE4, 0x80, 0x32, 0x24, 0x00, 0x20, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x08, 0x24, 0x80, 0x7E, 0x24, 0x80, 0x08, 0x35, 0x00, 0x4A, 0xE5, 0x00, 0x6A, 0x26, 0x00, 0x28, 0x22, 0x80, 0x0E, 0x22, 0x80, 0x38, 0x25, 0x80, 0x60, 0xE8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92E9, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x33, 0x22, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0x20, 0x00, 0x28, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x38, 0x20, 0x00, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92EA, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x14, 0x09, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x4B, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92EC, { 0x00, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0xA3, 0x00, 0x08, 0xB6, 0x00, 0x0E, 0x9C, 0x00, 0x79, 0x88, 0x00, 0x09, 0x1C, 0x00, 0x0B, 0x36, 0x00, 0x38, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x98, 0x00, 0x77, 0xF7, 0x80, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92ED, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x63, 0x00, 0x16, 0x22, 0x00, 0x33, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x24, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x64, 0x00, 0x0F, 0x44, 0x80, 0x78, 0xC4, 0x80, 0x01, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92EE, { 0x00, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x38, 0x0B, 0x00, 0x2C, 0x09, 0x00, 0x65, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x7D, 0x08, 0x00, 0x11, 0xF9, 0x00, 0x11, 0x29, 0x00, 0x7D, 0x2B, 0x00, 0x11, 0x2A, 0x00, 0x55, 0x2E, 0x00, 0x55, 0x24, 0x00, 0x51, 0x2E, 0x00, 0x1D, 0x6A, 0x80, 0x31, 0x1B, 0x80, 0x62, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92F0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x33, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92F2, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x38, 0x00, 0x33, 0x20, 0x00, 0x20, 0x20, 0x00, 0x7E, 0x3F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x00, 0x00, 0x28, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92F3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x10, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x7E, 0x21, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x21, 0x00, 0x6A, 0x69, 0x00, 0x28, 0x4D, 0x00, 0x0E, 0xC5, 0x00, 0x39, 0x81, 0x00, 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92F8, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x20, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0xC4, 0x00, 0x04, 0x44, 0x00, 0x25, 0x5F, 0x00, 0x15, 0x51, 0x00, 0x14, 0x51, 0x00, 0x07, 0x91, 0x00, 0x38, 0x9F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x92F9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x3F, 0x00, 0x16, 0x20, 0x00, 0x33, 0x3E, 0x00, 0x20, 0x20, 0x00, 0x7E, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x28, 0x00, 0x4A, 0x28, 0x80, 0x6A, 0x2D, 0x80, 0x28, 0x25, 0x00, 0x0E, 0x26, 0x00, 0x38, 0x3B, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92FA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x40, 0x00, 0x08, 0x77, 0x80, 0x08, 0x54, 0x80, 0x7E, 0x54, 0x80, 0x08, 0x94, 0x80, 0x4A, 0x55, 0x80, 0x6A, 0x34, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x24, 0x80, 0x38, 0x64, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92FB, { 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x1B, 0x00, 0x21, 0x0A, 0x00, 0x3F, 0x0E, 0x00, 0x24, 0x1B, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92FC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x00, 0xA2, 0x80, 0x3E, 0x94, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3F, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x0A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x0F, 0x80, 0x80, 0x38, 0x80, 0x80, 0x00, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x92FF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x2A, 0x00, 0x16, 0x6B, 0x00, 0x32, 0xC9, 0x80, 0x20, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x80, 0x80, 0x7E, 0xBE, 0x80, 0x08, 0xA2, 0x80, 0x4A, 0xA2, 0x80, 0x6A, 0xA2, 0x80, 0x28, 0xBE, 0x80, 0x0E, 0x80, 0x80, 0x38, 0x80, 0x80, 0x60, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9300, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x38, 0x00, 0x16, 0x6C, 0x00, 0x32, 0xC6, 0x00, 0x21, 0x83, 0x80, 0x7E, 0x7C, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0xA9, 0x00, 0x4A, 0xA9, 0x00, 0x6A, 0xFF, 0x00, 0x28, 0xA9, 0x00, 0x0E, 0xA9, 0x00, 0x38, 0xA9, 0x00, 0x60, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9302, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x21, 0xFF, 0x80, 0x7E, 0x24, 0x00, 0x08, 0x64, 0x00, 0x08, 0xC7, 0x80, 0x7E, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x4A, 0x62, 0x00, 0x6A, 0xC6, 0x00, 0x28, 0x2C, 0x00, 0x0E, 0x18, 0x00, 0x38, 0x76, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9304, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x7E, 0x00, 0x22, 0x02, 0x00, 0x00, 0x7E, 0x00, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x89, 0x00, 0x0A, 0x4A, 0x00, 0x2A, 0x2C, 0x00, 0x2A, 0x1C, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x4A, 0x00, 0x30, 0x89, 0x00, 0x03, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9306, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9308, { 0x00, 0x00, 0x00, 0x08, 0x2A, 0x00, 0x1C, 0x6B, 0x00, 0x16, 0x49, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x14, 0x00, 0x7E, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0xE5, 0x80, 0x6A, 0x24, 0x00, 0x28, 0x2C, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x23, 0x00, 0x60, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x930D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x49, 0x00, 0x20, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x12, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x38, 0x02, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x930F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x24, 0x00, 0x33, 0x24, 0x00, 0x20, 0x24, 0x00, 0x7E, 0xE7, 0x00, 0x08, 0x81, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xE7, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x24, 0x00, 0x39, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9310, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x14, 0x24, 0x00, 0x22, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0xC8, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x28, 0x15, 0x00, 0x0E, 0x4A, 0x80, 0x38, 0x4A, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9311, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x80, 0x1C, 0xFF, 0x00, 0x16, 0x80, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x8A, 0x00, 0x7E, 0x89, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x88, 0x00, 0x6A, 0x9C, 0x00, 0x28, 0x94, 0x00, 0x0E, 0xB6, 0x00, 0x39, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9314, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x09, 0x00, 0x16, 0xEB, 0x00, 0x32, 0x2C, 0x00, 0x20, 0x2E, 0x00, 0x7E, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9315, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x44, 0x00, 0x4A, 0x45, 0x80, 0x6A, 0x77, 0x00, 0x28, 0x44, 0x00, 0x0E, 0x44, 0x80, 0x38, 0x74, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9318, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x14, 0x78, 0x00, 0x22, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9319, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x16, 0x92, 0x00, 0x32, 0x92, 0x00, 0x20, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x931A, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x14, 0x39, 0x00, 0x22, 0x48, 0x80, 0x00, 0x84, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x09, 0x00, 0x09, 0xFF, 0x80, 0x0A, 0x09, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x931C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x16, 0x36, 0x00, 0x32, 0x63, 0x00, 0x20, 0xDD, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x02, 0x00, 0x7E, 0x04, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x0C, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x51, 0x00, 0x0E, 0x51, 0x80, 0x38, 0x52, 0x80, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x931D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x4A, 0x2A, 0x00, 0x6A, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x0E, 0xC9, 0x80, 0x38, 0x08, 0x00, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x931E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x0A, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x931F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x11, 0x00, 0x22, 0x92, 0x00, 0x00, 0x94, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x46, 0x00, 0x3F, 0x91, 0x80, 0x08, 0x12, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x98, 0x00, 0x2A, 0x28, 0x00, 0x08, 0x28, 0x00, 0x0E, 0x44, 0x00, 0x30, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9320, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x48, 0x00, 0x2A, 0x4F, 0x80, 0x2A, 0x48, 0x00, 0x28, 0x48, 0x00, 0x0F, 0xA8, 0x00, 0x38, 0x9F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9321, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x01, 0x00, 0x0A, 0x79, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x79, 0x00, 0x28, 0x01, 0x00, 0x0E, 0x01, 0x00, 0x30, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9322, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x14, 0x12, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x11, 0x00, 0x00, 0x12, 0x00, 0x3E, 0x0C, 0x00, 0x08, 0x34, 0x80, 0x08, 0xC3, 0x80, 0x3E, 0x14, 0x00, 0x08, 0x17, 0x80, 0x2A, 0xF8, 0x00, 0x2A, 0x11, 0x00, 0x28, 0x0A, 0x00, 0x0F, 0x0C, 0x80, 0x38, 0x32, 0x80, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9323, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0xEF, 0x00, 0x2C, 0x21, 0x00, 0x65, 0xAD, 0x00, 0x00, 0x42, 0x00, 0x7C, 0xA5, 0x00, 0x11, 0x08, 0x80, 0x10, 0x00, 0x00, 0x7D, 0xEF, 0x00, 0x10, 0x21, 0x00, 0x55, 0x21, 0x00, 0x54, 0xCA, 0x00, 0x50, 0x4A, 0x00, 0x1C, 0xA4, 0x00, 0x31, 0x2A, 0x00, 0x62, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9324, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x22, 0x22, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x30, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9325, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x20, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0xC1, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9326, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x1F, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x04, 0x11, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x05, 0x3F, 0x80, 0x25, 0x24, 0x80, 0x15, 0x24, 0x80, 0x14, 0x24, 0x80, 0x07, 0xA4, 0x80, 0x38, 0x24, 0x80, 0x00, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9327, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x20, 0x80, 0x80, 0x7E, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x3E, 0x00, 0x08, 0x20, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0x3F, 0x00, 0x28, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9328, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x28, 0x49, 0x00, 0x0F, 0x49, 0x00, 0x38, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9329, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x80, 0x80, 0x6A, 0x80, 0x80, 0x28, 0xFF, 0x80, 0x0E, 0x80, 0x80, 0x38, 0x80, 0x80, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x932A, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x1C, 0x14, 0x00, 0x16, 0x14, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x55, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x55, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x55, 0x00, 0x4A, 0x55, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x932B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x04, 0x51, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xA0, 0x00, 0x05, 0x7F, 0x80, 0x15, 0x92, 0x80, 0x15, 0x24, 0x80, 0x14, 0x48, 0x80, 0x07, 0x90, 0x80, 0x38, 0x21, 0x00, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x932C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x2A, 0x00, 0x6A, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x0E, 0x49, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x932E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x22, 0x88, 0x80, 0x00, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x0A, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xBE, 0x80, 0x28, 0x80, 0x80, 0x0F, 0x80, 0x80, 0x38, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x932F, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x14, 0x24, 0x00, 0x22, 0x24, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x08, 0x42, 0x00, 0x0F, 0x42, 0x00, 0x38, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9332, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7E, 0x00, 0x16, 0x02, 0x00, 0x32, 0x7E, 0x00, 0x20, 0x02, 0x00, 0x7E, 0x02, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x6B, 0x00, 0x4A, 0x2A, 0x00, 0x2A, 0x1C, 0x00, 0x28, 0x2E, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9333, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x02, 0x00, 0x33, 0x04, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0x38, 0x00, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x55, 0x00, 0x28, 0x55, 0x00, 0x0E, 0x55, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9334, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7E, 0xC3, 0x80, 0x08, 0x08, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9335, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x33, 0x22, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x14, 0x00, 0x08, 0x34, 0x00, 0x08, 0x24, 0x80, 0x7E, 0x65, 0x80, 0x08, 0xA7, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x24, 0x80, 0x38, 0x24, 0x80, 0x60, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9336, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x14, 0x00, 0x08, 0x34, 0x80, 0x4A, 0x65, 0x80, 0x6A, 0xE5, 0x00, 0x28, 0x26, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x7B, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9337, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2D, 0xF4, 0x00, 0x64, 0x44, 0x00, 0x01, 0xF4, 0x00, 0x7D, 0x54, 0x00, 0x11, 0x54, 0x00, 0x11, 0xF4, 0x00, 0x7D, 0x54, 0x00, 0x11, 0x54, 0x00, 0x55, 0xF4, 0x00, 0x54, 0x44, 0x00, 0x51, 0xF4, 0x80, 0x1C, 0x44, 0x80, 0x30, 0x44, 0x80, 0x60, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x933A, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x20, 0x2A, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x4A, 0x11, 0x00, 0x6A, 0x11, 0x00, 0x28, 0x31, 0x00, 0x0E, 0x23, 0x00, 0x38, 0x62, 0x00, 0x60, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x933B, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x1C, 0x05, 0x80, 0x16, 0xF4, 0x80, 0x32, 0x04, 0x00, 0x21, 0xFF, 0x80, 0x7E, 0x04, 0x00, 0x08, 0x24, 0x00, 0x08, 0xA4, 0x00, 0x7E, 0xBC, 0x00, 0x08, 0xA4, 0x00, 0x4A, 0xA6, 0x00, 0x6A, 0xA2, 0x00, 0x28, 0xBA, 0x00, 0x0E, 0xE2, 0x80, 0x39, 0x83, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x933E, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x3F, 0x78, 0x00, 0x08, 0x40, 0x00, 0x14, 0x44, 0x00, 0x3F, 0x7E, 0x00, 0x04, 0x48, 0x00, 0x3E, 0x88, 0x00, 0x05, 0x48, 0x00, 0x06, 0x30, 0x00, 0x1B, 0xEF, 0x00, 0x60, 0x82, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA4, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9344, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x49, 0x00, 0x0E, 0xC9, 0x80, 0x38, 0x88, 0x80, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9347, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x1C, 0x8B, 0x00, 0x16, 0xEE, 0x00, 0x32, 0x88, 0x00, 0x20, 0x88, 0x80, 0x7E, 0x89, 0x80, 0x08, 0xE7, 0x00, 0x09, 0x88, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x4A, 0x81, 0x00, 0x6A, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x0E, 0x81, 0x00, 0x38, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9348, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3E, 0x2A, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x14, 0x00, 0x28, 0x14, 0x00, 0x0E, 0x22, 0x00, 0x38, 0x41, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9349, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x4A, 0x48, 0x00, 0x6A, 0x4F, 0x00, 0x28, 0x48, 0x00, 0x0E, 0xE8, 0x00, 0x38, 0xB8, 0x00, 0x61, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x934A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x6B, 0x00, 0x3E, 0x5D, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x1C, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x4A, 0x00, 0x30, 0x89, 0x00, 0x01, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x934B, { 0x00, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x22, 0x2F, 0x00, 0x00, 0x29, 0x00, 0x3E, 0x29, 0x00, 0x08, 0x29, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x80, 0x80, 0x08, 0x80, 0x80, 0x0A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x28, 0xBE, 0x80, 0x0E, 0x80, 0x80, 0x30, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x934D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0xA2, 0x00, 0x00, 0xA2, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0xBE, 0x00, 0x3E, 0x80, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0x94, 0x00, 0x28, 0x88, 0x00, 0x0F, 0x94, 0x00, 0x31, 0x22, 0x00, 0x02, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9350, { 0x00, 0x00, 0x00, 0x08, 0xA2, 0x80, 0x1C, 0x94, 0x80, 0x16, 0x88, 0x80, 0x32, 0x94, 0x80, 0x20, 0xA2, 0x80, 0x7E, 0x80, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x7E, 0x62, 0x00, 0x08, 0xC3, 0x80, 0x4A, 0x20, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0xD2, 0x00, 0x0E, 0x0C, 0x00, 0x38, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9351, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x7F, 0x80, 0x32, 0xC0, 0x00, 0x20, 0x3E, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x3E, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x3E, 0x00, 0x6A, 0x62, 0x00, 0x28, 0xD6, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9352, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x22, 0x00, 0x32, 0x14, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x29, 0x00, 0x08, 0x6A, 0x00, 0x08, 0xC8, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9354, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xF7, 0x80, 0x22, 0x94, 0x80, 0x00, 0x94, 0x80, 0x3E, 0xF7, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x2A, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x28, 0x80, 0x80, 0x0E, 0x00, 0x80, 0x30, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9355, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x80, 0x80, 0x32, 0x88, 0x80, 0x20, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9356, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x33, 0x22, 0x00, 0x20, 0x3E, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x52, 0x00, 0x6A, 0x52, 0x00, 0x28, 0x63, 0x80, 0x0E, 0x40, 0x00, 0x38, 0x40, 0x00, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9357, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x20, 0x36, 0x00, 0x7E, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x7E, 0x88, 0x80, 0x08, 0x7F, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x49, 0x00, 0x0E, 0x4B, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9358, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x1C, 0xF5, 0x00, 0x16, 0x95, 0x00, 0x32, 0x95, 0x00, 0x20, 0xF5, 0x00, 0x7E, 0x95, 0x00, 0x08, 0x95, 0x00, 0x08, 0x95, 0x00, 0x7E, 0xF5, 0x00, 0x08, 0x95, 0x00, 0x4A, 0x95, 0x00, 0x6A, 0x95, 0x00, 0x28, 0xF1, 0x00, 0x0E, 0x91, 0x00, 0x19, 0x99, 0x00, 0x71, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x935A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x4A, 0x7F, 0x80, 0x6A, 0xCA, 0x80, 0x28, 0x12, 0x80, 0x08, 0x64, 0x80, 0x1E, 0x08, 0x80, 0x70, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x935B, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x14, 0xCE, 0x00, 0x22, 0x8A, 0x00, 0x00, 0x8A, 0x80, 0x3E, 0x93, 0x80, 0x08, 0xE0, 0x00, 0x08, 0x80, 0x00, 0x3E, 0x9F, 0x00, 0x08, 0xE9, 0x00, 0x0A, 0x8A, 0x00, 0x2A, 0x86, 0x00, 0x2A, 0xE4, 0x00, 0x28, 0x84, 0x00, 0x0F, 0x8A, 0x00, 0x38, 0x91, 0x00, 0x00, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x935C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xF7, 0x80, 0x16, 0x90, 0x80, 0x32, 0x90, 0x80, 0x20, 0x90, 0x80, 0x7E, 0xF7, 0x80, 0x08, 0x80, 0x00, 0x08, 0x8F, 0x80, 0x7E, 0xF4, 0x80, 0x08, 0x85, 0x80, 0x4A, 0x85, 0x00, 0x6A, 0xF7, 0x00, 0x28, 0x82, 0x00, 0x0E, 0x87, 0x00, 0x38, 0x85, 0x00, 0x60, 0x8D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x935E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x0B, 0x0F, 0x80, 0x19, 0x08, 0x00, 0x10, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x64, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x04, 0x41, 0x00, 0x25, 0x7F, 0x00, 0x35, 0x41, 0x00, 0x14, 0x41, 0x00, 0x07, 0x7F, 0x00, 0x1C, 0x22, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9360, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9364, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x68, 0x00, 0x7E, 0xCB, 0x80, 0x08, 0x88, 0x80, 0x4A, 0x88, 0x80, 0x6A, 0xEB, 0x80, 0x28, 0x88, 0x80, 0x0E, 0x88, 0x80, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9365, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x38, 0x77, 0x80, 0x2D, 0xC2, 0x80, 0x64, 0x72, 0x80, 0x01, 0xC2, 0x80, 0x7C, 0x42, 0x80, 0x10, 0x76, 0x80, 0x11, 0xC4, 0x80, 0x7C, 0x4D, 0x80, 0x10, 0x00, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x50, 0x28, 0x00, 0x1C, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x61, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9367, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x16, 0x7F, 0x80, 0x32, 0xC0, 0x80, 0x21, 0xBC, 0x80, 0x7E, 0x00, 0x80, 0x08, 0x7E, 0x80, 0x08, 0x00, 0x80, 0x7E, 0x3C, 0x80, 0x08, 0x00, 0x80, 0x4A, 0x3C, 0x80, 0x6A, 0x00, 0x80, 0x28, 0x3C, 0x80, 0x0E, 0x24, 0x80, 0x38, 0x3C, 0x80, 0x60, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9369, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x20, 0x22, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x08, 0x20, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0xA1, 0x00, 0x28, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x936A, { 0x00, 0x00, 0x00, 0x3F, 0x20, 0x00, 0x02, 0x3F, 0x80, 0x14, 0x52, 0x00, 0x7F, 0x16, 0x00, 0x0D, 0x1C, 0x00, 0x14, 0x08, 0x00, 0x64, 0x1C, 0x00, 0x0C, 0x76, 0x00, 0x00, 0x83, 0x80, 0x03, 0x60, 0x00, 0x0E, 0x1C, 0x00, 0x73, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x936C, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x1C, 0x72, 0x00, 0x17, 0xC2, 0x00, 0x32, 0x4A, 0x80, 0x20, 0x4A, 0x80, 0x7F, 0xFA, 0x80, 0x08, 0x4A, 0x80, 0x08, 0xE2, 0x00, 0x7E, 0xD2, 0x00, 0x09, 0x52, 0x00, 0x4A, 0x47, 0x00, 0x6A, 0x45, 0x00, 0x28, 0x45, 0x00, 0x0E, 0x45, 0x00, 0x38, 0x4D, 0x80, 0x60, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x936D, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x5F, 0x00, 0x16, 0x41, 0x00, 0x32, 0xC1, 0x00, 0x20, 0xBF, 0x80, 0x7E, 0x90, 0x00, 0x09, 0x90, 0x00, 0x08, 0xBF, 0x00, 0x7E, 0xA4, 0x00, 0x08, 0x84, 0x00, 0x4A, 0xBF, 0x80, 0x6A, 0x8A, 0x00, 0x28, 0x8A, 0x00, 0x0E, 0x9B, 0x00, 0x38, 0x91, 0x00, 0x60, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x936E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x78, 0x00, 0x22, 0x14, 0x00, 0x00, 0x22, 0x00, 0x3E, 0xC1, 0x80, 0x08, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x08, 0xF2, 0x80, 0x2A, 0x92, 0x80, 0x2A, 0xF5, 0x00, 0x2A, 0x9A, 0x00, 0x08, 0xF9, 0x00, 0x0E, 0x95, 0x00, 0x30, 0x94, 0x80, 0x00, 0xB2, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x936F, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x16, 0x7F, 0x80, 0x32, 0xD4, 0x80, 0x21, 0x94, 0x80, 0x7E, 0x74, 0x80, 0x08, 0x38, 0x80, 0x08, 0x4D, 0x80, 0x7E, 0x91, 0x00, 0x08, 0x27, 0x00, 0x4A, 0x00, 0x00, 0x6A, 0x08, 0x00, 0x28, 0xAD, 0x00, 0x0E, 0xA5, 0x80, 0x39, 0xB2, 0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9370, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x1E, 0x00, 0x16, 0xF2, 0x00, 0x32, 0x53, 0x00, 0x20, 0x89, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0x76, 0x00, 0x28, 0x5C, 0x00, 0x0E, 0xC8, 0x00, 0x39, 0x9E, 0x00, 0x60, 0x73, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9371, { 0x00, 0x00, 0x00, 0x08, 0x4A, 0x00, 0x1C, 0x4A, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x4A, 0x00, 0x20, 0x4A, 0x00, 0x7E, 0x4E, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x2A, 0x00, 0x6A, 0x2A, 0x00, 0x28, 0x6B, 0x00, 0x0E, 0x49, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9373, { 0x00, 0x00, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x10, 0x00, 0x3F, 0x3F, 0x80, 0x21, 0x20, 0x00, 0x3F, 0x60, 0x00, 0x24, 0x00, 0x00, 0x3F, 0x1F, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x88, 0x00, 0x02, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9374, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x88, 0x80, 0x16, 0x88, 0x80, 0x32, 0x88, 0x80, 0x20, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0xA4, 0x80, 0x6A, 0xA4, 0x80, 0x28, 0xA4, 0x80, 0x0E, 0xA4, 0x80, 0x38, 0xA4, 0x80, 0x60, 0xA5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9375, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x15, 0xC4, 0x00, 0x22, 0x5F, 0x00, 0x00, 0x45, 0x00, 0x00, 0xFF, 0x80, 0x3D, 0x05, 0x00, 0x09, 0xDF, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x09, 0x5F, 0x00, 0x2B, 0x44, 0x00, 0x2A, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x0F, 0x44, 0x00, 0x39, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9376, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x33, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x4A, 0x0C, 0x00, 0x6A, 0x14, 0x00, 0x28, 0x51, 0x00, 0x0E, 0x51, 0x80, 0x38, 0x52, 0x80, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x937A, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x1C, 0x11, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x12, 0x00, 0x20, 0x16, 0x00, 0x7E, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x18, 0x00, 0x7E, 0x24, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0xA1, 0x00, 0x6A, 0x21, 0x00, 0x28, 0x3F, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x937C, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x14, 0x09, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xF8, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xF9, 0x00, 0x0A, 0xD9, 0x00, 0x2A, 0xD6, 0x00, 0x2A, 0xD4, 0x00, 0x28, 0xF6, 0x80, 0x0F, 0x0A, 0x80, 0x31, 0x11, 0x80, 0x02, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x937D, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x80, 0x1C, 0x7E, 0x00, 0x16, 0x40, 0x00, 0x33, 0x7F, 0x80, 0x20, 0x40, 0x80, 0x7E, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x7E, 0x7F, 0x80, 0x08, 0x54, 0x80, 0x4A, 0xD4, 0x80, 0x6A, 0xFF, 0x80, 0x29, 0x54, 0x80, 0x0E, 0x54, 0x80, 0x38, 0x54, 0x80, 0x60, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x937E, { 0x00, 0x00, 0x00, 0x08, 0x0F, 0x00, 0x14, 0x78, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x0F, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x937F, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x16, 0x92, 0x00, 0x33, 0xFF, 0x80, 0x20, 0x92, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9380, { 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x38, 0x90, 0x00, 0x2C, 0xBF, 0x80, 0x65, 0xE1, 0x00, 0x01, 0x1B, 0x00, 0x7D, 0x4E, 0x00, 0x13, 0x5B, 0x00, 0x11, 0x71, 0x80, 0x7D, 0x44, 0x00, 0x11, 0x4C, 0x00, 0x55, 0x5B, 0x00, 0x55, 0x46, 0x00, 0x51, 0x5C, 0x80, 0x1D, 0x41, 0x80, 0x31, 0x07, 0x00, 0x61, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9381, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3B, 0xF7, 0x80, 0x2D, 0x24, 0x80, 0x65, 0x24, 0x80, 0x01, 0xE4, 0x80, 0x7D, 0x25, 0x00, 0x11, 0x25, 0x00, 0x11, 0x25, 0x00, 0x7D, 0xE4, 0x80, 0x11, 0x24, 0x80, 0x55, 0x24, 0x80, 0x55, 0x24, 0x80, 0x51, 0xE4, 0x80, 0x13, 0x25, 0x80, 0x3C, 0x24, 0x00, 0x60, 0x24, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9382, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x14, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x0E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9388, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x24, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x20, 0x10, 0x00, 0x7E, 0x7E, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x4A, 0x20, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0xC8, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x938A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x20, 0x14, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x88, 0x80, 0x7E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x10, 0x00, 0x6A, 0x1F, 0x00, 0x28, 0x31, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x61, 0x00, 0x60, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x938B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x88, 0x80, 0x20, 0x8E, 0x80, 0x7E, 0x78, 0x00, 0x08, 0x0F, 0x00, 0x08, 0x78, 0x00, 0x7E, 0x0F, 0x80, 0x08, 0xF8, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x938C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x7C, 0x00, 0x22, 0x82, 0x00, 0x01, 0xFF, 0x00, 0x02, 0x48, 0x80, 0x3D, 0xFF, 0x00, 0x08, 0x49, 0x00, 0x0B, 0xFF, 0x80, 0x3E, 0x49, 0x00, 0x09, 0xFF, 0x00, 0x2A, 0xCC, 0x00, 0x2A, 0xCC, 0x00, 0x2A, 0xCA, 0x00, 0x0F, 0x4A, 0x00, 0x31, 0x49, 0x00, 0x02, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x938D, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x08, 0x88, 0x80, 0x7E, 0x12, 0x00, 0x08, 0x64, 0x00, 0x4A, 0x29, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x08, 0x80, 0x0E, 0x2A, 0x00, 0x38, 0x6B, 0x00, 0x60, 0xC9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x938F, { 0x00, 0x00, 0x00, 0x30, 0x10, 0x00, 0x1B, 0xFF, 0x80, 0x08, 0x40, 0x00, 0x60, 0x82, 0x00, 0x31, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x92, 0x00, 0x0C, 0x92, 0x00, 0x18, 0x92, 0x80, 0x31, 0x12, 0x80, 0x62, 0x01, 0x80, 0x03, 0xE0, 0x00, 0x0C, 0x98, 0x00, 0x77, 0xF7, 0x80, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9392, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0xFF, 0x80, 0x2D, 0x00, 0x00, 0x65, 0x3F, 0x00, 0x01, 0x00, 0x00, 0x7D, 0x7F, 0x80, 0x11, 0x29, 0x00, 0x11, 0x2A, 0x00, 0x7D, 0x24, 0x00, 0x11, 0x32, 0x00, 0x55, 0x61, 0x80, 0x55, 0x02, 0x00, 0x51, 0x7F, 0x80, 0x1D, 0x22, 0x00, 0x32, 0x32, 0x00, 0x60, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9394, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9395, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x38, 0x08, 0x00, 0x2D, 0xFF, 0x80, 0x65, 0x10, 0x00, 0x01, 0x7F, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x11, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x7F, 0x00, 0x55, 0x10, 0x00, 0x55, 0x7F, 0x00, 0x51, 0x41, 0x00, 0x1D, 0x41, 0x00, 0x32, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9396, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x14, 0x49, 0x00, 0x22, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x28, 0x41, 0x00, 0x0F, 0x7F, 0x00, 0x38, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9397, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x16, 0x36, 0x00, 0x33, 0x63, 0x00, 0x20, 0xDD, 0x80, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x40, 0x00, 0x28, 0xFF, 0x80, 0x0E, 0xA0, 0x80, 0x39, 0xA0, 0x80, 0x60, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9398, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x00, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7E, 0x94, 0x80, 0x08, 0xA4, 0x80, 0x4A, 0xC3, 0x80, 0x6A, 0x80, 0x80, 0x28, 0xBE, 0x80, 0x0E, 0x88, 0x80, 0x38, 0x88, 0x80, 0x60, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x939A, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x14, 0x48, 0x00, 0x22, 0x1F, 0x00, 0x00, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x08, 0x9F, 0x00, 0x08, 0x51, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xDF, 0x00, 0x2A, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x28, 0x5F, 0x00, 0x0E, 0x50, 0x00, 0x38, 0xBF, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x939B, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x1C, 0x09, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x4A, 0x02, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x0E, 0x12, 0x00, 0x38, 0x02, 0x00, 0x60, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x939E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x41, 0x00, 0x20, 0x55, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x55, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x4A, 0x44, 0x00, 0x6A, 0x75, 0x80, 0x28, 0x47, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x74, 0x80, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93A1, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x39, 0xFF, 0x80, 0x2C, 0x42, 0x00, 0x64, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x7D, 0x29, 0x00, 0x10, 0xA5, 0x00, 0x54, 0x42, 0x00, 0x54, 0x42, 0x00, 0x50, 0xA5, 0x00, 0x1C, 0xA5, 0x00, 0x31, 0xEF, 0x80, 0x61, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93A3, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x15, 0x14, 0x80, 0x16, 0x15, 0x00, 0x24, 0xA6, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x20, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0xE0, 0x80, 0x01, 0x50, 0x00, 0x07, 0xFC, 0x00, 0x38, 0x43, 0x80, 0x0F, 0xFE, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93A4, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x16, 0x7F, 0x00, 0x33, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x6B, 0x00, 0x7E, 0x2A, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x28, 0x24, 0x00, 0x0E, 0x64, 0x80, 0x38, 0x44, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93A6, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x1C, 0xE7, 0x80, 0x16, 0x94, 0x80, 0x32, 0x94, 0x80, 0x20, 0x94, 0x80, 0x7E, 0x94, 0x80, 0x08, 0xF5, 0x80, 0x08, 0xA4, 0x00, 0x7E, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93A7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0A, 0x49, 0x00, 0x11, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x1F, 0x00, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x25, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x04, 0x42, 0x00, 0x07, 0x22, 0x00, 0x38, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93A8, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x1C, 0x24, 0x00, 0x16, 0x7F, 0x00, 0x32, 0xC8, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x00, 0x00, 0x6A, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93A9, { 0x00, 0x00, 0x00, 0x10, 0x27, 0x00, 0x39, 0x25, 0x00, 0x2C, 0xA5, 0x00, 0x64, 0x45, 0x00, 0x00, 0xA5, 0x00, 0x7D, 0x09, 0x80, 0x10, 0x20, 0x00, 0x10, 0x57, 0x80, 0x7C, 0x44, 0x80, 0x11, 0xF5, 0x80, 0x54, 0x45, 0x00, 0x54, 0xE7, 0x00, 0x50, 0xD2, 0x00, 0x1D, 0x57, 0x00, 0x32, 0x45, 0x00, 0x60, 0x4D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93AB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x80, 0x80, 0x32, 0xBE, 0x80, 0x20, 0x92, 0x80, 0x7E, 0x8C, 0x80, 0x08, 0xB2, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x22, 0x00, 0x08, 0xC3, 0x80, 0x4A, 0x20, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0xD2, 0x00, 0x0E, 0x0C, 0x00, 0x38, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93AC, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x0A, 0x80, 0x80, 0x2A, 0xBE, 0x80, 0x2A, 0xA2, 0x80, 0x28, 0xBE, 0x80, 0x0E, 0xA2, 0x80, 0x38, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93AD, { 0x00, 0x00, 0x00, 0x08, 0x8F, 0x00, 0x14, 0xF8, 0x00, 0x22, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3E, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x3E, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x80, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93AE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x0E, 0x22, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93B0, { 0x00, 0x00, 0x00, 0x08, 0x1C, 0x00, 0x14, 0x04, 0x00, 0x22, 0x22, 0x00, 0x00, 0x41, 0x00, 0x00, 0xBE, 0x80, 0x3F, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x3F, 0x42, 0x00, 0x08, 0x81, 0x00, 0x2B, 0x00, 0x80, 0x2A, 0xFF, 0x00, 0x2A, 0xA5, 0x00, 0x0F, 0xA5, 0x00, 0x39, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93B4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x20, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x7E, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x4A, 0x10, 0x00, 0x6A, 0x18, 0x00, 0x28, 0x29, 0x00, 0x0E, 0xA1, 0x80, 0x38, 0xA2, 0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93B5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0x10, 0x00, 0x2D, 0xFF, 0x00, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0x51, 0x00, 0x7D, 0x93, 0x00, 0x10, 0x2A, 0x00, 0x54, 0x48, 0x00, 0x55, 0x9C, 0x00, 0x50, 0x2A, 0x00, 0x1C, 0x4B, 0x00, 0x31, 0x89, 0x80, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93B6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1D, 0xFF, 0x80, 0x16, 0x02, 0x00, 0x32, 0xF2, 0x00, 0x20, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0xF2, 0x00, 0x08, 0x06, 0x00, 0x7E, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x4A, 0x02, 0x00, 0x6A, 0xF2, 0x00, 0x28, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x38, 0xF2, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93B9, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x1C, 0x93, 0x00, 0x16, 0xF1, 0x80, 0x32, 0x40, 0x00, 0x20, 0x9F, 0x00, 0x7E, 0xC4, 0x00, 0x08, 0x44, 0x00, 0x08, 0x1F, 0x80, 0x7E, 0xC4, 0x00, 0x08, 0x4E, 0x00, 0x4A, 0x4A, 0x00, 0x6A, 0x5B, 0x00, 0x28, 0x51, 0x00, 0x0E, 0xC0, 0x00, 0x38, 0xA0, 0x00, 0x61, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93BA, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0xCF, 0x00, 0x2C, 0x09, 0x00, 0x64, 0x09, 0x00, 0x00, 0x09, 0x00, 0x7F, 0xEF, 0x00, 0x10, 0x89, 0x00, 0x10, 0x89, 0x00, 0x7E, 0xA9, 0x00, 0x12, 0xA9, 0x00, 0x56, 0xAF, 0x00, 0x54, 0xA9, 0x00, 0x50, 0x89, 0x00, 0x1C, 0x89, 0x00, 0x30, 0x89, 0x00, 0x60, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93C1, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x92, 0x00, 0x16, 0x49, 0x00, 0x33, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93C3, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x14, 0x84, 0x00, 0x22, 0x88, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0x8A, 0x00, 0x08, 0x92, 0x00, 0x08, 0xF4, 0x00, 0x3F, 0x9F, 0x80, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x2A, 0x9F, 0x80, 0x2A, 0x92, 0x00, 0x29, 0x15, 0x00, 0x0F, 0x25, 0x00, 0x39, 0x29, 0x00, 0x02, 0xD0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93C4, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x0A, 0x00, 0x08, 0x3F, 0x00, 0x4A, 0xE1, 0x80, 0x6A, 0x02, 0x00, 0x28, 0xFF, 0x80, 0x0E, 0x22, 0x00, 0x38, 0x32, 0x00, 0x60, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93C5, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x38, 0x88, 0x00, 0x2C, 0x9F, 0x80, 0x65, 0xB1, 0x00, 0x01, 0x0B, 0x00, 0x7D, 0x4E, 0x00, 0x13, 0x5B, 0x00, 0x11, 0x71, 0x80, 0x7D, 0x5F, 0x00, 0x11, 0x51, 0x00, 0x55, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x51, 0x5F, 0x00, 0x1D, 0x51, 0x00, 0x31, 0x11, 0x00, 0x61, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93C6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x49, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93C7, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x38, 0x48, 0x00, 0x2C, 0x4F, 0x80, 0x65, 0xE8, 0x00, 0x00, 0x90, 0x00, 0x7C, 0x8F, 0x80, 0x10, 0xE2, 0x80, 0x10, 0xA2, 0x80, 0x7C, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x54, 0xAB, 0x80, 0x54, 0xAA, 0x00, 0x51, 0xAA, 0x00, 0x1D, 0x2A, 0x00, 0x31, 0x6E, 0x00, 0x63, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93C8, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x1C, 0x84, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x44, 0x00, 0x20, 0x9F, 0x00, 0x7E, 0xD5, 0x00, 0x08, 0x55, 0x00, 0x08, 0x1F, 0x00, 0x7E, 0xD5, 0x00, 0x08, 0x55, 0x00, 0x4A, 0x5F, 0x00, 0x6A, 0x44, 0x00, 0x28, 0x7F, 0x80, 0x0E, 0xC4, 0x00, 0x38, 0xA4, 0x00, 0x61, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93C9, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2D, 0xF4, 0x00, 0x64, 0x4F, 0x80, 0x01, 0xFA, 0x80, 0x7D, 0x52, 0x00, 0x11, 0x52, 0x00, 0x11, 0x52, 0x00, 0x7D, 0xF2, 0x00, 0x10, 0x42, 0x00, 0x54, 0x47, 0x00, 0x54, 0xE5, 0x00, 0x50, 0xD5, 0x00, 0x1D, 0x4D, 0x80, 0x32, 0x48, 0x80, 0x60, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93CA, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xE1, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xDB, 0x00, 0x08, 0x0E, 0x00, 0x1F, 0x8A, 0x00, 0x30, 0x9B, 0x00, 0x63, 0xB1, 0x80, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x98, 0x00, 0x77, 0xF7, 0x80, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93CB, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2D, 0xFF, 0x80, 0x64, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x10, 0x80, 0x11, 0xD6, 0x80, 0x55, 0x52, 0x80, 0x55, 0x52, 0x80, 0x51, 0xB5, 0x80, 0x1D, 0x10, 0x80, 0x31, 0x10, 0x80, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93CC, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2D, 0xFF, 0x80, 0x64, 0x44, 0x00, 0x00, 0x44, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x54, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x50, 0x28, 0x00, 0x1C, 0x6C, 0x00, 0x30, 0xC6, 0x00, 0x63, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93CD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x88, 0x80, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x68, 0x00, 0x08, 0x11, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x08, 0x80, 0x28, 0x2A, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93D0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x77, 0x00, 0x16, 0x33, 0x00, 0x32, 0x55, 0x00, 0x20, 0x33, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x7E, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x4A, 0x08, 0x00, 0x6A, 0x32, 0x00, 0x28, 0x0C, 0x80, 0x0E, 0x31, 0x00, 0x38, 0x06, 0x00, 0x60, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93D1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x41, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x08, 0x88, 0x80, 0x0A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x0E, 0xBE, 0x80, 0x30, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93D3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x91, 0x00, 0x20, 0xDD, 0x00, 0x7E, 0xA5, 0x00, 0x08, 0xD5, 0x00, 0x08, 0x89, 0x00, 0x7E, 0x95, 0x00, 0x08, 0x81, 0x00, 0x4A, 0xFF, 0x00, 0x6A, 0x08, 0x00, 0x28, 0xAD, 0x00, 0x0E, 0xA5, 0x80, 0x38, 0xA2, 0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93D6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x6F, 0x3E, 0x00, 0x48, 0x21, 0x00, 0x1F, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x98, 0x00, 0x77, 0xF7, 0x80, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93D7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0xA4, 0x80, 0x32, 0xA5, 0x80, 0x20, 0xF5, 0x00, 0x7E, 0x93, 0x00, 0x08, 0xF2, 0x00, 0x08, 0xA7, 0x00, 0x7E, 0xAD, 0x80, 0x08, 0xF0, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x38, 0xFF, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93D8, { 0x00, 0x00, 0x00, 0x10, 0x48, 0x00, 0x39, 0x4F, 0x00, 0x2D, 0x59, 0x00, 0x65, 0x75, 0x00, 0x01, 0x4B, 0x00, 0x7D, 0xC6, 0x00, 0x10, 0x4C, 0x00, 0x10, 0x59, 0x00, 0x7C, 0x41, 0x00, 0x13, 0xDF, 0x80, 0x55, 0x41, 0x00, 0x55, 0x49, 0x00, 0x51, 0x4D, 0x00, 0x1D, 0x45, 0x00, 0x32, 0x41, 0x00, 0x60, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93D9, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x91, 0x00, 0x16, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x20, 0x24, 0x00, 0x7E, 0x28, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x7E, 0xC8, 0x00, 0x09, 0x7F, 0x00, 0x4A, 0x48, 0x00, 0x6A, 0x48, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x48, 0x00, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93DC, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x6B, 0x00, 0x16, 0x2A, 0x00, 0x32, 0x08, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x08, 0x00, 0x38, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93DD, { 0x00, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x1C, 0x22, 0x00, 0x16, 0x3E, 0x00, 0x33, 0x22, 0x00, 0x20, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0xA4, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x43, 0x00, 0x28, 0x26, 0x00, 0x0E, 0x1C, 0x00, 0x38, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93DE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x23, 0x08, 0x00, 0x01, 0x7F, 0x00, 0x3F, 0x09, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x09, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x2B, 0x49, 0x00, 0x2D, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x0F, 0x7F, 0x00, 0x31, 0x49, 0x00, 0x02, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93DF, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x64, 0x42, 0x00, 0x00, 0x3C, 0x00, 0x7C, 0x42, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x7D, 0x48, 0x00, 0x11, 0x7F, 0x00, 0x55, 0x88, 0x00, 0x55, 0x08, 0x00, 0x51, 0x7F, 0x00, 0x1D, 0x08, 0x00, 0x32, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93E1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x12, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x24, 0x00, 0x0F, 0x24, 0x00, 0x38, 0x44, 0x80, 0x01, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93E2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x14, 0x00, 0x33, 0x7F, 0x00, 0x20, 0x55, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x08, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93E4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0xFE, 0x00, 0x22, 0x92, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x0F, 0xE8, 0x00, 0x38, 0x3C, 0x00, 0x03, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93E5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x20, 0xA1, 0x00, 0x7E, 0x3F, 0x80, 0x08, 0x64, 0x00, 0x08, 0x48, 0x00, 0x7E, 0xDF, 0x00, 0x08, 0x51, 0x00, 0x4A, 0x51, 0x00, 0x6A, 0x5F, 0x00, 0x28, 0x51, 0x00, 0x0E, 0x51, 0x00, 0x38, 0x51, 0x00, 0x60, 0x5F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93E6, { 0x00, 0x00, 0x00, 0x10, 0x51, 0x00, 0x38, 0x51, 0x00, 0x2C, 0x91, 0x00, 0x64, 0xAA, 0x80, 0x01, 0x2A, 0x80, 0x7C, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x84, 0x00, 0x7D, 0x97, 0x00, 0x10, 0x94, 0x00, 0x54, 0x94, 0x00, 0x54, 0x94, 0x00, 0x50, 0x94, 0x00, 0x1C, 0x9C, 0x00, 0x30, 0xB6, 0x00, 0x60, 0xA3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93E7, { 0x00, 0x00, 0x00, 0x04, 0x1E, 0x00, 0x7F, 0xD2, 0x00, 0x04, 0x23, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x8E, 0x00, 0x3F, 0xB1, 0x80, 0x20, 0x80, 0x00, 0x43, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93E8, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x7F, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x22, 0x00, 0x7F, 0xC2, 0x00, 0x04, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x98, 0x00, 0x77, 0xF7, 0x80, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93F6, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x14, 0x48, 0x00, 0x22, 0xFF, 0x00, 0x01, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x0A, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x88, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x88, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x28, 0x1C, 0x00, 0x0E, 0x2A, 0x00, 0x30, 0x49, 0x00, 0x01, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93F7, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x1C, 0x94, 0x80, 0x16, 0x55, 0x00, 0x32, 0x14, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x41, 0x00, 0x08, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x0E, 0x36, 0x00, 0x38, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93F8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0x10, 0x00, 0x2D, 0xFF, 0x80, 0x64, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x7C, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x12, 0x00, 0x54, 0x7F, 0x00, 0x55, 0xC1, 0x80, 0x50, 0x10, 0x00, 0x1C, 0xA9, 0x00, 0x30, 0xA2, 0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93F9, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3B, 0xD9, 0x00, 0x2C, 0x51, 0x00, 0x64, 0x7F, 0x80, 0x00, 0x44, 0x80, 0x7D, 0xC4, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x15, 0x00, 0x7D, 0x15, 0x00, 0x11, 0xD5, 0x00, 0x54, 0x5F, 0x00, 0x54, 0x44, 0x00, 0x50, 0x45, 0x00, 0x1C, 0xC5, 0x00, 0x30, 0x8F, 0x80, 0x63, 0xB8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93FA, { 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x39, 0xFA, 0x00, 0x2E, 0x28, 0x80, 0x65, 0x6D, 0x00, 0x00, 0xC6, 0x00, 0x7D, 0x83, 0x00, 0x13, 0x01, 0x80, 0x11, 0xCF, 0x00, 0x7C, 0x49, 0x00, 0x10, 0x59, 0x80, 0x55, 0xC0, 0x00, 0x55, 0x1F, 0x00, 0x51, 0xC9, 0x00, 0x1C, 0x46, 0x00, 0x30, 0x49, 0x00, 0x61, 0x90, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x93FB, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x2A, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x2A, 0x00, 0x7E, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x48, 0x00, 0x7E, 0x71, 0x00, 0x08, 0xD7, 0x80, 0x4A, 0x95, 0x00, 0x6A, 0x75, 0x00, 0x28, 0x3F, 0x80, 0x0E, 0x61, 0x00, 0x38, 0xC1, 0x00, 0x61, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x93FD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0xFE, 0x00, 0x2C, 0x12, 0x00, 0x65, 0xFF, 0x80, 0x00, 0x12, 0x00, 0x7C, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x11, 0x55, 0x00, 0x7D, 0xD7, 0x00, 0x11, 0x11, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x51, 0xD7, 0x00, 0x1D, 0x55, 0x00, 0x31, 0x55, 0x00, 0x62, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9401, { 0x00, 0x00, 0x00, 0x11, 0x20, 0x80, 0x39, 0x21, 0x80, 0x2F, 0xF7, 0x00, 0x65, 0x24, 0x00, 0x01, 0x24, 0x00, 0x7D, 0xE7, 0x80, 0x11, 0x25, 0x00, 0x11, 0x25, 0x00, 0x7D, 0xE5, 0x00, 0x11, 0x25, 0x00, 0x55, 0x25, 0x00, 0x57, 0xF5, 0x00, 0x51, 0x45, 0x00, 0x1D, 0x65, 0x00, 0x33, 0x29, 0x00, 0x62, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9402, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x2C, 0x28, 0x00, 0x65, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x7D, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7C, 0x28, 0x00, 0x11, 0xFF, 0x00, 0x55, 0x11, 0x00, 0x55, 0x11, 0x00, 0x51, 0xFF, 0x00, 0x1D, 0x11, 0x00, 0x31, 0x11, 0x00, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9403, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x3E, 0x00, 0x16, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x00, 0x00, 0x7E, 0x42, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x42, 0x00, 0x7E, 0x72, 0x00, 0x08, 0xC7, 0x80, 0x4A, 0x00, 0x00, 0x6A, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x0E, 0x24, 0x80, 0x38, 0x64, 0x80, 0x60, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9404, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x0A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x0E, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9407, { 0x00, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1C, 0x7C, 0x00, 0x16, 0x89, 0x00, 0x32, 0x4A, 0x00, 0x20, 0xFF, 0x80, 0x7E, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x7E, 0xC9, 0x80, 0x08, 0x00, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9408, { 0x00, 0x00, 0x00, 0x08, 0x0E, 0x00, 0x1C, 0x78, 0x00, 0x16, 0x10, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x24, 0x00, 0x7E, 0x7E, 0x00, 0x09, 0xA5, 0x80, 0x08, 0x3C, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x4A, 0x81, 0x00, 0x6A, 0xBD, 0x00, 0x28, 0xA5, 0x00, 0x0E, 0xBD, 0x00, 0x38, 0x81, 0x00, 0x60, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9409, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xF7, 0x80, 0x16, 0x94, 0x80, 0x32, 0xF7, 0x80, 0x20, 0x84, 0x00, 0x7E, 0x94, 0x80, 0x08, 0x73, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x24, 0x00, 0x08, 0xFF, 0x00, 0x4A, 0x24, 0x00, 0x6A, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x0E, 0x42, 0x00, 0x38, 0xC3, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x940D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0xFF, 0x00, 0x2C, 0x22, 0x00, 0x64, 0x14, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x29, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x98, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x24, 0x80, 0x55, 0x44, 0x80, 0x55, 0xBF, 0x80, 0x51, 0x24, 0x80, 0x1D, 0x24, 0x80, 0x31, 0x3C, 0x80, 0x61, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x940E, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x28, 0x00, 0x16, 0x7F, 0x80, 0x32, 0x48, 0x00, 0x20, 0xC8, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x4A, 0x48, 0x00, 0x6A, 0x7F, 0x80, 0x28, 0x00, 0x00, 0x0E, 0x55, 0x00, 0x38, 0xD5, 0x80, 0x60, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x940F, { 0x00, 0x00, 0x00, 0x08, 0x2E, 0x00, 0x1C, 0x41, 0x00, 0x16, 0xBE, 0x80, 0x32, 0x14, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x55, 0x00, 0x08, 0x67, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x02, 0x00, 0x28, 0xFF, 0x80, 0x0E, 0x22, 0x00, 0x38, 0x12, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9410, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x14, 0x00, 0x20, 0x55, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC1, 0x80, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x08, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9413, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2D, 0xF4, 0x00, 0x64, 0x07, 0x80, 0x01, 0xF5, 0x00, 0x7D, 0x19, 0x00, 0x11, 0xF5, 0x00, 0x10, 0x05, 0x00, 0x7D, 0xF5, 0x00, 0x10, 0x27, 0x00, 0x54, 0x42, 0x00, 0x54, 0x72, 0x00, 0x51, 0xC7, 0x00, 0x1C, 0x45, 0x00, 0x30, 0x4D, 0x80, 0x61, 0xC8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9414, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1D, 0xFF, 0x80, 0x16, 0x28, 0x00, 0x32, 0xFF, 0x00, 0x20, 0xA9, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x4A, 0x42, 0x00, 0x6A, 0x7E, 0x00, 0x28, 0x10, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x10, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9415, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0xF7, 0x80, 0x2C, 0xA5, 0x00, 0x64, 0xA5, 0x00, 0x01, 0xFF, 0x80, 0x7C, 0x63, 0x00, 0x10, 0xB5, 0x00, 0x11, 0x29, 0x80, 0x7C, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x50, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x30, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9416, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0xCB, 0x00, 0x16, 0x8A, 0x00, 0x32, 0xAA, 0x80, 0x20, 0x49, 0x00, 0x7E, 0x8A, 0x00, 0x08, 0xAA, 0x80, 0x08, 0xEB, 0x80, 0x7E, 0x09, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x88, 0x00, 0x6A, 0x89, 0x00, 0x28, 0xCA, 0x00, 0x0E, 0xA4, 0x80, 0x38, 0x8A, 0x80, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9417, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xF7, 0x80, 0x16, 0x94, 0x80, 0x32, 0xF7, 0x80, 0x20, 0x94, 0x80, 0x7E, 0xF7, 0x80, 0x08, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x7E, 0xA2, 0x80, 0x08, 0xBE, 0x80, 0x4A, 0xA2, 0x80, 0x6A, 0xBE, 0x80, 0x28, 0xA2, 0x80, 0x0E, 0xA6, 0x80, 0x38, 0x80, 0x80, 0x60, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9418, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x0F, 0x7F, 0x00, 0x38, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9419, { 0x00, 0x00, 0x00, 0x08, 0x79, 0x00, 0x1C, 0x8A, 0x80, 0x16, 0x5D, 0x00, 0x32, 0x36, 0x00, 0x20, 0x63, 0x00, 0x7E, 0xC1, 0x80, 0x08, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x22, 0x00, 0x0E, 0x36, 0x00, 0x38, 0x14, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x941A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x14, 0x00, 0x32, 0x77, 0x00, 0x20, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x77, 0x00, 0x08, 0x14, 0x00, 0x7E, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x4A, 0x08, 0x00, 0x6A, 0x0C, 0x00, 0x28, 0x55, 0x00, 0x0E, 0x51, 0x80, 0x38, 0xD2, 0x80, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x941F, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x38, 0x42, 0x00, 0x2D, 0xEF, 0x80, 0x64, 0x42, 0x00, 0x00, 0x42, 0x00, 0x7D, 0xEF, 0x80, 0x10, 0x42, 0x00, 0x10, 0xA5, 0x00, 0x7D, 0x00, 0x80, 0x10, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0x81, 0x00, 0x50, 0xFF, 0x00, 0x1C, 0x81, 0x00, 0x30, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9421, { 0x00, 0x00, 0x00, 0x10, 0x45, 0x00, 0x38, 0x45, 0x80, 0x2D, 0xF4, 0x80, 0x64, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x7C, 0x04, 0x00, 0x11, 0xF4, 0x00, 0x11, 0x14, 0x80, 0x7D, 0xF4, 0x80, 0x10, 0x05, 0x80, 0x55, 0x15, 0x00, 0x55, 0xB7, 0x00, 0x50, 0xA2, 0x00, 0x1C, 0x76, 0x80, 0x31, 0xCA, 0x80, 0x60, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9425, { 0x00, 0x00, 0x00, 0x08, 0x21, 0x00, 0x14, 0x12, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x49, 0x00, 0x3E, 0x2A, 0x00, 0x09, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x30, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x942B, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x14, 0x48, 0x00, 0x22, 0xFF, 0x00, 0x01, 0x48, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x2A, 0xF7, 0x80, 0x2A, 0x94, 0x80, 0x28, 0x9C, 0x80, 0x0E, 0x80, 0x80, 0x38, 0x80, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x942E, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x38, 0x08, 0x00, 0x2D, 0xFF, 0x80, 0x65, 0x12, 0x00, 0x01, 0xFF, 0x80, 0x7D, 0x14, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x15, 0x00, 0x7D, 0xFF, 0x80, 0x11, 0x15, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x14, 0x00, 0x51, 0x36, 0x00, 0x1D, 0x55, 0x00, 0x32, 0x94, 0x80, 0x60, 0x14, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x942F, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x24, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x24, 0x00, 0x20, 0x11, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x12, 0x00, 0x08, 0x14, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x0A, 0x00, 0x4A, 0x3F, 0x00, 0x6A, 0xE1, 0x00, 0x28, 0x3F, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9431, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0x38, 0x00, 0x2C, 0x6C, 0x00, 0x64, 0xC6, 0x00, 0x01, 0x83, 0x80, 0x7C, 0x7C, 0x00, 0x10, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x7D, 0x29, 0x00, 0x11, 0x29, 0x00, 0x55, 0xEF, 0x00, 0x54, 0x00, 0x00, 0x50, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x31, 0xC7, 0x00, 0x63, 0x6D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9432, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0xFF, 0x80, 0x2C, 0xA4, 0x80, 0x64, 0xA4, 0x80, 0x00, 0xFF, 0x80, 0x7C, 0x40, 0x00, 0x10, 0xFF, 0x80, 0x11, 0x90, 0x80, 0x7C, 0xFE, 0x80, 0x10, 0x92, 0x80, 0x54, 0xFE, 0x80, 0x54, 0x10, 0x80, 0x50, 0x14, 0x80, 0x1C, 0x3D, 0x80, 0x30, 0xE5, 0x00, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9433, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x80, 0x7E, 0xAA, 0x80, 0x08, 0x88, 0x80, 0x08, 0x2A, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9434, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x38, 0xE2, 0x00, 0x2C, 0xAF, 0x80, 0x64, 0xA0, 0x00, 0x00, 0xA8, 0x80, 0x7C, 0xAD, 0x80, 0x10, 0xE5, 0x00, 0x10, 0x8F, 0x80, 0x7C, 0x82, 0x00, 0x10, 0xE2, 0x00, 0x55, 0xAF, 0x80, 0x55, 0xA2, 0x00, 0x52, 0xA2, 0x00, 0x10, 0xA2, 0x00, 0x3C, 0xE2, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9435, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x14, 0x4A, 0x00, 0x23, 0xF9, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0xE8, 0x80, 0x3E, 0xA8, 0x80, 0x08, 0xE9, 0x00, 0x0A, 0x09, 0x00, 0x2B, 0xFA, 0x00, 0x2A, 0x46, 0x00, 0x29, 0xF4, 0x00, 0x0F, 0x46, 0x80, 0x39, 0xE9, 0x80, 0x00, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9436, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x55, 0x00, 0x32, 0x55, 0x00, 0x20, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x14, 0x80, 0x28, 0x35, 0x00, 0x0E, 0xE6, 0x00, 0x38, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9438, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x22, 0x94, 0x80, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x22, 0x00, 0x0A, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x0F, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x943A, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x6B, 0x00, 0x16, 0x2A, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x7E, 0xBE, 0x80, 0x08, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x7E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x49, 0x00, 0x6A, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x49, 0x00, 0x38, 0x49, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x943B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0x1F, 0x00, 0x2C, 0x10, 0x00, 0x65, 0xFF, 0x80, 0x01, 0x10, 0x80, 0x7D, 0x7E, 0x00, 0x11, 0x10, 0x80, 0x11, 0x0F, 0x80, 0x7D, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x55, 0x10, 0x00, 0x55, 0x68, 0x80, 0x51, 0x15, 0x00, 0x1D, 0x6E, 0x00, 0x31, 0x15, 0x00, 0x62, 0x6C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x943D, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x39, 0x04, 0x00, 0x2D, 0xBF, 0x80, 0x64, 0x84, 0x00, 0x01, 0x3F, 0x80, 0x7D, 0x91, 0x00, 0x10, 0x8A, 0x00, 0x10, 0x3F, 0x80, 0x7D, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x54, 0x84, 0x00, 0x54, 0xBF, 0x80, 0x50, 0x84, 0x00, 0x1C, 0x84, 0x00, 0x31, 0xC0, 0x00, 0x63, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x943E, { 0x00, 0x00, 0x00, 0x1F, 0x88, 0x00, 0x10, 0xBE, 0x00, 0x1F, 0x94, 0x00, 0x10, 0x7F, 0x00, 0x1F, 0x88, 0x00, 0x28, 0xBE, 0x00, 0x4F, 0x88, 0x00, 0x01, 0x48, 0x00, 0x06, 0x30, 0x00, 0x1B, 0xEF, 0x00, 0x60, 0x82, 0x00, 0x0F, 0xF8, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA4, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x943F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x42, 0x00, 0x20, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x7E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x4A, 0x42, 0x00, 0x6A, 0x7E, 0x00, 0x28, 0x10, 0x00, 0x0E, 0xA9, 0x00, 0x38, 0xA2, 0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9441, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xA2, 0x80, 0x16, 0x94, 0x80, 0x32, 0xC9, 0x80, 0x20, 0x94, 0x80, 0x7E, 0xA2, 0x80, 0x08, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x7E, 0x22, 0x00, 0x08, 0xC3, 0x80, 0x4A, 0x20, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0xD2, 0x00, 0x0E, 0x0C, 0x00, 0x38, 0x36, 0x00, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9443, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0xF7, 0x80, 0x2C, 0x52, 0x80, 0x64, 0x94, 0x80, 0x00, 0x31, 0x80, 0x7C, 0xD6, 0x80, 0x10, 0x44, 0x00, 0x10, 0x88, 0x00, 0x7D, 0xFF, 0x80, 0x12, 0x88, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x50, 0xFF, 0x00, 0x1C, 0x88, 0x00, 0x30, 0x88, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9444, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x00, 0xFE, 0x00, 0x3E, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x7C, 0x80, 0x3E, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x2A, 0x02, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0xEA, 0x00, 0x0E, 0xA6, 0x00, 0x30, 0xE2, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9445, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x3A, 0xAA, 0x80, 0x2C, 0xAA, 0x80, 0x65, 0x45, 0x00, 0x02, 0x28, 0x80, 0x7C, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x7C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x54, 0x54, 0x00, 0x54, 0x54, 0x00, 0x50, 0xD6, 0x00, 0x1D, 0x93, 0x00, 0x33, 0x11, 0x80, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9448, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x3B, 0xFF, 0x80, 0x2C, 0x92, 0x00, 0x65, 0x11, 0x00, 0x03, 0xFF, 0x80, 0x7D, 0x11, 0x00, 0x11, 0xBB, 0x00, 0x11, 0x55, 0x00, 0x7D, 0xBB, 0x00, 0x11, 0x11, 0x00, 0x55, 0xBB, 0x00, 0x55, 0x55, 0x00, 0x51, 0xBB, 0x00, 0x1D, 0x11, 0x00, 0x31, 0x11, 0x00, 0x61, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x944A, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x39, 0xFF, 0x80, 0x2C, 0x22, 0x00, 0x64, 0x48, 0x00, 0x00, 0xFF, 0x80, 0x7D, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x7C, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x54, 0xFF, 0x80, 0x54, 0x00, 0x00, 0x51, 0xFF, 0x00, 0x1C, 0x42, 0x00, 0x30, 0x3C, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x944C, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x39, 0xFF, 0x80, 0x2D, 0x00, 0x80, 0x64, 0xFF, 0x00, 0x00, 0x52, 0x00, 0x7D, 0x94, 0x00, 0x10, 0x18, 0x00, 0x10, 0xFF, 0x00, 0x7D, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x50, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x30, 0x42, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9451, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x14, 0xFA, 0x00, 0x22, 0xA4, 0x00, 0x00, 0xAF, 0x80, 0x3E, 0xF0, 0x00, 0x08, 0x90, 0x00, 0x08, 0xF0, 0x00, 0x08, 0xA7, 0x80, 0x3E, 0xA0, 0x00, 0x08, 0xF8, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x55, 0x00, 0x0E, 0x55, 0x00, 0x30, 0x55, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9452, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0xC0, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0x80, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xFF, 0x80, 0x01, 0x30, 0x00, 0x07, 0xFC, 0x00, 0x38, 0x43, 0x80, 0x07, 0xFE, 0x00, 0x02, 0x48, 0x00, 0x01, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9453, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x39, 0x1F, 0x00, 0x29, 0x95, 0x00, 0x6C, 0x9F, 0x00, 0x00, 0x04, 0x00, 0x7C, 0x3F, 0x80, 0x10, 0x00, 0x00, 0x13, 0x9F, 0x00, 0x7C, 0x91, 0x00, 0x10, 0x9F, 0x00, 0x54, 0x90, 0x00, 0x54, 0x9F, 0x00, 0x50, 0x91, 0x00, 0x1D, 0x9F, 0x00, 0x31, 0x40, 0x00, 0x63, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9455, { 0x00, 0x00, 0x00, 0x10, 0x31, 0x80, 0x38, 0xE7, 0x00, 0x2C, 0x84, 0x00, 0x64, 0xF7, 0x80, 0x00, 0xA5, 0x00, 0x7D, 0x29, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x50, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x30, 0x42, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9459, { 0x00, 0x00, 0x00, 0x10, 0x65, 0x00, 0x3B, 0xC4, 0x80, 0x2C, 0x9F, 0x80, 0x64, 0x8A, 0x00, 0x03, 0xEA, 0x00, 0x7C, 0x93, 0x80, 0x10, 0xC8, 0x00, 0x11, 0xAF, 0x00, 0x7D, 0xA8, 0x00, 0x12, 0x8F, 0x80, 0x54, 0x00, 0x00, 0x54, 0xFF, 0x00, 0x50, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x30, 0x81, 0x00, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x945A, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x39, 0xEF, 0x80, 0x2C, 0x42, 0x00, 0x65, 0xEF, 0x80, 0x00, 0x42, 0x00, 0x7C, 0xA5, 0x00, 0x11, 0x00, 0x80, 0x10, 0xFF, 0x00, 0x7C, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x54, 0x81, 0x00, 0x54, 0xFF, 0x00, 0x50, 0x81, 0x00, 0x1C, 0xFF, 0x00, 0x30, 0x42, 0x00, 0x61, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x945B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0xA2, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0xA2, 0x00, 0x08, 0xBE, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x88, 0x00, 0x2A, 0xBE, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0xBE, 0x00, 0x08, 0xAA, 0x00, 0x0F, 0x3E, 0x00, 0x31, 0x22, 0x00, 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x945C, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x2A, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x80, 0x80, 0x20, 0xBE, 0x80, 0x7E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x7F, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x945E, { 0x00, 0x00, 0x00, 0x10, 0x91, 0x00, 0x39, 0x22, 0x00, 0x2C, 0x91, 0x00, 0x64, 0xFE, 0x00, 0x00, 0xAA, 0x00, 0x7C, 0x92, 0x00, 0x10, 0xAA, 0x00, 0x10, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x10, 0xDA, 0x00, 0x54, 0xB6, 0x00, 0x54, 0xDA, 0x00, 0x50, 0xB6, 0x00, 0x1C, 0x92, 0x80, 0x30, 0xDA, 0x80, 0x61, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x945F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x20, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0xA4, 0x80, 0x08, 0xFF, 0x80, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x4A, 0x41, 0x00, 0x6A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0x22, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9460, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x80, 0x1C, 0xC9, 0x80, 0x16, 0x9D, 0x00, 0x32, 0xD5, 0x80, 0x20, 0x54, 0x80, 0x7E, 0xDD, 0x80, 0x08, 0x95, 0x00, 0x09, 0x56, 0x80, 0x7F, 0xDF, 0x80, 0x08, 0x08, 0x00, 0x4A, 0xFF, 0x80, 0x6A, 0x2A, 0x00, 0x28, 0x2A, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0xC9, 0x80, 0x60, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9461, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x28, 0x00, 0x16, 0x2F, 0x00, 0x32, 0x28, 0x00, 0x20, 0x28, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x55, 0x00, 0x08, 0x55, 0x00, 0x7E, 0x6B, 0x00, 0x08, 0x41, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x55, 0x00, 0x28, 0x55, 0x00, 0x0E, 0x6B, 0x00, 0x38, 0x41, 0x00, 0x60, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9462, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x0F, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x90, 0x80, 0x7E, 0xFE, 0x00, 0x08, 0x90, 0x80, 0x08, 0xBF, 0x80, 0x7E, 0xA9, 0x00, 0x08, 0xBF, 0x00, 0x4A, 0xA9, 0x00, 0x6A, 0xBF, 0x00, 0x28, 0x88, 0x00, 0x0F, 0x55, 0x00, 0x38, 0x52, 0x80, 0x60, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9463, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0xA4, 0x00, 0x32, 0xFF, 0x80, 0x20, 0xA4, 0x80, 0x7E, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x08, 0xA5, 0x80, 0x7E, 0xBF, 0x00, 0x08, 0xA4, 0x00, 0x4A, 0xA4, 0x00, 0x6A, 0xBC, 0x80, 0x28, 0xE3, 0x80, 0x0E, 0x80, 0x00, 0x39, 0x55, 0x00, 0x60, 0x4A, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9468, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x38, 0x44, 0x00, 0x2D, 0xF7, 0x80, 0x64, 0xA4, 0x00, 0x00, 0xA7, 0x00, 0x7D, 0xF1, 0x00, 0x10, 0x07, 0x00, 0x11, 0xF4, 0x00, 0x7D, 0x17, 0x00, 0x11, 0xF4, 0x00, 0x55, 0x17, 0x00, 0x55, 0xF4, 0x00, 0x51, 0x17, 0x00, 0x1D, 0x14, 0x80, 0x31, 0x16, 0x80, 0x61, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x946A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x0F, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x20, 0x88, 0x80, 0x7E, 0xBE, 0x00, 0x08, 0x88, 0x80, 0x08, 0xBF, 0x80, 0x7E, 0xA9, 0x00, 0x08, 0xBF, 0x00, 0x4A, 0xA9, 0x00, 0x6A, 0xBF, 0x00, 0x28, 0x80, 0x00, 0x0F, 0x7F, 0x00, 0x38, 0x55, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x946B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x1C, 0x00, 0x77, 0xF3, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x04, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x14, 0x14, 0x00, 0x22, 0x22, 0x00, 0x5D, 0x5D, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x2A, 0x2A, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x946D, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x39, 0x29, 0x00, 0x2D, 0xEF, 0x00, 0x65, 0x29, 0x00, 0x01, 0xEF, 0x00, 0x7D, 0x11, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x11, 0x00, 0x7D, 0x7D, 0x00, 0x11, 0x55, 0x00, 0x55, 0x7D, 0x00, 0x55, 0x55, 0x00, 0x51, 0x7D, 0x00, 0x1D, 0x39, 0x00, 0x31, 0x55, 0x00, 0x61, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x946E, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x3B, 0xFF, 0x80, 0x2C, 0x82, 0x00, 0x64, 0x05, 0x00, 0x01, 0x3F, 0x80, 0x7C, 0x84, 0x00, 0x10, 0xBF, 0x80, 0x12, 0x24, 0x80, 0x7D, 0x3F, 0x80, 0x11, 0x24, 0x80, 0x54, 0x3F, 0x80, 0x54, 0xA4, 0x80, 0x50, 0x81, 0x00, 0x1D, 0x3F, 0x80, 0x31, 0x11, 0x00, 0x63, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x946F, { 0x00, 0x00, 0x00, 0x10, 0x94, 0x00, 0x38, 0x95, 0x00, 0x2D, 0x6D, 0x80, 0x65, 0x6C, 0x80, 0x00, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0xA4, 0x00, 0x11, 0xB5, 0x00, 0x7C, 0xA5, 0x00, 0x11, 0xB5, 0x00, 0x54, 0xA7, 0x00, 0x55, 0xB2, 0x00, 0x50, 0xA6, 0x00, 0x1C, 0xF6, 0x80, 0x33, 0x8B, 0x80, 0x60, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9470, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x38, 0x38, 0x00, 0x2C, 0xEE, 0x00, 0x67, 0x83, 0x80, 0x00, 0x7C, 0x00, 0x7C, 0x00, 0x00, 0x13, 0xBB, 0x80, 0x12, 0xAA, 0x80, 0x7F, 0xBB, 0x80, 0x10, 0x00, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x49, 0x00, 0x51, 0xFF, 0x00, 0x1D, 0x49, 0x00, 0x31, 0x49, 0x00, 0x61, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9471, { 0x00, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x1C, 0x48, 0x00, 0x17, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x77, 0x00, 0x08, 0x44, 0x80, 0x7E, 0xF3, 0x80, 0x08, 0x00, 0x00, 0x4A, 0xFF, 0x00, 0x6A, 0x91, 0x00, 0x28, 0xFF, 0x00, 0x0E, 0x2A, 0x00, 0x30, 0x68, 0x80, 0x60, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9472, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x64, 0xEE, 0x00, 0x00, 0xAA, 0x00, 0x7C, 0xEE, 0x00, 0x10, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x7C, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x54, 0x44, 0x00, 0x55, 0xFF, 0x80, 0x50, 0x24, 0x00, 0x1D, 0xC5, 0x00, 0x30, 0x72, 0x00, 0x61, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9475, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x22, 0x00, 0x32, 0x77, 0x00, 0x20, 0x55, 0x00, 0x7E, 0x77, 0x00, 0x08, 0x22, 0x00, 0x08, 0x24, 0x00, 0x7E, 0x7F, 0x00, 0x08, 0xC8, 0x00, 0x4A, 0x7F, 0x00, 0x6A, 0x48, 0x00, 0x28, 0x7F, 0x00, 0x0E, 0x48, 0x00, 0x38, 0x48, 0x00, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9477, { 0x00, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x38, 0x24, 0x00, 0x2C, 0x3C, 0x00, 0x64, 0x24, 0x00, 0x00, 0x3C, 0x00, 0x7C, 0x27, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0xA5, 0x00, 0x54, 0xE7, 0x00, 0x54, 0xA5, 0x00, 0x50, 0xE7, 0x00, 0x1C, 0xA5, 0x00, 0x31, 0xEF, 0x00, 0x60, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x947C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x2D, 0x49, 0x00, 0x65, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x85, 0x00, 0x13, 0x0F, 0x80, 0x11, 0x5A, 0x00, 0x7C, 0x8A, 0x00, 0x11, 0x2F, 0x00, 0x55, 0xEA, 0x00, 0x54, 0xAA, 0x00, 0x50, 0x8F, 0x00, 0x1D, 0xAA, 0x00, 0x32, 0xAA, 0x00, 0x60, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x947D, { 0x00, 0x00, 0x00, 0x09, 0x54, 0x00, 0x15, 0xFF, 0x00, 0x22, 0x44, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0xAA, 0x00, 0x08, 0xAA, 0x80, 0x09, 0x33, 0x80, 0x3E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x0E, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x947E, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x23, 0xF4, 0x00, 0x40, 0x08, 0x00, 0x29, 0xE5, 0x00, 0x10, 0x02, 0x00, 0x25, 0xE4, 0x80, 0x7C, 0x0F, 0x80, 0x11, 0xE2, 0x00, 0x55, 0x2A, 0x80, 0x55, 0xEA, 0x80, 0x10, 0x02, 0x00, 0x03, 0xE0, 0x00, 0x0C, 0x98, 0x00, 0x77, 0xF7, 0x80, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x947F, { 0x00, 0x00, 0x00, 0x2A, 0x80, 0x00, 0x1B, 0x1E, 0x00, 0x3F, 0xD2, 0x00, 0x11, 0x12, 0x80, 0x3F, 0xA3, 0x80, 0x15, 0x40, 0x00, 0x24, 0xBF, 0x00, 0x35, 0x92, 0x00, 0x24, 0x8C, 0x00, 0x3F, 0xF3, 0x80, 0x21, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x3B, 0xFB, 0x80, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9481, { 0x00, 0x00, 0x00, 0x11, 0xEF, 0x00, 0x39, 0x29, 0x00, 0x2D, 0xEF, 0x00, 0x65, 0x29, 0x00, 0x01, 0xEF, 0x00, 0x7D, 0x29, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x51, 0xFF, 0x80, 0x1C, 0x42, 0x00, 0x30, 0x3C, 0x00, 0x61, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9483, { 0x00, 0x00, 0x00, 0x11, 0xFF, 0x80, 0x39, 0x00, 0x80, 0x2D, 0xFF, 0x80, 0x65, 0x08, 0x00, 0x01, 0x6B, 0x00, 0x7D, 0x08, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x55, 0x00, 0x7D, 0x7F, 0x80, 0x11, 0x28, 0x80, 0x55, 0xFE, 0x80, 0x55, 0x52, 0x80, 0x51, 0x7E, 0x80, 0x1D, 0x14, 0x80, 0x32, 0x3E, 0x80, 0x60, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9484, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x3B, 0xFF, 0x80, 0x2C, 0x44, 0x00, 0x65, 0xEF, 0x00, 0x01, 0x29, 0x00, 0x7D, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x11, 0xEF, 0x00, 0x7D, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x55, 0x55, 0x00, 0x55, 0x7D, 0x00, 0x51, 0x55, 0x00, 0x1D, 0x7D, 0x00, 0x31, 0x39, 0x00, 0x61, 0xD7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9485, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x07, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x24, 0x00, 0x00, 0x05, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9486, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x0F, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x48, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x09, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9487, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0F, 0x7E, 0x00, 0x10, 0x04, 0x00, 0x10, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x48, 0x10, 0x00, 0x0A, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x80, 0x00, 0x0A, 0x81, 0x00, 0x0C, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9488, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x12, 0x00, 0x3E, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9489, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x948A, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x81, 0x00, 0x07, 0xC1, 0x00, 0x08, 0x11, 0x00, 0x09, 0x11, 0x00, 0x1F, 0x91, 0x00, 0x24, 0x11, 0x00, 0x04, 0x91, 0x00, 0x3F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x04, 0x91, 0x00, 0x05, 0x01, 0x00, 0x06, 0x01, 0x00, 0x04, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x948B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x10, 0x00, 0x07, 0x90, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1F, 0x18, 0x00, 0x24, 0x14, 0x00, 0x05, 0x12, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x00, 0x04, 0x90, 0x00, 0x05, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x948C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x05, 0x00, 0x00, 0x07, 0xBF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x1F, 0x0C, 0x00, 0x24, 0x08, 0x00, 0x05, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x88, 0x00, 0x05, 0x08, 0x00, 0x06, 0x08, 0x00, 0x04, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x948D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x14, 0x00, 0x48, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x948E, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x08, 0xF0, 0x00, 0x0E, 0x10, 0x00, 0x10, 0x10, 0x00, 0x20, 0x10, 0x00, 0x5E, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x948F, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x05, 0x41, 0x00, 0x07, 0xC9, 0x00, 0x08, 0x49, 0x00, 0x08, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x24, 0x49, 0x00, 0x05, 0x49, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0xC9, 0x00, 0x05, 0x49, 0x00, 0x06, 0x49, 0x00, 0x04, 0x81, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9490, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0x06, 0x00, 0x0F, 0x88, 0x00, 0x10, 0x10, 0x00, 0x12, 0x20, 0x00, 0x3F, 0x42, 0x00, 0x48, 0x06, 0x00, 0x09, 0x08, 0x00, 0x7F, 0x90, 0x00, 0x08, 0x21, 0x00, 0x08, 0x03, 0x00, 0x09, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x30, 0x00, 0x08, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9492, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFC, 0x00, 0x1E, 0x88, 0x00, 0x10, 0x88, 0x00, 0x20, 0x88, 0x00, 0x7E, 0xC8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0D, 0x09, 0x00, 0x09, 0x09, 0x00, 0x02, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9493, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0E, 0x3F, 0x00, 0x10, 0x42, 0x00, 0x10, 0x82, 0x00, 0x3E, 0x02, 0x00, 0x48, 0x42, 0x00, 0x08, 0x32, 0x00, 0x7E, 0x12, 0x00, 0x08, 0x02, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9494, { 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x08, 0xBF, 0x00, 0x0E, 0x42, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x02, 0x00, 0x49, 0x02, 0x00, 0x09, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9495, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x08, 0xC6, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9497, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0F, 0x7F, 0x00, 0x10, 0x02, 0x00, 0x10, 0xA2, 0x00, 0x3E, 0x54, 0x00, 0x48, 0x54, 0x00, 0x0A, 0x24, 0x00, 0x7F, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x83, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9499, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x14, 0x00, 0x10, 0x9E, 0x00, 0x10, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x949A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x48, 0x10, 0x00, 0x0A, 0x30, 0x00, 0x7F, 0x54, 0x00, 0x08, 0x93, 0x00, 0x09, 0x11, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x949B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x7F, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0xC4, 0x00, 0x09, 0x24, 0x00, 0x02, 0x23, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x949C, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0A, 0xFE, 0x00, 0x0F, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x84, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x84, 0x00, 0x0A, 0x84, 0x00, 0x7F, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0A, 0x80, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x949D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x11, 0x00, 0x0C, 0x11, 0x00, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x949E, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0E, 0x20, 0x00, 0x10, 0xA8, 0x00, 0x10, 0xA4, 0x00, 0x3E, 0xA3, 0x00, 0x49, 0x21, 0x00, 0x09, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x28, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x60, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x949F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1C, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x21, 0x22, 0x00, 0x3D, 0x22, 0x00, 0x51, 0x22, 0x00, 0x11, 0x22, 0x00, 0x7D, 0x52, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x8A, 0x00, 0x11, 0x02, 0x00, 0x15, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A1, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x82, 0x00, 0x10, 0x92, 0x00, 0x20, 0x92, 0x00, 0x5E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x83, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A2, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x0F, 0x02, 0x00, 0x11, 0x86, 0x00, 0x11, 0x46, 0x00, 0x3F, 0x2A, 0x00, 0x49, 0x12, 0x00, 0x09, 0x12, 0x00, 0x3F, 0x2A, 0x00, 0x09, 0x46, 0x00, 0x09, 0x86, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A3, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x0E, 0x00, 0x0F, 0xF0, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x0A, 0xA2, 0x00, 0x7F, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x98, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x94, 0x00, 0x0D, 0x24, 0x00, 0x09, 0x43, 0x00, 0x02, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A4, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x3F, 0x47, 0x00, 0x4A, 0x22, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x08, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x09, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x20, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A5, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x42, 0x00, 0x07, 0x42, 0x00, 0x08, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x1F, 0x42, 0x00, 0x24, 0x42, 0x00, 0x04, 0x42, 0x00, 0x3F, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x05, 0x42, 0x00, 0x06, 0x42, 0x00, 0x04, 0x8A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A6, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0E, 0x3E, 0x00, 0x10, 0x42, 0x00, 0x10, 0x84, 0x00, 0x3F, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x28, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x47, 0x00, 0x08, 0x82, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A7, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x42, 0x00, 0x0F, 0x7F, 0x00, 0x10, 0x82, 0x00, 0x20, 0x82, 0x00, 0x5F, 0x42, 0x00, 0x08, 0x22, 0x00, 0x08, 0x0A, 0x00, 0x3E, 0x12, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC2, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x44, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x3E, 0x94, 0x00, 0x48, 0x88, 0x00, 0x08, 0x82, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x08, 0x12, 0x00, 0x0B, 0xFA, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94A9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x42, 0x00, 0x0E, 0x7F, 0x00, 0x10, 0x82, 0x00, 0x11, 0x02, 0x00, 0x3E, 0x22, 0x00, 0x48, 0x22, 0x00, 0x08, 0x42, 0x00, 0x3E, 0x52, 0x00, 0x08, 0xFA, 0x00, 0x08, 0x0A, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94AA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x3E, 0x08, 0x00, 0x48, 0x7C, 0x00, 0x0A, 0x48, 0x00, 0x7F, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0x48, 0x00, 0x0A, 0x89, 0x00, 0x0C, 0x89, 0x00, 0x09, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94AB, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x3E, 0x22, 0x00, 0x48, 0x3F, 0x00, 0x0A, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x09, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94AC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x52, 0x00, 0x3E, 0x56, 0x00, 0x48, 0x58, 0x00, 0x08, 0x90, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x83, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94AD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x44, 0x00, 0x0F, 0x24, 0x00, 0x10, 0x24, 0x00, 0x12, 0x04, 0x00, 0x3F, 0x44, 0x00, 0x48, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x7F, 0x07, 0x00, 0x08, 0x3C, 0x00, 0x09, 0xC4, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94AE, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x1C, 0x84, 0x00, 0x20, 0x84, 0x00, 0x40, 0x84, 0x00, 0x3C, 0x84, 0x00, 0x10, 0x84, 0x00, 0x13, 0xFC, 0x00, 0x7C, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x14, 0x84, 0x00, 0x18, 0x84, 0x00, 0x10, 0x84, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94AF, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x82, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x09, 0x80, 0x00, 0x0A, 0x81, 0x00, 0x0C, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B0, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x48, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x14, 0x00, 0x09, 0x14, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x08, 0x24, 0x00, 0x1E, 0x3E, 0x00, 0x21, 0xE0, 0x00, 0x40, 0x20, 0x00, 0x1E, 0x22, 0x00, 0x08, 0x3F, 0x00, 0x09, 0xE0, 0x00, 0x7E, 0x22, 0x00, 0x08, 0x26, 0x00, 0x08, 0x18, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x29, 0x00, 0x08, 0xC5, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B2, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x48, 0x92, 0x00, 0x08, 0x9F, 0x00, 0x7E, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x90, 0x00, 0x0C, 0x92, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B3, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x20, 0x44, 0x00, 0x5E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7E, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x7C, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x12, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B5, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1C, 0x24, 0x00, 0x23, 0xFE, 0x00, 0x40, 0x20, 0x00, 0x3C, 0x70, 0x00, 0x10, 0x68, 0x00, 0x10, 0xA4, 0x00, 0x7D, 0x27, 0x00, 0x12, 0x22, 0x00, 0x10, 0xF8, 0x00, 0x14, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x3E, 0xF4, 0x00, 0x48, 0x94, 0x00, 0x08, 0x94, 0x00, 0x7F, 0x94, 0x00, 0x08, 0x94, 0x00, 0x08, 0xF4, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B7, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0xBE, 0x00, 0x3E, 0xA4, 0x00, 0x48, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x7F, 0xA4, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xBC, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0x80, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x3E, 0x50, 0x00, 0x48, 0x92, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x9A, 0x00, 0x0C, 0x94, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94B9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x0F, 0x24, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x20, 0x00, 0x48, 0x20, 0x00, 0x0A, 0x7E, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x52, 0x00, 0x08, 0x54, 0x00, 0x09, 0x94, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x94, 0x00, 0x09, 0x23, 0x00, 0x02, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94BA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x14, 0x00, 0x0F, 0x12, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0x90, 0x00, 0x48, 0x90, 0x00, 0x0A, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x8C, 0x00, 0x09, 0xA8, 0x00, 0x0A, 0xC9, 0x00, 0x0C, 0x95, 0x00, 0x08, 0x25, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94BB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0F, 0x1F, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x7F, 0x82, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94BC, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0x82, 0x00, 0x7F, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94BD, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7F, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94BE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94BF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x02, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x0C, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0E, 0xFF, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0xA0, 0x00, 0x08, 0xA8, 0x00, 0x0E, 0xFC, 0x00, 0x10, 0xA0, 0x00, 0x11, 0x20, 0x00, 0x3E, 0x24, 0x00, 0x49, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x07, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x42, 0x00, 0x0E, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x0E, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x44, 0x00, 0x3E, 0x27, 0x00, 0x48, 0x22, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x0A, 0x50, 0x00, 0x0C, 0x20, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C4, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x0E, 0x00, 0x0E, 0xF0, 0x00, 0x10, 0x80, 0x00, 0x10, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x48, 0x92, 0x00, 0x0A, 0xFF, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x54, 0x00, 0x08, 0x52, 0x00, 0x0A, 0x93, 0x00, 0x0D, 0x11, 0x00, 0x08, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C5, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x10, 0x44, 0x00, 0x20, 0x44, 0x00, 0x5E, 0x83, 0x00, 0x09, 0x00, 0x00, 0x08, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C6, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x13, 0x1F, 0x00, 0x1E, 0x52, 0x00, 0x22, 0x52, 0x00, 0x42, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x7E, 0xD2, 0x00, 0x13, 0x5A, 0x00, 0x12, 0x54, 0x00, 0x10, 0x50, 0x00, 0x14, 0x90, 0x00, 0x18, 0x90, 0x00, 0x11, 0x10, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x48, 0xFF, 0x00, 0x0A, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x0C, 0x96, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94C9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x48, 0x44, 0x00, 0x08, 0x84, 0x00, 0x7E, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x82, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94CA, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x3E, 0x42, 0x00, 0x48, 0x40, 0x00, 0x0A, 0x48, 0x00, 0x7E, 0x58, 0x00, 0x08, 0x60, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x41, 0x00, 0x0C, 0x41, 0x00, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94CB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0x12, 0x00, 0x10, 0x14, 0x00, 0x10, 0x44, 0x00, 0x3E, 0x48, 0x00, 0x48, 0x48, 0x00, 0x09, 0x52, 0x00, 0x7F, 0x51, 0x00, 0x09, 0x61, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x40, 0x00, 0x0A, 0xC2, 0x00, 0x0D, 0x42, 0x00, 0x0A, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94CC, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x80, 0x00, 0x48, 0xA0, 0x00, 0x0A, 0xA2, 0x00, 0x7F, 0xA6, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xB0, 0x00, 0x08, 0xA0, 0x00, 0x0A, 0xA1, 0x00, 0x0C, 0xA1, 0x00, 0x09, 0x1F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94CD, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x91, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x90, 0x00, 0x0A, 0xFE, 0x00, 0x7F, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x0A, 0xA8, 0x00, 0x0D, 0x24, 0x00, 0x09, 0x47, 0x00, 0x02, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94CE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x0F, 0x44, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x28, 0x00, 0x48, 0x47, 0x00, 0x09, 0x92, 0x00, 0x7F, 0x7C, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0xFC, 0x00, 0x10, 0x28, 0x00, 0x12, 0x32, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x08, 0x44, 0x00, 0x7E, 0xFE, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x3E, 0x00, 0x09, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x22, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0E, 0xFE, 0x00, 0x10, 0x24, 0x00, 0x10, 0x28, 0x00, 0x3E, 0x32, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xC4, 0x00, 0x09, 0x4C, 0x00, 0x0A, 0x50, 0x00, 0x08, 0x60, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D2, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x0E, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x3E, 0xFC, 0x00, 0x48, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7E, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x9F, 0x00, 0x0B, 0xE4, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D5, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x84, 0x00, 0x3E, 0xFE, 0x00, 0x49, 0x84, 0x00, 0x0A, 0x84, 0x00, 0x7E, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x08, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x0C, 0x00, 0x0E, 0x0A, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x49, 0x08, 0x00, 0x09, 0xEA, 0x00, 0x7F, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x09, 0x2A, 0x00, 0x0B, 0xAC, 0x00, 0x0D, 0x44, 0x00, 0x09, 0x05, 0x00, 0x02, 0x05, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D7, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x3F, 0x24, 0x00, 0x48, 0xA8, 0x00, 0x08, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D8, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x1C, 0x52, 0x00, 0x11, 0x52, 0x00, 0x21, 0x52, 0x00, 0x3E, 0x54, 0x00, 0x52, 0x52, 0x00, 0x13, 0xF2, 0x00, 0x7C, 0xD1, 0x00, 0x10, 0xD1, 0x00, 0x11, 0x51, 0x00, 0x15, 0x5A, 0x00, 0x1A, 0x54, 0x00, 0x12, 0x50, 0x00, 0x05, 0x50, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94D9, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x2E, 0x00, 0x11, 0xF0, 0x00, 0x10, 0x14, 0x00, 0x3E, 0x19, 0x00, 0x48, 0xE7, 0x00, 0x0A, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x89, 0x00, 0x0C, 0x89, 0x00, 0x09, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94DB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x92, 0x00, 0x0F, 0x52, 0x00, 0x10, 0x54, 0x00, 0x10, 0x58, 0x00, 0x3E, 0x12, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94DC, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1F, 0x02, 0x00, 0x21, 0x02, 0x00, 0x41, 0x7A, 0x00, 0x3D, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x7A, 0x00, 0x7D, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x13, 0x7A, 0x00, 0x15, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94DD, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x48, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x0B, 0x02, 0x00, 0x0D, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94DE, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x1D, 0x04, 0x00, 0x11, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x3C, 0x20, 0x00, 0x50, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x16, 0x2A, 0x00, 0x1A, 0x24, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94DF, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x02, 0x00, 0x12, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x2A, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x52, 0x00, 0x12, 0x4A, 0x00, 0x12, 0x8A, 0x00, 0x16, 0x02, 0x00, 0x1A, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x92, 0x00, 0x0F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x00, 0x00, 0x48, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x7F, 0x02, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x80, 0x00, 0x0A, 0x81, 0x00, 0x0C, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E1, { 0x00, 0x00, 0x00, 0x08, 0x11, 0x00, 0x09, 0xF9, 0x00, 0x0F, 0x11, 0x00, 0x11, 0x55, 0x00, 0x21, 0x55, 0x00, 0x1F, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x09, 0x55, 0x00, 0x09, 0x55, 0x00, 0x08, 0x45, 0x00, 0x0A, 0xA1, 0x00, 0x0C, 0x91, 0x00, 0x09, 0x15, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x0E, 0x94, 0x00, 0x10, 0xFE, 0x00, 0x11, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x48, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x30, 0x00, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x54, 0x00, 0x0C, 0x92, 0x00, 0x09, 0x13, 0x00, 0x02, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E3, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x94, 0x00, 0x0E, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x11, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x08, 0x28, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x49, 0x00, 0x0C, 0x89, 0x00, 0x09, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x06, 0x00, 0x0E, 0x38, 0x00, 0x13, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x3E, 0x8A, 0x00, 0x49, 0x3F, 0x00, 0x09, 0xC8, 0x00, 0x7E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x4A, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x80, 0x00, 0x0C, 0xC0, 0x00, 0x09, 0x23, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E5, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1E, 0x00, 0x0E, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7E, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x09, 0x20, 0x00, 0x0A, 0x48, 0x00, 0x0C, 0x84, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E7, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x0E, 0x4A, 0x00, 0x10, 0x4C, 0x00, 0x10, 0xC8, 0x00, 0x3F, 0x58, 0x00, 0x4A, 0x69, 0x00, 0x08, 0x47, 0x00, 0x7E, 0x50, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0E, 0x50, 0x00, 0x10, 0x88, 0x00, 0x11, 0x04, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x22, 0x00, 0x08, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x24, 0x00, 0x0B, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94E9, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x46, 0x00, 0x0F, 0x28, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x3E, 0x46, 0x00, 0x48, 0x92, 0x00, 0x08, 0x10, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x54, 0x00, 0x09, 0x52, 0x00, 0x0A, 0x91, 0x00, 0x0D, 0x11, 0x00, 0x08, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94EA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x10, 0x82, 0x00, 0x3F, 0x01, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94EB, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x50, 0x00, 0x0F, 0x50, 0x00, 0x10, 0x50, 0x00, 0x12, 0x52, 0x00, 0x3F, 0x56, 0x00, 0x48, 0xD8, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x50, 0x00, 0x08, 0xD8, 0x00, 0x0B, 0x54, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x91, 0x00, 0x0C, 0x91, 0x00, 0x09, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94EC, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0E, 0x7E, 0x00, 0x08, 0x82, 0x00, 0x10, 0xC4, 0x00, 0x1F, 0x28, 0x00, 0x28, 0x10, 0x00, 0x48, 0x28, 0x00, 0x3E, 0x47, 0x00, 0x09, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94ED, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x10, 0xC4, 0x00, 0x3F, 0x28, 0x00, 0x48, 0x10, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94EE, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x0F, 0x7C, 0x00, 0x10, 0x88, 0x00, 0x10, 0x12, 0x00, 0x3E, 0xFF, 0x00, 0x48, 0x12, 0x00, 0x08, 0x12, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x12, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x50, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94EF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x10, 0x88, 0x00, 0x11, 0x12, 0x00, 0x3E, 0xFF, 0x00, 0x48, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x09, 0x80, 0x00, 0x0A, 0x81, 0x00, 0x0C, 0x81, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F0, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x44, 0x00, 0x3E, 0x83, 0x00, 0x49, 0x01, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x28, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x87, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F1, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x3E, 0x50, 0x00, 0x48, 0x52, 0x00, 0x08, 0xD4, 0x00, 0x3F, 0x48, 0x00, 0x0A, 0x48, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x47, 0x00, 0x0C, 0x52, 0x00, 0x08, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x02, 0x00, 0x0E, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0x42, 0x00, 0x3E, 0x24, 0x00, 0x48, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x7E, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0A, 0x80, 0x00, 0x0C, 0x80, 0x00, 0x09, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F3, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x3E, 0x44, 0x00, 0x48, 0x42, 0x00, 0x0A, 0xFE, 0x00, 0x7F, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x09, 0x48, 0x00, 0x0A, 0x49, 0x00, 0x0C, 0x89, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x7E, 0x00, 0x1D, 0x84, 0x00, 0x20, 0x88, 0x00, 0x20, 0x10, 0x00, 0x3A, 0x22, 0x00, 0x51, 0x7F, 0x00, 0x11, 0x2A, 0x00, 0x7C, 0x2A, 0x00, 0x10, 0xAA, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x4A, 0x00, 0x16, 0x52, 0x00, 0x1A, 0x92, 0x00, 0x11, 0x2A, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F5, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x3E, 0x22, 0x00, 0x48, 0x20, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x30, 0x00, 0x0C, 0x48, 0x00, 0x08, 0x86, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F6, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x1E, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x48, 0xFC, 0x00, 0x08, 0x82, 0x00, 0x7E, 0xC6, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x90, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0xA7, 0x00, 0x08, 0xC2, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F7, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x0E, 0x82, 0x00, 0x13, 0xEF, 0x00, 0x10, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x48, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x7E, 0xAA, 0x00, 0x09, 0x2A, 0x00, 0x08, 0xAA, 0x00, 0x0A, 0x4A, 0x00, 0x0C, 0xAA, 0x00, 0x09, 0x2E, 0x00, 0x02, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x24, 0x00, 0x09, 0xFE, 0x00, 0x0E, 0x20, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x3E, 0x40, 0x00, 0x48, 0x42, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x84, 0x00, 0x09, 0x04, 0x00, 0x0A, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x24, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94F9, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x3D, 0xFF, 0x00, 0x49, 0x21, 0x00, 0x09, 0x22, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x42, 0x00, 0x0C, 0x42, 0x00, 0x08, 0x94, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94FA, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x14, 0x00, 0x0E, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x0C, 0x92, 0x00, 0x08, 0x9A, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94FC, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1D, 0xFE, 0x00, 0x20, 0x20, 0x00, 0x21, 0x24, 0x00, 0x3C, 0xA8, 0x00, 0x50, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x7C, 0x20, 0x00, 0x10, 0x70, 0x00, 0x10, 0xA8, 0x00, 0x10, 0xA8, 0x00, 0x15, 0x24, 0x00, 0x1A, 0x23, 0x00, 0x14, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94FD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x14, 0x00, 0x1C, 0x12, 0x00, 0x23, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x3D, 0x10, 0x00, 0x50, 0xD0, 0x00, 0x10, 0x50, 0x00, 0x7D, 0x08, 0x00, 0x11, 0x48, 0x00, 0x13, 0x28, 0x00, 0x15, 0x28, 0x00, 0x15, 0x48, 0x00, 0x19, 0x45, 0x00, 0x10, 0xC3, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94FE, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x12, 0x0A, 0x00, 0x1D, 0x7F, 0x00, 0x21, 0x10, 0x00, 0x20, 0x28, 0x00, 0x7C, 0x4A, 0x00, 0x13, 0x7F, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x08, 0x00, 0x11, 0x0A, 0x00, 0x11, 0xFF, 0x00, 0x15, 0x08, 0x00, 0x19, 0x08, 0x00, 0x12, 0x8B, 0x00, 0x04, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x94FF, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x11, 0x7E, 0x00, 0x1D, 0x52, 0x00, 0x21, 0x54, 0x00, 0x21, 0x48, 0x00, 0x3D, 0x54, 0x00, 0x51, 0x53, 0x00, 0x11, 0x62, 0x00, 0x7C, 0x40, 0x00, 0x10, 0x50, 0x00, 0x10, 0x14, 0x00, 0x12, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x18, 0x12, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9500, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x54, 0x00, 0x1E, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x5E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9501, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x08, 0x52, 0x00, 0x0E, 0x54, 0x00, 0x10, 0x12, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0x82, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x2C, 0x00, 0x08, 0xC2, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9502, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9503, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9504, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x11, 0xE8, 0x00, 0x3D, 0x2A, 0x00, 0x41, 0x3F, 0x00, 0x01, 0x2A, 0x00, 0x7D, 0xEA, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x7D, 0xEA, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x17, 0xFA, 0x00, 0x18, 0x12, 0x00, 0x10, 0x2A, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9505, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x3E, 0xA0, 0x00, 0x48, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x22, 0x00, 0x09, 0x32, 0x00, 0x09, 0x4E, 0x00, 0x0B, 0x86, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9506, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x50, 0x00, 0x0E, 0x52, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x3F, 0x10, 0x00, 0x48, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9507, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2C, 0x00, 0x0E, 0x4A, 0x00, 0x11, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x48, 0x00, 0x08, 0x4A, 0x00, 0x7E, 0x6A, 0x00, 0x08, 0xCC, 0x00, 0x09, 0x48, 0x00, 0x08, 0x58, 0x00, 0x0A, 0x69, 0x00, 0x0C, 0x49, 0x00, 0x09, 0x45, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9508, { 0x00, 0x00, 0x00, 0x08, 0x0C, 0x00, 0x09, 0xF0, 0x00, 0x0E, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x3E, 0x70, 0x00, 0x48, 0xA8, 0x00, 0x09, 0x27, 0x00, 0x3E, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0x4E, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x09, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9509, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0F, 0x10, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x94, 0x00, 0x48, 0xD6, 0x00, 0x09, 0x39, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x950A, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x0E, 0x00, 0x0F, 0xF0, 0x00, 0x10, 0x22, 0x00, 0x10, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x48, 0x48, 0x00, 0x08, 0x04, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x950B, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x0E, 0xC4, 0x00, 0x11, 0x28, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x6F, 0x00, 0x49, 0x92, 0x00, 0x08, 0x7C, 0x00, 0x7E, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x950C, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0E, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x44, 0x00, 0x3E, 0x28, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x950D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x10, 0x48, 0x00, 0x3E, 0x84, 0x00, 0x49, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x7E, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x0A, 0xA9, 0x00, 0x0C, 0xA9, 0x00, 0x09, 0x27, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x950E, { 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x08, 0xBF, 0x00, 0x0E, 0x42, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0xFE, 0x00, 0x49, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x0B, 0x4A, 0x00, 0x0D, 0x8A, 0x00, 0x09, 0x02, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x950F, { 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0x08, 0xBF, 0x00, 0x0E, 0x42, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x7A, 0x00, 0x49, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x7F, 0x7A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x4A, 0x00, 0x09, 0x7A, 0x00, 0x0B, 0x4A, 0x00, 0x0D, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9510, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x08, 0x28, 0x00, 0x0E, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x89, 0x00, 0x0C, 0x89, 0x00, 0x09, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9511, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x1C, 0x50, 0x00, 0x21, 0xFC, 0x00, 0x40, 0x24, 0x00, 0x3C, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x20, 0x00, 0x7D, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x62, 0x00, 0x14, 0xA2, 0x00, 0x19, 0x2A, 0x00, 0x12, 0x24, 0x00, 0x04, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9512, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x14, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x3E, 0xFC, 0x00, 0x48, 0x84, 0x00, 0x08, 0x84, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0xA4, 0x00, 0x08, 0xA8, 0x00, 0x09, 0x90, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0xA4, 0x00, 0x08, 0xC3, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9513, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0F, 0x02, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x02, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x01, 0x00, 0x0A, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x47, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9514, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0F, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x3F, 0x00, 0x00, 0x49, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x7F, 0x02, 0x00, 0x09, 0x7A, 0x00, 0x09, 0x4A, 0x00, 0x0B, 0x4A, 0x00, 0x0D, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x02, 0x0A, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9515, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0x82, 0x00, 0x1E, 0xFF, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x3F, 0x3A, 0x00, 0x52, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x7E, 0xAA, 0x00, 0x12, 0xAA, 0x00, 0x13, 0xAA, 0x00, 0x12, 0xBA, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x02, 0x00, 0x12, 0x0A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9516, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x49, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x0C, 0x82, 0x00, 0x08, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9517, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x09, 0xFC, 0x00, 0x0E, 0x28, 0x00, 0x10, 0x32, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x48, 0x84, 0x00, 0x09, 0xFE, 0x00, 0x7E, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9518, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0x20, 0x00, 0x3E, 0x22, 0x00, 0x4B, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x7E, 0x42, 0x00, 0x08, 0xFF, 0x00, 0x09, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9519, { 0x00, 0x00, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x951A, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1C, 0x8A, 0x00, 0x13, 0xFF, 0x00, 0x20, 0x88, 0x00, 0x3C, 0x8A, 0x00, 0x53, 0xFF, 0x00, 0x12, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x951B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x50, 0x00, 0x10, 0x88, 0x00, 0x3F, 0x27, 0x00, 0x4A, 0xFA, 0x00, 0x08, 0x20, 0x00, 0x7E, 0xA8, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x951D, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x7F, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x24, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x951E, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x38, 0x00, 0x0A, 0x54, 0x00, 0x0C, 0x93, 0x00, 0x09, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x951F, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x82, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x8A, 0x00, 0x08, 0xEC, 0x00, 0x09, 0x88, 0x00, 0x0A, 0x89, 0x00, 0x0C, 0xA9, 0x00, 0x08, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9521, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0E, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x3E, 0xFC, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0xAA, 0x00, 0x09, 0x2A, 0x00, 0x08, 0x52, 0x00, 0x0A, 0x92, 0x00, 0x0D, 0x22, 0x00, 0x08, 0x54, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9522, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7F, 0xBA, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x09, 0xBA, 0x00, 0x0A, 0xAA, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9523, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x11, 0x4A, 0x00, 0x1F, 0x4A, 0x00, 0x21, 0x4A, 0x00, 0x41, 0xFE, 0x00, 0x3F, 0x22, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x82, 0x00, 0x09, 0x84, 0x00, 0x08, 0x48, 0x00, 0x0A, 0x30, 0x00, 0x0C, 0x20, 0x00, 0x08, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9524, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xE0, 0x00, 0x0E, 0x20, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x3E, 0xA8, 0x00, 0x48, 0xAA, 0x00, 0x0B, 0xFF, 0x00, 0x3C, 0xA8, 0x00, 0x08, 0xA8, 0x00, 0x09, 0xFE, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x28, 0x00, 0x09, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9525, { 0x00, 0x00, 0x00, 0x08, 0x50, 0x00, 0x08, 0x50, 0x00, 0x08, 0x42, 0x00, 0x0E, 0xFF, 0x00, 0x10, 0x90, 0x00, 0x11, 0x94, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x90, 0x00, 0x08, 0x94, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x92, 0x00, 0x0C, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9526, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x22, 0x00, 0x0E, 0xFF, 0x00, 0x10, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x1E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x0B, 0x15, 0x00, 0x0C, 0x12, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9528, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x48, 0x00, 0x13, 0x88, 0x00, 0x1E, 0x10, 0x00, 0x22, 0x1F, 0x00, 0x42, 0x21, 0x00, 0x3F, 0xCA, 0x00, 0x12, 0x88, 0x00, 0x12, 0x88, 0x00, 0x7E, 0x88, 0x00, 0x12, 0x94, 0x00, 0x12, 0x94, 0x00, 0x16, 0x94, 0x00, 0x1A, 0xA2, 0x00, 0x14, 0xA2, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9529, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x24, 0x00, 0x0E, 0xA8, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFE, 0x00, 0x3E, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x08, 0x50, 0x00, 0x7E, 0x88, 0x00, 0x09, 0xFC, 0x00, 0x0A, 0x8B, 0x00, 0x08, 0x88, 0x00, 0x0A, 0xA8, 0x00, 0x0C, 0x92, 0x00, 0x08, 0x82, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x952A, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x0E, 0xFF, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x3E, 0x52, 0x00, 0x48, 0x92, 0x00, 0x08, 0xAA, 0x00, 0x7F, 0x04, 0x00, 0x08, 0x20, 0x00, 0x09, 0x94, 0x00, 0x09, 0x93, 0x00, 0x0A, 0x85, 0x00, 0x0C, 0x84, 0x00, 0x08, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x952B, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x14, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x84, 0x00, 0x3E, 0x48, 0x00, 0x48, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x952C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x12, 0x00, 0x0F, 0x56, 0x00, 0x10, 0x58, 0x00, 0x10, 0x90, 0x00, 0x3E, 0x2C, 0x00, 0x48, 0x43, 0x00, 0x09, 0x91, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x52, 0x00, 0x08, 0x56, 0x00, 0x08, 0x98, 0x00, 0x0A, 0x28, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x47, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x952D, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0E, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x11, 0x02, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x10, 0x00, 0x08, 0x14, 0x00, 0x3E, 0x9E, 0x00, 0x08, 0x90, 0x00, 0x08, 0x90, 0x00, 0x0A, 0x90, 0x00, 0x0D, 0x50, 0x00, 0x0A, 0x33, 0x00, 0x04, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x952E, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0x88, 0x00, 0x1C, 0xBE, 0x00, 0x20, 0x8A, 0x00, 0x41, 0x7F, 0x00, 0x3D, 0x0A, 0x00, 0x12, 0x3E, 0x00, 0x13, 0x88, 0x00, 0x7C, 0xBE, 0x00, 0x10, 0x88, 0x00, 0x12, 0x8A, 0x00, 0x11, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x1A, 0x88, 0x00, 0x14, 0x4B, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x952F, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0x82, 0x00, 0x20, 0x82, 0x00, 0x40, 0xFE, 0x00, 0x3E, 0x90, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFF, 0x00, 0x7E, 0x90, 0x00, 0x10, 0x92, 0x00, 0x12, 0xFF, 0x00, 0x15, 0x42, 0x00, 0x19, 0x42, 0x00, 0x12, 0x42, 0x00, 0x04, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9530, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x1C, 0x08, 0x00, 0x20, 0x30, 0x00, 0x40, 0x24, 0x00, 0x3D, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0xA0, 0x00, 0x7C, 0x44, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x54, 0x00, 0x11, 0x54, 0x00, 0x15, 0x54, 0x00, 0x19, 0x54, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9531, { 0x00, 0x00, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x1D, 0x24, 0x00, 0x22, 0x48, 0x00, 0x21, 0x24, 0x00, 0x3C, 0x92, 0x00, 0x50, 0x92, 0x00, 0x13, 0xFF, 0x00, 0x7E, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9532, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x8A, 0x00, 0x23, 0xEA, 0x00, 0x3C, 0x8A, 0x00, 0x53, 0xEA, 0x00, 0x10, 0x92, 0x00, 0x7C, 0xA6, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x14, 0x50, 0x00, 0x18, 0x48, 0x00, 0x10, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9534, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xD4, 0x00, 0x11, 0x18, 0x00, 0x11, 0x11, 0x00, 0x3F, 0x51, 0x00, 0x49, 0xAF, 0x00, 0x08, 0x44, 0x00, 0x7E, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x0A, 0x84, 0x00, 0x0C, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9535, { 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x00, 0x1C, 0x9E, 0x00, 0x22, 0xA2, 0x00, 0x21, 0xD4, 0x00, 0x3C, 0x88, 0x00, 0x50, 0x94, 0x00, 0x10, 0xA4, 0x00, 0x7D, 0xFF, 0x00, 0x12, 0x84, 0x00, 0x14, 0xA4, 0x00, 0x10, 0x94, 0x00, 0x14, 0x94, 0x00, 0x18, 0x84, 0x00, 0x10, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9536, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0E, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0x20, 0x00, 0x09, 0x54, 0x00, 0x09, 0x52, 0x00, 0x0A, 0x45, 0x00, 0x0C, 0x45, 0x00, 0x08, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9537, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xEE, 0x00, 0x0F, 0xAA, 0x00, 0x10, 0xAA, 0x00, 0x10, 0xEE, 0x00, 0x3E, 0x04, 0x00, 0x48, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x08, 0x28, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9538, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x3E, 0x00, 0x1D, 0xE0, 0x00, 0x20, 0x20, 0x00, 0x24, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x50, 0x20, 0x00, 0x10, 0xA2, 0x00, 0x7F, 0x2F, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xAE, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9539, { 0x00, 0x00, 0x00, 0x10, 0x68, 0x00, 0x13, 0x88, 0x00, 0x1C, 0x88, 0x00, 0x20, 0xA9, 0x00, 0x20, 0x9A, 0x00, 0x7F, 0xEC, 0x00, 0x10, 0x88, 0x00, 0x11, 0x88, 0x00, 0x7D, 0xC8, 0x00, 0x12, 0xA8, 0x00, 0x14, 0x94, 0x00, 0x10, 0x94, 0x00, 0x14, 0xA2, 0x00, 0x18, 0xA2, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x953A, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0E, 0x00, 0x1D, 0xF0, 0x00, 0x20, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x20, 0x00, 0x51, 0xFC, 0x00, 0x15, 0x24, 0x00, 0x7F, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x15, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x953B, { 0x00, 0x00, 0x00, 0x10, 0xC4, 0x00, 0x13, 0x3E, 0x00, 0x1E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x43, 0xA4, 0x00, 0x3E, 0x24, 0x00, 0x12, 0x43, 0x00, 0x13, 0x80, 0x00, 0x7E, 0xFE, 0x00, 0x12, 0x44, 0x00, 0x12, 0x28, 0x00, 0x13, 0x90, 0x00, 0x16, 0x28, 0x00, 0x1A, 0x44, 0x00, 0x12, 0x87, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x953C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x56, 0x00, 0x0E, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xD6, 0x00, 0x3E, 0x92, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x10, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x44, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x08, 0xC7, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x953E, { 0x00, 0x00, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xE0, 0x00, 0x0E, 0x12, 0x00, 0x10, 0x92, 0x00, 0x10, 0x54, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0xC4, 0x00, 0x08, 0xA8, 0x00, 0x0B, 0x10, 0x00, 0x0D, 0x28, 0x00, 0x0A, 0x47, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x953F, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x0A, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x22, 0x00, 0x08, 0x54, 0x00, 0x08, 0x48, 0x00, 0x0A, 0xC8, 0x00, 0x0D, 0x54, 0x00, 0x0A, 0x63, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9540, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x12, 0x00, 0x1D, 0xFF, 0x00, 0x21, 0x28, 0x00, 0x41, 0x28, 0x00, 0x3D, 0xFE, 0x00, 0x11, 0x28, 0x00, 0x11, 0x38, 0x00, 0x7D, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x44, 0x00, 0x15, 0x28, 0x00, 0x1A, 0x10, 0x00, 0x12, 0x28, 0x00, 0x04, 0x47, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9541, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x21, 0xFC, 0x00, 0x3C, 0x20, 0x00, 0x50, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x7C, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x14, 0x50, 0x00, 0x18, 0x88, 0x00, 0x11, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9542, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x54, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x38, 0x00, 0x48, 0x54, 0x00, 0x08, 0x93, 0x00, 0x7E, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x0A, 0x68, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x66, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9544, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8A, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x8A, 0x00, 0x23, 0xFE, 0x00, 0x3E, 0x88, 0x00, 0x53, 0xFF, 0x00, 0x10, 0x89, 0x00, 0x7D, 0xFF, 0x00, 0x11, 0x04, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x15, 0x24, 0x00, 0x18, 0x58, 0x00, 0x10, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9545, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x3E, 0x80, 0x00, 0x48, 0xFE, 0x00, 0x08, 0xC2, 0x00, 0x7F, 0x42, 0x00, 0x09, 0x7E, 0x00, 0x09, 0x42, 0x00, 0x0B, 0x7E, 0x00, 0x0D, 0x42, 0x00, 0x09, 0x42, 0x00, 0x02, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9546, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x11, 0xFC, 0x00, 0x3F, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x09, 0x04, 0x00, 0x7F, 0xFC, 0x00, 0x08, 0x20, 0x00, 0x08, 0x22, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x20, 0x00, 0x0C, 0x50, 0x00, 0x08, 0x8E, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9547, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x0B, 0xFF, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x83, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9549, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x21, 0xFC, 0x00, 0x21, 0x04, 0x00, 0x3D, 0x04, 0x00, 0x51, 0xFC, 0x00, 0x10, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x8A, 0x00, 0x12, 0x52, 0x00, 0x13, 0xFE, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x954A, { 0x00, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1C, 0xFC, 0x00, 0x20, 0x84, 0x00, 0x40, 0xFC, 0x00, 0x3C, 0x84, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x31, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x14, 0x84, 0x00, 0x19, 0x4C, 0x00, 0x11, 0x52, 0x00, 0x06, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x954C, { 0x00, 0x00, 0x00, 0x08, 0x50, 0x00, 0x08, 0x54, 0x00, 0x0E, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x11, 0xFC, 0x00, 0x3E, 0x90, 0x00, 0x48, 0xFC, 0x00, 0x08, 0x90, 0x00, 0x7E, 0xFF, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFC, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x4E, 0x00, 0x0C, 0x82, 0x00, 0x09, 0x14, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x954D, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x84, 0x00, 0x1D, 0xFE, 0x00, 0x21, 0x04, 0x00, 0x41, 0xFC, 0x00, 0x3D, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x7D, 0xFC, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x70, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x27, 0x00, 0x12, 0x22, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x954E, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x1C, 0x88, 0x00, 0x21, 0xFC, 0x00, 0x22, 0x03, 0x00, 0x3D, 0xFC, 0x00, 0x51, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x7C, 0x0E, 0x00, 0x13, 0xF0, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x14, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x954F, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x13, 0xBF, 0x00, 0x1E, 0x12, 0x00, 0x22, 0x12, 0x00, 0x22, 0x92, 0x00, 0x3E, 0xD2, 0x00, 0x53, 0x2A, 0x00, 0x10, 0x44, 0x00, 0x7F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9550, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x12, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFC, 0x00, 0x3E, 0x84, 0x00, 0x48, 0x84, 0x00, 0x08, 0xFC, 0x00, 0x3E, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x02, 0x00, 0x09, 0x7A, 0x00, 0x0B, 0x4A, 0x00, 0x0D, 0x7A, 0x00, 0x09, 0x02, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9551, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x14, 0x00, 0x08, 0xFE, 0x00, 0x0E, 0x44, 0x00, 0x10, 0x28, 0x00, 0x11, 0xFF, 0x00, 0x3F, 0x22, 0x00, 0x48, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x94, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9552, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x44, 0x00, 0x0F, 0x28, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x28, 0x00, 0x48, 0x46, 0x00, 0x0A, 0x82, 0x00, 0x7F, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x0C, 0xAA, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9553, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x12, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x08, 0x62, 0x00, 0x7F, 0xB4, 0x00, 0x08, 0x58, 0x00, 0x09, 0x98, 0x00, 0x08, 0x34, 0x00, 0x0A, 0x54, 0x00, 0x0D, 0x93, 0x00, 0x08, 0x52, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9554, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x09, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x12, 0x1A, 0x00, 0x3E, 0xE0, 0x00, 0x48, 0x84, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x00, 0x00, 0x0C, 0x88, 0x00, 0x09, 0x06, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9556, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x28, 0x00, 0x10, 0x2A, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0xAA, 0x00, 0x48, 0xAA, 0x00, 0x0A, 0xFE, 0x00, 0x7F, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x54, 0x00, 0x0C, 0x93, 0x00, 0x09, 0x11, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9557, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x11, 0x24, 0x00, 0x1C, 0xA8, 0x00, 0x20, 0x20, 0x00, 0x23, 0xFF, 0x00, 0x3E, 0x01, 0x00, 0x54, 0xFA, 0x00, 0x10, 0x88, 0x00, 0x7C, 0x88, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x14, 0x20, 0x00, 0x18, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9558, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x1D, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x21, 0x04, 0x00, 0x3D, 0xFC, 0x00, 0x50, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x7E, 0x52, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x14, 0x88, 0x00, 0x18, 0x70, 0x00, 0x11, 0x88, 0x00, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9559, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x22, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x50, 0x40, 0x00, 0x10, 0x84, 0x00, 0x7D, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x26, 0x00, 0x12, 0x22, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x955B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x10, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x52, 0x12, 0x00, 0x12, 0xFE, 0x00, 0x7E, 0x10, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x16, 0x92, 0x00, 0x1A, 0xFE, 0x00, 0x14, 0x92, 0x00, 0x08, 0x96, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x955C, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x3C, 0x88, 0x00, 0x20, 0x52, 0x00, 0x43, 0xFF, 0x00, 0x3C, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x7D, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x14, 0x90, 0x00, 0x18, 0x91, 0x00, 0x11, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x955D, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x14, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x88, 0x00, 0x20, 0x52, 0x00, 0x3F, 0xFF, 0x00, 0x52, 0x22, 0x00, 0x12, 0x2A, 0x00, 0x7F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x8A, 0x00, 0x16, 0x8A, 0x00, 0x1A, 0xFA, 0x00, 0x12, 0x02, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x955E, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x10, 0x90, 0x00, 0x1C, 0x92, 0x00, 0x23, 0xFF, 0x00, 0x21, 0x20, 0x00, 0x3D, 0x10, 0x00, 0x51, 0xDE, 0x00, 0x11, 0x68, 0x00, 0x7D, 0x4A, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x48, 0x00, 0x11, 0x48, 0x00, 0x16, 0x54, 0x00, 0x1A, 0x53, 0x00, 0x14, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x955F, { 0x00, 0x00, 0x00, 0x12, 0x20, 0x00, 0x11, 0x20, 0x00, 0x1C, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x53, 0xBF, 0x00, 0x12, 0x8A, 0x00, 0x7E, 0x88, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xAF, 0x00, 0x16, 0xA8, 0x00, 0x1A, 0xA8, 0x00, 0x12, 0xB8, 0x00, 0x05, 0xCF, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9561, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x28, 0x00, 0x10, 0xFE, 0x00, 0x10, 0xAA, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x0A, 0xFE, 0x00, 0x7F, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x10, 0x00, 0x0D, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9562, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x1C, 0x04, 0x00, 0x25, 0x14, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xF7, 0x00, 0x54, 0x49, 0x00, 0x15, 0x52, 0x00, 0x7D, 0x54, 0x00, 0x15, 0x54, 0x00, 0x15, 0xF4, 0x00, 0x14, 0x54, 0x00, 0x1C, 0x4A, 0x00, 0x14, 0x8A, 0x00, 0x09, 0x12, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9563, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x41, 0x54, 0x00, 0x3C, 0x88, 0x00, 0x11, 0xFC, 0x00, 0x13, 0x07, 0x00, 0x7D, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x26, 0x00, 0x12, 0xA2, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9564, { 0x00, 0x00, 0x00, 0x10, 0x50, 0x00, 0x12, 0x52, 0x00, 0x1D, 0x54, 0x00, 0x20, 0x50, 0x00, 0x27, 0xFF, 0x00, 0x3C, 0x88, 0x00, 0x50, 0x50, 0x00, 0x13, 0xFE, 0x00, 0x7C, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x14, 0x20, 0x00, 0x18, 0x50, 0x00, 0x10, 0x8E, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9565, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7C, 0x00, 0x0E, 0x88, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x48, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x7E, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9566, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x10, 0x88, 0x00, 0x1F, 0xFA, 0x00, 0x20, 0x0F, 0x00, 0x23, 0xF2, 0x00, 0x3E, 0x2A, 0x00, 0x52, 0x2A, 0x00, 0x13, 0xEA, 0x00, 0x7C, 0x0A, 0x00, 0x13, 0xE4, 0x00, 0x10, 0x44, 0x00, 0x10, 0xEA, 0x00, 0x17, 0x8A, 0x00, 0x18, 0x92, 0x00, 0x12, 0x91, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9567, { 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x11, 0x7F, 0x00, 0x1C, 0xA2, 0x00, 0x22, 0x2A, 0x00, 0x23, 0xFE, 0x00, 0x3E, 0x22, 0x00, 0x52, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x7E, 0xFA, 0x00, 0x12, 0xAA, 0x00, 0x12, 0xFA, 0x00, 0x12, 0x72, 0x00, 0x16, 0xAA, 0x00, 0x1B, 0x26, 0x00, 0x12, 0x22, 0x00, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9568, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x11, 0x4A, 0x00, 0x3E, 0xCC, 0x00, 0x48, 0x48, 0x00, 0x0B, 0xFF, 0x00, 0x7E, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xFC, 0x00, 0x0C, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9569, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x22, 0x89, 0x00, 0x25, 0x26, 0x00, 0x3C, 0x20, 0x00, 0x51, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x7D, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x15, 0xFC, 0x00, 0x19, 0x24, 0x00, 0x10, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x956A, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xBF, 0x00, 0x1C, 0xA2, 0x00, 0x20, 0xA2, 0x00, 0x20, 0xBE, 0x00, 0x3F, 0x88, 0x00, 0x52, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x7E, 0x49, 0x00, 0x13, 0xC9, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x88, 0x00, 0x14, 0x88, 0x00, 0x18, 0x8A, 0x00, 0x15, 0x7F, 0x00, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x956B, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x11, 0xD8, 0x00, 0x1C, 0x52, 0x00, 0x21, 0x4C, 0x00, 0x20, 0x88, 0x00, 0x3D, 0xFC, 0x00, 0x52, 0x02, 0x00, 0x11, 0xFD, 0x00, 0x7D, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x14, 0x88, 0x00, 0x18, 0x52, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x956C, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x13, 0xFF, 0x00, 0x1C, 0x94, 0x00, 0x20, 0xFF, 0x00, 0x21, 0x10, 0x00, 0x3F, 0xFE, 0x00, 0x51, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x7D, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x14, 0x88, 0x00, 0x18, 0x70, 0x00, 0x11, 0x8C, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x956D, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x1C, 0x20, 0x00, 0x23, 0xFF, 0x00, 0x42, 0x21, 0x00, 0x3D, 0xAC, 0x00, 0x10, 0x20, 0x00, 0x11, 0xAC, 0x00, 0x7C, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x17, 0xFE, 0x00, 0x1A, 0x22, 0x00, 0x12, 0x22, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x956F, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xFF, 0x00, 0x1E, 0x52, 0x00, 0x22, 0x52, 0x00, 0x23, 0xFE, 0x00, 0x3C, 0x80, 0x00, 0x51, 0xFE, 0x00, 0x12, 0x42, 0x00, 0x7C, 0x42, 0x00, 0x13, 0xFA, 0x00, 0x12, 0x4A, 0x00, 0x13, 0xFA, 0x00, 0x14, 0x42, 0x00, 0x18, 0x52, 0x00, 0x13, 0xFA, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9570, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x84, 0x00, 0x1F, 0xFF, 0x00, 0x22, 0x48, 0x00, 0x42, 0xFE, 0x00, 0x3E, 0x4A, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x4A, 0x00, 0x7E, 0xFE, 0x00, 0x12, 0x4A, 0x00, 0x12, 0xCC, 0x00, 0x16, 0xCC, 0x00, 0x1B, 0x4B, 0x00, 0x14, 0x48, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9571, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x14, 0x24, 0x00, 0x1F, 0xFE, 0x00, 0x20, 0x88, 0x00, 0x24, 0x52, 0x00, 0x3F, 0xFF, 0x00, 0x50, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x7F, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x15, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x12, 0x92, 0x00, 0x04, 0x85, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9572, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x20, 0xDE, 0x00, 0x3D, 0x52, 0x00, 0x53, 0xD4, 0x00, 0x16, 0x88, 0x00, 0x79, 0xFC, 0x00, 0x12, 0x03, 0x00, 0x15, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x26, 0x00, 0x12, 0x22, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9573, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x22, 0x48, 0x00, 0x23, 0xFE, 0x00, 0x3E, 0x4A, 0x00, 0x53, 0xFE, 0x00, 0x12, 0x88, 0x00, 0x7E, 0xEA, 0x00, 0x12, 0x8C, 0x00, 0x12, 0xA9, 0x00, 0x16, 0xC7, 0x00, 0x1A, 0x00, 0x00, 0x12, 0xAA, 0x00, 0x04, 0xA9, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9576, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x1C, 0x00, 0x00, 0x21, 0xDC, 0x00, 0x41, 0x54, 0x00, 0x3D, 0xDC, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x7C, 0x88, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x88, 0x00, 0x17, 0xFF, 0x00, 0x14, 0xA4, 0x00, 0x19, 0x98, 0x00, 0x16, 0xC7, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x20, 0x00, 0x04, 0x22, 0x00, 0x04, 0x14, 0x00, 0x04, 0x18, 0x00, 0x04, 0x08, 0x00, 0x07, 0xE6, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x06, 0x04, 0x00, 0x04, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x08, 0x3F, 0x00, 0x0F, 0xE1, 0x80, 0x38, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9579, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0x20, 0x00, 0x10, 0x3E, 0x00, 0x1E, 0x22, 0x00, 0x10, 0x62, 0x00, 0x10, 0x46, 0x00, 0x1E, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0C, 0x00, 0x7F, 0x08, 0x00, 0x10, 0x1C, 0x00, 0x12, 0x14, 0x00, 0x32, 0x36, 0x00, 0x27, 0x22, 0x00, 0x7D, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x957E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x10, 0x49, 0x00, 0x1E, 0x88, 0x80, 0x10, 0xFF, 0x80, 0x10, 0x88, 0x80, 0x1E, 0xDD, 0x80, 0x10, 0xAA, 0x80, 0x10, 0xDD, 0x80, 0x7E, 0x88, 0x80, 0x10, 0xDD, 0x80, 0x12, 0xAA, 0x80, 0x32, 0xDD, 0x80, 0x27, 0x88, 0x80, 0x7D, 0x88, 0x80, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x957F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x18, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x04, 0x40, 0x00, 0x04, 0x20, 0x00, 0x04, 0x10, 0x00, 0x04, 0x8E, 0x00, 0x07, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9580, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x21, 0x11, 0x00, 0x22, 0x09, 0x00, 0x2C, 0x05, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9584, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC4, 0x00, 0x4A, 0x44, 0x00, 0x4A, 0x44, 0x00, 0x7B, 0xC4, 0x00, 0x4A, 0x44, 0x00, 0x4A, 0x4E, 0x00, 0x7B, 0xCA, 0x00, 0x40, 0x4A, 0x00, 0x40, 0x4A, 0x00, 0x40, 0x4A, 0x00, 0x40, 0x5B, 0x00, 0x40, 0x51, 0x00, 0x40, 0x51, 0x00, 0x40, 0x71, 0x80, 0x41, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9587, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0xE1, 0x00, 0x20, 0xB1, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9588, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9589, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x41, 0x00, 0x22, 0x41, 0x00, 0x24, 0x41, 0x00, 0x38, 0xC1, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x958A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x958B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x21, 0x00, 0x24, 0x21, 0x00, 0x28, 0x21, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x958C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x23, 0xE1, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x29, 0x00, 0x2C, 0x19, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x958D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xF9, 0x00, 0x21, 0x01, 0x00, 0x21, 0xF1, 0x00, 0x21, 0x11, 0x00, 0x21, 0x11, 0x00, 0x22, 0x11, 0x00, 0x24, 0x61, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x958E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xF9, 0x00, 0x22, 0x01, 0x00, 0x22, 0x81, 0x00, 0x24, 0x91, 0x00, 0x25, 0x11, 0x00, 0x29, 0x39, 0x00, 0x23, 0xC9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x958F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x20, 0x00, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x00, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9591, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x27, 0xFC, 0x80, 0x20, 0x40, 0x80, 0x20, 0xE0, 0x80, 0x21, 0x50, 0x80, 0x22, 0x48, 0x80, 0x2C, 0x46, 0x80, 0x20, 0x40, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9592, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x24, 0x31, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9593, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9594, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x27, 0xFD, 0x00, 0x21, 0x11, 0x00, 0x20, 0xA1, 0x00, 0x20, 0xC1, 0x00, 0x23, 0x31, 0x00, 0x2C, 0x0D, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9596, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x20, 0x81, 0x00, 0x20, 0x89, 0x00, 0x2E, 0x99, 0x00, 0x22, 0xD1, 0x00, 0x22, 0xA1, 0x00, 0x24, 0x91, 0x00, 0x28, 0x8D, 0x00, 0x21, 0x81, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9598, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x20, 0x00, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x48, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x48, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9599, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x99, 0x00, 0x20, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x959D, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x21, 0xC1, 0x00, 0x27, 0x71, 0x00, 0x2C, 0x19, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x20, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0xB1, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x959E, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x23, 0x11, 0x00, 0x22, 0x79, 0x00, 0x27, 0xC9, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x23, 0x21, 0x00, 0x26, 0x21, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x959F, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x20, 0xD1, 0x00, 0x21, 0x51, 0x00, 0x25, 0x31, 0x00, 0x25, 0x29, 0x00, 0x2D, 0x6D, 0x00, 0x29, 0xC5, 0x00, 0x21, 0x09, 0x00, 0x23, 0x99, 0x00, 0x2E, 0xF1, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x20, 0xA1, 0x00, 0x20, 0x91, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A1, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x81, 0x00, 0x25, 0x21, 0x00, 0x26, 0x69, 0x00, 0x22, 0xD9, 0x00, 0x21, 0xB1, 0x00, 0x27, 0x61, 0x00, 0x20, 0xD1, 0x00, 0x23, 0x99, 0x00, 0x2E, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x23, 0x31, 0x00, 0x26, 0x19, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x21, 0xF9, 0x00, 0x22, 0x11, 0x00, 0x2D, 0x21, 0x00, 0x20, 0xC1, 0x00, 0x27, 0x39, 0x00, 0x3B, 0xF7, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x5F, 0x80, 0x20, 0x40, 0x80, 0x20, 0xA0, 0x80, 0x23, 0x18, 0x80, 0x2C, 0x06, 0x80, 0x21, 0xF0, 0x80, 0x20, 0x00, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x08, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x09, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x95A5, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x22, 0x49, 0x00, 0x24, 0x45, 0x00, 0x2F, 0xFF, 0x00, 0x34, 0x41, 0x00, 0x24, 0x49, 0x00, 0x24, 0x51, 0x00, 0x24, 0x65, 0x00, 0x25, 0x9D, 0x00, 0x24, 0x01, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A6, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0xC1, 0x00, 0x21, 0xE1, 0x00, 0x27, 0x39, 0x00, 0x2C, 0x0D, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x27, 0x39, 0x00, 0x2D, 0xED, 0x00, 0x28, 0xC5, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x23, 0x31, 0x00, 0x26, 0x19, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x40, 0x80, 0x27, 0xFC, 0x80, 0x20, 0x40, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x40, 0x80, 0x27, 0xFC, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x95A9, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x91, 0x00, 0x21, 0xF9, 0x00, 0x2F, 0x09, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95AB, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x28, 0x85, 0x00, 0x28, 0x85, 0x00, 0x2F, 0xF5, 0x00, 0x29, 0xC5, 0x00, 0x2A, 0xA5, 0x00, 0x2C, 0x95, 0x00, 0x28, 0x85, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95AC, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x59, 0x00, 0x25, 0xE1, 0x00, 0x27, 0x31, 0x00, 0x2C, 0x19, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x22, 0x25, 0x00, 0x2C, 0x3D, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x22, 0x11, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x23, 0x25, 0x00, 0x2E, 0x1D, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95B4, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x22, 0x11, 0x00, 0x26, 0x19, 0x00, 0x2C, 0x0D, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95B6, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95B9, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x91, 0x00, 0x27, 0xF9, 0x00, 0x2A, 0x95, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x91, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95BA, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xF9, 0x00, 0x22, 0x21, 0x00, 0x21, 0x41, 0x00, 0x20, 0x81, 0x00, 0x21, 0x41, 0x00, 0x26, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x24, 0x21, 0x00, 0x39, 0x41, 0x00, 0x26, 0x39, 0x00, 0x24, 0x09, 0x00, 0x27, 0x39, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x0B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x24, 0x11, 0x00, 0x3F, 0xE9, 0x00, 0x24, 0x45, 0x00, 0x27, 0x93, 0x00, 0x28, 0x89, 0x00, 0x28, 0x87, 0x00, 0x31, 0x19, 0x00, 0x26, 0x61, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95BD, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x7F, 0x00, 0x27, 0xC1, 0x00, 0x24, 0x41, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x41, 0x00, 0x24, 0x29, 0x00, 0x2F, 0xF9, 0x00, 0x24, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x27, 0xF1, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95BE, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x11, 0x00, 0x20, 0x49, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x41, 0x00, 0x27, 0x65, 0x00, 0x25, 0x29, 0x00, 0x27, 0x31, 0x00, 0x20, 0x11, 0x00, 0x23, 0x35, 0x00, 0x2C, 0x5D, 0x00, 0x21, 0x8B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95BF, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0xE1, 0x00, 0x2F, 0x11, 0x00, 0x24, 0xA1, 0x00, 0x2F, 0xF9, 0x00, 0x28, 0x09, 0x00, 0x2B, 0xE9, 0x00, 0x20, 0x21, 0x00, 0x21, 0x41, 0x00, 0x20, 0x81, 0x00, 0x23, 0x61, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95C3, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x89, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x26, 0x19, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95C6, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xE1, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x01, 0x00, 0x2F, 0x79, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x2F, 0x79, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x41, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95C8, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF1, 0x00, 0x20, 0x91, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x21, 0x00, 0x23, 0xF9, 0x00, 0x22, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95C9, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x25, 0x29, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x22, 0x39, 0x00, 0x28, 0xE1, 0x00, 0x24, 0x21, 0x00, 0x21, 0xFD, 0x00, 0x24, 0x21, 0x00, 0x24, 0xF9, 0x00, 0x28, 0x89, 0x00, 0x28, 0xF9, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95CB, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x28, 0xD1, 0x00, 0x25, 0xA5, 0x00, 0x23, 0x39, 0x00, 0x2C, 0x0D, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xF9, 0x00, 0x21, 0x41, 0x00, 0x27, 0x71, 0x00, 0x2C, 0x19, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95CC, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x26, 0x99, 0x00, 0x25, 0xA9, 0x00, 0x27, 0xF9, 0x00, 0x22, 0xA1, 0x00, 0x26, 0xB1, 0x00, 0x2C, 0x99, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95CD, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x91, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x51, 0x00, 0x21, 0xF9, 0x00, 0x23, 0x09, 0x00, 0x2D, 0xF9, 0x00, 0x21, 0x09, 0x00, 0x21, 0xF9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D0, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x61, 0x00, 0x27, 0xC1, 0x00, 0x24, 0x19, 0x00, 0x23, 0xF1, 0x00, 0x2A, 0x11, 0x00, 0x2B, 0xD1, 0x00, 0x2A, 0x71, 0x00, 0x2A, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x26, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D1, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x27, 0x91, 0x00, 0x24, 0xF1, 0x00, 0x24, 0x11, 0x00, 0x2F, 0xF9, 0x00, 0x21, 0xC1, 0x00, 0x22, 0xA1, 0x00, 0x2C, 0x99, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D2, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x22, 0xD1, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xF9, 0x00, 0x25, 0x29, 0x00, 0x29, 0x49, 0x00, 0x23, 0x19, 0x00, 0x2D, 0x69, 0x00, 0x21, 0x09, 0x00, 0x23, 0x19, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D3, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D4, { 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x21, 0x10, 0x80, 0x3F, 0x1F, 0x80, 0x20, 0x40, 0x80, 0x23, 0xF8, 0x80, 0x20, 0x40, 0x80, 0x2F, 0xFE, 0x80, 0x21, 0x08, 0x80, 0x27, 0xFE, 0x80, 0x20, 0x00, 0x80, 0x27, 0xFC, 0x80, 0x25, 0x24, 0x80, 0x2F, 0xFE, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x95D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x11, 0x00, 0x28, 0x91, 0x00, 0x25, 0x3F, 0x00, 0x3F, 0xED, 0x00, 0x22, 0x49, 0x00, 0x2A, 0x95, 0x00, 0x2F, 0x95, 0x00, 0x24, 0x23, 0x00, 0x28, 0x41, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D6, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x81, 0x00, 0x27, 0xFD, 0x00, 0x24, 0x15, 0x00, 0x29, 0x4D, 0x00, 0x28, 0xA5, 0x00, 0x28, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x2F, 0x89, 0x00, 0x20, 0x7D, 0x00, 0x2F, 0x89, 0x00, 0x28, 0xA9, 0x00, 0x2F, 0xA9, 0x00, 0x25, 0x09, 0x00, 0x23, 0x89, 0x00, 0x2E, 0x19, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95D9, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x22, 0x01, 0x00, 0x24, 0x41, 0x00, 0x2F, 0xFD, 0x00, 0x28, 0xA9, 0x00, 0x2F, 0xA9, 0x00, 0x28, 0x39, 0x00, 0x2F, 0x91, 0x00, 0x28, 0xB9, 0x00, 0x2F, 0xA9, 0x00, 0x30, 0x6D, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95DA, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x22, 0x7D, 0x00, 0x2F, 0x45, 0x00, 0x22, 0x7D, 0x00, 0x22, 0x45, 0x00, 0x2F, 0x7D, 0x00, 0x22, 0x45, 0x00, 0x27, 0x7D, 0x00, 0x25, 0x29, 0x00, 0x2D, 0xAD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x25, 0x11, 0x00, 0x29, 0xA5, 0x00, 0x3A, 0x49, 0x00, 0x25, 0x25, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x25, 0x00, 0x3F, 0x3D, 0x00, 0x22, 0x21, 0x00, 0x24, 0x21, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95DD, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x2F, 0xA1, 0x00, 0x28, 0xBD, 0x00, 0x2F, 0xE9, 0x00, 0x28, 0xA9, 0x00, 0x2F, 0xB9, 0x00, 0x28, 0x91, 0x00, 0x2F, 0xB9, 0x00, 0x25, 0x29, 0x00, 0x28, 0xAD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95DE, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x2F, 0x41, 0x00, 0x22, 0x7D, 0x00, 0x3F, 0xA9, 0x00, 0x28, 0xA9, 0x00, 0x2E, 0xB9, 0x00, 0x2B, 0x91, 0x00, 0x28, 0xB9, 0x00, 0x2F, 0xA9, 0x00, 0x38, 0xAD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95DF, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x23, 0x61, 0x00, 0x2E, 0x39, 0x00, 0x23, 0xE1, 0x00, 0x22, 0x21, 0x00, 0x2F, 0xF9, 0x00, 0x25, 0x29, 0x00, 0x29, 0x49, 0x00, 0x23, 0x19, 0x00, 0x2D, 0x69, 0x00, 0x23, 0x19, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E0, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x81, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x91, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x23, 0x91, 0x00, 0x22, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x21, 0x21, 0x00, 0x22, 0x17, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E1, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x2F, 0x3D, 0x00, 0x2F, 0x3D, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x27, 0xF9, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E2, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x11, 0x00, 0x2F, 0x11, 0x00, 0x29, 0x7D, 0x00, 0x29, 0x29, 0x00, 0x2F, 0x29, 0x00, 0x28, 0x7D, 0x00, 0x2F, 0x11, 0x00, 0x2D, 0xFF, 0x00, 0x35, 0x11, 0x00, 0x37, 0x11, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E4, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF1, 0x00, 0x25, 0x51, 0x00, 0x2F, 0xF9, 0x00, 0x22, 0x21, 0x00, 0x2B, 0xE9, 0x00, 0x2C, 0x99, 0x00, 0x26, 0xE1, 0x00, 0x23, 0xB1, 0x00, 0x2E, 0x99, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E5, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x21, 0x00, 0x28, 0xF9, 0x00, 0x24, 0x21, 0x00, 0x29, 0xFD, 0x00, 0x24, 0x51, 0x00, 0x21, 0xFD, 0x00, 0x2C, 0x21, 0x00, 0x25, 0xFD, 0x00, 0x24, 0x21, 0x00, 0x2B, 0xFD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E6, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x25, 0x29, 0x00, 0x27, 0xF9, 0x00, 0x25, 0x29, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E8, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95E9, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x12, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95EA, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x42, 0x00, 0x21, 0x22, 0x00, 0x22, 0x12, 0x00, 0x24, 0x12, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95EB, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x20, 0x12, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x22, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x12, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95ED, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x20, 0x42, 0x00, 0x20, 0x52, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x42, 0x00, 0x20, 0xC2, 0x00, 0x21, 0x42, 0x00, 0x22, 0x42, 0x00, 0x24, 0x42, 0x00, 0x28, 0x42, 0x00, 0x20, 0x42, 0x00, 0x21, 0x42, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95EE, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x12, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95EF, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x28, 0x02, 0x00, 0x20, 0x22, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x23, 0xFA, 0x00, 0x20, 0x0A, 0x00, 0x2F, 0xEA, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x2A, 0x00, 0x20, 0x12, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F0, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x20, 0x12, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0xA2, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F1, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x20, 0xA2, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x2F, 0xFE, 0x00, 0x20, 0x8A, 0x00, 0x20, 0xAA, 0x00, 0x20, 0x92, 0x00, 0x20, 0x86, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F2, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x21, 0xC2, 0x00, 0x22, 0xA2, 0x00, 0x24, 0x9A, 0x00, 0x28, 0x8A, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F3, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x21, 0x02, 0x00, 0x21, 0x02, 0x00, 0x21, 0x12, 0x00, 0x2F, 0xFA, 0x00, 0x21, 0x02, 0x00, 0x22, 0x42, 0x00, 0x22, 0x82, 0x00, 0x24, 0x82, 0x00, 0x25, 0x22, 0x00, 0x29, 0x12, 0x00, 0x33, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F4, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x04, 0x02, 0x00, 0x20, 0x12, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F5, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x21, 0x02, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x22, 0x00, 0x22, 0x22, 0x00, 0x21, 0x42, 0x00, 0x20, 0x82, 0x00, 0x21, 0x42, 0x00, 0x22, 0x32, 0x00, 0x24, 0x12, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F6, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x21, 0x02, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x23, 0xE2, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x2A, 0x00, 0x24, 0x3A, 0x00, 0x28, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F7, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x21, 0x02, 0x00, 0x20, 0x82, 0x00, 0x22, 0x42, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x06, 0x00, 0x32, 0x06, 0x00, 0x22, 0x12, 0x00, 0x22, 0x12, 0x00, 0x21, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F8, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x20, 0x12, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95F9, { 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x1B, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x21, 0x02, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xB2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95FA, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x20, 0xA2, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x20, 0xA2, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95FB, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x20, 0x12, 0x00, 0x2F, 0xFA, 0x00, 0x22, 0x22, 0x00, 0x23, 0xE2, 0x00, 0x22, 0x22, 0x00, 0x23, 0xE2, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x22, 0x00, 0x20, 0x22, 0x00, 0x20, 0x2A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95FC, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x28, 0x42, 0x00, 0x24, 0x52, 0x00, 0x23, 0xFA, 0x00, 0x20, 0x42, 0x00, 0x2C, 0x42, 0x00, 0x24, 0xA2, 0x00, 0x24, 0x9A, 0x00, 0x25, 0x0A, 0x00, 0x26, 0x02, 0x00, 0x29, 0xFE, 0x00, 0x30, 0x02, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95FD, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x92, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x82, 0x00, 0x20, 0x92, 0x00, 0x20, 0xFA, 0x00, 0x2F, 0x8A, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x95FE, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x20, 0x22, 0x00, 0x23, 0xF2, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x23, 0xE2, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9600, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x08, 0x02, 0x00, 0x22, 0xA2, 0x00, 0x22, 0x92, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFA, 0x00, 0x2F, 0x82, 0x00, 0x34, 0x92, 0x00, 0x24, 0x62, 0x00, 0x24, 0x42, 0x00, 0x24, 0xA2, 0x00, 0x25, 0x2A, 0x00, 0x24, 0x1A, 0x00, 0x24, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9601, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x25, 0x02, 0x00, 0x21, 0x02, 0x00, 0x23, 0xF2, 0x00, 0x26, 0x22, 0x00, 0x29, 0x42, 0x00, 0x20, 0x82, 0x00, 0x23, 0x62, 0x00, 0x2C, 0x1E, 0x00, 0x30, 0x0A, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xFA, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9602, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x21, 0x02, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x21, 0x22, 0x00, 0x22, 0x42, 0x00, 0x27, 0x92, 0x00, 0x21, 0x22, 0x00, 0x22, 0x42, 0x00, 0x24, 0xC2, 0x00, 0x29, 0x32, 0x00, 0x22, 0x12, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9603, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x2F, 0xFA, 0x00, 0x28, 0x8A, 0x00, 0x28, 0xAA, 0x00, 0x2F, 0xFA, 0x00, 0x28, 0x8A, 0x00, 0x29, 0xCA, 0x00, 0x2A, 0xAA, 0x00, 0x2C, 0x9A, 0x00, 0x28, 0x8A, 0x00, 0x2F, 0xFA, 0x00, 0x28, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9604, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x21, 0x02, 0x00, 0x23, 0xE2, 0x00, 0x24, 0x42, 0x00, 0x28, 0x92, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x7A, 0x00, 0x20, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9605, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x28, 0x02, 0x00, 0x22, 0x22, 0x00, 0x21, 0x42, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x25, 0x52, 0x00, 0x21, 0x42, 0x00, 0x21, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x24, 0x3A, 0x00, 0x28, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9606, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x21, 0x02, 0x00, 0x20, 0x92, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x25, 0x0A, 0x00, 0x24, 0x92, 0x00, 0x24, 0x62, 0x00, 0x25, 0x22, 0x00, 0x26, 0x1A, 0x00, 0x24, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9608, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x52, 0x00, 0x20, 0x4A, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x42, 0x00, 0x2F, 0x42, 0x00, 0x29, 0x4A, 0x00, 0x29, 0x2A, 0x00, 0x29, 0x32, 0x00, 0x2F, 0x22, 0x00, 0x20, 0x2A, 0x00, 0x3F, 0x5A, 0x00, 0x20, 0x8A, 0x00, 0x21, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9609, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x20, 0x92, 0x00, 0x2F, 0xFA, 0x00, 0x21, 0x42, 0x00, 0x22, 0x22, 0x00, 0x24, 0x92, 0x00, 0x2F, 0xFE, 0x00, 0x34, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x8A, 0x00, 0x20, 0x7A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x960A, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x2F, 0xFA, 0x00, 0x28, 0x0A, 0x00, 0x2F, 0xFA, 0x00, 0x28, 0x0A, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x960B, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x21, 0x12, 0x00, 0x26, 0x7A, 0x00, 0x24, 0x12, 0x00, 0x27, 0x72, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x22, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x24, 0x3A, 0x00, 0x28, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x960C, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x12, 0x00, 0x20, 0x7A, 0x00, 0x2F, 0x82, 0x00, 0x24, 0x92, 0x00, 0x22, 0xA2, 0x00, 0x2F, 0xFE, 0x00, 0x28, 0x06, 0x00, 0x33, 0xEA, 0x00, 0x22, 0x22, 0x00, 0x21, 0x42, 0x00, 0x20, 0x82, 0x00, 0x23, 0x62, 0x00, 0x2C, 0x1A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x960D, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x82, 0x00, 0x27, 0xFA, 0x00, 0x24, 0x42, 0x00, 0x25, 0x2A, 0x00, 0x26, 0x1A, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xFA, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x960E, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x25, 0x02, 0x00, 0x21, 0x02, 0x00, 0x23, 0xE2, 0x00, 0x24, 0x42, 0x00, 0x28, 0x92, 0x00, 0x27, 0x7A, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0x72, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x960F, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0xD2, 0x00, 0x24, 0x52, 0x00, 0x24, 0x8A, 0x00, 0x27, 0x46, 0x00, 0x25, 0x32, 0x00, 0x25, 0x12, 0x00, 0x29, 0x02, 0x00, 0x29, 0x42, 0x00, 0x33, 0x32, 0x00, 0x20, 0x12, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9610, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x28, 0x02, 0x00, 0x22, 0x22, 0x00, 0x21, 0x42, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9611, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0D, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x20, 0x8A, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x2F, 0xFA, 0x00, 0x2C, 0x9A, 0x00, 0x2A, 0xAA, 0x00, 0x28, 0x8A, 0x00, 0x2F, 0xFA, 0x00, 0x21, 0xC2, 0x00, 0x22, 0xA2, 0x00, 0x24, 0x9A, 0x00, 0x28, 0x8A, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9612, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x20, 0xA2, 0x00, 0x3F, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x23, 0x62, 0x00, 0x2C, 0x1A, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9614, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x06, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x28, 0x32, 0x00, 0x25, 0xC2, 0x00, 0x20, 0x42, 0x00, 0x30, 0x52, 0x00, 0x2B, 0xFA, 0x00, 0x20, 0x42, 0x00, 0x24, 0x52, 0x00, 0x29, 0xFA, 0x00, 0x39, 0x12, 0x00, 0x29, 0x12, 0x00, 0x29, 0xF2, 0x00, 0x29, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9615, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x42, 0x00, 0x2F, 0x52, 0x00, 0x29, 0x66, 0x00, 0x25, 0x4A, 0x00, 0x22, 0x32, 0x00, 0x27, 0xF2, 0x00, 0x38, 0x8E, 0x00, 0x20, 0x82, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x21, 0x62, 0x00, 0x22, 0x1A, 0x00, 0x2C, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9616, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x82, 0x00, 0x2F, 0xFA, 0x00, 0x21, 0x02, 0x00, 0x22, 0x22, 0x00, 0x27, 0xF2, 0x00, 0x20, 0x02, 0x00, 0x27, 0xF2, 0x00, 0x25, 0x52, 0x00, 0x25, 0x52, 0x00, 0x25, 0x52, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9617, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x2F, 0xFA, 0x00, 0x20, 0x82, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x27, 0xF2, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x22, 0x00, 0x24, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9619, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x28, 0xA2, 0x00, 0x25, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x22, 0x4A, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA2, 0x00, 0x2F, 0xA2, 0x00, 0x2A, 0x22, 0x00, 0x22, 0x52, 0x00, 0x24, 0x52, 0x00, 0x28, 0x8A, 0x00, 0x20, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x961A, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x0B, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x2E, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3F, 0x7E, 0x00, 0x29, 0x8A, 0x00, 0x2F, 0x4A, 0x00, 0x29, 0x52, 0x00, 0x2F, 0x52, 0x00, 0x29, 0x22, 0x00, 0x3F, 0x52, 0x00, 0x21, 0x8E, 0x00, 0x21, 0x02, 0x00, 0x21, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x961C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x961D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x02, 0x10, 0x00, 0x02, 0x30, 0x00, 0x02, 0x20, 0x00, 0x02, 0x60, 0x00, 0x02, 0x40, 0x00, 0x02, 0x20, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x70, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x961E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x26, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x2C, 0x11, 0x00, 0x28, 0x11, 0x00, 0x24, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x2E, 0x23, 0x00, 0x20, 0x22, 0x00, 0x20, 0x62, 0x00, 0x20, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x961F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x28, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x22, 0x50, 0x00, 0x22, 0x50, 0x00, 0x22, 0x50, 0x00, 0x34, 0x88, 0x00, 0x28, 0x88, 0x00, 0x21, 0x04, 0x00, 0x22, 0x03, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9621, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x0F, 0x00, 0x22, 0xF0, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9622, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x44, 0x00, 0x00, 0x4C, 0x48, 0x00, 0x48, 0x48, 0x00, 0x58, 0x48, 0x00, 0x50, 0x48, 0x00, 0x48, 0x48, 0x00, 0x44, 0x48, 0x00, 0x44, 0x48, 0x00, 0x44, 0x48, 0x00, 0x44, 0x48, 0x00, 0x5C, 0xC8, 0x00, 0x40, 0x89, 0x00, 0x41, 0x89, 0x00, 0x43, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9624, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x79, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x26, 0x00, 0x59, 0x3A, 0x00, 0x51, 0x62, 0x00, 0x51, 0xA2, 0x00, 0x4F, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x26, 0x00, 0x59, 0x20, 0x00, 0x41, 0x00, 0x00, 0x41, 0x01, 0x00, 0x41, 0x83, 0x00, 0x40, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9625, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x48, 0x21, 0x00, 0x57, 0xA3, 0x00, 0x50, 0xB6, 0x00, 0x50, 0xB4, 0x00, 0x48, 0xA8, 0x00, 0x49, 0xA8, 0x00, 0x49, 0x2C, 0x00, 0x49, 0x24, 0x00, 0x5B, 0x26, 0x00, 0x42, 0x22, 0x00, 0x46, 0x23, 0x00, 0x40, 0x20, 0x00, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9626, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x22, 0x00, 0x49, 0x22, 0x00, 0x59, 0x26, 0x00, 0x51, 0x24, 0x00, 0x53, 0x2C, 0x00, 0x4A, 0x20, 0x00, 0x48, 0x70, 0x00, 0x48, 0x50, 0x00, 0x48, 0x50, 0x00, 0x58, 0xD8, 0x00, 0x40, 0x88, 0x00, 0x41, 0x8C, 0x00, 0x43, 0x06, 0x00, 0x46, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9628, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x45, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x49, 0x3E, 0x00, 0x59, 0x22, 0x00, 0x51, 0x22, 0x00, 0x49, 0x22, 0x00, 0x45, 0x22, 0x00, 0x45, 0x22, 0x00, 0x45, 0x26, 0x00, 0x45, 0x20, 0x00, 0x5D, 0x20, 0x00, 0x41, 0x21, 0x00, 0x42, 0x33, 0x00, 0x40, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x962A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x80, 0x00, 0x22, 0x80, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFF, 0x00, 0x22, 0xC2, 0x00, 0x22, 0xA2, 0x00, 0x22, 0xA4, 0x00, 0x22, 0x94, 0x00, 0x22, 0x88, 0x00, 0x22, 0x88, 0x00, 0x22, 0x94, 0x00, 0x2D, 0x22, 0x00, 0x21, 0x41, 0x00, 0x22, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x962C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x58, 0x00, 0x00, 0x50, 0x00, 0x00, 0x50, 0xF8, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x48, 0x88, 0x00, 0x58, 0x88, 0x00, 0x41, 0x88, 0x00, 0x41, 0x09, 0x00, 0x43, 0x09, 0x00, 0x46, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x962E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x38, 0x84, 0x00, 0x20, 0x84, 0x80, 0x21, 0x07, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x962F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x48, 0x90, 0x00, 0x58, 0x90, 0x00, 0x50, 0x9E, 0x00, 0x48, 0x90, 0x00, 0x44, 0x90, 0x00, 0x44, 0x90, 0x00, 0x44, 0x90, 0x00, 0x44, 0x90, 0x00, 0x5C, 0x90, 0x00, 0x40, 0x90, 0x00, 0x43, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9631, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x7C, 0x44, 0x00, 0x44, 0x44, 0x00, 0x4C, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x58, 0x44, 0x00, 0x50, 0x44, 0x00, 0x48, 0x44, 0x00, 0x44, 0x44, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x44, 0x00, 0x44, 0x44, 0x00, 0x5C, 0xC4, 0x00, 0x40, 0x84, 0x00, 0x41, 0x84, 0x00, 0x43, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9632, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x28, 0x20, 0x00, 0x24, 0x20, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3C, 0x42, 0x00, 0x20, 0x82, 0x00, 0x21, 0x04, 0x00, 0x26, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9633, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x26, 0x41, 0x00, 0x2C, 0x41, 0x00, 0x28, 0x41, 0x00, 0x24, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x2E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9634, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x42, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x28, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x24, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x34, 0x42, 0x00, 0x28, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x0A, 0x00, 0x22, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9635, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x42, 0x00, 0x27, 0xFF, 0x00, 0x28, 0x40, 0x00, 0x28, 0x50, 0x00, 0x30, 0x90, 0x00, 0x28, 0x94, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x34, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9636, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x50, 0x00, 0x28, 0x50, 0x00, 0x28, 0x88, 0x00, 0x31, 0x07, 0x00, 0x2A, 0x8A, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x34, 0x88, 0x00, 0x28, 0x88, 0x00, 0x20, 0x88, 0x00, 0x20, 0x88, 0x00, 0x21, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9637, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFE, 0x00, 0x44, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x48, 0x10, 0x00, 0x58, 0x90, 0x00, 0x50, 0x90, 0x00, 0x48, 0x9E, 0x00, 0x44, 0x90, 0x00, 0x44, 0x90, 0x00, 0x44, 0x90, 0x00, 0x44, 0x90, 0x00, 0x5C, 0x90, 0x00, 0x40, 0x90, 0x00, 0x43, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9638, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x1C, 0x00, 0x49, 0xF0, 0x00, 0x49, 0x00, 0x00, 0x59, 0xFF, 0x00, 0x51, 0x01, 0x00, 0x51, 0xFF, 0x00, 0x49, 0x00, 0x00, 0x49, 0x7E, 0x00, 0x49, 0x06, 0x00, 0x49, 0x0C, 0x00, 0x5B, 0x18, 0x00, 0x42, 0x30, 0x00, 0x42, 0x61, 0x00, 0x46, 0x41, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9639, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x58, 0x20, 0x00, 0x50, 0x20, 0x00, 0x50, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x48, 0x40, 0x00, 0x58, 0xC4, 0x00, 0x40, 0x84, 0x00, 0x40, 0xBE, 0x00, 0x41, 0xE2, 0x00, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x963A, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x1C, 0x00, 0x49, 0xF0, 0x00, 0x49, 0x10, 0x00, 0x59, 0x10, 0x00, 0x51, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x49, 0x10, 0x00, 0x49, 0x10, 0x00, 0x49, 0x18, 0x00, 0x49, 0x08, 0x00, 0x59, 0xC8, 0x00, 0x47, 0x0C, 0x00, 0x40, 0x05, 0x00, 0x47, 0xF7, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x963B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x2C, 0x82, 0x00, 0x20, 0x82, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x963C, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x44, 0x80, 0x00, 0x4D, 0xFF, 0x00, 0x59, 0x20, 0x00, 0x53, 0x20, 0x00, 0x48, 0x20, 0x00, 0x44, 0x3E, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x20, 0x00, 0x44, 0x3E, 0x00, 0x5C, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x963D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0x10, 0x00, 0x4C, 0x10, 0x00, 0x58, 0x1F, 0x00, 0x50, 0x10, 0x00, 0x48, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0x82, 0x00, 0x5C, 0x82, 0x00, 0x40, 0x82, 0x00, 0x40, 0x82, 0x00, 0x40, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x963F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x02, 0x00, 0x24, 0x02, 0x00, 0x28, 0x02, 0x00, 0x24, 0xF2, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0xF2, 0x00, 0x22, 0x92, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x2C, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9640, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x28, 0x80, 0x80, 0x24, 0x00, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x23, 0x80, 0x22, 0x3C, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x80, 0x2C, 0x20, 0x80, 0x20, 0x3F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9641, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x80, 0x00, 0x44, 0x80, 0x00, 0x4D, 0xFF, 0x00, 0x59, 0x00, 0x00, 0x53, 0x10, 0x00, 0x48, 0x96, 0x00, 0x44, 0x9A, 0x00, 0x44, 0xB2, 0x00, 0x44, 0xD2, 0x00, 0x45, 0x96, 0x00, 0x44, 0x90, 0x00, 0x5C, 0x90, 0x00, 0x40, 0x81, 0x00, 0x40, 0xC3, 0x00, 0x40, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9642, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x89, 0x00, 0x22, 0x88, 0x00, 0x22, 0xFF, 0x00, 0x22, 0xA1, 0x00, 0x22, 0xA2, 0x00, 0x22, 0x92, 0x00, 0x22, 0x94, 0x00, 0x22, 0x88, 0x00, 0x2C, 0x8C, 0x00, 0x21, 0x14, 0x00, 0x21, 0x22, 0x00, 0x22, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9644, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x24, 0xC2, 0x00, 0x25, 0x7F, 0x80, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x52, 0x00, 0x22, 0x4A, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x2C, 0x42, 0x00, 0x20, 0x42, 0x00, 0x20, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9645, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x28, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x22, 0x10, 0x00, 0x22, 0x54, 0x00, 0x22, 0x52, 0x00, 0x34, 0x91, 0x00, 0x29, 0x11, 0x00, 0x20, 0x10, 0x00, 0x20, 0x50, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9646, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x14, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x28, 0x10, 0x00, 0x24, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x34, 0x92, 0x00, 0x28, 0x92, 0x00, 0x20, 0x92, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9647, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x50, 0x00, 0x22, 0x48, 0x00, 0x24, 0x48, 0x00, 0x24, 0x42, 0x00, 0x2B, 0xFF, 0x00, 0x24, 0x50, 0x00, 0x24, 0x50, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x32, 0x94, 0x00, 0x2D, 0x19, 0x00, 0x21, 0x11, 0x00, 0x22, 0x31, 0x00, 0x22, 0x4F, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9648, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x22, 0x00, 0x2B, 0xFF, 0x00, 0x28, 0x40, 0x00, 0x30, 0x50, 0x00, 0x28, 0x90, 0x00, 0x25, 0x14, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x34, 0x94, 0x00, 0x28, 0x92, 0x00, 0x21, 0x13, 0x00, 0x22, 0x11, 0x00, 0x20, 0x50, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9649, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFC, 0x00, 0x24, 0x08, 0x00, 0x24, 0x10, 0x00, 0x28, 0x20, 0x00, 0x28, 0x58, 0x00, 0x30, 0x86, 0x00, 0x2B, 0x02, 0x00, 0x28, 0x08, 0x00, 0x25, 0xFC, 0x00, 0x24, 0x20, 0x00, 0x34, 0x20, 0x00, 0x28, 0x20, 0x00, 0x20, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x964B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x25, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x55, 0x00, 0x25, 0x63, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x25, 0x43, 0x00, 0x39, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x964C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x24, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x21, 0x41, 0x00, 0x21, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x21, 0x41, 0x00, 0x21, 0x41, 0x00, 0x2E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x964D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x24, 0xC2, 0x00, 0x29, 0x24, 0x00, 0x26, 0x18, 0x00, 0x22, 0x76, 0x00, 0x23, 0x89, 0x80, 0x22, 0x08, 0x00, 0x23, 0xFF, 0x00, 0x22, 0x88, 0x00, 0x22, 0x88, 0x00, 0x2D, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x964F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x45, 0xFF, 0x00, 0x4C, 0x20, 0x00, 0x48, 0x20, 0x00, 0x58, 0x7E, 0x00, 0x50, 0x42, 0x00, 0x48, 0xC2, 0x00, 0x45, 0x7E, 0x00, 0x44, 0x42, 0x00, 0x44, 0x42, 0x00, 0x44, 0x7E, 0x00, 0x5C, 0x42, 0x00, 0x40, 0x42, 0x00, 0x40, 0x42, 0x00, 0x40, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9650, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x22, 0x82, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x91, 0x00, 0x22, 0x92, 0x00, 0x22, 0x8C, 0x00, 0x22, 0x88, 0x00, 0x3C, 0x84, 0x00, 0x20, 0xFA, 0x00, 0x23, 0x81, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9652, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x78, 0x7C, 0x00, 0x48, 0x88, 0x00, 0x49, 0x10, 0x00, 0x5B, 0xFF, 0x00, 0x51, 0x00, 0x00, 0x51, 0x00, 0x00, 0x51, 0x7C, 0x00, 0x49, 0x44, 0x00, 0x49, 0x44, 0x00, 0x49, 0x44, 0x00, 0x49, 0x4C, 0x00, 0x59, 0x40, 0x00, 0x41, 0x41, 0x00, 0x42, 0x63, 0x00, 0x40, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9654, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x58, 0x40, 0x00, 0x50, 0xC0, 0x00, 0x51, 0x88, 0x00, 0x48, 0xD8, 0x00, 0x48, 0x30, 0x00, 0x48, 0x64, 0x00, 0x48, 0xCC, 0x00, 0x5B, 0x98, 0x00, 0x40, 0x30, 0x00, 0x40, 0x6C, 0x00, 0x40, 0xC6, 0x00, 0x43, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9655, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x24, 0x00, 0x2B, 0xFE, 0x00, 0x28, 0x20, 0x00, 0x31, 0x24, 0x00, 0x28, 0xA8, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x34, 0x50, 0x00, 0x28, 0x50, 0x00, 0x20, 0x88, 0x00, 0x21, 0x04, 0x00, 0x22, 0x07, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9656, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x79, 0x84, 0x00, 0x49, 0x04, 0x00, 0x4B, 0xFE, 0x00, 0x58, 0x92, 0x00, 0x50, 0x90, 0x00, 0x51, 0x9F, 0x00, 0x4B, 0x40, 0x00, 0x48, 0x7C, 0x00, 0x48, 0xC4, 0x00, 0x49, 0x8C, 0x00, 0x5B, 0x58, 0x00, 0x40, 0x30, 0x00, 0x40, 0x78, 0x00, 0x40, 0xCC, 0x00, 0x43, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9657, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x52, 0x00, 0x22, 0xD3, 0x00, 0x26, 0x91, 0x00, 0x24, 0x10, 0x00, 0x2C, 0xFF, 0x00, 0x28, 0x81, 0x00, 0x24, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x2E, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9658, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x49, 0x24, 0x00, 0x59, 0x24, 0x00, 0x52, 0x48, 0x00, 0x52, 0x48, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x48, 0x00, 0x00, 0x4B, 0xFE, 0x00, 0x58, 0x20, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x47, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x965B, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x3C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x28, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0xF8, 0x80, 0x27, 0x8F, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x965C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x25, 0x55, 0x00, 0x26, 0x38, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x28, 0x00, 0x38, 0x28, 0x00, 0x20, 0x44, 0x00, 0x20, 0x82, 0x00, 0x23, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x965D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x25, 0x55, 0x00, 0x26, 0x38, 0x80, 0x24, 0x10, 0x00, 0x24, 0x28, 0x00, 0x24, 0x28, 0x00, 0x24, 0x44, 0x00, 0x38, 0x82, 0x00, 0x21, 0x01, 0x00, 0x22, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x965E, { 0x00, 0x00, 0x00, 0x3C, 0x34, 0x00, 0x25, 0xC4, 0x00, 0x24, 0x44, 0x00, 0x28, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x84, 0x00, 0x25, 0x14, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x20, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x965F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x90, 0x00, 0x24, 0x9F, 0x00, 0x28, 0x90, 0x00, 0x24, 0x90, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x90, 0x00, 0x24, 0x91, 0x00, 0x25, 0x11, 0x00, 0x26, 0x12, 0x00, 0x2C, 0x34, 0x00, 0x20, 0x08, 0x00, 0x20, 0x30, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9661, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x44, 0xFE, 0x00, 0x4C, 0x10, 0x00, 0x48, 0x10, 0x00, 0x58, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x44, 0x10, 0x00, 0x44, 0x90, 0x00, 0x44, 0x9E, 0x00, 0x44, 0x90, 0x00, 0x5D, 0xD0, 0x00, 0x41, 0x50, 0x00, 0x43, 0x30, 0x00, 0x46, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9662, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x25, 0x00, 0x80, 0x28, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x2C, 0x84, 0x00, 0x20, 0x84, 0x80, 0x21, 0x07, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9663, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x28, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x24, 0x10, 0x00, 0x3B, 0xFF, 0x80, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9664, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x28, 0x00, 0x22, 0x44, 0x00, 0x24, 0x82, 0x00, 0x25, 0x01, 0x80, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x2C, 0x92, 0x00, 0x21, 0x11, 0x00, 0x22, 0x10, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9665, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x7E, 0x00, 0x26, 0x42, 0x00, 0x24, 0xC6, 0x00, 0x2D, 0x8C, 0x00, 0x28, 0x08, 0x00, 0x24, 0x9F, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x91, 0x00, 0x22, 0x9F, 0x00, 0x2E, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9666, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x20, 0x00, 0x47, 0xFF, 0x00, 0x4C, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x58, 0x20, 0x00, 0x53, 0xFF, 0x00, 0x50, 0x40, 0x00, 0x48, 0x44, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0x84, 0x00, 0x49, 0xA4, 0x00, 0x59, 0x34, 0x00, 0x43, 0x14, 0x00, 0x46, 0x04, 0x00, 0x40, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9667, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3D, 0xFE, 0x00, 0x25, 0x04, 0x00, 0x25, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x29, 0x04, 0x00, 0x31, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x29, 0x24, 0x00, 0x24, 0x20, 0x00, 0x25, 0xFC, 0x00, 0x34, 0x20, 0x00, 0x28, 0x20, 0x00, 0x20, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9668, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x7C, 0x00, 0x28, 0x02, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x34, 0x92, 0x00, 0x28, 0x28, 0x00, 0x20, 0x24, 0x00, 0x20, 0x42, 0x00, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9669, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x50, 0x00, 0x28, 0x88, 0x00, 0x29, 0x17, 0x00, 0x32, 0xFA, 0x00, 0x28, 0x00, 0x00, 0x25, 0x24, 0x00, 0x25, 0x24, 0x00, 0x24, 0xA4, 0x00, 0x34, 0xA4, 0x00, 0x28, 0xA8, 0x00, 0x20, 0xA8, 0x00, 0x20, 0x12, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x966A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x28, 0x82, 0x00, 0x24, 0x44, 0x00, 0x22, 0x44, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFE, 0x00, 0x22, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x966C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x4A, 0x40, 0x00, 0x4A, 0x40, 0x00, 0x5A, 0x7E, 0x00, 0x53, 0xD2, 0x00, 0x52, 0x52, 0x00, 0x4A, 0x56, 0x00, 0x4A, 0x54, 0x00, 0x4B, 0xDC, 0x00, 0x4A, 0x48, 0x00, 0x5A, 0x48, 0x00, 0x42, 0x5C, 0x00, 0x43, 0xD4, 0x00, 0x46, 0x66, 0x00, 0x40, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x966E, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7C, 0x66, 0x00, 0x44, 0x44, 0x00, 0x4C, 0xFF, 0x00, 0x49, 0x88, 0x00, 0x5A, 0x88, 0x00, 0x50, 0x88, 0x00, 0x48, 0xFE, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0x88, 0x00, 0x44, 0xFE, 0x00, 0x5C, 0x88, 0x00, 0x40, 0x88, 0x00, 0x40, 0x88, 0x00, 0x40, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9670, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x44, 0x00, 0x28, 0x82, 0x00, 0x27, 0x7D, 0x80, 0x24, 0x00, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x24, 0x08, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x38, 0x42, 0x00, 0x20, 0x8F, 0x00, 0x23, 0xF0, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9672, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x7C, 0x38, 0x00, 0x45, 0xE0, 0x00, 0x4C, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x59, 0x24, 0x00, 0x51, 0x24, 0x00, 0x51, 0x24, 0x00, 0x4F, 0xFF, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x5B, 0xFE, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x47, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9673, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x28, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x25, 0x11, 0x00, 0x24, 0x38, 0x00, 0x38, 0x54, 0x00, 0x20, 0x92, 0x00, 0x21, 0x11, 0x00, 0x22, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9674, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x40, 0x00, 0x45, 0xFE, 0x00, 0x4D, 0x22, 0x00, 0x49, 0x22, 0x00, 0x59, 0xFE, 0x00, 0x51, 0x22, 0x00, 0x49, 0x22, 0x00, 0x45, 0xFE, 0x00, 0x44, 0x48, 0x00, 0x44, 0x88, 0x00, 0x47, 0xFF, 0x00, 0x5C, 0x08, 0x00, 0x40, 0x08, 0x00, 0x40, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9675, { 0x00, 0x00, 0x00, 0x3C, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x00, 0x28, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x24, 0x44, 0x80, 0x24, 0xA7, 0x80, 0x27, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x24, 0xC2, 0x00, 0x25, 0x24, 0x00, 0x3A, 0x18, 0x00, 0x20, 0x18, 0x00, 0x20, 0x66, 0x00, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9676, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x80, 0x00, 0x29, 0xFF, 0x80, 0x2A, 0x80, 0x80, 0x24, 0xFC, 0x80, 0x25, 0x20, 0x80, 0x26, 0x20, 0x80, 0x27, 0xFF, 0x80, 0x25, 0x24, 0x80, 0x25, 0x24, 0x80, 0x25, 0xFC, 0x80, 0x3D, 0x04, 0x80, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9677, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x3F, 0x00, 0x24, 0x41, 0x00, 0x28, 0x81, 0x00, 0x27, 0x02, 0x00, 0x24, 0x1C, 0x00, 0x24, 0x00, 0x00, 0x24, 0x60, 0x00, 0x25, 0x87, 0x00, 0x25, 0x01, 0x00, 0x25, 0xC7, 0x00, 0x39, 0x01, 0x00, 0x21, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9678, { 0x00, 0x00, 0x00, 0x3C, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x24, 0x48, 0x00, 0x24, 0x48, 0x80, 0x24, 0x8F, 0x80, 0x27, 0x00, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x967A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x70, 0x00, 0x44, 0xD8, 0x00, 0x49, 0x8C, 0x00, 0x4F, 0x07, 0x00, 0x51, 0xFC, 0x00, 0x50, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xFE, 0x00, 0x58, 0x50, 0x00, 0x40, 0xD8, 0x00, 0x41, 0x8C, 0x00, 0x47, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x967B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x50, 0x00, 0x48, 0x50, 0x00, 0x59, 0xFE, 0x00, 0x51, 0x52, 0x00, 0x51, 0x52, 0x00, 0x49, 0x52, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x59, 0xFE, 0x00, 0x40, 0x20, 0x00, 0x40, 0x20, 0x00, 0x43, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x967C, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7C, 0x22, 0x00, 0x45, 0xFE, 0x00, 0x4C, 0x24, 0x00, 0x48, 0x2C, 0x00, 0x58, 0x28, 0x00, 0x53, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x44, 0x28, 0x00, 0x44, 0xFC, 0x00, 0x47, 0x84, 0x00, 0x44, 0x84, 0x00, 0x5C, 0xFC, 0x00, 0x40, 0x84, 0x00, 0x40, 0x84, 0x00, 0x40, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x967D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x40, 0x00, 0x24, 0xFF, 0x80, 0x25, 0x11, 0x80, 0x26, 0x22, 0x80, 0x24, 0xC4, 0x80, 0x39, 0x08, 0x80, 0x22, 0x31, 0x00, 0x20, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x967E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x4B, 0xFF, 0x00, 0x5A, 0x49, 0x00, 0x52, 0x49, 0x00, 0x52, 0x49, 0x00, 0x4A, 0x4B, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x58, 0x48, 0x00, 0x40, 0x48, 0x00, 0x40, 0xCC, 0x00, 0x41, 0x86, 0x00, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x967F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x5B, 0xFF, 0x00, 0x52, 0x92, 0x00, 0x52, 0x92, 0x00, 0x52, 0x92, 0x00, 0x4B, 0x55, 0x00, 0x4A, 0x38, 0x00, 0x4A, 0x28, 0x00, 0x4A, 0x6C, 0x00, 0x5A, 0xC6, 0x00, 0x43, 0x83, 0x00, 0x42, 0x00, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9681, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0x00, 0x4A, 0x00, 0x00, 0x4A, 0x7E, 0x00, 0x4A, 0x42, 0x00, 0x5A, 0x7E, 0x00, 0x52, 0x42, 0x00, 0x4A, 0x7E, 0x00, 0x4A, 0x10, 0x00, 0x4A, 0xFF, 0x00, 0x4A, 0x24, 0x00, 0x4A, 0x6C, 0x00, 0x5A, 0x18, 0x00, 0x42, 0xE7, 0x00, 0x42, 0x00, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9682, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x38, 0x00, 0x44, 0x6C, 0x00, 0x4C, 0xC6, 0x00, 0x59, 0x83, 0x00, 0x50, 0x7C, 0x00, 0x48, 0x40, 0x00, 0x44, 0x7C, 0x00, 0x44, 0x40, 0x00, 0x44, 0x7C, 0x00, 0x44, 0x40, 0x00, 0x45, 0xFF, 0x00, 0x5C, 0x40, 0x00, 0x40, 0xC4, 0x00, 0x40, 0x9E, 0x00, 0x41, 0xF2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9683, { 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x78, 0x30, 0x00, 0x48, 0xD8, 0x00, 0x49, 0x8C, 0x00, 0x5F, 0x07, 0x00, 0x50, 0xF8, 0x00, 0x50, 0x00, 0x00, 0x53, 0xC9, 0x00, 0x4A, 0x49, 0x00, 0x4B, 0x5B, 0x00, 0x4A, 0xD2, 0x00, 0x4A, 0x52, 0x00, 0x5B, 0x5B, 0x00, 0x42, 0xC9, 0x00, 0x42, 0x49, 0x00, 0x42, 0xC9, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9684, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x59, 0x04, 0x00, 0x51, 0x04, 0x00, 0x51, 0xFC, 0x00, 0x50, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x49, 0x20, 0x00, 0x49, 0x3E, 0x00, 0x59, 0x20, 0x00, 0x43, 0xA0, 0x00, 0x46, 0xE0, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9685, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x8A, 0x80, 0x22, 0x8F, 0x80, 0x2C, 0xF1, 0x80, 0x20, 0x80, 0x80, 0x20, 0x80, 0x80, 0x20, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9686, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x24, 0xC2, 0x00, 0x2B, 0x24, 0x00, 0x28, 0x18, 0x00, 0x24, 0x66, 0x00, 0x27, 0xA9, 0x80, 0x24, 0x48, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x88, 0x00, 0x25, 0x7F, 0x00, 0x38, 0x08, 0x00, 0x20, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9688, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFC, 0x00, 0x49, 0x24, 0x00, 0x49, 0x24, 0x00, 0x59, 0xFC, 0x00, 0x51, 0x24, 0x00, 0x51, 0x24, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x49, 0x20, 0x00, 0x49, 0x32, 0x00, 0x59, 0x14, 0x00, 0x41, 0x18, 0x00, 0x41, 0xCC, 0x00, 0x47, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9689, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x7B, 0x9E, 0x00, 0x4A, 0x02, 0x00, 0x4A, 0x02, 0x00, 0x5B, 0xDE, 0x00, 0x52, 0x02, 0x00, 0x52, 0x02, 0x00, 0x53, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x58, 0x20, 0x00, 0x40, 0x20, 0x00, 0x47, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x968A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x7C, 0x00, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x29, 0x01, 0x00, 0x2A, 0xFC, 0x80, 0x24, 0x20, 0x00, 0x24, 0x51, 0x00, 0x24, 0x9A, 0x00, 0x25, 0x2C, 0x00, 0x26, 0x48, 0x00, 0x24, 0x98, 0x00, 0x2F, 0x2C, 0x00, 0x20, 0xCA, 0x00, 0x23, 0x09, 0x00, 0x20, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x968B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x40, 0x00, 0x28, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x25, 0xFF, 0x80, 0x25, 0x00, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x38, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x968D, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x20, 0x00, 0x24, 0xFE, 0x00, 0x28, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x2C, 0x10, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x968E, { 0x00, 0x00, 0x00, 0x3E, 0x84, 0x00, 0x22, 0x84, 0x00, 0x24, 0xF7, 0x80, 0x28, 0x84, 0x00, 0x24, 0x84, 0x80, 0x22, 0xBC, 0x80, 0x23, 0xC7, 0x80, 0x22, 0x10, 0x00, 0x22, 0x20, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x968F, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7A, 0x10, 0x00, 0x4B, 0x7F, 0x00, 0x49, 0x10, 0x00, 0x48, 0x3E, 0x00, 0x50, 0x22, 0x00, 0x50, 0x62, 0x00, 0x4B, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x59, 0x22, 0x00, 0x43, 0x26, 0x00, 0x46, 0x80, 0x00, 0x4C, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9690, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0x78, 0x00, 0x28, 0x88, 0x00, 0x29, 0x12, 0x00, 0x33, 0xFF, 0x00, 0x28, 0x02, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x25, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x29, 0x40, 0x00, 0x21, 0x30, 0x00, 0x23, 0x16, 0x00, 0x25, 0x05, 0x00, 0x20, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9691, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7A, 0x22, 0x00, 0x4A, 0x22, 0x00, 0x4B, 0xFE, 0x00, 0x58, 0x00, 0x00, 0x53, 0xFE, 0x00, 0x50, 0x00, 0x00, 0x51, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x49, 0x04, 0x00, 0x49, 0xFC, 0x00, 0x48, 0x88, 0x00, 0x58, 0xD8, 0x00, 0x40, 0x50, 0x00, 0x47, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9694, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x94, 0x80, 0x22, 0xF7, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x2C, 0x88, 0x80, 0x20, 0x88, 0x80, 0x20, 0x88, 0x80, 0x20, 0x8B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9695, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x20, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9696, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x40, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x59, 0x04, 0x00, 0x51, 0x04, 0x00, 0x51, 0xFC, 0x00, 0x51, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x02, 0x00, 0x5A, 0xAA, 0x00, 0x46, 0xAA, 0x00, 0x44, 0x06, 0x00, 0x40, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9697, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x40, 0x00, 0x45, 0xFE, 0x00, 0x4D, 0x22, 0x00, 0x49, 0x22, 0x00, 0x59, 0xFE, 0x00, 0x51, 0x22, 0x00, 0x49, 0x22, 0x00, 0x45, 0xFE, 0x00, 0x44, 0x50, 0x00, 0x44, 0x54, 0x00, 0x44, 0x55, 0x00, 0x5C, 0xDF, 0x00, 0x40, 0x90, 0x00, 0x41, 0x91, 0x00, 0x43, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9698, { 0x00, 0x00, 0x00, 0x3C, 0x44, 0x00, 0x24, 0x82, 0x00, 0x25, 0x01, 0x00, 0x2A, 0xFC, 0x80, 0x28, 0x00, 0x00, 0x24, 0x7C, 0x00, 0x24, 0x04, 0x00, 0x24, 0x82, 0x00, 0x25, 0x01, 0x80, 0x26, 0xFF, 0x00, 0x24, 0xA5, 0x00, 0x24, 0xA5, 0x00, 0x38, 0xA5, 0x00, 0x20, 0xA5, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9699, { 0x00, 0x00, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x49, 0x00, 0x24, 0x88, 0x80, 0x28, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2C, 0x4A, 0x00, 0x20, 0x89, 0x00, 0x21, 0x08, 0x80, 0x20, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x969A, { 0x00, 0x00, 0x00, 0x02, 0x22, 0x00, 0x7B, 0x26, 0x00, 0x49, 0x24, 0x00, 0x4B, 0xFE, 0x00, 0x5A, 0x02, 0x00, 0x52, 0xFA, 0x00, 0x50, 0x88, 0x00, 0x50, 0x88, 0x00, 0x48, 0xF8, 0x00, 0x48, 0x20, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFC, 0x00, 0x58, 0x20, 0x00, 0x40, 0x20, 0x00, 0x47, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x969B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x40, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x51, 0x00, 0x2B, 0x2A, 0x00, 0x24, 0xC6, 0x00, 0x24, 0x81, 0x80, 0x27, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x38, 0x92, 0x00, 0x21, 0x11, 0x00, 0x22, 0x10, 0x80, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x969C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x22, 0x00, 0x24, 0x14, 0x00, 0x28, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x2D, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x969D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x40, 0x00, 0x49, 0xFC, 0x00, 0x49, 0x04, 0x00, 0x59, 0xFC, 0x00, 0x51, 0x04, 0x00, 0x51, 0xFC, 0x00, 0x51, 0x00, 0x00, 0x49, 0xFF, 0x00, 0x49, 0x00, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x02, 0x00, 0x5A, 0xAA, 0x00, 0x46, 0xAA, 0x00, 0x44, 0x06, 0x00, 0x40, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x969F, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x79, 0x24, 0x00, 0x49, 0xB6, 0x00, 0x48, 0x92, 0x00, 0x59, 0xFE, 0x00, 0x51, 0x22, 0x00, 0x51, 0xFE, 0x00, 0x51, 0x22, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFF, 0x00, 0x48, 0xA8, 0x00, 0x58, 0xAC, 0x00, 0x41, 0xA6, 0x00, 0x43, 0x23, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A0, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x3C, 0x00, 0x4B, 0xE2, 0x00, 0x49, 0x26, 0x00, 0x48, 0x94, 0x00, 0x51, 0xFE, 0x00, 0x50, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x48, 0x10, 0x00, 0x59, 0x52, 0x00, 0x41, 0x43, 0x00, 0x43, 0x45, 0x00, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x54, 0x00, 0x27, 0xFF, 0x80, 0x28, 0x38, 0x00, 0x24, 0x54, 0x00, 0x24, 0x92, 0x00, 0x27, 0x11, 0x80, 0x24, 0x84, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x34, 0x00, 0x3B, 0x54, 0x00, 0x24, 0xFF, 0x80, 0x20, 0x84, 0x00, 0x21, 0x04, 0x00, 0x22, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0xFE, 0x00, 0x44, 0x92, 0x00, 0x4C, 0xFE, 0x00, 0x58, 0x10, 0x00, 0x51, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x44, 0x82, 0x00, 0x44, 0xFE, 0x00, 0x5C, 0x82, 0x00, 0x40, 0xFE, 0x00, 0x40, 0x44, 0x00, 0x41, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A5, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x79, 0xE8, 0x00, 0x4A, 0x31, 0x00, 0x49, 0x4A, 0x00, 0x58, 0x84, 0x00, 0x53, 0x7B, 0x00, 0x50, 0x00, 0x00, 0x50, 0xFC, 0x00, 0x48, 0x84, 0x00, 0x48, 0x84, 0x00, 0x48, 0xFC, 0x00, 0x48, 0x00, 0x00, 0x58, 0x84, 0x00, 0x40, 0xCC, 0x00, 0x40, 0x48, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A6, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7B, 0x88, 0x00, 0x4A, 0xBE, 0x00, 0x4A, 0x80, 0x00, 0x5A, 0xA2, 0x00, 0x52, 0xB6, 0x00, 0x53, 0x94, 0x00, 0x4A, 0x7F, 0x00, 0x4A, 0x08, 0x00, 0x4B, 0x88, 0x00, 0x5A, 0xBE, 0x00, 0x46, 0x88, 0x00, 0x46, 0x88, 0x00, 0x4A, 0x88, 0x00, 0x42, 0x88, 0x00, 0x43, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A7, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3C, 0x8E, 0x00, 0x24, 0x22, 0x00, 0x24, 0x41, 0x00, 0x2A, 0xBE, 0x80, 0x25, 0x19, 0x00, 0x24, 0x2E, 0x00, 0x24, 0xD4, 0x00, 0x24, 0x26, 0x00, 0x27, 0x4D, 0x00, 0x25, 0x15, 0x00, 0x25, 0x64, 0x80, 0x39, 0x18, 0x80, 0x21, 0x80, 0x00, 0x22, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A8, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3D, 0x10, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x2A, 0x5F, 0x00, 0x25, 0x84, 0x00, 0x25, 0x7F, 0x80, 0x24, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x27, 0x3F, 0x00, 0x25, 0x21, 0x00, 0x25, 0x3F, 0x00, 0x39, 0x21, 0x00, 0x21, 0xA3, 0x00, 0x22, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96A9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x40, 0x00, 0x4B, 0xFE, 0x00, 0x4A, 0x12, 0x00, 0x5A, 0xE2, 0x00, 0x52, 0xAA, 0x00, 0x52, 0x22, 0x00, 0x52, 0xFA, 0x00, 0x4A, 0x72, 0x00, 0x4A, 0xAA, 0x00, 0x4A, 0x22, 0x00, 0x4F, 0xFF, 0x00, 0x58, 0x50, 0x00, 0x40, 0xD8, 0x00, 0x41, 0x8C, 0x00, 0x47, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96AA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x28, 0x00, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x2B, 0x01, 0x80, 0x24, 0xFC, 0x00, 0x24, 0x00, 0x00, 0x24, 0xEE, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xEE, 0x00, 0x24, 0x00, 0x00, 0x2C, 0x82, 0x00, 0x20, 0x82, 0x00, 0x21, 0x45, 0x00, 0x22, 0x28, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96AE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x20, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x50, 0x00, 0x5F, 0xAF, 0x00, 0x52, 0xAA, 0x00, 0x52, 0xAA, 0x00, 0x55, 0xAD, 0x00, 0x48, 0x00, 0x00, 0x49, 0x02, 0x00, 0x49, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x59, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x41, 0x02, 0x00, 0x42, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96AF, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7B, 0xFF, 0x00, 0x48, 0x20, 0x00, 0x49, 0xFE, 0x00, 0x58, 0x00, 0x00, 0x57, 0xFF, 0x00, 0x50, 0x01, 0x00, 0x51, 0xFD, 0x00, 0x48, 0x20, 0x00, 0x4B, 0xFE, 0x00, 0x48, 0x00, 0x00, 0x4F, 0xFF, 0x00, 0x58, 0x02, 0x00, 0x47, 0xBF, 0x00, 0x44, 0xA2, 0x00, 0x47, 0x96, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFE, 0x00, 0x45, 0x02, 0x00, 0x4D, 0xFE, 0x00, 0x49, 0x02, 0x00, 0x59, 0xFE, 0x00, 0x50, 0x84, 0x00, 0x51, 0x08, 0x00, 0x49, 0x4A, 0x00, 0x48, 0x84, 0x00, 0x49, 0x29, 0x00, 0x4B, 0xEF, 0x00, 0x58, 0x00, 0x00, 0x41, 0x52, 0x00, 0x43, 0x5B, 0x00, 0x42, 0x49, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B1, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x3C, 0xE9, 0x00, 0x25, 0x04, 0x80, 0x26, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x24, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x27, 0xFF, 0x80, 0x24, 0x02, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x3A, 0x91, 0x00, 0x22, 0x82, 0x80, 0x24, 0xFE, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0xA4, 0x00, 0x45, 0xA6, 0x00, 0x4F, 0x23, 0x00, 0x48, 0x68, 0x00, 0x58, 0x30, 0x00, 0x50, 0xFF, 0x00, 0x53, 0x90, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x90, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x90, 0x00, 0x58, 0xFF, 0x00, 0x42, 0x01, 0x00, 0x42, 0xA9, 0x00, 0x44, 0xAB, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x28, 0x88, 0x00, 0x24, 0x7F, 0x80, 0x22, 0x22, 0x00, 0x22, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x2E, 0x3E, 0x00, 0x20, 0xA2, 0x00, 0x23, 0xE6, 0x00, 0x0E, 0x38, 0x00, 0x78, 0x8F, 0x80, 0x08, 0xA2, 0x00, 0x33, 0x91, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B4, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x78, 0x88, 0x00, 0x4F, 0xFF, 0x00, 0x4A, 0x28, 0x00, 0x59, 0x4F, 0x00, 0x57, 0xF1, 0x00, 0x50, 0x0F, 0x00, 0x4B, 0xE8, 0x00, 0x4A, 0x2F, 0x00, 0x4B, 0xE8, 0x00, 0x4A, 0x2F, 0x00, 0x5B, 0xE8, 0x00, 0x42, 0x2F, 0x00, 0x42, 0x28, 0x00, 0x42, 0x29, 0x00, 0x42, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x30, 0x83, 0x00, 0x18, 0x86, 0x00, 0x00, 0xCC, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x0E, 0x09, 0x00, 0x15, 0xFF, 0x80, 0x24, 0x89, 0x00, 0x04, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x49, 0x00, 0x00, 0x2A, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x0C, 0x00, 0x15, 0x1A, 0x00, 0x15, 0x29, 0x00, 0x24, 0x48, 0x80, 0x0C, 0x98, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x09, 0x00, 0x1C, 0xFF, 0x80, 0x2A, 0x09, 0x00, 0x49, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x6B, 0x00, 0x7F, 0x2A, 0x00, 0x08, 0x0C, 0x00, 0x2A, 0x1A, 0x00, 0x2A, 0x2B, 0x00, 0x4A, 0xC9, 0x80, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96B9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x06, 0x30, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x38, 0x40, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96BA, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x23, 0x01, 0x00, 0x22, 0x21, 0x00, 0x06, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96BB, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x03, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96BC, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0C, 0x60, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x30, 0x40, 0x00, 0x5F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96BD, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x14, 0x20, 0x00, 0x27, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x01, 0x0A, 0x00, 0x01, 0x1F, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0A, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96BE, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x28, 0x00, 0x7F, 0x22, 0x00, 0x02, 0x7F, 0x00, 0x22, 0x48, 0x00, 0x22, 0xC8, 0x00, 0x15, 0x7E, 0x00, 0x14, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7E, 0x00, 0x14, 0x48, 0x00, 0x12, 0x48, 0x00, 0x22, 0x4A, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96C0, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x48, 0x80, 0x20, 0x50, 0x00, 0x03, 0xE0, 0x00, 0x00, 0xD0, 0x00, 0x03, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x34, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x40, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x40, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x22, 0x00, 0x12, 0x24, 0x00, 0x12, 0x7F, 0x80, 0x16, 0xC4, 0x00, 0x1B, 0x44, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96C4, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x24, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0x64, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0x3F, 0x00, 0x0A, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x12, 0x24, 0x00, 0x14, 0x3F, 0x00, 0x14, 0xA4, 0x00, 0x15, 0xE4, 0x00, 0x1E, 0x64, 0x00, 0x20, 0x3F, 0x80, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96C5, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1F, 0x92, 0x00, 0x09, 0x24, 0x00, 0x09, 0x3F, 0x80, 0x09, 0x64, 0x00, 0x09, 0xA4, 0x00, 0x09, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x24, 0x00, 0x03, 0x24, 0x00, 0x05, 0x3F, 0x80, 0x05, 0x24, 0x00, 0x09, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0x3F, 0x80, 0x23, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96C6, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96C7, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1F, 0xC0, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x12, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x1A, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x20, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96C9, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x24, 0x00, 0x1F, 0x3F, 0x00, 0x14, 0x64, 0x00, 0x24, 0x64, 0x00, 0x04, 0xA4, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA4, 0x00, 0x04, 0x24, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x24, 0x00, 0x0A, 0x24, 0x00, 0x09, 0x24, 0x00, 0x11, 0x3F, 0x80, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96CA, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x16, 0x00, 0x10, 0x14, 0x00, 0x3F, 0x3F, 0x80, 0x21, 0x24, 0x00, 0x61, 0x64, 0x00, 0x1D, 0x24, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x1D, 0x3F, 0x00, 0x01, 0x24, 0x00, 0x01, 0x24, 0x00, 0x03, 0x24, 0x00, 0x0E, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96CB, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96CC, { 0x00, 0x00, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x92, 0x00, 0x04, 0x9F, 0x80, 0x14, 0xB2, 0x00, 0x14, 0xD2, 0x00, 0x14, 0xFF, 0x80, 0x17, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x14, 0x9F, 0x80, 0x14, 0x92, 0x00, 0x14, 0x92, 0x00, 0x17, 0x92, 0x00, 0x3D, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96CD, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x12, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x3F, 0x80, 0x32, 0x64, 0x00, 0x14, 0xA4, 0x00, 0x08, 0xBF, 0x00, 0x17, 0x24, 0x00, 0x39, 0x24, 0x00, 0x02, 0x3F, 0x00, 0x04, 0x24, 0x00, 0x08, 0x24, 0x00, 0x10, 0x3F, 0x80, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96CE, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x1E, 0x48, 0x00, 0x12, 0xC8, 0x00, 0x13, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x1E, 0x48, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x17, 0xC8, 0x00, 0x38, 0x48, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96CF, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x28, 0x00, 0x10, 0x4A, 0x00, 0x1E, 0x7F, 0x00, 0x22, 0xC8, 0x00, 0x45, 0x48, 0x00, 0x0A, 0x7E, 0x00, 0x7F, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x7E, 0x00, 0x3E, 0x48, 0x00, 0x02, 0x48, 0x00, 0x02, 0x4A, 0x00, 0x7E, 0x7F, 0x00, 0x02, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96D1, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x10, 0x16, 0x00, 0x7E, 0x14, 0x00, 0x12, 0x3F, 0x80, 0x12, 0xA4, 0x00, 0x33, 0xA4, 0x00, 0x60, 0x64, 0x00, 0x08, 0xBF, 0x00, 0x08, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x08, 0x24, 0x00, 0x1C, 0x3F, 0x00, 0x1A, 0x24, 0x00, 0x29, 0x24, 0x00, 0x48, 0x24, 0x00, 0x08, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96D2, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x10, 0x26, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x7F, 0x80, 0x76, 0x44, 0x00, 0x1C, 0xC4, 0x00, 0x09, 0x44, 0x00, 0x1C, 0x7F, 0x00, 0x36, 0x44, 0x00, 0x63, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96D5, { 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x92, 0x00, 0x24, 0x9F, 0x80, 0x3F, 0xB2, 0x00, 0x24, 0xD2, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x9F, 0x80, 0x24, 0x92, 0x00, 0x2E, 0x92, 0x00, 0x2A, 0x9F, 0x80, 0x2A, 0x92, 0x00, 0x2E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x20, 0x9F, 0x80, 0x21, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96D6, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x24, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x64, 0x00, 0x04, 0xA4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x24, 0x00, 0x04, 0xA4, 0x00, 0x07, 0xA4, 0x00, 0x3C, 0x7F, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96D8, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x12, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0xC4, 0x00, 0x2A, 0x7F, 0x00, 0x2F, 0x44, 0x00, 0x7A, 0x7F, 0x00, 0x22, 0x44, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x22, 0x00, 0x62, 0x1C, 0x00, 0x46, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96D9, { 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0x0A, 0x12, 0x00, 0x1F, 0xBF, 0x80, 0x32, 0x52, 0x00, 0x1F, 0x9F, 0x80, 0x12, 0x12, 0x00, 0x1F, 0x9F, 0x80, 0x12, 0x12, 0x00, 0x1F, 0xDF, 0x80, 0x10, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x02, 0x06, 0x00, 0x01, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96DA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7E, 0x1F, 0x80, 0x02, 0x10, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x02, 0x10, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x78, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96DB, { 0x00, 0x00, 0x00, 0x08, 0x09, 0x00, 0x08, 0x09, 0x00, 0x1F, 0xD2, 0x00, 0x34, 0x7F, 0x80, 0x15, 0x52, 0x00, 0x15, 0x5F, 0x80, 0x1F, 0x52, 0x00, 0x15, 0x5F, 0x80, 0x09, 0x92, 0x00, 0x1F, 0xD2, 0x00, 0x34, 0x5F, 0x80, 0x15, 0x50, 0x00, 0x1F, 0x4A, 0x80, 0x15, 0x4A, 0x80, 0x08, 0x6A, 0x80, 0x11, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96DC, { 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x92, 0x00, 0x11, 0x12, 0x00, 0x11, 0x3F, 0x80, 0x2A, 0xD2, 0x00, 0x24, 0x52, 0x00, 0x04, 0x1F, 0x80, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x0E, 0x1F, 0x80, 0x0D, 0x12, 0x00, 0x14, 0x92, 0x00, 0x24, 0x1F, 0x80, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96DD, { 0x00, 0x00, 0x00, 0x12, 0x49, 0x00, 0x24, 0x8B, 0x00, 0x49, 0x0A, 0x00, 0x24, 0x9F, 0x80, 0x12, 0x52, 0x00, 0x00, 0x32, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x9F, 0x80, 0x3F, 0x92, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x44, 0x5F, 0x80, 0x7F, 0xD2, 0x00, 0x40, 0x12, 0x00, 0x40, 0x52, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96DE, { 0x00, 0x00, 0x00, 0x03, 0x22, 0x00, 0x7E, 0x26, 0x00, 0x12, 0x24, 0x00, 0x4B, 0x7F, 0x80, 0x41, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x32, 0x44, 0x00, 0x14, 0x7F, 0x00, 0x09, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x09, 0x44, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x44, 0x00, 0x14, 0x44, 0x00, 0x36, 0x44, 0x00, 0x63, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96DF, { 0x00, 0x00, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x00, 0x00, 0x79, 0x10, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x38, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x44, 0x10, 0x80, 0x7B, 0xFF, 0x80, 0x42, 0x10, 0x80, 0x43, 0xF3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96E0, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x19, 0x0C, 0x00, 0x10, 0x88, 0x00, 0x1E, 0x9F, 0x00, 0x28, 0x34, 0x00, 0x6B, 0x94, 0x00, 0x3C, 0x9F, 0x00, 0x28, 0x94, 0x00, 0x28, 0x94, 0x00, 0x3E, 0x9F, 0x00, 0x28, 0x94, 0x00, 0x28, 0xB4, 0x00, 0x28, 0xD4, 0x00, 0x3E, 0x9F, 0x00, 0x20, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96E2, { 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xF2, 0x00, 0x10, 0x52, 0x00, 0x15, 0x7F, 0x80, 0x12, 0x52, 0x00, 0x15, 0x52, 0x00, 0x1F, 0xDF, 0x80, 0x02, 0x12, 0x00, 0x1F, 0xF2, 0x00, 0x14, 0x5F, 0x80, 0x15, 0x52, 0x00, 0x1B, 0xD2, 0x00, 0x1C, 0xD2, 0x00, 0x10, 0x5F, 0x80, 0x10, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96E3, { 0x00, 0x00, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x12, 0x00, 0x1F, 0x1F, 0x80, 0x04, 0x32, 0x00, 0x3F, 0xB2, 0x00, 0x24, 0xDF, 0x80, 0x3F, 0x92, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xD2, 0x00, 0x0A, 0x12, 0x00, 0x09, 0x12, 0x00, 0x10, 0x9F, 0x80, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x12, 0x49, 0x00, 0x11, 0x45, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x12, 0x49, 0x00, 0x11, 0x45, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x2F, 0x5E, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x40, 0x80, 0x80, 0x1E, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xE0, 0x00, 0x03, 0xB8, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96F0, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x08, 0x00, 0x38, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96F1, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x06, 0x06, 0x00, 0x0C, 0x04, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x7E, 0x00, 0x1F, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96F3, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x89, 0x00, 0x46, 0xB2, 0x00, 0x08, 0x88, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x84, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x21, 0x04, 0x00, 0x26, 0x28, 0x00, 0x48, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96F6, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xBE, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x39, 0xF3, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x2F, 0xF1, 0x00, 0x08, 0x11, 0x00, 0x0F, 0xF2, 0x00, 0x08, 0x0C, 0x80, 0x08, 0x00, 0x80, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96FA, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x18, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x41, 0x00, 0x0E, 0x42, 0x00, 0x78, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x96FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x80, 0x00, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x96FE, { 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x89, 0x00, 0x44, 0x92, 0x00, 0x0A, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x20, 0x00, 0x09, 0xC0, 0x00, 0x06, 0x30, 0x00, 0x79, 0x0F, 0x00, 0x07, 0xF2, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x50, 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9701, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x89, 0x00, 0x46, 0xB2, 0x00, 0x09, 0x08, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0xC0, 0x00, 0x0E, 0x38, 0x00, 0x74, 0x17, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9702, { 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x5D, 0x7A, 0x00, 0x41, 0x02, 0x00, 0x1D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x60, 0xA8, 0x00, 0x30, 0xA8, 0x00, 0x09, 0xAC, 0x00, 0x1B, 0x26, 0x00, 0x36, 0x23, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9703, { 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x5D, 0x7A, 0x00, 0x41, 0x02, 0x00, 0x1D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFE, 0x00, 0x62, 0x22, 0x00, 0x32, 0x22, 0x00, 0x08, 0x70, 0x00, 0x18, 0xD1, 0x00, 0x31, 0x91, 0x00, 0x67, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9704, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x40, 0x80, 0x80, 0x1E, 0x3E, 0x00, 0x08, 0x84, 0x00, 0x10, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9705, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9706, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x07, 0x00, 0x02, 0x78, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x12, 0x08, 0x00, 0x0C, 0xFF, 0x80, 0x0A, 0x00, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9707, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x12, 0x00, 0x21, 0x0C, 0x00, 0x21, 0xF6, 0x00, 0x2F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9708, { 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x5D, 0x7A, 0x00, 0x41, 0x02, 0x00, 0x1D, 0x78, 0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x60, 0x20, 0x00, 0x31, 0xFE, 0x00, 0x09, 0x22, 0x00, 0x19, 0x22, 0x00, 0x31, 0x26, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9709, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x970A, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x20, 0x00, 0x09, 0x24, 0x00, 0x05, 0x28, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x970D, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x18, 0x40, 0x00, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x970E, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0x3C, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x03, 0xE0, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x970F, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x02, 0x20, 0x00, 0x7E, 0x3F, 0x80, 0x04, 0x20, 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9711, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x48, 0x00, 0x10, 0x08, 0x00, 0x08, 0x0F, 0x80, 0x22, 0x08, 0x00, 0x12, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9713, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x03, 0x40, 0x00, 0x0C, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x02, 0x10, 0x80, 0x0C, 0x10, 0x80, 0x30, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9716, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x04, 0x44, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x0E, 0x0E, 0x00, 0x15, 0x15, 0x00, 0x14, 0xA4, 0x80, 0x24, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9719, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x80, 0x00, 0x40, 0x00, 0x0F, 0x1E, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0xB0, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x971A, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x20, 0x00, 0x0A, 0x3F, 0x80, 0x04, 0x62, 0x00, 0x7F, 0x96, 0x00, 0x0D, 0x1C, 0x00, 0x14, 0x18, 0x00, 0x64, 0x36, 0x00, 0x0C, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x971B, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x04, 0x21, 0x00, 0x3D, 0xEF, 0x00, 0x21, 0x08, 0x00, 0x3D, 0xEF, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x63, 0x00, 0x39, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x971C, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x06, 0x1F, 0x00, 0x0B, 0x11, 0x00, 0x0A, 0x9F, 0x00, 0x12, 0x51, 0x00, 0x22, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x971D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x40, 0x80, 0x80, 0x1E, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x971E, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x81, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0x12, 0x00, 0x1F, 0x8C, 0x00, 0x10, 0x16, 0x00, 0x10, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9721, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x40, 0x80, 0x80, 0x1E, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0xE9, 0x80, 0x22, 0x2E, 0x00, 0x62, 0x4B, 0x00, 0x46, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9722, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x40, 0x80, 0x80, 0x1E, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x00, 0x24, 0xE3, 0x00, 0x3C, 0x8C, 0x00, 0x24, 0xB1, 0x80, 0x3C, 0xA6, 0x00, 0x24, 0xB8, 0x00, 0x64, 0xA6, 0x00, 0x4D, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9723, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9724, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7E, 0x00, 0x10, 0x12, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9727, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x9F, 0x00, 0x01, 0x31, 0x00, 0x3F, 0xCE, 0x00, 0x06, 0x85, 0x80, 0x06, 0x58, 0x00, 0x0A, 0x28, 0x00, 0x12, 0x7F, 0x00, 0x22, 0x11, 0x00, 0x06, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9728, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x02, 0x00, 0x2F, 0x92, 0x00, 0x20, 0x0A, 0x00, 0x2F, 0x8A, 0x00, 0x22, 0x02, 0x00, 0x4A, 0x82, 0x00, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x972A, { 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x5D, 0x7A, 0x00, 0x41, 0x02, 0x00, 0x1D, 0x78, 0x00, 0x00, 0x06, 0x00, 0x33, 0xFC, 0x00, 0x18, 0xA4, 0x00, 0x61, 0x12, 0x00, 0x31, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x1B, 0xFF, 0x00, 0x30, 0x20, 0x00, 0x61, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x972D, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x89, 0x00, 0x46, 0xB2, 0x00, 0x08, 0x88, 0x00, 0x11, 0xFC, 0x00, 0x09, 0x44, 0x00, 0x01, 0x24, 0x00, 0x79, 0xFC, 0x00, 0x08, 0x80, 0x00, 0x09, 0xFE, 0x00, 0x0E, 0x22, 0x00, 0x09, 0x52, 0x00, 0x0D, 0xFA, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9730, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x1F, 0x5E, 0x00, 0x0A, 0x1E, 0x00, 0x3F, 0x90, 0x00, 0x0A, 0x3F, 0x80, 0x3F, 0xA2, 0x00, 0x00, 0x62, 0x00, 0x1F, 0x94, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x0C, 0x00, 0x11, 0x12, 0x00, 0x1F, 0x21, 0x00, 0x13, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9731, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x41, 0x00, 0x04, 0x42, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x09, 0x00, 0x3B, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9732, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xD4, 0x00, 0x04, 0x0E, 0x00, 0x17, 0x31, 0x80, 0x14, 0x5F, 0x00, 0x17, 0x91, 0x00, 0x3C, 0x1F, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9733, { 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x5C, 0x7A, 0x00, 0x00, 0x80, 0x00, 0x79, 0xFC, 0x00, 0x4B, 0x18, 0x00, 0x48, 0xF0, 0x00, 0x57, 0x6F, 0x00, 0x50, 0xA0, 0x00, 0x49, 0xFC, 0x00, 0x4A, 0x20, 0x00, 0x59, 0xFC, 0x00, 0x40, 0x20, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9738, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x00, 0x80, 0x00, 0x1E, 0xBE, 0x00, 0x11, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9739, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x2F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xBF, 0x80, 0x10, 0x8A, 0x00, 0x1F, 0x8A, 0x00, 0x10, 0x3F, 0x00, 0x1F, 0x84, 0x00, 0x18, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x2F, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x973D, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x2F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x01, 0x17, 0x00, 0x1F, 0xBC, 0x00, 0x09, 0x54, 0x00, 0x09, 0x5E, 0x00, 0x16, 0x71, 0x80, 0x28, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x973E, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x10, 0x00, 0x00, 0x34, 0xFE, 0x00, 0x68, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x68, 0x92, 0x00, 0x14, 0x92, 0x00, 0x6D, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x69, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9741, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xBE, 0x80, 0x40, 0x80, 0x80, 0x5C, 0x1E, 0x80, 0x07, 0xF0, 0x00, 0x04, 0x90, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x90, 0x00, 0x7F, 0xFF, 0x80, 0x49, 0x24, 0x80, 0x7F, 0x3F, 0x80, 0x49, 0x24, 0x80, 0x7F, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9742, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x27, 0x4E, 0x80, 0x07, 0x4E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x17, 0x9E, 0x80, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x10, 0x24, 0x00, 0x11, 0x3E, 0x00, 0x21, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9743, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x0E, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x3F, 0xBF, 0x80, 0x64, 0x64, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x24, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x24, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9744, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x1F, 0x3F, 0x80, 0x00, 0x52, 0x80, 0x1F, 0xD2, 0x80, 0x11, 0x7E, 0x80, 0x1F, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9746, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x08, 0x9F, 0x00, 0x7F, 0x45, 0x00, 0x49, 0x9F, 0x80, 0x6D, 0x45, 0x00, 0x49, 0x1F, 0x00, 0x24, 0xC4, 0x00, 0x00, 0x54, 0x80, 0x3E, 0x4D, 0x00, 0x00, 0x46, 0x00, 0x7F, 0x55, 0x00, 0x10, 0x64, 0x80, 0x34, 0x4C, 0x00, 0x26, 0xA0, 0x00, 0x7A, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9748, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x2F, 0x5E, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xEF, 0x00, 0x12, 0xA9, 0x00, 0x1E, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9749, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7F, 0x3E, 0x00, 0x08, 0x48, 0x80, 0x7F, 0x25, 0x00, 0x49, 0x7F, 0x80, 0x6D, 0x48, 0x80, 0x49, 0x15, 0x00, 0x24, 0x52, 0x80, 0x00, 0x8E, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x1F, 0x00, 0x7F, 0x31, 0x00, 0x10, 0x5B, 0x00, 0x34, 0x0E, 0x00, 0x26, 0x1B, 0x00, 0x7A, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x974A, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x2E, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x24, 0x91, 0x00, 0x2E, 0xBD, 0x00, 0x24, 0x91, 0x00, 0x2E, 0xBD, 0x00, 0x24, 0x91, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x974E, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x1E, 0xBE, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x7F, 0x00, 0x36, 0x41, 0x00, 0x23, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x40, 0x00, 0x48, 0x7F, 0x80, 0x2A, 0x00, 0x80, 0x1E, 0xAA, 0x80, 0x70, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x974F, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x1E, 0x3E, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x51, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x64, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x00, 0x80, 0x24, 0xAA, 0x80, 0x3F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9751, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9752, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9753, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x7F, 0x7E, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x54, 0x00, 0x08, 0x54, 0x00, 0x7F, 0x54, 0x00, 0x00, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x22, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x29, 0x00, 0x22, 0x49, 0x00, 0x2A, 0x87, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9755, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x2E, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x49, 0x00, 0x28, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x7E, 0x41, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9756, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x25, 0xFF, 0x80, 0x24, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x10, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x30, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9757, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x6B, 0x00, 0x08, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x64, 0x80, 0x22, 0x44, 0x80, 0x26, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9758, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x66, 0x00, 0x3E, 0xC4, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x80, 0x22, 0x61, 0x80, 0x26, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9759, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1E, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x3F, 0x00, 0x08, 0x09, 0x00, 0x7F, 0x09, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x09, 0x00, 0x22, 0x09, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x26, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x975A, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x22, 0x34, 0x80, 0x22, 0x64, 0x80, 0x26, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x975B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x80, 0x3E, 0x40, 0x80, 0x08, 0x3F, 0x00, 0x7F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x27, 0x80, 0x2A, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x74, 0x00, 0x22, 0x5C, 0x00, 0x26, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x975C, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x04, 0x39, 0x00, 0x3F, 0xA4, 0x80, 0x04, 0x42, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x7F, 0x80, 0x15, 0x09, 0x00, 0x15, 0x09, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x13, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x975E, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x07, 0xDF, 0x80, 0x39, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9760, { 0x00, 0x00, 0x00, 0x08, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x02, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x02, 0x20, 0x00, 0x7E, 0x3F, 0x80, 0x04, 0x20, 0x00, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9761, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x24, 0x00, 0x11, 0x04, 0x00, 0x10, 0x50, 0x00, 0x1F, 0xDF, 0x80, 0x10, 0x50, 0x00, 0x17, 0xDF, 0x00, 0x10, 0x50, 0x00, 0x2F, 0xDF, 0x80, 0x20, 0x90, 0x00, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9762, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0xF1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9763, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9764, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x08, 0x3F, 0x00, 0x10, 0x61, 0x00, 0x7F, 0x41, 0x00, 0x55, 0x79, 0x00, 0x55, 0xE9, 0x00, 0x5D, 0x29, 0x00, 0x55, 0x29, 0x00, 0x55, 0x3B, 0x00, 0x5D, 0x22, 0x00, 0x55, 0x26, 0x00, 0x55, 0x20, 0x00, 0x55, 0x20, 0x80, 0x7F, 0x31, 0x80, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9765, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x50, 0x00, 0x17, 0xFE, 0x00, 0x10, 0xA0, 0x00, 0x13, 0x18, 0x00, 0x1C, 0x07, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x14, 0x92, 0x00, 0x14, 0xF2, 0x00, 0x24, 0x92, 0x00, 0x24, 0xF2, 0x00, 0x44, 0x92, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9766, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xDF, 0x00, 0x04, 0x11, 0x00, 0x08, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2E, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2E, 0x9F, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x9A, 0x80, 0x3F, 0x92, 0x80, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9767, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x10, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x5D, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x5D, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x7F, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9768, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x8A, 0x00, 0x2F, 0x89, 0x00, 0x28, 0xBF, 0x80, 0x2F, 0x94, 0x00, 0x28, 0xB6, 0x00, 0x6F, 0xE3, 0x00, 0x48, 0x81, 0x80, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x12, 0x00, 0x13, 0xF2, 0x00, 0x12, 0x12, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9769, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x976A, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3F, 0x80, 0x7F, 0xC4, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x976B, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3F, 0x80, 0x7F, 0xD0, 0x80, 0x11, 0x18, 0x80, 0x11, 0x15, 0x80, 0x1F, 0x11, 0x00, 0x04, 0x19, 0x00, 0x3F, 0x8B, 0x00, 0x24, 0x8A, 0x00, 0x24, 0x8E, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x0E, 0x00, 0x7F, 0xCA, 0x00, 0x04, 0x1B, 0x00, 0x04, 0x11, 0x00, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x976D, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x11, 0x04, 0x80, 0x1F, 0x04, 0x80, 0x15, 0x14, 0x80, 0x04, 0x14, 0x80, 0x3F, 0xA4, 0x80, 0x24, 0x84, 0x80, 0x24, 0x84, 0x80, 0x3F, 0x88, 0x80, 0x04, 0x08, 0x80, 0x04, 0x10, 0x80, 0x3F, 0x90, 0x80, 0x04, 0x21, 0x00, 0x04, 0xC6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x976E, { 0x00, 0x00, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x61, 0x00, 0x3E, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x7F, 0x01, 0x00, 0x49, 0x3D, 0x00, 0x49, 0x01, 0x00, 0x7F, 0x01, 0x00, 0x08, 0x01, 0x00, 0x7F, 0x01, 0x00, 0x08, 0x03, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9771, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x3E, 0x09, 0x00, 0x08, 0x29, 0x00, 0x7F, 0x19, 0x00, 0x49, 0x09, 0x00, 0x49, 0x0D, 0x00, 0x7F, 0x1B, 0x00, 0x08, 0x11, 0x80, 0x7F, 0x11, 0x00, 0x08, 0x33, 0x00, 0x08, 0x62, 0x00, 0x08, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9773, { 0x00, 0x00, 0x00, 0x22, 0x03, 0x00, 0x22, 0x0E, 0x00, 0x7F, 0x78, 0x00, 0x22, 0x40, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x44, 0x00, 0x49, 0x44, 0x00, 0x49, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9774, { 0x00, 0x00, 0x00, 0x14, 0x14, 0x00, 0x14, 0x14, 0x00, 0x14, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x14, 0x64, 0x00, 0x1C, 0x65, 0x80, 0x08, 0xA6, 0x00, 0x3F, 0x24, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x24, 0x00, 0x08, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x08, 0x24, 0x80, 0x08, 0x27, 0x80, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9776, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x40, 0x00, 0x49, 0x40, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x40, 0x80, 0x08, 0x61, 0x80, 0x08, 0x3F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9777, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x80, 0x11, 0x7C, 0x80, 0x3F, 0x84, 0x80, 0x11, 0x04, 0x80, 0x1F, 0x04, 0x80, 0x15, 0x3C, 0x80, 0x04, 0x20, 0x80, 0x3F, 0xC0, 0x80, 0x24, 0xFC, 0x80, 0x24, 0x84, 0x80, 0x3F, 0x84, 0x80, 0x04, 0x04, 0x80, 0x04, 0x04, 0x80, 0x3F, 0x84, 0x80, 0x04, 0x04, 0x80, 0x04, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9778, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFE, 0x00, 0x7F, 0x22, 0x00, 0x22, 0x26, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x7F, 0x71, 0x00, 0x49, 0x53, 0x00, 0x49, 0x5A, 0x00, 0x7F, 0x4E, 0x00, 0x08, 0x44, 0x00, 0x7F, 0xCE, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x9B, 0x00, 0x08, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9779, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x5D, 0x00, 0x49, 0x55, 0x00, 0x49, 0x55, 0x00, 0x7F, 0x63, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x977A, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x11, 0x7F, 0x80, 0x1F, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x24, 0x8E, 0x00, 0x3F, 0x96, 0x00, 0x04, 0x15, 0x00, 0x3F, 0xA5, 0x00, 0x04, 0x44, 0x80, 0x04, 0x84, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x977B, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x977C, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x49, 0x22, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x977D, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x2A, 0x00, 0x7F, 0x6B, 0x00, 0x22, 0x49, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x977F, { 0x00, 0x00, 0x00, 0x28, 0x84, 0x00, 0x28, 0x84, 0x00, 0x7D, 0x84, 0x00, 0x29, 0x04, 0x00, 0x2B, 0x1F, 0x80, 0x3A, 0x44, 0x80, 0x13, 0x44, 0x80, 0x7D, 0xC4, 0x80, 0x54, 0x84, 0x80, 0x54, 0x84, 0x80, 0x7D, 0x8C, 0x80, 0x11, 0x28, 0x80, 0x7D, 0x29, 0x80, 0x13, 0xF9, 0x00, 0x16, 0x11, 0x00, 0x10, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9780, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x7F, 0x11, 0x00, 0x22, 0x11, 0x00, 0x22, 0x31, 0x00, 0x3E, 0x23, 0x00, 0x08, 0x62, 0x00, 0x7F, 0xCE, 0x00, 0x49, 0x00, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9781, { 0x00, 0x00, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x80, 0x3C, 0x89, 0x00, 0x10, 0x88, 0x00, 0x7E, 0xFF, 0x00, 0x52, 0xA1, 0x00, 0x52, 0xA3, 0x00, 0x7E, 0xB2, 0x00, 0x10, 0x96, 0x00, 0x7E, 0x8C, 0x00, 0x10, 0x9A, 0x00, 0x11, 0x33, 0x00, 0x10, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9784, { 0x00, 0x00, 0x00, 0x22, 0x20, 0x00, 0x22, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0xF9, 0x00, 0x08, 0x09, 0x00, 0x7F, 0x09, 0x00, 0x49, 0x79, 0x00, 0x49, 0x43, 0x00, 0x7F, 0x42, 0x00, 0x08, 0x4E, 0x00, 0x7F, 0x40, 0x00, 0x08, 0x40, 0x80, 0x08, 0x61, 0x80, 0x08, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9785, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x49, 0xFF, 0x80, 0x49, 0x14, 0x00, 0x7F, 0x14, 0x00, 0x08, 0x14, 0x00, 0x7F, 0x36, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9786, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x49, 0x5D, 0x00, 0x49, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x08, 0x63, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9789, { 0x00, 0x00, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x14, 0x24, 0x80, 0x15, 0xA5, 0x80, 0x1C, 0xE7, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x27, 0x00, 0x2A, 0xE5, 0x80, 0x3F, 0xA4, 0x80, 0x08, 0x24, 0x00, 0x7F, 0x64, 0x00, 0x08, 0x44, 0x80, 0x08, 0xC4, 0x80, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x978B, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x15, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x3F, 0x80, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x978D, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x40, 0x80, 0x1F, 0x08, 0x00, 0x15, 0x08, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x91, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xB2, 0x00, 0x04, 0x4C, 0x00, 0x04, 0x0C, 0x00, 0x3F, 0x92, 0x00, 0x04, 0x21, 0x00, 0x04, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x978F, { 0x00, 0x00, 0x00, 0x3F, 0x7C, 0x00, 0x08, 0x44, 0x00, 0x08, 0x64, 0x80, 0x0F, 0x57, 0x80, 0x38, 0x80, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9790, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x22, 0x0F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x7F, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x0E, 0x00, 0x7F, 0x0B, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9791, { 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x14, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x14, 0x88, 0x00, 0x1C, 0xBE, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x94, 0x00, 0x3E, 0x94, 0x00, 0x08, 0x92, 0x00, 0x7E, 0xA2, 0x00, 0x08, 0x80, 0x00, 0x09, 0x43, 0x00, 0x0A, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9792, { 0x00, 0x00, 0x00, 0x14, 0x0E, 0x00, 0x14, 0xF0, 0x00, 0x7F, 0x10, 0x00, 0x14, 0x12, 0x00, 0x1D, 0xFF, 0x00, 0x08, 0x28, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x83, 0x00, 0x2B, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9794, { 0x00, 0x00, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x00, 0x7F, 0x3C, 0x00, 0x14, 0x48, 0x00, 0x1C, 0x92, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x08, 0x28, 0x00, 0x7F, 0x28, 0x00, 0x08, 0x48, 0x00, 0x08, 0x49, 0x00, 0x08, 0x89, 0x00, 0x09, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9795, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x49, 0x49, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x28, 0x00, 0x7F, 0x18, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9796, { 0x00, 0x00, 0x00, 0x22, 0x03, 0x00, 0x22, 0x0E, 0x00, 0x7F, 0x78, 0x00, 0x22, 0x09, 0x00, 0x22, 0x2D, 0x80, 0x3E, 0x64, 0x80, 0x08, 0x48, 0x80, 0x7F, 0x08, 0x00, 0x49, 0x7F, 0x80, 0x49, 0x12, 0x00, 0x7F, 0x32, 0x00, 0x08, 0x26, 0x00, 0x7F, 0x74, 0x00, 0x08, 0x1E, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9797, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0xFF, 0x80, 0x0D, 0xA2, 0x00, 0x08, 0x3C, 0x00, 0x1B, 0xC3, 0x80, 0x14, 0x44, 0x00, 0x35, 0xFF, 0x00, 0x54, 0x44, 0x00, 0x14, 0x7C, 0x00, 0x14, 0x10, 0x00, 0x15, 0xFF, 0x00, 0x15, 0x11, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9798, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x49, 0x00, 0x7F, 0x6B, 0x00, 0x22, 0x2A, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9799, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x979A, { 0x00, 0x00, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x3C, 0x64, 0x00, 0x10, 0xC7, 0x80, 0x7E, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, 0x7F, 0x00, 0x7E, 0x08, 0x00, 0x10, 0x08, 0x00, 0x7E, 0x08, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x979C, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x09, 0x00, 0x7F, 0x6B, 0x00, 0x22, 0x2C, 0x00, 0x22, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x7F, 0x18, 0x00, 0x49, 0x00, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x979E, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x14, 0x00, 0x7F, 0x24, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x979F, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x22, 0x00, 0x00, 0x22, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x3E, 0x00, 0x7F, 0x00, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x06, 0x00, 0x7F, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97A0, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x3F, 0xA0, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x48, 0x80, 0x04, 0xA9, 0x80, 0x3F, 0x9A, 0x80, 0x24, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x3F, 0x9C, 0x80, 0x04, 0x1C, 0x80, 0x04, 0x2A, 0x80, 0x3F, 0xAA, 0x80, 0x04, 0x49, 0x80, 0x04, 0x89, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97A2, { 0x00, 0x00, 0x00, 0x14, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x2A, 0x00, 0x14, 0x2A, 0x00, 0x1C, 0x2E, 0x00, 0x08, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x7F, 0x6B, 0x00, 0x08, 0x49, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97A3, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x22, 0x00, 0x14, 0x14, 0x00, 0x14, 0xFF, 0x80, 0x1C, 0x29, 0x00, 0x08, 0x6A, 0x00, 0x3E, 0xC8, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x08, 0x6B, 0x00, 0x08, 0xC9, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97A6, { 0x00, 0x00, 0x00, 0x14, 0x32, 0x00, 0x14, 0xE2, 0x00, 0x7F, 0x42, 0x00, 0x14, 0x4A, 0x80, 0x14, 0x4A, 0x80, 0x1D, 0xFA, 0x80, 0x08, 0x4A, 0x80, 0x3E, 0x42, 0x00, 0x2A, 0xE2, 0x00, 0x2B, 0x52, 0x00, 0x3E, 0x47, 0x00, 0x08, 0x45, 0x00, 0x7F, 0x45, 0x00, 0x08, 0x45, 0x00, 0x08, 0x4D, 0x80, 0x08, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97A8, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x90, 0x00, 0x24, 0xBF, 0x80, 0x24, 0xE4, 0x80, 0x3F, 0xAA, 0x80, 0x04, 0x31, 0x80, 0x04, 0x20, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x20, 0x80, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97AB, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x3F, 0xA0, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x40, 0x80, 0x04, 0xBE, 0x80, 0x3F, 0x80, 0x80, 0x24, 0xBE, 0x80, 0x24, 0x80, 0x80, 0x3F, 0xFF, 0x80, 0x04, 0x00, 0x80, 0x04, 0x3E, 0x80, 0x3F, 0xA2, 0x80, 0x04, 0x3E, 0x80, 0x04, 0x01, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97AC, { 0x00, 0x00, 0x00, 0x28, 0x04, 0x00, 0x29, 0xDF, 0x00, 0x7C, 0x45, 0x00, 0x28, 0x85, 0x00, 0x29, 0x3F, 0x80, 0x39, 0xC5, 0x00, 0x10, 0x45, 0x00, 0x7C, 0x5F, 0x00, 0x55, 0x44, 0x00, 0x55, 0x5F, 0x00, 0x7D, 0xC4, 0x00, 0x10, 0xBF, 0x80, 0x7C, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x40, 0x00, 0x11, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97AD, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x3F, 0xBF, 0x80, 0x11, 0x22, 0x00, 0x1F, 0x6F, 0x80, 0x15, 0xAA, 0x80, 0x04, 0x2F, 0x80, 0x3F, 0xAA, 0x80, 0x24, 0xAF, 0x80, 0x3F, 0xA2, 0x00, 0x04, 0x2A, 0x00, 0x04, 0x26, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x25, 0x00, 0x04, 0x28, 0x80, 0x04, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97AE, { 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x7E, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x3C, 0x41, 0x00, 0x10, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x08, 0x00, 0x7E, 0x48, 0x00, 0x10, 0x4F, 0x00, 0x7E, 0x48, 0x00, 0x10, 0xE8, 0x00, 0x11, 0xB8, 0x00, 0x13, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97AF, { 0x00, 0x00, 0x00, 0x14, 0x48, 0x00, 0x14, 0x48, 0x00, 0x7F, 0xFE, 0x00, 0x14, 0x48, 0x00, 0x1C, 0x22, 0x00, 0x09, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x84, 0x00, 0x3F, 0x88, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0xA8, 0x00, 0x08, 0x90, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97B1, { 0x00, 0x00, 0x00, 0x22, 0x01, 0x80, 0x22, 0x0F, 0x00, 0x7F, 0x78, 0x00, 0x22, 0x09, 0x00, 0x22, 0x2D, 0x80, 0x3E, 0x64, 0x80, 0x08, 0x40, 0x00, 0x7F, 0x18, 0x00, 0x49, 0x73, 0x80, 0x49, 0x40, 0x80, 0x7F, 0x40, 0x80, 0x08, 0x73, 0x80, 0x7F, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x40, 0x80, 0x08, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97B2, { 0x00, 0x00, 0x00, 0x28, 0x24, 0x00, 0x28, 0x24, 0x00, 0x7D, 0xFF, 0x80, 0x28, 0x24, 0x00, 0x28, 0xFF, 0x00, 0x38, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x7C, 0x10, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x91, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x91, 0x00, 0x7D, 0xFF, 0x80, 0x10, 0x81, 0x00, 0x10, 0x81, 0x00, 0x10, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97B3, { 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x14, 0x08, 0x00, 0x1C, 0x1C, 0x00, 0x08, 0x36, 0x00, 0x3E, 0xE3, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97B4, { 0x00, 0x00, 0x00, 0x14, 0x24, 0x00, 0x14, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x14, 0x24, 0x00, 0x14, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x3E, 0xBF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x08, 0xA9, 0x00, 0x7F, 0xBF, 0x00, 0x08, 0xA9, 0x00, 0x09, 0x29, 0x00, 0x08, 0x2B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97B5, { 0x00, 0x00, 0x00, 0x24, 0x03, 0x00, 0x24, 0x0E, 0x00, 0x7E, 0x79, 0x00, 0x24, 0x4D, 0x80, 0x24, 0xC4, 0x80, 0x3C, 0x90, 0x00, 0x10, 0x24, 0x00, 0x7E, 0x48, 0x00, 0x52, 0x32, 0x00, 0x52, 0x1F, 0x00, 0x7E, 0xF1, 0x80, 0x10, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x10, 0x14, 0x00, 0x10, 0x22, 0x00, 0x10, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97B6, { 0x00, 0x00, 0x00, 0x04, 0x3E, 0x00, 0x1F, 0x23, 0x80, 0x15, 0x40, 0x00, 0x7F, 0xBF, 0x00, 0x11, 0x11, 0x00, 0x35, 0x0E, 0x00, 0x61, 0x31, 0x80, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97B8, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x2A, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97B9, { 0x00, 0x00, 0x00, 0x28, 0x40, 0x00, 0x28, 0x47, 0x80, 0x7F, 0xFC, 0x80, 0x28, 0x04, 0x80, 0x29, 0xF5, 0x80, 0x39, 0x15, 0x00, 0x11, 0xF5, 0x00, 0x7C, 0x05, 0x00, 0x55, 0xF4, 0x80, 0x54, 0x24, 0x80, 0x7C, 0x44, 0x80, 0x10, 0x74, 0x80, 0x7D, 0xC4, 0x80, 0x10, 0x45, 0x80, 0x10, 0x44, 0x00, 0x11, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97BA, { 0x00, 0x00, 0x00, 0x14, 0x49, 0x00, 0x14, 0x6B, 0x00, 0x7F, 0x2A, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x1C, 0x80, 0x80, 0x08, 0xBE, 0x80, 0x3E, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x3E, 0x00, 0x3E, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97BC, { 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97BE, { 0x00, 0x00, 0x00, 0x24, 0x14, 0x00, 0x24, 0x14, 0x00, 0x7E, 0xFF, 0x80, 0x24, 0x14, 0x00, 0x24, 0x00, 0x00, 0x3C, 0x7F, 0x00, 0x10, 0x2A, 0x00, 0x7E, 0x2A, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x2A, 0x00, 0x7E, 0x2A, 0x00, 0x10, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x10, 0x08, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97BF, { 0x00, 0x00, 0x00, 0x24, 0x49, 0x00, 0x24, 0xCB, 0x00, 0x7E, 0x8A, 0x00, 0x24, 0xAA, 0x80, 0x24, 0x49, 0x00, 0x3C, 0x8A, 0x00, 0x10, 0xAA, 0x80, 0x7E, 0xEB, 0x80, 0x52, 0x09, 0x00, 0x52, 0xFF, 0x80, 0x7E, 0x88, 0x00, 0x10, 0x89, 0x00, 0x7E, 0xCA, 0x00, 0x10, 0xA4, 0x80, 0x10, 0x8A, 0x80, 0x11, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97C1, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97C3, { 0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x3B, 0x41, 0x00, 0x11, 0x22, 0x00, 0x7C, 0x7F, 0x00, 0x57, 0x08, 0x00, 0x55, 0x7F, 0x00, 0x7D, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x7D, 0x08, 0x00, 0x11, 0x08, 0x00, 0x13, 0x80, 0x00, 0x12, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97C4, { 0x00, 0x00, 0x00, 0x28, 0x24, 0x00, 0x29, 0xFF, 0x80, 0x7C, 0x24, 0x00, 0x28, 0x48, 0x00, 0x28, 0xFF, 0x80, 0x39, 0x88, 0x00, 0x10, 0xFF, 0x00, 0x7C, 0x88, 0x00, 0x54, 0xFF, 0x00, 0x54, 0x88, 0x00, 0x7C, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x7D, 0xFF, 0x00, 0x10, 0x42, 0x00, 0x10, 0x3C, 0x00, 0x11, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97C5, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xCC, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x22, 0x00, 0x3E, 0x54, 0x80, 0x08, 0xF7, 0x80, 0x7F, 0x00, 0x00, 0x08, 0x55, 0x00, 0x08, 0xD5, 0x80, 0x08, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97C6, { 0x00, 0x00, 0x00, 0x15, 0x7F, 0x80, 0x14, 0x94, 0x00, 0x3E, 0x7F, 0x80, 0x14, 0x54, 0x80, 0x1C, 0x7F, 0x80, 0x09, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x14, 0x00, 0x2A, 0xE3, 0x80, 0x3E, 0x1E, 0x00, 0x09, 0xD2, 0x00, 0x08, 0x5E, 0x80, 0x3E, 0x5F, 0x80, 0x08, 0x40, 0x00, 0x08, 0xBF, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97C7, { 0x00, 0x00, 0x00, 0x14, 0x08, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x08, 0xA4, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97C8, { 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x7E, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x14, 0x7F, 0x00, 0x1C, 0x55, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x02, 0x00, 0x2A, 0x05, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0x44, 0x00, 0x08, 0x65, 0x00, 0x7F, 0x57, 0x00, 0x08, 0x42, 0x80, 0x08, 0xCF, 0x80, 0x08, 0x99, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97C9, { 0x00, 0x00, 0x00, 0x28, 0x42, 0x00, 0x29, 0xFF, 0x80, 0x7C, 0x42, 0x00, 0x28, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x39, 0x24, 0x00, 0x11, 0xFF, 0x00, 0x7D, 0x25, 0x00, 0x55, 0xFF, 0x00, 0x55, 0x40, 0x00, 0x7D, 0x7F, 0x80, 0x11, 0x40, 0x00, 0x7D, 0x7F, 0x80, 0x11, 0x00, 0x80, 0x12, 0x54, 0x80, 0x10, 0x95, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97CA, { 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x14, 0xFF, 0x80, 0x7F, 0x22, 0x00, 0x14, 0xF7, 0x80, 0x14, 0x94, 0x80, 0x1C, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x3E, 0xF7, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x3E, 0xAA, 0x80, 0x08, 0xBE, 0x80, 0x7F, 0xAA, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x9C, 0x80, 0x08, 0xAB, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97CB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97CC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0x3F, 0x80, 0x11, 0x04, 0x80, 0x11, 0x04, 0x80, 0x7F, 0x84, 0x80, 0x00, 0x14, 0x80, 0x3F, 0x14, 0x80, 0x21, 0x14, 0x80, 0x3F, 0x34, 0x80, 0x02, 0x24, 0x80, 0x3F, 0x84, 0x80, 0x22, 0x0C, 0x80, 0x22, 0x09, 0x80, 0x7F, 0x89, 0x00, 0x02, 0x19, 0x00, 0x02, 0x37, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97CD, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x13, 0x00, 0x12, 0x11, 0x00, 0x12, 0xFF, 0x80, 0x7F, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x39, 0x00, 0x3E, 0x2B, 0x00, 0x04, 0x6A, 0x00, 0x3F, 0x4E, 0x00, 0x24, 0xC4, 0x00, 0x24, 0x0E, 0x00, 0x7F, 0x1A, 0x00, 0x04, 0x33, 0x00, 0x04, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97CE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x12, 0x08, 0x00, 0x12, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0x2A, 0x00, 0x24, 0x6B, 0x00, 0x24, 0x49, 0x00, 0x7F, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97D0, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x12, 0x14, 0x00, 0x12, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x3E, 0x00, 0x24, 0x22, 0x00, 0x24, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97D1, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7E, 0x00, 0x4A, 0x22, 0x00, 0x6A, 0x22, 0x00, 0x2A, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x08, 0x00, 0x14, 0x7E, 0x00, 0x14, 0x48, 0x00, 0x15, 0xFF, 0x00, 0x34, 0x08, 0x80, 0x26, 0x08, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97D3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x12, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x04, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x24, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97D4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x3F, 0x00, 0x12, 0x20, 0x00, 0x12, 0x3E, 0x00, 0x7F, 0x20, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x3E, 0xFF, 0x80, 0x04, 0x29, 0x00, 0x3F, 0x2B, 0x00, 0x24, 0x2E, 0x00, 0x24, 0x24, 0x00, 0x7F, 0x26, 0x00, 0x04, 0x3B, 0x00, 0x04, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97D7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x12, 0x80, 0x80, 0x12, 0x88, 0x80, 0x7F, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97D8, { 0x00, 0x00, 0x00, 0x08, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x4A, 0x00, 0x7F, 0x4A, 0x00, 0x00, 0x4E, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x3F, 0x2A, 0x00, 0x24, 0x2A, 0x00, 0x24, 0x6B, 0x00, 0x7F, 0x49, 0x00, 0x04, 0xC9, 0x80, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97D9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x21, 0x7F, 0x80, 0x21, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x7F, 0xBF, 0x00, 0x04, 0x04, 0x00, 0x24, 0x3F, 0x00, 0x27, 0xA4, 0x00, 0x24, 0x7F, 0x80, 0x34, 0x04, 0x00, 0x6C, 0x04, 0x00, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97DB, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x80, 0x00, 0x22, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x04, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x24, 0xA9, 0x00, 0x24, 0xBF, 0x00, 0x7F, 0xA9, 0x00, 0x04, 0xA9, 0x00, 0x05, 0x2B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97DC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x07, 0x00, 0x1E, 0x39, 0x00, 0x0A, 0x24, 0x80, 0x0A, 0x42, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x00, 0x12, 0x63, 0x80, 0x1E, 0x40, 0x80, 0x00, 0x40, 0x80, 0x3F, 0x73, 0x80, 0x12, 0x40, 0x80, 0x3F, 0xC0, 0x80, 0x02, 0x7F, 0x80, 0x02, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97DD, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x12, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x3E, 0xFF, 0x80, 0x24, 0x49, 0x00, 0x24, 0xFF, 0x80, 0x7F, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97DE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x3E, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x00, 0x36, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x55, 0x00, 0x24, 0x55, 0x00, 0x24, 0x55, 0x00, 0x7F, 0x55, 0x00, 0x04, 0x55, 0x00, 0x04, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97E0, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x12, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x2A, 0x00, 0x3E, 0xFF, 0x80, 0x04, 0x2A, 0x00, 0x3F, 0x2A, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97E1, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x3E, 0x14, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x3E, 0xFF, 0x80, 0x04, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7E, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97E4, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x02, 0x00, 0x3E, 0x05, 0x00, 0x04, 0x7F, 0x80, 0x3E, 0x44, 0x00, 0x24, 0x65, 0x00, 0x24, 0x57, 0x00, 0x7F, 0x42, 0x80, 0x04, 0xCF, 0x80, 0x04, 0x99, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97E6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x88, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x94, 0x00, 0x00, 0x88, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97E7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x7F, 0x12, 0x00, 0x08, 0x12, 0x00, 0x08, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x92, 0x00, 0x7F, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x22, 0x00, 0x0D, 0x22, 0x00, 0x0A, 0x42, 0x00, 0x08, 0x4A, 0x00, 0x09, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97E9, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x10, 0x00, 0x7F, 0x92, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x94, 0x00, 0x20, 0xFE, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x11, 0x00, 0x04, 0x91, 0x00, 0x7F, 0xD5, 0x00, 0x04, 0x12, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97EA, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x7E, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x7E, 0x00, 0x00, 0x10, 0x00, 0x7F, 0x92, 0x00, 0x04, 0xFF, 0x00, 0x14, 0x12, 0x00, 0x17, 0x92, 0x00, 0x14, 0x1A, 0x00, 0x1C, 0x14, 0x00, 0x24, 0x10, 0x00, 0x42, 0x13, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97EB, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x7D, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x7D, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x7D, 0xFC, 0x00, 0x15, 0x54, 0x00, 0x15, 0x54, 0x00, 0x1D, 0x54, 0x00, 0x11, 0x54, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97EC, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x1E, 0x00, 0x13, 0xE0, 0x00, 0x7D, 0x24, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA8, 0x00, 0x7C, 0x42, 0x00, 0x11, 0x9F, 0x00, 0x11, 0x02, 0x00, 0x7D, 0x02, 0x00, 0x15, 0xDE, 0x00, 0x15, 0x02, 0x00, 0x1D, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97ED, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x1E, 0x1E, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x1E, 0x1E, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97EE, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3E, 0x1F, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97EF, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x93, 0x00, 0x04, 0x11, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x39, 0xC9, 0x00, 0x09, 0x0B, 0x00, 0x39, 0xCA, 0x00, 0x09, 0x0E, 0x00, 0x39, 0xC4, 0x00, 0x09, 0x0E, 0x80, 0x0F, 0xDA, 0x80, 0x78, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97F1, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x31, 0x8A, 0x00, 0x29, 0x6B, 0x00, 0x6B, 0x29, 0x00, 0x00, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x39, 0xC9, 0x00, 0x09, 0x0B, 0x00, 0x39, 0xCA, 0x00, 0x09, 0x0E, 0x00, 0x39, 0xC4, 0x00, 0x09, 0x0E, 0x80, 0x0F, 0xDA, 0x80, 0x78, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97F2, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3D, 0x5F, 0x00, 0x14, 0x92, 0x00, 0x34, 0x93, 0x00, 0x6C, 0x19, 0x80, 0x01, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x20, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97F3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97F4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x22, 0x08, 0x00, 0x36, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97F5, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x21, 0x3F, 0x80, 0x33, 0x20, 0x80, 0x12, 0x60, 0x80, 0x7F, 0x9C, 0x80, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x80, 0x21, 0x0C, 0x80, 0x21, 0x18, 0x80, 0x3F, 0x30, 0x80, 0x21, 0x01, 0x80, 0x21, 0x01, 0x00, 0x3F, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97F6, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x88, 0x80, 0x11, 0x08, 0x80, 0x09, 0x10, 0x80, 0x0A, 0x10, 0x80, 0x3F, 0xA1, 0x00, 0x00, 0x46, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x80, 0x11, 0x20, 0x80, 0x1F, 0x20, 0x80, 0x11, 0x20, 0x80, 0x11, 0x3F, 0x80, 0x1F, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97F7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x49, 0x00, 0x22, 0x49, 0x00, 0x36, 0x49, 0x00, 0x14, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97F8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x7F, 0x31, 0x00, 0x22, 0x63, 0x00, 0x36, 0xD6, 0x00, 0x14, 0x1C, 0x00, 0x7F, 0x36, 0x00, 0x00, 0xE3, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x97FA, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x7F, 0x80, 0x22, 0x22, 0x00, 0x36, 0x22, 0x00, 0x14, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x14, 0x00, 0x22, 0x14, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97FB, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x0A, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x80, 0x1F, 0x7F, 0x80, 0x11, 0x40, 0x80, 0x11, 0x7F, 0x80, 0x1F, 0x40, 0x80, 0x11, 0x7F, 0x80, 0x11, 0x00, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x97FF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xF7, 0x80, 0x33, 0x14, 0x80, 0x0D, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x33, 0xF4, 0x80, 0x0D, 0x04, 0x80, 0x09, 0xF5, 0x80, 0x31, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9800, { 0x00, 0x00, 0x00, 0x04, 0x22, 0x00, 0x04, 0xFF, 0x80, 0x3F, 0xA2, 0x00, 0x11, 0x24, 0x00, 0x0A, 0x7F, 0x80, 0x0A, 0x48, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x48, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x48, 0x00, 0x11, 0x7F, 0x80, 0x1F, 0x40, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x1C, 0x00, 0x11, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9801, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9802, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x04, 0x41, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0C, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9803, { 0x00, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x10, 0x00, 0x20, 0x7F, 0x00, 0x27, 0x41, 0x00, 0x38, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x20, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9805, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0E, 0x7F, 0x00, 0x38, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9806, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x10, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x25, 0x22, 0x00, 0x21, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9807, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x22, 0x00, 0x08, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9808, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x04, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x20, 0x81, 0x00, 0x02, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x08, 0x81, 0x00, 0x10, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x980A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x30, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x980C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x7F, 0x80, 0x01, 0x04, 0x00, 0x09, 0x08, 0x00, 0x08, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x10, 0x61, 0x00, 0x24, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x10, 0xA1, 0x00, 0x11, 0xE1, 0x00, 0x2E, 0x7F, 0x00, 0x30, 0x21, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x980D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x01, 0x7F, 0x00, 0x03, 0x41, 0x00, 0x32, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x0B, 0x7F, 0x00, 0x19, 0x22, 0x00, 0x30, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x980E, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0E, 0xFF, 0x80, 0x38, 0x08, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x64, 0x22, 0x00, 0x44, 0x63, 0x00, 0x04, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x980F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x7F, 0xBF, 0x00, 0x00, 0x21, 0x00, 0x1E, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0xA1, 0x00, 0x32, 0xBF, 0x00, 0x21, 0x92, 0x00, 0x60, 0x33, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9810, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x01, 0x04, 0x00, 0x12, 0x08, 0x00, 0x0C, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x05, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x0C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9811, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x11, 0xE1, 0x00, 0x17, 0x3F, 0x00, 0x10, 0x21, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9812, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x7F, 0x80, 0x01, 0x08, 0x00, 0x08, 0x90, 0x00, 0x10, 0x7F, 0x00, 0x20, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x10, 0xBF, 0x00, 0x11, 0x21, 0x00, 0x26, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9813, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x04, 0x00, 0x07, 0xC8, 0x00, 0x3C, 0x1F, 0x00, 0x04, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x04, 0x11, 0x00, 0x04, 0x51, 0x00, 0x04, 0x5F, 0x00, 0x07, 0xD1, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9814, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9816, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x2A, 0x7F, 0x80, 0x6B, 0x08, 0x00, 0x49, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x7F, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x12, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9817, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x3F, 0x80, 0x1F, 0xC4, 0x00, 0x12, 0x48, 0x00, 0x12, 0x9F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x1F, 0xDF, 0x00, 0x18, 0x91, 0x00, 0x14, 0x91, 0x00, 0x13, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x12, 0x91, 0x00, 0x12, 0x9F, 0x00, 0x24, 0x11, 0x00, 0x28, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9818, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x20, 0x10, 0x00, 0x1F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x41, 0x00, 0x16, 0x7F, 0x00, 0x10, 0x22, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9819, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x28, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2E, 0x7F, 0x00, 0x38, 0x22, 0x00, 0x60, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x981A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x36, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x36, 0x41, 0x00, 0x63, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0F, 0x22, 0x00, 0x78, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x981C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x36, 0x7F, 0x00, 0x63, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x981E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x41, 0x7F, 0x00, 0x51, 0x41, 0x00, 0x10, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x32, 0x41, 0x00, 0x26, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x74, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x22, 0x00, 0x32, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9820, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x32, 0x08, 0x00, 0x24, 0x3F, 0x00, 0x7F, 0xA1, 0x00, 0x20, 0x21, 0x00, 0x20, 0x3F, 0x00, 0x2F, 0x21, 0x00, 0x29, 0x21, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x2B, 0x21, 0x00, 0x28, 0x3F, 0x00, 0x28, 0x92, 0x00, 0x4C, 0xB3, 0x00, 0x07, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9821, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x22, 0x12, 0x00, 0x3E, 0x33, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9823, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x48, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x7E, 0x42, 0x00, 0x42, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x48, 0x42, 0x00, 0x48, 0x42, 0x00, 0x48, 0x7E, 0x00, 0x48, 0x24, 0x00, 0x7E, 0x66, 0x00, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9824, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x44, 0x08, 0x00, 0x44, 0x3E, 0x00, 0x54, 0x22, 0x00, 0x57, 0x22, 0x00, 0x51, 0x3E, 0x00, 0x51, 0x22, 0x00, 0x51, 0x22, 0x00, 0x57, 0x3E, 0x00, 0x54, 0x22, 0x00, 0x44, 0x22, 0x00, 0x44, 0x3E, 0x00, 0x7F, 0x14, 0x00, 0x00, 0x36, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9825, { 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x5F, 0x7F, 0x00, 0x54, 0x08, 0x00, 0x54, 0x3E, 0x00, 0x54, 0x22, 0x00, 0x5F, 0x22, 0x00, 0x51, 0x3E, 0x00, 0x51, 0x22, 0x00, 0x51, 0x22, 0x00, 0x5F, 0x3E, 0x00, 0x54, 0x22, 0x00, 0x54, 0x22, 0x00, 0x54, 0x3E, 0x00, 0x54, 0x14, 0x00, 0x5F, 0x36, 0x00, 0x40, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9826, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x7F, 0xBF, 0x00, 0x08, 0x21, 0x00, 0x18, 0x21, 0x00, 0x32, 0x3F, 0x00, 0x16, 0x21, 0x00, 0x0C, 0x21, 0x00, 0x19, 0x3F, 0x00, 0x33, 0x21, 0x00, 0x66, 0x21, 0x00, 0x0C, 0x3F, 0x00, 0x1A, 0x12, 0x00, 0x33, 0x33, 0x00, 0x61, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x982B, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x04, 0x00, 0x6A, 0xDF, 0x00, 0x3B, 0x91, 0x00, 0x0A, 0x11, 0x00, 0x0A, 0x1F, 0x00, 0x0A, 0x11, 0x00, 0x0B, 0x91, 0x00, 0x3A, 0xDF, 0x00, 0x6A, 0x51, 0x00, 0x0A, 0x11, 0x00, 0x1A, 0x5F, 0x00, 0x12, 0x4A, 0x00, 0x31, 0xDB, 0x00, 0x60, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x982C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x36, 0x22, 0x00, 0x23, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x982D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x17, 0xA1, 0x00, 0x38, 0x3F, 0x00, 0x00, 0x11, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x982E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xBF, 0x80, 0x75, 0x84, 0x00, 0x15, 0x1F, 0x00, 0x16, 0x11, 0x00, 0x35, 0x11, 0x00, 0x64, 0xDF, 0x00, 0x1C, 0x11, 0x00, 0x00, 0x11, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x0A, 0x00, 0x31, 0x1B, 0x00, 0x61, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x982F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x18, 0x88, 0x00, 0x35, 0xBF, 0x00, 0x6B, 0x21, 0x00, 0x06, 0x21, 0x00, 0x1C, 0x3F, 0x00, 0x70, 0x21, 0x00, 0x00, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x7F, 0xA1, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x32, 0x33, 0x00, 0x62, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9830, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3F, 0x00, 0x15, 0x21, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x2E, 0xA1, 0x00, 0x24, 0x61, 0x00, 0x04, 0x3F, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x10, 0x92, 0x00, 0x20, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9832, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x71, 0xBF, 0x80, 0x17, 0x04, 0x00, 0x21, 0x1F, 0x00, 0x41, 0x11, 0x00, 0x71, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x51, 0x1F, 0x00, 0x51, 0x11, 0x00, 0x71, 0x11, 0x00, 0x27, 0xDF, 0x00, 0x70, 0x0A, 0x00, 0x5C, 0x1B, 0x00, 0x47, 0xD1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9833, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x08, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x7F, 0xBF, 0x00, 0x0A, 0x21, 0x00, 0x2B, 0x21, 0x00, 0x2A, 0xBF, 0x00, 0x6A, 0x21, 0x00, 0x4A, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x1A, 0x12, 0x00, 0x12, 0x33, 0x00, 0x36, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9834, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x23, 0x7F, 0x80, 0x3E, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x20, 0xA1, 0x00, 0x1F, 0xA1, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0x21, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x21, 0x00, 0x15, 0x21, 0x00, 0x35, 0xBF, 0x00, 0x24, 0x92, 0x00, 0x64, 0x33, 0x00, 0x0C, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9835, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x09, 0x08, 0x00, 0x09, 0x3F, 0x00, 0x7F, 0xA1, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x51, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x12, 0x00, 0x11, 0x33, 0x00, 0x1F, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9837, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x7F, 0x80, 0x1B, 0x08, 0x00, 0x31, 0xBF, 0x00, 0x6E, 0x21, 0x00, 0x00, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x21, 0x00, 0x02, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x3F, 0x00, 0x21, 0x12, 0x00, 0x3F, 0x33, 0x00, 0x00, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9838, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x0A, 0x88, 0x00, 0x15, 0x3F, 0x00, 0x2A, 0x21, 0x00, 0x15, 0x21, 0x00, 0x0A, 0xBF, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xD1, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9839, { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1C, 0x3F, 0x80, 0x04, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x0E, 0x1F, 0x00, 0x15, 0x11, 0x00, 0x14, 0xD1, 0x00, 0x24, 0x1F, 0x00, 0x00, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0x1F, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xDF, 0x00, 0x16, 0x11, 0x00, 0x10, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x983B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x04, 0x04, 0x00, 0x14, 0x08, 0x00, 0x17, 0xBF, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x21, 0x00, 0x14, 0x21, 0x00, 0x14, 0xBF, 0x00, 0x2D, 0x21, 0x00, 0x22, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x30, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x983C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x1A, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x28, 0x22, 0x00, 0x48, 0x63, 0x00, 0x08, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x983D, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x7F, 0x80, 0x3C, 0x08, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0xE1, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x35, 0xA1, 0x00, 0x64, 0xE1, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0xBF, 0x00, 0x33, 0x12, 0x00, 0x22, 0x33, 0x00, 0x60, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x983E, { 0x00, 0x00, 0x00, 0x02, 0xFF, 0x80, 0x06, 0x08, 0x00, 0x0C, 0x7F, 0x00, 0x39, 0x41, 0x00, 0x03, 0x7F, 0x00, 0x0E, 0x41, 0x00, 0x79, 0x7F, 0x00, 0x03, 0x41, 0x00, 0x0E, 0x7F, 0x00, 0x78, 0x22, 0x00, 0x00, 0xC1, 0x80, 0x08, 0x20, 0x00, 0x0F, 0xBE, 0x00, 0x28, 0x20, 0x80, 0x2F, 0xA1, 0x80, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9844, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x01, 0x04, 0x00, 0x02, 0x1F, 0x00, 0x44, 0x51, 0x00, 0x44, 0x51, 0x00, 0x64, 0xDF, 0x00, 0x55, 0x51, 0x00, 0x44, 0x51, 0x00, 0x56, 0x5F, 0x00, 0x57, 0x51, 0x00, 0x65, 0xD1, 0x00, 0x44, 0x5F, 0x00, 0x4C, 0x4A, 0x00, 0x40, 0x5B, 0x00, 0x7F, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9846, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x24, 0x88, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA0, 0x80, 0x24, 0xA0, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x20, 0x80, 0x04, 0x20, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x20, 0x80, 0x0E, 0x20, 0x80, 0x15, 0x3F, 0x80, 0x14, 0x91, 0x00, 0x24, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9847, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x08, 0x00, 0x00, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x00, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x12, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x984A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x3F, 0x08, 0x00, 0x21, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x08, 0x21, 0x00, 0x7F, 0xBF, 0x00, 0x08, 0x12, 0x00, 0x08, 0x33, 0x00, 0x08, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x984B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x1F, 0x00, 0x06, 0x11, 0x00, 0x0A, 0x91, 0x00, 0x28, 0xDF, 0x00, 0x29, 0x4A, 0x00, 0x69, 0x1B, 0x00, 0x47, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x984C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x11, 0x08, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xE1, 0x00, 0x04, 0x3F, 0x00, 0x14, 0x21, 0x00, 0x17, 0xA1, 0x00, 0x14, 0x3F, 0x00, 0x1C, 0x61, 0x80, 0x27, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x984D, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x82, 0x00, 0x24, 0x84, 0x00, 0x04, 0x1F, 0x00, 0x0F, 0x91, 0x00, 0x11, 0x11, 0x00, 0x2A, 0x1F, 0x00, 0x06, 0x11, 0x00, 0x09, 0x11, 0x00, 0x30, 0xDF, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x984E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0x80, 0x2A, 0x84, 0x00, 0x2A, 0x88, 0x00, 0x3B, 0x9F, 0x00, 0x00, 0x11, 0x00, 0x1F, 0x91, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x08, 0x1F, 0x00, 0x1F, 0xD1, 0x00, 0x10, 0x51, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x91, 0x00, 0x03, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x984F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x06, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x22, 0x3F, 0x00, 0x26, 0x21, 0x00, 0x2D, 0x21, 0x00, 0x23, 0x3F, 0x00, 0x26, 0x21, 0x00, 0x6C, 0xA1, 0x00, 0x41, 0xBF, 0x00, 0x43, 0x12, 0x00, 0x0E, 0x33, 0x00, 0x38, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9851, { 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x02, 0xBF, 0x80, 0x02, 0x04, 0x00, 0x3F, 0xDF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3A, 0x1F, 0x00, 0x22, 0x51, 0x00, 0x3A, 0xD1, 0x00, 0x2A, 0x9F, 0x00, 0x2B, 0x91, 0x00, 0x39, 0x11, 0x00, 0x21, 0x1F, 0x00, 0x23, 0x4A, 0x00, 0x45, 0xDB, 0x00, 0x18, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9852, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x29, 0x04, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x29, 0x21, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x08, 0x21, 0x00, 0x7F, 0xBF, 0x00, 0x48, 0xA1, 0x00, 0x4A, 0xA1, 0x00, 0x4F, 0xBF, 0x00, 0x79, 0x92, 0x00, 0x40, 0xB3, 0x00, 0x43, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9853, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x48, 0xBF, 0x80, 0x48, 0x84, 0x00, 0x48, 0x9F, 0x00, 0x7F, 0x91, 0x00, 0x00, 0x11, 0x00, 0x7F, 0x9F, 0x00, 0x08, 0x11, 0x00, 0x10, 0x11, 0x00, 0x7F, 0x9F, 0x00, 0x54, 0x91, 0x00, 0x54, 0x91, 0x00, 0x54, 0x9F, 0x00, 0x54, 0x8A, 0x00, 0x54, 0x9B, 0x00, 0x55, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9854, { 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x3F, 0x80, 0x5F, 0xC4, 0x00, 0x08, 0x88, 0x00, 0x65, 0x1F, 0x00, 0x7F, 0xF1, 0x00, 0x10, 0x91, 0x00, 0x11, 0x1F, 0x00, 0x12, 0x51, 0x00, 0x1C, 0x91, 0x00, 0x11, 0x1F, 0x00, 0x16, 0x51, 0x00, 0x10, 0x91, 0x00, 0x23, 0x1F, 0x00, 0x2C, 0x11, 0x00, 0x20, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9855, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x56, 0x41, 0x00, 0x34, 0x7F, 0x00, 0x17, 0x22, 0x00, 0x1C, 0x63, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9856, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x3F, 0x80, 0x7F, 0x84, 0x00, 0x40, 0x9F, 0x00, 0x42, 0x91, 0x00, 0x5A, 0x91, 0x00, 0x44, 0x9F, 0x00, 0x4A, 0x91, 0x00, 0x50, 0x91, 0x00, 0x40, 0x9F, 0x00, 0x7F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x2A, 0x9F, 0x00, 0x28, 0x4A, 0x00, 0x69, 0x1B, 0x00, 0x47, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9857, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x3F, 0x9F, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x11, 0x11, 0x00, 0x1B, 0x1F, 0x00, 0x0A, 0x0A, 0x00, 0x0F, 0xDB, 0x00, 0x78, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9858, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x12, 0x08, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xD1, 0x00, 0x14, 0x5F, 0x00, 0x17, 0xD1, 0x00, 0x11, 0x11, 0x00, 0x11, 0x1F, 0x00, 0x15, 0x51, 0x00, 0x15, 0x51, 0x00, 0x29, 0x3F, 0x00, 0x21, 0x11, 0x00, 0x23, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9859, { 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x11, 0x3F, 0x80, 0x0E, 0x04, 0x00, 0x31, 0x9F, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x2A, 0x9F, 0x00, 0x11, 0x11, 0x00, 0x6A, 0xD1, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x15, 0x11, 0x00, 0x15, 0x1F, 0x00, 0x35, 0x8A, 0x00, 0x64, 0xDB, 0x00, 0x04, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x985A, { 0x00, 0x00, 0x00, 0x23, 0x80, 0x00, 0x3C, 0x7F, 0x80, 0x20, 0x84, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x3F, 0x00, 0x0F, 0xA1, 0x00, 0x28, 0xA1, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x2F, 0xA1, 0x00, 0x28, 0xBF, 0x00, 0x2F, 0xA1, 0x00, 0x20, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x11, 0x21, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x985B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x3E, 0x21, 0x00, 0x00, 0x21, 0x00, 0x7F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x33, 0x33, 0x00, 0x61, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x985E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x25, 0x7F, 0x80, 0x15, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3F, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x04, 0x21, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x11, 0x12, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9862, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x11, 0x3F, 0x80, 0x7F, 0xC4, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x44, 0x51, 0x00, 0x77, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x00, 0x6E, 0xDF, 0x00, 0x44, 0x4A, 0x00, 0x44, 0x5B, 0x00, 0x44, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9863, { 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x01, 0x3F, 0x80, 0x01, 0x04, 0x00, 0x3F, 0xDF, 0x00, 0x21, 0x11, 0x00, 0x29, 0x11, 0x00, 0x2D, 0x1F, 0x00, 0x29, 0x51, 0x00, 0x3F, 0x51, 0x00, 0x29, 0x5F, 0x00, 0x29, 0xD1, 0x00, 0x3C, 0x91, 0x00, 0x2A, 0x9F, 0x00, 0x29, 0xCA, 0x00, 0x3A, 0x5B, 0x00, 0x44, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9865, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x84, 0x00, 0x3F, 0x88, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x3F, 0x00, 0x15, 0x00, 0x00, 0x24, 0xA1, 0x00, 0x0C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9866, { 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x14, 0x7F, 0x80, 0x3F, 0x88, 0x00, 0x64, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x24, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x24, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0x21, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x92, 0x00, 0x60, 0x33, 0x00, 0x40, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9867, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x1F, 0x80, 0x10, 0x02, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x5F, 0x80, 0x1F, 0xD0, 0x80, 0x12, 0x90, 0x80, 0x15, 0x1F, 0x80, 0x1F, 0xD0, 0x80, 0x15, 0x10, 0x80, 0x17, 0xDF, 0x80, 0x15, 0x10, 0x80, 0x17, 0xD0, 0x80, 0x25, 0x1F, 0x80, 0x27, 0xE9, 0x00, 0x24, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x986A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x13, 0xEF, 0x80, 0x12, 0x02, 0x00, 0x3F, 0xF7, 0x00, 0x00, 0xA5, 0x00, 0x00, 0x95, 0x00, 0x3F, 0xF7, 0x00, 0x20, 0x45, 0x00, 0x3F, 0xC5, 0x00, 0x24, 0x57, 0x00, 0x2D, 0x55, 0x00, 0x35, 0x65, 0x00, 0x26, 0x47, 0x00, 0x38, 0xD5, 0x00, 0x21, 0x35, 0x80, 0x46, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x986B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x20, 0xBF, 0x00, 0x2E, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x21, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x13, 0xA1, 0x00, 0x3C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x986C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x7F, 0xDF, 0x00, 0x44, 0x51, 0x00, 0x75, 0xD1, 0x00, 0x44, 0x5F, 0x00, 0x35, 0x91, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x2A, 0x5F, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x5B, 0x00, 0x2A, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x986F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xDF, 0x80, 0x10, 0x42, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x5F, 0x80, 0x1F, 0xD0, 0x80, 0x08, 0x90, 0x80, 0x35, 0x5F, 0x80, 0x16, 0x50, 0x80, 0x09, 0x90, 0x80, 0x15, 0x3F, 0x80, 0x3F, 0xF0, 0x80, 0x00, 0x90, 0x80, 0x2A, 0x9F, 0x80, 0x2A, 0x89, 0x00, 0x2A, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9870, { 0x00, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x17, 0x84, 0x00, 0x14, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x24, 0x1F, 0x00, 0x44, 0x91, 0x00, 0x1D, 0x1F, 0x00, 0x02, 0x11, 0x00, 0x0F, 0xFF, 0x00, 0x78, 0x85, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9871, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xBF, 0x80, 0x04, 0x04, 0x00, 0x3F, 0xDF, 0x00, 0x24, 0x51, 0x00, 0x3F, 0x11, 0x00, 0x24, 0x5F, 0x00, 0x2F, 0xD1, 0x00, 0x2A, 0x91, 0x00, 0x2F, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x7F, 0xD1, 0x00, 0x55, 0x5F, 0x00, 0x15, 0x4A, 0x00, 0x3F, 0xFB, 0x00, 0x00, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9873, { 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x04, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x91, 0x00, 0x3F, 0x1F, 0x00, 0x01, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x2A, 0x9F, 0x00, 0x3B, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x3B, 0x9F, 0x00, 0x2A, 0x8A, 0x00, 0x7F, 0x9B, 0x00, 0x08, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9874, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x7F, 0xBF, 0x80, 0x11, 0x04, 0x00, 0x3B, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x3B, 0x91, 0x00, 0x00, 0x1F, 0x00, 0x12, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x64, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xDB, 0x00, 0x00, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9875, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x08, 0x88, 0x00, 0x09, 0x48, 0x00, 0x02, 0x30, 0x00, 0x04, 0x0C, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9876, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x20, 0x00, 0x28, 0x2C, 0x00, 0x10, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9877, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x27, 0xFF, 0x00, 0x20, 0x20, 0x00, 0x20, 0x44, 0x00, 0x29, 0xFE, 0x00, 0x3D, 0x04, 0x00, 0x21, 0x24, 0x00, 0x21, 0x24, 0x00, 0x21, 0x24, 0x00, 0x25, 0x24, 0x00, 0x29, 0x24, 0x00, 0x31, 0x44, 0x00, 0x20, 0x50, 0x00, 0x00, 0x8C, 0x00, 0x01, 0x06, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9878, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x0A, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x43, 0x00, 0x09, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9879, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x08, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0x92, 0x00, 0x20, 0x92, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x987A, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x23, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x10, 0x00, 0x22, 0x2C, 0x00, 0x42, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x987B, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x10, 0x22, 0x00, 0x20, 0xFF, 0x00, 0x02, 0x82, 0x00, 0x04, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x20, 0x92, 0x00, 0x02, 0x92, 0x00, 0x04, 0x92, 0x00, 0x08, 0xA2, 0x00, 0x10, 0x2C, 0x00, 0x20, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x987C, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x38, 0x28, 0x00, 0x10, 0x24, 0x00, 0x00, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x987D, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x00, 0x12, 0x00, 0x02, 0x7F, 0x00, 0x7F, 0x42, 0x00, 0x14, 0x4A, 0x00, 0x14, 0x4A, 0x00, 0x14, 0x4A, 0x00, 0x14, 0x52, 0x00, 0x14, 0x52, 0x00, 0x15, 0x52, 0x00, 0x16, 0x2C, 0x00, 0x24, 0x22, 0x00, 0x40, 0x41, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x987E, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x10, 0x00, 0x20, 0x22, 0x00, 0x2F, 0x7F, 0x00, 0x29, 0x42, 0x00, 0x29, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x2D, 0x4A, 0x00, 0x2A, 0x52, 0x00, 0x28, 0x52, 0x00, 0x29, 0x52, 0x00, 0x2A, 0x18, 0x00, 0x2C, 0x26, 0x00, 0x40, 0x43, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x987F, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x7F, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x10, 0x00, 0x0C, 0x28, 0x00, 0x08, 0x46, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9880, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x20, 0x22, 0x00, 0x20, 0xFF, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xA2, 0x00, 0x44, 0x2C, 0x00, 0x04, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9881, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x12, 0x22, 0x00, 0x22, 0xFF, 0x00, 0x21, 0x82, 0x00, 0x42, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x92, 0x00, 0x12, 0x28, 0x00, 0x12, 0x24, 0x00, 0x26, 0x43, 0x00, 0x41, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9882, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x14, 0x22, 0x00, 0x22, 0xFF, 0x00, 0x29, 0x82, 0x00, 0x48, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x14, 0x92, 0x00, 0x22, 0x92, 0x00, 0x3E, 0x10, 0x00, 0x02, 0x2C, 0x00, 0x00, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9883, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x22, 0x00, 0x00, 0xFF, 0x00, 0x04, 0x82, 0x00, 0x3E, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x26, 0xA2, 0x00, 0x24, 0x2C, 0x00, 0x40, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9884, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x04, 0x22, 0x00, 0x14, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x7F, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x2C, 0x00, 0x28, 0x42, 0x00, 0x11, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9885, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x0F, 0x10, 0x00, 0x08, 0x22, 0x00, 0x09, 0x7F, 0x00, 0x3F, 0xC2, 0x00, 0x21, 0x4A, 0x00, 0x21, 0x4A, 0x00, 0x21, 0x4A, 0x00, 0x3F, 0x52, 0x00, 0x21, 0x52, 0x00, 0x20, 0x52, 0x00, 0x20, 0x28, 0x00, 0x20, 0x24, 0x00, 0x40, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9886, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x12, 0x22, 0x00, 0x21, 0xFF, 0x00, 0x50, 0x82, 0x00, 0x08, 0x92, 0x00, 0x00, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x01, 0x92, 0x00, 0x02, 0x92, 0x00, 0x14, 0x92, 0x00, 0x08, 0x28, 0x00, 0x04, 0x24, 0x00, 0x04, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9887, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x42, 0x00, 0x24, 0x4A, 0x00, 0x3F, 0x4A, 0x00, 0x21, 0x4A, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0x52, 0x00, 0x24, 0x52, 0x00, 0x2A, 0x10, 0x00, 0x29, 0x28, 0x00, 0x51, 0x46, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9888, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x04, 0x12, 0x00, 0x0C, 0x7F, 0x00, 0x13, 0x42, 0x00, 0x61, 0x4A, 0x00, 0x00, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x08, 0x52, 0x00, 0x0F, 0x10, 0x00, 0x70, 0x2C, 0x00, 0x20, 0x42, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9889, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x3E, 0x92, 0x00, 0x00, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x24, 0x00, 0x20, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x988A, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x1C, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x14, 0xA2, 0x00, 0x12, 0xAA, 0x00, 0x22, 0x46, 0x00, 0x40, 0x82, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x988C, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x14, 0x22, 0x00, 0x22, 0xFF, 0x00, 0x40, 0x82, 0x00, 0x3E, 0x92, 0x00, 0x00, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x24, 0x00, 0x20, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x988D, { 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x22, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x38, 0x22, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x92, 0x00, 0x09, 0x92, 0x00, 0x7A, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x28, 0x00, 0x48, 0x24, 0x00, 0x18, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x988F, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x22, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x12, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x04, 0x92, 0x00, 0x08, 0x92, 0x00, 0x12, 0x92, 0x00, 0x64, 0x92, 0x00, 0x0C, 0x28, 0x00, 0x12, 0x24, 0x00, 0x61, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9890, { 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x22, 0x00, 0x24, 0x7F, 0x00, 0x2F, 0x42, 0x00, 0x29, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x2F, 0x4A, 0x00, 0x24, 0x52, 0x00, 0x24, 0x52, 0x00, 0x24, 0x52, 0x00, 0x24, 0x2C, 0x00, 0x3F, 0x43, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9891, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x2F, 0x22, 0x00, 0x28, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x4A, 0x92, 0x00, 0x04, 0x10, 0x00, 0x08, 0x28, 0x00, 0x10, 0x46, 0x00, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9893, { 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x78, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x22, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x42, 0x00, 0x1C, 0x4A, 0x00, 0x2B, 0x4A, 0x00, 0x49, 0x4A, 0x00, 0x1C, 0x52, 0x00, 0x14, 0x52, 0x00, 0x14, 0x10, 0x00, 0x15, 0x2C, 0x00, 0x26, 0x22, 0x00, 0x24, 0x41, 0x00, 0x40, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9894, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x13, 0x22, 0x00, 0x29, 0xFF, 0x00, 0x40, 0x82, 0x00, 0x3E, 0x92, 0x00, 0x02, 0x92, 0x00, 0x04, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x92, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x43, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9896, { 0x00, 0x00, 0x00, 0x20, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x38, 0x10, 0x00, 0x20, 0x22, 0x00, 0x22, 0xFF, 0x00, 0x1E, 0x82, 0x00, 0x00, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0x92, 0x00, 0x0A, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x08, 0x92, 0x00, 0x1C, 0x10, 0x00, 0x2A, 0x2C, 0x00, 0x48, 0xC2, 0x00, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9897, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x42, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x08, 0x92, 0x00, 0x7F, 0x92, 0x00, 0x18, 0x92, 0x00, 0x1C, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x28, 0x00, 0x48, 0x46, 0x00, 0x09, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9898, { 0x00, 0x00, 0x00, 0x1F, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x42, 0x00, 0x1F, 0x4A, 0x00, 0x00, 0x4A, 0x00, 0x7F, 0xCA, 0x00, 0x04, 0x52, 0x00, 0x15, 0x52, 0x00, 0x17, 0x90, 0x00, 0x14, 0x2C, 0x00, 0x2C, 0x42, 0x00, 0x24, 0x83, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x989A, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x3B, 0xFF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x92, 0x00, 0x3B, 0xBF, 0x00, 0x00, 0x22, 0x00, 0x1F, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x7F, 0xAA, 0x00, 0x10, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x01, 0x2A, 0x00, 0x01, 0x32, 0x00, 0x01, 0x14, 0x00, 0x0A, 0x23, 0x00, 0x04, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x989B, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0x92, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xAA, 0x00, 0x04, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xB2, 0x00, 0x2A, 0x94, 0x00, 0x21, 0xA3, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x989C, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x3F, 0x90, 0x00, 0x11, 0x22, 0x00, 0x0A, 0x7F, 0x00, 0x3F, 0xC2, 0x00, 0x22, 0x4A, 0x00, 0x24, 0x4A, 0x00, 0x29, 0x4A, 0x00, 0x22, 0x52, 0x00, 0x24, 0x52, 0x00, 0x29, 0x52, 0x00, 0x22, 0x52, 0x00, 0x24, 0x24, 0x00, 0x48, 0x43, 0x00, 0x10, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x989D, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x92, 0x00, 0x49, 0x3F, 0x00, 0x0F, 0x22, 0x00, 0x11, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x04, 0x2A, 0x00, 0x0A, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x51, 0x08, 0x00, 0x11, 0x14, 0x00, 0x1F, 0x23, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x989E, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x22, 0x00, 0x11, 0x2A, 0x00, 0x7F, 0xEA, 0x00, 0x01, 0x2A, 0x00, 0x3B, 0xAA, 0x00, 0x08, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x11, 0x32, 0x00, 0x11, 0x14, 0x00, 0x2A, 0xA3, 0x00, 0x44, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x989F, { 0x00, 0x00, 0x00, 0x12, 0x02, 0x00, 0x12, 0x7F, 0x00, 0x7F, 0x88, 0x00, 0x12, 0x12, 0x00, 0x01, 0x3F, 0x00, 0x7F, 0xA2, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x2A, 0x00, 0x7F, 0xAA, 0x00, 0x52, 0xAA, 0x00, 0x52, 0xAA, 0x00, 0x6D, 0xAA, 0x00, 0x40, 0x90, 0x00, 0x42, 0x94, 0x00, 0x41, 0x23, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A0, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x0A, 0xFF, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x22, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x4A, 0x00, 0x22, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x22, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x22, 0x52, 0x00, 0x7F, 0x20, 0x00, 0x00, 0x24, 0x00, 0x14, 0x43, 0x00, 0x22, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A1, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x7F, 0x00, 0x0A, 0x08, 0x00, 0x04, 0x12, 0x00, 0x0A, 0x3F, 0x00, 0x3B, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x11, 0x2A, 0x00, 0x2A, 0xAA, 0x00, 0x04, 0x2A, 0x00, 0x7F, 0xEA, 0x00, 0x0C, 0x2A, 0x00, 0x16, 0x10, 0x00, 0x25, 0x94, 0x00, 0x44, 0xA3, 0x00, 0x04, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A2, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x12, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x22, 0x00, 0x04, 0x2A, 0x00, 0x7F, 0xEA, 0x00, 0x00, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x11, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x04, 0x10, 0x00, 0x15, 0x14, 0x00, 0x24, 0xA3, 0x00, 0x0C, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A4, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0xBF, 0x00, 0x2E, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x3F, 0xAA, 0x00, 0x00, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x19, 0x2A, 0x00, 0x15, 0x2A, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x14, 0x00, 0x7F, 0xA3, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A5, { 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xD2, 0x00, 0x44, 0x7F, 0x00, 0x35, 0xA2, 0x00, 0x04, 0x2A, 0x00, 0x35, 0xAA, 0x00, 0x04, 0x2A, 0x00, 0x7F, 0xEA, 0x00, 0x08, 0x2A, 0x00, 0x3F, 0xAA, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0xA3, 0x00, 0x21, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A6, { 0x00, 0x00, 0x00, 0x04, 0xFF, 0x00, 0x17, 0x10, 0x00, 0x14, 0x7E, 0x00, 0x7F, 0xCA, 0x00, 0x25, 0x4A, 0x00, 0x06, 0x14, 0x00, 0x19, 0x62, 0x00, 0x6F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x09, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A7, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x11, 0x7F, 0x00, 0x7F, 0xC8, 0x00, 0x11, 0x12, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0xA2, 0x00, 0x3B, 0xAA, 0x00, 0x12, 0x2A, 0x00, 0x1F, 0xAA, 0x00, 0x32, 0x2A, 0x00, 0x5F, 0xAA, 0x00, 0x12, 0x2A, 0x00, 0x1F, 0x88, 0x00, 0x12, 0x14, 0x00, 0x1F, 0xA3, 0x00, 0x10, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0xF4, 0x00, 0x17, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x14, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x84, 0x00, 0x10, 0x94, 0x00, 0x10, 0xFC, 0x80, 0x17, 0x8A, 0x80, 0x20, 0x01, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98AA, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x74, 0x00, 0x17, 0xC4, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x86, 0x00, 0x30, 0x92, 0x80, 0x21, 0xFB, 0x80, 0x6F, 0x09, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98AB, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x26, 0x9F, 0x00, 0x3C, 0x84, 0x00, 0x28, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x2A, 0xBF, 0x80, 0x2A, 0x8A, 0x00, 0x3E, 0x8A, 0x00, 0x28, 0x9B, 0x00, 0x28, 0x91, 0x00, 0x2A, 0xB1, 0x80, 0x2E, 0x80, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98AD, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x20, 0x23, 0x80, 0x21, 0xA2, 0x00, 0x2F, 0x22, 0x00, 0x22, 0x22, 0x00, 0x2F, 0xAF, 0x80, 0x2A, 0xA8, 0x80, 0x2A, 0xA8, 0x80, 0x2F, 0xA8, 0x80, 0x22, 0x28, 0x80, 0x22, 0x2F, 0x80, 0x22, 0xA0, 0x00, 0x23, 0xA0, 0x80, 0x6E, 0xB1, 0x80, 0x40, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98AE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0xBF, 0x80, 0x26, 0xA0, 0x80, 0x3C, 0xFC, 0x80, 0x28, 0xA4, 0x80, 0x3E, 0xA4, 0x80, 0x2A, 0xBD, 0x80, 0x2A, 0xA1, 0x00, 0x3E, 0xA3, 0x00, 0x28, 0xA0, 0x00, 0x28, 0xB0, 0x80, 0x2A, 0x9F, 0x80, 0x2E, 0x80, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98AF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x9E, 0x00, 0x08, 0xF2, 0x00, 0x3E, 0x92, 0x00, 0x00, 0xFE, 0x00, 0x22, 0xD6, 0x00, 0x22, 0xD6, 0x00, 0x12, 0xD6, 0x00, 0x12, 0xFE, 0x00, 0x14, 0x96, 0x00, 0x14, 0x92, 0x00, 0x0F, 0x96, 0x00, 0x30, 0x9E, 0x00, 0x01, 0x62, 0x80, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98B0, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x8B, 0x00, 0x20, 0x89, 0x00, 0x26, 0xFF, 0x80, 0x3C, 0x88, 0x00, 0x28, 0x99, 0x00, 0x3E, 0x91, 0x00, 0x2A, 0x93, 0x00, 0x2A, 0xBA, 0x00, 0x3E, 0xEE, 0x00, 0x28, 0x84, 0x00, 0x28, 0x8E, 0x00, 0x2A, 0x9B, 0x00, 0x2E, 0x80, 0x80, 0x7A, 0xC1, 0x80, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF4, 0x00, 0x23, 0xA4, 0x00, 0x2E, 0x29, 0x00, 0x22, 0x2B, 0x80, 0x3F, 0xFC, 0x80, 0x22, 0x20, 0x00, 0x2F, 0xAF, 0x00, 0x2A, 0xA9, 0x00, 0x2F, 0xA9, 0x00, 0x2A, 0x29, 0x00, 0x22, 0xAF, 0x00, 0x23, 0xA9, 0x00, 0x3C, 0x50, 0x00, 0x20, 0x4C, 0x00, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98B4, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0xBF, 0x80, 0x26, 0xA0, 0x00, 0x3C, 0xC0, 0x00, 0x28, 0xBF, 0x80, 0x3E, 0x84, 0x80, 0x2A, 0x95, 0x00, 0x2A, 0x94, 0x00, 0x3E, 0x97, 0x00, 0x28, 0x94, 0x00, 0x28, 0x9E, 0x00, 0x2A, 0xB3, 0x80, 0x2E, 0xA0, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xEF, 0x00, 0x20, 0x29, 0x00, 0x21, 0xAF, 0x00, 0x2F, 0x29, 0x00, 0x22, 0x2F, 0x00, 0x2F, 0xA9, 0x00, 0x2A, 0xAF, 0x00, 0x2A, 0xA9, 0x00, 0x2F, 0xBF, 0x80, 0x22, 0x20, 0x00, 0x22, 0x29, 0x00, 0x22, 0xB0, 0x80, 0x23, 0xA0, 0x00, 0x6E, 0xB0, 0x80, 0x40, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98B7, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x95, 0x80, 0x20, 0xB5, 0x00, 0x26, 0xAE, 0x00, 0x3C, 0x9A, 0x00, 0x28, 0xB3, 0x00, 0x3E, 0xE1, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x95, 0x80, 0x3E, 0xB5, 0x00, 0x28, 0xAE, 0x00, 0x28, 0x9B, 0x00, 0x2A, 0xF1, 0x00, 0x2E, 0x80, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA9, 0x00, 0x26, 0xA9, 0x00, 0x3C, 0xBF, 0x00, 0x28, 0xA9, 0x00, 0x3E, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x80, 0x00, 0x3E, 0xAA, 0x80, 0x28, 0xAA, 0x00, 0x28, 0xC8, 0x80, 0x2A, 0x87, 0x80, 0x2E, 0x80, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98BA, { 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xBF, 0x00, 0x26, 0xA1, 0x00, 0x3C, 0xBF, 0x00, 0x28, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x90, 0x00, 0x2A, 0xBF, 0x80, 0x3E, 0xCA, 0x80, 0x28, 0x92, 0x80, 0x28, 0xA4, 0x80, 0x2A, 0x89, 0x80, 0x2E, 0x83, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98BB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x71, 0x41, 0x00, 0x0B, 0x4D, 0x00, 0x26, 0x79, 0x00, 0x1C, 0x51, 0x00, 0x70, 0x7D, 0x00, 0x1E, 0x55, 0x00, 0x28, 0x55, 0x00, 0x08, 0x7D, 0x00, 0x7F, 0x51, 0x00, 0x08, 0x51, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x5D, 0x00, 0x3E, 0x75, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x4D, 0x00, 0x3F, 0x79, 0x00, 0x24, 0x51, 0x00, 0x24, 0x7D, 0x00, 0x3F, 0x55, 0x00, 0x24, 0x55, 0x00, 0x24, 0x7D, 0x00, 0x3F, 0x51, 0x00, 0x01, 0x51, 0x00, 0x55, 0x55, 0x00, 0x55, 0x5D, 0x00, 0x43, 0x75, 0x00, 0x06, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98C2, { 0x00, 0x00, 0x00, 0x00, 0x7B, 0x80, 0x3F, 0x99, 0x80, 0x20, 0xAA, 0x80, 0x26, 0x99, 0x80, 0x3C, 0xAA, 0x80, 0x28, 0x84, 0x00, 0x3E, 0x8E, 0x00, 0x2A, 0xFB, 0x80, 0x2A, 0x84, 0x00, 0x3E, 0xB9, 0x00, 0x28, 0x82, 0x00, 0x28, 0xBC, 0x80, 0x2A, 0x81, 0x00, 0x2E, 0x9E, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x8A, 0x00, 0x26, 0xBF, 0x80, 0x3C, 0xAA, 0x80, 0x28, 0xBF, 0x80, 0x3E, 0x80, 0x00, 0x2A, 0x9F, 0x00, 0x2A, 0x80, 0x00, 0x3E, 0xBF, 0x80, 0x28, 0x84, 0x00, 0x28, 0x95, 0x00, 0x2A, 0xA4, 0x80, 0x2E, 0x8C, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x0A, 0x41, 0x00, 0x3F, 0xCF, 0x00, 0x2A, 0xF9, 0x00, 0x2A, 0xC9, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x6B, 0x00, 0x1F, 0x6B, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x4D, 0x00, 0x15, 0x4B, 0x00, 0x15, 0x4F, 0x80, 0x24, 0xF9, 0x80, 0x0C, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x8A, 0x00, 0x26, 0xBB, 0x80, 0x3C, 0xAA, 0x80, 0x28, 0xAA, 0x80, 0x3E, 0xBB, 0x80, 0x2A, 0x8A, 0x00, 0x2A, 0xBF, 0x80, 0x3E, 0xA4, 0x80, 0x28, 0xBF, 0x80, 0x28, 0xA4, 0x80, 0x2A, 0xBF, 0x80, 0x2E, 0x80, 0x00, 0x7A, 0xC0, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98C6, { 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x09, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x4D, 0x00, 0x14, 0x79, 0x00, 0x36, 0x51, 0x00, 0x63, 0x7D, 0x00, 0x00, 0x55, 0x00, 0x2A, 0xD5, 0x00, 0x22, 0x7D, 0x00, 0x7F, 0xD1, 0x00, 0x22, 0x51, 0x00, 0x22, 0x55, 0x00, 0x55, 0x5D, 0x00, 0x55, 0x75, 0x00, 0x48, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98C7, { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3F, 0xC4, 0x00, 0x27, 0x7F, 0x80, 0x3C, 0x44, 0x00, 0x24, 0x4A, 0x00, 0x24, 0x51, 0x00, 0x3F, 0x64, 0x80, 0x35, 0x45, 0x00, 0x35, 0x44, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x4A, 0x00, 0x25, 0x51, 0x00, 0x27, 0x60, 0x80, 0x3C, 0xC0, 0x00, 0x20, 0x3F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98C8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x29, 0x80, 0x22, 0x6B, 0x00, 0x26, 0x5C, 0x00, 0x3E, 0x36, 0x00, 0x2A, 0x63, 0x00, 0x3F, 0xC1, 0x00, 0x2A, 0x42, 0x00, 0x2B, 0x5A, 0x80, 0x3E, 0xD7, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0xA5, 0x00, 0x2B, 0x18, 0x80, 0x2E, 0x00, 0x00, 0x7B, 0x00, 0x80, 0x41, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98CC, { 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x77, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x00, 0x4D, 0x00, 0x77, 0x79, 0x00, 0x55, 0x51, 0x00, 0x77, 0x7D, 0x00, 0x12, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x64, 0x7D, 0x00, 0x3F, 0x51, 0x00, 0x24, 0x51, 0x00, 0x3F, 0x55, 0x00, 0x24, 0x5D, 0x00, 0x3F, 0x75, 0x00, 0x00, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98CE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x08, 0x00, 0x14, 0x28, 0x00, 0x12, 0x28, 0x00, 0x11, 0x48, 0x00, 0x11, 0x48, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x11, 0x48, 0x00, 0x11, 0x48, 0x00, 0x12, 0x28, 0x00, 0x14, 0x28, 0x00, 0x18, 0x09, 0x00, 0x20, 0x05, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98D1, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x3F, 0x44, 0x00, 0x22, 0x7E, 0x00, 0x22, 0x84, 0x00, 0x23, 0x04, 0x00, 0x36, 0xF4, 0x00, 0x36, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0xF4, 0x00, 0x2A, 0x94, 0x00, 0x36, 0x88, 0x00, 0x36, 0x82, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98D2, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x7F, 0x8C, 0x00, 0x01, 0x4C, 0x00, 0x25, 0x54, 0x00, 0x25, 0x54, 0x00, 0x25, 0x24, 0x00, 0x29, 0x24, 0x00, 0x29, 0x54, 0x00, 0x0F, 0x4C, 0x00, 0x79, 0x8D, 0x00, 0x22, 0x05, 0x00, 0x02, 0x05, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98D3, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x7E, 0x00, 0x22, 0x44, 0x00, 0x22, 0x7C, 0x00, 0x22, 0x44, 0x00, 0x36, 0x7C, 0x00, 0x36, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x37, 0xFF, 0x00, 0x36, 0x28, 0x00, 0x22, 0x45, 0x00, 0x22, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98D5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0xD6, 0x00, 0x22, 0x92, 0x00, 0x22, 0xD6, 0x00, 0x22, 0x92, 0x00, 0x36, 0x92, 0x00, 0x36, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x44, 0x00, 0x36, 0x28, 0x00, 0x36, 0x10, 0x00, 0x22, 0x29, 0x00, 0x22, 0x45, 0x00, 0x21, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98D8, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x7F, 0x7E, 0x00, 0x14, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x55, 0x44, 0x00, 0x55, 0x6C, 0x00, 0x7F, 0x6C, 0x00, 0x00, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x00, 0x6C, 0x00, 0x7F, 0x6C, 0x00, 0x08, 0x44, 0x00, 0x2C, 0x45, 0x00, 0x2A, 0x85, 0x00, 0x49, 0x03, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98D9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0C, 0x7E, 0x00, 0x0A, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x08, 0x44, 0x00, 0x14, 0x6C, 0x00, 0x22, 0x6C, 0x00, 0x41, 0x54, 0x00, 0x12, 0x54, 0x00, 0x1B, 0x54, 0x00, 0x7F, 0xEC, 0x00, 0x12, 0x6C, 0x00, 0x12, 0x45, 0x00, 0x2D, 0x45, 0x00, 0x24, 0x85, 0x00, 0x49, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98DA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x22, 0x52, 0x00, 0x22, 0x54, 0x00, 0x22, 0xA8, 0x00, 0x36, 0x44, 0x00, 0x36, 0x83, 0x00, 0x2A, 0x44, 0x00, 0x2B, 0x55, 0x00, 0x2A, 0xEE, 0x00, 0x36, 0x44, 0x00, 0x36, 0xAA, 0x00, 0x23, 0x11, 0x00, 0x22, 0x01, 0x00, 0x21, 0xFF, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98DB, { 0x00, 0x00, 0x00, 0x3F, 0xF9, 0x00, 0x00, 0x0A, 0x00, 0x02, 0x6C, 0x00, 0x0D, 0x8A, 0x00, 0x38, 0x89, 0x00, 0x08, 0x88, 0x00, 0x08, 0x84, 0x80, 0x3F, 0xF3, 0x80, 0x08, 0x90, 0x00, 0x08, 0x92, 0x00, 0x08, 0x94, 0x00, 0x08, 0x9C, 0x00, 0x08, 0x93, 0x00, 0x10, 0x88, 0x80, 0x10, 0x84, 0x80, 0x20, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98DC, { 0x00, 0x00, 0x00, 0x07, 0x3E, 0x00, 0x1C, 0x02, 0x80, 0x15, 0x07, 0x00, 0x0E, 0x3A, 0x80, 0x3F, 0xEA, 0x00, 0x0E, 0x2A, 0x00, 0x15, 0x29, 0x00, 0x24, 0xBE, 0x80, 0x1F, 0x2A, 0x00, 0x15, 0x2A, 0x80, 0x15, 0x2B, 0x00, 0x1F, 0x2B, 0x00, 0x15, 0x2A, 0x80, 0x15, 0x2A, 0x00, 0x1F, 0x2A, 0x00, 0x11, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98DE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x00, 0x12, 0x00, 0x00, 0x16, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x16, 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0x00, 0x00, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98DF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x81, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x42, 0x00, 0x04, 0x24, 0x00, 0x04, 0x18, 0x00, 0x07, 0xE6, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98E1, { 0x00, 0x00, 0x00, 0x20, 0x30, 0x00, 0x10, 0x48, 0x00, 0x00, 0x84, 0x00, 0x01, 0x02, 0x00, 0x06, 0x11, 0x80, 0x00, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x11, 0x00, 0x11, 0x12, 0x00, 0x11, 0x0C, 0x00, 0x21, 0xF6, 0x00, 0x27, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98E2, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x7C, 0x00, 0x22, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x20, 0x44, 0x00, 0x3E, 0x44, 0x80, 0x20, 0x84, 0x80, 0x3E, 0x87, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98E3, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x0B, 0x7F, 0x80, 0x19, 0x84, 0x00, 0x36, 0x84, 0x00, 0x60, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98E5, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x1E, 0x00, 0x16, 0xF0, 0x00, 0x33, 0x10, 0x00, 0x2C, 0x10, 0x00, 0x60, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x20, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x20, 0x10, 0x80, 0x3E, 0x19, 0x80, 0x20, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98E6, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x08, 0x00, 0x33, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98E7, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x38, 0x00, 0x10, 0x6C, 0x00, 0x1E, 0xC6, 0x00, 0x13, 0x93, 0x80, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x3A, 0xFE, 0x00, 0x2E, 0x82, 0x00, 0x64, 0xFE, 0x80, 0x04, 0x91, 0x80, 0x0C, 0x9B, 0x00, 0x08, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x30, 0xF3, 0x00, 0x03, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98E8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0xC8, 0x00, 0x79, 0x24, 0x00, 0x13, 0xFF, 0x80, 0x25, 0x04, 0x00, 0x7D, 0xFC, 0x00, 0x05, 0x04, 0x00, 0x09, 0xFC, 0x00, 0x09, 0x44, 0x00, 0x11, 0x28, 0x00, 0x21, 0x10, 0x00, 0x41, 0x8F, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98E9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x0B, 0x00, 0x0B, 0x0E, 0x00, 0x19, 0x78, 0x00, 0x16, 0x08, 0x00, 0x30, 0x08, 0x00, 0x5F, 0x49, 0x00, 0x11, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x11, 0x49, 0x00, 0x1F, 0x7F, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x08, 0x80, 0x1F, 0x09, 0x80, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98EA, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98EB, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x1C, 0x00, 0x3E, 0x14, 0x00, 0x20, 0x14, 0x00, 0x3E, 0x36, 0x00, 0x20, 0x22, 0x00, 0x3E, 0x63, 0x00, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98ED, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x14, 0x20, 0x00, 0x22, 0x7F, 0x80, 0x00, 0x50, 0x00, 0x3E, 0x90, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3E, 0x11, 0x00, 0x20, 0x11, 0x00, 0x3E, 0x21, 0x00, 0x20, 0x21, 0x00, 0x3E, 0x42, 0x00, 0x21, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98EE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x3F, 0x80, 0x00, 0x29, 0x00, 0x3E, 0x4A, 0x00, 0x22, 0x88, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x20, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x20, 0x22, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98EF, { 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x12, 0x7F, 0x80, 0x21, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x41, 0x00, 0x22, 0x51, 0x00, 0x3E, 0x52, 0x00, 0x22, 0x4A, 0x00, 0x3E, 0x4C, 0x00, 0x20, 0x44, 0x00, 0x3E, 0x4A, 0x00, 0x20, 0x8A, 0x00, 0x3E, 0x91, 0x00, 0x20, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98F2, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x20, 0x00, 0x33, 0x3F, 0x80, 0x28, 0x20, 0x80, 0x7E, 0x69, 0x80, 0x22, 0x49, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x20, 0x14, 0x00, 0x22, 0x14, 0x00, 0x22, 0x36, 0x00, 0x2F, 0x22, 0x00, 0x39, 0x63, 0x00, 0x60, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98F3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x60, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98F4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x20, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x42, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0xF0, 0x80, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3E, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98F6, { 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x1C, 0x0C, 0x00, 0x16, 0x04, 0x00, 0x33, 0x12, 0x00, 0x2C, 0x12, 0x00, 0x60, 0x12, 0x00, 0x3E, 0x56, 0x00, 0x22, 0x55, 0x00, 0x3E, 0x55, 0x80, 0x22, 0xDC, 0x80, 0x3E, 0x98, 0x00, 0x20, 0x10, 0x00, 0x3E, 0x30, 0x00, 0x20, 0xD0, 0x80, 0x3E, 0x19, 0x80, 0x20, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98FC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xFF, 0x80, 0x22, 0x00, 0x80, 0x00, 0x00, 0x80, 0x3E, 0xFF, 0x80, 0x00, 0x00, 0x80, 0x3E, 0x00, 0x80, 0x22, 0x7C, 0x80, 0x3E, 0x44, 0x80, 0x22, 0x44, 0x80, 0x3E, 0x44, 0x80, 0x20, 0x7C, 0x80, 0x3E, 0x44, 0x80, 0x20, 0x40, 0x80, 0x3E, 0x00, 0x80, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x98FD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x14, 0x20, 0x00, 0x22, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x81, 0x00, 0x01, 0x01, 0x00, 0x3E, 0x79, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x79, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x47, 0x00, 0x3E, 0x40, 0x00, 0x20, 0x40, 0x80, 0x3E, 0x7F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x98FE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x3E, 0x48, 0x00, 0x00, 0x88, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x4B, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9902, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9903, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x82, 0x80, 0x22, 0x22, 0x00, 0x3E, 0x14, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x0C, 0x00, 0x20, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x20, 0xC2, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9905, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x63, 0x00, 0x16, 0x22, 0x00, 0x32, 0x00, 0x00, 0x28, 0xFF, 0x80, 0x7E, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x20, 0x22, 0x00, 0x22, 0x22, 0x00, 0x22, 0x22, 0x00, 0x2F, 0x62, 0x00, 0x39, 0x42, 0x00, 0x60, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9907, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x81, 0x00, 0x32, 0x81, 0x00, 0x2C, 0xBD, 0x00, 0x60, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x22, 0xBD, 0x00, 0x3E, 0xA5, 0x00, 0x22, 0xA5, 0x00, 0x3E, 0xA5, 0x00, 0x20, 0xBD, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9908, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3C, 0x7F, 0x00, 0x00, 0xD1, 0x00, 0x01, 0x92, 0x00, 0x0C, 0x38, 0x00, 0x38, 0x6C, 0x00, 0x60, 0xC6, 0x00, 0x03, 0x33, 0x80, 0x0C, 0x8C, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFA, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9909, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x00, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x22, 0xBD, 0x00, 0x3E, 0xA5, 0x00, 0x22, 0xA5, 0x00, 0x3E, 0xBD, 0x00, 0x20, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x990A, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x44, 0x00, 0x07, 0xFE, 0x00, 0x0C, 0x05, 0x80, 0x37, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFD, 0x00, 0x04, 0x12, 0x00, 0x07, 0xEC, 0x00, 0x3E, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x990C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x22, 0x42, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x4F, 0x80, 0x21, 0xF2, 0x00, 0x3E, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3E, 0x02, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x990D, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x48, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0xA0, 0x00, 0x13, 0x18, 0x00, 0x1C, 0x47, 0x00, 0x10, 0xA2, 0x00, 0x13, 0x58, 0x00, 0x17, 0xFC, 0x00, 0x1A, 0x0B, 0x00, 0x13, 0xF8, 0x00, 0x12, 0x08, 0x00, 0x23, 0xFA, 0x00, 0x22, 0x24, 0x00, 0x42, 0x98, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9910, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x0A, 0x3F, 0x80, 0x0F, 0x91, 0x00, 0x11, 0x0A, 0x00, 0x2A, 0x4C, 0x00, 0x04, 0xB2, 0x00, 0x09, 0x11, 0x80, 0x36, 0x0C, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x22, 0x00, 0x07, 0xDC, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9911, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x3E, 0x80, 0x80, 0x22, 0x80, 0x80, 0x3E, 0x7F, 0x00, 0x22, 0x02, 0x00, 0x3E, 0x04, 0x00, 0x20, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9912, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0xF8, 0x00, 0x32, 0x12, 0x00, 0x2C, 0x5B, 0x00, 0x60, 0xC9, 0x80, 0x3E, 0x80, 0x80, 0x22, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x12, 0x00, 0x3E, 0x32, 0x00, 0x20, 0x26, 0x00, 0x3E, 0x74, 0x00, 0x20, 0x1E, 0x00, 0x3E, 0x33, 0x00, 0x20, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9913, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x3A, 0x00, 0x22, 0xE9, 0x00, 0x00, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x03, 0xFF, 0x80, 0x3E, 0x28, 0x00, 0x22, 0x28, 0x80, 0x3E, 0x28, 0x80, 0x22, 0x39, 0x00, 0x3E, 0x65, 0x00, 0x21, 0xA6, 0x00, 0x3E, 0x22, 0x00, 0x20, 0x26, 0x80, 0x3F, 0x25, 0x80, 0x20, 0x68, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9914, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x1C, 0x09, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9915, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x61, 0x00, 0x16, 0x41, 0x00, 0x32, 0xFF, 0x80, 0x2C, 0x24, 0x80, 0x60, 0x24, 0x00, 0x3E, 0x67, 0x80, 0x22, 0xD0, 0x00, 0x3E, 0x1F, 0x00, 0x22, 0x31, 0x00, 0x3E, 0x63, 0x00, 0x20, 0xD6, 0x00, 0x3E, 0x0C, 0x00, 0x20, 0x1E, 0x00, 0x3E, 0x33, 0x00, 0x20, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9916, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x00, 0x00, 0x33, 0x00, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x22, 0x00, 0x20, 0x32, 0x00, 0x3E, 0x16, 0x00, 0x20, 0x04, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9917, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x20, 0x49, 0x00, 0x3E, 0xC9, 0x80, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9918, { 0x00, 0x00, 0x00, 0x0C, 0x08, 0x00, 0x12, 0x14, 0x00, 0x21, 0x22, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x80, 0x80, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x20, 0x2A, 0x00, 0x3E, 0x29, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x88, 0x80, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x991A, { 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x1C, 0xC6, 0x00, 0x16, 0x38, 0x00, 0x32, 0xC7, 0x00, 0x2C, 0x10, 0x00, 0x61, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0xC1, 0x00, 0x23, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x991B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x33, 0x41, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x45, 0x80, 0x20, 0x77, 0x00, 0x3E, 0x44, 0x00, 0x20, 0x44, 0x80, 0x3E, 0x74, 0x80, 0x21, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x991C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x33, 0x49, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x20, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x20, 0x49, 0x00, 0x3E, 0xC9, 0x80, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x991D, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x2C, 0x2A, 0x00, 0x60, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x1F, 0x00, 0x3E, 0x11, 0x00, 0x20, 0x31, 0x00, 0x3E, 0x21, 0x00, 0x20, 0x23, 0x00, 0x3E, 0x62, 0x00, 0x20, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x991E, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x14, 0x12, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x11, 0x00, 0x3E, 0x12, 0x00, 0x00, 0x0C, 0x00, 0x3E, 0x34, 0x80, 0x22, 0xC3, 0x80, 0x3E, 0x14, 0x00, 0x22, 0x17, 0x80, 0x3E, 0xF8, 0x00, 0x20, 0x11, 0x00, 0x3E, 0x0A, 0x00, 0x20, 0x0C, 0x80, 0x3E, 0x32, 0x80, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x991F, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xF7, 0x80, 0x16, 0x10, 0x80, 0x32, 0xD6, 0x80, 0x2C, 0x21, 0x00, 0x60, 0x52, 0x80, 0x3E, 0x84, 0x00, 0x22, 0x00, 0x00, 0x3E, 0xF7, 0x80, 0x22, 0x10, 0x80, 0x3E, 0x90, 0x80, 0x20, 0x65, 0x00, 0x3E, 0x25, 0x00, 0x20, 0x52, 0x00, 0x3E, 0x95, 0x00, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9920, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x22, 0x44, 0x00, 0x01, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x74, 0x00, 0x23, 0xDF, 0x80, 0x3E, 0x44, 0x00, 0x20, 0x44, 0x00, 0x3E, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9921, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x1C, 0x20, 0x00, 0x16, 0x3F, 0x00, 0x33, 0x21, 0x00, 0x2C, 0x63, 0x00, 0x60, 0x42, 0x00, 0x3E, 0xCE, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x77, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x77, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9922, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x42, 0x00, 0x2C, 0x66, 0x00, 0x60, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x20, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x20, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x20, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9924, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x48, 0x80, 0x16, 0x49, 0x80, 0x32, 0xDD, 0x00, 0x2C, 0x94, 0x00, 0x60, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x22, 0xC9, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x48, 0x80, 0x3E, 0x49, 0x80, 0x20, 0xDD, 0x00, 0x3E, 0x94, 0x00, 0x20, 0x36, 0x00, 0x3E, 0x63, 0x00, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9926, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x40, 0x00, 0x32, 0x7E, 0x00, 0x2C, 0x40, 0x00, 0x60, 0x7E, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x48, 0x00, 0x3E, 0x48, 0x80, 0x20, 0x4D, 0x80, 0x3E, 0x45, 0x00, 0x20, 0x46, 0x00, 0x3E, 0x73, 0x00, 0x21, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9927, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x0E, 0x00, 0x16, 0x78, 0x00, 0x33, 0x08, 0x00, 0x2C, 0xFF, 0x80, 0x60, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x22, 0xC9, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x10, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x22, 0x00, 0x3E, 0x44, 0x00, 0x20, 0x78, 0x00, 0x3E, 0x1E, 0x00, 0x20, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9928, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x00, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x992B, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x80, 0x80, 0x32, 0x88, 0x80, 0x2C, 0x7F, 0x00, 0x60, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x20, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x992C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x4F, 0x00, 0x16, 0x49, 0x00, 0x32, 0x49, 0x00, 0x2D, 0xF9, 0x00, 0x60, 0x4F, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x49, 0x00, 0x3E, 0xE9, 0x00, 0x22, 0xAF, 0x00, 0x3E, 0xA9, 0x00, 0x20, 0xA9, 0x00, 0x3E, 0xA9, 0x00, 0x20, 0xE9, 0x00, 0x3E, 0x09, 0x00, 0x20, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x992E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x9E, 0x00, 0x08, 0x73, 0x80, 0x1F, 0x08, 0x00, 0x69, 0x32, 0x00, 0x06, 0x0C, 0x80, 0x78, 0xC3, 0x00, 0x03, 0x30, 0x00, 0x0C, 0x8C, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFA, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9931, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x5E, 0x00, 0x16, 0x42, 0x00, 0x32, 0xC2, 0x00, 0x2C, 0xBF, 0x80, 0x61, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x22, 0xBF, 0x00, 0x3E, 0xA4, 0x00, 0x22, 0x84, 0x00, 0x3E, 0xBF, 0x80, 0x20, 0x8A, 0x00, 0x3E, 0x8A, 0x00, 0x20, 0x9B, 0x00, 0x3E, 0x91, 0x00, 0x20, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9932, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x1C, 0x42, 0x00, 0x16, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x2C, 0x42, 0x00, 0x60, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x20, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0xC8, 0x80, 0x3F, 0x88, 0x80, 0x20, 0x9C, 0x80, 0x3E, 0xB6, 0x80, 0x20, 0x81, 0x80, 0x3E, 0xF9, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9933, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7E, 0x00, 0x16, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x2C, 0x42, 0x00, 0x60, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x40, 0x00, 0x3E, 0xFF, 0x80, 0x21, 0x92, 0x80, 0x3E, 0x24, 0x80, 0x20, 0xC9, 0x80, 0x3E, 0x11, 0x00, 0x20, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9934, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x22, 0x00, 0x2C, 0x63, 0x00, 0x60, 0xC9, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x2A, 0x00, 0x3E, 0x22, 0x00, 0x20, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x20, 0x62, 0x00, 0x3E, 0x42, 0x00, 0x20, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9935, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x32, 0x49, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x48, 0x00, 0x20, 0x4C, 0x80, 0x3E, 0x45, 0x00, 0x20, 0x46, 0x00, 0x3E, 0x73, 0x00, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9939, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x88, 0x00, 0x2C, 0xBF, 0x00, 0x60, 0x89, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x89, 0x00, 0x3E, 0x89, 0x00, 0x22, 0xBF, 0x00, 0x3E, 0x88, 0x00, 0x20, 0xBF, 0x00, 0x3E, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3D, 0x21, 0x00, 0x20, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x993A, { 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x1C, 0x09, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x02, 0x00, 0x20, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x20, 0x12, 0x00, 0x3E, 0x02, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x993B, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x63, 0x00, 0x16, 0x22, 0x00, 0x32, 0xFF, 0x80, 0x2C, 0x08, 0x00, 0x60, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x20, 0x55, 0x00, 0x3E, 0xD5, 0x80, 0x20, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x993C, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x40, 0x00, 0x16, 0x7F, 0x00, 0x32, 0xC0, 0x00, 0x2C, 0xBC, 0x00, 0x61, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x3E, 0xA6, 0x00, 0x22, 0xAA, 0x00, 0x3E, 0x22, 0x00, 0x21, 0xFE, 0x00, 0x3E, 0x72, 0x00, 0x20, 0xAA, 0x80, 0x3D, 0x23, 0x80, 0x20, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x993D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x20, 0x00, 0x16, 0xFF, 0x00, 0x32, 0x91, 0x00, 0x2C, 0x91, 0x00, 0x60, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x22, 0x91, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x28, 0x00, 0x3E, 0x2A, 0x00, 0x20, 0x2A, 0x80, 0x3E, 0x6F, 0x80, 0x20, 0x48, 0x00, 0x3E, 0xC8, 0x80, 0x21, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x993E, { 0x00, 0x00, 0x00, 0x08, 0x30, 0x00, 0x1C, 0xEF, 0x80, 0x16, 0x82, 0x80, 0x32, 0x82, 0x80, 0x2C, 0xA6, 0x80, 0x60, 0xA4, 0x80, 0x3E, 0xFD, 0x80, 0x23, 0x90, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9940, { 0x00, 0x00, 0x00, 0x08, 0x03, 0x00, 0x1C, 0x1E, 0x00, 0x16, 0xF0, 0x00, 0x32, 0x12, 0x00, 0x2C, 0x5B, 0x00, 0x60, 0xC9, 0x80, 0x3E, 0x80, 0x80, 0x22, 0x30, 0x00, 0x3E, 0xE7, 0x00, 0x22, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x20, 0xE7, 0x00, 0x3E, 0x81, 0x00, 0x20, 0x81, 0x00, 0x3E, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9941, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0x7F, 0x00, 0x32, 0x08, 0x00, 0x2C, 0x08, 0x00, 0x60, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x4F, 0x00, 0x22, 0xF9, 0x80, 0x3E, 0x00, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x55, 0x00, 0x20, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x20, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9942, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x16, 0x49, 0x00, 0x32, 0x49, 0x00, 0x2C, 0x5D, 0x00, 0x60, 0x55, 0x00, 0x3E, 0x63, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x55, 0x00, 0x20, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x20, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x20, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9945, { 0x00, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x94, 0x80, 0x3E, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x20, 0x22, 0x00, 0x3E, 0x14, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x36, 0x00, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9946, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x91, 0x00, 0x32, 0xFF, 0x00, 0x2C, 0x91, 0x00, 0x60, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x52, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x20, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x20, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9947, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x80, 0x00, 0x32, 0x9E, 0x00, 0x2C, 0x92, 0x00, 0x60, 0x92, 0x00, 0x3E, 0x9E, 0x00, 0x22, 0x80, 0x00, 0x3E, 0xBB, 0x80, 0x22, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x20, 0xAA, 0x80, 0x3E, 0xBB, 0x80, 0x20, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9948, { 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x1C, 0x22, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x20, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x69, 0x00, 0x3E, 0x49, 0x00, 0x20, 0xFF, 0x80, 0x3D, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3E, 0x09, 0x00, 0x20, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9949, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x14, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x994B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x22, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x994C, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0xE7, 0x00, 0x22, 0xA5, 0x00, 0x00, 0xE7, 0x00, 0x3E, 0x94, 0x80, 0x00, 0xF7, 0x80, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x24, 0x00, 0x20, 0x24, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x3E, 0x42, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x994D, { 0x00, 0x00, 0x00, 0x08, 0x21, 0x00, 0x14, 0x12, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x49, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x994E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x33, 0x08, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x14, 0x00, 0x20, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x20, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9950, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x16, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x2C, 0x7F, 0x00, 0x60, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x3E, 0x3E, 0x00, 0x22, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x20, 0x22, 0x00, 0x3E, 0x14, 0x00, 0x20, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9951, { 0x00, 0x00, 0x00, 0x08, 0xA4, 0x00, 0x14, 0xA4, 0x00, 0x23, 0x29, 0x00, 0x01, 0x71, 0x00, 0x3C, 0xAE, 0x00, 0x00, 0xA4, 0x00, 0x3F, 0x3F, 0x80, 0x23, 0xF4, 0x00, 0x3E, 0x22, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x91, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x4C, 0x00, 0x20, 0x0C, 0x80, 0x3E, 0x32, 0x80, 0x20, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9952, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x3E, 0x3A, 0x00, 0x23, 0xCF, 0x80, 0x3E, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x3E, 0x24, 0x00, 0x20, 0x24, 0x00, 0x3E, 0x44, 0x80, 0x21, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9954, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x24, 0x14, 0x80, 0x15, 0x3F, 0x80, 0x0A, 0x65, 0x00, 0x0C, 0xBF, 0x00, 0x3F, 0x24, 0x00, 0x06, 0x7F, 0x80, 0x19, 0xB8, 0x00, 0x07, 0xFF, 0x80, 0x3C, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFD, 0x00, 0x04, 0x32, 0x00, 0x07, 0xEC, 0x00, 0x3C, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9955, { 0x00, 0x00, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x0F, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7F, 0x80, 0x7F, 0x48, 0x80, 0x10, 0x7E, 0x00, 0x1C, 0x48, 0x80, 0x04, 0x4F, 0x80, 0x3C, 0xD2, 0x00, 0x03, 0x33, 0x80, 0x0C, 0x8C, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xFA, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9957, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x09, 0xF7, 0x80, 0x33, 0x14, 0x80, 0x0D, 0xF4, 0x80, 0x09, 0x14, 0x80, 0x33, 0xF4, 0x80, 0x0D, 0x04, 0x80, 0x09, 0xF5, 0x80, 0x31, 0x24, 0x00, 0x07, 0xF8, 0x00, 0x3C, 0x0F, 0x80, 0x07, 0xF8, 0x00, 0x07, 0xFA, 0x00, 0x04, 0x24, 0x00, 0x05, 0xF8, 0x00, 0x3E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9958, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1D, 0xFF, 0x80, 0x16, 0x00, 0x00, 0x32, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x60, 0xBD, 0x00, 0x3E, 0xA5, 0x00, 0x22, 0xBD, 0x00, 0x3E, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x42, 0x00, 0x20, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x20, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9959, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1C, 0xFF, 0x00, 0x16, 0x10, 0x00, 0x32, 0x42, 0x00, 0x2D, 0xFF, 0x80, 0x60, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x22, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x3E, 0x81, 0x00, 0x20, 0xFF, 0x00, 0x3E, 0x42, 0x00, 0x21, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x995B, { 0x00, 0x00, 0x00, 0x08, 0x24, 0x00, 0x1D, 0xFF, 0x80, 0x16, 0x24, 0x00, 0x32, 0xFF, 0x00, 0x2C, 0x81, 0x00, 0x60, 0xBD, 0x00, 0x3E, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x3E, 0x20, 0x00, 0x22, 0x51, 0x80, 0x3E, 0xAB, 0x00, 0x20, 0x48, 0x00, 0x3E, 0x9C, 0x00, 0x20, 0x2A, 0x00, 0x3E, 0xC9, 0x80, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x995C, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x8A, 0x00, 0x2F, 0x89, 0x00, 0x28, 0xFF, 0x80, 0x2F, 0x94, 0x00, 0x28, 0xB6, 0x00, 0x2F, 0xE3, 0x00, 0x28, 0x81, 0x80, 0x40, 0xC0, 0x00, 0x03, 0x30, 0x00, 0x0C, 0x8C, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xFA, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x995E, { 0x00, 0x00, 0x00, 0x08, 0x3C, 0x00, 0x1C, 0x48, 0x00, 0x17, 0xFF, 0x00, 0x32, 0x81, 0x00, 0x2C, 0xFF, 0x00, 0x60, 0x44, 0x00, 0x3E, 0x77, 0x00, 0x22, 0x44, 0x80, 0x3E, 0xF3, 0x80, 0x22, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x20, 0x91, 0x00, 0x3E, 0xFF, 0x00, 0x20, 0x2A, 0x00, 0x3E, 0x68, 0x80, 0x20, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x995F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0x00, 0x00, 0x33, 0x77, 0x00, 0x2C, 0x55, 0x00, 0x60, 0x77, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x22, 0x00, 0x20, 0xFF, 0x80, 0x3E, 0x14, 0x00, 0x20, 0xE5, 0x00, 0x3E, 0x3A, 0x00, 0x20, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9960, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C, 0xFF, 0x80, 0x16, 0xA4, 0x80, 0x32, 0xFF, 0x80, 0x2C, 0x00, 0x00, 0x60, 0x42, 0x80, 0x3E, 0x87, 0x80, 0x22, 0xAD, 0x00, 0x3E, 0x45, 0x00, 0x22, 0x97, 0x80, 0x3E, 0xF5, 0x00, 0x20, 0x55, 0x00, 0x3E, 0x47, 0x80, 0x20, 0xD5, 0x00, 0x3D, 0x55, 0x00, 0x20, 0x47, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9963, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x09, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x80, 0x00, 0x05, 0x00, 0x00, 0x06, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9965, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0xFC, 0x00, 0x1E, 0x88, 0x00, 0x12, 0x88, 0x00, 0x24, 0x88, 0x00, 0x20, 0x88, 0x00, 0x50, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x12, 0x88, 0x00, 0x14, 0x89, 0x00, 0x19, 0x09, 0x00, 0x12, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9967, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x20, 0x00, 0x22, 0x40, 0x00, 0x44, 0x82, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x4A, 0x00, 0x10, 0x92, 0x00, 0x12, 0x92, 0x00, 0x15, 0x22, 0x00, 0x19, 0x22, 0x00, 0x12, 0x54, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9968, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x1F, 0xFF, 0x00, 0x22, 0x20, 0x00, 0x45, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x24, 0x00, 0x14, 0x20, 0x00, 0x18, 0x21, 0x00, 0x10, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9969, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x82, 0x00, 0x1E, 0xFF, 0x00, 0x23, 0x00, 0x00, 0x44, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x12, 0x04, 0x00, 0x14, 0x04, 0x00, 0x18, 0x05, 0x00, 0x10, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x996A, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xE0, 0x00, 0x1E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x44, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x12, 0x20, 0x00, 0x14, 0x20, 0x00, 0x18, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x996B, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x1E, 0x00, 0x11, 0xE0, 0x00, 0x1E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x44, 0x20, 0x00, 0x10, 0x22, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x12, 0x50, 0x00, 0x14, 0x88, 0x00, 0x18, 0x84, 0x00, 0x11, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x996C, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0xA0, 0x00, 0x23, 0x20, 0x00, 0x44, 0x22, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x10, 0x22, 0x00, 0x12, 0x22, 0x00, 0x14, 0x42, 0x00, 0x18, 0x42, 0x00, 0x10, 0x94, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x996D, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0E, 0x00, 0x10, 0xF0, 0x00, 0x1E, 0x80, 0x00, 0x12, 0x80, 0x00, 0x24, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x50, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA8, 0x00, 0x10, 0x98, 0x00, 0x12, 0x90, 0x00, 0x14, 0xA8, 0x00, 0x19, 0x24, 0x00, 0x12, 0x47, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x996E, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x3F, 0x00, 0x11, 0x41, 0x00, 0x12, 0x92, 0x00, 0x28, 0x10, 0x00, 0x48, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x09, 0x28, 0x00, 0x0A, 0x48, 0x00, 0x0C, 0x44, 0x00, 0x08, 0x87, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x996F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x28, 0x00, 0x10, 0x24, 0x00, 0x1E, 0x20, 0x00, 0x12, 0x3E, 0x00, 0x25, 0xE0, 0x00, 0x20, 0x24, 0x00, 0x50, 0x3E, 0x00, 0x11, 0xE0, 0x00, 0x10, 0x24, 0x00, 0x10, 0x28, 0x00, 0x12, 0x10, 0x00, 0x14, 0x30, 0x00, 0x18, 0x49, 0x00, 0x11, 0x85, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9970, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x90, 0x00, 0x25, 0x12, 0x00, 0x20, 0xFF, 0x00, 0x50, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x12, 0x92, 0x00, 0x14, 0x9A, 0x00, 0x18, 0x94, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9971, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x82, 0x00, 0x25, 0x0A, 0x00, 0x22, 0xFE, 0x00, 0x50, 0x8A, 0x00, 0x10, 0x8A, 0x00, 0x10, 0xFA, 0x00, 0x10, 0x8A, 0x00, 0x12, 0x84, 0x00, 0x14, 0x81, 0x00, 0x18, 0x81, 0x00, 0x10, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9972, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x10, 0x02, 0x00, 0x1E, 0x12, 0x00, 0x13, 0xFA, 0x00, 0x24, 0x02, 0x00, 0x20, 0x02, 0x00, 0x51, 0xFA, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x11, 0x12, 0x00, 0x13, 0x12, 0x00, 0x15, 0xF2, 0x00, 0x19, 0x02, 0x00, 0x10, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9974, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x20, 0x00, 0x0F, 0x20, 0x00, 0x11, 0x44, 0x00, 0x22, 0x82, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x82, 0x00, 0x09, 0x82, 0x00, 0x0A, 0x82, 0x00, 0x0C, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9975, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1E, 0x84, 0x00, 0x12, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x20, 0x84, 0x00, 0x50, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x14, 0x04, 0x00, 0x18, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9976, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x44, 0x00, 0x1C, 0x7E, 0x00, 0x27, 0xC0, 0x00, 0x28, 0x28, 0x00, 0x40, 0x11, 0x00, 0x10, 0x69, 0x00, 0x13, 0x87, 0x00, 0x10, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x90, 0x00, 0x14, 0x90, 0x00, 0x18, 0x91, 0x00, 0x11, 0x11, 0x00, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9977, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x23, 0x02, 0x00, 0x45, 0x02, 0x00, 0x11, 0x7A, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x11, 0x4A, 0x00, 0x13, 0x7A, 0x00, 0x15, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0x0A, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x997A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x10, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x24, 0x44, 0x00, 0x20, 0x83, 0x00, 0x51, 0x01, 0x00, 0x10, 0x44, 0x00, 0x10, 0x28, 0x00, 0x10, 0x10, 0x00, 0x12, 0x28, 0x00, 0x14, 0x28, 0x00, 0x18, 0x44, 0x00, 0x10, 0x83, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x997C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x48, 0x00, 0x1E, 0x00, 0x00, 0x23, 0xFE, 0x00, 0x24, 0x48, 0x00, 0x50, 0x48, 0x00, 0x10, 0x4A, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x48, 0x00, 0x10, 0x48, 0x00, 0x12, 0x48, 0x00, 0x14, 0x48, 0x00, 0x18, 0x88, 0x00, 0x11, 0x08, 0x00, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x997D, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x1E, 0x20, 0x00, 0x22, 0x20, 0x00, 0x45, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x12, 0x04, 0x00, 0x10, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x10, 0x22, 0x00, 0x13, 0xFF, 0x00, 0x14, 0x20, 0x00, 0x18, 0x20, 0x00, 0x10, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x997F, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x68, 0x00, 0x11, 0xCA, 0x00, 0x1E, 0x49, 0x00, 0x12, 0x48, 0x00, 0x25, 0xFF, 0x00, 0x20, 0x48, 0x00, 0x50, 0x48, 0x00, 0x10, 0x6A, 0x00, 0x10, 0xCC, 0x00, 0x11, 0x48, 0x00, 0x10, 0x54, 0x00, 0x14, 0x64, 0x00, 0x18, 0x45, 0x00, 0x11, 0x43, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9980, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x10, 0x50, 0x00, 0x1E, 0x50, 0x00, 0x22, 0x88, 0x00, 0x45, 0x04, 0x00, 0x12, 0xFB, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x10, 0xA8, 0x00, 0x15, 0x26, 0x00, 0x1A, 0x22, 0x00, 0x10, 0xA0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9981, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x13, 0xF0, 0x00, 0x10, 0x00, 0x00, 0x1D, 0x22, 0x00, 0x24, 0x92, 0x00, 0x28, 0x94, 0x00, 0x40, 0x40, 0x00, 0x10, 0x42, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x14, 0x50, 0x00, 0x18, 0x70, 0x00, 0x10, 0x8C, 0x00, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9984, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x23, 0xFC, 0x00, 0x45, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x10, 0x00, 0x11, 0x12, 0x00, 0x11, 0xD4, 0x00, 0x13, 0x18, 0x00, 0x15, 0x11, 0x00, 0x19, 0x51, 0x00, 0x11, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9985, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7C, 0x00, 0x1E, 0x84, 0x00, 0x13, 0x08, 0x00, 0x24, 0x12, 0x00, 0x20, 0xCF, 0x00, 0x51, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0xCE, 0x00, 0x13, 0x02, 0x00, 0x15, 0x02, 0x00, 0x19, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9986, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x20, 0x00, 0x11, 0xFF, 0x00, 0x1D, 0x01, 0x00, 0x26, 0x02, 0x00, 0x28, 0xFC, 0x00, 0x40, 0x84, 0x00, 0x10, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x12, 0x84, 0x00, 0x14, 0x84, 0x00, 0x18, 0x84, 0x00, 0x10, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9987, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x13, 0xFE, 0x00, 0x1E, 0x70, 0x00, 0x22, 0xA8, 0x00, 0x45, 0x24, 0x00, 0x12, 0x23, 0x00, 0x15, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x15, 0x04, 0x00, 0x18, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9988, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFE, 0x00, 0x1D, 0x24, 0x00, 0x25, 0xFC, 0x00, 0x28, 0x20, 0x00, 0x47, 0xFF, 0x00, 0x10, 0x04, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x15, 0x24, 0x00, 0x18, 0x58, 0x00, 0x10, 0x86, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x998A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x52, 0x00, 0x10, 0x97, 0x00, 0x1E, 0x92, 0x00, 0x22, 0x92, 0x00, 0x44, 0xD6, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0xFE, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x44, 0x00, 0x14, 0x28, 0x00, 0x18, 0x10, 0x00, 0x10, 0x6C, 0x00, 0x03, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x998B, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x78, 0x00, 0x1C, 0x90, 0x00, 0x25, 0xFC, 0x00, 0x2B, 0x24, 0x00, 0x41, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x51, 0x00, 0x10, 0x91, 0x00, 0x13, 0x0F, 0x00, 0x10, 0x60, 0x00, 0x14, 0x18, 0x00, 0x18, 0xC0, 0x00, 0x10, 0x30, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x998D, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8A, 0x00, 0x13, 0xFF, 0x00, 0x1C, 0x88, 0x00, 0x24, 0x88, 0x00, 0x49, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x14, 0x50, 0x00, 0x18, 0x88, 0x00, 0x11, 0x07, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x998F, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x13, 0xBF, 0x00, 0x12, 0x12, 0x00, 0x1E, 0x92, 0x00, 0x26, 0x52, 0x00, 0x2A, 0x92, 0x00, 0x43, 0x2A, 0x00, 0x10, 0x44, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x16, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9990, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x13, 0xFE, 0x00, 0x1C, 0x20, 0x00, 0x25, 0xFE, 0x00, 0x48, 0x20, 0x00, 0x07, 0xFF, 0x00, 0x10, 0x44, 0x00, 0x10, 0xFE, 0x00, 0x10, 0xA4, 0x00, 0x11, 0x24, 0x00, 0x15, 0xFC, 0x00, 0x1A, 0x44, 0x00, 0x14, 0x44, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9991, { 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8A, 0x00, 0x13, 0xFF, 0x00, 0x1C, 0x88, 0x00, 0x24, 0xF8, 0x00, 0x48, 0x20, 0x00, 0x01, 0xFC, 0x00, 0x11, 0x24, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x15, 0xFC, 0x00, 0x18, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9992, { 0x00, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x1D, 0x02, 0x00, 0x15, 0xFE, 0x00, 0x24, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x42, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x11, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x14, 0x48, 0x00, 0x18, 0x30, 0x00, 0x10, 0xCF, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9993, { 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x11, 0x44, 0x00, 0x1F, 0xE8, 0x00, 0x25, 0x4F, 0x00, 0x49, 0x52, 0x00, 0x07, 0xFA, 0x00, 0x10, 0x0A, 0x00, 0x13, 0xEA, 0x00, 0x12, 0x2A, 0x00, 0x13, 0xE4, 0x00, 0x12, 0x24, 0x00, 0x17, 0xEA, 0x00, 0x1A, 0x2A, 0x00, 0x12, 0xB2, 0x00, 0x02, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9994, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x13, 0xDF, 0x00, 0x12, 0x52, 0x00, 0x1E, 0x52, 0x00, 0x27, 0xDE, 0x00, 0x4A, 0x10, 0x00, 0x02, 0x52, 0x00, 0x13, 0xDE, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x88, 0x00, 0x10, 0x8A, 0x00, 0x17, 0xFF, 0x00, 0x18, 0x88, 0x00, 0x11, 0x06, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9995, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x1D, 0xFC, 0x00, 0x25, 0x24, 0x00, 0x4B, 0xFF, 0x00, 0x02, 0x89, 0x00, 0x15, 0xFE, 0x00, 0x10, 0x88, 0x00, 0x11, 0xFC, 0x00, 0x10, 0x88, 0x00, 0x13, 0xFF, 0x00, 0x14, 0xA4, 0x00, 0x19, 0x98, 0x00, 0x16, 0xC7, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9996, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9997, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x10, 0x24, 0x00, 0x11, 0xFF, 0x80, 0x10, 0x10, 0x00, 0x7E, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x32, 0x7E, 0x80, 0x23, 0x01, 0x80, 0x61, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9998, { 0x00, 0x00, 0x00, 0x21, 0x05, 0x00, 0x33, 0x04, 0x80, 0x12, 0x04, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x21, 0x74, 0x80, 0x21, 0x54, 0x80, 0x3F, 0x56, 0x80, 0x21, 0x53, 0x00, 0x21, 0x72, 0x00, 0x3F, 0x02, 0x00, 0x21, 0x72, 0x00, 0x21, 0x06, 0x80, 0x3F, 0x1B, 0x80, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9999, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x999B, { 0x00, 0x00, 0x00, 0x02, 0x12, 0x00, 0x0E, 0x13, 0x00, 0x38, 0x11, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x1C, 0x11, 0x00, 0x2A, 0x39, 0x00, 0x49, 0x2B, 0x00, 0x3E, 0x6A, 0x00, 0x22, 0x4E, 0x00, 0x22, 0xC4, 0x00, 0x3E, 0x0E, 0x00, 0x22, 0x1A, 0x00, 0x22, 0x33, 0x00, 0x3E, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x999D, { 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x1C, 0x09, 0x00, 0x04, 0x05, 0x00, 0x3F, 0x81, 0x00, 0x0E, 0x12, 0x00, 0x15, 0x12, 0x00, 0x14, 0x92, 0x00, 0x24, 0x12, 0x00, 0x1F, 0x14, 0x00, 0x11, 0x55, 0x00, 0x11, 0x58, 0x80, 0x1F, 0x58, 0x80, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x999F, { 0x00, 0x00, 0x00, 0x02, 0x03, 0x80, 0x0E, 0xFE, 0x00, 0x38, 0x29, 0x00, 0x08, 0x6D, 0x80, 0x7F, 0x44, 0x80, 0x08, 0x00, 0x00, 0x1C, 0x7F, 0x00, 0x2A, 0x02, 0x00, 0x49, 0x04, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99A5, { 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xC0, 0x00, 0x0E, 0xBF, 0x00, 0x15, 0x21, 0x00, 0x14, 0xBF, 0x00, 0x24, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x08, 0x00, 0x11, 0x1F, 0x80, 0x1F, 0x21, 0x00, 0x11, 0x52, 0x00, 0x11, 0x8C, 0x00, 0x1F, 0x16, 0x00, 0x11, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99A6, { 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x0E, 0x12, 0x00, 0x38, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x15, 0x00, 0x1C, 0x15, 0x00, 0x2A, 0xFF, 0x80, 0x49, 0x15, 0x00, 0x3E, 0x15, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x14, 0x00, 0x3E, 0x36, 0x00, 0x22, 0x55, 0x00, 0x22, 0x94, 0x80, 0x3E, 0x14, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99A8, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xDE, 0x00, 0x02, 0x12, 0x80, 0x3F, 0xD3, 0x80, 0x00, 0x20, 0x00, 0x1F, 0xDF, 0x80, 0x12, 0x49, 0x00, 0x1F, 0xC6, 0x00, 0x20, 0xFA, 0x00, 0x0F, 0x51, 0x80, 0x3F, 0xFF, 0x80, 0x03, 0x4C, 0x00, 0x0F, 0xFF, 0x80, 0x37, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99AC, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x04, 0x80, 0x00, 0x22, 0x80, 0x02, 0x11, 0x80, 0x11, 0x08, 0x80, 0x10, 0x81, 0x00, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xBF, 0x80, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x1F, 0x91, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x0A, 0x00, 0x1F, 0x8A, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x11, 0x4A, 0x00, 0x02, 0xCA, 0x00, 0x09, 0x51, 0x00, 0x24, 0x91, 0x00, 0x23, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99AE, { 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x04, 0x80, 0x10, 0x12, 0x80, 0x10, 0x48, 0x80, 0x21, 0x21, 0x00, 0x22, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99B0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x24, 0x10, 0x00, 0x24, 0x1F, 0x80, 0x3F, 0xB0, 0x80, 0x24, 0x20, 0x80, 0x24, 0x60, 0x80, 0x3F, 0x80, 0x80, 0x24, 0x1E, 0x80, 0x24, 0x00, 0x80, 0x3F, 0xC0, 0x80, 0x00, 0x40, 0x80, 0x55, 0x40, 0x80, 0x55, 0x41, 0x80, 0x40, 0xC1, 0x00, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99B1, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x22, 0x94, 0x00, 0x05, 0x94, 0x00, 0x12, 0x92, 0x00, 0x28, 0xA2, 0x00, 0x21, 0x21, 0x00, 0x26, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99B2, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3F, 0x8E, 0x00, 0x24, 0x78, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x00, 0x48, 0x00, 0x55, 0x48, 0x80, 0x55, 0x48, 0x80, 0x40, 0xCC, 0x80, 0x01, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99B3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x28, 0x08, 0x00, 0x28, 0x48, 0x00, 0x3E, 0x4B, 0x00, 0x28, 0x5D, 0x00, 0x28, 0xE9, 0x00, 0x3E, 0x49, 0x00, 0x28, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x25, 0x4B, 0x00, 0x0B, 0x48, 0x00, 0x15, 0x48, 0x00, 0x09, 0x40, 0x80, 0x21, 0x7F, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99B4, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1F, 0xD5, 0x00, 0x12, 0x15, 0x00, 0x1F, 0xD5, 0x00, 0x12, 0x15, 0x00, 0x12, 0x15, 0x00, 0x1F, 0xD5, 0x00, 0x12, 0x15, 0x00, 0x12, 0x15, 0x00, 0x1F, 0xD5, 0x00, 0x11, 0x55, 0x00, 0x00, 0xD5, 0x00, 0x02, 0x55, 0x00, 0x0A, 0x55, 0x00, 0x28, 0x95, 0x00, 0x23, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99B5, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x24, 0x91, 0x00, 0x66, 0xD9, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x06, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x9F, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x1F, 0x91, 0x00, 0x12, 0x11, 0x00, 0x1F, 0x91, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x11, 0x00, 0x1F, 0xD1, 0x00, 0x11, 0x51, 0x00, 0x04, 0xD1, 0x00, 0x12, 0x51, 0x00, 0x08, 0x5F, 0x00, 0x20, 0x91, 0x00, 0x23, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x11, 0x00, 0x24, 0x13, 0x00, 0x3F, 0x12, 0x00, 0x24, 0x1F, 0x80, 0x24, 0x10, 0x80, 0x3F, 0x38, 0x80, 0x24, 0x29, 0x80, 0x24, 0x2D, 0x00, 0x3F, 0xA5, 0x00, 0x00, 0xA7, 0x00, 0x2A, 0xC2, 0x00, 0x6A, 0x87, 0x00, 0x41, 0x8D, 0x00, 0x03, 0x39, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99BC, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x24, 0x04, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0x91, 0x00, 0x24, 0x11, 0x00, 0x24, 0x1B, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x0A, 0x00, 0x24, 0x0E, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x4A, 0x00, 0x40, 0xDB, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99BD, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x24, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xC3, 0x80, 0x22, 0x1E, 0x00, 0x22, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x22, 0x10, 0x80, 0x22, 0x10, 0x80, 0x3F, 0x9F, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3F, 0xD0, 0x00, 0x00, 0x50, 0x00, 0x55, 0x50, 0x00, 0x55, 0x50, 0x00, 0x40, 0xD0, 0x00, 0x01, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xA2, 0x00, 0x14, 0x14, 0x00, 0x14, 0x0C, 0x00, 0x1F, 0x92, 0x00, 0x14, 0x61, 0x00, 0x14, 0x00, 0x00, 0x1F, 0xA2, 0x00, 0x14, 0x22, 0x00, 0x14, 0x14, 0x00, 0x1F, 0xD4, 0x00, 0x12, 0x48, 0x00, 0x05, 0x54, 0x00, 0x12, 0x52, 0x00, 0x28, 0xA1, 0x00, 0x23, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99C3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x08, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5B, 0x00, 0x40, 0xD1, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99C4, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3F, 0x8E, 0x00, 0x22, 0x0A, 0x00, 0x22, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x5B, 0x00, 0x55, 0x51, 0x00, 0x55, 0x55, 0x00, 0x40, 0xD5, 0x80, 0x01, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x14, 0x00, 0x24, 0x14, 0x00, 0x3F, 0xD6, 0x00, 0x00, 0x52, 0x00, 0x55, 0x52, 0x00, 0x55, 0x53, 0x00, 0x40, 0xD1, 0x00, 0x01, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x80, 0x22, 0x10, 0x00, 0x22, 0x10, 0x00, 0x3F, 0x95, 0x00, 0x22, 0x15, 0x00, 0x22, 0x15, 0x00, 0x3F, 0x92, 0x00, 0x22, 0x12, 0x00, 0x22, 0x12, 0x00, 0x3F, 0xD5, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x50, 0x00, 0x40, 0xD0, 0x00, 0x03, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99C8, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3F, 0xC6, 0x00, 0x22, 0x1C, 0x00, 0x22, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x22, 0x1F, 0x80, 0x22, 0x12, 0x00, 0x3F, 0x92, 0x00, 0x22, 0x12, 0x00, 0x22, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x55, 0x52, 0x00, 0x55, 0x52, 0x00, 0x40, 0xD2, 0x00, 0x03, 0xBF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x24, 0x55, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x5D, 0x00, 0x01, 0x41, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x43, 0x41, 0x00, 0x06, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x88, 0x00, 0x12, 0x04, 0x00, 0x12, 0x7F, 0x80, 0x1F, 0x84, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x12, 0x3F, 0x80, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x11, 0x44, 0x00, 0x04, 0xC4, 0x00, 0x0A, 0x44, 0x00, 0x28, 0xBF, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D1, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xA2, 0x00, 0x09, 0x14, 0x00, 0x1A, 0x08, 0x00, 0x26, 0x14, 0x00, 0x09, 0x23, 0x80, 0x3F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x02, 0x80, 0x11, 0x10, 0x80, 0x20, 0x8B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x24, 0x20, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0x40, 0x80, 0x24, 0x80, 0x80, 0x24, 0x00, 0x80, 0x3F, 0x3C, 0x80, 0x24, 0x24, 0x80, 0x24, 0x24, 0x80, 0x3F, 0xBC, 0x80, 0x22, 0xA4, 0x80, 0x05, 0x80, 0x80, 0x12, 0x81, 0x00, 0x29, 0x01, 0x00, 0x26, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x0C, 0x00, 0x24, 0x08, 0x00, 0x24, 0x1A, 0x00, 0x3F, 0x3A, 0x00, 0x24, 0x6B, 0x00, 0x24, 0xC9, 0x80, 0x3F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x00, 0x00, 0x43, 0x7F, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x22, 0x1F, 0x00, 0x22, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x22, 0x11, 0x00, 0x22, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x00, 0x51, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x00, 0x40, 0xFF, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D5, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x10, 0xA1, 0x00, 0x13, 0xBF, 0x00, 0x20, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x14, 0x90, 0x80, 0x22, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99D8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xC8, 0x00, 0x24, 0x18, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x17, 0x80, 0x24, 0x3C, 0x80, 0x3F, 0x80, 0x00, 0x24, 0x00, 0x00, 0x24, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x00, 0x51, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x00, 0x40, 0xD1, 0x00, 0x01, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99D9, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x3F, 0x7F, 0x80, 0x28, 0xA2, 0x00, 0x28, 0x22, 0x00, 0x3F, 0x2A, 0x00, 0x28, 0x26, 0x00, 0x28, 0x22, 0x00, 0x3F, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x05, 0xA2, 0x00, 0x0A, 0xA2, 0x00, 0x28, 0xA2, 0x00, 0x23, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99DA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x14, 0x00, 0x3F, 0x14, 0x00, 0x01, 0x14, 0x00, 0x55, 0x36, 0x00, 0x55, 0x22, 0x00, 0x43, 0x63, 0x00, 0x06, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99DB, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x24, 0x04, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x24, 0x24, 0x80, 0x24, 0x24, 0x80, 0x3F, 0xBF, 0x80, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0xD4, 0x00, 0x00, 0x4C, 0x00, 0x55, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x40, 0xDB, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99DC, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3F, 0x0C, 0x00, 0x24, 0x04, 0x00, 0x24, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x56, 0x00, 0x3F, 0x55, 0x00, 0x24, 0xD5, 0x80, 0x24, 0x9C, 0x80, 0x3F, 0x18, 0x00, 0x01, 0x10, 0x00, 0x55, 0x30, 0x00, 0x55, 0xD0, 0x80, 0x43, 0x19, 0x80, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99DD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x80, 0x80, 0x24, 0x00, 0x00, 0x3F, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x13, 0x80, 0x3F, 0x9C, 0x00, 0x22, 0x90, 0x00, 0x05, 0x90, 0x00, 0x12, 0x90, 0x80, 0x28, 0x90, 0x80, 0x20, 0x9F, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99DE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x24, 0x20, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x24, 0xC4, 0x00, 0x24, 0x25, 0x80, 0x3F, 0x26, 0x80, 0x24, 0x2C, 0x80, 0x24, 0x34, 0x80, 0x3F, 0x65, 0x80, 0x01, 0x24, 0x00, 0x55, 0x24, 0x00, 0x55, 0x20, 0x80, 0x43, 0x31, 0x80, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x80, 0x28, 0x2A, 0x80, 0x28, 0x2A, 0x80, 0x3F, 0x2A, 0x80, 0x28, 0x2A, 0x80, 0x28, 0x2A, 0x80, 0x3F, 0x2B, 0x80, 0x28, 0x30, 0x80, 0x28, 0x20, 0x80, 0x3F, 0xA0, 0x80, 0x22, 0xA0, 0x80, 0x05, 0xA0, 0x80, 0x12, 0xA0, 0x80, 0x29, 0x3F, 0x80, 0x22, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99E2, { 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xB3, 0x00, 0x24, 0x12, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x55, 0x52, 0x00, 0x55, 0x52, 0x00, 0x40, 0xD2, 0x00, 0x01, 0xA2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x3F, 0x5D, 0x00, 0x24, 0x41, 0x00, 0x24, 0x41, 0x00, 0x3F, 0x5D, 0x00, 0x24, 0x55, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x01, 0x5D, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x43, 0x41, 0x00, 0x06, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99EA, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xD4, 0x00, 0x24, 0x14, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0xA4, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x0A, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x5A, 0x00, 0x55, 0x52, 0x80, 0x40, 0xD2, 0x80, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99EB, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xA4, 0x80, 0x24, 0x35, 0x80, 0x24, 0x15, 0x00, 0x3F, 0x95, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x0A, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5A, 0x80, 0x40, 0xD2, 0x80, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x1F, 0x00, 0x24, 0x11, 0x00, 0x3F, 0xD1, 0x00, 0x00, 0x51, 0x80, 0x55, 0x5F, 0x00, 0x55, 0x71, 0x00, 0x40, 0xC1, 0x00, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99ED, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x28, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x28, 0x10, 0x00, 0x28, 0xA2, 0x00, 0x3E, 0x42, 0x00, 0x28, 0x24, 0x80, 0x28, 0x18, 0x80, 0x3F, 0x11, 0x00, 0x25, 0x22, 0x00, 0x0B, 0xC4, 0x00, 0x05, 0x0A, 0x00, 0x29, 0x31, 0x00, 0x26, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99EE, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x0A, 0x00, 0x3F, 0x9B, 0x00, 0x24, 0x31, 0x80, 0x24, 0x00, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x1B, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xCE, 0x00, 0x00, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x4A, 0x00, 0x40, 0xDB, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x24, 0x5D, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x01, 0x63, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x43, 0x7F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99F1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x28, 0x3F, 0x00, 0x28, 0x21, 0x00, 0x3F, 0x52, 0x00, 0x28, 0x8C, 0x00, 0x3F, 0x0C, 0x00, 0x28, 0x12, 0x00, 0x28, 0x21, 0x80, 0x3F, 0xC0, 0x00, 0x25, 0x3F, 0x00, 0x0B, 0x21, 0x00, 0x25, 0x21, 0x00, 0x11, 0x21, 0x00, 0x42, 0x3F, 0x00, 0x4C, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x24, 0x80, 0x24, 0x24, 0x80, 0x24, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x24, 0x24, 0x80, 0x24, 0x6D, 0x80, 0x3F, 0x6D, 0x80, 0x24, 0x24, 0x80, 0x24, 0x24, 0x80, 0x3F, 0x24, 0x80, 0x01, 0x24, 0x80, 0x55, 0x24, 0x80, 0x55, 0x64, 0x80, 0x43, 0x40, 0x80, 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99F4, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x3F, 0x05, 0x00, 0x24, 0x04, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x04, 0x00, 0x24, 0x54, 0x00, 0x24, 0x54, 0x00, 0x3F, 0x55, 0x00, 0x24, 0xFD, 0x00, 0x24, 0x56, 0x00, 0x3F, 0x56, 0x00, 0x01, 0x54, 0x00, 0x55, 0x8E, 0x80, 0x55, 0x1A, 0x80, 0x43, 0x33, 0x80, 0x06, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x0A, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xBB, 0x80, 0x24, 0x2A, 0x80, 0x24, 0x2A, 0x80, 0x3F, 0xAA, 0x80, 0x24, 0x2A, 0x80, 0x24, 0x3B, 0x80, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5A, 0x00, 0x40, 0xD2, 0x00, 0x01, 0xB2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x24, 0x01, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0x81, 0x00, 0x24, 0x1F, 0x00, 0x24, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x20, 0x80, 0x24, 0x1F, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x4B, 0x00, 0x55, 0x46, 0x00, 0x55, 0x4C, 0x00, 0x40, 0xDB, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99F9, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x3F, 0x2C, 0x00, 0x24, 0x24, 0x00, 0x24, 0xFF, 0x80, 0x3E, 0x21, 0x00, 0x24, 0x23, 0x00, 0x24, 0x26, 0x00, 0x3F, 0x2C, 0x80, 0x24, 0x21, 0x80, 0x24, 0x73, 0x00, 0x3F, 0x56, 0x00, 0x01, 0x50, 0x80, 0x55, 0x51, 0x80, 0x55, 0x57, 0x00, 0x43, 0x58, 0x80, 0x06, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xDF, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x00, 0x00, 0x24, 0x1F, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x44, 0x00, 0x40, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x00, 0x00, 0x24, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x11, 0x00, 0x24, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x00, 0x51, 0x00, 0x55, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x40, 0xD1, 0x00, 0x01, 0x93, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x99FE, { 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3F, 0x93, 0x00, 0x24, 0x31, 0x80, 0x24, 0x20, 0x80, 0x3F, 0x9F, 0x00, 0x24, 0x11, 0x00, 0x24, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x1F, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5A, 0x80, 0x40, 0xD2, 0x80, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x99FF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x24, 0x22, 0x00, 0x24, 0x4F, 0x00, 0x3F, 0xF4, 0x80, 0x24, 0x24, 0x00, 0x24, 0x24, 0x80, 0x3F, 0x47, 0x80, 0x24, 0x90, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0x42, 0x00, 0x25, 0xA4, 0x00, 0x0B, 0x18, 0x00, 0x15, 0x18, 0x00, 0x29, 0x26, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A01, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x24, 0x80, 0x3F, 0xBF, 0x80, 0x24, 0x24, 0x80, 0x24, 0x3F, 0x80, 0x3F, 0xA0, 0x80, 0x24, 0x00, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x90, 0x00, 0x0A, 0x9F, 0x80, 0x15, 0xA0, 0x80, 0x08, 0x80, 0x80, 0x21, 0x01, 0x00, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A02, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x00, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x1B, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x7F, 0x80, 0x55, 0x44, 0x00, 0x55, 0x44, 0x00, 0x40, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A03, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xCA, 0x00, 0x24, 0x1A, 0x00, 0x24, 0x17, 0x00, 0x3F, 0xBD, 0x80, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x34, 0x00, 0x24, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5B, 0x00, 0x40, 0xD1, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A04, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x1F, 0x00, 0x24, 0x31, 0x00, 0x24, 0x23, 0x00, 0x3F, 0x7E, 0x00, 0x24, 0x02, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x24, 0x48, 0x80, 0x24, 0x69, 0x80, 0x3F, 0x2D, 0x00, 0x01, 0x1E, 0x00, 0x55, 0x2B, 0x00, 0x55, 0x69, 0x80, 0x43, 0xC8, 0x00, 0x06, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A05, { 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xCB, 0x00, 0x24, 0x0A, 0x00, 0x24, 0x1F, 0x80, 0x3F, 0x92, 0x00, 0x24, 0x32, 0x00, 0x24, 0x12, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x00, 0x5F, 0x00, 0x55, 0x52, 0x00, 0x55, 0x52, 0x00, 0x40, 0xD2, 0x00, 0x01, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A08, { 0x00, 0x00, 0x00, 0x3F, 0x11, 0x00, 0x28, 0x11, 0x00, 0x28, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x28, 0x22, 0x00, 0x28, 0x3A, 0x00, 0x3F, 0xEF, 0x80, 0x25, 0x22, 0x00, 0x03, 0x22, 0x00, 0x09, 0x22, 0x00, 0x25, 0x42, 0x00, 0x51, 0x42, 0x00, 0x46, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A0B, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x3F, 0x49, 0x00, 0x24, 0x49, 0x00, 0x24, 0x49, 0x00, 0x3F, 0xEB, 0x80, 0x24, 0xAA, 0x80, 0x24, 0x1C, 0x00, 0x3F, 0x1C, 0x00, 0x01, 0x2A, 0x00, 0x55, 0x2A, 0x00, 0x55, 0x6B, 0x00, 0x43, 0xC9, 0x80, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A0C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x20, 0x80, 0x3F, 0xA0, 0x80, 0x24, 0x1F, 0x00, 0x24, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x24, 0x3F, 0x80, 0x24, 0x04, 0x00, 0x3F, 0xD5, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x80, 0x55, 0x64, 0x80, 0x40, 0xC4, 0x00, 0x01, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A0E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x3F, 0x14, 0x00, 0x28, 0x22, 0x00, 0x28, 0xC1, 0x80, 0x3F, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x80, 0x3F, 0x81, 0x00, 0x02, 0xBD, 0x00, 0x0A, 0xA5, 0x00, 0x28, 0xBD, 0x00, 0x28, 0x81, 0x00, 0x21, 0x01, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A0F, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x28, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x28, 0x22, 0x00, 0x28, 0x22, 0x00, 0x3F, 0xBE, 0x00, 0x02, 0xA2, 0x00, 0x0A, 0xA2, 0x00, 0x28, 0xFF, 0x80, 0x29, 0x00, 0x00, 0x22, 0x22, 0x00, 0x0C, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A10, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x1C, 0x00, 0x24, 0x36, 0x00, 0x24, 0x63, 0x00, 0x3F, 0xDD, 0x80, 0x24, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x02, 0x00, 0x24, 0x04, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x0C, 0x00, 0x01, 0x14, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x80, 0x43, 0x52, 0x80, 0x06, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A11, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x73, 0x80, 0x3F, 0x12, 0x00, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x3F, 0x73, 0x80, 0x24, 0x12, 0x00, 0x24, 0x12, 0x00, 0x3F, 0x32, 0x00, 0x01, 0x53, 0x80, 0x55, 0x12, 0x00, 0x55, 0x32, 0x00, 0x43, 0x22, 0x00, 0x06, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x22, 0x11, 0x00, 0x22, 0x0A, 0x00, 0x3F, 0x84, 0x00, 0x22, 0x0A, 0x00, 0x22, 0x35, 0x80, 0x3F, 0x84, 0x00, 0x22, 0x1F, 0x00, 0x22, 0x15, 0x00, 0x3F, 0xD5, 0x00, 0x00, 0x5F, 0x00, 0x55, 0x44, 0x00, 0x55, 0x45, 0x00, 0x40, 0xCF, 0x80, 0x01, 0xB8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A13, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xCE, 0x00, 0x22, 0x1B, 0x00, 0x22, 0x31, 0x80, 0x3F, 0x9F, 0x00, 0x22, 0x04, 0x00, 0x22, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x22, 0x24, 0x80, 0x22, 0x24, 0x80, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x4A, 0x00, 0x40, 0xDB, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A16, { 0x00, 0x00, 0x00, 0x7F, 0x10, 0x00, 0x12, 0x3F, 0x80, 0x0C, 0x62, 0x00, 0x7F, 0x96, 0x00, 0x19, 0x0C, 0x00, 0x2A, 0x7A, 0x00, 0x48, 0x01, 0x80, 0x1F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A19, { 0x00, 0x00, 0x00, 0x3F, 0x03, 0x80, 0x24, 0x3C, 0x00, 0x24, 0x20, 0x00, 0x3F, 0x3F, 0x80, 0x24, 0x20, 0x80, 0x24, 0x20, 0x80, 0x3F, 0x3F, 0x80, 0x24, 0x20, 0x00, 0x24, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x22, 0xAA, 0x80, 0x09, 0xBF, 0x80, 0x14, 0xAA, 0x80, 0x08, 0xEA, 0x80, 0x21, 0x6A, 0x80, 0x26, 0xAB, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A1E, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0x0C, 0x00, 0x24, 0x79, 0x00, 0x24, 0x0E, 0x00, 0x3F, 0x78, 0x80, 0x24, 0x0F, 0x00, 0x24, 0x78, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x00, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x08, 0x00, 0x01, 0x10, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x51, 0x00, 0x43, 0x11, 0x00, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x3F, 0x28, 0x00, 0x01, 0x2F, 0x00, 0x55, 0x28, 0x00, 0x55, 0x68, 0x00, 0x43, 0x58, 0x00, 0x06, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x77, 0x00, 0x24, 0x51, 0x00, 0x24, 0x51, 0x00, 0x3F, 0x51, 0x00, 0x24, 0x77, 0x00, 0x24, 0x40, 0x00, 0x3F, 0x4F, 0x00, 0x24, 0x75, 0x00, 0x24, 0x45, 0x00, 0x3F, 0x45, 0x00, 0x01, 0x77, 0x00, 0x55, 0x42, 0x00, 0x55, 0x47, 0x00, 0x43, 0x45, 0x00, 0x06, 0x4D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A23, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3F, 0x55, 0x00, 0x24, 0x49, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x3F, 0x62, 0x00, 0x24, 0xC3, 0x80, 0x24, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x63, 0x00, 0x55, 0xD6, 0x00, 0x55, 0x1C, 0x00, 0x43, 0x36, 0x00, 0x06, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7D, 0x00, 0x24, 0x16, 0x00, 0x24, 0x54, 0x00, 0x3F, 0x36, 0x80, 0x24, 0x63, 0x00, 0x24, 0xC1, 0x80, 0x3F, 0x3E, 0x00, 0x24, 0x08, 0x00, 0x24, 0x08, 0x00, 0x3F, 0x7F, 0x80, 0x01, 0x14, 0x00, 0x55, 0x12, 0x00, 0x55, 0x33, 0x00, 0x43, 0x61, 0x00, 0x06, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x24, 0x2F, 0x00, 0x3F, 0x29, 0x00, 0x24, 0x29, 0x00, 0x24, 0x29, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x40, 0x80, 0x24, 0x5E, 0x80, 0x3F, 0x52, 0x80, 0x01, 0x52, 0x80, 0x55, 0x52, 0x80, 0x55, 0x5E, 0x80, 0x43, 0x40, 0x80, 0x06, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A28, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x80, 0x3F, 0xED, 0x80, 0x22, 0x25, 0x00, 0x22, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x22, 0x24, 0x80, 0x22, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x22, 0x24, 0x80, 0x22, 0x3F, 0x80, 0x3F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x44, 0x00, 0x40, 0xC4, 0x00, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A2B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x22, 0x08, 0x80, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0C, 0x06, 0x00, 0x3F, 0xFD, 0x80, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A2D, { 0x00, 0x00, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x4F, 0x00, 0x24, 0x48, 0x00, 0x25, 0xFF, 0x80, 0x22, 0x28, 0x00, 0x22, 0xD9, 0x00, 0x22, 0x0E, 0x00, 0x2E, 0xF8, 0x00, 0x20, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A2E, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3F, 0x77, 0x80, 0x24, 0x42, 0x80, 0x24, 0x42, 0x80, 0x3E, 0x52, 0x80, 0x24, 0x52, 0x80, 0x24, 0x7A, 0x80, 0x3E, 0xCD, 0x80, 0x24, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x01, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x43, 0x49, 0x00, 0x06, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A30, { 0x00, 0x00, 0x00, 0x1C, 0x54, 0x00, 0x14, 0x92, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x28, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x82, 0x00, 0x17, 0xFF, 0x80, 0x14, 0x90, 0x00, 0x1C, 0xFF, 0x00, 0x14, 0x90, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x90, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x0A, 0x80, 0x24, 0xAA, 0x80, 0x2D, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3E, 0x7F, 0x00, 0x24, 0x48, 0x00, 0x24, 0x48, 0x00, 0x3F, 0x7F, 0x80, 0x01, 0x00, 0x80, 0x55, 0x2A, 0x80, 0x55, 0x6A, 0x80, 0x43, 0x41, 0x80, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x44, 0x00, 0x24, 0x48, 0x00, 0x3E, 0x5F, 0x00, 0x24, 0x51, 0x00, 0x24, 0x51, 0x00, 0x3E, 0x5F, 0x00, 0x24, 0x51, 0x00, 0x24, 0x51, 0x00, 0x3F, 0x5F, 0x00, 0x01, 0x44, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x80, 0x43, 0x64, 0x80, 0x06, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A36, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x14, 0x3F, 0x80, 0x14, 0x48, 0x80, 0x1F, 0xAA, 0x80, 0x15, 0x2A, 0x80, 0x14, 0x3E, 0x80, 0x1F, 0x22, 0x80, 0x14, 0x23, 0x00, 0x14, 0x3F, 0x80, 0x1F, 0xC8, 0x80, 0x12, 0xAA, 0x80, 0x05, 0xBE, 0x80, 0x12, 0xA2, 0x80, 0x28, 0x80, 0x80, 0x23, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x24, 0x14, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x36, 0x00, 0x24, 0xC1, 0x80, 0x3F, 0x08, 0x00, 0x24, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x25, 0x7F, 0x00, 0x03, 0x49, 0x00, 0x09, 0x09, 0x00, 0x29, 0x0F, 0x80, 0x26, 0x70, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A38, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x3F, 0x7F, 0x00, 0x24, 0x40, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x3F, 0x40, 0x00, 0x24, 0x7B, 0x80, 0x24, 0x48, 0x80, 0x3F, 0x59, 0x80, 0x01, 0x6A, 0x80, 0x55, 0x48, 0x80, 0x55, 0x59, 0x80, 0x43, 0x6A, 0x80, 0x06, 0x99, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x24, 0x80, 0x24, 0x3F, 0x80, 0x3F, 0xA4, 0x80, 0x24, 0x3F, 0x80, 0x24, 0x08, 0x00, 0x3F, 0xB2, 0x00, 0x24, 0x14, 0x00, 0x24, 0x09, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x44, 0x80, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x40, 0xD4, 0x80, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A40, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x07, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x3F, 0xFF, 0x80, 0x06, 0x44, 0x00, 0x0F, 0xFE, 0x00, 0x37, 0xFD, 0x80, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x12, 0x24, 0x80, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A41, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x04, 0x3F, 0x80, 0x7F, 0xE1, 0x00, 0x04, 0x13, 0x00, 0x7F, 0xDA, 0x00, 0x08, 0x0E, 0x00, 0x1F, 0xBB, 0x00, 0x30, 0x81, 0x80, 0x6F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A42, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xCA, 0x00, 0x24, 0x0E, 0x00, 0x24, 0x11, 0x00, 0x3F, 0xAA, 0x80, 0x24, 0x3B, 0x80, 0x24, 0x0E, 0x00, 0x3F, 0x9B, 0x00, 0x24, 0x31, 0x80, 0x24, 0x04, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x52, 0x00, 0x55, 0x44, 0x80, 0x55, 0x49, 0x00, 0x40, 0xC2, 0x00, 0x01, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x14, 0x00, 0x3E, 0x7F, 0x00, 0x28, 0x55, 0x00, 0x28, 0x55, 0x00, 0x3E, 0x7F, 0x00, 0x28, 0x00, 0x00, 0x28, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x0B, 0x08, 0x00, 0x15, 0x49, 0x00, 0x09, 0x49, 0x00, 0x22, 0x88, 0x80, 0x2C, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A44, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x08, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x48, 0x80, 0x3F, 0x6E, 0x80, 0x24, 0x52, 0x80, 0x24, 0x6A, 0x80, 0x3F, 0x44, 0x80, 0x24, 0x4A, 0x80, 0x24, 0x40, 0x80, 0x3F, 0x7F, 0x80, 0x01, 0x00, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x80, 0x43, 0x52, 0x80, 0x06, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x40, 0x00, 0x24, 0x40, 0x00, 0x3F, 0x5F, 0x00, 0x24, 0x51, 0x00, 0x3F, 0x5F, 0x00, 0x24, 0x40, 0x00, 0x24, 0x5F, 0x00, 0x3F, 0x55, 0x00, 0x25, 0x55, 0x00, 0x0B, 0x55, 0x00, 0x15, 0x5F, 0x00, 0x09, 0x40, 0x00, 0x21, 0x7F, 0x80, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A47, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3E, 0x00, 0x7F, 0xCA, 0x00, 0x24, 0xBA, 0x00, 0x5F, 0xD2, 0x00, 0x04, 0x1A, 0x80, 0x7F, 0xA9, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x40, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A4A, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x3F, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x01, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x43, 0x08, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A4B, { 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x3F, 0x0A, 0x00, 0x24, 0xDC, 0x80, 0x24, 0x37, 0x00, 0x3E, 0xE1, 0x80, 0x24, 0x00, 0x00, 0x24, 0xE7, 0x00, 0x3E, 0x25, 0x00, 0x24, 0xE5, 0x00, 0x24, 0x89, 0x80, 0x3F, 0xE0, 0x00, 0x01, 0x2F, 0x80, 0x55, 0x28, 0x80, 0x55, 0x25, 0x00, 0x43, 0x62, 0x00, 0x06, 0xCD, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A4C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x28, 0x09, 0x00, 0x28, 0xFF, 0x80, 0x3E, 0x09, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x3E, 0xAA, 0x80, 0x28, 0xEB, 0x80, 0x28, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x02, 0x88, 0x80, 0x2A, 0xEB, 0x80, 0x6A, 0xAA, 0x80, 0x46, 0xAA, 0x80, 0x0D, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A4D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x29, 0xFF, 0x80, 0x28, 0x5A, 0x00, 0x3F, 0xEF, 0x80, 0x25, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x05, 0x24, 0x00, 0x11, 0x24, 0x00, 0x29, 0x44, 0x80, 0x26, 0x87, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A4E, { 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x3F, 0x2A, 0x00, 0x24, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x2A, 0x00, 0x24, 0x6B, 0x00, 0x24, 0xC9, 0x80, 0x3F, 0x48, 0x00, 0x24, 0x71, 0x00, 0x24, 0xD7, 0x80, 0x3F, 0x95, 0x00, 0x01, 0x55, 0x00, 0x55, 0x35, 0x00, 0x55, 0x2F, 0x80, 0x43, 0x61, 0x00, 0x06, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x0A, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0x3B, 0x80, 0x24, 0x2A, 0x80, 0x24, 0x2A, 0x80, 0x3F, 0x3B, 0x80, 0x24, 0x0A, 0x00, 0x24, 0x0A, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0xA4, 0x80, 0x2A, 0xBF, 0x80, 0x6A, 0xA4, 0x80, 0x41, 0xA4, 0x80, 0x03, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x14, 0x00, 0x24, 0x7F, 0x80, 0x3F, 0x54, 0x80, 0x24, 0x5C, 0x80, 0x24, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0xBF, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0xFF, 0x80, 0x41, 0x88, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A55, { 0x00, 0x00, 0x00, 0x3E, 0x0E, 0x00, 0x28, 0x78, 0x00, 0x28, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x7F, 0x00, 0x3E, 0xA2, 0x80, 0x28, 0x3E, 0x00, 0x28, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x0B, 0x5D, 0x00, 0x15, 0x55, 0x00, 0x09, 0x5D, 0x00, 0x22, 0x41, 0x00, 0x2C, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A56, { 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x3E, 0xF4, 0x80, 0x28, 0x44, 0x00, 0x29, 0xFF, 0x80, 0x3E, 0x04, 0x00, 0x28, 0xF4, 0x00, 0x28, 0x94, 0x00, 0x3E, 0xF4, 0x80, 0x28, 0x04, 0x80, 0x28, 0xF5, 0x80, 0x3F, 0x45, 0x00, 0x01, 0xF7, 0x00, 0x55, 0x42, 0x00, 0x55, 0x76, 0x80, 0x43, 0xCA, 0x80, 0x06, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A57, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x28, 0x22, 0x00, 0x28, 0x41, 0x00, 0x3E, 0x80, 0x80, 0x28, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x28, 0x77, 0x00, 0x28, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x25, 0x77, 0x00, 0x0B, 0x00, 0x00, 0x15, 0x22, 0x00, 0x09, 0x22, 0x00, 0x21, 0x55, 0x00, 0x26, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A5A, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x3F, 0xC8, 0x00, 0x09, 0x1F, 0x80, 0x1F, 0xA1, 0x00, 0x20, 0xD2, 0x00, 0x1E, 0x8C, 0x00, 0x12, 0x96, 0x00, 0x1E, 0xE1, 0x80, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x80, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x94, 0x80, 0x28, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x14, 0x00, 0x3F, 0x7F, 0x00, 0x25, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x29, 0x08, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A5D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x7F, 0x80, 0x24, 0x08, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x3F, 0x7F, 0x00, 0x24, 0x10, 0x00, 0x24, 0x3F, 0x00, 0x3F, 0x61, 0x00, 0x01, 0x3F, 0x00, 0x55, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x43, 0x2A, 0x00, 0x06, 0xC9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x29, 0x2F, 0x80, 0x3D, 0xE1, 0x00, 0x29, 0x2A, 0x00, 0x29, 0xE6, 0x00, 0x3D, 0x25, 0x00, 0x29, 0x68, 0x80, 0x29, 0x8E, 0x00, 0x3E, 0x31, 0x00, 0x2A, 0x5A, 0x00, 0x06, 0x94, 0x00, 0x13, 0x34, 0x00, 0x0A, 0x52, 0x00, 0x22, 0x91, 0x00, 0x2C, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A62, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x90, 0x00, 0x28, 0x9F, 0x00, 0x3E, 0xF0, 0x00, 0x28, 0x9F, 0x80, 0x28, 0xBE, 0x00, 0x3E, 0xAA, 0x00, 0x28, 0xBE, 0x00, 0x28, 0xAA, 0x00, 0x3F, 0xBE, 0x00, 0x25, 0x80, 0x00, 0x0B, 0xFF, 0x00, 0x09, 0xD5, 0x00, 0x23, 0x55, 0x00, 0x2D, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A64, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x00, 0x00, 0x24, 0x3B, 0x80, 0x3F, 0xAA, 0x80, 0x24, 0x3F, 0x80, 0x24, 0x0A, 0x00, 0x3F, 0x9F, 0x00, 0x24, 0x0A, 0x00, 0x24, 0x3F, 0x80, 0x3F, 0xCA, 0x00, 0x00, 0x5A, 0x80, 0x55, 0x72, 0x80, 0x55, 0x53, 0x00, 0x40, 0xDD, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A65, { 0x00, 0x00, 0x00, 0x3E, 0x14, 0x00, 0x28, 0xF7, 0x80, 0x28, 0x14, 0x00, 0x3F, 0xF4, 0x80, 0x28, 0x17, 0x80, 0x28, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x3F, 0x7F, 0x00, 0x03, 0x22, 0x00, 0x0B, 0x7F, 0x00, 0x29, 0x22, 0x00, 0x29, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x0C, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A69, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x77, 0x00, 0x3E, 0x55, 0x00, 0x28, 0x77, 0x00, 0x28, 0x24, 0x00, 0x3E, 0x28, 0x00, 0x28, 0x7F, 0x00, 0x3F, 0xC8, 0x00, 0x25, 0x7F, 0x00, 0x03, 0x48, 0x00, 0x09, 0x7F, 0x00, 0x15, 0x48, 0x00, 0x29, 0x7F, 0x80, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x28, 0xF7, 0x80, 0x3E, 0xB6, 0x80, 0x28, 0xB6, 0x80, 0x28, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x28, 0x94, 0x00, 0x28, 0xFF, 0x80, 0x3F, 0x94, 0x80, 0x25, 0xFF, 0x80, 0x0B, 0xA4, 0x00, 0x15, 0xBF, 0x00, 0x29, 0xB4, 0x80, 0x26, 0x63, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A6B, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x40, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x40, 0x00, 0x07, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x12, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x24, 0x00, 0x3F, 0x3F, 0x00, 0x24, 0x24, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x80, 0x80, 0x2A, 0xAA, 0x80, 0x41, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9A6C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A6D, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x12, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x28, 0x00, 0x01, 0x10, 0x00, 0x0F, 0x28, 0x00, 0x71, 0x28, 0x00, 0x21, 0x44, 0x00, 0x0A, 0x47, 0x00, 0x05, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A6E, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x02, 0x10, 0x00, 0x12, 0x10, 0x00, 0x12, 0x12, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x01, 0x28, 0x00, 0x01, 0x28, 0x00, 0x0D, 0x28, 0x00, 0x71, 0x48, 0x00, 0x21, 0x44, 0x00, 0x0A, 0x87, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A6F, { 0x00, 0x00, 0x00, 0x02, 0x41, 0x00, 0x3F, 0x49, 0x00, 0x02, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1F, 0x49, 0x00, 0x01, 0x49, 0x00, 0x07, 0x49, 0x00, 0x39, 0x49, 0x00, 0x11, 0x49, 0x00, 0x05, 0x49, 0x00, 0x02, 0x81, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A70, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x04, 0x90, 0x00, 0x24, 0x90, 0x00, 0x24, 0x92, 0x00, 0x24, 0x9F, 0x00, 0x24, 0xF2, 0x00, 0x25, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x02, 0x92, 0x00, 0x02, 0x9A, 0x00, 0x0E, 0x94, 0x00, 0x72, 0x91, 0x00, 0x02, 0x81, 0x00, 0x14, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A71, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x04, 0x80, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x24, 0x94, 0x00, 0x24, 0x94, 0x00, 0x24, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x02, 0x94, 0x00, 0x02, 0x94, 0x00, 0x0E, 0xA2, 0x00, 0x72, 0xC2, 0x00, 0x22, 0x80, 0x00, 0x0A, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A73, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3F, 0x84, 0x00, 0x02, 0x44, 0x00, 0x12, 0x28, 0x00, 0x12, 0x10, 0x00, 0x12, 0x28, 0x00, 0x12, 0x44, 0x00, 0x12, 0x84, 0x00, 0x1F, 0x02, 0x00, 0x01, 0x46, 0x00, 0x01, 0x28, 0x00, 0x0F, 0x10, 0x00, 0x71, 0x28, 0x00, 0x21, 0x47, 0x00, 0x05, 0x82, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A74, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x12, 0x00, 0x04, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x02, 0x80, 0x00, 0x02, 0x80, 0x00, 0x0E, 0x80, 0x00, 0x72, 0x80, 0x00, 0x02, 0x80, 0x00, 0x15, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A75, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7E, 0xFE, 0x00, 0x04, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0xFC, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x02, 0xFC, 0x00, 0x02, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x72, 0x84, 0x00, 0x02, 0x84, 0x00, 0x0B, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A76, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x04, 0x12, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x50, 0x00, 0x0E, 0x20, 0x00, 0x72, 0x30, 0x00, 0x22, 0x48, 0x00, 0x0A, 0x87, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A77, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7E, 0x02, 0x00, 0x04, 0xFF, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x02, 0xAA, 0x00, 0x02, 0xCE, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x02, 0xFE, 0x00, 0x0A, 0x82, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A78, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x04, 0x44, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x25, 0xFF, 0x00, 0x26, 0x84, 0x00, 0x24, 0xA4, 0x00, 0x3E, 0x94, 0x00, 0x02, 0x94, 0x00, 0x02, 0x84, 0x00, 0x0E, 0x84, 0x00, 0x72, 0x84, 0x00, 0x02, 0x84, 0x00, 0x0A, 0x94, 0x00, 0x04, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A79, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x04, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x02, 0x00, 0x26, 0x12, 0x00, 0x24, 0xFA, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x02, 0x92, 0x00, 0x0E, 0xF2, 0x00, 0x72, 0x92, 0x00, 0x02, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A7A, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x04, 0x7C, 0x00, 0x24, 0x84, 0x00, 0x25, 0x08, 0x00, 0x24, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x3E, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFE, 0x00, 0x0E, 0x02, 0x00, 0x72, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A7B, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x10, 0x00, 0x04, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x14, 0x00, 0x3E, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x10, 0x00, 0x22, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A7C, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x10, 0x00, 0x02, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x13, 0x02, 0x00, 0x12, 0x40, 0x00, 0x12, 0x44, 0x00, 0x1F, 0x48, 0x00, 0x01, 0x70, 0x00, 0x01, 0x40, 0x00, 0x0D, 0x40, 0x00, 0x71, 0x41, 0x00, 0x21, 0x41, 0x00, 0x0A, 0x3F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A7D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x7E, 0x00, 0x09, 0x04, 0x00, 0x1A, 0x28, 0x00, 0x06, 0x10, 0x00, 0x19, 0x6C, 0x00, 0x60, 0x83, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A7E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x3F, 0xBF, 0x00, 0x08, 0xA2, 0x00, 0x08, 0xA2, 0x00, 0x12, 0xBE, 0x00, 0x21, 0x22, 0x00, 0x4F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A7F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x04, 0x44, 0x00, 0x24, 0x28, 0x00, 0x24, 0x10, 0x00, 0x24, 0x28, 0x00, 0x24, 0x47, 0x00, 0x25, 0x92, 0x00, 0x3E, 0x10, 0x00, 0x02, 0xFE, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x73, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A80, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x04, 0x20, 0x00, 0x24, 0x44, 0x00, 0x24, 0x82, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x24, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x02, 0x82, 0x00, 0x02, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x02, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A81, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x04, 0x5E, 0x00, 0x25, 0xE0, 0x00, 0x24, 0x28, 0x00, 0x24, 0x12, 0x00, 0x24, 0x6A, 0x00, 0x25, 0x86, 0x00, 0x3E, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x48, 0x00, 0x0E, 0x48, 0x00, 0x72, 0x48, 0x00, 0x02, 0x89, 0x00, 0x0A, 0x89, 0x00, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A82, { 0x00, 0x00, 0x00, 0x3F, 0x7E, 0x00, 0x21, 0x42, 0x00, 0x21, 0x42, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFA, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A84, { 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x7E, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x24, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x28, 0x00, 0x24, 0x44, 0x00, 0x24, 0x83, 0x00, 0x3F, 0x46, 0x00, 0x02, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x72, 0x44, 0x00, 0x22, 0x44, 0x00, 0x0A, 0x44, 0x00, 0x04, 0x84, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A85, { 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, 0x7E, 0x50, 0x00, 0x04, 0x92, 0x00, 0x24, 0x94, 0x00, 0x25, 0x98, 0x00, 0x26, 0xB0, 0x00, 0x24, 0xD1, 0x00, 0x24, 0x8F, 0x00, 0x3E, 0x90, 0x00, 0x02, 0x12, 0x00, 0x03, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x10, 0x00, 0x02, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A86, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x7E, 0x40, 0x00, 0x04, 0x7E, 0x00, 0x24, 0x82, 0x00, 0x25, 0x44, 0x00, 0x24, 0x28, 0x00, 0x24, 0x10, 0x00, 0x24, 0x28, 0x00, 0x3E, 0xC7, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x72, 0x82, 0x00, 0x22, 0x82, 0x00, 0x0A, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A87, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x7E, 0x20, 0x00, 0x04, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x20, 0x00, 0x24, 0x40, 0x00, 0x24, 0x84, 0x00, 0x25, 0xFC, 0x00, 0x3E, 0x88, 0x00, 0x02, 0x12, 0x00, 0x02, 0x26, 0x00, 0x0E, 0xC8, 0x00, 0x73, 0x10, 0x00, 0x22, 0x2C, 0x00, 0x0A, 0xC6, 0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A88, { 0x00, 0x00, 0x00, 0x04, 0x82, 0x00, 0x7E, 0x44, 0x00, 0x04, 0x28, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x44, 0x00, 0x02, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x72, 0x44, 0x00, 0x02, 0x44, 0x00, 0x0A, 0x84, 0x00, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A8A, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7D, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0xEE, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x3E, 0xEE, 0x00, 0x02, 0xAA, 0x00, 0x02, 0xAA, 0x00, 0x0E, 0xAA, 0x00, 0x72, 0xAA, 0x00, 0x02, 0xAA, 0x00, 0x0A, 0xAA, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A8B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x12, 0x00, 0x04, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x40, 0x00, 0x02, 0xFE, 0x00, 0x0E, 0x02, 0x00, 0x72, 0x02, 0x00, 0x22, 0x02, 0x00, 0x0A, 0x14, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A8C, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x20, 0x00, 0x04, 0x50, 0x00, 0x24, 0x50, 0x00, 0x24, 0x88, 0x00, 0x25, 0x07, 0x00, 0x26, 0xFA, 0x00, 0x24, 0x00, 0x00, 0x3E, 0x24, 0x00, 0x03, 0x24, 0x00, 0x02, 0xA4, 0x00, 0x0E, 0xA8, 0x00, 0x72, 0x88, 0x00, 0x22, 0x12, 0x00, 0x0B, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A8F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x10, 0x00, 0x04, 0x24, 0x00, 0x24, 0x42, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x24, 0x83, 0x00, 0x25, 0x41, 0x00, 0x24, 0x7C, 0x00, 0x3E, 0x84, 0x00, 0x03, 0x44, 0x00, 0x02, 0x28, 0x00, 0x1A, 0x10, 0x00, 0x62, 0x28, 0x00, 0x0A, 0x47, 0x00, 0x05, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A90, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x7E, 0x44, 0x00, 0x05, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x24, 0x7C, 0x00, 0x24, 0x44, 0x00, 0x24, 0x44, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x44, 0x00, 0x02, 0x44, 0x00, 0x0F, 0xFF, 0x00, 0x72, 0x00, 0x00, 0x02, 0x44, 0x00, 0x0A, 0x83, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A91, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x24, 0x00, 0x05, 0xFE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x58, 0x00, 0x24, 0x8A, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x04, 0x00, 0x3E, 0xF4, 0x00, 0x02, 0x94, 0x00, 0x02, 0x94, 0x00, 0x0E, 0x94, 0x00, 0x72, 0xF4, 0x00, 0x22, 0x84, 0x00, 0x0A, 0x14, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A92, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x04, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x03, 0xFF, 0x00, 0x02, 0x38, 0x00, 0x0E, 0x54, 0x00, 0x72, 0x97, 0x00, 0x03, 0x12, 0x00, 0x0A, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A93, { 0x00, 0x00, 0x00, 0x04, 0x50, 0x00, 0x7E, 0x48, 0x00, 0x04, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x25, 0x88, 0x00, 0x26, 0x88, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x88, 0x00, 0x3E, 0x88, 0x00, 0x02, 0xFE, 0x00, 0x02, 0x88, 0x00, 0x0E, 0x88, 0x00, 0x72, 0x8A, 0x00, 0x02, 0xFF, 0x00, 0x0A, 0x80, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A96, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7E, 0x40, 0x00, 0x04, 0x84, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x22, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x48, 0x00, 0x24, 0x94, 0x00, 0x3F, 0x23, 0x00, 0x02, 0xC8, 0x00, 0x02, 0x10, 0x00, 0x0E, 0x22, 0x00, 0x72, 0xC4, 0x00, 0x02, 0x18, 0x00, 0x0A, 0x60, 0x00, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A97, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7C, 0x14, 0x00, 0x09, 0xFE, 0x00, 0x29, 0x04, 0x00, 0x29, 0x04, 0x00, 0x29, 0xFC, 0x00, 0x29, 0x00, 0x00, 0x29, 0x02, 0x00, 0x3D, 0xFF, 0x00, 0x05, 0x4A, 0x00, 0x05, 0x4A, 0x00, 0x1D, 0xFE, 0x00, 0x67, 0x4A, 0x00, 0x05, 0x4A, 0x00, 0x15, 0x4A, 0x00, 0x09, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A98, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xBE, 0x00, 0x24, 0xA0, 0x00, 0x2B, 0xFF, 0x00, 0x24, 0x24, 0x00, 0x34, 0xA8, 0x00, 0x2B, 0x30, 0x00, 0x20, 0xC0, 0x00, 0x2F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A9A, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x04, 0x92, 0x00, 0x24, 0x44, 0x00, 0x24, 0x38, 0x00, 0x24, 0x44, 0x00, 0x25, 0x93, 0x00, 0x24, 0x12, 0x00, 0x3E, 0xFF, 0x00, 0x02, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x72, 0xFE, 0x00, 0x22, 0x90, 0x00, 0x02, 0x14, 0x00, 0x0A, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A9B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x44, 0x00, 0x0A, 0x7E, 0x00, 0x04, 0x44, 0x00, 0x7F, 0x28, 0x00, 0x0D, 0x10, 0x00, 0x14, 0x68, 0x00, 0x24, 0x87, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x10, 0x00, 0x04, 0x12, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A9C, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3F, 0x22, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0x44, 0x00, 0x04, 0x28, 0x00, 0x7F, 0x90, 0x00, 0x08, 0x2C, 0x00, 0x1F, 0x43, 0x00, 0x21, 0x00, 0x00, 0x4F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x04, 0x0A, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A9D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x7F, 0xDF, 0x00, 0x05, 0x09, 0x00, 0x25, 0x09, 0x00, 0x25, 0x49, 0x00, 0x25, 0x95, 0x00, 0x25, 0x22, 0x00, 0x24, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x02, 0x92, 0x00, 0x02, 0x92, 0x00, 0x0E, 0xFE, 0x00, 0x72, 0x92, 0x00, 0x02, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A9E, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x4F, 0xFA, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xE8, 0x00, 0x72, 0x27, 0x00, 0x02, 0x20, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xF4, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9A9F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x08, 0x00, 0x04, 0xFF, 0x00, 0x24, 0x81, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x80, 0x00, 0x24, 0xF7, 0x00, 0x24, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x02, 0xD5, 0x00, 0x02, 0xB3, 0x00, 0x0E, 0xB3, 0x00, 0x72, 0xD5, 0x00, 0x02, 0x91, 0x00, 0x0B, 0x55, 0x00, 0x04, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA0, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x04, 0x28, 0x00, 0x24, 0x2A, 0x00, 0x24, 0xFF, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xFE, 0x00, 0x3E, 0x00, 0x00, 0x02, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x72, 0x54, 0x00, 0x02, 0x93, 0x00, 0x0B, 0x11, 0x00, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA1, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x7E, 0xFF, 0x00, 0x04, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0x24, 0x00, 0x3E, 0xF8, 0x00, 0x02, 0x12, 0x00, 0x02, 0xFE, 0x00, 0x0E, 0x10, 0x00, 0x72, 0x54, 0x00, 0x22, 0x93, 0x00, 0x0B, 0x51, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA2, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x7E, 0x22, 0x00, 0x04, 0xFF, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xBA, 0x00, 0x24, 0xAA, 0x00, 0x24, 0xDA, 0x00, 0x24, 0x92, 0x00, 0x3E, 0xA2, 0x00, 0x02, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x0E, 0x50, 0x00, 0x72, 0xD2, 0x00, 0x03, 0x45, 0x00, 0x0A, 0x44, 0x00, 0x04, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA3, { 0x00, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x7D, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7C, 0x00, 0x29, 0x08, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x10, 0x00, 0x3D, 0x30, 0x00, 0x05, 0xEE, 0x00, 0x05, 0x22, 0x00, 0x1D, 0x44, 0x00, 0x65, 0xFF, 0x00, 0x05, 0x44, 0x00, 0x16, 0x44, 0x00, 0x08, 0xCC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA4, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x09, 0x22, 0x00, 0x29, 0xEA, 0x00, 0x29, 0x24, 0x00, 0x29, 0xEA, 0x00, 0x29, 0x31, 0x00, 0x2B, 0xEC, 0x00, 0x3C, 0x30, 0x00, 0x05, 0xD2, 0x00, 0x04, 0x34, 0x00, 0x1D, 0xD8, 0x00, 0x64, 0x34, 0x00, 0x04, 0xD3, 0x00, 0x17, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA5, { 0x00, 0x00, 0x00, 0x04, 0x28, 0x00, 0x7E, 0xEE, 0x00, 0x04, 0x28, 0x00, 0x25, 0xEF, 0x00, 0x24, 0x00, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x92, 0x00, 0x24, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x02, 0xFE, 0x00, 0x02, 0x44, 0x00, 0x0E, 0xFE, 0x00, 0x72, 0x44, 0x00, 0x03, 0xFF, 0x00, 0x0A, 0x44, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA7, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x2B, 0xDE, 0x00, 0x2A, 0x52, 0x00, 0x2B, 0xDE, 0x00, 0x28, 0x88, 0x00, 0x29, 0xFC, 0x00, 0x3C, 0x88, 0x00, 0x05, 0xFC, 0x00, 0x04, 0x88, 0x00, 0x1F, 0xFF, 0x00, 0x64, 0xA4, 0x00, 0x05, 0x98, 0x00, 0x16, 0xC7, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AA8, { 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x7E, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x42, 0x00, 0x2E, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x52, 0x00, 0x7F, 0x5A, 0x00, 0x41, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x22, 0xC2, 0x80, 0x22, 0x82, 0x80, 0x27, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x08, 0x00, 0x2F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x40, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x23, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1F, 0x00, 0x21, 0x04, 0x00, 0x2F, 0x04, 0x00, 0x29, 0x04, 0x00, 0x29, 0x04, 0x00, 0x7F, 0x84, 0x00, 0x40, 0xBF, 0x80, 0x3F, 0x04, 0x00, 0x21, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x21, 0x04, 0x00, 0x3F, 0x04, 0x00, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x23, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AAE, { 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x3F, 0x13, 0x00, 0x21, 0x11, 0x00, 0x2F, 0x10, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x10, 0x00, 0x7F, 0x90, 0x00, 0x40, 0x90, 0x00, 0x3F, 0x18, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x0C, 0x00, 0x3F, 0x04, 0x00, 0x21, 0x06, 0x80, 0x21, 0x03, 0x80, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AAF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x08, 0x00, 0x2F, 0x7F, 0x80, 0x29, 0x00, 0x00, 0x29, 0x00, 0x00, 0x7F, 0x9E, 0x00, 0x40, 0x92, 0x00, 0x3F, 0x12, 0x00, 0x21, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x21, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x21, 0x32, 0x80, 0x21, 0x22, 0x80, 0x23, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x1E, 0x00, 0x21, 0x12, 0x00, 0x2F, 0x12, 0x00, 0x29, 0x12, 0x00, 0x29, 0x13, 0x80, 0x7F, 0xA0, 0x00, 0x40, 0x80, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x11, 0x00, 0x3F, 0x1B, 0x00, 0x21, 0x0E, 0x00, 0x3F, 0x04, 0x00, 0x21, 0x0E, 0x00, 0x21, 0x1B, 0x00, 0x23, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AB1, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x11, 0x28, 0x00, 0x1D, 0x28, 0x00, 0x15, 0x44, 0x00, 0x3F, 0x83, 0x00, 0x20, 0xA4, 0x00, 0x5F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x00, 0x11, 0x24, 0x00, 0x15, 0x44, 0x00, 0x12, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AB2, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0xF9, 0x00, 0x7F, 0xC9, 0x00, 0x41, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x79, 0x00, 0x3E, 0x47, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x40, 0x80, 0x22, 0x61, 0x80, 0x26, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AB4, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x00, 0x2E, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA5, 0x80, 0x7F, 0xBF, 0x00, 0x40, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x22, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x22, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x22, 0xBC, 0x80, 0x22, 0xE4, 0x80, 0x27, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AB5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2E, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x41, 0x2A, 0x00, 0x3E, 0x2A, 0x00, 0x22, 0x6B, 0x00, 0x3E, 0x49, 0x00, 0x22, 0xC9, 0x80, 0x3E, 0x3E, 0x00, 0x22, 0x08, 0x00, 0x22, 0x08, 0x00, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AB6, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x07, 0x00, 0x22, 0x7C, 0x00, 0x2E, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x41, 0x7F, 0x80, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x46, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x80, 0x22, 0x73, 0x80, 0x26, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AB7, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x11, 0x10, 0x00, 0x1D, 0x12, 0x00, 0x15, 0x7F, 0x00, 0x3F, 0x90, 0x00, 0x20, 0x90, 0x00, 0x5F, 0x12, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x42, 0x00, 0x11, 0x42, 0x00, 0x1F, 0x42, 0x00, 0x11, 0x42, 0x00, 0x11, 0x42, 0x00, 0x15, 0x7E, 0x00, 0x12, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AB8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x17, 0xFF, 0x80, 0x15, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x20, 0xA2, 0x00, 0x1F, 0x42, 0x00, 0x11, 0x24, 0x80, 0x1F, 0x18, 0x80, 0x11, 0x11, 0x00, 0x1F, 0x22, 0x00, 0x11, 0xC4, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x13, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AB9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x2E, 0xFF, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0x63, 0x00, 0x7F, 0xC1, 0x80, 0x41, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x1C, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x1C, 0x00, 0x22, 0x36, 0x00, 0x22, 0x63, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ABA, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x3F, 0x0E, 0x00, 0x22, 0xF0, 0x00, 0x3A, 0x80, 0x00, 0x2A, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x41, 0x80, 0x00, 0x3E, 0x82, 0x00, 0x22, 0xBF, 0x00, 0x3E, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x3E, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x22, 0xA2, 0x00, 0x2B, 0x3E, 0x00, 0x24, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ABB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x2E, 0x14, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xC1, 0x80, 0x7F, 0x3E, 0x00, 0x41, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x10, 0x00, 0x3E, 0x20, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x01, 0x00, 0x22, 0x01, 0x00, 0x22, 0x03, 0x00, 0x26, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ABC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x21, 0x3F, 0x00, 0x2F, 0x21, 0x00, 0x29, 0x63, 0x00, 0x29, 0x16, 0x00, 0x7F, 0x8C, 0x00, 0x40, 0x9E, 0x00, 0x3F, 0x33, 0x00, 0x21, 0x61, 0x80, 0x3F, 0x00, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x23, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ABE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x08, 0x00, 0x2E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x68, 0x00, 0x3E, 0x38, 0x00, 0x22, 0x1C, 0x00, 0x22, 0x36, 0x00, 0x26, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ABF, { 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x3E, 0x33, 0x00, 0x22, 0x22, 0x00, 0x2E, 0xF7, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x41, 0x32, 0x00, 0x3E, 0xE7, 0x80, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x62, 0x00, 0x22, 0x42, 0x00, 0x26, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AC0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x2E, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x41, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x14, 0x00, 0x3E, 0x24, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x26, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x2E, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x41, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x22, 0x2A, 0x00, 0x3E, 0x6B, 0x00, 0x22, 0x49, 0x00, 0x22, 0xC9, 0x80, 0x26, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AC2, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x3A, 0xA1, 0x00, 0x2A, 0x3E, 0x00, 0x7F, 0x44, 0x00, 0x41, 0xA8, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x28, 0x00, 0x3E, 0xC7, 0x00, 0x22, 0x7C, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x24, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x2E, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x41, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x22, 0x8A, 0x80, 0x3E, 0x8E, 0x80, 0x22, 0xBA, 0x80, 0x22, 0x80, 0x80, 0x26, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AC4, { 0x00, 0x00, 0x00, 0x3E, 0x08, 0x00, 0x22, 0x88, 0x00, 0x2E, 0xFF, 0x80, 0x2A, 0x48, 0x00, 0x2A, 0x1F, 0x00, 0x7F, 0x11, 0x00, 0x41, 0x31, 0x00, 0x3E, 0xDF, 0x00, 0x22, 0x51, 0x00, 0x3E, 0x51, 0x00, 0x22, 0x5F, 0x00, 0x3E, 0x51, 0x00, 0x22, 0x51, 0x00, 0x22, 0x53, 0x00, 0x22, 0xE0, 0x00, 0x26, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AC5, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x54, 0x00, 0x3A, 0x10, 0x00, 0x2A, 0xFF, 0x00, 0x7F, 0x10, 0x00, 0x41, 0x54, 0x00, 0x3E, 0x92, 0x00, 0x22, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x24, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x38, 0x00, 0x22, 0x28, 0x00, 0x2A, 0x46, 0x00, 0x24, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AC6, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x3E, 0x09, 0x00, 0x22, 0xFF, 0x80, 0x2E, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x49, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x3E, 0x02, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x22, 0x12, 0x00, 0x22, 0x02, 0x00, 0x26, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AC8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x2E, 0x22, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x7F, 0x80, 0x80, 0x41, 0x08, 0x80, 0x3E, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x1F, 0x00, 0x3E, 0x11, 0x00, 0x22, 0x31, 0x00, 0x22, 0x61, 0x00, 0x26, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ACB, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x08, 0x00, 0x22, 0xFF, 0x00, 0x3A, 0x81, 0x00, 0x2A, 0x24, 0x00, 0x7F, 0xFF, 0x00, 0x41, 0x24, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x4A, 0x00, 0x3E, 0x4A, 0x00, 0x22, 0x52, 0x00, 0x3E, 0x52, 0x00, 0x22, 0x28, 0x00, 0x22, 0x29, 0x00, 0x2A, 0x49, 0x00, 0x24, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ACC, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x3F, 0x10, 0x00, 0x22, 0xFF, 0x00, 0x3A, 0x81, 0x00, 0x2A, 0x0E, 0x00, 0x7F, 0x70, 0x00, 0x41, 0x42, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x22, 0x44, 0x00, 0x2A, 0x83, 0x00, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ACE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xF7, 0x80, 0x22, 0x31, 0x80, 0x2E, 0x52, 0x80, 0x2A, 0x31, 0x80, 0x2A, 0x52, 0x80, 0x7F, 0x08, 0x80, 0x41, 0x1C, 0x00, 0x3E, 0x36, 0x00, 0x22, 0xE3, 0x80, 0x3E, 0x10, 0x00, 0x22, 0x64, 0x00, 0x3E, 0x19, 0x00, 0x22, 0x62, 0x00, 0x22, 0x0C, 0x00, 0x26, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ACF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x49, 0x00, 0x2E, 0xFF, 0x80, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x41, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x22, 0x74, 0x00, 0x22, 0x1E, 0x00, 0x26, 0x73, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AD0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x08, 0x00, 0x2E, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x42, 0x00, 0x7F, 0xF7, 0x80, 0x41, 0x42, 0x00, 0x3E, 0x72, 0x00, 0x22, 0xC7, 0x80, 0x3E, 0x00, 0x00, 0x22, 0xFF, 0x80, 0x3E, 0x24, 0x00, 0x22, 0x24, 0x80, 0x22, 0x64, 0x80, 0x26, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0xA9, 0x00, 0x2E, 0xA9, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x41, 0x50, 0x80, 0x3E, 0xFC, 0x80, 0x22, 0x54, 0x80, 0x3E, 0x54, 0x80, 0x22, 0x7C, 0x80, 0x3E, 0x14, 0x80, 0x22, 0x3D, 0x80, 0x22, 0x65, 0x00, 0x26, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AD2, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x22, 0xFF, 0x80, 0x2E, 0x22, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x44, 0x00, 0x7F, 0x75, 0x00, 0x41, 0x96, 0x00, 0x3E, 0x54, 0x80, 0x22, 0x24, 0x80, 0x3E, 0xC3, 0x80, 0x22, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x22, 0x00, 0x22, 0x62, 0x00, 0x26, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AD3, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x1E, 0x88, 0x00, 0x12, 0x7F, 0x80, 0x16, 0x10, 0x00, 0x16, 0x2F, 0x00, 0x3F, 0x44, 0x00, 0x21, 0xFF, 0x80, 0x1E, 0x9F, 0x00, 0x12, 0x11, 0x00, 0x1F, 0x9F, 0x00, 0x12, 0x91, 0x00, 0x1E, 0x9F, 0x00, 0x12, 0x91, 0x00, 0x12, 0x93, 0x00, 0x12, 0xC0, 0x00, 0x17, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AD4, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x3F, 0x80, 0x17, 0x2A, 0x80, 0x15, 0x3F, 0x80, 0x3F, 0xAA, 0x80, 0x20, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x11, 0x00, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x80, 0x1F, 0x3F, 0x80, 0x11, 0x11, 0x00, 0x21, 0x0A, 0x00, 0x23, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AD5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x22, 0x80, 0x80, 0x2E, 0x7F, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0xCA, 0x00, 0x7F, 0x0C, 0x00, 0x41, 0x7F, 0x00, 0x3E, 0xC1, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x22, 0x00, 0x26, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AD6, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x22, 0xFF, 0x80, 0x2E, 0xA4, 0x80, 0x2A, 0xFE, 0x80, 0x2A, 0x24, 0x00, 0x7F, 0x7E, 0x00, 0x41, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x22, 0x25, 0x00, 0x22, 0x64, 0x80, 0x26, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AD7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x0F, 0x00, 0x22, 0x08, 0x00, 0x2E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xBE, 0x00, 0x7F, 0x88, 0x80, 0x41, 0xBF, 0x80, 0x3E, 0xA9, 0x00, 0x22, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x22, 0xBF, 0x00, 0x3F, 0x00, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x55, 0x00, 0x26, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AD8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x10, 0x01, 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AD9, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ADB, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x48, 0x00, 0x00, 0x48, 0x00, 0x7F, 0x7E, 0x00, 0x41, 0x4A, 0x00, 0x5D, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5A, 0x00, 0x5D, 0x52, 0x80, 0x41, 0xB2, 0x80, 0x43, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ADC, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x7F, 0x72, 0x00, 0x41, 0x12, 0x00, 0x5D, 0xFF, 0x80, 0x55, 0x12, 0x00, 0x55, 0x12, 0x00, 0x5D, 0x32, 0x00, 0x41, 0x62, 0x00, 0x43, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ADE, { 0x00, 0x00, 0x00, 0x08, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x22, 0x77, 0x00, 0x3E, 0x55, 0x00, 0x00, 0x55, 0x00, 0x7F, 0x77, 0x00, 0x41, 0x08, 0x00, 0x5D, 0xFF, 0x80, 0x55, 0x2A, 0x00, 0x55, 0x2A, 0x00, 0x5D, 0x6B, 0x00, 0x41, 0xC9, 0x80, 0x43, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ADF, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x86, 0x00, 0x10, 0x04, 0x00, 0x1F, 0x0C, 0x00, 0x10, 0x19, 0x00, 0x10, 0x33, 0x00, 0x1F, 0x02, 0x00, 0x10, 0x06, 0x00, 0x10, 0x0C, 0x00, 0x7F, 0xD8, 0x80, 0x10, 0x31, 0x80, 0x11, 0x01, 0x00, 0x31, 0x03, 0x00, 0x27, 0x86, 0x00, 0x7C, 0x8C, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE0, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x71, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x38, 0x80, 0x10, 0x03, 0x00, 0x7F, 0xCC, 0x00, 0x11, 0x30, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE1, { 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x24, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x12, 0x00, 0x7F, 0xC4, 0x00, 0x09, 0x08, 0x00, 0x1F, 0xB0, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x02, 0x21, 0x00, 0x0C, 0x21, 0x00, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE2, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x18, 0x80, 0x10, 0x01, 0x00, 0x7F, 0xC6, 0x00, 0x11, 0x18, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x20, 0x00, 0x04, 0x3E, 0x00, 0x07, 0xE2, 0x00, 0x7C, 0x26, 0x00, 0x04, 0x00, 0x80, 0x06, 0x01, 0x80, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE3, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x18, 0x80, 0x10, 0x01, 0x00, 0x7F, 0xC6, 0x00, 0x11, 0x18, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x03, 0x02, 0x00, 0x0E, 0x06, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE4, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x71, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x38, 0x80, 0x10, 0x03, 0x00, 0x7F, 0xCC, 0x00, 0x11, 0x30, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0xA0, 0x00, 0x06, 0xB0, 0x00, 0x1C, 0x9C, 0x00, 0x70, 0x87, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE5, { 0x00, 0x00, 0x00, 0x0F, 0xC1, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xC4, 0x80, 0x0F, 0xD9, 0x00, 0x08, 0x06, 0x00, 0x3F, 0xF8, 0x80, 0x08, 0x41, 0x00, 0x13, 0xE6, 0x00, 0x3C, 0x20, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE6, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x80, 0x00, 0x81, 0x80, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE7, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x81, 0x00, 0x21, 0xC1, 0x00, 0x03, 0x40, 0x00, 0x06, 0x40, 0x80, 0x1C, 0x61, 0x80, 0x70, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AE9, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x10, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x1F, 0xFD, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AEA, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x30, 0x00, 0x10, 0x01, 0x00, 0x1F, 0x06, 0x00, 0x10, 0x18, 0x00, 0x7F, 0xC0, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x1D, 0x04, 0x00, 0x70, 0xF8, 0x00, 0x07, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AEB, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x07, 0x07, 0x00, 0x7C, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AEC, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xB0, 0x00, 0x0E, 0x9C, 0x00, 0x38, 0x87, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AED, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x18, 0x80, 0x10, 0x01, 0x00, 0x7F, 0xC6, 0x00, 0x11, 0x18, 0x00, 0x3E, 0x80, 0x00, 0x04, 0x20, 0x00, 0x24, 0x23, 0x00, 0x27, 0xBE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x80, 0x3F, 0xB1, 0x80, 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AEE, { 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x89, 0x00, 0x08, 0x12, 0x00, 0x0F, 0x84, 0x80, 0x3F, 0xE9, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xE4, 0x00, 0x3C, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x84, 0x00, 0x04, 0x48, 0x00, 0x08, 0x38, 0x00, 0x31, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AEF, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x08, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF1, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x02, 0x00, 0x7F, 0xE2, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xEE, 0x00, 0x08, 0x00, 0x80, 0x0C, 0x01, 0x80, 0x07, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF2, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x17, 0xFA, 0x00, 0x13, 0x18, 0x00, 0x11, 0xB0, 0x00, 0x30, 0xE0, 0x00, 0x63, 0xB8, 0x00, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF3, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x18, 0x00, 0x00, 0xA0, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x21, 0x00, 0x06, 0x26, 0x00, 0x38, 0x20, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF4, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x01, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x01, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x21, 0x00, 0x06, 0x27, 0x00, 0x1C, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF5, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x22, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF7, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x18, 0x80, 0x10, 0x01, 0x00, 0x7F, 0xC6, 0x00, 0x11, 0x18, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AF9, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0D, 0xFF, 0x80, 0x18, 0x54, 0x00, 0x38, 0x54, 0x00, 0x68, 0xD6, 0x00, 0x09, 0x93, 0x00, 0x0B, 0x11, 0x80, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AFA, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x1F, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AFB, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9AFD, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x1C, 0x8E, 0x00, 0x36, 0x9B, 0x00, 0x60, 0x81, 0x80, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9AFF, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x00, 0x18, 0x92, 0x00, 0x61, 0x93, 0x00, 0x31, 0x11, 0x80, 0x04, 0x36, 0x00, 0x0C, 0x0C, 0x00, 0x38, 0x38, 0x00, 0x60, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B00, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x81, 0x00, 0x0C, 0x83, 0x00, 0x70, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B01, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x81, 0x00, 0x3E, 0x11, 0x00, 0x04, 0x11, 0x00, 0x7F, 0x91, 0x00, 0x14, 0x11, 0x00, 0x36, 0x01, 0x00, 0x65, 0x81, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B02, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x60, 0x00, 0x07, 0x80, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B03, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0C, 0x8C, 0x00, 0x39, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B04, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x72, 0x21, 0x00, 0x06, 0x63, 0x00, 0x0C, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B05, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1D, 0x1D, 0x00, 0x13, 0x13, 0x00, 0x19, 0x19, 0x00, 0x17, 0x17, 0x00, 0x31, 0x31, 0x00, 0x67, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B06, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x1F, 0x18, 0x80, 0x10, 0x01, 0x00, 0x7F, 0xC6, 0x00, 0x11, 0x18, 0x00, 0x3E, 0x80, 0x00, 0x04, 0x22, 0x00, 0x7F, 0x63, 0x00, 0x14, 0xC1, 0x80, 0x16, 0x10, 0x00, 0x35, 0x32, 0x00, 0x64, 0x27, 0x00, 0x04, 0x7D, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B08, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x04, 0x88, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x14, 0x12, 0x00, 0x64, 0x71, 0x80, 0x04, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B09, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x13, 0x32, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x32, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x08, 0x00, 0x73, 0xEF, 0x80, 0x0E, 0x20, 0x00, 0x71, 0xC0, 0x00, 0x1F, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B0B, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x00, 0x19, 0x22, 0x00, 0x17, 0x22, 0x00, 0x19, 0x22, 0x00, 0x17, 0x02, 0x00, 0x11, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B0C, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x68, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B0D, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x7F, 0x21, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x22, 0x61, 0x00, 0x3E, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B0E, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x15, 0x01, 0x00, 0x64, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B0F, { 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x0A, 0x70, 0x00, 0x0C, 0x0C, 0x00, 0x7F, 0x72, 0x00, 0x12, 0x04, 0x00, 0x3F, 0x78, 0x00, 0x00, 0x10, 0x00, 0x03, 0x12, 0x00, 0x3C, 0x56, 0x00, 0x04, 0x58, 0x00, 0x7F, 0x90, 0x00, 0x0C, 0x28, 0x00, 0x16, 0x28, 0x00, 0x65, 0x44, 0x00, 0x04, 0x43, 0x00, 0x04, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B10, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x01, 0x00, 0x12, 0x96, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0xA0, 0x00, 0x7F, 0xFE, 0x80, 0x01, 0x01, 0x80, 0x0F, 0xFF, 0x00, 0x18, 0x04, 0x00, 0x6F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B12, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3F, 0xF4, 0x00, 0x08, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B13, { 0x00, 0x00, 0x00, 0x09, 0x0C, 0x00, 0x0A, 0x70, 0x00, 0x0C, 0x0C, 0x00, 0x7F, 0x72, 0x00, 0x12, 0x04, 0x00, 0x3F, 0x78, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x31, 0x00, 0x47, 0xC2, 0x00, 0x04, 0x10, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x22, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B16, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x21, 0x24, 0x00, 0x4B, 0xD9, 0x00, 0x74, 0x8E, 0x80, 0x03, 0x60, 0x00, 0x0C, 0x9C, 0x00, 0x73, 0x23, 0x80, 0x0C, 0xC8, 0x00, 0x03, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B18, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x08, 0x00, 0x03, 0xF0, 0x00, 0x3E, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B19, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x74, 0x8B, 0x80, 0x12, 0x92, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B1A, { 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x08, 0x09, 0x00, 0x0F, 0x92, 0x00, 0x08, 0x64, 0x80, 0x0F, 0x99, 0x00, 0x0A, 0x66, 0x00, 0x3F, 0xD8, 0x00, 0x09, 0x7F, 0x80, 0x3F, 0x88, 0x00, 0x04, 0x7F, 0x00, 0x09, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x0C, 0xFF, 0x00, 0x31, 0x41, 0x00, 0x06, 0x7F, 0x00, 0x18, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B1B, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3E, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0xC2, 0x00, 0x13, 0x32, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1E, 0xF4, 0x80, 0x10, 0x82, 0x80, 0x3D, 0xF1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B1C, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3F, 0xBF, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x17, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B1F, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x11, 0x03, 0x00, 0x3F, 0xFC, 0x00, 0x09, 0x24, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x48, 0x00, 0x3C, 0x30, 0x00, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B20, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0x98, 0x80, 0x14, 0xC7, 0x00, 0x3B, 0x30, 0x00, 0x0D, 0xEC, 0x00, 0x70, 0x03, 0x80, 0x1F, 0xFE, 0x00, 0x12, 0x92, 0x00, 0x1F, 0xFE, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B22, { 0x00, 0x00, 0x00, 0x1F, 0x82, 0x00, 0x10, 0x0C, 0x00, 0x1F, 0x31, 0x00, 0x10, 0x06, 0x00, 0x7F, 0xD8, 0x80, 0x10, 0x83, 0x00, 0x3F, 0x4C, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x28, 0x91, 0x00, 0x17, 0xF8, 0x00, 0x0C, 0x08, 0x00, 0x77, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B23, { 0x00, 0x00, 0x00, 0x1F, 0x06, 0x00, 0x10, 0x78, 0x00, 0x1E, 0x03, 0x00, 0x10, 0x3C, 0x00, 0x7F, 0x81, 0x80, 0x12, 0x1E, 0x00, 0x3F, 0x04, 0x00, 0x04, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x84, 0x00, 0x1E, 0xF4, 0x00, 0x10, 0x86, 0x80, 0x1E, 0xF2, 0x80, 0x71, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B25, { 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B26, { 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x20, 0x01, 0x00, 0x20, 0x11, 0x00, 0x23, 0x11, 0x00, 0x21, 0x91, 0x00, 0x20, 0x11, 0x00, 0x26, 0x11, 0x00, 0x23, 0x11, 0x00, 0x20, 0x1D, 0x00, 0x21, 0xF1, 0x00, 0x2F, 0x11, 0x00, 0x20, 0x17, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x04, 0x80, 0x3F, 0x1F, 0x80, 0x24, 0x04, 0x80, 0x3F, 0xBF, 0x80, 0x20, 0x40, 0x80, 0x20, 0x40, 0x80, 0x2F, 0xFE, 0x80, 0x20, 0x40, 0x80, 0x23, 0xF8, 0x80, 0x22, 0x48, 0x80, 0x22, 0x48, 0x80, 0x22, 0x58, 0x80, 0x20, 0x40, 0x80, 0x20, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B28, { 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x20, 0x01, 0x00, 0x21, 0x21, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x2F, 0xFD, 0x00, 0x21, 0x21, 0x00, 0x23, 0x31, 0x00, 0x26, 0x19, 0x00, 0x20, 0x01, 0x00, 0x20, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B29, { 0x00, 0x00, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x22, 0x11, 0x00, 0x2F, 0x3D, 0x00, 0x20, 0x01, 0x00, 0x21, 0x81, 0x00, 0x27, 0x39, 0x00, 0x24, 0x09, 0x00, 0x27, 0x39, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x21, 0x00, 0x23, 0x25, 0x00, 0x2E, 0x1D, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x22, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x20, 0x7F, 0x00, 0x2F, 0x89, 0x00, 0x28, 0xA9, 0x00, 0x2F, 0x99, 0x00, 0x28, 0x89, 0x00, 0x25, 0x09, 0x00, 0x3F, 0xD9, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B2B, { 0x00, 0x00, 0x00, 0x5F, 0x3E, 0x80, 0x44, 0x08, 0x80, 0x5F, 0x3E, 0x80, 0x44, 0x08, 0x80, 0x5F, 0x3E, 0x80, 0x40, 0x00, 0x80, 0x4F, 0x90, 0x80, 0x42, 0x1E, 0x80, 0x5F, 0xF4, 0x80, 0x48, 0xA4, 0x80, 0x4F, 0x94, 0x80, 0x48, 0x9C, 0x80, 0x4F, 0x88, 0x80, 0x48, 0x9C, 0x80, 0x4F, 0x96, 0x80, 0x58, 0xB3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B2D, { 0x00, 0x00, 0x00, 0x5F, 0x3E, 0x80, 0x44, 0x08, 0x80, 0x5F, 0x3E, 0x80, 0x44, 0x08, 0x80, 0x5F, 0x3E, 0x80, 0x40, 0x00, 0x80, 0x5F, 0xC6, 0x80, 0x55, 0x5C, 0x80, 0x5D, 0xD0, 0x80, 0x45, 0x1E, 0x80, 0x5D, 0xD4, 0x80, 0x55, 0x54, 0x80, 0x5D, 0xD4, 0x80, 0x45, 0x14, 0x80, 0x47, 0xB4, 0x80, 0x5C, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B2E, { 0x00, 0x00, 0x00, 0x5F, 0x3E, 0x80, 0x44, 0x08, 0x80, 0x5F, 0x3E, 0x80, 0x44, 0x08, 0x80, 0x5F, 0x3E, 0x80, 0x43, 0xE0, 0x80, 0x44, 0x40, 0x80, 0x5F, 0xF8, 0x80, 0x45, 0x48, 0x80, 0x5F, 0xFC, 0x80, 0x45, 0x54, 0x80, 0x5F, 0x6C, 0x80, 0x45, 0x54, 0x80, 0x5F, 0xFC, 0x80, 0x45, 0x02, 0x80, 0x5D, 0xFE, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B2F, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x20, 0x84, 0x00, 0x24, 0x24, 0x00, 0x32, 0x44, 0x00, 0x29, 0x94, 0x00, 0x22, 0x4C, 0x00, 0x2C, 0x24, 0x00, 0x21, 0x04, 0x00, 0x20, 0x84, 0x00, 0x3F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x38, 0x00, 0x1F, 0xE0, 0x00, 0x10, 0x02, 0x00, 0x18, 0x06, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B31, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x09, 0xF2, 0x00, 0x3E, 0x4F, 0x80, 0x0D, 0xF7, 0x00, 0x1B, 0x5A, 0x80, 0x29, 0xF2, 0x00, 0x3F, 0xFF, 0x80, 0x34, 0xA2, 0x80, 0x1B, 0x64, 0x00, 0x12, 0xA9, 0x00, 0x15, 0x62, 0x00, 0x1F, 0xE4, 0x80, 0x11, 0xC9, 0x00, 0x1E, 0x22, 0x00, 0x10, 0x24, 0x00, 0x1F, 0xE8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x21, 0x00, 0x24, 0x3D, 0x00, 0x28, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x20, 0x81, 0x00, 0x20, 0x81, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B33, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x80, 0x17, 0xFC, 0x00, 0x10, 0x80, 0x80, 0x17, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x89, 0x00, 0x25, 0x0F, 0x00, 0x66, 0xF1, 0x00, 0x04, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B34, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x7F, 0x09, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x08, 0x00, 0x22, 0x08, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x7F, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x67, 0x49, 0x00, 0x41, 0x7F, 0x00, 0x5D, 0x49, 0x00, 0x49, 0x49, 0x00, 0x49, 0x49, 0x00, 0x4B, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B35, { 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x24, 0x24, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x14, 0x00, 0x67, 0x67, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x09, 0x00, 0x3B, 0xEF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B37, { 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x55, 0x00, 0x00, 0x49, 0x00, 0x3E, 0x55, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x24, 0x00, 0x7F, 0x64, 0x00, 0x55, 0xD3, 0x80, 0x55, 0x3E, 0x00, 0x67, 0x62, 0x00, 0x41, 0xD6, 0x00, 0x5D, 0x14, 0x00, 0x49, 0x0C, 0x00, 0x49, 0x3B, 0x00, 0x4B, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B39, { 0x00, 0x00, 0x00, 0x08, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x08, 0x7E, 0x00, 0x7F, 0x42, 0x00, 0x14, 0x7E, 0x00, 0x22, 0x24, 0x80, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0x09, 0x00, 0x3B, 0xEF, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B3A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0xC0, 0x00, 0x3E, 0x3E, 0x00, 0x22, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x55, 0x00, 0x00, 0x55, 0xFF, 0x80, 0x67, 0x20, 0x00, 0x41, 0x7F, 0x00, 0x5D, 0xD5, 0x00, 0x49, 0x29, 0x00, 0x49, 0x53, 0x00, 0x4B, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B3B, { 0x00, 0x00, 0x00, 0x7A, 0xAF, 0x00, 0x08, 0x81, 0x00, 0x3B, 0xF7, 0x00, 0x20, 0x84, 0x00, 0x39, 0xC7, 0x00, 0x0A, 0xA1, 0x00, 0x18, 0x83, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2C, 0x1D, 0x00, 0x23, 0xE1, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B3C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x48, 0x00, 0x02, 0x52, 0x00, 0x04, 0x6E, 0x00, 0x04, 0x71, 0x00, 0x08, 0x40, 0x80, 0x10, 0x40, 0x80, 0x20, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B3D, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x08, 0x06, 0x00, 0x3F, 0x8C, 0x00, 0x24, 0x98, 0x00, 0x24, 0xB1, 0x00, 0x3F, 0x83, 0x00, 0x24, 0x86, 0x00, 0x24, 0x8C, 0x00, 0x3F, 0xB8, 0x80, 0x14, 0x01, 0x80, 0x15, 0x03, 0x00, 0x15, 0x06, 0x00, 0x15, 0x5C, 0x00, 0x37, 0xC0, 0x80, 0x24, 0x01, 0x80, 0x63, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B41, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x24, 0x00, 0x3F, 0x94, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0xA4, 0x00, 0x24, 0x94, 0x80, 0x24, 0x85, 0x00, 0x3F, 0x86, 0x00, 0x0A, 0x8C, 0x00, 0x0B, 0x54, 0x00, 0x0B, 0xC4, 0x00, 0x0A, 0x24, 0x80, 0x12, 0x04, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B42, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xC9, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x19, 0x00, 0x17, 0x1A, 0x80, 0x39, 0x2F, 0x80, 0x00, 0x48, 0x00, 0x00, 0x88, 0x80, 0x01, 0x0F, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B43, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x88, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x96, 0x00, 0x0A, 0x52, 0x00, 0x0A, 0xA5, 0x00, 0x0B, 0x68, 0x80, 0x0B, 0x90, 0x00, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x23, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B44, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x10, 0x20, 0x00, 0x3D, 0xFE, 0x00, 0x25, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFE, 0x00, 0x3D, 0x22, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFE, 0x00, 0x24, 0x52, 0x00, 0x24, 0x55, 0x00, 0x3C, 0x9F, 0x80, 0x24, 0x90, 0x00, 0x21, 0x10, 0x80, 0x02, 0x1F, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B45, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0xBF, 0x80, 0x24, 0x86, 0x00, 0x3F, 0x8E, 0x00, 0x0A, 0x0D, 0x00, 0x0A, 0x55, 0x00, 0x0A, 0xA4, 0x80, 0x0B, 0xF4, 0x00, 0x12, 0x00, 0x80, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B47, { 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x50, 0x00, 0x10, 0x4A, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0xA0, 0x00, 0x13, 0x18, 0x00, 0x1C, 0x87, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x44, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x44, 0x00, 0x13, 0xFC, 0x00, 0x20, 0xA0, 0x00, 0x21, 0x29, 0x00, 0x42, 0x21, 0x00, 0x0C, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B48, { 0x00, 0x00, 0x00, 0x08, 0x2A, 0x00, 0x10, 0x6B, 0x00, 0x7F, 0x49, 0x00, 0x49, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x28, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0xC1, 0x00, 0x2F, 0xC1, 0x00, 0x28, 0x47, 0x00, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B49, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x12, 0xFE, 0x00, 0x3F, 0x28, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x08, 0xD6, 0x00, 0x0C, 0x82, 0x00, 0x16, 0x82, 0x00, 0x14, 0x86, 0x00, 0x24, 0x01, 0x00, 0x43, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B4B, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x10, 0x36, 0x00, 0x7F, 0x24, 0x00, 0x49, 0x3F, 0x80, 0x49, 0x64, 0x00, 0x7F, 0xA4, 0x00, 0x49, 0x3F, 0x00, 0x49, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x28, 0x3F, 0x00, 0x2A, 0x24, 0x00, 0x2A, 0xA4, 0x00, 0x2F, 0xA4, 0x00, 0x28, 0x3F, 0x80, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B4C, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x10, 0x22, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x22, 0x00, 0x49, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x49, 0x3E, 0x00, 0x49, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x28, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x94, 0x00, 0x2F, 0xB6, 0x00, 0x28, 0x63, 0x00, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B4D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x55, 0x00, 0x49, 0x55, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x49, 0x00, 0x49, 0x49, 0x00, 0x7F, 0x5F, 0x00, 0x28, 0x51, 0x00, 0x2A, 0x51, 0x00, 0x2A, 0xCD, 0x00, 0x2F, 0xC1, 0x00, 0x28, 0x43, 0x00, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B4E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x08, 0x00, 0x52, 0x08, 0x00, 0x52, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x52, 0xEE, 0x80, 0x52, 0xAA, 0x80, 0x7E, 0xAA, 0x80, 0x28, 0xDD, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x88, 0x80, 0x2E, 0x89, 0x80, 0x28, 0x00, 0x00, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B4F, { 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, 0x1C, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xC9, 0x00, 0x06, 0x49, 0x00, 0x0D, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x24, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0x94, 0x00, 0x09, 0x15, 0x00, 0x11, 0x16, 0x80, 0x1A, 0x17, 0x00, 0x26, 0x24, 0x80, 0x09, 0x27, 0x80, 0x11, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B51, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x10, 0xFF, 0x80, 0x7E, 0x00, 0x00, 0x52, 0x55, 0x00, 0x52, 0x49, 0x00, 0x7E, 0x55, 0x00, 0x52, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x7E, 0x10, 0x00, 0x28, 0xFF, 0x80, 0x2A, 0x90, 0x80, 0x2A, 0xA4, 0x80, 0x2E, 0xBA, 0x80, 0x28, 0x81, 0x80, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B54, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x14, 0x80, 0x10, 0x20, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x20, 0x97, 0x00, 0x23, 0x18, 0x80, 0x2C, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B55, { 0x00, 0x00, 0x00, 0x08, 0x49, 0x00, 0x10, 0xAA, 0x80, 0x7E, 0xEB, 0x80, 0x52, 0x49, 0x00, 0x52, 0x8A, 0x00, 0x7E, 0xAA, 0x80, 0x52, 0xEB, 0x80, 0x52, 0x09, 0x00, 0x7E, 0xFF, 0x80, 0x28, 0x84, 0x00, 0x2A, 0xC4, 0x80, 0x2A, 0xA3, 0x00, 0x2E, 0x86, 0x80, 0x29, 0x39, 0x80, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B56, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x10, 0x1F, 0x00, 0x7E, 0x10, 0x00, 0x52, 0xFF, 0x80, 0x52, 0x90, 0x80, 0x7E, 0x9D, 0x00, 0x52, 0xF0, 0x00, 0x52, 0x8F, 0x00, 0x7E, 0x80, 0x00, 0x28, 0x94, 0x00, 0x2A, 0xD5, 0x00, 0x2A, 0xF7, 0x00, 0x2E, 0x94, 0x00, 0x29, 0x7F, 0x00, 0x6C, 0x00, 0x80, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B57, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x20, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x91, 0x00, 0x00, 0x91, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x91, 0x00, 0x3E, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x28, 0x00, 0x00, 0x2A, 0x00, 0x7F, 0xAA, 0x80, 0x01, 0x2F, 0x80, 0x7F, 0x68, 0x00, 0x55, 0x48, 0x80, 0x73, 0xC7, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B58, { 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0x8A, 0x00, 0x2F, 0x89, 0x00, 0x28, 0xFF, 0x80, 0x2F, 0x94, 0x00, 0x28, 0xB6, 0x00, 0x2F, 0xE3, 0x00, 0x28, 0x81, 0x80, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFC, 0x00, 0x24, 0x44, 0x00, 0x67, 0xFD, 0x00, 0x41, 0x27, 0x00, 0x43, 0x20, 0x80, 0x1E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B5A, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x28, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B5B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0x7F, 0x80, 0x31, 0x08, 0x80, 0x22, 0x08, 0x80, 0x7F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x3F, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x98, 0x80, 0x3F, 0x90, 0x80, 0x00, 0x10, 0x80, 0x2A, 0xB1, 0x80, 0x2A, 0xA1, 0x00, 0x6A, 0x61, 0x00, 0x40, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B5E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x31, 0x08, 0x00, 0x22, 0x08, 0x00, 0x7F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x9C, 0x00, 0x24, 0x94, 0x00, 0x3F, 0x94, 0x00, 0x00, 0x14, 0x00, 0x2A, 0xB6, 0x00, 0x2A, 0xA2, 0x00, 0x6A, 0x63, 0x00, 0x40, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B61, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x10, 0x00, 0x24, 0x3F, 0x80, 0x7F, 0x20, 0x80, 0x29, 0x60, 0x80, 0x29, 0xC0, 0x80, 0x3F, 0x00, 0x80, 0x29, 0x3C, 0x80, 0x29, 0x00, 0x80, 0x3F, 0x00, 0x80, 0x00, 0x00, 0x80, 0x55, 0x00, 0x80, 0x55, 0x01, 0x80, 0x54, 0x01, 0x00, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B63, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x01, 0x00, 0x24, 0x22, 0x00, 0x7F, 0x14, 0x00, 0x29, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x08, 0x80, 0x29, 0x09, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x54, 0x08, 0x00, 0x40, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B65, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFE, 0x00, 0x32, 0x22, 0x00, 0x24, 0x26, 0x00, 0x7F, 0x24, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x3F, 0x71, 0x00, 0x29, 0x53, 0x00, 0x29, 0x5A, 0x00, 0x3F, 0x4E, 0x00, 0x00, 0xC4, 0x00, 0x54, 0x8E, 0x00, 0x55, 0x9A, 0x00, 0x55, 0x33, 0x00, 0x40, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B66, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x2A, 0x00, 0x7F, 0x2A, 0x00, 0x29, 0x6B, 0x00, 0x29, 0xC9, 0x80, 0x3F, 0x08, 0x00, 0x29, 0x09, 0x00, 0x29, 0x09, 0x00, 0x3F, 0x3B, 0x00, 0x00, 0x02, 0x00, 0x55, 0x06, 0x00, 0x55, 0x0C, 0x00, 0x54, 0x18, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B68, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x09, 0x80, 0x32, 0x0F, 0x00, 0x24, 0xF8, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x80, 0x54, 0x09, 0x80, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B6A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x1C, 0x00, 0x32, 0x14, 0x00, 0x24, 0x36, 0x00, 0x7F, 0x63, 0x00, 0x29, 0xE3, 0x80, 0x29, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x55, 0x62, 0x00, 0x55, 0x42, 0x00, 0x54, 0xC2, 0x00, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B6B, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x10, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x38, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x00, 0x28, 0x00, 0x55, 0x68, 0x00, 0x55, 0x48, 0x80, 0x54, 0xC9, 0x80, 0x41, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B6C, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x32, 0x40, 0x00, 0x24, 0x40, 0x00, 0x7F, 0x40, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x51, 0x00, 0x3F, 0x51, 0x00, 0x29, 0x5B, 0x00, 0x29, 0x4A, 0x00, 0x3F, 0x4E, 0x00, 0x00, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x4A, 0x00, 0x54, 0xDB, 0x00, 0x41, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B6D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x00, 0x00, 0x24, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x29, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x24, 0x00, 0x29, 0x24, 0x00, 0x29, 0x24, 0x00, 0x3F, 0x24, 0x00, 0x00, 0x24, 0x00, 0x55, 0x64, 0x00, 0x55, 0x44, 0x80, 0x54, 0xC4, 0x80, 0x41, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B6E, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x32, 0x44, 0x00, 0x24, 0x44, 0x00, 0x7F, 0x44, 0x80, 0x29, 0x45, 0x80, 0x29, 0x77, 0x00, 0x3F, 0x44, 0x00, 0x29, 0x44, 0x00, 0x29, 0x44, 0x00, 0x3F, 0x44, 0x00, 0x00, 0x44, 0x00, 0x55, 0x44, 0x00, 0x55, 0x44, 0x80, 0x54, 0x75, 0x80, 0x41, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B6F, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x42, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x42, 0x00, 0x07, 0xFE, 0x00, 0x01, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B73, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x55, 0x49, 0x00, 0x55, 0x4B, 0x00, 0x54, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B74, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x31, 0x08, 0x00, 0x22, 0x7F, 0x80, 0x7F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x99, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x11, 0x00, 0x2A, 0xB3, 0x00, 0x2A, 0xA2, 0x00, 0x6A, 0x62, 0x00, 0x40, 0xCE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B75, { 0x00, 0x00, 0x00, 0x10, 0x1C, 0x00, 0x1E, 0x04, 0x00, 0x32, 0x24, 0x00, 0x24, 0x66, 0x00, 0x7E, 0x42, 0x00, 0x2A, 0xC3, 0x00, 0x2B, 0x81, 0x80, 0x3E, 0x7E, 0x00, 0x2A, 0x12, 0x00, 0x2A, 0x12, 0x00, 0x3E, 0x12, 0x00, 0x00, 0x32, 0x00, 0x55, 0x22, 0x00, 0x55, 0x66, 0x00, 0x54, 0xC4, 0x00, 0x41, 0x9C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B77, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x1E, 0x13, 0x00, 0x32, 0x11, 0x00, 0x24, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x29, 0x10, 0x00, 0x29, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x29, 0x38, 0x00, 0x29, 0x28, 0x00, 0x3F, 0x28, 0x00, 0x00, 0x28, 0x00, 0x55, 0x68, 0x00, 0x55, 0x48, 0x80, 0x54, 0xC9, 0x80, 0x41, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B78, { 0x00, 0x00, 0x00, 0x10, 0x44, 0x00, 0x1E, 0x44, 0x00, 0x32, 0x44, 0x00, 0x24, 0x44, 0x00, 0x7F, 0x44, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x40, 0x00, 0x3F, 0x40, 0x00, 0x29, 0x7E, 0x00, 0x29, 0x42, 0x00, 0x3F, 0x42, 0x00, 0x00, 0x42, 0x00, 0x55, 0x42, 0x00, 0x55, 0x42, 0x00, 0x54, 0xC2, 0x00, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B79, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x0E, 0x00, 0x32, 0x78, 0x00, 0x24, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x29, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x10, 0x00, 0x00, 0x10, 0x00, 0x55, 0x10, 0x00, 0x55, 0x10, 0x80, 0x54, 0x19, 0x80, 0x40, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B7F, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x1C, 0x00, 0x32, 0x36, 0x00, 0x24, 0x63, 0x00, 0x7F, 0xC1, 0x80, 0x29, 0x3E, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x11, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x11, 0x00, 0x55, 0x11, 0x00, 0x55, 0x17, 0x00, 0x54, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B80, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x40, 0x80, 0x29, 0x40, 0x80, 0x29, 0x20, 0x00, 0x3F, 0x23, 0x00, 0x29, 0x2E, 0x00, 0x29, 0x38, 0x00, 0x3F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x55, 0x20, 0x00, 0x55, 0x20, 0x80, 0x54, 0x31, 0x80, 0x40, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B83, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x08, 0x00, 0x24, 0x2A, 0x00, 0x7F, 0x6B, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x54, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B84, { 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x1E, 0x28, 0x00, 0x32, 0xFF, 0x00, 0x24, 0x29, 0x00, 0x7E, 0x29, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xA8, 0x00, 0x3E, 0xA8, 0x00, 0x2A, 0xA8, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x28, 0x80, 0x00, 0x28, 0x80, 0x55, 0x69, 0x80, 0x55, 0x49, 0x00, 0x54, 0xCB, 0x00, 0x41, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B85, { 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x1E, 0x18, 0x00, 0x32, 0x08, 0x00, 0x24, 0x22, 0x00, 0x7E, 0x22, 0x00, 0x2A, 0x26, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0xAC, 0x00, 0x2A, 0xAB, 0x00, 0x2A, 0xB9, 0x80, 0x3F, 0xB0, 0x80, 0x01, 0x20, 0x00, 0x54, 0x60, 0x00, 0x55, 0xA1, 0x00, 0x55, 0x33, 0x00, 0x40, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B86, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x14, 0x26, 0x00, 0x17, 0xBC, 0x00, 0x14, 0x20, 0x00, 0x14, 0x20, 0x80, 0x1F, 0xB1, 0x80, 0x72, 0x1F, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B87, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x29, 0x2A, 0x00, 0x29, 0x2A, 0x00, 0x3F, 0x2A, 0x00, 0x00, 0x6B, 0x00, 0x55, 0x49, 0x00, 0x55, 0xC9, 0x80, 0x54, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B89, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x00, 0x32, 0x11, 0x00, 0x24, 0x11, 0x00, 0x7F, 0x31, 0x00, 0x29, 0x23, 0x00, 0x29, 0x62, 0x00, 0x3F, 0xC6, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B8A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x18, 0x00, 0x32, 0x10, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x29, 0x41, 0x00, 0x29, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x54, 0x7F, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B8B, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B8D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x48, 0x80, 0x29, 0x49, 0x00, 0x29, 0x48, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x51, 0x00, 0x29, 0x51, 0x00, 0x3F, 0x5B, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x54, 0x9B, 0x00, 0x40, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B8E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x12, 0x08, 0x00, 0x24, 0x0F, 0x80, 0x1F, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x01, 0x41, 0x00, 0x02, 0xC1, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B8F, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x48, 0x00, 0x32, 0x48, 0x00, 0x24, 0x48, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x48, 0x00, 0x29, 0x88, 0x00, 0x3F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x08, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B90, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x30, 0x00, 0x24, 0x21, 0x00, 0x7F, 0x61, 0x00, 0x29, 0x4F, 0x80, 0x29, 0xF8, 0x80, 0x3F, 0x00, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B91, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x1E, 0x40, 0x00, 0x12, 0x7F, 0x00, 0x24, 0x81, 0x00, 0x3F, 0x01, 0x00, 0x2A, 0x7D, 0x00, 0x2A, 0x45, 0x00, 0x3E, 0x45, 0x00, 0x2A, 0x7D, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x47, 0x00, 0x00, 0x40, 0x00, 0x05, 0x40, 0x80, 0x2A, 0xFF, 0x80, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B92, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x32, 0x62, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x5F, 0x80, 0x2A, 0xC2, 0x00, 0x2A, 0xD2, 0x00, 0x3F, 0x5A, 0x00, 0x2A, 0x4A, 0x00, 0x2A, 0x4A, 0x00, 0x3E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x55, 0x42, 0x00, 0x55, 0x42, 0x00, 0x54, 0x42, 0x00, 0x40, 0x4E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B93, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x31, 0x10, 0x00, 0x22, 0x3F, 0x80, 0x7F, 0xA8, 0x00, 0x24, 0xE8, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x88, 0x00, 0x24, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x0F, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B94, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x32, 0x20, 0x00, 0x24, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x29, 0x21, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x20, 0x00, 0x00, 0x20, 0x00, 0x55, 0x20, 0x00, 0x55, 0x20, 0x00, 0x54, 0x7F, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B96, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x10, 0x00, 0x24, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x29, 0x30, 0x00, 0x29, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x61, 0x00, 0x29, 0x61, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0x21, 0x00, 0x55, 0x21, 0x00, 0x55, 0x21, 0x00, 0x54, 0x21, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B97, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x3F, 0x00, 0x24, 0x21, 0x00, 0x7F, 0x63, 0x00, 0x29, 0x16, 0x00, 0x29, 0x0C, 0x00, 0x3F, 0x1E, 0x00, 0x29, 0x33, 0x00, 0x29, 0x61, 0x80, 0x3F, 0x1C, 0x00, 0x00, 0x06, 0x00, 0x55, 0x00, 0x00, 0x55, 0x18, 0x00, 0x54, 0x0E, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B9A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x00, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B9D, { 0x00, 0x00, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1B, 0xE6, 0x00, 0x64, 0x41, 0x80, 0x0F, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9B9E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x24, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x55, 0x00, 0x29, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x29, 0x55, 0x00, 0x29, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x54, 0x55, 0x00, 0x40, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9B9F, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x1F, 0x7F, 0x80, 0x12, 0x40, 0x80, 0x24, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x15, 0x10, 0x00, 0x15, 0xFF, 0x80, 0x1F, 0x11, 0x00, 0x15, 0x22, 0x00, 0x15, 0x32, 0x00, 0x1F, 0x4C, 0x00, 0x00, 0x8C, 0x00, 0x02, 0x92, 0x00, 0x2A, 0x21, 0x00, 0x28, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BA0, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x3F, 0x00, 0x32, 0x62, 0x00, 0x24, 0xC4, 0x00, 0x7F, 0x7F, 0x80, 0x29, 0x40, 0x00, 0x29, 0x40, 0x00, 0x3F, 0x5F, 0x00, 0x29, 0x51, 0x00, 0x29, 0x51, 0x00, 0x3F, 0x51, 0x00, 0x00, 0x53, 0x00, 0x55, 0x50, 0x00, 0x55, 0x50, 0x80, 0x54, 0x99, 0x80, 0x40, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BA6, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x32, 0x40, 0x80, 0x24, 0x40, 0x80, 0x7F, 0x5E, 0x80, 0x29, 0x40, 0x80, 0x29, 0x40, 0x80, 0x3F, 0x5E, 0x80, 0x29, 0x52, 0x80, 0x29, 0x52, 0x80, 0x3F, 0x52, 0x80, 0x00, 0x5E, 0x80, 0x55, 0x40, 0x80, 0x55, 0x40, 0x80, 0x54, 0x40, 0x80, 0x40, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BA7, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x09, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x48, 0x00, 0x29, 0x48, 0x00, 0x29, 0x7F, 0x80, 0x3F, 0x14, 0x80, 0x00, 0x14, 0x80, 0x55, 0x35, 0x80, 0x55, 0x26, 0x00, 0x54, 0x63, 0x00, 0x40, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BA8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x23, 0x00, 0x32, 0x3E, 0x00, 0x24, 0x20, 0x00, 0x7F, 0x20, 0x80, 0x29, 0x31, 0x80, 0x29, 0x1F, 0x00, 0x3F, 0x00, 0x00, 0x29, 0x00, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x54, 0x21, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BA9, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x1E, 0x63, 0x00, 0x32, 0x22, 0x00, 0x24, 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x55, 0x62, 0x00, 0x55, 0x42, 0x00, 0x54, 0xC2, 0x00, 0x41, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BAA, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x61, 0x00, 0x3F, 0xA1, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x55, 0x21, 0x00, 0x54, 0x21, 0x00, 0x40, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BAB, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x12, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x1F, 0x12, 0x00, 0x15, 0x21, 0x00, 0x15, 0x42, 0x80, 0x1F, 0x12, 0x00, 0x15, 0x0C, 0x00, 0x15, 0x04, 0x00, 0x1F, 0x0A, 0x00, 0x00, 0x92, 0x00, 0x0A, 0xA1, 0x00, 0x2A, 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BAC, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x14, 0x00, 0x7F, 0x22, 0x00, 0x29, 0xC1, 0x80, 0x29, 0x3E, 0x00, 0x3F, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x10, 0x00, 0x3F, 0x20, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x01, 0x00, 0x55, 0x01, 0x00, 0x54, 0x03, 0x00, 0x40, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BAD, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x29, 0x08, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x6A, 0x08, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BAE, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x22, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x14, 0x00, 0x24, 0xFF, 0x80, 0x1F, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x02, 0x88, 0x00, 0x2A, 0x88, 0x00, 0x28, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BB0, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x32, 0x40, 0x80, 0x24, 0x40, 0x80, 0x7F, 0x5E, 0x80, 0x29, 0x52, 0x80, 0x29, 0x52, 0x80, 0x3F, 0x52, 0x80, 0x29, 0x52, 0x80, 0x29, 0x52, 0x80, 0x3F, 0x5E, 0x80, 0x00, 0x40, 0x80, 0x55, 0x40, 0x80, 0x55, 0x40, 0x80, 0x54, 0x7F, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BB1, { 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x1E, 0x11, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x11, 0x00, 0x7F, 0x13, 0x00, 0x29, 0x12, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x29, 0x18, 0x00, 0x29, 0x33, 0x00, 0x3F, 0x7E, 0x00, 0x00, 0xD0, 0x00, 0x55, 0x10, 0x00, 0x55, 0x10, 0x80, 0x54, 0x19, 0x80, 0x40, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BB2, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x1E, 0x25, 0x00, 0x32, 0x25, 0x80, 0x24, 0x64, 0x80, 0x7E, 0x44, 0x00, 0x2A, 0xFF, 0x80, 0x2B, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x4E, 0x00, 0x3E, 0x4A, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5B, 0x00, 0x54, 0x51, 0x00, 0x40, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BB4, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x32, 0x64, 0x00, 0x24, 0x44, 0x00, 0x7E, 0xFF, 0x80, 0x2B, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x4E, 0x00, 0x2A, 0x4E, 0x00, 0x2A, 0x55, 0x00, 0x3E, 0x55, 0x00, 0x00, 0x64, 0x80, 0x55, 0x44, 0x00, 0x55, 0x44, 0x00, 0x54, 0x44, 0x00, 0x40, 0x44, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BB7, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x24, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x09, 0x00, 0x7F, 0x09, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x48, 0x00, 0x3F, 0x48, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x18, 0x80, 0x3F, 0x18, 0x80, 0x00, 0x29, 0x80, 0x55, 0x69, 0x00, 0x55, 0x4B, 0x00, 0x54, 0x88, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BB8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x3E, 0x00, 0x32, 0x22, 0x00, 0x24, 0x66, 0x00, 0x7F, 0x44, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x59, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x34, 0x00, 0x00, 0x24, 0x00, 0x55, 0x64, 0x00, 0x55, 0x44, 0x80, 0x54, 0xC4, 0x80, 0x41, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BB9, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x49, 0x00, 0x32, 0xC9, 0x80, 0x24, 0x88, 0x80, 0x7F, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BBB, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x62, 0x00, 0x32, 0x42, 0x00, 0x24, 0xFF, 0x00, 0x7F, 0x25, 0x00, 0x29, 0x24, 0x00, 0x29, 0x47, 0x80, 0x3F, 0xA0, 0x00, 0x29, 0x3E, 0x00, 0x29, 0x62, 0x00, 0x3F, 0xC6, 0x00, 0x00, 0x2C, 0x00, 0x55, 0x18, 0x00, 0x55, 0x3C, 0x00, 0x54, 0x66, 0x00, 0x41, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BBC, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x3F, 0x00, 0x32, 0x01, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x01, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x29, 0x40, 0x80, 0x29, 0x3F, 0x00, 0x3F, 0x11, 0x00, 0x00, 0x1B, 0x00, 0x55, 0x0E, 0x00, 0x55, 0x0C, 0x00, 0x54, 0x1B, 0x00, 0x40, 0x71, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BBE, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x0E, 0x00, 0x32, 0x78, 0x00, 0x24, 0x12, 0x00, 0x7F, 0x5B, 0x00, 0x29, 0x49, 0x80, 0x29, 0x40, 0x80, 0x3F, 0x10, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x12, 0x00, 0x3F, 0x32, 0x00, 0x00, 0x26, 0x00, 0x55, 0x74, 0x00, 0x55, 0x1E, 0x00, 0x54, 0x33, 0x00, 0x40, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BBF, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x32, 0x54, 0x00, 0x24, 0x54, 0x00, 0x7E, 0x74, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x74, 0x00, 0x2A, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x00, 0x54, 0x00, 0x55, 0x74, 0x00, 0x55, 0xD4, 0x80, 0x54, 0x14, 0x80, 0x40, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BC0, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x7E, 0x00, 0x32, 0x10, 0x00, 0x24, 0x32, 0x00, 0x7F, 0x66, 0x00, 0x29, 0x3C, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x11, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x08, 0x80, 0x3F, 0x08, 0x00, 0x00, 0x2A, 0x00, 0x55, 0x2A, 0x00, 0x55, 0x6B, 0x00, 0x54, 0xC9, 0x80, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BC1, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x49, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x28, 0x00, 0x55, 0x18, 0x00, 0x55, 0x1C, 0x00, 0x54, 0x36, 0x00, 0x40, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BC6, { 0x00, 0x00, 0x00, 0x10, 0x0A, 0x00, 0x1E, 0x09, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BC7, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x7E, 0x80, 0x80, 0x2A, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x00, 0x24, 0x00, 0x55, 0x64, 0x00, 0x55, 0x44, 0x80, 0x54, 0xC4, 0x80, 0x41, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BC8, { 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0C, 0xFF, 0x80, 0x08, 0x86, 0x00, 0x19, 0x6C, 0x00, 0x14, 0x38, 0x00, 0x34, 0x6E, 0x00, 0x55, 0xC3, 0x80, 0x14, 0x3C, 0x00, 0x14, 0x48, 0x00, 0x15, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x91, 0x00, 0x10, 0xFF, 0x00, 0x11, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BC9, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x0F, 0x49, 0x00, 0x12, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x1F, 0x49, 0x00, 0x15, 0x49, 0x00, 0x15, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x15, 0x08, 0x00, 0x15, 0x08, 0x00, 0x1F, 0x7F, 0x00, 0x01, 0x08, 0x00, 0x0A, 0x88, 0x00, 0x2A, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BCA, { 0x00, 0x00, 0x00, 0x18, 0x10, 0x00, 0x0C, 0x54, 0x00, 0x60, 0xD7, 0x00, 0x31, 0xB1, 0x80, 0x0C, 0x0E, 0x00, 0x39, 0xF8, 0x00, 0x60, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BCE, { 0x00, 0x00, 0x00, 0x10, 0x05, 0x00, 0x1E, 0x04, 0x80, 0x32, 0x04, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x44, 0x00, 0x29, 0x44, 0x00, 0x29, 0x44, 0x00, 0x3F, 0x7D, 0x00, 0x29, 0x55, 0x00, 0x29, 0x55, 0x00, 0x3F, 0x56, 0x00, 0x00, 0x52, 0x00, 0x55, 0x72, 0x00, 0x55, 0x46, 0x80, 0x54, 0x4B, 0x80, 0x40, 0x91, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BCF, { 0x00, 0x00, 0x00, 0x10, 0x09, 0x00, 0x1E, 0x39, 0x00, 0x32, 0xE5, 0x00, 0x24, 0x25, 0x00, 0x7E, 0x25, 0x00, 0x2A, 0xFD, 0x00, 0x2A, 0x25, 0x00, 0x3E, 0x25, 0x00, 0x2A, 0x75, 0x00, 0x2A, 0x6D, 0x00, 0x3E, 0xA5, 0x00, 0x00, 0x25, 0x00, 0x55, 0x21, 0x00, 0x55, 0x21, 0x00, 0x54, 0x21, 0x00, 0x40, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BD0, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x29, 0x08, 0x00, 0x29, 0x48, 0x00, 0x3F, 0x4F, 0x00, 0x00, 0x48, 0x00, 0x55, 0x48, 0x00, 0x55, 0x68, 0x00, 0x54, 0xB8, 0x00, 0x41, 0x8F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BD1, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1E, 0x64, 0x00, 0x32, 0x18, 0x00, 0x24, 0x66, 0x00, 0x7F, 0x10, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x3F, 0x28, 0x00, 0x29, 0x7F, 0x00, 0x29, 0xC9, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x49, 0x00, 0x55, 0x49, 0x00, 0x55, 0x4B, 0x00, 0x54, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BD2, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x02, 0x00, 0x24, 0x34, 0x00, 0x7F, 0x08, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BD4, { 0x00, 0x00, 0x00, 0x10, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x32, 0x92, 0x00, 0x24, 0x92, 0x00, 0x7E, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BD6, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x24, 0x7F, 0x00, 0x1F, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x1F, 0x7F, 0x00, 0x01, 0x41, 0x00, 0x0A, 0xC1, 0x00, 0x2A, 0x41, 0x00, 0x20, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BD7, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1B, 0xE6, 0x00, 0x64, 0x41, 0x80, 0x0F, 0xFC, 0x00, 0x18, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BD8, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x7E, 0x00, 0x32, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x7F, 0x2A, 0x00, 0x29, 0x2A, 0x00, 0x29, 0x6B, 0x00, 0x3F, 0xC9, 0x80, 0x29, 0x08, 0x00, 0x29, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x55, 0x46, 0x00, 0x55, 0x7C, 0x00, 0x54, 0x16, 0x00, 0x40, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BDB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x3F, 0x80, 0x32, 0x20, 0x80, 0x24, 0x24, 0x80, 0x7F, 0x2E, 0x80, 0x29, 0x24, 0x80, 0x29, 0x24, 0x80, 0x3F, 0x2E, 0x80, 0x29, 0x20, 0x80, 0x29, 0x2E, 0x80, 0x3F, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x2A, 0xAE, 0x80, 0x2A, 0xA0, 0x80, 0x6A, 0x20, 0x80, 0x40, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BDD, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x32, 0x40, 0x80, 0x24, 0x48, 0x80, 0x7F, 0x48, 0x80, 0x29, 0x7F, 0x80, 0x29, 0x48, 0x80, 0x3F, 0x48, 0x80, 0x29, 0x5E, 0x80, 0x29, 0x52, 0x80, 0x3F, 0x52, 0x80, 0x00, 0x52, 0x80, 0x55, 0x5E, 0x80, 0x55, 0x40, 0x80, 0x54, 0x7F, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BDF, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x55, 0x6B, 0x00, 0x55, 0x49, 0x00, 0x54, 0xC9, 0x80, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BE1, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x1E, 0x12, 0x00, 0x32, 0x12, 0x00, 0x24, 0x73, 0x80, 0x7F, 0x12, 0x00, 0x29, 0x12, 0x00, 0x29, 0x12, 0x00, 0x3F, 0x73, 0x80, 0x29, 0x12, 0x00, 0x29, 0x12, 0x00, 0x3F, 0x32, 0x00, 0x00, 0x53, 0x80, 0x55, 0x12, 0x00, 0x55, 0x32, 0x00, 0x54, 0x22, 0x00, 0x40, 0x62, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BE2, { 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x1E, 0x67, 0x00, 0x32, 0x41, 0x00, 0x24, 0x41, 0x00, 0x7E, 0x77, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x24, 0x00, 0x3E, 0x24, 0x00, 0x00, 0x24, 0x00, 0x55, 0x24, 0x00, 0x55, 0x64, 0x80, 0x54, 0x44, 0x80, 0x40, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BE3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7E, 0x00, 0x32, 0x42, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0xCA, 0x80, 0x00, 0x12, 0x80, 0x55, 0x24, 0x80, 0x55, 0x49, 0x80, 0x54, 0x11, 0x00, 0x40, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BE4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x15, 0x44, 0x00, 0x1F, 0x44, 0x80, 0x15, 0x7D, 0x00, 0x15, 0x46, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0xC4, 0x80, 0x0A, 0x5C, 0x80, 0x2A, 0xE7, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BE5, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x22, 0x00, 0x3F, 0x22, 0x00, 0x29, 0xC3, 0x80, 0x29, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BE7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x3F, 0x00, 0x32, 0x21, 0x00, 0x24, 0x21, 0x00, 0x7F, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x29, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x80, 0x3F, 0x40, 0x80, 0x00, 0x40, 0x80, 0x55, 0x7F, 0x80, 0x55, 0x40, 0x80, 0x54, 0x40, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BE8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0F, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x22, 0x00, 0x00, 0x1F, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x15, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x08, 0x00, 0x1F, 0x2A, 0x00, 0x00, 0xA9, 0x00, 0x0A, 0xA9, 0x00, 0x2A, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BEA, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x3F, 0x43, 0x80, 0x29, 0x90, 0x00, 0x29, 0x1F, 0x00, 0x3F, 0x31, 0x00, 0x00, 0x63, 0x00, 0x55, 0xD6, 0x00, 0x55, 0x1C, 0x00, 0x54, 0x36, 0x00, 0x40, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BEB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x32, 0xAF, 0x00, 0x24, 0xA1, 0x00, 0x7E, 0xE9, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xAB, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xEA, 0x00, 0x2A, 0xAE, 0x00, 0x3E, 0xA4, 0x00, 0x00, 0xA4, 0x00, 0x2A, 0xEE, 0x00, 0x2B, 0xAA, 0x00, 0x6A, 0x2B, 0x00, 0x40, 0x29, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BEF, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x80, 0x1E, 0xA2, 0x80, 0x32, 0xA2, 0x80, 0x24, 0xFA, 0x80, 0x7F, 0x22, 0x80, 0x2A, 0x22, 0x80, 0x2B, 0xFE, 0x80, 0x3E, 0x22, 0x80, 0x2A, 0x22, 0x80, 0x2A, 0xFA, 0x80, 0x3E, 0xAA, 0x80, 0x00, 0xAA, 0x80, 0x2A, 0xA8, 0x80, 0x2A, 0xA8, 0x80, 0x6A, 0xB8, 0x80, 0x40, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BF0, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x1C, 0x00, 0x32, 0x36, 0x00, 0x24, 0x63, 0x00, 0x7E, 0xDD, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x02, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0x0C, 0x00, 0x00, 0x14, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x80, 0x54, 0x52, 0x80, 0x40, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BF1, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x0F, 0x00, 0x32, 0x08, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x48, 0x80, 0x29, 0x4E, 0x00, 0x29, 0x78, 0x00, 0x3F, 0x48, 0x80, 0x29, 0x47, 0x80, 0x29, 0x40, 0x00, 0x3F, 0x4A, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5A, 0x80, 0x54, 0x92, 0x80, 0x40, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BF2, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x42, 0x00, 0x32, 0x47, 0x00, 0x25, 0xF5, 0x00, 0x7E, 0x45, 0x00, 0x2A, 0x4D, 0x80, 0x2A, 0x48, 0x80, 0x3E, 0x70, 0x00, 0x2A, 0x56, 0x00, 0x2A, 0x53, 0x00, 0x3E, 0x51, 0x00, 0x00, 0x50, 0x00, 0x2A, 0xD0, 0x00, 0x2A, 0x96, 0x00, 0x6A, 0x93, 0x00, 0x41, 0xB1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BF3, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x80, 0x24, 0x40, 0x00, 0x7F, 0x43, 0x00, 0x29, 0x5E, 0x00, 0x29, 0x54, 0x00, 0x3F, 0x54, 0x00, 0x29, 0x5F, 0x80, 0x29, 0x52, 0x00, 0x3F, 0x52, 0x00, 0x00, 0x5A, 0x00, 0x55, 0x73, 0x00, 0x55, 0x41, 0x00, 0x54, 0xDD, 0x80, 0x41, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BF5, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x32, 0x00, 0x32, 0x23, 0x00, 0x24, 0x7D, 0x00, 0x7F, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x14, 0x00, 0x3F, 0x22, 0x00, 0x29, 0xC9, 0x80, 0x29, 0x10, 0x00, 0x3F, 0x62, 0x00, 0x00, 0x0C, 0x00, 0x2A, 0xB0, 0x80, 0x2A, 0x83, 0x00, 0x6A, 0x0C, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BF7, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x32, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x08, 0x00, 0x3F, 0x48, 0x00, 0x00, 0x4F, 0x00, 0x55, 0x48, 0x00, 0x55, 0x68, 0x00, 0x54, 0xB8, 0x00, 0x41, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BF8, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x1E, 0x5F, 0x00, 0x32, 0x41, 0x00, 0x24, 0xC1, 0x00, 0x7E, 0xBF, 0x80, 0x2A, 0x90, 0x00, 0x2B, 0x90, 0x00, 0x3E, 0x9F, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0x84, 0x00, 0x3E, 0xFF, 0x80, 0x00, 0x84, 0x00, 0x2A, 0x8E, 0x00, 0x2A, 0x8A, 0x00, 0x6A, 0x9B, 0x00, 0x40, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BF9, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x29, 0x28, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x48, 0x00, 0x00, 0x08, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x54, 0x08, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9BFA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x11, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x12, 0x00, 0x7F, 0x12, 0x00, 0x29, 0x14, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x08, 0x00, 0x29, 0x14, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0xE1, 0x00, 0x00, 0x21, 0x00, 0x55, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x54, 0x21, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BFD, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x1E, 0xF7, 0x80, 0x32, 0x94, 0x80, 0x24, 0x94, 0x80, 0x7E, 0xF4, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x2A, 0xF4, 0x80, 0x2A, 0x04, 0x80, 0x3E, 0x94, 0x80, 0x00, 0xE4, 0x80, 0x2A, 0x85, 0x80, 0x2A, 0x84, 0x00, 0x6A, 0x94, 0x00, 0x40, 0xF4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9BFF, { 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x1E, 0x7C, 0x00, 0x32, 0x40, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x40, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x55, 0x00, 0x3F, 0x55, 0x00, 0x00, 0x7F, 0x00, 0x55, 0xD5, 0x00, 0x55, 0x55, 0x00, 0x54, 0x55, 0x00, 0x40, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C00, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x0E, 0x00, 0x32, 0xFA, 0x00, 0x24, 0x51, 0x00, 0x7F, 0x89, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x76, 0x00, 0x55, 0xD4, 0x00, 0x55, 0x1C, 0x00, 0x54, 0x36, 0x00, 0x40, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C02, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x1E, 0xF4, 0x80, 0x32, 0x94, 0x80, 0x24, 0x94, 0x80, 0x7E, 0xF4, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x2A, 0xF4, 0x80, 0x2A, 0x94, 0x80, 0x3E, 0x94, 0x80, 0x00, 0x94, 0x80, 0x2A, 0xF0, 0x80, 0x2A, 0x50, 0x80, 0x6A, 0xD8, 0x80, 0x41, 0x8B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C04, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x80, 0x1E, 0x02, 0x80, 0x32, 0x02, 0x00, 0x24, 0xFF, 0x80, 0x7E, 0x82, 0x00, 0x2A, 0xBA, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0x92, 0x80, 0x2A, 0xFE, 0x80, 0x2A, 0xAB, 0x00, 0x3E, 0xAB, 0x00, 0x00, 0xBA, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xAA, 0x80, 0x6A, 0x87, 0x80, 0x41, 0x09, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C06, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0xBE, 0x80, 0x3E, 0x22, 0x00, 0x00, 0x22, 0x00, 0x55, 0x3E, 0x00, 0x55, 0x22, 0x00, 0x54, 0x22, 0x00, 0x40, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C08, { 0x00, 0x00, 0x00, 0x10, 0x4A, 0x00, 0x1E, 0x4A, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x4A, 0x00, 0x7E, 0x4A, 0x00, 0x2A, 0x4E, 0x00, 0x2A, 0x40, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x55, 0x6B, 0x00, 0x55, 0x49, 0x00, 0x54, 0xC9, 0x80, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C09, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x29, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C0A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x6B, 0x00, 0x3E, 0x5D, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x55, 0x6B, 0x00, 0x55, 0x49, 0x00, 0x54, 0xC9, 0x80, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C0B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x80, 0x00, 0x24, 0xBF, 0x00, 0x7E, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x3E, 0xBF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0x92, 0x00, 0x00, 0xB6, 0x00, 0x55, 0x8C, 0x00, 0x55, 0xB7, 0x00, 0x54, 0x80, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C0C, { 0x00, 0x00, 0x00, 0x10, 0x2E, 0x00, 0x1E, 0x63, 0x00, 0x32, 0xC1, 0x80, 0x24, 0xBE, 0x80, 0x7E, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x55, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x57, 0x00, 0x3E, 0x61, 0x00, 0x00, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C0D, { 0x00, 0x00, 0x00, 0x08, 0x1A, 0x00, 0x0E, 0xE2, 0x00, 0x12, 0x22, 0x00, 0x24, 0x22, 0x00, 0x3F, 0xFE, 0x80, 0x2A, 0x2B, 0x00, 0x2A, 0x2A, 0x00, 0x3E, 0x72, 0x00, 0x2A, 0x6A, 0x00, 0x2A, 0xA2, 0x00, 0x3E, 0x22, 0x00, 0x00, 0x25, 0x00, 0x01, 0x25, 0x00, 0x22, 0xA5, 0x00, 0x2A, 0x28, 0x80, 0x28, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C0F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x80, 0x32, 0x00, 0x00, 0x24, 0x3F, 0x00, 0x7F, 0x21, 0x00, 0x29, 0x21, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x80, 0x3F, 0x48, 0x80, 0x00, 0x48, 0x80, 0x55, 0x7F, 0x80, 0x55, 0x48, 0x80, 0x54, 0x48, 0x80, 0x40, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C10, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x73, 0x80, 0x1E, 0x52, 0x80, 0x12, 0x52, 0x80, 0x24, 0x73, 0x80, 0x1F, 0x00, 0x00, 0x15, 0x3F, 0x00, 0x15, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x10, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x20, 0x80, 0x02, 0x80, 0x80, 0x2A, 0x81, 0x00, 0x28, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C11, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x32, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x7F, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x00, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0xD4, 0x80, 0x55, 0x24, 0x80, 0x55, 0x49, 0x80, 0x54, 0x11, 0x00, 0x40, 0x67, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C12, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0F, 0x3F, 0x80, 0x09, 0x40, 0x00, 0x12, 0xBF, 0x00, 0x24, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x15, 0x21, 0x00, 0x15, 0x3F, 0x00, 0x1F, 0x08, 0x00, 0x15, 0x1F, 0x80, 0x15, 0x21, 0x00, 0x1F, 0xD2, 0x00, 0x00, 0x8C, 0x00, 0x2A, 0x96, 0x00, 0x2A, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C13, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x49, 0x00, 0x24, 0x49, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x3F, 0x0C, 0x00, 0x00, 0x14, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x80, 0x54, 0x52, 0x80, 0x40, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C14, { 0x00, 0x00, 0x00, 0x20, 0x05, 0x00, 0x3C, 0x04, 0x80, 0x64, 0x04, 0x00, 0x09, 0xFF, 0x80, 0x7D, 0x04, 0x00, 0x55, 0x04, 0x00, 0x55, 0x74, 0x80, 0x7D, 0x04, 0x80, 0x55, 0x75, 0x80, 0x55, 0x55, 0x00, 0x7D, 0x57, 0x00, 0x01, 0x72, 0x00, 0x55, 0x02, 0x00, 0x55, 0x06, 0x80, 0x51, 0x0B, 0x80, 0x42, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C15, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x00, 0x1E, 0x91, 0x00, 0x12, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3E, 0xF7, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x80, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x8A, 0x00, 0x3E, 0x84, 0x00, 0x02, 0xF4, 0x00, 0x15, 0x8A, 0x00, 0x2A, 0x91, 0x00, 0x20, 0xA0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C16, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x20, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x20, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0xC4, 0x00, 0x29, 0x3F, 0x80, 0x3F, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C18, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x7F, 0x80, 0x80, 0x29, 0x7F, 0x00, 0x29, 0x10, 0x00, 0x3F, 0x22, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x09, 0x00, 0x3F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C19, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x1E, 0x22, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x29, 0x10, 0x00, 0x29, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x29, 0x20, 0x00, 0x29, 0x20, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0xE0, 0x80, 0x55, 0xA0, 0x80, 0x55, 0x20, 0x80, 0x54, 0x20, 0x80, 0x40, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C1A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x7F, 0xBE, 0x80, 0x29, 0x00, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x22, 0x00, 0x29, 0x22, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x22, 0x00, 0x55, 0x3E, 0x00, 0x55, 0x00, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C1B, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x32, 0x22, 0x00, 0x24, 0x22, 0x00, 0x7F, 0x3E, 0x00, 0x29, 0x22, 0x00, 0x29, 0x22, 0x00, 0x3F, 0x3E, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C1C, { 0x00, 0x00, 0x00, 0x10, 0x12, 0x00, 0x1E, 0x24, 0x00, 0x33, 0xFF, 0x80, 0x24, 0x28, 0x00, 0x7E, 0xFF, 0x00, 0x2A, 0x29, 0x00, 0x2A, 0x29, 0x00, 0x3F, 0xFF, 0x80, 0x2A, 0x29, 0x00, 0x2A, 0x29, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x2C, 0x00, 0x55, 0x6A, 0x00, 0x55, 0xAB, 0x00, 0x55, 0x29, 0x80, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C1E, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x7F, 0x41, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x40, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x55, 0x2A, 0x80, 0x55, 0x6A, 0x80, 0x54, 0x41, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C21, { 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x1E, 0xE7, 0x80, 0x32, 0x82, 0x80, 0x24, 0x82, 0x80, 0x7E, 0xA2, 0x80, 0x2A, 0xA2, 0x80, 0x2A, 0xF4, 0x80, 0x3F, 0x91, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C22, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x48, 0x00, 0x24, 0x48, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x48, 0x00, 0x29, 0x48, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x48, 0x00, 0x29, 0x48, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x55, 0x2A, 0x80, 0x55, 0x6A, 0x80, 0x54, 0x41, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C23, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1E, 0xE4, 0x00, 0x32, 0xBF, 0x80, 0x24, 0xA4, 0x00, 0x7E, 0xA4, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x80, 0x3E, 0xA1, 0x00, 0x00, 0xA9, 0x00, 0x55, 0xED, 0x00, 0x55, 0x05, 0x00, 0x54, 0x01, 0x00, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C24, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x4F, 0x80, 0x32, 0xE2, 0x00, 0x24, 0xA2, 0x00, 0x7E, 0xAF, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xEA, 0x80, 0x3E, 0x8A, 0x80, 0x2A, 0x8A, 0x80, 0x2A, 0xEA, 0x80, 0x3E, 0xAA, 0x80, 0x00, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAB, 0x80, 0x6A, 0xE2, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C25, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0F, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x12, 0x55, 0x00, 0x24, 0x55, 0x00, 0x1F, 0xFF, 0x80, 0x15, 0x08, 0x00, 0x15, 0x28, 0x80, 0x1F, 0x29, 0x00, 0x15, 0x4C, 0x00, 0x15, 0x8C, 0x00, 0x1F, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x0A, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C26, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xFF, 0x80, 0x32, 0x42, 0x00, 0x24, 0x00, 0x00, 0x7E, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x84, 0x00, 0x3E, 0x84, 0x00, 0x2B, 0x29, 0x00, 0x2A, 0xA5, 0x00, 0x3E, 0x42, 0x00, 0x00, 0x42, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x6A, 0xF7, 0x80, 0x40, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C27, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0xA4, 0x00, 0x25, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x48, 0x00, 0x37, 0xFF, 0x80, 0x2C, 0x44, 0x00, 0x24, 0xC4, 0x00, 0x24, 0xBE, 0x00, 0x35, 0x4B, 0x00, 0x2F, 0xFD, 0x80, 0x24, 0xA4, 0x00, 0x24, 0xFC, 0x00, 0x24, 0xA4, 0x00, 0x64, 0xFC, 0x00, 0x4D, 0x2A, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C28, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x24, 0x5D, 0x00, 0x7E, 0x41, 0x00, 0x2A, 0x5D, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xF7, 0x80, 0x2A, 0x31, 0x80, 0x2A, 0x52, 0x80, 0x3E, 0x94, 0x80, 0x00, 0x31, 0x80, 0x55, 0x52, 0x80, 0x55, 0x94, 0x80, 0x54, 0x10, 0x80, 0x40, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C29, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x1F, 0x00, 0x32, 0x31, 0x00, 0x24, 0xEB, 0x00, 0x7F, 0x16, 0x00, 0x29, 0x0C, 0x00, 0x29, 0x38, 0x00, 0x3F, 0xE0, 0x00, 0x29, 0x3F, 0x00, 0x29, 0x48, 0x00, 0x3F, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C2A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x3E, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x10, 0x00, 0x29, 0x32, 0x00, 0x3F, 0x27, 0x00, 0x29, 0x7D, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x54, 0x55, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C2D, { 0x00, 0x00, 0x00, 0x10, 0x11, 0x00, 0x1E, 0x13, 0x00, 0x32, 0x7E, 0x00, 0x24, 0x14, 0x00, 0x7E, 0xFF, 0x80, 0x2A, 0x10, 0x00, 0x2A, 0x23, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x20, 0x80, 0x2A, 0x1F, 0x80, 0x3E, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x55, 0x21, 0x00, 0x55, 0x3F, 0x00, 0x54, 0x21, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C2E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x49, 0x00, 0x24, 0x49, 0x00, 0x7F, 0x5D, 0x00, 0x29, 0x55, 0x00, 0x29, 0x63, 0x00, 0x3F, 0x7F, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x54, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C2F, { 0x00, 0x00, 0x00, 0x10, 0xF7, 0x80, 0x1E, 0x10, 0x80, 0x32, 0x10, 0x80, 0x24, 0xF7, 0x80, 0x7E, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0xF7, 0x80, 0x3E, 0x10, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0x52, 0x80, 0x3E, 0x10, 0x80, 0x00, 0xB1, 0x80, 0x2A, 0xD2, 0x80, 0x2A, 0x94, 0x80, 0x6A, 0x31, 0x80, 0x40, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C30, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1E, 0xE2, 0x00, 0x32, 0x02, 0x00, 0x24, 0x0F, 0x80, 0x7E, 0x0A, 0x80, 0x2B, 0xFA, 0x80, 0x2A, 0x4A, 0x80, 0x3E, 0x4F, 0x80, 0x2A, 0xEA, 0x80, 0x2A, 0xEA, 0x80, 0x3F, 0x5A, 0x80, 0x00, 0x4F, 0x80, 0x55, 0x42, 0x00, 0x55, 0x42, 0x00, 0x54, 0x42, 0x00, 0x40, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C31, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1C, 0x04, 0x00, 0x34, 0xBF, 0x80, 0x28, 0xC4, 0x00, 0x7E, 0x5F, 0x00, 0x2A, 0x95, 0x00, 0x2A, 0xD5, 0x00, 0x3E, 0x5F, 0x00, 0x2A, 0x15, 0x00, 0x2B, 0xD5, 0x00, 0x3E, 0x5F, 0x00, 0x00, 0x44, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0xC4, 0x00, 0x6A, 0xA4, 0x00, 0x41, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C32, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x08, 0x62, 0x00, 0x3F, 0x54, 0x00, 0x09, 0x8C, 0x00, 0x11, 0x13, 0x80, 0x27, 0xF0, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x1F, 0xFE, 0x00, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C35, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x55, 0x3F, 0x80, 0x7F, 0xE2, 0x00, 0x29, 0x14, 0x00, 0x3F, 0x88, 0x00, 0x02, 0x16, 0x00, 0x07, 0xE1, 0x80, 0x08, 0x40, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C36, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x1E, 0xEF, 0x00, 0x32, 0x91, 0x00, 0x25, 0x53, 0x00, 0x7E, 0xAA, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x82, 0x00, 0x3F, 0x7D, 0x80, 0x2A, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x2A, 0x52, 0x00, 0x2A, 0xD3, 0x00, 0x6B, 0x91, 0x80, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C37, { 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x1C, 0x90, 0x00, 0x34, 0x9F, 0x80, 0x29, 0xB1, 0x00, 0x7D, 0x2B, 0x00, 0x55, 0x4E, 0x00, 0x57, 0x44, 0x00, 0x7D, 0x5E, 0x00, 0x55, 0x73, 0x80, 0x55, 0x44, 0x00, 0x7D, 0x7F, 0x80, 0x01, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x55, 0x00, 0x51, 0x24, 0x80, 0x41, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C39, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xF0, 0x00, 0x32, 0xAF, 0x00, 0x24, 0xA5, 0x00, 0x7E, 0xF5, 0x00, 0x2A, 0x97, 0x00, 0x2A, 0xF2, 0x00, 0x3E, 0xA7, 0x00, 0x2A, 0xAD, 0x00, 0x2A, 0xF1, 0x80, 0x3E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x08, 0x00, 0x55, 0x08, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C3A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x24, 0x00, 0x32, 0x3C, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x94, 0x80, 0x2A, 0xF7, 0x80, 0x2A, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0xC9, 0x80, 0x3E, 0x10, 0x00, 0x00, 0x64, 0x00, 0x55, 0x19, 0x00, 0x55, 0x63, 0x00, 0x54, 0x0E, 0x00, 0x40, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C3B, { 0x00, 0x00, 0x00, 0x08, 0x3F, 0x00, 0x0F, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x24, 0x3F, 0x00, 0x1F, 0x00, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x52, 0x80, 0x1F, 0x7F, 0x80, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x80, 0x1F, 0x11, 0x00, 0x00, 0x8A, 0x00, 0x0A, 0x84, 0x00, 0x2A, 0x1A, 0x00, 0x20, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C3D, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x24, 0x00, 0x7E, 0xFF, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xFF, 0x80, 0x3E, 0xA4, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C3E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x14, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x55, 0x00, 0x29, 0x55, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x29, 0x3E, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x08, 0x00, 0x55, 0x2A, 0x00, 0x55, 0x6B, 0x00, 0x54, 0xC9, 0x80, 0x40, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C41, { 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x1D, 0xBF, 0x80, 0x34, 0x88, 0x00, 0x29, 0x08, 0x00, 0x7F, 0x8C, 0x80, 0x2A, 0x95, 0x80, 0x2A, 0x27, 0x00, 0x3E, 0x0C, 0x00, 0x2B, 0x94, 0x00, 0x2A, 0xA6, 0x00, 0x3E, 0x8D, 0x00, 0x00, 0x94, 0x80, 0x54, 0xA4, 0x00, 0x55, 0x8C, 0x00, 0x55, 0x40, 0x00, 0x43, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C43, { 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x24, 0x00, 0x32, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x7E, 0x7E, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x40, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x52, 0x00, 0x3E, 0xD2, 0x00, 0x00, 0xBF, 0x80, 0x55, 0x92, 0x00, 0x55, 0x12, 0x00, 0x54, 0x12, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C44, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x0A, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0xE1, 0x80, 0x55, 0x02, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x42, 0x00, 0x40, 0x2E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C45, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x88, 0x00, 0x24, 0xBF, 0x00, 0x7E, 0x89, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x89, 0x00, 0x3E, 0xBF, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x00, 0xBF, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x6B, 0x29, 0x00, 0x40, 0x2B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C46, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x22, 0x00, 0x7F, 0x14, 0x00, 0x29, 0xFF, 0x80, 0x29, 0x00, 0x00, 0x3F, 0x3E, 0x00, 0x29, 0x22, 0x00, 0x29, 0x3E, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x08, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C47, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0F, 0x7F, 0x80, 0x09, 0x44, 0x00, 0x12, 0x44, 0x00, 0x24, 0x5F, 0x00, 0x1F, 0x45, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x45, 0x00, 0x1F, 0x5F, 0x00, 0x15, 0x64, 0x80, 0x15, 0x55, 0x00, 0x1F, 0x4E, 0x00, 0x02, 0x8D, 0x00, 0x29, 0x94, 0x80, 0x24, 0xA4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C48, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x2A, 0xEE, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0x6E, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x01, 0x00, 0x00, 0x01, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x01, 0x00, 0x54, 0x01, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C49, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x24, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xA1, 0x00, 0x2E, 0xD2, 0x00, 0x35, 0x8C, 0x00, 0x24, 0x8A, 0x00, 0x25, 0xB1, 0x80, 0x07, 0xFC, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFE, 0x00, 0x28, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFF, 0x00, 0x30, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C4A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x12, 0x00, 0x24, 0x0C, 0x00, 0x7F, 0x7F, 0x80, 0x29, 0x14, 0x80, 0x29, 0x25, 0x00, 0x3F, 0x4C, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x80, 0x3F, 0x52, 0x80, 0x00, 0x63, 0x80, 0x55, 0x5E, 0x80, 0x55, 0x52, 0x80, 0x54, 0x5E, 0x80, 0x40, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C4E, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x0E, 0x00, 0x32, 0x78, 0x00, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x29, 0x12, 0x00, 0x29, 0x3F, 0x00, 0x3F, 0x52, 0x80, 0x29, 0x1E, 0x00, 0x29, 0x00, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x40, 0x80, 0x55, 0x5E, 0x80, 0x55, 0x52, 0x80, 0x54, 0x5E, 0x80, 0x40, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C4F, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x28, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0xA9, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x55, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x54, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C50, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x09, 0x00, 0x24, 0xFF, 0x80, 0x7E, 0x09, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xAA, 0x80, 0x2A, 0xEB, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x2A, 0xEB, 0x80, 0x2A, 0xAA, 0x80, 0x6A, 0xAA, 0x80, 0x41, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C52, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x1E, 0x22, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x14, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x67, 0x00, 0x3E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x01, 0x02, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x22, 0x00, 0x54, 0x12, 0x00, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C53, { 0x00, 0x00, 0x00, 0x10, 0xEF, 0x00, 0x1E, 0xA9, 0x00, 0x32, 0xEF, 0x00, 0x24, 0x00, 0x00, 0x7E, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x55, 0xFF, 0x80, 0x55, 0x10, 0x00, 0x54, 0x10, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C54, { 0x00, 0x00, 0x00, 0x10, 0x41, 0x00, 0x1E, 0x22, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x08, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x49, 0x00, 0x29, 0x2A, 0x00, 0x29, 0xFF, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C56, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1D, 0xFF, 0x80, 0x35, 0x12, 0x00, 0x29, 0xA2, 0x00, 0x7D, 0xFF, 0x80, 0x55, 0x44, 0x80, 0x55, 0x4A, 0x80, 0x7D, 0x52, 0x00, 0x55, 0x52, 0x00, 0x55, 0x52, 0x00, 0x7D, 0xF2, 0x00, 0x01, 0x47, 0x00, 0x55, 0x45, 0x00, 0x55, 0x45, 0x00, 0x52, 0xCD, 0x80, 0x41, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C57, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x0F, 0x49, 0x00, 0x11, 0x2A, 0x00, 0x12, 0xFF, 0x80, 0x24, 0x1C, 0x00, 0x1F, 0x2A, 0x00, 0x15, 0x49, 0x00, 0x15, 0x88, 0x80, 0x1F, 0x42, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x9A, 0x00, 0x1F, 0xAA, 0x00, 0x00, 0xFF, 0x80, 0x09, 0x42, 0x00, 0x24, 0x82, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C58, { 0x00, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x1E, 0x02, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x02, 0x00, 0x7E, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xEF, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x69, 0x00, 0x2A, 0xCF, 0x00, 0x3E, 0x02, 0x00, 0x00, 0xFF, 0x80, 0x55, 0x42, 0x00, 0x55, 0x62, 0x00, 0x54, 0x22, 0x00, 0x40, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C5A, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x22, 0x00, 0x3F, 0x14, 0x00, 0x00, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x55, 0x7F, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C5B, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x1E, 0x63, 0x00, 0x32, 0xC1, 0x80, 0x24, 0x80, 0x80, 0x7E, 0xFF, 0x80, 0x2A, 0xC9, 0x80, 0x2A, 0xAA, 0x80, 0x3E, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C5C, { 0x00, 0x00, 0x00, 0x10, 0x90, 0x00, 0x1C, 0xBB, 0x80, 0x34, 0xAA, 0x80, 0x29, 0xAA, 0x80, 0x7D, 0x3B, 0x00, 0x57, 0x6B, 0x00, 0x55, 0xAA, 0x00, 0x7C, 0xBB, 0x00, 0x54, 0x82, 0x80, 0x55, 0x22, 0x80, 0x7F, 0xBA, 0x80, 0x00, 0xA2, 0x80, 0x54, 0xA2, 0x80, 0x55, 0xAB, 0x80, 0x51, 0x3A, 0x00, 0x43, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C5D, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x1E, 0xFF, 0x00, 0x32, 0x10, 0x00, 0x24, 0x42, 0x00, 0x7F, 0xFF, 0x80, 0x2A, 0x42, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x54, 0x22, 0x00, 0x40, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C5E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x55, 0x00, 0x24, 0x55, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x14, 0x80, 0x55, 0x35, 0x00, 0x55, 0xE6, 0x00, 0x54, 0x33, 0x00, 0x40, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C5F, { 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x1C, 0xCE, 0x00, 0x11, 0x22, 0x00, 0x1C, 0xCE, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x27, 0xE1, 0x00, 0x08, 0x40, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C60, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x14, 0x00, 0x32, 0x22, 0x00, 0x24, 0xDD, 0x80, 0x7F, 0x00, 0x00, 0x29, 0x7F, 0x00, 0x29, 0x49, 0x00, 0x3F, 0x6B, 0x00, 0x29, 0x49, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x22, 0x00, 0x55, 0x3E, 0x00, 0x54, 0x22, 0x00, 0x40, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C63, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x00, 0x00, 0x24, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x29, 0x5D, 0x00, 0x29, 0x55, 0x00, 0x3F, 0x5D, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x22, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x22, 0x00, 0x55, 0x3E, 0x00, 0x54, 0x00, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C67, { 0x00, 0x00, 0x00, 0x10, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x55, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x55, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x22, 0x00, 0x54, 0x14, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C68, { 0x00, 0x00, 0x00, 0x10, 0x49, 0x00, 0x1E, 0x2A, 0x00, 0x32, 0xFF, 0x80, 0x24, 0x80, 0x80, 0x7E, 0xBE, 0x80, 0x2A, 0x22, 0x00, 0x2A, 0x3E, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x40, 0x80, 0x3E, 0x7F, 0x80, 0x00, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C69, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x32, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x49, 0x00, 0x00, 0x49, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x49, 0x00, 0x54, 0x49, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C6A, { 0x00, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x1E, 0x42, 0x00, 0x32, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x7E, 0x7E, 0x80, 0x2A, 0x11, 0x80, 0x2A, 0xFF, 0x00, 0x3E, 0x12, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x0A, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0xC1, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C6B, { 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x1E, 0x7E, 0x00, 0x32, 0x90, 0x80, 0x24, 0x49, 0x00, 0x7E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0x25, 0x00, 0x3E, 0xA2, 0x80, 0x2B, 0x1E, 0x00, 0x2A, 0x20, 0x00, 0x3E, 0x3E, 0x00, 0x00, 0x62, 0x00, 0x2A, 0xB6, 0x00, 0x2A, 0x1C, 0x00, 0x6A, 0x36, 0x00, 0x40, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C6E, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x1E, 0xD7, 0x00, 0x32, 0x99, 0x00, 0x24, 0x91, 0x00, 0x7E, 0xD3, 0x00, 0x2A, 0x99, 0x00, 0x2A, 0x89, 0x00, 0x3E, 0xEB, 0x00, 0x2A, 0xA9, 0x00, 0x2A, 0xA9, 0x00, 0x3E, 0xA9, 0x00, 0x01, 0xFF, 0x80, 0x55, 0x00, 0x00, 0x55, 0x42, 0x00, 0x54, 0xC3, 0x00, 0x41, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C70, { 0x00, 0x00, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0xA9, 0x00, 0x32, 0xA9, 0x00, 0x24, 0xFF, 0x00, 0x7E, 0x10, 0x80, 0x2A, 0x7F, 0x00, 0x2A, 0x12, 0x00, 0x3E, 0x14, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x0A, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0xC1, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x54, 0x41, 0x00, 0x40, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C72, { 0x00, 0x00, 0x00, 0x10, 0x49, 0x00, 0x1E, 0x92, 0x00, 0x32, 0x49, 0x00, 0x24, 0xFE, 0x00, 0x7E, 0xAA, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xDA, 0x00, 0x3E, 0xB6, 0x00, 0x00, 0xDA, 0x00, 0x2A, 0xB6, 0x00, 0x2A, 0x92, 0x00, 0x68, 0xDA, 0x80, 0x41, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C75, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x1E, 0x84, 0x00, 0x32, 0xF7, 0x80, 0x24, 0xA9, 0x00, 0x7F, 0x14, 0x80, 0x2A, 0x05, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x82, 0x00, 0x2A, 0xBA, 0x00, 0x2A, 0x82, 0x80, 0x3E, 0xBA, 0x80, 0x00, 0xAB, 0x80, 0x2A, 0xAB, 0x00, 0x2A, 0xBA, 0x00, 0x69, 0x87, 0x00, 0x43, 0x1C, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C76, { 0x00, 0x00, 0x00, 0x10, 0x22, 0x00, 0x1E, 0x14, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x08, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x2A, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0xA2, 0x80, 0x3E, 0x3E, 0x00, 0x00, 0x22, 0x00, 0x55, 0x3E, 0x80, 0x55, 0x25, 0x00, 0x54, 0x3A, 0x00, 0x40, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C77, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1E, 0xFF, 0x80, 0x32, 0x08, 0x00, 0x24, 0xEB, 0x80, 0x7E, 0xAA, 0x80, 0x2A, 0xEB, 0x80, 0x2A, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xEB, 0x80, 0x00, 0xAA, 0x80, 0x2A, 0xEB, 0x80, 0x2A, 0x08, 0x00, 0x6A, 0xFF, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C78, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x0F, 0x00, 0x32, 0x08, 0x00, 0x24, 0xFF, 0x80, 0x7E, 0x88, 0x80, 0x2A, 0xBE, 0x00, 0x2A, 0x88, 0x80, 0x3E, 0xBF, 0x80, 0x2A, 0xA9, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA9, 0x00, 0x00, 0xBF, 0x00, 0x55, 0x00, 0x00, 0x55, 0x7F, 0x00, 0x54, 0x55, 0x00, 0x40, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C7B, { 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x12, 0x22, 0x00, 0x6F, 0x1F, 0x80, 0x12, 0x12, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x29, 0x29, 0x00, 0x3F, 0x3F, 0x00, 0x2A, 0xAA, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9C7C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x10, 0x44, 0x00, 0x3F, 0xFE, 0x00, 0x50, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C7F, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x30, 0x00, 0x1E, 0x28, 0x00, 0x24, 0x28, 0x00, 0x48, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x48, 0x00, 0x00, 0x48, 0x00, 0x0E, 0x89, 0x00, 0x71, 0x09, 0x00, 0x22, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C81, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x44, 0x00, 0x1F, 0xFE, 0x00, 0x70, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C82, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x24, 0x02, 0x00, 0x49, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x7E, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x0E, 0x84, 0x00, 0x70, 0x94, 0x00, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C85, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x30, 0x00, 0x1E, 0x28, 0x00, 0x24, 0x22, 0x00, 0x49, 0xFF, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7E, 0x00, 0x3E, 0x42, 0x00, 0x2A, 0x62, 0x00, 0x2A, 0xA4, 0x00, 0x3E, 0x94, 0x00, 0x00, 0x88, 0x00, 0x0F, 0x14, 0x00, 0x71, 0x23, 0x00, 0x22, 0xC2, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C86, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1E, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x48, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C87, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x12, 0x00, 0x12, 0x1F, 0x00, 0x24, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x15, 0x10, 0x00, 0x15, 0x12, 0x00, 0x1F, 0x7F, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x1F, 0x42, 0x00, 0x00, 0x42, 0x00, 0x07, 0x42, 0x00, 0x38, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C88, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x22, 0x00, 0x1E, 0x3F, 0x00, 0x24, 0x20, 0x00, 0x48, 0x22, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x80, 0x00, 0x0E, 0x80, 0x00, 0x71, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C8B, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0x24, 0x00, 0x1E, 0x24, 0x00, 0x24, 0x44, 0x00, 0x48, 0x44, 0x00, 0x3E, 0xFF, 0x00, 0x2B, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x64, 0x00, 0x2A, 0x54, 0x00, 0x2A, 0x54, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x70, 0x54, 0x00, 0x20, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C8D, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x0F, 0x22, 0x00, 0x0A, 0x3F, 0x00, 0x14, 0x42, 0x00, 0x3F, 0x8A, 0x00, 0x55, 0x7A, 0x00, 0x15, 0x4A, 0x00, 0x1F, 0x4A, 0x00, 0x15, 0x7A, 0x00, 0x15, 0x4A, 0x00, 0x1F, 0x44, 0x00, 0x00, 0x41, 0x00, 0x07, 0x41, 0x00, 0x38, 0x3F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C8E, { 0x00, 0x00, 0x00, 0x08, 0x88, 0x00, 0x04, 0x90, 0x00, 0x24, 0xA0, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x42, 0x02, 0x00, 0x07, 0xE0, 0x00, 0x08, 0x48, 0x00, 0x1F, 0xFC, 0x00, 0x28, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C90, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x20, 0x00, 0x24, 0x44, 0x00, 0x48, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C91, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x14, 0x00, 0x1E, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x48, 0x10, 0x00, 0x3E, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x71, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C92, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x12, 0x00, 0x25, 0xFF, 0x00, 0x48, 0x10, 0x00, 0x3E, 0x14, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0x82, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C94, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x22, 0x00, 0x25, 0xFF, 0x00, 0x48, 0x40, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0xFE, 0x00, 0x2B, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x7C, 0x00, 0x0E, 0x44, 0x00, 0x70, 0x54, 0x00, 0x20, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C95, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1E, 0x10, 0x00, 0x24, 0x10, 0x00, 0x48, 0x22, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x00, 0xAA, 0x00, 0x0E, 0x82, 0x00, 0x70, 0x8A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C9A, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x48, 0x44, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x47, 0x00, 0x2B, 0x82, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x44, 0x00, 0x0E, 0x44, 0x00, 0x70, 0x84, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C9B, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x02, 0x00, 0x25, 0xFF, 0x00, 0x48, 0x00, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x83, 0x00, 0x2B, 0x45, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x28, 0x00, 0x0E, 0x44, 0x00, 0x70, 0x83, 0x00, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C9C, { 0x00, 0x00, 0x00, 0x08, 0x82, 0x00, 0x08, 0x44, 0x00, 0x0F, 0x2A, 0x00, 0x12, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x55, 0x14, 0x00, 0x15, 0xFE, 0x00, 0x1F, 0x10, 0x00, 0x15, 0x10, 0x00, 0x15, 0x12, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x07, 0x10, 0x00, 0x78, 0x10, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C9E, { 0x00, 0x00, 0x00, 0x04, 0x90, 0x00, 0x02, 0xA0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x05, 0x18, 0x00, 0x1B, 0xE7, 0x00, 0x64, 0x42, 0x00, 0x0F, 0xF8, 0x00, 0x18, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9C9F, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0x02, 0x00, 0x24, 0x02, 0x00, 0x48, 0xFE, 0x00, 0x3E, 0x02, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x24, 0x00, 0x0E, 0x04, 0x00, 0x70, 0x14, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA0, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1E, 0x10, 0x00, 0x24, 0x12, 0x00, 0x48, 0xFF, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x50, 0x00, 0x00, 0x50, 0x00, 0x0E, 0x20, 0x00, 0x70, 0x58, 0x00, 0x21, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA1, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1E, 0x00, 0x00, 0x24, 0x02, 0x00, 0x48, 0xEF, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xEE, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x00, 0xAA, 0x00, 0x0E, 0xAA, 0x00, 0x70, 0xAA, 0x00, 0x20, 0xAA, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA2, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x12, 0x00, 0x25, 0x7F, 0x00, 0x48, 0x90, 0x00, 0x3E, 0x90, 0x00, 0x2A, 0x28, 0x00, 0x2B, 0xA8, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x8A, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x0E, 0x88, 0x00, 0x71, 0x4B, 0x00, 0x22, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA3, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1E, 0xBF, 0x00, 0x24, 0xB1, 0x00, 0x48, 0xAA, 0x00, 0x3E, 0xA4, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xB1, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x71, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA4, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1E, 0xFF, 0x00, 0x24, 0x92, 0x00, 0x4A, 0x92, 0x00, 0x3F, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x14, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x71, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA5, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0x22, 0x00, 0x1E, 0xF2, 0x00, 0x24, 0xA2, 0x00, 0x48, 0xA2, 0x00, 0x3E, 0xBF, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xE2, 0x00, 0x3E, 0xB2, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xA2, 0x00, 0x00, 0xE2, 0x00, 0x0E, 0xA2, 0x00, 0x70, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA6, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x20, 0x00, 0x1E, 0x3E, 0x00, 0x24, 0x44, 0x00, 0x48, 0xA8, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x47, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x54, 0x00, 0x0E, 0x93, 0x00, 0x71, 0x51, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA7, { 0x00, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x10, 0xF0, 0x00, 0x1E, 0x20, 0x00, 0x24, 0x20, 0x00, 0x48, 0x44, 0x00, 0x3E, 0xF8, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x54, 0x00, 0x00, 0x93, 0x00, 0x0F, 0x11, 0x00, 0x70, 0x50, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA8, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x54, 0x00, 0x20, 0x53, 0x00, 0x12, 0x9D, 0x00, 0x04, 0x30, 0x00, 0x3B, 0xC0, 0x00, 0x11, 0x00, 0x00, 0x13, 0xE0, 0x00, 0x04, 0x48, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x88, 0x00, 0x2F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CA9, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x49, 0x01, 0x00, 0x3E, 0x0A, 0x00, 0x2A, 0x7C, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x02, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x48, 0x00, 0x3E, 0x48, 0x00, 0x00, 0x48, 0x00, 0x0E, 0x49, 0x00, 0x70, 0x89, 0x00, 0x23, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CAB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x02, 0x00, 0x1E, 0xEF, 0x00, 0x24, 0xAA, 0x00, 0x48, 0xAA, 0x00, 0x3E, 0xEA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xEA, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0xCA, 0x00, 0x3E, 0xAA, 0x00, 0x00, 0xAE, 0x00, 0x0E, 0xC8, 0x00, 0x70, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CAD, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x14, 0x00, 0x1E, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x48, 0x7C, 0x00, 0x3E, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x0E, 0x82, 0x00, 0x70, 0x8A, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CAE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x14, 0x00, 0x1E, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x48, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xA3, 0x00, 0x3F, 0x3D, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xA4, 0x00, 0x3F, 0x28, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x28, 0x00, 0x70, 0x47, 0x00, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB0, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xF8, 0x00, 0x1E, 0xA2, 0x00, 0x24, 0xBF, 0x00, 0x48, 0xA2, 0x00, 0x3E, 0xEA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xEA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xB4, 0x00, 0x00, 0xE4, 0x00, 0x0F, 0xAA, 0x00, 0x70, 0x29, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB1, { 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x10, 0x28, 0x00, 0x1E, 0x2A, 0x00, 0x25, 0xEF, 0x00, 0x48, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0xEE, 0x00, 0x3E, 0x28, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x2A, 0x00, 0x3F, 0xEF, 0x00, 0x00, 0x28, 0x00, 0x0E, 0x28, 0x00, 0x70, 0x28, 0x00, 0x20, 0x28, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB2, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0x82, 0x00, 0x24, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x08, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0xEB, 0x00, 0x3E, 0x8C, 0x00, 0x00, 0x88, 0x00, 0x0E, 0xA9, 0x00, 0x70, 0xC9, 0x00, 0x20, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB3, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x7E, 0x00, 0x1E, 0x44, 0x00, 0x24, 0x7C, 0x00, 0x48, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x7C, 0x00, 0x2A, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB4, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0x82, 0x00, 0x24, 0x92, 0x00, 0x48, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xBA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xBA, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB5, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x22, 0x00, 0x1E, 0xC7, 0x00, 0x24, 0x82, 0x00, 0x48, 0x82, 0x00, 0x3E, 0xEE, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0x28, 0x00, 0x3E, 0x28, 0x00, 0x00, 0x48, 0x00, 0x0E, 0x49, 0x00, 0x70, 0x89, 0x00, 0x23, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB6, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x1E, 0x28, 0x00, 0x24, 0x44, 0x00, 0x48, 0xA3, 0x00, 0x3F, 0x12, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xFC, 0x00, 0x3E, 0x04, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x20, 0x00, 0x3E, 0x50, 0x00, 0x00, 0xD2, 0x00, 0x0F, 0x45, 0x00, 0x71, 0x45, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB7, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0x92, 0x00, 0x24, 0x92, 0x00, 0x48, 0xBA, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0xBA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x00, 0xBA, 0x00, 0x0E, 0x82, 0x00, 0x71, 0x0A, 0x00, 0x22, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CB8, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x12, 0x00, 0x12, 0xFF, 0x00, 0x24, 0x04, 0x00, 0x5F, 0x7E, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x15, 0x7C, 0x00, 0x15, 0x10, 0x00, 0x1F, 0x38, 0x00, 0x00, 0x56, 0x00, 0x07, 0x92, 0x00, 0x38, 0x50, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CBA, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1E, 0x02, 0x00, 0x24, 0x3A, 0x00, 0x48, 0xE2, 0x00, 0x3E, 0x22, 0x00, 0x2A, 0xFA, 0x00, 0x2A, 0xAA, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xFA, 0x00, 0x3E, 0x22, 0x00, 0x00, 0x2A, 0x00, 0x0E, 0x3B, 0x00, 0x70, 0xE5, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CBB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x49, 0x00, 0x1E, 0x49, 0x00, 0x24, 0x92, 0x00, 0x49, 0x24, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CBC, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0xFE, 0x00, 0x1E, 0x10, 0x00, 0x24, 0x44, 0x00, 0x49, 0xFF, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x92, 0x00, 0x00, 0x92, 0x00, 0x0E, 0x2C, 0x00, 0x70, 0x43, 0x00, 0x21, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CBD, { 0x00, 0x00, 0x00, 0x10, 0x24, 0x00, 0x10, 0xA4, 0x00, 0x1E, 0xA4, 0x00, 0x25, 0xFF, 0x00, 0x48, 0xA4, 0x00, 0x3E, 0xA4, 0x00, 0x2A, 0xBC, 0x00, 0x2A, 0x80, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x38, 0x00, 0x00, 0x54, 0x00, 0x0E, 0x93, 0x00, 0x71, 0x12, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CC3, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x3E, 0x92, 0x00, 0x44, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x3E, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x20, 0x00, 0x3F, 0x52, 0x00, 0x01, 0x51, 0x00, 0x0E, 0x45, 0x00, 0x70, 0x44, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CC4, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xEF, 0x00, 0x1E, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x48, 0xAA, 0x00, 0x3E, 0xEE, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x40, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x70, 0x14, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CC5, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x34, 0x00, 0x1D, 0xC4, 0x00, 0x24, 0x44, 0x00, 0x48, 0x45, 0x00, 0x3F, 0xF5, 0x00, 0x2A, 0x4E, 0x00, 0x2A, 0xC4, 0x00, 0x3E, 0xE4, 0x00, 0x2A, 0xD4, 0x00, 0x2B, 0x44, 0x00, 0x3E, 0x44, 0x00, 0x00, 0x4A, 0x00, 0x0E, 0x4A, 0x00, 0x70, 0x51, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CC6, { 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x7F, 0x00, 0x24, 0x80, 0x00, 0x49, 0xFC, 0x00, 0x3E, 0x84, 0x00, 0x2A, 0xFC, 0x00, 0x2A, 0x84, 0x00, 0x3E, 0xFC, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7C, 0x00, 0x3E, 0xC4, 0x00, 0x01, 0x28, 0x00, 0x0E, 0x10, 0x00, 0x70, 0x68, 0x00, 0x21, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CC7, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x22, 0x00, 0x1E, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x3E, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x14, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x71, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CCA, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x12, 0x00, 0x1E, 0xFF, 0x00, 0x24, 0x82, 0x00, 0x48, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x80, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0xAA, 0x00, 0x2B, 0xAA, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0xAA, 0x00, 0x0E, 0xAA, 0x00, 0x70, 0xAA, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CCB, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0xFE, 0x00, 0x1E, 0x92, 0x00, 0x24, 0x44, 0x00, 0x48, 0x38, 0x00, 0x3E, 0x44, 0x00, 0x2A, 0x93, 0x00, 0x2B, 0x12, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x0E, 0x12, 0x00, 0x71, 0xFE, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CCC, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x3F, 0x00, 0x7F, 0x64, 0x00, 0x08, 0xA4, 0x00, 0x0F, 0x18, 0x00, 0x11, 0x24, 0x00, 0x27, 0xE3, 0x00, 0x44, 0x48, 0x00, 0x0F, 0xFC, 0x00, 0x18, 0x88, 0x00, 0x2F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CCD, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x10, 0x24, 0x00, 0x1E, 0xFC, 0x00, 0x24, 0x28, 0x00, 0x49, 0xFF, 0x00, 0x3E, 0x20, 0x00, 0x2A, 0x78, 0x00, 0x2A, 0xC2, 0x00, 0x3F, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0xFC, 0x00, 0x3E, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x0E, 0x84, 0x00, 0x70, 0xFC, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CCE, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x48, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x2B, 0xEF, 0x00, 0x3E, 0x21, 0x00, 0x2B, 0x29, 0x00, 0x2A, 0xE7, 0x00, 0x3E, 0xA5, 0x00, 0x01, 0x29, 0x00, 0x0E, 0x21, 0x00, 0x70, 0xA5, 0x00, 0x20, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CCF, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x10, 0xFF, 0x00, 0x1E, 0xAA, 0x00, 0x24, 0xAA, 0x00, 0x48, 0xAA, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x54, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x54, 0x00, 0x00, 0x52, 0x00, 0x0E, 0x91, 0x00, 0x71, 0x11, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD0, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x0E, 0x00, 0x1E, 0xF0, 0x00, 0x24, 0x02, 0x00, 0x48, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7E, 0x00, 0x3E, 0x90, 0x00, 0x2A, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x10, 0x00, 0x00, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD3, { 0x00, 0x00, 0x00, 0x10, 0xA4, 0x00, 0x10, 0xA4, 0x00, 0x3F, 0xFC, 0x00, 0x48, 0xA4, 0x00, 0x10, 0xE4, 0x00, 0x7C, 0x4F, 0x00, 0x55, 0xF5, 0x00, 0x55, 0x55, 0x00, 0x7D, 0x55, 0x00, 0x55, 0x55, 0x00, 0x55, 0xF5, 0x00, 0x7C, 0x45, 0x00, 0x03, 0xF5, 0x00, 0x0C, 0x45, 0x00, 0x70, 0x49, 0x00, 0x20, 0x53, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD4, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x1E, 0x28, 0x00, 0x24, 0x2A, 0x00, 0x48, 0xFF, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x54, 0x00, 0x0E, 0x93, 0x00, 0x71, 0x11, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD5, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0xFE, 0x00, 0x1E, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x49, 0x11, 0x00, 0x3E, 0xD6, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0xD6, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0xFF, 0x00, 0x3E, 0x02, 0x00, 0x00, 0x7E, 0x00, 0x0E, 0x02, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD6, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x15, 0x12, 0x00, 0x0E, 0x1F, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xD4, 0x00, 0x2E, 0x88, 0x00, 0x35, 0x97, 0x00, 0x23, 0xE2, 0x00, 0x04, 0x48, 0x00, 0x1F, 0xFC, 0x00, 0x28, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD7, { 0x00, 0x00, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x42, 0x00, 0x1E, 0x7E, 0x00, 0x24, 0x42, 0x00, 0x48, 0x7E, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0xA5, 0x00, 0x3E, 0xA5, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0x7E, 0x00, 0x00, 0x24, 0x00, 0x0E, 0x18, 0x00, 0x70, 0x64, 0x00, 0x21, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD8, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xA2, 0x00, 0x20, 0x7F, 0x00, 0x5F, 0x82, 0x00, 0x14, 0xA2, 0x00, 0x7F, 0xD4, 0x00, 0x12, 0x88, 0x00, 0x1F, 0xF4, 0x00, 0x04, 0x43, 0x00, 0x0F, 0xF8, 0x00, 0x18, 0x88, 0x00, 0x2F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CD9, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x3D, 0x10, 0x00, 0x49, 0xFE, 0x00, 0x11, 0x12, 0x00, 0x7D, 0xFF, 0x00, 0x55, 0x12, 0x00, 0x55, 0xFE, 0x00, 0x7D, 0x10, 0x00, 0x55, 0xFE, 0x00, 0x55, 0x92, 0x00, 0x7D, 0xFE, 0x00, 0x02, 0x92, 0x00, 0x0E, 0xFE, 0x00, 0x72, 0x92, 0x00, 0x24, 0x96, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CDC, { 0x00, 0x00, 0x00, 0x10, 0x02, 0x00, 0x11, 0xFF, 0x00, 0x3D, 0x04, 0x00, 0x49, 0x54, 0x00, 0x11, 0x57, 0x00, 0x7D, 0x09, 0x00, 0x55, 0xFA, 0x00, 0x55, 0x22, 0x00, 0x7D, 0xAA, 0x00, 0x55, 0xAA, 0x00, 0x55, 0xAA, 0x00, 0x7D, 0xFA, 0x00, 0x01, 0x2A, 0x00, 0x0E, 0x25, 0x00, 0x72, 0x45, 0x00, 0x24, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CDD, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x48, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x3E, 0xFF, 0x00, 0x00, 0x82, 0x00, 0x0E, 0x82, 0x00, 0x70, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CDE, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x92, 0x00, 0x1E, 0x54, 0x00, 0x25, 0xFF, 0x00, 0x48, 0x38, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x93, 0x00, 0x2B, 0x52, 0x00, 0x3E, 0x42, 0x00, 0x2A, 0xEF, 0x00, 0x2B, 0x2A, 0x00, 0x3E, 0xAA, 0x00, 0x00, 0x5F, 0x00, 0x0E, 0x82, 0x00, 0x71, 0x02, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CDF, { 0x00, 0x00, 0x00, 0x10, 0x82, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xFF, 0x00, 0x24, 0x28, 0x00, 0x48, 0xFE, 0x00, 0x3E, 0xAA, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xC6, 0x00, 0x3E, 0xBA, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x04, 0x00, 0x01, 0xFF, 0x00, 0x0E, 0x44, 0x00, 0x70, 0x24, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CE2, { 0x00, 0x00, 0x00, 0x10, 0x28, 0x00, 0x10, 0xFE, 0x00, 0x1E, 0xAA, 0x00, 0x24, 0xFE, 0x00, 0x48, 0xAA, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x82, 0x00, 0x3E, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x0E, 0x28, 0x00, 0x71, 0xFF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CE5, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x04, 0x80, 0x00, 0x42, 0x80, 0x12, 0x20, 0x80, 0x11, 0x01, 0x00, 0x20, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CE6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x18, 0x00, 0x21, 0x10, 0x00, 0x3F, 0x3F, 0x80, 0x21, 0x02, 0x00, 0x3F, 0x06, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x8C, 0x00, 0x20, 0x08, 0x00, 0x3F, 0xD8, 0x00, 0x00, 0x50, 0x00, 0x55, 0x50, 0x00, 0x55, 0x50, 0x80, 0x40, 0xD9, 0x80, 0x01, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CE7, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x08, 0x80, 0x04, 0x85, 0x00, 0x12, 0x46, 0x00, 0x23, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x80, 0x04, 0x08, 0x80, 0x38, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9CE9, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x08, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x3E, 0x3F, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x20, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x42, 0x80, 0x13, 0xCA, 0x80, 0x10, 0x28, 0x80, 0x20, 0xA0, 0x80, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x40, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x04, 0x00, 0x13, 0xFC, 0x00, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x30, 0x01, 0x00, 0x24, 0xA9, 0x00, 0x64, 0xAB, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CEC, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x0F, 0xF1, 0x00, 0x08, 0x13, 0x00, 0x08, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CF0, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x78, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x1C, 0x80, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x80, 0x00, 0x36, 0xFF, 0x00, 0x22, 0x01, 0x00, 0x61, 0x55, 0x00, 0x01, 0x55, 0x00, 0x02, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CF2, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x41, 0x00, 0x1F, 0x7F, 0x00, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x80, 0x10, 0x40, 0x00, 0x10, 0x7F, 0x80, 0x10, 0x00, 0x80, 0x10, 0xAA, 0x80, 0x30, 0xAA, 0x80, 0x20, 0x81, 0x80, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x11, 0x04, 0x00, 0x17, 0xF4, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x14, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x04, 0x00, 0x17, 0xFC, 0x00, 0x14, 0x04, 0x00, 0x17, 0xFC, 0x00, 0x24, 0x96, 0x80, 0x2A, 0x46, 0x80, 0x29, 0x19, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9CF4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x3D, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x04, 0x00, 0x25, 0xFC, 0x00, 0x25, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x3D, 0x00, 0x00, 0x25, 0xFF, 0x80, 0x01, 0x08, 0x80, 0x00, 0x24, 0x80, 0x02, 0x91, 0x00, 0x02, 0x41, 0x00, 0x04, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CF6, { 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x0F, 0xF8, 0x80, 0x08, 0x16, 0x80, 0x0F, 0xF1, 0x80, 0x08, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x21, 0x25, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CF7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x36, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x1C, 0xAA, 0x80, 0x14, 0xAA, 0x80, 0x36, 0x81, 0x80, 0x63, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9CF9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x14, 0x7F, 0x00, 0x36, 0x41, 0x00, 0x23, 0x7F, 0x00, 0x61, 0xC1, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x01, 0x7F, 0x80, 0x03, 0x00, 0x80, 0x02, 0xAA, 0x80, 0x06, 0xAA, 0x80, 0x04, 0x81, 0x80, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D02, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x41, 0x00, 0x0A, 0x7F, 0x00, 0x0A, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x40, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x00, 0x80, 0x16, 0xAA, 0x80, 0x32, 0xAA, 0x80, 0x23, 0x81, 0x80, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D03, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x09, 0x00, 0x21, 0x09, 0x00, 0x3F, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x4A, 0x00, 0x55, 0x5B, 0x00, 0x40, 0xD1, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9D06, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x14, 0x40, 0x00, 0x15, 0x7F, 0x80, 0x36, 0x00, 0x80, 0x24, 0xAA, 0x80, 0x60, 0xAA, 0x80, 0x01, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D07, { 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x26, 0x10, 0x00, 0x3C, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x08, 0xAA, 0x80, 0x09, 0xAA, 0x80, 0x09, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0xFE, 0x00, 0x16, 0x82, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x82, 0x00, 0x1C, 0xFE, 0x00, 0x14, 0x80, 0x00, 0x14, 0xFF, 0x80, 0x14, 0x80, 0x00, 0x14, 0xFF, 0x80, 0x34, 0x00, 0x80, 0x25, 0x54, 0x80, 0x65, 0x55, 0x80, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D09, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x88, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x09, 0x3F, 0x00, 0x3F, 0xE0, 0x00, 0x03, 0x3F, 0x80, 0x03, 0x20, 0x00, 0x05, 0x3F, 0x80, 0x05, 0x22, 0x80, 0x09, 0x09, 0x80, 0x09, 0x24, 0x80, 0x11, 0x50, 0x80, 0x23, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D0B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x0F, 0x40, 0x00, 0x09, 0x7F, 0x80, 0x09, 0x40, 0x00, 0x09, 0x7F, 0x80, 0x19, 0x00, 0x80, 0x13, 0x2A, 0x80, 0x12, 0xAA, 0x80, 0x32, 0x81, 0x80, 0x6E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D0E, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7E, 0x20, 0x00, 0x40, 0xFE, 0x00, 0x40, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x48, 0xFE, 0x00, 0x48, 0x80, 0x00, 0x48, 0xFF, 0x80, 0x54, 0x80, 0x00, 0x54, 0xFF, 0x00, 0x40, 0x01, 0x00, 0x41, 0x55, 0x00, 0x7D, 0x55, 0x00, 0x02, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D11, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0xA2, 0x00, 0x11, 0x14, 0x00, 0x3E, 0x08, 0x00, 0x05, 0x16, 0x00, 0x18, 0xA1, 0x80, 0x67, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D12, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x36, 0x7F, 0x00, 0x63, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x11, 0x40, 0x00, 0x11, 0x7F, 0x80, 0x11, 0x00, 0x80, 0x13, 0x2A, 0x80, 0x10, 0xAA, 0x80, 0x11, 0x01, 0x80, 0x10, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D15, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x1F, 0xDF, 0x80, 0x10, 0x50, 0x80, 0x1F, 0xD0, 0x80, 0x10, 0x40, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xEB, 0x00, 0x10, 0x0E, 0x00, 0x1F, 0xE8, 0x00, 0x00, 0x28, 0x00, 0x2A, 0xA8, 0x00, 0x2A, 0xA8, 0x80, 0x40, 0x69, 0x80, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D17, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x32, 0x40, 0x00, 0x16, 0x7F, 0x80, 0x14, 0x40, 0x00, 0x14, 0x7F, 0x80, 0x07, 0x00, 0x80, 0x1C, 0xAA, 0x80, 0x70, 0xAA, 0x80, 0x00, 0x81, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D18, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x12, 0x10, 0x00, 0x32, 0x7F, 0x00, 0x27, 0x41, 0x00, 0x3D, 0x7F, 0x00, 0x60, 0xC1, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x00, 0x80, 0x12, 0xAA, 0x80, 0x32, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x62, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D1B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x0C, 0x51, 0x00, 0x12, 0x97, 0x00, 0x01, 0x10, 0x80, 0x06, 0x5F, 0x80, 0x3F, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x12, 0x24, 0x80, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D1C, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x24, 0x23, 0x00, 0x27, 0xBE, 0x00, 0x24, 0x20, 0x00, 0x24, 0x20, 0x80, 0x27, 0xB1, 0x80, 0x3C, 0x9F, 0x00, 0x67, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D1D, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x10, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x61, 0x41, 0x00, 0x3D, 0x7F, 0x00, 0x25, 0x40, 0x00, 0x25, 0x7F, 0x80, 0x25, 0x40, 0x00, 0x25, 0x7F, 0x80, 0x3D, 0x00, 0x80, 0x01, 0xAA, 0x80, 0x03, 0xAA, 0x80, 0x02, 0x81, 0x80, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D1E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x10, 0x7F, 0x80, 0x20, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x02, 0x00, 0x80, 0x02, 0xAA, 0x80, 0x06, 0xAA, 0x80, 0x04, 0x81, 0x80, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D1F, { 0x00, 0x00, 0x00, 0x01, 0x88, 0x00, 0x07, 0x10, 0x00, 0x3C, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x40, 0x00, 0x26, 0x7F, 0x80, 0x3A, 0x00, 0x80, 0x62, 0xAA, 0x80, 0x03, 0xAA, 0x80, 0x79, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D23, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x3E, 0xAA, 0x80, 0x00, 0xAA, 0x80, 0x01, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D26, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x3F, 0xFF, 0x80, 0x03, 0x48, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x05, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x16, 0x48, 0x80, 0x21, 0x25, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D28, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x2A, 0x42, 0x80, 0x08, 0x09, 0x80, 0x08, 0x24, 0x80, 0x08, 0x91, 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D2A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x14, 0x7F, 0x80, 0x16, 0x40, 0x00, 0x32, 0x7F, 0x80, 0x23, 0x00, 0x80, 0x20, 0xAA, 0x80, 0x60, 0xAA, 0x80, 0x01, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D2B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x7C, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x54, 0xFE, 0x00, 0x54, 0x82, 0x00, 0x7C, 0xFE, 0x00, 0x54, 0x80, 0x00, 0x54, 0xFF, 0x80, 0x54, 0x80, 0x00, 0x54, 0xFF, 0x00, 0x7C, 0x01, 0x00, 0x01, 0x55, 0x00, 0x03, 0x55, 0x00, 0x02, 0x03, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D2C, { 0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x08, 0x84, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x80, 0x80, 0x4F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x24, 0x91, 0x00, 0x62, 0x49, 0x00, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D2F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x40, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x40, 0x00, 0x55, 0x7F, 0x80, 0x55, 0x00, 0x80, 0x55, 0xAA, 0x80, 0x55, 0xAA, 0x80, 0x55, 0x01, 0x80, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D30, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x38, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0xC1, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x3E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D32, { 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x46, 0x10, 0x00, 0x7C, 0x7F, 0x00, 0x40, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x63, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x3E, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x3E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D33, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x41, 0x00, 0x51, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x7F, 0xFF, 0x00, 0x12, 0x40, 0x00, 0x32, 0x7F, 0x80, 0x26, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x74, 0x00, 0x80, 0x1C, 0xAA, 0x80, 0x16, 0xAA, 0x80, 0x33, 0x81, 0x80, 0x61, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D34, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1B, 0x90, 0x00, 0x10, 0x3F, 0x00, 0x30, 0x21, 0x00, 0x60, 0x3F, 0x00, 0x0F, 0xE1, 0x00, 0x19, 0x3F, 0x00, 0x11, 0x20, 0x00, 0x31, 0x3F, 0x80, 0x71, 0x20, 0x00, 0x11, 0x3F, 0x80, 0x11, 0x00, 0x80, 0x11, 0x2A, 0x80, 0x11, 0x6A, 0x80, 0x11, 0x41, 0x80, 0x17, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D3A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x28, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x09, 0x40, 0x00, 0x09, 0x7F, 0x80, 0x1B, 0x00, 0x80, 0x14, 0xAA, 0x80, 0x36, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x63, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D3B, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x00, 0x3E, 0x00, 0x07, 0xE2, 0x00, 0x21, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x01, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x09, 0xFF, 0x80, 0x0F, 0x20, 0x00, 0x08, 0x3F, 0x80, 0x10, 0x22, 0x80, 0x10, 0x09, 0x80, 0x10, 0x14, 0x80, 0x20, 0x50, 0x80, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D3C, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x63, 0x00, 0x21, 0x16, 0x00, 0x3F, 0x0C, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0xB3, 0x00, 0x20, 0x61, 0x80, 0x3F, 0xC0, 0x00, 0x00, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x55, 0x51, 0x00, 0x40, 0xD1, 0x00, 0x01, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D3D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x23, 0x21, 0x00, 0x3E, 0x21, 0x00, 0x05, 0x7F, 0x00, 0x18, 0x80, 0x00, 0x67, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D3E, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x32, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x09, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x7E, 0x40, 0x00, 0x48, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x09, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D3F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x10, 0x00, 0x36, 0x7F, 0x00, 0x63, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x01, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D41, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x63, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x24, 0x40, 0x00, 0x34, 0x7F, 0x80, 0x1C, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x1C, 0x00, 0x80, 0x16, 0xAA, 0x80, 0x32, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D42, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x10, 0x00, 0x09, 0x3F, 0x00, 0x19, 0x21, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x21, 0x00, 0x31, 0x3F, 0x00, 0x53, 0xA0, 0x00, 0x13, 0x7F, 0x80, 0x15, 0x20, 0x00, 0x15, 0x3F, 0x80, 0x19, 0x00, 0x80, 0x11, 0x2A, 0x80, 0x11, 0x6A, 0x80, 0x11, 0x41, 0x80, 0x11, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D43, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x00, 0x80, 0x2A, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x62, 0x81, 0x80, 0x46, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D44, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x10, 0x7F, 0x00, 0x32, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x01, 0x7F, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x0E, 0xAA, 0x80, 0x38, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D45, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x63, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x0C, 0x7F, 0x00, 0x1E, 0x40, 0x00, 0x33, 0x7F, 0x80, 0x61, 0xC0, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x3E, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D46, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x18, 0x87, 0x80, 0x33, 0xF0, 0x00, 0x62, 0x10, 0x00, 0x0B, 0xF0, 0x00, 0x1A, 0x17, 0x80, 0x33, 0xF1, 0x00, 0x72, 0x01, 0x00, 0x13, 0xFD, 0x00, 0x12, 0x01, 0x00, 0x13, 0xFD, 0x00, 0x10, 0x05, 0x00, 0x15, 0x55, 0x00, 0x15, 0x55, 0x00, 0x18, 0x0D, 0x00, 0x10, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D47, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x10, 0x10, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x64, 0x7F, 0x00, 0x44, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x00, 0x80, 0x04, 0xAA, 0x80, 0x04, 0xAA, 0x80, 0x04, 0x81, 0x80, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D48, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x90, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x40, 0x00, 0x1E, 0x7F, 0x80, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x80, 0x12, 0x00, 0x80, 0x1E, 0xAA, 0x80, 0x72, 0xAA, 0x80, 0x03, 0x01, 0x80, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D4A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x5D, 0x40, 0x00, 0x5D, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x14, 0x00, 0x80, 0x14, 0xAA, 0x80, 0x36, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x63, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D50, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x5D, 0x7F, 0x80, 0x49, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x0E, 0xAA, 0x80, 0x38, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D51, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x20, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x1E, 0x82, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x1E, 0x80, 0x00, 0x12, 0xFF, 0x80, 0x12, 0x82, 0x80, 0x12, 0x0A, 0x80, 0x12, 0xA8, 0x80, 0x23, 0x21, 0x00, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D53, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x5D, 0x40, 0x00, 0x04, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x0F, 0x7F, 0x80, 0x78, 0x00, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x08, 0x81, 0x80, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D54, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x08, 0x31, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x7F, 0x80, 0x3F, 0x12, 0x80, 0x21, 0x12, 0x00, 0x3F, 0x23, 0x80, 0x20, 0x50, 0x00, 0x3F, 0x9F, 0x00, 0x20, 0x31, 0x00, 0x3F, 0xEB, 0x00, 0x00, 0x4E, 0x00, 0x55, 0x44, 0x00, 0x55, 0x4E, 0x00, 0x40, 0xDB, 0x00, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9D59, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x3E, 0xAA, 0x80, 0x14, 0xAA, 0x80, 0x36, 0x81, 0x80, 0x62, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D5C, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x36, 0x10, 0x00, 0x14, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x09, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x28, 0x7F, 0x00, 0x28, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x09, 0x40, 0x00, 0x09, 0x7F, 0x80, 0x1B, 0x00, 0x80, 0x28, 0xAA, 0x80, 0x48, 0xAA, 0x80, 0x09, 0x01, 0x80, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D5D, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x0F, 0x08, 0x00, 0x3A, 0xBF, 0x00, 0x0A, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x7F, 0xE1, 0x00, 0x0A, 0x3F, 0x00, 0x0A, 0x20, 0x00, 0x0A, 0xBF, 0x80, 0x0E, 0xA0, 0x00, 0x1A, 0xBF, 0x80, 0x6B, 0x22, 0x80, 0x09, 0x09, 0x80, 0x0B, 0x64, 0x80, 0x0A, 0xD0, 0x80, 0x1C, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D5E, { 0x00, 0x00, 0x00, 0x3E, 0x2C, 0x00, 0x08, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x11, 0x00, 0x3F, 0x1A, 0x00, 0x08, 0x4C, 0x80, 0x38, 0x97, 0x80, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D5F, { 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x11, 0xFC, 0x00, 0x68, 0x20, 0x00, 0x18, 0xF8, 0x00, 0x68, 0x20, 0x00, 0x0B, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x6F, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x2F, 0xFE, 0x00, 0x69, 0x22, 0x00, 0x44, 0x96, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D60, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0A, 0x10, 0x00, 0x0A, 0x3F, 0x00, 0x1F, 0xA1, 0x00, 0x12, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x02, 0x3F, 0x00, 0x3F, 0xE0, 0x00, 0x02, 0x3F, 0x80, 0x02, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0xA2, 0x80, 0x10, 0x8A, 0x80, 0x10, 0xA8, 0x80, 0x1F, 0xA0, 0x80, 0x10, 0xA3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D61, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x03, 0x08, 0x00, 0x1A, 0xBE, 0x00, 0x02, 0x22, 0x00, 0x02, 0x3E, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x3E, 0x00, 0x0A, 0x20, 0x00, 0x2A, 0x3F, 0x00, 0x2E, 0x20, 0x00, 0x2A, 0x3F, 0x80, 0x2A, 0x22, 0x80, 0x29, 0x09, 0x80, 0x2F, 0x24, 0x80, 0x30, 0xB1, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D62, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x40, 0x00, 0x1E, 0x7F, 0x80, 0x12, 0x40, 0x00, 0x12, 0x7F, 0x80, 0x7E, 0x00, 0x80, 0x0A, 0xAA, 0x80, 0x12, 0xAA, 0x80, 0x62, 0x81, 0x80, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D63, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x1A, 0x00, 0x80, 0x28, 0xAA, 0x80, 0x28, 0xAA, 0x80, 0x49, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D64, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x7E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x62, 0xAA, 0x80, 0x42, 0x81, 0x80, 0x46, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D65, { 0x00, 0x00, 0x00, 0x15, 0x01, 0x00, 0x24, 0x91, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x04, 0x41, 0x00, 0x08, 0x87, 0x00, 0x37, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D69, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x77, 0xC8, 0x00, 0x54, 0x5F, 0x00, 0x54, 0x51, 0x00, 0x54, 0xDF, 0x00, 0x74, 0x11, 0x00, 0x54, 0x1F, 0x00, 0x57, 0xD0, 0x00, 0x54, 0x5F, 0x80, 0x74, 0x50, 0x00, 0x56, 0xDF, 0x80, 0x55, 0x80, 0x80, 0x55, 0x2A, 0x80, 0x55, 0xAA, 0x80, 0x56, 0xA1, 0x80, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D6A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xBF, 0x00, 0x12, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x29, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x69, 0x60, 0x00, 0x29, 0x3F, 0x80, 0x3F, 0x20, 0x00, 0x29, 0x3F, 0x80, 0x29, 0x00, 0x80, 0x3F, 0x2A, 0x80, 0x08, 0x2A, 0x80, 0x0C, 0x41, 0x80, 0x07, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D6B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x0F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x40, 0x00, 0x21, 0x7F, 0x80, 0x21, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x7F, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x08, 0x81, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D6C, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC8, 0x00, 0x15, 0x5F, 0x00, 0x15, 0x51, 0x00, 0x15, 0x5F, 0x00, 0x1D, 0xD1, 0x00, 0x15, 0x5F, 0x00, 0x15, 0x50, 0x00, 0x15, 0x5F, 0x80, 0x1D, 0xD0, 0x00, 0x15, 0x5F, 0x80, 0x15, 0x52, 0x80, 0x15, 0x45, 0x80, 0x15, 0x52, 0x80, 0x25, 0x69, 0x00, 0x2E, 0xD6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D6F, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x14, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x00, 0x80, 0x04, 0xAA, 0x80, 0x04, 0xAA, 0x80, 0x05, 0x01, 0x80, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D70, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x90, 0x00, 0x20, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x2E, 0xBF, 0x00, 0x24, 0xA1, 0x00, 0x2E, 0xBF, 0x00, 0x24, 0xA0, 0x00, 0x20, 0xBF, 0x80, 0x2E, 0xA0, 0x00, 0x2A, 0xBF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0xAA, 0x80, 0x2E, 0xAA, 0x80, 0x60, 0xC1, 0x80, 0x41, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D72, { 0x00, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x3E, 0x00, 0x3F, 0xA2, 0x00, 0x0A, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x0A, 0x3E, 0x00, 0x3F, 0xA0, 0x00, 0x00, 0x3F, 0x80, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x80, 0x11, 0x02, 0x80, 0x1F, 0x09, 0x80, 0x11, 0x24, 0x80, 0x11, 0x50, 0x80, 0x1F, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D76, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x14, 0x7F, 0x00, 0x77, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x41, 0x40, 0x00, 0x41, 0x7F, 0x80, 0x77, 0x40, 0x00, 0x14, 0x7F, 0x80, 0x14, 0x00, 0x80, 0x14, 0xAA, 0x80, 0x17, 0xAA, 0x80, 0x7C, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D77, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xDF, 0x00, 0x40, 0x51, 0x00, 0x40, 0x5F, 0x00, 0x20, 0x11, 0x00, 0x3B, 0xDF, 0x00, 0x2A, 0x50, 0x00, 0x6A, 0x5F, 0x80, 0x4A, 0x50, 0x00, 0x2A, 0xDF, 0x80, 0x1A, 0x00, 0x80, 0x12, 0x2A, 0x80, 0x12, 0x2A, 0x80, 0x32, 0x61, 0x80, 0x61, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D7A, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x08, 0x00, 0x7F, 0xBF, 0x00, 0x12, 0x21, 0x00, 0x12, 0x3F, 0x00, 0x37, 0xA1, 0x00, 0x24, 0xBF, 0x00, 0x2E, 0xA0, 0x00, 0x65, 0xBF, 0x80, 0x25, 0x20, 0x00, 0x27, 0x3F, 0x80, 0x22, 0x00, 0x80, 0x27, 0x2A, 0x80, 0x2D, 0xAA, 0x80, 0x20, 0xC1, 0x80, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D7B, { 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x08, 0x0B, 0x00, 0x3F, 0x0A, 0x00, 0x21, 0x1F, 0x80, 0x3F, 0x12, 0x00, 0x21, 0x32, 0x00, 0x3F, 0x12, 0x00, 0x20, 0x1F, 0x00, 0x3F, 0x92, 0x00, 0x20, 0x12, 0x00, 0x3F, 0xD2, 0x00, 0x00, 0x5F, 0x00, 0x55, 0x52, 0x00, 0x55, 0x52, 0x00, 0x40, 0xD2, 0x00, 0x01, 0x9F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9D7C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x34, 0x41, 0x00, 0x67, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x0E, 0xAA, 0x80, 0x38, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D7E, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x20, 0x00, 0x00, 0x3F, 0x80, 0x44, 0x20, 0x00, 0x45, 0xBF, 0x80, 0x77, 0x00, 0x80, 0x44, 0x2A, 0x80, 0x44, 0x2A, 0x80, 0x74, 0x81, 0x80, 0x43, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D83, { 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x08, 0x31, 0x80, 0x3F, 0xA0, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xBB, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xA0, 0x80, 0x20, 0x20, 0x80, 0x3F, 0xBF, 0x80, 0x20, 0x0A, 0x00, 0x3F, 0xCA, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x5A, 0x00, 0x55, 0x52, 0x00, 0x40, 0xD2, 0x80, 0x01, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9D84, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x22, 0x01, 0x80, 0x26, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D86, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x5D, 0x40, 0x00, 0x49, 0x7F, 0x80, 0x1C, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x2A, 0x00, 0x80, 0x6A, 0xAA, 0x80, 0x48, 0xAA, 0x80, 0x48, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D87, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x1A, 0x00, 0x80, 0x28, 0xAA, 0x80, 0x28, 0xAA, 0x80, 0x49, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D89, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x04, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x0F, 0x00, 0x80, 0x78, 0x2A, 0x80, 0x08, 0xAA, 0x80, 0x09, 0x01, 0x80, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D8A, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x48, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x41, 0x00, 0x49, 0x7F, 0x00, 0x7F, 0xC0, 0x00, 0x49, 0x7F, 0x80, 0x49, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x48, 0x00, 0x80, 0x5C, 0xAA, 0x80, 0x56, 0xAA, 0x80, 0x32, 0x01, 0x80, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D8D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x10, 0x7F, 0x80, 0x3F, 0x40, 0x00, 0x55, 0x7F, 0x80, 0x15, 0x00, 0x80, 0x25, 0x54, 0x80, 0x09, 0x54, 0x80, 0x13, 0x41, 0x80, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D8E, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x41, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x5D, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x00, 0x80, 0x6A, 0xAA, 0x80, 0x49, 0xAA, 0x80, 0x49, 0x01, 0x80, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D8F, { 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x7C, 0x10, 0x00, 0x01, 0x7F, 0x00, 0x4B, 0x41, 0x00, 0x6A, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x1C, 0xAA, 0x80, 0x16, 0xAA, 0x80, 0x32, 0x81, 0x80, 0x60, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D92, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x11, 0x08, 0x00, 0x7D, 0x1F, 0x00, 0x13, 0xD1, 0x00, 0x7D, 0x5F, 0x00, 0x55, 0x51, 0x00, 0x55, 0x5F, 0x00, 0x7D, 0x50, 0x00, 0x11, 0x5F, 0x80, 0x39, 0x50, 0x00, 0x39, 0x5F, 0x80, 0x35, 0x40, 0x80, 0x55, 0x6A, 0x80, 0x52, 0x6A, 0x80, 0x52, 0x41, 0x80, 0x12, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D93, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x49, 0x7F, 0x80, 0x49, 0x40, 0x00, 0x49, 0x7F, 0x80, 0x7F, 0x00, 0x80, 0x49, 0x54, 0x80, 0x49, 0x54, 0x80, 0x49, 0x41, 0x80, 0x7F, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D95, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x3E, 0x81, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D96, { 0x00, 0x00, 0x00, 0x7E, 0x08, 0x00, 0x08, 0x49, 0x80, 0x7E, 0xC9, 0x00, 0x08, 0x9C, 0x00, 0x1C, 0x36, 0x00, 0x2A, 0x63, 0x80, 0x48, 0x80, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D97, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x08, 0x00, 0x21, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x21, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xBF, 0x80, 0x04, 0x20, 0x00, 0x24, 0x3F, 0x80, 0x27, 0x80, 0x80, 0x24, 0x2A, 0x80, 0x34, 0x2A, 0x80, 0x6C, 0x01, 0x00, 0x47, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9D98, { 0x00, 0x00, 0x00, 0x13, 0xC4, 0x00, 0x12, 0x48, 0x00, 0x12, 0x5F, 0x00, 0x12, 0x51, 0x00, 0x7E, 0x5F, 0x00, 0x13, 0xD1, 0x00, 0x12, 0x5F, 0x00, 0x12, 0x50, 0x00, 0x12, 0x5F, 0x80, 0x7B, 0xD0, 0x00, 0x4A, 0x5F, 0x80, 0x4A, 0x40, 0x80, 0x4A, 0x6A, 0x80, 0x4A, 0x6A, 0x80, 0x7A, 0x41, 0x80, 0x04, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9D9A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x77, 0x10, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x77, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x10, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x02, 0xAA, 0x80, 0x02, 0xAA, 0x80, 0x06, 0x81, 0x80, 0x1C, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DA1, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x10, 0x3F, 0x00, 0x1F, 0xA0, 0x00, 0x34, 0xBF, 0x80, 0x64, 0xA0, 0x00, 0x2E, 0xBF, 0x80, 0x3B, 0x80, 0x80, 0x20, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x00, 0x81, 0x80, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DA4, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x41, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x7F, 0x2A, 0x80, 0x08, 0xAA, 0x80, 0x09, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DA9, { 0x00, 0x00, 0x00, 0x1F, 0x90, 0x00, 0x01, 0x1F, 0x00, 0x3F, 0xF2, 0x00, 0x06, 0x4C, 0x00, 0x0A, 0x1A, 0x00, 0x36, 0x61, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x21, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DAA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x0A, 0x7F, 0x80, 0x09, 0x40, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x00, 0x80, 0x1C, 0xAA, 0x80, 0x36, 0xAA, 0x80, 0x63, 0x01, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DAB, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x6B, 0x41, 0x00, 0x5D, 0x7F, 0x00, 0x49, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x1C, 0x7F, 0x80, 0x1A, 0x00, 0x80, 0x28, 0xAA, 0x80, 0x28, 0xAA, 0x80, 0x49, 0x01, 0x80, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DAC, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0E, 0x08, 0x00, 0x1B, 0x3F, 0x00, 0x31, 0xA1, 0x00, 0x6E, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA0, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0xA0, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x00, 0x80, 0x7F, 0xAA, 0x80, 0x50, 0xAA, 0x80, 0x50, 0x81, 0x80, 0x1F, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DAE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x41, 0x40, 0x00, 0x5D, 0x7F, 0x80, 0x55, 0x00, 0x80, 0x55, 0xAA, 0x80, 0x5D, 0xAA, 0x80, 0x41, 0x81, 0x80, 0x43, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DAF, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x14, 0xA4, 0x80, 0x25, 0x25, 0x00, 0x0A, 0x8A, 0x00, 0x11, 0x11, 0x00, 0x2F, 0xFC, 0x80, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x21, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DB1, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x1F, 0xF6, 0x00, 0x64, 0x11, 0x80, 0x07, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x62, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DB2, { 0x00, 0x00, 0x00, 0x06, 0x08, 0x00, 0x12, 0x10, 0x00, 0x33, 0x3F, 0x00, 0x69, 0xA1, 0x00, 0x1A, 0x3F, 0x00, 0x13, 0x21, 0x00, 0x3D, 0x3F, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xBF, 0x80, 0x19, 0xA0, 0x00, 0x2A, 0xBF, 0x80, 0x4C, 0x80, 0x80, 0x19, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x4C, 0x81, 0x80, 0x19, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DB4, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x04, 0x3E, 0x00, 0x3F, 0xA2, 0x00, 0x20, 0xBE, 0x00, 0x09, 0x22, 0x00, 0x0A, 0x3E, 0x00, 0x1F, 0xA0, 0x00, 0x32, 0x3F, 0x00, 0x1F, 0xA0, 0x00, 0x12, 0x3F, 0x80, 0x1F, 0xA2, 0x80, 0x12, 0x09, 0x80, 0x1F, 0xD4, 0x80, 0x10, 0x29, 0x00, 0x10, 0x46, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DB5, { 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x48, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x3E, 0xA1, 0x00, 0x11, 0xBF, 0x00, 0x23, 0x20, 0x00, 0x10, 0x3F, 0x80, 0x3F, 0xA0, 0x00, 0x48, 0xBF, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0xAA, 0x80, 0x3E, 0xAA, 0x80, 0x11, 0x81, 0x80, 0x23, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DB8, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0x88, 0x00, 0x08, 0xBF, 0x00, 0x08, 0xA1, 0x00, 0x3B, 0xBF, 0x00, 0x22, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x3B, 0xA0, 0x00, 0x08, 0xBF, 0x80, 0x3B, 0xA0, 0x00, 0x4C, 0xBF, 0x80, 0x19, 0x80, 0x80, 0x6E, 0xAA, 0x80, 0x08, 0xAA, 0x80, 0x19, 0x81, 0x80, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DB9, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x27, 0x10, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x55, 0x41, 0x00, 0x77, 0x7F, 0x00, 0x14, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x7F, 0x40, 0x00, 0x49, 0x7F, 0x80, 0x49, 0x00, 0x80, 0x7F, 0x54, 0x80, 0x49, 0x54, 0x80, 0x49, 0x01, 0x80, 0x7F, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DBA, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x6B, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x6B, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x36, 0x7F, 0x00, 0x63, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x00, 0x80, 0x3E, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x26, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DBB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x22, 0x7F, 0x00, 0x2E, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x22, 0xAA, 0x80, 0x22, 0x81, 0x80, 0x26, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DBC, { 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x12, 0x08, 0x00, 0x7F, 0xDF, 0x00, 0x0A, 0x11, 0x00, 0x3F, 0xDF, 0x00, 0x0A, 0x51, 0x00, 0x0A, 0x5F, 0x00, 0x7F, 0xF0, 0x00, 0x0A, 0x5F, 0x80, 0x0A, 0x50, 0x00, 0x3F, 0xDF, 0x80, 0x0A, 0x00, 0x80, 0x1B, 0x2A, 0x80, 0x2A, 0xAA, 0x80, 0x4A, 0x41, 0x80, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DBF, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00, 0x12, 0x12, 0x00, 0x34, 0x34, 0x00, 0x09, 0x09, 0x00, 0x3E, 0xBE, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DC1, { 0x00, 0x00, 0x00, 0x06, 0x04, 0x00, 0x13, 0x08, 0x00, 0x31, 0xBF, 0x00, 0x6E, 0xE1, 0x00, 0x00, 0x3F, 0x00, 0x17, 0x21, 0x00, 0x31, 0xBF, 0x00, 0x60, 0xE0, 0x00, 0x3F, 0xBF, 0x80, 0x2A, 0xA0, 0x00, 0x2A, 0xBF, 0x80, 0x2B, 0xC0, 0x80, 0x3E, 0x2A, 0x80, 0x60, 0xAA, 0x80, 0x00, 0x81, 0x80, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DC2, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x1F, 0x10, 0x00, 0x71, 0x7F, 0x00, 0x0B, 0x41, 0x00, 0x26, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x70, 0x7F, 0x00, 0x1E, 0x40, 0x00, 0x28, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x3E, 0x81, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DC3, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x1F, 0x00, 0x7F, 0xD0, 0x00, 0x40, 0x5F, 0x80, 0x08, 0x10, 0x00, 0x7F, 0xDF, 0x80, 0x0A, 0x00, 0x80, 0x12, 0x2A, 0x80, 0x34, 0x2A, 0x80, 0x0E, 0x01, 0x80, 0x71, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DC4, { 0x00, 0x00, 0x00, 0x07, 0x08, 0x00, 0x38, 0x3E, 0x00, 0x08, 0x22, 0x00, 0x0A, 0x3E, 0x00, 0x12, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x18, 0xA0, 0x00, 0x13, 0xBF, 0x80, 0x3C, 0x60, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x02, 0x80, 0x3F, 0x8A, 0x80, 0x04, 0x18, 0x80, 0x0A, 0x50, 0x80, 0x11, 0x41, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DC6, { 0x00, 0x00, 0x00, 0x26, 0x08, 0x00, 0x3C, 0x10, 0x00, 0x21, 0x7F, 0x00, 0x1F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x5E, 0x41, 0x00, 0x52, 0x7F, 0x00, 0x5E, 0x40, 0x00, 0x52, 0x7F, 0x80, 0x5E, 0x40, 0x00, 0x52, 0x7F, 0x80, 0x5E, 0x00, 0x80, 0x40, 0xAA, 0x80, 0x7F, 0xAA, 0x80, 0x14, 0x81, 0x80, 0x62, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DC7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0x9E, 0x00, 0x08, 0x12, 0x00, 0x3F, 0x12, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xA3, 0x80, 0x40, 0x80, 0x00, 0x3F, 0x3F, 0x00, 0x08, 0x11, 0x00, 0x3F, 0x13, 0x00, 0x21, 0x12, 0x00, 0x3F, 0x96, 0x00, 0x20, 0x0C, 0x00, 0x3F, 0x9E, 0x00, 0x54, 0xB3, 0x00, 0x4A, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9DC9, { 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x0F, 0x88, 0x00, 0x7A, 0x1F, 0x00, 0x43, 0xD1, 0x00, 0x42, 0x1F, 0x00, 0x5F, 0xD1, 0x00, 0x54, 0x5F, 0x00, 0x57, 0x10, 0x00, 0x5C, 0x9F, 0x80, 0x57, 0x90, 0x00, 0x50, 0x1F, 0x80, 0x55, 0x00, 0x80, 0x55, 0x2A, 0x80, 0x15, 0x2A, 0x80, 0x2D, 0x41, 0x80, 0x19, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DCA, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x40, 0x00, 0x41, 0x7F, 0x80, 0x55, 0x40, 0x00, 0x49, 0x7F, 0x80, 0x55, 0x00, 0x80, 0x41, 0xAA, 0x80, 0x5D, 0xAA, 0x80, 0x49, 0x81, 0x80, 0x4B, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DCF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x7E, 0xAA, 0x80, 0x14, 0xAA, 0x80, 0x36, 0x81, 0x80, 0x62, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DD3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3F, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x3F, 0x7F, 0x00, 0x2A, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x40, 0x00, 0x6E, 0x7F, 0x80, 0x40, 0x00, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DD4, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x7F, 0xF1, 0x00, 0x08, 0x1B, 0x00, 0x0F, 0x8E, 0x00, 0x18, 0x9A, 0x00, 0x33, 0xB3, 0x00, 0x60, 0x81, 0x80, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DD5, { 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x3C, 0xFF, 0x80, 0x25, 0x88, 0x00, 0x26, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x88, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DD6, { 0x00, 0x00, 0x00, 0x3F, 0xDE, 0x00, 0x24, 0x12, 0x00, 0x27, 0x93, 0x80, 0x2A, 0x20, 0x00, 0x3F, 0xDF, 0x00, 0x25, 0x0A, 0x00, 0x28, 0x84, 0x00, 0x3F, 0xDB, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DD7, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x3F, 0x00, 0x27, 0x21, 0x00, 0x25, 0x3F, 0x00, 0x27, 0x21, 0x00, 0x20, 0x3F, 0x00, 0x20, 0x20, 0x00, 0x2F, 0xBF, 0x80, 0x2A, 0xA0, 0x00, 0x2A, 0xBF, 0x80, 0x2F, 0xA2, 0x80, 0x20, 0x05, 0x80, 0x20, 0x12, 0x80, 0x3F, 0xA8, 0x80, 0x20, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DD9, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x3E, 0x00, 0x7F, 0xCA, 0x00, 0x11, 0x2A, 0x00, 0x3F, 0x9A, 0x80, 0x04, 0x15, 0x80, 0x3F, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x08, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x34, 0x91, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DDA, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC8, 0x00, 0x29, 0x5F, 0x00, 0x4A, 0x51, 0x00, 0x29, 0x5F, 0x00, 0x4A, 0x51, 0x00, 0x04, 0x1F, 0x00, 0x0A, 0x10, 0x00, 0x11, 0x1F, 0x80, 0x64, 0xD0, 0x00, 0x08, 0x1F, 0x80, 0x32, 0x00, 0x80, 0x0C, 0xAA, 0x80, 0x31, 0x2A, 0x80, 0x06, 0x01, 0x80, 0x38, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DDE, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xDF, 0x00, 0x04, 0x11, 0x00, 0x55, 0x5F, 0x00, 0x24, 0x91, 0x00, 0x55, 0x5F, 0x00, 0x04, 0x10, 0x00, 0x55, 0x5F, 0x80, 0x24, 0x90, 0x00, 0x55, 0x5F, 0x80, 0x0E, 0x00, 0x80, 0x0A, 0x2A, 0x80, 0x1B, 0x2A, 0x80, 0x31, 0x81, 0x80, 0x60, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DDF, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x7E, 0xFF, 0x80, 0x11, 0xA0, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0xFF, 0x80, 0x32, 0x14, 0x00, 0x66, 0xE3, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DE0, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1E, 0x10, 0x00, 0x32, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x29, 0x41, 0x00, 0x29, 0x7F, 0x00, 0x3F, 0x40, 0x00, 0x29, 0x7F, 0x80, 0x29, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x54, 0xAA, 0x80, 0x55, 0xAA, 0x80, 0x55, 0x01, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DE5, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x12, 0x12, 0x00, 0x34, 0x34, 0x00, 0x09, 0x09, 0x00, 0x3E, 0xBE, 0x80, 0x04, 0x04, 0x00, 0x15, 0x15, 0x00, 0x24, 0xA4, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DE6, { 0x00, 0x00, 0x00, 0x12, 0x08, 0x00, 0x14, 0x10, 0x00, 0x3F, 0x7F, 0x00, 0x64, 0x41, 0x00, 0x3E, 0x7F, 0x00, 0x24, 0x41, 0x00, 0x24, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x40, 0x00, 0x3F, 0x7F, 0x80, 0x00, 0x00, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x61, 0x01, 0x80, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DE7, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x10, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x3E, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x22, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x22, 0xAA, 0x80, 0x14, 0xAA, 0x80, 0x1F, 0x01, 0x80, 0x70, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DE9, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x24, 0x8F, 0x80, 0x7F, 0xD9, 0x00, 0x44, 0x4B, 0x00, 0x55, 0x4E, 0x00, 0x55, 0x5B, 0x00, 0x44, 0xC1, 0x80, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DEB, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x9F, 0x00, 0x7F, 0xF1, 0x00, 0x04, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x1F, 0x00, 0x55, 0x50, 0x00, 0x75, 0xDF, 0x80, 0x44, 0x50, 0x00, 0x7F, 0xDF, 0x80, 0x44, 0x40, 0x80, 0x75, 0xEA, 0x80, 0x55, 0x6A, 0x80, 0x55, 0x41, 0x80, 0x44, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DED, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x3E, 0x10, 0x00, 0x49, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x1C, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x49, 0x40, 0x00, 0x00, 0x7F, 0x80, 0x3E, 0x40, 0x00, 0x2A, 0x7F, 0x80, 0x3E, 0x00, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x3E, 0x81, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DEE, { 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x78, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x7F, 0xBF, 0x00, 0x12, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x52, 0xA0, 0x00, 0x1E, 0x3F, 0x80, 0x00, 0x20, 0x00, 0x7F, 0xBF, 0x80, 0x40, 0x80, 0x80, 0x5E, 0xAA, 0x80, 0x52, 0xAA, 0x80, 0x5E, 0x81, 0x80, 0x41, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DEF, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x41, 0x00, 0x55, 0x7F, 0x00, 0x22, 0x41, 0x00, 0x7F, 0x7F, 0x00, 0x22, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x22, 0x40, 0x00, 0x3E, 0x7F, 0x80, 0x08, 0x00, 0x80, 0x2C, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x49, 0x01, 0x80, 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DF0, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x10, 0x00, 0x03, 0xF0, 0x00, 0x08, 0x04, 0x80, 0x79, 0xE7, 0x00, 0x09, 0x24, 0x00, 0x19, 0xE4, 0x80, 0x68, 0x87, 0x80, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DF2, { 0x00, 0x00, 0x00, 0x04, 0x0A, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x7F, 0x80, 0x3F, 0x8C, 0x00, 0x20, 0x8C, 0x80, 0x3F, 0x97, 0x80, 0x14, 0xA0, 0x00, 0x2F, 0xFC, 0x00, 0x0C, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x1A, 0x24, 0x80, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DF3, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC8, 0x00, 0x4A, 0x5F, 0x00, 0x7B, 0xD1, 0x00, 0x4A, 0x5F, 0x00, 0x7B, 0xD1, 0x00, 0x40, 0x5F, 0x00, 0x5F, 0x50, 0x00, 0x51, 0x5F, 0x80, 0x5F, 0x50, 0x00, 0x51, 0x5F, 0x80, 0x5F, 0x40, 0x80, 0x51, 0x6A, 0x80, 0x71, 0x6A, 0x80, 0x63, 0x41, 0x80, 0x40, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DF4, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC8, 0x00, 0x4A, 0x5F, 0x00, 0x7B, 0xD1, 0x00, 0x4A, 0x5F, 0x00, 0x7B, 0xD1, 0x00, 0x40, 0x5F, 0x00, 0x44, 0x50, 0x00, 0x5F, 0x5F, 0x80, 0x44, 0x50, 0x00, 0x4E, 0x5F, 0x80, 0x4E, 0x40, 0x80, 0x55, 0x6A, 0x80, 0x55, 0x6A, 0x80, 0x44, 0x41, 0x80, 0x40, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DF8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x10, 0x00, 0x02, 0x3E, 0x00, 0x3F, 0xE2, 0x00, 0x0C, 0xBE, 0x00, 0x14, 0x22, 0x00, 0x24, 0x3E, 0x00, 0x0C, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x2A, 0xA0, 0x00, 0x33, 0xBF, 0x80, 0x2E, 0xA2, 0x80, 0x2A, 0x85, 0x80, 0x2E, 0x8A, 0x80, 0x2A, 0xA4, 0x80, 0x21, 0xA3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DF9, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x24, 0x00, 0x11, 0x28, 0x00, 0x12, 0x7F, 0x00, 0x16, 0xC8, 0x00, 0x1B, 0x7F, 0x00, 0x12, 0x48, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x7F, 0x80, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x23, 0xFF, 0x80, 0x22, 0xA4, 0x80, 0x24, 0x53, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DFA, { 0x00, 0x00, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0x32, 0x00, 0x04, 0x4C, 0x00, 0x17, 0x33, 0x80, 0x14, 0xDF, 0x00, 0x3F, 0x11, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x44, 0x80, 0x21, 0x25, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DFD, { 0x00, 0x00, 0x00, 0x0A, 0x40, 0x00, 0x39, 0x9C, 0x00, 0x22, 0x44, 0x00, 0x39, 0x9C, 0x00, 0x22, 0x44, 0x00, 0x7F, 0xFE, 0x00, 0x41, 0x02, 0x00, 0x4F, 0xF2, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x10, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x2F, 0xFE, 0x00, 0x69, 0x22, 0x00, 0x44, 0x96, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9DFE, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xBF, 0x00, 0x11, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x7F, 0xE1, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x00, 0x80, 0x04, 0x2A, 0x80, 0x2A, 0xAA, 0x80, 0x29, 0x41, 0x80, 0x47, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E02, { 0x00, 0x00, 0x00, 0x01, 0x84, 0x00, 0x4F, 0x08, 0x00, 0x6A, 0x9F, 0x00, 0x29, 0x51, 0x00, 0x02, 0x1F, 0x00, 0x46, 0x11, 0x00, 0x6C, 0x9F, 0x00, 0x25, 0x10, 0x00, 0x02, 0x5F, 0x80, 0x27, 0xD0, 0x00, 0x2C, 0x5F, 0x80, 0x22, 0x00, 0x80, 0x6F, 0xAA, 0x80, 0x42, 0x2A, 0x80, 0x45, 0x01, 0x80, 0x48, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E07, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC8, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x20, 0x9F, 0x00, 0x2E, 0x91, 0x00, 0x2A, 0x9F, 0x00, 0x2E, 0x90, 0x00, 0x20, 0x9F, 0x80, 0x3F, 0x90, 0x00, 0x11, 0x1F, 0x80, 0x1F, 0x00, 0x80, 0x11, 0x2A, 0x80, 0x1F, 0x2A, 0x80, 0x00, 0x01, 0x80, 0x7F, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E0A, { 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3C, 0x88, 0x00, 0x27, 0xFF, 0x00, 0x24, 0x11, 0x00, 0x26, 0x3F, 0x00, 0x27, 0x71, 0x00, 0x3D, 0x5F, 0x00, 0x23, 0xF0, 0x00, 0x20, 0x9F, 0x80, 0x3C, 0x90, 0x00, 0x67, 0xFF, 0x80, 0x64, 0x80, 0x80, 0x64, 0xAA, 0x80, 0x24, 0xAA, 0x80, 0x3C, 0x81, 0x80, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E0E, { 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x12, 0x12, 0x00, 0x21, 0x21, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E10, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xC8, 0x00, 0x29, 0x5F, 0x00, 0x4A, 0x51, 0x00, 0x29, 0x5F, 0x00, 0x4A, 0x51, 0x00, 0x12, 0x1F, 0x00, 0x24, 0x10, 0x00, 0x7F, 0xDF, 0x80, 0x24, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x24, 0x00, 0x80, 0x3F, 0xAA, 0x80, 0x24, 0x2A, 0x80, 0x24, 0x01, 0x80, 0x3F, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E11, { 0x00, 0x00, 0x00, 0x14, 0x82, 0x80, 0x0B, 0xF2, 0x00, 0x74, 0x0F, 0x80, 0x05, 0xE2, 0x00, 0x1C, 0x07, 0x00, 0x65, 0xE5, 0x00, 0x0D, 0x2D, 0x80, 0x79, 0xE8, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E12, { 0x00, 0x00, 0x00, 0x1C, 0x8E, 0x00, 0x10, 0xE2, 0x00, 0x1C, 0x8E, 0x00, 0x10, 0xE2, 0x00, 0x1D, 0x2E, 0x00, 0x11, 0x22, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0x0C, 0x00, 0x18, 0x86, 0x00, 0x6F, 0xF9, 0x80, 0x08, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x2F, 0xFF, 0x00, 0x64, 0x91, 0x00, 0x42, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E15, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x07, 0x88, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0xD1, 0x00, 0x24, 0x5F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x5F, 0x00, 0x2F, 0xD0, 0x00, 0x2A, 0x9F, 0x80, 0x2F, 0x90, 0x00, 0x2A, 0x9F, 0x80, 0x2F, 0x80, 0x80, 0x20, 0x2A, 0x80, 0x5F, 0xEA, 0x80, 0x55, 0x41, 0x80, 0x3F, 0xE3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E16, { 0x00, 0x00, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xDF, 0x00, 0x44, 0x51, 0x00, 0x77, 0x5F, 0x00, 0x44, 0x51, 0x00, 0x33, 0x1F, 0x00, 0x00, 0x10, 0x00, 0x12, 0x1F, 0x80, 0x3F, 0xD0, 0x00, 0x64, 0x1F, 0x80, 0x3F, 0x80, 0x80, 0x24, 0x2A, 0x80, 0x3F, 0xAA, 0x80, 0x24, 0x01, 0x80, 0x3F, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E19, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x0E, 0x08, 0x00, 0x1B, 0x1F, 0x00, 0x31, 0x91, 0x00, 0x6E, 0xDF, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xDF, 0x00, 0x4A, 0x50, 0x00, 0x7F, 0xDF, 0x80, 0x00, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x2A, 0x80, 0x80, 0x3F, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0x81, 0x80, 0x2A, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E1A, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x88, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0xA0, 0x00, 0x24, 0x7F, 0x80, 0x08, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x11, 0x22, 0x80, 0x32, 0x05, 0x80, 0x0C, 0x0A, 0x80, 0x0A, 0x28, 0x80, 0x31, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E1B, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x7F, 0xC8, 0x00, 0x11, 0x3F, 0x00, 0x3B, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x3B, 0xA1, 0x00, 0x00, 0x3F, 0x00, 0x12, 0x20, 0x00, 0x3F, 0xBF, 0x80, 0x64, 0x20, 0x00, 0x3F, 0x3F, 0x80, 0x24, 0x00, 0x80, 0x3F, 0x2A, 0x80, 0x24, 0x6A, 0x80, 0x3F, 0xC1, 0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E1C, { 0x00, 0x00, 0x00, 0x7B, 0xC4, 0x00, 0x4A, 0x48, 0x00, 0x7B, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x7B, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x7B, 0xDF, 0x00, 0x08, 0x10, 0x00, 0x12, 0x1F, 0x80, 0x3F, 0xD0, 0x00, 0x64, 0x1F, 0x80, 0x3F, 0x80, 0x80, 0x24, 0x2A, 0x80, 0x3F, 0xAA, 0x80, 0x24, 0x01, 0x80, 0x3F, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E1D, { 0x00, 0x00, 0x00, 0x7B, 0xC4, 0x00, 0x00, 0x08, 0x00, 0x7B, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x6B, 0x5F, 0x00, 0x04, 0x11, 0x00, 0x7F, 0xDF, 0x00, 0x4A, 0x10, 0x00, 0x7F, 0xDF, 0x80, 0x4A, 0x50, 0x00, 0x7F, 0xDF, 0x80, 0x52, 0x00, 0x80, 0x5F, 0xAA, 0x80, 0x52, 0x2A, 0x80, 0x56, 0x41, 0x80, 0x39, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E1E, { 0x00, 0x00, 0x00, 0x08, 0xF2, 0x00, 0x10, 0x0C, 0x80, 0x28, 0xF5, 0x00, 0x14, 0x02, 0x80, 0x3F, 0xFF, 0x80, 0x0A, 0x02, 0x00, 0x2A, 0xF6, 0x80, 0x2A, 0x9A, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E1F, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x10, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x09, 0x10, 0x00, 0x09, 0x10, 0x00, 0x08, 0x50, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E20, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x24, 0x00, 0x10, 0xFE, 0x00, 0x14, 0x84, 0x00, 0x7E, 0xA4, 0x00, 0x14, 0x84, 0x00, 0x14, 0x94, 0x00, 0x14, 0x88, 0x00, 0x14, 0x82, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x02, 0x00, 0x15, 0x12, 0x00, 0x26, 0xFA, 0x00, 0x24, 0x02, 0x00, 0x40, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E21, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x44, 0x00, 0x00, 0xFE, 0x00, 0x7E, 0x84, 0x00, 0x02, 0xA4, 0x00, 0x24, 0x84, 0x00, 0x14, 0x94, 0x00, 0x08, 0x88, 0x00, 0x08, 0x82, 0x00, 0x14, 0xFF, 0x00, 0x12, 0x02, 0x00, 0x20, 0x12, 0x00, 0x43, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E22, { 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x02, 0x22, 0x00, 0x01, 0x3F, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x41, 0x00, 0x02, 0x31, 0x00, 0x0F, 0xFF, 0x00, 0x0A, 0x10, 0x00, 0x09, 0x10, 0x00, 0x08, 0x50, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xF2, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E23, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x44, 0x00, 0x3E, 0xFE, 0x00, 0x24, 0x84, 0x00, 0x24, 0xA4, 0x00, 0x24, 0x84, 0x00, 0x24, 0x94, 0x00, 0x24, 0x88, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x3C, 0x02, 0x00, 0x24, 0x12, 0x00, 0x03, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E25, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0x12, 0x00, 0x20, 0x7F, 0x00, 0x21, 0x42, 0x00, 0x31, 0x52, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x4A, 0x00, 0x24, 0x44, 0x00, 0x2A, 0x40, 0x00, 0x29, 0x7F, 0x00, 0x31, 0x01, 0x00, 0x20, 0x09, 0x00, 0x22, 0xFD, 0x00, 0x3F, 0x01, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E26, { 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x7F, 0x44, 0x00, 0x04, 0xFE, 0x00, 0x14, 0x84, 0x00, 0x14, 0xA4, 0x00, 0x24, 0x84, 0x00, 0x7F, 0x94, 0x00, 0x04, 0x88, 0x00, 0x0C, 0x82, 0x00, 0x14, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x44, 0x12, 0x00, 0x05, 0xFA, 0x00, 0x04, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E28, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x24, 0x00, 0x24, 0xFE, 0x00, 0x2C, 0x84, 0x00, 0x30, 0xA4, 0x00, 0x22, 0x84, 0x00, 0x22, 0x94, 0x00, 0x1E, 0x88, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFF, 0x00, 0x7F, 0x02, 0x00, 0x08, 0x12, 0x00, 0x09, 0xFA, 0x00, 0x08, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E29, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x3F, 0xA4, 0x00, 0x29, 0x84, 0x00, 0x4A, 0x94, 0x00, 0x08, 0x88, 0x00, 0x08, 0x82, 0x00, 0x14, 0xFF, 0x00, 0x14, 0x02, 0x00, 0x15, 0x12, 0x00, 0x26, 0xFA, 0x00, 0x24, 0x02, 0x00, 0x40, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E2A, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x84, 0x00, 0x7F, 0xA4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x94, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x82, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x22, 0x12, 0x00, 0x23, 0xFA, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E2B, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x0A, 0xFE, 0x00, 0x7F, 0x84, 0x00, 0x10, 0xA4, 0x00, 0x28, 0x84, 0x00, 0x4A, 0x94, 0x00, 0x7F, 0x88, 0x00, 0x08, 0x82, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x02, 0x00, 0x2A, 0x12, 0x00, 0x49, 0xFA, 0x00, 0x08, 0x02, 0x00, 0x28, 0x0A, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E2C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x0A, 0x24, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xA4, 0x00, 0x3F, 0x84, 0x00, 0x22, 0x94, 0x00, 0x22, 0x88, 0x00, 0x3E, 0x82, 0x00, 0x22, 0xFF, 0x00, 0x20, 0x02, 0x00, 0x20, 0x12, 0x00, 0x21, 0xFA, 0x00, 0x20, 0x02, 0x00, 0x40, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E2D, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x7F, 0xA2, 0x00, 0x49, 0x7F, 0x00, 0x49, 0x42, 0x00, 0x49, 0x52, 0x00, 0x7F, 0x42, 0x00, 0x49, 0x4A, 0x00, 0x49, 0x44, 0x00, 0x49, 0x40, 0x00, 0x7F, 0x7F, 0x00, 0x49, 0x01, 0x00, 0x08, 0x09, 0x00, 0x08, 0xFD, 0x00, 0x08, 0x01, 0x00, 0x08, 0x05, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E2F, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x08, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x05, 0x18, 0x00, 0x1F, 0xF7, 0x00, 0x65, 0x12, 0x00, 0x04, 0x50, 0x00, 0x04, 0x22, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E31, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x24, 0x00, 0x3C, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x28, 0xA4, 0x00, 0x2A, 0x84, 0x00, 0x3F, 0x94, 0x00, 0x24, 0x88, 0x00, 0x24, 0x82, 0x00, 0x24, 0xFF, 0x00, 0x24, 0x02, 0x00, 0x22, 0x12, 0x00, 0x22, 0xFA, 0x00, 0x2A, 0x02, 0x00, 0x35, 0x4A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E32, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x10, 0x24, 0x00, 0x12, 0xFE, 0x00, 0x3F, 0x84, 0x00, 0x42, 0xA4, 0x00, 0x02, 0x84, 0x00, 0x3A, 0x94, 0x00, 0x2A, 0x88, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0xFF, 0x00, 0x3A, 0x02, 0x00, 0x2A, 0x12, 0x00, 0x02, 0xFA, 0x00, 0x04, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E33, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x0F, 0x7E, 0x00, 0x11, 0x44, 0x00, 0x29, 0x54, 0x00, 0x0A, 0x4C, 0x00, 0x04, 0x41, 0x00, 0x09, 0x3F, 0x00, 0x77, 0xF0, 0x00, 0x05, 0x10, 0x00, 0x04, 0x50, 0x00, 0x04, 0x24, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E35, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x10, 0x10, 0x00, 0x3E, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x23, 0x02, 0x00, 0x2A, 0x40, 0x00, 0x24, 0x44, 0x00, 0x20, 0x48, 0x00, 0x3F, 0x70, 0x00, 0x01, 0x40, 0x00, 0x09, 0x40, 0x00, 0x7D, 0x41, 0x00, 0x01, 0x41, 0x00, 0x0A, 0x3F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E36, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x19, 0x64, 0x00, 0x06, 0x18, 0x00, 0x08, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x09, 0x08, 0x00, 0x08, 0x92, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xF2, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E37, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x24, 0x00, 0x7F, 0x7E, 0x00, 0x04, 0x24, 0x00, 0x07, 0x64, 0x00, 0x3C, 0x55, 0x00, 0x04, 0x85, 0x00, 0x0D, 0x03, 0x00, 0x0F, 0xF0, 0x00, 0x09, 0x10, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E38, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x22, 0x00, 0x08, 0x2A, 0x00, 0x3F, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA0, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x21, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E39, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x06, 0x24, 0x00, 0x38, 0xFE, 0x00, 0x08, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x0A, 0x84, 0x00, 0x7F, 0x94, 0x00, 0x08, 0x88, 0x00, 0x0A, 0x82, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x22, 0x12, 0x00, 0x23, 0xFA, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E3A, { 0x00, 0x00, 0x00, 0x09, 0x08, 0x00, 0x09, 0x12, 0x00, 0x09, 0x3F, 0x00, 0x11, 0x22, 0x00, 0x1F, 0xEA, 0x00, 0x31, 0x22, 0x00, 0x53, 0x2A, 0x00, 0x13, 0xA4, 0x00, 0x15, 0x60, 0x00, 0x15, 0x3F, 0x00, 0x19, 0x01, 0x00, 0x11, 0x09, 0x00, 0x11, 0x7D, 0x00, 0x11, 0x01, 0x00, 0x11, 0x05, 0x00, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E3D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x24, 0x00, 0x14, 0xFE, 0x00, 0x14, 0x84, 0x00, 0x12, 0xA4, 0x00, 0x21, 0x94, 0x00, 0x44, 0x94, 0x00, 0x3E, 0x88, 0x00, 0x00, 0x82, 0x00, 0x3E, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x22, 0x12, 0x00, 0x23, 0xFA, 0x00, 0x22, 0x02, 0x00, 0x3E, 0x0A, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E3E, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x28, 0x00, 0x12, 0xA6, 0x00, 0x23, 0x22, 0x00, 0x0F, 0xF0, 0x00, 0x09, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E3F, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x18, 0x24, 0x00, 0x08, 0x7E, 0x00, 0x01, 0x44, 0x00, 0x4F, 0xD4, 0x00, 0x32, 0x44, 0x00, 0x12, 0x54, 0x00, 0x02, 0x48, 0x00, 0x0A, 0x42, 0x00, 0x0A, 0x7F, 0x00, 0x73, 0x82, 0x00, 0x1E, 0x12, 0x00, 0x14, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E41, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x05, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x44, 0x00, 0x24, 0x54, 0x00, 0x3F, 0xC4, 0x00, 0x20, 0xD4, 0x00, 0x41, 0x48, 0x00, 0x1F, 0x42, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x02, 0x00, 0x7F, 0x12, 0x00, 0x05, 0xFA, 0x00, 0x04, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E42, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x00, 0x2A, 0x00, 0x3B, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA0, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0xFD, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E43, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xA2, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x42, 0x00, 0x3F, 0x52, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x4A, 0x00, 0x21, 0x44, 0x00, 0x21, 0x40, 0x00, 0x3F, 0x7F, 0x00, 0x21, 0x01, 0x00, 0x21, 0x09, 0x00, 0x3F, 0xFD, 0x00, 0x21, 0x01, 0x00, 0x25, 0x0A, 0x00, 0x22, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E44, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x24, 0x00, 0x15, 0x7E, 0x00, 0x1F, 0xC4, 0x00, 0x24, 0x54, 0x00, 0x44, 0x44, 0x00, 0x05, 0x54, 0x00, 0x7F, 0xC8, 0x00, 0x00, 0x42, 0x00, 0x1F, 0x7F, 0x00, 0x11, 0x02, 0x00, 0x11, 0x12, 0x00, 0x11, 0xFA, 0x00, 0x11, 0x02, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E45, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1C, 0x24, 0x00, 0x76, 0x7E, 0x00, 0x15, 0x44, 0x00, 0x14, 0x54, 0x00, 0x7F, 0x44, 0x00, 0x14, 0x54, 0x00, 0x14, 0x48, 0x00, 0x1C, 0x40, 0x00, 0x75, 0x7F, 0x00, 0x16, 0x01, 0x00, 0x14, 0x09, 0x00, 0x1A, 0xFD, 0x00, 0x12, 0x01, 0x00, 0x52, 0x8A, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E46, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x14, 0x24, 0x00, 0x22, 0xFE, 0x00, 0x49, 0x84, 0x00, 0x08, 0xA4, 0x00, 0x14, 0x84, 0x00, 0x22, 0x94, 0x00, 0x41, 0x88, 0x00, 0x3E, 0x82, 0x00, 0x22, 0xFF, 0x00, 0x22, 0x02, 0x00, 0x22, 0x12, 0x00, 0x23, 0xFA, 0x00, 0x3E, 0x02, 0x00, 0x22, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E47, { 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x17, 0x92, 0x00, 0x08, 0xBF, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xAA, 0x00, 0x2C, 0xA4, 0x00, 0x2E, 0xA0, 0x00, 0x2D, 0xBF, 0x00, 0x34, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0xFD, 0x00, 0x20, 0x81, 0x00, 0x22, 0x85, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E48, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x0A, 0x12, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0xA2, 0x00, 0x04, 0xAA, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0x2A, 0x00, 0x24, 0x24, 0x00, 0x3F, 0xA0, 0x00, 0x04, 0xBF, 0x00, 0x0C, 0x81, 0x00, 0x0E, 0x89, 0x00, 0x15, 0x7D, 0x00, 0x64, 0x01, 0x00, 0x04, 0x05, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E49, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x03, 0x12, 0x00, 0x3E, 0xBF, 0x00, 0x02, 0x22, 0x00, 0x02, 0x2A, 0x00, 0x7F, 0xA2, 0x00, 0x0A, 0x2A, 0x00, 0x2A, 0x24, 0x00, 0x2E, 0x20, 0x00, 0x2A, 0x3F, 0x00, 0x29, 0x01, 0x00, 0x29, 0x09, 0x00, 0x2F, 0x7D, 0x00, 0x78, 0xC1, 0x00, 0x20, 0x45, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E4A, { 0x00, 0x00, 0x00, 0x12, 0x10, 0x00, 0x12, 0x24, 0x00, 0x12, 0x7E, 0x00, 0x3F, 0x44, 0x00, 0x12, 0x54, 0x00, 0x12, 0x44, 0x00, 0x7F, 0xD4, 0x00, 0x00, 0x48, 0x00, 0x3F, 0x42, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x02, 0x00, 0x3F, 0x0A, 0x00, 0x21, 0xFE, 0x00, 0x21, 0x02, 0x00, 0x3F, 0x0A, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E4B, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x11, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x11, 0x22, 0x00, 0x11, 0x2A, 0x00, 0x00, 0x22, 0x00, 0x3F, 0xAA, 0x00, 0x24, 0xA4, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xBF, 0x00, 0x3F, 0x81, 0x00, 0x24, 0x89, 0x00, 0x24, 0xFD, 0x00, 0x24, 0x81, 0x00, 0x3F, 0x85, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E4C, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x0A, 0x22, 0x00, 0x09, 0x2A, 0x00, 0x14, 0xA2, 0x00, 0x3F, 0xEA, 0x00, 0x64, 0xA4, 0x00, 0x3F, 0xA0, 0x00, 0x24, 0xBF, 0x00, 0x24, 0x81, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x7D, 0x00, 0x05, 0x01, 0x00, 0x06, 0x05, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E4E, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x08, 0x92, 0x00, 0x3F, 0xFF, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xAA, 0x00, 0x3F, 0xA2, 0x00, 0x24, 0xAA, 0x00, 0x28, 0xA4, 0x00, 0x3F, 0xA0, 0x00, 0x08, 0x3F, 0x00, 0x14, 0x81, 0x00, 0x7F, 0xC9, 0x00, 0x04, 0x7D, 0x00, 0x04, 0x01, 0x00, 0x04, 0x05, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E4F, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3B, 0x92, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x3B, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xA0, 0x00, 0x3B, 0xBF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x85, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x81, 0x00, 0x45, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E51, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x05, 0x24, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x44, 0x00, 0x1F, 0x54, 0x00, 0x11, 0x44, 0x00, 0x11, 0x54, 0x00, 0x1F, 0x48, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x7F, 0x00, 0x02, 0x02, 0x00, 0x7F, 0x92, 0x00, 0x04, 0xFA, 0x00, 0x04, 0x02, 0x00, 0x14, 0x0A, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E55, { 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x13, 0x92, 0x00, 0x12, 0xBF, 0x00, 0x7E, 0xA2, 0x00, 0x12, 0xAA, 0x00, 0x13, 0xA2, 0x00, 0x12, 0xAA, 0x00, 0x3A, 0xA4, 0x00, 0x2A, 0xA0, 0x00, 0x2B, 0xBF, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x89, 0x00, 0x3A, 0xFD, 0x00, 0x24, 0x81, 0x00, 0x09, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E57, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3B, 0x92, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA2, 0x00, 0x3B, 0xAA, 0x00, 0x00, 0x22, 0x00, 0x3F, 0xAA, 0x00, 0x00, 0x24, 0x00, 0x7F, 0xE0, 0x00, 0x10, 0x3F, 0x00, 0x1F, 0x01, 0x00, 0x01, 0x09, 0x00, 0x01, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E58, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x24, 0x00, 0x22, 0x7E, 0x00, 0x3A, 0x44, 0x00, 0x2A, 0x54, 0x00, 0x7F, 0x44, 0x00, 0x41, 0x54, 0x00, 0x3E, 0x48, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7F, 0x00, 0x22, 0x02, 0x00, 0x3E, 0x12, 0x00, 0x22, 0xFA, 0x00, 0x22, 0x02, 0x00, 0x2A, 0x14, 0x00, 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E5A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x92, 0x00, 0x11, 0x3F, 0x00, 0x00, 0x22, 0x00, 0x7F, 0xEA, 0x00, 0x00, 0x22, 0x00, 0x11, 0x2A, 0x00, 0x11, 0x24, 0x00, 0x2A, 0xA0, 0x00, 0x7F, 0xBF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xFD, 0x00, 0x7F, 0x81, 0x00, 0x08, 0x85, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E5B, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x3F, 0xD2, 0x00, 0x24, 0xBF, 0x00, 0x24, 0xA2, 0x00, 0x3F, 0xAA, 0x00, 0x20, 0x22, 0x00, 0x2F, 0xAA, 0x00, 0x28, 0xA4, 0x00, 0x28, 0xA0, 0x00, 0x2F, 0xBF, 0x00, 0x28, 0x81, 0x00, 0x2F, 0x89, 0x00, 0x28, 0xFD, 0x00, 0x28, 0x81, 0x00, 0x4F, 0x85, 0x00, 0x08, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E5C, { 0x00, 0x00, 0x00, 0x3E, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x7F, 0xC4, 0x00, 0x19, 0x28, 0x00, 0x2A, 0x10, 0x00, 0x48, 0xA8, 0x00, 0x19, 0x47, 0x00, 0x0F, 0xF0, 0x00, 0x09, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E5E, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x03, 0x92, 0x00, 0x7C, 0x3F, 0x00, 0x20, 0xA2, 0x00, 0x15, 0x2A, 0x00, 0x15, 0x22, 0x00, 0x20, 0x2A, 0x00, 0x3F, 0x24, 0x00, 0x44, 0x20, 0x00, 0x04, 0xBF, 0x00, 0x7F, 0xC1, 0x00, 0x04, 0x09, 0x00, 0x24, 0xFD, 0x00, 0x24, 0x81, 0x00, 0x3F, 0x85, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E63, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x0A, 0x12, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x22, 0x00, 0x3F, 0xAA, 0x00, 0x0A, 0xA2, 0x00, 0x7F, 0xEA, 0x00, 0x0A, 0xA4, 0x00, 0x3F, 0xA0, 0x00, 0x0A, 0x3F, 0x00, 0x1B, 0x01, 0x00, 0x2A, 0x89, 0x00, 0x4A, 0x7D, 0x00, 0x0A, 0x01, 0x00, 0x0A, 0x05, 0x00, 0x0A, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E64, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x24, 0x00, 0x3F, 0xFE, 0x00, 0x29, 0x44, 0x00, 0x48, 0x54, 0x00, 0x14, 0x44, 0x00, 0x3F, 0x54, 0x00, 0x54, 0x48, 0x00, 0x1F, 0x42, 0x00, 0x14, 0x7F, 0x00, 0x1F, 0x02, 0x00, 0x14, 0x12, 0x00, 0x14, 0xFA, 0x00, 0x1F, 0x02, 0x00, 0x10, 0x0A, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E66, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3B, 0x92, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x2A, 0xA2, 0x00, 0x11, 0x2A, 0x00, 0x2A, 0xA4, 0x00, 0x08, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x11, 0x01, 0x00, 0x11, 0x09, 0x00, 0x0A, 0x7D, 0x00, 0x04, 0x01, 0x00, 0x0B, 0x05, 0x00, 0x30, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E67, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x02, 0x92, 0x00, 0x3F, 0xFF, 0x00, 0x29, 0x22, 0x00, 0x29, 0x2A, 0x00, 0x29, 0x22, 0x00, 0x3F, 0xEA, 0x00, 0x29, 0x24, 0x00, 0x29, 0x20, 0x00, 0x2F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x29, 0x09, 0x00, 0x29, 0x7D, 0x00, 0x36, 0x81, 0x00, 0x40, 0x05, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E68, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x77, 0x24, 0x00, 0x11, 0x7E, 0x00, 0x55, 0x44, 0x00, 0x33, 0x54, 0x00, 0x55, 0x44, 0x00, 0x19, 0x54, 0x00, 0x08, 0x48, 0x00, 0x14, 0x42, 0x00, 0x23, 0x7F, 0x00, 0x4D, 0x02, 0x00, 0x30, 0x12, 0x00, 0x0C, 0xFA, 0x00, 0x32, 0x02, 0x00, 0x04, 0x0A, 0x00, 0x38, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E69, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x92, 0x00, 0x7F, 0xFF, 0x00, 0x2A, 0xA2, 0x00, 0x11, 0x2A, 0x00, 0x20, 0xA2, 0x00, 0x5F, 0x6A, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x01, 0x00, 0x04, 0x09, 0x00, 0x15, 0x7D, 0x00, 0x24, 0x81, 0x00, 0x44, 0x45, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E6A, { 0x00, 0x00, 0x00, 0x0A, 0x08, 0x00, 0x0A, 0x12, 0x00, 0x1F, 0xBF, 0x00, 0x12, 0x22, 0x00, 0x32, 0x2A, 0x00, 0x5F, 0xA2, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x24, 0x00, 0x1F, 0xA0, 0x00, 0x12, 0x3F, 0x00, 0x12, 0x01, 0x00, 0x1F, 0x89, 0x00, 0x10, 0x7D, 0x00, 0x2A, 0x81, 0x00, 0x2A, 0x45, 0x00, 0x40, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E6B, { 0x00, 0x00, 0x00, 0x04, 0x14, 0x00, 0x7F, 0xD2, 0x00, 0x11, 0x7F, 0x00, 0x1F, 0x10, 0x00, 0x15, 0x29, 0x00, 0x24, 0xC9, 0x00, 0x4D, 0x07, 0x00, 0x0F, 0xF0, 0x00, 0x09, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x22, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xF2, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E6C, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0x92, 0x00, 0x0A, 0x3F, 0x00, 0x04, 0x22, 0x00, 0x7F, 0xAA, 0x00, 0x0D, 0x22, 0x00, 0x14, 0x2A, 0x00, 0x24, 0xA4, 0x00, 0x3F, 0xE0, 0x00, 0x2A, 0xBF, 0x00, 0x31, 0x81, 0x00, 0x2E, 0x89, 0x00, 0x2A, 0xFD, 0x00, 0x2E, 0x81, 0x00, 0x20, 0x85, 0x00, 0x21, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E6D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3E, 0x7C, 0x00, 0x22, 0xA8, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x28, 0x00, 0x2E, 0xFF, 0x00, 0x28, 0x44, 0x00, 0x7F, 0x7C, 0x00, 0x02, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x09, 0x10, 0x00, 0x08, 0xA2, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xF2, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E70, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x28, 0x00, 0x12, 0x3E, 0x00, 0x16, 0x68, 0x00, 0x1A, 0xBE, 0x00, 0x12, 0x28, 0x00, 0x12, 0x2E, 0x00, 0x10, 0x80, 0x00, 0x13, 0xF8, 0x00, 0x12, 0x48, 0x00, 0x12, 0x10, 0x00, 0x23, 0xFE, 0x00, 0x20, 0x02, 0x00, 0x4F, 0xF2, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E71, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x11, 0xFF, 0x00, 0x3E, 0x54, 0x00, 0x22, 0xFE, 0x00, 0x2B, 0x90, 0x00, 0x22, 0xFE, 0x00, 0x2A, 0x90, 0x00, 0x24, 0xFE, 0x00, 0x20, 0x90, 0x00, 0x3F, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x09, 0x7C, 0x00, 0x7D, 0x24, 0x00, 0x01, 0x18, 0x00, 0x05, 0x24, 0x00, 0x02, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E73, { 0x00, 0x00, 0x00, 0x11, 0x08, 0x00, 0x7F, 0xD2, 0x00, 0x11, 0x3F, 0x00, 0x3B, 0xA2, 0x00, 0x2A, 0xAA, 0x00, 0x3B, 0xA2, 0x00, 0x12, 0x2A, 0x00, 0x1F, 0xA4, 0x00, 0x32, 0x20, 0x00, 0x5F, 0xBF, 0x00, 0x12, 0x01, 0x00, 0x1F, 0x89, 0x00, 0x12, 0x7D, 0x00, 0x12, 0x01, 0x00, 0x1F, 0xC5, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E75, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x45, 0x00, 0x16, 0x29, 0x00, 0x11, 0x95, 0x00, 0x14, 0x63, 0x00, 0x12, 0x31, 0x00, 0x10, 0xC9, 0x00, 0x11, 0x25, 0x00, 0x16, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E78, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x0F, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x08, 0x3E, 0x00, 0x7F, 0x08, 0x00, 0x49, 0x7F, 0x00, 0x41, 0x49, 0x00, 0x55, 0x49, 0x00, 0x49, 0x49, 0x00, 0x6B, 0x7F, 0x00, 0x49, 0x08, 0x00, 0x55, 0x1C, 0x00, 0x41, 0x16, 0x00, 0x49, 0x33, 0x00, 0x7F, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E79, { 0x00, 0x00, 0x00, 0x08, 0x05, 0x00, 0x08, 0x04, 0x80, 0x0F, 0x04, 0x00, 0x08, 0xFF, 0x80, 0x3F, 0x84, 0x00, 0x22, 0xFC, 0x80, 0x36, 0x84, 0x80, 0x2A, 0x84, 0x80, 0x2A, 0xBD, 0x00, 0x3E, 0xAD, 0x00, 0x2A, 0xAE, 0x00, 0x36, 0xBA, 0x00, 0x36, 0x86, 0x00, 0x22, 0x8A, 0x80, 0x3F, 0x11, 0x80, 0x22, 0x60, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E7A, { 0x00, 0x00, 0x00, 0x08, 0x21, 0x00, 0x08, 0x12, 0x00, 0x0F, 0x7F, 0x80, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x3F, 0x00, 0x49, 0x08, 0x00, 0x41, 0x08, 0x00, 0x55, 0x7F, 0x80, 0x49, 0x08, 0x00, 0x6B, 0x10, 0x00, 0x49, 0x3F, 0x00, 0x55, 0x64, 0x00, 0x41, 0x04, 0x00, 0x49, 0x04, 0x00, 0x7F, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E7B, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x24, 0x00, 0x0F, 0x7F, 0x00, 0x08, 0x14, 0x00, 0x08, 0x7F, 0x00, 0x7F, 0x15, 0x00, 0x49, 0x15, 0x00, 0x41, 0x7F, 0x80, 0x55, 0x15, 0x00, 0x49, 0x15, 0x00, 0x6B, 0x7F, 0x00, 0x49, 0x14, 0x00, 0x55, 0x36, 0x00, 0x41, 0x55, 0x00, 0x49, 0x55, 0x80, 0x7F, 0x14, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E7C, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x0F, 0x36, 0x00, 0x08, 0xE3, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x3E, 0x00, 0x49, 0x00, 0x00, 0x41, 0x77, 0x00, 0x55, 0x55, 0x00, 0x49, 0x55, 0x00, 0x6B, 0x77, 0x00, 0x49, 0x00, 0x00, 0x55, 0x22, 0x00, 0x41, 0x22, 0x00, 0x49, 0x77, 0x00, 0x7F, 0x55, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E7D, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x48, 0x00, 0x3F, 0x8F, 0x00, 0x21, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x24, 0x6B, 0x00, 0x24, 0x55, 0x00, 0x3F, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E7E, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x48, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x3E, 0xFE, 0x00, 0x22, 0x20, 0x00, 0x23, 0xFF, 0x00, 0x36, 0x40, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x90, 0x00, 0x36, 0x90, 0x00, 0x23, 0x10, 0x00, 0x22, 0x12, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E7F, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x12, 0x10, 0x00, 0x13, 0xD3, 0x00, 0x12, 0x1C, 0x00, 0x12, 0x10, 0x00, 0x13, 0xF0, 0x80, 0x2E, 0x1F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E80, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0x9F, 0x80, 0x12, 0x00, 0x00, 0x12, 0x1E, 0x00, 0x37, 0xF0, 0x00, 0x22, 0x00, 0x00, 0x63, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E81, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x10, 0x00, 0x1B, 0x20, 0x00, 0x70, 0xC0, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x00, 0x00, 0x12, 0x13, 0x00, 0x33, 0xDE, 0x00, 0x22, 0x10, 0x80, 0x63, 0xD1, 0x80, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E82, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x27, 0x9E, 0x00, 0x64, 0x10, 0x80, 0x0F, 0xDF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x10, 0x80, 0x18, 0x19, 0x80, 0x70, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E83, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xD2, 0x00, 0x12, 0x1C, 0x80, 0x13, 0xD1, 0x80, 0x1E, 0x0F, 0x00, 0x30, 0x00, 0x00, 0x22, 0x92, 0x00, 0x66, 0xDB, 0x00, 0x0C, 0x49, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E84, { 0x00, 0x00, 0x00, 0x02, 0xF0, 0x00, 0x04, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x71, 0x0B, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x38, 0x00, 0x38, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x27, 0x9E, 0x00, 0x64, 0x10, 0x80, 0x0F, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E85, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x37, 0x9E, 0x00, 0x24, 0x10, 0x80, 0x6F, 0xFF, 0x80, 0x04, 0x02, 0x00, 0x0F, 0xE2, 0x00, 0x34, 0x22, 0x00, 0x07, 0xEE, 0x00, 0x04, 0x01, 0x80, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E87, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0x9F, 0x80, 0x11, 0xF8, 0x00, 0x10, 0x20, 0x00, 0x37, 0xFF, 0x00, 0x20, 0xA8, 0x00, 0x61, 0xAC, 0x00, 0x07, 0x27, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E88, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0x9F, 0x80, 0x10, 0x40, 0x00, 0x17, 0xFE, 0x00, 0x30, 0x40, 0x00, 0x23, 0xFC, 0x00, 0x60, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E8B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x37, 0x9E, 0x00, 0x24, 0x10, 0x80, 0x6F, 0x1F, 0x80, 0x10, 0x84, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x90, 0x00, 0x0C, 0x8C, 0x00, 0x70, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E8C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x37, 0x9E, 0x00, 0x24, 0x10, 0x80, 0x67, 0xFF, 0x80, 0x12, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x42, 0x00, 0x7F, 0xFF, 0x80, 0x03, 0x30, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E8E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0xFF, 0x80, 0x34, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x64, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x0D, 0x12, 0x00, 0x19, 0xEF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E8F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x17, 0xFF, 0x80, 0x30, 0x82, 0x00, 0x27, 0xFF, 0x00, 0x61, 0x41, 0x00, 0x06, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E91, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x37, 0x9E, 0x00, 0x24, 0x10, 0x80, 0x6F, 0xBF, 0x80, 0x08, 0x04, 0x00, 0x0F, 0x3C, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x20, 0x80, 0x7C, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E92, { 0x00, 0x00, 0x00, 0x08, 0x12, 0x00, 0x08, 0x12, 0x00, 0x1F, 0x12, 0x00, 0x14, 0x7F, 0x80, 0x24, 0x12, 0x00, 0x04, 0x12, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x15, 0x1E, 0x00, 0x15, 0x12, 0x00, 0x15, 0x12, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x00, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E93, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0E, 0x1C, 0x00, 0x15, 0x2A, 0x00, 0x24, 0x49, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xDF, 0x00, 0x12, 0x10, 0x00, 0x23, 0xD0, 0x80, 0x2C, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E95, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x37, 0x9E, 0x00, 0x24, 0x10, 0x80, 0x7F, 0xFF, 0x80, 0x13, 0xE2, 0x00, 0x10, 0x82, 0x00, 0x17, 0xFA, 0x00, 0x12, 0xA2, 0x00, 0x14, 0x9A, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E96, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0x9F, 0x80, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x31, 0x04, 0x00, 0x21, 0xFC, 0x00, 0x62, 0x22, 0x00, 0x06, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x15, 0x15, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xD3, 0x00, 0x12, 0x1C, 0x00, 0x23, 0xD0, 0x80, 0x2E, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9E98, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0xFF, 0x80, 0x10, 0x20, 0x00, 0x17, 0xFF, 0x00, 0x31, 0x24, 0x00, 0x23, 0xFE, 0x00, 0x6D, 0x05, 0x80, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E9B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9E, 0x00, 0x14, 0x10, 0x80, 0x1F, 0xFF, 0x80, 0x10, 0x91, 0x00, 0x17, 0x9F, 0x00, 0x34, 0x11, 0x00, 0x27, 0x9F, 0x00, 0x60, 0xB1, 0x00, 0x03, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E9D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x88, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x89, 0x00, 0x1F, 0xFF, 0x00, 0x13, 0xCF, 0x00, 0x1F, 0xEF, 0x80, 0x11, 0x39, 0x00, 0x17, 0xC1, 0x00, 0x17, 0xC1, 0x00, 0x14, 0x7F, 0x80, 0x27, 0xC9, 0x00, 0x3C, 0xC5, 0x00, 0x23, 0x41, 0x00, 0x0C, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E9E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x27, 0x9E, 0x00, 0x64, 0x50, 0x80, 0x0F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9E9F, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x3F, 0x2A, 0x00, 0x2A, 0xFF, 0x80, 0x3F, 0x1C, 0x00, 0x2B, 0x2A, 0x00, 0x3F, 0x49, 0x00, 0x2A, 0x88, 0x80, 0x2A, 0x42, 0x00, 0x2F, 0x7F, 0x80, 0x2A, 0x9A, 0x00, 0x2A, 0xAA, 0x00, 0x2B, 0x7F, 0x80, 0x2E, 0x42, 0x00, 0x3A, 0x82, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EA4, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x34, 0x10, 0x00, 0x27, 0x9E, 0x00, 0x64, 0x10, 0x80, 0x3F, 0xFF, 0x80, 0x2A, 0x2A, 0x00, 0x3F, 0xBF, 0x80, 0x2A, 0xAA, 0x80, 0x3F, 0xBF, 0x80, 0x52, 0x52, 0x00, 0x5B, 0x5B, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EA5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0xA1, 0x00, 0x01, 0x10, 0x00, 0x06, 0x4C, 0x00, 0x38, 0xFB, 0x80, 0x03, 0x08, 0x00, 0x0C, 0x90, 0x00, 0x00, 0x60, 0x00, 0x03, 0x98, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EA6, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x3B, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x70, 0x00, 0x0E, 0x1C, 0x00, 0x78, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EA8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x2B, 0x00, 0x5D, 0x69, 0x80, 0x08, 0xC8, 0x00, 0x1C, 0x09, 0x00, 0x2A, 0x09, 0x00, 0x51, 0x3B, 0x00, 0x1E, 0x02, 0x00, 0x22, 0x06, 0x00, 0x56, 0x0C, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x70, 0x00, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EA9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x5D, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x51, 0x08, 0x00, 0x1E, 0x1C, 0x00, 0x22, 0x14, 0x00, 0x56, 0x36, 0x00, 0x0C, 0x63, 0x00, 0x18, 0xC1, 0x80, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EAA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x5D, 0x4F, 0x00, 0x08, 0x49, 0x00, 0x1C, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x51, 0x49, 0x00, 0x1E, 0x7F, 0x00, 0x22, 0x01, 0x00, 0x56, 0x03, 0x00, 0x0C, 0x02, 0x00, 0x18, 0x0E, 0x00, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EAC, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x7F, 0x04, 0x00, 0x2A, 0x04, 0x00, 0x2A, 0x7F, 0x80, 0x5D, 0x44, 0x80, 0x08, 0x45, 0x00, 0x1C, 0x44, 0x00, 0x2A, 0x7F, 0x00, 0x51, 0x51, 0x00, 0x1E, 0x5B, 0x00, 0x22, 0x4A, 0x00, 0x56, 0x4E, 0x00, 0x0C, 0x44, 0x00, 0x18, 0x4E, 0x00, 0x36, 0x9B, 0x00, 0x62, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EAD, { 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x7F, 0x20, 0x00, 0x2A, 0x3F, 0x00, 0x2A, 0x61, 0x00, 0x5D, 0x41, 0x00, 0x08, 0xF9, 0x00, 0x1C, 0x49, 0x00, 0x2A, 0x49, 0x00, 0x51, 0x7B, 0x00, 0x1E, 0x42, 0x00, 0x22, 0x46, 0x00, 0x56, 0x40, 0x80, 0x0C, 0x61, 0x80, 0x18, 0x3F, 0x00, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EAE, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x5D, 0x08, 0x00, 0x08, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x51, 0xFF, 0x80, 0x1E, 0x10, 0x00, 0x22, 0x10, 0x00, 0x56, 0x32, 0x00, 0x0C, 0x22, 0x00, 0x18, 0x2F, 0x00, 0x36, 0x79, 0x00, 0x62, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EAF, { 0x00, 0x00, 0x00, 0x08, 0x14, 0x00, 0x7F, 0x14, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x7F, 0x00, 0x5D, 0x55, 0x00, 0x08, 0x55, 0x00, 0x1C, 0x55, 0x00, 0x2A, 0x7F, 0x00, 0x51, 0x55, 0x00, 0x1E, 0x55, 0x00, 0x22, 0x55, 0x00, 0x56, 0x55, 0x00, 0x0C, 0x7F, 0x00, 0x18, 0x00, 0x00, 0x36, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EB0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7F, 0x10, 0x00, 0x2A, 0x32, 0x00, 0x2A, 0x22, 0x00, 0x5D, 0x7F, 0x00, 0x08, 0x01, 0x00, 0x1C, 0x08, 0x00, 0x2A, 0x48, 0x00, 0x51, 0x7F, 0x00, 0x1E, 0x88, 0x00, 0x22, 0x08, 0x00, 0x56, 0xFF, 0x80, 0x0C, 0x08, 0x00, 0x18, 0x08, 0x00, 0x36, 0x08, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EB3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x08, 0x00, 0x5D, 0x2A, 0x00, 0x08, 0x2A, 0x00, 0x1C, 0x2A, 0x00, 0x2A, 0x7F, 0x00, 0x51, 0x5D, 0x00, 0x1E, 0xC9, 0x80, 0x22, 0x1C, 0x00, 0x56, 0x3E, 0x00, 0x0C, 0x6B, 0x00, 0x18, 0xC9, 0x80, 0x36, 0x88, 0x80, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EB4, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x11, 0x00, 0x15, 0x55, 0x00, 0x15, 0x39, 0x00, 0x15, 0xFF, 0x00, 0x2E, 0xB9, 0x00, 0x04, 0x35, 0x00, 0x07, 0x53, 0x00, 0x09, 0x91, 0x00, 0x1A, 0x12, 0x00, 0x24, 0x0C, 0x00, 0x0A, 0x00, 0x00, 0x31, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EB5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x3F, 0x84, 0x00, 0x04, 0x08, 0x00, 0x15, 0x3F, 0x80, 0x15, 0x2A, 0x80, 0x15, 0x2A, 0x80, 0x2A, 0xAE, 0x80, 0x11, 0x2A, 0x80, 0x25, 0x2E, 0x80, 0x0F, 0xAA, 0x80, 0x10, 0xAA, 0x80, 0x29, 0x3F, 0x80, 0x07, 0x20, 0x00, 0x0D, 0xFF, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EB8, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x80, 0x10, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x32, 0x1C, 0x00, 0x66, 0x14, 0x00, 0x14, 0x36, 0x00, 0x08, 0x63, 0x00, 0x1C, 0xC1, 0x80, 0x37, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EB9, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x81, 0x00, 0x7F, 0x55, 0x00, 0x08, 0x55, 0x00, 0x7F, 0x11, 0x00, 0x10, 0x7D, 0x00, 0x1E, 0x11, 0x00, 0x32, 0x39, 0x00, 0x66, 0x55, 0x00, 0x14, 0x93, 0x00, 0x08, 0x02, 0x00, 0x16, 0x0E, 0x00, 0x33, 0x80, 0x00, 0x60, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EBA, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x7F, 0x08, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x55, 0x00, 0x7F, 0x5D, 0x00, 0x10, 0x55, 0x00, 0x1E, 0x55, 0x00, 0x22, 0x5D, 0x00, 0x36, 0x55, 0x00, 0x5C, 0x55, 0x00, 0x08, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x37, 0x00, 0x00, 0x61, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EBB, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x15, 0x55, 0x00, 0x15, 0x55, 0x00, 0x15, 0x55, 0x00, 0x15, 0x55, 0x00, 0x15, 0x55, 0x00, 0x15, 0x24, 0x80, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EBC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x21, 0x04, 0x00, 0x25, 0x55, 0x00, 0x29, 0x55, 0x80, 0x21, 0x04, 0x00, 0x20, 0x40, 0x00, 0x20, 0x88, 0x00, 0x23, 0x10, 0x00, 0x61, 0xA2, 0x00, 0x40, 0x42, 0x00, 0x41, 0xFF, 0x00, 0x0F, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EBD, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x08, 0x00, 0x13, 0x9C, 0x00, 0x15, 0x6B, 0x00, 0x19, 0x08, 0x00, 0x10, 0x80, 0x00, 0x11, 0x20, 0x00, 0x12, 0x40, 0x00, 0x24, 0x88, 0x00, 0x21, 0x04, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EBE, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x0A, 0x00, 0x15, 0x5A, 0x80, 0x15, 0x6B, 0x80, 0x19, 0x08, 0x00, 0x10, 0x3E, 0x00, 0x13, 0xC0, 0x00, 0x10, 0x7E, 0x00, 0x17, 0xC0, 0x00, 0x10, 0x7F, 0x00, 0x2F, 0xC0, 0x00, 0x20, 0x40, 0x80, 0x20, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EBF, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x04, 0x00, 0x2F, 0xDF, 0x80, 0x23, 0x06, 0x00, 0x25, 0x8D, 0x00, 0x29, 0x54, 0x80, 0x20, 0x00, 0x00, 0x27, 0xFE, 0x00, 0x24, 0x02, 0x00, 0x27, 0xFE, 0x00, 0x60, 0x40, 0x00, 0x4F, 0xFF, 0x00, 0x48, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EC3, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EC4, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x38, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EC6, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x00, 0x24, 0x80, 0x7F, 0xE4, 0x80, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x8E, 0x00, 0x24, 0x8A, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x8A, 0x00, 0x24, 0x9A, 0x00, 0x3F, 0x92, 0x80, 0x11, 0x32, 0x80, 0x60, 0xE1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EC8, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x00, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x3F, 0x80, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EC9, { 0x00, 0x00, 0x00, 0x11, 0x04, 0x00, 0x08, 0x88, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x21, 0x00, 0x4F, 0xFA, 0x00, 0x02, 0x20, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x88, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ECB, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x7F, 0x00, 0x49, 0x22, 0x00, 0x6B, 0x3E, 0x00, 0x2A, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x22, 0x00, 0x34, 0xC1, 0x80, 0x24, 0x00, 0x80, 0x63, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ECC, { 0x00, 0x00, 0x00, 0x05, 0x20, 0x00, 0x1C, 0xCE, 0x00, 0x11, 0x22, 0x00, 0x1C, 0xCE, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x2F, 0xFD, 0x00, 0x02, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x04, 0x08, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ECD, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x58, 0x00, 0x06, 0x47, 0x80, 0x38, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x06, 0x4C, 0x00, 0x01, 0xF0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ECE, { 0x00, 0x00, 0x00, 0x01, 0x90, 0x00, 0x1E, 0x10, 0x00, 0x02, 0x3F, 0x80, 0x3F, 0xE2, 0x80, 0x07, 0x44, 0x80, 0x0A, 0x88, 0x80, 0x12, 0x11, 0x00, 0x22, 0x06, 0x00, 0x00, 0x60, 0x00, 0x01, 0x90, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x06, 0xEC, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ECF, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x07, 0x08, 0x00, 0x3C, 0x08, 0x00, 0x04, 0x08, 0x00, 0x7F, 0xCF, 0x80, 0x0E, 0x08, 0x00, 0x15, 0x08, 0x00, 0x64, 0x88, 0x00, 0x0A, 0x08, 0x00, 0x11, 0x3F, 0x00, 0x64, 0xA1, 0x00, 0x15, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x21, 0x00, 0x64, 0xA1, 0x00, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ED0, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x78, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x7F, 0x55, 0x00, 0x1C, 0x49, 0x00, 0x2A, 0x55, 0x00, 0x49, 0x41, 0x00, 0x1C, 0x7F, 0x00, 0x36, 0x10, 0x00, 0x6B, 0xFF, 0x80, 0x2A, 0x90, 0x80, 0x1C, 0x94, 0x80, 0x2A, 0xBA, 0x80, 0x49, 0x80, 0x80, 0x18, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ED1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x14, 0x45, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ED2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ED4, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xCA, 0x00, 0x12, 0x51, 0x00, 0x1A, 0xE0, 0x80, 0x17, 0x40, 0x00, 0x12, 0x5F, 0x00, 0x1F, 0xC0, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xC0, 0x00, 0x02, 0x3F, 0x80, 0x02, 0x00, 0x80, 0x3F, 0xE1, 0x00, 0x00, 0x41, 0x00, 0x09, 0x21, 0x00, 0x24, 0x82, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9ED5, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x35, 0xBF, 0x80, 0x2D, 0xA4, 0x80, 0x2E, 0xA4, 0x80, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x0E, 0x00, 0x3F, 0x8A, 0x00, 0x04, 0x0A, 0x00, 0x07, 0xCA, 0x00, 0x7C, 0x1A, 0x00, 0x02, 0x92, 0x80, 0x2A, 0xB2, 0x80, 0x48, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ED8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x89, 0x00, 0x35, 0x88, 0x00, 0x2E, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x07, 0x94, 0x00, 0x38, 0x14, 0x00, 0x00, 0x92, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9ED9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x88, 0x00, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x00, 0x3F, 0x9C, 0x00, 0x04, 0x14, 0x00, 0x3F, 0x96, 0x00, 0x04, 0x32, 0x00, 0x07, 0xA3, 0x00, 0x7C, 0x61, 0x80, 0x00, 0x00, 0x00, 0x12, 0x22, 0x00, 0x33, 0x33, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EDB, { 0x00, 0x00, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x4F, 0x80, 0x1B, 0xF0, 0x00, 0x28, 0x18, 0x80, 0x08, 0x07, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x4A, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x12, 0x11, 0x00, 0x22, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EDC, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x95, 0x00, 0x24, 0x95, 0x00, 0x35, 0x95, 0x00, 0x2E, 0x95, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x95, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xA4, 0x80, 0x04, 0x24, 0x80, 0x3F, 0xA4, 0x80, 0x00, 0x24, 0x80, 0x02, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xBF, 0x80, 0x28, 0x20, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EDD, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x49, 0x62, 0x00, 0x6B, 0x42, 0x00, 0x5D, 0xD7, 0x80, 0x49, 0x52, 0x80, 0x49, 0x72, 0x80, 0x7F, 0x22, 0x80, 0x08, 0x22, 0x80, 0x3E, 0x62, 0x80, 0x08, 0x46, 0x80, 0x0E, 0x54, 0x80, 0x78, 0xF4, 0x80, 0x05, 0x15, 0x80, 0x55, 0x0D, 0x00, 0x50, 0x1B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EDE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x88, 0x00, 0x35, 0x88, 0x00, 0x2E, 0x8F, 0x80, 0x3F, 0x88, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x41, 0x00, 0x3F, 0xC1, 0x00, 0x00, 0x41, 0x00, 0x02, 0xC1, 0x00, 0x2A, 0xC1, 0x00, 0x2A, 0xFF, 0x00, 0x28, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EDF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x99, 0x00, 0x35, 0xB1, 0x00, 0x2D, 0xEB, 0x00, 0x2E, 0x86, 0x00, 0x24, 0x8C, 0x00, 0x3F, 0xB8, 0x00, 0x04, 0x04, 0x00, 0x3F, 0x87, 0x80, 0x04, 0x0C, 0x80, 0x07, 0xD8, 0x80, 0x7C, 0x35, 0x80, 0x02, 0x83, 0x00, 0x2A, 0x86, 0x00, 0x48, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EE0, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x35, 0xBF, 0x80, 0x2E, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x1F, 0x00, 0x07, 0xD1, 0x00, 0x7C, 0x11, 0x00, 0x02, 0x91, 0x00, 0x2A, 0x51, 0x00, 0x48, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EE2, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0x44, 0x00, 0x3E, 0xFE, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0x83, 0x00, 0x3F, 0x41, 0x00, 0x08, 0x7C, 0x00, 0x3E, 0x44, 0x00, 0x08, 0xC4, 0x00, 0x7F, 0x28, 0x00, 0x00, 0x10, 0x00, 0x55, 0x28, 0x00, 0x55, 0x47, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EE4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x20, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x44, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xFE, 0x00, 0x3F, 0x93, 0x00, 0x08, 0x92, 0x80, 0x3E, 0xFE, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x78, 0xFE, 0x00, 0x05, 0x10, 0x00, 0x55, 0x11, 0x00, 0x50, 0x0F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EE5, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x35, 0xBF, 0x80, 0x2E, 0x80, 0x00, 0x24, 0x9F, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x04, 0x00, 0x07, 0xD5, 0x00, 0x7C, 0x15, 0x00, 0x02, 0xB5, 0x80, 0x2A, 0xA4, 0x80, 0x48, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EE7, { 0x00, 0x00, 0x00, 0x07, 0x10, 0x00, 0x3C, 0x3F, 0x00, 0x04, 0x69, 0x00, 0x7F, 0x99, 0x00, 0x14, 0x33, 0x00, 0x37, 0x02, 0x00, 0x64, 0x0E, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0A, 0xB4, 0x00, 0x09, 0xC4, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x61, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EE8, { 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x23, 0xF8, 0x80, 0x23, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0A, 0x4A, 0x00, 0x09, 0x52, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x10, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EE9, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x14, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x49, 0x00, 0x3E, 0x2A, 0x00, 0x08, 0x88, 0x00, 0x3E, 0x4A, 0x00, 0x09, 0xFF, 0x00, 0x7E, 0x10, 0x00, 0x00, 0x10, 0x00, 0x55, 0x2C, 0x00, 0x55, 0x43, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EEA, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x3F, 0x20, 0x00, 0x2A, 0x44, 0x00, 0x2A, 0xFE, 0x00, 0x3E, 0x10, 0x00, 0x2A, 0x12, 0x00, 0x2B, 0xFF, 0x00, 0x3E, 0x28, 0x00, 0x08, 0x4C, 0x00, 0x3E, 0x93, 0x00, 0x08, 0x64, 0x00, 0x7F, 0x18, 0x00, 0x00, 0x62, 0x00, 0x55, 0x0C, 0x00, 0x55, 0x30, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EEC, { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x3E, 0x04, 0x80, 0x2A, 0x04, 0x00, 0x3E, 0x7F, 0x80, 0x3E, 0x44, 0x00, 0x2A, 0x74, 0x00, 0x2A, 0x44, 0x80, 0x3E, 0x74, 0x80, 0x08, 0x55, 0x80, 0x3E, 0x55, 0x00, 0x08, 0x57, 0x00, 0x0F, 0x72, 0x00, 0x78, 0x42, 0x80, 0x05, 0x46, 0x80, 0x55, 0x4B, 0x80, 0x50, 0x91, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EED, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x8E, 0x00, 0x24, 0x9B, 0x00, 0x35, 0xB1, 0x80, 0x2D, 0x9F, 0x00, 0x2E, 0x80, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0x80, 0x00, 0x04, 0x0A, 0x00, 0x07, 0xCA, 0x00, 0x7C, 0x3F, 0x80, 0x02, 0x8A, 0x00, 0x2A, 0x5A, 0x00, 0x48, 0x32, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EEE, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x22, 0x00, 0x2A, 0xFF, 0x80, 0x3E, 0x22, 0x00, 0x3E, 0x3E, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x3E, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x54, 0x00, 0x0E, 0x54, 0x00, 0x78, 0x57, 0x00, 0x05, 0x60, 0x00, 0x55, 0x40, 0x00, 0x50, 0x7F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EEF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0xBF, 0x80, 0x35, 0x91, 0x00, 0x2E, 0x9B, 0x00, 0x24, 0x8A, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0x80, 0x00, 0x04, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x07, 0xDF, 0x00, 0x7C, 0x11, 0x00, 0x02, 0x91, 0x00, 0x2A, 0x51, 0x00, 0x48, 0x1F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EF0, { 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x3E, 0x3E, 0x00, 0x2A, 0x20, 0x80, 0x3E, 0x1F, 0x80, 0x3E, 0x00, 0x00, 0x2A, 0x5F, 0x00, 0x2A, 0x51, 0x00, 0x3E, 0x5F, 0x00, 0x08, 0x51, 0x00, 0x3E, 0x5F, 0x00, 0x08, 0x51, 0x00, 0x0E, 0x5F, 0x00, 0x78, 0x40, 0x00, 0x05, 0x7F, 0x80, 0x55, 0x12, 0x00, 0x50, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EF1, { 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x3D, 0x11, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x44, 0x00, 0x27, 0xFF, 0x80, 0x34, 0x82, 0x00, 0x2D, 0xFF, 0x00, 0x26, 0x92, 0x80, 0x24, 0xD6, 0x00, 0x34, 0x92, 0x00, 0x2C, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x10, 0x00, 0x65, 0xFF, 0x00, 0x4D, 0x29, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EF2, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x24, 0x00, 0x2A, 0x3C, 0x00, 0x3E, 0x42, 0x00, 0x3E, 0x94, 0x80, 0x2A, 0xF7, 0x80, 0x2A, 0x08, 0x00, 0x3E, 0x14, 0x00, 0x08, 0x22, 0x00, 0x3E, 0xC9, 0x80, 0x08, 0x10, 0x00, 0x0E, 0x64, 0x00, 0x78, 0x19, 0x00, 0x05, 0x63, 0x00, 0x55, 0x0E, 0x00, 0x50, 0x78, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EF4, { 0x00, 0x00, 0x00, 0x04, 0x42, 0x00, 0x09, 0x52, 0x00, 0x11, 0x54, 0x00, 0x21, 0x57, 0x80, 0x05, 0xF9, 0x00, 0x08, 0x09, 0x00, 0x1B, 0xF9, 0x00, 0x2B, 0x5D, 0x00, 0x0A, 0xED, 0x00, 0x0B, 0xFD, 0x00, 0x08, 0x42, 0x00, 0x0B, 0xFA, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFD, 0x00, 0x0A, 0xAD, 0x00, 0x0A, 0xA8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EF5, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x44, 0x00, 0x2B, 0xFF, 0x80, 0x3E, 0x92, 0x00, 0x3E, 0xE3, 0x80, 0x2A, 0x9E, 0x00, 0x2A, 0x80, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x80, 0x00, 0x3E, 0x9E, 0x00, 0x08, 0x80, 0x00, 0x0E, 0x9E, 0x00, 0x78, 0x80, 0x00, 0x05, 0xBF, 0x00, 0x55, 0x21, 0x00, 0x50, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EF6, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x14, 0x44, 0x00, 0x17, 0xC5, 0x00, 0x14, 0x5F, 0x80, 0x17, 0xC4, 0x00, 0x34, 0x4E, 0x00, 0x27, 0xDB, 0x00, 0x64, 0x41, 0x80, 0x0F, 0xFC, 0x00, 0x0C, 0x8C, 0x00, 0x0A, 0x94, 0x00, 0x09, 0xA4, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x22, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EF7, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x35, 0x9F, 0x00, 0x2E, 0x80, 0x00, 0x24, 0xBF, 0x80, 0x24, 0xAA, 0x80, 0x3F, 0xBF, 0x80, 0x04, 0x11, 0x00, 0x3F, 0x9F, 0x00, 0x04, 0x11, 0x00, 0x07, 0xDF, 0x00, 0x7C, 0x11, 0x00, 0x02, 0x9F, 0x00, 0x2A, 0x8A, 0x00, 0x48, 0x31, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EF8, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x0F, 0x00, 0x2A, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x3E, 0x88, 0x80, 0x2A, 0xBE, 0x00, 0x2A, 0x88, 0x80, 0x3E, 0xBF, 0x80, 0x08, 0xA9, 0x00, 0x3E, 0xBF, 0x00, 0x08, 0xA9, 0x00, 0x0E, 0xBF, 0x00, 0x79, 0x00, 0x00, 0x05, 0x7F, 0x00, 0x55, 0x55, 0x00, 0x50, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EF9, { 0x00, 0x00, 0x00, 0x11, 0x22, 0x00, 0x19, 0x26, 0x00, 0x09, 0x24, 0x00, 0x7F, 0xFF, 0x80, 0x04, 0x88, 0x00, 0x0C, 0x8C, 0x00, 0x18, 0x86, 0x00, 0x7F, 0xFF, 0x80, 0x10, 0x82, 0x00, 0x12, 0xA2, 0x00, 0x12, 0xA2, 0x00, 0x12, 0xA2, 0x00, 0x12, 0xA2, 0x00, 0x12, 0xA2, 0x00, 0x14, 0xA2, 0x00, 0x10, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EFB, { 0x00, 0x00, 0x00, 0x4A, 0x4A, 0x00, 0x6A, 0xC9, 0x00, 0x2A, 0x88, 0x00, 0x7F, 0xDF, 0x80, 0x15, 0x08, 0x00, 0x64, 0xC8, 0x00, 0x04, 0x09, 0x00, 0x7F, 0xC9, 0x00, 0x44, 0x49, 0x00, 0x55, 0x5D, 0x00, 0x55, 0x57, 0x00, 0x55, 0x52, 0x00, 0x55, 0x77, 0x00, 0x65, 0x45, 0x00, 0x44, 0x4D, 0x80, 0x44, 0xD8, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EFC, { 0x00, 0x00, 0x00, 0x4A, 0x45, 0x00, 0x6A, 0xC4, 0x80, 0x2A, 0x9F, 0x80, 0x7F, 0xC4, 0x00, 0x15, 0x04, 0x00, 0x64, 0xDF, 0x80, 0x04, 0x14, 0x80, 0x7F, 0xD4, 0x80, 0x44, 0x5F, 0x80, 0x55, 0x54, 0x80, 0x55, 0x54, 0x80, 0x55, 0x5F, 0x80, 0x55, 0x54, 0x80, 0x65, 0x54, 0x80, 0x44, 0x54, 0x80, 0x44, 0xD5, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9EFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x40, 0x00, 0x7E, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x02, 0x01, 0x00, 0x03, 0x03, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EFE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x10, 0x00, 0x1F, 0xF0, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFC, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x21, 0x08, 0x00, 0x3F, 0xF8, 0x00, 0x21, 0x08, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9EFF, { 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x04, 0x20, 0x00, 0x1C, 0x33, 0x00, 0x70, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x22, 0x44, 0x00, 0x7E, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x02, 0x41, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x1F, 0xF8, 0x00, 0x10, 0x08, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x22, 0x44, 0x00, 0x7E, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x42, 0x42, 0x00, 0x7E, 0x7E, 0x00, 0x02, 0x41, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F03, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x20, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F07, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x08, 0x3F, 0x00, 0x3F, 0xA2, 0x00, 0x08, 0x62, 0x00, 0x3F, 0x54, 0x00, 0x09, 0x8C, 0x00, 0x11, 0x13, 0x80, 0x27, 0x60, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA1, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA0, 0x00, 0x1F, 0xBF, 0x00, 0x1F, 0xA0, 0x80, 0x10, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F08, { 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x24, 0x88, 0x00, 0x04, 0x1F, 0x80, 0x3F, 0xA1, 0x00, 0x2E, 0xD2, 0x00, 0x35, 0x8C, 0x00, 0x24, 0x8A, 0x00, 0x25, 0xB1, 0x80, 0x3F, 0xFF, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x20, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x20, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F09, { 0x00, 0x00, 0x00, 0x1E, 0x3C, 0x00, 0x12, 0x24, 0x00, 0x12, 0x24, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x80, 0x11, 0x22, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x01, 0x20, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F0B, { 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x20, 0x00, 0x3C, 0x1E, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x84, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFD, 0x00, 0x00, 0x81, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F0D, { 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x8A, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x88, 0x00, 0x0F, 0xFA, 0x00, 0x00, 0x82, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F0E, { 0x00, 0x00, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x01, 0x10, 0x00, 0x3F, 0x1F, 0x80, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F0F, { 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x40, 0x00, 0x80, 0x47, 0xF8, 0x80, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x7F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x31, 0x21, 0x00, 0x61, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F10, { 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x06, 0x0F, 0x80, 0x1C, 0x00, 0x80, 0x77, 0xF9, 0x80, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x7F, 0x3F, 0x80, 0x19, 0x22, 0x00, 0x31, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F11, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x10, 0x02, 0x00, 0x1F, 0x3E, 0x00, 0x01, 0x20, 0x00, 0x7F, 0x3F, 0x00, 0x19, 0x21, 0x00, 0x31, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F12, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xF0, 0x00, 0x07, 0x20, 0x00, 0x1C, 0x60, 0x00, 0x07, 0xF8, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x17, 0xFA, 0x00, 0x14, 0x0A, 0x00, 0x1F, 0xFE, 0x00, 0x01, 0x20, 0x00, 0x7F, 0x3F, 0x80, 0x19, 0x22, 0x00, 0x31, 0x22, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F13, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x22, 0x00, 0x11, 0x12, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x88, 0x00, 0x11, 0x14, 0x00, 0x0B, 0xA2, 0x00, 0x3C, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F14, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x0F, 0x80, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x21, 0x00, 0x22, 0x23, 0x00, 0x22, 0x32, 0x00, 0x3E, 0x16, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x08, 0x00, 0x32, 0x1C, 0x00, 0x17, 0x36, 0x00, 0x1C, 0x63, 0x00, 0x70, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F15, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x11, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0xB1, 0x80, 0x01, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x3C, 0x18, 0x00, 0x03, 0xE0, 0x00, 0x7D, 0x1F, 0x80, 0x00, 0xC0, 0x00, 0x00, 0x3C, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F16, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x08, 0x88, 0x00, 0x7F, 0xFF, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x1C, 0x00, 0x14, 0x08, 0x00, 0x17, 0x1C, 0x00, 0x7C, 0x77, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F17, { 0x00, 0x00, 0x00, 0x32, 0x26, 0x00, 0x0E, 0x38, 0x00, 0x32, 0x26, 0x00, 0x06, 0x31, 0x80, 0x7C, 0x1F, 0x00, 0x08, 0x08, 0x00, 0x7F, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x3E, 0x08, 0x00, 0x00, 0x7E, 0x00, 0x3E, 0x22, 0x00, 0x22, 0x36, 0x00, 0x3E, 0x1C, 0x00, 0x14, 0x08, 0x00, 0x17, 0x1C, 0x00, 0x7C, 0x77, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F19, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x11, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0xB1, 0x80, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x84, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x40, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F1A, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x11, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0xB1, 0x80, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x09, 0x1C, 0x00, 0x08, 0xE0, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F1B, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x11, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0xB1, 0x80, 0x19, 0x10, 0x00, 0x73, 0x1E, 0x00, 0x0E, 0x10, 0x00, 0x1B, 0x10, 0x00, 0x77, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F1F, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0x84, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x11, 0x00, 0x0A, 0x0E, 0x00, 0x7F, 0xB1, 0x80, 0x09, 0xE8, 0x00, 0x07, 0x3A, 0x00, 0x1D, 0xEE, 0x00, 0x77, 0xFB, 0x80, 0x04, 0x08, 0x00, 0x07, 0xF8, 0x00, 0x01, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F20, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x3E, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x14, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x10, 0x84, 0x00, 0x14, 0xA4, 0x00, 0x12, 0x94, 0x00, 0x10, 0x84, 0x80, 0x1E, 0xF2, 0x80, 0x31, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F21, { 0x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x31, 0x86, 0x00, 0x18, 0x8C, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x86, 0x00, 0x30, 0x82, 0x80, 0x20, 0x83, 0x80, 0x60, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F22, { 0x00, 0x00, 0x00, 0x30, 0x1C, 0x00, 0x67, 0x04, 0x00, 0x41, 0x14, 0x00, 0x77, 0x16, 0x00, 0x41, 0x32, 0x00, 0x7F, 0x63, 0x00, 0x00, 0xC1, 0x80, 0x49, 0x3E, 0x00, 0x6D, 0x12, 0x00, 0x5B, 0x12, 0x00, 0x49, 0x12, 0x00, 0x6D, 0x32, 0x00, 0x5B, 0x22, 0x00, 0x49, 0x26, 0x00, 0x5B, 0x64, 0x00, 0x6D, 0xCC, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F26, { 0x00, 0x00, 0x00, 0x18, 0x3F, 0x00, 0x33, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3B, 0x99, 0x00, 0x20, 0x91, 0x00, 0x3F, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x24, 0x9F, 0x00, 0x36, 0x91, 0x00, 0x2D, 0x91, 0x00, 0x24, 0x91, 0x00, 0x36, 0x91, 0x00, 0x2D, 0x9F, 0x00, 0x24, 0xC0, 0x80, 0x37, 0x61, 0x80, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F2A, { 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x33, 0xA4, 0x00, 0x20, 0xA4, 0x00, 0x3B, 0xBF, 0x80, 0x20, 0xE4, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x24, 0x9F, 0x00, 0x36, 0x84, 0x00, 0x2D, 0x84, 0x00, 0x24, 0x84, 0x00, 0x36, 0xBF, 0x80, 0x2D, 0x80, 0x00, 0x24, 0xC0, 0x80, 0x37, 0x61, 0x80, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F2B, { 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x33, 0xBF, 0x80, 0x20, 0x88, 0x00, 0x3B, 0x88, 0x00, 0x20, 0x98, 0x00, 0x3F, 0x90, 0x00, 0x00, 0x1F, 0x00, 0x24, 0xB1, 0x00, 0x36, 0xF1, 0x00, 0x2D, 0xD1, 0x00, 0x24, 0x91, 0x00, 0x36, 0x91, 0x00, 0x2D, 0x9F, 0x00, 0x24, 0xC0, 0x80, 0x37, 0x61, 0x80, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F2C, { 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x33, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3B, 0xBF, 0x80, 0x20, 0xA4, 0x80, 0x3F, 0xA4, 0x80, 0x00, 0x24, 0x80, 0x24, 0xBF, 0x80, 0x36, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x24, 0xA4, 0x80, 0x36, 0xBF, 0x80, 0x24, 0x80, 0x00, 0x24, 0xC0, 0x80, 0x36, 0x61, 0x80, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F2F, { 0x00, 0x00, 0x00, 0x18, 0x3F, 0x00, 0x33, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3B, 0xBF, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x7F, 0x80, 0x24, 0x80, 0x00, 0x36, 0xBF, 0x00, 0x2D, 0xA1, 0x00, 0x24, 0xA1, 0x00, 0x36, 0xA1, 0x00, 0x2D, 0xBF, 0x00, 0x24, 0xC0, 0x80, 0x37, 0x61, 0x80, 0x6C, 0x3F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F31, { 0x00, 0x00, 0x00, 0x30, 0x08, 0x00, 0x67, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x77, 0x3E, 0x00, 0x41, 0x08, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x49, 0x3E, 0x00, 0x6D, 0x2A, 0x00, 0x5B, 0x2A, 0x00, 0x49, 0x2A, 0x00, 0x6D, 0x3E, 0x00, 0x5B, 0x22, 0x00, 0x49, 0x22, 0x00, 0x5B, 0x22, 0x00, 0x6D, 0xA6, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F32, { 0x00, 0x00, 0x00, 0x30, 0xFF, 0x80, 0x67, 0x80, 0x80, 0x41, 0x88, 0x80, 0x77, 0x7F, 0x00, 0x41, 0x08, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x49, 0x00, 0x49, 0x49, 0x00, 0x6D, 0x7F, 0x00, 0x5B, 0x49, 0x00, 0x49, 0x49, 0x00, 0x6D, 0x7F, 0x00, 0x5B, 0x08, 0x00, 0x49, 0xFF, 0x80, 0x5B, 0x08, 0x00, 0x6D, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F34, { 0x00, 0x00, 0x00, 0x30, 0x7F, 0x80, 0x67, 0x40, 0x00, 0x41, 0x5F, 0x00, 0x77, 0x51, 0x00, 0x41, 0x5F, 0x00, 0x7F, 0x51, 0x00, 0x00, 0x5F, 0x00, 0x49, 0x48, 0x00, 0x6D, 0x7F, 0x80, 0x5B, 0x51, 0x00, 0x49, 0x4E, 0x00, 0x6D, 0x51, 0x00, 0x5B, 0x7F, 0x80, 0x49, 0x80, 0x80, 0x6E, 0xC1, 0x80, 0x58, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F37, { 0x00, 0x00, 0x00, 0x30, 0x07, 0x00, 0x67, 0x7C, 0x00, 0x41, 0x29, 0x00, 0x77, 0x45, 0x80, 0x41, 0x08, 0x00, 0x7F, 0x32, 0x00, 0x00, 0x14, 0x80, 0x49, 0x7F, 0x80, 0x6D, 0x08, 0x00, 0x5B, 0x7F, 0x80, 0x49, 0x14, 0x00, 0x6D, 0x36, 0x00, 0x5B, 0x63, 0x00, 0x49, 0x80, 0x80, 0x6E, 0xC1, 0x80, 0x58, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F39, { 0x00, 0x00, 0x00, 0x30, 0x7F, 0x00, 0x67, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x77, 0x41, 0x00, 0x41, 0x7F, 0x00, 0x7F, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x49, 0x90, 0x80, 0x6D, 0x7F, 0x00, 0x5B, 0x12, 0x00, 0x49, 0x26, 0x00, 0x6D, 0x1C, 0x00, 0x5B, 0x63, 0x00, 0x49, 0x80, 0x80, 0x6E, 0xC1, 0x80, 0x58, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F3A, { 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x33, 0x9F, 0x00, 0x20, 0x95, 0x00, 0x3B, 0x95, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x95, 0x00, 0x00, 0x15, 0x00, 0x24, 0x9F, 0x00, 0x36, 0x80, 0x00, 0x2D, 0xBB, 0x80, 0x24, 0xAA, 0x80, 0x36, 0xAA, 0x80, 0x2D, 0xBB, 0x80, 0x24, 0xAA, 0x80, 0x2D, 0xAA, 0x80, 0x76, 0xFB, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F3B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F3C, { 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x1F, 0x01, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x97, 0x00, 0x24, 0x9D, 0x00, 0x3F, 0xB1, 0x00, 0x00, 0x01, 0x00, 0x7F, 0xC1, 0x00, 0x11, 0x01, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F3D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x3E, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x0A, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x8A, 0x00, 0x3F, 0x9A, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x11, 0x32, 0x80, 0x21, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F3E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x7F, 0xC4, 0x00, 0x11, 0x04, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F3F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x0A, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x0A, 0x00, 0x1F, 0x0A, 0x00, 0x11, 0x0A, 0x00, 0x3F, 0x8A, 0x00, 0x24, 0x9A, 0x00, 0x3F, 0x92, 0x00, 0x24, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x00, 0x12, 0x00, 0x7F, 0xD2, 0x00, 0x11, 0x32, 0x80, 0x21, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F41, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x1F, 0x80, 0x1F, 0x30, 0x80, 0x11, 0x20, 0x80, 0x1F, 0x7E, 0x80, 0x11, 0x12, 0x80, 0x3F, 0x92, 0x80, 0x24, 0x92, 0x80, 0x3F, 0x92, 0x80, 0x24, 0x9E, 0x80, 0x3F, 0x80, 0x80, 0x00, 0x00, 0x80, 0x7F, 0xC1, 0x80, 0x11, 0x01, 0x00, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F43, { 0x00, 0x00, 0x00, 0x04, 0x3F, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x1F, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x3F, 0x90, 0x00, 0x24, 0xBF, 0x80, 0x3F, 0xE4, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xAA, 0x80, 0x00, 0x31, 0x80, 0x7F, 0xBE, 0x80, 0x11, 0x01, 0x80, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F44, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x11, 0x3F, 0x80, 0x1F, 0x04, 0x00, 0x11, 0x0E, 0x00, 0x1F, 0x15, 0x00, 0x11, 0x15, 0x00, 0x3F, 0xA4, 0x80, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x00, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x11, 0x11, 0x00, 0x21, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F45, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x3E, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xBE, 0x00, 0x24, 0x8A, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xFF, 0x80, 0x3F, 0x88, 0x00, 0x00, 0x1C, 0x00, 0x7F, 0xD6, 0x00, 0x11, 0x33, 0x00, 0x21, 0x61, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F46, { 0x00, 0x00, 0x00, 0x04, 0x24, 0x80, 0x1F, 0x49, 0x00, 0x11, 0x92, 0x00, 0x1F, 0x49, 0x00, 0x11, 0x24, 0x80, 0x1F, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x3F, 0xBF, 0x00, 0x24, 0x80, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xA4, 0x80, 0x00, 0x3F, 0x80, 0x7F, 0xE0, 0x00, 0x11, 0x20, 0x80, 0x21, 0x1F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F47, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x1F, 0x07, 0x80, 0x11, 0x04, 0x00, 0x1F, 0x3F, 0x80, 0x11, 0x24, 0x80, 0x1F, 0x2F, 0x00, 0x11, 0x24, 0x80, 0x3F, 0xA7, 0x80, 0x24, 0xA0, 0x00, 0x3F, 0xAF, 0x00, 0x24, 0xA9, 0x00, 0x3F, 0xAF, 0x00, 0x00, 0x29, 0x00, 0x7F, 0xEF, 0x00, 0x11, 0x29, 0x00, 0x21, 0x5F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F4A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x13, 0x00, 0x1F, 0xAE, 0x00, 0x05, 0x4A, 0x80, 0x09, 0x49, 0x00, 0x37, 0x4F, 0x00, 0x00, 0x58, 0x80, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x10, 0x02, 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F4B, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x13, 0x00, 0x1F, 0xAC, 0x00, 0x05, 0x4A, 0x00, 0x05, 0x49, 0x00, 0x09, 0x4E, 0x80, 0x36, 0x58, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x41, 0x00, 0x12, 0x49, 0x00, 0x24, 0x45, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F4E, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x13, 0x00, 0x1F, 0xAC, 0x00, 0x05, 0x4A, 0x00, 0x09, 0x4F, 0x00, 0x36, 0x58, 0x80, 0x0B, 0xF9, 0x00, 0x0A, 0x09, 0x00, 0x0B, 0xF9, 0x00, 0x08, 0x01, 0x00, 0x0B, 0xF9, 0x00, 0x0A, 0x09, 0x00, 0x13, 0xF9, 0x00, 0x13, 0xF9, 0x00, 0x26, 0x0D, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F4F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x80, 0x02, 0x20, 0x00, 0x3D, 0x5F, 0x00, 0x14, 0x92, 0x00, 0x6C, 0x99, 0x80, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xFE, 0x00, 0x11, 0x22, 0x00, 0x17, 0x3A, 0x00, 0x11, 0x22, 0x00, 0x37, 0x3A, 0x00, 0x21, 0x22, 0x00, 0x67, 0xFA, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F50, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x84, 0x00, 0x3F, 0xFE, 0x00, 0x04, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, 0x40, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x17, 0x00, 0x64, 0x12, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F51, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x0C, 0x18, 0x00, 0x03, 0x60, 0x00, 0x00, 0x80, 0x00, 0x07, 0x70, 0x00, 0x79, 0x4F, 0x00, 0x17, 0x74, 0x00, 0x11, 0x44, 0x00, 0x17, 0x74, 0x00, 0x11, 0x44, 0x00, 0x17, 0x74, 0x00, 0x11, 0x44, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F52, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x12, 0x95, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x12, 0x95, 0x00, 0x14, 0x25, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F53, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x17, 0x90, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x7F, 0xD0, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x35, 0x90, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x35, 0x90, 0x80, 0x20, 0x99, 0x80, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F54, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0x90, 0x00, 0x14, 0x10, 0x00, 0x14, 0x11, 0x00, 0x7F, 0xD3, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x90, 0x00, 0x35, 0x90, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x2A, 0x90, 0x00, 0x35, 0x90, 0x80, 0x20, 0x99, 0x80, 0x3F, 0x8F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F55, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x17, 0x90, 0x00, 0x14, 0x3F, 0x80, 0x14, 0x20, 0x00, 0x7F, 0xE0, 0x00, 0x2A, 0x9F, 0x80, 0x2A, 0x83, 0x00, 0x35, 0x86, 0x00, 0x20, 0x8C, 0x00, 0x3F, 0x98, 0x00, 0x2A, 0xB0, 0x00, 0x2A, 0xA0, 0x00, 0x35, 0xA0, 0x80, 0x20, 0xB1, 0x80, 0x3F, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F56, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x80, 0x17, 0x91, 0x00, 0x14, 0x11, 0x00, 0x14, 0x11, 0x00, 0x7F, 0xD1, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xFF, 0x80, 0x35, 0x85, 0x00, 0x20, 0x85, 0x00, 0x3F, 0x8D, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x99, 0x00, 0x35, 0x91, 0x00, 0x20, 0xB1, 0x00, 0x3F, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F57, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x04, 0x06, 0x00, 0x17, 0x9C, 0x00, 0x14, 0x10, 0x00, 0x14, 0x10, 0x00, 0x7F, 0xDF, 0x80, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x35, 0x92, 0x00, 0x20, 0x92, 0x00, 0x3F, 0x92, 0x00, 0x2A, 0xB2, 0x00, 0x2A, 0xA2, 0x00, 0x35, 0xE2, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F58, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x2F, 0x14, 0x00, 0x28, 0x36, 0x00, 0x28, 0x63, 0x00, 0x7F, 0xE3, 0x80, 0x55, 0x22, 0x00, 0x55, 0x22, 0x00, 0x6B, 0x22, 0x00, 0x41, 0x22, 0x00, 0x7F, 0x22, 0x00, 0x55, 0x62, 0x00, 0x55, 0x42, 0x00, 0x6B, 0x42, 0x00, 0x41, 0xC2, 0x00, 0x7F, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F5A, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x17, 0x88, 0x00, 0x14, 0x1F, 0x80, 0x14, 0x34, 0x00, 0x7F, 0xE4, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x87, 0x80, 0x35, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x2A, 0x87, 0x80, 0x2A, 0x84, 0x00, 0x35, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F5D, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x17, 0x98, 0x00, 0x14, 0x10, 0x00, 0x14, 0x11, 0x00, 0x7F, 0xB1, 0x00, 0x2A, 0xA7, 0x80, 0x2A, 0xFC, 0x80, 0x35, 0x80, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x35, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F5E, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x17, 0xA0, 0x80, 0x14, 0x20, 0x80, 0x14, 0x20, 0x80, 0x7F, 0xE0, 0x80, 0x2A, 0xA0, 0x80, 0x2A, 0xA0, 0x80, 0x35, 0xBF, 0x80, 0x20, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x35, 0x9B, 0x00, 0x20, 0x91, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F5F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x14, 0x11, 0x00, 0x17, 0x91, 0x00, 0x14, 0x11, 0x00, 0x3F, 0xDF, 0x00, 0x00, 0x11, 0x00, 0x20, 0x91, 0x00, 0x35, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x35, 0x9F, 0x00, 0x2A, 0x91, 0x00, 0x35, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F60, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x3F, 0x80, 0x17, 0x88, 0x80, 0x14, 0x08, 0x80, 0x14, 0x08, 0x80, 0x7F, 0xD9, 0x80, 0x2A, 0x91, 0x00, 0x2A, 0xB7, 0x00, 0x35, 0x80, 0x00, 0x20, 0x9F, 0x00, 0x3F, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x35, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F61, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x0A, 0x00, 0x0B, 0xD1, 0x00, 0x0A, 0x20, 0x80, 0x0A, 0x00, 0x00, 0x0A, 0x1F, 0x00, 0x3F, 0xE0, 0x00, 0x10, 0x40, 0x00, 0x15, 0x5F, 0x80, 0x15, 0x48, 0x80, 0x15, 0x48, 0x80, 0x1A, 0xC8, 0x80, 0x10, 0x48, 0x80, 0x10, 0x4B, 0x00, 0x1F, 0xC8, 0x00, 0x10, 0x48, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F62, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x14, 0x1C, 0x00, 0x17, 0x94, 0x00, 0x14, 0x36, 0x00, 0x14, 0x63, 0x00, 0x7F, 0xDD, 0x80, 0x20, 0x80, 0x00, 0x35, 0x80, 0x00, 0x2E, 0xBF, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x89, 0x00, 0x2E, 0x8B, 0x00, 0x35, 0x88, 0x00, 0x20, 0x88, 0x00, 0x3F, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F63, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x10, 0x00, 0x17, 0x9F, 0x80, 0x14, 0x30, 0x80, 0x14, 0x20, 0x80, 0x7F, 0xFE, 0x80, 0x2A, 0x92, 0x80, 0x2A, 0x92, 0x80, 0x35, 0x92, 0x80, 0x20, 0x92, 0x80, 0x3F, 0x9E, 0x80, 0x2A, 0x80, 0x80, 0x2A, 0x80, 0x80, 0x35, 0x81, 0x80, 0x20, 0x81, 0x00, 0x3F, 0x87, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F66, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x1F, 0x00, 0x17, 0x91, 0x00, 0x14, 0x11, 0x00, 0x14, 0x1F, 0x00, 0x7F, 0xD1, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0x9F, 0x00, 0x35, 0x94, 0x00, 0x20, 0x94, 0x80, 0x3F, 0x95, 0x80, 0x2A, 0x97, 0x00, 0x2A, 0x92, 0x00, 0x35, 0x93, 0x00, 0x20, 0x9D, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F67, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x09, 0x00, 0x1F, 0x11, 0x00, 0x04, 0x26, 0x00, 0x3F, 0xC0, 0x00, 0x04, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x12, 0x00, 0x0A, 0xAA, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0A, 0xAA, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F68, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x17, 0x98, 0x00, 0x14, 0x33, 0x80, 0x14, 0x20, 0x80, 0x7F, 0xE0, 0x80, 0x2A, 0xA0, 0x80, 0x2A, 0xA0, 0x80, 0x35, 0xBB, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xA0, 0x80, 0x2A, 0xA0, 0x80, 0x2A, 0xA0, 0x80, 0x35, 0xA0, 0x80, 0x20, 0xBF, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F69, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x17, 0x84, 0x00, 0x14, 0x3F, 0x80, 0x14, 0x0A, 0x00, 0x7F, 0xDB, 0x00, 0x2A, 0xB1, 0x80, 0x2A, 0x80, 0x00, 0x35, 0x91, 0x00, 0x20, 0x91, 0x00, 0x3F, 0x9B, 0x00, 0x2A, 0x8E, 0x00, 0x2A, 0x84, 0x00, 0x35, 0x8E, 0x00, 0x20, 0x9B, 0x00, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F6A, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x12, 0x1F, 0x00, 0x13, 0x91, 0x00, 0x12, 0x11, 0x00, 0x12, 0x11, 0x00, 0x3F, 0xDF, 0x00, 0x00, 0x04, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x35, 0x97, 0x80, 0x3F, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x2A, 0x94, 0x00, 0x35, 0xB4, 0x00, 0x3F, 0xCF, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F6C, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x7F, 0x80, 0x17, 0x88, 0x00, 0x14, 0x08, 0x00, 0x14, 0x3F, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x11, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xFF, 0x80, 0x35, 0x80, 0x00, 0x3F, 0xBF, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x35, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F6D, { 0x00, 0x00, 0x00, 0x08, 0x33, 0x00, 0x08, 0x66, 0x00, 0x2F, 0x44, 0x00, 0x28, 0x44, 0x00, 0x28, 0x74, 0x00, 0x7F, 0xD7, 0x80, 0x55, 0x55, 0x00, 0x55, 0x55, 0x00, 0x6B, 0x75, 0x00, 0x41, 0x45, 0x00, 0x7F, 0x45, 0x00, 0x55, 0x4D, 0x00, 0x55, 0xC9, 0x00, 0x6B, 0x89, 0x00, 0x41, 0x89, 0x00, 0x7F, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F6E, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x17, 0xBF, 0x80, 0x14, 0x0A, 0x00, 0x14, 0x1B, 0x00, 0x7F, 0xF1, 0x80, 0x2A, 0x80, 0x00, 0x2A, 0xBF, 0x80, 0x35, 0x81, 0x00, 0x20, 0x9D, 0x00, 0x3F, 0x95, 0x00, 0x2A, 0x95, 0x00, 0x2A, 0x95, 0x00, 0x35, 0x9D, 0x00, 0x20, 0x81, 0x00, 0x3F, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F6F, { 0x00, 0x00, 0x00, 0x04, 0x18, 0x00, 0x04, 0x31, 0x80, 0x17, 0xA0, 0x80, 0x14, 0x20, 0x80, 0x14, 0x3B, 0x80, 0x7F, 0xE0, 0x80, 0x2A, 0xA0, 0x80, 0x2A, 0xA0, 0x80, 0x35, 0xBF, 0x80, 0x20, 0x8A, 0x00, 0x3F, 0x8A, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x9A, 0x00, 0x35, 0x92, 0x00, 0x20, 0x92, 0x80, 0x3F, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F70, { 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x04, 0x12, 0x00, 0x17, 0x7F, 0x80, 0x14, 0x12, 0x00, 0x14, 0x12, 0x00, 0x7F, 0x92, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x80, 0x00, 0x35, 0x80, 0x00, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x2A, 0xA1, 0x00, 0x2A, 0xBF, 0x00, 0x35, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F71, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x2F, 0x50, 0x00, 0x28, 0x50, 0x00, 0x28, 0x5F, 0x80, 0x7F, 0x74, 0x80, 0x55, 0x54, 0x80, 0x55, 0x55, 0x80, 0x6B, 0x55, 0x00, 0x41, 0x77, 0x00, 0x7F, 0x52, 0x00, 0x55, 0x52, 0x00, 0x55, 0x57, 0x00, 0x6B, 0x75, 0x00, 0x41, 0xD9, 0x80, 0x7F, 0x10, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F72, { 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x14, 0x3E, 0x00, 0x17, 0x88, 0x00, 0x14, 0x3F, 0x00, 0x14, 0x29, 0x00, 0x7F, 0xE9, 0x00, 0x2A, 0xBF, 0x00, 0x2A, 0x88, 0x00, 0x35, 0xBF, 0x80, 0x20, 0xA8, 0x80, 0x3F, 0xAA, 0x80, 0x2A, 0xAE, 0x80, 0x2A, 0xBA, 0x80, 0x35, 0xA0, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F73, { 0x00, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x20, 0x80, 0x17, 0xA4, 0x80, 0x14, 0x1F, 0x00, 0x14, 0x04, 0x00, 0x7F, 0xFF, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x35, 0xBF, 0x80, 0x20, 0xA4, 0x80, 0x3F, 0xA4, 0x80, 0x2A, 0xBF, 0x80, 0x2A, 0x84, 0x00, 0x35, 0xBF, 0x80, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F75, { 0x00, 0x00, 0x00, 0x04, 0x3F, 0x80, 0x04, 0x24, 0x80, 0x17, 0xA4, 0x80, 0x14, 0x3F, 0x80, 0x14, 0x24, 0x80, 0x7F, 0xE4, 0x80, 0x2A, 0xBF, 0x80, 0x2A, 0x84, 0x00, 0x35, 0x84, 0x00, 0x20, 0xBF, 0x80, 0x3F, 0xA4, 0x80, 0x2A, 0xA5, 0x80, 0x2A, 0xA7, 0x80, 0x35, 0xBD, 0x80, 0x20, 0xA0, 0x80, 0x3F, 0xA1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F76, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x14, 0x3B, 0x80, 0x17, 0xAA, 0x80, 0x14, 0x2A, 0x80, 0x14, 0x3B, 0x80, 0x7F, 0xC0, 0x00, 0x2A, 0x9F, 0x00, 0x2A, 0x80, 0x00, 0x35, 0xBF, 0x80, 0x20, 0x84, 0x00, 0x3F, 0x88, 0x00, 0x2A, 0x9F, 0x00, 0x2A, 0x81, 0x00, 0x35, 0x81, 0x00, 0x20, 0x83, 0x00, 0x3F, 0x8E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F77, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x3F, 0x80, 0x0A, 0x20, 0x80, 0x0B, 0xBF, 0x80, 0x0A, 0x20, 0x00, 0x3F, 0xFF, 0x80, 0x10, 0xA4, 0x00, 0x1B, 0xA9, 0x00, 0x14, 0xB3, 0x80, 0x1B, 0xBC, 0x80, 0x10, 0xA4, 0x00, 0x19, 0xA4, 0x00, 0x16, 0xBF, 0x00, 0x19, 0xA4, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F7A, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x3F, 0x80, 0x17, 0x48, 0x80, 0x14, 0x2A, 0x80, 0x14, 0x2A, 0x80, 0x7F, 0xBE, 0x80, 0x2A, 0x91, 0x80, 0x2A, 0xA3, 0x00, 0x35, 0x90, 0x00, 0x20, 0xBF, 0x80, 0x3F, 0xC8, 0x80, 0x2A, 0xAA, 0x80, 0x2A, 0xAA, 0x80, 0x35, 0xBE, 0x80, 0x20, 0x91, 0x80, 0x3F, 0xA3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F7D, { 0x00, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x2E, 0xFF, 0x80, 0x28, 0x22, 0x00, 0x28, 0x77, 0x00, 0x7F, 0xAA, 0x80, 0x55, 0x22, 0x00, 0x55, 0x00, 0x00, 0x6B, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x55, 0x08, 0x00, 0x55, 0x2A, 0x00, 0x6B, 0x6B, 0x00, 0x41, 0xC9, 0x80, 0x7F, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F7F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x90, 0x00, 0x08, 0xF8, 0x00, 0x08, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x82, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x11, 0x44, 0x00, 0x12, 0x34, 0x00, 0x14, 0x14, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F80, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x15, 0x20, 0x00, 0x17, 0xA0, 0x00, 0x14, 0x20, 0x00, 0x14, 0xA2, 0x00, 0x7F, 0xE6, 0x00, 0x00, 0x28, 0x00, 0x24, 0xB0, 0x00, 0x24, 0xA0, 0x00, 0x24, 0xA0, 0x00, 0x2A, 0xA0, 0x00, 0x31, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0x9F, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F83, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x15, 0x3F, 0x00, 0x17, 0xA2, 0x00, 0x14, 0x22, 0x00, 0x14, 0xA2, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x22, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xA2, 0x00, 0x24, 0xBE, 0x00, 0x2A, 0xA2, 0x00, 0x31, 0xA2, 0x00, 0x20, 0xA2, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F84, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x14, 0x10, 0x00, 0x14, 0x28, 0x00, 0x17, 0xA8, 0x00, 0x14, 0x44, 0x00, 0x14, 0xA7, 0x00, 0x7F, 0x92, 0x00, 0x00, 0x10, 0x00, 0x24, 0x80, 0x00, 0x24, 0xFE, 0x00, 0x24, 0x82, 0x00, 0x2A, 0x84, 0x00, 0x31, 0xA8, 0x00, 0x20, 0x90, 0x00, 0x3F, 0x88, 0x00, 0x20, 0x88, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F85, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x28, 0x42, 0x00, 0x2E, 0xFF, 0x00, 0x29, 0x02, 0x00, 0x28, 0x12, 0x00, 0x7F, 0xFA, 0x00, 0x00, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0xF2, 0x00, 0x2A, 0x8A, 0x00, 0x36, 0x84, 0x00, 0x22, 0x81, 0x00, 0x22, 0x81, 0x00, 0x3E, 0x7F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F86, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x28, 0x22, 0x00, 0x2E, 0x22, 0x00, 0x28, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x7F, 0x4A, 0x00, 0x00, 0x84, 0x00, 0x2A, 0x00, 0x00, 0x2A, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x36, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x02, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F87, { 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x08, 0x28, 0x00, 0x28, 0x28, 0x00, 0x2E, 0xA8, 0x00, 0x28, 0xA9, 0x00, 0x2A, 0xBA, 0x00, 0x7F, 0xAC, 0x00, 0x00, 0xA8, 0x00, 0x2A, 0xA8, 0x00, 0x2A, 0xA8, 0x00, 0x2A, 0xA8, 0x00, 0x36, 0xA8, 0x00, 0x22, 0xA8, 0x00, 0x22, 0xB9, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F88, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x84, 0x00, 0x2E, 0x84, 0x00, 0x28, 0xFC, 0x00, 0x2A, 0x84, 0x00, 0x7F, 0x84, 0x00, 0x00, 0xFC, 0x00, 0x2A, 0xA2, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0x98, 0x00, 0x36, 0x90, 0x00, 0x22, 0x88, 0x00, 0x22, 0xA7, 0x00, 0x3E, 0xC2, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F89, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0xFE, 0x00, 0x28, 0x10, 0x00, 0x2E, 0x14, 0x00, 0x28, 0xFE, 0x00, 0x2A, 0x24, 0x00, 0x7F, 0x24, 0x00, 0x00, 0x24, 0x00, 0x2B, 0xFF, 0x00, 0x2A, 0x02, 0x00, 0x2A, 0x7F, 0x00, 0x36, 0x42, 0x00, 0x22, 0x42, 0x00, 0x22, 0x42, 0x00, 0x3E, 0x7E, 0x00, 0x02, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F8A, { 0x00, 0x00, 0x00, 0x08, 0x04, 0x00, 0x08, 0x7E, 0x00, 0x28, 0x44, 0x00, 0x2E, 0x44, 0x00, 0x28, 0x44, 0x00, 0x2A, 0x44, 0x00, 0x7F, 0x7C, 0x00, 0x00, 0x50, 0x00, 0x2A, 0x14, 0x00, 0x2A, 0x5E, 0x00, 0x2A, 0x50, 0x00, 0x36, 0x50, 0x00, 0x22, 0x50, 0x00, 0x22, 0xB3, 0x00, 0x3F, 0x1E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F8B, { 0x00, 0x00, 0x00, 0x08, 0x06, 0x00, 0x09, 0xF8, 0x00, 0x08, 0x12, 0x00, 0x2E, 0xFF, 0x00, 0x28, 0x92, 0x00, 0x28, 0x92, 0x00, 0x7E, 0xFE, 0x00, 0x00, 0x10, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x92, 0x00, 0x2A, 0x92, 0x00, 0x36, 0xAA, 0x00, 0x22, 0xBA, 0x00, 0x3E, 0x82, 0x00, 0x22, 0x8A, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F8C, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFF, 0x00, 0x28, 0x82, 0x00, 0x2E, 0x82, 0x00, 0x28, 0xFE, 0x00, 0x2A, 0x80, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x90, 0x00, 0x2A, 0xA4, 0x00, 0x2A, 0xFE, 0x00, 0x2A, 0x88, 0x00, 0x36, 0xBE, 0x00, 0x22, 0x88, 0x00, 0x22, 0x8A, 0x00, 0x3F, 0x7F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F8D, { 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x02, 0x10, 0x00, 0x1F, 0xDF, 0x80, 0x08, 0x90, 0x00, 0x08, 0x9F, 0x80, 0x3F, 0xE0, 0x80, 0x00, 0x00, 0x80, 0x1F, 0xDF, 0x80, 0x10, 0x50, 0x00, 0x1F, 0xD0, 0x00, 0x10, 0x5F, 0x80, 0x1F, 0xD0, 0x00, 0x10, 0x5F, 0x80, 0x10, 0x50, 0x00, 0x10, 0x50, 0x80, 0x11, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F8F, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1E, 0x00, 0x11, 0x10, 0x80, 0x13, 0x0F, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x06, 0x08, 0x00, 0x1C, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F90, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x90, 0x00, 0x12, 0x9F, 0x00, 0x1F, 0xE1, 0x00, 0x10, 0x1F, 0x00, 0x17, 0xD0, 0x00, 0x14, 0x5F, 0x00, 0x17, 0xD0, 0x00, 0x14, 0x5F, 0x00, 0x17, 0xD0, 0x00, 0x24, 0x5F, 0x00, 0x24, 0x50, 0x80, 0x24, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F91, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1E, 0x00, 0x11, 0x10, 0x80, 0x13, 0x0F, 0x80, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x07, 0x1C, 0x00, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F92, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1E, 0x00, 0x11, 0x10, 0x80, 0x13, 0x0F, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x06, 0x4C, 0x00, 0x1C, 0xC7, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F94, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xDF, 0x00, 0x11, 0x01, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1E, 0x00, 0x11, 0x10, 0x80, 0x13, 0x0F, 0x80, 0x02, 0x10, 0x00, 0x0F, 0xFC, 0x00, 0x02, 0x10, 0x00, 0x3F, 0xFF, 0x00, 0x06, 0x18, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F95, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x30, 0x00, 0x07, 0xFC, 0x00, 0x38, 0x03, 0x80, 0x03, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x03, 0xF8, 0x00, 0x1F, 0xBF, 0x00, 0x09, 0x24, 0x00, 0x3F, 0xFF, 0x00, 0x10, 0x81, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA0, 0x00, 0x1F, 0xBF, 0x00, 0x10, 0xA0, 0x80, 0x11, 0xBF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F96, { 0x00, 0x00, 0x00, 0x12, 0x12, 0x00, 0x12, 0x12, 0x00, 0x7F, 0xFF, 0x80, 0x2A, 0x2A, 0x00, 0x2B, 0xAB, 0x80, 0x7C, 0xFC, 0x80, 0x03, 0x83, 0x80, 0x3A, 0x3A, 0x00, 0x2B, 0xAB, 0x80, 0x2A, 0x2A, 0x00, 0x3B, 0xBB, 0x80, 0x2A, 0x2A, 0x00, 0x2B, 0xAB, 0x80, 0x3A, 0x3A, 0x00, 0x2A, 0xAA, 0x80, 0x29, 0xA9, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F97, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x2F, 0x5E, 0x80, 0x00, 0x00, 0x00, 0x1C, 0xE7, 0x00, 0x04, 0x10, 0x00, 0x3F, 0x9F, 0x80, 0x11, 0x10, 0x00, 0x7F, 0xCF, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x1F, 0x00, 0x1F, 0x10, 0x80, 0x11, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F99, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x20, 0x00, 0x01, 0x10, 0x00, 0x01, 0x02, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x01, 0x44, 0x00, 0x02, 0x44, 0x00, 0x02, 0x48, 0x00, 0x02, 0x50, 0x00, 0x04, 0x60, 0x00, 0x04, 0x41, 0x00, 0x08, 0xC1, 0x00, 0x0B, 0x41, 0x00, 0x10, 0x3F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F9A, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x0A, 0x00, 0x7F, 0xFF, 0x00, 0x02, 0x80, 0x00, 0x02, 0xB2, 0x00, 0x04, 0xC2, 0x00, 0x19, 0x7E, 0x00, 0x64, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x04, 0x10, 0x00, 0x0C, 0x0C, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F9B, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x1F, 0xFC, 0x00, 0x60, 0x03, 0x00, 0x0F, 0xF8, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x12, 0x00, 0x7F, 0xFF, 0x00, 0x01, 0x40, 0x00, 0x02, 0x50, 0x00, 0x02, 0x60, 0x00, 0x04, 0xC2, 0x00, 0x09, 0x42, 0x00, 0x30, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9F9C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x31, 0x42, 0x00, 0x1F, 0x7E, 0x00, 0x3D, 0x40, 0x00, 0x05, 0x7F, 0x00, 0x3F, 0xE3, 0x00, 0x05, 0x55, 0x00, 0x3D, 0x5D, 0x00, 0x05, 0x63, 0x00, 0x3F, 0x7F, 0x00, 0x05, 0x40, 0x00, 0x3D, 0x40, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F9D, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x1C, 0xF8, 0x00, 0x71, 0x10, 0x00, 0x17, 0xFE, 0x00, 0x12, 0x52, 0x00, 0x7F, 0xDE, 0x00, 0x11, 0x50, 0x00, 0x17, 0xFF, 0x00, 0x39, 0x51, 0x00, 0x37, 0x5B, 0x00, 0x50, 0x55, 0x00, 0x57, 0x5B, 0x00, 0x11, 0x51, 0x00, 0x17, 0xFF, 0x00, 0x11, 0x40, 0x80, 0x17, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F9E, { 0x00, 0x00, 0x00, 0x24, 0x88, 0x00, 0x7F, 0xCF, 0x80, 0x44, 0x59, 0x00, 0x55, 0x45, 0x00, 0x55, 0x46, 0x00, 0x07, 0xF9, 0x80, 0x0C, 0x10, 0x00, 0x7F, 0xFE, 0x00, 0x11, 0x42, 0x00, 0x3F, 0x7E, 0x00, 0x09, 0x40, 0x00, 0x7F, 0xFF, 0x00, 0x09, 0x4D, 0x00, 0x7F, 0xFF, 0x00, 0x09, 0x40, 0x80, 0x39, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9F9F, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x10, 0x44, 0x00, 0x3F, 0xFE, 0x00, 0x50, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x85, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9FA0, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x0E, 0x3C, 0x00, 0x7B, 0xE7, 0x80, 0x00, 0x00, 0x00, 0x3D, 0xEF, 0x00, 0x25, 0x29, 0x00, 0x3D, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x12, 0x22, 0x00, 0x12, 0x26, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9FA1, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x08, 0x00, 0x1B, 0x08, 0x00, 0x31, 0x8F, 0x80, 0x6E, 0xD8, 0x80, 0x00, 0x15, 0x80, 0x7F, 0xF5, 0x00, 0x4A, 0x44, 0x00, 0x7F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x8E, 0x00, 0x2A, 0x8A, 0x00, 0x3F, 0x8A, 0x00, 0x2A, 0x9B, 0x00, 0x2A, 0x91, 0x00, 0x2A, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x9FA2, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x0E, 0x07, 0x80, 0x1B, 0x3C, 0x00, 0x31, 0x84, 0x00, 0x6E, 0xC4, 0x00, 0x00, 0x3F, 0x80, 0x7F, 0xC4, 0x00, 0x4A, 0x4E, 0x00, 0x7F, 0xCE, 0x00, 0x00, 0x15, 0x00, 0x3F, 0x95, 0x00, 0x2A, 0x95, 0x80, 0x3F, 0xB4, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0xA4, 0x80, 0x2A, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9FA3, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0E, 0x0F, 0x80, 0x1B, 0x18, 0x80, 0x31, 0x91, 0x80, 0x6E, 0xDF, 0x00, 0x00, 0x02, 0x00, 0x7F, 0xFF, 0x80, 0x4A, 0x44, 0x00, 0x7F, 0xE4, 0x80, 0x00, 0x35, 0x80, 0x3F, 0x95, 0x00, 0x2A, 0x8E, 0x00, 0x3F, 0x97, 0x00, 0x2A, 0xB5, 0x80, 0x2A, 0xE4, 0x80, 0x2A, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x9FA5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0E, 0x3F, 0x80, 0x1B, 0x04, 0x00, 0x31, 0x9F, 0x00, 0x6E, 0xD1, 0x00, 0x00, 0x11, 0x00, 0x7F, 0xDF, 0x00, 0x4A, 0x51, 0x00, 0x7F, 0xD1, 0x00, 0x00, 0x1F, 0x00, 0x3F, 0x91, 0x00, 0x2A, 0x91, 0x00, 0x3F, 0x9F, 0x00, 0x2A, 0x8A, 0x00, 0x2A, 0x9B, 0x00, 0x2A, 0xB1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xAC00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x0C, 0x04, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x09, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAC9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x09, 0x00, 0x01, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x01, 0x39, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x09, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xACFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAD9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xADFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x02, 0x44, 0x00, 0x02, 0x44, 0x00, 0x02, 0x47, 0x00, 0x04, 0x84, 0x00, 0x04, 0x84, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x12, 0x04, 0x00, 0x24, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x4F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x12, 0x09, 0x00, 0x24, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x02, 0x44, 0x00, 0x02, 0x47, 0x00, 0x02, 0x44, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x12, 0x04, 0x00, 0x24, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAE9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x87, 0x00, 0x04, 0x84, 0x00, 0x04, 0x87, 0x00, 0x08, 0x84, 0x00, 0x11, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x49, 0x00, 0x02, 0x4F, 0x00, 0x02, 0x49, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x12, 0x09, 0x00, 0x24, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x04, 0x89, 0x00, 0x04, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x02, 0x42, 0x00, 0x02, 0x42, 0x00, 0x02, 0x5E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x12, 0x02, 0x00, 0x24, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAECA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAECB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAECC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAECD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAECE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAECF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x49, 0x00, 0x02, 0x49, 0x00, 0x02, 0x79, 0x00, 0x04, 0x89, 0x00, 0x04, 0x89, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x12, 0x09, 0x00, 0x24, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAED9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x04, 0x89, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x02, 0x42, 0x00, 0x02, 0x5E, 0x00, 0x02, 0x42, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x12, 0x02, 0x00, 0x24, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAEFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x04, 0x82, 0x00, 0x04, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x02, 0x49, 0x00, 0x02, 0x79, 0x00, 0x02, 0x49, 0x00, 0x04, 0x89, 0x00, 0x04, 0xF9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x12, 0x09, 0x00, 0x24, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x04, 0x89, 0x00, 0x04, 0xB9, 0x00, 0x08, 0x89, 0x00, 0x11, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x10, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAF9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x04, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xAFFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB001, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB002, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB003, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB004, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB005, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB006, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB007, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB008, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB009, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB00A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB00B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x10, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB00C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB00D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB00E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB00F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB010, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB011, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB012, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB013, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB014, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB015, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB016, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB017, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB018, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB019, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB01A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB01B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB01C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB01D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB01E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB01F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB023, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB024, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB027, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB028, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB029, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB02A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB02B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB02C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB02D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB02E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB02F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB031, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB037, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB038, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB03A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB03B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB03C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB03D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB03E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB03F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB040, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB042, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB046, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB048, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB04A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB04B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB04C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB04D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB04E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB04F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB051, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB052, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB053, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB054, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB055, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB056, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB057, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB058, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB059, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB05A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB05B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB05C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB05D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB05E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB05F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB060, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x04, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB061, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB062, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB064, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB066, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB068, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB069, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB06A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB06B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB06C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB06D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB06E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB06F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB070, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB071, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB072, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB073, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB07A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB07B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x10, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB07C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x02, 0x42, 0x00, 0x02, 0x42, 0x00, 0x02, 0x42, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x12, 0x02, 0x00, 0x24, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB07D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB07E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB07F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB080, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB082, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB083, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB084, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB085, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB086, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB087, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB088, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB089, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB08A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB08B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB08C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB08D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB08E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB08F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB090, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB091, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB092, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB093, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB094, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB095, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB096, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB097, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x08, 0x82, 0x00, 0x11, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB098, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB099, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB09A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB09B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB09C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB09D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB09E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB09F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB0FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB100, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB101, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB102, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB106, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB108, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB10A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB10B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB10C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB10D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB10E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB10F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB112, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB114, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB11A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB11B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB11C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB11D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB11E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB11F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB120, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB124, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB125, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB128, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB12A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB12B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB12C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB12D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB12E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB12F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB130, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB134, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB139, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB13A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB13B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB13C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB13D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB13E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB13F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB143, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB147, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB14A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB14B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB14C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB14D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB14E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB14F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB150, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB151, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB152, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB154, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB156, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB158, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB159, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB15A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB15B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB15C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB15D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB15E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB15F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB160, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB164, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB168, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB16A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB16B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB16C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB16D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB16E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB16F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB174, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB176, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB179, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB17A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB17B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB17C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB17D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB17E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB17F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB180, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB181, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB184, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB185, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB186, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB187, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB189, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB18A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB18B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB18C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB18D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB18E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB18F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB193, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB194, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB19A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB19B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB19C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB19D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB19E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB19F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB1FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB204, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB20A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB20B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB20C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB20D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB20E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB20F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB210, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB214, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB216, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB21A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB21B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB21C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB21D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB21E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB21F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB221, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB226, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB22A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB22B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB22C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB22D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB22E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB22F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB230, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB231, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB232, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB233, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB234, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB235, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB236, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB238, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB239, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB23A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB23B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB23C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB23D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB23E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB23F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB240, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB241, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB242, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB243, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB244, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB245, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB246, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB247, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB248, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB249, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB24A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB24B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB24C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB24D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB24E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB24F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB250, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB251, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB253, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB255, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB256, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB257, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB258, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB259, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB25A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB25B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB25C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB25D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB25E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB25F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB26A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB26B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB26C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB26D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB26E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB26F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB27A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB27B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB27C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB27D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB27E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB27F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB281, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB284, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB287, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB288, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB289, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB28A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB28B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB28C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB28D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB28E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB28F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB290, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB291, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB292, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB293, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB294, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB295, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB296, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB297, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB298, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB29A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB29B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB29C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB29D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB29E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB29F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB2FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB300, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB301, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB302, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB303, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB304, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB305, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB306, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB307, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB308, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB309, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB30A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB30B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB30C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB30D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB30E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB30F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB310, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB311, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB312, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB313, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB314, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB315, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB316, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB317, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB318, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB319, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB31A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB31B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB31C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB31D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB31E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB31F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB321, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB322, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB324, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB326, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB329, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB32A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB32B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB32C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB32D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB32E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB32F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB330, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB334, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB335, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB336, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB337, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB33A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB33B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB33C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB33D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB33E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB33F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB340, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB341, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB342, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB343, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB344, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB345, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB346, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB347, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB348, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB349, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB34A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB34B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB34C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB34D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB34E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB34F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB350, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB351, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB352, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB353, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB354, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB355, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB356, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB357, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB358, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB359, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB35A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB35B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB35C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB35D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB35E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB35F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB360, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB361, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB362, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB363, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB364, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB365, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB366, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB367, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB368, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB369, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB36A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB36B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB36C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB36D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB36E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB36F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB370, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB371, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB372, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB373, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB374, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB375, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB376, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB377, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB378, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB379, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB37A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB37B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB37C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB37D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB37E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB37F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB380, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB381, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB382, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB383, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB385, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB386, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB387, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB388, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB389, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB38A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB38B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB38C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB38D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB38E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB38F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB39A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB39B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB39C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB39D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB39E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB39F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB3FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB400, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB402, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB403, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB407, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB40A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB40B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB40C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB40D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB40E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB40F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB410, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB411, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB414, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB415, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB419, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB41A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB41B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB41C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB41D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB41E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB41F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB420, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB421, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB423, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB424, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB425, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB427, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB428, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB42A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB42B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB42C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB42D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB42E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB42F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB430, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB432, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB435, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB437, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB439, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB43A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB43B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB43C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB43D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB43E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB43F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB447, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB44A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB44B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB44C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB44D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB44E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB44F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB450, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB451, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB452, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB453, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB454, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB456, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB457, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB458, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB45A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB45B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB45C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB45D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB45E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB45F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB460, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB463, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB464, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB466, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB467, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB46A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB46B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB46C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB46D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB46E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB46F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB470, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB471, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB472, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB473, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB476, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB478, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB479, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB47A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB47B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB47C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB47D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB47E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB47F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB481, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB483, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB484, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB485, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB487, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB48A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB48B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB48C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB48D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB48E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB48F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB490, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB496, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB497, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB49A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB49B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB49C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB49D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB49E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB49F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB4FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB502, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB503, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB506, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB507, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB509, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB50A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB50B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB50C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB50D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB50E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB50F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB510, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB511, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB512, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB513, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB514, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB515, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB516, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB517, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB518, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB519, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB51A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB51B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB51C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB51D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB51E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB51F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB520, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB521, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB522, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB523, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB524, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB525, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB526, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB527, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB528, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB529, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB52A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB52B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB52C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB52D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB52E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB52F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x07, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB534, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB535, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB536, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB537, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB538, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB539, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB53A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB53B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB53C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB53D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB53E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB53F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB540, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB541, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB542, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB543, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB545, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB546, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB547, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB548, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB549, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB54A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB54B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB54C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x0F, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB54D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB54E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB54F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB551, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB552, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB553, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB554, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB555, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB556, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB557, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB558, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB559, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB55A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB55B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB55C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB55D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB55E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB55F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB560, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB561, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB562, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB563, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB564, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB565, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB566, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB567, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB568, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x22, 0x04, 0x00, 0x22, 0x07, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x22, 0x07, 0x00, 0x22, 0x04, 0x00, 0x22, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB569, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB56A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB56B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB56C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB56D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB56E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB56F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB570, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB571, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB572, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB573, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB574, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB575, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB576, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB579, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB57A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB57B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB57C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB57D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB57E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB57F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB580, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x24, 0x07, 0x00, 0x24, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB584, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x22, 0x09, 0x00, 0x22, 0x0F, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x0F, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB586, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB587, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB588, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB589, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB58A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB58B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB58C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB58D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB58E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB58F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB590, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB591, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB592, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB593, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB594, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB595, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB596, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB597, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB598, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB599, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB59A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB59B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB59C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB59D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB59E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB59F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x24, 0x0F, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x1E, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x79, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x09, 0x00, 0x24, 0x79, 0x00, 0x24, 0x09, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x22, 0x02, 0x00, 0x22, 0x1E, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x1E, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x24, 0x1E, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x22, 0x09, 0x00, 0x22, 0x79, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x22, 0x79, 0x00, 0x22, 0x09, 0x00, 0x22, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB5FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB600, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB601, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB602, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB603, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB604, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB605, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB606, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB607, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB608, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB609, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB60A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB60B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB60C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB60D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB60E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB60F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x24, 0x39, 0x00, 0x24, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB610, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB611, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB612, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB613, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB614, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB615, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB616, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB617, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB618, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB619, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB61A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB61B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB61C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB61D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB61E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB61F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB620, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB621, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB622, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB623, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB624, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB625, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB626, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB627, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB628, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB629, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB62A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB62B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB62C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB62D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB62E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB62F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB630, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB631, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB632, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB633, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB634, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB635, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB636, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB637, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB638, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB639, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB63A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB63B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB63C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB63D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB63E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB63F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB640, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB641, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB642, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB643, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB644, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB645, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB646, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB647, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x04, 0x00, 0x12, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB648, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB649, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB64A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB64B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB64C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB64D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB64E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB64F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB650, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB651, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB652, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB653, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB654, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB655, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB656, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB657, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB658, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB659, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB65A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB65B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB65C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB65D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB65E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB65F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB660, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB661, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB662, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB663, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB664, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB665, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB666, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB667, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB668, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB669, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB66A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB66B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB66C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB66D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB66E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB66F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB670, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB671, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB672, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB673, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB674, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB675, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB676, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB677, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB678, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB679, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB67A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB67B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB67C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB67D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB67E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB67F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB680, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB681, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB682, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB683, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB684, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB685, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB686, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB687, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB688, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB689, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB68A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB68B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB68C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB68D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB68E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB68F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB690, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB691, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB692, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB693, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB694, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB695, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB696, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB697, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB698, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB699, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB69A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB69B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB69C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB69D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB69E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB69F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x09, 0x00, 0x12, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB6FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB701, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB702, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB703, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB704, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB705, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB706, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB707, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB708, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB709, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB70A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB70B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB70C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB70D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB70E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB70F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB710, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB711, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB712, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB713, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB714, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB715, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB716, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB717, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB718, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB719, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB71A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB71B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB71C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB71D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB71E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB71F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB720, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB721, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB722, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB723, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB724, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB725, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB726, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB727, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB728, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x10, 0x80, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB729, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB72A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB72B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB72C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB72D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB72E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB72F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB730, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB731, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB732, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB733, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB734, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB735, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB736, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB737, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB738, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB739, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB73A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB73B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB73C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB73D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB73E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB73F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB740, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB741, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB742, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB743, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x10, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB744, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB745, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB746, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB747, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB748, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB749, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB74A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB74B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB74C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB74D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB74E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB74F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB750, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB751, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB752, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB753, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB754, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB755, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB756, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB757, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB758, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB759, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB75A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB75B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB75C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB75D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB75E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB75F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x02, 0x00, 0x12, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB760, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x22, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB761, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB762, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB763, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB764, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB765, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB766, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB767, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB768, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB769, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB76A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB76B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB76C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB76D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB76E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB76F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB770, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB771, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB772, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB773, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB774, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB775, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB776, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB777, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB778, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB779, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB77A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB77B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x24, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB77C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB77D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB77E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB77F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB780, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB781, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB782, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB783, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB784, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB785, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB786, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB787, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB788, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB789, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB78A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB78B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB78C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB78D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB78E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB78F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB790, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB791, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB792, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB793, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB794, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB795, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB796, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB797, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB798, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB799, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB79A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB79B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB79C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB79D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB79E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB79F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB7FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB800, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB801, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB802, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB803, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB804, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB805, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB806, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB807, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB808, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB809, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB80A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB80B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB80C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB80D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB80E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB80F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB810, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB811, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB812, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB813, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB814, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB815, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB816, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB817, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB818, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB819, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB81A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB81B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB81C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB81D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB81E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB81F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB820, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB821, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB822, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB823, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB824, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB825, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB826, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB827, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB828, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB829, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB82A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB82B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB82C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB82D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB82E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB82F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB830, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB831, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB832, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB833, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB834, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB835, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB836, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB837, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB838, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB839, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB83A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB83B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB83C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB83D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB83E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB83F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB840, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB841, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB842, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB843, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB844, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB845, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB846, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB847, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB848, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB849, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB84A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB84B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB84C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB84D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB84E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB84F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB850, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB851, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB852, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB853, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB854, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB855, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB856, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB857, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB858, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB859, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB85A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB85B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB85C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB85D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB85E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB85F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB860, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB861, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB862, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB863, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB864, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB865, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB866, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB867, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB868, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB869, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB86A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB86B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB86C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB86D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB86E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB86F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB870, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB871, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB872, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB873, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB874, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB875, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB876, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB877, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB878, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB879, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB87A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB87B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB87C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB87D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB87E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB87F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB880, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB881, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB882, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB883, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB884, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB885, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB886, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB887, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB888, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB889, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB88A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB88B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB88C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB88D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB88E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB88F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB890, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB891, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB892, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB893, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB894, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB895, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB896, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB897, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB898, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB899, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB89A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB89B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB89C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB89D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB89E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB89F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB8FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB900, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB901, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB902, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB903, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB904, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB905, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB906, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB907, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB908, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB909, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB90A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB90B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB90C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB90D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB90E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB90F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB910, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB911, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB912, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB913, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB914, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB915, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB916, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB917, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB918, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB919, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB91A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB91B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB91C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB91D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB91E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB91F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB920, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB921, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB922, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB923, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB924, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB925, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB926, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB927, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB928, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB929, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB92A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB92B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB92C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB92D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB92E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB92F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB930, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB931, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB932, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB933, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB934, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB935, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB936, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB937, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB938, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB939, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB93A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB93B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB93C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB93D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB93E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB93F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB940, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB941, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB942, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB943, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB944, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB945, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB946, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB947, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB948, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB949, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB94A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB94B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB94C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB94D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB94E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB94F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB950, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB951, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB952, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB953, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB954, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB955, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB956, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB957, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB958, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB959, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB95A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB95B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB95C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB95D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB95E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB95F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB960, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB961, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB962, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB963, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB964, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB965, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB966, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB967, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB968, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB969, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB96A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB96B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB96C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB96D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB96E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB96F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB970, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB971, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB972, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB973, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB974, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB975, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB976, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB977, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB978, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB979, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB97A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB97B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB97C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB97D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB97E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB97F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB980, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB981, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB982, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB983, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB984, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB985, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB986, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB987, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB988, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB989, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB98A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB98B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB98C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB98D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB98E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB98F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB990, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB991, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB992, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB993, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB994, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB995, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB996, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB997, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB998, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB999, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB99A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB99B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB99C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB99D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB99E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB99F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xB9FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBA9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBABA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBABB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBABC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBABD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBABE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBABF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBACA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBACB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBACC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBACD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBACE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBACF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBADA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBADB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBADC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBADD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBADE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBADF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBAFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBB9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBBFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBC9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBCFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBD9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBDFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBE9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x24, 0x84, 0x00, 0x24, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x24, 0x87, 0x00, 0x24, 0x84, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBECA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBECB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBECC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBECD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBECE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBECF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x8F, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBED9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBEFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x9E, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x24, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xF9, 0x00, 0x24, 0x89, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x24, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x3F, 0x89, 0x00, 0x24, 0xB9, 0x00, 0x24, 0x89, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBF9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xBFFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC001, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC002, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC003, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC004, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC005, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC006, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC007, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC008, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC009, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC00A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC00B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC00C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC00D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC00E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC00F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC010, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC011, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC012, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC013, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC014, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC015, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC016, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC017, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC018, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC019, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC01A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC01B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC01C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC01D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC01E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC01F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x12, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC023, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC024, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC027, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC028, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC029, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC02A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC02B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC02C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC02D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC02E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC02F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC031, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC037, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC038, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC03A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC03B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC03C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC03D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC03E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC03F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC040, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC042, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC046, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC048, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC04A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC04B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC04C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC04D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC04E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC04F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC051, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC052, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC053, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC054, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC055, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC056, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC057, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC058, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC059, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC05A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC05B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC05C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC05D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC05E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC05F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC060, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC061, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC062, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC064, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC066, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC068, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC069, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC06A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC06B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC06C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC06D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC06E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC06F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC070, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC071, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC072, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC073, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x11, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC07A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC07B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC07C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC07D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC07E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC07F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC080, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC082, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC083, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC084, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC085, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC086, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC087, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC088, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC089, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC08A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC08B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC08C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC08D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC08E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC08F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x12, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC090, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC091, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC092, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC093, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC094, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC095, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC096, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC097, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC098, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC099, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC09A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC09B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC09C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC09D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC09E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC09F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x24, 0x82, 0x00, 0x24, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC0FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC100, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC101, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC102, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC106, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC108, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC10A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC10B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC10C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC10D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC10E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC10F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC112, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC114, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC11A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC11B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC11C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC11D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC11E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC11F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC120, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC124, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC125, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC128, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC12A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC12B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC12C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC12D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC12E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC12F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC130, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC134, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC139, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC13A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC13B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC13C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC13D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC13E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC13F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC143, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC147, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC14A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC14B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC14C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC14D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC14E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC14F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC150, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC151, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC152, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC154, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC156, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC158, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC159, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC15A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC15B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC15C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC15D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC15E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC15F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC160, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC164, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC168, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC16A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC16B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC16C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC16D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC16E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC16F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC174, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC176, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC179, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC17A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC17B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC17C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC17D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC17E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC17F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC180, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC181, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC184, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC185, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC186, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC187, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC189, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC18A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC18B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC18C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC18D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC18E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC18F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC193, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC194, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC19A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC19B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC19C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC19D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC19E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC19F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC1FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC204, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC20A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC20B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC20C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC20D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC20E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC20F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC210, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC214, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC216, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC21A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC21B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC21C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC21D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC21E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC21F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC221, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC226, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC22A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC22B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC22C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC22D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC22E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC22F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC230, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC231, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC232, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC233, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC234, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC235, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC236, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC238, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC239, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC23A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC23B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC23C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC23D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC23E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC23F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC240, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC241, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC242, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC243, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC244, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC245, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC246, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC247, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC248, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC249, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC24A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC24B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC24C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC24D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC24E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC24F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC250, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC251, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC253, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC255, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC256, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC257, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC258, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC259, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC25A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC25B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC25C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC25D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC25E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC25F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC26A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC26B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC26C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC26D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC26E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC26F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC27A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC27B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC27C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC27D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC27E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC27F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC281, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC284, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC287, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC288, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC289, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC28A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC28B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC28C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC28D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC28E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC28F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC290, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC291, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC292, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC293, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC294, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC295, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC296, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC297, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC298, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC29A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC29B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC29C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC29D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC29E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC29F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x87, 0x00, 0x08, 0x84, 0x00, 0x1D, 0xC4, 0x00, 0x15, 0x44, 0x00, 0x15, 0x64, 0x00, 0x22, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC2FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC300, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC301, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC302, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC303, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC304, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC305, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC306, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC307, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC308, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC309, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC30A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC30B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC30C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC30D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC30E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC30F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC310, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC311, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC312, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC313, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC314, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xC9, 0x00, 0x15, 0x49, 0x00, 0x15, 0x69, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC315, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC316, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC317, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC318, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC319, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC31A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC31B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC31C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC31D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC31E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC31F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC321, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC322, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC324, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC326, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC329, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC32A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC32B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC32C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC32D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC32E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC32F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC330, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x87, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1D, 0xC7, 0x00, 0x15, 0x44, 0x00, 0x15, 0x64, 0x00, 0x22, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC334, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC335, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC336, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC337, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC33A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC33B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC33C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC33D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC33E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC33F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC340, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC341, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC342, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC343, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC344, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC345, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC346, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC347, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC348, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC349, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC34A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC34B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC34C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xCF, 0x00, 0x15, 0x49, 0x00, 0x15, 0x69, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC34D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC34E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC34F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC350, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC351, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC352, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC353, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC354, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC355, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC356, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC357, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC358, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC359, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC35A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC35B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC35C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC35D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC35E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC35F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC360, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC361, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC362, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC363, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC364, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC365, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC366, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC367, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC368, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x1D, 0xC2, 0x00, 0x15, 0x42, 0x00, 0x15, 0x62, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC369, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC36A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC36B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC36C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC36D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC36E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC36F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC370, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC371, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC372, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC373, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC374, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC375, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC376, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC377, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC378, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC379, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC37A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC37B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC37C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC37D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC37E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC37F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC380, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC381, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC382, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC383, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xC9, 0x00, 0x15, 0x49, 0x00, 0x15, 0x69, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC385, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC386, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC387, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC388, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC389, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC38A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC38B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC38C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC38D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC38E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC38F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC39A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC39B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC39C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC39D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC39E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC39F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1D, 0xDE, 0x00, 0x15, 0x42, 0x00, 0x15, 0x62, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xF9, 0x00, 0x15, 0x49, 0x00, 0x15, 0x69, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x05, 0x04, 0x00, 0x05, 0x04, 0x00, 0x05, 0x04, 0x00, 0x0A, 0x84, 0x00, 0x12, 0x44, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC3FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC400, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC402, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC403, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC407, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC40A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC40B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC40C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC40D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC40E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC40F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC410, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x05, 0x09, 0x00, 0x05, 0x09, 0x00, 0x05, 0x09, 0x00, 0x0A, 0x89, 0x00, 0x12, 0x49, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC411, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC414, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC415, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC419, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC41A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC41B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC41C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC41D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC41E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC41F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC420, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC421, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC423, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC424, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC425, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC427, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC428, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC42A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC42B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC42C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x0A, 0x82, 0x00, 0x12, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC42D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC42E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC42F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC430, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC432, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC435, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC437, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC439, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC43A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC43B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC43C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC43D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC43E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC43F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC447, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC44A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC44B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC44C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC44D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC44E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC44F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC450, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC451, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC452, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC453, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC454, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC456, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC457, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC458, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC45A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC45B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC45C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC45D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC45E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC45F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC460, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC463, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC464, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC466, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC467, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC46A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC46B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC46C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC46D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC46E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC46F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC470, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC471, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC472, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC473, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC476, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC478, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC479, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC47A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC47B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC47C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC47D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC47E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC47F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x0A, 0x82, 0x00, 0x12, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC481, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC483, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC484, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC485, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC487, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC48A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC48B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC48C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC48D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC48E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC48F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC490, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC496, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC497, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC49A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC49B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC49C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x05, 0x09, 0x00, 0x05, 0x09, 0x00, 0x05, 0x09, 0x00, 0x0A, 0x89, 0x00, 0x12, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC49D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC49E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC49F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x0A, 0x82, 0x00, 0x12, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC4FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC502, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC503, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC506, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC507, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC509, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC50A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC50B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC50C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x05, 0x02, 0x00, 0x0A, 0x82, 0x00, 0x12, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC50D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC50E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC50F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC510, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC511, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC512, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC513, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC514, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC515, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC516, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC517, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC518, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC519, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC51A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC51B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC51C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC51D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC51E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC51F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC520, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC521, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC522, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC523, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC524, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC525, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC526, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC527, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC528, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1D, 0xC2, 0x00, 0x15, 0x42, 0x00, 0x15, 0x62, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC529, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC52A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC52B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC52C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC52D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC52E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC52F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC534, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC535, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC536, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC537, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC538, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC539, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC53A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC53B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC53C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC53D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC53E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC53F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC540, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC541, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC542, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC543, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x11, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC545, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC546, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC547, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC548, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC549, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC54A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC54B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC54C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC54D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC54E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC54F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC551, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC552, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC553, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC554, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC555, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC556, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC557, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC558, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC559, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC55A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC55B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC55C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC55D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC55E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC55F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC560, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC561, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC562, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC563, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC564, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC565, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC566, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC567, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC568, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC569, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC56A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC56B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC56C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC56D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC56E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC56F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC570, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC571, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC572, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC573, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC574, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC575, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC576, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC579, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC57A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC57B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC57C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x11, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC57D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC57E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC57F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC580, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC584, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC586, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC587, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC588, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC589, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC58A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC58B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC58C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC58D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC58E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC58F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC590, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC591, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC592, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC593, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC594, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC595, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC596, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC597, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC598, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC599, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC59A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC59B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC59C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC59D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC59E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC59F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x11, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x11, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC5FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC600, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC601, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC602, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC603, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC604, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC605, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC606, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC607, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC608, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC609, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC60A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC60B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC60C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC60D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC60E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC60F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC610, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC611, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC612, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC613, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC614, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC615, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC616, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC617, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC618, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC619, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC61A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC61B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC61C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC61D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC61E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC61F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC620, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC621, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC622, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC623, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC624, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC625, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC626, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC627, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC628, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC629, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC62A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC62B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC62C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC62D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC62E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC62F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC630, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC631, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC632, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC633, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC634, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC635, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC636, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC637, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC638, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC639, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC63A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC63B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC63C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC63D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC63E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC63F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC640, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC641, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC642, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC643, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC644, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC645, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC646, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC647, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC648, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC649, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC64A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC64B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC64C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC64D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC64E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC64F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC650, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC651, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC652, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC653, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC654, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC655, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC656, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC657, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC658, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC659, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC65A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC65B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC65C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC65D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC65E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC65F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC660, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC661, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC662, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC663, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC664, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC665, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC666, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC667, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC668, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC669, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC66A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC66B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC66C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC66D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC66E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC66F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC670, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC671, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC672, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC673, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC674, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC675, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC676, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC677, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC678, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC679, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC67A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC67B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC67C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC67D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC67E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC67F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC680, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC681, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC682, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC683, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC684, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC685, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC686, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC687, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC688, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC689, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC68A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC68B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC68C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC68D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC68E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC68F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC690, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC691, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC692, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC693, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC694, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC695, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC696, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC697, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC698, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC699, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC69A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC69B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC69C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC69D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC69E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC69F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC6FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC701, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC702, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC703, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC704, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC705, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC706, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC707, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC708, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC709, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC70A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC70B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC70C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC70D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC70E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC70F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC710, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC711, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC712, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC713, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC714, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC715, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC716, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC717, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC718, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC719, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC71A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC71B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC71C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC71D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC71E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC71F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC720, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC721, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC722, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC723, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC724, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC725, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC726, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC727, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC728, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC729, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC72A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC72B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC72C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC72D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC72E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC72F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC730, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC731, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC732, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC733, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC734, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC735, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC736, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC737, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC738, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC739, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC73A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC73B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC73C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC73D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC73E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC73F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC740, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC741, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC742, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC743, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC744, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC745, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC746, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC747, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC748, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC749, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC74A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC74B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC74C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC74D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC74E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC74F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC750, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC751, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC752, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC753, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC754, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC755, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC756, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC757, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC758, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC759, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC75A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC75B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC75C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC75D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC75E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC75F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC760, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC761, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC762, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC763, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC764, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC765, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC766, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC767, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC768, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC769, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC76A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC76B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC76C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC76D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC76E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC76F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC770, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC771, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC772, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC773, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC774, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x11, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC775, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC776, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC777, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC778, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC779, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC77A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC77B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC77C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC77D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC77E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC77F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC780, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC781, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC782, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC783, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC784, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC785, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC786, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC787, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC788, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC789, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC78A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC78B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC78C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC78D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC78E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC78F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC790, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC791, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC792, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC793, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC794, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC795, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC796, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC797, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC798, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC799, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC79A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC79B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC79C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC79D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC79E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC79F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC7FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC800, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC801, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC802, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC803, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC804, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC805, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC806, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC807, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC808, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC809, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC80A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC80B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC80C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC80D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC80E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC80F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC810, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC811, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC812, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC813, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC814, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC815, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC816, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC817, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC818, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC819, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC81A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC81B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC81C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC81D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC81E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC81F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC820, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC821, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC822, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC823, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC824, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC825, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC826, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC827, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC828, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC829, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC82A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC82B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC82C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC82D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC82E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC82F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC830, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC831, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC832, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC833, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC834, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC835, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC836, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC837, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC838, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC839, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC83A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC83B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC83C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC83D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC83E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC83F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC840, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC841, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC842, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC843, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC844, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC845, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC846, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC847, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC848, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC849, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC84A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC84B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC84C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC84D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC84E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC84F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC850, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC851, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC852, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC853, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC854, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC855, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC856, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC857, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC858, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC859, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC85A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC85B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC85C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC85D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC85E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC85F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC860, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC861, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC862, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC863, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC864, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC865, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC866, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC867, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC868, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC869, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC86A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC86B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC86C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC86D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC86E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC86F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x39, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x39, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC870, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC871, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC872, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC873, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC874, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC875, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC876, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC877, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC878, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC879, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC87A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC87B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC87C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC87D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC87E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC87F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC880, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC881, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC882, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC883, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC884, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC885, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC886, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC887, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC888, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC889, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC88A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC88B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC88C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC88D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC88E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC88F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC890, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC891, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC892, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC893, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC894, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC895, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC896, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC897, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC898, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC899, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC89A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC89B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC89C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC89D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC89E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC89F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x12, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC8FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC900, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC901, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC902, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC903, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC904, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC905, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC906, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC907, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC908, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC909, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC90A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC90B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC90C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC90D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC90E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC90F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC910, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC911, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC912, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC913, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC914, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC915, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC916, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC917, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC918, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC919, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC91A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC91B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC91C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC91D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC91E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC91F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC920, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC921, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC922, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC923, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC924, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC925, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC926, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC927, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC928, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC929, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC92A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC92B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC92C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC92D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC92E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC92F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC930, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC931, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC932, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC933, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC934, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC935, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC936, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC937, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC938, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC939, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC93A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC93B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC93C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC93D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC93E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC93F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC940, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC941, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC942, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC943, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC944, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC945, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC946, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC947, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC948, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC949, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC94A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC94B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC94C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC94D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC94E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC94F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC950, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC951, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC952, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC953, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC954, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC955, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC956, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC957, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC958, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC959, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC95A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC95B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC95C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC95D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC95E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC95F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC960, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC961, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC962, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC963, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC964, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC965, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC966, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC967, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC968, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC969, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC96A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC96B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC96C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC96D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC96E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC96F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC970, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC971, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC972, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC973, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC974, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC975, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC976, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC977, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC978, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC979, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC97A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC97B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC97C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC97D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC97E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC97F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC980, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC981, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC982, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC983, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC984, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC985, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC986, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC987, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC988, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC989, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC98A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC98B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC98C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC98D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC98E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC98F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC990, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC991, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC992, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC993, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC994, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC995, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC996, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC997, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC998, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC999, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC99A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC99B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC99C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC99D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC99E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC99F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x87, 0x00, 0x08, 0x84, 0x00, 0x1D, 0xC4, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x2A, 0x84, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xC9, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xC9FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x87, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1D, 0xC7, 0x00, 0x15, 0x44, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3B, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x2A, 0x87, 0x00, 0x2A, 0x84, 0x00, 0x44, 0x44, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x8F, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xCF, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x2A, 0x8F, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x1D, 0xC2, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xC9, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x2A, 0x89, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x9E, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1D, 0xDE, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCA9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x9E, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x08, 0x89, 0x00, 0x08, 0xF9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1D, 0xF9, 0x00, 0x15, 0x49, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCABA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCABB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3B, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x2A, 0xB9, 0x00, 0x2A, 0x89, 0x00, 0x44, 0x49, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCABC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCABD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCABE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCABF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCACA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCACB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCACC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCACD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCACE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCACF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0D, 0x84, 0x00, 0x12, 0x44, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCADA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCADB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCADC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCADD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCADE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCADF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1D, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x15, 0x44, 0x00, 0x22, 0x24, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0D, 0x89, 0x00, 0x12, 0x49, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCAFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0D, 0x82, 0x00, 0x12, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0D, 0x82, 0x00, 0x12, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0D, 0x89, 0x00, 0x12, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1D, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x15, 0x49, 0x00, 0x22, 0x29, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0D, 0x82, 0x00, 0x12, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCB9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x0D, 0x82, 0x00, 0x12, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCBFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1D, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1D, 0xC2, 0x00, 0x15, 0x42, 0x00, 0x15, 0x42, 0x00, 0x22, 0x22, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3B, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x2A, 0x82, 0x00, 0x2A, 0x82, 0x00, 0x44, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x04, 0x07, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x0A, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x04, 0x04, 0x00, 0x04, 0x07, 0x00, 0x0A, 0x04, 0x00, 0x31, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCC9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x1E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x04, 0x02, 0x00, 0x04, 0x1E, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x04, 0x79, 0x00, 0x04, 0x09, 0x00, 0x04, 0x09, 0x00, 0x0A, 0x79, 0x00, 0x0A, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCCFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0xB9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x39, 0x00, 0x0A, 0x09, 0x00, 0x31, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x98, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x05, 0x04, 0x00, 0x18, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x07, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0E, 0x38, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCD9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x07, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x09, 0x00, 0x05, 0x09, 0x00, 0x18, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCDFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x05, 0x02, 0x00, 0x18, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x0A, 0x02, 0x00, 0x31, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCE9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x87, 0x00, 0x3F, 0x84, 0x00, 0x01, 0x04, 0x00, 0x01, 0x07, 0x00, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x30, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x87, 0x00, 0x00, 0x84, 0x00, 0x3F, 0x87, 0x00, 0x01, 0x04, 0x00, 0x06, 0x04, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x01, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCECA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCECB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCECC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCECD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCECE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCECF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCED9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x89, 0x00, 0x3F, 0x8F, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCEFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xF9, 0x00, 0x01, 0x09, 0x00, 0x01, 0x09, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x01, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x9E, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0xF9, 0x00, 0x3F, 0x89, 0x00, 0x01, 0x09, 0x00, 0x01, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x09, 0x00, 0x08, 0x09, 0x00, 0x30, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0xB9, 0x00, 0x00, 0x89, 0x00, 0x3F, 0xB9, 0x00, 0x01, 0x09, 0x00, 0x06, 0x09, 0x00, 0x18, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF66, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x84, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x1F, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x00, 0x44, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x1F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF97, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCF9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFCF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFDC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFDF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x02, 0x24, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xCFFF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD001, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD002, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD003, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD004, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD005, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD006, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD007, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD008, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD009, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD00A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD00B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD00C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD00D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD00E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD00F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD010, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD011, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD012, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD013, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD014, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD015, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD016, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD017, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD018, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x49, 0x00, 0x00, 0x49, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD019, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD01A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD01B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD01C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD01D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD01E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD01F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD023, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD024, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD027, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD028, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD029, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD02A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD02B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD02C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD02D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD02E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD02F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD031, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x1F, 0x89, 0x00, 0x00, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD037, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD038, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD03A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD03B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD03C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD03D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD03E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD03F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD040, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD042, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD046, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD048, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD04A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD04B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD04C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD04D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD04E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD04F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD051, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD052, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD053, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD054, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD055, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD056, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD057, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD058, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD059, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD05A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD05B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD05C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD05D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD05E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD05F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD060, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD061, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD062, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD064, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD066, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD068, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD069, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD06A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD06B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD06C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD06D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD06E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD06F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD070, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD071, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD072, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD073, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD07A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD07B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD07C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD07D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD07E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD07F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD080, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD082, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD083, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD084, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD085, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD086, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD087, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD088, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD089, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD08A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD08B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD08C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD08D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD08E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD08F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD090, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD091, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD092, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD093, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD094, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD095, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD096, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD097, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD098, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD099, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD09A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD09B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD09C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD09D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD09E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD09F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x1F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x08, 0x02, 0x00, 0x30, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x3F, 0x82, 0x00, 0x01, 0x02, 0x00, 0x06, 0x02, 0x00, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x87, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x8F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x04, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD0FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD100, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD101, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD102, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD106, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD108, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD10A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD10B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD10C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD10D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD10E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD10F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD112, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x3F, 0x84, 0x00, 0x20, 0x07, 0x00, 0x20, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD114, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD11A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD11B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD11C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD11D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD11E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD11F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD120, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD124, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD125, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD128, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD12A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD12B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD12C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD12D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD12E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD12F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x0F, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD130, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD134, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD139, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD13A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD13B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD13C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD13D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD13E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD13F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD143, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD147, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD14A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD14B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x9E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD14C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD14D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD14E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD14F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD150, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD151, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD152, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD154, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD156, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD158, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD159, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD15A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD15B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD15C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD15D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD15E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD15F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD160, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD164, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x3F, 0xF9, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD168, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD16A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD16B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD16C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD16D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD16E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD16F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD174, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD176, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD179, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD17A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD17B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD17C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD17D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD17E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD17F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD180, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD181, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x1E, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD184, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x09, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x79, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD185, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD186, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD187, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD189, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD18A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD18B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD18C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD18D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD18E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD18F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD193, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD194, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD19A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD19B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD19C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD19D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD19E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD19F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x3F, 0x89, 0x00, 0x20, 0x39, 0x00, 0x20, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD1FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD204, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD20A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD20B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD20C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD20D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD20E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD20F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD210, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD214, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD216, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD21A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD21B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD21C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD21D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD21E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD21F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD221, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD226, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD22A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD22B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD22C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD22D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD22E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD22F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD230, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD231, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD232, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD233, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD234, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD235, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD236, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD238, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD239, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD23A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD23B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD23C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD23D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD23E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD23F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD240, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD241, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD242, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD243, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD244, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD245, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD246, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD247, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD248, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD249, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD24A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD24B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD24C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD24D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD24E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD24F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD250, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD251, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD253, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD255, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD256, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD257, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD258, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD259, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD25A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD25B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD25C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD25D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD25E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD25F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD26A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD26B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD26C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD26D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD26E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD26F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD27A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD27B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD27C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD27D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD27E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD27F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD281, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD284, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD287, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD288, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD289, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD28A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD28B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD28C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD28D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD28E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD28F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD290, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD291, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD292, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD293, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD294, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD295, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD296, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD297, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD298, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD29A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD29B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD29C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD29D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD29E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD29F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x10, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD2FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD300, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD301, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD302, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD303, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD304, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD305, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD306, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD307, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD308, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD309, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD30A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD30B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x20, 0x02, 0x00, 0x20, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD30C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x07, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD30D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD30E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD30F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD310, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD311, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD312, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD313, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD314, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD315, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD316, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD317, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD318, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD319, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD31A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD31B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD31C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD31D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD31E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD31F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD321, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD322, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD324, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD326, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x0F, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD329, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD32A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD32B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD32C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD32D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD32E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD32F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD330, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD334, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD335, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD336, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD337, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD33A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD33B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD33C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD33D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD33E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD33F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD340, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD341, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD342, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD343, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD344, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x09, 0x04, 0x00, 0x09, 0x07, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x09, 0x07, 0x00, 0x09, 0x04, 0x00, 0x09, 0x04, 0x00, 0x3F, 0xC4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD345, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD346, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD347, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD348, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD349, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD34A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD34B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD34C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD34D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD34E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD34F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD350, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD351, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD352, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD353, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD354, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD355, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD356, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD357, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD358, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD359, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD35A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD35B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD35C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD35D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD35E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD35F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x11, 0x07, 0x00, 0x11, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD360, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x0F, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x0F, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD361, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD362, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD363, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD364, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD365, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD366, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD367, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD368, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD369, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD36A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD36B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD36C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD36D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD36E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD36F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD370, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD371, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD372, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD373, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD374, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD375, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD376, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD377, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD378, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD379, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD37A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD37B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x11, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD37C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x1E, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD37D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD37E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD37F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD380, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD381, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD382, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD383, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD385, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD386, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD387, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD388, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD389, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD38A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD38B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD38C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD38D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD38E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD38F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x79, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD39A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD39B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD39C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD39D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD39E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD39F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x09, 0x00, 0x11, 0x79, 0x00, 0x11, 0x09, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x09, 0x02, 0x00, 0x09, 0x1E, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x1E, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x11, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x09, 0x09, 0x00, 0x09, 0x79, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x09, 0x79, 0x00, 0x09, 0x09, 0x00, 0x09, 0x09, 0x00, 0x3F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x11, 0x39, 0x00, 0x11, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD3FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD400, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD402, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD403, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD407, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD40A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD40B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD40C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD40D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD40E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD40F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD410, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD411, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD414, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD415, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD419, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD41A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD41B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD41C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD41D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD41E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD41F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD420, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD421, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD423, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x1F, 0xC4, 0x00, 0x02, 0x04, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD424, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD425, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD427, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD428, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD42A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD42B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD42C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD42D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD42E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD42F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD430, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD432, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD435, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD437, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD439, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD43A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD43B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD43C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD43D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD43E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD43F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x04, 0x09, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD447, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD44A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD44B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD44C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD44D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD44E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD44F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD450, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD451, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD452, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD453, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD454, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD456, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD457, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD458, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD45A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD45B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD45C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD45D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD45E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD45F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD460, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD463, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD464, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD466, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD467, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD46A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD46B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD46C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD46D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD46E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD46F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD470, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD471, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD472, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD473, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD476, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD478, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD479, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD47A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD47B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD47C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD47D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD47E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD47F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD481, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD483, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD484, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD485, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD487, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD48A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD48B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD48C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD48D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD48E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD48F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD490, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD496, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD497, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD49A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD49B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD49C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD49D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD49E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD49F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x08, 0x89, 0x00, 0x1F, 0xC9, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD4FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD502, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD503, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD506, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD507, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD509, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD50A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD50B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD50C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD50D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD50E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD50F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD510, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD511, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD512, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD513, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD514, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD515, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD516, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD517, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD518, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD519, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD51A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD51B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD51C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD51D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD51E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD51F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD520, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD521, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD522, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD523, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD524, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD525, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD526, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD527, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD528, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD529, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD52A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD52B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD52C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD52D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD52E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD52F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD534, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD535, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD536, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD537, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD538, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD539, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD53A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD53B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x1F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD53C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0x02, 0x00, 0x3F, 0xC2, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD53D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD53E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD53F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD540, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD541, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD542, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD543, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD545, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD546, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD547, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD548, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD549, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD54A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD54B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD54C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD54D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD54E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD54F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD551, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD552, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD553, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD554, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD555, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD556, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD557, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD558, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x0E, 0x07, 0x00, 0x11, 0x04, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x11, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD559, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD55A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD55B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD55C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD55D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD55E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD55F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD560, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD561, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD562, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD563, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD564, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD565, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD566, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD567, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD568, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD569, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD56A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD56B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD56C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD56D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD56E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD56F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD570, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD571, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD572, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD573, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x07, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD574, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x0F, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD575, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD576, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD579, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD57A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD57B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD57C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD57D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD57E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD57F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD580, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD584, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD586, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD587, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD588, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD589, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD58A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD58B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD58C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD58D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD58E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD58F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x0F, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD590, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x0E, 0x04, 0x00, 0x11, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x11, 0x04, 0x00, 0x0E, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD591, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD592, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD593, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD594, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD595, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD596, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD597, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD598, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD599, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD59A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD59B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD59C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD59D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD59E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD59F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x04, 0x00, 0x3F, 0x84, 0x00, 0x00, 0x07, 0x00, 0x1F, 0x04, 0x00, 0x20, 0x87, 0x00, 0x20, 0x84, 0x00, 0x1F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x0E, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x0F, 0x00, 0x1F, 0x09, 0x00, 0x20, 0x8F, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x1E, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x11, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x1E, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x79, 0x00, 0x11, 0x09, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD5FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x79, 0x00, 0x20, 0x89, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD600, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x0E, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x11, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD601, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD602, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD603, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD604, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD605, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD606, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD607, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD608, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD609, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD60A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD60B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD60C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD60D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD60E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD60F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD610, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD611, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD612, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD613, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD614, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD615, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD616, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD617, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD618, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD619, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD61A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD61B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x1E, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x9E, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD61C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x79, 0x00, 0x0E, 0x09, 0x00, 0x11, 0x09, 0x00, 0x20, 0xF9, 0x00, 0x20, 0x89, 0x00, 0x11, 0x09, 0x00, 0x0E, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD61D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD61E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD61F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD620, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD621, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD622, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD623, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD624, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD625, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD626, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD627, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD628, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD629, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD62A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD62B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD62C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD62D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD62E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD62F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD630, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD631, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD632, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD633, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD634, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD635, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD636, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD637, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x09, 0x00, 0x3F, 0x89, 0x00, 0x00, 0x39, 0x00, 0x1F, 0x09, 0x00, 0x20, 0xB9, 0x00, 0x20, 0x89, 0x00, 0x1F, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD638, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD639, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD63A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD63B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD63C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD63D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD63E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD63F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD640, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD641, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD642, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD643, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD644, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD645, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD646, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD647, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD648, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD649, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD64A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD64B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD64C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD64D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD64E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD64F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD650, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD651, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD652, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD653, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD654, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x0F, 0x84, 0x00, 0x10, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x02, 0x04, 0x00, 0x02, 0x04, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD655, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD656, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD657, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD658, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD659, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD65A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD65B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD65C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD65D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD65E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD65F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD660, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD661, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD662, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD663, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD664, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD665, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD666, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD667, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD668, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD669, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD66A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD66B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD66C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD66D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD66E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD66F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x08, 0x84, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x84, 0x00, 0x02, 0x07, 0x00, 0x3F, 0xF4, 0x00, 0x00, 0x04, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD670, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x07, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD671, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD672, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD673, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD674, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD675, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD676, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD677, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD678, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD679, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD67A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD67B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD67C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD67D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD67E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD67F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD680, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD681, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD682, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD683, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD684, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD685, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD686, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD687, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD688, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD689, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD68A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD68B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x04, 0x0F, 0x00, 0x3F, 0xE9, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD68C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD68D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD68E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD68F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD690, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD691, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD692, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD693, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD694, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD695, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD696, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD697, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD698, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD699, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD69A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD69B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD69C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD69D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD69E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD69F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x02, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x08, 0x80, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xFC, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0xBC, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xC4, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0x88, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xB8, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x84, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x04, 0x90, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xE2, 0x00, 0x02, 0x1E, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x07, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x0F, 0x89, 0x00, 0x10, 0x49, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD6FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD700, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD701, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD702, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD703, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD704, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD705, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD706, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD707, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD708, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD709, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD70A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD70B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD70C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD70D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD70E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD70F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD710, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD711, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD712, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD713, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD714, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD715, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD716, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD717, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x89, 0x00, 0x00, 0x09, 0x00, 0x1F, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x10, 0x49, 0x00, 0x0F, 0x89, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x79, 0x00, 0x02, 0x09, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD718, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD719, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD71A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD71B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD71C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD71D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD71E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD71F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD720, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD721, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD722, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD723, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD724, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD725, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD726, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD727, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD728, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD729, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD72A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD72B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD72C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD72D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD72E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD72F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD730, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD731, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD732, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD733, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x3F, 0xFA, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD734, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD735, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD736, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD737, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD738, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x0A, 0x20, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD739, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD73A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD73B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD73C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD73D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD73E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD73F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x64, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD740, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x28, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD741, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD742, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD743, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD744, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD745, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0x24, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD746, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x12, 0xA8, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD747, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD748, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x06, 0x30, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD749, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD74A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD74B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD74C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD74D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD74E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD74F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x02, 0x20, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD750, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD751, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD752, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD753, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x14, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD754, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD755, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x7C, 0x00, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD756, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x3C, 0x00, 0x10, 0x7E, 0x00, 0x10, 0x24, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD757, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD758, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD759, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x04, 0x00, 0x1F, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD75A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x44, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD75B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x44, 0x00, 0x01, 0x44, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD75C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x08, 0x00, 0x01, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x10, 0x14, 0x00, 0x0F, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD75D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x40, 0x00, 0x1F, 0x7C, 0x00, 0x10, 0x40, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD75E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7C, 0x00, 0x01, 0x28, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x28, 0x00, 0x0F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD75F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x38, 0x00, 0x01, 0x7C, 0x00, 0x1F, 0x28, 0x00, 0x10, 0x44, 0x00, 0x0F, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD760, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD761, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x10, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD762, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x10, 0x88, 0x00, 0x10, 0x88, 0x00, 0x1F, 0x88, 0x00, 0x10, 0x94, 0x00, 0x0F, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD763, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x03, 0x60, 0x00, 0x04, 0x10, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD764, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0A, 0x28, 0x00, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD765, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x08, 0x00, 0x10, 0x04, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD766, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD767, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x01, 0x40, 0x00, 0x06, 0x30, 0x00, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD768, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD769, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD76A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD76B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x1F, 0xFC, 0x00, 0x04, 0x10, 0x00, 0x08, 0x08, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD76C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x0F, 0x82, 0x00, 0x10, 0x42, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD76D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD76E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD76F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD770, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD771, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD772, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD773, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD774, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD775, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD776, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD777, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD778, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD779, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD77A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD77B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD77C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD77D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD77E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD77F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD780, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD781, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD782, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD783, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD784, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD785, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD786, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD787, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0xC2, 0x00, 0x08, 0x82, 0x00, 0x10, 0x42, 0x00, 0x0F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xFA, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD788, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x11, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x11, 0x02, 0x00, 0x0E, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD789, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD78A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD78B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD78C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD78D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD78E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0E, 0x00, 0x04, 0x1F, 0x00, 0x04, 0x0A, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD78F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD790, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD791, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x42, 0x00, 0x07, 0xC2, 0x00, 0x04, 0x02, 0x00, 0x03, 0xC2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD792, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x52, 0x00, 0x07, 0xD2, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD793, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD2, 0x00, 0x00, 0x52, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x12, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD794, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC4, 0x00, 0x00, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x0A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD795, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDE, 0x00, 0x00, 0x50, 0x00, 0x07, 0xDE, 0x00, 0x04, 0x10, 0x00, 0x03, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD796, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x94, 0x00, 0x07, 0x94, 0x00, 0x04, 0x14, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD797, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x00, 0x00, 0x5F, 0x00, 0x07, 0xCA, 0x00, 0x04, 0x11, 0x00, 0x03, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD798, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD799, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD79A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x07, 0xC4, 0x00, 0x04, 0x4A, 0x00, 0x03, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD79B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD79C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x8A, 0x00, 0x04, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD79D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x02, 0x04, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD79E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x20, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD79F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD7A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD7A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD7A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x00, 0x88, 0x00, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xD7A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x02, 0x00, 0x3F, 0x82, 0x00, 0x00, 0x02, 0x00, 0x1F, 0x02, 0x00, 0x20, 0x82, 0x00, 0x20, 0x82, 0x00, 0x1F, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFC, 0x00, 0x07, 0xFF, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF900, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF901, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x04, 0x80, 0x00, 0x03, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x0C, 0x3F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF902, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF903, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF904, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x01, 0x3E, 0x00, 0x21, 0x22, 0x00, 0x17, 0xFF, 0x80, 0x04, 0x00, 0x80, 0x01, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x11, 0x02, 0x00, 0x11, 0x02, 0x00, 0x21, 0x02, 0x00, 0x21, 0x0E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF905, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF906, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x20, 0x01, 0x00, 0x00, 0x01, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x07, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF907, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x31, 0x42, 0x00, 0x1F, 0x7E, 0x00, 0x3D, 0x40, 0x00, 0x05, 0x7F, 0x00, 0x3F, 0xE3, 0x00, 0x05, 0x55, 0x00, 0x3D, 0x5D, 0x00, 0x05, 0x63, 0x00, 0x3F, 0x7F, 0x00, 0x05, 0x40, 0x00, 0x3D, 0x40, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF908, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x08, 0x20, 0x00, 0x1F, 0xFE, 0x00, 0x31, 0x42, 0x00, 0x1F, 0x7E, 0x00, 0x3D, 0x40, 0x00, 0x05, 0x7F, 0x00, 0x3F, 0xE3, 0x00, 0x05, 0x55, 0x00, 0x3D, 0x5D, 0x00, 0x05, 0x63, 0x00, 0x3F, 0x7F, 0x00, 0x05, 0x40, 0x00, 0x3D, 0x40, 0x80, 0x01, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF909, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x09, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x0F, 0xA1, 0x00, 0x34, 0x46, 0x00, 0x04, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF90A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x04, 0x44, 0x00, 0x02, 0x48, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF90B, { 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x38, 0x85, 0x00, 0x2F, 0xF5, 0x00, 0x28, 0x85, 0x00, 0x2B, 0xE5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2A, 0xA5, 0x00, 0x2B, 0xE5, 0x00, 0x38, 0x85, 0x00, 0x29, 0xC5, 0x00, 0x02, 0xA5, 0x00, 0x04, 0x91, 0x00, 0x08, 0x81, 0x00, 0x10, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF90C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x37, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF90D, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x4F, 0x80, 0x0A, 0x42, 0x80, 0x0B, 0xF4, 0x80, 0x2A, 0x45, 0x80, 0x29, 0xF8, 0x00, 0x29, 0x57, 0x80, 0x09, 0x54, 0x80, 0x09, 0x57, 0x80, 0x09, 0xF4, 0x80, 0x08, 0xC7, 0x80, 0x08, 0xE4, 0x80, 0x09, 0x57, 0x80, 0x09, 0x40, 0x00, 0x0A, 0x45, 0x00, 0x08, 0x48, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF90E, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x9F, 0x00, 0x2B, 0xE5, 0x00, 0x18, 0x89, 0x00, 0x0B, 0xF6, 0x00, 0x0A, 0xAF, 0x00, 0x1A, 0xA9, 0x00, 0x2B, 0xEF, 0x00, 0x08, 0x89, 0x00, 0x09, 0xCF, 0x00, 0x11, 0xA9, 0x00, 0x12, 0x8F, 0x00, 0x14, 0x85, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF90F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x12, 0x00, 0x05, 0x24, 0x00, 0x19, 0x7F, 0x80, 0x0E, 0xA4, 0x00, 0x04, 0x3F, 0x80, 0x3F, 0xA4, 0x00, 0x04, 0xBF, 0x80, 0x15, 0x24, 0x00, 0x15, 0x24, 0x00, 0x15, 0x3F, 0x80, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF910, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x0A, 0x48, 0x00, 0x32, 0xFF, 0x00, 0x1D, 0x48, 0x00, 0x09, 0x7F, 0x00, 0x3F, 0xC8, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF911, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x2A, 0xFF, 0x80, 0x2A, 0x12, 0x00, 0x2A, 0x92, 0x00, 0x3E, 0x64, 0x00, 0x08, 0x29, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x08, 0x80, 0x0A, 0x2A, 0x00, 0x0F, 0x49, 0x00, 0x31, 0x88, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF912, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x05, 0x49, 0x00, 0x0A, 0x7F, 0x00, 0x1C, 0x08, 0x00, 0x2C, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x08, 0x1C, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x4A, 0x00, 0x08, 0x89, 0x00, 0x09, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF913, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x03, 0xFF, 0x00, 0x21, 0x0A, 0x00, 0x11, 0x54, 0x00, 0x06, 0xBF, 0x00, 0x03, 0x54, 0x00, 0x31, 0x3F, 0x00, 0x1F, 0xF4, 0x00, 0x11, 0x1F, 0x00, 0x15, 0x54, 0x00, 0x15, 0x5F, 0x00, 0x19, 0x10, 0x00, 0x27, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF914, { 0x00, 0x00, 0x00, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x11, 0xE9, 0x00, 0x35, 0x39, 0x00, 0x0D, 0xE6, 0x00, 0x09, 0x24, 0x80, 0x17, 0xEB, 0x80, 0x3A, 0x1C, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF915, { 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x10, 0x20, 0x00, 0x00, 0x7F, 0x80, 0x00, 0x41, 0x00, 0x20, 0xA2, 0x00, 0x11, 0x14, 0x00, 0x02, 0x08, 0x00, 0x08, 0x16, 0x00, 0x08, 0x21, 0x80, 0x08, 0xC0, 0x00, 0x17, 0x7F, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x20, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF916, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x3F, 0x80, 0x09, 0x21, 0x00, 0x2A, 0x52, 0x00, 0x2C, 0x8C, 0x00, 0x29, 0x0C, 0x00, 0x08, 0x12, 0x00, 0x08, 0x21, 0x80, 0x08, 0xC0, 0x00, 0x0B, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x14, 0x41, 0x00, 0x14, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x20, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF917, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x7F, 0x00, 0x08, 0x42, 0x00, 0x08, 0xA4, 0x00, 0x08, 0x94, 0x00, 0x09, 0x08, 0x00, 0x3E, 0x16, 0x00, 0x08, 0x21, 0x80, 0x08, 0xC0, 0x00, 0x0B, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF918, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x42, 0x00, 0x10, 0xA4, 0x00, 0x05, 0x18, 0x00, 0x06, 0x34, 0x00, 0x08, 0xC3, 0x80, 0x0B, 0xFE, 0x00, 0x10, 0x82, 0x00, 0x10, 0x82, 0x00, 0x20, 0xFE, 0x00, 0x20, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF919, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x0A, 0x3F, 0x80, 0x0A, 0x21, 0x00, 0x0A, 0x52, 0x00, 0x3F, 0x8C, 0x00, 0x2A, 0x8C, 0x00, 0x2A, 0x92, 0x00, 0x33, 0xA1, 0x00, 0x20, 0xC0, 0x80, 0x20, 0xBF, 0x00, 0x3F, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x20, 0xA1, 0x00, 0x3F, 0xBF, 0x00, 0x20, 0xA1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF91A, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x28, 0x3F, 0x80, 0x28, 0x21, 0x00, 0x3E, 0x52, 0x00, 0x28, 0x8C, 0x00, 0x28, 0x0C, 0x00, 0x3E, 0x12, 0x00, 0x28, 0x21, 0x80, 0x28, 0xC0, 0x00, 0x3F, 0x3F, 0x00, 0x25, 0x21, 0x00, 0x0B, 0x21, 0x00, 0x15, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x2C, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF91B, { 0x00, 0x00, 0x00, 0x03, 0x90, 0x00, 0x3C, 0x10, 0x00, 0x04, 0x90, 0x00, 0x12, 0x50, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xD0, 0x00, 0x08, 0x90, 0x00, 0x05, 0x10, 0x00, 0x3F, 0xD0, 0x00, 0x22, 0x50, 0x00, 0x24, 0x50, 0x00, 0x29, 0x50, 0x00, 0x3F, 0x50, 0x80, 0x20, 0xD0, 0x80, 0x20, 0x50, 0x80, 0x20, 0xDF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF91C, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x1F, 0x80, 0x10, 0x10, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x14, 0x94, 0x80, 0x12, 0x92, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x10, 0x90, 0x80, 0x17, 0x90, 0x80, 0x39, 0x10, 0x80, 0x01, 0x13, 0x00, 0x02, 0x10, 0x00, 0x04, 0x10, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF91D, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x0A, 0xF7, 0x80, 0x2A, 0x94, 0x80, 0x2A, 0xF7, 0x80, 0x28, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xBE, 0x80, 0x08, 0x9C, 0x80, 0x08, 0xAA, 0x80, 0x08, 0xC9, 0x80, 0x08, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF91E, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xF7, 0x80, 0x08, 0x94, 0x80, 0x0A, 0xF7, 0x80, 0x0A, 0x94, 0x80, 0x2A, 0xF7, 0x80, 0x28, 0x88, 0x80, 0x28, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0xBE, 0x80, 0x08, 0xAA, 0x80, 0x14, 0xBE, 0x80, 0x14, 0x9C, 0x80, 0x12, 0xAA, 0x80, 0x22, 0xC9, 0x80, 0x20, 0x89, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF91F, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x5F, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x49, 0x00, 0x13, 0xF9, 0x00, 0x10, 0xE1, 0x00, 0x11, 0x5D, 0x00, 0x16, 0x47, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF920, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x0A, 0x04, 0x00, 0x32, 0xF9, 0x00, 0x14, 0x09, 0x00, 0x09, 0xF6, 0x00, 0x3F, 0x1F, 0x80, 0x2A, 0xEA, 0x80, 0x2A, 0xEA, 0x80, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x24, 0x80, 0x22, 0x25, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF921, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x10, 0x04, 0x00, 0x10, 0xF4, 0x00, 0x17, 0x84, 0x00, 0x10, 0x84, 0x00, 0x17, 0xF4, 0x00, 0x14, 0x94, 0x00, 0x17, 0xF4, 0x00, 0x10, 0x94, 0x00, 0x10, 0xFA, 0x80, 0x2F, 0x05, 0x80, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF922, { 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x13, 0xF4, 0x00, 0x02, 0x2F, 0x80, 0x03, 0xF0, 0x00, 0x22, 0x10, 0x00, 0x13, 0xF0, 0x00, 0x02, 0x20, 0x00, 0x0B, 0xF7, 0x80, 0x0A, 0x00, 0x00, 0x08, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x11, 0x29, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF923, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x08, 0x00, 0x3F, 0x88, 0x00, 0x24, 0x10, 0x00, 0x3F, 0x1F, 0x00, 0x21, 0x20, 0x00, 0x3F, 0x40, 0x00, 0x24, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x20, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF924, { 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x09, 0xF2, 0x00, 0x09, 0x24, 0x00, 0x3F, 0xF7, 0x80, 0x03, 0x18, 0x00, 0x05, 0xF0, 0x00, 0x09, 0x20, 0x00, 0x0B, 0xF7, 0x80, 0x1C, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF925, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x08, 0x02, 0x00, 0x08, 0x82, 0x00, 0x08, 0x84, 0x00, 0x0E, 0x44, 0x00, 0x38, 0x44, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x08, 0x00, 0x0B, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF926, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x49, 0x00, 0x14, 0x92, 0x00, 0x14, 0x49, 0x00, 0x14, 0x10, 0x00, 0x1D, 0xFF, 0x00, 0x15, 0x2B, 0x00, 0x15, 0x55, 0x00, 0x15, 0xFF, 0x00, 0x1D, 0x12, 0x00, 0x15, 0xDE, 0x00, 0x15, 0x12, 0x00, 0x15, 0xDE, 0x00, 0x15, 0x12, 0x80, 0x25, 0xDF, 0x80, 0x2F, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF927, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x49, 0x00, 0x08, 0x92, 0x00, 0x3E, 0x49, 0x00, 0x2A, 0x10, 0x00, 0x2A, 0x20, 0x00, 0x2A, 0xFF, 0x00, 0x2A, 0x95, 0x00, 0x2A, 0xA9, 0x00, 0x3E, 0xFF, 0x00, 0x08, 0x92, 0x00, 0x08, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x31, 0xDE, 0x80, 0x03, 0x33, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF928, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x80, 0x00, 0x11, 0x00, 0x00, 0x17, 0xDF, 0x00, 0x14, 0x51, 0x00, 0x17, 0xD2, 0x00, 0x14, 0x52, 0x00, 0x17, 0xD1, 0x00, 0x15, 0x11, 0x00, 0x14, 0x91, 0x00, 0x14, 0x91, 0x00, 0x25, 0xD6, 0x00, 0x2E, 0x30, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF929, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x0F, 0x80, 0x1F, 0x88, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x1F, 0x8F, 0x80, 0x10, 0x88, 0x80, 0x10, 0x88, 0x80, 0x1F, 0x88, 0x80, 0x12, 0x0F, 0x80, 0x12, 0x48, 0x80, 0x11, 0x88, 0x80, 0x11, 0x08, 0x80, 0x17, 0x90, 0x80, 0x38, 0x50, 0x80, 0x00, 0x23, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF92A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x20, 0x00, 0x01, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x21, 0x02, 0x00, 0x11, 0xFE, 0x00, 0x01, 0x02, 0x00, 0x09, 0x02, 0x00, 0x09, 0xFE, 0x00, 0x09, 0x11, 0x00, 0x11, 0x12, 0x00, 0x11, 0x0C, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7C, 0x00, 0x27, 0x82, 0x00, 0x20, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF92B, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x24, 0x20, 0x00, 0x18, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x1C, 0x82, 0x00, 0x24, 0xFE, 0x00, 0x04, 0x82, 0x00, 0x04, 0x82, 0x00, 0x0C, 0xFE, 0x00, 0x0C, 0x91, 0x00, 0x14, 0x92, 0x00, 0x24, 0x8C, 0x00, 0x04, 0x88, 0x00, 0x04, 0xFC, 0x00, 0x0B, 0x82, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF92C, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1F, 0x9F, 0x00, 0x10, 0x91, 0x00, 0x10, 0x91, 0x00, 0x1F, 0x92, 0x00, 0x10, 0x91, 0x00, 0x10, 0x90, 0x80, 0x1F, 0x90, 0x80, 0x12, 0x50, 0x80, 0x12, 0x90, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x1E, 0x97, 0x00, 0x30, 0x90, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF92D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x04, 0x44, 0x00, 0x0A, 0x4A, 0x00, 0x11, 0x51, 0x00, 0x00, 0x40, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF92E, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x28, 0x00, 0x08, 0x44, 0x00, 0x00, 0x82, 0x00, 0x03, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x21, 0x00, 0x10, 0x26, 0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF92F, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x12, 0x54, 0x80, 0x12, 0x95, 0x00, 0x22, 0x24, 0x00, 0x05, 0x0A, 0x00, 0x18, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x06, 0x02, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF930, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x2F, 0x00, 0x09, 0xF0, 0x00, 0x09, 0x3F, 0x80, 0x0B, 0x7F, 0x00, 0x0D, 0x49, 0x00, 0x39, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x09, 0x7F, 0x00, 0x0A, 0x11, 0x00, 0x1A, 0x66, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF931, { 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x08, 0x7E, 0x00, 0x08, 0x84, 0x00, 0x09, 0xFF, 0x00, 0x3F, 0x91, 0x00, 0x08, 0xFF, 0x00, 0x1C, 0x91, 0x00, 0x1A, 0xFF, 0x00, 0x28, 0xA9, 0x00, 0x29, 0x14, 0x80, 0x28, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF932, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x1F, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x0B, 0x17, 0x00, 0x2D, 0xF8, 0x00, 0x29, 0x1F, 0x80, 0x29, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x11, 0x55, 0x00, 0x22, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF933, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBC, 0x80, 0x1F, 0xC1, 0x00, 0x10, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF934, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 0x00, 0x41, 0x00, 0x00, 0x42, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x48, 0x00, 0x00, 0x50, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xC0, 0x00, 0x03, 0x00, 0x00, 0x0E, 0x1E, 0x00, 0x33, 0xE0, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x03, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF935, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x50, 0x00, 0x00, 0x7E, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xBC, 0x80, 0x1F, 0xC1, 0x00, 0x10, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF936, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x9C, 0x80, 0x1F, 0xE1, 0x00, 0x10, 0x7F, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x20, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0xC1, 0x00, 0x27, 0x06, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF937, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x10, 0x00, 0x11, 0x1F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x54, 0x00, 0x04, 0x8C, 0x00, 0x04, 0x12, 0x00, 0x04, 0x21, 0x80, 0x17, 0x60, 0x00, 0x14, 0xBF, 0x00, 0x14, 0x21, 0x00, 0x14, 0x21, 0x00, 0x17, 0xA1, 0x00, 0x38, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF938, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x2F, 0x5E, 0x80, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x22, 0x00, 0x1F, 0x54, 0x00, 0x04, 0x0C, 0x00, 0x17, 0x13, 0x80, 0x14, 0x3E, 0x00, 0x17, 0x52, 0x00, 0x38, 0x92, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF939, { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x18, 0x42, 0x00, 0x2F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x11, 0x00, 0x10, 0x88, 0x80, 0x20, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF93A, { 0x00, 0x00, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x62, 0x00, 0x04, 0x9C, 0x00, 0x17, 0xA6, 0x00, 0x14, 0x3D, 0x80, 0x3F, 0x3C, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x48, 0x80, 0x21, 0x25, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF93B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1F, 0x90, 0x00, 0x04, 0x3F, 0x00, 0x04, 0x21, 0x00, 0x08, 0x42, 0x00, 0x08, 0x74, 0x00, 0x08, 0x8C, 0x00, 0x1F, 0x7F, 0x80, 0x19, 0x08, 0x00, 0x29, 0x49, 0x00, 0x29, 0x2A, 0x00, 0x09, 0x1C, 0x00, 0x09, 0x1C, 0x00, 0x09, 0x2A, 0x00, 0x0F, 0x49, 0x00, 0x09, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF93C, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x3F, 0x42, 0x00, 0x08, 0x74, 0x00, 0x08, 0x8C, 0x00, 0x2B, 0x7F, 0x80, 0x2A, 0x08, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF93D, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0x3F, 0x00, 0x22, 0x21, 0x00, 0x14, 0x42, 0x00, 0x08, 0x74, 0x00, 0x12, 0x8C, 0x00, 0x3F, 0x7F, 0x80, 0x09, 0x08, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x98, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF93E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x04, 0x00, 0x03, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x04, 0xE8, 0x00, 0x03, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF93F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x14, 0x10, 0x00, 0x22, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x00, 0x42, 0x00, 0x3E, 0x74, 0x00, 0x08, 0x8C, 0x00, 0x08, 0x7F, 0x80, 0x3F, 0x08, 0x00, 0x08, 0x49, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x1C, 0x00, 0x28, 0x1C, 0x00, 0x0E, 0x2A, 0x00, 0x30, 0xC9, 0x00, 0x03, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF940, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x08, 0x00, 0x12, 0x69, 0x80, 0x13, 0x8E, 0x00, 0x12, 0x08, 0x00, 0x12, 0x08, 0x80, 0x13, 0xE8, 0x80, 0x2E, 0x0F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF941, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x14, 0x00, 0x00, 0x22, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x80, 0x80, 0x00, 0x3E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x00, 0x55, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x55, 0x00, 0x12, 0x55, 0x00, 0x1E, 0x55, 0x00, 0x12, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF942, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x0A, 0x3F, 0x00, 0x3F, 0x81, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x3E, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x24, 0x80, 0x11, 0x3F, 0x80, 0x13, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF943, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF944, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x24, 0x00, 0x21, 0x42, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x00, 0x01, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x24, 0x00, 0x1F, 0x3F, 0x00, 0x11, 0x24, 0x80, 0x13, 0x3F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF945, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x0A, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x1F, 0x01, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x24, 0x80, 0x13, 0x3F, 0x80, 0x1F, 0xFF, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x05, 0xFF, 0x80, 0x3F, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF946, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x40, 0x80, 0x04, 0x40, 0x00, 0x04, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x10, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF947, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x12, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x08, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xBF, 0x00, 0x28, 0xD1, 0x00, 0x08, 0x91, 0x00, 0x0F, 0x9F, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF948, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x10, 0x00, 0x12, 0x1F, 0x00, 0x12, 0x21, 0x00, 0x12, 0x22, 0x00, 0x1E, 0x54, 0x00, 0x12, 0x88, 0x00, 0x13, 0x16, 0x00, 0x12, 0x21, 0x80, 0x1E, 0x7F, 0x00, 0x12, 0xA1, 0x00, 0x13, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x22, 0x3F, 0x00, 0x26, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF949, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x2F, 0x5E, 0x80, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF94A, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x24, 0xA4, 0x80, 0x3F, 0xBF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF94B, { 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x01, 0x00, 0x0F, 0xFF, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0F, 0xFF, 0x80, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x0A, 0x22, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x11, 0x04, 0x00, 0x13, 0xE8, 0x00, 0x14, 0x3C, 0x00, 0x2B, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF94C, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x11, 0x00, 0x1D, 0xFF, 0x00, 0x1A, 0x10, 0x00, 0x39, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x28, 0x40, 0x00, 0x0F, 0xFF, 0x80, 0x09, 0x04, 0x00, 0x0B, 0xD8, 0x00, 0x08, 0x7C, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF94D, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x21, 0x00, 0x80, 0x11, 0x00, 0x80, 0x01, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x12, 0x22, 0x00, 0x22, 0x41, 0x00, 0x24, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF94E, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x0A, 0x10, 0x00, 0x0A, 0x10, 0x00, 0x0B, 0xFF, 0x00, 0x13, 0x15, 0x00, 0x13, 0x53, 0x00, 0x13, 0x31, 0x00, 0x15, 0x95, 0x00, 0x25, 0x53, 0x00, 0x29, 0x13, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF94F, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x09, 0x10, 0x00, 0x06, 0x20, 0x00, 0x02, 0x42, 0x00, 0x01, 0xBE, 0x00, 0x3F, 0xC1, 0x00, 0x00, 0x40, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF950, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x27, 0xFF, 0x80, 0x14, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x2A, 0x42, 0x00, 0x2A, 0xE4, 0x00, 0x08, 0x1C, 0x00, 0x08, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF951, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0x80, 0x24, 0x08, 0x00, 0x28, 0x08, 0x00, 0x29, 0x08, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x49, 0x00, 0x25, 0x49, 0x00, 0x25, 0x55, 0x00, 0x25, 0x63, 0x00, 0x25, 0x41, 0x00, 0x25, 0x41, 0x00, 0x25, 0x43, 0x00, 0x39, 0x00, 0x00, 0x21, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF952, { 0x00, 0x00, 0x00, 0x11, 0x10, 0x00, 0x11, 0x10, 0x00, 0x3F, 0x90, 0x00, 0x11, 0x10, 0x00, 0x1F, 0x7F, 0x00, 0x04, 0x11, 0x00, 0x3F, 0x91, 0x00, 0x24, 0x91, 0x00, 0x24, 0x91, 0x00, 0x3F, 0x91, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x3F, 0xA1, 0x00, 0x04, 0x21, 0x00, 0x04, 0x42, 0x00, 0x05, 0x8C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF953, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x11, 0x7F, 0x80, 0x1F, 0x08, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x11, 0x08, 0x80, 0x1F, 0x08, 0x80, 0x11, 0x10, 0x80, 0x11, 0x10, 0x80, 0x11, 0x20, 0x80, 0x11, 0x20, 0x80, 0x21, 0x41, 0x00, 0x27, 0x86, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF954, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x45, 0x00, 0x01, 0x7D, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x1E, 0x00, 0x09, 0xF0, 0x00, 0x10, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x10, 0x30, 0x00, 0x10, 0x58, 0x00, 0x21, 0x96, 0x00, 0x26, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF955, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x44, 0x00, 0x00, 0x44, 0x80, 0x08, 0x87, 0x80, 0x0B, 0x40, 0x00, 0x08, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x16, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x30, 0x00, 0x20, 0xCC, 0x00, 0x27, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF956, { 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x38, 0x10, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x44, 0x00, 0x1C, 0x84, 0x80, 0x1B, 0x07, 0x80, 0x2C, 0x40, 0x00, 0x28, 0xFE, 0x00, 0x29, 0x04, 0x00, 0x0A, 0x88, 0x00, 0x0C, 0x50, 0x00, 0x08, 0x30, 0x00, 0x08, 0xCC, 0x00, 0x09, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF957, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x22, 0x10, 0x00, 0x17, 0xFF, 0x80, 0x08, 0x24, 0x00, 0x12, 0x44, 0x80, 0x3E, 0x87, 0x80, 0x09, 0x20, 0x00, 0x2A, 0x7F, 0x00, 0x2A, 0x82, 0x00, 0x2B, 0x84, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x30, 0x00, 0x08, 0x6C, 0x00, 0x09, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF958, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x80, 0x06, 0x1F, 0x80, 0x38, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x02, 0x04, 0x00, 0x0D, 0x18, 0x00, 0x30, 0xE0, 0x00, 0x03, 0xB0, 0x00, 0x3C, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF959, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x7C, 0x10, 0x00, 0x45, 0xFF, 0x00, 0x44, 0x10, 0x00, 0x4B, 0xFF, 0x80, 0x48, 0x48, 0x00, 0x44, 0x48, 0x80, 0x44, 0x8F, 0x80, 0x47, 0x00, 0x00, 0x44, 0xFF, 0x00, 0x44, 0x42, 0x00, 0x44, 0x24, 0x00, 0x58, 0x18, 0x00, 0x40, 0x38, 0x00, 0x40, 0xC6, 0x00, 0x43, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF95A, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x1E, 0xA2, 0x80, 0x00, 0xFF, 0x80, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0x41, 0x00, 0x12, 0x7F, 0x00, 0x1E, 0x7F, 0x00, 0x12, 0xC1, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF95B, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x3F, 0xA2, 0x00, 0x11, 0x14, 0x00, 0x2A, 0x0C, 0x00, 0x06, 0x13, 0x80, 0x09, 0x60, 0x00, 0x30, 0x3C, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF95C, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x31, 0xF4, 0x00, 0x15, 0x19, 0x00, 0x0D, 0xF5, 0x00, 0x09, 0x12, 0x00, 0x17, 0xF5, 0x80, 0x3A, 0x1E, 0x80, 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF95D, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x22, 0x00, 0x3F, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x1E, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xA1, 0x00, 0x1F, 0x21, 0x00, 0x12, 0x21, 0x00, 0x12, 0x21, 0x00, 0x1E, 0x3F, 0x00, 0x12, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF95E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x04, 0x84, 0x00, 0x04, 0x44, 0x00, 0x04, 0x24, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x10, 0x04, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF95F, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x0A, 0x42, 0x00, 0x0A, 0x05, 0x00, 0x13, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF960, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x3F, 0xA1, 0x00, 0x08, 0x92, 0x00, 0x11, 0x0C, 0x00, 0x2A, 0x0C, 0x00, 0x06, 0x12, 0x00, 0x09, 0x61, 0x00, 0x10, 0x80, 0x80, 0x22, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x82, 0x00, 0x14, 0x01, 0x00, 0x24, 0x04, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF961, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x09, 0x22, 0x00, 0x06, 0x24, 0x00, 0x01, 0x44, 0x00, 0x04, 0x92, 0x00, 0x09, 0x39, 0x00, 0x17, 0xC4, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF962, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x04, 0x02, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF963, { 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x11, 0x80, 0x3F, 0x16, 0x00, 0x01, 0x18, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x03, 0x10, 0x00, 0x0D, 0x10, 0x80, 0x31, 0x10, 0x80, 0x01, 0x1F, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF964, { 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x3F, 0xF8, 0x00, 0x08, 0x91, 0x00, 0x08, 0x52, 0x00, 0x0B, 0xFF, 0x80, 0x10, 0x38, 0x00, 0x10, 0x54, 0x00, 0x3E, 0x92, 0x00, 0x33, 0x11, 0x80, 0x32, 0x10, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x12, 0xFF, 0x00, 0x12, 0x91, 0x00, 0x1E, 0xFF, 0x00, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF965, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x19, 0x11, 0x00, 0x19, 0x11, 0x00, 0x29, 0xFF, 0x00, 0x29, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x90, 0x00, 0x08, 0x60, 0x00, 0x08, 0x30, 0x00, 0x08, 0xCC, 0x00, 0x0B, 0x03, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF966, { 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x04, 0x80, 0x00, 0x09, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x24, 0xFF, 0x00, 0x04, 0x81, 0x00, 0x08, 0xFF, 0x00, 0x18, 0x81, 0x00, 0x28, 0xFF, 0x00, 0x08, 0x20, 0x00, 0x08, 0x7F, 0x00, 0x08, 0xC2, 0x00, 0x0B, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x6C, 0x00, 0x0B, 0x83, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF967, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x48, 0x00, 0x02, 0x44, 0x00, 0x04, 0x42, 0x00, 0x08, 0x41, 0x00, 0x10, 0x40, 0x80, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF968, { 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x08, 0x42, 0x00, 0x00, 0x22, 0x00, 0x00, 0x02, 0x00, 0x20, 0x44, 0x00, 0x10, 0x44, 0x00, 0x01, 0x44, 0x00, 0x01, 0x48, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x50, 0x80, 0x08, 0x50, 0x80, 0x10, 0x60, 0x00, 0x10, 0x41, 0x00, 0x10, 0xC1, 0x00, 0x23, 0x7F, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF969, { 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, 0x1F, 0xC4, 0x00, 0x12, 0x48, 0x00, 0x3F, 0xEF, 0x80, 0x12, 0x51, 0x00, 0x1F, 0xE1, 0x00, 0x02, 0x51, 0x00, 0x1F, 0xD2, 0x00, 0x12, 0x4A, 0x00, 0x1F, 0xCA, 0x00, 0x0A, 0x04, 0x00, 0x3F, 0xE4, 0x00, 0x10, 0x8A, 0x00, 0x29, 0x0A, 0x00, 0x07, 0x11, 0x00, 0x38, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF96A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x48, 0x80, 0x24, 0x88, 0x80, 0x03, 0x10, 0x00, 0x01, 0x21, 0x00, 0x00, 0xDF, 0x80, 0x3F, 0xE0, 0x80, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF96B, { 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x01, 0x04, 0x00, 0x02, 0x3E, 0x00, 0x1F, 0xC1, 0x00, 0x04, 0x08, 0x00, 0x09, 0x12, 0x00, 0x13, 0xA7, 0x00, 0x3C, 0xF8, 0x80, 0x01, 0x10, 0x00, 0x06, 0x4C, 0x00, 0x39, 0x93, 0x80, 0x06, 0x60, 0x00, 0x01, 0x86, 0x00, 0x0E, 0x18, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF96C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF96D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x04, 0x42, 0x00, 0x04, 0x41, 0x00, 0x08, 0x44, 0x80, 0x10, 0x48, 0x80, 0x21, 0xD0, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x34, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x07, 0xFE, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF96E, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x09, 0x08, 0x00, 0x09, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x08, 0x00, 0x09, 0xF8, 0x00, 0x08, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF96F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1C, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x41, 0x00, 0x00, 0x80, 0x80, 0x01, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x14, 0x00, 0x1E, 0x14, 0x00, 0x12, 0x24, 0x00, 0x12, 0x44, 0x80, 0x1E, 0x87, 0x80, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF970, { 0x00, 0x00, 0x00, 0x11, 0x3E, 0x00, 0x0A, 0x22, 0x00, 0x04, 0x22, 0x00, 0x0A, 0x22, 0x80, 0x11, 0x23, 0x80, 0x20, 0x40, 0x00, 0x04, 0x80, 0x00, 0x04, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x21, 0x00, 0x0E, 0x12, 0x00, 0x0D, 0x14, 0x00, 0x14, 0x08, 0x00, 0x24, 0x14, 0x00, 0x04, 0x62, 0x00, 0x05, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF971, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x10, 0x00, 0x12, 0x11, 0x00, 0x12, 0x0A, 0x00, 0x12, 0x0C, 0x00, 0x12, 0x04, 0x00, 0x12, 0xFA, 0x00, 0x2F, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF972, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x12, 0x10, 0x80, 0x02, 0x30, 0x80, 0x08, 0x30, 0x00, 0x08, 0x30, 0x00, 0x08, 0x30, 0x00, 0x08, 0x50, 0x00, 0x10, 0x50, 0x00, 0x10, 0x90, 0x00, 0x10, 0x90, 0x80, 0x21, 0x1F, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF973, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x08, 0x44, 0x00, 0x3E, 0x82, 0x00, 0x09, 0x01, 0x00, 0x0A, 0xFE, 0x80, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x38, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x18, 0x82, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF974, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x02, 0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x32, 0x02, 0x00, 0x02, 0x02, 0x00, 0x03, 0xFE, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF975, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x0E, 0x41, 0x00, 0x38, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF976, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x82, 0x00, 0x2B, 0x44, 0x00, 0x2A, 0x28, 0x00, 0x2A, 0x18, 0x00, 0x3E, 0x26, 0x00, 0x2A, 0xC1, 0x80, 0x2B, 0x7E, 0x00, 0x2A, 0x42, 0x00, 0x2A, 0x42, 0x00, 0x3E, 0x42, 0x00, 0x22, 0x42, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF977, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x21, 0x10, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x1F, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF978, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x16, 0x59, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x15, 0x55, 0x00, 0x18, 0xE3, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x43, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF979, { 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x10, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x10, 0x92, 0x00, 0x11, 0x11, 0x00, 0x12, 0x10, 0x80, 0x20, 0x10, 0x00, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF97A, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x00, 0x12, 0x00, 0x20, 0x13, 0x00, 0x10, 0xAA, 0x80, 0x05, 0x26, 0x80, 0x08, 0x42, 0x80, 0x08, 0x9C, 0x00, 0x13, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF97B, { 0x00, 0x00, 0x00, 0x04, 0x7F, 0x00, 0x25, 0x41, 0x00, 0x15, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x3F, 0xFF, 0x00, 0x04, 0x00, 0x00, 0x0C, 0xFF, 0x80, 0x0E, 0x7F, 0x00, 0x15, 0x49, 0x00, 0x14, 0x7F, 0x00, 0x14, 0x49, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x04, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF97C, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x80, 0x00, 0x08, 0x42, 0x00, 0x08, 0x24, 0x00, 0x08, 0x18, 0x00, 0x08, 0x08, 0x00, 0x0F, 0xC6, 0x00, 0x38, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF97D, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x08, 0x00, 0x00, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1E, 0x7F, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x12, 0x88, 0x80, 0x1E, 0x08, 0x00, 0x12, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF97E, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF97F, { 0x00, 0x00, 0x00, 0x1F, 0xF4, 0x00, 0x14, 0x44, 0x00, 0x1F, 0xF4, 0x00, 0x14, 0x44, 0x00, 0x17, 0xDF, 0x80, 0x15, 0x44, 0x80, 0x17, 0xC4, 0x80, 0x15, 0x44, 0x80, 0x17, 0xC4, 0x80, 0x11, 0x04, 0x80, 0x1F, 0xE4, 0x80, 0x19, 0x24, 0x80, 0x19, 0xE8, 0x80, 0x2E, 0x28, 0x80, 0x28, 0x30, 0x80, 0x28, 0x63, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF980, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF981, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0E, 0x10, 0x00, 0x11, 0xA0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x98, 0x00, 0x01, 0x04, 0x00, 0x06, 0x02, 0x00, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF982, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x9C, 0x80, 0x17, 0xE1, 0x00, 0x10, 0xFF, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x22, 0x00, 0x13, 0xFE, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x24, 0x89, 0x00, 0x2F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF983, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x04, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x40, 0x00, 0x04, 0x03, 0x00, 0x07, 0x9C, 0x00, 0x04, 0x94, 0x80, 0x04, 0x95, 0x00, 0x04, 0x96, 0x00, 0x08, 0x94, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x9F, 0x00, 0x11, 0x71, 0x00, 0x26, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF984, { 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x08, 0x3E, 0x00, 0x00, 0x20, 0x00, 0x03, 0xFF, 0x80, 0x02, 0x2F, 0x00, 0x23, 0xF8, 0x80, 0x12, 0x3F, 0x80, 0x02, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x0A, 0xFE, 0x00, 0x0A, 0x92, 0x00, 0x12, 0xFE, 0x00, 0x12, 0x11, 0x00, 0x12, 0xA8, 0x80, 0x24, 0xA2, 0x80, 0x25, 0x3E, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF985, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x09, 0xFF, 0x80, 0x09, 0x22, 0x00, 0x11, 0x7F, 0x00, 0x11, 0x49, 0x00, 0x1D, 0x7F, 0x00, 0x35, 0x49, 0x00, 0x35, 0x7F, 0x00, 0x35, 0x08, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x8A, 0x80, 0x15, 0x9F, 0x80, 0x1D, 0xF0, 0x80, 0x16, 0x81, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF986, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x21, 0x21, 0x00, 0x3F, 0x3F, 0x00, 0x20, 0x01, 0x00, 0x23, 0xF1, 0x00, 0x22, 0x11, 0x00, 0x23, 0xF1, 0x00, 0x20, 0x81, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x27, 0xF9, 0x00, 0x24, 0x09, 0x00, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF987, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x28, 0xF7, 0x80, 0x28, 0xB5, 0x80, 0x3E, 0xB5, 0x80, 0x28, 0x08, 0x00, 0x28, 0xFF, 0x80, 0x3E, 0x94, 0x00, 0x28, 0xFF, 0x00, 0x28, 0x95, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0xA4, 0x00, 0x16, 0xBF, 0x00, 0x0A, 0xA4, 0x00, 0x22, 0xBC, 0x80, 0x2D, 0x67, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF988, { 0x00, 0x00, 0x00, 0x3F, 0xBF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x15, 0x55, 0x00, 0x11, 0x51, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xDF, 0x00, 0x12, 0x10, 0x00, 0x13, 0xF0, 0x80, 0x2E, 0x1F, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF989, { 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x1C, 0x10, 0x00, 0x04, 0x3F, 0x00, 0x3F, 0xA5, 0x00, 0x06, 0x49, 0x00, 0x0D, 0x91, 0x00, 0x14, 0x62, 0x00, 0x24, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x01, 0xD0, 0x00, 0x06, 0x4C, 0x00, 0x3A, 0x47, 0x80, 0x01, 0xE8, 0x00, 0x03, 0x58, 0x00, 0x0C, 0x46, 0x00, 0x30, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF98A, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x41, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x04, 0x01, 0x00, 0x08, 0x02, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF98B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0xC7, 0x00, 0x17, 0x3C, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x24, 0x80, 0x11, 0x04, 0x00, 0x13, 0xFE, 0x00, 0x12, 0x02, 0x00, 0x13, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x23, 0xFE, 0x00, 0x22, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF98C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0xC7, 0x00, 0x17, 0x3C, 0x00, 0x11, 0x04, 0x00, 0x1F, 0xFF, 0x80, 0x13, 0x8E, 0x00, 0x15, 0x55, 0x00, 0x19, 0x24, 0x80, 0x11, 0x04, 0x00, 0x10, 0x20, 0x00, 0x11, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x21, 0x20, 0x00, 0x2F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF98D, { 0x00, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x3E, 0xBD, 0x00, 0x09, 0x6D, 0x00, 0x3F, 0xEA, 0x00, 0x2A, 0xBA, 0x00, 0x2B, 0x6D, 0x80, 0x3F, 0xAE, 0x80, 0x2A, 0x38, 0x00, 0x2A, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x3E, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x0B, 0x11, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF98E, { 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x20, 0x40, 0x00, 0x08, 0x40, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF98F, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x09, 0x11, 0x00, 0x08, 0x92, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x38, 0x00, 0x2A, 0x54, 0x00, 0x28, 0x92, 0x00, 0x2B, 0x11, 0x80, 0x09, 0x02, 0x00, 0x09, 0xFF, 0x00, 0x0A, 0x2A, 0x00, 0x0D, 0x4A, 0x00, 0x08, 0x8A, 0x00, 0x09, 0x3F, 0x80, 0x0A, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF990, { 0x00, 0x00, 0x00, 0x08, 0xE4, 0x00, 0x08, 0x04, 0x00, 0x15, 0xFA, 0x00, 0x24, 0x0A, 0x00, 0x18, 0xE4, 0x00, 0x12, 0xE9, 0x00, 0x3F, 0x1F, 0x00, 0x09, 0xE4, 0x80, 0x2A, 0xAD, 0x00, 0x2A, 0xF5, 0x00, 0x2A, 0x04, 0x00, 0x09, 0x44, 0x00, 0x02, 0x21, 0x00, 0x12, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF991, { 0x00, 0x00, 0x00, 0x08, 0x84, 0x00, 0x08, 0x85, 0x00, 0x08, 0xF4, 0x80, 0x3F, 0x24, 0x00, 0x09, 0xBF, 0x80, 0x0A, 0x44, 0x00, 0x0C, 0x4A, 0x00, 0x0A, 0x8A, 0x00, 0x0D, 0x11, 0x00, 0x3A, 0x21, 0x00, 0x08, 0x40, 0x80, 0x08, 0x00, 0x00, 0x09, 0x01, 0x00, 0x09, 0x25, 0x00, 0x0A, 0x24, 0x80, 0x1A, 0x24, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF992, { 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x12, 0xFF, 0x80, 0x00, 0x88, 0x80, 0x00, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x22, 0x7F, 0x00, 0x10, 0x49, 0x00, 0x07, 0x7F, 0x00, 0x09, 0x49, 0x00, 0x09, 0x7F, 0x00, 0x09, 0x08, 0x00, 0x11, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x88, 0x00, 0x22, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF993, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x0A, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x49, 0x00, 0x28, 0x6B, 0x00, 0x08, 0x5D, 0x00, 0x08, 0x49, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x0C, 0x00, 0x0C, 0x1C, 0x00, 0x12, 0x2A, 0x00, 0x12, 0x49, 0x00, 0x20, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF994, { 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x84, 0x00, 0x3E, 0x3F, 0x80, 0x08, 0x04, 0x00, 0x08, 0x04, 0x00, 0x09, 0x3F, 0x80, 0x08, 0xA4, 0x80, 0x3E, 0x3F, 0x80, 0x08, 0x24, 0x80, 0x0B, 0xBF, 0x80, 0x08, 0x84, 0x00, 0x08, 0x84, 0x00, 0x0E, 0xBF, 0x80, 0x30, 0xC4, 0x00, 0x01, 0x3F, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF995, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x06, 0x4C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x7C, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF996, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x12, 0x08, 0x00, 0x22, 0xFF, 0x80, 0x14, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x12, 0x49, 0x00, 0x3F, 0x6B, 0x00, 0x09, 0x5D, 0x00, 0x08, 0x7F, 0x00, 0x2A, 0x49, 0x00, 0x2A, 0x1C, 0x00, 0x2A, 0x2A, 0x00, 0x2A, 0x2A, 0x00, 0x08, 0x49, 0x00, 0x08, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF997, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x3F, 0x42, 0x00, 0x12, 0x94, 0x00, 0x13, 0x99, 0x00, 0x1E, 0xAA, 0x00, 0x12, 0x44, 0x00, 0x12, 0x99, 0x00, 0x1F, 0xFF, 0x80, 0x12, 0x00, 0x00, 0x12, 0x94, 0x80, 0x1E, 0x94, 0x80, 0x32, 0x94, 0x80, 0x02, 0xF7, 0x80, 0x02, 0x94, 0x80, 0x02, 0x24, 0x00, 0x02, 0xC4, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF998, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xBF, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x0A, 0x14, 0x00, 0x11, 0x22, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF999, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x10, 0x00, 0x21, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF99A, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x03, 0xFF, 0x80, 0x00, 0x10, 0x00, 0x20, 0x10, 0x00, 0x11, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x01, 0xFF, 0x00, 0x01, 0x11, 0x00, 0x39, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x0C, 0x10, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF99B, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x08, 0x00, 0x22, 0x08, 0x00, 0x00, 0xFF, 0x80, 0x3E, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x6B, 0x00, 0x08, 0x5D, 0x00, 0x0A, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x1C, 0x00, 0x28, 0x2A, 0x00, 0x0F, 0x2A, 0x00, 0x38, 0x49, 0x00, 0x00, 0x88, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF99C, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x11, 0x00, 0x3F, 0xF1, 0x00, 0x04, 0x11, 0x00, 0x04, 0x11, 0x00, 0x07, 0xD1, 0x00, 0x08, 0x51, 0x00, 0x08, 0x51, 0x00, 0x14, 0x91, 0x00, 0x22, 0x91, 0x00, 0x01, 0x11, 0x00, 0x01, 0x11, 0x00, 0x02, 0x11, 0x00, 0x04, 0x11, 0x00, 0x08, 0x01, 0x00, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF99D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x42, 0x00, 0x04, 0x41, 0x00, 0x08, 0x40, 0x80, 0x10, 0x44, 0x00, 0x01, 0xC8, 0x00, 0x00, 0x30, 0x00, 0x01, 0xC0, 0x00, 0x1E, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x41, 0x00, 0x00, 0x81, 0x00, 0x01, 0x01, 0x00, 0x06, 0x02, 0x00, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF99E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x3C, 0x80, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0xFF, 0x80, 0x24, 0x88, 0x80, 0x24, 0x88, 0x80, 0x24, 0x94, 0x80, 0x24, 0x94, 0x80, 0x24, 0xA2, 0x80, 0x3C, 0xC1, 0x80, 0x24, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF99F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0xE8, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x07, 0xE8, 0x80, 0x04, 0x48, 0x80, 0x08, 0x48, 0x80, 0x14, 0x88, 0x80, 0x23, 0x08, 0x80, 0x02, 0x08, 0x80, 0x04, 0x08, 0x80, 0x08, 0x01, 0x80, 0x30, 0x00, 0x00, 0x04, 0x89, 0x00, 0x08, 0x44, 0x80, 0x10, 0x44, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9A0, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0xE9, 0x00, 0x04, 0x09, 0x00, 0x07, 0xC9, 0x00, 0x08, 0x89, 0x00, 0x35, 0x09, 0x00, 0x02, 0x09, 0x00, 0x0C, 0x43, 0x00, 0x30, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x20, 0x00, 0x03, 0x12, 0x00, 0x0D, 0x0C, 0x00, 0x31, 0x04, 0x00, 0x01, 0xF2, 0x00, 0x1E, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1E, 0x00, 0x00, 0x02, 0x00, 0x3F, 0xA1, 0x00, 0x00, 0x41, 0x80, 0x00, 0xFF, 0x00, 0x1F, 0x41, 0x00, 0x00, 0x41, 0x00, 0x1F, 0x41, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x24, 0x00, 0x1F, 0x24, 0x00, 0x11, 0x24, 0x80, 0x11, 0x44, 0x80, 0x1F, 0x47, 0x80, 0x11, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9A2, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xE7, 0x00, 0x17, 0xB8, 0x00, 0x10, 0x90, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x90, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x92, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x92, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x98, 0x00, 0x21, 0x94, 0x00, 0x22, 0x92, 0x00, 0x2C, 0x91, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9A3, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x60, 0x00, 0x00, 0x90, 0x00, 0x01, 0x08, 0x00, 0x02, 0x06, 0x00, 0x0D, 0xF9, 0x80, 0x30, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x90, 0x00, 0x02, 0x41, 0x00, 0x02, 0x25, 0x00, 0x12, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9A4, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x28, 0x00, 0x3E, 0x44, 0x00, 0x08, 0x82, 0x00, 0x0B, 0x01, 0x80, 0x08, 0xFC, 0x00, 0x0A, 0x00, 0x00, 0x0C, 0xFC, 0x00, 0x38, 0x04, 0x00, 0x08, 0x48, 0x00, 0x08, 0x22, 0x00, 0x08, 0x91, 0x00, 0x0A, 0x84, 0x80, 0x0A, 0xFC, 0x80, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9A5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x94, 0x00, 0x08, 0x22, 0x00, 0x08, 0x41, 0x00, 0x08, 0xBE, 0x80, 0x1F, 0x00, 0x00, 0x12, 0x77, 0x00, 0x2A, 0x55, 0x00, 0x26, 0x55, 0x00, 0x04, 0x77, 0x00, 0x04, 0x00, 0x00, 0x08, 0x22, 0x00, 0x08, 0x22, 0x00, 0x10, 0x56, 0x00, 0x10, 0x99, 0x00, 0x21, 0x08, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9A6, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x14, 0x00, 0x21, 0x22, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x50, 0x00, 0x17, 0xFE, 0x00, 0x10, 0x52, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0xDA, 0x00, 0x17, 0xFE, 0x00, 0x20, 0xD8, 0x00, 0x23, 0x56, 0x00, 0x2C, 0x51, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9A7, { 0x00, 0x00, 0x00, 0x04, 0x49, 0x00, 0x24, 0x92, 0x00, 0x19, 0x24, 0x00, 0x08, 0x92, 0x00, 0x14, 0x49, 0x00, 0x25, 0xFF, 0x00, 0x05, 0x6D, 0x00, 0x05, 0xFF, 0x00, 0x0D, 0x12, 0x00, 0x0D, 0xDE, 0x00, 0x15, 0x12, 0x00, 0x25, 0x12, 0x00, 0x05, 0xDE, 0x80, 0x05, 0x12, 0x80, 0x05, 0xDD, 0x80, 0x1B, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9A8, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x04, 0x00, 0x01, 0x18, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x20, 0xC1, 0x00, 0x21, 0x21, 0x00, 0x22, 0x19, 0x00, 0x24, 0x07, 0x00, 0x3B, 0xF1, 0x00, 0x20, 0x01, 0x00, 0x27, 0xF9, 0x00, 0x21, 0x09, 0x00, 0x21, 0x09, 0x00, 0x21, 0x19, 0x00, 0x21, 0x01, 0x00, 0x3F, 0xFF, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9AA, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x80, 0x80, 0x0A, 0x41, 0x00, 0x0A, 0x04, 0x80, 0x13, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x08, 0x91, 0x00, 0x08, 0x91, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9AB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0xFF, 0x80, 0x0A, 0x08, 0x00, 0x11, 0x3F, 0x00, 0x20, 0xA1, 0x00, 0x1F, 0x3F, 0x00, 0x00, 0x21, 0x00, 0x1F, 0x3F, 0x00, 0x09, 0x21, 0x00, 0x0B, 0x3F, 0x00, 0x08, 0x21, 0x00, 0x08, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9AC, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x18, 0x00, 0x08, 0x24, 0x00, 0x0A, 0x42, 0x00, 0x0A, 0x81, 0x00, 0x2B, 0x00, 0x80, 0x28, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x26, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9AD, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x22, 0x00, 0x08, 0x41, 0x00, 0x08, 0x80, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x21, 0x00, 0x0E, 0x21, 0x00, 0x38, 0x21, 0x00, 0x00, 0x26, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9AE, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x14, 0x94, 0x80, 0x15, 0x15, 0x00, 0x24, 0x24, 0x00, 0x0A, 0x0A, 0x00, 0x11, 0x11, 0x00, 0x20, 0xA0, 0x80, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x48, 0x00, 0x00, 0x44, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9AF, { 0x00, 0x00, 0x00, 0x22, 0x08, 0x00, 0x22, 0x14, 0x00, 0x14, 0x22, 0x00, 0x3F, 0x41, 0x00, 0x08, 0x80, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x0F, 0x21, 0x00, 0x38, 0x21, 0x00, 0x08, 0x21, 0x00, 0x08, 0x26, 0x00, 0x10, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9B0, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3F, 0x94, 0x00, 0x12, 0x22, 0x00, 0x12, 0x41, 0x00, 0x1E, 0x80, 0x80, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x00, 0x00, 0x12, 0x00, 0x00, 0x12, 0xFF, 0x00, 0x1E, 0x21, 0x00, 0x32, 0x21, 0x00, 0x02, 0x21, 0x00, 0x02, 0x26, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9B1, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x14, 0x14, 0x00, 0x22, 0x22, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x80, 0x80, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0A, 0xFF, 0x00, 0x2A, 0x21, 0x00, 0x2A, 0x21, 0x00, 0x28, 0x21, 0x00, 0x0F, 0x26, 0x00, 0x38, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x18, 0x00, 0x07, 0xF6, 0x00, 0x38, 0x01, 0x80, 0x07, 0xFC, 0x00, 0x01, 0x04, 0x00, 0x01, 0x18, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9B3, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x0F, 0x5E, 0x00, 0x00, 0x40, 0x00, 0x0F, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xEF, 0x00, 0x12, 0xA9, 0x00, 0x1E, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x06, 0x4C, 0x00, 0x09, 0x52, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9B4, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0A, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x20, 0x10, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x21, 0x00, 0x11, 0x21, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x11, 0x21, 0x00, 0x16, 0x3F, 0x00, 0x10, 0x21, 0x00, 0x10, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9B5, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x80, 0x04, 0x04, 0x80, 0x0B, 0xFC, 0x80, 0x08, 0x44, 0x80, 0x18, 0x84, 0x80, 0x18, 0xFC, 0x80, 0x29, 0x0C, 0x80, 0x29, 0x94, 0x80, 0x0A, 0x54, 0x80, 0x0C, 0x24, 0x80, 0x08, 0x24, 0x80, 0x08, 0x44, 0x80, 0x08, 0x84, 0x80, 0x09, 0x00, 0x80, 0x0A, 0x00, 0x80, 0x08, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9B6, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x55, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0xD5, 0x00, 0x04, 0x7F, 0x00, 0x04, 0x00, 0x00, 0x15, 0xFF, 0x80, 0x15, 0x00, 0x00, 0x15, 0x7F, 0x00, 0x15, 0x41, 0x00, 0x25, 0x7F, 0x00, 0x25, 0x22, 0x00, 0x04, 0x14, 0x00, 0x04, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9B7, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3F, 0x14, 0x00, 0x0C, 0x7F, 0x00, 0x0C, 0x55, 0x00, 0x0C, 0x7F, 0x00, 0x3F, 0x55, 0x00, 0x2D, 0x7F, 0x00, 0x2D, 0x00, 0x00, 0x37, 0xFF, 0x80, 0x21, 0x00, 0x00, 0x21, 0x7F, 0x00, 0x3F, 0x41, 0x00, 0x21, 0x7F, 0x00, 0x21, 0x22, 0x00, 0x3F, 0x14, 0x00, 0x21, 0xFF, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9B8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x3F, 0x7F, 0x00, 0x0C, 0x09, 0x00, 0x16, 0xFF, 0x80, 0x15, 0x09, 0x00, 0x24, 0x7F, 0x00, 0x04, 0x08, 0x00, 0x1F, 0x08, 0x00, 0x00, 0x49, 0x00, 0x3F, 0xAA, 0x00, 0x04, 0x1C, 0x00, 0x15, 0x2C, 0x00, 0x15, 0x4A, 0x00, 0x24, 0x89, 0x00, 0x0C, 0x18, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x0F, 0x1E, 0x00, 0x08, 0x02, 0x00, 0x0F, 0x1E, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x02, 0x41, 0x00, 0x0A, 0x20, 0x80, 0x0A, 0x02, 0x80, 0x13, 0xFE, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9BB, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x19, 0x29, 0x00, 0x18, 0xC6, 0x00, 0x29, 0x82, 0x00, 0x2E, 0x01, 0x80, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x94, 0x00, 0x09, 0x12, 0x00, 0x0A, 0x31, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9BC, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x1F, 0xFF, 0x00, 0x08, 0xA2, 0x00, 0x07, 0x1C, 0x00, 0x3C, 0x07, 0x80, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0xC1, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x10, 0x01, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x20, 0x00, 0x10, 0x21, 0x00, 0x17, 0xF2, 0x00, 0x10, 0xB4, 0x00, 0x10, 0xA8, 0x00, 0x11, 0x28, 0x00, 0x11, 0x24, 0x00, 0x12, 0x24, 0x00, 0x24, 0x22, 0x00, 0x28, 0x21, 0x00, 0x20, 0xE0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9BE, { 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x14, 0x92, 0x00, 0x14, 0x8A, 0x00, 0x15, 0x02, 0x00, 0x04, 0x02, 0x00, 0x3F, 0xA2, 0x00, 0x04, 0x12, 0x00, 0x0E, 0x03, 0x80, 0x0D, 0x0E, 0x00, 0x14, 0x72, 0x00, 0x14, 0x02, 0x00, 0x24, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9BF, { 0x00, 0x00, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x00, 0x11, 0xF4, 0x00, 0x25, 0x19, 0x00, 0x15, 0xF5, 0x00, 0x09, 0x16, 0x00, 0x15, 0x19, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x80, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9C0, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x91, 0x00, 0x0A, 0x6A, 0x00, 0x2C, 0xC6, 0x00, 0x2B, 0x01, 0x80, 0x28, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x14, 0x10, 0x00, 0x14, 0x92, 0x00, 0x15, 0x11, 0x00, 0x22, 0x30, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9C1, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x2A, 0x52, 0x00, 0x19, 0x8C, 0x00, 0x0E, 0x03, 0x80, 0x0B, 0xFE, 0x00, 0x1A, 0x02, 0x00, 0x2B, 0xFE, 0x00, 0x0A, 0x02, 0x00, 0x0B, 0xFE, 0x00, 0x08, 0x20, 0x00, 0x11, 0x24, 0x00, 0x12, 0x22, 0x00, 0x24, 0x61, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C2, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x02, 0x49, 0x00, 0x04, 0xD3, 0x00, 0x09, 0x65, 0x00, 0x12, 0x49, 0x00, 0x05, 0xB1, 0x00, 0x06, 0x2C, 0x00, 0x38, 0xC3, 0x80, 0x03, 0x10, 0x00, 0x1C, 0x60, 0x00, 0x03, 0x86, 0x00, 0x00, 0x78, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C3, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x01, 0x29, 0x00, 0x00, 0xC6, 0x00, 0x21, 0x83, 0x80, 0x16, 0xFE, 0x00, 0x00, 0x82, 0x00, 0x00, 0xFE, 0x00, 0x38, 0x82, 0x00, 0x08, 0xFE, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x09, 0x11, 0x00, 0x0C, 0x30, 0x00, 0x13, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C4, { 0x00, 0x00, 0x00, 0x04, 0x20, 0x00, 0x04, 0x20, 0x00, 0x3F, 0xBF, 0x00, 0x11, 0x20, 0x00, 0x0A, 0x3F, 0x00, 0x3F, 0x81, 0x00, 0x00, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x1F, 0x20, 0x00, 0x11, 0x3F, 0x00, 0x11, 0x20, 0x80, 0x11, 0x3F, 0x80, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C5, { 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x40, 0x80, 0x1F, 0xFF, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x22, 0xFF, 0x00, 0x24, 0x00, 0x00, 0x28, 0x00, 0x00, 0x24, 0x00, 0x00, 0x23, 0xFF, 0x80, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x22, 0x44, 0x00, 0x2C, 0x84, 0x00, 0x20, 0x84, 0x80, 0x21, 0x07, 0x80, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x16, 0xF4, 0x80, 0x18, 0x54, 0x80, 0x10, 0x54, 0x80, 0x1E, 0x94, 0x80, 0x31, 0x64, 0x80, 0x03, 0x04, 0x80, 0x0C, 0xC4, 0x80, 0x30, 0x34, 0x80, 0x0F, 0xC4, 0x80, 0x02, 0x04, 0x80, 0x3F, 0xE4, 0x80, 0x02, 0x84, 0x80, 0x12, 0x84, 0x80, 0x0B, 0xE0, 0x80, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9C8, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0xFE, 0x00, 0x1F, 0x22, 0x00, 0x04, 0x22, 0x00, 0x0E, 0x22, 0x00, 0x0D, 0x22, 0x00, 0x0D, 0xFF, 0x80, 0x14, 0x22, 0x00, 0x14, 0x22, 0x00, 0x24, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x04, 0x22, 0x00, 0x05, 0xFF, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9C9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xB7, 0x80, 0x08, 0xC4, 0x80, 0x3E, 0x94, 0x80, 0x08, 0x94, 0x80, 0x18, 0x94, 0x80, 0x1C, 0x94, 0x80, 0x3A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0xF4, 0x80, 0x29, 0xA4, 0x80, 0x28, 0x24, 0x80, 0x08, 0x45, 0x80, 0x08, 0x44, 0x00, 0x08, 0x84, 0x00, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9CA, { 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x20, 0x40, 0x00, 0x10, 0x82, 0x00, 0x01, 0x1F, 0x00, 0x03, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x21, 0x12, 0x80, 0x26, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9CB, { 0x00, 0x00, 0x00, 0x10, 0x60, 0x00, 0x09, 0x9F, 0x80, 0x01, 0x04, 0x80, 0x01, 0x04, 0x80, 0x21, 0x24, 0x80, 0x11, 0xF8, 0x80, 0x03, 0x17, 0x00, 0x00, 0x20, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x11, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x21, 0xFF, 0x00, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9CC, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x3E, 0x10, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x08, 0x42, 0x00, 0x08, 0x9F, 0x00, 0x3F, 0xE0, 0x80, 0x08, 0x00, 0x00, 0x08, 0x92, 0x00, 0x08, 0x92, 0x00, 0x0E, 0x92, 0x00, 0x30, 0x92, 0x00, 0x00, 0x92, 0x00, 0x01, 0x12, 0x80, 0x06, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9CD, { 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x1C, 0x7F, 0x00, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x10, 0x11, 0x00, 0x17, 0xA1, 0x00, 0x38, 0x4E, 0x00, 0x00, 0x80, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9CE, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3F, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x20, 0x00, 0x10, 0x42, 0x00, 0x10, 0x9F, 0x00, 0x3F, 0xE0, 0x80, 0x32, 0x00, 0x00, 0x32, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x00, 0x12, 0x52, 0x80, 0x1E, 0x92, 0x80, 0x13, 0x13, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9CF, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x09, 0xFE, 0x00, 0x10, 0x22, 0x00, 0x24, 0x22, 0x00, 0x14, 0x22, 0x00, 0x08, 0x22, 0x00, 0x12, 0x22, 0x00, 0x27, 0xFF, 0x80, 0x39, 0x22, 0x00, 0x08, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x2A, 0x22, 0x00, 0x29, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D0, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x15, 0x7F, 0x80, 0x15, 0x04, 0x00, 0x04, 0x08, 0x00, 0x3F, 0xBF, 0x00, 0x0E, 0x21, 0x00, 0x15, 0x21, 0x00, 0x24, 0xBF, 0x00, 0x00, 0x21, 0x00, 0x05, 0x21, 0x00, 0x04, 0xBF, 0x00, 0x3F, 0xE1, 0x00, 0x04, 0x21, 0x00, 0x0A, 0x3F, 0x00, 0x11, 0x21, 0x00, 0x20, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9D1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x01, 0x00, 0x10, 0x01, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D2, { 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x3F, 0xC9, 0x00, 0x15, 0x48, 0x00, 0x26, 0x4B, 0x80, 0x0C, 0xFC, 0x00, 0x15, 0x48, 0x00, 0x2E, 0xC8, 0x80, 0x03, 0x08, 0x80, 0x0C, 0xC9, 0x00, 0x32, 0x39, 0x00, 0x0C, 0x8A, 0x00, 0x33, 0x24, 0x00, 0x0C, 0x44, 0x80, 0x31, 0x8A, 0x80, 0x06, 0x31, 0x80, 0x38, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9D3, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x48, 0x00, 0x24, 0x48, 0x80, 0x24, 0x8F, 0x80, 0x27, 0x10, 0x00, 0x24, 0x10, 0x00, 0x24, 0x10, 0x00, 0x25, 0xFF, 0x00, 0x2C, 0x10, 0x00, 0x20, 0x10, 0x00, 0x23, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D4, { 0x00, 0x00, 0x00, 0x04, 0x30, 0x00, 0x04, 0x48, 0x00, 0x08, 0x84, 0x00, 0x09, 0x02, 0x00, 0x1E, 0x01, 0x80, 0x19, 0xFE, 0x00, 0x28, 0x00, 0x00, 0x28, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D5, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x3B, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x0F, 0xFE, 0x00, 0x09, 0x12, 0x00, 0x09, 0x12, 0x00, 0x09, 0x16, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D6, { 0x00, 0x00, 0x00, 0x10, 0x30, 0x00, 0x08, 0x48, 0x00, 0x00, 0x84, 0x00, 0x01, 0x02, 0x00, 0x26, 0x01, 0x80, 0x11, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x0A, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x13, 0xFF, 0x00, 0x12, 0x49, 0x00, 0x12, 0x49, 0x00, 0x22, 0x49, 0x00, 0x22, 0x4B, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D7, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x18, 0x00, 0x3E, 0x24, 0x00, 0x08, 0x42, 0x00, 0x09, 0x81, 0x80, 0x3E, 0x7E, 0x00, 0x2A, 0x00, 0x00, 0x3E, 0xFF, 0x00, 0x2A, 0xA5, 0x00, 0x3E, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xFF, 0x00, 0x3E, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0xA5, 0x00, 0x08, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D8, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x11, 0xFE, 0x00, 0x20, 0x12, 0x00, 0x07, 0xFF, 0x80, 0x04, 0x12, 0x00, 0x09, 0xFE, 0x00, 0x18, 0x10, 0x00, 0x28, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9D9, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x14, 0x00, 0x0A, 0x14, 0x00, 0x0A, 0xFF, 0x80, 0x2A, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x08, 0x08, 0x00, 0x09, 0xFF, 0x80, 0x08, 0x18, 0x00, 0x08, 0x2C, 0x00, 0x08, 0x4A, 0x00, 0x09, 0x89, 0x80, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x11, 0x00, 0x11, 0x11, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9DB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x41, 0x00, 0x12, 0x82, 0x00, 0x09, 0x14, 0x00, 0x00, 0xA2, 0x00, 0x08, 0x49, 0x00, 0x10, 0x98, 0x80, 0x23, 0xE4, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9DC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x7F, 0x00, 0x28, 0x62, 0x00, 0x24, 0x94, 0x00, 0x27, 0x18, 0x00, 0x24, 0x26, 0x00, 0x24, 0xC1, 0x80, 0x27, 0x28, 0x00, 0x24, 0x48, 0x00, 0x24, 0xFF, 0x80, 0x25, 0x08, 0x00, 0x38, 0x7F, 0x00, 0x20, 0x08, 0x00, 0x21, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9DD, { 0x00, 0x00, 0x00, 0x01, 0xC0, 0x80, 0x1E, 0x08, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x02, 0x08, 0x80, 0x3F, 0xE8, 0x80, 0x06, 0x08, 0x80, 0x07, 0x08, 0x80, 0x0A, 0x88, 0x80, 0x0A, 0x48, 0x80, 0x12, 0x08, 0x80, 0x12, 0x08, 0x80, 0x22, 0x08, 0x80, 0x02, 0x08, 0x80, 0x02, 0x00, 0x80, 0x02, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9DE, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x10, 0x41, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x00, 0x06, 0x70, 0x00, 0x38, 0x0F, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9DF, { 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x10, 0x00, 0x80, 0x1F, 0xFF, 0x80, 0x12, 0x20, 0x00, 0x14, 0x7F, 0x80, 0x18, 0x80, 0x00, 0x13, 0x7F, 0x00, 0x16, 0x41, 0x00, 0x1A, 0x7F, 0x00, 0x12, 0x7F, 0x00, 0x12, 0x10, 0x00, 0x12, 0x3F, 0x80, 0x12, 0x62, 0x00, 0x13, 0x94, 0x00, 0x22, 0x1C, 0x00, 0x22, 0xE3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x07, 0xFC, 0x00, 0x04, 0x04, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x08, 0x89, 0x00, 0x31, 0x11, 0x00, 0x02, 0x21, 0x00, 0x0C, 0x41, 0x00, 0x31, 0x82, 0x00, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E1, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E2, { 0x00, 0x00, 0x00, 0x03, 0xC1, 0x00, 0x1E, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x07, 0x09, 0x00, 0x06, 0x89, 0x00, 0x0A, 0x49, 0x00, 0x12, 0x09, 0x00, 0x22, 0x43, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0xE0, 0x00, 0x01, 0x50, 0x00, 0x02, 0x48, 0x00, 0x0C, 0x46, 0x00, 0x30, 0x41, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9E3, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x23, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x02, 0x40, 0x00, 0x0A, 0x41, 0x80, 0x0A, 0x4E, 0x00, 0x0A, 0x70, 0x00, 0x12, 0x40, 0x00, 0x12, 0x40, 0x80, 0x12, 0x40, 0x80, 0x24, 0x7F, 0x80, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x3F, 0x11, 0x00, 0x09, 0x11, 0x00, 0x09, 0xFF, 0x00, 0x09, 0x11, 0x00, 0x09, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x09, 0xFF, 0x00, 0x0E, 0x10, 0x00, 0x30, 0x10, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E5, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x0F, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x28, 0x61, 0x00, 0x1B, 0x89, 0x00, 0x08, 0x89, 0x00, 0x0F, 0xF9, 0x00, 0x09, 0x89, 0x00, 0x19, 0xC9, 0x00, 0x2A, 0xA9, 0x00, 0x0A, 0x89, 0x00, 0x0C, 0x89, 0x00, 0x10, 0x89, 0x00, 0x10, 0x81, 0x00, 0x20, 0x83, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x11, 0x00, 0x3F, 0xFF, 0x00, 0x08, 0x24, 0x00, 0x08, 0x48, 0x00, 0x08, 0xFF, 0x00, 0x0B, 0x48, 0x00, 0x2A, 0x48, 0x00, 0x2A, 0x7F, 0x00, 0x28, 0x48, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x48, 0x00, 0x08, 0x48, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x07, 0x12, 0x00, 0x3A, 0x0C, 0x00, 0x03, 0xF6, 0x00, 0x3C, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9E8, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x49, 0x00, 0x3E, 0x49, 0x00, 0x02, 0x7F, 0x00, 0x04, 0x49, 0x00, 0x0A, 0x49, 0x00, 0x1C, 0x7F, 0x00, 0x2A, 0x08, 0x00, 0x0A, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x7F, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x08, 0x42, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x42, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9EA, { 0x00, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xEA, 0x00, 0x15, 0x52, 0x00, 0x12, 0x7F, 0x80, 0x15, 0x52, 0x00, 0x1F, 0xD2, 0x00, 0x00, 0x1F, 0x80, 0x3F, 0xD2, 0x00, 0x24, 0x52, 0x00, 0x29, 0x52, 0x00, 0x33, 0xDF, 0x80, 0x3C, 0xD2, 0x00, 0x20, 0x52, 0x00, 0x20, 0x5F, 0x80, 0x20, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x08, 0x00, 0x3F, 0xFF, 0x00, 0x22, 0x48, 0x00, 0x20, 0x80, 0x00, 0x3F, 0xFF, 0x00, 0x21, 0x00, 0x00, 0x22, 0x00, 0x00, 0x27, 0xFC, 0x00, 0x3A, 0x04, 0x00, 0x23, 0xFC, 0x00, 0x22, 0x04, 0x00, 0x20, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9EC, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xEF, 0x80, 0x00, 0x20, 0x80, 0x00, 0x20, 0x80, 0x23, 0xEF, 0x80, 0x12, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0B, 0xEF, 0x80, 0x08, 0xA2, 0x80, 0x09, 0x24, 0x80, 0x12, 0x39, 0x80, 0x1C, 0x62, 0x80, 0x10, 0xA4, 0x80, 0x11, 0x38, 0x80, 0x26, 0x20, 0x80, 0x20, 0xC3, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9ED, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x01, 0x10, 0x00, 0x00, 0xA0, 0x00, 0x00, 0xE0, 0x00, 0x03, 0x18, 0x00, 0x3C, 0x07, 0x80, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9EE, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x0A, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x0A, 0x38, 0x00, 0x2A, 0x54, 0x00, 0x28, 0x92, 0x00, 0x2B, 0x11, 0x80, 0x28, 0x52, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x9A, 0x00, 0x09, 0xAA, 0x00, 0x0A, 0x7F, 0x80, 0x14, 0x42, 0x00, 0x14, 0x82, 0x00, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9EF, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x92, 0x00, 0x3E, 0x54, 0x00, 0x0B, 0xFF, 0x80, 0x08, 0x38, 0x00, 0x08, 0x54, 0x00, 0x08, 0x92, 0x00, 0x3F, 0x11, 0x80, 0x08, 0x52, 0x00, 0x08, 0x7F, 0x80, 0x08, 0x9A, 0x00, 0x09, 0xAA, 0x00, 0x0E, 0x7F, 0x80, 0x30, 0x42, 0x00, 0x00, 0x82, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F0, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x11, 0x00, 0x1F, 0x1F, 0x00, 0x11, 0x21, 0x00, 0x12, 0x41, 0x00, 0x17, 0xF9, 0x00, 0x1A, 0x41, 0x00, 0x13, 0xF9, 0x00, 0x12, 0x41, 0x00, 0x13, 0xFD, 0x00, 0x12, 0x03, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x92, 0x00, 0x24, 0x54, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x38, 0x00, 0x24, 0x54, 0x00, 0x24, 0x92, 0x00, 0x27, 0x11, 0x80, 0x24, 0x52, 0x00, 0x24, 0x7F, 0x80, 0x24, 0x9A, 0x00, 0x25, 0x9A, 0x00, 0x3A, 0x6A, 0x00, 0x24, 0x7F, 0x80, 0x20, 0x82, 0x00, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F2, { 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x08, 0x92, 0x00, 0x1E, 0x54, 0x00, 0x23, 0xFF, 0x80, 0x04, 0x38, 0x00, 0x3E, 0x54, 0x00, 0x2A, 0x92, 0x00, 0x2B, 0x11, 0x80, 0x3E, 0x52, 0x00, 0x2A, 0x7F, 0x80, 0x2A, 0x9A, 0x00, 0x3F, 0xAA, 0x00, 0x01, 0x6A, 0x00, 0x0A, 0x7F, 0x80, 0x28, 0x82, 0x00, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F3, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x08, 0x49, 0x00, 0x3F, 0x2A, 0x00, 0x2D, 0xFF, 0x80, 0x3F, 0x1C, 0x00, 0x2D, 0x2A, 0x00, 0x2D, 0x49, 0x00, 0x3F, 0x88, 0x80, 0x2A, 0x42, 0x00, 0x2A, 0x7F, 0x80, 0x2F, 0x9A, 0x00, 0x2A, 0xDA, 0x00, 0x2B, 0x2A, 0x00, 0x2F, 0x7F, 0x80, 0x38, 0x82, 0x00, 0x23, 0x02, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F4, { 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x3F, 0xFF, 0x80, 0x04, 0x0E, 0x00, 0x0E, 0x0E, 0x00, 0x0D, 0x15, 0x00, 0x14, 0x95, 0x00, 0x14, 0x25, 0x00, 0x14, 0x24, 0x80, 0x24, 0x44, 0x80, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F5, { 0x00, 0x00, 0x00, 0x10, 0x84, 0x00, 0x08, 0x84, 0x00, 0x00, 0x84, 0x00, 0x00, 0x84, 0x00, 0x27, 0xFF, 0x80, 0x10, 0x84, 0x00, 0x01, 0xCE, 0x00, 0x01, 0xAE, 0x00, 0x0B, 0x95, 0x00, 0x0A, 0x95, 0x00, 0x0A, 0xA5, 0x00, 0x14, 0xA4, 0x80, 0x10, 0x84, 0x00, 0x10, 0x84, 0x00, 0x20, 0x84, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F6, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x28, 0x7F, 0x80, 0x28, 0x80, 0x00, 0x29, 0x7F, 0x00, 0x3E, 0x41, 0x00, 0x22, 0x41, 0x00, 0x22, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x22, 0x00, 0x00, 0x3E, 0xF7, 0x80, 0x28, 0x94, 0x80, 0x28, 0x94, 0x80, 0x28, 0x94, 0x80, 0x3E, 0xF7, 0x80, 0x20, 0x94, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9F7, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x02, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F8, { 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x04, 0x08, 0x00, 0x0F, 0xFF, 0x80, 0x12, 0x12, 0x00, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x02, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9F9, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x09, 0x08, 0x00, 0x29, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x3E, 0x41, 0x00, 0x08, 0x21, 0x00, 0x1C, 0x22, 0x00, 0x1A, 0x22, 0x00, 0x39, 0x14, 0x00, 0x28, 0x14, 0x00, 0x28, 0x14, 0x00, 0x28, 0x14, 0x00, 0x08, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9FA, { 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x11, 0x0A, 0x00, 0x11, 0x09, 0x00, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, 0x08, 0x00, 0x3F, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x14, 0x00, 0x11, 0x12, 0x00, 0x11, 0x22, 0x00, 0x21, 0x21, 0x00, 0x21, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9FB, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFE, 0x00, 0x06, 0x84, 0x00, 0x1A, 0x58, 0x00, 0x01, 0x20, 0x00, 0x00, 0xC0, 0x00, 0x03, 0x40, 0x00, 0x3C, 0x42, 0x00, 0x04, 0x44, 0x00, 0x04, 0x48, 0x00, 0x08, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x02, 0x08, 0x00, 0x0C, 0x06, 0x00, 0x30, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9FC, { 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x1C, 0x4A, 0x00, 0x00, 0x49, 0x00, 0x01, 0xF8, 0x00, 0x3E, 0xA8, 0x00, 0x00, 0xA8, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x1C, 0xE9, 0x00, 0x00, 0xA9, 0x00, 0x00, 0xEA, 0x00, 0x1C, 0xA4, 0x00, 0x14, 0xE4, 0x80, 0x14, 0xAA, 0x80, 0x1C, 0x31, 0x80, 0x14, 0xC0, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9FD, { 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x18, 0x10, 0x00, 0x18, 0x10, 0x00, 0x2B, 0xFF, 0x80, 0x28, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xF9FE, { 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, 0xA0, 0x00, 0x01, 0x10, 0x00, 0x06, 0x0C, 0x00, 0x38, 0x43, 0x80, 0x00, 0x40, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x04, 0x44, 0x00, 0x08, 0x42, 0x00, 0x10, 0x41, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xF9FF, { 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x3F, 0xE9, 0x00, 0x02, 0x09, 0x00, 0x02, 0x09, 0x00, 0x3F, 0xE9, 0x00, 0x22, 0x29, 0x00, 0x22, 0x29, 0x00, 0x22, 0x29, 0x00, 0x22, 0x29, 0x00, 0x27, 0x69, 0x00, 0x07, 0x09, 0x00, 0x0A, 0x89, 0x00, 0x0A, 0x89, 0x00, 0x12, 0x41, 0x00, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA00, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x09, 0x91, 0x00, 0x0E, 0x11, 0x00, 0x38, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x11, 0x00, 0x08, 0x91, 0x00, 0x08, 0xA1, 0x00, 0x0F, 0xA1, 0x00, 0x00, 0x42, 0x00, 0x01, 0x8C, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA01, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x08, 0x00, 0x11, 0x08, 0x00, 0x1F, 0xFF, 0x00, 0x11, 0x08, 0x00, 0x11, 0xF8, 0x00, 0x10, 0x00, 0x00, 0x17, 0xFE, 0x00, 0x11, 0x04, 0x00, 0x10, 0x88, 0x00, 0x10, 0x50, 0x00, 0x10, 0x60, 0x00, 0x21, 0x98, 0x00, 0x2E, 0x07, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xFA02, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0xFF, 0x80, 0x3E, 0x10, 0x00, 0x08, 0x20, 0x00, 0x08, 0x20, 0x00, 0x08, 0x40, 0x00, 0x0A, 0x40, 0x00, 0x0C, 0xFF, 0x00, 0x39, 0x41, 0x00, 0x0A, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x41, 0x00, 0x08, 0x7F, 0x00, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA03, { 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, 0x2A, 0x08, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x00, 0x08, 0xBF, 0x00, 0x3F, 0x89, 0x00, 0x08, 0xFF, 0x80, 0x18, 0x89, 0x00, 0x1C, 0xBF, 0x00, 0x3A, 0x88, 0x00, 0x28, 0x88, 0x00, 0x28, 0xBF, 0x00, 0x28, 0xA1, 0x00, 0x08, 0xA1, 0x00, 0x09, 0x3F, 0x00, 0x0A, 0x21, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA04, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x3F, 0xFF, 0x80, 0x20, 0x00, 0x80, 0x20, 0x00, 0x80, 0x00, 0x1C, 0x00, 0x00, 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x83, 0x80, 0x00, 0xBC, 0x00, 0x03, 0xC0, 0x00, 0x3C, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA05, { 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x0B, 0xFF, 0x80, 0x02, 0x00, 0x80, 0x02, 0x00, 0x80, 0x02, 0xFE, 0x80, 0x22, 0x00, 0x80, 0x12, 0x00, 0x80, 0x02, 0x7C, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x44, 0x80, 0x0A, 0x7C, 0x80, 0x12, 0x44, 0x80, 0x12, 0x00, 0x80, 0x12, 0x00, 0x80, 0x22, 0x00, 0x80, 0x22, 0x01, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xFA06, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x01, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x02, 0x48, 0x00, 0x0E, 0x4E, 0x00, 0x31, 0x71, 0x80, 0x01, 0xD0, 0x00, 0x06, 0x4C, 0x00, 0x38, 0xC3, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xFA07, { 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00, 0x3E, 0xFF, 0x80, 0x08, 0x00, 0x00, 0x3E, 0x7F, 0x00, 0x2A, 0x41, 0x00, 0x2A, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x2A, 0xFF, 0x80, 0x2A, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x88, 0x80, 0x3E, 0x88, 0x80, 0x08, 0xFF, 0x80, 0x08, 0x80, 0x80, 0x00, 0x00, 0x00, }}, +{ 0xFA08, { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0xFF, 0x00, 0x12, 0x00, 0x00, 0x22, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, 0xFF, 0x80, 0x18, 0x08, 0x00, 0x28, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x08, 0x00, 0x08, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA09, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x20, 0x00, 0x24, 0x7E, 0x00, 0x24, 0xA4, 0x00, 0x29, 0x18, 0x00, 0x26, 0x14, 0x00, 0x24, 0x63, 0x80, 0x25, 0x88, 0x00, 0x24, 0x08, 0x00, 0x25, 0xFF, 0x00, 0x24, 0x88, 0x00, 0x38, 0x88, 0x00, 0x27, 0xFF, 0x80, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA0A, { 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0F, 0xFE, 0x00, 0x01, 0x10, 0x00, 0x01, 0x10, 0x00, 0x02, 0x10, 0x80, 0x04, 0x10, 0x80, 0x08, 0x1F, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFA0B, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x1F, 0xFF, 0x80, 0x11, 0x00, 0x00, 0x11, 0x0F, 0x00, 0x1F, 0xE9, 0x00, 0x10, 0x09, 0x00, 0x17, 0xCA, 0x00, 0x14, 0x49, 0x00, 0x17, 0xC9, 0x00, 0x10, 0x09, 0x00, 0x17, 0xC9, 0x00, 0x10, 0x89, 0x00, 0x11, 0xE9, 0x00, 0x1F, 0x0E, 0x00, 0x21, 0x08, 0x00, 0x23, 0x08, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x01, 0x18, 0x00, 0x02, 0x18, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x1F, 0xF8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x01, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x1F, 0xC8, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x02, 0x08, 0x00, 0x0F, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x70, 0x00, 0x0E, 0x70, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x1F, 0xFC, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x1F, 0xFC, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF04, { 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x06, 0xD8, 0x00, 0x0C, 0xCC, 0x00, 0x0C, 0xC0, 0x00, 0x06, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xD8, 0x00, 0x00, 0xCC, 0x00, 0x0C, 0xCC, 0x00, 0x06, 0xD8, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0C, 0x00, 0x1B, 0x18, 0x00, 0x1B, 0x30, 0x00, 0x0E, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x38, 0x00, 0x06, 0x6C, 0x00, 0x0C, 0x6C, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x03, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x80, 0x00, 0x06, 0xCC, 0x00, 0x0C, 0xD8, 0x00, 0x0C, 0x70, 0x00, 0x0C, 0x76, 0x00, 0x07, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x0C, 0x1C, 0x00, 0x08, 0x34, 0x00, 0x18, 0x66, 0x00, 0x18, 0x66, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x19, 0x86, 0x00, 0x19, 0x86, 0x00, 0x0B, 0x04, 0x00, 0x0E, 0x0C, 0x00, 0x07, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x38, 0x00, 0x04, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x04, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x38, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x04, 0x00, 0x07, 0x1C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x00, 0x00, 0x70, 0x00, 0x00, 0xF0, 0x00, 0x01, 0xB0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x30, 0x00, 0x18, 0x30, 0x00, 0x30, 0x30, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x04, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x07, 0x1C, 0x00, 0x04, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x07, 0x1C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x03, 0x1C, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0D, 0xF8, 0x00, 0x0E, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x06, 0x06, 0x00, 0x07, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x0C, 0x06, 0x00, 0x08, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0E, 0x00, 0x06, 0x1E, 0x00, 0x01, 0xE6, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x07, 0x38, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x06, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x18, 0x18, 0x00, 0x30, 0x0C, 0x00, 0x33, 0xCC, 0x00, 0x36, 0x6C, 0x00, 0x36, 0x6C, 0x00, 0x36, 0x6C, 0x00, 0x36, 0x7C, 0x00, 0x33, 0xD8, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x3C, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x07, 0xF8, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x0C, 0x00, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF2, 0x00, 0x07, 0x1A, 0x00, 0x0C, 0x0E, 0x00, 0x0C, 0x06, 0x00, 0x18, 0x02, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x02, 0x00, 0x0C, 0x02, 0x00, 0x0C, 0x06, 0x00, 0x07, 0x1C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x0C, 0x38, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x38, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x06, 0x06, 0x00, 0x06, 0x02, 0x00, 0x06, 0x00, 0x00, 0x06, 0x10, 0x00, 0x06, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x06, 0x10, 0x00, 0x06, 0x10, 0x00, 0x06, 0x00, 0x00, 0x06, 0x02, 0x00, 0x06, 0x06, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x06, 0x06, 0x00, 0x06, 0x02, 0x00, 0x06, 0x00, 0x00, 0x06, 0x10, 0x00, 0x06, 0x10, 0x00, 0x07, 0xF0, 0x00, 0x06, 0x10, 0x00, 0x06, 0x10, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF2, 0x00, 0x07, 0x1E, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x02, 0x00, 0x18, 0x02, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x1F, 0x00, 0x18, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0C, 0x0E, 0x00, 0x07, 0x1E, 0x00, 0x01, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x0F, 0x80, 0x00, 0x0E, 0xC0, 0x00, 0x0C, 0x60, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x1E, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x02, 0x00, 0x06, 0x06, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0F, 0x00, 0x38, 0x0E, 0x00, 0x3C, 0x1E, 0x00, 0x3C, 0x1E, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x00, 0x33, 0x66, 0x00, 0x33, 0x66, 0x00, 0x31, 0xC6, 0x00, 0x31, 0xC6, 0x00, 0x30, 0x86, 0x00, 0x30, 0x06, 0x00, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x0F, 0x00, 0x18, 0x06, 0x00, 0x1C, 0x06, 0x00, 0x1E, 0x06, 0x00, 0x1B, 0x06, 0x00, 0x19, 0x86, 0x00, 0x18, 0xC6, 0x00, 0x18, 0x66, 0x00, 0x18, 0x36, 0x00, 0x18, 0x1E, 0x00, 0x18, 0x0E, 0x00, 0x18, 0x06, 0x00, 0x3C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0E, 0x1C, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x06, 0x1C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x1C, 0x00, 0x07, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x0E, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x19, 0xE6, 0x00, 0x0C, 0x3C, 0x00, 0x07, 0x18, 0x00, 0x01, 0xFD, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x38, 0x00, 0x0F, 0xE0, 0x00, 0x0C, 0x30, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x19, 0x00, 0x1E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE4, 0x00, 0x06, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x04, 0x00, 0x0C, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x06, 0x00, 0x0C, 0x06, 0x00, 0x0E, 0x06, 0x00, 0x0B, 0x0C, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x18, 0xC6, 0x00, 0x10, 0xC2, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x04, 0x08, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x06, 0x00, 0x18, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xCF, 0x00, 0x30, 0x86, 0x00, 0x30, 0x86, 0x00, 0x31, 0xC6, 0x00, 0x19, 0x4C, 0x00, 0x19, 0x4C, 0x00, 0x1B, 0x6C, 0x00, 0x1B, 0x6C, 0x00, 0x0A, 0x28, 0x00, 0x0E, 0x38, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x0F, 0x80, 0x18, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x18, 0x06, 0x00, 0x7C, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x0F, 0x00, 0x18, 0x06, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x18, 0x06, 0x00, 0x10, 0x0C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x02, 0x00, 0x18, 0x06, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xC0, 0x00, 0x03, 0x60, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x01, 0xC0, 0x00, 0x01, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x00, 0x18, 0x00, 0x01, 0xF8, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x38, 0x00, 0x07, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0xF8, 0x00, 0x07, 0x0C, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x06, 0x06, 0x00, 0x07, 0x0C, 0x00, 0x0E, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x06, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x03, 0xEC, 0x00, 0x06, 0x1C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x1C, 0x00, 0x03, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x8C, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x0F, 0xF8, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF6, 0x00, 0x06, 0x1C, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x01, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x0E, 0x0C, 0x00, 0x0C, 0x04, 0x00, 0x0E, 0x0C, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0xF0, 0x00, 0x07, 0x98, 0x00, 0x07, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x06, 0x60, 0x00, 0x06, 0x60, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x7C, 0x00, 0x06, 0x30, 0x00, 0x06, 0x60, 0x00, 0x06, 0xC0, 0x00, 0x07, 0xE0, 0x00, 0x07, 0x30, 0x00, 0x06, 0x18, 0x00, 0x0F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xBC, 0x00, 0x1C, 0xE6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x18, 0xC6, 0x00, 0x3C, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x0F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xF0, 0x00, 0x07, 0x18, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x07, 0x18, 0x00, 0x07, 0xF0, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xD8, 0x00, 0x06, 0x78, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x06, 0x38, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xF8, 0x00, 0x03, 0x9C, 0x00, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x78, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x0C, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x07, 0xF0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x88, 0x00, 0x01, 0x98, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x38, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x18, 0x00, 0x06, 0x38, 0x00, 0x03, 0xEE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x06, 0x0C, 0x00, 0x03, 0x18, 0x00, 0x03, 0x18, 0x00, 0x01, 0xB0, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xEF, 0x00, 0x31, 0xC6, 0x00, 0x31, 0xC6, 0x00, 0x1B, 0x6C, 0x00, 0x1B, 0x6C, 0x00, 0x1B, 0x6C, 0x00, 0x0E, 0x38, 0x00, 0x0E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3E, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0x30, 0x00, 0x06, 0x18, 0x00, 0x1F, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x0C, 0x0C, 0x00, 0x06, 0x18, 0x00, 0x03, 0x18, 0x00, 0x01, 0xB0, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x60, 0x00, 0x0C, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x0C, 0x18, 0x00, 0x08, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x01, 0x84, 0x00, 0x03, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x01, 0x80, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF5C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x1B, 0x0C, 0x00, 0x31, 0x98, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0C, 0x00, 0x01, 0xF8, 0x00, 0x06, 0x3C, 0x00, 0x0C, 0x6C, 0x00, 0x0C, 0xC0, 0x00, 0x0D, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x06, 0x0C, 0x00, 0x0D, 0xF0, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x01, 0x8C, 0x00, 0x03, 0x0C, 0x00, 0x03, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x37, 0x01, 0x00, 0x36, 0xE3, 0x00, 0x1C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x19, 0x86, 0x00, 0x30, 0xCC, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x1E, 0x00, 0x06, 0x18, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xE3, 0x80, 0x30, 0xC1, 0x00, 0x30, 0xC2, 0x00, 0x18, 0xC2, 0x00, 0x7F, 0xFF, 0x80, 0x18, 0x64, 0x00, 0x7F, 0xFF, 0x80, 0x0C, 0xE4, 0x00, 0x0D, 0x68, 0x00, 0x0D, 0x68, 0x00, 0x07, 0x38, 0x00, 0x06, 0x30, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x01, 0xE0, 0x00, 0x03, 0xF0, 0x00, 0x06, 0x18, 0x00, 0x0C, 0xCC, 0x00, 0x1F, 0xCE, 0x00, 0x3F, 0x9F, 0x00, 0x1F, 0x3E, 0x00, 0x0F, 0xFC, 0x00, 0x07, 0x38, 0x00, 0x03, 0x30, 0x00, 0x01, 0xE0, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, diff --git a/Mednafen/mednafen/video/font4x5.h b/Mednafen/mednafen/video/font4x5.h new file mode 100644 index 0000000000..7cdf21c892 --- /dev/null +++ b/Mednafen/mednafen/video/font4x5.h @@ -0,0 +1,195 @@ +{ 0x0020, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0021, { 0x40, 0x40, 0x40, 0x00, 0x40, }}, +{ 0x0022, { 0xA0, 0xA0, 0x00, 0x00, 0x00, }}, +{ 0x0023, { 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, }}, +{ 0x0024, { 0x40, 0xC0, 0xA0, 0x60, 0x40, }}, +{ 0x0025, { 0xA0, 0x20, 0x40, 0x80, 0xA0, }}, +{ 0x0026, { 0x40, 0xA0, 0x40, 0xA0, 0x60, }}, +{ 0x0027, { 0x40, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x0028, { 0x20, 0x40, 0x40, 0x40, 0x20, }}, +{ 0x0029, { 0x80, 0x40, 0x40, 0x40, 0x80, }}, +{ 0x002A, { 0x00, 0xA0, 0x40, 0xA0, 0x00, }}, +{ 0x002B, { 0x00, 0x40, 0xE0, 0x40, 0x00, }}, +{ 0x002C, { 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x002D, { 0x00, 0x00, 0xE0, 0x00, 0x00, }}, +{ 0x002E, { 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x002F, { 0x20, 0x40, 0x40, 0x40, 0x80, }}, +{ 0x0030, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x0031, { 0x40, 0xC0, 0x40, 0x40, 0xE0, }}, +{ 0x0032, { 0xE0, 0x20, 0x40, 0x80, 0xE0, }}, +{ 0x0033, { 0xE0, 0x20, 0x60, 0x20, 0xE0, }}, +{ 0x0034, { 0xA0, 0xA0, 0xE0, 0x20, 0x20, }}, +{ 0x0035, { 0xE0, 0x80, 0xE0, 0x20, 0xE0, }}, +{ 0x0036, { 0xE0, 0x80, 0xE0, 0xA0, 0xE0, }}, +{ 0x0037, { 0xE0, 0x20, 0x40, 0x40, 0x40, }}, +{ 0x0038, { 0x40, 0xA0, 0x40, 0xA0, 0x40, }}, +{ 0x0039, { 0x40, 0xA0, 0x60, 0x20, 0xC0, }}, +{ 0x003A, { 0x00, 0x40, 0x00, 0x40, 0x00, }}, +{ 0x003B, { 0x00, 0x40, 0x00, 0x00, 0x40, }}, +{ 0x003C, { 0x20, 0x40, 0x80, 0x40, 0x20, }}, +{ 0x003D, { 0x00, 0xE0, 0x00, 0xE0, 0x00, }}, +{ 0x003E, { 0x80, 0x40, 0x20, 0x40, 0x80, }}, +{ 0x003F, { 0xE0, 0x20, 0x40, 0x00, 0x40, }}, +{ 0x0040, { 0xE0, 0xA0, 0xA0, 0x80, 0xE0, }}, +{ 0x0041, { 0x40, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x0042, { 0xC0, 0xA0, 0xC0, 0xA0, 0xC0, }}, +{ 0x0043, { 0x60, 0x80, 0x80, 0x80, 0x60, }}, +{ 0x0044, { 0xC0, 0xA0, 0xA0, 0xA0, 0xC0, }}, +{ 0x0045, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x0046, { 0xE0, 0x80, 0xC0, 0x80, 0x80, }}, +{ 0x0047, { 0xE0, 0x80, 0xA0, 0xA0, 0xE0, }}, +{ 0x0048, { 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x0049, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x004A, { 0x20, 0x20, 0x20, 0xA0, 0x40, }}, +{ 0x004B, { 0xA0, 0xA0, 0xC0, 0xA0, 0xA0, }}, +{ 0x004C, { 0x80, 0x80, 0x80, 0x80, 0xE0, }}, +{ 0x004D, { 0xA0, 0xE0, 0xA0, 0xA0, 0xA0, }}, +{ 0x004E, { 0x20, 0xA0, 0xE0, 0xA0, 0x80, }}, +{ 0x004F, { 0x40, 0xA0, 0xA0, 0xA0, 0x40, }}, +{ 0x0050, { 0xE0, 0xA0, 0xE0, 0x80, 0x80, }}, +{ 0x0051, { 0xE0, 0xA0, 0xE0, 0xE0, 0x20, }}, +{ 0x0052, { 0xC0, 0xA0, 0xC0, 0xA0, 0xA0, }}, +{ 0x0053, { 0x60, 0x80, 0x40, 0x20, 0xC0, }}, +{ 0x0054, { 0xE0, 0x40, 0x40, 0x40, 0x40, }}, +{ 0x0055, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x0056, { 0xA0, 0xA0, 0xA0, 0x40, 0x40, }}, +{ 0x0057, { 0xA0, 0xA0, 0xA0, 0xE0, 0xA0, }}, +{ 0x0058, { 0xA0, 0xA0, 0x40, 0xA0, 0xA0, }}, +{ 0x0059, { 0xA0, 0xA0, 0x40, 0x40, 0x40, }}, +{ 0x005A, { 0xE0, 0x20, 0x40, 0x80, 0xE0, }}, +{ 0x005B, { 0x60, 0x40, 0x40, 0x40, 0x60, }}, +{ 0x005C, { 0x80, 0x40, 0x40, 0x40, 0x20, }}, +{ 0x005D, { 0xC0, 0x40, 0x40, 0x40, 0xC0, }}, +{ 0x005E, { 0x40, 0xA0, 0x00, 0x00, 0x00, }}, +{ 0x005F, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0060, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0061, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x0062, { 0xE0, 0xA0, 0xC0, 0xA0, 0xE0, }}, +{ 0x0063, { 0xE0, 0x80, 0x80, 0x80, 0xE0, }}, +{ 0x0064, { 0xC0, 0xA0, 0xA0, 0xA0, 0xC0, }}, +{ 0x0065, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x0066, { 0xE0, 0x80, 0xC0, 0x80, 0x80, }}, +{ 0x0067, { 0xE0, 0x80, 0xA0, 0xA0, 0xE0, }}, +{ 0x0068, { 0xA0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x0069, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x006A, { 0x20, 0x20, 0x20, 0xA0, 0xE0, }}, +{ 0x006B, { 0xA0, 0xA0, 0xC0, 0xA0, 0xA0, }}, +{ 0x006C, { 0x80, 0x80, 0x80, 0x80, 0xE0, }}, +{ 0x006D, { 0xA0, 0xE0, 0xA0, 0xA0, 0xA0, }}, +{ 0x006E, { 0x20, 0xA0, 0xE0, 0xA0, 0x80, }}, +{ 0x006F, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x0070, { 0xE0, 0xA0, 0xE0, 0x80, 0x80, }}, +{ 0x0071, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x0072, { 0xC0, 0xA0, 0xC0, 0xA0, 0xA0, }}, +{ 0x0073, { 0xE0, 0x80, 0xE0, 0x20, 0xE0, }}, +{ 0x0074, { 0xE0, 0x40, 0x40, 0x40, 0x40, }}, +{ 0x0075, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x0076, { 0xA0, 0xA0, 0xA0, 0xA0, 0x40, }}, +{ 0x0077, { 0xA0, 0xA0, 0xA0, 0xE0, 0xA0, }}, +{ 0x0078, { 0xA0, 0xA0, 0x40, 0xA0, 0xA0, }}, +{ 0x0079, { 0xA0, 0xA0, 0x40, 0x40, 0x40, }}, +{ 0x007A, { 0xE0, 0x20, 0x40, 0x80, 0xE0, }}, +{ 0x007B, { 0x60, 0x40, 0xC0, 0x40, 0x60, }}, +{ 0x007C, { 0x40, 0x40, 0x40, 0x40, 0x40, }}, +{ 0x007D, { 0xC0, 0x40, 0x60, 0x40, 0xC0, }}, +{ 0x007E, { 0xC0, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x00A0, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A1, { 0x40, 0x00, 0x40, 0x40, 0x40, }}, +{ 0x00A2, { 0x40, 0xE0, 0x80, 0xE0, 0x40, }}, +{ 0x00A3, { 0x20, 0x40, 0xE0, 0x40, 0xE0, }}, +{ 0x00A4, { 0xA0, 0xE0, 0xA0, 0xE0, 0xA0, }}, +{ 0x00A5, { 0xA0, 0xA0, 0x40, 0xE0, 0x40, }}, +{ 0x00A6, { 0x40, 0x40, 0x00, 0x40, 0x40, }}, +{ 0x00A7, { 0xE0, 0xC0, 0xE0, 0x60, 0xE0, }}, +{ 0x00A8, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A9, { 0x00, 0xE0, 0x80, 0xE0, 0x00, }}, +{ 0x00AA, { 0x00, 0xC0, 0xE0, 0x00, 0x00, }}, +{ 0x00AB, { 0x00, 0x20, 0x40, 0x20, 0x00, }}, +{ 0x00AD, { 0x00, 0x00, 0xE0, 0x00, 0x00, }}, +{ 0x00AE, { 0x00, 0xE0, 0xC0, 0xA0, 0x00, }}, +{ 0x00AF, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B0, { 0x00, 0xC0, 0xC0, 0x00, 0x00, }}, +{ 0x00B1, { 0x40, 0xE0, 0x40, 0x00, 0xE0, }}, +{ 0x00B2, { 0xC0, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x00B3, { 0xC0, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x00B4, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B5, { 0x00, 0x00, 0xA0, 0xA0, 0xE0, }}, +{ 0x00B6, { 0xE0, 0xA0, 0xE0, 0x20, 0x20, }}, +{ 0x00B7, { 0x00, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x00B8, { 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x00B9, { 0x40, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x00BA, { 0x00, 0xC0, 0xC0, 0x00, 0x00, }}, +{ 0x00BB, { 0x00, 0x80, 0x40, 0x80, 0x00, }}, +{ 0x00BF, { 0x40, 0x00, 0x40, 0x80, 0xE0, }}, +{ 0x00C0, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00C1, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00C2, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00C3, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00C4, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00C5, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00C7, { 0xE0, 0x80, 0x80, 0x80, 0xE0, }}, +{ 0x00C8, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00C9, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00CA, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00CB, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00CC, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00CD, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00CE, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00CF, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00D1, { 0x20, 0xA0, 0xE0, 0xA0, 0x80, }}, +{ 0x00D2, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00D3, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00D4, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00D5, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00D6, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00D7, { 0x00, 0xA0, 0x40, 0xA0, 0x00, }}, +{ 0x00D9, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00DA, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00DB, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00DC, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00DD, { 0xA0, 0xA0, 0x40, 0x40, 0x40, }}, +{ 0x00DF, { 0xE0, 0xA0, 0xC0, 0xA0, 0xE0, }}, +{ 0x00E0, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00E1, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00E2, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00E3, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00E4, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00E5, { 0xE0, 0xA0, 0xE0, 0xA0, 0xA0, }}, +{ 0x00E7, { 0xE0, 0x80, 0x80, 0x80, 0xE0, }}, +{ 0x00E8, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00E9, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00EA, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00EB, { 0xE0, 0x80, 0xC0, 0x80, 0xE0, }}, +{ 0x00EC, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00ED, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00EE, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00EF, { 0xE0, 0x40, 0x40, 0x40, 0xE0, }}, +{ 0x00F1, { 0x20, 0xA0, 0xE0, 0xA0, 0x80, }}, +{ 0x00F2, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00F3, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00F4, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00F5, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00F6, { 0xE0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00F7, { 0x40, 0x00, 0xE0, 0x00, 0x40, }}, +{ 0x00F9, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00FA, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00FB, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00FC, { 0xA0, 0xA0, 0xA0, 0xA0, 0xE0, }}, +{ 0x00FD, { 0xA0, 0xA0, 0x40, 0x40, 0x40, }}, +{ 0x00FF, { 0xA0, 0xA0, 0x40, 0x40, 0x40, }}, +{ 0x0178, { 0xA0, 0xA0, 0x40, 0x40, 0x40, }}, +{ 0x0192, { 0x60, 0x40, 0xE0, 0x40, 0xC0, }}, +{ 0x02C6, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C9, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DA, { 0xC0, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x02DC, { 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x037E, { 0x00, 0x40, 0x00, 0x00, 0x40, }}, +{ 0x03BC, { 0x00, 0x00, 0xA0, 0xA0, 0xE0, }}, +{ 0x2013, { 0x00, 0x00, 0xE0, 0x00, 0x00, }}, +{ 0x2014, { 0x00, 0x00, 0xE0, 0x00, 0x00, }}, +{ 0x201A, { 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x201E, { 0x00, 0x00, 0x00, 0xA0, 0xA0, }}, +{ 0x2022, { 0x00, 0x60, 0x60, 0x00, 0x00, }}, +{ 0x2026, { 0x00, 0x00, 0x00, 0x00, 0xA0, }}, +{ 0x2122, { 0xC0, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x22C5, { 0x00, 0x00, 0x40, 0x00, 0x00, }}, diff --git a/Mednafen/mednafen/video/font5x7.h b/Mednafen/mednafen/video/font5x7.h new file mode 100644 index 0000000000..7947194bec --- /dev/null +++ b/Mednafen/mednafen/video/font5x7.h @@ -0,0 +1,1848 @@ +{ 0x0000, {0x00, 0xA8, 0x00, 0x88, 0x00, 0xA8, 0x00, }}, +{ 0x0020, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0021, {0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, }}, +{ 0x0022, {0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0023, {0x00, 0x50, 0xF8, 0x50, 0xF8, 0x50, 0x00, }}, +{ 0x0024, {0x00, 0x70, 0xA0, 0x70, 0x28, 0x70, 0x00, }}, +{ 0x0025, {0x80, 0x90, 0x20, 0x40, 0x90, 0x10, 0x00, }}, +{ 0x0026, {0x00, 0x40, 0xA0, 0x40, 0xA0, 0x50, 0x00, }}, +{ 0x0027, {0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0028, {0x20, 0x40, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x0029, {0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x00, }}, +{ 0x002A, {0x00, 0x50, 0x20, 0x70, 0x20, 0x50, 0x00, }}, +{ 0x002B, {0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, }}, +{ 0x002C, {0x00, 0x00, 0x00, 0x00, 0x30, 0x20, 0x40, }}, +{ 0x002D, {0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, }}, +{ 0x002E, {0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, }}, +{ 0x002F, {0x00, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, }}, +{ 0x0030, {0x20, 0x50, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x0031, {0x20, 0x60, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0032, {0x60, 0x90, 0x10, 0x20, 0x40, 0xF0, 0x00, }}, +{ 0x0033, {0xF0, 0x10, 0x60, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x0034, {0x20, 0x60, 0xA0, 0xF0, 0x20, 0x20, 0x00, }}, +{ 0x0035, {0xF0, 0x80, 0xE0, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x0036, {0x60, 0x80, 0xE0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0037, {0xF0, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00, }}, +{ 0x0038, {0x60, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0039, {0x60, 0x90, 0x90, 0x70, 0x10, 0x60, 0x00, }}, +{ 0x003A, {0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, }}, +{ 0x003B, {0x00, 0x60, 0x60, 0x00, 0x60, 0x40, 0x80, }}, +{ 0x003C, {0x00, 0x10, 0x20, 0x40, 0x20, 0x10, 0x00, }}, +{ 0x003D, {0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, }}, +{ 0x003E, {0x00, 0x40, 0x20, 0x10, 0x20, 0x40, 0x00, }}, +{ 0x003F, {0x20, 0x50, 0x10, 0x20, 0x00, 0x20, 0x00, }}, +{ 0x0040, {0x60, 0x90, 0xB0, 0xB0, 0x80, 0x60, 0x00, }}, +{ 0x0041, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0042, {0xE0, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0043, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0044, {0xE0, 0x90, 0x90, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0045, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0046, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0047, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x0048, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0049, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x004A, {0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x004B, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x004C, {0x80, 0x80, 0x80, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x004D, {0x90, 0xF0, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x004E, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x00, }}, +{ 0x004F, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0050, {0xE0, 0x90, 0x90, 0xE0, 0x80, 0x80, 0x00, }}, +{ 0x0051, {0x60, 0x90, 0x90, 0x90, 0xD0, 0x60, 0x10, }}, +{ 0x0052, {0xE0, 0x90, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x0053, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x00, }}, +{ 0x0054, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x0055, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0056, {0x90, 0x90, 0x90, 0x90, 0x60, 0x60, 0x00, }}, +{ 0x0057, {0x90, 0x90, 0x90, 0xF0, 0xF0, 0x90, 0x00, }}, +{ 0x0058, {0x90, 0x90, 0x60, 0x60, 0x90, 0x90, 0x00, }}, +{ 0x0059, {0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x005A, {0xF0, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x005B, {0x70, 0x40, 0x40, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x005C, {0x00, 0x80, 0x40, 0x20, 0x10, 0x00, 0x00, }}, +{ 0x005D, {0x70, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00, }}, +{ 0x005E, {0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005F, {0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, }}, +{ 0x0060, {0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0061, {0x00, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x0062, {0x80, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0063, {0x00, 0x00, 0x60, 0x80, 0x80, 0x60, 0x00, }}, +{ 0x0064, {0x10, 0x10, 0x70, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0065, {0x00, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0066, {0x20, 0x50, 0x40, 0xE0, 0x40, 0x40, 0x00, }}, +{ 0x0067, {0x00, 0x00, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x0068, {0x80, 0x80, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0069, {0x20, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x006A, {0x10, 0x00, 0x10, 0x10, 0x10, 0x50, 0x20, }}, +{ 0x006B, {0x80, 0x80, 0xA0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x006C, {0x60, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x006D, {0x00, 0x00, 0xA0, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x006E, {0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x006F, {0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0070, {0x00, 0x00, 0xE0, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x0071, {0x00, 0x00, 0x70, 0x90, 0x90, 0x70, 0x10, }}, +{ 0x0072, {0x00, 0x00, 0xE0, 0x90, 0x80, 0x80, 0x00, }}, +{ 0x0073, {0x00, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x00, }}, +{ 0x0074, {0x40, 0x40, 0xE0, 0x40, 0x40, 0x30, 0x00, }}, +{ 0x0075, {0x00, 0x00, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0076, {0x00, 0x00, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x0077, {0x00, 0x00, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x0078, {0x00, 0x00, 0x90, 0x60, 0x60, 0x90, 0x00, }}, +{ 0x0079, {0x00, 0x00, 0x90, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x007A, {0x00, 0x00, 0xF0, 0x20, 0x40, 0xF0, 0x00, }}, +{ 0x007B, {0x10, 0x20, 0x60, 0x20, 0x20, 0x10, 0x00, }}, +{ 0x007C, {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x007D, {0x40, 0x20, 0x30, 0x20, 0x20, 0x40, 0x00, }}, +{ 0x007E, {0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A1, {0x20, 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x00A2, {0x00, 0x20, 0x70, 0xA0, 0xA0, 0x70, 0x20, }}, +{ 0x00A3, {0x00, 0x30, 0x40, 0xE0, 0x40, 0xB0, 0x00, }}, +{ 0x00A4, {0x00, 0x88, 0x70, 0x50, 0x70, 0x88, 0x00, }}, +{ 0x00A5, {0x50, 0x50, 0x20, 0x70, 0x20, 0x20, 0x00, }}, +{ 0x00A6, {0x00, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, }}, +{ 0x00A7, {0x30, 0x40, 0x60, 0x50, 0x30, 0x10, 0x60, }}, +{ 0x00A8, {0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A9, {0x70, 0x88, 0xA8, 0xC8, 0xA8, 0x88, 0x70, }}, +{ 0x00AA, {0x60, 0xA0, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AB, {0x00, 0x00, 0x48, 0x90, 0x48, 0x00, 0x00, }}, +{ 0x00AC, {0x00, 0x00, 0x00, 0xF0, 0x10, 0x00, 0x00, }}, +{ 0x00AD, {0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, }}, +{ 0x00AE, {0x70, 0x88, 0xE8, 0xC8, 0xC8, 0x88, 0x70, }}, +{ 0x00AF, {0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B0, {0x20, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B1, {0x20, 0x20, 0xF8, 0x20, 0x20, 0xF8, 0x00, }}, +{ 0x00B2, {0x60, 0x20, 0x40, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x00B3, {0x60, 0x60, 0x20, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x00B4, {0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B5, {0x00, 0x00, 0x90, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x00B6, {0x70, 0xD0, 0xD0, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x00B7, {0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x00B8, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, }}, +{ 0x00B9, {0x20, 0x60, 0x20, 0x70, 0x00, 0x00, 0x00, }}, +{ 0x00BA, {0x40, 0xA0, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BB, {0x00, 0x00, 0x90, 0x48, 0x90, 0x00, 0x00, }}, +{ 0x00BC, {0x80, 0x80, 0x80, 0x90, 0x30, 0x70, 0x10, }}, +{ 0x00BD, {0x80, 0x80, 0x80, 0xB0, 0x10, 0x20, 0x30, }}, +{ 0x00BE, {0xC0, 0xC0, 0x40, 0xD0, 0x30, 0x70, 0x10, }}, +{ 0x00BF, {0x20, 0x00, 0x20, 0x40, 0x50, 0x20, 0x00, }}, +{ 0x00C0, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x00C1, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x00C2, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x00C3, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x00C4, {0x90, 0x60, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x00C5, {0x60, 0x60, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x00C6, {0x70, 0xA0, 0xB0, 0xE0, 0xA0, 0xB0, 0x00, }}, +{ 0x00C7, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x40, }}, +{ 0x00C8, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x00C9, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x00CA, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x00CB, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x00CC, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00CD, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00CE, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00CF, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00D0, {0xE0, 0x50, 0xD0, 0x50, 0x50, 0xE0, 0x00, }}, +{ 0x00D1, {0xB0, 0x90, 0xD0, 0xB0, 0xB0, 0x90, 0x00, }}, +{ 0x00D2, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00D3, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00D4, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00D5, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00D6, {0x90, 0x60, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00D7, {0x00, 0x00, 0x90, 0x60, 0x60, 0x90, 0x00, }}, +{ 0x00D8, {0x70, 0xB0, 0xB0, 0xD0, 0xD0, 0xE0, 0x00, }}, +{ 0x00D9, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00DA, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00DB, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00DC, {0x90, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00DD, {0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x00DE, {0x80, 0xE0, 0x90, 0xE0, 0x80, 0x80, 0x00, }}, +{ 0x00DF, {0x60, 0x90, 0xA0, 0x90, 0x90, 0xA0, 0x00, }}, +{ 0x00E0, {0x40, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x00E1, {0x20, 0x40, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x00E2, {0x20, 0x50, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x00E3, {0x50, 0xA0, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x00E4, {0x50, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x00E5, {0x60, 0x60, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x00E6, {0x00, 0x00, 0x70, 0xB0, 0xA0, 0x70, 0x00, }}, +{ 0x00E7, {0x00, 0x00, 0x30, 0x40, 0x40, 0x30, 0x20, }}, +{ 0x00E8, {0x40, 0x20, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x00E9, {0x20, 0x40, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x00EA, {0x40, 0xA0, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x00EB, {0xA0, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x00EC, {0x40, 0x20, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00ED, {0x20, 0x40, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00EE, {0x20, 0x50, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00EF, {0x50, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x00F0, {0x40, 0x30, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00F1, {0x50, 0xA0, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x00F2, {0x40, 0x20, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00F3, {0x20, 0x40, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00F4, {0x60, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00F5, {0x50, 0xA0, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00F6, {0x50, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x00F7, {0x00, 0x60, 0x00, 0xF0, 0x00, 0x60, 0x00, }}, +{ 0x00F8, {0x00, 0x00, 0x70, 0xB0, 0xD0, 0xE0, 0x00, }}, +{ 0x00F9, {0x40, 0x20, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x00FA, {0x20, 0x40, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x00FB, {0x60, 0x00, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x00FC, {0x50, 0x00, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x00FD, {0x20, 0x40, 0x90, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x00FE, {0x00, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x00FF, {0x50, 0x00, 0x90, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x0100, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0101, {0x70, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x0102, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0103, {0x90, 0x60, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x0104, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x10, }}, +{ 0x0105, {0x00, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x08, }}, +{ 0x0106, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0107, {0x10, 0x20, 0x30, 0x40, 0x40, 0x30, 0x00, }}, +{ 0x0108, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0109, {0x60, 0x00, 0x60, 0x80, 0x80, 0x60, 0x00, }}, +{ 0x010A, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x010B, {0x40, 0x00, 0x60, 0x80, 0x80, 0x60, 0x00, }}, +{ 0x010C, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x010D, {0xA0, 0x40, 0x60, 0x80, 0x80, 0x60, 0x00, }}, +{ 0x010E, {0xE0, 0x90, 0x90, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x010F, {0xA0, 0x50, 0x10, 0x70, 0x90, 0x70, 0x00, }}, +{ 0x0110, {0xE0, 0x90, 0xD0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0111, {0x10, 0x38, 0x10, 0x70, 0x90, 0x70, 0x00, }}, +{ 0x0112, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0113, {0xE0, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0114, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0115, {0x90, 0x60, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0116, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0117, {0x40, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0118, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x40, }}, +{ 0x0119, {0x00, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x40, }}, +{ 0x011A, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x011B, {0xA0, 0x40, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x011C, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x011D, {0x60, 0x00, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x011E, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x011F, {0x50, 0x20, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x0120, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x0121, {0x20, 0x00, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x0122, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x40, }}, +{ 0x0123, {0x60, 0x20, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x0124, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0125, {0x40, 0xA0, 0x80, 0xE0, 0x90, 0x90, 0x00, }}, +{ 0x0126, {0x90, 0xF8, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0127, {0x80, 0xC0, 0x80, 0xE0, 0x90, 0x90, 0x00, }}, +{ 0x0128, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0129, {0x50, 0xA0, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x012A, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x012B, {0x70, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x012C, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x012D, {0x90, 0x60, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x012E, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x40, }}, +{ 0x012F, {0x20, 0x00, 0x60, 0x20, 0x20, 0x70, 0x40, }}, +{ 0x0130, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0131, {0x00, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0132, {0x90, 0x90, 0x90, 0x90, 0xD0, 0xA0, 0x00, }}, +{ 0x0133, {0x90, 0x00, 0x90, 0x90, 0x90, 0xD0, 0x20, }}, +{ 0x0134, {0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x0135, {0x20, 0x50, 0x00, 0x20, 0x20, 0xA0, 0x40, }}, +{ 0x0136, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x80, }}, +{ 0x0137, {0x80, 0x80, 0xA0, 0xC0, 0xA0, 0x90, 0x80, }}, +{ 0x0138, {0x00, 0x00, 0x90, 0xE0, 0x90, 0x90, 0x00, }}, +{ 0x0139, {0x90, 0xA0, 0x80, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x013A, {0xC8, 0x50, 0x40, 0x40, 0x40, 0xE0, 0x00, }}, +{ 0x013B, {0x80, 0x80, 0x80, 0x80, 0x80, 0xF0, 0x80, }}, +{ 0x013C, {0x60, 0x20, 0x20, 0x20, 0x20, 0x70, 0x40, }}, +{ 0x013D, {0xA8, 0x90, 0x80, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x013E, {0xA8, 0x90, 0x80, 0x80, 0x80, 0x40, 0x00, }}, +{ 0x013F, {0x80, 0x80, 0xA0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0140, {0xC0, 0x40, 0x50, 0x40, 0x40, 0xE0, 0x00, }}, +{ 0x0141, {0x80, 0x80, 0xC0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0142, {0x60, 0x20, 0x30, 0x60, 0x20, 0x70, 0x00, }}, +{ 0x0143, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x00, }}, +{ 0x0144, {0x20, 0x40, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0145, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x80, }}, +{ 0x0146, {0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x80, }}, +{ 0x0147, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x00, }}, +{ 0x0148, {0xA0, 0x40, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0149, {0x80, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x014A, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x20, }}, +{ 0x014B, {0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x20, }}, +{ 0x014C, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x014D, {0xF0, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x014E, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x014F, {0x90, 0x60, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0150, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0151, {0x48, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0152, {0x70, 0xA0, 0xB0, 0xA0, 0xA0, 0x70, 0x00, }}, +{ 0x0153, {0x00, 0x00, 0x70, 0xB0, 0xA0, 0x70, 0x00, }}, +{ 0x0154, {0xE0, 0x90, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x0155, {0x20, 0x40, 0xE0, 0x90, 0x80, 0x80, 0x00, }}, +{ 0x0156, {0xE0, 0x90, 0x90, 0xE0, 0xA0, 0x90, 0x80, }}, +{ 0x0157, {0x00, 0x00, 0xE0, 0x90, 0x80, 0x80, 0x40, }}, +{ 0x0158, {0xE0, 0x90, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x0159, {0xA0, 0x40, 0xE0, 0x90, 0x80, 0x80, 0x00, }}, +{ 0x015A, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x00, }}, +{ 0x015B, {0x20, 0x40, 0x70, 0xC0, 0x30, 0xE0, 0x00, }}, +{ 0x015C, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x00, }}, +{ 0x015D, {0x60, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x00, }}, +{ 0x015E, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x40, }}, +{ 0x015F, {0x00, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x40, }}, +{ 0x0160, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x00, }}, +{ 0x0161, {0x50, 0x20, 0x70, 0xC0, 0x30, 0xE0, 0x00, }}, +{ 0x0162, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, }}, +{ 0x0163, {0x40, 0x40, 0xE0, 0x40, 0x40, 0x30, 0x40, }}, +{ 0x0164, {0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x0165, {0x50, 0x20, 0x40, 0xE0, 0x40, 0x30, 0x00, }}, +{ 0x0166, {0xE0, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x0167, {0x40, 0xE0, 0x40, 0xE0, 0x40, 0x30, 0x00, }}, +{ 0x0168, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0169, {0x50, 0xA0, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x016A, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x016B, {0xF0, 0x00, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x016C, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x016D, {0x90, 0x60, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x016E, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x016F, {0x60, 0x60, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0170, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0171, {0x48, 0x90, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0172, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x40, }}, +{ 0x0173, {0x00, 0x00, 0x90, 0x90, 0x90, 0x70, 0x20, }}, +{ 0x0174, {0x90, 0x90, 0x90, 0xF0, 0xF0, 0x90, 0x00, }}, +{ 0x0175, {0x20, 0x50, 0x00, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x0176, {0xA0, 0xA0, 0xA0, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x0177, {0x20, 0x50, 0x00, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x0178, {0xA0, 0xA0, 0xA0, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x0179, {0xF0, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x017A, {0x20, 0x40, 0xF0, 0x20, 0x40, 0xF0, 0x00, }}, +{ 0x017B, {0xF0, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x017C, {0x20, 0x00, 0xF0, 0x20, 0x40, 0xF0, 0x00, }}, +{ 0x017D, {0xF0, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x017E, {0x50, 0x20, 0xF0, 0x20, 0x40, 0xF0, 0x00, }}, +{ 0x017F, {0x10, 0x20, 0x60, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x0180, {0x40, 0xE0, 0x40, 0x60, 0x50, 0x60, 0x00, }}, +{ 0x0181, {0xE0, 0x50, 0x60, 0x50, 0x50, 0x60, 0x00, }}, +{ 0x0182, {0xE0, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0183, {0x60, 0x40, 0x60, 0x50, 0x50, 0x60, 0x00, }}, +{ 0x0184, {0x40, 0xC0, 0xF0, 0x48, 0x48, 0x70, 0x00, }}, +{ 0x0185, {0x40, 0xC0, 0x60, 0x50, 0x50, 0x60, 0x00, }}, +{ 0x0186, {0x60, 0x90, 0x10, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x0187, {0x68, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0188, {0x00, 0x10, 0x60, 0x80, 0x80, 0x60, 0x00, }}, +{ 0x0189, {0xE0, 0x50, 0xD0, 0x50, 0x50, 0xE0, 0x00, }}, +{ 0x018A, {0xE0, 0x50, 0x50, 0x50, 0x50, 0x60, 0x00, }}, +{ 0x018B, {0x70, 0x10, 0x70, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x018C, {0x30, 0x10, 0x30, 0x50, 0x50, 0x30, 0x00, }}, +{ 0x018D, {0x00, 0x00, 0x60, 0x90, 0x60, 0x10, 0x60, }}, +{ 0x018E, {0xF0, 0x10, 0x70, 0x10, 0x10, 0xF0, 0x00, }}, +{ 0x018F, {0x60, 0x90, 0x10, 0xF0, 0x90, 0x60, 0x00, }}, +{ 0x0190, {0x60, 0x90, 0x40, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0191, {0x70, 0x40, 0x60, 0x40, 0x40, 0x40, 0x80, }}, +{ 0x0192, {0x20, 0x50, 0x40, 0xE0, 0x40, 0x40, 0x80, }}, +{ 0x0193, {0x70, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x0194, {0x00, 0x90, 0x90, 0x60, 0x90, 0x60, 0x00, }}, +{ 0x0195, {0x80, 0x80, 0xC8, 0xA8, 0xA8, 0x90, 0x00, }}, +{ 0x0196, {0x60, 0x20, 0x20, 0x20, 0x20, 0x10, 0x00, }}, +{ 0x0197, {0x70, 0x20, 0x70, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0198, {0xA0, 0xD0, 0x80, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x0199, {0x60, 0x80, 0xA0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x019A, {0x60, 0x20, 0x70, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x019B, {0x40, 0x30, 0x60, 0x20, 0x50, 0x50, 0x00, }}, +{ 0x019C, {0x90, 0x90, 0x90, 0x90, 0xF0, 0x50, 0x00, }}, +{ 0x019D, {0x48, 0x68, 0x68, 0x58, 0x58, 0x48, 0x80, }}, +{ 0x019E, {0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x019F, {0x60, 0x90, 0xF0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01A0, {0x68, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01A1, {0x00, 0x08, 0x70, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01A2, {0x70, 0xA8, 0xA8, 0xA8, 0xA8, 0x40, 0x00, }}, +{ 0x01A3, {0x00, 0x00, 0x70, 0xA8, 0xA8, 0x48, 0x00, }}, +{ 0x01A4, {0xE0, 0x50, 0x50, 0x60, 0x40, 0x40, 0x00, }}, +{ 0x01A5, {0x60, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x01A6, {0x80, 0xE0, 0x90, 0xE0, 0xC0, 0xA0, 0x10, }}, +{ 0x01A7, {0x60, 0x90, 0x20, 0x40, 0x90, 0x60, 0x00, }}, +{ 0x01A8, {0x00, 0x00, 0xE0, 0x30, 0xC0, 0x70, 0x00, }}, +{ 0x01A9, {0xF0, 0x80, 0x40, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x01AA, {0x40, 0xA0, 0x70, 0x20, 0x20, 0x20, 0x10, }}, +{ 0x01AB, {0x40, 0x40, 0xE0, 0x40, 0x70, 0x10, 0x20, }}, +{ 0x01AC, {0x70, 0xA0, 0xA0, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x01AD, {0x30, 0x40, 0xE0, 0x40, 0x40, 0x30, 0x00, }}, +{ 0x01AE, {0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x30, }}, +{ 0x01AF, {0x98, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01B0, {0x00, 0x08, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x01B1, {0x50, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, }}, +{ 0x01B2, {0xA0, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01B3, {0x90, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x01B4, {0x00, 0x00, 0x90, 0xA0, 0xA0, 0x40, 0x80, }}, +{ 0x01B5, {0xF0, 0x10, 0xF0, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x01B6, {0x00, 0x00, 0xF0, 0x70, 0x40, 0xF0, 0x00, }}, +{ 0x01B7, {0xF0, 0x20, 0x60, 0x10, 0x10, 0xE0, 0x00, }}, +{ 0x01B8, {0xF0, 0x40, 0x60, 0x80, 0x80, 0x70, 0x00, }}, +{ 0x01B9, {0x00, 0x00, 0xF0, 0x40, 0x60, 0x80, 0x70, }}, +{ 0x01BA, {0x00, 0x00, 0xF0, 0x20, 0x60, 0x30, 0xF8, }}, +{ 0x01BB, {0x60, 0x90, 0x10, 0xF0, 0x40, 0xF0, 0x00, }}, +{ 0x01BC, {0xF0, 0x80, 0xE0, 0x90, 0x10, 0xE0, 0x00, }}, +{ 0x01BD, {0x00, 0x00, 0x70, 0x60, 0x10, 0x60, 0x00, }}, +{ 0x01BE, {0x00, 0x20, 0x70, 0x20, 0x10, 0x60, 0x00, }}, +{ 0x01BF, {0x00, 0x00, 0xE0, 0x90, 0xA0, 0xC0, 0x80, }}, +{ 0x01C0, {0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x01C1, {0x00, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x01C2, {0x00, 0x20, 0x70, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x01C3, {0x00, 0x20, 0x20, 0x20, 0x00, 0x20, 0x00, }}, +{ 0x01C4, {0x18, 0xD8, 0xA8, 0xA8, 0xB0, 0xD8, 0x00, }}, +{ 0x01C5, {0xD8, 0xA0, 0xB8, 0xA8, 0xB0, 0xD8, 0x00, }}, +{ 0x01C6, {0x38, 0x20, 0x78, 0xA8, 0xB0, 0x78, 0x00, }}, +{ 0x01C7, {0x88, 0x88, 0x88, 0x88, 0xA8, 0xD0, 0x00, }}, +{ 0x01C8, {0x88, 0x80, 0x88, 0x88, 0x88, 0xE8, 0x10, }}, +{ 0x01C9, {0xC8, 0x40, 0x48, 0x48, 0x48, 0xE8, 0x10, }}, +{ 0x01CA, {0xC8, 0xA8, 0xA8, 0xA8, 0xA8, 0xB0, 0x00, }}, +{ 0x01CB, {0xC8, 0xA0, 0xA8, 0xA8, 0xA8, 0xA8, 0x10, }}, +{ 0x01CC, {0x08, 0x00, 0xC8, 0xA8, 0xA8, 0xA8, 0x10, }}, +{ 0x01CD, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x01CE, {0x50, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x01CF, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x01D0, {0x50, 0x20, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x01D1, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01D2, {0xA0, 0x40, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01D3, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01D4, {0x50, 0x20, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x01D5, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01D6, {0x70, 0x50, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x01D7, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01D8, {0x10, 0x70, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x01D9, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01DA, {0x50, 0x70, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x01DB, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x01DC, {0x40, 0x70, 0x00, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x01DD, {0x00, 0x00, 0x60, 0x30, 0xD0, 0x60, 0x00, }}, +{ 0x01DE, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x01DF, {0x70, 0x50, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x01E0, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x01E1, {0x70, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x01E2, {0xF0, 0x70, 0xA0, 0xF0, 0xA0, 0xB0, 0x00, }}, +{ 0x01E3, {0xF0, 0x00, 0x70, 0xB0, 0xA0, 0x70, 0x00, }}, +{ 0x01E4, {0x60, 0x90, 0x80, 0xB0, 0xB8, 0x70, 0x00, }}, +{ 0x01E5, {0x00, 0x00, 0x70, 0x90, 0x60, 0xB8, 0x70, }}, +{ 0x01E6, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x01E7, {0x50, 0x20, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x01E8, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x01E9, {0xD0, 0xA0, 0x80, 0xA0, 0xC0, 0xA0, 0x00, }}, +{ 0x01EA, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x40, }}, +{ 0x01EB, {0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x40, }}, +{ 0x01EC, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x40, }}, +{ 0x01ED, {0xF0, 0x00, 0x60, 0x90, 0x90, 0x60, 0x40, }}, +{ 0x01EE, {0xF0, 0x20, 0x60, 0x10, 0x10, 0xE0, 0x00, }}, +{ 0x01EF, {0x50, 0x20, 0xF0, 0x20, 0x60, 0x10, 0xE0, }}, +{ 0x01F0, {0x50, 0x20, 0x00, 0x20, 0x20, 0xA0, 0x40, }}, +{ 0x01F1, {0xD8, 0xA8, 0xA8, 0xB0, 0xB0, 0xD8, 0x00, }}, +{ 0x01F2, {0xC0, 0xA0, 0xB8, 0xA8, 0xB0, 0xD8, 0x00, }}, +{ 0x01F3, {0x20, 0x20, 0x78, 0xA8, 0xB0, 0x78, 0x00, }}, +{ 0x01F4, {0x60, 0x90, 0x80, 0xB0, 0x90, 0x70, 0x00, }}, +{ 0x01F5, {0x10, 0x20, 0x70, 0x90, 0x60, 0x80, 0x70, }}, +{ 0x01F6, {0xA0, 0xA0, 0xE8, 0xA8, 0xA8, 0x90, 0x00, }}, +{ 0x01F7, {0xE0, 0x90, 0xA0, 0xC0, 0x80, 0x80, 0x00, }}, +{ 0x01F8, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x00, }}, +{ 0x01F9, {0x40, 0x20, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x01FA, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x01FB, {0x20, 0x40, 0x60, 0x60, 0x90, 0x70, 0x00, }}, +{ 0x01FC, {0x70, 0xA0, 0xB0, 0xE0, 0xA0, 0xB0, 0x00, }}, +{ 0x01FD, {0x10, 0x20, 0x70, 0xB0, 0xA0, 0x70, 0x00, }}, +{ 0x01FE, {0x70, 0xB0, 0xB0, 0xD0, 0xD0, 0xE0, 0x00, }}, +{ 0x01FF, {0x10, 0x20, 0x70, 0xB0, 0xD0, 0xE0, 0x00, }}, +{ 0x0200, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0201, {0xA0, 0x50, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x0202, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0203, {0x60, 0x90, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x0204, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0205, {0xA0, 0x50, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0206, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0207, {0x60, 0x90, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0208, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0209, {0xA0, 0x50, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x020A, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x020B, {0x60, 0x90, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x020C, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x020D, {0xA0, 0x50, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x020E, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x020F, {0x60, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0210, {0xE0, 0x90, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x0211, {0xA0, 0x50, 0xE0, 0x90, 0x80, 0x80, 0x00, }}, +{ 0x0212, {0xE0, 0x90, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x0213, {0x60, 0x90, 0xE0, 0x90, 0x80, 0x80, 0x00, }}, +{ 0x0214, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0215, {0xA0, 0x50, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0216, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0217, {0x60, 0x90, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0218, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0xC0, }}, +{ 0x0219, {0x00, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0xC0, }}, +{ 0x021A, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, }}, +{ 0x021B, {0x40, 0x40, 0xE0, 0x40, 0x40, 0x30, 0x40, }}, +{ 0x021C, {0x60, 0x90, 0x10, 0x20, 0x10, 0xE0, 0x00, }}, +{ 0x021D, {0x00, 0x00, 0x60, 0xB0, 0x50, 0x20, 0xC0, }}, +{ 0x021E, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x021F, {0x50, 0xA0, 0x80, 0xE0, 0x90, 0x90, 0x00, }}, +{ 0x0250, {0x00, 0x00, 0xA0, 0xD0, 0x90, 0xE0, 0x00, }}, +{ 0x0251, {0x00, 0x00, 0x70, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0252, {0x00, 0x00, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0253, {0x60, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0254, {0x00, 0x00, 0x60, 0x10, 0x10, 0x60, 0x00, }}, +{ 0x0255, {0x00, 0x00, 0x60, 0x80, 0xB0, 0x60, 0x80, }}, +{ 0x0256, {0x10, 0x10, 0x70, 0x90, 0x90, 0x70, 0x18, }}, +{ 0x0257, {0x18, 0x10, 0x70, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x0258, {0x00, 0x00, 0x60, 0xD0, 0x30, 0x60, 0x00, }}, +{ 0x0259, {0x00, 0x00, 0x60, 0x30, 0xD0, 0x60, 0x00, }}, +{ 0x025A, {0x00, 0x00, 0x60, 0x38, 0xD0, 0x60, 0x00, }}, +{ 0x025B, {0x00, 0x00, 0x30, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x025C, {0x00, 0x00, 0x60, 0x20, 0x10, 0x60, 0x00, }}, +{ 0x025D, {0x00, 0x00, 0xF0, 0x40, 0x20, 0xC0, 0x00, }}, +{ 0x025E, {0x00, 0x00, 0x60, 0xA0, 0x90, 0x60, 0x00, }}, +{ 0x025F, {0x00, 0x20, 0x20, 0x70, 0x20, 0xA0, 0x40, }}, +{ 0x0260, {0x00, 0x08, 0x70, 0x90, 0x70, 0x10, 0x60, }}, +{ 0x0261, {0x00, 0x00, 0x70, 0x90, 0x70, 0x10, 0x60, }}, +{ 0x0262, {0x00, 0x00, 0x70, 0x80, 0x90, 0x70, 0x00, }}, +{ 0x0263, {0x00, 0x00, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x0264, {0x00, 0x00, 0x50, 0x20, 0x50, 0x20, 0x00, }}, +{ 0x0265, {0x00, 0x00, 0x90, 0x90, 0x90, 0x70, 0x10, }}, +{ 0x0266, {0x60, 0x80, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0267, {0x60, 0x80, 0xE0, 0x90, 0x90, 0x90, 0x20, }}, +{ 0x0268, {0x20, 0x00, 0x20, 0x70, 0x20, 0x70, 0x00, }}, +{ 0x0269, {0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x026A, {0x00, 0x00, 0xE0, 0x40, 0x40, 0xE0, 0x00, }}, +{ 0x026B, {0x60, 0x20, 0x68, 0xB0, 0x20, 0x70, 0x00, }}, +{ 0x026C, {0x60, 0x20, 0x60, 0x70, 0x20, 0x70, 0x00, }}, +{ 0x026D, {0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, }}, +{ 0x026E, {0x80, 0x80, 0xE0, 0x90, 0x90, 0xA0, 0x60, }}, +{ 0x026F, {0x00, 0x00, 0x90, 0x90, 0xF0, 0x50, 0x00, }}, +{ 0x0270, {0x00, 0x00, 0x90, 0x90, 0xF0, 0x50, 0x10, }}, +{ 0x0271, {0x00, 0x00, 0xA0, 0xF0, 0x90, 0x90, 0x20, }}, +{ 0x0272, {0x00, 0x00, 0x60, 0x50, 0x50, 0x50, 0x80, }}, +{ 0x0273, {0x00, 0x00, 0xC0, 0xA0, 0xA0, 0xA0, 0x10, }}, +{ 0x0274, {0x00, 0x00, 0x90, 0xD0, 0xB0, 0x90, 0x00, }}, +{ 0x0275, {0x00, 0x60, 0x90, 0xF0, 0x90, 0x60, 0x00, }}, +{ 0x0276, {0x00, 0x00, 0x70, 0xB0, 0xA0, 0x70, 0x00, }}, +{ 0x0277, {0x00, 0x00, 0x60, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x0278, {0x00, 0x20, 0x70, 0xA8, 0x70, 0x20, 0x00, }}, +{ 0x0279, {0x00, 0x00, 0x10, 0x10, 0x90, 0x70, 0x00, }}, +{ 0x027A, {0x00, 0x10, 0x10, 0x10, 0x90, 0x70, 0x00, }}, +{ 0x027B, {0x00, 0x00, 0x20, 0xA0, 0x60, 0x30, 0x00, }}, +{ 0x027C, {0x00, 0xE0, 0x90, 0x80, 0x80, 0x80, 0x80, }}, +{ 0x027D, {0x00, 0xE0, 0x90, 0x80, 0x80, 0x80, 0x40, }}, +{ 0x027E, {0x00, 0x00, 0x60, 0x90, 0x80, 0x80, 0x00, }}, +{ 0x027F, {0x00, 0x00, 0x60, 0x90, 0x10, 0x10, 0x00, }}, +{ 0x0280, {0x00, 0x00, 0xE0, 0x90, 0xE0, 0x90, 0x00, }}, +{ 0x0281, {0x00, 0x00, 0x90, 0xE0, 0x90, 0xE0, 0x00, }}, +{ 0x0282, {0x00, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x80, }}, +{ 0x0283, {0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, }}, +{ 0x0284, {0x10, 0x20, 0x20, 0x20, 0x70, 0x20, 0x40, }}, +{ 0x0285, {0x00, 0x00, 0x40, 0x20, 0x20, 0x10, 0x00, }}, +{ 0x0286, {0x10, 0x20, 0x20, 0x20, 0x70, 0xA0, 0x40, }}, +{ 0x0287, {0x00, 0xC0, 0x20, 0x20, 0x70, 0x20, 0x20, }}, +{ 0x0288, {0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x30, }}, +{ 0x0289, {0x00, 0x00, 0x90, 0xF0, 0x90, 0x70, 0x00, }}, +{ 0x028A, {0x00, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x028B, {0x00, 0x00, 0xA0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x028C, {0x00, 0x00, 0x20, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x028D, {0x00, 0x00, 0xF0, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x028E, {0x00, 0x20, 0x40, 0xA0, 0x90, 0x90, 0x00, }}, +{ 0x028F, {0x00, 0x00, 0xA0, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x0290, {0x00, 0x00, 0xF0, 0x20, 0x40, 0xF0, 0x10, }}, +{ 0x0291, {0x00, 0x00, 0xF0, 0x20, 0x50, 0xF0, 0x40, }}, +{ 0x0292, {0x00, 0x00, 0xF0, 0x20, 0x60, 0x10, 0xE0, }}, +{ 0x0293, {0x00, 0x00, 0xF0, 0x20, 0x60, 0x50, 0x78, }}, +{ 0x0294, {0x00, 0x60, 0x10, 0x30, 0x20, 0x20, 0x00, }}, +{ 0x0295, {0x00, 0x30, 0x40, 0x60, 0x20, 0x20, 0x00, }}, +{ 0x0296, {0x00, 0x20, 0x20, 0x30, 0x10, 0x60, 0x00, }}, +{ 0x0297, {0x00, 0x20, 0x50, 0x40, 0x40, 0x50, 0x20, }}, +{ 0x0298, {0x00, 0x70, 0x88, 0xA8, 0x88, 0x70, 0x00, }}, +{ 0x0299, {0x00, 0x00, 0xE0, 0xE0, 0x90, 0xE0, 0x00, }}, +{ 0x029A, {0x00, 0x00, 0x60, 0x50, 0x90, 0x60, 0x00, }}, +{ 0x029B, {0x00, 0x18, 0x70, 0x80, 0x90, 0x70, 0x00, }}, +{ 0x029C, {0x00, 0x00, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x029D, {0x20, 0x00, 0x20, 0x20, 0x70, 0xA0, 0x40, }}, +{ 0x029E, {0x00, 0x00, 0x90, 0x50, 0x30, 0x50, 0x10, }}, +{ 0x029F, {0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x02A0, {0x00, 0x18, 0x70, 0x90, 0x90, 0x70, 0x10, }}, +{ 0x02A1, {0x00, 0x60, 0x10, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x02A2, {0x00, 0x30, 0x40, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x02A3, {0x20, 0x20, 0x78, 0xA8, 0xB0, 0x78, 0x00, }}, +{ 0x02A4, {0x20, 0x20, 0x78, 0xA8, 0xB0, 0x68, 0x10, }}, +{ 0x02A5, {0x20, 0x20, 0x78, 0xA8, 0xB8, 0x78, 0x00, }}, +{ 0x02A6, {0x40, 0x40, 0xE8, 0x50, 0x48, 0x30, 0x00, }}, +{ 0x02A7, {0x48, 0x50, 0xF0, 0x50, 0x50, 0x30, 0x20, }}, +{ 0x02A8, {0x40, 0x40, 0xE8, 0x50, 0x50, 0x38, 0x10, }}, +{ 0x02B6, {0xA0, 0xC0, 0xA0, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x02B8, {0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B9, {0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BC, {0x30, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BD, {0x60, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C6, {0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C7, {0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C8, {0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C9, {0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02CC, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, }}, +{ 0x02D0, {0x00, 0x70, 0x20, 0x00, 0x20, 0x70, 0x00, }}, +{ 0x02D6, {0x00, 0x00, 0x20, 0x70, 0x20, 0x00, 0x00, }}, +{ 0x02D8, {0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D9, {0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DA, {0x20, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DB, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x30, }}, +{ 0x02DC, {0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DD, {0x48, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0300, {0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0301, {0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0302, {0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0303, {0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0304, {0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0305, {0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0306, {0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0307, {0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0308, {0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0309, {0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030A, {0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030B, {0x48, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030C, {0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030D, {0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030E, {0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030F, {0x90, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0310, {0xA8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0311, {0x60, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0323, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, }}, +{ 0x0324, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x0338, {0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x00, }}, +{ 0x0340, {0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0341, {0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0374, {0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0375, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, }}, +{ 0x037A, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x037E, {0x00, 0x60, 0x60, 0x00, 0x60, 0x40, 0x80, }}, +{ 0x0384, {0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0385, {0xB0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0386, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x0387, {0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x0388, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x0389, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x038A, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x038C, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x038E, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x038F, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x0390, {0xB0, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x0391, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0392, {0xE0, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0393, {0xF0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0394, {0x60, 0x60, 0x90, 0x90, 0x90, 0xF0, 0x00, }}, +{ 0x0395, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0396, {0xF0, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x0397, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0398, {0x60, 0x90, 0xF0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x0399, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x039A, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x039B, {0x60, 0x60, 0x60, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x039C, {0x90, 0xF0, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x039D, {0x90, 0xD0, 0xD0, 0xB0, 0xB0, 0x90, 0x00, }}, +{ 0x039E, {0xF0, 0x00, 0x60, 0x00, 0x00, 0xF0, 0x00, }}, +{ 0x039F, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03A0, {0xF0, 0x90, 0x90, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x03A1, {0xE0, 0x90, 0x90, 0xE0, 0x80, 0x80, 0x00, }}, +{ 0x03A3, {0xF0, 0x80, 0x40, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x03A4, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x03A5, {0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x03A6, {0x20, 0x70, 0x50, 0x50, 0x70, 0x20, 0x00, }}, +{ 0x03A7, {0x90, 0x90, 0x60, 0x60, 0x90, 0x90, 0x00, }}, +{ 0x03A8, {0x50, 0x70, 0x70, 0x70, 0x20, 0x20, 0x00, }}, +{ 0x03A9, {0x20, 0x50, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x03AA, {0x50, 0x00, 0x70, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x03AB, {0xA0, 0x00, 0xA0, 0xA0, 0x40, 0x40, 0x00, }}, +{ 0x03AC, {0x10, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x03AD, {0x10, 0x20, 0x70, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x03AE, {0x20, 0x40, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x03AF, {0x20, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x03B0, {0xB0, 0x40, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03B1, {0x00, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x03B2, {0x60, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x03B3, {0x00, 0x00, 0x50, 0x50, 0x20, 0x20, 0x20, }}, +{ 0x03B4, {0x70, 0x80, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03B5, {0x00, 0x00, 0x70, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x03B6, {0xF0, 0x40, 0x80, 0x80, 0x80, 0x70, 0x10, }}, +{ 0x03B7, {0x00, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x03B8, {0x20, 0x50, 0x70, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x03B9, {0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x03BA, {0x00, 0x00, 0x90, 0xA0, 0xE0, 0x90, 0x00, }}, +{ 0x03BB, {0xE0, 0x10, 0x50, 0xB0, 0x90, 0x90, 0x00, }}, +{ 0x03BC, {0x00, 0x00, 0x90, 0x90, 0x90, 0xF0, 0x80, }}, +{ 0x03BD, {0x00, 0x00, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x03BE, {0xF0, 0x40, 0x80, 0x60, 0x80, 0x70, 0x10, }}, +{ 0x03BF, {0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03C0, {0x00, 0x00, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x03C1, {0x00, 0x00, 0x60, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x03C2, {0x00, 0x00, 0x70, 0xC0, 0x30, 0x60, 0x00, }}, +{ 0x03C3, {0x00, 0x00, 0x70, 0xA0, 0x90, 0x60, 0x00, }}, +{ 0x03C4, {0x00, 0x00, 0xF0, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x03C5, {0x00, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03C6, {0x00, 0x00, 0x20, 0x70, 0x50, 0x70, 0x20, }}, +{ 0x03C7, {0x00, 0x00, 0x90, 0x60, 0x60, 0x90, 0x90, }}, +{ 0x03C8, {0x00, 0x00, 0x50, 0x70, 0x70, 0x20, 0x20, }}, +{ 0x03C9, {0x00, 0x00, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x03CA, {0xA0, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x03CB, {0x90, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03CC, {0x20, 0x40, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03CD, {0x20, 0x40, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03CE, {0x20, 0x40, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x03D0, {0x60, 0x90, 0xA0, 0xD0, 0x90, 0x60, 0x00, }}, +{ 0x03D1, {0x60, 0x90, 0x70, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x03D2, {0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x03D3, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x03D4, {0x50, 0x00, 0x50, 0x50, 0x20, 0x20, 0x00, }}, +{ 0x03D5, {0x00, 0x00, 0x20, 0x70, 0x50, 0x70, 0x20, }}, +{ 0x03D6, {0x00, 0x00, 0xF0, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x03D7, {0x40, 0x20, 0x90, 0x60, 0x60, 0x90, 0x30, }}, +{ 0x03DA, {0x20, 0x50, 0x80, 0x80, 0x60, 0x10, 0x20, }}, +{ 0x03DB, {0x00, 0x00, 0x70, 0xC0, 0x30, 0x60, 0x00, }}, +{ 0x03DC, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x03DD, {0x00, 0x00, 0x70, 0x40, 0x60, 0x40, 0x40, }}, +{ 0x03DE, {0x80, 0x90, 0xB0, 0xD0, 0x90, 0x10, 0x00, }}, +{ 0x03DF, {0x40, 0x40, 0x80, 0xF0, 0x10, 0x20, 0x20, }}, +{ 0x03E0, {0x60, 0x60, 0x60, 0x90, 0xB0, 0xB0, 0x00, }}, +{ 0x03E1, {0xC0, 0x20, 0x50, 0xB0, 0x50, 0x10, 0x10, }}, +{ 0x03F0, {0x00, 0x00, 0x90, 0x60, 0x60, 0xB0, 0x00, }}, +{ 0x03F1, {0x00, 0x00, 0x60, 0x90, 0xE0, 0x80, 0x60, }}, +{ 0x03F2, {0x00, 0x00, 0x30, 0x40, 0x40, 0x30, 0x00, }}, +{ 0x03F3, {0x10, 0x00, 0x10, 0x10, 0x10, 0x50, 0x20, }}, +{ 0x03F4, {0x60, 0x90, 0xF0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x03F5, {0x00, 0x00, 0x30, 0x60, 0x40, 0x30, 0x00, }}, +{ 0x0401, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0402, {0xE0, 0x40, 0x60, 0x50, 0x50, 0x10, 0x20, }}, +{ 0x0403, {0xF0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0404, {0x60, 0x90, 0xC0, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0405, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x00, }}, +{ 0x0406, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0407, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0408, {0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x0409, {0x60, 0xA0, 0xB0, 0xA8, 0xA8, 0xB0, 0x00, }}, +{ 0x040A, {0xA0, 0xA0, 0xF0, 0xA8, 0xA8, 0xB0, 0x00, }}, +{ 0x040B, {0xE0, 0x40, 0x60, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x040C, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x040E, {0x50, 0x50, 0x50, 0x20, 0x20, 0x40, 0x00, }}, +{ 0x040F, {0x50, 0x50, 0x50, 0x50, 0x50, 0x70, 0x20, }}, +{ 0x0410, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x0411, {0xE0, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0412, {0xE0, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x0413, {0xF0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0414, {0x30, 0x50, 0x50, 0x50, 0x50, 0xF0, 0x90, }}, +{ 0x0415, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x0416, {0xA8, 0xA8, 0x70, 0x70, 0xA8, 0xA8, 0x00, }}, +{ 0x0417, {0xE0, 0x10, 0x60, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x0418, {0x90, 0xB0, 0xB0, 0xD0, 0xD0, 0x90, 0x00, }}, +{ 0x0419, {0xD0, 0xB0, 0xB0, 0xD0, 0xD0, 0x90, 0x00, }}, +{ 0x041A, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x00, }}, +{ 0x041B, {0x30, 0x50, 0x50, 0x50, 0x50, 0x90, 0x00, }}, +{ 0x041C, {0x90, 0xF0, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x041D, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x041E, {0x60, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x041F, {0xF0, 0x90, 0x90, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0420, {0xE0, 0x90, 0x90, 0xE0, 0x80, 0x80, 0x00, }}, +{ 0x0421, {0x60, 0x90, 0x80, 0x80, 0x90, 0x60, 0x00, }}, +{ 0x0422, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x0423, {0x50, 0x50, 0x50, 0x20, 0x20, 0x40, 0x00, }}, +{ 0x0424, {0x20, 0x70, 0x50, 0x50, 0x70, 0x20, 0x00, }}, +{ 0x0425, {0x90, 0x90, 0x60, 0x60, 0x90, 0x90, 0x00, }}, +{ 0x0426, {0x90, 0x90, 0x90, 0x90, 0x90, 0xF0, 0x10, }}, +{ 0x0427, {0x90, 0x90, 0x90, 0x70, 0x10, 0x10, 0x00, }}, +{ 0x0428, {0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xF8, 0x00, }}, +{ 0x0429, {0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xF8, 0x08, }}, +{ 0x042A, {0xC0, 0x40, 0x60, 0x50, 0x50, 0x60, 0x00, }}, +{ 0x042B, {0x90, 0x90, 0xD0, 0xB0, 0xB0, 0xD0, 0x00, }}, +{ 0x042C, {0x80, 0x80, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x042D, {0x60, 0x90, 0x30, 0x10, 0x90, 0x60, 0x00, }}, +{ 0x042E, {0xA0, 0xD0, 0xD0, 0xD0, 0xD0, 0xA0, 0x00, }}, +{ 0x042F, {0x70, 0x90, 0x90, 0x70, 0x50, 0x90, 0x00, }}, +{ 0x0430, {0x00, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x0431, {0x00, 0x60, 0x80, 0xE0, 0x90, 0x60, 0x00, }}, +{ 0x0432, {0x00, 0x00, 0xE0, 0xE0, 0x90, 0xE0, 0x00, }}, +{ 0x0433, {0x00, 0x00, 0xF0, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0434, {0x00, 0x00, 0x30, 0x50, 0x50, 0xF0, 0x90, }}, +{ 0x0435, {0x00, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0436, {0x00, 0x00, 0xA8, 0x70, 0x70, 0xA8, 0x00, }}, +{ 0x0437, {0x00, 0x00, 0xE0, 0x60, 0x20, 0xC0, 0x00, }}, +{ 0x0438, {0x00, 0x00, 0x90, 0xB0, 0xD0, 0x90, 0x00, }}, +{ 0x0439, {0x90, 0x60, 0x90, 0xB0, 0xD0, 0x90, 0x00, }}, +{ 0x043A, {0x00, 0x00, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x043B, {0x00, 0x00, 0x30, 0x50, 0x50, 0x90, 0x00, }}, +{ 0x043C, {0x00, 0x00, 0x88, 0xD8, 0xA8, 0xA8, 0x00, }}, +{ 0x043D, {0x00, 0x00, 0x90, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x043E, {0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x043F, {0x00, 0x00, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x0440, {0x00, 0x00, 0xE0, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x0441, {0x00, 0x00, 0x60, 0x80, 0x80, 0x60, 0x00, }}, +{ 0x0442, {0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x0443, {0x00, 0x00, 0x90, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x0444, {0x60, 0x20, 0x20, 0x70, 0x50, 0x70, 0x20, }}, +{ 0x0445, {0x00, 0x00, 0x90, 0x60, 0x60, 0x90, 0x00, }}, +{ 0x0446, {0x00, 0x00, 0x90, 0x90, 0x90, 0xF0, 0x10, }}, +{ 0x0447, {0x00, 0x00, 0x90, 0x90, 0x70, 0x10, 0x00, }}, +{ 0x0448, {0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xF8, 0x00, }}, +{ 0x0449, {0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xF8, 0x08, }}, +{ 0x044A, {0x00, 0x00, 0xC0, 0x60, 0x50, 0x60, 0x00, }}, +{ 0x044B, {0x00, 0x00, 0x90, 0xD0, 0xB0, 0xD0, 0x00, }}, +{ 0x044C, {0x00, 0x00, 0x80, 0xE0, 0x90, 0xE0, 0x00, }}, +{ 0x044D, {0x00, 0x00, 0x60, 0x30, 0x10, 0x60, 0x00, }}, +{ 0x044E, {0x00, 0x00, 0xA0, 0xD0, 0xD0, 0xA0, 0x00, }}, +{ 0x044F, {0x00, 0x00, 0x60, 0xA0, 0x60, 0xA0, 0x00, }}, +{ 0x0451, {0xA0, 0x00, 0x60, 0xB0, 0xC0, 0x60, 0x00, }}, +{ 0x0452, {0x40, 0xE0, 0x40, 0x60, 0x50, 0x10, 0x20, }}, +{ 0x0453, {0x20, 0x40, 0xF0, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0454, {0x00, 0x00, 0x30, 0x60, 0x40, 0x30, 0x00, }}, +{ 0x0455, {0x00, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x00, }}, +{ 0x0456, {0x20, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0457, {0x50, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x0458, {0x10, 0x00, 0x10, 0x10, 0x10, 0x50, 0x20, }}, +{ 0x0459, {0x00, 0x00, 0x60, 0xB8, 0xA8, 0xB0, 0x00, }}, +{ 0x045A, {0x00, 0x00, 0xA0, 0xF0, 0xA8, 0xB0, 0x00, }}, +{ 0x045B, {0x40, 0xE0, 0x40, 0x70, 0x48, 0x48, 0x00, }}, +{ 0x045C, {0x20, 0x40, 0x90, 0xE0, 0xA0, 0x90, 0x00, }}, +{ 0x045E, {0x90, 0x60, 0x00, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x045F, {0x00, 0x00, 0x50, 0x50, 0x50, 0x70, 0x20, }}, +{ 0x0490, {0x10, 0xF0, 0x80, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0491, {0x00, 0x10, 0xF0, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x0492, {0x00, 0x70, 0x40, 0xE0, 0x40, 0x40, 0x00, }}, +{ 0x0493, {0x00, 0x00, 0x70, 0x40, 0xE0, 0x40, 0x00, }}, +{ 0x0496, {0xA8, 0xA8, 0x70, 0x70, 0xA8, 0xA8, 0x08, }}, +{ 0x0497, {0x00, 0x00, 0xA8, 0x70, 0x70, 0xA8, 0x08, }}, +{ 0x049A, {0x90, 0xA0, 0xC0, 0xC0, 0xA0, 0x90, 0x08, }}, +{ 0x049B, {0x00, 0x00, 0x90, 0xE0, 0xA0, 0x90, 0x08, }}, +{ 0x04AE, {0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x04AF, {0x00, 0x00, 0x50, 0x50, 0x20, 0x20, 0x20, }}, +{ 0x04B0, {0x50, 0x50, 0x20, 0x70, 0x20, 0x20, 0x00, }}, +{ 0x04B1, {0x00, 0x00, 0x50, 0x20, 0x70, 0x20, 0x20, }}, +{ 0x04B2, {0x90, 0x90, 0x60, 0x60, 0x90, 0x90, 0x08, }}, +{ 0x04B3, {0x00, 0x00, 0x90, 0x60, 0x60, 0x90, 0x08, }}, +{ 0x04BA, {0x80, 0x80, 0xE0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x04BB, {0x40, 0x40, 0x60, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x04D8, {0x60, 0x90, 0x10, 0xF0, 0x90, 0x60, 0x00, }}, +{ 0x04D9, {0x00, 0x00, 0x60, 0x30, 0xD0, 0x60, 0x00, }}, +{ 0x04E2, {0x70, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x04E3, {0x70, 0x00, 0x60, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x04E8, {0x60, 0x90, 0xF0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x04E9, {0x00, 0x00, 0x60, 0xF0, 0x90, 0x60, 0x00, }}, +{ 0x04EE, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x04EF, {0xF0, 0x00, 0x90, 0x90, 0x90, 0x70, 0x00, }}, +{ 0x05D0, {0x00, 0x00, 0x90, 0x50, 0xA0, 0x90, 0x00, }}, +{ 0x05D1, {0x00, 0x00, 0xE0, 0x20, 0x20, 0xF0, 0x00, }}, +{ 0x05D2, {0x00, 0x40, 0x20, 0x20, 0x20, 0xD0, 0x00, }}, +{ 0x05D3, {0x00, 0x00, 0xF0, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x05D4, {0x00, 0x00, 0xF0, 0x10, 0x90, 0x90, 0x00, }}, +{ 0x05D5, {0x00, 0x40, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x05D6, {0x00, 0x00, 0x70, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x05D7, {0x00, 0x00, 0xF0, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x05D8, {0x00, 0x00, 0x90, 0x90, 0x90, 0xF0, 0x00, }}, +{ 0x05D9, {0x00, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05DA, {0x00, 0x00, 0xF0, 0x10, 0x20, 0x20, 0x00, }}, +{ 0x05DB, {0x00, 0x80, 0x70, 0x10, 0x10, 0xE0, 0x00, }}, +{ 0x05DC, {0x00, 0x80, 0x70, 0x10, 0x20, 0x40, 0x00, }}, +{ 0x05DD, {0x00, 0x80, 0x70, 0x90, 0x90, 0xF0, 0x00, }}, +{ 0x05DE, {0x00, 0x80, 0x70, 0x90, 0x90, 0xB0, 0x00, }}, +{ 0x05DF, {0x00, 0x40, 0x20, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x05E0, {0x00, 0x40, 0x20, 0x20, 0x20, 0x60, 0x00, }}, +{ 0x05E1, {0x00, 0x80, 0x78, 0x48, 0x48, 0x30, 0x00, }}, +{ 0x05E2, {0x00, 0x00, 0x90, 0x50, 0x50, 0xF0, 0x00, }}, +{ 0x05E3, {0x00, 0x00, 0x70, 0x90, 0x10, 0x10, 0x00, }}, +{ 0x05E4, {0x00, 0x00, 0xF0, 0x90, 0x10, 0xF0, 0x00, }}, +{ 0x05E5, {0x00, 0x00, 0x50, 0x60, 0x40, 0x40, 0x00, }}, +{ 0x05E6, {0x00, 0x00, 0x90, 0x60, 0x20, 0xF0, 0x00, }}, +{ 0x05E7, {0x00, 0x00, 0xE0, 0x10, 0xA0, 0x80, 0x00, }}, +{ 0x05E8, {0x00, 0x00, 0xF0, 0x10, 0x10, 0x10, 0x00, }}, +{ 0x05E9, {0x00, 0x00, 0xA8, 0xC8, 0x88, 0xF0, 0x00, }}, +{ 0x05EA, {0x00, 0x00, 0xF0, 0x50, 0x50, 0xD0, 0x00, }}, +{ 0x16A0, {0x50, 0x60, 0x50, 0x60, 0x40, 0x40, 0x00, }}, +{ 0x16A2, {0x60, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x16A3, {0x20, 0x50, 0x50, 0x70, 0x70, 0x70, 0x00, }}, +{ 0x16A6, {0x40, 0x60, 0x50, 0x50, 0x60, 0x40, 0x00, }}, +{ 0x16A9, {0xD0, 0xA0, 0x80, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x16AA, {0xD0, 0xA0, 0x80, 0xC0, 0xA0, 0x80, 0x00, }}, +{ 0x16AB, {0x60, 0x50, 0x60, 0x50, 0x40, 0x40, 0x00, }}, +{ 0x16B1, {0xE0, 0x90, 0xA0, 0xC0, 0xA0, 0x80, 0x00, }}, +{ 0x16B3, {0x40, 0x40, 0x60, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x16B7, {0x50, 0x50, 0x20, 0x20, 0x50, 0x50, 0x00, }}, +{ 0x16B8, {0x50, 0x70, 0xA8, 0xA8, 0x70, 0x50, 0x00, }}, +{ 0x16B9, {0x60, 0x50, 0x50, 0x60, 0x40, 0x40, 0x00, }}, +{ 0x16BB, {0x90, 0x90, 0xD0, 0xB0, 0xD0, 0xB0, 0x00, }}, +{ 0x16BE, {0x20, 0x20, 0x60, 0x30, 0x20, 0x20, 0x00, }}, +{ 0x16C0, {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x16C4, {0x20, 0x70, 0xA8, 0xA8, 0x70, 0x20, 0x00, }}, +{ 0x16C7, {0x20, 0x30, 0x28, 0xA0, 0x60, 0x20, 0x00, }}, +{ 0x16C8, {0xD0, 0xA0, 0x80, 0x80, 0xA0, 0xD0, 0x00, }}, +{ 0x16C9, {0xA8, 0xA8, 0xA8, 0x70, 0x20, 0x20, 0x00, }}, +{ 0x16CB, {0x80, 0x90, 0xB0, 0xD0, 0x90, 0x10, 0x00, }}, +{ 0x16CF, {0x20, 0x70, 0xA8, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x16D2, {0xE0, 0x90, 0xE0, 0xE0, 0x90, 0xE0, 0x00, }}, +{ 0x16D6, {0x88, 0xD8, 0xA8, 0x88, 0x88, 0x88, 0x00, }}, +{ 0x16D7, {0x88, 0xD8, 0xA8, 0xD8, 0x88, 0x88, 0x00, }}, +{ 0x16DA, {0x40, 0x60, 0x50, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x16DD, {0x50, 0x20, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x16DE, {0x88, 0x88, 0xD8, 0xA8, 0xD8, 0x88, 0x00, }}, +{ 0x16DF, {0x20, 0x50, 0x50, 0x20, 0x50, 0x50, 0x00, }}, +{ 0x16E0, {0xA8, 0x70, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x16E1, {0xA8, 0x70, 0x70, 0xA8, 0x20, 0x20, 0x00, }}, +{ 0x16E2, {0x28, 0x30, 0x20, 0x20, 0x60, 0xA0, 0x00, }}, +{ 0x16E3, {0x20, 0x20, 0x20, 0x70, 0xA8, 0xA8, 0x00, }}, +{ 0x16E4, {0x90, 0xF0, 0x90, 0x90, 0xF0, 0x90, 0x00, }}, +{ 0x16EB, {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x16EC, {0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, }}, +{ 0x16ED, {0x00, 0x00, 0x50, 0x20, 0x50, 0x00, 0x00, }}, +{ 0x1E02, {0xE0, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x1E03, {0x20, 0x80, 0x80, 0xE0, 0x90, 0xE0, 0x00, }}, +{ 0x1E0A, {0xE0, 0x90, 0x90, 0x90, 0x90, 0xE0, 0x00, }}, +{ 0x1E0B, {0x40, 0x10, 0x10, 0x70, 0x90, 0x70, 0x00, }}, +{ 0x1E1E, {0xF0, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x00, }}, +{ 0x1E1F, {0x80, 0x20, 0x40, 0xE0, 0x40, 0x40, 0x00, }}, +{ 0x1E40, {0x90, 0xF0, 0xF0, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x1E41, {0x20, 0x00, 0xA0, 0xF0, 0x90, 0x90, 0x00, }}, +{ 0x1E56, {0xE0, 0x90, 0x90, 0xE0, 0x80, 0x80, 0x00, }}, +{ 0x1E57, {0x20, 0x00, 0xE0, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x1E60, {0x60, 0x90, 0x40, 0x20, 0x90, 0x60, 0x00, }}, +{ 0x1E61, {0x20, 0x00, 0x70, 0xC0, 0x30, 0xE0, 0x00, }}, +{ 0x1E6A, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1E6B, {0x80, 0x20, 0x70, 0x20, 0x20, 0x10, 0x00, }}, +{ 0x1E80, {0x90, 0x90, 0x90, 0xF0, 0xF0, 0x90, 0x00, }}, +{ 0x1E81, {0x40, 0x20, 0x00, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1E82, {0x90, 0x90, 0x90, 0xF0, 0xF0, 0x90, 0x00, }}, +{ 0x1E83, {0x20, 0x40, 0x00, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1E84, {0x90, 0x90, 0x90, 0xF0, 0xF0, 0x90, 0x00, }}, +{ 0x1E85, {0x00, 0xA0, 0x00, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1EF2, {0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1EF3, {0x40, 0x20, 0x00, 0x90, 0x50, 0x20, 0x40, }}, +{ 0x1F00, {0x60, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F01, {0x60, 0x40, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F02, {0xE0, 0x50, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F03, {0xE0, 0x90, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F04, {0xD0, 0x60, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F05, {0xD0, 0xA0, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F06, {0x70, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F07, {0x70, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F08, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F09, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F0A, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F0B, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F0C, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F0D, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F0E, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F0F, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1F10, {0x30, 0x10, 0x70, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x1F11, {0x30, 0x20, 0x70, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x1F12, {0xE0, 0x50, 0xE0, 0x40, 0x80, 0x60, 0x00, }}, +{ 0x1F13, {0xE0, 0x90, 0xE0, 0x40, 0x80, 0x60, 0x00, }}, +{ 0x1F14, {0xD0, 0x60, 0xE0, 0x40, 0x80, 0x60, 0x00, }}, +{ 0x1F15, {0xD0, 0xA0, 0xE0, 0x40, 0x80, 0x60, 0x00, }}, +{ 0x1F18, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1F19, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1F1A, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1F1B, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1F1C, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1F1D, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1F20, {0x60, 0x20, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F21, {0x60, 0x40, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F22, {0xE0, 0x50, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F23, {0xE0, 0x90, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F24, {0xD0, 0x60, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F25, {0xD0, 0xA0, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F26, {0x70, 0x20, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F27, {0x70, 0x20, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F28, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F29, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F2A, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F2B, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F2C, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F2D, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F2E, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F2F, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1F30, {0x60, 0x20, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F31, {0x60, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F32, {0xE0, 0x50, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F33, {0xE0, 0x90, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F34, {0xD0, 0x60, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F35, {0xD0, 0xA0, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F36, {0xE0, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F37, {0xE0, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F38, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F39, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F3A, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F3B, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F3C, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F3D, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F3E, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F3F, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1F40, {0x60, 0x20, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F41, {0x60, 0x40, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F42, {0xE0, 0x50, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F43, {0xE0, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F44, {0xD0, 0x60, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F45, {0xD0, 0xA0, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F48, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1F49, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1F4A, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1F4B, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1F4C, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1F4D, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1F50, {0x60, 0x20, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F51, {0x60, 0x40, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F52, {0xE0, 0x50, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F53, {0xE0, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F54, {0xD0, 0x60, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F55, {0xD0, 0xA0, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F56, {0x70, 0x20, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F57, {0x70, 0x20, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F59, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1F5B, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1F5D, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1F5F, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1F60, {0x60, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F61, {0x60, 0x40, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F62, {0xE0, 0x50, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F63, {0xE0, 0x90, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F64, {0xD0, 0x60, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F65, {0xD0, 0xA0, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F66, {0x70, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F67, {0x70, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F68, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F69, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F6A, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F6B, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F6C, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F6D, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F6E, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F6F, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1F70, {0x40, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F71, {0x10, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1F72, {0x40, 0x20, 0x70, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x1F73, {0x10, 0x20, 0x70, 0x20, 0x40, 0x30, 0x00, }}, +{ 0x1F74, {0x80, 0x40, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F75, {0x20, 0x40, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1F76, {0x80, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F77, {0x20, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1F78, {0x80, 0x40, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F79, {0x20, 0x40, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F7A, {0x40, 0x20, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F7B, {0x20, 0x40, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1F7C, {0x40, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F7D, {0x20, 0x40, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1F80, {0x60, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F81, {0x60, 0x40, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F82, {0xE0, 0x50, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F83, {0xE0, 0x90, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F84, {0xD0, 0x60, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F85, {0xD0, 0xA0, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F86, {0x70, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F87, {0x70, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1F88, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F89, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F8A, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F8B, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F8C, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F8D, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F8E, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F8F, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x20, }}, +{ 0x1F90, {0x60, 0x20, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F91, {0x60, 0x40, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F92, {0xE0, 0x50, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F93, {0xE0, 0x90, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F94, {0xD0, 0x60, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F95, {0xD0, 0xA0, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F96, {0x70, 0x20, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F97, {0x70, 0x20, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1F98, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F99, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F9A, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F9B, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F9C, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F9D, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F9E, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1F9F, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x20, }}, +{ 0x1FA0, {0x60, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA1, {0x60, 0x40, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA2, {0xE0, 0x50, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA3, {0xE0, 0x90, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA4, {0xD0, 0x60, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA5, {0xD0, 0xA0, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA6, {0x70, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA7, {0x70, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FA8, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FA9, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FAA, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FAB, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FAC, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FAD, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FAE, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FAF, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FB0, {0x90, 0x60, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1FB1, {0xF0, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1FB2, {0x40, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1FB3, {0x00, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1FB4, {0x10, 0x20, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1FB6, {0x70, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x00, }}, +{ 0x1FB7, {0x70, 0x00, 0x70, 0x90, 0xB0, 0x50, 0x40, }}, +{ 0x1FB8, {0x90, 0x60, 0x60, 0x90, 0xF0, 0x90, 0x00, }}, +{ 0x1FB9, {0xF0, 0x00, 0x60, 0x90, 0xF0, 0x90, 0x00, }}, +{ 0x1FBA, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1FBB, {0xA0, 0xD0, 0x50, 0x70, 0x50, 0x50, 0x00, }}, +{ 0x1FBC, {0x60, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x40, }}, +{ 0x1FBD, {0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FBE, {0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1FBF, {0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC0, {0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC1, {0xE0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC2, {0x80, 0x40, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1FC3, {0x00, 0x00, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1FC4, {0x20, 0x40, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1FC6, {0x70, 0x00, 0xE0, 0x90, 0x90, 0x90, 0x10, }}, +{ 0x1FC7, {0x70, 0x00, 0xE0, 0x90, 0x90, 0x10, 0x90, }}, +{ 0x1FC8, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1FC9, {0xF0, 0xC0, 0x60, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x1FCA, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1FCB, {0xD0, 0xD0, 0x70, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x1FCC, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x40, }}, +{ 0x1FCD, {0xE0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCE, {0xD0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCF, {0xE0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD0, {0x90, 0x60, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1FD1, {0xF0, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1FD2, {0xD0, 0x20, 0x00, 0x20, 0x20, 0x10, 0x00, }}, +{ 0x1FD3, {0xB0, 0x40, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1FD6, {0xE0, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1FD7, {0xE0, 0xA0, 0x00, 0x40, 0x40, 0x20, 0x00, }}, +{ 0x1FD8, {0x90, 0x60, 0x70, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1FD9, {0x70, 0x00, 0x70, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1FDA, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1FDB, {0xF0, 0xA0, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x1FDD, {0xE0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDE, {0xD0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDF, {0xE0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE0, {0x90, 0x60, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1FE1, {0xF0, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1FE2, {0xD0, 0x20, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1FE3, {0xB0, 0x40, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1FE4, {0x60, 0x20, 0x60, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x1FE5, {0x60, 0x40, 0x60, 0x90, 0x90, 0xE0, 0x80, }}, +{ 0x1FE6, {0x70, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1FE7, {0xF0, 0x90, 0x00, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x1FE8, {0x90, 0x60, 0xA0, 0xA0, 0x40, 0x40, 0x00, }}, +{ 0x1FE9, {0xF0, 0x00, 0xA0, 0xA0, 0x40, 0x40, 0x00, }}, +{ 0x1FEA, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1FEB, {0xD0, 0xD0, 0x50, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x1FEC, {0xE0, 0xD0, 0x50, 0x60, 0x40, 0x40, 0x00, }}, +{ 0x1FED, {0xD0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEE, {0xB0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEF, {0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FF2, {0x40, 0x20, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FF3, {0x00, 0x00, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FF4, {0x20, 0x40, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FF6, {0x70, 0x00, 0x90, 0x90, 0xF0, 0xF0, 0x00, }}, +{ 0x1FF7, {0x70, 0x00, 0x90, 0x90, 0xF0, 0xF0, 0x40, }}, +{ 0x1FF8, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1FF9, {0xA0, 0xD0, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x1FFA, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1FFB, {0xA0, 0xD0, 0x50, 0x50, 0x20, 0x50, 0x00, }}, +{ 0x1FFC, {0x20, 0x50, 0x50, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x1FFD, {0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FFE, {0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2010, {0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, }}, +{ 0x2011, {0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, }}, +{ 0x2012, {0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, }}, +{ 0x2013, {0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, }}, +{ 0x2014, {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2015, {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2016, {0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x2017, {0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, }}, +{ 0x2018, {0x20, 0x40, 0x60, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2019, {0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201A, {0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x40, }}, +{ 0x201B, {0x60, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201C, {0x50, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201D, {0x50, 0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201E, {0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0xA0, }}, +{ 0x201F, {0xA0, 0xA0, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2020, {0x00, 0x20, 0x70, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x2021, {0x00, 0x20, 0x70, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x2022, {0x00, 0x00, 0x60, 0xF0, 0xF0, 0x60, 0x00, }}, +{ 0x2023, {0x00, 0x40, 0x60, 0x70, 0x60, 0x40, 0x00, }}, +{ 0x2024, {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, }}, +{ 0x2025, {0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, }}, +{ 0x2026, {0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, }}, +{ 0x2027, {0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x2030, {0x80, 0x90, 0x20, 0x40, 0xA8, 0x28, 0x00, }}, +{ 0x2032, {0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2033, {0x50, 0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2034, {0x70, 0x70, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2035, {0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2036, {0xA0, 0xA0, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2037, {0xE0, 0xE0, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2039, {0x00, 0x00, 0x20, 0x40, 0x20, 0x00, 0x00, }}, +{ 0x203A, {0x00, 0x00, 0x40, 0x20, 0x40, 0x00, 0x00, }}, +{ 0x203C, {0x50, 0x50, 0x50, 0x50, 0x00, 0x50, 0x00, }}, +{ 0x203E, {0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2044, {0x00, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, }}, +{ 0x2070, {0x20, 0x50, 0x50, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x2071, {0x20, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x2074, {0x20, 0x60, 0x70, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x2075, {0x70, 0x60, 0x10, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x2076, {0x30, 0x60, 0x50, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x2077, {0x70, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x2078, {0x20, 0x50, 0x20, 0x50, 0x20, 0x00, 0x00, }}, +{ 0x2079, {0x20, 0x50, 0x30, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x207A, {0x00, 0x20, 0x70, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x207B, {0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207C, {0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, }}, +{ 0x207D, {0x20, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x207E, {0x20, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x207F, {0x00, 0x60, 0x50, 0x50, 0x00, 0x00, 0x00, }}, +{ 0x2080, {0x00, 0x00, 0x00, 0x20, 0x50, 0x50, 0x20, }}, +{ 0x2081, {0x00, 0x00, 0x00, 0x20, 0x60, 0x20, 0x70, }}, +{ 0x2082, {0x00, 0x00, 0x00, 0x60, 0x20, 0x40, 0x60, }}, +{ 0x2083, {0x00, 0x00, 0x00, 0x60, 0x60, 0x20, 0x60, }}, +{ 0x2084, {0x00, 0x00, 0x00, 0x20, 0x60, 0x70, 0x20, }}, +{ 0x2085, {0x00, 0x00, 0x00, 0x70, 0x60, 0x10, 0x60, }}, +{ 0x2086, {0x00, 0x00, 0x00, 0x30, 0x60, 0x50, 0x20, }}, +{ 0x2087, {0x00, 0x00, 0x00, 0x70, 0x10, 0x20, 0x20, }}, +{ 0x2088, {0x00, 0x00, 0x20, 0x50, 0x20, 0x50, 0x20, }}, +{ 0x2089, {0x00, 0x00, 0x00, 0x20, 0x50, 0x30, 0x60, }}, +{ 0x208A, {0x00, 0x00, 0x00, 0x00, 0x20, 0x70, 0x20, }}, +{ 0x208B, {0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, }}, +{ 0x208C, {0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, }}, +{ 0x208D, {0x00, 0x00, 0x00, 0x20, 0x40, 0x40, 0x20, }}, +{ 0x208E, {0x00, 0x00, 0x00, 0x20, 0x10, 0x10, 0x20, }}, +{ 0x20A3, {0xF0, 0x80, 0xD8, 0xA0, 0xA0, 0xA0, 0x00, }}, +{ 0x20A4, {0x30, 0x40, 0xE0, 0xE0, 0x40, 0xB0, 0x00, }}, +{ 0x20A7, {0x60, 0x50, 0xF8, 0x70, 0x40, 0x40, 0x00, }}, +{ 0x20AB, {0x10, 0x38, 0x70, 0x90, 0x90, 0x70, 0xF0, }}, +{ 0x20AC, {0x30, 0x40, 0xE0, 0xE0, 0x40, 0x30, 0x00, }}, +{ 0x20AF, {0x40, 0x60, 0xD0, 0x50, 0xD0, 0xE0, 0x00, }}, +{ 0x20D0, {0x40, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D1, {0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D2, {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }}, +{ 0x20D3, {0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }}, +{ 0x20D4, {0xA0, 0xD0, 0xD0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D5, {0x50, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D6, {0x40, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D7, {0x10, 0xF8, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2102, {0x60, 0xD0, 0xC0, 0xC0, 0xD0, 0x60, 0x00, }}, +{ 0x2105, {0x60, 0x80, 0x70, 0x60, 0xA0, 0x50, 0x20, }}, +{ 0x2113, {0x30, 0x30, 0x30, 0x20, 0x20, 0x50, 0x00, }}, +{ 0x2115, {0xC8, 0xC8, 0xE8, 0xD8, 0xC8, 0xC8, 0x00, }}, +{ 0x2116, {0xC0, 0xA0, 0xA0, 0xB0, 0xA8, 0xB0, 0x00, }}, +{ 0x211A, {0x60, 0xD0, 0xD0, 0xD0, 0xF0, 0x70, 0x10, }}, +{ 0x211D, {0xE0, 0xD0, 0xD0, 0xF0, 0xE0, 0xD0, 0x00, }}, +{ 0x2122, {0x70, 0x20, 0x20, 0x00, 0xF8, 0xA8, 0xA8, }}, +{ 0x2124, {0xF0, 0x30, 0x60, 0x60, 0xC0, 0xF0, 0x00, }}, +{ 0x2126, {0x20, 0x50, 0x50, 0x50, 0x20, 0x70, 0x00, }}, +{ 0x2127, {0x70, 0x20, 0x50, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x212E, {0x00, 0x00, 0x70, 0xD8, 0xE0, 0x70, 0x00, }}, +{ 0x215B, {0x80, 0x80, 0x80, 0xB0, 0x30, 0x30, 0x30, }}, +{ 0x215C, {0xC0, 0xC0, 0x40, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x215D, {0xC0, 0x80, 0x40, 0xB0, 0x30, 0x30, 0x30, }}, +{ 0x215E, {0xC0, 0x40, 0x80, 0xB0, 0x30, 0x30, 0x30, }}, +{ 0x2190, {0x00, 0x00, 0x40, 0xF0, 0x40, 0x00, 0x00, }}, +{ 0x2191, {0x20, 0x70, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x2192, {0x00, 0x00, 0x20, 0xF0, 0x20, 0x00, 0x00, }}, +{ 0x2193, {0x20, 0x20, 0x20, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x2194, {0x00, 0x00, 0x50, 0xF8, 0x50, 0x00, 0x00, }}, +{ 0x2195, {0x20, 0x70, 0x20, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x21A4, {0x00, 0x00, 0x50, 0xF0, 0x50, 0x00, 0x00, }}, +{ 0x21A5, {0x20, 0x70, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x21A6, {0x00, 0x00, 0xA0, 0xF0, 0xA0, 0x00, 0x00, }}, +{ 0x21A7, {0x70, 0x20, 0x20, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x21A8, {0x20, 0x70, 0x20, 0x20, 0x70, 0x20, 0x70, }}, +{ 0x21C4, {0x10, 0xF8, 0x10, 0x40, 0xF8, 0x40, 0x00, }}, +{ 0x21C6, {0x40, 0xF8, 0x40, 0x10, 0xF8, 0x10, 0x00, }}, +{ 0x21CB, {0x00, 0x40, 0xF0, 0x00, 0xF0, 0x20, 0x00, }}, +{ 0x21CC, {0x00, 0x20, 0xF0, 0x00, 0xF0, 0x40, 0x00, }}, +{ 0x21D0, {0x10, 0x20, 0x78, 0x80, 0x78, 0x20, 0x10, }}, +{ 0x21D1, {0x20, 0x50, 0xD8, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x21D2, {0x40, 0x20, 0xF0, 0x08, 0xF0, 0x20, 0x40, }}, +{ 0x21D3, {0x50, 0x50, 0x50, 0xD8, 0x50, 0x20, 0x00, }}, +{ 0x21D4, {0x00, 0x20, 0x70, 0x88, 0x70, 0x20, 0x00, }}, +{ 0x21D5, {0x20, 0x50, 0xD8, 0x50, 0xD8, 0x50, 0x20, }}, +{ 0x2200, {0x90, 0x90, 0xF0, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x2201, {0x20, 0x50, 0x40, 0x40, 0x50, 0x20, 0x00, }}, +{ 0x2202, {0x20, 0x10, 0x30, 0x50, 0x50, 0x20, 0x00, }}, +{ 0x2203, {0xF0, 0x10, 0x70, 0x10, 0x10, 0xF0, 0x00, }}, +{ 0x2204, {0x20, 0xF0, 0x50, 0x70, 0x50, 0xF0, 0x40, }}, +{ 0x2205, {0x10, 0x70, 0xB0, 0xD0, 0xD0, 0xE0, 0x80, }}, +{ 0x2206, {0x20, 0x20, 0x50, 0x50, 0x88, 0xF8, 0x00, }}, +{ 0x2207, {0xF8, 0x88, 0x50, 0x50, 0x20, 0x20, 0x00, }}, +{ 0x2208, {0x00, 0x70, 0x80, 0xF0, 0x80, 0x70, 0x00, }}, +{ 0x2209, {0x10, 0x70, 0xA0, 0xF0, 0xA0, 0x70, 0x40, }}, +{ 0x220A, {0x00, 0x30, 0x40, 0x70, 0x40, 0x30, 0x00, }}, +{ 0x220B, {0x00, 0xE0, 0x10, 0xF0, 0x10, 0xE0, 0x00, }}, +{ 0x220C, {0x20, 0xE0, 0x50, 0xF0, 0x50, 0xE0, 0x80, }}, +{ 0x220D, {0x00, 0x60, 0x10, 0x70, 0x10, 0x60, 0x00, }}, +{ 0x220E, {0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, }}, +{ 0x220F, {0xF8, 0x50, 0x50, 0x50, 0x50, 0xD8, 0x00, }}, +{ 0x2210, {0xD8, 0x50, 0x50, 0x50, 0x50, 0xF8, 0x00, }}, +{ 0x2211, {0xF0, 0x40, 0x20, 0x40, 0x80, 0xF0, 0x00, }}, +{ 0x2212, {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2213, {0xF8, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, }}, +{ 0x2214, {0x20, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, }}, +{ 0x2215, {0x10, 0x10, 0x20, 0x40, 0x80, 0x80, 0x00, }}, +{ 0x2216, {0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x00, }}, +{ 0x2217, {0x00, 0x20, 0xA8, 0x70, 0xA8, 0x20, 0x00, }}, +{ 0x2218, {0x00, 0x00, 0x20, 0x50, 0x20, 0x00, 0x00, }}, +{ 0x2219, {0x00, 0x00, 0x20, 0x70, 0x20, 0x00, 0x00, }}, +{ 0x221A, {0x08, 0x10, 0x10, 0x20, 0xA0, 0x40, 0x00, }}, +{ 0x221B, {0x88, 0xD0, 0x90, 0x20, 0xA0, 0x40, 0x00, }}, +{ 0x221C, {0x88, 0xD0, 0x50, 0x20, 0xA0, 0x40, 0x00, }}, +{ 0x221D, {0x00, 0x00, 0x50, 0xA0, 0xA0, 0x50, 0x00, }}, +{ 0x221E, {0x00, 0x00, 0x50, 0xA8, 0xA8, 0x50, 0x00, }}, +{ 0x221F, {0x00, 0x00, 0x80, 0x80, 0x80, 0xF0, 0x00, }}, +{ 0x2220, {0x00, 0x00, 0x10, 0x20, 0x40, 0xF0, 0x00, }}, +{ 0x2221, {0x00, 0x00, 0x10, 0xA0, 0x40, 0xF0, 0x20, }}, +{ 0x2222, {0x00, 0x50, 0x60, 0xA0, 0x60, 0x50, 0x00, }}, +{ 0x2223, {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x2224, {0x20, 0x20, 0x30, 0x60, 0x20, 0x20, 0x00, }}, +{ 0x2225, {0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, }}, +{ 0x2226, {0x50, 0x58, 0x70, 0x70, 0xD0, 0x50, 0x00, }}, +{ 0x2227, {0x00, 0x00, 0x20, 0x20, 0x50, 0x50, 0x00, }}, +{ 0x2228, {0x00, 0x00, 0x50, 0x50, 0x20, 0x20, 0x00, }}, +{ 0x2229, {0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x222A, {0x00, 0x00, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x222B, {0x10, 0x28, 0x20, 0x20, 0x20, 0xA0, 0x40, }}, +{ 0x222C, {0x28, 0x50, 0x50, 0x50, 0x50, 0x50, 0xA0, }}, +{ 0x222D, {0x38, 0x70, 0x70, 0x70, 0x70, 0x70, 0xE0, }}, +{ 0x222E, {0x10, 0x28, 0x70, 0xA8, 0x70, 0xA0, 0x40, }}, +{ 0x222F, {0x28, 0x50, 0x70, 0xD8, 0x70, 0x50, 0xA0, }}, +{ 0x2230, {0x38, 0x70, 0x70, 0xF8, 0x70, 0x70, 0xE0, }}, +{ 0x2234, {0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2235, {0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, }}, +{ 0x2236, {0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, }}, +{ 0x2237, {0x00, 0x00, 0x90, 0x00, 0x00, 0x90, 0x00, }}, +{ 0x2238, {0x00, 0x00, 0x20, 0x00, 0xF8, 0x00, 0x00, }}, +{ 0x2239, {0x00, 0x00, 0x10, 0xC0, 0x10, 0x00, 0x00, }}, +{ 0x223A, {0x00, 0x90, 0x00, 0xF0, 0x00, 0x90, 0x00, }}, +{ 0x223C, {0x00, 0x00, 0x00, 0x50, 0xA0, 0x00, 0x00, }}, +{ 0x2243, {0x00, 0x50, 0xA0, 0x00, 0xF0, 0x00, 0x00, }}, +{ 0x2245, {0x50, 0xA0, 0x00, 0xF0, 0x00, 0xF0, 0x00, }}, +{ 0x2248, {0x00, 0x50, 0xA0, 0x00, 0x50, 0xA0, 0x00, }}, +{ 0x2249, {0x10, 0x50, 0xA0, 0x20, 0x50, 0xA0, 0x80, }}, +{ 0x2259, {0x20, 0x50, 0x00, 0xF0, 0x00, 0xF0, 0x00, }}, +{ 0x225A, {0x50, 0x20, 0x00, 0xF0, 0x00, 0xF0, 0x00, }}, +{ 0x225F, {0x60, 0x20, 0x00, 0x20, 0xF0, 0x00, 0xF0, }}, +{ 0x2260, {0x00, 0x10, 0xF0, 0x20, 0xF0, 0x40, 0x00, }}, +{ 0x2261, {0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, }}, +{ 0x2262, {0x10, 0xF0, 0x20, 0xF0, 0x20, 0xF0, 0x40, }}, +{ 0x2263, {0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, }}, +{ 0x2264, {0x10, 0x20, 0x40, 0x20, 0x10, 0x70, 0x00, }}, +{ 0x2265, {0x40, 0x20, 0x10, 0x20, 0x40, 0x70, 0x00, }}, +{ 0x226A, {0x00, 0x28, 0x50, 0xA0, 0x50, 0x28, 0x00, }}, +{ 0x226B, {0x00, 0xA0, 0x50, 0x28, 0x50, 0xA0, 0x00, }}, +{ 0x2282, {0x00, 0x00, 0x70, 0x80, 0x80, 0x70, 0x00, }}, +{ 0x2283, {0x00, 0x00, 0xE0, 0x10, 0x10, 0xE0, 0x00, }}, +{ 0x2284, {0x00, 0x20, 0x70, 0xA0, 0xA0, 0x70, 0x20, }}, +{ 0x2285, {0x00, 0x40, 0xE0, 0x50, 0x50, 0xE0, 0x40, }}, +{ 0x2286, {0x00, 0x70, 0x80, 0x70, 0x00, 0xF0, 0x00, }}, +{ 0x2287, {0x00, 0xE0, 0x10, 0xE0, 0x00, 0xF0, 0x00, }}, +{ 0x2288, {0x20, 0x70, 0xA0, 0x70, 0x20, 0xF0, 0x20, }}, +{ 0x2289, {0x40, 0xE0, 0x50, 0xE0, 0x40, 0xF0, 0x40, }}, +{ 0x228A, {0x00, 0x70, 0x80, 0x70, 0x20, 0xF0, 0x20, }}, +{ 0x228B, {0x00, 0xE0, 0x10, 0xE0, 0x40, 0xF0, 0x40, }}, +{ 0x2295, {0x00, 0x70, 0xA8, 0xF8, 0xA8, 0x70, 0x00, }}, +{ 0x2296, {0x00, 0x70, 0x88, 0xF8, 0x88, 0x70, 0x00, }}, +{ 0x2297, {0x00, 0x70, 0xD8, 0xA8, 0xD8, 0x70, 0x00, }}, +{ 0x2298, {0x00, 0x70, 0x98, 0xA8, 0xC8, 0x70, 0x00, }}, +{ 0x2299, {0x00, 0x70, 0x88, 0xA8, 0x88, 0x70, 0x00, }}, +{ 0x22A2, {0x00, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x00, }}, +{ 0x22A3, {0x00, 0x10, 0x10, 0xF0, 0x10, 0x10, 0x00, }}, +{ 0x22A4, {0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, }}, +{ 0x22A5, {0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, }}, +{ 0x22A6, {0x00, 0x40, 0x40, 0x70, 0x40, 0x40, 0x00, }}, +{ 0x22A7, {0x00, 0x40, 0x70, 0x40, 0x70, 0x40, 0x00, }}, +{ 0x22A8, {0x00, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0x00, }}, +{ 0x22C2, {0x60, 0x90, 0x90, 0x90, 0x90, 0x90, 0x00, }}, +{ 0x22C3, {0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x22C5, {0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x22EE, {0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, }}, +{ 0x22EF, {0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, }}, +{ 0x22F0, {0x00, 0x08, 0x00, 0x20, 0x00, 0x80, 0x00, }}, +{ 0x22F1, {0x00, 0x80, 0x00, 0x20, 0x00, 0x08, 0x00, }}, +{ 0x2300, {0x00, 0x78, 0x98, 0xA8, 0xC8, 0xF0, 0x00, }}, +{ 0x2302, {0x00, 0x20, 0x50, 0x88, 0x88, 0xF8, 0x00, }}, +{ 0x2308, {0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, }}, +{ 0x2309, {0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, }}, +{ 0x230A, {0x40, 0x40, 0x40, 0x40, 0x40, 0x70, 0x00, }}, +{ 0x230B, {0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00, }}, +{ 0x2310, {0x00, 0x00, 0x00, 0xF0, 0x80, 0x00, 0x00, }}, +{ 0x2320, {0x10, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, }}, +{ 0x2321, {0x20, 0x20, 0x20, 0x20, 0x20, 0xA0, 0x40, }}, +{ 0x23BA, {0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23BB, {0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23BC, {0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, }}, +{ 0x23BD, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, }}, +{ 0x2409, {0xA0, 0xE0, 0xA0, 0x70, 0x20, 0x20, 0x00, }}, +{ 0x240A, {0x80, 0x80, 0xF0, 0x20, 0x30, 0x20, 0x00, }}, +{ 0x240B, {0xA0, 0xA0, 0x78, 0x50, 0x10, 0x10, 0x00, }}, +{ 0x240C, {0xE0, 0x80, 0xF8, 0xA0, 0x30, 0x20, 0x00, }}, +{ 0x240D, {0x60, 0x80, 0xE0, 0x50, 0x60, 0x50, 0x00, }}, +{ 0x2423, {0x00, 0x00, 0x00, 0x00, 0x90, 0xF0, 0x00, }}, +{ 0x2424, {0xC0, 0xA0, 0xA0, 0xA0, 0x20, 0x38, 0x00, }}, +{ 0x2500, {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2501, {0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2502, {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, }}, +{ 0x2503, {0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, }}, +{ 0x2504, {0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, }}, +{ 0x2505, {0x00, 0x00, 0xA8, 0xA8, 0x00, 0x00, 0x00, }}, +{ 0x2506, {0x20, 0x00, 0x20, 0x20, 0x00, 0x20, 0x00, }}, +{ 0x2507, {0x30, 0x00, 0x30, 0x30, 0x00, 0x30, 0x00, }}, +{ 0x2508, {0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x00, }}, +{ 0x2509, {0x00, 0x00, 0xA8, 0xA8, 0x00, 0x00, 0x00, }}, +{ 0x250A, {0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, }}, +{ 0x250B, {0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, }}, +{ 0x250C, {0x00, 0x00, 0x00, 0x38, 0x20, 0x20, 0x20, }}, +{ 0x250D, {0x00, 0x00, 0x38, 0x38, 0x20, 0x20, 0x20, }}, +{ 0x250E, {0x00, 0x00, 0x00, 0x38, 0x30, 0x30, 0x30, }}, +{ 0x250F, {0x00, 0x00, 0x38, 0x38, 0x30, 0x30, 0x30, }}, +{ 0x2510, {0x00, 0x00, 0x00, 0xE0, 0x20, 0x20, 0x20, }}, +{ 0x2511, {0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, }}, +{ 0x2512, {0x00, 0x00, 0x00, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x2513, {0x00, 0x00, 0xF0, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x2514, {0x20, 0x20, 0x20, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x2515, {0x20, 0x20, 0x38, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x2516, {0x30, 0x30, 0x30, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x2517, {0x30, 0x30, 0x38, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x2518, {0x20, 0x20, 0x20, 0xE0, 0x00, 0x00, 0x00, }}, +{ 0x2519, {0x20, 0x20, 0xE0, 0xE0, 0x00, 0x00, 0x00, }}, +{ 0x251A, {0x30, 0x30, 0x30, 0xF0, 0x00, 0x00, 0x00, }}, +{ 0x251B, {0x30, 0x30, 0xF0, 0xF0, 0x00, 0x00, 0x00, }}, +{ 0x251C, {0x20, 0x20, 0x20, 0x38, 0x20, 0x20, 0x20, }}, +{ 0x251D, {0x20, 0x20, 0x38, 0x38, 0x20, 0x20, 0x20, }}, +{ 0x251E, {0x30, 0x30, 0x30, 0x38, 0x20, 0x20, 0x20, }}, +{ 0x251F, {0x20, 0x20, 0x20, 0x38, 0x30, 0x30, 0x30, }}, +{ 0x2520, {0x30, 0x30, 0x30, 0x38, 0x30, 0x30, 0x30, }}, +{ 0x2521, {0x30, 0x30, 0x38, 0x38, 0x20, 0x20, 0x20, }}, +{ 0x2522, {0x20, 0x20, 0x38, 0x38, 0x30, 0x30, 0x30, }}, +{ 0x2523, {0x30, 0x30, 0x38, 0x38, 0x30, 0x30, 0x30, }}, +{ 0x2524, {0x20, 0x20, 0x20, 0xE0, 0x20, 0x20, 0x20, }}, +{ 0x2525, {0x20, 0x20, 0xE0, 0xE0, 0x20, 0x20, 0x20, }}, +{ 0x2526, {0x30, 0x30, 0x30, 0xF0, 0x20, 0x20, 0x20, }}, +{ 0x2527, {0x20, 0x20, 0x20, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x2528, {0x30, 0x30, 0x30, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x2529, {0x30, 0x30, 0xF0, 0xF0, 0x20, 0x20, 0x20, }}, +{ 0x252A, {0x20, 0x20, 0xF0, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x252B, {0x30, 0x30, 0xF0, 0xF0, 0x30, 0x30, 0x30, }}, +{ 0x252C, {0x00, 0x00, 0x00, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x252D, {0x00, 0x00, 0xE0, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x252E, {0x00, 0x00, 0x38, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x252F, {0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x2530, {0x00, 0x00, 0x00, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2531, {0x00, 0x00, 0xE0, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2532, {0x00, 0x00, 0x18, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2533, {0x00, 0x00, 0xF8, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2534, {0x20, 0x20, 0x20, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2535, {0x20, 0x20, 0xE0, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2536, {0x20, 0x20, 0x38, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2537, {0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2538, {0x30, 0x30, 0x30, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2539, {0x30, 0x30, 0xF0, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x253A, {0x30, 0x30, 0x38, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x253B, {0x30, 0x30, 0xF8, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x253C, {0x20, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x253D, {0x20, 0x20, 0xE0, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x253E, {0x20, 0x20, 0x38, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x253F, {0x20, 0x20, 0xF8, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x2540, {0x30, 0x30, 0x30, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x2541, {0x20, 0x20, 0x20, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2542, {0x30, 0x30, 0x30, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2543, {0x30, 0x30, 0xF0, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x2544, {0x30, 0x30, 0x38, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x2545, {0x20, 0x20, 0xE0, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2546, {0x20, 0x20, 0x38, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2547, {0x30, 0x30, 0xF8, 0xF8, 0x20, 0x20, 0x20, }}, +{ 0x2548, {0x20, 0x20, 0xF8, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x2549, {0x30, 0x30, 0xF0, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x254A, {0x30, 0x30, 0x38, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x254B, {0x30, 0x30, 0xF8, 0xF8, 0x30, 0x30, 0x30, }}, +{ 0x254C, {0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, }}, +{ 0x254D, {0x00, 0x00, 0xD0, 0xD0, 0x00, 0x00, 0x00, }}, +{ 0x254E, {0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x00, }}, +{ 0x254F, {0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, }}, +{ 0x2550, {0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, }}, +{ 0x2551, {0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, }}, +{ 0x2552, {0x00, 0x00, 0x38, 0x20, 0x38, 0x20, 0x20, }}, +{ 0x2553, {0x00, 0x00, 0x00, 0x78, 0x50, 0x50, 0x50, }}, +{ 0x2554, {0x00, 0x00, 0x78, 0x40, 0x58, 0x50, 0x50, }}, +{ 0x2555, {0x00, 0x00, 0xE0, 0x20, 0xE0, 0x20, 0x20, }}, +{ 0x2556, {0x00, 0x00, 0x00, 0xF0, 0x50, 0x50, 0x50, }}, +{ 0x2557, {0x00, 0x00, 0xF0, 0x10, 0xD0, 0x50, 0x50, }}, +{ 0x2558, {0x20, 0x20, 0x38, 0x20, 0x38, 0x00, 0x00, }}, +{ 0x2559, {0x50, 0x50, 0x50, 0x78, 0x00, 0x00, 0x00, }}, +{ 0x255A, {0x50, 0x50, 0x58, 0x40, 0x78, 0x00, 0x00, }}, +{ 0x255B, {0x20, 0x20, 0xE0, 0x20, 0xE0, 0x00, 0x00, }}, +{ 0x255C, {0x50, 0x50, 0x50, 0xF0, 0x00, 0x00, 0x00, }}, +{ 0x255D, {0x50, 0x50, 0xD0, 0x10, 0xF0, 0x00, 0x00, }}, +{ 0x255E, {0x20, 0x20, 0x38, 0x20, 0x38, 0x20, 0x20, }}, +{ 0x255F, {0x50, 0x50, 0x50, 0x58, 0x50, 0x50, 0x50, }}, +{ 0x2560, {0x50, 0x50, 0x58, 0x40, 0x58, 0x50, 0x50, }}, +{ 0x2561, {0x20, 0x20, 0xE0, 0x20, 0xE0, 0x20, 0x20, }}, +{ 0x2562, {0x50, 0x50, 0x50, 0xD0, 0x50, 0x50, 0x50, }}, +{ 0x2563, {0x50, 0x50, 0xD0, 0x10, 0xD0, 0x50, 0x50, }}, +{ 0x2564, {0x00, 0x00, 0xF8, 0x00, 0xF8, 0x20, 0x20, }}, +{ 0x2565, {0x00, 0x00, 0x00, 0xF8, 0x50, 0x50, 0x50, }}, +{ 0x2566, {0x00, 0x00, 0xF8, 0x00, 0xD8, 0x50, 0x50, }}, +{ 0x2567, {0x20, 0x20, 0xF8, 0x00, 0xF8, 0x00, 0x00, }}, +{ 0x2568, {0x50, 0x50, 0x50, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x2569, {0x50, 0x50, 0xD8, 0x00, 0xF8, 0x00, 0x00, }}, +{ 0x256A, {0x20, 0x20, 0xF8, 0x20, 0xF8, 0x20, 0x20, }}, +{ 0x256B, {0x50, 0x50, 0x50, 0xF8, 0x50, 0x50, 0x50, }}, +{ 0x256C, {0x50, 0x50, 0xD8, 0x00, 0xD8, 0x50, 0x50, }}, +{ 0x256D, {0x00, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, }}, +{ 0x256E, {0x00, 0x00, 0x00, 0xC0, 0x20, 0x20, 0x20, }}, +{ 0x256F, {0x20, 0x20, 0x20, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x2570, {0x20, 0x20, 0x20, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x2571, {0x08, 0x10, 0x10, 0x20, 0x40, 0x40, 0x80, }}, +{ 0x2572, {0x80, 0x40, 0x40, 0x20, 0x10, 0x10, 0x08, }}, +{ 0x2573, {0x88, 0x50, 0x50, 0x20, 0x50, 0x50, 0x88, }}, +{ 0x2574, {0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, }}, +{ 0x2575, {0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x2576, {0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x2577, {0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, }}, +{ 0x2578, {0x00, 0x00, 0xE0, 0xE0, 0x00, 0x00, 0x00, }}, +{ 0x2579, {0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x257A, {0x00, 0x00, 0x38, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x257B, {0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, }}, +{ 0x257C, {0x00, 0x00, 0x38, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x257D, {0x20, 0x20, 0x20, 0x30, 0x30, 0x30, 0x30, }}, +{ 0x257E, {0x00, 0x00, 0xE0, 0xF8, 0x00, 0x00, 0x00, }}, +{ 0x257F, {0x30, 0x30, 0x30, 0x30, 0x20, 0x20, 0x20, }}, +{ 0x2580, {0xF8, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2581, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, }}, +{ 0x2582, {0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, }}, +{ 0x2583, {0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, }}, +{ 0x2584, {0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x2585, {0x00, 0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x2586, {0x00, 0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x2587, {0x00, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x2588, {0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x2589, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, }}, +{ 0x258A, {0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, }}, +{ 0x258B, {0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, }}, +{ 0x258C, {0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, }}, +{ 0x258D, {0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, }}, +{ 0x258E, {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, }}, +{ 0x258F, {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, }}, +{ 0x2590, {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, }}, +{ 0x2591, {0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x00, }}, +{ 0x2592, {0xA8, 0x50, 0xA8, 0x50, 0xA8, 0x50, 0xA8, }}, +{ 0x2593, {0xB8, 0xE8, 0xB8, 0xE8, 0xB8, 0xE8, 0xF8, }}, +{ 0x2594, {0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2595, {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, }}, +{ 0x2596, {0x00, 0x00, 0x00, 0xE0, 0xE0, 0xE0, 0xE0, }}, +{ 0x2597, {0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, }}, +{ 0x2598, {0xE0, 0xE0, 0xE0, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2599, {0xE0, 0xE0, 0xE0, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x259A, {0xE0, 0xE0, 0xE0, 0x18, 0x18, 0x18, 0x18, }}, +{ 0x259B, {0xF8, 0xF8, 0xF8, 0xE0, 0xE0, 0xE0, 0xE0, }}, +{ 0x259C, {0xF8, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, }}, +{ 0x259D, {0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x259E, {0x18, 0x18, 0x18, 0xE0, 0xE0, 0xE0, 0xE0, }}, +{ 0x259F, {0x18, 0x18, 0x18, 0xF8, 0xF8, 0xF8, 0xF8, }}, +{ 0x25A0, {0x00, 0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0x00, }}, +{ 0x25A1, {0x00, 0x00, 0xF0, 0x90, 0x90, 0xF0, 0x00, }}, +{ 0x25AA, {0x00, 0x00, 0x70, 0x70, 0x70, 0x00, 0x00, }}, +{ 0x25AB, {0x00, 0x00, 0x70, 0x50, 0x70, 0x00, 0x00, }}, +{ 0x25AC, {0x00, 0x00, 0xF8, 0xF8, 0xF8, 0x00, 0x00, }}, +{ 0x25AD, {0x00, 0x00, 0xF8, 0x88, 0xF8, 0x00, 0x00, }}, +{ 0x25AE, {0x00, 0x70, 0x70, 0x70, 0x70, 0x70, 0x00, }}, +{ 0x25B2, {0x20, 0x20, 0x70, 0x70, 0xF8, 0xF8, 0x00, }}, +{ 0x25B3, {0x20, 0x20, 0x50, 0x50, 0x88, 0xF8, 0x00, }}, +{ 0x25B6, {0x80, 0xC0, 0xE0, 0xF0, 0xE0, 0xC0, 0x80, }}, +{ 0x25B7, {0x80, 0xC0, 0xA0, 0x90, 0xA0, 0xC0, 0x80, }}, +{ 0x25B8, {0x00, 0x40, 0x60, 0x70, 0x60, 0x40, 0x00, }}, +{ 0x25B9, {0x00, 0x40, 0x60, 0x50, 0x60, 0x40, 0x00, }}, +{ 0x25BA, {0x00, 0x80, 0xE0, 0xF8, 0xE0, 0x80, 0x00, }}, +{ 0x25BB, {0x00, 0x80, 0xE0, 0x98, 0xE0, 0x80, 0x00, }}, +{ 0x25BC, {0xF8, 0xF8, 0x70, 0x70, 0x20, 0x20, 0x00, }}, +{ 0x25BD, {0xF8, 0x88, 0x50, 0x50, 0x20, 0x20, 0x00, }}, +{ 0x25C0, {0x10, 0x30, 0x70, 0xF0, 0x70, 0x30, 0x10, }}, +{ 0x25C1, {0x10, 0x30, 0x50, 0x90, 0x50, 0x30, 0x10, }}, +{ 0x25C2, {0x00, 0x10, 0x30, 0x70, 0x30, 0x10, 0x00, }}, +{ 0x25C3, {0x00, 0x10, 0x30, 0x50, 0x30, 0x10, 0x00, }}, +{ 0x25C4, {0x00, 0x08, 0x38, 0xF8, 0x38, 0x08, 0x00, }}, +{ 0x25C5, {0x00, 0x08, 0x38, 0xC8, 0x38, 0x08, 0x00, }}, +{ 0x25C6, {0x00, 0x20, 0x70, 0xF8, 0x70, 0x20, 0x00, }}, +{ 0x25CA, {0x00, 0x20, 0x50, 0x88, 0x50, 0x20, 0x00, }}, +{ 0x25CB, {0x00, 0x70, 0x88, 0x88, 0x88, 0x70, 0x00, }}, +{ 0x25CF, {0x00, 0x70, 0xF8, 0xF8, 0xF8, 0x70, 0x00, }}, +{ 0x25D8, {0xF8, 0xF8, 0xD8, 0x88, 0xD8, 0xF8, 0xF8, }}, +{ 0x25D9, {0xF8, 0xF8, 0xD8, 0xA8, 0xD8, 0xF8, 0xF8, }}, +{ 0x25E6, {0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, }}, +{ 0x2639, {0x00, 0x50, 0x00, 0x20, 0x50, 0x00, 0x00, }}, +{ 0x263A, {0x00, 0x50, 0x00, 0x50, 0x20, 0x00, 0x00, }}, +{ 0x263B, {0x70, 0xA8, 0xF8, 0xA8, 0xD8, 0x70, 0x00, }}, +{ 0x263C, {0x20, 0xA8, 0x70, 0xD8, 0x70, 0xA8, 0x20, }}, +{ 0x2640, {0x00, 0x20, 0x50, 0x20, 0x70, 0x20, 0x00, }}, +{ 0x2641, {0x00, 0x20, 0x70, 0x20, 0x50, 0x20, 0x00, }}, +{ 0x2642, {0x38, 0x18, 0x68, 0xA0, 0x40, 0x00, 0x00, }}, +{ 0x2660, {0x20, 0x70, 0xF8, 0xF8, 0x20, 0x70, 0x00, }}, +{ 0x2663, {0x70, 0x70, 0xA8, 0xF8, 0xA8, 0x20, 0x70, }}, +{ 0x2665, {0x50, 0xF8, 0xF8, 0x70, 0x70, 0x20, 0x00, }}, +{ 0x2666, {0x20, 0x70, 0xF8, 0xF8, 0x70, 0x20, 0x00, }}, +{ 0x2669, {0x10, 0x10, 0x10, 0x30, 0x70, 0x20, 0x00, }}, +{ 0x266A, {0x20, 0x30, 0x28, 0x60, 0xE0, 0x40, 0x00, }}, +{ 0x266B, {0x60, 0x58, 0x48, 0xC8, 0xD8, 0x18, 0x00, }}, +{ 0x266C, {0x70, 0x68, 0x58, 0xC8, 0xD8, 0x18, 0x00, }}, +{ 0x266D, {0x40, 0x40, 0x70, 0x50, 0x50, 0x60, 0x00, }}, +{ 0x266E, {0x40, 0x70, 0x50, 0x50, 0x70, 0x10, 0x00, }}, +{ 0x266F, {0x10, 0x58, 0x70, 0xD8, 0x70, 0xD0, 0x40, }}, +{ 0x27E8, {0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x00, }}, +{ 0x27E9, {0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x00, }}, +{ 0x2800, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2801, {0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2802, {0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2803, {0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2804, {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2805, {0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2806, {0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2807, {0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2808, {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2809, {0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280A, {0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280B, {0x50, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280C, {0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x280D, {0x50, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x280E, {0x10, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x280F, {0x50, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2810, {0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2811, {0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2812, {0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2813, {0x40, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2814, {0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2815, {0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2816, {0x00, 0x00, 0x50, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2817, {0x40, 0x00, 0x50, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2818, {0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2819, {0x50, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281A, {0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281B, {0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281C, {0x10, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x281D, {0x50, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x281E, {0x10, 0x00, 0x50, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x281F, {0x50, 0x00, 0x50, 0x00, 0x40, 0x00, 0x00, }}, +{ 0x2820, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2821, {0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2822, {0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2823, {0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2824, {0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2825, {0x40, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2826, {0x00, 0x00, 0x40, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2827, {0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2828, {0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2829, {0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x282A, {0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x282B, {0x50, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x282C, {0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x282D, {0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x282E, {0x10, 0x00, 0x40, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x282F, {0x50, 0x00, 0x40, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2830, {0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2831, {0x40, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2832, {0x00, 0x00, 0x50, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2833, {0x40, 0x00, 0x50, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2834, {0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2835, {0x40, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2836, {0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2837, {0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2838, {0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x2839, {0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x283A, {0x10, 0x00, 0x50, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x283B, {0x50, 0x00, 0x50, 0x00, 0x10, 0x00, 0x00, }}, +{ 0x283C, {0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x283D, {0x50, 0x00, 0x10, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x283E, {0x10, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x283F, {0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, }}, +{ 0x2840, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2841, {0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2842, {0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2843, {0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2844, {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2845, {0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2846, {0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2847, {0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2848, {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2849, {0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x284A, {0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x284B, {0x50, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x284C, {0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x284D, {0x50, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x284E, {0x10, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x284F, {0x50, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2850, {0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2851, {0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2852, {0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2853, {0x40, 0x00, 0x50, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2854, {0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2855, {0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2856, {0x00, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2857, {0x40, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2858, {0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x2859, {0x50, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x285A, {0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x285B, {0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x40, }}, +{ 0x285C, {0x10, 0x00, 0x10, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x285D, {0x50, 0x00, 0x10, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x285E, {0x10, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x285F, {0x50, 0x00, 0x50, 0x00, 0x40, 0x00, 0x40, }}, +{ 0x2860, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2861, {0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2862, {0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2863, {0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2864, {0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2865, {0x40, 0x00, 0x00, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2866, {0x00, 0x00, 0x40, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2867, {0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2868, {0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2869, {0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x286A, {0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x286B, {0x50, 0x00, 0x40, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x286C, {0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x286D, {0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x286E, {0x10, 0x00, 0x40, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x286F, {0x50, 0x00, 0x40, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2870, {0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2871, {0x40, 0x00, 0x10, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2872, {0x00, 0x00, 0x50, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2873, {0x40, 0x00, 0x50, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2874, {0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2875, {0x40, 0x00, 0x10, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2876, {0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2877, {0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2878, {0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x2879, {0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x287A, {0x10, 0x00, 0x50, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x287B, {0x50, 0x00, 0x50, 0x00, 0x10, 0x00, 0x40, }}, +{ 0x287C, {0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x287D, {0x50, 0x00, 0x10, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x287E, {0x10, 0x00, 0x50, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x287F, {0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x40, }}, +{ 0x2880, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2881, {0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2882, {0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2883, {0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2884, {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2885, {0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2886, {0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2887, {0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2888, {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2889, {0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x288A, {0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x288B, {0x50, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x288C, {0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x288D, {0x50, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x288E, {0x10, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x288F, {0x50, 0x00, 0x40, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2890, {0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2891, {0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2892, {0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2893, {0x40, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2894, {0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2895, {0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2896, {0x00, 0x00, 0x50, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2897, {0x40, 0x00, 0x50, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x2898, {0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x2899, {0x50, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x289A, {0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x289B, {0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x10, }}, +{ 0x289C, {0x10, 0x00, 0x10, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x289D, {0x50, 0x00, 0x10, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x289E, {0x10, 0x00, 0x50, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x289F, {0x50, 0x00, 0x50, 0x00, 0x40, 0x00, 0x10, }}, +{ 0x28A0, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28A1, {0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28A2, {0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28A3, {0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28A4, {0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28A5, {0x40, 0x00, 0x00, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28A6, {0x00, 0x00, 0x40, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28A7, {0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28A8, {0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28A9, {0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28AA, {0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28AB, {0x50, 0x00, 0x40, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28AC, {0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28AD, {0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28AE, {0x10, 0x00, 0x40, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28AF, {0x50, 0x00, 0x40, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28B0, {0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28B1, {0x40, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28B2, {0x00, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28B3, {0x40, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28B4, {0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28B5, {0x40, 0x00, 0x10, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28B6, {0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28B7, {0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28B8, {0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28B9, {0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28BA, {0x10, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28BB, {0x50, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, }}, +{ 0x28BC, {0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28BD, {0x50, 0x00, 0x10, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28BE, {0x10, 0x00, 0x50, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28BF, {0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x10, }}, +{ 0x28C0, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28C1, {0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28C2, {0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28C3, {0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28C4, {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28C5, {0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28C6, {0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28C7, {0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28C8, {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28C9, {0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28CA, {0x10, 0x00, 0x40, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28CB, {0x50, 0x00, 0x40, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28CC, {0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28CD, {0x50, 0x00, 0x00, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28CE, {0x10, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28CF, {0x50, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28D0, {0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28D1, {0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28D2, {0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28D3, {0x40, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28D4, {0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28D5, {0x40, 0x00, 0x10, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28D6, {0x00, 0x00, 0x50, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28D7, {0x40, 0x00, 0x50, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28D8, {0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28D9, {0x50, 0x00, 0x10, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28DA, {0x10, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28DB, {0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x50, }}, +{ 0x28DC, {0x10, 0x00, 0x10, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28DD, {0x50, 0x00, 0x10, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28DE, {0x10, 0x00, 0x50, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28DF, {0x50, 0x00, 0x50, 0x00, 0x40, 0x00, 0x50, }}, +{ 0x28E0, {0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28E1, {0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28E2, {0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28E3, {0x40, 0x00, 0x40, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28E4, {0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28E5, {0x40, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28E6, {0x00, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28E7, {0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28E8, {0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28E9, {0x50, 0x00, 0x00, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28EA, {0x10, 0x00, 0x40, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28EB, {0x50, 0x00, 0x40, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28EC, {0x10, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28ED, {0x50, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28EE, {0x10, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28EF, {0x50, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28F0, {0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28F1, {0x40, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28F2, {0x00, 0x00, 0x50, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28F3, {0x40, 0x00, 0x50, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28F4, {0x00, 0x00, 0x10, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28F5, {0x40, 0x00, 0x10, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28F6, {0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28F7, {0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28F8, {0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28F9, {0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28FA, {0x10, 0x00, 0x50, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28FB, {0x50, 0x00, 0x50, 0x00, 0x10, 0x00, 0x50, }}, +{ 0x28FC, {0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28FD, {0x50, 0x00, 0x10, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28FE, {0x10, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, }}, +{ 0x28FF, {0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, }}, +{ 0xFB01, {0x20, 0x50, 0x40, 0xF0, 0x50, 0x50, 0x00, }}, +{ 0xFB02, {0x30, 0x50, 0x50, 0xF0, 0x50, 0x50, 0x00, }}, +{ 0xFFFD, {0x50, 0xA8, 0xE8, 0xD8, 0xF8, 0xD8, 0x70, }}, diff --git a/Mednafen/mednafen/video/font6x13.h b/Mednafen/mednafen/video/font6x13.h new file mode 100644 index 0000000000..b6b87974ba --- /dev/null +++ b/Mednafen/mednafen/video/font6x13.h @@ -0,0 +1,4430 @@ +{ 0x0000, {0x00,0x00,0xA8,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0xA8,0x00,0x00}}, +{ 0x0020, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0021, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0x0022, {0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0023, {0x00,0x00,0x00,0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00,0x00,0x00}}, +{ 0x0024, {0x00,0x00,0x20,0x78,0xA0,0xA0,0x70,0x28,0x28,0xF0,0x20,0x00,0x00}}, +{ 0x0025, {0x00,0x00,0x48,0xA8,0x50,0x10,0x20,0x40,0x50,0xA8,0x90,0x00,0x00}}, +{ 0x0026, {0x00,0x00,0x00,0x40,0xA0,0xA0,0x40,0xA0,0x98,0x90,0x68,0x00,0x00}}, +{ 0x0027, {0x00,0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0028, {0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00}}, +{ 0x0029, {0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0x002A, {0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x002B, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x002C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x20,0x40,0x00}}, +{ 0x002D, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x002E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00}}, +{ 0x002F, {0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00,0x00}}, +{ 0x0030, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00,0x00}}, +{ 0x0031, {0x00,0x00,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x0032, {0x00,0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x0033, {0x00,0x00,0xF8,0x08,0x10,0x20,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0034, {0x00,0x00,0x10,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00}}, +{ 0x0035, {0x00,0x00,0xF8,0x80,0x80,0xB0,0xC8,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0036, {0x00,0x00,0x70,0x88,0x80,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0037, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00}}, +{ 0x0038, {0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0039, {0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x003A, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x20,0x70,0x20,0x00}}, +{ 0x003B, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x30,0x20,0x40,0x00}}, +{ 0x003C, {0x00,0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00}}, +{ 0x003D, {0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x003E, {0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00}}, +{ 0x003F, {0x00,0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0x0040, {0x00,0x00,0x70,0x88,0x88,0x98,0xA8,0xA8,0xB0,0x80,0x78,0x00,0x00}}, +{ 0x0041, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0042, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x0043, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0044, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x0045, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0046, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0047, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0048, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0049, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x004A, {0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00}}, +{ 0x004B, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x004C, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x004D, {0x00,0x00,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x004E, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x00,0x00}}, +{ 0x004F, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0050, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0051, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0xA8,0x70,0x08,0x00}}, +{ 0x0052, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x0053, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0054, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0055, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0056, {0x00,0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x0057, {0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0058, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x0059, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x005A, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x005B, {0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00}}, +{ 0x005C, {0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00,0x00}}, +{ 0x005D, {0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00}}, +{ 0x005E, {0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x005F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00}}, +{ 0x0060, {0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0061, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0062, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0063, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0064, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x0065, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0066, {0x00,0x00,0x30,0x48,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x00,0x00}}, +{ 0x0067, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x0068, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0069, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x006A, {0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60}}, +{ 0x006B, {0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x006C, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x006D, {0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0x006E, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x006F, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0070, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80}}, +{ 0x0071, {0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x08}}, +{ 0x0072, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0073, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x0074, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x0075, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0076, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x0077, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0078, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,0x00}}, +{ 0x0079, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x007A, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x007B, {0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00}}, +{ 0x007C, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x007D, {0x00,0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00}}, +{ 0x007E, {0x00,0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00A0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00A1, {0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x00A2, {0x00,0x00,0x20,0x70,0xA8,0xA0,0xA0,0xA8,0x70,0x20,0x00,0x00,0x00}}, +{ 0x00A3, {0x00,0x00,0x30,0x48,0x40,0x40,0xE0,0x40,0x40,0x48,0xB0,0x00,0x00}}, +{ 0x00A4, {0x00,0x00,0x00,0x00,0x88,0x70,0x50,0x50,0x70,0x88,0x00,0x00,0x00}}, +{ 0x00A5, {0x00,0x00,0x88,0x88,0x50,0x50,0xF8,0x20,0xF8,0x20,0x20,0x00,0x00}}, +{ 0x00A6, {0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x00A7, {0x00,0x30,0x48,0x40,0x30,0x48,0x48,0x30,0x08,0x48,0x30,0x00,0x00}}, +{ 0x00A8, {0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00A9, {0x00,0x70,0x88,0xA8,0xD8,0xC8,0xD8,0xA8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x00AA, {0x00,0x00,0x70,0x08,0x78,0x88,0x78,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x00AB, {0x00,0x00,0x00,0x00,0x28,0x50,0xA0,0xA0,0x50,0x28,0x00,0x00,0x00}}, +{ 0x00AC, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x00,0x00,0x00,0x00}}, +{ 0x00AD, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00AE, {0x00,0x70,0x88,0xE8,0xD8,0xD8,0xE8,0xD8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x00AF, {0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00B0, {0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00B1, {0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x00B2, {0x00,0x40,0xA0,0x20,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00B3, {0x00,0x40,0xA0,0x40,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00B4, {0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00B5, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0xE8,0x80,0x80}}, +{ 0x00B6, {0x00,0x00,0x78,0xE8,0xE8,0xE8,0xE8,0x68,0x28,0x28,0x28,0x00,0x00}}, +{ 0x00B7, {0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00B8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20}}, +{ 0x00B9, {0x00,0x40,0xC0,0x40,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x00BA, {0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x00BB, {0x00,0x00,0x00,0x00,0xA0,0x50,0x28,0x28,0x50,0xA0,0x00,0x00,0x00}}, +{ 0x00BC, {0x00,0x40,0xC0,0x40,0x40,0xE0,0x08,0x18,0x28,0x38,0x08,0x00,0x00}}, +{ 0x00BD, {0x00,0x40,0xC0,0x40,0x40,0xE0,0x10,0x28,0x08,0x10,0x38,0x00,0x00}}, +{ 0x00BE, {0x00,0x40,0xA0,0x40,0x20,0xA0,0x48,0x18,0x28,0x38,0x08,0x00,0x00}}, +{ 0x00BF, {0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x80,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00C0, {0x00,0x40,0x20,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x00C1, {0x00,0x10,0x20,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x00C2, {0x00,0x30,0x48,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x00C3, {0x00,0x28,0x50,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x00C4, {0x00,0x50,0x50,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x00C5, {0x00,0x20,0x50,0x20,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x00C6, {0x00,0x00,0x58,0xA0,0xA0,0xA0,0xB0,0xE0,0xA0,0xA0,0xB8,0x00,0x00}}, +{ 0x00C7, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x20,0x40}}, +{ 0x00C8, {0x00,0x40,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x00C9, {0x00,0x10,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x00CA, {0x00,0x30,0x48,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x00CB, {0x00,0x50,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x00CC, {0x00,0x40,0x20,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00CD, {0x00,0x10,0x20,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00CE, {0x00,0x30,0x48,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00CF, {0x00,0x50,0x50,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00D0, {0x00,0x00,0xF0,0x48,0x48,0x48,0xE8,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x00D1, {0x00,0x28,0x50,0x00,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x00,0x00}}, +{ 0x00D2, {0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00D3, {0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00D4, {0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00D5, {0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00D6, {0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00D7, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00,0x00,0x00}}, +{ 0x00D8, {0x00,0x08,0x70,0x98,0x98,0xA8,0xA8,0xA8,0xC8,0xC8,0x70,0x80,0x00}}, +{ 0x00D9, {0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00DA, {0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00DB, {0x00,0x30,0x48,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00DC, {0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00DD, {0x00,0x10,0x20,0x00,0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x00DE, {0x00,0x00,0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x00DF, {0x00,0x00,0x60,0x90,0x90,0xA0,0xA0,0x90,0x88,0x88,0xB0,0x00,0x00}}, +{ 0x00E0, {0x00,0x00,0x40,0x20,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00E1, {0x00,0x00,0x10,0x20,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00E2, {0x00,0x00,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00E3, {0x00,0x00,0x28,0x50,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00E4, {0x00,0x00,0x50,0x50,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00E5, {0x00,0x30,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00E6, {0x00,0x00,0x00,0x00,0x00,0x70,0x28,0x70,0xA0,0xA8,0x50,0x00,0x00}}, +{ 0x00E7, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x20,0x40}}, +{ 0x00E8, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x00E9, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x00EA, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x00EB, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x00EC, {0x00,0x00,0x40,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00ED, {0x00,0x00,0x10,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00EE, {0x00,0x00,0x30,0x48,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00EF, {0x00,0x00,0x50,0x50,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x00F0, {0x00,0x50,0x20,0x60,0x10,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00F1, {0x00,0x00,0x28,0x50,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x00F2, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00F3, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00F4, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00F5, {0x00,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00F6, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x00F7, {0x00,0x00,0x00,0x20,0x20,0x00,0xF8,0x00,0x20,0x20,0x00,0x00,0x00}}, +{ 0x00F8, {0x00,0x00,0x00,0x00,0x08,0x70,0x98,0xA8,0xA8,0xC8,0x70,0x80,0x00}}, +{ 0x00F9, {0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00FA, {0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00FB, {0x00,0x00,0x30,0x48,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00FC, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x00FD, {0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x00FE, {0x00,0x00,0x00,0x80,0x80,0xB0,0xC8,0x88,0x88,0xC8,0xB0,0x80,0x80}}, +{ 0x00FF, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x0100, {0x00,0xF8,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0101, {0x00,0x00,0x00,0xF8,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0102, {0x00,0x88,0x70,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x0103, {0x00,0x00,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0104, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x08,0x04}}, +{ 0x0105, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x08,0x04}}, +{ 0x0106, {0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0107, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0108, {0x00,0x30,0x48,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0109, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x010A, {0x00,0x20,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x010B, {0x00,0x00,0x20,0x20,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x010C, {0x00,0x48,0x30,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x010D, {0x00,0x00,0x48,0x30,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x010E, {0x00,0x48,0x30,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x010F, {0x48,0x30,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x0110, {0x00,0x00,0xF0,0x48,0x48,0x48,0xE8,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x0111, {0x00,0x00,0x08,0x1C,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x0112, {0x00,0xF8,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0113, {0x00,0x00,0x00,0xF8,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0114, {0x00,0x88,0x70,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0115, {0x00,0x00,0x88,0x70,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0116, {0x00,0x20,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0117, {0x00,0x00,0x20,0x20,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0118, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x20,0x10}}, +{ 0x0119, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x20,0x10}}, +{ 0x011A, {0x00,0x48,0x30,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x011B, {0x00,0x00,0x48,0x30,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x011C, {0x00,0x30,0x48,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0x011D, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x011E, {0x00,0x88,0x70,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0x011F, {0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x0120, {0x00,0x20,0x20,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0x0121, {0x00,0x00,0x20,0x20,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x0122, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x98,0x88,0x88,0x70,0x20,0x40}}, +{ 0x0123, {0x00,0x10,0x20,0x60,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x0124, {0x00,0x30,0x48,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0125, {0x00,0x30,0x48,0x00,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0126, {0x00,0x00,0x88,0x88,0xF8,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0127, {0x00,0x00,0x80,0xF0,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0128, {0x00,0x28,0x50,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0129, {0x00,0x00,0x50,0xA0,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x012A, {0x00,0xF8,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x012B, {0x00,0x00,0x00,0xF8,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x012C, {0x00,0x88,0x70,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x012D, {0x00,0x00,0x88,0x70,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x012E, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x20,0x10}}, +{ 0x012F, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x20,0x10}}, +{ 0x0130, {0x00,0x20,0x20,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0131, {0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0132, {0x00,0x00,0xDC,0x88,0x88,0x88,0x88,0x88,0x88,0xA8,0xD0,0x00,0x00}}, +{ 0x0133, {0x00,0x00,0x00,0x48,0x00,0xD8,0x48,0x48,0x48,0x48,0xE8,0x48,0x30}}, +{ 0x0134, {0x00,0x30,0x48,0x00,0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00}}, +{ 0x0135, {0x00,0x00,0x30,0x48,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60}}, +{ 0x0136, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x40,0x80}}, +{ 0x0137, {0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x40,0x80}}, +{ 0x0138, {0x00,0x00,0x00,0x00,0x00,0x88,0x90,0xA0,0xE0,0x90,0x88,0x00,0x00}}, +{ 0x0139, {0x00,0x40,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x013A, {0x10,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x013B, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x20,0x40}}, +{ 0x013C, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x20,0x40}}, +{ 0x013D, {0x00,0x90,0x60,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00}}, +{ 0x013E, {0x90,0x60,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x013F, {0x00,0x00,0x80,0x80,0x80,0x90,0x90,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0140, {0x00,0x00,0x60,0x20,0x20,0x28,0x28,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0141, {0x00,0x00,0x40,0x40,0x60,0x40,0xC0,0x40,0x40,0x40,0x78,0x00,0x00}}, +{ 0x0142, {0x00,0x00,0x60,0x20,0x30,0x20,0x60,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0143, {0x00,0x10,0x20,0x00,0x88,0xC8,0xC8,0xA8,0x98,0x98,0x88,0x00,0x00}}, +{ 0x0144, {0x00,0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0145, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x40,0x80}}, +{ 0x0146, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x40,0x80}}, +{ 0x0147, {0x00,0x48,0x30,0x00,0x88,0xC8,0xC8,0xA8,0x98,0x98,0x88,0x00,0x00}}, +{ 0x0148, {0x00,0x00,0x48,0x30,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0149, {0x00,0xC0,0x40,0x80,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x014A, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x28,0x10}}, +{ 0x014B, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x28,0x10}}, +{ 0x014C, {0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x014D, {0x00,0x00,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x014E, {0x00,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x014F, {0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0150, {0x00,0x48,0x90,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0151, {0x00,0x00,0x48,0x90,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0152, {0x00,0x00,0x78,0xA0,0xA0,0xA0,0xB0,0xA0,0xA0,0xA0,0x78,0x00,0x00}}, +{ 0x0153, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xB8,0xA0,0xA8,0x50,0x00,0x00}}, +{ 0x0154, {0x00,0x10,0x20,0x00,0xF0,0x88,0x88,0xF0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x0155, {0x00,0x00,0x10,0x20,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0156, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x88,0x40,0x80}}, +{ 0x0157, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x40,0x80}}, +{ 0x0158, {0x00,0x90,0x60,0x00,0xF0,0x88,0x88,0xF0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x0159, {0x00,0x00,0x90,0x60,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x015A, {0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x015B, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x015C, {0x00,0x30,0x48,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x015D, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x015E, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x20,0x40}}, +{ 0x015F, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x20,0x40}}, +{ 0x0160, {0x00,0x48,0x30,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0161, {0x00,0x00,0x90,0x60,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x0162, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x20}}, +{ 0x0163, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x20,0x40}}, +{ 0x0164, {0x00,0x48,0x30,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0165, {0x00,0x90,0x60,0x00,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x0166, {0x00,0x00,0xF8,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0167, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0xE0,0x40,0x48,0x30,0x00,0x00}}, +{ 0x0168, {0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0169, {0x00,0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x016A, {0x00,0xF8,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x016B, {0x00,0x00,0x00,0xF8,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x016C, {0x00,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x016D, {0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x016E, {0x20,0x50,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x016F, {0x00,0x20,0x50,0x20,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0170, {0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0171, {0x00,0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0172, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x20,0x10}}, +{ 0x0173, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x20,0x10}}, +{ 0x0174, {0x00,0x30,0x48,0x00,0x88,0x88,0x88,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x0175, {0x00,0x00,0x30,0x48,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0176, {0x00,0x30,0x48,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0177, {0x00,0x00,0x30,0x48,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x0178, {0x00,0x50,0x50,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0179, {0x00,0x10,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x017A, {0x00,0x00,0x10,0x20,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x017B, {0x00,0x20,0x20,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x017C, {0x00,0x00,0x20,0x20,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x017D, {0x00,0x48,0x30,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x017E, {0x00,0x00,0x48,0x30,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x017F, {0x00,0x00,0x30,0x48,0x40,0x40,0xC0,0x40,0x40,0x40,0x40,0x00,0x00}}, +{ 0x0180, {0x00,0x00,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x0181, {0x00,0x00,0x70,0xA8,0x28,0x28,0x30,0x28,0x28,0x28,0x70,0x00,0x00}}, +{ 0x0182, {0x00,0x00,0xF8,0x88,0x80,0x80,0xF0,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0183, {0x00,0x00,0x78,0x48,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x0184, {0x00,0x00,0x40,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x0185, {0x00,0x00,0x40,0xC0,0x40,0x40,0x60,0x50,0x50,0x50,0x60,0x00,0x00}}, +{ 0x0186, {0x00,0x00,0x70,0x88,0x08,0x08,0x08,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0187, {0x00,0x04,0x78,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0188, {0x00,0x00,0x00,0x00,0x04,0x78,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0189, {0x00,0x00,0xF0,0x48,0x48,0x48,0xE8,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x018A, {0x00,0x00,0x70,0xA8,0x28,0x28,0x28,0x28,0x28,0x28,0x70,0x00,0x00}}, +{ 0x018B, {0x00,0x00,0xF8,0x88,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x018C, {0x00,0x00,0x78,0x48,0x08,0x08,0x38,0x48,0x48,0x48,0x38,0x00,0x00}}, +{ 0x018D, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x08,0x88,0x70}}, +{ 0x018E, {0x00,0x00,0xF8,0x08,0x08,0x08,0x78,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x018F, {0x00,0x00,0x70,0x88,0x08,0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0190, {0x00,0x00,0x70,0x88,0x80,0x80,0x60,0x80,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0191, {0x00,0x00,0x38,0x20,0x20,0x20,0x38,0x20,0x20,0x20,0x20,0xA0,0x40}}, +{ 0x0192, {0x00,0x00,0x10,0x28,0x20,0x20,0x70,0x20,0x20,0x20,0x20,0xA0,0x40}}, +{ 0x0193, {0x00,0x04,0x78,0x88,0x80,0x80,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0194, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x20,0x20,0x50,0x50,0x20}}, +{ 0x0195, {0x00,0x00,0x80,0x80,0x80,0xC8,0xA8,0xA8,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x0196, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x0197, {0x00,0x00,0x70,0x20,0x20,0x20,0x70,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0198, {0x00,0x00,0x88,0x94,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x0199, {0x00,0x00,0x40,0xA0,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x019A, {0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x019B, {0x00,0x00,0x90,0x60,0x40,0xA0,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x019C, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0x019D, {0x00,0x00,0x48,0x48,0x68,0x68,0x78,0x58,0x58,0x48,0x48,0xC0,0x40}}, +{ 0x019E, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x019F, {0x00,0x00,0x70,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01A0, {0x00,0x00,0x64,0x94,0x98,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x01A1, {0x00,0x00,0x00,0x00,0x00,0x64,0x94,0x98,0x90,0x90,0x60,0x00,0x00}}, +{ 0x01A2, {0x00,0x00,0x50,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x48,0x00,0x00}}, +{ 0x01A3, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0xA8,0xA8,0x48,0x08,0x08}}, +{ 0x01A4, {0x00,0x00,0x70,0xA8,0xA8,0x28,0x30,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x01A5, {0x00,0x00,0x40,0xA0,0x80,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80}}, +{ 0x01A6, {0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x08,0x08}}, +{ 0x01A7, {0x00,0x00,0x70,0x88,0x08,0x08,0x70,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x01A8, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x30,0x40,0x88,0x70,0x00,0x00}}, +{ 0x01A9, {0x00,0x00,0xF8,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x01AA, {0x00,0x00,0x40,0xA0,0x60,0x20,0x20,0x20,0x20,0x20,0x28,0x10,0x00}}, +{ 0x01AB, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x10,0x20}}, +{ 0x01AC, {0x00,0x00,0x78,0xA0,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x01AD, {0x00,0x00,0x20,0x50,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x01AE, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x10}}, +{ 0x01AF, {0x00,0x00,0x94,0x94,0x98,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x01B0, {0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x98,0x90,0xB0,0x50,0x00,0x00}}, +{ 0x01B1, {0x00,0x00,0xD8,0x50,0x50,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01B2, {0x00,0x00,0x90,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01B3, {0x00,0x00,0x68,0xA8,0xA8,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x01B4, {0x00,0x00,0x00,0x00,0x08,0x94,0x90,0x90,0x90,0x70,0x10,0x90,0x60}}, +{ 0x01B5, {0x00,0x00,0xF8,0x08,0x10,0x10,0xF8,0x40,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x01B6, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0xF8,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x01B7, {0x00,0x00,0xF8,0x08,0x10,0x20,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x01B8, {0x00,0x00,0xF8,0x80,0x40,0x20,0x70,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x01B9, {0x00,0x00,0x00,0x00,0x00,0xF8,0x40,0x20,0x70,0x80,0x80,0x88,0x70}}, +{ 0x01BA, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x70,0x10,0x60,0x88,0x70}}, +{ 0x01BB, {0x00,0x00,0x70,0x88,0x88,0x08,0x10,0xF8,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x01BC, {0x00,0x00,0xF8,0x88,0x80,0xB0,0xC8,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x01BD, {0x00,0x00,0x78,0x48,0x40,0x50,0x68,0x08,0x08,0x48,0x30,0x00,0x00}}, +{ 0x01BE, {0x00,0x00,0x00,0x00,0x20,0x20,0x70,0x20,0x10,0x50,0x20,0x00,0x00}}, +{ 0x01BF, {0x00,0x00,0x00,0x00,0x00,0x50,0x68,0x48,0x48,0x50,0x60,0x40,0xC0}}, +{ 0x01C0, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x01C1, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x01C2, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0xF8,0x20,0x20,0x00,0x00}}, +{ 0x01C3, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0x01C4, {0x00,0x28,0x10,0x00,0xD8,0xA8,0xA8,0xB0,0xB0,0xB0,0xD8,0x00,0x00}}, +{ 0x01C5, {0x00,0x00,0x28,0x10,0xC0,0xA0,0xB8,0xA8,0xA8,0xB0,0xD8,0x00,0x00}}, +{ 0x01C6, {0x00,0x28,0x10,0x00,0x20,0x20,0x78,0xA8,0xA8,0xB0,0x78,0x00,0x00}}, +{ 0x01C7, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xA8,0xF0,0x00,0x00}}, +{ 0x01C8, {0x00,0x00,0x80,0x88,0x80,0x98,0x88,0x88,0x88,0x88,0xF8,0x28,0x10}}, +{ 0x01C9, {0x00,0x00,0xC0,0x48,0x40,0x58,0x48,0x48,0x48,0x48,0xE8,0x28,0x10}}, +{ 0x01CA, {0x00,0x00,0xB8,0xA8,0xE8,0xE8,0xE8,0xE8,0xE8,0xB8,0xB8,0x00,0x00}}, +{ 0x01CB, {0x00,0x00,0xA0,0xA8,0xE0,0xF8,0xE8,0xE8,0xE8,0xA8,0xA8,0x28,0x10}}, +{ 0x01CC, {0x00,0x00,0x00,0x08,0x00,0xC8,0xA8,0xA8,0xA8,0xA8,0xA8,0x28,0x10}}, +{ 0x01CD, {0x00,0x48,0x30,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x01CE, {0x00,0x00,0x48,0x30,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01CF, {0x00,0x48,0x30,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x01D0, {0x00,0x00,0x90,0x60,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x01D1, {0x00,0x48,0x30,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01D2, {0x00,0x00,0x48,0x30,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01D3, {0x00,0x48,0x30,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01D4, {0x00,0x00,0x48,0x30,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01D5, {0x00,0xF8,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01D6, {0x00,0xF8,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01D7, {0x10,0x20,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01D8, {0x10,0x20,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01D9, {0x48,0x30,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01DA, {0x48,0x30,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01DB, {0x40,0x20,0x00,0x50,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01DC, {0x40,0x20,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01DD, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x01DE, {0xF8,0x00,0x50,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x01DF, {0xF8,0x00,0x50,0x50,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01E0, {0xF8,0x00,0x20,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x01E1, {0xF8,0x00,0x20,0x20,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01E2, {0x00,0x00,0xF8,0x00,0x58,0xA0,0xA0,0xF0,0xA0,0xA0,0xB8,0x00,0x00}}, +{ 0x01E3, {0x00,0x00,0x00,0xF8,0x00,0x70,0x28,0x70,0xA0,0xA8,0x50,0x00,0x00}}, +{ 0x01E4, {0x00,0x00,0x60,0x90,0x80,0x80,0x80,0xB0,0xB8,0x90,0x60,0x00,0x00}}, +{ 0x01E5, {0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x70,0x10,0xF8,0x60}}, +{ 0x01E6, {0x00,0x48,0x30,0x00,0x70,0x88,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01E7, {0x00,0x48,0x30,0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x01E8, {0x00,0x48,0x30,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x01E9, {0x00,0x48,0x30,0x00,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x00,0x00}}, +{ 0x01EA, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x20,0x10}}, +{ 0x01EB, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x20,0x10}}, +{ 0x01EC, {0x00,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x20,0x10}}, +{ 0x01ED, {0x00,0x00,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x20,0x10}}, +{ 0x01EE, {0x00,0x48,0x30,0x00,0xF8,0x10,0x20,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x01EF, {0x00,0x00,0x48,0x30,0x00,0xF8,0x10,0x20,0x70,0x08,0x08,0x88,0x70}}, +{ 0x01F0, {0x00,0x00,0x48,0x30,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60}}, +{ 0x01F1, {0x00,0x00,0xD8,0xA8,0xA8,0xA8,0xA8,0xB0,0xB0,0xB0,0xD8,0x00,0x00}}, +{ 0x01F2, {0x00,0x00,0xC0,0xA0,0xA0,0xB8,0xA8,0xA8,0xB0,0xB0,0xD8,0x00,0x00}}, +{ 0x01F3, {0x00,0x00,0x20,0x20,0x20,0x78,0xA8,0xA8,0xB0,0xB0,0x78,0x00,0x00}}, +{ 0x01F4, {0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0x01F5, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x01F6, {0x00,0x00,0xA0,0xA0,0xA0,0xA8,0xE8,0xA8,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x01F7, {0x00,0x00,0xB0,0xC8,0x88,0x88,0x90,0xA0,0xC0,0x80,0x80,0x80,0x00}}, +{ 0x01F8, {0x00,0x40,0x20,0x00,0x88,0xC8,0xC8,0xA8,0x98,0x98,0x88,0x00,0x00}}, +{ 0x01F9, {0x00,0x00,0x40,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x01FA, {0x10,0x20,0x00,0x20,0x50,0x20,0x20,0x50,0x88,0xF8,0x88,0x00,0x00}}, +{ 0x01FB, {0x10,0x20,0x30,0x48,0x30,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x01FC, {0x00,0x10,0x20,0x00,0x58,0xA0,0xA0,0xF0,0xA0,0xA0,0xB8,0x00,0x00}}, +{ 0x01FD, {0x00,0x00,0x10,0x20,0x00,0x70,0x28,0x70,0xA0,0xA8,0x50,0x00,0x00}}, +{ 0x01FE, {0x00,0x10,0x20,0x08,0x70,0x98,0x98,0xA8,0xC8,0xC8,0x70,0x80,0x00}}, +{ 0x01FF, {0x00,0x00,0x10,0x20,0x08,0x70,0x98,0xA8,0xA8,0xC8,0x70,0x80,0x00}}, +{ 0x0200, {0x00,0x90,0x48,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x0201, {0x00,0x00,0x90,0x48,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0202, {0x00,0x70,0x88,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x0203, {0x00,0x00,0x70,0x88,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0204, {0x00,0x90,0x48,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0205, {0x00,0x00,0x90,0x48,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0206, {0x00,0x70,0x88,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0207, {0x00,0x00,0x70,0x88,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0208, {0x00,0x90,0x48,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0209, {0x00,0x00,0x90,0x48,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x020A, {0x00,0x70,0x88,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x020B, {0x00,0x00,0x70,0x88,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x020C, {0x00,0x90,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x020D, {0x00,0x00,0x90,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x020E, {0x00,0x70,0x88,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x020F, {0x00,0x00,0x70,0x88,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0210, {0x00,0x90,0x48,0x00,0xF0,0x88,0x88,0xF0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x0211, {0x00,0x00,0x90,0x48,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0212, {0x00,0x70,0x88,0x00,0xF0,0x88,0x88,0xF0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x0213, {0x00,0x00,0x70,0x88,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0214, {0x00,0x90,0x48,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0215, {0x00,0x00,0x90,0x48,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0216, {0x00,0x70,0x88,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0217, {0x00,0x00,0x70,0x88,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0218, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x20,0x40}}, +{ 0x0219, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x20,0x40}}, +{ 0x021A, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x20}}, +{ 0x021B, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x10,0x20}}, +{ 0x021C, {0x00,0x00,0xF0,0x88,0x08,0x10,0x30,0x48,0x08,0x10,0xE0,0x00,0x00}}, +{ 0x021D, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x10,0x30,0x48,0x08,0x10,0xE0}}, +{ 0x021E, {0x00,0x48,0x30,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x021F, {0x00,0x48,0x30,0x00,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0220, {0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x0222, {0x00,0x00,0x10,0x48,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0223, {0x00,0x00,0x00,0x00,0x50,0x88,0x88,0x70,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0224, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x08,0x10}}, +{ 0x0225, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x08,0x10}}, +{ 0x0226, {0x00,0x00,0x20,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x0227, {0x00,0x00,0x00,0x20,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0228, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x10,0x60}}, +{ 0x0229, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x10,0x60}}, +{ 0x022A, {0x70,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x022B, {0x00,0x70,0x00,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x022C, {0x78,0x00,0x28,0x50,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x022D, {0x78,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x022E, {0x00,0x00,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x022F, {0x00,0x00,0x00,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0230, {0x70,0x00,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0231, {0x00,0x70,0x00,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0232, {0x00,0x70,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0233, {0x00,0x00,0x00,0x70,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x0250, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0xF0,0x80,0x70,0x00,0x00}}, +{ 0x0251, {0x00,0x00,0x00,0x00,0x00,0x68,0x98,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0252, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0xC8,0xB0,0x00,0x00}}, +{ 0x0253, {0x00,0x00,0x60,0x90,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0254, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0255, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0xB0,0xC8,0x70,0x80,0x00}}, +{ 0x0256, {0x00,0x00,0x10,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x14,0x08}}, +{ 0x0257, {0x00,0x08,0x14,0x10,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00,0x00}}, +{ 0x0258, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0259, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x025A, {0x00,0x00,0x00,0x00,0x00,0x60,0x98,0x34,0x50,0x90,0x60,0x00,0x00}}, +{ 0x025B, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x025C, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x30,0x08,0x88,0x70,0x00,0x00}}, +{ 0x025D, {0x00,0x00,0x00,0x00,0x00,0x60,0x98,0x24,0x10,0x90,0x60,0x00,0x00}}, +{ 0x025E, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xB0,0x88,0x88,0x70,0x00,0x00}}, +{ 0x025F, {0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x78,0x10,0x10,0x90,0x60}}, +{ 0x0260, {0x00,0x00,0x08,0x14,0x10,0x70,0x90,0x90,0x90,0x70,0x10,0x90,0x60}}, +{ 0x0261, {0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x0262, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0x0263, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x50,0x20}}, +{ 0x0264, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0x20,0x50,0x50,0x20,0x00,0x00}}, +{ 0x0265, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x08,0x08}}, +{ 0x0266, {0x00,0x00,0x60,0x90,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0267, {0x00,0x00,0x60,0x90,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x28,0x10}}, +{ 0x0268, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x70,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0269, {0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x026A, {0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x026B, {0x00,0x00,0x60,0x20,0x20,0x68,0xB0,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x026C, {0x00,0x00,0x60,0x20,0x20,0x60,0xA0,0x78,0x20,0x20,0x70,0x00,0x00}}, +{ 0x026D, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x10}}, +{ 0x026E, {0x00,0x00,0xC0,0x40,0x40,0x78,0x48,0x50,0x70,0x48,0xE8,0x08,0x30}}, +{ 0x026F, {0x00,0x00,0x00,0x00,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0x0270, {0x00,0x00,0x00,0x00,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x58,0x08,0x08}}, +{ 0x0271, {0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x28,0x10}}, +{ 0x0272, {0x00,0x00,0x00,0x00,0x00,0x50,0x68,0x48,0x48,0x48,0x48,0x40,0x80}}, +{ 0x0273, {0x00,0x00,0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x90,0x14,0x08}}, +{ 0x0274, {0x00,0x00,0x00,0x00,0x00,0x88,0xC8,0xA8,0xA8,0x98,0x88,0x00,0x00}}, +{ 0x0275, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0276, {0x00,0x00,0x00,0x00,0x00,0x78,0xA0,0xB0,0xA0,0xA0,0x78,0x00,0x00}}, +{ 0x0277, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0278, {0x00,0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x0279, {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x98,0x68,0x00,0x00}}, +{ 0x027A, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x98,0x68,0x00,0x00}}, +{ 0x027B, {0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xB0,0x50,0x14,0x08}}, +{ 0x027C, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x80,0x80}}, +{ 0x027D, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0xA0,0x40}}, +{ 0x027E, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x027F, {0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x0280, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0xF0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x0281, {0x00,0x00,0x00,0x00,0x00,0x88,0x90,0xA0,0xF0,0x88,0xF0,0x00,0x00}}, +{ 0x0282, {0x00,0x00,0x00,0x00,0x00,0x78,0x80,0x70,0x08,0x08,0xF0,0x80,0x40}}, +{ 0x0283, {0x00,0x00,0x10,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40}}, +{ 0x0284, {0x00,0x00,0x10,0x28,0x20,0x20,0x20,0x20,0x70,0x20,0x20,0xA0,0x40}}, +{ 0x0285, {0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0x20,0x20,0x20,0x20,0x28,0x10}}, +{ 0x0286, {0x00,0x00,0x10,0x28,0x20,0x20,0x20,0x20,0x20,0x60,0xB0,0xA8,0x40}}, +{ 0x0287, {0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x10,0x10,0x10,0x78,0x10,0x10}}, +{ 0x0288, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x40,0x48,0x30}}, +{ 0x0289, {0x00,0x00,0x00,0x00,0x00,0x48,0x48,0xFC,0x48,0x58,0x28,0x00,0x00}}, +{ 0x028A, {0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x028B, {0x00,0x00,0x00,0x00,0x00,0x90,0x88,0x88,0x88,0x90,0x60,0x00,0x00}}, +{ 0x028C, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x50,0x88,0x88,0x88,0x00,0x00}}, +{ 0x028D, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0xA8,0x88,0x88,0x00,0x00}}, +{ 0x028E, {0x00,0x00,0x08,0x10,0x10,0x20,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x028F, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0290, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x10,0x08}}, +{ 0x0291, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x50,0xA8,0xF0,0x40,0x00}}, +{ 0x0292, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x70,0x08,0x08,0x88,0x70}}, +{ 0x0293, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x70,0x08,0x68,0x98,0x78}}, +{ 0x0294, {0x00,0x00,0x30,0x48,0x08,0x08,0x30,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0295, {0x00,0x00,0x30,0x48,0x40,0x40,0x30,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x0296, {0x00,0x00,0x70,0x20,0x20,0x20,0x30,0x08,0x08,0x48,0x30,0x00,0x00}}, +{ 0x0297, {0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x88,0x70}}, +{ 0x0298, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x0299, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0xF0,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x029A, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x68,0x88,0x88,0x70,0x00,0x00}}, +{ 0x029B, {0x00,0x00,0x00,0x00,0x04,0x78,0x88,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0x029C, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x029D, {0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x70,0x98,0x68}}, +{ 0x029E, {0x00,0x00,0x00,0x00,0x00,0x88,0x48,0x28,0x18,0x28,0x48,0x08,0x08}}, +{ 0x029F, {0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00}}, +{ 0x02A0, {0x00,0x00,0x00,0x08,0x14,0x70,0x90,0x90,0x90,0x70,0x10,0x10,0x10}}, +{ 0x02A1, {0x00,0x00,0x30,0x48,0x08,0x08,0x30,0x20,0x70,0x20,0x70,0x00,0x00}}, +{ 0x02A2, {0x00,0x00,0x30,0x48,0x40,0x40,0x30,0x10,0x38,0x10,0x38,0x00,0x00}}, +{ 0x02A3, {0x00,0x00,0x20,0x20,0x20,0x78,0xA8,0xA8,0xB0,0xB0,0x78,0x00,0x00}}, +{ 0x02A4, {0x00,0x00,0x20,0x20,0x20,0x78,0xA8,0xA8,0xB0,0xB0,0x68,0x08,0x30}}, +{ 0x02A5, {0x00,0x00,0x20,0x20,0x20,0x78,0xA8,0xA8,0xBC,0xB4,0x78,0x10,0x20}}, +{ 0x02A6, {0x00,0x00,0x00,0x40,0x40,0xE0,0x58,0x60,0x50,0x48,0x30,0x00,0x00}}, +{ 0x02A7, {0x00,0x00,0x08,0x50,0x50,0xF8,0x50,0x50,0x50,0x50,0x30,0x50,0x20}}, +{ 0x02A8, {0x00,0x00,0x00,0x40,0x40,0xE0,0x58,0x60,0x68,0x74,0x38,0x20,0x40}}, +{ 0x02A9, {0x00,0x00,0x60,0x90,0x80,0x80,0xF0,0xA8,0xA8,0xA8,0xA8,0x08,0x30}}, +{ 0x02AA, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0xA0,0x90,0xC8,0xB0,0x00,0x00}}, +{ 0x02AB, {0x00,0x00,0x80,0x80,0x80,0xF8,0x88,0x90,0xA0,0xC0,0xF8,0x00,0x00}}, +{ 0x02AC, {0x00,0x00,0xA8,0xA8,0x50,0x50,0x00,0xA8,0xA8,0x50,0x50,0x00,0x00}}, +{ 0x02AD, {0x00,0x00,0x00,0x00,0x78,0x48,0x00,0x78,0x48,0x00,0x00,0x00,0x00}}, +{ 0x02B0, {0x00,0x00,0x40,0x50,0x68,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B1, {0x00,0x20,0x40,0x50,0x68,0x48,0x48,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B2, {0x00,0x10,0x00,0x10,0x10,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B3, {0x00,0x00,0x50,0x60,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B4, {0x00,0x00,0x10,0x10,0x10,0x30,0x50,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B5, {0x00,0x00,0x10,0x10,0x10,0x30,0x50,0x08,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B6, {0x00,0x00,0x50,0x50,0x60,0x50,0x60,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B7, {0x00,0x00,0x88,0xA8,0xA8,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B8, {0x00,0x00,0x50,0x50,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02B9, {0x00,0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02BA, {0x00,0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02BB, {0x00,0x00,0x10,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02BC, {0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02BD, {0x00,0x00,0x30,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02BE, {0x00,0x20,0x10,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02BF, {0x00,0x10,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C0, {0x00,0x20,0x50,0x10,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C1, {0x00,0x20,0x50,0x40,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C2, {0x00,0x10,0x20,0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C3, {0x00,0x40,0x20,0x10,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C4, {0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C5, {0x00,0x88,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C6, {0x00,0x30,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C7, {0x00,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C8, {0x00,0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02C9, {0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02CA, {0x00,0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02CB, {0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02CC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x00,0x00}}, +{ 0x02CD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70}}, +{ 0x02CE, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10}}, +{ 0x02CF, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40}}, +{ 0x02D0, {0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x00,0x00,0x20,0x70,0x00,0x00}}, +{ 0x02D1, {0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02D2, {0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x10,0x20,0x00,0x00,0x00,0x00}}, +{ 0x02D3, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00}}, +{ 0x02D4, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02D5, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x02D6, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x02D7, {0x00,0x00,0x00,0x00,0x00,0x88,0xF8,0x88,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02D8, {0x00,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02D9, {0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02DA, {0x00,0x20,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02DB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10}}, +{ 0x02DC, {0x00,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02DD, {0x00,0x48,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02DE, {0x00,0x00,0x00,0x00,0x00,0x40,0xC8,0x30,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02DF, {0x50,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02E0, {0x00,0x00,0x48,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02E1, {0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02E2, {0x00,0x00,0x30,0x40,0x20,0x10,0x60,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02E3, {0x00,0x00,0x48,0x30,0x30,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02E4, {0x00,0x00,0x30,0x48,0x40,0x40,0x30,0x10,0x38,0x00,0x00,0x00,0x00}}, +{ 0x02E5, {0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x02E6, {0x00,0x00,0x10,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x02E7, {0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x70,0x10,0x10,0x10,0x10,0x10}}, +{ 0x02E8, {0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x10,0x10}}, +{ 0x02E9, {0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70}}, +{ 0x02EA, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x70,0x00,0x00}}, +{ 0x02EB, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x70,0x40,0x40,0x00,0x00}}, +{ 0x02EC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20}}, +{ 0x02ED, {0x00,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x02EE, {0x00,0x00,0xD8,0x48,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0300, {0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0301, {0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0302, {0x00,0x30,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0303, {0x00,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0304, {0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0305, {0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0306, {0x00,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0307, {0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0308, {0x00,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0309, {0x20,0x50,0x10,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x030A, {0x20,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x030B, {0x00,0x48,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x030C, {0x00,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x030D, {0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x030E, {0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x030F, {0x00,0x90,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0310, {0x20,0x20,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0311, {0x00,0x70,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0312, {0x00,0x10,0x20,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0313, {0x00,0x30,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0314, {0x00,0x60,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0315, {0x00,0x0C,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0316, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10}}, +{ 0x0317, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20}}, +{ 0x0318, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x10}}, +{ 0x0319, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x30,0x20}}, +{ 0x031A, {0x00,0x1C,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x031B, {0x00,0x00,0x04,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x031C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x10}}, +{ 0x031D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x70}}, +{ 0x031E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20}}, +{ 0x031F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20}}, +{ 0x0320, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70}}, +{ 0x0321, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x28,0x10}}, +{ 0x0322, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04}}, +{ 0x0323, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20}}, +{ 0x0324, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50}}, +{ 0x0325, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20}}, +{ 0x0326, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20}}, +{ 0x0327, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20}}, +{ 0x0328, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10}}, +{ 0x0329, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20}}, +{ 0x032A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x48}}, +{ 0x032B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x50}}, +{ 0x032C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x30}}, +{ 0x032D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x48}}, +{ 0x032E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x70}}, +{ 0x032F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88}}, +{ 0x0330, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x50}}, +{ 0x0331, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8}}, +{ 0x0332, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC}}, +{ 0x0333, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0xFC}}, +{ 0x0334, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x50,0x00,0x00,0x00,0x00}}, +{ 0x0335, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0336, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0337, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x40,0x00,0x00,0x00,0x00}}, +{ 0x0338, {0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00,0x00}}, +{ 0x0339, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10,0x20}}, +{ 0x033A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x78}}, +{ 0x033B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x50,0x70}}, +{ 0x033C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xA8}}, +{ 0x033D, {0x50,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x033E, {0x10,0x20,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x033F, {0xFC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0340, {0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0341, {0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0342, {0x68,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0343, {0x00,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0344, {0x00,0x10,0x20,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0345, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20}}, +{ 0x0346, {0x00,0x70,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0347, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70}}, +{ 0x0348, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x50}}, +{ 0x0349, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x10}}, +{ 0x034A, {0x10,0x68,0xB0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x034B, {0x10,0x00,0x68,0xB0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x034C, {0x28,0x50,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x034D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xF8,0x50}}, +{ 0x034E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x70}}, +{ 0x034F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0360, {0x00,0x30,0x4C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0361, {0x00,0x38,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0362, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xFC,0x08}}, +{ 0x0363, {0x20,0x10,0x30,0x50,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0364, {0x20,0x50,0x70,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0365, {0x20,0x00,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0366, {0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0367, {0x50,0x50,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0368, {0x30,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0369, {0x10,0x30,0x50,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x036A, {0x40,0x60,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x036B, {0xD0,0xA8,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x036C, {0x50,0x60,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x036D, {0x20,0x70,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x036E, {0x50,0x50,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x036F, {0x50,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0374, {0x00,0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0375, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20}}, +{ 0x037A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x30}}, +{ 0x037E, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x30,0x20,0x40,0x00}}, +{ 0x0384, {0x00,0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0385, {0x00,0x10,0x20,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0386, {0x00,0x00,0x50,0xA8,0x28,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x0387, {0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0388, {0x00,0x00,0x78,0xA0,0x20,0x20,0x30,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x0389, {0x00,0x00,0x68,0xA8,0x28,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x038A, {0x00,0x00,0x78,0x90,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x038C, {0x00,0x00,0x50,0xA8,0x28,0x28,0x28,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x038E, {0x00,0x00,0x68,0xA8,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x038F, {0x00,0x00,0x50,0xA8,0x28,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x0390, {0x00,0x10,0x20,0xD8,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x0391, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0392, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0393, {0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0394, {0x00,0x00,0x20,0x20,0x50,0x50,0x50,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x0395, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0396, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x0397, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0398, {0x00,0x00,0x70,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0399, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x039A, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x039B, {0x00,0x00,0x20,0x20,0x50,0x50,0x50,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x039C, {0x00,0x00,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x039D, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x00,0x00}}, +{ 0x039E, {0x00,0x00,0xF8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xF8,0x00,0x00}}, +{ 0x039F, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03A0, {0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x03A1, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x03A3, {0x00,0x00,0xF8,0x80,0x40,0x20,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x03A4, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x03A5, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x03A6, {0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x03A7, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x03A8, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x03A9, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0xD8,0x00,0x00}}, +{ 0x03AA, {0x00,0xD8,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x03AB, {0x00,0xD8,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x03AC, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x03AD, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x03AE, {0x00,0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x03AF, {0x00,0x00,0x20,0x40,0x00,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x03B0, {0x00,0x10,0x20,0xD8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03B1, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x03B2, {0x00,0x00,0x60,0x90,0x90,0xF0,0x88,0x88,0x88,0xC8,0xB0,0x80,0x80}}, +{ 0x03B3, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x20}}, +{ 0x03B4, {0x00,0x00,0x70,0x88,0x40,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03B5, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x03B6, {0x00,0x00,0xF8,0x20,0x40,0x40,0x80,0x80,0x80,0x80,0x70,0x08,0x10}}, +{ 0x03B7, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x03B8, {0x00,0x00,0x60,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x03B9, {0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x03BA, {0x00,0x00,0x00,0x00,0x00,0x88,0x90,0xA0,0xE0,0x90,0x88,0x00,0x00}}, +{ 0x03BB, {0x00,0x00,0x70,0x88,0x08,0x68,0x98,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x03BC, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0xE8,0x80,0x80}}, +{ 0x03BD, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x03BE, {0x00,0x00,0xF8,0x20,0x40,0x40,0x30,0x40,0x80,0x80,0x70,0x08,0x10}}, +{ 0x03BF, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03C0, {0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x03C1, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xF0,0x80,0x80}}, +{ 0x03C2, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x70,0x08,0x30}}, +{ 0x03C3, {0x00,0x00,0x00,0x00,0x00,0x78,0x90,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03C4, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x10,0x00,0x00}}, +{ 0x03C5, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03C6, {0x00,0x00,0x00,0x00,0x00,0xB0,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x03C7, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x50,0x50,0x88}}, +{ 0x03C8, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x03C9, {0x00,0x00,0x00,0x00,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x03CA, {0x00,0x00,0x00,0xD8,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x03CB, {0x00,0x00,0x00,0xD8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03CC, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03CD, {0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03CE, {0x00,0x00,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x03D0, {0x00,0x00,0x60,0x90,0x90,0xB0,0xC8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03D1, {0x00,0x00,0x30,0x48,0x48,0x3C,0x08,0xC8,0x48,0x48,0x30,0x00,0x00}}, +{ 0x03D2, {0x00,0x00,0x88,0x54,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x03D3, {0x00,0x00,0x68,0x14,0x50,0x90,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x03D4, {0x00,0xD8,0x00,0x88,0x54,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x03D5, {0x00,0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x03D6, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x03D7, {0x00,0x00,0x40,0x20,0x00,0x88,0x48,0x50,0x70,0x50,0x88,0x08,0x30}}, +{ 0x03D8, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x20,0x20}}, +{ 0x03D9, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x20,0x20}}, +{ 0x03DA, {0x00,0x00,0x30,0x48,0x80,0x80,0x80,0x80,0x80,0x70,0x08,0x10,0x00}}, +{ 0x03DB, {0x00,0x00,0x00,0x00,0x08,0x70,0x80,0x80,0x80,0x80,0x70,0x08,0x30}}, +{ 0x03DC, {0x00,0x00,0xF8,0x80,0x80,0x80,0xE0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x03DD, {0x00,0x00,0x00,0x00,0x00,0xF0,0x80,0x80,0xE0,0x80,0x80,0x80,0x80}}, +{ 0x03DE, {0x00,0x00,0x80,0x80,0x88,0x98,0xA8,0xC8,0x88,0x08,0x08,0x00,0x00}}, +{ 0x03DF, {0x00,0x00,0x20,0x20,0x40,0x40,0x80,0xF8,0x08,0x10,0x10,0x20,0x20}}, +{ 0x03E0, {0x00,0x00,0x20,0x20,0x50,0x50,0x50,0x98,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x03E1, {0x00,0x00,0xC0,0x20,0x10,0x30,0x48,0x98,0x28,0x48,0x08,0x08,0x08}}, +{ 0x03E2, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x78,0x08,0xF0,0x00}}, +{ 0x03E3, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0x78,0x08,0xF0,0x00}}, +{ 0x03E4, {0x00,0x00,0x48,0xA8,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x00,0x00}}, +{ 0x03E5, {0x00,0x00,0x00,0x00,0x00,0x48,0xA8,0x88,0x78,0x08,0x08,0x00,0x00}}, +{ 0x03E6, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x08,0xF0,0x00}}, +{ 0x03E7, {0x00,0x00,0x20,0x20,0x20,0x70,0xA8,0xA8,0x48,0x08,0xF0,0x00,0x00}}, +{ 0x03E8, {0x00,0x00,0x70,0x88,0x48,0x10,0x20,0x40,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03E9, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x80,0x78,0x00,0x00}}, +{ 0x03EA, {0x00,0x00,0x50,0xA8,0x20,0x50,0x50,0x50,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x03EB, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0x20,0x50,0x88,0xF8,0x00,0x00}}, +{ 0x03EC, {0x00,0x00,0x08,0x70,0x80,0xB0,0xC8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03ED, {0x00,0x00,0x00,0x00,0x08,0x70,0x80,0xB0,0xC8,0x88,0x70,0x00,0x00}}, +{ 0x03EE, {0x00,0x00,0x70,0x20,0xF8,0xA8,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x03EF, {0x00,0x00,0x20,0x30,0x20,0xF8,0xA0,0x20,0x20,0x20,0x20,0x60,0x20}}, +{ 0x03F0, {0x00,0x00,0x00,0x00,0x00,0x88,0x48,0x50,0x70,0x50,0x88,0x00,0x00}}, +{ 0x03F1, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xF0,0x80,0x78}}, +{ 0x03F2, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x03F3, {0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60}}, +{ 0x03F4, {0x00,0x00,0x70,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x03F5, {0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x70,0x40,0x40,0x38,0x00,0x00}}, +{ 0x03F6, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x38,0x08,0x08,0x70,0x00,0x00}}, +{ 0x0400, {0x00,0x40,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0401, {0x00,0x50,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0402, {0x00,0x00,0xF8,0x20,0x20,0x30,0x28,0x28,0x28,0x28,0x28,0x08,0x10}}, +{ 0x0403, {0x00,0x20,0x40,0x00,0xF8,0x88,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0404, {0x00,0x00,0x38,0x40,0x80,0x80,0xF0,0x80,0x80,0x40,0x38,0x00,0x00}}, +{ 0x0405, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0406, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0407, {0x00,0x50,0x50,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x0408, {0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00}}, +{ 0x0409, {0x00,0x00,0x60,0xA0,0xA0,0xA0,0xB0,0xA8,0xA8,0xA8,0xB0,0x00,0x00}}, +{ 0x040A, {0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xF0,0xA8,0xA8,0xA8,0xB0,0x00,0x00}}, +{ 0x040B, {0x00,0x00,0xF8,0x20,0x20,0x30,0x28,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x040C, {0x10,0x20,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x040D, {0x00,0x40,0x20,0x00,0x88,0x98,0x98,0xA8,0xC8,0xC8,0x88,0x00,0x00}}, +{ 0x040E, {0x00,0x88,0x70,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x70,0x00,0x00}}, +{ 0x040F, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x20,0x20}}, +{ 0x0410, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0411, {0x00,0x00,0xF0,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0412, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0413, {0x00,0x00,0xF8,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0414, {0x00,0x00,0x30,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0xF8,0x88,0x00}}, +{ 0x0415, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x0416, {0x00,0x00,0xA8,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x0417, {0x00,0x00,0x70,0x88,0x08,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0418, {0x00,0x00,0x88,0x88,0x98,0x98,0xA8,0xA8,0xC8,0xC8,0x88,0x00,0x00}}, +{ 0x0419, {0x00,0x88,0x70,0x00,0x88,0x98,0x98,0xA8,0xC8,0xC8,0x88,0x00,0x00}}, +{ 0x041A, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x041B, {0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x48,0x88,0x88,0x00,0x00}}, +{ 0x041C, {0x00,0x00,0x88,0xD8,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x041D, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x041E, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x041F, {0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0420, {0x00,0x00,0xF0,0x88,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0421, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0422, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0423, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x78,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0424, {0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x0425, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x0426, {0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08}}, +{ 0x0427, {0x00,0x00,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x0428, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x00,0x00}}, +{ 0x0429, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}}, +{ 0x042A, {0x00,0x00,0xC0,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x042B, {0x00,0x00,0x88,0x88,0x88,0xE8,0x98,0x98,0x98,0x98,0xE8,0x00,0x00}}, +{ 0x042C, {0x00,0x00,0x80,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x042D, {0x00,0x00,0xE0,0x10,0x08,0x08,0x78,0x08,0x08,0x10,0xE0,0x00,0x00}}, +{ 0x042E, {0x00,0x00,0x90,0xA8,0xA8,0xA8,0xE8,0xA8,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x042F, {0x00,0x00,0x78,0x88,0x88,0x88,0x78,0x28,0x48,0x88,0x88,0x00,0x00}}, +{ 0x0430, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0431, {0x00,0x00,0x08,0x70,0x80,0xF0,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0432, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0xF0,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x0433, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0434, {0x00,0x00,0x00,0x00,0x00,0x30,0x50,0x50,0x50,0x50,0xF8,0x88,0x00}}, +{ 0x0435, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0436, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x0437, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x30,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0438, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x00,0x00}}, +{ 0x0439, {0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x00,0x00}}, +{ 0x043A, {0x00,0x00,0x00,0x00,0x00,0x88,0x90,0xE0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x043B, {0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x88,0x00,0x00}}, +{ 0x043C, {0x00,0x00,0x00,0x00,0x00,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x00,0x00}}, +{ 0x043D, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x043E, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x043F, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0440, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80}}, +{ 0x0441, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0442, {0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0443, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x0444, {0x00,0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x0445, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00}}, +{ 0x0446, {0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x90,0xF8,0x08,0x08}}, +{ 0x0447, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x00,0x00}}, +{ 0x0448, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x00,0x00}}, +{ 0x0449, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}}, +{ 0x044A, {0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x70,0x48,0x48,0x70,0x00,0x00}}, +{ 0x044B, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xE8,0x98,0x98,0xE8,0x00,0x00}}, +{ 0x044C, {0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x044D, {0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0x38,0x08,0x08,0xF0,0x00,0x00}}, +{ 0x044E, {0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0xA8,0xE8,0xA8,0x90,0x00,0x00}}, +{ 0x044F, {0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x78,0x48,0x88,0x00,0x00}}, +{ 0x0450, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0451, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x0452, {0x00,0x00,0x40,0xE0,0x40,0x50,0x68,0x48,0x48,0x48,0x48,0x08,0x10}}, +{ 0x0453, {0x00,0x00,0x20,0x40,0x00,0xF8,0x88,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0454, {0x00,0x00,0x00,0x00,0x00,0x78,0x80,0xE0,0x80,0x80,0x78,0x00,0x00}}, +{ 0x0455, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x0456, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x0457, {0x00,0x00,0x50,0x50,0x00,0x60,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x0458, {0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60}}, +{ 0x0459, {0x00,0x00,0x00,0x00,0x00,0x60,0xA0,0xB0,0xA8,0xA8,0xB0,0x00,0x00}}, +{ 0x045A, {0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0xF0,0xA8,0xA8,0xB0,0x00,0x00}}, +{ 0x045B, {0x00,0x00,0x40,0xE0,0x40,0x50,0x68,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0x045C, {0x00,0x00,0x20,0x40,0x00,0x88,0x90,0xE0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x045D, {0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x00,0x00}}, +{ 0x045E, {0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x045F, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0xF8,0x20,0x20}}, +{ 0x0460, {0x00,0x00,0x50,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0461, {0x00,0x00,0x00,0x00,0x00,0x50,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0462, {0x00,0x00,0x40,0xF0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x0463, {0x00,0x00,0x00,0x40,0x40,0xE0,0x40,0x70,0x48,0x48,0x70,0x00,0x00}}, +{ 0x0464, {0x00,0x00,0x98,0xA0,0xA0,0xA0,0xF8,0xA0,0xA0,0xA0,0x98,0x00,0x00}}, +{ 0x0465, {0x00,0x00,0x00,0x00,0x00,0x98,0xA0,0xF8,0xA0,0xA0,0x98,0x00,0x00}}, +{ 0x0466, {0x00,0x00,0x20,0x20,0x50,0x50,0x50,0x88,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x0467, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x50,0x88,0xA8,0xA8,0x00,0x00}}, +{ 0x0468, {0x00,0x00,0x90,0x90,0x90,0xB8,0xF8,0xB8,0xB8,0xB8,0xB8,0x00,0x00}}, +{ 0x0469, {0x00,0x00,0x00,0x00,0x00,0x90,0x90,0xF8,0xB8,0xB8,0xB8,0x00,0x00}}, +{ 0x046A, {0x00,0x00,0xF8,0x88,0x50,0x50,0x70,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x046B, {0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x046C, {0x00,0x00,0xB8,0xA8,0xA8,0xA8,0xF0,0xB8,0xD4,0xD4,0xD4,0x00,0x00}}, +{ 0x046D, {0x00,0x00,0x00,0x00,0x00,0xB8,0xA8,0x90,0xF8,0xB8,0xB8,0x00,0x00}}, +{ 0x046E, {0x00,0x48,0x30,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x70,0x80,0x70}}, +{ 0x046F, {0x00,0x00,0x48,0x30,0x00,0x70,0x88,0x30,0x08,0x08,0x70,0x80,0x70}}, +{ 0x0470, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0471, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x0472, {0x00,0x00,0x70,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0473, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0474, {0x00,0x00,0x98,0x90,0x90,0x90,0x50,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x0475, {0x00,0x00,0x00,0x00,0x00,0x98,0x90,0x90,0x50,0x50,0x20,0x00,0x00}}, +{ 0x0476, {0x00,0x90,0x48,0x00,0x9C,0x90,0x90,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x0477, {0x00,0x00,0x90,0x48,0x00,0x98,0x90,0x90,0x50,0x50,0x20,0x00,0x00}}, +{ 0x0478, {0x00,0x00,0x40,0xA0,0xA0,0xB8,0xB8,0xB8,0xB8,0xB8,0x58,0x08,0x10}}, +{ 0x0479, {0x00,0x00,0x00,0x00,0x00,0x58,0xB8,0xB8,0xB8,0xB8,0x58,0x08,0x10}}, +{ 0x047A, {0x00,0x20,0x70,0xA8,0x88,0x88,0x88,0x88,0x88,0xA8,0x70,0x20,0x00}}, +{ 0x047B, {0x00,0x00,0x00,0x00,0x20,0x70,0xA8,0x88,0x88,0xA8,0x70,0x20,0x00}}, +{ 0x047C, {0x60,0x98,0x60,0x00,0x50,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x047D, {0x00,0x60,0x98,0x60,0x00,0x50,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x047E, {0x00,0xF8,0xA8,0x00,0x50,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x047F, {0x00,0x00,0xF8,0xA8,0x00,0x50,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0480, {0x00,0x00,0x70,0x88,0x88,0x80,0x80,0x80,0x80,0x80,0x70,0x10,0x10}}, +{ 0x0481, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x10,0x10,0x00}}, +{ 0x0482, {0x00,0x00,0x00,0x28,0x10,0xB0,0x48,0x40,0xA0,0x00,0x00,0x00,0x00}}, +{ 0x0483, {0x04,0xFC,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0484, {0x00,0x70,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0485, {0x00,0x70,0xC8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0486, {0x00,0x70,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0488, {0x40,0xA0,0x08,0x14,0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0x08,0x14}}, +{ 0x0489, {0x40,0x84,0xC8,0x0C,0x00,0x00,0x00,0x00,0x00,0x40,0x84,0xC8,0x0C}}, +{ 0x048A, {0x00,0x88,0x70,0x00,0x88,0x98,0x98,0xA8,0xC8,0xC8,0x88,0x10,0x10}}, +{ 0x048B, {0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x10,0x10}}, +{ 0x048C, {0x00,0x00,0x40,0x40,0xE0,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x048D, {0x00,0x00,0x00,0x00,0x40,0xE0,0x40,0x70,0x48,0x48,0x70,0x00,0x00}}, +{ 0x048E, {0x00,0x00,0xF0,0x88,0x88,0x88,0xA8,0xF0,0x88,0x80,0x80,0x00,0x00}}, +{ 0x048F, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x88,0xA8,0xF0,0x88,0x80,0x80}}, +{ 0x0490, {0x00,0x08,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0491, {0x00,0x00,0x00,0x00,0x08,0xF8,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0492, {0x00,0x00,0x78,0x48,0x40,0x40,0xE0,0x40,0x40,0x40,0x40,0x00,0x00}}, +{ 0x0493, {0x00,0x00,0x00,0x00,0x00,0x78,0x48,0xE0,0x40,0x40,0x40,0x00,0x00}}, +{ 0x0494, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x10,0x00}}, +{ 0x0495, {0x00,0x00,0x00,0x00,0x00,0xF8,0x80,0xF0,0x88,0x88,0x88,0x10,0x00}}, +{ 0x0496, {0x00,0x00,0xA8,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0xAC,0x04,0x04}}, +{ 0x0497, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x70,0xA8,0xAC,0x04,0x04}}, +{ 0x0498, {0x00,0x00,0x70,0x88,0x08,0x08,0x30,0x08,0x08,0x88,0x70,0x20,0x40}}, +{ 0x0499, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x30,0x08,0x88,0x70,0x20,0x40}}, +{ 0x049A, {0x00,0x00,0x90,0x90,0xA0,0xA0,0xC0,0xA0,0x90,0x90,0x98,0x08,0x08}}, +{ 0x049B, {0x00,0x00,0x00,0x00,0x00,0x90,0xA0,0xC0,0xA0,0x90,0x98,0x08,0x08}}, +{ 0x049C, {0x00,0x00,0x88,0xA8,0xB0,0xA0,0xE0,0xA0,0xB0,0xA8,0x88,0x00,0x00}}, +{ 0x049D, {0x00,0x00,0x00,0x00,0x00,0xA8,0xB0,0xE0,0xB0,0xA8,0x88,0x00,0x00}}, +{ 0x049E, {0x00,0x00,0x48,0xE8,0x50,0x60,0x60,0x60,0x50,0x48,0x48,0x00,0x00}}, +{ 0x049F, {0x00,0x00,0x40,0x40,0xE0,0x48,0x50,0x60,0x50,0x48,0x48,0x00,0x00}}, +{ 0x04A0, {0x00,0x00,0xC8,0x48,0x50,0x60,0x60,0x60,0x50,0x48,0x48,0x00,0x00}}, +{ 0x04A1, {0x00,0x00,0x00,0x00,0x00,0xC8,0x50,0x60,0x50,0x48,0x48,0x00,0x00}}, +{ 0x04A2, {0x00,0x00,0x90,0x90,0x90,0x90,0xF0,0x90,0x90,0x90,0x98,0x08,0x08}}, +{ 0x04A3, {0x00,0x00,0x00,0x00,0x00,0x90,0x90,0xF0,0x90,0x90,0x98,0x08,0x08}}, +{ 0x04A4, {0x00,0x00,0xB8,0xA0,0xA0,0xA0,0xE0,0xA0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x04A5, {0x00,0x00,0x00,0x00,0x00,0xB8,0xA0,0xE0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x04A6, {0x00,0x00,0xE0,0xA0,0xA0,0xA0,0xB0,0xA8,0xA8,0xA8,0xA8,0x08,0x10}}, +{ 0x04A7, {0x00,0x00,0x00,0x00,0x00,0xE0,0xA0,0xB0,0xA8,0xA8,0xA8,0x08,0x10}}, +{ 0x04A8, {0x00,0x00,0x70,0x88,0x80,0x90,0xA8,0xA8,0xA8,0x70,0x20,0x18,0x00}}, +{ 0x04A9, {0x00,0x00,0x00,0x00,0x00,0x70,0x80,0x90,0xA8,0x70,0x20,0x18,0x00}}, +{ 0x04AA, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x20,0x10}}, +{ 0x04AB, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x20,0x10}}, +{ 0x04AC, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x10,0x10}}, +{ 0x04AD, {0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x30,0x10,0x10}}, +{ 0x04AE, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x04AF, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20}}, +{ 0x04B0, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0xF8,0x20,0x20,0x20,0x00,0x00}}, +{ 0x04B1, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0xF8,0x20,0x20}}, +{ 0x04B2, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x8C,0x04,0x04}}, +{ 0x04B3, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x8C,0x04,0x04}}, +{ 0x04B4, {0x00,0x00,0xE8,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x78,0x08,0x08}}, +{ 0x04B5, {0x00,0x00,0x00,0x00,0x00,0xE8,0x48,0x48,0x48,0x48,0x78,0x08,0x08}}, +{ 0x04B6, {0x00,0x00,0x90,0x90,0x90,0x90,0x90,0x70,0x10,0x10,0x18,0x08,0x08}}, +{ 0x04B7, {0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x70,0x10,0x18,0x08,0x08}}, +{ 0x04B8, {0x00,0x00,0x88,0x88,0x88,0xA8,0xA8,0x78,0x28,0x28,0x08,0x00,0x00}}, +{ 0x04B9, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xA8,0x78,0x28,0x08,0x00,0x00}}, +{ 0x04BA, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x04BB, {0x00,0x00,0x80,0x80,0x80,0x80,0xE0,0x90,0x90,0x90,0x90,0x00,0x00}}, +{ 0x04BC, {0x00,0x00,0x30,0x48,0x48,0x48,0xF8,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x04BD, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0xF8,0x40,0x48,0x30,0x00,0x00}}, +{ 0x04BE, {0x00,0x00,0x30,0x48,0x48,0x48,0xF8,0x40,0x40,0x48,0x30,0x20,0x10}}, +{ 0x04BF, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0xF8,0x40,0x48,0x30,0x20,0x10}}, +{ 0x04C0, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x04C1, {0x88,0x70,0x00,0xA8,0xA8,0xA8,0x70,0x70,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x04C2, {0x00,0x00,0x88,0x70,0x00,0xA8,0xA8,0x70,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x04C3, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x08,0x30}}, +{ 0x04C4, {0x00,0x00,0x00,0x00,0x00,0x88,0x90,0xE0,0x90,0x88,0x88,0x08,0x30}}, +{ 0x04C5, {0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x48,0x48,0x88,0x88,0x10,0x10}}, +{ 0x04C6, {0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x48,0x88,0x10,0x10}}, +{ 0x04C7, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x08,0x30}}, +{ 0x04C8, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x88,0x08,0x30}}, +{ 0x04C9, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x10,0x10}}, +{ 0x04CA, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xF8,0x88,0x88,0x88,0x10,0x10}}, +{ 0x04CB, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x18,0x10,0x10}}, +{ 0x04CC, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x18,0x10,0x10}}, +{ 0x04CD, {0x00,0x00,0x88,0xD8,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x10,0x10}}, +{ 0x04CE, {0x00,0x00,0x00,0x00,0x00,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x10,0x10}}, +{ 0x04D0, {0x00,0x88,0x70,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x04D1, {0x00,0x00,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x04D2, {0x00,0x50,0x50,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x04D3, {0x00,0x00,0x50,0x50,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x04D4, {0x00,0x00,0x58,0xA0,0xA0,0xA0,0xB0,0xE0,0xA0,0xA0,0xB8,0x00,0x00}}, +{ 0x04D5, {0x00,0x00,0x00,0x00,0x00,0x70,0x28,0x70,0xA0,0xA8,0x50,0x00,0x00}}, +{ 0x04D6, {0x00,0x88,0x70,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x04D7, {0x00,0x00,0x88,0x70,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x04D8, {0x00,0x00,0x70,0x88,0x08,0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x04D9, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x04DA, {0x00,0x50,0x50,0x00,0x70,0x88,0x08,0xF8,0x88,0x88,0x70,0x00,0x00}}, +{ 0x04DB, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0x08,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x04DC, {0x00,0x50,0x50,0x00,0xA8,0xA8,0x70,0x20,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x04DD, {0x00,0x00,0x50,0x50,0x00,0xA8,0xA8,0x70,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x04DE, {0x00,0x50,0x50,0x00,0x70,0x88,0x08,0x30,0x08,0x88,0x70,0x00,0x00}}, +{ 0x04DF, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0x30,0x08,0x88,0x70,0x00,0x00}}, +{ 0x04E0, {0x00,0x00,0xF8,0x08,0x10,0x20,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x04E1, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x70,0x08,0x08,0x88,0x70}}, +{ 0x04E2, {0x00,0x00,0xF8,0x00,0x88,0x98,0x98,0xA8,0xC8,0xC8,0x88,0x00,0x00}}, +{ 0x04E3, {0x00,0x00,0x00,0xF8,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x00,0x00}}, +{ 0x04E4, {0x00,0x50,0x50,0x00,0x88,0x98,0x98,0xA8,0xC8,0xC8,0x88,0x00,0x00}}, +{ 0x04E5, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x98,0xA8,0xC8,0x88,0x00,0x00}}, +{ 0x04E6, {0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x04E7, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x04E8, {0x00,0x00,0x70,0x88,0x88,0xE8,0xB8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x04E9, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xE8,0xB8,0x88,0x70,0x00,0x00}}, +{ 0x04EA, {0x00,0x50,0x50,0x00,0x70,0x88,0xE8,0xB8,0x88,0x88,0x70,0x00,0x00}}, +{ 0x04EB, {0x00,0x00,0x50,0x50,0x00,0x70,0x88,0xE8,0xB8,0x88,0x70,0x00,0x00}}, +{ 0x04EC, {0x00,0x50,0x50,0x00,0xE0,0x10,0x08,0x78,0x08,0x10,0xE0,0x00,0x00}}, +{ 0x04ED, {0x00,0x00,0x50,0x50,0x00,0xF0,0x08,0x38,0x08,0x08,0xF0,0x00,0x00}}, +{ 0x04EE, {0x00,0x00,0xF8,0x00,0x88,0x88,0x98,0x68,0x08,0x88,0x70,0x00,0x00}}, +{ 0x04EF, {0x00,0x00,0x00,0xF8,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x04F0, {0x00,0x50,0x50,0x00,0x88,0x88,0x98,0x68,0x08,0x88,0x70,0x00,0x00}}, +{ 0x04F1, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x04F2, {0x00,0x48,0x90,0x00,0x88,0x88,0x98,0x68,0x08,0x88,0x70,0x00,0x00}}, +{ 0x04F3, {0x00,0x00,0x48,0x90,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x04F4, {0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x08,0x00,0x00}}, +{ 0x04F5, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0x88,0x78,0x08,0x08,0x00,0x00}}, +{ 0x04F8, {0x00,0x50,0x50,0x00,0x88,0x88,0xE8,0x98,0x98,0x98,0xE8,0x00,0x00}}, +{ 0x04F9, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0xE8,0x98,0x98,0xE8,0x00,0x00}}, +{ 0x0500, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x0501, {0x00,0x00,0x08,0x08,0x08,0x38,0x48,0x48,0x48,0x48,0x38,0x00,0x00}}, +{ 0x0502, {0x00,0x00,0x20,0x20,0x20,0x60,0xA0,0xA8,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x0503, {0x00,0x00,0x20,0x20,0x20,0x20,0x60,0xA0,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x0504, {0x00,0x00,0x40,0xA0,0x20,0x20,0x20,0x48,0x28,0x28,0x10,0x00,0x00}}, +{ 0x0505, {0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x20,0x48,0x28,0x10,0x00,0x00}}, +{ 0x0506, {0x00,0x00,0x60,0x90,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x08,0x08}}, +{ 0x0507, {0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x10,0x60,0x10,0x10,0x08,0x08}}, +{ 0x0508, {0x00,0x00,0x60,0xA0,0xA0,0xA0,0xA0,0xA8,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x0509, {0x00,0x00,0x00,0x00,0x00,0x60,0xA0,0xA0,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x050A, {0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xE0,0xA8,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x050B, {0x00,0x00,0x00,0x00,0x00,0xA0,0xA0,0xE0,0xA8,0xA8,0x90,0x00,0x00}}, +{ 0x050C, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0x050D, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0x050E, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x050F, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x28,0x28,0x10,0x00,0x00}}, +{ 0x0531, {0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xB0,0x48,0x00,0x00}}, +{ 0x0532, {0x00,0x00,0x70,0x88,0x88,0x80,0xF0,0x88,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0533, {0x00,0x00,0x40,0xA0,0xA0,0xA0,0x70,0x28,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0534, {0x00,0x00,0x40,0xA0,0xA0,0x20,0x30,0x28,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0535, {0x00,0x00,0x80,0x80,0xF0,0x88,0x80,0x80,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0536, {0x00,0x00,0x60,0x90,0x90,0x90,0x70,0x10,0xA0,0xF0,0x88,0x00,0x00}}, +{ 0x0537, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x80,0x80,0x80,0x70,0x08,0x10}}, +{ 0x0538, {0x00,0x00,0x60,0x90,0x90,0x80,0x80,0x80,0x80,0x80,0xF0,0x08,0x00}}, +{ 0x0539, {0x00,0x00,0x60,0x90,0x90,0xB8,0xD0,0xD0,0xA0,0x80,0x80,0x00,0x00}}, +{ 0x053A, {0x00,0x00,0x10,0x10,0x10,0x10,0x78,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x053B, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x80,0x80,0x80,0x00,0x00}}, +{ 0x053C, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x70,0x08,0x10}}, +{ 0x053D, {0x00,0x00,0x80,0x80,0xE8,0xA8,0xA8,0x90,0x80,0x80,0x80,0x00,0x00}}, +{ 0x053E, {0x00,0x00,0xF8,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x053F, {0x00,0x00,0x80,0x80,0x88,0x88,0x88,0x88,0x78,0x08,0x08,0x00,0x00}}, +{ 0x0540, {0x00,0x00,0x10,0x20,0x10,0x20,0x40,0x80,0xC0,0x30,0x08,0x00,0x00}}, +{ 0x0541, {0x00,0x00,0x30,0x48,0x48,0x48,0x38,0x08,0x70,0x90,0x68,0x00,0x00}}, +{ 0x0542, {0x00,0x00,0x40,0xA0,0xA0,0x20,0x20,0x20,0x20,0x20,0x30,0x08,0x00}}, +{ 0x0543, {0x00,0x00,0x20,0x10,0x10,0xE0,0x50,0x50,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x0544, {0x00,0x00,0xB8,0xA8,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0x40,0x00,0x00}}, +{ 0x0545, {0x00,0x00,0x70,0x88,0x88,0x28,0x30,0x28,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0546, {0x00,0x00,0x40,0x80,0xC0,0x40,0x40,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x0547, {0x00,0x00,0x08,0xF0,0x40,0x80,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0548, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0549, {0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x10,0x10,0x20,0xF8,0x00,0x00}}, +{ 0x054A, {0x00,0x00,0x70,0xA8,0xA8,0xA8,0x28,0x28,0x08,0x08,0x08,0x00,0x00}}, +{ 0x054B, {0x00,0x00,0x60,0x90,0x90,0x90,0x50,0x30,0xA0,0xF0,0x88,0x00,0x00}}, +{ 0x054C, {0x00,0x00,0x40,0xA0,0xA0,0xB0,0xA8,0xA8,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x054D, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x054E, {0x00,0x00,0x20,0x20,0xA0,0xA0,0xA0,0xA0,0x60,0x20,0x30,0x08,0x00}}, +{ 0x054F, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0550, {0x00,0x00,0x70,0x88,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x0551, {0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x0552, {0x00,0x00,0x80,0x80,0x80,0xE0,0x90,0x90,0x88,0x80,0x80,0x00,0x00}}, +{ 0x0553, {0x00,0x00,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x00,0x00,0x00}}, +{ 0x0554, {0x00,0x00,0x10,0x28,0x28,0x30,0xA0,0x70,0x28,0x20,0x20,0x00,0x00}}, +{ 0x0555, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0556, {0x00,0x00,0x40,0xA0,0xA0,0x70,0x28,0x28,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x0559, {0x00,0x20,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x055A, {0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x055B, {0x00,0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x055C, {0x00,0x08,0x70,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x055D, {0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x055E, {0x00,0x00,0x70,0x88,0xA8,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x055F, {0x00,0x00,0xC0,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0561, {0x00,0x00,0x00,0x00,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0x0562, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x88,0x88,0x80,0xF8,0x80,0x80}}, +{ 0x0563, {0x00,0x00,0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x78,0x10,0x10}}, +{ 0x0564, {0x00,0x00,0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x98,0x10,0x10}}, +{ 0x0565, {0x00,0x00,0x80,0x80,0x80,0xF8,0x80,0x88,0x88,0xC8,0xB0,0x00,0x00}}, +{ 0x0566, {0x00,0x00,0x00,0x00,0x00,0x70,0x90,0x90,0x90,0x90,0x70,0x10,0x18}}, +{ 0x0567, {0x00,0x00,0x80,0x80,0xF8,0x80,0x80,0x80,0x80,0x80,0x70,0x08,0x00}}, +{ 0x0568, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x80,0xF8}}, +{ 0x0569, {0x00,0x00,0x00,0x00,0x00,0xA0,0xD0,0x90,0xB8,0xD0,0xA0,0x80,0x80}}, +{ 0x056A, {0x00,0x00,0x10,0x10,0x10,0x78,0x90,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x056B, {0x00,0x00,0x80,0x80,0x80,0xA0,0xD0,0x90,0x90,0x90,0x90,0x80,0x80}}, +{ 0x056C, {0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x40,0x40,0x40,0x40,0x30}}, +{ 0x056D, {0x00,0x00,0x80,0x80,0x80,0xE8,0xA8,0xA8,0xA8,0xA8,0x90,0x80,0x80}}, +{ 0x056E, {0x00,0x00,0x00,0x80,0x40,0x20,0x78,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x056F, {0x00,0x00,0x80,0x80,0x80,0x80,0x88,0x88,0x88,0x88,0x78,0x08,0x08}}, +{ 0x0570, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0571, {0x00,0x00,0x20,0x40,0x20,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x0572, {0x00,0x00,0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x90,0x10,0x18}}, +{ 0x0573, {0x00,0x00,0x30,0x48,0x40,0xF8,0x48,0x48,0x48,0x58,0x28,0x00,0x00}}, +{ 0x0574, {0x00,0x00,0x08,0x10,0x10,0x90,0x90,0x90,0x90,0xB0,0x50,0x00,0x00}}, +{ 0x0575, {0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x88,0x88,0x70}}, +{ 0x0576, {0x00,0x00,0x70,0x88,0x80,0x98,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x0577, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x08,0x08,0x10,0x20,0x40,0x38}}, +{ 0x0578, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x0579, {0x00,0x00,0x20,0x40,0x20,0x20,0x40,0x40,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x057A, {0x00,0x00,0x00,0x00,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x58,0x08,0x08}}, +{ 0x057B, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x50,0x20,0x40,0x38}}, +{ 0x057C, {0x00,0x00,0x00,0x00,0x00,0xA0,0xD0,0x90,0x90,0x90,0x98,0x00,0x00}}, +{ 0x057D, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x057E, {0x00,0x00,0x10,0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x70,0x10,0x18}}, +{ 0x057F, {0x00,0x00,0x00,0x00,0x00,0xB0,0xA8,0xA8,0xA8,0xA8,0x68,0x00,0x00}}, +{ 0x0580, {0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x88,0x80,0x80}}, +{ 0x0581, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x0582, {0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x18,0x00,0x00}}, +{ 0x0583, {0x00,0x00,0x20,0x20,0x20,0xB0,0xA8,0xA8,0xA8,0xA8,0x68,0x20,0x20}}, +{ 0x0584, {0x00,0x00,0x18,0x20,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x0585, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0586, {0x00,0x00,0x60,0xA0,0xA0,0x70,0x28,0xA8,0xA8,0xA8,0x70,0x20,0x20}}, +{ 0x0587, {0x00,0x00,0x80,0x80,0x80,0x90,0x90,0x90,0x90,0x90,0x68,0x00,0x00}}, +{ 0x0589, {0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x00,0x00,0x00,0x00}}, +{ 0x058A, {0x00,0x00,0x00,0x00,0x00,0x40,0x38,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0591, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x50}}, +{ 0x0592, {0x00,0x00,0x20,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0593, {0x10,0x20,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0594, {0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0595, {0x00,0x50,0x40,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0596, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x10}}, +{ 0x0597, {0x00,0x20,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0598, {0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0599, {0x00,0x80,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x059A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08,0x04}}, +{ 0x059C, {0x00,0x18,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x059D, {0x00,0x04,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x059E, {0x10,0x24,0x28,0x28,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x059F, {0x00,0x50,0xA8,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05A0, {0x00,0x10,0x28,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05A1, {0x00,0x50,0xD0,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05A3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x70}}, +{ 0x05A4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x20}}, +{ 0x05A5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20}}, +{ 0x05A6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x90}}, +{ 0x05A8, {0x00,0x40,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05A9, {0x00,0x40,0xA0,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05AA, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x20}}, +{ 0x05AB, {0x00,0x20,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05AC, {0x00,0x10,0x10,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05AD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04}}, +{ 0x05AF, {0x00,0x20,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05B0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20}}, +{ 0x05B1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x00,0x48}}, +{ 0x05B2, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xE0,0x08}}, +{ 0x05B3, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xE0,0x48}}, +{ 0x05B4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20}}, +{ 0x05B5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50}}, +{ 0x05B6, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x20}}, +{ 0x05B7, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70}}, +{ 0x05B8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20}}, +{ 0x05B9, {0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05BB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x08}}, +{ 0x05BC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05BD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20}}, +{ 0x05BE, {0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05BF, {0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05C0, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x05C1, {0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05C2, {0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05C3, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00}}, +{ 0x05C4, {0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05D0, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x00}}, +{ 0x05D1, {0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xF8,0x00,0x00}}, +{ 0x05D2, {0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x28,0x48,0x00,0x00}}, +{ 0x05D3, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x05D4, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x88,0x88,0x88,0x00,0x00}}, +{ 0x05D5, {0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x05D6, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x10,0x10,0x10,0x00,0x00}}, +{ 0x05D7, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0x05D8, {0x00,0x00,0x00,0x00,0x00,0x98,0xA8,0xA8,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x05D9, {0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x10,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05DA, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x08}}, +{ 0x05DB, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x00}}, +{ 0x05DC, {0x00,0x00,0x80,0x80,0x80,0xF8,0x08,0x08,0x08,0x10,0x60,0x00,0x00}}, +{ 0x05DD, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0x78,0x00,0x00}}, +{ 0x05DE, {0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0x48,0x88,0x88,0xB8,0x00,0x00}}, +{ 0x05DF, {0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x05E0, {0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x08,0x08,0x08,0x78,0x00,0x00}}, +{ 0x05E1, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x50,0x60,0x00,0x00}}, +{ 0x05E2, {0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x05E3, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x08,0x08,0x08,0x08}}, +{ 0x05E4, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x08,0x08,0xF0,0x00,0x00}}, +{ 0x05E5, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x48,0x50,0x60,0x40,0x40,0x40}}, +{ 0x05E6, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x28,0x10,0x08,0xF8,0x00,0x00}}, +{ 0x05E7, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x88,0x88,0x88,0xB0,0x80,0x80}}, +{ 0x05E8, {0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x05E9, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0x05EA, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xC8,0x00,0x00}}, +{ 0x05F0, {0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0x05F1, {0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x08,0x08,0x08,0x00,0x00}}, +{ 0x05F2, {0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05F3, {0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x05F4, {0x00,0x00,0x00,0x00,0x00,0x48,0x90,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E01, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xC8,0x48,0x48,0x48,0x00,0x00}}, +{ 0x0E02, {0x00,0x00,0x00,0x00,0x00,0x68,0x68,0x28,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0E03, {0x00,0x00,0x00,0x00,0x00,0xA8,0xE8,0x28,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0E04, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xE8,0xE8,0xC8,0x48,0x00,0x00}}, +{ 0x0E05, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xE8,0xE8,0xC8,0x48,0x00,0x00}}, +{ 0x0E06, {0x00,0x00,0x00,0x00,0x00,0xA8,0xE8,0x28,0x48,0xE8,0xD0,0x00,0x00}}, +{ 0x0E07, {0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x10,0x90,0x50,0x30,0x00,0x00}}, +{ 0x0E08, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x68,0x68,0x28,0x30,0x00,0x00}}, +{ 0x0E09, {0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0xD0,0xD0,0x78,0x58,0x00,0x00}}, +{ 0x0E0A, {0x00,0x00,0x00,0x00,0x10,0xD0,0xE0,0x50,0x90,0x90,0x60,0x00,0x00}}, +{ 0x0E0B, {0x00,0x00,0x00,0x00,0x08,0xA8,0xF0,0x28,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0E0C, {0x00,0x00,0x00,0x00,0x00,0x68,0xA8,0x68,0xA8,0xF8,0xE8,0x00,0x00}}, +{ 0x0E0D, {0x00,0x00,0x00,0x00,0x00,0x68,0xA8,0x68,0xB8,0xE0,0xF8,0x00,0x00}}, +{ 0x0E0E, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x48,0x48,0xC8,0xD8,0x38,0x48}}, +{ 0x0E0F, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x48,0x48,0xC8,0xD8,0xA8,0x50}}, +{ 0x0E10, {0x00,0x00,0x00,0x00,0x00,0x78,0x80,0x70,0x68,0x68,0x18,0xA8,0x58}}, +{ 0x0E11, {0x00,0x00,0x00,0x00,0x00,0xA8,0xF8,0x28,0x48,0x48,0x48,0x00,0x00}}, +{ 0x0E12, {0x00,0x00,0x00,0x00,0x00,0xA8,0xE8,0xA8,0xA8,0xF8,0xE8,0x00,0x00}}, +{ 0x0E13, {0x00,0x00,0x00,0x00,0x00,0x68,0xA8,0x68,0xB0,0xB8,0xF8,0x00,0x00}}, +{ 0x0E14, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xE8,0xE8,0xA8,0x48,0x00,0x00}}, +{ 0x0E15, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xE8,0xE8,0xA8,0x48,0x00,0x00}}, +{ 0x0E16, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xC8,0x48,0x68,0x68,0x00,0x00}}, +{ 0x0E17, {0x00,0x00,0x00,0x00,0x00,0xD0,0xE8,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0x0E18, {0x00,0x00,0x00,0x00,0x00,0x78,0x80,0xF0,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0E19, {0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x50,0x90,0xB8,0x58,0x00,0x00}}, +{ 0x0E1A, {0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x48,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0E1B, {0x00,0x00,0x00,0x08,0x08,0xC8,0xC8,0x48,0x48,0x48,0x30,0x00,0x00}}, +{ 0x0E1C, {0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x88,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0E1D, {0x00,0x00,0x00,0x08,0x08,0xC8,0xC8,0x88,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0E1E, {0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x48,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0E1F, {0x00,0x00,0x00,0x08,0x08,0xC8,0xC8,0x48,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0E20, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xC8,0x48,0xC8,0xC8,0x00,0x00}}, +{ 0x0E21, {0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x48,0x48,0xE8,0xD0,0x00,0x00}}, +{ 0x0E22, {0x00,0x00,0x00,0x00,0x00,0xC8,0xC8,0x88,0x68,0x88,0x70,0x00,0x00}}, +{ 0x0E23, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xE0,0x10,0x30,0x30,0x00,0x00}}, +{ 0x0E24, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xC8,0x48,0x68,0x68,0x08,0x08}}, +{ 0x0E25, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x68,0x98,0xC8,0xC8,0x00,0x00}}, +{ 0x0E26, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xC8,0x48,0xC8,0xC8,0x08,0x08}}, +{ 0x0E27, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x18,0x18,0x00,0x00}}, +{ 0x0E28, {0x00,0x00,0x00,0x08,0x08,0x70,0x88,0xE8,0xE8,0xC8,0x48,0x00,0x00}}, +{ 0x0E29, {0x00,0x00,0x00,0x00,0x00,0xD0,0xD0,0x70,0xB8,0x90,0x70,0x00,0x00}}, +{ 0x0E2A, {0x00,0x00,0x00,0x08,0x08,0x70,0x88,0x68,0x98,0xC8,0xC8,0x00,0x00}}, +{ 0x0E2B, {0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x50,0x68,0x48,0x48,0x00,0x00}}, +{ 0x0E2C, {0x00,0x00,0x00,0x08,0x08,0xD0,0xC8,0x48,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x0E2D, {0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0xC8,0xC8,0x88,0x70,0x00,0x00}}, +{ 0x0E2E, {0x00,0x00,0x00,0x08,0x08,0xF0,0x08,0xC8,0xC8,0x88,0x70,0x00,0x00}}, +{ 0x0E2F, {0x00,0x00,0x00,0x00,0x00,0xD8,0xE8,0x08,0x08,0x08,0x10,0x00,0x00}}, +{ 0x0E30, {0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x70,0x00,0x68,0x70,0x00,0x00}}, +{ 0x0E31, {0x00,0x00,0x40,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E32, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x0E33, {0x00,0x00,0x00,0xC0,0xC0,0x30,0x48,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x0E34, {0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E35, {0x00,0x00,0x08,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E36, {0x00,0x00,0x18,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E37, {0x00,0x00,0x28,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E38, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x08}}, +{ 0x0E39, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x18}}, +{ 0x0E3A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18}}, +{ 0x0E3F, {0x00,0x00,0x00,0x20,0xF0,0xA8,0xA8,0xF0,0xA8,0xA8,0xF0,0x20,0x00}}, +{ 0x0E40, {0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x60,0x60,0x00,0x00}}, +{ 0x0E41, {0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xD8,0xD8,0x00,0x00}}, +{ 0x0E42, {0x00,0x00,0x00,0x78,0x80,0xF0,0x10,0x10,0x10,0x18,0x18,0x00,0x00}}, +{ 0x0E43, {0x00,0x00,0x00,0x70,0x90,0xB0,0x70,0x10,0x10,0x18,0x18,0x00,0x00}}, +{ 0x0E44, {0x00,0x00,0x00,0xB0,0x50,0x10,0x10,0x10,0x10,0x18,0x18,0x00,0x00}}, +{ 0x0E45, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x08,0x08,0x08,0x08}}, +{ 0x0E46, {0x00,0x00,0x00,0x00,0x00,0xE8,0xD8,0x08,0x08,0x08,0x08,0x10,0x20}}, +{ 0x0E47, {0x00,0x78,0x60,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E48, {0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E49, {0x68,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E4A, {0x54,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E4B, {0x10,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E4C, {0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E4D, {0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E4E, {0x00,0x18,0x38,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x0E4F, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x0E50, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x0E51, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xA8,0xE8,0x08,0x70,0x00,0x00}}, +{ 0x0E52, {0x00,0x00,0x00,0x00,0x80,0x80,0xA8,0xB8,0xB8,0x88,0x70,0x00,0x00}}, +{ 0x0E53, {0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0x88,0xC8,0xC8,0x00,0x00}}, +{ 0x0E54, {0x00,0x00,0x00,0x00,0x08,0x08,0x70,0x80,0xB0,0xB0,0x78,0x00,0x00}}, +{ 0x0E55, {0x00,0x00,0x00,0x00,0x08,0x68,0x70,0x80,0xB0,0xB0,0x78,0x00,0x00}}, +{ 0x0E56, {0x00,0x00,0x00,0x00,0x00,0x80,0x50,0x28,0x08,0x68,0x70,0x00,0x00}}, +{ 0x0E57, {0x00,0x00,0x00,0x00,0x08,0x08,0xA8,0xE8,0xA8,0xA8,0xD0,0x00,0x00}}, +{ 0x0E58, {0x00,0x00,0x00,0x00,0x00,0x08,0x70,0x80,0x98,0xA8,0xD8,0x00,0x00}}, +{ 0x0E59, {0x00,0x00,0x00,0x00,0x08,0x08,0x30,0x60,0xA0,0xD0,0xC8,0x00,0x00}}, +{ 0x0E5A, {0x00,0x00,0x00,0x00,0x00,0x54,0x74,0x14,0x14,0x14,0x28,0x00,0x00}}, +{ 0x0E5B, {0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xA8,0xB0,0xA0,0x40,0x00,0x00}}, +{ 0x10D0, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x08,0x88,0x70,0x00,0x00}}, +{ 0x10D1, {0x00,0x00,0x40,0x60,0x20,0x20,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10D2, {0x00,0x00,0x00,0x00,0x40,0xA0,0xA0,0x20,0x70,0x88,0x88,0x88,0x70}}, +{ 0x10D3, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xA8,0xA8,0x90,0x80,0x60,0x10}}, +{ 0x10D4, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x08,0x08,0x08,0x88,0x88,0x70}}, +{ 0x10D5, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x30,0x08,0x08,0x88,0x88,0x70}}, +{ 0x10D6, {0x00,0x00,0x40,0xA0,0xA8,0x70,0x30,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x10D7, {0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0xA8,0x48,0x00,0x00}}, +{ 0x10D8, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x50,0x00,0x00}}, +{ 0x10D9, {0x00,0x00,0x00,0x00,0x10,0x08,0x08,0x30,0x08,0x08,0x88,0x88,0x70}}, +{ 0x10DA, {0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xB8,0xB8,0xA8,0x80,0x70,0x08}}, +{ 0x10DB, {0x00,0x00,0x70,0x88,0x88,0x08,0x78,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10DC, {0x00,0x00,0x78,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10DD, {0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0x10DE, {0x00,0x00,0x20,0x10,0x08,0x08,0x30,0x08,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10DF, {0x00,0x00,0x00,0x00,0x00,0x08,0x18,0xA8,0xA8,0x48,0x08,0x48,0x30}}, +{ 0x10E0, {0x00,0x00,0x00,0x08,0x70,0x80,0xD0,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0x10E1, {0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0x90,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10E2, {0x00,0x00,0x20,0x50,0x50,0x70,0xD8,0xD8,0xA8,0x88,0x88,0x88,0x70}}, +{ 0x10E3, {0x00,0x00,0x00,0x00,0xB0,0x48,0x48,0x08,0x08,0x08,0x48,0x48,0x30}}, +{ 0x10E4, {0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0x50,0x08,0x48,0x30}}, +{ 0x10E5, {0x00,0x00,0x08,0x18,0x08,0x08,0x38,0x48,0x08,0x08,0x08,0x88,0x70}}, +{ 0x10E6, {0x00,0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0x88,0x80,0x70,0x08}}, +{ 0x10E7, {0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x10E8, {0x00,0x00,0x50,0xA8,0xA8,0xA8,0x88,0x38,0x48,0x48,0x30,0x00,0x00}}, +{ 0x10E9, {0x00,0x00,0x60,0x90,0x90,0xE0,0x80,0xF0,0x88,0x88,0x88,0x00,0x00}}, +{ 0x10EA, {0x00,0x00,0x00,0x00,0x90,0x88,0x88,0xB0,0x88,0x88,0x88,0x88,0x70}}, +{ 0x10EB, {0x00,0x00,0x10,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10EC, {0x00,0x00,0x50,0xA8,0xA8,0x80,0x80,0xF8,0x88,0x50,0x50,0x20,0x20}}, +{ 0x10ED, {0x00,0x00,0x20,0x60,0xA0,0x20,0x68,0xB0,0x68,0x20,0x20,0xA0,0xC0}}, +{ 0x10EE, {0x00,0x00,0x80,0x80,0x90,0xA0,0xF0,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10EF, {0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x40,0x80}}, +{ 0x10F0, {0x00,0x40,0x30,0x08,0x30,0x08,0x08,0x30,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10F1, {0x00,0xA0,0x90,0x88,0xB0,0x88,0x88,0xB0,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10F2, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x50,0xF8,0x00,0x00}}, +{ 0x10F3, {0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x10,0x30,0x08,0x08,0x88,0x70}}, +{ 0x10F4, {0x00,0x00,0x20,0x40,0x30,0x08,0x08,0x30,0x08,0x08,0x88,0x88,0x70}}, +{ 0x10F5, {0x00,0x00,0x60,0x90,0x90,0x78,0x10,0x78,0x90,0x90,0x60,0x00,0x00}}, +{ 0x10F6, {0x00,0x00,0x00,0x40,0x20,0x20,0x70,0xA8,0xA8,0x70,0x20,0x20,0x10}}, +{ 0x10F7, {0x00,0x00,0x30,0x48,0x08,0x10,0x20,0x40,0x48,0x48,0x30,0x00,0x00}}, +{ 0x10F8, {0x00,0x00,0x88,0x88,0x88,0xF0,0x80,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x10FB, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x18,0x18,0xC0,0xC0,0x00,0x00,0x00}}, +{ 0x11A8, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x10,0x00,0x00,0x00}}, +{ 0x11A9, {0x00,0x00,0x00,0xF8,0x28,0x28,0x28,0x28,0x28,0x50,0x00,0x00,0x00}}, +{ 0x11AA, {0x00,0x00,0x00,0xC8,0x48,0x50,0x50,0x58,0x68,0xA8,0x00,0x00,0x00}}, +{ 0x11AB, {0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x11AC, {0x00,0x00,0x00,0xB8,0x90,0x90,0x90,0xA8,0xA8,0xE8,0x00,0x00,0x00}}, +{ 0x11AD, {0x00,0x00,0x00,0xB8,0x80,0xB8,0x80,0xB8,0xA8,0xD8,0x00,0x00,0x00}}, +{ 0x11AE, {0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x11AF, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x11B0, {0x00,0x00,0x00,0xF8,0x28,0x28,0xE8,0x88,0xA8,0xC8,0x00,0x00,0x00}}, +{ 0x11B1, {0x00,0x00,0x00,0xDC,0x54,0x54,0xD4,0x94,0xB4,0xDC,0x00,0x00,0x00}}, +{ 0x11B2, {0x00,0x00,0x00,0xD4,0x54,0x54,0xDC,0x94,0xB4,0xDC,0x00,0x00,0x00}}, +{ 0x11B3, {0x00,0x00,0x00,0xE4,0x24,0x28,0xE8,0x94,0xB4,0xD4,0x00,0x00,0x00}}, +{ 0x11B4, {0x00,0x00,0x00,0xD8,0x50,0x50,0xD8,0x90,0xB0,0xD8,0x00,0x00,0x00}}, +{ 0x11B5, {0x00,0x00,0x00,0xDC,0x40,0x54,0xD4,0x94,0xA8,0xDC,0x00,0x00,0x00}}, +{ 0x11B6, {0x00,0x00,0x00,0xEC,0x20,0x3C,0xE8,0x9C,0xB4,0xD8,0x00,0x00,0x00}}, +{ 0x11B7, {0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x11B8, {0x00,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x11B9, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0xE8,0xB4,0xB4,0xD4,0x00,0x00,0x00}}, +{ 0x11BA, {0x00,0x00,0x00,0x10,0x10,0x20,0x20,0x50,0x50,0x88,0x00,0x00,0x00}}, +{ 0x11BB, {0x00,0x00,0x00,0x28,0x28,0x50,0x50,0x58,0xA8,0xA4,0x00,0x00,0x00}}, +{ 0x11BC, {0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x11BD, {0x00,0x00,0x00,0xF8,0x08,0x10,0x30,0x48,0x48,0x84,0x00,0x00,0x00}}, +{ 0x11BE, {0x00,0x00,0x00,0x70,0x00,0xF8,0x20,0x20,0x50,0x88,0x00,0x00,0x00}}, +{ 0x11BF, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0x10,0x00,0x00,0x00}}, +{ 0x11C0, {0x00,0x00,0x00,0xF8,0x80,0x80,0xF8,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x11C1, {0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0x50,0xF8,0x00,0x00,0x00}}, +{ 0x11C2, {0x00,0x00,0x70,0x00,0xF8,0x00,0x70,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x11EB, {0x00,0x00,0x00,0x20,0x20,0x50,0x50,0x50,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x11F9, {0x00,0x00,0x00,0x00,0xF8,0x00,0x70,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x1680, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1681, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x1682, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1683, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x38,0x38,0x38,0x38,0x00,0x00}}, +{ 0x1684, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x78,0x78,0x78,0x78,0x00,0x00}}, +{ 0x1685, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF8,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x1686, {0x00,0x00,0x08,0x08,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1687, {0x00,0x00,0x28,0x28,0x28,0x28,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1688, {0x00,0x00,0x38,0x38,0x38,0x38,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1689, {0x00,0x00,0x78,0x78,0x78,0x78,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x168A, {0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x168B, {0x00,0x00,0x10,0x10,0x10,0x10,0xFC,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x168C, {0x00,0x00,0x28,0x28,0x28,0x28,0xFC,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x168D, {0x00,0x00,0x38,0x38,0x38,0x38,0xFC,0x70,0x70,0x70,0x70,0x00,0x00}}, +{ 0x168E, {0x00,0x00,0x3C,0x3C,0x3C,0x3C,0xFC,0x78,0x78,0x78,0x78,0x00,0x00}}, +{ 0x168F, {0x00,0x00,0x7C,0x7C,0x7C,0x7C,0xFC,0xF8,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x1690, {0x00,0x00,0x00,0x00,0x00,0x10,0xFC,0x10,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1691, {0x00,0x00,0x00,0x00,0x00,0x28,0xFC,0x28,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1692, {0x00,0x00,0x00,0x00,0x00,0x38,0xFC,0x38,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1693, {0x00,0x00,0x00,0x00,0x00,0x78,0xFC,0x78,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1694, {0x00,0x00,0x00,0x00,0x00,0xF8,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1695, {0x00,0x00,0x28,0x28,0x10,0x10,0xFC,0x10,0x10,0x28,0x28,0x00,0x00}}, +{ 0x1696, {0x00,0x00,0x30,0x48,0x48,0x84,0xFC,0x84,0x48,0x48,0x30,0x00,0x00}}, +{ 0x1697, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x40,0x58,0x48,0x78,0x00,0x00}}, +{ 0x1698, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xD8,0x70,0x70,0xD8,0x00,0x00}}, +{ 0x1699, {0x00,0x50,0xF8,0x50,0xF8,0x50,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x169A, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x78,0x00,0x00,0x00,0x00}}, +{ 0x169B, {0x00,0x00,0x00,0x80,0x40,0x20,0x1C,0x20,0x40,0x80,0x00,0x00,0x00}}, +{ 0x169C, {0x00,0x00,0x00,0x04,0x08,0x10,0xE0,0x10,0x08,0x04,0x00,0x00,0x00}}, +{ 0x16A0, {0x00,0x00,0x48,0x50,0x60,0x48,0x50,0x60,0x40,0x40,0x40,0x00,0x00}}, +{ 0x16A1, {0x10,0x00,0x48,0x50,0x60,0x48,0x50,0x60,0x40,0x40,0x40,0x00,0x00}}, +{ 0x16A2, {0x00,0x00,0x80,0xC0,0xA0,0x90,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x16A3, {0x00,0x00,0x80,0xC0,0xA0,0x90,0xA8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x16A4, {0x00,0x00,0x80,0xC0,0xA0,0x90,0x88,0xA8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x16A5, {0x00,0x00,0x80,0xC0,0xA0,0x90,0xC8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x16A6, {0x00,0x00,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x40,0x40,0x00,0x00}}, +{ 0x16A7, {0x00,0x00,0x80,0x80,0xF0,0x88,0xA8,0x88,0xF0,0x80,0x80,0x00,0x00}}, +{ 0x16A8, {0x00,0x00,0xC0,0xA0,0x90,0xC0,0xA0,0x90,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16A9, {0x00,0x00,0xC8,0xB0,0x80,0xC8,0xB0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16AA, {0x00,0x00,0x88,0xD0,0xA0,0x80,0xC0,0xB0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16AB, {0x00,0x00,0x60,0x50,0x48,0x60,0x50,0x48,0x40,0x40,0x40,0x00,0x00}}, +{ 0x16AC, {0x00,0x00,0x20,0xA0,0x60,0x30,0xA8,0x60,0x30,0x28,0x20,0x00,0x00}}, +{ 0x16AD, {0x00,0x00,0x20,0x20,0x20,0x30,0x28,0x20,0x30,0x28,0x20,0x00,0x00}}, +{ 0x16AE, {0x00,0x00,0x20,0x20,0x20,0x60,0xA0,0x20,0x60,0xA0,0x20,0x00,0x00}}, +{ 0x16AF, {0x00,0x00,0x20,0x28,0x30,0x60,0xA8,0x30,0x60,0xA0,0x20,0x00,0x00}}, +{ 0x16B0, {0x00,0x00,0x20,0x28,0x30,0x60,0xA0,0x20,0x60,0xA0,0x20,0x00,0x00}}, +{ 0x16B1, {0x00,0x00,0xC0,0xB0,0x88,0xB0,0xC0,0xA0,0x90,0x88,0x80,0x00,0x00}}, +{ 0x16B2, {0x00,0x00,0x00,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00,0x00,0x00}}, +{ 0x16B3, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x16B4, {0x00,0x00,0x88,0x90,0xA0,0xC0,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16B5, {0x00,0x20,0x88,0x90,0xA0,0xC0,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16B6, {0x00,0x00,0x88,0x90,0xE0,0xC0,0xC0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16B7, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x16B8, {0x00,0x00,0x88,0x88,0x50,0x50,0xA8,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x16B9, {0x00,0x00,0xC0,0xB0,0x88,0xB0,0xC0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x16BA, {0x00,0x00,0x88,0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x88,0x00,0x00}}, +{ 0x16BB, {0x00,0x00,0x88,0x88,0xC8,0xA8,0xD8,0xA8,0x98,0x88,0x88,0x00,0x00}}, +{ 0x16BC, {0x00,0x00,0x20,0x20,0xA8,0x70,0x20,0x70,0xA8,0x20,0x20,0x00,0x00}}, +{ 0x16BD, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16BE, {0x00,0x00,0x20,0x20,0xA0,0x60,0x20,0x30,0x28,0x20,0x20,0x00,0x00}}, +{ 0x16BF, {0x00,0x00,0x20,0x20,0x20,0x20,0x30,0x28,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16C0, {0x00,0x00,0x20,0x20,0xA0,0x70,0x70,0x70,0x28,0x20,0x20,0x00,0x00}}, +{ 0x16C1, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16C2, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16C3, {0x00,0x00,0x00,0x00,0x20,0x40,0x90,0x48,0x10,0x20,0x00,0x00,0x00}}, +{ 0x16C4, {0x00,0x00,0x20,0x20,0x20,0x70,0xA8,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16C5, {0x00,0x00,0x20,0x20,0x28,0x30,0x20,0x60,0xA0,0x20,0x20,0x00,0x00}}, +{ 0x16C6, {0x00,0x00,0x20,0x20,0x20,0x20,0x60,0xA0,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16C7, {0x00,0x00,0x20,0x30,0x28,0x20,0x20,0x20,0xA0,0x60,0x20,0x00,0x00}}, +{ 0x16C8, {0x00,0x00,0xC8,0xB0,0x80,0x80,0x80,0x80,0x80,0xB0,0xC8,0x00,0x00}}, +{ 0x16C9, {0x00,0x00,0xA8,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16CA, {0x00,0x00,0x10,0x20,0x40,0x20,0x10,0x20,0x40,0x20,0x10,0x00,0x00}}, +{ 0x16CB, {0x00,0x00,0x80,0x80,0x88,0x98,0xA8,0xC8,0x88,0x08,0x08,0x00,0x00}}, +{ 0x16CC, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x16CD, {0x00,0x00,0x20,0x20,0x20,0x20,0x70,0x70,0x00,0x00,0x00,0x00,0x00}}, +{ 0x16CE, {0x00,0x00,0x20,0x20,0x20,0xA8,0x70,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x16CF, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16D0, {0x00,0x00,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16D1, {0x00,0x00,0x20,0x60,0xA0,0x20,0x70,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16D2, {0x00,0x00,0xC0,0xB0,0x88,0xB0,0xC0,0xB0,0x88,0xB0,0xC0,0x00,0x00}}, +{ 0x16D3, {0x00,0x00,0x20,0x20,0x28,0x30,0x20,0x28,0x30,0x20,0x20,0x00,0x00}}, +{ 0x16D4, {0x00,0x00,0xF0,0x88,0xA8,0x88,0xF0,0x88,0xA8,0x88,0xF0,0x00,0x00}}, +{ 0x16D5, {0x00,0x00,0x88,0x90,0xA0,0xC0,0x80,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x16D6, {0x00,0x00,0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x16D7, {0x00,0x00,0x88,0xD8,0xA8,0xD8,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x16D8, {0x00,0x00,0xA8,0xA8,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16D9, {0x00,0x00,0x70,0x70,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16DA, {0x00,0x00,0x20,0x30,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16DB, {0x00,0x00,0x20,0x30,0x28,0x20,0x70,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16DC, {0x00,0x00,0x00,0x00,0x20,0x50,0x88,0x50,0x20,0x00,0x00,0x00,0x00}}, +{ 0x16DD, {0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x50,0x20,0x50,0x88,0x00,0x00}}, +{ 0x16DE, {0x00,0x00,0x88,0xD8,0xD8,0xA8,0xA8,0xA8,0xD8,0xD8,0x88,0x00,0x00}}, +{ 0x16DF, {0x00,0x00,0x20,0x50,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00}}, +{ 0x16E0, {0x00,0x00,0xF8,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16E1, {0x00,0x00,0x20,0x20,0xA8,0x70,0x20,0x70,0xA8,0x20,0x20,0x00,0x00}}, +{ 0x16E2, {0x00,0x00,0x28,0x30,0x20,0x20,0x20,0x20,0x20,0x60,0xA0,0x00,0x00}}, +{ 0x16E3, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0xA8,0x00,0x00}}, +{ 0x16E4, {0x00,0x00,0xA8,0xA8,0x70,0xA8,0xA8,0xA8,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x16E5, {0x00,0x00,0x88,0xD8,0xA8,0xD8,0x88,0xD8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x16E6, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x16E7, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16E8, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x16E9, {0x00,0x00,0x18,0x68,0x88,0x68,0x18,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x16EA, {0x00,0x00,0x40,0xE0,0x40,0x50,0x70,0x50,0x10,0x38,0x10,0x00,0x00}}, +{ 0x16EB, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x16EC, {0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00}}, +{ 0x16ED, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x16EE, {0x00,0x00,0x20,0x30,0x28,0x20,0x60,0xA0,0x20,0x20,0x20,0x00,0x00}}, +{ 0x16EF, {0x00,0x00,0xA8,0xA8,0x70,0x20,0x20,0x20,0x70,0xA8,0xA8,0x00,0x00}}, +{ 0x16F0, {0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x1E00, {0x00,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x88,0x20,0x50,0x20}}, +{ 0x1E01, {0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x20,0x50,0x20}}, +{ 0x1E02, {0x00,0x20,0x20,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x1E03, {0x00,0x20,0xA0,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0x1E04, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x20}}, +{ 0x1E05, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0x20}}, +{ 0x1E06, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0xF8}}, +{ 0x1E07, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0xF8}}, +{ 0x1E08, {0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x20,0x40}}, +{ 0x1E09, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x20,0x40}}, +{ 0x1E0A, {0x00,0x20,0x20,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x1E0B, {0x00,0x20,0x28,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x1E0C, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x20}}, +{ 0x1E0D, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x20}}, +{ 0x1E0E, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0xF8}}, +{ 0x1E0F, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0xF8}}, +{ 0x1E10, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x20,0x40}}, +{ 0x1E11, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x20,0x40}}, +{ 0x1E12, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x20,0x50}}, +{ 0x1E13, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00,0x20,0x50}}, +{ 0x1E14, {0x40,0x20,0xF8,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1E15, {0x00,0x40,0x20,0xF8,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1E16, {0x10,0x20,0xF8,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1E17, {0x00,0x10,0x20,0xF8,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1E18, {0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x20,0x50}}, +{ 0x1E19, {0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x20,0x50}}, +{ 0x1E1A, {0x00,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x28,0x50}}, +{ 0x1E1B, {0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x28,0x50}}, +{ 0x1E1C, {0x00,0x88,0x70,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x20,0x40}}, +{ 0x1E1D, {0x00,0x00,0x88,0x70,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x20,0x40}}, +{ 0x1E1E, {0x00,0x20,0x20,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x1E1F, {0x00,0x20,0x20,0x00,0x30,0x48,0x40,0xF0,0x40,0x40,0x40,0x00,0x00}}, +{ 0x1E20, {0x00,0xF8,0x00,0x70,0x88,0x80,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E21, {0x00,0x00,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0x1E22, {0x00,0x20,0x20,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E23, {0x00,0x20,0xA0,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E24, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1E25, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1E26, {0x00,0x50,0x50,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E27, {0x00,0x50,0x50,0x00,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E28, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x10,0x20}}, +{ 0x1E29, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x10,0x20}}, +{ 0x1E2A, {0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x88,0x70}}, +{ 0x1E2B, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00,0x88,0x70}}, +{ 0x1E2C, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x28,0x50}}, +{ 0x1E2D, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x28,0x50}}, +{ 0x1E2E, {0x10,0x20,0x00,0x50,0x00,0x70,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x1E2F, {0x10,0x20,0x00,0x50,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x1E30, {0x00,0x10,0x20,0x00,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x1E31, {0x00,0x10,0xA0,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x1E32, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x20}}, +{ 0x1E33, {0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x20}}, +{ 0x1E34, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0xF8}}, +{ 0x1E35, {0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0xF8}}, +{ 0x1E36, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x20}}, +{ 0x1E37, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x20}}, +{ 0x1E38, {0x00,0xF8,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x20}}, +{ 0x1E39, {0x00,0xF8,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x20}}, +{ 0x1E3A, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0xF8}}, +{ 0x1E3B, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x70}}, +{ 0x1E3C, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x20,0x50}}, +{ 0x1E3D, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x20,0x50}}, +{ 0x1E3E, {0x00,0x10,0x20,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E3F, {0x00,0x00,0x10,0x20,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0x1E40, {0x00,0x20,0x20,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E41, {0x00,0x00,0x20,0x20,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0x1E42, {0x00,0x00,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1E43, {0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x20}}, +{ 0x1E44, {0x00,0x20,0x20,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x00,0x00}}, +{ 0x1E45, {0x00,0x00,0x20,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1E46, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x00,0x20}}, +{ 0x1E47, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1E48, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x00,0xF8}}, +{ 0x1E49, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0xF8}}, +{ 0x1E4A, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x20,0x50}}, +{ 0x1E4B, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x20,0x50}}, +{ 0x1E4C, {0x10,0x20,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E4D, {0x00,0x10,0x20,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E4E, {0x50,0x50,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E4F, {0x00,0x50,0x50,0x00,0x28,0x50,0x00,0x70,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E50, {0x40,0x20,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E51, {0x00,0x40,0x20,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E52, {0x10,0x20,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E53, {0x00,0x10,0x20,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E54, {0x00,0x10,0x20,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x1E55, {0x00,0x00,0x10,0x20,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80}}, +{ 0x1E56, {0x00,0x20,0x20,0x00,0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x1E57, {0x00,0x00,0x20,0x20,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80}}, +{ 0x1E58, {0x00,0x20,0x20,0x00,0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0x1E59, {0x00,0x00,0x20,0x20,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x1E5A, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x88,0x00,0x20}}, +{ 0x1E5B, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x20}}, +{ 0x1E5C, {0x00,0xF8,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x00,0x20}}, +{ 0x1E5D, {0x00,0x00,0x00,0xF8,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x20}}, +{ 0x1E5E, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x88,0x00,0xF8}}, +{ 0x1E5F, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0xF8}}, +{ 0x1E60, {0x00,0x20,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x1E61, {0x00,0x00,0x20,0x20,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x1E62, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x20}}, +{ 0x1E63, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x20}}, +{ 0x1E64, {0x40,0x10,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x1E65, {0x40,0x10,0x20,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x1E66, {0x20,0x00,0x50,0x20,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x00}}, +{ 0x1E67, {0x20,0x00,0x50,0x20,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0x1E68, {0x00,0x20,0x20,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00,0x20}}, +{ 0x1E69, {0x00,0x00,0x20,0x20,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x20}}, +{ 0x1E6A, {0x00,0x20,0x20,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1E6B, {0x00,0x20,0x20,0x00,0x40,0x40,0xF0,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x1E6C, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20}}, +{ 0x1E6D, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0x20}}, +{ 0x1E6E, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0xF8}}, +{ 0x1E6F, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0xF8}}, +{ 0x1E70, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x50}}, +{ 0x1E71, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x48,0x30,0x00,0x20,0x50}}, +{ 0x1E72, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x50}}, +{ 0x1E73, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x50}}, +{ 0x1E74, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x28,0x50}}, +{ 0x1E75, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x28,0x50}}, +{ 0x1E76, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x50}}, +{ 0x1E77, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x20,0x50}}, +{ 0x1E78, {0x10,0x20,0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E79, {0x10,0x20,0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1E7A, {0x50,0x50,0x00,0xF8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1E7B, {0x50,0x50,0x00,0xF8,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1E7C, {0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x1E7D, {0x00,0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x1E7E, {0x00,0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00,0x20}}, +{ 0x1E7F, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x20}}, +{ 0x1E80, {0x00,0x40,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x1E81, {0x00,0x00,0x40,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1E82, {0x00,0x10,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x1E83, {0x00,0x00,0x10,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1E84, {0x00,0x50,0x50,0x00,0x88,0x88,0xA8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x1E85, {0x00,0x00,0x50,0x50,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1E86, {0x00,0x20,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x1E87, {0x00,0x00,0x20,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1E88, {0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xD8,0x88,0x00,0x20}}, +{ 0x1E89, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1E8A, {0x00,0x20,0x20,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00}}, +{ 0x1E8B, {0x00,0x00,0x20,0x20,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,0x00}}, +{ 0x1E8C, {0x00,0x50,0x50,0x00,0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00,0x00}}, +{ 0x1E8D, {0x00,0x00,0x50,0x50,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,0x00}}, +{ 0x1E8E, {0x00,0x20,0x20,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1E8F, {0x00,0x00,0x20,0x20,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x1E90, {0x00,0x30,0x48,0x00,0xF8,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x1E91, {0x00,0x00,0x30,0x48,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0x1E92, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x00,0x20}}, +{ 0x1E93, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x20}}, +{ 0x1E94, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x00,0xF8}}, +{ 0x1E95, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0xF8}}, +{ 0x1E96, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0xF8}}, +{ 0x1E97, {0x00,0x50,0x50,0x00,0x40,0x40,0xF0,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0x1E98, {0x00,0x20,0x50,0x20,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1E99, {0x00,0x20,0x50,0x20,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x1E9A, {0x08,0x04,0x04,0x08,0x00,0x70,0x08,0x78,0x88,0x88,0x78,0x00,0x00}}, +{ 0x1E9B, {0x00,0x20,0x20,0x00,0x30,0x48,0x40,0xC0,0x40,0x40,0x40,0x00,0x00}}, +{ 0x1EA0, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1EA1, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1EA2, {0x20,0x50,0x10,0x20,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EA3, {0x20,0x50,0x10,0x20,0x20,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EA4, {0x00,0x44,0xA8,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EA5, {0x00,0x00,0x44,0xA8,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EA6, {0x00,0x88,0x54,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EA7, {0x00,0x00,0x88,0x54,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EA8, {0x08,0x54,0xA4,0x08,0x28,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EA9, {0x00,0x08,0x54,0xA4,0x08,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EAA, {0x28,0x50,0x00,0x30,0x48,0x20,0x50,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EAB, {0x28,0x50,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EAC, {0x00,0x30,0x48,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x20}}, +{ 0x1EAD, {0x00,0x00,0x30,0x48,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1EAE, {0x10,0x20,0x88,0x70,0x00,0x20,0x50,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EAF, {0x10,0x20,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EB0, {0x40,0x20,0x88,0x70,0x00,0x20,0x50,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EB1, {0x40,0x20,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EB2, {0x20,0x50,0x10,0xA8,0x70,0x20,0x50,0x88,0x88,0xF8,0x88,0x00,0x00}}, +{ 0x1EB3, {0x20,0x50,0x10,0xA8,0x70,0x00,0x70,0x08,0x78,0x88,0x78,0x00,0x00}}, +{ 0x1EB4, {0x50,0xA0,0x88,0x70,0x00,0x20,0x50,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1EB5, {0x50,0xA0,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EB6, {0x00,0x88,0x70,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x20}}, +{ 0x1EB7, {0x00,0x00,0x88,0x70,0x00,0x70,0x08,0x78,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1EB8, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x20}}, +{ 0x1EB9, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x20}}, +{ 0x1EBA, {0x20,0x50,0x10,0x20,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1EBB, {0x20,0x50,0x10,0x20,0x20,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1EBC, {0x00,0x28,0x50,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1EBD, {0x00,0x00,0x28,0x50,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1EBE, {0x00,0x44,0xA8,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1EBF, {0x00,0x00,0x44,0xA8,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1EC0, {0x00,0x88,0x54,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1EC1, {0x00,0x00,0x88,0x54,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1EC2, {0x08,0x54,0xA8,0x08,0x00,0xF8,0x80,0xE0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1EC3, {0x00,0x08,0x54,0xA8,0x08,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1EC4, {0x28,0x50,0x30,0x48,0x00,0xF8,0x80,0xF0,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x1EC5, {0x28,0x50,0x30,0x48,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1EC6, {0x00,0x30,0x48,0x00,0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00,0x20}}, +{ 0x1EC7, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x20}}, +{ 0x1EC8, {0x20,0x50,0x10,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x1EC9, {0x20,0x50,0x20,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x1ECA, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x20}}, +{ 0x1ECB, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0xF8,0x00,0x20}}, +{ 0x1ECC, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x20}}, +{ 0x1ECD, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x20}}, +{ 0x1ECE, {0x20,0x50,0x10,0x20,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ECF, {0x20,0x50,0x10,0x20,0x20,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED0, {0x00,0x44,0xA8,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED1, {0x00,0x00,0x44,0xA8,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED2, {0x00,0x88,0x54,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED3, {0x00,0x00,0x88,0x54,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED4, {0x08,0x54,0xA4,0x08,0x78,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED5, {0x00,0x08,0x54,0xA4,0x08,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED6, {0x28,0x50,0x38,0x48,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED7, {0x28,0x50,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1ED8, {0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x20}}, +{ 0x1ED9, {0x00,0x00,0x30,0x48,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x20}}, +{ 0x1EDA, {0x00,0x20,0x40,0x00,0x64,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EDB, {0x00,0x00,0x20,0x40,0x00,0x64,0x94,0x98,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EDC, {0x00,0x40,0x20,0x00,0x64,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EDD, {0x00,0x00,0x40,0x20,0x00,0x64,0x94,0x98,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EDE, {0x20,0x50,0x10,0x20,0x64,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EDF, {0x00,0x20,0x50,0x10,0x20,0x64,0x94,0x98,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EE0, {0x00,0x50,0xA0,0x00,0x64,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EE1, {0x00,0x00,0x50,0xA0,0x00,0x64,0x94,0x98,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EE2, {0x00,0x00,0x64,0x94,0x98,0x90,0x90,0x90,0x90,0x90,0x60,0x00,0x20}}, +{ 0x1EE3, {0x00,0x00,0x00,0x00,0x00,0x64,0x94,0x98,0x90,0x90,0x60,0x00,0x20}}, +{ 0x1EE4, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x20}}, +{ 0x1EE5, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1EE6, {0x20,0x50,0x10,0x20,0xA8,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1EE7, {0x20,0x50,0x10,0x20,0x20,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1EE8, {0x00,0x20,0x40,0x00,0x94,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EE9, {0x00,0x00,0x20,0x40,0x00,0x94,0x94,0x98,0x90,0xB0,0x50,0x00,0x00}}, +{ 0x1EEA, {0x00,0x40,0x20,0x00,0x94,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EEB, {0x00,0x00,0x40,0x20,0x00,0x94,0x94,0x98,0x90,0xB0,0x50,0x00,0x00}}, +{ 0x1EEC, {0x20,0x50,0x10,0x20,0xB4,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EED, {0x20,0x50,0x10,0x20,0x20,0x94,0x94,0x98,0x90,0xB0,0x50,0x00,0x00}}, +{ 0x1EEE, {0x00,0x50,0xA0,0x00,0x94,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x00}}, +{ 0x1EEF, {0x00,0x00,0x50,0xA0,0x00,0x94,0x94,0x98,0x90,0xB0,0x50,0x00,0x00}}, +{ 0x1EF0, {0x00,0x00,0x00,0x00,0x94,0x94,0x98,0x90,0x90,0x90,0x60,0x00,0x20}}, +{ 0x1EF1, {0x00,0x00,0x00,0x00,0x00,0x94,0x94,0x98,0x90,0xB0,0x50,0x00,0x20}}, +{ 0x1EF2, {0x00,0x40,0x20,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1EF3, {0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x1EF4, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x20}}, +{ 0x1EF5, {0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70,0x00,0x20}}, +{ 0x1EF6, {0x20,0x50,0x10,0x20,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1EF7, {0x20,0x50,0x10,0x20,0x20,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x1EF8, {0x00,0x28,0x50,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1EF9, {0x00,0x00,0x28,0x50,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0x1F00, {0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F01, {0x00,0x30,0x20,0x10,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F02, {0x00,0xD0,0x48,0x80,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F03, {0x00,0xD0,0x88,0x40,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F04, {0x00,0xC8,0x50,0x80,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F05, {0x00,0xC8,0x90,0x40,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F06, {0x68,0xB0,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F07, {0x68,0xB0,0x20,0x10,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F08, {0x00,0x00,0xD0,0x68,0xA8,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F09, {0x00,0x00,0xD0,0xA8,0x68,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F0A, {0x00,0x00,0xD0,0x68,0xA8,0xA8,0x68,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F0B, {0x00,0x00,0xD0,0xA8,0x68,0xA8,0x68,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F0C, {0x00,0x00,0xD0,0x68,0xA8,0x68,0xA8,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F0D, {0x00,0x00,0xD0,0xA8,0x68,0x68,0xA8,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F0E, {0x00,0x00,0xD0,0x28,0xE8,0x68,0xA8,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F0F, {0x00,0x00,0xD0,0x28,0xE8,0xA8,0x68,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F10, {0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F11, {0x00,0x30,0x20,0x10,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F12, {0x00,0xD0,0x48,0x80,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F13, {0x00,0xD0,0x88,0x40,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F14, {0x00,0xC8,0x50,0x80,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F15, {0x00,0xC8,0x90,0x40,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F18, {0x00,0x00,0xF8,0x60,0xA0,0x20,0x30,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1F19, {0x00,0x00,0xF8,0xA0,0x60,0x20,0x30,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1F1A, {0x00,0x00,0xF8,0x60,0xA0,0xA0,0x70,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1F1B, {0x00,0x00,0xF8,0xA0,0x60,0xA0,0x70,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1F1C, {0x00,0x00,0xF8,0x60,0xA0,0x60,0xB0,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1F1D, {0x00,0x00,0xF8,0xA0,0x60,0x60,0xB0,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1F20, {0x00,0x30,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F21, {0x00,0x30,0x20,0x10,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F22, {0x00,0xD0,0x48,0x80,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F23, {0x00,0xD0,0x88,0x40,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F24, {0x00,0xC8,0x50,0x80,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F25, {0x00,0xC8,0x90,0x40,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F26, {0x68,0xB0,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F27, {0x68,0xB0,0x20,0x10,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F28, {0x00,0x00,0xE8,0x68,0xA8,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F29, {0x00,0x00,0xE8,0xA8,0x68,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F2A, {0x00,0x00,0xE8,0x68,0xA8,0xA8,0x78,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F2B, {0x00,0x00,0xE8,0xA8,0x68,0xA8,0x78,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F2C, {0x00,0x00,0xE8,0x68,0xA8,0x68,0xB8,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F2D, {0x00,0x00,0xE8,0xA8,0x68,0x68,0xB8,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F2E, {0x00,0x00,0xE8,0x28,0xE8,0x68,0xB8,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F2F, {0x00,0x00,0xE8,0x28,0xE8,0xA8,0x78,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1F30, {0x00,0x60,0x20,0x40,0x00,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x1F31, {0x00,0x60,0x40,0x20,0x00,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x1F32, {0x00,0xD0,0x48,0x80,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1F33, {0x00,0xD0,0x88,0x40,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1F34, {0x00,0xC8,0x50,0x80,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1F35, {0x00,0xC8,0x90,0x40,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1F36, {0x68,0xB0,0x10,0x20,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1F37, {0x68,0xB0,0x20,0x10,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1F38, {0x00,0x00,0xF8,0x50,0x90,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F39, {0x00,0x00,0xF8,0x90,0x50,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F3A, {0x00,0x00,0xF8,0x50,0x90,0x90,0x50,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F3B, {0x00,0x00,0xF8,0x90,0x50,0x90,0x50,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F3C, {0x00,0x00,0xF8,0x50,0x90,0x50,0x90,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F3D, {0x00,0x00,0xF8,0x90,0x50,0x30,0x50,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F3E, {0x00,0x00,0xF8,0x10,0xD0,0x50,0x90,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F3F, {0x00,0x00,0xF8,0x10,0xD0,0x90,0x50,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1F40, {0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F41, {0x00,0x30,0x20,0x10,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F42, {0x00,0xD0,0x48,0x80,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F43, {0x00,0xD0,0x88,0x40,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F44, {0x00,0xC8,0x50,0x80,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F45, {0x00,0xC8,0x90,0x40,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F48, {0x00,0x00,0xD0,0x68,0xA8,0x28,0x28,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1F49, {0x00,0x00,0xD0,0xA8,0x68,0x28,0x28,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1F4A, {0x00,0x00,0xD0,0x68,0xA8,0xA8,0x68,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1F4B, {0x00,0x00,0xD0,0xA8,0x68,0xA8,0x68,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1F4C, {0x00,0x00,0xD0,0x68,0xA8,0x68,0xA8,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1F4D, {0x00,0x00,0xD0,0xA8,0x68,0x68,0xA8,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1F50, {0x00,0x30,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F51, {0x00,0x30,0x20,0x10,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F52, {0x00,0xD0,0x48,0x80,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F53, {0x00,0xD0,0x88,0x40,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F54, {0x00,0xC8,0x50,0x80,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F55, {0x00,0xC8,0x90,0x40,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F56, {0x68,0xB0,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F57, {0x68,0xB0,0x20,0x10,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F59, {0x00,0x00,0xE8,0xA8,0x68,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x1F5B, {0x00,0x00,0xE8,0xA8,0x68,0xA8,0x50,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x1F5D, {0x00,0x00,0xE8,0xA8,0x68,0x68,0x90,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x1F5F, {0x00,0x00,0xE8,0x28,0xE8,0xA8,0x50,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x1F60, {0x00,0x30,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F61, {0x00,0x30,0x20,0x10,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F62, {0x00,0xD0,0x48,0x80,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F63, {0x00,0xD0,0x88,0x40,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F64, {0x00,0xC8,0x50,0x80,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F65, {0x00,0xC8,0x90,0x40,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F66, {0x68,0xB0,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F67, {0x68,0xB0,0x20,0x10,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F68, {0x00,0x00,0xD0,0x68,0xA8,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F69, {0x00,0x00,0xD0,0xA8,0x68,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F6A, {0x00,0x00,0xD0,0x68,0xA8,0xA8,0x68,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F6B, {0x00,0x00,0xD0,0xA8,0x68,0xA8,0x68,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F6C, {0x00,0x00,0xD0,0x68,0xA8,0x68,0xA8,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F6D, {0x00,0x00,0xD0,0xA8,0x68,0x68,0xA8,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F6E, {0x00,0x00,0xD0,0x28,0xE8,0x68,0xA8,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F6F, {0x00,0x00,0xD0,0x28,0xE8,0xA8,0x68,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1F70, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F71, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1F72, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F73, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x1F74, {0x00,0x00,0x40,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F75, {0x00,0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1F76, {0x00,0x00,0x80,0x40,0x00,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x1F77, {0x00,0x00,0x20,0x40,0x00,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x1F78, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F79, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F7A, {0x00,0x00,0x40,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F7B, {0x00,0x00,0x10,0x20,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1F7C, {0x00,0x00,0x40,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F7D, {0x00,0x00,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1F80, {0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F81, {0x00,0x30,0x20,0x10,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F82, {0x00,0xD0,0x48,0x80,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F83, {0x00,0xD0,0x88,0x40,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F84, {0x00,0xC8,0x50,0x80,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F85, {0x00,0xC8,0x90,0x40,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F86, {0x68,0xB0,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F87, {0x68,0xB0,0x20,0x10,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1F88, {0x00,0x00,0xD0,0x68,0xA8,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F89, {0x00,0x00,0xD0,0xA8,0x68,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F8A, {0x00,0x00,0xD0,0x68,0xA8,0xA8,0x68,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F8B, {0x00,0x00,0xD0,0xA8,0x68,0xA8,0x68,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F8C, {0x00,0x00,0xD0,0x68,0xA8,0x68,0xA8,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F8D, {0x00,0x00,0xD0,0xA8,0x68,0x68,0xA8,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F8E, {0x00,0x00,0xD0,0x28,0xE8,0x68,0xA8,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F8F, {0x00,0x00,0xD0,0x28,0xE8,0xA8,0x68,0x38,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F90, {0x00,0x30,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F91, {0x00,0x30,0x20,0x10,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F92, {0x00,0xD0,0x48,0x80,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F93, {0x00,0xD0,0x88,0x40,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F94, {0x00,0xC8,0x50,0x80,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F95, {0x00,0xC8,0x90,0x40,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F96, {0x68,0xB0,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F97, {0x68,0xB0,0x20,0x10,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1F98, {0x00,0x00,0xE8,0x68,0xA8,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F99, {0x00,0x00,0xE8,0xA8,0x68,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F9A, {0x00,0x00,0xE8,0x68,0xA8,0xA8,0x78,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F9B, {0x00,0x00,0xE8,0xA8,0x68,0xA8,0x78,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F9C, {0x00,0x00,0xE8,0x68,0xA8,0x68,0xB8,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F9D, {0x00,0x00,0xE8,0xA8,0x68,0x68,0xB8,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F9E, {0x00,0x00,0xE8,0x28,0xE8,0x68,0xB8,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1F9F, {0x00,0x00,0xE8,0x28,0xE8,0xA8,0x78,0x28,0x28,0x28,0x28,0x00,0x10}}, +{ 0x1FA0, {0x00,0x30,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA1, {0x00,0x30,0x20,0x10,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA2, {0x00,0xD0,0x48,0x80,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA3, {0x00,0xD0,0x88,0x40,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA4, {0x00,0xC8,0x50,0x80,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA5, {0x00,0xC8,0x90,0x40,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA6, {0x68,0xB0,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA7, {0x68,0xB0,0x20,0x10,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FA8, {0x00,0x00,0xD0,0x68,0xA8,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FA9, {0x00,0x00,0xD0,0xA8,0x68,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FAA, {0x00,0x00,0xD0,0x68,0xA8,0xA8,0x68,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FAB, {0x00,0x00,0xD0,0xA8,0x68,0xA8,0x68,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FAC, {0x00,0x00,0xD0,0x68,0xA8,0x68,0xA8,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FAD, {0x00,0x00,0xD0,0xA8,0x68,0x68,0xA8,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FAE, {0x00,0x00,0xD0,0x28,0xE8,0x68,0xA8,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FAF, {0x00,0x00,0xD0,0x28,0xE8,0xA8,0x68,0x28,0x10,0x10,0x28,0x00,0x10}}, +{ 0x1FB0, {0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1FB1, {0x00,0x00,0x00,0xF8,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1FB2, {0x00,0x00,0x40,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1FB3, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1FB4, {0x00,0x00,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1FB6, {0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0x1FB7, {0x00,0x00,0x68,0xB0,0x00,0x70,0x88,0x88,0x88,0x98,0x68,0x00,0x20}}, +{ 0x1FB8, {0x00,0x88,0x70,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x1FB9, {0x00,0xF8,0x00,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0x1FBA, {0x00,0x00,0x90,0x68,0x28,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1FBB, {0x00,0x00,0x50,0xA8,0x28,0x28,0x28,0x38,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1FBC, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1FBD, {0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FBE, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x10,0x00,0x00}}, +{ 0x1FBF, {0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FC0, {0x00,0x00,0x68,0xB0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FC1, {0x00,0x68,0xB0,0x00,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FC2, {0x00,0x00,0x40,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1FC3, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1FC4, {0x00,0x00,0x10,0x20,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1FC6, {0x00,0x00,0x68,0xB0,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x08}}, +{ 0x1FC7, {0x00,0x00,0x68,0xB0,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x08,0x88}}, +{ 0x1FC8, {0x00,0x00,0xB8,0x60,0x20,0x20,0x30,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1FC9, {0x00,0x00,0x78,0xA0,0x20,0x20,0x30,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x1FCA, {0x00,0x00,0xA8,0x68,0x28,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1FCB, {0x00,0x00,0x68,0xA8,0x28,0x28,0x38,0x28,0x28,0x28,0x28,0x00,0x00}}, +{ 0x1FCC, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x20}}, +{ 0x1FCD, {0x00,0x00,0xD0,0x48,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FCE, {0x00,0x00,0xC8,0x50,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FCF, {0x00,0x00,0x68,0xB0,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FD0, {0x00,0x00,0x88,0x70,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1FD1, {0x00,0x00,0x00,0xF8,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1FD2, {0x00,0x40,0x20,0xD8,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1FD3, {0x00,0x10,0x20,0xD8,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1FD6, {0x00,0x00,0x68,0xB0,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1FD7, {0x68,0xB0,0x00,0xD8,0x00,0x20,0x20,0x20,0x20,0x28,0x10,0x00,0x00}}, +{ 0x1FD8, {0x00,0x88,0x70,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x1FD9, {0x00,0x00,0xF8,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x1FDA, {0x00,0x00,0xB8,0x50,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1FDB, {0x00,0x00,0x78,0x90,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x1FDD, {0x00,0x00,0xD0,0x88,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FDE, {0x00,0x00,0xC8,0x90,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FDF, {0x00,0x00,0x68,0xB0,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FE0, {0x00,0x00,0x88,0x70,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1FE1, {0x00,0x00,0x00,0xF8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1FE2, {0x00,0x40,0x20,0xD8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1FE3, {0x00,0x10,0x20,0xD8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1FE4, {0x00,0x30,0x10,0x20,0x00,0x70,0x88,0x88,0x88,0x88,0xF0,0x80,0x80}}, +{ 0x1FE5, {0x00,0x30,0x20,0x10,0x00,0x70,0x88,0x88,0x88,0x88,0xF0,0x80,0x80}}, +{ 0x1FE6, {0x00,0x00,0x68,0xB0,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1FE7, {0x68,0xB0,0x00,0xD8,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x1FE8, {0x00,0x88,0x70,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1FE9, {0x00,0xF8,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1FEA, {0x00,0x00,0xA8,0x68,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x1FEB, {0x00,0x00,0x68,0xA8,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x1FEC, {0x00,0x00,0xF0,0xA8,0x68,0x28,0x30,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x1FED, {0x00,0x40,0x20,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FEE, {0x00,0x10,0x20,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FEF, {0x00,0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FF2, {0x00,0x00,0x40,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FF3, {0x00,0x00,0x00,0x00,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FF4, {0x00,0x00,0x10,0x20,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FF6, {0x00,0x00,0x68,0xB0,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x1FF7, {0x00,0x00,0x68,0xB0,0x00,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00,0x20}}, +{ 0x1FF8, {0x00,0x00,0x90,0x68,0x28,0x28,0x28,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1FF9, {0x00,0x00,0x50,0xA8,0x28,0x28,0x28,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x1FFA, {0x00,0x00,0x90,0x68,0x28,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1FFB, {0x00,0x00,0x50,0xA8,0x28,0x28,0x28,0x28,0x10,0x10,0x28,0x00,0x00}}, +{ 0x1FFC, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0xD8,0x00,0x20}}, +{ 0x1FFD, {0x00,0x00,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x1FFE, {0x00,0x00,0x30,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2000, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2001, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2002, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2003, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2004, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2005, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2006, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2007, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2008, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2009, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x200A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x200B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x200C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x200D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x200E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x200F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2010, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2011, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2012, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2013, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2014, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2015, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2016, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x2017, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0xF8}}, +{ 0x2018, {0x00,0x00,0x10,0x20,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2019, {0x00,0x00,0x30,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x201A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x20,0x00}}, +{ 0x201B, {0x00,0x00,0x30,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x201C, {0x00,0x00,0x48,0x90,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x201D, {0x00,0x00,0xD8,0x48,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x201E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x90,0x00}}, +{ 0x201F, {0x00,0x00,0xD8,0x90,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2020, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2021, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2022, {0x00,0x00,0x00,0x00,0x70,0xF8,0xF8,0xF8,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2023, {0x00,0x00,0x00,0x40,0x60,0x70,0x78,0x70,0x60,0x40,0x00,0x00,0x00}}, +{ 0x2024, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00}}, +{ 0x2025, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00}}, +{ 0x2026, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x00,0x00}}, +{ 0x2027, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00}}, +{ 0x202F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2030, {0x00,0x00,0x48,0xA8,0x50,0x10,0x20,0x40,0x68,0xD4,0xA8,0x00,0x00}}, +{ 0x2031, {0x00,0x00,0x48,0xA8,0x50,0x10,0x28,0x54,0x68,0xD4,0xA8,0x00,0x00}}, +{ 0x2032, {0x00,0x00,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2033, {0x00,0x00,0x50,0x50,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2034, {0x00,0x00,0x54,0x54,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2035, {0x00,0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2036, {0x00,0x00,0xA0,0xA0,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2037, {0x00,0x00,0xA8,0xA8,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2038, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x50,0x50}}, +{ 0x2039, {0x00,0x00,0x00,0x00,0x10,0x20,0x40,0x40,0x20,0x10,0x00,0x00,0x00}}, +{ 0x203A, {0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x20,0x40,0x00,0x00,0x00}}, +{ 0x203B, {0x00,0x00,0xA8,0x88,0x50,0x20,0xA8,0x20,0x50,0x88,0xA8,0x00,0x00}}, +{ 0x203C, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x50,0x00,0x00}}, +{ 0x203D, {0x00,0x00,0x70,0xA8,0x28,0x28,0x30,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0x203E, {0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x203F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x70}}, +{ 0x2040, {0x00,0x70,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2041, {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x50,0x50}}, +{ 0x2042, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x50,0xF8,0x50,0x00,0x00,0x00}}, +{ 0x2043, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2044, {0x00,0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00,0x00}}, +{ 0x2045, {0x00,0x00,0x70,0x40,0x40,0x40,0x70,0x40,0x40,0x40,0x70,0x00,0x00}}, +{ 0x2046, {0x00,0x00,0x70,0x10,0x10,0x10,0x70,0x10,0x10,0x10,0x70,0x00,0x00}}, +{ 0x2047, {0x00,0x00,0x48,0xB4,0xB4,0x24,0x48,0x48,0x48,0x00,0x48,0x00,0x00}}, +{ 0x2048, {0x00,0x00,0x48,0xA8,0xA8,0x28,0x48,0x48,0x48,0x00,0x48,0x00,0x00}}, +{ 0x2049, {0x00,0x00,0x90,0xA8,0xA8,0x88,0x90,0x90,0x90,0x00,0x90,0x00,0x00}}, +{ 0x204A, {0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x204B, {0x00,0x00,0xF0,0xB8,0xB8,0xB8,0xB8,0xB0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x204C, {0x00,0x00,0x00,0x00,0x78,0xE8,0xE8,0xE8,0x78,0x00,0x00,0x00,0x00}}, +{ 0x204D, {0x00,0x00,0x00,0x00,0xF0,0xB8,0xB8,0xB8,0xF0,0x00,0x00,0x00,0x00}}, +{ 0x204E, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00}}, +{ 0x204F, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x60,0x20,0x10,0x00}}, +{ 0x2050, {0x00,0x00,0x00,0x70,0x88,0x00,0x00,0x00,0x88,0x70,0x00,0x00,0x00}}, +{ 0x2051, {0x00,0x00,0x20,0xA8,0x70,0xA8,0x20,0xA8,0x70,0xA8,0x20,0x00,0x00}}, +{ 0x2052, {0x00,0x00,0xC8,0xC8,0x10,0x10,0x20,0x40,0x40,0x98,0x98,0x00,0x00}}, +{ 0x2057, {0x00,0x00,0x7C,0x7C,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x205F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2060, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2061, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2062, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2063, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2070, {0x40,0xA0,0xA0,0xA0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2071, {0x40,0x00,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2074, {0x80,0x80,0xC0,0xE0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2075, {0xE0,0x80,0xC0,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2076, {0x60,0x80,0xC0,0xA0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2077, {0xE0,0x20,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2078, {0x40,0xA0,0x40,0xA0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2079, {0x40,0xA0,0x60,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x207A, {0x00,0x40,0xE0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x207B, {0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x207C, {0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x207D, {0x40,0x80,0x80,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x207E, {0x40,0x20,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x207F, {0x00,0xC0,0xA0,0xA0,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2080, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0xA0,0xA0,0x40}}, +{ 0x2081, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xC0,0x40,0x40,0xE0}}, +{ 0x2082, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0x20,0x40,0xE0}}, +{ 0x2083, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0x40,0x20,0xC0}}, +{ 0x2084, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0xE0,0x40}}, +{ 0x2085, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x80,0xC0,0x20,0xC0}}, +{ 0x2086, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x80,0xC0,0xA0,0x40}}, +{ 0x2087, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x20,0x40,0x40,0x40}}, +{ 0x2088, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0x40,0xA0,0x40}}, +{ 0x2089, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA0,0x60,0x20,0xC0}}, +{ 0x208A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xE0,0x40,0x00}}, +{ 0x208B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00}}, +{ 0x208C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00}}, +{ 0x208D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x80,0x80,0x40}}, +{ 0x208E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x20,0x20,0x40}}, +{ 0x20A0, {0x00,0x00,0x00,0x60,0x80,0x80,0xB8,0xA0,0x70,0x20,0x38,0x00,0x00}}, +{ 0x20A1, {0x00,0x08,0x78,0x98,0x90,0xA0,0xA0,0xA0,0xC0,0xC8,0xF0,0x80,0x00}}, +{ 0x20A2, {0x00,0x00,0x70,0x88,0x80,0x80,0xA8,0xB0,0xA0,0xA8,0x70,0x00,0x00}}, +{ 0x20A3, {0x00,0x00,0xF8,0x80,0x80,0x80,0xE8,0xB0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x20A4, {0x00,0x00,0x30,0x48,0x40,0xE0,0x40,0xE0,0x40,0x48,0xB0,0x00,0x00}}, +{ 0x20A5, {0x00,0x00,0x00,0x10,0x10,0xD0,0xA8,0xA8,0xA8,0xA8,0xC8,0xC0,0x40}}, +{ 0x20A6, {0x00,0x00,0x48,0x48,0x68,0xFC,0x68,0xFC,0x58,0x58,0x48,0x00,0x00}}, +{ 0x20A7, {0x00,0x00,0x70,0x48,0xFC,0x48,0x70,0x40,0x40,0x40,0x40,0x00,0x00}}, +{ 0x20A8, {0x00,0x00,0xC0,0xA0,0xA0,0xA0,0xD8,0xA0,0xB0,0xA8,0xB0,0x00,0x00}}, +{ 0x20A9, {0x00,0x00,0x88,0x88,0xF8,0x88,0xF8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0x20AA, {0x00,0x00,0x64,0x94,0xB4,0xB4,0xB4,0xB4,0xB4,0xA4,0x98,0x00,0x00}}, +{ 0x20AB, {0x00,0x00,0x10,0x70,0x10,0x70,0x90,0x90,0x90,0x90,0x70,0x00,0xF0}}, +{ 0x20AC, {0x00,0x00,0x38,0x40,0x40,0xF0,0x40,0xF0,0x40,0x40,0x38,0x00,0x00}}, +{ 0x20AD, {0x00,0x00,0x44,0x44,0x48,0x50,0xFC,0x50,0x48,0x44,0x44,0x00,0x00}}, +{ 0x20AE, {0x00,0x00,0xF8,0x20,0x20,0x30,0x60,0x30,0x60,0x20,0x20,0x00,0x00}}, +{ 0x20AF, {0x00,0x00,0x40,0x70,0xC8,0x48,0x48,0x48,0x48,0xE8,0xD0,0x00,0x00}}, +{ 0x20B0, {0x00,0x00,0x10,0x28,0x28,0x28,0x10,0x10,0x50,0x68,0xA8,0x08,0x10}}, +{ 0x20B1, {0x00,0x00,0x60,0x50,0xF8,0xF8,0x50,0x60,0x40,0x40,0x40,0x00,0x00}}, +{ 0x20D0, {0x20,0x40,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20D1, {0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20D2, {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}}, +{ 0x20D3, {0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00}}, +{ 0x20D4, {0x00,0x30,0xC8,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20D5, {0x00,0x60,0x98,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20D6, {0x00,0x40,0xF8,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20D7, {0x00,0x10,0xF8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20D8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20,0x00,0x00,0x00}}, +{ 0x20D9, {0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x48,0xE8,0x48,0x30,0x00,0x00}}, +{ 0x20DA, {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xB8,0x90,0x60,0x00,0x00}}, +{ 0x20DB, {0x00,0xA8,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20DC, {0x00,0xB4,0xB4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20DD, {0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x78}}, +{ 0x20DE, {0xFC,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0xFC}}, +{ 0x20DF, {0x30,0x48,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30}}, +{ 0x20E0, {0x78,0xC4,0xA4,0xA4,0xA4,0xA4,0xA4,0x94,0x94,0x94,0x94,0x8C,0x78}}, +{ 0x20E1, {0x00,0x50,0xF8,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20E2, {0x00,0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x00}}, +{ 0x20E3, {0xFC,0xFC,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0xFC,0xFC}}, +{ 0x20E4, {0x30,0x48,0x48,0x48,0x48,0x48,0x84,0x84,0x84,0x84,0x84,0x84,0x78}}, +{ 0x20E5, {0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00,0x00}}, +{ 0x20E6, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x20E7, {0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00}}, +{ 0x20E8, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8}}, +{ 0x20E9, {0x00,0xF8,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x20EA, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0xF8,0x40,0x20,0x00,0x00,0x00}}, +{ 0x2100, {0x00,0x00,0x68,0xA8,0xA8,0x70,0x60,0x58,0xA0,0xA0,0x98,0x00,0x00}}, +{ 0x2101, {0x00,0x00,0x68,0xA8,0xA8,0x70,0x38,0x60,0x90,0x88,0xB0,0x00,0x00}}, +{ 0x2102, {0x00,0x00,0x70,0xA8,0xA0,0xA0,0xA0,0xA0,0xA0,0xA8,0x70,0x00,0x00}}, +{ 0x2103, {0x40,0xA0,0x40,0x38,0x40,0x40,0x40,0x40,0x40,0x40,0x38,0x00,0x00}}, +{ 0x2104, {0x00,0x00,0x20,0x20,0x70,0xA0,0xA0,0xA0,0x70,0x20,0x38,0x00,0x00}}, +{ 0x2105, {0x00,0x00,0x48,0x88,0x90,0x50,0x20,0x50,0x68,0xA8,0x90,0x00,0x00}}, +{ 0x2106, {0x00,0x00,0x48,0x88,0x90,0x50,0x20,0x68,0x68,0xA8,0x90,0x00,0x00}}, +{ 0x2107, {0x00,0x00,0x78,0x88,0x80,0x80,0x60,0x80,0x88,0x88,0x70,0x00,0x00}}, +{ 0x2108, {0x00,0x00,0x60,0x90,0x08,0x48,0x78,0x48,0x08,0x90,0x60,0x00,0x00}}, +{ 0x2109, {0x40,0xA0,0x40,0x78,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,0x00}}, +{ 0x210A, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x88,0x88,0x70,0x10,0x90,0x60}}, +{ 0x210B, {0x00,0x00,0xC8,0x48,0x48,0x48,0x78,0x90,0x90,0x90,0x98,0x00,0x00}}, +{ 0x210C, {0x00,0x00,0x68,0x90,0x80,0xB0,0xC8,0x48,0x28,0xA8,0x48,0x10,0x20}}, +{ 0x210D, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xB8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x210E, {0x00,0x00,0x20,0x20,0x20,0x40,0x70,0x48,0x48,0x90,0x90,0x00,0x00}}, +{ 0x210F, {0x00,0x00,0x20,0x30,0x60,0xC0,0x70,0x48,0x48,0x90,0x90,0x00,0x00}}, +{ 0x2110, {0x00,0x00,0x38,0x08,0x08,0x10,0x10,0x10,0x20,0xA0,0x40,0x00,0x00}}, +{ 0x2111, {0x00,0x00,0xF8,0x88,0x48,0x08,0x10,0x10,0x08,0xC8,0x30,0x00,0x00}}, +{ 0x2112, {0x00,0x00,0x18,0x54,0x38,0x10,0x10,0x20,0x60,0xA8,0x50,0x00,0x00}}, +{ 0x2113, {0x00,0x00,0x10,0x28,0x28,0x28,0x28,0x28,0x10,0x30,0x48,0x00,0x00}}, +{ 0x2114, {0x00,0x00,0xA0,0xF8,0xA0,0xB0,0xA8,0xA8,0xA8,0xA8,0xB0,0x00,0x00}}, +{ 0x2115, {0x00,0x00,0xC4,0xC4,0xA4,0xA4,0xB4,0xB4,0xAC,0xAC,0xA4,0x00,0x00}}, +{ 0x2116, {0x00,0x00,0x90,0x90,0xD0,0xD0,0xDC,0xB4,0xB4,0x94,0x9C,0x00,0x00}}, +{ 0x2117, {0x00,0x00,0x70,0x88,0xE8,0xD8,0xE8,0xC8,0xC8,0x88,0x70,0x00,0x00}}, +{ 0x2118, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x2119, {0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0xB0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x211A, {0x00,0x00,0x70,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x08,0x00}}, +{ 0x211B, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0xA0,0x90,0x90,0x90,0x00,0x00}}, +{ 0x211C, {0x00,0x00,0xF0,0xA8,0x68,0x28,0x30,0x30,0xB0,0xA8,0x48,0x00,0x00}}, +{ 0x211D, {0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xB0,0xB0,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x211E, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA8,0x90,0xA8,0x88,0x00,0x00}}, +{ 0x211F, {0x60,0x20,0xF0,0xA8,0xA8,0xA8,0xF0,0xA0,0xB0,0xA8,0xA8,0x20,0x00}}, +{ 0x2120, {0x68,0xB8,0x68,0xA8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2121, {0x00,0xE0,0x40,0x70,0x60,0x30,0x20,0x30,0x00,0x10,0x10,0x10,0x18}}, +{ 0x2122, {0x00,0x00,0xF4,0x5C,0x54,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2123, {0x60,0x20,0xA8,0xA8,0xA8,0xA8,0x70,0x70,0x70,0x20,0x20,0x20,0x00}}, +{ 0x2124, {0x00,0x00,0xF8,0x28,0x28,0x50,0x50,0x50,0xA0,0xA0,0xF8,0x00,0x00}}, +{ 0x2125, {0x00,0x00,0x78,0x10,0x20,0x78,0x10,0x20,0x70,0x08,0x08,0x88,0x70}}, +{ 0x2126, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x50,0x50,0xD8,0x00,0x00}}, +{ 0x2127, {0x00,0x00,0xD8,0x50,0x50,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x2128, {0x00,0x00,0x70,0x88,0x08,0x48,0x30,0x48,0x08,0x88,0x70,0x00,0x00}}, +{ 0x2129, {0x00,0x00,0x00,0x00,0x00,0x60,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x212A, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0x212B, {0x00,0x20,0x50,0x20,0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00,0x00}}, +{ 0x212C, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x90,0x90,0x90,0xE0,0x00,0x00}}, +{ 0x212D, {0x00,0x00,0x38,0x50,0x90,0x88,0xA8,0x90,0x80,0x88,0x70,0x00,0x00}}, +{ 0x212E, {0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0xF8,0xC0,0xC8,0x70,0x00,0x00}}, +{ 0x212F, {0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x78,0x80,0x90,0x60,0x00,0x00}}, +{ 0x2130, {0x00,0x00,0x70,0x88,0x88,0x80,0x60,0x80,0x88,0x88,0x70,0x00,0x00}}, +{ 0x2131, {0x00,0x00,0x7C,0x90,0x10,0x10,0x78,0x20,0x20,0xA0,0x40,0x00,0x00}}, +{ 0x2132, {0x00,0x00,0x08,0x08,0x08,0x08,0x78,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x2133, {0x00,0x00,0x44,0x6C,0x54,0x54,0x44,0x88,0x88,0x88,0x84,0x00,0x00}}, +{ 0x2134, {0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x90,0x90,0xE0,0x00,0x00}}, +{ 0x2135, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x00}}, +{ 0x2136, {0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xF8,0x00,0x00}}, +{ 0x2137, {0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x28,0x48,0x00,0x00}}, +{ 0x2138, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0x2139, {0x00,0x00,0x30,0x30,0x00,0x70,0x30,0x30,0x30,0x30,0x78,0x00,0x00}}, +{ 0x213A, {0x00,0x00,0x00,0x00,0x00,0x04,0x7C,0x8C,0x84,0x84,0x78,0x00,0x00}}, +{ 0x213D, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0x50,0x50,0xA0,0xA0,0xC0}}, +{ 0x213E, {0x00,0x00,0xF8,0xA8,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x213F, {0x00,0x00,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x2140, {0x00,0x00,0xF8,0xA0,0x50,0x50,0x28,0x50,0x50,0xA0,0xF8,0x00,0x00}}, +{ 0x2141, {0x00,0x00,0x70,0x88,0x88,0xC8,0x08,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x2142, {0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x2143, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x2144, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x2145, {0x00,0x00,0x78,0x54,0x54,0x54,0xA8,0xA8,0xA8,0xA8,0xF0,0x00,0x00}}, +{ 0x2146, {0x00,0x00,0x14,0x14,0x14,0x74,0xA8,0xA8,0xA8,0xA8,0x68,0x00,0x00}}, +{ 0x2147, {0x00,0x00,0x00,0x00,0x00,0x38,0x54,0x54,0xB8,0xA0,0x78,0x00,0x00}}, +{ 0x2148, {0x00,0x00,0x10,0x10,0x00,0x78,0x28,0x28,0x50,0x50,0x50,0x00,0x00}}, +{ 0x2149, {0x00,0x00,0x10,0x10,0x00,0x78,0x28,0x28,0x50,0x50,0x50,0x50,0xE0}}, +{ 0x214A, {0x00,0x00,0x20,0x20,0xF0,0xA8,0xA8,0xA8,0xB0,0x20,0x38,0x00,0x00}}, +{ 0x214B, {0x00,0x00,0x00,0xB0,0x48,0xC8,0x28,0x10,0x28,0x28,0x10,0x00,0x00}}, +{ 0x2153, {0x00,0x00,0x80,0x80,0x80,0x80,0x90,0x28,0x10,0x08,0x30,0x00,0x00}}, +{ 0x2154, {0x00,0x00,0x40,0xA0,0x40,0x80,0xF0,0x28,0x10,0x08,0x30,0x00,0x00}}, +{ 0x2155, {0x00,0x00,0x80,0x80,0x80,0x80,0xB8,0x20,0x30,0x08,0x30,0x00,0x00}}, +{ 0x2156, {0x00,0x40,0xA0,0x40,0x80,0xE0,0x38,0x20,0x30,0x08,0x30,0x00,0x00}}, +{ 0x2157, {0x00,0x40,0xA0,0x40,0x20,0xC0,0x38,0x20,0x30,0x08,0x30,0x00,0x00}}, +{ 0x2158, {0x00,0x00,0x80,0xC0,0xE0,0x40,0x38,0x20,0x30,0x08,0x30,0x00,0x00}}, +{ 0x2159, {0x00,0x00,0x80,0x80,0x80,0x80,0x98,0x20,0x30,0x28,0x10,0x00,0x00}}, +{ 0x215A, {0x00,0x00,0xE0,0x80,0xC0,0x20,0xD8,0x20,0x30,0x28,0x10,0x00,0x00}}, +{ 0x215B, {0x00,0x00,0x80,0x80,0x80,0x80,0x90,0x28,0x10,0x28,0x10,0x00,0x00}}, +{ 0x215C, {0x00,0x00,0x40,0xA0,0x40,0x20,0xD0,0x28,0x10,0x28,0x10,0x00,0x00}}, +{ 0x215D, {0x00,0x00,0xE0,0x80,0xE0,0x20,0xD0,0x28,0x10,0x28,0x10,0x00,0x00}}, +{ 0x215E, {0x00,0x00,0xE0,0x20,0x40,0x40,0x50,0x28,0x10,0x28,0x10,0x00,0x00}}, +{ 0x215F, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2160, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2161, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x2162, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x2163, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x90,0x90,0x00,0x00}}, +{ 0x2164, {0x00,0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x2165, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x48,0x48,0x00,0x00}}, +{ 0x2166, {0x00,0x00,0xD4,0xD4,0xD4,0xD4,0xD4,0xD4,0xD4,0x54,0x54,0x00,0x00}}, +{ 0x2167, {0x00,0x00,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0x5C,0x5C,0x00,0x00}}, +{ 0x2168, {0x00,0x00,0xA8,0xA8,0xA8,0x90,0x90,0x90,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x2169, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x216A, {0x00,0x00,0xA8,0xA8,0xA8,0x48,0x48,0x48,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x216B, {0x00,0x00,0xAC,0xAC,0xAC,0x4C,0x4C,0x4C,0xAC,0xAC,0xAC,0x00,0x00}}, +{ 0x216C, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x216D, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x216E, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0x216F, {0x00,0x00,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x2170, {0x00,0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2171, {0x00,0x00,0x00,0x50,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x2172, {0x00,0x00,0x00,0xA8,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x2173, {0x00,0x00,0x00,0x80,0x00,0xA8,0xA8,0xA8,0xA8,0x90,0x90,0x00,0x00}}, +{ 0x2174, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x2175, {0x00,0x00,0x00,0x08,0x00,0xA8,0xA8,0xA8,0xA8,0x48,0x48,0x00,0x00}}, +{ 0x2176, {0x00,0x00,0x00,0x14,0x00,0xD4,0xD4,0xD4,0xD4,0x54,0x54,0x00,0x00}}, +{ 0x2177, {0x00,0x00,0x00,0x1C,0x00,0xDC,0xDC,0xDC,0xDC,0x5C,0x5C,0x00,0x00}}, +{ 0x2178, {0x00,0x00,0x00,0x80,0x00,0xA8,0xA8,0x90,0x90,0xA8,0xA8,0x00,0x00}}, +{ 0x2179, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,0x00}}, +{ 0x217A, {0x00,0x00,0x00,0x08,0x00,0xA8,0xA8,0x48,0x48,0xA8,0xA8,0x00,0x00}}, +{ 0x217B, {0x00,0x00,0x00,0x0C,0x00,0xAC,0xAC,0x4C,0x4C,0xAC,0xAC,0x00,0x00}}, +{ 0x217C, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0x217D, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0x217E, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0x217F, {0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0x2180, {0x00,0x00,0x70,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x2181, {0x00,0x00,0xF0,0x88,0xE8,0xA8,0xA8,0xA8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0x2182, {0x00,0x00,0x70,0xA8,0xA8,0xF8,0xA8,0xF8,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x2183, {0x00,0x00,0x70,0x88,0x08,0x08,0x08,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0x2190, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0xF8,0x40,0x20,0x00,0x00,0x00}}, +{ 0x2191, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2192, {0x00,0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x10,0x20,0x00,0x00,0x00}}, +{ 0x2193, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x2194, {0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xFC,0x48,0x00,0x00,0x00,0x00}}, +{ 0x2195, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x2196, {0x00,0x00,0xC0,0xF0,0xE0,0xA0,0x20,0x10,0x10,0x08,0x08,0x00,0x00}}, +{ 0x2197, {0x00,0x00,0x18,0x78,0x38,0x28,0x20,0x40,0x40,0x80,0x80,0x00,0x00}}, +{ 0x2198, {0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x28,0x38,0x78,0x18,0x00,0x00}}, +{ 0x2199, {0x00,0x00,0x08,0x08,0x10,0x10,0x20,0xA0,0xE0,0xF0,0xC0,0x00,0x00}}, +{ 0x219A, {0x00,0x00,0x00,0x00,0x00,0x28,0x48,0xFC,0x50,0x30,0x00,0x00,0x00}}, +{ 0x219B, {0x00,0x00,0x00,0x00,0x00,0x30,0x28,0xFC,0x48,0x50,0x00,0x00,0x00}}, +{ 0x219C, {0x00,0x00,0x00,0x00,0x00,0xC0,0xD8,0x64,0x00,0x00,0x00,0x00,0x00}}, +{ 0x219D, {0x00,0x00,0x00,0x00,0x00,0x0C,0x6C,0x98,0x00,0x00,0x00,0x00,0x00}}, +{ 0x219E, {0x00,0x00,0x00,0x00,0x00,0x28,0x50,0xFC,0x50,0x28,0x00,0x00,0x00}}, +{ 0x219F, {0x00,0x00,0x20,0x70,0xA8,0x70,0xA8,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x21A0, {0x00,0x00,0x00,0x00,0x00,0x50,0x28,0xFC,0x28,0x50,0x00,0x00,0x00}}, +{ 0x21A1, {0x00,0x00,0x20,0x20,0x20,0x20,0xA8,0x70,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x21A2, {0x00,0x00,0x00,0x00,0x00,0x24,0x48,0xF0,0x48,0x24,0x00,0x00,0x00}}, +{ 0x21A3, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x3C,0x48,0x90,0x00,0x00,0x00}}, +{ 0x21A4, {0x00,0x00,0x00,0x00,0x00,0x20,0x48,0xF8,0x48,0x20,0x00,0x00,0x00}}, +{ 0x21A5, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x21A6, {0x00,0x00,0x00,0x00,0x00,0x20,0x90,0xF8,0x90,0x20,0x00,0x00,0x00}}, +{ 0x21A7, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x21A8, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0xA8,0x70,0x20,0xF8,0x00,0x00}}, +{ 0x21A9, {0x00,0x00,0x00,0x00,0x00,0x28,0x44,0xF8,0x40,0x20,0x00,0x00,0x00}}, +{ 0x21AA, {0x00,0x00,0x00,0x00,0x00,0x50,0x88,0x7C,0x08,0x10,0x00,0x00,0x00}}, +{ 0x21AB, {0x00,0x00,0x00,0x00,0x00,0x20,0x4C,0xFC,0x48,0x28,0x00,0x00,0x00}}, +{ 0x21AC, {0x00,0x00,0x00,0x00,0x00,0x10,0xC8,0xFC,0x48,0x50,0x00,0x00,0x00}}, +{ 0x21AD, {0x00,0x00,0x00,0x00,0x00,0x48,0xDC,0xEC,0x48,0x00,0x00,0x00,0x00}}, +{ 0x21AE, {0x00,0x00,0x00,0x00,0x00,0x08,0x58,0xFC,0x68,0x40,0x00,0x00,0x00}}, +{ 0x21AF, {0x00,0x00,0x80,0x80,0x90,0xB0,0xD0,0x90,0x10,0x38,0x10,0x00,0x00}}, +{ 0x21B0, {0x00,0x00,0x20,0x40,0xF8,0x48,0x28,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x21B1, {0x00,0x00,0x20,0x10,0xF8,0x90,0xA0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x21B2, {0x00,0x00,0x08,0x08,0x08,0x08,0x28,0x48,0xF8,0x40,0x20,0x00,0x00}}, +{ 0x21B3, {0x00,0x00,0x80,0x80,0x80,0x80,0xA0,0x90,0xF8,0x10,0x20,0x00,0x00}}, +{ 0x21B4, {0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x10,0x38,0x10,0x00,0x00,0x00}}, +{ 0x21B5, {0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x48,0xF8,0x40,0x00,0x00,0x00}}, +{ 0x21B6, {0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0xE8,0x48,0x00,0x00,0x00}}, +{ 0x21B7, {0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0xB8,0x90,0x00,0x00,0x00}}, +{ 0x21B8, {0x00,0x00,0xF8,0x80,0xE0,0xC0,0xA0,0x20,0x10,0x10,0x08,0x00,0x00}}, +{ 0x21B9, {0x00,0x00,0xA0,0xC0,0xF8,0xC0,0xA8,0x18,0xF8,0x18,0x28,0x00,0x00}}, +{ 0x21BA, {0x00,0x00,0x00,0x00,0x38,0x30,0xA8,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x21BB, {0x00,0x00,0x00,0x00,0xE0,0x60,0xA8,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x21BC, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0xF8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x21BD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x40,0x20,0x00,0x00,0x00}}, +{ 0x21BE, {0x00,0x00,0x20,0x30,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x21BF, {0x00,0x00,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x21C0, {0x00,0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x21C1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x00,0x00,0x00}}, +{ 0x21C2, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x28,0x30,0x20,0x00,0x00}}, +{ 0x21C3, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x60,0x20,0x00,0x00}}, +{ 0x21C4, {0x00,0x00,0x20,0x10,0xF8,0x10,0x20,0x40,0xF8,0x40,0x20,0x00,0x00}}, +{ 0x21C5, {0x00,0x00,0x50,0xF0,0x50,0x50,0x50,0x50,0x50,0x78,0x50,0x00,0x00}}, +{ 0x21C6, {0x00,0x00,0x20,0x40,0xF8,0x40,0x20,0x10,0xF8,0x10,0x20,0x00,0x00}}, +{ 0x21C7, {0x00,0x00,0x20,0x40,0xF8,0x40,0x20,0x40,0xF8,0x40,0x20,0x00,0x00}}, +{ 0x21C8, {0x00,0x00,0x50,0xF8,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x21C9, {0x00,0x00,0x20,0x10,0xF8,0x10,0x20,0x10,0xF8,0x10,0x20,0x00,0x00}}, +{ 0x21CA, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0xF8,0x50,0x00,0x00}}, +{ 0x21CB, {0x00,0x00,0x00,0x00,0x20,0x40,0xF8,0x00,0xF8,0x10,0x20,0x00,0x00}}, +{ 0x21CC, {0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x00,0xF8,0x40,0x20,0x00,0x00}}, +{ 0x21CD, {0x00,0x00,0x00,0x00,0x14,0x28,0x7C,0x90,0x7C,0x20,0x50,0x00,0x00}}, +{ 0x21CE, {0x00,0x00,0x00,0x00,0x08,0x58,0xFC,0xA4,0xFC,0x68,0x40,0x00,0x00}}, +{ 0x21CF, {0x00,0x00,0x00,0x00,0xA0,0x50,0xF8,0x24,0xF8,0x10,0x28,0x00,0x00}}, +{ 0x21D0, {0x00,0x00,0x00,0x00,0x10,0x20,0x7C,0x80,0x7C,0x20,0x10,0x00,0x00}}, +{ 0x21D1, {0x00,0x00,0x20,0x50,0xD8,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x21D2, {0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x04,0xF8,0x10,0x20,0x00,0x00}}, +{ 0x21D3, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0xD8,0x50,0x20,0x00,0x00}}, +{ 0x21D4, {0x00,0x00,0x00,0x00,0x00,0x48,0xFC,0x84,0xFC,0x48,0x00,0x00,0x00}}, +{ 0x21D5, {0x00,0x00,0x20,0x50,0xD8,0x50,0x50,0x50,0xD8,0x50,0x20,0x00,0x00}}, +{ 0x21D6, {0x00,0x00,0x00,0x00,0xF8,0xA0,0xD0,0xA8,0x94,0x08,0x00,0x00,0x00}}, +{ 0x21D7, {0x00,0x00,0x00,0x00,0x7C,0x14,0x2C,0x54,0xA4,0x40,0x00,0x00,0x00}}, +{ 0x21D8, {0x00,0x00,0x00,0x00,0x40,0xA4,0x54,0x2C,0x14,0x7C,0x00,0x00,0x00}}, +{ 0x21D9, {0x00,0x00,0x00,0x00,0x08,0x94,0xA8,0xD0,0xA0,0xF8,0x00,0x00,0x00}}, +{ 0x21DA, {0x00,0x00,0x00,0x00,0x10,0x3C,0x40,0xFC,0x40,0x3C,0x10,0x00,0x00}}, +{ 0x21DB, {0x00,0x00,0x00,0x00,0x20,0xF0,0x08,0xFC,0x08,0xF0,0x20,0x00,0x00}}, +{ 0x21DC, {0x00,0x00,0x00,0x00,0x00,0x40,0xE8,0xD4,0x40,0x00,0x00,0x00,0x00}}, +{ 0x21DD, {0x00,0x00,0x00,0x00,0x00,0x08,0x5C,0xAC,0x08,0x00,0x00,0x00,0x00}}, +{ 0x21DE, {0x00,0x00,0x20,0x70,0xA8,0x20,0x70,0x20,0x70,0x20,0x20,0x00,0x00}}, +{ 0x21DF, {0x00,0x00,0x20,0x20,0x70,0x20,0x70,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x21E0, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0xA8,0x40,0x20,0x00,0x00,0x00}}, +{ 0x21E1, {0x00,0x00,0x20,0x70,0xA8,0x00,0x20,0x20,0x00,0x20,0x20,0x00,0x00}}, +{ 0x21E2, {0x00,0x00,0x00,0x00,0x00,0x20,0x10,0xA8,0x10,0x20,0x00,0x00,0x00}}, +{ 0x21E3, {0x00,0x00,0x20,0x20,0x00,0x20,0x20,0x00,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x21E4, {0x00,0x00,0x00,0x00,0x00,0xA0,0xC0,0xF8,0xC0,0xA0,0x00,0x00,0x00}}, +{ 0x21E5, {0x00,0x00,0x00,0x00,0x00,0x28,0x18,0xF8,0x18,0x28,0x00,0x00,0x00}}, +{ 0x21E6, {0x00,0x00,0x00,0x00,0x00,0x20,0x78,0x88,0x78,0x20,0x00,0x00,0x00}}, +{ 0x21E7, {0x00,0x00,0x20,0x50,0xD8,0x50,0x50,0x50,0x50,0x50,0x70,0x00,0x00}}, +{ 0x21E8, {0x00,0x00,0x00,0x00,0x00,0x20,0xF0,0x88,0xF0,0x20,0x00,0x00,0x00}}, +{ 0x21E9, {0x00,0x00,0x70,0x50,0x50,0x50,0x50,0x50,0xD8,0x50,0x20,0x00,0x00}}, +{ 0x21EA, {0x00,0x20,0x50,0xD8,0x50,0x50,0x70,0x00,0x70,0x50,0x70,0x00,0x00}}, +{ 0x21EB, {0x00,0x00,0x20,0x50,0xD8,0x50,0x50,0x50,0xD8,0x88,0xF8,0x00,0x00}}, +{ 0x21EC, {0x00,0x00,0x20,0x50,0xF8,0x88,0x50,0x50,0xD8,0x88,0xF8,0x00,0x00}}, +{ 0x21ED, {0x00,0x00,0x20,0x70,0xF8,0x70,0x70,0x70,0xF8,0xA8,0xF8,0x00,0x00}}, +{ 0x21EE, {0x00,0x00,0x20,0x50,0xD8,0x50,0xD8,0x50,0x50,0x50,0x70,0x00,0x00}}, +{ 0x21EF, {0x00,0x00,0x20,0x50,0xD8,0x50,0xD8,0x50,0xD8,0x88,0xF8,0x00,0x00}}, +{ 0x21F0, {0x00,0x00,0x00,0x00,0x00,0xA0,0xF0,0x88,0xF0,0xA0,0x00,0x00,0x00}}, +{ 0x21F1, {0x00,0x00,0xF8,0x80,0xB0,0xE0,0x90,0x10,0x08,0x08,0x00,0x00,0x00}}, +{ 0x21F2, {0x00,0x00,0x00,0x80,0x80,0x40,0x48,0x38,0x68,0x08,0xF8,0x00,0x00}}, +{ 0x21F3, {0x00,0x00,0x20,0x50,0xD8,0x50,0x50,0x50,0xD8,0x50,0x20,0x00,0x00}}, +{ 0x21F4, {0x00,0x00,0x00,0x00,0x00,0x10,0x68,0xFC,0x68,0x10,0x00,0x00,0x00}}, +{ 0x21F5, {0x00,0x00,0x50,0x78,0x50,0x50,0x50,0x50,0x50,0xF0,0x50,0x00,0x00}}, +{ 0x21F6, {0x00,0x00,0x10,0xF8,0x10,0x10,0xF8,0x10,0x10,0xF8,0x10,0x00,0x00}}, +{ 0x21F7, {0x00,0x00,0x00,0x00,0x00,0x28,0x48,0xFC,0x48,0x28,0x00,0x00,0x00}}, +{ 0x21F8, {0x00,0x00,0x00,0x00,0x00,0x50,0x48,0xFC,0x48,0x50,0x00,0x00,0x00}}, +{ 0x21F9, {0x00,0x00,0x00,0x00,0x30,0x78,0xFC,0x78,0x30,0x00,0x00,0x00,0x00}}, +{ 0x21FA, {0x00,0x00,0x00,0x00,0x00,0x38,0x58,0xFC,0x58,0x38,0x00,0x00,0x00}}, +{ 0x21FB, {0x00,0x00,0x00,0x00,0x00,0x70,0x68,0xFC,0x68,0x70,0x00,0x00,0x00}}, +{ 0x21FC, {0x00,0x00,0x00,0x00,0x30,0x78,0xFC,0x78,0x30,0x00,0x00,0x00,0x00}}, +{ 0x21FD, {0x00,0x00,0x00,0x00,0x00,0x20,0x60,0xB8,0x60,0x20,0x00,0x00,0x00}}, +{ 0x21FE, {0x00,0x00,0x00,0x00,0x00,0x20,0x30,0xE8,0x30,0x20,0x00,0x00,0x00}}, +{ 0x21FF, {0x00,0x00,0x00,0x00,0x30,0x78,0xB4,0x78,0x30,0x00,0x00,0x00,0x00}}, +{ 0x2200, {0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x2201, {0x00,0x00,0x20,0x50,0x40,0x40,0x40,0x40,0x40,0x50,0x20,0x00,0x00}}, +{ 0x2202, {0x00,0x00,0x00,0x30,0x48,0x08,0x38,0x48,0x48,0x48,0x30,0x00,0x00}}, +{ 0x2203, {0x00,0x00,0xF8,0x08,0x08,0x08,0x78,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x2204, {0x10,0x10,0xF8,0x18,0x28,0x28,0x78,0x28,0x28,0x48,0xF8,0x40,0x40}}, +{ 0x2205, {0x00,0x10,0x10,0x70,0x98,0xA8,0xA8,0xA8,0xC8,0x70,0x40,0x40,0x00}}, +{ 0x2206, {0x00,0x00,0x20,0x20,0x20,0x50,0x50,0x50,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x2207, {0x00,0x00,0xF8,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2208, {0x00,0x00,0x00,0x00,0x38,0x40,0x80,0xF0,0x80,0x40,0x38,0x00,0x00}}, +{ 0x2209, {0x00,0x00,0x20,0x20,0x38,0x60,0xA0,0xF0,0xA0,0x60,0x38,0x20,0x20}}, +{ 0x220A, {0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x70,0x40,0x38,0x00,0x00,0x00}}, +{ 0x220B, {0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x78,0x08,0x10,0xE0,0x00,0x00}}, +{ 0x220C, {0x00,0x00,0x20,0x20,0xE0,0x30,0x28,0x78,0x28,0x30,0xE0,0x20,0x20}}, +{ 0x220D, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x38,0x08,0x70,0x00,0x00,0x00}}, +{ 0x220E, {0x00,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0x00}}, +{ 0x220F, {0x00,0xFC,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xEC,0x00}}, +{ 0x2210, {0x00,0xEC,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xFC,0x00}}, +{ 0x2211, {0x00,0xFC,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0xFC,0x00}}, +{ 0x2212, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2213, {0x00,0x00,0x00,0xF8,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00}}, +{ 0x2214, {0x00,0x00,0x00,0x20,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00}}, +{ 0x2215, {0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00,0x00}}, +{ 0x2216, {0x00,0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x00,0x00}}, +{ 0x2217, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2218, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2219, {0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x221A, {0x00,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x90,0x90,0x60,0x60,0x20}}, +{ 0x221B, {0x00,0x04,0x44,0xA4,0x48,0x28,0xC8,0x10,0x90,0x90,0x60,0x60,0x20}}, +{ 0x221C, {0x00,0x04,0x84,0x84,0xC8,0xE8,0x48,0x10,0x90,0x90,0x60,0x60,0x20}}, +{ 0x221D, {0x00,0x00,0x00,0x00,0x00,0x50,0xA0,0xA0,0x50,0x00,0x00,0x00,0x00}}, +{ 0x221E, {0x00,0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0x50,0x00,0x00,0x00,0x00}}, +{ 0x221F, {0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x2220, {0x00,0x00,0x00,0x00,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x2221, {0x00,0x00,0x00,0x00,0x08,0x90,0x60,0x60,0xA0,0xF8,0x20,0x00,0x00}}, +{ 0x2222, {0x00,0x00,0x08,0x10,0x30,0x48,0x88,0x48,0x30,0x10,0x08,0x00,0x00}}, +{ 0x2223, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2224, {0x00,0x00,0x20,0x20,0x20,0x30,0x20,0x60,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2225, {0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0x2226, {0x00,0x00,0x50,0x50,0x58,0x50,0x70,0x50,0xD0,0x50,0x50,0x00,0x00}}, +{ 0x2227, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x00,0x00}}, +{ 0x2228, {0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x2229, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x222A, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x222B, {0x10,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40}}, +{ 0x222C, {0x00,0x24,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x90}}, +{ 0x222D, {0x00,0x54,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xD0}}, +{ 0x222E, {0x10,0x28,0x20,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x20,0xA0,0x40}}, +{ 0x222F, {0x00,0x24,0x48,0x48,0x78,0xCC,0xCC,0xCC,0x78,0x48,0x48,0x48,0x90}}, +{ 0x2230, {0x00,0x54,0xA8,0xA8,0xF8,0xAC,0xAC,0xAC,0xF8,0xA8,0xA8,0xA8,0xD0}}, +{ 0x2231, {0x10,0x28,0x20,0x20,0x20,0x74,0xAC,0x3C,0x20,0x20,0x20,0xA0,0x40}}, +{ 0x2232, {0x10,0x28,0x20,0x20,0x74,0xAC,0xBC,0xA8,0x70,0x20,0x20,0xA0,0x40}}, +{ 0x2233, {0x10,0x28,0x20,0x20,0x70,0xA8,0xBC,0xAC,0x74,0x20,0x20,0xA0,0x40}}, +{ 0x2234, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x88,0x00,0x00,0x00}}, +{ 0x2235, {0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x00,0x00,0x20,0x00,0x00,0x00}}, +{ 0x2236, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00}}, +{ 0x2237, {0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x48,0x00,0x00,0x00}}, +{ 0x2238, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2239, {0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xE0,0x00,0x08,0x00,0x00,0x00}}, +{ 0x223A, {0x00,0x00,0x00,0x00,0x00,0x88,0x00,0xF8,0x00,0x88,0x00,0x00,0x00}}, +{ 0x223B, {0x00,0x00,0x00,0x00,0x00,0x10,0x40,0xA8,0xA8,0x10,0x40,0x00,0x00}}, +{ 0x223C, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA8,0xA8,0x10,0x00,0x00,0x00}}, +{ 0x223D, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xA8,0xA8,0x40,0x00,0x00,0x00}}, +{ 0x223E, {0x00,0x00,0x00,0x00,0x00,0x48,0xA4,0x94,0x48,0x00,0x00,0x00,0x00}}, +{ 0x223F, {0x00,0x00,0x00,0x40,0xA0,0xA0,0xA0,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x2240, {0x00,0x00,0x20,0x10,0x10,0x10,0x20,0x40,0x40,0x40,0x20,0x00,0x00}}, +{ 0x2241, {0x00,0x00,0x00,0x00,0x20,0x20,0x60,0xA8,0xA8,0x30,0x20,0x00,0x00}}, +{ 0x2242, {0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x48,0xA8,0x90,0x00,0x00,0x00}}, +{ 0x2243, {0x00,0x00,0x00,0x00,0x00,0x48,0xA8,0x90,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2244, {0x00,0x00,0x00,0x20,0x20,0x68,0xA8,0xB0,0x20,0xF8,0x20,0x00,0x00}}, +{ 0x2245, {0x00,0x00,0x00,0x48,0xA8,0x90,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2246, {0x00,0x00,0x00,0x48,0xA8,0x90,0x20,0xF8,0x20,0xF8,0x20,0x00,0x00}}, +{ 0x2247, {0x00,0x00,0x20,0x68,0xA8,0xB0,0x20,0xF8,0x20,0xF8,0x20,0x00,0x00}}, +{ 0x2248, {0x00,0x00,0x00,0x00,0x48,0xA8,0x90,0x48,0xA8,0x90,0x00,0x00,0x00}}, +{ 0x2249, {0x00,0x00,0x20,0x20,0x68,0xA8,0xB0,0x68,0xA8,0xB0,0x20,0x20,0x00}}, +{ 0x224A, {0x00,0x00,0x00,0x48,0xA8,0x90,0x48,0xA8,0x90,0x00,0xF8,0x00,0x00}}, +{ 0x224B, {0x00,0x00,0x48,0xA8,0x90,0x48,0xA8,0x90,0x48,0xA8,0x90,0x00,0x00}}, +{ 0x224C, {0x00,0x00,0x00,0x90,0xA8,0x48,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x224D, {0x00,0x00,0x00,0x00,0x00,0x88,0x70,0x00,0x70,0x88,0x00,0x00,0x00}}, +{ 0x224E, {0x00,0x00,0x00,0x00,0x00,0x20,0xD8,0x00,0xD8,0x20,0x00,0x00,0x00}}, +{ 0x224F, {0x00,0x00,0x00,0x00,0x00,0x20,0xD8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2250, {0x00,0x00,0x00,0x00,0x20,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2251, {0x00,0x00,0x00,0x00,0x20,0x00,0xF8,0x00,0xF8,0x00,0x20,0x00,0x00}}, +{ 0x2252, {0x00,0x00,0x00,0x00,0x80,0x00,0xF8,0x00,0xF8,0x00,0x08,0x00,0x00}}, +{ 0x2253, {0x00,0x00,0x00,0x00,0x08,0x00,0xF8,0x00,0xF8,0x00,0x80,0x00,0x00}}, +{ 0x2254, {0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x00,0xB8,0x00,0x00,0x00,0x00}}, +{ 0x2255, {0x00,0x00,0x00,0x00,0x00,0x00,0xE8,0x00,0xE8,0x00,0x00,0x00,0x00}}, +{ 0x2256, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2257, {0x00,0x00,0x20,0x50,0x20,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2258, {0x00,0x00,0x00,0x70,0x88,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2259, {0x00,0x00,0x00,0x20,0x50,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x225A, {0x00,0x00,0x88,0x50,0x20,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x225B, {0x00,0x00,0xA8,0x70,0xF8,0x70,0xA8,0x00,0xF8,0x00,0xF8,0x00,0x00}}, +{ 0x225C, {0x00,0x00,0x20,0x50,0x50,0x88,0xF8,0x00,0xF8,0x00,0xF8,0x00,0x00}}, +{ 0x225D, {0x00,0x00,0x4C,0xF8,0xF8,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x225E, {0x00,0x00,0xD0,0xA8,0xA8,0xA8,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x225F, {0x20,0x50,0x10,0x20,0x00,0x20,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2260, {0x00,0x00,0x00,0x00,0x00,0x08,0xF8,0x20,0xF8,0x80,0x00,0x00,0x00}}, +{ 0x2261, {0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2262, {0x00,0x00,0x00,0x10,0x10,0xF8,0x20,0xF8,0x20,0xF8,0x40,0x40,0x00}}, +{ 0x2263, {0x00,0x00,0x00,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0x00}}, +{ 0x2264, {0x00,0x00,0x00,0x18,0x60,0x80,0x60,0x18,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2265, {0x00,0x00,0x00,0xC0,0x30,0x08,0x30,0xC0,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2266, {0x00,0x00,0x18,0x60,0x80,0x60,0x18,0x00,0xF8,0x00,0xF8,0x00,0x00}}, +{ 0x2267, {0x00,0x00,0xC0,0x30,0x08,0x30,0xC0,0x00,0xF8,0x00,0xF8,0x00,0x00}}, +{ 0x2268, {0x00,0x00,0x18,0x60,0x80,0x60,0x18,0x20,0xF8,0x20,0xF8,0x20,0x00}}, +{ 0x2269, {0x00,0x00,0xC0,0x30,0x08,0x30,0xC0,0x20,0xF8,0x20,0xF8,0x20,0x00}}, +{ 0x226A, {0x00,0x00,0x00,0x14,0x28,0x50,0xA0,0x50,0x28,0x14,0x00,0x00,0x00}}, +{ 0x226B, {0x00,0x00,0x00,0xA0,0x50,0x28,0x14,0x28,0x50,0xA0,0x00,0x00,0x00}}, +{ 0x226C, {0x00,0x00,0x50,0x20,0x50,0x50,0x50,0x50,0x50,0x20,0x50,0x00,0x00}}, +{ 0x226D, {0x00,0x00,0x00,0x00,0x20,0xA8,0x70,0x20,0x70,0xA8,0x20,0x00,0x00}}, +{ 0x226E, {0x00,0x20,0x28,0x30,0x20,0x60,0xA0,0x60,0x20,0x30,0x28,0x20,0x00}}, +{ 0x226F, {0x00,0x20,0xA0,0x60,0x20,0x30,0x28,0x30,0x20,0x60,0xA0,0x20,0x00}}, +{ 0x2270, {0x00,0x20,0x20,0x38,0x60,0xA0,0x60,0x38,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x2271, {0x00,0x20,0x20,0xE0,0x30,0x28,0x30,0xE0,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x2272, {0x00,0x00,0x18,0x60,0x80,0x60,0x18,0x00,0x48,0xA8,0x90,0x00,0x00}}, +{ 0x2273, {0x00,0x00,0xC0,0x30,0x08,0x30,0xC0,0x00,0x48,0xA8,0x90,0x00,0x00}}, +{ 0x2274, {0x20,0x20,0x38,0x60,0xA0,0x60,0x38,0x20,0x68,0xA8,0xB0,0x20,0x00}}, +{ 0x2275, {0x20,0x20,0xE0,0x30,0x28,0x30,0xE0,0x20,0x68,0xA8,0xB0,0x20,0x00}}, +{ 0x2276, {0x00,0x18,0x60,0x80,0x60,0x18,0xC0,0x30,0x08,0x30,0xC0,0x00,0x00}}, +{ 0x2277, {0x00,0xC0,0x30,0x08,0x30,0xC0,0x18,0x60,0x80,0x60,0x18,0x00,0x00}}, +{ 0x2278, {0x10,0x18,0x70,0x90,0x60,0x38,0xE0,0x30,0x48,0x70,0xC0,0x40,0x00}}, +{ 0x2279, {0x10,0xD0,0x30,0x18,0x30,0xE0,0x38,0x60,0xC0,0x60,0x58,0x40,0x00}}, +{ 0x227A, {0x00,0x00,0x00,0x00,0x08,0x10,0xE0,0x10,0x08,0x00,0x00,0x00,0x00}}, +{ 0x227B, {0x00,0x00,0x00,0x00,0x80,0x40,0x38,0x40,0x80,0x00,0x00,0x00,0x00}}, +{ 0x227C, {0x00,0x00,0x00,0x00,0x08,0x10,0xE0,0x10,0xE8,0x10,0x08,0x00,0x00}}, +{ 0x227D, {0x00,0x00,0x00,0x00,0x80,0x40,0x38,0x40,0xB8,0x40,0x80,0x00,0x00}}, +{ 0x227E, {0x00,0x00,0x08,0x10,0xE0,0x10,0x08,0x00,0x48,0xA8,0x90,0x00,0x00}}, +{ 0x227F, {0x00,0x00,0x80,0x40,0x38,0x40,0x80,0x00,0x48,0xA8,0x90,0x00,0x00}}, +{ 0x2280, {0x00,0x00,0x20,0x20,0x28,0x30,0xE0,0x30,0x28,0x20,0x20,0x00,0x00}}, +{ 0x2281, {0x00,0x00,0x20,0x20,0xA0,0x60,0x38,0x60,0xA0,0x20,0x20,0x00,0x00}}, +{ 0x2282, {0x00,0x00,0x00,0x00,0x00,0x78,0x80,0x80,0x80,0x78,0x00,0x00,0x00}}, +{ 0x2283, {0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x00}}, +{ 0x2284, {0x00,0x00,0x00,0x20,0x20,0x78,0xA0,0xA0,0xA0,0x78,0x20,0x20,0x00}}, +{ 0x2285, {0x00,0x00,0x00,0x20,0x20,0xF0,0x28,0x28,0x28,0xF0,0x20,0x20,0x00}}, +{ 0x2286, {0x00,0x00,0x00,0x78,0x80,0x80,0x80,0x78,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2287, {0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2288, {0x00,0x20,0x20,0x78,0xA0,0xA0,0xA0,0x78,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x2289, {0x00,0x20,0x20,0xF0,0x28,0x28,0x28,0xF0,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x228A, {0x00,0x00,0x00,0x78,0x80,0x80,0x80,0x78,0x10,0xF8,0x40,0x00,0x00}}, +{ 0x228B, {0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0xF0,0x10,0xF8,0x40,0x00,0x00}}, +{ 0x228C, {0x00,0x00,0x00,0x88,0xA8,0xE8,0xF8,0xE8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x228D, {0x00,0x00,0x00,0x88,0x88,0x88,0xA8,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x228E, {0x00,0x00,0x00,0x88,0xA8,0xA8,0xF8,0xA8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x228F, {0x00,0x00,0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x2290, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00,0x00}}, +{ 0x2291, {0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0xF8,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2292, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x2293, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x2294, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x2295, {0x00,0x00,0x00,0x00,0x70,0xA8,0xF8,0xA8,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2296, {0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x88,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2297, {0x00,0x00,0x00,0x00,0x70,0xD8,0xA8,0xD8,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2298, {0x00,0x00,0x00,0x00,0x70,0x98,0xA8,0xC8,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2299, {0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0x88,0x70,0x00,0x00,0x00,0x00}}, +{ 0x229A, {0x00,0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x229B, {0x00,0x00,0x00,0x70,0x88,0xD8,0xA8,0xD8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x229C, {0x00,0x00,0x00,0x70,0x88,0xF8,0x88,0xF8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x229D, {0x00,0x00,0x00,0x70,0x88,0x88,0xF8,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x229E, {0x00,0x00,0x00,0x00,0xF8,0xA8,0xF8,0xA8,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x229F, {0x00,0x00,0x00,0x00,0xF8,0x88,0xF8,0x88,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x22A0, {0x00,0x00,0x00,0x00,0xF8,0xD8,0xA8,0xD8,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x22A1, {0x00,0x00,0x00,0x00,0xF8,0x88,0xA8,0x88,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x22A2, {0x00,0x00,0x80,0x80,0x80,0x80,0xF8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x22A3, {0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x22A4, {0x00,0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x22A5, {0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x22A6, {0x00,0x00,0x80,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x22A7, {0x00,0x00,0x80,0x80,0x80,0xF0,0x80,0xF0,0x80,0x80,0x80,0x00,0x00}}, +{ 0x22A8, {0x00,0x00,0x80,0x80,0x80,0xF8,0x80,0xF8,0x80,0x80,0x80,0x00,0x00}}, +{ 0x22A9, {0x00,0x00,0xA0,0xA0,0xA0,0xA0,0xB8,0xA0,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x22AA, {0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xAC,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x22AB, {0x00,0x00,0xA0,0xA0,0xA0,0xB8,0xA0,0xB8,0xA0,0xA0,0xA0,0x00,0x00}}, +{ 0x22AC, {0x00,0x00,0x80,0x80,0x90,0x90,0xF8,0xA0,0xA0,0x80,0x80,0x00,0x00}}, +{ 0x22AD, {0x00,0x00,0x80,0x88,0x88,0xF8,0x90,0xF8,0xA0,0xA0,0x80,0x00,0x00}}, +{ 0x22AE, {0x00,0x00,0xA0,0xA0,0xA8,0xA8,0xBC,0xB0,0xB0,0xA0,0xA0,0x00,0x00}}, +{ 0x22AF, {0x00,0x00,0xA0,0xA4,0xA4,0xBC,0xA8,0xBC,0xB0,0xB0,0xA0,0x00,0x00}}, +{ 0x22B0, {0x00,0x00,0x00,0x10,0x08,0x10,0xE0,0x10,0x08,0x10,0x00,0x00,0x00}}, +{ 0x22B1, {0x00,0x00,0x00,0x40,0x80,0x40,0x38,0x40,0x80,0x40,0x00,0x00,0x00}}, +{ 0x22B2, {0x00,0x00,0x00,0x00,0x18,0x68,0x88,0x68,0x18,0x00,0x00,0x00,0x00}}, +{ 0x22B3, {0x00,0x00,0x00,0x00,0xC0,0xB0,0x88,0xB0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x22B4, {0x00,0x00,0x00,0x18,0x68,0x88,0x68,0x18,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x22B5, {0x00,0x00,0x00,0xC0,0xB0,0x88,0xB0,0xC0,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x22B6, {0x00,0x00,0x00,0x00,0x00,0x50,0xB8,0x50,0x00,0x00,0x00,0x00,0x00}}, +{ 0x22B7, {0x00,0x00,0x00,0x00,0x00,0x50,0xE8,0x50,0x00,0x00,0x00,0x00,0x00}}, +{ 0x22B8, {0x00,0x00,0x00,0x00,0x00,0x10,0xE8,0x10,0x00,0x00,0x00,0x00,0x00}}, +{ 0x22B9, {0x00,0x00,0x00,0x00,0x20,0x20,0xD8,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x22BA, {0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x22BB, {0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0xF8,0x00,0x00}}, +{ 0x22BC, {0x00,0x00,0x00,0xF8,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x22BD, {0x00,0x00,0x00,0xF8,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x22BE, {0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xC0,0xA0,0xF8,0x00,0x00}}, +{ 0x22BF, {0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x28,0x28,0x48,0xF8,0x00,0x00}}, +{ 0x22C0, {0x00,0x30,0x30,0x30,0x30,0x48,0x48,0x48,0x84,0x84,0x84,0x84,0x00}}, +{ 0x22C1, {0x00,0x84,0x84,0x84,0x84,0x48,0x48,0x48,0x30,0x30,0x30,0x30,0x00}}, +{ 0x22C2, {0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x00}}, +{ 0x22C3, {0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00}}, +{ 0x22C4, {0x00,0x00,0x00,0x20,0x20,0x50,0x88,0x50,0x20,0x20,0x00,0x00,0x00}}, +{ 0x22C5, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x22C6, {0x00,0x00,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x22C7, {0x00,0x00,0x00,0x20,0x88,0x50,0xF8,0x50,0x88,0x20,0x00,0x00,0x00}}, +{ 0x22C8, {0x00,0x00,0x00,0x00,0x88,0xD8,0xA8,0xD8,0x88,0x00,0x00,0x00,0x00}}, +{ 0x22C9, {0x00,0x00,0x00,0x00,0x88,0xD0,0xA0,0xD0,0x88,0x00,0x00,0x00,0x00}}, +{ 0x22CA, {0x00,0x00,0x00,0x00,0x88,0x58,0x28,0x58,0x88,0x00,0x00,0x00,0x00}}, +{ 0x22CB, {0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x50,0x88,0x00,0x00,0x00,0x00}}, +{ 0x22CC, {0x00,0x00,0x00,0x00,0x08,0x10,0x20,0x50,0x88,0x00,0x00,0x00,0x00}}, +{ 0x22CD, {0x00,0x00,0x00,0x00,0x00,0x90,0xA8,0x48,0x00,0xF8,0x00,0x00,0x00}}, +{ 0x22CE, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x22CF, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x50,0x50,0x88,0x00,0x00}}, +{ 0x22D0, {0x00,0x00,0x00,0x00,0x38,0x40,0x98,0xA0,0x98,0x40,0x38,0x00,0x00}}, +{ 0x22D1, {0x00,0x00,0x00,0x00,0xE0,0x10,0xC8,0x28,0xC8,0x10,0xE0,0x00,0x00}}, +{ 0x22D2, {0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x22D3, {0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x22D4, {0x00,0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0x22D5, {0x00,0x00,0x50,0x50,0x50,0xF8,0x50,0x50,0xF8,0x50,0x50,0x00,0x00}}, +{ 0x22D6, {0x00,0x00,0x08,0x10,0x20,0x40,0x88,0x40,0x20,0x10,0x08,0x00,0x00}}, +{ 0x22D7, {0x00,0x00,0x80,0x40,0x20,0x10,0x88,0x10,0x20,0x40,0x80,0x00,0x00}}, +{ 0x22D8, {0x00,0x00,0x00,0x00,0x14,0x28,0x54,0xA8,0x54,0x28,0x14,0x00,0x00}}, +{ 0x22D9, {0x00,0x00,0x00,0x00,0xA0,0x50,0xA8,0x54,0xA8,0x50,0xA0,0x00,0x00}}, +{ 0x22DA, {0x18,0x60,0x80,0x60,0x18,0x00,0xF8,0x00,0xC0,0x30,0x08,0x30,0xC0}}, +{ 0x22DB, {0xC0,0x30,0x08,0x30,0xC0,0x00,0xF8,0x00,0x18,0x60,0x80,0x60,0x18}}, +{ 0x22DC, {0x00,0x00,0x00,0xF8,0x00,0x18,0x60,0x80,0x60,0x18,0x00,0x00,0x00}}, +{ 0x22DD, {0x00,0x00,0x00,0xF8,0x00,0xC0,0x30,0x08,0x30,0xC0,0x00,0x00,0x00}}, +{ 0x22DE, {0x00,0x00,0x00,0x08,0x10,0xE8,0x10,0xE0,0x10,0x08,0x00,0x00,0x00}}, +{ 0x22DF, {0x00,0x00,0x00,0x80,0x40,0xB8,0x40,0x38,0x40,0x80,0x00,0x00,0x00}}, +{ 0x22E0, {0x00,0x00,0x00,0x20,0x28,0x30,0xE0,0x30,0xE8,0x30,0x28,0x20,0x00}}, +{ 0x22E1, {0x00,0x00,0x00,0x20,0xA0,0x60,0x38,0x60,0xB8,0x60,0xA0,0x20,0x00}}, +{ 0x22E2, {0x00,0x20,0x20,0xF8,0xA0,0xA0,0xA0,0xF8,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x22E3, {0x00,0x20,0x20,0xF8,0x28,0x28,0x28,0xF8,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x22E4, {0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0xF8,0x10,0xF8,0x40,0x00,0x00}}, +{ 0x22E5, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0xF8,0x10,0xF8,0x40,0x00,0x00}}, +{ 0x22E6, {0x00,0x00,0x18,0x60,0x80,0x60,0x38,0x20,0x68,0xA8,0xB0,0x20,0x20}}, +{ 0x22E7, {0x00,0x00,0xC0,0x30,0x08,0x30,0xE0,0x20,0x68,0xA8,0xB0,0x20,0x20}}, +{ 0x22E8, {0x00,0x00,0x08,0x10,0xE0,0x10,0x28,0x20,0x68,0xA8,0xB0,0x20,0x20}}, +{ 0x22E9, {0x00,0x00,0x80,0x40,0x38,0x40,0xA0,0x20,0x68,0xA8,0xB0,0x20,0x20}}, +{ 0x22EA, {0x00,0x00,0x20,0x20,0x38,0x68,0xA8,0x68,0x38,0x20,0x20,0x00,0x00}}, +{ 0x22EB, {0x00,0x00,0x20,0x20,0xE0,0xB0,0xA8,0xB0,0xE0,0x20,0x20,0x00,0x00}}, +{ 0x22EC, {0x00,0x20,0x20,0x38,0x68,0xA8,0x68,0x38,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x22ED, {0x00,0x20,0x20,0xE0,0xB0,0xA8,0xB0,0xE0,0x20,0xF8,0x20,0x20,0x00}}, +{ 0x22EE, {0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00}}, +{ 0x22EF, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x22F0, {0x00,0x00,0x00,0x00,0x08,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x00}}, +{ 0x22F1, {0x00,0x00,0x00,0x00,0x80,0x00,0x20,0x00,0x08,0x00,0x00,0x00,0x00}}, +{ 0x22F2, {0x00,0x00,0x00,0x00,0x38,0x40,0x40,0xF0,0x40,0x40,0x38,0x00,0x00}}, +{ 0x22F3, {0x00,0x00,0x00,0x00,0x38,0x40,0x88,0xF8,0x88,0x40,0x38,0x00,0x00}}, +{ 0x22F4, {0x00,0x00,0x00,0x00,0x38,0x40,0x48,0x78,0x48,0x40,0x38,0x00,0x00}}, +{ 0x22F5, {0x00,0x00,0x30,0x00,0x38,0x40,0x80,0xF0,0x80,0x40,0x38,0x00,0x00}}, +{ 0x22F6, {0x00,0x00,0xF8,0x00,0x38,0x40,0x80,0xF0,0x80,0x40,0x38,0x00,0x00}}, +{ 0x22F7, {0x00,0x00,0x00,0x78,0x00,0x38,0x40,0x70,0x40,0x38,0x00,0x00,0x00}}, +{ 0x22F8, {0x00,0x00,0x00,0x00,0x38,0x40,0x80,0xF0,0x80,0x40,0x38,0x00,0xF8}}, +{ 0x22F9, {0x00,0x00,0x00,0x00,0x38,0x40,0xF0,0x80,0xF0,0x40,0x38,0x00,0x00}}, +{ 0x22FA, {0x00,0x00,0x00,0x00,0xE0,0x10,0x10,0x78,0x10,0x10,0xE0,0x00,0x00}}, +{ 0x22FB, {0x00,0x00,0x00,0x00,0xE0,0x10,0x88,0xF8,0x88,0x10,0xE0,0x00,0x00}}, +{ 0x22FC, {0x00,0x00,0x00,0x00,0x70,0x08,0x48,0x78,0x48,0x08,0x70,0x00,0x00}}, +{ 0x22FD, {0x00,0x00,0xF8,0x00,0xE0,0x10,0x08,0x78,0x08,0x10,0xE0,0x00,0x00}}, +{ 0x22FE, {0x00,0x00,0x00,0x78,0x00,0x70,0x08,0x38,0x08,0x70,0x00,0x00,0x00}}, +{ 0x22FF, {0x00,0x00,0x00,0x00,0xF8,0x80,0x80,0xF8,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x2300, {0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x90,0xA8,0x48,0xB0,0x00,0x00}}, +{ 0x2301, {0x00,0x00,0x00,0x00,0x20,0x30,0xA8,0x60,0x20,0x00,0x00,0x00,0x00}}, +{ 0x2302, {0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x2303, {0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2304, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x00,0x00}}, +{ 0x2305, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x20,0x50,0x88,0x00,0x00}}, +{ 0x2306, {0x00,0x00,0x00,0x00,0xF8,0x00,0xF8,0x00,0x20,0x50,0x88,0x00,0x00}}, +{ 0x2307, {0x00,0x00,0x10,0x10,0x20,0x20,0x10,0x10,0x20,0x20,0x10,0x00,0x00}}, +{ 0x2308, {0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00}}, +{ 0x2309, {0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00}}, +{ 0x230A, {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00}}, +{ 0x230B, {0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00}}, +{ 0x230C, {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x230D, {0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x230E, {0x00,0x00,0x00,0x00,0x20,0x20,0x18,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x230F, {0x00,0x00,0x00,0x00,0x20,0x20,0xC0,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2310, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x80,0x80,0x00,0x00,0x00,0x00}}, +{ 0x2311, {0x00,0x00,0x00,0x00,0x88,0x70,0x50,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x2312, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2313, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2314, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x50,0x20,0x00,0x00,0x00,0x00}}, +{ 0x2315, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x88,0xA8,0x50,0xA0,0x00,0x00}}, +{ 0x2316, {0x00,0x00,0x20,0x20,0x70,0xA8,0xF8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x2317, {0x00,0x00,0x00,0x50,0x50,0xF8,0x50,0x50,0xF8,0x50,0x50,0x00,0x00}}, +{ 0x2318, {0x00,0x00,0x00,0x00,0x50,0xA8,0x70,0x20,0x70,0xA8,0x50,0x00,0x00}}, +{ 0x2319, {0x00,0x00,0x00,0x00,0x80,0x80,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x231A, {0x00,0x00,0x70,0x50,0x70,0xA8,0xB8,0x88,0x70,0x50,0x70,0x00,0x00}}, +{ 0x231B, {0x00,0x00,0x00,0xF8,0x88,0x70,0x20,0x20,0x50,0xA8,0xF8,0x00,0x00}}, +{ 0x231C, {0x00,0x00,0x00,0x00,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x231D, {0x00,0x00,0x00,0x00,0x38,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x231E, {0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0x00,0x00,0x00,0x00}}, +{ 0x231F, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x38,0x00,0x00,0x00,0x00}}, +{ 0x2320, {0x10,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2321, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x40}}, +{ 0x2322, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2323, {0x00,0x00,0x00,0x00,0x00,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2324, {0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x20,0x50,0x88,0x00,0x00,0x00}}, +{ 0x2325, {0x00,0x00,0x00,0x00,0x00,0x18,0xC0,0x20,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2326, {0x00,0x00,0x00,0x00,0xF0,0xD8,0xA4,0xD8,0xF0,0x00,0x00,0x00,0x00}}, +{ 0x2327, {0x00,0x00,0x00,0x00,0xF8,0xD8,0xA8,0xD8,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x2328, {0x00,0xFC,0x84,0xAC,0x84,0xAC,0x84,0xAC,0x84,0xAC,0x84,0xFC,0x00}}, +{ 0x2329, {0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x10,0x08,0x00}}, +{ 0x232A, {0x00,0x40,0x20,0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0x232B, {0x00,0x00,0x00,0x00,0x3C,0x6C,0x94,0x6C,0x3C,0x00,0x00,0x00,0x00}}, +{ 0x232C, {0x00,0x00,0x00,0x20,0x50,0x88,0x88,0x88,0x50,0x20,0x00,0x00,0x00}}, +{ 0x232D, {0x00,0x00,0x00,0x10,0x20,0x60,0xD8,0x30,0x20,0x40,0x00,0x00,0x00}}, +{ 0x232E, {0x00,0x00,0x70,0x88,0xBC,0xA8,0x70,0x40,0xC0,0xE0,0xC0,0x00,0x00}}, +{ 0x232F, {0x00,0x00,0x00,0x00,0x70,0x00,0xF8,0x00,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2330, {0x00,0x00,0x48,0xFC,0x48,0x48,0x48,0x90,0x90,0x90,0xF0,0x00,0x00}}, +{ 0x2331, {0x00,0x00,0x00,0x40,0x40,0xA8,0xFC,0xA8,0x40,0x40,0x00,0x00,0x00}}, +{ 0x2332, {0x00,0x00,0x00,0x40,0x60,0x50,0xFC,0x50,0x60,0x40,0x00,0x00,0x00}}, +{ 0x2333, {0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xA0,0x90,0xF8,0x00,0x00}}, +{ 0x2334, {0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x84,0x84,0xFC,0x00,0x00}}, +{ 0x2335, {0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x2336, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x2337, {0x00,0x78,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x78,0x00}}, +{ 0x2338, {0x00,0xF8,0x88,0x88,0x88,0xF8,0x88,0xF8,0x88,0x88,0x88,0xF8,0x00}}, +{ 0x2339, {0x00,0xF8,0x88,0x88,0xA8,0x88,0xF8,0x88,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x233A, {0x00,0xF8,0x88,0x88,0xA8,0xD8,0x88,0xD8,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x233B, {0x00,0xF8,0x88,0x88,0x88,0xA8,0xD8,0xA8,0x88,0x88,0x88,0xF8,0x00}}, +{ 0x233C, {0x00,0xF8,0x88,0xA8,0xD8,0x88,0x88,0x88,0xD8,0xA8,0x88,0xF8,0x00}}, +{ 0x233D, {0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x233E, {0x00,0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x233F, {0x00,0x00,0x00,0x08,0x10,0x10,0xF8,0x40,0x40,0x80,0x00,0x00,0x00}}, +{ 0x2340, {0x00,0x00,0x00,0x80,0x40,0x40,0xF8,0x10,0x10,0x08,0x00,0x00,0x00}}, +{ 0x2341, {0x00,0xF8,0x98,0x98,0x98,0xA8,0xA8,0xA8,0xC8,0xC8,0xC8,0xF8,0x00}}, +{ 0x2342, {0x00,0xF8,0xC8,0xC8,0xC8,0xA8,0xA8,0xA8,0x98,0x98,0x98,0xF8,0x00}}, +{ 0x2343, {0x00,0xF8,0x88,0x88,0x98,0xA8,0xC8,0xA8,0x98,0x88,0x88,0xF8,0x00}}, +{ 0x2344, {0x00,0xF8,0x88,0x88,0xC8,0xA8,0x98,0xA8,0xC8,0x88,0x88,0xF8,0x00}}, +{ 0x2345, {0x00,0x00,0x10,0x10,0x30,0x50,0xF8,0x50,0x30,0x10,0x10,0x00,0x00}}, +{ 0x2346, {0x00,0x00,0x40,0x40,0x60,0x50,0xF8,0x50,0x60,0x40,0x40,0x00,0x00}}, +{ 0x2347, {0x00,0xF8,0x88,0x88,0xA8,0xC8,0xF8,0xC8,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x2348, {0x00,0xF8,0x88,0x88,0xA8,0x98,0xF8,0x98,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x2349, {0x00,0x00,0x80,0x80,0x70,0xC8,0xA8,0x98,0x70,0x08,0x08,0x00,0x00}}, +{ 0x234A, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0xF8,0x00}}, +{ 0x234B, {0x00,0x00,0x20,0x20,0x20,0x20,0x70,0x70,0xA8,0xF8,0x20,0x20,0x00}}, +{ 0x234C, {0x00,0xF8,0x88,0x88,0x88,0xD8,0xD8,0xA8,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x234D, {0x00,0xF8,0x88,0x88,0xA8,0xA8,0xD8,0xD8,0xF8,0x88,0x88,0xF8,0x00}}, +{ 0x234E, {0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0x70,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x234F, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2350, {0x00,0xF8,0xA8,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x00}}, +{ 0x2351, {0x00,0x00,0xF8,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2352, {0x00,0x00,0x20,0x20,0xF8,0xA8,0x70,0x70,0x20,0x20,0x20,0x20,0x00}}, +{ 0x2353, {0x00,0xF8,0x88,0x88,0xA8,0xA8,0xD8,0xD8,0x88,0x88,0x88,0xF8,0x00}}, +{ 0x2354, {0x00,0xF8,0x88,0x88,0xF8,0xD8,0xD8,0xA8,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x2355, {0x00,0x00,0xF8,0x20,0x20,0x70,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x2356, {0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0x2357, {0x00,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0xA8,0xF8,0x00}}, +{ 0x2358, {0x00,0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00}}, +{ 0x2359, {0x00,0x00,0x20,0x20,0x50,0x50,0x50,0x88,0x88,0xF8,0x00,0xF8,0x00}}, +{ 0x235A, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x88,0x50,0x20,0x00,0xF8,0x00}}, +{ 0x235B, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20,0x00,0x00,0x00,0xF8,0x00}}, +{ 0x235C, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00,0xF8,0x00}}, +{ 0x235D, {0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0x88,0x88,0x00,0x00}}, +{ 0x235E, {0x00,0xF8,0xA8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x00}}, +{ 0x235F, {0x00,0x00,0x00,0x70,0x88,0xA8,0xF8,0xA8,0xD8,0x88,0x70,0x00,0x00}}, +{ 0x2360, {0x00,0xF8,0x88,0x88,0x88,0xA8,0x88,0x88,0xA8,0x88,0x88,0xF8,0x00}}, +{ 0x2361, {0x00,0x50,0x50,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2362, {0x00,0x50,0x50,0x00,0xF8,0x88,0x88,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x2363, {0x00,0x50,0x50,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00}}, +{ 0x2364, {0x00,0x50,0x50,0x00,0x00,0x20,0x50,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2365, {0x00,0x50,0x50,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x00}}, +{ 0x2366, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x2367, {0x00,0x00,0x10,0x10,0x78,0x90,0x90,0x90,0x90,0x78,0x10,0x10,0x00}}, +{ 0x2368, {0x00,0x50,0x50,0x00,0x00,0x00,0x40,0xA8,0xA8,0x10,0x00,0x00,0x00}}, +{ 0x2369, {0x00,0x50,0x50,0x00,0x00,0xC0,0x30,0x08,0x30,0xC0,0x00,0x00,0x00}}, +{ 0x236A, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x30,0x20,0x40,0x00}}, +{ 0x236B, {0x00,0x00,0xF8,0x88,0x88,0x50,0x58,0xA8,0xB0,0x20,0x20,0x00,0x00}}, +{ 0x236C, {0x00,0x00,0x20,0x50,0x88,0xE8,0xB8,0x88,0x88,0x50,0x20,0x00,0x00}}, +{ 0x236D, {0x00,0x00,0x20,0x20,0x20,0x68,0xA8,0xB0,0x20,0x20,0x20,0x00,0x00}}, +{ 0x236E, {0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x30,0x20,0x40,0xF8,0x00}}, +{ 0x236F, {0x00,0xF8,0x88,0x98,0x98,0xF8,0xA8,0xF8,0xC8,0xC8,0x88,0xF8,0x00}}, +{ 0x2370, {0x00,0xF8,0x88,0xA8,0xD8,0x98,0xA8,0xA8,0x88,0xA8,0x88,0xF8,0x00}}, +{ 0x2371, {0x00,0x00,0x88,0xE8,0xB8,0x88,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2372, {0x00,0x00,0x20,0x20,0x20,0x50,0x50,0x88,0xE8,0xB8,0x88,0x00,0x00}}, +{ 0x2373, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x10,0x00,0x00}}, +{ 0x2374, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xF0,0x80,0x80}}, +{ 0x2375, {0x00,0x00,0x00,0x00,0x00,0x50,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0x2376, {0x00,0x00,0x00,0x00,0x68,0x90,0x90,0x90,0x90,0x68,0x00,0xF8,0x00}}, +{ 0x2377, {0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x80,0x88,0x70,0x00,0xF8,0x00}}, +{ 0x2378, {0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x10,0x00,0xF8,0x00}}, +{ 0x2379, {0x00,0x00,0x00,0x00,0x50,0x88,0xA8,0xA8,0xA8,0x50,0x00,0xF8,0x00}}, +{ 0x237A, {0x00,0x00,0x00,0x00,0x00,0x68,0x90,0x90,0x90,0x90,0x68,0x00,0x00}}, +{ 0x237B, {0x00,0x00,0x08,0x08,0x08,0x38,0x1C,0x90,0x50,0x20,0x00,0x00,0x00}}, +{ 0x237C, {0x00,0x00,0x60,0x60,0x40,0xC0,0xC0,0x40,0x60,0xFC,0xC0,0xE0,0x00}}, +{ 0x237D, {0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x70,0x00,0x00,0x00,0x00,0x00}}, +{ 0x237E, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0xF8,0x50,0xD8,0x00,0x00,0x00}}, +{ 0x237F, {0x00,0x00,0x20,0x20,0x70,0xF8,0xF8,0xF8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x2380, {0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x88,0x78,0x00,0x88,0x50,0x20}}, +{ 0x2381, {0x00,0x00,0x00,0x00,0x00,0x60,0x10,0x70,0x90,0x90,0x74,0x00,0xFC}}, +{ 0x2382, {0x00,0x00,0x00,0x00,0x00,0x48,0x24,0x6C,0xB4,0xB4,0x6C,0x00,0x6C}}, +{ 0x2383, {0x00,0x00,0x00,0x00,0x00,0x20,0x94,0x30,0xD4,0x50,0xB4,0x00,0x00}}, +{ 0x2384, {0x00,0x00,0x00,0x00,0x00,0xF8,0xD4,0xD4,0xD4,0xF8,0x00,0x00,0x00}}, +{ 0x2385, {0x00,0x00,0x20,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xF8,0x20,0x00,0x00}}, +{ 0x2386, {0x00,0x00,0x00,0x20,0x50,0x88,0x24,0xF4,0x24,0x88,0x50,0x20,0x00}}, +{ 0x2387, {0x00,0x00,0x00,0x00,0x08,0x1C,0x28,0x40,0x9C,0x00,0x00,0x00,0x00}}, +{ 0x2388, {0x00,0x00,0x00,0x00,0x20,0xA8,0x70,0xA8,0x70,0xA8,0x20,0x00,0x00}}, +{ 0x2389, {0x00,0x00,0x00,0x00,0x00,0x78,0x84,0x84,0xCC,0xB4,0x78,0x00,0x00}}, +{ 0x238A, {0x00,0x00,0x00,0x00,0x78,0x84,0xFC,0xCC,0xB4,0x84,0x78,0x00,0x00}}, +{ 0x238B, {0x00,0x00,0x00,0x00,0xE8,0xC4,0xA4,0x14,0x84,0x78,0x00,0x00,0x00}}, +{ 0x238C, {0x00,0x00,0x00,0x00,0xF0,0xC8,0x00,0x50,0xA8,0x50,0x00,0x00,0x00}}, +{ 0x238D, {0x00,0x00,0x00,0x00,0x70,0x50,0x50,0x50,0x50,0xD8,0x00,0x00,0x00}}, +{ 0x238E, {0x00,0x00,0x00,0x00,0x78,0x50,0x50,0x50,0x50,0xF0,0x00,0x00,0x00}}, +{ 0x238F, {0x00,0x00,0x00,0x00,0xF8,0x20,0x50,0x88,0x50,0x20,0x00,0x00,0x00}}, +{ 0x2390, {0x00,0x00,0x00,0x00,0x20,0x50,0x88,0x50,0x20,0xF8,0x00,0x00,0x00}}, +{ 0x2391, {0x00,0x00,0x00,0x00,0xF8,0x20,0x50,0xF8,0x50,0x20,0x00,0x00,0x00}}, +{ 0x2392, {0x00,0x00,0x00,0x00,0x20,0x50,0xF8,0x50,0x20,0xF8,0x00,0x00,0x00}}, +{ 0x2393, {0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0xA8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2394, {0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x2395, {0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x00}}, +{ 0x2396, {0x00,0x00,0x00,0x00,0x78,0x70,0x70,0x60,0x60,0x40,0x00,0x00,0x00}}, +{ 0x2397, {0x00,0x00,0x78,0x48,0x28,0x48,0xF8,0x48,0x28,0x48,0x78,0x00,0x00}}, +{ 0x2398, {0x00,0x00,0xF0,0x90,0xA0,0x90,0xF8,0x90,0xA0,0x90,0xF0,0x00,0x00}}, +{ 0x2399, {0x00,0x00,0x00,0x38,0x68,0x48,0xCC,0xCC,0xCC,0xFC,0xFC,0x00,0x00}}, +{ 0x239A, {0x00,0x00,0x00,0x00,0x78,0x84,0x94,0xA4,0x84,0x78,0x00,0x00,0x00}}, +{ 0x239B, {0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40}}, +{ 0x239C, {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40}}, +{ 0x239D, {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00}}, +{ 0x239E, {0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x239F, {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x23A0, {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0x23A1, {0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40}}, +{ 0x23A2, {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40}}, +{ 0x23A3, {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00}}, +{ 0x23A4, {0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x23A5, {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10}}, +{ 0x23A6, {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00}}, +{ 0x23A7, {0x00,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x23A8, {0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x23A9, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x18,0x00}}, +{ 0x23AA, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x23AB, {0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x23AC, {0x20,0x20,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x23AD, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00}}, +{ 0x23AE, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x23AF, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x23B0, {0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC0}}, +{ 0x23B1, {0xC0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x18}}, +{ 0x23B2, {0x00,0xFC,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x10,0x10}}, +{ 0x23B3, {0x10,0x10,0x20,0x20,0x20,0x20,0x40,0x40,0x40,0x40,0x80,0xFC,0x00}}, +{ 0x23B4, {0x00,0x00,0xF8,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x23B5, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xF8,0x00,0x00}}, +{ 0x23B6, {0x00,0x00,0x00,0x88,0xF8,0x00,0x00,0x00,0xF8,0x88,0x00,0x00,0x00}}, +{ 0x23B7, {0x20,0x20,0x20,0x20,0x20,0xA0,0xA0,0x60,0x60,0x20,0x20,0x00,0x00}}, +{ 0x23B8, {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}}, +{ 0x23B9, {0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04}}, +{ 0x23BA, {0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x23BB, {0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x23BC, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00}}, +{ 0x23BD, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC}}, +{ 0x23BE, {0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0x23BF, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x23C0, {0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x23C1, {0x00,0x00,0xF8,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x23C2, {0x00,0x00,0x20,0x20,0x70,0xA8,0xA8,0xA8,0x70,0x20,0xF8,0x00,0x00}}, +{ 0x23C3, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0xA8,0xF8,0x20,0x20,0x00,0x00}}, +{ 0x23C4, {0x00,0x00,0xF8,0x20,0x20,0x70,0x70,0xA8,0xF8,0x20,0x20,0x00,0x00}}, +{ 0x23C5, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0xA8,0xF8,0x20,0xF8,0x00,0x00}}, +{ 0x23C6, {0x00,0x00,0x20,0x20,0x20,0x20,0x68,0xB0,0x20,0x20,0x20,0x00,0x00}}, +{ 0x23C7, {0x00,0x00,0xF8,0x20,0x20,0x20,0x68,0xB0,0x20,0x20,0x20,0x00,0x00}}, +{ 0x23C8, {0x00,0x00,0x20,0x20,0x20,0x20,0x68,0xB0,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x23C9, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x23CA, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x23CB, {0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0x23CC, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x23CD, {0x00,0x00,0x20,0xA8,0xA8,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x23CE, {0x00,0x00,0x18,0x18,0x18,0x18,0x58,0xF8,0xF0,0x40,0x00,0x00,0x00}}, +{ 0x2400, {0x00,0x90,0xD0,0xB0,0x90,0x50,0x50,0x70,0x20,0x20,0x20,0x38,0x00}}, +{ 0x2401, {0x00,0x60,0x80,0x40,0x20,0xE0,0x50,0x50,0x20,0x28,0x38,0x28,0x00}}, +{ 0x2402, {0x00,0x60,0x80,0x40,0x20,0xC0,0x70,0x20,0x20,0x28,0x10,0x28,0x00}}, +{ 0x2403, {0x00,0xE0,0x80,0xC0,0x80,0xE0,0x70,0x20,0x20,0x28,0x10,0x28,0x00}}, +{ 0x2404, {0x00,0xE0,0x80,0xC0,0x80,0xE0,0x50,0x50,0x20,0x38,0x10,0x10,0x00}}, +{ 0x2405, {0xE0,0x80,0xC0,0x80,0xE0,0x68,0x58,0x48,0x10,0x28,0x28,0x38,0x18}}, +{ 0x2406, {0x00,0x40,0xA0,0xE0,0xA0,0x30,0x40,0x30,0x00,0x28,0x30,0x28,0x00}}, +{ 0x2407, {0xC0,0xA0,0xC0,0xA0,0xF0,0x40,0x60,0x40,0x70,0x20,0x20,0x20,0x38}}, +{ 0x2408, {0x00,0x00,0xC0,0xA0,0xC0,0xA0,0xD8,0x20,0x10,0x08,0x30,0x00,0x00}}, +{ 0x2409, {0x00,0x00,0xA0,0xA0,0xE0,0xA0,0xA0,0x38,0x10,0x10,0x10,0x00,0x00}}, +{ 0x240A, {0x00,0x00,0x80,0x80,0x80,0xE0,0x38,0x20,0x30,0x20,0x20,0x00,0x00}}, +{ 0x240B, {0x00,0x00,0xA0,0xA0,0xA0,0x40,0x40,0x38,0x10,0x10,0x10,0x00,0x00}}, +{ 0x240C, {0x00,0x00,0xE0,0x80,0xC0,0x80,0xB8,0x20,0x30,0x20,0x20,0x00,0x00}}, +{ 0x240D, {0x00,0x00,0x60,0x80,0x80,0x60,0x30,0x28,0x30,0x28,0x28,0x00,0x00}}, +{ 0x240E, {0x00,0x00,0x60,0x80,0x40,0x20,0xD0,0x28,0x28,0x28,0x10,0x00,0x00}}, +{ 0x240F, {0x00,0x00,0x60,0x80,0x40,0x20,0xF8,0x10,0x10,0x10,0x38,0x00,0x00}}, +{ 0x2410, {0xC0,0xA0,0xA0,0xC0,0x40,0x40,0x40,0x70,0x38,0x20,0x30,0x20,0x38}}, +{ 0x2411, {0xC0,0xA0,0xA0,0xC0,0x30,0x40,0x40,0x30,0x00,0x10,0x30,0x10,0x38}}, +{ 0x2412, {0xC0,0xA0,0xA0,0xC0,0x30,0x40,0x40,0x30,0x00,0x30,0x08,0x10,0x38}}, +{ 0x2413, {0xC0,0xA0,0xA0,0xC0,0x30,0x40,0x40,0x30,0x10,0x28,0x10,0x08,0x30}}, +{ 0x2414, {0xC0,0xA0,0xA0,0xC0,0x30,0x40,0x40,0x30,0x00,0x20,0x30,0x38,0x10}}, +{ 0x2415, {0x90,0xD0,0xB0,0x00,0x20,0x50,0x70,0x50,0x00,0x28,0x30,0x30,0x28}}, +{ 0x2416, {0x60,0x80,0x40,0x20,0xC0,0x50,0x50,0x20,0x20,0x48,0x68,0x58,0x48}}, +{ 0x2417, {0xE0,0x80,0xC0,0x80,0xE0,0x70,0x20,0x20,0x30,0x28,0x30,0x28,0x30}}, +{ 0x2418, {0x70,0x80,0x80,0x70,0x20,0x50,0x70,0x50,0x00,0x68,0x58,0x48,0x00}}, +{ 0x2419, {0x00,0xE0,0x80,0xC0,0x80,0xE0,0x00,0x50,0x70,0x50,0x50,0x00,0x00}}, +{ 0x241A, {0x60,0x80,0x40,0x20,0xC0,0x50,0x50,0x20,0x30,0x28,0x30,0x28,0x30}}, +{ 0x241B, {0xE0,0x80,0xC0,0x80,0xF0,0x40,0x20,0x10,0x78,0x20,0x20,0x18,0x00}}, +{ 0x241C, {0x00,0x00,0xE0,0x80,0xC0,0x80,0x98,0x20,0x10,0x08,0x30,0x00,0x00}}, +{ 0x241D, {0x00,0x70,0x80,0xB0,0x90,0x60,0x18,0x20,0x10,0x08,0x30,0x00,0x00}}, +{ 0x241E, {0x00,0xC0,0xA0,0xC0,0xA0,0xA0,0x18,0x20,0x10,0x08,0x30,0x00,0x00}}, +{ 0x241F, {0x00,0x90,0x90,0x90,0x90,0x60,0x18,0x20,0x10,0x08,0x30,0x00,0x00}}, +{ 0x2420, {0x00,0x60,0x80,0x40,0x20,0xC0,0x30,0x28,0x30,0x20,0x20,0x00,0x00}}, +{ 0x2421, {0x00,0xC0,0xA0,0xA0,0xF0,0x40,0x60,0x40,0x70,0x20,0x20,0x38,0x00}}, +{ 0x2422, {0x00,0x00,0x40,0x50,0x60,0x40,0xF0,0x48,0x48,0x48,0x70,0x00,0x00}}, +{ 0x2423, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xF8,0x00,0x00}}, +{ 0x2424, {0x00,0x00,0x90,0xD0,0xB0,0x90,0x20,0x20,0x20,0x20,0x38,0x00,0x00}}, +{ 0x2425, {0x00,0x00,0x48,0x48,0x90,0x90,0x20,0x48,0x48,0x90,0x90,0x00,0x00}}, +{ 0x2426, {0x00,0x00,0x70,0x88,0x88,0x80,0x40,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0x2440, {0x00,0x00,0x38,0x28,0x28,0x28,0x20,0xA0,0xA0,0xA0,0xE0,0x00,0x00}}, +{ 0x2441, {0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x2442, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2443, {0x00,0x00,0x20,0x20,0x20,0x20,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x2444, {0x00,0x00,0xF8,0xA8,0xA8,0x20,0x20,0x20,0xA8,0xA8,0xF8,0x00,0x00}}, +{ 0x2445, {0x00,0x00,0x88,0xD8,0xA8,0xD8,0x88,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2446, {0x00,0x00,0x00,0x18,0x18,0xD8,0xC0,0xC0,0xD8,0x18,0x18,0x00,0x00}}, +{ 0x2447, {0x00,0x00,0x18,0x18,0x18,0x20,0x20,0x20,0xC0,0xC0,0xC0,0x00,0x00}}, +{ 0x2448, {0x00,0x00,0x00,0x0C,0xAC,0xAC,0xAC,0xA0,0xA0,0x00,0x00,0x00,0x00}}, +{ 0x2449, {0x00,0x00,0x00,0x00,0xA8,0xA8,0xA8,0xA8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x244A, {0x00,0x00,0x00,0x90,0x90,0x90,0x90,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0x2460, {0x00,0x00,0x70,0x88,0xA8,0xE8,0xA8,0xA8,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x2461, {0x00,0x00,0x70,0x88,0xA8,0xD8,0x98,0xA8,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x2462, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0x98,0xE8,0x88,0x70,0x00,0x00}}, +{ 0x2463, {0x00,0x00,0x70,0x88,0xC8,0xC8,0xE8,0xF8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2464, {0x00,0x00,0x70,0x88,0xF8,0xC8,0xE8,0x98,0xE8,0x88,0x70,0x00,0x00}}, +{ 0x2465, {0x00,0x00,0x70,0x88,0xB8,0xC8,0xE8,0xD8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2466, {0x00,0x00,0x70,0x88,0xF8,0x98,0xA8,0xA8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2467, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0xD8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2468, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xB8,0x98,0xE8,0x88,0x70,0x00,0x00}}, +{ 0x2469, {0x00,0x00,0x78,0x84,0xD4,0xEC,0xEC,0xEC,0xD4,0x84,0x78,0x00,0x00}}, +{ 0x246A, {0x00,0x00,0x78,0x84,0xD4,0xD4,0xD4,0xD4,0xD4,0x84,0x78,0x00,0x00}}, +{ 0x246B, {0x00,0x00,0x78,0x84,0xD4,0xCC,0xCC,0xD4,0xDC,0x84,0x78,0x00,0x00}}, +{ 0x246C, {0x00,0x00,0x78,0x84,0xD4,0xCC,0xD4,0xCC,0xD4,0x84,0x78,0x00,0x00}}, +{ 0x246D, {0x00,0x00,0x78,0x84,0xD4,0xD4,0xDC,0xDC,0xCC,0x84,0x78,0x00,0x00}}, +{ 0x246E, {0x00,0x00,0x78,0x84,0xDC,0xD4,0xDC,0xCC,0xDC,0x84,0x78,0x00,0x00}}, +{ 0x246F, {0x00,0x00,0x78,0x84,0xD4,0xD4,0xDC,0xD4,0xCC,0x84,0x78,0x00,0x00}}, +{ 0x2470, {0x00,0x00,0x78,0x84,0xDC,0xCC,0xD4,0xD4,0xD4,0x84,0x78,0x00,0x00}}, +{ 0x2471, {0x00,0x00,0x78,0x84,0xCC,0xD4,0xCC,0xD4,0xCC,0x84,0x78,0x00,0x00}}, +{ 0x2472, {0x00,0x00,0x78,0x84,0xCC,0xD4,0xCC,0xC4,0xDC,0x84,0x78,0x00,0x00}}, +{ 0x2473, {0x00,0x00,0x78,0x84,0xFC,0xB4,0xB4,0xD4,0xFC,0x84,0x78,0x00,0x00}}, +{ 0x2474, {0x00,0x00,0x50,0x88,0xA8,0xE8,0xA8,0xA8,0xF8,0x88,0x50,0x00,0x00}}, +{ 0x2475, {0x00,0x00,0x50,0x88,0xA8,0xD8,0x98,0xA8,0xF8,0x88,0x50,0x00,0x00}}, +{ 0x2476, {0x00,0x00,0x50,0x88,0xA8,0xD8,0xA8,0x98,0xE8,0x88,0x50,0x00,0x00}}, +{ 0x2477, {0x00,0x00,0x50,0x88,0xC8,0xC8,0xE8,0xF8,0xA8,0x88,0x50,0x00,0x00}}, +{ 0x2478, {0x00,0x00,0x50,0x88,0xF8,0xC8,0xE8,0x98,0xE8,0x88,0x50,0x00,0x00}}, +{ 0x2479, {0x00,0x00,0x50,0x88,0xB8,0xC8,0xE8,0xD8,0xA8,0x88,0x50,0x00,0x00}}, +{ 0x247A, {0x00,0x00,0x50,0x88,0xF8,0x98,0xA8,0xA8,0xA8,0x88,0x50,0x00,0x00}}, +{ 0x247B, {0x00,0x00,0x50,0x88,0xA8,0xD8,0xA8,0xD8,0xA8,0x88,0x50,0x00,0x00}}, +{ 0x247C, {0x00,0x00,0x50,0x88,0xA8,0xD8,0xB8,0x98,0xE8,0x88,0x50,0x00,0x00}}, +{ 0x247D, {0x00,0x00,0x48,0x84,0xD4,0xEC,0xEC,0xEC,0xD4,0x84,0x48,0x00,0x00}}, +{ 0x247E, {0x00,0x00,0x48,0x84,0xD4,0xD4,0xD4,0xD4,0xD4,0x84,0x48,0x00,0x00}}, +{ 0x247F, {0x00,0x00,0x48,0x84,0xD4,0xCC,0xCC,0xD4,0xDC,0x84,0x48,0x00,0x00}}, +{ 0x2480, {0x00,0x00,0x48,0x84,0xD4,0xCC,0xD4,0xCC,0xD4,0x84,0x48,0x00,0x00}}, +{ 0x2481, {0x00,0x00,0x48,0x84,0xD4,0xD4,0xDC,0xDC,0xCC,0x84,0x48,0x00,0x00}}, +{ 0x2482, {0x00,0x00,0x48,0x84,0xDC,0xD4,0xDC,0xCC,0xDC,0x84,0x48,0x00,0x00}}, +{ 0x2483, {0x00,0x00,0x48,0x84,0xD4,0xD4,0xDC,0xD4,0xCC,0x84,0x48,0x00,0x00}}, +{ 0x2484, {0x00,0x00,0x48,0x84,0xDC,0xCC,0xD4,0xD4,0xD4,0x84,0x48,0x00,0x00}}, +{ 0x2485, {0x00,0x00,0x48,0x84,0xCC,0xD4,0xCC,0xD4,0xCC,0x84,0x48,0x00,0x00}}, +{ 0x2486, {0x00,0x00,0x48,0x84,0xCC,0xD4,0xCC,0xC4,0xDC,0x84,0x48,0x00,0x00}}, +{ 0x24EA, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xD8,0xD8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2500, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2501, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2502, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2503, {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2504, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2505, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2506, {0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00}}, +{ 0x2507, {0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00}}, +{ 0x2508, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2509, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x250A, {0x20,0x20,0x00,0x20,0x20,0x00,0x20,0x20,0x00,0x20,0x20,0x00,0x00}}, +{ 0x250B, {0x30,0x30,0x00,0x30,0x30,0x00,0x30,0x30,0x00,0x30,0x30,0x00,0x00}}, +{ 0x250C, {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x250D, {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x250E, {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x250F, {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x3C,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2510, {0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2511, {0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2512, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2513, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2514, {0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2515, {0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x3C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2516, {0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2517, {0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x3C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2518, {0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2519, {0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x251A, {0x30,0x30,0x30,0x30,0x30,0x30,0xF0,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x251B, {0x30,0x30,0x30,0x30,0x30,0x30,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x251C, {0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x251D, {0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x251E, {0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x251F, {0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2520, {0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2521, {0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2522, {0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x3C,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2523, {0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x3C,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2524, {0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2525, {0x20,0x20,0x20,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2526, {0x30,0x30,0x30,0x30,0x30,0x30,0xF0,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2527, {0x20,0x20,0x20,0x20,0x20,0x20,0xF0,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2528, {0x30,0x30,0x30,0x30,0x30,0x30,0xF0,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2529, {0x30,0x30,0x30,0x30,0x30,0x30,0xF0,0xF0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x252A, {0x20,0x20,0x20,0x20,0x20,0x20,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30}}, +{ 0x252B, {0x30,0x30,0x30,0x30,0x30,0x30,0xF0,0xF0,0x30,0x30,0x30,0x30,0x30}}, +{ 0x252C, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x252D, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xE0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x252E, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x252F, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2530, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2531, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF0,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2532, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3C,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2533, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2534, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2535, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2536, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x3C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2537, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2538, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2539, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0xF0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x253A, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0x3C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x253B, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x253C, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x253D, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0xE0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x253E, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x253F, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0xFC,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2540, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2541, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2542, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2543, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0xF0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2544, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2545, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0xF0,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2546, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0x3C,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2547, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0xFC,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2548, {0x20,0x20,0x20,0x20,0x20,0x20,0xFC,0xFC,0x30,0x30,0x30,0x30,0x30}}, +{ 0x2549, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0xF0,0x30,0x30,0x30,0x30,0x30}}, +{ 0x254A, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0x3C,0x30,0x30,0x30,0x30,0x30}}, +{ 0x254B, {0x30,0x30,0x30,0x30,0x30,0x30,0xFC,0xFC,0x30,0x30,0x30,0x30,0x30}}, +{ 0x254C, {0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x254D, {0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x254E, {0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x254F, {0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x00,0x00}}, +{ 0x2550, {0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2551, {0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2552, {0x00,0x00,0x00,0x00,0x00,0x3C,0x20,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2553, {0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2554, {0x00,0x00,0x00,0x00,0x00,0x7C,0x40,0x5C,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2555, {0x00,0x00,0x00,0x00,0x00,0xE0,0x20,0xE0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2556, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2557, {0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0xD0,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2558, {0x20,0x20,0x20,0x20,0x20,0x3C,0x20,0x3C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2559, {0x50,0x50,0x50,0x50,0x50,0x50,0x7C,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x255A, {0x50,0x50,0x50,0x50,0x50,0x5C,0x40,0x7C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x255B, {0x20,0x20,0x20,0x20,0x20,0xE0,0x20,0xE0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x255C, {0x50,0x50,0x50,0x50,0x50,0x50,0xF0,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x255D, {0x50,0x50,0x50,0x50,0x50,0xD0,0x10,0xF0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x255E, {0x20,0x20,0x20,0x20,0x20,0x3C,0x20,0x3C,0x20,0x20,0x20,0x20,0x20}}, +{ 0x255F, {0x50,0x50,0x50,0x50,0x50,0x50,0x5C,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2560, {0x50,0x50,0x50,0x50,0x50,0x5C,0x40,0x5C,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2561, {0x20,0x20,0x20,0x20,0x20,0xE0,0x20,0xE0,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2562, {0x50,0x50,0x50,0x50,0x50,0x50,0xD0,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2563, {0x50,0x50,0x50,0x50,0x50,0xD0,0x10,0xD0,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2564, {0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0xFC,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2565, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2566, {0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0xDC,0x50,0x50,0x50,0x50,0x50}}, +{ 0x2567, {0x20,0x20,0x20,0x20,0x20,0xFC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2568, {0x50,0x50,0x50,0x50,0x50,0x50,0xFC,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2569, {0x50,0x50,0x50,0x50,0x50,0xDC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x256A, {0x20,0x20,0x20,0x20,0x20,0xFC,0x20,0xFC,0x20,0x20,0x20,0x20,0x20}}, +{ 0x256B, {0x50,0x50,0x50,0x50,0x50,0x50,0xFC,0x50,0x50,0x50,0x50,0x50,0x50}}, +{ 0x256C, {0x50,0x50,0x50,0x50,0x50,0xDC,0x00,0xDC,0x50,0x50,0x50,0x50,0x50}}, +{ 0x256D, {0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x10,0x20,0x20,0x20,0x20,0x20}}, +{ 0x256E, {0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20}}, +{ 0x256F, {0x20,0x20,0x20,0x20,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2570, {0x20,0x20,0x20,0x20,0x20,0x10,0x0C,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2571, {0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x80,0x80}}, +{ 0x2572, {0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04}}, +{ 0x2573, {0x84,0x84,0x48,0x48,0x30,0x30,0x30,0x30,0x30,0x48,0x48,0x84,0x84}}, +{ 0x2574, {0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2575, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2576, {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2577, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2578, {0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2579, {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x257A, {0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x3C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x257B, {0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x257C, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1C,0x00,0x00,0x00,0x00,0x00}}, +{ 0x257D, {0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x30,0x30,0x30,0x30,0x30,0x30}}, +{ 0x257E, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xE0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x257F, {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0x2580, {0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2581, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC}}, +{ 0x2582, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC}}, +{ 0x2583, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x2584, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x2585, {0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x2586, {0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x2587, {0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x2588, {0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x2589, {0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8}}, +{ 0x258A, {0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0}}, +{ 0x258B, {0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0}}, +{ 0x258C, {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0}}, +{ 0x258D, {0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0}}, +{ 0x258E, {0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0}}, +{ 0x258F, {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}}, +{ 0x2590, {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}}, +{ 0x2591, {0xA8,0x00,0x54,0x00,0xA8,0x00,0x54,0x00,0xA8,0x00,0x54,0x00,0xA8}}, +{ 0x2592, {0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8,0x54,0xA8}}, +{ 0x2593, {0x54,0xFC,0xA8,0xFC,0x54,0xFC,0xA8,0xFC,0x54,0xFC,0xA8,0xFC,0x54}}, +{ 0x2594, {0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2595, {0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04}}, +{ 0x2596, {0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0}}, +{ 0x2597, {0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}}, +{ 0x2598, {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2599, {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x259A, {0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}}, +{ 0x259B, {0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0}}, +{ 0x259C, {0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C}}, +{ 0x259D, {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x259E, {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0}}, +{ 0x259F, {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x25A0, {0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0x00}}, +{ 0x25A1, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x25A2, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x25A3, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0xA8,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x25A4, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0xF8,0x88,0xF8,0x00,0x00}}, +{ 0x25A5, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xA8,0xA8,0xF8,0x00,0x00}}, +{ 0x25A6, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xF8,0xA8,0xF8,0x00,0x00}}, +{ 0x25A7, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xC8,0xA8,0x98,0xF8,0x00,0x00}}, +{ 0x25A8, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x98,0xA8,0xC8,0xF8,0x00,0x00}}, +{ 0x25A9, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xD8,0xA8,0xD8,0xF8,0x00,0x00}}, +{ 0x25AA, {0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25AB, {0x00,0x00,0x00,0x00,0x00,0x70,0x50,0x70,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25AC, {0x00,0x00,0x00,0x00,0xFC,0xFC,0xFC,0xFC,0xFC,0x00,0x00,0x00,0x00}}, +{ 0x25AD, {0x00,0x00,0x00,0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x00,0x00,0x00}}, +{ 0x25AE, {0x00,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x00}}, +{ 0x25AF, {0x00,0x78,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x78,0x00}}, +{ 0x25B0, {0x00,0x00,0x00,0x00,0x00,0x3C,0x78,0xF0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25B1, {0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0xF0,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25B2, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0x70,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x25B3, {0x00,0x00,0x20,0x20,0x20,0x50,0x50,0x50,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x25B4, {0x00,0x00,0x00,0x00,0x20,0x20,0x70,0x70,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x25B5, {0x00,0x00,0x00,0x00,0x20,0x20,0x50,0x50,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x25B6, {0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00}}, +{ 0x25B7, {0x00,0x00,0x80,0xC0,0xA0,0x90,0x88,0x90,0xA0,0xC0,0x80,0x00,0x00}}, +{ 0x25B8, {0x00,0x00,0x00,0x00,0x40,0x60,0x70,0x60,0x40,0x00,0x00,0x00,0x00}}, +{ 0x25B9, {0x00,0x00,0x00,0x00,0x40,0x60,0x50,0x60,0x40,0x00,0x00,0x00,0x00}}, +{ 0x25BA, {0x00,0x00,0x00,0x00,0xC0,0xF0,0xFC,0xF0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x25BB, {0x00,0x00,0x00,0x00,0xC0,0xB0,0x8C,0xB0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x25BC, {0x00,0x00,0xF8,0xF8,0xF8,0x70,0x70,0x70,0x20,0x20,0x20,0x00,0x00}}, +{ 0x25BD, {0x00,0x00,0xF8,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x20,0x00,0x00}}, +{ 0x25BE, {0x00,0x00,0x00,0x00,0x00,0xF8,0x70,0x70,0x20,0x20,0x00,0x00,0x00}}, +{ 0x25BF, {0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x20,0x20,0x00,0x00,0x00}}, +{ 0x25C0, {0x00,0x00,0x08,0x18,0x38,0x78,0xF8,0x78,0x38,0x18,0x08,0x00,0x00}}, +{ 0x25C1, {0x00,0x00,0x08,0x18,0x28,0x48,0x88,0x48,0x28,0x18,0x08,0x00,0x00}}, +{ 0x25C2, {0x00,0x00,0x00,0x00,0x10,0x30,0x70,0x30,0x10,0x00,0x00,0x00,0x00}}, +{ 0x25C3, {0x00,0x00,0x00,0x00,0x10,0x30,0x50,0x30,0x10,0x00,0x00,0x00,0x00}}, +{ 0x25C4, {0x00,0x00,0x00,0x00,0x0C,0x3C,0xFC,0x3C,0x0C,0x00,0x00,0x00,0x00}}, +{ 0x25C5, {0x00,0x00,0x00,0x00,0x0C,0x34,0xC4,0x34,0x0C,0x00,0x00,0x00,0x00}}, +{ 0x25C6, {0x00,0x00,0x00,0x00,0x20,0x70,0xF8,0x70,0x20,0x00,0x00,0x00,0x00}}, +{ 0x25C7, {0x00,0x00,0x00,0x00,0x20,0x50,0x88,0x50,0x20,0x00,0x00,0x00,0x00}}, +{ 0x25C8, {0x00,0x00,0x00,0x00,0x20,0x50,0xA8,0x50,0x20,0x00,0x00,0x00,0x00}}, +{ 0x25C9, {0x00,0x00,0x00,0x00,0x30,0x48,0xB4,0xB4,0x48,0x30,0x00,0x00,0x00}}, +{ 0x25CA, {0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0x25CB, {0x00,0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x25CC, {0x00,0x00,0x00,0x00,0x20,0x08,0x80,0x04,0x40,0x10,0x00,0x00,0x00}}, +{ 0x25CD, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xA8,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x25CE, {0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x25CF, {0x00,0x00,0x00,0x00,0x30,0x78,0xFC,0xFC,0x78,0x30,0x00,0x00,0x00}}, +{ 0x25D0, {0x00,0x00,0x00,0x00,0x30,0x68,0xE4,0xE4,0x68,0x30,0x00,0x00,0x00}}, +{ 0x25D1, {0x00,0x00,0x00,0x00,0x30,0x58,0x9C,0x9C,0x58,0x30,0x00,0x00,0x00}}, +{ 0x25D2, {0x00,0x00,0x00,0x00,0x30,0x48,0x84,0xFC,0x78,0x30,0x00,0x00,0x00}}, +{ 0x25D3, {0x00,0x00,0x00,0x00,0x30,0x78,0xFC,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x25D4, {0x00,0x00,0x00,0x00,0x30,0x58,0x9C,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x25D5, {0x00,0x00,0x00,0x00,0x30,0x58,0x9C,0xFC,0x78,0x30,0x00,0x00,0x00}}, +{ 0x25D6, {0x00,0x04,0x1C,0x3C,0x3C,0x7C,0x7C,0x3C,0x3C,0x1C,0x04,0x00,0x00}}, +{ 0x25D7, {0x00,0x80,0xE0,0xF0,0xF0,0xF8,0xF8,0xF0,0xF0,0xE0,0x80,0x00,0x00}}, +{ 0x25D8, {0xFC,0xFC,0xFC,0xFC,0xFC,0xCC,0x84,0x84,0xCC,0xFC,0xFC,0xFC,0xFC}}, +{ 0x25D9, {0xFC,0xFC,0xFC,0xFC,0xCC,0xB4,0x78,0x78,0xB4,0xCC,0xFC,0xFC,0xFC}}, +{ 0x25DA, {0xFC,0xFC,0xFC,0xFC,0xCC,0xB4,0x78,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25DB, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xB4,0xCC,0xFC,0xFC,0xFC}}, +{ 0x25DC, {0x00,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25DD, {0x00,0x00,0x00,0x00,0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25DE, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08,0x10,0x00,0x00,0x00}}, +{ 0x25DF, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x00,0x00,0x00}}, +{ 0x25E0, {0x00,0x00,0x00,0x00,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x25E1, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x25E2, {0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x38,0x78,0xF8,0x00,0x00,0x00}}, +{ 0x25E3, {0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0x00,0x00,0x00}}, +{ 0x25E4, {0x00,0x00,0x00,0x00,0x00,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00}}, +{ 0x25E5, {0x00,0x00,0x00,0x00,0x00,0xF8,0x78,0x38,0x18,0x08,0x00,0x00,0x00}}, +{ 0x25E6, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00,0x00,0x00}}, +{ 0x25E7, {0x00,0x00,0x00,0x00,0x00,0xF8,0xE8,0xE8,0xE8,0xF8,0x00,0x00,0x00}}, +{ 0x25E8, {0x00,0x00,0x00,0x00,0x00,0xF8,0xB8,0xB8,0xB8,0xF8,0x00,0x00,0x00}}, +{ 0x25E9, {0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xE8,0xC8,0xF8,0x00,0x00,0x00}}, +{ 0x25EA, {0x00,0x00,0x00,0x00,0x00,0xF8,0x98,0xB8,0xF8,0xF8,0x00,0x00,0x00}}, +{ 0x25EB, {0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xA8,0xA8,0xF8,0x00,0x00,0x00}}, +{ 0x25EC, {0x00,0x00,0x20,0x20,0x20,0x50,0x50,0x70,0xA8,0x88,0xF8,0x00,0x00}}, +{ 0x25ED, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0x70,0xE8,0xE8,0xF8,0x00,0x00}}, +{ 0x25EE, {0x00,0x00,0x20,0x20,0x20,0x70,0x70,0x70,0xB8,0xB8,0xF8,0x00,0x00}}, +{ 0x25EF, {0x00,0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x48,0x30,0x00,0x00}}, +{ 0x25F0, {0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xE8,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x25F1, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0xE8,0xA8,0xF8,0x00,0x00,0x00}}, +{ 0x25F2, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0xB8,0xA8,0xF8,0x00,0x00,0x00}}, +{ 0x25F3, {0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xB8,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x25F4, {0x00,0x00,0x00,0x00,0x00,0x70,0xA8,0xE8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x25F5, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xE8,0xA8,0x70,0x00,0x00,0x00}}, +{ 0x25F6, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xB8,0xA8,0x70,0x00,0x00,0x00}}, +{ 0x25F7, {0x00,0x00,0x00,0x00,0x00,0x70,0xA8,0xB8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x25F8, {0x00,0x00,0x00,0x00,0x00,0xF8,0x90,0xA0,0xC0,0x80,0x00,0x00,0x00}}, +{ 0x25F9, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x28,0x18,0x08,0x00,0x00,0x00}}, +{ 0x25FA, {0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xA0,0x90,0xF8,0x00,0x00,0x00}}, +{ 0x25FB, {0x00,0x00,0x00,0x00,0x00,0x78,0x48,0x48,0x78,0x00,0x00,0x00,0x00}}, +{ 0x25FC, {0x00,0x00,0x00,0x00,0x00,0x78,0x78,0x78,0x78,0x00,0x00,0x00,0x00}}, +{ 0x25FD, {0x00,0x00,0x00,0x00,0x00,0x78,0x48,0x48,0x78,0x00,0x00,0x00,0x00}}, +{ 0x25FE, {0x00,0x00,0x00,0x00,0x00,0x78,0x78,0x78,0x78,0x00,0x00,0x00,0x00}}, +{ 0x25FF, {0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x28,0x48,0xF8,0x00,0x00,0x00}}, +{ 0x2600, {0x00,0x00,0x20,0x20,0x88,0x20,0x70,0x20,0x88,0x20,0x20,0x00,0x00}}, +{ 0x2601, {0x00,0x00,0x00,0x00,0x00,0x60,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2602, {0x00,0x00,0x20,0x70,0xF8,0xF8,0x20,0x20,0x20,0x20,0x40,0x00,0x00}}, +{ 0x2603, {0xA0,0x20,0x74,0x50,0xA8,0x50,0x54,0x70,0x88,0x88,0x70,0x00,0x00}}, +{ 0x2604, {0x00,0x08,0x48,0x50,0x54,0x44,0x08,0x60,0x90,0x90,0x60,0x00,0x00}}, +{ 0x2605, {0x00,0x00,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x2606, {0x00,0x00,0x00,0x20,0x20,0xF8,0x50,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x2607, {0x00,0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x28,0x18,0x38,0x00,0x00}}, +{ 0x2608, {0x00,0x00,0xF8,0x88,0x90,0x90,0xA0,0xA0,0x98,0x98,0xB8,0x00,0x00}}, +{ 0x2609, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xA8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x260A, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x50,0x50,0xA8,0x50,0x00,0x00}}, +{ 0x260B, {0x00,0x00,0x00,0x00,0x50,0xA8,0x50,0x50,0x88,0x88,0x70,0x00,0x00}}, +{ 0x260C, {0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x70,0x90,0x90,0x60,0x00,0x00}}, +{ 0x260D, {0x00,0x00,0x30,0x48,0x48,0x30,0x20,0x60,0x90,0x90,0x60,0x00,0x00}}, +{ 0x260E, {0x00,0x00,0x00,0x00,0x70,0xF8,0xA8,0x70,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x260F, {0x00,0x00,0x00,0x00,0x70,0xA8,0xA8,0x70,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x2610, {0x00,0x00,0xFC,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00}}, +{ 0x2611, {0x00,0x00,0xFC,0x84,0x8C,0x8C,0x94,0x94,0xD4,0xA4,0xFC,0x00,0x00}}, +{ 0x2612, {0x00,0x00,0xFC,0xCC,0xCC,0xB4,0xB4,0xB4,0xCC,0xCC,0xFC,0x00,0x00}}, +{ 0x2613, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0x2616, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x2617, {0x00,0x00,0x20,0x70,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x2619, {0x00,0x00,0x00,0x08,0x24,0x74,0xF8,0xE8,0xF4,0x74,0x28,0x00,0x00}}, +{ 0x261A, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x7C,0x7C,0x3C,0x00,0x00,0x00}}, +{ 0x261B, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xF8,0xF8,0xF0,0x00,0x00,0x00}}, +{ 0x261C, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x4C,0x4C,0x3C,0x00,0x00,0x00}}, +{ 0x261D, {0x00,0x00,0x08,0x08,0x18,0x78,0x68,0x48,0x48,0x78,0x78,0x00,0x00}}, +{ 0x261E, {0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xC8,0xC8,0xF0,0x00,0x00,0x00}}, +{ 0x261F, {0x00,0x00,0x78,0x78,0x48,0x48,0x68,0x78,0x18,0x08,0x08,0x00,0x00}}, +{ 0x2620, {0x00,0x00,0x70,0xA8,0xF8,0x50,0x70,0x20,0x88,0x70,0x88,0x00,0x00}}, +{ 0x2621, {0x00,0x00,0xF0,0x08,0x08,0x10,0x20,0x40,0x80,0x80,0x78,0x00,0x00}}, +{ 0x2622, {0x00,0x00,0x00,0x00,0x70,0xD8,0xD8,0xA8,0xA8,0x70,0x00,0x00,0x00}}, +{ 0x2623, {0x00,0x00,0x00,0x00,0x50,0xA8,0x50,0x50,0x20,0x70,0x00,0x00,0x00}}, +{ 0x2624, {0x00,0x00,0x20,0x50,0xF8,0x50,0x70,0x50,0x70,0x50,0x20,0x00,0x00}}, +{ 0x2625, {0x00,0x00,0x20,0x50,0x50,0x20,0xF8,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2626, {0x00,0x00,0x20,0x70,0x20,0xF8,0x20,0x60,0x30,0x20,0x20,0x00,0x00}}, +{ 0x2627, {0x00,0x00,0x30,0x28,0x28,0x30,0xA8,0x70,0x20,0x70,0xA8,0x00,0x00}}, +{ 0x2628, {0x00,0x00,0x20,0x70,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2629, {0x00,0x00,0x00,0x70,0x20,0xA8,0xF8,0xA8,0x20,0x70,0x00,0x00,0x00}}, +{ 0x262A, {0x00,0x00,0x78,0xE4,0xC8,0xDC,0xC8,0xD4,0xC0,0xE4,0x78,0x00,0x00}}, +{ 0x262B, {0xA8,0x50,0x00,0x20,0xA8,0xA8,0xA8,0xA8,0xA8,0x70,0x70,0x00,0x00}}, +{ 0x262C, {0x00,0x00,0x20,0x70,0xA8,0xF8,0xA8,0xF8,0xA8,0x70,0xA8,0x00,0x00}}, +{ 0x262D, {0x00,0x00,0x70,0x88,0x28,0x68,0xC8,0xA8,0x18,0x48,0xB4,0x00,0x00}}, +{ 0x262E, {0x00,0x00,0x70,0xA8,0xA8,0xA8,0xA8,0xF8,0xA8,0xA8,0x70,0x00,0x00}}, +{ 0x262F, {0x00,0x00,0x00,0x00,0x00,0x78,0x84,0xEC,0xA4,0xFC,0x78,0x00,0x00}}, +{ 0x2630, {0x00,0x00,0x00,0xF8,0xF8,0x00,0xF8,0xF8,0x00,0xF8,0xF8,0x00,0x00}}, +{ 0x2631, {0x00,0x00,0x00,0xD8,0xD8,0x00,0xF8,0xF8,0x00,0xF8,0xF8,0x00,0x00}}, +{ 0x2632, {0x00,0x00,0x00,0xF8,0xF8,0x00,0xD8,0xD8,0x00,0xF8,0xF8,0x00,0x00}}, +{ 0x2633, {0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xF8,0xF8,0x00,0x00}}, +{ 0x2634, {0x00,0x00,0x00,0xF8,0xF8,0x00,0xF8,0xF8,0x00,0xD8,0xD8,0x00,0x00}}, +{ 0x2635, {0x00,0x00,0x00,0xD8,0xD8,0x00,0xF8,0xF8,0x00,0xD8,0xD8,0x00,0x00}}, +{ 0x2636, {0x00,0x00,0x00,0xF8,0xF8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00}}, +{ 0x2637, {0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00}}, +{ 0x2638, {0x00,0x00,0x00,0x00,0x20,0xA8,0x70,0xD8,0x70,0xA8,0x20,0x00,0x00}}, +{ 0x2639, {0x00,0x00,0x78,0x84,0xCC,0x84,0xB4,0x84,0xB4,0xCC,0x84,0x78,0x00}}, +{ 0x263A, {0x00,0x00,0x78,0x84,0xCC,0x84,0xB4,0x84,0xCC,0xB4,0x84,0x78,0x00}}, +{ 0x263B, {0x00,0x00,0x78,0xFC,0xB4,0xFC,0xCC,0xFC,0xB4,0xCC,0x78,0x00,0x00}}, +{ 0x263C, {0x00,0x00,0x20,0x20,0x88,0x20,0x50,0x20,0x88,0x20,0x20,0x00,0x00}}, +{ 0x263D, {0x00,0x00,0x70,0xC8,0x28,0x28,0x28,0x28,0x28,0xC8,0x70,0x00,0x00}}, +{ 0x263E, {0x00,0x00,0x70,0x98,0xA0,0xA0,0xA0,0xA0,0xA0,0x98,0x70,0x00,0x00}}, +{ 0x263F, {0x00,0x00,0x88,0x70,0x88,0x88,0x88,0x70,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2640, {0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2641, {0x00,0x00,0x00,0x20,0x70,0x20,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x2642, {0x00,0x00,0x00,0x00,0x1C,0x0C,0x74,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0x2643, {0x00,0x00,0x08,0x48,0xA8,0x28,0x28,0x48,0xF8,0x08,0x08,0x00,0x00}}, +{ 0x2644, {0x00,0x00,0x40,0xE0,0x40,0x50,0x68,0x48,0x48,0x50,0x50,0x00,0x00}}, +{ 0x2645, {0x00,0x00,0x88,0xA8,0xA8,0xF8,0xA8,0xA8,0xA8,0x20,0x50,0x20,0x00}}, +{ 0x2646, {0x00,0x00,0xA8,0xFC,0xA8,0xA8,0xA8,0x70,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2647, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x2648, {0x00,0x00,0x50,0xA8,0xA8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2649, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x20,0x50,0x20,0x00,0x00}}, +{ 0x264A, {0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0xF8,0x00,0x00}}, +{ 0x264B, {0x00,0x00,0x00,0x30,0x48,0xA0,0x40,0x10,0x28,0x90,0x60,0x00,0x00}}, +{ 0x264C, {0x00,0x00,0x00,0x70,0x88,0x88,0x48,0x28,0x68,0xA8,0x48,0x04,0x00}}, +{ 0x264D, {0x00,0x00,0xAC,0xFC,0xAC,0xAC,0xAC,0xAC,0xA8,0xA8,0xA8,0x18,0x28}}, +{ 0x264E, {0x00,0x00,0x00,0x00,0x70,0x88,0x50,0x50,0xD8,0x00,0xF8,0x00,0x00}}, +{ 0x264F, {0x00,0x00,0xA8,0xF8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0xA8,0x0C,0x00}}, +{ 0x2650, {0x00,0x00,0x00,0x00,0x00,0x38,0x18,0xA8,0x40,0xA0,0x00,0x00,0x00}}, +{ 0x2651, {0x00,0x00,0x00,0x80,0x90,0xA8,0xB0,0xC8,0x88,0x08,0x30,0x00,0x00}}, +{ 0x2652, {0x00,0x00,0x00,0x00,0x00,0x54,0xA8,0x00,0x00,0x54,0xA8,0x00,0x00}}, +{ 0x2653, {0x00,0x00,0x88,0x50,0x50,0x50,0xF8,0x50,0x50,0x50,0x88,0x00,0x00}}, +{ 0x2654, {0x20,0x70,0x70,0xA8,0xF8,0x88,0x50,0x50,0xF8,0x88,0xF8,0x00,0x00}}, +{ 0x2655, {0x00,0xA8,0xF8,0x88,0xF8,0x50,0x50,0x88,0xF8,0x88,0xF8,0x00,0x00}}, +{ 0x2656, {0x00,0x00,0x00,0xA8,0xF8,0x88,0x50,0x50,0x50,0x88,0xF8,0x00,0x00}}, +{ 0x2657, {0x00,0x20,0x50,0x70,0xD8,0x88,0x50,0x50,0x70,0x88,0xF8,0x00,0x00}}, +{ 0x2658, {0x00,0x00,0x10,0x38,0x68,0x88,0xE8,0x28,0x38,0x48,0x78,0x00,0x00}}, +{ 0x2659, {0x00,0x00,0x00,0x20,0x50,0x20,0x50,0x50,0x70,0x88,0xF8,0x00,0x00}}, +{ 0x265A, {0x20,0x70,0x70,0xA8,0xF8,0xF8,0x70,0x70,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x265B, {0x00,0xA8,0xF8,0xF8,0xF8,0x70,0x70,0xF8,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x265C, {0x00,0x00,0x00,0xA8,0xF8,0xF8,0x70,0x70,0x70,0xF8,0xF8,0x00,0x00}}, +{ 0x265D, {0x00,0x20,0x70,0x70,0xD8,0x88,0x50,0x50,0x70,0xF8,0xF8,0x00,0x00}}, +{ 0x265E, {0x00,0x00,0x10,0x38,0x58,0xF8,0xF8,0x38,0x38,0x78,0x78,0x00,0x00}}, +{ 0x265F, {0x00,0x00,0x00,0x20,0x70,0x20,0x70,0x70,0x70,0xF8,0xF8,0x00,0x00}}, +{ 0x2660, {0x00,0x00,0x00,0x20,0x20,0x70,0x70,0xF8,0xF8,0x20,0x70,0x00,0x00}}, +{ 0x2661, {0x00,0x00,0x00,0x00,0x50,0xA8,0xA8,0x88,0x50,0x20,0x20,0x00,0x00}}, +{ 0x2662, {0x00,0x00,0x00,0x00,0x20,0x50,0x50,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0x2663, {0x00,0x00,0x20,0x70,0x20,0xA8,0xF8,0xF8,0xA8,0x20,0x70,0x00,0x00}}, +{ 0x2664, {0x00,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0xF8,0x20,0x70,0x00,0x00}}, +{ 0x2665, {0x00,0x00,0x00,0x00,0x50,0xF8,0xF8,0xF8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x2666, {0x00,0x00,0x00,0x00,0x20,0x70,0x70,0xF8,0x70,0x70,0x20,0x00,0x00}}, +{ 0x2667, {0x00,0x00,0x00,0x20,0x50,0x20,0x70,0xA8,0x70,0x20,0x70,0x00,0x00}}, +{ 0x2668, {0x00,0x00,0x00,0x90,0x48,0x90,0x48,0x00,0x50,0x88,0x70,0x00,0x00}}, +{ 0x2669, {0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0xF0,0x60,0x00,0x00}}, +{ 0x266A, {0x00,0x00,0x10,0x18,0x14,0x10,0x10,0x10,0x70,0xF0,0x60,0x00,0x00}}, +{ 0x266B, {0x00,0x00,0x40,0x60,0x50,0x48,0x48,0xC8,0xC8,0x18,0x18,0x00,0x00}}, +{ 0x266C, {0x00,0x00,0x40,0x60,0x50,0x68,0x58,0xC8,0xC8,0x18,0x18,0x00,0x00}}, +{ 0x266D, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x90,0xE0,0x00,0x00}}, +{ 0x266E, {0x00,0x00,0x80,0x88,0x98,0xA8,0xC8,0x98,0xA8,0xC8,0x88,0x08,0x00}}, +{ 0x266F, {0x00,0x00,0x10,0x58,0x70,0xD0,0x50,0x58,0x70,0xD0,0x40,0x00,0x00}}, +{ 0x2670, {0x00,0x00,0x50,0x20,0xA8,0x70,0xA8,0x20,0x20,0x20,0x50,0x00,0x00}}, +{ 0x2671, {0x00,0x20,0x50,0x20,0xA8,0xD8,0xA8,0x20,0x20,0x20,0x50,0x20,0x00}}, +{ 0x2672, {0x00,0x00,0x00,0x30,0x08,0xC4,0x4C,0x80,0x94,0xA8,0x10,0x00,0x00}}, +{ 0x2673, {0x00,0x10,0x08,0xC4,0xCC,0xAC,0xA0,0xA4,0xA4,0x94,0x38,0x10,0x00}}, +{ 0x2674, {0x00,0x10,0x08,0xC4,0xEC,0xDC,0xB0,0xC4,0xF4,0x94,0x38,0x10,0x00}}, +{ 0x2675, {0x00,0x10,0x08,0xC4,0xEC,0xDC,0x90,0xB4,0xD4,0xB4,0x38,0x10,0x00}}, +{ 0x2676, {0x00,0x10,0x08,0xC4,0xCC,0xCC,0xD0,0xFC,0x94,0x94,0x38,0x10,0x00}}, +{ 0x2677, {0x00,0x10,0x08,0xC4,0xCC,0xFC,0xC0,0xE4,0x94,0xF4,0x38,0x10,0x00}}, +{ 0x2678, {0x00,0x10,0x08,0xC4,0xDC,0xAC,0xE0,0xD4,0xD4,0xB4,0x38,0x10,0x00}}, +{ 0x2679, {0x00,0x10,0x08,0xC4,0xCC,0xFC,0x90,0xA4,0xA4,0xB4,0x38,0x10,0x00}}, +{ 0x267A, {0x00,0x10,0x08,0xC4,0xCC,0x8C,0x80,0x84,0x84,0x94,0x38,0x10,0x00}}, +{ 0x267B, {0x00,0x00,0x00,0x30,0x28,0xCC,0xCC,0x80,0x94,0xB8,0x10,0x00,0x00}}, +{ 0x267C, {0x00,0x78,0xFC,0xCC,0xD4,0x30,0x30,0x7C,0x68,0x44,0xEC,0xFC,0x78}}, +{ 0x267D, {0x00,0x78,0x84,0x30,0x28,0xCC,0xCC,0x80,0x94,0xB8,0x10,0x84,0x78}}, +{ 0x2680, {0x00,0x00,0xF8,0x88,0x88,0x88,0xA8,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x2681, {0x00,0x00,0xF8,0x88,0xC8,0x88,0x88,0x88,0x98,0x88,0xF8,0x00,0x00}}, +{ 0x2682, {0x00,0x00,0xF8,0x88,0xC8,0x88,0xA8,0x88,0x98,0x88,0xF8,0x00,0x00}}, +{ 0x2683, {0x00,0x00,0xF8,0x88,0xD8,0x88,0x88,0x88,0xD8,0x88,0xF8,0x00,0x00}}, +{ 0x2684, {0x00,0x00,0xF8,0x88,0xD8,0x88,0xA8,0x88,0xD8,0x88,0xF8,0x00,0x00}}, +{ 0x2685, {0x00,0x00,0xF8,0x88,0xD8,0x88,0xD8,0x88,0xD8,0x88,0xF8,0x00,0x00}}, +{ 0x2686, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x98,0x88,0x70,0x00,0x00,0x00}}, +{ 0x2687, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xD8,0x88,0x70,0x00,0x00,0x00}}, +{ 0x2688, {0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0xE8,0xF8,0x70,0x00,0x00,0x00}}, +{ 0x2689, {0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0xA8,0xF8,0x70,0x00,0x00,0x00}}, +{ 0x2701, {0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20,0x50,0xBC,0x48,0x00,0x00}}, +{ 0x2702, {0x00,0x00,0x00,0x00,0x40,0xA4,0x68,0x10,0x68,0xA4,0x40,0x00,0x00}}, +{ 0x2703, {0x00,0x00,0x48,0xBC,0x50,0x20,0x50,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2704, {0x00,0x00,0x00,0x00,0x40,0xAC,0x78,0x10,0x78,0xAC,0x40,0x00,0x00}}, +{ 0x2706, {0x00,0x78,0x84,0xB4,0xB4,0xA4,0xA4,0xA4,0xB4,0xB4,0x44,0x78,0x00}}, +{ 0x2708, {0x00,0x00,0x20,0x20,0x10,0x90,0xFC,0x90,0x10,0x20,0x20,0x00,0x00}}, +{ 0x2713, {0x00,0x00,0x04,0x04,0x08,0x08,0x08,0x90,0x50,0x20,0x20,0x00,0x00}}, +{ 0x2714, {0x00,0x00,0x0C,0x0C,0x0C,0x18,0x18,0x98,0xD8,0x70,0x30,0x00,0x00}}, +{ 0x2715, {0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00,0x00}}, +{ 0x2716, {0x00,0x00,0x00,0x00,0x00,0x88,0xD8,0x70,0x70,0xD8,0x88,0x00,0x00}}, +{ 0x2717, {0x00,0x00,0x00,0x00,0x08,0x90,0x50,0x20,0x50,0x48,0x80,0x00,0x00}}, +{ 0x2718, {0x00,0x00,0x00,0x08,0x98,0xD0,0x70,0x70,0x58,0xC8,0x80,0x00,0x00}}, +{ 0x2719, {0x00,0x00,0x00,0x30,0x30,0x30,0xFC,0xFC,0x30,0x30,0x30,0x00,0x00}}, +{ 0x271A, {0x00,0x00,0x00,0x30,0x30,0x30,0xFC,0xFC,0x30,0x30,0x30,0x00,0x00}}, +{ 0x271B, {0x00,0x00,0x00,0x20,0x20,0x20,0xD8,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0x271C, {0x00,0x00,0x00,0x30,0x30,0x30,0xCC,0xCC,0x30,0x30,0x30,0x00,0x00}}, +{ 0x271D, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x271E, {0x00,0x00,0x70,0x58,0xDC,0x8C,0xDC,0x5C,0x58,0x58,0x78,0x38,0x00}}, +{ 0x271F, {0x00,0x00,0x30,0x30,0xFC,0xFC,0x30,0x30,0x30,0x30,0x30,0x00,0x00}}, +{ 0x2720, {0x00,0x00,0x00,0x00,0x70,0x20,0xA8,0xF8,0xA8,0x20,0x70,0x00,0x00}}, +{ 0x2722, {0x00,0x00,0x00,0x30,0x30,0x30,0xFC,0xFC,0x30,0x30,0x30,0x00,0x00}}, +{ 0x2723, {0x00,0x00,0x20,0x70,0x20,0xA8,0xF8,0xA8,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2724, {0x00,0x00,0x20,0x70,0x20,0xA8,0xF8,0xA8,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2725, {0x00,0x00,0x20,0x70,0x20,0xA8,0xF8,0xA8,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2726, {0x00,0x00,0x00,0x00,0x20,0x70,0xF8,0x70,0x20,0x00,0x00,0x00,0x00}}, +{ 0x2727, {0x00,0x00,0x00,0x00,0x20,0x50,0x88,0x50,0x20,0x00,0x00,0x00,0x00}}, +{ 0x2729, {0x00,0x00,0x00,0x20,0x20,0xF8,0x50,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x272A, {0x00,0x00,0x70,0xD8,0xD8,0x00,0x88,0x88,0x70,0xF8,0x70,0x00,0x00}}, +{ 0x272B, {0x00,0x00,0x00,0x20,0x20,0xF8,0x50,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x272C, {0x00,0x00,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x272D, {0x00,0x00,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x272E, {0x00,0x00,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x272F, {0x00,0x00,0x00,0x20,0x20,0xF8,0x70,0x70,0x88,0x00,0x00,0x00,0x00}}, +{ 0x2730, {0x00,0x00,0x00,0x30,0x30,0xFC,0x58,0x78,0xCC,0x00,0x00,0x00,0x00}}, +{ 0x2731, {0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2732, {0x00,0x00,0x00,0x20,0xA8,0x70,0x50,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2733, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2734, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2735, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2736, {0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2737, {0x00,0x00,0x00,0x50,0x50,0xF8,0x20,0xF8,0x50,0x50,0x00,0x00,0x00}}, +{ 0x2738, {0x00,0x00,0x00,0x50,0x70,0xF8,0x70,0xF8,0x70,0x50,0x00,0x00,0x00}}, +{ 0x273B, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x273C, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x50,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x273D, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x273E, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x50,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x273F, {0x00,0x00,0x00,0x00,0x20,0xF8,0x50,0x70,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2743, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2744, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2745, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2746, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2747, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2748, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x2749, {0x00,0x00,0x00,0x20,0xA8,0xA8,0x70,0xA8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x274A, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x274B, {0x00,0x00,0x00,0x20,0xA8,0x70,0xF8,0x70,0xA8,0x20,0x00,0x00,0x00}}, +{ 0x274D, {0x00,0x00,0x00,0x00,0x00,0x78,0x8C,0x8C,0x8C,0x8C,0x78,0x00,0x00}}, +{ 0x274F, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x8C,0x8C,0xFC,0x3C,0x00,0x00}}, +{ 0x2750, {0x00,0x00,0x00,0x00,0x00,0x3C,0xFC,0x8C,0x8C,0x88,0xF8,0x00,0x00}}, +{ 0x2751, {0x00,0x00,0x00,0x00,0x00,0xF8,0x8C,0x8C,0x8C,0xFC,0x7C,0x00,0x00}}, +{ 0x2752, {0x00,0x00,0x00,0x00,0x00,0x7C,0xFC,0x8C,0x8C,0x8C,0xF8,0x00,0x00}}, +{ 0x2756, {0x00,0x00,0x20,0x70,0x20,0x50,0xF8,0x50,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2758, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x2759, {0x00,0x00,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x70,0x00,0x00}}, +{ 0x275A, {0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00}}, +{ 0x275B, {0x00,0x30,0x40,0x70,0x70,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x275C, {0x00,0x20,0x70,0x70,0x10,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x275D, {0x00,0x6C,0x90,0xFC,0xFC,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x275E, {0x00,0x48,0xFC,0xFC,0x24,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2761, {0x00,0x08,0x7C,0xE8,0xE8,0x78,0x08,0x68,0x68,0x48,0x30,0x00,0x00}}, +{ 0x2762, {0x00,0x00,0x20,0x70,0x70,0x20,0x20,0x00,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2763, {0x00,0x00,0x50,0xF8,0xF8,0x70,0x20,0x00,0x20,0x70,0x20,0x00,0x00}}, +{ 0x2764, {0x00,0x00,0x00,0x00,0x50,0xF8,0xF8,0xF8,0x70,0x20,0x20,0x00,0x00}}, +{ 0x2765, {0x00,0x00,0x00,0x00,0x60,0xF0,0xF8,0x7C,0xF8,0xF0,0x60,0x00,0x00}}, +{ 0x2766, {0x00,0x00,0x68,0xB0,0x10,0xD8,0xF8,0xF0,0x60,0x68,0x30,0x00,0x00}}, +{ 0x2767, {0x00,0x00,0x00,0x40,0x90,0xB8,0x7C,0x5C,0xBC,0xB8,0x50,0x00,0x00}}, +{ 0x2776, {0x00,0x00,0x70,0xF8,0xD8,0x98,0xD8,0xD8,0x88,0xF8,0x70,0x00,0x00}}, +{ 0x2777, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xE8,0xD8,0x88,0xF8,0x70,0x00,0x00}}, +{ 0x2778, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xD8,0xE8,0x98,0xF8,0x70,0x00,0x00}}, +{ 0x2779, {0x00,0x00,0x70,0xF8,0xB8,0xB8,0x98,0x88,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x277A, {0x00,0x00,0x70,0xF8,0x88,0xB8,0x98,0xE8,0x98,0xF8,0x70,0x00,0x00}}, +{ 0x277B, {0x00,0x00,0x70,0xF8,0xC8,0xB8,0x98,0xA8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x277C, {0x00,0x00,0x70,0xF8,0x88,0xE8,0xD8,0xD8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x277D, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xD8,0xA8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x277E, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xC8,0xE8,0x98,0xF8,0x70,0x00,0x00}}, +{ 0x277F, {0x00,0x00,0x78,0xFC,0xAC,0x94,0x94,0x94,0xAC,0xFC,0x78,0x00,0x00}}, +{ 0x2780, {0x00,0x00,0x70,0x88,0xA8,0xE8,0xA8,0xA8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2781, {0x00,0x00,0x70,0x88,0xA8,0xD8,0x98,0xA8,0xF8,0x88,0x70,0x00,0x00}}, +{ 0x2782, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0x98,0xE8,0x88,0x70,0x00,0x00}}, +{ 0x2783, {0x00,0x00,0x70,0x88,0xC8,0xC8,0xE8,0xF8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2784, {0x00,0x00,0x70,0x88,0xF8,0xC8,0xE8,0x98,0xE8,0x88,0x70,0x00,0x00}}, +{ 0x2785, {0x00,0x00,0x70,0x88,0xB8,0xC8,0xE8,0xD8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2786, {0x00,0x00,0x70,0x88,0xF8,0x98,0xA8,0xA8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2787, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xA8,0xD8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x2788, {0x00,0x00,0x70,0x88,0xA8,0xD8,0xB8,0x98,0xE8,0x88,0x70,0x00,0x00}}, +{ 0x2789, {0x00,0x00,0x78,0x84,0xD4,0xEC,0xEC,0xEC,0xD4,0x84,0x78,0x00,0x00}}, +{ 0x278A, {0x00,0x00,0x70,0xF8,0xD8,0x98,0xD8,0xD8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x278B, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xE8,0xD8,0x88,0xF8,0x70,0x00,0x00}}, +{ 0x278C, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xD8,0xE8,0x98,0xF8,0x70,0x00,0x00}}, +{ 0x278D, {0x00,0x00,0x70,0xF8,0xB8,0xB8,0x98,0x88,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x278E, {0x00,0x00,0x70,0xF8,0x88,0xB8,0x98,0xE8,0x98,0xF8,0x70,0x00,0x00}}, +{ 0x278F, {0x00,0x00,0x70,0xF8,0xC8,0xB8,0x98,0xA8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x2790, {0x00,0x00,0x70,0xF8,0x88,0xE8,0xD8,0xD8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x2791, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xD8,0xA8,0xD8,0xF8,0x70,0x00,0x00}}, +{ 0x2792, {0x00,0x00,0x70,0xF8,0xD8,0xA8,0xC8,0xE8,0x98,0xF8,0x70,0x00,0x00}}, +{ 0x2793, {0x00,0x00,0x78,0xFC,0xAC,0x94,0x94,0x94,0xAC,0xFC,0x78,0x00,0x00}}, +{ 0x2794, {0x00,0x00,0x00,0x30,0x18,0xFC,0xFC,0x18,0x30,0x00,0x00,0x00,0x00}}, +{ 0x2798, {0x00,0x00,0x00,0x00,0x80,0x40,0x28,0x18,0x38,0x00,0x00,0x00,0x00}}, +{ 0x2799, {0x00,0x00,0x00,0x00,0x20,0x30,0xF8,0x30,0x20,0x00,0x00,0x00,0x00}}, +{ 0x279A, {0x00,0x00,0x00,0x00,0x38,0x18,0x28,0x40,0x80,0x00,0x00,0x00,0x00}}, +{ 0x279B, {0x00,0x00,0x00,0x40,0x20,0x30,0xFC,0x30,0x20,0x40,0x00,0x00,0x00}}, +{ 0x279C, {0x00,0x00,0x20,0x30,0x18,0xFC,0xFC,0x18,0x30,0x20,0x00,0x00,0x00}}, +{ 0x279D, {0x00,0x00,0x00,0x00,0x10,0x18,0xFC,0x18,0x10,0x00,0x00,0x00,0x00}}, +{ 0x279E, {0x00,0x00,0x00,0x10,0x18,0xFC,0xFC,0x18,0x10,0x00,0x00,0x00,0x00}}, +{ 0x279F, {0x00,0x00,0x00,0x10,0x18,0xBC,0xBC,0x18,0x10,0x00,0x00,0x00,0x00}}, +{ 0x27A0, {0x00,0x00,0x00,0x20,0x30,0xB8,0xBC,0xB8,0x30,0x20,0x00,0x00,0x00}}, +{ 0x27A1, {0x00,0x00,0x00,0x20,0x30,0xF8,0xFC,0xF8,0x30,0x20,0x00,0x00,0x00}}, +{ 0x27A4, {0x00,0x00,0x00,0x00,0xC0,0x70,0x3C,0x70,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x27A5, {0x00,0x00,0x00,0x20,0xB0,0xF8,0xFC,0x78,0x30,0x20,0x00,0x00,0x00}}, +{ 0x27A6, {0x00,0x00,0x00,0x20,0x30,0x78,0xFC,0xF8,0xB0,0x20,0x00,0x00,0x00}}, +{ 0x27A7, {0x20,0x20,0x30,0xF0,0xF8,0xF8,0xFC,0xF8,0xF8,0xF0,0x30,0x20,0x20}}, +{ 0x27B2, {0x00,0x78,0xFC,0xDC,0xCC,0x04,0x00,0x04,0xCC,0xDC,0xF8,0x78,0x00}}, +{ 0x27B4, {0x00,0x00,0x00,0x20,0x20,0xE0,0x14,0x0C,0x1C,0x00,0x00,0x00,0x00}}, +{ 0x27B5, {0x00,0x00,0x00,0x00,0x90,0xC8,0x7C,0xC8,0x90,0x00,0x00,0x00,0x00}}, +{ 0x27B6, {0x00,0x00,0x00,0x1C,0x0C,0x14,0xE0,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x27B7, {0x00,0x00,0x00,0x20,0x20,0xE0,0x14,0x0C,0x1C,0x00,0x00,0x00,0x00}}, +{ 0x27B8, {0x00,0x00,0x00,0x00,0x90,0xC8,0x7C,0xC8,0x90,0x00,0x00,0x00,0x00}}, +{ 0x27B9, {0x00,0x00,0x00,0x1C,0x0C,0x14,0xE0,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0x27BA, {0x00,0x00,0x00,0x00,0x10,0x08,0xFC,0x08,0x10,0x00,0x00,0x00,0x00}}, +{ 0x27BB, {0x00,0x00,0x00,0x00,0x10,0xC8,0xFC,0xC8,0x10,0x00,0x00,0x00,0x00}}, +{ 0x27BC, {0x00,0x00,0x00,0x00,0x00,0xE8,0x7C,0xE8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x27BD, {0x00,0x00,0x00,0x00,0xD0,0xD8,0x7C,0xD8,0xD0,0x00,0x00,0x00,0x00}}, +{ 0x27BE, {0x00,0x00,0xA0,0x50,0x28,0xF4,0x04,0xF4,0x28,0x50,0xA0,0x00,0x00}}, +{ 0x27E6, {0x00,0xF8,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xF8,0x00}}, +{ 0x27E7, {0x00,0xF8,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0xF8,0x00}}, +{ 0x27E8, {0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x10,0x08,0x00}}, +{ 0x27E9, {0x00,0x40,0x20,0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0x27EA, {0x00,0x14,0x28,0x28,0x50,0x50,0xA0,0x50,0x50,0x28,0x28,0x14,0x00}}, +{ 0x27EB, {0x00,0xA0,0x50,0x50,0x28,0x28,0x14,0x28,0x28,0x50,0x50,0xA0,0x00}}, +{ 0x27F5, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0xFC,0x40,0x20,0x00,0x00,0x00}}, +{ 0x27F6, {0x00,0x00,0x00,0x00,0x00,0x10,0x08,0xFC,0x08,0x10,0x00,0x00,0x00}}, +{ 0x27F7, {0x00,0x00,0x00,0x00,0x00,0x00,0x48,0xFC,0x48,0x00,0x00,0x00,0x00}}, +{ 0x27F8, {0x00,0x00,0x00,0x00,0x10,0x20,0x7C,0x80,0x7C,0x20,0x10,0x00,0x00}}, +{ 0x27F9, {0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x04,0xF8,0x10,0x20,0x00,0x00}}, +{ 0x27FA, {0x00,0x00,0x00,0x00,0x00,0x48,0xFC,0x84,0xFC,0x48,0x00,0x00,0x00}}, +{ 0x27FB, {0x00,0x00,0x00,0x00,0x00,0x24,0x44,0xFC,0x44,0x24,0x00,0x00,0x00}}, +{ 0x27FC, {0x00,0x00,0x00,0x00,0x00,0x90,0x88,0xFC,0x88,0x90,0x00,0x00,0x00}}, +{ 0x27FD, {0x00,0x00,0x00,0x00,0x14,0x24,0x7C,0x84,0x7C,0x24,0x14,0x00,0x00}}, +{ 0x27FE, {0x00,0x00,0x00,0x00,0xA0,0x90,0xF8,0x84,0xF8,0x90,0xA0,0x00,0x00}}, +{ 0x27FF, {0x00,0x00,0x00,0x00,0x00,0x08,0x5C,0xAC,0x08,0x00,0x00,0x00,0x00}}, +{ 0x2800, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2801, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2802, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2803, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2804, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2805, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2806, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2807, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2808, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2809, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x280A, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x280B, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x280C, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x280D, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x280E, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x280F, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2810, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2811, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2812, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2813, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2814, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2815, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2816, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2817, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2818, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x2819, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x281A, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x281B, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x281C, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x281D, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x281E, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x281F, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00}}, +{ 0x2820, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2821, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2822, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2823, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2824, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2825, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2826, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2827, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2828, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2829, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x282A, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x282B, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x282C, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x282D, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x282E, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x282F, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2830, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2831, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2832, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2833, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2834, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2835, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2836, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2837, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2838, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x2839, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x283A, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x283B, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00}}, +{ 0x283C, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x283D, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x283E, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x283F, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00}}, +{ 0x2840, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2841, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2842, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2843, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2844, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2845, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2846, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2847, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2848, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2849, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x284A, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x284B, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x284C, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x284D, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x284E, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x284F, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2850, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2851, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2852, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2853, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2854, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2855, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2856, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2857, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2858, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x2859, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x285A, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x285B, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}}, +{ 0x285C, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x285D, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x285E, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x285F, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}}, +{ 0x2860, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2861, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2862, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2863, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2864, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2865, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2866, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2867, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2868, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2869, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x286A, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x286B, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x286C, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x286D, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x286E, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x286F, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2870, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2871, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2872, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2873, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2874, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2875, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2876, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2877, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2878, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x2879, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x287A, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x287B, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00}}, +{ 0x287C, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x287D, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x287E, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x287F, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00}}, +{ 0x2880, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2881, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2882, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2883, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2884, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2885, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2886, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2887, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2888, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2889, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x288A, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x288B, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x288C, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x288D, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x288E, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x288F, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2890, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2891, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2892, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2893, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2894, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2895, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2896, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2897, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x2898, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x2899, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x289A, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x289B, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00}}, +{ 0x289C, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x289D, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x289E, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x289F, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00}}, +{ 0x28A0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28A1, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28A2, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28A3, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28A4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28A5, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28A6, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28A7, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28A8, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28A9, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28AA, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28AB, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28AC, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28AD, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28AE, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28AF, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28B0, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28B1, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28B2, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28B3, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28B4, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28B5, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28B6, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28B7, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28B8, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28B9, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28BA, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28BB, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00}}, +{ 0x28BC, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28BD, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28BE, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28BF, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00}}, +{ 0x28C0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28C1, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28C2, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28C3, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28C4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28C5, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28C6, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28C7, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28C8, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28C9, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28CA, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28CB, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28CC, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28CD, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28CE, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28CF, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28D0, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28D1, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28D2, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28D3, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28D4, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28D5, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28D6, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28D7, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28D8, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28D9, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28DA, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28DB, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00}}, +{ 0x28DC, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28DD, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28DE, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28DF, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00}}, +{ 0x28E0, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28E1, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28E2, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28E3, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28E4, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28E5, {0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28E6, {0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28E7, {0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28E8, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28E9, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28EA, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28EB, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28EC, {0x00,0x18,0x18,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28ED, {0x00,0xD8,0xD8,0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28EE, {0x00,0x18,0x18,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28EF, {0x00,0xD8,0xD8,0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28F0, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28F1, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28F2, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28F3, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28F4, {0x00,0x00,0x00,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28F5, {0x00,0xC0,0xC0,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28F6, {0x00,0x00,0x00,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28F7, {0x00,0xC0,0xC0,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28F8, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28F9, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28FA, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28FB, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00}}, +{ 0x28FC, {0x00,0x18,0x18,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28FD, {0x00,0xD8,0xD8,0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28FE, {0x00,0x18,0x18,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x28FF, {0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00,0xD8,0xD8,0x00}}, +{ 0x2906, {0x00,0x00,0x00,0x00,0x14,0x24,0x7C,0x84,0x7C,0x24,0x14,0x00,0x00}}, +{ 0x2907, {0x00,0x00,0x00,0x00,0xA0,0x90,0xF8,0x84,0xF8,0x90,0xA0,0x00,0x00}}, +{ 0x2983, {0x00,0x38,0x50,0x50,0x50,0x50,0x90,0x50,0x50,0x50,0x50,0x38,0x00}}, +{ 0x2984, {0x00,0xE0,0x50,0x50,0x50,0x50,0x48,0x50,0x50,0x50,0x50,0xE0,0x00}}, +{ 0x2985, {0x00,0x08,0x10,0x30,0x30,0x50,0x50,0x50,0x30,0x30,0x10,0x08,0x00}}, +{ 0x2986, {0x00,0x40,0x20,0x30,0x30,0x28,0x28,0x28,0x30,0x30,0x20,0x40,0x00}}, +{ 0x2987, {0x00,0x10,0x30,0x30,0x50,0x50,0x50,0x50,0x50,0x30,0x30,0x10,0x00}}, +{ 0x2988, {0x00,0x40,0x60,0x60,0x50,0x50,0x50,0x50,0x50,0x60,0x60,0x40,0x00}}, +{ 0x2989, {0x00,0x08,0x18,0x18,0x28,0x28,0x48,0x28,0x28,0x18,0x18,0x08,0x00}}, +{ 0x298A, {0x00,0x40,0x60,0x60,0x50,0x50,0x48,0x50,0x50,0x60,0x60,0x40,0x00}}, +{ 0x298B, {0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00,0x70}}, +{ 0x298C, {0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00,0x70}}, +{ 0x298D, {0x00,0x70,0x60,0x50,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00}}, +{ 0x298E, {0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x50,0x30,0x70,0x00}}, +{ 0x298F, {0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x50,0x60,0x70,0x00}}, +{ 0x2990, {0x00,0x70,0x30,0x50,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00}}, +{ 0x2991, {0x00,0x08,0x10,0x10,0x20,0x20,0x48,0x20,0x20,0x10,0x10,0x08,0x00}}, +{ 0x2992, {0x00,0x40,0x20,0x20,0x10,0x10,0x48,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0x2993, {0x00,0x00,0x10,0x20,0x38,0x60,0xA0,0x60,0x38,0x20,0x10,0x00,0x00}}, +{ 0x2994, {0x00,0x00,0x40,0x20,0xE0,0x30,0x28,0x30,0xE0,0x20,0x40,0x00,0x00}}, +{ 0x2995, {0x00,0x00,0x28,0x50,0xD0,0x70,0x58,0x70,0xD0,0x50,0x28,0x00,0x00}}, +{ 0x2996, {0x00,0x00,0xA0,0x50,0x58,0x70,0xD0,0x70,0x58,0x50,0xA0,0x00,0x00}}, +{ 0x2997, {0x00,0x10,0x20,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x20,0x10,0x00}}, +{ 0x2998, {0x00,0x40,0x20,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x20,0x40,0x00}}, +{ 0x29FC, {0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x20,0x10,0x10,0x08,0x08,0x00}}, +{ 0x29FD, {0x00,0x40,0x40,0x20,0x20,0x10,0x08,0x10,0x20,0x20,0x40,0x40,0x00}}, +{ 0x2A00, {0x00,0x70,0x88,0x88,0x88,0xA8,0xA8,0x88,0x88,0x88,0x88,0x70,0x00}}, +{ 0x2A01, {0x00,0x70,0xA8,0xA8,0xA8,0xA8,0xF8,0xA8,0xA8,0xA8,0xA8,0x70,0x00}}, +{ 0x2A02, {0x00,0x70,0x88,0xD8,0xD8,0xA8,0xA8,0xA8,0xD8,0xD8,0x88,0x70,0x00}}, +{ 0x2A03, {0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xA8,0xA8,0x88,0x70,0x00}}, +{ 0x2A04, {0x00,0x88,0x88,0x88,0x88,0x88,0xA8,0xA8,0xF8,0xA8,0xA8,0x70,0x00}}, +{ 0x2A05, {0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x00}}, +{ 0x2A06, {0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x00}}, +{ 0x2A09, {0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x50,0x50,0x88,0x88,0x00}}, +{ 0x2A1D, {0x00,0x00,0x00,0x84,0xCC,0xB4,0xB4,0xB4,0xCC,0x84,0x00,0x00,0x00}}, +{ 0x2A3F, {0x00,0x00,0xEC,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xFC,0x00,0x00}}, +{ 0x3000, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x3001, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x00}}, +{ 0x3002, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20,0x00,0x00}}, +{ 0x3003, {0x00,0x00,0x00,0x00,0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00}}, +{ 0x3005, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x78,0x48,0xB0,0x90,0x00,0x00}}, +{ 0x3006, {0x00,0x00,0x00,0x00,0x00,0x08,0x50,0xA0,0xB0,0xC0,0x80,0x00,0x00}}, +{ 0x3008, {0x00,0x08,0x10,0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x10,0x08,0x00}}, +{ 0x3009, {0x00,0x40,0x20,0x20,0x10,0x10,0x08,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0x300A, {0x00,0x14,0x28,0x28,0x50,0x50,0xA0,0x50,0x50,0x28,0x28,0x14,0x00}}, +{ 0x300B, {0x00,0xA0,0x50,0x50,0x28,0x28,0x14,0x28,0x28,0x50,0x50,0xA0,0x00}}, +{ 0x300C, {0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00}}, +{ 0x300D, {0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00,0x00}}, +{ 0x300E, {0x00,0xF8,0x88,0xB8,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xE0,0x00,0x00}}, +{ 0x300F, {0x00,0x00,0x38,0x28,0x28,0x28,0x28,0x28,0x28,0xE8,0x88,0xF8,0x00}}, +{ 0x3010, {0x00,0x78,0x70,0x70,0x60,0x60,0x60,0x60,0x60,0x70,0x70,0x78,0x00}}, +{ 0x3011, {0x00,0x78,0x38,0x38,0x18,0x18,0x18,0x18,0x18,0x38,0x38,0x78,0x00}}, +{ 0x3012, {0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0xF8,0x20,0x20,0x20,0x00,0x00}}, +{ 0x3013, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0xF8,0xF8,0x00,0x00}}, +{ 0x3014, {0x00,0x10,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00}}, +{ 0x3015, {0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00}}, +{ 0x3016, {0x00,0xF8,0x90,0x90,0xA0,0xA0,0xA0,0xA0,0xA0,0x90,0x90,0xF8,0x00}}, +{ 0x3017, {0x00,0xF8,0x48,0x48,0x28,0x28,0x28,0x28,0x28,0x48,0x48,0xF8,0x00}}, +{ 0x3018, {0x00,0x08,0x10,0x30,0x50,0x50,0x50,0x50,0x50,0x30,0x10,0x08,0x00}}, +{ 0x3019, {0x00,0x40,0x20,0x30,0x28,0x28,0x28,0x28,0x28,0x30,0x20,0x40,0x00}}, +{ 0x301A, {0x00,0xF8,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xF8,0x00}}, +{ 0x301B, {0x00,0xF8,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0xF8,0x00}}, +{ 0x301C, {0x00,0x00,0x00,0x00,0x00,0x00,0x98,0x64,0x00,0x00,0x00,0x00,0x00}}, +{ 0x301D, {0x00,0x00,0x50,0x50,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x301E, {0x00,0x00,0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x301F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x28,0x50,0x00}}, +{ 0x3036, {0x00,0x00,0x70,0x88,0xF8,0x88,0xF8,0xA8,0xA8,0x88,0x70,0x00,0x00}}, +{ 0x303F, {0x00,0x00,0xF8,0xD8,0xD8,0xA8,0xA8,0xA8,0xD8,0xD8,0xF8,0x00,0x00}}, +{ 0x3099, {0x08,0x04,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x309A, {0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x309B, {0x40,0x20,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x309C, {0x40,0xA0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x30A1, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x50,0x60,0x40,0x80,0x00,0x00}}, +{ 0x30A2, {0x00,0x00,0xF8,0x08,0x28,0x28,0x30,0x20,0x20,0x40,0x80,0x00,0x00}}, +{ 0x30A3, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x60,0xA0,0x20,0x00,0x00}}, +{ 0x30A4, {0x00,0x00,0x08,0x10,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x30A5, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xE0,0xA0,0x20,0x40,0x00,0x00}}, +{ 0x30A6, {0x00,0x20,0x20,0xF8,0x88,0x88,0x08,0x08,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30A7, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x30A8, {0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x30A9, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xF0,0x20,0x60,0xA0,0x00,0x00}}, +{ 0x30AA, {0x00,0x00,0x10,0x10,0xF8,0x10,0x30,0x50,0x90,0x10,0x30,0x00,0x00}}, +{ 0x30AB, {0x00,0x00,0x20,0x20,0xF8,0x28,0x28,0x28,0x48,0x48,0x98,0x00,0x00}}, +{ 0x30AC, {0x08,0x04,0x28,0x24,0xF8,0x28,0x28,0x28,0x48,0x48,0x98,0x00,0x00}}, +{ 0x30AD, {0x00,0x00,0x40,0x40,0x58,0xE0,0x20,0x38,0xD0,0x10,0x10,0x00,0x00}}, +{ 0x30AE, {0x08,0x04,0x48,0x44,0x58,0xE0,0x20,0x38,0xD0,0x10,0x10,0x00,0x00}}, +{ 0x30AF, {0x00,0x00,0x78,0x48,0x48,0x88,0x08,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30B0, {0x08,0x04,0x78,0x4C,0x48,0x88,0x08,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30B1, {0x00,0x00,0x40,0x40,0x78,0x90,0x10,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0x30B2, {0x08,0x04,0x48,0x44,0x78,0x90,0x10,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0x30B3, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x30B4, {0x08,0x04,0x08,0xFC,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x30B5, {0x00,0x00,0x50,0x50,0xF8,0x50,0x50,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0x30B6, {0x08,0x04,0x58,0x54,0xF8,0x50,0x50,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0x30B7, {0x00,0x00,0x00,0xC0,0x08,0xC8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30B8, {0x08,0x04,0x08,0xC4,0x08,0xC8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30B9, {0x00,0x00,0xF8,0x08,0x08,0x10,0x10,0x30,0x30,0x48,0x88,0x00,0x00}}, +{ 0x30BA, {0x08,0x04,0xF8,0x0C,0x08,0x10,0x10,0x30,0x30,0x48,0x88,0x00,0x00}}, +{ 0x30BB, {0x00,0x00,0x40,0x40,0x78,0xC8,0x50,0x40,0x40,0x40,0x38,0x00,0x00}}, +{ 0x30BC, {0x08,0x04,0x48,0x44,0x78,0xC8,0x50,0x40,0x40,0x40,0x38,0x00,0x00}}, +{ 0x30BD, {0x00,0x00,0x08,0x88,0x48,0x48,0x10,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0x30BE, {0x08,0x04,0x08,0x8C,0x48,0x48,0x10,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0x30BF, {0x00,0x00,0x78,0x48,0x48,0x68,0x98,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30C0, {0x08,0x04,0x78,0x4C,0x48,0x68,0x98,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30C1, {0x00,0x00,0x10,0x20,0x60,0x20,0xF8,0x20,0x20,0x40,0x80,0x00,0x00}}, +{ 0x30C2, {0x08,0x04,0x18,0x24,0x60,0x20,0xF8,0x20,0x20,0x40,0x80,0x00,0x00}}, +{ 0x30C3, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x08,0x10,0xE0,0x00,0x00}}, +{ 0x30C4, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30C5, {0x08,0x04,0x08,0xAC,0xA8,0xA8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30C6, {0x00,0x00,0x70,0x00,0x00,0xF8,0x20,0x20,0x20,0x40,0x40,0x00,0x00}}, +{ 0x30C7, {0x08,0x04,0x78,0x04,0x00,0xF8,0x20,0x20,0x20,0x40,0x40,0x00,0x00}}, +{ 0x30C8, {0x00,0x00,0x80,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x80,0x00,0x00}}, +{ 0x30C9, {0x00,0x10,0x88,0x90,0x88,0xC0,0xA0,0x90,0x80,0x80,0x80,0x00,0x00}}, +{ 0x30CA, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20,0x40,0x40,0x80,0x00,0x00}}, +{ 0x30CB, {0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00}}, +{ 0x30CC, {0x00,0x00,0x00,0xF8,0x08,0x48,0x30,0x10,0x28,0x40,0x80,0x00,0x00}}, +{ 0x30CD, {0x00,0x00,0x20,0x20,0xF8,0x10,0x20,0x70,0xA8,0x20,0x20,0x00,0x00}}, +{ 0x30CE, {0x00,0x00,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x80,0x00,0x00}}, +{ 0x30CF, {0x00,0x00,0x00,0x50,0x50,0x50,0x48,0x48,0x88,0x88,0x88,0x00,0x00}}, +{ 0x30D0, {0x08,0x04,0x08,0x54,0x50,0x50,0x48,0x48,0x88,0x88,0x88,0x00,0x00}}, +{ 0x30D1, {0x00,0x0C,0x0C,0x50,0x50,0x50,0x48,0x48,0x88,0x88,0x88,0x00,0x00}}, +{ 0x30D2, {0x00,0x00,0x80,0x80,0xF8,0x80,0x80,0x80,0x80,0x80,0x78,0x00,0x00}}, +{ 0x30D3, {0x08,0x04,0x88,0x84,0xF8,0x80,0x80,0x80,0x80,0x80,0x78,0x00,0x00}}, +{ 0x30D4, {0x00,0x0C,0x8C,0x80,0xF8,0x80,0x80,0x80,0x80,0x80,0x78,0x00,0x00}}, +{ 0x30D5, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30D6, {0x08,0x04,0x08,0xFC,0x08,0x08,0x08,0x10,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30D7, {0x0C,0x0C,0x00,0xF8,0x08,0x08,0x08,0x10,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30D8, {0x00,0x00,0x00,0x20,0x20,0x50,0x50,0x90,0x08,0x08,0x08,0x00,0x00}}, +{ 0x30D9, {0x00,0x00,0x08,0x24,0x28,0x54,0x50,0x90,0x08,0x08,0x08,0x00,0x00}}, +{ 0x30DA, {0x00,0x00,0x0C,0x2C,0x20,0x50,0x50,0x90,0x08,0x08,0x08,0x00,0x00}}, +{ 0x30DB, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0xA8,0xA8,0x20,0x20,0x00,0x00}}, +{ 0x30DC, {0x08,0x04,0x28,0x24,0xF8,0x20,0x20,0xA8,0xA8,0x20,0x20,0x00,0x00}}, +{ 0x30DD, {0x00,0x0C,0x2C,0x20,0xF8,0x20,0x20,0xA8,0xA8,0x20,0x20,0x00,0x00}}, +{ 0x30DE, {0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x50,0x60,0x20,0x10,0x00,0x00}}, +{ 0x30DF, {0x00,0x00,0xC0,0x30,0x00,0xC0,0x30,0x00,0x80,0x60,0x18,0x00,0x00}}, +{ 0x30E0, {0x00,0x00,0x00,0x10,0x10,0x20,0x20,0x50,0x48,0x98,0xE4,0x00,0x00}}, +{ 0x30E1, {0x00,0x00,0x08,0x08,0x08,0x28,0x10,0x10,0x28,0x40,0x80,0x00,0x00}}, +{ 0x30E2, {0x00,0x00,0xF0,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x38,0x00,0x00}}, +{ 0x30E3, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x78,0xC8,0x20,0x20,0x00,0x00}}, +{ 0x30E4, {0x00,0x00,0x40,0x40,0x78,0xC8,0x30,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x30E5, {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x20,0xF0,0x00,0x00}}, +{ 0x30E6, {0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0xF8,0x00,0x00}}, +{ 0x30E7, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0xF0,0x10,0xF0,0x00,0x00}}, +{ 0x30E8, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0x30E9, {0x00,0x00,0xF8,0x00,0xF8,0x08,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30EA, {0x00,0x00,0x88,0x88,0x88,0x88,0x08,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30EB, {0x00,0x00,0x10,0x50,0x50,0x50,0x50,0x50,0x50,0x98,0x90,0x00,0x00}}, +{ 0x30EC, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x88,0x90,0xE0,0x00,0x00}}, +{ 0x30ED, {0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x30EE, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x08,0x08,0x10,0x20,0x00,0x00}}, +{ 0x30EF, {0x00,0x00,0x00,0xF8,0x88,0x88,0x08,0x08,0x08,0x10,0x20,0x00,0x00}}, +{ 0x30F0, {0x00,0x00,0x10,0x10,0xF8,0x50,0x50,0xF8,0x10,0x10,0x10,0x00,0x00}}, +{ 0x30F1, {0x00,0x00,0x00,0x78,0x08,0x30,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x30F2, {0x00,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30F3, {0x00,0x00,0x00,0x80,0x40,0x08,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30F4, {0x08,0x24,0x28,0xFC,0x88,0x88,0x08,0x08,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30F5, {0x00,0x00,0x00,0x00,0x00,0x20,0xF8,0x28,0x48,0x48,0x90,0x00,0x00}}, +{ 0x30F6, {0x00,0x00,0x00,0x00,0x00,0x40,0x78,0x90,0x10,0x20,0x40,0x00,0x00}}, +{ 0x30F7, {0x08,0x04,0x08,0xFC,0x88,0x88,0x08,0x08,0x08,0x10,0x60,0x00,0x00}}, +{ 0x30F8, {0x08,0x04,0x18,0x14,0xF8,0x50,0x50,0xF8,0x10,0x10,0x10,0x00,0x00}}, +{ 0x30F9, {0x08,0x04,0x08,0x04,0x78,0x08,0x30,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0x30FA, {0x08,0x04,0x08,0xFC,0x08,0xF8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0x30FB, {0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0x30FC, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x30FD, {0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x10,0x00,0x00,0x00,0x00}}, +{ 0x30FE, {0x00,0x00,0x10,0x08,0x10,0x48,0x20,0x10,0x10,0x00,0x00,0x00,0x00}}, +{ 0x3105, {0x00,0x00,0x00,0x40,0x40,0xF8,0x08,0x08,0x08,0x28,0x10,0x00,0x00}}, +{ 0x3106, {0x00,0x00,0x00,0x40,0x40,0xF8,0x08,0x50,0x50,0x20,0xD8,0x00,0x00}}, +{ 0x3107, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0x3108, {0x00,0x00,0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0x3109, {0x00,0x00,0x00,0x40,0x80,0xF8,0x28,0x28,0x28,0x48,0x90,0x00,0x00}}, +{ 0x310A, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x48,0xF8,0x08,0x00}}, +{ 0x310B, {0x00,0x00,0x00,0x00,0x70,0x10,0x38,0x08,0x08,0x28,0x10,0x00,0x00}}, +{ 0x310C, {0x00,0x00,0x00,0x00,0x20,0xA0,0xF8,0x28,0x48,0x48,0x90,0x00,0x00}}, +{ 0x310D, {0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x90,0x90,0x48,0x48,0x00,0x00}}, +{ 0x310E, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x78,0x08,0x08,0x30,0x00,0x00}}, +{ 0x310F, {0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x40,0x40,0x40,0x80,0x00,0x00}}, +{ 0x3110, {0x00,0x00,0x00,0x00,0x00,0x48,0x48,0x58,0x68,0x08,0x10,0x00,0x00}}, +{ 0x3111, {0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,0x20,0x10,0x10,0x00,0x00}}, +{ 0x3112, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x10,0x10,0x10,0x20,0x00,0x00}}, +{ 0x3113, {0x00,0x00,0x00,0x00,0x20,0xA8,0xA8,0xA8,0xF8,0x20,0xF8,0x00,0x00}}, +{ 0x3114, {0x00,0x00,0x00,0x00,0x10,0x60,0x08,0x70,0xA0,0x20,0x20,0x00,0x00}}, +{ 0x3115, {0x00,0x00,0x00,0x00,0x00,0x78,0x08,0x78,0x40,0x40,0x40,0x80,0x00}}, +{ 0x3116, {0x00,0x00,0x00,0x00,0xF8,0x88,0xC8,0xA8,0xA8,0x88,0xF8,0x00,0x00}}, +{ 0x3117, {0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0x48,0x58,0x40,0x00}}, +{ 0x3118, {0x00,0x00,0x00,0x20,0x20,0xF8,0x40,0x78,0x08,0x10,0x20,0x00,0x00}}, +{ 0x3119, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x48,0xF8,0x08,0x00}}, +{ 0x311A, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0x311B, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x311C, {0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x60,0x80,0x88,0x70,0x00,0x00}}, +{ 0x311D, {0x00,0x00,0x00,0x00,0x50,0xF8,0x50,0x50,0x50,0x40,0x78,0x00,0x00}}, +{ 0x311E, {0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x78,0x28,0xC8,0x00,0x00}}, +{ 0x311F, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xD0,0x10,0x08,0x00,0x00,0x00}}, +{ 0x3120, {0x00,0x00,0x00,0x00,0x20,0x48,0xF0,0x20,0x40,0x50,0xF8,0x08,0x00}}, +{ 0x3121, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x50,0x50,0x20,0xD8,0x00,0x00}}, +{ 0x3122, {0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0xF8,0x08,0x08,0x00,0x00}}, +{ 0x3123, {0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xF8,0x08,0x08,0x08,0x00,0x00}}, +{ 0x3124, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x50,0x50,0x98,0x00,0x00}}, +{ 0x3125, {0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x20,0x40,0x40,0xF8,0x00,0x00}}, +{ 0x3126, {0x00,0x00,0x00,0x00,0x00,0x50,0x50,0x50,0x50,0x50,0x58,0x80,0x00}}, +{ 0x3127, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00}}, +{ 0x3128, {0x00,0x00,0x00,0x00,0x00,0xC8,0x28,0x10,0x30,0x48,0x88,0x00,0x00}}, +{ 0x3129, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0x312A, {0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x38,0x48,0x48,0x90,0x00,0x00}}, +{ 0x312B, {0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0x50,0x98,0x00,0x00}}, +{ 0x312C, {0x00,0x00,0x00,0x00,0x10,0x78,0x40,0x40,0x40,0x40,0x80,0x00,0x00}}, +{ 0x3131, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x10,0x00,0x00,0x00}}, +{ 0x3132, {0x00,0x00,0x00,0xF8,0x28,0x28,0x28,0x28,0x28,0x50,0x00,0x00,0x00}}, +{ 0x3133, {0x00,0x00,0x00,0xC8,0x48,0x50,0x50,0x58,0x68,0xA8,0x00,0x00,0x00}}, +{ 0x3134, {0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x3135, {0x00,0x00,0x00,0xB8,0x90,0x90,0x90,0xA8,0xA8,0xE8,0x00,0x00,0x00}}, +{ 0x3136, {0x00,0x00,0x00,0xB8,0x80,0xB8,0x80,0xB8,0xA8,0xD8,0x00,0x00,0x00}}, +{ 0x3137, {0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x3138, {0x00,0x00,0x00,0xF8,0xA0,0xA0,0xA0,0xA0,0xA0,0xF8,0x00,0x00,0x00}}, +{ 0x3139, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x313A, {0x00,0x00,0x00,0xF8,0x28,0x28,0xE8,0x88,0xA8,0xC8,0x00,0x00,0x00}}, +{ 0x313B, {0x00,0x00,0x00,0xDC,0x54,0x54,0xD4,0x94,0xB4,0xDC,0x00,0x00,0x00}}, +{ 0x313C, {0x00,0x00,0x00,0xD4,0x54,0x54,0xDC,0x94,0xB4,0xDC,0x00,0x00,0x00}}, +{ 0x313D, {0x00,0x00,0x00,0xE4,0x24,0x28,0xE8,0x94,0xB4,0xD4,0x00,0x00,0x00}}, +{ 0x313E, {0x00,0x00,0x00,0xD8,0x50,0x50,0xD8,0x90,0xB0,0xD8,0x00,0x00,0x00}}, +{ 0x313F, {0x00,0x00,0x00,0xDC,0x40,0x54,0xD4,0x94,0xA8,0xDC,0x00,0x00,0x00}}, +{ 0x3140, {0x00,0x00,0x00,0xEC,0x20,0x3C,0xE8,0x9C,0xB4,0xD8,0x00,0x00,0x00}}, +{ 0x3141, {0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x3142, {0x00,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0x3143, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0xF8,0xA8,0xA8,0xF8,0x00,0x00,0x00}}, +{ 0x3144, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0xE8,0xB4,0xB4,0xD4,0x00,0x00,0x00}}, +{ 0x3145, {0x00,0x00,0x00,0x10,0x10,0x20,0x20,0x50,0x50,0x88,0x00,0x00,0x00}}, +{ 0x3146, {0x00,0x00,0x00,0x28,0x28,0x50,0x50,0x58,0xA8,0xA4,0x00,0x00,0x00}}, +{ 0x3147, {0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0x3148, {0x00,0x00,0x00,0xF8,0x08,0x10,0x30,0x48,0x48,0x84,0x00,0x00,0x00}}, +{ 0x3149, {0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0xA8,0xA8,0xA8,0x00,0x00,0x00}}, +{ 0x314A, {0x00,0x00,0x00,0x70,0x00,0xF8,0x20,0x20,0x50,0x88,0x00,0x00,0x00}}, +{ 0x314B, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0x10,0x00,0x00,0x00}}, +{ 0x314C, {0x00,0x00,0x00,0xF8,0x80,0x80,0xF8,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0x314D, {0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0x50,0xF8,0x00,0x00,0x00}}, +{ 0x314E, {0x00,0x00,0x70,0x00,0xF8,0x00,0x70,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0x314F, {0x00,0x00,0x20,0x20,0x20,0x38,0x20,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0x3150, {0x00,0x00,0x08,0x48,0x48,0x78,0x48,0x48,0x48,0x08,0x00,0x00,0x00}}, +{ 0x3151, {0x00,0x00,0x20,0x20,0x38,0x20,0x38,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0x3152, {0x00,0x00,0x08,0x48,0x78,0x48,0x78,0x48,0x48,0x08,0x00,0x00,0x00}}, +{ 0x3153, {0x00,0x00,0x08,0x08,0x08,0x38,0x08,0x08,0x08,0x08,0x00,0x00,0x00}}, +{ 0x3154, {0x00,0x00,0x08,0x28,0x28,0xE8,0x28,0x28,0x28,0x08,0x00,0x00,0x00}}, +{ 0x3155, {0x00,0x00,0x08,0x08,0x38,0x08,0x38,0x08,0x08,0x08,0x00,0x00,0x00}}, +{ 0x3156, {0x00,0x00,0x08,0x28,0xE8,0x28,0xE8,0x28,0x28,0x08,0x00,0x00,0x00}}, +{ 0x3157, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x3158, {0x00,0x00,0x08,0x08,0x08,0x48,0x4C,0x58,0xE8,0x08,0x00,0x00,0x00}}, +{ 0x3159, {0x00,0x00,0x04,0x14,0x14,0x5C,0x54,0x74,0xD4,0x04,0x00,0x00,0x00}}, +{ 0x315A, {0x00,0x00,0x08,0x08,0x48,0x48,0x58,0xE8,0x08,0x08,0x00,0x00,0x00}}, +{ 0x315B, {0x00,0x00,0x00,0x00,0x00,0x50,0x50,0x50,0xF8,0x00,0x00,0x00,0x00}}, +{ 0x315C, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0x315D, {0x00,0x00,0x08,0x08,0x08,0x18,0xE8,0x48,0x78,0x48,0x00,0x00,0x00}}, +{ 0x315E, {0x00,0x00,0x04,0x14,0x14,0x14,0xF4,0x54,0x74,0x54,0x00,0x00,0x00}}, +{ 0x315F, {0x00,0x00,0x08,0x08,0x08,0x18,0xE8,0x48,0x48,0x48,0x00,0x00,0x00}}, +{ 0x3160, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x00,0x00,0x00}}, +{ 0x3161, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0x3162, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x18,0xE8,0x08,0x00,0x00,0x00}}, +{ 0x3163, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00}}, +{ 0xE000, {0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0xA8,0xB0,0x80,0x80}}, +{ 0xE001, {0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x90,0xF8,0x80,0x80}}, +{ 0xE002, {0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x98,0x88,0x98,0x68,0x08,0x08}}, +{ 0xE003, {0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x78,0x08,0x08}}, +{ 0xE004, {0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xD0,0x80,0x80}}, +{ 0xE005, {0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xF8,0x80,0x80}}, +{ 0xE006, {0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xA8,0xA8,0xA8,0x58,0x08,0x08}}, +{ 0xE007, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xA8,0xA8,0xF8,0x08,0x08}}, +{ 0xE008, {0x00,0x00,0x00,0x00,0x80,0x80,0xB0,0xC8,0x88,0xA8,0xB0,0x00,0x00}}, +{ 0xE009, {0x00,0x00,0x00,0x00,0x80,0x80,0xB0,0xC8,0x88,0x90,0xF8,0x00,0x00}}, +{ 0xE00A, {0x00,0x00,0x00,0x00,0x08,0x08,0x38,0x48,0x88,0x98,0x68,0x00,0x00}}, +{ 0xE00B, {0x00,0x00,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0xE00C, {0x00,0x00,0x00,0x00,0x80,0x80,0xD0,0xA8,0xA8,0xA8,0xD0,0x00,0x00}}, +{ 0xE00D, {0x00,0x00,0x00,0x00,0x80,0x80,0xD0,0xA8,0xA8,0xA8,0xF8,0x00,0x00}}, +{ 0xE00E, {0x00,0x00,0x00,0x00,0x08,0x08,0x58,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0xE00F, {0x00,0x00,0x00,0x00,0x08,0x08,0xF8,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0xE010, {0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xD0,0x00,0x00}}, +{ 0xE011, {0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xF8,0x00,0x00}}, +{ 0xE012, {0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0xE013, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0xA8,0xA8,0xA8,0x58,0x00,0x00}}, +{ 0xE014, {0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0xA8,0xB0,0x00,0x00}}, +{ 0xE015, {0x00,0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x90,0xF8,0x00,0x00}}, +{ 0xE016, {0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0xE017, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0x88,0x98,0x68,0x08,0x00}}, +{ 0xE018, {0x00,0x00,0x00,0x00,0x00,0xE0,0x50,0x50,0x20,0x20,0x40,0x98,0x60}}, +{ 0xE019, {0x00,0x00,0x00,0x00,0x00,0xE0,0x50,0x50,0xA0,0x20,0x40,0x98,0x60}}, +{ 0xE01A, {0x00,0x00,0x00,0x00,0x00,0xF8,0x40,0x80,0x80,0x80,0x48,0x30,0x00}}, +{ 0xE01B, {0x00,0x00,0x00,0x00,0x00,0xF8,0x40,0x80,0x60,0x10,0x08,0x88,0x70}}, +{ 0xE01C, {0x00,0x00,0x00,0x10,0x20,0x40,0x80,0x80,0x98,0x88,0x70,0x00,0x00}}, +{ 0xE01D, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xC8,0x08,0x08,0x10,0x20,0x40}}, +{ 0xE01E, {0x00,0x00,0x00,0x00,0x30,0x40,0x80,0x90,0x90,0x60,0x88,0x88,0x70}}, +{ 0xE01F, {0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x30,0x48,0x48,0x08,0x10,0x60}}, +{ 0xE020, {0x00,0x00,0x00,0x00,0x40,0x40,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0xE021, {0x00,0x00,0x00,0x00,0x10,0x10,0x70,0xB0,0x90,0x90,0x78,0x00,0x00}}, +{ 0xE022, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x50,0x88,0x00,0x00}}, +{ 0xE023, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0xE024, {0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xE025, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xE026, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0xE027, {0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x90,0x90,0xB0,0x48,0x00,0x00}}, +{ 0xE028, {0x00,0x00,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0xA8,0xB0,0x80,0x80}}, +{ 0xE029, {0x00,0x00,0x00,0x00,0x80,0x80,0xF0,0x88,0x88,0x90,0xF8,0x80,0x80}}, +{ 0xE02A, {0x00,0x00,0x00,0x00,0x08,0x08,0x78,0x88,0x88,0x98,0x68,0x08,0x08}}, +{ 0xE02B, {0x00,0x00,0x00,0x00,0x08,0x08,0xF8,0x88,0x88,0x88,0x78,0x08,0x08}}, +{ 0xE030, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x48,0x30,0x00,0x00}}, +{ 0xE031, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x10,0x70,0x00,0x00}}, +{ 0xE032, {0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0xE033, {0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x20,0x40,0x48,0x30,0x00,0x00}}, +{ 0xE034, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE035, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE036, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE037, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE038, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE039, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE03A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE03B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE03C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE03D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE03E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE03F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE040, {0x00,0x00,0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE041, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x20}}, +{ 0xE042, {0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE043, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00}}, +{ 0xE044, {0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE045, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00}}, +{ 0xE046, {0x00,0x10,0x10,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE047, {0x00,0x00,0x00,0x48,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE048, {0x00,0x20,0x50,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE049, {0x00,0x70,0xA8,0xB0,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE04A, {0x00,0x20,0x50,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE04B, {0x00,0x70,0xA8,0x68,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE04C, {0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE04D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78}}, +{ 0xE04E, {0x00,0x40,0x20,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE04F, {0x00,0x00,0x00,0x50,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE050, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00}}, +{ 0xE051, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x00}}, +{ 0xE052, {0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x20,0x10,0x10,0x20,0x00,0x00}}, +{ 0xE053, {0x00,0x00,0xA0,0xD0,0x88,0xA8,0xD0,0x88,0x88,0xA8,0xB0,0x80,0x80}}, +{ 0xE054, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xA8,0x10,0x00,0x00,0x00}}, +{ 0xE055, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xF8,0x10,0x00,0x00,0x00}}, +{ 0xE056, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20}}, +{ 0xE057, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x90}}, +{ 0xE058, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x50,0x60}}, +{ 0xE059, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE05A, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x30,0x50,0x30}}, +{ 0xE05B, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE05C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x18}}, +{ 0xE05D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x40,0x60}}, +{ 0xE05E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE05F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE060, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE061, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE062, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x28,0x00,0x00}}, +{ 0xE063, {0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xA8,0xA8,0xA8,0x54,0x00,0x00}}, +{ 0xE064, {0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x48,0x30}}, +{ 0xE065, {0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xF0,0xA0,0xA0,0xB8,0x90,0x60}}, +{ 0xE066, {0x00,0x00,0x00,0x00,0x80,0x80,0xFC,0xA8,0xA8,0xA8,0x9C,0x90,0x70}}, +{ 0xE067, {0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x50,0x20}}, +{ 0xE068, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x30,0x28,0x38,0xA0,0x40}}, +{ 0xE069, {0x00,0x00,0x00,0x00,0x40,0x40,0x68,0x54,0x54,0x54,0x7C,0x80,0x00}}, +{ 0xE06A, {0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0x08,0x48,0x88,0x70,0x00,0x00}}, +{ 0xE06B, {0x00,0x00,0x00,0x00,0xC0,0x20,0x10,0x08,0x48,0x88,0x70,0x08,0x70}}, +{ 0xE06C, {0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xE06D, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20}}, +{ 0xE06E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20}}, +{ 0xFB00, {0x00,0x00,0x28,0x54,0x50,0x50,0xF8,0x50,0x50,0x50,0x50,0x00,0x00}}, +{ 0xFB01, {0x00,0x00,0x30,0x48,0x48,0x40,0xF8,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0xFB02, {0x00,0x00,0x38,0x48,0x48,0x48,0xF8,0x48,0x48,0x48,0x48,0x00,0x00}}, +{ 0xFB03, {0x00,0x00,0x50,0xA8,0xA0,0xA8,0xF8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0xFB04, {0x00,0x00,0x58,0xA8,0xA8,0xA8,0xF8,0xA8,0xA8,0xA8,0xA8,0x00,0x00}}, +{ 0xFB05, {0x00,0x00,0x30,0x50,0x50,0x50,0x58,0x50,0x50,0x50,0x48,0x00,0x00}}, +{ 0xFB06, {0x00,0x00,0x30,0x50,0x50,0xB8,0x90,0x50,0x30,0x30,0xC8,0x00,0x00}}, +{ 0xFB13, {0x00,0x00,0x58,0x60,0x20,0xB4,0xB4,0xB4,0xB4,0xB4,0x6C,0x00,0x00}}, +{ 0xFB14, {0x00,0x00,0x10,0x38,0x30,0xB4,0xB4,0xB4,0xB4,0xBC,0x74,0x00,0x00}}, +{ 0xFB15, {0x00,0x00,0x10,0x30,0x30,0xB8,0xB4,0xB4,0xB4,0xB4,0x74,0x10,0x10}}, +{ 0xFB16, {0x00,0x00,0x60,0x60,0x70,0xB4,0xB4,0xB4,0xB4,0xB4,0x6C,0x20,0x30}}, +{ 0xFB17, {0x00,0x00,0x20,0x60,0x60,0xF4,0xF4,0xF4,0xF4,0xF4,0x6C,0x20,0x20}}, +{ 0xFB1D, {0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x10,0x00,0x10,0x00,0x00,0x00}}, +{ 0xFB1E, {0x00,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFB1F, {0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x00,0xF8,0x00,0x00,0x00}}, +{ 0xFB20, {0x00,0x00,0x00,0x00,0x00,0x98,0x48,0x48,0x28,0x28,0xF0,0x00,0x00}}, +{ 0xFB21, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x00}}, +{ 0xFB22, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0xFB23, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFB24, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x00}}, +{ 0xFB25, {0x00,0x00,0x80,0x80,0x80,0xF8,0x08,0x08,0x08,0x10,0x60,0x00,0x00}}, +{ 0xFB26, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0x78,0x00,0x00}}, +{ 0xFB27, {0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0x08,0x08,0x08,0x08,0x00,0x00}}, +{ 0xFB28, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xC8,0x00,0x00}}, +{ 0xFB29, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x00,0x00}}, +{ 0xFB2A, {0x00,0x00,0x00,0x10,0x00,0xA8,0xA8,0xA8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0xFB2B, {0x00,0x00,0x00,0x80,0x00,0xA8,0xA8,0xA8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0xFB2C, {0x00,0x00,0x00,0x10,0x00,0xA8,0xA8,0xB8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0xFB2D, {0x00,0x00,0x00,0x80,0x00,0xA8,0xA8,0xB8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0xFB2E, {0x00,0x00,0x00,0x00,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x70,0x00}}, +{ 0xFB2F, {0x00,0x00,0x00,0x00,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x70,0x20}}, +{ 0xFB30, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x20}}, +{ 0xFB31, {0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x50,0x10,0x10,0xF8,0x00,0x00}}, +{ 0xFB32, {0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x10,0x90,0x28,0x48,0x00,0x00}}, +{ 0xFB33, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x10,0x50,0x10,0x10,0x00,0x00}}, +{ 0xFB34, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0xA8,0x88,0x88,0x00,0x00}}, +{ 0xFB35, {0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x10,0x50,0x10,0x10,0x00,0x00}}, +{ 0xFB36, {0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x10,0x50,0x10,0x00,0x00}}, +{ 0xFB38, {0x00,0x00,0x00,0x00,0x00,0x98,0x88,0xA8,0x88,0x88,0xF8,0x00,0x00}}, +{ 0xFB39, {0x00,0x00,0x00,0x00,0x00,0x30,0x10,0x50,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFB3A, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x28,0x08,0x08,0x08,0x08}}, +{ 0xFB3B, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x48,0x08,0x08,0xF0,0x00,0x00}}, +{ 0xFB3C, {0x00,0x00,0x80,0x80,0x80,0xF8,0x08,0x48,0x08,0x10,0x60,0x00,0x00}}, +{ 0xFB3E, {0x00,0x00,0x00,0x00,0x00,0xB0,0x48,0x88,0xA8,0x88,0xB8,0x00,0x00}}, +{ 0xFB40, {0x00,0x00,0x00,0x00,0x00,0x18,0x08,0x28,0x08,0x08,0x78,0x00,0x00}}, +{ 0xFB41, {0x00,0x00,0x00,0x00,0x00,0xF8,0x88,0xA8,0x88,0x90,0xE0,0x00,0x00}}, +{ 0xFB43, {0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x28,0x08,0x08,0x08,0x08}}, +{ 0xFB44, {0x00,0x00,0x00,0x00,0x00,0x78,0x88,0xA8,0x08,0x08,0xF0,0x00,0x00}}, +{ 0xFB46, {0x00,0x00,0x00,0x00,0x00,0x90,0x48,0x28,0x90,0x08,0xF8,0x00,0x00}}, +{ 0xFB47, {0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0xA8,0x88,0x88,0xB0,0x80,0x80}}, +{ 0xFB48, {0x00,0x00,0x00,0x00,0x00,0xF0,0x08,0x28,0x08,0x08,0x08,0x00,0x00}}, +{ 0xFB49, {0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0xB8,0xE8,0x88,0xF0,0x00,0x00}}, +{ 0xFB4A, {0x00,0x00,0x00,0x00,0x00,0xF8,0x48,0x58,0x48,0x48,0xC8,0x00,0x00}}, +{ 0xFB4B, {0x00,0x00,0x00,0x20,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x00,0x00}}, +{ 0xFB4C, {0x00,0x00,0x00,0x70,0x00,0xF0,0x10,0x10,0x10,0x10,0xF8,0x00,0x00}}, +{ 0xFB4D, {0x00,0x00,0x00,0x70,0x00,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x00}}, +{ 0xFB4E, {0x00,0x00,0x00,0x70,0x00,0x78,0x88,0x88,0x08,0x08,0xF0,0x00,0x00}}, +{ 0xFB4F, {0x00,0x00,0x80,0x80,0x80,0x90,0x48,0x68,0x90,0x88,0xC8,0x00,0x00}}, +{ 0xFE20, {0x00,0x3C,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFE21, {0x00,0xE0,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFE22, {0x00,0x3C,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFE23, {0x00,0x08,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF01, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0xFF02, {0x00,0x00,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF03, {0x00,0x00,0x00,0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00,0x00,0x00}}, +{ 0xFF04, {0x00,0x00,0x20,0x78,0xA0,0xA0,0x70,0x28,0x28,0xF0,0x20,0x00,0x00}}, +{ 0xFF05, {0x00,0x00,0x48,0xA8,0x50,0x10,0x20,0x40,0x50,0xA8,0x90,0x00,0x00}}, +{ 0xFF06, {0x00,0x00,0x40,0xA0,0xA0,0x40,0xA0,0x98,0x90,0x68,0x00,0x00,0x00}}, +{ 0xFF07, {0x00,0x00,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF08, {0x00,0x10,0x20,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x20,0x10,0x00}}, +{ 0xFF09, {0x00,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00}}, +{ 0xFF0A, {0x00,0x00,0x00,0x20,0xA8,0xF8,0x70,0xF8,0xA8,0x20,0x00,0x00,0x00}}, +{ 0xFF0B, {0x00,0x00,0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00}}, +{ 0xFF0C, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x20,0x40,0x00}}, +{ 0xFF0D, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF0E, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00}}, +{ 0xFF0F, {0x00,0x00,0x08,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0x80,0x00,0x00}}, +{ 0xFF10, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00,0x00}}, +{ 0xFF11, {0x00,0x00,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0xFF12, {0x00,0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0xFF13, {0x00,0x00,0xF8,0x08,0x10,0x20,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0xFF14, {0x00,0x00,0x10,0x10,0x30,0x50,0x50,0x90,0xF8,0x10,0x10,0x00,0x00}}, +{ 0xFF15, {0x00,0x00,0xF8,0x80,0x80,0xB0,0xC8,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0xFF16, {0x00,0x00,0x70,0x88,0x80,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0xFF17, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x00,0x00}}, +{ 0xFF18, {0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0xFF19, {0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0xFF1A, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x20,0x70,0x20,0x00}}, +{ 0xFF1B, {0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x30,0x20,0x40,0x00}}, +{ 0xFF1C, {0x00,0x00,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x00,0x00}}, +{ 0xFF1D, {0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00}}, +{ 0xFF1E, {0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x80,0x00,0x00}}, +{ 0xFF1F, {0x00,0x00,0x70,0x88,0x88,0x08,0x10,0x20,0x20,0x00,0x20,0x00,0x00}}, +{ 0xFF20, {0x00,0x00,0x70,0x88,0x88,0x98,0xA8,0xA8,0xB0,0x80,0x78,0x00,0x00}}, +{ 0xFF21, {0x00,0x00,0x20,0x50,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFF22, {0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0xFF23, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0xFF24, {0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00}}, +{ 0xFF25, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0xFF26, {0x00,0x00,0xF8,0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0xFF27, {0x00,0x00,0x70,0x88,0x80,0x80,0x80,0x98,0x88,0x88,0x70,0x00,0x00}}, +{ 0xFF28, {0x00,0x00,0x88,0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFF29, {0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0xFF2A, {0x00,0x00,0x38,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00,0x00}}, +{ 0xFF2B, {0x00,0x00,0x88,0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0xFF2C, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00}}, +{ 0xFF2D, {0x00,0x00,0x88,0x88,0xD8,0xA8,0xA8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFF2E, {0x00,0x00,0x88,0xC8,0xC8,0xA8,0xA8,0x98,0x98,0x88,0x88,0x00,0x00}}, +{ 0xFF2F, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0xFF30, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0xFF31, {0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0xA8,0x70,0x08,0x00}}, +{ 0xFF32, {0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0xA0,0x90,0x88,0x88,0x00,0x00}}, +{ 0xFF33, {0x00,0x00,0x70,0x88,0x80,0x80,0x70,0x08,0x08,0x88,0x70,0x00,0x00}}, +{ 0xFF34, {0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xFF35, {0x00,0x00,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0xFF36, {0x00,0x00,0x88,0x88,0x88,0x88,0x50,0x50,0x50,0x20,0x20,0x00,0x00}}, +{ 0xFF37, {0x00,0x00,0x88,0x88,0x88,0x88,0xA8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0xFF38, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x50,0x50,0x88,0x88,0x00,0x00}}, +{ 0xFF39, {0x00,0x00,0x88,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xFF3A, {0x00,0x00,0xF8,0x08,0x10,0x10,0x20,0x40,0x40,0x80,0xF8,0x00,0x00}}, +{ 0xFF3B, {0x00,0x70,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x70,0x00}}, +{ 0xFF3C, {0x00,0x00,0x80,0x80,0x40,0x40,0x20,0x10,0x10,0x08,0x08,0x00,0x00}}, +{ 0xFF3D, {0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00}}, +{ 0xFF3E, {0x00,0x00,0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF3F, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00}}, +{ 0xFF40, {0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF41, {0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x78,0x88,0x88,0x78,0x00,0x00}}, +{ 0xFF42, {0x00,0x00,0x80,0x80,0x80,0xF0,0x88,0x88,0x88,0x88,0xF0,0x00,0x00}}, +{ 0xFF43, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x80,0x80,0x88,0x70,0x00,0x00}}, +{ 0xFF44, {0x00,0x00,0x08,0x08,0x08,0x78,0x88,0x88,0x88,0x88,0x78,0x00,0x00}}, +{ 0xFF45, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0xF8,0x80,0x88,0x70,0x00,0x00}}, +{ 0xFF46, {0x00,0x00,0x30,0x48,0x40,0x40,0xF0,0x40,0x40,0x40,0x40,0x00,0x00}}, +{ 0xFF47, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x88,0x70}}, +{ 0xFF48, {0x00,0x00,0x80,0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFF49, {0x00,0x00,0x00,0x20,0x00,0x60,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0xFF4A, {0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x90,0x90,0x60}}, +{ 0xFF4B, {0x00,0x00,0x80,0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00,0x00}}, +{ 0xFF4C, {0x00,0x00,0x60,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00}}, +{ 0xFF4D, {0x00,0x00,0x00,0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x88,0x00,0x00}}, +{ 0xFF4E, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFF4F, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00}}, +{ 0xFF50, {0x00,0x00,0x00,0x00,0x00,0xF0,0x88,0x88,0x88,0xF0,0x80,0x80,0x80}}, +{ 0xFF51, {0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x88,0x88,0x78,0x08,0x08,0x08}}, +{ 0xFF52, {0x00,0x00,0x00,0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x80,0x00,0x00}}, +{ 0xFF53, {0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x60,0x10,0x88,0x70,0x00,0x00}}, +{ 0xFF54, {0x00,0x00,0x00,0x40,0x40,0xF0,0x40,0x40,0x40,0x48,0x30,0x00,0x00}}, +{ 0xFF55, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x88,0x98,0x68,0x00,0x00}}, +{ 0xFF56, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x50,0x50,0x20,0x00,0x00}}, +{ 0xFF57, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00,0x00}}, +{ 0xFF58, {0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,0x00}}, +{ 0xFF59, {0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x08,0x88,0x70}}, +{ 0xFF5A, {0x00,0x00,0x00,0x00,0x00,0xF8,0x10,0x20,0x40,0x80,0xF8,0x00,0x00}}, +{ 0xFF5B, {0x00,0x18,0x20,0x20,0x20,0x20,0xC0,0x20,0x20,0x20,0x20,0x18,0x00}}, +{ 0xFF5C, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xFF5D, {0x00,0xC0,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0xC0,0x00}}, +{ 0xFF5E, {0x00,0x00,0x48,0xA8,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF61, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x50,0x20,0x00,0x00}}, +{ 0xFF62, {0x00,0x00,0x70,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF63, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x70,0x00,0x00}}, +{ 0xFF64, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x00,0x00}}, +{ 0xFF65, {0x00,0x00,0x00,0x00,0x00,0x20,0x70,0x20,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF66, {0x00,0x00,0x00,0xF8,0x08,0xF8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0xFF67, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x50,0x40,0x80,0x00,0x00}}, +{ 0xFF68, {0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x60,0xA0,0x20,0x00,0x00}}, +{ 0xFF69, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xE0,0xA0,0x20,0x40,0x00,0x00}}, +{ 0xFF6A, {0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0xFF6B, {0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xF0,0x20,0x60,0xA0,0x00,0x00}}, +{ 0xFF6C, {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x78,0xC8,0x20,0x20,0x00,0x00}}, +{ 0xFF6D, {0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0xFF6E, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x70,0x10,0xF0,0x00,0x00}}, +{ 0xFF6F, {0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x08,0x10,0xE0,0x00,0x00}}, +{ 0xFF70, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF71, {0x00,0x00,0xF8,0x08,0x08,0x28,0x30,0x20,0x20,0x40,0x80,0x00,0x00}}, +{ 0xFF72, {0x00,0x00,0x08,0x10,0x20,0x60,0xA0,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xFF73, {0x00,0x20,0x20,0xF8,0x88,0x88,0x08,0x08,0x10,0x20,0x40,0x00,0x00}}, +{ 0xFF74, {0x00,0x00,0x00,0x70,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00}}, +{ 0xFF75, {0x00,0x10,0x10,0xF8,0x10,0x10,0x30,0x50,0x90,0x10,0x10,0x00,0x00}}, +{ 0xFF76, {0x00,0x00,0x20,0x20,0xFC,0x24,0x24,0x24,0x44,0x44,0x98,0x00,0x00}}, +{ 0xFF77, {0x00,0x00,0x40,0x40,0x58,0xE0,0x20,0x38,0xD0,0x10,0x10,0x00,0x00}}, +{ 0xFF78, {0x00,0x00,0x40,0x78,0x48,0x88,0x08,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0xFF79, {0x00,0x00,0x40,0x40,0x7C,0x88,0x08,0x08,0x10,0x10,0x20,0x00,0x00}}, +{ 0xFF7A, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0xFF7B, {0x00,0x00,0x48,0x48,0xFC,0x48,0x48,0x08,0x10,0x10,0x20,0x00,0x00}}, +{ 0xFF7C, {0x00,0x00,0x00,0x80,0x40,0x00,0x88,0x48,0x10,0x20,0xC0,0x00,0x00}}, +{ 0xFF7D, {0x00,0x00,0xF8,0x08,0x08,0x08,0x10,0x10,0x30,0x48,0x84,0x00,0x00}}, +{ 0xFF7E, {0x00,0x00,0x40,0x40,0x7C,0xC4,0x48,0x40,0x40,0x40,0x3C,0x00,0x00}}, +{ 0xFF7F, {0x00,0x00,0x00,0x88,0x48,0x48,0x10,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0xFF80, {0x00,0x00,0x40,0x78,0x48,0x88,0x28,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0xFF81, {0x00,0x00,0x10,0x20,0x60,0x20,0xF8,0x20,0x20,0x40,0x80,0x00,0x00}}, +{ 0xFF82, {0x00,0x00,0x00,0xA0,0xA8,0xA8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0xFF83, {0x00,0x00,0x78,0x00,0x00,0xFC,0x10,0x10,0x20,0x20,0xC0,0x00,0x00}}, +{ 0xFF84, {0x00,0x00,0x80,0x80,0x80,0xC0,0xA0,0x90,0x80,0x80,0x80,0x00,0x00}}, +{ 0xFF85, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0x20,0x40,0x40,0x80,0x00,0x00}}, +{ 0xFF86, {0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00}}, +{ 0xFF87, {0x00,0x00,0x00,0xF8,0x08,0x48,0x30,0x10,0x28,0x40,0x80,0x00,0x00}}, +{ 0xFF88, {0x00,0x00,0x20,0x20,0xF8,0x08,0x10,0x30,0x68,0xA4,0x20,0x00,0x00}}, +{ 0xFF89, {0x00,0x00,0x00,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x80,0x00,0x00}}, +{ 0xFF8A, {0x00,0x00,0x00,0x50,0x50,0x50,0x48,0x48,0x88,0x88,0x88,0x00,0x00}}, +{ 0xFF8B, {0x00,0x00,0x80,0x80,0xF8,0x80,0x80,0x80,0x80,0x80,0x78,0x00,0x00}}, +{ 0xFF8C, {0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0xC0,0x00,0x00}}, +{ 0xFF8D, {0x00,0x00,0x00,0x20,0x20,0x50,0x50,0x88,0x88,0x04,0x04,0x00,0x00}}, +{ 0xFF8E, {0x00,0x00,0x20,0x20,0xF8,0x20,0x20,0xA8,0xA8,0x20,0x20,0x00,0x00}}, +{ 0xFF8F, {0x00,0x00,0xF8,0x08,0x08,0x10,0x50,0x60,0x20,0x10,0x10,0x00,0x00}}, +{ 0xFF90, {0x00,0x00,0xC0,0x30,0x00,0xC0,0x30,0x00,0x80,0x60,0x18,0x00,0x00}}, +{ 0xFF91, {0x00,0x00,0x00,0x10,0x10,0x20,0x20,0x50,0x48,0xB8,0xC4,0x00,0x00}}, +{ 0xFF92, {0x00,0x00,0x08,0x08,0x48,0x28,0x10,0x10,0x28,0x40,0x80,0x00,0x00}}, +{ 0xFF93, {0x00,0x00,0xF0,0x40,0x40,0xF8,0x40,0x40,0x40,0x40,0x38,0x00,0x00}}, +{ 0xFF94, {0x00,0x00,0x40,0x40,0x5C,0xE4,0x24,0x28,0x10,0x10,0x10,0x00,0x00}}, +{ 0xFF95, {0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x10,0x10,0x10,0xFC,0x00,0x00}}, +{ 0xFF96, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0x08,0xF8,0x00,0x00}}, +{ 0xFF97, {0x00,0x00,0xF8,0x00,0x00,0xF8,0x08,0x08,0x10,0x20,0xC0,0x00,0x00}}, +{ 0xFF98, {0x00,0x00,0x88,0x88,0x88,0x88,0x08,0x10,0x10,0x20,0x40,0x00,0x00}}, +{ 0xFF99, {0x00,0x00,0x00,0x50,0x50,0x50,0x50,0x90,0x90,0x94,0x98,0x00,0x00}}, +{ 0xFF9A, {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x88,0x90,0xE0,0x00,0x00}}, +{ 0xFF9B, {0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00}}, +{ 0xFF9C, {0x00,0x00,0xF8,0x88,0x88,0x88,0x10,0x10,0x20,0x20,0x40,0x00,0x00}}, +{ 0xFF9D, {0x00,0x00,0x00,0x00,0x80,0x40,0x00,0x04,0x08,0x30,0xC0,0x00,0x00}}, +{ 0xFF9E, {0x40,0x20,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFF9F, {0x40,0xA0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFFA1, {0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0x10,0x00,0x00,0x00}}, +{ 0xFFA2, {0x00,0x00,0x00,0xF8,0x28,0x28,0x28,0x28,0x28,0x50,0x00,0x00,0x00}}, +{ 0xFFA3, {0x00,0x00,0x00,0xC8,0x48,0x50,0x50,0x58,0x68,0xA8,0x00,0x00,0x00}}, +{ 0xFFA4, {0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0xFFA5, {0x00,0x00,0x00,0xB8,0x90,0x90,0x90,0xA8,0xA8,0xE8,0x00,0x00,0x00}}, +{ 0xFFA6, {0x00,0x00,0x00,0xB8,0x80,0xB8,0x80,0xB8,0xA8,0xD8,0x00,0x00,0x00}}, +{ 0xFFA7, {0x00,0x00,0x00,0xF8,0x80,0x80,0x80,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0xFFA8, {0x00,0x00,0x00,0xF8,0xA0,0xA0,0xA0,0xA0,0xA0,0xF8,0x00,0x00,0x00}}, +{ 0xFFA9, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0xFFAA, {0x00,0x00,0x00,0xF8,0x28,0x28,0xE8,0x88,0xA8,0xC8,0x00,0x00,0x00}}, +{ 0xFFAB, {0x00,0x00,0x00,0xDC,0x54,0x54,0xD4,0x94,0xB4,0xDC,0x00,0x00,0x00}}, +{ 0xFFAC, {0x00,0x00,0x00,0xD4,0x54,0x54,0xDC,0x94,0xB4,0xDC,0x00,0x00,0x00}}, +{ 0xFFAD, {0x00,0x00,0x00,0xE4,0x24,0x28,0xE8,0x94,0xB4,0xD4,0x00,0x00,0x00}}, +{ 0xFFAE, {0x00,0x00,0x00,0xD8,0x50,0x50,0xD8,0x90,0xB0,0xD8,0x00,0x00,0x00}}, +{ 0xFFAF, {0x00,0x00,0x00,0xDC,0x40,0x54,0xD4,0x94,0xA8,0xDC,0x00,0x00,0x00}}, +{ 0xFFB0, {0x00,0x00,0x00,0xEC,0x20,0x3C,0xE8,0x9C,0xB4,0xD8,0x00,0x00,0x00}}, +{ 0xFFB1, {0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0xFFB2, {0x00,0x00,0x00,0x88,0x88,0x88,0xF8,0x88,0x88,0xF8,0x00,0x00,0x00}}, +{ 0xFFB3, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0xF8,0xA8,0xA8,0xF8,0x00,0x00,0x00}}, +{ 0xFFB4, {0x00,0x00,0x00,0xA8,0xA8,0xA8,0xE8,0xB4,0xB4,0xD4,0x00,0x00,0x00}}, +{ 0xFFB5, {0x00,0x00,0x00,0x10,0x10,0x20,0x20,0x50,0x50,0x88,0x00,0x00,0x00}}, +{ 0xFFB6, {0x00,0x00,0x00,0x28,0x28,0x50,0x50,0x58,0xA8,0xA4,0x00,0x00,0x00}}, +{ 0xFFB7, {0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0xFFB8, {0x00,0x00,0x00,0xF8,0x08,0x10,0x30,0x48,0x48,0x84,0x00,0x00,0x00}}, +{ 0xFFB9, {0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0xA8,0xA8,0xA8,0x00,0x00,0x00}}, +{ 0xFFBA, {0x00,0x00,0x00,0x70,0x00,0xF8,0x20,0x20,0x50,0x88,0x00,0x00,0x00}}, +{ 0xFFBB, {0x00,0x00,0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0x10,0x00,0x00,0x00}}, +{ 0xFFBC, {0x00,0x00,0x00,0xF8,0x80,0x80,0xF8,0x80,0x80,0xF8,0x00,0x00,0x00}}, +{ 0xFFBD, {0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x50,0x50,0xF8,0x00,0x00,0x00}}, +{ 0xFFBE, {0x00,0x00,0x70,0x00,0xF8,0x00,0x70,0x88,0x88,0x70,0x00,0x00,0x00}}, +{ 0xFFC2, {0x00,0x00,0x20,0x20,0x20,0x38,0x20,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0xFFC3, {0x00,0x00,0x08,0x48,0x48,0x78,0x48,0x48,0x48,0x08,0x00,0x00,0x00}}, +{ 0xFFC4, {0x00,0x00,0x20,0x20,0x38,0x20,0x38,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0xFFC5, {0x00,0x00,0x08,0x48,0x78,0x48,0x78,0x48,0x48,0x08,0x00,0x00,0x00}}, +{ 0xFFC6, {0x00,0x00,0x08,0x08,0x08,0x38,0x08,0x08,0x08,0x08,0x00,0x00,0x00}}, +{ 0xFFC7, {0x00,0x00,0x08,0x28,0x28,0xE8,0x28,0x28,0x28,0x08,0x00,0x00,0x00}}, +{ 0xFFCA, {0x00,0x00,0x08,0x08,0x38,0x08,0x38,0x08,0x08,0x08,0x00,0x00,0x00}}, +{ 0xFFCB, {0x00,0x00,0x08,0x28,0xE8,0x28,0xE8,0x28,0x28,0x08,0x00,0x00,0x00}}, +{ 0xFFCC, {0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0xF8,0x00,0x00,0x00,0x00}}, +{ 0xFFCD, {0x00,0x00,0x08,0x08,0x08,0x48,0x4C,0x58,0xE8,0x08,0x00,0x00,0x00}}, +{ 0xFFCE, {0x00,0x00,0x04,0x14,0x14,0x5C,0x54,0x74,0xD4,0x04,0x00,0x00,0x00}}, +{ 0xFFCF, {0x00,0x00,0x08,0x08,0x48,0x48,0x58,0xE8,0x08,0x08,0x00,0x00,0x00}}, +{ 0xFFD2, {0x00,0x00,0x00,0x00,0x00,0x50,0x50,0x50,0xF8,0x00,0x00,0x00,0x00}}, +{ 0xFFD3, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x20,0x20,0x20,0x00,0x00,0x00}}, +{ 0xFFD4, {0x00,0x00,0x08,0x08,0x08,0x18,0xE8,0x48,0x78,0x48,0x00,0x00,0x00}}, +{ 0xFFD5, {0x00,0x00,0x04,0x14,0x14,0x14,0xF4,0x54,0x74,0x54,0x00,0x00,0x00}}, +{ 0xFFD6, {0x00,0x00,0x08,0x08,0x08,0x18,0xE8,0x48,0x48,0x48,0x00,0x00,0x00}}, +{ 0xFFD7, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x50,0x50,0x50,0x00,0x00,0x00}}, +{ 0xFFDA, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFFDB, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x18,0xE8,0x08,0x00,0x00,0x00}}, +{ 0xFFDC, {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00}}, +{ 0xFFE0, {0x00,0x00,0x20,0x70,0xA8,0xA0,0xA0,0xA8,0x70,0x20,0x00,0x00,0x00}}, +{ 0xFFE1, {0x00,0x00,0x30,0x48,0x40,0x40,0xE0,0x40,0x40,0x48,0xB0,0x00,0x00}}, +{ 0xFFE2, {0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x00,0x00,0x00,0x00}}, +{ 0xFFE3, {0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, +{ 0xFFE4, {0x00,0x00,0x20,0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xFFE5, {0x00,0x00,0x88,0x88,0x50,0x50,0xF8,0x20,0xF8,0x20,0x20,0x00,0x00}}, +{ 0xFFE6, {0x00,0x00,0x88,0x88,0xF8,0x88,0xF8,0xA8,0xA8,0xD8,0x88,0x00,0x00}}, +{ 0xFFE8, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}}, +{ 0xFFE9, {0x00,0x00,0x00,0x00,0x00,0x20,0x40,0xF8,0x40,0x20,0x00,0x00,0x00}}, +{ 0xFFEA, {0x00,0x00,0x20,0x70,0xA8,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00}}, +{ 0xFFEB, {0x00,0x00,0x00,0x00,0x00,0x20,0x10,0xF8,0x10,0x20,0x00,0x00,0x00}}, +{ 0xFFEC, {0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0xA8,0x70,0x20,0x00,0x00}}, +{ 0xFFED, {0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0x00}}, +{ 0xFFEE, {0x00,0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x48,0x30,0x00,0x00,0x00}}, +{ 0xFFFC, {0x54,0xA0,0xA4,0xA0,0x74,0x28,0xB4,0x28,0xBC,0x04,0x84,0x14,0xA8}}, +{ 0xFFFD, {0x00,0x00,0x70,0xD8,0xA8,0xE8,0xD8,0xD8,0xF8,0xD8,0x70,0x00,0x00}}, diff --git a/Mednafen/mednafen/video/font9x18.h b/Mednafen/mednafen/video/font9x18.h new file mode 100644 index 0000000000..f3812b78d8 --- /dev/null +++ b/Mednafen/mednafen/video/font9x18.h @@ -0,0 +1,4752 @@ +{ 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x01, 0x00, 0x40, 0x00, 0x41, 0x00, 0x01, 0x00, 0x40, 0x00, 0x41, 0x00, 0x01, 0x00, 0x40, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0023, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0xFF, 0x00, 0x24, 0x00, 0x24, 0x00, 0xFF, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0024, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x48, 0x00, 0x28, 0x00, 0x1C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x52, 0x00, 0x52, 0x00, 0x24, 0x00, 0x08, 0x00, 0x08, 0x00, 0x12, 0x00, 0x25, 0x00, 0x25, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x31, 0x00, 0x4A, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0027, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0028, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0029, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x002F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0031, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x22, 0x00, 0x42, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0037, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0038, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x23, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x003F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0040, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x4D, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4E, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0042, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0046, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0048, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x004F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0051, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x45, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0052, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0053, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0054, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0055, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0056, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0057, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0058, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0059, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x005F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0060, { 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0061, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0062, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0064, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0065, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0066, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0067, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x0068, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0069, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x006B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x006F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0070, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x0071, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x23, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x23, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x0072, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0073, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x007A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x007E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x49, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x4A, 0x00, 0x48, 0x00, 0x50, 0x00, 0x52, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x51, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x20, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x04, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A8, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x99, 0x00, 0xA5, 0x00, 0xA1, 0x00, 0xA5, 0x00, 0x99, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x38, 0x00, 0x48, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0xB9, 0x00, 0xA5, 0x00, 0xBD, 0x00, 0xA9, 0x00, 0xA5, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x10, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B4, { 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x5D, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x3D, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x00B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x73, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0D, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x26, 0x00, 0x79, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x10, 0x00, 0x08, 0x00, 0x49, 0x00, 0x33, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0D, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C0, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C1, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C2, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C3, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C4, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C5, { 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x44, 0x00, 0x44, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x00C8, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00C9, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CA, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CB, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CC, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CD, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CE, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00CF, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x79, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D1, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D2, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D3, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D4, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D5, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D6, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x43, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x49, 0x00, 0x51, 0x00, 0x51, 0x00, 0x61, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00D9, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DA, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DB, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DC, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DD, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x68, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E5, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09, 0x00, 0x09, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x00E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EC, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00ED, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EE, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x18, 0x00, 0x28, 0x00, 0x04, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x51, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x00FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x00FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x0100, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0101, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0102, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, }}, +{ 0x0105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0106, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0108, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010A, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010C, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010E, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x010F, { 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0xF1, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0F, 0x80, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0112, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0114, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0116, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x011A, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011C, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x011E, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x011F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x0120, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x0122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0123, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x0124, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0125, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0xFF, 0x80, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xF8, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0128, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012A, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012C, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x012E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x012F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x0130, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x29, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x77, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x7D, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0134, { 0x04, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0135, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x0136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x0137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x0138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x70, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0139, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013A, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x013C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x013D, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013E, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x013F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x28, 0x00, 0x30, 0x00, 0x60, 0x00, 0xA0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0143, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0147, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x014B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x014C, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014E, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x014F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0150, { 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0151, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0152, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0154, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0156, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0158, { 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0159, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015A, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015C, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x015E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x015F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0160, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x0163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x0164, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0165, { 0x00, 0x00, 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0168, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016A, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016C, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016E, { 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x016F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0170, { 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x10, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x0174, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0176, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x0178, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0179, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017B, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017D, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x017F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0180, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xF8, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0181, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xA2, 0x00, 0xA1, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0184, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0185, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0xE0, 0x00, 0x6E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0186, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0187, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x1E, 0x00, 0x22, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0188, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x3E, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0189, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0xF1, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x018A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xA2, 0x00, 0xA1, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x018B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x21, 0x00, 0x41, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x018C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x018D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x018E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x018F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0193, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0194, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x51, 0x00, 0x69, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x44, 0x80, 0x48, 0x00, 0x50, 0x00, 0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x019A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x019B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x18, 0x00, 0x10, 0x00, 0x28, 0x00, 0x48, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x019C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x019D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x31, 0x00, 0x29, 0x00, 0x25, 0x00, 0x23, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x019E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x019F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x31, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xA2, 0x00, 0xA1, 0x00, 0x21, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x01A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x01AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01AF, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x26, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x11, 0x00, 0x12, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x80, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x01B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x3E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x3E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x01BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x09, 0x00, 0x31, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x01BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x60, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x01C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C4, { 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x77, 0x00, 0x51, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x72, 0x00, 0x50, 0x00, 0x48, 0x00, 0x4F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x4C, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x45, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7A, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x01C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x72, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x01CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x80, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x69, 0x00, 0x59, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x6A, 0x00, 0x5A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x01CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x6A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x02, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x01CD, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01CF, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D1, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D3, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D5, { 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D6, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D7, { 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D8, { 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01D9, { 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DA, { 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DB, { 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DC, { 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DE, { 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E0, { 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E2, { 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x24, 0x00, 0x44, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09, 0x00, 0x09, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x47, 0x80, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xFF, 0x80, 0x41, 0x00, 0x3E, 0x00, }}, +{ 0x01E6, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x01E8, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01E9, { 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x01EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x01EC, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x01ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x01EE, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x01F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x01F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x51, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x50, 0x00, 0x48, 0x00, 0x4F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x54, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x4C, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F4, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x01F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x79, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x60, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F8, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01FA, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01FB, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01FC, { 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x44, 0x00, 0x44, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09, 0x00, 0x09, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01FE, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x43, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x49, 0x00, 0x51, 0x00, 0x51, 0x00, 0x61, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x01FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x51, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0200, { 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0202, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0204, { 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0206, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0208, { 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x020A, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x020B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x020C, { 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x020D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x020E, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x020F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0210, { 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0212, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0214, { 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0216, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x021A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x021B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x021C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x02, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x021D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x02, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, }}, +{ 0x021E, { 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x021F, { 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x0222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x0225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x0226, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x0229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x022A, { 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x022B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x022C, { 0x3E, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x022D, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x022E, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x022F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0230, { 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0231, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0232, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0233, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x0250, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0251, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0253, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0255, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x46, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0256, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0257, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0258, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0259, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x025A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x43, 0x00, 0x02, 0x80, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x025B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x025C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x025D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x43, 0x00, 0x02, 0x80, 0x1C, 0x00, 0x02, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x025E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x5E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x025F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x0260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x0261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x0262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x23, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x0266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x026A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x026B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x026C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x026D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x026E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2F, 0x00, 0x21, 0x00, 0x22, 0x00, 0x26, 0x00, 0x21, 0x00, 0x21, 0x00, 0x71, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x026F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x00, 0x00, }}, +{ 0x0273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, }}, +{ 0x0274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x46, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x027A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x46, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x027B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x027C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x027D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x027E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x027F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x21, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0281, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0284, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x38, 0x00, 0x4C, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0287, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0288, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0289, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x028A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x028B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x028C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x028D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x028E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x18, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x028F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0290, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0291, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x12, 0x00, 0x25, 0x00, 0x7E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0292, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x0293, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x11, 0x00, 0x2D, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x00, 0x00, }}, +{ 0x0294, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0295, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0296, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0297, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0298, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x029A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x39, 0x00, 0x41, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x029B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x029C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x029D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x45, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x029E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x31, 0x00, 0x0D, 0x00, 0x03, 0x00, 0x0D, 0x00, 0x31, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x029F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, }}, +{ 0x02A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x2F, 0x80, 0x58, 0x80, 0x49, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x5C, 0x00, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x5F, 0x00, 0xB1, 0x00, 0x92, 0x00, 0x96, 0x00, 0x91, 0x00, 0xB1, 0x00, 0x51, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x5F, 0x00, 0xB1, 0x00, 0x92, 0x00, 0x94, 0x00, 0x94, 0x00, 0xBB, 0x00, 0x5E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x77, 0x00, 0x28, 0x00, 0x28, 0x00, 0x26, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x25, 0x00, 0x24, 0x00, 0x74, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x14, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x77, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x16, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x79, 0x00, 0x29, 0x00, 0x29, 0x00, 0x29, 0x00, 0x29, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x30, 0x00, 0x2E, 0x00, 0x21, 0x00, 0x31, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x68, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x58, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x58, 0x00, 0x28, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x50, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x38, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x02CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, }}, +{ 0x02D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x02DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x22, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x32, 0x00, 0x52, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x30, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x40, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x02EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, }}, +{ 0x02EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, }}, +{ 0x02ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x02EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0300, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0301, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0302, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0303, { 0x00, 0x00, 0x39, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0304, { 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0305, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0306, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0307, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0308, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0309, { 0x18, 0x00, 0x24, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030A, { 0x0C, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030B, { 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030C, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030D, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030E, { 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x030F, { 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0310, { 0x08, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0311, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0312, { 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0313, { 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0314, { 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0315, { 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0316, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, }}, +{ 0x0317, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, }}, +{ 0x0318, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x04, 0x00, }}, +{ 0x0319, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, }}, +{ 0x031A, { 0x00, 0x00, 0x03, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x031B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x031C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, }}, +{ 0x031D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, }}, +{ 0x031E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x031F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, }}, +{ 0x0320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0321, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x06, 0x00, }}, +{ 0x0322, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x80, 0x02, 0x80, 0x01, 0x00, }}, +{ 0x0323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0324, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, }}, +{ 0x0325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x0C, 0x00, }}, +{ 0x0326, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, }}, +{ 0x0327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x0329, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x032A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x00, 0x00, }}, +{ 0x032B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x14, 0x00, }}, +{ 0x032C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, }}, +{ 0x032D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x032E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x032F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, }}, +{ 0x0330, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x4E, 0x00, 0x00, 0x00, }}, +{ 0x0331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, }}, +{ 0x0334, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0335, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0336, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0337, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, }}, +{ 0x033A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x033B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x1C, 0x00, }}, +{ 0x033C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x00, 0x00, }}, +{ 0x033D, { 0x36, 0x00, 0x08, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x033E, { 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x033F, { 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0340, { 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0341, { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0342, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0343, { 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0344, { 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0345, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x0346, { 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0347, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, }}, +{ 0x0348, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x0349, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, }}, +{ 0x034A, { 0x04, 0x00, 0x39, 0x00, 0x4E, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x034B, { 0x02, 0x00, 0x78, 0x80, 0x8F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x034C, { 0x39, 0x00, 0x4E, 0x00, 0x39, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x034D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x00, }}, +{ 0x034E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x034F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0360, { 0x00, 0x00, 0x1C, 0x80, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0361, { 0x00, 0x00, 0x1F, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0362, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x3F, 0x80, 0x03, 0x00, 0x02, 0x00, }}, +{ 0x0363, { 0x18, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0364, { 0x18, 0x00, 0x24, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0365, { 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0366, { 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0367, { 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0368, { 0x1C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0369, { 0x04, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x036A, { 0x20, 0x00, 0x38, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x036B, { 0x34, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x036C, { 0x14, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x036D, { 0x10, 0x00, 0x38, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x036E, { 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x036F, { 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0374, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0375, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, }}, +{ 0x037A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x037E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0385, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0386, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0387, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0388, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0389, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038A, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038C, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038E, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x038F, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x039F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AA, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AB, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x03AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x03B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x03B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x03B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x02, 0x00, 0x3A, 0x00, 0x46, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x5D, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x03BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x03BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x03C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x03C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, }}, +{ 0x03C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x42, 0x00, 0x44, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x62, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x55, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D4, { 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x61, 0x00, 0x12, 0x00, 0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x25, 0x00, 0x43, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x03D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x03DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x03DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4A, 0x00, 0x52, 0x00, 0x62, 0x00, 0x42, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x03E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x26, 0x00, 0x26, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x25, 0x00, 0x09, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x03E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x71, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x3E, 0x00, 0x51, 0x00, 0x21, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x21, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x7F, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x12, 0x00, 0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x24, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, }}, +{ 0x03F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x03F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x03F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0400, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0401, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0402, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x16, 0x00, 0x19, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0403, { 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0407, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x7E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040C, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040D, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040E, { 0x00, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x040F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0410, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0411, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0414, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0415, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0419, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x041F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0420, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0421, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0423, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0424, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0425, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0427, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0428, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0429, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x12, 0x00, 0x11, 0x00, 0x11, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x71, 0x00, 0x49, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x71, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x042F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x21, 0x00, 0x41, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1F, 0x00, 0x09, 0x00, 0x11, 0x00, 0x21, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0430, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0432, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0434, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0435, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0437, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0439, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x78, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x043F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x0441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x0444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0447, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x79, 0x00, 0x45, 0x00, 0x45, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x71, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x044F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x11, 0x00, 0x21, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0450, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0451, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0452, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0453, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0454, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x78, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0456, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0457, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0458, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x0459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2E, 0x00, 0x29, 0x00, 0x29, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x7E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x78, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x045E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x045F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0460, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x55, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0xF8, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0463, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0464, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x50, 0x00, 0x50, 0x00, 0x7F, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x51, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x50, 0x00, 0x7E, 0x00, 0x50, 0x00, 0x51, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0466, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0467, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x7A, 0x00, 0x4A, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x7A, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x046A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x046B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x046C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4A, 0x00, 0x7C, 0x00, 0x4E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x046D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x51, 0x00, 0x4A, 0x00, 0x7C, 0x00, 0x4E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x046E, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x046F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x0470, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0471, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0472, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0473, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x22, 0x00, 0x24, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0476, { 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x22, 0x00, 0x24, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0478, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x50, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x23, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x0479, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x23, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x047A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x047B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x047C, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x55, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x047D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x047E, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x55, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x047F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0481, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x0482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x09, 0x00, 0x48, 0x00, 0x30, 0x00, 0x18, 0x00, 0x24, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0483, { 0x02, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0484, { 0x00, 0x00, 0x38, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0485, { 0x3C, 0x00, 0x62, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0486, { 0x1E, 0x00, 0x23, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x42, 0x00, 0x64, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x42, 0x00, 0x64, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x048A, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x048B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x048C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xF8, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x048D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x048E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x45, 0x00, 0x42, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x048F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x45, 0x00, 0x62, 0x00, 0x5D, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x0490, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x78, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0496, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0497, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x0499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x049A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x049B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x78, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x049C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x54, 0x00, 0x58, 0x00, 0x50, 0x00, 0x78, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x049D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x52, 0x00, 0x54, 0x00, 0x78, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x049E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xF2, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x049F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0xF0, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x12, 0x00, 0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x12, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x40, 0x00, 0x46, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x4C, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3C, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x04AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x04AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x04B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x04B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x04B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3F, 0x00, 0x09, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x3F, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x61, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x9E, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x61, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x04BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x9E, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x04C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04C1, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x04C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x78, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x01, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x04C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x61, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x04C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x04C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D0, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D2, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x44, 0x00, 0x44, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x09, 0x00, 0x09, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D6, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04DA, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04DC, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04DE, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x04E2, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E4, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E6, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04EA, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04EC, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04EE, { 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x04F0, { 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x04F2, { 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x04F4, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04F8, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x71, 0x00, 0x49, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x04F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x79, 0x00, 0x45, 0x00, 0x45, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0502, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x85, 0x00, 0x85, 0x00, 0x85, 0x00, 0x85, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0503, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x34, 0x00, 0x4C, 0x00, 0x44, 0x00, 0x45, 0x00, 0x45, 0x00, 0x4D, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x18, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0506, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0507, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0509, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x25, 0x00, 0x25, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x050A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x7C, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x050B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x7C, 0x00, 0x45, 0x00, 0x45, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x050C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x050D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x050E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x050F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x8E, 0x00, 0x85, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x7E, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0534, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0535, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0536, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x48, 0x00, 0x7C, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0537, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0538, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0539, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x9E, 0x00, 0xA5, 0x00, 0xA4, 0x00, 0xA4, 0x00, 0xA4, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x053A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7E, 0x00, 0x85, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x053B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x053C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x053D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF1, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x053E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC6, 0x00, 0x39, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x053F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0540, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0541, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x42, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0542, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0543, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xC9, 0x00, 0x30, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0x85, 0x00, 0x85, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0545, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0546, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0547, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x26, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0548, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0549, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x64, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x054A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x09, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x054B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x21, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x48, 0x00, 0x7C, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x054C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x86, 0x00, 0x85, 0x00, 0x85, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x054D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x054E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x054F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0551, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x62, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0552, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0553, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0554, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0xA0, 0x00, 0x7C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0555, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0556, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3E, 0x00, 0x09, 0x00, 0x09, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0559, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x055A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x055B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x055C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x055D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x055E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x055F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0561, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0562, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x0563, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4C, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x0564, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x64, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x47, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x0565, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0566, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x4C, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x4C, 0x00, 0x34, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, }}, +{ 0x0567, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0568, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x00, 0x00, }}, +{ 0x0569, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x4F, 0x00, 0x52, 0x00, 0x52, 0x00, 0x4C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x056A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x056B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x056C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, }}, +{ 0x056D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xE2, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x8D, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, }}, +{ 0x056E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x24, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x056F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, }}, +{ 0x0570, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0571, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0572, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x0573, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0574, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0575, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00, }}, +{ 0x0576, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x40, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x0578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0579, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, }}, +{ 0x057A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x37, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x057B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, }}, +{ 0x057C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x057D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x057E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x057F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x59, 0x00, 0x29, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0580, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x0581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x0582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x4A, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x59, 0x00, 0x29, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0584, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0586, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3E, 0x00, 0x09, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x0587, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0589, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x058A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, }}, +{ 0x05B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x63, 0x00, }}, +{ 0x05B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x00, 0x00, 0x00, 0x03, 0x00, }}, +{ 0x05B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x00, 0x20, 0x00, 0x23, 0x00, }}, +{ 0x05B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x18, 0x00, }}, +{ 0x05B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, }}, +{ 0x05B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x03, 0x00, }}, +{ 0x05BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, }}, +{ 0x05BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1E, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE3, 0x00, 0x77, 0x00, 0x45, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x05DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xDE, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x81, 0x00, 0x81, 0x00, 0x9F, 0x00, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x05E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xE7, 0x00, 0x73, 0x00, 0x41, 0x00, 0x21, 0x00, 0x11, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x82, 0x00, 0xC4, 0x00, 0xC4, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x05E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x61, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xE7, 0x00, 0x63, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x05E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xE7, 0x00, 0x63, 0x00, 0x24, 0x00, 0x18, 0x00, 0x06, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x21, 0x00, 0x21, 0x00, 0x26, 0x00, 0x28, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x05E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0xDB, 0x00, 0x49, 0x00, 0x89, 0x00, 0x91, 0x00, 0xA2, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x21, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x66, 0x00, 0x33, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x66, 0x00, 0x33, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x66, 0x00, 0x33, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x05F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x69, 0x00, 0x59, 0x00, 0x29, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x69, 0x00, 0x49, 0x00, 0x29, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x49, 0x00, 0x55, 0x00, 0x29, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x29, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x71, 0x00, 0x51, 0x00, 0x11, 0x00, 0x39, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x00, 0x21, 0x00, 0x11, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0D, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x22, 0x00, 0x52, 0x00, 0x33, 0x00, 0x16, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x6A, 0x00, 0x59, 0x00, 0x29, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x6A, 0x00, 0x49, 0x00, 0x29, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x45, 0x00, 0x25, 0x00, 0x45, 0x00, 0x6D, 0x00, 0x57, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x49, 0x00, 0x29, 0x00, 0x49, 0x00, 0x69, 0x00, 0x59, 0x00, 0x26, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x61, 0x00, 0xA1, 0x00, 0x49, 0x00, 0x3D, 0x00, 0x4B, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x0E0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x61, 0x00, 0xA1, 0x00, 0x51, 0x00, 0x35, 0x00, 0x5B, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0x0E10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0D, 0x00, 0x02, 0x00, 0x33, 0x00, 0x55, 0x00, 0x2B, 0x00, 0x00, 0x00, }}, +{ 0x0E11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0x00, 0xE9, 0x00, 0xA9, 0x00, 0x31, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x55, 0x00, 0x45, 0x00, 0x75, 0x00, 0x55, 0x00, 0x6F, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x4A, 0x00, 0x2A, 0x00, 0x4A, 0x00, 0x6B, 0x00, 0x5E, 0x80, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x49, 0x00, 0x55, 0x00, 0x49, 0x00, 0x51, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x49, 0x00, 0x51, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x31, 0x00, 0x29, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0xA9, 0x00, 0x69, 0x00, 0x31, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0xA2, 0x00, 0x62, 0x00, 0x22, 0x00, 0x27, 0x00, 0x2A, 0x80, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA1, 0x00, 0x61, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0xA1, 0x00, 0x61, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E1E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA1, 0x00, 0x6D, 0x00, 0x2D, 0x00, 0x33, 0x00, 0x33, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0xA1, 0x00, 0x6D, 0x00, 0x2D, 0x00, 0x33, 0x00, 0x33, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x61, 0x00, 0xA1, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x51, 0x00, 0x31, 0x00, 0x11, 0x00, 0x39, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x51, 0x00, 0x61, 0x00, 0x31, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x31, 0x00, 0x29, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x39, 0x00, 0x45, 0x00, 0x63, 0x00, 0x51, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x61, 0x00, 0x21, 0x00, 0x61, 0x00, 0xA1, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x49, 0x00, 0x55, 0x00, 0x29, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA5, 0x00, 0x6B, 0x80, 0x27, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x39, 0x00, 0x45, 0x00, 0x63, 0x00, 0x51, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0xA5, 0x00, 0x62, 0x00, 0x25, 0x00, 0x29, 0x00, 0x31, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0xA1, 0x00, 0x6D, 0x00, 0x2D, 0x00, 0x33, 0x00, 0x33, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x21, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x21, 0x00, 0x51, 0x00, 0x61, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x55, 0x00, 0x39, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x52, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x21, 0x00, 0x52, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x29, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xA0, 0x00, 0x4E, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x4D, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, }}, +{ 0x0E39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x07, 0x00, }}, +{ 0x0E3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x0E3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x66, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x64, 0x00, 0x54, 0x00, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x54, 0x00, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x61, 0x00, 0x51, 0x00, 0x21, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, }}, +{ 0x0E47, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E48, { 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E49, { 0x31, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E4A, { 0x6D, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E4B, { 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E4C, { 0x39, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E4E, { 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E4F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x51, 0x00, 0x69, 0x00, 0x31, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x4A, 0x00, 0x55, 0x00, 0x59, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x61, 0x00, 0x51, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x20, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x26, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x80, 0x1F, 0x00, 0x20, 0x00, 0x44, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x26, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E56, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x5C, 0x00, 0x22, 0x00, 0x01, 0x00, 0x01, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x69, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0xC5, 0x00, 0xA5, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E58, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x00, 0x20, 0x00, 0x42, 0x00, 0x45, 0x00, 0x43, 0x00, 0x39, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x80, 0x35, 0x00, 0x4C, 0x00, 0x44, 0x00, 0x54, 0x00, 0x2A, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x75, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x0E5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x55, 0x80, 0x56, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x11, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x98, 0x00, 0x68, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x09, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x16, 0x00, 0x19, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x87, 0x00, 0x85, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x90, 0x00, 0x10, 0x00, 0x16, 0x00, 0x19, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x89, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x89, 0x00, 0x8D, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x23, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0D, 0x00, 0x09, 0x00, 0x89, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x8A, 0x00, 0x8D, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x7F, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x89, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x78, 0x00, 0x44, 0x00, 0x48, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x20, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x90, 0x00, 0x90, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x48, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x46, 0x00, 0x3A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x7E, 0x00, 0x89, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x08, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x4E, 0x00, 0x20, 0x00, 0x70, 0x00, 0x8C, 0x00, 0x02, 0x00, 0x00, 0x00, }}, +{ 0x10D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, 0x72, 0x00, 0x14, 0x00, 0x1E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x95, 0x00, 0x95, 0x00, 0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x20, 0x00, 0x78, 0x00, 0x84, 0x00, 0x02, 0x00, 0x00, 0x00, }}, +{ 0x10DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1D, 0x00, 0x11, 0x00, 0x49, 0x00, 0x31, 0x00, 0x01, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x38, 0x00, 0x40, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x48, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E2, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x18, 0x00, 0x66, 0x00, 0x99, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x32, 0x00, 0x01, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E5, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x12, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x10, 0x00, 0x78, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x10E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x26, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x13, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x38, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x42, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x10ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x04, 0x00, 0x35, 0x00, 0x4E, 0x00, 0x4E, 0x00, 0x35, 0x00, 0x04, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x10EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x92, 0x00, 0x94, 0x00, 0x08, 0x00, 0x15, 0x00, 0x65, 0x00, 0x12, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x4C, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x42, 0x00, 0x4C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F4, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x3E, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x10F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x44, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x10FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0x22, 0x00, 0x07, 0x00, 0x22, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x67, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xCE, 0x00, 0xCC, 0x00, 0xFC, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC6, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x33, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC6, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1204, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC6, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x33, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x120A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x120B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x120C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x120D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x73, 0x00, 0x4B, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x120E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x120F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1210, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x80, 0x7E, 0x80, 0xDB, 0x80, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDA, 0x00, 0xDA, 0x80, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1214, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDA, 0x80, 0xDA, 0x80, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1216, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xAA, 0x00, 0xAB, 0x80, 0xAA, 0x80, 0xAA, 0x00, 0xAA, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x121A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x46, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x13, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x121B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x23, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x121C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x46, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x121D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x32, 0x00, 0x10, 0x00, 0x30, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x121E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x32, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x121F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x23, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDE, 0x00, 0xD8, 0x00, 0xD8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1221, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x80, 0xDE, 0x80, 0xD8, 0x80, 0xD8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x0D, 0x80, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x80, 0x6D, 0x80, 0x6D, 0x80, 0x6D, 0x80, 0x6D, 0x80, 0x6D, 0x80, 0x7F, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1226, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE3, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x122A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC6, 0x00, 0xC3, 0x00, 0xE3, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x122B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC3, 0x00, 0xE7, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x122C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xE7, 0x00, 0x7C, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x122D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0xC6, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC3, 0x00, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x122E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x79, 0x00, 0xC6, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC3, 0x00, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x122F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC3, 0x00, 0xE7, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1230, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1231, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1232, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1233, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1234, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1235, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1236, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1238, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1239, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x123A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x123B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x123C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x123D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x123E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x123F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x38, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1240, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1241, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1242, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1243, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1244, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1245, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x78, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1246, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1248, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x1F, 0x00, 0x1C, 0x80, 0x1B, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x124A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x80, 0x18, 0x80, 0x7E, 0x80, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x124B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x124C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x124D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x80, 0x18, 0x80, 0x18, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1250, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1251, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1253, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1255, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1256, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x24, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1258, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x1F, 0x00, 0x1C, 0x80, 0x1B, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x125A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x80, 0x18, 0x80, 0x7E, 0x80, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x125B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x125C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x125D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7E, 0x80, 0x18, 0x80, 0x18, 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x13, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0xF3, 0x00, 0xB3, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x126A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x126B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x126C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x126D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x13, 0x00, 0x33, 0x00, 0xF3, 0x00, 0xB3, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x126E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x126F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x00, 0x38, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x127A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x127B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x127C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x127D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xB2, 0x00, 0x10, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x127E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xA5, 0x00, 0x3C, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x127F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x99, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x7C, 0x00, 0x67, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1281, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x07, 0x80, 0x06, 0x80, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x80, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x7C, 0x00, 0x67, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1284, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x67, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0C, 0x80, 0x1B, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1288, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x80, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x128A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0xF0, 0x00, 0xDD, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x0D, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x128B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x128C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xF8, 0x00, 0xCE, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x80, 0x1F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x128D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x31, 0x00, 0xF1, 0x00, 0xDF, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1290, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1291, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xF8, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1292, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xF8, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1293, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1294, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xF8, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1295, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xD8, 0x00, 0xD8, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1296, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x60, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1297, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1298, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0D, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x129A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x129B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x129C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x129D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x78, 0x00, 0xD8, 0x00, 0xDF, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x129E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x69, 0x00, 0x66, 0x00, 0x60, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x129F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x38, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x38, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x70, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x38, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xFC, 0x00, 0x30, 0x00, 0x38, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x67, 0x80, 0x66, 0x80, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x80, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x67, 0x00, 0x64, 0x80, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x3B, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x67, 0x00, 0x64, 0x80, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xB8, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6C, 0x80, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x80, 0x1F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0xBD, 0x00, 0x66, 0x80, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x70, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x67, 0x80, 0x66, 0x80, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x80, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x70, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x67, 0x00, 0x64, 0x80, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x70, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x3B, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x70, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x67, 0x00, 0x64, 0x80, 0x67, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xB8, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x6F, 0x00, 0x6C, 0x80, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xBC, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x80, 0x1F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0xE1, 0x00, 0x81, 0x00, 0xBD, 0x00, 0x66, 0x80, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x54, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x54, 0x80, 0x3F, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x33, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x54, 0x00, 0x92, 0x00, 0x93, 0x80, 0x92, 0x80, 0x92, 0x00, 0x54, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x30, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x36, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xDE, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x36, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0xDE, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x19, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x3E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0xCF, 0x00, 0xCD, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCD, 0x00, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCE, 0x00, 0xC9, 0x00, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x23, 0x00, 0x33, 0x00, 0x33, 0x00, 0x3F, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xFC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x3F, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x67, 0x80, 0x66, 0x80, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x80, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x67, 0x00, 0x64, 0x80, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x23, 0x80, 0x73, 0x00, 0x33, 0x00, 0x3F, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x63, 0x00, 0x63, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x6C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x6C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x19, 0x00, 0x1F, 0x00, 0x19, 0x00, 0x18, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x63, 0x00, 0x63, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x6C, 0x00, 0xC6, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x6C, 0x00, 0xC6, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x19, 0x00, 0x1B, 0x00, 0x7E, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x6C, 0x00, 0xC6, 0x00, 0xC7, 0x80, 0x66, 0x80, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x80, 0x7E, 0x80, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7C, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x43, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7F, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x80, 0x66, 0x80, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC2, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xCC, 0x00, 0x70, 0x00, 0x60, 0x00, 0x30, 0x00, 0xFC, 0x00, 0x86, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x80, 0x7E, 0x80, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7C, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x43, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7F, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x80, 0x38, 0x80, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x66, 0x00, 0x38, 0x00, 0x30, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC2, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x12FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xFE, 0x00, 0xCC, 0x00, 0x70, 0x00, 0x60, 0x00, 0x30, 0x00, 0xFC, 0x00, 0x86, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1300, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1301, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x80, 0x7E, 0x80, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1302, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7C, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1303, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x43, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1304, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7F, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1305, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x80, 0x66, 0x80, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1306, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xC2, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1307, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x66, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1308, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1309, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0D, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x130A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x130B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x130C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x130D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xCB, 0x00, 0x73, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x130E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1310, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1312, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1313, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xCC, 0x00, 0x0C, 0x00, 0x3E, 0x00, 0x33, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1314, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1315, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xF9, 0x00, 0x0F, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1318, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1319, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x00, 0x0D, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x131A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x131B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x131C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x30, 0x00, 0xF8, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x131D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x0C, 0x00, 0x7E, 0x00, 0xCB, 0x00, 0x73, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x131E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x24, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1320, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1321, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xAF, 0x00, 0xAB, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1322, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xAB, 0x00, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1324, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xAE, 0x00, 0xA9, 0x00, 0xAE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1326, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0xDB, 0x00, 0xB6, 0x80, 0xB6, 0x80, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1329, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0x93, 0x80, 0x92, 0x80, 0x92, 0x00, 0xDB, 0x00, 0xB6, 0x80, 0xB6, 0x80, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x132A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0xDA, 0x00, 0xB6, 0x80, 0xB6, 0x80, 0xDB, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x132B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0xDA, 0x00, 0xB6, 0x00, 0xB6, 0x00, 0xDB, 0x00, 0x02, 0x80, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x132C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x93, 0x80, 0x92, 0x80, 0x93, 0x80, 0x92, 0x00, 0xDB, 0x00, 0xB6, 0x80, 0xB6, 0x80, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x132D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0xD3, 0x00, 0xB2, 0x80, 0xB2, 0x80, 0xDB, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x132E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0x9B, 0x00, 0x96, 0x80, 0x96, 0x80, 0xDB, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x132F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xD6, 0x00, 0x92, 0x00, 0xDA, 0x00, 0xB6, 0x00, 0xB6, 0x00, 0xDA, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1330, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x80, 0x66, 0x80, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC2, 0x80, 0xC3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x43, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1334, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x67, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1335, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x67, 0x80, 0x66, 0x80, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1336, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC2, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1337, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x43, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x80, 0x66, 0x80, 0xC3, 0x80, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x133A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC6, 0x00, 0xC6, 0x80, 0xC7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x133B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC3, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x133C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC7, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x133D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x67, 0x80, 0x66, 0x80, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x133E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x66, 0x00, 0xC3, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x133F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0x78, 0x00, 0x78, 0x00, 0xCC, 0x00, 0x86, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1340, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x36, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xFE, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xDE, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1341, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x36, 0x00, 0xC6, 0x00, 0xC6, 0x00, 0xFF, 0x80, 0xC6, 0x80, 0xC6, 0x00, 0xC6, 0x00, 0xDE, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1342, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xFE, 0x00, 0xC6, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x19, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1343, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xFE, 0x00, 0xC6, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1344, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xC6, 0x00, 0xFE, 0x00, 0xC6, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1345, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1346, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x63, 0x00, 0x3E, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1348, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0xD8, 0x00, 0xC8, 0x00, 0xEB, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1349, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x78, 0x00, 0xCC, 0x00, 0xEC, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x134A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xD6, 0x00, 0xD3, 0x00, 0xF3, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x134B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xD0, 0x00, 0xCB, 0x00, 0xEF, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x134C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0xD0, 0x00, 0xC8, 0x00, 0xEF, 0x00, 0x7C, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x134D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0xC6, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x00, 0xC8, 0x00, 0xCB, 0x00, 0xFF, 0x00, 0x7E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x134E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x79, 0x00, 0xC6, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xF0, 0x00, 0xC8, 0x00, 0xCB, 0x00, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x134F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x70, 0x00, 0xD0, 0x00, 0xCB, 0x00, 0xEF, 0x00, 0x7C, 0x00, 0x38, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1350, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1351, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1352, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1353, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1354, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1355, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1356, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1357, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1358, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x23, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1359, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC6, 0x00, 0xC3, 0x00, 0xE3, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x135A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xD6, 0x00, 0xD3, 0x00, 0xF3, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1361, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1362, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1363, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1364, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x03, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1365, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x03, 0x00, 0xFF, 0x00, 0xC0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1366, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1367, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1368, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x18, 0x00, 0x18, 0x00, 0xC3, 0x00, 0xC3, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1369, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x136A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x7C, 0x00, 0x60, 0x00, 0x7C, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x136B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x136C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x136D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3F, 0x00, 0x73, 0x00, 0x60, 0x00, 0x63, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x136E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x1B, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x136F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x19, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1370, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x5A, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1371, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x64, 0x00, 0x38, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1372, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1373, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x5A, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x42, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1374, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCE, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x73, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1375, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x7F, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1376, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1377, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x5A, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1378, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x39, 0x00, 0x66, 0x00, 0x60, 0x00, 0x60, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1379, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x137A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x78, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x137B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7C, 0x00, 0x60, 0x00, 0x60, 0x00, 0x30, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x137C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x76, 0x00, 0x99, 0x00, 0x99, 0x00, 0xEE, 0x00, 0x88, 0x00, 0x88, 0x00, 0x44, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x43, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x6B, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x31, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x26, 0x00, 0x45, 0x00, 0x45, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x20, 0x00, 0x10, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x01, 0x00, 0x01, 0x00, 0x21, 0x00, 0x51, 0x00, 0x51, 0x00, 0x61, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x29, 0x00, 0x29, 0x00, 0x36, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x21, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x58, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x2A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x46, 0x00, 0x42, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x25, 0x00, 0x65, 0x00, 0x59, 0x00, 0x29, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x3A, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x23, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x44, 0x00, 0x47, 0x00, 0x45, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x62, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x62, 0x00, 0x5E, 0x00, 0x42, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x16, 0x00, 0x19, 0x00, 0x10, 0x00, 0x30, 0x00, 0x68, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x01, 0x00, 0x01, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x78, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x22, 0x00, 0x32, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x43, 0x00, 0x25, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x51, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x74, 0x00, 0x04, 0x00, 0x74, 0x00, 0x24, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x45, 0x80, 0x47, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x01, 0x00, 0x21, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x09, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x57, 0x00, 0x74, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x51, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x29, 0x00, 0x59, 0x00, 0x59, 0x00, 0x59, 0x00, 0x59, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x14, 0x00, 0x25, 0x00, 0x3F, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x7C, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x2A, 0x00, 0x1D, 0x00, 0x11, 0x00, 0x22, 0x00, 0x50, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x48, 0x00, 0x44, 0x00, 0x44, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x3F, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x68, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x12, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x21, 0x00, 0x51, 0x00, 0x52, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x23, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x23, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x22, 0x00, 0x52, 0x00, 0x52, 0x00, 0x3F, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0xF5, 0x00, 0x16, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x47, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x43, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x11, 0x00, 0x12, 0x00, 0x12, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x27, 0x00, 0x2D, 0x00, 0x34, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x43, 0x00, 0x40, 0x00, 0x43, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x42, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x51, 0x00, 0x51, 0x00, 0x52, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x79, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x55, 0x00, 0x51, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x09, 0x00, 0x06, 0x00, 0x02, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x01, 0x00, 0x29, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x61, 0x00, 0x21, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x53, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x27, 0x00, 0x47, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4E, 0x00, 0x42, 0x00, 0x46, 0x00, 0x2A, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x13F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1402, { 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1403, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1404, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x98, 0x00, 0x86, 0x00, 0x81, 0x00, 0x81, 0x00, 0x86, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1406, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x98, 0x00, 0x86, 0x00, 0x81, 0x00, 0x81, 0x00, 0x86, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1407, { 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x98, 0x00, 0x86, 0x00, 0x81, 0x00, 0x81, 0x00, 0x86, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x98, 0x00, 0xA6, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0xA6, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x98, 0x00, 0x86, 0x00, 0xB1, 0x00, 0xB1, 0x00, 0x86, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x140A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x19, 0x00, 0x61, 0x00, 0x81, 0x00, 0x81, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x140B, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x01, 0x00, 0x07, 0x00, 0x19, 0x00, 0x61, 0x00, 0x81, 0x00, 0x81, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x140C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0xD4, 0x00, 0xD4, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x140D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x140E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xD4, 0x00, 0xD4, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x140F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x44, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1410, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xD4, 0x00, 0xD4, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1411, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x44, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x14, 0x00, 0x12, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x12, 0x00, 0x14, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0x90, 0x00, 0x8B, 0x00, 0x8B, 0x00, 0x90, 0x00, 0xA0, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1414, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x14, 0x00, 0x12, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x12, 0x00, 0x14, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1415, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0x90, 0x00, 0x8B, 0x00, 0x8B, 0x00, 0x90, 0x00, 0xA0, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1416, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x83, 0x00, 0xE3, 0x00, 0x98, 0x00, 0x86, 0x00, 0x81, 0x00, 0x81, 0x00, 0x86, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x09, 0x00, 0x05, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x8B, 0x00, 0x8B, 0x00, 0x48, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1419, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x09, 0x00, 0x05, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x141A, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x8B, 0x00, 0x8B, 0x00, 0x48, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x141B, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0xC1, 0x00, 0xC7, 0x00, 0x19, 0x00, 0x61, 0x00, 0x81, 0x00, 0x81, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x141C, { 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x141D, { 0x07, 0x00, 0x25, 0x00, 0x77, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x141E, { 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x141F, { 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1420, { 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1421, { 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1422, { 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1423, { 0x1C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1424, { 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1425, { 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1426, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1427, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1428, { 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1429, { 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x142A, { 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x142B, { 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x142C, { 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x09, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x142D, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x81, 0x00, 0xE1, 0x00, 0x98, 0x00, 0x86, 0x00, 0x81, 0x00, 0x81, 0x00, 0x86, 0x00, 0x98, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x142E, { 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x00, 0x19, 0x00, 0x61, 0x00, 0x81, 0x00, 0x81, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x142F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1430, { 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1431, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1432, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1433, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1434, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1435, { 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1436, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x26, 0x00, 0x21, 0x00, 0x21, 0x00, 0x26, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1437, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x31, 0x00, 0x31, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1438, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1439, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x143A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0xE2, 0x00, 0xD4, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x143B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x47, 0x00, 0x2B, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x143C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0xD4, 0x00, 0xE2, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x143D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2B, 0x00, 0x47, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x143E, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0xD4, 0x00, 0xE2, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x143F, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2B, 0x00, 0x47, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x61, 0x00, 0x61, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1442, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x61, 0x00, 0x61, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1443, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x43, 0x00, 0x43, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1446, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1447, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x43, 0x00, 0x43, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1448, { 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1449, { 0x06, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x144A, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x144B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x144C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x144D, { 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x144E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x144F, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1450, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1451, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1452, { 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1453, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1454, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x19, 0x00, 0x19, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1455, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1456, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1457, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0xE1, 0x00, 0xE1, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1458, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x87, 0x00, 0x87, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1459, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x21, 0x00, 0xE1, 0x00, 0xE1, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x145A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x87, 0x00, 0x87, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x145B, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x21, 0x00, 0xE1, 0x00, 0xE1, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x145C, { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x87, 0x00, 0x87, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x145D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xC1, 0x00, 0xC1, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x145E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x145F, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0xC1, 0x00, 0xC1, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1460, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x83, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1463, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1464, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x83, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1466, { 0x1C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1467, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x85, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1468, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x32, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1469, { 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x146A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x41, 0x00, 0x81, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x146B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x81, 0x00, 0x81, 0x00, 0x41, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x146C, { 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x81, 0x00, 0x81, 0x00, 0x82, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x146D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x81, 0x00, 0x81, 0x00, 0x82, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x146E, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x81, 0x00, 0x81, 0x00, 0x82, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x146F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x81, 0x00, 0x81, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1470, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x81, 0x00, 0x81, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1471, { 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x42, 0x00, 0x82, 0x00, 0x82, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1472, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x82, 0x00, 0x81, 0x00, 0x81, 0x00, 0x82, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1473, { 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x82, 0x00, 0x81, 0x00, 0x81, 0x00, 0x82, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x81, 0x00, 0x81, 0x00, 0x41, 0x00, 0x3F, 0x00, 0xC1, 0x00, 0xC1, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x84, 0x00, 0x87, 0x00, 0x47, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1476, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x21, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0xF3, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1478, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x21, 0x00, 0xE1, 0x00, 0xE2, 0x00, 0x3C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1479, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0xF3, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x147A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x0F, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x147B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x147C, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x0F, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x147D, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0x00, 0x07, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x147E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x147F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x86, 0x00, 0x86, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1480, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1481, { 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x86, 0x00, 0x86, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0x3C, 0x00, 0xE2, 0x00, 0xE1, 0x00, 0x21, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1483, { 0x20, 0x00, 0x38, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1484, { 0x04, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1485, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x45, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x71, 0x00, 0x89, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1487, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x82, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x148A, { 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x78, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x148B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x148C, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x148D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x148E, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x148F, { 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1490, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1491, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x02, 0x00, 0x62, 0x00, 0x62, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x40, 0x00, 0x46, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1496, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1497, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x40, 0x00, 0x43, 0x00, 0x43, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xC2, 0x00, 0xC2, 0x00, 0x02, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x149A, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xC2, 0x00, 0xC2, 0x00, 0x02, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x149B, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x149C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x149D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x43, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x149E, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x149F, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x43, 0x00, 0x40, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A1, { 0x20, 0x00, 0x20, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A2, { 0x04, 0x00, 0x04, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A4, { 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A6, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A8, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14A9, { 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14AB, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x83, 0x00, 0x83, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B0, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B1, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x43, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0xC1, 0x00, 0xC1, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B4, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B5, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x46, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B8, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14B9, { 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x46, 0x00, 0x46, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0xD0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14BB, { 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14BC, { 0x1C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14BD, { 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x22, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x44, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xFC, 0x00, 0x12, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0xF8, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x23, 0x00, 0x50, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x48, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xD0, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x03, 0x00, 0x13, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D0, { 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D1, { 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D2, { 0x04, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xC2, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xF3, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xCF, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x43, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xC0, 0x00, 0xCF, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x43, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xC2, 0x00, 0xC1, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x33, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xC2, 0x00, 0xC1, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x03, 0x00, 0x33, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xCC, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x36, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xC0, 0x00, 0xCC, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x30, 0x00, 0x46, 0x00, 0x86, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14EA, { 0x10, 0x00, 0x20, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14EB, { 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x18, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14EE, { 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F0, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F2, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F3, { 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F5, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x38, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x6E, 0x00, 0x62, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x43, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x73, 0x00, 0x43, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14FA, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14FB, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x73, 0x00, 0x43, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x62, 0x00, 0x62, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x1B, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14FE, { 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x62, 0x00, 0x62, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x14FF, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x1B, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x68, 0x00, 0x6C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x73, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1502, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x68, 0x00, 0x6C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1503, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x73, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x68, 0x00, 0x68, 0x00, 0x0C, 0x00, 0x62, 0x00, 0x61, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1505, { 0x10, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1506, { 0x0C, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1507, { 0x04, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1508, { 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1509, { 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x150A, { 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x18, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x150B, { 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x150C, { 0xC0, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x28, 0x00, 0x30, 0x00, 0x70, 0x00, 0x68, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x150D, { 0xC0, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x48, 0x00, 0x50, 0x00, 0x30, 0x00, 0x30, 0x00, 0x70, 0x00, 0x70, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x150E, { 0xC0, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x30, 0x00, 0x3E, 0x00, 0x71, 0x00, 0x71, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x150F, { 0xC0, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x30, 0x00, 0x30, 0x00, 0x70, 0x00, 0x70, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1510, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1511, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1512, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1513, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1514, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1515, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1516, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1517, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x09, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1518, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x27, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1519, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x72, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x151A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x48, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x151B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x60, 0x00, 0x72, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x15, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x151C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x48, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x151D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x151E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3B, 0x00, 0x43, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x151F, { 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x01, 0x00, 0x61, 0x00, 0x61, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1520, { 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x78, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3B, 0x00, 0x43, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1521, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1522, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1523, { 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x6E, 0x00, 0x61, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1524, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x43, 0x00, 0x3B, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1525, { 0x0C, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1526, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1527, { 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1528, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1529, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x152A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x152B, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x152C, { 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x152D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x152E, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x152F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x68, 0x00, 0x68, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x23, 0x00, 0x23, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x62, 0x00, 0x62, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1533, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x62, 0x00, 0x62, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1534, { 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1535, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x68, 0x00, 0x68, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1536, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x23, 0x00, 0x23, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1537, { 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x68, 0x00, 0x68, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1538, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x23, 0x00, 0x23, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1539, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x62, 0x00, 0x62, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x153A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x153B, { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x62, 0x00, 0x62, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x153C, { 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x153D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x64, 0x00, 0x64, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x153E, { 0x10, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x153F, { 0x14, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1540, { 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1541, { 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1542, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1543, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1544, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x09, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1545, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1546, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x34, 0x00, 0x28, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x22, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x34, 0x00, 0x28, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x32, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x38, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x38, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x14, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x34, 0x00, 0x2A, 0x00, 0x34, 0x00, 0x28, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x34, 0x00, 0x28, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x34, 0x00, 0x2A, 0x00, 0x24, 0x00, 0x22, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x28, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x2A, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x2A, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x24, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x28, 0x00, 0x24, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x78, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x31, 0x00, 0x29, 0x00, 0x25, 0x00, 0x23, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x31, 0x00, 0x29, 0x00, 0x35, 0x00, 0x2B, 0x00, 0x25, 0x00, 0x23, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x48, 0x00, 0x44, 0x00, 0x22, 0x00, 0x11, 0x00, 0x09, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x62, 0x00, 0x54, 0x00, 0x48, 0x00, 0x40, 0x00, 0x40, 0x00, 0x48, 0x00, 0x54, 0x00, 0x62, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x23, 0x00, 0x25, 0x00, 0x29, 0x00, 0x31, 0x00, 0x21, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x24, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x24, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x24, 0x00, 0x38, 0x00, 0x28, 0x00, 0x24, 0x00, 0x2A, 0x00, 0x24, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x00, 0x28, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x63, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x0D, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x58, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x77, 0x00, 0x49, 0x00, 0x77, 0x00, 0x41, 0x00, 0x41, 0x00, 0x77, 0x00, 0x49, 0x00, 0x77, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x78, 0x00, 0x21, 0x00, 0x23, 0x00, 0x25, 0x00, 0x29, 0x00, 0x31, 0x00, 0x21, 0x00, 0x07, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x16F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, }}, +{ 0x1E01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, }}, +{ 0x1E02, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E03, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E08, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1E09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x1E0A, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E0B, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x1E11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, }}, +{ 0x1E12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E14, { 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E15, { 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E16, { 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E17, { 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28, 0x00, 0x00, 0x00, }}, +{ 0x1E1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28, 0x00, 0x00, 0x00, }}, +{ 0x1E1C, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1E1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1E1E, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E1F, { 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E20, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, }}, +{ 0x1E22, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E23, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E26, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E27, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x1E29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x20, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, }}, +{ 0x1E2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x1E2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x1E2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28, 0x00, 0x00, 0x00, }}, +{ 0x1E2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x14, 0x00, 0x28, 0x00, 0x00, 0x00, }}, +{ 0x1E2E, { 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E2F, { 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E30, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E31, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x58, 0x00, 0x64, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E37, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E38, { 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E39, { 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E3E, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E40, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E44, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E4C, { 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E4D, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E4E, { 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E4F, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E50, { 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E51, { 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E52, { 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E53, { 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E54, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x1E56, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E57, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x62, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x1E58, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E5A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E5C, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E5E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x48, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E60, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E64, { 0x22, 0x00, 0x24, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E65, { 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E66, { 0x08, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E67, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E68, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E6A, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E6B, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x11, 0x00, }}, +{ 0x1E72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, }}, +{ 0x1E73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, }}, +{ 0x1E74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, }}, +{ 0x1E75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, }}, +{ 0x1E76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, }}, +{ 0x1E78, { 0x04, 0x00, 0x08, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E79, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E7A, { 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E7B, { 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E7C, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E7E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E7F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E80, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E82, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E84, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E86, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E87, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E8A, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E8C, { 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E8E, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x1E90, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1E94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E96, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E97, { 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x49, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x1E9A, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1E9B, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EA2, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA3, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA4, { 0x00, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA6, { 0x00, 0x00, 0x44, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA8, { 0x02, 0x00, 0x11, 0x00, 0x29, 0x00, 0x02, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EA9, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EAA, { 0x00, 0x00, 0x22, 0x80, 0x55, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x80, 0x55, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EAC, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EAE, { 0x04, 0x00, 0x08, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EAF, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB0, { 0x10, 0x00, 0x08, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB1, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB2, { 0x08, 0x00, 0x04, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB3, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB4, { 0x1A, 0x00, 0x2C, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB5, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EB6, { 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EBA, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EBB, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EBC, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EBE, { 0x00, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC0, { 0x00, 0x00, 0x44, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC2, { 0x02, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC3, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC4, { 0x1A, 0x00, 0x2C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC5, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC6, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EC8, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EC9, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ECA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1ECB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1ECC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1ECD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1ECE, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ECF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED0, { 0x00, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED2, { 0x00, 0x00, 0x22, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED4, { 0x02, 0x00, 0x11, 0x00, 0x29, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED5, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x21, 0x00, 0x52, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED6, { 0x1A, 0x00, 0x2C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED7, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1ED8, { 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1ED9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EDA, { 0x04, 0x00, 0x08, 0x00, 0x11, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x11, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EDC, { 0x20, 0x00, 0x10, 0x00, 0x09, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x09, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EDE, { 0x10, 0x00, 0x28, 0x00, 0x09, 0x00, 0x11, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EDF, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x09, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE0, { 0x00, 0x00, 0x14, 0x00, 0x29, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x29, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE2, { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EE6, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE7, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE8, { 0x04, 0x00, 0x08, 0x00, 0x10, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EEA, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EEC, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x80, 0x08, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EED, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EEE, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EF0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EF1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EF2, { 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x1EF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x1EF5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x4A, 0x00, 0x32, 0x00, 0x00, 0x00, }}, +{ 0x1EF6, { 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0x08, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EF7, { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x1EF8, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1EF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x1F00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F06, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F07, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x4A, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x8A, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F0A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x55, 0x00, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F0B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x95, 0x00, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F0C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x65, 0x00, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F0D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x00, 0xA5, 0x00, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F0E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x0A, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F0F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x0A, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F10, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F11, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F12, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F18, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x50, 0x00, 0x90, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x90, 0x00, 0x50, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F1A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x80, 0x58, 0x00, 0x88, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F1B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x80, 0x98, 0x00, 0x48, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F1C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x80, 0x68, 0x00, 0x88, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x80, 0xA8, 0x00, 0x48, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F26, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F27, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x58, 0x80, 0x88, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x98, 0x80, 0x48, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x80, 0x68, 0x80, 0x88, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x80, 0xA8, 0x80, 0x48, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x9F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x5F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F36, { 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F37, { 0x34, 0x00, 0x58, 0x00, 0x00, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x44, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x84, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x80, 0x52, 0x00, 0x82, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x80, 0x92, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x80, 0x62, 0x00, 0x82, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F3D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x80, 0xA2, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x04, 0x00, 0xC4, 0x00, 0x44, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0x00, 0x04, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F42, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F45, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x58, 0x80, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x98, 0x80, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x00, 0x68, 0x80, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x00, 0xA8, 0x80, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F50, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F51, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F52, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F53, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F54, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F55, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F56, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F57, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F59, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x4A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F5B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x98, 0x80, 0x45, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F5D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x80, 0xA8, 0x80, 0x45, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F5F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x11, 0x00, 0xCA, 0x00, 0x8A, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F60, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F62, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F66, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F67, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x58, 0x80, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x98, 0x80, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x00, 0x68, 0x80, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x00, 0xA8, 0x80, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F71, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F72, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F73, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F75, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1F76, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F77, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F78, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F79, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F7B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F7C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F7D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1F80, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F81, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F82, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F83, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F84, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F85, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F86, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F87, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1F88, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x4A, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F89, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x8A, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x55, 0x00, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F8B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x95, 0x00, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F8C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x65, 0x00, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x00, 0xA5, 0x00, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F8E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x0A, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x0A, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F90, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F91, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F92, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F93, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F94, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F96, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F97, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1F98, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F99, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F9A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x58, 0x80, 0x88, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x98, 0x80, 0x48, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F9C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x80, 0x68, 0x80, 0x88, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F9D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x80, 0xA8, 0x80, 0x48, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1F9E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x9F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1F9F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x5F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1FA0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA6, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA7, { 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FA8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1FA9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1FAA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x58, 0x80, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1FAB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x98, 0x80, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1FAC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x00, 0x68, 0x80, 0x88, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1FAD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x00, 0xA8, 0x80, 0x48, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, }}, +{ 0x1FAE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1FAF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0x00, 0x11, 0x00, 0xD1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, }}, +{ 0x1FB0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FB1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FB2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FB3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FB4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FB6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FB7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FB8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FB9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FBA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x4A, 0x00, 0x31, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FBB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x4A, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FBC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FBD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FBE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FBF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1FC3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1FC4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1FC6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, }}, +{ 0x1FC7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 0x00, 0x61, 0x00, 0x00, 0x00, }}, +{ 0x1FC8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x50, 0x00, 0x30, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FC9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x50, 0x00, 0x90, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x51, 0x00, 0x31, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x1F, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FCD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x12, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FCF, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x92, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD7, { 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FD9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x44, 0x00, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x84, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x22, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FDF, { 0x00, 0x00, 0x1A, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x49, 0x00, 0x45, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x1FE5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x1FE6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE7, { 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FE9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x51, 0x00, 0x2A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x51, 0x00, 0x8A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x00, 0x91, 0x00, 0x51, 0x00, 0x11, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x49, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x49, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FEF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FF2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FF3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FF4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FF6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FF7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FF8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x51, 0x00, 0x31, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FF9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FFA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x51, 0x00, 0x31, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FFB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x51, 0x00, 0x91, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x1FFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x1FFE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2001, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2002, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2003, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2004, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2005, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2006, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2007, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2008, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2009, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x200A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2010, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2011, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2012, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2013, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2014, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2015, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2016, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2017, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, }}, +{ 0x2018, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2019, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x24, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x201F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2020, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2021, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2022, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2023, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2024, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2025, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2026, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2027, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x202F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2030, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x52, 0x00, 0x52, 0x00, 0x24, 0x00, 0x08, 0x00, 0x08, 0x00, 0x15, 0x00, 0x2A, 0x80, 0x2A, 0x80, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2031, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, 0x55, 0x00, 0xAA, 0x80, 0xAA, 0x80, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2032, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2033, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2034, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2035, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2036, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2037, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x92, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2038, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2039, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x22, 0x00, 0x14, 0x00, 0x49, 0x00, 0x14, 0x00, 0x22, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x203F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2040, { 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2041, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2042, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x22, 0x00, 0xAA, 0x80, 0x77, 0x00, 0xAA, 0x80, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2043, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2044, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2045, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2046, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2047, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x99, 0x00, 0x99, 0x00, 0x11, 0x00, 0x11, 0x00, 0x22, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2048, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x45, 0x00, 0x45, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2049, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x204A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x204B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5E, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x204C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x3D, 0x00, 0x3D, 0x00, 0x3D, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x204D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x5E, 0x00, 0x5E, 0x00, 0x5E, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x204E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x204F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0x2050, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2051, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2052, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x23, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2057, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x205F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2060, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2061, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2062, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2063, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2070, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2071, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2074, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x50, 0x00, 0x78, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2075, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2076, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2077, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2078, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2079, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x38, 0x00, 0x08, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x207F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2080, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2081, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2082, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2083, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x10, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2084, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x50, 0x00, 0x78, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2085, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2086, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2087, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2088, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2089, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x38, 0x00, 0x08, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x208A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x208B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x208C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x208D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x208E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x80, 0x00, 0x80, 0x00, 0x8F, 0x00, 0x88, 0x00, 0x88, 0x00, 0x7E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x45, 0x00, 0x44, 0x00, 0x48, 0x00, 0x48, 0x00, 0x50, 0x00, 0x50, 0x00, 0x60, 0x00, 0x61, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x4F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x7B, 0x00, 0x2C, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x30, 0x00, 0x51, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x77, 0x00, 0x4B, 0x00, 0x4D, 0x00, 0x49, 0x00, 0x59, 0x00, 0x69, 0x00, 0x41, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0xFF, 0x80, 0x49, 0x00, 0xFF, 0x80, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x41, 0x00, 0xFF, 0x80, 0x41, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x44, 0x00, 0xFE, 0x00, 0x44, 0x00, 0x7B, 0x80, 0x64, 0x00, 0x53, 0x00, 0x48, 0x80, 0x44, 0x80, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0xFF, 0x80, 0x49, 0x00, 0xFF, 0x80, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x45, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x51, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0xFE, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x00, 0x52, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x31, 0x00, 0x59, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x24, 0x00, 0x54, 0x00, 0x5A, 0x00, 0x91, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0xFF, 0x00, 0x42, 0x00, 0xFF, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D0, { 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D1, { 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D4, { 0x5E, 0x00, 0x61, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D5, { 0x3D, 0x00, 0x43, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D6, { 0x20, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D7, { 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x25, 0x00, 0x2D, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x29, 0x00, 0x2D, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20DB, { 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20DC, { 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20DD, { 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, }}, +{ 0x20DE, { 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, }}, +{ 0x20DF, { 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, }}, +{ 0x20E0, { 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0xA0, 0x80, 0xA0, 0x80, 0x90, 0x80, 0x90, 0x80, 0x88, 0x80, 0x88, 0x80, 0x84, 0x80, 0x84, 0x80, 0x82, 0x80, 0x82, 0x80, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, }}, +{ 0x20E1, { 0x22, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20E2, { 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, }}, +{ 0x20E3, { 0x7F, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00, }}, +{ 0x20E4, { 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00, }}, +{ 0x20E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20E7, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, }}, +{ 0x20E9, { 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x20EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0xFF, 0x80, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2100, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x49, 0x00, 0x3A, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x14, 0x00, 0x24, 0x00, 0x44, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2101, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x48, 0x00, 0x48, 0x00, 0x49, 0x00, 0x3A, 0x00, 0x04, 0x00, 0x0B, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2102, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x51, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x51, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2103, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xAE, 0x00, 0x51, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2104, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x54, 0x00, 0x50, 0x00, 0x50, 0x00, 0x54, 0x00, 0x38, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2105, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x42, 0x00, 0x42, 0x00, 0x44, 0x00, 0x38, 0x00, 0x0A, 0x00, 0x15, 0x00, 0x25, 0x00, 0x25, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2106, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x42, 0x00, 0x42, 0x00, 0x44, 0x00, 0x38, 0x00, 0x0D, 0x00, 0x15, 0x00, 0x25, 0x00, 0x25, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2107, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x40, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2108, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x61, 0x00, 0x41, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x09, 0x00, 0x01, 0x00, 0x41, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2109, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x210A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x22, 0x00, 0x22, 0x00, 0x13, 0x80, 0x3C, 0x00, 0x24, 0x00, 0x48, 0x00, 0x70, 0x00, 0x00, 0x00, }}, +{ 0x210B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x35, 0x00, 0x15, 0x00, 0x16, 0x00, 0x2C, 0x00, 0x38, 0x00, 0x68, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x210C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x00, 0xE6, 0x00, 0x66, 0x00, 0x66, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0x66, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x210D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x5E, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x210E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x41, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x210F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x21, 0x00, 0x21, 0x00, 0x41, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2110, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x24, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2111, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x66, 0x00, 0x36, 0x00, 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2112, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x38, 0x00, 0x54, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2113, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2114, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x7F, 0x80, 0x28, 0x00, 0x2A, 0x00, 0x2D, 0x00, 0x29, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2D, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2115, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x51, 0x00, 0x59, 0x00, 0x59, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x53, 0x00, 0x53, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2116, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x68, 0x00, 0x68, 0x00, 0x69, 0x00, 0x5A, 0x80, 0x5A, 0x80, 0x59, 0x00, 0x48, 0x00, 0x4B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2117, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0xB9, 0x00, 0xA5, 0x00, 0xB9, 0x00, 0xA1, 0x00, 0xA1, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2118, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x8C, 0x00, 0x92, 0x00, 0xA1, 0x00, 0xC1, 0x00, 0x41, 0x00, 0xAA, 0x00, 0xA4, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x2119, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5E, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x211A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x55, 0x00, 0x53, 0x00, 0x3E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x211B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x91, 0x00, 0x91, 0x00, 0x91, 0x00, 0x5E, 0x00, 0x14, 0x00, 0x14, 0x00, 0x12, 0x00, 0x52, 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x211C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0xDB, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1A, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x36, 0x00, 0x36, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x211D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5E, 0x00, 0x58, 0x00, 0x54, 0x00, 0x52, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x211E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x48, 0x80, 0x45, 0x00, 0x42, 0x00, 0x45, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x211F, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x45, 0x00, 0x45, 0x00, 0x45, 0x00, 0x7E, 0x00, 0x48, 0x00, 0x4C, 0x00, 0x4A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2120, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x80, 0x8D, 0x80, 0x4A, 0x80, 0x28, 0x80, 0xC8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2121, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x51, 0x00, 0x5D, 0x00, 0x51, 0x00, 0x5D, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2122, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x80, 0x4D, 0x80, 0x4A, 0x80, 0x48, 0x80, 0x48, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2123, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x32, 0x00, 0x22, 0x00, 0x22, 0x00, 0x54, 0x00, 0x54, 0x00, 0x94, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2124, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50, 0x00, 0x50, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2125, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0x2126, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2127, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2128, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x46, 0x00, 0x03, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x03, 0x00, 0x03, 0x00, 0x76, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2129, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x68, 0x00, 0x44, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x51, 0x00, 0x11, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x12, 0x00, 0x11, 0x00, 0x11, 0x00, 0xA2, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xC8, 0x00, 0xD8, 0x00, 0xCC, 0x00, 0xC6, 0x00, 0xD2, 0x00, 0xCC, 0x00, 0xC0, 0x00, 0x71, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x60, 0x00, 0x63, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x212F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x22, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2130, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x22, 0x00, 0x20, 0x00, 0x18, 0x00, 0x20, 0x00, 0x46, 0x00, 0x41, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2131, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x8E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2132, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2133, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x15, 0x00, 0x15, 0x00, 0x11, 0x00, 0x21, 0x00, 0x21, 0x00, 0xA1, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2134, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x80, 0x25, 0x00, 0x23, 0x00, 0x42, 0x00, 0x42, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2135, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2136, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2137, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1E, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2138, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2139, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x213A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1D, 0x00, 0x22, 0x00, 0x45, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x213D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x51, 0x00, 0x52, 0x00, 0x52, 0x00, 0x2C, 0x00, 0x28, 0x00, 0x28, 0x00, 0x50, 0x00, 0xA0, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x213E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x213F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2140, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x50, 0x00, 0x28, 0x00, 0x14, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x28, 0x00, 0x50, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2141, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x71, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2142, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2143, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2144, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2145, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x52, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xA2, 0x00, 0xA2, 0x00, 0xA2, 0x00, 0xA4, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2146, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x3A, 0x80, 0x55, 0x00, 0xA5, 0x00, 0xA5, 0x00, 0xA5, 0x00, 0xAD, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2147, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x52, 0x80, 0x52, 0x80, 0xFF, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2148, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2149, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x0A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x3C, 0x00, 0x00, 0x00, }}, +{ 0x214A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4E, 0x00, 0x48, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x214B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x29, 0x00, 0x11, 0x00, 0x29, 0x00, 0x46, 0x00, 0x06, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2153, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x26, 0x00, 0x71, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2154, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x26, 0x00, 0x71, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2155, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x27, 0x00, 0x74, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2156, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x27, 0x00, 0x74, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2157, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x10, 0x00, 0x60, 0x00, 0x10, 0x00, 0x17, 0x00, 0x64, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2158, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x50, 0x00, 0x70, 0x00, 0x17, 0x00, 0x14, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2159, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x23, 0x00, 0x74, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x40, 0x00, 0x70, 0x00, 0x10, 0x00, 0x13, 0x00, 0x64, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x22, 0x00, 0x75, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x10, 0x00, 0x60, 0x00, 0x10, 0x00, 0x12, 0x00, 0x65, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x40, 0x00, 0x70, 0x00, 0x10, 0x00, 0x12, 0x00, 0x65, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x22, 0x00, 0x25, 0x00, 0x02, 0x00, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x215F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2160, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2161, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2162, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2163, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x44, 0x00, 0x44, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2164, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2165, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x8A, 0x00, 0x8A, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x22, 0x00, 0x22, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2166, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x80, 0x8D, 0x00, 0x8D, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x25, 0x00, 0x25, 0x00, 0x2F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2167, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x4A, 0x80, 0x4A, 0x80, 0x4A, 0x80, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2168, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x29, 0x00, 0x29, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2169, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x21, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x216F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2170, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2171, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2172, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2173, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x69, 0x00, 0x29, 0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x26, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2174, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2175, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x32, 0x00, 0x32, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2176, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xBE, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2177, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x80, 0x00, 0x00, 0xBF, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x4A, 0x80, 0x4A, 0x80, 0x5F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2178, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x69, 0x00, 0x29, 0x00, 0x26, 0x00, 0x26, 0x00, 0x26, 0x00, 0x29, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2179, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x217A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x4A, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x4A, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x217B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x9F, 0x00, 0x95, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x95, 0x00, 0x9F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x217C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x217D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x217E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x217F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2180, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2181, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x00, 0x39, 0x00, 0x22, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2182, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x9C, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x9C, 0x80, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2183, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2190, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2191, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2192, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2193, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2194, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2195, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2196, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2197, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2198, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x09, 0x00, 0x05, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2199, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x48, 0x00, 0x50, 0x00, 0x60, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x22, 0x00, 0x42, 0x00, 0xFF, 0x00, 0x44, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x24, 0x00, 0x22, 0x00, 0xFF, 0x00, 0x42, 0x00, 0x44, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x42, 0x00, 0xF5, 0x00, 0x48, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x42, 0x00, 0xAF, 0x00, 0x12, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x24, 0x00, 0x48, 0x00, 0xFF, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x219F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0xFF, 0x00, 0x12, 0x00, 0x24, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0x22, 0x00, 0x7C, 0x00, 0x22, 0x00, 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x44, 0x00, 0x22, 0x00, 0x1F, 0x00, 0x22, 0x00, 0x44, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x00, 0x21, 0x00, 0x7F, 0x00, 0x21, 0x00, 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x44, 0x00, 0x42, 0x00, 0x7F, 0x00, 0x42, 0x00, 0x44, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x22, 0x00, 0x41, 0x00, 0xFE, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x44, 0x00, 0x82, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x22, 0x00, 0x45, 0x00, 0xFE, 0x00, 0x44, 0x00, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x44, 0x00, 0xA2, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x24, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x49, 0x00, 0xF7, 0x80, 0x41, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x49, 0x00, 0xFF, 0x80, 0x49, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x12, 0x00, 0x2E, 0x00, 0x32, 0x00, 0x04, 0x00, 0x04, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7E, 0x00, 0x22, 0x00, 0x12, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x42, 0x00, 0x44, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x12, 0x00, 0x22, 0x00, 0x7E, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x44, 0x00, 0x42, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x11, 0x00, 0x21, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x20, 0x80, 0x20, 0x80, 0xA8, 0x80, 0x70, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x8A, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x38, 0x00, 0x30, 0x00, 0x28, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x50, 0x00, 0x7F, 0x00, 0x50, 0x00, 0x49, 0x00, 0x05, 0x00, 0x7F, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x47, 0x00, 0x8A, 0x80, 0x82, 0x00, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x71, 0x00, 0xA8, 0x80, 0x20, 0x80, 0x20, 0x80, 0x11, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x14, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x72, 0x00, 0xAA, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x2A, 0x80, 0x27, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x14, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x77, 0x00, 0xAA, 0x80, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xAA, 0x80, 0x77, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x21, 0x00, 0x7F, 0x80, 0x82, 0x00, 0x7F, 0x80, 0x24, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x88, 0x80, 0x7F, 0x00, 0x22, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0xFF, 0x00, 0x20, 0x80, 0xFF, 0x00, 0x42, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x80, 0x80, 0x00, 0x7F, 0x80, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x36, 0x00, 0x55, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x55, 0x00, 0x36, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x7F, 0x00, 0x22, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x36, 0x00, 0x55, 0x00, 0x14, 0x00, 0x14, 0x00, 0x55, 0x00, 0x36, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x48, 0x00, 0x44, 0x00, 0x62, 0x00, 0x51, 0x00, 0x48, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x09, 0x00, 0x11, 0x00, 0x23, 0x00, 0x45, 0x00, 0x09, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x09, 0x00, 0x45, 0x00, 0x23, 0x00, 0x11, 0x00, 0x09, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x48, 0x00, 0x51, 0x00, 0x62, 0x00, 0x44, 0x00, 0x48, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x3F, 0x80, 0x40, 0x00, 0xFF, 0x80, 0x40, 0x00, 0x3F, 0x80, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x01, 0x00, 0xFF, 0x80, 0x01, 0x00, 0xFE, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x48, 0x00, 0xF5, 0x00, 0x42, 0x00, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x12, 0x00, 0xAF, 0x00, 0x42, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x5B, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x6D, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x50, 0x00, 0x7F, 0x00, 0x50, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x7F, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x5F, 0x80, 0x80, 0x80, 0x5F, 0x80, 0x30, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0xFD, 0x00, 0x80, 0x80, 0xFD, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x77, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x36, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x36, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x77, 0x00, 0x22, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x77, 0x00, 0x22, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x36, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x86, 0x00, 0xFD, 0x00, 0x80, 0x80, 0xFD, 0x00, 0x86, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x40, 0x00, 0x5C, 0x00, 0x58, 0x00, 0x54, 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x21, 0x00, 0x15, 0x00, 0x0D, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x77, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x77, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x32, 0x00, 0x49, 0x00, 0xFF, 0x80, 0x49, 0x00, 0x32, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x27, 0x00, 0x2A, 0x80, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xAA, 0x00, 0x72, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x44, 0x00, 0xFF, 0x00, 0x44, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x22, 0x00, 0xFF, 0x00, 0x22, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x49, 0x00, 0xFF, 0x80, 0x49, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x4A, 0x00, 0xFF, 0x00, 0x4A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x52, 0x00, 0xFF, 0x00, 0x52, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x94, 0x80, 0xFF, 0x80, 0x94, 0x80, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x4F, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x79, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x21FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x66, 0x00, 0xBD, 0x00, 0x66, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2200, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2201, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2202, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x26, 0x00, 0x42, 0x00, 0x42, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2203, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2204, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x1F, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2205, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x22, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x49, 0x00, 0x51, 0x00, 0x51, 0x00, 0x22, 0x00, 0x5C, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2206, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2207, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2208, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2209, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x24, 0x00, 0x44, 0x00, 0x7F, 0x00, 0x48, 0x00, 0x28, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x7F, 0x00, 0x11, 0x00, 0x12, 0x00, 0x7C, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x220F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2210, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2211, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2212, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2213, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2214, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2215, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2216, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2217, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x7F, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2218, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2219, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x48, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x09, 0x00, 0x31, 0x00, 0x0A, 0x00, 0x32, 0x00, 0x04, 0x00, 0x04, 0x00, 0x48, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x19, 0x00, 0x29, 0x00, 0x3A, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x48, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x94, 0x80, 0x88, 0x80, 0x94, 0x80, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x221F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2220, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2221, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x24, 0x00, 0x18, 0x00, 0x18, 0x00, 0x24, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2222, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x14, 0x00, 0x08, 0x00, 0x18, 0x00, 0x24, 0x00, 0x44, 0x00, 0x24, 0x00, 0x18, 0x00, 0x08, 0x00, 0x14, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2223, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2224, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2225, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2226, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x74, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2227, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2228, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2229, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x80, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x222F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x7E, 0x00, 0xA5, 0x00, 0xA5, 0x00, 0x7E, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2230, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0xAA, 0x80, 0xAA, 0x80, 0x7F, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2231, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7D, 0x00, 0x93, 0x00, 0x17, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2232, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x1F, 0x00, 0x24, 0x80, 0x74, 0x80, 0xAC, 0x80, 0x24, 0x80, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2233, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x92, 0x00, 0x97, 0x00, 0x9A, 0x80, 0x92, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2234, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2235, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2236, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2237, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2238, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2239, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x49, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x49, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x223F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x50, 0x00, 0x88, 0x00, 0x88, 0x00, 0x08, 0x80, 0x08, 0x80, 0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2240, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2241, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x34, 0x00, 0x49, 0x00, 0x16, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2242, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2243, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2244, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x34, 0x00, 0x4D, 0x00, 0x06, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2245, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2246, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2247, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x32, 0x00, 0x4D, 0x00, 0x06, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2248, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2249, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x34, 0x00, 0x49, 0x00, 0x0E, 0x00, 0x38, 0x00, 0x49, 0x00, 0x16, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x49, 0x00, 0x31, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x77, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x224F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2250, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2251, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2252, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2253, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2254, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2255, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2256, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2257, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2258, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2259, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x225A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x225B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x225C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x225D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x12, 0x00, 0x3F, 0x00, 0x5A, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x225E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x225F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2260, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2261, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2262, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2263, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2264, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2265, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2266, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2267, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2268, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2269, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x24, 0x00, 0x12, 0x00, 0x09, 0x00, 0x12, 0x00, 0x24, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x6B, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x6B, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x13, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x226F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x64, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x70, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2270, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2271, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2272, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2273, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2274, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x49, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2275, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x38, 0x00, 0x49, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2276, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x63, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2277, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x63, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2278, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x6B, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2279, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x1C, 0x00, 0x6B, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x227A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x227B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x227C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x71, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x227D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x47, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x227E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x227F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x40, 0x00, 0x06, 0x00, 0x49, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2280, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x1E, 0x00, 0x74, 0x00, 0x1E, 0x00, 0x09, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2281, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x48, 0x00, 0x3C, 0x00, 0x17, 0x00, 0x3C, 0x00, 0x50, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2282, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2283, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2284, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2285, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2286, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2287, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2288, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x3F, 0x00, 0x10, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2289, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7E, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x228A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x228B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x228C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x51, 0x00, 0x7F, 0x00, 0x51, 0x00, 0x49, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x228D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x228E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x228F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2290, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2291, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2292, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2293, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2294, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2295, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2296, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2297, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2298, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2299, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x229A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x229B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x6B, 0x00, 0x5D, 0x00, 0x6B, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x229C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x5D, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x229D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x229E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x229F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x5F, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x57, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x5F, 0x00, 0x50, 0x00, 0x5F, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48, 0x00, 0x7F, 0x00, 0x48, 0x00, 0x50, 0x00, 0x50, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x44, 0x00, 0x44, 0x00, 0x7F, 0x00, 0x48, 0x00, 0x7F, 0x00, 0x50, 0x00, 0x50, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x54, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x58, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x5F, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x78, 0x00, 0x06, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x30, 0x00, 0x0F, 0x00, 0x30, 0x00, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x19, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, 0x00, 0x4C, 0x00, 0x43, 0x00, 0x4C, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x19, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, 0x00, 0x4C, 0x00, 0x43, 0x00, 0x4C, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x5F, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x7D, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7D, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0x11, 0x00, 0x21, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x22, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x22, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x63, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x62, 0x00, 0x54, 0x00, 0x48, 0x00, 0x54, 0x00, 0x62, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x23, 0x00, 0x15, 0x00, 0x09, 0x00, 0x15, 0x00, 0x23, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x49, 0x00, 0x30, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x40, 0x00, 0x4F, 0x00, 0x50, 0x00, 0x4F, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x01, 0x00, 0x79, 0x00, 0x05, 0x00, 0x79, 0x00, 0x01, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x22, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x22, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x80, 0x49, 0x00, 0x92, 0x00, 0x49, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0x49, 0x00, 0x24, 0x80, 0x49, 0x00, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x63, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x63, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x71, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x47, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x11, 0x00, 0x1E, 0x00, 0x70, 0x00, 0x1E, 0x00, 0x71, 0x00, 0x1E, 0x00, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x07, 0x00, 0x3C, 0x00, 0x47, 0x00, 0x3C, 0x00, 0x44, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x0B, 0x00, 0x38, 0x00, 0x49, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x1C, 0x00, 0x68, 0x00, 0x38, 0x00, 0x49, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x05, 0x00, 0x34, 0x00, 0x49, 0x00, 0x16, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x00, 0x38, 0x00, 0x50, 0x00, 0x16, 0x00, 0x49, 0x00, 0x34, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x05, 0x00, 0x07, 0x00, 0x19, 0x00, 0x69, 0x00, 0x19, 0x00, 0x17, 0x00, 0x11, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x44, 0x00, 0x74, 0x00, 0x4C, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x70, 0x00, 0x50, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x19, 0x00, 0x69, 0x00, 0x19, 0x00, 0x0F, 0x00, 0x09, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x48, 0x00, 0x78, 0x00, 0x4C, 0x00, 0x4B, 0x00, 0x4C, 0x00, 0x78, 0x00, 0x48, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x20, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x22FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2300, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x22, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x22, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2301, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x4C, 0x00, 0x2A, 0x00, 0x19, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2302, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2303, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2304, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x36, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2305, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2306, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2307, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2308, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2309, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x230F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2310, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2311, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2312, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2313, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2314, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2315, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x51, 0x00, 0x22, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2316, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0xFF, 0x80, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2317, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0xFF, 0x80, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xFF, 0x80, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2318, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x94, 0x80, 0x94, 0x80, 0x7F, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x94, 0x80, 0x94, 0x80, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2319, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x231A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x88, 0x80, 0x88, 0x80, 0xB8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x231B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x55, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x231C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x231D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x231E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x231F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2320, { 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2321, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, }}, +{ 0x2322, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2323, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2324, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x80, 0x1C, 0x00, 0x36, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2325, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x00, 0x10, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2326, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xC6, 0x00, 0xA9, 0x00, 0x90, 0x80, 0xA9, 0x00, 0xC6, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2327, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x88, 0x80, 0x94, 0x80, 0xA2, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2328, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x80, 0x80, 0xAA, 0x80, 0x80, 0x80, 0xAA, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x232B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x31, 0x80, 0x4A, 0x80, 0x84, 0x80, 0x4A, 0x80, 0x31, 0x80, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x232C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x26, 0x00, 0x63, 0x00, 0x61, 0x00, 0x61, 0x00, 0x23, 0x00, 0x16, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x232D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x24, 0x80, 0x43, 0x00, 0xC2, 0x00, 0x24, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x232E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x21, 0x00, 0x3F, 0x80, 0x52, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x232F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2330, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x19, 0x80, 0x11, 0x00, 0x11, 0x00, 0x22, 0x00, 0x22, 0x00, 0x44, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2331, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x54, 0x00, 0x93, 0x00, 0x9F, 0x80, 0x93, 0x00, 0x54, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2332, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xB0, 0x00, 0x8C, 0x00, 0xFF, 0x00, 0x8C, 0x00, 0xB0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2333, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xB0, 0x00, 0x8E, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2334, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2335, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2336, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2337, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2338, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2339, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x49, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x233A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x233B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x233C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x5D, 0x00, 0x63, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x233D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x233E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x233F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2340, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2341, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x43, 0x00, 0x43, 0x00, 0x45, 0x00, 0x45, 0x00, 0x49, 0x00, 0x51, 0x00, 0x51, 0x00, 0x61, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2342, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x61, 0x00, 0x61, 0x00, 0x51, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x45, 0x00, 0x43, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2343, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x47, 0x00, 0x59, 0x00, 0x61, 0x00, 0x59, 0x00, 0x47, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2344, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x71, 0x00, 0x4D, 0x00, 0x43, 0x00, 0x4D, 0x00, 0x71, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2345, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x7F, 0x00, 0x28, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2346, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x7F, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2347, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x51, 0x00, 0x7F, 0x00, 0x51, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2348, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x45, 0x00, 0x7F, 0x00, 0x45, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2349, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x22, 0x00, 0x51, 0x00, 0x49, 0x00, 0x45, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x234A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x234B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x234C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x234D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x234E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x234F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2350, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x6B, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2351, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2352, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2353, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2354, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2355, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2356, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2357, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x6B, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2358, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2359, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x235A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x235B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x235C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x235D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x5D, 0x00, 0x63, 0x00, 0x63, 0x00, 0x63, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x235E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x235F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0xBE, 0x80, 0x9C, 0x80, 0x9C, 0x80, 0x63, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2360, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2361, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2362, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2363, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2364, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2365, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2366, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2367, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1F, 0x00, 0x28, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x28, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2368, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x30, 0x00, 0x49, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2369, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x236A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x236B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x39, 0x00, 0x6E, 0x00, 0x12, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x236C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x236D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x39, 0x00, 0x4E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x236E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x3F, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x236F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x45, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x51, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2370, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x49, 0x00, 0x55, 0x00, 0x45, 0x00, 0x49, 0x00, 0x41, 0x00, 0x49, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2371, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x3B, 0x00, 0x5E, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2372, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x3B, 0x00, 0x6E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2373, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2374, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0x5E, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, }}, +{ 0x2375, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2376, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2377, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2378, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2379, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x36, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x237A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x43, 0x00, 0x41, 0x00, 0x41, 0x00, 0x43, 0x00, 0x45, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x237B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x237C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0xA0, 0x00, 0x60, 0x00, 0x30, 0x00, 0x28, 0x00, 0xBF, 0x00, 0xA0, 0x00, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x237D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x237E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x237F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2380, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1E, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2381, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x78, 0x00, 0x88, 0x00, 0x88, 0x00, 0x7A, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2382, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x10, 0x80, 0x10, 0x80, 0x73, 0x80, 0x94, 0x80, 0x94, 0x80, 0x73, 0x80, 0x00, 0x00, 0xF7, 0x80, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2383, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x80, 0x45, 0x00, 0x0C, 0x00, 0xD5, 0x80, 0x14, 0x00, 0x55, 0x00, 0x8C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2384, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x4E, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x4E, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2385, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2386, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, 0x12, 0x00, 0x79, 0x00, 0x44, 0x80, 0x79, 0x00, 0x12, 0x00, 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2387, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x0D, 0x00, 0x16, 0x00, 0x14, 0x00, 0x10, 0x00, 0x10, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2388, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2389, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xE3, 0x80, 0x94, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x238A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xFF, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x238B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x00, 0xC1, 0x00, 0xA0, 0x80, 0x10, 0x80, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x238C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x62, 0x00, 0x71, 0x00, 0x01, 0x00, 0x63, 0x00, 0x94, 0x80, 0x94, 0x80, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x238D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x238E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x238F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2390, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2391, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2392, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2393, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2394, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x81, 0x00, 0x42, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2395, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2396, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x38, 0x00, 0x30, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2397, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x5F, 0x80, 0x10, 0x80, 0x54, 0x80, 0x08, 0x80, 0x5E, 0x80, 0x08, 0x80, 0x54, 0x80, 0x10, 0x80, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2398, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x44, 0x00, 0x55, 0x00, 0x40, 0x00, 0x49, 0x00, 0x44, 0x00, 0x5E, 0x00, 0x44, 0x00, 0x69, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2399, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1A, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x63, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0xBE, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x239A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x81, 0x00, 0xA5, 0x00, 0x89, 0x00, 0x91, 0x00, 0xA5, 0x00, 0x81, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x239B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, }}, +{ 0x239C, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, }}, +{ 0x239D, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x239E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, }}, +{ 0x239F, { 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, }}, +{ 0x23A0, { 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, }}, +{ 0x23A2, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, }}, +{ 0x23A3, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, }}, +{ 0x23A5, { 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, }}, +{ 0x23A6, { 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x23A8, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x30, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x23A9, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23AA, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x23AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x23AC, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x23AD, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23AE, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x23AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23B0, { 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x30, 0x00, }}, +{ 0x23B1, { 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, }}, +{ 0x23B2, { 0x00, 0x00, 0xFF, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, }}, +{ 0x23B3, { 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x00, 0x00, }}, +{ 0x23B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23B7, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xC8, 0x00, 0x28, 0x00, 0x28, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23B8, { 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, }}, +{ 0x23B9, { 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, }}, +{ 0x23BA, { 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, }}, +{ 0x23BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x59, 0x00, 0x4D, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x6B, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x23CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x15, 0x00, 0x35, 0x00, 0x5D, 0x00, 0x81, 0x00, 0x5E, 0x00, 0x30, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2400, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xB4, 0x00, 0xB4, 0x00, 0x16, 0x00, 0x16, 0x00, 0x0A, 0x00, 0x02, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2401, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x40, 0x00, 0x28, 0x00, 0xD4, 0x00, 0x14, 0x00, 0x16, 0x80, 0x0A, 0x80, 0x03, 0x80, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2402, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x40, 0x00, 0x3C, 0x00, 0xC8, 0x00, 0x08, 0x00, 0x0A, 0x80, 0x0A, 0x80, 0x01, 0x00, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2403, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x9C, 0x00, 0xE8, 0x00, 0x08, 0x00, 0x0A, 0x80, 0x0A, 0x80, 0x01, 0x00, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2404, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x88, 0x00, 0xF4, 0x00, 0x14, 0x00, 0x17, 0x80, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2405, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x98, 0x00, 0xF4, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x80, 0x02, 0x80, 0x02, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2406, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xA0, 0x00, 0xE0, 0x00, 0xAC, 0x00, 0xB0, 0x00, 0x10, 0x00, 0x12, 0x80, 0x0E, 0x80, 0x03, 0x00, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2407, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xC0, 0x00, 0xBC, 0x00, 0xD0, 0x00, 0x18, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2408, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x48, 0x00, 0x70, 0x00, 0x48, 0x00, 0x70, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2409, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x70, 0x00, 0x40, 0x00, 0x4F, 0x00, 0x48, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x38, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x70, 0x00, 0x06, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x240F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x70, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2410, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xB0, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x13, 0x80, 0x1E, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2411, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xAC, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x10, 0x80, 0x0D, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2412, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xAC, 0x00, 0xD0, 0x00, 0x11, 0x00, 0x12, 0x80, 0x0C, 0x80, 0x01, 0x00, 0x02, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2413, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xAC, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x13, 0x00, 0x0C, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2414, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xAC, 0x00, 0xD0, 0x00, 0x10, 0x00, 0x12, 0x80, 0x0E, 0x80, 0x03, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2415, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB4, 0x00, 0x1C, 0x00, 0x16, 0x80, 0x16, 0x80, 0x03, 0x00, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2416, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x40, 0x00, 0x34, 0x00, 0xD4, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0A, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2417, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x9C, 0x00, 0xE8, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0A, 0x80, 0x03, 0x00, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2418, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x88, 0x00, 0x74, 0x00, 0x1C, 0x00, 0x17, 0x00, 0x16, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2419, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x70, 0x00, 0x40, 0x00, 0x78, 0x00, 0x00, 0x00, 0x11, 0x00, 0x1B, 0x00, 0x15, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x241A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x40, 0x00, 0x34, 0x00, 0xD4, 0x00, 0x14, 0x00, 0x17, 0x00, 0x0A, 0x80, 0x03, 0x00, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x241B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x08, 0x00, 0x05, 0x80, 0x1A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x241C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x40, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x47, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x241D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x40, 0x00, 0x58, 0x00, 0x48, 0x00, 0x30, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x241E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x70, 0x00, 0x48, 0x00, 0x48, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x241F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2420, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x09, 0x00, 0x09, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2421, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xBC, 0x00, 0xD0, 0x00, 0x18, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2422, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x30, 0x00, 0x20, 0x00, 0x6E, 0x00, 0xB1, 0x00, 0x21, 0x00, 0x21, 0x00, 0x31, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2423, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2424, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x64, 0x00, 0x54, 0x00, 0x4C, 0x00, 0x44, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2425, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x08, 0x00, 0x08, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2426, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2440, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x49, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2441, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2442, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2443, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2444, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2445, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x63, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2446, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x67, 0x00, 0x67, 0x00, 0x60, 0x00, 0x60, 0x00, 0x67, 0x00, 0x67, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2447, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x6B, 0x00, 0x68, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2448, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0x80, 0x57, 0x80, 0x57, 0x80, 0x57, 0x80, 0x57, 0x80, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2449, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x244A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x24, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2460, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x88, 0x80, 0x98, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2461, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0x82, 0x80, 0x84, 0x80, 0x88, 0x80, 0x90, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2462, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0x82, 0x80, 0x8C, 0x80, 0x82, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2463, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x88, 0x80, 0x98, 0x80, 0xA8, 0x80, 0xBC, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2464, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBE, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0x82, 0x80, 0x82, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2465, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2466, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBE, 0x80, 0x82, 0x80, 0x84, 0x80, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2467, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2468, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x82, 0x80, 0x82, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2469, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xAC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA4, 0x80, 0xA8, 0x80, 0xA8, 0x80, 0xAE, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xAC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA4, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA8, 0x80, 0xA8, 0x80, 0xAA, 0x80, 0xAE, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xAE, 0x80, 0xA8, 0x80, 0xA8, 0x80, 0xAC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x246F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA6, 0x80, 0xA8, 0x80, 0xA8, 0x80, 0xAC, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2470, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xAE, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2471, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2472, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA6, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2473, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA4, 0x80, 0x9A, 0x80, 0x9A, 0x80, 0x9A, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xB4, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2474, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x88, 0x80, 0x98, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2475, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0x82, 0x80, 0x84, 0x80, 0x88, 0x80, 0x90, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2476, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0x82, 0x80, 0x8C, 0x80, 0x82, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2477, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x88, 0x80, 0x98, 0x80, 0xA8, 0x80, 0xBC, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2478, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xBE, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0x82, 0x80, 0x82, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2479, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xBE, 0x80, 0x82, 0x80, 0x84, 0x80, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x82, 0x80, 0x82, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x247F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xAC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA4, 0x80, 0xA8, 0x80, 0xA8, 0x80, 0xAE, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2480, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xAC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA4, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAC, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2481, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA8, 0x80, 0xA8, 0x80, 0xAA, 0x80, 0xAE, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2482, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xAE, 0x80, 0xA8, 0x80, 0xA8, 0x80, 0xAC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAC, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2483, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA6, 0x80, 0xA8, 0x80, 0xA8, 0x80, 0xAC, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2484, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xAE, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2485, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2486, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA6, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAC, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2487, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA4, 0x80, 0x9A, 0x80, 0x9A, 0x80, 0x9A, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xB4, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2488, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x13, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2489, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x43, 0x00, 0xFB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x8B, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0x3C, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF0, 0x00, 0x08, 0x00, 0x0B, 0x00, 0xF3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x8B, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x248F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x88, 0x00, 0x8B, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2490, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2491, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xAB, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2492, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2493, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x90, 0x00, 0xA0, 0x00, 0xA3, 0x00, 0xBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2494, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x90, 0x00, 0x88, 0x00, 0x8B, 0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2495, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xA8, 0x00, 0xB8, 0x00, 0x88, 0x00, 0x8B, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2496, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xB0, 0x00, 0x88, 0x00, 0x8B, 0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2497, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0xB0, 0x00, 0xA8, 0x00, 0xAB, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2498, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2499, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x90, 0x00, 0xA8, 0x00, 0xAB, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x98, 0x00, 0x88, 0x00, 0x8B, 0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x68, 0x00, 0x68, 0x00, 0x68, 0x00, 0xA8, 0x00, 0xAB, 0x00, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x9C, 0x80, 0x82, 0x80, 0x9E, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9E, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x249F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x82, 0x80, 0x82, 0x80, 0x9E, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0xBE, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x98, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0x9C, 0x80, 0x45, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x88, 0x80, 0x80, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x88, 0x80, 0x80, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0xA8, 0x80, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x90, 0x80, 0x90, 0x80, 0x92, 0x80, 0x94, 0x80, 0x98, 0x80, 0x94, 0x80, 0x92, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xB4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x98, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x88, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x98, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x98, 0x80, 0x51, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x8C, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x8C, 0x80, 0x45, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x96, 0x80, 0x98, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9E, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x82, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x90, 0x80, 0x90, 0x80, 0xB8, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x8C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAA, 0x80, 0x94, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x88, 0x80, 0x94, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x43, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xBE, 0x80, 0x84, 0x80, 0x88, 0x80, 0x90, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x88, 0x80, 0x88, 0x80, 0x94, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBC, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBE, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBE, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA0, 0x80, 0xA6, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0xBE, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9E, 0x80, 0x82, 0x80, 0x82, 0x80, 0x82, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA4, 0x80, 0xA8, 0x80, 0xB0, 0x80, 0xA8, 0x80, 0xA4, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0xB6, 0x80, 0xAA, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0xB2, 0x80, 0xAA, 0x80, 0xA6, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAA, 0x80, 0xA6, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBC, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9E, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x82, 0x80, 0x82, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBE, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x94, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x94, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA2, 0x80, 0x94, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xBE, 0x80, 0x84, 0x80, 0x88, 0x80, 0x90, 0x80, 0xA0, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x9C, 0x80, 0x82, 0x80, 0x9E, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9E, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0xA0, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x82, 0x80, 0x82, 0x80, 0x9E, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0xBE, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x98, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xBC, 0x80, 0x84, 0x80, 0x59, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0xA0, 0x80, 0xA0, 0x80, 0xBC, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x88, 0x80, 0x80, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x88, 0x80, 0x80, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0xA8, 0x80, 0x51, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x90, 0x80, 0x90, 0x80, 0x92, 0x80, 0x94, 0x80, 0x98, 0x80, 0x94, 0x80, 0x92, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xB4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x98, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x88, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x98, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x98, 0x80, 0x51, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x8C, 0x80, 0x94, 0x80, 0x94, 0x80, 0x94, 0x80, 0x8C, 0x80, 0x45, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x96, 0x80, 0x98, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9E, 0x80, 0xA0, 0x80, 0x9C, 0x80, 0x82, 0x80, 0xBC, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x90, 0x80, 0x90, 0x80, 0xB8, 0x80, 0x90, 0x80, 0x90, 0x80, 0x90, 0x80, 0x8C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0xA4, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x94, 0x80, 0x88, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x94, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x94, 0x80, 0x88, 0x80, 0x94, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9E, 0x80, 0x43, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0xBE, 0x80, 0x84, 0x80, 0x88, 0x80, 0x90, 0x80, 0xBE, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x24EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2500, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2501, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2502, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2503, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2504, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2505, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2506, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x2507, { 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x2508, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2509, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x250A, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x250B, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, }}, +{ 0x250C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x250D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x250E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x250F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2510, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2511, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2512, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2513, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2514, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2515, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2516, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2517, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2518, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2519, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251A, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251B, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x251C, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x251D, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x251E, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x251F, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2520, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2521, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2522, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2523, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2524, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2525, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2526, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2527, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2528, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2529, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, }}, +{ 0x252A, { 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x252B, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x252C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x252D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x252E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x252F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2530, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2531, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2532, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2533, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2534, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2535, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2536, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2537, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2538, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2539, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253A, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253B, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x253C, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x253D, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x253E, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x253F, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2540, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2541, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2542, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2543, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2544, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2545, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2546, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2547, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2548, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x2549, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x254A, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x254B, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x254C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254E, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x254F, { 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2550, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2551, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2552, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2553, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2554, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x10, 0x00, 0x17, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2555, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2556, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2557, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x04, 0x00, 0xF4, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2558, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2559, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255A, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x17, 0x80, 0x10, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255B, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255C, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255D, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xF4, 0x00, 0x04, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x255E, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x0F, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x255F, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x17, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2560, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x17, 0x80, 0x10, 0x00, 0x17, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2561, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2562, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xF4, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2563, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xF4, 0x00, 0x04, 0x00, 0xF4, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2564, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2565, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2566, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xF7, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x2567, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2568, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2569, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xF7, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x256A, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0x08, 0x00, 0xFF, 0x80, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x256B, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xFF, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x256C, { 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0xF7, 0x80, 0x00, 0x00, 0xF7, 0x80, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, }}, +{ 0x256D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x256E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x256F, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2570, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2571, { 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, }}, +{ 0x2572, { 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, }}, +{ 0x2573, { 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, }}, +{ 0x2574, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2575, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2576, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2577, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2578, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2579, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x257C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257D, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, }}, +{ 0x257E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x257F, { 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0x2580, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2581, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2582, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2583, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2584, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2585, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2586, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2587, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2588, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x2589, { 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, }}, +{ 0x258A, { 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, }}, +{ 0x258B, { 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x00, }}, +{ 0x258C, { 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, }}, +{ 0x258D, { 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, }}, +{ 0x258E, { 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, }}, +{ 0x258F, { 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, }}, +{ 0x2590, { 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, }}, +{ 0x2591, { 0x55, 0x00, 0x00, 0x00, 0xAA, 0x80, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0xAA, 0x80, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0xAA, 0x80, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0xAA, 0x80, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, }}, +{ 0x2592, { 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, 0xAA, 0x80, 0x55, 0x00, }}, +{ 0x2593, { 0xFF, 0x80, 0xAA, 0x80, 0xFF, 0x80, 0x55, 0x00, 0xFF, 0x80, 0xAA, 0x80, 0xFF, 0x80, 0x55, 0x00, 0xFF, 0x80, 0xAA, 0x80, 0xFF, 0x80, 0x55, 0x00, 0xFF, 0x80, 0xAA, 0x80, 0xFF, 0x80, 0x55, 0x00, 0xFF, 0x80, 0xAA, 0x80, }}, +{ 0x2594, { 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2595, { 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, }}, +{ 0x2596, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, }}, +{ 0x2597, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, }}, +{ 0x2598, { 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2599, { 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x259A, { 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, }}, +{ 0x259B, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, }}, +{ 0x259C, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, }}, +{ 0x259D, { 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x259E, { 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x00, }}, +{ 0x259F, { 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x25A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x5D, 0x00, 0x5D, 0x00, 0x5D, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x55, 0x00, 0x7F, 0x00, 0x55, 0x00, 0x7F, 0x00, 0x55, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x45, 0x00, 0x63, 0x00, 0x51, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x51, 0x00, 0x63, 0x00, 0x45, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x6B, 0x00, 0x45, 0x00, 0x6B, 0x00, 0x51, 0x00, 0x6B, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x7F, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x80, 0x40, 0x80, 0x80, 0x80, 0x81, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x80, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xF0, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFC, 0x00, 0xF0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0xB0, 0x00, 0x8C, 0x00, 0x83, 0x00, 0x80, 0x80, 0x83, 0x00, 0x8C, 0x00, 0xB0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, 0x00, 0x7C, 0x00, 0x7F, 0x00, 0x7C, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, 0x00, 0x4C, 0x00, 0x43, 0x00, 0x4C, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0xFC, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x9C, 0x00, 0x83, 0x80, 0x9C, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x80, 0x80, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x07, 0x80, 0x1F, 0x80, 0x7F, 0x80, 0xFF, 0x80, 0x7F, 0x80, 0x1F, 0x80, 0x07, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x80, 0x18, 0x80, 0x60, 0x80, 0x80, 0x80, 0x60, 0x80, 0x18, 0x80, 0x06, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7F, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x19, 0x00, 0x61, 0x00, 0x19, 0x00, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x1F, 0x80, 0xFF, 0x80, 0x1F, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x1C, 0x80, 0xE0, 0x80, 0x1C, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x80, 0x80, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x49, 0x00, 0x9C, 0x80, 0x49, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x22, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x22, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x36, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3A, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x3A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2E, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x2E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2E, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2E, 0x00, 0x4F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, 0x78, 0x00, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25D8, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xE3, 0x80, 0xC1, 0x80, 0xC1, 0x80, 0xC1, 0x80, 0xE3, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x25D9, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xE3, 0x80, 0xDD, 0x80, 0xBE, 0x80, 0xBE, 0x80, 0xBE, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x25DA, { 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xE3, 0x80, 0xDD, 0x80, 0xBE, 0x80, 0xBE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x80, 0xBE, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, }}, +{ 0x25DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x70, 0x00, 0x78, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0x7C, 0x00, 0x78, 0x00, 0x70, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x1F, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x79, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7D, 0x00, 0x79, 0x00, 0x71, 0x00, 0x61, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x43, 0x00, 0x47, 0x00, 0x4F, 0x00, 0x5F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x80, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x79, 0x00, 0x79, 0x00, 0xF8, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x8F, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x79, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x79, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x4F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x79, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x79, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x41, 0x00, 0x4F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x49, 0x00, 0x4F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x22, 0x00, 0x12, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x00, 0x50, 0x00, 0x48, 0x00, 0x44, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x25FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x12, 0x00, 0x22, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2600, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x41, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0xBE, 0x80, 0x3E, 0x00, 0x1C, 0x00, 0x41, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2601, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2602, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2603, { 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x9C, 0x00, 0x36, 0x80, 0x22, 0x00, 0xAA, 0x00, 0x15, 0x00, 0x22, 0x00, 0x49, 0x00, 0x41, 0x80, 0xC9, 0x00, 0x41, 0x00, 0x3E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2604, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x09, 0x00, 0x12, 0x00, 0x12, 0x00, 0x34, 0x80, 0x49, 0x00, 0x86, 0x00, 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2605, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0xFF, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x36, 0x00, 0x63, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2606, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xF7, 0x80, 0x41, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2607, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x08, 0x00, 0x05, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2608, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x42, 0x00, 0x44, 0x00, 0x48, 0x00, 0x50, 0x00, 0x48, 0x00, 0x45, 0x00, 0x43, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2609, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x49, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x55, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x38, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0xC1, 0x80, 0xDD, 0x80, 0x36, 0x00, 0x63, 0x00, 0x63, 0x00, 0xF7, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x260F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0xAA, 0x80, 0x55, 0x00, 0x49, 0x00, 0x80, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2610, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2611, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x43, 0x00, 0x43, 0x00, 0x45, 0x00, 0x45, 0x00, 0x69, 0x00, 0x69, 0x00, 0x51, 0x00, 0x51, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2612, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2613, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2616, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2617, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2619, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x12, 0x00, 0x3A, 0x00, 0x7C, 0x00, 0x74, 0x00, 0x7A, 0x00, 0x3A, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x3D, 0x00, 0x1D, 0x00, 0x1F, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xBC, 0x00, 0xB8, 0x00, 0xF8, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x21, 0x00, 0x11, 0x00, 0x13, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x1A, 0x00, 0x22, 0x00, 0x22, 0x00, 0x12, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x84, 0x00, 0x88, 0x00, 0xC8, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x261F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2620, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x55, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x49, 0x00, 0x63, 0x00, 0x55, 0x00, 0x08, 0x00, 0x55, 0x00, 0x63, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2621, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2622, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0xF7, 0x80, 0xF7, 0x80, 0xFF, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x5D, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2623, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x41, 0x00, 0xAA, 0x80, 0x14, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2624, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x88, 0x80, 0x7F, 0x00, 0x88, 0x80, 0x7F, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2625, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2626, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2627, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x1E, 0x00, 0x10, 0x00, 0xD6, 0x00, 0x38, 0x00, 0xD6, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2628, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2629, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x88, 0x80, 0xFF, 0x80, 0x88, 0x80, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x262A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x71, 0x00, 0x64, 0x00, 0x6E, 0x00, 0x64, 0x00, 0x6A, 0x00, 0x60, 0x00, 0x71, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x262B, { 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x80, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x9C, 0x80, 0x88, 0x80, 0x5D, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x262C, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5D, 0x00, 0x88, 0x80, 0x9C, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x9C, 0x80, 0xC9, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xEB, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x262D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x09, 0x00, 0x19, 0x00, 0x31, 0x00, 0x29, 0x00, 0x05, 0x00, 0x22, 0x00, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x262E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x88, 0x80, 0x88, 0x80, 0x9C, 0x80, 0xAA, 0x80, 0xC9, 0x80, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x262F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x80, 0x80, 0xF2, 0x80, 0xF8, 0x80, 0xDD, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2630, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2631, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2632, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2633, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2634, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2635, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2636, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2637, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2638, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5D, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0xFF, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2639, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x94, 0x80, 0x80, 0x80, 0x80, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x94, 0x80, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0xEB, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x36, 0x00, 0x22, 0x00, 0xC1, 0x80, 0x22, 0x00, 0x36, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x04, 0x80, 0x04, 0x80, 0x04, 0x80, 0x09, 0x00, 0x0A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x14, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x14, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x263F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x2640, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0x2641, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2642, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x01, 0x80, 0x02, 0x80, 0x1C, 0x80, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2643, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x92, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x12, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2644, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x22, 0x00, 0x24, 0x00, 0x24, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2645, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2646, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x49, 0x00, 0xEB, 0x80, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2647, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x42, 0x00, 0x7C, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2648, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x55, 0x00, 0x55, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2649, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x264A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x3E, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x264B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x48, 0x00, 0x30, 0x00, 0x06, 0x00, 0x09, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x264C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x31, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x32, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x264D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x54, 0x00, 0x54, 0x00, 0x56, 0x00, 0x55, 0x00, 0x55, 0x00, 0x56, 0x00, 0x04, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x264E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x77, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x264F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x54, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2650, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x05, 0x00, 0x29, 0x00, 0x11, 0x00, 0x28, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2651, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x88, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x80, 0x24, 0x80, 0x26, 0x80, 0x05, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2652, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x80, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x80, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2653, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2654, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x49, 0x00, 0x77, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2655, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x63, 0x00, 0x55, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2656, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x77, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2657, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2658, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3D, 0x00, 0x41, 0x00, 0x41, 0x00, 0x31, 0x00, 0x09, 0x00, 0x11, 0x00, 0x21, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2659, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x265A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x265B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x7F, 0x00, 0x55, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x265C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x265D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x265E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x00, 0x7B, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x265F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2660, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2661, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x49, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2662, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2663, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x5D, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x6B, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2664, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x36, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2665, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2666, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2667, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x77, 0x00, 0x94, 0x80, 0x80, 0x80, 0x9C, 0x80, 0x6B, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2668, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x25, 0x00, 0x15, 0x00, 0x25, 0x00, 0x29, 0x00, 0xAA, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2669, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0x09, 0x00, 0x09, 0x00, 0x08, 0x00, 0x08, 0x00, 0x38, 0x00, 0x78, 0x00, 0x78, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x39, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x21, 0x00, 0x27, 0x00, 0xE7, 0x00, 0xE2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x39, 0x00, 0x27, 0x00, 0x39, 0x00, 0x21, 0x00, 0x21, 0x00, 0x27, 0x00, 0xE7, 0x00, 0xE2, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x21, 0x00, 0x22, 0x00, 0x2C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x23, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x23, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x266F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x14, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x74, 0x00, 0x14, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x74, 0x00, 0x14, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2670, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2671, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x49, 0x00, 0x77, 0x00, 0x49, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2672, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x80, 0x03, 0x80, 0xF2, 0x80, 0x57, 0x80, 0x70, 0x00, 0x90, 0x80, 0x82, 0x80, 0x86, 0x80, 0x6B, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2673, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x88, 0x00, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2674, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x98, 0x00, 0x84, 0x80, 0x88, 0x80, 0x90, 0x80, 0x9C, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2675, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x98, 0x00, 0x84, 0x80, 0x88, 0x80, 0x84, 0x80, 0x98, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2676, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x88, 0x00, 0x90, 0x80, 0x94, 0x80, 0x9E, 0x80, 0x84, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2677, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x9C, 0x00, 0x90, 0x80, 0x98, 0x80, 0x84, 0x80, 0x98, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2678, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x8C, 0x00, 0x90, 0x80, 0x9C, 0x80, 0x92, 0x80, 0x8C, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2679, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x9C, 0x00, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x267A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xE2, 0x80, 0x61, 0x80, 0xA3, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x84, 0x80, 0x6F, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x267B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x80, 0x03, 0x80, 0xF3, 0x80, 0x77, 0x80, 0x70, 0x00, 0x90, 0x80, 0x82, 0x80, 0x86, 0x80, 0x6F, 0x00, 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x267C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x73, 0x00, 0xFD, 0x80, 0xCC, 0x80, 0xCC, 0x80, 0xBF, 0x80, 0xBE, 0x80, 0xBA, 0x80, 0xD1, 0x80, 0x7B, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x267D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x4D, 0x00, 0x82, 0x80, 0xB3, 0x80, 0xB3, 0x80, 0xC0, 0x80, 0xC1, 0x80, 0xC5, 0x80, 0xAE, 0x80, 0x45, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2680, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2681, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0xA0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x82, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2682, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0xA0, 0x80, 0x80, 0x80, 0x88, 0x80, 0x80, 0x80, 0x82, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2683, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2684, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0x88, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2685, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0xA2, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2686, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x45, 0x00, 0x45, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2687, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x55, 0x00, 0x55, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2688, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x79, 0x00, 0x79, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2689, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2701, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x19, 0x80, 0x66, 0x00, 0x9C, 0x00, 0x92, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2702, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x80, 0x6B, 0x00, 0x04, 0x00, 0x6B, 0x00, 0x90, 0x80, 0x90, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2703, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x92, 0x00, 0x9C, 0x00, 0x66, 0x00, 0x19, 0x80, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2704, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x92, 0x80, 0x95, 0x00, 0x6A, 0x00, 0x14, 0x00, 0x6A, 0x00, 0x95, 0x00, 0x92, 0x80, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2706, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x42, 0x00, 0x9D, 0x00, 0x9D, 0x00, 0xB1, 0x00, 0xB1, 0x00, 0xB9, 0x00, 0xB9, 0x00, 0xA2, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2707, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x41, 0x00, 0x9C, 0x80, 0x88, 0x80, 0x80, 0x80, 0xA2, 0x80, 0xB6, 0x80, 0x41, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2708, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x4C, 0x00, 0x7F, 0x00, 0x4C, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2709, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xC1, 0x80, 0xA2, 0x80, 0x9C, 0x80, 0xA2, 0x80, 0xC1, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2711, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x69, 0x00, 0x98, 0x80, 0x83, 0x80, 0x98, 0x80, 0x69, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2712, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6F, 0x00, 0xFF, 0x80, 0xFC, 0x00, 0xFF, 0x80, 0x6F, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2713, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x34, 0x00, 0x34, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2714, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0xEC, 0x00, 0xEC, 0x00, 0x78, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2715, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0xE3, 0x80, 0x77, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x77, 0x00, 0xE3, 0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2716, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x80, 0xE3, 0x80, 0xF7, 0x80, 0x7F, 0x00, 0x1C, 0x00, 0x7F, 0x00, 0xF7, 0x80, 0xF7, 0x80, 0xE3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2717, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x11, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2718, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x0E, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2719, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0xEB, 0x80, 0x88, 0x80, 0xBE, 0x80, 0x88, 0x80, 0xEB, 0x80, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x271A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x271B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x73, 0x80, 0x73, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x271C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xE3, 0x80, 0xE3, 0x80, 0xE3, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x271D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x271E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x16, 0x00, 0x77, 0x00, 0x41, 0x00, 0x77, 0x00, 0x37, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x271F, { 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x22, 0x00, 0xEB, 0x80, 0x88, 0x80, 0xBE, 0x80, 0x88, 0x80, 0xEB, 0x80, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2720, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x88, 0x80, 0xC9, 0x80, 0xF7, 0x80, 0xC9, 0x80, 0x88, 0x80, 0x1C, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2721, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0xFF, 0x80, 0xA2, 0x80, 0x41, 0x00, 0xA2, 0x80, 0xFF, 0x80, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2722, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x49, 0x00, 0xFF, 0x80, 0x49, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2723, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x6B, 0x00, 0xFF, 0x80, 0x6B, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2724, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x6B, 0x00, 0xFF, 0x80, 0x6B, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2725, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x6B, 0x00, 0xFF, 0x80, 0x6B, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2726, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2727, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x14, 0x00, 0x63, 0x00, 0x80, 0x80, 0x63, 0x00, 0x14, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2729, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xF7, 0x80, 0x41, 0x00, 0x22, 0x00, 0x49, 0x00, 0x55, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x272A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xF7, 0x80, 0xF7, 0x80, 0xE3, 0x80, 0x00, 0x00, 0x80, 0x80, 0xC1, 0x80, 0xC9, 0x80, 0x9C, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x272B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x1C, 0x00, 0xE3, 0x80, 0x63, 0x00, 0x22, 0x00, 0x3E, 0x00, 0x77, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x272C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xEB, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x272D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xEB, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x272E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xEB, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x272F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0xF7, 0x80, 0x49, 0x00, 0x36, 0x00, 0x2A, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2730, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2C, 0x00, 0xC7, 0x00, 0x2E, 0x00, 0x3C, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2731, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xDB, 0x00, 0xFF, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x7E, 0x00, 0xFF, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2732, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xDB, 0x00, 0xFF, 0x00, 0x66, 0x00, 0x24, 0x00, 0x66, 0x00, 0xFF, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2733, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0xFF, 0x80, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2734, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0x3E, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2735, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x36, 0x00, 0x3E, 0x00, 0xD5, 0x80, 0x3E, 0x00, 0x36, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2736, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x88, 0x80, 0x6B, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x6B, 0x00, 0x88, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2737, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x14, 0x00, 0x94, 0x80, 0x7F, 0x00, 0x1C, 0x00, 0x7F, 0x00, 0x94, 0x80, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2738, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x36, 0x00, 0xFF, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0x36, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2739, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0xDD, 0x80, 0x3E, 0x00, 0xFF, 0x80, 0x3E, 0x00, 0xDD, 0x80, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x273A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0xDD, 0x80, 0x2A, 0x00, 0xFF, 0x80, 0x2A, 0x00, 0xDD, 0x80, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x273B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x22, 0x00, 0x08, 0x00, 0x22, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x273C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x3E, 0x00, 0x14, 0x00, 0x3E, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x273D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x3E, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x273E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x14, 0x00, 0xC9, 0x80, 0xC9, 0x80, 0x3E, 0x00, 0x14, 0x00, 0x7F, 0x00, 0xAA, 0x80, 0xC9, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x273F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0xDB, 0x00, 0xFF, 0x00, 0x24, 0x00, 0x24, 0x00, 0x7E, 0x00, 0xE7, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2743, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xCB, 0x00, 0xBD, 0x00, 0x6E, 0x00, 0x18, 0x00, 0x76, 0x00, 0xBD, 0x00, 0xD3, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2744, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0xAA, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0xDD, 0x80, 0x6B, 0x00, 0xAA, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2745, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0xAA, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0xDD, 0x80, 0x6B, 0x00, 0xAA, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2746, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x5D, 0x00, 0xAA, 0x80, 0x6B, 0x00, 0xDD, 0x80, 0xDD, 0x80, 0x6B, 0x00, 0xAA, 0x80, 0x5D, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2747, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x14, 0x00, 0xEB, 0x80, 0x14, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2748, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x14, 0x00, 0xEB, 0x80, 0x14, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2749, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xDB, 0x00, 0xCB, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x3C, 0x00, 0xD3, 0x00, 0xDB, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x274A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x00, 0x00, 0xEB, 0x80, 0x00, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x274B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0xFF, 0x80, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x274D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x43, 0x00, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x81, 0x80, 0x43, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x274F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x82, 0x00, 0x83, 0x80, 0x83, 0x80, 0x83, 0x80, 0x83, 0x80, 0xFF, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2750, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0xFF, 0x80, 0x83, 0x80, 0x83, 0x80, 0x83, 0x80, 0x83, 0x80, 0x82, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2751, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2752, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xFF, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0x83, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2756, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x41, 0x00, 0xE3, 0x80, 0x41, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2758, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2759, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x275A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x275B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x275C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x275D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x80, 0x84, 0x00, 0xE7, 0x00, 0xF7, 0x80, 0xF7, 0x80, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x275E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0xF7, 0x80, 0xF7, 0x80, 0x73, 0x80, 0x10, 0x80, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2761, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3F, 0x00, 0x72, 0x00, 0x72, 0x00, 0x72, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x32, 0x00, 0x34, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2762, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2763, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2764, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0xF7, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2765, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x80, 0x7E, 0x00, 0xFC, 0x00, 0xF8, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2766, { 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x74, 0x80, 0x95, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x6B, 0x00, 0xF7, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2767, { 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x29, 0x00, 0x52, 0x00, 0x9C, 0x00, 0x20, 0x00, 0x58, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0xFE, 0x00, 0xFE, 0x80, 0xFF, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2776, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xF7, 0x80, 0xE7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2777, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE3, 0x80, 0xDD, 0x80, 0xFD, 0x80, 0xFB, 0x80, 0xF7, 0x80, 0xED, 0x80, 0xC1, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2778, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE3, 0x80, 0xDD, 0x80, 0xFD, 0x80, 0xF3, 0x80, 0xFD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2779, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xF3, 0x80, 0xEB, 0x80, 0xDB, 0x80, 0xC1, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x277A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xC1, 0x80, 0xDF, 0x80, 0xDF, 0x80, 0xC3, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xC3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x277B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE1, 0x80, 0xDF, 0x80, 0xDF, 0x80, 0xC3, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x277C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xC1, 0x80, 0xFD, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x277D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE3, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x277E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE1, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE1, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x277F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xDB, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xDB, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2780, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x88, 0x80, 0x98, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2781, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x98, 0x80, 0x84, 0x80, 0x84, 0x80, 0x88, 0x80, 0x9C, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2782, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x98, 0x80, 0x84, 0x80, 0x88, 0x80, 0x84, 0x80, 0x98, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2783, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x88, 0x80, 0x98, 0x80, 0xA8, 0x80, 0xBC, 0x80, 0x88, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2784, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x9C, 0x80, 0x90, 0x80, 0x98, 0x80, 0x84, 0x80, 0x98, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2785, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x8C, 0x80, 0x90, 0x80, 0x98, 0x80, 0x94, 0x80, 0x88, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2786, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x9C, 0x80, 0x84, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2787, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x88, 0x80, 0x94, 0x80, 0x88, 0x80, 0x94, 0x80, 0x88, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2788, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x88, 0x80, 0x94, 0x80, 0x8C, 0x80, 0x84, 0x80, 0x88, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2789, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x80, 0x80, 0xA4, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xA4, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x278A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xF7, 0x80, 0xE7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x278B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE3, 0x80, 0xDD, 0x80, 0xFD, 0x80, 0xFB, 0x80, 0xF7, 0x80, 0xEF, 0x80, 0xC1, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x278C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE3, 0x80, 0xDD, 0x80, 0xFD, 0x80, 0xF3, 0x80, 0xFD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x278D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xF3, 0x80, 0xEB, 0x80, 0xDB, 0x80, 0xC1, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x278E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xC1, 0x80, 0xDF, 0x80, 0xDF, 0x80, 0xC3, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xC3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x278F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE1, 0x80, 0xDF, 0x80, 0xDF, 0x80, 0xC3, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2790, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xC1, 0x80, 0xFD, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0xF7, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2791, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE3, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2792, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xE1, 0x80, 0xDD, 0x80, 0xDD, 0x80, 0xE1, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xE3, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2793, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0xDB, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xD5, 0x80, 0xDB, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2794, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2798, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x7D, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2799, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x73, 0x00, 0x7F, 0x80, 0x73, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x279A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x1F, 0x00, 0x7D, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x279B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x1C, 0x00, 0x1F, 0x00, 0xFF, 0x80, 0x1F, 0x00, 0x1C, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x279C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x279D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0xFF, 0x80, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x279E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x279F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xB7, 0x00, 0xB7, 0x80, 0xB7, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xAB, 0x00, 0xAB, 0x80, 0xAB, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x4E, 0x00, 0x21, 0x80, 0x1F, 0x80, 0x3E, 0x00, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x21, 0x80, 0x4E, 0x00, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x70, 0x00, 0x3E, 0x00, 0x1F, 0x80, 0x1F, 0x80, 0x3E, 0x00, 0x70, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x86, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0x7F, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x7F, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0x86, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFE, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x16, 0x00, 0xF3, 0x00, 0x81, 0x80, 0xF3, 0x00, 0x16, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x1A, 0x00, 0xF9, 0x00, 0xC0, 0x80, 0xF9, 0x00, 0x1A, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x3E, 0x80, 0x40, 0x80, 0x81, 0x80, 0xF3, 0x00, 0xEE, 0x00, 0x3C, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x3C, 0x00, 0xEE, 0x00, 0xF3, 0x00, 0x81, 0x80, 0x40, 0x80, 0x3E, 0x80, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x14, 0x00, 0xF2, 0x00, 0x81, 0x00, 0xF3, 0x00, 0x76, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x1C, 0x00, 0x76, 0x00, 0xF3, 0x00, 0x81, 0x00, 0xF2, 0x00, 0x14, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xFA, 0x00, 0x81, 0x00, 0x40, 0x80, 0x81, 0x80, 0xFB, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xFB, 0x00, 0x81, 0x80, 0x40, 0x80, 0x81, 0x00, 0xFA, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x7F, 0x00, 0xFB, 0x80, 0x01, 0x80, 0x00, 0x80, 0x01, 0x80, 0xFB, 0x80, 0x7F, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0x00, 0x2B, 0x00, 0x7F, 0x80, 0x2B, 0x00, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x5C, 0x00, 0xEC, 0x00, 0x74, 0x00, 0x3C, 0x00, 0x02, 0x80, 0x01, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x00, 0x7B, 0x00, 0x07, 0x80, 0x7B, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0x80, 0x02, 0x80, 0x3C, 0x00, 0x74, 0x00, 0xEC, 0x00, 0x5C, 0x00, 0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x1C, 0x00, 0xFC, 0x00, 0x7C, 0x00, 0x3C, 0x00, 0x02, 0x80, 0x01, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x00, 0x7B, 0x00, 0x7F, 0x80, 0x7B, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x01, 0x80, 0x02, 0x80, 0x3C, 0x00, 0x7C, 0x00, 0xFC, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x71, 0x00, 0xFF, 0x80, 0x71, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x73, 0x00, 0x79, 0x00, 0xFF, 0x80, 0x79, 0x00, 0x73, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0x00, 0x7B, 0x00, 0x3F, 0x80, 0x7B, 0x00, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x00, 0xF2, 0x00, 0x7B, 0x00, 0x3F, 0x80, 0x7B, 0x00, 0xF2, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x0A, 0x00, 0xFD, 0x00, 0x00, 0x80, 0xFD, 0x00, 0x0A, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x00, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x80, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x41, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x80, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0xC1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x48, 0x00, 0x48, 0x00, 0x24, 0x00, 0x24, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x12, 0x00, 0x12, 0x00, 0x09, 0x00, 0x09, 0x00, 0x12, 0x00, 0x12, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x14, 0x00, 0x36, 0x00, 0x55, 0x00, 0xD5, 0x80, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0xD5, 0x80, 0x55, 0x00, 0x36, 0x00, 0x14, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0xA9, 0x00, 0x71, 0x00, 0x21, 0x00, 0x01, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, 0x95, 0x00, 0x8E, 0x00, 0x84, 0x00, 0x80, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0xA9, 0x00, 0xFF, 0x80, 0xA9, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0xFF, 0x80, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0xFF, 0x80, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x41, 0x00, 0xFF, 0x80, 0x41, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x7F, 0x80, 0x80, 0x00, 0x7F, 0x80, 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x80, 0x80, 0x7F, 0x00, 0x22, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x80, 0x40, 0x80, 0xFF, 0x80, 0x40, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x81, 0x00, 0xFF, 0x80, 0x81, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x20, 0x80, 0x7F, 0x80, 0x80, 0x80, 0x7F, 0x80, 0x20, 0x80, 0x10, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x82, 0x00, 0xFF, 0x00, 0x80, 0x80, 0xFF, 0x00, 0x82, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x27FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x55, 0x80, 0xAA, 0x80, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2800, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2801, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2802, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2803, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2804, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2805, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2806, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2807, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2808, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2809, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x280F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2810, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2811, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2812, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2813, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2814, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2815, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2816, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2817, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2818, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2819, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x281F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2820, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2821, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2822, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2823, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2824, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2825, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2826, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2827, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2828, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2829, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x282A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x282B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x282C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x282D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x282E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x282F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2830, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2831, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2832, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2833, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2834, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2835, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2836, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2837, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2838, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2839, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x283A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x283B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x283C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x283D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x283E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x283F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2840, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2841, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2842, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2843, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2844, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2845, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2846, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2847, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2848, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2849, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x284A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x284B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x284C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x284D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x284E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x284F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2850, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2851, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2852, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2853, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2854, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2855, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2856, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2857, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2858, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2859, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x285A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x285B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x285C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x285D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x285E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x285F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2860, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2861, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2862, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2863, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2864, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2865, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2866, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2867, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2868, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2869, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x286A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x286B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x286C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x286D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x286E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x286F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2870, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2871, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2872, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2873, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2874, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2875, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2876, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2877, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2878, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2879, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x287A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x287B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x287C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x287D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x287E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x287F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2880, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2881, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2882, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2883, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2884, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2885, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2886, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2887, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2888, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2889, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x288A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x288B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x288C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x288D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x288E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x288F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2890, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2891, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2892, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2893, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2894, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2895, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2896, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2897, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2898, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2899, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x289A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x289B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x289C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x289D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x289E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x289F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28A9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28AA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28AB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28AC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28AD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28AE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28AF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28B9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28BA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28BB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28BC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28BD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28BE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28BF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28C9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28CA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28CB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28CC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28CD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28CE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28CF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28D9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28DA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28DB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28DC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28DD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28DE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28DF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28E9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28EA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28EB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28EC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28ED, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28EE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28EF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F0, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F1, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F2, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F3, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F4, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F5, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F6, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F7, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F8, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28F9, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28FA, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28FB, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28FC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28FD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28FE, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x28FF, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x88, 0x80, 0x9C, 0x80, 0x88, 0x80, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x49, 0x00, 0x49, 0x00, 0x88, 0x80, 0xFF, 0x80, 0x88, 0x80, 0x49, 0x00, 0x49, 0x00, 0x2A, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x22, 0x00, 0x63, 0x00, 0x55, 0x00, 0x94, 0x80, 0x88, 0x80, 0x94, 0x80, 0x55, 0x00, 0x63, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x5D, 0x00, 0x49, 0x00, 0x41, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x49, 0x00, 0x49, 0x00, 0x7F, 0x00, 0x49, 0x00, 0x49, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A07, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A08, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0x80, 0xA2, 0x80, 0xA2, 0x80, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x14, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A09, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x22, 0x00, 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x22, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x63, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x63, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x2A3F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0x303F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x63, 0x00, 0x55, 0x00, 0x55, 0x00, 0x49, 0x00, 0x49, 0x00, 0x55, 0x00, 0x55, 0x00, 0x63, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB00, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x7E, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB01, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB02, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x7E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB03, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x49, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0xFF, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB04, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0xFF, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB05, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x6F, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x80, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB06, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x28, 0x00, 0x6E, 0x00, 0x88, 0x00, 0x88, 0x00, 0x68, 0x00, 0x18, 0x00, 0x19, 0x00, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB13, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x50, 0x00, 0x30, 0x00, 0x5D, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB14, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x17, 0x00, 0x14, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB15, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x14, 0x00, 0x14, 0x00, 0x56, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x35, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0xFB16, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x3C, 0x00, 0x14, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x33, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x00, }}, +{ 0xFB17, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0xAC, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0xAA, 0x80, 0x69, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, }}, +{ 0xFB1D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB1E, { 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB1F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x66, 0x00, 0x33, 0x00, 0x11, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB20, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xE7, 0x00, 0x73, 0x00, 0x41, 0x00, 0x21, 0x00, 0x11, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB21, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB22, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB23, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB24, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB25, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB26, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x81, 0x00, 0x81, 0x00, 0x81, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB27, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB28, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x21, 0x00, 0x41, 0x00, 0x41, 0x00, 0x61, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB29, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB2A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x92, 0x00, 0xDB, 0x00, 0x49, 0x00, 0x89, 0x00, 0x91, 0x00, 0xA2, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB2B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x92, 0x00, 0xDB, 0x00, 0x49, 0x00, 0x89, 0x00, 0x91, 0x00, 0xA2, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB2C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x92, 0x00, 0xDB, 0x00, 0x49, 0x00, 0x89, 0x00, 0x95, 0x00, 0xA2, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB2D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x92, 0x00, 0xDB, 0x00, 0x49, 0x00, 0x89, 0x00, 0x95, 0x00, 0xA2, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB2E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB2F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x08, 0x00, }}, +{ 0xFB30, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB31, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB32, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x1E, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB33, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x1A, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB34, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x5A, 0x00, 0x42, 0x00, 0x42, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB35, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB36, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x08, 0x00, 0x68, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB38, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xE3, 0x00, 0x77, 0x00, 0x45, 0x00, 0x59, 0x00, 0x41, 0x00, 0x7F, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB39, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB3A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x02, 0x00, 0x34, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0xFB3B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB3C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x7F, 0x00, 0x3F, 0x00, 0x01, 0x00, 0x19, 0x00, 0x02, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB3E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xDE, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x99, 0x00, 0x81, 0x00, 0x9F, 0x00, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB40, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x34, 0x00, 0x04, 0x00, 0x1C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB41, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x59, 0x00, 0x41, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB43, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x82, 0x00, 0xD4, 0x00, 0xD4, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, }}, +{ 0xFB44, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x6D, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB46, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xE7, 0x00, 0x63, 0x00, 0x24, 0x00, 0x98, 0x00, 0x06, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB47, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x2D, 0x00, 0x21, 0x00, 0x26, 0x00, 0x28, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, }}, +{ 0xFB48, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x19, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB49, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00, 0xDB, 0x00, 0x49, 0x00, 0x89, 0x00, 0x95, 0x00, 0xA2, 0x00, 0xFE, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB4A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x21, 0x00, 0x4D, 0x00, 0x41, 0x00, 0x61, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB4B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x20, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB4C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB4D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB4E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x80, 0x00, 0xFF, 0x00, 0x7F, 0x00, 0x41, 0x00, 0x61, 0x00, 0x01, 0x00, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFB4F, { 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x84, 0x00, 0xC7, 0x00, 0x63, 0x00, 0x32, 0x00, 0xDA, 0x00, 0x8E, 0x00, 0x46, 0x00, 0x63, 0x00, 0xE1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFE20, { 0x03, 0x80, 0x1C, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFE21, { 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFE22, { 0x0F, 0x00, 0x30, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFE23, { 0x01, 0x00, 0x86, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, + +#ifdef WANT_INTERNAL_CJK +{ 0xFF61, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF62, { 0x1E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF63, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF64, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF65, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF66, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF67, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x16, 0x00, 0x14, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF68, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18, 0x00, 0x68, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF69, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF6A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF6B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF6C, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x22, 0x00, 0x16, 0x00, 0x1A, 0x00, 0x32, 0x00, 0x48, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF6D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF6E, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF6F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x52, 0x00, 0x4A, 0x00, 0x22, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF70, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF71, { 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x12, 0x00, 0x14, 0x00, 0x14, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF72, { 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18, 0x00, 0x28, 0x00, 0xC8, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF73, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF74, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF75, { 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x48, 0x00, 0x88, 0x00, 0x08, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF76, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x42, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF77, { 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x16, 0x00, 0x18, 0x00, 0x30, 0x00, 0xD0, 0x00, 0x13, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x68, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF78, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x22, 0x00, 0x22, 0x00, 0x44, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF79, { 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3F, 0x00, 0x44, 0x00, 0x44, 0x00, 0x84, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF7A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF7B, { 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0xFF, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF7C, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x00, 0x00, 0x41, 0x00, 0x61, 0x00, 0x22, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF7D, { 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x18, 0x00, 0x14, 0x00, 0x24, 0x00, 0x22, 0x00, 0x42, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF7E, { 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2E, 0x00, 0x32, 0x00, 0xE2, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF7F, { 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF80, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x12, 0x00, 0x22, 0x00, 0x32, 0x00, 0x4A, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF81, { 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF82, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA1, 0x00, 0x91, 0x00, 0x51, 0x00, 0x52, 0x00, 0x42, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF83, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF84, { 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x14, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF85, { 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF86, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF87, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x24, 0x00, 0x28, 0x00, 0x18, 0x00, 0x08, 0x00, 0x14, 0x00, 0x12, 0x00, 0x22, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF88, { 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18, 0x00, 0x34, 0x00, 0x52, 0x00, 0x91, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF89, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF8A, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x42, 0x00, 0x41, 0x00, 0x41, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF8B, { 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x46, 0x00, 0x48, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF8C, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF8D, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x30, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x44, 0x00, 0x84, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF8E, { 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFF, 0x00, 0x10, 0x00, 0x10, 0x00, 0x54, 0x00, 0x52, 0x00, 0x52, 0x00, 0x52, 0x00, 0x91, 0x00, 0x91, 0x00, 0x10, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF8F, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x28, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF90, { 0x00, 0x00, 0x20, 0x00, 0x18, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF91, { 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x24, 0x00, 0x24, 0x00, 0x24, 0x00, 0x22, 0x00, 0x4E, 0x00, 0x72, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF92, { 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x24, 0x00, 0x24, 0x00, 0x18, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x14, 0x00, 0x22, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF93, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF94, { 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x23, 0x00, 0x2D, 0x00, 0x31, 0x00, 0xD2, 0x00, 0x12, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF95, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF96, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF97, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF98, { 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF99, { 0x00, 0x00, 0x08, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x29, 0x00, 0x29, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x4A, 0x00, 0x4C, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF9A, { 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x28, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF9B, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF9C, { 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF9D, { 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF9E, { 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFF9F, { 0x10, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +#endif + +{ 0xFFFC, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x51, 0x00, 0x50, 0x00, 0x39, 0x00, 0x15, 0x00, 0x58, 0x00, 0x57, 0x00, 0x19, 0x00, 0x41, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, +{ 0xFFFD, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x63, 0x00, 0x5D, 0x00, 0x7D, 0x00, 0x7B, 0x00, 0x77, 0x00, 0x77, 0x00, 0x7F, 0x00, 0x77, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }}, diff --git a/Mednafen/mednafen/video/png.cpp b/Mednafen/mednafen/video/png.cpp new file mode 100644 index 0000000000..03fe3153f0 --- /dev/null +++ b/Mednafen/mednafen/video/png.cpp @@ -0,0 +1,239 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "video-common.h" + +#include +#include "png.h" +#include "../endian.h" + +void PNGWrite::WriteChunk(FileStream &pngfile, uint32 size, const char *type, const uint8 *data) +{ + uint32 crc; + uint8 tempo[4]; + + MDFN_en32msb(tempo, size); + + pngfile.write(tempo, 4); + pngfile.write(type, 4); + + if(size) + pngfile.write(data, size); + + crc = crc32(0, (uint8 *)type, 4); + if(size) + crc = crc32(crc,data,size); + + MDFN_en32msb(tempo, crc); + + pngfile.write(tempo, 4); +} + +PNGWrite::~PNGWrite() +{ + +} + +PNGWrite::PNGWrite(const std::string& path, const MDFN_Surface *src, const MDFN_Rect &rect, const int32 *LineWidths) : ownfile(path, FileStream::MODE_WRITE_SAFE) +{ + WriteIt(ownfile, src, rect, LineWidths); +} + +INLINE void PNGWrite::EncodeImage(const MDFN_Surface *src, const MDFN_PixelFormat &format, const MDFN_Rect &rect, const int32 *LineWidths, const int png_width) +{ + const int32 pitchinpix = src->pitchinpix; + uint8 *tmp_inc; + + tmp_buffer.resize((png_width * ((format.bpp == 8) ? 1 : 3) + 1) * rect.h); + + tmp_inc = &tmp_buffer[0]; + + for(int y = 0; y < rect.h; y++) + { + *tmp_inc = 0; + tmp_inc++; + int line_width = rect.w; + int x_base = rect.x; + + if(LineWidths && LineWidths[0] != ~0) + { + line_width = LineWidths[y + rect.y]; + } + + for(int x = 0; MDFN_LIKELY(x < line_width); x++) + { + int r, g, b; + + if(format.bpp == 8) + { + tmp_inc[0] = src->pixels8[(y + rect.y) * pitchinpix + (x + x_base)]; + tmp_inc++; + } + else + { + if(format.bpp == 16) + format.DecodeColor(src->pixels16[(y + rect.y) * pitchinpix + (x + x_base)], r, g, b); + else + format.DecodeColor(src->pixels[(y + rect.y) * pitchinpix + (x + x_base)], r, g, b); + + tmp_inc[0] = r; + tmp_inc[1] = g; + tmp_inc[2] = b; + tmp_inc += 3; + } + } + + for(int x = line_width; x < png_width; x++) + { + if(format.bpp == 8) + { + tmp_inc[0] = 0; + tmp_inc++; + } + else + { + tmp_inc[0] = tmp_inc[1] = tmp_inc[2] = 0; + tmp_inc += 3; + } + } + } +} + +void PNGWrite::WriteIt(FileStream &pngfile, const MDFN_Surface *src, const MDFN_Rect &rect_in, const int32 *LineWidths) +{ + uLongf compmemsize; + int png_width; + const MDFN_PixelFormat format = src->format; + const MDFN_Rect rect = rect_in; + + if(LineWidths && LineWidths[0] != ~0) + { + png_width = 0; + + for(int y = 0; y < rect.h; y++) + { + const int32 cur_width = LineWidths[rect.y + y]; + + if(cur_width > png_width) + png_width = cur_width; + } + } + else + png_width = rect.w; + + if(!rect.h) + throw(MDFN_Error(0, "Refusing to save a zero-height PNG.")); + + if(!png_width) + throw(MDFN_Error(0, "Refusing to save a zero-width PNG.")); + + compmemsize = (uLongf)( (rect.h * (png_width + 1) * 3 * 1.001 + 1) + 12 ); + + compmem.resize(compmemsize); + + { + static uint8 header[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; + pngfile.write(header, 8); + } + + { + uint8 chunko[13]; + + MDFN_en32msb(&chunko[0], png_width); // Width + + MDFN_en32msb(&chunko[4], rect.h); // Height + + chunko[8]=8; // Bit depth + + if(format.bpp == 8) + chunko[9]=3; // Color type; palette index + else + chunko[9]=2; // Color type; RGB triplet + + chunko[10]=0; // compression: deflate + chunko[11]=0; // Basic adaptive filter set(though none are used). + chunko[12]=0; // No interlace. + + WriteChunk(pngfile, 13, "IHDR", chunko); + } + + if(format.bpp == 8) + { + uint8 chunko[256 * 3]; + + for(int i = 0; i < 256; i++) + { + uint8 r, g, b; + + src->format.DecodePColor(src->palette[i], r, g, b); + + chunko[(i * 3) + 0] = r; + chunko[(i * 3) + 1] = g; + chunko[(i * 3) + 2] = b; + } + + WriteChunk(pngfile, 256 * 3, "PLTE", chunko); + } + + // pHYs chunk + #if 0 + { + uint8 chunko[9]; + uint32 ppx, ppy; + + //ppx = png_width / MDFNGameInfo->nominal_width; + //ppy = 1; //rect->h / rect->h + + ppx = png_width; + ppy = MDFNGameInfo->nominal_width; + + MDFN_en32msb(&chunko[0], ppx); + MDFN_en32msb(&chunko[4], ppy); + + //printf("%08x %08x, %04x %04x\n", ppx, ppy, *(uint32 *)&chunko[0], *(uint32 *)&chunko[4]); + + chunko[8] = 0; + + WriteChunk(pngfile, 9, "pHYs", chunko); + } + #endif + + + // IDAT chunk + { + //uint32 st = MDFND_GetTime(); + + if(MDFN_LIKELY(format.colorspace == MDFN_COLORSPACE_RGB && format.bpp == 32)) + EncodeImage(src, format, rect, LineWidths, png_width); + else + EncodeImage(src, format, rect, LineWidths, png_width); + + //printf("%u\n", MDFND_GetTime() - st); + + if(compress(&compmem[0], &compmemsize, &tmp_buffer[0], rect.h * (png_width * ((format.bpp == 8) ? 1 : 3) + 1)) != Z_OK) + { + throw(MDFN_Error(0, "zlib error")); // TODO: verbosify + } + + WriteChunk(pngfile, compmemsize, "IDAT", &compmem[0]); + } + // + // + // + + WriteChunk(pngfile, 0, "IEND", 0); +} diff --git a/Mednafen/mednafen/video/png.h b/Mednafen/mednafen/video/png.h new file mode 100644 index 0000000000..b3fc298f09 --- /dev/null +++ b/Mednafen/mednafen/video/png.h @@ -0,0 +1,28 @@ +#ifndef __MDFN_PNG_H +#define __MDFN_PNG_H + +#include "../video.h" +#include + +class PNGWrite +{ + public: + + PNGWrite(const std::string& path, const MDFN_Surface *src, const MDFN_Rect &rect, const int32 *LineWidths); + ~PNGWrite(); + + + static void WriteChunk(FileStream &pngfile, uint32 size, const char *type, const uint8 *data); + + private: + + void WriteIt(FileStream &pngfile, const MDFN_Surface *src, const MDFN_Rect &rect, const int32 *LineWidths); + void EncodeImage(const MDFN_Surface *src, const MDFN_PixelFormat &format, const MDFN_Rect &rect, const int32 *LineWidths, const int png_width); + + FileStream ownfile; + std::vector compmem; + std::vector tmp_buffer; +}; + +#endif + diff --git a/Mednafen/mednafen/video/primitives.cpp b/Mednafen/mednafen/video/primitives.cpp new file mode 100644 index 0000000000..6ecb02a487 --- /dev/null +++ b/Mednafen/mednafen/video/primitives.cpp @@ -0,0 +1,236 @@ +#include "video-common.h" + +template +static void SuperDrawRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 border_color, uint32 fill_color) +{ + T *pixels = (T*)surface->pixels + (y * surface->pitchinpix) + x; + + if(w < 1 || h < 1) + return; + + // Replace these width and height checks with assert()s in the future. + if(((uint64)x + w) > (uint32)surface->w) + { + fprintf(stderr, "Rect xw bug!\n"); + return; + } + + if(((uint64)y + h) > (uint32)surface->h) + { + fprintf(stderr, "Rect yh bug!\n"); + return; + } + + for(uint32 ix = 0; ix < w; ix++) + { + pixels[ix] = border_color; + pixels[ix + (h - 1) * surface->pitchinpix] = border_color; + } + + pixels += surface->pitchinpix; + + for(uint32 iy = 1; iy < (h - 1); iy++) + { + pixels[0] = border_color; + pixels[w - 1] = border_color; + + if(fill) + for(uint32 ix = 1; ix < (w - 1); ix++) + pixels[ix] = fill_color; + + pixels += surface->pitchinpix; + } +} + + +void MDFN_DrawRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 border_color) +{ + SuperDrawRect(surface, x, y, w, h, border_color, 0); +} + +void MDFN_DrawFillRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 border_color, uint32 fill_color) +{ + SuperDrawRect(surface, x, y, w, h, border_color, fill_color); +} + +void MDFN_DrawFillRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 fill_color) +{ + SuperDrawRect(surface, x, y, w, h, fill_color, fill_color); +} +#if 0 +void MDFN_DrawLine_P(MDFN_Surface *surface, int x0, int y0, int x1, int y1, uint32 color) +{ + const bool contig = false; + const int dx = x1 - x0; + const int dy = y1 - y0; + const unsigned int abs_dx = abs(dx); + const unsigned int abs_dy = abs(dy); + const uint32 pitchinpix = surface->pitchinpix; + uint32 *pixels = surface->pixels; + const unsigned int s_w = surface->w; + const unsigned int s_h = surface->h; + + if(abs_dy > abs_dx) + { + unsigned int accum = abs_dy; + unsigned int accum_step = abs_dx << 1; + unsigned int accum_comp = abs_dy << 1; + const int xinc = (dx >> 31) | 1; + int x = x0; + + if(dy > 0) + { + for(int y = y0; y <= y1; y++) + { + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + + accum += accum_step; + if(accum >= accum_comp) + { + x += xinc; + accum -= accum_comp; + + if(contig) + { + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + } + } + } + } + else + { + for(int y = y0; y >= y1; y--) + { + if(accum > accum_comp) + { + if(contig) + { + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + } + + x += xinc; + accum -= accum_comp; + } + + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + + accum += accum_step; + } + } + } + else + { + unsigned int accum = abs_dx; + unsigned int accum_step = abs_dy << 1; + unsigned int accum_comp = abs_dx << 1; + const int yinc = (dy >> 31) | 1; + int y = y0; + + if(dx > 0) + { + for(int x = x0; x <= x1; x++) + { + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + + accum += accum_step; + if(accum >= accum_comp) + { + y += yinc; + accum -= accum_comp; + + if(contig) + { + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + } + } + } + } + else + { + for(int x = x0; x >= x1; x--) + { + if(accum > accum_comp) + { + if(contig) + { + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + } + + y += yinc; + accum -= accum_comp; + } + + if((unsigned)x < s_w && (unsigned)y < s_h) + pixels[x + (y * pitchinpix)] = color; + + accum += accum_step; + } + } + } +} +#endif + +// Will fail GLORIOUSLY if trying to draw a line where the distance between x coordinates, or between y coordinates, is >= 2**31 +// but you'd have to be 2**32 types of crazy to want to draw a line that long anyway. +void MDFN_DrawLine(MDFN_Surface *surface, int x0, int y0, int x1, int y1, uint32 color) +{ + const int dx = x1 - x0; + const int dy = y1 - y0; + const unsigned int abs_dx = abs(dx); + const unsigned int abs_dy = abs(dy); + const uint32 pitchinpix = surface->pitchinpix; + uint32 *pixels = surface->pixels; + const unsigned int s_w = surface->w; + const unsigned int s_h = surface->h; + + int64 x = ((int64)x0 << 32) + ((int64)1 << 31); + int64 y = ((int64)y0 << 32) + ((int64)1 << 31); + int64 x_inc; + int64 y_inc; + uint32 k; + + if((abs_dx | abs_dy) == 0) + { + k = 0; + x_inc = 0; + y_inc = 0; + } + else + { + if(abs_dx > abs_dy) + { + k = abs_dx; + x_inc = ((int64)dx >> 63) | ((int64)1 << 32); + //y_inc = (((int64)dy << 32) - ((dy < 0) ? (k - 1) : 0)) / k; + y_inc = (((int64)dy << 32) + ((dy < 0) ? 0 : (k - 1))) / k; + } + else + { + k = abs_dy; + //x_inc = (((int64)dx << 32) - ((dx < 0) ? (k - 1) : 0)) / k; + x_inc = (((int64)dx << 32) + ((dx < 0) ? 0 : (k - 1))) / k; + y_inc = (int64)((dy >> 31) | 1) << 32; + } + } + + for(uint32 i = 0; i <= k; i++) + { + int xc = x >> 32; + int yc = y >> 32; + + pixels[xc + (yc * pitchinpix)] = color; + + x += x_inc; + y += y_inc; + } +} + + + diff --git a/Mednafen/mednafen/video/primitives.h b/Mednafen/mednafen/video/primitives.h new file mode 100644 index 0000000000..1e815a0f6e --- /dev/null +++ b/Mednafen/mednafen/video/primitives.h @@ -0,0 +1,10 @@ +#ifndef __MDFN_VIDEO_PRIMITIVES_H +#define __MDFN_VIDEO_PRIMITIVES_H + +// Note: For simplicity, these functions do NOT perform surface dimension clipping. + +void MDFN_DrawRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 border_color); +void MDFN_DrawFillRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 border_color, uint32 fill_color); +void MDFN_DrawFillRect(MDFN_Surface *surface, uint32 x, uint32 y, uint32 w, uint32 h, uint32 fill_color); +void MDFN_DrawLine(MDFN_Surface *surface, int x0, int y0, int x1, int y1, uint32 color); +#endif diff --git a/Mednafen/mednafen/video/resize.cpp b/Mednafen/mednafen/video/resize.cpp new file mode 100644 index 0000000000..76de77fc09 --- /dev/null +++ b/Mednafen/mednafen/video/resize.cpp @@ -0,0 +1,155 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// I don't think this code works entirely correctly for reducing image size. +// Also, it won't interpolate quite correctly when resizing vertically and there are multiple horizontal resolutions(represented +// by LineWidths). + +#include "video-common.h" +#include + +#define INT(x) ((int)(x)) +#define FRACT(x) ((x) - floor(x)) + +#define READ_PIXEL(src_x, src_y, components) \ +{ \ + double source_components[2][2][4]; \ + \ + for(unsigned int xc = 0; xc < 2; xc++) \ + { \ + for(unsigned int yc = 0; yc < 2; yc++) \ + { \ + uint32 tmp; \ + uint32 eff_x = (int)(src_x) + xc, eff_y = (int)(src_y) + yc; \ + if(eff_x >= x_ip_limit) eff_x = x_ip_limit - 1; \ + if(eff_y >= y_ip_limit) eff_y = y_ip_limit - 1; \ + tmp = pixels[eff_x + eff_y * src->pitch32]; \ + source_components[xc][yc][0] = (tmp >> 0) & 0xFF; \ + source_components[xc][yc][1] = (tmp >> 8) & 0xFF; \ + source_components[xc][yc][2] = (tmp >> 16) & 0xFF; \ + source_components[xc][yc][3] = (tmp >> 24) & 0xFF; \ + } \ + } \ + \ + for(unsigned int i = 0; i < 4; i++) \ + { \ + components[i] += (1.0 - FRACT(src_y)) * (source_components[0][0][i] * (1.0 - FRACT(src_x)) + (source_components[1][0][i] * FRACT(src_x))); \ + components[i] += FRACT(src_y) * (source_components[0][1][i] * (1.0 - FRACT(src_x)) + (source_components[1][1][i] * FRACT(src_x))); \ + } \ +} + +bool MDFN_ResizeSurface(const MDFN_Surface *src, const MDFN_Rect *src_rect, const int32 *LineWidths, MDFN_Surface *dest, const MDFN_Rect *dest_rect) +{ + double src_x_inc, src_y_inc; + double src_x, src_y; + uint32 *pixels = src->pixels; + uint32 x_ip_limit, y_ip_limit; + + //printf("%ld, %d %d, %d %d\n", (long)pixels, src_rect->w, dest_rect->w, src_rect->h, dest_rect->h); + + src_x_inc = (double)src_rect->w / dest_rect->w; + src_y_inc = (double)src_rect->h / dest_rect->h; + + x_ip_limit = src_rect->x + src_rect->w; + y_ip_limit = src_rect->y + src_rect->h; + + src_y = src_rect->y; + + for(int32 y = 0; y < dest_rect->h; y++) + { + uint32 *dest_pix = dest->pixels + dest_rect->x + (dest_rect->y + y) * dest->pitch32; + bool ZeroDimensionSource = false; + + if(src_rect->h == 0) + { + ZeroDimensionSource = true; + } + else + { + src_x = src_rect->x; + + if(LineWidths[0] != ~0) + { + src_x_inc = (double)LineWidths[INT(src_y)] / dest_rect->w; + x_ip_limit = src_rect->x + LineWidths[INT(src_y)]; + + if(LineWidths[INT(src_y)] == 0) + ZeroDimensionSource = true; + } + else + { + if(src_rect->w == 0) + ZeroDimensionSource = true; + } + } + + if(ZeroDimensionSource) + { + puts("All Hail Lelouch!"); + + for(int32 x = 0; x < dest_rect->w; x++) + dest_pix[x] = 0; + } + else for(int32 x = 0; x < dest_rect->w; x++) + { + double components[4] = {0, 0, 0, 0}; + double div_fib = 1; + + //printf("%d %d, %d %d\n", (int)src_x, (int)src_y, x_ip_limit, y_ip_limit); + + READ_PIXEL(src_x, src_y, components); + + if(INT(src_x_inc) > 1) + { + for(double subx = 1; subx < (INT(src_x_inc) - 1); subx++) + { + READ_PIXEL(INT(src_x) + subx, INT(src_y), components); + div_fib++; + } + + READ_PIXEL(src_x + src_x_inc - 1, src_y, components); + div_fib++; + } + + if(INT(src_y_inc) > 1) + { + for(double suby = 1; suby < (INT(src_y_inc) - 1); suby++) + { + READ_PIXEL(INT(src_x), INT(src_y) + suby, components); + div_fib++; + } + + READ_PIXEL(src_x, src_y + src_y_inc - 1, components); + div_fib++; + } + + for(unsigned int i = 0; i < 4; i++) + { + components[i] /= div_fib; + if(components[i] < 0) components[i] = 0; + if(components[i] > 255) components[i] = 255; + } + + dest_pix[x] = ((int)components[0] << 0) | ((int)components[1] << 8) | ((int)components[2] << 16) | ((int)components[3] << 24); + src_x += src_x_inc; + } + src_y += src_y_inc; + } + + + return(TRUE); +} diff --git a/Mednafen/mednafen/video/resize.h b/Mednafen/mednafen/video/resize.h new file mode 100644 index 0000000000..433f3964dd --- /dev/null +++ b/Mednafen/mednafen/video/resize.h @@ -0,0 +1,2 @@ +bool MDFN_ResizeSurface(const MDFN_Surface *src, const MDFN_Rect *src_rect, const int32 *LineWidths, MDFN_Surface *dest, const MDFN_Rect *dest_rect); + diff --git a/Mednafen/mednafen/video/surface.cpp b/Mednafen/mednafen/video/surface.cpp new file mode 100644 index 0000000000..b7b88bc9b3 --- /dev/null +++ b/Mednafen/mednafen/video/surface.cpp @@ -0,0 +1,438 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include "surface.h" +#include + +MDFN_PixelFormat::MDFN_PixelFormat() +{ + bpp = 0; + colorspace = 0; + + Rshift = 0; + Gshift = 0; + Bshift = 0; + Ashift = 0; + + Rprec = 0; + Gprec = 0; + Bprec = 0; + Aprec = 0; +} + +MDFN_PixelFormat::MDFN_PixelFormat(const unsigned int p_colorspace, const uint8 p_rs, const uint8 p_gs, const uint8 p_bs, const uint8 p_as) +{ + bpp = 32; + colorspace = p_colorspace; + + Rshift = p_rs; + Gshift = p_gs; + Bshift = p_bs; + Ashift = p_as; + + Rprec = 8; + Gprec = 8; + Bprec = 8; + Aprec = 8; +} + +MDFN_Surface::MDFN_Surface() +{ + memset(&format, 0, sizeof(format)); + + pixels = NULL; + pixels8 = NULL; + pixels16 = NULL; + palette = NULL; + pixels_is_external = false; + pitchinpix = 0; + w = 0; + h = 0; +} + +MDFN_Surface::MDFN_Surface(void *const p_pixels, const uint32 p_width, const uint32 p_height, const uint32 p_pitchinpix, const MDFN_PixelFormat &nf, const bool alloc_init_pixels) +{ + Init(p_pixels, p_width, p_height, p_pitchinpix, nf, alloc_init_pixels); +} + +#if 0 +void MDFN_Surface::Resize(const uint32 p_width, const uint32 p_height, const uint32 p_pitchinpix) +{ + void *ptr = (format.bpp == 16) ? pixels16 : pixels; + uint64 old_asize = ((uint64)pitchinpix * (format.bpp >> 3)) * h; + uint64 new_asize = ((uint64)p_pitchinpix * (format.bpp >> 3)) * p_height; + + if(!(ptr = realloc(ptr, new_asize))) + throw MDFN_Error(ErrnoHolder(errno)); + + if(new_asize > old_asize) + memset((uint8*)ptr + old_asize, 0x00, new_asize - old_asize); + + if(format.bpp == 16) + pixels16 = (uint16*)ptr; + else + pixels = (uint32*)ptr; + + pitchinpix = p_pitchinpix; + w = p_width; + h = p_height; +} +#endif + +void MDFN_Surface::Init(void *const p_pixels, const uint32 p_width, const uint32 p_height, const uint32 p_pitchinpix, const MDFN_PixelFormat &nf, const bool alloc_init_pixels) +{ + void *rpix = NULL; + assert(nf.bpp == 8 || nf.bpp == 16 || nf.bpp == 32); + + format = nf; + + if(nf.bpp == 8) + { + //assert(!nf.Rshift && !nf.Gshift && !nf.Bshift && !nf.Ashift); + //assert(!nf.Rprec && !nf.Gprec && !nf.Bprec && !nf.Aprec); + } + else if(nf.bpp == 16) + { + assert(nf.Rprec && nf.Gprec && nf.Bprec && nf.Aprec); + } + else + { + assert((nf.Rshift + nf.Gshift + nf.Bshift + nf.Ashift) == 48); + assert(!((nf.Rshift | nf.Gshift | nf.Bshift | nf.Ashift) & 0x7)); + + format.Rprec = 8; + format.Gprec = 8; + format.Bprec = 8; + format.Aprec = 8; + } + + pixels16 = NULL; + pixels8 = NULL; + pixels = NULL; + palette = NULL; + + pixels_is_external = false; + + if(p_pixels) + { + rpix = p_pixels; + pixels_is_external = true; + } + else + { + if(alloc_init_pixels) + rpix = calloc(1, p_pitchinpix * p_height * (nf.bpp / 8)); + else + rpix = malloc(p_pitchinpix * p_height * (nf.bpp / 8)); + + if(!rpix) + { + ErrnoHolder ene(errno); + + throw(MDFN_Error(ene.Errno(), "%s", ene.StrError())); + } + } + + if(nf.bpp == 8) + { + if(!(palette = (MDFN_PaletteEntry*) calloc(sizeof(MDFN_PaletteEntry), 256))) + { + ErrnoHolder ene(errno); + + if(!pixels_is_external) + free(rpix); + + throw(MDFN_Error(ene.Errno(), "%s", ene.StrError())); + } + } + + if(nf.bpp == 16) + pixels16 = (uint16 *)rpix; + else if(nf.bpp == 8) + pixels8 = (uint8 *)rpix; + else + pixels = (uint32 *)rpix; + + w = p_width; + h = p_height; + + pitchinpix = p_pitchinpix; +} + +// When we're converting, only convert the w*h area(AKA leave the last part of the line, pitch32 - w, alone), +// for places where we store auxillary information there(graphics viewer in the debugger), and it'll be faster +// to boot. +void MDFN_Surface::SetFormat(const MDFN_PixelFormat &nf, bool convert) +{ + if(format.bpp != 32 || nf.bpp != 32) + printf("%u->%u\n",format.bpp, nf.bpp); + + assert(format.bpp == 8 || format.bpp == 16 || format.bpp == 32); + assert((nf.bpp == 8 && !convert) || nf.bpp == 16 || nf.bpp == 32); + + if(nf.bpp == 8) + { + + } + else if(nf.bpp == 16) + { + + } + else + { + assert((nf.Rshift + nf.Gshift + nf.Bshift + nf.Ashift) == 48); + assert(!((nf.Rshift | nf.Gshift | nf.Bshift | nf.Ashift) & 0x7)); + } + + if(nf.bpp != format.bpp) + { + void *rpix = calloc(1, pitchinpix * h * (nf.bpp / 8)); + void *oldpix; + + if(nf.bpp == 8) + { + assert(!convert); + + pixels8 = (uint8 *)rpix; + palette = (MDFN_PaletteEntry*)calloc(sizeof(MDFN_PaletteEntry), 256); + } + else if(nf.bpp == 16) // 32bpp or 8bpp to 16bpp + { + pixels16 = (uint16 *)rpix; + + if(convert) + { + if(format.bpp == 8) + { + uint16 palconv[256]; + + for(unsigned i = 0; i < 256; i++) + { + uint8 r, g, b; + + format.DecodePColor(palette[i], r, g, b); + palconv[i] = nf.MakeColor(r, g, b, 0); + } + + puts("8bpp to 16bpp convert"); + for(int y = 0; y < h; y++) + { + uint8 *srow = &pixels8[y * pitchinpix]; + uint16 *drow = &pixels16[y * pitchinpix]; + + for(int x = 0; x < w; x++) + { + drow[x] = palconv[srow[x]]; + } + } + } + else + { + puts("32bpp to 16bpp convert"); + for(int y = 0; y < h; y++) + { + uint32 *srow = &pixels[y * pitchinpix]; + uint16 *drow = &pixels16[y * pitchinpix]; + + for(int x = 0; x < w; x++) + { + uint32 c = srow[x]; + int r, g, b, a; + + DecodeColor(c, r, g, b, a); + drow[x] = nf.MakeColor(r, g, b, a); + } + } + } + } + } + else // 16bpp or 8bpp to 32bpp + { + pixels = (uint32 *)rpix; + + if(convert) + { + if(format.bpp == 8) + { + uint32 palconv[256]; + + for(unsigned i = 0; i < 256; i++) + { + uint8 r, g, b; + + format.DecodePColor(palette[i], r, g, b); + palconv[i] = nf.MakeColor(r, g, b, 0); + } + + puts("8bpp to 32bpp convert"); + for(int y = 0; y < h; y++) + { + uint8 *srow = &pixels8[y * pitchinpix]; + uint32 *drow = &pixels[y * pitchinpix]; + + for(int x = 0; x < w; x++) + { + drow[x] = palconv[srow[x]]; + } + } + } + else + { + puts("16bpp to 32bpp convert"); + for(int y = 0; y < h; y++) + { + uint16 *srow = &pixels16[y * pitchinpix]; + uint32 *drow = &pixels[y * pitchinpix]; + + for(int x = 0; x < w; x++) + { + uint32 c = srow[x]; + int r, g, b, a; + + DecodeColor(c, r, g, b, a); + drow[x] = nf.MakeColor(r, g, b, a); + } + } + } + } + } + + switch(format.bpp) + { + default: + + case 32: oldpix = pixels; + pixels = NULL; + break; + + case 16: oldpix = pixels16; + pixels16 = NULL; + break; + + case 8: oldpix = pixels8; + pixels8 = NULL; + if(palette) + { + free(palette); + palette = NULL; + } + break; + } + + if(oldpix && !pixels_is_external) + free(oldpix); + + pixels_is_external = false; + + // We already handled surface conversion above. + convert = false; + } + + if(convert) + { + if(format.bpp == 16) + { + // We should assert that surface->pixels is non-NULL even if we don't need to convert the surface, to catch more insidious bugs. + assert(pixels16); + + if(memcmp(&format, &nf, sizeof(MDFN_PixelFormat))) + { + //puts("Converting"); + for(int y = 0; y < h; y++) + { + uint16 *row = &pixels16[y * pitchinpix]; + + for(int x = 0; x < w; x++) + { + uint32 c = row[x]; + int r, g, b, a; + + DecodeColor(c, r, g, b, a); + row[x] = nf.MakeColor(r, g, b, a); + } + } + } + } + else + { + // We should assert that surface->pixels is non-NULL even if we don't need to convert the surface, to catch more insidious bugs. + assert(pixels); + + if(memcmp(&format, &nf, sizeof(MDFN_PixelFormat))) + { + //puts("Converting"); + for(int y = 0; y < h; y++) + { + uint32 *row = &pixels[y * pitchinpix]; + + for(int x = 0; x < w; x++) + { + uint32 c = row[x]; + int r, g, b, a; + + DecodeColor(c, r, g, b, a); + row[x] = nf.MakeColor(r, g, b, a); + } + } + } + } + } + format = nf; +} + +void MDFN_Surface::Fill(uint8 r, uint8 g, uint8 b, uint8 a) +{ + uint32 color = MakeColor(r, g, b, a); + + if(format.bpp == 8) + { + assert(pixels8); + + for(int32 i = 0; i < pitchinpix * h; i++) + pixels8[i] = color; + } + else if(format.bpp == 16) + { + assert(pixels16); + + for(int32 i = 0; i < pitchinpix * h; i++) + pixels16[i] = color; + } + else + { + assert(pixels); + + for(int32 i = 0; i < pitchinpix * h; i++) + pixels[i] = color; + } +} + +MDFN_Surface::~MDFN_Surface() +{ + if(!pixels_is_external) + { + if(pixels) + free(pixels); + if(pixels16) + free(pixels16); + if(pixels8) + free(pixels8); + if(palette) + free(palette); + } +} diff --git a/Mednafen/mednafen/video/surface.h b/Mednafen/mednafen/video/surface.h new file mode 100644 index 0000000000..65f9c0bf74 --- /dev/null +++ b/Mednafen/mednafen/video/surface.h @@ -0,0 +1,245 @@ +#ifndef __MDFN_SURFACE_H +#define __MDFN_SURFACE_H + +struct MDFN_Rect +{ + int32 x, y, w, h; +}; + +enum +{ + MDFN_COLORSPACE_RGB = 0, + MDFN_COLORSPACE_YCbCr = 1, + //MDFN_COLORSPACE_YUV = 2, // TODO, maybe. +}; + +struct MDFN_PaletteEntry +{ + uint8 r, g, b; +}; + +class MDFN_PixelFormat +{ + public: + + MDFN_PixelFormat(); + MDFN_PixelFormat(const unsigned int p_colorspace, const uint8 p_rs, const uint8 p_gs, const uint8 p_bs, const uint8 p_as); + + unsigned int bpp; // 32 only for now(16 and 8 wip) + unsigned int colorspace; + + union + { + uint8 Rshift; // Bit position of the lowest bit of the red component + uint8 Yshift; + }; + + union + { + uint8 Gshift; // [...] green component + uint8 Ushift; + uint8 Cbshift; + }; + + union + { + uint8 Bshift; // [...] blue component + uint8 Vshift; + uint8 Crshift; + }; + + uint8 Ashift; // [...] alpha component. + + // For 16bpp, WIP + uint8 Rprec; + uint8 Gprec; + uint8 Bprec; + uint8 Aprec; + + // Creates a color value for the surface corresponding to the 8-bit R/G/B/A color passed. + INLINE uint32 MakeColor(uint8 r, uint8 g, uint8 b, uint8 a = 0) const + { + if(colorspace == MDFN_COLORSPACE_YCbCr) + { + uint32 y, u, v; + + y = 16 + ((r * 16842 + g * 33030 + b * 6422) >> 16); + u = 128 + ((r * -9699 + g * -19071 + b * 28770) >> 16); + v = 128 + ((r * 28770 + g * -24117 + b * -4653) >> 16); + + return((y << Yshift) | (u << Ushift) | (v << Vshift) | (a << Ashift)); + } + else + { + if(bpp == 16) + { + uint32 ret = 0; +/* + ret |= std::min(((r * ((1 << Rprec) - 1) + 127) / 255), 255) << Rshift; + ret |= std::min(((g * ((1 << Gprec) - 1) + 127) / 255), 255) << Gshift; + ret |= std::min(((b * ((1 << Bprec) - 1) + 127) / 255), 255) << Bshift; + ret |= std::min(((a * ((1 << Aprec) - 1) + 127) / 255), 255) << Ashift; +*/ + ret |= ((r * ((1 << Rprec) - 1) + 127) / 255) << Rshift; + ret |= ((g * ((1 << Gprec) - 1) + 127) / 255) << Gshift; + ret |= ((b * ((1 << Bprec) - 1) + 127) / 255) << Bshift; + ret |= ((a * ((1 << Aprec) - 1) + 127) / 255) << Ashift; + return(ret); + } + else + return((r << Rshift) | (g << Gshift) | (b << Bshift) | (a << Ashift)); + } + } + + INLINE MDFN_PaletteEntry MakePColor(uint8 r, uint8 g, uint8 b) const + { + MDFN_PaletteEntry ret; + + ret.r = ((r * ((1 << Rprec) - 1) + 127) / 255) << Rshift; + ret.g = ((g * ((1 << Gprec) - 1) + 127) / 255) << Gshift; + ret.b = ((b * ((1 << Bprec) - 1) + 127) / 255) << Bshift; + + return ret; + } + + INLINE void DecodePColor(const MDFN_PaletteEntry& pe, uint8 &r, uint8 &g, uint8 &b) const + { + r = ((pe.r >> Rshift) & ((1 << Rprec) - 1)) * 255 / ((1 << Rprec) - 1); + g = ((pe.g >> Gshift) & ((1 << Gprec) - 1)) * 255 / ((1 << Gprec) - 1); + b = ((pe.b >> Bshift) & ((1 << Bprec) - 1)) * 255 / ((1 << Bprec) - 1); + } + + // Gets the R/G/B/A values for the passed 32-bit surface pixel value + INLINE void DecodeColor(uint32 value, int &r, int &g, int &b, int &a) const + { + if(colorspace == MDFN_COLORSPACE_YCbCr) + { + int32 y = (value >> Yshift) & 0xFF; + int32 cb = (value >> Cbshift) & 0xFF; + int32 cr = (value >> Crshift) & 0xFF; + + int32 r_tmp, g_tmp, b_tmp; + + r_tmp = g_tmp = b_tmp = 76284 * (y - 16); + + r_tmp = r_tmp + 104595 * (cr - 128); + g_tmp = g_tmp - 53281 * (cr - 128) - 25690 * (cb - 128); + b_tmp = b_tmp + 132186 * (cb - 128); + + r_tmp >>= 16; + g_tmp >>= 16; + b_tmp >>= 16; + + if(r_tmp < 0) r_tmp = 0; + if(r_tmp > 255) r_tmp = 255; + + if(g_tmp < 0) g_tmp = 0; + if(g_tmp > 255) g_tmp = 255; + + if(b_tmp < 0) b_tmp = 0; + if(b_tmp > 255) b_tmp = 255; + + r = r_tmp; + g = g_tmp; + b = b_tmp; + + a = (value >> Ashift) & 0xFF; + } + else + { + if(bpp == 16) + { + r = ((value >> Rshift) & ((1 << Rprec) - 1)) * 255 / ((1 << Rprec) - 1); + g = ((value >> Gshift) & ((1 << Gprec) - 1)) * 255 / ((1 << Gprec) - 1); + b = ((value >> Bshift) & ((1 << Bprec) - 1)) * 255 / ((1 << Bprec) - 1); + a = ((value >> Ashift) & ((1 << Aprec) - 1)) * 255 / ((1 << Aprec) - 1); + } + else + { + r = (value >> Rshift) & 0xFF; + g = (value >> Gshift) & 0xFF; + b = (value >> Bshift) & 0xFF; + a = (value >> Ashift) & 0xFF; + } + } + } + + INLINE void DecodeColor(uint32 value, int &r, int &g, int &b) const + { + int dummy_a; + + DecodeColor(value, r, g, b, dummy_a); + } +}; // MDFN_PixelFormat; + +// Supports 32-bit RGBA +// 16-bit is WIP +// 8-bit is even WIPier. +class MDFN_Surface //typedef struct +{ + public: + + MDFN_Surface(); + MDFN_Surface(void *const p_pixels, const uint32 p_width, const uint32 p_height, const uint32 p_pitchinpix, const MDFN_PixelFormat &nf, const bool alloc_init_pixels = true); + + ~MDFN_Surface(); + + uint8 *pixels8; + uint16 *pixels16; + uint32 *pixels; + + template + T* pix(void) + { + if(sizeof(T) == 1) + return (T*)pixels8; + else if(sizeof(T) == 2) + return (T*)pixels16; + else if(sizeof(T) == 4) + return (T*)pixels; + else + return NULL; + } + + MDFN_PaletteEntry *palette; + + bool pixels_is_external; + + // w, h, and pitch32 should always be > 0 + int32 w; + int32 h; + + union + { + int32 pitch32; // In pixels, not in bytes. + int32 pitchinpix; // New name, new code should use this. + }; + + MDFN_PixelFormat format; + + void Fill(uint8 r, uint8 g, uint8 b, uint8 a); + void SetFormat(const MDFN_PixelFormat &new_format, bool convert); + + // Creates a 32-bit value for the surface corresponding to the R/G/B/A color passed. + INLINE uint32 MakeColor(uint8 r, uint8 g, uint8 b, uint8 a = 0) const + { + return(format.MakeColor(r, g, b, a)); + } + + // Gets the R/G/B/A values for the passed 32-bit surface pixel value + INLINE void DecodeColor(uint32 value, int &r, int &g, int &b, int &a) const + { + format.DecodeColor(value, r, g, b, a); + } + + INLINE void DecodeColor(uint32 value, int &r, int &g, int &b) const + { + int dummy_a; + + DecodeColor(value, r, g, b, dummy_a); + } + private: + void Init(void *const p_pixels, const uint32 p_width, const uint32 p_height, const uint32 p_pitchinpix, const MDFN_PixelFormat &nf, const bool alloc_init_pixels); +}; + +#endif diff --git a/Mednafen/mednafen/video/tblur.cpp b/Mednafen/mednafen/video/tblur.cpp new file mode 100644 index 0000000000..e67bc9f674 --- /dev/null +++ b/Mednafen/mednafen/video/tblur.cpp @@ -0,0 +1,171 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "../mednafen.h" +#include "tblur.h" + +typedef struct +{ + uint16 a, b, c, d; +} HQPixelEntry; + +static uint32 *BlurBuf = NULL; +static uint32 AccumBlurAmount; // max of 16384, infinite blur! +static HQPixelEntry *AccumBlurBuf = NULL; + +void TBlur_Init(void) +{ + std::string sn = MDFNGameInfo->shortname; + + if(MDFN_GetSettingB(std::string(sn + "." + std::string("tblur")))) + { + AccumBlurAmount = (uint32)(16384 * MDFN_GetSettingF(std::string(sn + "." + std::string("tblur.accum.amount"))) / 100); + if(MDFN_GetSettingB(std::string(sn + "." + std::string("tblur.accum")))) + { + AccumBlurBuf = (HQPixelEntry *)calloc(sizeof(HQPixelEntry), MDFNGameInfo->fb_width * MDFNGameInfo->fb_height); + MDFN_printf(_("Video temporal frame blur enabled with accumulation: %f.\n"), (double)AccumBlurAmount * 100 / 16384); + } + else + { + BlurBuf = (uint32 *)calloc(4, MDFNGameInfo->fb_width * MDFNGameInfo->fb_height); + MDFN_printf(_("Video temporal frame blur enabled.\n")); + } + } +} + +void TBlur_Run(EmulateSpecStruct *espec) +{ + MDFN_Surface *surface = espec->surface; + uint32 *pXBuf = surface->pixels; + const uint32 bb_pitch = MDFNGameInfo->fb_width; + + if(surface->format.bpp != 32) + { + puts("Temporal blur not implemented for non-32bpp formats yet."); // Mostly for debugging purposes. + return; + } + + //printf("%d %d %d %d\n", espec->surface->format.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift, espec->surface->format.Ashift); + if(AccumBlurBuf) + { + for(int y = 0; y < espec->DisplayRect.h; y++) + { + int xw = espec->DisplayRect.w; + int xs = espec->DisplayRect.x; + + if(espec->LineWidths[0] != ~0) + { + xw = espec->LineWidths[espec->DisplayRect.y + y]; + } + + if(AccumBlurAmount == 8192) + { + for(int x = 0; x < xw; x++) + { + uint32 color; + HQPixelEntry mixcolor; + + color = pXBuf[(y + espec->DisplayRect.y) * surface->pitch32 + xs + x]; + mixcolor = AccumBlurBuf[y * bb_pitch + x]; + mixcolor.a = ((uint32)mixcolor.a + ((color & 0xFF) << 8)) >> 1; + mixcolor.b = ((uint32)mixcolor.b + ((color & 0xFF00))) >> 1; + mixcolor.c = ((uint32)mixcolor.c + ((color & 0xFF0000) >> 8)) >> 1; + mixcolor.d = ((uint32)mixcolor.d + ((color & 0xFF000000) >> 16)) >> 1; + + AccumBlurBuf[y * bb_pitch + x] = mixcolor; + + pXBuf[(y + espec->DisplayRect.y) * surface->pitch32 + xs + x] = ((mixcolor.a >> 8) << 0) | ((mixcolor.b >> 8) << 8) | + ((mixcolor.c >> 8) << 16) | ((mixcolor.d >> 8) << 24); + } + } + else + { + uint32 InvAccumBlurAmount = 16384 - AccumBlurAmount; + + for(int x = 0; x < xw; x++) + { + uint32 color; + HQPixelEntry mixcolor; + color = pXBuf[(y + espec->DisplayRect.y) * surface->pitch32 + xs + x]; + + mixcolor = AccumBlurBuf[y * bb_pitch + x]; + mixcolor.a = ((uint32)mixcolor.a * AccumBlurAmount + InvAccumBlurAmount * ((color & 0xFF) << 8)) >> 14; + mixcolor.b = ((uint32)mixcolor.b * AccumBlurAmount + InvAccumBlurAmount * ((color & 0xFF00))) >> 14; + mixcolor.c = ((uint32)mixcolor.c * AccumBlurAmount + InvAccumBlurAmount * ((color & 0xFF0000) >> 8)) >> 14; + mixcolor.d = ((uint32)mixcolor.d * AccumBlurAmount + InvAccumBlurAmount * ((color & 0xFF000000) >> 16)) >> 14; + AccumBlurBuf[y * bb_pitch + x] = mixcolor; + + pXBuf[(y + espec->DisplayRect.y) * surface->pitch32 + xs + x] = ((mixcolor.a >> 8) << 0) | ((mixcolor.b >> 8) << 8) | + ((mixcolor.c >> 8) << 16) | ((mixcolor.d >> 8) << 24); + } + } + + } + } + else if(BlurBuf) + { + for(int y = 0; y < espec->DisplayRect.h; y++) + { + int xw = espec->DisplayRect.w; + int xs = espec->DisplayRect.x; + + if(espec->LineWidths[0] != ~0) + { + xw = espec->LineWidths[espec->DisplayRect.y + y]; + } + + for(int x = 0; x < xw; x++) + { + uint32 color, mixcolor; + color = pXBuf[(y + espec->DisplayRect.y) * surface->pitch32 + xs + x]; + + mixcolor = BlurBuf[y * bb_pitch + x]; + BlurBuf[y * bb_pitch + x] = color; + + // Needs 64-bit + #ifdef HAVE_NATIVE64BIT + color = ((((uint64)color + mixcolor) - ((color ^ mixcolor) & 0x01010101))) >> 1; + #else + color = ((((color & 0x00FF00FF) + (mixcolor & 0x00FF00FF)) >> 1) & 0x00FF00FF) | (((((color & 0xFF00FF00) >> 1) + ((mixcolor & 0xFF00FF00) >> 1))) & 0xFF00FF00); + #endif + + // color = (((color & 0xFF) + (mixcolor & 0xFF)) >> 1) | ((((color & 0xFF00) + (mixcolor & 0xFF00)) >> 1) & 0xFF00) | + // ((((color & 0xFF0000) + (mixcolor & 0xFF0000)) >> 1) & 0xFF0000) | ((((color >> 24) + (mixcolor >> 24)) >> 1) << 24); + pXBuf[(y + espec->DisplayRect.y) * surface->pitch32 + xs + x] = color; + } + } + } +} + +void TBlur_Kill(void) +{ + if(BlurBuf) + { + free(BlurBuf); + BlurBuf = NULL; + } + if(AccumBlurBuf) + { + free(AccumBlurBuf); + AccumBlurBuf = NULL; + } +} + +bool TBlur_IsOn(void) +{ + return(BlurBuf || AccumBlurBuf); +} diff --git a/Mednafen/mednafen/video/tblur.h b/Mednafen/mednafen/video/tblur.h new file mode 100644 index 0000000000..9ea66fb885 --- /dev/null +++ b/Mednafen/mednafen/video/tblur.h @@ -0,0 +1,11 @@ +#ifndef __MDFN_TBLUR_H +#define __MDFN_TBLUR_H + +#include "../video.h" + +void TBlur_Init(void); +void TBlur_Kill(void); +void TBlur_Run(EmulateSpecStruct *espec); +bool TBlur_IsOn(void); + +#endif diff --git a/Mednafen/mednafen/video/text.cpp b/Mednafen/mednafen/video/text.cpp new file mode 100644 index 0000000000..e807a8d1aa --- /dev/null +++ b/Mednafen/mednafen/video/text.cpp @@ -0,0 +1,338 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "video-common.h" +#include "../string/ConvertUTF.h" +#include "font-data.h" + +typedef struct +{ + uint8 glyph_width; + uint8 glyph_height; + int8 extension; + uint8 entry_bsize; + const uint8 *base_ptr; +} FontDescriptor_t; + +static FontDescriptor_t FontDescriptors[_MDFN_FONT_COUNT] = +{ + #ifdef WANT_INTERNAL_CJK + { 9, 18, MDFN_FONT_18x18, sizeof(FontData9x18[0]), &FontData9x18[0].data[0] }, + { 5, 7, -1, sizeof(FontData5x7[0]), &FontData5x7[0].data[0] }, + { 4, 5, -1, sizeof(FontData4x5[0]), &FontData4x5[0].data[0] }, + { 6, 13, MDFN_FONT_12x13, sizeof(FontData6x13[0]), &FontData6x13[0].data[0] }, + { 12, 13, -1, sizeof(FontData12x13[0]), &FontData12x13[0].data[0] }, + { 18, 18, -1, sizeof(FontData18x18[0]), &FontData18x18[0].data[0] }, + #else + { 9, 18, -1, sizeof(FontData9x18[0]), &FontData9x18[0].data[0] }, + { 5, 7, -1, sizeof(FontData5x7[0]), &FontData5x7[0].data[0] }, + { 4, 5, -1, sizeof(FontData4x5[0]), &FontData4x5[0].data[0] }, + { 6, 13, -1, sizeof(FontData6x13[0]), &FontData6x13[0].data[0] }, + #endif +}; + +static uint16 FontDataIndexCache[_MDFN_FONT_COUNT][65536]; + +uint32 GetFontHeight(unsigned which_font) +{ + return(FontDescriptors[which_font].glyph_height); +} + +void MDFN_InitFontData(void) +{ + unsigned int x; + unsigned int inx; + + memset(FontDataIndexCache, 0xFF, sizeof(FontDataIndexCache)); + + for(inx=x=0;x<65536;x++) + { + if(inx < (FontData4x5_Size / sizeof(font4x5)) && FontData4x5[inx].glyph_num == x) + { + FontDataIndexCache[MDFN_FONT_4x5][x] = inx; + inx++; + } + } + + for(inx=x=0;x<65536;x++) + { + if(inx < (FontData5x7_Size / sizeof(font5x7)) && FontData5x7[inx].glyph_num == x) + { + FontDataIndexCache[MDFN_FONT_5x7][x] = inx; + inx++; + } + } + + for(inx=x=0;x<65536;x++) + { + if(inx < (FontData6x13_Size / sizeof(font6x13)) && FontData6x13[inx].glyph_num == x) + { + FontDataIndexCache[MDFN_FONT_6x13_12x13][x] = inx; + inx++; + } + } + + for(inx=x=0;x<65536;x++) + { + if(inx < (FontData9x18_Size / sizeof(font9x18)) && FontData9x18[inx].glyph_num == x) + { + FontDataIndexCache[MDFN_FONT_9x18_18x18][x] = inx; + inx++; + } + } + + #ifdef WANT_INTERNAL_CJK + for(inx=x=0;x<65536;x++) + { + if(inx < (FontData12x13_Size / sizeof(font12x13)) && FontData12x13[inx].glyph_num == x) + { + FontDataIndexCache[MDFN_FONT_12x13][x] = inx; + inx++; + } + } + + for(inx=x=0;x<65536;x++) + { + if(inx < (FontData18x18_Size / sizeof(font18x18)) && FontData18x18[inx].glyph_num == x) + { + FontDataIndexCache[MDFN_FONT_18x18][x] = inx; + inx++; + } + } + #endif +} + +size_t utf32_strlen(UTF32 *s) +{ + size_t ret = 0; + + while(*s++) ret++; + + return(ret); +} + +static void DrawTextSub(const UTF32 *utf32_buf, uint32 &slen, const uint8 **glyph_ptrs, uint8 *glyph_width, uint8 *glyph_ov_width, uint32 &pixwidth, uint32 which_font) +{ + pixwidth = 0; + + for(uint32 x = 0; x < slen; x++) + { + uint32 thisglyph = utf32_buf[x] & 0xFFFF; + bool GlyphFound = FALSE; + uint32 recurse_which_font = which_font; + + while(!GlyphFound) + { + if(FontDataIndexCache[recurse_which_font][thisglyph] != 0xFFFF) + { + glyph_ptrs[x] = FontDescriptors[recurse_which_font].base_ptr + (FontDescriptors[recurse_which_font].entry_bsize * FontDataIndexCache[recurse_which_font][thisglyph]); + glyph_width[x] = FontDescriptors[recurse_which_font].glyph_width; + GlyphFound = TRUE; + } + else if(FontDescriptors[recurse_which_font].extension != -1) + recurse_which_font = FontDescriptors[recurse_which_font].extension; + else + break; + } + + if(!GlyphFound) + { + glyph_ptrs[x] = FontDescriptors[which_font].base_ptr + (FontDescriptors[which_font].entry_bsize * FontDataIndexCache[which_font][(unsigned char)'?']); + glyph_width[x] = FontDescriptors[which_font].glyph_width; + } + + if((thisglyph >= 0x0300 && thisglyph <= 0x036F) || (thisglyph >= 0xFE20 && thisglyph <= 0xFE2F)) + glyph_ov_width[x] = 0; + else + glyph_ov_width[x] = glyph_width[x]; + + pixwidth += (((x + 1) == slen) ? glyph_width[x] : glyph_ov_width[x]); + } +} + +uint32 GetTextPixLength(const char *msg, uint32 which_font) +{ + uint32 pixwidth = 0; + uint32 max_glyph_len = strlen((char *)msg); + + if(MDFN_LIKELY(max_glyph_len > 0)) + { + uint32 slen; + const uint8 *glyph_ptrs[max_glyph_len]; + uint8 glyph_width[max_glyph_len]; + uint8 glyph_ov_width[max_glyph_len]; + + const UTF8 *src_begin = (UTF8 *)msg; + UTF32 utf32_buf[max_glyph_len]; + UTF32 *tstart = utf32_buf; + + ConvertUTF8toUTF32(&src_begin, (UTF8*)msg + max_glyph_len, &tstart, &tstart[max_glyph_len], lenientConversion); + slen = (tstart - utf32_buf); + DrawTextSub(utf32_buf, slen, glyph_ptrs, glyph_width, glyph_ov_width, pixwidth, which_font); + } + + return(pixwidth); +} + +uint32 GetTextPixLength(const UTF32 *msg, uint32 which_font) +{ + uint32 pixwidth = 0; + uint32 max_glyph_len = utf32_strlen((UTF32 *)msg); + + if(MDFN_LIKELY(max_glyph_len > 0)) + { + uint32 slen; + const uint8 *glyph_ptrs[max_glyph_len]; + uint8 glyph_width[max_glyph_len]; + uint8 glyph_ov_width[max_glyph_len]; + + slen = utf32_strlen((UTF32 *)msg); + DrawTextSub((UTF32*)msg, slen, glyph_ptrs, glyph_width, glyph_ov_width, pixwidth, which_font); + } + + return(pixwidth); +} + +static uint32 DoRealDraw(uint32 *dest, uint32 pitch, uint32 width_limit, uint32 fgcolor, int centered, uint32 slen, uint32 pixwidth, + uint32 glyph_height, const uint8 *glyph_ptrs[], const uint8 glyph_width[], const uint8 glyph_ov_width[], const uint32 ex_offset = 0) +{ + pitch /= sizeof(uint32); + if(centered) + { + int32 poot = width_limit - pixwidth; + + if(poot < 0) + poot = 0; + + dest += poot / 2; + } + + pixwidth = 0; + + for(uint32 n = 0; n < slen; n++) + { + const uint8 *src_glyph = glyph_ptrs[n]; + uint32 gy_mul = (glyph_width[n] >> 3) + 1; + uint32 gw = glyph_width[n]; + + if((pixwidth + gw) > width_limit) + { + if(pixwidth > width_limit) // Prooooobably shouldn't happen, but just in case. + gw = 0; + else + gw = width_limit - pixwidth; + } + + if((pixwidth + glyph_ov_width[n]) > width_limit) + slen = n + 1; // Break out + + + for(uint32 gy = 0; gy < glyph_height; gy++) + { + for(uint32 gx = 0; gx < gw; gx++) + { + if((src_glyph[gy * gy_mul + (gx >> 3)] << (gx & 0x7)) & 0x80) + dest[gy * pitch + gx] = fgcolor; + } + } + dest += glyph_ov_width[n]; + pixwidth += ((n + 1) == slen) ? gw : glyph_ov_width[n]; + } + + if(pixwidth > width_limit) + pixwidth = width_limit; + + return(pixwidth); +} + +uint32 DrawTextTrans(uint32 *dest, int pitch, uint32 width, const char *msg, uint32 fgcolor, int centered, uint32 which_font) +{ + uint32 max_glyph_len = strlen((char *)msg); + + if(MDFN_LIKELY(max_glyph_len > 0)) + { + uint32 slen; + uint32 pixwidth; + const uint8 *glyph_ptrs[max_glyph_len]; + uint8 glyph_width[max_glyph_len]; + uint8 glyph_ov_width[max_glyph_len]; + + const UTF8 *src_begin = (UTF8 *)msg; + UTF32 utf32_buf[max_glyph_len]; + UTF32 *tstart = utf32_buf; + + ConvertUTF8toUTF32(&src_begin, (UTF8*)msg + max_glyph_len, &tstart, &tstart[max_glyph_len], lenientConversion); + slen = (tstart - utf32_buf); + DrawTextSub(utf32_buf, slen, glyph_ptrs, glyph_width, glyph_ov_width, pixwidth, which_font); + + return(DoRealDraw(dest, pitch, width, fgcolor, centered, slen, pixwidth, FontDescriptors[which_font].glyph_height, glyph_ptrs, glyph_width, glyph_ov_width)); + } + + return 0; +} + +uint32 DrawTextTrans(uint32 *dest, int pitch, uint32 width, const UTF32 *msg, uint32 fgcolor, int centered, uint32 which_font) +{ + uint32 max_glyph_len = utf32_strlen((UTF32 *)msg); + + if(MDFN_LIKELY(max_glyph_len > 0)) + { + uint32 slen; + uint32 pixwidth; + const uint8 *glyph_ptrs[max_glyph_len]; + uint8 glyph_width[max_glyph_len]; + uint8 glyph_ov_width[max_glyph_len]; + + slen = utf32_strlen((UTF32 *)msg); + DrawTextSub((UTF32*)msg, slen, glyph_ptrs, glyph_width, glyph_ov_width, pixwidth, which_font); + + return(DoRealDraw(dest, pitch, width, fgcolor, centered, slen, pixwidth, FontDescriptors[which_font].glyph_height, glyph_ptrs, glyph_width, glyph_ov_width)); + } + return 0; +} + +uint32 DrawTextTransShadow(uint32 *dest, int pitch, uint32 width, const char *textmsg, uint32 fgcolor, uint32 shadcolor, int centered, uint32 which_font) +{ + DrawTextTrans(dest + 1 + (pitch >> 2), pitch, width ? (width - 1) : 0, textmsg, shadcolor, centered, which_font); + return(DrawTextTrans(dest, pitch, width, textmsg, fgcolor, centered, which_font)); +} + +uint32 DrawTextTransShadow(uint32 *dest, int pitch, uint32 width, const std::string &textmsg, uint32 fgcolor, uint32 shadcolor, int centered, uint32 which_font) +{ + const char *tmp = textmsg.c_str(); + + DrawTextTrans(dest + 1 + (pitch >> 2), pitch, width ? (width - 1) : 0, tmp, shadcolor, centered, which_font); + return(DrawTextTrans(dest, pitch, width, tmp, fgcolor, centered, which_font)); +} + +#if 0 +uint32 DrawText(MDFN_Surface *surface, const MDFN_Rect &rect, const char *textmsg, uint32 color, + bool centered, uint32 which_font) +{ + MDFN_Rect tr = rect; + + if(tr.w < 0 || tr.h < 0) + return; + + if((tr.x + tr.w) > surface->w) + tr.w = surface->w - tr.x; + + if((tr.y + tr.h) > surface->h) + tr.h = surface->h - tr.y; + +} +#endif diff --git a/Mednafen/mednafen/video/text.h b/Mednafen/mednafen/video/text.h new file mode 100644 index 0000000000..1865570b9c --- /dev/null +++ b/Mednafen/mednafen/video/text.h @@ -0,0 +1,33 @@ +#ifndef __MDFN_VIDEO_TEXT_H +#define __MDFN_VIDEO_TEXT_H + +enum +{ + // If the order of these constants is changed, you must also update the array of FontDescriptor + // in text.cpp. + MDFN_FONT_9x18_18x18 = 0, + MDFN_FONT_5x7, + MDFN_FONT_4x5, + MDFN_FONT_6x13_12x13, + + #ifdef WANT_INTERNAL_CJK + MDFN_FONT_12x13, + MDFN_FONT_18x18, + #endif + + _MDFN_FONT_COUNT +}; + +uint32 GetFontHeight(unsigned which_font); + +uint32 GetTextPixLength(const char *msg, uint32 which_font = MDFN_FONT_9x18_18x18); +uint32 GetTextPixLength(const UTF32 *msg, uint32 which_font = MDFN_FONT_9x18_18x18); + +uint32 DrawTextTrans(uint32 *dest, int pitch, uint32 width, const char *textmsg, uint32 fgcolor, int centered, uint32 which_font = MDFN_FONT_9x18_18x18); +uint32 DrawTextTrans(uint32 *dest, int pitch, uint32 width, const UTF32 *textmsg, uint32 fgcolor, int centered, uint32 which_font = MDFN_FONT_9x18_18x18); + + +uint32 DrawTextTransShadow(uint32 *dest, int pitch, uint32 width, const char *textmsg, uint32 fgcolor, uint32 shadcolor,int centered, uint32 which_font = MDFN_FONT_9x18_18x18); +uint32 DrawTextTransShadow(uint32 *dest, int pitch, uint32 width, const std::string &textmsg, uint32 fgcolor, uint32 shadcolor,int centered, uint32 which_font = MDFN_FONT_9x18_18x18); + +#endif diff --git a/Mednafen/mednafen/video/video-common.h b/Mednafen/mednafen/video/video-common.h new file mode 100644 index 0000000000..dd5b4344f3 --- /dev/null +++ b/Mednafen/mednafen/video/video-common.h @@ -0,0 +1,5 @@ +#include "../mednafen.h" +#include "../video.h" +#include "../general.h" +#include "../driver.h" + diff --git a/Mednafen/mednafen/video/video.cpp b/Mednafen/mednafen/video/video.cpp new file mode 100644 index 0000000000..ca445a67ee --- /dev/null +++ b/Mednafen/mednafen/video/video.cpp @@ -0,0 +1,88 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "video-common.h" + +#include +#include +#include +#include +#include + +#include + +#include + +#include "png.h" + +void MDFNI_SaveSnapshot(const MDFN_Surface *src, const MDFN_Rect *rect, const int32 *LineWidths) +{ + try + { + unsigned u = 0; + + try + { + FileStream pp(MDFN_MakeFName(MDFNMKF_SNAP_DAT, 0, NULL), FileStream::MODE_READ); + std::string linebuf; + + if(pp.get_line(linebuf) >= 0) + if(trio_sscanf(linebuf.c_str(), "%u", &u) != 1) + u = 0; + } + catch(std::exception &e) + { + + } + + { + FileStream pp(MDFN_MakeFName(MDFNMKF_SNAP_DAT, 0, NULL), FileStream::MODE_WRITE); + + pp.print_format("%u\n", u + 1); + } + + std::string fn = MDFN_MakeFName(MDFNMKF_SNAP, u, "png"); + + PNGWrite(fn, src, *rect, LineWidths); + + MDFN_DispMessage(_("Screen snapshot %u saved."), u); + } + catch(std::exception &e) + { + MDFN_PrintError(_("Error saving screen snapshot: %s"), e.what()); + MDFN_DispMessage(_("Error saving screen snapshot: %s"), e.what()); + } +} + +void MDFN_DispMessage(const char *format, ...) noexcept +{ + va_list ap; + va_start(ap,format); + char *msg = NULL; + + trio_vasprintf(&msg, format,ap); + va_end(ap); + + MDFND_DispMessage(msg); +} + +void MDFN_ResetMessages(void) +{ + MDFND_DispMessage(NULL); +} + + diff --git a/Mednafen/mednafen/wswan/Makefile.am b/Mednafen/mednafen/wswan/Makefile.am new file mode 100644 index 0000000000..712003bcee --- /dev/null +++ b/Mednafen/mednafen/wswan/Makefile.am @@ -0,0 +1,13 @@ +AUTOMAKE_OPTIONS = subdir-objects +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl + +noinst_LIBRARIES = libwswan.a + +wswan_SOURCES = gfx.cpp main.cpp memory.cpp comm.cpp v30mz.cpp sound.cpp tcache.cpp interrupt.cpp eeprom.cpp rtc.cpp + +if WANT_DEBUGGER +wswan_SOURCES += dis/dis_decode.cpp dis/dis_groups.cpp dis/resolve.cpp dis/syntax.cpp debug.cpp +endif + +libwswan_a_SOURCES = $(wswan_SOURCES) diff --git a/Mednafen/mednafen/wswan/Makefile.in b/Mednafen/mednafen/wswan/Makefile.in new file mode 100644 index 0000000000..8600492534 --- /dev/null +++ b/Mednafen/mednafen/wswan/Makefile.in @@ -0,0 +1,724 @@ +# Makefile.in generated by automake 1.14.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +@WANT_DEBUGGER_TRUE@am__append_1 = dis/dis_decode.cpp dis/dis_groups.cpp dis/resolve.cpp dis/syntax.cpp debug.cpp +subdir = src/wswan +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ + $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/fcntl-o.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/glibc2.m4 \ + $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intl.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/intmax.m4 \ + $(top_srcdir)/m4/inttypes-pri.m4 \ + $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lcmessage.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/lock.m4 $(top_srcdir)/m4/longlong.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \ + $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/uintmax_t.m4 \ + $(top_srcdir)/m4/visibility.m4 $(top_srcdir)/m4/wchar_t.m4 \ + $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LIBRARIES = $(noinst_LIBRARIES) +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libwswan_a_AR = $(AR) $(ARFLAGS) +libwswan_a_LIBADD = +am__libwswan_a_SOURCES_DIST = gfx.cpp main.cpp memory.cpp comm.cpp \ + v30mz.cpp sound.cpp tcache.cpp interrupt.cpp eeprom.cpp \ + rtc.cpp dis/dis_decode.cpp dis/dis_groups.cpp dis/resolve.cpp \ + dis/syntax.cpp debug.cpp +am__dirstamp = $(am__leading_dot)dirstamp +@WANT_DEBUGGER_TRUE@am__objects_1 = dis/dis_decode.$(OBJEXT) \ +@WANT_DEBUGGER_TRUE@ dis/dis_groups.$(OBJEXT) \ +@WANT_DEBUGGER_TRUE@ dis/resolve.$(OBJEXT) dis/syntax.$(OBJEXT) \ +@WANT_DEBUGGER_TRUE@ debug.$(OBJEXT) +am__objects_2 = gfx.$(OBJEXT) main.$(OBJEXT) memory.$(OBJEXT) \ + comm.$(OBJEXT) v30mz.$(OBJEXT) sound.$(OBJEXT) \ + tcache.$(OBJEXT) interrupt.$(OBJEXT) eeprom.$(OBJEXT) \ + rtc.$(OBJEXT) $(am__objects_1) +am_libwswan_a_OBJECTS = $(am__objects_2) +libwswan_a_OBJECTS = $(am_libwswan_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libwswan_a_SOURCES) +DIST_SOURCES = $(am__libwswan_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALSA_CFLAGS = @ALSA_CFLAGS@ +ALSA_LIBS = @ALSA_LIBS@ +AMTAR = @AMTAR@ +AM_CFLAGS = @AM_CFLAGS@ +AM_CXXFLAGS = @AM_CXXFLAGS@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@ +CATOBJEXT = @CATOBJEXT@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAG_VISIBILITY = @CFLAG_VISIBILITY@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DATADIRNAME = @DATADIRNAME@ +DEFS = -DLOCALEDIR=\"$(datadir)/locale\" @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENCAT = @GENCAT@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GLIBC2 = @GLIBC2@ +GLIBC21 = @GLIBC21@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +HAVE_ASPRINTF = @HAVE_ASPRINTF@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_NEWLOCALE = @HAVE_NEWLOCALE@ +HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@ +HAVE_SNPRINTF = @HAVE_SNPRINTF@ +HAVE_VISIBILITY = @HAVE_VISIBILITY@ +HAVE_WPRINTF = @HAVE_WPRINTF@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INSTOBJEXT = @INSTOBJEXT@ +INTLBISON = @INTLBISON@ +INTLLIBS = @INTLLIBS@ +INTLOBJS = @INTLOBJS@ +INTL_DEFAULT_VERBOSITY = @INTL_DEFAULT_VERBOSITY@ +INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBMULTITHREAD = @LIBMULTITHREAD@ +LIBOBJS = @LIBOBJS@ +LIBPTH = @LIBPTH@ +LIBPTH_PREFIX = @LIBPTH_PREFIX@ +LIBS = @LIBS@ +LIBTHREAD = @LIBTHREAD@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBC = @LTLIBC@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBMULTITHREAD = @LTLIBMULTITHREAD@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBPTH = @LTLIBPTH@ +LTLIBTHREAD = @LTLIBTHREAD@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MMX_CFLAGS = @MMX_CFLAGS@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PRI_MACROS_BROKEN = @PRI_MACROS_BROKEN@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ +SNDFILE_LIBS = @SNDFILE_LIBS@ +SNES_EXTRA_CXXFLAGS = @SNES_EXTRA_CXXFLAGS@ +SNES_EXTRA_FLAGS = @SNES_EXTRA_FLAGS@ +SSE2_CFLAGS = @SSE2_CFLAGS@ +SSE3_CFLAGS = @SSE3_CFLAGS@ +SSE_CFLAGS = @SSE_CFLAGS@ +STRIP = @STRIP@ +TRIO_CFLAGS = @TRIO_CFLAGS@ +USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +WARNING_FLAGS = @WARNING_FLAGS@ +WINDRES = @WINDRES@ +WOE32 = @WOE32@ +WOE32DLL = @WOE32DLL@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AUTOMAKE_OPTIONS = subdir-objects +DEFAULT_INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir)/intl +noinst_LIBRARIES = libwswan.a +wswan_SOURCES = gfx.cpp main.cpp memory.cpp comm.cpp v30mz.cpp \ + sound.cpp tcache.cpp interrupt.cpp eeprom.cpp rtc.cpp \ + $(am__append_1) +libwswan_a_SOURCES = $(wswan_SOURCES) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/wswan/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/wswan/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +dis/$(am__dirstamp): + @$(MKDIR_P) dis + @: > dis/$(am__dirstamp) +dis/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) dis/$(DEPDIR) + @: > dis/$(DEPDIR)/$(am__dirstamp) +dis/dis_decode.$(OBJEXT): dis/$(am__dirstamp) \ + dis/$(DEPDIR)/$(am__dirstamp) +dis/dis_groups.$(OBJEXT): dis/$(am__dirstamp) \ + dis/$(DEPDIR)/$(am__dirstamp) +dis/resolve.$(OBJEXT): dis/$(am__dirstamp) \ + dis/$(DEPDIR)/$(am__dirstamp) +dis/syntax.$(OBJEXT): dis/$(am__dirstamp) \ + dis/$(DEPDIR)/$(am__dirstamp) + +libwswan.a: $(libwswan_a_OBJECTS) $(libwswan_a_DEPENDENCIES) $(EXTRA_libwswan_a_DEPENDENCIES) + $(AM_V_at)-rm -f libwswan.a + $(AM_V_AR)$(libwswan_a_AR) libwswan.a $(libwswan_a_OBJECTS) $(libwswan_a_LIBADD) + $(AM_V_at)$(RANLIB) libwswan.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f dis/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/comm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eeprom.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gfx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interrupt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcache.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/v30mz.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dis/$(DEPDIR)/dis_decode.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dis/$(DEPDIR)/dis_groups.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dis/$(DEPDIR)/resolve.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@dis/$(DEPDIR)/syntax.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f dis/$(DEPDIR)/$(am__dirstamp) + -rm -f dis/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) dis/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) dis/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLIBRARIES cscopelist-am ctags \ + ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Mednafen/mednafen/wswan/comm.cpp b/Mednafen/mednafen/wswan/comm.cpp new file mode 100644 index 0000000000..f6acb5f639 --- /dev/null +++ b/Mednafen/mednafen/wswan/comm.cpp @@ -0,0 +1,237 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" + +#include +#include +#include + +#ifdef HAVE_FORK +#include +#include +#endif + +namespace MDFN_IEN_WSWAN +{ + +static uint8 Control; +static uint8 SendBuf, RecvBuf; +static bool SendLatched, RecvLatched; + +static int child_pid = -1; +static int stdin_pipes[2] = { -1, -1 }; +static int stdout_pipes[2] = { -1, -1 }; + +void Comm_Init(const char *wfence_path) +{ + child_pid = -1; + + stdin_pipes[0] = -1; + stdin_pipes[1] = -1; + + stdout_pipes[0] = -1; + stdout_pipes[1] = -1; + +#ifdef HAVE_FORK + if(wfence_path != NULL) + { + pipe(stdin_pipes); + pipe(stdout_pipes); + + child_pid = fork(); + + if(child_pid == -1) + abort(); + else if(child_pid == 0) // Child + { + dup2(stdin_pipes[0], 0); + dup2(stdout_pipes[1], 1); + execlp(wfence_path, wfence_path, "ASDF", NULL); + abort(); + } + + fcntl(stdout_pipes[0], F_SETFL, fcntl(stdout_pipes[0], F_GETFL) | O_NONBLOCK); + } +#endif +} + +void Comm_Kill(void) +{ +#ifdef HAVE_FORK + if(child_pid != -1) + { + int status; + + kill(child_pid, SIGTERM); + waitpid(child_pid, &status, 0); + + child_pid = -1; + } +#endif + + for(unsigned i = 0; i < 2; i++) + { + if(stdin_pipes[i] != -1) + { + close(stdin_pipes[i]); + stdin_pipes[i] = -1; + } + + if(stdout_pipes[i] != -1) + { + close(stdout_pipes[i]); + stdout_pipes[i] = -1; + } + } +} + +void Comm_Reset(void) +{ + SendBuf = 0x00; + RecvBuf = 0x00; + + SendLatched = false; + RecvLatched = false; + + Control = 0x00; + + WSwan_InterruptAssert(WSINT_SERIAL_RECV, RecvLatched); + + //if(child_pid != -1) + // kill(child_pid, SIGUSR1); +} + +void Comm_Process(void) +{ + if(SendLatched && (Control & 0x80)) + { + if(stdin_pipes[1] != -1) + { + if(write(stdin_pipes[1], &SendBuf, 1) == 1) + { + //printf("SENT: %02x %d\n", SendBuf, RecvLatched); + SendLatched = false; + WSwan_Interrupt(WSINT_SERIAL_SEND); + } + } + else + { + //printf("DummySend: %02x %d\n", SendBuf, RecvLatched); + SendLatched = false; + WSwan_Interrupt(WSINT_SERIAL_SEND); + } + } + else if(!RecvLatched && (Control & 0x20)) + { + if(stdout_pipes[0] != -1) + { + if(read(stdout_pipes[0], &RecvBuf, 1) == 1) + { + //printf("RECEIVED: %02x\n", RecvBuf); + RecvLatched = true; + WSwan_InterruptAssert(WSINT_SERIAL_RECV, RecvLatched); + } + } + } +} + +uint8 Comm_Read(uint8 A) +{ + //printf("Read: %02x\n", A); + + if(A == 0xB1) + { + if(!WS_InDebug) + { + RecvLatched = false; + WSwan_InterruptAssert(WSINT_SERIAL_RECV, RecvLatched); + } + + return(RecvBuf); + } + else if(A == 0xB3) + { + uint8 ret = Control & 0xF0; + + if((Control & 0x80) && !SendLatched) + ret |= 0x4; + + if((Control & 0x20) && RecvLatched) + ret |= 0x1; + + return(ret); + } + + return(0x00); +} + +void Comm_Write(uint8 A, uint8 V) +{ + //printf("Write: %02x %02x\n", A, V); + + if(A == 0xB1) + { + if(Control & 0x80) + { + SendBuf = V; + SendLatched = true; + } + } + else if(A == 0xB3) + { + Control = V & 0xF0; + } +} + +void Comm_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(SendBuf), + SFVAR(RecvBuf), + + SFVAR(SendLatched), + SFVAR(RecvLatched), + + SFVAR(Control), + + SFEND + }; + + if(load && load < 0x0936) + { + SendBuf = 0x00; + RecvBuf = 0x00; + + SendLatched = false; + RecvLatched = false; + + Control = 0x00; + } + else + { + MDFNSS_StateAction(sm, load, data_only, StateRegs, "COMM"); + + if(load) + { + WSwan_InterruptAssert(WSINT_SERIAL_RECV, RecvLatched); + } + } +} + +} diff --git a/Mednafen/mednafen/wswan/comm.h b/Mednafen/mednafen/wswan/comm.h new file mode 100644 index 0000000000..f205be9c47 --- /dev/null +++ b/Mednafen/mednafen/wswan/comm.h @@ -0,0 +1,30 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +namespace MDFN_IEN_WSWAN +{ + +void Comm_Init(const char *wfence_path); +void Comm_Kill(void); +void Comm_Reset(void); +void Comm_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +void Comm_Process(void); +uint8 Comm_Read(uint8 A); +void Comm_Write(uint8 A, uint8 V); + +} diff --git a/Mednafen/mednafen/wswan/debug.cpp b/Mednafen/mednafen/wswan/debug.cpp new file mode 100644 index 0000000000..82bfe3a4c0 --- /dev/null +++ b/Mednafen/mednafen/wswan/debug.cpp @@ -0,0 +1,491 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "v30mz.h" +#include "debug.h" +#include "dis/disasm.h" +#include "memory.h" +#include "gfx.h" +#include +#include + +namespace MDFN_IEN_WSWAN +{ + +#define NUMBT 32 + +static bool BTEnabled; +static int BTIndex; + +struct BTEntry +{ + uint16 from_CS; + uint16 from_IP; + uint16 to_CS; + uint16 to_IP; + + bool interrupt; + uint32 branch_count; + + bool valid; +}; + +static BTEntry BTEntries[NUMBT]; + +struct WSWAN_BPOINT +{ + unsigned int A[2]; + int type; + bool logical; +}; + +static std::vector BreakPointsPC, BreakPointsRead, BreakPointsWrite, BreakPointsIORead, BreakPointsIOWrite, BreakPointsAux0Read, BreakPointsAux0Write; + +static void (*CPUHook)(uint32 PC, bool bpoint) = NULL; +static bool CPUHookContinuous = false; +static bool FoundBPoint = 0; + +void WSwanDBG_IRQ(int level) +{ + if(level >= 0 && level < 8) + { + //WSwan_Interrupt(level); + WSwan_InterruptDebugForce(level); + } +} + +static uint8 ReadHandler(uint32 A) +{ + std::vector::iterator bpit; + uint8 ret; + + for(bpit = BreakPointsRead.begin(); bpit != BreakPointsRead.end(); bpit++) + { + unsigned int testA = A; + + if(testA >= bpit->A[0] && testA <= bpit->A[1]) + { + FoundBPoint = 1; + break; + } + } + + WS_InDebug++; + ret = WSwan_readmem20(A); + WS_InDebug--; + + return(ret); +} + +static void WriteHandler(uint32 A, uint8 V) +{ + std::vector::iterator bpit; + + for(bpit = BreakPointsWrite.begin(); bpit != BreakPointsWrite.end(); bpit++) + { + unsigned int testA = A; + + if(testA >= bpit->A[0] && testA <= bpit->A[1]) + { + FoundBPoint = 1; + break; + } + } +} + +static uint8 PortReadHandler(uint32 A) +{ + std::vector::iterator bpit; + uint8 ret; + + for(bpit = BreakPointsIORead.begin(); bpit != BreakPointsIORead.end(); bpit++) + { + unsigned int testA = A & 0xFF; + + if(testA >= (bpit->A[0] & 0xFF) && testA <= (bpit->A[1] & 0xFF)) + { + FoundBPoint = 1; + break; + } + } + + WS_InDebug++; + ret = WSwan_readport(A); + WS_InDebug--; + + return(ret); +} + +static void PortWriteHandler(uint32 A, uint8 V) +{ + std::vector::iterator bpit; + + for(bpit = BreakPointsIOWrite.begin(); bpit != BreakPointsIOWrite.end(); bpit++) + { + unsigned int testA = A & 0xFF; + + if(testA >= (bpit->A[0] & 0xFF) && testA <= (bpit->A[1] & 0xFF)) + { + FoundBPoint = 1; + break; + } + } +} + +static void CPUHandler(uint32 PC) +{ + std::vector::iterator bpit; + + if(!FoundBPoint) + for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) + { + if(PC >= bpit->A[0] && PC <= bpit->A[1]) + { + FoundBPoint = true; + break; + } + } + + CPUHookContinuous |= FoundBPoint; + + if(CPUHookContinuous && CPUHook) + { + // TODO: Sync devices here. + CPUHook(PC, FoundBPoint); + } + + FoundBPoint = false; +} + +static void RedoDH(void) +{ + bool needch = CPUHook || BreakPointsPC.size() || BreakPointsRead.size() || BreakPointsAux0Read.size() || + BreakPointsWrite.size() || BreakPointsAux0Write.size() || + BreakPointsIORead.size() || BreakPointsIOWrite.size(); + + v30mz_debug(needch ? CPUHandler : NULL, + (BreakPointsRead.size() || BreakPointsAux0Read.size()) ? ReadHandler : NULL, + (BreakPointsWrite.size() || BreakPointsAux0Write.size()) ? WriteHandler : 0, + (BreakPointsIORead.size()) ? PortReadHandler : NULL, + (BreakPointsIOWrite.size()) ? PortWriteHandler : NULL, + BTEnabled ? WSwanDBG_AddBranchTrace : NULL); +} + +void WSwanDBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) +{ + CPUHook = callb; + CPUHookContinuous = continuous; + RedoDH(); +} + +void WSwanDBG_FlushBreakPoints(int type) +{ + if(type == BPOINT_READ) + BreakPointsRead.clear(); + else if(type == BPOINT_WRITE) + BreakPointsWrite.clear(); + else if(type == BPOINT_IO_READ) + BreakPointsIORead.clear(); + else if(type == BPOINT_IO_WRITE) + BreakPointsIOWrite.clear(); + else if(type == BPOINT_PC) + BreakPointsPC.clear(); + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.clear(); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.clear(); + + RedoDH(); +} + +void WSwanDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) +{ + WSWAN_BPOINT tmp; + + tmp.A[0] = A1; + tmp.A[1] = A2; + tmp.type =type; + tmp.logical = logical; + + if(type == BPOINT_READ) + BreakPointsRead.push_back(tmp); + else if(type == BPOINT_WRITE) + BreakPointsWrite.push_back(tmp); + else if(type == BPOINT_IO_READ) + BreakPointsIORead.push_back(tmp); + else if(type == BPOINT_IO_WRITE) + BreakPointsIOWrite.push_back(tmp); + else if(type == BPOINT_PC) + BreakPointsPC.push_back(tmp); + else if(type == BPOINT_AUX_READ) + BreakPointsAux0Read.push_back(tmp); + else if(type == BPOINT_AUX_WRITE) + BreakPointsAux0Write.push_back(tmp); + + RedoDH(); +} + +uint32 WSwanDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) +{ + uint32 ss = v30mz_get_reg(NEC_SS); + uint32 ret = 0; + + WS_InDebug++; + + for(unsigned int i = 0; i < bsize; i++) + { + uint8 zebyte; + + if(logical) + zebyte = WSwan_readmem20(((ss << 4) + A + i) & 0xFFFFF); + else + zebyte = WSwan_readmem20((A + i) & 0xFFFFF); + ret |= zebyte << (i * 8); + } + + WS_InDebug--; + + return(ret); +} + +void WSwanDBG_AddBranchTrace(uint16 from_CS, uint16 from_IP, uint16 to_CS, uint16 to_IP, bool interrupt) +{ + BTEntry *prevbt = &BTEntries[(BTIndex + NUMBT - 1) % NUMBT]; + + if(prevbt->from_CS == from_CS && prevbt->to_CS == to_CS && + prevbt->from_IP == from_IP && prevbt->to_IP == to_IP && + prevbt->interrupt == interrupt && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid) + prevbt->branch_count++; + else + { + BTEntries[BTIndex].from_CS = from_CS; + BTEntries[BTIndex].to_CS = to_CS; + BTEntries[BTIndex].from_IP = from_IP; + BTEntries[BTIndex].to_IP = to_IP; + + BTEntries[BTIndex].interrupt = interrupt; + BTEntries[BTIndex].branch_count = 1; + + BTEntries[BTIndex].valid = true; + + BTIndex = (BTIndex + 1) % NUMBT; + } +} + +void WSwanDBG_EnableBranchTrace(bool enable) +{ + BTEnabled = enable; + if(!enable) + { + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + } + RedoDH(); +} + +std::vector WSwanDBG_GetBranchTrace(void) +{ + BranchTraceResult tmp; + std::vector ret; + + for(int x = 0; x < NUMBT; x++) + { + const BTEntry *bt = &BTEntries[(x + BTIndex) % NUMBT]; + + if(!bt->valid) + continue; + + tmp.count = bt->branch_count; + trio_snprintf(tmp.from, sizeof(tmp.from), "%04X:%04X", bt->from_CS, bt->from_IP); + trio_snprintf(tmp.to, sizeof(tmp.to), "%04X:%04X", bt->to_CS, bt->to_IP); + trio_snprintf(tmp.code, sizeof(tmp.code), bt->interrupt ? "INT" : ""); + + ret.push_back(tmp); + } + return(ret); +} + + +void WSwanDBG_CheckBP(int type, uint32 address, unsigned int len) +{ + + +} + +void WSwanDBG_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + + +} + +void WSwanDBG_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, const uint8 *Buffer) +{ + + +} + +static disassembler zedis; + +void WSwanDBG_Disassemble(uint32 &a, uint32 SpecialA, char *text_buffer) +{ + uint32 mis = MDFNGameInfo->Debugger->MaxInstructionSize; + mis = 256; + uint8 instr_buffer[mis]; + uint32 ps = v30mz_get_reg(NEC_PS); + int consumed; + + WS_InDebug++; + for(unsigned int i = 0; i < mis; i++) + { + instr_buffer[i] = WSwan_readmem20(((ps << 4) + a + i) & 0xFFFFF); + } + WS_InDebug--; + + consumed = zedis.disasm(0x0000, a, instr_buffer, text_buffer); + + for(int i = 1; i < consumed; i++) + { + if(((a + i) & 0xFFFF) == SpecialA) + { + strcpy(text_buffer, "--------"); + consumed = i; + break; + } + } + + int x; + for(x = strlen(text_buffer); x < 40; x++) + text_buffer[x] = ' '; + text_buffer[x] = 0; + + for(int i = 0; i < consumed; i++) + { + char tmp[16]; + trio_snprintf(tmp, 16, " %02x", instr_buffer[i]); + strcat(text_buffer, tmp); + } + + a = (a + consumed) & 0xFFFF; +} + +void WSwanDBG_ToggleSyntax(void) +{ + zedis.toggle_syntax_mode(); +} + + + +// +// +// + +static RegType V30MZ_Regs[] = +{ + { NEC_PC, "IP", "Instruction Pointer", 2 }, + { NEC_FLAGS, "PSW", "Program Status Word", 2 }, + { NEC_AW, "AX", "Accumulator", 2 }, + { NEC_BW, "BX", "Base", 2 }, + { NEC_CW, "CX", "Counter", 2 }, + { NEC_DW, "DX", "Data", 2 }, + { NEC_SP, "SP", "Stack Pointer", 2 }, + { NEC_BP, "BP", "Base Pointer", 2 }, + { NEC_IX, "SI", "Source Index", 2 }, + { NEC_IY, "DI", "Dest Index", 2 }, + { NEC_PS, "CS", "Program Segment", 2 }, + { NEC_SS, "SS", "Stack Segment", 2 }, + { NEC_DS0, "DS", "Data Segment", 2 }, + { NEC_DS1, "ES", "Extra Segment(Destination)", 2 }, + { 0, "", "", 0 }, +}; + + +static uint32 V30MZ_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + return(v30mz_get_reg(id)); +} + +static void V30MZ_SetRegister(const unsigned int id, uint32 value) +{ + v30mz_set_reg(id, value); +} + + +static RegGroupType V30MZRegsGroup = +{ + "V30MZ", + V30MZ_Regs, + V30MZ_GetRegister, + V30MZ_SetRegister, +}; + +// +// + +static RegType MiscRegs[] = +{ + { MEMORY_GSREG_ROMBBSLCT, "ROMBBSLCT", "ROM Bank Base Selector for 64KiB banks 0x4-0xF", 1 }, + { MEMORY_GSREG_BNK1SLCT, "BNK1SLCT", "???", 1 }, + { MEMORY_GSREG_BNK2SLCT, "BNK2SLCT", "ROM Bank Selector for 64KiB bank 0x2", 1 }, + { MEMORY_GSREG_BNK3SLCT, "BNK3SLCT", "ROM Bank Selector for 64KiB bank 0x3", 1 }, + + { 0x8000 | INT_GSREG_IASSERTED, "IAsserted", "Interrupt Asserted", 1 }, + { 0x8000 | INT_GSREG_ISTATUS, "IStatus", "Interrupt Status", 1 }, + { 0x8000 | INT_GSREG_IENABLE, "IEnable", "Interrupt Enable", 1 }, + { 0x8000 | INT_GSREG_IVECTORBASE, "IVectorBase", "Interrupt Vector Base", 1 }, + { 0, "", "", 0 }, +}; + +static uint32 Misc_GetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + if(id & 0x8000) + return(WSwan_InterruptGetRegister(id & ~0x8000, special, special_len)); + else + return(WSwan_MemoryGetRegister(id, special, special_len)); +} + +static void Misc_SetRegister(const unsigned int id, uint32 value) +{ + if(id & 0x8000) + WSwan_InterruptSetRegister(id & ~0x8000, value); + else + WSwan_MemorySetRegister(id, value); +} + + +static RegGroupType MiscRegsGroup = +{ + "Misc", + MiscRegs, + Misc_GetRegister, + Misc_SetRegister, +}; + +void WSwanDBG_Init(void) +{ + WS_InDebug = 0; + + BTEnabled = false; + BTIndex = 0; + memset(BTEntries, 0, sizeof(BTEntries)); + + MDFNDBG_AddRegGroup(&V30MZRegsGroup); + MDFNDBG_AddRegGroup(&MiscRegsGroup); +} + + +} diff --git a/Mednafen/mednafen/wswan/debug.h b/Mednafen/mednafen/wswan/debug.h new file mode 100644 index 0000000000..155653a1ed --- /dev/null +++ b/Mednafen/mednafen/wswan/debug.h @@ -0,0 +1,38 @@ +#ifndef __WSWAN_DEBUG_H +#define __WSWAN_DEBUG_H + +namespace MDFN_IEN_WSWAN +{ + + + +#ifdef WANT_DEBUGGER + +void WSwanDBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous); + +void WSwanDBG_FlushBreakPoints(int type); +void WSwanDBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical); + +uint32 WSwanDBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical); +void WSwanDBG_Disassemble(uint32 &a, uint32 SpecialA, char *); + +void WSwanDBG_AddBranchTrace(uint16 old_CS, uint16 old_IP, uint16 CS, uint16 IP, bool interrupt); +void WSwanDBG_EnableBranchTrace(bool enable); +std::vector WSwanDBG_GetBranchTrace(void); + +void WSwanDBG_CheckBP(int type, uint32 address, unsigned int len); + +void WSwanDBG_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer); +void WSwanDBG_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, const uint8 *Buffer); + + +void WSwanDBG_ToggleSyntax(void); +void WSwanDBG_IRQ(int level); + +void WSwanDBG_Init(void); + +#endif + +} + +#endif diff --git a/Mednafen/mednafen/wswan/dis/dis_decode.cpp b/Mednafen/mednafen/wswan/dis/dis_decode.cpp new file mode 100644 index 0000000000..c766e36d01 --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/dis_decode.cpp @@ -0,0 +1,256 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: dis_decode.cc,v 1.32 2006/05/12 17:04:19 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#include "disasm.h" +#include "dis_tables.h" + +#include +#include +#include + +x86_insn::x86_insn() +{ + extend8b = 0; + seg_override = NO_SEG_OVERRIDE; + prefixes = 0; + ilen = 0; + b1 = 0; + + modrm = mod = nnn = rm = 0; + sib = scale = index = base = 0; + displacement.displ32 = 0; +} + +#define OPCODE(entry) ((BxDisasmOpcodeInfo_t*) entry->OpcodeInfo) +#define OPCODE_TABLE(entry) ((BxDisasmOpcodeTable_t*) entry->OpcodeInfo) + +static const unsigned char instruction_has_modrm[512] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, + /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, + /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* A0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* B0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* C0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, + /* D0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, + /* E0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* F0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1, + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /* ------------------------------- */ + 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0F 00 */ + 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1, /* 0F 10 */ + 1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, /* 0F 20 */ + 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 0F 30 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 40 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 50 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 60 */ + 1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1, /* 0F 70 */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0F 80 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F 90 */ + 0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, /* 0F A0 */ + 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1, /* 0F B0 */ + 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* 0F C0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F D0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 0F E0 */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 /* 0F F0 */ + /* ------------------------------- */ + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ +}; + +unsigned disassembler::disasm(bx_address base, bx_address ip, const uint8 *instr, char *disbuf) +{ + x86_insn insn = decode(base, ip, instr, disbuf); + return insn.ilen; +} + +x86_insn disassembler::decode(bx_address base, bx_address ip, const uint8 *instr, char *disbuf) +{ + x86_insn insn; + const uint8 *instruction_begin = instruction = instr; + resolve_modrm = NULL; + unsigned b3 = 0; + + db_eip = ip; + db_base = base; // cs linear base (base for PM & cs<<4 for RM & VM) + + disbufptr = disbuf; // start sprintf()'ing into beginning of buffer + + for(;;) + { + if(insn.prefixes == 7) // V30MZ only supports 7 prefixes reliably + break; + insn.b1 = fetch_byte(); + insn.prefixes++; + + switch(insn.b1) { + case 0x26: // ES: + insn.seg_override = ES_REG; + continue; + + case 0x2e: // CS: + insn.seg_override = CS_REG; + continue; + + case 0x36: // SS: + insn.seg_override = SS_REG; + continue; + + case 0x3e: // DS: + insn.seg_override = DS_REG; + continue; + + case 0x64: // FS: + insn.seg_override = FS_REG; + continue; + + case 0x65: // GS: + insn.seg_override = GS_REG; + continue; + + case 0xf0: // lock + continue; + + case 0xf2: // repne + continue; + + case 0xf3: // rep + continue; + + // no more prefixes + default: + break; + } + + insn.prefixes--; + break; + } + + if (insn.b1 == 0x0f) + { + insn.b1 = 0x100 | fetch_byte(); + } + + const BxDisasmOpcodeTable_t *opcode_table, *entry; + + opcode_table = BxDisasmOpcodes16; + + entry = opcode_table + insn.b1; + + // will require 3rd byte for 3-byte opcode + if (entry->Attr & _GRP3BTAB) b3 = fetch_byte(); + + if (instruction_has_modrm[insn.b1]) + { + decode_modrm(&insn); + } + + int attr = entry->Attr; + while(attr) + { + switch(attr) { + case _GROUPN: + entry = &(OPCODE_TABLE(entry)[insn.nnn]); + break; + + case _SPLIT11B: + entry = &(OPCODE_TABLE(entry)[insn.mod != 3]); /* REG/MEM */ + break; + + case _GRPRM: + entry = &(OPCODE_TABLE(entry)[insn.rm]); + break; + + case _GRP3BTAB: + entry = &(OPCODE_TABLE(entry)[b3 >> 4]); + break; + + case _GRP3BOP: + entry = &(OPCODE_TABLE(entry)[b3 & 15]); + break; + + default: + printf("Internal disassembler error - unknown attribute !\n"); + return x86_insn(); + } + + /* get additional attributes from group table */ + attr = entry->Attr; + } + +#define BRANCH_NOT_TAKEN 0x2E +#define BRANCH_TAKEN 0x3E + + unsigned branch_hint = 0; + + // print prefixes + for(unsigned i=0;iIntelOpcode); + } + + // branch hint for jcc instructions + if ((insn.b1 >= 0x070 && insn.b1 <= 0x07F) || + (insn.b1 >= 0x180 && insn.b1 <= 0x18F)) + { + if (prefix_byte == BRANCH_NOT_TAKEN || prefix_byte == BRANCH_TAKEN) + branch_hint = prefix_byte; + } + } + + const BxDisasmOpcodeInfo_t *opcode = OPCODE(entry); + + // fix nop opcode + if (insn.b1 == 0x90) { + opcode = &Ia_nop; + } + + // print instruction disassembly + if (intel_mode) + print_disassembly_intel(&insn, opcode); + else + print_disassembly_att (&insn, opcode); + + if (branch_hint == BRANCH_NOT_TAKEN) + { + dis_sprintf(", not taken"); + } + else if (branch_hint == BRANCH_TAKEN) + { + dis_sprintf(", taken"); + } + + insn.ilen = (unsigned)(instruction - instruction_begin); + + return insn; +} + +void disassembler::dis_sprintf(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vsprintf(disbufptr, fmt, ap); + va_end(ap); + + disbufptr += strlen(disbufptr); +} + +void disassembler::dis_putc(char symbol) +{ + *disbufptr++ = symbol; + *disbufptr = 0; +} diff --git a/Mednafen/mednafen/wswan/dis/dis_groups.cpp b/Mednafen/mednafen/wswan/dis/dis_groups.cpp new file mode 100644 index 0000000000..e007d8ad70 --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/dis_groups.cpp @@ -0,0 +1,304 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: dis_groups.cc,v 1.33 2006/08/13 09:40:07 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#include "disasm.h" +#include +#include + +/* +#if BX_DEBUGGER +#include "../bx_debug/debug.h" +#endif +*/ + +void disassembler::Apw(const x86_insn *insn) +{ + uint16 imm16 = fetch_word(); + uint16 cs_selector = fetch_word(); + dis_sprintf("%04x:%04x", (unsigned) cs_selector, (unsigned) imm16); +} + +void disassembler::Apd(const x86_insn *insn) +{ + uint32 imm32 = fetch_dword(); + uint16 cs_selector = fetch_word(); + dis_sprintf("%04x:%08x", (unsigned) cs_selector, (unsigned) imm32); +} + +// 8-bit general purpose registers +void disassembler::AL(const x86_insn *insn) { dis_sprintf("%s", general_8bit_regname[rAX_REG]); } +void disassembler::CL(const x86_insn *insn) { dis_sprintf("%s", general_8bit_regname[rCX_REG]); } + +// 16-bit general purpose registers +void disassembler::AX(const x86_insn *insn) { + dis_sprintf("%s", general_16bit_regname[rAX_REG]); +} + +void disassembler::DX(const x86_insn *insn) { + dis_sprintf("%s", general_16bit_regname[rDX_REG]); +} + +// segment registers +void disassembler::CS(const x86_insn *insn) { dis_sprintf("%s", segment_name[CS_REG]); } +void disassembler::DS(const x86_insn *insn) { dis_sprintf("%s", segment_name[DS_REG]); } +void disassembler::ES(const x86_insn *insn) { dis_sprintf("%s", segment_name[ES_REG]); } +void disassembler::SS(const x86_insn *insn) { dis_sprintf("%s", segment_name[SS_REG]); } + +void disassembler::Sw(const x86_insn *insn) { dis_sprintf("%s", segment_name[insn->nnn]); } + +// test registers +void disassembler::Td(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("tr%d", insn->nnn); + else + dis_sprintf("%%tr%d", insn->nnn); +} + +// control register +void disassembler::Cd(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("cr%d", insn->nnn); + else + dis_sprintf("%%cr%d", insn->nnn); +} + +void disassembler::Cq(const x86_insn *insn) { Cd(insn); } + +// debug register +void disassembler::Dd(const x86_insn *insn) +{ + if (intel_mode) + dis_sprintf ("db%d", insn->nnn); + else + dis_sprintf("%%db%d", insn->nnn); +} + +void disassembler::Dq(const x86_insn *insn) { Dd(insn); } + +// 8-bit general purpose register +void disassembler::R8(const x86_insn *insn) +{ + unsigned reg = (insn->b1 & 7); + + dis_sprintf("%s", general_8bit_regname[reg]); +} + +// 16-bit general purpose register +void disassembler::RX(const x86_insn *insn) +{ + dis_sprintf("%s", general_16bit_regname[(insn->b1 & 7)]); +} + +// general purpose register or memory operand +void disassembler::Eb(const x86_insn *insn) +{ + if (insn->mod == 3) { + dis_sprintf("%s", general_8bit_regname[insn->rm]); + } + else + (this->*resolve_modrm)(insn, B_SIZE); +} + +void disassembler::Ew(const x86_insn *insn) +{ + if (insn->mod == 3) + dis_sprintf("%s", general_16bit_regname[insn->rm]); + else + (this->*resolve_modrm)(insn, W_SIZE); +} + +// general purpose register +void disassembler::Gb(const x86_insn *insn) +{ + dis_sprintf("%s", general_8bit_regname[insn->nnn]); +} + +void disassembler::Gw(const x86_insn *insn) +{ + dis_sprintf("%s", general_16bit_regname[insn->nnn]); +} + +// immediate +void disassembler::I1(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_putc ('1'); +} + +void disassembler::Ib(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_sprintf("0x%02x", (unsigned) fetch_byte()); +} + +void disassembler::Iw(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + dis_sprintf("0x%04x", (unsigned) fetch_word()); +} + +void disassembler::IwIb(const x86_insn *insn) +{ + uint16 iw = fetch_word(); + uint8 ib = fetch_byte(); + + if (intel_mode) { + dis_sprintf("0x%04x, 0x%02x", iw, ib); + } + else { + dis_sprintf("$0x%02x, $0x%04x", ib, iw); + } +} + +// sign extended immediate +void disassembler::sIbw(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + uint16 imm16 = (int8) fetch_byte(); + dis_sprintf("0x%04x", (unsigned) imm16); +} + +// sign extended immediate +void disassembler::sIbd(const x86_insn *insn) +{ + if (! intel_mode) dis_putc('$'); + uint32 imm32 = (int8) fetch_byte(); + dis_sprintf ("0x%08x", (unsigned) imm32); +} + +// 16-bit general purpose register +void disassembler::Rw(const x86_insn *insn) +{ + dis_sprintf("%s", general_16bit_regname[insn->rm]); +} + +// direct memory access +void disassembler::OP_O(const x86_insn *insn, unsigned size) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = segment_name[DS_REG]; + + print_datasize(size); + + uint16 imm16 = fetch_word(); + dis_sprintf("%s:0x%x", seg, (unsigned) imm16); +} + +void disassembler::Ob(const x86_insn *insn) { OP_O(insn, B_SIZE); } +void disassembler::Ow(const x86_insn *insn) { OP_O(insn, W_SIZE); } +void disassembler::Od(const x86_insn *insn) { OP_O(insn, D_SIZE); } +void disassembler::Oq(const x86_insn *insn) { OP_O(insn, Q_SIZE); } + +// memory operand +void disassembler::OP_M(const x86_insn *insn, unsigned size) +{ + if(insn->mod == 3) + dis_sprintf("(bad)"); + else + (this->*resolve_modrm)(insn, size); +} + +void disassembler::Ma(const x86_insn *insn) { OP_M(insn, X_SIZE); } +void disassembler::Mp(const x86_insn *insn) { OP_M(insn, X_SIZE); } +void disassembler::Ms(const x86_insn *insn) { OP_M(insn, X_SIZE); } +void disassembler::Mx(const x86_insn *insn) { OP_M(insn, X_SIZE); } + +void disassembler::Mb(const x86_insn *insn) { OP_M(insn, B_SIZE); } +void disassembler::Mw(const x86_insn *insn) { OP_M(insn, W_SIZE); } +void disassembler::Md(const x86_insn *insn) { OP_M(insn, D_SIZE); } +void disassembler::Mq(const x86_insn *insn) { OP_M(insn, Q_SIZE); } +void disassembler::Mt(const x86_insn *insn) { OP_M(insn, T_SIZE); } + +void disassembler::Mdq(const x86_insn *insn) { OP_M(insn, O_SIZE); } +void disassembler::Mps(const x86_insn *insn) { OP_M(insn, O_SIZE); } +void disassembler::Mpd(const x86_insn *insn) { OP_M(insn, O_SIZE); } + +// string instructions +void disassembler::OP_X(const x86_insn *insn, unsigned size) +{ + const char *rsi, *seg; + + rsi = general_16bit_regname[rSI_REG]; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = segment_name[DS_REG]; + + print_datasize(size); + + if (intel_mode) + dis_sprintf("%s:[%s]", seg, rsi); + else + dis_sprintf("%s:(%s)", seg, rsi); +} + +void disassembler::Xb(const x86_insn *insn) { OP_X(insn, B_SIZE); } +void disassembler::Xw(const x86_insn *insn) { OP_X(insn, W_SIZE); } +void disassembler::Xd(const x86_insn *insn) { OP_X(insn, D_SIZE); } +void disassembler::Xq(const x86_insn *insn) { OP_X(insn, Q_SIZE); } + +void disassembler::OP_Y(const x86_insn *insn, unsigned size) +{ + const char *rdi; + + rdi = general_16bit_regname[rDI_REG]; + + print_datasize(size); + + if (intel_mode) + dis_sprintf("%s:[%s]", segment_name[ES_REG], rdi); + else + dis_sprintf("%s:(%s)", segment_name[ES_REG], rdi); +} + +void disassembler::Yb(const x86_insn *insn) { OP_Y(insn, B_SIZE); } +void disassembler::Yw(const x86_insn *insn) { OP_Y(insn, W_SIZE); } +void disassembler::Yd(const x86_insn *insn) { OP_Y(insn, D_SIZE); } +void disassembler::Yq(const x86_insn *insn) { OP_Y(insn, Q_SIZE); } + +#define BX_JUMP_TARGET_NOT_REQ ((bx_address)(-1)) + +// jump offset +void disassembler::Jb(const x86_insn *insn) +{ + int8 imm8 = (int8) fetch_byte(); + + uint16 imm16 = (int16) imm8; + dis_sprintf(".+0x%04x", (unsigned) imm16); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + uint16 target = (db_eip + (int16) imm16) & 0xffff; + dis_sprintf(" (0x%08x)", target + db_base); + } +} + +void disassembler::Jw(const x86_insn *insn) +{ + uint16 imm16 = (int16) fetch_word(); + dis_sprintf(".+0x%04x", (unsigned) imm16); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + uint16 target = (db_eip + (int16) imm16) & 0xffff; + dis_sprintf(" (0x%08x)", target + db_base); + } +} + +void disassembler::Jd(const x86_insn *insn) +{ + int32 imm32 = (int32) fetch_dword(); + + dis_sprintf(".+0x%08x", (unsigned) imm32); + + if (db_base != BX_JUMP_TARGET_NOT_REQ) { + uint32 target = db_eip + (int32) imm32; target += db_base; + dis_sprintf(" (0x%08x)", target); + } +} diff --git a/Mednafen/mednafen/wswan/dis/dis_tables.h b/Mednafen/mednafen/wswan/dis/dis_tables.h new file mode 100755 index 0000000000..46fcd4a5b7 --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/dis_tables.h @@ -0,0 +1,148 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: dis_tables.h,v 1.29 2006/04/27 15:11:45 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#ifndef _BX_DISASM_TABLES_ +#define _BX_DISASM_TABLES_ + +// opcode table attributes +#define _GROUPN 1 +#define _SPLIT11B 2 +#define _GRPFP 3 +#define _GRPSSE 5 +#define _GRPRM 6 +#define _GRP3BOP 7 +#define _GRP3BTAB 8 + +/* ************************************************************************ */ +#define GRPSSE(n) _GRPSSE, BxDisasmGroupSSE_##n +#define GRPN(n) _GROUPN, BxDisasmGroup##n +#define GRPRM(n) _GRPRM, BxDisasmGroupRm##n +#define GRPMOD(n) _SPLIT11B, BxDisasmGroupMod##n +#define GRPFP(n) _GRPFP, BxDisasmFPGroup##n +#define GR3BOP(n) _GRP3BOP, BxDisasm3ByteOp##n +#define GR3BTAB(n) _GRP3BTAB, BxDisasm3ByteTable##n +/* ************************************************************************ */ + +#define Apw &disassembler::Apw +#define Apd &disassembler::Apd + +#define AL &disassembler::AL +#define CL &disassembler::CL +#define AX &disassembler::AX +#define DX &disassembler::DX + +#define EAX &disassembler::EAX +#define RAX &disassembler::RAX + +#define CS &disassembler::CS +#define DS &disassembler::DS +#define ES &disassembler::ES +#define SS &disassembler::SS +#define FS &disassembler::FS +#define GS &disassembler::GS + +#define Sw &disassembler::Sw + +#define Td &disassembler::Td + +#define Cd &disassembler::Cd +#define Cq &disassembler::Cq + +#define Dd &disassembler::Dd +#define Dq &disassembler::Dq + +#define R8 &disassembler::R8 +#define RX &disassembler::RX + +#define Eb &disassembler::Eb +#define Ew &disassembler::Ew +#define Ed &disassembler::Ed +#define Eq &disassembler::Eq + +#define Gb &disassembler::Gb +#define Gw &disassembler::Gw +#define Gd &disassembler::Gd +#define Gq &disassembler::Gq + +#define I1 &disassembler::I1 +#define Ib &disassembler::Ib +#define Iw &disassembler::Iw +#define Id &disassembler::Id +#define Iq &disassembler::Iq + +#define IwIb &disassembler::IwIb + +#define sIbw &disassembler::sIbw +#define sIbd &disassembler::sIbd +#define sIbq &disassembler::sIbq +#define sIdq &disassembler::sIdq + +#define ST0 &disassembler::ST0 +#define STi &disassembler::STi + +#define Rw &disassembler::Rw +#define Rd &disassembler::Rd +#define Rq &disassembler::Rq + +#define Pq &disassembler::Pq +#define Qd &disassembler::Qd +#define Qq &disassembler::Qq +#define Nq &disassembler::Nq + +#define Vq &disassembler::Vq +#define Vdq &disassembler::Vdq +#define Vss &disassembler::Vss +#define Vsd &disassembler::Vsd +#define Vps &disassembler::Vps +#define Vpd &disassembler::Vpd +#define Udq &disassembler::Udq + +#define Wq &disassembler::Wq +#define Wdq &disassembler::Wdq +#define Wss &disassembler::Wss +#define Wsd &disassembler::Wsd +#define Wps &disassembler::Wps +#define Wpd &disassembler::Wpd + +#define Ob &disassembler::Ob +#define Ow &disassembler::Ow +#define Od &disassembler::Od +#define Oq &disassembler::Oq + +#define Ma &disassembler::Ma +#define Mp &disassembler::Mp +#define Ms &disassembler::Ms +#define Mx &disassembler::Mx +#define Mb &disassembler::Mb +#define Mw &disassembler::Mw +#define Md &disassembler::Md +#define Mq &disassembler::Mq +#define Mt &disassembler::Mt +#define Mdq &disassembler::Mdq +#define Mps &disassembler::Mps +#define Mpd &disassembler::Mpd + +#define Xb &disassembler::Xb +#define Xw &disassembler::Xw +#define Xd &disassembler::Xd +#define Xq &disassembler::Xq + +#define Yb &disassembler::Yb +#define Yw &disassembler::Yw +#define Yd &disassembler::Yd +#define Yq &disassembler::Yq + +#define Jb &disassembler::Jb +#define Jw &disassembler::Jw +#define Jd &disassembler::Jd + +#define XX 0 + +const struct BxDisasmOpcodeInfo_t +#include "opcodes.inc" +#include "dis_tables.inc" + +#undef XX + +#endif diff --git a/Mednafen/mednafen/wswan/dis/dis_tables.inc b/Mednafen/mednafen/wswan/dis/dis_tables.inc new file mode 100755 index 0000000000..2f300611d6 --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/dis_tables.inc @@ -0,0 +1,667 @@ +/* ************************************************************************ */ +/* Opcode GroupN */ + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EbIb[8] = { + /* 0 */ { 0, &Ia_addb_Eb_Ib }, + /* 1 */ { 0, &Ia_orb_Eb_Ib }, + /* 2 */ { 0, &Ia_adcb_Eb_Ib }, + /* 3 */ { 0, &Ia_sbbb_Eb_Ib }, + /* 4 */ { 0, &Ia_andb_Eb_Ib }, + /* 5 */ { 0, &Ia_subb_Eb_Ib }, + /* 6 */ { 0, &Ia_xorb_Eb_Ib }, + /* 7 */ { 0, &Ia_cmpb_Eb_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EwIw[8] = { + /* 0 */ { 0, &Ia_addw_Ew_Iw }, + /* 1 */ { 0, &Ia_orw_Ew_Iw }, + /* 2 */ { 0, &Ia_adcw_Ew_Iw }, + /* 3 */ { 0, &Ia_sbbw_Ew_Iw }, + /* 4 */ { 0, &Ia_andw_Ew_Iw }, + /* 5 */ { 0, &Ia_subw_Ew_Iw }, + /* 6 */ { 0, &Ia_xorw_Ew_Iw }, + /* 7 */ { 0, &Ia_cmpw_Ew_Iw } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG1EwIb[8] = { + /* 0 */ { 0, &Ia_addw_Ew_sIb }, // sign-extend byte + /* 1 */ { 0, &Ia_orw_Ew_sIb }, + /* 2 */ { 0, &Ia_adcw_Ew_sIb }, + /* 3 */ { 0, &Ia_sbbw_Ew_sIb }, + /* 4 */ { 0, &Ia_andw_Ew_sIb }, + /* 5 */ { 0, &Ia_subw_Ew_sIb }, + /* 6 */ { 0, &Ia_xorw_Ew_sIb }, + /* 7 */ { 0, &Ia_cmpw_Ew_sIb } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2Eb[8] = { + /* 0 */ { 0, &Ia_rolb_Eb_Ib }, + /* 1 */ { 0, &Ia_rorb_Eb_Ib }, + /* 2 */ { 0, &Ia_rclb_Eb_Ib }, + /* 3 */ { 0, &Ia_rcrb_Eb_Ib }, + /* 4 */ { 0, &Ia_shlb_Eb_Ib }, + /* 5 */ { 0, &Ia_shrb_Eb_Ib }, + /* 6 */ { 0, &Ia_shlb_Eb_Ib }, + /* 7 */ { 0, &Ia_sarb_Eb_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EbI1[8] = { + /* 0 */ { 0, &Ia_rolb_Eb_I1 }, + /* 1 */ { 0, &Ia_rorb_Eb_I1 }, + /* 2 */ { 0, &Ia_rclb_Eb_I1 }, + /* 3 */ { 0, &Ia_rcrb_Eb_I1 }, + /* 4 */ { 0, &Ia_shlb_Eb_I1 }, + /* 5 */ { 0, &Ia_shrb_Eb_I1 }, + /* 6 */ { 0, &Ia_shlb_Eb_I1 }, + /* 7 */ { 0, &Ia_sarb_Eb_I1 } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EbCL[8] = { + /* 0 */ { 0, &Ia_rolb_Eb_CL }, + /* 1 */ { 0, &Ia_rorb_Eb_CL }, + /* 2 */ { 0, &Ia_rclb_Eb_CL }, + /* 3 */ { 0, &Ia_rcrb_Eb_CL }, + /* 4 */ { 0, &Ia_shlb_Eb_CL }, + /* 5 */ { 0, &Ia_shrb_Eb_CL }, + /* 6 */ { 0, &Ia_shlb_Eb_CL }, + /* 7 */ { 0, &Ia_sarb_Eb_CL } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2Ew[8] = { + /* 0 */ { 0, &Ia_rolw_Ew_Ib }, + /* 1 */ { 0, &Ia_rorw_Ew_Ib }, + /* 2 */ { 0, &Ia_rclw_Ew_Ib }, + /* 3 */ { 0, &Ia_rcrw_Ew_Ib }, + /* 4 */ { 0, &Ia_shlw_Ew_Ib }, + /* 5 */ { 0, &Ia_shrw_Ew_Ib }, + /* 6 */ { 0, &Ia_shlw_Ew_Ib }, + /* 7 */ { 0, &Ia_sarw_Ew_Ib } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EwI1[8] = { + /* 0 */ { 0, &Ia_rolw_Ew_I1 }, + /* 1 */ { 0, &Ia_rorw_Ew_I1 }, + /* 2 */ { 0, &Ia_rclw_Ew_I1 }, + /* 3 */ { 0, &Ia_rcrw_Ew_I1 }, + /* 4 */ { 0, &Ia_shlw_Ew_I1 }, + /* 5 */ { 0, &Ia_shrw_Ew_I1 }, + /* 6 */ { 0, &Ia_shlw_Ew_I1 }, + /* 7 */ { 0, &Ia_sarw_Ew_I1 } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG2EwCL[8] = { + /* 0 */ { 0, &Ia_rolw_Ew_CL }, + /* 1 */ { 0, &Ia_rorw_Ew_CL }, + /* 2 */ { 0, &Ia_rclw_Ew_CL }, + /* 3 */ { 0, &Ia_rcrw_Ew_CL }, + /* 4 */ { 0, &Ia_shlw_Ew_CL }, + /* 5 */ { 0, &Ia_shrw_Ew_CL }, + /* 6 */ { 0, &Ia_shlw_Ew_CL }, + /* 7 */ { 0, &Ia_sarw_Ew_CL } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG3Eb[8] = { + /* 0 */ { 0, &Ia_testb_Eb_Ib }, + /* 1 */ { 0, &Ia_testb_Eb_Ib }, + /* 2 */ { 0, &Ia_notb_Eb }, + /* 3 */ { 0, &Ia_negb_Eb }, + /* 4 */ { 0, &Ia_mulb_AL_Eb }, + /* 5 */ { 0, &Ia_imulb_AL_Eb }, + /* 6 */ { 0, &Ia_divb_AL_Eb }, + /* 7 */ { 0, &Ia_idivb_AL_Eb } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG3Ew[8] = { + /* 0 */ { 0, &Ia_testw_Ew_Iw }, + /* 1 */ { 0, &Ia_testw_Ew_Iw }, + /* 2 */ { 0, &Ia_notw_Ew }, + /* 3 */ { 0, &Ia_negw_Ew }, + /* 4 */ { 0, &Ia_mulw_AX_Ew }, + /* 5 */ { 0, &Ia_imulw_AX_Ew }, + /* 6 */ { 0, &Ia_divw_AX_Ew }, + /* 7 */ { 0, &Ia_idivw_AX_Ew } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG4[8] = { + /* 0 */ { 0, &Ia_incb_Eb }, + /* 1 */ { 0, &Ia_decb_Eb }, + /* 2 */ { 0, &Ia_Invalid }, + /* 3 */ { 0, &Ia_Invalid }, + /* 4 */ { 0, &Ia_Invalid }, + /* 5 */ { 0, &Ia_Invalid }, + /* 6 */ { 0, &Ia_Invalid }, + /* 7 */ { 0, &Ia_Invalid } +}; + +static BxDisasmOpcodeTable_t BxDisasmGroupG5w[8] = { + /* 0 */ { 0, &Ia_incw_Ew }, + /* 1 */ { 0, &Ia_decw_Ew }, + /* 2 */ { 0, &Ia_call_Ew }, + /* 3 */ { 0, &Ia_lcall_Mp }, + /* 4 */ { 0, &Ia_jmp_Ew }, + /* 5 */ { 0, &Ia_ljmp_Mp }, + /* 6 */ { 0, &Ia_pushw_Ew }, + /* 7 */ { 0, &Ia_Invalid } +}; + +/* ************************************************************************ */ +/* 16-bit operand size */ + +static BxDisasmOpcodeTable_t BxDisasmOpcodes16[256*2] = { + // 256 entries for single byte opcodes + /* 00 */ { 0, &Ia_addb_Eb_Gb }, + /* 01 */ { 0, &Ia_addw_Ew_Gw }, + /* 02 */ { 0, &Ia_addb_Gb_Eb }, + /* 03 */ { 0, &Ia_addw_Gw_Ew }, + /* 04 */ { 0, &Ia_addb_AL_Ib }, + /* 05 */ { 0, &Ia_addw_AX_Iw }, + /* 06 */ { 0, &Ia_pushw_ES }, + /* 07 */ { 0, &Ia_popw_ES }, + /* 08 */ { 0, &Ia_orb_Eb_Gb }, + /* 09 */ { 0, &Ia_orw_Ew_Gw }, + /* 0A */ { 0, &Ia_orb_Gb_Eb }, + /* 0B */ { 0, &Ia_orw_Gw_Ew }, + /* 0C */ { 0, &Ia_orb_AL_Ib }, + /* 0D */ { 0, &Ia_orw_AX_Iw }, + /* 0E */ { 0, &Ia_pushw_CS }, + /* 0F */ { 0, &Ia_error }, // 2 byte escape + /* 10 */ { 0, &Ia_adcb_Eb_Gb }, + /* 11 */ { 0, &Ia_adcw_Ew_Gw }, + /* 12 */ { 0, &Ia_adcb_Gb_Eb }, + /* 13 */ { 0, &Ia_adcw_Gw_Ew }, + /* 14 */ { 0, &Ia_adcb_AL_Ib }, + /* 15 */ { 0, &Ia_adcw_AX_Iw }, + /* 16 */ { 0, &Ia_pushw_SS }, + /* 17 */ { 0, &Ia_popw_SS }, + /* 18 */ { 0, &Ia_sbbb_Eb_Gb }, + /* 19 */ { 0, &Ia_sbbw_Ew_Gw }, + /* 1A */ { 0, &Ia_sbbb_Gb_Eb }, + /* 1B */ { 0, &Ia_sbbw_Gw_Ew }, + /* 1C */ { 0, &Ia_sbbb_AL_Ib }, + /* 1D */ { 0, &Ia_sbbw_AX_Iw }, + /* 1E */ { 0, &Ia_pushw_DS }, + /* 1F */ { 0, &Ia_popw_DS }, + /* 20 */ { 0, &Ia_andb_Eb_Gb }, + /* 21 */ { 0, &Ia_andw_Ew_Gw }, + /* 22 */ { 0, &Ia_andb_Gb_Eb }, + /* 23 */ { 0, &Ia_andw_Gw_Ew }, + /* 24 */ { 0, &Ia_andb_AL_Ib }, + /* 25 */ { 0, &Ia_andw_AX_Iw }, + /* 26 */ { 0, &Ia_prefix_es }, // ES: + /* 27 */ { 0, &Ia_daa }, + /* 28 */ { 0, &Ia_subb_Eb_Gb }, + /* 29 */ { 0, &Ia_subw_Ew_Gw }, + /* 2A */ { 0, &Ia_subb_Gb_Eb }, + /* 2B */ { 0, &Ia_subw_Gw_Ew }, + /* 2C */ { 0, &Ia_subb_AL_Ib }, + /* 2D */ { 0, &Ia_subw_AX_Iw }, + /* 2E */ { 0, &Ia_prefix_cs }, // CS: + /* 2F */ { 0, &Ia_das }, + /* 30 */ { 0, &Ia_xorb_Eb_Gb }, + /* 31 */ { 0, &Ia_xorw_Ew_Gw }, + /* 32 */ { 0, &Ia_xorb_Gb_Eb }, + /* 33 */ { 0, &Ia_xorw_Gw_Ew }, + /* 34 */ { 0, &Ia_xorb_AL_Ib }, + /* 35 */ { 0, &Ia_xorw_AX_Iw }, + /* 36 */ { 0, &Ia_prefix_ss }, // SS: + /* 37 */ { 0, &Ia_aaa }, + /* 38 */ { 0, &Ia_cmpb_Eb_Gb }, + /* 39 */ { 0, &Ia_cmpw_Ew_Gw }, + /* 3A */ { 0, &Ia_cmpb_Gb_Eb }, + /* 3B */ { 0, &Ia_cmpw_Gw_Ew }, + /* 3C */ { 0, &Ia_cmpb_AL_Ib }, + /* 3D */ { 0, &Ia_cmpw_AX_Iw }, + /* 3E */ { 0, &Ia_prefix_ds }, // DS: + /* 3F */ { 0, &Ia_aas }, + /* 40 */ { 0, &Ia_incw_RX }, + /* 41 */ { 0, &Ia_incw_RX }, + /* 42 */ { 0, &Ia_incw_RX }, + /* 43 */ { 0, &Ia_incw_RX }, + /* 44 */ { 0, &Ia_incw_RX }, + /* 45 */ { 0, &Ia_incw_RX }, + /* 46 */ { 0, &Ia_incw_RX }, + /* 47 */ { 0, &Ia_incw_RX }, + /* 48 */ { 0, &Ia_decw_RX }, + /* 49 */ { 0, &Ia_decw_RX }, + /* 4A */ { 0, &Ia_decw_RX }, + /* 4B */ { 0, &Ia_decw_RX }, + /* 4C */ { 0, &Ia_decw_RX }, + /* 4D */ { 0, &Ia_decw_RX }, + /* 4E */ { 0, &Ia_decw_RX }, + /* 4F */ { 0, &Ia_decw_RX }, + /* 50 */ { 0, &Ia_pushw_RX }, + /* 51 */ { 0, &Ia_pushw_RX }, + /* 52 */ { 0, &Ia_pushw_RX }, + /* 53 */ { 0, &Ia_pushw_RX }, + /* 54 */ { 0, &Ia_pushw_RX }, + /* 55 */ { 0, &Ia_pushw_RX }, + /* 56 */ { 0, &Ia_pushw_RX }, + /* 57 */ { 0, &Ia_pushw_RX }, + /* 58 */ { 0, &Ia_popw_RX }, + /* 59 */ { 0, &Ia_popw_RX }, + /* 5A */ { 0, &Ia_popw_RX }, + /* 5B */ { 0, &Ia_popw_RX }, + /* 5C */ { 0, &Ia_popw_RX }, + /* 5D */ { 0, &Ia_popw_RX }, + /* 5E */ { 0, &Ia_popw_RX }, + /* 5F */ { 0, &Ia_popw_RX }, + /* 60 */ { 0, &Ia_pushaw }, + /* 61 */ { 0, &Ia_popaw }, + /* 62 */ { 0, &Ia_boundw_Gw_Ma }, + /* 63 */ { 0, &Ia_Invalid }, + /* 64 */ { 0, &Ia_Invalid }, // FS: + /* 65 */ { 0, &Ia_Invalid }, + /* 66 */ { 0, &Ia_Invalid }, + /* 67 */ { 0, &Ia_Invalid }, + /* 68 */ { 0, &Ia_pushw_Iw }, + /* 69 */ { 0, &Ia_imulw_Gw_Ew_Iw }, + /* 6A */ { 0, &Ia_pushw_sIb }, + /* 6B */ { 0, &Ia_imulw_Gw_Ew_sIb }, + /* 6C */ { 0, &Ia_insb_Yb_DX }, + /* 6D */ { 0, &Ia_insw_Yw_DX }, + /* 6E */ { 0, &Ia_outsb_DX_Xb }, + /* 6F */ { 0, &Ia_outsw_DX_Xw }, + /* 70 */ { 0, &Ia_jo_Jb }, + /* 71 */ { 0, &Ia_jno_Jb }, + /* 72 */ { 0, &Ia_jb_Jb }, + /* 73 */ { 0, &Ia_jnb_Jb }, + /* 74 */ { 0, &Ia_jz_Jb }, + /* 75 */ { 0, &Ia_jnz_Jb }, + /* 76 */ { 0, &Ia_jbe_Jb }, + /* 77 */ { 0, &Ia_jnbe_Jb }, + /* 78 */ { 0, &Ia_js_Jb }, + /* 79 */ { 0, &Ia_jns_Jb }, + /* 7A */ { 0, &Ia_jp_Jb }, + /* 7B */ { 0, &Ia_jnp_Jb }, + /* 7C */ { 0, &Ia_jl_Jb }, + /* 7D */ { 0, &Ia_jnl_Jb }, + /* 7E */ { 0, &Ia_jle_Jb }, + /* 7F */ { 0, &Ia_jnle_Jb }, + /* 80 */ { GRPN(G1EbIb) }, + /* 81 */ { GRPN(G1EwIw) }, + /* 82 */ { GRPN(G1EbIb) }, + /* 83 */ { GRPN(G1EwIb) }, + /* 84 */ { 0, &Ia_testb_Eb_Gb }, + /* 85 */ { 0, &Ia_testw_Ew_Gw }, + /* 86 */ { 0, &Ia_xchgb_Eb_Gb }, + /* 87 */ { 0, &Ia_xchgw_Ew_Gw }, + /* 88 */ { 0, &Ia_movb_Eb_Gb }, + /* 89 */ { 0, &Ia_movw_Ew_Gw }, + /* 8A */ { 0, &Ia_movb_Gb_Eb }, + /* 8B */ { 0, &Ia_movw_Gw_Ew }, + /* 8C */ { 0, &Ia_movw_Ew_Sw }, + /* 8D */ { 0, &Ia_leaw_Gw_Mw }, + /* 8E */ { 0, &Ia_movw_Sw_Ew }, + /* 8F */ { 0, &Ia_popw_Ew }, + /* 90 */ { 0, &Ia_nop }, + /* 91 */ { 0, &Ia_xchgw_RX_AX }, + /* 92 */ { 0, &Ia_xchgw_RX_AX }, + /* 93 */ { 0, &Ia_xchgw_RX_AX }, + /* 94 */ { 0, &Ia_xchgw_RX_AX }, + /* 95 */ { 0, &Ia_xchgw_RX_AX }, + /* 96 */ { 0, &Ia_xchgw_RX_AX }, + /* 97 */ { 0, &Ia_xchgw_RX_AX }, + /* 98 */ { 0, &Ia_cbw }, + /* 99 */ { 0, &Ia_cwd }, + /* 9A */ { 0, &Ia_lcall_Apw }, + /* 9B */ { 0, &Ia_poll }, + /* 9C */ { 0, &Ia_pushfw }, + /* 9D */ { 0, &Ia_popfw }, + /* 9E */ { 0, &Ia_sahf }, + /* 9F */ { 0, &Ia_lahf }, + /* A0 */ { 0, &Ia_movb_AL_Ob }, + /* A1 */ { 0, &Ia_movw_AX_Ow }, + /* A2 */ { 0, &Ia_movb_Ob_AL }, + /* A3 */ { 0, &Ia_movw_Ow_AX }, + /* A4 */ { 0, &Ia_movsb_Yb_Xb }, + /* A5 */ { 0, &Ia_movsw_Yw_Xw }, + /* A6 */ { 0, &Ia_cmpsb_Yb_Xb }, + /* A7 */ { 0, &Ia_cmpsw_Yw_Xw }, + /* A8 */ { 0, &Ia_testb_AL_Ib }, + /* A9 */ { 0, &Ia_testw_AX_Iw }, + /* AA */ { 0, &Ia_stosb_Yb_AL }, + /* AB */ { 0, &Ia_stosw_Yw_AX }, + /* AC */ { 0, &Ia_lodsb_AL_Xb }, + /* AD */ { 0, &Ia_lodsw_AX_Xw }, + /* AE */ { 0, &Ia_scasb_Yb_AL }, + /* AF */ { 0, &Ia_scasw_Yw_AX }, + /* B0 */ { 0, &Ia_movb_R8_Ib }, + /* B1 */ { 0, &Ia_movb_R8_Ib }, + /* B2 */ { 0, &Ia_movb_R8_Ib }, + /* B3 */ { 0, &Ia_movb_R8_Ib }, + /* B4 */ { 0, &Ia_movb_R8_Ib }, + /* B5 */ { 0, &Ia_movb_R8_Ib }, + /* B6 */ { 0, &Ia_movb_R8_Ib }, + /* B7 */ { 0, &Ia_movb_R8_Ib }, + /* B8 */ { 0, &Ia_movw_RX_Iw }, + /* B9 */ { 0, &Ia_movw_RX_Iw }, + /* BA */ { 0, &Ia_movw_RX_Iw }, + /* BB */ { 0, &Ia_movw_RX_Iw }, + /* BC */ { 0, &Ia_movw_RX_Iw }, + /* BD */ { 0, &Ia_movw_RX_Iw }, + /* BE */ { 0, &Ia_movw_RX_Iw }, + /* BF */ { 0, &Ia_movw_RX_Iw }, + /* C0 */ { GRPN(G2Eb) }, + /* C1 */ { GRPN(G2Ew) }, + /* C2 */ { 0, &Ia_ret_Iw }, + /* C3 */ { 0, &Ia_ret }, + /* C4 */ { 0, &Ia_lesw_Gw_Mp }, + /* C5 */ { 0, &Ia_ldsw_Gw_Mp }, + /* C6 */ { 0, &Ia_movb_Eb_Ib }, + /* C7 */ { 0, &Ia_movw_Ew_Iw }, + /* C8 */ { 0, &Ia_enter }, + /* C9 */ { 0, &Ia_leave }, + /* CA */ { 0, &Ia_lret_Iw }, + /* CB */ { 0, &Ia_lret }, + /* CC */ { 0, &Ia_int3 }, + /* CD */ { 0, &Ia_int_Ib }, + /* CE */ { 0, &Ia_into }, + /* CF */ { 0, &Ia_iretw }, + /* D0 */ { GRPN(G2EbI1) }, + /* D1 */ { GRPN(G2EwI1) }, + /* D2 */ { GRPN(G2EbCL) }, + /* D3 */ { GRPN(G2EwCL) }, + /* D4 */ { 0, &Ia_aam }, + /* D5 */ { 0, &Ia_aad }, + /* D6 */ { 0, &Ia_salc }, + /* D7 */ { 0, &Ia_xlat }, + /* D8 */ { 0, &Ia_fpo1 }, + /* D9 */ { 0, &Ia_fpo1 }, + /* DA */ { 0, &Ia_fpo1 }, + /* DB */ { 0, &Ia_fpo1 }, + /* DC */ { 0, &Ia_fpo1 }, + /* DD */ { 0, &Ia_fpo1 }, + /* DE */ { 0, &Ia_fpo1 }, + /* DF */ { 0, &Ia_fpo1 }, + /* E0 */ { 0, &Ia_loopne_Jb }, + /* E1 */ { 0, &Ia_loope_Jb }, + /* E2 */ { 0, &Ia_loop_Jb }, + /* E3 */ { 0, &Ia_jcxz_Jb }, + /* E4 */ { 0, &Ia_inb_AL_Ib }, + /* E5 */ { 0, &Ia_inw_AX_Ib }, + /* E6 */ { 0, &Ia_outb_Ib_AL }, + /* E7 */ { 0, &Ia_outw_Ib_AX }, + /* E8 */ { 0, &Ia_call_Jw }, + /* E9 */ { 0, &Ia_jmp_Jw }, + /* EA */ { 0, &Ia_ljmp_Apw }, + /* EB */ { 0, &Ia_jmp_Jb }, + /* EC */ { 0, &Ia_inb_AL_DX }, + /* ED */ { 0, &Ia_inw_AX_DX }, + /* EE */ { 0, &Ia_outb_DX_AL }, + /* EF */ { 0, &Ia_outw_DX_AX }, + /* F0 */ { 0, &Ia_prefix_lock }, // LOCK: + /* F1 */ { 0, &Ia_Invalid }, + /* F2 */ { 0, &Ia_prefix_repne }, // REPNE: + /* F3 */ { 0, &Ia_prefix_rep }, // REP: + /* F4 */ { 0, &Ia_hlt }, + /* F5 */ { 0, &Ia_cmc }, + /* F6 */ { GRPN(G3Eb) }, + /* F7 */ { GRPN(G3Ew) }, + /* F8 */ { 0, &Ia_clc }, + /* F9 */ { 0, &Ia_stc }, + /* FA */ { 0, &Ia_cli }, + /* FB */ { 0, &Ia_sti }, + /* FC */ { 0, &Ia_cld }, + /* FD */ { 0, &Ia_std }, + /* FE */ { GRPN(G4) }, + /* FF */ { GRPN(G5w) }, + + // 256 entries for two byte opcodes + /* 0F 00 */ { 0, &Ia_Invalid }, + /* 0F 01 */ { 0, &Ia_Invalid }, + /* 0F 02 */ { 0, &Ia_Invalid }, + /* 0F 03 */ { 0, &Ia_Invalid }, + /* 0F 04 */ { 0, &Ia_Invalid }, + /* 0F 05 */ { 0, &Ia_Invalid }, + /* 0F 06 */ { 0, &Ia_Invalid }, + /* 0F 07 */ { 0, &Ia_Invalid }, + /* 0F 08 */ { 0, &Ia_Invalid }, + /* 0F 09 */ { 0, &Ia_Invalid }, + /* 0F 0A */ { 0, &Ia_Invalid }, + /* 0F 0B */ { 0, &Ia_Invalid }, + /* 0F 0C */ { 0, &Ia_Invalid }, + /* 0F 0D */ { 0, &Ia_Invalid }, + /* 0F 0E */ { 0, &Ia_Invalid }, + /* 0F 0F */ { 0, &Ia_Invalid }, + /* 0F 10 */ { 0, &Ia_Invalid }, + /* 0F 11 */ { 0, &Ia_Invalid }, + /* 0F 12 */ { 0, &Ia_Invalid }, + /* 0F 13 */ { 0, &Ia_Invalid }, + /* 0F 14 */ { 0, &Ia_Invalid }, + /* 0F 15 */ { 0, &Ia_Invalid }, + /* 0F 16 */ { 0, &Ia_Invalid }, + /* 0F 17 */ { 0, &Ia_Invalid }, + /* 0F 18 */ { 0, &Ia_Invalid }, + /* 0F 19 */ { 0, &Ia_Invalid }, + /* 0F 1A */ { 0, &Ia_Invalid }, + /* 0F 1B */ { 0, &Ia_Invalid }, + /* 0F 1C */ { 0, &Ia_Invalid }, + /* 0F 1D */ { 0, &Ia_Invalid }, + /* 0F 1E */ { 0, &Ia_Invalid }, + /* 0F 1F */ { 0, &Ia_Invalid }, + /* 0F 20 */ { 0, &Ia_Invalid }, + /* 0F 21 */ { 0, &Ia_Invalid }, + /* 0F 22 */ { 0, &Ia_Invalid }, + /* 0F 23 */ { 0, &Ia_Invalid }, + /* 0F 24 */ { 0, &Ia_Invalid }, + /* 0F 25 */ { 0, &Ia_Invalid }, + /* 0F 26 */ { 0, &Ia_Invalid }, + /* 0F 27 */ { 0, &Ia_Invalid }, + /* 0F 28 */ { 0, &Ia_Invalid }, + /* 0F 29 */ { 0, &Ia_Invalid }, + /* 0F 2A */ { 0, &Ia_Invalid }, + /* 0F 2B */ { 0, &Ia_Invalid }, + /* 0F 2C */ { 0, &Ia_Invalid }, + /* 0F 2D */ { 0, &Ia_Invalid }, + /* 0F 2E */ { 0, &Ia_Invalid }, + /* 0F 2F */ { 0, &Ia_Invalid }, + /* 0F 30 */ { 0, &Ia_Invalid }, + /* 0F 31 */ { 0, &Ia_Invalid }, + /* 0F 32 */ { 0, &Ia_Invalid }, + /* 0F 33 */ { 0, &Ia_Invalid }, + /* 0F 34 */ { 0, &Ia_Invalid }, + /* 0F 35 */ { 0, &Ia_Invalid }, + /* 0F 36 */ { 0, &Ia_Invalid }, + /* 0F 37 */ { 0, &Ia_Invalid }, + /* 0F 38 */ { 0, &Ia_Invalid }, + /* 0F 39 */ { 0, &Ia_Invalid }, + /* 0F 3A */ { 0, &Ia_Invalid }, + /* 0F 3B */ { 0, &Ia_Invalid }, + /* 0F 3C */ { 0, &Ia_Invalid }, + /* 0F 3D */ { 0, &Ia_Invalid }, + /* 0F 3E */ { 0, &Ia_Invalid }, + /* 0F 3F */ { 0, &Ia_Invalid }, + /* 0F 40 */ { 0, &Ia_Invalid }, + /* 0F 41 */ { 0, &Ia_Invalid }, + /* 0F 42 */ { 0, &Ia_Invalid }, + /* 0F 43 */ { 0, &Ia_Invalid }, + /* 0F 44 */ { 0, &Ia_Invalid }, + /* 0F 45 */ { 0, &Ia_Invalid }, + /* 0F 46 */ { 0, &Ia_Invalid }, + /* 0F 47 */ { 0, &Ia_Invalid }, + /* 0F 48 */ { 0, &Ia_Invalid }, + /* 0F 49 */ { 0, &Ia_Invalid }, + /* 0F 4A */ { 0, &Ia_Invalid }, + /* 0F 4B */ { 0, &Ia_Invalid }, + /* 0F 4C */ { 0, &Ia_Invalid }, + /* 0F 4D */ { 0, &Ia_Invalid }, + /* 0F 4E */ { 0, &Ia_Invalid }, + /* 0F 4F */ { 0, &Ia_Invalid }, + /* 0F 50 */ { 0, &Ia_Invalid }, + /* 0F 51 */ { 0, &Ia_Invalid }, + /* 0F 52 */ { 0, &Ia_Invalid }, + /* 0F 53 */ { 0, &Ia_Invalid }, + /* 0F 54 */ { 0, &Ia_Invalid }, + /* 0F 55 */ { 0, &Ia_Invalid }, + /* 0F 56 */ { 0, &Ia_Invalid }, + /* 0F 57 */ { 0, &Ia_Invalid }, + /* 0F 58 */ { 0, &Ia_Invalid }, + /* 0F 59 */ { 0, &Ia_Invalid }, + /* 0F 5A */ { 0, &Ia_Invalid }, + /* 0F 5B */ { 0, &Ia_Invalid }, + /* 0F 5C */ { 0, &Ia_Invalid }, + /* 0F 5D */ { 0, &Ia_Invalid }, + /* 0F 5E */ { 0, &Ia_Invalid }, + /* 0F 5F */ { 0, &Ia_Invalid }, + /* 0F 60 */ { 0, &Ia_Invalid }, + /* 0F 61 */ { 0, &Ia_Invalid }, + /* 0F 62 */ { 0, &Ia_Invalid }, + /* 0F 63 */ { 0, &Ia_Invalid }, + /* 0F 64 */ { 0, &Ia_Invalid }, + /* 0F 65 */ { 0, &Ia_Invalid }, + /* 0F 66 */ { 0, &Ia_Invalid }, + /* 0F 67 */ { 0, &Ia_Invalid }, + /* 0F 68 */ { 0, &Ia_Invalid }, + /* 0F 69 */ { 0, &Ia_Invalid }, + /* 0F 6A */ { 0, &Ia_Invalid }, + /* 0F 6B */ { 0, &Ia_Invalid }, + /* 0F 6C */ { 0, &Ia_Invalid }, + /* 0F 6D */ { 0, &Ia_Invalid }, + /* 0F 6E */ { 0, &Ia_Invalid }, + /* 0F 6F */ { 0, &Ia_Invalid }, + /* 0F 70 */ { 0, &Ia_Invalid }, + /* 0F 71 */ { 0, &Ia_Invalid }, + /* 0F 72 */ { 0, &Ia_Invalid }, + /* 0F 73 */ { 0, &Ia_Invalid }, + /* 0F 74 */ { 0, &Ia_Invalid }, + /* 0F 75 */ { 0, &Ia_Invalid }, + /* 0F 76 */ { 0, &Ia_Invalid }, + /* 0F 77 */ { 0, &Ia_Invalid }, + /* 0F 78 */ { 0, &Ia_Invalid }, + /* 0F 79 */ { 0, &Ia_Invalid }, + /* 0F 7A */ { 0, &Ia_Invalid }, + /* 0F 7B */ { 0, &Ia_Invalid }, + /* 0F 7C */ { 0, &Ia_Invalid }, + /* 0F 7D */ { 0, &Ia_Invalid }, + /* 0F 7E */ { 0, &Ia_Invalid }, + /* 0F 7F */ { 0, &Ia_Invalid }, + /* 0F 80 */ { 0, &Ia_Invalid }, + /* 0F 81 */ { 0, &Ia_Invalid }, + /* 0F 82 */ { 0, &Ia_Invalid }, + /* 0F 83 */ { 0, &Ia_Invalid }, + /* 0F 84 */ { 0, &Ia_Invalid }, + /* 0F 85 */ { 0, &Ia_Invalid }, + /* 0F 86 */ { 0, &Ia_Invalid }, + /* 0F 87 */ { 0, &Ia_Invalid }, + /* 0F 88 */ { 0, &Ia_Invalid }, + /* 0F 89 */ { 0, &Ia_Invalid }, + /* 0F 8A */ { 0, &Ia_Invalid }, + /* 0F 8B */ { 0, &Ia_Invalid }, + /* 0F 8C */ { 0, &Ia_Invalid }, + /* 0F 8D */ { 0, &Ia_Invalid }, + /* 0F 8E */ { 0, &Ia_Invalid }, + /* 0F 8F */ { 0, &Ia_Invalid }, + /* 0F 90 */ { 0, &Ia_Invalid }, + /* 0F 91 */ { 0, &Ia_Invalid }, + /* 0F 92 */ { 0, &Ia_Invalid }, + /* 0F 93 */ { 0, &Ia_Invalid }, + /* 0F 94 */ { 0, &Ia_Invalid }, + /* 0F 95 */ { 0, &Ia_Invalid }, + /* 0F 96 */ { 0, &Ia_Invalid }, + /* 0F 97 */ { 0, &Ia_Invalid }, + /* 0F 98 */ { 0, &Ia_Invalid }, + /* 0F 99 */ { 0, &Ia_Invalid }, + /* 0F 9A */ { 0, &Ia_Invalid }, + /* 0F 9B */ { 0, &Ia_Invalid }, + /* 0F 9C */ { 0, &Ia_Invalid }, + /* 0F 9D */ { 0, &Ia_Invalid }, + /* 0F 9E */ { 0, &Ia_Invalid }, + /* 0F 9F */ { 0, &Ia_Invalid }, + /* 0F A0 */ { 0, &Ia_Invalid }, + /* 0F A1 */ { 0, &Ia_Invalid }, + /* 0F A2 */ { 0, &Ia_Invalid }, + /* 0F A3 */ { 0, &Ia_Invalid }, + /* 0F A4 */ { 0, &Ia_Invalid }, + /* 0F A5 */ { 0, &Ia_Invalid }, + /* 0F A6 */ { 0, &Ia_Invalid }, + /* 0F A7 */ { 0, &Ia_Invalid }, + /* 0F A8 */ { 0, &Ia_Invalid }, + /* 0F A9 */ { 0, &Ia_Invalid }, + /* 0F AA */ { 0, &Ia_Invalid }, + /* 0F AB */ { 0, &Ia_Invalid }, + /* 0F AC */ { 0, &Ia_Invalid }, + /* 0F AD */ { 0, &Ia_Invalid }, + /* 0F AE */ { 0, &Ia_Invalid }, + /* 0F AF */ { 0, &Ia_Invalid }, + /* 0F B0 */ { 0, &Ia_Invalid }, + /* 0F B1 */ { 0, &Ia_Invalid }, + /* 0F B2 */ { 0, &Ia_Invalid }, + /* 0F B3 */ { 0, &Ia_Invalid }, + /* 0F B4 */ { 0, &Ia_Invalid }, + /* 0F B5 */ { 0, &Ia_Invalid }, + /* 0F B6 */ { 0, &Ia_Invalid }, + /* 0F B7 */ { 0, &Ia_Invalid }, + /* 0F B8 */ { 0, &Ia_Invalid }, + /* 0F B9 */ { 0, &Ia_Invalid }, + /* 0F BA */ { 0, &Ia_Invalid }, + /* 0F BB */ { 0, &Ia_Invalid }, + /* 0F BC */ { 0, &Ia_Invalid }, + /* 0F BD */ { 0, &Ia_Invalid }, + /* 0F BE */ { 0, &Ia_Invalid }, + /* 0F BF */ { 0, &Ia_Invalid }, + /* 0F C0 */ { 0, &Ia_Invalid }, + /* 0F C0 */ { 0, &Ia_Invalid }, + /* 0F C2 */ { 0, &Ia_Invalid }, + /* 0F C3 */ { 0, &Ia_Invalid }, + /* 0F C4 */ { 0, &Ia_Invalid }, + /* 0F C5 */ { 0, &Ia_Invalid }, + /* 0F C6 */ { 0, &Ia_Invalid }, + /* 0F C7 */ { 0, &Ia_Invalid }, + /* 0F C8 */ { 0, &Ia_Invalid }, + /* 0F C9 */ { 0, &Ia_Invalid }, + /* 0F CA */ { 0, &Ia_Invalid }, + /* 0F CB */ { 0, &Ia_Invalid }, + /* 0F CC */ { 0, &Ia_Invalid }, + /* 0F CD */ { 0, &Ia_Invalid }, + /* 0F CE */ { 0, &Ia_Invalid }, + /* 0F CF */ { 0, &Ia_Invalid }, + /* 0F D0 */ { 0, &Ia_Invalid }, + /* 0F D1 */ { 0, &Ia_Invalid }, + /* 0F D2 */ { 0, &Ia_Invalid }, + /* 0F D3 */ { 0, &Ia_Invalid }, + /* 0F D4 */ { 0, &Ia_Invalid }, + /* 0F D5 */ { 0, &Ia_Invalid }, + /* 0F D6 */ { 0, &Ia_Invalid }, + /* 0F D7 */ { 0, &Ia_Invalid }, + /* 0F D8 */ { 0, &Ia_Invalid }, + /* 0F D9 */ { 0, &Ia_Invalid }, + /* 0F DA */ { 0, &Ia_Invalid }, + /* 0F DB */ { 0, &Ia_Invalid }, + /* 0F DC */ { 0, &Ia_Invalid }, + /* 0F DD */ { 0, &Ia_Invalid }, + /* 0F DE */ { 0, &Ia_Invalid }, + /* 0F DF */ { 0, &Ia_Invalid }, + /* 0F E0 */ { 0, &Ia_Invalid }, + /* 0F E1 */ { 0, &Ia_Invalid }, + /* 0F E2 */ { 0, &Ia_Invalid }, + /* 0F E3 */ { 0, &Ia_Invalid }, + /* 0F E4 */ { 0, &Ia_Invalid }, + /* 0F E5 */ { 0, &Ia_Invalid }, + /* 0F E6 */ { 0, &Ia_Invalid }, + /* 0F E7 */ { 0, &Ia_Invalid }, + /* 0F E8 */ { 0, &Ia_Invalid }, + /* 0F E9 */ { 0, &Ia_Invalid }, + /* 0F EA */ { 0, &Ia_Invalid }, + /* 0F EB */ { 0, &Ia_Invalid }, + /* 0F EC */ { 0, &Ia_Invalid }, + /* 0F ED */ { 0, &Ia_Invalid }, + /* 0F EE */ { 0, &Ia_Invalid }, + /* 0F EF */ { 0, &Ia_Invalid }, + /* 0F F0 */ { 0, &Ia_Invalid }, + /* 0F F1 */ { 0, &Ia_Invalid }, + /* 0F F2 */ { 0, &Ia_Invalid }, + /* 0F F3 */ { 0, &Ia_Invalid }, + /* 0F F4 */ { 0, &Ia_Invalid }, + /* 0F F5 */ { 0, &Ia_Invalid }, + /* 0F F6 */ { 0, &Ia_Invalid }, + /* 0F F7 */ { 0, &Ia_Invalid }, + /* 0F F8 */ { 0, &Ia_Invalid }, + /* 0F F9 */ { 0, &Ia_Invalid }, + /* 0F FA */ { 0, &Ia_Invalid }, + /* 0F FB */ { 0, &Ia_Invalid }, + /* 0F FC */ { 0, &Ia_Invalid }, + /* 0F FD */ { 0, &Ia_Invalid }, + /* 0F FE */ { 0, &Ia_Invalid }, + /* 0F FF */ { 0, &Ia_Invalid } +}; + diff --git a/Mednafen/mednafen/wswan/dis/disasm.h b/Mednafen/mednafen/wswan/dis/disasm.h new file mode 100644 index 0000000000..27e6bfd34c --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/disasm.h @@ -0,0 +1,380 @@ +#ifndef _BX_DISASM_H_ +#define _BX_DISASM_H_ + +#include + +typedef uint16 bx_address; + +#define BX_DECODE_MODRM(modrm_byte, mod, opcode, rm) { \ + mod = (modrm_byte >> 6) & 0x03; \ + opcode = (modrm_byte >> 3) & 0x07; \ + rm = modrm_byte & 0x07; \ +} + +#define BX_DECODE_SIB(sib_byte, scale, index, base) { \ + scale = sib_byte >> 6; \ + index = (sib_byte >> 3) & 0x07; \ + base = sib_byte & 0x07; \ +} + +/* general purpose bit register */ +enum { + rAX_REG, + rCX_REG, + rDX_REG, + rBX_REG, + rSP_REG, + rBP_REG, + rSI_REG, + rDI_REG +}; + +/* segment register */ +enum { + ES_REG, + CS_REG, + SS_REG, + DS_REG, + FS_REG, + GS_REG, + INVALID_SEG1, + INVALID_SEG2 +}; + +class disassembler; +struct x86_insn; + +typedef void (disassembler::*BxDisasmPtr_t)(const x86_insn *insn); +typedef void (disassembler::*BxDisasmResolveModrmPtr_t)(const x86_insn *insn, unsigned attr); + +struct BxDisasmOpcodeInfo_t +{ + const char *IntelOpcode; + const char *AttOpcode; + BxDisasmPtr_t Operand1; + BxDisasmPtr_t Operand2; + BxDisasmPtr_t Operand3; +}; + +struct BxDisasmOpcodeTable_t +{ + uint32 Attr; + const void *OpcodeInfo; +}; + +// segment override not used +#define NO_SEG_OVERRIDE 0xFF + +// datasize attributes +#define X_SIZE 0x0000 +#define B_SIZE 0x0100 +#define W_SIZE 0x0200 +#define D_SIZE 0x0300 +#define Q_SIZE 0x0400 +#define Z_SIZE 0x0500 +#define V_SIZE 0x0600 +#define O_SIZE 0x0700 +#define T_SIZE 0x0800 +#define P_SIZE 0x0900 + +// branch hint attribute +#define BRANCH_HINT 0x1000 + +struct x86_insn +{ +public: + x86_insn(); + + bool is_seg_override() const { + return (seg_override != NO_SEG_OVERRIDE); + } + +public: + uint8 extend8b; + uint8 seg_override; + unsigned b1, prefixes; + unsigned ilen; + + uint8 modrm, mod, nnn, rm; + uint8 sib, scale, index, base; + union { + uint16 displ16; + uint32 displ32; + } displacement; +}; + +class disassembler { +public: + disassembler() { set_syntax_intel(); } + + unsigned disasm(bx_address base, bx_address ip, const uint8 *instr, char *disbuf); + + unsigned disasm16(bx_address base, bx_address ip, const uint8 *instr, char *disbuf) + { return disasm(base, ip, instr, disbuf); } + + x86_insn decode(bx_address base, bx_address ip, const uint8 *instr, char *disbuf); + + x86_insn decode16(bx_address base, bx_address ip, const uint8 *instr, char *disbuf) + { return decode(base, ip, instr, disbuf); } + + void set_syntax_intel(); + void set_syntax_att (); + + void toggle_syntax_mode(); + +private: + bool intel_mode; + + const char **general_16bit_regname; + const char **general_8bit_regname; + + const char **segment_name; + const char **index16; + + const char *sreg_mod01or10_rm32[8]; + const char *sreg_mod00_base32[8]; + const char *sreg_mod01or10_base32[8]; + const char *sreg_mod00_rm16[8]; + const char *sreg_mod01or10_rm16[8]; + +private: + + bx_address db_eip, db_base; + + const uint8 *instruction; // for fetching of next byte of instruction + + char *disbufptr; + + BxDisasmResolveModrmPtr_t resolve_modrm; + + uint8 fetch_byte() { + db_eip++; + return(*instruction++); + }; + + uint8 peek_byte() { + return(*instruction); + }; + + uint16 fetch_word() { + uint8 b0 = * (uint8 *) instruction++; + uint8 b1 = * (uint8 *) instruction++; + uint16 ret16 = (b1<<8) | b0; + db_eip += 2; + return(ret16); + }; + + uint32 fetch_dword() { + uint8 b0 = * (uint8 *) instruction++; + uint8 b1 = * (uint8 *) instruction++; + uint8 b2 = * (uint8 *) instruction++; + uint8 b3 = * (uint8 *) instruction++; + uint32 ret32 = (b3<<24) | (b2<<16) | (b1<<8) | b0; + db_eip += 4; + return(ret32); + }; + + void dis_putc(char symbol); + void dis_sprintf(const char *fmt, ...); + void decode_modrm(x86_insn *insn); + + void resolve16_mod0 (const x86_insn *insn, unsigned mode); + void resolve16_mod1or2(const x86_insn *insn, unsigned mode); + + void initialize_modrm_segregs(); + + void print_datasize (unsigned mode); + + void print_memory_access16(int datasize, + const char *seg, const char *index, uint16 disp); + void print_memory_access (int datasize, + const char *seg, const char *base, const char *index, int scale, uint32 disp); + + void print_disassembly_intel(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry); + void print_disassembly_att (const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry); + +public: + +/* + * Codes for Addressing Method: + * --------------------------- + * A - Direct address. The instruction has no ModR/M byte; the address + * of the operand is encoded in the instruction; and no base register, + * index register, or scaling factor can be applied. + * C - The reg field of the ModR/M byte selects a control register. + * D - The reg field of the ModR/M byte selects a debug register. + * E - A ModR/M byte follows the opcode and specifies the operand. The + * operand is either a general-purpose register or a memory address. + * If it is a memory address, the address is computed from a segment + * register and any of the following values: a base register, an + * index register, a scaling factor, a displacement. + * F - Flags Register. + * G - The reg field of the ModR/M byte selects a general register. + * I - Immediate data. The operand value is encoded in subsequent bytes of + * the instruction. + * J - The instruction contains a relative offset to be added to the + * instruction pointer register. + * M - The ModR/M byte may refer only to memory. + * N - The R/M field of the ModR/M byte selects a packed-quadword MMX + technology register. + * O - The instruction has no ModR/M byte; the offset of the operand is + * coded as a word or double word (depending on address size attribute) + * in the instruction. No base register, index register, or scaling + * factor can be applied. + * P - The reg field of the ModR/M byte selects a packed quadword MMX + * technology register. + * Q - A ModR/M byte follows the opcode and specifies the operand. The + * operand is either an MMX technology register or a memory address. + * If it is a memory address, the address is computed from a segment + * register and any of the following values: a base register, an + * index register, a scaling factor, and a displacement. + * R - The mod field of the ModR/M byte may refer only to a general register. + * S - The reg field of the ModR/M byte selects a segment register. + * U - The R/M field of the ModR/M byte selects a 128-bit XMM register. + * T - The reg field of the ModR/M byte selects a test register. + * V - The reg field of the ModR/M byte selects a 128-bit XMM register. + * W - A ModR/M byte follows the opcode and specifies the operand. The + * operand is either a 128-bit XMM register or a memory address. If + * it is a memory address, the address is computed from a segment + * register and any of the following values: a base register, an + * index register, a scaling factor, and a displacement. + * X - Memory addressed by the DS:rSI register pair. + * Y - Memory addressed by the ES:rDI register pair. + */ + +/* + * Codes for Operand Type: + * ---------------------- + * a - Two one-word operands in memory or two double-word operands in + * memory, depending on operand-size attribute (used only by the BOUND + * instruction). + * b - Byte, regardless of operand-size attribute. + * d - Doubleword, regardless of operand-size attribute. + * dq - Double-quadword, regardless of operand-size attribute. + * p - 32-bit or 48-bit pointer, depending on operand-size attribute. + * pd - 128-bit packed double-precision floating-point data. + * pi - Quadword MMX technology register (packed integer) + * ps - 128-bit packed single-precision floating-point data. + * q - Quadword, regardless of operand-size attribute. + * s - 6-byte or 10-byte pseudo-descriptor. + * si - Doubleword integer register (scalar integer) + * ss - Scalar element of a 128-bit packed single-precision floating data. + * sd - Scalar element of a 128-bit packed double-precision floating data. + * v - Word, doubleword or quadword, depending on operand-size attribute. + * w - Word, regardless of operand-size attr. + */ + + // far call/jmp + void Apw(const x86_insn *insn); + void Apd(const x86_insn *insn); + + // 8-bit general purpose registers + void AL(const x86_insn *insn); + void CL(const x86_insn *insn); + + // 16-bit general purpose registers + void AX(const x86_insn *insn); + void DX(const x86_insn *insn); + + // segment registers + void CS(const x86_insn *insn); + void DS(const x86_insn *insn); + void ES(const x86_insn *insn); + void SS(const x86_insn *insn); + + // segment registers + void Sw(const x86_insn *insn); + + // test registers + void Td(const x86_insn *insn); + + // control register + void Cd(const x86_insn *insn); + void Cq(const x86_insn *insn); + + // debug register + void Dd(const x86_insn *insn); + void Dq(const x86_insn *insn); + + // 8-bit general purpose register + void R8(const x86_insn *insn); + + // 16-bit general purpose register + void RX(const x86_insn *insn); + + // general purpose register or memory operand + void Eb(const x86_insn *insn); + void Ew(const x86_insn *insn); + void Ed(const x86_insn *insn); + void Eq(const x86_insn *insn); + + // general purpose register + void Gb(const x86_insn *insn); + void Gw(const x86_insn *insn); + void Gd(const x86_insn *insn); + void Gq(const x86_insn *insn); + + // immediate + void I1(const x86_insn *insn); + void Ib(const x86_insn *insn); + void Iw(const x86_insn *insn); + void Id(const x86_insn *insn); + void Iq(const x86_insn *insn); + + // two immediates Iw/Ib + void IwIb(const x86_insn *insn); + + // sign extended immediate + void sIbw(const x86_insn *insn); + void sIbd(const x86_insn *insn); + void sIbq(const x86_insn *insn); + void sIdq(const x86_insn *insn); + + // general purpose register + void Rw(const x86_insn *insn); + void Rd(const x86_insn *insn); + void Rq(const x86_insn *insn); + + // direct memory access + void OP_O(const x86_insn *insn, unsigned size); + void Ob(const x86_insn *insn); + void Ow(const x86_insn *insn); + void Od(const x86_insn *insn); + void Oq(const x86_insn *insn); + + // memory operand + void OP_M(const x86_insn *insn, unsigned size); + void Ma(const x86_insn *insn); + void Mp(const x86_insn *insn); + void Ms(const x86_insn *insn); + void Mx(const x86_insn *insn); + void Mb(const x86_insn *insn); + void Mw(const x86_insn *insn); + void Md(const x86_insn *insn); + void Mq(const x86_insn *insn); + void Mt(const x86_insn *insn); + void Mdq(const x86_insn *insn); + void Mps(const x86_insn *insn); + void Mpd(const x86_insn *insn); + + // string instructions + void OP_X(const x86_insn *insn, unsigned size); + void Xb(const x86_insn *insn); + void Xw(const x86_insn *insn); + void Xd(const x86_insn *insn); + void Xq(const x86_insn *insn); + + // string instructions + void OP_Y(const x86_insn *insn, unsigned size); + void Yb(const x86_insn *insn); + void Yw(const x86_insn *insn); + void Yd(const x86_insn *insn); + void Yq(const x86_insn *insn); + + // jump offset + void Jb(const x86_insn *insn); + void Jw(const x86_insn *insn); + void Jd(const x86_insn *insn); +}; + +#endif diff --git a/Mednafen/mednafen/wswan/dis/opcodes.inc b/Mednafen/mednafen/wswan/dis/opcodes.inc new file mode 100755 index 0000000000..5a7ffbbea7 --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/opcodes.inc @@ -0,0 +1,389 @@ +Ia_hlt = { "hlt", "hlt", XX, XX, XX }, +Ia_poll = { "poll", "poll", XX, XX, XX }, +Ia_fpo1 = { "fop1", "fop1", Eb, XX, XX }, + +Ia_aaa = { "aaa", "aaa", XX, XX, XX }, +Ia_aad = { "aad", "aad", Ib, XX, XX }, +Ia_aam = { "aam", "aam", Ib, XX, XX }, +Ia_aas = { "aas", "aas", XX, XX, XX }, +Ia_adcb_AL_Ib = { "adc", "adcb", AL, Ib, XX }, +Ia_adcb_Eb_Gb = { "adc", "adcb", Eb, Gb, XX }, +Ia_adcb_Eb_Ib = { "adc", "adcb", Eb, Ib, XX }, +Ia_adcb_Gb_Eb = { "adc", "adcb", Gb, Eb, XX }, +Ia_adcw_AX_Iw = { "adc", "adcw", AX, Iw, XX }, +Ia_adcw_Ew_Gw = { "adc", "adcw", Ew, Gw, XX }, +Ia_adcw_Ew_Iw = { "adc", "adcw", Ew, Iw, XX }, +Ia_adcw_Ew_sIb = { "adc", "adcw", Ew, sIbw, XX }, +Ia_adcw_Gw_Ew = { "adc", "adcw", Gw, Ew, XX }, +Ia_addb_AL_Ib = { "add", "addb", AL, Ib, XX }, +Ia_addb_Eb_Gb = { "add", "addb", Eb, Gb, XX }, +Ia_addb_Eb_Ib = { "add", "addb", Eb, Ib, XX }, +Ia_addb_Gb_Eb = { "add", "addb", Gb, Eb, XX }, + +Ia_addw_AX_Iw = { "add", "addw", AX, Iw, XX }, +Ia_addw_Ew_Gw = { "add", "addw", Ew, Gw, XX }, +Ia_addw_Ew_Iw = { "add", "addw", Ew, Iw, XX }, +Ia_addw_Ew_sIb = { "add", "addw", Ew, sIbw, XX }, +Ia_addw_Gw_Ew = { "add", "addw", Gw, Ew, XX }, +Ia_andb_AL_Ib = { "and", "andb", AL, Ib, XX }, +Ia_andb_Eb_Gb = { "and", "andb", Eb, Gb, XX }, +Ia_andb_Eb_Ib = { "and", "andb", Eb, Ib, XX }, +Ia_andb_Gb_Eb = { "and", "andb", Gb, Eb, XX }, +Ia_andw_AX_Iw = { "and", "andw", AX, Iw, XX }, +Ia_andw_Ew_Gw = { "and", "andw", Ew, Gw, XX }, +Ia_andw_Ew_Iw = { "and", "andw", Ew, Iw, XX }, +Ia_andw_Ew_sIb = { "and", "andw", Ew, sIbw, XX }, +Ia_andw_Gw_Ew = { "and", "andw", Gw, Ew, XX }, + +Ia_boundw_Gw_Ma = { "bound", "boundw", Gw, Ma, XX }, + +Ia_call_Ew = { "call", "call", Ew, XX, XX }, +Ia_call_Jd = { "call", "call", Jd, XX, XX }, +Ia_call_Jw = { "call", "call", Jw, XX, XX }, +Ia_cbw = { "cbw", "cbtw", XX, XX, XX }, +Ia_clc = { "clc", "clc", XX, XX, XX }, +Ia_cld = { "cld", "cld", XX, XX, XX }, +Ia_cli = { "cli", "cli", XX, XX, XX }, +Ia_cmc = { "cmc", "cmc", XX, XX, XX }, + +Ia_cmpb_AL_Ib = { "cmp", "cmpb", AL, Ib, XX }, +Ia_cmpb_Eb_Gb = { "cmp", "cmpb", Eb, Gb, XX }, +Ia_cmpb_Eb_Ib = { "cmp", "cmpb", Eb, Ib, XX }, +Ia_cmpb_Gb_Eb = { "cmp", "cmpb", Gb, Eb, XX }, +Ia_cmpsb_Yb_Xb = { "cmpsb", "cmpsb", Yb, Xb, XX }, +Ia_cmpsl_Yd_Xd = { "cmpsd", "cmpsl", Yd, Xd, XX }, +Ia_cmpsw_Yw_Xw = { "cmpsw", "cmpsw", Yw, Xw, XX }, +Ia_cmpw_AX_Iw = { "cmp", "cmpw", AX, Iw, XX }, +Ia_cmpw_Ew_Gw = { "cmp", "cmpw", Ew, Gw, XX }, +Ia_cmpw_Ew_Iw = { "cmp", "cmpw", Ew, Iw, XX }, +Ia_cmpw_Ew_sIb = { "cmp", "cmpw", Ew, sIbw, XX }, +Ia_cmpw_Gw_Ew = { "cmp", "cmpw", Gw, Ew, XX }, + +Ia_cwd = { "cwd", "cwtd", XX, XX, XX }, +Ia_daa = { "daa", "daa", XX, XX, XX }, +Ia_das = { "das", "das", XX, XX, XX }, +Ia_decb_Eb = { "dec", "decb", Eb, XX, XX }, +Ia_decw_Ew = { "dec", "decw", Ew, XX, XX }, +Ia_decw_RX = { "dec", "decw", RX, XX, XX }, +Ia_divb_AL_Eb = { "div", "divb", AL, Eb, XX }, +Ia_divw_AX_Ew = { "div", "divw", AX, Ew, XX }, +Ia_enter = { "enter", "enter", IwIb, XX, XX }, +Ia_error = { "(error)", "(error)", XX, XX, XX }, + +Ia_idivb_AL_Eb = { "idiv", "idivb", AL, Eb, XX }, +Ia_idivw_AX_Ew = { "idiv", "idivw", AX, Ew, XX }, +Ia_imulb_AL_Eb = { "imul", "imulb", AL, Eb, XX }, +Ia_imulw_AX_Ew = { "imul", "imulw", AX, Ew, XX }, +Ia_imulw_Gw_Ew = { "imul", "imulw", Gw, Ew, XX }, +Ia_imulw_Gw_Ew_Iw = { "imul", "imulw", Gw, Ew, Iw }, +Ia_imulw_Gw_Ew_sIb = { "imul", "imulw", Gw, Ew, sIbw }, +Ia_inb_AL_DX = { "in", "inb", AL, DX, XX }, +Ia_inb_AL_Ib = { "in", "inb", AL, Ib, XX }, +Ia_incb_Eb = { "inc", "incb", Eb, XX, XX }, +Ia_incw_Ew = { "inc", "incw", Ew, XX, XX }, +Ia_incw_RX = { "inc", "incw", RX, XX, XX }, +Ia_insb_Yb_DX = { "insb", "insb", Yb, DX, XX }, +Ia_insw_Yw_DX = { "insw", "insw", Yw, DX, XX }, +Ia_int_Ib = { "int", "int", Ib, XX, XX }, +Ia_int1 = { "int1", "int1", XX, XX, XX }, +Ia_int3 = { "int3", "int3", XX, XX, XX }, +Ia_into = { "into", "into", XX, XX, XX }, +Ia_Invalid = { "(invalid)", "(invalid)", XX, XX, XX }, +Ia_invd = { "invd", "invd", XX, XX, XX }, +Ia_invlpg = { "invlpg", "invlpg", Mx, XX, XX }, +Ia_inw_AX_DX = { "in", "inw", AX, DX, XX }, +Ia_inw_AX_Ib = { "in", "inw", AX, Ib, XX }, +Ia_iretl = { "iretd", "iretd", XX, XX, XX }, +Ia_iretq = { "iretq", "iretq", XX, XX, XX }, +Ia_iretw = { "iret", "iretw", XX, XX, XX }, +Ia_jb_Jb = { "jb", "jb", Jb, XX, XX }, +Ia_jb_Jd = { "jb", "jb", Jd, XX, XX }, +Ia_jb_Jw = { "jb", "jb", Jw, XX, XX }, +Ia_jbe_Jb = { "jbe", "jbe", Jb, XX, XX }, +Ia_jbe_Jd = { "jbe", "jbe", Jd, XX, XX }, +Ia_jbe_Jw = { "jbe", "jbe", Jw, XX, XX }, +Ia_jcxz_Jb = { "jcxz", "jcxz", Jb, XX, XX }, +Ia_jecxz_Jb = { "jecxz", "jecxz", Jb, XX, XX }, +Ia_jl_Jb = { "jl", "jl", Jb, XX, XX }, +Ia_jl_Jd = { "jl", "jl", Jd, XX, XX }, +Ia_jl_Jw = { "jl", "jl", Jw, XX, XX }, +Ia_jle_Jb = { "jle", "jle", Jb, XX, XX }, +Ia_jle_Jd = { "jle", "jle", Jd, XX, XX }, +Ia_jle_Jw = { "jle", "jle", Jw, XX, XX }, +Ia_jmp_Ew = { "jmp", "jmp", Ew, XX, XX }, +Ia_jmp_Jb = { "jmp", "jmp", Jb, XX, XX }, +Ia_jmp_Jd = { "jmp", "jmp", Jd, XX, XX }, +Ia_jmp_Jw = { "jmp", "jmp", Jw, XX, XX }, +Ia_jnb_Jb = { "jnb", "jnb", Jb, XX, XX }, +Ia_jnb_Jd = { "jnb", "jnb", Jd, XX, XX }, +Ia_jnb_Jw = { "jnb", "jnb", Jw, XX, XX }, +Ia_jnbe_Jb = { "jnbe", "jnbe", Jb, XX, XX }, +Ia_jnbe_Jd = { "jnbe", "jnbe", Jd, XX, XX }, +Ia_jnbe_Jw = { "jnbe", "jnbe", Jw, XX, XX }, +Ia_jnl_Jb = { "jnl", "jnl", Jb, XX, XX }, +Ia_jnl_Jd = { "jnl", "jnl", Jd, XX, XX }, +Ia_jnl_Jw = { "jnl", "jnl", Jw, XX, XX }, +Ia_jnle_Jb = { "jnle", "jnle", Jb, XX, XX }, +Ia_jnle_Jd = { "jnle", "jnle", Jd, XX, XX }, +Ia_jnle_Jw = { "jnle", "jnle", Jw, XX, XX }, +Ia_jno_Jb = { "jno", "jno", Jb, XX, XX }, +Ia_jno_Jd = { "jno", "jno", Jd, XX, XX }, +Ia_jno_Jw = { "jno", "jno", Jw, XX, XX }, +Ia_jnp_Jb = { "jnp", "jnp", Jb, XX, XX }, +Ia_jnp_Jd = { "jnp", "jnp", Jd, XX, XX }, +Ia_jnp_Jw = { "jnp", "jnp", Jw, XX, XX }, +Ia_jns_Jb = { "jns", "jns", Jb, XX, XX }, +Ia_jns_Jd = { "jns", "jns", Jd, XX, XX }, +Ia_jns_Jw = { "jns", "jns", Jw, XX, XX }, +Ia_jnz_Jb = { "jnz", "jnz", Jb, XX, XX }, +Ia_jnz_Jd = { "jnz", "jnz", Jd, XX, XX }, +Ia_jnz_Jw = { "jnz", "jnz", Jw, XX, XX }, +Ia_jo_Jb = { "jo", "jo", Jb, XX, XX }, +Ia_jo_Jd = { "jo", "jo", Jd, XX, XX }, +Ia_jo_Jw = { "jo", "jo", Jw, XX, XX }, +Ia_jp_Jb = { "jp", "jp", Jb, XX, XX }, +Ia_jp_Jd = { "jp", "jp", Jd, XX, XX }, +Ia_jp_Jw = { "jp", "jp", Jw, XX, XX }, +Ia_jrcxz_Jb = { "jrcxz", "jrcxz", Jb, XX, XX }, +Ia_js_Jb = { "js", "js", Jb, XX, XX }, +Ia_js_Jd = { "js", "js", Jd, XX, XX }, +Ia_js_Jw = { "js", "js", Jw, XX, XX }, +Ia_jz_Jb = { "jz", "jz", Jb, XX, XX }, +Ia_jz_Jd = { "jz", "jz", Jd, XX, XX }, +Ia_jz_Jw = { "jz", "jz", Jw, XX, XX }, +Ia_lahf = { "lahf", "lahf", XX, XX, XX }, +Ia_larw_Gw_Ew = { "lar", "larw", Gw, Ew, XX }, +Ia_lcall_Apd = { "call far", "lcall", Apd, XX, XX }, +Ia_lcall_Apw = { "call far", "lcall", Apw, XX, XX }, +Ia_lcall_Mp = { "call far", "lcall", Mp, XX, XX }, +Ia_ldsw_Gw_Mp = { "lds", "ldsw", Gw, Mp, XX }, +Ia_leave = { "leave", "leave", XX, XX, XX }, +Ia_leaw_Gw_Mw = { "lea", "leaw", Gw, Mw, XX }, +Ia_lesw_Gw_Mp = { "les", "lesw", Gw, Mp, XX }, +Ia_lfence = { "lfence", "lfence", XX, XX, XX }, +Ia_lfsw_Gw_Mp = { "lfs", "lfsw", Gw, Mp, XX }, +Ia_lgdt = { "lgdt", "lgdt", Ms, XX, XX }, +Ia_lgsw_Gw_Mp = { "lgs", "lgsw", Gw, Mp, XX }, +Ia_lidt = { "lidt", "lidt", Ms, XX, XX }, +Ia_ljmp_Apd = { "jmp far", "ljmp", Apd, XX, XX }, +Ia_ljmp_Apw = { "jmp far", "ljmp", Apw, XX, XX }, +Ia_ljmp_Mp = { "jmp far", "ljmp", Mp, XX, XX }, +Ia_lldt = { "lldt", "lldt", Ew, XX, XX }, +Ia_lmsw_Ew = { "lmsw", "lmsw", Ew, XX, XX }, +Ia_lodsb_AL_Xb = { "lodsb", "lodsb", AL, Xb, XX }, +Ia_lodsw_AX_Xw = { "lodsw", "lodsw", AX, Xw, XX }, +Ia_loop_Jb = { "loop", "loop", Jb, XX, XX }, +Ia_loope_Jb = { "loope", "loope", Jb, XX, XX }, +Ia_loopne_Jb = { "loopne", "loopne", Jb, XX, XX }, +Ia_lret = { "retf", "lret", XX, XX, XX }, +Ia_lret_Iw = { "retf", "lret", Iw, XX, XX }, +Ia_lslw_Gw_Ew = { "lsl", "lslw", Gw, Ew, XX }, +Ia_lssw_Gw_Mp = { "lss", "lssw", Gw, Mp, XX }, +Ia_ltr = { "ltr", "ltr", Ew, XX, XX }, + +Ia_movb_AL_Ob = { "mov", "movb", AL, Ob, XX }, +Ia_movb_Eb_Gb = { "mov", "movb", Eb, Gb, XX }, +Ia_movb_Eb_Ib = { "mov", "movb", Eb, Ib, XX }, +Ia_movb_Gb_Eb = { "mov", "movb", Gb, Eb, XX }, +Ia_movb_Ob_AL = { "mov", "movb", Ob, AL, XX }, +Ia_movb_R8_Ib = { "mov", "movb", R8, Ib, XX }, + +Ia_movsb_Yb_Xb = { "movsb", "movsb", Yb, Xb, XX }, +Ia_movsbw_Gw_Eb = { "movsx", "movsbw", Gw, Eb, XX }, +Ia_movsl_Yd_Xd = { "movsd", "movsl", Yd, Xd, XX }, +Ia_movsq_Yq_Xq = { "movsq", "movsq", Yq, Xq, XX }, +Ia_movsw_Yw_Xw = { "movsw", "movsw", Yw, Xw, XX }, +Ia_movw_AX_Ow = { "mov", "movw", AX, Ow, XX }, +Ia_movw_Ew_Gw = { "mov", "movw", Ew, Gw, XX }, +Ia_movw_Ew_Iw = { "mov", "movw", Ew, Iw, XX }, +Ia_movw_Ew_Sw = { "mov", "movw", Ew, Sw, XX }, +Ia_movw_Gw_Ew = { "mov", "movw", Gw, Ew, XX }, +Ia_movw_Ow_AX = { "mov", "movw", Ow, AX, XX }, +Ia_movw_RX_Iw = { "mov", "movw", RX, Iw, XX }, +Ia_movw_Sw_Ew = { "mov", "movw", Sw, Ew, XX }, +Ia_movzbw_Gw_Eb = { "movzx", "movzbw", Gw, Eb, XX }, +Ia_mulb_AL_Eb = { "mul", "mulb", AL, Eb, XX }, +Ia_multibyte_nop = { "multibyte nop", "multibyte nop", XX, XX, XX }, +Ia_mulw_AX_Ew = { "mul", "mulw", AX, Ew, XX }, +Ia_mwait = { "mwait", "mwait", XX, XX, XX }, +Ia_negb_Eb = { "neg", "negb", Eb, XX, XX }, +Ia_negw_Ew = { "neg", "negw", Ew, XX, XX }, +Ia_nop = { "nop", "nop", XX, XX, XX }, +Ia_notb_Eb = { "not", "notb", Eb, XX, XX }, +Ia_notw_Ew = { "not", "notw", Ew, XX, XX }, +Ia_orb_AL_Ib = { "or", "orb", AL, Ib, XX }, +Ia_orb_Eb_Gb = { "or", "orb", Eb, Gb, XX }, +Ia_orb_Eb_Ib = { "or", "orb", Eb, Ib, XX }, +Ia_orb_Gb_Eb = { "or", "orb", Gb, Eb, XX }, +Ia_orw_AX_Iw = { "or", "orw", AX, Iw, XX }, +Ia_orw_Ew_Gw = { "or", "orw", Ew, Gw, XX }, +Ia_orw_Ew_Iw = { "or", "orw", Ew, Iw, XX }, +Ia_orw_Ew_sIb = { "or", "orw", Ew, sIbw, XX }, +Ia_orw_Gw_Ew = { "or", "orw", Gw, Ew, XX }, +Ia_outb_DX_AL = { "out", "outb", DX, AL, XX }, +Ia_outb_Ib_AL = { "out", "outb", Ib, AL, XX }, +Ia_outsb_DX_Xb = { "outsb", "outsb", DX, Xb, XX }, +Ia_outsl_DX_Xd = { "outsd", "outsl", DX, Xd, XX }, +Ia_outsw_DX_Xw = { "outsw", "outsw", DX, Xw, XX }, +Ia_outw_DX_AX = { "out", "outw", DX, AX, XX }, +Ia_outw_Ib_AX = { "out", "outw", Ib, AX, XX }, + +Ia_popaw = { "popa", "popa", XX, XX, XX }, +Ia_popfw = { "popf", "popf", XX, XX, XX }, + +Ia_popw_DS = { "pop", "popw", DS, XX, XX }, +Ia_popw_ES = { "pop", "popw", ES, XX, XX }, +Ia_popw_Ew = { "pop", "popw", Ew, XX, XX }, +Ia_popw_RX = { "pop", "popw", RX, XX, XX }, +Ia_popw_SS = { "pop", "popw", SS, XX, XX }, + +Ia_prefix_cs = { "cs", "cs", XX, XX, XX }, +Ia_prefix_ds = { "ds", "ds", XX, XX, XX }, +Ia_prefix_es = { "es", "es", XX, XX, XX }, + +Ia_prefix_lock = { "lock", "lock", XX, XX, XX }, +Ia_prefix_rep = { "rep", "rep", XX, XX, XX }, +Ia_prefix_repne = { "repne", "repne", XX, XX, XX }, +Ia_prefix_ss = { "ss", "ss", XX, XX, XX }, + +Ia_pushal = { "pushad", "pushal", XX, XX, XX }, +Ia_pushaw = { "pusha", "pusha", XX, XX, XX }, +Ia_pushfl = { "pushfd", "pushfl", XX, XX, XX }, +Ia_pushfq = { "pushfq", "pushfq", XX, XX, XX }, +Ia_pushfw = { "pushf", "pushf", XX, XX, XX }, +Ia_pushl_CS = { "push", "pushl", CS, XX, XX }, +Ia_pushl_DS = { "push", "pushl", DS, XX, XX }, +Ia_pushl_ES = { "push", "pushl", ES, XX, XX }, +Ia_pushl_sIb = { "push", "pushl", sIbd, XX, XX }, +Ia_pushl_SS = { "push", "pushl", SS, XX, XX }, +Ia_pushw_CS = { "push", "pushw", CS, XX, XX }, +Ia_pushw_DS = { "push", "pushw", DS, XX, XX }, +Ia_pushw_ES = { "push", "pushw", ES, XX, XX }, +Ia_pushw_Ew = { "push", "pushw", Ew, XX, XX }, +Ia_pushw_Iw = { "push", "pushw", Iw, XX, XX }, +Ia_pushw_RX = { "push", "pushw", RX, XX, XX }, +Ia_pushw_sIb = { "push", "pushw", sIbw, XX, XX }, +Ia_pushw_SS = { "push", "pushw", SS, XX, XX }, +Ia_rclb_Eb_CL = { "rcl", "rclb", Eb, CL, XX }, +Ia_rclb_Eb_I1 = { "rcl", "rclb", Eb, I1, XX }, +Ia_rclb_Eb_Ib = { "rcl", "rclb", Eb, Ib, XX }, +Ia_rclw_Ew_CL = { "rcl", "rclw", Ew, CL, XX }, +Ia_rclw_Ew_I1 = { "rcl", "rclw", Ew, I1, XX }, +Ia_rclw_Ew_Ib = { "rcl", "rclw", Ew, Ib, XX }, +Ia_rcrb_Eb_CL = { "rcr", "rcrb", Eb, CL, XX }, +Ia_rcrb_Eb_I1 = { "rcr", "rcrb", Eb, I1, XX }, +Ia_rcrb_Eb_Ib = { "rcr", "rcrb", Eb, Ib, XX }, +Ia_rcrw_Ew_CL = { "rcr", "rcrw", Ew, CL, XX }, +Ia_rcrw_Ew_I1 = { "rcr", "rcrw", Ew, I1, XX }, +Ia_rcrw_Ew_Ib = { "rcr", "rcrw", Ew, Ib, XX }, +Ia_rdmsr = { "rdmsr", "rdmsr", XX, XX, XX }, +Ia_rdpmc = { "rdpmc", "rdpmc", XX, XX, XX }, +Ia_rdtsc = { "rdtsc", "rdtsc", XX, XX, XX }, +Ia_rdtscp = { "rdtscp", "rdtscp", XX, XX, XX }, +Ia_ret = { "ret", "ret", XX, XX, XX }, +Ia_ret_Iw = { "ret", "ret", Iw, XX, XX }, +Ia_rolb_Eb_CL = { "rol", "rolb", Eb, CL, XX }, +Ia_rolb_Eb_I1 = { "rol", "rolb", Eb, I1, XX }, +Ia_rolb_Eb_Ib = { "rol", "rolb", Eb, Ib, XX }, +Ia_rolw_Ew_CL = { "rol", "rolw", Ew, CL, XX }, +Ia_rolw_Ew_I1 = { "rol", "rolw", Ew, I1, XX }, +Ia_rolw_Ew_Ib = { "rol", "rolw", Ew, Ib, XX }, +Ia_rorb_Eb_CL = { "ror", "rorb", Eb, CL, XX }, +Ia_rorb_Eb_I1 = { "ror", "rorb", Eb, I1, XX }, +Ia_rorb_Eb_Ib = { "ror", "rorb", Eb, Ib, XX }, +Ia_rorw_Ew_CL = { "ror", "rorw", Ew, CL, XX }, +Ia_rorw_Ew_I1 = { "ror", "rorw", Ew, I1, XX }, +Ia_rorw_Ew_Ib = { "ror", "rorw", Ew, Ib, XX }, +Ia_rsm = { "rsm", "rsm", XX, XX, XX }, +Ia_sahf = { "sahf", "sahf", XX, XX, XX }, +Ia_salc = { "salc", "salc", XX, XX, XX }, +Ia_sarb_Eb_CL = { "sar", "sarb", Eb, CL, XX }, +Ia_sarb_Eb_I1 = { "sar", "sarb", Eb, I1, XX }, +Ia_sarb_Eb_Ib = { "sar", "sarb", Eb, Ib, XX }, +Ia_sarw_Ew_CL = { "sar", "sarw", Ew, CL, XX }, +Ia_sarw_Ew_I1 = { "sar", "sarw", Ew, I1, XX }, +Ia_sarw_Ew_Ib = { "sar", "sarw", Ew, Ib, XX }, +Ia_sbbb_AL_Ib = { "sbb", "sbbb", AL, Ib, XX }, +Ia_sbbb_Eb_Gb = { "sbb", "sbbb", Eb, Gb, XX }, +Ia_sbbb_Eb_Ib = { "sbb", "sbbb", Eb, Ib, XX }, +Ia_sbbb_Gb_Eb = { "sbb", "sbbb", Gb, Eb, XX }, +Ia_sbbw_AX_Iw = { "sbb", "sbbw", AX, Iw, XX }, +Ia_sbbw_Ew_Gw = { "sbb", "sbbw", Ew, Gw, XX }, +Ia_sbbw_Ew_Iw = { "sbb", "sbbw", Ew, Iw, XX }, +Ia_sbbw_Ew_sIb = { "sbb", "sbbw", Ew, sIbw, XX }, +Ia_sbbw_Gw_Ew = { "sbb", "sbbw", Gw, Ew, XX }, +Ia_scasb_Yb_AL = { "scasb", "scasb", Yb, AL, XX }, +Ia_scasw_Yw_AX = { "scasw", "scasw", Yw, AX, XX }, +Ia_setb_Eb = { "setb", "setb", Eb, XX, XX }, +Ia_setbe_Eb = { "setbe", "setbe", Eb, XX, XX }, +Ia_setl_Eb = { "setl", "setl", Eb, XX, XX }, +Ia_setle_Eb = { "setle", "setle", Eb, XX, XX }, +Ia_setnb_Eb = { "setnb", "setnb", Eb, XX, XX }, +Ia_setnbe_Eb = { "setnbe", "setnbe", Eb, XX, XX }, +Ia_setnl_Eb = { "setnl", "setnl", Eb, XX, XX }, +Ia_setnle_Eb = { "setnle", "setnle", Eb, XX, XX }, +Ia_setno_Eb = { "setno", "setno", Eb, XX, XX }, +Ia_setnp_Eb = { "setnp", "setnp", Eb, XX, XX }, +Ia_setns_Eb = { "setns", "setns", Eb, XX, XX }, +Ia_setnz_Eb = { "setnz", "setnz", Eb, XX, XX }, +Ia_seto_Eb = { "seto", "seto", Eb, XX, XX }, +Ia_setp_Eb = { "setp", "setp", Eb, XX, XX }, +Ia_sets_Eb = { "sets", "sets", Eb, XX, XX }, +Ia_setz_Eb = { "setz", "setz", Eb, XX, XX }, +Ia_shlb_Eb_CL = { "shl", "shlb", Eb, CL, XX }, +Ia_shlb_Eb_I1 = { "shl", "shlb", Eb, I1, XX }, +Ia_shlb_Eb_Ib = { "shl", "shlb", Eb, Ib, XX }, +Ia_shlw_Ew_CL = { "shl", "shlw", Ew, CL, XX }, +Ia_shlw_Ew_I1 = { "shl", "shlw", Ew, I1, XX }, +Ia_shlw_Ew_Ib = { "shl", "shlw", Ew, Ib, XX }, +Ia_shrb_Eb_CL = { "shr", "shrb", Eb, CL, XX }, +Ia_shrb_Eb_I1 = { "shr", "shrb", Eb, I1, XX }, +Ia_shrb_Eb_Ib = { "shr", "shrb", Eb, Ib, XX }, +Ia_shrw_Ew_CL = { "shr", "shrw", Ew, CL, XX }, +Ia_shrw_Ew_I1 = { "shr", "shrw", Ew, I1, XX }, +Ia_shrw_Ew_Ib = { "shr", "shrw", Ew, Ib, XX }, +Ia_sidt = { "sidt", "sidt", Ms, XX, XX }, +Ia_sldt = { "sldt", "sldt", Ew, XX, XX }, +Ia_stc = { "stc", "stc", XX, XX, XX }, +Ia_std = { "std", "std", XX, XX, XX }, +Ia_sti = { "sti", "sti", XX, XX, XX }, +Ia_stosb_Yb_AL = { "stosb", "stosb", Yb, AL, XX }, +Ia_stosw_Yw_AX = { "stosw", "stosw", Yw, AX, XX }, +Ia_str = { "str", "str", Ew, XX, XX }, +Ia_subb_AL_Ib = { "sub", "subb", AL, Ib, XX }, +Ia_subb_Eb_Gb = { "sub", "subb", Eb, Gb, XX }, +Ia_subb_Eb_Ib = { "sub", "subb", Eb, Ib, XX }, +Ia_subb_Gb_Eb = { "sub", "subb", Gb, Eb, XX }, +Ia_subw_AX_Iw = { "sub", "subw", AX, Iw, XX }, +Ia_subw_Ew_Gw = { "sub", "subw", Ew, Gw, XX }, +Ia_subw_Ew_Iw = { "sub", "subw", Ew, Iw, XX }, +Ia_subw_Ew_sIb = { "sub", "subw", Ew, sIbw, XX }, +Ia_subw_Gw_Ew = { "sub", "subw", Gw, Ew, XX }, +Ia_swapgs = { "swapgs", "swapgs", XX, XX, XX }, +Ia_syscall = { "syscall", "syscall", XX, XX, XX }, +Ia_sysenter = { "sysenter", "sysenter", XX, XX, XX }, +Ia_sysexit = { "sysexit", "sysexit", XX, XX, XX }, +Ia_sysret = { "sysret", "sysret", XX, XX, XX }, + +Ia_testb_AL_Ib = { "test", "testb", AL, Ib, XX }, +Ia_testb_Eb_Gb = { "test", "testb", Eb, Gb, XX }, +Ia_testb_Eb_Ib = { "test", "testb", Eb, Ib, XX }, +Ia_testw_AX_Iw = { "test", "testw", AX, Iw, XX }, +Ia_testw_Ew_Gw = { "test", "testw", Ew, Gw, XX }, +Ia_testw_Ew_Iw = { "test", "testw", Ew, Iw, XX }, + +Ia_xaddb_Eb_Gb = { "xadd", "xaddb", Eb, Gb, XX }, +Ia_xaddw_Ew_Gw = { "xadd", "xaddw", Ew, Gw, XX }, +Ia_xchgb_Eb_Gb = { "xchg", "xchgb", Eb, Gb, XX }, +Ia_xchgw_Ew_Gw = { "xchg", "xchgw", Ew, Gw, XX }, +Ia_xchgw_RX_AX = { "xchg", "xchgw", RX, AX, XX }, +Ia_xlat = { "xlat", "xlat", XX, XX, XX }, +Ia_xorb_AL_Ib = { "xor", "xorb", AL, Ib, XX }, +Ia_xorb_Eb_Gb = { "xor", "xorb", Eb, Gb, XX }, +Ia_xorb_Eb_Ib = { "xor", "xorb", Eb, Ib, XX }, +Ia_xorb_Gb_Eb = { "xor", "xorb", Gb, Eb, XX }, +Ia_xorw_AX_Iw = { "xor", "xorw", AX, Iw, XX }, +Ia_xorw_Ew_Gw = { "xor", "xorw", Ew, Gw, XX }, +Ia_xorw_Ew_Iw = { "xor", "xorw", Ew, Iw, XX }, +Ia_xorw_Ew_sIb = { "xor", "xorw", Ew, sIbw, XX }, +Ia_xorw_Gw_Ew = { "xor", "xorw", Gw, Ew, XX }; diff --git a/Mednafen/mednafen/wswan/dis/resolve.cpp b/Mednafen/mednafen/wswan/dis/resolve.cpp new file mode 100755 index 0000000000..b7a39387a2 --- /dev/null +++ b/Mednafen/mednafen/wswan/dis/resolve.cpp @@ -0,0 +1,227 @@ +///////////////////////////////////////////////////////////////////////// +// $Id: resolve.cc,v 1.13 2006/08/11 17:22:43 sshwarts Exp $ +///////////////////////////////////////////////////////////////////////// + +#include "disasm.h" + +#include +#include + +void disassembler::decode_modrm(x86_insn *insn) +{ + insn->modrm = fetch_byte(); + BX_DECODE_MODRM(insn->modrm, insn->mod, insn->nnn, insn->rm); + // MOVs with CRx and DRx always use register ops and ignore the mod field. + if ((insn->b1 & ~3) == 0x120) insn->mod = 3; + + if (insn->mod == 3) { + /* mod, reg, reg */ + return; + } + /* 16 bit addressing modes. */ + switch (insn->mod) { + case 0: + resolve_modrm = &disassembler::resolve16_mod0; + if(insn->rm == 6) + insn->displacement.displ16 = fetch_word(); + break; + case 1: + /* reg, 8-bit displacement, sign extend */ + resolve_modrm = &disassembler::resolve16_mod1or2; + insn->displacement.displ16 = (int8) fetch_byte(); + break; + case 2: + resolve_modrm = &disassembler::resolve16_mod1or2; + insn->displacement.displ16 = fetch_word(); + break; + } /* switch (mod) ... */ + +} + +void disassembler::resolve16_mod0(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod00_rm16[insn->rm]; + + if(insn->rm == 6) + print_memory_access16(mode, seg, NULL, insn->displacement.displ16); + else + print_memory_access16(mode, seg, index16[insn->rm], 0); +} + +void disassembler::resolve16_mod1or2(const x86_insn *insn, unsigned mode) +{ + const char *seg; + + if (insn->is_seg_override()) + seg = segment_name[insn->seg_override]; + else + seg = sreg_mod01or10_rm16[insn->rm]; + + print_memory_access16(mode, seg, index16[insn->rm], insn->displacement.displ16); +} + +void disassembler::print_datasize(unsigned size) +{ + if (!intel_mode) return; + + switch(size) + { + case B_SIZE: + dis_sprintf("byte ptr "); + break; + case W_SIZE: + dis_sprintf("word ptr "); + break; + case D_SIZE: + dis_sprintf("dword ptr "); + break; + case Q_SIZE: + dis_sprintf("qword ptr "); + break; + case O_SIZE: + dis_sprintf("dqword ptr "); + break; + case T_SIZE: + dis_sprintf("tbyte ptr "); + break; + case P_SIZE: + break; + case X_SIZE: + break; + }; +} + +void disassembler::print_memory_access16(int datasize, + const char *seg, const char *index, uint16 disp) +{ + print_datasize(datasize); + + if (intel_mode) + { + if (index == NULL) + { + dis_sprintf("%s:0x%x", seg, (unsigned) disp); + } + else + { + if (disp != 0) + dis_sprintf("%s:[%s+0x%x]", seg, index, (unsigned) disp); + else + dis_sprintf("%s:[%s]", seg, index); + } + } + else + { + if (index == NULL) + { + dis_sprintf("%s:0x%x", seg, (unsigned) disp); + } + else + { + if (disp != 0) + dis_sprintf("%s:0x%x(%s,1)", seg, (unsigned) disp, index); + else + dis_sprintf("%s:(%s,1)", seg, index); + } + } +} + +void disassembler::print_memory_access(int datasize, + const char *seg, const char *base, const char *index, int scale, uint32 disp) +{ + print_datasize(datasize); + + if (intel_mode) + { + if (base == NULL) + { + if (index == NULL) + { + dis_sprintf("%s:0x%x", seg, (unsigned) disp); + } + else + { + if (scale != 0) + { + if (disp != 0) + dis_sprintf("%s:[%s*%d+0x%x]", seg, index, 1< + +////////////////// +// Intel STYLE +////////////////// + +static const char *intel_general_16bit_regname[8] = { + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di" +}; + +static const char *intel_general_8bit_regname[8] = { + "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" +}; + +static const char *intel_segment_name[8] = { + "es", "cs", "ss", "ds", "fs", "gs", "??", "??" +}; + +static const char *intel_index16[8] = { + "bx+si", + "bx+di", + "bp+si", + "bp+di", + "si", + "di", + "bp", + "bx" +}; + + +////////////////// +// AT&T STYLE +////////////////// + +static const char *att_general_16bit_regname[8] = { + "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di" +}; + +static const char *att_general_8bit_regname[8] = { + "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh" +}; + +static const char *att_segment_name[8] = { + "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%??", "%??" +}; + +static const char *att_index16[8] = { + "%bx, %si", + "%bx, %di", + "%bp, %si", + "%bp, %di", + "%si", + "%di", + "%bp", + "%bx" +}; + +#define NULL_SEGMENT_REGISTER 7 + +void disassembler::initialize_modrm_segregs() +{ + sreg_mod00_rm16[0] = segment_name[DS_REG]; + sreg_mod00_rm16[1] = segment_name[DS_REG]; + sreg_mod00_rm16[2] = segment_name[SS_REG]; + sreg_mod00_rm16[3] = segment_name[SS_REG]; + sreg_mod00_rm16[4] = segment_name[DS_REG]; + sreg_mod00_rm16[5] = segment_name[DS_REG]; + sreg_mod00_rm16[6] = segment_name[DS_REG]; + sreg_mod00_rm16[7] = segment_name[DS_REG]; + + sreg_mod01or10_rm16[0] = segment_name[DS_REG]; + sreg_mod01or10_rm16[1] = segment_name[DS_REG]; + sreg_mod01or10_rm16[2] = segment_name[SS_REG]; + sreg_mod01or10_rm16[3] = segment_name[SS_REG]; + sreg_mod01or10_rm16[4] = segment_name[DS_REG]; + sreg_mod01or10_rm16[5] = segment_name[DS_REG]; + sreg_mod01or10_rm16[6] = segment_name[SS_REG]; + sreg_mod01or10_rm16[7] = segment_name[DS_REG]; + + sreg_mod01or10_rm32[0] = segment_name[DS_REG]; + sreg_mod01or10_rm32[1] = segment_name[DS_REG]; + sreg_mod01or10_rm32[2] = segment_name[DS_REG]; + sreg_mod01or10_rm32[3] = segment_name[DS_REG]; + sreg_mod01or10_rm32[4] = segment_name[NULL_SEGMENT_REGISTER]; + sreg_mod01or10_rm32[5] = segment_name[SS_REG]; + sreg_mod01or10_rm32[6] = segment_name[DS_REG]; + sreg_mod01or10_rm32[7] = segment_name[DS_REG]; + + sreg_mod00_base32[0] = segment_name[DS_REG]; + sreg_mod00_base32[1] = segment_name[DS_REG]; + sreg_mod00_base32[2] = segment_name[DS_REG]; + sreg_mod00_base32[3] = segment_name[DS_REG]; + sreg_mod00_base32[4] = segment_name[SS_REG]; + sreg_mod00_base32[5] = segment_name[DS_REG]; + sreg_mod00_base32[6] = segment_name[DS_REG]; + sreg_mod00_base32[7] = segment_name[DS_REG]; + + sreg_mod01or10_base32[0] = segment_name[DS_REG]; + sreg_mod01or10_base32[1] = segment_name[DS_REG]; + sreg_mod01or10_base32[2] = segment_name[DS_REG]; + sreg_mod01or10_base32[3] = segment_name[DS_REG]; + sreg_mod01or10_base32[4] = segment_name[SS_REG]; + sreg_mod01or10_base32[5] = segment_name[SS_REG]; + sreg_mod01or10_base32[6] = segment_name[DS_REG]; + sreg_mod01or10_base32[7] = segment_name[DS_REG]; +} + +////////////////// +// Intel STYLE +////////////////// + +void disassembler::set_syntax_intel() +{ + intel_mode = 1; + + general_16bit_regname = intel_general_16bit_regname; + general_8bit_regname = intel_general_8bit_regname; + + segment_name = intel_segment_name; + index16 = intel_index16; + + initialize_modrm_segregs(); +} + +void disassembler::print_disassembly_intel(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry) +{ + // print opcode + dis_sprintf("%s ", entry->IntelOpcode); + + if (entry->Operand1) { + (this->*entry->Operand1)(insn); + } + if (entry->Operand2) { + dis_sprintf(", "); + (this->*entry->Operand2)(insn); + } + if (entry->Operand3) { + dis_sprintf(", "); + (this->*entry->Operand3)(insn); + } +} + +////////////////// +// AT&T STYLE +////////////////// + +void disassembler::set_syntax_att() +{ + intel_mode = 0; + + general_16bit_regname = att_general_16bit_regname; + general_8bit_regname = att_general_8bit_regname; + + segment_name = att_segment_name; + index16 = att_index16; + + initialize_modrm_segregs(); +} + +void disassembler::toggle_syntax_mode() +{ + if (intel_mode) set_syntax_att(); + else set_syntax_intel(); +} + +void disassembler::print_disassembly_att(const x86_insn *insn, const BxDisasmOpcodeInfo_t *entry) +{ + // print opcode + dis_sprintf("%s ", entry->AttOpcode); + + if (entry->Operand3) { + (this->*entry->Operand3)(insn); + dis_sprintf(", "); + } + if (entry->Operand2) { + (this->*entry->Operand2)(insn); + dis_sprintf(", "); + } + if (entry->Operand1) { + (this->*entry->Operand1)(insn); + } +} diff --git a/Mednafen/mednafen/wswan/eeprom.cpp b/Mednafen/mednafen/wswan/eeprom.cpp new file mode 100644 index 0000000000..4cc20f217c --- /dev/null +++ b/Mednafen/mednafen/wswan/eeprom.cpp @@ -0,0 +1,233 @@ +/* Cygne + * + * Copyright notice for this file: + * Copyright (C) 2002 Dox dox@space.pl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "eeprom.h" +#include "memory.h" +#include + +namespace MDFN_IEN_WSWAN +{ + + + +uint8 wsEEPROM[2048]; +static uint8 iEEPROM[0x400]; +static const uint8 iEEPROM_Init[0x400] = +{ + 255,255,255,255,255,255,192,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 0,252,255,1,255,253,255,253,255,253,255,253, + 255,253,255,253,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 0,0,3,3,0,0,0,64,128,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 135,5,140,9,5,12,139,12,144,0,0,2, + 0,76,165,0,128,0,0,0,255,127,255,127, + 255,127,255,127,255,127,255,127,255,127,255,127, + 255,127,255,127,255,127,255,127,255,127,255,127, + 255,127,255,127,255,127,255,127,255,127,255,127, + 255,127,255,127,255,127,255,127,255,127,255,127, + 255,127,255,127,255,127,255,127,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 0,0,6,6,6,6,6,0,0,0,0,0, + 1,128,15,0,1,1,1,15,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0, + 'C'-54,'Y'-54,'G'-54,'N'-54,'E'-54,0,0,0,0,0,0,0,0,0,0, + 0,32,1,1,33,1,4,0,1, + 0,152,60,127,74,1,53,1,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255 +}; + +static uint8 iEEPROM_Command, EEPROM_Command; +static uint16 iEEPROM_Address, EEPROM_Address; + +uint8 WSwan_EEPROMRead(uint32 A) +{ + switch(A) + { + default: printf("Read: %04x\n", A); break; + + case 0xBA: return(iEEPROM[(iEEPROM_Address << 1) & 0x3FF]); + case 0xBB: return(iEEPROM[((iEEPROM_Address << 1) | 1) & 0x3FF]); + case 0xBC: return(iEEPROM_Address >> 0); + case 0xBD: return(iEEPROM_Address >> 8); + case 0xBE: + if(iEEPROM_Command & 0x20) return iEEPROM_Command|2; + if(iEEPROM_Command & 0x10) return iEEPROM_Command|1; + return iEEPROM_Command | 3; + + + case 0xC4: return(wsEEPROM[(EEPROM_Address << 1) & (eeprom_size - 1)]); + case 0xC5: return(wsEEPROM[((EEPROM_Address << 1) | 1) & (eeprom_size - 1)]); + case 0xC6: return(EEPROM_Address >> 0); + case 0xC7: return(EEPROM_Address >> 8); + case 0xC8: if(EEPROM_Command & 0x20) return EEPROM_Command|2; + if(EEPROM_Command & 0x10) return EEPROM_Command|1; + return EEPROM_Command | 3; + } + return(0); +} + + +void WSwan_EEPROMWrite(uint32 A, uint8 V) +{ + switch(A) + { + case 0xBA: iEEPROM[(iEEPROM_Address << 1) & 0x3FF] = V; break; + case 0xBB: iEEPROM[((iEEPROM_Address << 1) | 1) & 0x3FF] = V; break; + case 0xBC: iEEPROM_Address &= 0xFF00; iEEPROM_Address |= (V << 0); break; + case 0xBD: iEEPROM_Address &= 0x00FF; iEEPROM_Address |= (V << 8); break; + case 0xBE: iEEPROM_Command = V; break; + + case 0xC4: wsEEPROM[(EEPROM_Address << 1) & (eeprom_size - 1)] = V; break; + case 0xC5: wsEEPROM[((EEPROM_Address << 1) | 1) & (eeprom_size - 1)] = V; break; + + case 0xC6: EEPROM_Address &= 0xFF00; EEPROM_Address |= (V << 0); break; + case 0xC7: EEPROM_Address &= 0x00FF; EEPROM_Address |= (V << 8); break; + case 0xC8: EEPROM_Command = V; break; + } +} + +void WSwan_EEPROMReset(void) +{ + iEEPROM_Command = EEPROM_Command = 0; + iEEPROM_Address = EEPROM_Address = 0; +} + +void WSwan_EEPROMInit(const char *Name, const uint16 BYear, const uint8 BMonth, const uint8 BDay, const uint8 Sex, const uint8 Blood) +{ + memset(wsEEPROM, 0, 2048); + memcpy(iEEPROM, iEEPROM_Init, 0x400); + + for(unsigned int x = 0; x < 16; x++) + { + uint8 zechar = 0; + + if(x < strlen(Name)) + { + char tc = toupper(Name[x]); + if(tc == ' ') zechar = 0; + else if(tc >= '0' && tc <= '9') zechar = tc - '0' + 0x1; + else if(tc >= 'A' && tc <= 'Z') zechar = tc - 'A' + 0xB; + else if(tc >= 'a' && tc <= 'z') zechar = tc - 'a' + 0xB + 26; + } + iEEPROM[0x360 + x] = zechar; + } + + #define mBCD16(value) ( (((((value)%100) / 10) <<4)|((value)%10)) | ((((((value / 100)%100) / 10) <<4)|((value / 100)%10))<<8) ) + #define INT16_TO_BCD(A) ((((((A) % 100) / 10) * 16 + ((A) % 10))) | (((((((A) / 100) % 100) / 10) * 16 + (((A) / 100) % 10))) << 8)) // convert INT16 --> BCD + + uint16 bcd_BYear = INT16_TO_BCD(BYear); + + iEEPROM[0x370] = (bcd_BYear >> 8) & 0xFF; + iEEPROM[0x371] = (bcd_BYear >> 0) & 0xFF; + iEEPROM[0x372] = mBCD(BMonth); + iEEPROM[0x373] = mBCD(BDay); + iEEPROM[0x374] = Sex; + iEEPROM[0x375] = Blood; +} + +void WSwan_EEPROMStateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(iEEPROM_Command), + SFVAR(iEEPROM_Address), + SFVAR(EEPROM_Command), + SFVAR(EEPROM_Address), + SFARRAY(iEEPROM, sizeof(iEEPROM)), + SFARRAYN(eeprom_size ? wsEEPROM : NULL, eeprom_size, "EEPROM"), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "EEPR"); + + if(load) + { + + } +} + +} diff --git a/Mednafen/mednafen/wswan/eeprom.h b/Mednafen/mednafen/wswan/eeprom.h new file mode 100644 index 0000000000..c323116195 --- /dev/null +++ b/Mednafen/mednafen/wswan/eeprom.h @@ -0,0 +1,15 @@ +#ifndef __WSWAN_EEPROM_H +#define __WSWAN_EEPROM_H + +namespace MDFN_IEN_WSWAN +{ + +uint8 WSwan_EEPROMRead(uint32 A); +void WSwan_EEPROMWrite(uint32 A, uint8 V); +void WSwan_EEPROMStateAction(StateMem *sm, const unsigned load, const bool data_only); +void WSwan_EEPROMReset(void); +void WSwan_EEPROMInit(const char *Name, const uint16 BYear, const uint8 BMonth, const uint8 BDay, const uint8 Sex, const uint8 Blood); + +} + +#endif diff --git a/Mednafen/mednafen/wswan/gfx.cpp b/Mednafen/mednafen/wswan/gfx.cpp new file mode 100644 index 0000000000..d2737db21a --- /dev/null +++ b/Mednafen/mednafen/wswan/gfx.cpp @@ -0,0 +1,1123 @@ +/* Cygne + * + * Copyright notice for this file: + * Copyright (C) 2002 Dox dox@space.pl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "gfx.h" +#include "memory.h" +#include "v30mz.h" +#include "rtc.h" +#include "comm.h" +#include +#include + +namespace MDFN_IEN_WSWAN +{ + +static uint32 wsMonoPal[16][4]; +static uint32 wsColors[8]; +static uint32 wsCols[16][16]; + +static uint32 ColorMapG[16]; +static uint32 ColorMap[16*16*16]; +static uint32 LayerEnabled; + +static uint8 wsLine; /*current scanline*/ +static uint8 weppy; + +static uint8 SpriteTable[0x80][4]; +static uint32 SpriteCountCache; +static uint8 DispControl; +static uint8 BGColor; +static uint8 LineCompare; +static uint8 SPRBase; +static uint8 SpriteStart, SpriteCount; +static uint8 FGBGLoc; +static uint8 FGx0, FGy0, FGx1, FGy1; +static uint8 SPRx0, SPRy0, SPRx1, SPRy1; + +static uint8 BGXScroll, BGYScroll; +static uint8 FGXScroll, FGYScroll; +static uint8 LCDControl, LCDIcons; + +static uint8 BTimerControl; +static uint16 HBTimerPeriod; +static uint16 VBTimerPeriod; + +static uint16 HBCounter, VBCounter; +static uint8 VideoMode; + +#ifdef WANT_DEBUGGER + +enum +{ + GFX_GSREG_DISPCONTROL = 0, + GFX_GSREG_VIDEOMODE, + GFX_GSREG_LCDCONTROL, + GFX_GSREG_LCDICONS, + GFX_GSREG_BTIMERCONTROL, + GFX_GSREG_HBTIMERPERIOD, + GFX_GSREG_VBTIMERPERIOD, + GFX_GSREG_HBCOUNTER, + GFX_GSREG_VBCOUNTER, + GFX_GSREG_BGCOLOR, + GFX_GSREG_LINECOMPARE, + GFX_GSREG_SPRBASE, + GFX_GSREG_SPRITESTART, + GFX_GSREG_SPRITECOUNT, + + GFX_GSREG_FGBGLOC, + GFX_GSREG_FGX0, + GFX_GSREG_FGY0, + GFX_GSREG_FGX1, + GFX_GSREG_FGY1, + GFX_GSREG_SPRX0, + GFX_GSREG_SPRY0, + GFX_GSREG_SPRX1, + GFX_GSREG_SPRY1, + + GFX_GSREG_BGXSCROLL, + GFX_GSREG_BGYSCROLL, + GFX_GSREG_FGXSCROLL, + GFX_GSREG_FGYSCROLL +}; + +RegType WSwanGfxRegs[] = +{ + { GFX_GSREG_DISPCONTROL, "DispControl", "Display Control", 1 }, + { GFX_GSREG_VIDEOMODE, "VideoMode", "Video Mode", 1 }, + { GFX_GSREG_LCDCONTROL, "LCDControl", "LCD Control", 1 }, + { GFX_GSREG_LCDICONS, "LCDIcons", "LCD Icons", 1 }, + { GFX_GSREG_BTIMERCONTROL, "BTimerControl", "VB/HB Timer Control", 1 }, + { GFX_GSREG_HBTIMERPERIOD, "HBTimerPeriod", "Horizontal blank timer counter period", 2 }, + { GFX_GSREG_VBTIMERPERIOD, "VBTimerPeriod", "Vertical blank timer counter period", 2 }, + { GFX_GSREG_HBCOUNTER, "HBCounter", "Horizontal blank counter", 1 }, + { GFX_GSREG_VBCOUNTER, "VBCounter", "Vertical blank counter", 1 }, + { GFX_GSREG_BGCOLOR, "BGColor", "Background Color", 1 }, + { GFX_GSREG_LINECOMPARE, "LineCompare", "Line Compare", 1 }, + { GFX_GSREG_SPRBASE, "SPRBase", "Sprite Table Base", 1 }, + { GFX_GSREG_SPRITESTART, "SpriteStart", "SpriteStart", 1 }, + { GFX_GSREG_SPRITECOUNT, "SpriteCount", "SpriteCount", 1 }, + + { GFX_GSREG_FGBGLOC, "FGBGLoc", "FG/BG Map Location", 1 }, + + { GFX_GSREG_FGX0, "FGx0", "Foreground Window X0", 1 }, + { GFX_GSREG_FGY0, "FGy0", "Foreground Window Y0", 1 }, + { GFX_GSREG_FGX1, "FGx1", "Foreground Window X1", 1 }, + { GFX_GSREG_FGY1, "FGy1", "Foreground Window Y1", 1 }, + { GFX_GSREG_SPRX0, "SPRx0", "Sprite Window X0", 1 }, + { GFX_GSREG_SPRY0, "SPRy0", "Sprite Window Y0", 1 }, + { GFX_GSREG_SPRX1, "SPRx1", "Sprite Window X1", 1 }, + { GFX_GSREG_SPRY1, "SPRy1", "Sprite Window Y1", 1 }, + + { GFX_GSREG_BGXSCROLL, "BGXScroll", "Background X Scroll", 1 }, + { GFX_GSREG_BGYSCROLL, "BGYScroll", "Background Y Scroll", 1 }, + { GFX_GSREG_FGXSCROLL, "FGXScroll", "Foreground X Scroll", 1 }, + { GFX_GSREG_FGYSCROLL, "FGYScroll", "Foreground Y Scroll", 1 }, + + { 0, "", "", 0 }, +}; + +uint32 WSwan_GfxGetRegister(const unsigned id, char* special, const uint32 special_len) +{ + switch(id) + { + case GFX_GSREG_DISPCONTROL: + return DispControl; + + case GFX_GSREG_VIDEOMODE: + return(VideoMode); + + case GFX_GSREG_LCDCONTROL: + return(LCDControl); + + case GFX_GSREG_LCDICONS: + return(LCDIcons); + + case GFX_GSREG_BTIMERCONTROL: + return(BTimerControl); + + case GFX_GSREG_HBTIMERPERIOD: + return(HBTimerPeriod); + + case GFX_GSREG_VBTIMERPERIOD: + return(VBTimerPeriod); + + case GFX_GSREG_HBCOUNTER: + return(HBCounter); + + case GFX_GSREG_VBCOUNTER: + return(VBCounter); + + case GFX_GSREG_BGCOLOR: + return(BGColor); + + case GFX_GSREG_LINECOMPARE: + return(LineCompare); + + case GFX_GSREG_SPRBASE: + if(special) + { + trio_snprintf(special, special_len, "0x%02x * 0x200 = 0x%04x", SPRBase, SPRBase * 0x200); + } + return(SPRBase); + + case GFX_GSREG_SPRITESTART: + return(SpriteStart); + + case GFX_GSREG_SPRITECOUNT: + return(SpriteCount); + + case GFX_GSREG_FGBGLOC: + return(FGBGLoc); + + case GFX_GSREG_FGX0: + return(FGx0); + + case GFX_GSREG_FGY0: + return(FGy0); + + case GFX_GSREG_FGX1: + return(FGx1); + + case GFX_GSREG_FGY1: + return(FGy1); + + case GFX_GSREG_SPRX0: + return(SPRx0); + + case GFX_GSREG_SPRY0: + return(SPRy0); + + case GFX_GSREG_SPRX1: + return(SPRx1); + + case GFX_GSREG_SPRY1: + return(SPRy1); + + case GFX_GSREG_BGXSCROLL: + return(BGXScroll); + + case GFX_GSREG_BGYSCROLL: + return(BGYScroll); + + case GFX_GSREG_FGXSCROLL: + return(FGXScroll); + + case GFX_GSREG_FGYSCROLL: + return(FGYScroll); + } + + return 0xDEADBEEF; +} + +void WSwan_GfxSetRegister(const unsigned id, uint32 value) +{ + switch(id) + { + case GFX_GSREG_DISPCONTROL: + DispControl = value; + break; + + case GFX_GSREG_VIDEOMODE: + VideoMode = value; + wsSetVideo(VideoMode >> 5, false); + break; + + case GFX_GSREG_LCDCONTROL: + LCDControl = value; + break; + + case GFX_GSREG_LCDICONS: + LCDIcons = value; + break; + + case GFX_GSREG_BTIMERCONTROL: + BTimerControl = value; + break; + + case GFX_GSREG_HBTIMERPERIOD: + HBTimerPeriod = value; + break; + + case GFX_GSREG_VBTIMERPERIOD: + VBTimerPeriod = value; + break; + + case GFX_GSREG_HBCOUNTER: + HBCounter = value; + break; + + case GFX_GSREG_VBCOUNTER: + VBCounter = value; + break; + + case GFX_GSREG_BGCOLOR: + BGColor = value; + break; + + case GFX_GSREG_LINECOMPARE: + LineCompare = value; + break; + + case GFX_GSREG_SPRBASE: + SPRBase = value; + break; + + case GFX_GSREG_SPRITESTART: + SpriteStart = value; + break; + + case GFX_GSREG_SPRITECOUNT: + SpriteCount = value; + break; + + case GFX_GSREG_FGBGLOC: + FGBGLoc = value; + break; + + case GFX_GSREG_FGX0: + FGx0 = value; + break; + + case GFX_GSREG_FGY0: + FGy0 = value; + break; + + case GFX_GSREG_FGX1: + FGx1 = value; + break; + + case GFX_GSREG_FGY1: + FGy1 = value; + break; + + case GFX_GSREG_SPRX0: + SPRx0 = value; + break; + + case GFX_GSREG_SPRY0: + SPRy0 = value; + break; + + case GFX_GSREG_SPRX1: + SPRx1 = value; + break; + + case GFX_GSREG_SPRY1: + SPRy1 = value; + break; + + case GFX_GSREG_BGXSCROLL: + BGXScroll = value; + break; + + case GFX_GSREG_BGYSCROLL: + BGYScroll = value; + break; + + case GFX_GSREG_FGXSCROLL: + FGXScroll = value; + break; + + case GFX_GSREG_FGYSCROLL: + FGYScroll = value; + break; + } +} + +static RegGroupType WSwanGfxRegsGroup = +{ + "Gfx", + WSwanGfxRegs, + WSwan_GfxGetRegister, + WSwan_GfxSetRegister, +}; + + +static void DoGfxDecode(void); +static MDFN_Surface *GfxDecode_Buf = NULL; +static int GfxDecode_Line = -1; +static int GfxDecode_Layer = 0; +static int GfxDecode_Scroll = 0; +static int GfxDecode_Pbn = 0; +#endif + +void WSwan_GfxInit(void) +{ + LayerEnabled = 7; // BG, FG, sprites + #ifdef WANT_DEBUGGER + MDFNDBG_AddRegGroup(&WSwanGfxRegsGroup); + #endif +} + +void WSwan_GfxWSCPaletteRAMWrite(uint32 ws_offset, uint8 data) +{ + ws_offset=(ws_offset&0xfffe)-0xfe00; + wsCols[(ws_offset>>1)>>4][(ws_offset>>1)&15] = wsRAM[ws_offset+0xfe00] | ((wsRAM[ws_offset+0xfe01]&0x0f) << 8); +} + +void WSwan_GfxWrite(uint32 A, uint8 V) +{ + if(A >= 0x1C && A <= 0x1F) + { + wsColors[(A - 0x1C) * 2 + 0] = 0xF - (V & 0xf); + wsColors[(A - 0x1C) * 2 + 1] = 0xF - (V >> 4); + } + else if(A >= 0x20 && A <= 0x3F) + { + wsMonoPal[(A - 0x20) >> 1][((A & 0x1) << 1) + 0] = V&7; + wsMonoPal[(A - 0x20) >> 1][((A & 0x1) << 1) | 1] = (V>>4)&7; + } + else switch(A) + { + case 0x00: DispControl = V; break; + case 0x01: BGColor = V; break; + case 0x03: LineCompare = V; break; + case 0x04: SPRBase = V & 0x3F; break; + case 0x05: SpriteStart = V; break; + case 0x06: SpriteCount = V; break; + case 0x07: FGBGLoc = V; break; + case 0x08: FGx0 = V; break; + case 0x09: FGy0 = V; break; + case 0x0A: FGx1 = V; break; + case 0x0B: FGy1 = V; break; + case 0x0C: SPRx0 = V; break; + case 0x0D: SPRy0 = V; break; + case 0x0E: SPRx1 = V; break; + case 0x0F: SPRy1 = V; break; + case 0x10: BGXScroll = V; break; + case 0x11: BGYScroll = V; break; + case 0x12: FGXScroll = V; break; + case 0x13: FGYScroll = V; break; + + case 0x14: LCDControl = V; break; // if((!(wsIO[0x14]&1))&&(data&1)) { wsLine=0; }break; /* LCD off ??*/ + case 0x15: LCDIcons = V; break; + + case 0x60: VideoMode = V; + wsSetVideo(V>>5, false); + //printf("VideoMode: %02x, %02x\n", V, V >> 5); + break; + + case 0xa2: if((V & 0x01) && !(BTimerControl & 0x01)) + HBCounter = HBTimerPeriod; + if((V & 0x04) && !(BTimerControl & 0x04)) + VBCounter = VBTimerPeriod; + BTimerControl = V; + //printf("%04x:%02x\n", A, V); + break; + case 0xa4: HBTimerPeriod &= 0xFF00; HBTimerPeriod |= (V << 0); /*printf("%04x:%02x, %d\n", A, V, wsLine);*/ break; + case 0xa5: HBTimerPeriod &= 0x00FF; HBTimerPeriod |= (V << 8); HBCounter = HBTimerPeriod; /*printf("%04x:%02x, %d\n", A, V, wsLine);*/ break; + case 0xa6: VBTimerPeriod &= 0xFF00; VBTimerPeriod |= (V << 0); /*printf("%04x:%02x, %d\n", A, V, wsLine);*/ break; + case 0xa7: VBTimerPeriod &= 0x00FF; VBTimerPeriod |= (V << 8); VBCounter = VBTimerPeriod; /*printf("%04x:%02x, %d\n", A, V, wsLine);*/ break; + //default: printf("%04x:%02x\n", A, V); break; + } +} + +uint8 WSwan_GfxRead(uint32 A) +{ + if(A >= 0x1C && A <= 0x1F) + { + uint8 ret = 0; + + ret |= 0xF - wsColors[(A - 0x1C) * 2 + 0]; + ret |= (0xF - wsColors[(A - 0x1C) * 2 + 1]) << 4; + + return(ret); + } + else if(A >= 0x20 && A <= 0x3F) + { + uint8 ret = wsMonoPal[(A - 0x20) >> 1][((A & 0x1) << 1) + 0] | (wsMonoPal[(A - 0x20) >> 1][((A & 0x1) << 1) | 1] << 4); + + return(ret); + } + else switch(A) + { + case 0x00: return(DispControl); + case 0x01: return(BGColor); + case 0x02: return(wsLine); + case 0x03: return(LineCompare); + case 0x04: return(SPRBase); + case 0x05: return(SpriteStart); + case 0x06: return(SpriteCount); + case 0x07: return(FGBGLoc); + case 0x08: return(FGx0); break; + case 0x09: return(FGy0); break; + case 0x0A: return(FGx1); break; + case 0x0B: return(FGy1); break; + case 0x0C: return(SPRx0); break; + case 0x0D: return(SPRy0); break; + case 0x0E: return(SPRx1); break; + case 0x0F: return(SPRy1); break; + case 0x10: return(BGXScroll); + case 0x11: return(BGYScroll); + case 0x12: return(FGXScroll); + case 0x13: return(FGYScroll); + case 0x14: return(LCDControl); + case 0x15: return(LCDIcons); + case 0x60: return(VideoMode); + case 0xa0: return(wsc ? 0x87 : 0x86); + case 0xa2: return(BTimerControl); + case 0xa4: return((HBTimerPeriod >> 0) & 0xFF); + case 0xa5: return((HBTimerPeriod >> 8) & 0xFF); + case 0xa6: return((VBTimerPeriod >> 0) & 0xFF); + case 0xa7: return((VBTimerPeriod >> 8) & 0xFF); + case 0xa8: /*printf("%04x\n", A);*/ return((HBCounter >> 0) & 0xFF); + case 0xa9: /*printf("%04x\n", A);*/ return((HBCounter >> 8) & 0xFF); + case 0xaa: /*printf("%04x\n", A);*/ return((VBCounter >> 0) & 0xFF); + case 0xab: /*printf("%04x\n", A);*/ return((VBCounter >> 8) & 0xFF); + default: return(0); + //default: printf("GfxRead: %04x\n", A); return(0); + } +} + +bool wsExecuteLine(MDFN_Surface *surface, bool skip) +{ + static const void* const WEP_Tab[3] = { &&WEP0, &&WEP1, &&WEP2 }; // The things we do for debugger step mode save states! If we ever add more entries, remember to change the mask stuff in StateAction + bool ret; + + weppy = 0; + WEP0: ; + + ret = FALSE; + + #ifdef WANT_DEBUGGER + if(GfxDecode_Buf && GfxDecode_Line >=0 && wsLine == GfxDecode_Line) + DoGfxDecode(); + #endif + + if(wsLine < 144) + { + if(!skip) + wsScanline(surface->pixels + wsLine * surface->pitch32); + } + + Comm_Process(); + WSwan_CheckSoundDMA(); + + // Update sprite data table + if(wsLine == 142) + { + SpriteCountCache = SpriteCount; + + if(SpriteCountCache > 0x80) + SpriteCountCache = 0x80; + + memcpy(SpriteTable, &wsRAM[(SPRBase << 9) + (SpriteStart << 2)], SpriteCountCache << 2); + } + + if(wsLine == 144) + { + ret = TRUE; + WSwan_Interrupt(WSINT_VBLANK); + //printf("VBlank: %d\n", wsLine); + } + + + if(HBCounter && (BTimerControl & 0x01)) + { + HBCounter--; + if(!HBCounter) + { + // Loop mode? + if(BTimerControl & 0x02) + HBCounter = HBTimerPeriod; + WSwan_Interrupt(WSINT_HBLANK_TIMER); + } + } + + weppy = 1; + v30mz_execute(224); + goto *WEP_Tab[weppy]; + WEP1: ; + + wsLine = (wsLine + 1) % 159; + if(wsLine == LineCompare) + { + WSwan_Interrupt(WSINT_LINE_HIT); + //printf("Line hit: %d\n", wsLine); + } + + weppy = 2; + v30mz_execute(32); + goto *WEP_Tab[weppy]; + WEP2: ; + + RTC_Clock(256); + + if(!wsLine) + { + if(VBCounter && (BTimerControl & 0x04)) + { + VBCounter--; + if(!VBCounter) + { + if(BTimerControl & 0x08) // Loop mode? + VBCounter = VBTimerPeriod; + + WSwan_Interrupt(WSINT_VBLANK_TIMER); + } + } + wsLine = 0; + } + + weppy = 0; + return(ret); +} + +void WSwan_SetLayerEnableMask(uint64 mask) +{ + LayerEnabled = mask; +} + +void WSwan_SetPixelFormat(const MDFN_PixelFormat &format) +{ + for(int r = 0; r < 16; r++) + for(int g = 0; g < 16; g++) + for(int b = 0; b < 16; b++) + { + uint32 neo_r, neo_g, neo_b; + + neo_r = r * 17; + neo_g = g * 17; + neo_b = b * 17; + + ColorMap[(r << 8) | (g << 4) | (b << 0)] = format.MakeColor(neo_r, neo_g, neo_b); //(neo_r << rs) | (neo_g << gs) | (neo_b << bs); + } + + for(int i = 0; i < 16; i++) + { + uint32 neo_r, neo_g, neo_b; + + neo_r = (i) * 17; + neo_g = (i) * 17; + neo_b = (i) * 17; + + ColorMapG[i] = format.MakeColor(neo_r, neo_g, neo_b); //(neo_r << rs) | (neo_g << gs) | (neo_b << bs); + } +} + +void wsScanline(uint32 *target) +{ + uint32 start_tile_n,map_a,startindex,adrbuf,b1,b2,j,t,l; + char ys2; + uint8 b_bg[256]; + uint8 b_bg_pal[256]; + + if(!wsVMode) + memset(b_bg, wsColors[BGColor&0xF]&0xF, 256); + else + { + memset(&b_bg[0], BGColor & 0xF, 256); + memset(&b_bg_pal[0], (BGColor>>4) & 0xF, 256); + } + start_tile_n=(wsLine+BGYScroll)&0xff;/*First line*/ + map_a=(((uint32)(FGBGLoc&0xF))<<11)+((start_tile_n&0xfff8)<<3); + startindex = BGXScroll >> 3; /*First tile in row*/ + adrbuf = 7-(BGXScroll&7); /*Pixel in tile*/ + + if((DispControl & 0x01) && (LayerEnabled & 0x01)) /*BG layer*/ + { + for(t=0;t<29;t++) + { + b1=wsRAM[map_a+(startindex<<1)]; + b2=wsRAM[map_a+(startindex<<1)+1]; + uint32 palette=(b2>>1)&15; + b2=(b2<<8)|b1; + wsGetTile(b2&0x1ff,start_tile_n&7,b2&0x8000,b2&0x4000,b2&0x2000); + + if(wsVMode) + { + if(wsVMode & 0x2) + { + for(int x = 0; x < 8; x++) + if(wsTileRow[x]) + { + b_bg[adrbuf + x] = wsTileRow[x]; + b_bg_pal[adrbuf + x] = palette; + } + } + else + { + for(int x = 0; x < 8; x++) + if(wsTileRow[x] || !(palette & 0x4)) + { + b_bg[adrbuf + x] = wsTileRow[x]; + b_bg_pal[adrbuf + x] = palette; + } + } + } + else + { + for(int x = 0; x < 8; x++) + if(wsTileRow[x] || !(palette & 4)) + { + b_bg[adrbuf + x] = wsColors[wsMonoPal[palette][wsTileRow[x]]]; + } + } + adrbuf += 8; + startindex=(startindex + 1)&31; + } // end for(t = 0 ... + } // End BG layer drawing + + if((DispControl & 0x02) && (LayerEnabled & 0x02))/*FG layer*/ + { + uint8 windowtype = DispControl&0x30; + bool in_window[256 + 8*2]; + + if(windowtype) + { + memset(in_window, 0, sizeof(in_window)); + + if(windowtype == 0x20) // Display FG only inside window + { + if((wsLine >= FGy0) && (wsLine < FGy1)) + for(j = FGx0; j <= FGx1 && j < 224; j++) + in_window[7 + j] = 1; + } + else if(windowtype == 0x30) // Display FG only outside window + { + for(j = 0; j < 224; j++) + { + if(!(j >= FGx0 && j < FGx1) || !((wsLine >= FGy0) && (wsLine < FGy1))) + in_window[7 + j] = 1; + } + } + else + { + //puts("Who knows!"); + } + } + else + memset(in_window, 1, sizeof(in_window)); + + start_tile_n=(wsLine+FGYScroll)&0xff; + map_a=(((uint32)((FGBGLoc>>4)&0xF))<<11)+((start_tile_n>>3)<<6); + startindex = FGXScroll >> 3; + adrbuf = 7-(FGXScroll&7); + + for(t=0; t<29; t++) + { + b1=wsRAM[map_a+(startindex<<1)]; + b2=wsRAM[map_a+(startindex<<1)+1]; + uint32 palette=(b2>>1)&15; + b2=(b2<<8)|b1; + wsGetTile(b2&0x1ff,start_tile_n&7,b2&0x8000,b2&0x4000,b2&0x2000); + + if(wsVMode) + { + if(wsVMode & 0x2) + for(int x = 0; x < 8; x++) + { + if(wsTileRow[x] && in_window[adrbuf + x]) + { + b_bg[adrbuf + x] = wsTileRow[x] | 0x10; + b_bg_pal[adrbuf + x] = palette; + } + } + else + for(int x = 0; x < 8; x++) + { + if((wsTileRow[x] || !(palette & 0x4)) && in_window[adrbuf + x]) + { + b_bg[adrbuf + x] = wsTileRow[x] | 0x10; + b_bg_pal[adrbuf + x] = palette; + } + } + } + else + { + for(int x = 0; x < 8; x++) + if((wsTileRow[x] || !(palette & 4)) && in_window[adrbuf + x]) + { + b_bg[adrbuf + x] = wsColors[wsMonoPal[palette][wsTileRow[x]]] | 0x10; + } + } + adrbuf += 8; + startindex=(startindex + 1)&31; + } // end for(t = 0 ... + + } // end FG drawing + + if((DispControl & 0x04) && SpriteCountCache && (LayerEnabled & 0x04))/*Sprites*/ + { + int xs,ts,as,ys,ysx,h; + bool in_window[256 + 8*2]; + + if(DispControl & 0x08) + { + memset(in_window, 0, sizeof(in_window)); + if((wsLine >= SPRy0) && (wsLine < SPRy1)) + for(j = SPRx0; j < SPRx1 && j < 256; j++) + in_window[7 + j] = 1; + } + else + memset(in_window, 1, sizeof(in_window)); + + for(h = SpriteCountCache - 1; h >= 0; h--) + { + ts = SpriteTable[h][0]; + as = SpriteTable[h][1]; + ysx = SpriteTable[h][2]; + ys2 = (int8)SpriteTable[h][2]; + xs = SpriteTable[h][3]; + + if(xs >= 249) xs -= 256; + + if(ysx > 150) + ys = ys2; + else + ys = ysx; + + ys = wsLine - ys; + + if(ys >= 0 && ys < 8 && xs < 224) + { + uint32 palette = ((as >> 1) & 0x7); + + ts |= (as&1) << 8; + wsGetTile(ts, ys, as & 0x80, as & 0x40, 0); + + if(wsVMode) + { + if(wsVMode & 0x2) + { + for(int x = 0; x < 8; x++) + if(wsTileRow[x]) + { + if((as & 0x20) || !(b_bg[xs + x + 7] & 0x10)) + { + bool drawthis = 0; + + if(!(DispControl & 0x08)) + drawthis = TRUE; + else if((as & 0x10) && !in_window[7 + xs + x]) + drawthis = TRUE; + else if(!(as & 0x10) && in_window[7 + xs + x]) + drawthis = TRUE; + + if(drawthis) + { + b_bg[xs + x + 7] = wsTileRow[x] | (b_bg[xs + x + 7] & 0x10); + b_bg_pal[xs + x + 7] = 8 + palette; + } + } + } + } + else + { + for(int x = 0; x < 8; x++) + if(wsTileRow[x] || !(palette & 0x4)) + { + if((as & 0x20) || !(b_bg[xs + x + 7] & 0x10)) + { + bool drawthis = 0; + + if(!(DispControl & 0x08)) + drawthis = TRUE; + else if((as & 0x10) && !in_window[7 + xs + x]) + drawthis = TRUE; + else if(!(as & 0x10) && in_window[7 + xs + x]) + drawthis = TRUE; + + if(drawthis) + { + b_bg[xs + x + 7] = wsTileRow[x] | (b_bg[xs + x + 7] & 0x10); + b_bg_pal[xs + x + 7] = 8 + palette; + } + } + } + + } + + } + else + { + for(int x = 0; x < 8; x++) + if(wsTileRow[x] || !(palette & 4)) + { + if((as & 0x20) || !(b_bg[xs + x + 7] & 0x10)) + { + bool drawthis = 0; + + if(!(DispControl & 0x08)) + drawthis = TRUE; + else if((as & 0x10) && !in_window[7 + xs + x]) + drawthis = TRUE; + else if(!(as & 0x10) && in_window[7 + xs + x]) + drawthis = TRUE; + + if(drawthis) + //if((as & 0x10) || in_window[7 + xs + x]) + { + b_bg[xs + x + 7] = wsColors[wsMonoPal[8 + palette][wsTileRow[x]]] | (b_bg[xs + x + 7] & 0x10); + } + } + } + + } + } + } + + } // End sprite drawing + + if(wsVMode) + { + for(l=0;l<224;l++) + target[l] = ColorMap[wsCols[b_bg_pal[l+7]][b_bg[(l+7)]&0xf]]; + } + else + { + for(l=0;l<224;l++) + target[l] = ColorMapG[(b_bg[l+7])&15]; + } +} + + +void WSwan_GfxReset(void) +{ + weppy = 0; + wsLine=0; + wsSetVideo(0,TRUE); + + memset(SpriteTable, 0, sizeof(SpriteTable)); + SpriteCountCache = 0; + DispControl = 0; + BGColor = 0; + LineCompare = 0xBB; + SPRBase = 0; + + SpriteStart = 0; + SpriteCount = 0; + FGBGLoc = 0; + + FGx0 = 0; + FGy0 = 0; + FGx1 = 0; + FGy1 = 0; + SPRx0 = 0; + SPRy0 = 0; + SPRx1 = 0; + SPRy1 = 0; + + BGXScroll = BGYScroll = 0; + FGXScroll = FGYScroll = 0; + LCDControl = 0; + LCDIcons = 0; + + BTimerControl = 0; + HBTimerPeriod = 0; + VBTimerPeriod = 0; + + HBCounter = 0; + VBCounter = 0; + + + for(int u0=0;u0<16;u0++) + for(int u1=0;u1<16;u1++) + wsCols[u0][u1]=0; + +} + +void WSwan_GfxStateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY32N(&wsMonoPal[0][0], 16 * 4, "wsMonoPal"), + SFARRAY32(wsColors, 8), + + SFVAR(wsLine), + + SFARRAYN(&SpriteTable[0][0], 0x80 * 4, "SpriteTable"), + SFVAR(SpriteCountCache), + SFVAR(DispControl), + SFVAR(BGColor), + SFVAR(LineCompare), + SFVAR(SPRBase), + SFVAR(SpriteStart), + SFVAR(SpriteCount), + SFVAR(FGBGLoc), + SFVAR(FGx0), + SFVAR(FGy0), + SFVAR(FGx1), + SFVAR(FGy1), + + SFVAR(SPRx0), + SFVAR(SPRy0), + + SFVAR(SPRx1), + SFVAR(SPRy1), + + SFVAR(BGXScroll), + SFVAR(BGYScroll), + SFVAR(FGXScroll), + SFVAR(FGYScroll), + SFVAR(LCDControl), + SFVAR(LCDIcons), + + SFVAR(BTimerControl), + SFVAR(HBTimerPeriod), + SFVAR(VBTimerPeriod), + + SFVAR(HBCounter), + SFVAR(VBCounter), + + SFVAR(VideoMode), + + SFVAR(weppy), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "GFX"); + + if(load) + { + weppy %= 3; + + wsSetVideo(VideoMode >> 5, TRUE); + } +} + +#ifdef WANT_DEBUGGER +static void DoGfxDecode(void) +{ + // FIXME + //uint32 *palette_ptr; + uint32 *target = GfxDecode_Buf->pixels; + int w = GfxDecode_Buf->w; + int h = GfxDecode_Buf->h; + int scroll = GfxDecode_Scroll; + uint32 neo_palette[16]; + uint32 tile_limit; + uint32 zero_color = GfxDecode_Buf->MakeColor(0, 0, 0, 0); + + if(wsVMode && GfxDecode_Layer != 2) // Sprites can't use the extra tile bank in WSC mode + tile_limit = 0x400; + else + tile_limit = 0x200; + + if(GfxDecode_Pbn == -1) + { + if(wsVMode) + { + for(int x = 0; x < 16; x++) + neo_palette[x] = GfxDecode_Buf->MakeColor(x * 17, x * 17, x * 17, 0xFF); + } + else + for(int x = 0; x < 16; x++) + neo_palette[x] = GfxDecode_Buf->MakeColor(x * 85, x * 85, x * 85, 0xFF); + } + else + { + if(wsVMode) + for(int x = 0; x < 16; x++) + { + uint32 raw = wsCols[GfxDecode_Pbn & 0xF][x]; + uint32 r, g, b; + + r = (raw >> 8) & 0x0F; + g = (raw >> 4) & 0x0F; + b = (raw >> 0) & 0x0F; + + neo_palette[x] = GfxDecode_Buf->MakeColor(r * 17, g * 17, b * 17, 0xFF); + } + else + for(int x = 0; x < 4; x++) + { + uint32 raw = wsMonoPal[GfxDecode_Pbn & 0xF][x]; + + neo_palette[x] = GfxDecode_Buf->MakeColor(raw * 17 , raw * 17, raw * 17, 0xFF); + } + } + //palette_ptr = neo_palette; + + for(int y = 0; y < h; y++) + { + for(int x = 0; x < w; x += 8) + { + unsigned int which_tile = (x / 8) + (scroll + (y / 8)) * (w / 8); + + if(which_tile >= tile_limit) + { + for(int sx = 0; sx < 8; sx++) + { + target[x + sx] = zero_color; + target[x + w * 1 + sx] = 0; + target[x + w * 2 + sx] = 0; + } + continue; + } + + wsGetTile(which_tile & 0x1FF, y&7, 0, 0, which_tile & 0x200); + if(wsVMode) + { + for(int sx = 0; sx < 8; sx++) + target[x + sx] = neo_palette[wsTileRow[sx]]; + } + else + { + for(int sx = 0; sx < 8; sx++) + target[x + sx] = neo_palette[wsTileRow[sx]]; + } + + uint32 address_base; + uint32 tile_bsize; + + if(wsVMode & 0x4) + { + tile_bsize = 4 * 8 * 8 / 8; + if(which_tile & 0x200) + address_base = 0x8000; + else + address_base = 0x4000; + } + else + { + tile_bsize = 2 * 8 * 8 / 8; + if(which_tile & 0x200) + address_base = 0x4000; + else + address_base = 0x2000; + } + + for(int sx = 0; sx < 8; sx++) + { + target[x + w * 1 + sx] = which_tile; + target[x + w * 2 + sx] = address_base + (which_tile & 0x1FF) * tile_bsize; + } + } + target += w * 3; + } +} + +void WSwan_GfxSetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn) +{ + GfxDecode_Buf = surface; + GfxDecode_Line = line; + GfxDecode_Layer = which; + GfxDecode_Scroll = yscroll; + GfxDecode_Pbn = pbn; + + if(GfxDecode_Line == -1) + DoGfxDecode(); +} + +#endif + +} diff --git a/Mednafen/mednafen/wswan/gfx.h b/Mednafen/mednafen/wswan/gfx.h new file mode 100644 index 0000000000..90dce6b34a --- /dev/null +++ b/Mednafen/mednafen/wswan/gfx.h @@ -0,0 +1,48 @@ +#ifndef __WSWAN_GFX_H +#define __WSWAN_GFX_H + +namespace MDFN_IEN_WSWAN +{ + + +void WSWan_TCacheInvalidByAddr(uint32); + +extern uint8 wsTCache[512*64]; //tiles cache +extern uint8 wsTCacheFlipped[512*64]; //tiles cache (H flip) +extern uint8 wsTileRow[8]; //extracted 8 pixels (tile row) +extern uint8 wsTCacheUpdate[512]; //tiles cache flags +extern uint8 wsTCache2[512*64]; //tiles cache +extern uint8 wsTCacheFlipped2[512*64]; //tiles cache (H flip) +extern uint8 wsTCacheUpdate2[512]; //tiles cache flags +extern int wsVMode; //Video Mode + +void wsMakeTiles(void); +void wsGetTile(uint32,uint32,int,int,int); +void wsSetVideo(int, bool); + +void wsScanline(uint32 *target); + +extern uint32 dx_r,dx_g,dx_b,dx_sr,dx_sg,dx_sb; +extern uint32 dx_bits,dx_pitch,cmov,dx_linewidth_blit,dx_buffer_line; + + +void WSwan_SetPixelFormat(const MDFN_PixelFormat &format); + +void WSwan_GfxInit(void); +void WSwan_GfxReset(void); +void WSwan_GfxWrite(uint32 A, uint8 V); +uint8 WSwan_GfxRead(uint32 A); +void WSwan_GfxWSCPaletteRAMWrite(uint32 ws_offset, uint8 data); + +bool wsExecuteLine(MDFN_Surface *surface, bool skip); + +void WSwan_SetLayerEnableMask(uint64 mask); +void WSwan_GfxStateAction(StateMem *sm, const unsigned load, const bool data_only); + +#ifdef WANT_DEBUGGER +void WSwan_GfxSetGraphicsDecode(MDFN_Surface *surface, int line, int which, int xscroll, int yscroll, int pbn); +#endif + +} + +#endif diff --git a/Mednafen/mednafen/wswan/interrupt.cpp b/Mednafen/mednafen/wswan/interrupt.cpp new file mode 100644 index 0000000000..7b834e37df --- /dev/null +++ b/Mednafen/mednafen/wswan/interrupt.cpp @@ -0,0 +1,220 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "interrupt.h" +#include "v30mz.h" +#include + +namespace MDFN_IEN_WSWAN +{ + +static const uint8 LevelTriggeredMask = (1U << WSINT_SERIAL_RECV); + +static uint8 IAsserted; +static uint8 IStatus; +static uint8 IEnable; +static uint8 IVectorBase; + +static bool IOn_Cache; +static uint32 IOn_Which; +static uint32 IVector_Cache; + +static void RecalcInterrupt(void) +{ + IStatus |= (IAsserted & LevelTriggeredMask) & IEnable; + + IOn_Cache = FALSE; + IOn_Which = 0; + IVector_Cache = 0; + + for(int i = 0; i < 8; i++) + { + if(IStatus & IEnable & (1U << i)) + { + IOn_Cache = TRUE; + IOn_Which = i; + IVector_Cache = (IVectorBase + i) * 4; + break; + } + } +} + +void WSwan_InterruptDebugForce(unsigned int level) +{ + v30mz_int((IVectorBase + level) * 4, TRUE); +} + +void WSwan_InterruptAssert(unsigned which, bool asserted) +{ + const uint8 prev_IAsserted = IAsserted; + + IAsserted &= ~(1U << which); + IAsserted |= (unsigned)asserted << which; + + IStatus |= ((prev_IAsserted ^ IAsserted) & IAsserted) & IEnable; + + RecalcInterrupt(); +} + +void WSwan_Interrupt(unsigned which) +{ + IStatus |= (1U << which) & IEnable; + RecalcInterrupt(); +} + +void WSwan_InterruptWrite(uint32 A, uint8 V) +{ + //printf("Write: %04x %02x\n", A, V); + switch(A) + { + case 0xB0: IVectorBase = V; + RecalcInterrupt(); + break; + + case 0xB2: IEnable = V; + IStatus &= IEnable; + RecalcInterrupt(); + break; + + case 0xB6: /*printf("IStatus: %02x\n", V);*/ + IStatus &= ~V; + RecalcInterrupt(); + break; + } +} + +uint8 WSwan_InterruptRead(uint32 A) +{ + //printf("Read: %04x\n", A); + switch(A) + { + case 0xB0: return(IVectorBase); + case 0xB2: return(IEnable); + case 0xB6: return(1 << IOn_Which); //return(IStatus); + } + return(0); +} + +void WSwan_InterruptCheck(void) +{ + if(IOn_Cache) + { + v30mz_int(IVector_Cache, FALSE); + } +} + +void WSwan_InterruptReset(void) +{ + IAsserted = 0x00; + IEnable = 0x00; + IStatus = 0x00; + IVectorBase = 0x00; + RecalcInterrupt(); +} + +#ifdef WANT_DEBUGGER +static const char *PrettyINames[8] = { "Serial Send", "Key Press", "RTC Alarm", "Serial Recv", "Line Hit", "VBlank Timer", "VBlank", "HBlank Timer" }; + +uint32 WSwan_InterruptGetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 ret = 0; + + switch(id) + { + case INT_GSREG_IASSERTED: + ret = IAsserted; + break; + + case INT_GSREG_ISTATUS: + ret = IStatus; + break; + + case INT_GSREG_IENABLE: + ret = IEnable; + break; + + case INT_GSREG_IVECTORBASE: + ret = IVectorBase; + break; + } + + if(special && (id == INT_GSREG_IASSERTED || id == INT_GSREG_ISTATUS || id == INT_GSREG_IENABLE)) + { + trio_snprintf(special, special_len, "%s: %d, %s: %d, %s: %d, %s: %d, %s: %d, %s: %d, %s: %d, %s: %d", + PrettyINames[0], (ret >> 0) & 1, + PrettyINames[1], (ret >> 1) & 1, + PrettyINames[2], (ret >> 2) & 1, + PrettyINames[3], (ret >> 3) & 1, + PrettyINames[4], (ret >> 4) & 1, + PrettyINames[5], (ret >> 5) & 1, + PrettyINames[6], (ret >> 6) & 1, + PrettyINames[7], (ret >> 7) & 1); + } + + return(ret); +} + +void WSwan_InterruptSetRegister(const unsigned int id, uint32 value) +{ + switch(id) + { + //case INT_GSREG_IASSERTED: + // IAsserted = value; + // break; + + case INT_GSREG_ISTATUS: + IStatus = value; + break; + + case INT_GSREG_IENABLE: + IEnable = value; + break; + + case INT_GSREG_IVECTORBASE: + IVectorBase = value; + break; + } + + RecalcInterrupt(); +} + +#endif + +void WSwan_InterruptStateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(IAsserted), + SFVAR(IStatus), + SFVAR(IEnable), + SFVAR(IVectorBase), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "INTR"); + + if(load) + { + if(load < 0x0936) + IAsserted = 0; + + RecalcInterrupt(); + } +} + +} diff --git a/Mednafen/mednafen/wswan/interrupt.h b/Mednafen/mednafen/wswan/interrupt.h new file mode 100644 index 0000000000..61b8748d29 --- /dev/null +++ b/Mednafen/mednafen/wswan/interrupt.h @@ -0,0 +1,61 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __WSWAN_INTERRUPT_H +#define __WSWAN_INTERRUPT_H + +namespace MDFN_IEN_WSWAN +{ + +enum +{ + WSINT_SERIAL_SEND = 0, + WSINT_KEY_PRESS, + WSINT_RTC_ALARM, + WSINT_SERIAL_RECV, + WSINT_LINE_HIT, + WSINT_VBLANK_TIMER, + WSINT_VBLANK, + WSINT_HBLANK_TIMER +}; + +void WSwan_InterruptAssert(unsigned which, bool asserted); +void WSwan_Interrupt(unsigned); + +void WSwan_InterruptWrite(uint32 A, uint8 V); +uint8 WSwan_InterruptRead(uint32 A); +void WSwan_InterruptCheck(void); +void WSwan_InterruptStateAction(StateMem *sm, const unsigned load, const bool data_only); +void WSwan_InterruptReset(void); +void WSwan_InterruptDebugForce(unsigned int level); + +#ifdef WANT_DEBUGGER +enum +{ + INT_GSREG_IASSERTED = 0, + INT_GSREG_ISTATUS, + INT_GSREG_IENABLE, + INT_GSREG_IVECTORBASE +}; +uint32 WSwan_InterruptGetRegister(const unsigned int id, char *special, const uint32 special_len); +void WSwan_InterruptSetRegister(const unsigned int id, uint32 value); + +#endif + +} + +#endif diff --git a/Mednafen/mednafen/wswan/main.cpp b/Mednafen/mednafen/wswan/main.cpp new file mode 100644 index 0000000000..dbcc967f0a --- /dev/null +++ b/Mednafen/mednafen/wswan/main.cpp @@ -0,0 +1,649 @@ +/* Cygne + * + * Copyright notice for this file: + * Copyright (C) 2002 Dox dox@space.pl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "gfx.h" +#include "memory.h" +#include "start.inc" +#include "sound.h" +#include "v30mz.h" +#include "comm.h" +#include "rtc.h" +#include "eeprom.h" +#include "debug.h" + +namespace MDFN_IEN_WSWAN +{ + +uint32 WS_InDebug = 0; +int wsc = 1; /*color/mono*/ +uint32 rom_size; + +uint16 WSButtonStatus; + + +static bool IsWSR; +static uint8 WSRCurrentSong; +static uint8 WSRLastButtonStatus; + +static void Reset(void) +{ + v30mz_reset(); /* Reset CPU */ + WSwan_MemoryReset(); + Comm_Reset(); + WSwan_GfxReset(); + WSwan_SoundReset(); + WSwan_InterruptReset(); + RTC_Reset(); + WSwan_EEPROMReset(); + + for(unsigned u0 = 0; u0 < 0xc8; u0++) + { + if(u0 != 0xC4 && u0 != 0xC5 && u0 != 0xBA && u0 != 0xBB) + WSwan_writeport(u0, startio[u0]); + } + + v30mz_set_reg(NEC_SS, 0); + v30mz_set_reg(NEC_SP, 0x2000); + + if(IsWSR) + { + v30mz_set_reg(NEC_AW, WSRCurrentSong); + } +} + +static uint8 *chee; +static void Emulate(EmulateSpecStruct *espec) +{ + espec->DisplayRect.x = 0; + espec->DisplayRect.y = 0; + espec->DisplayRect.w = 224; + espec->DisplayRect.h = 144; + + if(espec->VideoFormatChanged) + WSwan_SetPixelFormat(espec->surface->format); + + if(espec->SoundFormatChanged) + WSwan_SetSoundRate(espec->SoundRate); + + uint16 butt_data = chee[0] | (chee[1] << 8); + + WSButtonStatus = butt_data; + + MDFNMP_ApplyPeriodicCheats(); + + while(!wsExecuteLine(espec->surface, espec->skip)) + { + + } + + espec->SoundBufSize = WSwan_SoundFlush(espec->SoundBuf, espec->SoundBufMaxSize); + + espec->MasterCycles = v30mz_timestamp; + v30mz_timestamp = 0; + + if(IsWSR) + { + bool needreload = FALSE; + + Player_Draw(espec->surface, &espec->DisplayRect, WSRCurrentSong, espec->SoundBuf, espec->SoundBufSize); + + if((WSButtonStatus & 0x02) && !(WSRLastButtonStatus & 0x02)) + { + WSRCurrentSong++; + needreload = 1; + } + + if((WSButtonStatus & 0x08) && !(WSRLastButtonStatus & 0x08)) + { + WSRCurrentSong--; + needreload = 1; + } + + if((WSButtonStatus & 0x100) && !(WSRLastButtonStatus & 0x100)) + needreload = 1; + + if((WSButtonStatus & 0x01) && !(WSRLastButtonStatus & 0x01)) + { + WSRCurrentSong += 10; + needreload = 1; + } + + if((WSButtonStatus & 0x04) && !(WSRLastButtonStatus & 0x04)) + { + WSRCurrentSong -= 10; + needreload = 1; + } + + + WSRLastButtonStatus = WSButtonStatus; + + if(needreload) + Reset(); + } +} + +typedef struct +{ + const uint8 id; + const char *name; +} DLEntry; + +static const DLEntry Developers[] = +{ + { 0x01, "Bandai" }, + { 0x02, "Taito" }, + { 0x03, "Tomy" }, + { 0x04, "Koei" }, + { 0x05, "Data East" }, + { 0x06, "Asmik" }, // Asmik Ace? + { 0x07, "Media Entertainment" }, + { 0x08, "Nichibutsu" }, + { 0x0A, "Coconuts Japan" }, + { 0x0B, "Sammy" }, + { 0x0C, "Sunsoft" }, + { 0x0D, "Mebius" }, + { 0x0E, "Banpresto" }, + { 0x10, "Jaleco" }, + { 0x11, "Imagineer" }, + { 0x12, "Konami" }, + { 0x16, "Kobunsha" }, + { 0x17, "Bottom Up" }, + { 0x18, "Naxat" }, // Mechanic Arms? Media Entertainment? Argh! + { 0x19, "Sunrise" }, + { 0x1A, "Cyberfront" }, + { 0x1B, "Megahouse" }, + { 0x1D, "Interbec" }, + { 0x1E, "NAC" }, + { 0x1F, "Emotion" }, // Bandai Visual?? + { 0x20, "Athena" }, + { 0x21, "KID" }, + { 0x22, "HAL" }, + { 0x23, "Yuki-Enterprise" }, + { 0x24, "Omega Micott" }, + { 0x25, "Upstar" }, + { 0x26, "Kadokawa/Megas" }, + { 0x27, "Cocktail Soft" }, + { 0x28, "Squaresoft" }, + { 0x2A, "NTT DoCoMo" }, + { 0x2B, "TomCreate" }, + { 0x2D, "Namco" }, + { 0x2F, "Gust" }, + { 0x31, "Vanguard" }, // or Elorg? + { 0x32, "Megatron" }, + { 0x33, "WiZ" }, + { 0x36, "Capcom" }, +}; + +static bool TestMagic(MDFNFILE *fp) +{ + if(strcasecmp(fp->ext, "ws") && strcasecmp(fp->ext, "wsc") && strcasecmp(fp->ext, "wsr")) + return(FALSE); + + if(fp->size() < 65536) + return(FALSE); + + return(TRUE); +} + +static void Cleanup(void) +{ + Comm_Kill(); + WSwan_MemoryKill(); + + WSwan_SoundKill(); + + if(wsCartROM) + { + free(wsCartROM); + wsCartROM = NULL; + } +} + + +static void CloseGame(void) +{ + if(!IsWSR) + { + try + { + WSwan_MemorySaveNV(); // Must be called before we free(wsCartRom). + } + catch(std::exception &e) + { + MDFN_PrintError("%s", e.what()); + } + } + + Cleanup(); +} + +static void Load(MDFNFILE *fp) +{ + try + { + bool IsWW = false; + const uint64 fp_in_size = fp->size(); + uint32 real_rom_size; + + if(fp_in_size < 65536) + { + throw MDFN_Error(0, _("ROM image is too small.")); + } + + if(fp_in_size > 64 * 1024 * 1024) + { + throw MDFN_Error(0, _("ROM image is too large.")); + } + + real_rom_size = (fp_in_size + 0xFFFF) & ~0xFFFF; + rom_size = round_up_pow2(real_rom_size); + + wsCartROM = (uint8 *)MDFN_calloc_T(1, rom_size, "ROM"); + + // This real_rom_size vs rom_size funny business is intended primarily for handling + // WSR files. + if(real_rom_size < rom_size) + memset(wsCartROM, 0xFF, rom_size - real_rom_size); + + fp->read(wsCartROM + (rom_size - real_rom_size), fp_in_size); + + if(!memcmp(wsCartROM + (rom_size - real_rom_size) + fp_in_size - 0x20, "WSRF", 4)) + { + const uint8 *wsr_footer = wsCartROM + (rom_size - real_rom_size) + fp_in_size - 0x20; + + IsWSR = TRUE; + WSRCurrentSong = wsr_footer[0x5]; + WSRLastButtonStatus = 0xFF; + + Player_Init(256, "", "", ""); + } + else + { + IsWSR = false; + + if(rom_size == 524288 && !memcmp(&wsCartROM[0x70000], "ELISA", 5) && crc32(0, &wsCartROM[0x7FFF0], 0x10) == 0x0d05ed64) + { + uint32 crc32_sans_l64k = crc32(0, wsCartROM, 0x70000); + uint32 bl[] = { 0x63f00316, 0x60fd569b, 0xe11538f8 }; + bool blisted = false; + + //printf("%08x\n", crc32_sans_l64k); + + for(auto ch : bl) + { + if(crc32_sans_l64k == ch) + { + blisted = true; + break; + } + } + + IsWW = !blisted; + } + } + + MDFN_printf(_("ROM: %uKiB\n"), real_rom_size / 1024); + md5_context md5; + md5.starts(); + md5.update(wsCartROM, rom_size); + md5.finish(MDFNGameInfo->MD5); + MDFN_printf(_("ROM MD5: 0x%s\n"), md5_context::asciistr(MDFNGameInfo->MD5, 0).c_str()); + + uint8 header[10]; + memcpy(header, wsCartROM + rom_size - 10, 10); + + { + const char *developer_name = "???"; + for(unsigned int x = 0; x < sizeof(Developers) / sizeof(DLEntry); x++) + { + if(Developers[x].id == header[0]) + { + developer_name = Developers[x].name; + break; + } + } + MDFN_printf(_("Developer: %s (0x%02x)\n"), developer_name, header[0]); + } + + uint32 SRAMSize = 0; + eeprom_size = 0; + + switch(header[5]) + { + case 0x01: SRAMSize = 8 * 1024; break; + case 0x02: SRAMSize = 32 * 1024; break; + + case 0x03: SRAMSize = 128 * 1024; break; // Taikyoku Igo. Maybe it should only be 65536 bytes? + + case 0x04: SRAMSize = 256 * 1024; break; // Dicing Knight, Judgement Silversword + case 0x05: SRAMSize = 512 * 1024; break; // Wonder Gate + + case 0x10: eeprom_size = 128; break; + case 0x20: eeprom_size = 2*1024; break; + case 0x50: eeprom_size = 1024; break; + } + + //printf("Header5: %02x\n", header[5]); + + if(eeprom_size) + MDFN_printf(_("EEPROM: %d bytes\n"), eeprom_size); + + if(SRAMSize) + MDFN_printf(_("Battery-backed RAM: %d bytes\n"), SRAMSize); + + MDFN_printf(_("Recorded Checksum: 0x%04x\n"), header[8] | (header[9] << 8)); + { + uint16 real_crc = 0; + for(unsigned int i = 0; i < rom_size - 2; i++) + real_crc += wsCartROM[i]; + MDFN_printf(_("Real Checksum: 0x%04x\n"), real_crc); + } + + if(IsWW) + MDFN_printf(_("WonderWitch firmware detected.\n")); + + if((header[8] | (header[9] << 8)) == 0x8de1 && (header[0]==0x01)&&(header[2]==0x27)) /* Detective Conan */ + { + //puts("HAX"); + /* WS cpu is using cache/pipeline or there's protected ROM bank where pointing CS */ + wsCartROM[0xfffe8]=0xea; + wsCartROM[0xfffe9]=0x00; + wsCartROM[0xfffea]=0x00; + wsCartROM[0xfffeb]=0x00; + wsCartROM[0xfffec]=0x20; + } + + if(!IsWSR) + { + if(header[6] & 0x1) + MDFNGameInfo->rotated = MDFN_ROTATE90; + } + + MDFNMP_Init(16384, (1 << 20) / 1024); + + #ifdef WANT_DEBUGGER + WSwanDBG_Init(); + #endif + + WSwan_MemoryInit(MDFN_GetSettingB("wswan.language"), wsc, SRAMSize, IsWW); + + if(!IsWSR) + WSwan_MemoryLoadNV(); + + Comm_Init(MDFN_GetSettingB("wswan.excomm") ? MDFN_GetSettingS("wswan.excomm.path").c_str() : NULL); + + WSwan_GfxInit(); + MDFNGameInfo->fps = (uint32)((uint64)3072000 * 65536 * 256 / (159*256)); + MDFNGameInfo->GameSetMD5Valid = FALSE; + + WSwan_SoundInit(); + + RTC_Init(); + + wsMakeTiles(); + + Reset(); + } + catch(...) + { + Cleanup(); + + throw; + } +} + +static void SetInput(unsigned port, const char *type, uint8 *ptr) +{ + if(!port) chee = (uint8 *)ptr; +} + +static void StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + if(IsWSR) + { + SFORMAT StateRegs[] = + { + SFVAR(WSRCurrentSong), + SFVAR(WSRLastButtonStatus), + SFEND + }; + MDFNSS_StateAction(sm, load, data_only, StateRegs, "WSRP"); + } + + v30mz_StateAction(sm, load, data_only); + + // Call MemoryStateAction before others StateActions... + WSwan_MemoryStateAction(sm, load, data_only); + + WSwan_GfxStateAction(sm, load, data_only); + + RTC_StateAction(sm, load, data_only); + + WSwan_InterruptStateAction(sm, load, data_only); + + WSwan_SoundStateAction(sm, load, data_only); + + WSwan_EEPROMStateAction(sm, load, data_only); + + Comm_StateAction(sm, load, data_only); +} + +static void DoSimpleCommand(int cmd) +{ + switch(cmd) + { + case MDFN_MSC_POWER: + case MDFN_MSC_RESET: Reset(); + break; + } +} + +static const MDFNSetting_EnumList SexList[] = +{ + { "m", WSWAN_SEX_MALE }, + { "male", WSWAN_SEX_MALE, gettext_noop("Male") }, + + { "f", WSWAN_SEX_FEMALE }, + { "female", WSWAN_SEX_FEMALE, gettext_noop("Female") }, + + { "3", 3 }, + + { NULL, 0 }, +}; + +static const MDFNSetting_EnumList BloodList[] = +{ + { "a", WSWAN_BLOOD_A, "A" }, + { "b", WSWAN_BLOOD_B, "B" }, + { "o", WSWAN_BLOOD_O, "O" }, + { "ab", WSWAN_BLOOD_AB, "AB" }, + + { "5", 5 }, + + { NULL, 0 }, +}; + +static const MDFNSetting_EnumList LanguageList[] = +{ + { "japanese", 0, gettext_noop("Japanese") }, + { "0", 0 }, + + { "english", 1, gettext_noop("English") }, + { "1", 1 }, + + { NULL, 0 }, +}; + +static const MDFNSetting WSwanSettings[] = +{ + { "wswan.rotateinput", MDFNSF_NOFLAGS, gettext_noop("Virtually rotate D-pads along with screen."), NULL, MDFNST_BOOL, "0" }, + { "wswan.language", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Language games should display text in."), gettext_noop("The only game this setting is known to affect is \"Digimon Tamers - Battle Spirit\"."), MDFNST_ENUM, "english", NULL, NULL, NULL, NULL, LanguageList }, + { "wswan.name", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Name"), NULL, MDFNST_STRING, "Mednafen" }, + { "wswan.byear", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Birth Year"), NULL, MDFNST_UINT, "1989", "0", "9999" }, + { "wswan.bmonth", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Birth Month"), NULL, MDFNST_UINT, "6", "1", "12" }, + { "wswan.bday", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Birth Day"), NULL, MDFNST_UINT, "23", "1", "31" }, + { "wswan.sex", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Sex"), NULL, MDFNST_ENUM, "F", NULL, NULL, NULL, NULL, SexList }, + { "wswan.blood", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Blood Type"), NULL, MDFNST_ENUM, "O", NULL, NULL, NULL, NULL, BloodList }, + + { "wswan.excomm", MDFNSF_EMU_STATE | MDFNSF_SUPPRESS_DOC, gettext_noop("Enable comms to external program."), NULL, MDFNST_BOOL, "0" }, + { "wswan.excomm.path", MDFNSF_EMU_STATE | MDFNSF_SUPPRESS_DOC, gettext_noop("Comms external program path."), NULL, MDFNST_STRING, "wonderfence" }, + + { NULL } +}; + +// +// X* and Y* buttons are discrete buttons and not D-pads nor sticks(so for example, it's possible to press "up" and "down" simultaneously). +// +static const IDIISG IDII = +{ + { "up-x", "X1(X UP ↑)", 0, IDIT_BUTTON, NULL, { "right-x", "down-x", "left-x" } }, + { "right-x", "X2(X RIGHT →)", 3, IDIT_BUTTON, NULL, { "down-x", "left-x", "up-x" } }, + { "down-x", "X3(X DOWN ↓)", 1, IDIT_BUTTON, NULL, { "left-x", "up-x", "right-x" } }, + { "left-x", "X4(X LEFT ←)", 2, IDIT_BUTTON, NULL, { "up-x", "right-x", "down-x" } }, + + { "up-y", "Y1(Y UP ↑)", 4, IDIT_BUTTON, NULL, { "right-y", "down-y", "left-y" } }, + { "right-y", "Y2(Y RIGHT →)", 7, IDIT_BUTTON, NULL, { "down-y", "left-y", "up-y" } }, + { "down-y", "Y3(Y DOWN ↓)", 5, IDIT_BUTTON, NULL, { "left-y", "up-y", "right-y" } }, + { "left-y", "Y4(Y LEFT ←)", 6, IDIT_BUTTON, NULL, { "up-y", "right-y", "down-y" } }, + + { "start", "Start", 8, IDIT_BUTTON, NULL }, + { "a", "A", 10, IDIT_BUTTON_CAN_RAPID, NULL }, + { "b", "B", 9, IDIT_BUTTON_CAN_RAPID, NULL }, +}; + +static const std::vector InputDeviceInfo = +{ + { + "gamepad", + "Gamepad", + NULL, + IDII, + } +}; + +static const std::vector PortInfo = +{ + { "builtin", "Built-In", InputDeviceInfo, "gamepad" } +}; + +#ifdef WANT_DEBUGGER +static DebuggerInfoStruct DBGInfo = +{ + "shift_jis", + 7 + 1 + 8, // Fixme, probably not right... maximum number of prefixes + 1 for opcode + 4 for operand(go with 8 to be safe) + 1, // Instruction alignment(bytes) + 16, + 20, + 0x0000, + ~0U, + + WSwanDBG_MemPeek, + WSwanDBG_Disassemble, + WSwanDBG_ToggleSyntax, + WSwanDBG_IRQ, + NULL, //NESDBG_GetVector, + WSwanDBG_FlushBreakPoints, + WSwanDBG_AddBreakPoint, + WSwanDBG_SetCPUCallback, + WSwanDBG_EnableBranchTrace, + WSwanDBG_GetBranchTrace, + WSwan_GfxSetGraphicsDecode, +}; +#endif + +static const FileExtensionSpecStruct KnownExtensions[] = +{ + { ".ws", gettext_noop("WonderSwan ROM Image") }, + { ".wsc", gettext_noop("WonderSwan Color ROM Image") }, + { ".wsr", gettext_noop("WonderSwan Music Rip") }, + { NULL, NULL } +}; + +} + +using namespace MDFN_IEN_WSWAN; + +MDFNGI EmulatedWSwan = +{ + "wswan", + "WonderSwan", + KnownExtensions, + MODPRIO_INTERNAL_HIGH, + #ifdef WANT_DEBUGGER + &DBGInfo, + #else + NULL, + #endif + PortInfo, + Load, + TestMagic, + NULL, + NULL, + CloseGame, + + WSwan_SetLayerEnableMask, + "Background\0Foreground\0Sprites\0", + + NULL, + NULL, + + NULL, + 0, + + NULL, + NULL, + NULL, + NULL, + false, + StateAction, + Emulate, + NULL, + SetInput, + NULL, + DoSimpleCommand, + WSwanSettings, + MDFN_MASTERCLOCK_FIXED(3072000), + 0, + FALSE, // Multires possible? + + 224, // lcm_width + 144, // lcm_height + NULL, // Dummy + + 224, // Nominal width + 144, // Nominal height + + 224, // Framebuffer width + 144, // Framebuffer height + + 2, // Number of output sound channels +}; + diff --git a/Mednafen/mednafen/wswan/memory.cpp b/Mednafen/mednafen/wswan/memory.cpp new file mode 100644 index 0000000000..6e2a9f8cd6 --- /dev/null +++ b/Mednafen/mednafen/wswan/memory.cpp @@ -0,0 +1,832 @@ +/* Cygne + * + * Copyright notice for this file: + * Copyright (C) 2002 Dox dox@space.pl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "gfx.h" +#include "memory.h" +#include "sound.h" +#include "eeprom.h" +#include "rtc.h" +#include "v30mz.h" +#include "comm.h" +#include +#include +#include +#include +#include + +namespace MDFN_IEN_WSWAN +{ + +uint32 wsRAMSize; +uint8 wsRAM[65536]; +static uint8 *wsSRAM = NULL; + +uint8 *wsCartROM; +static uint32 sram_size; +uint32 eeprom_size; + +static uint8 ButtonWhich, ButtonReadLatch; + +static uint32 DMASource, DMADest; +static uint16 DMALength; +static uint8 DMAControl; + +static uint32 SoundDMASource; +static uint16 SoundDMALength; +static uint8 SoundDMAControl; + +static uint8 BankSelector[4]; + +static bool language; + +// +static bool IsWW; +static uint8 WW_FlashLock; + +enum +{ + WW_FWSM_READ = 0, + + WW_FWSM_FPS0, + WW_FWSM_FPS1, + + WW_FWSM_FP0, + WW_FWSM_FP1, + + WW_FWSM_FPR0 +}; + +static uint8 WW_FWSM; +// + +extern uint16 WSButtonStatus; + +template +static INLINE void WriteMem(uint32 A, uint8 V) +{ + uint32 offset, bank; + + offset = A & 0xffff; + bank = (A>>16) & 0xF; + + //printf("WriteA: %08x %02x --- %02x %02x %02x %02x\n", A, V, BankSelector[0], BankSelector[1], BankSelector[2], BankSelector[3]); + + if(!bank) /*RAM*/ + { + WSwan_SoundCheckRAMWrite(offset); + wsRAM[offset] = V; + + WSWan_TCacheInvalidByAddr(offset); + + if(offset>=0xfe00) /*WSC palettes*/ + WSwan_GfxWSCPaletteRAMWrite(offset, V); + } + else if(bank == 1) /* SRAM */ + { + //if((offset | (BankSelector[1] << 16)) >= 0x38000) + // printf("%08x\n", offset | (BankSelector[1] << 16)); + if(WW && (BankSelector[1] & 0x08)) + { + if(WW_FlashLock != 0x00) + { + uint32 rom_addr = offset | (BankSelector[1] << 16); + + //printf("Write: %08x %02x\n", rom_addr, V); + + switch(WW_FWSM) + { + case WW_FWSM_READ: + + if((rom_addr & 0xFFF) == 0xAAA && V == 0xAA) + WW_FWSM = WW_FWSM_FPS0; + + break; + + case WW_FWSM_FPS0: + + if((rom_addr & 0xFFF) == 0x555 && V == 0x55) + WW_FWSM = WW_FWSM_FPS1; + else + WW_FWSM = WW_FWSM_READ; + + break; + + case WW_FWSM_FPS1: + if((rom_addr & 0xFFF) == 0xAAA && V == 0x20) + WW_FWSM = WW_FWSM_FP0; + else + WW_FWSM = WW_FWSM_READ; + break; + + case WW_FWSM_FP0: + if((rom_addr & 0xFFF) == 0xBA && V == 0x90) + WW_FWSM = WW_FWSM_FPR0; + else if(V == 0xA0) + WW_FWSM = WW_FWSM_FP1; + break; + + case WW_FWSM_FP1: + //printf("Program: %08x %02x\n", rom_addr, V); + wsCartROM[rom_addr & 524287] = V; + WW_FWSM = WW_FWSM_FP0; + break; + + case WW_FWSM_FPR0: + if(V == 0xF0) + WW_FWSM = WW_FWSM_READ; + break; + } + } + } + else if(sram_size) + wsSRAM[(offset | (BankSelector[1] << 16)) & (sram_size - 1)] = V; + } +} + +#if 0 + WW_FWSM_READ = 0, + + WW_FWSM_FPS0, + WW_FWSM_FPS1, + + WW_FWSM_FP0, + WW_FWSM_FP1, + + WW_FWSM_FPR0 +#endif +template +static INLINE uint8 ReadMem(uint32 A) +{ + uint32 offset, bank; + + offset = A & 0xFFFF; + bank = (A >> 16) & 0xF; + + switch(bank) + { + case 0: return wsRAM[offset]; + + case 1: if(WW && (BankSelector[1] & 0x08)) + { + uint32 rom_addr = (offset | (BankSelector[1] << 16)); + uint8 ret = wsCartROM[rom_addr & 524287]; + + if(WW_FWSM != WW_FWSM_READ) + ret &= 0x80; + + //printf("%08x %02x %02x\n", rom_addr, wsCartROM[rom_addr & 524287], ret); + + return ret; + } + else if(sram_size) + { + return wsSRAM[(offset | (BankSelector[1] << 16)) & (sram_size - 1)]; + } + else + return(0); + + default: + { + uint32 rom_addr; + + if(bank == 2 || bank == 3) + rom_addr = offset + ((BankSelector[bank] & ((rom_size >> 16) - 1)) << 16); + else + { + uint8 bank_num = (((BankSelector[0] & 0xF) << 4) | (bank & 0xf)) & ((rom_size >> 16) - 1); + rom_addr = (bank_num << 16) | offset; + } + + return wsCartROM[rom_addr]; + } + } +} + +static void ws_CheckDMA(void) +{ + if(DMAControl & 0x80) + { + while(DMALength) + { + WSwan_writemem20(DMADest, WSwan_readmem20(DMASource)); + + DMASource++; // = ((DMASource + 1) & 0xFFFF) | (DMASource & 0xFF0000); + //if(!(DMASource & 0xFFFF)) puts("Warning: DMA source bank crossed."); + DMADest = ((DMADest + 1) & 0xFFFF) | (DMADest & 0xFF0000); + DMALength--; + } + } + DMAControl &= ~0x80; +} + +void WSwan_CheckSoundDMA(void) +{ + if(SoundDMAControl & 0x80) + { + if(SoundDMALength) + { + uint8 zebyte = WSwan_readmem20(SoundDMASource); + + if(SoundDMAControl & 0x08) + zebyte ^= 0x80; + + if(SoundDMAControl & 0x10) + WSwan_SoundWrite(0x95, zebyte); // Pick a port, any port?! + else + WSwan_SoundWrite(0x89, zebyte); + + SoundDMASource++; // = ((SoundDMASource + 1) & 0xFFFF) | (SoundDMASource & 0xFF0000); + //if(!(SoundDMASource & 0xFFFF)) puts("Warning: Sound DMA source bank crossed."); + SoundDMALength--; + } + if(!SoundDMALength) + SoundDMAControl &= ~0x80; + } +} + +template +static INLINE uint8 ReadPort(uint32 number) +{ + number &= 0xFF; + + if(number >= 0x80 && number <= 0x9F) + return(WSwan_SoundRead(number)); + else if(number <= 0x3F || (number >= 0xA0 && number <= 0xAF) || (number == 0x60)) + return(WSwan_GfxRead(number)); + else if((number >= 0xBA && number <= 0xBE) || (number >= 0xC4 && number <= 0xC8)) + return(WSwan_EEPROMRead(number)); + else if(number >= 0xCA && number <= 0xCB) + return(RTC_Read(number)); + else switch(number) + { + //default: printf("Read: %04x\n", number); break; + case 0x40: return(DMASource >> 0); + case 0x41: return(DMASource >> 8); + case 0x42: return(DMASource >> 16); + + case 0x43: return(DMADest >> 16); + case 0x44: return(DMADest >> 0); + case 0x45: return(DMADest >> 8); + + case 0x46: return(DMALength >> 0); + case 0x47: return(DMALength >> 8); + + case 0x48: return(DMAControl); + + case 0xB0: + case 0xB2: + case 0xB6: return(WSwan_InterruptRead(number)); + + case 0xC0: return(BankSelector[0] | 0x20); + case 0xC1: return(BankSelector[1]); + case 0xC2: return(BankSelector[2]); + case 0xC3: return(BankSelector[3]); + + case 0x4a: return(SoundDMASource >> 0); + case 0x4b: return(SoundDMASource >> 8); + case 0x4c: return(SoundDMASource >> 16); + case 0x4e: return(SoundDMALength >> 0); + case 0x4f: return(SoundDMALength >> 8); + case 0x52: return(SoundDMAControl); + + case 0xB1: + case 0xB3: return(Comm_Read(number)); + + case 0xb5: + { + uint8 ret = (ButtonWhich << 4) | ButtonReadLatch; + return(ret); + } + } + + if(WW && number == 0xCE) + return WW_FlashLock; + + if(number >= 0xC8) + return(0xD0 | language); + + return(0); +} + +template +static INLINE void WritePort(uint32 IOPort, uint8 V) +{ + IOPort &= 0xFF; + + if(IOPort >= 0x80 && IOPort <= 0x9F) + { + WSwan_SoundWrite(IOPort, V); + } + else if((IOPort >= 0x00 && IOPort <= 0x3F) || (IOPort >= 0xA0 && IOPort <= 0xAF) || (IOPort == 0x60)) + { + WSwan_GfxWrite(IOPort, V); + } + else if((IOPort >= 0xBA && IOPort <= 0xBE) || (IOPort >= 0xC4 && IOPort <= 0xC8)) + WSwan_EEPROMWrite(IOPort, V); + else if(IOPort >= 0xCA && IOPort <= 0xCB) + RTC_Write(IOPort, V); + else switch(IOPort) + { + //default: printf("%04x %02x\n", IOPort, V); break; + + case 0x40: DMASource &= 0xFFFF00; DMASource |= (V << 0); break; + case 0x41: DMASource &= 0xFF00FF; DMASource |= (V << 8); break; + case 0x42: DMASource &= 0x00FFFF; DMASource |= ((V & 0x0F) << 16); break; + + case 0x43: DMADest &= 0x00FFFF; DMADest |= ((V & 0x0F) << 16); break; + case 0x44: DMADest &= 0xFFFF00; DMADest |= (V << 0); break; + case 0x45: DMADest &= 0xFF00FF; DMADest |= (V << 8); break; + + case 0x46: DMALength &= 0xFF00; DMALength |= (V << 0); break; + case 0x47: DMALength &= 0x00FF; DMALength |= (V << 8); break; + + case 0x48: DMAControl = V; + //if(V&0x80) + // printf("DMA%02x: %08x %08x %08x\n", V, DMASource, DMADest, DMALength); + ws_CheckDMA(); + break; + + case 0x4a: SoundDMASource &= 0xFFFF00; SoundDMASource |= (V << 0); break; + case 0x4b: SoundDMASource &= 0xFF00FF; SoundDMASource |= (V << 8); break; + case 0x4c: SoundDMASource &= 0x00FFFF; SoundDMASource |= (V << 16); break; + //case 0x4d: break; // Unused? + case 0x4e: SoundDMALength &= 0xFF00; SoundDMALength |= (V << 0); break; + case 0x4f: SoundDMALength &= 0x00FF; SoundDMALength |= (V << 8); break; + //case 0x50: break; // Unused? + //case 0x51: break; // Unused? + case 0x52: SoundDMAControl = V; + //if(V & 0x80) printf("Sound DMA: %02x, %08x %08x\n", V, SoundDMASource, SoundDMALength); + break; + + case 0xB0: + case 0xB2: + case 0xB6: WSwan_InterruptWrite(IOPort, V); break; + + case 0xB1: + case 0xB3: Comm_Write(IOPort, V); break; + + case 0xb5: ButtonWhich = V >> 4; + ButtonReadLatch = 0; + + if(ButtonWhich & 0x4) /*buttons*/ + ButtonReadLatch |= ((WSButtonStatus >> 8) << 1) & 0xF; + + if(ButtonWhich & 0x2) /* H/X cursors */ + ButtonReadLatch |= WSButtonStatus & 0xF; + + if(ButtonWhich & 0x1) /* V/Y cursors */ + ButtonReadLatch |= (WSButtonStatus >> 4) & 0xF; + break; + + case 0xC0: BankSelector[0] = V & 0xF; break; + case 0xC1: BankSelector[1] = V; break; + case 0xC2: BankSelector[2] = V; break; + case 0xC3: BankSelector[3] = V; break; + } + + if(WW && IOPort == 0xCE) + WW_FlashLock = V; +} + +void WSwan_writemem20(uint32 A, uint8 V) +{ + WriteMem(A, V); +} + +uint8 WSwan_readmem20(uint32 A) +{ + return ReadMem(A); +} + +uint8 WSwan_readport(uint32 number) +{ + return ReadPort(number); +} + +void WSwan_writeport(uint32 IOPort, uint8 V) +{ + WritePort(IOPort, V); +} + +void WSwan_writemem20_WW(uint32 A, uint8 V) +{ + WriteMem(A, V); +} + +uint8 WSwan_readmem20_WW(uint32 A) +{ + return ReadMem(A); +} + +uint8 WSwan_readport_WW(uint32 number) +{ + return ReadPort(number); +} + +void WSwan_writeport_WW(uint32 IOPort, uint8 V) +{ + WritePort(IOPort, V); +} + +#ifdef WANT_DEBUGGER +static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) +{ + if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= wsRAMSize - 1; + *Buffer = wsRAM[Address]; + Address++; + Buffer++; + } + } + else if(!strcmp(name, "physical")) + { + while(Length--) + { + Address &= 0xFFFFF; + *Buffer = WSwan_readmem20(Address); + Address++; + Buffer++; + } + } + else if(!strcmp(name, "cs") || !strcmp(name, "ds") || !strcmp(name, "ss") || !strcmp(name, "es")) + { + uint32 segment; + uint32 phys_address; + + if(!strcmp(name, "cs")) + segment = v30mz_get_reg(NEC_PS); + else if(!strcmp(name, "ss")) + segment = v30mz_get_reg(NEC_SS); + else if(!strcmp(name, "ds")) + segment = v30mz_get_reg(NEC_DS0); + else if(!strcmp(name, "es")) + segment = v30mz_get_reg(NEC_DS1); + + phys_address = (Address + (segment << 4)) & 0xFFFFF; + + GetAddressSpaceBytes("physical", phys_address, Length, Buffer); + } +} + +static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) +{ + if(!strcmp(name, "ram")) + { + while(Length--) + { + Address &= wsRAMSize - 1; + wsRAM[Address] = *Buffer; + WSWan_TCacheInvalidByAddr(Address); + if(Address >= 0xfe00) + WSwan_GfxWSCPaletteRAMWrite(Address, *Buffer); + + Address++; + Buffer++; + } + } + else if(!strcmp(name, "physical")) + { + while(Length--) + { + uint32 offset, bank; + + Address &= 0xFFFFF; + + offset = Address & 0xFFFF; + bank = (Address >> 16) & 0xF; + + switch(bank) + { + case 0: wsRAM[offset & (wsRAMSize - 1)] = *Buffer; + WSWan_TCacheInvalidByAddr(offset & (wsRAMSize - 1)); + if(Address >= 0xfe00) + WSwan_GfxWSCPaletteRAMWrite(offset & (wsRAMSize - 1), *Buffer); + break; + case 1: + if(IsWW && (BankSelector[1] & 0x08)) + { + uint32 rom_addr = (offset | (BankSelector[1] << 16)); + wsCartROM[rom_addr & 524287] = *Buffer; + } + else if(sram_size) + wsSRAM[(offset | (BankSelector[1] << 16)) & (sram_size - 1)] = *Buffer; + break; + case 2: + case 3: wsCartROM[offset+((BankSelector[bank]&((rom_size>>16)-1))<<16)] = *Buffer; + break; + + default: + { + uint8 bank_num = ((BankSelector[0] & 0xF) << 4) | (bank & 0xf); + bank_num &= (rom_size >> 16) - 1; + wsCartROM[(bank_num << 16) | offset] = *Buffer; + } + break; + } + + Address++; + Buffer++; + } + } + else if(!strcmp(name, "cs") || !strcmp(name, "ds") || !strcmp(name, "ss") || !strcmp(name, "es")) + { + uint32 segment; + uint32 phys_address; + + if(!strcmp(name, "cs")) + segment = v30mz_get_reg(NEC_PS); + else if(!strcmp(name, "ss")) + segment = v30mz_get_reg(NEC_SS); + else if(!strcmp(name, "ds")) + segment = v30mz_get_reg(NEC_DS0); + else if(!strcmp(name, "es")) + segment = v30mz_get_reg(NEC_DS1); + + phys_address = (Address + (segment << 4)) & 0xFFFFF; + + PutAddressSpaceBytes("physical", phys_address, Length, Granularity, hl, Buffer); + } +} + +uint32 WSwan_MemoryGetRegister(const unsigned int id, char *special, const uint32 special_len) +{ + uint32 ret = 0; + + switch(id) + { + case MEMORY_GSREG_ROMBBSLCT: + ret = BankSelector[0]; + + if(special) + { + trio_snprintf(special, special_len, "((0x%02x * 0x100000) %% 0x%08x) + 20 bit address = 0x%08x + 20 bit address", BankSelector[0], rom_size, (BankSelector[0] * 0x100000) & (rom_size - 1)); + } + break; + + case MEMORY_GSREG_BNK1SLCT: + ret = BankSelector[1]; + break; + + case MEMORY_GSREG_BNK2SLCT: + ret = BankSelector[2]; + break; + + case MEMORY_GSREG_BNK3SLCT: + ret = BankSelector[3]; + break; + } + + return(ret); +} + +void WSwan_MemorySetRegister(const unsigned int id, uint32 value) +{ + switch(id) + { + case MEMORY_GSREG_ROMBBSLCT: + BankSelector[0] = value; + break; + + case MEMORY_GSREG_BNK1SLCT: + BankSelector[1] = value; + break; + + case MEMORY_GSREG_BNK2SLCT: + BankSelector[2] = value; + break; + + case MEMORY_GSREG_BNK3SLCT: + BankSelector[3] = value; + break; + } +} + +#endif + +static void Cleanup(void) +{ + if(wsSRAM) + { + MDFN_free(wsSRAM); + wsSRAM = NULL; + } +} + +void WSwan_MemoryKill(void) +{ + Cleanup(); +} + +void WSwan_MemoryLoadNV(void) +{ + if(sram_size || eeprom_size) + { + try + { + const std::string path = MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"); + std::unique_ptr savegame_fp = MDFN_AmbigGZOpenHelper(path, std::vector({ eeprom_size + sram_size })); + const uint64 fp_size_tmp = savegame_fp->size(); + + if(fp_size_tmp != ((uint64)eeprom_size + sram_size)) + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu bytes."), path.c_str(), (unsigned long long)fp_size_tmp, ((unsigned long long)eeprom_size + sram_size)); + + if(eeprom_size) + savegame_fp->read(wsEEPROM, eeprom_size); + + if(sram_size) + savegame_fp->read(wsSRAM, sram_size); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } + + if(IsWW) + { + try + { + const std::string path = MDFN_MakeFName(MDFNMKF_SAV, 0, "flash"); + FileStream savegame_fp(path, FileStream::MODE_READ); + const uint64 fp_size_tmp = savegame_fp.size(); + + if(fp_size_tmp != 524288) + throw MDFN_Error(0, _("Save game memory file \"%s\" is an incorrect size(%llu bytes). The correct size is %llu bytes."), path.c_str(), (unsigned long long)fp_size_tmp, (unsigned long long)524288); + + savegame_fp.read(wsCartROM, 524288); + } + catch(MDFN_Error &e) + { + if(e.GetErrno() != ENOENT) + throw; + } + } +} + +void WSwan_MemorySaveNV(void) +{ + if(sram_size || eeprom_size) + { + std::vector EvilRams; + + if(eeprom_size) + EvilRams.push_back(PtrLengthPair(wsEEPROM, eeprom_size)); + + if(sram_size) + EvilRams.push_back(PtrLengthPair(wsSRAM, sram_size)); + + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "sav"), EvilRams); + } + + if(IsWW) + { + MDFN_DumpToFile(MDFN_MakeFName(MDFNMKF_SAV, 0, "flash"), wsCartROM, 524288); + } +} + +void WSwan_MemoryInit(bool lang, bool IsWSC, uint32 ssize, bool IsWW_arg) +{ + IsWW = IsWW_arg; + + try + { + const uint16 byear = MDFN_GetSettingUI("wswan.byear"); + const uint8 bmonth = MDFN_GetSettingUI("wswan.bmonth"); + const uint8 bday = MDFN_GetSettingUI("wswan.bday"); + const uint8 sex = MDFN_GetSettingI("wswan.sex"); + const uint8 blood = MDFN_GetSettingI("wswan.blood"); + + language = lang; + + wsRAMSize = 65536; + sram_size = ssize; + + #ifdef WANT_DEBUGGER + { + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "physical", "CPU Physical", 20); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ram", "RAM", (int)(log(wsRAMSize) / log(2))); + + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "cs", "Code Segment", 16); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ss", "Stack Segment", 16); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "ds", "Data Segment", 16); + ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "es", "Extra Segment", 16); + } + #endif + + // WSwan_EEPROMInit() will also clear wsEEPROM + WSwan_EEPROMInit(MDFN_GetSettingS("wswan.name").c_str(), byear, bmonth, bday, sex, blood); + + if(sram_size) + { + wsSRAM = (uint8*)MDFN_malloc_T(sram_size, "SRAM"); + memset(wsSRAM, 0, sram_size); + } + + MDFNMP_AddRAM(wsRAMSize, 0x00000, wsRAM); + + if(sram_size) + MDFNMP_AddRAM(sram_size, 0x10000, wsSRAM); + + if(IsWW) + v30mz_init(WSwan_readmem20_WW, WSwan_writemem20_WW, WSwan_readport_WW, WSwan_writeport_WW); + else + v30mz_init(WSwan_readmem20, WSwan_writemem20, WSwan_readport, WSwan_writeport); + } + catch(...) + { + Cleanup(); + throw; + } +} + +void WSwan_MemoryReset(void) +{ + memset(wsRAM, 0, 65536); + + wsRAM[0x75AC] = 0x41; + wsRAM[0x75AD] = 0x5F; + wsRAM[0x75AE] = 0x43; + wsRAM[0x75AF] = 0x31; + wsRAM[0x75B0] = 0x6E; + wsRAM[0x75B1] = 0x5F; + wsRAM[0x75B2] = 0x63; + wsRAM[0x75B3] = 0x31; + + memset(BankSelector, 0, sizeof(BankSelector)); + ButtonWhich = 0; + ButtonReadLatch = 0; + DMASource = 0; + DMADest = 0; + DMALength = 0; + DMAControl = 0; + + SoundDMASource = 0; + SoundDMALength = 0; + SoundDMAControl = 0; + + // + WW_FlashLock = 0; + WW_FWSM = 0; +} + +void WSwan_MemoryStateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAYN(wsRAM, 65536, "RAM"), + SFARRAYN(sram_size ? wsSRAM : NULL, sram_size, "SRAM"), + SFVAR(ButtonWhich), + SFVAR(ButtonReadLatch), + SFVAR(WSButtonStatus), + SFVAR(DMASource), + SFVAR(DMADest), + SFVAR(DMALength), + SFVAR(DMAControl), + + SFVAR(SoundDMASource), + SFVAR(SoundDMALength), + SFVAR(SoundDMAControl), + + SFARRAY(BankSelector, 4), + + SFARRAYN(IsWW ? wsCartROM : NULL, 524288, "WW flash"), + SFVAR(WW_FlashLock), + SFVAR(WW_FWSM), + + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "MEMR"); + + if(load) + { + for(uint32 A = 0xfe00; A <= 0xFFFF; A++) + { + WSwan_GfxWSCPaletteRAMWrite(A, wsRAM[A]); + } + } +} + +} diff --git a/Mednafen/mednafen/wswan/memory.h b/Mednafen/mednafen/wswan/memory.h new file mode 100644 index 0000000000..dcddd3396c --- /dev/null +++ b/Mednafen/mednafen/wswan/memory.h @@ -0,0 +1,48 @@ +#ifndef __WSWAN_MEMORY_H +#define __WSWAN_MEMORY_H + +namespace MDFN_IEN_WSWAN +{ + +extern uint8 wsRAM[65536]; +extern uint8 *wsCartROM; +extern uint32 eeprom_size; +extern uint8 wsEEPROM[2048]; + +uint8 WSwan_readmem20(uint32); +void WSwan_writemem20(uint32 address,uint8 data); + +uint8 WSwan_readmem20_WW(uint32); +void WSwan_writemem20_WW(uint32 address,uint8 data); + +void WSwan_MemoryInit(bool lang, bool IsWSC, uint32 ssize, bool IsWW); +void WSwan_MemoryKill(void); + +void WSwan_MemoryLoadNV(void); +void WSwan_MemorySaveNV(void); + + +void WSwan_CheckSoundDMA(void); +void WSwan_MemoryStateAction(StateMem *sm, const unsigned load, const bool data_only); +void WSwan_MemoryReset(void); +void WSwan_writeport(uint32 IOPort, uint8 V); +uint8 WSwan_readport(uint32 number); + +void WSwan_writeport_WW(uint32 IOPort, uint8 V); +uint8 WSwan_readport_WW(uint32 number); + +enum +{ + MEMORY_GSREG_ROMBBSLCT = 0, + MEMORY_GSREG_BNK1SLCT, + MEMORY_GSREG_BNK2SLCT, + MEMORY_GSREG_BNK3SLCT, +}; + + +uint32 WSwan_MemoryGetRegister(const unsigned int id, char *special, const uint32 special_len); +void WSwan_MemorySetRegister(const unsigned int id, uint32 value); + +} + +#endif diff --git a/Mednafen/mednafen/wswan/rtc.cpp b/Mednafen/mednafen/wswan/rtc.cpp new file mode 100644 index 0000000000..47f54748bf --- /dev/null +++ b/Mednafen/mednafen/wswan/rtc.cpp @@ -0,0 +1,316 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + RTC utilizing games: + Dicing Knight + Dokodemo Hamster 3 + Inuyasha - Kagome no Sengoku Nikki +*/ + +#include "wswan.h" +#include +#include + +#include // We really should move the BCD functions somewhere else... +using namespace CDUtility; + +namespace MDFN_IEN_WSWAN +{ + +static uint32 ClockCycleCounter; + +static uint8 Command; +static uint8 CommandBuffer[7]; +static uint8 CommandIndex; +static uint8 CommandCount; + +//template +struct GenericRTC +{ + GenericRTC(); + void Init(time_t zetime); + void Clock(void); + + bool BCDInc(uint8 &V, uint8 thresh, uint8 reset_val = 0x00); + + uint8 sec; + uint8 min; + uint8 hour; + uint8 wday; + uint8 mday; + uint8 mon; + uint8 year; +}; + +GenericRTC::GenericRTC() +{ + sec = 0x00; + min = 0x00; + hour = 0x00; + wday = 0x00; + mday = 0x01; + mon = 0x00; + year = 0x00; +} + +bool GenericRTC::BCDInc(uint8 &V, uint8 thresh, uint8 reset_val) +{ + V = ((V + 1) & 0x0F) | (V & 0xF0); + if((V & 0x0F) >= 0x0A) + { + V &= 0xF0; + V += 0x10; + + if((V & 0xF0) >= 0xA0) + { + V &= 0x0F; + } + } + + if(V >= thresh) + { + V = reset_val; + + return(true); + } + + return(false); +} + +void GenericRTC::Init(time_t tmp_time) +{ + struct tm *toom; + + //toom = gmtime(&tmp_time); + toom = localtime(&tmp_time); + + sec = U8_to_BCD(toom->tm_sec); + min = U8_to_BCD(toom->tm_min); + hour = U8_to_BCD(toom->tm_hour); + wday = U8_to_BCD(toom->tm_wday); + mday = U8_to_BCD(toom->tm_mday); + mon = U8_to_BCD(toom->tm_mon); + year = U8_to_BCD(toom->tm_year % 100); + + if(sec >= 0x60) // Murder the leap second. + sec = 0x59; +} + +void GenericRTC::Clock(void) +{ + if(BCDInc(sec, 0x60)) + { + if(BCDInc(min, 0x60)) + { + if(BCDInc(hour, 0x24)) + { + uint8 mday_thresh = 0x32; + + if(mon == 0x01) + { + mday_thresh = 0x29; + + if(((year & 0x0F) % 4) == ((year & 0x10) ? 0x02 : 0x00)) + mday_thresh = 0x30; + } + else if(mon == 0x03 || mon == 0x05 || mon == 0x08 || mon == 0x10) + mday_thresh = 0x31; + + BCDInc(wday, 0x07); + + if(BCDInc(mday, mday_thresh, 0x01)) + { + if(BCDInc(mon, 0x12)) + { + BCDInc(year, 0xA0); + } + } + } + } + } +} + +static GenericRTC RTC; + +void RTC_Write(uint8 A, uint8 V) +{ + //printf("RTC Write: %02x %02x\n", A, V); + + if(A == 0xCA) + { + Command = V & 0x1F; + + if(Command == 0x15) + { + CommandBuffer[0] = RTC.year; + CommandBuffer[1] = RTC.mon; + CommandBuffer[2] = RTC.mday; + CommandBuffer[3] = RTC.wday; + CommandBuffer[4] = RTC.hour; + CommandBuffer[5] = RTC.min; + CommandBuffer[6] = RTC.sec; + + CommandIndex = 0; + CommandCount = 7; + } + else if(Command == 0x14) + { + CommandIndex = 0; + CommandCount = 7; + } + else if(Command == 0x13) + { + //CommandIndex = 0; + } + } + else if(A == 0xCB) + { + if(Command == 0x14) + { + if(CommandIndex < CommandCount) + { + CommandBuffer[CommandIndex++] = V; + if(CommandIndex == CommandCount) + { + //printf("Program time\n"); + //for(int i = 0; i < CommandCount; i++) + // printf("%d: %02x\n", i, CommandBuffer[i]); + //abort(); +#if 0 + RTC.year = CommandBuffer[0]; + RTC.mon = CommandBuffer[1]; + RTC.mday = CommandBuffer[2]; + RTC.wday = CommandBuffer[3]; + RTC.hour = CommandBuffer[4]; + RTC.min = CommandBuffer[5]; + RTC.sec = CommandBuffer[6]; + + printf("WDAY: %02x\n", RTC.wday); +#endif + } + } + } + } +} + +uint8 RTC_Read(uint8 A) +{ + uint8 ret = 0; + + if(A == 0xCA) + { + ret = Command | 0x80; + } + else if(A == 0xCB) + { + ret = 0x80; + + if(Command == 0x15) + { + if(CommandIndex < CommandCount) + { + ret = CommandBuffer[CommandIndex]; + + if(!WS_InDebug) + CommandIndex++; + } + } + } + +// printf("RTC Read: %02x %02x\n", A, ret); + + return(ret); +} + +void RTC_Clock(uint32 cycles) +{ + ClockCycleCounter += cycles; + + while(ClockCycleCounter >= 3072000) + { + ClockCycleCounter -= 3072000; + RTC.Clock(); + } +} + +void RTC_Init(void) +{ + RTC.Init(time(NULL)); + ClockCycleCounter = 0; + +#if 0 + { + GenericRTC rtc_a, rtc_b; + time_t ct = 0; //947000000; //time(NULL); + + rtc_a.Init(ct); + + while(ct < INT_MAX) + { + rtc_b.Init(ct); + + if(memcmp(&rtc_a, &rtc_b, sizeof(GenericRTC))) + { + printf("%02x:%02x:%02x-%02x:%02x:%02x %02x:%02x:%02x-%02x:%02x:%02x\n", rtc_a.year, rtc_a.mon, rtc_a.mday, rtc_a.hour, rtc_a.min, rtc_a.sec, + rtc_b.year, rtc_b.mon, rtc_b.mday, rtc_b.hour, rtc_b.min, rtc_b.sec); + abort(); + } + + rtc_a.Clock(); + ct++; + } + } +#endif +} + +void RTC_Reset(void) +{ + Command = 0x00; +} + +void RTC_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFVAR(RTC.sec), + SFVAR(RTC.min), + SFVAR(RTC.hour), + SFVAR(RTC.wday), + SFVAR(RTC.mday), + SFVAR(RTC.mon), + SFVAR(RTC.year), + + SFVAR(ClockCycleCounter), + + SFVAR(Command), + SFARRAY(CommandBuffer, sizeof(CommandBuffer)), + SFVAR(CommandCount), + SFVAR(CommandIndex), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "RTC"); + + if(load) + { + + } +} + + +} diff --git a/Mednafen/mednafen/wswan/rtc.h b/Mednafen/mednafen/wswan/rtc.h new file mode 100644 index 0000000000..b33d3c269d --- /dev/null +++ b/Mednafen/mednafen/wswan/rtc.h @@ -0,0 +1,18 @@ +#ifndef __WSWAN_RTC_H +#define __WSWAN_RTC_H + +namespace MDFN_IEN_WSWAN +{ + +void RTC_Write(uint8 A, uint8 V); +uint8 RTC_Read(uint8 A); + +void RTC_Init(void); +void RTC_Reset(void); + +void RTC_Clock(uint32 cycles); +void RTC_StateAction(StateMem *sm, const unsigned load, const bool data_only); + +} + +#endif diff --git a/Mednafen/mednafen/wswan/sound.cpp b/Mednafen/mednafen/wswan/sound.cpp new file mode 100644 index 0000000000..f123568c4e --- /dev/null +++ b/Mednafen/mednafen/wswan/sound.cpp @@ -0,0 +1,450 @@ +/* Mednafen - Multi-system Emulator + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "sound.h" +#include "v30mz.h" +#include "memory.h" + +#include + +namespace MDFN_IEN_WSWAN +{ + + +static Blip_Synth WaveSynth; +static Blip_Synth NoiseSynth; +static Blip_Synth VoiceSynth; + +static Blip_Buffer *sbuf[2] = { NULL }; + +static uint16 period[4]; +static uint8 volume[4]; // left volume in upper 4 bits, right in lower 4 bits +static uint8 voice_volume; + +static uint8 sweep_step, sweep_value; +static uint8 noise_control; +static uint8 control; +static uint8 output_control; + +static int32 sweep_8192_divider; +static uint8 sweep_counter; +static uint8 SampleRAMPos; + +static int32 sample_cache[4][2]; + +static int32 last_v_val; + +static uint8 HyperVoice; +static int32 last_hv_val; + +static int32 period_counter[4]; +static int32 last_val[4][2]; // Last outputted value, l&r +static uint8 sample_pos[4]; +static uint16 nreg; +static uint32 last_ts; + + +#define MK_SAMPLE_CACHE \ + { \ + int sample; \ + sample = (((wsRAM[((SampleRAMPos << 6) + (sample_pos[ch] >> 1) + (ch << 4)) ] >> ((sample_pos[ch] & 1) ? 4 : 0)) & 0x0F)) - 0x8; \ + sample_cache[ch][0] = sample * ((volume[ch] >> 4) & 0x0F); \ + sample_cache[ch][1] = sample * ((volume[ch] >> 0) & 0x0F); \ + } + +#define MK_SAMPLE_CACHE_NOISE \ + { \ + int sample; \ + sample = ((nreg & 1) ? 0xF : 0x0) - 0x8; \ + sample_cache[ch][0] = sample * ((volume[ch] >> 4) & 0x0F); \ + sample_cache[ch][1] = sample * ((volume[ch] >> 0) & 0x0F); \ + } + + +#define SYNCSAMPLE(wt) \ + { \ + int32 left = sample_cache[ch][0], right = sample_cache[ch][1]; \ + WaveSynth.offset_inline(wt, left - last_val[ch][0], sbuf[0]); \ + WaveSynth.offset_inline(wt, right - last_val[ch][1], sbuf[1]); \ + last_val[ch][0] = left; \ + last_val[ch][1] = right; \ + } + +#define SYNCSAMPLE_NOISE(wt) \ + { \ + int32 left = sample_cache[ch][0], right = sample_cache[ch][1]; \ + NoiseSynth.offset_inline(wt, left - last_val[ch][0], sbuf[0]); \ + NoiseSynth.offset_inline(wt, right - last_val[ch][1], sbuf[1]); \ + last_val[ch][0] = left; \ + last_val[ch][1] = right; \ + } + +void WSwan_SoundUpdate(void) +{ + int32 run_time; + + //printf("%d\n", v30mz_timestamp); + //printf("%02x %02x\n", control, noise_control); + run_time = v30mz_timestamp - last_ts; + + for(unsigned int ch = 0; ch < 4; ch++) + { + // Channel is disabled? + if(!(control & (1 << ch))) + continue; + + if(ch == 1 && (control & 0x20)) // Direct D/A mode? + { + int32 neoval = (volume[ch] - 0x80) * voice_volume; + + VoiceSynth.offset(v30mz_timestamp, neoval - last_v_val, sbuf[0]); + VoiceSynth.offset(v30mz_timestamp, neoval - last_v_val, sbuf[1]); + + last_v_val = neoval; + } + else if(ch == 2 && (control & 0x40) && sweep_value) // Sweep + { + uint32 tmp_pt = 2048 - period[ch]; + uint32 meow_timestamp = v30mz_timestamp - run_time; + uint32 tmp_run_time = run_time; + + while(tmp_run_time) + { + int32 sub_run_time = tmp_run_time; + + if(sub_run_time > sweep_8192_divider) + sub_run_time = sweep_8192_divider; + + sweep_8192_divider -= sub_run_time; + if(sweep_8192_divider <= 0) + { + sweep_8192_divider += 8192; + sweep_counter--; + if(sweep_counter <= 0) + { + sweep_counter = sweep_step + 1; + period[ch] = (period[ch] + (int8)sweep_value) & 0x7FF; + } + } + + meow_timestamp += sub_run_time; + if(tmp_pt > 4) + { + period_counter[ch] -= sub_run_time; + while(period_counter[ch] <= 0) + { + sample_pos[ch] = (sample_pos[ch] + 1) & 0x1F; + + MK_SAMPLE_CACHE; + SYNCSAMPLE(meow_timestamp + period_counter[ch]); + period_counter[ch] += tmp_pt; + } + } + tmp_run_time -= sub_run_time; + } + } + else if(ch == 3 && (noise_control & 0x10)) //(control & 0x80)) // Noise + { + uint32 tmp_pt = 2048 - period[ch]; + + period_counter[ch] -= run_time; + while(period_counter[ch] <= 0) + { + static const uint8 stab[8] = { 14, 10, 13, 4, 8, 6, 9, 11 }; + + nreg = ((nreg << 1) | ((1 ^ (nreg >> 7) ^ (nreg >> stab[noise_control & 0x7])) & 1)) & 0x7FFF; + + if(control & 0x80) + { + MK_SAMPLE_CACHE_NOISE; + SYNCSAMPLE_NOISE(v30mz_timestamp + period_counter[ch]); + } + else if(tmp_pt > 4) + { + sample_pos[ch] = (sample_pos[ch] + 1) & 0x1F; + MK_SAMPLE_CACHE; + SYNCSAMPLE(v30mz_timestamp + period_counter[ch]); + } + period_counter[ch] += tmp_pt; + } + } + else + { + uint32 tmp_pt = 2048 - period[ch]; + + if(tmp_pt > 4) + { + period_counter[ch] -= run_time; + while(period_counter[ch] <= 0) + { + sample_pos[ch] = (sample_pos[ch] + 1) & 0x1F; + + MK_SAMPLE_CACHE; + SYNCSAMPLE(v30mz_timestamp + period_counter[ch]); // - period_counter[ch]); + period_counter[ch] += tmp_pt; + } + } + } + } + + { + int32 tmphv = HyperVoice; + + if(tmphv - last_hv_val) + { + WaveSynth.offset_inline(v30mz_timestamp, tmphv - last_hv_val, sbuf[0]); + WaveSynth.offset_inline(v30mz_timestamp, tmphv - last_hv_val, sbuf[1]); + last_hv_val = tmphv; + } + } + last_ts = v30mz_timestamp; +} + +void WSwan_SoundWrite(uint32 A, uint8 V) +{ + WSwan_SoundUpdate(); + + if(A >= 0x80 && A <= 0x87) + { + int ch = (A - 0x80) >> 1; + + if(A & 1) + period[ch] = (period[ch] & 0x00FF) | ((V & 0x07) << 8); + else + period[ch] = (period[ch] & 0x0700) | ((V & 0xFF) << 0); + + //printf("Period %d: 0x%04x --- %f\n", ch, period[ch], 3072000.0 / (2048 - period[ch])); + } + else if(A >= 0x88 && A <= 0x8B) + { + volume[A - 0x88] = V; + } + else if(A == 0x8C) + sweep_value = V; + else if(A == 0x8D) + { + sweep_step = V; + sweep_counter = sweep_step + 1; + sweep_8192_divider = 8192; + } + else if(A == 0x8E) + { + //printf("NOISECONTROL: %02x\n", V); + if(V & 0x8) + nreg = 0; + + noise_control = V & 0x17; + } + else if(A == 0x90) + { + for(int n = 0; n < 4; n++) + { + if(!(control & (1 << n)) && (V & (1 << n))) + { + period_counter[n] = 0; + sample_pos[n] = 0x1F; + } + } + control = V; + //printf("Sound Control: %02x\n", V); + } + else if(A == 0x91) + { + output_control = V & 0xF; + //printf("%02x, %02x\n", V, (V >> 1) & 3); + } + else if(A == 0x92) + nreg = (nreg & 0xFF00) | (V << 0); + else if(A == 0x93) + nreg = (nreg & 0x00FF) | ((V & 0x7F) << 8); + else if(A == 0x94) + { + voice_volume = V & 0xF; + //printf("%02x\n", V); + } + else switch(A) + { + case 0x8F: SampleRAMPos = V; break; + case 0x95: HyperVoice = V; break; // Pick a port, any port?! + //default: printf("%04x:%02x\n", A, V); break; + } + WSwan_SoundUpdate(); +} + +uint8 WSwan_SoundRead(uint32 A) +{ + WSwan_SoundUpdate(); + + if(A >= 0x80 && A <= 0x87) + { + int ch = (A - 0x80) >> 1; + + if(A & 1) + return(period[ch] >> 8); + else + return(period[ch]); + } + else if(A >= 0x88 && A <= 0x8B) + return(volume[A - 0x88]); + else switch(A) + { + default: printf("SoundRead: %04x\n", A); return(0); + case 0x8C: return(sweep_value); + case 0x8D: return(sweep_step); + case 0x8E: return(noise_control); + case 0x8F: return(SampleRAMPos); + case 0x90: return(control); + case 0x91: return(output_control | 0x80); + case 0x92: return((nreg >> 0) & 0xFF); + case 0x93: return((nreg >> 8) & 0xFF); + case 0x94: return(voice_volume); + } +} + + +int32 WSwan_SoundFlush(int16 *SoundBuf, const int32 MaxSoundFrames) +{ + int32 FrameCount = 0; + + WSwan_SoundUpdate(); + + if(SoundBuf) + { + for(int y = 0; y < 2; y++) + { + sbuf[y]->end_frame(v30mz_timestamp); + FrameCount = sbuf[y]->read_samples(SoundBuf + y, MaxSoundFrames, true); + } + } + + last_ts = 0; + + return(FrameCount); +} + +// Call before wsRAM is updated +void WSwan_SoundCheckRAMWrite(uint32 A) +{ + if((A >> 6) == SampleRAMPos) + WSwan_SoundUpdate(); +} + +static void RedoVolume(void) +{ + double eff_volume = 1.0 / 4; + + WaveSynth.volume(eff_volume); + NoiseSynth.volume(eff_volume); + VoiceSynth.volume(eff_volume); +} + +void WSwan_SoundInit(void) +{ + for(int i = 0; i < 2; i++) + { + sbuf[i] = new Blip_Buffer(); + + sbuf[i]->set_sample_rate(0 ? 0 : 44100, 60); + sbuf[i]->clock_rate((long)(3072000)); + sbuf[i]->bass_freq(20); + } + + RedoVolume(); +} + +void WSwan_SoundKill(void) +{ + for(int i = 0; i < 2; i++) + { + if(sbuf[i]) + { + delete sbuf[i]; + sbuf[i] = NULL; + } + } + +} + +bool WSwan_SetSoundRate(uint32 rate) +{ + for(int i = 0; i < 2; i++) + sbuf[i]->set_sample_rate(rate?rate:44100, 60); + + return(TRUE); +} + +void WSwan_SoundStateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + SFORMAT StateRegs[] = + { + SFARRAY16(period, 4), + SFARRAY(volume, 4), + SFVAR(voice_volume), + SFVAR(sweep_step), + SFVAR(sweep_value), + SFVAR(noise_control), + SFVAR(control), + SFVAR(output_control), + + SFVAR(sweep_8192_divider), + SFVAR(sweep_counter), + SFVAR(SampleRAMPos), + SFARRAY32(period_counter, 4), + SFARRAY(sample_pos, 4), + SFVAR(nreg), + SFEND + }; + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "PSG"); + + if(load) + { + + } +} + +void WSwan_SoundReset(void) +{ + memset(period, 0, sizeof(period)); + memset(volume, 0, sizeof(volume)); + voice_volume = 0; + sweep_step = 0; + sweep_value = 0; + noise_control = 0; + control = 0; + output_control = 0; + + sweep_8192_divider = 8192; + sweep_counter = 0; + SampleRAMPos = 0; + memset(period_counter, 0, sizeof(period_counter)); + memset(sample_pos, 0, sizeof(sample_pos)); + nreg = 0; + + memset(sample_cache, 0, sizeof(sample_cache)); + memset(last_val, 0, sizeof(last_val)); + last_v_val = 0; + + HyperVoice = 0; + last_hv_val = 0; + + for(int y = 0; y < 2; y++) + sbuf[y]->clear(); +} + +} diff --git a/Mednafen/mednafen/wswan/sound.h b/Mednafen/mednafen/wswan/sound.h new file mode 100644 index 0000000000..801164ef24 --- /dev/null +++ b/Mednafen/mednafen/wswan/sound.h @@ -0,0 +1,22 @@ +#ifndef __WSWAN_SOUND_H +#define __WSWAN_SOUND_H + +namespace MDFN_IEN_WSWAN +{ + +int32 WSwan_SoundFlush(int16 *SoundBuf, const int32 MaxSoundFrames); + +void WSwan_SoundInit(void); +void WSwan_SoundKill(void); +void WSwan_SetSoundMultiplier(double multiplier); +bool WSwan_SetSoundRate(uint32 rate); +void WSwan_SoundStateAction(StateMem *sm, const unsigned load, const bool data_only); + +void WSwan_SoundWrite(uint32, uint8); +uint8 WSwan_SoundRead(uint32); +void WSwan_SoundReset(void); +void WSwan_SoundCheckRAMWrite(uint32 A); + +} + +#endif diff --git a/Mednafen/mednafen/wswan/start.inc b/Mednafen/mednafen/wswan/start.inc new file mode 100644 index 0000000000..cccf7c7bb8 --- /dev/null +++ b/Mednafen/mednafen/wswan/start.inc @@ -0,0 +1,213 @@ +/* + =================================================================================== + Cygne WIN v 2.1a (c) Dox 2002 dox@space.pl + =================================================================================== + + NEC cpu core by Bryan McPhail,Oliver Bergmann, Fabrice Frances and David Hedley + Zlib by Jean-loup Gailly and Mark Adler + + =================================================================================== +*/ + +static const uint8 startio[0xC8] = { +0x00,//0 +0x00,//1 +0x9d,//2 +0xbb,//3 +0x00,//4 +0x00,//5 +0x00,//6 +0x26,//7 +0xfe,//8 +0xde,//9 +0xf9,//a +0xfb,//b +0xdb,//c +0xd7,//d +0x7f,//e +0xf5,//f +0x00,//10 +0x00,//11 +0x00,//12 +0x00,//13 +0x01,//14 +0x00,//15 +0x9e,//16 +0x9b,//17 +0x00,//18 +0x00,//19 +0x00,//1a +0x00,//1b +0x99,//1c +0xfd,//1d +0xb7,//1e +0xdf,//1f +0x30,//20 +0x57,//21 +0x75,//22 +0x76,//23 +0x15,//24 +0x73,//25 +0x77,//26 +0x77,//27 +0x20,//28 +0x75,//29 +0x50,//2a +0x36,//2b +0x70,//2c +0x67,//2d +0x50,//2e +0x77,//2f +0x57,//30 +0x54,//31 +0x75,//32 +0x77,//33 +0x75,//34 +0x17,//35 +0x37,//36 +0x73,//37 +0x50,//38 +0x57,//39 +0x60,//3a +0x77,//3b +0x70,//3c +0x77,//3d +0x10,//3e +0x73,//3f +0x00,//40 +0x00,//41 +0x00,//42 +0x00,//43 +0x00,//44 +0x00,//45 +0x00,//46 +0x00,//47 +0x00,//48 +0x00,//49 +0x00,//4a +0x00,//4b +0x00,//4c +0x00,//4d +0x00,//4e +0x00,//4f +0x00,//50 +0x00,//51 +0x00,//52 +0x00,//53 +0x00,//54 +0x00,//55 +0x00,//56 +0x00,//57 +0x00,//58 +0x00,//59 +0x00,//5a +0x00,//5b +0x00,//5c +0x00,//5d +0x00,//5e +0x00,//5f +0x0a,//60 +0x00,//61 +0x00,//62 +0x00,//63 +0x00,//64 +0x00,//65 +0x00,//66 +0x00,//67 +0x00,//68 +0x00,//69 +0x00,//6a +0x0f,//6b +0x00,//6c +0x00,//6d +0x00,//6e +0x00,//6f +0x00,//70 +0x00,//71 +0x00,//72 +0x00,//73 +0x00,//74 +0x00,//75 +0x00,//76 +0x00,//77 +0x00,//78 +0x00,//79 +0x00,//7a +0x00,//7b +0x00,//7c +0x00,//7d +0x00,//7e +0x00,//7f +0x00,//80 +0x00,//81 +0x00,//82 +0x00,//83 +0x00,//84 +0x00,//85 +0x00,//86 +0x00,//87 +0x00,//88 +0x00,//89 +0x00,//8a +0x00,//8b +0x00,//8c +0x1f,//8d 1d ? +0x00,//8e +0x00,//8f +0x00,//90 +0x00,//91 +0x00,//92 +0x00,//93 +0x00,//94 +0x00,//95 +0x00,//96 +0x00,//97 +0x00,//98 +0x00,//99 +0x00,//9a +0x00,//9b +0x00,//9c +0x00,//9d +0x03,//9e +0x00,//9f +0x87-2,//a0 +0x00,//a1 +0x00,//a2 +0x00,//a3 +0x0,//a4 2b +0x0,//a5 7f +0x4f,//a6 +0xff,//a7 cf ? +0x00,//a8 +0x00,//a9 +0x00,//aa +0x00,//ab +0x00,//ac +0x00,//ad +0x00,//ae +0x00,//af +0x00,//b0 +0xdb,//b1 +0x00,//b2 +0x00,//b3 +0x00,//b4 +0x40,//b5 +0x00,//b6 +0x00,//b7 +0x00,//b8 +0x00,//b9 +0x01,//ba +0x00,//bb +0x42,//bc +0x00,//bd +0x83,//be +0x00,//bf +0x2f,//c0 +0x3f,//c1 +0xff,//c2 +0xff,//c3 +0x00,//c4 +0x00,//c5 +0x00,//c6 +0x00,//c7 +}; diff --git a/Mednafen/mednafen/wswan/tcache.cpp b/Mednafen/mednafen/wswan/tcache.cpp new file mode 100644 index 0000000000..506b78110a --- /dev/null +++ b/Mednafen/mednafen/wswan/tcache.cpp @@ -0,0 +1,308 @@ +/* Cygne + * + * Copyright notice for this file: + * Copyright (C) 2002 Dox dox@space.pl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "wswan.h" +#include "gfx.h" +#include "memory.h" + +namespace MDFN_IEN_WSWAN +{ + + +uint8 tiles[256][256][2][8]; +uint8 wsTCache[512*64]; +uint8 wsTCache2[512*64]; +uint8 wsTCacheFlipped[512*64]; +uint8 wsTCacheFlipped2[512*64]; +uint8 wsTCacheUpdate[512]; +uint8 wsTCacheUpdate2[512]; +uint8 wsTileRow[8]; +int wsVMode; + +void WSWan_TCacheInvalidByAddr(uint32 ws_offset) +{ + if(wsVMode && (ws_offset>=0x4000)&&(ws_offset<0x8000)) + { + wsTCacheUpdate[(ws_offset-0x4000)>>5]=FALSE; /*invalidate tile*/ + return; + } + else if((ws_offset>=0x2000)&&(ws_offset<0x4000)) + { + wsTCacheUpdate[(ws_offset-0x2000)>>4]=FALSE; /*invalidate tile*/ + return; + } + + if(wsVMode && (ws_offset>=0x8000)&&(ws_offset<0xc000)) + { + wsTCacheUpdate2[(ws_offset-0x8000)>>5]=FALSE; /*invalidate tile*/ + return; + } + else if((ws_offset>=0x4000)&&(ws_offset<0x6000)) + { + wsTCacheUpdate2[(ws_offset-0x4000)>>4]=FALSE; /*invalidate tile*/ + return; + } +} + +void wsSetVideo(int number,bool force) +{ + if((number!=wsVMode)||(force)) + { + wsVMode=number; + memset(wsTCacheUpdate,0,512); + memset(wsTCacheUpdate2,0,512); + } +} + +void wsMakeTiles(void) +{ + int x,y,b0,b1,b2,b3,b4,b5,b6,b7; + for(x=0;x<256;x++) + for(y=0;y<256;y++) + { + b0=(x&128)>>7;b1=(x&64)>>6;b2=(x&32)>>5;b3=(x&16)>>4;b4=(x&8)>>3;b5=(x&4)>>2;b6=(x&2)>>1;b7=(x&1); + b0|=(y&128)>>6;b1|=(y&64)>>5;b2|=(y&32)>>4;b3|=(y&16)>>3;b4|=(y&8)>>2;b5|=(y&4)>>1;b6|=(y&2);b7|=(y&1)<<1; + tiles[x][y][0][0]=b0; + tiles[x][y][0][1]=b1; + tiles[x][y][0][2]=b2; + tiles[x][y][0][3]=b3; + tiles[x][y][0][4]=b4; + tiles[x][y][0][5]=b5; + tiles[x][y][0][6]=b6; + tiles[x][y][0][7]=b7; + tiles[x][y][1][0]=b7; + tiles[x][y][1][1]=b6; + tiles[x][y][1][2]=b5; + tiles[x][y][1][3]=b4; + tiles[x][y][1][4]=b3; + tiles[x][y][1][5]=b2; + tiles[x][y][1][6]=b1; + tiles[x][y][1][7]=b0; + } +} + +void wsGetTile(uint32 number,uint32 line,int flipv,int fliph,int bank) +{ + uint32 t_adr,t_index,i; + uint8 byte0,byte1,byte2,byte3; + + if((!bank)||(!(wsVMode &0x07))) + { + +#ifdef TCACHE_OFF + wsTCacheUpdate[number]=false; +#endif + + if(!wsTCacheUpdate[number]) + { + wsTCacheUpdate[number]=true; + switch(wsVMode) + { + case 7: + t_adr=0x4000+(number<<5); + t_index=number<<6; + for(i=0;i<8;i++) + { + byte0=wsRAM[t_adr++]; + byte1=wsRAM[t_adr++]; + byte2=wsRAM[t_adr++]; + byte3=wsRAM[t_adr++]; + wsTCache[t_index]=byte0>>4; + wsTCacheFlipped[t_index++]=byte3&15; + wsTCache[t_index]=byte0&15; + wsTCacheFlipped[t_index++]=byte3>>4; + wsTCache[t_index]=byte1>>4; + wsTCacheFlipped[t_index++]=byte2&15; + wsTCache[t_index]=byte1&15; + wsTCacheFlipped[t_index++]=byte2>>4; + wsTCache[t_index]=byte2>>4; + wsTCacheFlipped[t_index++]=byte1&15; + wsTCache[t_index]=byte2&15; + wsTCacheFlipped[t_index++]=byte1>>4; + wsTCache[t_index]=byte3>>4; + wsTCacheFlipped[t_index++]=byte0&15; + wsTCache[t_index]=byte3&15; + wsTCacheFlipped[t_index++]=byte0>>4; + } + break; + + case 6: + t_adr=0x4000+(number<<5); + t_index=number<<6; + for(i=0;i<8;i++) + { + byte0=wsRAM[t_adr++]; + byte1=wsRAM[t_adr++]; + byte2=wsRAM[t_adr++]; + byte3=wsRAM[t_adr++]; + wsTCache[t_index]=((byte0>>7)&1)|(((byte1>>7)&1)<<1)|(((byte2>>7)&1)<<2)|(((byte3>>7)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0)&1)|(((byte1)&1)<<1)|(((byte2)&1)<<2)|(((byte3)&1)<<3); + wsTCache[t_index]=((byte0>>6)&1)|(((byte1>>6)&1)<<1)|(((byte2>>6)&1)<<2)|(((byte3>>6)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>1)&1)|(((byte1>>1)&1)<<1)|(((byte2>>1)&1)<<2)|(((byte3>>1)&1)<<3); + wsTCache[t_index]=((byte0>>5)&1)|(((byte1>>5)&1)<<1)|(((byte2>>5)&1)<<2)|(((byte3>>5)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>2)&1)|(((byte1>>2)&1)<<1)|(((byte2>>2)&1)<<2)|(((byte3>>2)&1)<<3); + wsTCache[t_index]=((byte0>>4)&1)|(((byte1>>4)&1)<<1)|(((byte2>>4)&1)<<2)|(((byte3>>4)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>3)&1)|(((byte1>>3)&1)<<1)|(((byte2>>3)&1)<<2)|(((byte3>>3)&1)<<3); + wsTCache[t_index]=((byte0>>3)&1)|(((byte1>>3)&1)<<1)|(((byte2>>3)&1)<<2)|(((byte3>>3)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>4)&1)|(((byte1>>4)&1)<<1)|(((byte2>>4)&1)<<2)|(((byte3>>4)&1)<<3); + wsTCache[t_index]=((byte0>>2)&1)|(((byte1>>2)&1)<<1)|(((byte2>>2)&1)<<2)|(((byte3>>2)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>5)&1)|(((byte1>>5)&1)<<1)|(((byte2>>5)&1)<<2)|(((byte3>>5)&1)<<3); + wsTCache[t_index]=((byte0>>1)&1)|(((byte1>>1)&1)<<1)|(((byte2>>1)&1)<<2)|(((byte3>>1)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>6)&1)|(((byte1>>6)&1)<<1)|(((byte2>>6)&1)<<2)|(((byte3>>6)&1)<<3); + wsTCache[t_index]=((byte0)&1)|(((byte1)&1)<<1)|(((byte2)&1)<<2)|(((byte3)&1)<<3); + wsTCacheFlipped[t_index++]=((byte0>>7)&1)|(((byte1>>7)&1)<<1)|(((byte2>>7)&1)<<2)|(((byte3>>7)&1)<<3); + } + break; + + default: + t_adr=0x2000+(number<<4); + t_index=number<<6; + for(i=0;i<8;i++) + { + byte0=wsRAM[t_adr++]; + byte1=wsRAM[t_adr++]; + wsTCache[t_index]=tiles[byte0][byte1][0][0]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][0]; + wsTCache[t_index]=tiles[byte0][byte1][0][1]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][1]; + wsTCache[t_index]=tiles[byte0][byte1][0][2]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][2]; + wsTCache[t_index]=tiles[byte0][byte1][0][3]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][3]; + wsTCache[t_index]=tiles[byte0][byte1][0][4]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][4]; + wsTCache[t_index]=tiles[byte0][byte1][0][5]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][5]; + wsTCache[t_index]=tiles[byte0][byte1][0][6]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][6]; + wsTCache[t_index]=tiles[byte0][byte1][0][7]; + wsTCacheFlipped[t_index++]=tiles[byte0][byte1][1][7]; + } + } + } + if(flipv) + line=7-line; + if(fliph) + memcpy(&wsTileRow[0],&wsTCacheFlipped[(number<<6)|(line<<3)],8); + else + memcpy(&wsTileRow[0],&wsTCache[(number<<6)|(line<<3)],8); + } + else + { + +#ifdef TCACHE_OFF + wsTCacheUpdate2[number]=FALSE; +#endif + + if(!wsTCacheUpdate2[number]) + { + wsTCacheUpdate2[number]=TRUE; + switch(wsVMode) + { + case 7: + t_adr=0x8000+(number<<5); + t_index=number<<6; + for(i=0;i<8;i++) + { + byte0=wsRAM[t_adr++]; + byte1=wsRAM[t_adr++]; + byte2=wsRAM[t_adr++]; + byte3=wsRAM[t_adr++]; + wsTCache2[t_index]=byte0>>4; + wsTCacheFlipped2[t_index++]=byte3&15; + wsTCache2[t_index]=byte0&15; + wsTCacheFlipped2[t_index++]=byte3>>4; + wsTCache2[t_index]=byte1>>4; + wsTCacheFlipped2[t_index++]=byte2&15; + wsTCache2[t_index]=byte1&15; + wsTCacheFlipped2[t_index++]=byte2>>4; + wsTCache2[t_index]=byte2>>4; + wsTCacheFlipped2[t_index++]=byte1&15; + wsTCache2[t_index]=byte2&15; + wsTCacheFlipped2[t_index++]=byte1>>4; + wsTCache2[t_index]=byte3>>4; + wsTCacheFlipped2[t_index++]=byte0&15; + wsTCache2[t_index]=byte3&15; + wsTCacheFlipped2[t_index++]=byte0>>4; + } + break; + case 6: + t_adr=0x8000+(number<<5); + t_index=number<<6; + for(i=0;i<8;i++) + { + byte0=wsRAM[t_adr++]; + byte1=wsRAM[t_adr++]; + byte2=wsRAM[t_adr++]; + byte3=wsRAM[t_adr++]; + wsTCache2[t_index]=((byte0>>7)&1)|(((byte1>>7)&1)<<1)|(((byte2>>7)&1)<<2)|(((byte3>>7)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0)&1)|(((byte1)&1)<<1)|(((byte2)&1)<<2)|(((byte3)&1)<<3); + wsTCache2[t_index]=((byte0>>6)&1)|(((byte1>>6)&1)<<1)|(((byte2>>6)&1)<<2)|(((byte3>>6)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>1)&1)|(((byte1>>1)&1)<<1)|(((byte2>>1)&1)<<2)|(((byte3>>1)&1)<<3); + wsTCache2[t_index]=((byte0>>5)&1)|(((byte1>>5)&1)<<1)|(((byte2>>5)&1)<<2)|(((byte3>>5)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>2)&1)|(((byte1>>2)&1)<<1)|(((byte2>>2)&1)<<2)|(((byte3>>2)&1)<<3); + wsTCache2[t_index]=((byte0>>4)&1)|(((byte1>>4)&1)<<1)|(((byte2>>4)&1)<<2)|(((byte3>>4)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>3)&1)|(((byte1>>3)&1)<<1)|(((byte2>>3)&1)<<2)|(((byte3>>3)&1)<<3); + wsTCache2[t_index]=((byte0>>3)&1)|(((byte1>>3)&1)<<1)|(((byte2>>3)&1)<<2)|(((byte3>>3)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>4)&1)|(((byte1>>4)&1)<<1)|(((byte2>>4)&1)<<2)|(((byte3>>4)&1)<<3); + wsTCache2[t_index]=((byte0>>2)&1)|(((byte1>>2)&1)<<1)|(((byte2>>2)&1)<<2)|(((byte3>>2)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>5)&1)|(((byte1>>5)&1)<<1)|(((byte2>>5)&1)<<2)|(((byte3>>5)&1)<<3); + wsTCache2[t_index]=((byte0>>1)&1)|(((byte1>>1)&1)<<1)|(((byte2>>1)&1)<<2)|(((byte3>>1)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>6)&1)|(((byte1>>6)&1)<<1)|(((byte2>>6)&1)<<2)|(((byte3>>6)&1)<<3); + wsTCache2[t_index]=((byte0)&1)|(((byte1)&1)<<1)|(((byte2)&1)<<2)|(((byte3)&1)<<3); + wsTCacheFlipped2[t_index++]=((byte0>>7)&1)|(((byte1>>7)&1)<<1)|(((byte2>>7)&1)<<2)|(((byte3>>7)&1)<<3); + } + break; + default: + t_adr=0x4000+(number<<4); + t_index=number<<6; + for(i=0;i<8;i++) + { + byte0=wsRAM[t_adr++]; + byte1=wsRAM[t_adr++]; + wsTCache2[t_index]=tiles[byte0][byte1][0][0]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][0]; + wsTCache2[t_index]=tiles[byte0][byte1][0][1]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][1]; + wsTCache2[t_index]=tiles[byte0][byte1][0][2]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][2]; + wsTCache2[t_index]=tiles[byte0][byte1][0][3]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][3]; + wsTCache2[t_index]=tiles[byte0][byte1][0][4]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][4]; + wsTCache2[t_index]=tiles[byte0][byte1][0][5]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][5]; + wsTCache2[t_index]=tiles[byte0][byte1][0][6]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][6]; + wsTCache2[t_index]=tiles[byte0][byte1][0][7]; + wsTCacheFlipped2[t_index++]=tiles[byte0][byte1][1][7]; + } + } + } + if(flipv) + line=7-line; + if(fliph) + memcpy(&wsTileRow[0],&wsTCacheFlipped2[(number<<6)|(line<<3)],8); + else + memcpy(&wsTileRow[0],&wsTCache2[(number<<6)|(line<<3)],8); + } +} + +} diff --git a/Mednafen/mednafen/wswan/v30mz-ea.inc b/Mednafen/mednafen/wswan/v30mz-ea.inc new file mode 100644 index 0000000000..c6b6a593d2 --- /dev/null +++ b/Mednafen/mednafen/wswan/v30mz-ea.inc @@ -0,0 +1,60 @@ + +static uint32 EA; +static uint16 EO; +static uint16 E16; + +static unsigned EA_000(void) { EO=I.regs.w[BW]+I.regs.w[IX]; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_001(void) { EO=I.regs.w[BW]+I.regs.w[IY]; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_002(void) { EO=I.regs.w[BP]+I.regs.w[IX]; EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_003(void) { EO=I.regs.w[BP]+I.regs.w[IY]; EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_004(void) { EO=I.regs.w[IX]; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_005(void) { EO=I.regs.w[IY]; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_006(void) { EO=FETCH; EO+=FETCH<<8; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_007(void) { EO=I.regs.w[BW]; EA=DefaultBase(DS0)+EO; return EA; } + +static unsigned EA_100(void) { EO=(I.regs.w[BW]+I.regs.w[IX]+(int8)FETCH); EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_101(void) { EO=(I.regs.w[BW]+I.regs.w[IY]+(int8)FETCH); EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_102(void) { EO=(I.regs.w[BP]+I.regs.w[IX]+(int8)FETCH); EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_103(void) { EO=(I.regs.w[BP]+I.regs.w[IY]+(int8)FETCH); EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_104(void) { EO=(I.regs.w[IX]+(int8)FETCH); EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_105(void) { EO=(I.regs.w[IY]+(int8)FETCH); EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_106(void) { EO=(I.regs.w[BP]+(int8)FETCH); EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_107(void) { EO=(I.regs.w[BW]+(int8)FETCH); EA=DefaultBase(DS0)+EO; return EA; } + +static unsigned EA_200(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[BW]+I.regs.w[IX]+(int16)E16; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_201(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[BW]+I.regs.w[IY]+(int16)E16; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_202(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[BP]+I.regs.w[IX]+(int16)E16; EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_203(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[BP]+I.regs.w[IY]+(int16)E16; EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_204(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[IX]+(int16)E16; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_205(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[IY]+(int16)E16; EA=DefaultBase(DS0)+EO; return EA; } +static unsigned EA_206(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[BP]+(int16)E16; EA=DefaultBase(SS)+EO; return EA; } +static unsigned EA_207(void) { E16=FETCH; E16+=FETCH<<8; EO=I.regs.w[BW]+(int16)E16; EA=DefaultBase(DS0)+EO; return EA; } + +static unsigned (*GetEA[192])(void)={ + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + EA_000, EA_001, EA_002, EA_003, EA_004, EA_005, EA_006, EA_007, + + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + EA_100, EA_101, EA_102, EA_103, EA_104, EA_105, EA_106, EA_107, + + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207, + EA_200, EA_201, EA_202, EA_203, EA_204, EA_205, EA_206, EA_207 +}; diff --git a/Mednafen/mednafen/wswan/v30mz-modrm.inc b/Mednafen/mednafen/wswan/v30mz-modrm.inc new file mode 100644 index 0000000000..9da81d9f70 --- /dev/null +++ b/Mednafen/mednafen/wswan/v30mz-modrm.inc @@ -0,0 +1,104 @@ +static struct { + struct { + WREGS w[256]; + BREGS b[256]; + } reg; + struct { + WREGS w[256]; + BREGS b[256]; + } RM; +} Mod_RM; + +#define RegWord(ModRM) I.regs.w[Mod_RM.reg.w[ModRM]] +#define RegByte(ModRM) I.regs.b[Mod_RM.reg.b[ModRM]] + +#define GetRMWord(ModRM) \ + ((ModRM) >= 0xc0 ? I.regs.w[Mod_RM.RM.w[ModRM]] : ( (*GetEA[ModRM])(), ReadWord( EA ) )) + +#define PutbackRMWord(ModRM,val) \ +{ \ + if (ModRM >= 0xc0) I.regs.w[Mod_RM.RM.w[ModRM]]=val; \ + else WriteWord(EA,val); \ +} + +#define GetnextRMWord ReadWord((EA&0xf0000)|((EA+2)&0xffff)) + +#define PutRMWord(ModRM,val) \ +{ \ + if (ModRM >= 0xc0) \ + I.regs.w[Mod_RM.RM.w[ModRM]]=val; \ + else { \ + (*GetEA[ModRM])(); \ + WriteWord( EA ,val); \ + } \ +} + +#define PutImmRMWord(ModRM) \ +{ \ + uint16 val; \ + if (ModRM >= 0xc0) \ + FETCHuint16(I.regs.w[Mod_RM.RM.w[ModRM]]) \ + else { \ + (*GetEA[ModRM])(); \ + FETCHuint16(val) \ + WriteWord( EA , val); \ + } \ +} + +#define GetRMByte(ModRM) \ + ((ModRM) >= 0xc0 ? I.regs.b[Mod_RM.RM.b[ModRM]] : ReadByte( (*GetEA[ModRM])() )) + +#define PutRMByte(ModRM,val) \ +{ \ + if (ModRM >= 0xc0) \ + I.regs.b[Mod_RM.RM.b[ModRM]]=val; \ + else \ + WriteByte( (*GetEA[ModRM])() ,val); \ +} + +#define PutImmRMByte(ModRM) \ +{ \ + if (ModRM >= 0xc0) \ + I.regs.b[Mod_RM.RM.b[ModRM]]=FETCH; \ + else { \ + (*GetEA[ModRM])(); \ + WriteByte( EA , FETCH ); \ + } \ +} + +#define PutbackRMByte(ModRM,val) \ +{ \ + if (ModRM >= 0xc0) \ + I.regs.b[Mod_RM.RM.b[ModRM]]=val; \ + else \ + WriteByte(EA,val); \ +} + +#define DEF_br8 \ + uint32 ModRM = FETCH,src,dst; \ + src = RegByte(ModRM); \ + dst = GetRMByte(ModRM) + +#define DEF_wr16 \ + uint32 ModRM = FETCH,src,dst; \ + src = RegWord(ModRM); \ + dst = GetRMWord(ModRM) + +#define DEF_r8b \ + uint32 ModRM = FETCH,src,dst; \ + dst = RegByte(ModRM); \ + src = GetRMByte(ModRM) + +#define DEF_r16w \ + uint32 ModRM = FETCH,src,dst; \ + dst = RegWord(ModRM); \ + src = GetRMWord(ModRM) + +#define DEF_ald8 \ + uint32 src = FETCH; \ + uint32 dst = I.regs.b[AL] + +#define DEF_axd16 \ + uint32 src = FETCH; \ + uint32 dst = I.regs.w[AW]; \ + src += (FETCH << 8) diff --git a/Mednafen/mednafen/wswan/v30mz-private.h b/Mednafen/mednafen/wswan/v30mz-private.h new file mode 100644 index 0000000000..3d1c6187af --- /dev/null +++ b/Mednafen/mednafen/wswan/v30mz-private.h @@ -0,0 +1,252 @@ +typedef enum { DS1, PS, SS, DS0 } SREGS; +typedef enum { AW, CW, DW, BW, SP, BP, IX, IY } WREGS; + +#define NEC_NMI_INT_VECTOR 2 + +#ifdef LSB_FIRST +typedef enum { AL,AH,CL,CH,DL,DH,BL,BH,SPL,SPH,BPL,BPH,IXL,IXH,IYL,IYH } BREGS; +#else +typedef enum { AH,AL,CH,CL,DH,DL,BH,BL,SPH,SPL,BPH,BPL,IXH,IXL,IYH,IYL } BREGS; +#endif + +/* parameter x = result, y = source 1, z = source 2 */ + +#define SetTF(x) (I.TF = (x)) +#define SetIF(x) (I.IF = (x)) +#define SetDF(x) (I.DF = (x)) + +#define SetCFB(x) (I.CarryVal = (x) & 0x100) +#define SetCFW(x) (I.CarryVal = (x) & 0x10000) + +#define SetAF(x,y,z) (I.AuxVal = ((x) ^ ((y) ^ (z))) & 0x10) + + + + +#define SetSF(x) (I.SignVal = (x)) +#define SetZF(x) (I.ZeroVal = (x)) +#define SetPF(x) (I.ParityVal = (x)) + +#define SetSZPF_Byte(x) (I.SignVal=I.ZeroVal=I.ParityVal=(int8)(x)) +#define SetSZPF_Word(x) (I.SignVal=I.ZeroVal=I.ParityVal=(int16)(x)) + +#define SetOFW_Add(x,y,z) (I.OverVal = ((x) ^ (y)) & ((x) ^ (z)) & 0x8000) +#define SetOFB_Add(x,y,z) (I.OverVal = ((x) ^ (y)) & ((x) ^ (z)) & 0x80) +#define SetOFW_Sub(x,y,z) (I.OverVal = ((z) ^ (y)) & ((z) ^ (x)) & 0x8000) +#define SetOFB_Sub(x,y,z) (I.OverVal = ((z) ^ (y)) & ((z) ^ (x)) & 0x80) + +#define ADDB { uint32 res=dst+src; SetCFB(res); SetOFB_Add(res,src,dst); SetAF(res,src,dst); SetSZPF_Byte(res); dst=(uint8)res; } +#define ADDW { uint32 res=dst+src; SetCFW(res); SetOFW_Add(res,src,dst); SetAF(res,src,dst); SetSZPF_Word(res); dst=(uint16)res; } + +#define SUBB { uint32 res=dst-src; SetCFB(res); SetOFB_Sub(res,src,dst); SetAF(res,src,dst); SetSZPF_Byte(res); dst=(uint8)res; } +#define SUBW { uint32 res=dst-src; SetCFW(res); SetOFW_Sub(res,src,dst); SetAF(res,src,dst); SetSZPF_Word(res); dst=(uint16)res; } + +#define ORB dst|=src; I.CarryVal=I.OverVal=I.AuxVal=0; SetSZPF_Byte(dst) +#define ORW dst|=src; I.CarryVal=I.OverVal=I.AuxVal=0; SetSZPF_Word(dst) + +#define ANDB dst&=src; I.CarryVal=I.OverVal=I.AuxVal=0; SetSZPF_Byte(dst) +#define ANDW dst&=src; I.CarryVal=I.OverVal=I.AuxVal=0; SetSZPF_Word(dst) + +#define XORB dst^=src; I.CarryVal=I.OverVal=I.AuxVal=0; SetSZPF_Byte(dst) +#define XORW dst^=src; I.CarryVal=I.OverVal=I.AuxVal=0; SetSZPF_Word(dst) + +#define CF (I.CarryVal!=0) +#define SF (I.SignVal<0) +#define ZF (I.ZeroVal==0) +#define PF parity_table[(uint8)I.ParityVal] +#define AF (I.AuxVal!=0) +#define FLAG_O (I.OverVal!=0) + +/************************************************************************/ + +#define SegBase(Seg) (I.sregs[Seg] << 4) + +#define DefaultBase(Seg) ((seg_prefix && (Seg==DS0 || Seg==SS)) ? prefix_base : I.sregs[Seg] << 4) + +#define GetMemB(Seg,Off) ((uint8)PhysRead8((DefaultBase(Seg)+(Off)))) +#define GetMemW(Seg,Off) ((uint16)PhysRead16((DefaultBase(Seg)+(Off)))) + +#define PutMemB(Seg,Off,x) { cpu_writemem20((DefaultBase(Seg)+(Off)),(x)); } +#define PutMemW(Seg,Off,x) { PutMemB(Seg,Off,(x)&0xff); PutMemB(Seg,(Off)+1,(uint8)((x)>>8)); } + +/* Todo: Remove these later - plus readword could overflow */ +#define ReadByte(ea) ((uint8)PhysRead8((ea))) +#define ReadWord(ea) (PhysRead16((ea))) +#define WriteByte(ea,val) { cpu_writemem20((ea),val); } +#define WriteWord(ea,val) { cpu_writemem20((ea),(uint8)(val)); cpu_writemem20(((ea)+1),(val)>>8); } + +#define read_port(port) cpu_readport(port) +#define write_port(port,val) cpu_writeport(port,val) + +#define FETCH (PhysRead8((I.sregs[PS]<<4)+I.pc++)) +#define FETCHOP (PhysRead8((I.sregs[PS]<<4)+I.pc++)) +#define FETCHuint16(var) { var=PhysRead16((((I.sregs[PS]<<4)+I.pc))); I.pc+=2; } +#define PUSH(val) { I.regs.w[SP]-=2; WriteWord((((I.sregs[SS]<<4)+I.regs.w[SP])),val); } +#define POP(var) { var = ReadWord((((I.sregs[SS]<<4)+I.regs.w[SP]))); I.regs.w[SP]+=2; } +#define PEEK(addr) ((uint8)PhysRead8(addr)) +#define PEEKOP(addr) ((uint8)PhysRead8(addr)) + +#define GetModRM uint32 ModRM=PhysRead8((I.sregs[PS]<<4)+I.pc++) + +/* Cycle count macros: + CLK - cycle count is the same on all processors + CLKM - cycle count for reg/mem instructions + + + Prefetch & buswait time is not emulated. + Extra cycles for PUSH'ing or POP'ing registers to odd addresses is not emulated. +*/ + +#define _REAL_CLK(cycles) { v30mz_ICount -= cycles; v30mz_timestamp += cycles; } +#define CLK _REAL_CLK +//#define CLK(cycles) { _REAL_CLK(cycles); if(ws_CheckDMA(cycles)) _REAL_CLK(1); } + +#define CLKM(mcount, ccount) { if(ModRM >=0xc0 ) { CLK(ccount);} else {CLK(mcount);} } + + +#define CompressFlags() (uint16)(CF | (PF << 2) | (AF << 4) | (ZF << 6) \ + | (SF << 7) | (I.TF << 8) | (I.IF << 9) \ + | (I.DF << 10) | (FLAG_O << 11) | (0xF002)) + + +#define ExpandFlags(f) \ +{ \ + I.CarryVal = (f) & 1; \ + I.ParityVal = !((f) & 4); \ + I.AuxVal = (f) & 16; \ + I.ZeroVal = !((f) & 64); \ + I.SignVal = (f) & 128 ? -1 : 0; \ + I.TF = ((f) & 256) == 256; \ + I.IF = ((f) & 512) == 512; \ + I.DF = ((f) & 1024) == 1024; \ + I.OverVal = (f) & 2048; \ +} + + + +#define IncWordReg(Reg) \ + unsigned tmp = (unsigned)I.regs.w[Reg]; \ + unsigned tmp1 = tmp+1; \ + I.OverVal = (tmp == 0x7fff); \ + SetAF(tmp1,tmp,1); \ + SetSZPF_Word(tmp1); \ + I.regs.w[Reg]=tmp1 + + + +#define DecWordReg(Reg) \ + unsigned tmp = (unsigned)I.regs.w[Reg]; \ + unsigned tmp1 = tmp-1; \ + I.OverVal = (tmp == 0x8000); \ + SetAF(tmp1,tmp,1); \ + SetSZPF_Word(tmp1); \ + I.regs.w[Reg]=tmp1 + +#define JMP(flag) \ + int tmp = (int)((int8)FETCH); \ + if (flag) \ + { \ + I.pc = (uint16)(I.pc+tmp); \ + CLK(3); \ + ADDBRANCHTRACE(I.sregs[PS], I.pc); \ + return; \ + } + +#define ADJ4(param1,param2) \ + if (AF || ((I.regs.b[AL] & 0xf) > 9)) \ + { \ + uint16 tmp; \ + tmp = I.regs.b[AL] + param1; \ + I.regs.b[AL] = tmp; \ + I.AuxVal = 1; \ + I.CarryVal |= tmp & 0x100; /*if(tmp&0x100){puts("Meow"); }*//* Correct? */ \ + } \ + if (CF || (I.regs.b[AL] > 0x9f)) \ + { \ + I.regs.b[AL] += param2; \ + I.CarryVal = 1; \ + } \ + SetSZPF_Byte(I.regs.b[AL]) + +#define ADJB(param1,param2) \ + if (AF || ((I.regs.b[AL] & 0xf) > 9)) \ + { \ + I.regs.b[AL] += param1; \ + I.regs.b[AH] += param2; \ + I.AuxVal = 1; \ + I.CarryVal = 1; \ + } \ + else \ + { \ + I.AuxVal = 0; \ + I.CarryVal = 0; \ + } \ + I.regs.b[AL] &= 0x0F + +#define BIT_NOT \ + if (tmp & (1<> 1)+(CF<<7) +#define ROR_uint16 I.CarryVal = dst & 0x1; dst = (dst >> 1)+(CF<<15) +#define ROLC_uint8 dst = (dst << 1) + CF; SetCFB(dst) +#define ROLC_uint16 dst = (dst << 1) + CF; SetCFW(dst) +#define RORC_uint8 dst = (CF<<8)+dst; I.CarryVal = dst & 0x01; dst >>= 1 +#define RORC_uint16 dst = (CF<<16)+dst; I.CarryVal = dst & 0x01; dst >>= 1 +#define SHL_uint8(c) dst <<= c; SetCFB(dst); SetSZPF_Byte(dst); PutbackRMByte(ModRM,(uint8)dst) +#define SHL_uint16(c) dst <<= c; SetCFW(dst); SetSZPF_Word(dst); PutbackRMWord(ModRM,(uint16)dst) +#define SHR_uint8(c) dst >>= c-1; I.CarryVal = dst & 0x1; dst >>= 1; SetSZPF_Byte(dst); PutbackRMByte(ModRM,(uint8)dst) +#define SHR_uint16(c) dst >>= c-1; I.CarryVal = dst & 0x1; dst >>= 1; SetSZPF_Word(dst); PutbackRMWord(ModRM,(uint16)dst) +#define SHRA_uint8(c) dst = ((int8)dst) >> (c-1); I.CarryVal = dst & 0x1; dst = ((int8)((uint8)dst)) >> 1; SetSZPF_Byte(dst); PutbackRMByte(ModRM,(uint8)dst) +#define SHRA_uint16(c) dst = ((int16)dst) >> (c-1); I.CarryVal = dst & 0x1; dst = ((int16)((uint16)dst)) >> 1; SetSZPF_Word(dst); PutbackRMWord(ModRM,(uint16)dst) + +#define DIVUB \ + uresult = I.regs.w[AW]; \ + uresult2 = uresult % tmp; \ + if ((uresult /= tmp) > 0xff) { \ + nec_interrupt(0); break; \ + } else { \ + I.regs.b[AL] = uresult; \ + I.regs.b[AH] = uresult2; \ + } + +#define DIVB \ + result = (int16)I.regs.w[AW]; \ + result2 = result % (int16)((int8)tmp); \ + if ((result /= (int16)((int8)tmp)) > 0xff) { \ + nec_interrupt(0); break; \ + } else { \ + I.regs.b[AL] = result; \ + I.regs.b[AH] = result2; \ + } + +#define DIVUW \ + uresult = (((uint32)I.regs.w[DW]) << 16) | I.regs.w[AW];\ + uresult2 = uresult % tmp; \ + if ((uresult /= tmp) > 0xffff) { \ + nec_interrupt(0); break; \ + } else { \ + I.regs.w[AW]=uresult; \ + I.regs.w[DW]=uresult2; \ + } + +#define DIVW \ + result = ((uint32)I.regs.w[DW] << 16) + I.regs.w[AW]; \ + result2 = result % (int32)((int16)tmp); \ + if ((result /= (int32)((int16)tmp)) > 0xffff) { \ + nec_interrupt(0); break; \ + } else { \ + I.regs.w[AW]=result; \ + I.regs.w[DW]=result2; \ + } + diff --git a/Mednafen/mednafen/wswan/v30mz.cpp b/Mednafen/mednafen/wswan/v30mz.cpp new file mode 100644 index 0000000000..13efda34c7 --- /dev/null +++ b/Mednafen/mednafen/wswan/v30mz.cpp @@ -0,0 +1,1165 @@ +/**************************************************************************** + + NEC V30MZ emulator + + Stripped out non-V30MZ clock counts and code. + + Small changes made by dox@space.pl (Corrected bug in NEG instruction , different AUX flag handling in some opcodes) + + (Re)Written June-September 2000 by Bryan McPhail (mish@tendril.co.uk) based + on code by Oliver Bergmann (Raul_Bloodworth@hotmail.com) who based code + on the i286 emulator by Fabrice Frances which had initial work based on + David Hedley's pcemu(!). + +****************************************************************************/ + +/* This NEC V30MZ emulator may be used for purposes both commercial and noncommercial if you give the author, Bryan McPhail, + a small credit somewhere(such as in the documentation for an executable package). +*/ + +/* + TODO: + Implement bus lock fully(prevent interrupts from occuring during a REP sequence, I think...), taking into account + HLT emulation to prevent deadlocks! + + Implement better prefix emulation. It's extremely kludgey right now. + + Implement prefetch/pipeline emulation. +*/ + +#include "wswan.h" +#include "memory.h" + +#include + +#include "v30mz.h" +#include "v30mz-private.h" +#include "debug.h" + +namespace MDFN_IEN_WSWAN +{ + +static uint16 old_CS, old_IP; + +#ifdef WANT_DEBUGGER + #define ADDBRANCHTRACE(x,y) { if(branch_trace_hook) branch_trace_hook(old_CS, old_IP, x, y, false); } + #define ADDBRANCHTRACE_INT(x,y) { if(branch_trace_hook) branch_trace_hook(old_CS, old_IP, x,y, true); } + #define SETOLDCSIP() { old_CS = I.sregs[PS]; old_IP = I.pc; } +#else + #define ADDBRANCHTRACE(x,y) { } + #define ADDBRANCHTRACE_INT(x,y) { } + #define SETOLDCSIP() { } +#endif + +typedef union +{ /* eight general registers */ + uint16 w[8]; /* viewed as 16 bits registers */ + uint8 b[16]; /* or as 8 bit registers */ +} v30mz_basicregs_t; + +typedef struct +{ + v30mz_basicregs_t regs; + uint16 sregs[4]; + + uint16 pc; + + int32 SignVal; + uint32 AuxVal, OverVal, ZeroVal, CarryVal, ParityVal; /* 0 or non-0 valued flags */ + uint8 TF, IF, DF; +} v30mz_regs_t; + +static void (*cpu_writemem20)(uint32,uint8) = NULL; +static uint8 (*cpu_readport)(uint32) = NULL; +static void (*cpu_writeport)(uint32, uint8) = NULL; +static uint8 (*cpu_readmem20)(uint32) = NULL; + +static INLINE uint8 PhysRead8(uint32 addr) +{ + return cpu_readmem20(addr); +} + +static INLINE uint16 PhysRead16(uint32 addr) +{ + uint16 ret; + + ret = cpu_readmem20(addr); + ret |= cpu_readmem20(addr + 1) << 8; + + return ret; +} + +/***************************************************************************/ +/* cpu state */ +/***************************************************************************/ + +uint32 v30mz_timestamp; +int32 v30mz_ICount; + +static v30mz_regs_t I; +static bool InHLT; + +static uint32 prefix_base; /* base address of the latest prefix segment */ +static char seg_prefix; /* prefix segment indicator */ + +#ifdef WANT_DEBUGGER +static void (*cpu_hook)(uint32) = NULL; +static uint8 (*read_hook)(uint32) = NULL; +static void (*write_hook)(uint32, uint8) = NULL; +static uint8 (*port_read_hook)(uint32) = NULL; +static void (*port_write_hook)(uint32, uint8) = NULL; +static bool hookie_hickey = 0; +static void (*branch_trace_hook)(uint16 from_CS, uint16 from_IP, uint16 to_CS, uint16 to_IP, bool interrupt) = NULL; +#endif + +#include "v30mz-ea.inc" +#include "v30mz-modrm.inc" + +static uint8 parity_table[256]; + +static INLINE void i_real_pushf(void) +{ + PUSH( CompressFlags() ); + CLK(2); +} + +static INLINE void i_real_popf(void) +{ + uint32 tmp; + POP(tmp); + ExpandFlags(tmp); + CLK(3); +} + +/***************************************************************************/ + +void v30mz_init(uint8 (*readmem20)(uint32), void (*writemem20)(uint32,uint8), uint8 (*readport)(uint32), void (*writeport)(uint32, uint8)) +{ + cpu_readmem20 = readmem20; + cpu_writemem20 = writemem20; + + cpu_readport = readport; + cpu_writeport = writeport; +} + +void v30mz_reset(void) +{ + const BREGS reg_name[8] = { AL, CL, DL, BL, AH, CH, DH, BH }; + + v30mz_ICount = 0; + v30mz_timestamp = 0; + + memset(&I, 0, sizeof(I)); + + I.sregs[PS] = 0xffff; + + + for(unsigned int i = 0; i < 256; i++) + { + unsigned int c = 0; + + for (unsigned int j = i; j > 0; j >>= 1) + if (j & 1) c++; + + parity_table[i] = !(c & 1); + } + + I.ZeroVal = I.ParityVal = 1; + + for(unsigned int i = 0; i < 256; i++) + { + Mod_RM.reg.b[i] = reg_name[(i & 0x38) >> 3]; + Mod_RM.reg.w[i] = (WREGS) ( (i & 0x38) >> 3) ; + } + + for(unsigned int i = 0xc0; i < 0x100; i++) + { + Mod_RM.RM.w[i] = (WREGS)( i & 7 ); + Mod_RM.RM.b[i] = (BREGS)reg_name[i & 7]; + } + + prefix_base = 0; + seg_prefix = 0; + InHLT = 0; +} + +void v30mz_int(uint32 vector, bool IgnoreIF) +{ + InHLT = FALSE; // This is correct! Standby mode is always exited when there is an INT signal, regardless of whether interrupt are disabled. + if(I.IF || IgnoreIF) + { + uint32 dest_seg, dest_off; + + PUSH( CompressFlags() ); + I.TF = I.IF = 0; + dest_off = ReadWord(vector); + dest_seg = ReadWord(vector+2); + PUSH(I.sregs[PS]); + PUSH(I.pc); + I.pc = (uint16)dest_off; + I.sregs[PS] = (uint16)dest_seg; + ADDBRANCHTRACE_INT(I.sregs[PS], I.pc); + CLK(32); + } +} + +static void nec_interrupt(unsigned int_num) +{ + uint32 dest_seg, dest_off; + + if ((int)int_num == -1) + return; + + i_real_pushf(); + I.TF = I.IF = 0; + + + dest_off = ReadWord((int_num)*4); + dest_seg = ReadWord((int_num)*4+2); + + PUSH(I.sregs[PS]); + PUSH(I.pc); + I.pc = (uint16)dest_off; + I.sregs[PS] = (uint16)dest_seg; + ADDBRANCHTRACE(I.sregs[PS], I.pc); +} + +static bool CheckInHLT(void) +{ + if(InHLT) + { + WSwan_InterruptCheck(); + if(InHLT) + { + int32 tmp = v30mz_ICount; + + if(tmp > 0) + CLK(tmp); + return(1); + } + } + return(0); +} + + +/****************************************************************************/ +/* OPCODES */ +/****************************************************************************/ + +static INLINE void i_real_insb(void) +{ + PutMemB(DS1,I.regs.w[IY], read_port(I.regs.w[DW])); + I.regs.w[IY]+= -2 * I.DF + 1; + CLK(6); +} + +static INLINE void i_real_insw(void) +{ + PutMemB(DS1,I.regs.w[IY],read_port(I.regs.w[DW])); + PutMemB(DS1,(I.regs.w[IY]+1)&0xffff,read_port((I.regs.w[DW]+1)&0xffff)); + I.regs.w[IY]+= -4 * I.DF + 2; + CLK(6); +} + +static INLINE void i_real_outsb(void) +{ + write_port(I.regs.w[DW],GetMemB(DS0,I.regs.w[IX])); + I.regs.w[IX]+= -2 * I.DF + 1; + CLK(7); +} + +static INLINE void i_real_outsw(void) +{ + write_port(I.regs.w[DW],GetMemB(DS0,I.regs.w[IX])); + write_port((I.regs.w[DW]+1)&0xffff,GetMemB(DS0,(I.regs.w[IX]+1)&0xffff)); + I.regs.w[IX]+= -4 * I.DF + 2; + CLK(7); +} + +static INLINE void i_real_movsb(void) +{ + uint32 tmp = GetMemB(DS0,I.regs.w[IX]); + PutMemB(DS1,I.regs.w[IY], tmp); + I.regs.w[IY] += -2 * I.DF + 1; + I.regs.w[IX] += -2 * I.DF + 1; + CLK(5); +} + +static INLINE void i_real_movsw(void) +{ + uint32 tmp = GetMemW(DS0,I.regs.w[IX]); PutMemW(DS1,I.regs.w[IY], tmp); I.regs.w[IY] += -4 * I.DF + 2; +I.regs.w[IX] += -4 * I.DF + 2; CLK(5); +} + +static INLINE void i_real_cmpsb(void) +{ + uint32 src = GetMemB(DS1, I.regs.w[IY]); uint32 dst = GetMemB(DS0, I.regs.w[IX]); SUBB; I.regs.w[IY] += -2 * I.DF + 1; +I.regs.w[IX] += -2 * I.DF + 1; CLK(6); +} + +static INLINE void i_real_cmpsw(void) +{ + uint32 src = GetMemW(DS1, I.regs.w[IY]); uint32 dst = GetMemW(DS0, I.regs.w[IX]); SUBW; I.regs.w[IY] += -4 * I.DF + 2; +I.regs.w[IX] += -4 * I.DF + 2; CLK(6); +} + +static INLINE void i_real_stosb(void) +{ + PutMemB(DS1,I.regs.w[IY],I.regs.b[AL]); I.regs.w[IY] += -2 * I.DF + 1; CLK(3); +} + +static INLINE void i_real_stosw(void) +{ + PutMemW(DS1,I.regs.w[IY],I.regs.w[AW]); I.regs.w[IY] += -4 * I.DF + 2; CLK(3); +} + +static INLINE void i_real_lodsb(void) +{ + I.regs.b[AL] = GetMemB(DS0,I.regs.w[IX]); I.regs.w[IX] += -2 * I.DF + 1; CLK(3); +} + +static INLINE void i_real_lodsw(void) +{ + I.regs.w[AW] = GetMemW(DS0,I.regs.w[IX]); I.regs.w[IX] += -4 * I.DF + 2; CLK(3); +} + +static INLINE void i_real_scasb(void) +{ + uint32 src = GetMemB(DS1, I.regs.w[IY]); uint32 dst = I.regs.b[AL]; SUBB; + I.regs.w[IY] += -2 * I.DF + 1; CLK(4); +} + +static INLINE void i_real_scasw(void) +{ + uint32 src = GetMemW(DS1, I.regs.w[IY]); uint32 dst = I.regs.w[AW]; SUBW; + I.regs.w[IY] += -4 * I.DF + 2; CLK(4); +} + +static void DoOP(uint8 opcode) +{ + //#define OP(num,func_name) static void func_name(void) + #define OP(num, func_name) case num: + #define OP8(base, func_name) case (base): case (base)+1: case (base)+2: case (base)+3: case (base)+4: case (base)+5: case (base)+6: case (base)+7: + #define OP_EPILOGUE break + +switch(opcode) +{ +default: + printf("Invalid op: %02x\n", opcode); + CLK(10); + break; + +OP( 0x00, i_add_br8 ) { DEF_br8; ADDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x01, i_add_wr16 ) { DEF_wr16; ADDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x02, i_add_r8b ) { DEF_r8b; ADDB; RegByte(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x03, i_add_r16w ) { DEF_r16w; ADDW; RegWord(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x04, i_add_ald8 ) { DEF_ald8; ADDB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x05, i_add_axd16) { DEF_axd16; ADDW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x06, i_push_ds1 ) { PUSH(I.sregs[DS1]); CLK(2); } OP_EPILOGUE; +OP( 0x07, i_pop_ds1 ) { POP(I.sregs[DS1]); CLK(3); } OP_EPILOGUE; + +OP( 0x08, i_or_br8 ) { DEF_br8; ORB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x09, i_or_wr16 ) { DEF_wr16; ORW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x0a, i_or_r8b ) { DEF_r8b; ORB; RegByte(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x0b, i_or_r16w ) { DEF_r16w; ORW; RegWord(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x0c, i_or_ald8 ) { DEF_ald8; ORB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x0d, i_or_axd16 ) { DEF_axd16; ORW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x0e, i_push_cs ) { PUSH(I.sregs[PS]); CLK(2); } OP_EPILOGUE; + +OP( 0x10, i_adc_br8 ) { DEF_br8; src+=CF; ADDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x11, i_adc_wr16 ) { DEF_wr16; src+=CF; ADDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x12, i_adc_r8b ) { DEF_r8b; src+=CF; ADDB; RegByte(ModRM)=dst; CLKM(2, 1); } OP_EPILOGUE; +OP( 0x13, i_adc_r16w ) { DEF_r16w; src+=CF; ADDW; RegWord(ModRM)=dst; CLKM(2, 1); } OP_EPILOGUE; +OP( 0x14, i_adc_ald8 ) { DEF_ald8; src+=CF; ADDB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x15, i_adc_axd16) { DEF_axd16; src+=CF; ADDW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x16, i_push_ss ) { PUSH(I.sregs[SS]); CLK(2); } OP_EPILOGUE; +OP( 0x17, i_pop_ss ) { POP(I.sregs[SS]); CLK(3); } OP_EPILOGUE; + +OP( 0x18, i_sbb_br8 ) { DEF_br8; src+=CF; SUBB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x19, i_sbb_wr16 ) { DEF_wr16; src+=CF; SUBW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x1a, i_sbb_r8b ) { DEF_r8b; src+=CF; SUBB; RegByte(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x1b, i_sbb_r16w ) { DEF_r16w; src+=CF; SUBW; RegWord(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x1c, i_sbb_ald8 ) { DEF_ald8; src+=CF; SUBB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x1d, i_sbb_axd16) { DEF_axd16; src+=CF; SUBW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x1e, i_push_ds ) { PUSH(I.sregs[DS0]); CLK(2); } OP_EPILOGUE; +OP( 0x1f, i_pop_ds ) { POP(I.sregs[DS0]); CLK(3); } OP_EPILOGUE; + +OP( 0x20, i_and_br8 ) { DEF_br8; ANDB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x21, i_and_wr16 ) { DEF_wr16; ANDW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x22, i_and_r8b ) { DEF_r8b; ANDB; RegByte(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x23, i_and_r16w ) { DEF_r16w; ANDW; RegWord(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x24, i_and_ald8 ) { DEF_ald8; ANDB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x25, i_and_axd16) { DEF_axd16; ANDW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x26, i_ds1 ) { seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; CLK(1); DoOP(FETCHOP); seg_prefix=FALSE; } OP_EPILOGUE; +OP( 0x27, i_daa ) { ADJ4(6,0x60); CLK(10); } OP_EPILOGUE; + +OP( 0x28, i_sub_br8 ) { DEF_br8; SUBB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x29, i_sub_wr16 ) { DEF_wr16; SUBW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x2a, i_sub_r8b ) { DEF_r8b; SUBB; RegByte(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x2b, i_sub_r16w ) { DEF_r16w; SUBW; RegWord(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x2c, i_sub_ald8 ) { DEF_ald8; SUBB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x2d, i_sub_axd16) { DEF_axd16; SUBW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x2e, i_ps ) { seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; CLK(1); DoOP(FETCHOP); seg_prefix=FALSE; } OP_EPILOGUE; +OP( 0x2f, i_das ) { ADJ4(-6,-0x60); CLK(10); } OP_EPILOGUE; + +OP( 0x30, i_xor_br8 ) { DEF_br8; XORB; PutbackRMByte(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x31, i_xor_wr16 ) { DEF_wr16; XORW; PutbackRMWord(ModRM,dst); CLKM(3,1); } OP_EPILOGUE; +OP( 0x32, i_xor_r8b ) { DEF_r8b; XORB; RegByte(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x33, i_xor_r16w ) { DEF_r16w; XORW; RegWord(ModRM)=dst; CLKM(2,1); } OP_EPILOGUE; +OP( 0x34, i_xor_ald8 ) { DEF_ald8; XORB; I.regs.b[AL]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x35, i_xor_axd16) { DEF_axd16; XORW; I.regs.w[AW]=dst; CLK(1); } OP_EPILOGUE; +OP( 0x36, i_ss ) { seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; CLK(1); DoOP(FETCHOP); seg_prefix=FALSE; } OP_EPILOGUE; +OP( 0x37, i_aaa ) { ADJB(6,1); CLK(9); } OP_EPILOGUE; + +OP( 0x38, i_cmp_br8 ) { DEF_br8; SUBB; CLKM(2,1); } OP_EPILOGUE; +OP( 0x39, i_cmp_wr16 ) { DEF_wr16; SUBW; CLKM(2,1); } OP_EPILOGUE; +OP( 0x3a, i_cmp_r8b ) { DEF_r8b; SUBB; CLKM(2,1); } OP_EPILOGUE; +OP( 0x3b, i_cmp_r16w ) { DEF_r16w; SUBW; CLKM(2,1); } OP_EPILOGUE; +OP( 0x3c, i_cmp_ald8 ) { DEF_ald8; SUBB; CLK(1); } OP_EPILOGUE; +OP( 0x3d, i_cmp_axd16) { DEF_axd16; SUBW; CLK(1); } OP_EPILOGUE; +OP( 0x3e, i_ds0 ) { seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; CLK(1); DoOP(FETCHOP); seg_prefix=FALSE; } OP_EPILOGUE; +OP( 0x3f, i_aas ) { ADJB(-6,-1); CLK(9); } OP_EPILOGUE; + +OP( 0x40, i_inc_ax ) { IncWordReg(AW); CLK(1); } OP_EPILOGUE; +OP( 0x41, i_inc_cx ) { IncWordReg(CW); CLK(1); } OP_EPILOGUE; +OP( 0x42, i_inc_dx ) { IncWordReg(DW); CLK(1); } OP_EPILOGUE; +OP( 0x43, i_inc_bx ) { IncWordReg(BW); CLK(1); } OP_EPILOGUE; +OP( 0x44, i_inc_sp ) { IncWordReg(SP); CLK(1); } OP_EPILOGUE; +OP( 0x45, i_inc_bp ) { IncWordReg(BP); CLK(1); } OP_EPILOGUE; +OP( 0x46, i_inc_si ) { IncWordReg(IX); CLK(1); } OP_EPILOGUE; +OP( 0x47, i_inc_di ) { IncWordReg(IY); CLK(1); } OP_EPILOGUE; + +OP( 0x48, i_dec_ax ) { DecWordReg(AW); CLK(1); } OP_EPILOGUE; +OP( 0x49, i_dec_cx ) { DecWordReg(CW); CLK(1); } OP_EPILOGUE; +OP( 0x4a, i_dec_dx ) { DecWordReg(DW); CLK(1); } OP_EPILOGUE; +OP( 0x4b, i_dec_bx ) { DecWordReg(BW); CLK(1); } OP_EPILOGUE; +OP( 0x4c, i_dec_sp ) { DecWordReg(SP); CLK(1); } OP_EPILOGUE; +OP( 0x4d, i_dec_bp ) { DecWordReg(BP); CLK(1); } OP_EPILOGUE; +OP( 0x4e, i_dec_si ) { DecWordReg(IX); CLK(1); } OP_EPILOGUE; +OP( 0x4f, i_dec_di ) { DecWordReg(IY); CLK(1); } OP_EPILOGUE; + +OP( 0x50, i_push_ax ) { PUSH(I.regs.w[AW]); CLK(1); } OP_EPILOGUE; +OP( 0x51, i_push_cx ) { PUSH(I.regs.w[CW]); CLK(1); } OP_EPILOGUE; +OP( 0x52, i_push_dx ) { PUSH(I.regs.w[DW]); CLK(1); } OP_EPILOGUE; +OP( 0x53, i_push_bx ) { PUSH(I.regs.w[BW]); CLK(1); } OP_EPILOGUE; +OP( 0x54, i_push_sp ) { PUSH(I.regs.w[SP]); CLK(1); } OP_EPILOGUE; +OP( 0x55, i_push_bp ) { PUSH(I.regs.w[BP]); CLK(1); } OP_EPILOGUE; +OP( 0x56, i_push_si ) { PUSH(I.regs.w[IX]); CLK(1); } OP_EPILOGUE; +OP( 0x57, i_push_di ) { PUSH(I.regs.w[IY]); CLK(1); } OP_EPILOGUE; + +OP( 0x58, i_pop_ax ) { POP(I.regs.w[AW]); CLK(1); } OP_EPILOGUE; +OP( 0x59, i_pop_cx ) { POP(I.regs.w[CW]); CLK(1); } OP_EPILOGUE; +OP( 0x5a, i_pop_dx ) { POP(I.regs.w[DW]); CLK(1); } OP_EPILOGUE; +OP( 0x5b, i_pop_bx ) { POP(I.regs.w[BW]); CLK(1); } OP_EPILOGUE; +OP( 0x5c, i_pop_sp ) { POP(I.regs.w[SP]); CLK(1); } OP_EPILOGUE; +OP( 0x5d, i_pop_bp ) { POP(I.regs.w[BP]); CLK(1); } OP_EPILOGUE; +OP( 0x5e, i_pop_si ) { POP(I.regs.w[IX]); CLK(1); } OP_EPILOGUE; +OP( 0x5f, i_pop_di ) { POP(I.regs.w[IY]); CLK(1); } OP_EPILOGUE; + +OP( 0x60, i_pusha ) { + unsigned tmp=I.regs.w[SP]; + PUSH(I.regs.w[AW]); + PUSH(I.regs.w[CW]); + PUSH(I.regs.w[DW]); + PUSH(I.regs.w[BW]); + PUSH(tmp); + PUSH(I.regs.w[BP]); + PUSH(I.regs.w[IX]); + PUSH(I.regs.w[IY]); + CLK(9); +} OP_EPILOGUE; + +OP( 0x61, i_popa ) { + unsigned tmp; + POP(I.regs.w[IY]); + POP(I.regs.w[IX]); + POP(I.regs.w[BP]); + POP(tmp); (void)tmp; + POP(I.regs.w[BW]); + POP(I.regs.w[DW]); + POP(I.regs.w[CW]); + POP(I.regs.w[AW]); + CLK(8); +} OP_EPILOGUE; + +OP( 0x62, i_chkind ) +{ + uint32 low,high,tmp; + + GetModRM; + + low = GetRMWord(ModRM); + high = GetnextRMWord; + tmp = RegWord(ModRM); + + CLK(13); + if (tmphigh) + { + nec_interrupt(5); + } +} OP_EPILOGUE; + +OP( 0x68, i_push_d16 ) { uint32 tmp; FETCHuint16(tmp); PUSH(tmp); CLK(1); } OP_EPILOGUE; +OP( 0x69, i_imul_d16 ) { uint32 tmp; DEF_r16w; FETCHuint16(tmp); dst = (int32)((int16)src)*(int32)((int16)tmp); I.CarryVal = I.OverVal = (((int32)dst) >> 15 != 0) && (((int32)dst) >> 15 != -1); RegWord(ModRM)=(uint16)dst; CLKM(4,3);} OP_EPILOGUE; +OP( 0x6a, i_push_d8 ) { uint32 tmp = (uint16)((int16)((int8)FETCH)); PUSH(tmp); CLK(1); } OP_EPILOGUE; +OP( 0x6b, i_imul_d8 ) { uint32 src2; DEF_r16w; src2= (uint16)((int16)((int8)FETCH)); dst = (int32)((int16)src)*(int32)((int16)src2); I.CarryVal = I.OverVal = (((int32)dst) >> 15 != 0) && (((int32)dst) >> 15 != -1); RegWord(ModRM)=(uint16)dst; CLKM(4,3); } OP_EPILOGUE; +OP( 0x6c, i_insb ) { i_real_insb(); } OP_EPILOGUE; +OP( 0x6d, i_insw ) { i_real_insw(); } OP_EPILOGUE; +OP( 0x6e, i_outsb ) { i_real_outsb(); } OP_EPILOGUE; +OP( 0x6f, i_outsw ) { i_real_outsw(); } OP_EPILOGUE; + +OP( 0x70, i_jo ) { JMP( FLAG_O); CLK(1); } OP_EPILOGUE; +OP( 0x71, i_jno ) { JMP(!FLAG_O); CLK(1); } OP_EPILOGUE; +OP( 0x72, i_jc ) { JMP( CF); CLK(1); } OP_EPILOGUE; +OP( 0x73, i_jnc ) { JMP(!CF); CLK(1); } OP_EPILOGUE; +OP( 0x74, i_jz ) { JMP( ZF); CLK(1); } OP_EPILOGUE; +OP( 0x75, i_jnz ) { JMP(!ZF); CLK(1); } OP_EPILOGUE; +OP( 0x76, i_jce ) { JMP(CF || ZF); CLK(1); } OP_EPILOGUE; +OP( 0x77, i_jnce ) { JMP(!(CF || ZF)); CLK(1); } OP_EPILOGUE; +OP( 0x78, i_js ) { JMP( SF); CLK(1); } OP_EPILOGUE; +OP( 0x79, i_jns ) { JMP(!SF); CLK(1); } OP_EPILOGUE; +OP( 0x7a, i_jp ) { JMP( PF); CLK(1); } OP_EPILOGUE; +OP( 0x7b, i_jnp ) { JMP(!PF); CLK(1); } OP_EPILOGUE; +OP( 0x7c, i_jl ) { JMP((SF!=FLAG_O)&&(!ZF)); CLK(1); } OP_EPILOGUE; +OP( 0x7d, i_jnl ) { JMP((ZF)||(SF==FLAG_O)); CLK(1); } OP_EPILOGUE; +OP( 0x7e, i_jle ) { JMP((ZF)||(SF!=FLAG_O)); CLK(1); } OP_EPILOGUE; +OP( 0x7f, i_jnle ) { JMP((SF==FLAG_O)&&(!ZF)); CLK(1); } OP_EPILOGUE; + +OP( 0x80, i_80pre ) { uint32 dst, src; GetModRM; dst = GetRMByte(ModRM); src = FETCH; + CLKM(3, 1); + switch (ModRM & 0x38) { + case 0x00: ADDB; PutbackRMByte(ModRM,dst); break; + case 0x08: ORB; PutbackRMByte(ModRM,dst); break; + case 0x10: src+=CF; ADDB; PutbackRMByte(ModRM,dst); break; + case 0x18: src+=CF; SUBB; PutbackRMByte(ModRM,dst); break; + case 0x20: ANDB; PutbackRMByte(ModRM,dst); break; + case 0x28: SUBB; PutbackRMByte(ModRM,dst); break; + case 0x30: XORB; PutbackRMByte(ModRM,dst); break; + case 0x38: SUBB; break; /* CMP */ + } +} OP_EPILOGUE; + +OP( 0x81, i_81pre ) { uint32 dst, src; GetModRM; dst = GetRMWord(ModRM); src = FETCH; src+= (FETCH << 8); + CLKM(3, 1); + switch (ModRM & 0x38) { + case 0x00: ADDW; PutbackRMWord(ModRM,dst); break; + case 0x08: ORW; PutbackRMWord(ModRM,dst); break; + case 0x10: src+=CF; ADDW; PutbackRMWord(ModRM,dst); break; + case 0x18: src+=CF; SUBW; PutbackRMWord(ModRM,dst); break; + case 0x20: ANDW; PutbackRMWord(ModRM,dst); break; + case 0x28: SUBW; PutbackRMWord(ModRM,dst); break; + case 0x30: XORW; PutbackRMWord(ModRM,dst); break; + case 0x38: SUBW; break; /* CMP */ + } +} OP_EPILOGUE; + +OP( 0x82, i_82pre ) { uint32 dst, src; GetModRM; dst = GetRMByte(ModRM); src = (uint8)((int8)FETCH); + CLKM(3,1); + switch (ModRM & 0x38) { + case 0x00: ADDB; PutbackRMByte(ModRM,dst); break; + case 0x08: ORB; PutbackRMByte(ModRM,dst); break; + case 0x10: src+=CF; ADDB; PutbackRMByte(ModRM,dst); break; + case 0x18: src+=CF; SUBB; PutbackRMByte(ModRM,dst); break; + case 0x20: ANDB; PutbackRMByte(ModRM,dst); break; + case 0x28: SUBB; PutbackRMByte(ModRM,dst); break; + case 0x30: XORB; PutbackRMByte(ModRM,dst); break; + case 0x38: SUBB; break; /* CMP */ + } +} OP_EPILOGUE; + +OP( 0x83, i_83pre ) { uint32 dst, src; GetModRM; dst = GetRMWord(ModRM); src = (uint16)((int16)((int8)FETCH)); + CLKM(3,1); + switch (ModRM & 0x38) { + case 0x00: ADDW; PutbackRMWord(ModRM,dst); break; + case 0x08: ORW; PutbackRMWord(ModRM,dst); break; + case 0x10: src+=CF; ADDW; PutbackRMWord(ModRM,dst); break; + case 0x18: src+=CF; SUBW; PutbackRMWord(ModRM,dst); break; + case 0x20: ANDW; PutbackRMWord(ModRM,dst); break; + case 0x28: SUBW; PutbackRMWord(ModRM,dst); break; + case 0x30: XORW; PutbackRMWord(ModRM,dst); break; + case 0x38: SUBW; break; /* CMP */ + } +} OP_EPILOGUE; + +OP( 0x84, i_test_br8 ) { DEF_br8; ANDB; CLKM(2,1); } OP_EPILOGUE; +OP( 0x85, i_test_wr16 ) { DEF_wr16; ANDW; CLKM(2,1); } OP_EPILOGUE; +OP( 0x86, i_xchg_br8 ) { DEF_br8; RegByte(ModRM)=dst; PutbackRMByte(ModRM,src); CLKM(5,3); } OP_EPILOGUE; +OP( 0x87, i_xchg_wr16 ) { DEF_wr16; RegWord(ModRM)=dst; PutbackRMWord(ModRM,src); CLKM(5,3); } OP_EPILOGUE; + +OP( 0x88, i_mov_br8 ) { uint8 src; GetModRM; src = RegByte(ModRM); PutRMByte(ModRM,src); CLK(1); } OP_EPILOGUE; +OP( 0x89, i_mov_wr16 ) { uint16 src; GetModRM; src = RegWord(ModRM); PutRMWord(ModRM,src); CLK(1); } OP_EPILOGUE; +OP( 0x8a, i_mov_r8b ) { uint8 src; GetModRM; src = GetRMByte(ModRM); RegByte(ModRM)=src; CLK(1); } OP_EPILOGUE; +OP( 0x8b, i_mov_r16w ) { uint16 src; GetModRM; src = GetRMWord(ModRM); RegWord(ModRM)=src; CLK(1); } OP_EPILOGUE; +OP( 0x8c, i_mov_wsreg ) { GetModRM; PutRMWord(ModRM,I.sregs[(ModRM & 0x38) >> 3]); CLK(1); } OP_EPILOGUE; +OP( 0x8d, i_lea ) { uint16 ModRM = FETCH; if(ModRM >= 192) { printf("LEA Error: %02x\n", ModRM);} else { (void)(*GetEA[ModRM])(); } RegWord(ModRM)=EO; CLK(1); } OP_EPILOGUE; +OP( 0x8e, i_mov_sregw ) { uint16 src; GetModRM; src = GetRMWord(ModRM); CLKM(3,2); + switch (ModRM & 0x38) { + case 0x00: I.sregs[DS1] = src; break; /* mov ds1,ew */ + case 0x08: I.sregs[PS] = src; break; /* mov cs,ew */ + case 0x10: I.sregs[SS] = src; break; /* mov ss,ew */ + case 0x18: I.sregs[DS0] = src; break; /* mov ds0,ew */ + } +} OP_EPILOGUE; + +OP( 0x8f, i_popw ) { uint16 tmp; GetModRM; POP(tmp); PutRMWord(ModRM,tmp); CLKM(3,1); } OP_EPILOGUE; +OP( 0x90, i_nop ) { CLK(3); } OP_EPILOGUE; + +OP( 0x91, i_xchg_axcx ) { XchgAWReg(CW); CLK(3); } OP_EPILOGUE; +OP( 0x92, i_xchg_axdx ) { XchgAWReg(DW); CLK(3); } OP_EPILOGUE; +OP( 0x93, i_xchg_axbx ) { XchgAWReg(BW); CLK(3); } OP_EPILOGUE; +OP( 0x94, i_xchg_axsp ) { XchgAWReg(SP); CLK(3); } OP_EPILOGUE; +OP( 0x95, i_xchg_axbp ) { XchgAWReg(BP); CLK(3); } OP_EPILOGUE; +OP( 0x96, i_xchg_axsi ) { XchgAWReg(IX); CLK(3); } OP_EPILOGUE; +OP( 0x97, i_xchg_axdi ) { XchgAWReg(IY); CLK(3); } OP_EPILOGUE; + +// AKA CVTBW +OP( 0x98, i_cbw ) { I.regs.b[AH] = (I.regs.b[AL] & 0x80) ? 0xff : 0; CLK(1); } OP_EPILOGUE; + +// AKA CVTWL +OP( 0x99, i_cwd ) { I.regs.w[DW] = (I.regs.b[AH] & 0x80) ? 0xffff : 0; CLK(1); } OP_EPILOGUE; + +OP( 0x9a, i_call_far ) { uint32 tmp, tmp2; FETCHuint16(tmp); FETCHuint16(tmp2); PUSH(I.sregs[PS]); PUSH(I.pc); I.pc = (uint16)tmp; I.sregs[PS] = (uint16)tmp2; ADDBRANCHTRACE(I.sregs[PS], I.pc); CLK(10); } OP_EPILOGUE; +OP( 0x9b, i_poll ) { puts("POLL"); } OP_EPILOGUE; +OP( 0x9c, i_pushf ) { i_real_pushf(); } OP_EPILOGUE; +OP( 0x9d, i_popf ) { i_real_popf(); } OP_EPILOGUE; +OP( 0x9e, i_sahf ) { uint32 tmp = (CompressFlags() & 0xff00) | (I.regs.b[AH] & 0xd5); ExpandFlags(tmp); CLK(4); } OP_EPILOGUE; +OP( 0x9f, i_lahf ) { I.regs.b[AH] = CompressFlags() & 0xff; CLK(2); } OP_EPILOGUE; + +OP( 0xa0, i_mov_aldisp ) { uint32 addr; FETCHuint16(addr); I.regs.b[AL] = GetMemB(DS0, addr); CLK(1); } OP_EPILOGUE; +OP( 0xa1, i_mov_axdisp ) { uint32 addr; FETCHuint16(addr); I.regs.b[AL] = GetMemB(DS0, addr); I.regs.b[AH] = GetMemB(DS0, (addr+1)&0xffff); CLK(1); } OP_EPILOGUE; +OP( 0xa2, i_mov_dispal ) { uint32 addr; FETCHuint16(addr); PutMemB(DS0, addr, I.regs.b[AL]); CLK(1); } OP_EPILOGUE; +OP( 0xa3, i_mov_dispax ) { uint32 addr; FETCHuint16(addr); PutMemB(DS0, addr, I.regs.b[AL]); PutMemB(DS0, (addr+1)&0xffff, I.regs.b[AH]); CLK(1); } OP_EPILOGUE; + +OP( 0xa4, i_movsb ) { i_real_movsb(); } OP_EPILOGUE; +OP( 0xa5, i_movsw ) { i_real_movsw(); } OP_EPILOGUE; +OP( 0xa6, i_cmpsb ) { i_real_cmpsb(); } OP_EPILOGUE; +OP( 0xa7, i_cmpsw ) { i_real_cmpsw(); } OP_EPILOGUE; + +OP( 0xa8, i_test_ald8 ) { DEF_ald8; ANDB; CLK(1); } OP_EPILOGUE; +OP( 0xa9, i_test_axd16 ) { DEF_axd16; ANDW; CLK(1); } OP_EPILOGUE; + +OP( 0xaa, i_stosb ) { i_real_stosb(); } OP_EPILOGUE; +OP( 0xab, i_stosw ) { i_real_stosw(); } OP_EPILOGUE; +OP( 0xac, i_lodsb ) { i_real_lodsb(); } OP_EPILOGUE; +OP( 0xad, i_lodsw ) { i_real_lodsw(); } OP_EPILOGUE; +OP( 0xae, i_scasb ) { i_real_scasb(); } OP_EPILOGUE; +OP( 0xaf, i_scasw ) { i_real_scasw(); } OP_EPILOGUE; + +OP( 0xb0, i_mov_ald8 ) { I.regs.b[AL] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb1, i_mov_cld8 ) { I.regs.b[CL] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb2, i_mov_dld8 ) { I.regs.b[DL] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb3, i_mov_bld8 ) { I.regs.b[BL] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb4, i_mov_ahd8 ) { I.regs.b[AH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb5, i_mov_chd8 ) { I.regs.b[CH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb6, i_mov_dhd8 ) { I.regs.b[DH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb7, i_mov_bhd8 ) { I.regs.b[BH] = FETCH; CLK(1); } OP_EPILOGUE; + +OP( 0xb8, i_mov_axd16 ) { I.regs.b[AL] = FETCH; I.regs.b[AH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xb9, i_mov_cxd16 ) { I.regs.b[CL] = FETCH; I.regs.b[CH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xba, i_mov_dxd16 ) { I.regs.b[DL] = FETCH; I.regs.b[DH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xbb, i_mov_bxd16 ) { I.regs.b[BL] = FETCH; I.regs.b[BH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xbc, i_mov_spd16 ) { I.regs.b[SPL] = FETCH; I.regs.b[SPH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xbd, i_mov_bpd16 ) { I.regs.b[BPL] = FETCH; I.regs.b[BPH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xbe, i_mov_sid16 ) { I.regs.b[IXL] = FETCH; I.regs.b[IXH] = FETCH; CLK(1); } OP_EPILOGUE; +OP( 0xbf, i_mov_did16 ) { I.regs.b[IYL] = FETCH; I.regs.b[IYH] = FETCH; CLK(1); } OP_EPILOGUE; + +OP( 0xc0, i_rotshft_bd8 ) { + uint32 src, dst; uint8 c; + GetModRM; src = (unsigned)GetRMByte(ModRM); dst=src; + c=FETCH; + c&=0x1f; + CLKM(5,3); + if (c) switch (ModRM & 0x38) { + case 0x00: do { ROL_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x08: do { ROR_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x10: do { ROLC_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x18: do { RORC_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x20: SHL_uint8(c); I.AuxVal = 1; break;// + case 0x28: SHR_uint8(c); I.AuxVal = 1; break;// + case 0x30: break; + case 0x38: SHRA_uint8(c); break; + } +} OP_EPILOGUE; + +OP( 0xc1, i_rotshft_wd8 ) { + uint32 src, dst; uint8 c; + GetModRM; src = (unsigned)GetRMWord(ModRM); dst=src; + c=FETCH; + c&=0x1f; + CLKM(5,3); + if (c) switch (ModRM & 0x38) { + case 0x00: do { ROL_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x08: do { ROR_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x10: do { ROLC_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x18: do { RORC_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x20: SHL_uint16(c); I.AuxVal = 1; break; + case 0x28: SHR_uint16(c); I.AuxVal = 1; break; + case 0x30: break; + case 0x38: SHRA_uint16(c); break; + } +} OP_EPILOGUE; + +OP( 0xc2, i_ret_d16 ) { uint32 count = FETCH; count += FETCH << 8; POP(I.pc); I.regs.w[SP]+=count; CLK(6); ADDBRANCHTRACE(I.sregs[PS], I.pc); } OP_EPILOGUE; +OP( 0xc3, i_ret ) { POP(I.pc); CLK(6); ADDBRANCHTRACE(I.sregs[PS], I.pc); } OP_EPILOGUE; +OP( 0xc4, i_les_dw ) { GetModRM; uint16 tmp = GetRMWord(ModRM); RegWord(ModRM)=tmp; I.sregs[DS1] = GetnextRMWord; CLK(6); } OP_EPILOGUE; +OP( 0xc5, i_lds_dw ) { GetModRM; uint16 tmp = GetRMWord(ModRM); RegWord(ModRM)=tmp; I.sregs[DS0] = GetnextRMWord; CLK(6); } OP_EPILOGUE; +OP( 0xc6, i_mov_bd8 ) { GetModRM; PutImmRMByte(ModRM); CLK(1); } OP_EPILOGUE; +OP( 0xc7, i_mov_wd16 ) { GetModRM; PutImmRMWord(ModRM); CLK(1); } OP_EPILOGUE; + +// NEC calls it "PREPARE" +OP( 0xc8, i_enter ) { + uint32 nb = FETCH; + uint32 i,level; + + CLK(19); + nb += FETCH << 8; + + level = FETCH; + level &= 0x1F; // Only lower 5 bits are valid on V30MZ + + PUSH(I.regs.w[BP]); + I.regs.w[BP]=I.regs.w[SP]; + I.regs.w[SP] -= nb; + for (i=1;i0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x08: do { ROR_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x10: do { ROLC_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x18: do { RORC_uint8; c--; } while (c>0); PutbackRMByte(ModRM,(uint8)dst); break; + case 0x20: SHL_uint8(c); I.AuxVal = 1; break; + case 0x28: SHR_uint8(c); I.AuxVal = 1;break; + case 0x30: break; + case 0x38: SHRA_uint8(c); break; + } +} OP_EPILOGUE; + +OP( 0xd3, i_rotshft_wcl ) { + uint32 src, dst; uint8 c; GetModRM; src = (uint32)GetRMWord(ModRM); dst=src; + c=I.regs.b[CL]; + c&=0x1f; + CLKM(5,3); + if (c) switch (ModRM & 0x38) { + case 0x00: do { ROL_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x08: do { ROR_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x10: do { ROLC_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x18: do { RORC_uint16; c--; } while (c>0); PutbackRMWord(ModRM,(uint16)dst); break; + case 0x20: SHL_uint16(c); I.AuxVal = 1; break; + case 0x28: SHR_uint16(c); I.AuxVal = 1; break; + case 0x30: break; + case 0x38: SHRA_uint16(c); break; + } +} OP_EPILOGUE; + +OP( 0xd4, i_aam ) { (void)FETCH; I.regs.b[AH] = I.regs.b[AL] / 10; I.regs.b[AL] %= 10; SetSZPF_Word(I.regs.w[AW]); CLK(17); } OP_EPILOGUE; +OP( 0xd5, i_aad ) { (void)FETCH; I.regs.b[AL] = I.regs.b[AH] * 10 + I.regs.b[AL]; I.regs.b[AH] = 0; SetSZPF_Byte(I.regs.b[AL]); CLK(6); } OP_EPILOGUE; +OP( 0xd6, i_setalc ) { I.regs.b[AL] = (CF)?0xff:0x00; CLK(3); } OP_EPILOGUE; +OP( 0xd7, i_trans ) { uint32 dest = (I.regs.w[BW]+I.regs.b[AL])&0xffff; I.regs.b[AL] = GetMemB(DS0, dest); CLK(5); } OP_EPILOGUE; + +OP8(0xd8, i_fpo) { /*printf("FPO1, Op:%02x\n", opcode);*/ GetModRM; (void)ModRM; CLK(1); } OP_EPILOGUE; + +OP( 0xe0, i_loopne ) { int8 disp = (int8)FETCH; I.regs.w[CW]--; if (!ZF && I.regs.w[CW]) { I.pc = (uint16)(I.pc+disp); CLK(6); ADDBRANCHTRACE(I.sregs[PS], I.pc); } else CLK(3); } OP_EPILOGUE; +OP( 0xe1, i_loope ) { int8 disp = (int8)FETCH; I.regs.w[CW]--; if ( ZF && I.regs.w[CW]) { I.pc = (uint16)(I.pc+disp); CLK(6); ADDBRANCHTRACE(I.sregs[PS], I.pc); } else CLK(3); } OP_EPILOGUE; +OP( 0xe2, i_loop ) { int8 disp = (int8)FETCH; I.regs.w[CW]--; if (I.regs.w[CW]) { I.pc = (uint16)(I.pc+disp); CLK(5); ADDBRANCHTRACE(I.sregs[PS], I.pc); } else CLK(2); } OP_EPILOGUE; +OP( 0xe3, i_jcxz ) { int8 disp = (int8)FETCH; if (I.regs.w[CW] == 0) { I.pc = (uint16)(I.pc+disp); CLK(4); ADDBRANCHTRACE(I.sregs[PS], I.pc); } else CLK(1); } OP_EPILOGUE; +OP( 0xe4, i_inal ) { uint8 port = FETCH; I.regs.b[AL] = read_port(port); CLK(6); } OP_EPILOGUE; +OP( 0xe5, i_inax ) { uint8 port = FETCH; I.regs.b[AL] = read_port(port); I.regs.b[AH] = read_port(port+1); CLK(6); } OP_EPILOGUE; +OP( 0xe6, i_outal ) { uint8 port = FETCH; write_port(port, I.regs.b[AL]); CLK(6); } OP_EPILOGUE; +OP( 0xe7, i_outax ) { uint8 port = FETCH; write_port(port, I.regs.b[AL]); write_port(port+1, I.regs.b[AH]); CLK(6); } OP_EPILOGUE; + +OP( 0xe8, i_call_d16 ) { uint32 tmp; FETCHuint16(tmp); PUSH(I.pc); I.pc = (uint16)(I.pc+(int16)tmp); ADDBRANCHTRACE(I.sregs[PS], I.pc); CLK(5); } OP_EPILOGUE; +OP( 0xe9, i_jmp_d16 ) { uint32 tmp; FETCHuint16(tmp); I.pc = (uint16)(I.pc+(int16)tmp); ADDBRANCHTRACE(I.sregs[PS], I.pc); CLK(4); } OP_EPILOGUE; +OP( 0xea, i_jmp_far ) { uint32 tmp,tmp1; FETCHuint16(tmp); FETCHuint16(tmp1); I.sregs[PS] = (uint16)tmp1; I.pc = (uint16)tmp; ; ADDBRANCHTRACE(I.sregs[PS], I.pc); CLK(7); } OP_EPILOGUE; +OP( 0xeb, i_jmp_d8 ) { int tmp = (int)((int8)FETCH); CLK(4);I.pc = (uint16)(I.pc+tmp); ADDBRANCHTRACE(I.sregs[PS], I.pc); } OP_EPILOGUE; + +OP( 0xec, i_inaldx ) { I.regs.b[AL] = read_port(I.regs.w[DW]); CLK(6);} OP_EPILOGUE; +OP( 0xed, i_inaxdx ) { uint32 port = I.regs.w[DW]; I.regs.b[AL] = read_port(port); I.regs.b[AH] = read_port(port+1); CLK(6); } OP_EPILOGUE; + +OP( 0xee, i_outdxal ) { write_port(I.regs.w[DW], I.regs.b[AL]); CLK(6); } OP_EPILOGUE; +OP( 0xef, i_outdxax ) { uint32 port = I.regs.w[DW]; write_port(port, I.regs.b[AL]); write_port(port+1, I.regs.b[AH]); CLK(6); } OP_EPILOGUE; + +// NEC calls it "BUSLOCK" +OP( 0xf0, i_lock ) { CLK(1); DoOP(FETCHOP); } OP_EPILOGUE; + +// We put CHK_ICOUNT *after* the first iteration has completed, to match real behavior. +#define CHK_ICOUNT(cond) if(v30mz_ICount < 0 && (cond)) { I.pc -= seg_prefix ? 3 : 2; break; } + +OP( 0xf2, i_repne ) +{ + uint32 next = FETCHOP; + + switch(next) { /* Segments */ + case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = FETCHOP; CLK(2); break; + case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = FETCHOP; CLK(2); break; + case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; + case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = FETCHOP; CLK(2); break; + } + + switch(next) { + case 0x6c: CLK(5); if (I.regs.w[CW]) do { i_real_insb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0x6d: CLK(5); if (I.regs.w[CW]) do { i_real_insw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0x6e: CLK(5); if (I.regs.w[CW]) do { i_real_outsb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0x6f: CLK(5); if (I.regs.w[CW]) do { i_real_outsw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xa4: CLK(5); if (I.regs.w[CW]) do { i_real_movsb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xa5: CLK(5); if (I.regs.w[CW]) do { i_real_movsw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xa6: CLK(5); if (I.regs.w[CW]) do { i_real_cmpsb(); I.regs.w[CW]--; CLK(3); CHK_ICOUNT(I.regs.w[CW] && ZF == 0); /* 6 + 3 = 9 */ } while (I.regs.w[CW]>0 && ZF==0); break; + case 0xa7: CLK(5); if (I.regs.w[CW]) do { i_real_cmpsw(); I.regs.w[CW]--; CLK(3); CHK_ICOUNT(I.regs.w[CW] && ZF == 0); /* 6 + 3 = 9 */ } while (I.regs.w[CW]>0 && ZF==0); break; + case 0xaa: CLK(5); if (I.regs.w[CW]) do { i_real_stosb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xab: CLK(5); if (I.regs.w[CW]) do { i_real_stosw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xac: CLK(5); if (I.regs.w[CW]) do { i_real_lodsb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xad: CLK(5); if (I.regs.w[CW]) do { i_real_lodsw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xae: CLK(5); if (I.regs.w[CW]) do { i_real_scasb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW] && ZF == 0); } while (I.regs.w[CW]>0 && ZF==0); break; + case 0xaf: CLK(5); if (I.regs.w[CW]) do { i_real_scasw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW] && ZF == 0); } while (I.regs.w[CW]>0 && ZF==0); break; + default: DoOP(next); break; + } + seg_prefix=FALSE; +} OP_EPILOGUE; + +OP( 0xf3, i_repe) +{ + uint32 next = FETCHOP; + + switch(next) { /* Segments */ + case 0x26: seg_prefix=TRUE; prefix_base=I.sregs[DS1]<<4; next = FETCHOP; CLK(2); break; + case 0x2e: seg_prefix=TRUE; prefix_base=I.sregs[PS]<<4; next = FETCHOP; CLK(2); break; + case 0x36: seg_prefix=TRUE; prefix_base=I.sregs[SS]<<4; next = FETCHOP; CLK(2); break; + case 0x3e: seg_prefix=TRUE; prefix_base=I.sregs[DS0]<<4; next = FETCHOP; CLK(2); break; + } + switch(next) { + case 0x6c: CLK(5); if (I.regs.w[CW]) do { i_real_insb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0x6d: CLK(5); if (I.regs.w[CW]) do { i_real_insw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0x6e: CLK(5); if (I.regs.w[CW]) do { i_real_outsb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0x6f: CLK(5); if (I.regs.w[CW]) do { i_real_outsw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xa4: CLK(5); if (I.regs.w[CW]) do { i_real_movsb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xa5: CLK(5); if (I.regs.w[CW]) do { i_real_movsw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xa6: CLK(5); if (I.regs.w[CW]) do { i_real_cmpsb(); I.regs.w[CW]--; CLK(3); CHK_ICOUNT(I.regs.w[CW] && ZF == 1); /* 6 + 3 = 9 */ } while (I.regs.w[CW]>0 && ZF==1); break; + case 0xa7: CLK(5); if (I.regs.w[CW]) do { i_real_cmpsw(); I.regs.w[CW]--; CLK(3); CHK_ICOUNT(I.regs.w[CW] && ZF == 1);/* 6 + 3 = 9 */ } while (I.regs.w[CW]>0 && ZF==1); break; + case 0xaa: CLK(5); if (I.regs.w[CW]) do { i_real_stosb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xab: CLK(5); if (I.regs.w[CW]) do { i_real_stosw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xac: CLK(5); if (I.regs.w[CW]) do { i_real_lodsb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xad: CLK(5); if (I.regs.w[CW]) do { i_real_lodsw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW]); } while (I.regs.w[CW]>0); break; + case 0xae: CLK(5); if (I.regs.w[CW]) do { i_real_scasb(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW] && ZF == 1); } while (I.regs.w[CW]>0 && ZF==1); break; + case 0xaf: CLK(5); if (I.regs.w[CW]) do { i_real_scasw(); I.regs.w[CW]--; CHK_ICOUNT(I.regs.w[CW] && ZF == 1); } while (I.regs.w[CW]>0 && ZF==1); break; + default: DoOP(next); break; + } + seg_prefix=FALSE; +} OP_EPILOGUE; + +OP( 0xf4, i_hlt ) { InHLT = TRUE; CheckInHLT(); } OP_EPILOGUE; + +OP( 0xf5, i_cmc ) { I.CarryVal = !CF; CLK(4); } OP_EPILOGUE; +OP( 0xf6, i_f6pre ) { uint32 tmp; uint32 uresult,uresult2; int32 result,result2; + GetModRM; tmp = GetRMByte(ModRM); + switch (ModRM & 0x38) { + case 0x00: tmp &= FETCH; I.CarryVal = I.OverVal = I.AuxVal=0; SetSZPF_Byte(tmp); CLKM(2,1); break; /* TEST */ + case 0x08: break; + case 0x10: PutbackRMByte(ModRM,~tmp); CLKM(3,1); break; /* NOT */ + + case 0x18: I.CarryVal=(tmp!=0);tmp=(~tmp)+1; SetSZPF_Byte(tmp); PutbackRMByte(ModRM,tmp&0xff); CLKM(3,1); break; /* NEG */ + case 0x20: uresult = I.regs.b[AL]*tmp; I.regs.w[AW]=(uint16)uresult; I.CarryVal=I.OverVal=(I.regs.b[AH]!=0); CLKM(4,3); break; /* MULU */ + case 0x28: result = (int16)((int8)I.regs.b[AL])*(int16)((int8)tmp); I.regs.w[AW]=(uint16)result; I.CarryVal=I.OverVal=(I.regs.b[AH]!=0); CLKM(4,3); break; /* MUL */ + case 0x30: if (tmp) { DIVUB; } else nec_interrupt(0); CLKM(16,15); break; + case 0x38: if (tmp) { DIVB; } else nec_interrupt(0); CLKM(18,17); break; + } +} OP_EPILOGUE; + +OP( 0xf7, i_f7pre ) { uint32 tmp,tmp2; uint32 uresult,uresult2; int32 result,result2; + GetModRM; tmp = GetRMWord(ModRM); + switch (ModRM & 0x38) { + case 0x00: FETCHuint16(tmp2); tmp &= tmp2; I.CarryVal = I.OverVal = I.AuxVal=0; SetSZPF_Word(tmp); CLKM(2,1); break; /* TEST */ + case 0x08: break; + case 0x10: PutbackRMWord(ModRM,~tmp); CLKM(3,1); break; /* NOT */ + case 0x18: I.CarryVal=(tmp!=0); tmp=(~tmp)+1; SetSZPF_Word(tmp); PutbackRMWord(ModRM,tmp&0xffff); CLKM(3,1); break; /* NEG */ + case 0x20: uresult = I.regs.w[AW]*tmp; I.regs.w[AW]=uresult&0xffff; I.regs.w[DW]=((uint32)uresult)>>16; I.CarryVal=I.OverVal=(I.regs.w[DW]!=0); CLKM(4,3); break; /* MULU */ + case 0x28: result = (int32)((int16)I.regs.w[AW])*(int32)((int16)tmp); I.regs.w[AW]=result&0xffff; I.regs.w[DW]=result>>16; I.CarryVal=I.OverVal=(I.regs.w[DW]!=0); CLKM(4,3); break; /* MUL */ + case 0x30: if (tmp) { DIVUW; } else nec_interrupt(0); CLKM(24,23); break; + case 0x38: if (tmp) { DIVW; } else nec_interrupt(0); CLKM(25,24); break; + } +} OP_EPILOGUE; + +OP( 0xf8, i_clc ) { I.CarryVal = 0; CLK(4); } OP_EPILOGUE; +OP( 0xf9, i_stc ) { I.CarryVal = 1; CLK(4); } OP_EPILOGUE; +OP( 0xfa, i_di ) { SetIF(0); CLK(4); } OP_EPILOGUE; +OP( 0xfb, i_ei ) { SetIF(1); CLK(4); } OP_EPILOGUE; +OP( 0xfc, i_cld ) { SetDF(0); CLK(4); } OP_EPILOGUE; +OP( 0xfd, i_std ) { SetDF(1); CLK(4); } OP_EPILOGUE; +OP( 0xfe, i_fepre ) { uint32 tmp, tmp1; GetModRM; tmp=GetRMByte(ModRM); + switch(ModRM & 0x38) { + case 0x00: tmp1 = tmp+1; I.OverVal = (tmp==0x7f); SetAF(tmp1,tmp,1); SetSZPF_Byte(tmp1); PutbackRMByte(ModRM,(uint8)tmp1); CLKM(3,1); break; /* INC */ + case 0x08: tmp1 = tmp-1; I.OverVal = (tmp==0x80); SetAF(tmp1,tmp,1); SetSZPF_Byte(tmp1); PutbackRMByte(ModRM,(uint8)tmp1); CLKM(3,1); break; /* DEC */ + } +} OP_EPILOGUE; + +OP( 0xff, i_ffpre ) { uint32 tmp, tmp1; GetModRM; tmp=GetRMWord(ModRM); + switch(ModRM & 0x38) { + case 0x00: tmp1 = tmp+1; I.OverVal = (tmp==0x7fff); SetAF(tmp1,tmp,1); SetSZPF_Word(tmp1); PutbackRMWord(ModRM,(uint16)tmp1); CLKM(3,1); break; /* INC */ + case 0x08: tmp1 = tmp-1; I.OverVal = (tmp==0x8000); SetAF(tmp1,tmp,1); SetSZPF_Word(tmp1); PutbackRMWord(ModRM,(uint16)tmp1); CLKM(3,1); break; /* DEC */ + case 0x10: PUSH(I.pc); I.pc = (uint16)tmp; ADDBRANCHTRACE(I.sregs[PS], I.pc); CLKM(6,5); break; /* CALL */ + case 0x18: tmp1 = I.sregs[PS]; I.sregs[PS] = GetnextRMWord; PUSH(tmp1); PUSH(I.pc); I.pc = tmp; ADDBRANCHTRACE(I.sregs[PS], I.pc); CLKM(12,1); break; /* CALL FAR */ + case 0x20: I.pc = tmp; ADDBRANCHTRACE(I.sregs[PS], I.pc); CLKM(5,4); break; /* JMP */ + case 0x28: I.pc = tmp; I.sregs[PS] = GetnextRMWord; ADDBRANCHTRACE(I.sregs[PS], I.pc); CLKM(10,1); break; /* JMP FAR */ + case 0x30: PUSH(tmp); CLKM(2,1); break; + } +} OP_EPILOGUE; +} // End switch statement + + +} // End func + + +/*****************************************************************************/ + + +unsigned v30mz_get_reg(int regnum) +{ + switch( regnum ) + { + case NEC_PC: return I.pc; + case NEC_SP: return I.regs.w[SP]; + case NEC_FLAGS: return CompressFlags(); + case NEC_AW: return I.regs.w[AW]; + case NEC_CW: return I.regs.w[CW]; + case NEC_DW: return I.regs.w[DW]; + case NEC_BW: return I.regs.w[BW]; + case NEC_BP: return I.regs.w[BP]; + case NEC_IX: return I.regs.w[IX]; + case NEC_IY: return I.regs.w[IY]; + case NEC_DS1: return I.sregs[DS1]; + case NEC_PS: return I.sregs[PS]; + case NEC_SS: return I.sregs[SS]; + case NEC_DS0: return I.sregs[DS0]; + } + return 0; +} + +void nec_set_irq_line(int irqline, int state); + +void v30mz_set_reg(int regnum, unsigned val) +{ + switch( regnum ) + { + case NEC_PC: I.pc = val; break; + case NEC_SP: I.regs.w[SP] = val; break; + case NEC_FLAGS: ExpandFlags(val); break; + case NEC_AW: I.regs.w[AW] = val; break; + case NEC_CW: I.regs.w[CW] = val; break; + case NEC_DW: I.regs.w[DW] = val; break; + case NEC_BW: I.regs.w[BW] = val; break; + case NEC_BP: I.regs.w[BP] = val; break; + case NEC_IX: I.regs.w[IX] = val; break; + case NEC_IY: I.regs.w[IY] = val; break; + case NEC_DS1: I.sregs[DS1] = val; break; + case NEC_PS: I.sregs[PS] = val; break; + case NEC_SS: I.sregs[SS] = val; break; + case NEC_DS0: I.sregs[DS0] = val; break; + } +} + +#ifdef WANT_DEBUGGER +static void (*save_cpu_writemem20)(uint32,uint8); +static uint8 (*save_cpu_readport)(uint32); +static void (*save_cpu_writeport)(uint32, uint8); +static uint8 (*save_cpu_readmem20)(uint32); + +static void test_cpu_writemem20(uint32 A, uint8 V) +{ + if(write_hook) + write_hook(A, V); +} + +static uint8 test_cpu_readmem20(uint32 A) +{ + if(read_hook) + return(read_hook(A)); + else + return(save_cpu_readmem20(A)); +} + +static void test_cpu_writeport(uint32 A, uint8 V) +{ + if(port_write_hook) + port_write_hook(A, V); +} + +static uint8 test_cpu_readport(uint32 A) +{ + if(port_read_hook) + return(port_read_hook(A)); + else + return(save_cpu_readport(A)); +} +#endif + +void v30mz_execute(int cycles) +{ + v30mz_ICount += cycles; + + if(InHLT) + { + SETOLDCSIP(); + WSwan_InterruptCheck(); + if(InHLT) + { + int32 tmp = v30mz_ICount; + + if(tmp > 0) + CLK(tmp); + + #ifdef WANT_DEBUGGER + if(cpu_hook) + cpu_hook(I.pc); + #endif + return; + } + } + + while(v30mz_ICount > 0) + { + SETOLDCSIP(); + + WSwan_InterruptCheck(); + + #ifdef WANT_DEBUGGER + if(hookie_hickey) + { + uint32 save_timestamp = v30mz_timestamp; + int32 save_ICount = v30mz_ICount; + v30mz_regs_t save_I = I; + uint32 save_prefix_base = prefix_base; + char save_seg_prefix = seg_prefix; + void (*save_branch_trace_hook)(uint16 from_CS, uint16 from_IP, uint16 to_CS, uint16 to_IP, bool interrupt) = branch_trace_hook; + + branch_trace_hook = NULL; + + save_cpu_writemem20 = cpu_writemem20; + save_cpu_readport = cpu_readport; + save_cpu_writeport = cpu_writeport; + save_cpu_readmem20 = cpu_readmem20; + + cpu_writemem20 = test_cpu_writemem20; + cpu_readmem20 = test_cpu_readmem20; + cpu_writeport = test_cpu_writeport; + cpu_readport = test_cpu_readport; + + DoOP(FETCHOP); + + branch_trace_hook = save_branch_trace_hook; + v30mz_timestamp = save_timestamp; + v30mz_ICount = save_ICount; + I = save_I; + prefix_base = save_prefix_base; + seg_prefix = save_seg_prefix; + cpu_readmem20 = save_cpu_readmem20; + cpu_writemem20 = save_cpu_writemem20; + cpu_readport = save_cpu_readport; + cpu_writeport = save_cpu_writeport; + InHLT = FALSE; + } + + if(cpu_hook) + cpu_hook(I.pc); + #endif + + DoOP(FETCHOP); + } + +} + +#ifdef WANT_DEBUGGER +void v30mz_debug(void (*CPUHook)(uint32), uint8 (*ReadHook)(uint32), void (*WriteHook)(uint32, uint8), uint8 (*PortReadHook)(uint32), + void (*PortWriteHook)(uint32, uint8), void (*BranchTraceHook)(uint16 from_CS, uint16 from_IP, uint16 to_CS, uint16 to_IP, bool interrupt)) +{ + cpu_hook = CPUHook; + read_hook = ReadHook; + write_hook = WriteHook; + port_read_hook = PortReadHook; + port_write_hook = PortWriteHook; + + hookie_hickey = read_hook || write_hook || port_read_hook || port_write_hook; + + branch_trace_hook = BranchTraceHook; +} +#endif + +void v30mz_StateAction(StateMem *sm, const unsigned load, const bool data_only) +{ + uint16 PSW; + + SFORMAT StateRegs[] = + { + SFVARN(I.pc, "IP"), + SFARRAY16N(I.regs.w, 8, "regs"), + SFARRAY16N(I.sregs, 4, "sregs"), + + SFVARN(v30mz_ICount, "ICount"), + SFVARN(InHLT, "InHLT"), + SFVARN(prefix_base, "prefix_base"), + SFVARN(seg_prefix, "seg_prefix"), + SFVAR(PSW), + SFEND + }; + + PSW = CompressFlags(); + + MDFNSS_StateAction(sm, load, data_only, StateRegs, "V30"); + + if(load) + { + ExpandFlags(PSW); + } +} + +} diff --git a/Mednafen/mednafen/wswan/v30mz.h b/Mednafen/mednafen/wswan/v30mz.h new file mode 100644 index 0000000000..5ffd32b179 --- /dev/null +++ b/Mednafen/mednafen/wswan/v30mz.h @@ -0,0 +1,35 @@ +#ifndef __V30MZ_H_ +#define __V30MZ_H_ + +namespace MDFN_IEN_WSWAN +{ + +enum { + NEC_PC=1, NEC_AW, NEC_CW, NEC_DW, NEC_BW, NEC_SP, NEC_BP, NEC_IX, NEC_IY, + NEC_FLAGS, NEC_DS1, NEC_PS, NEC_SS, NEC_DS0 +}; + +/* Public variables */ +extern int v30mz_ICount; +extern uint32 v30mz_timestamp; + + +/* Public functions */ +void v30mz_execute(int cycles); +void v30mz_set_reg(int, unsigned); +unsigned v30mz_get_reg(int regnum); +void v30mz_reset(void); +void v30mz_init(uint8 (*readmem20)(uint32), void (*writemem20)(uint32,uint8), uint8 (*readport)(uint32), void (*writeport)(uint32, uint8)); + +void v30mz_int(uint32 vector, bool IgnoreIF = FALSE); + +void v30mz_StateAction(StateMem *sm, const unsigned load, const bool data_only); + + +#ifdef WANT_DEBUGGER +void v30mz_debug(void (*CPUHook)(uint32), uint8 (*ReadHook)(uint32), void (*WriteHook)(uint32, uint8), uint8 (*PortReadHook)(uint32), void (*PortWriteHook)(uint32, uint8), + void (*BranchTraceHook)(uint16 from_CS, uint16 from_IP, uint16 to_CS, uint16 to_IP, bool interrupt) ); +#endif +#endif + +} diff --git a/Mednafen/mednafen/wswan/wstech24.txt b/Mednafen/mednafen/wswan/wstech24.txt new file mode 100644 index 0000000000..6c4a5c30f7 --- /dev/null +++ b/Mednafen/mednafen/wswan/wstech24.txt @@ -0,0 +1,757 @@ + ___ ___ _ + / | \ ___ __/ \__ ___ ___ /\__ + \ / \ // __>\_ _// __|/ __\/ \ + \_____/_\__ \ \_/ \___|\___/\_/\_/ + \____/ 2.4 - 26.12.2003 + +1. ABOUT + WStech doc v2.4 made by Judge and Dox + Special thanks to -anonymous- contributor for some usefull info. + + For more info please visit http://www.pocketdomain.net + + Comments/updates/infos please send to dox@space.pl + + What's new in version 2.4: + + - corect info about Sprite Table, BG Map and FG Map locations + (ports $04 and $07 - section 10) + Special thanks to mika-n + +2. CPU + + Bandai SPGY-1001 ASWAN 9850KK003 + NEC V30 MZ - fast version of V30 with internal pipeline (16 bytes prefatch buffer) running at 3.072 MHz. + V30 MZ is aprox 4 times faster than V30. + The V30MZ performs pipeline processing internally, performing instruction fetch (prefetch), instruction decode, and + instruction execution in parallel. For this reason, it is difficult to determine what part of the program is currently being + executed by monitoring the output of the address bus for the instruction code fetch. + If there are conditional branch instructions, even in case branching does not occur, the address of the branch + destination is prefetched (only one time), so that further monitoring of the program is difficult. + The V30MZ has 8 prefetch queues (16 bytes). + + There are a few other differences between V30MZ and V30 cpu (unsupported opcodes , different flag handling after mul/div). + + Timing: + + Hblank : 256 CPU cycles + Vblank : 159 Hblank = 159*256/3072000 = 75.47Hz + + +3. MEMORY + + 20 bit addressing space = 1 Megabyte. Memory is splitted into 64KB blocks (segments/banks). + + Segments: + + 0 - RAM - 16 KB (WS) / 64 KB (WSC) internal RAM (see below) + + 1 - SRAM (cart) SRAM is BSI device BS62LV256TC - 256K(32Kx8) Static RAM - TSOP 0 - 70 c, 70 ns (http://www.bsi.com.tw/product/bs62lv256.pdf) + + 2 - ROM Bank (initial bank = last) + 3 - ROM Bank (lnitial bank = last) + + 4 - ROM Bank (initial bank = last - 11) + 5 - ROM Bank (initial bank = last - 10) + 6 - ROM Bank (initial bank = last - 9) + 7 - ROM Bank (initial bank = last - 8) + 8 - ROM Bank (initial bank = last - 7) + 9 - ROM Bank (initial bank = last - 6) + A - ROM Bank (initial bank = last - 5) + B - ROM Bank (initial bank = last - 4) + C - ROM Bank (initial bank = last - 3) + D - ROM Bank (initial bank = last - 2) + E - ROM Bank (initial bank = last - 1) + F - ROM Bank (initial bank = last) + + Segments 2-$F are switchable using ports : + + $C2 - Segment 2 (value written to port is ROM Bank number ($FF means last ROM bank (last 64 kbytes of ROM file) , $FE = last - 1 .. etc) + $C3 - Segment 3 (same as above) + $C0 - Segments 4-$F - bits 0,1,2 and 3 of port $C0 are bits 4,5,6 and 7 of ROM bank number in segments 4-$F . Bits 0-3 + are taken form segment number ( for example , IO[$C0]=$4E -> segment 9 contains ROM bank $E9). + + RAM Map : + + $0000 - $1FFF WS/WSC + $2000 - $3FFF 4 Col Tiles WS/WSC + ------------- + $4000 - $7FFF 16 Col Tiles Bank 0 WSC only + $8000 - $BFFF 16 Col Tiles Bank 1 WSC only + $C000 - $FDFF WSC only + $FE00 - $FFFF Palettes (WSC) WSC only + + Some games required initialized (?) part of RAM, for example: + + $75AC = $41 = "A" + $75AD = $5F = "_" + $75AE = $43 = "C" + $75AF = $31 = "1" + $75B0 = $6E = "n" + $75B1 = $5F = "_" + $75B2 = $63 = "c" + $75B3 = $31 = "1" + +4. VIDEO + + Screen size - 224 x 144 pixels (28 x 18 tiles) + Tile size - 8 x 8 dots , 16 bytes/tile (4 col modes) or 32 bytes/tile (16 col modes) + Map size - 256 x 256 pixels (32 x 32 tiles) + Layers - Two layers - Background and Foreground (top layer) + Maps locations - Selectable using port $07 + Tiles locations - Fixed, two banks - one at $4000 , second at $8000 + Map format - Each position in the map is defined by one word: + bits 0 - 8 - Tile number (0-511) + bits 9 - 12 - Palette number (0-15) + bit 13 - WS = unused / WSC = tile bank + bit 14 - Horizontal flip + bit 15 - Vertical flip + Tile formats - Depends on video mode (port $60) + Sprites - Max 128 sprites , limited to max 32 on scanline + sprite format: + byte 0,1 - bits + 0 - 8 - Tile number (0-511) + 9 - 11 - Palette number (0-7) + 8 -> (8-15) + 12 - Sprite window clipping on/off + 13 - Priority with respect to the layers + 0 - appear between the 2 background and foreground layers + 1 - appear on top of both layers + 14 - Horizontal flip + 15 - Vertical flip + byte 2 - Y position on the screen + byte 3 - X position on the screen + + Sprite table is buffered durning frame display. + Probably up to scanline 140 (1238-144?) + + Colors - Wonderswan (Mono) is capable of showing 16 shades of gray(only 8 can be selected at any one time) + These 8 shades form a pool from which the palette definition can select shades. There are 16 palettes. + All 16 palettes are used by BG and FG layers , the last 8 are used also by sprites. + Which 8 colors are used for palette generation is defined by ports 1C and 1E- port 1C + defines palette colors 0 - 3, port 1E defines 4 - 7. Each palette selection is 4 bits in + size: + 1C : 11110000 + 1D : 33332222 + 1E : 55554444 + 1F : 77776666 + + (where color 15 is the darkest one) + + Ports 20 - 3E are used to define the palettes themselves. + 20 : x111x000 - palette #0 + 21 : x333x222 + + In color video modes each color is defined using one word, + where bits: + 0 - 3 Blue + 4 - 7 Green + 8 - 11 Red + 12 - 14 unused + Color palettes are stored in the RAM (segment 0) , at address $FE00 + + Scrolling - Each of layers can be scrolled horizontal or vertical using ports $10 - $13 + + Transparency - Wonderswan - if bit 3 on palette number is set - color 0 of that palette is transparent + Wonderswan color - color 0 of each palette is transparent + Windows - There are two windows - rectangular areas for disabling /enabling FG layer (FG window) or sprites(Sprite window) + +5. SOUND + + 4 Audio channels. + Each channel can play short samples ( 4 bit , 16 bytes ( 32 sampels = 2 samples in byte (bits 0-3 and 4-7)) + with selectable frequency = 3,072 *10e6 / ((2048 - N) x 32 ) Hz , where N = 11 bit value. + Location of that samples is unknown. + + Volume of each audio channle is controlled by writing two 4 bit values ( for left/right output + channel) into ports $88 - $8B. Master volume is controlled by port $91 + (2 bit value = first 'used' bit in master volume output (11 bit wide) , D/A converter can + read only 8 bits , starting from bit set in port $91 , for example if first 'used' bit + is set to 2 , D/A using bits 2,3,4,5,6,7,8,9 for audio output) + + Additional (selectable) functions : + - channel 2 - voice - can play 8 bit samples writing frequently data to ch2 volume I/O port + - channel 3 - sweep - two parameters: + - step = 2.667 x (N + 1) ms , where N = 5 bit value + - value - signed byte (-128 - 127) + - channel 4 - noise - 7 selectable noise generators (probably I/O port $8E) + + For detailed info please check ports $80 - $91 in section I/O Ports. + + There's also Audio DMA (please chec ports $4a - $52). + Transfer rate is 12KHz (HBlank). + I/O ports $4A-$4B and $4E-$4F are autupdated durning data transfer . + +6. ROM HEADER + + Header taking last 10 bytes of each ROM file. + Bytes : + 0 - Developer ID + 1 - Minimum support system + 00 - WS Mono + 01 - WS Color + 2 - Cart ID number for developer defined at byte 0 + 3 - ?? + 4 - ROM Size + 01 - ? + 02 - 4Mbit + 03 - 8Mbit + 04 - 16Mbit + 05 - ? + 06 - 32Mbit + 07 - ? + 08 - 64Mbit + 09 - 128Mbit + 5 - SRAM/EEPROM Size + 00 - 0k + 01 - 64k SRAM + 02 - 256k SRAM + 03 - 1M SRAM (Taikyoku Igo Heisei Kiin) + 04 - 2M SRAM (WonderWitch) + 10 - 1k EEPROM + 20 - 16k EEPROM + 50 - 8k EEPROM + 6 - Additional capabilities(?) + - bit 0 - 1 - vertical position , 1 - horizontal position + - bit 2 - always 1 + + 7 - 1 - RTC (Real Time Clock) + 8,9 - Checksum = sum of all ROM bytes except two last ones ( where checksum is stored) + +7. INTERRUPTS + The Wonderswan CPU recognizes 7 interrupts from the hardware, these are: + 7 - HBlank Timer + 6 - VBlank + 5 - VBlank Timer + 4 - Drawing line detection + 3 - Serial Recieve + 2 - RTC Alarm (cartridge) + 1 - Key press + 0 - Serial Send + + Whether the CPU should indeed take action when one of these interrupts come in + is determined by port B2. The above mentioned interrupts correspond with the bit + numbers of port B2. When an interrupt occurs the corresponding bit of port B6 gets + set to 1 and, if enabled, an interrupt to the CPU is generated. This bit of port B6 + will have to be cleared through code when the interrupt has been handled. + + Example: + The Wonderswan is set to react to VBlank begin interrupts. Then bit 7 of B6 is set high + and keeps the interrupt line high until the CPU is able to take action upon this interrupt. + A typical VBlank interrupt routine is as follows: + + + out B6,40 + + iret + + The mentioned interrupts do not correspond with the same interrupt numbers for the vectors + in the vector table. The base for the actual interrupt numbers is set through port B0. If B0 + is set to 20h then a VBlank begin interrupt routine must be set at vector 26h. (Base is 20h + and VBlank begin interrupt is 6) + +8. CONTROLS - It's easy to check buttons status reading/writing port $B5(see below). + There's required some delay between writing and reading port $B5 ( few NOP-s) + +9. Internal EEPROM Communication(?) and 'owner' info structure + I/O Ports in range 0xBA -0xBE seems to be used for serial reading of internal + WS EEPROM (for example - 'owner' info). + + 0xBA (Word) - Data + 0xBC (Word) - Address (calculated probably Modulo EEPROM size (unknown)) + 0xBE (Byte) - Communication (?) + bit 4 set before reading data + bit 1 set by hardware , when data is ready to read + + Example : + + mov ax, $1B9 + out $BC, ax + mov al, $10 + out $BE, al + xor dx, dx + miniloop: + inc dx + cmp dl, 32 + jnc bad_data + in al, $BE + and al, 1 + jz miniloop + in ax, $BA ; Month and Day of birth + + + 'Owner' info structure : + + - Name - 16 bytes ( 0 = Space, 1 = '0' ... 0xA = '9', 0xB = 'A'... ) + - Year of birth - 2 bytes (BCD) + - Month of birth - 1 byte (BCD) + - Day of birth - 1 byte (BCD) + - Sex - 1 byte (1 - male , 2 - female) + - Blood - 1 byte (1 - A, 2 - B, 3 - 0, 4 - AB) + + + Struct size - 22 bytes = 11 reads, + Address range = 0x1B0 - 0x1BA + +10. I/O PORTS (port number /initial value / description) + +- $00 - $00 - Display control + bit 0 - background layer on/off + bit 1 - foreground layer on/off + bit 2 - sprites on/off + bit 3 - sprite window on/off (window coords defined in ports $0C - $0F) + bit 4,5 - fg win inside on/off (window coords defined in ports $08 - $0B) + Meaning of bits 4 and 5 : + 5 4 + --- + 0 0 FG layer is displayed inside and outside FG window area + 0 1 ?? + 1 0 FG layer is displayed only inside window + 1 1 FG layer is displayed outside window + - $01 - $00 - Determines the background color + bit 0-3 - background color + bit 4-7 - background palette (WSC only) + - $02 - ??? - Current Line (0 - 158) (159 ???) + - $03 - $BB - Line compare (for drawning line detection interrupt) + - $04 - $00 - Determines the base address for the sprite table. + To get the address of the table, shift this value left 9 times + and clear MSB. (bits 0..5 are effective to determines the base, + bits 6,7 are unknown) + 0 0xxxxxx0 00000000 + (Sprite Attribute Table Base can move from $00000-$07E00 with 512 bytes step) + - $05 - $00 - Determines the number of the sprite to start drawing with + - $06 - $00 - Determines the number of the sprite to stop drawing. + - $07 - $26 - Determines the location of the foreground and background screens in RAM. + Format: + bits 7-0 : ?fff?bbb + bit 7 - Unknown + bits 6-4 - Determines foreground location (address is 00fff000 00000000) + bit 3-? - Unknown + bits 2-0 - Determines background location (address is 00bbb000 00000000) + Back Ground Tile Map Base can move from $00000-$03800 (2048 bytes step) + - $08 - $FE - x0 of FG window (x0,y0) = top left corner, (x1,y1) = bottom right corner + - $09 - $DE - y0 of FG window + - $0A - $F9 - x1 of FG window + - $0B - $FB - y1 of FG window + - $0C - $DB - x0 of SPR window + - $0D - $D7 - y0 of SPR window + - $0E - $7F - x1 of SPR window + - $0F - $F5 - y1 of SPR window + - $10 - $00 - Background layer X scroll register + - $11 - $00 - Background layer Y scroll register + - $12 - $00 - Foreground layer X scroll register + - $13 - $00 - Foreground layer Y scroll register + - $14 - $01 - LCD Control (???) + bit 0 - 1 - LCD on + 0 - LCD off + - $15 - $00 - LCD Icons + bit 0 - LCD Sleep + bit 1 - Vertical Position + bit 2 - Horizontal Position + bit 3 - Dot 1 + bit 4 - Dot 2 + bit 5 - Dot 3 + bit 6 - Not Used ? + bit 7 - Not Used ? + - $16 - $9E - ??? + - $17 - $9B - ??? + - $18 - $00 - ??? + - $19 - $00 - ??? + - $1A - $00 - ??? + - $1B - $00 - ??? + - $1C - $99 - PALCOL10 + - $1D - $FD - PALCOL32 + - $1E - $B7 - PALCOL54 + - $1F - $DF - PALCOL76 + - $20 - $30 - PAL00 + - $21 - $57 - PAL01 + - $22 - $75 - PAL10 + - $23 - $76 - PAL11 + - $24 - $15 - PAL20 + - $25 - $73 - PAL21 + - $26 - $77 - PAL30 + - $27 - $77 - PAL31 + - $28 - $20 - PAL40 + - $29 - $75 - PAL41 + - $2A - $50 - PAL50 + - $2B - $36 - PAL51 + - $2C - $70 - PAL60 + - $2D - $67 - PAL61 + - $2E - $50 - PAL70 + - $2F - $77 - PAL70 + - $30 - $57 - PAL00 + - $31 - $54 - PAL01 + - $32 - $75 - PAL10 + - $33 - $77 - PAL11 + - $34 - $75 - PAL20 + - $35 - $17 - PAL21 + - $36 - $37 - PAL30 + - $37 - $73 - PAL31 + - $38 - $50 - PAL40 + - $39 - $57 - PAL41 + - $3A - $60 - PAL50 + - $3B - $77 - PAL51 + - $3C - $70 - PAL60 + - $3D - $77 - PAL61 + - $3E - $10 - PAL70 + - $3F - $73 - PAL70 + - $40 - $00 - DMA (?) copy source address + - $41 - $00 - ^^^ + - $42 - $00 - copy source bank + - $43 - $00 - copy destination bank + - $44 - $00 - copy destination address + - $45 - $00 - ^^^ + - $46 - $00 - size of copied data (in bytes) + - $47 - $00 - ^^^ + - $48 - $00 - bit 7 = 1 -> copy start + (bit 7=0 when data transfer is finished) + DMA(?) isn't immediate and not stopping + the main cpu operations (like gbc GDMA) + ports $40-$48 are updated durning copy process + - $49 - $00 - ??? + + - $4A - $00 - sound DMA source address + - $4B - $00 - ^^^ + - $4C - $00 - DMA source memory segment bank + - $4D - $00 - ??? + - $4E - $00 - DMA transfer size (in bytes) + - $4F - $00 - ^^^ + - $50 - $00 - ??? + - $51 - $00 - ??? + - $52 - $00 - bit 7 = 1 -> DMA start + - $53 - $00 - ??? + - $54 - $00 - ??? + - $55 - $00 - ??? + - $56 - $00 - ??? + - $57 - $00 - ??? + - $58 - $00 - ??? + - $59 - $00 - ??? + - $5A - $00 - ??? + - $5B - $00 - ??? + - $5C - $00 - ??? + - $5D - $00 - ??? + - $5E - $00 - ??? + - $5F - $00 - ??? + - $60 - $0A - video mode + Meaning of bits 5-7: + 765 + --- + 111 16 col/tile 'packed' mode - tiles like in Genesis, 16 col/tile + 110 16 col/tile 'layered' mode - tiles like in GameGear, 16 col/tile + 010 4 col/tile - the same as mono (below) but using color palettes, 4 cols/tile, one tile = 16 bytes, WSC only + 000 4 col/tile mono - tiles like in GameBoy, + [bit 7 = 16/4 color/tile , bit 6 - color/mono mode, bit 5 - 'packed' mode on/off] + - $61 - $00 - ??? + - $62 - $00 - ??? + - $63 - $00 - ??? + - $64 - $00 - ??? + - $65 - $00 - ??? + - $66 - $00 - ??? + - $67 - $00 - ??? + - $68 - $00 - ??? + - $69 - $00 - ??? + - $6A - $00 - ??? + - $6B - $0F - ??? + - $6C - $00 - ??? + - $6D - $00 - ??? + - $6E - $00 - ??? + - $6F - $00 - ??? + - $70 - $00 - ??? + - $71 - $00 - ??? + - $72 - $00 - ??? + - $73 - $00 - ??? + - $74 - $00 - ??? + - $75 - $00 - ??? + - $76 - $00 - ??? + - $77 - $00 - ??? + - $78 - $00 - ??? + - $79 - $00 - ??? + - $7A - $00 - ??? + - $7B - $00 - ??? + - $7C - $00 - ??? + - $7D - $00 - ??? + - $7E - $00 - ??? + - $7F - $00 - ??? + - $80 - $00 - Audio 1 Freq + - $81 - $00 - ^^^ + - $82 - $00 - Audio 2 Freq + - $83 - $00 - ^^^ + - $84 - $00 - Audio 3 Freq + - $85 - $00 - ^^^ + - $86 - $00 - Audio 4 Freq + - $87 - $00 - ^^^ + - $88 - $00 - Audio 1 volume + - $89 - $00 - Audio 2 volume + - $8A - $00 - Audio 3 volume + - $8B - $00 - Audio 4 volume + - $8C - $00 - ?? Sweep value + - $8D - $1F - ?? Sweep step + - $8E - $00 - Noise control + Bits : + 0 - Noise generator type + 1 - ^^^ + 2 - ^^^ + 3 - Reset + 4 - Enable + 5 - ??? + 6 - ??? + 7 - ??? + - $8F - $00 - Sample location + To get the address of samples, shift this value left 6 times. + 0 00xxxxxx xx000000 + - $90 - $00 - Audio control + Bits: + 0 - Audio 1 on/off + 1 - Audio 2 on/off + 2 - Audio 3 on/off + 3 - Audio 4 on/off + 4 - ??? + 5 - Audio 2 Voice + 6 - Audio 3 Sweep + 7 - Audio 4 Noise + - $91 - $00 - Audio Output + Bits : + 0 - Mono + 1 - Output Volume + 2 - ^^^ + 3 - External Stereo + 4 - ??? + 5 - ??? + 6 - ??? + 7 - External Speaker (set by hardware) + - $92 - $00 - Noise Counter Shift Register (15 bits) + - $93 - $00 - ^^^ + - $94 - $00 - Volume (4 bit) + - $95 - $00 - ??? + - $96 - $00 - ??? + - $97 - $00 - ??? + - $98 - $00 - ??? + - $99 - $00 - ??? + - $9A - $00 - ??? + - $9B - $00 - ??? + - $9C - $00 - ??? + - $9D - $00 - ??? + - $9E - $03 - ??? + - $9F - $00 - ??? + - $A0 - $87 - Hardware type + bit 1 - 1 - color + 0 - mono + - $A1 - $00 - ??? + - $A2 - $0C - Timer Control + bit 0 - Hblank Timer on/off + bit 1 - Hblank Timer Mode + 0 - One Shot + 1 - Auto Preset + bit 2 - Vblank Timer(1/75s) on/off + bit 3 - Vblank Timer Mode + 0 - One Shot + 1 - Auto Preset + - $A3 - $00 - ??? + - $A4 - $00 - Hblank Timer 'frequency' + 0 = no HBLANK Interrupt + n = HBLANK Interrupt every n lines (???) + - $A5 - $00 - ^^^ + - $A6 - $4F - Vblank Timer 'frequency' + - $A7 - $FF - ^^^ + - $A8 - $00 - Hblank Counter - 1/12000s + - $A9 - $00 - Hblank Counter - 1/(12000>>8)s + - $AA - $00 - Vblank Counter - 1/75s + - $AB - $00 - Vblank Counter - 1/(75>>8)s + - $AC - $00 - ??? + - $AD - $00 - ??? + - $AE - $00 - ??? + - $AF - $00 - ??? + - $B0 - $00 - Interrupt Base + - $B1 - $DB - Communication byte + - $B2 - $00 - Interrupt enable + bit 7 - HBlank Timer + bit 6 - VBlank begin + bit 5 - VBlank Timer + bit 4 - Drawing line detection + bit 3 - Serial receive + bit 2 - RTC Alarm + bit 1 - Key press + bit 0 - Serial transmit + - $B3 - $00 - Communication direction + bit 7 - Recieve data interrupt generation + bit 6 - Connection Speed + 0 - 9600 bps + 1 - 38400 bps + bit 5 - Send data interrupt generation + bit 4 - ??? + bit 3 - ??? + bit 2 - Send Complete + bit 1 - Error + bit 0 - Recieve Complete + + write $00-$7f = read $00 + write $80-$bf = read $84 + write $c0-$cf = read $c4 + - $B4 - $00 - ??? + - $B5 - $40 - Controls + bits 4-7 : read/write - Select line of inputs to read + 0001 - read vertical cursors + 0010 - read hozizontal cursors + 0100 - read buttons + bits 0-3 : read only - Read the current state of the input lines (positive logic) after having written 10h,20h, or 40h. + Meaning of the bits when reading cursors: + bit 0 - cursor up + bit 1 - cursor right + bit 2 - cursor down + bit 3 - cursor left + Meaning of the bits when reading buttons: + bit 0 - ??? + bit 1 - START + bit 2 - A + bit 3 - B + - $B6 - $00 - Interrupt Acknowledge + bit 7 - HBlank Timer + bit 6 - VBlank begin + bit 5 - VBlank Timer + bit 4 - Drawing line detection + bit 3 - Serial receive + bit 2 - RTC Alarm + bit 1 - Key press + bit 0 - Serial transmit + - $B7 - $00 - ??? + - $B8 - $00 - ??? + - $B9 - $00 - ??? + - $BA - $01 - Internal EEPROM (?) Data + - $BB - $00 - ^^^ + - $BC - $42 - Internal EEPROM (?) Address (calculated probably Modulo EEPROM (1kbit?) size (mirroring for read/write)) + - $BD - $00 - ^^^ + - $BE - $83 - Internal EEPROM (?) Command + bit 7 - Initialize ? + bit 6 - Protect ? + bit 5 - Write + bit 4 - Read + bit 3 - ??? + bit 2 - ??? + bit 1 - Write Complete (Read only) + bit 0 - Read Complete (Read only) + - $BF - $00 - ??? + - $C0 - $2F - ROM Bank Base Selector for segments 4-$F + - $C1 - $3F - SRAM Bank selector (???) + - $C2 - $FF - BNK2SLCT - ROM Bank selector for segment 2 + - $C3 - $FF - BNK3SLCT - ROM Bank selector for segment 3 + - $C4 - $00 - EEPROM Data + - $C5 - $00 - ^^^ + - $C6 - $00 - 1kbit EEPROM (16bit*64) : + - bits 0-5 - address + - bits 6-7 - command : + 0 - Extended Comand Address bits 4-5 + 0 - Write Disable + 1 - Write All + 2 - Erase All + 3 - Write Enable + 1 - Write + 2 - Read + 3 - Erase + - 16 kbit EEPROM (16bit*1024) - bits 0-7 - address (low) + - $C7 - $00 - 1kbit EEPROM (16bit*64) : + bit 0 - Start + - 16 kbit EEPROM (16bit*1024) : + - bits 0-1 - address (high) + - bits 2-3 - command : + 0 - Extended Comand Address bits 0-1 + 0 - Write Disable + 1 - Write All + 2 - Erase All + 3 - Write Enable + 1 - Write + 2 - Read + 3 - Erase + - bit 4 - Start + - $C8 - $D1 - EEPROM Command : + bit 7 - Initialize ??? + bit 6 - Protect ??? + bit 5 - Write + bit 4 - Read + bit 3 - ??? + bit 2 - ??? + bit 1 - Write Complete (Read only) + bit 0 - Read Complete (Read only) + - $C9 - $D1 - ??? + - $CA - $D1 - RTC Command + Write : + - $10 - Reset + - $12 - ??? Alarm ??? + - $13 - ??? + - $14 - Set Time + - $15 - Get Time + Read: + - bit 7 - Ack [HACK = 1] + - $CB - $D1 - RTC Data + Write : + Sometimes $40 , and wait for bit 7 = 1 + After Command ($CA): + - $14 - 7 writes (all BCD): + - Year ( + 2000) + - Month + - Day + - Day Of Week + - Hour + - Min + - Sec + Read + After Command ($CA) : + - $13 - bit 7 - Ack [HACK = 1] + - $15 - 7 reads (all BCD) + - Year ( + 2000) + - Month + - Day + - Day Of Week + - Hour + - Min + - Sec + - $CC - $D1 - ??? + - $CD - $D1 - ??? + - $CE - $D1 - ??? + - $CF - $D1 - ??? + - $D0 - $D1 - ??? + - $D1 - $D1 - ??? + - $D2 - $D1 - ??? + - $D3 - $D1 - ??? + - $D4 - $D1 - ??? + - $D5 - $D1 - ??? + - $D6 - $D1 - ??? + - $D7 - $D1 - ??? + - $D8 - $D1 - ??? + - $D9 - $D1 - ??? + - $DA - $D1 - ??? + - $DB - $D1 - ??? + - $DC - $D1 - ??? + - $DD - $D1 - ??? + - $DE - $D1 - ??? + - $DF - $D1 - ??? + - $E0 - $D1 - ??? + - $E1 - $D1 - ??? + - $E2 - $D1 - ??? + - $E3 - $D1 - ??? + - $E4 - $D1 - ??? + - $E5 - $D1 - ??? + - $E6 - $D1 - ??? + - $E7 - $D1 - ??? + - $E8 - $D1 - ??? + - $E9 - $D1 - ??? + - $EA - $D1 - ??? + - $EB - $D1 - ??? + - $EC - $D1 - ??? + - $ED - $D1 - ??? + - $EE - $D1 - ??? + - $EF - $D1 - ??? + - $F0 - $D1 - ??? + - $F1 - $D1 - ??? + - $F2 - $D1 - ??? + - $F3 - $D1 - ??? + - $F4 - $D1 - ??? + - $F5 - $D1 - ??? + - $F6 - $D1 - ??? + - $F7 - $D1 - ??? + - $F8 - $D1 - ??? + - $F9 - $D1 - ??? + - $FA - $D1 - ??? + - $FB - $D1 - ??? + - $FC - $D1 - ??? + - $FD - $D1 - ??? + - $FE - $D1 - ??? + - $FF - $D1 - ??? diff --git a/Mednafen/mednafen/wswan/wswan.h b/Mednafen/mednafen/wswan/wswan.h new file mode 100644 index 0000000000..36c61f06dd --- /dev/null +++ b/Mednafen/mednafen/wswan/wswan.h @@ -0,0 +1,35 @@ +#ifndef __WSWAN_H +#define __WSWAN_H + +#include +#include +#include + +#include "interrupt.h" + +namespace MDFN_IEN_WSWAN +{ + +#define mBCD(value) (((value)/10)<<4)|((value)%10) + +extern uint32 WS_InDebug; +extern uint32 rom_size; +extern int wsc; + +enum +{ + WSWAN_SEX_MALE = 1, + WSWAN_SEX_FEMALE = 2 +}; + +enum +{ + WSWAN_BLOOD_A = 1, + WSWAN_BLOOD_B = 2, + WSWAN_BLOOD_O = 3, + WSWAN_BLOOD_AB = 4 +}; + +} + +#endif diff --git a/Mednafen/stubs.cpp b/Mednafen/stubs.cpp new file mode 100644 index 0000000000..3db55e7fa7 --- /dev/null +++ b/Mednafen/stubs.cpp @@ -0,0 +1,129 @@ +#include "mednafen/types.h" +#include "mednafen/git.h" +#include "mednafen/mednafen-driver.h" +#include "thread.h" + +#include +#include +#include + +void MDFND_Sleep(unsigned int time) +{ + usleep(time * 1000); +} + +void MDFND_DispMessage(char *str) +{ + //std::cerr << str; +} + +void MDFND_Message(const char *str) +{ + std::cerr << str; +} + +void MDFND_MidSync(const EmulateSpecStruct *) +{} + +void MDFND_PrintError(const char* err) +{ + std::cerr << err; +} + +void MDFND_MediaSetNotification(uint32 drive_idx, uint32 state_idx, uint32 media_idx, uint32 orientation_idx) +{} + +void MDFND_NetplayText(const char* text, bool NetEcho) +{} + +MDFN_Thread *MDFND_CreateThread(int (*fn)(void *), void *data) +{ + return (MDFN_Thread*)sthread_create((void (*)(void*))fn, data); +} + +void MDFND_SetMovieStatus(StateStatusStruct *) {} +void MDFND_SetStateStatus(StateStatusStruct *) {} + +void MDFND_WaitThread(MDFN_Thread *thr, int *val) +{ + sthread_join((sthread_t*)thr); + + if(val) + { + *val = 0; + std::cerr << "WaitThread relies on return value." << std::endl; + } +} + +void MDFND_KillThread(MDFN_Thread *) +{ + std::cerr << "Killing a thread is a BAD IDEA!" << std::endl; +} + +MDFN_Mutex *MDFND_CreateMutex() +{ + return (MDFN_Mutex*)slock_new(); +} + +void MDFND_DestroyMutex(MDFN_Mutex *lock) +{ + slock_free((slock_t*)lock); +} + +int MDFND_LockMutex(MDFN_Mutex *lock) +{ + slock_lock((slock_t*)lock); + return 0; +} + +int MDFND_UnlockMutex(MDFN_Mutex *lock) +{ + slock_unlock((slock_t*)lock); + return 0; +} + +MDFN_Cond* MDFND_CreateCond(void) +{ + return (MDFN_Cond*)scond_new(); +} + +void MDFND_DestroyCond(MDFN_Cond* cond) +{ + scond_free((scond_t*)cond); +} + +int MDFND_SignalCond(MDFN_Cond* cond) +{ + scond_signal((scond_t*)cond); + return 0; +} + +int MDFND_WaitCond(MDFN_Cond* cond, MDFN_Mutex* mutex) +{ + scond_wait((scond_t*)cond, (slock_t*)mutex); + return 0; +} + +void MDFND_SendData(const void*, uint32) {} +void MDFND_RecvData(void *, uint32) {} +void MDFND_NetplayText(const uint8*, bool) {} +void MDFND_NetworkClose() {} +int MDFND_NetworkConnect() { return 0; } + +uint32 MDFND_GetTime() +{ + static bool first = true; + static uint32_t start_ms; + + struct timeval val; + gettimeofday(&val, NULL); + uint32_t ms = val.tv_sec * 1000 + val.tv_usec / 1000; + + if(first) + { + start_ms = ms; + first = false; + } + + return ms - start_ms; +} diff --git a/Mednafen/thread.cpp b/Mednafen/thread.cpp new file mode 100644 index 0000000000..af9d068bf8 --- /dev/null +++ b/Mednafen/thread.cpp @@ -0,0 +1,277 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include "thread.h" +#include + +#if defined(_WIN32) && !defined(_XBOX) +#define WIN32_LEAN_AND_MEAN +#include +#elif defined(_XBOX) +#include +#else +#include +#include +#endif + +struct thread_data +{ + void (*func)(void*); + void *userdata; +}; + +#ifdef _WIN32 + +struct sthread +{ + HANDLE thread; +}; + +static DWORD CALLBACK thread_wrap(void *data_) +{ + struct thread_data *data = (struct thread_data*)data_; + data->func(data->userdata); + free(data); + return 0; +} + +sthread_t *sthread_create(void (*thread_func)(void*), void *userdata) +{ + sthread_t *thread = (sthread_t*)calloc(1, sizeof(*thread)); + if (!thread) + return NULL; + + struct thread_data *data = (struct thread_data*)calloc(1, sizeof(*data)); + if (!data) + { + free(thread); + return NULL; + } + + data->func = thread_func; + data->userdata = userdata; + + thread->thread = CreateThread(NULL, 0, thread_wrap, data, 0, NULL); + if (!thread->thread) + { + free(data); + free(thread); + return NULL; + } + + return thread; +} + +void sthread_join(sthread_t *thread) +{ + WaitForSingleObject(thread->thread, INFINITE); + CloseHandle(thread->thread); + free(thread); +} + +struct slock +{ + CRITICAL_SECTION lock; +}; + +slock_t *slock_new(void) +{ + slock_t *lock = (slock_t*)calloc(1, sizeof(*lock)); + if (!lock) + return NULL; + + InitializeCriticalSection(&lock->lock); + return lock; +} + +void slock_free(slock_t *lock) +{ + DeleteCriticalSection(&lock->lock); + free(lock); +} + +void slock_lock(slock_t *lock) +{ + EnterCriticalSection(&lock->lock); +} + +void slock_unlock(slock_t *lock) +{ + LeaveCriticalSection(&lock->lock); +} + +struct scond +{ + HANDLE event; +}; + +scond_t *scond_new(void) +{ + scond_t *cond = (scond_t*)calloc(1, sizeof(*cond)); + if (!cond) + return NULL; + + cond->event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!cond->event) + { + free(cond); + return NULL; + } + + return cond; +} + +void scond_wait(scond_t *cond, slock_t *lock) +{ + WaitForSingleObject(cond->event, 0); + slock_unlock(lock); + + WaitForSingleObject(cond->event, INFINITE); + + slock_lock(lock); +} + +void scond_signal(scond_t *cond) +{ + SetEvent(cond->event); +} + +void scond_free(scond_t *cond) +{ + CloseHandle(cond->event); + free(cond); +} + +#else + +struct sthread +{ + pthread_t id; +}; + +static void *thread_wrap(void *data_) +{ + struct thread_data *data = (struct thread_data*)data_; + data->func(data->userdata); + free(data); + return NULL; +} + +sthread_t *sthread_create(void (*thread_func)(void*), void *userdata) +{ + sthread_t *thr = (sthread_t*)calloc(1, sizeof(*thr)); + if (!thr) + return NULL; + + struct thread_data *data = (struct thread_data*)calloc(1, sizeof(*data)); + if (!data) + { + free(thr); + return NULL; + } + + data->func = thread_func; + data->userdata = userdata; + + if (pthread_create(&thr->id, NULL, thread_wrap, data) < 0) + { + free(data); + free(thr); + return NULL; + } + + return thr; +} + +void sthread_join(sthread_t *thread) +{ + pthread_join(thread->id, NULL); + free(thread); +} + +struct slock +{ + pthread_mutex_t lock; +}; + +slock_t *slock_new(void) +{ + slock_t *lock = (slock_t*)calloc(1, sizeof(*lock)); + if (!lock) + return NULL; + + if (pthread_mutex_init(&lock->lock, NULL) < 0) + { + free(lock); + return NULL; + } + + return lock; +} + +void slock_free(slock_t *lock) +{ + pthread_mutex_destroy(&lock->lock); + free(lock); +} + +void slock_lock(slock_t *lock) +{ + pthread_mutex_lock(&lock->lock); +} + +void slock_unlock(slock_t *lock) +{ + pthread_mutex_unlock(&lock->lock); +} + +struct scond +{ + pthread_cond_t cond; +}; + +scond_t *scond_new(void) +{ + scond_t *cond = (scond_t*)calloc(1, sizeof(*cond)); + if (!cond) + return NULL; + + if (pthread_cond_init(&cond->cond, NULL) < 0) + { + free(cond); + return NULL; + } + + return cond; +} + +void scond_free(scond_t *cond) +{ + pthread_cond_destroy(&cond->cond); + free(cond); +} + +void scond_wait(scond_t *cond, slock_t *lock) +{ + pthread_cond_wait(&cond->cond, &lock->lock); +} + +void scond_signal(scond_t *cond) +{ + pthread_cond_signal(&cond->cond); +} + +#endif + diff --git a/Mednafen/thread.h b/Mednafen/thread.h new file mode 100644 index 0000000000..96b16069ae --- /dev/null +++ b/Mednafen/thread.h @@ -0,0 +1,46 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2012 - Hans-Kristian Arntzen + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef THREAD_H__ +#define THREAD_H__ + +// Implements the bare minimum needed for RetroArch. :) + +typedef struct sthread sthread_t; + +// Threading +sthread_t *sthread_create(void (*thread_func)(void*), void *userdata); +void sthread_join(sthread_t *thread); + +// Mutexes +typedef struct slock slock_t; + +slock_t *slock_new(void); +void slock_free(slock_t *lock); + +void slock_lock(slock_t *lock); +void slock_unlock(slock_t *lock); + +// Condition variables. +typedef struct scond scond_t; + +scond_t *scond_new(void); +void scond_free(scond_t *cond); + +void scond_wait(scond_t *cond, slock_t *lock); +void scond_signal(scond_t *cond); + +#endif + diff --git a/Mednafen/version.plist b/Mednafen/version.plist new file mode 100644 index 0000000000..3fd75920c6 --- /dev/null +++ b/Mednafen/version.plist @@ -0,0 +1,18 @@ + + + + + BuildVersion + 3 + CFBundleVersion + 1.0 + ProductBuildVersion + 9M2729 + ProjectName + DevToolsWizardTemplates + SourceVersion + 11600000 + OEProjectURL + http://findout.com + + diff --git a/PVAtari800/.gitignore b/PVAtari800/.gitignore new file mode 100644 index 0000000000..4c44ceb05c --- /dev/null +++ b/PVAtari800/.gitignore @@ -0,0 +1,19 @@ +# Xcode +*.DS_Store +OEBuildVersion.h +*/build/* +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +*.xcworkspace +!OpenEmu.xcworkspace +!default.xcworkspace +xcuserdata +profile +*.moved-aside +icon? diff --git a/PVAtari800/Atari800Core/Atari800-Info.plist b/PVAtari800/Atari800Core/Atari800-Info.plist new file mode 100644 index 0000000000..87003334e3 --- /dev/null +++ b/PVAtari800/Atari800Core/Atari800-Info.plist @@ -0,0 +1,98 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 3.1.1 + NSPrincipalClass + OEGameCoreController + OEGameCoreClass + ATR800GameCore + OEGameCoreOptions + + openemu.system.5200 + + OEGameCoreRequiresFiles + + OERequiredFiles + + + Description + Atari 5200 BIOS + MD5 + 281f20ea4320404ec820fb7ec0693b38 + Name + 5200.rom + Size + 2048 + + + + openemu.system.atari8bit + + OEGameCoreRequiresFiles + + OERequiredFiles + + + Description + Atari XL/XE BASIC rev. C ROM + MD5 + 0bac0c6a50104045d902df4503a4c30b + Name + ataribas.rom + Size + 8192 + + + Description + Atari 400/800 OS rev. B ROM (known incorrect dump) + MD5 + a3e8d617c95d08031fe1b20d541434b2 + Name + atariosb.rom + Size + 10240 + + + Description + Atari XL/XE OS rev. 2 ROM + MD5 + 06daac977823773a3eea3422fd26a703 + Name + atarixl.rom + Size + 16384 + + + + + OEGameCorePlayerCount + 1 + OEProjectURL + http://sourceforge.net/projects/atari800/ + OESystemIdentifiers + + openemu.system.5200 + openemu.system.atari8bit + + SUEnableAutomaticChecks + 1 + SUFeedURL + https://raw.github.com/OpenEmu/OpenEmu-Update/master/atari800_appcast.xml + + diff --git a/PVAtari800/Atari800Core/Source/ATR800GameCore.h b/PVAtari800/Atari800Core/Source/ATR800GameCore.h new file mode 100644 index 0000000000..9837824508 --- /dev/null +++ b/PVAtari800/Atari800Core/Source/ATR800GameCore.h @@ -0,0 +1,35 @@ +/* + Copyright (c) 2011, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import +#import + +@class OERingBuffer; + +__attribute__((visibility("default"))) +@interface ATR800GameCore : PVEmulatorCore +@end diff --git a/PVAtari800/Atari800Core/Source/ATR800GameCore.m b/PVAtari800/Atari800Core/Source/ATR800GameCore.m new file mode 100644 index 0000000000..5aaed5eacf --- /dev/null +++ b/PVAtari800/Atari800Core/Source/ATR800GameCore.m @@ -0,0 +1,996 @@ +/* + Copyright (c) 2015, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "ATR800GameCore.h" + +#import +#import +#import +#import + +#import "PVA8SystemResponderClient.h" +#import "PV5200SystemResponderClient.h" + +// ataria800 project includes +#include "afile.h" +#include "akey.h" +#include "antic.h" +#include "atari.h" +#include "cartridge.h" +#include "cassette.h" +#include "cfg.h" +#include "colours.h" +#include "colours_ntsc.h" +#include "config.h" +#include "devices.h" +#include "gtia.h" +#include "ide.h" +#include "input.h" +#include "memory.h" +#include "pbi.h" +#include "pia.h" +#include "platform.h" +#include "pokey.h" +#include "pokeysnd.h" +#include "rtime.h" +#include "sio.h" +#include "sound.h" +#include "statesav.h" +#include "sysrom.h" +#include "ui.h" + +int UI_is_active = FALSE; +int UI_alt_function = -1; +int UI_n_atari_files_dir = 0; +int UI_n_saved_files_dir = 0; +char UI_atari_files_dir[UI_MAX_DIRECTORIES][FILENAME_MAX]; +char UI_saved_files_dir[UI_MAX_DIRECTORIES][FILENAME_MAX]; + +typedef struct { + int up; + int down; + int left; + int right; + int fire; + int fire2; + int start; + int pause; + int reset; +} ATR5200ControllerState; + +@interface ATR800GameCore () +{ + uint8_t *_videoBuffer; + uint8_t *_soundBuffer; + ATR5200ControllerState controllerStates[4]; +} +- (void)renderToBuffer; +- (ATR5200ControllerState)controllerStateForPlayer:(NSUInteger)playerNum; +//int16_t convertSample(uint8_t); +@end + +__weak static ATR800GameCore * _currentCore; + +//void ATR800WriteSoundBuffer(uint8_t *buffer, unsigned int len); + +@implementation ATR800GameCore + +- (id)init +{ + if((self = [super init])) + { + _videoBuffer = calloc(1, Screen_WIDTH * Screen_HEIGHT * 4); + _soundBuffer = calloc(1, 2048); // 4096 if stereo? + } + + _currentCore = self; + + return self; +} + +- (void)dealloc +{ + Atari800_Exit(false); + free(_videoBuffer); + free(_soundBuffer); +} + +#pragma mark - Execution + +// TODO: Make me real +-(NSString*)systemIdentifier { + return @"com.provenance.5200"; +} + +-(NSString*)biosDirectoryPath { + return self.BIOSPath; +} + +- (BOOL)loadFileAtPath:(NSString *)path error:(NSError **)error +{ + // Set the default palette (NTSC) + NSString *palettePath = [[[NSBundle bundleForClass:[self class]] resourcePath] stringByAppendingPathComponent:@"Default.act"]; + strcpy(COLOURS_NTSC_external.filename, [palettePath UTF8String]); + COLOURS_NTSC_external.loaded = TRUE; + + Atari800_tv_mode = Atari800_TV_NTSC; + + /* It is necessary because of the CARTRIDGE_ColdStart (there must not be the + registry-read value available at startup) */ + CARTRIDGE_main.type = CARTRIDGE_NONE; + + Colours_PreInitialise(); + + if([[self systemIdentifier] isEqualToString:@"com.provenance.5200"]) + { + // Set 5200.rom BIOS path + char biosFileName[2048]; + NSString *biosDirectory = [self biosDirectoryPath]; + NSString *boisPath = [biosDirectory stringByAppendingPathComponent:@"5200.rom"]; + + strcpy(biosFileName, [boisPath UTF8String]); + + SYSROM_SetPath(biosFileName, 1, SYSROM_5200); + + // Setup machine type + Atari800_SetMachineType(Atari800_MACHINE_5200); + MEMORY_ram_size = 16; + } + else if([[self systemIdentifier] isEqualToString:@"com.provenance.atari8bit"]) + { + char basicFileName[2048], osbFileName[2048], xlFileName[2048]; + NSString *biosPath = [self biosDirectoryPath]; + strcpy(basicFileName, [[biosPath stringByAppendingPathComponent:@"ataribas.rom"] UTF8String]); + strcpy(osbFileName, [[biosPath stringByAppendingPathComponent:@"atariosb.rom"] UTF8String]); + strcpy(xlFileName, [[biosPath stringByAppendingPathComponent:@"atarixl.rom"] UTF8String]); + + SYSROM_SetPath(basicFileName, 1, SYSROM_BASIC_C); + SYSROM_SetPath(osbFileName, 2, SYSROM_B_NTSC, SYSROM_800_CUSTOM); + SYSROM_SetPath(xlFileName, 1, SYSROM_BB01R2); + + // Setup machine type as Atari 130XE + Atari800_SetMachineType(Atari800_MACHINE_XLXE); + MEMORY_ram_size = 128; + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + + // Disable on-screen disk activity indicator + Screen_show_disk_led = FALSE; + } + + int arg = 4; + int *argc = &arg; + char *argv[] = {"", "-sound", "-audio8", "-dsprate 44100"}; + + if ( +#if !defined(BASIC) && !defined(CURSES_BASIC) + !Colours_Initialise(argc, argv) || +#endif + !Devices_Initialise(argc, argv) + || !RTIME_Initialise(argc, argv) +#ifdef IDE + || !IDE_Initialise(argc, argv) +#endif + || !SIO_Initialise (argc, argv) + || !CASSETTE_Initialise(argc, argv) + || !PBI_Initialise(argc,argv) +#ifdef VOICEBOX + || !VOICEBOX_Initialise(argc, argv) +#endif +#ifndef BASIC + || !INPUT_Initialise(argc, argv) +#endif +#ifdef XEP80_EMULATION + || !XEP80_Initialise(argc, argv) +#endif +#ifdef AF80 + || !AF80_Initialise(argc, argv) +#endif +#if SUPPORTS_CHANGE_VIDEOMODE + || !VIDEOMODE_Initialise(argc, argv) +#endif +#ifndef DONT_DISPLAY + /* Platform Specific Initialisation */ + || !PLATFORM_Initialise(argc, argv) +#endif + || !Screen_Initialise(argc, argv) + /* Initialise Custom Chips */ + || !ANTIC_Initialise(argc, argv) + || !GTIA_Initialise(argc, argv) + || !PIA_Initialise(argc, argv) + || !POKEY_Initialise(argc, argv) + ) { + NSLog(@"Failed to initialize part of atari800"); + return NO; + } + + if(!Atari800_InitialiseMachine()) { + NSLog(@"** Failed to initialize machine"); + return NO; + } + + // Open and try to automatically detect file type, not 100% accurate + if(!AFILE_OpenFile([path UTF8String], 1, 1, FALSE)) + { + NSLog(@"Failed to open file"); + return NO; + } + + // TODO - still need this? + /* Install requested ROM cartridge */ + if (CARTRIDGE_main.type == CARTRIDGE_UNKNOWN) + { + CARTRIDGE_SetType(&CARTRIDGE_main, UI_SelectCartType(CARTRIDGE_main.size)); + } + + //POKEYSND_Init(POKEYSND_FREQ_17_EXACT, 44100, 1, POKEYSND_BIT16); + + return YES; +} + +- (void)executeFrame +{ + if (self.controller1 || self.controller2) { + [self pollControllers]; + } + + Atari800_Frame(); + + unsigned int size = 44100 / (Atari800_tv_mode == Atari800_TV_NTSC ? 59.9 : 50) * 2; + + Sound_Callback(_soundBuffer, size); + + //NSLog(@"Sound_desired.channels %d frag_frames %d freq %d sample_size %d", Sound_desired.channels, Sound_desired.frag_frames, Sound_desired.freq, Sound_desired.sample_size); + //NSLog(@"Sound_out.channels %d frag_frames %d freq %d sample_size %d", Sound_out.channels, Sound_out.frag_frames, Sound_out.freq, Sound_out.sample_size); + + [[self ringBufferAtIndex:0] write:_soundBuffer maxLength:size]; + + [self renderToBuffer]; +} + +- (void)resetEmulation +{ + Atari800_Warmstart(); +} + +- (void)stopEmulation +{ + Atari800_Exit(false); + [super stopEmulation]; +} + +- (NSTimeInterval)frameInterval +{ + return Atari800_tv_mode == Atari800_TV_NTSC ? Atari800_FPS_NTSC : Atari800_FPS_PAL; +} + +#pragma mark - Video + +- (const void *)videoBuffer +{ + return _videoBuffer; +} + +- (CGSize)bufferSize +{ + return CGSizeMake(Screen_WIDTH, Screen_HEIGHT); +} + +- (CGRect)screenRect +{ + return CGRectMake(24, 0, Screen_WIDTH, Screen_HEIGHT); +} + +- (CGSize)aspectSize +{ + // TODO: fix PAR + //return CGSizeMake(336 * (6.0 / 7.0), 240); + return CGSizeMake(Screen_WIDTH, Screen_HEIGHT); +} + +- (GLenum)pixelFormat +{ + return GL_BGRA; +} + +- (GLenum)pixelType +{ + return GL_UNSIGNED_BYTE; +} + +- (GLenum)internalPixelFormat +{ + return GL_RGBA; +} + +#pragma mark - Audio + +- (double)audioSampleRate +{ + return 44100; +} + +- (NSUInteger)channelCount +{ + return 1; +} + +#pragma mark - Save States +- (BOOL)saveStateToFileAtPath:(NSString *)fileName { + return StateSav_SaveAtariState([fileName UTF8String], "wb", TRUE); +} + +- (void)saveStateToFileAtPath:(NSString *)fileName completionHandler:(void (^)(BOOL, NSError *))block +{ + BOOL success = StateSav_SaveAtariState([fileName UTF8String], "wb", TRUE); + if(block) block(success==YES, nil); +} + +- (BOOL)loadStateFromFileAtPath:(NSString *)fileName { + return StateSav_ReadAtariState([fileName UTF8String], "rb"); +} + +- (void)loadStateFromFileAtPath:(NSString *)fileName completionHandler:(void (^)(BOOL, NSError *))block +{ + BOOL success = StateSav_ReadAtariState([fileName UTF8String], "rb"); + if(block) block(success==YES, nil); +} + +#pragma mark - Input + +- (oneway void)mouseMovedAtPoint:(CGPoint)point +{ + +} + +- (oneway void)leftMouseDownAtPoint:(CGPoint)point +{ + +} + +- (oneway void)leftMouseUp +{ + +} + +- (oneway void)rightMouseDownAtPoint:(CGPoint)point +{ + +} + +- (oneway void)rightMouseUp +{ + +} + +//- (oneway void)keyDown:(unsigned short)keyHIDCode characters:(NSString *)characters charactersIgnoringModifiers:(NSString *)charactersIgnoringModifiers flags:(NSEventModifierFlags)modifierFlags +//{ + +//} + +//- (oneway void)keyUp:(unsigned short)keyHIDCode characters:(NSString *)characters charactersIgnoringModifiers:(NSString *)charactersIgnoringModifiers flags:(NSEventModifierFlags)modifierFlags +//{ + +//} + +- (oneway void)didPushA8Button:(PVA8Button)button forPlayer:(NSUInteger)player +{ + player--; + + switch (button) + { + case PVA8ButtonFire: + controllerStates[player].fire = 1; + break; + case PVA8ButtonUp: + controllerStates[player].up = 1; + //INPUT_key_code = AKEY_UP ^ AKEY_CTRL; + //INPUT_key_code = INPUT_STICK_FORWARD; + break; + case PVA8ButtonDown: + controllerStates[player].down = 1; + break; + case PVA8ButtonLeft: + controllerStates[player].left = 1; + break; + case PVA8ButtonRight: + controllerStates[player].right = 1; + break; + default: + break; + } +} + +- (oneway void)didReleaseA8Button:(PVA8Button)button forPlayer:(NSUInteger)player +{ + player--; + + switch (button) + { + case PVA8ButtonFire: + controllerStates[player].fire = 0; + break; + case PVA8ButtonUp: + controllerStates[player].up = 0; + //INPUT_key_code = AKEY_UP ^ AKEY_CTRL; + //INPUT_key_code = INPUT_STICK_FORWARD; + break; + case PVA8ButtonDown: + controllerStates[player].down = 0; + break; + case PVA8ButtonLeft: + controllerStates[player].left = 0; + break; + case PVA8ButtonRight: + controllerStates[player].right = 0; + break; + default: + break; + } +} + +- (oneway void)didPush5200Button:(PV5200Button)button forPlayer:(NSUInteger)player +{ + switch (button) + { + case PV5200ButtonFire1: + controllerStates[player].fire = 1; + break; + case PV5200ButtonFire2: + INPUT_key_shift = 1; //AKEY_SHFTCTRL + break; + case PV5200ButtonUp: + controllerStates[player].up = 1; + //INPUT_key_code = AKEY_UP ^ AKEY_CTRL; + //INPUT_key_code = INPUT_STICK_FORWARD; + break; + case PV5200ButtonDown: + controllerStates[player].down = 1; + break; + case PV5200ButtonLeft: + controllerStates[player].left = 1; + break; + case PV5200ButtonRight: + controllerStates[player].right = 1; + break; + case PV5200ButtonStart: +// controllerStates[player].start = 1; + INPUT_key_code = AKEY_5200_START; + break; + case PV5200ButtonPause: +// controllerStates[player].pause = 1; + INPUT_key_code = AKEY_5200_PAUSE; + break; + case PV5200ButtonReset: +// controllerStates[player].reset = 1; + INPUT_key_code = AKEY_5200_RESET; + break; + case PV5200Button1: + INPUT_key_code = AKEY_5200_1; + break; + case PV5200Button2: + INPUT_key_code = AKEY_5200_2; + break; + case PV5200Button3: + INPUT_key_code = AKEY_5200_3; + break; + case PV5200Button4: + INPUT_key_code = AKEY_5200_4; + break; + case PV5200Button5: + INPUT_key_code = AKEY_5200_5; + break; + case PV5200Button6: + INPUT_key_code = AKEY_5200_6; + break; + case PV5200Button7: + INPUT_key_code = AKEY_5200_7; + break; + case PV5200Button8: + INPUT_key_code = AKEY_5200_8; + break; + case PV5200Button9: + INPUT_key_code = AKEY_5200_9; + break; + case PV5200Button0: + INPUT_key_code = AKEY_5200_0; + break; + case PV5200ButtonAsterisk: + INPUT_key_code = AKEY_5200_ASTERISK; + break; + case PV5200ButtonPound: + INPUT_key_code = AKEY_5200_HASH; + break; + default: + break; + } +} + +- (oneway void)didRelease5200Button:(PV5200Button)button forPlayer:(NSUInteger)player +{ + switch (button) + { + case PV5200ButtonFire1: + controllerStates[player].fire = 0; + break; + case PV5200ButtonFire2: + INPUT_key_shift = 0; + break; + case PV5200ButtonUp: + controllerStates[player].up = 0; + //INPUT_key_code = 0xff; + break; + case PV5200ButtonDown: + controllerStates[player].down = 0; + break; + case PV5200ButtonLeft: + controllerStates[player].left = 0; + break; + case PV5200ButtonRight: + controllerStates[player].right = 0; + break; + case PV5200ButtonStart: + INPUT_key_code = AKEY_NONE; + break; + case PV5200ButtonPause: + INPUT_key_code = AKEY_NONE; + break; + case PV5200ButtonReset: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button1: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button2: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button3: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button4: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button5: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button6: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button7: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button8: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button9: + INPUT_key_code = AKEY_NONE; + break; + case PV5200Button0: + INPUT_key_code = AKEY_NONE; + break; + case PV5200ButtonAsterisk: + INPUT_key_code = AKEY_NONE; + break; + case PV5200ButtonPound: + INPUT_key_code = AKEY_NONE; + break; + default: + break; + } +} + +- (void)pollControllers { + for (NSInteger playerIndex = 0; playerIndex < 2; playerIndex++) { + GCController *controller = nil; + + if (self.controller1 && playerIndex == 0) { + controller = self.controller1; + } + else if (self.controller2 && playerIndex == 1) + { + controller = self.controller2; + } + + if ([controller extendedGamepad]) { + GCExtendedGamepad *gamepad = [controller extendedGamepad]; + GCControllerDirectionPad *dpad = [gamepad dpad]; + + // DPAD + controllerStates[playerIndex].up = dpad.up.isPressed; + controllerStates[playerIndex].down = dpad.down.isPressed; + controllerStates[playerIndex].left = dpad.left.isPressed; + controllerStates[playerIndex].right = dpad.right.isPressed; + + // Buttons + // Fire 1 + controllerStates[playerIndex].fire = gamepad.buttonA.isPressed || gamepad.buttonX.isPressed; + + // Fire 2 + INPUT_key_shift = gamepad.buttonB.isPressed || gamepad.buttonY.isPressed; + + // The following buttons are on a shared bus. Only one at a time. + // If none, state is reset. Since only one button can be registered + // at a time, there has to be an preference of order. + + // Reset + if (gamepad.leftTrigger.isPressed) { + INPUT_key_code = AKEY_5200_START; + } + else if (gamepad.rightTrigger.isPressed) { + INPUT_key_code = AKEY_5200_PAUSE; + } + else if (gamepad.leftShoulder.isPressed || gamepad.rightShoulder.isPressed) { + INPUT_key_code = AKEY_5200_RESET; + } else { + INPUT_key_code = AKEY_NONE; + } + } else if ([controller gamepad]) { + GCGamepad *gamepad = [controller gamepad]; + GCControllerDirectionPad *dpad = [gamepad dpad]; + + // DPAD + controllerStates[playerIndex].up = dpad.up.isPressed; + controllerStates[playerIndex].down = dpad.down.isPressed; + controllerStates[playerIndex].left = dpad.left.isPressed; + controllerStates[playerIndex].right = dpad.right.isPressed; + + // Buttons + // Fire 1 + controllerStates[playerIndex].fire = gamepad.buttonA.isPressed || gamepad.buttonX.isPressed; + + // Fire 2 + INPUT_key_shift = gamepad.buttonB.isPressed; + + // The following buttons are on a shared bus. Only one at a time. + // If none, state is reset. Since only one button can be registered + // at a time, there has to be an preference of order. + + // Reset + if (gamepad.leftShoulder.isPressed) { + INPUT_key_code = AKEY_5200_START; + } + else if (gamepad.rightShoulder.isPressed) { + INPUT_key_code = AKEY_5200_PAUSE; + } + else if (gamepad.buttonY.isPressed) { + INPUT_key_code = AKEY_5200_RESET; + } else { + INPUT_key_code = AKEY_NONE; + } + } +#if TARGET_OS_TV + else if ([controller microGamepad]) { + GCMicroGamepad *gamepad = [controller microGamepad]; + GCControllerDirectionPad *dpad = [gamepad dpad]; + + // DPAD + controllerStates[playerIndex].up = dpad.up.value > 0.5; + controllerStates[playerIndex].down = dpad.down.value > 0.5; + controllerStates[playerIndex].left = dpad.left.value > 0.5; + controllerStates[playerIndex].right = dpad.right.value > 0.5; + + //Fire + controllerStates[playerIndex].fire = gamepad.buttonA.isPressed; + + // Start + INPUT_key_code = gamepad.buttonX.isPressed ? AKEY_5200_START : AKEY_NONE; + } +#endif + } +} + + +#pragma mark - Misc Helper Methods + +- (void)renderToBuffer +{ + int i, j; + UBYTE *source = (UBYTE *)(Screen_atari); + UBYTE *destination = _videoBuffer; + for (i = 0; i < Screen_HEIGHT; i++) + { + for (j = 0; j < Screen_WIDTH; j++) + { + UBYTE r,g,b; + r = Colours_GetR(*source); + g = Colours_GetG(*source); + b = Colours_GetB(*source); + *destination++ = b; + *destination++ = g; + *destination++ = r; + *destination++ = 0xff; + source++; + } + // source += Screen_WIDTH - ATARI_VISIBLE_WIDTH; + } +} + +- (ATR5200ControllerState)controllerStateForPlayer:(NSUInteger)playerNum +{ + ATR5200ControllerState state = {0,0,0,0,0,0,0,0}; + if(playerNum < 4) { + state = controllerStates[playerNum]; + } + return state; +} + +// Atari800 platform calls + +int UI_SelectCartType(int k) +{ + NSLog(@"Cart size: %d", k); + + if([[_currentCore systemIdentifier] isEqualToString:@"com.provenance.atari8bit"]) + { + // TODO: improve detection using MD5 lookup + switch (k) + { + case 2: return CARTRIDGE_STD_2; + case 4: return CARTRIDGE_STD_4; + case 8: return CARTRIDGE_STD_8; + case 16: return CARTRIDGE_STD_16; + case 32: return CARTRIDGE_XEGS_32; + case 40: return CARTRIDGE_BBSB_40; + case 64: return CARTRIDGE_XEGS_07_64; + case 128: return CARTRIDGE_XEGS_128; + case 256: return CARTRIDGE_XEGS_256; + case 512: return CARTRIDGE_XEGS_512; + case 1024: return CARTRIDGE_ATMAX_1024; + default: + return CARTRIDGE_NONE; + } + } + + if([[_currentCore systemIdentifier] isEqualToString:@"com.provenance.5200"]) + { + NSArray *One_Chip_16KB = @[@"a47fcb4eedab9418ea098bb431a407aa", // A.E. (Proto) + @"45f8841269313736489180c8ec3e9588", // Activision Decathlon, The + @"1913310b1e44ad7f3b90aeb16790a850", // Beamrider + @"f8973db8dc272c2e5eb7b8dbb5c0cc3b", // BerZerk + @"e0b47a17fa6cd9d6addc1961fca43414", // Blaster + @"8123393ae9635f6bc15ddc3380b04328", // Blue Print + @"3ff7707e25359c9bcb2326a5d8539852", // Choplifter! + @"7c27d225a13e178610babf331a0759c0", // David Crane's Pitfall II - Lost Caverns + @"2bb63d65efc8682bc4dfac0fd0a823be", // Final Legacy (Proto) + @"f8f0e0a6dc2ffee41b2a2dd736cba4cd", // H.E.R.O. + @"46264c86edf30666e28553bd08369b83", // Last Starfighter, The (Proto) + @"1cd67468d123219201702eadaffd0275", // Meteorites + @"84d88bcdeffee1ab880a5575c6aca45e", // Millipede (Proto) + @"d859bff796625e980db1840f15dec4b5", // Miner 2049er Starring Bounty Bob + @"296e5a3a9efd4f89531e9cf0259c903d", // Moon Patrol + @"099706cedd068aced7313ffa371d7ec3", // Quest for Quintana Roo + @"5dba5b478b7da9fd2c617e41fb5ccd31", // Robotron 2084 + @"802a11dfcba6229cc2f93f0f3aaeb3aa", // Space Shuttle - A Journey Into Space + @"7dab86351fe78c2f529010a1ac83a4cf", // Super Pac-Man (Proto) + @"496b6a002bc7d749c02014f7ec6c303c", // Tempest (Proto) + @"33053f432f9c4ad38b5d02d1b485b5bd", // Track and Field (Proto) + @"560b68b7f83077444a57ebe9f932905a", // Wizard of Wor + @"dc45af8b0996cb6a94188b0be3be2e17" // Zone Ranger + ]; + + NSArray *Two_Chip_16KB = @[@"bae7c1e5eb04e19ef8d0d0b5ce134332", // Astro Chase + @"78ccbcbb6b4d17b749ebb012e4878008", // Atari PAM Diagnostics (v2.0) + @"32a6d0de4f1728dee163eb2d4b3f49f1", // Atari PAM Diagnostics (v2.3) + @"8576867c2cfc965cf152be0468f684a7", // Battlezone (Proto) + @"a074a1ff0a16d1e034ee314b85fa41e9", // Buck Rogers - Planet of Zoom + @"261702e8d9acbf45d44bb61fd8fa3e17", // Centipede + @"5720423ebd7575941a1586466ba9beaf", // Congo Bongo + @"1a64edff521608f9f4fa9d7bdb355087", // Countermeasure + @"27d5f32b0d46d3d80773a2b505f95046", // Defender + @"3abd0c057474bad46e45f3d4e96eecee", // Dig Dug + @"14bd9a0423eafc3090333af916cfbce6", // Frisky Tom (Proto) + @"d8636222c993ca71ca0904c8d89c4411", // Frogger II - Threeedeep! + @"dacc0a82e8ee0c086971f9d9bac14127", // Gyruss + @"936db7c08e6b4b902c585a529cb15fc5", // James Bond 007 + @"25cfdef5bf9b126166d5394ae74a32e7", // Joust + @"bc748804f35728e98847da6cdaf241a7", // Jr. Pac-Man (Proto) + @"834067fdce5d09b86741e41e7e491d6c", // Jungle Hunt + @"796d2c22f8205fb0ce8f1ee67c8eb2ca", // Kangaroo + @"d0a1654625dbdf3c6b8480c1ed17137f", // Looney Tunes Hotel (Proto) + @"24348dd9287f54574ccc40ee40d24a86", // Microgammon SB (Proto) + @"69d472a79f404e49ad2278df3c8a266e", // Miniature Golf (Proto) + @"694897cc0d98fcf2f59eef788881f67d", // Montezuma's Revenge featuring Panama Joe + @"ef9a920ffdf592546499738ee911fc1e", // Ms. Pac-Man + @"f1a4d62d9ba965335fa13354a6264623", // Pac-Man + @"fd0cbea6ad18194be0538844e3d7fdc9", // Pole Position + @"dd4ae6add63452aafe7d4fa752cd78ca", // Popeye + @"9b7d9d874a93332582f34d1420e0f574", // Qix + @"a71bfb11676a4e4694af66e311721a1b", // RealSports Basketball (82-11-05) (Proto) + @"022c47b525b058796841134bb5c75a18", // RealSports Football + @"3074fad290298d56c67f82e8588c5a8b", // RealSports Soccer + @"7e683e571cbe7c77f76a1648f906b932", // RealSports Tennis + @"ddf7834a420f1eaae20a7a6255f80a99", // Road Runner (Proto) + @"6e24e3519458c5cb95a7fd7711131f8d", // Space Dungeon + @"993e3be7199ece5c3e03092e3b3c0d1d", // Sport Goofy (Proto) + @"e2d3a3e52bb4e3f7e489acd9974d68e2", // Star Raiders + @"c959b65be720a03b5479650a3af5a511", // Star Trek - Strategic Operations Simulator + @"00beaa8405c7fb90d86be5bb1b01ea66", // Star Wars - The Arcade Game + @"595703dc459cd51fed6e2a191c462969", // Stargate (Proto) + @"4f6c58c28c41f31e3a1515fe1e5d15af" // Xari Arena (Proto) + ]; + + // Set 5200 cart type to load based on size + switch (k) + { + case 4: return CARTRIDGE_5200_4; + case 8: return CARTRIDGE_5200_8; + case 16: + // Determine if 16KB cart is one-chip (NS_16) or two-chip (EE_16) + if([One_Chip_16KB containsObject:[_currentCore.romMD5 lowercaseString]]) + return CARTRIDGE_5200_NS_16; + else + return CARTRIDGE_5200_EE_16; + case 32: return CARTRIDGE_5200_32; + case 40: return CARTRIDGE_5200_40; // Bounty Bob Strikes Back + default: + return CARTRIDGE_NONE; + } + } + + return CARTRIDGE_NONE; +} + +void UI_Run(void) +{ +} + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ + Sound_Initialise(argc, argv); + + if (Sound_enabled) { + /* Up to this point the Sound_enabled flag indicated that we _want_ to + enable sound. From now on, the flag will indicate whether audio + output is enabled and working. So, since the sound output was not + yet initiated, we set the flag accordingly. */ + Sound_enabled = FALSE; + /* Don't worry, Sound_Setup() will set Sound_enabled back to TRUE if + it opens audio output successfully. But Sound_Setup() relies on the + flag being set if and only if audio output is active. */ + if (Sound_Setup()) + /* Start sound if opening audio output was successful. */ + Sound_Continue(); + } + + //POKEYSND_stereo_enabled = TRUE; + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + Sound_Exit(); + + return FALSE; +} + +int PLATFORM_PORT(int num) +{ + if(num < 4 && num >= 0) { + ATR5200ControllerState state = [_currentCore controllerStateForPlayer:num]; + if(state.up == 1 && state.left == 1) { + return INPUT_STICK_UL; + } + else if(state.up == 1 && state.right == 1) { + return INPUT_STICK_UR; + } + else if(state.up == 1) { + return INPUT_STICK_FORWARD; + } + else if(state.down == 1 && state.left == 1) { + return INPUT_STICK_LL; + } + else if(state.down == 1 && state.right == 1) { + return INPUT_STICK_LR; + } + else if(state.down == 1) { + return INPUT_STICK_BACK; + } + else if(state.left == 1) { + return INPUT_STICK_LEFT; + } + else if(state.right == 1) { + return INPUT_STICK_RIGHT; + } + return INPUT_STICK_CENTRE; + } + return 0xff; +} + +int PLATFORM_TRIG(int num) +{ + ATR5200ControllerState state = [_currentCore controllerStateForPlayer:num]; + + return state.fire == 1 ? 0 : 1; +} + +int PLATFORM_Keyboard(void) +{ + return 0; +} + +void PLATFORM_DisplayScreen(void) +{ +} + +int PLATFORM_SoundSetup(Sound_setup_t *setup) +{ + int buffer_samples; + + if (setup->frag_frames == 0) { + /* Set frag_frames automatically. */ + unsigned int val = setup->frag_frames = setup->freq / 50; + unsigned int pow_val = 1; + while (val >>= 1) + pow_val <<= 1; + if (pow_val < setup->frag_frames) + pow_val <<= 1; + setup->frag_frames = pow_val; + } + + setup->sample_size = 2; + + buffer_samples = setup->frag_frames * setup->channels; + setup->frag_frames = buffer_samples / setup->channels; + + return TRUE; +} + +void PLATFORM_SoundExit(void){} + +void PLATFORM_SoundPause(void){} + +void PLATFORM_SoundContinue(void){} + +void PLATFORM_SoundLock(void){} +void PLATFORM_SoundUnlock(void){} + +//int16_t convertSample(uint8_t sample) +//{ +// float floatSample = (float)sample / 255; +// return (int16_t)(floatSample * 65535 - 32768); +//} +// +//void ATR800WriteSoundBuffer(uint8_t *buffer, unsigned int len) { +// int samples = len / sizeof(uint8_t); +// NSUInteger newLength = len * sizeof(int16_t); +// int16_t *newBuffer = malloc(len * sizeof(int16_t)); +// int16_t *dest = newBuffer; +// uint8_t *source = buffer; +// for(int i = 0; i < samples; i++) { +// *dest = convertSample(*source); +// dest++; +// source++; +// } +// [[_currentCore ringBufferAtIndex:0] write:newBuffer maxLength:newLength]; +// free(newBuffer); +//} + +@end diff --git a/PVAtari800/Atari800Core/Source/PV5200SystemResponder.h b/PVAtari800/Atari800Core/Source/PV5200SystemResponder.h new file mode 100644 index 0000000000..6227faea42 --- /dev/null +++ b/PVAtari800/Atari800Core/Source/PV5200SystemResponder.h @@ -0,0 +1,35 @@ +/* + Copyright (c) 2012, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import + +OE_EXPORTED_CLASS +@interface OE5200SystemResponder : OESystemResponder + +@property(nonatomic, weak) id client; + +@end diff --git a/PVAtari800/Atari800Core/Source/PV5200SystemResponder.m b/PVAtari800/Atari800Core/Source/PV5200SystemResponder.m new file mode 100644 index 0000000000..4cb98e6724 --- /dev/null +++ b/PVAtari800/Atari800Core/Source/PV5200SystemResponder.m @@ -0,0 +1,48 @@ +/* + Copyright (c) 2012, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "PV5200SystemResponder.h" +#import "PV5200SystemResponderClient.h" + +@implementation PV5200SystemResponder +@dynamic client; + ++ (Protocol *)gameSystemResponderClientProtocol; +{ + return @protocol(PV5200SystemResponderClient); +} + +- (void)pressEmulatorKey:(OESystemKey *)aKey +{ + [[self client] didPush5200Button:(PV5200Button)[aKey key] forPlayer:[aKey player]]; +} + +- (void)releaseEmulatorKey:(OESystemKey *)aKey +{ + [[self client] didRelease5200Button:(PV5200Button)[aKey key] forPlayer:[aKey player]]; +} + +@end diff --git a/PVAtari800/Atari800Core/Source/PV5200SystemResponderClient.h b/PVAtari800/Atari800Core/Source/PV5200SystemResponderClient.h new file mode 100644 index 0000000000..47311f37d9 --- /dev/null +++ b/PVAtari800/Atari800Core/Source/PV5200SystemResponderClient.h @@ -0,0 +1,62 @@ +/* + Copyright (c) 2012, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import + +//@protocol OESystemResponderClient; + +typedef NS_ENUM(NSUInteger, PV5200Button) { + PV5200ButtonUp, + PV5200ButtonDown, + PV5200ButtonLeft, + PV5200ButtonRight, + PV5200ButtonFire1, + PV5200ButtonFire2, + PV5200ButtonStart, + PV5200ButtonPause, + PV5200ButtonReset, + PV5200Button1, + PV5200Button2, + PV5200Button3, + PV5200Button4, + PV5200Button5, + PV5200Button6, + PV5200Button7, + PV5200Button8, + PV5200Button9, + PV5200Button0, + PV5200ButtonAsterisk, + PV5200ButtonPound, + PV5200ButtonCount +}; + +@protocol PV5200SystemResponderClient + +- (oneway void)didPush5200Button:(PV5200Button)button forPlayer:(NSUInteger)player; +- (oneway void)didRelease5200Button:(PV5200Button)button forPlayer:(NSUInteger)player; + +@end diff --git a/PVAtari800/Atari800Core/Source/PVA8SystemResponder.h b/PVAtari800/Atari800Core/Source/PVA8SystemResponder.h new file mode 100644 index 0000000000..bafbad0f4d --- /dev/null +++ b/PVAtari800/Atari800Core/Source/PVA8SystemResponder.h @@ -0,0 +1,35 @@ +/* + Copyright (c) 2015, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import "PVA8SystemResponderClient.h" + +OE_EXPORTED_CLASS +@interface PVA8SystemResponder : OESystemResponder + +@property(nonatomic, weak) id client; + +@end diff --git a/PVAtari800/Atari800Core/Source/PVA8SystemResponder.m b/PVAtari800/Atari800Core/Source/PVA8SystemResponder.m new file mode 100644 index 0000000000..6257f9e8ff --- /dev/null +++ b/PVAtari800/Atari800Core/Source/PVA8SystemResponder.m @@ -0,0 +1,85 @@ +/* + Copyright (c) 2015, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "PVA8SystemResponder.h" +#import "PVA8SystemResponderClient.h" + +@implementation PVA8SystemResponder +@dynamic client; + ++ (Protocol *)gameSystemResponderClientProtocol; +{ + return @protocol(PVA8SystemResponderClient); +} + +- (void)HIDKeyDown:(OEHIDEvent *)theEvent +{ + [super HIDKeyDown:theEvent]; + [[self client] keyDown:[theEvent keycode] characters:[theEvent characters] charactersIgnoringModifiers:[theEvent charactersIgnoringModifiers] flags:[theEvent modifierFlags]]; +} + +- (void)HIDKeyUp:(OEHIDEvent *)theEvent +{ + [super HIDKeyUp:theEvent]; + [[self client] keyUp:[theEvent keycode] characters:[theEvent characters] charactersIgnoringModifiers:[theEvent charactersIgnoringModifiers] flags:[theEvent modifierFlags]]; +} + +- (void)pressEmulatorKey:(OESystemKey *)aKey +{ + [[self client] didPushA8Button:(PVA8Button)[aKey key] forPlayer:[aKey player]]; +} + +- (void)releaseEmulatorKey:(OESystemKey *)aKey +{ + [[self client] didReleaseA8Button:(PVA8Button)[aKey key] forPlayer:[aKey player]]; +} + +- (void)mouseMovedAtPoint:(OEIntPoint)aPoint +{ + [[self client] mouseMovedAtPoint:aPoint]; +} + +- (void)mouseDownAtPoint:(OEIntPoint)aPoint +{ + [[self client] leftMouseDownAtPoint:aPoint]; +} + +- (void)mouseUpAtPoint +{ + [[self client] leftMouseUp]; +} + +- (void)rightMouseDownAtPoint:(OEIntPoint)aPoint +{ + [[self client] rightMouseDownAtPoint:aPoint]; +} + +- (void)rightMouseUpAtPoint +{ + [[self client] rightMouseUp]; +} + +@end diff --git a/PVAtari800/Atari800Core/Source/PVA8SystemResponderClient.h b/PVAtari800/Atari800Core/Source/PVA8SystemResponderClient.h new file mode 100644 index 0000000000..0e05aa05ea --- /dev/null +++ b/PVAtari800/Atari800Core/Source/PVA8SystemResponderClient.h @@ -0,0 +1,52 @@ +/* + Copyright (c) 2015, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import + +//@protocol OESystemResponderClient; + +typedef NS_ENUM(NSUInteger, PVA8Button) { + PVA8ButtonUp, + PVA8ButtonDown, + PVA8ButtonLeft, + PVA8ButtonRight, + PVA8ButtonFire, + PVA8ButtonCount +}; + +@protocol PVA8SystemResponderClient +- (oneway void)mouseMovedAtPoint:(CGPoint)point; +- (oneway void)leftMouseDownAtPoint:(CGPoint)point; +- (oneway void)leftMouseUp; +- (oneway void)rightMouseDownAtPoint:(CGPoint)point; +- (oneway void)rightMouseUp; +//- (oneway void)keyDown:(unsigned short)keyCode characters:(NSString *)characters charactersIgnoringModifiers:(NSString *)charactersIgnoringModifiers flags:(NSEventModifierFlags)flags; +//- (oneway void)keyUp:(unsigned short)keyCode characters:(NSString *)characters charactersIgnoringModifiers:(NSString *)charactersIgnoringModifiers flags:(NSEventModifierFlags)flags; +- (oneway void)didPushA8Button:(PVA8Button)button forPlayer:(NSUInteger)player; +- (oneway void)didReleaseA8Button:(PVA8Button)button forPlayer:(NSUInteger)player; + +@end diff --git a/PVAtari800/Atari800Core/en.lproj/InfoPlist.strings b/PVAtari800/Atari800Core/en.lproj/InfoPlist.strings new file mode 100644 index 0000000000..477b28ff8f --- /dev/null +++ b/PVAtari800/Atari800Core/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/PVAtari800/PVAtari800.xcodeproj/project.pbxproj b/PVAtari800/PVAtari800.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..904e9b01f1 --- /dev/null +++ b/PVAtari800/PVAtari800.xcodeproj/project.pbxproj @@ -0,0 +1,988 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + B35469341DECD70A0018B6F3 /* ATR800GameCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 0269544614317D34003A07D4 /* ATR800GameCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B36DE74B1D6AB19C002EE3ED /* PVAtari800.h in Headers */ = {isa = PBXBuildFile; fileRef = B36DE74A1D6AB19C002EE3ED /* PVAtari800.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B36DE7501D6AB1B4002EE3ED /* default.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E465198C11A10075135C /* default.act */; }; + B36DE7511D6AB1B4002EE3ED /* gray.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E466198C11A10075135C /* gray.act */; }; + B36DE7521D6AB1B4002EE3ED /* jakub.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E467198C11A10075135C /* jakub.act */; }; + B36DE7531D6AB1B4002EE3ED /* Real.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E468198C11A10075135C /* Real.act */; }; + B36DE7541D6AB1B4002EE3ED /* XFormer.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E469198C11A10075135C /* XFormer.act */; }; + B36DE7551D6AB1E4002EE3ED /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 026954091431771D003A07D4 /* util.c */; }; + B36DE7561D6AB231002EE3ED /* emuos.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA012171918D200073397 /* emuos.c */; }; + B36DE7571D6AB231002EE3ED /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA00F171918A200073397 /* crc32.c */; }; + B36DE7581D6AB231002EE3ED /* img_tape.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA0091719186E00073397 /* img_tape.c */; }; + B36DE7591D6AB231002EE3ED /* sysrom.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA00B1719186E00073397 /* sysrom.c */; }; + B36DE75A1D6AB231002EE3ED /* antic.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269541814317864003A07D4 /* antic.c */; }; + B36DE75B1D6AB231002EE3ED /* artifact.c in Sources */ = {isa = PBXBuildFile; fileRef = 9491E45C1989B1CA0075135C /* artifact.c */; }; + B36DE75C1D6AB231002EE3ED /* afile.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953E214317379003A07D4 /* afile.c */; }; + B36DE75D1D6AB231002EE3ED /* atari.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953E514317379003A07D4 /* atari.c */; }; + B36DE75E1D6AB231002EE3ED /* binload.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953F414317689003A07D4 /* binload.c */; }; + B36DE75F1D6AB231002EE3ED /* cartridge.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953EB14317649003A07D4 /* cartridge.c */; }; + B36DE7601D6AB231002EE3ED /* cassette.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953ED14317649003A07D4 /* cassette.c */; }; + B36DE7611D6AB231002EE3ED /* cfg.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269542B14317A53003A07D4 /* cfg.c */; }; + B36DE7621D6AB231002EE3ED /* colours_external.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269544C14318515003A07D4 /* colours_external.c */; }; + B36DE7631D6AB231002EE3ED /* colours_ntsc.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269544E14318515003A07D4 /* colours_ntsc.c */; }; + B36DE7641D6AB231002EE3ED /* colours_pal.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269545014318515003A07D4 /* colours_pal.c */; }; + B36DE7651D6AB231002EE3ED /* colours.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269545214318515003A07D4 /* colours.c */; }; + B36DE7661D6AB231002EE3ED /* compfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543F14317B21003A07D4 /* compfile.c */; }; + B36DE7671D6AB231002EE3ED /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269541B1431793F003A07D4 /* cpu.c */; }; + B36DE7681D6AB231002EE3ED /* cycle_map.c in Sources */ = {isa = PBXBuildFile; fileRef = 9491E460198B0A8C0075135C /* cycle_map.c */; }; + B36DE7691D6AB231002EE3ED /* devices.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269541E1431797A003A07D4 /* devices.c */; }; + B36DE76A1D6AB231002EE3ED /* esc.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695421143179A2003A07D4 /* esc.c */; }; + B36DE76B1D6AB231002EE3ED /* gtia.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953F7143176AE003A07D4 /* gtia.c */; }; + B36DE76C1D6AB231002EE3ED /* ide.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695425143179E9003A07D4 /* ide.c */; }; + B36DE76D1D6AB231002EE3ED /* input.c in Sources */ = {isa = PBXBuildFile; fileRef = 02E763C61431958E008050EA /* input.c */; }; + B36DE76E1D6AB231002EE3ED /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695412143177EF003A07D4 /* log.c */; }; + B36DE76F1D6AB231002EE3ED /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953F9143176AE003A07D4 /* memory.c */; }; + B36DE7701D6AB231002EE3ED /* monitor.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543714317AC8003A07D4 /* monitor.c */; }; + B36DE7711D6AB231002EE3ED /* mzpokeysnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543C14317B11003A07D4 /* mzpokeysnd.c */; }; + B36DE7721D6AB231002EE3ED /* sio.c in Sources */ = {isa = PBXBuildFile; fileRef = 026954061431770E003A07D4 /* sio.c */; }; + B36DE7731D6AB231002EE3ED /* statesav.c in Sources */ = {isa = PBXBuildFile; fileRef = 02E763AF143194CF008050EA /* statesav.c */; }; + B36DE7741D6AB231002EE3ED /* pbi.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953FD143176E6003A07D4 /* pbi.c */; }; + B36DE7751D6AB231002EE3ED /* pbi_scsi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543414317AAF003A07D4 /* pbi_scsi.c */; }; + B36DE7761D6AB231002EE3ED /* pbi_bb.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543114317A76003A07D4 /* pbi_bb.c */; }; + B36DE7771D6AB231002EE3ED /* pbi_mio.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269542E14317A63003A07D4 /* pbi_mio.c */; }; + B36DE7781D6AB231002EE3ED /* pia.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269542814317A43003A07D4 /* pia.c */; }; + B36DE7791D6AB231002EE3ED /* pokey.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695400143176F4003A07D4 /* pokey.c */; }; + B36DE77A1D6AB231002EE3ED /* pokeysnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695402143176F4003A07D4 /* pokeysnd.c */; }; + B36DE77B1D6AB231002EE3ED /* remez.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269544214317B42003A07D4 /* remez.c */; }; + B36DE77C1D6AB231002EE3ED /* sndsave.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269540C1431775C003A07D4 /* sndsave.c */; }; + B36DE77D1D6AB231002EE3ED /* screen.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695449143184CD003A07D4 /* screen.c */; }; + B36DE77E1D6AB231002EE3ED /* sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 9491E45A1989AF050075135C /* sound.c */; }; + B36DE77F1D6AB231002EE3ED /* rtime.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269540F143177DF003A07D4 /* rtime.c */; }; + B36DE7801D6AB231002EE3ED /* ui_basic.c in Sources */ = {isa = PBXBuildFile; fileRef = 02E763C014319545008050EA /* ui_basic.c */; }; + B36DE7811D6AB250002EE3ED /* ATR800GameCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 0269544714317D34003A07D4 /* ATR800GameCore.m */; }; + B36DE7831D6AB43A002EE3ED /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7821D6AB43A002EE3ED /* libz.tbd */; }; + B36DE7851D6AB44D002EE3ED /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7841D6AB44D002EE3ED /* Foundation.framework */; }; + B36DE7871D6AB45B002EE3ED /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7861D6AB45B002EE3ED /* PVSupport.framework */; }; + B36DE78D1D6AB493002EE3ED /* PVA8SystemResponderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = B36DE78A1D6AB493002EE3ED /* PVA8SystemResponderClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B36DE7981D6ABA87002EE3ED /* PV5200SystemResponderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = B36DE7971D6ABA7D002EE3ED /* PV5200SystemResponderClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B36DE79A1D6AD049002EE3ED /* libedit.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7991D6AD049002EE3ED /* libedit.tbd */; }; + B3D73CF31E9EAF1C0023925B /* rtime.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269540F143177DF003A07D4 /* rtime.c */; }; + B3D73CF41E9EAF1C0023925B /* ide.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695425143179E9003A07D4 /* ide.c */; }; + B3D73CF51E9EAF1C0023925B /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA00F171918A200073397 /* crc32.c */; }; + B3D73CF61E9EAF1C0023925B /* cycle_map.c in Sources */ = {isa = PBXBuildFile; fileRef = 9491E460198B0A8C0075135C /* cycle_map.c */; }; + B3D73CF71E9EAF1C0023925B /* colours_pal.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269545014318515003A07D4 /* colours_pal.c */; }; + B3D73CF81E9EAF1C0023925B /* pbi_mio.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269542E14317A63003A07D4 /* pbi_mio.c */; }; + B3D73CF91E9EAF1C0023925B /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695412143177EF003A07D4 /* log.c */; }; + B3D73CFA1E9EAF1C0023925B /* afile.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953E214317379003A07D4 /* afile.c */; }; + B3D73CFB1E9EAF1C0023925B /* img_tape.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA0091719186E00073397 /* img_tape.c */; }; + B3D73CFC1E9EAF1C0023925B /* pokeysnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695402143176F4003A07D4 /* pokeysnd.c */; }; + B3D73CFD1E9EAF1C0023925B /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 026954091431771D003A07D4 /* util.c */; }; + B3D73CFE1E9EAF1C0023925B /* colours_external.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269544C14318515003A07D4 /* colours_external.c */; }; + B3D73CFF1E9EAF1C0023925B /* pbi_scsi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543414317AAF003A07D4 /* pbi_scsi.c */; }; + B3D73D001E9EAF1C0023925B /* artifact.c in Sources */ = {isa = PBXBuildFile; fileRef = 9491E45C1989B1CA0075135C /* artifact.c */; }; + B3D73D011E9EAF1C0023925B /* ui_basic.c in Sources */ = {isa = PBXBuildFile; fileRef = 02E763C014319545008050EA /* ui_basic.c */; }; + B3D73D021E9EAF1C0023925B /* pbi_bb.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543114317A76003A07D4 /* pbi_bb.c */; }; + B3D73D031E9EAF1C0023925B /* binload.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953F414317689003A07D4 /* binload.c */; }; + B3D73D041E9EAF1C0023925B /* colours.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269545214318515003A07D4 /* colours.c */; }; + B3D73D051E9EAF1C0023925B /* statesav.c in Sources */ = {isa = PBXBuildFile; fileRef = 02E763AF143194CF008050EA /* statesav.c */; }; + B3D73D061E9EAF1C0023925B /* cartridge.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953EB14317649003A07D4 /* cartridge.c */; }; + B3D73D071E9EAF1C0023925B /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953F9143176AE003A07D4 /* memory.c */; }; + B3D73D081E9EAF1C0023925B /* mzpokeysnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543C14317B11003A07D4 /* mzpokeysnd.c */; }; + B3D73D091E9EAF1C0023925B /* sio.c in Sources */ = {isa = PBXBuildFile; fileRef = 026954061431770E003A07D4 /* sio.c */; }; + B3D73D0A1E9EAF1C0023925B /* pbi.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953FD143176E6003A07D4 /* pbi.c */; }; + B3D73D0B1E9EAF1C0023925B /* monitor.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543714317AC8003A07D4 /* monitor.c */; }; + B3D73D0C1E9EAF1C0023925B /* ATR800GameCore.m in Sources */ = {isa = PBXBuildFile; fileRef = 0269544714317D34003A07D4 /* ATR800GameCore.m */; }; + B3D73D0D1E9EAF1C0023925B /* pokey.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695400143176F4003A07D4 /* pokey.c */; }; + B3D73D0E1E9EAF1C0023925B /* esc.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695421143179A2003A07D4 /* esc.c */; }; + B3D73D0F1E9EAF1C0023925B /* compfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269543F14317B21003A07D4 /* compfile.c */; }; + B3D73D101E9EAF1C0023925B /* pia.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269542814317A43003A07D4 /* pia.c */; }; + B3D73D111E9EAF1C0023925B /* remez.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269544214317B42003A07D4 /* remez.c */; }; + B3D73D121E9EAF1C0023925B /* cassette.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953ED14317649003A07D4 /* cassette.c */; }; + B3D73D131E9EAF1C0023925B /* cfg.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269542B14317A53003A07D4 /* cfg.c */; }; + B3D73D141E9EAF1C0023925B /* sndsave.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269540C1431775C003A07D4 /* sndsave.c */; }; + B3D73D151E9EAF1C0023925B /* antic.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269541814317864003A07D4 /* antic.c */; }; + B3D73D161E9EAF1C0023925B /* atari.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953E514317379003A07D4 /* atari.c */; }; + B3D73D171E9EAF1C0023925B /* screen.c in Sources */ = {isa = PBXBuildFile; fileRef = 02695449143184CD003A07D4 /* screen.c */; }; + B3D73D181E9EAF1C0023925B /* sysrom.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA00B1719186E00073397 /* sysrom.c */; }; + B3D73D191E9EAF1C0023925B /* colours_ntsc.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269544E14318515003A07D4 /* colours_ntsc.c */; }; + B3D73D1A1E9EAF1C0023925B /* emuos.c in Sources */ = {isa = PBXBuildFile; fileRef = 94DEA012171918D200073397 /* emuos.c */; }; + B3D73D1B1E9EAF1C0023925B /* devices.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269541E1431797A003A07D4 /* devices.c */; }; + B3D73D1C1E9EAF1C0023925B /* input.c in Sources */ = {isa = PBXBuildFile; fileRef = 02E763C61431958E008050EA /* input.c */; }; + B3D73D1D1E9EAF1C0023925B /* sound.c in Sources */ = {isa = PBXBuildFile; fileRef = 9491E45A1989AF050075135C /* sound.c */; }; + B3D73D1E1E9EAF1C0023925B /* cpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 0269541B1431793F003A07D4 /* cpu.c */; }; + B3D73D1F1E9EAF1C0023925B /* gtia.c in Sources */ = {isa = PBXBuildFile; fileRef = 026953F7143176AE003A07D4 /* gtia.c */; }; + B3D73D211E9EAF1C0023925B /* libedit.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7991D6AD049002EE3ED /* libedit.tbd */; }; + B3D73D231E9EAF1C0023925B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7841D6AB44D002EE3ED /* Foundation.framework */; }; + B3D73D241E9EAF1C0023925B /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B36DE7821D6AB43A002EE3ED /* libz.tbd */; }; + B3D73D261E9EAF1C0023925B /* PVAtari800.h in Headers */ = {isa = PBXBuildFile; fileRef = B36DE74A1D6AB19C002EE3ED /* PVAtari800.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D271E9EAF1C0023925B /* ATR800GameCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 0269544614317D34003A07D4 /* ATR800GameCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D281E9EAF1C0023925B /* PV5200SystemResponderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = B36DE7971D6ABA7D002EE3ED /* PV5200SystemResponderClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D291E9EAF1C0023925B /* PVA8SystemResponderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = B36DE78A1D6AB493002EE3ED /* PVA8SystemResponderClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D2B1E9EAF1C0023925B /* jakub.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E467198C11A10075135C /* jakub.act */; }; + B3D73D2C1E9EAF1C0023925B /* default.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E465198C11A10075135C /* default.act */; }; + B3D73D2D1E9EAF1C0023925B /* Real.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E468198C11A10075135C /* Real.act */; }; + B3D73D2E1E9EAF1C0023925B /* gray.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E466198C11A10075135C /* gray.act */; }; + B3D73D2F1E9EAF1C0023925B /* XFormer.act in Resources */ = {isa = PBXBuildFile; fileRef = 9491E469198C11A10075135C /* XFormer.act */; }; + B3D73D391E9EAF820023925B /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3D73D381E9EAF820023925B /* PVSupport.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 02252B371437A377001F3BF4 /* emuos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = emuos.h; path = "atari800-src/emuos.h"; sourceTree = SOURCE_ROOT; }; + 02669C741435806A0002A11B /* sound_oss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sound_oss.c; path = "atari800-src/sound_oss.c"; sourceTree = SOURCE_ROOT; }; + 02669C751435806A0002A11B /* sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sound.h; path = "atari800-src/sound.h"; sourceTree = SOURCE_ROOT; }; + 02695364143169EB003A07D4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 02695367143169EB003A07D4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 02695368143169EB003A07D4 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 02695369143169EB003A07D4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 0269536C143169EB003A07D4 /* Atari800-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Atari800-Info.plist"; sourceTree = ""; }; + 0269536E143169EB003A07D4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 026953E214317379003A07D4 /* afile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = afile.c; path = "atari800-src/afile.c"; sourceTree = SOURCE_ROOT; }; + 026953E314317379003A07D4 /* afile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = afile.h; path = "atari800-src/afile.h"; sourceTree = SOURCE_ROOT; }; + 026953E414317379003A07D4 /* akey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = akey.h; path = "atari800-src/akey.h"; sourceTree = SOURCE_ROOT; }; + 026953E514317379003A07D4 /* atari.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = atari.c; path = "atari800-src/atari.c"; sourceTree = SOURCE_ROOT; }; + 026953E614317379003A07D4 /* atari.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = atari.h; path = "atari800-src/atari.h"; sourceTree = SOURCE_ROOT; }; + 026953EA143175F0003A07D4 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = config.h; path = "atari800-src/config.h"; sourceTree = SOURCE_ROOT; }; + 026953EB14317649003A07D4 /* cartridge.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cartridge.c; path = "atari800-src/cartridge.c"; sourceTree = SOURCE_ROOT; }; + 026953EC14317649003A07D4 /* cartridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cartridge.h; path = "atari800-src/cartridge.h"; sourceTree = SOURCE_ROOT; }; + 026953ED14317649003A07D4 /* cassette.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cassette.c; path = "atari800-src/cassette.c"; sourceTree = SOURCE_ROOT; }; + 026953EE14317649003A07D4 /* cassette.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cassette.h; path = "atari800-src/cassette.h"; sourceTree = SOURCE_ROOT; }; + 026953F214317667003A07D4 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + 026953F414317689003A07D4 /* binload.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = binload.c; path = "atari800-src/binload.c"; sourceTree = SOURCE_ROOT; }; + 026953F514317689003A07D4 /* binload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = binload.h; path = "atari800-src/binload.h"; sourceTree = SOURCE_ROOT; }; + 026953F7143176AE003A07D4 /* gtia.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gtia.c; path = "atari800-src/gtia.c"; sourceTree = SOURCE_ROOT; }; + 026953F8143176AE003A07D4 /* gtia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gtia.h; path = "atari800-src/gtia.h"; sourceTree = SOURCE_ROOT; }; + 026953F9143176AE003A07D4 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = memory.c; path = "atari800-src/memory.c"; sourceTree = SOURCE_ROOT; }; + 026953FA143176AE003A07D4 /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = memory.h; path = "atari800-src/memory.h"; sourceTree = SOURCE_ROOT; }; + 026953FD143176E6003A07D4 /* pbi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pbi.c; path = "atari800-src/pbi.c"; sourceTree = SOURCE_ROOT; }; + 026953FE143176E6003A07D4 /* pbi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pbi.h; path = "atari800-src/pbi.h"; sourceTree = SOURCE_ROOT; }; + 02695400143176F4003A07D4 /* pokey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pokey.c; path = "atari800-src/pokey.c"; sourceTree = SOURCE_ROOT; }; + 02695401143176F4003A07D4 /* pokey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pokey.h; path = "atari800-src/pokey.h"; sourceTree = SOURCE_ROOT; }; + 02695402143176F4003A07D4 /* pokeysnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pokeysnd.c; path = "atari800-src/pokeysnd.c"; sourceTree = SOURCE_ROOT; }; + 02695403143176F4003A07D4 /* pokeysnd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pokeysnd.h; path = "atari800-src/pokeysnd.h"; sourceTree = SOURCE_ROOT; }; + 026954061431770E003A07D4 /* sio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sio.c; path = "atari800-src/sio.c"; sourceTree = SOURCE_ROOT; }; + 026954071431770E003A07D4 /* sio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sio.h; path = "atari800-src/sio.h"; sourceTree = SOURCE_ROOT; }; + 026954091431771D003A07D4 /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = "atari800-src/util.c"; sourceTree = SOURCE_ROOT; }; + 0269540A1431771D003A07D4 /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = util.h; path = "atari800-src/util.h"; sourceTree = SOURCE_ROOT; }; + 0269540C1431775C003A07D4 /* sndsave.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sndsave.c; path = "atari800-src/sndsave.c"; sourceTree = SOURCE_ROOT; }; + 0269540D1431775C003A07D4 /* sndsave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sndsave.h; path = "atari800-src/sndsave.h"; sourceTree = SOURCE_ROOT; }; + 0269540F143177DF003A07D4 /* rtime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rtime.c; path = "atari800-src/rtime.c"; sourceTree = SOURCE_ROOT; }; + 02695410143177DF003A07D4 /* rtime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rtime.h; path = "atari800-src/rtime.h"; sourceTree = SOURCE_ROOT; }; + 02695412143177EF003A07D4 /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = log.c; path = "atari800-src/log.c"; sourceTree = SOURCE_ROOT; }; + 02695413143177EF003A07D4 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = log.h; path = "atari800-src/log.h"; sourceTree = SOURCE_ROOT; }; + 0269541814317864003A07D4 /* antic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = antic.c; path = "atari800-src/antic.c"; sourceTree = SOURCE_ROOT; }; + 0269541914317864003A07D4 /* antic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = antic.h; path = "atari800-src/antic.h"; sourceTree = SOURCE_ROOT; }; + 0269541B1431793F003A07D4 /* cpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cpu.c; path = "atari800-src/cpu.c"; sourceTree = SOURCE_ROOT; }; + 0269541C1431793F003A07D4 /* cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cpu.h; path = "atari800-src/cpu.h"; sourceTree = SOURCE_ROOT; }; + 0269541E1431797A003A07D4 /* devices.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = devices.c; path = "atari800-src/devices.c"; sourceTree = SOURCE_ROOT; }; + 0269541F1431797A003A07D4 /* devices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = devices.h; path = "atari800-src/devices.h"; sourceTree = SOURCE_ROOT; }; + 02695421143179A2003A07D4 /* esc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = esc.c; path = "atari800-src/esc.c"; sourceTree = SOURCE_ROOT; }; + 02695422143179A2003A07D4 /* esc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = esc.h; path = "atari800-src/esc.h"; sourceTree = SOURCE_ROOT; }; + 02695424143179E9003A07D4 /* ide_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ide_internal.h; path = "atari800-src/ide_internal.h"; sourceTree = SOURCE_ROOT; }; + 02695425143179E9003A07D4 /* ide.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ide.c; path = "atari800-src/ide.c"; sourceTree = SOURCE_ROOT; }; + 02695426143179E9003A07D4 /* ide.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ide.h; path = "atari800-src/ide.h"; sourceTree = SOURCE_ROOT; }; + 0269542814317A43003A07D4 /* pia.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pia.c; path = "atari800-src/pia.c"; sourceTree = SOURCE_ROOT; }; + 0269542914317A43003A07D4 /* pia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pia.h; path = "atari800-src/pia.h"; sourceTree = SOURCE_ROOT; }; + 0269542B14317A53003A07D4 /* cfg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cfg.c; path = "atari800-src/cfg.c"; sourceTree = SOURCE_ROOT; }; + 0269542C14317A53003A07D4 /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cfg.h; path = "atari800-src/cfg.h"; sourceTree = SOURCE_ROOT; }; + 0269542E14317A63003A07D4 /* pbi_mio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pbi_mio.c; path = "atari800-src/pbi_mio.c"; sourceTree = SOURCE_ROOT; }; + 0269542F14317A63003A07D4 /* pbi_mio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pbi_mio.h; path = "atari800-src/pbi_mio.h"; sourceTree = SOURCE_ROOT; }; + 0269543114317A76003A07D4 /* pbi_bb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pbi_bb.c; path = "atari800-src/pbi_bb.c"; sourceTree = SOURCE_ROOT; }; + 0269543214317A76003A07D4 /* pbi_bb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pbi_bb.h; path = "atari800-src/pbi_bb.h"; sourceTree = SOURCE_ROOT; }; + 0269543414317AAF003A07D4 /* pbi_scsi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pbi_scsi.c; path = "atari800-src/pbi_scsi.c"; sourceTree = SOURCE_ROOT; }; + 0269543514317AAF003A07D4 /* pbi_scsi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pbi_scsi.h; path = "atari800-src/pbi_scsi.h"; sourceTree = SOURCE_ROOT; }; + 0269543714317AC8003A07D4 /* monitor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = monitor.c; path = "atari800-src/monitor.c"; sourceTree = SOURCE_ROOT; }; + 0269543814317AC8003A07D4 /* monitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = monitor.h; path = "atari800-src/monitor.h"; sourceTree = SOURCE_ROOT; }; + 0269543A14317AEF003A07D4 /* libreadline.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libreadline.dylib; path = usr/lib/libreadline.dylib; sourceTree = SDKROOT; }; + 0269543C14317B11003A07D4 /* mzpokeysnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mzpokeysnd.c; path = "atari800-src/mzpokeysnd.c"; sourceTree = SOURCE_ROOT; }; + 0269543D14317B11003A07D4 /* mzpokeysnd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mzpokeysnd.h; path = "atari800-src/mzpokeysnd.h"; sourceTree = SOURCE_ROOT; }; + 0269543F14317B21003A07D4 /* compfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = compfile.c; path = "atari800-src/compfile.c"; sourceTree = SOURCE_ROOT; }; + 0269544014317B21003A07D4 /* compfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compfile.h; path = "atari800-src/compfile.h"; sourceTree = SOURCE_ROOT; }; + 0269544214317B42003A07D4 /* remez.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = remez.c; path = "atari800-src/remez.c"; sourceTree = SOURCE_ROOT; }; + 0269544314317B42003A07D4 /* remez.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = remez.h; path = "atari800-src/remez.h"; sourceTree = SOURCE_ROOT; }; + 0269544514317B62003A07D4 /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = platform.h; path = "atari800-src/platform.h"; sourceTree = SOURCE_ROOT; }; + 0269544614317D34003A07D4 /* ATR800GameCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ATR800GameCore.h; path = Source/ATR800GameCore.h; sourceTree = ""; }; + 0269544714317D34003A07D4 /* ATR800GameCore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ATR800GameCore.m; path = Source/ATR800GameCore.m; sourceTree = ""; }; + 02695449143184CD003A07D4 /* screen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = screen.c; path = "atari800-src/screen.c"; sourceTree = SOURCE_ROOT; }; + 0269544A143184CD003A07D4 /* screen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = screen.h; path = "atari800-src/screen.h"; sourceTree = SOURCE_ROOT; }; + 0269544C14318515003A07D4 /* colours_external.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colours_external.c; path = "atari800-src/colours_external.c"; sourceTree = SOURCE_ROOT; }; + 0269544D14318515003A07D4 /* colours_external.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colours_external.h; path = "atari800-src/colours_external.h"; sourceTree = SOURCE_ROOT; }; + 0269544E14318515003A07D4 /* colours_ntsc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colours_ntsc.c; path = "atari800-src/colours_ntsc.c"; sourceTree = SOURCE_ROOT; }; + 0269544F14318515003A07D4 /* colours_ntsc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colours_ntsc.h; path = "atari800-src/colours_ntsc.h"; sourceTree = SOURCE_ROOT; }; + 0269545014318515003A07D4 /* colours_pal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colours_pal.c; path = "atari800-src/colours_pal.c"; sourceTree = SOURCE_ROOT; }; + 0269545114318515003A07D4 /* colours_pal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colours_pal.h; path = "atari800-src/colours_pal.h"; sourceTree = SOURCE_ROOT; }; + 0269545214318515003A07D4 /* colours.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = colours.c; path = "atari800-src/colours.c"; sourceTree = SOURCE_ROOT; }; + 0269545314318515003A07D4 /* colours.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = colours.h; path = "atari800-src/colours.h"; sourceTree = SOURCE_ROOT; }; + 02E763AF143194CF008050EA /* statesav.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = statesav.c; path = "atari800-src/statesav.c"; sourceTree = SOURCE_ROOT; }; + 02E763B0143194CF008050EA /* statesav.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = statesav.h; path = "atari800-src/statesav.h"; sourceTree = SOURCE_ROOT; }; + 02E763C014319545008050EA /* ui_basic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ui_basic.c; path = "atari800-src/ui_basic.c"; sourceTree = SOURCE_ROOT; }; + 02E763C114319545008050EA /* ui_basic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ui_basic.h; path = "atari800-src/ui_basic.h"; sourceTree = SOURCE_ROOT; }; + 02E763C214319545008050EA /* ui.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ui.c; path = "atari800-src/ui.c"; sourceTree = SOURCE_ROOT; }; + 02E763C314319545008050EA /* ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ui.h; path = "atari800-src/ui.h"; sourceTree = SOURCE_ROOT; }; + 02E763C61431958E008050EA /* input.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = input.c; path = "atari800-src/input.c"; sourceTree = SOURCE_ROOT; }; + 02E763C71431958E008050EA /* input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = input.h; path = "atari800-src/input.h"; sourceTree = SOURCE_ROOT; }; + 9491E45A1989AF050075135C /* sound.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sound.c; path = "atari800-src/sound.c"; sourceTree = SOURCE_ROOT; }; + 9491E45C1989B1CA0075135C /* artifact.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = artifact.c; path = "atari800-src/artifact.c"; sourceTree = SOURCE_ROOT; }; + 9491E45D1989B1CA0075135C /* artifact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = artifact.h; path = "atari800-src/artifact.h"; sourceTree = SOURCE_ROOT; }; + 9491E460198B0A8C0075135C /* cycle_map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cycle_map.c; path = "atari800-src/cycle_map.c"; sourceTree = SOURCE_ROOT; }; + 9491E461198B0A8C0075135C /* cycle_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cycle_map.h; path = "atari800-src/cycle_map.h"; sourceTree = SOURCE_ROOT; }; + 9491E465198C11A10075135C /* default.act */ = {isa = PBXFileReference; lastKnownFileType = file; path = default.act; sourceTree = ""; }; + 9491E466198C11A10075135C /* gray.act */ = {isa = PBXFileReference; lastKnownFileType = file; path = gray.act; sourceTree = ""; }; + 9491E467198C11A10075135C /* jakub.act */ = {isa = PBXFileReference; lastKnownFileType = file; path = jakub.act; sourceTree = ""; }; + 9491E468198C11A10075135C /* Real.act */ = {isa = PBXFileReference; lastKnownFileType = file; path = Real.act; sourceTree = ""; }; + 9491E469198C11A10075135C /* XFormer.act */ = {isa = PBXFileReference; lastKnownFileType = file; path = XFormer.act; sourceTree = ""; }; + 94DEA0091719186E00073397 /* img_tape.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = img_tape.c; path = "atari800-src/img_tape.c"; sourceTree = SOURCE_ROOT; }; + 94DEA00A1719186E00073397 /* img_tape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = img_tape.h; path = "atari800-src/img_tape.h"; sourceTree = SOURCE_ROOT; }; + 94DEA00B1719186E00073397 /* sysrom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysrom.c; path = "atari800-src/sysrom.c"; sourceTree = SOURCE_ROOT; }; + 94DEA00C1719186F00073397 /* sysrom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sysrom.h; path = "atari800-src/sysrom.h"; sourceTree = SOURCE_ROOT; }; + 94DEA00F171918A200073397 /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = "atari800-src/crc32.c"; sourceTree = SOURCE_ROOT; }; + 94DEA010171918A200073397 /* crc32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crc32.h; path = "atari800-src/crc32.h"; sourceTree = SOURCE_ROOT; }; + 94DEA012171918D200073397 /* emuos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = emuos.c; path = "atari800-src/emuos.c"; sourceTree = SOURCE_ROOT; }; + 94DEA018171951AD00073397 /* OpenEmuBase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenEmuBase.framework; path = "../OpenEmu-SDK/build/Release/OpenEmuBase.framework"; sourceTree = ""; }; + B36DE7481D6AB19C002EE3ED /* PVAtari800.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PVAtari800.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B36DE74A1D6AB19C002EE3ED /* PVAtari800.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PVAtari800.h; sourceTree = ""; }; + B36DE74C1D6AB19C002EE3ED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B36DE7821D6AB43A002EE3ED /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; + B36DE7841D6AB44D002EE3ED /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + B36DE7861D6AB45B002EE3ED /* PVSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVSupport.framework; path = "../../../Library/Developer/Xcode/DerivedData/Provenance-cqyrqlnsqskspscgaptpbmkqmvze/Build/Products/Debug-iphonesimulator/PVSupport.framework"; sourceTree = ""; }; + B36DE7881D6AB493002EE3ED /* PVA8SystemResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PVA8SystemResponder.h; path = Source/PVA8SystemResponder.h; sourceTree = ""; }; + B36DE7891D6AB493002EE3ED /* PVA8SystemResponder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PVA8SystemResponder.m; path = Source/PVA8SystemResponder.m; sourceTree = ""; }; + B36DE78A1D6AB493002EE3ED /* PVA8SystemResponderClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PVA8SystemResponderClient.h; path = Source/PVA8SystemResponderClient.h; sourceTree = ""; }; + B36DE7951D6ABA7D002EE3ED /* PV5200SystemResponder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PV5200SystemResponder.h; path = Source/PV5200SystemResponder.h; sourceTree = ""; }; + B36DE7961D6ABA7D002EE3ED /* PV5200SystemResponder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = PV5200SystemResponder.m; path = Source/PV5200SystemResponder.m; sourceTree = ""; }; + B36DE7971D6ABA7D002EE3ED /* PV5200SystemResponderClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PV5200SystemResponderClient.h; path = Source/PV5200SystemResponderClient.h; sourceTree = ""; }; + B36DE7991D6AD049002EE3ED /* libedit.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libedit.tbd; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/libedit.tbd; sourceTree = DEVELOPER_DIR; }; + B3D73D331E9EAF1C0023925B /* PVAtari800.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PVAtari800.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3D73D381E9EAF820023925B /* PVSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVSupport.framework; path = "../../../Library/Developer/Xcode/DerivedData/Provenance-cqyrqlnsqskspscgaptpbmkqmvze/Build/Products/Debug-appletvos/PVSupport.framework"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B36DE7441D6AB19C002EE3ED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B36DE79A1D6AD049002EE3ED /* libedit.tbd in Frameworks */, + B36DE7871D6AB45B002EE3ED /* PVSupport.framework in Frameworks */, + B36DE7851D6AB44D002EE3ED /* Foundation.framework in Frameworks */, + B36DE7831D6AB43A002EE3ED /* libz.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B3D73D201E9EAF1C0023925B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B3D73D391E9EAF820023925B /* PVSupport.framework in Frameworks */, + B3D73D211E9EAF1C0023925B /* libedit.tbd in Frameworks */, + B3D73D231E9EAF1C0023925B /* Foundation.framework in Frameworks */, + B3D73D241E9EAF1C0023925B /* libz.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 02695356143169EA003A07D4 = { + isa = PBXGroup; + children = ( + 0269541514317842003A07D4 /* Classes */, + 0269536B143169EB003A07D4 /* Resources */, + B36DE7491D6AB19C002EE3ED /* PVAtari800 */, + 02695363143169EB003A07D4 /* Frameworks */, + 02695362143169EB003A07D4 /* Products */, + ); + sourceTree = ""; + }; + 02695362143169EB003A07D4 /* Products */ = { + isa = PBXGroup; + children = ( + B36DE7481D6AB19C002EE3ED /* PVAtari800.framework */, + B3D73D331E9EAF1C0023925B /* PVAtari800.framework */, + ); + name = Products; + sourceTree = ""; + }; + 02695363143169EB003A07D4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B3D73D381E9EAF820023925B /* PVSupport.framework */, + B36DE7991D6AD049002EE3ED /* libedit.tbd */, + B36DE7861D6AB45B002EE3ED /* PVSupport.framework */, + B36DE7841D6AB44D002EE3ED /* Foundation.framework */, + B36DE7821D6AB43A002EE3ED /* libz.tbd */, + 94DEA018171951AD00073397 /* OpenEmuBase.framework */, + 0269543A14317AEF003A07D4 /* libreadline.dylib */, + 026953F214317667003A07D4 /* libz.dylib */, + 02695364143169EB003A07D4 /* Cocoa.framework */, + 02695366143169EB003A07D4 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 02695366143169EB003A07D4 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 02695367143169EB003A07D4 /* AppKit.framework */, + 02695368143169EB003A07D4 /* CoreData.framework */, + 02695369143169EB003A07D4 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 0269536A143169EB003A07D4 /* Core */ = { + isa = PBXGroup; + children = ( + 026953E91431737E003A07D4 /* atari800 */, + ); + name = Core; + sourceTree = ""; + }; + 0269536B143169EB003A07D4 /* Resources */ = { + isa = PBXGroup; + children = ( + 0269536C143169EB003A07D4 /* Atari800-Info.plist */, + 0269536D143169EB003A07D4 /* InfoPlist.strings */, + ); + name = Resources; + path = Atari800Core; + sourceTree = ""; + }; + 026953E91431737E003A07D4 /* atari800 */ = { + isa = PBXGroup; + children = ( + 9491E464198C11A10075135C /* act */, + 94DEA012171918D200073397 /* emuos.c */, + 94DEA00F171918A200073397 /* crc32.c */, + 94DEA010171918A200073397 /* crc32.h */, + 94DEA0091719186E00073397 /* img_tape.c */, + 94DEA00A1719186E00073397 /* img_tape.h */, + 94DEA00B1719186E00073397 /* sysrom.c */, + 94DEA00C1719186F00073397 /* sysrom.h */, + 026953EA143175F0003A07D4 /* config.h */, + 0269541814317864003A07D4 /* antic.c */, + 0269541914317864003A07D4 /* antic.h */, + 9491E45C1989B1CA0075135C /* artifact.c */, + 9491E45D1989B1CA0075135C /* artifact.h */, + 026953E214317379003A07D4 /* afile.c */, + 026953E314317379003A07D4 /* afile.h */, + 026953E414317379003A07D4 /* akey.h */, + 026953E514317379003A07D4 /* atari.c */, + 026953E614317379003A07D4 /* atari.h */, + 026953F414317689003A07D4 /* binload.c */, + 026953F514317689003A07D4 /* binload.h */, + 026953EB14317649003A07D4 /* cartridge.c */, + 026953EC14317649003A07D4 /* cartridge.h */, + 026953ED14317649003A07D4 /* cassette.c */, + 026953EE14317649003A07D4 /* cassette.h */, + 0269542B14317A53003A07D4 /* cfg.c */, + 0269542C14317A53003A07D4 /* cfg.h */, + 0269544C14318515003A07D4 /* colours_external.c */, + 0269544D14318515003A07D4 /* colours_external.h */, + 0269544E14318515003A07D4 /* colours_ntsc.c */, + 0269544F14318515003A07D4 /* colours_ntsc.h */, + 0269545014318515003A07D4 /* colours_pal.c */, + 0269545114318515003A07D4 /* colours_pal.h */, + 0269545214318515003A07D4 /* colours.c */, + 0269545314318515003A07D4 /* colours.h */, + 0269543F14317B21003A07D4 /* compfile.c */, + 0269544014317B21003A07D4 /* compfile.h */, + 0269541B1431793F003A07D4 /* cpu.c */, + 0269541C1431793F003A07D4 /* cpu.h */, + 9491E460198B0A8C0075135C /* cycle_map.c */, + 9491E461198B0A8C0075135C /* cycle_map.h */, + 0269541E1431797A003A07D4 /* devices.c */, + 0269541F1431797A003A07D4 /* devices.h */, + 02252B371437A377001F3BF4 /* emuos.h */, + 02695421143179A2003A07D4 /* esc.c */, + 02695422143179A2003A07D4 /* esc.h */, + 026953F7143176AE003A07D4 /* gtia.c */, + 026953F8143176AE003A07D4 /* gtia.h */, + 02695424143179E9003A07D4 /* ide_internal.h */, + 02695425143179E9003A07D4 /* ide.c */, + 02695426143179E9003A07D4 /* ide.h */, + 02E763C61431958E008050EA /* input.c */, + 02E763C71431958E008050EA /* input.h */, + 02695412143177EF003A07D4 /* log.c */, + 02695413143177EF003A07D4 /* log.h */, + 026953F9143176AE003A07D4 /* memory.c */, + 026953FA143176AE003A07D4 /* memory.h */, + 0269543714317AC8003A07D4 /* monitor.c */, + 0269543814317AC8003A07D4 /* monitor.h */, + 0269543C14317B11003A07D4 /* mzpokeysnd.c */, + 0269543D14317B11003A07D4 /* mzpokeysnd.h */, + 026954061431770E003A07D4 /* sio.c */, + 026954071431770E003A07D4 /* sio.h */, + 02E763AF143194CF008050EA /* statesav.c */, + 02E763B0143194CF008050EA /* statesav.h */, + 026953FD143176E6003A07D4 /* pbi.c */, + 026953FE143176E6003A07D4 /* pbi.h */, + 0269543414317AAF003A07D4 /* pbi_scsi.c */, + 0269543514317AAF003A07D4 /* pbi_scsi.h */, + 0269543114317A76003A07D4 /* pbi_bb.c */, + 0269543214317A76003A07D4 /* pbi_bb.h */, + 0269542E14317A63003A07D4 /* pbi_mio.c */, + 0269542F14317A63003A07D4 /* pbi_mio.h */, + 0269542814317A43003A07D4 /* pia.c */, + 0269542914317A43003A07D4 /* pia.h */, + 02695400143176F4003A07D4 /* pokey.c */, + 02695401143176F4003A07D4 /* pokey.h */, + 02695402143176F4003A07D4 /* pokeysnd.c */, + 02695403143176F4003A07D4 /* pokeysnd.h */, + 0269544214317B42003A07D4 /* remez.c */, + 0269544314317B42003A07D4 /* remez.h */, + 0269540C1431775C003A07D4 /* sndsave.c */, + 0269540D1431775C003A07D4 /* sndsave.h */, + 02695449143184CD003A07D4 /* screen.c */, + 0269544A143184CD003A07D4 /* screen.h */, + 02669C741435806A0002A11B /* sound_oss.c */, + 9491E45A1989AF050075135C /* sound.c */, + 02669C751435806A0002A11B /* sound.h */, + 0269540F143177DF003A07D4 /* rtime.c */, + 02695410143177DF003A07D4 /* rtime.h */, + 02E763C014319545008050EA /* ui_basic.c */, + 02E763C114319545008050EA /* ui_basic.h */, + 02E763C214319545008050EA /* ui.c */, + 02E763C314319545008050EA /* ui.h */, + 026954091431771D003A07D4 /* util.c */, + 0269540A1431771D003A07D4 /* util.h */, + ); + name = atari800; + sourceTree = ""; + }; + 0269541514317842003A07D4 /* Classes */ = { + isa = PBXGroup; + children = ( + 0269536A143169EB003A07D4 /* Core */, + 0269544514317B62003A07D4 /* platform.h */, + 0269544614317D34003A07D4 /* ATR800GameCore.h */, + 0269544714317D34003A07D4 /* ATR800GameCore.m */, + B36DE7881D6AB493002EE3ED /* PVA8SystemResponder.h */, + B36DE7891D6AB493002EE3ED /* PVA8SystemResponder.m */, + B36DE78A1D6AB493002EE3ED /* PVA8SystemResponderClient.h */, + B36DE7951D6ABA7D002EE3ED /* PV5200SystemResponder.h */, + B36DE7961D6ABA7D002EE3ED /* PV5200SystemResponder.m */, + B36DE7971D6ABA7D002EE3ED /* PV5200SystemResponderClient.h */, + ); + name = Classes; + path = Atari800Core; + sourceTree = ""; + }; + 9491E464198C11A10075135C /* act */ = { + isa = PBXGroup; + children = ( + 9491E465198C11A10075135C /* default.act */, + 9491E466198C11A10075135C /* gray.act */, + 9491E467198C11A10075135C /* jakub.act */, + 9491E468198C11A10075135C /* Real.act */, + 9491E469198C11A10075135C /* XFormer.act */, + ); + name = act; + path = "atari800-src/act"; + sourceTree = SOURCE_ROOT; + }; + B36DE7491D6AB19C002EE3ED /* PVAtari800 */ = { + isa = PBXGroup; + children = ( + B36DE74A1D6AB19C002EE3ED /* PVAtari800.h */, + B36DE74C1D6AB19C002EE3ED /* Info.plist */, + ); + path = PVAtari800; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + B36DE7451D6AB19C002EE3ED /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B36DE74B1D6AB19C002EE3ED /* PVAtari800.h in Headers */, + B35469341DECD70A0018B6F3 /* ATR800GameCore.h in Headers */, + B36DE7981D6ABA87002EE3ED /* PV5200SystemResponderClient.h in Headers */, + B36DE78D1D6AB493002EE3ED /* PVA8SystemResponderClient.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B3D73D251E9EAF1C0023925B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + B3D73D261E9EAF1C0023925B /* PVAtari800.h in Headers */, + B3D73D271E9EAF1C0023925B /* ATR800GameCore.h in Headers */, + B3D73D281E9EAF1C0023925B /* PV5200SystemResponderClient.h in Headers */, + B3D73D291E9EAF1C0023925B /* PVA8SystemResponderClient.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + B36DE7471D6AB19C002EE3ED /* PVAtari800 */ = { + isa = PBXNativeTarget; + buildConfigurationList = B36DE74D1D6AB19C002EE3ED /* Build configuration list for PBXNativeTarget "PVAtari800" */; + buildPhases = ( + B36DE7431D6AB19C002EE3ED /* Sources */, + B36DE7441D6AB19C002EE3ED /* Frameworks */, + B36DE7451D6AB19C002EE3ED /* Headers */, + B36DE7461D6AB19C002EE3ED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PVAtari800; + productName = PVAtari800; + productReference = B36DE7481D6AB19C002EE3ED /* PVAtari800.framework */; + productType = "com.apple.product-type.framework"; + }; + B3D73CF11E9EAF1C0023925B /* PVAtari800 tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = B3D73D301E9EAF1C0023925B /* Build configuration list for PBXNativeTarget "PVAtari800 tvOS" */; + buildPhases = ( + B3D73CF21E9EAF1C0023925B /* Sources */, + B3D73D201E9EAF1C0023925B /* Frameworks */, + B3D73D251E9EAF1C0023925B /* Headers */, + B3D73D2A1E9EAF1C0023925B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "PVAtari800 tvOS"; + productName = PVAtari800; + productReference = B3D73D331E9EAF1C0023925B /* PVAtari800.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 02695358143169EA003A07D4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0700; + TargetAttributes = { + B36DE7471D6AB19C002EE3ED = { + CreatedOnToolsVersion = 7.3.1; + }; + }; + }; + buildConfigurationList = 0269535B143169EA003A07D4 /* Build configuration list for PBXProject "PVAtari800" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 02695356143169EA003A07D4; + productRefGroup = 02695362143169EB003A07D4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B36DE7471D6AB19C002EE3ED /* PVAtari800 */, + B3D73CF11E9EAF1C0023925B /* PVAtari800 tvOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B36DE7461D6AB19C002EE3ED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B36DE7521D6AB1B4002EE3ED /* jakub.act in Resources */, + B36DE7501D6AB1B4002EE3ED /* default.act in Resources */, + B36DE7531D6AB1B4002EE3ED /* Real.act in Resources */, + B36DE7511D6AB1B4002EE3ED /* gray.act in Resources */, + B36DE7541D6AB1B4002EE3ED /* XFormer.act in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B3D73D2A1E9EAF1C0023925B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B3D73D2B1E9EAF1C0023925B /* jakub.act in Resources */, + B3D73D2C1E9EAF1C0023925B /* default.act in Resources */, + B3D73D2D1E9EAF1C0023925B /* Real.act in Resources */, + B3D73D2E1E9EAF1C0023925B /* gray.act in Resources */, + B3D73D2F1E9EAF1C0023925B /* XFormer.act in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B36DE7431D6AB19C002EE3ED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B36DE77F1D6AB231002EE3ED /* rtime.c in Sources */, + B36DE76C1D6AB231002EE3ED /* ide.c in Sources */, + B36DE7571D6AB231002EE3ED /* crc32.c in Sources */, + B36DE7681D6AB231002EE3ED /* cycle_map.c in Sources */, + B36DE7641D6AB231002EE3ED /* colours_pal.c in Sources */, + B36DE7771D6AB231002EE3ED /* pbi_mio.c in Sources */, + B36DE76E1D6AB231002EE3ED /* log.c in Sources */, + B36DE75C1D6AB231002EE3ED /* afile.c in Sources */, + B36DE7581D6AB231002EE3ED /* img_tape.c in Sources */, + B36DE77A1D6AB231002EE3ED /* pokeysnd.c in Sources */, + B36DE7551D6AB1E4002EE3ED /* util.c in Sources */, + B36DE7621D6AB231002EE3ED /* colours_external.c in Sources */, + B36DE7751D6AB231002EE3ED /* pbi_scsi.c in Sources */, + B36DE75B1D6AB231002EE3ED /* artifact.c in Sources */, + B36DE7801D6AB231002EE3ED /* ui_basic.c in Sources */, + B36DE7761D6AB231002EE3ED /* pbi_bb.c in Sources */, + B36DE75E1D6AB231002EE3ED /* binload.c in Sources */, + B36DE7651D6AB231002EE3ED /* colours.c in Sources */, + B36DE7731D6AB231002EE3ED /* statesav.c in Sources */, + B36DE75F1D6AB231002EE3ED /* cartridge.c in Sources */, + B36DE76F1D6AB231002EE3ED /* memory.c in Sources */, + B36DE7711D6AB231002EE3ED /* mzpokeysnd.c in Sources */, + B36DE7721D6AB231002EE3ED /* sio.c in Sources */, + B36DE7741D6AB231002EE3ED /* pbi.c in Sources */, + B36DE7701D6AB231002EE3ED /* monitor.c in Sources */, + B36DE7811D6AB250002EE3ED /* ATR800GameCore.m in Sources */, + B36DE7791D6AB231002EE3ED /* pokey.c in Sources */, + B36DE76A1D6AB231002EE3ED /* esc.c in Sources */, + B36DE7661D6AB231002EE3ED /* compfile.c in Sources */, + B36DE7781D6AB231002EE3ED /* pia.c in Sources */, + B36DE77B1D6AB231002EE3ED /* remez.c in Sources */, + B36DE7601D6AB231002EE3ED /* cassette.c in Sources */, + B36DE7611D6AB231002EE3ED /* cfg.c in Sources */, + B36DE77C1D6AB231002EE3ED /* sndsave.c in Sources */, + B36DE75A1D6AB231002EE3ED /* antic.c in Sources */, + B36DE75D1D6AB231002EE3ED /* atari.c in Sources */, + B36DE77D1D6AB231002EE3ED /* screen.c in Sources */, + B36DE7591D6AB231002EE3ED /* sysrom.c in Sources */, + B36DE7631D6AB231002EE3ED /* colours_ntsc.c in Sources */, + B36DE7561D6AB231002EE3ED /* emuos.c in Sources */, + B36DE7691D6AB231002EE3ED /* devices.c in Sources */, + B36DE76D1D6AB231002EE3ED /* input.c in Sources */, + B36DE77E1D6AB231002EE3ED /* sound.c in Sources */, + B36DE7671D6AB231002EE3ED /* cpu.c in Sources */, + B36DE76B1D6AB231002EE3ED /* gtia.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B3D73CF21E9EAF1C0023925B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B3D73CF31E9EAF1C0023925B /* rtime.c in Sources */, + B3D73CF41E9EAF1C0023925B /* ide.c in Sources */, + B3D73CF51E9EAF1C0023925B /* crc32.c in Sources */, + B3D73CF61E9EAF1C0023925B /* cycle_map.c in Sources */, + B3D73CF71E9EAF1C0023925B /* colours_pal.c in Sources */, + B3D73CF81E9EAF1C0023925B /* pbi_mio.c in Sources */, + B3D73CF91E9EAF1C0023925B /* log.c in Sources */, + B3D73CFA1E9EAF1C0023925B /* afile.c in Sources */, + B3D73CFB1E9EAF1C0023925B /* img_tape.c in Sources */, + B3D73CFC1E9EAF1C0023925B /* pokeysnd.c in Sources */, + B3D73CFD1E9EAF1C0023925B /* util.c in Sources */, + B3D73CFE1E9EAF1C0023925B /* colours_external.c in Sources */, + B3D73CFF1E9EAF1C0023925B /* pbi_scsi.c in Sources */, + B3D73D001E9EAF1C0023925B /* artifact.c in Sources */, + B3D73D011E9EAF1C0023925B /* ui_basic.c in Sources */, + B3D73D021E9EAF1C0023925B /* pbi_bb.c in Sources */, + B3D73D031E9EAF1C0023925B /* binload.c in Sources */, + B3D73D041E9EAF1C0023925B /* colours.c in Sources */, + B3D73D051E9EAF1C0023925B /* statesav.c in Sources */, + B3D73D061E9EAF1C0023925B /* cartridge.c in Sources */, + B3D73D071E9EAF1C0023925B /* memory.c in Sources */, + B3D73D081E9EAF1C0023925B /* mzpokeysnd.c in Sources */, + B3D73D091E9EAF1C0023925B /* sio.c in Sources */, + B3D73D0A1E9EAF1C0023925B /* pbi.c in Sources */, + B3D73D0B1E9EAF1C0023925B /* monitor.c in Sources */, + B3D73D0C1E9EAF1C0023925B /* ATR800GameCore.m in Sources */, + B3D73D0D1E9EAF1C0023925B /* pokey.c in Sources */, + B3D73D0E1E9EAF1C0023925B /* esc.c in Sources */, + B3D73D0F1E9EAF1C0023925B /* compfile.c in Sources */, + B3D73D101E9EAF1C0023925B /* pia.c in Sources */, + B3D73D111E9EAF1C0023925B /* remez.c in Sources */, + B3D73D121E9EAF1C0023925B /* cassette.c in Sources */, + B3D73D131E9EAF1C0023925B /* cfg.c in Sources */, + B3D73D141E9EAF1C0023925B /* sndsave.c in Sources */, + B3D73D151E9EAF1C0023925B /* antic.c in Sources */, + B3D73D161E9EAF1C0023925B /* atari.c in Sources */, + B3D73D171E9EAF1C0023925B /* screen.c in Sources */, + B3D73D181E9EAF1C0023925B /* sysrom.c in Sources */, + B3D73D191E9EAF1C0023925B /* colours_ntsc.c in Sources */, + B3D73D1A1E9EAF1C0023925B /* emuos.c in Sources */, + B3D73D1B1E9EAF1C0023925B /* devices.c in Sources */, + B3D73D1C1E9EAF1C0023925B /* input.c in Sources */, + B3D73D1D1E9EAF1C0023925B /* sound.c in Sources */, + B3D73D1E1E9EAF1C0023925B /* cpu.c in Sources */, + B3D73D1F1E9EAF1C0023925B /* gtia.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0269536D143169EB003A07D4 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0269536E143169EB003A07D4 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 02695371143169EB003A07D4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LD_NO_PIE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 02695372143169EB003A07D4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LD_NO_PIE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + SDKROOT = macosx; + }; + name = Release; + }; + B36DE74E1D6AB19C002EE3ED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_TESTABILITY = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = PVAtari800/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVAtari800; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B36DE74F1D6AB19C002EE3ED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = PVAtari800/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVAtari800; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B3D73D311E9EAF1C0023925B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_TESTABILITY = YES; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = PVAtari800/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVAtari800; + PRODUCT_NAME = PVAtari800; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B3D73D321E9EAF1C0023925B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + ENABLE_NS_ASSERTIONS = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = PVAtari800/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.jamsoftonline.PVAtari800; + PRODUCT_NAME = PVAtari800; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0269535B143169EA003A07D4 /* Build configuration list for PBXProject "PVAtari800" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 02695371143169EB003A07D4 /* Debug */, + 02695372143169EB003A07D4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B36DE74D1D6AB19C002EE3ED /* Build configuration list for PBXNativeTarget "PVAtari800" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B36DE74E1D6AB19C002EE3ED /* Debug */, + B36DE74F1D6AB19C002EE3ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B3D73D301E9EAF1C0023925B /* Build configuration list for PBXNativeTarget "PVAtari800 tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B3D73D311E9EAF1C0023925B /* Debug */, + B3D73D321E9EAF1C0023925B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 02695358143169EA003A07D4 /* Project object */; +} diff --git a/PVAtari800/PVAtari800/Info.plist b/PVAtari800/PVAtari800/Info.plist new file mode 100644 index 0000000000..d3de8eefb6 --- /dev/null +++ b/PVAtari800/PVAtari800/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/PVAtari800/PVAtari800/PVAtari800.h b/PVAtari800/PVAtari800/PVAtari800.h new file mode 100644 index 0000000000..291ca81fc4 --- /dev/null +++ b/PVAtari800/PVAtari800/PVAtari800.h @@ -0,0 +1,20 @@ +// +// PVAtari800.h +// PVAtari800 +// +// Created by Joseph Mattiello on 8/22/16. +// +// + +#import + +//! Project version number for PVAtari800. +FOUNDATION_EXPORT double PVAtari800VersionNumber; + +//! Project version string for PVAtari800. +FOUNDATION_EXPORT const unsigned char PVAtari800VersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import +#import +#import +#import diff --git a/PVAtari800/README.md b/PVAtari800/README.md new file mode 100644 index 0000000000..8a6a1537b0 --- /dev/null +++ b/PVAtari800/README.md @@ -0,0 +1,4 @@ +Atari800-Core +============= + +OpenEmu Core plugin with Atari800 to support Atari 5200 emulation \ No newline at end of file diff --git a/PVAtari800/atari800-src/act/Real.act b/PVAtari800/atari800-src/act/Real.act new file mode 100644 index 0000000000..e36ffd7294 Binary files /dev/null and b/PVAtari800/atari800-src/act/Real.act differ diff --git a/PVAtari800/atari800-src/act/XFormer.act b/PVAtari800/atari800-src/act/XFormer.act new file mode 100644 index 0000000000..ab4d10ea77 Binary files /dev/null and b/PVAtari800/atari800-src/act/XFormer.act differ diff --git a/PVAtari800/atari800-src/act/default.act b/PVAtari800/atari800-src/act/default.act new file mode 100644 index 0000000000..3ee8ebf8fe Binary files /dev/null and b/PVAtari800/atari800-src/act/default.act differ diff --git a/PVAtari800/atari800-src/act/gray.act b/PVAtari800/atari800-src/act/gray.act new file mode 100644 index 0000000000..8c570285bb Binary files /dev/null and b/PVAtari800/atari800-src/act/gray.act differ diff --git a/PVAtari800/atari800-src/act/jakub.act b/PVAtari800/atari800-src/act/jakub.act new file mode 100644 index 0000000000..396a5cf31f Binary files /dev/null and b/PVAtari800/atari800-src/act/jakub.act differ diff --git a/PVAtari800/atari800-src/af80.c b/PVAtari800/atari800-src/af80.c new file mode 100755 index 0000000000..9947e90140 --- /dev/null +++ b/PVAtari800/atari800-src/af80.c @@ -0,0 +1,390 @@ +/* + * af80.c - Emulation of the Austin Franklin 80 column card. + * + * Copyright (C) 2009 Perry McFarlane + * Copyright (C) 2009 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "af80.h" +#include "atari.h" +#include "util.h" +#include "log.h" +#include "memory.h" +#include "cpu.h" +#include + +static UBYTE *af80_rom = NULL; +static char af80_rom_filename[FILENAME_MAX]; +static UBYTE *af80_charset = NULL; +static char af80_charset_filename[FILENAME_MAX]; + +static UBYTE *af80_screen = NULL; +static UBYTE *af80_attrib = NULL; + +int AF80_enabled = FALSE; + +/* Austin Franklin information from forum posts by warerat at Atariage */ +static int rom_bank_select; /* bits 0-3 of d5f7, $0-$f 16 banks */ +static int not_rom_output_enable; /* bit 4 of d5f7 0 = Enable ROM 1 = Disable ROM */ +static int not_right_cartridge_rd4_control; /* 0=$8000-$9fff cart ROM, 1= $8000-$9fff system RAM */ +static int not_enable_2k_character_ram; +static int not_enable_2k_attribute_ram; +static int not_enable_crtc_registers; +static int not_enable_80_column_output; +static int video_bank_select; /* bits 0-3 of d5f6, $0-$f 16 banks */ +static int crtreg[0x40]; +static int const rgbi_palette[16] = { + 0x000000, /* black */ + 0x0000AA, /* blue */ + 0x00AA00, /* green */ + 0x00AAAA, /* cyan */ + 0xAA0000, /* red */ + 0xAA00AA, /* magenta */ + 0xAA5500, /* brown */ + 0xAAAAAA, /* white */ + 0x555555, /* grey */ + 0x5555FF, /* light blue */ + 0x55FF55, /* light green */ + 0x55FFFF, /* light cyan */ + 0xFF5555, /* light red */ + 0xFF55FF, /* light magenta */ + 0xFFFF55, /* yellow */ + 0xFFFFFF /* white (high intensity) */ +}; +int AF80_palette[16]; + +#ifdef AF80_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +static void update_d6(void) +{ + if (!not_enable_2k_character_ram) { + memcpy(MEMORY_mem + 0xd600, af80_screen + (video_bank_select<<7), 0x80); + memcpy(MEMORY_mem + 0xd680, af80_screen + (video_bank_select<<7), 0x80); + } + else if (!not_enable_2k_attribute_ram) { + memcpy(MEMORY_mem + 0xd600, af80_attrib + (video_bank_select<<7), 0x80); + memcpy(MEMORY_mem + 0xd680, af80_attrib + (video_bank_select<<7), 0x80); + } + else if (not_enable_crtc_registers) { + memset(MEMORY_mem + 0xd600, 0xff, 0x100); + } +} + +static void update_d5(void) +{ + if (not_rom_output_enable) { + memset(MEMORY_mem + 0xd500, 0xff, 0x100); + } + else { + memcpy(MEMORY_mem + 0xd500, af80_rom + (rom_bank_select<<8), 0x100); + } +} + +static void update_8000_9fff(void) +{ + if (not_right_cartridge_rd4_control) return; + if (not_rom_output_enable) { + memset(MEMORY_mem + 0x8000, 0xff, 0x2000); + } + else { + int i; + for (i=0; i<32; i++) { + memcpy(MEMORY_mem + 0x8000 + (i<<8), af80_rom + (rom_bank_select<<8), 0x100); + } + } +} + +int AF80_Initialise(int *argc, char *argv[]) +{ + int i, j; + int help_only = FALSE; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-af80") == 0) { + AF80_enabled = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + help_only = TRUE; + Log_print("\t-af80 Emulate the Austin Franklin 80 column board"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + if (help_only) + return TRUE; + + if (AF80_enabled) { + Log_print("Austin Franklin 80 enabled"); + af80_rom = (UBYTE *)Util_malloc(0x1000); + if (!Atari800_LoadImage(af80_rom_filename, af80_rom, 0x1000)) { + free(af80_rom); + af80_rom = NULL; + AF80_enabled = FALSE; + Log_print("Couldn't load Austin Franklin ROM image"); + return FALSE; + } + else { + Log_print("loaded Austin Franklin rom image"); + } + af80_charset = (UBYTE *)Util_malloc(0x1000); + if (!Atari800_LoadImage(af80_charset_filename, af80_charset, 0x1000)) { + free(af80_charset); + free(af80_rom); + af80_charset = af80_rom = NULL; + AF80_enabled = FALSE; + Log_print("Couldn't load Austin Franklin charset image"); + return FALSE; + } + else { + Log_print("loaded Austin Franklin charset image"); + } + af80_screen = (UBYTE *)Util_malloc(0x800); + af80_attrib = (UBYTE *)Util_malloc(0x800); + AF80_Reset(); + + /* swap palette */ + for (i=0; i<16; i++ ) { + j=i; + j = (j&0x0a) + ((j&0x01) << 2) + ((j&0x04) >> 2); + AF80_palette[i] = rgbi_palette[j]; + } + } + + return TRUE; +} + +void AF80_Exit(void) +{ + free(af80_screen); + free(af80_attrib); + free(af80_charset); + free(af80_rom); + af80_screen = af80_attrib = af80_charset = af80_rom = NULL; +} + +void AF80_InsertRightCartridge(void) +{ + MEMORY_Cart809fEnable(); + update_d5(); + update_8000_9fff(); +} + +int AF80_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "AF80_ROM") == 0) + Util_strlcpy(af80_rom_filename, ptr, sizeof(af80_rom_filename)); + else if (strcmp(string, "AF80_CHARSET") == 0) + Util_strlcpy(af80_charset_filename, ptr, sizeof(af80_charset_filename)); + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void AF80_WriteConfig(FILE *fp) +{ + fprintf(fp, "AF80_ROM=%s\n", af80_rom_filename); + fprintf(fp, "AF80_CHARSET=%s\n", af80_charset_filename); +} + +int AF80_D6GetByte(UWORD addr, int no_side_effects) +{ + int result = 0xff; + if (!not_enable_2k_character_ram) { + result = MEMORY_dGetByte(addr); + } + else if (!not_enable_2k_attribute_ram) { + result = MEMORY_dGetByte(addr); + } + else if (!not_enable_crtc_registers) { + if (video_bank_select == 0 ) { + if ((addr&0xff)<0x40) { + result = crtreg[addr&0xff]; + if ((addr&0xff) == 0x3a) { + result = 0x01; + } + } + D(printf("AF80 Read addr:%4x cpu:%4x\n", addr, CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + } + return result; +} + +void AF80_D6PutByte(UWORD addr, UBYTE byte) +{ + if (!not_enable_2k_character_ram) { + MEMORY_dPutByte((addr&0xff7f),byte); + MEMORY_dPutByte((addr&0xff7f)+0x80,byte); + af80_screen[(addr&0x7f) + (video_bank_select<<7)] = byte; + } + else if (!not_enable_2k_attribute_ram) { + MEMORY_dPutByte((addr&0xff7f),byte); + MEMORY_dPutByte((addr&0xff7f)+0x80,byte); + af80_attrib[(addr&0x7f) + (video_bank_select<<7)] = byte; + D(printf("AF80 Write, attribute, addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + else if (!not_enable_crtc_registers) { + if (video_bank_select == 0 ) { + if ((addr&0xff)<0x40) { + crtreg[addr&0xff] = byte; + } + D(if (1 || (addr!=0xd618 && addr!=0xd619)) printf("AF80 Write addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + else { + D(printf("AF80 Write, video_bank_select!=0, addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + } + } +} + +int AF80_D5GetByte(UWORD addr, int no_side_effects) +{ + int result = MEMORY_dGetByte(addr); + return result; +} + +void AF80_D5PutByte(UWORD addr, UBYTE byte) +{ + if (addr == 0xd5f6) { + int need_update_d6 = FALSE; + if ((byte&0x10) != not_enable_2k_character_ram) { + not_enable_2k_character_ram = (byte & 0x10); + need_update_d6 = TRUE; + } + if ((byte&0x20) != not_enable_2k_attribute_ram) { + not_enable_2k_attribute_ram = (byte & 0x20); + need_update_d6 = TRUE; + } + if ((byte&0x40) != not_enable_crtc_registers) { + not_enable_crtc_registers = (byte & 0x40); + need_update_d6 = TRUE; + } + if ((byte&0x80) != not_enable_80_column_output) { + not_enable_80_column_output = (byte & 0x80); + } + if ((byte&0x0f) != video_bank_select) { + video_bank_select = (byte & 0x0f); + need_update_d6 = TRUE; + } + if (need_update_d6) { + update_d6(); + } + } + else if (addr == 0xd5f7) { + int need_update_d5 = FALSE; + int need_update_8000_9fff = FALSE; + if ((byte&0x10) != not_rom_output_enable) { + not_rom_output_enable = (byte & 0x10); + need_update_d5 = TRUE; + if (byte&0x20) { + need_update_8000_9fff = TRUE; + } + } + if ((byte&0x20) != not_right_cartridge_rd4_control) { + not_right_cartridge_rd4_control = (byte & 0x20); + if (not_right_cartridge_rd4_control) { + MEMORY_Cart809fDisable(); + } + else { + MEMORY_Cart809fEnable(); + need_update_8000_9fff = TRUE; + } + } + if ((byte&0x0f) != rom_bank_select) { + rom_bank_select = (byte & 0x0f); + if (!not_rom_output_enable) { + need_update_d5 = TRUE; + if (!not_right_cartridge_rd4_control) { + need_update_8000_9fff = TRUE; + } + } + } + if (need_update_d5) { + update_d5(); + } + if (need_update_8000_9fff) { + update_8000_9fff(); + } + } + D(if (addr!=0xd5f7 && addr!=0xd5f6) printf("AF80 Write addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); +} + +UBYTE AF80_GetPixels(int scanline, int column, int *colour, int blink) +{ +#define AF80_ROWS 25 +#define AF80_CELL_HEIGHT 10 + UBYTE character; + int attrib; + UBYTE font_data; + int table_start = crtreg[0x0c] + ((crtreg[0x0d]&0x3f)<<8); + int row = scanline / AF80_CELL_HEIGHT; + int line = scanline % AF80_CELL_HEIGHT; + int screen_pos; + if (row >= AF80_ROWS) { + return 0; + } + + if (row >= crtreg[0x10]) { + screen_pos = (row-crtreg[0x10])*80 + column + crtreg[0x0e] + ((crtreg[0x0f]&0x3f)<<8); + } + else { + screen_pos = row*80+column + table_start; + } + screen_pos &= 0x7ff; + character = af80_screen[screen_pos]; + attrib = af80_attrib[screen_pos]; + font_data = af80_charset[character*16 + line]; + if (attrib & 0x01) { + font_data ^= 0xff; /* invert */ + } + if ((attrib & 0x02) && blink) { + font_data = 0x00; /* blink */ + } + if (line+1 == AF80_CELL_HEIGHT && (attrib & 0x04)) { + font_data = 0xff; /* underline */ + } + if (row == crtreg[0x18] && column == crtreg[0x19] && !blink) { + font_data = 0xff; /* cursor */ + } + *colour = attrib>>4; /* set number of palette entry */ + return font_data; +} + +void AF80_Reset(void) +{ + memset(af80_screen, 0, 0x800); + memset(af80_attrib, 0, 0x800); + rom_bank_select = 0; + not_rom_output_enable = 0; + not_right_cartridge_rd4_control = 0; + not_enable_2k_character_ram = 0; + not_enable_2k_attribute_ram = 0; + not_enable_crtc_registers = 0; + not_enable_80_column_output = 0; + video_bank_select = 0; + memset(crtreg, 0, 0x40); +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/af80.h b/PVAtari800/atari800-src/af80.h new file mode 100755 index 0000000000..12950242a0 --- /dev/null +++ b/PVAtari800/atari800-src/af80.h @@ -0,0 +1,21 @@ +#ifndef AF80_H_ +#define AF80_H_ + +#include "atari.h" +#include + +extern int AF80_palette[16]; +int AF80_Initialise(int *argc, char *argv[]); +void AF80_Exit(void); +void AF80_InsertRightCartridge(void); +int AF80_ReadConfig(char *string, char *ptr); +void AF80_WriteConfig(FILE *fp); +int AF80_D5GetByte(UWORD addr, int no_side_effects); +void AF80_D5PutByte(UWORD addr, UBYTE byte); +int AF80_D6GetByte(UWORD addr, int no_side_effects); +void AF80_D6PutByte(UWORD addr, UBYTE byte); +UBYTE AF80_GetPixels(int scanline, int column, int *colour, int blink); +extern int AF80_enabled; +void AF80_Reset(void); + +#endif /* AF80_H_ */ diff --git a/PVAtari800/atari800-src/afile.c b/PVAtari800/atari800-src/afile.c new file mode 100755 index 0000000000..a1c84a630d --- /dev/null +++ b/PVAtari800/atari800-src/afile.c @@ -0,0 +1,245 @@ +/* + * afile.c - Detection and opening of different Atari file types. + * + * Copyright (c) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "config.h" +#include "atari.h" +#include "afile.h" +#include "binload.h" +#include "cartridge.h" +#include "cassette.h" +#include "gtia.h" +#include "img_tape.h" +#include "log.h" +#include "sio.h" +#include "statesav.h" +#include "util.h" +#ifndef BASIC +#include "ui.h" +#endif /* BASIC */ +#ifdef HAVE_LIBZ +#include +#endif +#include + + +int AFILE_DetectFileType(const char *filename) +{ + UBYTE header[4]; + int file_length; + FILE *fp = fopen(filename, "rb"); + if (fp == NULL) + return AFILE_ERROR; + if (fread(header, 1, 4, fp) != 4) { + fclose(fp); + return AFILE_ERROR; + } + switch (header[0]) { + case 0: + if (header[1] == 0 && (header[2] != 0 || header[3] != 0) /* && file_length < 37 * 1024 */) { + fclose(fp); + return AFILE_BAS; + } + break; + case 0x1f: + if (header[1] == 0x8b) { +#ifndef HAVE_LIBZ + fclose(fp); + Log_print("\"%s\" is a compressed file.", filename); + Log_print("This executable does not support compressed files. You can uncompress this file"); + Log_print("with an external program that supports gzip (*.gz) files (e.g. gunzip)"); + Log_print("and then load into this emulator."); + return AFILE_ERROR; +#else /* HAVE_LIBZ */ + gzFile gzf; + fclose(fp); + gzf = gzopen(filename, "rb"); + if (gzf == NULL) + return AFILE_ERROR; + if (gzread(gzf, header, 4) != 4) { + gzclose(gzf); + return AFILE_ERROR; + } + gzclose(gzf); + if (header[0] == 0x96 && header[1] == 0x02) + return AFILE_ATR_GZ; + if (header[0] == 'A' && header[1] == 'T' && header[2] == 'A' && header[3] == 'R') + return AFILE_STATE_GZ; + return AFILE_XFD_GZ; +#endif /* HAVE_LIBZ */ + } + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if ((header[1] >= '0' && header[1] <= '9') || header[1] == ' ') { + fclose(fp); + return AFILE_LST; + } + break; + case 'A': + if (header[1] == 'T' && header[2] == 'A' && header[3] == 'R') { + fclose(fp); + return AFILE_STATE; + } + if (header[1] == 'T' && header[2] == '8' && header[3] == 'X') { + fclose(fp); + return AFILE_ATX; + } + break; + case 'C': + if (header[1] == 'A' && header[2] == 'R' && header[3] == 'T') { + fclose(fp); + return AFILE_CART; + } + break; + case 0x96: + if (header[1] == 0x02) { + fclose(fp); + return AFILE_ATR; + } + break; + case 0xf9: + case 0xfa: + fclose(fp); + return AFILE_DCM; + case 0xff: + if (header[1] == 0xff && (header[2] != 0xff || header[3] != 0xff)) { + fclose(fp); + return AFILE_XEX; + } + break; + default: + break; + } + file_length = Util_flen(fp); + fclose(fp); + /* Detect .pro images */ + /* # of sectors is in header */ + if ((file_length-16)%(128+12) == 0 && + header[0]*256 + header[1] == (file_length-16)/(128+12) && + header[2] == 'P') { +#ifdef DEBUG_PRO + Log_print(".pro file detected"); +#endif + return AFILE_PRO; + } + /* 40K or a-power-of-two between 4K and CARTRIDGE_MAX_SIZE */ + if (file_length >= 4 * 1024 && file_length <= CARTRIDGE_MAX_SIZE + && ((file_length & (file_length - 1)) == 0 || file_length == 40 * 1024)) + return AFILE_ROM; + /* BOOT_TAPE is a raw file containing a program booted from a tape */ + if ((header[1] << 7) == file_length) + return AFILE_BOOT_TAPE; + if ((file_length & 0x7f) == 0) + return AFILE_XFD; + if (IMG_TAPE_FileSupported(header)) + return AFILE_CAS; + return AFILE_ERROR; +} + +int AFILE_OpenFile(const char *filename, int reboot, int diskno, int readonly) +{ + int type = AFILE_DetectFileType(filename); + switch (type) { + case AFILE_ATR: + case AFILE_ATX: + case AFILE_XFD: + case AFILE_ATR_GZ: + case AFILE_XFD_GZ: + case AFILE_DCM: + case AFILE_PRO: + if (!SIO_Mount(diskno, filename, readonly)) + return AFILE_ERROR; + if (reboot) + Atari800_Coldstart(); + break; + case AFILE_XEX: + case AFILE_BAS: + case AFILE_LST: + if (!BINLOAD_Loader(filename)) + return AFILE_ERROR; + break; + case AFILE_CART: + case AFILE_ROM: + { + int r; + if (reboot) + r = CARTRIDGE_InsertAutoReboot(filename); + else + r = CARTRIDGE_Insert(filename); + switch (r) { + case CARTRIDGE_CANT_OPEN: + case CARTRIDGE_BAD_FORMAT: + return AFILE_ERROR; + case CARTRIDGE_BAD_CHECKSUM: + case 0: + /* ok */ + break; + default: +#ifdef BASIC + Log_print("Raw cartridge images are not supported in BASIC version."); + return AFILE_ERROR; +#else /* BASIC */ + /* r > 0 */ +#ifndef ANDROID + CARTRIDGE_SetTypeAutoReboot(&CARTRIDGE_main, UI_SelectCartType(r)); +#else + return (r << 8) | AFILE_ROM; +#endif /* ANDROID */ + break; +#endif /* BASIC */ + } + } + break; + case AFILE_CAS: + case AFILE_BOOT_TAPE: + if (!CASSETTE_Insert(filename)) + return AFILE_ERROR; + if (reboot) { + CASSETTE_hold_start = TRUE; + Atari800_Coldstart(); + } + break; + case AFILE_STATE: + case AFILE_STATE_GZ: +#ifdef BASIC + Log_print("State files are not supported in BASIC version"); + return AFILE_ERROR; +#else + if (!StateSav_ReadAtariState(filename, "rb")) + return AFILE_ERROR; + /* Don't press Start nor Option */ + GTIA_consol_override = 0; + break; +#endif + default: + break; + } + return type; +} diff --git a/PVAtari800/atari800-src/afile.h b/PVAtari800/atari800-src/afile.h new file mode 100755 index 0000000000..032cafe8b1 --- /dev/null +++ b/PVAtari800/atari800-src/afile.h @@ -0,0 +1,50 @@ +#ifndef AFILE_H_ +#define AFILE_H_ + +/* File types returned by AFILE_DetectFileType() and AFILE_OpenFile(). */ +#define AFILE_ERROR 0 +#define AFILE_ATR 1 +#define AFILE_XFD 2 +#define AFILE_ATR_GZ 3 +#define AFILE_XFD_GZ 4 +#define AFILE_DCM 5 +#define AFILE_XEX 6 +#define AFILE_BAS 7 +#define AFILE_LST 8 +#define AFILE_CART 9 +#define AFILE_ROM 10 +#define AFILE_CAS 11 +#define AFILE_BOOT_TAPE 12 +#define AFILE_STATE 13 +#define AFILE_STATE_GZ 14 +#define AFILE_PRO 15 +#define AFILE_ATX 16 + +/* ATR format header */ +struct AFILE_ATR_Header { + unsigned char magic1; + unsigned char magic2; + unsigned char seccountlo; + unsigned char seccounthi; + unsigned char secsizelo; + unsigned char secsizehi; + unsigned char hiseccountlo; + unsigned char hiseccounthi; + unsigned char gash[7]; + unsigned char writeprotect; +}; + +/* First two bytes of an ATR file. */ +#define AFILE_ATR_MAGIC1 0x96 +#define AFILE_ATR_MAGIC2 0x02 + +/* Auto-detects file type and returns one of AFILE_* values. */ +int AFILE_DetectFileType(const char *filename); + +/* Auto-detects file type and mounts the file in the emulator. + reboot: Atari800_Coldstart() for disks, cartridges and tapes + diskno: drive number for disks (1-8) + readonly: mount disks as read-only */ +int AFILE_OpenFile(const char *filename, int reboot, int diskno, int readonly); + +#endif /* AFILE_H_ */ diff --git a/PVAtari800/atari800-src/akey.h b/PVAtari800/atari800-src/akey.h new file mode 100755 index 0000000000..07e9b3d540 --- /dev/null +++ b/PVAtari800/atari800-src/akey.h @@ -0,0 +1,255 @@ +#ifndef AKEY_H_ +#define AKEY_H_ +/* akey.h: Atari key codes */ + +/* INPUT_key_code values */ +#define AKEY_NONE -1 + +/* Special key codes. */ +#define AKEY_WARMSTART -2 +#define AKEY_COLDSTART -3 +#define AKEY_EXIT -4 +#define AKEY_BREAK -5 +#define AKEY_UI -7 +#define AKEY_SCREENSHOT -8 +#define AKEY_SCREENSHOT_INTERLACE -9 +#define AKEY_START -10 +#define AKEY_SELECT -11 +#define AKEY_OPTION -12 +#define AKEY_PBI_BB_MENU -13 +#define AKEY_CX85_1 -14 +#define AKEY_CX85_2 -15 +#define AKEY_CX85_3 -16 +#define AKEY_CX85_4 -17 +#define AKEY_CX85_5 -18 +#define AKEY_CX85_6 -19 +#define AKEY_CX85_7 -20 +#define AKEY_CX85_8 -21 +#define AKEY_CX85_9 -22 +#define AKEY_CX85_0 -23 +#define AKEY_CX85_PERIOD -24 +#define AKEY_CX85_MINUS -25 +#define AKEY_CX85_PLUS_ENTER -26 +#define AKEY_CX85_ESCAPE -27 +#define AKEY_CX85_NO -28 +#define AKEY_CX85_DELETE -29 +#define AKEY_CX85_YES -30 +#define AKEY_TURBO -31 +#ifdef USE_UI_BASIC_ONSCREEN_KEYBOARD +#define AKEY_KEYB -32 +#endif +#ifdef DIRECTX + /* special menu directives */ + #define AKEY32_MENU_SAVE_CONFIG -107 + #define AKEY32_UI_MOUSE_CLICK -108 +#endif + +#define AKEY_SHFT 0x40 +#define AKEY_CTRL 0x80 +#define AKEY_SHFTCTRL 0xc0 + +#define AKEY_0 0x32 +#define AKEY_1 0x1f +#define AKEY_2 0x1e +#define AKEY_3 0x1a +#define AKEY_4 0x18 +#define AKEY_5 0x1d +#define AKEY_6 0x1b +#define AKEY_7 0x33 +#define AKEY_8 0x35 +#define AKEY_9 0x30 + +#define AKEY_CTRL_0 (AKEY_CTRL | AKEY_0) +#define AKEY_CTRL_1 (AKEY_CTRL | AKEY_1) +#define AKEY_CTRL_2 (AKEY_CTRL | AKEY_2) +#define AKEY_CTRL_3 (AKEY_CTRL | AKEY_3) +#define AKEY_CTRL_4 (AKEY_CTRL | AKEY_4) +#define AKEY_CTRL_5 (AKEY_CTRL | AKEY_5) +#define AKEY_CTRL_6 (AKEY_CTRL | AKEY_6) +#define AKEY_CTRL_7 (AKEY_CTRL | AKEY_7) +#define AKEY_CTRL_8 (AKEY_CTRL | AKEY_8) +#define AKEY_CTRL_9 (AKEY_CTRL | AKEY_9) + +#define AKEY_a 0x3f +#define AKEY_b 0x15 +#define AKEY_c 0x12 +#define AKEY_d 0x3a +#define AKEY_e 0x2a +#define AKEY_f 0x38 +#define AKEY_g 0x3d +#define AKEY_h 0x39 +#define AKEY_i 0x0d +#define AKEY_j 0x01 +#define AKEY_k 0x05 +#define AKEY_l 0x00 +#define AKEY_m 0x25 +#define AKEY_n 0x23 +#define AKEY_o 0x08 +#define AKEY_p 0x0a +#define AKEY_q 0x2f +#define AKEY_r 0x28 +#define AKEY_s 0x3e +#define AKEY_t 0x2d +#define AKEY_u 0x0b +#define AKEY_v 0x10 +#define AKEY_w 0x2e +#define AKEY_x 0x16 +#define AKEY_y 0x2b +#define AKEY_z 0x17 + +#define AKEY_A (AKEY_SHFT | AKEY_a) +#define AKEY_B (AKEY_SHFT | AKEY_b) +#define AKEY_C (AKEY_SHFT | AKEY_c) +#define AKEY_D (AKEY_SHFT | AKEY_d) +#define AKEY_E (AKEY_SHFT | AKEY_e) +#define AKEY_F (AKEY_SHFT | AKEY_f) +#define AKEY_G (AKEY_SHFT | AKEY_g) +#define AKEY_H (AKEY_SHFT | AKEY_h) +#define AKEY_I (AKEY_SHFT | AKEY_i) +#define AKEY_J (AKEY_SHFT | AKEY_j) +#define AKEY_K (AKEY_SHFT | AKEY_k) +#define AKEY_L (AKEY_SHFT | AKEY_l) +#define AKEY_M (AKEY_SHFT | AKEY_m) +#define AKEY_N (AKEY_SHFT | AKEY_n) +#define AKEY_O (AKEY_SHFT | AKEY_o) +#define AKEY_P (AKEY_SHFT | AKEY_p) +#define AKEY_Q (AKEY_SHFT | AKEY_q) +#define AKEY_R (AKEY_SHFT | AKEY_r) +#define AKEY_S (AKEY_SHFT | AKEY_s) +#define AKEY_T (AKEY_SHFT | AKEY_t) +#define AKEY_U (AKEY_SHFT | AKEY_u) +#define AKEY_V (AKEY_SHFT | AKEY_v) +#define AKEY_W (AKEY_SHFT | AKEY_w) +#define AKEY_X (AKEY_SHFT | AKEY_x) +#define AKEY_Y (AKEY_SHFT | AKEY_y) +#define AKEY_Z (AKEY_SHFT | AKEY_z) + +#define AKEY_CTRL_a (AKEY_CTRL | AKEY_a) +#define AKEY_CTRL_b (AKEY_CTRL | AKEY_b) +#define AKEY_CTRL_c (AKEY_CTRL | AKEY_c) +#define AKEY_CTRL_d (AKEY_CTRL | AKEY_d) +#define AKEY_CTRL_e (AKEY_CTRL | AKEY_e) +#define AKEY_CTRL_f (AKEY_CTRL | AKEY_f) +#define AKEY_CTRL_g (AKEY_CTRL | AKEY_g) +#define AKEY_CTRL_h (AKEY_CTRL | AKEY_h) +#define AKEY_CTRL_i (AKEY_CTRL | AKEY_i) +#define AKEY_CTRL_j (AKEY_CTRL | AKEY_j) +#define AKEY_CTRL_k (AKEY_CTRL | AKEY_k) +#define AKEY_CTRL_l (AKEY_CTRL | AKEY_l) +#define AKEY_CTRL_m (AKEY_CTRL | AKEY_m) +#define AKEY_CTRL_n (AKEY_CTRL | AKEY_n) +#define AKEY_CTRL_o (AKEY_CTRL | AKEY_o) +#define AKEY_CTRL_p (AKEY_CTRL | AKEY_p) +#define AKEY_CTRL_q (AKEY_CTRL | AKEY_q) +#define AKEY_CTRL_r (AKEY_CTRL | AKEY_r) +#define AKEY_CTRL_s (AKEY_CTRL | AKEY_s) +#define AKEY_CTRL_t (AKEY_CTRL | AKEY_t) +#define AKEY_CTRL_u (AKEY_CTRL | AKEY_u) +#define AKEY_CTRL_v (AKEY_CTRL | AKEY_v) +#define AKEY_CTRL_w (AKEY_CTRL | AKEY_w) +#define AKEY_CTRL_x (AKEY_CTRL | AKEY_x) +#define AKEY_CTRL_y (AKEY_CTRL | AKEY_y) +#define AKEY_CTRL_z (AKEY_CTRL | AKEY_z) + +#define AKEY_CTRL_A (AKEY_CTRL | AKEY_A) +#define AKEY_CTRL_B (AKEY_CTRL | AKEY_B) +#define AKEY_CTRL_C (AKEY_CTRL | AKEY_C) +#define AKEY_CTRL_D (AKEY_CTRL | AKEY_D) +#define AKEY_CTRL_E (AKEY_CTRL | AKEY_E) +#define AKEY_CTRL_F (AKEY_CTRL | AKEY_F) +#define AKEY_CTRL_G (AKEY_CTRL | AKEY_G) +#define AKEY_CTRL_H (AKEY_CTRL | AKEY_H) +#define AKEY_CTRL_I (AKEY_CTRL | AKEY_I) +#define AKEY_CTRL_J (AKEY_CTRL | AKEY_J) +#define AKEY_CTRL_K (AKEY_CTRL | AKEY_K) +#define AKEY_CTRL_L (AKEY_CTRL | AKEY_L) +#define AKEY_CTRL_M (AKEY_CTRL | AKEY_M) +#define AKEY_CTRL_N (AKEY_CTRL | AKEY_N) +#define AKEY_CTRL_O (AKEY_CTRL | AKEY_O) +#define AKEY_CTRL_P (AKEY_CTRL | AKEY_P) +#define AKEY_CTRL_Q (AKEY_CTRL | AKEY_Q) +#define AKEY_CTRL_R (AKEY_CTRL | AKEY_R) +#define AKEY_CTRL_S (AKEY_CTRL | AKEY_S) +#define AKEY_CTRL_T (AKEY_CTRL | AKEY_T) +#define AKEY_CTRL_U (AKEY_CTRL | AKEY_U) +#define AKEY_CTRL_V (AKEY_CTRL | AKEY_V) +#define AKEY_CTRL_W (AKEY_CTRL | AKEY_W) +#define AKEY_CTRL_X (AKEY_CTRL | AKEY_X) +#define AKEY_CTRL_Y (AKEY_CTRL | AKEY_Y) +#define AKEY_CTRL_Z (AKEY_CTRL | AKEY_Z) + +#define AKEY_HELP 0x11 +#define AKEY_DOWN 0x8f +#define AKEY_LEFT 0x86 +#define AKEY_RIGHT 0x87 +#define AKEY_UP 0x8e +#define AKEY_BACKSPACE 0x34 +#define AKEY_DELETE_CHAR 0xb4 +#define AKEY_DELETE_LINE 0x74 +#define AKEY_INSERT_CHAR 0xb7 +#define AKEY_INSERT_LINE 0x77 +#define AKEY_ESCAPE 0x1c +#define AKEY_ATARI 0x27 +#define AKEY_CAPSLOCK 0x7c +#define AKEY_CAPSTOGGLE 0x3c +#define AKEY_TAB 0x2c +#define AKEY_SETTAB 0x6c +#define AKEY_CLRTAB 0xac +#define AKEY_RETURN 0x0c +#define AKEY_SPACE 0x21 +#define AKEY_EXCLAMATION 0x5f +#define AKEY_DBLQUOTE 0x5e +#define AKEY_HASH 0x5a +#define AKEY_DOLLAR 0x58 +#define AKEY_PERCENT 0x5d +#define AKEY_AMPERSAND 0x5b +#define AKEY_QUOTE 0x73 +#define AKEY_AT 0x75 +#define AKEY_PARENLEFT 0x70 +#define AKEY_PARENRIGHT 0x72 +#define AKEY_LESS 0x36 +#define AKEY_GREATER 0x37 +#define AKEY_EQUAL 0x0f +#define AKEY_QUESTION 0x66 +#define AKEY_MINUS 0x0e +#define AKEY_PLUS 0x06 +#define AKEY_ASTERISK 0x07 +#define AKEY_SLASH 0x26 +#define AKEY_COLON 0x42 +#define AKEY_SEMICOLON 0x02 +#define AKEY_COMMA 0x20 +#define AKEY_FULLSTOP 0x22 +#define AKEY_UNDERSCORE 0x4e +#define AKEY_BRACKETLEFT 0x60 +#define AKEY_BRACKETRIGHT 0x62 +#define AKEY_CIRCUMFLEX 0x47 +#define AKEY_BACKSLASH 0x46 +#define AKEY_BAR 0x4f +#define AKEY_CLEAR (AKEY_SHFT | AKEY_LESS) +#define AKEY_CARET (AKEY_SHFT | AKEY_ASTERISK) +#define AKEY_F1 0x03 +#define AKEY_F2 0x04 +#define AKEY_F3 0x13 +#define AKEY_F4 0x14 + +/* Following keys cannot be read with both shift and control pressed: + J K L ; + * Z X C V B F1 F2 F3 F4 HELP */ + +/* 5200 key codes */ +#define AKEY_5200_START 0x39 +#define AKEY_5200_PAUSE 0x31 +#define AKEY_5200_RESET 0x29 +#define AKEY_5200_0 0x25 +#define AKEY_5200_1 0x3f +#define AKEY_5200_2 0x3d +#define AKEY_5200_3 0x3b +#define AKEY_5200_4 0x37 +#define AKEY_5200_5 0x35 +#define AKEY_5200_6 0x33 +#define AKEY_5200_7 0x2f +#define AKEY_5200_8 0x2d +#define AKEY_5200_9 0x2b +#define AKEY_5200_HASH 0x23 +#define AKEY_5200_ASTERISK 0x27 + +#endif /* AKEY_H_ */ diff --git a/PVAtari800/atari800-src/antic.c b/PVAtari800/atari800-src/antic.c new file mode 100644 index 0000000000..4a9f9f89de --- /dev/null +++ b/PVAtari800/atari800-src/antic.c @@ -0,0 +1,4146 @@ +/* + * antic.c - ANTIC chip emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include + +#include "antic.h" +#include "atari.h" +#include "cpu.h" +#include "gtia.h" +#include "log.h" +#include "memory.h" +#include "platform.h" +#include "pokey.h" +#include "util.h" +#if !defined(BASIC) && !defined(CURSES_BASIC) +#include "input.h" +#include "screen.h" +#endif +#ifndef BASIC +#include "statesav.h" +#endif +#ifdef NEW_CYCLE_EXACT +#include "cycle_map.h" +#endif + +#define LCHOP 3 /* do not build leftmost 0..3 characters in wide mode */ +#define RCHOP 3 /* do not build rightmost 0..3 characters in wide mode */ + +int ANTIC_break_ypos = 999; +#if !defined(BASIC) && !defined(CURSES_BASIC) +static int gtia_bug_active = FALSE; /* The GTIA bug mode is active */ +#endif +#ifdef NEW_CYCLE_EXACT +static void draw_partial_scanline(int l,int r); +static void update_scanline_chbase(void); +static void update_scanline_invert(void); +static void update_scanline_blank(void); +const int *ANTIC_cpu2antic_ptr; +const int *ANTIC_antic2cpu_ptr; +int ANTIC_delayed_wsync = 0; +static int dmactl_changed = 0; +static UBYTE delayed_DMACTL; +static int draw_antic_ptr_changed = 0; +static UBYTE need_load; +static int dmactl_bug_chdata; +#endif /* NEW_CYCLE_EXACT */ +#ifndef NO_SIMPLE_PAL_BLENDING +int ANTIC_pal_blending = 0; +#endif /* NO_SIMPLE_PAL_BLENDING */ + +/* Video memory access is hidden behind these macros. It allows to track dirty video memory + to improve video system performance */ +#ifdef DIRTYRECT + +static UWORD *scratchUWordPtr; +static UWORD scratchUWord; +static ULONG *scratchULongPtr; +static ULONG scratchULong; +static UBYTE *scratchUBytePtr; +static UBYTE scratchUByte; + +#ifdef NODIRTYCOMPARE + +#define WRITE_VIDEO(ptr, val) \ + do { \ + scratchUWordPtr = (ptr); \ + Screen_dirty[((ULONG) scratchUWordPtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchUWordPtr = (val); \ + } while (0) +#define WRITE_VIDEO_LONG(ptr, val) \ + do { \ + scratchULongPtr = (ptr); \ + Screen_dirty[((ULONG) scratchULongPtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchULongPtr = (val); \ + } while (0) +#define WRITE_VIDEO_BYTE(ptr, val) \ + do { \ + scratchUBytePtr = (ptr); \ + Screen_dirty[((ULONG) scratchUBytePtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchUBytePtr = (val); \ + } while (0) +#define FILL_VIDEO(ptr, val, size) \ + do { \ + scratchUBytePtr = (UBYTE*) (ptr); \ + scratchULong = (ULONG) (size); \ + memset(Screen_dirty + (((ULONG) scratchUBytePtr - (ULONG) Screen_atari) >> 3), 1, scratchULong >> 3); \ + memset(scratchUBytePtr, (val), scratchULong); \ + } while (0) + +#else /* NODIRTYCOMPARE not defined: */ + +#define WRITE_VIDEO(ptr, val) \ + do { \ + scratchUWordPtr = (ptr); \ + scratchUWord = (val); \ + if (*scratchUWordPtr != scratchUWord) { \ + Screen_dirty[((ULONG) scratchUWordPtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchUWordPtr = scratchUWord; \ + } \ + } while (0) +#ifndef WORDS_UNALIGNED_OK +#define WRITE_VIDEO_LONG(ptr, val) \ + do { \ + scratchULongPtr = (ptr); \ + scratchULong = (val); \ + if (*scratchULongPtr != scratchULong) { \ + Screen_dirty[((ULONG) scratchULongPtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchULongPtr = scratchULong; \ + } \ + } while (0) +#else +#define WRITE_VIDEO_LONG(ptr, val) \ + do { \ + scratchULongPtr = (ptr); \ + scratchULong = (val); \ + if (*scratchULongPtr != scratchULong) { \ + Screen_dirty[((ULONG) scratchULongPtr - (ULONG) Screen_atari) >> 3] = 1; \ + Screen_dirty[((ULONG) scratchULongPtr - (ULONG) Screen_atari + 2) >> 3] = 1; \ + *scratchULongPtr = scratchULong; \ + } \ + } while (0) +#endif +#define WRITE_VIDEO_BYTE(ptr, val) \ + do { \ + scratchUBytePtr = (ptr); \ + scratchUByte = (val); \ + if (*scratchUBytePtr != scratchUByte) { \ + Screen_dirty[((ULONG) scratchUBytePtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchUBytePtr = scratchUByte; \ + } \ + } while (0) +static UBYTE *scratchFillLimit; +#define FILL_VIDEO(ptr, val, size) \ + do { \ + scratchUBytePtr = (UBYTE *) (ptr); \ + scratchUByte = (UBYTE) (val); \ + scratchFillLimit = scratchUBytePtr + (size); \ + for (; scratchUBytePtr < scratchFillLimit; scratchUBytePtr++) { \ + if (*scratchUBytePtr != scratchUByte) { \ + Screen_dirty[((ULONG) scratchUBytePtr - (ULONG) Screen_atari) >> 3] = 1; \ + *scratchUBytePtr = scratchUByte; \ + } \ + } \ + } while (0) + +#endif /* NODIRTYCOMPARE */ + +#else /* DIRTYRECT not defined: */ + +#define WRITE_VIDEO(ptr, val) (*(ptr) = val) +#define WRITE_VIDEO_LONG(ptr, val) (*(ptr) = val) +#define WRITE_VIDEO_BYTE(ptr, val) (*(ptr) = val) +#define FILL_VIDEO(ptr, val, size) memset(ptr, val, size) + +#endif /* DIRTYRECT */ + +#define READ_VIDEO_LONG(ptr) (*(ptr)) + +void ANTIC_VideoMemset(UBYTE *ptr, UBYTE val, ULONG size) +{ + FILL_VIDEO(ptr, val, size); +} + +void ANTIC_VideoPutByte(UBYTE *ptr, UBYTE val) +{ + WRITE_VIDEO_BYTE(ptr, val); +} + + +/* Memory access helpers----------------------------------------------------- */ +/* Some optimizations result in unaligned 32-bit accesses. These macros have + been introduced for machines that don't allow unaligned memory accesses. */ + +#ifdef DIRTYRECT +/* STAT_UNALIGNED_WORDS doesn't work with DIRTYRECT */ +#define WRITE_VIDEO_LONG_UNALIGNED WRITE_VIDEO_LONG +#else +#define WRITE_VIDEO_LONG_UNALIGNED(ptr, val) UNALIGNED_PUT_LONG((ptr), (val), Screen_atari_write_long_stat) +#endif + +#ifdef WORDS_UNALIGNED_OK +#define IS_ZERO_ULONG(x) (! UNALIGNED_GET_LONG(x, pm_scanline_read_long_stat)) +#define DO_GTIA_BYTE(p, l, x) { \ + WRITE_VIDEO_LONG_UNALIGNED((ULONG *) (p), (l)[(x) >> 4]); \ + WRITE_VIDEO_LONG_UNALIGNED((ULONG *) (p) + 1, (l)[(x) & 0xf]); \ + } +#else /* WORDS_UNALIGNED_OK */ +#define IS_ZERO_ULONG(x) (!((const UBYTE *)(x))[0] && !((const UBYTE *)(x))[1] && !((const UBYTE *)(x))[2] && !((const UBYTE *)(x))[3]) +#define DO_GTIA_BYTE(p, l, x) { \ + WRITE_VIDEO((UWORD *) (p), (UWORD) ((l)[(x) >> 4])); \ + WRITE_VIDEO((UWORD *) (p) + 1, (UWORD) ((l)[(x) >> 4])); \ + WRITE_VIDEO((UWORD *) (p) + 2, (UWORD) ((l)[(x) & 0xf])); \ + WRITE_VIDEO((UWORD *) (p) + 3, (UWORD) ((l)[(x) & 0xf])); \ + } +#endif /* WORDS_UNALIGNED_OK */ + +/* ANTIC Registers --------------------------------------------------------- */ + +UBYTE ANTIC_DMACTL; +UBYTE ANTIC_CHACTL; +UWORD ANTIC_dlist; +UBYTE ANTIC_HSCROL; +UBYTE ANTIC_VSCROL; +UBYTE ANTIC_PMBASE; +UBYTE ANTIC_CHBASE; +UBYTE ANTIC_NMIEN; +UBYTE ANTIC_NMIST; + +/* ANTIC Memory ------------------------------------------------------------ */ + +#if !defined(BASIC) && !defined(CURSES_BASIC) +static UBYTE antic_memory[52]; +#define ANTIC_margin 4 +/* It's number of bytes in antic_memory, which are never loaded, but may be + read in wide playfield mode. These bytes are uninitialized, because on + real computer there's some kind of 'garbage'. Possibly 1 is enough, but + 4 bytes surely won't cause negative indexes. :) */ + +/* Screen ----------------------------------------------------------------- + Define screen as ULONG to ensure that it is Longword aligned. + This allows special optimisations under certain conditions. + ------------------------------------------------------------------------ */ + +static UWORD *scrn_ptr; +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + +/* Separate access to XE extended memory ----------------------------------- */ +/* It's available in 130 XE and 320 KB Compy Shop. + Note: during ANTIC access to extended memory in Compy Shop Self Test + is disabled. It is unknown if this is true for real 130 XE. If not, + then some extra code has to be added to: + - check if selftest_enabled is set + - check if the address is in range 0x5000..0x57ff + - if both conditions are true, then access memory instead of ANTIC_xe_ptr */ + +/* Pointer to 16 KB seen by ANTIC in 0x4000-0x7fff. + If it's the same what the CPU sees (and what's in MEMORY_mem[0x4000..0x7fff], + then NULL. */ +const UBYTE *ANTIC_xe_ptr = NULL; + +/* ANTIC Timing -------------------------------------------------------------- + +NOTE: this information was written before NEW_CYCLE_EXACT was introduced! + +I've introduced global variable ANTIC_xpos, which contains current number of cycle +in a line. This simplifies ANTIC/CPU timing much. The CPU_GO() function which +emulates CPU is now void and is called with ANTIC_xpos limit, below which CPU can go. + +All strange variables holding 'unused cycles', 'DMA cycles', 'allocated cycles' +etc. are removed. Simply whenever ANTIC fetches a byte, it takes single cycle, +which can be done now with ANTIC_xpos++. There's only one exception: in text modes +2-5 ANTIC takes more bytes than cycles, because it does less than ANTIC_DMAR refresh +cycles. + +Now emulation is really screenline-oriented. We do ANTIC_ypos++ after a line, +not inside it. + +This simplified diagram shows when what is done in a line: + +MDPPPPDD..............(------R/S/F------).......... +^ ^ ^ ^ ^ ^ ^ ^ ---> time/xpos +0 | NMIST_C NMI_C SCR_C WSYNC_C|LINE_C +VSCON_C VSCOF_C + +M - fetch Missiles +D - fetch DL +P - fetch Players +S - fetch Screen +F - fetch Font (in text modes) +R - refresh Memory (ANTIC_DMAR cycles) + +Only Memory Refresh happens in every line, other tasks are optional. + +Below are exact diagrams for some non-scrolled modes: + 11111111111111 + 11111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 + /--------------------------narrow------------------------------\ + /----------------------------------normal--------------------------------------\ + /-------------------------------------------wide--------------------------------------------\ + +blank line: +MDPPPPDD.................R...R...R...R...R...R...R...R...R........................................................ + +mode 8,9: +MDPPPPDD....S.......S....R..SR...R..SR...R..SR...R..SR...R..S.......S.......S.......S.......S.......S............. + +mode a,b,c: +MDPPPPDD....S...S...S...SR..SR..SR..SR..SR..SR..SR..SR..SR..S...S...S...S...S...S...S...S...S...S...S...S......... + +mode d,e,f: +MDPPPPDD....S.S.S.S.S.S.SRS.SRS.SRS.SRS.SRS.SRS.SRS.SRS.SRS.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S......... + +Notes: +* At the beginning of a line fetched are: + - a byte of Missiles + - a byte of DL (instruction) + - four bytes of Players + - two bytes of DL argument (jump or screen address) + The emulator, however, fetches them all continuously. + +* Refresh cycles and Screen/Font fetches have been tested for some modes (see above). + This is for making the emulator more accurate, able to change colour registers, + sprite positions or GTIA modes during scanline. These modes are the most commonly used + with those effects. + Currently this isn't implemented, and all R/S/F cycles are fetched continuously in *all* modes + (however, right number of cycles is taken in every mode, basing on screen width and HSCROL). + +There are a few constants representing following events: + +* VSCON_C - in first VSC line dctr is loaded with VSCROL + +* ANTIC_NMIST_C - NMIST is updated (set to 0x9f on DLI, set to 0x5f on VBLKI) + +* ANTIC_NMI_C - If NMIEN permits, NMI interrupt is generated + +* SCR_C - We draw whole line of screen. On a real computer you can change + ANTIC/GTIA registers while displaying screen, however this emulator + isn't that accurate. + +* ANTIC_WSYNC_C - ANTIC holds CPU until this moment, when WSYNC is written + +* VSCOF_C - in last VSC line dctr is compared with VSCROL + +* ANTIC_LINE_C - simply end of line (this used to be called CPUL) + +All constants are determined by tests on real Atari computer. It is assumed, +that ANTIC registers are read with LDA, LDX, LDY and written with STA, STX, +STY, all in absolute addressing mode. All these instructions last 4 cycles +and perform read/write operation in last cycle. The CPU emulation should +correctly emulate WSYNC and add cycles for current instruction BEFORE +executing it. That's why VSCOF_C > ANTIC_LINE_C is correct. + +How WSYNC is now implemented: + +* On writing WSYNC: + - if ANTIC_xpos <= ANTIC_WSYNC_C && ANTIC_xpos_limit >= ANTIC_WSYNC_C, + we only change ANTIC_xpos to ANTIC_WSYNC_C - that's all + - otherwise we set ANTIC_wsync_halt and change ANTIC_xpos to ANTIC_xpos_limit causing CPU_GO() + to return + +* At the beginning of CPU_GO() (CPU emulation), when ANTIC_wsync_halt is set: + - if ANTIC_xpos_limit < ANTIC_WSYNC_C we return + - else we set ANTIC_xpos to ANTIC_WSYNC_C, reset ANTIC_wsync_halt and emulate some cycles + +We don't emulate ANTIC_NMIST_C, ANTIC_NMI_C and SCR_C if it is unnecessary. +These are all cases: + +* Common overscreen line + Nothing happens except that ANTIC gets ANTIC_DMAR cycles: + ANTIC_xpos += ANTIC_DMAR; GOEOL; + +* First overscreen line - start of vertical blank + - CPU goes until ANTIC_NMIST_C + - ANTIC sets NMIST to 0x5f + if (ANTIC_NMIEN & 0x40) { + - CPU goes until ANTIC_NMI_C + - ANTIC forces NMI + } + - ANTIC gets ANTIC_DMAR cycles + - CPU goes until ANTIC_LINE_C + +* Screen line without DLI + - ANTIC fetches DL and P/MG + - CPU goes until SCR_C + - ANTIC draws whole line fetching Screen/Font and refreshing memory + - CPU goes until ANTIC_LINE_C + +* Screen line with DLI + - ANTIC fetches DL and P/MG + - CPU goes until ANTIC_NMIST_C + - ANTIC sets NMIST to 0x9f + if (ANTIC_NMIEN & 0x80) { + - CPU goes until ANTIC_NMI_C + - ANTIC forces NMI + } + - CPU goes until SCR_C + - ANTIC draws line with ANTIC_DMAR + - CPU goes until ANTIC_LINE_C + + -------------------------------------------------------------------------- */ + +#define VSCON_C 1 +#define SCR_C 28 +#define VSCOF_C 112 + +unsigned int ANTIC_screenline_cpu_clock = 0; + +#ifdef NEW_CYCLE_EXACT +#define UPDATE_DMACTL do{if (dmactl_changed) { \ + dmactl_changed = 0; \ + ANTIC_PutByte(ANTIC_OFFSET_DMACTL, delayed_DMACTL); \ + } \ + if (draw_antic_ptr_changed) { \ + draw_antic_ptr_changed = 0; \ + draw_antic_ptr = saved_draw_antic_ptr; \ + }}while(0) +#else +#define UPDATE_DMACTL do{}while(0) +#endif /* NEW_CYCLE_EXACT */ +#define UPDATE_GTIA_BUG /* update GTIA if it was in bug mode */\ + do{if(gtia_bug_active) {\ + /* restore draw_antic_ptr for multi-line modes*/\ + draw_antic_ptr = draw_antic_table[GTIA_PRIOR >> 6][anticmode];\ + gtia_bug_active = FALSE;\ + }}while(0) +#define GOEOL_CYCLE_EXACT CPU_GO(ANTIC_antic2cpu_ptr[ANTIC_LINE_C]); \ + ANTIC_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; \ + ANTIC_xpos -= ANTIC_LINE_C; \ + ANTIC_screenline_cpu_clock += ANTIC_LINE_C; \ + ANTIC_ypos++; \ + GTIA_UpdatePmplColls(); +#define GOEOL CPU_GO(ANTIC_LINE_C); ANTIC_xpos -= ANTIC_LINE_C; ANTIC_screenline_cpu_clock += ANTIC_LINE_C; UPDATE_DMACTL; ANTIC_ypos++; UPDATE_GTIA_BUG +#define OVERSCREEN_LINE ANTIC_xpos += ANTIC_DMAR; GOEOL + +int ANTIC_xpos = 0; +int ANTIC_xpos_limit; +int ANTIC_wsync_halt = FALSE; + +int ANTIC_ypos; /* Line number - lines 8..247 are on screen */ + +/* Timing in first line of modes 2-5 +In these modes ANTIC takes more bytes than cycles. Despite this, it would be +possible that SCR_C + cycles_taken > ANTIC_WSYNC_C. To avoid this we must take some +cycles before SCR_C. before_cycles contains number of them, while extra_cycles +contains difference between bytes taken and cycles taken plus before_cycles. */ + +#define BEFORE_CYCLES (SCR_C - 28) +/* It's number of cycles taken before SCR_C for not scrolled, narrow playfield. + It wasn't tested, but should be ok. ;) */ + +/* Light pen support ------------------------------------------------------- */ + +static UBYTE PENH; +static UBYTE PENV; +UBYTE ANTIC_PENH_input = 0x00; +UBYTE ANTIC_PENV_input = 0xff; + +#ifndef BASIC + +/* Internal ANTIC registers ------------------------------------------------ */ + +static UWORD screenaddr; /* Screen Pointer */ +static UBYTE IR; /* Instruction Register */ +static UBYTE anticmode; /* Antic mode */ +static UBYTE dctr; /* Delta Counter */ +static UBYTE lastline; /* dctr limit */ +static UBYTE need_dl; /* boolean: fetch DL next line */ +static UBYTE vscrol_off; /* boolean: displaying line ending VSC */ + +#endif + +#if !defined(BASIC) && !defined(CURSES_BASIC) + +/* Pre-computed values for improved performance ---------------------------- */ + +#define NORMAL0 0 /* modes 2,3,4,5,0xd,0xe,0xf */ +#define NORMAL1 1 /* modes 6,7,0xa,0xb,0xc */ +#define NORMAL2 2 /* modes 8,9 */ +#define SCROLL0 3 /* modes 2,3,4,5,0xd,0xe,0xf with HSC */ +#define SCROLL1 4 /* modes 6,7,0xa,0xb,0xc with HSC */ +#define SCROLL2 5 /* modes 8,9 with HSC */ +static int md; /* current mode NORMAL0..SCROLL2 */ +/* tables for modes NORMAL0..SCROLL2 */ +static int chars_read[6]; +static int chars_displayed[6]; +static int x_min[6]; +static int ch_offset[6]; +static int load_cycles[6]; +static int font_cycles[6]; +static int before_cycles[6]; +static int extra_cycles[6]; + +/* border parameters for current display width */ +static int left_border_chars; +static int right_border_start; +#ifdef NEW_CYCLE_EXACT +static int left_border_start = LCHOP * 4; +static int right_border_end = (48 - RCHOP) * 4; +#define LBORDER_START left_border_start +#define RBORDER_END right_border_end +#else +#define LBORDER_START (LCHOP * 4) +#define RBORDER_END ((48 - RCHOP) * 4) +#endif /* NEW_CYCLE_EXACT */ + +/* set with CHBASE *and* CHACTL - bits 0..2 set if flip on */ +static UWORD chbase_20; /* CHBASE for 20 character mode */ + +/* set with CHACTL */ +static UBYTE invert_mask; +static int blank_mask; + +/* A scanline of AN0 and AN1 signals as transmitted from ANTIC to GTIA. + In every byte, bit 0 is AN0 and bit 1 is AN1 */ +static UBYTE an_scanline[Screen_WIDTH / 2 + 8]; + +/* lookup tables */ +static UBYTE blank_lookup[256]; +static UWORD lookup2[256]; +ULONG ANTIC_lookup_gtia9[16]; +ULONG ANTIC_lookup_gtia11[16]; +static UBYTE playfield_lookup[257]; +static UBYTE mode_e_an_lookup[256]; + +/* Colour lookup table + This single table replaces 4 previously used: cl_word, cur_prior, + prior_table and pf_colls. It should be treated as a two-dimensional table, + with playfield colours in rows and PMG colours in columns: + no_PMG PM0 PM1 PM01 PM2 PM3 PM23 PM023 PM123 PM0123 PM25 PM35 PM235 colls ... ... + BAK + ... + HI2 + HI3 + PF0 + PF1 + PF2 + PF3 + The table contains word value (lsb = msb) of colour to be drawn. + The table is being updated taking current PRIOR setting into consideration. + '...' represent two unused columns and single unused row. + HI2 and HI3 are used only if colour_translation_table is being used. + They're colours of hi-res pixels on PF2 and PF3 respectively (PF2 is + default background for hi-res, PF3 is PM5). + Columns PM023, PM123 and PM0123 are used when PRIOR & 0xf equals any + of 5,7,0xc,0xd,0xe,0xf. The columns represent PM0, PM1 and PM01 respectively + covered by PM2 and/or PM3. This is to handle black colour on PF2 and PF3. + Columns PM25, PM35 and PM235 are used when PRIOR & 0x1f equals any + of 0x10,0x1a,0x1c,0x1e. The columns represent PM2, PM3 and PM23 + respectively covered by PM5. This to handle colour on PF0 and PF1: + PF3 if (PRIOR & 0x1f) == 0x10, PF0 or PF1 otherwise. + Additional column 'colls' holds collisions of playfields with PMG. */ + +UWORD ANTIC_cl[128]; + +#define C_PM0 0x01 +#define C_PM1 0x02 +#define C_PM01 0x03 +#define C_PM2 0x04 +#define C_PM3 0x05 +#define C_PM23 0x06 +#define C_PM023 0x07 +#define C_PM123 0x08 +#define C_PM0123 0x09 +#define C_PM25 0x0a +#define C_PM35 0x0b +#define C_PM235 0x0c +#define C_COLLS 0x0d +#define C_BAK 0x00 +#define C_HI2 0x20 +#define C_HI3 0x30 +#define C_PF0 0x40 +#define C_PF1 0x50 +#define C_PF2 0x60 +#define C_PF3 0x70 +#define C_BLACK (C_PF3 | C_PM25) + +/* these are byte-offsets in the table, so left shift for indexing word table + has been avoided */ +#define COLOUR(x) (*(UWORD *) ((UBYTE *) ANTIC_cl + (x) )) +#define L_PM0 (2 * C_PM0) +#define L_PM1 (2 * C_PM1) +#define L_PM01 (2 * C_PM01) +#define L_PM2 (2 * C_PM2) +#define L_PM3 (2 * C_PM3) +#define L_PM23 (2 * C_PM23) +#define L_PM023 (2 * C_PM023) +#define L_PM123 (2 * C_PM123) +#define L_PM0123 (2 * C_PM0123) +#define L_PM25 (2 * C_PM25) +#define L_PM35 (2 * C_PM35) +#define L_PM235 (2 * C_PM235) +#define L_COLLS (2 * C_COLLS) +#define L_BAK (2 * C_BAK) +#define L_HI2 (2 * C_HI2) +#define L_HI3 (2 * C_HI3) +#define L_PF0 (2 * C_PF0) +#define L_PF1 (2 * C_PF1) +#define L_PF2 (2 * C_PF2) +#define L_PF3 (2 * C_PF3) +#define L_BLACK (2 * C_BLACK) + +/* Blank areas optimizations + Routines for most graphics modes take advantage of fact, that often + large areas of screen are background colour. If it is possible, 8 pixels + of background are drawn at once - with two longs or four words, if + the platform doesn't allow unaligned long access. + Artifacting also uses unaligned long access if it's supported. */ + +#ifdef WORDS_UNALIGNED_OK + +#define INIT_BACKGROUND_6 ULONG background = ANTIC_cl[C_PF2] | (((ULONG) ANTIC_cl[C_PF2]) << 16); +#define INIT_BACKGROUND_8 ULONG background = ANTIC_lookup_gtia9[0]; +#define DRAW_BACKGROUND(colreg) { \ + WRITE_VIDEO_LONG_UNALIGNED((ULONG *) ptr, background); \ + WRITE_VIDEO_LONG_UNALIGNED(((ULONG *) ptr) + 1, background); \ + ptr += 4; \ + } +#define DRAW_ARTIF { \ + WRITE_VIDEO_LONG_UNALIGNED((ULONG *) ptr, art_curtable[(UBYTE) (screendata_tally >> 10)]); \ + WRITE_VIDEO_LONG_UNALIGNED(((ULONG *) ptr) + 1, art_curtable[(UBYTE) (screendata_tally >> 6)]); \ + ptr += 4; \ + } + +#else + +#define INIT_BACKGROUND_6 +#define INIT_BACKGROUND_8 +#define DRAW_BACKGROUND(colreg) {\ + WRITE_VIDEO(ptr, ANTIC_cl[colreg]); \ + WRITE_VIDEO(ptr + 1, ANTIC_cl[colreg]); \ + WRITE_VIDEO(ptr + 2, ANTIC_cl[colreg]); \ + WRITE_VIDEO(ptr + 3, ANTIC_cl[colreg]); \ + ptr += 4;\ + } +#define DRAW_ARTIF {\ + WRITE_VIDEO(ptr++, ((UWORD *) art_curtable)[(screendata_tally & 0x03fc00) >> 9]); \ + WRITE_VIDEO(ptr++, ((UWORD *) art_curtable)[((screendata_tally & 0x03fc00) >> 9) + 1]); \ + WRITE_VIDEO(ptr++, ((UWORD *) art_curtable)[(screendata_tally & 0x003fc0) >> 5]); \ + WRITE_VIDEO(ptr++, ((UWORD *) art_curtable)[((screendata_tally & 0x003fc0) >> 5) + 1]); \ + } + +#endif /* WORDS_UNALIGNED_OK */ + +#define DRAW_ARTIF_NEW {\ + WRITE_VIDEO(ptr++, art_lookup_new[(screendata_tally & 0x03f000) >> 12]); \ + WRITE_VIDEO(ptr++, art_lookup_new[(screendata_tally & 0x00fc00) >> 10]); \ + WRITE_VIDEO(ptr++, art_lookup_new[(screendata_tally & 0x003f00) >> 8]); \ + WRITE_VIDEO(ptr++, art_lookup_new[(screendata_tally & 0x000fc0) >> 6]); \ + } + +/* Hi-res modes optimizations + Now hi-res modes are drawn with words, not bytes. Endianess defaults + to little-endian. WORDS_BIGENDIAN should be defined when compiling on + a big-endian machine. */ + +#ifdef WORDS_BIGENDIAN +#define BYTE0_MASK 0xff00 +#define BYTE1_MASK 0x00ff +#define HIRES_MASK_01 0xfff0 +#define HIRES_MASK_10 0xf0ff +#define HIRES_LUM_01 0x000f +#define HIRES_LUM_10 0x0f00 +#else +#define BYTE0_MASK 0x00ff +#define BYTE1_MASK 0xff00 +#define HIRES_MASK_01 0xf0ff +#define HIRES_MASK_10 0xfff0 +#define HIRES_LUM_01 0x0f00 +#define HIRES_LUM_10 0x000f +#endif + +static UWORD hires_lookup_n[128]; +static UWORD hires_lookup_m[128]; +#define hires_norm(x) hires_lookup_n[(x) >> 1] +#define hires_mask(x) hires_lookup_m[(x) >> 1] + +#ifndef USE_COLOUR_TRANSLATION_TABLE +int ANTIC_artif_new = FALSE; /* New type of artifacting */ +UWORD ANTIC_hires_lookup_l[128]; /* accessed in gtia.c */ +#define hires_lum(x) ANTIC_hires_lookup_l[(x) >> 1] +#endif + +/* Player/Missile Graphics ------------------------------------------------- */ + +#define PF0PM (*(UBYTE *) &ANTIC_cl[C_PF0 | C_COLLS]) +#define PF1PM (*(UBYTE *) &ANTIC_cl[C_PF1 | C_COLLS]) +#define PF2PM (*(UBYTE *) &ANTIC_cl[C_PF2 | C_COLLS]) +#define PF3PM (*(UBYTE *) &ANTIC_cl[C_PF3 | C_COLLS]) +#define PF_COLLS(x) (((UBYTE *) &ANTIC_cl)[(x) + L_COLLS]) + +static int singleline; +int ANTIC_player_dma_enabled; +int ANTIC_player_gra_enabled; +int ANTIC_missile_dma_enabled; +int ANTIC_missile_gra_enabled; +int ANTIC_player_flickering; +int ANTIC_missile_flickering; + +static UWORD pmbase_s; +static UWORD pmbase_d; + +/* PMG lookup tables */ +static UBYTE pm_lookup_table[20][256]; +/* current PMG lookup table */ +static const UBYTE *pm_lookup_ptr; + +#define PL_00 0 /* 0x00,0x01,0x02,0x03,0x04,0x06,0x08,0x09,0x0a,0x0b */ +#define PL_05 1 /* 0x05,0x07,0x0c,0x0d,0x0e,0x0f */ +#define PL_10 2 /* 0x10,0x1a */ +#define PL_11 3 /* 0x11,0x18,0x19 */ +#define PL_12 4 /* 0x12 */ +#define PL_13 5 /* 0x13,0x1b */ +#define PL_14 6 /* 0x14,0x16 */ +#define PL_15 7 /* 0x15,0x17,0x1d,0x1f */ +#define PL_1c 8 /* 0x1c */ +#define PL_1e 9 /* 0x1e */ +#define PL_20 10 /* 0x20,0x21,0x22,0x23,0x24,0x26,0x28,0x29,0x2a,0x2b */ +#define PL_25 11 /* 0x25,0x27,0x2c,0x2d,0x2e,0x2f */ +#define PL_30 12 /* 0x30,0x3a */ +#define PL_31 13 /* 0x31,0x38,0x39 */ +#define PL_32 14 /* 0x32 */ +#define PL_33 15 /* 0x33,0x3b */ +#define PL_34 16 /* 0x34,0x36 */ +#define PL_35 17 /* 0x35,0x37,0x3d,0x3f */ +#define PL_3c 18 /* 0x3c */ +#define PL_3e 19 /* 0x3e */ + +static const UBYTE prior_to_pm_lookup[64] = { + PL_00, PL_00, PL_00, PL_00, PL_00, PL_05, PL_00, PL_05, + PL_00, PL_00, PL_00, PL_00, PL_05, PL_05, PL_05, PL_05, + PL_10, PL_11, PL_12, PL_13, PL_14, PL_15, PL_14, PL_15, + PL_11, PL_11, PL_10, PL_13, PL_1c, PL_15, PL_1e, PL_15, + PL_20, PL_20, PL_20, PL_20, PL_20, PL_25, PL_20, PL_25, + PL_20, PL_20, PL_20, PL_20, PL_25, PL_25, PL_25, PL_25, + PL_30, PL_31, PL_32, PL_33, PL_34, PL_35, PL_34, PL_35, + PL_31, PL_31, PL_30, PL_33, PL_3c, PL_35, PL_3e, PL_35 +}; + +static void init_pm_lookup(void) +{ + static const UBYTE pm_lookup_template[10][16] = { + /* PL_20 */ + { L_BAK, L_PM0, L_PM1, L_PM01, L_PM2, L_PM0, L_PM1, L_PM01, + L_PM3, L_PM0, L_PM1, L_PM01, L_PM23, L_PM0, L_PM1, L_PM01 }, + /* PL_25 */ + { L_BAK, L_PM0, L_PM1, L_PM01, L_PM2, L_PM023, L_PM123, L_PM0123, + L_PM3, L_PM023, L_PM123, L_PM0123, L_PM23, L_PM023, L_PM123, L_PM0123 }, + /* PL_30 */ + { L_PF3, L_PM0, L_PM1, L_PM01, L_PM25, L_PM0, L_PM1, L_PM01, + L_PM35, L_PM0, L_PM1, L_PM01, L_PM235, L_PM0, L_PM1, L_PM01 }, + /* PL_31 */ + { L_PF3, L_PM0, L_PM1, L_PM01, L_PM2, L_PM0, L_PM1, L_PM01, + L_PM3, L_PM0, L_PM1, L_PM01, L_PM23, L_PM0, L_PM1, L_PM01 }, + /* PL_32 */ + { L_PF3, L_PM0, L_PM1, L_PM01, L_PF3, L_PM0, L_PM1, L_PM01, + L_PF3, L_PM0, L_PM1, L_PM01, L_PF3, L_PM0, L_PM1, L_PM01 }, + /* PL_33 */ + { L_PF3, L_PM0, L_PM1, L_PM01, L_BLACK, L_PM0, L_PM1, L_PM01, + L_BLACK, L_PM0, L_PM1, L_PM01, L_BLACK, L_PM0, L_PM1, L_PM01 }, + /* PL_34 */ + { L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, + L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, L_PF3, L_PF3 }, + /* PL_35 */ + { L_PF3, L_PF3, L_PF3, L_PF3, L_BLACK, L_BLACK, L_BLACK, L_BLACK, + L_BLACK, L_BLACK, L_BLACK, L_BLACK, L_BLACK, L_BLACK, L_BLACK, L_BLACK }, + /* PL_3c */ + { L_PF3, L_PF3, L_PF3, L_PF3, L_PM25, L_PM25, L_PM25, L_PM25, + L_PM25, L_PM25, L_PM25, L_PM25, L_PM25, L_PM25, L_PM25, L_PM25 }, + /* PL_3e */ + { L_PF3, L_PF3, L_PF3, L_PF3, L_PM25, L_BLACK, L_BLACK, L_BLACK, + L_PM25, L_BLACK, L_BLACK, L_BLACK, L_PM25, L_BLACK, L_BLACK, L_BLACK } + }; + + static const UBYTE multi_to_normal[] = { + L_BAK, + L_PM0, L_PM1, L_PM0, + L_PM2, L_PM3, L_PM2, + L_PM023, L_PM123, L_PM023, + L_PM25, L_PM35, L_PM25 + }; + + int i; + int j; + UBYTE temp; + + for (i = 0; i <= 1; i++) + for (j = 0; j <= 255; j++) { + pm_lookup_table[i + 10][j] = temp = pm_lookup_template[i][(j & 0xf) | (j >> 4)]; + pm_lookup_table[i][j] = temp <= L_PM235 ? multi_to_normal[temp >> 1] : temp; + } + for (; i <= 9; i++) { + for (j = 0; j <= 15; j++) { + pm_lookup_table[i + 10][j] = temp = pm_lookup_template[i < 7 ? 0 : 1][j]; + pm_lookup_table[i][j] = temp <= L_PM235 ? multi_to_normal[temp >> 1] : temp; + } + for (; j <= 255; j++) { + pm_lookup_table[i + 10][j] = temp = pm_lookup_template[i][j & 0xf]; + pm_lookup_table[i][j] = temp <= L_PM235 ? multi_to_normal[temp >> 1] : temp; + } + } +} + +static const UBYTE hold_missiles_tab[16] = { + 0x00,0x03,0x0c,0x0f,0x30,0x33,0x3c,0x3f, + 0xc0,0xc3,0xcc,0xcf,0xf0,0xf3,0xfc,0xff}; + +static void pmg_dma(void) +{ + /* VDELAY bit set == GTIA ignores PMG DMA in even lines */ + if (ANTIC_player_dma_enabled) { + if (ANTIC_player_gra_enabled) { + const UBYTE *base; + if (singleline) { + if (ANTIC_xe_ptr != NULL && pmbase_s < 0x8000 && pmbase_s >= 0x4000) + base = ANTIC_xe_ptr + pmbase_s - 0x4000 + ANTIC_ypos; + else + base = MEMORY_mem + pmbase_s + ANTIC_ypos; + if (ANTIC_ypos & 1) { + GTIA_GRAFP0 = base[0x400]; + GTIA_GRAFP1 = base[0x500]; + GTIA_GRAFP2 = base[0x600]; + GTIA_GRAFP3 = base[0x700]; + } + else { + if ((GTIA_VDELAY & 0x10) == 0) + GTIA_GRAFP0 = base[0x400]; + if ((GTIA_VDELAY & 0x20) == 0) + GTIA_GRAFP1 = base[0x500]; + if ((GTIA_VDELAY & 0x40) == 0) + GTIA_GRAFP2 = base[0x600]; + if ((GTIA_VDELAY & 0x80) == 0) + GTIA_GRAFP3 = base[0x700]; + } + } + else { + if (ANTIC_xe_ptr != NULL && pmbase_d < 0x8000 && pmbase_d >= 0x4000) + base = ANTIC_xe_ptr + (pmbase_d - 0x4000) + (ANTIC_ypos >> 1); + else + base = MEMORY_mem + pmbase_d + (ANTIC_ypos >> 1); + if (ANTIC_ypos & 1) { + GTIA_GRAFP0 = base[0x200]; + GTIA_GRAFP1 = base[0x280]; + GTIA_GRAFP2 = base[0x300]; + GTIA_GRAFP3 = base[0x380]; + } + else { + if ((GTIA_VDELAY & 0x10) == 0) + GTIA_GRAFP0 = base[0x200]; + if ((GTIA_VDELAY & 0x20) == 0) + GTIA_GRAFP1 = base[0x280]; + if ((GTIA_VDELAY & 0x40) == 0) + GTIA_GRAFP2 = base[0x300]; + if ((GTIA_VDELAY & 0x80) == 0) + GTIA_GRAFP3 = base[0x380]; + } + } + } + ANTIC_xpos += 4; + } + if (ANTIC_missile_dma_enabled) { + if (ANTIC_missile_gra_enabled) { + UBYTE data; + if (ANTIC_xe_ptr != NULL && pmbase_s < 0x8000 && pmbase_s >= 0x4000) + data = ANTIC_xe_ptr[singleline ? pmbase_s + ANTIC_ypos + 0x300 - 0x4000 : pmbase_d + (ANTIC_ypos >> 1) + 0x180 - 0x4000]; + else + data = MEMORY_dGetByte(singleline ? pmbase_s + ANTIC_ypos + 0x300 : pmbase_d + (ANTIC_ypos >> 1) + 0x180); + /* in odd lines load all missiles, in even only those, for which VDELAY bit is zero */ + GTIA_GRAFM = ANTIC_ypos & 1 ? data : ((GTIA_GRAFM ^ data) & hold_missiles_tab[GTIA_VDELAY & 0xf]) ^ data; + } + ANTIC_xpos++; + } +} + +/* Artifacting ------------------------------------------------------------ */ + +int ANTIC_artif_mode; + +static UWORD art_lookup_new[64]; +static UWORD art_colour1_new; +static UWORD art_colour2_new; + +static ULONG art_lookup_normal[256]; +static ULONG art_lookup_reverse[256]; +static ULONG art_bkmask_normal[256]; +static ULONG art_lummask_normal[256]; +static ULONG art_bkmask_reverse[256]; +static ULONG art_lummask_reverse[256]; + +static ULONG *art_curtable = art_lookup_normal; +static ULONG *art_curbkmask = art_bkmask_normal; +static ULONG *art_curlummask = art_lummask_normal; + +static UWORD art_normal_colpf1_save; +static UWORD art_normal_colpf2_save; +static UWORD art_reverse_colpf1_save; +static UWORD art_reverse_colpf2_save; + +static void setup_art_colours(void) +{ + static UWORD *art_colpf1_save = &art_normal_colpf1_save; + static UWORD *art_colpf2_save = &art_normal_colpf2_save; + UWORD curlum = ANTIC_cl[C_PF1] & 0x0f0f; + + if (curlum != *art_colpf1_save || ANTIC_cl[C_PF2] != *art_colpf2_save) { + if (curlum < (ANTIC_cl[C_PF2] & 0x0f0f)) { + art_colpf1_save = &art_reverse_colpf1_save; + art_colpf2_save = &art_reverse_colpf2_save; + art_curtable = art_lookup_reverse; + art_curlummask = art_lummask_reverse; + art_curbkmask = art_bkmask_reverse; + } + else { + art_colpf1_save = &art_normal_colpf1_save; + art_colpf2_save = &art_normal_colpf2_save; + art_curtable = art_lookup_normal; + art_curlummask = art_lummask_normal; + art_curbkmask = art_bkmask_normal; + } + if (curlum ^ *art_colpf1_save) { + int i; + ULONG new_colour = curlum ^ *art_colpf1_save; + new_colour |= new_colour << 16; + *art_colpf1_save = curlum; + for (i = 0; i <= 255; i++) + art_curtable[i] ^= art_curlummask[i] & new_colour; + } + if (ANTIC_cl[C_PF2] ^ *art_colpf2_save) { + int i; + ULONG new_colour = ANTIC_cl[C_PF2] ^ *art_colpf2_save; + new_colour |= new_colour << 16; + *art_colpf2_save = ANTIC_cl[C_PF2]; + for (i = 0; i <= 255; i++) + art_curtable[i] ^= art_curbkmask[i] & new_colour; + } + + } +} + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + +/* Initialization ---------------------------------------------------------- */ + +int ANTIC_Initialise(int *argc, char *argv[]) +{ +#if !defined(BASIC) && !defined(CURSES_BASIC) + int i, j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-artif") == 0) { + if (i_a) { + ANTIC_artif_mode = Util_sscandec(argv[++i]); + if (ANTIC_artif_mode < 0 || ANTIC_artif_mode > 4) { + Log_print("Invalid artifacting mode, using default."); + ANTIC_artif_mode = 0; + } + } + else a_m = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-artif Set artifacting mode 0-4 (0 = disable)"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + ANTIC_UpdateArtifacting(); + + playfield_lookup[0x00] = L_BAK; + playfield_lookup[0x40] = L_PF0; + playfield_lookup[0x80] = L_PF1; + playfield_lookup[0xc0] = L_PF2; + playfield_lookup[0x100] = L_PF3; + blank_lookup[0x80] = blank_lookup[0xa0] = blank_lookup[0xc0] = blank_lookup[0xe0] = 0x00; + hires_mask(0x00) = 0xffff; +#ifdef USE_COLOUR_TRANSLATION_TABLE + hires_mask(0x40) = BYTE0_MASK; + hires_mask(0x80) = BYTE1_MASK; + hires_mask(0xc0) = 0; +#else + hires_mask(0x40) = HIRES_MASK_01; + hires_mask(0x80) = HIRES_MASK_10; + hires_mask(0xc0) = 0xf0f0; + hires_lum(0x00) = hires_lum(0x40) = hires_lum(0x80) = hires_lum(0xc0) = 0; +#endif + init_pm_lookup(); + mode_e_an_lookup[0] = 0; + mode_e_an_lookup[1] = mode_e_an_lookup[4] = mode_e_an_lookup[0x10] = mode_e_an_lookup[0x40] = 0; + mode_e_an_lookup[2] = mode_e_an_lookup[8] = mode_e_an_lookup[0x20] = mode_e_an_lookup[0x80] = 1; + mode_e_an_lookup[3] = mode_e_an_lookup[12] = mode_e_an_lookup[0x30] = mode_e_an_lookup[0xc0] = 2; +#ifdef NEW_CYCLE_EXACT + CYCLE_MAP_Create(); + ANTIC_cpu2antic_ptr = &CYCLE_MAP_cpu2antic[0]; + ANTIC_antic2cpu_ptr = &CYCLE_MAP_antic2cpu[0]; +#endif /* NEW_CYCLE_EXACT */ + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + + return TRUE; +} + +void ANTIC_Reset(void) +{ + ANTIC_NMIEN = 0x00; + ANTIC_NMIST = 0x1f; + ANTIC_PutByte(ANTIC_OFFSET_DMACTL, 0); +} + +#if !defined(BASIC) && !defined(CURSES_BASIC) + +/* Border ------------------------------------------------------------------ */ + +#define DO_BORDER_1 {\ + if (IS_ZERO_ULONG(pm_scanline_ptr)) {\ + ULONG *l_ptr = (ULONG *) ptr;\ + WRITE_VIDEO_LONG(l_ptr++, background); \ + WRITE_VIDEO_LONG(l_ptr++, background); \ + ptr = (UWORD *) l_ptr;\ + pm_scanline_ptr += 4;\ + }\ + else {\ + int k = 4;\ + do + +#define DO_BORDER DO_BORDER_1\ + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[*pm_scanline_ptr++]));\ + while (--k);\ + }\ +} + +#define DO_GTIA10_BORDER DO_BORDER_1\ + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[*pm_scanline_ptr++ | 1]));\ + while (--k);\ + }\ +} + +static void do_border(void) +{ + int kk; + UWORD *ptr = &scrn_ptr[LBORDER_START]; + const UBYTE *pm_scanline_ptr = >IA_pm_scanline[LBORDER_START]; + ULONG background = ANTIC_lookup_gtia9[0]; + /* left border */ + for (kk = left_border_chars; kk; kk--) + DO_BORDER + /* right border */ + ptr = &scrn_ptr[right_border_start]; + pm_scanline_ptr = >IA_pm_scanline[right_border_start]; + while (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]) + DO_BORDER +} + +static void do_border_gtia10(void) +{ + int kk; + UWORD *ptr = &scrn_ptr[LBORDER_START]; + const UBYTE *pm_scanline_ptr = >IA_pm_scanline[LBORDER_START]; + ULONG background = ANTIC_cl[C_PM0] | (ANTIC_cl[C_PM0] << 16); + /* left border */ + for (kk = left_border_chars; kk; kk--) + DO_GTIA10_BORDER + WRITE_VIDEO(ptr, COLOUR(pm_lookup_ptr[*pm_scanline_ptr | 1])); /* one extra pixel, because of the right shift of gtia10*/ + /* right border */ + pm_scanline_ptr = >IA_pm_scanline[right_border_start]; + if (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]) { + ptr = &scrn_ptr[right_border_start + 1]; /*start one pixel further right because of the right shift of gtia10*/ + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[pm_scanline_ptr[1] | 1])); + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[pm_scanline_ptr[2] | 1])); + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[pm_scanline_ptr[3] | 1])); + pm_scanline_ptr += 4; + while (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]) + DO_GTIA10_BORDER + } +} + +static void do_border_gtia11(void) +{ + int kk; + UWORD *ptr = &scrn_ptr[LBORDER_START]; + const UBYTE *pm_scanline_ptr = >IA_pm_scanline[LBORDER_START]; + ULONG background = ANTIC_lookup_gtia11[0]; +#ifdef USE_COLOUR_TRANSLATION_TABLE + ANTIC_cl[C_PF3] = colour_translation_table[GTIA_COLPF3 & 0xf0]; +#else + ANTIC_cl[C_PF3] &= 0xf0f0; +#endif + ANTIC_cl[C_BAK] = (UWORD) background; + /* left border */ + for (kk = left_border_chars; kk; kk--) + DO_BORDER + /* right border */ + ptr = &scrn_ptr[right_border_start]; + pm_scanline_ptr = >IA_pm_scanline[right_border_start]; + while (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]) + DO_BORDER + GTIA_COLOUR_TO_WORD(ANTIC_cl[C_PF3],GTIA_COLPF3) + GTIA_COLOUR_TO_WORD(ANTIC_cl[C_BAK],GTIA_COLBK) +} + +static void draw_antic_0(void) +{ + UWORD *ptr = scrn_ptr + LBORDER_START; + if (GTIA_pm_dirty) { + const UBYTE *pm_scanline_ptr = >IA_pm_scanline[LBORDER_START]; + ULONG background = ANTIC_lookup_gtia9[0]; + do + DO_BORDER + while (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]); + } + else + FILL_VIDEO(ptr, ANTIC_cl[C_BAK], (RBORDER_END - LBORDER_START) * 2); +} + +static void draw_antic_0_gtia10(void) +{ + UWORD *ptr = scrn_ptr + LBORDER_START; + if (GTIA_pm_dirty) { + const UBYTE *pm_scanline_ptr = >IA_pm_scanline[LBORDER_START]; + ULONG background = ANTIC_cl[C_PM0] | (ANTIC_cl[C_PM0] << 16); + do + DO_GTIA10_BORDER + while (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]); + } + else + FILL_VIDEO(ptr, ANTIC_cl[C_PM0], (RBORDER_END - LBORDER_START) * 2); +} + +static void draw_antic_0_gtia11(void) +{ + UWORD *ptr = scrn_ptr + LBORDER_START; + if (GTIA_pm_dirty) { + const UBYTE *pm_scanline_ptr = >IA_pm_scanline[LBORDER_START]; + ULONG background = ANTIC_lookup_gtia11[0]; +#ifdef USE_COLOUR_TRANSLATION_TABLE + ANTIC_cl[C_PF3] = colour_translation_table[GTIA_COLPF3 & 0xf0]; +#else + ANTIC_cl[C_PF3] &= 0xf0f0; +#endif + ANTIC_cl[C_BAK] = (UWORD) background; + do + DO_BORDER + while (pm_scanline_ptr < >IA_pm_scanline[RBORDER_END]); + GTIA_COLOUR_TO_WORD(ANTIC_cl[C_PF3],GTIA_COLPF3) + GTIA_COLOUR_TO_WORD(ANTIC_cl[C_BAK],GTIA_COLBK) + } + else + FILL_VIDEO(ptr, ANTIC_lookup_gtia11[0], (RBORDER_END - LBORDER_START) * 2); +} + +/* ANTIC modes ------------------------------------------------------------- */ + +static const UBYTE gtia_10_lookup[] = +{L_BAK, L_BAK, L_BAK, L_BAK, L_PF0, L_PF1, L_PF2, L_PF3, + L_BAK, L_BAK, L_BAK, L_BAK, L_PF0, L_PF1, L_PF2, L_PF3}; +static const UBYTE gtia_10_pm[] = +{1, 2, 4, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +static void draw_an_gtia9(const ULONG *t_pm_scanline_ptr) +{ + int i = ((const UBYTE *) t_pm_scanline_ptr - GTIA_pm_scanline) & ~1; + while (i < right_border_start) { + UWORD *ptr = scrn_ptr + i; + int pixel = (an_scanline[i] << 2) + an_scanline[i + 1]; + UBYTE pm_reg; + WRITE_VIDEO_LONG((ULONG *) ptr, ANTIC_lookup_gtia9[pixel]); + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + pm_reg = pm_lookup_ptr[pm_reg]; + if (pm_reg == L_PF3) { +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[pixel | GTIA_COLPF3]); +#else + WRITE_VIDEO(ptr, pixel | (pixel << 8) | ANTIC_cl[C_PF3]); +#endif + } + else { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + i++; + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + pm_reg = pm_lookup_ptr[pm_reg]; + if (pm_reg == L_PF3) { +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr + 1, colour_translation_table[pixel | GTIA_COLPF3]); +#else + WRITE_VIDEO(ptr + 1, pixel | (pixel << 8) | ANTIC_cl[C_PF3]); +#endif + } + else { + WRITE_VIDEO(ptr + 1, COLOUR(pm_reg)); + } + } + i++; + } + do_border(); +} + +static void draw_an_gtia10(const ULONG *t_pm_scanline_ptr) +{ + int i = ((const UBYTE *) t_pm_scanline_ptr - GTIA_pm_scanline) | 1; + UWORD lookup_gtia10[16]; + lookup_gtia10[0] = ANTIC_cl[C_PM0]; + lookup_gtia10[1] = ANTIC_cl[C_PM1]; + lookup_gtia10[2] = ANTIC_cl[C_PM2]; + lookup_gtia10[3] = ANTIC_cl[C_PM3]; + lookup_gtia10[12] = lookup_gtia10[4] = ANTIC_cl[C_PF0]; + lookup_gtia10[13] = lookup_gtia10[5] = ANTIC_cl[C_PF1]; + lookup_gtia10[14] = lookup_gtia10[6] = ANTIC_cl[C_PF2]; + lookup_gtia10[15] = lookup_gtia10[7] = ANTIC_cl[C_PF3]; + lookup_gtia10[8] = lookup_gtia10[9] = lookup_gtia10[10] = lookup_gtia10[11] = ANTIC_cl[C_BAK]; + while (i < right_border_start) { + UWORD *ptr = scrn_ptr + i; + int pixel = (an_scanline[i - 1] << 2) + an_scanline[i]; + UBYTE pm_reg; + int colreg; + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + colreg = gtia_10_lookup[pixel]; + PF_COLLS(colreg) |= pm_reg; + pm_reg |= gtia_10_pm[pixel]; + WRITE_VIDEO(ptr, COLOUR(pm_lookup_ptr[pm_reg] | colreg)); + } + else { + WRITE_VIDEO(ptr, lookup_gtia10[pixel]); + } + i++; + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + colreg = gtia_10_lookup[pixel]; + PF_COLLS(colreg) |= pm_reg; + pm_reg |= gtia_10_pm[pixel]; + WRITE_VIDEO(ptr + 1, COLOUR(pm_lookup_ptr[pm_reg] | colreg)); + } + else { + WRITE_VIDEO(ptr + 1, lookup_gtia10[pixel]); + } + i++; + } + do_border_gtia10(); +} + +static void draw_an_gtia11(const ULONG *t_pm_scanline_ptr) +{ + int i = ((const UBYTE *) t_pm_scanline_ptr - GTIA_pm_scanline) & ~1; + while (i < right_border_start) { + UWORD *ptr = scrn_ptr + i; + int pixel = (an_scanline[i] << 2) + an_scanline[i + 1]; + UBYTE pm_reg; + WRITE_VIDEO_LONG((ULONG *) ptr, ANTIC_lookup_gtia11[pixel]); + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + pm_reg = pm_lookup_ptr[pm_reg]; + if (pm_reg == L_PF3) { +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[pixel ? pixel | GTIA_COLPF3 : GTIA_COLPF3 & 0xf0]); +#else + WRITE_VIDEO(ptr, pixel ? (pixel << 4) | (pixel << 12) | ANTIC_cl[C_PF3] : ANTIC_cl[C_PF3] & 0xf0f0); +#endif + } + else { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + i++; + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + pm_reg = pm_lookup_ptr[pm_reg]; + if (pm_reg == L_PF3) { +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr + 1, colour_translation_table[pixel ? pixel | GTIA_COLPF3 : GTIA_COLPF3 & 0xf0]); +#else + WRITE_VIDEO(ptr + 1, pixel ? (pixel << 4) | (pixel << 12) | ANTIC_cl[C_PF3] : ANTIC_cl[C_PF3] & 0xf0f0); +#endif + } + else { + WRITE_VIDEO(ptr + 1, COLOUR(pm_reg)); + } + } + i++; + } + do_border_gtia11(); +} + +static void draw_an_gtia_bug(const ULONG *t_pm_scanline_ptr) +{ + static const UBYTE gtia_bug_colreg[] = {L_PF0, L_PF1, L_PF2, L_PF3}; + UWORD lookup_gtia_bug[16]; + int i; + lookup_gtia_bug[0] = ANTIC_cl[C_PF0]; + lookup_gtia_bug[1] = ANTIC_cl[C_PF1]; + lookup_gtia_bug[2] = ANTIC_cl[C_PF2]; + lookup_gtia_bug[3] = ANTIC_cl[C_PF3]; + i = ((const UBYTE *) t_pm_scanline_ptr - GTIA_pm_scanline); + while (i < right_border_start) { + UWORD *ptr = scrn_ptr + i; + int pixel = an_scanline[i]; + UBYTE pm_reg; + int colreg; + pm_reg = GTIA_pm_scanline[i]; + if (pm_reg) { + colreg = gtia_bug_colreg[pixel]; + PF_COLLS(colreg) |= pm_reg; + WRITE_VIDEO(ptr, COLOUR(pm_lookup_ptr[pm_reg] | colreg)); + } + else { + WRITE_VIDEO(ptr, lookup_gtia_bug[pixel]); + } + i++; + } + do_border(); +} + +#define DEFINE_DRAW_AN(anticmode) \ + static void draw_antic_ ## anticmode ## _gtia9 (int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr)\ + {\ + prepare_an_antic_ ## anticmode (nchars, antic_memptr, t_pm_scanline_ptr);\ + draw_an_gtia9(t_pm_scanline_ptr);\ + }\ + static void draw_antic_ ## anticmode ## _gtia10 (int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr)\ + {\ + prepare_an_antic_ ## anticmode (nchars, antic_memptr, t_pm_scanline_ptr);\ + draw_an_gtia10(t_pm_scanline_ptr);\ + }\ + static void draw_antic_ ## anticmode ## _gtia11 (int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr)\ + {\ + prepare_an_antic_ ## anticmode (nchars, antic_memptr, t_pm_scanline_ptr);\ + draw_an_gtia11(t_pm_scanline_ptr);\ + } + +#define CHAR_LOOP_BEGIN do { +#define CHAR_LOOP_END } while (--nchars); + +#define DO_PMG_LORES PF_COLLS(colreg) |= pm_pixel = *c_pm_scanline_ptr++;\ + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[pm_pixel] | colreg)); + +#ifdef ALTERNATE_LOOP_COUNTERS /* speeds-up pmg in hires a bit or not? try it :) */ +#define FOUR_LOOP_BEGIN(data) data |= 0x800000; do { /* data becomes negative after four data <<= 2 */ +#define FOUR_LOOP_END(data) } while (data >= 0); +#else +#define FOUR_LOOP_BEGIN(data) int k = 4; do { +#define FOUR_LOOP_END(data) } while (--k); +#endif + +#ifdef USE_COLOUR_TRANSLATION_TABLE + +#define INIT_HIRES hires_norm(0x00) = ANTIC_cl[C_PF2];\ + hires_norm(0x40) = hires_norm(0x10) = hires_norm(0x04) = (ANTIC_cl[C_PF2] & BYTE0_MASK) | (ANTIC_cl[C_HI2] & BYTE1_MASK);\ + hires_norm(0x80) = hires_norm(0x20) = hires_norm(0x08) = (ANTIC_cl[C_HI2] & BYTE0_MASK) | (ANTIC_cl[C_PF2] & BYTE1_MASK);\ + hires_norm(0xc0) = hires_norm(0x30) = hires_norm(0x0c) = ANTIC_cl[C_HI2]; + +#define DO_PMG_HIRES(data) {\ + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr;\ + int pm_pixel;\ + int mask;\ + FOUR_LOOP_BEGIN(data)\ + pm_pixel = *c_pm_scanline_ptr++;\ + if (data & 0xc0)\ + PF2PM |= pm_pixel;\ + mask = hires_mask(data & 0xc0);\ + pm_pixel = pm_lookup_ptr[pm_pixel] | L_PF2;\ + WRITE_VIDEO(ptr++, (COLOUR(pm_pixel) & mask) | (COLOUR(pm_pixel + (L_HI2 - L_PF2)) & ~mask));\ + data <<= 2;\ + FOUR_LOOP_END(data)\ +} + +#else /* USE_COLOUR_TRANSLATION_TABLE */ + +#define INIT_HIRES hires_norm(0x00) = ANTIC_cl[C_PF2];\ + hires_norm(0x40) = hires_norm(0x10) = hires_norm(0x04) = (ANTIC_cl[C_PF2] & HIRES_MASK_01) | hires_lum(0x40);\ + hires_norm(0x80) = hires_norm(0x20) = hires_norm(0x08) = (ANTIC_cl[C_PF2] & HIRES_MASK_10) | hires_lum(0x80);\ + hires_norm(0xc0) = hires_norm(0x30) = hires_norm(0x0c) = (ANTIC_cl[C_PF2] & 0xf0f0) | hires_lum(0xc0); + +#define INIT_ARTIF_NEW art_lookup_new[0] = art_lookup_new[1] = art_lookup_new[2] = art_lookup_new[3] = \ + art_lookup_new[16] = art_lookup_new[17] = art_lookup_new[18] = art_lookup_new[19] = \ + art_lookup_new[32] = art_lookup_new[33] = art_lookup_new[34] = art_lookup_new[35] = \ + art_lookup_new[48] = art_lookup_new[49] = art_lookup_new[50] = art_lookup_new[51] = ANTIC_cl[C_PF2];\ + art_lookup_new[7] = art_lookup_new[23] = art_lookup_new[39] = art_lookup_new[55] = (ANTIC_cl[C_PF2] & HIRES_MASK_01) | hires_lum(0x40);\ + art_lookup_new[56] = art_lookup_new[57] = art_lookup_new[58] = art_lookup_new[59] = (ANTIC_cl[C_PF2] & HIRES_MASK_10) | hires_lum(0x80);\ + art_lookup_new[12] = art_lookup_new[13] = art_lookup_new[14] = art_lookup_new[15] = \ + art_lookup_new[28] = art_lookup_new[29] = art_lookup_new[30] = art_lookup_new[31] = \ + art_lookup_new[44] = art_lookup_new[45] = art_lookup_new[46] = art_lookup_new[47] = \ + art_lookup_new[60] = art_lookup_new[61] = art_lookup_new[62] = art_lookup_new[63] = (ANTIC_cl[C_PF2] & 0xf0f0) | hires_lum(0xc0);\ + if ((ANTIC_cl[C_PF2] & 0x0F00) != (ANTIC_cl[C_PF1] & 0x0F00)) { \ + art_lookup_new[4] = art_lookup_new[5] = art_lookup_new[36] = art_lookup_new[37] = \ + art_lookup_new[52] = art_lookup_new[53 ]= ((art_colour1_new & BYTE1_MASK & ~(HIRES_LUM_01))) | hires_lum(0x40) | (ANTIC_cl[C_PF2] & BYTE0_MASK);\ + art_lookup_new[20] = art_lookup_new[21] = (art_colour1_new & 0xf0f0) | hires_lum(0xc0);\ + art_lookup_new[8] = art_lookup_new[9] = art_lookup_new[11] = art_lookup_new[40] = \ + art_lookup_new[43] = ((art_colour2_new & BYTE0_MASK & ~(HIRES_LUM_10))) | hires_lum(0x80) | (ANTIC_cl[C_PF2] & BYTE1_MASK);\ + art_lookup_new[10] = art_lookup_new[41] = art_lookup_new[42] = (art_colour2_new & 0xf0f0) | hires_lum(0xc0);\ + }\ + else {\ + art_lookup_new[4] = art_lookup_new[5] = art_lookup_new[36] = art_lookup_new[37] = \ + art_lookup_new[52] = art_lookup_new[53 ]= art_lookup_new[20] = art_lookup_new[21] = \ + art_lookup_new[8] = art_lookup_new[9] = art_lookup_new[11] = art_lookup_new[40] = \ + art_lookup_new[43] = art_lookup_new[10] = art_lookup_new[41] = art_lookup_new[42] = ANTIC_cl[C_PF2];\ + }\ + art_lookup_new[6] = art_lookup_new[22] = art_lookup_new[38] = art_lookup_new[54] = (ANTIC_cl[C_PF2] & HIRES_MASK_01) | hires_lum(0x40);\ + art_lookup_new[24] = art_lookup_new[25] = art_lookup_new[26] = art_lookup_new[27] = (ANTIC_cl[C_PF2] & HIRES_MASK_10) | hires_lum(0x80); + +#define DO_PMG_HIRES(data) {\ + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr;\ + int pm_pixel;\ + FOUR_LOOP_BEGIN(data)\ + pm_pixel = *c_pm_scanline_ptr++;\ + if (data & 0xc0)\ + PF2PM |= pm_pixel;\ + WRITE_VIDEO(ptr++, (COLOUR(pm_lookup_ptr[pm_pixel] | L_PF2) & hires_mask(data & 0xc0)) | hires_lum(data & 0xc0));\ + data <<= 2;\ + FOUR_LOOP_END(data)\ +} + +#define DO_PMG_HIRES_NEW(data, tally) {\ + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr;\ + int pm_pixel;\ + FOUR_LOOP_BEGIN(data)\ + pm_pixel = *c_pm_scanline_ptr++;\ + if (pm_pixel) \ + WRITE_VIDEO(ptr++, (COLOUR(pm_lookup_ptr[pm_pixel] | L_PF2)));\ + else\ + WRITE_VIDEO(ptr++, art_lookup_new[(tally & 0xfc0000) >> 18]); \ + data <<= 2;\ + tally <<= 6;\ + FOUR_LOOP_END(data)\ +} + +#endif /* USE_COLOUR_TRANSLATION_TABLE */ + +#ifdef NEW_CYCLE_EXACT +#define ADD_FONT_CYCLES +#else +#define ADD_FONT_CYCLES ANTIC_xpos += font_cycles[md] +#endif + +#ifdef PAGED_MEM + +#define INIT_ANTIC_2 int t_chbase = (dctr ^ chbase_20) & 0xfc07;\ + ADD_FONT_CYCLES;\ + blank_lookup[0x60] = (anticmode == 2 || dctr & 0xe) ? 0xff : 0;\ + blank_lookup[0x00] = blank_lookup[0x20] = blank_lookup[0x40] = (dctr & 0xe) == 8 ? 0 : 0xff; + +#define GET_CHDATA_ANTIC_2 chdata = (screendata & invert_mask) ? 0xff : 0;\ + if (blank_lookup[screendata & blank_mask])\ + chdata ^= MEMORY_dGetByte(t_chbase + ((UWORD) (screendata & 0x7f) << 3)); + +#else /* PAGED_MEM */ + +#define INIT_ANTIC_2 const UBYTE *chptr;\ + if (ANTIC_xe_ptr != NULL && chbase_20 < 0x8000 && chbase_20 >= 0x4000)\ + chptr = ANTIC_xe_ptr + ((dctr ^ chbase_20) & 0x3c07);\ + else\ + chptr = MEMORY_mem + ((dctr ^ chbase_20) & 0xfc07);\ + ADD_FONT_CYCLES;\ + blank_lookup[0x60] = (anticmode == 2 || dctr & 0xe) ? 0xff : 0;\ + blank_lookup[0x00] = blank_lookup[0x20] = blank_lookup[0x40] = (dctr & 0xe) == 8 ? 0 : 0xff; + +#define GET_CHDATA_ANTIC_2 chdata = (screendata & invert_mask) ? 0xff : 0;\ + if (blank_lookup[screendata & blank_mask])\ + chdata ^= chptr[(screendata & 0x7f) << 3]; + +#endif /* PAGED_MEM */ + +static void draw_antic_2(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_BACKGROUND_6 + INIT_ANTIC_2 + INIT_HIRES + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int chdata; + + GET_CHDATA_ANTIC_2 + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + if (chdata) { + WRITE_VIDEO(ptr++, hires_norm(chdata & 0xc0)); + WRITE_VIDEO(ptr++, hires_norm(chdata & 0x30)); + WRITE_VIDEO(ptr++, hires_norm(chdata & 0x0c)); + WRITE_VIDEO(ptr++, hires_norm((chdata & 0x03) << 2)); + } + else + DRAW_BACKGROUND(C_PF2) + } + else + DO_PMG_HIRES(chdata) + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +#ifdef NEW_CYCLE_EXACT +static void draw_antic_2_dmactl_bug(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_BACKGROUND_6 + INIT_ANTIC_2 + INIT_HIRES + + CHAR_LOOP_BEGIN + /* UBYTE screendata = *antic_memptr++; */ + +/* In this glitched mode, the output depends on the MSB of the last char */ +/* drawn in the previous line, and invert_mask. It seems to reveal that */ +/* ANTIC has a latch that is set by the MSB of the char that controls an */ +/* invert gate. */ +/* When this gate was set on the last line and the next line is glitched */ +/* it remains set and the whole line appears inverted */ +/* We'll use this modeline to draw antic f glitched as well, and set */ +/* dmactl_bug_chdata to 0 */ + int chdata = (dmactl_bug_chdata & invert_mask) ? 0xff : 0; + /* GET_CHDATA_ANTIC_2 */ + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + + if (chdata) { + WRITE_VIDEO(ptr++, hires_norm(chdata & 0xc0)); + WRITE_VIDEO(ptr++, hires_norm(chdata & 0x30)); + WRITE_VIDEO(ptr++, hires_norm(chdata & 0x0c)); + WRITE_VIDEO(ptr++, hires_norm((chdata & 0x03) << 2)); + } + else + DRAW_BACKGROUND(C_PF2) + } + else + DO_PMG_HIRES(chdata) + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} +#endif + +static void draw_antic_2_artif(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + ULONG screendata_tally; + INIT_ANTIC_2 + { + UBYTE screendata = *antic_memptr++; + UBYTE chdata; + GET_CHDATA_ANTIC_2 + screendata_tally = chdata; + } + setup_art_colours(); + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + ULONG chdata; + + GET_CHDATA_ANTIC_2 + screendata_tally <<= 8; + screendata_tally |= chdata; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + DRAW_ARTIF + else { + chdata = screendata_tally >> 8; + DO_PMG_HIRES(chdata) + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +#ifndef USE_COLOUR_TRANSLATION_TABLE +static void draw_antic_2_artif_new(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + ULONG screendata_tally; + ULONG pmtally; + UBYTE screendata = *antic_memptr++; + UBYTE chdata; + INIT_ANTIC_2 + INIT_ARTIF_NEW + GET_CHDATA_ANTIC_2 + screendata_tally = chdata; + setup_art_colours(); + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + ULONG chdata; + + GET_CHDATA_ANTIC_2 + screendata_tally <<= 8; + screendata_tally |= chdata; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + DRAW_ARTIF_NEW + else { + chdata = screendata_tally >> 8; + pmtally = ((screendata_tally & 0x03f000) << 6) | + ((screendata_tally & 0x00fc00) << 2) | + ((screendata_tally & 0x003f00) >> 2) | + ((screendata_tally & 0x000fc0) >> 6); + DO_PMG_HIRES_NEW(chdata,pmtally) + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} +#endif + +static void prepare_an_antic_2(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); +#ifdef PAGED_MEM + int t_chbase = (dctr ^ chbase_20) & 0xfc07; +#else + const UBYTE *chptr; + if (ANTIC_xe_ptr != NULL && chbase_20 < 0x8000 && chbase_20 >= 0x4000) + chptr = ANTIC_xe_ptr + ((dctr ^ chbase_20) & 0x3c07); + else + chptr = MEMORY_mem + ((dctr ^ chbase_20) & 0xfc07); +#endif + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int chdata; + GET_CHDATA_ANTIC_2 + *an_ptr++ = chdata >> 6; + *an_ptr++ = (chdata >> 4) & 3; + *an_ptr++ = (chdata >> 2) & 3; + *an_ptr++ = chdata & 3; + CHAR_LOOP_END +} + +static void draw_antic_2_gtia9(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_ANTIC_2 + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_2(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia9(t_pm_scanline_ptr); + return; + } + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int chdata; + + GET_CHDATA_ANTIC_2 + WRITE_VIDEO_LONG((ULONG *) ptr, ANTIC_lookup_gtia9[chdata >> 4]); + WRITE_VIDEO_LONG((ULONG *) ptr + 1, ANTIC_lookup_gtia9[chdata & 0xf]); + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + ptr += 4; + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int k = 4; + UBYTE pm_reg; + do { + pm_reg = pm_lookup_ptr[*c_pm_scanline_ptr++]; + if (pm_reg) { + if (pm_reg == L_PF3) { + UBYTE tmp = k > 2 ? chdata >> 4 : chdata & 0xf; +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[tmp | GTIA_COLPF3]); +#else + WRITE_VIDEO(ptr, tmp | ((UWORD)tmp << 8) | ANTIC_cl[C_PF3]); +#endif + } + else + { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + ptr++; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +static void draw_antic_2_gtia10(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ +#ifdef WORDS_UNALIGNED_OK + ULONG lookup_gtia10[16]; +#else + UWORD lookup_gtia10[16]; +#endif + INIT_ANTIC_2 + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_2(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia10(t_pm_scanline_ptr); + return; + } + +#ifdef WORDS_UNALIGNED_OK + lookup_gtia10[0] = ANTIC_cl[C_PM0] | (ANTIC_cl[C_PM0] << 16); + lookup_gtia10[1] = ANTIC_cl[C_PM1] | (ANTIC_cl[C_PM1] << 16); + lookup_gtia10[2] = ANTIC_cl[C_PM2] | (ANTIC_cl[C_PM2] << 16); + lookup_gtia10[3] = ANTIC_cl[C_PM3] | (ANTIC_cl[C_PM3] << 16); + lookup_gtia10[12] = lookup_gtia10[4] = ANTIC_cl[C_PF0] | (ANTIC_cl[C_PF0] << 16); + lookup_gtia10[13] = lookup_gtia10[5] = ANTIC_cl[C_PF1] | (ANTIC_cl[C_PF1] << 16); + lookup_gtia10[14] = lookup_gtia10[6] = ANTIC_cl[C_PF2] | (ANTIC_cl[C_PF2] << 16); + lookup_gtia10[15] = lookup_gtia10[7] = ANTIC_cl[C_PF3] | (ANTIC_cl[C_PF3] << 16); + lookup_gtia10[8] = lookup_gtia10[9] = lookup_gtia10[10] = lookup_gtia10[11] = ANTIC_lookup_gtia9[0]; +#else + lookup_gtia10[0] = ANTIC_cl[C_PM0]; + lookup_gtia10[1] = ANTIC_cl[C_PM1]; + lookup_gtia10[2] = ANTIC_cl[C_PM2]; + lookup_gtia10[3] = ANTIC_cl[C_PM3]; + lookup_gtia10[12] = lookup_gtia10[4] = ANTIC_cl[C_PF0]; + lookup_gtia10[13] = lookup_gtia10[5] = ANTIC_cl[C_PF1]; + lookup_gtia10[14] = lookup_gtia10[6] = ANTIC_cl[C_PF2]; + lookup_gtia10[15] = lookup_gtia10[7] = ANTIC_cl[C_PF3]; + lookup_gtia10[8] = lookup_gtia10[9] = lookup_gtia10[10] = lookup_gtia10[11] = ANTIC_cl[C_BAK]; +#endif + ptr++; + t_pm_scanline_ptr = (const ULONG *) (((const UBYTE *) t_pm_scanline_ptr) + 1); + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int chdata; + + GET_CHDATA_ANTIC_2 + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + DO_GTIA_BYTE(ptr, lookup_gtia10, chdata) + ptr += 4; + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + UBYTE t_screendata = chdata >> 4; + do { + colreg = gtia_10_lookup[t_screendata]; + PF_COLLS(colreg) |= pm_pixel = *c_pm_scanline_ptr++; + pm_pixel |= gtia_10_pm[t_screendata]; + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[pm_pixel] | colreg)); + if (k == 3) + t_screendata = chdata & 0x0f; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border_gtia10(); +} + +static void draw_antic_2_gtia11(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_ANTIC_2 + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_2(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia11(t_pm_scanline_ptr); + return; + } + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int chdata; + + GET_CHDATA_ANTIC_2 + WRITE_VIDEO_LONG((ULONG *) ptr, ANTIC_lookup_gtia11[chdata >> 4]); + WRITE_VIDEO_LONG((ULONG *) ptr + 1, ANTIC_lookup_gtia11[chdata & 0xf]); + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + ptr += 4; + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int k = 4; + UBYTE pm_reg; + do { + pm_reg = pm_lookup_ptr[*c_pm_scanline_ptr++]; + if (pm_reg) { + if (pm_reg == L_PF3) { + UBYTE tmp = k > 2 ? chdata & 0xf0 : chdata << 4; +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[tmp ? tmp | GTIA_COLPF3 : GTIA_COLPF3 & 0xf0]); +#else + WRITE_VIDEO(ptr, tmp ? tmp | ((UWORD)tmp << 8) | ANTIC_cl[C_PF3] : ANTIC_cl[C_PF3] & 0xf0f0); +#endif + } + else + { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + ptr++; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border_gtia11(); +} + +static void draw_antic_2_gtia_bug(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + prepare_an_antic_2(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia_bug(t_pm_scanline_ptr); + return; +} + +static void draw_antic_4(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_BACKGROUND_8 +#ifdef PAGED_MEM + UWORD t_chbase = ((anticmode == 4 ? dctr : dctr >> 1) ^ chbase_20) & 0xfc07; +#else + const UBYTE *chptr; + if (ANTIC_xe_ptr != NULL && chbase_20 < 0x8000 && chbase_20 >= 0x4000) + chptr = ANTIC_xe_ptr + (((anticmode == 4 ? dctr : dctr >> 1) ^ chbase_20) & 0x3c07); + else + chptr = MEMORY_mem + (((anticmode == 4 ? dctr : dctr >> 1) ^ chbase_20) & 0xfc07); +#endif + + ADD_FONT_CYCLES; + lookup2[0x0f] = lookup2[0x00] = ANTIC_cl[C_BAK]; + lookup2[0x4f] = lookup2[0x1f] = lookup2[0x13] = + lookup2[0x40] = lookup2[0x10] = lookup2[0x04] = lookup2[0x01] = ANTIC_cl[C_PF0]; + lookup2[0x8f] = lookup2[0x2f] = lookup2[0x17] = lookup2[0x11] = + lookup2[0x80] = lookup2[0x20] = lookup2[0x08] = lookup2[0x02] = ANTIC_cl[C_PF1]; + lookup2[0xc0] = lookup2[0x30] = lookup2[0x0c] = lookup2[0x03] = ANTIC_cl[C_PF2]; + lookup2[0xcf] = lookup2[0x3f] = lookup2[0x1b] = lookup2[0x12] = ANTIC_cl[C_PF3]; + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + const UWORD *lookup; + UBYTE chdata; + if (screendata & 0x80) + lookup = lookup2 + 0xf; + else + lookup = lookup2; +#ifdef PAGED_MEM + chdata = MEMORY_dGetByte(t_chbase + ((UWORD) (screendata & 0x7f) << 3)); +#else + chdata = chptr[(screendata & 0x7f) << 3]; +#endif + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + if (chdata) { + WRITE_VIDEO(ptr++, lookup[chdata & 0xc0]); + WRITE_VIDEO(ptr++, lookup[chdata & 0x30]); + WRITE_VIDEO(ptr++, lookup[chdata & 0x0c]); + WRITE_VIDEO(ptr++, lookup[chdata & 0x03]); + } + else + DRAW_BACKGROUND(C_BAK) + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + playfield_lookup[0xc0] = screendata & 0x80 ? L_PF3 : L_PF2; + do { + colreg = playfield_lookup[chdata & 0xc0]; + DO_PMG_LORES + chdata <<= 2; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + playfield_lookup[0xc0] = L_PF2; + do_border(); +} + +static void prepare_an_antic_4(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); +#ifdef PAGED_MEM + UWORD t_chbase = ((anticmode == 4 ? dctr : dctr >> 1) ^ chbase_20) & 0xfc07; +#else + const UBYTE *chptr; + if (ANTIC_xe_ptr != NULL && chbase_20 < 0x8000 && chbase_20 >= 0x4000) + chptr = ANTIC_xe_ptr + (((anticmode == 4 ? dctr : dctr >> 1) ^ chbase_20) & 0x3c07); + else + chptr = MEMORY_mem + (((anticmode == 4 ? dctr : dctr >> 1) ^ chbase_20) & 0xfc07); +#endif + + ADD_FONT_CYCLES; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + UBYTE an; + UBYTE chdata; +#ifdef PAGED_MEM + chdata = MEMORY_dGetByte(t_chbase + ((UWORD) (screendata & 0x7f) << 3)); +#else + chdata = chptr[(screendata & 0x7f) << 3]; +#endif + an = mode_e_an_lookup[chdata & 0xc0]; + *an_ptr++ = (an == 2 && screendata & 0x80) ? 3 : an; + an = mode_e_an_lookup[chdata & 0x30]; + *an_ptr++ = (an == 2 && screendata & 0x80) ? 3 : an; + an = mode_e_an_lookup[chdata & 0x0c]; + *an_ptr++ = (an == 2 && screendata & 0x80) ? 3 : an; + an = mode_e_an_lookup[chdata & 0x03]; + *an_ptr++ = (an == 2 && screendata & 0x80) ? 3 : an; + CHAR_LOOP_END +} + +DEFINE_DRAW_AN(4) + +static void draw_antic_6(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ +#ifdef PAGED_MEM + UWORD t_chbase = (anticmode == 6 ? dctr & 7 : dctr >> 1) ^ chbase_20; +#else + const UBYTE *chptr; + if (ANTIC_xe_ptr != NULL && chbase_20 < 0x8000 && chbase_20 >= 0x4000) + chptr = ANTIC_xe_ptr + (((anticmode == 6 ? dctr & 7 : dctr >> 1) ^ chbase_20) - 0x4000); + else + chptr = MEMORY_mem + ((anticmode == 6 ? dctr & 7 : dctr >> 1) ^ chbase_20); +#endif + + ADD_FONT_CYCLES; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + UBYTE chdata; + UWORD colour; + int kk = 2; + colour = COLOUR((playfield_lookup + 0x40)[screendata & 0xc0]); +#ifdef PAGED_MEM + chdata = MEMORY_dGetByte(t_chbase + ((UWORD) (screendata & 0x3f) << 3)); +#else + chdata = chptr[(screendata & 0x3f) << 3]; +#endif + do { + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + if (chdata & 0xf0) { + if (chdata & 0x80) { + WRITE_VIDEO(ptr++, colour); + } + else { + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + } + if (chdata & 0x40) { + WRITE_VIDEO(ptr++, colour); + } + else { + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + } + if (chdata & 0x20) { + WRITE_VIDEO(ptr++, colour); + } + else { + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + } + if (chdata & 0x10) { + WRITE_VIDEO(ptr++, colour); + } + else { + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + } + } + else { + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + WRITE_VIDEO(ptr++, ANTIC_cl[C_BAK]); + } + chdata <<= 4; + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + UBYTE setcol = (playfield_lookup + 0x40)[screendata & 0xc0]; + int colreg; + int k = 4; + do { + colreg = chdata & 0x80 ? setcol : L_BAK; + DO_PMG_LORES + chdata <<= 1; + } while (--k); + + } + t_pm_scanline_ptr++; + } while (--kk); + CHAR_LOOP_END + do_border(); +} + +static void prepare_an_antic_6(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); +#ifdef PAGED_MEM + UWORD t_chbase = (anticmode == 6 ? dctr & 7 : dctr >> 1) ^ chbase_20; +#else + const UBYTE *chptr; + if (ANTIC_xe_ptr != NULL && chbase_20 < 0x8000 && chbase_20 >= 0x4000) + chptr = ANTIC_xe_ptr + (((anticmode == 6 ? dctr & 7 : dctr >> 1) ^ chbase_20) - 0x4000); + else + chptr = MEMORY_mem + ((anticmode == 6 ? dctr & 7 : dctr >> 1) ^ chbase_20); +#endif + + ADD_FONT_CYCLES; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + UBYTE an = screendata >> 6; + UBYTE chdata; +#ifdef PAGED_MEM + chdata = MEMORY_dGetByte(t_chbase + ((UWORD) (screendata & 0x3f) << 3)); +#else + chdata = chptr[(screendata & 0x3f) << 3]; +#endif + *an_ptr++ = chdata & 0x80 ? an : 0; + *an_ptr++ = chdata & 0x40 ? an : 0; + *an_ptr++ = chdata & 0x20 ? an : 0; + *an_ptr++ = chdata & 0x10 ? an : 0; + *an_ptr++ = chdata & 0x08 ? an : 0; + *an_ptr++ = chdata & 0x04 ? an : 0; + *an_ptr++ = chdata & 0x02 ? an : 0; + *an_ptr++ = chdata & 0x01 ? an : 0; + CHAR_LOOP_END +} + +DEFINE_DRAW_AN(6) + +static void draw_antic_8(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + lookup2[0x00] = ANTIC_cl[C_BAK]; + lookup2[0x40] = ANTIC_cl[C_PF0]; + lookup2[0x80] = ANTIC_cl[C_PF1]; + lookup2[0xc0] = ANTIC_cl[C_PF2]; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int kk = 4; + do { + if ((const UBYTE *) t_pm_scanline_ptr >= GTIA_pm_scanline + 4 * (48 - RCHOP)) + break; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + UWORD data = lookup2[screendata & 0xc0]; + WRITE_VIDEO(ptr++, data); + WRITE_VIDEO(ptr++, data); + WRITE_VIDEO(ptr++, data); + WRITE_VIDEO(ptr++, data); + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg = playfield_lookup[screendata & 0xc0]; + int k = 4; + do { + DO_PMG_LORES + } while (--k); + } + screendata <<= 2; + t_pm_scanline_ptr++; + } while (--kk); + CHAR_LOOP_END + do_border(); +} + +static void prepare_an_antic_8(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int kk = 4; + do { + UBYTE data = mode_e_an_lookup[screendata & 0xc0]; + *an_ptr++ = data; + *an_ptr++ = data; + *an_ptr++ = data; + *an_ptr++ = data; + screendata <<= 2; + } while (--kk); + CHAR_LOOP_END +} + +DEFINE_DRAW_AN(8) + +static void draw_antic_9(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + lookup2[0x00] = ANTIC_cl[C_BAK]; + lookup2[0x80] = lookup2[0x40] = ANTIC_cl[C_PF0]; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int kk = 4; + do { + if ((const UBYTE *) t_pm_scanline_ptr >= GTIA_pm_scanline + 4 * (48 - RCHOP)) + break; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + WRITE_VIDEO(ptr++, lookup2[screendata & 0x80]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x80]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x40]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x40]); + screendata <<= 2; + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + do { + colreg = (screendata & 0x80) ? L_PF0 : L_BAK; + DO_PMG_LORES + if (k & 0x01) + screendata <<= 1; + } while (--k); + } + t_pm_scanline_ptr++; + } while (--kk); + CHAR_LOOP_END + do_border(); +} + +/* ANTIC modes 9, b and c use BAK and PF0 colours only so they're not visible in GTIA modes */ + +static void draw_antic_9_gtia9(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + draw_antic_0(); +} + +static void draw_antic_9_gtia10(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + draw_antic_0_gtia10(); +} + +static void draw_antic_9_gtia11(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + draw_antic_0_gtia11(); +} + +static void draw_antic_a(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + lookup2[0x00] = ANTIC_cl[C_BAK]; + lookup2[0x40] = lookup2[0x10] = ANTIC_cl[C_PF0]; + lookup2[0x80] = lookup2[0x20] = ANTIC_cl[C_PF1]; + lookup2[0xc0] = lookup2[0x30] = ANTIC_cl[C_PF2]; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int kk = 2; + do { + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + WRITE_VIDEO(ptr++, lookup2[screendata & 0xc0]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0xc0]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x30]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x30]); + screendata <<= 4; + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + do { + colreg = playfield_lookup[screendata & 0xc0]; + DO_PMG_LORES + if (k & 0x01) + screendata <<= 2; + } while (--k); + } + t_pm_scanline_ptr++; + } while (--kk); + CHAR_LOOP_END + do_border(); +} + +static void prepare_an_antic_a(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + UBYTE data = mode_e_an_lookup[screendata & 0xc0]; + *an_ptr++ = data; + *an_ptr++ = data; + data = mode_e_an_lookup[screendata & 0x30]; + *an_ptr++ = data; + *an_ptr++ = data; + data = mode_e_an_lookup[screendata & 0x0c]; + *an_ptr++ = data; + *an_ptr++ = data; + data = mode_e_an_lookup[screendata & 0x03]; + *an_ptr++ = data; + *an_ptr++ = data; + CHAR_LOOP_END +} + +DEFINE_DRAW_AN(a) + +static void draw_antic_c(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + lookup2[0x00] = ANTIC_cl[C_BAK]; + lookup2[0x80] = lookup2[0x40] = lookup2[0x20] = lookup2[0x10] = ANTIC_cl[C_PF0]; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + int kk = 2; + do { + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + WRITE_VIDEO(ptr++, lookup2[screendata & 0x80]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x40]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x20]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x10]); + screendata <<= 4; + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + do { + colreg = (screendata & 0x80) ? L_PF0 : L_BAK; + DO_PMG_LORES + screendata <<= 1; + } while (--k); + } + t_pm_scanline_ptr++; + } while (--kk); + CHAR_LOOP_END + do_border(); +} + +static void draw_antic_e(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_BACKGROUND_8 + lookup2[0x00] = ANTIC_cl[C_BAK]; + lookup2[0x40] = lookup2[0x10] = lookup2[0x04] = lookup2[0x01] = ANTIC_cl[C_PF0]; + lookup2[0x80] = lookup2[0x20] = lookup2[0x08] = lookup2[0x02] = ANTIC_cl[C_PF1]; + lookup2[0xc0] = lookup2[0x30] = lookup2[0x0c] = lookup2[0x03] = ANTIC_cl[C_PF2]; + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + if (screendata) { + WRITE_VIDEO(ptr++, lookup2[screendata & 0xc0]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x30]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x0c]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x03]); + } + else + DRAW_BACKGROUND(C_BAK) + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + do { + colreg = playfield_lookup[screendata & 0xc0]; + DO_PMG_LORES + screendata <<= 2; + } while (--k); + + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +static void prepare_an_antic_e(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + *an_ptr++ = mode_e_an_lookup[screendata & 0xc0]; + *an_ptr++ = mode_e_an_lookup[screendata & 0x30]; + *an_ptr++ = mode_e_an_lookup[screendata & 0x0c]; + *an_ptr++ = mode_e_an_lookup[screendata & 0x03]; + CHAR_LOOP_END +} + +static void draw_antic_e_gtia9(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + ULONG lookup[16]; + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_e(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia9(t_pm_scanline_ptr); + return; + } + lookup[0] = lookup[1] = lookup[4] = lookup[5] = ANTIC_lookup_gtia9[0]; + lookup[2] = lookup[6] = ANTIC_lookup_gtia9[1]; + lookup[3] = lookup[7] = ANTIC_lookup_gtia9[2]; + lookup[8] = lookup[9] = ANTIC_lookup_gtia9[4]; + lookup[10] = ANTIC_lookup_gtia9[5]; + lookup[11] = ANTIC_lookup_gtia9[6]; + lookup[12] = lookup[13] = ANTIC_lookup_gtia9[8]; + lookup[14] = ANTIC_lookup_gtia9[9]; + lookup[15] = ANTIC_lookup_gtia9[10]; + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + WRITE_VIDEO_LONG((ULONG *) ptr, lookup[screendata >> 4]); + WRITE_VIDEO_LONG((ULONG *) ptr + 1, lookup[screendata & 0xf]); + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + ptr += 4; + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int k = 4; + UBYTE pm_reg; + do { + pm_reg = pm_lookup_ptr[*c_pm_scanline_ptr++]; + if (pm_reg) { + if (pm_reg == L_PF3) { + UBYTE tmp = k > 2 ? screendata >> 4 : screendata & 0xf; +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[tmp | GTIA_COLPF3]); +#else + WRITE_VIDEO(ptr, tmp | ((UWORD)tmp << 8) | ANTIC_cl[C_PF3]); +#endif + } + else + { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + ptr++; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +static void draw_antic_e_gtia10 (int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + prepare_an_antic_e(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia10(t_pm_scanline_ptr); +} +static void draw_antic_e_gtia11 (int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + prepare_an_antic_e(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia11(t_pm_scanline_ptr); +} + +static void draw_antic_f(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + INIT_BACKGROUND_6 + INIT_HIRES + + CHAR_LOOP_BEGIN + int screendata = *antic_memptr++; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + if (screendata) { + WRITE_VIDEO(ptr++, hires_norm(screendata & 0xc0)); + WRITE_VIDEO(ptr++, hires_norm(screendata & 0x30)); + WRITE_VIDEO(ptr++, hires_norm(screendata & 0x0c)); + WRITE_VIDEO(ptr++, hires_norm((screendata & 0x03) << 2)); + } + else + DRAW_BACKGROUND(C_PF2) + } + else + DO_PMG_HIRES(screendata) + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +static void draw_antic_f_artif(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + ULONG screendata_tally = *antic_memptr++; + + setup_art_colours(); + CHAR_LOOP_BEGIN + int screendata = *antic_memptr++; + screendata_tally <<= 8; + screendata_tally |= screendata; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + DRAW_ARTIF + else { + screendata = antic_memptr[-2]; + DO_PMG_HIRES(screendata) + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +#ifndef USE_COLOUR_TRANSLATION_TABLE +static void draw_antic_f_artif_new(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + ULONG pmtally; + ULONG screendata_tally = *antic_memptr++; + INIT_ARTIF_NEW + + setup_art_colours(); + CHAR_LOOP_BEGIN + int screendata = *antic_memptr++; + screendata_tally <<= 8; + screendata_tally |= screendata; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + DRAW_ARTIF_NEW + else { + screendata = antic_memptr[-2]; + pmtally = ((screendata_tally & 0x03f000) << 6) | + ((screendata_tally & 0x00fc00) << 2) | + ((screendata_tally & 0x003f00) >> 2) | + ((screendata_tally & 0x000fc0) >> 6); + DO_PMG_HIRES_NEW(screendata,pmtally) + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} +#endif + +static void prepare_an_antic_f(int nchars, const UBYTE *antic_memptr, const ULONG *t_pm_scanline_ptr) +{ + UBYTE *an_ptr = (UBYTE *) t_pm_scanline_ptr + (an_scanline - GTIA_pm_scanline); + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + *an_ptr++ = screendata >> 6; + *an_ptr++ = (screendata >> 4) & 3; + *an_ptr++ = (screendata >> 2) & 3; + *an_ptr++ = screendata & 3; + CHAR_LOOP_END +} + +static void draw_antic_f_gtia9(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_f(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia9(t_pm_scanline_ptr); + return; + } + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + WRITE_VIDEO_LONG((ULONG *) ptr, ANTIC_lookup_gtia9[screendata >> 4]); + WRITE_VIDEO_LONG((ULONG *) ptr + 1, ANTIC_lookup_gtia9[screendata & 0xf]); + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + ptr += 4; + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int k = 4; + UBYTE pm_reg; + do { + pm_reg = pm_lookup_ptr[*c_pm_scanline_ptr++]; + if (pm_reg) { + if (pm_reg == L_PF3) { + UBYTE tmp = k > 2 ? screendata >> 4 : screendata & 0xf; +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[tmp | GTIA_COLPF3]); +#else + WRITE_VIDEO(ptr, tmp | ((UWORD)tmp << 8) | ANTIC_cl[C_PF3]); +#endif + } + else { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + ptr++; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +static void draw_antic_f_gtia10(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ +#ifdef WORDS_UNALIGNED_OK + ULONG lookup_gtia10[16]; +#else + UWORD lookup_gtia10[16]; +#endif + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_f(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia10(t_pm_scanline_ptr); + return; + } +#ifdef WORDS_UNALIGNED_OK + lookup_gtia10[0] = ANTIC_cl[C_PM0] | (ANTIC_cl[C_PM0] << 16); + lookup_gtia10[1] = ANTIC_cl[C_PM1] | (ANTIC_cl[C_PM1] << 16); + lookup_gtia10[2] = ANTIC_cl[C_PM2] | (ANTIC_cl[C_PM2] << 16); + lookup_gtia10[3] = ANTIC_cl[C_PM3] | (ANTIC_cl[C_PM3] << 16); + lookup_gtia10[12] = lookup_gtia10[4] = ANTIC_cl[C_PF0] | (ANTIC_cl[C_PF0] << 16); + lookup_gtia10[13] = lookup_gtia10[5] = ANTIC_cl[C_PF1] | (ANTIC_cl[C_PF1] << 16); + lookup_gtia10[14] = lookup_gtia10[6] = ANTIC_cl[C_PF2] | (ANTIC_cl[C_PF2] << 16); + lookup_gtia10[15] = lookup_gtia10[7] = ANTIC_cl[C_PF3] | (ANTIC_cl[C_PF3] << 16); + lookup_gtia10[8] = lookup_gtia10[9] = lookup_gtia10[10] = lookup_gtia10[11] = ANTIC_lookup_gtia9[0]; +#else + lookup_gtia10[0] = ANTIC_cl[C_PM0]; + lookup_gtia10[1] = ANTIC_cl[C_PM1]; + lookup_gtia10[2] = ANTIC_cl[C_PM2]; + lookup_gtia10[3] = ANTIC_cl[C_PM3]; + lookup_gtia10[12] = lookup_gtia10[4] = ANTIC_cl[C_PF0]; + lookup_gtia10[13] = lookup_gtia10[5] = ANTIC_cl[C_PF1]; + lookup_gtia10[14] = lookup_gtia10[6] = ANTIC_cl[C_PF2]; + lookup_gtia10[15] = lookup_gtia10[7] = ANTIC_cl[C_PF3]; + lookup_gtia10[8] = lookup_gtia10[9] = lookup_gtia10[10] = lookup_gtia10[11] = ANTIC_cl[C_BAK]; +#endif + ptr++; + t_pm_scanline_ptr = (const ULONG *) (((const UBYTE *) t_pm_scanline_ptr) + 1); + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + DO_GTIA_BYTE(ptr, lookup_gtia10, screendata) + ptr += 4; + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + UBYTE t_screendata = screendata >> 4; + do { + colreg = gtia_10_lookup[t_screendata]; + PF_COLLS(colreg) |= pm_pixel = *c_pm_scanline_ptr++; /*playfield colours can generate collisions*/ + pm_pixel |= gtia_10_pm[t_screendata]; /*but player colours don't*/ + WRITE_VIDEO(ptr++, COLOUR(pm_lookup_ptr[pm_pixel] | colreg)); /*although they mix with the real players*/ + if (k == 3) + t_screendata = screendata & 0x0f; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border_gtia10(); +} + +static void draw_antic_f_gtia11(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + if ((unsigned long) ptr & 2) { /* HSCROL & 1 */ + prepare_an_antic_f(nchars, antic_memptr, t_pm_scanline_ptr); + draw_an_gtia11(t_pm_scanline_ptr); + return; + } + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + WRITE_VIDEO_LONG((ULONG *) ptr, ANTIC_lookup_gtia11[screendata >> 4]); + WRITE_VIDEO_LONG((ULONG *) ptr + 1, ANTIC_lookup_gtia11[screendata & 0xf]); + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) + ptr += 4; + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int k = 4; + UBYTE pm_reg; + do { + pm_reg = pm_lookup_ptr[*c_pm_scanline_ptr++]; + if (pm_reg) { + if (pm_reg == L_PF3) { + UBYTE tmp = k > 2 ? screendata & 0xf0 : screendata << 4; +#ifdef USE_COLOUR_TRANSLATION_TABLE + WRITE_VIDEO(ptr, colour_translation_table[tmp ? tmp | GTIA_COLPF3 : GTIA_COLPF3 & 0xf0]); +#else + WRITE_VIDEO(ptr, tmp ? tmp | ((UWORD)tmp << 8) | ANTIC_cl[C_PF3] : ANTIC_cl[C_PF3] & 0xf0f0); +#endif + } + else + { + WRITE_VIDEO(ptr, COLOUR(pm_reg)); + } + } + ptr++; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border_gtia11(); +} + +/* GTIA-switch-to-mode-00 bug +If while drawing line in hi-res mode PRIOR is changed from 0x40..0xff to +0x00..0x3f, GTIA doesn't back to hi-res, but starts generating mode similar +to ANTIC's 0xe, but with colours PF0, PF1, PF2, PF3. */ + +/* Technical explaination by perrym: + * in gtia.pdf there is a flip-flop at page 40, drawing location C3 with + * what looks like W and A on the gates + * This is set by AN2=0 AN1=1 AN0=1 durning HBLANK + * The middle input to the lower NOR gate is the inverted signal !NRM(?) + * (NRM means NORMAL?) which arrives from the top left of the page. + * This signal is defined on page 38, positions C2/B2 + * where there is a NOR gate pointing downwards with 00 written to the + * right of its output. + * !NRM is the condition that PRIOR is not set to b7=0,b6=0. + * When PRIOR is not set to NRM, the flip-flip is always reset, + * which seems necessary for the proper operation of the GTIA modes. + * If PRIOR is reset to NRM then the flip-flop remains reset, and + * since ANTIC data in hi-res modes is sent as PF0-PF3, this data is used + * by GTIA directly.*/ + +static void draw_antic_f_gtia_bug(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + lookup2[0x00] = ANTIC_cl[C_PF0]; + lookup2[0x40] = lookup2[0x10] = lookup2[0x04] = lookup2[0x01] = ANTIC_cl[C_PF1]; + lookup2[0x80] = lookup2[0x20] = lookup2[0x08] = lookup2[0x02] = ANTIC_cl[C_PF2]; + lookup2[0xc0] = lookup2[0x30] = lookup2[0x0c] = lookup2[0x03] = ANTIC_cl[C_PF3]; + + CHAR_LOOP_BEGIN + UBYTE screendata = *antic_memptr++; + if (IS_ZERO_ULONG(t_pm_scanline_ptr)) { + WRITE_VIDEO(ptr++, lookup2[screendata & 0xc0]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x30]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x0c]); + WRITE_VIDEO(ptr++, lookup2[screendata & 0x03]); + } + else { + const UBYTE *c_pm_scanline_ptr = (const UBYTE *) t_pm_scanline_ptr; + int pm_pixel; + int colreg; + int k = 4; + do { + colreg = (playfield_lookup + 0x40)[screendata & 0xc0]; + DO_PMG_LORES + screendata <<= 2; + } while (--k); + } + t_pm_scanline_ptr++; + CHAR_LOOP_END + do_border(); +} + +/* pointer to a function that draws a single line of graphics */ +typedef void (*draw_antic_function)(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr); + +/* tables for all GTIA and ANTIC modes */ +static draw_antic_function draw_antic_table[4][16] = { +/* normal */ + { NULL, NULL, draw_antic_2, draw_antic_2, + draw_antic_4, draw_antic_4, draw_antic_6, draw_antic_6, + draw_antic_8, draw_antic_9, draw_antic_a, draw_antic_c, + draw_antic_c, draw_antic_e, draw_antic_e, draw_antic_f}, +/* GTIA 9 */ + { NULL, NULL, draw_antic_2_gtia9, draw_antic_2_gtia9, + draw_antic_4_gtia9, draw_antic_4_gtia9, draw_antic_6_gtia9, draw_antic_6_gtia9, + draw_antic_8_gtia9, draw_antic_9_gtia9, draw_antic_a_gtia9, draw_antic_9_gtia9, + draw_antic_9_gtia9, draw_antic_e_gtia9, draw_antic_e_gtia9, draw_antic_f_gtia9}, +/* GTIA 10 */ + { NULL, NULL, draw_antic_2_gtia10, draw_antic_2_gtia10, + draw_antic_4_gtia10, draw_antic_4_gtia10, draw_antic_6_gtia10, draw_antic_6_gtia10, + draw_antic_8_gtia10, draw_antic_9_gtia10, draw_antic_a_gtia10, draw_antic_9_gtia10, + draw_antic_9_gtia10, draw_antic_e_gtia10, draw_antic_e_gtia10, draw_antic_f_gtia10}, +/* GTIA 11 */ + { NULL, NULL, draw_antic_2_gtia11, draw_antic_2_gtia11, + draw_antic_4_gtia11, draw_antic_4_gtia11, draw_antic_6_gtia11, draw_antic_6_gtia11, + draw_antic_8_gtia11, draw_antic_9_gtia11, draw_antic_a_gtia11, draw_antic_9_gtia11, + draw_antic_9_gtia11, draw_antic_e_gtia11, draw_antic_e_gtia11, draw_antic_f_gtia11}}; + +/* pointer to current GTIA/ANTIC mode routine */ +static draw_antic_function draw_antic_ptr = draw_antic_8; +#ifdef NEW_CYCLE_EXACT +static draw_antic_function saved_draw_antic_ptr; +#endif +/* pointer to current GTIA mode blank drawing routine */ +static void (*draw_antic_0_ptr)(void) = draw_antic_0; + +#ifdef NEW_CYCLE_EXACT +/* wrapper for antic_0, for dmactl bugs */ +static void draw_antic_0_dmactl_bug(int nchars, const UBYTE *antic_memptr, UWORD *ptr, const ULONG *t_pm_scanline_ptr) +{ + draw_antic_0_ptr(); +} +#endif + +/* Artifacting ------------------------------------------------------------ */ + +void ANTIC_UpdateArtifacting(void) +{ +#define ART_BROWN 0 +#define ART_BLUE 1 +#define ART_DARK_BROWN 2 +#define ART_DARK_BLUE 3 +#define ART_BRIGHT_BROWN 4 +#define ART_BRIGHT_BLUE 5 +#define ART_RED 6 +#define ART_GREEN 7 + static const UBYTE art_colour_table[4][8] = { + { 0x88, 0x14, 0x88, 0x14, 0x8f, 0x1f, 0xbb, 0x5f }, /* brownblue */ + { 0x14, 0x88, 0x14, 0x88, 0x1f, 0x8f, 0x5f, 0xbb }, /* bluebrown */ + { 0xd6, 0x46, 0xd6, 0x46, 0xdf, 0x4a, 0x4f, 0xac }, /* redgreen */ + { 0x46, 0xd6, 0x46, 0xd6, 0x4a, 0xdf, 0xac, 0x4f } /* greenred */ + }; + + int i; + int j; + int c; + const UBYTE *art_colours; + UBYTE q; + UBYTE art_white; + + if (ANTIC_artif_mode == 0) { + draw_antic_table[0][2] = draw_antic_table[0][3] = draw_antic_2; + draw_antic_table[0][0xf] = draw_antic_f; + return; + } + +#ifndef USE_COLOUR_TRANSLATION_TABLE + if (ANTIC_artif_new) { + static UWORD new_art_colour_table[4][2] = { + {0x4040, 0x8080}, + {0x8080, 0x4040}, + {0x8080, 0xd0d0}, + {0xd0d0, 0x8080} + }; + draw_antic_table[0][2] = draw_antic_table[0][3] = draw_antic_2_artif_new; + draw_antic_table[0][0xf] = draw_antic_f_artif_new; + art_colour1_new = new_art_colour_table[ANTIC_artif_mode - 1][0]; + art_colour2_new = new_art_colour_table[ANTIC_artif_mode - 1][1]; + } + else +#endif + { + draw_antic_table[0][2] = draw_antic_table[0][3] = draw_antic_2_artif; + draw_antic_table[0][0xf] = draw_antic_f_artif; + } + + art_colours = (ANTIC_artif_mode <= 4 ? art_colour_table[ANTIC_artif_mode - 1] : art_colour_table[2]); + + art_reverse_colpf1_save = art_normal_colpf1_save = ANTIC_cl[C_PF1] & 0x0f0f; + art_reverse_colpf2_save = art_normal_colpf2_save = ANTIC_cl[C_PF2]; + art_white = (ANTIC_cl[C_PF2] & 0xf0) | (ANTIC_cl[C_PF1] & 0x0f); + + for (i = 0; i <= 255; i++) { + art_bkmask_normal[i] = 0; + art_lummask_normal[i] = 0; + art_bkmask_reverse[255 - i] = 0; + art_lummask_reverse[255 - i] = 0; + + for (j = 0; j <= 3; j++) { + q = i << j; + if (!(q & 0x20)) { + if ((q & 0xf8) == 0x50) + c = ART_BLUE; /* 01010 */ + else if ((q & 0xf8) == 0xD8) + c = ART_DARK_BLUE; /* 11011 */ + else { /* xx0xx */ + ((UBYTE *) art_lookup_normal)[(i << 2) + j] = GTIA_COLPF2; + ((UBYTE *) art_lookup_reverse)[((255 - i) << 2) + j] = art_white; + ((UBYTE *) art_bkmask_normal)[(i << 2) + j] = 0xff; + ((UBYTE *) art_lummask_reverse)[((255 - i) << 2) + j] = 0x0f; + ((UBYTE *) art_bkmask_reverse)[((255 - i) << 2) + j] = 0xf0; + continue; + } + } + else if (q & 0x40) { + if (q & 0x10) + goto colpf1_pixel; /* x111x */ + else if (q & 0x80) { + if (q & 0x08) + c = ART_BRIGHT_BROWN; /* 11101 */ + else + goto colpf1_pixel; /* 11100 */ + } + else + c = ART_GREEN; /* 0110x */ + } + else if (q & 0x10) { + if (q & 0x08) { + if (q & 0x80) + c = ART_BRIGHT_BROWN; /* 00111 */ + else + goto colpf1_pixel; /* 10111 */ + } + else + c = ART_RED; /* x0110 */ + } + else + c = ART_BROWN; /* x010x */ + + ((UBYTE *) art_lookup_reverse)[((255 - i) << 2) + j] = + ((UBYTE *) art_lookup_normal)[(i << 2) + j] = art_colours[(j & 1) ^ c]; + continue; + + colpf1_pixel: + ((UBYTE *) art_lookup_normal)[(i << 2) + j] = art_white; + ((UBYTE *) art_lookup_reverse)[((255 - i) << 2) + j] = GTIA_COLPF2; + ((UBYTE *) art_bkmask_reverse)[((255 - i) << 2) + j] = 0xff; + ((UBYTE *) art_lummask_normal)[(i << 2) + j] = 0x0f; + ((UBYTE *) art_bkmask_normal)[(i << 2) + j] = 0xf0; + } + } +} + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + +/* Display List ------------------------------------------------------------ */ + +UBYTE ANTIC_GetDLByte(UWORD *paddr) +{ + int addr = *paddr; + UBYTE result; + if (ANTIC_xe_ptr != NULL && addr < 0x8000 && addr >= 0x4000) + result = ANTIC_xe_ptr[addr - 0x4000]; + else + result = MEMORY_GetByte((UWORD) addr); + addr++; + if ((addr & 0x3FF) == 0) + addr -= 0x400; + *paddr = (UWORD) addr; + return result; +} + +UWORD ANTIC_GetDLWord(UWORD *paddr) +{ + UBYTE lsb = ANTIC_GetDLByte(paddr); +#if !defined(BASIC) && !defined(CURSES_BASIC) + if (ANTIC_player_flickering && ((GTIA_VDELAY & 0x80) == 0 || ANTIC_ypos & 1)) + GTIA_GRAFP3 = lsb; +#endif + return (ANTIC_GetDLByte(paddr) << 8) + lsb; +} + +#if !defined(BASIC) && !defined(CURSES_BASIC) + +/* Real ANTIC doesn't fetch beginning bytes in HSC + nor screen+47 in wide playfield. This function does. */ +static void antic_load(void) +{ +#ifdef PAGED_MEM + UBYTE *antic_memptr = antic_memory + ANTIC_margin; + UWORD new_screenaddr = screenaddr + chars_read[md]; + if ((screenaddr ^ new_screenaddr) & 0xf000) { + do + *antic_memptr++ = MEMORY_dGetByte(screenaddr++); + while (screenaddr & 0xfff); + screenaddr -= 0x1000; + new_screenaddr -= 0x1000; + } + while (screenaddr < new_screenaddr) + *antic_memptr++ = MEMORY_dGetByte(screenaddr++); +#else + UWORD new_screenaddr = screenaddr + chars_read[md]; + if ((screenaddr ^ new_screenaddr) & 0xf000) { + int bytes = (-screenaddr) & 0xfff; + if (ANTIC_xe_ptr != NULL && screenaddr < 0x8000 && screenaddr >= 0x4000) { + memcpy(antic_memory + ANTIC_margin, ANTIC_xe_ptr + (screenaddr - 0x4000), bytes); + if (new_screenaddr & 0xfff) + memcpy(antic_memory + ANTIC_margin + bytes, ANTIC_xe_ptr + (screenaddr + bytes - 0x5000), new_screenaddr & 0xfff); + } + else if ((screenaddr & 0xf000) == 0xd000) { + MEMORY_CopyFromMem(screenaddr, antic_memory + ANTIC_margin, bytes); + if (new_screenaddr & 0xfff) + MEMORY_CopyFromMem((UWORD) (screenaddr + bytes - 0x1000), antic_memory + ANTIC_margin + bytes, new_screenaddr & 0xfff); + } + else { + MEMORY_dCopyFromMem(screenaddr, antic_memory + ANTIC_margin, bytes); + if (new_screenaddr & 0xfff) + MEMORY_dCopyFromMem(screenaddr + bytes - 0x1000, antic_memory + ANTIC_margin + bytes, new_screenaddr & 0xfff); + } + screenaddr = new_screenaddr - 0x1000; + } + else { + if (ANTIC_xe_ptr != NULL && screenaddr < 0x8000 && screenaddr >= 0x4000) + memcpy(antic_memory + ANTIC_margin, ANTIC_xe_ptr + (screenaddr - 0x4000), chars_read[md]); + else if ((screenaddr & 0xf000) == 0xd000) + MEMORY_CopyFromMem(screenaddr, antic_memory + ANTIC_margin, chars_read[md]); + else + MEMORY_dCopyFromMem(screenaddr, antic_memory + ANTIC_margin, chars_read[md]); + screenaddr = new_screenaddr; + } +#endif +} + +#ifdef NEW_CYCLE_EXACT +int ANTIC_cur_screen_pos = ANTIC_NOT_DRAWING; +#endif + +#ifdef USE_CURSES +static int scanlines_to_curses_display = 0; +#endif + +/* This function emulates one frame drawing screen at Screen_atari */ +void ANTIC_Frame(int draw_display) +{ + static const UBYTE mode_type[32] = { + NORMAL0, NORMAL0, NORMAL0, NORMAL0, NORMAL0, NORMAL0, NORMAL1, NORMAL1, + NORMAL2, NORMAL2, NORMAL1, NORMAL1, NORMAL1, NORMAL0, NORMAL0, NORMAL0, + SCROLL0, SCROLL0, SCROLL0, SCROLL0, SCROLL0, SCROLL0, SCROLL1, SCROLL1, + SCROLL2, SCROLL2, SCROLL1, SCROLL1, SCROLL1, SCROLL0, SCROLL0, SCROLL0 + }; + static const UBYTE normal_lastline[16] = + { 0, 0, 7, 9, 7, 15, 7, 15, 7, 3, 3, 1, 0, 1, 0, 0 }; + UBYTE vscrol_flag = FALSE; + UBYTE no_jvb = TRUE; +#ifndef NEW_CYCLE_EXACT + UBYTE need_load; +#endif + +#ifdef NEW_CYCLE_EXACT + int cpu2antic_index; +#endif /* NEW_CYCLE_EXACT */ + + ANTIC_ypos = 0; + do { + POKEY_Scanline(); /* check and generate IRQ */ + OVERSCREEN_LINE; + } while (ANTIC_ypos < 8); + + scrn_ptr = (UWORD *) Screen_atari; +#ifdef NEW_CYCLE_EXACT + ANTIC_cur_screen_pos = ANTIC_NOT_DRAWING; +#endif + need_dl = TRUE; + do { + if ((INPUT_mouse_mode == INPUT_MOUSE_PEN || INPUT_mouse_mode == INPUT_MOUSE_GUN) && (ANTIC_ypos >> 1 == ANTIC_PENV_input)) { + PENH = ANTIC_PENH_input; + PENV = ANTIC_PENV_input; + if (GTIA_GRACTL & 4) + GTIA_TRIG_latch[INPUT_mouse_port] = 0; + } + + POKEY_Scanline(); /* check and generate IRQ */ + pmg_dma(); + +#ifdef USE_CURSES + if (--scanlines_to_curses_display == 0) + curses_display_line(anticmode, antic_memory + ANTIC_margin); +#endif + + need_load = FALSE; + if (need_dl) { + if (ANTIC_DMACTL & 0x20) { + IR = ANTIC_GetDLByte(&ANTIC_dlist); + anticmode = IR & 0xf; + ANTIC_xpos++; + /* PMG flickering :-) */ + if (ANTIC_missile_flickering) + GTIA_GRAFM = ANTIC_ypos & 1 ? IR : ((GTIA_GRAFM ^ IR) & hold_missiles_tab[GTIA_VDELAY & 0xf]) ^ IR; + if (ANTIC_player_flickering) { + UBYTE hold = ANTIC_ypos & 1 ? 0 : GTIA_VDELAY; + if ((hold & 0x10) == 0) + GTIA_GRAFP0 = MEMORY_dGetByte((UWORD) (CPU_regPC - ANTIC_xpos + 8)); + if ((hold & 0x20) == 0) + GTIA_GRAFP1 = MEMORY_dGetByte((UWORD) (CPU_regPC - ANTIC_xpos + 9)); + if ((hold & 0x40) == 0) + GTIA_GRAFP2 = MEMORY_dGetByte((UWORD) (CPU_regPC - ANTIC_xpos + 10)); + if ((hold & 0x80) == 0) + GTIA_GRAFP3 = MEMORY_dGetByte((UWORD) (CPU_regPC - ANTIC_xpos + 11)); + } + } + else + IR &= 0x7f; /* repeat last instruction, but don't generate DLI */ + + dctr = 0; + need_dl = FALSE; + vscrol_off = FALSE; + + switch (anticmode) { + case 0x00: + lastline = (IR >> 4) & 7; + if (vscrol_flag) { + lastline = ANTIC_VSCROL; + vscrol_flag = FALSE; + vscrol_off = TRUE; + } + break; + case 0x01: + lastline = 0; + if (IR & 0x40 && ANTIC_DMACTL & 0x20) { + ANTIC_dlist = ANTIC_GetDLWord(&ANTIC_dlist); + ANTIC_xpos += 2; + no_jvb = FALSE; + } + else + if (vscrol_flag) { + lastline = ANTIC_VSCROL; + vscrol_flag = FALSE; + vscrol_off = TRUE; + } + break; + default: + lastline = normal_lastline[anticmode]; + if (IR & 0x20) { + if (!vscrol_flag) { + CPU_GO(VSCON_C); + dctr = ANTIC_VSCROL; + vscrol_flag = TRUE; + } + } + else if (vscrol_flag) { + lastline = ANTIC_VSCROL; + vscrol_flag = FALSE; + vscrol_off = TRUE; + } + if (IR & 0x40 && ANTIC_DMACTL & 0x20) { + screenaddr = ANTIC_GetDLWord(&ANTIC_dlist); + ANTIC_xpos += 2; + } + md = mode_type[IR & 0x1f]; + need_load = TRUE; + draw_antic_ptr = draw_antic_table[GTIA_PRIOR >> 6][anticmode]; + break; + } + } +#ifdef NEW_CYCLE_EXACT + cpu2antic_index = 0; + if (anticmode < 2 || (ANTIC_DMACTL & 3) == 0 || + (anticmode >= 8 && !need_load)) { + cpu2antic_index = 0; + } + else { +/* TODO: use a cleaner lookup table here */ + if (!(IR & 0x10) && ((ANTIC_DMACTL & 3) == 1)) + cpu2antic_index = 1; + else if ((!(IR &0x10) && ((ANTIC_DMACTL & 3) == 2)) || + ((IR & 0x10) && ((ANTIC_DMACTL & 3) == 1))) { + cpu2antic_index = 2; + } + else + cpu2antic_index = 10; + if (IR & 0x10) { + cpu2antic_index += (ANTIC_HSCROL >> 1); + } + if (anticmode >=2 && anticmode <=7 && !need_load) + cpu2antic_index += 17; + if (anticmode ==6 || anticmode ==7) + cpu2antic_index += 17 * 2; + else if (anticmode==8 || anticmode == 9) + cpu2antic_index += 17 * 6; + else if (anticmode >=0xa && anticmode <=0xc) + cpu2antic_index += 17 * 5; + else if (anticmode >=0x0d) + cpu2antic_index += 17 * 4; + } + ANTIC_cpu2antic_ptr = &CYCLE_MAP_cpu2antic[CYCLE_MAP_SIZE * cpu2antic_index]; + ANTIC_antic2cpu_ptr = &CYCLE_MAP_antic2cpu[CYCLE_MAP_SIZE * cpu2antic_index]; +#endif /* NEW_CYCLE_EXACT */ + + if ((IR & 0x4f) == 1 && (ANTIC_DMACTL & 0x20)) { + ANTIC_dlist = ANTIC_GetDLWord(&ANTIC_dlist); + ANTIC_xpos += 2; + } + +#ifdef NEW_CYCLE_EXACT + /* begin drawing here */ + if (draw_display) { + ANTIC_cur_screen_pos = LBORDER_START; + ANTIC_xpos = ANTIC_antic2cpu_ptr[ANTIC_xpos]; /* convert antic to cpu(need for WSYNC) */ + if (dctr == lastline) { + if (no_jvb) + need_dl = TRUE; + if (IR & 0x80) { + CPU_GO(ANTIC_antic2cpu_ptr[ANTIC_NMIST_C]); + ANTIC_NMIST = 0x9f; + if (ANTIC_NMIEN & 0x80) { + CPU_GO(ANTIC_antic2cpu_ptr[ANTIC_NMI_C]); + CPU_NMI(); + } + } + } + } + else /* force this to be within an else if NEW_CYCLE_EXACT */ +#endif /* NEW_CYCLE_EXACT */ + if (dctr == lastline) { + if (no_jvb) + need_dl = TRUE; + if (IR & 0x80) { + CPU_GO(ANTIC_NMIST_C); + ANTIC_NMIST = 0x9f; + if (ANTIC_NMIEN & 0x80) { + CPU_GO(ANTIC_NMI_C); + CPU_NMI(); + } + } + } + if (!draw_display) { + ANTIC_xpos += ANTIC_DMAR; + if (anticmode < 2 || (ANTIC_DMACTL & 3) == 0) { + GOEOL; + if (no_jvb) { + dctr++; + dctr &= 0xf; + } + continue; + } + if (need_load) { + ANTIC_xpos += load_cycles[md]; + if (anticmode <= 5) /* extra cycles in font modes */ + ANTIC_xpos += before_cycles[md] - extra_cycles[md]; + } + if (anticmode < 8) + ANTIC_xpos += font_cycles[md]; + GOEOL; + dctr++; + dctr &= 0xf; + continue; + } +#ifndef NO_YPOS_BREAK_FLICKER +#define YPOS_BREAK_FLICKER do{if (ANTIC_ypos == ANTIC_break_ypos - 1000) {\ + static int toggle;\ + if (toggle == 1) {\ + FILL_VIDEO(scrn_ptr + LBORDER_START, 0x0f0f, (RBORDER_END - LBORDER_START) * 2);\ + }\ + toggle = !toggle;\ + }}while(0) +#else +#define YPOS_BREAK_FLICKER do{}while(0) +#endif /* NO_YPOS_BREAK_FLICKER */ + +#ifdef NEW_CYCLE_EXACT + GTIA_NewPmScanline(); + if (anticmode < 2 || (ANTIC_DMACTL & 3) == 0) { + GOEOL_CYCLE_EXACT; + draw_partial_scanline(ANTIC_cur_screen_pos, RBORDER_END); + UPDATE_DMACTL; + UPDATE_GTIA_BUG; + ANTIC_cur_screen_pos = ANTIC_NOT_DRAWING; + YPOS_BREAK_FLICKER; + scrn_ptr += Screen_WIDTH / 2; + if (no_jvb) { + dctr++; + dctr &= 0xf; + } + continue; + } + + GOEOL_CYCLE_EXACT; + draw_partial_scanline(ANTIC_cur_screen_pos, RBORDER_END); + UPDATE_DMACTL; + UPDATE_GTIA_BUG; + ANTIC_cur_screen_pos = ANTIC_NOT_DRAWING; + +#else /* NEW_CYCLE_EXACT not defined */ + if (need_load && anticmode <= 5 && ANTIC_DMACTL & 3) + ANTIC_xpos += before_cycles[md]; + + CPU_GO(SCR_C); + GTIA_NewPmScanline(); + + ANTIC_xpos += ANTIC_DMAR; + + if (anticmode < 2 || (ANTIC_DMACTL & 3) == 0) { + draw_antic_0_ptr(); + GOEOL; + YPOS_BREAK_FLICKER; + scrn_ptr += Screen_WIDTH / 2; + if (no_jvb) { + dctr++; + dctr &= 0xf; + } + continue; + } + + if (need_load) { + antic_load(); +#ifdef USE_CURSES + /* Normally, we would call curses_display_line here, + and not use scanlines_to_curses_display at all. + That would however cause incorrect color of the "MEMORY" + menu item in Self Test - it isn't set properly + in the first scanline. We therefore postpone + curses_display_line call to the next scanline. */ + scanlines_to_curses_display = 1; +#endif + ANTIC_xpos += load_cycles[md]; + if (anticmode <= 5) /* extra cycles in font modes */ + ANTIC_xpos -= extra_cycles[md]; + } + + draw_antic_ptr(chars_displayed[md], + antic_memory + ANTIC_margin + ch_offset[md], + scrn_ptr + x_min[md], + (ULONG *) >IA_pm_scanline[x_min[md]]); + + GOEOL; +#endif /* NEW_CYCLE_EXACT */ + YPOS_BREAK_FLICKER; + scrn_ptr += Screen_WIDTH / 2; + dctr++; + dctr &= 0xf; + } while (ANTIC_ypos < (Screen_HEIGHT + 8)); + +#ifndef NO_SIMPLE_PAL_BLENDING + /* Simple PAL blending, using only the base 256 color palette. */ + if (ANTIC_pal_blending) + { + int ypos = ANTIC_ypos - 1; + /* Start at the last screen line (248). */ + ULONG *ptr = (ULONG *) (scrn_ptr - 4 * RCHOP); + do { + int k = 2 * (48 - LCHOP - RCHOP); + do { + /* For each grayscale pixel (colors $00..$0f) blend it with + chrominance of a pixel from the previous line. */ + ULONG pix = READ_VIDEO_LONG(--ptr); + ULONG mask = 0xf0f0f0f0; + /* Take advantage of the fact that chrominance can change only + every two pixels. This way we may test only two pixels in a + quadruplet instead of four. */ + if (pix & 0x0000f0f0) + /* Two LSBs are non-grayscale */ + mask &= 0xf0f00000; + if (pix & 0xf0f00000) + /* Two MSBs are non-grayscale */ + mask &= 0x0000f0f0; + + WRITE_VIDEO_LONG(ptr, (READ_VIDEO_LONG(ptr - Screen_WIDTH / 4) & mask) | pix); + } while (--k); + ptr -= 2 * (LCHOP + RCHOP); /* Move one line up */ + } while (--ypos > 8); /* Stop after line 9 */ + } +#endif /* NO_SIMPLE_PAL_BLENDING */ + +/* TODO: cycle-exact overscreen lines */ + POKEY_Scanline(); /* check and generate IRQ */ + CPU_GO(ANTIC_NMIST_C); + ANTIC_NMIST = 0x5f; /* Set VBLANK */ + if (ANTIC_NMIEN & 0x40) { + CPU_GO(ANTIC_NMI_C); + CPU_NMI(); + } + ANTIC_xpos += ANTIC_DMAR; + GOEOL; + + do { + POKEY_Scanline(); /* check and generate IRQ */ + OVERSCREEN_LINE; + } while (ANTIC_ypos < Atari800_tv_mode); + ANTIC_ypos = 0; /* just for monitor.c */ +} + +#ifdef NEW_CYCLE_EXACT + +/* update the scanline from the last changed position to the current +position, when a change was made to a display register during drawing */ +void ANTIC_UpdateScanline(void) +{ + int actual_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; + int newpos = actual_xpos * 2 - 37; + draw_partial_scanline(ANTIC_cur_screen_pos, newpos); + ANTIC_cur_screen_pos = newpos; +} + +/* prior needs a different adjustment and could generate small glitches +between mode changes */ +/* TODO: support glitches between mode changes (tiny areas that are neither +the new mode nor the old mode, which occur between mode changes */ +void ANTIC_UpdateScanlinePrior(UBYTE byte) +{ + int actual_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; + int prior_mode_adj = 2; + int newpos; + newpos = actual_xpos * 2 - 37 + prior_mode_adj; + draw_partial_scanline(ANTIC_cur_screen_pos, newpos); + ANTIC_cur_screen_pos = newpos; +} + +/* chbase needs a different adjustment */ +void update_scanline_chbase(void) +{ + int actual_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; + int hscrol_adj = (IR & 0x10) ? ANTIC_HSCROL : 0; + int hscrollsb_adj = (hscrol_adj & 1); + int newpos; + int fontfetch_adj; + /* antic fetches character font data every 2 or 4 cycles */ + /* we want to delay the change until the next fetch */ + /* empirically determined: */ + if (anticmode >= 2 && anticmode <= 5) { + fontfetch_adj = (((hscrol_adj >>1) - actual_xpos + 0) & 1) * 2 + 9; + } + else if (anticmode == 6 || anticmode == 7) { + fontfetch_adj = (((hscrol_adj >> 1) - actual_xpos + 2) & 3) * 2 + 9; + } + else { + fontfetch_adj = 0; + } + newpos = actual_xpos * 2 - 37 + hscrollsb_adj + fontfetch_adj; + draw_partial_scanline(ANTIC_cur_screen_pos, newpos); + ANTIC_cur_screen_pos = newpos; +} + +/* chactl invert needs a different adjustment */ +void update_scanline_invert(void) +{ + int actual_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; + int hscrol_adj = (IR & 0x10) ? ANTIC_HSCROL : 0; + int hscrollsb_adj = (hscrol_adj & 1); + int newpos; + + /* empirically determined: adjustment of 4 */ + newpos = actual_xpos * 2 - 37 + hscrollsb_adj + 4; + draw_partial_scanline(ANTIC_cur_screen_pos, newpos); + ANTIC_cur_screen_pos = newpos; +} + +/* chactl blank needs a different adjustment */ +void update_scanline_blank(void) +{ + int actual_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; + int hscrol_adj = (IR & 0x10) ? ANTIC_HSCROL : 0; + int hscrollsb_adj = (hscrol_adj & 1); + int newpos; + + /* empirically determined: adjustment of 7 */ + newpos = actual_xpos * 2 - 37 + hscrollsb_adj + 7; + draw_partial_scanline(ANTIC_cur_screen_pos, newpos); + ANTIC_cur_screen_pos = newpos; +} + +static void set_dmactl_bug(void){ + need_load = FALSE; + saved_draw_antic_ptr = draw_antic_ptr; + draw_antic_ptr_changed = 1; + if (anticmode == 2 || anticmode == 3 || anticmode == 0xf) { + draw_antic_ptr = draw_antic_2_dmactl_bug; + dmactl_bug_chdata = (anticmode == 0xf) ? 0 : antic_memory[ANTIC_margin + chars_read[md] - 1]; + } + else { + draw_antic_ptr = draw_antic_0_dmactl_bug; + } +} + +/* draw a partial scanline between point l and point r */ +/* l is the left hand word, r is the point one past the right-most word to draw */ +void draw_partial_scanline(int l, int r) +{ + /* lborder_chars: save left border chars,we restore it after */ + /* it is the number of 8pixel 'chars' in the left border */ + int lborder_chars = left_border_chars; + + /* rborder_start: save right border start, we restore it after */ + /* it is the start of the right border, in words */ + int rborder_start = right_border_start; + + /* lborder_start: start of the left border, in words */ + int lborder_start = LCHOP * 4; + /* end of the left border, in words */ + int lborder_end = LCHOP * 4 + left_border_chars * 4; + /* end of the right border, in words */ + int rborder_end = (48 - RCHOP) * 4; + /* flag: if true, don't show playfield. used if the partial scanline */ + /* does not include the playfield */ + int dont_display_playfield = 0; + /* offset of the left most drawable 8 pixel pf block */ + /* int l_pfchar = (lborder_end - x_min[md]) / 4; */ + int l_pfchar = 0; + /* offset of the right most drawable 8 pixel pf plock, *plus one* */ + int r_pfchar = 0; + /* buffer to save 0,1,2 or 3 words of the left hand portion of an 8pixel */ + /* 'char' which is going to be erased by the left hand side of the */ + /* left most 8pixel 'char' in the partial scanline and must be saved */ + /* and restored later */ + UWORD sv_buf[4]; + /* buffer to save 0 or 1 (modes 6,7,a,b,c) ,or , (0,1,2 or 3) (modes 8,9) */ + /* 8pixel 'chars' of playfield which is going to be erased by the left */ + /* hand most 8pixel 'char's of the 2(modes 67abc) or 4(modes 89) 8pixel */ + /* 'char'-sized blocks that these modes must draw. */ + UWORD sv_buf2[4 * 4]; /* for modes 6,7,8,9,a,b,c */ + /* start,size of the above buffers */ + int sv_bufstart = 0; + int sv_bufsize = 0; + int sv_bufstart2 = 0; + int sv_bufsize2 = 0; + /* number of 8,16,32pixel chars to draw in the playfield */ + int nchars = 0; + /* adjustment to ch_index , it is the number of 8,16,32pixel chars */ + /* that we do not draw on the left hand side that would usually be drawn */ + /* for this mode */ + int ch_adj = 0; + /* adjustment to x_min to skip over the left side */ + int x_min_adj = 0; + /* it's the offset of the left most drawable 8pixel pfblock which is */ + /* rounded *down* to the nearest factor of (2:mode 67abc,4:mode 89) */ + /* if it is divided by (2:mode 67abc,4:mode 89) it will give the */ + /* offset of the left most drawable (16,32)pixel 'char' */ + int l_pfactual = 0; + /* it is the offset of the right most drawable 8pixel pf block which is */ + /* rounded *up* to the nearest factor of (2,4), *plus one* */ + /* so that r_pfactual-l_pfactual / (2,4) = number of 16,32 pixel 'chars' */ + /* to be drawn */ + int r_pfactual = 0; + /* it is the offset of the 8pixel block aligned with pf which overlaps */ + /* the left border. We need this for modes 6-c, because in these modes */ + /* the code will save 8pixel blocks to the left of l_pfchar and */ + /* >= l_pfactual, which will result in portions of the left border */ + /* being saved on some occasions which should not be, unless we */ + /* use this variable to alter the number of chars saved */ + /* int l_borderpfchar=0; */ + + r_pfchar = chars_displayed[md]; + if (md == NORMAL1 || md == SCROLL1) { /* modes 6,7,a,b,c */ + r_pfchar *= 2; + } + else if (md == NORMAL2 || md == SCROLL2) { /* modes 8,9 */ + r_pfchar *= 4; + } + if (anticmode < 2 || (ANTIC_DMACTL & 3) == 0) { + lborder_end = rborder_end; + dont_display_playfield = 1; + } + if (l > rborder_end) + l = rborder_end; + if (r > rborder_end) + r = rborder_end; + if (l < lborder_start) + l = lborder_start; + if (r < lborder_start) + r = lborder_start; + if (l >= r) + return; + if (l < lborder_end) { + /* left point is within left border */ + sv_bufstart = (l & (~3)); /* high order bits give buffer start */ + sv_bufsize = l - sv_bufstart; + left_border_start = sv_bufstart; + left_border_chars = lborder_chars - (sv_bufstart - lborder_start) / 4; + if (l > x_min[md]) { + /* special case for modes 56789abc */ + /* position buffer within the reference frame */ + /* of the playfield if that */ + /* results in more pixels being saved in the buffer */ + /* needed because for modes 5789abc the overlapping part */ + /* can be more than 1 8pixel char and we only save the left */ + /* hand most 8pixel chars in the code in the later section */ + /* further down, so there is a possibility that the 8pixels */ + /* which are saved within the reference frame of the border */ + /* are not enough to ensure that everything gets saved */ + l_pfchar = (l - x_min[md]) / 4; + if (((l - x_min[md]) & 3) > sv_bufsize) { + sv_bufsize = ((l - x_min[md]) & 3); + sv_bufstart = l - sv_bufsize; + } + } + } + else if (l >= rborder_start) { + sv_bufstart = (l & (~3)); /* high order bits give buffer start */ + sv_bufsize = l - sv_bufstart; + right_border_start = sv_bufstart; + dont_display_playfield = 1; /* don't display the playfield */ + } + else { /*within screen */ + sv_bufsize = ((l - x_min[md]) & 3); /* low bits have buf size */ + sv_bufstart = l - sv_bufsize; /* difference gives start */ + l_pfchar = (sv_bufstart - x_min[md]) / 4; + left_border_chars = 0; /* don't display left border */ + } + memcpy(sv_buf, scrn_ptr + sv_bufstart, sv_bufsize * sizeof(UWORD)); /* save part of screen */ + + if (r <= lborder_end) { + /* right_end_char = (r + 3) / 4; */ + left_border_chars = (r + 3) / 4 - sv_bufstart / 4; + /* everything must be within the left border */ + dont_display_playfield = 1; /* don't display the playfield */ + } + else { /* right point is past start of playfield */ + /* now load ANTIC data: needed for ANTIC glitches */ + if (need_load) { + antic_load(); +#ifdef USE_CURSES + /* Normally, we would call curses_display_line here, + and not use scanlines_to_curses_display at all. + That would however cause incorrect color of the "MEMORY" + menu item in Self Test - it isn't set properly + in the first scanline. We therefore postpone + curses_display_line call to the next scanline. */ + scanlines_to_curses_display = 1; +#endif + need_load = FALSE; + } + + if (r > rborder_start) { + right_border_end = ((r + 3) & (~3)); /* round up to nearest 8pixel */ + } + else { + r_pfchar = (r - x_min[md] + 3) / 4; /* round up to nearest 8pixel */ + } + } + if (dont_display_playfield) { + nchars = 0; + x_min_adj = 0; + ch_adj = 0; + } + else if (md == NORMAL1 || md == SCROLL1) { /* modes 6,7,a,b,c */ + l_pfactual = (l_pfchar & (~1)); /* round down to nearest 16pixel */ + sv_bufsize2 = (l_pfchar - l_pfactual) * 4; + sv_bufstart2 = x_min[md] + l_pfactual * 4; + r_pfactual = ((r_pfchar + 1) & (~1)); /* round up to nearest 16pixel */ + nchars = (r_pfactual - l_pfactual) / 2; + x_min_adj = l_pfactual * 4; + ch_adj = l_pfactual / 2; + } + else if (md == NORMAL2 || md == SCROLL2) { /* modes 8,9 */ + l_pfactual = (l_pfchar & (~3)); + sv_bufsize2 = (l_pfchar - l_pfactual) * 4; + sv_bufstart2 = x_min[md] + l_pfactual * 4; + r_pfactual = ((r_pfchar + 3) & (~3)); + nchars = (r_pfactual - l_pfactual) / 4; + x_min_adj = l_pfactual * 4; + ch_adj = l_pfactual / 4; + } + else { + nchars = r_pfchar - l_pfchar; + x_min_adj = l_pfchar * 4; + ch_adj = l_pfchar; + } + memcpy(sv_buf2, scrn_ptr + sv_bufstart2, sv_bufsize2 * sizeof(UWORD)); /* save part of screen */ + + if (dont_display_playfield) { +/* the idea here is to use draw_antic_0_ptr() to draw just the border only, since */ +/* we can't set nchars=0. draw_antic_0_ptr will work if left_border_start and */ +/* right_border_end are set correctly */ + if (anticmode < 2 || (ANTIC_DMACTL & 3) == 0 || r <= lborder_end) { + right_border_end = left_border_start + left_border_chars * 4; + } + else if (l >= rborder_start) { + left_border_start = right_border_start; + } + draw_antic_0_ptr(); + } + else { + draw_antic_ptr(nchars, /* chars_displayed[md], */ + antic_memory + ANTIC_margin + ch_offset[md] + ch_adj, + scrn_ptr + x_min[md] + x_min_adj, + (ULONG *) >IA_pm_scanline[x_min[md] + x_min_adj]); + } + memcpy(scrn_ptr + sv_bufstart2, sv_buf2, sv_bufsize2 * sizeof(UWORD)); /* restore screen */ + memcpy(scrn_ptr + sv_bufstart, sv_buf, sv_bufsize * sizeof(UWORD)); /* restore screen */ + + /* restore border global variables */ + left_border_chars=lborder_chars; + right_border_start=rborder_start; + left_border_start = LCHOP * 4; + right_border_end = (48-RCHOP) *4; +} +#endif /* NEW_CYCLE_EXACT */ + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + +/* ANTIC registers --------------------------------------------------------- */ + +UBYTE ANTIC_GetByte(UWORD addr, int no_side_effects) +{ + switch (addr & 0xf) { + case ANTIC_OFFSET_VCOUNT: + if (ANTIC_XPOS < ANTIC_LINE_C) + return ANTIC_ypos >> 1; + if (ANTIC_ypos + 1 < Atari800_tv_mode) + return (ANTIC_ypos + 1) >> 1; + return 0; + case ANTIC_OFFSET_PENH: + return PENH; + case ANTIC_OFFSET_PENV: + return PENV; + case ANTIC_OFFSET_NMIST: + return ANTIC_NMIST; + default: + return 0xff; + } +} + +#if !defined(BASIC) && !defined(CURSES_BASIC) + +/* GTIA calls it on write to PRIOR */ +void ANTIC_SetPrior(UBYTE byte) +{ + if ((byte ^ GTIA_PRIOR) & 0x0f) { +#ifdef USE_COLOUR_TRANSLATION_TABLE + UBYTE col = 0; + UBYTE col2 = 0; + UBYTE hi; + UBYTE hi2; + if ((byte & 3) == 0) { + col = GTIA_COLPF0; + col2 = GTIA_COLPF1; + } + if ((byte & 0xc) == 0) { + ANTIC_cl[C_PF0 | C_PM0] = colour_translation_table[col | GTIA_COLPM0]; + ANTIC_cl[C_PF0 | C_PM1] = colour_translation_table[col | GTIA_COLPM1]; + ANTIC_cl[C_PF0 | C_PM01] = colour_translation_table[col | GTIA_COLPM0 | GTIA_COLPM1]; + ANTIC_cl[C_PF1 | C_PM0] = colour_translation_table[col2 | GTIA_COLPM0]; + ANTIC_cl[C_PF1 | C_PM1] = colour_translation_table[col2 | GTIA_COLPM1]; + ANTIC_cl[C_PF1 | C_PM01] = colour_translation_table[col2 | GTIA_COLPM0 | GTIA_COLPM1]; + } + else { + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF0 | C_PM1] = ANTIC_cl[C_PF0 | C_PM0] = colour_translation_table[col]; + ANTIC_cl[C_PF1 | C_PM01] = ANTIC_cl[C_PF1 | C_PM1] = ANTIC_cl[C_PF1 | C_PM0] = colour_translation_table[col2]; + } + if (byte & 4) { + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PF2 | C_PM0] = ANTIC_cl[C_PF2]; + ANTIC_cl[C_PF3 | C_PM01] = ANTIC_cl[C_PF3 | C_PM1] = ANTIC_cl[C_PF3 | C_PM0] = ANTIC_cl[C_PF3]; + ANTIC_cl[C_HI2 | C_PM01] = ANTIC_cl[C_HI2 | C_PM1] = ANTIC_cl[C_HI2 | C_PM0] = ANTIC_cl[C_HI2]; + } + else { + ANTIC_cl[C_PF3 | C_PM0] = ANTIC_cl[C_PF2 | C_PM0] = ANTIC_cl[C_PM0]; + ANTIC_cl[C_PF3 | C_PM1] = ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PM1]; + ANTIC_cl[C_PF3 | C_PM01] = ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PM01]; + ANTIC_cl[C_HI2 | C_PM0] = colour_translation_table[(GTIA_COLPM0 & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM1] = colour_translation_table[(GTIA_COLPM1 & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM01] = colour_translation_table[((GTIA_COLPM0 | GTIA_COLPM1) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + } + col = col2 = 0; + hi = hi2 = GTIA_COLPF1 & 0xf; + ANTIC_cl[C_BLACK - C_PF2 + C_HI2] = colour_translation_table[hi]; + if ((byte & 9) == 0) { + col = GTIA_COLPF2; + col2 = GTIA_COLPF3; + hi |= col & 0xf0; + hi2 |= col2 & 0xf0; + } + if ((byte & 6) == 0) { + ANTIC_cl[C_PF2 | C_PM2] = colour_translation_table[col | GTIA_COLPM2]; + ANTIC_cl[C_PF2 | C_PM3] = colour_translation_table[col | GTIA_COLPM3]; + ANTIC_cl[C_PF2 | C_PM23] = colour_translation_table[col | GTIA_COLPM2 | GTIA_COLPM3]; + ANTIC_cl[C_PF3 | C_PM2] = colour_translation_table[col2 | GTIA_COLPM2]; + ANTIC_cl[C_PF3 | C_PM3] = colour_translation_table[col2 | GTIA_COLPM3]; + ANTIC_cl[C_PF3 | C_PM23] = colour_translation_table[col2 | GTIA_COLPM2 | GTIA_COLPM3]; + ANTIC_cl[C_HI2 | C_PM2] = colour_translation_table[hi | (GTIA_COLPM2 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM3] = colour_translation_table[hi | (GTIA_COLPM3 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM23] = colour_translation_table[hi | ((GTIA_COLPM2 | GTIA_COLPM3) & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM25] = colour_translation_table[hi2 | (GTIA_COLPM2 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM35] = colour_translation_table[hi2 | (GTIA_COLPM3 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM235] = colour_translation_table[hi2 | ((GTIA_COLPM2 | GTIA_COLPM3) & 0xf0)]; + } + else { + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF2 | C_PM3] = ANTIC_cl[C_PF2 | C_PM2] = colour_translation_table[col]; + ANTIC_cl[C_PF3 | C_PM23] = ANTIC_cl[C_PF3 | C_PM3] = ANTIC_cl[C_PF3 | C_PM2] = colour_translation_table[col2]; + ANTIC_cl[C_HI2 | C_PM23] = ANTIC_cl[C_HI2 | C_PM3] = ANTIC_cl[C_HI2 | C_PM2] = colour_translation_table[hi]; + } +#else /* USE_COLOUR_TRANSLATION_TABLE */ + UWORD cword = 0; + UWORD cword2 = 0; + if ((byte & 3) == 0) { + cword = ANTIC_cl[C_PF0]; + cword2 = ANTIC_cl[C_PF1]; + } + if ((byte & 0xc) == 0) { + ANTIC_cl[C_PF0 | C_PM0] = cword | ANTIC_cl[C_PM0]; + ANTIC_cl[C_PF0 | C_PM1] = cword | ANTIC_cl[C_PM1]; + ANTIC_cl[C_PF0 | C_PM01] = cword | ANTIC_cl[C_PM01]; + ANTIC_cl[C_PF1 | C_PM0] = cword2 | ANTIC_cl[C_PM0]; + ANTIC_cl[C_PF1 | C_PM1] = cword2 | ANTIC_cl[C_PM1]; + ANTIC_cl[C_PF1 | C_PM01] = cword2 | ANTIC_cl[C_PM01]; + } + else { + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF0 | C_PM1] = ANTIC_cl[C_PF0 | C_PM0] = cword; + ANTIC_cl[C_PF1 | C_PM01] = ANTIC_cl[C_PF1 | C_PM1] = ANTIC_cl[C_PF1 | C_PM0] = cword2; + } + if (byte & 4) { + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PF2 | C_PM0] = ANTIC_cl[C_PF2]; + ANTIC_cl[C_PF3 | C_PM01] = ANTIC_cl[C_PF3 | C_PM1] = ANTIC_cl[C_PF3 | C_PM0] = ANTIC_cl[C_PF3]; + } + else { + ANTIC_cl[C_PF3 | C_PM0] = ANTIC_cl[C_PF2 | C_PM0] = ANTIC_cl[C_PM0]; + ANTIC_cl[C_PF3 | C_PM1] = ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PM1]; + ANTIC_cl[C_PF3 | C_PM01] = ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PM01]; + } + cword = cword2 = 0; + if ((byte & 9) == 0) { + cword = ANTIC_cl[C_PF2]; + cword2 = ANTIC_cl[C_PF3]; + } + if ((byte & 6) == 0) { + ANTIC_cl[C_PF2 | C_PM2] = cword | ANTIC_cl[C_PM2]; + ANTIC_cl[C_PF2 | C_PM3] = cword | ANTIC_cl[C_PM3]; + ANTIC_cl[C_PF2 | C_PM23] = cword | ANTIC_cl[C_PM23]; + ANTIC_cl[C_PF3 | C_PM2] = cword2 | ANTIC_cl[C_PM2]; + ANTIC_cl[C_PF3 | C_PM3] = cword2 | ANTIC_cl[C_PM3]; + ANTIC_cl[C_PF3 | C_PM23] = cword2 | ANTIC_cl[C_PM23]; + } + else { + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF2 | C_PM3] = ANTIC_cl[C_PF2 | C_PM2] = cword; + ANTIC_cl[C_PF3 | C_PM23] = ANTIC_cl[C_PF3 | C_PM3] = ANTIC_cl[C_PF3 | C_PM2] = cword2; + } +#endif /* USE_COLOUR_TRANSLATION_TABLE */ + if (byte & 1) { + ANTIC_cl[C_PF1 | C_PM2] = ANTIC_cl[C_PF0 | C_PM2] = ANTIC_cl[C_PM2]; + ANTIC_cl[C_PF1 | C_PM3] = ANTIC_cl[C_PF0 | C_PM3] = ANTIC_cl[C_PM3]; + ANTIC_cl[C_PF1 | C_PM23] = ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PM23]; + } + else { + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF0 | C_PM3] = ANTIC_cl[C_PF0 | C_PM2] = ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM23] = ANTIC_cl[C_PF1 | C_PM3] = ANTIC_cl[C_PF1 | C_PM2] = ANTIC_cl[C_PF1]; + } + if ((byte & 0xf) == 0xc) { + ANTIC_cl[C_PF0 | C_PM0123] = ANTIC_cl[C_PF0 | C_PM123] = ANTIC_cl[C_PF0 | C_PM023] = ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM0123] = ANTIC_cl[C_PF1 | C_PM123] = ANTIC_cl[C_PF1 | C_PM023] = ANTIC_cl[C_PF1]; + } + else + ANTIC_cl[C_PF0 | C_PM0123] = ANTIC_cl[C_PF0 | C_PM123] = ANTIC_cl[C_PF0 | C_PM023] = + ANTIC_cl[C_PF1 | C_PM0123] = ANTIC_cl[C_PF1 | C_PM123] = ANTIC_cl[C_PF1 | C_PM023] = GTIA_COLOUR_BLACK; + if (byte & 0xf) { + ANTIC_cl[C_PF0 | C_PM25] = ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM25] = ANTIC_cl[C_PF1]; + ANTIC_cl[C_PF3 | C_PM25] = ANTIC_cl[C_PF2 | C_PM25] = ANTIC_cl[C_PM25] = GTIA_COLOUR_BLACK; + } + else { + ANTIC_cl[C_PF0 | C_PM235] = ANTIC_cl[C_PF0 | C_PM35] = ANTIC_cl[C_PF0 | C_PM25] = + ANTIC_cl[C_PF1 | C_PM235] = ANTIC_cl[C_PF1 | C_PM35] = ANTIC_cl[C_PF1 | C_PM25] = ANTIC_cl[C_PF3]; + ANTIC_cl[C_PF3 | C_PM25] = ANTIC_cl[C_PF2 | C_PM25] = ANTIC_cl[C_PM25] = ANTIC_cl[C_PF3 | C_PM2]; + ANTIC_cl[C_PF3 | C_PM35] = ANTIC_cl[C_PF2 | C_PM35] = ANTIC_cl[C_PM35] = ANTIC_cl[C_PF3 | C_PM3]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23]; + } + } + pm_lookup_ptr = pm_lookup_table[prior_to_pm_lookup[byte & 0x3f]]; + draw_antic_0_ptr = byte < 0x80 ? draw_antic_0 : byte < 0xc0 ? draw_antic_0_gtia10 : draw_antic_0_gtia11; + if (byte < 0x40 && (GTIA_PRIOR >= 0x40 || gtia_bug_active) && (anticmode == 2 || anticmode == 3 || anticmode == 0xf) && ANTIC_XPOS >= ((ANTIC_DMACTL & 3) == 3 ? 16 : 18)) { + /* A GTIA Mode was active, and no longer is. An ANTIC hi-res mode is being used. GTIA is no longer set in hi-res mode */ + if (anticmode == 2 || anticmode == 3) draw_antic_ptr = draw_antic_2_gtia_bug; + else if (anticmode == 0xf) draw_antic_ptr = draw_antic_f_gtia_bug; + gtia_bug_active = TRUE; + } + else + draw_antic_ptr = draw_antic_table[byte >> 6][anticmode]; +} + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + +void ANTIC_PutByte(UWORD addr, UBYTE byte) +{ + switch (addr & 0xf) { + case ANTIC_OFFSET_DLISTL: + ANTIC_dlist = (ANTIC_dlist & 0xff00) | byte; + break; + case ANTIC_OFFSET_DLISTH: + ANTIC_dlist = (ANTIC_dlist & 0x00ff) | (byte << 8); + break; + case ANTIC_OFFSET_DMACTL: +/* TODO: make this truly cycle-exact, update cpu2antic and antic2cpu, +add support for wider->narrow glitches including the interesting mode 6 +glitch */ +#ifdef NEW_CYCLE_EXACT + dmactl_changed=0; + /* has DMACTL width changed? */ + if ((byte & 3) != (ANTIC_DMACTL & 3) ){ + /* DMACTL width changed from 0 */ + if ((ANTIC_DMACTL & 3) == 0) { + int glitch_cycle = (3 + 32) - 8*(byte & 3); + int x = ANTIC_XPOS; + if((IR & 0x10) && ((byte & 3) != 3)){ + /*adjust for narrow or std HSCROL*/ + glitch_cycle -= 8; + } + /*ANTIC doesn't fetch and display data if the*/ + /*DMACTL width changes from zero after this */ + /*cycle. Instead, it displays a blank scan */ + /*line for modes other than 23F and for 23F */ + /*it displays a glitched line after the change*/ + if(x >= glitch_cycle){ + if(ANTIC_DRAWING_SCREEN){ + ANTIC_UpdateScanline(); + set_dmactl_bug(); + } + } + else { + if (ANTIC_DRAWING_SCREEN) { + ANTIC_UpdateScanline(); + } + } + } + /* DMACTL width changed to 0 */ + else if ((byte & 3)==0) { + /* TODO: this is not 100% correct */ + if (ANTIC_DRAWING_SCREEN) { + int actual_xpos = ANTIC_cpu2antic_ptr[ANTIC_xpos]; + int antic_limit = ANTIC_cpu2antic_ptr[ANTIC_xpos_limit]; + ANTIC_UpdateScanline(); + /*fix for a minor glitch in fasteddie*/ + /*don't steal cycles after DMACTL off*/ + ANTIC_cpu2antic_ptr = &CYCLE_MAP_cpu2antic[0]; + ANTIC_antic2cpu_ptr = &CYCLE_MAP_antic2cpu[0]; + ANTIC_xpos = ANTIC_antic2cpu_ptr[actual_xpos]; + ANTIC_xpos_limit = ANTIC_antic2cpu_ptr[antic_limit]; + } + /* DMACTL width has changed and not to 0 and not from 0 */ + } + else { + /* DMACTL width has increased and no HSCROL */ + if (((byte & 3) > (ANTIC_DMACTL & 3)) && !(IR & 0x10)) { + int x; /* the change cycle */ + int left_glitch_cycle = 0; + int right_glitch_cycle = 0; + x = ANTIC_XPOS; + if (((ANTIC_DMACTL & 3) == 2) && ((byte & 3) == 3)) { /* Normal->Wide */ + left_glitch_cycle = 11; + right_glitch_cycle = 18; + } + else if (((ANTIC_DMACTL & 3) == 1) && ((byte & 3) == 3)) { /* Narrow->Wide */ + left_glitch_cycle = 11; + right_glitch_cycle = 26; + } + else if (((ANTIC_DMACTL & 3) == 1) && ((byte & 3) == 2)) { /* Narrow->Normal */ + left_glitch_cycle = 19; + right_glitch_cycle = 27; + } + /* change occurs during drawing of line */ + /* delay change till next line */ + if (x > right_glitch_cycle) { + dmactl_changed = 1; + delayed_DMACTL = byte; + break; + /* change occurs during 'glitch' region */ + } + else if (x >= left_glitch_cycle && x <= right_glitch_cycle && anticmode > 1) { + set_dmactl_bug(); + } + } + else { + /* DMACTL width has decreased or HSCROL */ + /* TODO: this is not 100% correct */ + if (ANTIC_DRAWING_SCREEN) { + ANTIC_UpdateScanline(); + } + } + } + } +#endif /* NEW_CYCLE_EXACT */ + ANTIC_DMACTL = byte; +#if defined(BASIC) || defined(CURSES_BASIC) + break; +#else + switch (byte & 0x03) { + case 0x00: + /* no antic_load when screen off */ + /* chars_read[NORMAL0] = 0; + chars_read[NORMAL1] = 0; + chars_read[NORMAL2] = 0; + chars_read[SCROLL0] = 0; + chars_read[SCROLL1] = 0; + chars_read[SCROLL2] = 0; */ + /* no draw_antic_* when screen off */ + /* chars_displayed[NORMAL0] = 0; + chars_displayed[NORMAL1] = 0; + chars_displayed[NORMAL2] = 0; + chars_displayed[SCROLL0] = 0; + chars_displayed[SCROLL1] = 0; + chars_displayed[SCROLL2] = 0; + x_min[NORMAL0] = 0; + x_min[NORMAL1] = 0; + x_min[NORMAL2] = 0; + x_min[SCROLL0] = 0; + x_min[SCROLL1] = 0; + x_min[SCROLL2] = 0; + ch_offset[NORMAL0] = 0; + ch_offset[NORMAL1] = 0; + ch_offset[NORMAL2] = 0; + ch_offset[SCROLL0] = 0; + ch_offset[SCROLL1] = 0; + ch_offset[SCROLL2] = 0; */ + /* no borders when screen off, only background */ + /* left_border_chars = 48 - LCHOP - RCHOP; + right_border_start = 0; */ + break; + case 0x01: + chars_read[NORMAL0] = 32; + chars_read[NORMAL1] = 16; + chars_read[NORMAL2] = 8; + chars_read[SCROLL0] = 40; + chars_read[SCROLL1] = 20; + chars_read[SCROLL2] = 10; + chars_displayed[NORMAL0] = 32; + chars_displayed[NORMAL1] = 16; + chars_displayed[NORMAL2] = 8; + x_min[NORMAL0] = 32; + x_min[NORMAL1] = 32; + x_min[NORMAL2] = 32; + ch_offset[NORMAL0] = 0; + ch_offset[NORMAL1] = 0; + ch_offset[NORMAL2] = 0; + font_cycles[NORMAL0] = load_cycles[NORMAL0] = 32; + font_cycles[NORMAL1] = load_cycles[NORMAL1] = 16; + load_cycles[NORMAL2] = 8; + before_cycles[NORMAL0] = BEFORE_CYCLES; + before_cycles[SCROLL0] = BEFORE_CYCLES + 8; + extra_cycles[NORMAL0] = 7 + BEFORE_CYCLES; + extra_cycles[SCROLL0] = 8 + BEFORE_CYCLES + 8; + left_border_chars = 8 - LCHOP; + right_border_start = (Screen_WIDTH - 64) / 2; + break; + case 0x02: + chars_read[NORMAL0] = 40; + chars_read[NORMAL1] = 20; + chars_read[NORMAL2] = 10; + chars_read[SCROLL0] = 48; + chars_read[SCROLL1] = 24; + chars_read[SCROLL2] = 12; + chars_displayed[NORMAL0] = 40; + chars_displayed[NORMAL1] = 20; + chars_displayed[NORMAL2] = 10; + x_min[NORMAL0] = 16; + x_min[NORMAL1] = 16; + x_min[NORMAL2] = 16; + ch_offset[NORMAL0] = 0; + ch_offset[NORMAL1] = 0; + ch_offset[NORMAL2] = 0; + font_cycles[NORMAL0] = load_cycles[NORMAL0] = 40; + font_cycles[NORMAL1] = load_cycles[NORMAL1] = 20; + load_cycles[NORMAL2] = 10; + before_cycles[NORMAL0] = BEFORE_CYCLES + 8; + before_cycles[SCROLL0] = BEFORE_CYCLES + 16; + extra_cycles[NORMAL0] = 8 + BEFORE_CYCLES + 8; + extra_cycles[SCROLL0] = 7 + BEFORE_CYCLES + 16; + left_border_chars = 4 - LCHOP; + right_border_start = (Screen_WIDTH - 32) / 2; + break; + case 0x03: + chars_read[NORMAL0] = 48; + chars_read[NORMAL1] = 24; + chars_read[NORMAL2] = 12; + chars_read[SCROLL0] = 48; + chars_read[SCROLL1] = 24; + chars_read[SCROLL2] = 12; + chars_displayed[NORMAL0] = 42; + chars_displayed[NORMAL1] = 22; + chars_displayed[NORMAL2] = 12; + x_min[NORMAL0] = 12; + x_min[NORMAL1] = 8; + x_min[NORMAL2] = 0; + ch_offset[NORMAL0] = 3; + ch_offset[NORMAL1] = 1; + ch_offset[NORMAL2] = 0; + font_cycles[NORMAL0] = load_cycles[NORMAL0] = 47; + font_cycles[NORMAL1] = load_cycles[NORMAL1] = 24; + load_cycles[NORMAL2] = 12; + before_cycles[NORMAL0] = BEFORE_CYCLES + 16; + before_cycles[SCROLL0] = BEFORE_CYCLES + 16; + extra_cycles[NORMAL0] = 7 + BEFORE_CYCLES + 16; + extra_cycles[SCROLL0] = 7 + BEFORE_CYCLES + 16; + left_border_chars = 3 - LCHOP; + right_border_start = (Screen_WIDTH - 8) / 2; + break; + } + + ANTIC_missile_dma_enabled = (byte & 0x0c); /* no player dma without missile */ + ANTIC_player_dma_enabled = (byte & 0x08); + singleline = (byte & 0x10); + ANTIC_player_flickering = ((ANTIC_player_dma_enabled | ANTIC_player_gra_enabled) == 0x02); + ANTIC_missile_flickering = ((ANTIC_missile_dma_enabled | ANTIC_missile_gra_enabled) == 0x01); + + byte = ANTIC_HSCROL; /* update horizontal scroll data */ +/* ******* FALLTHROUGH ******* */ + case ANTIC_OFFSET_HSCROL: +/* TODO: make this truely cycle exact, and update cpu2antic and antic2cpu */ +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { + ANTIC_UpdateScanline(); + } +#endif + ANTIC_HSCROL = byte &= 0x0f; + if (ANTIC_DMACTL & 3) { + chars_displayed[SCROLL0] = chars_displayed[NORMAL0]; + ch_offset[SCROLL0] = 4 - (byte >> 2); + x_min[SCROLL0] = x_min[NORMAL0]; + if (byte & 3) { + x_min[SCROLL0] += (byte & 3) - 4; + chars_displayed[SCROLL0]++; + ch_offset[SCROLL0]--; + } + chars_displayed[SCROLL2] = chars_displayed[NORMAL2]; + if ((ANTIC_DMACTL & 3) == 3) { /* wide playfield */ + ch_offset[SCROLL0]--; + if (byte == 4 || byte == 12) + chars_displayed[SCROLL1] = 21; + else + chars_displayed[SCROLL1] = 22; + if (byte <= 4) { + x_min[SCROLL1] = byte + 8; + ch_offset[SCROLL1] = 1; + } + else if (byte <= 12) { + x_min[SCROLL1] = byte; + ch_offset[SCROLL1] = 0; + } + else { + x_min[SCROLL1] = byte - 8; + ch_offset[SCROLL1] = -1; + } + /* technically, the part below is wrong */ + /* scrolling in mode 8,9 with HSCROL=13,14,15 */ + /* will set x_min=13,14,15 > 4*LCHOP = 12 */ + /* so that nothing is drawn on the far left side */ + /* of the screen. We could fix this, but only */ + /* by setting x_min to be negative. */ + x_min[SCROLL2] = byte; + ch_offset[SCROLL2] = 0; + } + else { + chars_displayed[SCROLL1] = chars_displayed[NORMAL1]; + ch_offset[SCROLL1] = 2 - (byte >> 3); + x_min[SCROLL1] = x_min[NORMAL0]; + if (byte) { + if (byte & 7) { + x_min[SCROLL1] += (byte & 7) - 8; + chars_displayed[SCROLL1]++; + ch_offset[SCROLL1]--; + } + x_min[SCROLL2] = x_min[NORMAL2] + byte - 16; + chars_displayed[SCROLL2]++; + ch_offset[SCROLL2] = 0; + } + else { + x_min[SCROLL2] = x_min[NORMAL2]; + ch_offset[SCROLL2] = 1; + } + } + + if (ANTIC_DMACTL & 2) { /* normal & wide playfield */ + load_cycles[SCROLL0] = 47 - (byte >> 2); + font_cycles[SCROLL0] = (47 * 4 + 1 - byte) >> 2; + load_cycles[SCROLL1] = (24 * 8 + 3 - byte) >> 3; + font_cycles[SCROLL1] = (24 * 8 + 1 - byte) >> 3; + load_cycles[SCROLL2] = byte < 0xc ? 12 : 11; + } + else { /* narrow playfield */ + font_cycles[SCROLL0] = load_cycles[SCROLL0] = 40; + font_cycles[SCROLL1] = load_cycles[SCROLL1] = 20; + load_cycles[SCROLL2] = 16; + } + } + break; + case ANTIC_OFFSET_VSCROL: + ANTIC_VSCROL = byte & 0x0f; + if (vscrol_off) { + lastline = ANTIC_VSCROL; + if (ANTIC_XPOS < VSCOF_C) + need_dl = dctr == lastline; + } + break; + case ANTIC_OFFSET_PMBASE: + ANTIC_PMBASE = byte; + pmbase_d = (byte & 0xfc) << 8; + pmbase_s = pmbase_d & 0xf8ff; + break; + case ANTIC_OFFSET_CHACTL: +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { + update_scanline_invert(); + } +#endif + invert_mask = byte & 2 ? 0x80 : 0; +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { + update_scanline_blank(); + } +#endif + blank_mask = byte & 1 ? 0xe0 : 0x60; + if ((ANTIC_CHACTL ^ byte) & 4) { +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { + /* timing for flip is the same as chbase */ + update_scanline_chbase(); + } +#endif + chbase_20 ^= 7; + } + ANTIC_CHACTL = byte; + break; + case ANTIC_OFFSET_CHBASE: +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { + update_scanline_chbase(); + } +#endif + ANTIC_CHBASE = byte; + chbase_20 = (byte & 0xfe) << 8; + if (ANTIC_CHACTL & 4) + chbase_20 ^= 7; + break; +#endif /* defined(BASIC) || defined(CURSES_BASIC) */ + case ANTIC_OFFSET_WSYNC: +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { + if (ANTIC_xpos <= ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C] && ANTIC_xpos_limit >= ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C]) + if (ANTIC_cpu2antic_ptr[ANTIC_xpos + 1] == ANTIC_cpu2antic_ptr[ANTIC_xpos] + 1) { + /* antic does not steal the current cycle */ +/* note that if ANTIC_WSYNC_C is a stolen cycle, then ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C+1]-1 corresponds +to the last cpu cycle < ANTIC_WSYNC_C. Then the cpu will see this cycle if WSYNC +is not delayed, since it really occurred one cycle after the STA WSYNC. But if +WSYNC is "delayed" then ANTIC_xpos is the next cpu cycle after ANTIC_WSYNC_C (which was stolen +), so it is one greater than the above value. EG if ANTIC_WSYNC_C=10 and is stolen +(and let us say cycle 9,11 are also stolen, and 8,12 are not), then in the first +case we have ANTIC_cpu2antic_ptr[ANTIC_WSYNC_C+1]-1 = 8 and in the 2nd =12 */ + ANTIC_xpos = ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C + 1] - 1; + } + else { + ANTIC_xpos = ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C + 1]; + } + else { + ANTIC_wsync_halt = TRUE; + ANTIC_xpos = ANTIC_xpos_limit; + if (ANTIC_cpu2antic_ptr[ANTIC_xpos + 1] == ANTIC_cpu2antic_ptr[ANTIC_xpos] + 1) { + /* antic does not steal the current cycle */ + ANTIC_delayed_wsync = 0; + } + else { + ANTIC_delayed_wsync = 1; + } + } + } + else { + ANTIC_delayed_wsync = 0; +#endif /* NEW_CYCLE_EXACT */ + if (ANTIC_xpos <= ANTIC_WSYNC_C && ANTIC_xpos_limit >= ANTIC_WSYNC_C) + ANTIC_xpos = ANTIC_WSYNC_C; + else { + ANTIC_wsync_halt = TRUE; + ANTIC_xpos = ANTIC_xpos_limit; + } +#ifdef NEW_CYCLE_EXACT + } +#endif /* NEW_CYCLE_EXACT */ + break; + case ANTIC_OFFSET_NMIEN: + ANTIC_NMIEN = byte; + break; + case ANTIC_OFFSET_NMIRES: + ANTIC_NMIST = 0x1f; + break; + default: + break; + } +} + +/* State ------------------------------------------------------------------- */ + +#ifndef BASIC + +void ANTIC_StateSave(void) +{ + StateSav_SaveUBYTE(&ANTIC_DMACTL, 1); + StateSav_SaveUBYTE(&ANTIC_CHACTL, 1); + StateSav_SaveUBYTE(&ANTIC_HSCROL, 1); + StateSav_SaveUBYTE(&ANTIC_VSCROL, 1); + StateSav_SaveUBYTE(&ANTIC_PMBASE, 1); + StateSav_SaveUBYTE(&ANTIC_CHBASE, 1); + StateSav_SaveUBYTE(&ANTIC_NMIEN, 1); + StateSav_SaveUBYTE(&ANTIC_NMIST, 1); + StateSav_SaveUBYTE(&IR, 1); + StateSav_SaveUBYTE(&anticmode, 1); + StateSav_SaveUBYTE(&dctr, 1); + StateSav_SaveUBYTE(&lastline, 1); + StateSav_SaveUBYTE(&need_dl, 1); + StateSav_SaveUBYTE(&vscrol_off, 1); + + StateSav_SaveUWORD(&ANTIC_dlist, 1); + StateSav_SaveUWORD(&screenaddr, 1); + + StateSav_SaveINT(&ANTIC_xpos, 1); + StateSav_SaveINT(&ANTIC_xpos_limit, 1); + StateSav_SaveINT(&ANTIC_ypos, 1); +} + +void ANTIC_StateRead(void) +{ + StateSav_ReadUBYTE(&ANTIC_DMACTL, 1); + StateSav_ReadUBYTE(&ANTIC_CHACTL, 1); + StateSav_ReadUBYTE(&ANTIC_HSCROL, 1); + StateSav_ReadUBYTE(&ANTIC_VSCROL, 1); + StateSav_ReadUBYTE(&ANTIC_PMBASE, 1); + StateSav_ReadUBYTE(&ANTIC_CHBASE, 1); + StateSav_ReadUBYTE(&ANTIC_NMIEN, 1); + StateSav_ReadUBYTE(&ANTIC_NMIST, 1); + StateSav_ReadUBYTE(&IR, 1); + StateSav_ReadUBYTE(&anticmode, 1); + StateSav_ReadUBYTE(&dctr, 1); + StateSav_ReadUBYTE(&lastline, 1); + StateSav_ReadUBYTE(&need_dl, 1); + StateSav_ReadUBYTE(&vscrol_off, 1); + + StateSav_ReadUWORD(&ANTIC_dlist, 1); + StateSav_ReadUWORD(&screenaddr, 1); + + StateSav_ReadINT(&ANTIC_xpos, 1); + StateSav_ReadINT(&ANTIC_xpos_limit, 1); + StateSav_ReadINT(&ANTIC_ypos, 1); + + ANTIC_PutByte(ANTIC_OFFSET_DMACTL, ANTIC_DMACTL); + ANTIC_PutByte(ANTIC_OFFSET_CHACTL, ANTIC_CHACTL); + ANTIC_PutByte(ANTIC_OFFSET_PMBASE, ANTIC_PMBASE); + ANTIC_PutByte(ANTIC_OFFSET_CHBASE, ANTIC_CHBASE); +} + +#endif /* BASIC */ diff --git a/PVAtari800/atari800-src/antic.h b/PVAtari800/atari800-src/antic.h new file mode 100644 index 0000000000..769bde0781 --- /dev/null +++ b/PVAtari800/atari800-src/antic.h @@ -0,0 +1,137 @@ +#ifndef ANTIC_H_ +#define ANTIC_H_ + +#include "atari.h" + +/* + * Offset to registers in custom relative to start of antic memory addresses. + */ + +#define ANTIC_OFFSET_DMACTL 0x00 +#define ANTIC_OFFSET_CHACTL 0x01 +#define ANTIC_OFFSET_DLISTL 0x02 +#define ANTIC_OFFSET_DLISTH 0x03 +#define ANTIC_OFFSET_HSCROL 0x04 +#define ANTIC_OFFSET_VSCROL 0x05 +#define ANTIC_OFFSET_PMBASE 0x07 +#define ANTIC_OFFSET_CHBASE 0x09 +#define ANTIC_OFFSET_WSYNC 0x0a +#define ANTIC_OFFSET_VCOUNT 0x0b +#define ANTIC_OFFSET_PENH 0x0c +#define ANTIC_OFFSET_PENV 0x0d +#define ANTIC_OFFSET_NMIEN 0x0e +#define ANTIC_OFFSET_NMIRES 0x0f +#define ANTIC_OFFSET_NMIST 0x0f + +extern UBYTE ANTIC_CHACTL; +extern UBYTE ANTIC_CHBASE; +extern UWORD ANTIC_dlist; +extern UBYTE ANTIC_DMACTL; +extern UBYTE ANTIC_HSCROL; +extern UBYTE ANTIC_NMIEN; +extern UBYTE ANTIC_NMIST; +extern UBYTE ANTIC_PMBASE; +extern UBYTE ANTIC_VSCROL; + +extern int ANTIC_break_ypos; +extern int ANTIC_ypos; +extern int ANTIC_wsync_halt; + +/* Current clock cycle in a scanline. + Normally 0 <= ANTIC_xpos && ANTIC_xpos < ANTIC_LINE_C, but in some cases ANTIC_xpos >= ANTIC_LINE_C, + which means that we are already in line (ypos + 1). */ +extern int ANTIC_xpos; + +/* ANTIC_xpos limit for the currently running 6502 emulation. */ +extern int ANTIC_xpos_limit; + +/* Main clock value at the beginning of the current scanline. */ +extern unsigned int ANTIC_screenline_cpu_clock; + +/* Current main clock value. */ +#define ANTIC_CPU_CLOCK (ANTIC_screenline_cpu_clock + ANTIC_XPOS) + +#define ANTIC_NMIST_C 6 +#define ANTIC_NMI_C 12 + +/* Number of cycles per scanline. */ +#define ANTIC_LINE_C 114 + +/* STA WSYNC resumes here. */ +#define ANTIC_WSYNC_C 106 + +/* Number of memory refresh cycles per scanline. + In the first scanline of a font mode there are actually less than ANTIC_DMAR + memory refresh cycles. */ +#define ANTIC_DMAR 9 + +extern int ANTIC_artif_mode; +extern int ANTIC_artif_new; + +extern UBYTE ANTIC_PENH_input; +extern UBYTE ANTIC_PENV_input; + +int ANTIC_Initialise(int *argc, char *argv[]); +void ANTIC_Reset(void); +void ANTIC_Frame(int draw_display); +UBYTE ANTIC_GetByte(UWORD addr, int no_side_effects); +void ANTIC_PutByte(UWORD addr, UBYTE byte); + +UBYTE ANTIC_GetDLByte(UWORD *paddr); +UWORD ANTIC_GetDLWord(UWORD *paddr); + +/* always call ANTIC_UpdateArtifacting after changing ANTIC_artif_mode */ +void ANTIC_UpdateArtifacting(void); + +/* Video memory access */ +void ANTIC_VideoMemset(UBYTE *ptr, UBYTE val, ULONG size); +void ANTIC_VideoPutByte(UBYTE *ptr, UBYTE val); + +/* GTIA calls it on a write to PRIOR */ +void ANTIC_SetPrior(UBYTE prior); + +/* Saved states */ +void ANTIC_StateSave(void); +void ANTIC_StateRead(void); + +/* Pointer to 16 KB seen by ANTIC in 0x4000-0x7fff. + If it's the same what the CPU sees (and what's in memory[0x4000..0x7fff], + then NULL. */ +extern const UBYTE *ANTIC_xe_ptr; + +/* PM graphics for GTIA */ +extern int ANTIC_player_dma_enabled; +extern int ANTIC_missile_dma_enabled; +extern int ANTIC_player_gra_enabled; +extern int ANTIC_missile_gra_enabled; +extern int ANTIC_player_flickering; +extern int ANTIC_missile_flickering; + +/* ANTIC colour lookup tables, used by GTIA */ +extern UWORD ANTIC_cl[128]; +extern ULONG ANTIC_lookup_gtia9[16]; +extern ULONG ANTIC_lookup_gtia11[16]; +extern UWORD ANTIC_hires_lookup_l[128]; + +#ifdef NEW_CYCLE_EXACT +#define ANTIC_NOT_DRAWING -999 +#define ANTIC_DRAWING_SCREEN (ANTIC_cur_screen_pos!=ANTIC_NOT_DRAWING) +extern int ANTIC_delayed_wsync; +extern int ANTIC_cur_screen_pos; +extern const int *ANTIC_cpu2antic_ptr; +extern const int *ANTIC_antic2cpu_ptr; +void ANTIC_UpdateScanline(void); +void ANTIC_UpdateScanlinePrior(UBYTE byte); + +#define ANTIC_XPOS ( ANTIC_DRAWING_SCREEN ? ANTIC_cpu2antic_ptr[ANTIC_xpos] : ANTIC_xpos ) +#else +#define ANTIC_XPOS ANTIC_xpos +#endif /* NEW_CYCLE_EXACT */ + +#ifndef NO_SIMPLE_PAL_BLENDING +/* Set to 1 to enable simplified emulation of PAL blending, that uses only + the standard 8-bit palette. */ +extern int ANTIC_pal_blending; +#endif /* NO_SIMPLE_PAL_BLENDING */ + +#endif /* ANTIC_H_ */ diff --git a/PVAtari800/atari800-src/artifact.c b/PVAtari800/atari800-src/artifact.c new file mode 100644 index 0000000000..884c7347e2 --- /dev/null +++ b/PVAtari800/atari800-src/artifact.c @@ -0,0 +1,217 @@ +/* + * artifact.c - management of video artifacting settings + * + * Copyright (C) 2013 Tomasz Krasuski + * Copyright (C) 2013 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with Atari800; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include "artifact.h" + +#include "antic.h" +#include "atari.h" +#include "cfg.h" +#include "log.h" +#ifdef PAL_BLENDING +#include "pal_blending.h" +#endif /* PAL_BLENDING */ +#include "util.h" +#if SUPPORTS_CHANGE_VIDEOMODE +#include "videomode.h" +#endif /* SUPPORTS_CHANGE_VIDEOMODE */ + +ARTIFACT_t ARTIFACT_mode = ARTIFACT_NONE; + +static ARTIFACT_t mode_ntsc = ARTIFACT_NONE; +static ARTIFACT_t mode_pal = ARTIFACT_NONE; + +static char const * const mode_cfg_strings[ARTIFACT_SIZE] = { + "NONE", + "NTSC-OLD", + "NTSC-NEW", +#if NTSC_FILTER + "NTSC-FULL", +#endif /* NTSC_FILTER */ +#ifndef NO_SIMPLE_PAL_BLENDING + "PAL-SIMPLE", +#endif /* NO_SIMPLE_PAL_BLENDING */ +#ifdef PAL_BLENDING + "PAL-BLEND" +#endif /* PAL_BLENDING */ +}; + +static void UpdateMode(int old_mode, int reinit) +{ +#if (NTSC_FILTER && SUPPORTS_CHANGE_VIDEOMODE) || defined(PAL_BLENDING) + int need_reinit = FALSE; +#endif /* (NTSC_FILTER && SUPPORTS_CHANGE_VIDEOMODE) || defined(PAL_BLENDING) */ + if (ARTIFACT_mode == old_mode) + return; + + /* TV effect has changed. */ +#if NTSC_FILTER && SUPPORTS_CHANGE_VIDEOMODE + /* If switched between non-filter and NTSC filter, video mode needs update. */ + if (ARTIFACT_mode == ARTIFACT_NTSC_FULL || + old_mode == ARTIFACT_NTSC_FULL) + need_reinit = TRUE; +#endif /* NTSC_FILTER && SUPPORTS_CHANGE_VIDEOMODE */ +#ifdef PAL_BLENDING + /* If PAL blending was enabled/disabled, video mode needs update. */ + if (ARTIFACT_mode == ARTIFACT_PAL_BLEND || + old_mode == ARTIFACT_PAL_BLEND) + need_reinit = TRUE; +#endif /* PAL_BLENDING */ +#ifndef NO_SIMPLE_PAL_BLENDING + ANTIC_pal_blending = ARTIFACT_mode == ARTIFACT_PAL_SIMPLE; +#endif /* NO_SIMPLE_PAL_BLENDING */ + if (ARTIFACT_mode != ARTIFACT_NTSC_OLD && + ARTIFACT_mode != ARTIFACT_NTSC_NEW) { + ANTIC_artif_new = ANTIC_artif_mode = 0; + } else { + if (ANTIC_artif_mode == 0) + /* ANTIC new or old artifacting is being enabled */ + ANTIC_artif_mode = 1; + ANTIC_artif_new = ARTIFACT_mode == ARTIFACT_NTSC_NEW; + } + ANTIC_UpdateArtifacting(); +#if SUPPORTS_CHANGE_VIDEOMODE + if (need_reinit && reinit) { + if (!VIDEOMODE_Update()) { + ARTIFACT_t tmp = ARTIFACT_mode; + /* Updating display failed, restore previous setting. */ + ARTIFACT_mode = old_mode; + UpdateMode(tmp, FALSE); + } + } +#endif /* SUPPORTS_CHANGE_VIDEOMODE */ +} + +static void UpdateFromTVMode(int tv_mode) +{ + if (tv_mode == Atari800_TV_NTSC) + ARTIFACT_mode = mode_ntsc; + else /* tv_mode == Atari800_TV_PAL */ + ARTIFACT_mode = mode_pal; +} + +void ARTIFACT_Set(ARTIFACT_t mode) +{ + ARTIFACT_t old_effect = ARTIFACT_mode; + ARTIFACT_mode = mode; + if (Atari800_tv_mode == Atari800_TV_NTSC) + mode_ntsc = mode; + else /* Atari800_tv_mode == Atari800_TV_PAL */ + mode_pal = mode; + UpdateMode(old_effect, TRUE); +} + +void ARTIFACT_SetTVMode(int tv_mode) +{ + ARTIFACT_t old_mode = ARTIFACT_mode; + UpdateFromTVMode(tv_mode); + UpdateMode(old_mode, TRUE); +} + +int ARTIFACT_ReadConfig(char *option, char *ptr) +{ + if (strcmp(option, "ARTIFACT_NTSC") == 0) { + int i = CFG_MatchTextParameter(ptr, mode_cfg_strings, ARTIFACT_SIZE); + if (i < 0) + return FALSE; + mode_ntsc = i; + } + else if (strcmp(option, "ARTIFACT_PAL") == 0) { + int i = CFG_MatchTextParameter(ptr, mode_cfg_strings, ARTIFACT_SIZE); + if (i < 0) + return FALSE; + mode_pal = i; + } + else if (strcmp(option, "ARTIFACT_NTSC_MODE") == 0) { + int i = Util_sscandec(ptr); + if (i < 0 || i > 4) + return FALSE; + ANTIC_artif_mode = i; + } + else + return FALSE; + return TRUE; +} + +void ARTIFACT_WriteConfig(FILE *fp) +{ + fprintf(fp, "ARTIFACT_NTSC=%s\n", mode_cfg_strings[mode_ntsc]); + fprintf(fp, "ARTIFACT_PAL=%s\n", mode_cfg_strings[mode_pal]); + fprintf(fp, "ARTIFACT_NTSC_MODE=%i\n", ANTIC_artif_mode); +} + +int ARTIFACT_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-ntsc-artif") == 0) { + if (i_a) { + int idx = CFG_MatchTextParameter(argv[++i], mode_cfg_strings, ARTIFACT_SIZE); + if (idx < 0) { + Log_print("Invalid value for -ntsc-artif"); + return FALSE; + } + mode_ntsc = idx; + } else a_m = TRUE; + } + else if (strcmp(argv[i], "-pal-artif") == 0) { + if (i_a) { + int idx = CFG_MatchTextParameter(argv[++i], mode_cfg_strings, ARTIFACT_SIZE); + if (idx < 0) { + Log_print("Invalid value for -pal-artif"); + return FALSE; + } + mode_pal = idx; + } else a_m = TRUE; + } + + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-ntsc-artif none|ntsc-old|ntsc-new|ntsc-full"); + Log_print("\t Select video artifacts for NTSC"); + Log_print("\t-pal-artif none|pal-simple|pal-accu"); + Log_print("\t Select video artifacts for PAL"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + /* Assume that Atari800_tv_mode has been already initialised. */ + UpdateFromTVMode(Atari800_tv_mode); + UpdateMode(ARTIFACT_NONE, FALSE); + return TRUE; +} diff --git a/PVAtari800/atari800-src/artifact.h b/PVAtari800/atari800-src/artifact.h new file mode 100644 index 0000000000..0a8789facd --- /dev/null +++ b/PVAtari800/atari800-src/artifact.h @@ -0,0 +1,40 @@ +#ifndef ARTIFACT_H_ +#define ARTIFACT_H_ + +#include + +#include "config.h" + +typedef enum ARTIFACT_t { + ARTIFACT_NONE, /* Artifacting disabled */ + ARTIFACT_NTSC_OLD, /* Original NTSC artifacting */ + ARTIFACT_NTSC_NEW, /* New NTSC artifacting */ +#if NTSC_FILTER + ARTIFACT_NTSC_FULL, /* NTSC filter */ +#endif /* NTSC_FILTER */ +#ifndef NO_SIMPLE_PAL_BLENDING + ARTIFACT_PAL_SIMPLE, /* ANTIC-level simple PAL blending */ +#endif /* NO_SIMPLE_PAL_BLENDING */ +#ifdef PAL_BLENDING + ARTIFACT_PAL_BLEND, /* Accurate PAL blending */ +#endif /* PAL_BLENDING */ + ARTIFACT_SIZE +} ARTIFACT_t; + +/* The currently used artifact emulation mode. Use ARTIFACT_Set to change this value. */ +extern ARTIFACT_t ARTIFACT_mode; + +/* Set artifacting mode for the current TV system. */ +void ARTIFACT_Set(ARTIFACT_t mode); + +/* Call after updating Atari800_tv_mode to update the artifacting mode accordingly. */ +void ARTIFACT_SetTVMode(int tv_mode); + +/* Read/write to configuration file. */ +void ARTIFACT_WriteConfig(FILE *fp); +int ARTIFACT_ReadConfig(char *option, char *ptr); + +/* Module initialisation and processing of command-line arguments. */ +int ARTIFACT_Initialise(int *argc, char *argv[]); + +#endif /* ARTIFACT_H_ */ diff --git a/PVAtari800/atari800-src/atari.c b/PVAtari800/atari800-src/atari.c new file mode 100644 index 0000000000..7ee5bc3923 --- /dev/null +++ b/PVAtari800/atari800-src/atari.c @@ -0,0 +1,1482 @@ +/* + * atari.c - main high-level routines + * + * Copyright (c) 1995-1998 David Firth + * Copyright (c) 1998-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#define _POSIX_C_SOURCE 199309L /* for nanosleep */ + +#include "afile.h" +#include "config.h" +#include +#include +#include +#ifdef HAVE_SIGNAL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif +#ifdef __EMX__ +#define INCL_DOS +#include +#endif +#ifdef __BEOS__ +#include +#endif +#ifdef HAVE_LIBZ +#include +#endif +#ifdef R_SERIAL +#include +#endif +#ifdef SDL +#include +#endif + +#include "akey.h" +#include "antic.h" +#include "artifact.h" +#include "atari.h" +#include "binload.h" +#include "cartridge.h" +#include "cassette.h" +#include "cfg.h" +#include "cpu.h" +#include "devices.h" +#include "emuos.h" +#include "esc.h" +#include "gtia.h" +#include "input.h" +#include "log.h" +#include "memory.h" +#include "monitor.h" +#ifdef IDE +# include "ide.h" +#endif +#include "pia.h" +#include "platform.h" +#include "pokey.h" +#include "rtime.h" +#include "pbi.h" +#include "sio.h" +#include "sysrom.h" +#include "util.h" +#if !defined(BASIC) && !defined(CURSES_BASIC) +#include "colours.h" +#include "screen.h" +#endif +#ifndef BASIC +#include "statesav.h" +#ifndef __PLUS +#include "ui.h" +#endif +#endif /* BASIC */ +#if defined(SOUND) && !defined(__PLUS) +#include "pokeysnd.h" +#include "sndsave.h" +#include "sound.h" +#endif +#ifdef R_IO_DEVICE +#include "rdevice.h" +#endif +#ifdef __PLUS +#ifdef _WX_ +#include "export.h" +#else /* _WX_ */ +#include "globals.h" +#include "macros.h" +#include "display_win.h" +#include "misc_win.h" +#include "registry.h" +#include "timing.h" +#include "FileService.h" +#include "Helpers.h" +#endif /* _WX_ */ +#endif /* __PLUS */ +#ifdef PBI_BB +#include "pbi_bb.h" +#endif +#if defined(PBI_XLD) || defined (VOICEBOX) +#include "votraxsnd.h" +#endif +#ifdef XEP80_EMULATION +#include "xep80.h" +#endif +#ifdef AF80 +#include "af80.h" +#endif +#ifdef NTSC_FILTER +#include "filter_ntsc.h" +#endif +#ifdef VOICEBOX +#include "voicebox.h" +#endif +#if SUPPORTS_CHANGE_VIDEOMODE +#include "videomode.h" +#endif +#ifdef SDL +#include "sdl/init.h" +#endif +#ifdef DIRECTX +#include "win32\main.h" +#endif + +int Atari800_machine_type = Atari800_MACHINE_XLXE; + +int Atari800_builtin_basic = TRUE; +int Atari800_keyboard_leds = FALSE; +int Atari800_f_keys = FALSE; +int Atari800_jumper; +int Atari800_builtin_game = FALSE; +int Atari800_keyboard_detached = FALSE; + +int Atari800_tv_mode = Atari800_TV_PAL; +int Atari800_disable_basic = TRUE; + +int Atari800_os_version = -1; + +int verbose = FALSE; + +int Atari800_display_screen = FALSE; +int Atari800_nframes = 0; +int Atari800_refresh_rate = 1; +int Atari800_collisions_in_skipped_frames = FALSE; +int Atari800_turbo = FALSE; +int Atari800_auto_frameskip = FALSE; + +#ifdef BENCHMARK +static double benchmark_start_time; +#endif + +int emuos_mode = 1; /* 0 = never use EmuOS, 1 = use EmuOS if real OS not available, 2 = always use EmuOS */ + +#ifdef HAVE_SIGNAL +volatile sig_atomic_t sigint_flag = FALSE; + +static RETSIGTYPE sigint_handler(int num) +{ + sigint_flag = TRUE; + /* Avoid restoring the original signal handler. */ + signal(SIGINT, sigint_handler); + return; +} +#endif + +void Atari800_SetMachineType(int type) +{ + Atari800_machine_type = type; + if (Atari800_machine_type != Atari800_MACHINE_XLXE) { + Atari800_builtin_basic = FALSE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } +} + +void Atari800_UpdateKeyboardDetached(void) +{ + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + GTIA_TRIG[2] = !Atari800_keyboard_detached; + if (Atari800_keyboard_detached && (GTIA_GRACTL & 4)) + GTIA_TRIG_latch[2] = 0; + } +} +void Atari800_UpdateJumper(void) +{ + if (Atari800_machine_type == Atari800_MACHINE_XLXE) + POKEY_POT_input[4] = Atari800_jumper ? 0 : 228; +} + +void Atari800_Warmstart(void) +{ + if (Atari800_machine_type == Atari800_MACHINE_800) { + /* A real Axlon homebanks on reset */ + /* XXX: what does Mosaic do? */ + if (MEMORY_axlon_num_banks > 0) MEMORY_PutByte(0xcfff, 0); + /* RESET key in 400/800 does not reset chips, + but only generates RNMI interrupt */ + ANTIC_NMIST = 0x3f; + CPU_NMI(); + } + else { + PBI_Reset(); + PIA_Reset(); + ANTIC_Reset(); + /* CPU_Reset() must be after PIA_Reset(), + because Reset routine vector must be read from OS ROM */ + CPU_Reset(); + /* note: POKEY and GTIA have no Reset pin */ + } +#ifdef __PLUS + HandleResetEvent(); +#endif +} + +void Atari800_Coldstart(void) +{ + PBI_Reset(); + PIA_Reset(); + ANTIC_Reset(); + /* CPU_Reset() must be after PIA_Reset(), + because Reset routine vector must be read from OS ROM */ + CPU_Reset(); + /* note: POKEY and GTIA have no Reset pin */ +#ifdef __PLUS + HandleResetEvent(); +#endif + /* reset cartridge to power-up state */ + CARTRIDGE_ColdStart(); + /* set Atari OS Coldstart flag */ + MEMORY_dPutByte(0x244, 1); + /* handle Option key (disable BASIC in XL/XE) + and Start key (boot from cassette) */ + GTIA_consol_override = 2; +#ifdef AF80 + if (AF80_enabled) { + AF80_Reset(); + AF80_InsertRightCartridge(); + } +#endif +} + +int Atari800_LoadImage(const char *filename, UBYTE *buffer, int nbytes) +{ + FILE *f; + int len; + + f = fopen(filename, "rb"); + if (f == NULL) { + Log_print("Error loading ROM image: %s", filename); + return FALSE; + } + len = fread(buffer, 1, nbytes, f); + fclose(f); + if (len != nbytes) { + Log_print("Error reading %s", filename); + return FALSE; + } + return TRUE; +} + +#define COPY_EMUOS(padding) do { \ + memset(MEMORY_os, 0, padding); \ + memcpy(MEMORY_os + (padding), emuos_h, 0x2000); \ + } while (0) + +static int load_roms(void) +{ + if (Atari800_machine_type != Atari800_MACHINE_5200 && emuos_mode == 2) { + COPY_EMUOS(Atari800_machine_type == Atari800_MACHINE_800 ? 0x800 : 0x2000); + Atari800_os_version = -1; + } + else { + int basic_ver, xegame_ver; + SYSROM_ChooseROMs(Atari800_machine_type, MEMORY_ram_size, Atari800_tv_mode, &Atari800_os_version, &basic_ver, &xegame_ver); + if (Atari800_os_version == -1 + || !Atari800_LoadImage(SYSROM_roms[Atari800_os_version].filename, MEMORY_os, SYSROM_roms[Atari800_os_version].size)) { + /* Missing OS ROM. */ + Atari800_os_version = -1; + if (Atari800_machine_type != Atari800_MACHINE_5200 && emuos_mode == 1) + COPY_EMUOS(Atari800_machine_type == Atari800_MACHINE_800 ? 0x800 : 0x2000); + else + /* No OS ROM loaded. */ + return FALSE; + } + else if (Atari800_machine_type != Atari800_MACHINE_5200) { + /* OS ROM found, try loading BASIC. */ + MEMORY_have_basic = basic_ver != -1 && Atari800_LoadImage(SYSROM_roms[basic_ver].filename, MEMORY_basic, SYSROM_roms[basic_ver].size); + if (!MEMORY_have_basic) + /* Missing BASIC ROM. Don't fail when it happens. */ + Atari800_builtin_basic = FALSE; + + if (Atari800_builtin_game) { + /* Try loading built-in XEGS game. */ + if (xegame_ver == -1 + || !Atari800_LoadImage(SYSROM_roms[xegame_ver].filename, MEMORY_xegame, SYSROM_roms[xegame_ver].size)) + /* Missing XEGS game ROM. */ + Atari800_builtin_game = FALSE; + } + } + } + + MEMORY_xe_bank = 0; + return TRUE; +} + +int Atari800_InitialiseMachine(void) +{ + ESC_ClearAll(); + if (!load_roms()) + return FALSE; + Atari800_UpdateKeyboardDetached(); + Atari800_UpdateJumper(); + MEMORY_InitialiseMachine(); + Devices_UpdatePatches(); + return TRUE; +} + +/* Initialise any modules before loading the config file. */ +static void PreInitialise(void) +{ +#if !defined(BASIC) && !defined(CURSES_BASIC) + Colours_PreInitialise(); +#endif +#ifdef NTSC_FILTER + FILTER_NTSC_PreInitialise(); +#endif +} + +int Atari800_Initialise(int *argc, char *argv[]) +{ + int i, j; + const char *run_direct = NULL; +#ifndef BASIC + const char *state_file = NULL; +#endif +#ifdef __PLUS + /* Atari800Win PLus doesn't use configuration files, + it reads configuration from the Registry */ +#ifndef _WX_ + int bUpdateRegistry = (*argc > 1); +#endif + int bTapeFile = FALSE; + int nCartType = CARTRIDGE_main.type; + + /* It is necessary because of the CARTRIDGE_ColdStart (there must not be the + registry-read value available at startup) */ + CARTRIDGE_main.type = CARTRIDGE_NONE; + +#ifndef _WX_ + /* Print the time info in the "Log file" window */ + Misc_PrintTime(); + + /* Force screen refreshing */ + g_nTestVal = _GetRefreshRate() - 1; + + g_ulAtariState = ATARI_UNINITIALIZED; +#endif /* _WX_ */ + PreInitialise(); +#else /* __PLUS */ + const char *rtconfig_filename = NULL; + int got_config; + int help_only = FALSE; + + PreInitialise(); + + if (*argc > 1) { + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-config") == 0) { + if (i + 1 < *argc) + rtconfig_filename = argv[++i]; + else { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + else if (strcmp(argv[i], "-v") == 0 || + strcmp(argv[i], "-version") == 0 || + strcmp(argv[i], "--version") == 0) { + printf("%s\n", Atari800_TITLE); + return FALSE; + } + else if (strcmp(argv[i], "--usage") == 0 || + strcmp(argv[i], "--help") == 0) { + argv[j++] = "-help"; + } + else if (strcmp(argv[i], "-verbose") == 0) { + verbose = TRUE; + } + else { + argv[j++] = argv[i]; + } + } + *argc = j; + } +#ifndef ANDROID + got_config = CFG_LoadConfig(rtconfig_filename); +#else + got_config = TRUE; /* pretend we got a config file -- not needed in Android */ +#endif + + /* try to find ROM images if the configuration file is not found + or it does not specify some ROM paths (blank paths count as specified) */ + SYSROM_FindInDir(".", TRUE); /* current directory */ +#if defined(unix) || defined(__unix__) || defined(__linux__) + SYSROM_FindInDir("/usr/share/atari800", TRUE); +#endif + if (*argc > 0 && argv[0] != NULL) { + char atari800_exe_dir[FILENAME_MAX]; + char atari800_exe_rom_dir[FILENAME_MAX]; + /* the directory of the Atari800 program */ + Util_splitpath(argv[0], atari800_exe_dir, NULL); + SYSROM_FindInDir(atari800_exe_dir, TRUE); + /* "rom" and "ROM" subdirectories of this directory */ + Util_catpath(atari800_exe_rom_dir, atari800_exe_dir, "rom"); + SYSROM_FindInDir(atari800_exe_rom_dir, TRUE); +/* skip "ROM" on systems that are known to be case-insensitive */ +#if !defined(DJGPP) && !defined(HAVE_WINDOWS_H) + Util_catpath(atari800_exe_rom_dir, atari800_exe_dir, "ROM"); + SYSROM_FindInDir(atari800_exe_rom_dir, TRUE); +#endif + } + /* finally if nothing is found, set some defaults to make + the configuration file easier to edit */ + SYSROM_SetDefaults(); + + /* if no configuration file read, try to save one with the defaults */ + if (!got_config) + CFG_WriteConfig(); + +#endif /* __PLUS */ + + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-atari") == 0) { + Atari800_machine_type = Atari800_MACHINE_800; + MEMORY_ram_size = 48; + Atari800_builtin_basic = FALSE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-1200") == 0) { + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 64; + Atari800_builtin_basic = FALSE; + Atari800_keyboard_leds = TRUE; + Atari800_f_keys = TRUE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-xl") == 0) { + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 64; + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-xe") == 0) { + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 128; + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-320xe") == 0) { + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = MEMORY_RAM_320_COMPY_SHOP; + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-rambo") == 0) { + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = MEMORY_RAM_320_RAMBO; + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-xegs") == 0) { + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 64; + Atari800_builtin_basic = TRUE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = TRUE; + } + else if (strcmp(argv[i], "-5200") == 0) { + Atari800_machine_type = Atari800_MACHINE_5200; + MEMORY_ram_size = 16; + Atari800_builtin_basic = FALSE; + Atari800_keyboard_leds = FALSE; + Atari800_f_keys = FALSE; + Atari800_jumper = FALSE; + Atari800_builtin_game = FALSE; + Atari800_keyboard_detached = FALSE; + } + else if (strcmp(argv[i], "-nobasic") == 0) + Atari800_disable_basic = TRUE; + else if (strcmp(argv[i], "-basic") == 0) + Atari800_disable_basic = FALSE; + else if (strcmp(argv[i], "-nopatch") == 0) + ESC_enable_sio_patch = FALSE; + else if (strcmp(argv[i], "-nopatchall") == 0) + ESC_enable_sio_patch = Devices_enable_h_patch = Devices_enable_p_patch = Devices_enable_r_patch = FALSE; + else if (strcmp(argv[i], "-pal") == 0) + Atari800_tv_mode = Atari800_TV_PAL; + else if (strcmp(argv[i], "-ntsc") == 0) + Atari800_tv_mode = Atari800_TV_NTSC; + else if (strcmp(argv[i], "-emuos") == 0) + emuos_mode = 2; + else if (strcmp(argv[i], "-c") == 0) { + if (Atari800_machine_type == Atari800_MACHINE_800) + MEMORY_ram_size = 52; + } + else if (strcmp(argv[i], "-axlon0f") == 0) { + MEMORY_axlon_0f_mirror = TRUE; + } +#ifdef STEREO_SOUND + else if (strcmp(argv[i], "-stereo") == 0) { + POKEYSND_stereo_enabled = TRUE; + } + else if (strcmp(argv[i], "-nostereo") == 0) { + POKEYSND_stereo_enabled = FALSE; + } +#endif /* STEREO_SOUND */ + else if (strcmp(argv[i], "-turbo") == 0) { + Atari800_turbo = TRUE; + } + else { + /* parameters that take additional argument follow here */ + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-run") == 0) { + if (i_a) run_direct = argv[++i]; else a_m = TRUE; + } +#ifdef R_IO_DEVICE + else if (strcmp(argv[i], "-rdevice") == 0) { + Devices_enable_r_patch = TRUE; +#ifdef R_SERIAL + if (i_a && i + 2 < *argc && *argv[i + 1] != '-') { /* optional serial device name */ + struct stat statbuf; + if (! stat(argv[i + 1], &statbuf)) { + if (S_ISCHR(statbuf.st_mode)) { /* only accept devices as serial device */ + Util_strlcpy(RDevice_serial_device, argv[++i], FILENAME_MAX); + RDevice_serial_enabled = TRUE; + } + } + } +#endif /* R_SERIAL */ + } +#endif + else if (strcmp(argv[i], "-mosaic") == 0) { + if (i_a) { + int total_ram = Util_sscandec(argv[++i]); + MEMORY_mosaic_num_banks = (total_ram - 48)/4; + if ((total_ram - 48) % 4 != 0 || MEMORY_mosaic_num_banks >= 0x40 || MEMORY_mosaic_num_banks < 0) { + Log_print("Invalid Mosaic total RAM size"); + return FALSE; + } + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-axlon") == 0) { + if (i_a) { + int total_ram = Util_sscandec(argv[++i]); + MEMORY_axlon_num_banks = ((total_ram) - 32) / 16; + if ((total_ram - 32) % 16 != 0 || (MEMORY_axlon_num_banks != 0 && MEMORY_axlon_num_banks != 8 && MEMORY_axlon_num_banks != 16 && MEMORY_axlon_num_banks != 32 && MEMORY_axlon_num_banks != 64 && MEMORY_axlon_num_banks != 128 && MEMORY_axlon_num_banks != 256)) { + Log_print("Invalid Axlon total RAM size"); + return FALSE; + } + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-mapram") == 0) + MEMORY_enable_mapram = TRUE; + else if (strcmp(argv[i], "-no-mapram") == 0) + MEMORY_enable_mapram = FALSE; +#ifndef BASIC + /* The BASIC version does not support state files, because: + 1. It has no ability to save state files, because of lack of UI. + 2. It uses a simplified emulation, so the state files would be + incompatible with other versions. + 3. statesav is not compiled in to make the executable smaller. */ + else if (strcmp(argv[i], "-state") == 0) { + if (i_a) state_file = argv[++i]; else a_m = TRUE; + } + else if (strcmp(argv[i], "-refresh") == 0) { + if (i_a) { + Atari800_refresh_rate = Util_sscandec(argv[++i]); + if (Atari800_refresh_rate < 1) { + Log_print("Invalid refresh rate, using 1"); + Atari800_refresh_rate = 1; + } + } + else + a_m = TRUE; + } + else if (strcmp(argv[i], "-autosave-config") == 0) + CFG_save_on_exit = TRUE; + else if (strcmp(argv[i], "-no-autosave-config") == 0) + CFG_save_on_exit = FALSE; +#endif /* BASIC */ + else { + /* all options known to main module tried but none matched */ + + if (strcmp(argv[i], "-help") == 0) { +#ifndef __PLUS + help_only = TRUE; + Log_print("\t-config Specify alternate configuration file"); +#endif + Log_print("\t-autosave-config Automatically save configuration on emulator exit"); + Log_print("\t-no-autosave-config"); + Log_print("\t Disable automatic saving of configuration"); + Log_print("\t-atari Emulate Atari 800"); + Log_print("\t-1200 Emulate Atari 1200XL"); + Log_print("\t-xl Emulate Atari 800XL"); + Log_print("\t-xe Emulate Atari 130XE"); + Log_print("\t-320xe Emulate Atari 320XE (Compy-Shop)"); + Log_print("\t-rambo Emulate Atari 320XE (Rambo XL)"); + Log_print("\t-xegs Emulate Atari XEGS"); + Log_print("\t-5200 Emulate Atari 5200 Games System"); + Log_print("\t-nobasic Turn off Atari BASIC ROM"); + Log_print("\t-basic Turn on Atari BASIC ROM"); + Log_print("\t-pal Enable PAL TV mode"); + Log_print("\t-ntsc Enable NTSC TV mode"); + Log_print("\t-run Run Atari program (COM, EXE, XEX, BAS, LST)"); +#ifndef BASIC + Log_print("\t-state Load saved-state file"); + Log_print("\t-refresh Specify screen refresh rate"); +#endif + Log_print("\t-nopatch Don't patch SIO routine in OS"); + Log_print("\t-nopatchall Don't patch OS at all, H: device won't work"); + Log_print("\t-c Enable RAM between 0xc000 and 0xcfff in Atari 800"); + Log_print("\t-axlon Use Atari 800 Axlon memory expansion: k total RAM"); + Log_print("\t-axlon0f Use Axlon shadow at 0x0fc0-0x0fff"); + Log_print("\t-mosaic Use 400/800 Mosaic memory expansion: k total RAM"); + Log_print("\t-mapram Enable MapRAM for Atari XL/XE"); + Log_print("\t-no-mapram Disable MapRAM"); +#ifdef R_IO_DEVICE + Log_print("\t-rdevice [] Enable R: emulation (using serial device )"); +#endif + Log_print("\t-turbo Run emulated Atari as fast as possible"); + Log_print("\t-v Show version/release number"); + } + + /* copy this option for platform/module specific evaluation */ + argv[j++] = argv[i]; + } + + /* this is the end of the additional argument check */ + if (a_m) { + printf("Missing argument for '%s'\n", argv[i]); + return FALSE; + } + } + } + if (MEMORY_mosaic_num_banks > 0 && MEMORY_axlon_num_banks > 0) { + Log_print("Axlon and Mosaic RAM can not both be enabled, because they are incompatible"); + return FALSE; + } + + *argc = j; + + /* Update machine feature variables. after reading from config file and/or + command-line options. */ + Atari800_SetMachineType(Atari800_machine_type); + +#ifdef SDL + if (!help_only) { + if (!SDL_INIT_Initialise()) + return FALSE; + } +#endif /* SDL */ + + if (!SYSROM_Initialise(argc, argv) +#if !defined(BASIC) && !defined(CURSES_BASIC) + || !Colours_Initialise(argc, argv) + || !ARTIFACT_Initialise(argc, argv) +#endif + || !Devices_Initialise(argc, argv) + || !RTIME_Initialise(argc, argv) +#ifdef IDE + || !IDE_Initialise(argc, argv) +#endif + || !SIO_Initialise (argc, argv) + || !CARTRIDGE_Initialise(argc, argv) + || !CASSETTE_Initialise(argc, argv) + || !PBI_Initialise(argc,argv) +#ifdef VOICEBOX + || !VOICEBOX_Initialise(argc, argv) +#endif +#ifndef BASIC + || !INPUT_Initialise(argc, argv) +#endif +#ifdef XEP80_EMULATION + || !XEP80_Initialise(argc, argv) +#endif +#ifdef AF80 + || !AF80_Initialise(argc, argv) +#endif +#ifdef NTSC_FILTER + || !FILTER_NTSC_Initialise(argc, argv) +#endif +#if SUPPORTS_CHANGE_VIDEOMODE + || !VIDEOMODE_Initialise(argc, argv) +#endif +#ifndef DONT_DISPLAY + /* Platform Specific Initialisation */ + || !PLATFORM_Initialise(argc, argv) +#endif +#if !defined(BASIC) && !defined(CURSES_BASIC) + || !Screen_Initialise(argc, argv) +#endif + /* Initialise Custom Chips */ + || !ANTIC_Initialise(argc, argv) + || !GTIA_Initialise(argc, argv) + || !PIA_Initialise(argc, argv) + || !POKEY_Initialise(argc, argv) + ) { + Atari800_ErrExit(); + return FALSE; + } + +#ifndef __PLUS + + if (help_only) { + Atari800_ErrExit(); + return FALSE; + } + +#if SUPPORTS_CHANGE_VIDEOMODE +#ifndef DONT_DISPLAY + if (!VIDEOMODE_InitialiseDisplay()) { + Atari800_ErrExit(); + return FALSE; + } +#endif +#endif + /* Configure Atari System */ + Atari800_InitialiseMachine(); +#else /* __PLUS */ + + if (!InitialiseMachine()) { +#ifndef _WX_ + if (bUpdateRegistry) + WriteAtari800Registry(); +#endif + return FALSE; + } + +#endif /* __PLUS */ + + /* Auto-start files left on the command line */ + j = 1; /* diskno */ + for (i = 1; i < *argc; i++) { + if (j > 8) { + /* The remaining arguments are not necessary disk images, but ignore them... */ + Log_print("Too many disk image filenames on the command line (max. 8)."); + break; + } + switch (AFILE_OpenFile(argv[i], i == 1, j, FALSE)) { + case AFILE_ERROR: + Log_print("Error opening \"%s\"", argv[i]); + break; + case AFILE_ATR: + case AFILE_XFD: + case AFILE_ATR_GZ: + case AFILE_XFD_GZ: + case AFILE_DCM: + case AFILE_PRO: + j++; + break; + default: + break; + } + } + + /* Install requested ROM cartridge */ + if (CARTRIDGE_main.type == CARTRIDGE_UNKNOWN) { +#ifdef BASIC + Log_print("Raw cartridge images not supported in BASIC version!"); +#else /* BASIC */ + UI_is_active = TRUE; + CARTRIDGE_SetType(&CARTRIDGE_main, UI_SelectCartType(CARTRIDGE_main.size)); + UI_is_active = FALSE; +#endif /* BASIC */ + } + + /* Install requested second ROM cartridge, if first is SpartaX */ + if (CARTRIDGE_piggyback.type == CARTRIDGE_UNKNOWN) { +#ifdef BASIC + Log_print("Raw cartridge images not supported in BASIC version!"); +#else /* BASIC */ + UI_is_active = TRUE; + CARTRIDGE_SetType(&CARTRIDGE_piggyback, UI_SelectCartType(CARTRIDGE_piggyback.size)); + UI_is_active = FALSE; +#endif /* BASIC */ + } +#ifdef AF80 + /* Insert Austin Franklin 80 column cartridge */ + if (AF80_enabled) { + AF80_InsertRightCartridge(); + } +#endif + + /* Load Atari executable, if any */ + if (run_direct != NULL) + BINLOAD_Loader(run_direct); + +#ifndef BASIC + /* Load state file */ + if (state_file != NULL) { + if (StateSav_ReadAtariState(state_file, "rb")) + /* Don't press Start nor Option */ + GTIA_consol_override = 0; + } +#endif + +#ifdef HAVE_SIGNAL + /* Install CTRL-C Handler */ + signal(SIGINT, sigint_handler); +#endif + +#ifdef __PLUS +#ifndef _WX_ + /* Update the Registry if any parameters were specified */ + if (bUpdateRegistry) + WriteAtari800Registry(); + Timer_Start(FALSE); +#endif /* _WX_ */ + g_ulAtariState &= ~ATARI_UNINITIALIZED; +#endif /* __PLUS */ + +#ifdef BENCHMARK + benchmark_start_time = Util_time(); +#endif + +#if defined (SOUND) && defined(SOUND_THIN_API) + if (Sound_enabled) { + /* Up to this point the Sound_enabled flag indicated that we _want_ to + enable sound. From now on, the flag will indicate whether audio + output is enabled and working. So, since the sound output was not + yet initiated, we set the flag accordingly. */ + Sound_enabled = FALSE; + /* Don't worry, Sound_Setup() will set Sound_enabled back to TRUE if + it opens audio output successfully. But Sound_Setup() relies on the + flag being set if and only if audio output is active. */ + if (Sound_Setup()) + /* Start sound if opening audio output was successful. */ + Sound_Continue(); + } +#endif /* defined (SOUND) && defined(SOUND_THIN_API) */ + + return TRUE; +} + +UNALIGNED_STAT_DEF(Screen_atari_write_long_stat) +UNALIGNED_STAT_DEF(pm_scanline_read_long_stat) +UNALIGNED_STAT_DEF(memory_read_word_stat) +UNALIGNED_STAT_DEF(memory_write_word_stat) +UNALIGNED_STAT_DEF(memory_read_aligned_word_stat) +UNALIGNED_STAT_DEF(memory_write_aligned_word_stat) + +int Atari800_Exit(int run_monitor) +{ + int restart; + +#ifdef __PLUS + if (CPU_cim_encountered) + g_ulAtariState |= ATARI_CRASHED; +#endif + +#ifdef STAT_UNALIGNED_WORDS + printf("(ptr&7) Screen_atari pm_scanline _____ memory ______ memory (aligned addr)\n"); + printf(" 32-bit W 32-bit R 16-bit R 16-bit W 16-bit R 16-bit W\n"); + { + unsigned int sums[6] = {0, 0, 0, 0, 0, 0}; + int i; + for (i = 0; i < 8; i++) { + printf("%6d%12u%14u%11u%11u%11u%11u\n", i, + Screen_atari_write_long_stat[i], pm_scanline_read_long_stat[i], + memory_read_word_stat[i], memory_write_word_stat[i], + memory_read_aligned_word_stat[i], memory_write_aligned_word_stat[i]); + sums[0] += Screen_atari_write_long_stat[i]; + sums[1] += pm_scanline_read_long_stat[i]; + sums[2] += memory_read_word_stat[i]; + sums[3] += memory_write_word_stat[i]; + sums[4] += memory_read_aligned_word_stat[i]; + sums[5] += memory_write_aligned_word_stat[i]; + } + printf("total:%12u%14u%11u%11u%11u%11u\n", + sums[0], sums[1], sums[2], sums[3], sums[4], sums[5]); + } +#endif /* STAT_UNALIGNED_WORDS */ + restart = PLATFORM_Exit(run_monitor); +#ifdef HAVE_SIGNAL + /* If a user pressed Ctrl+C in the monitor, avoid immediate return to it. */ + sigint_flag = FALSE; +#endif /* HAVE_SIGNAL */ +#ifndef __PLUS + if (!restart) { + /* We'd better save the configuration before calling the *_Exit() functions - + there's a danger that they might change some emulator settings. */ + if (CFG_save_on_exit) + CFG_WriteConfig(); + + /* Cleanup functions, in reverse order as the init functions in + Atari800_Initialise(). */ +#ifdef SOUND + Sound_Exit(); +#endif +#if SUPPORTS_CHANGE_VIDEOMODE + VIDEOMODE_Exit(); +#endif +#ifdef AF80 + AF80_Exit(); +#endif +#ifndef BASIC + INPUT_Exit(); /* finish event recording */ +#endif + PBI_Exit(); + CASSETTE_Exit(); /* Finish writing to the cassette file */ + CARTRIDGE_Exit(); + SIO_Exit(); /* umount disks, so temporary files are deleted */ +#ifdef IDE + IDE_Exit(); +#endif + Devices_Exit(); +#ifdef R_IO_DEVICE + RDevice_Exit(); /* R: Device cleanup */ +#endif +#ifdef SOUND + SndSave_CloseSoundFile(); +#endif + MONITOR_Exit(); +#ifdef SDL + SDL_INIT_Exit(); +#endif /* SDL */ + } +#endif /* __PLUS */ + return restart; +} + +void Atari800_ErrExit(void) +{ + CFG_save_on_exit = FALSE; /* avoid saving the config */ + Atari800_Exit(FALSE); +} + +#ifndef __PLUS +static void autoframeskip(double curtime, double lasttime) +{ + static int afs_lastframe = 0, afs_discard = 0; + static double afs_lasttime = 0.0, afs_sleeptime = 0.0; + double afs_speedpct, afs_sleeppct, afs_ataritime, afs_realtime; + + if (lasttime - curtime > 0) + afs_sleeptime += lasttime - curtime; + if (curtime - afs_lasttime > 0.5) { + afs_ataritime = ((double) (Atari800_nframes - afs_lastframe)) / + ((double) (Atari800_tv_mode == Atari800_TV_PAL ? Atari800_FPS_PAL : Atari800_FPS_NTSC)); + afs_realtime = curtime - afs_lasttime; + afs_speedpct = 100.0 * afs_ataritime / afs_realtime; + afs_sleeppct = 100.0 * afs_sleeptime / afs_realtime; + + if (afs_discard < 3 && (afs_realtime > 2.0 * afs_ataritime)) { + afs_discard++; + } else { + afs_discard = 0; + if (afs_speedpct < 90.0) { + if (Atari800_refresh_rate < 4) + Atari800_refresh_rate++; + } else { + if (afs_sleeppct > 20.0 && Atari800_refresh_rate > 1) + Atari800_refresh_rate--; + } + } + + afs_sleeptime = 0.0; + afs_lastframe = Atari800_nframes; + afs_lasttime = Util_time(); + } +} + +void Atari800_Sync(void) +{ + static double lasttime = 0; + double deltatime = 1.0 / ((Atari800_tv_mode == Atari800_TV_PAL) ? Atari800_FPS_PAL : Atari800_FPS_NTSC); + double curtime; + +#ifdef SYNCHRONIZED_SOUND + deltatime *= Sound_AdjustSpeed(); +#endif +#ifdef ALTERNATE_SYNC_WITH_HOST + if (! UI_is_active) + deltatime *= Atari800_refresh_rate; +#endif + lasttime += deltatime; + curtime = Util_time(); + if (Atari800_auto_frameskip) + autoframeskip(curtime, lasttime); + Util_sleep(lasttime - curtime); + curtime = Util_time(); + + if ((lasttime + deltatime) < curtime) + lasttime = curtime; +} + +#if defined(BASIC) || defined(VERY_SLOW) || defined(CURSES_BASIC) + +static int scanlines_to_dl; + +/* steal cycles and generate DLI */ +static void basic_antic_scanline(void) +{ + static UBYTE IR = 0; + static const UBYTE mode_scanlines[16] = + { 0, 0, 8, 10, 8, 16, 8, 16, 8, 4, 4, 2, 1, 2, 1, 1 }; + static const UBYTE mode_bytes[16] = + { 0, 0, 40, 40, 40, 40, 20, 20, 10, 10, 20, 20, 20, 40, 40, 40 }; + static const UBYTE font40_cycles[4] = { 0, 32, 40, 47 }; + static const UBYTE font20_cycles[4] = { 0, 16, 20, 24 }; +#ifdef CURSES_BASIC + static int scanlines_to_curses_display = 0; + static UWORD screenaddr = 0; + static UWORD newscreenaddr = 0; +#endif + + int bytes = 0; + if (--scanlines_to_dl <= 0) { + if (ANTIC_DMACTL & 0x20) { + IR = ANTIC_GetDLByte(&ANTIC_dlist); + ANTIC_xpos++; + } + else + IR &= 0x7f; /* repeat last instruction, but don't generate DLI */ + switch (IR & 0xf) { + case 0: + scanlines_to_dl = ((IR >> 4) & 7) + 1; + break; + case 1: + if (ANTIC_DMACTL & 0x20) { + ANTIC_dlist = ANTIC_GetDLWord(&ANTIC_dlist); + ANTIC_xpos += 2; + } + scanlines_to_dl = (IR & 0x40) ? 1024 /* no more DL in this frame */ : 1; + break; + default: + if (IR & 0x40 && ANTIC_DMACTL & 0x20) { +#ifdef CURSES_BASIC + screenaddr = +#endif + ANTIC_GetDLWord(&ANTIC_dlist); + ANTIC_xpos += 2; + } + /* can't steal cycles now, because DLI must come first */ + /* just an approximation: doesn't check HSCROL */ + switch (ANTIC_DMACTL & 3) { + case 1: + bytes = mode_bytes[IR & 0xf] * 8 / 10; + break; + case 2: + bytes = mode_bytes[IR & 0xf]; + break; + case 3: + bytes = mode_bytes[IR & 0xf] * 12 / 10; + break; + default: + break; + } +#ifdef CURSES_BASIC + /* Normally, we would call curses_display_line here, + and not use scanlines_to_curses_display at all. + That would however cause incorrect color of the "MEMORY" + menu item in Self Test - it isn't set properly + in the first scanline. We therefore postpone + curses_display_line call to the next scanline. */ + scanlines_to_curses_display = 2; + newscreenaddr = screenaddr + bytes; +#endif + /* just an approximation: doesn't check VSCROL */ + scanlines_to_dl = mode_scanlines[IR & 0xf]; + break; + } + } + if (scanlines_to_dl == 1 && (IR & 0x80)) { + CPU_GO(ANTIC_NMIST_C); + ANTIC_NMIST = 0x9f; + if (ANTIC_NMIEN & 0x80) { + CPU_GO(ANTIC_NMI_C); + CPU_NMI(); + } + } +#ifdef CURSES_BASIC + if (--scanlines_to_curses_display == 0) { + curses_display_line(IR & 0xf, MEMORY_mem + screenaddr); + /* 4k wrap */ + if (((screenaddr ^ newscreenaddr) & 0x1000) != 0) + screenaddr = newscreenaddr - 0x1000; + else + screenaddr = newscreenaddr; + } +#endif + ANTIC_xpos += bytes; + /* steal cycles in font modes */ + switch (IR & 0xf) { + case 2: + case 3: + case 4: + case 5: + ANTIC_xpos += font40_cycles[ANTIC_DMACTL & 3]; + break; + case 6: + case 7: + ANTIC_xpos += font20_cycles[ANTIC_DMACTL & 3]; + break; + default: + break; + } +} + +#define BASIC_LINE CPU_GO(ANTIC_LINE_C); ANTIC_xpos -= ANTIC_LINE_C - ANTIC_DMAR; ANTIC_screenline_cpu_clock += ANTIC_LINE_C; ANTIC_ypos++ + +static void basic_frame(void) +{ + /* scanlines 0 - 7 */ + ANTIC_ypos = 0; + do { + POKEY_Scanline(); /* check and generate IRQ */ + BASIC_LINE; + } while (ANTIC_ypos < 8); + + scanlines_to_dl = 1; + /* scanlines 8 - 247 */ + do { + POKEY_Scanline(); /* check and generate IRQ */ + basic_antic_scanline(); + BASIC_LINE; + } while (ANTIC_ypos < 248); + + /* scanline 248 */ + POKEY_Scanline(); /* check and generate IRQ */ + CPU_GO(ANTIC_NMIST_C); + ANTIC_NMIST = 0x5f; /* Set VBLANK */ + if (ANTIC_NMIEN & 0x40) { + CPU_GO(ANTIC_NMI_C); + CPU_NMI(); + } + BASIC_LINE; + + /* scanlines 249 - 261(311) */ + do { + POKEY_Scanline(); /* check and generate IRQ */ + BASIC_LINE; + } while (ANTIC_ypos < Atari800_tv_mode); +} + +#endif /* defined(BASIC) || defined(VERY_SLOW) || defined(CURSES_BASIC) */ + +void Atari800_Frame(void) +{ +#ifndef BASIC + static int refresh_counter = 0; + +#ifdef HAVE_SIGNAL + if (sigint_flag) { + sigint_flag = FALSE; + INPUT_key_code = AKEY_UI; + UI_alt_function = UI_MENU_MONITOR; + } +#endif /* HAVE_SIGNAL */ + + switch (INPUT_key_code) { + case AKEY_COLDSTART: + Atari800_Coldstart(); + break; + case AKEY_WARMSTART: + Atari800_Warmstart(); + break; + case AKEY_EXIT: + Atari800_Exit(FALSE); + exit(0); + case AKEY_TURBO: + Atari800_turbo = !Atari800_turbo; + break; + case AKEY_UI: +#ifdef SOUND + Sound_Pause(); +#endif + UI_Run(); +#ifdef SOUND + Sound_Continue(); +#endif + break; +#ifndef CURSES_BASIC + case AKEY_SCREENSHOT: + Screen_SaveNextScreenshot(FALSE); + break; + case AKEY_SCREENSHOT_INTERLACE: + Screen_SaveNextScreenshot(TRUE); + break; +#endif /* CURSES_BASIC */ + case AKEY_PBI_BB_MENU: +#ifdef PBI_BB + PBI_BB_Menu(); +#endif + break; + default: + break; + } +#endif /* BASIC */ + +#ifdef PBI_BB + PBI_BB_Frame(); /* just to make the menu key go up automatically */ +#endif +#if defined(PBI_XLD) || defined (VOICEBOX) + VOTRAXSND_Frame(); /* for the Votrax */ +#endif + Devices_Frame(); +#ifndef BASIC + INPUT_Frame(); +#endif + GTIA_Frame(); + +#ifdef BASIC + basic_frame(); +#else /* BASIC */ + if (++refresh_counter >= Atari800_refresh_rate) { + refresh_counter = 0; +#ifdef USE_CURSES + curses_clear_screen(); +#endif +#ifdef CURSES_BASIC + basic_frame(); +#else + ANTIC_Frame(TRUE); + INPUT_DrawMousePointer(); + Screen_DrawAtariSpeed(Util_time()); + Screen_DrawDiskLED(); + Screen_Draw1200LED(); +#endif /* CURSES_BASIC */ +#ifdef DONT_DISPLAY + Atari800_display_screen = FALSE; +#else + Atari800_display_screen = TRUE; +#endif /* DONT_DISPLAY */ + } + else { +#if defined(VERY_SLOW) || defined(CURSES_BASIC) + basic_frame(); +#else + ANTIC_Frame(Atari800_collisions_in_skipped_frames); +#endif + Atari800_display_screen = FALSE; + } +#endif /* BASIC */ + POKEY_Frame(); +#ifdef SOUND + Sound_Update(); +#endif + Atari800_nframes++; +#ifdef BENCHMARK + if (Atari800_nframes >= BENCHMARK) { + double benchmark_time = Util_time() - benchmark_start_time; + Atari800_ErrExit(); + printf("%d frames emulated in %.2f seconds\n", BENCHMARK, benchmark_time); + exit(0); + } +#else + +#ifdef ALTERNATE_SYNC_WITH_HOST + if (refresh_counter == 0) +#endif + if (Atari800_turbo) { + /* No need to draw Atari frames with frequency higher than display + refresh rate. */ + static double last_display_screen_time = 0.0; + static double const limit = 1.0 / 60.0; /* refresh every 1/60 s */ + /* TODO Actually sync the limit with the display refresh rate. */ + double cur_time = Util_time(); + if (cur_time - last_display_screen_time > limit) + last_display_screen_time = cur_time; + else + Atari800_display_screen = FALSE; + } + else + Atari800_Sync(); +#endif /* BENCHMARK */ +} + +#endif /* __PLUS */ + +#ifndef BASIC + +void Atari800_StateSave(void) +{ + UBYTE temp = Atari800_tv_mode == Atari800_TV_PAL; + StateSav_SaveUBYTE(&temp, 1); + temp = Atari800_machine_type; + StateSav_SaveUBYTE(&temp, 1); + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + temp = Atari800_builtin_basic; + StateSav_SaveUBYTE(&temp, 1); + temp = Atari800_keyboard_leds; + StateSav_SaveUBYTE(&temp, 1); + temp = Atari800_f_keys; + StateSav_SaveUBYTE(&temp, 1); + temp = Atari800_jumper; + StateSav_SaveUBYTE(&temp, 1); + temp = Atari800_builtin_game; + StateSav_SaveUBYTE(&temp, 1); + temp = Atari800_keyboard_detached; + StateSav_SaveUBYTE(&temp, 1); + } +} + +void Atari800_StateRead(UBYTE version) +{ + if (version >= 7) { + UBYTE temp; + StateSav_ReadUBYTE(&temp, 1); + Atari800_SetTVMode(temp ? Atari800_TV_PAL : Atari800_TV_NTSC); + StateSav_ReadUBYTE(&temp, 1); + if (temp < 0 || temp >= Atari800_MACHINE_SIZE) { + temp = Atari800_MACHINE_XLXE; + Log_print("Warning: Bad machine type read in from state save, defaulting to XL/XE"); + } + Atari800_SetMachineType(temp); + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + StateSav_ReadUBYTE(&temp, 1); + Atari800_builtin_basic = temp != 0; + StateSav_ReadUBYTE(&temp, 1); + Atari800_keyboard_leds = temp != 0; + StateSav_ReadUBYTE(&temp, 1); + Atari800_f_keys = temp != 0; + StateSav_ReadUBYTE(&temp, 1); + Atari800_jumper = temp != 0; + Atari800_UpdateJumper(); + StateSav_ReadUBYTE(&temp, 1); + Atari800_builtin_game = temp != 0; + StateSav_ReadUBYTE(&temp, 1); + Atari800_keyboard_detached = temp != 0; + Atari800_UpdateKeyboardDetached(); + } + } + else { /* savestate from version 2.2.1 or earlier */ + int new_tv_mode; + /* these are all for compatibility with previous versions */ + UBYTE temp; + int default_tv_mode; + int os; + int default_system; + int pil_on; + + StateSav_ReadUBYTE(&temp, 1); + new_tv_mode = (temp == 0) ? Atari800_TV_PAL : Atari800_TV_NTSC; + Atari800_SetTVMode(new_tv_mode); + + StateSav_ReadUBYTE(&temp, 1); + StateSav_ReadINT(&os, 1); + switch (temp) { + case 0: + Atari800_machine_type = Atari800_MACHINE_800; + MEMORY_ram_size = 48; + break; + case 1: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 64; + break; + case 2: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 128; + break; + case 3: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = MEMORY_RAM_320_COMPY_SHOP; + break; + case 4: + Atari800_machine_type = Atari800_MACHINE_5200; + MEMORY_ram_size = 16; + break; + case 5: + Atari800_machine_type = Atari800_MACHINE_800; + MEMORY_ram_size = 16; + break; + case 6: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 16; + break; + case 7: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 576; + break; + case 8: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 1088; + break; + case 9: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 192; + break; + default: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 64; + Log_print("Warning: Bad machine type read in from state save, defaulting to 800 XL"); + break; + } + + StateSav_ReadINT(&pil_on, 1); + StateSav_ReadINT(&default_tv_mode, 1); + StateSav_ReadINT(&default_system, 1); + Atari800_SetMachineType(Atari800_machine_type); + } + load_roms(); + /* XXX: what about patches? */ +} + +#endif + +void Atari800_SetTVMode(int mode) +{ + if (mode != Atari800_tv_mode) { + Atari800_tv_mode = mode; +#if !defined(BASIC) && !defined(CURSES_BASIC) + Colours_SetVideoSystem(mode); + ARTIFACT_SetTVMode(mode); +#endif +#if SUPPORTS_CHANGE_VIDEOMODE + VIDEOMODE_SetVideoSystem(mode); +#endif +#ifdef SOUND +#ifdef SOUND_THIN_API + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, Sound_out.freq, Sound_out.channels, Sound_out.sample_size == 2 ? POKEYSND_BIT16 : 0); +#elif defined(SUPPORTS_SOUND_REINIT) + Sound_Reinit(); +#endif /* defined(SUPPORTS_SOUND_REINIT) */ +#endif /* SOUND */ +#if defined(DIRECTX) + SetTVModeMenuItem(mode); +#endif + } +} diff --git a/PVAtari800/atari800-src/atari.h b/PVAtari800/atari800-src/atari.h new file mode 100644 index 0000000000..de52cbacfc --- /dev/null +++ b/PVAtari800/atari800-src/atari.h @@ -0,0 +1,190 @@ +#ifndef ATARI_H_ +#define ATARI_H_ + +#include "config.h" +#include /* FILENAME_MAX */ +#ifdef HAVE_WINDOWS_H +#include +#endif + +/* Fundamental declarations ---------------------------------------------- */ + +#define Atari800_TITLE "Atari 800 Emulator, Version 3.1.0" + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +/* SBYTE and UBYTE must be exactly 1 byte long. */ +/* SWORD and UWORD must be exactly 2 bytes long. */ +/* SLONG and ULONG must be exactly 4 bytes long. */ +#define SBYTE signed char +#define SWORD signed short +#define SLONG signed int +#define UBYTE unsigned char +#define UWORD unsigned short +#ifndef HAVE_WINDOWS_H +/* Windows headers typedef ULONG */ +#define ULONG unsigned int +#endif +/* Note: in various parts of the emulator we assume that char is 1 byte + and int is 4 bytes. */ + + +/* Public interface ------------------------------------------------------ */ + +/* Machine type. */ +enum { + Atari800_MACHINE_800, + Atari800_MACHINE_XLXE, + Atari800_MACHINE_5200, + /* Number of values in the emumerator */ + Atari800_MACHINE_SIZE +}; +/* Don't change this variable directly; use Atari800_SetMachineType() instead. */ +extern int Atari800_machine_type; +void Atari800_SetMachineType(int type); + +/* Always call Atari800_InitialiseMachine() after changing Atari800_machine_type + or MEMORY_ram_size! */ + +/* Indicates if machine has BASIC built in. */ +extern int Atari800_builtin_basic; + +/* Indicates existence of 1200XL's two keyboard LEDs. + Used only for Atari800_MACHINE_XLXE. */ +extern int Atari800_keyboard_leds; + +/* Indicates existence of F1-F4 keys. + Used only for Atari800_MACHINE_XLXE. */ +extern int Atari800_f_keys; + +/* State of the J1 jumper on the 1200XL board. + Used only for Atari800_MACHINE_XLXE. Always call + Atari800_UpdateJumper() after changing this variable. */ +extern int Atari800_jumper; +void Atari800_UpdateJumper(void); + +/* Indicates existence of XEGS' built-in game. + Used only for Atari800_MACHINE_XLXE. */ +extern int Atari800_builtin_game; + +/* TRUE if the XEGS keyboard is detached. + Used only for Atari800_MACHINE_XLXE. Always call + Atari800_UpdateKeyboardDetached() after changing this variable. */ +extern int Atari800_keyboard_detached; +void Atari800_UpdateKeyboardDetached(void); + +/* Video system. */ +#define Atari800_TV_UNSET 0 +#define Atari800_TV_PAL 312 +#define Atari800_TV_NTSC 262 +#define Atari800_FPS_PAL 49.8607597 +/*49.8607597 = (4.43361875*(4/5)*1000000)/(312*228)*/ +#define Atari800_FPS_NTSC 59.9227434 +/*59.9227434 = (3.579545*1000000)/(262*228)*/ + +/* Video system / Number of scanlines per frame. Do not set this variable + directly; instead use Atari800_SetTVMode(). */ +extern int Atari800_tv_mode; + +/* TRUE to disable Atari BASIC when booting Atari (hold Option in XL/XE). */ +extern int Atari800_disable_basic; + +/* OS ROM version currently used by the emulator. Can be -1 for emuos/missing + ROM, or a value from the SYSROM enumerator. */ +extern int Atari800_os_version; + +/* If Atari800_Frame() sets it to TRUE, then the current contents + of Screen_atari should be displayed. */ +extern int Atari800_display_screen; + +/* Simply incremented by Atari800_Frame(). */ +extern int Atari800_nframes; + +/* How often the screen is updated (1 = every Atari frame). */ +extern int Atari800_refresh_rate; + +/* If TRUE, will try to maintain the emulation speed to 100% */ +extern int Atari800_auto_frameskip; + +/* Set to TRUE for faster emulation with Atari800_refresh_rate > 1. + Set to FALSE for accurate emulation with Atari800_refresh_rate > 1. */ +extern int Atari800_collisions_in_skipped_frames; + +/* Set to TRUE to run emulated Atari as fast as possible */ +extern int Atari800_turbo; + +/* Initializes Atari800 emulation core. */ +int Atari800_Initialise(int *argc, char *argv[]); + +/* Emulates one frame (1/50sec for PAL, 1/60sec for NTSC). */ +void Atari800_Frame(void); + +/* Reboots the emulated Atari. */ +void Atari800_Coldstart(void); + +/* Presses the Reset key in the emulated Atari. */ +void Atari800_Warmstart(void); + +/* Reinitializes after Atari800_machine_type or ram_size change. + You should call Atari800_Coldstart() after it. */ +int Atari800_InitialiseMachine(void); + +/* Shuts down Atari800 emulation core and saves the config file if needed. + * Use it when a user requested exiting/entering a monitor. */ +int Atari800_Exit(int run_monitor); + +/* Shuts down Atari800 emulation core. Use it for emergency-exiting + such as on failure. */ +void Atari800_ErrExit(void); + + +/* Private interface ----------------------------------------------------- */ +/* Don't use outside the emulation core! */ + +/* STAT_UNALIGNED_WORDS is solely for benchmarking purposes. + 8-element arrays (stat_arr) represent number of accesses with the given + value of 3 least significant bits of address. This gives us information + about the ratio of aligned vs unaligned accesses. */ +#ifdef STAT_UNALIGNED_WORDS +#define UNALIGNED_STAT_DEF(stat_arr) unsigned int stat_arr[8]; +#define UNALIGNED_STAT_DECL(stat_arr) extern unsigned int stat_arr[8]; +#define UNALIGNED_GET_WORD(ptr, stat_arr) (stat_arr[(unsigned int) (ptr) & 7]++, *(const UWORD *) (ptr)) +#define UNALIGNED_PUT_WORD(ptr, value, stat_arr) (stat_arr[(unsigned int) (ptr) & 7]++, *(UWORD *) (ptr) = (value)) +#define UNALIGNED_GET_LONG(ptr, stat_arr) (stat_arr[(unsigned int) (ptr) & 7]++, *(const ULONG *) (ptr)) +#define UNALIGNED_PUT_LONG(ptr, value, stat_arr) (stat_arr[(unsigned int) (ptr) & 7]++, *(ULONG *) (ptr) = (value)) +UNALIGNED_STAT_DECL(Screen_atari_write_long_stat) +UNALIGNED_STAT_DECL(pm_scanline_read_long_stat) +UNALIGNED_STAT_DECL(memory_read_word_stat) +UNALIGNED_STAT_DECL(memory_write_word_stat) +UNALIGNED_STAT_DECL(memory_read_aligned_word_stat) +UNALIGNED_STAT_DECL(memory_write_aligned_word_stat) +#else +#define UNALIGNED_STAT_DEF(stat_arr) +#define UNALIGNED_STAT_DECL(stat_arr) +#define UNALIGNED_GET_WORD(ptr, stat_arr) (*(const UWORD *) (ptr)) +#define UNALIGNED_PUT_WORD(ptr, value, stat_arr) (*(UWORD *) (ptr) = (value)) +#define UNALIGNED_GET_LONG(ptr, stat_arr) (*(const ULONG *) (ptr)) +#define UNALIGNED_PUT_LONG(ptr, value, stat_arr) (*(ULONG *) (ptr) = (value)) +#endif + +/* Sleeps until it's time to emulate next Atari frame. */ +void Atari800_Sync(void); + +/* Load a ROM image filename of size nbytes into buffer */ +int Atari800_LoadImage(const char *filename, UBYTE *buffer, int nbytes); + +/* Save State */ +void Atari800_StateSave(void); + +/* Read State */ +void Atari800_StateRead(UBYTE version); + +/* Change TV mode. */ +void Atari800_SetTVMode(int mode); + +#endif /* ATARI_H_ */ diff --git a/PVAtari800/atari800-src/atari_basic.c b/PVAtari800/atari800-src/atari_basic.c new file mode 100644 index 0000000000..a4a9548787 --- /dev/null +++ b/PVAtari800/atari800-src/atari_basic.c @@ -0,0 +1,64 @@ +/* + * atari_basic.c - Text-only specific port code + * + * Copyright (c) 1995-1998 David Firth + * Copyright (c) 1998-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "config.h" +#include "monitor.h" +#include "log.h" +#include "platform.h" +#ifdef SOUND +#include "sound.h" +#endif + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ +#ifdef SOUND + if (!Sound_Initialise(argc, argv)) + return FALSE; +#endif + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + Log_flushlog(); + + if (run_monitor && MONITOR_Run()) + return TRUE; + + return FALSE; +} + +int main(int argc, char **argv) +{ + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 3; + + /* main loop */ + while (TRUE) { + Atari800_Frame(); + } +} diff --git a/PVAtari800/atari800-src/atari_curses.c b/PVAtari800/atari800-src/atari_curses.c new file mode 100644 index 0000000000..1f78d8ed89 --- /dev/null +++ b/PVAtari800/atari800-src/atari_curses.c @@ -0,0 +1,860 @@ +/* + * atari_curses.c - Curses based port code + * + * Copyright (c) 1995-1998 David Firth + * Copyright (c) 1998-2014 Atari800 development team (see DOC/CREDITS) + + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#ifdef USE_NCURSES +#include +#else +#include +#endif + +#include "antic.h" /* ypos */ +#include "atari.h" +#include "gtia.h" /* GTIA_COLPFx */ +#include "input.h" +#include "akey.h" +#include "log.h" +#include "monitor.h" +#include "platform.h" +#include "ui.h" /* UI_alt_function */ + +#ifdef SOUND +#include "sound.h" +#endif + +#define CURSES_LEFT 0 +#define CURSES_CENTRAL 1 +#define CURSES_RIGHT 2 +#define CURSES_WIDE_1 3 +#define CURSES_WIDE_2 4 + +static int curses_mode = CURSES_LEFT; + +static int curses_screen[24][40]; + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-left") == 0) + curses_mode = CURSES_LEFT; + else if (strcmp(argv[i], "-central") == 0) + curses_mode = CURSES_CENTRAL; + else if (strcmp(argv[i], "-right") == 0) + curses_mode = CURSES_RIGHT; + else if (strcmp(argv[i], "-wide1") == 0) + curses_mode = CURSES_WIDE_1; + else if (strcmp(argv[i], "-wide2") == 0) + curses_mode = CURSES_WIDE_2; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-central Center emulated screen\n" + "\t-left Align left\n" + "\t-right Align right (on 80 columns)\n" + "\t-wide1 Use 80 columns\n" + "\t-wide2 Use 80 columns, display twice" + ); + } + argv[j++] = argv[i]; + } + } + + *argc = j; + + initscr(); + noecho(); + cbreak(); /* Don't wait for carriage return */ + keypad(stdscr, TRUE); + curs_set(0); /* Disable Cursor */ + nodelay(stdscr, 1); /* Don't block for keypress */ + +#ifdef SOUND + if (!Sound_Initialise(argc, argv)) + return FALSE; +#endif + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + curs_set(1); + endwin(); + Log_flushlog(); + + if (run_monitor && MONITOR_Run()) { + curs_set(0); + return TRUE; + } + return FALSE; +} + +void curses_clear_screen(void) +{ + int x; + int y; + for (y = 0; y < 24; y++) + for (x = 0; x < 40; x++) + curses_screen[y][x] = ' '; +} + +void curses_clear_rectangle(int x1, int y1, int x2, int y2) +{ + int x; + int y; + for (y = y1; y <= y2; y++) + for (x = x1; x <= x2; x++) + curses_screen[y][x] = ' '; +} + +void curses_putch(int x, int y, int ascii, UBYTE fg, UBYTE bg) +{ + /* handle line drawing chars */ + switch (ascii) { + case 18: + ascii = '-'; + break; + case 17: + case 3: + ascii = '/'; + break; + case 26: + case 5: + ascii = '\\'; + break; + case 124: + ascii = '|'; + break; + default: + break; + } + if ((bg & 0xf) > (fg & 0xf)) + curses_screen[y][x] = ascii + A_REVERSE; + else + curses_screen[y][x] = ascii; +} + +void curses_display_line(int anticmode, const UBYTE *screendata) +{ + int y; + int *p; + int w; + if (ANTIC_ypos < 32 || ANTIC_ypos >= 224) + return; + y = (ANTIC_ypos >> 3) - 4; + p = &(curses_screen[y][0]); + switch (anticmode) { + case 2: + case 3: + case 4: + case 5: + switch (ANTIC_DMACTL & 3) { + case 1: + p += 4; + w = 32; + break; + case 2: + w = 40; + break; + case 3: + screendata += 4; + w = 40; + break; + default: + return; + } + do { + static const int offset[8] = { + 0x20, /* 0x00-0x1f: Numbers + !"$% etc. */ + 0x20, /* 0x20-0x3f: Upper Case Characters */ + A_BOLD, /* 0x40-0x5f: Control Characters */ + 0, /* 0x60-0x7f: Lower Case Characters */ + -0x80 + 0x20 + A_REVERSE, /* 0x80-0x9f: Numbers + !"$% etc. */ + -0x80 + 0x20 + A_REVERSE, /* 0xa0-0xbf: Upper Case Characters */ + -0x80 + A_BOLD + A_REVERSE, /* 0xc0-0xdf: Control Characters */ + -0x80 + A_REVERSE /* 0xe0-0xff: Lower Case Characters */ + }; + UBYTE c = *screendata++; + /* PDCurses prints '\x7f' as "^?". + This causes problems if this is the last character in line. + Use bold '>' for Atari's Tab symbol (filled right-pointing triangle). */ + if (c == 0x7f) + *p = '>' + A_BOLD; + else if (c == 0xff) + *p = '>' + A_BOLD + A_REVERSE; + else + *p = c + offset[c >> 5]; + p++; + } while (--w); + break; + case 6: + case 7: + switch (ANTIC_DMACTL & 3) { + case 1: + p += 12; + w = 16; + break; + case 2: + p += 10; + w = 20; + break; + case 3: + p += 8; + w = 24; + break; + default: + return; + } + { +#define LIGHT_THRESHOLD 0x0c + int light[4]; + light[0] = (GTIA_COLPF0 & 0x0e) >= LIGHT_THRESHOLD ? 0x20 + A_BOLD : 0x20; + light[1] = (GTIA_COLPF1 & 0x0e) >= LIGHT_THRESHOLD ? -0x40 + 0x20 + A_BOLD : -0x40 + 0x20; + light[2] = (GTIA_COLPF2 & 0x0e) >= LIGHT_THRESHOLD ? -0x80 + 0x20 + A_BOLD : -0x80 + 0x20; + light[3] = (GTIA_COLPF3 & 0x0e) >= LIGHT_THRESHOLD ? -0xc0 + 0x20 + A_BOLD : -0xc0 + 0x20; + do { + *p++ = *screendata + light[*screendata >> 6]; + screendata++; + } while (--w); + } + break; + default: + break; + } +} + +void PLATFORM_DisplayScreen(void) +{ + int x; + int y; + for (y = 0; y < 24; y++) { + for (x = 0; x < 40; x++) { + int ch = curses_screen[y][x]; + switch (curses_mode) { + default: + case CURSES_LEFT: + move(y, x); + break; + case CURSES_CENTRAL: + move(y, 20 + x); + break; + case CURSES_RIGHT: + move(y, 40 + x); + break; + case CURSES_WIDE_1: + move(y, x + x); + break; + case CURSES_WIDE_2: + move(y, x + x); + addch(ch); + ch = ' ' + (ch & A_REVERSE); + break; + } + addch(ch); + } + } + refresh(); +} + +int PLATFORM_Keyboard(void) +{ + int keycode = getch(); + +#if 0 + /* for debugging */ + if (keycode > 0) { + Atari800_ErrExit(); + printf("keycode == %d (0x%x)\n", keycode, keycode); + exit(1); + } +#endif + + INPUT_key_consol = INPUT_CONSOL_NONE; + + switch (keycode) { + case 0x01: + keycode = AKEY_CTRL_a; + break; + case 0x02: + keycode = AKEY_CTRL_b; + break; + case 0x03 : + keycode = AKEY_CTRL_c; + break; + case 0x04: + keycode = AKEY_CTRL_d; + break; + case 0x05: + keycode = AKEY_CTRL_e; + break; + case 0x06: + keycode = AKEY_CTRL_f; + break; + case 0x07: + keycode = AKEY_CTRL_g; + break; +/* + case 0x08: + keycode = AKEY_CTRL_h; + break; + */ + case 0x09: + keycode = AKEY_TAB; + break; +/* + case 0x0a: + keycode = AKEY_CTRL_j; + break; + */ + case 0x0b: + keycode = AKEY_CTRL_k; + break; + case 0x0c: + keycode = AKEY_CTRL_l; + break; +/* + case 0x0d: + keycode = AKEY_CTRL_m; + break; + */ + case 0x0e: + keycode = AKEY_CTRL_n; + break; + case 0x0f: + keycode = AKEY_CTRL_o; + break; + case 0x10: + keycode = AKEY_CTRL_p; + break; + case 0x11: + keycode = AKEY_CTRL_q; + break; + case 0x12: + keycode = AKEY_CTRL_r; + break; + case 0x13: + keycode = AKEY_CTRL_s; + break; + case 0x14: + keycode = AKEY_CTRL_t; + break; + case 0x15: + keycode = AKEY_CTRL_u; + break; + case 0x16: + keycode = AKEY_CTRL_v; + break; + case 0x17: + keycode = AKEY_CTRL_w; + break; + case 0x18: + keycode = AKEY_CTRL_x; + break; + case 0x19: + keycode = AKEY_CTRL_y; + break; + case 0x1a: + keycode = AKEY_CTRL_z; + break; + case '`': + keycode = AKEY_CAPSTOGGLE; + break; + case '!': + keycode = AKEY_EXCLAMATION; + break; + case '"': + keycode = AKEY_DBLQUOTE; + break; + case '#': + keycode = AKEY_HASH; + break; + case '$': + keycode = AKEY_DOLLAR; + break; + case '%': + keycode = AKEY_PERCENT; + break; + case '&': + keycode = AKEY_AMPERSAND; + break; + case '\'': + keycode = AKEY_QUOTE; + break; + case '@': + keycode = AKEY_AT; + break; + case '(': + keycode = AKEY_PARENLEFT; + break; + case ')': + keycode = AKEY_PARENRIGHT; + break; + case '[': + keycode = AKEY_BRACKETLEFT; + break; + case ']': + keycode = AKEY_BRACKETRIGHT; + break; + case '<': + keycode = AKEY_LESS; + break; + case '>': + keycode = AKEY_GREATER; + break; + case '=': + keycode = AKEY_EQUAL; + break; + case '?': + keycode = AKEY_QUESTION; + break; +#ifdef PADMINUS + case PADMINUS: +#endif + case '-': + keycode = AKEY_MINUS; + break; +#ifdef PADPLUS + case PADPLUS: +#endif + case '+': + keycode = AKEY_PLUS; + break; +#ifdef PADSTAR + case PADSTAR: +#endif + case '*': + keycode = AKEY_ASTERISK; + break; +#ifdef PADSLASH + case PADSLASH: +#endif + case '/': + keycode = AKEY_SLASH; + break; + case ':': + keycode = AKEY_COLON; + break; + case ';': + keycode = AKEY_SEMICOLON; + break; + case ',': + keycode = AKEY_COMMA; + break; + case '.': + keycode = AKEY_FULLSTOP; + break; + case '_': + keycode = AKEY_UNDERSCORE; + break; + case '^': + keycode = AKEY_CIRCUMFLEX; + break; + case '\\': + keycode = AKEY_BACKSLASH; + break; + case '|': + keycode = AKEY_BAR; + break; + case ' ': + keycode = AKEY_SPACE; + break; + case '0': + keycode = AKEY_0; + break; + case '1': + keycode = AKEY_1; + break; + case '2': + keycode = AKEY_2; + break; + case '3': + keycode = AKEY_3; + break; + case '4': + keycode = AKEY_4; + break; + case '5': + keycode = AKEY_5; + break; + case '6': + keycode = AKEY_6; + break; + case '7': + keycode = AKEY_7; + break; + case '8': + keycode = AKEY_8; + break; + case '9': + keycode = AKEY_9; + break; + case 'a': + keycode = AKEY_a; + break; + case 'b': + keycode = AKEY_b; + break; + case 'c': + keycode = AKEY_c; + break; + case 'd': + keycode = AKEY_d; + break; + case 'e': + keycode = AKEY_e; + break; + case 'f': + keycode = AKEY_f; + break; + case 'g': + keycode = AKEY_g; + break; + case 'h': + keycode = AKEY_h; + break; + case 'i': + keycode = AKEY_i; + break; + case 'j': + keycode = AKEY_j; + break; + case 'k': + keycode = AKEY_k; + break; + case 'l': + keycode = AKEY_l; + break; + case 'm': + keycode = AKEY_m; + break; + case 'n': + keycode = AKEY_n; + break; + case 'o': + keycode = AKEY_o; + break; + case 'p': + keycode = AKEY_p; + break; + case 'q': + keycode = AKEY_q; + break; + case 'r': + keycode = AKEY_r; + break; + case 's': + keycode = AKEY_s; + break; + case 't': + keycode = AKEY_t; + break; + case 'u': + keycode = AKEY_u; + break; + case 'v': + keycode = AKEY_v; + break; + case 'w': + keycode = AKEY_w; + break; + case 'x': + keycode = AKEY_x; + break; + case 'y': + keycode = AKEY_y; + break; + case 'z': + keycode = AKEY_z; + break; + case 'A': + keycode = AKEY_A; + break; + case 'B': + keycode = AKEY_B; + break; + case 'C': + keycode = AKEY_C; + break; + case 'D': + keycode = AKEY_D; + break; + case 'E': + keycode = AKEY_E; + break; + case 'F': + keycode = AKEY_F; + break; + case 'G': + keycode = AKEY_G; + break; + case 'H': + keycode = AKEY_H; + break; + case 'I': + keycode = AKEY_I; + break; + case 'J': + keycode = AKEY_J; + break; + case 'K': + keycode = AKEY_K; + break; + case 'L': + keycode = AKEY_L; + break; + case 'M': + keycode = AKEY_M; + break; + case 'N': + keycode = AKEY_N; + break; + case 'O': + keycode = AKEY_O; + break; + case 'P': + keycode = AKEY_P; + break; + case 'Q': + keycode = AKEY_Q; + break; + case 'R': + keycode = AKEY_R; + break; + case 'S': + keycode = AKEY_S; + break; + case 'T': + keycode = AKEY_T; + break; + case 'U': + keycode = AKEY_U; + break; + case 'V': + keycode = AKEY_V; + break; + case 'W': + keycode = AKEY_W; + break; + case 'X': + keycode = AKEY_X; + break; + case 'Y': + keycode = AKEY_Y; + break; + case 'Z': + keycode = AKEY_Z; + break; + case 0x1b: + keycode = AKEY_ESCAPE; + break; + case KEY_F0 + 1: + keycode = AKEY_UI; + break; + case KEY_F0 + 2: + INPUT_key_consol &= ~INPUT_CONSOL_OPTION; + keycode = AKEY_NONE; + break; + case KEY_F0 + 3: + INPUT_key_consol &= ~INPUT_CONSOL_SELECT; + keycode = AKEY_NONE; + break; + case KEY_F0 + 4: + INPUT_key_consol &= ~INPUT_CONSOL_START; + keycode = AKEY_NONE; + break; + case KEY_F0 + 5: + keycode = AKEY_WARMSTART; + break; +#ifdef KEY_HELP + case KEY_HELP: +#endif +#ifdef KEY_SHELP + case KEY_SHELP: +#endif +#ifdef KEY_LHELP + case KEY_LHELP: +#endif + case KEY_F0 + 6: + keycode = AKEY_HELP; + break; +#ifdef KEY_BREAK + case KEY_BREAK: +#endif + case KEY_F0 + 7: + keycode = AKEY_BREAK; + break; + case KEY_F0 + 8: + keycode = PLATFORM_Exit(TRUE) ? AKEY_NONE : AKEY_EXIT; + break; + case KEY_F0 + 9: + keycode = AKEY_EXIT; + break; + case KEY_F0 + 10: + keycode = AKEY_SCREENSHOT; + break; + case KEY_DOWN: + keycode = AKEY_DOWN; + break; + case KEY_LEFT: + keycode = AKEY_LEFT; + break; + case KEY_RIGHT: + keycode = AKEY_RIGHT; + break; + case KEY_UP: + keycode = AKEY_UP; + break; + case 8: + case 127: +#ifdef KEY_BACKSPACE +# if KEY_BACKSPACE != 8 && KEY_BACKSPACE != 127 + case KEY_BACKSPACE: +# endif +#endif + keycode = AKEY_BACKSPACE; + break; +#ifdef PADENTER + case PADENTER: +#endif + case KEY_ENTER: + case '\n': + keycode = AKEY_RETURN; + break; +#ifdef KEY_HOME + case KEY_HOME: + keycode = AKEY_CLEAR; + break; +#endif +#ifdef KEY_CLEAR + case KEY_CLEAR: + keycode = AKEY_CLEAR; + break; +#endif +#ifdef KEY_IC + case KEY_IC: + keycode = AKEY_INSERT_CHAR; + break; +#endif +#ifdef KEY_IL + case KEY_IL: + keycode = AKEY_INSERT_LINE; + break; +#endif +#ifdef KEY_DC + case KEY_DC: + keycode = AKEY_DELETE_CHAR; + break; +#endif +#ifdef KEY_DL + case KEY_DL: + keycode = AKEY_DELETE_LINE; + break; +#endif +#ifdef KEY_STAB + case KEY_STAB: + keycode = AKEY_SETTAB; + break; +#endif +#ifdef KEY_CTAB + case KEY_CTAB: + keycode = AKEY_CLRTAB; + break; +#endif +#ifdef ALT_A + /* PDCurses specific */ + case ALT_A: + UI_alt_function = UI_MENU_ABOUT; + keycode = AKEY_UI; + break; + case ALT_C: + UI_alt_function = UI_MENU_CARTRIDGE; + keycode = AKEY_UI; + break; + case ALT_D: + UI_alt_function = UI_MENU_DISK; + keycode = AKEY_UI; + break; + case ALT_L: + UI_alt_function = UI_MENU_LOADSTATE; + keycode = AKEY_UI; + break; + case ALT_O: + UI_alt_function = UI_MENU_SOUND; + keycode = AKEY_UI; + break; + case ALT_R: + UI_alt_function = UI_MENU_RUN; + keycode = AKEY_UI; + break; + case ALT_S: + UI_alt_function = UI_MENU_SAVESTATE; + keycode = AKEY_UI; + break; + case ALT_T: + UI_alt_function = UI_MENU_CASSETTE; + keycode = AKEY_UI; + break; + case ALT_W: + UI_alt_function = UI_MENU_SOUND_RECORDING; + keycode = AKEY_UI; + break; + case ALT_Y: + UI_alt_function = UI_MENU_SYSTEM; + keycode = AKEY_UI; + break; +#endif + default: + keycode = AKEY_NONE; + break; + } + return keycode; +} + +int PLATFORM_PORT(int num) +{ + return 0xff; +} + +int PLATFORM_TRIG(int num) +{ + return 1; +} + +int main(int argc, char **argv) +{ + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 3; + + /* main loop */ + for (;;) { + INPUT_key_code = PLATFORM_Keyboard(); + Atari800_Frame(); + if (Atari800_display_screen) + PLATFORM_DisplayScreen(); + } +} diff --git a/PVAtari800/atari800-src/atari_falcon.c b/PVAtari800/atari800-src/atari_falcon.c new file mode 100644 index 0000000000..0fe00b746d --- /dev/null +++ b/PVAtari800/atari800-src/atari_falcon.c @@ -0,0 +1,1234 @@ +/* + * atari_falcon.c - Atari Falcon specific port code + * + * Copyright (c) 1997-1998 Petr Stehlik and Karel Rous + * Copyright (c) 1998-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include +#include +#include /* for free */ +#include /* for VsetRGB */ +#include "falcon/xcb.h" /* for NOVA screensaver */ + +#include "atari.h" +#include "cpu.h" +#include "colours.h" +#include "ui.h" /* for UI_is_active */ +#include "input.h" +#include "akey.h" +#include "screen.h" +#include "antic.h" /* for BITPL_SCR */ +#include "platform.h" +#include "monitor.h" +#include "sound.h" +#include "log.h" +#include "util.h" + +#include "gem.h" + +/* -------------------------------------------------------------------------- */ + +int get_cookie(long cookie, long *value) +{ + long *cookiejar = (long *) Setexc(0x168, -1L); + + if (cookiejar) { + while (*cookiejar) { + if (*cookiejar == cookie) { + if (value) + *value = *++cookiejar; + return (1); + } + cookiejar += 2; + } + } + return (0); +} + +/* -------------------------------------------------------------------------- */ + +#ifdef SCREENSAVER + +#include "falcon/jclkcook.h" + +int Clocky_SS(int on) +{ + long adr; + JCLKSTRUCT *jclk; + int oldval; + +/* CHECK_CLOCKY_STRUCT; */ + + if (!get_cookie(CLOCKY_IDENT_NUM, &adr)) + return 0; + + jclk = (JCLKSTRUCT *) adr; + + if (jclk->name != CLOCKY_IDENT) { + return 0; + } + + if ((jclk->version / 0x100) != (CLOCKY_VERSION / 0x100)) { + return 0; + } + + oldval = jclk->switches.par.SaverOn; + jclk->switches.par.SaverOn = on; /* turn the Clocky's screen saver on/off */ + + return oldval; +} + +static int Clocky_SSval; /* original value */ +static int NOVA_SSval; +#endif /* SCREENSAVER */ + +/* -------------------------------------------------------------------------- */ + +typedef enum { + UNKNOWN, + TT030, + F030, + Milan, +} Video_HW; + +static Video_HW video_hw = UNKNOWN; +static int bitplanes = TRUE; /* Atari 256 colour mode uses 8 bit planes */ +static int gl_vdi_handle; +XCB *NOVA_xcb = NULL; +static int NOVA_double_size = FALSE; +static int HOST_WIDTH, HOST_HEIGHT, HOST_PLANES; +#define EMUL_WIDTH (NOVA_double_size ? 2*336 : 336) +#define EMUL_HEIGHT (NOVA_double_size ? 2*240 : 240) +#undef QUAD +#define CENTER_X ((HOST_WIDTH - EMUL_WIDTH) / 2) +#define CENTER_Y ((HOST_HEIGHT - EMUL_HEIGHT) / 2) +#define CENTER (CENTER_X + CENTER_Y * HOST_WIDTH) + +#ifdef SHOW_DISK_LED +static int LED_timeout = 0; +#endif + +/* -------------------------------------------------------------------------- */ + +// static int consol; +static int trig0; +static int stick0; +static int joyswap = FALSE; + +/* parameters for c2p_uni */ +UWORD screenw, screenh, vramw, vramh; +UBYTE *odkud, *kam; +static int delta_screen = FALSE; +UBYTE *oldscreen = NULL; /* pointer to previous screen if double buffering is turned on */ + +/* parameters for DisplayScreen */ +static int skip_N_frames = 0; + +extern void init_kb(void); +extern void rem_kb(void); +extern char key_buf[128]; +extern UBYTE joy0, joy1, buttons; +_KEYTAB *key_tab; +#define KEYBUF_SIZE 256 +unsigned char keybuf[KEYBUF_SIZE]; +int kbhead = 0; + +UBYTE *Original_Log_base, *Original_Phys_base; + +UWORD original_videl_settings[25]; +UWORD mode336x240_videl_settings[25]= +{0x0133, 0x0001, 0x3b00, 0x0150, 0x00f0, 0x0008, 0x0002, 0x0010, \ + 0x00a8, 0x0186, 0x0005, 0x00c6, 0x0095, 0x000d, 0x0292, 0x0083, \ + 0x0096, 0x0000, 0x0000, 0x0419, 0x03ff, 0x003f, 0x003f, 0x03ff, 0x0415}; + +static int force_videl = FALSE; /* force Atari800 to switch VIDEL into new resolution by direct HW programming */ +static int reprogram_VIDEL = FALSE; +static int new_videl_mode_valid = FALSE; +UBYTE *new_videoram = NULL; + +extern void rplanes(void); +extern void rplanes_delta(void); +extern void load_r(void); +extern void save_r(void); +extern ULONG *p_str_p; + +ULONG f030coltable[256]; +ULONG f030coltable_backup[256]; +ULONG *f030_coltable_ptr; +long RGBcoltable[256], RGBcoltable_backup[256]; +int coltable[256][3], coltable_backup[256][3]; + +void get_colors_on_f030(void) +{ + int i; + ULONG *x = (ULONG *) 0xff9800; + + for (i = 0; i < 256; i++) + f030_coltable_ptr[i] = x[i]; +} + +void set_colors_on_f030(void) +{ + int i; + ULONG *x = (ULONG *) 0xff9800; + + for (i = 0; i < 256; i++) + x[i] = f030_coltable_ptr[i]; +} + +void set_colors(int new) +{ + int i; + + if (reprogram_VIDEL) { + if (new) + f030_coltable_ptr = f030coltable; + else + f030_coltable_ptr = f030coltable_backup; + Supexec(set_colors_on_f030); + /* VsetRGB(0, 256, new ? RGBcoltable : RGBcoltable_backup); */ + } + else { + for(i=0; i<256; i++) + vs_color(gl_vdi_handle, i, new ? coltable[i] : coltable_backup[i]); + } +} + +void save_original_colors(void) +{ + int i; + + if (reprogram_VIDEL) { + f030_coltable_ptr = f030coltable_backup; + Supexec(get_colors_on_f030); + /* VgetRGB(0, 256, RGBcoltable_backup); */ + } + else { + for(i=0; i<256; i++) + vq_color(gl_vdi_handle, i, 1, coltable_backup[i]); + } +} + +void set_new_colors(void) { set_colors(1); } + +void restore_original_colors(void) { set_colors(0); } + +/* -------------------------------------------------------------------------- */ + +void SetupEmulatedEnvironment(void) +{ + if (reprogram_VIDEL) { + /* set new video resolution by direct VIDEL programming */ + (void)VsetScreen(new_videoram, new_videoram, -1, -1); + p_str_p = (ULONG *)mode336x240_videl_settings; + Supexec(load_r); + new_videl_mode_valid = 1; + } + + set_new_colors(); /* setup new color palette */ + + Supexec(init_kb); /* our keyboard routine */ + + Bconout(4, 0x14); /* joystick init */ + +#ifdef BITPL_SCR + if (delta_screen) { + if (Screen_atari_b != NULL) { + memset(Screen_atari_b, 0, (Screen_HEIGHT * Screen_WIDTH)); + } + } +#endif +} + +void ShutdownEmulatedEnvironment(void) +{ + if (new_videl_mode_valid) { + /* restore original VIDEL mode */ + p_str_p = (ULONG *) original_videl_settings; + Supexec(load_r); + new_videl_mode_valid = 0; + (void)VsetScreen(Original_Log_base, Original_Phys_base, -1, -1); + } + + restore_original_colors(); + + Supexec(rem_kb); /* original keyboard routine */ + + Bconout(4, 8); /* joystick disable */ +} + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + int work_in[11], work_out[57]; + int maxx, maxy, maxw, maxh, wcell, hcell, wbox, hbox; + int video_hardware; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-interlace") == 0) { + if (i_a) + skip_N_frames = Util_sscandec(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-joyswap") == 0) + joyswap = TRUE; + else if (strcmp(argv[i], "-videl") == 0) + force_videl = TRUE; + else if (strcmp(argv[i], "-double") == 0) + NOVA_double_size = TRUE; + else if (strcmp(argv[i], "-delta") == 0) + delta_screen = TRUE; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-interlace x Generate Falcon screen only every X frame\n"); + Log_print("\t-joyswap Exchange joysticks\n"); + Log_print("\t-videl direct VIDEL programming (Falcon/VGA only)\n"); + Log_print("\t-delta delta screen output (differences only)\n"); + } + + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + + *argc = j; + + /* recalculate color tables */ + for (i = 0; i < 256; i++) { + int r = (Colours_table[i] >> 18) & 0x3f; + int g = (Colours_table[i] >> 10) & 0x3f; + int b = (Colours_table[i] >> 2) & 0x3f; + f030coltable[i] = (r << 26) | (g << 18) | (b << 2); + RGBcoltable[i] = (r << 16) | (g << 8) | b; + coltable[i][0] = r * 1000 / 64; + coltable[i][1] = g * 1000 / 64; + coltable[i][2] = b * 1000 / 64; + } + + /* check for VIDEL hardware */ + if (!get_cookie('_VDO', &video_hardware)) + video_hardware = 0; + switch(video_hardware >> 16) { + case 2: + video_hw = TT030; + break; + case 3: + video_hw = F030; + break; + case 4: + video_hw = Milan; + bitplanes = FALSE; + break; + default: + video_hw = UNKNOWN; + bitplanes = FALSE; + } + + /* check for NOVA graphics card */ + if (get_cookie('NOVA', &NOVA_xcb)) + bitplanes = FALSE; + else if (get_cookie('fVDI', NULL)) + bitplanes = FALSE; + + /* GEM init */ + appl_init(); + graf_mouse(M_OFF, NULL); + wind_get(0, WF_WORKXYWH, &maxx, &maxy, &maxw, &maxh); + + gl_vdi_handle = graf_handle(&wcell, &hcell, &wbox, &hbox); + + work_in[0] = Getrez() + 2; + for(i = 1;i < 10;work_in[i++] = 1); + work_in[10] = 2; + v_opnvwk(work_in, &gl_vdi_handle, work_out); + + /* get current screen size and color depth */ + HOST_WIDTH = work_out[0] + 1; + HOST_HEIGHT = work_out[1] + 1; + + vq_extnd(gl_vdi_handle, 1, work_out); + HOST_PLANES = work_out[4]; + + if (force_videl && video_hw == F030) { /* we may switch VIDEL directly */ + bitplanes = TRUE; + + /* save original VIDEL settings */ + p_str_p = (ULONG *) original_videl_settings; + Supexec(save_r); + + if ((new_videoram = (UBYTE *)Mxalloc((336UL*Screen_HEIGHT), 0)) == NULL) { + form_alert(1, "[1][Error allocating video memory ][ OK ]"); + exit(-1); + } + + /* create new graphics mode 336x240 in 256 colors */ + reprogram_VIDEL = 1; + vramw = screenw = 336; + vramh = screenh = Screen_HEIGHT; + } + else if (HOST_PLANES == 8 && HOST_WIDTH >= 320 && HOST_HEIGHT >= Screen_HEIGHT) { + /* current resolution is OK */ + vramw = HOST_WIDTH; + vramh = HOST_HEIGHT; + +/* + if (vramw > 336) + screenw = 336; + else +*/ + screenw = 320; + screenh = Screen_HEIGHT; + } + else { + /* we may also try to switch into proper resolution using XBios call and then + reinitialize VDI - we've been told it would work OK */ + if (video_hw == F030) + form_alert(1, "[1][Atari800 emulator needs 320x240|or higher res. in 256 colors.|Or use the -videl switch.][ OK ]"); + else + form_alert(1, "[1][Atari800 emulator needs 320x240|or higher res. in 256 colors.][ OK ]"); + exit(-1); + } + + /* lock GEM */ + v_clrwk(gl_vdi_handle); /* clear whole screen */ + wind_update(BEG_UPDATE); + + save_original_colors(); + +#ifdef SCREENSAVER + Clocky_SSval = Clocky_SS(0); /* turn off Clocky's screen saver */ + if (NOVA_xcb) { + NOVA_SSval = NOVA_xcb->blnk_time; + NOVA_xcb->blnk_time = 0; + } +#endif + + Original_Log_base = Logbase(); + Original_Phys_base = Physbase(); + + key_tab = Keytbl(-1, -1, -1); + + // consol = 7; + + CPU_Initialise(); + +#ifdef SOUND + if (!Sound_Initialise(argc, argv)) + return FALSE; +#endif + + SetupEmulatedEnvironment(); + + return TRUE; +} + +/* -------------------------------------------------------------------------- */ + +int PLATFORM_Exit(int run_monitor) +{ + ShutdownEmulatedEnvironment(); + +#ifdef BUFFERED_LOG + Log_flushlog(); +#endif + + if (run_monitor) { + if (MONITOR_Run()) { + SetupEmulatedEnvironment(); + + return 1; /* go back to emulation */ + } + } + + if (new_videoram) + free(new_videoram); + + /* unlock GEM */ + wind_update(END_UPDATE); + form_dial(FMD_FINISH, 0, 0, 0, 0, 0, 0, HOST_WIDTH, HOST_HEIGHT); /* redraw screen */ + graf_mouse(M_ON, NULL); + /* GEM exit */ + appl_exit(); + +#ifdef SCREENSAVER + Clocky_SS(Clocky_SSval); + if (NOVA_xcb) + NOVA_xcb->blnk_time = NOVA_SSval; +#endif + + return 0; +} + +/* -------------------------------------------------------------------------- */ + +inline long DoubleSizeIt(short data) +{ + long result; + __asm__ __volatile__("\n\t\ + movew %1,%0\n\t\ + swap %0\n\t\ + movew %1,%0\n\t\ + rorw #8,%0\n\t\ + rorl #8,%0" + : "=d" (result) + : "d" (data) + ); + return result; +} + +void PLATFORM_DisplayScreen(void) +{ + UBYTE *screen = (UBYTE *) Screen_atari; + static int i = 0; + +/* + if (! draw_display) + return; +*/ +#ifdef SHOW_DISK_LED + if (LED_timeout) + if (--LED_timeout == 0) + Atari_Set_LED(0); +#endif + + if (i < skip_N_frames) { + i++; + return; + } + i = 0; + + odkud = screen; + kam = Logbase(); +#ifdef BITPL_SCR + oldscreen = Screen_atari_b; + + if (delta_screen) { + /* switch between screens to enable delta output */ + if (Screen_atari==Screen_atari1) { + Screen_atari = Screen_atari2; + Screen_atari_b = Screen_atari1; + } + else { + Screen_atari = Screen_atari1; + Screen_atari_b = Screen_atari2; + } + } +#endif + + if (bitplanes) { +#ifdef BITPL_SCR + if (delta_screen && !UI_is_active) + rplanes_delta(); + else +#endif + rplanes(); + } + else { + UBYTE *ptr_from = screen + 24; + UBYTE *ptr_mirror = oldscreen + 24; + UBYTE *ptr_dest = kam + CENTER; + int j; + + for (j = 0; j < Screen_HEIGHT; j++) { + short cycles; + long *long_ptr_from = ptr_from; + long *long_ptr_mirror = ptr_mirror; + long *long_ptr_dest = ptr_dest; + + if (NOVA_double_size) { + cycles = 83; + + if (delta_screen && !UI_is_active) { + do { + long data = *long_ptr_from++; + if (data == *long_ptr_mirror++) + long_ptr_dest+=2; + else { + long data2 = DoubleSizeIt((short) data); + long data1 = DoubleSizeIt((short) (data >> 16)); + *(long_ptr_dest + HOST_WIDTH / 4) = data1; + *long_ptr_dest++ = data1; + *(long_ptr_dest + HOST_WIDTH / 4) = data2; + *long_ptr_dest++ = data2; + } + } while (cycles--); + } + else { + do { + long data = *long_ptr_from++; + long data2 = DoubleSizeIt((short) data); + long data1 = DoubleSizeIt((short) (data >> 16)); + *(long_ptr_dest + HOST_WIDTH / 4) = data1; + *long_ptr_dest++ = data1; + *(long_ptr_dest + HOST_WIDTH / 4) = data2; + *long_ptr_dest++ = data2; + } while (cycles--); + } + ptr_dest += HOST_WIDTH; + } + else { + cycles = 20; + if (delta_screen && !UI_is_active) { + do { + long data; +#define CHECK_AND_WRITE \ + data = *long_ptr_from++; \ + if (data == *long_ptr_mirror++) \ + long_ptr_dest++; \ + else \ + *long_ptr_dest++ = data; + + CHECK_AND_WRITE + CHECK_AND_WRITE + CHECK_AND_WRITE + CHECK_AND_WRITE + } while (cycles--); + } + else { + do { + *long_ptr_dest++ = *long_ptr_from++; + *long_ptr_dest++ = *long_ptr_from++; + *long_ptr_dest++ = *long_ptr_from++; + *long_ptr_dest++ = *long_ptr_from++; + } while (cycles--); + } + } + + ptr_from += Screen_WIDTH; + ptr_mirror += Screen_WIDTH; + ptr_dest += HOST_WIDTH; + } + } +} + +#ifdef SHOW_DISK_LED +void Atari_Set_LED(int how) +{ + if (how) { + Offgibit(~0x02); + LED_timeout = 8; + } + else { + Ongibit(0x02); + LED_timeout = 0; + } +} +#endif + +/* -------------------------------------------------------------------------- */ + +// extern int KEYPRESSED; +extern int UI_alt_function; + +int PLATFORM_Keyboard(void) +{ + UBYTE shift_key, control_key; + int scancode, keycode; + int i; + + trig0 = 1; + stick0 = INPUT_STICK_CENTRE; + + shift_key = (key_buf[0x2a] || key_buf[0x36]); + control_key = key_buf[0x1d]; + + if (!shift_key && !control_key) { + if (key_buf[0x70]) + trig0 = 0; + if (key_buf[0x6d] || key_buf[0x6e] || key_buf[0x6f]) + stick0 -= (INPUT_STICK_CENTRE - INPUT_STICK_BACK); + if (key_buf[0x6f] || key_buf[0x6c] || key_buf[0x69]) + stick0 -= (INPUT_STICK_CENTRE - INPUT_STICK_RIGHT); + if (key_buf[0x6d] || key_buf[0x6a] || key_buf[0x67]) + stick0 -= (INPUT_STICK_CENTRE - INPUT_STICK_LEFT); + if (key_buf[0x67] || key_buf[0x68] || key_buf[0x69]) + stick0 -= (INPUT_STICK_CENTRE - INPUT_STICK_FORWARD); + } + + scancode = 0; + + if (stick0 == INPUT_STICK_CENTRE && trig0 == 1) { + for (i = 1; i <= 0x72; i++) { /* search for pressed key */ + if (key_buf[i]) { + if (i == 0x1d || i == 0x2a || i == 0x36 /* Shift, Control skip */ + || i == 0x3c || i == 0x3d || i == 0x3e) /* F2, F3, F4 skip */ + continue; + scancode = i; + break; + } + } + } + +#define SCANCODE_TAB 0x0f +#define SCANCODE_CONTROL 0x1d +#define SCANCODE_LSHIFT 0x2a +#define SCANCODE_RSHIFT 0x36 +#define SCANCODE_ALT 0x38 + +#define SCANCODE_R 0x13 +#define SCANCODE_Y 0x2c +#define SCANCODE_O 0x18 +#define SCANCODE_A 0x1e +#define SCANCODE_S 0x1f +#define SCANCODE_D 0x20 +#define SCANCODE_L 0x26 +#define SCANCODE_C 0x2e +#define SCANCODE_T 0x14 + + UI_alt_function = -1; /* no alt function */ + if (key_buf[0x38]) { /* left Alt key is pressed */ + if (scancode == SCANCODE_R) + UI_alt_function = UI_MENU_RUN; /* ALT+R .. Run file */ + else if (scancode == SCANCODE_Y) + UI_alt_function = UI_MENU_SYSTEM; /* ALT+Y .. Select system */ + else if (scancode == SCANCODE_O) + UI_alt_function = UI_MENU_SOUND; /* ALT+O .. mono/stereo sound */ + else if (scancode == SCANCODE_A) + UI_alt_function = UI_MENU_ABOUT; /* ALT+A .. About */ + else if (scancode == SCANCODE_S) + UI_alt_function = UI_MENU_SAVESTATE; /* ALT+S .. Save state */ + else if (scancode == SCANCODE_D) + UI_alt_function = UI_MENU_DISK; /* ALT+D .. Disk management */ + else if (scancode == SCANCODE_L) + UI_alt_function = UI_MENU_LOADSTATE; /* ALT+L .. Load state */ + else if (scancode == SCANCODE_C) + UI_alt_function = UI_MENU_CARTRIDGE; /* ALT+C .. Cartridge management */ + else if (scancode == SCANCODE_T) + UI_alt_function = UI_MENU_CASSETTE; /* ALT+T .. Tape management */ + } + if (UI_alt_function != -1) + return AKEY_UI; + + + if (key_buf[0x3c]) /* F2 */ + INPUT_key_consol &= ~INPUT_CONSOL_OPTION; /* OPTION key ON */ + else + INPUT_key_consol |= INPUT_CONSOL_OPTION; /* OPTION key OFF */ + if (key_buf[0x3d]) /* F3 */ + INPUT_key_consol &= ~INPUT_CONSOL_SELECT; /* SELECT key ON */ + else + INPUT_key_consol |= INPUT_CONSOL_SELECT; /* SELECT key OFF */ + if (key_buf[0x3e]) /* F4 */ + INPUT_key_consol &= ~INPUT_CONSOL_START; /* START key ON */ + else + INPUT_key_consol |= INPUT_CONSOL_START; /* START key OFF */ + + if (scancode) { + /* read ASCII code of pressed key */ + if (shift_key) + keycode = *(UBYTE *) (key_tab->shift + scancode); + else + keycode = *(UBYTE *) (key_tab->unshift + scancode); + + if (control_key) + keycode -= 64; + + switch (keycode) { + case 0x01: + keycode = AKEY_CTRL_a; + break; + case 0x02: + keycode = AKEY_CTRL_b; + break; + case 0x03: + keycode = AKEY_CTRL_c; + break; + case 0x04: + keycode = AKEY_CTRL_d; + break; + case 0x05: + keycode = AKEY_CTRL_e; + break; + case 0x06: + keycode = AKEY_CTRL_f; + break; + case 0x07: + keycode = AKEY_CTRL_g; + break; + case 0x08: + if (scancode == 0x0e) + keycode = AKEY_BACKSPACE; + else + keycode = AKEY_CTRL_h; + break; + case 0x09: + if (scancode == 0x0f) { + if (shift_key) + keycode = AKEY_SETTAB; + else if (control_key) + keycode = AKEY_CLRTAB; + else + keycode = AKEY_TAB; + } + else + keycode = AKEY_CTRL_i; + break; + case 0x0a: + keycode = AKEY_CTRL_j; + break; + case 0x0b: + keycode = AKEY_CTRL_k; + break; + case 0x0c: + keycode = AKEY_CTRL_l; + break; + case 0x0d: + if (scancode == 0x1c || scancode == 0x72) + keycode = AKEY_RETURN; + else + keycode = AKEY_CTRL_m; + break; + case 0x0e: + keycode = AKEY_CTRL_n; + break; + case 0x0f: + keycode = AKEY_CTRL_o; + break; + case 0x10: + keycode = AKEY_CTRL_p; + break; + case 0x11: + keycode = AKEY_CTRL_q; + break; + case 0x12: + keycode = AKEY_CTRL_r; + break; + case 0x13: + keycode = AKEY_CTRL_s; + break; + case 0x14: + keycode = AKEY_CTRL_t; + break; + case 0x15: + keycode = AKEY_CTRL_u; + break; + case 0x16: + keycode = AKEY_CTRL_v; + break; + case 0x17: + keycode = AKEY_CTRL_w; + break; + case 0x18: + keycode = AKEY_CTRL_x; + break; + case 0x19: + keycode = AKEY_CTRL_y; + break; + case 0x1a: + keycode = AKEY_CTRL_z; + break; + case ' ': + keycode = AKEY_SPACE; + break; + case '`': + keycode = AKEY_CAPSTOGGLE; + break; + case '!': + keycode = AKEY_EXCLAMATION; + break; + case '"': + keycode = AKEY_DBLQUOTE; + break; + case '#': + keycode = AKEY_HASH; + break; + case '$': + keycode = AKEY_DOLLAR; + break; + case '%': + keycode = AKEY_PERCENT; + break; + case '&': + keycode = AKEY_AMPERSAND; + break; + case '\'': + keycode = AKEY_QUOTE; + break; + case '@': + keycode = AKEY_AT; + break; + case '(': + keycode = AKEY_PARENLEFT; + break; + case ')': + keycode = AKEY_PARENRIGHT; + break; + case '[': + keycode = AKEY_BRACKETLEFT; + break; + case ']': + keycode = AKEY_BRACKETRIGHT; + break; + case '<': + keycode = AKEY_LESS; + break; + case '>': + keycode = AKEY_GREATER; + break; + case '=': + keycode = AKEY_EQUAL; + break; + case '?': + keycode = AKEY_QUESTION; + break; + case '-': + keycode = AKEY_MINUS; + break; + case '+': + keycode = AKEY_PLUS; + break; + case '*': + keycode = AKEY_ASTERISK; + break; + case '/': + keycode = AKEY_SLASH; + break; + case ':': + keycode = AKEY_COLON; + break; + case ';': + keycode = AKEY_SEMICOLON; + break; + case ',': + keycode = AKEY_COMMA; + break; + case '.': + keycode = AKEY_FULLSTOP; + break; + case '_': + keycode = AKEY_UNDERSCORE; + break; + case '^': + keycode = AKEY_CIRCUMFLEX; + break; + case '\\': + keycode = AKEY_BACKSLASH; + break; + case '|': + keycode = AKEY_BAR; + break; + case '0': + keycode = AKEY_0; + break; + case '1': + keycode = AKEY_1; + break; + case '2': + keycode = AKEY_2; + break; + case '3': + keycode = AKEY_3; + break; + case '4': + keycode = AKEY_4; + break; + case '5': + keycode = AKEY_5; + break; + case '6': + keycode = AKEY_6; + break; + case '7': + keycode = AKEY_7; + break; + case '8': + keycode = AKEY_8; + break; + case '9': + keycode = AKEY_9; + break; + case 'a': + keycode = AKEY_a; + break; + case 'b': + keycode = AKEY_b; + break; + case 'c': + keycode = AKEY_c; + break; + case 'd': + keycode = AKEY_d; + break; + case 'e': + keycode = AKEY_e; + break; + case 'f': + keycode = AKEY_f; + break; + case 'g': + keycode = AKEY_g; + break; + case 'h': + keycode = AKEY_h; + break; + case 'i': + keycode = AKEY_i; + break; + case 'j': + keycode = AKEY_j; + break; + case 'k': + keycode = AKEY_k; + break; + case 'l': + keycode = AKEY_l; + break; + case 'm': + keycode = AKEY_m; + break; + case 'n': + keycode = AKEY_n; + break; + case 'o': + keycode = AKEY_o; + break; + case 'p': + keycode = AKEY_p; + break; + case 'q': + keycode = AKEY_q; + break; + case 'r': + keycode = AKEY_r; + break; + case 's': + keycode = AKEY_s; + break; + case 't': + keycode = AKEY_t; + break; + case 'u': + keycode = AKEY_u; + break; + case 'v': + keycode = AKEY_v; + break; + case 'w': + keycode = AKEY_w; + break; + case 'x': + keycode = AKEY_x; + break; + case 'y': + keycode = AKEY_y; + break; + case 'z': + keycode = AKEY_z; + break; + case 'A': + keycode = AKEY_A; + break; + case 'B': + keycode = AKEY_B; + break; + case 'C': + keycode = AKEY_C; + break; + case 'D': + keycode = AKEY_D; + break; + case 'E': + keycode = AKEY_E; + break; + case 'F': + keycode = AKEY_F; + break; + case 'G': + keycode = AKEY_G; + break; + case 'H': + keycode = AKEY_H; + break; + case 'I': + keycode = AKEY_I; + break; + case 'J': + keycode = AKEY_J; + break; + case 'K': + keycode = AKEY_K; + break; + case 'L': + keycode = AKEY_L; + break; + case 'M': + keycode = AKEY_M; + break; + case 'N': + keycode = AKEY_N; + break; + case 'O': + keycode = AKEY_O; + break; + case 'P': + keycode = AKEY_P; + break; + case 'Q': + keycode = AKEY_Q; + break; + case 'R': + keycode = AKEY_R; + break; + case 'S': + keycode = AKEY_S; + break; + case 'T': + keycode = AKEY_T; + break; + case 'U': + keycode = AKEY_U; + break; + case 'V': + keycode = AKEY_V; + break; + case 'W': + keycode = AKEY_W; + break; + case 'X': + keycode = AKEY_X; + break; + case 'Y': + keycode = AKEY_Y; + break; + case 'Z': + keycode = AKEY_Z; + break; + case 0x1b: + keycode = AKEY_ESCAPE; + break; + case 0x00: + switch (scancode) { + case 0x3b: /* F1 */ + case 0x61: /* Undo */ + keycode = AKEY_UI; + break; + case 0x62: /* Help */ + keycode = AKEY_HELP; + break; + case 0x3f: /* F5 */ + keycode = shift_key ? AKEY_COLDSTART : AKEY_WARMSTART; + break; + case 0x40: /* F6 */ + keycode = AKEY_HELP; + break; + case 0x41: /* F7 */ + keycode = AKEY_BREAK; + break; + case 0x42: /* F8 */ + keycode = PLATFORM_Exit(1) ? AKEY_NONE : AKEY_EXIT; /* invoke monitor */ + break; + case 0x43: /* F9 */ + keycode = AKEY_EXIT; + break; + case 0x44: /* F10*/ + keycode = shift_key ? AKEY_SCREENSHOT_INTERLACE : AKEY_SCREENSHOT; + break; + case 0x50: + keycode = AKEY_DOWN; + break; + case 0x4b: + keycode = AKEY_LEFT; + break; + case 0x4d: + keycode = AKEY_RIGHT; + break; + case 0x48: + keycode = AKEY_UP; + break; + default: + keycode = AKEY_NONE; + break; + } + break; + default: + keycode = AKEY_NONE; + break; + } + } + else + keycode = AKEY_NONE; + + // KEYPRESSED = (keycode != AKEY_NONE); + + return keycode; +} + +/* -------------------------------------------------------------------------- */ + +int PLATFORM_PORT(int num) +{ + if (num == 0) { + if (stick0 == INPUT_STICK_CENTRE && trig0 == 1) + return (((~joy1 << 4) & 0xf0) | ((~joy0) & 0x0f)); + else { + if (joyswap) + return ((stick0 << 4) | ((~joy0) & 0x0f)); + else + return (((~joy0 << 4) & 0xf0) | stick0); + } + } + else + return 0xff; +} + +/* -------------------------------------------------------------------------- */ + +int PLATFORM_TRIG(int num) +{ + switch (num) { + case 0: + return (joy0 > 0x0f) ? 0 : joyswap ? 1 : trig0; + case 1: + return (joy1 > 0x0f) ? 0 : joyswap ? trig0 : 1; + case 2: + case 3: + default: + return 1; + } +} + +/* -------------------------------------------------------------------------- */ + +int main(int argc, char **argv) +{ + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 3; + + /* main loop */ + for (;;) { + INPUT_key_code = PLATFORM_Keyboard(); + Atari800_Frame(); + if (Atari800_display_screen) + PLATFORM_DisplayScreen(); + } +} diff --git a/PVAtari800/atari800-src/atari_ps2.c b/PVAtari800/atari800-src/atari_ps2.c new file mode 100644 index 0000000000..498d47b94a --- /dev/null +++ b/PVAtari800/atari800-src/atari_ps2.c @@ -0,0 +1,1017 @@ +/* + * atari_ps2.c - Sony PlayStation 2 port code + * + * Copyright (c) 2005 Troy Ayers and Piotr Fusik + * Copyright (c) 2005-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + //TODO: map the following keys + //control <>: (suits) + //akey_clear + //AKEY_BREAK + //all ALT+key shortcut keys + //Atari OPTION key (temple of apshai, others?) + //keyboard repeat (when shift nor control pressed) + //mouse support + //autodetect pal vs ntsc + //allow user to map own keyboard keys to controller + //enable cdfs, hdd, mass, and host support. + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "atari.h" +#include "colours.h" +#include "input.h" +#include "akey.h" +#include "log.h" +#include "monitor.h" +#include "screen.h" +#include "ui.h" +#include "util.h" + +//#ifdef SOUND +#include +#include "pokeysnd.h" +#include "sound.h" +extern unsigned char audsrv[]; +extern unsigned int size_audsrv; +//#endif + +// define to use T0 and T1 timers +#define USE_TIMERS +extern unsigned char usbd[]; +extern unsigned int size_usbd; + +extern unsigned char ps2kbd[]; +extern unsigned int size_ps2kbd; + +static GSGLOBAL *gsGlobal = NULL; + +static int clut[256] __attribute__((aligned(16))); + +//int PS2KbdCAPS = 0; +int PS2KbdSHIFT = 0; +int PS2KbdCONTROL = 0; +int PS2KbdALT = 0; + +#define PAD_PORT 0 +#define PAD_SLOT 0 + +static char padBuf[256] __attribute__((aligned(64))); + +#ifdef USE_TIMERS + +/* We use T0 for PLATFORM_Time() and T1 for PLATFORM_Sleep(). + Note that both timers are just 16-bit. */ + +#define T0_COUNT (*(volatile unsigned long *) 0x10000000) +#define T0_MODE (*(volatile unsigned long *) 0x10000010) +#define T0_COMP (*(volatile unsigned long *) 0x10000020) +#define T1_COUNT (*(volatile unsigned long *) 0x10000800) +#define T1_MODE (*(volatile unsigned long *) 0x10000810) +#define T1_COMP (*(volatile unsigned long *) 0x10000820) + +#define INTC_TIM0 9 +#define INTC_TIM1 10 + +static int t0_interrupt_id = -1; +static int t1_interrupt_id = -1; + +/* The range of int is enough for about 7 years + of continuous running. */ +static volatile int timer_interrupt_ticks = 0; + +static int sleeping_thread_id = 0; + +static int t0_interrupt_handler(int ca) +{ + timer_interrupt_ticks++; + T0_MODE |= 0x800; // clear overflow status + // __asm__ volatile("sync.l; ei"); // XXX: necessary? + return -1; // XXX: or 0? what does it mean? +} + +static int t1_interrupt_handler(int ca) +{ + iWakeupThread(sleeping_thread_id); + T1_MODE = 0; // disable + // __asm__ volatile("sync.l; ei"); // XXX: necessary? + return -1; // XXX: or 0? what does it mean? +} + +static void timer_initialize(void) +{ + T0_MODE = 0; // disable + t0_interrupt_id = AddIntcHandler(INTC_TIM0, t0_interrupt_handler, 0); + EnableIntc(INTC_TIM0); + T0_COUNT = 0; + T0_MODE = 0x002 // 576000 Hz clock + + 0x080 // start counting + + 0x200; // generate interrupt on overflow + + T1_MODE = 0; // disable + t1_interrupt_id = AddIntcHandler(INTC_TIM1, t1_interrupt_handler, 0); + EnableIntc(INTC_TIM1); +} + +static void timer_shutdown(void) +{ + T0_MODE = 0; + if (t0_interrupt_id >= 0) { + DisableIntc(INTC_TIM0); + RemoveIntcHandler(INTC_TIM0, t0_interrupt_id); + t0_interrupt_id = -1; + } + T1_MODE = 0; + if (t1_interrupt_id >= 0) { + DisableIntc(INTC_TIM1); + RemoveIntcHandler(INTC_TIM1, t1_interrupt_id); + t1_interrupt_id = -1; + } +} + +#endif /* USE_TIMERS */ + +double PLATFORM_Time(void) +{ +#ifdef USE_TIMERS + /* AFAIK, multiplication is faster than division, + on every CPU architecture */ + return (timer_interrupt_ticks * 65536.0 + T0_COUNT) * (1.0 / 576000); +#else + static double fake_timer = 0; + return fake_timer++; +#endif +} + +/* this PLATFORM_Sleep() supports times only up to 0.11 sec, + which is enough for Atari800 purposes */ + +/* void PLATFORM_Sleep(double s) +{ +#ifdef USE_TIMERS + unsigned long count = 65536 - (unsigned long) (s * 576000); + // do nothing if s is less than one T1 tick + if (count >= 65536) + return; + sleeping_thread_id = GetThreadId(); + T1_COUNT = count; + T1_MODE = 0x002 // 576000 Hz clock + + 0x080 // start counting + + 0x200; // generate interrupt on overflow +// SleepThread(); +#endif +} +*/ +//volatile int locked = 1; + +//void wakeup(s32 id, u16 time, void *arg) +//{ +// locked = 0; +//} +// +//void PLATFORM_Sleep(double s) +//{ +// +// /* 15734 is around 1 second on NTSC */ +// /* is about 1ms? */ +// SetAlarm(15734 * s, wakeup, 0); +// while (locked); +// locked = 1; +//} +void PLATFORM_Sleep(double s) +{ + + if (UI_is_active){ + int i,ret; + for (i=0;i> 16) + (c & 0xff00) + ((c & 0xff) << 16); + // swap bits 3 and 4 to workaround a bug in gsKit + clut[(i ^ i * 2) & 16 ? i ^ 24 : i] = (c >> 16) + (c & 0xff00) + ((c & 0xff) << 16); + } + // Clear debug from screen + init_scr(); + // Initialize graphics + gsGlobal = gsKit_init_global(GS_MODE_NTSC); + dmaKit_init(D_CTRL_RELE_ON, D_CTRL_MFD_OFF, D_CTRL_STS_UNSPEC, + D_CTRL_STD_OFF, D_CTRL_RCYC_8); + dmaKit_chan_init(DMA_CHANNEL_GIF); + gsGlobal->PSM = GS_PSM_CT32; + gsGlobal->Test->ZTE = 0; + gsKit_init_screen(gsGlobal); + // Init joypad + padInit(0); + padPortOpen(PAD_PORT, PAD_SLOT, padBuf); +#ifdef USE_TIMERS + timer_initialize(); +#endif +#ifdef SOUND + if (!Sound_Initialise(argc, argv)) + return FALSE; +#endif + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + // TODO: shutdown graphics mode + Log_flushlog(); +#if 0 + if (run_monitor && MONITOR_Run()) { + // TODO: reinitialize graphics mode + return TRUE; + } +#endif +#ifdef USE_TIMERS + timer_shutdown(); +#endif +/* TODO Sound_Exit should not be called here! It only stays here now because + the next step restarts the PS2 without ever returning from this function to + Atari800_Exit, so the call to Sound_Exit located in the latter function is + never invoked. So, should the LoadExecPS2call below get removed, so should + this call to Sound_Exit. */ +#ifdef SOUND + Sound_Exit(); +#endif +//zzz temp exit procedure +//Hard coded to go back to ulaunch + fioExit(); + SifExitRpc(); + LoadExecPS2("mc0:/BOOT/BOOT.ELF", 0, NULL); +//zzz end + return FALSE; +} + +void PLATFORM_DisplayScreen(void) +{ + GSTEXTURE tex; + tex.Width = Screen_WIDTH; + tex.Height = Screen_HEIGHT; + tex.PSM = GS_PSM_T8; + tex.Mem = (UBYTE *) Screen_atari; + tex.Clut = clut; + tex.Vram = 0x200000; + tex.VramClut = 0x280000; + tex.Filter = GS_FILTER_LINEAR; + // TODO: upload clut just once + gsKit_texture_upload(gsGlobal, &tex); + gsKit_prim_sprite_texture(gsGlobal, &tex, 0, 0, 32, 0, 640, 480, 32 + 320, 240, 0, 0x80808080); +#if 0 + gsKit_sync_flip(gsGlobal); +#else + // flip without vsync + // this is a copy of gsKit_sync_flip() code with just gsKit_vsync() call removed + GS_SET_DISPFB2(gsGlobal->ScreenBuffer[gsGlobal->ActiveBuffer & 1] / 8192, + gsGlobal->Width / 64, gsGlobal->PSM, 0, 0 ); + gsGlobal->ActiveBuffer ^= 1; + gsGlobal->PrimContext ^= 1; + gsGlobal->EvenOrOdd = ((GSREG *) GS_CSR)->FIELD; + gsKit_setactive(gsGlobal); +#endif + +} + +static int PadButtons(void) +{ + struct padButtonStatus buttons; + for (;;) { + int ret = padGetState(PAD_PORT, PAD_SLOT); + if (ret == PAD_STATE_STABLE || ret == PAD_STATE_FINDCTP1) + break; + if (ret == PAD_STATE_DISCONN) + return 0; + } + padRead(PAD_PORT, PAD_SLOT, &buttons); + return ~buttons.btns; +} + +int PLATFORM_Keyboard(void) +{ + int new_pad = PadButtons(); + PS2KbdRawKey key; + INPUT_key_consol = INPUT_CONSOL_NONE; + + if (UI_is_active) { + if (new_pad & PAD_CROSS) + return AKEY_RETURN; + if (new_pad & PAD_CIRCLE) + return AKEY_ESCAPE; + if (new_pad & PAD_LEFT) + return AKEY_LEFT; + if (new_pad & PAD_RIGHT) + return AKEY_RIGHT; + if (new_pad & PAD_UP) + return AKEY_UP; + if (new_pad & PAD_DOWN) + return AKEY_DOWN; + if (new_pad & PAD_L1) + return AKEY_COLDSTART; + if (new_pad & PAD_R1) + return AKEY_WARMSTART; + } + //PAD_CROSS is used for PLATFORM_TRIG(). + if (new_pad & PAD_TRIANGLE) + return AKEY_UI; + if (new_pad & PAD_SQUARE) + return AKEY_SPACE; + if (new_pad & PAD_CIRCLE) + return AKEY_RETURN; + if (new_pad & PAD_L1) + return AKEY_COLDSTART; + if (new_pad & PAD_R1) + return AKEY_WARMSTART; + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (new_pad & PAD_START) + return AKEY_5200_START; + } + else { + if (new_pad & PAD_START) + INPUT_key_consol ^= INPUT_CONSOL_START; + if (new_pad & PAD_SELECT) + INPUT_key_consol ^= INPUT_CONSOL_SELECT; + if (new_pad & PAD_CROSS) + return AKEY_HELP; + } +if (Atari800_machine_type != Atari800_MACHINE_5200 || UI_is_active) { + + while (PS2KbdReadRaw(&key) != 0) { + if (key.state == PS2KBD_RAWKEY_DOWN) { + switch (key.key) { + case EOF: + Atari800_Exit(FALSE); + exit(0); + break; + case 0x28: + return AKEY_RETURN; + case 0x29: + return AKEY_ESCAPE; + case 0x2A: + return AKEY_BACKSPACE; + case 0x2B: + return AKEY_TAB; + case 0x2C: + return AKEY_SPACE; + case 0x46://Print Screen Button + return AKEY_SCREENSHOT; + case 0x4F: + return AKEY_RIGHT; + case 0x50: + return AKEY_LEFT; + case 0x51: + return AKEY_DOWN; + case 0x52: + return AKEY_UP; + case 0x58: + return AKEY_RETURN; + + case 0xE0: + PS2KbdCONTROL = 1; + return AKEY_NONE; + case 0xE4: + PS2KbdCONTROL = 1; + return AKEY_NONE; + case 0xE1: + PS2KbdSHIFT = 1; + return AKEY_NONE; + case 0xE2: + PS2KbdALT = 1; + return AKEY_NONE; + case 0xE5: + PS2KbdSHIFT = 1; + return AKEY_NONE; + case 0xE6: + PS2KbdALT = 1; + return AKEY_NONE; + default: + break; + } + } + + if ((key.state == PS2KBD_RAWKEY_DOWN) && !PS2KbdSHIFT && !PS2KbdALT) { + switch (key.key) { + case 0x1E: + return AKEY_1; + case 0X1F: + return AKEY_2; + case 0x20: + return AKEY_3; + case 0x21: + return AKEY_4; + case 0x22: + return AKEY_5; + case 0x23: + return AKEY_6; + case 0x24: + return AKEY_7; + case 0x25: + return AKEY_8; + case 0x26: + return AKEY_9; + case 0x27: + return AKEY_0; + case 0x2D: + return AKEY_MINUS; + case 0x2E: + return AKEY_EQUAL; + case 0x2F: + return AKEY_BRACKETLEFT; + case 0x30: + return AKEY_BRACKETRIGHT; + case 0x31: + return AKEY_BACKSLASH; + case 0x33: + return AKEY_SEMICOLON; + case 0x34: + return AKEY_QUOTE; + case 0x35: + return AKEY_ATARI; + case 0x36: + return AKEY_COMMA; + case 0x37: + return AKEY_FULLSTOP; + case 0x38: + return AKEY_SLASH; + case 0x3A://F1 + return AKEY_UI; + case 0x3E://F5 + return AKEY_WARMSTART; + case 0x42://F9 + return AKEY_EXIT; + case 0x43://F10 + return AKEY_SCREENSHOT; + default: + break; + } + } + if ((key.state == PS2KBD_RAWKEY_DOWN) && PS2KbdSHIFT && !PS2KbdCONTROL && !PS2KbdALT) { + switch (key.key) { + case 0x4: + return AKEY_A; + case 0x5: + return AKEY_B; + case 0x6: + return AKEY_C; + case 0x7: + return AKEY_D; + case 0x8: + return AKEY_E; + case 0x9: + return AKEY_F; + case 0xA: + return AKEY_G; + case 0xB: + return AKEY_H; + case 0xC: + return AKEY_I; + case 0xD: + return AKEY_J; + case 0xE: + return AKEY_K; + case 0xF: + return AKEY_L; + case 0x10: + return AKEY_M; + case 0x11: + return AKEY_N; + case 0x12: + return AKEY_O; + case 0x13: + return AKEY_P; + case 0x14: + return AKEY_Q; + case 0x15: + return AKEY_R; + case 0x16: + return AKEY_S; + case 0x17: + return AKEY_T; + case 0x18: + return AKEY_U; + case 0x19: + return AKEY_V; + case 0x1A: + return AKEY_W; + case 0x1B: + return AKEY_X; + case 0x1C: + return AKEY_Y; + case 0x1D: + return AKEY_Z; + case 0x1E: + return AKEY_EXCLAMATION; + case 0X1F: + return AKEY_AT; + case 0x20: + return AKEY_HASH; + case 0x21: + return AKEY_DOLLAR; + case 0x22: + return AKEY_PERCENT; + case 0x23: +// return AKEY_CIRCUMFLEX; + return AKEY_CARET; + case 0x24: + return AKEY_AMPERSAND; + case 0x25: + return AKEY_ASTERISK; + case 0x26: + return AKEY_PARENLEFT; + case 0x27: + return AKEY_PARENRIGHT; + case 0x2B: + return AKEY_SETTAB; + case 0x2D: + return AKEY_UNDERSCORE; + case 0x2E: + return AKEY_PLUS; + case 0x31: + return AKEY_BAR; + case 0x33: + return AKEY_COLON; + case 0x34: + return AKEY_DBLQUOTE; + case 0x36: + return AKEY_LESS; + case 0x37: + return AKEY_GREATER; + case 0x38: + return AKEY_QUESTION; + case 0x3E://Shift+F5 + return AKEY_COLDSTART; + case 0x43://Shift+F10 + return AKEY_SCREENSHOT_INTERLACE; + case 0x49://Shift+Insert key + return AKEY_INSERT_LINE; + case 0x4C://Shift+Backspace Key + return AKEY_DELETE_LINE; + default: + break; + } + } + if ((key.state == PS2KBD_RAWKEY_DOWN) && !PS2KbdSHIFT && !PS2KbdCONTROL && !PS2KbdALT) { + switch (key.key) { + case 0x4: + return AKEY_a; + case 0x5: + return AKEY_b; + case 0x6: + return AKEY_c; + case 0x7: + return AKEY_d; + case 0x8: + return AKEY_e; + case 0x9: + return AKEY_f; + case 0xA: + return AKEY_g; + case 0xB: + return AKEY_h; + case 0xC: + return AKEY_i; + case 0xD: + return AKEY_j; + case 0xE: + return AKEY_k; + case 0xF: + return AKEY_l; + case 0x10: + return AKEY_m; + case 0x11: + return AKEY_n; + case 0x12: + return AKEY_o; + case 0x13: + return AKEY_p; + case 0x14: + return AKEY_q; + case 0x15: + return AKEY_r; + case 0x16: + return AKEY_s; + case 0x17: + return AKEY_t; + case 0x18: + return AKEY_u; + case 0x19: + return AKEY_v; + case 0x1A: + return AKEY_w; + case 0x1B: + return AKEY_x; + case 0x1C: + return AKEY_y; + case 0x1D: + return AKEY_z; + case 0x49: + return AKEY_INSERT_CHAR; + case 0x4C: + return AKEY_DELETE_CHAR; + default: + break; + } + } + if ((key.state == PS2KBD_RAWKEY_DOWN) && PS2KbdCONTROL && !PS2KbdALT) { + switch(key.key) { + case 0x4: + return AKEY_CTRL_a; + case 0x5: + return AKEY_CTRL_b; + case 0x6: + return AKEY_CTRL_c; + case 0x7: + return AKEY_CTRL_d; + case 0x8: + return AKEY_CTRL_e; + case 0x9: + return AKEY_CTRL_f; + case 0xA: + return AKEY_CTRL_g; + case 0xB: + return AKEY_CTRL_h; + case 0xC: + return AKEY_CTRL_i; + case 0xD: + return AKEY_CTRL_j; + case 0xE: + return AKEY_CTRL_k; + case 0xF: + return AKEY_CTRL_l; + case 0x10: + return AKEY_CTRL_m; + case 0x11: + return AKEY_CTRL_n; + case 0x12: + return AKEY_CTRL_o; + case 0x13: + return AKEY_CTRL_p; + case 0x14: + return AKEY_CTRL_q; + case 0x15: + return AKEY_CTRL_r; + case 0x16: + return AKEY_CTRL_s; + case 0x17: + return AKEY_CTRL_t; + case 0x18: + return AKEY_CTRL_u; + case 0x19: + return AKEY_CTRL_v; + case 0x1A: + return AKEY_CTRL_w; + case 0x1B: + return AKEY_CTRL_x; + case 0x1C: + return AKEY_CTRL_y; + case 0x1D: + return AKEY_CTRL_z; + case 0x1E: + return AKEY_CTRL_1; + case 0x1F: + return AKEY_CTRL_2; + case 0x20: + return AKEY_CTRL_3; + case 0x21: + return AKEY_CTRL_4; + case 0x22: + return AKEY_CTRL_5; + case 0x23: + return AKEY_CTRL_6; + case 0x24: + return AKEY_CTRL_7; + case 0x25: + return AKEY_CTRL_8; + case 0x26: + return AKEY_CTRL_9; + case 0x27: + return AKEY_CTRL_0; + case 0x2B: + return AKEY_CLRTAB; + case 0x33: + return AKEY_SEMICOLON | AKEY_CTRL; + case 0x36: + return AKEY_LESS | AKEY_CTRL; + case 0x37: + return AKEY_GREATER | AKEY_CTRL; + default: + break; + } + } + if ((key.state == PS2KBD_RAWKEY_DOWN) && PS2KbdALT) { + switch(key.key) { + //case dcr ylsa + case 0x7: + UI_alt_function = UI_MENU_DISK; + return AKEY_UI; + case 0x6: + UI_alt_function = UI_MENU_CARTRIDGE; + return AKEY_UI; + case 0x15: + UI_alt_function = UI_MENU_RUN; + return AKEY_UI; + case 0x1C: + UI_alt_function = UI_MENU_SYSTEM; + return AKEY_UI; + case 0xF: + UI_alt_function = UI_MENU_LOADSTATE; + return AKEY_UI; + case 0x16: + UI_alt_function = UI_MENU_SAVESTATE; + return AKEY_UI; + case 0x17: + UI_alt_function = UI_MENU_CASSETTE; + return AKEY_UI; + case 0x4: + UI_alt_function = UI_MENU_ABOUT; + return AKEY_UI; + default: + break; + } + } + + + if (key.state == PS2KBD_RAWKEY_UP) { + switch (key.key) { + case 0x39: + + return AKEY_CAPSTOGGLE; + case 0xE0: + PS2KbdCONTROL = 0; + return AKEY_NONE; + case 0xE4: + PS2KbdCONTROL = 0; + return AKEY_NONE; + case 0xE1: + PS2KbdSHIFT = 0; + return AKEY_NONE; + case 0xE2: + PS2KbdALT = 0; + return AKEY_NONE; + case 0xE5: + PS2KbdSHIFT = 0; + return AKEY_NONE; + case 0xE6: + PS2KbdALT = 0; + return AKEY_NONE; + default: + break; + } + } + } +} + return AKEY_NONE; +} + +int PLATFORM_PORT(int num) +{ + int ret = 0xff; + if (num == 0) { + int pad = PadButtons(); + if (pad & PAD_LEFT) + ret &= 0xf0 | INPUT_STICK_LEFT; + if (pad & PAD_RIGHT) + ret &= 0xf0 | INPUT_STICK_RIGHT; + if (pad & PAD_UP) + ret &= 0xf0 | INPUT_STICK_FORWARD; + if (pad & PAD_DOWN) + ret &= 0xf0 | INPUT_STICK_BACK; + } + return ret; +} + +int PLATFORM_TRIG(int num) +{ + if (num == 0 && PadButtons() & PAD_CROSS) + return 0; + return 1; +} + +char dir_path[FILENAME_MAX]; + +static int dir_n; +static int dir_i; + +// XXX: use followup calls to get directory entries one-by-one? + +#define MAX_FILES_PER_DIR 1000 + +static mcTable mcDir[MAX_FILES_PER_DIR]; + +int Atari_OpenDir(const char *filename) +{ + // TODO: support other devices + if (strncmp(filename, "mc0:/", 5) != 0) + return FALSE; + dir_n = mcGetDir(0, 0, filename + 4, 0 /* followup flag */, MAX_FILES_PER_DIR, mcDir); + mcSync(0,NULL,&dir_n); + if (dir_n < 0) + return FALSE; + dir_i = 0; + // XXX: does it know (and needs to know) that "mc0:/" is a root directory? + Util_splitpath(filename, dir_path, NULL); + return TRUE; +} + +int Atari_ReadDir(char *fullpath, char *filename, int *isdir, + int *readonly, int *size, char *timetext) +{ + const mcTable *p; + if (dir_i >= dir_n) + return FALSE; + p = mcDir + dir_i; + if (fullpath != NULL) + Util_catpath(fullpath, dir_path, p->name); + if (filename != NULL) + strcpy(filename, p->name); + if (isdir != NULL) + *isdir = (p->attrFile & MC_ATTR_SUBDIR) ? TRUE : FALSE; + if (readonly != NULL) + *readonly = (p->attrFile & MC_ATTR_WRITEABLE) ? FALSE : TRUE; // XXX: MC_ATTR_PROTECTED ? + if (size != NULL) + *size = (int) (p->fileSizeByte); + if (timetext != NULL) { + // FIXME: adjust from GMT to local time + int hour = p->_modify.hour; + char ampm = 'a'; + if (hour >= 12) { + hour -= 12; + ampm = 'p'; + } + if (hour == 0) + hour = 12; + sprintf(timetext, "%2d-%02d-%02d %2d:%02d%c", + p->_modify.month, p->_modify.day, p->_modify.year % 100, hour, p->_modify.sec, ampm); + } + dir_i++; + return TRUE; +} + +#ifdef SOUND + +int Sound_Initialise(int *argc, char *argv[]) +{ + if (audsrv_init() != 0) + Log_print("failed to initialize audsrv: %s", audsrv_get_error_string()); + else { + struct audsrv_fmt_t format; + format.bits = 8; + format.freq = 44100; + format.channels = 1; + audsrv_set_format(&format); + audsrv_set_volume(MAX_VOLUME); + POKEYSND_Init(POKEYSND_FREQ_17_EXACT, 44100, 1, 0); + } + return TRUE; +} + +void Sound_Exit(void) +{ + audsrv_quit(); +} + +void Sound_Update(void) +{ + static char buffer[44100 / 50]; + unsigned int nsamples = (Atari800_tv_mode == Atari800_TV_NTSC) ? (44100 / 60) : (44100 / 50); + POKEYSND_Process(buffer, nsamples); + audsrv_wait_audio(nsamples); + audsrv_play_audio(buffer, nsamples); +} + +void Sound_Pause(void) +{ + audsrv_stop_audio(); +} + +void Sound_Continue(void) +{ + if (audsrv_init() != 0) + Log_print("failed to initialize audsrv: %s", audsrv_get_error_string()); + else { + struct audsrv_fmt_t format; + format.bits = 8; + format.freq = 44100; + format.channels = 1; + audsrv_set_format(&format); + audsrv_set_volume(MAX_VOLUME); + } +} + +#endif /* SOUND */ + +int main(int argc, char **argv) +{ + loadModules(); + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 3; + + /* main loop */ + for (;;) { + INPUT_key_code = PLATFORM_Keyboard(); + Atari800_Frame(); + if (Atari800_display_screen){ + PLATFORM_DisplayScreen();} + } +} diff --git a/PVAtari800/atari800-src/atari_x11.c b/PVAtari800/atari800-src/atari_x11.c new file mode 100644 index 0000000000..bbec8fcb32 --- /dev/null +++ b/PVAtari800/atari800-src/atari_x11.c @@ -0,0 +1,3067 @@ +/* + * atari_x11.c - X11 specific port code + * + * Copyright (c) 1995-1998 David Firth + * Copyright (C) 1998-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include +#include +#include +#include +#include "pokey.h" + +#ifdef VMS +#include +#else +#include +#endif + +#include +#include + +typedef unsigned char ubyte; +typedef unsigned short uword; + +#ifdef XVIEW +#include +#include +#include +#include +#include +#include +#endif + +#ifdef MOTIF +#include +#include +#include +#include +#include +#include + +static XtAppContext app; +static Widget toplevel; +static Widget main_w; +static Widget drawing_area; +static Widget fsel_b; +static Widget fsel_d; +static Widget fsel_r; +static Widget rbox_d; +static Widget togg_d1, togg_d2, togg_d3, togg_d4; +static Widget togg_d5, togg_d6, togg_d7, togg_d8; +static Widget eject_menu; +static Widget disable_menu; +static Widget system_menu; +static int motif_disk_sel = 1; +#endif /* MOTIF */ + +#include +#include +#include + +#include "atari.h" +#include "cartridge.h" +#include "colours.h" +#include "input.h" +#include "akey.h" +#include "log.h" +#include "monitor.h" +#include "memory.h" +#include "screen.h" +#include "sio.h" +#include "sound.h" +#include "platform.h" +#include "ui.h" +#include "util.h" + +#ifdef SHM +#include +#include +#include + +static XShmSegmentInfo shminfo; +static XImage *image = NULL; +#ifdef USE_COLOUR_TRANSLATION_TABLE +extern int colour_translation_table[256]; +#endif +#endif /* SHM */ + +static int invisible = 0; + +#ifdef LINUX_JOYSTICK +#include + +static int js0; +static int js1; + +static int js0_centre_x; +static int js0_centre_y; +static int js1_centre_x; +static int js1_centre_y; + +static struct JS_DATA_TYPE js_data; +#endif /* LINUX_JOYSTICK */ + +typedef enum { + Small, + Large, + Huge +} WindowSize; + +static WindowSize windowsize = Large; + +enum { + MONITOR_NOTHING, + MONITOR_SIO +} x11_monitor = MONITOR_NOTHING; + +static int x11bug = FALSE; +static int private_cmap = FALSE; + +static int window_width = 336; +static int window_height = Screen_HEIGHT; + +static int clipping_factor = 1; +static int clipping_x = 24; +static int clipping_y = 0; +static int clipping_width = 336; +static int clipping_height = Screen_HEIGHT; + + +static Display *display = NULL; +static Screen *screen = NULL; +static Window window; +#ifndef SHM +static Pixmap pixmap; +#endif +static Visual *visual = NULL; +static Colormap cmap; + +static GC gc; +static GC gc_colour[256]; +static int colours[256]; + +#ifdef XVIEW +static Frame frame; +static Panel panel; +static Canvas canvas; +static Menu system_menu; +static Menu consol_menu; +static Menu options_menu; +static Frame chooser; + +static Frame controllers_frame; +static Panel controllers_panel; +static Panel_item keypad_item; +static Panel_item mouse_item; + +#ifdef LINUX_JOYSTICK +static Panel_item js0_item; +static Panel_item js1_item; +#endif + +static Frame performance_frame; +static Panel performance_panel; +static Panel_item refresh_slider; +#endif /* XVIEW */ + +static int SHIFT = 0x00; +static int CONTROL = 0x00; +static UBYTE *image_data = NULL; +static int modified; + +static int keypad_mode = -1; /* Joystick */ +static int keypad_trig = 1; /* Keypad Trigger Position */ +static int keypad_stick = 0x0f; /* Keypad Joystick Position */ + +static int xmouse_mode = -1; /* Joystick, Paddle and Light Pen */ +static int mouse_stick; /* Mouse Joystick Position */ + +static int js0_mode = -1; +static int js1_mode = -1; + +#ifndef SHM + +#define NPOINTS (4096 / 4) +#define NRECTS (4096 / 4) + +static XPoint points[NPOINTS]; +static XRectangle rectangles[NRECTS]; +#endif + +static int keyboard_consol = INPUT_CONSOL_NONE; +static int menu_consol = INPUT_CONSOL_NONE; + +static int autorepeat = 1; +static int last_focus = FocusOut; + +static void autorepeat_get(void) +{ + XKeyboardState kstat; + + XGetKeyboardControl(display, &kstat); + autorepeat = kstat.global_auto_repeat; +} + +static void autorepeat_off(void) +{ + XAutoRepeatOff(display); +} + +static void autorepeat_restore(void) +{ + if (autorepeat) + XAutoRepeatOn(display); + else + XAutoRepeatOff(display); +} + +static void segmentationfault(int x) +{ + Atari800_ErrExit(); + exit(0); +} + +static int GetKeyCode(XEvent *event) +{ + KeySym keysym; + char buffer[128]; + static int keycode = AKEY_NONE; + + if (event->type == KeyPress || event->type == KeyRelease) { + XLookupString((XKeyEvent *) event, buffer, sizeof(buffer), &keysym, NULL); + } + + switch (event->type) { + case Expose: +#ifndef SHM + XCopyArea(display, pixmap, window, gc, + 0, 0, + window_width, window_height, + 0, 0); +#else + modified = TRUE; +#endif + break; + case FocusIn: + autorepeat_off(); + last_focus = FocusIn; + break; + case FocusOut: + autorepeat_restore(); + last_focus = FocusOut; + break; + case VisibilityNotify: + if (((XVisibilityEvent*) event)->state == VisibilityFullyObscured) + invisible = 1; + else + invisible = 0; + break; + case KeyPress: + switch (keysym) { + case XK_Shift_L: + case XK_Shift_R: + SHIFT = AKEY_SHFT; + INPUT_key_shift = 1; + break; + case XK_Control_L: + keypad_trig = 0; + /* FALLTHROUGH */ + case XK_Control_R: + CONTROL = AKEY_CTRL; + break; + case XK_F1: + keycode = AKEY_UI; + break; + case XK_F5: + case XK_L5: + keycode = SHIFT ? AKEY_COLDSTART : AKEY_WARMSTART; + break; + case XK_F8: + keycode = PLATFORM_Exit(TRUE) ? AKEY_NONE : AKEY_EXIT; + break; + case XK_F9: + keycode = AKEY_EXIT; + break; + case XK_F10: + case XK_L10: + keycode = SHIFT ? AKEY_SCREENSHOT_INTERLACE : AKEY_SCREENSHOT; + break; + case XK_F12: + keycode = AKEY_TURBO; + break; + case XK_Left: + keycode = AKEY_LEFT; + keypad_stick &= INPUT_STICK_LEFT; + break; + case XK_Up: + keycode = AKEY_UP; + keypad_stick &= INPUT_STICK_FORWARD; + break; + case XK_Right: + keycode = AKEY_RIGHT; + keypad_stick &= INPUT_STICK_RIGHT; + break; + case XK_Down: + keycode = AKEY_DOWN; + keypad_stick &= INPUT_STICK_BACK; + break; + case XK_KP_0: + keypad_trig = 0; + keycode = AKEY_NONE; + break; + case XK_KP_1: + keypad_stick = INPUT_STICK_LL; + keycode = AKEY_NONE; + break; + case XK_KP_2: + keypad_stick &= INPUT_STICK_BACK; + keycode = AKEY_NONE; + break; + case XK_KP_3: + keypad_stick = INPUT_STICK_LR; + keycode = AKEY_NONE; + break; + case XK_KP_4: + keypad_stick &= INPUT_STICK_LEFT; + keycode = AKEY_NONE; + break; + case XK_KP_5: + keypad_stick = INPUT_STICK_CENTRE; + keycode = AKEY_NONE; + break; + case XK_KP_6: + keypad_stick &= INPUT_STICK_RIGHT; + keycode = AKEY_NONE; + break; + case XK_KP_7: + keypad_stick = INPUT_STICK_UL; + keycode = AKEY_NONE; + break; + case XK_KP_8: + keypad_stick &= INPUT_STICK_FORWARD; + keycode = AKEY_NONE; + break; + case XK_KP_9: + keypad_stick = INPUT_STICK_UR; + keycode = AKEY_NONE; + break; + } + if (Atari800_machine_type == Atari800_MACHINE_5200 && !UI_is_active) { + switch (keysym) { + case XK_F4: + keycode = SHIFT | AKEY_5200_START; + break; + case XK_P: + case XK_p: + keycode = SHIFT | AKEY_5200_PAUSE; + break; + case XK_R: + case XK_r: + keycode = SHIFT | AKEY_5200_RESET; + break; + case XK_0: + keycode = SHIFT | AKEY_5200_0; + break; + case XK_1: + keycode = SHIFT | AKEY_5200_1; + break; + case XK_2: + keycode = SHIFT | AKEY_5200_2; + break; + case XK_3: + keycode = SHIFT | AKEY_5200_3; + break; + case XK_4: + keycode = SHIFT | AKEY_5200_4; + break; + case XK_5: + keycode = SHIFT | AKEY_5200_5; + break; + case XK_6: + keycode = SHIFT | AKEY_5200_6; + break; + case XK_7: + keycode = SHIFT | AKEY_5200_7; + break; + case XK_8: + keycode = SHIFT | AKEY_5200_8; + break; + case XK_9: + keycode = SHIFT | AKEY_5200_9; + break; + /* XXX: "SHIFT | " harmful for '#' and '*' ? */ + case XK_numbersign: + case XK_equal: + keycode = AKEY_5200_HASH; + break; + case XK_asterisk: + keycode = AKEY_5200_ASTERISK; + break; + } + break; + } + switch (keysym) { + case XK_Caps_Lock: + keycode = SHIFT | CONTROL | AKEY_CAPSTOGGLE; + break; + case XK_Shift_Lock: + if (x11bug) + printf("XK_Shift_Lock\n"); + break; + case XK_Alt_L: + case XK_Alt_R: + keycode = AKEY_ATARI; + break; + case XK_F2: + keyboard_consol &= (~INPUT_CONSOL_OPTION); + keycode = AKEY_NONE; + break; + case XK_F3: + keyboard_consol &= (~INPUT_CONSOL_SELECT); + keycode = AKEY_NONE; + break; + case XK_F4: + keyboard_consol &= (~INPUT_CONSOL_START); + keycode = AKEY_NONE; + break; + case XK_F6: + keycode = SHIFT | CONTROL | AKEY_HELP; + break; + case XK_Break: + case XK_F7: + keycode = AKEY_BREAK; + break; + case XK_Home: + keycode = AKEY_CLEAR; + break; + case XK_Insert: + if (SHIFT) + keycode = AKEY_INSERT_LINE; + else + keycode = AKEY_INSERT_CHAR; + break; + case XK_BackSpace: + if (CONTROL) + keycode = AKEY_DELETE_CHAR; + else if (SHIFT) + keycode = AKEY_DELETE_LINE; + else + keycode = AKEY_BACKSPACE; + break; + case XK_Delete: + if (CONTROL) + keycode = AKEY_DELETE_CHAR; + else if (SHIFT) + keycode = AKEY_DELETE_LINE; + else + keycode = AKEY_BACKSPACE; /* XXX */ + break; + case XK_End: + keycode = SHIFT | CONTROL | AKEY_HELP; + break; + case XK_Escape: + keycode = SHIFT | CONTROL | AKEY_ESCAPE; + break; + case XK_Tab: + keycode = SHIFT | CONTROL | AKEY_TAB; + break; + case XK_exclam: + keycode = CONTROL | AKEY_EXCLAMATION; + break; + case XK_quotedbl: + keycode = CONTROL | AKEY_DBLQUOTE; + break; + case XK_numbersign: + keycode = CONTROL | AKEY_HASH; + break; + case XK_dollar: + keycode = CONTROL | AKEY_DOLLAR; + break; + case XK_percent: + keycode = CONTROL | AKEY_PERCENT; + break; + case XK_ampersand: + keycode = CONTROL | AKEY_AMPERSAND; + break; + case XK_quoteright: + keycode = CONTROL | AKEY_QUOTE; + break; + case XK_at: + keycode = CONTROL | AKEY_AT; + break; + case XK_parenleft: + keycode = CONTROL | AKEY_PARENLEFT; + break; + case XK_parenright: + keycode = CONTROL | AKEY_PARENRIGHT; + break; + case XK_less: + keycode = CONTROL | AKEY_LESS; + break; + case XK_greater: + keycode = CONTROL | AKEY_GREATER; + break; + case XK_equal: + keycode = CONTROL | AKEY_EQUAL; + break; + case XK_question: + keycode = CONTROL | AKEY_QUESTION; + break; + case XK_minus: + keycode = CONTROL | AKEY_MINUS; + break; + case XK_plus: + keycode = CONTROL | AKEY_PLUS; + break; + case XK_asterisk: + keycode = CONTROL | AKEY_ASTERISK; + break; + case XK_slash: + keycode = CONTROL | AKEY_SLASH; + break; + case XK_colon: + keycode = CONTROL | AKEY_COLON; + break; + case XK_semicolon: + keycode = CONTROL | AKEY_SEMICOLON; + break; + case XK_comma: + keycode = CONTROL | AKEY_COMMA; + break; + case XK_period: + keycode = CONTROL | AKEY_FULLSTOP; + break; + case XK_underscore: + keycode = CONTROL | AKEY_UNDERSCORE; + break; + case XK_bracketleft: + keycode = CONTROL | AKEY_BRACKETLEFT; + break; + case XK_bracketright: + keycode = CONTROL | AKEY_BRACKETRIGHT; + break; + case XK_asciicircum: + keycode = CONTROL | AKEY_CIRCUMFLEX; + break; + case XK_backslash: + keycode = CONTROL | AKEY_BACKSLASH; + break; + case XK_bar: + keycode = CONTROL | AKEY_BAR; + break; + case XK_space: + keycode = SHIFT | CONTROL | AKEY_SPACE; + keypad_trig = 0; + break; + case XK_Return: + keycode = SHIFT | CONTROL | AKEY_RETURN; + keypad_stick = INPUT_STICK_CENTRE; + break; + case XK_0: + keycode = CONTROL | AKEY_0; + break; + case XK_1: + keycode = CONTROL | AKEY_1; + break; + case XK_2: + keycode = CONTROL | AKEY_2; + break; + case XK_3: + keycode = CONTROL | AKEY_3; + break; + case XK_4: + keycode = CONTROL | AKEY_4; + break; + case XK_5: + keycode = CONTROL | AKEY_5; + break; + case XK_6: + keycode = CONTROL | AKEY_6; + break; + case XK_7: + keycode = CONTROL | AKEY_7; + break; + case XK_8: + keycode = CONTROL | AKEY_8; + break; + case XK_9: + keycode = CONTROL | AKEY_9; + break; + case XK_A: + case XK_a: + keycode = SHIFT | CONTROL | AKEY_a; + break; + case XK_B: + case XK_b: + keycode = SHIFT | CONTROL | AKEY_b; + break; + case XK_C: + case XK_c: + keycode = SHIFT | CONTROL | AKEY_c; + break; + case XK_D: + case XK_d: + keycode = SHIFT | CONTROL | AKEY_d; + break; + case XK_E: + case XK_e: + keycode = SHIFT | CONTROL | AKEY_e; + break; + case XK_F: + case XK_f: + keycode = SHIFT | CONTROL | AKEY_f; + break; + case XK_G: + case XK_g: + keycode = SHIFT | CONTROL | AKEY_g; + break; + case XK_H: + case XK_h: + keycode = SHIFT | CONTROL | AKEY_h; + break; + case XK_I: + case XK_i: + keycode = SHIFT | CONTROL | AKEY_i; + break; + case XK_J: + case XK_j: + keycode = SHIFT | CONTROL | AKEY_j; + break; + case XK_K: + case XK_k: + keycode = SHIFT | CONTROL | AKEY_k; + break; + case XK_L: + case XK_l: + keycode = SHIFT | CONTROL | AKEY_l; + break; + case XK_M: + case XK_m: + keycode = SHIFT | CONTROL | AKEY_m; + break; + case XK_N: + case XK_n: + keycode = SHIFT | CONTROL | AKEY_n; + break; + case XK_O: + case XK_o: + keycode = SHIFT | CONTROL | AKEY_o; + break; + case XK_P: + case XK_p: + keycode = SHIFT | CONTROL | AKEY_p; + break; + case XK_Q: + case XK_q: + keycode = SHIFT | CONTROL | AKEY_q; + break; + case XK_R: + case XK_r: + keycode = SHIFT | CONTROL | AKEY_r; + break; + case XK_S: + case XK_s: + keycode = SHIFT | CONTROL | AKEY_s; + break; + case XK_T: + case XK_t: + keycode = SHIFT | CONTROL | AKEY_t; + break; + case XK_U: + case XK_u: + keycode = SHIFT | CONTROL | AKEY_u; + break; + case XK_V: + case XK_v: + keycode = SHIFT | CONTROL | AKEY_v; + break; + case XK_W: + case XK_w: + keycode = SHIFT | CONTROL | AKEY_w; + break; + case XK_X: + case XK_x: + keycode = SHIFT | CONTROL | AKEY_x; + break; + case XK_Y: + case XK_y: + keycode = SHIFT | CONTROL | AKEY_y; + break; + case XK_Z: + case XK_z: + keycode = SHIFT | CONTROL | AKEY_z; + break; + default: + if (x11bug) + printf("Pressed Keysym = %x\n", (int) keysym); + break; + } + break; + case KeyRelease: + keycode = AKEY_NONE; + switch (keysym) { + case XK_Shift_L: + case XK_Shift_R: + INPUT_key_shift = 0; + SHIFT = 0x00; + break; + case XK_Control_L: + keypad_trig = 1; + /* FALLTHROUGH */ + case XK_Control_R: + CONTROL = 0x00; + break; + case XK_Shift_Lock: + if (x11bug) + printf("XK_Shift_Lock\n"); + break; + case XK_F2: + keyboard_consol |= INPUT_CONSOL_OPTION; + break; + case XK_F3: + keyboard_consol |= INPUT_CONSOL_SELECT; + break; + case XK_F4: + keyboard_consol |= INPUT_CONSOL_START; + break; + case XK_space: + case XK_KP_0: + keypad_trig = 1; + break; + case XK_Down: + case XK_KP_2: + keypad_stick |= INPUT_STICK_CENTRE ^ INPUT_STICK_BACK; + break; + case XK_Left: + case XK_KP_4: + keypad_stick |= INPUT_STICK_CENTRE ^ INPUT_STICK_LEFT; + break; + case XK_Right: + case XK_KP_6: + keypad_stick |= INPUT_STICK_CENTRE ^ INPUT_STICK_RIGHT; + break; + case XK_Up: + case XK_KP_8: + keypad_stick |= INPUT_STICK_CENTRE ^ INPUT_STICK_FORWARD; + break; + case XK_KP_1: + case XK_KP_3: + case XK_KP_5: + case XK_KP_7: + case XK_KP_9: + keypad_stick = INPUT_STICK_CENTRE; + break; + default: + break; + } + break; + } + return keycode; +} + +#if defined(XVIEW) || defined(MOTIF) + +static int insert_rom(const char *filename) +{ + int r; + int i; + r = CARTRIDGE_Insert(filename); + if (r < 0) + return FALSE; + if (r == 0) { + Atari800_Coldstart(); + return TRUE; + } + /* TODO: select cartridge type */ + for (i = 1; i < CARTRIDGE_LAST_SUPPORTED; i++) { + if (CARTRIDGE_kb[i] == r) { + CARTRIDGE_type = i; + Atari800_Coldstart(); + return TRUE; + } + } + return FALSE; +} + +static int xview_keycode = AKEY_NONE; + +#endif /* defined(XVIEW) || defined(MOTIF) */ + +#ifdef XVIEW + +static void event_proc(Xv_Window window, Event * event, Notify_arg arg) +{ + xview_keycode = GetKeyCode(event->ie_xevent); +} + +static int auto_reboot; + +static int disk_change(char *a, char *full_filename, char *filename) +{ + int diskno; + int status; + + diskno = 1; + + if (!auto_reboot) + diskno = notice_prompt(panel, NULL, + NOTICE_MESSAGE_STRINGS, + "Insert Disk into which drive?", + NULL, + NOTICE_BUTTON, "1", 1, + NOTICE_BUTTON, "2", 2, + NOTICE_BUTTON, "3", 3, + NOTICE_BUTTON, "4", 4, + NOTICE_BUTTON, "5", 5, + NOTICE_BUTTON, "6", 6, + NOTICE_BUTTON, "7", 7, + NOTICE_BUTTON, "8", 8, + NULL); + + if ((diskno < 1) || (diskno > 8)) { + printf("Invalid diskno: %d\n", diskno); + exit(1); + } + SIO_Dismount(diskno); + if (!SIO_Mount(diskno, full_filename, FALSE)) + status = XV_ERROR; + else { + if (auto_reboot) + Atari800_Coldstart(); + status = XV_OK; + } + + return status; +} + +static void boot_callback(void) +{ + static char dir[FILENAME_MAX]; + if (UI_n_atari_files_dir > 0) + strcpy(dir, UI_atari_files_dir[0]); + else + dir[0] = '\0'; + auto_reboot = TRUE; + xv_set(chooser, + FRAME_LABEL, "Disk Selector", + FILE_CHOOSER_DIRECTORY, dir, + FILE_CHOOSER_NOTIFY_FUNC, disk_change, + XV_SHOW, TRUE, + NULL); +} + +static void insert_callback(void) +{ + static char dir[FILENAME_MAX]; + if (UI_n_atari_files_dir > 0) + strcpy(dir, UI_atari_files_dir[0]); + else + dir[0] = '\0'; + auto_reboot = FALSE; + xv_set(chooser, + FRAME_LABEL, "Disk Selector", + FILE_CHOOSER_DIRECTORY, dir, + FILE_CHOOSER_NOTIFY_FUNC, disk_change, + XV_SHOW, TRUE, + NULL); +} + +static void eject_callback(void) +{ + int diskno; + + diskno = notice_prompt(panel, NULL, + NOTICE_MESSAGE_STRINGS, + "Eject Disk from drive?", + NULL, + NOTICE_BUTTON, "1", 1, + NOTICE_BUTTON, "2", 2, + NOTICE_BUTTON, "3", 3, + NOTICE_BUTTON, "4", 4, + NOTICE_BUTTON, "5", 5, + NOTICE_BUTTON, "6", 6, + NOTICE_BUTTON, "7", 7, + NOTICE_BUTTON, "8", 8, + NULL); + + if (diskno >= 1 && diskno <= 8) + SIO_Dismount(diskno); +} + +static void disable_callback(void) +{ + int diskno; + + diskno = notice_prompt(panel, NULL, + NOTICE_MESSAGE_STRINGS, + "Drive to Disable?", + NULL, + NOTICE_BUTTON, "1", 1, + NOTICE_BUTTON, "2", 2, + NOTICE_BUTTON, "3", 3, + NOTICE_BUTTON, "4", 4, + NOTICE_BUTTON, "5", 5, + NOTICE_BUTTON, "6", 6, + NOTICE_BUTTON, "7", 7, + NOTICE_BUTTON, "8", 8, + NULL); + + if (diskno >= 1 && diskno <= 8) + SIO_DisableDrive(diskno); +} + +static int rom_change(char *a, char *full_filename, char *filename) +{ + return insert_rom(full_filename) ? XV_OK : XV_ERROR; +} + +static void insert_rom_callback(void) +{ + static char dir[FILENAME_MAX]; + if (UI_n_atari_files_dir > 0) + strcpy(dir, UI_atari_files_dir[0]); + else + dir[0] = '\0'; + xv_set(chooser, + FRAME_LABEL, "ROM Selector", + FILE_CHOOSER_DIRECTORY, dir, + FILE_CHOOSER_NOTIFY_FUNC, rom_change, + XV_SHOW, TRUE, + NULL); +} + +static void remove_rom_callback(void) +{ + CARTRIDGE_Remove(); + Atari800_Coldstart(); +} + +static void exit_callback(void) +{ + Atari800_Exit(FALSE); + exit(1); +} + +static void option_callback(void) +{ + menu_consol &= (~INPUT_CONSOL_OPTION); +} + +static void select_callback(void) +{ + menu_consol &= (~INPUT_CONSOL_SELECT); +} + +static void start_callback(void) +{ + menu_consol &= (~INPUT_CONSOL_START); +} + +static void reset_callback(void) +{ + Atari800_Warmstart(); +} + +static void coldstart_callback(void) +{ + Atari800_Coldstart(); +} + +static void coldstart_sys(int machtype, int ram, const char *errmsg) +{ + Atari800_machine_type = machtype; + MEMORY_ram_size = ram; + if (!Atari800_InitialiseMachine()) { + notice_prompt(panel, NULL, + NOTICE_MESSAGE_STRINGS, + errmsg, + NULL, + NOTICE_BUTTON, "Cancel", 1, + NULL); + } +} + +static void coldstart_osa_callback(void) +{ + coldstart_sys(Atari800_MACHINE_OSA, 48, "Sorry, OS/A ROM Unavailable"); +} + +static void coldstart_osb_callback(void) +{ + coldstart_sys(Atari800_MACHINE_OSB, 48, "Sorry, OS/B ROM Unavailable"); +} + +static void coldstart_xl_callback(void) +{ + coldstart_sys(Atari800_MACHINE_XLXE, 64, "Sorry, XL/XE ROM Unavailable"); +} + +static void coldstart_xe_callback(void) +{ + coldstart_sys(Atari800_MACHINE_XLXE, 128, "Sorry, XL/XE ROM Unavailable"); +} + +static void coldstart_5200_callback(void) +{ + coldstart_sys(Atari800_MACHINE_5200, 16, "Sorry, 5200 ROM Unavailable"); +} + +static void controllers_ok_callback(void) +{ + xv_set(controllers_frame, + XV_SHOW, FALSE, + NULL); +} + +static void controllers_callback(void) +{ + xv_set(controllers_frame, + XV_SHOW, TRUE, + NULL); +} + +static void sorry_message(void) +{ + notice_prompt(panel, NULL, + NOTICE_MESSAGE_STRINGS, + "Sorry, controller already assigned", + "to another device", + NULL, + NOTICE_BUTTON, "Cancel", 1, + NULL); +} + +static void keypad_callback(void) +{ + int new_mode; + + new_mode = xv_get(keypad_item, PANEL_VALUE); + + if ((new_mode != xmouse_mode) && + (new_mode != js0_mode) && + (new_mode != js1_mode)) { + keypad_mode = new_mode; + } + else { + sorry_message(); + xv_set(keypad_item, + PANEL_VALUE, keypad_mode, + NULL); + } +} + +static void mouse_callback(void) +{ + int new_mode; + + new_mode = xv_get(mouse_item, PANEL_VALUE); + + if ((new_mode != keypad_mode) && + (new_mode != js0_mode) && + (new_mode != js1_mode)) { + xmouse_mode = new_mode; + } + else { + sorry_message(); + xv_set(mouse_item, + PANEL_VALUE, xmouse_mode, + NULL); + } +} + +#ifdef LINUX_JOYSTICK +static void js0_callback(void) +{ + int new_mode; + + new_mode = xv_get(js0_item, PANEL_VALUE); + + if ((new_mode != keypad_mode) && + (new_mode != xmouse_mode) && + (new_mode != js1_mode)) { + js0_mode = new_mode; + } + else { + sorry_message(); + xv_set(js0_item, + PANEL_VALUE, js0_mode, + NULL); + } +} + +static void js1_callback(void) +{ + int new_mode; + + new_mode = xv_get(js1_item, PANEL_VALUE); + + if ((new_mode != keypad_mode) && + (new_mode != xmouse_mode) && + (new_mode != js0_mode)) { + js1_mode = new_mode; + } + else { + sorry_message(); + xv_set(js1_item, + PANEL_VALUE, js1_mode, + NULL); + } +} +#endif /* LINUX_JOYSTICK */ + +static void performance_ok_callback(void) +{ + xv_set(performance_frame, + XV_SHOW, FALSE, + NULL); +} + +static void performance_callback(void) +{ + xv_set(performance_frame, + XV_SHOW, TRUE, + NULL); +} + +static void refresh_callback(Panel_item item, int value, Event * event) +{ + Atari800_refresh_rate = value; +} + +#endif /* XVIEW */ + +static void Atari_WhatIs(int mode) +{ + switch (mode) { + case 0: + printf("Joystick 0"); + break; + case 1: + printf("Joystick 1"); + break; + case 2: + printf("Joystick 2"); + break; + case 3: + printf("Joystick 3"); + break; + default: + printf("not available"); + break; + } +} + +#ifdef MOTIF + +static void motif_boot_disk(Widget fs, XtPointer client_data, + XtPointer cbs) +{ + char *filename; + + if (XmStringGetLtoR(((XmFileSelectionBoxCallbackStruct *) cbs)->value, + XmSTRING_DEFAULT_CHARSET, &filename)) { + if (*filename) { + SIO_Dismount(1); + if (SIO_Mount(1, filename, FALSE)) + Atari800_Coldstart(); + } + XtFree(filename); + } + XtUnmanageChild(fs); + XtPopdown(XtParent(fs)); +} + +static void motif_select_disk(Widget toggle, XtPointer client_data, XtPointer cbs) +{ + motif_disk_sel = (int) client_data; +} + +static void motif_insert_disk(Widget fs, XtPointer client_data, XtPointer cbs) +{ + char *filename; + + if (XmStringGetLtoR(((XmFileSelectionBoxCallbackStruct *) cbs)->value, + XmSTRING_DEFAULT_CHARSET, &filename)) { + if (*filename) { + SIO_Dismount(motif_disk_sel); + SIO_Mount(motif_disk_sel, filename, FALSE); + } + XtFree(filename); + } + XtUnmanageChild(fs); + XtPopdown(XtParent(fs)); +} + +static void motif_insert_rom(Widget fs, XtPointer client_data, XtPointer cbs) +{ + char *filename; + + if (XmStringGetLtoR(((XmFileSelectionBoxCallbackStruct *) cbs)->value, + XmSTRING_DEFAULT_CHARSET, &filename)) { + if (*filename) { + insert_rom(filename); + } + XtFree(filename); + } + XtUnmanageChild(fs); + XtPopdown(XtParent(fs)); +} + +static void motif_fs_cancel(Widget fs, XtPointer client_data, XtPointer call_data) +{ + XtUnmanageChild(fs); + XtPopdown(XtParent(fs)); +} + +static void motif_eject_cback(Widget button, XtPointer client_data, XtPointer cbs) +{ + SIO_Dismount(((int) client_data) + 1); +} + +static void motif_disable_cback(Widget button, XtPointer client_data, XtPointer cbs) +{ + SIO_DisableDrive(((int) client_data) + 1); +} + +static void update_fsel(Widget fsel) +{ + XmString dirmask; + + XtVaGetValues(fsel, XmNdirMask, &dirmask, NULL); + XmFileSelectionDoSearch(fsel, dirmask); +} + +static void motif_system_cback(Widget w, XtPointer item_no, XtPointer cbs) +{ + XmString t; + int status; + char *errmsg = NULL; + + switch ((int) item_no) { + case 0: + update_fsel(fsel_b); + XtManageChild(fsel_b); + XtPopup(XtParent(fsel_b), XtGrabNone); + break; + case 1: + /* insert disk */ + update_fsel(fsel_d); + XtManageChild(fsel_d); + XtPopup(XtParent(fsel_d), XtGrabNone); + break; + case 2: + /* eject disk */ + /* handled by pullright menu */ + break; + case 3: + /* disable drive */ + /* handled by pullright menu */ + break; + case 4: + /* insert rom */ + update_fsel(fsel_r); + XtManageChild(fsel_r); + XtPopup(XtParent(fsel_r), XtGrabNone); + break; + case 5: + CARTRIDGE_Remove(); + Atari800_Coldstart(); + break; + case 6: + Atari800_machine_type = Atari800_MACHINE_OSA; + MEMORY_ram_size = 48; + status = Atari800_InitialiseMachine(); + if (status == 0) + errmsg = "Sorry, OS/A ROM Unavailable"; + break; + case 7: + Atari800_machine_type = Atari800_MACHINE_OSB; + MEMORY_ram_size = 48; + status = Atari800_InitialiseMachine(); + if (status == 0) + errmsg = "Sorry, OS/B ROM Unavailable"; + break; + case 8: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 64; + status = Atari800_InitialiseMachine(); + if (status == 0) + errmsg = "Sorry, XL/XE ROM Unavailable"; + break; + case 9: + Atari800_machine_type = Atari800_MACHINE_XLXE; + MEMORY_ram_size = 128; + status = Atari800_InitialiseMachine(); + if (status == 0) + errmsg = "Sorry, XL/XE ROM Unavailable"; + break; + case 10: + Atari800_machine_type = Atari800_MACHINE_5200; + MEMORY_ram_size = 16; + status = Atari800_InitialiseMachine(); + if (status == 0) + errmsg = "Sorry, 5200 ROM Unavailable"; + break; + case 11: + Atari800_Exit(FALSE); + exit(0); + } + + if (errmsg) { + static Widget dialog = NULL; + + if (!dialog) { + Arg arg[1]; + + dialog = XmCreateErrorDialog(main_w, "message", arg, 0); + + XtVaSetValues(dialog, + XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL, + NULL); + + XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_OK_BUTTON)); + XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); + } + t = XmStringCreateSimple(errmsg); + XtVaSetValues(dialog, + XmNmessageString, t, + NULL); + XmStringFree(t); + XtManageChild(dialog); + } +} + +static void motif_consol_cback(Widget w, XtPointer item_no, XtPointer cbs) +{ + switch ((int) item_no) { + case 0: + menu_consol &= (~INPUT_CONSOL_OPTION); + break; + case 1: + menu_consol &= (~INPUT_CONSOL_SELECT); + break; + case 2: + menu_consol &= (~INPUT_CONSOL_START); + break; + case 3: + Atari800_Warmstart(); + break; + case 4: + Atari800_Coldstart(); + break; + } +} + +static void motif_keypress(Widget w, XtPointer client_data, XEvent *event, + Boolean *continue_to_dispatch) +{ + xview_keycode = GetKeyCode(event); +} + +static void motif_exposure(Widget w, XtPointer client_data, XEvent *event, + Boolean *continue_to_dispatch) +{ + modified = TRUE; +} + +#endif /* MOTIF */ + +int PLATFORM_Initialise(int *argc, char *argv[]) +{ +#if !defined(XVIEW) && !defined(MOTIF) + XSetWindowAttributes xswda; +#endif + + XGCValues xgcvl; + + int depth; + int colorstep; + int i, j; + int mode = 0; + int help_only = FALSE; + +#ifdef XVIEW + int ypos; + + xv_init(XV_INIT_ARGC_PTR_ARGV, argc, argv, NULL); +#endif + +#ifdef MOTIF + toplevel = XtVaAppInitialize(&app, "Atari800", + NULL, 0, + argc, argv, NULL, + XtNtitle, Atari800_TITLE, + NULL); +#endif + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-small") == 0) + windowsize = Small; + else if (strcmp(argv[i], "-large") == 0) + windowsize = Large; + else if (strcmp(argv[i], "-huge") == 0) + windowsize = Huge; + else if (strcmp(argv[i], "-clip_x") == 0) + if (i_a) + clipping_x = atoi(argv[++i]); + else a_m = TRUE; + else if (strcmp(argv[i], "-clip_y") == 0) + if (i_a) + clipping_y = atoi(argv[++i]); + else a_m = TRUE; + else if (strcmp(argv[i], "-clip_width") == 0) + if (i_a) + clipping_width = atoi(argv[++i]); + else a_m = TRUE; + else if (strcmp(argv[i], "-clip_height") == 0) + if (i_a) + clipping_height = atoi(argv[++i]); + else a_m = TRUE; + else if (strcmp(argv[i], "-x11bug") == 0) + x11bug = TRUE; + else if (strcmp(argv[i], "-sio") == 0) + x11_monitor = MONITOR_SIO; + else if (strcmp(argv[i], "-private_cmap") == 0) + private_cmap = TRUE; + else if (strcmp(argv[i], "-keypad") == 0) { + if (keypad_mode == -1) + keypad_mode = mode++; + } + else { + if (strcmp(argv[i], "-help") == 0) { + help_only = TRUE; + printf("\t-small Small window (%dx%d)\n", + clipping_width, clipping_height); + printf("\t-large Large window (%dx%d)\n", + clipping_width * 2, clipping_height * 2); + printf("\t-huge Huge window (%dx%d)\n", + clipping_width * 3, clipping_height * 3); + printf("\t-x11bug Enable debug code in atari_x11.c\n"); + printf("\t-clip_x Set left offset in pixels for clipping\n"); + printf("\t-clip_width Set window clip-width\n"); + printf("\t-clip_y Set top offset for clipping\n"); + printf("\t-clip_height Set window clip-height\n"); + printf("\t-private_cmap Use private colormap\n"); + printf("\t-sio Show SIO monitor\n"); + printf("\t-keypad Keypad mode\n"); + } + argv[j++] = argv[i]; + } + } + + *argc = j; + +#ifdef SOUND + if (!Sound_Initialise(argc, argv)) + return FALSE; +#endif + + if (help_only) + return TRUE; + + if ((clipping_x < 0) || (clipping_x >= Screen_WIDTH)) + clipping_x = 0; + if ((clipping_y < 0) || (clipping_y >= Screen_HEIGHT)) + clipping_y = 0; + if ((clipping_width <= 0) || (clipping_x + clipping_width > Screen_WIDTH)) + clipping_width = Screen_WIDTH - clipping_x; + if ((clipping_height <= 0) || (clipping_y + clipping_height > Screen_HEIGHT)) + clipping_height = Screen_HEIGHT - clipping_y; + Screen_visible_x1 = clipping_x; + Screen_visible_x2 = clipping_x + clipping_width; + Screen_visible_y1 = clipping_y; + Screen_visible_y2 = clipping_y + clipping_height; + switch (windowsize) { + case Small: + clipping_factor = 1; + window_width = clipping_width; + window_height = clipping_height; + break; + case Large: + clipping_factor = 2; + window_width = clipping_width * 2; + window_height = clipping_height * 2; + break; + case Huge: + clipping_factor = 3; + window_width = clipping_width * 3; + window_height = clipping_height * 3; + break; + } + +#ifdef LINUX_JOYSTICK + js0 = open("/dev/js0", O_RDONLY, 0777); + if (js0 != -1) { + int status; + + status = read(js0, &js_data, JS_RETURN); + if (status != JS_RETURN) { + perror("/dev/js0"); + exit(1); + } + js0_centre_x = js_data.x; + js0_centre_y = js_data.y; + + if (x11bug) + printf("Joystick 0: centre_x = %d, centry_y = %d\n", + js0_centre_x, js0_centre_y); + + js0_mode = mode++; + } + js1 = open("/dev/js1", O_RDONLY, 0777); + if (js1 != -1) { + int status; + + status = read(js1, &js_data, JS_RETURN); + if (status != JS_RETURN) { + perror("/dev/js1"); + exit(1); + } + js1_centre_x = js_data.x; + js1_centre_y = js_data.y; + + if (x11bug) + printf("Joystick 1: centre_x = %d, centry_y = %d\n", + js1_centre_x, js1_centre_y); + + js1_mode = mode++; + } +#endif + + xmouse_mode = mode++; + if (keypad_mode == -1) + keypad_mode = mode++; + +#ifdef XVIEW + frame = (Frame) xv_create((Xv_opaque) NULL, FRAME, + FRAME_LABEL, Atari800_TITLE, + FRAME_SHOW_RESIZE_CORNER, FALSE, + XV_WIDTH, window_width, + XV_HEIGHT, window_height + 27, + FRAME_SHOW_FOOTER, TRUE, + XV_SHOW, TRUE, + NULL); + + panel = (Panel) xv_create(frame, PANEL, + XV_HEIGHT, 25, + XV_SHOW, TRUE, + NULL); + + system_menu = xv_create((Xv_opaque) NULL, MENU, + MENU_ITEM, + MENU_STRING, "Boot Disk", + MENU_NOTIFY_PROC, boot_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Insert Disk", + MENU_NOTIFY_PROC, insert_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Eject Disk", + MENU_NOTIFY_PROC, eject_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Disable Drive", + MENU_NOTIFY_PROC, disable_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Insert Cartridge", + MENU_NOTIFY_PROC, insert_rom_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Remove Cartridge", + MENU_NOTIFY_PROC, remove_rom_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Atari 800 OS/A", + MENU_NOTIFY_PROC, coldstart_osa_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Atari 800 OS/B", + MENU_NOTIFY_PROC, coldstart_osb_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Atari 800XL", + MENU_NOTIFY_PROC, coldstart_xl_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Atari 130XE", + MENU_NOTIFY_PROC, coldstart_xe_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Atari 5200", + MENU_NOTIFY_PROC, coldstart_5200_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Exit", + MENU_NOTIFY_PROC, exit_callback, + NULL, + NULL); + + xv_create(panel, PANEL_BUTTON, + PANEL_LABEL_STRING, "System", + PANEL_ITEM_MENU, system_menu, + NULL); + + consol_menu = (Menu) xv_create((Xv_opaque) NULL, MENU, + MENU_ITEM, + MENU_STRING, "Option", + MENU_NOTIFY_PROC, option_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Select", + MENU_NOTIFY_PROC, select_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Start", + MENU_NOTIFY_PROC, start_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Reset", + MENU_NOTIFY_PROC, reset_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Coldstart", + MENU_NOTIFY_PROC, coldstart_callback, + NULL, + NULL); + + xv_create(panel, PANEL_BUTTON, + PANEL_LABEL_STRING, "Console", + PANEL_ITEM_MENU, consol_menu, + NULL); + + options_menu = (Menu) xv_create((Xv_opaque) NULL, MENU, + MENU_ITEM, + MENU_STRING, "Controllers", + MENU_NOTIFY_PROC, controllers_callback, + NULL, + MENU_ITEM, + MENU_STRING, "Performance", + MENU_NOTIFY_PROC, performance_callback, + NULL, + NULL); + + xv_create(panel, PANEL_BUTTON, + PANEL_LABEL_STRING, "Options", + PANEL_ITEM_MENU, options_menu, + NULL); + + canvas = (Canvas) xv_create(frame, CANVAS, + CANVAS_WIDTH, window_width, + CANVAS_HEIGHT, window_height, + NULL); +/* + ===================================== + Create Controller Configuration Frame + ===================================== + */ + controllers_frame = (Frame) xv_create(frame, FRAME_CMD, + FRAME_LABEL, "Controller Configuration", + XV_WIDTH, 300, + XV_HEIGHT, 150, + NULL); + + controllers_panel = (Panel) xv_get(controllers_frame, FRAME_CMD_PANEL, + NULL); + + ypos = 10; + keypad_item = (Panel_item) xv_create(controllers_panel, PANEL_CHOICE_STACK, + PANEL_VALUE_X, 150, + PANEL_VALUE_Y, ypos, + PANEL_LAYOUT, PANEL_HORIZONTAL, + PANEL_LABEL_STRING, "Numeric Keypad", + PANEL_CHOICE_STRINGS, + "Joystick 1", + "Joystick 2", + "Joystick 3", + "Joystick 4", + NULL, + PANEL_VALUE, keypad_mode, + PANEL_NOTIFY_PROC, keypad_callback, + NULL); + ypos += 25; + + mouse_item = (Panel_item) xv_create(controllers_panel, PANEL_CHOICE_STACK, + PANEL_VALUE_X, 150, + PANEL_VALUE_Y, ypos, + PANEL_LAYOUT, PANEL_HORIZONTAL, + PANEL_LABEL_STRING, "Mouse", + PANEL_CHOICE_STRINGS, + "Joystick 1", + "Joystick 2", + "Joystick 3", + "Joystick 4", + NULL, + PANEL_VALUE, xmouse_mode, + PANEL_NOTIFY_PROC, mouse_callback, + NULL); + ypos += 25; + +#ifdef LINUX_JOYSTICK + if (js0 != -1) { + js0_item = (Panel_item) xv_create(controllers_panel, PANEL_CHOICE_STACK, + PANEL_VALUE_X, 150, + PANEL_VALUE_Y, ypos, + PANEL_LAYOUT, PANEL_HORIZONTAL, + PANEL_LABEL_STRING, "/dev/js0", + PANEL_CHOICE_STRINGS, + "Joystick 1", + "Joystick 2", + "Joystick 3", + "Joystick 4", + NULL, + PANEL_VALUE, js0_mode, + PANEL_NOTIFY_PROC, js0_callback, + NULL); + ypos += 25; + } + if (js1 != -1) { + js1_item = (Panel_item) xv_create(controllers_panel, PANEL_CHOICE_STACK, + PANEL_VALUE_X, 150, + PANEL_VALUE_Y, ypos, + PANEL_LAYOUT, PANEL_HORIZONTAL, + PANEL_LABEL_STRING, "/dev/js1", + PANEL_CHOICE_STRINGS, + "Joystick 1", + "Joystick 2", + "Joystick 3", + "Joystick 4", + NULL, + PANEL_VALUE, js1_mode, + PANEL_NOTIFY_PROC, js1_callback, + NULL); + ypos += 25; + } +#endif + + xv_create(controllers_panel, PANEL_BUTTON, + XV_X, 130, + XV_Y, 125, + PANEL_LABEL_STRING, "OK", + PANEL_NOTIFY_PROC, controllers_ok_callback, + NULL); +/* + ====================================== + Create Performance Configuration Frame + ====================================== + */ + performance_frame = (Frame) xv_create(frame, FRAME_CMD, + FRAME_LABEL, "Performance Configuration", + XV_WIDTH, 400, + XV_HEIGHT, 100, + NULL); + + performance_panel = (Panel) xv_get(performance_frame, FRAME_CMD_PANEL, + NULL); + + ypos = 10; + refresh_slider = (Panel_item) xv_create(performance_panel, PANEL_SLIDER, + PANEL_VALUE_X, 155, + PANEL_VALUE_Y, ypos, + PANEL_LAYOUT, PANEL_HORIZONTAL, + PANEL_LABEL_STRING, "Screen Refresh Rate", + PANEL_VALUE, Atari800_refresh_rate, + PANEL_MIN_VALUE, 1, + PANEL_MAX_VALUE, 32, + PANEL_SLIDER_WIDTH, 100, + PANEL_TICKS, 32, + PANEL_NOTIFY_PROC, refresh_callback, + NULL); + ypos += 25; + + xv_create(performance_panel, PANEL_BUTTON, + XV_X, 180, + XV_Y, 75, + PANEL_LABEL_STRING, "OK", + PANEL_NOTIFY_PROC, performance_ok_callback, + NULL); +/* + ==================== + Get X Window Objects + ==================== + */ + display = (Display *) xv_get(frame, XV_DISPLAY); + if (!display) { + printf("Failed to open display\n"); + exit(1); + } + autorepeat_get(); + screen = XDefaultScreenOfDisplay(display); + if (!screen) { + printf("Unable to get screen\n"); + exit(1); + } + visual = XDefaultVisualOfScreen(screen); + if (!visual) { + printf("Unable to get visual\n"); + exit(1); + } + window = (Window) xv_get(canvas_paint_window(canvas), XV_XID); + depth = XDefaultDepthOfScreen(screen); + cmap = XDefaultColormapOfScreen(screen); + + chooser = (Frame) xv_create(frame, FILE_CHOOSER, + FILE_CHOOSER_TYPE, FILE_CHOOSER_OPEN, + NULL); + + xv_set(canvas_paint_window(canvas), + WIN_EVENT_PROC, event_proc, + WIN_CONSUME_EVENTS, WIN_ASCII_EVENTS, WIN_MOUSE_BUTTONS, + WIN_VISIBILITY_NOTIFY, /* mmm */ + NULL, + NULL); + +#endif /* XVIEW */ + +#ifdef MOTIF + { + Widget menubar; + + XmString s_system; + XmString s_boot_disk; + XmString s_insert_disk; + XmString s_eject_disk; + XmString s_disable_drive; + XmString s_insert_cart; + XmString s_remove_cart; + XmString s_osa; + XmString s_osb; + XmString s_osxl; + XmString s_osxe; + XmString s_os5200; + XmString s_exit; + + XmString s_console; + XmString s_option; + XmString s_select; + XmString s_start; + XmString s_warmstart; + XmString s_coldstart; + + XmString s_label; + + XmString s_d1, s_d2, s_d3, s_d4; + XmString s_d5, s_d6, s_d7, s_d8; + + char *tmpstr; + XmString xmtmpstr; + + Arg args[8]; + int n; + + main_w = XtVaCreateManagedWidget("main_window", + xmMainWindowWidgetClass, toplevel, + NULL); + + s_system = XmStringCreateSimple("System"); + s_boot_disk = XmStringCreateSimple("Boot Disk..."); + s_insert_disk = XmStringCreateSimple("Insert Disk..."); + s_eject_disk = XmStringCreateSimple("Eject Disk"); + s_disable_drive = XmStringCreateSimple("Disable Drive"); + s_insert_cart = XmStringCreateSimple("Insert Cartridge..."); + s_remove_cart = XmStringCreateSimple("Remove Cartridge"); + s_osa = XmStringCreateSimple("Atari 800 OS/A"); + s_osb = XmStringCreateSimple("Atari 800 OS/B"); + s_osxl = XmStringCreateSimple("Atari 800XL"); + s_osxe = XmStringCreateSimple("Atari 130XE"); + s_os5200 = XmStringCreateSimple("Atari 5200"); + s_exit = XmStringCreateSimple("Exit"); + + s_console = XmStringCreateSimple("Console"); + s_option = XmStringCreateSimple("Option"); + s_select = XmStringCreateSimple("Select"); + s_start = XmStringCreateSimple("Start"); + s_warmstart = XmStringCreateSimple("Warmstart"); + s_coldstart = XmStringCreateSimple("Coldstart"); + + menubar = XmVaCreateSimpleMenuBar(main_w, "menubar", + XmVaCASCADEBUTTON, s_system, 'S', + XmVaCASCADEBUTTON, s_console, 'C', + NULL); + + system_menu = + XmVaCreateSimplePulldownMenu(menubar, "system_menu", 0, motif_system_cback, + XmVaPUSHBUTTON, s_boot_disk, 'o', NULL, NULL, + XmVaPUSHBUTTON, s_insert_disk, 'I', NULL, NULL, + XmVaCASCADEBUTTON, s_eject_disk, 'j', + XmVaCASCADEBUTTON, s_disable_drive, 'D', + XmVaSEPARATOR, + XmVaPUSHBUTTON, s_insert_cart, 'n', NULL, NULL, + XmVaPUSHBUTTON, s_remove_cart, 'R', NULL, NULL, + XmVaSEPARATOR, + XmVaPUSHBUTTON, s_osa, 'A', NULL, NULL, + XmVaPUSHBUTTON, s_osb, 'B', NULL, NULL, + XmVaPUSHBUTTON, s_osxl, 'L', NULL, NULL, + XmVaPUSHBUTTON, s_osxe, 'E', NULL, NULL, + XmVaPUSHBUTTON, s_os5200, '5', NULL, NULL, + XmVaSEPARATOR, + XmVaPUSHBUTTON, s_exit, 'x', NULL, NULL, + NULL); + + XmVaCreateSimplePulldownMenu(menubar, "console_menu", 1, motif_consol_cback, + XmVaPUSHBUTTON, s_option, 'O', NULL, NULL, + XmVaPUSHBUTTON, s_select, 't', NULL, NULL, + XmVaPUSHBUTTON, s_start, 'S', NULL, NULL, + XmVaSEPARATOR, + XmVaPUSHBUTTON, s_warmstart, 'W', NULL, NULL, + XmVaPUSHBUTTON, s_coldstart, 'C', NULL, NULL, + NULL); + + XmStringFree(s_system); + XmStringFree(s_boot_disk); + XmStringFree(s_insert_disk); + XmStringFree(s_eject_disk); + XmStringFree(s_disable_drive); + XmStringFree(s_insert_cart); + XmStringFree(s_remove_cart); + XmStringFree(s_osa); + XmStringFree(s_osb); + XmStringFree(s_osxl); + XmStringFree(s_osxe); + XmStringFree(s_os5200); + XmStringFree(s_exit); + + XmStringFree(s_console); + XmStringFree(s_option); + XmStringFree(s_select); + XmStringFree(s_start); + XmStringFree(s_warmstart); + XmStringFree(s_coldstart); + + XtManageChild(menubar); + + fsel_b = XmCreateFileSelectionDialog(toplevel, "boot_disk", NULL, 0); + XtAddCallback(fsel_b, XmNokCallback, motif_boot_disk, NULL); + XtAddCallback(fsel_b, XmNcancelCallback, motif_fs_cancel, NULL); + + fsel_d = XmCreateFileSelectionDialog(toplevel, "load_disk", NULL, 0); + XtAddCallback(fsel_d, XmNokCallback, motif_insert_disk, NULL); + XtAddCallback(fsel_d, XmNcancelCallback, motif_fs_cancel, NULL); + + n = 0; + XtSetArg(args[n], XmNradioBehavior, True); + n++; + XtSetArg(args[n], XmNradioAlwaysOne, True); + n++; + XtSetArg(args[n], XmNorientation, XmHORIZONTAL); + n++; + rbox_d = XmCreateWorkArea(fsel_d, "rbox_d", args, n); + XtManageChild(rbox_d); + + s_label = XmStringCreateSimple("D1:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + XtSetArg(args[n], XmNset, True); + n++; + togg_d1 = XmCreateToggleButtonGadget(rbox_d, "togg_d1", args, n); + XtManageChild(togg_d1); + XmStringFree(s_label); + XtAddCallback(togg_d1, XmNarmCallback, motif_select_disk, (XtPointer) 1); + + s_label = XmStringCreateSimple("D2:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d2 = XmCreateToggleButtonGadget(rbox_d, "togg_d2", args, n); + XtManageChild(togg_d2); + XmStringFree(s_label); + XtAddCallback(togg_d2, XmNarmCallback, motif_select_disk, (XtPointer) 2); + + s_label = XmStringCreateSimple("D3:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d3 = XmCreateToggleButtonGadget(rbox_d, "togg_d3", args, n); + XtManageChild(togg_d3); + XmStringFree(s_label); + XtAddCallback(togg_d3, XmNarmCallback, motif_select_disk, (XtPointer) 3); + + s_label = XmStringCreateSimple("D4:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d4 = XmCreateToggleButtonGadget(rbox_d, "togg_d4", args, n); + XtManageChild(togg_d4); + XmStringFree(s_label); + XtAddCallback(togg_d4, XmNarmCallback, motif_select_disk, (XtPointer) 4); + + s_label = XmStringCreateSimple("D5:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d5 = XmCreateToggleButtonGadget(rbox_d, "togg_d5", args, n); + XtManageChild(togg_d5); + XmStringFree(s_label); + XtAddCallback(togg_d5, XmNarmCallback, motif_select_disk, (XtPointer) 5); + + s_label = XmStringCreateSimple("D6:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d6 = XmCreateToggleButtonGadget(rbox_d, "togg_d6", args, n); + XtManageChild(togg_d6); + XmStringFree(s_label); + XtAddCallback(togg_d6, XmNarmCallback, motif_select_disk, (XtPointer) 6); + + s_label = XmStringCreateSimple("D7:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d7 = XmCreateToggleButtonGadget(rbox_d, "togg_d7", args, n); + XtManageChild(togg_d7); + XmStringFree(s_label); + XtAddCallback(togg_d7, XmNarmCallback, motif_select_disk, (XtPointer) 7); + + s_label = XmStringCreateSimple("D8:"); + n = 0; + XtSetArg(args[n], XmNlabelString, s_label); + n++; + togg_d8 = XmCreateToggleButtonGadget(rbox_d, "togg_d8", args, n); + XtManageChild(togg_d8); + XmStringFree(s_label); + XtAddCallback(togg_d8, XmNarmCallback, motif_select_disk, (XtPointer) 8); + + + fsel_r = XmCreateFileSelectionDialog(toplevel, "load_rom", NULL, 0); + XtAddCallback(fsel_r, XmNokCallback, motif_insert_rom, NULL); + XtAddCallback(fsel_r, XmNcancelCallback, motif_fs_cancel, NULL); + + if (UI_n_atari_files_dir > 0) { + tmpstr = (char *) XtMalloc(strlen(UI_atari_files_dir[0] + 3)); + strcpy(Util_stpcpy(tmpstr, UI_atari_files_dir[0]), "/*"); + } + else { + tmpstr = (char *) XtMalloc(4); + strcpy(tmpstr, "./*"); + } + xmtmpstr = XmStringCreateSimple(tmpstr); + XmFileSelectionDoSearch(fsel_b, xmtmpstr); + XmFileSelectionDoSearch(fsel_d, xmtmpstr); + XmStringFree(xmtmpstr); + /* XXX: can use the same tmpstr? can use the same xmtmpstr? */ + xmtmpstr = XmStringCreateSimple(tmpstr); + XmFileSelectionDoSearch(fsel_r, xmtmpstr); + XmStringFree(xmtmpstr); + XtFree(tmpstr); + + s_d1 = XmStringCreateSimple("D1:"); + s_d2 = XmStringCreateSimple("D2:"); + s_d3 = XmStringCreateSimple("D3:"); + s_d4 = XmStringCreateSimple("D4:"); + s_d5 = XmStringCreateSimple("D5:"); + s_d6 = XmStringCreateSimple("D6:"); + s_d7 = XmStringCreateSimple("D7:"); + s_d8 = XmStringCreateSimple("D8:"); + eject_menu = XmVaCreateSimplePulldownMenu(system_menu, + "eject_disk", 2, + motif_eject_cback, + XmVaPUSHBUTTON, s_d1, '1', NULL, NULL, + XmVaPUSHBUTTON, s_d2, '2', NULL, NULL, + XmVaPUSHBUTTON, s_d3, '3', NULL, NULL, + XmVaPUSHBUTTON, s_d4, '4', NULL, NULL, + XmVaPUSHBUTTON, s_d5, '5', NULL, NULL, + XmVaPUSHBUTTON, s_d6, '6', NULL, NULL, + XmVaPUSHBUTTON, s_d7, '7', NULL, NULL, + XmVaPUSHBUTTON, s_d8, '8', NULL, NULL, + NULL); + disable_menu = XmVaCreateSimplePulldownMenu(system_menu, + "disable_disk", 3, + motif_disable_cback, + XmVaPUSHBUTTON, s_d1, '1', NULL, NULL, + XmVaPUSHBUTTON, s_d2, '2', NULL, NULL, + XmVaPUSHBUTTON, s_d3, '3', NULL, NULL, + XmVaPUSHBUTTON, s_d4, '4', NULL, NULL, + XmVaPUSHBUTTON, s_d5, '5', NULL, NULL, + XmVaPUSHBUTTON, s_d6, '6', NULL, NULL, + XmVaPUSHBUTTON, s_d7, '7', NULL, NULL, + XmVaPUSHBUTTON, s_d8, '8', NULL, NULL, + NULL); + XmStringFree(s_d1); + XmStringFree(s_d2); + XmStringFree(s_d3); + XmStringFree(s_d4); + XmStringFree(s_d5); + XmStringFree(s_d6); + XmStringFree(s_d7); + XmStringFree(s_d8); + + drawing_area = XtVaCreateManagedWidget("Canvas", + xmDrawingAreaWidgetClass, main_w, + XmNunitType, XmPIXELS, + XmNheight, window_height, + XmNwidth, window_width, + XmNresizePolicy, XmNONE, + NULL); + + XtAddEventHandler(drawing_area, + KeyPressMask | KeyReleaseMask | VisibilityChangeMask | FocusChangeMask, /* mmm */ + False, + motif_keypress, NULL); + + XtAddEventHandler(drawing_area, + ExposureMask, + False, + motif_exposure, NULL); + + XtRealizeWidget(toplevel); + } + + display = XtDisplay(drawing_area); + + window = XtWindow(drawing_area); + + screen = XDefaultScreenOfDisplay(display); + if (!screen) { + printf("Unable to get screen\n"); + exit(1); + } + visual = XDefaultVisualOfScreen(screen); + if (!visual) { + printf("Unable to get visual\n"); + exit(1); + } + depth = XDefaultDepthOfScreen(screen); + cmap = XDefaultColormapOfScreen(screen); +#endif /* MOTIF */ + +#if !defined(XVIEW) && !defined(MOTIF) + display = XOpenDisplay(NULL); + if (!display) { + printf("Failed to open display\n"); + exit(1); + } + screen = XDefaultScreenOfDisplay(display); + if (!screen) { + printf("Unable to get screen\n"); + exit(1); + } + visual = XDefaultVisualOfScreen(screen); + if (!visual) { + printf("Unable to get visual\n"); + exit(1); + } + depth = XDefaultDepthOfScreen(screen); + + if (private_cmap) + cmap = XCreateColormap(display, + XRootWindowOfScreen(screen), + visual, + AllocNone); + else + cmap = XDefaultColormapOfScreen(screen); + + xswda.event_mask = KeyPressMask | KeyReleaseMask | ExposureMask | VisibilityChangeMask | FocusChangeMask /* mmm */; + xswda.colormap = cmap; + + window = XCreateWindow(display, + XRootWindowOfScreen(screen), + 50, 50, + window_width, window_height, 3, depth, + InputOutput, visual, + CWEventMask | CWBackPixel | CWColormap, + &xswda); + + XStoreName(display, window, Atari800_TITLE); +#endif /* !defined(XVIEW) && !defined(MOTIF) */ + +#ifdef SHM + { + int major; + int minor; + Bool pixmaps; + Status status; + int shmsize; + + status = XShmQueryVersion(display, &major, &minor, &pixmaps); + if (!status) { + printf("X Shared Memory extensions not available\n"); + exit(1); + } + printf("Using X11 Shared Memory Extensions\n"); + + image = XShmCreateImage(display, visual, depth, ZPixmap, + NULL, &shminfo, window_width, window_height); + shmsize = (window_width * window_height * + image->bits_per_pixel) / 8; + + shminfo.shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0777); + shminfo.shmaddr = image->data = shmat(shminfo.shmid, 0, 0); + shminfo.readOnly = False; + + XShmAttach(display, &shminfo); + + XSync(display, False); + + shmctl(shminfo.shmid, IPC_RMID, 0); + + } +#else + pixmap = XCreatePixmap(display, window, + window_width, window_height, depth); +#endif /* SHM */ + + if (depth <= 8) + colorstep = 2; + else + colorstep = 1; + for (i = 0; i < 256; i += colorstep) { + XColor colour; + + int rgb = Colours_table[i]; + int status; + + colour.red = (rgb & 0x00ff0000) >> 8; + colour.green = (rgb & 0x0000ff00); + colour.blue = (rgb & 0x000000ff) << 8; + + status = XAllocColor(display, + cmap, + &colour); + + for (j = 0; j < colorstep; j++) + colours[i + j] = colour.pixel; + +#ifdef SHM +#ifdef USE_COLOUR_TRANSLATION_TABLE + for (j = 0; j < colorstep; j++) + colour_translation_table[i + j] = colours[i + j] | (colours[i + j] << 8); +#endif +#endif + } + + for (i = 0; i < 256; i++) { + xgcvl.background = colours[0]; + xgcvl.foreground = colours[i]; + + gc_colour[i] = XCreateGC(display, window, + GCForeground | GCBackground, + &xgcvl); + } + + xgcvl.background = colours[0]; + xgcvl.foreground = colours[0]; + + gc = XCreateGC(display, window, + GCForeground | GCBackground, + &xgcvl); + +#ifndef SHM + XFillRectangle(display, pixmap, gc, 0, 0, + window_width, window_height); + for (i = 0; i < NRECTS; i++) + rectangles[i].height = (windowsize == Huge) ? 3 : 2; +#endif + + XMapWindow(display, window); + + XSync(display, False); + autorepeat_get(); + + /* + ============================ + Storage for Atari 800 Screen + ============================ + */ + image_data = (UBYTE *) Util_malloc(Screen_WIDTH * Screen_HEIGHT); + + keyboard_consol = INPUT_CONSOL_NONE; + + if (x11bug) { + printf("Initial X11 controller configuration\n"); + printf("------------------------------------\n\n"); + printf("Keypad is "); + Atari_WhatIs(keypad_mode); + printf("\n"); + printf("Mouse is "); + Atari_WhatIs(xmouse_mode); + printf("\n"); + printf("/dev/js0 is "); + Atari_WhatIs(js0_mode); + printf("\n"); + printf("/dev/js1 is "); + Atari_WhatIs(js1_mode); + printf("\n"); + } + signal(SIGSEGV, segmentationfault); + + return TRUE; +} + +int PLATFORM_Exit(int run_monitor) +{ + int restart; + + Log_flushlog(); + if (run_monitor) { + autorepeat_restore(); + restart = MONITOR_Run(); + autorepeat_off(); + } + else + restart = FALSE; + + if (!restart) { + if (image_data != NULL) + free(image_data); + + if (display != NULL) { + XSync(display, True); + + if (private_cmap) + XFreeColormap(display, cmap); + +#ifdef SHM + if (image != NULL) + XDestroyImage(image); +#else + XFreePixmap(display, pixmap); +#endif + XUnmapWindow(display, window); + XDestroyWindow(display, window); + autorepeat_restore(); + XCloseDisplay(display); + } + +#ifdef LINUX_JOYSTICK + if (js0 != -1) + close(js0); + + if (js1 != -1) + close(js1); +#endif + + } + return restart; +} + +void PLATFORM_DisplayScreen(void) +{ + static char status_line[64]; + int update_status_line = FALSE; + + if (!invisible) { + const UBYTE *ptr2 = (const UBYTE *) Screen_atari + clipping_y * Screen_WIDTH + clipping_x; + +#ifdef SHM + + int first_x = Screen_WIDTH; + int last_x = -1000; + int first_y = Screen_HEIGHT; + int last_y = -1000; + int x; + int y; + +#define SHM_SET_LAST \ + last_y = y; \ + if (x > last_x) \ + last_x = x; \ + if (x < first_x) \ + first_x = x; + +#define SHM_DISPLAY_SCREEN(pixel_type) \ + pixel_type *ptr = (pixel_type *) image->data; \ + pixel_type help_color; \ + if (windowsize == Small) { \ + for (y = clipping_y; y < (clipping_y + clipping_height); y++) { \ + for (x = clipping_x; x < (clipping_x + clipping_width); x++) { \ + help_color = colours[*ptr2++]; \ + if (help_color != *ptr) { \ + SHM_SET_LAST \ + *ptr = help_color; \ + } \ + ptr++; \ + } \ + if (first_y > last_y && last_y >= 0) \ + first_y = last_y; \ + ptr2 += Screen_WIDTH - clipping_width; \ + } \ + } \ + else if (windowsize == Large) { \ + for (y = clipping_y; y < (clipping_y + clipping_height); y++) { \ + pixel_type *ptr_second_line = ptr + window_width; \ + for (x = clipping_x; x < (clipping_x + clipping_width); x++) { \ + help_color = colours[*ptr2++]; \ + if (help_color != *ptr) { \ + SHM_SET_LAST \ + ptr[0] = help_color; \ + ptr[1] = help_color; \ + ptr_second_line[0] = help_color; \ + ptr_second_line[1] = help_color; \ + } \ + ptr += 2; \ + ptr_second_line += 2; \ + } \ + if (first_y > last_y && last_y >= 0) \ + first_y = last_y; \ + ptr2 += Screen_WIDTH - clipping_width; \ + ptr += window_width; \ + } \ + } \ + else { \ + for (y = clipping_y; y < (clipping_y + clipping_height); y++) { \ + pixel_type *ptr_second_line = ptr + window_width; \ + pixel_type *ptr_third_line = ptr + window_width + window_width; \ + for (x = clipping_x; x < (clipping_x + clipping_width); x++) { \ + help_color = colours[*ptr2++]; \ + if (help_color != *ptr) { \ + SHM_SET_LAST \ + ptr[0] = help_color; \ + ptr[1] = help_color; \ + ptr[2] = help_color; \ + ptr_second_line[0] = help_color; \ + ptr_second_line[1] = help_color; \ + ptr_second_line[2] = help_color; \ + ptr_third_line[0] = help_color; \ + ptr_third_line[1] = help_color; \ + ptr_third_line[2] = help_color; \ + } \ + ptr += 3; \ + ptr_second_line += 3; \ + ptr_third_line += 3; \ + } \ + if (first_y > last_y && last_y >= 0) \ + first_y = last_y; \ + ptr2 += Screen_WIDTH - clipping_width; \ + ptr += window_width + window_width; \ + } \ + } + + if (image->bits_per_pixel == 32) { + SHM_DISPLAY_SCREEN(ULONG) + } + else if (image->bits_per_pixel == 16) { + SHM_DISPLAY_SCREEN(UWORD) + } + else if (image->bits_per_pixel == 8) { + SHM_DISPLAY_SCREEN(UBYTE) + } + + if (modified) { + XShmPutImage(display, window, gc, image, 0, 0, 0, 0, + window_width, window_height, 0); + modified = FALSE; + } + else if (last_y >= 0) { + last_x++; + last_y++; + if (first_x < clipping_x) + first_x = clipping_x; + if (last_x > clipping_x + clipping_width) + last_x = clipping_x + clipping_width; + else if (last_x <= first_x) + last_x = first_x + 1; + if (first_y < clipping_y) + first_y = clipping_y; + if (last_y > clipping_y + clipping_height) + last_y = clipping_y + clipping_height; + else if (last_y <= first_y) + last_y = first_y + 1; + + first_x *= clipping_factor; + last_x *= clipping_factor; + first_y *= clipping_factor; + last_y *= clipping_factor; + + XShmPutImage(display, window, gc, image, + first_x - (clipping_x * clipping_factor), + first_y - (clipping_y * clipping_factor), + first_x - (clipping_x * clipping_factor), + first_y - (clipping_y * clipping_factor), + last_x - first_x, last_y - first_y, 0); + } + + XSync(display, FALSE); + +#else /* SHM */ + + UBYTE *ptr = image_data + clipping_y * Screen_WIDTH + clipping_x; + int n = 0; + int last_colour = -1; + int x; + int y; + + switch (windowsize) { + case Small: + for (y = 0; y < clipping_height; y++) { + for (x = 0; x < clipping_width; x++) { + UBYTE colour = *ptr2++; + if (colour != *ptr) { + *ptr = colour; + if (colour != last_colour || n >= NPOINTS) { + if (n > 0) { + XDrawPoints(display, pixmap, gc_colour[last_colour], + points, n, CoordModeOrigin); + n = 0; + modified = TRUE; + } + last_colour = colour; + } + points[n].x = x; + points[n].y = y; + n++; + } + ptr++; + } + ptr += Screen_WIDTH - clipping_width; + ptr2 += Screen_WIDTH - clipping_width; + } + if (n > 0) { + XDrawPoints(display, pixmap, gc_colour[last_colour], + points, n, CoordModeOrigin); + modified = TRUE; + } + break; + case Large: + for (y = 0; y < window_height; y += 2) { + for (x = 0; x < window_width; ) { + UBYTE colour = *ptr2++; + if (colour != *ptr) { + int width = 2; + *ptr++ = colour; + if (colour != last_colour || n >= NRECTS) { + if (n > 0) { + XFillRectangles(display, pixmap, gc_colour[last_colour], + rectangles, n); + n = 0; + modified = TRUE; + } + last_colour = colour; + } + rectangles[n].x = x; + rectangles[n].y = y; + while ((x += 2) < window_width && colour == *ptr2 && colour != *ptr) { + width += 2; + ptr2++; + *ptr++ = colour; + } + rectangles[n].width = width; + /* rectangles[n].height = 2; */ + n++; + continue; + } + ptr++; + x += 2; + } + ptr += Screen_WIDTH - clipping_width; + ptr2 += Screen_WIDTH - clipping_width; + } + if (n > 0) { + XFillRectangles(display, pixmap, gc_colour[last_colour], + rectangles, n); + modified = TRUE; + } + break; + case Huge: + for (y = 0; y < window_height; y += 3) { + for (x = 0; x < window_width; ) { + UBYTE colour = *ptr2++; + if (colour != *ptr) { + int width = 3; + *ptr++ = colour; + if (colour != last_colour || n >= NRECTS) { + if (n > 0) { + XFillRectangles(display, pixmap, gc_colour[last_colour], + rectangles, n); + n = 0; + modified = TRUE; + } + last_colour = colour; + } + rectangles[n].x = x; + rectangles[n].y = y; + while ((x += 3) < window_width && colour == *ptr2 && colour != *ptr) { + width += 3; + ptr2++; + *ptr++ = colour; + } + rectangles[n].width = width; + /* rectangles[n].height = 3; */ + n++; + continue; + } + ptr++; + x += 3; + } + ptr2 += Screen_WIDTH - clipping_width; + ptr += Screen_WIDTH - clipping_width; + } + if (n > 0) { + XFillRectangles(display, pixmap, gc_colour[last_colour], + rectangles, n); + modified = TRUE; + } + break; + } + + if (modified) { + XCopyArea(display, pixmap, window, gc, 0, 0, + window_width, window_height, 0, 0); + XSync(display, FALSE); + modified = FALSE; + } + +#endif /* SHM */ + + } + + switch (x11_monitor) { + case MONITOR_SIO: + if (SIO_status[0] != '\0') { +#ifdef XVIEW + strcpy(status_line, SIO_status); +#else + sprintf(status_line, "%s - %s", + Atari800_TITLE, SIO_status); +#endif + SIO_status[0] = '\0'; + update_status_line = TRUE; + } + else { + update_status_line = FALSE; + } + break; + default: + update_status_line = FALSE; + break; + } + + if (update_status_line) { +#ifdef XVIEW + xv_set(frame, + FRAME_LEFT_FOOTER, status_line, + NULL); +#else +#ifdef MOTIF + XtVaSetValues(toplevel, + XtNtitle, status_line, + NULL); +#else + XStoreName(display, window, status_line); +#endif +#endif + } + +} + +int PLATFORM_Keyboard(void) +{ + static int keycode = AKEY_NONE; + +#ifdef XVIEW + notify_dispatch(); + XFlush(display); +#endif + +#ifdef MOTIF + while (XtAppPending(app)) { + static XEvent event; + + XtAppNextEvent(app, &event); + XtDispatchEvent(&event); + } +#endif + +#if defined(XVIEW) || defined(MOTIF) + keycode = xview_keycode; +#else + if (XEventsQueued(display, QueuedAfterFlush) > 0) { + XEvent event; + + XNextEvent(display, &event); + keycode = GetKeyCode(&event); + } +#endif + + return keycode; +} + +#if 0 +void experimental_mouse_joystick(int mode) /* Don't use ;-) */ +{ + Window root_return; + Window child_return; + int root_x_return; + int root_y_return; + int win_x_return; + int win_y_return; + int mask_return; + + static int prev_x=-1,prev_y=-1; + + XQueryPointer(display, window, &root_return, &child_return, + &root_x_return, &root_y_return, + &win_x_return, &win_y_return, + &mask_return); + + if (mode < 5) { + int dx,dy; + int course,rc; + + if( prev_x<0 ) prev_x=root_x_return; + if( prev_y<0 ) prev_y=root_y_return; + dx=(root_x_return-prev_x)<<1; + dy=(root_y_return-prev_y)*3; +#define Ms 8 +#define Mc 3 /* Mc/Mm = 2 45 deg. <2 => >45 deg for x or y only */ +#define Mm 2 + if( dx>Ms && dy>Ms ) + { if( dx*Mm>Mc*dy ) + course = 0x08; /* RIGHT */ + else if ( dx*Mcdy*Mm ) + course = 0x01; /* UP */ + else course = 0x05; /* LEFT UP */ + } else if( dx<-Ms && dy>Ms ) + { if( -dx*Mm>Mc*dy ) + course = 0x04; /* LEFT */ + else if ( -dx*McMs && dy<-Ms ) + { if( -dx*Mmdy*Mm ) + course = 0x01; /* UP */ + else course = 0x09; /* RIGHT UP */ + } + else if( dx>Ms ) + course = 0x08; /* RIGHT */ + else if( dx<-Ms ) + course = 0x04; /* LEFT */ + else if( dy>Ms ) + course = 0x02; /* DOWN */ + else if( dy<-Ms ) + course = 0x01; /* UP */ + else course=0; + + rc=(((course&0x5)<<1)|((course&0xa)>>1)); + rc&= ~mouse_stick; + mouse_stick|=rc; + course&=~(((rc&0x5)<<1)|((rc&0xa)>>1)); + mouse_stick&=~course; + + prev_x=root_x_return; + prev_y=root_y_return; + } + else { + if (mask_return) + mouse_stick &= 0xfb; + } +} +#endif + +static void mouse_joystick(int mode) +{ + Window root_return; + Window child_return; + int root_x_return; + int root_y_return; + int win_x_return; + int win_y_return; + unsigned int mask_return; + + mouse_stick = 0x0f; + + XQueryPointer(display, window, &root_return, &child_return, + &root_x_return, &root_y_return, + &win_x_return, &win_y_return, + &mask_return); + + if (mode < 5) { + int center_x; + int center_y; + int threshold; + + if (windowsize == Small) { + center_x = window_width / 2; + center_y = window_height / 2; + threshold = 32; + } + else if (windowsize == Large) { + center_x = window_width / 2; + center_y = window_height / 2; + threshold = 64; + } + else { + center_x = window_width / 2; + center_y = window_height / 2; + threshold = 96; + } + + if (win_x_return < 0 || win_x_return > center_x * 2 || + win_y_return < 0 || win_y_return > center_y * 2 ) + mouse_stick = 0x0f; + else + { + if (win_x_return < (center_x - threshold)) + mouse_stick &= 0xfb; + if (win_x_return > (center_x + threshold)) + mouse_stick &= 0xf7; + if (win_y_return < (center_y - threshold)) + mouse_stick &= 0xfe; + if (win_y_return > (center_y + threshold)) + mouse_stick &= 0xfd; + } + } + else { + if (mask_return) + mouse_stick &= 0xfb; + } +} + +#ifdef LINUX_JOYSTICK + +static void read_joystick(int js, int centre_x, int centre_y) +{ + const int threshold = 50; + int status; + + mouse_stick = 0x0f; + + status = read(js, &js_data, JS_RETURN); + if (status != JS_RETURN) { + perror("/dev/js"); + exit(1); + } + if (js_data.x < (centre_x - threshold)) + mouse_stick &= 0xfb; + if (js_data.x > (centre_x + threshold)) + mouse_stick &= 0xf7; + if (js_data.y < (centre_y - threshold)) + mouse_stick &= 0xfe; + if (js_data.y > (centre_y + threshold)) + mouse_stick &= 0xfd; +} +#endif + +int PLATFORM_PORT(int num) +{ + int nibble_0 = 0x0f; + int nibble_1 = 0x0f; + + if (num == 0) { + if (keypad_mode == 0) + nibble_0 = keypad_stick; + else if (keypad_mode == 1) + nibble_1 = keypad_stick; + + if (INPUT_mouse_mode == INPUT_MOUSE_OFF) { + if (xmouse_mode == 0) { + mouse_joystick(xmouse_mode); + nibble_0 = mouse_stick; + } + else if (xmouse_mode == 1) { + mouse_joystick(xmouse_mode); + nibble_1 = mouse_stick; + } + } +#ifdef LINUX_JOYSTICK + if (js0_mode == 0) { + read_joystick(js0, js0_centre_x, js0_centre_y); + nibble_0 = mouse_stick; + } + else if (js0_mode == 1) { + read_joystick(js0, js0_centre_x, js0_centre_y); + nibble_1 = mouse_stick; + } + if (js1_mode == 0) { + read_joystick(js1, js1_centre_x, js1_centre_y); + nibble_0 = mouse_stick; + } + else if (js1_mode == 1) { + read_joystick(js1, js1_centre_x, js1_centre_y); + nibble_1 = mouse_stick; + } +#endif + } + else { + if (keypad_mode == 2) + nibble_0 = keypad_stick; + else if (keypad_mode == 3) + nibble_1 = keypad_stick; + + if (INPUT_mouse_mode == INPUT_MOUSE_OFF) { + if (xmouse_mode == 2) { + mouse_joystick(xmouse_mode); + nibble_0 = mouse_stick; + } + else if (xmouse_mode == 3) { + mouse_joystick(xmouse_mode); + nibble_1 = mouse_stick; + } + } + +#ifdef LINUX_JOYSTICK + if (js0_mode == 2) { + read_joystick(js0, js0_centre_x, js0_centre_y); + nibble_0 = mouse_stick; + } + else if (js0_mode == 3) { + read_joystick(js0, js0_centre_x, js0_centre_y); + nibble_1 = mouse_stick; + } + if (js1_mode == 2) { + read_joystick(js1, js1_centre_x, js1_centre_y); + nibble_0 = mouse_stick; + } + else if (js1_mode == 3) { + read_joystick(js1, js1_centre_x, js1_centre_y); + nibble_1 = mouse_stick; + } +#endif + } + + return (nibble_1 << 4) | nibble_0; +} + +int PLATFORM_TRIG(int num) +{ + int trig = 1; /* Trigger not pressed */ + + if (num == keypad_mode) { + trig = keypad_trig; + } + if (num == xmouse_mode) { + Window root_return; + Window child_return; + int root_x_return; + int root_y_return; + int win_x_return; + int win_y_return; + unsigned int mask_return; + + if (XQueryPointer(display, window, &root_return, &child_return, + &root_x_return, &root_y_return, + &win_x_return, &win_y_return, + &mask_return)) { + if (win_x_return < 0 || win_x_return > window_width || + win_y_return < 0 || win_y_return > window_height) + trig = 1; + else if (mask_return & Button1Mask) + trig = 0; + } + } +#ifdef LINUX_JOYSTICK + if (num == js0_mode) { + int status; + + status = read(js0, &js_data, JS_RETURN); + if (status != JS_RETURN) { + perror("/dev/js0"); + exit(1); + } + if (js_data.buttons & 0x01) + trig = 0; + else + trig = 1; + } + if (num == js1_mode) { + int status; + + status = read(js1, &js_data, JS_RETURN); + if (status != JS_RETURN) { + perror("/dev/js1"); + exit(1); + } + trig = (js_data.buttons & 0x0f) ? 0 : 1; + } +#endif + + return trig; +} + +void Atari_Mouse(void) +{ + static int last_x = 0; + static int last_y = 0; + Window root_return; + Window child_return; + int root_x_return; + int root_y_return; + int win_x_return; + int win_y_return; + unsigned int mask_return; + + if (INPUT_mouse_mode == INPUT_MOUSE_OFF) + return; + if (XQueryPointer(display, window, &root_return, + &child_return, &root_x_return, &root_y_return, + &win_x_return, &win_y_return, &mask_return)) { + if(INPUT_direct_mouse) { + int potx = win_x_return, poty = win_y_return; + if(potx < 0) potx = 0; + if(poty < 0) poty = 0; + potx = (double)potx * (228.0 / (double)window_width); + poty = (double)poty * (228.0 / (double)window_height); + if(potx > 227) potx = 227; + if(poty > 227) poty = 227; + POKEY_POT_input[INPUT_mouse_port << 1] = 227 - potx; + POKEY_POT_input[(INPUT_mouse_port << 1) + 1] = 227 - poty; + } else { + INPUT_mouse_delta_x = win_x_return - last_x; + INPUT_mouse_delta_y = win_y_return - last_y; + last_x = win_x_return; + last_y = win_y_return; + } + + INPUT_mouse_buttons = (mask_return & Button1Mask ? 1 : 0) + | (mask_return & Button3Mask ? 2 : 0) + | (mask_return & Button2Mask ? 4 : 0); + } +} + +int main(int argc, char **argv) +{ + /* initialise Atari800 core */ + if (!Atari800_Initialise(&argc, argv)) + return 3; + + /* main loop */ + for (;;) { + INPUT_key_code = PLATFORM_Keyboard(); + + if (menu_consol != INPUT_CONSOL_NONE) { + INPUT_key_consol = menu_consol; + menu_consol = INPUT_CONSOL_NONE; + } + else + INPUT_key_consol = keyboard_consol; + + Atari_Mouse(); + + Atari800_Frame(); + if (Atari800_display_screen) + PLATFORM_DisplayScreen(); + } +} diff --git a/PVAtari800/atari800-src/binload.c b/PVAtari800/atari800-src/binload.c new file mode 100644 index 0000000000..3bc0c637ba --- /dev/null +++ b/PVAtari800/atari800-src/binload.c @@ -0,0 +1,185 @@ +/* + * binload.c - load a binary executable file + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include + +#include "atari.h" +#include "binload.h" +#include "cpu.h" +#include "devices.h" +#include "esc.h" +#include "log.h" +#include "memory.h" +#include "sio.h" + +int BINLOAD_start_binloading = FALSE; +int BINLOAD_loading_basic = 0; +FILE *BINLOAD_bin_file = NULL; + +/* Read a word from file */ +static int read_word(void) +{ + UBYTE buf[2]; + if (fread(buf, 1, 2, BINLOAD_bin_file) != 2) { + fclose(BINLOAD_bin_file); + BINLOAD_bin_file = NULL; + if (BINLOAD_start_binloading) { + BINLOAD_start_binloading = FALSE; + Log_print("binload: not valid BIN file"); + return -1; + } + CPU_regPC = MEMORY_dGetWordAligned(0x2e0); + return -1; + } + return buf[0] + (buf[1] << 8); +} + +/* Start or continue loading */ +static void loader_cont(void) +{ + if (BINLOAD_bin_file == NULL) + return; + if (BINLOAD_start_binloading) { + MEMORY_dPutByte(0x244, 0); + MEMORY_dPutByte(0x09, 1); + } + else + CPU_regS += 2; /* pop ESC code */ + + MEMORY_dPutByte(0x2e3, 0xd7); + do { + int temp; + UWORD from; + UWORD to; + do + temp = read_word(); + while (temp == 0xffff); + if (temp < 0) + return; + from = (UWORD) temp; + + temp = read_word(); + if (temp < 0) + return; + to = (UWORD) temp; + + if (BINLOAD_start_binloading) { + MEMORY_dPutWordAligned(0x2e0, from); + BINLOAD_start_binloading = FALSE; + } + + to++; + do { + int byte = fgetc(BINLOAD_bin_file); + if (byte == EOF) { + fclose(BINLOAD_bin_file); + BINLOAD_bin_file = NULL; + CPU_regPC = MEMORY_dGetWordAligned(0x2e0); + if (MEMORY_dGetByte(0x2e3) != 0xd7) { + /* run INIT routine which RTSes directly to RUN routine */ + CPU_regPC--; + MEMORY_dPutByte(0x0100 + CPU_regS--, CPU_regPC >> 8); /* high */ + MEMORY_dPutByte(0x0100 + CPU_regS--, CPU_regPC & 0xff); /* low */ + CPU_regPC = MEMORY_dGetWordAligned(0x2e2); + } + return; + } + MEMORY_PutByte(from, (UBYTE) byte); + from++; + } while (from != to); + } while (MEMORY_dGetByte(0x2e3) == 0xd7); + + CPU_regS--; + ESC_Add((UWORD) (0x100 + CPU_regS), ESC_BINLOADER_CONT, loader_cont); + CPU_regS--; + MEMORY_dPutByte(0x0100 + CPU_regS--, 0x01); /* high */ + MEMORY_dPutByte(0x0100 + CPU_regS, CPU_regS + 1); /* low */ + CPU_regS--; + CPU_regPC = MEMORY_dGetWordAligned(0x2e2); + CPU_SetC; + + MEMORY_dPutByte(0x0300, 0x31); /* for "Studio Dream" */ +} + +/* Fake boot sector to call loader_cont at boot time */ +int BINLOAD_LoaderStart(UBYTE *buffer) +{ + buffer[0] = 0x00; /* ignored */ + buffer[1] = 0x01; /* one boot sector */ + buffer[2] = 0x00; /* start at memory location 0x0700 */ + buffer[3] = 0x07; + buffer[4] = 0x77; /* reset reboots (0xe477 = Atari OS Coldstart) */ + buffer[5] = 0xe4; + buffer[6] = 0xf2; /* ESC */ + buffer[7] = ESC_BINLOADER_CONT; + ESC_Add(0x706, ESC_BINLOADER_CONT, loader_cont); + return 'C'; +} + +/* Load BIN file, returns TRUE if ok */ +int BINLOAD_Loader(const char *filename) +{ + UBYTE buf[2]; + if (BINLOAD_bin_file != NULL) { /* close previously open file */ + fclose(BINLOAD_bin_file); + BINLOAD_bin_file = NULL; + BINLOAD_loading_basic = 0; + } + if (Atari800_machine_type == Atari800_MACHINE_5200) { + Log_print("binload: can't run Atari programs directly on the 5200"); + return FALSE; + } + BINLOAD_bin_file = fopen(filename, "rb"); + if (BINLOAD_bin_file == NULL) { /* open */ + Log_print("binload: can't open \"%s\"", filename); + return FALSE; + } + /* Avoid "BOOT ERROR" when loading a BASIC program */ + if (SIO_drive_status[0] == SIO_NO_DISK) + SIO_DisableDrive(1); + if (fread(buf, 1, 2, BINLOAD_bin_file) == 2) { + if (buf[0] == 0xff && buf[1] == 0xff) { + BINLOAD_start_binloading = TRUE; /* force SIO to call BINLOAD_LoaderStart at boot */ + Atari800_Coldstart(); /* reboot */ + return TRUE; + } + else if (buf[0] == 0 && buf[1] == 0) { + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_SAVED; + ESC_UpdatePatches(); + Atari800_Coldstart(); + return TRUE; + } + else if (buf[0] >= '0' && buf[0] <= '9') { + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_LISTED; + ESC_UpdatePatches(); + Atari800_Coldstart(); + return TRUE; + } + } + fclose(BINLOAD_bin_file); + BINLOAD_bin_file = NULL; + Log_print("binload: \"%s\" not recognized as a DOS or BASIC program", filename); + return FALSE; +} diff --git a/PVAtari800/atari800-src/binload.h b/PVAtari800/atari800-src/binload.h new file mode 100644 index 0000000000..58197c2595 --- /dev/null +++ b/PVAtari800/atari800-src/binload.h @@ -0,0 +1,22 @@ +#ifndef BINLOAD_H_ +#define BINLOAD_H_ + +#include /* FILE */ +#include "atari.h" /* UBYTE */ + +extern FILE *BINLOAD_bin_file; + +int BINLOAD_Loader(const char *filename); +extern int BINLOAD_start_binloading; +extern int BINLOAD_loading_basic; +#define BINLOAD_LOADING_BASIC_SAVED 1 +#define BINLOAD_LOADING_BASIC_LISTED 2 +#define BINLOAD_LOADING_BASIC_LISTED_ATARI 3 +#define BINLOAD_LOADING_BASIC_LISTED_CR 4 +#define BINLOAD_LOADING_BASIC_LISTED_LF 5 +#define BINLOAD_LOADING_BASIC_LISTED_CRLF 6 +#define BINLOAD_LOADING_BASIC_LISTED_CR_OR_CRLF 7 +#define BINLOAD_LOADING_BASIC_RUN 8 +int BINLOAD_LoaderStart(UBYTE *buffer); + +#endif /* BINLOAD_H_ */ diff --git a/PVAtari800/atari800-src/cartridge.c b/PVAtari800/atari800-src/cartridge.c new file mode 100644 index 0000000000..bff82bec1a --- /dev/null +++ b/PVAtari800/atari800-src/cartridge.c @@ -0,0 +1,1746 @@ +/* + * cartridge.c - cartridge emulation + * + * Copyright (C) 2001-2010 Piotr Fusik + * Copyright (C) 2001-2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include +#include + +#include "atari.h" +#include "binload.h" /* BINLOAD_loading_basic */ +#include "cartridge.h" +#include "memory.h" +#ifdef IDE +# include "ide.h" +#endif +#include "pia.h" +#include "rtime.h" +#include "util.h" +#ifndef BASIC +#include "statesav.h" +#endif +#ifdef AF80 +#include "af80.h" +#endif +#include "log.h" + +/* #define DEBUG 1 */ + +int const CARTRIDGE_kb[CARTRIDGE_LAST_SUPPORTED + 1] = { + 0, + 8, /* CARTRIDGE_STD_8 */ + 16, /* CARTRIDGE_STD_16 */ + 16, /* CARTRIDGE_OSS_034M_16 */ + 32, /* CARTRIDGE_5200_32 */ + 32, /* CARTRIDGE_DB_32 */ + 16, /* CARTRIDGE_5200_EE_16 */ + 40, /* CARTRIDGE_5200_40 */ + 64, /* CARTRIDGE_WILL_64 */ + 64, /* CARTRIDGE_EXP_64 */ + 64, /* CARTRIDGE_DIAMOND_64 */ + 64, /* CARTRIDGE_SDX_64 */ + 32, /* CARTRIDGE_XEGS_32 */ + 64, /* CARTRIDGE_XEGS_64_07 */ + 128, /* CARTRIDGE_XEGS_128 */ + 16, /* CARTRIDGE_OSS_M091_16 */ + 16, /* CARTRIDGE_5200_NS_16 */ + 128, /* CARTRIDGE_ATRAX_128 */ + 40, /* CARTRIDGE_BBSB_40 */ + 8, /* CARTRIDGE_5200_8 */ + 4, /* CARTRIDGE_5200_4 */ + 8, /* CARTRIDGE_RIGHT_8 */ + 32, /* CARTRIDGE_WILL_32 */ + 256, /* CARTRIDGE_XEGS_256 */ + 512, /* CARTRIDGE_XEGS_512 */ + 1024, /* CARTRIDGE_XEGS_1024 */ + 16, /* CARTRIDGE_MEGA_16 */ + 32, /* CARTRIDGE_MEGA_32 */ + 64, /* CARTRIDGE_MEGA_64 */ + 128, /* CARTRIDGE_MEGA_128 */ + 256, /* CARTRIDGE_MEGA_256 */ + 512, /* CARTRIDGE_MEGA_512 */ + 1024, /* CARTRIDGE_MEGA_1024 */ + 32, /* CARTRIDGE_SWXEGS_32 */ + 64, /* CARTRIDGE_SWXEGS_64 */ + 128, /* CARTRIDGE_SWXEGS_128 */ + 256, /* CARTRIDGE_SWXEGS_256 */ + 512, /* CARTRIDGE_SWXEGS_512 */ + 1024, /* CARTRIDGE_SWXEGS_1024 */ + 8, /* CARTRIDGE_PHOENIX_8 */ + 16, /* CARTRIDGE_BLIZZARD_16 */ + 128, /* CARTRIDGE_ATMAX_128 */ + 1024, /* CARTRIDGE_ATMAX_1024 */ + 128, /* CARTRIDGE_SDX_128 */ + 8, /* CARTRIDGE_OSS_8 */ + 16, /* CARTRIDGE_OSS_043M_16 */ + 4, /* CARTRIDGE_BLIZZARD_4 */ + 32, /* CARTRIDGE_AST_32 */ + 64, /* CARTRIDGE_ATRAX_SDX_64 */ + 128, /* CARTRIDGE_ATRAX_SDX_128 */ + 64, /* CARTRIDGE_TURBOSOFT_64 */ + 128, /* CARTRIDGE_TURBOSOFT_128 */ + 32, /* CARTRIDGE_ULTRACART_32 */ + 8, /* CARTRIDGE_LOW_BANK_8 */ + 128, /* CARTRIDGE_SIC_128 */ + 256, /* CARTRIDGE_SIC_256 */ + 512, /* CARTRIDGE_SIC_512 */ + 2, /* CARTRIDGE_STD_2 */ + 4, /* CARTRIDGE_STD_4 */ + 4, /* CARTRIDGE_RIGHT_4 */ + 32, /* CARTRIDGE_TURBO_HIT_32 */ + 2048, /* CARTRIDGE_MEGA_2048 */ + 128*1024, /* CARTRIDGE_THECART_128M */ + 4096, /* CARTRIDGE_MEGA_4096 */ + 2048, /* CARTRIDGE_MEGA_2048 */ + 32*1024, /* CARTRIDGE_THECART_32M */ + 64*1024, /* CARTRIDGE_THECART_64M */ + 64 /* CARTRIDGE_XEGS_64_8F */ +}; + +int CARTRIDGE_autoreboot = TRUE; + +static int CartIsFor5200(int type) +{ + switch (type) { + case CARTRIDGE_5200_32: + case CARTRIDGE_5200_EE_16: + case CARTRIDGE_5200_40: + case CARTRIDGE_5200_NS_16: + case CARTRIDGE_5200_8: + case CARTRIDGE_5200_4: + return TRUE; + default: + break; + } + return FALSE; +} + +static int CartIsPassthrough(int type) +{ + return type == CARTRIDGE_SDX_64 || type == CARTRIDGE_SDX_128 || + type == CARTRIDGE_ATRAX_SDX_64 || type == CARTRIDGE_ATRAX_SDX_128; +} + +CARTRIDGE_image_t CARTRIDGE_main = { CARTRIDGE_NONE, 0, 0, NULL, "" }; /* Left/Right cartridge */ +CARTRIDGE_image_t CARTRIDGE_piggyback = { CARTRIDGE_NONE, 0, 0, NULL, "" }; /* Pass through cartridge for SpartaDOSX */ + +/* The currently active cartridge in the left slot - normally points to + CARTRIDGE_main but can be switched to CARTRIDGE_piggyback if the main + cartridge is a SpartaDOS X. */ +static CARTRIDGE_image_t *active_cart = &CARTRIDGE_main; + +/* DB_32, XEGS_32, XEGS_07_64, XEGS_128, XEGS_256, XEGS_512, XEGS_1024, + SWXEGS_32, SWXEGS_64, SWXEGS_128, SWXEGS_256, SWXEGS_512, SWXEGS_1024 */ +static void set_bank_809F(int main, int old_state) +{ + if (active_cart->state & 0x80) { + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfDisable(); + } + else { + MEMORY_Cart809fEnable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0x8000, 0x9fff, active_cart->image + active_cart->state * 0x2000); + if (old_state & 0x80) + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + main); + } +} + +/* XEGS_8F_64 */ +static void set_bank_XEGS_8F_64(void) +{ + if (active_cart->state & 0x08) + MEMORY_CopyROM(0x8000, 0x9fff, active_cart->image + (active_cart->state & ~0x08) * 0x2000); + else + /* $8000-$9FFF is left unconnected. */ + MEMORY_dFillMem(0x8000, 0xff, 0x2000); +} + +/* OSS_034M_16, OSS_043M_16, OSS_M091_16, OSS_8 */ +static void set_bank_A0AF(int main, int old_state) +{ + if (active_cart->state < 0) + MEMORY_CartA0bfDisable(); + else { + MEMORY_CartA0bfEnable(); + if (active_cart->state == 0xff) + /* Fill cart area with 0xFF. */ + MEMORY_dFillMem(0xa000, 0xff, 0x1000); + else + MEMORY_CopyROM(0xa000, 0xafff, active_cart->image + active_cart->state * 0x1000); + if (old_state < 0) + MEMORY_CopyROM(0xb000, 0xbfff, active_cart->image + main); + } +} + +/* WILL_64, EXP_64, DIAMOND_64, SDX_64, WILL_32, ATMAX_128, ATMAX_1024, + ATRAX_128, ATRAX_SDX_64, TURBOSOFT_64, TURBOSOFT_128, ULTRACART_32, + TURBO_HIT_32, THECART_128M, THECART_32M, THECART_64M */ +static void set_bank_A0BF(int disable_mask, int bank_mask) +{ + if (active_cart->state & disable_mask) + MEMORY_CartA0bfDisable(); + else { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + (active_cart->state & bank_mask) * 0x2000); + } +} + +/* MEGA_16, MEGA_32, MEGA_64, MEGA_128, MEGA_256, MEGA_512, MEGA_1024, + MEGAMAX_2048, MEGA_2048 */ +static void set_bank_80BF(void) +{ + if (active_cart->state & 0x80) { + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfDisable(); + } + else { + MEMORY_Cart809fEnable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0x8000, 0xbfff, active_cart->image + (active_cart->state & 0x7f) * 0x4000); + } +} + +static void set_bank_SDX_128(void) +{ + if (active_cart->state & 8) + MEMORY_CartA0bfDisable(); + else { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, + active_cart->image + ((active_cart->state & 7) + ((active_cart->state & 0x10) >> 1)) * 0x2000); + } +} +static void set_bank_SIC(int n) +{ + if (!(active_cart->state & 0x20)) + MEMORY_Cart809fDisable(); + else { + MEMORY_Cart809fEnable(); + MEMORY_CopyROM(0x8000, 0x9fff, + active_cart->image + (active_cart->state & n) * 0x4000); + } + if (active_cart->state & 0x40) + MEMORY_CartA0bfDisable(); + else { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, + active_cart->image + (active_cart->state & n) * 0x4000 + 0x2000); + } +} + +/* MEGA_4096 */ +static void set_bank_MEGA_4096(void) +{ + if (active_cart->state == 0xff) { + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfDisable(); + } + else { + MEMORY_Cart809fEnable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0x8000, 0xbfff, active_cart->image + active_cart->state * 0x4000); + } +} +/* Called on a read or write operation to page $D5. Switches banks or + enables/disables the cartridge pointed to by *active_cart. */ +static void SwitchBank(int old_state) +{ + /* All bank-switched cartridges besides two BBSB's are included in + this swithch. The BBSB cartridges are not bank-switched by + access to page $D5, but in CARTRIDGE_BountyBob1() and + CARTRIDGE_BountyBob2(), so they need not be processed here. */ + switch (active_cart->type) { + case CARTRIDGE_OSS_034M_16: + case CARTRIDGE_OSS_043M_16: + set_bank_A0AF(0x3000, old_state); + break; + case CARTRIDGE_OSS_M091_16: + case CARTRIDGE_OSS_8: + set_bank_A0AF(0x0000, old_state); + break; + case CARTRIDGE_WILL_64: + case CARTRIDGE_EXP_64: + case CARTRIDGE_DIAMOND_64: + case CARTRIDGE_SDX_64: + case CARTRIDGE_WILL_32: + case CARTRIDGE_ATRAX_SDX_64: + set_bank_A0BF(8, 7); + break; + case CARTRIDGE_DB_32: + case CARTRIDGE_XEGS_32: + case CARTRIDGE_SWXEGS_32: + set_bank_809F(0x6000, old_state); + break; + case CARTRIDGE_XEGS_07_64: + case CARTRIDGE_SWXEGS_64: + set_bank_809F(0xe000, old_state); + break; + case CARTRIDGE_XEGS_8F_64: + set_bank_XEGS_8F_64(); + break; + case CARTRIDGE_XEGS_128: + case CARTRIDGE_SWXEGS_128: + set_bank_809F(0x1e000, old_state); + break; + case CARTRIDGE_XEGS_256: + case CARTRIDGE_SWXEGS_256: + set_bank_809F(0x3e000, old_state); + break; + case CARTRIDGE_XEGS_512: + case CARTRIDGE_SWXEGS_512: + set_bank_809F(0x7e000, old_state); + break; + case CARTRIDGE_XEGS_1024: + case CARTRIDGE_SWXEGS_1024: + set_bank_809F(0xfe000, old_state); + break; + case CARTRIDGE_ATRAX_128: + case CARTRIDGE_ATMAX_1024: + set_bank_A0BF(0x80, 0x7f); + break; + case CARTRIDGE_ATMAX_128: + case CARTRIDGE_TURBOSOFT_64: + case CARTRIDGE_TURBOSOFT_128: + set_bank_A0BF(0x10, 0x0f); + break; + case CARTRIDGE_MEGA_16: + case CARTRIDGE_MEGA_32: + case CARTRIDGE_MEGA_64: + case CARTRIDGE_MEGA_128: + case CARTRIDGE_MEGA_256: + case CARTRIDGE_MEGA_512: + case CARTRIDGE_MEGA_1024: + case CARTRIDGE_MEGA_2048: + case CARTRIDGE_MEGAMAX_2048: + set_bank_80BF(); + break; + case CARTRIDGE_PHOENIX_8: + case CARTRIDGE_BLIZZARD_4: + if (active_cart->state) + MEMORY_CartA0bfDisable(); + break; + case CARTRIDGE_BLIZZARD_16: + if (active_cart->state) { + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfDisable(); + } + break; + case CARTRIDGE_SDX_128: + case CARTRIDGE_ATRAX_SDX_128: + set_bank_SDX_128(); + break; + case CARTRIDGE_AST_32: + /* Value 0x10000 indicates cartridge enabled. */ + if (active_cart->state < 0x10000) + MEMORY_CartA0bfDisable(); + break; + case CARTRIDGE_ULTRACART_32: + case CARTRIDGE_BLIZZARD_32: + set_bank_A0BF(4, 3); + break; + case CARTRIDGE_SIC_128: + set_bank_SIC(0x07); + break; + case CARTRIDGE_SIC_256: + set_bank_SIC(0x0f); + break; + case CARTRIDGE_SIC_512: + set_bank_SIC(0x1f); + break; + case CARTRIDGE_MEGA_4096: + set_bank_MEGA_4096(); + break; + case CARTRIDGE_THECART_128M: + set_bank_A0BF(0x4000, 0x3fff); + break; + case CARTRIDGE_THECART_32M: + set_bank_A0BF(0x4000, 0x0fff); + break; + case CARTRIDGE_THECART_64M: + set_bank_A0BF(0x4000, 0x1fff); + break; + } +#if DEBUG + if (old_state != active_cart->state) + Log_print("Cart %i state: %02x -> %02x", active_cart == &CARTRIDGE_piggyback, old_state, active_cart->state); +#endif +} + +/* Maps *active_cart to memory. If the cartridge is bankswitched, + the mapping is performed according to its current state (ie. it doesn't + reset to bank 0 or whatever). */ +/* Note that this function only maps part of a cartridge (if any). Then it + calls SwitchBank(), which maps the rest. */ +static void MapActiveCart(void) +{ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + MEMORY_SetROM(0x4ff6, 0x4ff9); /* disable Bounty Bob bank switching */ + MEMORY_SetROM(0x5ff6, 0x5ff9); + switch (active_cart->type) { + case CARTRIDGE_5200_32: + MEMORY_CopyROM(0x4000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_5200_EE_16: + MEMORY_CopyROM(0x4000, 0x5fff, active_cart->image); + MEMORY_CopyROM(0x6000, 0x9fff, active_cart->image); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x2000); + break; + case CARTRIDGE_5200_40: + MEMORY_CopyROM(0x4000, 0x4fff, active_cart->image + (active_cart->state & 0x03) * 0x1000); + MEMORY_CopyROM(0x5000, 0x5fff, active_cart->image + 0x4000 + ((active_cart->state & 0x0c) >> 2) * 0x1000); + MEMORY_CopyROM(0x8000, 0x9fff, active_cart->image + 0x8000); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x8000); +#ifndef PAGED_ATTRIB + MEMORY_SetHARDWARE(0x4ff6, 0x4ff9); + MEMORY_SetHARDWARE(0x5ff6, 0x5ff9); +#else + MEMORY_readmap[0x4f] = CARTRIDGE_BountyBob1GetByte; + MEMORY_readmap[0x5f] = CARTRIDGE_BountyBob2GetByte; + MEMORY_writemap[0x4f] = CARTRIDGE_BountyBob1PutByte; + MEMORY_writemap[0x5f] = CARTRIDGE_BountyBob2PutByte; +#endif + break; + case CARTRIDGE_5200_NS_16: + MEMORY_CopyROM(0x8000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_5200_8: + MEMORY_CopyROM(0x8000, 0x9fff, active_cart->image); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_5200_4: + MEMORY_CopyROM(0x8000, 0x8fff, active_cart->image); + MEMORY_CopyROM(0x9000, 0x9fff, active_cart->image); + MEMORY_CopyROM(0xa000, 0xafff, active_cart->image); + MEMORY_CopyROM(0xb000, 0xbfff, active_cart->image); + break; + default: + /* clear cartridge area so the 5200 will crash */ + MEMORY_dFillMem(0x4000, 0, 0x8000); + break; + } + } + else { + switch (active_cart->type) { + case CARTRIDGE_STD_2: + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfEnable(); + MEMORY_dFillMem(0xa000, 0xff, 0x1800); + MEMORY_CopyROM(0xb800, 0xbfff, active_cart->image); + break; + case CARTRIDGE_STD_4: + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfEnable(); + MEMORY_dFillMem(0xa000, 0xff, 0x1000); + MEMORY_CopyROM(0xb000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_BLIZZARD_4: + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xafff, active_cart->image); + MEMORY_CopyROM(0xb000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_STD_8: + case CARTRIDGE_PHOENIX_8: + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_LOW_BANK_8: + MEMORY_Cart809fEnable(); + MEMORY_CartA0bfDisable(); + MEMORY_CopyROM(0x8000, 0x9fff, active_cart->image); + break; + case CARTRIDGE_STD_16: + case CARTRIDGE_BLIZZARD_16: + MEMORY_Cart809fEnable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0x8000, 0xbfff, active_cart->image); + break; + case CARTRIDGE_OSS_034M_16: + case CARTRIDGE_OSS_043M_16: + MEMORY_Cart809fDisable(); + if (active_cart->state >= 0) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xb000, 0xbfff, active_cart->image + 0x3000); + } + break; + case CARTRIDGE_OSS_M091_16: + case CARTRIDGE_OSS_8: + MEMORY_Cart809fDisable(); + if (active_cart->state >= 0) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xb000, 0xbfff, active_cart->image); + } + break; + case CARTRIDGE_WILL_64: + case CARTRIDGE_EXP_64: + case CARTRIDGE_DIAMOND_64: + case CARTRIDGE_SDX_64: + case CARTRIDGE_ATRAX_128: + case CARTRIDGE_WILL_32: + case CARTRIDGE_ATMAX_128: + case CARTRIDGE_ATMAX_1024: + case CARTRIDGE_SDX_128: + case CARTRIDGE_ATRAX_SDX_64: + case CARTRIDGE_ATRAX_SDX_128: + case CARTRIDGE_TURBOSOFT_64: + case CARTRIDGE_TURBOSOFT_128: + case CARTRIDGE_ULTRACART_32: + case CARTRIDGE_BLIZZARD_32: + case CARTRIDGE_THECART_128M: + case CARTRIDGE_THECART_32M: + case CARTRIDGE_THECART_64M: + MEMORY_Cart809fDisable(); + break; + case CARTRIDGE_DB_32: + case CARTRIDGE_XEGS_32: + case CARTRIDGE_SWXEGS_32: + if (!(active_cart->state & 0x80)) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x6000); + } + break; + case CARTRIDGE_XEGS_07_64: + case CARTRIDGE_SWXEGS_64: + case CARTRIDGE_XEGS_8F_64: + if (!(active_cart->state & 0x80)) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0xe000); + } + break; + case CARTRIDGE_XEGS_128: + case CARTRIDGE_SWXEGS_128: + if (!(active_cart->state & 0x80)) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x1e000); + } + break; + case CARTRIDGE_XEGS_256: + case CARTRIDGE_SWXEGS_256: + if (!(active_cart->state & 0x80)) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x3e000); + } + break; + case CARTRIDGE_XEGS_512: + case CARTRIDGE_SWXEGS_512: + if (!(active_cart->state & 0x80)) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x7e000); + } + break; + case CARTRIDGE_XEGS_1024: + case CARTRIDGE_SWXEGS_1024: + if (!(active_cart->state & 0x80)) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0xfe000); + } + break; + case CARTRIDGE_BBSB_40: + MEMORY_Cart809fEnable(); + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0x8000, 0x8fff, active_cart->image + (active_cart->state & 0x03) * 0x1000); + MEMORY_CopyROM(0x9000, 0x9fff, active_cart->image + 0x4000 + ((active_cart->state & 0x0c) >> 2) * 0x1000); + MEMORY_CopyROM(0xa000, 0xbfff, active_cart->image + 0x8000); +#ifndef PAGED_ATTRIB + MEMORY_SetHARDWARE(0x8ff6, 0x8ff9); + MEMORY_SetHARDWARE(0x9ff6, 0x9ff9); +#else + MEMORY_readmap[0x8f] = CARTRIDGE_BountyBob1GetByte; + MEMORY_readmap[0x9f] = CARTRIDGE_BountyBob2GetByte; + MEMORY_writemap[0x8f] = CARTRIDGE_BountyBob1PutByte; + MEMORY_writemap[0x9f] = CARTRIDGE_BountyBob2PutByte; +#endif + /* No need to call SwitchBank(), return. */ + return; + case CARTRIDGE_RIGHT_4: + if (Atari800_machine_type == Atari800_MACHINE_800) { + MEMORY_Cart809fEnable(); + MEMORY_dFillMem(0x8000, 0xff, 0x1000); + MEMORY_CopyROM(0x9000, 0x9fff, active_cart->image); + if ((!Atari800_disable_basic || BINLOAD_loading_basic) && MEMORY_have_basic) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, MEMORY_basic); + } + else + MEMORY_CartA0bfDisable(); + } else { + /* there's no right slot in XL/XE */ + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfDisable(); + } + /* No need to call SwitchBank(), return. */ + return; + case CARTRIDGE_RIGHT_8: + if (Atari800_machine_type == Atari800_MACHINE_800) { + MEMORY_Cart809fEnable(); + MEMORY_CopyROM(0x8000, 0x9fff, active_cart->image); + if (!Atari800_builtin_basic + && (!Atari800_disable_basic || BINLOAD_loading_basic) && MEMORY_have_basic) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, MEMORY_basic); + } + else + MEMORY_CartA0bfDisable(); + } else { + /* there's no right slot in XL/XE */ + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfDisable(); + } + /* No need to call SwitchBank(), return. */ + return; + case CARTRIDGE_AST_32: + { + int i; + MEMORY_Cart809fDisable(); + MEMORY_CartA0bfEnable(); + /* Copy the chosen bank 32 times over 0xa000-0xbfff. */ + for (i = 0xa000; i < 0xc000; i += 0x100) + MEMORY_CopyROM(i, i + 0xff, active_cart->image + (active_cart->state & 0xffff)); + } + break; + case CARTRIDGE_MEGA_16: + case CARTRIDGE_MEGA_32: + case CARTRIDGE_MEGA_64: + case CARTRIDGE_MEGA_128: + case CARTRIDGE_MEGA_256: + case CARTRIDGE_MEGA_512: + case CARTRIDGE_MEGA_1024: + case CARTRIDGE_MEGA_2048: + case CARTRIDGE_MEGA_4096: + case CARTRIDGE_SIC_128: + case CARTRIDGE_SIC_256: + case CARTRIDGE_SIC_512: + case CARTRIDGE_MEGAMAX_2048: + break; + default: + MEMORY_Cart809fDisable(); + if (!Atari800_builtin_basic + && (!Atari800_disable_basic || BINLOAD_loading_basic) && MEMORY_have_basic) { + MEMORY_CartA0bfEnable(); + MEMORY_CopyROM(0xa000, 0xbfff, MEMORY_basic); + } + else + MEMORY_CartA0bfDisable(); + /* No need to call SwitchBank(), return. */ + return; + } + SwitchBank(active_cart->state); + } +} + +/* Called from GetByte() and PutByte(), this function sets cartridge state + for a cartridge that is bank-switched by either read or write to + page $D5. Returns TRUE if switching a bank is needed. */ +static int access_D5(CARTRIDGE_image_t *cart, UWORD addr, int *state) +{ + int old_state = cart->state; + int new_state; + + switch (cart->type) { + case CARTRIDGE_OSS_034M_16: + /* Reference: http://www.retrobits.net/atari/osscarts.shtml + Deprecated by CARTRIDGE_OSS_043M_16 - 034M is an incorrect + bank order (a real cartridge consists of two 8KB chips, + one containing banks 0 and 4, the other 3 and M). Kept here + for backward compatibility. */ + + if (addr & 0x08) + new_state = -1; + else + switch (addr & 0x07) { + case 0x00: + /* B Lo/A Hi */ + new_state = 0; + break; + case 0x01: + /* A Lo+B Lo/A Hi */ + /* TODO should be binary AND of both banks. For now only fills with 0xFFs. */ + new_state = 0xff; + break; + case 0x03: + case 0x07: + /* A Lo/A Hi */ + new_state = 1; + break; + case 0x04: + /* B Hi/A Hi */ + new_state = 2; + break; + case 0x05: + /* A Lo+B Hi/A Hi */ + /* TODO should be binary AND of both banks. For now only fills with 0xFFs. */ + new_state = 0xff; + break; + default: /* 0x02, 0x06 */ + /* Fill cart area with 0xFFs. */ + new_state = 0xff; + break; + } + break; + case CARTRIDGE_OSS_043M_16: + /* Reference: http://www.retrobits.net/atari/osscarts.shtml + Using the nomenclature of the above article: the emulator + accepts 16KB images composed of two 8KB EPROM dumps joined + together in the following order: ROM B, ROM A. Currently + only three cartridges with this scheme are known: + Action! 3.5, BASIC XL 1.02 and MAC/65 1.0. */ + + if (addr & 0x08) + new_state = -1; + else + switch (addr & 0x07) { + case 0x00: + /* B Lo/A Hi */ + new_state = 0; + break; + case 0x01: + /* A Lo+B Lo/A Hi */ + /* TODO should be binary AND of both banks. For now only fills with 0xFFs. */ + new_state = 0xff; + break; + case 0x03: + case 0x07: + /* A Lo/A Hi */ + new_state = 2; + break; + case 0x04: + /* B Hi/A Hi */ + new_state = 1; + break; + case 0x05: + /* A Lo+B Hi/A Hi */ + /* TODO should be binary AND of both banks. For now only fills with 0xFFs. */ + new_state = 0xff; + break; + default: /* 0x02, 0x06 */ + /* Fill cart area with 0xFFs. */ + new_state = 0xff; + break; + } + break; + case CARTRIDGE_DB_32: + new_state = addr & 0x03; + break; + case CARTRIDGE_WILL_64: + new_state = addr & 0x0f; + break; + case CARTRIDGE_WILL_32: + new_state = addr & 0x0b; + break; + case CARTRIDGE_EXP_64: + /* Only react to access to $D57x. */ + if ((addr & 0xf0) != 0x70) + return FALSE; + new_state = ((addr ^ 7) & 0x0f); + break; + case CARTRIDGE_DIAMOND_64: + /* Only react to access to $D5Dx. */ + if ((addr & 0xf0) != 0xd0) + return FALSE; + new_state = ((addr ^ 7) & 0x0f); + break; + case CARTRIDGE_SDX_64: + case CARTRIDGE_ATRAX_SDX_64: + /* Only react to access to $D5Ex. */ + if ((addr & 0xf0) != 0xe0) + return FALSE; + if (addr & 0x08) + new_state = addr & 0x0c; + else + /* Negate bits that encode bank number. */ + new_state = ((addr ^ 0x07) & 0x0f); + if (cart == &CARTRIDGE_main) { + /* It's the 1st cartridge, process switching the piggyback on/off. */ + if ((old_state & 0x0c) == 0x08) { /* Piggyback cartridge was enabled */ + if ((new_state & 0x0c) != 0x08) { /* Going to disable it */ + active_cart = &CARTRIDGE_main; + MapActiveCart(); + } + } + else if ((new_state & 0x0c) == 0x08) { /* Going to enable piggyback */ + active_cart = &CARTRIDGE_piggyback; + MapActiveCart(); + } + } + break; + case CARTRIDGE_SDX_128: + case CARTRIDGE_ATRAX_SDX_128: + /* Only react to access to $D5Ex/$D5Fx. */ + if ((addr & 0xe0) != 0xe0) + return FALSE; + if (addr & 0x08) + new_state = addr & 0x0c; + else + /* Negate bits that encode bank number. */ + new_state = ((addr ^ 0x17) & 0x1f); + if (cart == &CARTRIDGE_main) { + /* It's the 1st cartridge, process switching the piggyback on/off. */ + if ((old_state & 0x0c) == 0x08) { /* Piggyback cartridge was enabled */ + if ((new_state & 0x0c) != 0x08) { /* Going to disable it */ + active_cart = &CARTRIDGE_main; + MapActiveCart(); + } + } + else if ((new_state & 0x0c) == 0x08) { /* Going to enable piggyback */ + active_cart = &CARTRIDGE_piggyback; + MapActiveCart(); + } + } + break; + case CARTRIDGE_OSS_M091_16: + switch (addr & 0x09) { + case 0x00: + new_state = 1; + break; + case 0x01: + new_state = 3; + break; + case 0x08: + new_state = -1; + break; + default: /* 0x09 */ + new_state = 2; + break; + } + break; + case CARTRIDGE_BLIZZARD_4: + case CARTRIDGE_PHOENIX_8: + case CARTRIDGE_BLIZZARD_16: + /* Disable the cart. */ + new_state = 1; + break; + case CARTRIDGE_ATMAX_128: + /* Only react to access to $D50x/$D51x. */ + if ((addr & 0xe0) != 0) + return FALSE; + /* fall through */ + case CARTRIDGE_TURBOSOFT_128: + new_state = addr & 0x1f; + break; + case CARTRIDGE_TURBOSOFT_64: + new_state = addr & 0x17; + break; + case CARTRIDGE_ATMAX_1024: + case CARTRIDGE_MEGAMAX_2048: + new_state = addr; + break; + case CARTRIDGE_OSS_8: + switch (addr & 0x09) { + case 0x00: + case 0x01: + new_state = 1; + break; + case 0x08: + new_state = -1; + break; + default: /* 0x09 */ + new_state = 0; + break; + } + break; + case CARTRIDGE_ULTRACART_32: + new_state = (old_state + 1) % 5; + break; + case CARTRIDGE_BLIZZARD_32: + if (old_state < 4) + new_state = old_state + 1; + break; + default: + /* Other cartridge types don't support enabling/disabling/banking through page D5. */ + return FALSE; + } + *state = new_state; + return TRUE; +} + +/* Processes bankswitching of CART when reading from a $D5xx address ADDR. */ +static UBYTE GetByte(CARTRIDGE_image_t *cart, UWORD addr, int no_side_effects) +{ + int old_state = cart->state; + int new_state = old_state; + +#if DEBUG + if (cart->type > CARTRIDGE_NONE) + Log_print("Cart %i read: %04x", cart == &CARTRIDGE_piggyback, addr); +#endif + /* Set the cartridge's new state. */ + /* Check types switchable by access to page D5. */ + if (!no_side_effects && access_D5(cart, addr, &new_state)) { + /* Cartridge supports bankswitching and reacted to the given + ADDR. If the state changed, we need to do the bankswitch. */ + if (new_state != old_state) { + cart->state = new_state; + if (cart == active_cart) + SwitchBank(old_state); + } + } + + /* Determine returned byte value. */ + switch (cart->type) { + case CARTRIDGE_AST_32: + /* cart->state contains address of current bank, therefore it + divides by 0x100. */ + return cart->image[(cart->state & 0xff00) | (addr & 0xff)]; + case CARTRIDGE_SIC_512: + case CARTRIDGE_SIC_256: + case CARTRIDGE_SIC_128: + case CARTRIDGE_MEGA_4096: + /* Only react to access to $D50x/$D51x. */ + if ((addr & 0xe0) == 0x00) + return cart->state; + break; + case CARTRIDGE_THECART_128M: + case CARTRIDGE_THECART_32M: + case CARTRIDGE_THECART_64M: + switch (addr) { + case 0xd5a0: + return cart->state & 0x00ff; + case 0xd5a1: + return (cart->state & 0x3f00) >> 8; + case 0xd5a2: + return (~cart->state & 0x4000) >> 14; + } + break; + } + return 0xff; +} + +/* Processes bankswitching of CART when writing to a $D5xx address ADDR. */ +static void PutByte(CARTRIDGE_image_t *cart, UWORD addr, UBYTE byte) +{ + int old_state = cart->state; + int new_state = old_state; + +#if DEBUG + if (cart->type > CARTRIDGE_NONE) + Log_print("Cart %i write: %04x, %02x", cart == &CARTRIDGE_piggyback, addr, byte); +#endif + /* Set the cartridge's new state. */ + switch (cart->type) { + case CARTRIDGE_XEGS_32: + new_state = byte & 0x03; + break; + case CARTRIDGE_XEGS_07_64: + new_state = byte & 0x07; + break; + case CARTRIDGE_XEGS_128: + case CARTRIDGE_XEGS_8F_64: + new_state = byte & 0x0f; + break; + case CARTRIDGE_XEGS_256: + new_state = byte & 0x1f; + break; + case CARTRIDGE_XEGS_512: + new_state = byte & 0x3f; + break; + case CARTRIDGE_XEGS_1024: + new_state = byte & 0x7f; + break; + case CARTRIDGE_MEGA_16: + new_state = byte & 0x80; + break; + case CARTRIDGE_MEGA_32: + new_state = byte & 0x81; + break; + case CARTRIDGE_MEGA_64: + case CARTRIDGE_SWXEGS_32: + new_state = byte & 0x83; + break; + case CARTRIDGE_MEGA_128: + case CARTRIDGE_SWXEGS_64: + new_state = byte & 0x87; + break; + case CARTRIDGE_MEGA_256: + case CARTRIDGE_SWXEGS_128: + case CARTRIDGE_ATRAX_128: + new_state = byte & 0x8f; + break; + case CARTRIDGE_MEGA_512: + case CARTRIDGE_SWXEGS_256: + new_state = byte & 0x9f; + break; + case CARTRIDGE_MEGA_1024: + case CARTRIDGE_SWXEGS_512: + new_state = byte & 0xbf; + break; + case CARTRIDGE_MEGA_2048: + case CARTRIDGE_SWXEGS_1024: + new_state = byte; + break; + case CARTRIDGE_AST_32: + /* State contains address of current bank. */ + new_state = (old_state + 0x100) & 0x7fff; + break; + case CARTRIDGE_SIC_512: + case CARTRIDGE_SIC_256: + case CARTRIDGE_SIC_128: + case CARTRIDGE_MEGA_4096: + /* Only react to access to $D50x/$D51x. */ + if ((addr & 0xe0) == 0x00) + new_state = byte; + break; + case CARTRIDGE_THECART_128M: + case CARTRIDGE_THECART_32M: + case CARTRIDGE_THECART_64M: + switch (addr) { + case 0xd5a0: + new_state = (old_state & 0x3f00) | byte; + break; + case 0xd5a1: + new_state = (old_state & 0x00ff) | ((byte & 0x3f) << 8); + break; + case 0xd5a2: + new_state = (old_state & 0x3fff) | ((~byte & 0x01) << 14); + break; + } + break; + default: + /* Check types switchable by access to page D5. */ + if (!access_D5(cart, addr, &new_state)) + /* Cartridge doesn't support bankswitching, or didn't react to + the given ADDR. */ + return; + } + + /* If the state changed, we need to do the bankswitch. */ + if (new_state != old_state) { + cart->state = new_state; + if (cart == active_cart) + SwitchBank(old_state); + } +} + +/* a read from D500-D5FF area */ +UBYTE CARTRIDGE_GetByte(UWORD addr, int no_side_effects) +{ +#ifdef AF80 + if (AF80_enabled) { + return AF80_D5GetByte(addr, no_side_effects); + } +#endif + if (RTIME_enabled && (addr == 0xd5b8 || addr == 0xd5b9)) + return RTIME_GetByte(); +#ifdef IDE + if (IDE_enabled && (addr <= 0xd50f)) + return IDE_GetByte(addr, no_side_effects); +#endif + /* In case 2 cartridges are inserted, reading a memory location would + result in binary AND of both cartridges. */ + return GetByte(&CARTRIDGE_main, addr, no_side_effects) & GetByte(&CARTRIDGE_piggyback, addr, no_side_effects); +} + +/* a write to D500-D5FF area */ +void CARTRIDGE_PutByte(UWORD addr, UBYTE byte) +{ +#ifdef AF80 + if (AF80_enabled) { + AF80_D5PutByte(addr,byte); + /* Return, because AF_80_enabled means there's an AF80 + cartridge in the left slot and no other cartridges are + there. */ + return; + } +#endif + if (RTIME_enabled && (addr == 0xd5b8 || addr == 0xd5b9)) { + RTIME_PutByte(byte); + } +#ifdef IDE + if (IDE_enabled && (addr <= 0xd50f)) { + IDE_PutByte(addr,byte); + } +#endif + PutByte(&CARTRIDGE_main, addr, byte); + PutByte(&CARTRIDGE_piggyback, addr, byte); +} + +/* special support of Bounty Bob on Atari5200 */ +void CARTRIDGE_BountyBob1(UWORD addr) +{ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (addr >= 0x4ff6 && addr <= 0x4ff9) { + addr -= 0x4ff6; + MEMORY_CopyROM(0x4000, 0x4fff, active_cart->image + addr * 0x1000); + active_cart->state = (active_cart->state & 0x0c) | addr; + } + } else { + if (addr >= 0x8ff6 && addr <= 0x8ff9) { + addr -= 0x8ff6; + MEMORY_CopyROM(0x8000, 0x8fff, active_cart->image + addr * 0x1000); + active_cart->state = (active_cart->state & 0x0c) | addr; + } + } +} + +void CARTRIDGE_BountyBob2(UWORD addr) +{ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (addr >= 0x5ff6 && addr <= 0x5ff9) { + addr -= 0x5ff6; + MEMORY_CopyROM(0x5000, 0x5fff, active_cart->image + 0x4000 + addr * 0x1000); + active_cart->state = (active_cart->state & 0x03) | (addr << 2); + } + } + else { + if (addr >= 0x9ff6 && addr <= 0x9ff9) { + addr -= 0x9ff6; + MEMORY_CopyROM(0x9000, 0x9fff, active_cart->image + 0x4000 + addr * 0x1000); + active_cart->state = (active_cart->state & 0x03) | (addr << 2); + } + } +} + +#ifdef PAGED_ATTRIB +UBYTE CARTRIDGE_BountyBob1GetByte(UWORD addr, int no_side_effects) +{ + if (!no_side_effects) { + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (addr >= 0x4ff6 && addr <= 0x4ff9) { + CARTRIDGE_BountyBob1(addr); + return 0; + } + } else { + if (addr >= 0x8ff6 && addr <= 0x8ff9) { + CARTRIDGE_BountyBob1(addr); + return 0; + } + } + } + return MEMORY_dGetByte(addr); +} + +UBYTE CARTRIDGE_BountyBob2GetByte(UWORD addr, int no_side_effects) +{ + if (!no_side_effects) { + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (addr >= 0x5ff6 && addr <= 0x5ff9) { + CARTRIDGE_BountyBob2(addr); + return 0; + } + } else { + if (addr >= 0x9ff6 && addr <= 0x9ff9) { + CARTRIDGE_BountyBob2(addr); + return 0; + } + } + } + return MEMORY_dGetByte(addr); +} + +void CARTRIDGE_BountyBob1PutByte(UWORD addr, UBYTE value) +{ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (addr >= 0x4ff6 && addr <= 0x4ff9) { + CARTRIDGE_BountyBob1(addr); + } + } else { + if (addr >= 0x8ff6 && addr <= 0x8ff9) { + CARTRIDGE_BountyBob1(addr); + } + } +} + +void CARTRIDGE_BountyBob2PutByte(UWORD addr, UBYTE value) +{ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (addr >= 0x5ff6 && addr <= 0x5ff9) { + CARTRIDGE_BountyBob2(addr); + } + } else { + if (addr >= 0x9ff6 && addr <= 0x9ff9) { + CARTRIDGE_BountyBob2(addr); + } + } +} +#endif + +int CARTRIDGE_Checksum(const UBYTE *image, int nbytes) +{ + int checksum = 0; + while (nbytes > 0) { + checksum += *image++; + nbytes--; + } + return checksum; +} + +static void ResetCartState(CARTRIDGE_image_t *cart) +{ + switch (cart->type) { + case CARTRIDGE_OSS_034M_16: + cart->state = 1; + break; + case CARTRIDGE_ATMAX_1024: + cart->state = 0x7f; + break; + case CARTRIDGE_AST_32: + /* A special value of 0x10000 indicates the cartridge is + enabled and the current bank is 0. */ + cart->state = 0x10000; + break; + case CARTRIDGE_MEGA_4096: + cart->state = 254; + break; + default: + cart->state = 0; + } +} + +/* Before first use of the cartridge, preprocess its contents if needed. */ +static void PreprocessCart(CARTRIDGE_image_t *cart) +{ + switch (cart->type) { + case CARTRIDGE_ATRAX_SDX_64: + case CARTRIDGE_ATRAX_SDX_128: { + /* The address lines are connected a follows: + (left - cartridge port + bank select, right - EPROM) + A0 - A6 + A1 - A7 + A2 - A12 + A3 - A15 + A4 - A14 + A5 - A13 + A6 - A8 + A7 - A5 + A8 - A4 + A9 - A3 + A10 - A0 + A11 - A1 + A12 - A2 + A13 - A9 + A14 - A11 + A15 - A10 + A16 - A16 (only on ATRAX_SDX_128) + + The data lines are connected as follows: + (left - cartridge port, right - EPROM) + D1 - Q0 + D3 - Q1 + D7 - Q2 + D6 - Q3 + D0 - Q4 + D2 - Q5 + D5 - Q6 + D4 - Q7 + */ + unsigned int i; + unsigned int const size = cart->size << 10; + UBYTE *new_image = (UBYTE *) Util_malloc(size); + /* FIXME: Can be optimised by caching the results in a conversion + table, but doesn't seem to be worth it. */ + for (i = 0; i < size; i++) { + unsigned int const rom_addr = + (i & 0x0001 ? 0x0040 : 0) | + (i & 0x0002 ? 0x0080 : 0) | + (i & 0x0004 ? 0x1000 : 0) | + (i & 0x0008 ? 0x8000 : 0) | + (i & 0x0010 ? 0x4000 : 0) | + (i & 0x0020 ? 0x2000 : 0) | + (i & 0x0040 ? 0x0100 : 0) | + (i & 0x0080 ? 0x0020 : 0) | + (i & 0x0100 ? 0x0010 : 0) | + (i & 0x0200 ? 0x0008 : 0) | + (i & 0x0400 ? 0x0001 : 0) | + (i & 0x0800 ? 0x0002 : 0) | + (i & 0x1000 ? 0x0004 : 0) | + (i & 0x2000 ? 0x0200 : 0) | + (i & 0x4000 ? 0x0800 : 0) | + (i & 0x8000 ? 0x0400 : 0) | + (i & 0x10000 ? 0x10000 : 0); + + UBYTE byte = cart->image[rom_addr]; + new_image[i] = + (byte & 0x01 ? 0x02 : 0) | + (byte & 0x02 ? 0x08 : 0) | + (byte & 0x04 ? 0x80 : 0) | + (byte & 0x08 ? 0x40 : 0) | + (byte & 0x10 ? 0x01 : 0) | + (byte & 0x20 ? 0x04 : 0) | + (byte & 0x40 ? 0x20 : 0) | + (byte & 0x80 ? 0x10 : 0); + } + free(cart->image); + cart->image = new_image; + break; + } + } +} + +/* Initialises the cartridge CART after mounting. Called by CARTRIDGE_Insert, + or CARTRIDGE_Insert_Second and CARTRIDGE_SetType. */ +static void InitCartridge(CARTRIDGE_image_t *cart) +{ + PreprocessCart(cart); + ResetCartState(cart); + if (cart == &CARTRIDGE_main) { + /* Check if we should automatically switch between computer/5200. */ + int for5200 = CartIsFor5200(CARTRIDGE_main.type); + if (for5200 && Atari800_machine_type != Atari800_MACHINE_5200) { + Atari800_SetMachineType(Atari800_MACHINE_5200); + MEMORY_ram_size = 16; + Atari800_InitialiseMachine(); + } + else if (!for5200 && Atari800_machine_type == Atari800_MACHINE_5200) { + Atari800_SetMachineType(Atari800_MACHINE_XLXE); + MEMORY_ram_size = 64; + Atari800_InitialiseMachine(); + } + } + if (cart == active_cart) + MapActiveCart(); +} + +static void RemoveCart(CARTRIDGE_image_t *cart) +{ + if (cart->image != NULL) { + free(cart->image); + cart->image = NULL; + } + if (cart->type != CARTRIDGE_NONE) { + cart->type = CARTRIDGE_NONE; + if (cart == active_cart) + MapActiveCart(); + } +} + +/* Called after inserting/removing a cartridge (but not the piggyback one). + If needed, reboots the machine. */ +static void AutoReboot(void) +{ + if (CARTRIDGE_autoreboot) + Atari800_Coldstart(); +} + +void CARTRIDGE_SetType(CARTRIDGE_image_t *cart, int type) +{ + cart->type = type; + if (type == CARTRIDGE_NONE) + /* User cancelled setting the cartridge's type - the cartridge + can be unloaded. */ + RemoveCart(cart); + InitCartridge(cart); +} + +void CARTRIDGE_SetTypeAutoReboot(CARTRIDGE_image_t *cart, int type) +{ + CARTRIDGE_SetType(cart, type); + /* We don't want to autoreboot on inserting the piggyback cartridge. */ + if (cart != &CARTRIDGE_piggyback) + AutoReboot(); +} + +void CARTRIDGE_ColdStart(void) { + active_cart = &CARTRIDGE_main; + ResetCartState(&CARTRIDGE_main); + ResetCartState(&CARTRIDGE_piggyback); + MapActiveCart(); +} + +/* Loads a cartridge from FILENAME. Copies FILENAME to CART_FILENAME. + Allocates a buffer with cartridge image data and puts it in *CART_IMAGE. + Sets *CART_TYPE to the cartridge type. */ +static int InsertCartridge(const char *filename, CARTRIDGE_image_t *cart) +{ + FILE *fp; + int len; + int type; + UBYTE header[16]; + + /* open file */ + fp = fopen(filename, "rb"); + if (fp == NULL) + return CARTRIDGE_CANT_OPEN; + /* check file length */ + len = Util_flen(fp); + Util_rewind(fp); + + /* Guard against providing cart->filename as parameter. */ + if (cart->filename != filename) + /* Save Filename for state save */ + strcpy(cart->filename, filename); + + /* if full kilobytes, assume it is raw image */ + if ((len & 0x3ff) == 0) { + /* alloc memory and read data */ + cart->image = (UBYTE *) Util_malloc(len); + if (fread(cart->image, 1, len, fp) < len) { + Log_print("Error reading cartridge.\n"); + } + fclose(fp); + /* find cart type */ + cart->type = CARTRIDGE_NONE; + len >>= 10; /* number of kilobytes */ + cart->size = len; + for (type = 1; type <= CARTRIDGE_LAST_SUPPORTED; type++) + if (CARTRIDGE_kb[type] == len) { + if (cart->type == CARTRIDGE_NONE) { + cart->type = type; + } else { + /* more than one cartridge type of such length - user must select */ + cart->type = CARTRIDGE_UNKNOWN; + return len; + } + } + if (cart->type != CARTRIDGE_NONE) { + InitCartridge(cart); + return 0; /* ok */ + } + free(cart->image); + cart->image = NULL; + return CARTRIDGE_BAD_FORMAT; + } + /* if not full kilobytes, assume it is CART file */ + if (fread(header, 1, 16, fp) < 16) { + Log_print("Error reading cartridge.\n"); + } + if ((header[0] == 'C') && + (header[1] == 'A') && + (header[2] == 'R') && + (header[3] == 'T')) { + type = (header[4] << 24) | + (header[5] << 16) | + (header[6] << 8) | + header[7]; + if (type >= 1 && type <= CARTRIDGE_LAST_SUPPORTED) { + int checksum; + int result; + len = CARTRIDGE_kb[type] << 10; + cart->size = CARTRIDGE_kb[type]; + /* alloc memory and read data */ + cart->image = (UBYTE *) Util_malloc(len); + if (fread(cart->image, 1, len, fp) < len) { + Log_print("Error reading cartridge.\n"); + } + fclose(fp); + checksum = (header[8] << 24) | + (header[9] << 16) | + (header[10] << 8) | + header[11]; + cart->type = type; + result = checksum == CARTRIDGE_Checksum(cart->image, len) ? 0 : CARTRIDGE_BAD_CHECKSUM; + InitCartridge(cart); + return result; + } + } + fclose(fp); + return CARTRIDGE_BAD_FORMAT; +} + +int CARTRIDGE_Insert(const char *filename) +{ + /* remove currently inserted cart */ + CARTRIDGE_Remove(); + return InsertCartridge(filename, &CARTRIDGE_main); +} + +int CARTRIDGE_InsertAutoReboot(const char *filename) +{ + int result = CARTRIDGE_Insert(filename); + AutoReboot(); + return result; +} + +int CARTRIDGE_Insert_Second(const char *filename) +{ + /* remove currently inserted cart */ + CARTRIDGE_Remove_Second(); + return InsertCartridge(filename, &CARTRIDGE_piggyback); +} + +void CARTRIDGE_Remove(void) +{ + active_cart = &CARTRIDGE_main; + CARTRIDGE_Remove_Second(); + RemoveCart(&CARTRIDGE_main); +} + +void CARTRIDGE_RemoveAutoReboot(void) +{ + CARTRIDGE_Remove(); + AutoReboot(); +} + +void CARTRIDGE_Remove_Second(void) +{ + RemoveCart(&CARTRIDGE_piggyback); +} + +int CARTRIDGE_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "CARTRIDGE_FILENAME") == 0) { + Util_strlcpy(CARTRIDGE_main.filename, ptr, sizeof(CARTRIDGE_main.filename)); + if (CARTRIDGE_main.type == CARTRIDGE_NONE) + CARTRIDGE_main.type = CARTRIDGE_UNKNOWN; + } + else if (strcmp(string, "CARTRIDGE_TYPE") == 0) { + int value = Util_sscandec(ptr); + if (value < 0 || value > CARTRIDGE_LAST_SUPPORTED) + return FALSE; + CARTRIDGE_main.type = value; + } + else if (strcmp(string, "CARTRIDGE_PIGGYBACK_FILENAME") == 0) { + Util_strlcpy(CARTRIDGE_piggyback.filename, ptr, sizeof(CARTRIDGE_piggyback.filename)); + if (CARTRIDGE_piggyback.type == CARTRIDGE_NONE) + CARTRIDGE_piggyback.type = CARTRIDGE_UNKNOWN; + } + else if (strcmp(string, "CARTRIDGE_PIGGYBACK_TYPE") == 0) { + int value = Util_sscandec(ptr); + if (value < 0 || value > CARTRIDGE_LAST_SUPPORTED) + return FALSE; + CARTRIDGE_piggyback.type = value; + } + else if (strcmp(string, "CARTRIDGE_AUTOREBOOT") == 0) { + int value = Util_sscanbool(ptr); + if (value < 0) + return FALSE; + CARTRIDGE_autoreboot = value; + } + else return FALSE; + return TRUE; +} + +void CARTRIDGE_WriteConfig(FILE *fp) +{ + fprintf(fp, "CARTRIDGE_FILENAME=%s\n", CARTRIDGE_main.filename); + fprintf(fp, "CARTRIDGE_TYPE=%d\n", CARTRIDGE_main.type); + fprintf(fp, "CARTRIDGE_PIGGYBACK_FILENAME=%s\n", CARTRIDGE_piggyback.filename); + fprintf(fp, "CARTRIDGE_PIGGYBACK_TYPE=%d\n", CARTRIDGE_piggyback.type); + fprintf(fp, "CARTRIDGE_AUTOREBOOT=%d\n", CARTRIDGE_autoreboot); +} + +static void InitInsert(CARTRIDGE_image_t *cart) +{ + if (cart->type != CARTRIDGE_NONE) { + int tmp_type = cart->type; + int res = InsertCartridge(cart->filename, cart); + if (res < 0) { + Log_print("Error inserting cartridge \"%s\": %s", cart->filename, + res == CARTRIDGE_CANT_OPEN ? "Can't open file" : + res == CARTRIDGE_BAD_FORMAT ? "Bad format" : + /* Assume r == CARTRIDGE_BAD_CHECKSUM */ "Bad checksum"); + cart->type = CARTRIDGE_NONE; + } + if (cart->type == CARTRIDGE_UNKNOWN && CARTRIDGE_kb[tmp_type] == res) + CARTRIDGE_SetType(cart, tmp_type); + } +} + +int CARTRIDGE_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + int help_only = FALSE; + /* When filename is given at commandline, we have to reset cartridge type to UNKNOWN, + because the cartridge type read earlier from the config file is no longer valid. + These two variables indicate that cartridge type is also given at commandline + and so it shouldn't be reset. */ + int type_from_commandline = FALSE; + int type2_from_commandline = FALSE; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + int a_i = FALSE; /* error, argument invalid! */ + + if (strcmp(argv[i], "-cart") == 0) { + if (i_a) { + Util_strlcpy(CARTRIDGE_main.filename, argv[++i], sizeof(CARTRIDGE_main.filename)); + if (!type_from_commandline) + CARTRIDGE_main.type = CARTRIDGE_UNKNOWN; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-cart-type") == 0) { + if (i_a) { + Util_sscansdec(argv[++i], &CARTRIDGE_main.type); + if (CARTRIDGE_main.type < 0 || CARTRIDGE_main.type > CARTRIDGE_LAST_SUPPORTED) + a_i = TRUE; + else + type_from_commandline = TRUE; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-cart2") == 0) { + if (i_a) { + Util_strlcpy(CARTRIDGE_piggyback.filename, argv[++i], sizeof(CARTRIDGE_piggyback.filename)); + if (!type2_from_commandline) + CARTRIDGE_piggyback.type = CARTRIDGE_UNKNOWN; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-cart2-type") == 0) { + if (i_a) { + Util_sscansdec(argv[++i], &CARTRIDGE_piggyback.type); + if (CARTRIDGE_piggyback.type < 0 || CARTRIDGE_piggyback.type > CARTRIDGE_LAST_SUPPORTED) + a_i = TRUE; + else + type2_from_commandline = TRUE; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-cart-autoreboot") == 0) + CARTRIDGE_autoreboot = TRUE; + else if (strcmp(argv[i], "-no-cart-autoreboot") == 0) + CARTRIDGE_autoreboot = FALSE; + else { + if (strcmp(argv[i], "-help") == 0) { + help_only = TRUE; + Log_print("\t-cart Install cartridge (raw or CART format)"); + Log_print("\t-cart-type Set cartridge type (0..%i)", CARTRIDGE_LAST_SUPPORTED); + Log_print("\t-cart2 Install piggyback cartridge"); + Log_print("\t-cart2-type Set piggyback cartridge type (0..%i)", CARTRIDGE_LAST_SUPPORTED); + Log_print("\t-cart-autoreboot Reboot when cartridge is inserted/removed"); + Log_print("\t-no-cart-autoreboot Don't reboot after changing cartridge"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } else if (a_i) { + Log_print("Invalid argument for '%s'", argv[--i]); + return FALSE; + } + } + *argc = j; + + if (help_only) + return TRUE; + + /* If filename not given, we must reset the cartridge types. */ + if (CARTRIDGE_main.filename[0] == '\0') + CARTRIDGE_main.type = CARTRIDGE_NONE; + if (CARTRIDGE_piggyback.filename[0] == '\0') + CARTRIDGE_piggyback.type = CARTRIDGE_NONE; + + InitInsert(&CARTRIDGE_main); + if (CartIsPassthrough(CARTRIDGE_main.type)) + InitInsert(&CARTRIDGE_piggyback); + + return TRUE; +} + +void CARTRIDGE_Exit(void) +{ + CARTRIDGE_Remove(); /* Removes both cartridges */ +} + +#ifndef BASIC + +void CARTRIDGE_StateRead(UBYTE version) +{ + int saved_type = CARTRIDGE_NONE; + char filename[FILENAME_MAX]; + + /* Read the cart type from the file. If there is no cart type, becaused we have + reached the end of the file, this will just default to CART_NONE */ + StateSav_ReadINT(&saved_type, 1); + if (saved_type != CARTRIDGE_NONE) { + StateSav_ReadFNAME(filename); + if (filename[0]) { + /* Insert the cartridge... */ + if (CARTRIDGE_Insert(filename) >= 0) { + /* And set the type to the saved type, in case it was a raw cartridge image */ + CARTRIDGE_main.type = saved_type; + } + } + if (version >= 7) + /* Read the cartridge's state (current bank etc.). */ + StateSav_ReadINT(&CARTRIDGE_main.state, 1); + } + else + CARTRIDGE_main.type = saved_type; + + if (saved_type < 0) { + /* Minus value indicates a piggyback cartridge present. */ + CARTRIDGE_main.type = -saved_type; + + StateSav_ReadINT(&saved_type, 1); + StateSav_ReadFNAME(filename); + if (filename[0]) { + /* Insert the cartridge... */ + if (CARTRIDGE_Insert_Second(filename) >= 0) { + /* And set the type to the saved type, in case it was a raw cartridge image */ + CARTRIDGE_piggyback.type = saved_type; + } + } + if (version >= 7) + /* Read the cartridge's state (current bank etc.). */ + StateSav_ReadINT(&CARTRIDGE_piggyback.state, 1); + else { + /* Savestate version 6 explicitely stored information about + the active cartridge. */ + int piggyback_active; + StateSav_ReadINT(&piggyback_active, 1); + if (piggyback_active) + active_cart = &CARTRIDGE_piggyback; + else + active_cart = &CARTRIDGE_main; + /* The "Determine active cartridge" code below makes no + sense when loading ver.6 savestates, because they + did not store the cartridge state. */ + return; + } + } + + /* Determine active cartridge (main or piggyback. */ + if (CartIsPassthrough(CARTRIDGE_main.type) && (CARTRIDGE_main.state & 0x0c) == 0x08) + active_cart = &CARTRIDGE_piggyback; + else + active_cart = &CARTRIDGE_main; + + MapActiveCart(); +} + +void CARTRIDGE_StateSave(void) +{ + int cart_save = CARTRIDGE_main.type; + + if (CARTRIDGE_piggyback.type != CARTRIDGE_NONE) + /* Save the cart type as negative, to indicate to CARTStateRead that there is a + second cartridge */ + cart_save = -cart_save; + + /* Save the cartridge type, or CARTRIDGE_NONE if there isn't one...*/ + StateSav_SaveINT(&cart_save, 1); + if (CARTRIDGE_main.type != CARTRIDGE_NONE) { + StateSav_SaveFNAME(CARTRIDGE_main.filename); + StateSav_SaveINT(&CARTRIDGE_main.state, 1); + } + + if (CARTRIDGE_piggyback.type != CARTRIDGE_NONE) { + /* Save the second cartridge type and name*/ + StateSav_SaveINT(&CARTRIDGE_piggyback.type, 1); + StateSav_SaveFNAME(CARTRIDGE_piggyback.filename); + StateSav_SaveINT(&CARTRIDGE_piggyback.state, 1); + } +} + +#endif + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/cartridge.h b/PVAtari800/atari800-src/cartridge.h new file mode 100644 index 0000000000..288814ad2e --- /dev/null +++ b/PVAtari800/atari800-src/cartridge.h @@ -0,0 +1,213 @@ +#ifndef CARTRIDGE_H_ +#define CARTRIDGE_H_ + +#include "config.h" +#include "atari.h" + +enum { + CARTRIDGE_UNKNOWN = -1, + CARTRIDGE_NONE = 0, + CARTRIDGE_STD_8 = 1, + CARTRIDGE_STD_16 = 2, + CARTRIDGE_OSS_034M_16 = 3, + CARTRIDGE_5200_32 = 4, + CARTRIDGE_DB_32 = 5, + CARTRIDGE_5200_EE_16 = 6, + CARTRIDGE_5200_40 = 7, + CARTRIDGE_WILL_64 = 8, + CARTRIDGE_EXP_64 = 9, + CARTRIDGE_DIAMOND_64 = 10, + CARTRIDGE_SDX_64 = 11, + CARTRIDGE_XEGS_32 = 12, + CARTRIDGE_XEGS_07_64 = 13, + CARTRIDGE_XEGS_128 = 14, + CARTRIDGE_OSS_M091_16 = 15, + CARTRIDGE_5200_NS_16 = 16, + CARTRIDGE_ATRAX_128 = 17, + CARTRIDGE_BBSB_40 = 18, + CARTRIDGE_5200_8 = 19, + CARTRIDGE_5200_4 = 20, + CARTRIDGE_RIGHT_8 = 21, + CARTRIDGE_WILL_32 = 22, + CARTRIDGE_XEGS_256 = 23, + CARTRIDGE_XEGS_512 = 24, + CARTRIDGE_XEGS_1024 = 25, + CARTRIDGE_MEGA_16 = 26, + CARTRIDGE_MEGA_32 = 27, + CARTRIDGE_MEGA_64 = 28, + CARTRIDGE_MEGA_128 = 29, + CARTRIDGE_MEGA_256 = 30, + CARTRIDGE_MEGA_512 = 31, + CARTRIDGE_MEGA_1024 = 32, + CARTRIDGE_SWXEGS_32 = 33, + CARTRIDGE_SWXEGS_64 = 34, + CARTRIDGE_SWXEGS_128 = 35, + CARTRIDGE_SWXEGS_256 = 36, + CARTRIDGE_SWXEGS_512 = 37, + CARTRIDGE_SWXEGS_1024 = 38, + CARTRIDGE_PHOENIX_8 = 39, + CARTRIDGE_BLIZZARD_16 = 40, + CARTRIDGE_ATMAX_128 = 41, + CARTRIDGE_ATMAX_1024 = 42, + CARTRIDGE_SDX_128 = 43, + CARTRIDGE_OSS_8 = 44, + CARTRIDGE_OSS_043M_16 = 45, + CARTRIDGE_BLIZZARD_4 = 46, + CARTRIDGE_AST_32 = 47, + CARTRIDGE_ATRAX_SDX_64 = 48, + CARTRIDGE_ATRAX_SDX_128 = 49, + CARTRIDGE_TURBOSOFT_64 = 50, + CARTRIDGE_TURBOSOFT_128 = 51, + CARTRIDGE_ULTRACART_32 = 52, + CARTRIDGE_LOW_BANK_8 = 53, + CARTRIDGE_SIC_128 = 54, + CARTRIDGE_SIC_256 = 55, + CARTRIDGE_SIC_512 = 56, + CARTRIDGE_STD_2 = 57, + CARTRIDGE_STD_4 = 58, + CARTRIDGE_RIGHT_4 = 59, + CARTRIDGE_BLIZZARD_32 = 60, + CARTRIDGE_MEGAMAX_2048 = 61, + CARTRIDGE_THECART_128M = 62, + CARTRIDGE_MEGA_4096 = 63, + CARTRIDGE_MEGA_2048 = 64, + CARTRIDGE_THECART_32M = 65, + CARTRIDGE_THECART_64M = 66, + CARTRIDGE_XEGS_8F_64 = 67, + CARTRIDGE_LAST_SUPPORTED = 67 +}; + +#define CARTRIDGE_MAX_SIZE (128 * 1024 * 1024) +extern int const CARTRIDGE_kb[CARTRIDGE_LAST_SUPPORTED + 1]; + +#define CARTRIDGE_STD_8_DESC "Standard 8 KB cartridge" +#define CARTRIDGE_STD_16_DESC "Standard 16 KB cartridge" +#define CARTRIDGE_OSS_034M_16_DESC "OSS two chip 16 KB cartridge (034M)" +#define CARTRIDGE_5200_32_DESC "Standard 32 KB 5200 cartridge" +#define CARTRIDGE_DB_32_DESC "DB 32 KB cartridge" +#define CARTRIDGE_5200_EE_16_DESC "Two chip 16 KB 5200 cartridge" +#define CARTRIDGE_5200_40_DESC "Bounty Bob 40 KB 5200 cartridge" +#define CARTRIDGE_WILL_64_DESC "64 KB Williams cartridge" +#define CARTRIDGE_EXP_64_DESC "Express 64 KB cartridge" +#define CARTRIDGE_DIAMOND_64_DESC "Diamond 64 KB cartridge" +#define CARTRIDGE_SDX_64_DESC "SpartaDOS X 64 KB cartridge" +#define CARTRIDGE_XEGS_32_DESC "XEGS 32 KB cartridge" +#define CARTRIDGE_XEGS_07_64_DESC "XEGS 64 KB cartridge (banks 0-7)" +#define CARTRIDGE_XEGS_128_DESC "XEGS 128 KB cartridge" +#define CARTRIDGE_OSS_M091_16_DESC "OSS one chip 16 KB cartridge" +#define CARTRIDGE_5200_NS_16_DESC "One chip 16 KB 5200 cartridge" +#define CARTRIDGE_ATRAX_128_DESC "Atrax 128 KB cartridge" +#define CARTRIDGE_BBSB_40_DESC "Bounty Bob 40 KB cartridge" +#define CARTRIDGE_5200_8_DESC "Standard 8 KB 5200 cartridge" +#define CARTRIDGE_5200_4_DESC "Standard 4 KB 5200 cartridge" +#define CARTRIDGE_RIGHT_8_DESC "Right slot 8 KB cartridge" +#define CARTRIDGE_WILL_32_DESC "32 KB Williams cartridge" +#define CARTRIDGE_XEGS_256_DESC "XEGS 256 KB cartridge" +#define CARTRIDGE_XEGS_512_DESC "XEGS 512 KB cartridge" +#define CARTRIDGE_XEGS_1024_DESC "XEGS 1 MB cartridge" +#define CARTRIDGE_MEGA_16_DESC "MegaCart 16 KB cartridge" +#define CARTRIDGE_MEGA_32_DESC "MegaCart 32 KB cartridge" +#define CARTRIDGE_MEGA_64_DESC "MegaCart 64 KB cartridge" +#define CARTRIDGE_MEGA_128_DESC "MegaCart 128 KB cartridge" +#define CARTRIDGE_MEGA_256_DESC "MegaCart 256 KB cartridge" +#define CARTRIDGE_MEGA_512_DESC "MegaCart 512 KB cartridge" +#define CARTRIDGE_MEGA_1024_DESC "MegaCart 1 MB cartridge" +#define CARTRIDGE_SWXEGS_32_DESC "Switchable XEGS 32 KB cartridge" +#define CARTRIDGE_SWXEGS_64_DESC "Switchable XEGS 64 KB cartridge" +#define CARTRIDGE_SWXEGS_128_DESC "Switchable XEGS 128 KB cartridge" +#define CARTRIDGE_SWXEGS_256_DESC "Switchable XEGS 256 KB cartridge" +#define CARTRIDGE_SWXEGS_512_DESC "Switchable XEGS 512 KB cartridge" +#define CARTRIDGE_SWXEGS_1024_DESC "Switchable XEGS 1 MB cartridge" +#define CARTRIDGE_PHOENIX_8_DESC "Phoenix 8 KB cartridge" +#define CARTRIDGE_BLIZZARD_16_DESC "Blizzard 16 KB cartridge" +#define CARTRIDGE_ATMAX_128_DESC "Atarimax 128 KB Flash cartridge" +#define CARTRIDGE_ATMAX_1024_DESC "Atarimax 1 MB Flash cartridge" +#define CARTRIDGE_SDX_128_DESC "SpartaDOS X 128 KB cartridge" +#define CARTRIDGE_OSS_8_DESC "OSS 8 KB cartridge" +#define CARTRIDGE_OSS_043M_16_DESC "OSS two chip 16 KB cartridge (043M)" +#define CARTRIDGE_BLIZZARD_4_DESC "Blizzard 4 KB cartridge" +#define CARTRIDGE_AST_32_DESC "AST 32 KB cartridge" +#define CARTRIDGE_ATRAX_SDX_64_DESC "Atrax SDX 64 KB cartridge" +#define CARTRIDGE_ATRAX_SDX_128_DESC "Atrax SDX 128 KB cartridge" +#define CARTRIDGE_TURBOSOFT_64_DESC "Turbosoft 64 KB cartridge" +#define CARTRIDGE_TURBOSOFT_128_DESC "Turbosoft 128 KB cartridge" +#define CARTRIDGE_ULTRACART_32_DESC "Ultracart 32 KB cartridge" +#define CARTRIDGE_LOW_BANK_8_DESC "Low bank 8 KB cartridge" +#define CARTRIDGE_SIC_128_DESC "SIC! 128 KB cartridge" +#define CARTRIDGE_SIC_256_DESC "SIC! 256 KB cartridge" +#define CARTRIDGE_SIC_512_DESC "SIC! 512 KB cartridge" +#define CARTRIDGE_STD_2_DESC "Standard 2 KB cartridge" +#define CARTRIDGE_STD_4_DESC "Standard 4 KB cartridge" +#define CARTRIDGE_RIGHT_4_DESC "Right slot 4 KB cartridge" +#define CARTRIDGE_BLIZZARD_32_DESC "Blizzard 32 KB cartridge" +#define CARTRIDGE_MEGAMAX_2048_DESC "MegaMax 2 MB cartridge" +#define CARTRIDGE_THECART_128M_DESC "The!Cart 128 MB cartridge" +#define CARTRIDGE_MEGA_4096_DESC "Flash MegaCart 4 MB cartridge" +#define CARTRIDGE_MEGA_2048_DESC "MegaCart 2 MB cartridge" +#define CARTRIDGE_THECART_32M_DESC "The!Cart 32 MB cartridge" +#define CARTRIDGE_THECART_64M_DESC "The!Cart 64 MB cartridge" +#define CARTRIDGE_XEGS_8F_64_DESC "XEGS 64 KB cartridge (banks 8-15)" + +/* Indicates whether the emulator should automatically reboot (coldstart) + after inserting/removing a cartridge. (Doesn't affect the piggyback + cartridge - in this case system will never autoreboot.) */ +extern int CARTRIDGE_autoreboot; + +typedef struct CARTRIDGE_image_t { + int type; + int state; /* Cartridge's state, such as selected bank or switch on/off. */ + int size; /* Size of the image, in kilobytes */ + UBYTE *image; + char filename[FILENAME_MAX]; +} CARTRIDGE_image_t; + +extern CARTRIDGE_image_t CARTRIDGE_main; +extern CARTRIDGE_image_t CARTRIDGE_piggyback; + +int CARTRIDGE_Checksum(const UBYTE *image, int nbytes); + +int CARTRIDGE_ReadConfig(char *string, char *ptr); +void CARTRIDGE_WriteConfig(FILE *fp); +int CARTRIDGE_Initialise(int *argc, char *argv[]); +void CARTRIDGE_Exit(void); + +#define CARTRIDGE_CANT_OPEN -1 /* Can't open cartridge image file */ +#define CARTRIDGE_BAD_FORMAT -2 /* Unknown cartridge format */ +#define CARTRIDGE_BAD_CHECKSUM -3 /* Warning: bad CART checksum */ +/* Inserts the left cartrifge. */ +int CARTRIDGE_Insert(const char *filename); +/* Inserts the left cartridge and reboots the system if needed. */ +int CARTRIDGE_InsertAutoReboot(const char *filename); +/* Inserts the piggyback cartridge. */ +int CARTRIDGE_Insert_Second(const char *filename); +/* When the cartridge type is CARTRIDGE_UNKNOWN after a call to + CARTRIDGE_Insert(), this function should be called to set the + cartridge's type manually to a value chosen by user. */ +void CARTRIDGE_SetType(CARTRIDGE_image_t *cart, int type); +/* Sets type of the cartridge and reboots the system if needed. */ +void CARTRIDGE_SetTypeAutoReboot(CARTRIDGE_image_t *cart, int type); + +/* Removes the left cartridge. */ +void CARTRIDGE_Remove(void); +/* Removes the left cartridge and reboots the system if needed. */ +void CARTRIDGE_RemoveAutoReboot(void); +/* Removed the piggyback cartridge. */ +void CARTRIDGE_Remove_Second(void); + +/* Called on system coldstart. Resets the states of mounted cartridges. */ +void CARTRIDGE_ColdStart(void); + +UBYTE CARTRIDGE_GetByte(UWORD addr, int no_side_effects); +void CARTRIDGE_PutByte(UWORD addr, UBYTE byte); +void CARTRIDGE_BountyBob1(UWORD addr); +void CARTRIDGE_BountyBob2(UWORD addr); +void CARTRIDGE_StateSave(void); +void CARTRIDGE_StateRead(UBYTE version); +#ifdef PAGED_ATTRIB +UBYTE CARTRIDGE_BountyBob1GetByte(UWORD addr, int no_side_effects); +UBYTE CARTRIDGE_BountyBob2GetByte(UWORD addr, int no_side_effects); +void CARTRIDGE_BountyBob1PutByte(UWORD addr, UBYTE value); +void CARTRIDGE_BountyBob2PutByte(UWORD addr, UBYTE value); +#endif + +#endif /* CARTRIDGE_H_ */ diff --git a/PVAtari800/atari800-src/cassette.c b/PVAtari800/atari800-src/cassette.c new file mode 100644 index 0000000000..16470d4412 --- /dev/null +++ b/PVAtari800/atari800-src/cassette.c @@ -0,0 +1,479 @@ +/* + * cassette.c - cassette emulation + * + * Copyright (C) 2001 Piotr Fusik + * Copyright (C) 2001-2011 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include +#include + +#include "atari.h" +#include "cpu.h" +#include "cassette.h" +#include "esc.h" +#include "img_tape.h" +#include "log.h" +#include "util.h" +#include "pokey.h" + +static IMG_TAPE_t *cassette_file = NULL; + +/* Time till the end of the current tape event (byte or gap), in CPU ticks. */ +static SLONG event_time_left = 0; + +/* Indicates that there is a SERIN transmission in progress and when it ends, + the current byte should be copied to POKEY_SERIN. This can be reset by + rewinding/removing the tape or by resetting POKEY. + Note that this variable has any meaning when PASSING_GAP is FALSE, + so it doesn't have to be reset during PASSING_IRG. */ +static int pending_serin = FALSE; + +/* Indicates that an Inter-Record-Gap is currently being passed. It's set to TRUE + at the beginning of each block. */ +static int passing_gap = FALSE; + +/* if penting_serin == TRUE, this holds the byte that is currently loaded from + tape. It might be later copied to serin_byte. */ +static UBYTE pending_serin_byte = 0xff; + +/* Byte most recently loaded from tape; will be accessed by SIO_GetByte(). */ +static UBYTE serin_byte = 0xff; + +char CASSETTE_filename[FILENAME_MAX]; +CASSETTE_status_t CASSETTE_status = CASSETTE_STATUS_NONE; +int CASSETTE_write_protect = FALSE; +int CASSETTE_record = FALSE; +static int cassette_writable = FALSE; +static int cassette_readable = FALSE; + +char CASSETTE_description[CASSETTE_DESCRIPTION_MAX]; +static int cassette_gapdelay = 0; /* in ms, includes leader and all gaps */ +static int cassette_motor = 0; + +int CASSETTE_hold_start_on_reboot = 0; +int CASSETTE_hold_start = 0; +int CASSETTE_press_space = 0; +/* Indicates whether the tape has ended. During saving the value is always 0; + during loading it is equal to (CASSETTE_GetPosition() >= CASSETTE_GetSize()). */ +static int eof_of_tape = 0; + +/* Call this function after each change of + cassette_motor, CASSETTE_status or eof_of_tape. */ +static void UpdateFlags(void) +{ + cassette_readable = cassette_motor && + (CASSETTE_status == CASSETTE_STATUS_READ_WRITE || + CASSETTE_status == CASSETTE_STATUS_READ_ONLY) && + !eof_of_tape; + cassette_writable = cassette_motor && + CASSETTE_status == CASSETTE_STATUS_READ_WRITE && + !CASSETTE_write_protect; +} + +int CASSETTE_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "CASSETTE_FILENAME") == 0) + Util_strlcpy(CASSETTE_filename, ptr, sizeof(CASSETTE_filename)); + else if (strcmp(string, "CASSETTE_LOADED") == 0) { + int value = Util_sscanbool(ptr); + if (value == -1) + return FALSE; + CASSETTE_status = (value ? CASSETTE_STATUS_READ_WRITE : CASSETTE_STATUS_NONE); + } + else if (strcmp(string, "CASSETTE_WRITE_PROTECT") == 0) { + int value = Util_sscanbool(ptr); + if (value == -1) + return FALSE; + CASSETTE_write_protect = value; + } + else return FALSE; + return TRUE; +} + +void CASSETTE_WriteConfig(FILE *fp) +{ + fprintf(fp, "CASSETTE_FILENAME=%s\n", CASSETTE_filename); + fprintf(fp, "CASSETTE_LOADED=%d\n", CASSETTE_status != CASSETTE_STATUS_NONE); + fprintf(fp, "CASSETTE_WRITE_PROTECT=%d\n", CASSETTE_write_protect); +} + +int CASSETTE_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + int protect = FALSE; /* Is write-protect requested in command line? */ + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-tape") == 0) { + if (i_a) { + Util_strlcpy(CASSETTE_filename, argv[++i], sizeof(CASSETTE_filename)); + CASSETTE_status = CASSETTE_STATUS_READ_WRITE; + /* Reset any write-protection read from config file. */ + CASSETTE_write_protect = FALSE; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-boottape") == 0) { + if (i_a) { + Util_strlcpy(CASSETTE_filename, argv[++i], sizeof(CASSETTE_filename)); + CASSETTE_status = CASSETTE_STATUS_READ_WRITE; + /* Reset any write-protection read from config file. */ + CASSETTE_write_protect = FALSE; + CASSETTE_hold_start = 1; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-tape-readonly") == 0) + protect = TRUE; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-tape Insert cassette image"); + Log_print("\t-boottape Insert cassette image and boot it"); + Log_print("\t-tape-readonly Mark the attached cassette image as read-only"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + + *argc = j; + + /* If CASSETTE_status was set in this function or in CASSETTE_ReadConfig(), + then tape is to be mounted. */ + if (CASSETTE_status != CASSETTE_STATUS_NONE && CASSETTE_filename[0] != '\0') { + /* Tape is mounted unprotected by default - overrun it if needed. */ + protect = protect || CASSETTE_write_protect; + if (!CASSETTE_Insert(CASSETTE_filename)) { + CASSETTE_status = CASSETTE_STATUS_NONE; + Log_print("Cannot open cassette image %s", CASSETTE_filename); + } + else if (protect) + CASSETTE_ToggleWriteProtect(); + } + + return TRUE; +} + +void CASSETTE_Exit(void) +{ + CASSETTE_Remove(); +} + +int CASSETTE_Insert(const char *filename) +{ + int writable; + char const *description; + + IMG_TAPE_t *file = IMG_TAPE_Open(filename, &writable, &description); + if (file == NULL) + return FALSE; + + CASSETTE_Remove(); + cassette_file = file; + /* Guard against providing CASSETTE_filename as parameter. */ + if (CASSETTE_filename != filename) + strcpy(CASSETTE_filename, filename); + eof_of_tape = 0; + + CASSETTE_status = (writable ? CASSETTE_STATUS_READ_WRITE : CASSETTE_STATUS_READ_ONLY); + event_time_left = 0; + pending_serin = FALSE; + passing_gap = FALSE; + + if (description != NULL) + Util_strlcpy(CASSETTE_description, description, sizeof(CASSETTE_description)); + CASSETTE_write_protect = FALSE; + CASSETTE_record = FALSE; + UpdateFlags(); + cassette_gapdelay = 0; + + return TRUE; +} + +void CASSETTE_Remove(void) +{ + if (cassette_file != NULL) { + IMG_TAPE_Close(cassette_file); + cassette_file = NULL; + } + CASSETTE_status = CASSETTE_STATUS_NONE; + CASSETTE_description[0] = '\0'; + UpdateFlags(); +} + +int CASSETTE_CreateCAS(const char *filename, const char *description) { + IMG_TAPE_t *file = IMG_TAPE_Create(filename, description); + if (file == NULL) + return FALSE; + + CASSETTE_Remove(); /* Unmount any previous tape image. */ + cassette_file = file; + Util_strlcpy(CASSETTE_filename, filename, sizeof(CASSETTE_filename)); + if (description != NULL) + Util_strlcpy(CASSETTE_description, description, sizeof(CASSETTE_description)); + CASSETTE_status = CASSETTE_STATUS_READ_WRITE; + event_time_left = 0; + pending_serin = FALSE; + passing_gap = FALSE; + cassette_gapdelay = 0; + eof_of_tape = 0; + CASSETTE_record = TRUE; + CASSETTE_write_protect = FALSE; + UpdateFlags(); + + return TRUE; +} + +unsigned int CASSETTE_GetPosition(void) +{ + if (cassette_file == NULL) + return 0; + return IMG_TAPE_GetPosition(cassette_file) + 1; +} + +unsigned int CASSETTE_GetSize(void) +{ + if (cassette_file == NULL) + return 0; + return IMG_TAPE_GetSize(cassette_file); +} + +void CASSETTE_Seek(unsigned int position) +{ + if (cassette_file != NULL) { + if (position > 0) + position --; + IMG_TAPE_Seek(cassette_file, position); + + event_time_left = 0; + pending_serin = FALSE; + passing_gap = FALSE; + eof_of_tape = 0; + CASSETTE_record = FALSE; + UpdateFlags(); + } +} + +int CASSETTE_GetByte(void) +{ + return serin_byte; +} + +int CASSETTE_IOLineStatus(void) +{ + /* if motor off and EOF return always 1 (equivalent the mark tone) */ + if (!cassette_readable || CASSETTE_record || passing_gap) { + return 1; + } + + return IMG_TAPE_SerinStatus(cassette_file, event_time_left); +} + +void CASSETTE_PutByte(int byte) +{ + if (!ESC_enable_sio_patch && cassette_writable && CASSETTE_record) + IMG_TAPE_WriteByte(cassette_file, byte, POKEY_AUDF[POKEY_CHAN3] + POKEY_AUDF[POKEY_CHAN4]*0x100); +} + +void CASSETTE_TapeMotor(int onoff) +{ + if (cassette_motor != onoff) { + if (CASSETTE_record && cassette_writable) + /* Recording disabled, flush the tape */ + IMG_TAPE_Flush(cassette_file); + cassette_motor = onoff; + UpdateFlags(); + } +} + +int CASSETTE_ToggleWriteProtect(void) +{ + if (CASSETTE_status != CASSETTE_STATUS_READ_WRITE) + return FALSE; + CASSETTE_write_protect = !CASSETTE_write_protect; + UpdateFlags(); + return TRUE; +} + +int CASSETTE_ToggleRecord(void) +{ + if (CASSETTE_status == CASSETTE_STATUS_NONE) + return FALSE; + CASSETTE_record = !CASSETTE_record; + if (CASSETTE_record) + eof_of_tape = FALSE; + else if (cassette_writable) + /* Recording disabled, flush the tape */ + IMG_TAPE_Flush(cassette_file); + event_time_left = 0; + pending_serin = FALSE; + passing_gap = FALSE; + UpdateFlags(); + /* Return FALSE to indicate that recording will not work. */ + return !CASSETTE_record || (CASSETTE_status == CASSETTE_STATUS_READ_WRITE && !CASSETTE_write_protect); +} + +static void CassetteWrite(int num_ticks) +{ + if (cassette_writable) + IMG_TAPE_WriteAdvance(cassette_file, num_ticks); +} + +/* Sets the stamp of next SERIN IRQ event and loads new record if necessary. + Returns TRUE if a new byte was loaded and POKEY_SERIN should be updated. + The function assumes that current_block <= max_block. */ +static int CassetteRead(int num_ticks) +{ + if (cassette_readable) { + int loaded = FALSE; /* Function's return value */ + event_time_left -= num_ticks; + while (event_time_left < 0) { + unsigned int length; + if (!passing_gap && pending_serin) { + serin_byte = pending_serin_byte; + /* A byte is loaded, return TRUE so it gets stored in POKEY_SERIN. */ + loaded = TRUE; + } + + /* If POKEY is in reset state, no serial I/O occurs. */ + pending_serin = (POKEY_SKCTL & 0x03) != 0; + + if (!IMG_TAPE_Read(cassette_file, &length, &passing_gap, &pending_serin_byte)) { + eof_of_tape = 1; + UpdateFlags(); + return loaded; + } + + event_time_left += length; + } + return loaded; + } + return FALSE; +} + +int CASSETTE_AddScanLine(void) +{ + /* increment elapsed cassette time */ + if (CASSETTE_record) { + CassetteWrite(114); + return FALSE; + } else + return CassetteRead(114); +} + +void CASSETTE_ResetPOKEY(void) +{ + /* Resetting POKEY stops any serial transmission. */ + pending_serin = FALSE; + pending_serin_byte = 0xff; +} + +/* --- Functions for loading/saving with SIO patch --- */ + +int CASSETTE_AddGap(int gaptime) +{ + cassette_gapdelay += gaptime; + if (cassette_gapdelay < 0) + cassette_gapdelay = 0; + return cassette_gapdelay; +} + +/* Indicates that a loading leader is expected by the OS */ +void CASSETTE_LeaderLoad(void) +{ + if (CASSETTE_record) + CASSETTE_ToggleRecord(); + CASSETTE_TapeMotor(TRUE); + cassette_gapdelay = 9600; + /* registers for SETVBV: third system timer, ~0.1 sec */ + CPU_regA = 3; + CPU_regX = 0; + CPU_regY = 5; +} + +/* indicates that a save leader is written by the OS */ +void CASSETTE_LeaderSave(void) +{ + if (!CASSETTE_record) + CASSETTE_ToggleRecord(); + CASSETTE_TapeMotor(TRUE); + cassette_gapdelay = 19200; + /* registers for SETVBV: third system timer, ~0.1 sec */ + CPU_regA = 3; + CPU_regX = 0; + CPU_regY = 5; +} + +int CASSETTE_ReadToMemory(UWORD dest_addr, int length) +{ + CASSETTE_TapeMotor(1); + if (!cassette_readable) + return 0; + + /* Convert wait_time to ms ( wait_time * 1000 / 1789790 ) and subtract. */ + cassette_gapdelay -= event_time_left / 1789; /* better accuracy not needed */ + if (!IMG_TAPE_SkipToData(cassette_file, cassette_gapdelay)) { + /* Ignore the eventual error, assume it is the end of file */ + cassette_gapdelay = 0; + eof_of_tape = 1; + UpdateFlags(); + return 0; + } + cassette_gapdelay = 0; + + /* Load bytes */ + switch (IMG_TAPE_ReadToMemory(cassette_file, dest_addr, length)) { + case TRUE: + return TRUE; + case -1: /* Read error/EOF */ + eof_of_tape = 1; + UpdateFlags(); + /* FALLTHROUGH */ + default: /* case FALSE */ + return FALSE; + } +} + +int CASSETTE_WriteFromMemory(UWORD src_addr, int length) +{ + int result; + CASSETTE_TapeMotor(1); + if (!cassette_writable) + return 0; + + result = IMG_TAPE_WriteFromMemory(cassette_file, src_addr, length, cassette_gapdelay); + cassette_gapdelay = 0; + return result; +} + + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/cassette.h b/PVAtari800/atari800-src/cassette.h new file mode 100644 index 0000000000..e11dab2386 --- /dev/null +++ b/PVAtari800/atari800-src/cassette.h @@ -0,0 +1,88 @@ +#ifndef CASSETTE_H_ +#define CASSETTE_H_ + +#include /* for FILE and FILENAME_MAX */ + +#include "atari.h" /* for UBYTE */ + +#define CASSETTE_DESCRIPTION_MAX 256 + +extern char CASSETTE_filename[FILENAME_MAX]; +extern char CASSETTE_description[CASSETTE_DESCRIPTION_MAX]; +typedef enum { + CASSETTE_STATUS_NONE, + CASSETTE_STATUS_READ_ONLY, + CASSETTE_STATUS_READ_WRITE +} CASSETTE_status_t; +extern CASSETTE_status_t CASSETTE_status; + +/* Used in Atari800_Initialise during emulator initialisation */ +int CASSETTE_Initialise(int *argc, char *argv[]); +void CASSETTE_Exit(void); +/* Config file read/write */ +int CASSETTE_ReadConfig(char *string, char *ptr); +void CASSETTE_WriteConfig(FILE *fp); + +/* Attaches a tape image. Also resets CASSETTE_write_protect to FALSE. + Returns TRUE on success, FALSE otherwise. */ +int CASSETTE_Insert(const char *filename); +void CASSETTE_Remove(void); +/* Creates a new file in CAS format. DESCRIPTION can be NULL. + Returns TRUE on success, FALSE otherwise. */ +int CASSETTE_CreateCAS(char const *filename, char const *description); + +extern int CASSETTE_hold_start; +extern int CASSETTE_hold_start_on_reboot; /* preserve hold_start after reboot */ +extern int CASSETTE_press_space; + +/* Is cassette file write-protected? Don't change directly, use CASSETTE_ToggleWriteProtect(). */ +extern int CASSETTE_write_protect; +/* Switches RO/RW. Fails with FALSE if the tape cannot be switched to RW. */ +int CASSETTE_ToggleWriteProtect(void); + + /* Is cassette record button pressed? Don't change directly, use CASSETTE_ToggleRecord(). */ +extern int CASSETTE_record; +/* If tape is mounted, switches recording on/off (otherwise return FALSE). + Recording operations would fail if the tape is read-only. In such + situation, when switching recording on the function returns FALSE. */ +int CASSETTE_ToggleRecord(void); + +void CASSETTE_Seek(unsigned int position); +/* Returns status of the DATA IN line. */ +int CASSETTE_IOLineStatus(void); +/* Get the byte which was recently loaded from tape. */ +int CASSETTE_GetByte(void); +/* Put a byte into the cas file. + The block is being written at first putbyte of the subsequent block */ +void CASSETTE_PutByte(int byte); +/* Set motor status: 1 - on, 0 - off */ +void CASSETTE_TapeMotor(int onoff); +/* Advance the tape by a scanline. Return TRUE if a new byte has been loaded + and POKEY_SERIN must be updated. */ +int CASSETTE_AddScanLine(void); +/* Reset cassette serial transmission; call when resseting POKEY by SKCTL. */ +void CASSETTE_ResetPOKEY(void); + +/* Return size in blocks of the currently-mounted tape file. */ +unsigned int CASSETTE_GetSize(void); +/* Return current position (block number) of the mounted tape (counted from 1). */ +unsigned int CASSETTE_GetPosition(void); + +/* --- Functions used by patched SIO --- */ +/* -- SIO_Handler() -- */ +int CASSETTE_AddGap(int gaptime); +/* Reads a record from tape and copies its contents (max. LENGTH bytes, + excluding the trailing checksum) to memory starting at address DEST_ADDR. + Returns FALSE if number of bytes in record doesn't equal LENGTH, or + checksum is incorrect, or there was a read error/end of file; otherwise + returns TRUE. */ +int CASSETTE_ReadToMemory(UWORD dest_addr, int length); +/* Reads LENGTH bytes from memory starting at SRC_ADDR and writes them as + a record (with added checksum) to tape. Returns FALSE if there was a write + error, TRUE otherwise. */ +int CASSETTE_WriteFromMemory(UWORD src_addr, int length); +/* -- Other -- */ +void CASSETTE_LeaderLoad(void); +void CASSETTE_LeaderSave(void); + +#endif /* CASSETTE_H_ */ diff --git a/PVAtari800/atari800-src/cfg.c b/PVAtari800/atari800-src/cfg.c new file mode 100755 index 0000000000..60d61ca7ef --- /dev/null +++ b/PVAtari800/atari800-src/cfg.c @@ -0,0 +1,473 @@ +/* + * cfg.c - Emulator Configuration + * + * Copyright (c) 1995-1998 David Firth + * Copyright (c) 1998-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "config.h" +#include "artifact.h" +#include "atari.h" +#include +#include "cartridge.h" +#include "cassette.h" +#include "cfg.h" +#include "devices.h" +#include "esc.h" +#include "log.h" +#include "memory.h" +#include "pbi.h" +#include "rtime.h" +#include "sysrom.h" +#ifdef XEP80_EMULATION +#include "xep80.h" +#endif +#ifdef AF80 +#include "af80.h" +#endif +#include "platform.h" +#include "pokeysnd.h" +#include "ui.h" +#include "util.h" +#if !defined(BASIC) && !defined(CURSES_BASIC) +#include "colours.h" +#include "screen.h" +#endif +#ifdef NTSC_FILTER +#include "filter_ntsc.h" +#endif +#if SUPPORTS_CHANGE_VIDEOMODE +#include "videomode.h" +#endif +#ifdef SOUND +#include "sound.h" +#endif + +int CFG_save_on_exit = FALSE; + +/* If another default path config path is defined use it + otherwise use the default one */ +#ifndef DEFAULT_CFG_NAME +#define DEFAULT_CFG_NAME ".atari800.cfg" +#endif + +#ifndef SYSTEM_WIDE_CFG_FILE +#define SYSTEM_WIDE_CFG_FILE "/etc/atari800.cfg" +#endif + +static char rtconfig_filename[FILENAME_MAX]; + +int CFG_LoadConfig(const char *alternate_config_filename) +{ + FILE *fp; + const char *fname = rtconfig_filename; + char string[256]; +#ifndef BASIC + int was_obsolete_dir = FALSE; +#endif + +#ifdef SUPPORTS_PLATFORM_CONFIGINIT + PLATFORM_ConfigInit(); +#endif + + /* if alternate config filename is passed then use it */ + if (alternate_config_filename != NULL && *alternate_config_filename > 0) { + Util_strlcpy(rtconfig_filename, alternate_config_filename, FILENAME_MAX); + } + /* else use the default config name under the HOME folder */ + else { + char *home = getenv("HOME"); + if (home != NULL) + Util_catpath(rtconfig_filename, home, DEFAULT_CFG_NAME); + else + strcpy(rtconfig_filename, DEFAULT_CFG_NAME); + } + + fp = fopen(fname, "r"); + if (fp == NULL) { + Log_print("User config file '%s' not found.", rtconfig_filename); + +#ifdef SYSTEM_WIDE_CFG_FILE + /* try system wide config file */ + fname = SYSTEM_WIDE_CFG_FILE; + Log_print("Trying system wide config file: %s", fname); + fp = fopen(fname, "r"); +#endif + if (fp == NULL) { + Log_print("No configuration file found, will create fresh one from scratch:"); + return FALSE; + } + } + + if (fgets(string, sizeof(string), fp) != NULL) { + Log_print("Using Atari800 config file: %s\nCreated by %s", fname, string); + } + + while (fgets(string, sizeof(string), fp)) { + char *ptr; + Util_chomp(string); + ptr = strchr(string, '='); + if (ptr != NULL) { + *ptr++ = '\0'; + Util_trim(string); + Util_trim(ptr); + + if (SYSROM_ReadConfig(string, ptr)) { + } +#ifdef BASIC + else if (strcmp(string, "ATARI_FILES_DIR") == 0 + || strcmp(string, "SAVED_FILES_DIR") == 0 + || strcmp(string, "DISK_DIR") == 0 || strcmp(string, "ROM_DIR") == 0 + || strcmp(string, "EXE_DIR") == 0 || strcmp(string, "STATE_DIR") == 0) + /* do nothing */; +#else + else if (strcmp(string, "ATARI_FILES_DIR") == 0) { + if (UI_n_atari_files_dir >= UI_MAX_DIRECTORIES) + Log_print("All ATARI_FILES_DIR slots used!"); + else + Util_strlcpy(UI_atari_files_dir[UI_n_atari_files_dir++], ptr, FILENAME_MAX); + } + else if (strcmp(string, "SAVED_FILES_DIR") == 0) { + if (UI_n_saved_files_dir >= UI_MAX_DIRECTORIES) + Log_print("All SAVED_FILES_DIR slots used!"); + else + Util_strlcpy(UI_saved_files_dir[UI_n_saved_files_dir++], ptr, FILENAME_MAX); + } + else if (strcmp(string, "DISK_DIR") == 0 || strcmp(string, "ROM_DIR") == 0 + || strcmp(string, "EXE_DIR") == 0 || strcmp(string, "STATE_DIR") == 0) { + /* ignore blank and "." values */ + if (ptr[0] != '\0' && (ptr[0] != '.' || ptr[1] != '\0')) + was_obsolete_dir = TRUE; + } +#endif + else if (strcmp(string, "H1_DIR") == 0) + Util_strlcpy(Devices_atari_h_dir[0], ptr, FILENAME_MAX); + else if (strcmp(string, "H2_DIR") == 0) + Util_strlcpy(Devices_atari_h_dir[1], ptr, FILENAME_MAX); + else if (strcmp(string, "H3_DIR") == 0) + Util_strlcpy(Devices_atari_h_dir[2], ptr, FILENAME_MAX); + else if (strcmp(string, "H4_DIR") == 0) + Util_strlcpy(Devices_atari_h_dir[3], ptr, FILENAME_MAX); + else if (strcmp(string, "HD_READ_ONLY") == 0) + Devices_h_read_only = Util_sscandec(ptr); + + else if (strcmp(string, "PRINT_COMMAND") == 0) { + if (!Devices_SetPrintCommand(ptr)) + Log_print("Unsafe PRINT_COMMAND ignored"); + } + + else if (strcmp(string, "SCREEN_REFRESH_RATIO") == 0) + Atari800_refresh_rate = Util_sscandec(ptr); + else if (strcmp(string, "DISABLE_BASIC") == 0) + Atari800_disable_basic = Util_sscanbool(ptr); + + else if (strcmp(string, "ENABLE_SIO_PATCH") == 0) { + ESC_enable_sio_patch = Util_sscanbool(ptr); + } + else if (strcmp(string, "ENABLE_H_PATCH") == 0) { + Devices_enable_h_patch = Util_sscanbool(ptr); + } + else if (strcmp(string, "ENABLE_P_PATCH") == 0) { + Devices_enable_p_patch = Util_sscanbool(ptr); + } + else if (strcmp(string, "ENABLE_R_PATCH") == 0) { + Devices_enable_r_patch = Util_sscanbool(ptr); + } + + else if (strcmp(string, "ENABLE_NEW_POKEY") == 0) { +#ifdef SOUND + POKEYSND_enable_new_pokey = Util_sscanbool(ptr); +#endif /* SOUND */ + } + else if (strcmp(string, "STEREO_POKEY") == 0) { +#ifdef STEREO_SOUND + POKEYSND_stereo_enabled = Util_sscanbool(ptr); +#ifdef SOUND_THIN_API + Sound_desired.channels = POKEYSND_stereo_enabled ? 2 : 1; +#endif /* SOUND_THIN_API */ +#endif /* STEREO_SOUND */ + } + else if (strcmp(string, "SPEAKER_SOUND") == 0) { +#ifdef CONSOLE_SOUND + POKEYSND_console_sound_enabled = Util_sscanbool(ptr); +#endif + } + else if (strcmp(string, "SERIO_SOUND") == 0) { +#ifdef SERIO_SOUND + POKEYSND_serio_sound_enabled = Util_sscanbool(ptr); +#endif + } + else if (strcmp(string, "MACHINE_TYPE") == 0) { + if (strcmp(ptr, "Atari 400/800") == 0 || + /* Also recognise legacy values of this parameter */ + strcmp(ptr, "Atari OS/A") == 0 || + strcmp(ptr, "Atari OS/B") == 0) + Atari800_machine_type = Atari800_MACHINE_800; + else if (strcmp(ptr, "Atari XL/XE") == 0) + Atari800_machine_type = Atari800_MACHINE_XLXE; + else if (strcmp(ptr, "Atari 5200") == 0) + Atari800_machine_type = Atari800_MACHINE_5200; + else + Log_print("Invalid machine type: %s", ptr); + } + else if (strcmp(string, "RAM_SIZE") == 0) { + if (strcmp(ptr, "320 (RAMBO)") == 0) + MEMORY_ram_size = MEMORY_RAM_320_RAMBO; + else if (strcmp(ptr, "320 (COMPY SHOP)") == 0) + MEMORY_ram_size = MEMORY_RAM_320_COMPY_SHOP; + else { + int size = Util_sscandec(ptr); + if (MEMORY_SizeValid(size)) + MEMORY_ram_size = size; + else + Log_print("Invalid RAM size: %s", ptr); + } + } + else if (strcmp(string, "DEFAULT_TV_MODE") == 0) { + if (strcmp(ptr, "PAL") == 0) + Atari800_tv_mode = Atari800_TV_PAL; + else if (strcmp(ptr, "NTSC") == 0) + Atari800_tv_mode = Atari800_TV_NTSC; + else + Log_print("Invalid TV Mode: %s", ptr); + } + else if (strcmp(string, "MOSAIC_RAM_NUM_BANKS") == 0) { + int num = Util_sscandec(ptr); + if (num >= 0 && num <= 64) + MEMORY_mosaic_num_banks = num; + else + Log_print("Invalid Mosaic RAM number of banks: %s", ptr); + } + else if (strcmp(string, "AXLON_RAM_NUM_BANKS") == 0) { + int num = Util_sscandec(ptr); + if (num == 0 || num == 8 || num == 16 || num == 32 || num == 64 || num == 128 || num == 256) + MEMORY_axlon_num_banks = num; + else + Log_print("Invalid Mosaic RAM number of banks: %s", ptr); + } + else if (strcmp(string, "ENABLE_MAPRAM") == 0) + MEMORY_enable_mapram = Util_sscanbool(ptr); + else if (strcmp(string, "BUILTIN_BASIC") == 0) + Atari800_builtin_basic = Util_sscanbool(ptr); + else if (strcmp(string, "KEYBOARD_LEDS") == 0) + Atari800_keyboard_leds = Util_sscanbool(ptr); + else if (strcmp(string, "F_KEYS") == 0) + Atari800_f_keys = Util_sscanbool(ptr); + else if (strcmp(string, "BUILTIN_GAME") == 0) + Atari800_builtin_game = Util_sscanbool(ptr); + else if (strcmp(string, "KEYBOARD_DETACHED") == 0) + Atari800_keyboard_detached = Util_sscanbool(ptr); + else if (strcmp(string, "1200XL_JUMPER") == 0) + Atari800_jumper = Util_sscanbool(ptr); + else if (strcmp(string, "CFG_SAVE_ON_EXIT") == 0) { + CFG_save_on_exit = Util_sscanbool(ptr); + } + /* Add module-specific configurations here */ + else if (PBI_ReadConfig(string,ptr)) { + } + else if (CARTRIDGE_ReadConfig(string, ptr)) { + } + else if (CASSETTE_ReadConfig(string, ptr)) { + } + else if (RTIME_ReadConfig(string, ptr)) { + } +#ifdef XEP80_EMULATION + else if (XEP80_ReadConfig(string, ptr)) { + } +#endif +#ifdef AF80 + else if (AF80_ReadConfig(string,ptr)) { + } +#endif +#if !defined(BASIC) && !defined(CURSES_BASIC) + else if (Colours_ReadConfig(string, ptr)) { + } + else if (ARTIFACT_ReadConfig(string, ptr)) { + } + else if (Screen_ReadConfig(string, ptr)) { + } +#endif +#ifdef NTSC_FILTER + else if (FILTER_NTSC_ReadConfig(string, ptr)) { + } +#endif +#if SUPPORTS_CHANGE_VIDEOMODE + else if (VIDEOMODE_ReadConfig(string, ptr)) { + } +#endif +#if defined(SOUND) && defined(SOUND_THIN_API) + else if (Sound_ReadConfig(string, ptr)) { + } +#endif /* defined(SOUND) && defined(SOUND_THIN_API) */ + else { +#ifdef SUPPORTS_PLATFORM_CONFIGURE + if (!PLATFORM_Configure(string, ptr)) { + Log_print("Unrecognized variable or bad parameters: '%s=%s'", string, ptr); + } +#else + Log_print("Unrecognized variable: %s", string); +#endif + } + } + else { + Log_print("Ignored config line: %s", string); + } + } + + fclose(fp); +#ifndef BASIC + if (was_obsolete_dir) { + Log_print( + "DISK_DIR, ROM_DIR, EXE_DIR and STATE_DIR configuration options\n" + "are no longer supported. Please use ATARI_FILES_DIR\n" + "and SAVED_FILES_DIR in your Atari800 configuration file."); + } +#endif + return TRUE; +} + +int CFG_WriteConfig(void) +{ + FILE *fp; + int i; + static const char * const machine_type_string[Atari800_MACHINE_SIZE] = { + "400/800", "XL/XE", "5200" + }; + + fp = fopen(rtconfig_filename, "w"); + if (fp == NULL) { + perror(rtconfig_filename); + Log_print("Cannot write to config file: %s", rtconfig_filename); + return FALSE; + } + Log_print("Writing config file: %s", rtconfig_filename); + + fprintf(fp, "%s\n", Atari800_TITLE); + SYSROM_WriteConfig(fp); +#ifndef BASIC + for (i = 0; i < UI_n_atari_files_dir; i++) + fprintf(fp, "ATARI_FILES_DIR=%s\n", UI_atari_files_dir[i]); + for (i = 0; i < UI_n_saved_files_dir; i++) + fprintf(fp, "SAVED_FILES_DIR=%s\n", UI_saved_files_dir[i]); +#endif + for (i = 0; i < 4; i++) + fprintf(fp, "H%c_DIR=%s\n", '1' + i, Devices_atari_h_dir[i]); + fprintf(fp, "HD_READ_ONLY=%d\n", Devices_h_read_only); + +#ifdef HAVE_SYSTEM + fprintf(fp, "PRINT_COMMAND=%s\n", Devices_print_command); +#endif + +#ifndef BASIC + fprintf(fp, "SCREEN_REFRESH_RATIO=%d\n", Atari800_refresh_rate); +#endif + + fprintf(fp, "MACHINE_TYPE=Atari %s\n", machine_type_string[Atari800_machine_type]); + + fprintf(fp, "RAM_SIZE="); + switch (MEMORY_ram_size) { + case MEMORY_RAM_320_RAMBO: + fprintf(fp, "320 (RAMBO)\n"); + break; + case MEMORY_RAM_320_COMPY_SHOP: + fprintf(fp, "320 (COMPY SHOP)\n"); + break; + default: + fprintf(fp, "%d\n", MEMORY_ram_size); + break; + } + + fprintf(fp, (Atari800_tv_mode == Atari800_TV_PAL) ? "DEFAULT_TV_MODE=PAL\n" : "DEFAULT_TV_MODE=NTSC\n"); + fprintf(fp, "MOSAIC_RAM_NUM_BANKS=%d\n", MEMORY_mosaic_num_banks); + fprintf(fp, "AXLON_RAM_NUM_BANKS=%d\n", MEMORY_axlon_num_banks); + fprintf(fp, "ENABLE_MAPRAM=%d\n", MEMORY_enable_mapram); + + fprintf(fp, "DISABLE_BASIC=%d\n", Atari800_disable_basic); + fprintf(fp, "ENABLE_SIO_PATCH=%d\n", ESC_enable_sio_patch); + fprintf(fp, "ENABLE_H_PATCH=%d\n", Devices_enable_h_patch); + fprintf(fp, "ENABLE_P_PATCH=%d\n", Devices_enable_p_patch); +#ifdef R_IO_DEVICE + fprintf(fp, "ENABLE_R_PATCH=%d\n", Devices_enable_r_patch); +#endif + +#ifdef SOUND + fprintf(fp, "ENABLE_NEW_POKEY=%d\n", POKEYSND_enable_new_pokey); +#ifdef STEREO_SOUND + fprintf(fp, "STEREO_POKEY=%d\n", POKEYSND_stereo_enabled); +#endif +#ifdef CONSOLE_SOUND + fprintf(fp, "SPEAKER_SOUND=%d\n", POKEYSND_console_sound_enabled); +#endif +#ifdef SERIO_SOUND + fprintf(fp, "SERIO_SOUND=%d\n", POKEYSND_serio_sound_enabled); +#endif +#endif /* SOUND */ + fprintf(fp, "BUILTIN_BASIC=%d\n", Atari800_builtin_basic); + fprintf(fp, "KEYBOARD_LEDS=%d\n", Atari800_keyboard_leds); + fprintf(fp, "F_KEYS=%d\n", Atari800_f_keys); + fprintf(fp, "BUILTIN_GAME=%d\n", Atari800_builtin_game); + fprintf(fp, "KEYBOARD_DETACHED=%d\n", Atari800_keyboard_detached); + fprintf(fp, "1200XL_JUMPER=%d\n", Atari800_jumper); + fprintf(fp, "CFG_SAVE_ON_EXIT=%d\n", CFG_save_on_exit); + /* Add module-specific configurations here */ + PBI_WriteConfig(fp); + CARTRIDGE_WriteConfig(fp); + CASSETTE_WriteConfig(fp); + RTIME_WriteConfig(fp); +#ifdef XEP80_EMULATION + XEP80_WriteConfig(fp); +#endif +#ifdef AF80 + AF80_WriteConfig(fp); +#endif +#if !defined(BASIC) && !defined(CURSES_BASIC) + Colours_WriteConfig(fp); + ARTIFACT_WriteConfig(fp); + Screen_WriteConfig(fp); +#endif +#ifdef NTSC_FILTER + FILTER_NTSC_WriteConfig(fp); +#endif +#if SUPPORTS_CHANGE_VIDEOMODE + VIDEOMODE_WriteConfig(fp); +#endif +#if defined(SOUND) && defined(SOUND_THIN_API) + Sound_WriteConfig(fp); +#endif /* defined(SOUND) && defined(SOUND_THIN_API) */ +#ifdef SUPPORTS_PLATFORM_CONFIGSAVE + PLATFORM_ConfigSave(fp); +#endif + fclose(fp); + return TRUE; +} + +int CFG_MatchTextParameter(char const *param, char const * const cfg_strings[], int cfg_strings_size) +{ + int i; + for (i = 0; i < cfg_strings_size; i ++) { + if (Util_stricmp(param, cfg_strings[i]) == 0) + return i; + } + /* Unrecognised value */ + return -1; +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/cfg.h b/PVAtari800/atari800-src/cfg.h new file mode 100755 index 0000000000..a29cb5e75d --- /dev/null +++ b/PVAtari800/atari800-src/cfg.h @@ -0,0 +1,19 @@ +#ifndef CFG_H_ +#define CFG_H_ + +/* Load Atari800 text configuration file. */ +int CFG_LoadConfig(const char *alternate_config_filename); + +/* Writes Atari800 text configuration file. */ +int CFG_WriteConfig(void); + +/* Controls whether the configuration file will be saved on emulator exit. */ +extern int CFG_save_on_exit; + +/* Compares the string PARAM with each entry in the CFG_STRINGS array + (of size CFG_STRINGS_SIZE), and returns index under which PARAM is found. + If PARAM does not exist in CFG_STRINGS, returns value lower than 0. + String comparison is case-insensitive. */ +int CFG_MatchTextParameter(char const *param, char const * const cfg_strings[], int cfg_strings_size); + +#endif /* CFG_H_ */ diff --git a/PVAtari800/atari800-src/colours.c b/PVAtari800/atari800-src/colours.c new file mode 100644 index 0000000000..69433298be --- /dev/null +++ b/PVAtari800/atari800-src/colours.c @@ -0,0 +1,332 @@ +/* + * colours.c - Atari colour palette adjustment - functions common for NTSC and + * PAL palettes + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "config.h" +#include +#include /* for strcmp() */ +#include +#include +#include "atari.h" +#include "cfg.h" +#include "colours.h" +#include "colours_external.h" +#include "colours_ntsc.h" +#include "colours_pal.h" +#include "log.h" +#include "util.h" +#include "platform.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +Colours_setup_t *Colours_setup; +COLOURS_EXTERNAL_t *Colours_external; + +static Colours_setup_t const presets[] = { + /* Hue, Saturation, Contrast, Brightness, Gamma adjustment, GTIA delay, Black level, White level */ + { 0.0, 0.0, 0.0, 0.0, 0.3, 0.0, 16, 235 }, /* Standard preset */ + { 0.0, 0.0, 0.2, -0.16, 0.5, 0.0, 16, 235 }, /* Deep blacks preset */ + { 0.0, 0.26, 0.72, -0.16, 0.16, 0.0, 16, 235 } /* Vibrant colours & levels preset */ +}; +static char const * const preset_cfg_strings[COLOURS_PRESET_SIZE] = { + "STANDARD", + "DEEP-BLACK", + "VIBRANT" +}; + +int Colours_table[256]; + +void Colours_SetRGB(int i, int r, int g, int b, int *colortable_ptr) +{ + if (r < 0) + r = 0; + else if (r > 255) + r = 255; + if (g < 0) + g = 0; + else if (g > 255) + g = 255; + if (b < 0) + b = 0; + else if (b > 255) + b = 255; + colortable_ptr[i] = (r << 16) + (g << 8) + b; +} + +/* 3x3 matrix for conversion from RGB to YUV colourspace. */ +static double const RGB2YUV_matrix[3][3] = { + { 0.299, 0.587, 0.114 }, + { -0.14713, -0.28886, 0.436 }, + { 0.615, -0.51499, -0.10001 } +}; + +/* 3x3 matrix for conversion from YUV to RGB colourspace. */ +static double const YUV2RGB_matrix[3][3] = { + { 1.0, 0.0, 1.13983 }, + { 1.0, -0.39465, -0.58060 }, + { 1.0, 2.03211, 0.0 } +}; + +/* Multiply 3x3 matrix MATRIX by vector IN[1..3] and return result in OUT[1..3]. */ +static void MultiplyMatrix(double in1, double in2, double in3, double *out1, double *out2, double *out3, double const matrix[3][3]) +{ + *out1 = matrix[0][0] * in1 + matrix[0][1] * in2 + matrix[0][2] * in3; + *out2 = matrix[1][0] * in1 + matrix[1][1] * in2 + matrix[1][2] * in3; + *out3 = matrix[2][0] * in1 + matrix[2][1] * in2 + matrix[2][2] * in3; +} + +void Colours_RGB2YUV(double r, double g, double b, double *y, double *u, double *v) +{ + MultiplyMatrix(r, g, b, y, u, v, RGB2YUV_matrix); +} + +void Colours_YUV2RGB(double y, double u, double v, double *r, double *g, double *b) +{ + MultiplyMatrix(y, u, v, r, g, b, YUV2RGB_matrix); +} + +static void UpdateModeDependentPointers(int tv_mode) +{ + /* Set pointers to the current setup and external palette. */ + if (tv_mode == Atari800_TV_NTSC) { + Colours_setup = &COLOURS_NTSC_setup; + Colours_external = &COLOURS_NTSC_external; + } + else if (tv_mode == Atari800_TV_PAL) { + Colours_setup = &COLOURS_PAL_setup; + Colours_external = &COLOURS_PAL_external; + } + else { + Atari800_ErrExit(); + Log_print("Interal error: Invalid Atari800_tv_mode\n"); + exit(1); + } +} + +void Colours_SetVideoSystem(int mode) +{ + UpdateModeDependentPointers(mode); + /* Apply changes */ + Colours_Update(); +} + +/* Copies the loaded external palette into current palette - without applying + adjustments. */ +static void CopyExternalWithoutAdjustments(void) +{ + int i; + unsigned char *ext_ptr; + for (i = 0, ext_ptr = Colours_external->palette; i < 256; i ++, ext_ptr += 3) + Colours_SetRGB(i, *ext_ptr, *(ext_ptr + 1), *(ext_ptr + 2), Colours_table); +} + +/* Updates contents of Colours_table. */ +static void UpdatePalette(void) +{ + if (Colours_external->loaded && !Colours_external->adjust) + CopyExternalWithoutAdjustments(); + else if (Atari800_tv_mode == Atari800_TV_NTSC) + COLOURS_NTSC_Update(Colours_table); + else /* PAL */ + COLOURS_PAL_Update(Colours_table); +} + +void Colours_Update(void) +{ + UpdatePalette(); +#if SUPPORTS_PLATFORM_PALETTEUPDATE + PLATFORM_PaletteUpdate(); +#endif +} + +void Colours_RestoreDefaults(void) +{ + Colours_SetPreset(COLOURS_PRESET_STANDARD); +} + +/* Sets the video calibration profile to the user preference */ +void Colours_SetPreset(Colours_preset_t preset) +{ + if (preset < COLOURS_PRESET_CUSTOM) { + *Colours_setup = presets[preset]; + if (Atari800_tv_mode == Atari800_TV_NTSC) + COLOURS_NTSC_RestoreDefaults(); + else + COLOURS_PAL_RestoreDefaults(); + } +} + +/* Compares the current settings to the available calibration profiles + and returns the matching profile -- or CUSTOM if no match is found */ +Colours_preset_t Colours_GetPreset(void) +{ + int i; + + if ((Atari800_tv_mode == Atari800_TV_NTSC && + COLOURS_NTSC_GetPreset() != COLOURS_PRESET_STANDARD) || + (Atari800_tv_mode == Atari800_TV_PAL && + COLOURS_PAL_GetPreset() != COLOURS_PRESET_STANDARD)) + return COLOURS_PRESET_CUSTOM; + + for (i = 0; i < COLOURS_PRESET_SIZE; i ++) { + if (Util_almostequal(Colours_setup->hue, presets[i].hue, 0.001) && + Util_almostequal(Colours_setup->saturation, presets[i].saturation, 0.001) && + Util_almostequal(Colours_setup->contrast, presets[i].contrast, 0.001) && + Util_almostequal(Colours_setup->brightness, presets[i].brightness, 0.001) && + Util_almostequal(Colours_setup->gamma, presets[i].gamma, 0.001) && + Colours_setup->black_level == presets[i].black_level && + Colours_setup->white_level == presets[i].white_level) + return i; + } + return COLOURS_PRESET_CUSTOM; +} + +int Colours_Save(const char *filename) +{ + FILE *fp; + int i; + + fp = fopen(filename, "wb"); + if (fp == NULL) { + return FALSE; + } + + /* Create a raw 768-byte file with RGB values. */ + for (i = 0; i < 256; i ++) { + char rgb[3]; + rgb[0] = Colours_GetR(i); + rgb[1] = Colours_GetG(i); + rgb[2] = Colours_GetB(i); + if (fwrite(rgb, sizeof(rgb), 1, fp) != 1) { + fclose(fp); + return FALSE; + } + } + + fclose(fp); + return TRUE; +} + +void Colours_PreInitialise(void) +{ + /* Copy the default setup for both NTSC and PAL. */ + COLOURS_NTSC_setup = COLOURS_PAL_setup = presets[COLOURS_PRESET_STANDARD]; + COLOURS_NTSC_RestoreDefaults(); + COLOURS_PAL_RestoreDefaults(); +} + +int Colours_ReadConfig(char *option, char *ptr) +{ + if (COLOURS_NTSC_ReadConfig(option, ptr)) { + } + else if (COLOURS_PAL_ReadConfig(option, ptr)) { + } + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void Colours_WriteConfig(FILE *fp) +{ + COLOURS_NTSC_WriteConfig(fp); + COLOURS_PAL_WriteConfig(fp); +} + +int Colours_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-saturation") == 0) { + if (i_a) + COLOURS_NTSC_setup.saturation = COLOURS_PAL_setup.saturation = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-contrast") == 0) { + if (i_a) + COLOURS_NTSC_setup.contrast = COLOURS_PAL_setup.contrast = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-brightness") == 0) { + if (i_a) + COLOURS_NTSC_setup.brightness = COLOURS_PAL_setup.brightness = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-gamma") == 0) { + if (i_a) + COLOURS_NTSC_setup.gamma = COLOURS_PAL_setup.gamma = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-tint") == 0) { + if (i_a) + COLOURS_NTSC_setup.hue = COLOURS_PAL_setup.hue = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-colors-preset") == 0) { + if (i_a) { + int idx = CFG_MatchTextParameter(argv[++i], preset_cfg_strings, COLOURS_PRESET_SIZE); + if (idx < 0) { + Log_print("Invalid value for -colors-preset"); + return FALSE; + } + COLOURS_NTSC_setup = COLOURS_PAL_setup = presets[idx]; + COLOURS_NTSC_RestoreDefaults(); + COLOURS_PAL_RestoreDefaults(); + } else a_m = TRUE; + } + + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-colors-preset standard|deep-black|vibrant"); + Log_print("\t Use one of predefined color adjustments"); + Log_print("\t-saturation Set color saturation"); + Log_print("\t-contrast Set contrast"); + Log_print("\t-brightness Set brightness"); + Log_print("\t-gamma Set color gamma factor"); + Log_print("\t-tint Set tint"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + if (!COLOURS_NTSC_Initialise(argc, argv) || + !COLOURS_PAL_Initialise(argc, argv)) + return FALSE; + + /* Assume that Atari800_tv_mode has been already initialised. */ + UpdateModeDependentPointers(Atari800_tv_mode); + UpdatePalette(); + return TRUE; +} diff --git a/PVAtari800/atari800-src/colours.h b/PVAtari800/atari800-src/colours.h new file mode 100644 index 0000000000..3344b29e00 --- /dev/null +++ b/PVAtari800/atari800-src/colours.h @@ -0,0 +1,99 @@ +#ifndef COLOURS_H_ +#define COLOURS_H_ + +#include "colours_external.h" + +extern int Colours_table[256]; + +typedef enum { + COLOURS_PRESET_STANDARD, + COLOURS_PRESET_DEEPBLACK, + COLOURS_PRESET_VIBRANT, + COLOURS_PRESET_CUSTOM, + /* Number of "normal" (not including CUSTOM) values in enumerator */ + COLOURS_PRESET_SIZE = COLOURS_PRESET_CUSTOM +} Colours_preset_t; + +/* Contains controls for palette adjustment. These controls are available for + NTSC and PAL palettes. */ +typedef struct Colours_setup_t { + double hue; /* TV tint control */ + double saturation; + double contrast; + double brightness; + double gamma; + /* Delay between phases of two consecutive chromas, in degrees. + Corresponds to the color adjustment potentiometer on the bottom of + Atari computers. */ + double color_delay; + int black_level; /* 0..255. ITU-R Recommendation BT.601 advises it to be 16. */ + int white_level; /* 0..255. ITU-R Recommendation BT.601 advises it to be 235. */ +} Colours_setup_t; + +/* Limits for the adjustable values. */ +#define COLOURS_HUE_MIN -1.0 +#define COLOURS_HUE_MAX 1.0 +#define COLOURS_SATURATION_MIN -1.0 +#define COLOURS_SATURATION_MAX 1.0 +#define COLOURS_CONTRAST_MIN -2.0 +#define COLOURS_CONTRAST_MAX 2.0 +#define COLOURS_BRIGHTNESS_MIN -2.0 +#define COLOURS_BRIGHTNESS_MAX 2.0 +#define COLOURS_GAMMA_MIN -1.0 +#define COLOURS_GAMMA_MAX 1.0 +#define COLOURS_DELAY_MIN 10 +#define COLOURS_DELAY_MAX 50 + +/* Pointer to the current palette setup. Depending on the current TV system, + it points to the NTSC setup, or the PAL setup. (See COLOURS_NTSC_setup and + COLOURS_PAL_setup.) */ +extern Colours_setup_t *Colours_setup; + +#define Colours_GetR(x) ((UBYTE) (Colours_table[x] >> 16)) +#define Colours_GetG(x) ((UBYTE) (Colours_table[x] >> 8)) +#define Colours_GetB(x) ((UBYTE) Colours_table[x]) +/* Packs R, G, B into palette COLORTABLE_PTR for colour number I. */ +void Colours_SetRGB(int i, int r, int g, int b, int *colortable_ptr); + +/* Called when the TV system changes, it updates the current palette + accordingly. */ +void Colours_SetVideoSystem(int mode); + +/* Updates the current palette - should be called after changing palette setup + or loading/unloading an external palette. */ +void Colours_Update(void); +/* Restores default setup for the current palette (NTSC or PAL one). + Colours_Update should be called afterwards to apply changes. */ +void Colours_RestoreDefaults(void); +/* Save the current colours, including adjustments, to a palette file. + Returns TRUE on success or FALSE on error. */ +int Colours_Save(const char *filename); + +/* Pointer to an externally-loaded palette. Depending on the current TV + system, it points to the external NTSC or PAL palette - they can be loaded + independently. (See COLOURS_NTSC_external and COLOURS_PAL_external.) */ +extern COLOURS_EXTERNAL_t *Colours_external; + +/* Initialise variables before loading from config file. */ +void Colours_PreInitialise(void); + +/* Read/write to configuration file. */ +int Colours_ReadConfig(char *option, char *ptr); +void Colours_WriteConfig(FILE *fp); + +/* Colours initialisation and processing of command-line arguments. */ +int Colours_Initialise(int *argc, char *argv[]); + +/* Functions for setting and getting the color preset. PRESET cannot equal + COLOURS_PRESET_CUSTOM. */ +void Colours_SetPreset(Colours_preset_t preset); +Colours_preset_t Colours_GetPreset(void); + +/* Convert given R, G and B values to corresponding Y, U, V values (all in the + 0.0 - 1.0 range). */ +void Colours_RGB2YUV(double r, double g, double b, double *y, double *u, double *v); +/* Convert given Y, U and V values to corresponding R, G, B values (all in the + 0.0 - 1.0 range). */ +void Colours_YUV2RGB(double y, double u, double v, double *r, double *g, double *b); + +#endif /* COLOURS_H_ */ diff --git a/PVAtari800/atari800-src/colours_external.c b/PVAtari800/atari800-src/colours_external.c new file mode 100644 index 0000000000..05510d99b0 --- /dev/null +++ b/PVAtari800/atari800-src/colours_external.c @@ -0,0 +1,65 @@ +/* + * colours_external.c - Loading external colour palettes + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2009 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include + +#include "atari.h" /* for TRUE/FALSE */ +#include "colours_external.h" +#include "util.h" + +int COLOURS_EXTERNAL_Read(COLOURS_EXTERNAL_t *colours) +{ + FILE *fp; + int i; + unsigned char *pal_ptr; + + fp = fopen(colours->filename, "rb"); + if (fp == NULL) { + colours->loaded = FALSE; + return FALSE; + } + for (i = 0, pal_ptr = colours->palette; i < 768; i++) { + int c = fgetc(fp); + if (c == EOF) { + fclose(fp); + colours->loaded = FALSE; + return FALSE; + } + *pal_ptr++ = c; + } + fclose(fp); + colours->loaded = TRUE; + return TRUE; +} + +void COLOURS_EXTERNAL_Remove(COLOURS_EXTERNAL_t *colours) +{ + colours->loaded = FALSE; +} + +int COLOURS_EXTERNAL_ReadFilename(COLOURS_EXTERNAL_t *colours, char *filename) +{ + Util_strlcpy(colours->filename, filename, FILENAME_MAX); + return COLOURS_EXTERNAL_Read(colours); +} diff --git a/PVAtari800/atari800-src/colours_external.h b/PVAtari800/atari800-src/colours_external.h new file mode 100644 index 0000000000..a420e12faf --- /dev/null +++ b/PVAtari800/atari800-src/colours_external.h @@ -0,0 +1,24 @@ +#ifndef COLOURS_EXTERNAL_H_ +#define COLOURS_EXTERNAL_H_ + +#include /* for FILENAME_MAX */ + +/* Contains an externally-loaded palette and its configuration */ +typedef struct COLOURS_EXTERNAL_t { + char filename[FILENAME_MAX]; /* Name of the palette file */ + int loaded; /* Ext. palette can be turned on/off by user */ + int adjust; /* Should the brightness/contrast/etc. be applied also to ext. palette? */ + unsigned char palette[768]; /* Raw RGB data for 256 colours */ +} COLOURS_EXTERNAL_t; + +/* Read a palette COLOURS from file; mark is as loaded. Return TRUE on + success or FALSE on error. */ +int COLOURS_EXTERNAL_Read(COLOURS_EXTERNAL_t *colours); +/* Unload external palette COLOURS. Old file name is not erased, so the + same palette may be later re-loaded conveniently. */ +void COLOURS_EXTERNAL_Remove(COLOURS_EXTERNAL_t *colours); +/* Read external palette COLOURS, from file named FILENAME. Same as + COLOURS_EXTERNAL_READ, but with file name overridden by parameter. */ +int COLOURS_EXTERNAL_ReadFilename(COLOURS_EXTERNAL_t *colours, char *filename); + +#endif /* COLOURS_EXTERNAL_H_ */ diff --git a/PVAtari800/atari800-src/colours_ntsc.c b/PVAtari800/atari800-src/colours_ntsc.c new file mode 100644 index 0000000000..b3be06db9d --- /dev/null +++ b/PVAtari800/atari800-src/colours_ntsc.c @@ -0,0 +1,325 @@ +/* + * colours_ntsc.c - Atari NTSC colour palette generation and adjustment + * + * Copyright (C) 2009-2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include + +#include "colours_ntsc.h" + +#include "config.h" + +#include "atari.h" /* for TRUE/FALSE */ +#include "colours.h" +#include "log.h" +#include "util.h" + +Colours_setup_t COLOURS_NTSC_setup; + +/* NTSC-specific default setup. */ +static struct { + double color_delay; +} const default_setup = { + 26.8, /* color delay, chosen to match color names given in GTIA.PDF */ +}; + +COLOURS_EXTERNAL_t COLOURS_NTSC_external = { "", FALSE, FALSE }; + +/* NTSC colorburst angle in YIQ colorspace. Colorburst is at + * 180 degrees in YUV - that is, a gold color. In YIQ, gold is at + * different angle. However, YIQ is actually YUV turned + * 33 degrees. So by looking at screenshots at Wikipedia we can + * conclude that the colorburst angle is 180+33 in YIQ. + * (See http://en.wikipedia.org/wiki/YUV and + * http://en.wikipedia.org/wiki/YIQ) */ +static const double colorburst_angle = (213.0f) * M_PI / 180.0f; + +/* In COLOURS_NTSC colours are generated in 2 stages: + 1. Generate Y, I and Q values for all 256 colours and store in an + intermediate yiq_table; + 2. Convert YIQ to RGB. + Splitting the process to 2 stages is necessary to allow the NTSC_FILTER + module to use the same palette generation routines. Without such + requirement, NTSC palette generation would be performed in one stage, + similarly to the COLOURS_PAL module. */ + +/* Creates YIQ_TABLE from external palette. START_ANGLE and START_SATURATIION + are provided as parameters, because NTSC_FILTER needs to set these values + according to its internal setup (burst_phase etc.). + External palette is not adjusted if COLOURS_NTSC_external.adjust is false. */ +static void UpdateYIQTableFromExternal(double yiq_table[768], double start_angle, const double start_saturation) +{ + const double gamma = 1 - COLOURS_NTSC_setup.gamma / 2.0; + unsigned char *ext_ptr = COLOURS_NTSC_external.palette; + int n; + + start_angle = - colorburst_angle - start_angle; + + for (n = 0; n < 256; n ++) { + /* Convert RGB values from external palette to YIQ. */ + double r = (double)*ext_ptr++ / 255.0; + double g = (double)*ext_ptr++ / 255.0; + double b = (double)*ext_ptr++ / 255.0; + double y = 0.299 * r + 0.587 * g + 0.114 * b; + double i = 0.595716 * r - 0.274453 * g - 0.321263 * b; + double q = 0.211456 * r - 0.522591 * g + 0.311135 * b; + double s = sin(start_angle); + double c = cos(start_angle); + double tmp_i = i; + i = tmp_i * c - q * s; + q = tmp_i * s + q * c; + /* Optionally adjust external palette. */ + if (COLOURS_NTSC_external.adjust) { + y = pow(y, gamma); + y *= COLOURS_NTSC_setup.contrast * 0.5 + 1; + y += COLOURS_NTSC_setup.brightness * 0.5; + if (y > 1.0) + y = 1.0; + else if (y < 0.0) + y = 0.0; + i *= start_saturation + 1; + q *= start_saturation + 1; + } + + *yiq_table++ = y; + *yiq_table++ = i; + *yiq_table++ = q; + } +} + +/* Generates NTSC palette into YIQ_TABLE. START_ANGLE and START_SATURATIION + are provided as parameters, because NTSC_FILTER needs to set these values + according to its internal setup (burst_phase etc.) */ +static void UpdateYIQTableFromGenerated(double yiq_table[768], const double start_angle, const double start_saturation) +{ + /* Difference between two consecutive chrominances, in radians. */ + double color_diff = COLOURS_NTSC_setup.color_delay * M_PI / 180.0; + + int cr, lm; + + double scaled_black_level = (double)COLOURS_NTSC_setup.black_level / 255.0; + double scaled_white_level = (double)COLOURS_NTSC_setup.white_level / 255.0; + const double gamma = 1 - COLOURS_NTSC_setup.gamma / 2.0; + + /* NTSC luma multipliers from CGIA.PDF */ + double luma_mult[16]={ + 0.6941, 0.7091, 0.7241, 0.7401, + 0.7560, 0.7741, 0.7931, 0.8121, + 0.8260, 0.8470, 0.8700, 0.8930, + 0.9160, 0.9420, 0.9690, 1.0000}; + + for (cr = 0; cr < 16; cr ++) { + double angle = start_angle - (cr - 1) * color_diff; + double saturation = (cr ? (start_saturation + 1) * 0.175f: 0.0); + double i = sin(angle) * saturation; + double q = cos(angle) * saturation; + + for (lm = 0; lm < 16; lm ++) { + /* calculate yiq for color entry */ + double y = (luma_mult[lm] - luma_mult[0]) / (luma_mult[15] - luma_mult[0]); + y = pow(y, gamma); + y *= COLOURS_NTSC_setup.contrast * 0.5 + 1; + y += COLOURS_NTSC_setup.brightness * 0.5; + /* Scale the Y signal's range from 0..1 to + * scaled_black_level..scaled_white_level */ + y = y * (scaled_white_level - scaled_black_level) + scaled_black_level; + /* + if (y < scaled_black_level) + y = scaled_black_level; + else if (y > scaled_white_level) + y = scaled_white_level; + */ + *yiq_table++ = y; + *yiq_table++ = i; + *yiq_table++ = q; + } + } +} + +/* Fills YIQ_TABLE with palette. Depending on the current setup, it is + computed from an internally-generated or external palette. */ +static void UpdateYIQTable(double yiq_table[768], double start_angle, const double start_saturation) +{ + if (COLOURS_NTSC_external.loaded) + UpdateYIQTableFromExternal(yiq_table, start_angle, start_saturation); + else + UpdateYIQTableFromGenerated(yiq_table, start_angle, start_saturation); +} + +void COLOURS_NTSC_GetYIQ(double yiq_table[768], const double start_angle) +{ + /* Set the generated palette's saturation to 0.0, because NTSC_FILTER + applies the saturation setting internally. */ + UpdateYIQTable(yiq_table, start_angle, 0.0); +} + +/* Converts YIQ values from YIQ_TABLE to RGB values. Stores them in + COLOURTABLE. */ +static void YIQ2RGB(int colourtable[256], const double yiq_table[768]) +{ + const double *yiq_ptr = yiq_table; + int n; + for (n = 0; n < 256; n ++) { + double y = *yiq_ptr++; + double i = *yiq_ptr++; + double q = *yiq_ptr++; + double r, g, b; + r = y + 0.9563 * i + 0.6210 * q; + g = y - 0.2721 * i - 0.6474 * q; + b = y - 1.1070 * i + 1.7046 * q; + Colours_SetRGB(n, (int) (r * 255), (int) (g * 255), (int) (b * 255), colourtable); + } +} + +void COLOURS_NTSC_Update(int colourtable[256]) +{ + double yiq_table[768]; + UpdateYIQTable(yiq_table, - colorburst_angle + COLOURS_NTSC_setup.hue * M_PI, COLOURS_NTSC_setup.saturation); + YIQ2RGB(colourtable, yiq_table); +} + +void COLOURS_NTSC_RestoreDefaults(void) +{ + COLOURS_NTSC_setup.color_delay = default_setup.color_delay; +} + +Colours_preset_t COLOURS_NTSC_GetPreset() +{ + if (Util_almostequal(COLOURS_NTSC_setup.color_delay, default_setup.color_delay, 0.001)) + return COLOURS_PRESET_STANDARD; + return COLOURS_PRESET_CUSTOM; +} + +int COLOURS_NTSC_ReadConfig(char *option, char *ptr) +{ + if (strcmp(option, "COLOURS_NTSC_SATURATION") == 0) + return Util_sscandouble(ptr, &COLOURS_NTSC_setup.saturation); + else if (strcmp(option, "COLOURS_NTSC_CONTRAST") == 0) + return Util_sscandouble(ptr, &COLOURS_NTSC_setup.contrast); + else if (strcmp(option, "COLOURS_NTSC_BRIGHTNESS") == 0) + return Util_sscandouble(ptr, &COLOURS_NTSC_setup.brightness); + else if (strcmp(option, "COLOURS_NTSC_GAMMA") == 0) + return Util_sscandouble(ptr, &COLOURS_NTSC_setup.gamma); + else if (strcmp(option, "COLOURS_NTSC_HUE") == 0) + return Util_sscandouble(ptr, &COLOURS_NTSC_setup.hue); + else if (strcmp(option, "COLOURS_NTSC_GTIA_DELAY") == 0) + return Util_sscandouble(ptr, &COLOURS_NTSC_setup.color_delay); + else if (strcmp(option, "COLOURS_NTSC_EXTERNAL_PALETTE") == 0) + Util_strlcpy(COLOURS_NTSC_external.filename, ptr, sizeof(COLOURS_NTSC_external.filename)); + else if (strcmp(option, "COLOURS_NTSC_EXTERNAL_PALETTE_LOADED") == 0) + /* Use the "loaded" flag to indicate that the palette must be loaded later. */ + return (COLOURS_NTSC_external.loaded = Util_sscanbool(ptr)) != -1; + else if (strcmp(option, "COLOURS_NTSC_ADJUST_EXTERNAL_PALETTE") == 0) + return (COLOURS_NTSC_external.adjust = Util_sscanbool(ptr)) != -1; + else + return FALSE; + return TRUE; +} + +void COLOURS_NTSC_WriteConfig(FILE *fp) +{ + fprintf(fp, "COLOURS_NTSC_SATURATION=%g\n", COLOURS_NTSC_setup.saturation); + fprintf(fp, "COLOURS_NTSC_CONTRAST=%g\n", COLOURS_NTSC_setup.contrast); + fprintf(fp, "COLOURS_NTSC_BRIGHTNESS=%g\n", COLOURS_NTSC_setup.brightness); + fprintf(fp, "COLOURS_NTSC_GAMMA=%g\n", COLOURS_NTSC_setup.gamma); + fprintf(fp, "COLOURS_NTSC_HUE=%g\n", COLOURS_NTSC_setup.hue); + fprintf(fp, "COLOURS_NTSC_GTIA_DELAY=%g\n", COLOURS_NTSC_setup.color_delay); + fprintf(fp, "COLOURS_NTSC_EXTERNAL_PALETTE=%s\n", COLOURS_NTSC_external.filename); + fprintf(fp, "COLOURS_NTSC_EXTERNAL_PALETTE_LOADED=%d\n", COLOURS_NTSC_external.loaded); + fprintf(fp, "COLOURS_NTSC_ADJUST_EXTERNAL_PALETTE=%d\n", COLOURS_NTSC_external.adjust); +} + +int COLOURS_NTSC_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-ntsc-saturation") == 0) { + if (i_a) + COLOURS_NTSC_setup.saturation = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-contrast") == 0) { + if (i_a) + COLOURS_NTSC_setup.contrast = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-brightness") == 0) { + if (i_a) + COLOURS_NTSC_setup.brightness = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-gamma") == 0) { + if (i_a) + COLOURS_NTSC_setup.gamma = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-tint") == 0) { + if (i_a) + COLOURS_NTSC_setup.hue = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-colordelay") == 0) { + if (i_a) + COLOURS_NTSC_setup.color_delay = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-paletten") == 0) { + if (i_a) { + Util_strlcpy(COLOURS_NTSC_external.filename, argv[++i], sizeof(COLOURS_NTSC_external.filename)); + /* Use the "loaded" flag to indicate that the palette must be loaded later. */ + COLOURS_NTSC_external.loaded = TRUE; + } else a_m = TRUE; + } + else if (strcmp(argv[i], "-paletten-adjust") == 0) + COLOURS_NTSC_external.adjust = TRUE; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-ntsc-saturation Set NTSC color saturation"); + Log_print("\t-ntsc-contrast Set NTSC contrast"); + Log_print("\t-ntsc-brightness Set NTSC brightness"); + Log_print("\t-ntsc-gamma Set NTSC color gamma factor"); + Log_print("\t-ntsc-tint Set NTSC tint"); + Log_print("\t-ntsc-colordelay Set NTSC GTIA color delay"); + Log_print("\t-paletten Load NTSC external palette"); + Log_print("\t-paletten-adjust Apply adjustments to NTSC external palette"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + /* Try loading an external palette if needed. */ + if (COLOURS_NTSC_external.loaded && !COLOURS_EXTERNAL_Read(&COLOURS_NTSC_external)) + Log_print("Cannot read NTSC palette from %s", COLOURS_NTSC_external.filename); + + return TRUE; +} diff --git a/PVAtari800/atari800-src/colours_ntsc.h b/PVAtari800/atari800-src/colours_ntsc.h new file mode 100644 index 0000000000..e950706d55 --- /dev/null +++ b/PVAtari800/atari800-src/colours_ntsc.h @@ -0,0 +1,39 @@ +#ifndef COLOURS_NTSC_H_ +#define COLOURS_NTSC_H_ + +#include "config.h" +#include "colours.h" +#include "colours_external.h" + +#ifndef M_PI +# define M_PI 3.141592653589793 +#endif + +/* NTSC palette's current setup - generic controls. */ +extern Colours_setup_t COLOURS_NTSC_setup; +/* External NTSC palette. */ +extern COLOURS_EXTERNAL_t COLOURS_NTSC_external; + +/* Updates the NTSC palette - should be called after changing palette setup + or loading/unloading an external palette. */ +void COLOURS_NTSC_Update(int colourtable[256]); +/* Restores default values for NTSC-specific colour controls. + Colours_NTSC_Update should be called afterwards to apply changes. */ +void COLOURS_NTSC_RestoreDefaults(void); + +/* Writes the NTSC palette (internal or external) as YIQ triplets in + YIQ_TABLE. START_ANGLE defines the phase shift of chroma #1. This function + is to be used exclusively by the NTSC Filter module. */ +void COLOURS_NTSC_GetYIQ(double yiq_table[768], const double start_angle); + +/* Read/write to configuration file. */ +int COLOURS_NTSC_ReadConfig(char *option, char *ptr); +void COLOURS_NTSC_WriteConfig(FILE *fp); + +/* NTSC Colours initialisation and processing of command-line arguments. */ +int COLOURS_NTSC_Initialise(int *argc, char *argv[]); + +/* Function for getting the NTSC-specific color preset. */ +Colours_preset_t COLOURS_NTSC_GetPreset(void); + +#endif /* COLOURS_NTSC_H_ */ diff --git a/PVAtari800/atari800-src/colours_pal.c b/PVAtari800/atari800-src/colours_pal.c new file mode 100644 index 0000000000..b0d0a1eeed --- /dev/null +++ b/PVAtari800/atari800-src/colours_pal.c @@ -0,0 +1,496 @@ +/* + * colours_pal.c - Atari PAL colour palette generation and adjustment + * + * Copyright (C) 2009-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include + +#include "colours_pal.h" + +#include "atari.h" /* for TRUE/FALSE */ +#include "colours.h" +#include "log.h" +#include "util.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +Colours_setup_t COLOURS_PAL_setup; + +/* PAL-specific default setup. */ +static struct { + double color_delay; +} const default_setup = { + 23.2, /* chosen by eye to give a smooth rainbow */ +}; + +COLOURS_EXTERNAL_t COLOURS_PAL_external = { "", FALSE, FALSE }; + +/* Fills YUV_TABLE from external palette. External palette is not adjusted if + COLOURS_PAL_external.adjust is false. */ +static void GetYUVFromExternal(double yuv_table[256*5]) +{ + double const gamma = 1 - COLOURS_PAL_setup.gamma / 2.0; + unsigned char *ext_ptr = COLOURS_PAL_external.palette; + int n; + + double const hue = COLOURS_PAL_setup.hue * M_PI; + double const s = sin(hue); + double const c = cos(hue); + + for (n = 0; n < 256; n ++) { + /* Convert RGB values from external palette to YUV. */ + double r = (double)*ext_ptr++ / 255.0; + double g = (double)*ext_ptr++ / 255.0; + double b = (double)*ext_ptr++ / 255.0; + double y, u, v, tmp_u; + Colours_RGB2YUV(r, g, b, &y, &u, &v); + tmp_u = u; + u = tmp_u * c - v * s; + v = tmp_u * s + v * c; + /* Optionally adjust external palette. */ + if (COLOURS_PAL_external.adjust) { + y = pow(y, gamma); + y *= COLOURS_PAL_setup.contrast * 0.5 + 1; + y += COLOURS_PAL_setup.brightness * 0.5; + if (y > 1.0) + y = 1.0; + else if (y < 0.0) + y = 0.0; + u *= COLOURS_PAL_setup.saturation + 1.0; + v *= COLOURS_PAL_setup.saturation + 1.0; + } + + *yuv_table++ = y; + /* Cannot retrieve different U/V values for even and odd lines from an + external palette - instead write each value twice. */ + *yuv_table++ = u; + *yuv_table++ = u; + *yuv_table++ = v; + *yuv_table++ = v; + } +} + +/* Below are conclusions from analysis of oscillograms of PAL GTIA output. + The oscillograms are available at: + http://www.atari.org.pl/forum/viewtopic.php?pid=164037#p164037 + + Like the NTSC GTIA, the PAL GTIA produces color signal by delaying + (phase-shifting) a base chrominance subcarrier by a specified time - + different for each displayed hue. The subcarrier's frequency is + 4433618.75 Hz (4.43 MHz in short). The subcarrier is provided at the chip's + PAL pin; output signal is produced at the COL pin. + + As in NTSC, the delay introduced by the PAL GTIA can be adjusted to a + certain extent by changing voltage applied at the DEL pin. + + This is where the similarities between the PAL GTIA and its NTSC + counterpart end. + + In NTSC, each screen line contains, in its back porch, a burst of about 10 + cycles of color subcarrier (known as the coloburst). The colorburst is used + by the TV as a reference for decoding colors in each line. Signal with + phase shift equal to the colorburst's (ie. equal to the subcarrier's) is + decoded as 180 deg angle in the YUV colorspace (-U). Delaying the signal is + interpreted as rotating the angle clockwise in YUV. + + In PAL, there's also colorburst, but it is not equal to the color + subcarrier. In even lines it lags the subcarrier by 45 deg, and in odd + lines it leads it subcarrier by 45 deg. The resulting 90 deg difference is + used by the TV to distinguish even and odd lines. The original subcarrier + is recreated by the receiver by summing colorbursts from two consecutive + lines (and adjusting its amplitude, since sum of two sine waves shifted by + 90 deg has higher amplitude than the original waves). + + Then, as in NTSC, signals equal in phase to the (recreated) subcarrier are + decoded as 180 deg angle in YUV. But other signals are decoded differently + in even and in odd lines. In even lines (or "NTSC lines"), delaying the + signal is interpreted as rotating the angle clockwise in YUV, just like in + NTSC. But in odd lines (or "PAL lines"), delaying the signal is akin to + rotating the angle counter-clockwise. So, to achieve the same color in even + and odd lines, the transmitter must send signal delayed wrt. the subcarrier + in even lines but "rushed" (anti-delayed?) in odd lines. + + PAL GTIA can only delay input signal; it can't "rush" it, it would involve + creating output before input has arrived. So the requirements of the PAL + system are achieved in the chip by delaying the signal differently in even + and odd lines. + + Measurements indicate that the PAL GTIA delays the input subcarrier by + 95.2ns; then it might delay it by further 100.7ns if needed; and finally + can delay it further by X, 2*X, 3*X, ..., 7*X, where X is a delay adjusted + by voltage at the DEL pin. The general formula is: + DELAY(hue) = 95.2ns + ADD(hue)*100.7ns + MULT(hue)*X + where + ADD(hue) depends on a given hue and can be 0 or 1, + MULT(hue) depends on a given hue and can be 0, 1, 2, ..., 7, + X depends on voltage at the DEL pin. + So, the chip can shift the input signal by 8*2=16 different delays. + + Mapping of ADD and MULT values to specific hues is random - it is + implemented in the source code as the del_coeffs structure. + + The relation between DEL pin voltage and the resulting delay is not linear + - it was measured to be: + 17.37ns at 5V, + 10.60ns at 7V, + 7.44ns at 9V. + + The PAL GTIA apparently contains a series of 7 delay elements similarly to + the NTSC version (which contains 15 of them), and an additional 100.7ns + delay element. (When looking at the oscillograms, for each hue that passes + through this 100.7ns delay, the resulting waveform is different than for + hues that don't involve the delay - it looks like it was inverted + vertically. This gives a hint about how the delay is implemented + internally.) + + The end result is, PAL GTIA actually produces more than 256 colors. It + produces different hues in odd and even lines, but it is not normally + visible since PAL TVs average hues on each two consecutive lines - but + it can be made visible with specially-crafted screens. Currently this + feature of the chip is not implemented - only 256 colors are produced, + each one being an average of "even" and "odd" hues. + + In PAL GTIA, just as in NTSC, the colorburst signals have the same phase as + Hue 1. But by changing voltage at the DEL pin, we also change the relative + phase shift of the colorburst between even and odd lines - it is not always + 90 degrees. It has the following consequences - all of them observed on a + real machine, and all currently emulated: + 1. Changing phase shift between odd and even colorbursts also changes + amplitude of the resulting subcarrier, which is recreated by summing the + two colorbursts. Since amplitude of the color subcarrier is used as a + reference for decoding color saturation, changing voltage at DEL not only + changes hues of displayed colors; it also changes their saturation. + 2. With appropriately chosen DEL voltage, phase shift between even and odd + colorbursts can reach 180 deg. At this point the PAL TV can no longer + distinguish even and odd lines, and stops interpreting color signal, + displaying screen as black-and-white with visible chroma dots. + 3. Changing DEL voltage further causes phase shift between even and odd + colorbursts to to be larger than 180 deg, at which point the TV starts + interpreting color signal "backwards", as if the color subcarrier suddenly + shifted by 180 deg. +*/ + +/* Generates PAL palette into YUV_TABLE. */ +static void GetYUVFromGenerated(double yuv_table[256*5]) +{ + struct del_coeff { + int add; + int mult; + }; + + /* Delay coefficients for each hue. */ + static struct { + struct del_coeff even[15]; + struct del_coeff odd[15]; + } const del_coeffs = { + { { 1, 5 }, /* Hue $1 in even lines */ + { 1, 6 }, /* Hue $2 in even lines */ + { 1, 7 }, + { 0, 0 }, + { 0, 1 }, + { 0, 2 }, + { 0, 4 }, + { 0, 5 }, + { 0, 6 }, + { 0, 7 }, + { 1, 1 }, + { 1, 2 }, + { 1, 3 }, + { 1, 4 }, + { 1, 5 } /* Hue $F in even lines */ + }, + { { 1, 1 }, /* Hue $1 in odd lines */ + { 1, 0 }, /* Hue $2 in odd lines */ + { 0, 7 }, + { 0, 6 }, + { 0, 5 }, + { 0, 4 }, + { 0, 2 }, + { 0, 1 }, + { 0, 0 }, + { 1, 7 }, + { 1, 5 }, + { 1, 4 }, + { 1, 3 }, + { 1, 2 }, + { 1, 1 } /* Hue $F in odd lines */ + } + }; + int cr, lm; + + double const scaled_black_level = (double)COLOURS_PAL_setup.black_level / 255.0f; + double const scaled_white_level = (double)COLOURS_PAL_setup.white_level / 255.0f; + double const gamma = 1 - COLOURS_PAL_setup.gamma / 2.0; + + /* NTSC luma multipliers from CGIA.PDF */ + static double const luma_mult[16] = { + 0.6941, 0.7091, 0.7241, 0.7401, + 0.7560, 0.7741, 0.7931, 0.8121, + 0.8260, 0.8470, 0.8700, 0.8930, + 0.9160, 0.9420, 0.9690, 1.0000}; + + /* When phase shift between even and odd colorbursts is close to 180 deg, the + TV stops interpreting color signal. This value determines how close to 180 + deg that phase shift must be. It is specific to a TV set. */ + static double const color_disable_threshold = 0.05; + /* Base delay - 1/4.43MHz * base_del = ca. 95.2ns */ + static double const base_del = 0.421894970414201; + /* Additional delay - 1/4.43MHz * add_del = ca. 100.7ns */ + static double const add_del = 0.446563064859117; + /* Delay introduced by the DEL pin voltage. */ + double const del_adj = COLOURS_PAL_setup.color_delay / 360.0; + + /* Phase delays of colorbursts in even and odd lines. They are equal to + Hue 1. */ + double const even_burst_del = base_del + add_del * del_coeffs.even[0].add + del_adj * del_coeffs.even[0].mult; + double const odd_burst_del = base_del + add_del * del_coeffs.odd[0].add + del_adj * del_coeffs.odd[0].mult; + + /* Reciprocal of the recreated subcarrier's amplitude. */ + double saturation_mult; + /* Phase delay of the recreated amplitude. */ + double subcarrier_del = (even_burst_del + odd_burst_del + COLOURS_PAL_setup.hue) / 2.0; + + /* Phase difference between colorbursts in even and odd lines. */ + double burst_diff = even_burst_del - odd_burst_del; + burst_diff -= floor(burst_diff); /* Normalize to 0..1. */ + + if (burst_diff > 0.5 - color_disable_threshold && burst_diff < 0.5 + color_disable_threshold) + /* Shift between colorbursts close to 180 deg. Don't produce color. */ + saturation_mult = 0.0; + else { + /* Subcarrier is a sum of two waves with equal frequency and amplitude, + but phase-shifted by 2pi*burst_diff. The formula is derived from + http://2000clicks.com/mathhelp/GeometryTrigEquivPhaseShift.aspx */ + double subcarrier_amplitude = sqrt(2.0 * cos(burst_diff*2.0*M_PI) + 2.0); + /* Normalise saturation_mult by multiplying by sqrt(2), so that it + equals 1.0 when odd & even colorbursts are shifted by 90 deg (ie. + burst_diff == 0.25). */ + saturation_mult = sqrt(2.0) / subcarrier_amplitude; + } + + for (cr = 0; cr < 16; cr ++) { + double even_u = 0.0; + double odd_u = 0.0; + double even_v = 0.0; + double odd_v = 0.0; + if (cr) { + struct del_coeff const *even_delay = &(del_coeffs.even[cr - 1]); + struct del_coeff const *odd_delay = &(del_coeffs.odd[cr - 1]); + double even_del = base_del + add_del * even_delay->add + del_adj * even_delay->mult; + double odd_del = base_del + add_del * odd_delay->add + del_adj * odd_delay->mult; + double even_angle = (0.5 - (even_del - subcarrier_del)) * 2.0 * M_PI; + double odd_angle = (0.5 + (odd_del - subcarrier_del)) * 2.0 * M_PI; + double saturation = (COLOURS_PAL_setup.saturation + 1) * 0.175 * saturation_mult; + even_u = cos(even_angle) * saturation; + even_v = sin(even_angle) * saturation; + odd_u = cos(odd_angle) * saturation; + odd_v = sin(odd_angle) * saturation; + } + for (lm = 0; lm < 16; lm ++) { + /* calculate yuv for color entry */ + double y = (luma_mult[lm] - luma_mult[0]) / (luma_mult[15] - luma_mult[0]); + y = pow(y, gamma); + y *= COLOURS_PAL_setup.contrast * 0.5 + 1; + y += COLOURS_PAL_setup.brightness * 0.5; + /* Scale the Y signal's range from 0..1 to + scaled_black_level..scaled_white_level */ + y = y * (scaled_white_level - scaled_black_level) + scaled_black_level; + /* + if (y < scaled_black_level) + y = scaled_black_level; + else if (y > scaled_white_level) + y = scaled_white_level; + */ + *yuv_table++ = y; + *yuv_table++ = even_u; + *yuv_table++ = odd_u; + *yuv_table++ = even_v; + *yuv_table++ = odd_v; + } + } +} + +void COLOURS_PAL_GetYUV(double yuv_table[256*5]) +{ + if (COLOURS_PAL_external.loaded) + GetYUVFromExternal(yuv_table); + else + GetYUVFromGenerated(yuv_table); +} + +/* Averages YUV values from YUV_TABLE and converts them to RGB values. Stores + them in COLOURTABLE. */ +static void YUV2RGB(int colourtable[256], double const yuv_table[256*5]) +{ + double const *yuv_ptr = yuv_table; + int n; + for (n = 0; n < 256; ++n) { + double y = *yuv_ptr++; + double even_u = *yuv_ptr++; + double odd_u = *yuv_ptr++; + double even_v = *yuv_ptr++; + double odd_v = *yuv_ptr++; + double r, g, b; + /* The different colors in odd and even lines are not + emulated - instead the palette contains averaged values. */ + double u = (even_u + odd_u) / 2.0; + double v = (even_v + odd_v) / 2.0; + Colours_YUV2RGB(y, u, v, &r, &g, &b); + Colours_SetRGB(n, (int) (r * 255), (int) (g * 255), (int) (b * 255), colourtable); + } +} + +void COLOURS_PAL_Update(int colourtable[256]) +{ + double yuv_table[256*5]; + COLOURS_PAL_GetYUV(yuv_table); + YUV2RGB(colourtable, yuv_table); +} + +void COLOURS_PAL_RestoreDefaults(void) +{ + COLOURS_PAL_setup.color_delay = default_setup.color_delay; +} + +Colours_preset_t COLOURS_PAL_GetPreset() +{ + if (Util_almostequal(COLOURS_PAL_setup.color_delay, default_setup.color_delay, 0.001)) + return COLOURS_PRESET_STANDARD; + return COLOURS_PRESET_CUSTOM; +} + +int COLOURS_PAL_ReadConfig(char *option, char *ptr) +{ + if (strcmp(option, "COLOURS_PAL_SATURATION") == 0) + return Util_sscandouble(ptr, &COLOURS_PAL_setup.saturation); + else if (strcmp(option, "COLOURS_PAL_CONTRAST") == 0) + return Util_sscandouble(ptr, &COLOURS_PAL_setup.contrast); + else if (strcmp(option, "COLOURS_PAL_BRIGHTNESS") == 0) + return Util_sscandouble(ptr, &COLOURS_PAL_setup.brightness); + else if (strcmp(option, "COLOURS_PAL_GAMMA") == 0) + return Util_sscandouble(ptr, &COLOURS_PAL_setup.gamma); + else if (strcmp(option, "COLOURS_PAL_HUE") == 0) + return Util_sscandouble(ptr, &COLOURS_PAL_setup.hue); + else if (strcmp(option, "COLOURS_PAL_GTIA_DELAY") == 0) + return Util_sscandouble(ptr, &COLOURS_PAL_setup.color_delay); + else if (strcmp(option, "COLOURS_PAL_EXTERNAL_PALETTE") == 0) + Util_strlcpy(COLOURS_PAL_external.filename, ptr, sizeof(COLOURS_PAL_external.filename)); + else if (strcmp(option, "COLOURS_PAL_EXTERNAL_PALETTE_LOADED") == 0) + /* Use the "loaded" flag to indicate that the palette must be loaded later. */ + return (COLOURS_PAL_external.loaded = Util_sscanbool(ptr)) != -1; + else if (strcmp(option, "COLOURS_PAL_ADJUST_EXTERNAL_PALETTE") == 0) + return (COLOURS_PAL_external.adjust = Util_sscanbool(ptr)) != -1; + else + return FALSE; + return TRUE; +} + +void COLOURS_PAL_WriteConfig(FILE *fp) +{ + fprintf(fp, "COLOURS_PAL_SATURATION=%g\n", COLOURS_PAL_setup.saturation); + fprintf(fp, "COLOURS_PAL_CONTRAST=%g\n", COLOURS_PAL_setup.contrast); + fprintf(fp, "COLOURS_PAL_BRIGHTNESS=%g\n", COLOURS_PAL_setup.brightness); + fprintf(fp, "COLOURS_PAL_GAMMA=%g\n", COLOURS_PAL_setup.gamma); + fprintf(fp, "COLOURS_PAL_HUE=%g\n", COLOURS_PAL_setup.hue); + fprintf(fp, "COLOURS_PAL_GTIA_DELAY=%g\n", COLOURS_PAL_setup.color_delay); + fprintf(fp, "COLOURS_PAL_EXTERNAL_PALETTE=%s\n", COLOURS_PAL_external.filename); + fprintf(fp, "COLOURS_PAL_EXTERNAL_PALETTE_LOADED=%d\n", COLOURS_PAL_external.loaded); + fprintf(fp, "COLOURS_PAL_ADJUST_EXTERNAL_PALETTE=%d\n", COLOURS_PAL_external.adjust); +} + +int COLOURS_PAL_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-pal-saturation") == 0) { + if (i_a) + COLOURS_PAL_setup.saturation = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-pal-contrast") == 0) { + if (i_a) + COLOURS_PAL_setup.contrast = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-pal-brightness") == 0) { + if (i_a) + COLOURS_PAL_setup.brightness = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-pal-gamma") == 0) { + if (i_a) + COLOURS_PAL_setup.gamma = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-pal-tint") == 0) { + if (i_a) + COLOURS_PAL_setup.hue = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-pal-colordelay") == 0) { + if (i_a) + COLOURS_PAL_setup.color_delay = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-palettep") == 0) { + if (i_a) { + Util_strlcpy(COLOURS_PAL_external.filename, argv[++i], sizeof(COLOURS_PAL_external.filename)); + /* Use the "loaded" flag to indicate that the palette must be loaded later. */ + COLOURS_PAL_external.loaded = TRUE; + } else a_m = TRUE; + } + else if (strcmp(argv[i], "-palettep-adjust") == 0) + COLOURS_PAL_external.adjust = TRUE; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-pal-saturation Set PAL color saturation"); + Log_print("\t-pal-contrast Set PAL contrast"); + Log_print("\t-pal-brightness Set PAL brightness"); + Log_print("\t-pal-gamma Set PAL color gamma factor"); + Log_print("\t-pal-tint Set PAL tint"); + Log_print("\t-pal-colordelay Set PAL GTIA color delay"); + Log_print("\t-palettep Load PAL external palette"); + Log_print("\t-palettep-adjust Apply adjustments to PAL external palette"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + /* Try loading an external palette if needed. */ + if (COLOURS_PAL_external.loaded && !COLOURS_EXTERNAL_Read(&COLOURS_PAL_external)) + Log_print("Cannot read PAL palette from %s", COLOURS_PAL_external.filename); + + return TRUE; +} diff --git a/PVAtari800/atari800-src/colours_pal.h b/PVAtari800/atari800-src/colours_pal.h new file mode 100644 index 0000000000..a22fa943f9 --- /dev/null +++ b/PVAtari800/atari800-src/colours_pal.h @@ -0,0 +1,34 @@ +#ifndef COLOURS_PAL_H_ +#define COLOURS_PAL_H_ + +#include "colours.h" +#include "colours_external.h" + +/* PAL palette's current setup. */ +extern Colours_setup_t COLOURS_PAL_setup; +/* External PAL palette. */ +extern COLOURS_EXTERNAL_t COLOURS_PAL_external; + +/* Updates the PAL palette - should be called after changing palette setup + or loading/unloading an external palette. */ +void COLOURS_PAL_Update(int colourtable[256]); + +/* Restores default values for PAL-specific colour controls. + Colours_PAL_Update should be called afterwards to apply changes. */ +void COLOURS_PAL_RestoreDefaults(void); + +/* Read/write to configuration file. */ +int COLOURS_PAL_ReadConfig(char *option, char *ptr); +void COLOURS_PAL_WriteConfig(FILE *fp); + +/* PAL Colours initialisation and processing of command-line arguments. */ +int COLOURS_PAL_Initialise(int *argc, char *argv[]); + +/* Function for getting the PAL-specific color preset. */ +Colours_preset_t COLOURS_PAL_GetPreset(void); + +/* Writes the PAL palette (generated or external) as {Y, even U, odd U, + even V, odd V} quintuples in YUV_TABLE. */ +void COLOURS_PAL_GetYUV(double yuv_table[256*5]); + +#endif /* COLOURS_PAL_H_ */ diff --git a/PVAtari800/atari800-src/compfile.c b/PVAtari800/atari800-src/compfile.c new file mode 100644 index 0000000000..597d37cfff --- /dev/null +++ b/PVAtari800/atari800-src/compfile.c @@ -0,0 +1,311 @@ +/* + * compfile.c - File I/O and ZLIB compression + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2006 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include +#include +#ifdef HAVE_LIBZ +#include +#endif + +#include "afile.h" +#include "atari.h" +#include "compfile.h" +#include "log.h" +#include "util.h" + +/* GZ decompression ------------------------------------------------------ */ + +/* Opens a GZIP compressed file and decompresses its contents to outfp. + Returns TRUE on success. */ +int CompFile_ExtractGZ(const char *infilename, FILE *outfp) +{ +#ifndef HAVE_LIBZ + Log_print("This executable cannot decompress ZLIB files"); + return FALSE; +#else + /* TODO: replace gz* with low-level light-weight ZLIB functions. */ + gzFile gzf = gzopen(infilename, "rb"); + void *buf; + int result; + if (gzf == NULL) { + Log_print("ZLIB could not open file %s", infilename); + return FALSE; + } +#define UNCOMPRESS_BUFFER_SIZE 32768 + buf = Util_malloc(UNCOMPRESS_BUFFER_SIZE); + do { + result = gzread(gzf, buf, UNCOMPRESS_BUFFER_SIZE); + if (result > 0) { + if ((int) fwrite(buf, 1, result, outfp) != result) + result = -1; + } + } while (result == UNCOMPRESS_BUFFER_SIZE); + free(buf); + gzclose(gzf); + return result >= 0; +#endif /* HAVE_LIBZ */ +} + + +/* DCM decompression ----------------------------------------------------- */ + +static int fgetw(FILE *fp) +{ + int low; + int high; + low = fgetc(fp); + if (low == EOF) + return -1; + high = fgetc(fp); + if (high == EOF) + return -1; + return low + (high << 8); +} + +static int fload(void *buf, int size, FILE *fp) +{ + return (int) fread(buf, 1, size, fp) == size; +} + +static int fsave(void *buf, int size, FILE *fp) +{ + return (int) fwrite(buf, 1, size, fp) == size; +} + +typedef struct { + FILE *fp; + int sectorcount; + int sectorsize; + int current_sector; +} ATR_Info; + +static int write_atr_header(const ATR_Info *pai) +{ + int sectorcount; + int sectorsize; + ULONG paras; + struct AFILE_ATR_Header header; + sectorcount = pai->sectorcount; + sectorsize = pai->sectorsize; + paras = (sectorsize != 256 || sectorcount <= 3) + ? (sectorcount << 3) /* single density or only boot sectors: sectorcount * 128 / 16 */ + : (sectorcount << 4) - 0x18; /* double density with 128-byte boot sectors: (sectorcount * 256 - 3 * 128) / 16 */ + memset(&header, 0, sizeof(header)); + header.magic1 = AFILE_ATR_MAGIC1; + header.magic2 = AFILE_ATR_MAGIC2; + header.secsizelo = (UBYTE) sectorsize; + header.secsizehi = (UBYTE) (sectorsize >> 8); + header.seccountlo = (UBYTE) paras; + header.seccounthi = (UBYTE) (paras >> 8); + header.hiseccountlo = (UBYTE) (paras >> 16); + header.hiseccounthi = (UBYTE) (paras >> 24); + return fsave(&header, sizeof(header), pai->fp); +} + +static int write_atr_sector(ATR_Info *pai, UBYTE *buf) +{ + return fsave(buf, pai->current_sector++ <= 3 ? 128 : pai->sectorsize, pai->fp); +} + +static int pad_till_sector(ATR_Info *pai, int till_sector) +{ + UBYTE zero_buf[256]; + memset(zero_buf, 0, sizeof(zero_buf)); + while (pai->current_sector < till_sector) + if (!write_atr_sector(pai, zero_buf)) + return FALSE; + return TRUE; +} + +static int dcm_pass(FILE *infp, ATR_Info *pai) +{ + UBYTE sector_buf[256]; + memset(sector_buf, 0, sizeof(sector_buf)); + for (;;) { + /* sector group */ + int sector_no; + int sector_type; + sector_no = fgetw(infp); + sector_type = fgetc(infp); + if (sector_type == 0x45) + return TRUE; + if (sector_no < pai->current_sector) { + Log_print("Error: current sector is %d, next sector group at %d", pai->current_sector, sector_no); + return FALSE; + } + if (!pad_till_sector(pai, sector_no)) + return FALSE; + for (;;) { + /* sector */ + int i; + switch (sector_type & 0x7f) { + case 0x41: + i = fgetc(infp); + if (i == EOF) + return FALSE; + do { + int b = fgetc(infp); + if (b == EOF) + return FALSE; + sector_buf[i] = (UBYTE) b; + } while (i-- != 0); + break; + case 0x42: + if (!fload(sector_buf + 123, 5, infp)) + return FALSE; + memset(sector_buf, sector_buf[123], 123); + break; + case 0x43: + i = 0; + do { + int j; + int c; + j = fgetc(infp); + if (j < i) { + if (j != 0) + return FALSE; + j = 256; + } + if (i < j && !fload(sector_buf + i, j - i, infp)) + return FALSE; + if (j >= pai->sectorsize) + break; + i = fgetc(infp); + if (i < j) { + if (i != 0) + return FALSE; + i = 256; + } + c = fgetc(infp); + if (c == EOF) + return FALSE; + memset(sector_buf + j, c, i - j); + } while (i < pai->sectorsize); + break; + case 0x44: + i = fgetc(infp); + if (i == EOF || i >= pai->sectorsize) + return FALSE; + if (!fload(sector_buf + i, pai->sectorsize - i, infp)) + return FALSE; + break; + case 0x46: + break; + case 0x47: + if (!fload(sector_buf, pai->sectorsize, infp)) + return FALSE; + break; + default: + Log_print("Unrecognized sector coding type 0x%02X", sector_type); + return FALSE; + } + if (!write_atr_sector(pai, sector_buf)) + return FALSE; + if (!(sector_type & 0x80)) + break; /* goto sector group */ + sector_type = fgetc(infp); + if (sector_type == 0x45) + return TRUE; + } + } +} + +int CompFile_DCMtoATR(FILE *infp, FILE *outfp) +{ + int archive_type; + int archive_flags; + ATR_Info ai; + int pass_flags; + int last_sector; + archive_type = fgetc(infp); + if (archive_type != 0xf9 && archive_type != 0xfa) { + Log_print("This is not a DCM image"); + return FALSE; + } + archive_flags = fgetc(infp); + if ((archive_flags & 0x1f) != 1) { + Log_print("Expected pass one first"); + if (archive_type == 0xf9) + Log_print("It seems that DCMs of a multi-file archive have been combined in wrong order"); + return FALSE; + } + ai.fp = outfp; + ai.current_sector = 1; + switch ((archive_flags >> 5) & 3) { + case 0: + ai.sectorcount = 720; + ai.sectorsize = 128; + break; + case 1: + ai.sectorcount = 720; + ai.sectorsize = 256; + break; + case 2: + ai.sectorcount = 1040; + ai.sectorsize = 128; + break; + default: + Log_print("Unrecognized density"); + return FALSE; + } + if (!write_atr_header(&ai)) + return FALSE; + pass_flags = archive_flags; + for (;;) { + /* pass */ + int block_type; + if (!dcm_pass(infp, &ai)) + return FALSE; + if (pass_flags & 0x80) + break; + block_type = fgetc(infp); + if (block_type != archive_type) { + if (block_type == EOF && archive_type == 0xf9) { + Log_print("Multi-part archive error."); + Log_print("To process these files, you must first combine the files into a single file."); +#if defined(HAVE_WINDOWS_H) || defined(DJGPP) + Log_print("COPY /B file1.dcm+file2.dcm+file3.dcm newfile.dcm from the DOS prompt"); +#elif defined(__linux__) || defined(__unix__) + Log_print("cat file1.dcm file2.dcm file3.dcm >newfile.dcm from the shell"); +#endif + } + return FALSE; + } + pass_flags = fgetc(infp); + if ((pass_flags ^ archive_flags) & 0x60) { + Log_print("Density changed inside DCM archive?"); + return FALSE; + } + /* TODO: check pass number, this is tricky for >31 */ + } + last_sector = ai.current_sector - 1; + if (last_sector <= ai.sectorcount) + return pad_till_sector(&ai, ai.sectorcount + 1); + /* more sectors written: update ATR header */ + ai.sectorcount = last_sector; + Util_rewind(outfp); + return write_atr_header(&ai); +} diff --git a/PVAtari800/atari800-src/compfile.h b/PVAtari800/atari800-src/compfile.h new file mode 100644 index 0000000000..c9de741fa3 --- /dev/null +++ b/PVAtari800/atari800-src/compfile.h @@ -0,0 +1,9 @@ +#ifndef COMPFILE_H_ +#define COMPFILE_H_ + +#include /* FILE */ + +int CompFile_ExtractGZ(const char *infilename, FILE *outfp); +int CompFile_DCMtoATR(FILE *infp, FILE *outfp); + +#endif /* COMPFILE_H_ */ diff --git a/PVAtari800/atari800-src/config.h b/PVAtari800/atari800-src/config.h new file mode 100644 index 0000000000..d6777673a9 --- /dev/null +++ b/PVAtari800/atari800-src/config.h @@ -0,0 +1,566 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* The Austin Franklin 80 column card. */ +//#define AF80 1 + +/* Target: Android */ +/* #undef ANDROID */ + +/* Target: standard I/O. */ +/* #undef BASIC */ + +/* Define to use buffered debug output. */ +/* #undef BUFFERED_LOG */ + +/* Define to allow sound clipping. */ +/* #undef CLIP_SOUND */ + +/* Define to 1 if the `closedir' function returns void instead of `int'. */ +/* #undef CLOSEDIR_VOID */ + +/* Define to allow console sound (keyboard clicks). */ +#define CONSOLE_SOUND 1 + +/* Define to activate crash menu after CIM instruction. */ +/* #undef CRASH_MENU */ + +/* Define to disable bitmap graphics emulation in CURSES target. */ +/* #undef CURSES_BASIC */ + +/* Alternate config filename due to 8+3 fs limit. */ +/* #undef DEFAULT_CFG_NAME */ + +/* Target: Windows with DirectX. */ +/* #undef DIRECTX */ + +/* Define to use dirty screen partial repaints. */ +/* #undef DIRTYRECT */ + +/* Define to use back slash as directory separator. */ +/* #undef DIR_SEP_BACKSLASH */ + +/* Target: DOS VGA. */ +/* #undef DOSVGA */ + +/* Define to enable DOS style drives support. */ +/* #undef DOS_DRIVES */ + +/* Define to enable event recording. */ +#define EVENT_RECORDING 1 + +/* Target: Atari Falcon system. */ +/* #undef FALCON */ + +/* Define to use m68k assembler CPU core for Falcon target. */ +/* #undef FALCON_CPUASM */ + +/* Use SDL for graphics and input. */ +//#define GUI_SDL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define to 1 if you have the `atexit' function. */ +#define HAVE_ATEXIT 1 + +/* Define to 1 if you have the `chmod' function. */ +#define HAVE_CHMOD 1 + +/* Define to 1 if you have the `clock' function. */ +#define HAVE_CLOCK 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DIRECT_H */ + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* #undef HAVE_DOPRNT */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fdopen' function. */ +#define HAVE_FDOPEN 1 + +/* Define to 1 if you have the `fflush' function. */ +#define HAVE_FFLUSH 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_FILE_H */ + +/* Define to 1 if you have the `floor' function. */ +#define HAVE_FLOOR 1 + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#define HAVE_FSEEKO 1 + +/* Define to 1 if you have the `fstat' function. */ +#define HAVE_FSTAT 1 + +/* Define to 1 if you have the `getcwd' function. */ +#define HAVE_GETCWD 1 + +/* Define to 1 if you have the `gethostbyaddr' function. */ +#define HAVE_GETHOSTBYADDR 1 + +/* Define to 1 if you have the `gethostbyname' function. */ +#define HAVE_GETHOSTBYNAME 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `inet_ntoa' function. */ +#define HAVE_INET_NTOA 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `gem' library (-lgem). */ +/* #undef HAVE_LIBGEM */ + +/* Define to 1 if you have the `png' library (-lpng). */ +/* #undef HAVE_LIBPNG */ + +/* Define to 1 if you have the `z' library (-lz). */ +#define HAVE_LIBZ 1 + +/* Define to 1 if you have the `localtime' function. */ +#define HAVE_LOCALTIME 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `mkdir' function. */ +#define HAVE_MKDIR 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mktemp' function. */ +#define HAVE_MKTEMP 1 + +/* Define to 1 if you have the `modf' function. */ +#define HAVE_MODF 1 + +/* Define to 1 if you have the `nanosleep' function. */ +#define HAVE_NANOSLEEP 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +/* #undef HAVE_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the `opendir' function. */ +#define HAVE_OPENDIR 1 + +/* Support for OpenGL graphics acceleration. */ +#define HAVE_OPENGL 1 + +/* Define to 1 if you have the `rename' function. */ +#define HAVE_RENAME 1 + +/* Define to 1 if you have the `rewind' function. */ +#define HAVE_REWIND 1 + +/* Define to 1 if you have the `rmdir' function. */ +#define HAVE_RMDIR 1 + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define to 1 if you have the `signal' function. */ +#define HAVE_SIGNAL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `socket' function. */ +#define HAVE_SOCKET 1 + +/* Define to 1 if you have the `stat' function. */ +#define HAVE_STAT 1 + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +/* #undef HAVE_STAT_EMPTY_STRING_BUG */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror' function. */ +#define HAVE_STRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncpy' function. */ +#define HAVE_STRNCPY 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `system' function. */ +//#define HAVE_SYSTEM 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_DIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +/* #undef HAVE_SYS_NDIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SOUNDCARD_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define to 1 if you have the `time' function. */ +#define HAVE_TIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the `tmpfile' function. */ +#define HAVE_TMPFILE 1 + +/* Define to 1 if you have the `tmpnam' function. */ +#define HAVE_TMPNAM 1 + +/* Define to 1 if you have the `uclock' function. */ +/* #undef HAVE_UCLOCK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UNIXIO_H */ + +/* Define to 1 if you have the `unlink' function. */ +#define HAVE_UNLINK 1 + +/* Define to 1 if you have the `usleep' function. */ +#define HAVE_USLEEP 1 + +/* Define to 1 if you have the `vprintf' function. */ +#define HAVE_VPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define HAVE_VSNPRINTF 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the `_mkdir' function. */ +/* #undef HAVE__MKDIR */ + +/* Define to add IDE harddisk emulation. */ +#define IDE 1 + +/* Define to allow sound interpolation. */ +#define INTERPOLATE_SOUND 1 + +/* Define to use LINUX joystick. */ +/* #undef LINUX_JOYSTICK */ + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +/* #undef LSTAT_FOLLOWS_SLASHED_SYMLINK */ + +/* Define if mkdir takes only one argument. */ +/* #undef MKDIR_TAKES_ONE_ARG */ + +/* Define to activate assembler in monitor. */ +#define MONITOR_ASSEMBLER 1 + +/* Define to activate code breakpoints and execution history. */ +#define MONITOR_BREAK 1 + +/* Define to activate user-defined breakpoints. */ +/* #undef MONITOR_BREAKPOINTS */ + +/* Define to activate hints in disassembler. */ +#define MONITOR_HINTS 1 + +/* Define to activate 6502 opcode profiling. */ +/* #undef MONITOR_PROFILE */ + +/* Define to activate readline support in monitor. */ +//#define MONITOR_READLINE 1 + +/* Define to activate TRACE command in monitor. */ +/* #undef MONITOR_TRACE */ + +/* Target: X11 with Motif. */ +/* #undef MOTIF */ + +/* Define to allow color changes inside a scanline. */ +#define NEW_CYCLE_EXACT 1 + +/* Define to use nonlinear POKEY mixing. */ +#define NONLINEAR_MIXING 1 + +/* Use NTSC video filter. */ +//#define NTSC_FILTER 1 + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "pstehlik@sophics.cz" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Atari800" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Atari800 3.1.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "atari800" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.1.0" + +/* Define to use page-based attribute array. */ +/* #undef PAGED_ATTRIB */ + +/* Use accurate PAL color blending. */ +//#define PAL_BLENDING 1 + +/* Define to emulate the Black Box. */ +#define PBI_BB 1 + +/* Define to emulate the MIO board. */ +#define PBI_MIO 1 + +/* A prototype 80 column card for the 1090 expansion box. */ +//#define PBI_PROTO80 1 + +/* Define to emulate the 1400XL/1450XLD. */ +//#define PBI_XLD 1 + +/* Platform-specific mapping of RGB palette to display surface. */ +#define PLATFORM_MAP_PALETTE 1 + +/* Target: Sony PlayStation 2. */ +/* #undef PS2 */ + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE void + +/* Target: Raspberry Pi. */ +/* #undef RPI */ + +/* Define to use R: device. */ +/* #undef R_IO_DEVICE */ + +/* Define to use IP network connection with the R: device. */ +/* #undef R_NETWORK */ + +/* Define to use the host serial port with the R: device. */ +/* #undef R_SERIAL */ + +/* Target: SDL library. */ +//#define SDL 1 + +/* Define to the type of arg 1 for `select'. */ +#define SELECT_TYPE_ARG1 int + +/* Define to the type of args 2, 3 and 4 for `select'. */ +#define SELECT_TYPE_ARG234 (fd_set *) + +/* Define to the type of arg 5 for `select'. */ +#define SELECT_TYPE_ARG5 (struct timeval *) + +/* Define to allow serial in/out sound. */ +/* #undef SERIO_SOUND */ + +/* Target: X11 with shared memory extensions. */ +/* #undef SHM */ + +/* Define to activate sound support. */ +#define SOUND 1 + +/* Platform updates sound buffer by callback function. */ +#define SOUND_CALLBACK 1 + +/* Use new sound API. */ +#define SOUND_THIN_API 1 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to allow stereo sound. */ +#define STEREO_SOUND 1 + +/* Can change video modes on the fly. */ +//#define SUPPORTS_CHANGE_VIDEOMODE 1 + +/* Save additional config file options. */ +//#define SUPPORTS_PLATFORM_CONFIGSAVE 1 + +/* Additional config file options. */ +//#define SUPPORTS_PLATFORM_CONFIGURE 1 + +/* Update the Palette if it changed. */ +//#define SUPPORTS_PLATFORM_PALETTEUPDATE 1 + +/* Platform-specific sleep function. */ +/* #undef SUPPORTS_PLATFORM_SLEEP */ + +/* Platform-specific time function. */ +//#define SUPPORTS_PLATFORM_TIME 1 + +/* Can display the screen rotated sideways. */ +#define SUPPORTS_ROTATE_VIDEOMODE 1 + +/* Reinitialise the sound system. */ +/* #undef SUPPORTS_SOUND_REINIT */ + +/* Define to use synchronized sound. */ +#define SYNCHRONIZED_SOUND 1 + +/* Alternate system-wide config file for non-Unix OS. */ +/* #undef SYSTEM_WIDE_CFG_FILE */ + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* Target: Curses-compatible library. */ +/* #undef USE_CURSES */ + +/* Define for using cursor/ctrl keys for keyboard joystick. */ +/* #undef USE_CURSORBLOCK */ + +/* Target: Ncurses library. */ +/* #undef USE_NCURSES */ + +/* Define to enable on-screen keyboard. */ +/* #undef USE_UI_BASIC_ONSCREEN_KEYBOARD */ + +/* Define to use very slow computer support (faster -refresh). */ +/* #undef VERY_SLOW */ + +/* Define to emulate the Alien Group Voice Box. */ +//#define VOICEBOX 1 + +/* Define to allow volume only sound. */ +/* #undef VOL_ONLY_SOUND */ + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define if unaligned word access is ok. */ +#define WORDS_UNALIGNED_OK 1 + +/* Target: Standard X11. */ +/* #undef X11 */ + +/* Emulate the XEP80. */ +//#define XEP80_EMULATION 1 + +/* Target: X11 with XView. */ +/* #undef XVIEW */ + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* #undef _LARGEFILE_SOURCE */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#define inline __inline__ +#endif + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to empty if the keyword `volatile' does not work. Warning: valid + code using `volatile' can become incorrect without. Disable with care. */ +/* #undef volatile */ diff --git a/PVAtari800/atari800-src/cpu.c b/PVAtari800/atari800-src/cpu.c new file mode 100644 index 0000000000..4288a48a38 --- /dev/null +++ b/PVAtari800/atari800-src/cpu.c @@ -0,0 +1,2402 @@ +/* + * cpu.c - 6502 CPU emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + Configuration symbols + ===================== + + Define CPU65C02 if you don't want 6502 JMP() bug emulation. + Define CYCLES_PER_OPCODE to update ANTIC_xpos in each opcode's emulation. + Define MONITOR_BREAK if you want code breakpoints and execution history. + Define MONITOR_BREAKPOINTS if you want user-defined breakpoints. + Define MONITOR_PROFILE if you want 6502 opcode profiling. + Define MONITOR_TRACE if you want the code to be disassembled while it is executed. + Define NO_GOTO if you compile with GCC, but want switch() rather than goto *. + Define NO_V_FLAG_VARIABLE to don't use local (static) variable V for the V flag. + Define PC_PTR to emulate 6502 Program Counter using UBYTE *. + Define PREFETCH_CODE to always fetch 2 bytes after the opcode. + Define WRAP_64K to correctly emulate instructions that wrap at 64K. + Define WRAP_ZPAGE to prevent incorrect access to the address 0x0100 in zeropage + indirect mode. + + + Limitations & Known bugs + ======================== + + There is no emulation of the bug in the BRK instruction executed simultaneously + with another interrupt. + + The 6502 emulation ignores memory attributes for instruction fetch. + This is because the instruction must come from either RAM or ROM. + A program that executes instructions from within hardware addresses will fail + since there is never any usable code there. + + The 6502 emulation also ignores memory attributes for accesses to page 0 and page 1. + */ + +#include "config.h" +#include +#include /* exit() */ + +#include "cpu.h" +#ifdef ASAP /* external project, see http://asap.sf.net */ +#include "asap_internal.h" +#else +#include "antic.h" +#include "atari.h" +#include "esc.h" +#include "memory.h" +#include "monitor.h" +#ifndef BASIC +#include "statesav.h" +#ifndef __PLUS +#include "ui.h" +#endif +#endif /* BASIC */ +#endif /* ASAP */ + +#ifdef FALCON_CPUASM + +extern UBYTE CPU_IRQ; + +#ifdef PAGED_MEM +#error cpu_m68k.asm cannot work with paged memory +#endif + +void CPU_Initialise(void) +{ + CPU_INIT(); +} + +void CPU_GetStatus(void) +{ + CPU_GET(); +} + +void CPU_PutStatus(void) +{ + CPU_PUT(); +} + +#else /* FALCON_CPUASM */ + +/* Windows headers define it */ +#undef ABSOLUTE + +#ifndef __GNUC__ +#define NO_GOTO +#endif + +/* #define CYCLES_PER_OPCODE */ + +/* #define MONITOR_PROFILE */ + +/* #define NO_V_FLAG_VARIABLE */ + +/* If PC_PTR is defined, local PC is "const UBYTE *", otherwise it's UWORD. */ +/* #define PC_PTR */ + +/* If PREFETCH_CODE is defined, 2 bytes after the opcode are always fetched. */ +/* #define PREFETCH_CODE */ + + +/* 6502 stack handling */ +#define PL MEMORY_dGetByte(0x0100 + ++S) +#define PH(x) MEMORY_dPutByte(0x0100 + S--, x) +#define PHW(x) PH((x) >> 8); PH((x) & 0xff) + +/* 6502 code fetching */ +#ifdef PC_PTR +#define GET_PC() (PC - MEMORY_mem) +#define SET_PC(newpc) (PC = MEMORY_mem + (newpc)) +#define PHPC { UWORD tmp = PC - MEMORY_mem; PHW(tmp); } +#define GET_CODE_BYTE() (*PC++) +#define PEEK_CODE_BYTE() (*PC) +#if !defined(WORDS_BIGENDIAN) && defined(WORDS_UNALIGNED_OK) +#define PEEK_CODE_WORD() (*(const UWORD *) PC) +#else +#define PEEK_CODE_WORD() (*PC + (PC[1] << 8)) +#endif +#else /* PC_PTR */ +#define GET_PC() PC +#define SET_PC(newpc) (PC = (newpc)) +#define PHPC PHW(PC) +#define GET_CODE_BYTE() MEMORY_dGetByte(PC++) +#define PEEK_CODE_BYTE() MEMORY_dGetByte(PC) +#define PEEK_CODE_WORD() MEMORY_dGetWord(PC) +#endif /* PC_PTR */ + +/* Cycle-exact Read-Modify-Write instructions. + RMW instructions: ASL, LSR, ROL, ROR, INC, DEC + (+ some undocumented) write to the specified address + *twice*: first the unmodified value, then the modified value. + This can be observed only with some hardware registers. */ +/* XXX: we do this only for GTIA, because NEW_CYCLE_EXACT does not correctly + emulate INC $D400 (and INC $D40A wasn't tested) */ +#ifdef NEW_CYCLE_EXACT +#ifndef PAGED_ATTRIB +#define RMW_GetByte(x, addr) \ + if (MEMORY_attrib[addr] == MEMORY_HARDWARE) { \ + x = MEMORY_HwGetByte(addr, FALSE); \ + if ((addr & 0xef00) == 0xc000) { \ + ANTIC_xpos--; \ + MEMORY_HwPutByte(addr, x); \ + ANTIC_xpos++; \ + } \ + } else \ + x = MEMORY_dGetByte(addr); +#else /* PAGED_ATTRIB */ +#define RMW_GetByte(x, addr) \ + x = MEMORY_GetByte(addr); \ + if ((addr & 0xef00) == 0xc000) { \ + ANTIC_xpos--; \ + MEMORY_PutByte(addr, x); \ + ANTIC_xpos++; \ + } +#endif /* PAGED_ATTRIB */ +#else /* NEW_CYCLE_EXACT */ +/* Don't emulate the first write */ +#define RMW_GetByte(x, addr) x = MEMORY_GetByte(addr); +#endif /* NEW_CYCLE_EXACT */ + +/* 6502 registers. */ +UWORD CPU_regPC; +UBYTE CPU_regA; +UBYTE CPU_regX; +UBYTE CPU_regY; +UBYTE CPU_regP; /* Processor Status Byte (Partial) */ +UBYTE CPU_regS; +UBYTE CPU_IRQ; + +/* Transfer 6502 registers between global variables and local variables inside CPU_GO() */ +#define UPDATE_GLOBAL_REGS CPU_regPC = GET_PC(); CPU_regS = S; CPU_regA = A; CPU_regX = X; CPU_regY = Y +#define UPDATE_LOCAL_REGS SET_PC(CPU_regPC); S = CPU_regS; A = CPU_regA; X = CPU_regX; Y = CPU_regY + +/* 6502 flags local to this module */ +static UBYTE N; /* bit7 set => N flag set */ +#ifndef NO_V_FLAG_VARIABLE +static UBYTE V; /* non-zero => V flag set */ +#endif +static UBYTE Z; /* zero => Z flag set */ +static UBYTE C; /* must be 0 or 1 */ +/* B, D, I are always in CPU_regP */ + +void CPU_GetStatus(void) +{ +#ifndef NO_V_FLAG_VARIABLE + CPU_regP = (N & 0x80) + (V ? 0x40 : 0) + (CPU_regP & 0x3c) + ((Z == 0) ? 0x02 : 0) + C; +#else + CPU_regP = (N & 0x80) + (CPU_regP & 0x7c) + ((Z == 0) ? 0x02 : 0) + C; +#endif +} + +void CPU_PutStatus(void) +{ + N = CPU_regP; +#ifndef NO_V_FLAG_VARIABLE + V = (CPU_regP & 0x40); +#endif + Z = (CPU_regP & 0x02) ^ 0x02; + C = (CPU_regP & 0x01); +} + +/* For Atari Basic loader */ +void (*CPU_rts_handler)(void) = NULL; + +/* 6502 instruction profiling */ +#ifdef MONITOR_PROFILE +int CPU_instruction_count[256]; +#endif + +UBYTE CPU_cim_encountered = FALSE; + +/* Execution history */ +#ifdef MONITOR_BREAK +UWORD CPU_remember_PC[CPU_REMEMBER_PC_STEPS]; +UBYTE CPU_remember_op[CPU_REMEMBER_PC_STEPS][3]; +unsigned int CPU_remember_PC_curpos = 0; +int CPU_remember_xpos[CPU_REMEMBER_PC_STEPS]; +UWORD CPU_remember_JMP[CPU_REMEMBER_JMP_STEPS]; +unsigned int CPU_remember_jmp_curpos = 0; +#define INC_RET_NESTING MONITOR_ret_nesting++ +#else /* MONITOR_BREAK */ +#define INC_RET_NESTING +#endif /* MONITOR_BREAK */ + +/* Addressing modes */ +#ifdef WRAP_ZPAGE +#define zGetWord(x) (MEMORY_dGetByte(x) + (MEMORY_dGetByte((UBYTE) ((x) + 1)) << 8)) +#else +#define zGetWord(x) MEMORY_dGetWord(x) +#endif +#ifdef PREFETCH_CODE +#if defined(WORDS_BIGENDIAN) || !defined(WORDS_UNALIGNED_OK) +#warning PREFETCH_CODE is efficient only on little-endian machines with WORDS_UNALIGNED_OK +#endif +#define OP_BYTE ((UBYTE) addr) +#define OP_WORD addr +#define IMMEDIATE (PC++, (UBYTE) addr) +#define ABSOLUTE PC += 2 +#define ZPAGE PC++; addr &= 0xff +#define ABSOLUTE_X addr += X; PC += 2 +#define ABSOLUTE_Y addr += Y; PC += 2 +#define INDIRECT_X PC++; addr = (UBYTE) (addr + X); addr = zGetWord(addr) +#define INDIRECT_Y PC++; addr &= 0xff; addr = zGetWord(addr) + Y +#define ZPAGE_X PC++; addr = (UBYTE) (addr + X) +#define ZPAGE_Y PC++; addr = (UBYTE) (addr + Y) +#else /* PREFETCH_CODE */ +#define OP_BYTE PEEK_CODE_BYTE() +#define OP_WORD PEEK_CODE_WORD() +#define IMMEDIATE GET_CODE_BYTE() +#define ABSOLUTE addr = PEEK_CODE_WORD(); PC += 2 +#define ZPAGE addr = GET_CODE_BYTE() +#define ABSOLUTE_X addr = PEEK_CODE_WORD() + X; PC += 2 +#define ABSOLUTE_Y addr = PEEK_CODE_WORD() + Y; PC += 2 +#define INDIRECT_X addr = (UBYTE) (GET_CODE_BYTE() + X); addr = zGetWord(addr) +#define INDIRECT_Y addr = GET_CODE_BYTE(); addr = zGetWord(addr) + Y +#define ZPAGE_X addr = (UBYTE) (GET_CODE_BYTE() + X) +#define ZPAGE_Y addr = (UBYTE) (GET_CODE_BYTE() + Y) +#endif /* PREFETCH_CODE */ + +/* Instructions */ +#define AND(t_data) Z = N = A &= t_data +#define CMP(t_data) data = t_data; Z = N = A - data; C = (A >= data) +#define CPX(t_data) data = t_data; Z = N = X - data; C = (X >= data) +#define CPY(t_data) data = t_data; Z = N = Y - data; C = (Y >= data) +#define EOR(t_data) Z = N = A ^= t_data +#define LDA(t_data) Z = N = A = t_data +#define LDX(t_data) Z = N = X = t_data +#define LDY(t_data) Z = N = Y = t_data +#define ORA(t_data) Z = N = A |= t_data +#ifndef NO_V_FLAG_VARIABLE +#define PHP(x) data = (N & 0x80) + (V ? 0x40 : 0) + (CPU_regP & (x)) + ((Z == 0) ? 0x02 : 0) + C; PH(data) +#define PHPB0 PHP(0x2c) /* push flags with B flag clear (NMI, IRQ) */ +#define PHPB1 PHP(0x3c) /* push flags with B flag set (PHP, BRK) */ +#define PLP data = PL; N = data; V = (data & 0x40); Z = (data & 0x02) ^ 0x02; C = (data & 0x01); CPU_regP = (data & 0x0c) + 0x30 +#else /* NO_V_FLAG_VARIABLE */ +#define PHP(x) data = (N & 0x80) + (CPU_regP & (x)) + ((Z == 0) ? 0x02 : 0) + C; PH(data) +#define PHPB0 PHP(0x6c) /* push flags with B flag clear (NMI, IRQ) */ +#define PHPB1 PHP(0x7c) /* push flags with B flag set (PHP, BRK) */ +#define PLP data = PL; N = data; Z = (data & 0x02) ^ 0x02; C = (data & 0x01); CPU_regP = (data & 0x4c) + 0x30 +#endif /* NO_V_FLAG_VARIABLE */ +/* 1 or 2 extra cycles for conditional jumps */ +#if 0 +/* old, less efficient version */ +#define BRANCH(cond) \ + if (cond) { \ + SWORD sdata = (SBYTE) GET_CODE_BYTE(); \ + if ((sdata + (UBYTE) GET_PC()) & 0xff00) \ + ANTIC_xpos++; \ + ANTIC_xpos++; \ + PC += sdata; \ + DONE \ + } \ + PC++; \ + DONE +#else +#define BRANCH(cond) \ + if (cond) { \ + addr = (UWORD) (SBYTE) IMMEDIATE; \ + addr += GET_PC(); \ + if ((addr ^ GET_PC()) & 0xff00) \ + ANTIC_xpos++; \ + ANTIC_xpos++; \ + SET_PC(addr); \ + DONE \ + } \ + PC++; \ + DONE +#endif + +/* 1 extra cycle for X (or Y) index overflow */ +#define NCYCLES_X if ((UBYTE) addr < X) ANTIC_xpos++ +#define NCYCLES_Y if ((UBYTE) addr < Y) ANTIC_xpos++ + +/* Triggers a Non-Maskable Interrupt */ +void CPU_NMI(void) +{ + UBYTE S = CPU_regS; + UBYTE data; + + PHW(CPU_regPC); + PHPB0; + CPU_SetI; + CPU_regPC = MEMORY_dGetWordAligned(0xfffa); + CPU_regS = S; + ANTIC_xpos += 7; /* handling an interrupt by 6502 takes 7 cycles */ + INC_RET_NESTING; +} + +/* Check pending IRQ, helps in (not only) Lucasfilm games */ +#define CPUCHECKIRQ \ + if (CPU_IRQ && !(CPU_regP & CPU_I_FLAG) && ANTIC_xpos < ANTIC_xpos_limit) { \ + PHPC; \ + PHPB0; \ + CPU_SetI; \ + SET_PC(MEMORY_dGetWordAligned(0xfffe)); \ + ANTIC_xpos += 7; \ + INC_RET_NESTING; \ + } + +/* Enter monitor */ +#ifdef __PLUS +#define ENTER_MONITOR Atari800_Exit(TRUE) +#else +#define ENTER_MONITOR if (!Atari800_Exit(TRUE)) exit(0) +#endif +#define DO_BREAK \ + UPDATE_GLOBAL_REGS; \ + CPU_GetStatus(); \ + ENTER_MONITOR; \ + CPU_PutStatus(); \ + UPDATE_LOCAL_REGS; + + +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ +static const int cycles[256] = +{ + 7, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 4, 4, 6, 6, /* 0x */ + 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 1x */ + 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 4, 4, 6, 6, /* 2x */ + 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 3x */ + + 6, 6, 2, 8, 3, 3, 5, 5, 3, 2, 2, 2, 3, 4, 6, 6, /* 4x */ + 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 5x */ + 6, 6, 2, 8, 3, 3, 5, 5, 4, 2, 2, 2, 5, 4, 6, 6, /* 6x */ + 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* 7x */ + + 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /* 8x */ + 2, 6, 2, 6, 4, 4, 4, 4, 2, 5, 2, 5, 5, 5, 5, 5, /* 9x */ + 2, 6, 2, 6, 3, 3, 3, 3, 2, 2, 2, 2, 4, 4, 4, 4, /* Ax */ + 2, 5, 2, 5, 4, 4, 4, 4, 2, 4, 2, 4, 4, 4, 4, 4, /* Bx */ + + 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /* Cx */ + 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7, /* Dx */ + 2, 6, 2, 8, 3, 3, 5, 5, 2, 2, 2, 2, 4, 4, 6, 6, /* Ex */ + 2, 5, 2, 8, 4, 4, 6, 6, 2, 4, 2, 7, 4, 4, 7, 7 /* Fx */ +}; + +/* 6502 emulation routine */ +#ifndef NO_GOTO +__extension__ /* suppress -ansi -pedantic warnings */ +#endif +void CPU_GO(int limit) +{ +#ifdef NO_GOTO +#define OPCODE_ALIAS(code) case 0x##code: +#define DONE break; +#else +#define OPCODE_ALIAS(code) opcode_##code: +#define DONE goto next; + static const void *opcode[256] = + { + &&opcode_00, &&opcode_01, &&opcode_02, &&opcode_03, + &&opcode_04, &&opcode_05, &&opcode_06, &&opcode_07, + &&opcode_08, &&opcode_09, &&opcode_0a, &&opcode_0b, + &&opcode_0c, &&opcode_0d, &&opcode_0e, &&opcode_0f, + + &&opcode_10, &&opcode_11, &&opcode_12, &&opcode_13, + &&opcode_14, &&opcode_15, &&opcode_16, &&opcode_17, + &&opcode_18, &&opcode_19, &&opcode_1a, &&opcode_1b, + &&opcode_1c, &&opcode_1d, &&opcode_1e, &&opcode_1f, + + &&opcode_20, &&opcode_21, &&opcode_22, &&opcode_23, + &&opcode_24, &&opcode_25, &&opcode_26, &&opcode_27, + &&opcode_28, &&opcode_29, &&opcode_2a, &&opcode_2b, + &&opcode_2c, &&opcode_2d, &&opcode_2e, &&opcode_2f, + + &&opcode_30, &&opcode_31, &&opcode_32, &&opcode_33, + &&opcode_34, &&opcode_35, &&opcode_36, &&opcode_37, + &&opcode_38, &&opcode_39, &&opcode_3a, &&opcode_3b, + &&opcode_3c, &&opcode_3d, &&opcode_3e, &&opcode_3f, + + &&opcode_40, &&opcode_41, &&opcode_42, &&opcode_43, + &&opcode_44, &&opcode_45, &&opcode_46, &&opcode_47, + &&opcode_48, &&opcode_49, &&opcode_4a, &&opcode_4b, + &&opcode_4c, &&opcode_4d, &&opcode_4e, &&opcode_4f, + + &&opcode_50, &&opcode_51, &&opcode_52, &&opcode_53, + &&opcode_54, &&opcode_55, &&opcode_56, &&opcode_57, + &&opcode_58, &&opcode_59, &&opcode_5a, &&opcode_5b, + &&opcode_5c, &&opcode_5d, &&opcode_5e, &&opcode_5f, + + &&opcode_60, &&opcode_61, &&opcode_62, &&opcode_63, + &&opcode_64, &&opcode_65, &&opcode_66, &&opcode_67, + &&opcode_68, &&opcode_69, &&opcode_6a, &&opcode_6b, + &&opcode_6c, &&opcode_6d, &&opcode_6e, &&opcode_6f, + + &&opcode_70, &&opcode_71, &&opcode_72, &&opcode_73, + &&opcode_74, &&opcode_75, &&opcode_76, &&opcode_77, + &&opcode_78, &&opcode_79, &&opcode_7a, &&opcode_7b, + &&opcode_7c, &&opcode_7d, &&opcode_7e, &&opcode_7f, + + &&opcode_80, &&opcode_81, &&opcode_82, &&opcode_83, + &&opcode_84, &&opcode_85, &&opcode_86, &&opcode_87, + &&opcode_88, &&opcode_89, &&opcode_8a, &&opcode_8b, + &&opcode_8c, &&opcode_8d, &&opcode_8e, &&opcode_8f, + + &&opcode_90, &&opcode_91, &&opcode_92, &&opcode_93, + &&opcode_94, &&opcode_95, &&opcode_96, &&opcode_97, + &&opcode_98, &&opcode_99, &&opcode_9a, &&opcode_9b, + &&opcode_9c, &&opcode_9d, &&opcode_9e, &&opcode_9f, + + &&opcode_a0, &&opcode_a1, &&opcode_a2, &&opcode_a3, + &&opcode_a4, &&opcode_a5, &&opcode_a6, &&opcode_a7, + &&opcode_a8, &&opcode_a9, &&opcode_aa, &&opcode_ab, + &&opcode_ac, &&opcode_ad, &&opcode_ae, &&opcode_af, + + &&opcode_b0, &&opcode_b1, &&opcode_b2, &&opcode_b3, + &&opcode_b4, &&opcode_b5, &&opcode_b6, &&opcode_b7, + &&opcode_b8, &&opcode_b9, &&opcode_ba, &&opcode_bb, + &&opcode_bc, &&opcode_bd, &&opcode_be, &&opcode_bf, + + &&opcode_c0, &&opcode_c1, &&opcode_c2, &&opcode_c3, + &&opcode_c4, &&opcode_c5, &&opcode_c6, &&opcode_c7, + &&opcode_c8, &&opcode_c9, &&opcode_ca, &&opcode_cb, + &&opcode_cc, &&opcode_cd, &&opcode_ce, &&opcode_cf, + + &&opcode_d0, &&opcode_d1, &&opcode_d2, &&opcode_d3, + &&opcode_d4, &&opcode_d5, &&opcode_d6, &&opcode_d7, + &&opcode_d8, &&opcode_d9, &&opcode_da, &&opcode_db, + &&opcode_dc, &&opcode_dd, &&opcode_de, &&opcode_df, + + &&opcode_e0, &&opcode_e1, &&opcode_e2, &&opcode_e3, + &&opcode_e4, &&opcode_e5, &&opcode_e6, &&opcode_e7, + &&opcode_e8, &&opcode_e9, &&opcode_ea, &&opcode_eb, + &&opcode_ec, &&opcode_ed, &&opcode_ee, &&opcode_ef, + + &&opcode_f0, &&opcode_f1, &&opcode_f2, &&opcode_f3, + &&opcode_f4, &&opcode_f5, &&opcode_f6, &&opcode_f7, + &&opcode_f8, &&opcode_f9, &&opcode_fa, &&opcode_fb, + &&opcode_fc, &&opcode_fd, &&opcode_fe, &&opcode_ff, + }; +#endif /* NO_GOTO */ + +#ifdef CYCLES_PER_OPCODE +#define OPCODE(code) OPCODE_ALIAS(code) ANTIC_xpos += cycles[0x##code]; +#else +#define OPCODE(code) OPCODE_ALIAS(code) +#endif + +#ifdef PC_PTR + const UBYTE *PC; +#else + UWORD PC; +#endif + UBYTE A; + UBYTE X; + UBYTE Y; + UBYTE S; + + UWORD addr; + UBYTE data; +#define insn data + +/* + This used to be in the main loop but has been removed to improve + execution speed. It does not seem to have any adverse effect on + the emulation for two reasons: + + 1. NMI's will can only be raised in antic.c - there is + no way an NMI can be generated whilst in this routine. + + 2. The timing of the IRQs are not that critical. */ + + if (ANTIC_wsync_halt) { + +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) { +/* if ANTIC_WSYNC_C is a stolen cycle, ANTIC_antic2cpu_ptr will convert that to the nearest + cpu cycle before that cycle. The CPU will see this cycle, if WSYNC is not + delayed. (Actually this cycle is the first cycle of the instruction after + STA WSYNC, which was really executed one cycle after STA WSYNC because + of an internal antic delay ). ANTIC_delayed_wsync is added to this cycle to form + the limit in the case that WSYNC is not early (does not allow this extra cycle) */ + + if (limit < ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C] + ANTIC_delayed_wsync) + return; + ANTIC_xpos = ANTIC_antic2cpu_ptr[ANTIC_WSYNC_C] + ANTIC_delayed_wsync; + } + else { + if (limit < (ANTIC_WSYNC_C + ANTIC_delayed_wsync)) + return; + ANTIC_xpos = ANTIC_WSYNC_C; + } + ANTIC_delayed_wsync = 0; + +#else /* NEW_CYCLE_EXACT */ + + if (limit < ANTIC_WSYNC_C) + return; + ANTIC_xpos = ANTIC_WSYNC_C; + +#endif /* NEW_CYCLE_EXACT */ + + ANTIC_wsync_halt = 0; + } + ANTIC_xpos_limit = limit; /* needed for WSYNC store inside ANTIC */ + + UPDATE_LOCAL_REGS; + + CPUCHECKIRQ; + + while (ANTIC_xpos < ANTIC_xpos_limit) { + +#ifdef MONITOR_BREAKPOINTS + breakpoint_return: +#endif + +#ifdef PC_PTR + /* must handle 64k wrapping */ + if (PC >= MEMORY_mem + 0xfffe) { + if (PC >= MEMORY_mem + 0x10000) + PC -= 0x10000; + else { + /* the opcode is before 0x10000, but the operand is past */ +#ifdef WORDS_UNALIGNED_OK + *(UWORD *) (MEMORY_mem + 0x10000) = *(UWORD *) MEMORY_mem; +#else + MEMORY_mem[0x10000] = MEMORY_mem[0]; + MEMORY_mem[0x10001] = MEMORY_mem[1]; +#endif /* WORDS_UNALIGNED_OK */ + } + } +#endif /* PC_PTR */ + +#ifdef MONITOR_TRACE + if (MONITOR_trace_file != NULL) { + MONITOR_ShowState(MONITOR_trace_file, GET_PC(), A, X, Y, S, + (N & 0x80) ? 'N' : '-', +#ifndef NO_V_FLAG_VARIABLE + V ? 'V' : '-', +#else + (CPU_regP & CPU_V_FLAG) ? 'V' : '-', +#endif + (Z == 0) ? 'Z' : '-', + (C != 0) ? 'C' : '-'); + } +#endif + +#ifdef MONITOR_BREAK + CPU_remember_PC[CPU_remember_PC_curpos] = GET_PC(); + CPU_remember_op[CPU_remember_PC_curpos][0] = MEMORY_dGetByte(GET_PC()); + CPU_remember_op[CPU_remember_PC_curpos][1] = MEMORY_dGetByte(GET_PC()+1); + CPU_remember_op[CPU_remember_PC_curpos][2] = MEMORY_dGetByte(GET_PC()+2); +#ifdef NEW_CYCLE_EXACT + if (ANTIC_DRAWING_SCREEN) + CPU_remember_xpos[CPU_remember_PC_curpos] = ANTIC_cpu2antic_ptr[ANTIC_xpos] + (ANTIC_ypos << 8); + else +#endif + CPU_remember_xpos[CPU_remember_PC_curpos] = ANTIC_xpos + (ANTIC_ypos << 8); + CPU_remember_PC_curpos = (CPU_remember_PC_curpos + 1) % CPU_REMEMBER_PC_STEPS; + + if (MONITOR_break_addr == GET_PC() || ANTIC_break_ypos == ANTIC_ypos) { + DO_BREAK; + } +#endif /* MONITOR_BREAK */ + +#if defined(WRAP_64K) && !defined(PC_PTR) + MEMORY_mem[0x10000] = MEMORY_mem[0]; +#endif + + insn = GET_CODE_BYTE(); + +#ifdef MONITOR_BREAKPOINTS + if (MONITOR_breakpoint_table_size > 0 && MONITOR_breakpoints_enabled) { + UBYTE optype = MONITOR_optype6502[insn]; + int i; + switch (optype >> 4) { + case 1: + addr = PEEK_CODE_WORD(); + break; + case 2: + addr = PEEK_CODE_BYTE(); + break; + case 3: + addr = PEEK_CODE_WORD() + X; + break; + case 4: + addr = PEEK_CODE_WORD() + Y; + break; + case 5: + addr = (UBYTE) (PEEK_CODE_BYTE() + X); + addr = zGetWord(addr); + break; + case 6: + addr = PEEK_CODE_BYTE(); + addr = zGetWord(addr) + Y; + break; + case 7: + addr = (UBYTE) (PEEK_CODE_BYTE() + X); + break; + case 8: + addr = (UBYTE) (PEEK_CODE_BYTE() + Y); + break; + /* XXX: case 13 */ + default: + addr = 0; + break; + } + for (i = 0; i < MONITOR_breakpoint_table_size; i++) { + int cond; + int value; + if (!MONITOR_breakpoint_table[i].enabled) + continue; /* skip */ + cond = MONITOR_breakpoint_table[i].condition; + if (cond == MONITOR_BREAKPOINT_OR) + break; /* fire */ + value = MONITOR_breakpoint_table[i].value; + if (cond == MONITOR_BREAKPOINT_FLAG_CLEAR) { + switch (value) { + case CPU_N_FLAG: + if ((N & 0x80) == 0) + continue; + break; +#ifndef NO_V_FLAG_VARIABLE + case CPU_V_FLAG: + if (V == 0) + continue; + break; +#endif + case CPU_Z_FLAG: + if (Z != 0) + continue; + break; + case CPU_C_FLAG: + if (C == 0) + continue; + break; + default: + if ((CPU_regP & value) == 0) + continue; + break; + } + } + else if (cond == MONITOR_BREAKPOINT_FLAG_SET) { + switch (value) { + case CPU_N_FLAG: + if ((N & 0x80) != 0) + continue; + break; +#ifndef NO_V_FLAG_VARIABLE + case CPU_V_FLAG: + if (V != 0) + continue; + break; +#endif + case CPU_Z_FLAG: + if (Z == 0) + continue; + break; + case CPU_C_FLAG: + if (C != 0) + continue; + break; + default: + if ((CPU_regP & value) != 0) + continue; + break; + } + } + else { + int val; + switch (cond >> 3) { + case MONITOR_BREAKPOINT_PC >> 3: + val = GET_PC() - 1; + break; + case MONITOR_BREAKPOINT_A >> 3: + val = A; + break; + case MONITOR_BREAKPOINT_X >> 3: + val = X; + break; + case MONITOR_BREAKPOINT_Y >> 3: + val = Y; + break; + case MONITOR_BREAKPOINT_S >> 3: + val = S; + break; + case MONITOR_BREAKPOINT_READ >> 3: + if ((optype & 4) == 0) + goto cond_failed; + val = addr; + break; + case MONITOR_BREAKPOINT_WRITE >> 3: + if ((optype & 8) == 0) + goto cond_failed; + val = addr; + break; + case MONITOR_BREAKPOINT_ACCESS >> 3: + if ((optype & 12) == 0) + goto cond_failed; + val = addr; + break; + default: + /* shouldn't happen */ + continue; + } + if ((cond & MONITOR_BREAKPOINT_LESS) != 0 && val < value) + continue; + if ((cond & MONITOR_BREAKPOINT_EQUAL) != 0 && val == value) + continue; + if ((cond & MONITOR_BREAKPOINT_GREATER) != 0 && val > value) + continue; + cond_failed: + ; + } + /* a condition failed */ + /* quickly skip AND-connected conditions */ + do { + if (++i >= MONITOR_breakpoint_table_size) + goto no_breakpoint; + } while (MONITOR_breakpoint_table[i].condition != MONITOR_BREAKPOINT_OR || !MONITOR_breakpoint_table[i].enabled); + } + /* fire breakpoint */ + PC--; + DO_BREAK; + goto breakpoint_return; + no_breakpoint: + ; + } +#endif /* MONITOR_BREAKPOINTS */ + +#ifndef CYCLES_PER_OPCODE + ANTIC_xpos += cycles[insn]; +#endif + +#ifdef MONITOR_PROFILE + CPU_instruction_count[insn]++; +#endif + +#ifdef PREFETCH_CODE + addr = PEEK_CODE_WORD(); +#endif + +#ifdef NO_GOTO + switch (insn) { +#else + goto *opcode[insn]; +#endif + + OPCODE(00) /* BRK */ +#ifdef MONITOR_BREAK + if (MONITOR_break_brk) { + DO_BREAK; + } + else +#endif + { + PC++; + PHPC; + PHPB1; + CPU_SetI; + SET_PC(MEMORY_dGetWordAligned(0xfffe)); + INC_RET_NESTING; + } + DONE + + OPCODE(01) /* ORA (ab,x) */ + INDIRECT_X; + ORA(MEMORY_GetByte(addr)); + DONE + + OPCODE(03) /* ASO (ab,x) [unofficial - ASL then ORA with Acc] */ + INDIRECT_X; + + aso: + RMW_GetByte(data, addr); + C = (data & 0x80) ? 1 : 0; + data <<= 1; + MEMORY_PutByte(addr, data); + Z = N = A |= data; + DONE + + OPCODE_ALIAS(04) /* NOP ab [unofficial - skip byte] */ + OPCODE_ALIAS(44) + OPCODE(64) + PC++; + DONE + + OPCODE_ALIAS(14) /* NOP ab,x [unofficial - skip byte] */ + OPCODE_ALIAS(34) + OPCODE_ALIAS(54) + OPCODE_ALIAS(74) + OPCODE_ALIAS(d4) + OPCODE(f4) + PC++; + DONE + + OPCODE_ALIAS(80) /* NOP #ab [unofficial - skip byte] */ + OPCODE_ALIAS(82) + OPCODE_ALIAS(89) + OPCODE_ALIAS(c2) + OPCODE(e2) + PC++; + DONE + + OPCODE(05) /* ORA ab */ + ZPAGE; + ORA(MEMORY_dGetByte(addr)); + DONE + + OPCODE(06) /* ASL ab */ + ZPAGE; + data = MEMORY_dGetByte(addr); + C = (data & 0x80) ? 1 : 0; + Z = N = data << 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(07) /* ASO ab [unofficial - ASL then ORA with Acc] */ + ZPAGE; + + aso_zpage: + data = MEMORY_dGetByte(addr); + C = (data & 0x80) ? 1 : 0; + data <<= 1; + MEMORY_dPutByte(addr, data); + Z = N = A |= data; + DONE + + OPCODE(08) /* PHP */ + PHPB1; + DONE + + OPCODE(09) /* ORA #ab */ + ORA(IMMEDIATE); + DONE + + OPCODE(0a) /* ASL */ + C = (A & 0x80) ? 1 : 0; + Z = N = A <<= 1; + DONE + + OPCODE_ALIAS(0b) /* ANC #ab [unofficial - AND then copy N to C (Fox) */ + OPCODE(2b) + AND(IMMEDIATE); + C = N >= 0x80; + DONE + + OPCODE(0c) /* NOP abcd [unofficial - skip word] */ + PC += 2; + DONE + + OPCODE(0d) /* ORA abcd */ + ABSOLUTE; + ORA(MEMORY_GetByte(addr)); + DONE + + OPCODE(0e) /* ASL abcd */ + ABSOLUTE; + RMW_GetByte(data, addr); + C = (data & 0x80) ? 1 : 0; + Z = N = data << 1; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(0f) /* ASO abcd [unofficial - ASL then ORA with Acc] */ + ABSOLUTE; + goto aso; + + OPCODE(10) /* BPL */ + BRANCH(!(N & 0x80)) + + OPCODE(11) /* ORA (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + ORA(MEMORY_GetByte(addr)); + DONE + + OPCODE(13) /* ASO (ab),y [unofficial - ASL then ORA with Acc] */ + INDIRECT_Y; + goto aso; + + OPCODE(15) /* ORA ab,x */ + ZPAGE_X; + ORA(MEMORY_dGetByte(addr)); + DONE + + OPCODE(16) /* ASL ab,x */ + ZPAGE_X; + data = MEMORY_dGetByte(addr); + C = (data & 0x80) ? 1 : 0; + Z = N = data << 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(17) /* ASO ab,x [unofficial - ASL then ORA with Acc] */ + ZPAGE_X; + goto aso_zpage; + + OPCODE(18) /* CLC */ + C = 0; + DONE + + OPCODE(19) /* ORA abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + ORA(MEMORY_GetByte(addr)); + DONE + + OPCODE(1b) /* ASO abcd,y [unofficial - ASL then ORA with Acc] */ + ABSOLUTE_Y; + goto aso; + + OPCODE_ALIAS(1c) /* NOP abcd,x [unofficial - skip word] */ + OPCODE_ALIAS(3c) + OPCODE_ALIAS(5c) + OPCODE_ALIAS(7c) + OPCODE_ALIAS(dc) + OPCODE(fc) + if (OP_BYTE + X >= 0x100) + ANTIC_xpos++; + PC += 2; + DONE + + OPCODE(1d) /* ORA abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + ORA(MEMORY_GetByte(addr)); + DONE + + OPCODE(1e) /* ASL abcd,x */ + ABSOLUTE_X; + RMW_GetByte(data, addr); + C = (data & 0x80) ? 1 : 0; + Z = N = data << 1; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(1f) /* ASO abcd,x [unofficial - ASL then ORA with Acc] */ + ABSOLUTE_X; + goto aso; + + OPCODE(20) /* JSR abcd */ + { + UWORD retaddr = GET_PC() + 1; +#ifdef MONITOR_BREAK + CPU_remember_JMP[CPU_remember_jmp_curpos] = GET_PC() - 1; + CPU_remember_jmp_curpos = (CPU_remember_jmp_curpos + 1) % CPU_REMEMBER_JMP_STEPS; + MONITOR_ret_nesting++; +#endif + PHW(retaddr); + } + SET_PC(OP_WORD); + DONE + + OPCODE(21) /* AND (ab,x) */ + INDIRECT_X; + AND(MEMORY_GetByte(addr)); + DONE + + OPCODE(23) /* RLA (ab,x) [unofficial - ROL Mem, then AND with A] */ + INDIRECT_X; + + rla: + RMW_GetByte(data, addr); + if (C) { + C = (data & 0x80) ? 1 : 0; + data = (data << 1) + 1; + } + else { + C = (data & 0x80) ? 1 : 0; + data = (data << 1); + } + MEMORY_PutByte(addr, data); + Z = N = A &= data; + DONE + + OPCODE(24) /* BIT ab */ + ZPAGE; + N = MEMORY_dGetByte(addr); +#ifndef NO_V_FLAG_VARIABLE + V = N & 0x40; +#else + CPU_regP = (CPU_regP & 0xbf) + (N & 0x40); +#endif + Z = (A & N); + DONE + + OPCODE(25) /* AND ab */ + ZPAGE; + AND(MEMORY_dGetByte(addr)); + DONE + + OPCODE(26) /* ROL ab */ + ZPAGE; + data = MEMORY_dGetByte(addr); + Z = N = (data << 1) + C; + C = (data & 0x80) ? 1 : 0; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(27) /* RLA ab [unofficial - ROL Mem, then AND with A] */ + ZPAGE; + + rla_zpage: + data = MEMORY_dGetByte(addr); + if (C) { + C = (data & 0x80) ? 1 : 0; + data = (data << 1) + 1; + } + else { + C = (data & 0x80) ? 1 : 0; + data = (data << 1); + } + MEMORY_dPutByte(addr, data); + Z = N = A &= data; + DONE + + OPCODE(28) /* PLP */ + PLP; + CPUCHECKIRQ; + DONE + + OPCODE(29) /* AND #ab */ + AND(IMMEDIATE); + DONE + + OPCODE(2a) /* ROL */ + Z = N = (A << 1) + C; + C = (A & 0x80) ? 1 : 0; + A = Z; + DONE + + OPCODE(2c) /* BIT abcd */ + ABSOLUTE; + N = MEMORY_GetByte(addr); +#ifndef NO_V_FLAG_VARIABLE + V = N & 0x40; +#else + CPU_regP = (CPU_regP & 0xbf) + (N & 0x40); +#endif + Z = (A & N); + DONE + + OPCODE(2d) /* AND abcd */ + ABSOLUTE; + AND(MEMORY_GetByte(addr)); + DONE + + OPCODE(2e) /* ROL abcd */ + ABSOLUTE; + RMW_GetByte(data, addr); + Z = N = (data << 1) + C; + C = (data & 0x80) ? 1 : 0; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(2f) /* RLA abcd [unofficial - ROL Mem, then AND with A] */ + ABSOLUTE; + goto rla; + + OPCODE(30) /* BMI */ + BRANCH(N & 0x80) + + OPCODE(31) /* AND (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + AND(MEMORY_GetByte(addr)); + DONE + + OPCODE(33) /* RLA (ab),y [unofficial - ROL Mem, then AND with A] */ + INDIRECT_Y; + goto rla; + + OPCODE(35) /* AND ab,x */ + ZPAGE_X; + AND(MEMORY_dGetByte(addr)); + DONE + + OPCODE(36) /* ROL ab,x */ + ZPAGE_X; + data = MEMORY_dGetByte(addr); + Z = N = (data << 1) + C; + C = (data & 0x80) ? 1 : 0; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(37) /* RLA ab,x [unofficial - ROL Mem, then AND with A] */ + ZPAGE_X; + goto rla_zpage; + + OPCODE(38) /* SEC */ + C = 1; + DONE + + OPCODE(39) /* AND abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + AND(MEMORY_GetByte(addr)); + DONE + + OPCODE(3b) /* RLA abcd,y [unofficial - ROL Mem, then AND with A] */ + ABSOLUTE_Y; + goto rla; + + OPCODE(3d) /* AND abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + AND(MEMORY_GetByte(addr)); + DONE + + OPCODE(3e) /* ROL abcd,x */ + ABSOLUTE_X; + RMW_GetByte(data, addr); + Z = N = (data << 1) + C; + C = (data & 0x80) ? 1 : 0; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(3f) /* RLA abcd,x [unofficial - ROL Mem, then AND with A] */ + ABSOLUTE_X; + goto rla; + + OPCODE(40) /* RTI */ + PLP; + data = PL; + SET_PC((PL << 8) + data); + CPUCHECKIRQ; +#ifdef MONITOR_BREAK + if (MONITOR_break_ret && --MONITOR_ret_nesting <= 0) + MONITOR_break_step = TRUE; +#endif + DONE + + OPCODE(41) /* EOR (ab,x) */ + INDIRECT_X; + EOR(MEMORY_GetByte(addr)); + DONE + + OPCODE(43) /* LSE (ab,x) [unofficial - LSR then EOR result with A] */ + INDIRECT_X; + + lse: + RMW_GetByte(data, addr); + C = data & 1; + data >>= 1; + MEMORY_PutByte(addr, data); + Z = N = A ^= data; + DONE + + OPCODE(45) /* EOR ab */ + ZPAGE; + EOR(MEMORY_dGetByte(addr)); + DONE + + OPCODE(46) /* LSR ab */ + ZPAGE; + data = MEMORY_dGetByte(addr); + C = data & 1; + Z = data >> 1; + N = 0; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(47) /* LSE ab [unofficial - LSR then EOR result with A] */ + ZPAGE; + + lse_zpage: + data = MEMORY_dGetByte(addr); + C = data & 1; + data >>= 1; + MEMORY_dPutByte(addr, data); + Z = N = A ^= data; + DONE + + OPCODE(48) /* PHA */ + PH(A); + DONE + + OPCODE(49) /* EOR #ab */ + EOR(IMMEDIATE); + DONE + + OPCODE(4a) /* LSR */ + C = A & 1; + Z = N = A >>= 1; + DONE + + OPCODE(4b) /* ALR #ab [unofficial - Acc AND Data, LSR result] */ + data = A & IMMEDIATE; + C = data & 1; + Z = N = A = (data >> 1); + DONE + + OPCODE(4c) /* JMP abcd */ +#ifdef MONITOR_BREAK + CPU_remember_JMP[CPU_remember_jmp_curpos] = GET_PC() - 1; + CPU_remember_jmp_curpos = (CPU_remember_jmp_curpos + 1) % CPU_REMEMBER_JMP_STEPS; +#endif + SET_PC(OP_WORD); + DONE + + OPCODE(4d) /* EOR abcd */ + ABSOLUTE; + EOR(MEMORY_GetByte(addr)); + DONE + + OPCODE(4e) /* LSR abcd */ + ABSOLUTE; + RMW_GetByte(data, addr); + C = data & 1; + Z = data >> 1; + N = 0; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(4f) /* LSE abcd [unofficial - LSR then EOR result with A] */ + ABSOLUTE; + goto lse; + + OPCODE(50) /* BVC */ +#ifndef NO_V_FLAG_VARIABLE + BRANCH(!V) +#else + BRANCH(!(CPU_regP & 0x40)) +#endif + + OPCODE(51) /* EOR (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + EOR(MEMORY_GetByte(addr)); + DONE + + OPCODE(53) /* LSE (ab),y [unofficial - LSR then EOR result with A] */ + INDIRECT_Y; + goto lse; + + OPCODE(55) /* EOR ab,x */ + ZPAGE_X; + EOR(MEMORY_dGetByte(addr)); + DONE + + OPCODE(56) /* LSR ab,x */ + ZPAGE_X; + data = MEMORY_dGetByte(addr); + C = data & 1; + Z = data >> 1; + N = 0; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(57) /* LSE ab,x [unofficial - LSR then EOR result with A] */ + ZPAGE_X; + goto lse_zpage; + + OPCODE(58) /* CLI */ + CPU_ClrI; + CPUCHECKIRQ; + DONE + + OPCODE(59) /* EOR abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + EOR(MEMORY_GetByte(addr)); + DONE + + OPCODE(5b) /* LSE abcd,y [unofficial - LSR then EOR result with A] */ + ABSOLUTE_Y; + goto lse; + + OPCODE(5d) /* EOR abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + EOR(MEMORY_GetByte(addr)); + DONE + + OPCODE(5e) /* LSR abcd,x */ + ABSOLUTE_X; + RMW_GetByte(data, addr); + C = data & 1; + Z = data >> 1; + N = 0; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(5f) /* LSE abcd,x [unofficial - LSR then EOR result with A] */ + ABSOLUTE_X; + goto lse; + + OPCODE(60) /* RTS */ + data = PL; + SET_PC((PL << 8) + data + 1); +#ifdef MONITOR_BREAK + if (MONITOR_break_ret && --MONITOR_ret_nesting <= 0) + MONITOR_break_step = TRUE; +#endif + if (CPU_rts_handler != NULL) { + CPU_rts_handler(); + CPU_rts_handler = NULL; + } + DONE + + OPCODE(61) /* ADC (ab,x) */ + INDIRECT_X; + data = MEMORY_GetByte(addr); + goto adc; + + OPCODE(63) /* RRA (ab,x) [unofficial - ROR Mem, then ADC to Acc] */ + INDIRECT_X; + + rra: + RMW_GetByte(data, addr); + if (C) { + C = data & 1; + data = (data >> 1) + 0x80; + } + else { + C = data & 1; + data >>= 1; + } + MEMORY_PutByte(addr, data); + goto adc; + + OPCODE(65) /* ADC ab */ + ZPAGE; + data = MEMORY_dGetByte(addr); + goto adc; + + OPCODE(66) /* ROR ab */ + ZPAGE; + data = MEMORY_dGetByte(addr); + Z = N = (C << 7) + (data >> 1); + C = data & 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(67) /* RRA ab [unofficial - ROR Mem, then ADC to Acc] */ + ZPAGE; + + rra_zpage: + data = MEMORY_dGetByte(addr); + if (C) { + C = data & 1; + data = (data >> 1) + 0x80; + } + else { + C = data & 1; + data >>= 1; + } + MEMORY_dPutByte(addr, data); + goto adc; + + OPCODE(68) /* PLA */ + Z = N = A = PL; + DONE + + OPCODE(69) /* ADC #ab */ + data = IMMEDIATE; + goto adc; + + OPCODE(6a) /* ROR */ + Z = N = (C << 7) + (A >> 1); + C = A & 1; + A = Z; + DONE + + OPCODE(6b) /* ARR #ab [unofficial - Acc AND Data, ROR result] */ + /* It does some 'BCD fixup' if D flag is set */ + /* MPC 05/24/00 */ + data = A & IMMEDIATE; + if (CPU_regP & CPU_D_FLAG) { + UBYTE temp = (data >> 1) + (C << 7); + Z = N = temp; +#ifndef NO_V_FLAG_VARIABLE + V = ((temp ^ data) & 0x40); +#else + CPU_regP = (CPU_regP & 0xbf) + ((temp ^ data) & 0x40); +#endif + if ((data & 0x0F) + (data & 0x01) > 5) + temp = (temp & 0xF0) + ((temp + 0x6) & 0x0F); + if (data + (data & 0x10) >= 0x60) { + temp += 0x60; + C = 1; + } + else + C = 0; + A = (UBYTE) temp; + } + else { + Z = N = A = (data >> 1) + (C << 7); + C = data >> 7; +#ifndef NO_V_FLAG_VARIABLE + V = C ^ ((A >> 5) & 1); +#else + CPU_regP = (CPU_regP & 0xbf) + ((A ^ data) & 0x40); +#endif + } + DONE + + OPCODE(6c) /* JMP (abcd) */ +#ifdef MONITOR_BREAK + CPU_remember_JMP[CPU_remember_jmp_curpos] = GET_PC() - 1; + CPU_remember_jmp_curpos = (CPU_remember_jmp_curpos + 1) % CPU_REMEMBER_JMP_STEPS; +#endif + ABSOLUTE; +#ifdef CPU65C02 + /* XXX: if ((UBYTE) addr == 0xff) ANTIC_xpos++; */ + SET_PC(MEMORY_dGetWord(addr)); +#else + /* original 6502 had a bug in JMP (addr) when addr crossed page boundary */ + if ((UBYTE) addr == 0xff) + SET_PC((MEMORY_dGetByte(addr - 0xff) << 8) + MEMORY_dGetByte(addr)); + else + SET_PC(MEMORY_dGetWord(addr)); +#endif + DONE + + OPCODE(6d) /* ADC abcd */ + ABSOLUTE; + data = MEMORY_GetByte(addr); + goto adc; + + OPCODE(6e) /* ROR abcd */ + ABSOLUTE; + RMW_GetByte(data, addr); + Z = N = (C << 7) + (data >> 1); + C = data & 1; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(6f) /* RRA abcd [unofficial - ROR Mem, then ADC to Acc] */ + ABSOLUTE; + goto rra; + + OPCODE(70) /* BVS */ +#ifndef NO_V_FLAG_VARIABLE + BRANCH(V) +#else + BRANCH(CPU_regP & 0x40) +#endif + + OPCODE(71) /* ADC (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + data = MEMORY_GetByte(addr); + goto adc; + + OPCODE(73) /* RRA (ab),y [unofficial - ROR Mem, then ADC to Acc] */ + INDIRECT_Y; + goto rra; + + OPCODE(75) /* ADC ab,x */ + ZPAGE_X; + data = MEMORY_dGetByte(addr); + goto adc; + + OPCODE(76) /* ROR ab,x */ + ZPAGE_X; + data = MEMORY_dGetByte(addr); + Z = N = (C << 7) + (data >> 1); + C = data & 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(77) /* RRA ab,x [unofficial - ROR Mem, then ADC to Acc] */ + ZPAGE_X; + goto rra_zpage; + + OPCODE(78) /* SEI */ + CPU_SetI; + DONE + + OPCODE(79) /* ADC abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + data = MEMORY_GetByte(addr); + goto adc; + + OPCODE(7b) /* RRA abcd,y [unofficial - ROR Mem, then ADC to Acc] */ + ABSOLUTE_Y; + goto rra; + + OPCODE(7d) /* ADC abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + data = MEMORY_GetByte(addr); + goto adc; + + OPCODE(7e) /* ROR abcd,x */ + ABSOLUTE_X; + RMW_GetByte(data, addr); + Z = N = (C << 7) + (data >> 1); + C = data & 1; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(7f) /* RRA abcd,x [unofficial - ROR Mem, then ADC to Acc] */ + ABSOLUTE_X; + goto rra; + + OPCODE(81) /* STA (ab,x) */ + INDIRECT_X; + MEMORY_PutByte(addr, A); + DONE + + /* AXS doesn't change flags and SAX is better name for it (Fox) */ + OPCODE(83) /* SAX (ab,x) [unofficial - Store result A AND X */ + INDIRECT_X; + data = A & X; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(84) /* STY ab */ + ZPAGE; + MEMORY_dPutByte(addr, Y); + DONE + + OPCODE(85) /* STA ab */ + ZPAGE; + MEMORY_dPutByte(addr, A); + DONE + + OPCODE(86) /* STX ab */ + ZPAGE; + MEMORY_dPutByte(addr, X); + DONE + + OPCODE(87) /* SAX ab [unofficial - Store result A AND X] */ + ZPAGE; + data = A & X; + MEMORY_dPutByte(addr, data); + DONE + + OPCODE(88) /* DEY */ + Z = N = --Y; + DONE + + OPCODE(8a) /* TXA */ + Z = N = A = X; + DONE + + OPCODE(8b) /* ANE #ab [unofficial - A AND X AND (Mem OR $EF) to Acc] (Fox) */ + data = IMMEDIATE; + N = Z = A & X & data; + A &= X & (data | 0xef); + DONE + + OPCODE(8c) /* STY abcd */ + ABSOLUTE; + MEMORY_PutByte(addr, Y); + DONE + + OPCODE(8d) /* STA abcd */ + ABSOLUTE; + MEMORY_PutByte(addr, A); + DONE + + OPCODE(8e) /* STX abcd */ + ABSOLUTE; + MEMORY_PutByte(addr, X); + DONE + + OPCODE(8f) /* SAX abcd [unofficial - Store result A AND X] */ + ABSOLUTE; + data = A & X; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(90) /* BCC */ + BRANCH(!C) + + OPCODE(91) /* STA (ab),y */ + INDIRECT_Y; + MEMORY_PutByte(addr, A); + DONE + + OPCODE(93) /* SHA (ab),y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] (Fox) */ + /* It seems previous memory value is important - also in 9f */ + ZPAGE; + data = MEMORY_dGetByte((UBYTE) (addr + 1)); /* Get high byte from zpage */ + data = A & X & (data + 1); + addr = MEMORY_dGetWord(addr) + Y; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(94) /* STY ab,x */ + ZPAGE_X; + MEMORY_dPutByte(addr, Y); + DONE + + OPCODE(95) /* STA ab,x */ + ZPAGE_X; + MEMORY_dPutByte(addr, A); + DONE + + OPCODE(96) /* STX ab,y */ + ZPAGE_Y; + MEMORY_PutByte(addr, X); + DONE + + OPCODE(97) /* SAX ab,y [unofficial - Store result A AND X] */ + ZPAGE_Y; + data = A & X; + MEMORY_dPutByte(addr, data); + DONE + + OPCODE(98) /* TYA */ + Z = N = A = Y; + DONE + + OPCODE(99) /* STA abcd,y */ + ABSOLUTE_Y; + MEMORY_PutByte(addr, A); + DONE + + OPCODE(9a) /* TXS */ + S = X; + DONE + + OPCODE(9b) /* SHS abcd,y [unofficial, UNSTABLE] (Fox) */ + /* Transfer A AND X to S, then store S AND (H+1)] */ + /* S seems to be stable, only memory values vary */ + ABSOLUTE; + S = A & X; + data = S & ((addr >> 8) + 1); + addr += Y; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(9c) /* SHY abcd,x [unofficial - Store Y and (H+1)] (Fox) */ + /* Seems to be stable */ + ABSOLUTE; + /* MPC 05/24/00 */ + data = Y & ((UBYTE) ((addr >> 8) + 1)); + addr += X; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(9d) /* STA abcd,x */ + ABSOLUTE_X; + MEMORY_PutByte(addr, A); + DONE + + OPCODE(9e) /* SHX abcd,y [unofficial - Store X and (H+1)] (Fox) */ + /* Seems to be stable */ + ABSOLUTE; + /* MPC 05/24/00 */ + data = X & ((UBYTE) ((addr >> 8) + 1)); + addr += Y; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(9f) /* SHA abcd,y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] (Fox) */ + ABSOLUTE; + data = A & X & ((addr >> 8) + 1); + addr += Y; + MEMORY_PutByte(addr, data); + DONE + + OPCODE(a0) /* LDY #ab */ + LDY(IMMEDIATE); + DONE + + OPCODE(a1) /* LDA (ab,x) */ + INDIRECT_X; + LDA(MEMORY_GetByte(addr)); + DONE + + OPCODE(a2) /* LDX #ab */ + LDX(IMMEDIATE); + DONE + + OPCODE(a3) /* LAX (ab,x) [unofficial] */ + INDIRECT_X; + Z = N = X = A = MEMORY_GetByte(addr); + DONE + + OPCODE(a4) /* LDY ab */ + ZPAGE; + LDY(MEMORY_dGetByte(addr)); + DONE + + OPCODE(a5) /* LDA ab */ + ZPAGE; + LDA(MEMORY_dGetByte(addr)); + DONE + + OPCODE(a6) /* LDX ab */ + ZPAGE; + LDX(MEMORY_dGetByte(addr)); + DONE + + OPCODE(a7) /* LAX ab [unofficial] */ + ZPAGE; + Z = N = X = A = MEMORY_GetByte(addr); + DONE + + OPCODE(a8) /* TAY */ + Z = N = Y = A; + DONE + + OPCODE(a9) /* LDA #ab */ + LDA(IMMEDIATE); + DONE + + OPCODE(aa) /* TAX */ + Z = N = X = A; + DONE + + OPCODE(ab) /* ANX #ab [unofficial - AND #ab, then TAX] */ + Z = N = X = A &= IMMEDIATE; + DONE + + OPCODE(ac) /* LDY abcd */ + ABSOLUTE; + LDY(MEMORY_GetByte(addr)); + DONE + + OPCODE(ad) /* LDA abcd */ + ABSOLUTE; + LDA(MEMORY_GetByte(addr)); + DONE + + OPCODE(ae) /* LDX abcd */ + ABSOLUTE; + LDX(MEMORY_GetByte(addr)); + DONE + + OPCODE(af) /* LAX abcd [unofficial] */ + ABSOLUTE; + Z = N = X = A = MEMORY_GetByte(addr); + DONE + + OPCODE(b0) /* BCS */ + BRANCH(C) + + OPCODE(b1) /* LDA (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + LDA(MEMORY_GetByte(addr)); + DONE + + OPCODE(b3) /* LAX (ab),y [unofficial] */ + INDIRECT_Y; + NCYCLES_Y; + Z = N = X = A = MEMORY_GetByte(addr); + DONE + + OPCODE(b4) /* LDY ab,x */ + ZPAGE_X; + LDY(MEMORY_dGetByte(addr)); + DONE + + OPCODE(b5) /* LDA ab,x */ + ZPAGE_X; + LDA(MEMORY_dGetByte(addr)); + DONE + + OPCODE(b6) /* LDX ab,y */ + ZPAGE_Y; + LDX(MEMORY_GetByte(addr)); + DONE + + OPCODE(b7) /* LAX ab,y [unofficial] */ + ZPAGE_Y; + Z = N = X = A = MEMORY_GetByte(addr); + DONE + + OPCODE(b8) /* CLV */ +#ifndef NO_V_FLAG_VARIABLE + V = 0; +#else + CPU_ClrV; +#endif + DONE + + OPCODE(b9) /* LDA abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + LDA(MEMORY_GetByte(addr)); + DONE + + OPCODE(ba) /* TSX */ + Z = N = X = S; + DONE + +/* AXA [unofficial - original decode by R.Sterba and R.Petruzela 15.1.1998 :-)] + AXA - this is our new imaginative name for instruction with opcode hex BB. + AXA - Store Mem AND #$FD to Acc and X, then set stackpoint to value (Acc - 4) + It's cool! :-) + LAS - this is better name for this :) (Fox) + It simply ANDs stack pointer with Mem, then transfers result to A and X + */ + + OPCODE(bb) /* LAS abcd,y [unofficial - AND S with Mem, transfer to A and X (Fox) */ + ABSOLUTE_Y; + NCYCLES_Y; + Z = N = A = X = S &= MEMORY_GetByte(addr); + DONE + + OPCODE(bc) /* LDY abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + LDY(MEMORY_GetByte(addr)); + DONE + + OPCODE(bd) /* LDA abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + LDA(MEMORY_GetByte(addr)); + DONE + + OPCODE(be) /* LDX abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + LDX(MEMORY_GetByte(addr)); + DONE + + OPCODE(bf) /* LAX abcd,y [unofficial] */ + ABSOLUTE_Y; + NCYCLES_Y; + Z = N = X = A = MEMORY_GetByte(addr); + DONE + + OPCODE(c0) /* CPY #ab */ + CPY(IMMEDIATE); + DONE + + OPCODE(c1) /* CMP (ab,x) */ + INDIRECT_X; + CMP(MEMORY_GetByte(addr)); + DONE + + OPCODE(c3) /* DCM (ab,x) [unofficial - DEC Mem then CMP with Acc] */ + INDIRECT_X; + + dcm: + RMW_GetByte(data, addr); + data--; + MEMORY_PutByte(addr, data); + CMP(data); + DONE + + OPCODE(c4) /* CPY ab */ + ZPAGE; + CPY(MEMORY_dGetByte(addr)); + DONE + + OPCODE(c5) /* CMP ab */ + ZPAGE; + CMP(MEMORY_dGetByte(addr)); + DONE + + OPCODE(c6) /* DEC ab */ + ZPAGE; + Z = N = MEMORY_dGetByte(addr) - 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(c7) /* DCM ab [unofficial - DEC Mem then CMP with Acc] */ + ZPAGE; + + dcm_zpage: + data = MEMORY_dGetByte(addr) - 1; + MEMORY_dPutByte(addr, data); + CMP(data); + DONE + + OPCODE(c8) /* INY */ + Z = N = ++Y; + DONE + + OPCODE(c9) /* CMP #ab */ + CMP(IMMEDIATE); + DONE + + OPCODE(ca) /* DEX */ + Z = N = --X; + DONE + + OPCODE(cb) /* SBX #ab [unofficial - store ((A AND X) - Mem) in X] (Fox) */ + X &= A; + data = IMMEDIATE; + C = X >= data; + /* MPC 05/24/00 */ + Z = N = X -= data; + DONE + + OPCODE(cc) /* CPY abcd */ + ABSOLUTE; + CPY(MEMORY_GetByte(addr)); + DONE + + OPCODE(cd) /* CMP abcd */ + ABSOLUTE; + CMP(MEMORY_GetByte(addr)); + DONE + + OPCODE(ce) /* DEC abcd */ + ABSOLUTE; + RMW_GetByte(Z, addr); + N = --Z; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(cf) /* DCM abcd [unofficial - DEC Mem then CMP with Acc] */ + ABSOLUTE; + goto dcm; + + OPCODE(d0) /* BNE */ + BRANCH(Z) + + OPCODE(d1) /* CMP (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + CMP(MEMORY_GetByte(addr)); + DONE + + OPCODE(d3) /* DCM (ab),y [unofficial - DEC Mem then CMP with Acc] */ + INDIRECT_Y; + goto dcm; + + OPCODE(d5) /* CMP ab,x */ + ZPAGE_X; + CMP(MEMORY_dGetByte(addr)); + Z = N = A - data; + C = (A >= data); + DONE + + OPCODE(d6) /* DEC ab,x */ + ZPAGE_X; + Z = N = MEMORY_dGetByte(addr) - 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(d7) /* DCM ab,x [unofficial - DEC Mem then CMP with Acc] */ + ZPAGE_X; + goto dcm_zpage; + + OPCODE(d8) /* CLD */ + CPU_ClrD; + DONE + + OPCODE(d9) /* CMP abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + CMP(MEMORY_GetByte(addr)); + DONE + + OPCODE(db) /* DCM abcd,y [unofficial - DEC Mem then CMP with Acc] */ + ABSOLUTE_Y; + goto dcm; + + OPCODE(dd) /* CMP abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + CMP(MEMORY_GetByte(addr)); + DONE + + OPCODE(de) /* DEC abcd,x */ + ABSOLUTE_X; + RMW_GetByte(Z, addr); + N = --Z; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(df) /* DCM abcd,x [unofficial - DEC Mem then CMP with Acc] */ + ABSOLUTE_X; + goto dcm; + + OPCODE(e0) /* CPX #ab */ + CPX(IMMEDIATE); + DONE + + OPCODE(e1) /* SBC (ab,x) */ + INDIRECT_X; + data = MEMORY_GetByte(addr); + goto sbc; + + OPCODE(e3) /* INS (ab,x) [unofficial - INC Mem then SBC with Acc] */ + INDIRECT_X; + + ins: + RMW_GetByte(data, addr); + ++data; + MEMORY_PutByte(addr, data); + goto sbc; + + OPCODE(e4) /* CPX ab */ + ZPAGE; + CPX(MEMORY_dGetByte(addr)); + DONE + + OPCODE(e5) /* SBC ab */ + ZPAGE; + data = MEMORY_dGetByte(addr); + goto sbc; + + OPCODE(e6) /* INC ab */ + ZPAGE; + Z = N = MEMORY_dGetByte(addr) + 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(e7) /* INS ab [unofficial - INC Mem then SBC with Acc] */ + ZPAGE; + + ins_zpage: + data = MEMORY_dGetByte(addr) + 1; + MEMORY_dPutByte(addr, data); + goto sbc; + + OPCODE(e8) /* INX */ + Z = N = ++X; + DONE + + OPCODE_ALIAS(e9) /* SBC #ab */ + OPCODE(eb) /* SBC #ab [unofficial] */ + data = IMMEDIATE; + goto sbc; + + OPCODE_ALIAS(ea) /* NOP */ + OPCODE_ALIAS(1a) /* NOP [unofficial] */ + OPCODE_ALIAS(3a) + OPCODE_ALIAS(5a) + OPCODE_ALIAS(7a) + OPCODE_ALIAS(da) + OPCODE(fa) + DONE + + OPCODE(ec) /* CPX abcd */ + ABSOLUTE; + CPX(MEMORY_GetByte(addr)); + DONE + + OPCODE(ed) /* SBC abcd */ + ABSOLUTE; + data = MEMORY_GetByte(addr); + goto sbc; + + OPCODE(ee) /* INC abcd */ + ABSOLUTE; + RMW_GetByte(Z, addr); + N = ++Z; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(ef) /* INS abcd [unofficial - INC Mem then SBC with Acc] */ + ABSOLUTE; + goto ins; + + OPCODE(f0) /* BEQ */ + BRANCH(!Z) + + OPCODE(f1) /* SBC (ab),y */ + INDIRECT_Y; + NCYCLES_Y; + data = MEMORY_GetByte(addr); + goto sbc; + + OPCODE(f3) /* INS (ab),y [unofficial - INC Mem then SBC with Acc] */ + INDIRECT_Y; + goto ins; + + OPCODE(f5) /* SBC ab,x */ + ZPAGE_X; + data = MEMORY_dGetByte(addr); + goto sbc; + + OPCODE(f6) /* INC ab,x */ + ZPAGE_X; + Z = N = MEMORY_dGetByte(addr) + 1; + MEMORY_dPutByte(addr, Z); + DONE + + OPCODE(f7) /* INS ab,x [unofficial - INC Mem then SBC with Acc] */ + ZPAGE_X; + goto ins_zpage; + + OPCODE(f8) /* SED */ + CPU_SetD; + DONE + + OPCODE(f9) /* SBC abcd,y */ + ABSOLUTE_Y; + NCYCLES_Y; + data = MEMORY_GetByte(addr); + goto sbc; + + OPCODE(fb) /* INS abcd,y [unofficial - INC Mem then SBC with Acc] */ + ABSOLUTE_Y; + goto ins; + + OPCODE(fd) /* SBC abcd,x */ + ABSOLUTE_X; + NCYCLES_X; + data = MEMORY_GetByte(addr); + goto sbc; + + OPCODE(fe) /* INC abcd,x */ + ABSOLUTE_X; + RMW_GetByte(Z, addr); + N = ++Z; + MEMORY_PutByte(addr, Z); + DONE + + OPCODE(ff) /* INS abcd,x [unofficial - INC Mem then SBC with Acc] */ + ABSOLUTE_X; + goto ins; + +#ifdef ASAP + + OPCODE_ALIAS(d2) + OPCODE_ALIAS(f2) + +#else + + OPCODE(d2) /* ESCRTS #ab (CIM) - on Atari is here instruction CIM [unofficial] !RS! */ + data = IMMEDIATE; + UPDATE_GLOBAL_REGS; + CPU_GetStatus(); + ESC_Run(data); + CPU_PutStatus(); + UPDATE_LOCAL_REGS; + data = PL; + SET_PC((PL << 8) + data + 1); +#ifdef MONITOR_BREAK + if (MONITOR_break_ret && --MONITOR_ret_nesting <= 0) + MONITOR_break_step = TRUE; +#endif + DONE + + OPCODE(f2) /* ESC #ab (CIM) - on Atari is here instruction CIM [unofficial] !RS! */ + /* OPCODE(ff: ESC #ab - opcode FF is now used for INS [unofficial] instruction !RS! */ + data = IMMEDIATE; + UPDATE_GLOBAL_REGS; + CPU_GetStatus(); + ESC_Run(data); + CPU_PutStatus(); + UPDATE_LOCAL_REGS; + DONE + +#endif /* ASAP */ + + OPCODE_ALIAS(02) /* CIM [unofficial - crash intermediate] */ + OPCODE_ALIAS(12) + OPCODE_ALIAS(22) + OPCODE_ALIAS(32) + OPCODE_ALIAS(42) + OPCODE_ALIAS(52) + OPCODE_ALIAS(62) + OPCODE_ALIAS(72) + OPCODE_ALIAS(92) + OPCODE(b2) + +#ifdef ASAP + + ASAP_CIM(); + DONE + +#else + + /* OPCODE(d2) Used for ESCRTS #ab (CIM) */ + /* OPCODE(f2) Used for ESC #ab (CIM) */ + PC--; + UPDATE_GLOBAL_REGS; + CPU_GetStatus(); + +#ifdef CRASH_MENU + UI_crash_address = GET_PC(); + UI_crash_afterCIM = GET_PC() + 1; + UI_crash_code = insn; + UI_Run(); +#else + CPU_cim_encountered = TRUE; + ENTER_MONITOR; +#endif /* CRASH_MENU */ + + CPU_PutStatus(); + UPDATE_LOCAL_REGS; + DONE + +#endif /* ASAP */ + +/* ---------------------------------------------- */ +/* ADC and SBC routines */ + + adc: + if (!(CPU_regP & CPU_D_FLAG)) { + /* Binary mode */ + unsigned int tmp; + tmp = A + data + C; + C = tmp > 0xff; + /* C = tmp >> 8; */ +#ifndef NO_V_FLAG_VARIABLE + V = !((A ^ data) & 0x80) && ((data ^ tmp) & 0x80); +#else + CPU_ClrV; + if (!((A ^ data) & 0x80) && ((data ^ tmp) & 0x80)) + CPU_SetV; +#endif + Z = N = A = (UBYTE) tmp; + } + else { + /* Decimal mode */ + unsigned int tmp; + tmp = (A & 0x0f) + (data & 0x0f) + C; + if (tmp >= 10) + tmp = (tmp - 10) | 0x10; + tmp += (A & 0xf0) + (data & 0xf0); + + Z = A + data + C; + N = (UBYTE) tmp; +#ifndef NO_V_FLAG_VARIABLE + V = !((A ^ data) & 0x80) && ((data ^ tmp) & 0x80); +#else + CPU_ClrV; + if (!((A ^ data) & 0x80) && ((data ^ tmp) & 0x80)) + CPU_SetV; +#endif + + if (tmp > 0x9f) + tmp += 0x60; + C = tmp > 0xff; + A = (UBYTE) tmp; + } + DONE + + sbc: + if (!(CPU_regP & CPU_D_FLAG)) { + /* Binary mode */ + unsigned int tmp; + /* tmp = A - data - !C; */ + tmp = A - data - 1 + C; + C = tmp < 0x100; +#ifndef NO_V_FLAG_VARIABLE + V = ((A ^ tmp) & 0x80) && ((A ^ data) & 0x80); +#else + CPU_ClrV; + if (((A ^ tmp) & 0x80) && ((A ^ data) & 0x80)) + CPU_SetV; +#endif + Z = N = A = (UBYTE) tmp; + } + else { + /* Decimal mode */ + unsigned int al, ah, tmp; + /* tmp = A - data - !C; */ + tmp = A - data - 1 + C; + /* al = (A & 0x0f) - (data & 0x0f) - !C; */ + al = (A & 0x0f) - (data & 0x0f) - 1 + C; /* Calculate lower nybble */ + ah = (A >> 4) - (data >> 4); /* Calculate upper nybble */ + if (al & 0x10) { + al -= 6; /* BCD fixup for lower nybble */ + ah--; + } + if (ah & 0x10) + ah -= 6; /* BCD fixup for upper nybble */ + + C = tmp < 0x100; /* Set flags */ +#ifndef NO_V_FLAG_VARIABLE + V = ((A ^ tmp) & 0x80) && ((A ^ data) & 0x80); +#else + CPU_ClrV; + if (((A ^ tmp) & 0x80) && ((A ^ data) & 0x80)) + CPU_SetV; +#endif + Z = N = (UBYTE) tmp; + + A = (ah << 4) + (al & 0x0f); /* Compose result */ + } + DONE + +#ifdef NO_GOTO + } +#else + next: +#endif + +#ifdef MONITOR_BREAK + if (MONITOR_break_step) { + DO_BREAK; + } +#endif + /* This "continue" does nothing here. + But it is necessary because, if we're not using NO_GOTO nor MONITOR_BREAK, + gcc can complain: "error: label at end of compound statement". */ + continue; + } + + UPDATE_GLOBAL_REGS; +} + +void CPU_Initialise(void) +{ +} + +#endif /* FALCON_CPUASM */ + +void CPU_Reset(void) +{ +#ifdef MONITOR_PROFILE + memset(CPU_instruction_count, 0, sizeof(CPU_instruction_count)); +#endif + + CPU_IRQ = 0; + + CPU_regP = 0x34; /* The unused bit is always 1, I flag set! */ + CPU_PutStatus(); /* Make sure flags are all updated */ + CPU_regS = 0xff; + CPU_regPC = MEMORY_dGetWordAligned(0xfffc); +} + +#if !defined(BASIC) && !defined(ASAP) + +void CPU_StateSave(UBYTE SaveVerbose) +{ + StateSav_SaveUBYTE(&CPU_regA, 1); + + CPU_GetStatus(); /* Make sure flags are all updated */ + StateSav_SaveUBYTE(&CPU_regP, 1); + + StateSav_SaveUBYTE(&CPU_regS, 1); + StateSav_SaveUBYTE(&CPU_regX, 1); + StateSav_SaveUBYTE(&CPU_regY, 1); + StateSav_SaveUBYTE(&CPU_IRQ, 1); + + MEMORY_StateSave(SaveVerbose); + + StateSav_SaveUWORD(&CPU_regPC, 1); +} + +void CPU_StateRead(UBYTE SaveVerbose, UBYTE StateVersion) +{ + StateSav_ReadUBYTE(&CPU_regA, 1); + + StateSav_ReadUBYTE(&CPU_regP, 1); + CPU_PutStatus(); /* Make sure flags are all updated */ + + StateSav_ReadUBYTE(&CPU_regS, 1); + StateSav_ReadUBYTE(&CPU_regX, 1); + StateSav_ReadUBYTE(&CPU_regY, 1); + StateSav_ReadUBYTE(&CPU_IRQ, 1); + + MEMORY_StateRead(SaveVerbose, StateVersion); + + StateSav_ReadUWORD(&CPU_regPC, 1); +} + +#endif diff --git a/PVAtari800/atari800-src/cpu.h b/PVAtari800/atari800-src/cpu.h new file mode 100644 index 0000000000..5e64ca274c --- /dev/null +++ b/PVAtari800/atari800-src/cpu.h @@ -0,0 +1,77 @@ +#ifndef CPU_H_ +#define CPU_H_ + +#include "config.h" +#ifdef ASAP /* external project, see http://asap.sf.net */ +#include "asap_internal.h" +#else +#include "atari.h" +#endif + +#define CPU_N_FLAG 0x80 +#define CPU_V_FLAG 0x40 +#define CPU_B_FLAG 0x10 +#define CPU_D_FLAG 0x08 +#define CPU_I_FLAG 0x04 +#define CPU_Z_FLAG 0x02 +#define CPU_C_FLAG 0x01 + +void CPU_Initialise(void); /* used in the assembler version of cpu.c only */ +void CPU_GetStatus(void); +void CPU_PutStatus(void); +void CPU_Reset(void); +void CPU_StateSave(UBYTE SaveVerbose); +void CPU_StateRead(UBYTE SaveVerbose, UBYTE StateVersion); +void CPU_NMI(void); +void CPU_GO(int limit); +#define CPU_GenerateIRQ() (CPU_IRQ = 1) + +#ifdef FALCON_CPUASM +extern void CPU_INIT(void); +extern void CPU_GET(void); /* put from CCR, N & Z FLAG into regP */ +extern void CPU_PUT(void); /* put from regP into CCR, N & Z FLAG */ +#endif + +extern UWORD CPU_regPC; +extern UBYTE CPU_regA; +extern UBYTE CPU_regP; +extern UBYTE CPU_regS; +extern UBYTE CPU_regY; +extern UBYTE CPU_regX; + +#define CPU_SetN CPU_regP |= CPU_N_FLAG +#define CPU_ClrN CPU_regP &= (~CPU_N_FLAG) +#define CPU_SetV CPU_regP |= CPU_V_FLAG +#define CPU_ClrV CPU_regP &= (~CPU_V_FLAG) +#define CPU_SetB CPU_regP |= CPU_B_FLAG +#define CPU_ClrB CPU_regP &= (~CPU_B_FLAG) +#define CPU_SetD CPU_regP |= CPU_D_FLAG +#define CPU_ClrD CPU_regP &= (~CPU_D_FLAG) +#define CPU_SetI CPU_regP |= CPU_I_FLAG +#define CPU_ClrI CPU_regP &= (~CPU_I_FLAG) +#define CPU_SetZ CPU_regP |= CPU_Z_FLAG +#define CPU_ClrZ CPU_regP &= (~CPU_Z_FLAG) +#define CPU_SetC CPU_regP |= CPU_C_FLAG +#define CPU_ClrC CPU_regP &= (~CPU_C_FLAG) + +extern UBYTE CPU_IRQ; + +extern void (*CPU_rts_handler)(void); + +extern UBYTE CPU_cim_encountered; + +#define CPU_REMEMBER_PC_STEPS 64 +extern UWORD CPU_remember_PC[CPU_REMEMBER_PC_STEPS]; +extern UBYTE CPU_remember_op[CPU_REMEMBER_PC_STEPS][3]; +extern unsigned int CPU_remember_PC_curpos; +extern int CPU_remember_xpos[CPU_REMEMBER_PC_STEPS]; + +#define CPU_REMEMBER_JMP_STEPS 16 +extern UWORD CPU_remember_JMP[CPU_REMEMBER_JMP_STEPS]; +extern unsigned int CPU_remember_jmp_curpos; + +#ifdef MONITOR_PROFILE +extern int CPU_instruction_count[256]; +#endif + +#endif /* CPU_H_ */ diff --git a/PVAtari800/atari800-src/cpu_m68k.S b/PVAtari800/atari800-src/cpu_m68k.S new file mode 100644 index 0000000000..fbd1e367d3 --- /dev/null +++ b/PVAtari800/atari800-src/cpu_m68k.S @@ -0,0 +1,4002 @@ +| cpu_m68k.S - 6502 CPU emulation for Motorola 68000 based hosts +| such are Atari ST/TT/Falcon and clones, or Amiga, or old Mac. +| +| Copyright (C) 2001 Karel Rous (empty head) +| Copyright (C) 2001-2003 Atari800 development team (see DOC/CREDITS) +| +| This file is part of the Atari800 emulator project which emulates +| the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. +| +| Atari800 is free software; you can redistribute it and/or modify +| it under the terms of the GNU General Public License as published by +| the Free Software Foundation; either version 2 of the License, or +| (at your option) any later version. +| +| Atari800 is distributed in the hope that it will be useful, +| but WITHOUT ANY WARRANTY; without even the implied warranty of +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +| GNU General Public License for more details. +| +| You should have received a copy of the GNU General Public License +| along with Atari800; if not, write to the Free Software +| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +| +| Last changes : 30th March 2003, gerhard.janka +| Converted from Devpac to GCC syntax by Petr Stehlik, no functional changes + +| P65C02 ; we emulate this version of processor (6502 has a bug in jump code, + | you can emulate this bug by commenting out this line :) +| PROFILE ; fills the 'instruction_count' array for instruction profiling +| MONITOR_BREAK ; jump to monitor at break +| CRASH_MENU ; enable crash menu output +| CYCLE_EXACT ; !NO_CYCLE_EXACT :) +| NEW_CYCLE_EXACT ; !NO_NEW_CYCLE_EXACT :) + + .globl _CART_BountyBob2 + .globl _CART_BountyBob1 + .globl _GTIA_GetByte + .globl _POKEY_GetByte + .globl _PIA_GetByte + .globl _ANTIC_GetByte + .globl _CART_GetByte + .globl _GTIA_PutByte + .globl _POKEY_PutByte + .globl _PIA_PutByte + .globl _ANTIC_PutByte + .globl _CART_PutByte + .globl _Atari800_RunEsc + .globl _Atari800_Exit + .globl _exit + .globl _wsync_halt |CPU is stopped + #ifdef NEW_CYCLE_EXACT + .globl _delayed_wsync + .globl _antic2cpu_ptr + .globl _cur_screen_pos + #endif + .globl _xpos + .globl _xpos_limit + .globl _regPC + .globl _regA + .globl _regP |/* Processor Status Byte (Partial) */ + .globl _regS + .globl _regX + .globl _regY + .globl _memory + .globl _attrib + #ifdef PROFILE + .globl _instruction_count + #endif + #ifdef MONITOR_BREAK + .globl _remember_PC + .globl _remember_PC_curpos + #ifdef NEW_CYCLE_EXACT + .globl _remember_xpos + .globl _remember_xpos_curpos + #endif + .globl _remember_JMP + .globl _remember_jmp_curpos + .globl _ypos_break_addr + .globl _ypos + .globl _break_addr + .globl _break_step + .globl _break_ret + .globl _break_cim + .globl _break_here + .globl _brkhere + .globl _ret_nesting + #endif + #ifdef CRASH_MENU + .globl _crash_code + .globl _crash_address + .globl _crash_afterCIM + #endif + .globl _IRQ + .globl _NMI + .globl _RTI + .globl _GO + .globl _CPUGET + .globl _CPUPUT + .globl _CPU_INIT + .globl _cycles |temporarily needed outside :) + .globl _cim_encountered + .globl _rts_handler + + #ifdef MONITOR_BREAK + +#define rem_pc_steps 64 // has to be equal to REMEMBER_PC_STEPS +#define rem_jmp_steps 16 // has to be equal to REMEMBER_JMP_STEPS + +remember_PC: +_remember_PC: + ds.w rem_pc_steps |REMEMBER_PC_STEPS +remember_PC_curpos: +_remember_PC_curpos: + ds.l 1 +remember_xpos: +_remember_xpos: + ds.l rem_pc_steps |REMEMBER_PC_STEPS +remember_xpos_curpos: +_remember_xpos_curpos: + ds.l 1 + +remember_JMP: +_remember_JMP: + ds.w rem_jmp_steps |REMEMBER_JMP_STEPS +remember_jmp_curpos: +_remember_jmp_curpos: + ds.l 1 + + #endif + + .even + + .align 4 | doubleword alignment + +regP: + ds.b 1 ; +_regP: ds.b 1 | CCR + +regA: + ds.b 1 +_regA: ds.b 1 | A + +regX: + ds.b 1 +_regX: ds.b 1 | X + +regY: + ds.b 1 +_regY: ds.b 1 | Y + +regPC: +_regPC: ds.w 1 | PC + +regS: + ds.b 1 +_regS: ds.b 1 | stack + +IRQ: +_IRQ: ds.b 1 + ds.b 1 | dummy + +_cim_encountered: + ds.b 1 + +_rts_handler: + ds.l 1 + + .even + +#define memory_pointer a5 +#define attrib_pointer a4 +#define PC6502 a2 + +#define CD a6 /* cycles counter up */ +#define ZFLAG d1 /* Bit 0..7 */ +#define NFLAG d1 /* Bit 8..15 */ +#define VFLAG d6 /* Bit 7 */ +#define DFLAG d6 /* Bit 15 */ +#define CFLAG d5 /* Bit 0..7, ( 1 = ff ) */ +#define A d2 +#define X d3 +#define Y d4 + +|d0 contains usually address where we are working or temporary value +|d7 contains is a working register or address + +|these are bit in MC68000 CCR register +#define NB68 3 +#define EB68 4 // X +#define ZB68 2 +#define OB68 1 +#define CB68 0 + +#define WSYNC_C 106 + +#define N_FLAG 0x80 +#define N_FLAGN 0x7f +#define N_FLAGB 7 +#define V_FLAG 0x40 +#define V_FLAGN 0xbf +#define V_FLAGB 6 +#define G_FLAG 0x20 +#define G_FLAGB 5 +#define B_FLAG 0x10 +#define B_FLAGN 0xef +#define B_FLAGB 4 +#define D_FLAG 0x08 +#define D_FLAGN 0xf7 +#define D_FLAGB 3 +#define I_FLAG 0x04 +#define I_FLAGN 0xfb +#define I_FLAGB 2 +#define Z_FLAG 0x02 +#define Z_FLAGN 0xfd +#define Z_FLAGB 1 +#define C_FLAG 0x01 +#define C_FLAGN 0xfe +#define C_FLAGB 0 +#define VCZN_FLAGS 0xc3 +#define VCZN_FLAGSN 0x3c + +/* cycles per instruction */ +#define cy_CIM 2 +#define cy_NOP 2 +#define cy_NOP2 2 +#define cy_NOP3 3 +#define cy_NOP4 4 +#define cy_SKW 4 +#define cy_BRK 7 +#define cy_Sub 6 +#define cy_Bcc 2 +#define cy_Bcc1 3 +#define cy_Bcc2 4 +#define cy_JmpAbs 3 +#define cy_JmpInd 5 +#define cy_IndX 6 // indirect X +#define cy_IndY 5 // indirect Y +#define cy_IndY2 6 // indirect Y (+) +#define cy_IndX_RW 8 // indirect X read/write ( all inofficial ) +#define cy_IndY_RW 8 // indirect Y read/write ( all inofficial ) +#define cy_Abs 4 // absolute +#define cy_Abs_RW 6 // absolute read/write +#define cy_AbsX 4 // absolute X +#define cy_AbsX2 5 // absolute X (+) +#define cy_AbsX_RW 7 // absolute X read/write +#define cy_AbsY 4 // absolute Y +#define cy_AbsY2 5 // absolute X (+) +#define cy_AbsY_RW 7 // absolute Y read/write ( all inofficial ) +#define cy_ZP 3 // zero page +#define cy_ZP_RW 5 // zero page read/write +#define cy_ZPX 4 // zero page X +#define cy_ZPX_RW 6 // zero page X read/write +#define cy_ZPY 4 // zero page X +#define cy_Imm 2 // immediate +#define cy_FlagCS 2 // flag clear/set +#define cy_RegChg 2 // register only manipulation +#define cy_RegPH 3 // push register to stack +#define cy_RegPL 4 // pull register from stack + + .macro LoHi p1 |change order of lo and hi byte (address) + ror.w #8,\p1 + .endm + +| ========================================================== +| Emulated Registers and Flags are kept local to this module +| ========================================================== + +| regP=processor flags; regPC=PC; regA=A; regX=X; regY=Y + .macro UPDATE_GLOBAL_REGS + sub.l memory_pointer,PC6502 + movem.w d0/d2-d4/a2,regP // d0->regP, d2-d4 (A,X,Y) a2 (regPC) + .endm + +| PC=regPC; A=regA; X=regX; Y=regY + .macro UPDATE_LOCAL_REGS + moveq #0,d7 + move.w regP,d0 + move.w regA,d2 + move.w regX,d3 + move.w regY,d4 + move.w regPC,d7 + move.l memory_pointer,PC6502 + add.l d7,PC6502 + lea OPMODE_TABLE,a3 + btst #D_FLAGB,_regP + beq.s PDATE_LOCAL_REGS_upd_end\@ + lea OPMODE_TABLE_D,a3 +PDATE_LOCAL_REGS_upd_end\@: + .endm + +_Local_GetByte: + move.l d7,d1 + moveq #0,d0 + move.b d1,d0 + lsr.w #8,d1 + move.b (HIxTable,d1.l),d1 +| jmp ([GetTable,PC,d1.l*4]) + move.w (GetTable,PC,d1.l*2),d1 + jmp (GetTable,d1.w) + +GetTable: + .word GetNone-GetTable,GetGTIA-GetTable + .word GetPOKEY-GetTable,GetPIA-GetTable + .word GetANTIC-GetTable,GetCART-GetTable + .word ItsBob1-GetTable,ItsBob2-GetTable + +GetNone: + st d0 | higher bytes are 0 from before + rts +GetGTIA: + move.l d0,-(a7) + jsr _GTIA_GetByte + addq.l #4,a7 + rts +GetPOKEY: + move.l d0,-(a7) + jsr _POKEY_GetByte + addq.l #4,a7 + rts +GetPIA: + move.l d0,-(a7) + jsr _PIA_GetByte + addq.l #4,a7 + rts +GetANTIC: + move.l d0,-(a7) + jsr _ANTIC_GetByte + addq.l #4,a7 + rts +GetCART: + move.l d0,-(a7) + jsr _CART_GetByte + addq.l #4,a7 + rts +ItsBob2: + move.w d7,-(a7) + clr.w -(a7) + jsr _CART_BountyBob2 + addq.l #4,a7 + moveq #0,d0 + rts +ItsBob1: + move.w d7,-(a7) + clr.w -(a7) + jsr _CART_BountyBob1 + addq.l #4,a7 + moveq #0,d0 + rts + +_Local_PutByte: + moveq #0,d1 + move.w d7,d1 + lsr.w #8,d1 + move.b (HIxTable,d1.l),d1 + jmp ([PutTable,PC,d1.l*4]) + +PutTable: + .long PutNone,PutGTIA,PutPOKEY,PutPIA + .long PutANTIC,PutCART,ItsBob1,ItsBob2 + +PutNone: + moveq #0,d0 + rts +PutGTIA: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + #ifdef CYCLE_EXACT + move.l CD,_xpos + #endif + jsr _GTIA_PutByte + addq.l #8,a7 + rts +PutPOKEY: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + #ifdef CYCLE_EXACT + move.l CD,_xpos + #endif + jsr _POKEY_PutByte + addq.l #8,a7 + rts +PutPIA: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + jsr _PIA_PutByte + addq.l #8,a7 + rts +PutANTIC: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + move.l CD,_xpos + jsr _ANTIC_PutByte + move.l _xpos,CD + addq.l #8,a7 + rts +PutCART: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + jsr _CART_PutByte + addq.l #8,a7 + rts + +#define HIxNone 0 +#define HIxGTIA8 1 +#define HIxGTIA5 1 +#define HIxPOKEY8 2 +#define HIxPOKEY5 2 +#define HIxPIA8 3 +#define HIxANTIC8 4 +#define HIxCART 5 +#define HIxBob1 6 +#define HIxBob2 7 + +HIxTable: + .byte HIxNone,HIxNone,HIxNone,HIxNone | 00..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 04..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 08..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | 0c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 10..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 14..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 18..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | 1c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 20..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 24..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 28..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | 2c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 30..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 34..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 38..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | 3c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 40..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 44..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 48..b + .byte HIxNone,HIxNone,HIxNone,HIxBob1 | 4c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 50..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 54..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 58..b + .byte HIxNone,HIxNone,HIxNone,HIxBob2 | 5c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 60..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 64..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 68..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | 6c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 70..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 74..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 78..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | 7c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 80..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 84..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 88..b + .byte HIxNone,HIxNone,HIxNone,HIxBob1 | 8c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | 90..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 94..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | 98..b + .byte HIxNone,HIxNone,HIxNone,HIxBob2 | 9c..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | a0..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | a4..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | a8..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | ac..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | b0..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | b4..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | b8..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | bc..f + .byte HIxGTIA5,HIxNone,HIxNone,HIxNone | c0..3 + .byte HIxNone,HIxNone,HIxNone,HIxNone | c4..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | c8..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | cc..f + .byte HIxGTIA8,HIxNone,HIxPOKEY8,HIxPIA8 | d0..3 + .byte HIxANTIC8,HIxCART,HIxNone,HIxNone | d4..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | d8..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | dc..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | e0..3 + .byte HIxNone,HIxNone,HIxNone,HIxNone | e4..7 + .byte HIxPOKEY5,HIxNone,HIxNone,HIxPOKEY5 | e8..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | ec..f + .byte HIxNone,HIxNone,HIxNone,HIxNone | f0..3 + .byte HIxNone,HIxNone,HIxNone,HIxNone | f4..7 + .byte HIxNone,HIxNone,HIxNone,HIxNone | f8..b + .byte HIxNone,HIxNone,HIxNone,HIxNone | fc..f + + .macro EXE_GETBYTE +| move.l d7,-(a7) + jsr _Local_GetByte +| addq.l #4,a7 ;put stack onto right place + .endm + + .macro EXE_PUTBYTE p1 +| clr.l -(a7) +| move.b \p1,3(a7) ;byte + jsr _Local_PutByte +| addq.l #8,a7 + .endm + + .macro RMW_GETBYTE + #ifdef CYCLE_EXACT + move.w d7,d0 + and.w #0xef1f,d0 + cmp.w #0xc01a,d0 + bne.s MW_GETBYTE_normal_get + EXE_GETBYTE + subq.l #1,CD + move.l d0,-(a7) + EXE_PUTBYTE d0 + move.l (a7)+,d0 + addq.l #1,CD + bra.s MW_GETBYTE_end_rmw_get +MW_GETBYTE_normal_get: + EXE_GETBYTE +MW_GETBYTE_end_rmw_get: + #else + EXE_GETBYTE + #endif + .endm + +_CPU_INIT: + #ifdef MONITOR_BREAK + moveq #0,d0 + move.l d0,_remember_PC_curpos + move.l d0,_remember_xpos_curpos + move.l d0,_remember_jmp_curpos + #endif + moveq #1,d0 | set regS to page 1 + move.b d0,regS + rts + + .macro SetI + ori.b #I_FLAG,_regP + .endm + + .macro ClrI + andi.b #I_FLAGN,_regP + .endm + + .macro SetB + ori.b #B_FLAG,_regP + .endm + + .macro SetD + ori.b #D_FLAG,_regP + lea OPMODE_TABLE_D,a3 + .endm + + .macro ClrD + andi.b #D_FLAGN,_regP + lea OPMODE_TABLE,a3 + .endm + +|static UBYTE N; /* bit7 zero (0) or bit 7 non-zero (1) */ +|static UBYTE Z; /* zero (0) or non-zero (1) */ +|static UBYTE V; +|static UBYTE C; /* zero (0) or one(1) */ + +#define isRAM 0 +#define isROM 1 +#define isHARDWARE 2 + +|/* +| * The following array is used for 6502 instruction profiling +| */ + +|int instruction_count[256]; + +|UBYTE memory[65536]; +|UBYTE attrib[65536]; + +|/* +| =============================================================== +| Z flag: This actually contains the result of an operation which +| would modify the Z flag. The value is tested for +| equality by the BEQ and BNE instruction. +| =============================================================== +|*/ + +| Bit : 76543210 +| 68000 : ***XNZVC +| _RegP : NV*BDIZC + + .macro ConvertSTATUS_RegP p1 + move.b _regP,\p1 |put flag BDI into d0 + andi.b #VCZN_FLAGSN,\p1 | clear overflow, carry, zero & negative flag + tst.b CFLAG + beq.s onvertSTATUS_RegP_SETC\@ + addq.b #1,\p1 +onvertSTATUS_RegP_SETC\@: + tst.w NFLAG + bpl.s onvertSTATUS_RegP_SETN\@ +| ori.b #N_FLAG,\p1 + tas \p1 +onvertSTATUS_RegP_SETN\@: + tst.b ZFLAG + bne.s onvertSTATUS_RegP_SETZ\@ | beware! reverse compare is ok + addq.b #2,\p1 +onvertSTATUS_RegP_SETZ\@: + tst.b VFLAG + bpl.s onvertSTATUS_RegP_SETV\@ | !!! + ori.b #V_FLAG,\p1 +onvertSTATUS_RegP_SETV\@: + .endm + + .macro ConvertSTATUS_RegP_destroy p1 + move.b _regP,\p1 |put flag BDI into d0 + andi.b #VCZN_FLAGSN,\p1 | clear overflow, carry, zero & negative flag + lsr.b #7,CFLAG + or.b CFLAG,\p1 + tst.w NFLAG + bpl.s onvertSTATUS_RegP_destroy_SETN\@ +| ori.b #N_FLAG,\p1 + tas \p1 +onvertSTATUS_RegP_destroy_SETN\@: + tst.b ZFLAG + bne.s onvertSTATUS_RegP_destroy_SETZ\@ | beware! reverse compare is ok + addq.b #2,\p1 +onvertSTATUS_RegP_destroy_SETZ\@: + tst.b VFLAG + bpl.s onvertSTATUS_RegP_destroy_SETV\@ | !!! + ori.b #V_FLAG,\p1 +onvertSTATUS_RegP_destroy_SETV\@: + .endm + + .macro ConvertRegP_STATUS p1 + btst #V_FLAGB,\p1 + sne VFLAG + btst #C_FLAGB,\p1 + sne CFLAG + move.b \p1,NFLAG + lsl.w #8,NFLAG | sets NFLAG and clears ZFLAG + btst #Z_FLAGB,\p1 + seq ZFLAG + .endm + + .macro Call_Atari800_RunEsc +| move.l d7,-(a7) !!!TEST!!! + clr.l -(a7) |!!!TEST!!! + move.b d7,(3,a7) |!!!TEST!!! + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + jsr _Atari800_RunEsc + addq.l #4,a7 + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + .endm + + .macro Call_Atari800_Exit_true + pea 0x1.W + jsr _Atari800_Exit + addq.l #4,a7 + tst.l d0 + bne.s all_Atari800_Exit_true_GOON\@ + clr.l -(a7) + jsr _exit +all_Atari800_Exit_true_GOON\@: + .endm + + .macro PLW p1 p2 + moveq #0,\p2 + move.w regS,\p2 + addq.b #2,\p2 | wrong way around + move.b (memory_pointer,\p2.l),\p1 + asl.w #8,\p1 + subq.b #1,\p2 + or.b (memory_pointer,\p2.l),\p1 + addq.b #1,\p2 + move.b \p2,_regS + .endm + + .macro SetVFLAG + st VFLAG + .endm + + .macro ClrVFLAG + clr.b VFLAG + .endm + + .macro SetCFLAG + st CFLAG + .endm + + .macro ClrCFLAG + clr.b CFLAG + .endm + +CPUGET: +_CPUGET: + ConvertSTATUS_RegP d0 + move.b d0,_regP + rts + +CPUPUT: +_CPUPUT: + move.b _regP,d0 + ConvertRegP_STATUS d0 + rts + +NMI: +_NMI: + lea _memory,a0 + moveq #0,d1 + move.w regS,d1 + move.b _regPC,(a0,d1.l) + subq.b #1,d1 + move.b _regPC+1,(a0,d1.l) + subq.b #1,d1 +| move.b _regP,(a0,d1.l) ;put P onto stack + move.b _regP,d0 | Test + andi.b #B_FLAGN,d0 | Test + move.b d0,(a0,d1.l) | Test + subq.b #1,d1 + move.b d1,_regS + SetI + |put regPC & Stack pointer address on its place + move.w (a0,0xfffa.l),d1 + LoHi d1 + move.w d1,_regPC + addq.l #7,_xpos + #ifdef MONITOR_BREAK + addq.l #1,_ret_nesting + #endif + rts + +_GO: |cycles (d0) + +| UWORD PC; +| UBYTE S; +| UBYTE A; +| UBYTE X; +| UBYTE Y; +; +| UWORD addr; +| UBYTE data; + +|/* +| This used to be in the main loop but has been removed to improve +| execution speed. It does not seem to have any adverse effect on +| the emulation for two reasons:- +; +| 1. NMI's can only be raised in atari_custom.c - there is +| no way an NMI can be generated whilst in this routine. +; +| 2. The timing of the IRQs are not that critical. +|*/ + + move.l 4(a7),d0 + #ifdef NEW_CYCLE_EXACT + tst.b _wsync_halt + beq.s NO_WS_HALT + moveq.l #WSYNC_C-1,d1 | TEST : no -1 if bpl.s + cmp.l #-999,_cur_screen_pos + beq.s GO_now_cmp + move.l _antic2cpu_ptr,a0 + move.l (a0,d1*4),d1 +GO_now_cmp: + add.l _delayed_wsync,d1 + cmp.l d0,d1 +| bpl.s TERM_GO ; TEST + bge TERM_GO | TEST + addq.l #1,d1 | TEST : not necessary if bpl.s + move.l d1,_xpos + clr.b _wsync_halt + clr.l _delayed_wsync + #else + tst.b _wsync_halt + beq.s NO_WS_HALT + moveq.l #WSYNC_C-1,d1 | TEST : no -1 if bpl.s + cmp.l d0,d1 +| bpl.s TERM_GO ; TEST + bge TERM_GO | TEST + addq.l #1,d1 | TEST : not necessary if bpl.s + move.l d1,_xpos + clr.b _wsync_halt + #endif +NO_WS_HALT: + move.l d0,_xpos_limit | needed for WSYNC store inside ANTIC + movem.l d2-d7/a2-a6,-(a7) + move.l _xpos,CD + lea _memory,memory_pointer + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + lea _attrib,attrib_pointer + tst.b _IRQ | CPUCHECKIRQ + beq NEXTCHANGE_WITHOUT + move.b d0,d7 +| and.b #I_FLAG,d0 ;is interrupt active + btst #I_FLAG,d0 + bne NEXTCHANGE_WITHOUT |yes, no other interrupt + moveq #0,d0 + move.w regS,d0 | push PC and P to stack ( PHW + PHB ) start + move.b _regPC,(memory_pointer,d0.l) + subq.b #1,d0 + move.b _regPC+1,(memory_pointer,d0.l) + subq.b #1,d0 +| move.b d7,(memory_pointer,d0.l) ;put P onto stack + andi.b #B_FLAGN,d7 | TEST + move.b d7,(memory_pointer,d0.l) | TEST + subq.b #1,d0 + move.b d0,_regS | push PC and P to stack ( PHW + PHB ) end + SetI + move.w (memory_pointer,0xfffe.l),d0 | d0 already cleared from before + LoHi d0 + move.l d0,PC6502 + add.l memory_pointer,PC6502 + addq.l #7,CD + clr.b _IRQ |clear interrupt..... + #ifdef MONITOR_BREAK + addq.l #1,_ret_nesting + #endif + bra NEXTCHANGE_WITHOUT + +|/* +| ===================================== +| Extract Address if Required by Opcode +| ===================================== +|*/ + +|d0 contains final value for use in program + +| addressing macros + + .macro NCYCLES_XY p1 + cmp.b \p1,d7 | if ( (UBYTE) addr < X,Y ) ncycles++; +| bpl.s CYCLES_XY_NCY_XY_NC\@ + bcc.s CYCLES_XY_NCY_XY_NC\@ + addq.l #1,CD +CYCLES_XY_NCY_XY_NC\@: + .endm + + .macro ABSOLUTE + move.w (PC6502)+,d7 + LoHi d7 |d7 contains reversed value + .endm + + .macro ABSOLUTE_X + ABSOLUTE + add.w X,d7 + .endm + + .macro ABSOLUTE_X_NCY p1 + ABSOLUTE_X \p1 + NCYCLES_XY X + .endm + + .macro ABSOLUTE_Y + ABSOLUTE + add.w Y,d7 + .endm + + .macro ABSOLUTE_Y_NCY p1 + ABSOLUTE_Y \p1 + NCYCLES_XY Y + .endm + + .macro IMMEDIATE p1 + move.b (PC6502)+,\p1 + .endm + + .macro INDIRECT_X + move.b (PC6502)+,d7 + add.b X,d7 + move.w (memory_pointer,d7.l),d7 + LoHi d7 + .endm + + .macro INDIRECT_Y + move.b (PC6502)+,d7 + move.w (memory_pointer,d7.l),d7 + LoHi d7 |swap bytes + add.w Y,d7 + .endm + + .macro INDIRECT_Y_NCY + INDIRECT_Y + NCYCLES_XY Y + .endm + + .macro ZPAGE + move.b (PC6502)+,d7 + .endm + + .macro ZPAGE_X + move.b (PC6502)+,d7 + add.b X,d7 + .endm + + .macro ZPAGE_Y + move.b (PC6502)+,d7 + add.b Y,d7 + .endm + +| miscellaneous macros + + .macro NEXTCHANGE_REG p1 + move.b \p1,ZFLAG + bra.w NEXTCHANGE_N + .endm + +| command macros + + .macro ROL_C p1 + add.b CFLAG,CFLAG + addx.b \p1,\p1 |left + scs CFLAG + .endm + + .macro ROR_C p1 + add.b CFLAG,CFLAG + roxr.b #1,\p1 + scs CFLAG + .endm + + .macro ASL_C p1 + add.b \p1,\p1 |left + scs CFLAG + .endm + + .macro LSR_C p1 + lsr.b #1,\p1 + scs CFLAG + .endm + +| opcodes + +| inofficial opcodes + +| unstable inofficial opcodes + +opcode_93: |/* SHA (ab),y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] */ +| /* It seems previous memory value is important - also in 9f */; + addq.l #cy_IndY2,CD + move.b (PC6502)+,d7 + addq.b #1,d7 + move.b (memory_pointer,d7.l),d0 + addq.b #1,d0 + and.b A,d0 + and.b X,d0 + move.w (memory_pointer,d7.l),d7 + LoHi d7 |swap bytes + add.w Y,d7 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9f: |/* SHA abcd,y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] */ + addq.l #cy_IndY2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 |d7 contains reversed value + addq.b #1,d0 + and.b A,d0 + and.b X,d0 + add.w Y,d7 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9e: |/* SHX abcd,y [unofficial - Store X and (H+1)] (Fox) */ +| /* Seems to be stable */ + addq.l #cy_IndY2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 |d7 contains reversed value + addq.b #1,d0 + and.b X,d0 + add.w Y,d7 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9c: |/* SHY abcd,x [unofficial - Store Y and (H+1)] (Fox) */ +| /* Seems to be stable */ + addq.l #cy_AbsX2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 |d7 contains reversed value + addq.b #1,d0 + and.b A,d0 + and.b Y,d0 + add.w X,d7 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9b: |/* SHS abcd,y [unofficial, UNSTABLE] (Fox) */ +| /* Transfer A AND X to S, then store S AND (H+1)] */ +| /* S seems to be stable, only memory values vary */ + addq.l #cy_IndY2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 |d7 contains reversed value + move.b A,_regS + and.b X,_regS + addq.b #1,d0 + and.b _regS,d0 + add.w Y,d7 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +| stable inofficial opcodes + +opcode_6b: |/* ARR #ab [unofficial - Acc AND Data, ROR result] */ +| not optimized because I think it will never be executed anyway + addq.l #cy_Imm,CD + IMMEDIATE ZFLAG + and.b A,ZFLAG + btst #D_FLAGB,_regP + beq.s pcode_6b_6b_noBCD +| 'BCD fixup' + move.b ZFLAG,d7 + ROR_C ZFLAG + move.b ZFLAG,A + move.b d7,VFLAG |VFLAG + eor.b ZFLAG,VFLAG + and.b #0x40,VFLAG + sne VFLAG + move.b A,d7 + move.b A,d7 + move.b d7,d0 + andi.b #15,d0 + move.b d7,CFLAG + andi.b #1,CFLAG + add.b CFLAG,d0 + cmpi.b #6,d0 | check for >5 + bmi.s pcode_6b_6b_bcd1 | <=5 + move.b A,CFLAG + and.b #240,CFLAG + move.b A,d0 + addq.b #6,d0 + and.b #15,d0 + move.b CFLAG,A + or.b d0,A +pcode_6b_6b_bcd1: + move.b d7,d0 + andi.b #0xf0,d0 + move.b d7,CFLAG + andi.b #16,CFLAG + cmpi.b #0x51,d0 | check for >0x50 + bmi.s pcode_6b_6b_bcd2 | <=0x50 + move.b A,CFLAG + and.b #15,CFLAG + move.b A,d0 + add.b #0x60,d0 + and.b #0xf0,d0 + move.b CFLAG,A + or.w d0,A + SetCFLAG + bra.w NEXTCHANGE_N +pcode_6b_6b_bcd2: + ClrCFLAG + bra.w NEXTCHANGE_N +| Binary +pcode_6b_6b_noBCD: + ROR_C ZFLAG + move.b ZFLAG,A + move.b A,VFLAG |VFLAG + lsr.b #6,VFLAG + move.b A,CFLAG + lsr.b #5,CFLAG + eor.b CFLAG,VFLAG + and.b #1,VFLAG + sne VFLAG + move.b A,CFLAG |CFLAG + and.b #0x40,CFLAG + sne CFLAG + bra.w NEXTCHANGE_N + +opcode_02: |/* CIM [unofficial - crash immediate] */ +opcode_12: +opcode_22: +opcode_32: +opcode_42: +opcode_52: +opcode_62: +opcode_72: +opcode_92: +opcode_b2: + addq.l #cy_CIM,CD + subq.w #1,PC6502 + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + #ifdef CRASH_MENU + move.w PC6502,_crash_address + addq.w #1,PC6502 + move.w PC6502,crash_afterCIM + move.l d7,_crash_code + move.l _atari_screen,-(sp) + jsr _ui + #else + #ifdef MONITOR_BREAK + moveq #1,d0 + move.l d0,_break_cim + #else + Call_Atari800_Exit_true + #endif + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + #endif + bra.w NEXTCHANGE_WITHOUT + +opcode_07: |/* ASO ab [unofficial - ASL then ORA with Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + ASL_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_17: |/* ASO ab,x [unofficial - ASL then ORA with Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + ASL_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + + .macro ASO_C_CONT /* [unofficial - ASL Mem, then ORA with A] */ + move.b (attrib_pointer,d7.l),d0 + bne.s ASO_Getbyte_ROMHW + move.b (memory_pointer,d7.l),d0 |get byte + ASL_C d0 + bra ASO_STORE_MEM + .endm + +opcode_03: |/* ASO (ab,x) [unofficial - ASL then ORA with Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + ASO_C_CONT + +opcode_13: |/* ASO (ab),y [unofficial - ASL then ORA with Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + ASO_C_CONT + +opcode_0f: |/* ASO abcd [unofficial - ASL then ORA with Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + ASO_C_CONT + +opcode_1b: |/* ASO abcd,y [unofficial - ASL then ORA with Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + ASO_C_CONT + +opcode_1f: |/* ASO abcd,x [unofficial - ASL then ORA with Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + ASO_C_CONT + +ASO_Getbyte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s SO_Getbyte_ROMHW_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + ASL_C d0 + bra.s ASO_NOW_ORA +SO_Getbyte_ROMHW_Getbyte_HW: + RMW_GETBYTE + ASL_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.s ASO_NOW_ORA +ASO_STORE_MEM: + move.b d0,(memory_pointer,d7.l) +ASO_NOW_ORA: + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_27: /* RLA ab [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + ROL_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_37: /* RLA ab,x [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + ROL_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + + .macro RLA_C_CONT /* [unofficial - ROL Mem, then AND with A] */ + move.b (attrib_pointer,d7.l),d0 + bne.w RLA_Getbyte_ROMHW + move.b (memory_pointer,d7.l),d0 |get byte + ROL_C d0 + bra.w RLA_STORE_MEM + .endm + +opcode_23: |/* RLA (ab,x) [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + RLA_C_CONT + +opcode_33: |/* RLA (ab),y [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + RLA_C_CONT + +opcode_2f: |/* RLA abcd [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RLA_C_CONT + +opcode_3b: |/* RLA abcd,y [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + RLA_C_CONT + +opcode_3f: |/* RLA abcd,x [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RLA_C_CONT + +RLA_Getbyte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s LA_Getbyte_ROMHW_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + ROL_C d0 + bra.s RLA_NOW_AND +LA_Getbyte_ROMHW_Getbyte_HW: + RMW_GETBYTE + ROL_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.s RLA_NOW_AND +RLA_STORE_MEM: + move.b d0,(memory_pointer,d7.l) +RLA_NOW_AND: + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_47: |/* LSE ab [unofficial - LSR then EOR result with A] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + LSR_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_57: |/* LSE ab,x [unofficial - LSR then EOR result with A] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + LSR_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + + .macro LSE_C_CONT /* [unofficial - LSR Mem then EOR with A] */ + move.b (attrib_pointer,d7.l),d0 + bne.s LSE_Getbyte_ROMHW + move.b (memory_pointer,d7.l),d0 |get byte + LSR_C d0 + bra LSE_STORE_MEM + .endm + +opcode_43: |/* LSE (ab,x) [unofficial] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + LSE_C_CONT + +opcode_53: |/* LSE (ab),y [unofficial] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + LSE_C_CONT + +opcode_4f: |/* LSE abcd [unofficial] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + LSE_C_CONT + +opcode_5b: |/* LSE abcd,y [unofficial] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + LSE_C_CONT + +opcode_5f: |/* LSE abcd,x [unofficial] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + LSE_C_CONT + +LSE_Getbyte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s SE_Getbyte_ROMHW_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + LSR_C d0 + bra.s LSE_NOW_EOR +SE_Getbyte_ROMHW_Getbyte_HW: + RMW_GETBYTE + LSR_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.s LSE_NOW_EOR +LSE_STORE_MEM: + move.b d0,(memory_pointer,d7.l) +LSE_NOW_EOR: + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_4b: |/* ALR #ab [unofficial - Acc AND Data, LSR result] */ + addq.l #cy_Imm,CD + IMMEDIATE ZFLAG + and.b A,ZFLAG + LSR_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_67: |/* RRA ab [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + ROR_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + bra.w adc + +opcode_77: |/* RRA ab,x [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + ROR_C d0 + move.b d0,(memory_pointer,d7.l) | PUTZPBYTE + bra.w adc + + .macro GETANYBYTE_RRA + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + bne RRA_RAMROM + RMW_GETBYTE + bra RRA_C_CONT + .endm + +opcode_63: |/* RRA (ab,x) [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + GETANYBYTE_RRA + +opcode_73: |/* RRA (ab),y [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + GETANYBYTE_RRA + +opcode_6f: |/* RRA abcd [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + GETANYBYTE_RRA + +opcode_7b: |/* RRA abcd,y [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + GETANYBYTE_RRA + +opcode_7f: |/* RRA abcd,x [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + GETANYBYTE_RRA + +RRA_RAMROM: + move.b (memory_pointer,d7.l),d0 |get byte +RRA_C_CONT: |/* [unofficial - ROR Mem, then ADC to Acc] */ + ROR_C d0 + tst.b (attrib_pointer,d7.l) + bne.s RA_C_CONT_ROM_OR_HW + move.b d0,(memory_pointer,d7.l) + bra.w adc +RA_C_CONT_ROM_OR_HW: + cmp.b #isROM,(attrib_pointer,d7.l) + beq.w adc |ROM ? + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.w adc + +opcode_87: |/* SAX ab [unofficial - Store result A AND X] */ + addq.l #cy_ZP,CD + ZPAGE + move.b A,d0 + and.b X,d0 + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_97: |/* SAX ab,y [unofficial - Store result A AND X] */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b A,d0 + and.b X,d0 + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_83: |/* SAX (ab,x) [unofficial - Store result A AND X] */ + addq.l #cy_IndX,CD + INDIRECT_X + move.b A,d0 + and.b X,d0 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_8f: |/* SAX abcd [unofficial - Store result A AND X] */ + addq.l #cy_Abs,CD + ABSOLUTE + move.b A,d0 + and.b X,d0 + tst.b (attrib_pointer,d7.l) | PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_a7: |/* LAX ab [unofficial] - LDA + LDX */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),A | GETZPBYTE + move.b A,X + NEXTCHANGE_REG A + +opcode_b7: |/* LAX ab,y [unofficial] - LDA + LDX */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b (memory_pointer,d7.l),A | GETZPBYTE + move.b A,X + NEXTCHANGE_REG A + + .macro GETANYBYTE_LAX + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LAX_HW + move.b (memory_pointer,d7.l),A |get byte + move.b A,X + NEXTCHANGE_REG A + .endm + +opcode_a3: |/* LAX (ind,x) [unofficial] - LDA + LDX */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_LAX + +opcode_b3: |/* LAX (ind),y [unofficial] - LDA + LDX */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_LAX + +opcode_af: |/* LAX abcd [unofficial] - LDA + LDX */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_LAX + +opcode_bf: |/* LAX abcd,y [unofficial] - LDA + LDX */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_LAX + +LAX_HW: + EXE_GETBYTE + move.b d0,A + move.b A,X + NEXTCHANGE_REG A + +opcode_bb: |/* LAS abcd,y [unofficial - AND S with Mem, transfer to A and X */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + bne.s pcode_bb_Getbyte_RAMROM + EXE_GETBYTE + bra.s pcode_bb_AFTER_READ +pcode_bb_Getbyte_RAMROM: + move.b (memory_pointer,d7.l),d0 |get byte +pcode_bb_AFTER_READ: + and.b _regS,d0 + move.b d0,A + move.b d0,X + move.b d0,ZFLAG + bra.w NEXTCHANGE_N + +opcode_c7: |/* DCM ab [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + subq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w COMPARE_A + +opcode_d7: |/* DCM ab,x [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + subq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w COMPARE_A + + .macro DCM_C_CONT /* [unofficial - DEC Mem then CMP with Acc] */ + tst.b (attrib_pointer,d7.l) + bne.s DCM_ROM_HW + move.b (memory_pointer,d7.l),d0 |get byte + subq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w COMPARE_A + .endm + +opcode_c3: |/* DCM (ab,x) [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + DCM_C_CONT + +opcode_d3: |/* DCM (ab),y [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + DCM_C_CONT + +opcode_cf: |/* DCM abcd [unofficial] - DEC Mem then CMP with Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + DCM_C_CONT + +opcode_db: |/* DCM abcd,y [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + DCM_C_CONT + +DCM_ROM_HW: + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s CM_ROM_HW_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + subq.b #1,d0 + bra.w COMPARE_A +CM_ROM_HW_Getbyte_HW: + RMW_GETBYTE + subq.b #1,d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.w COMPARE_A + +opcode_df: |/* DCM abcd,x [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + DCM_C_CONT + +opcode_cb: |/* SBX #ab [unofficial - store (A AND X - Mem) in X] */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + and.b A,X + subq.b #1,CFLAG + subx.b d0,X + scc CFLAG + NEXTCHANGE_REG X + +opcode_e7: |/* INS ab [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + addq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra sbc + +opcode_f7: |/* INS ab,x [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + addq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra sbc + + .macro INS_C_CONT /* [unofficial - INC Mem then SBC with Acc] */ + tst.b (attrib_pointer,d7.l) + bne.s INS_ROM_HW + move.b (memory_pointer,d7.l),d0 |get byte + addq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w sbc + .endm + +opcode_e3: |/* INS (ab,x) [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + INS_C_CONT + +opcode_f3: |/* INS (ab),y [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + INS_C_CONT + +opcode_ef: |/* INS abcd [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + INS_C_CONT + +opcode_fb: |/* INS abcd,y [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + INS_C_CONT + +INS_ROM_HW: + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s NS_ROM_HW_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + addq.b #1,d0 + bra.w sbc +NS_ROM_HW_Getbyte_HW: + RMW_GETBYTE + addq.b #1,d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.w sbc + +opcode_ff: |/* INS abcd,x [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + INS_C_CONT + +opcode_80: |/* NOP #ab [unofficial - skip byte] */ +opcode_82: +opcode_89: +opcode_c2: +opcode_e2: + addq.l #cy_NOP2,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_04: |/* NOP ab [unofficial - skip byte] */ +opcode_44: +opcode_64: + addq.l #cy_NOP3,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_14: |/* NOP ab,x [unofficial - skip byte] */ +opcode_34: +opcode_54: +opcode_74: +opcode_d4: +opcode_f4: + addq.l #cy_NOP4,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_0b: |/* ANC #ab [unofficial - AND then copy N to C */ +opcode_2b: + addq.l #cy_Imm,CD + and.b (PC6502)+,A + move.b A,ZFLAG + smi CFLAG + bra.w NEXTCHANGE_N + +opcode_ab: |/* ANX #ab [unofficial - AND #ab, then TAX] */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + and.b d0,A + move.b A,X + NEXTCHANGE_REG A + +opcode_8b: |/* ANE #ab [unofficial - A AND X AND (Mem OR 0xEF) to Acc] */ + addq.l #cy_Imm,CD + move.b (PC6502)+,d0 + and.b X,A + move.b A,ZFLAG + and.b d0,ZFLAG + or.b #0xef,d0 + and.b d0,A + bra.w NEXTCHANGE_N + +opcode_0c: |/* NOP abcd [unofficial - skip word] */ + addq.l #cy_SKW,CD + addq.l #2,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_1c: |/* NOP abcd,x [unofficial - skip word] */ +opcode_3c: +opcode_5c: +opcode_7c: +opcode_dc: +opcode_fc: + addq.l #cy_SKW,CD + move.b (PC6502),d7 + add.l X,d7 + bcs.s pcode_fc_SOLVE_PB + addq.l #cy_Bcc1,CD + addq.l #2,PC6502 + bra.w NEXTCHANGE_WITHOUT +pcode_fc_SOLVE_PB: + addq.l #cy_Bcc2,CD + addq.l #2,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_1a: |/* NOP [unofficial] */ +opcode_3a: +opcode_5a: +opcode_7a: +opcode_da: +opcode_fa: + addq.l #cy_NOP,CD + bra.w NEXTCHANGE_WITHOUT + +| official opcodes + +opcode_00: |/* BRK */ + #ifdef MONITOR_BREAK + tst.l _brkhere + beq.s pcode_00_oc_00_norm + move.b #1,_break_here + jsr go_monitor + bra.w NEXTCHANGE_WITHOUT +pcode_00_oc_00_norm: + #endif + addq.l #cy_BRK,CD +| btst #I_FLAGB,_regP +| bne.w NEXTCHANGE_WITHOUT + SetB + move.l PC6502,d7 + sub.l memory_pointer,d7 + addq.w #1,d7 + moveq #0,d0 | PHW + PHP + move.w regS,d0 + subq.b #1,d0 | wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #2,d0 + ConvertSTATUS_RegP d7 +| move.b d7,_regP ;put result to _regP ! TEST !!! + move.b d7,(memory_pointer,d0.l) + subq.b #1,d0 + move.b d0,_regS + SetI + move.w (memory_pointer,0xfffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + #ifdef MONITOR_BREAK + addq.l #1,_ret_nesting + #endif + bra.w NEXTCHANGE_WITHOUT + +opcode_08: |/* PHP */ + addq.l #cy_RegPH,CD + move.w regS,d7 + ConvertSTATUS_RegP d0 + move.b d0,(memory_pointer,d7.l) + subq.b #1,d7 + move.b d7,_regS + bra.w NEXTCHANGE_WITHOUT + +opcode_28: |/* PLP */ + addq.l #cy_RegPL,CD + moveq #0,d0 | PLP + move.w regS,d0 + addq.b #1,d0 +| move.b (memory_pointer,d0.l),_regP + move.b (memory_pointer,d0.l),d7 | TEST + ori.b #0x30,d7 | TEST + move.b d7,_regP | TEST + ConvertRegP_STATUS d7 + move.b d0,_regS + tst.b _IRQ | CPUCHECKIRQ + beq.w NEXTCHANGE_WITHOUT + btst #I_FLAGB,d7 + bne.w NEXTCHANGE_WITHOUT +| moveq #0,d0 +| move.w regS,d0 ; push PC and P to stack ( PHW + PHB ) start + subq.b #2,d0 | but do it the wrong way around for optim. + andi.b #B_FLAGN,d7 ; + move.b d7,(memory_pointer,d0.l) | Push P + move.l PC6502,d7 + sub.l memory_pointer,d7 + addq.b #1,d0 | wrong way around + move.b d7,(memory_pointer,d0.l) | Push High + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) | Push Low + subq.b #3,d0 + move.b d0,_regS | push PC and P to stack ( PHW + PHB ) end + SetI + move.w (memory_pointer,0xfffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + addq.l #7,CD + #ifdef MONITOR_BREAK + addq.l #1,_ret_nesting + #endif + bra.w NEXTCHANGE_WITHOUT + +opcode_48: |/* PHA */ + addq.l #cy_RegPH,CD + move.w regS,d7 + move.b A,(memory_pointer,d7.l) + subq.b #1,d7 + move.b d7,_regS + bra.w NEXTCHANGE_WITHOUT + +opcode_68: |/* PLA */ + addq.l #cy_RegPL,CD + move.w regS,d7 + addq.b #1,d7 + move.b (memory_pointer,d7.l),A + move.b d7,_regS + NEXTCHANGE_REG A + + .macro OR_ANYBYTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s OR_HW + or.b (memory_pointer,d7.l),A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + .endm + +opcode_01: |/* ORA (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + OR_ANYBYTE + +opcode_11: |/* ORA (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + OR_ANYBYTE + +OR_HW: + EXE_GETBYTE + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_0d: |/* ORA abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + OR_ANYBYTE + +opcode_19: |/* ORA abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + OR_ANYBYTE + +opcode_1d: |/* ORA abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + OR_ANYBYTE + +opcode_05: |/* ORA ab */ + addq.l #cy_ZP,CD + ZPAGE + or.b (memory_pointer,d7.l),A | OR ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_15: |/* ORA ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + or.b (memory_pointer,d7.l),A | OR ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_09: |/* ORA #ab */ + addq.l #cy_Imm,CD + or.b (PC6502)+,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + + .macro AND_ANYBYTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s AND_HW + and.b (memory_pointer,d7.l),A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + .endm + +opcode_21: |/* AND (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + AND_ANYBYTE + +opcode_31: |/* AND (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + AND_ANYBYTE + +AND_HW: + EXE_GETBYTE + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_2d: |/* AND abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + AND_ANYBYTE + +opcode_39: |/* AND abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + AND_ANYBYTE + +opcode_3d: |/* AND abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + AND_ANYBYTE + +opcode_25: |/* AND ab */ + addq.l #cy_ZP,CD + ZPAGE + and.b (memory_pointer,d7.l),A | AND ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_35: |/* AND ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + and.b (memory_pointer,d7.l),A | AND ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_29: |/* AND #ab */ + addq.l #cy_Imm,CD + and.b (PC6502)+,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + + .macro EOR_C_CONT + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + .endm + + .macro GETANYBYTE_EOR + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s EOR_HW + move.b (memory_pointer,d7.l),d0 |get byte + EOR_C_CONT + .endm + +opcode_41: |/* EOR (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_EOR + +opcode_51: |/* EOR (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_EOR + +EOR_HW: + EXE_GETBYTE + EOR_C_CONT + +opcode_4d: |/* EOR abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_EOR + +opcode_59: |/* EOR abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_EOR + +opcode_5d: |/* EOR abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_EOR + +opcode_45: |/* EOR ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 + EOR_C_CONT + +opcode_55: |/* EOR ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 + EOR_C_CONT + +opcode_49: |/* EOR #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 | because eor only works with registers ! + EOR_C_CONT + +opcode_0a: |/* ASLA */ + addq.l #cy_RegChg,CD + ASL_C A + NEXTCHANGE_REG A + +opcode_06: |/* ASL ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),ZFLAG + ASL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_N + +opcode_16: |/* ASL ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),ZFLAG + ASL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_N + + .macro RPW_ASL_C + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_ASL + move.b (memory_pointer,d7.l),ZFLAG |get byte + ASL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_N + .endm + +opcode_0e: |/* ASL abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_ASL_C + +opcode_1e: |/* ASL abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_ASL_C + +RPW_HW_ASL: + cmp.b #isROM,d0 + beq.s RPW_ROM_ASL + RMW_GETBYTE + ASL_C d0 + ext.w d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_ASL: + move.b (memory_pointer,d7.l),ZFLAG | get byte + ASL_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_2a: |/* ROLA */ + addq.l #cy_RegChg,CD + ROL_C A + NEXTCHANGE_REG A + +opcode_26: |/* ROL ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + ROL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_N + +opcode_36: |/* ROL ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + ROL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_N + + .macro RPW_ROL_C + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_ROL + move.b (memory_pointer,d7.l),ZFLAG |get byte + ROL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_N + .endm + +opcode_2e: |/* ROL abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_ROL_C + +opcode_3e: |/* ROL abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_ROL_C + +RPW_HW_ROL: + cmp.b #isROM,d0 + beq.s RPW_ROM_ROL + RMW_GETBYTE + ROL_C d0 + ext.w d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_ROL: + move.b (memory_pointer,d7.l),ZFLAG |get byte + ROL_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_4a: |/* LSRA */ + addq.l #cy_RegChg,CD + clr.w NFLAG + lsr.b #1,A + scs CFLAG + move.b A,ZFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_46: |/* LSR ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + clr.w NFLAG + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + lsr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_56: |/* LSR ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + clr.w NFLAG + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + lsr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + + .macro RPW_LSR_C + clr.w NFLAG + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_LSR + move.b (memory_pointer,d7.l),ZFLAG |get byte + LSR_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + .endm + +opcode_4e: |/* LSR abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_LSR_C + +opcode_5e: |/* LSR abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_LSR_C + +RPW_HW_LSR: + cmp.b #isROM,d0 + beq.s RPW_ROM_LSR + RMW_GETBYTE + LSR_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_LSR: + move.b (memory_pointer,d7.l),ZFLAG |get byte + LSR_C ZFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_6a: |/* RORA */ + addq.l #cy_RegChg,CD + ROR_C A + NEXTCHANGE_REG A + +opcode_66: |/* ROR ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + add.b CFLAG,CFLAG + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + roxr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_N + +opcode_76: |/* ROR ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + add.b CFLAG,CFLAG + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + roxr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_N + + .macro RPW_ROR_C + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_ROR + move.b (memory_pointer,d7.l),ZFLAG |get byte + ROR_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_N + .endm + +opcode_6e: |/* ROR abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_ROR_C + +opcode_7e: |/* ROR abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_ROR_C + +RPW_HW_ROR: + cmp.b #isROM,d0 + beq.s RPW_ROM_ROR + RMW_GETBYTE + ROR_C d0 + ext.w d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_ROR: + move.b (memory_pointer,d7.l),ZFLAG |get byte + ROR_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_18: |/* CLC */ + addq.l #cy_FlagCS,CD + ClrCFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_38: |/* SEC */ + addq.l #cy_FlagCS,CD + SetCFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_58: |/* CLI */ + addq.l #cy_FlagCS,CD + ClrI + tst.b _IRQ | ~ CPUCHECKIRQ + beq.w NEXTCHANGE_WITHOUT + move.l PC6502,d7 + sub.l memory_pointer,d7 + moveq #0,d0 | PHW + PHP (B0) + move.w regS,d0 + subq.b #1,d0 | wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #2,d0 + ConvertSTATUS_RegP d7 +| move.b d7,_regP ;put result to _regP ! TEST !!! + andi.b #B_FLAGN,d7 | TEST + move.b d7,(memory_pointer,d0.l) + subq.b #1,d0 + move.b d0,_regS + SetI + move.w (memory_pointer,0xfffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + clr.b _IRQ + addq.l #7,CD + #ifdef MONITOR_BREAK + addq.l #1,_ret_nesting + #endif + bra.w NEXTCHANGE_WITHOUT + +opcode_78: |/* SEI */ + addq.l #cy_FlagCS,CD + SetI + bra.w NEXTCHANGE_WITHOUT + +opcode_b8: |/* CLV */ + addq.l #cy_FlagCS,CD + ClrVFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_d8: |/* CLD */ + addq.l #cy_FlagCS,CD + ClrD + bra.w NEXTCHANGE_WITHOUT + +opcode_f8: |/* SED */ + addq.l #cy_FlagCS,CD + SetD + bra.w NEXTCHANGE_WITHOUT + + .macro JMP_C + move.w (PC6502)+,d7 + LoHi d7 |(in d7 address where we want to jump) + lea (memory_pointer,d7.l),PC6502 + bra.w NEXTCHANGE_WITHOUT + .endm + +opcode_4c: |/* JMP abcd */ + #ifdef MONITOR_BREAK + move.l PC6502,d7 |current pointer + sub.l memory_pointer,d7 + subq.l #1,d7 + lea _remember_JMP,a0 + move.l _remember_jmp_curpos,d0 + move.w d7,(a0,d0*2) + addq.l #1,d0 + cmp.l #rem_jmp_steps,d0 + bmi.s pcode_4c_point_rem_jmp + moveq #0,d0 +pcode_4c_point_rem_jmp: + move.l d0,_remember_jmp_curpos + #endif + addq.l #cy_JmpAbs,CD + JMP_C + +opcode_6c: |/* JMP (abcd) */ + #ifdef MONITOR_BREAK + move.l PC6502,d7 |current pointer + sub.l memory_pointer,d7 + subq.l #1,d7 + lea _remember_JMP,a0 + move.l _remember_jmp_curpos,d0 + move.w d7,(a0,d0*2) + addq.l #1,d0 + cmp.l #rem_jmp_steps,d0 + bmi.s pcode_6c_point_rem_jmp + moveq #0,d0 +pcode_6c_point_rem_jmp: + move.l d0,_remember_jmp_curpos + #endif + move.w (PC6502)+,d7 + LoHi d7 + #ifdef P65C02 + move.w (memory_pointer,d7.l),d7 + LoHi d7 + lea (memory_pointer,d7.l),PC6502 + #else + |/* original 6502 had a bug in jmp (addr) when addr crossed page boundary */ + cmp.b #0xff,d7 + beq.s pcode_6c_PROBLEM_FOUND |when problematic jump is found + move.w (memory_pointer,d7.l),d7 + LoHi d7 + lea (memory_pointer,d7.l),PC6502 + addq.l #cy_JmpInd,CD + bra.w NEXTCHANGE_WITHOUT +pcode_6c_PROBLEM_FOUND: + move.l d7,d0 |we have to use both of them + clr.b d7 |instead of reading right this address, + |we read address at this start of page + move.b (memory_pointer,d7.l),d7 + LoHi d7 + move.b (memory_pointer,d0.l),d7 + lea (memory_pointer,d7.l),PC6502 + #endif + addq.l #cy_JmpInd,CD + bra.w NEXTCHANGE_WITHOUT + +opcode_20: |/* JSR abcd */ + addq.l #cy_Sub,CD + move.l PC6502,d7 |current pointer + sub.l memory_pointer,d7 + #ifdef MONITOR_BREAK + subq.l #1,d7 + lea _remember_JMP,a0 + move.l _remember_jmp_curpos,d0 + move.w d7,(a0,d0*2) + addq.l #1,d7 | restore to PC + addq.l #1,d0 + cmp.l #rem_jmp_steps,d0 + bmi.s pcode_20_point_rem_jmp + moveq #0,d0 +pcode_20_point_rem_jmp: + move.l d0,_remember_jmp_curpos + addq.l #1,_ret_nesting + #endif + addq.l #1,d7 | return address + moveq #0,d0 | PHW + move.w regS,d0 + subq.b #1,d0 | wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #2,d0 + move.b d0,_regS + JMP_C + +opcode_60: |/* RTS */ + addq.l #cy_Sub,CD + PLW d7,d0 + lea 1(memory_pointer,d7.l),PC6502 + #ifdef MONITOR_BREAK + tst.b _break_ret + beq.s pcode_60_mb_end + tst.l _ret_nesting + bmi.s pcode_60_mb_end + move.b #1,_break_step +pcode_60_mb_end: + subq.l #1,_ret_nesting + #endif + bra.w NEXTCHANGE_WITHOUT + +opcode_40: |/* RTI */ +_RTI: + addq.l #cy_Sub,CD + moveq #0,d0 | PLP + PLW + move.w regS,d0 + addq.b #1,d0 +| move.b (memory_pointer,d0.l),_regP + move.b (memory_pointer,d0.l),d7 | TEST + ori.b #0x30,d7 | TEST + move.b d7,_regP | TEST + ConvertRegP_STATUS d7 + addq.b #2,d0 | wrong way around + move.b (memory_pointer,d0.l),d7 + asl.w #8,d7 + subq.b #1,d0 + or.b (memory_pointer,d0.l),d7 + addq.b #1,d0 + move.b d0,_regS + lea (memory_pointer,d7.l),PC6502 + #ifdef MONITOR_BREAK + tst.b _break_ret + beq.s RTI_mb_end + tst.l _ret_nesting + bmi.s RTI_mb_end + move.b #1,_break_step +RTI_mb_end: + subq.l #1,_ret_nesting + #endif + tst.b _IRQ | CPUCHECKIRQ + beq.w NEXTCHANGE_WITHOUT + move.b _regP,d7 +| andi.b #I_FLAG,d7 + btst #I_FLAGB,d7 + bne.w NEXTCHANGE_WITHOUT + moveq #0,d0 + move.w regS,d0 | push PC and P to stack ( PHW + PHB ) start + subq.b #2,d0 + andi.b #B_FLAGN,d7 | TEST + move.b d7,(memory_pointer,d0.l) | Push P + move.l PC6502,d7 + sub.l memory_pointer,d7 + addq.b #1,d0 | wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #3,d0 + move.b d0,_regS | push PC and P to stack ( PHW + PHB ) end + SetI + move.w (memory_pointer,0xfffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + addq.l #7,CD + #ifdef MONITOR_BREAK + addq.l #1,_ret_nesting + #endif + bra.w NEXTCHANGE_WITHOUT + + .macro BIT_C_CONT + ext.w NFLAG + btst #V_FLAGB,ZFLAG + sne VFLAG + and.b A,ZFLAG + bra.w NEXTCHANGE_WITHOUT + .endm + +opcode_24: |/* BIT ab */ + addq.l #cy_ZP,CD + ZPAGE +BIT_RAMROM: + move.b (memory_pointer,d7.l),ZFLAG | GETZPBYTE + BIT_C_CONT + +opcode_2c: |/* BIT abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + bne.s BIT_RAMROM + EXE_GETBYTE + move.b d0,ZFLAG + BIT_C_CONT + + .macro STOREANYBYTE_A + tst.b (attrib_pointer,d7.l) + bne.s STA_HW + move.b A,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + .endm + +opcode_81: |/* STA (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + STOREANYBYTE_A + +opcode_91: |/* STA (ab),y */ + addq.l #cy_IndY2,CD + INDIRECT_Y + STOREANYBYTE_A + +opcode_8d: |/* STA abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + STOREANYBYTE_A + +opcode_99: |/* STA abcd,y */ + addq.l #cy_IndY2,CD + ABSOLUTE_Y + STOREANYBYTE_A + +opcode_9d: |/* STA abcd,x */ + addq.l #cy_AbsX2,CD + ABSOLUTE_X + STOREANYBYTE_A + +STA_HW: + move.b A,d0 + bra.w A800PUTB + +opcode_85: |/* STA ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b A,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_95: |/* STA ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b A,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + + .macro STOREANYBYTE p1 + tst.b (attrib_pointer,d7.l) + bne.s TOREANYBYTE_GO_PUTBYTE\@ + move.b \p1,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT +TOREANYBYTE_GO_PUTBYTE\@: + move.b \p1,d0 + bra.w A800PUTB + .endm + +opcode_8e: |/* STX abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + STOREANYBYTE X + +opcode_86: |/* STX ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b X,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_96: |/* STX ab,y */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b X,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_8c: |/* STY abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + STOREANYBYTE Y + +opcode_84: |/* STY ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b Y,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_94: |/* STY ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b Y,(memory_pointer,d7.l) | PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + + .macro LOADANYBYTE_A + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LDA_HW + move.b (memory_pointer,d7.l),A |get byte + NEXTCHANGE_REG A + .endm + +opcode_a1: |/* LDA (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + LOADANYBYTE_A + +opcode_b1: |/* LDA (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + LOADANYBYTE_A + +LDA_HW: + EXE_GETBYTE + move.b d0,A + NEXTCHANGE_REG A + +opcode_ad: |/* LDA abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + LOADANYBYTE_A + +opcode_b9: |/* LDA abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + LOADANYBYTE_A + +opcode_bd: |/* LDA abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + LOADANYBYTE_A + +opcode_a5: |/* LDA ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),A | GETZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_b5: |/* LDA ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),A | GETZPBYTE + NEXTCHANGE_REG A + +opcode_a9: |/* LDA #ab */ + addq.l #cy_Imm,CD + IMMEDIATE A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + + .macro LOADANYBYTE_X + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LDX_HW + move.b (memory_pointer,d7.l),X |get byte + NEXTCHANGE_REG X + .endm + +opcode_ae: |/* LDX abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + LOADANYBYTE_X + +opcode_be: |/* LDX abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + LOADANYBYTE_X + +LDX_HW: + EXE_GETBYTE + move.b d0,X + NEXTCHANGE_REG X + +opcode_a6: |/* LDX ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),X | GETZPBYTE + move.b X,ZFLAG + bra.w NEXTCHANGE_N + +opcode_b6: |/* LDX ab,y */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b (memory_pointer,d7.l),X | GETZPBYTE + NEXTCHANGE_REG X + +opcode_a2: |/* LDX #ab */ + addq.l #cy_Imm,CD + IMMEDIATE X + move.b X,ZFLAG + bra.w NEXTCHANGE_N + + .macro LOADANYBYTE_Y + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LDY_HW + move.b (memory_pointer,d7.l),Y |get byte + NEXTCHANGE_REG Y + .endm + +opcode_ac: |/* LDY abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + LOADANYBYTE_Y + +opcode_bc: |/* LDY abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + LOADANYBYTE_Y + +LDY_HW: + EXE_GETBYTE + move.b d0,Y + NEXTCHANGE_REG Y + +opcode_a4: |/* LDY ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),Y | GETZPBYTE + move.b Y,ZFLAG + bra.w NEXTCHANGE_N + +opcode_b4: |/* LDY ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),Y | GETZPBYTE + NEXTCHANGE_REG Y + +opcode_a0: |/* LDY #ab */ + addq.l #cy_Imm,CD + IMMEDIATE Y + move.b Y,ZFLAG + bra.w NEXTCHANGE_N + +opcode_8a: |/* TXA */ + addq.l #cy_RegChg,CD + move.b X,A + NEXTCHANGE_REG A + +opcode_aa: |/* TAX */ + addq.l #cy_RegChg,CD + move.b A,X + NEXTCHANGE_REG A + +opcode_98: |/* TYA */ + addq.l #cy_RegChg,CD + move.b Y,A + NEXTCHANGE_REG A + +opcode_a8: |/* TAY */ + addq.l #cy_RegChg,CD + move.b A,Y + NEXTCHANGE_REG A + +opcode_9a: |/* TXS */ + addq.l #cy_RegChg,CD + move.b X,_regS + bra.w NEXTCHANGE_WITHOUT + +opcode_ba: |/* TSX */ + addq.l #cy_RegChg,CD + move.b _regS,X + NEXTCHANGE_REG X + +opcode_d2: |/* ESCRTS #ab (JAM) - on Atari is here instruction CIM + |[unofficial] !RS! */ + addq.l #cy_CIM,CD + move.b (PC6502)+,d7 + Call_Atari800_RunEsc + PLW d7,d0 + lea (memory_pointer,d7.l),PC6502 + addq.l #1,PC6502 + #ifdef MONITOR_BREAK + tst.b _break_ret + beq.s pcode_d2_mb_end + tst.l _ret_nesting + bmi.s pcode_d2_mb_end + move.b #1,_break_step +pcode_d2_mb_end: + subq.l #1,_ret_nesting + #endif + bra.w NEXTCHANGE_WITHOUT + +opcode_f2: |/* ESC #ab (JAM) - on Atari is here instruction CIM + |[unofficial] !RS! */ + addq.l #cy_CIM,CD + move.b (PC6502)+,d7 + Call_Atari800_RunEsc + bra.w NEXTCHANGE_WITHOUT + +opcode_ea: |/* NOP */ ;official + addq.l #cy_NOP,CD + bra.w NEXTCHANGE_WITHOUT + +opcode_c6: |/* DEC ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_d6: |/* DEC ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_ce: |/* DEC abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + move.b (attrib_pointer,d7.l),d0 + bne.s DEC_Byte_ROMHW + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N +DEC_Byte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s EC_Byte_ROMHW_Getbyte_HW + move.b (memory_pointer,d7.l),ZFLAG |get byte + subq.b #1,ZFLAG + bra.w NEXTCHANGE_N +EC_Byte_ROMHW_Getbyte_HW: + RMW_GETBYTE + move.b d0,ZFLAG + subq.b #1,ZFLAG +| bra.w A800PUTB_Ld0_N +A800PUTB_Ld0_N: + ext.w NFLAG +A800PUTB_Ld0: + move.b ZFLAG,d0 +A800PUTB: + cmp.b #isROM,(attrib_pointer,d7.l) + beq.s A800PUTBE + move.l ZFLAG,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG +A800PUTBE: + bra.w NEXTCHANGE_WITHOUT + +opcode_de: |/* DEC abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + move.b (attrib_pointer,d7.l),d0 + bne.s DEC_Byte_ROMHW + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_ca: |/* DEX */ + addq.l #cy_RegChg,CD + subq.b #1,X + NEXTCHANGE_REG X + +opcode_88: |/* DEY */ + addq.l #cy_RegChg,CD + subq.b #1,Y + NEXTCHANGE_REG Y + +opcode_e6: |/* INC ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_f6: |/* INC ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_ee: |/* INC abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + move.b (attrib_pointer,d7.l),d0 + bne.s INC_Byte_ROMHW + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N +INC_Byte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s NC_Byte_ROMHW_Getbyte_HW + move.b (memory_pointer,d7.l),ZFLAG |get byte + addq.b #1,ZFLAG + bra.w NEXTCHANGE_N +NC_Byte_ROMHW_Getbyte_HW: + RMW_GETBYTE + move.b d0,ZFLAG + addq.b #1,ZFLAG + bra.w A800PUTB_Ld0_N + +opcode_fe: |/* INC abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + move.b (attrib_pointer,d7.l),d0 + bne.s INC_Byte_ROMHW + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_e8: |/* INX */ + addq.l #cy_RegChg,CD + addq.b #1,X + NEXTCHANGE_REG X + +opcode_c8: |/* INY */ + addq.l #cy_RegChg,CD + addq.b #1,Y + NEXTCHANGE_REG Y + + .macro DONT_BRA + addq.l #cy_Bcc,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + .endm + +opcode_10: |/* BPL */ + tst.w NFLAG + bpl.s SOLVE + DONT_BRA + +opcode_30: |/* BMI */ + tst.w NFLAG + bmi.s SOLVE + DONT_BRA + +opcode_d0: |/* BNE */ + tst.b ZFLAG + bne.s SOLVE + DONT_BRA + +opcode_f0: |/* BEQ */ + tst.b ZFLAG + beq.s SOLVE + DONT_BRA + +SOLVE: + move.b (PC6502)+,d7 + extb.l d7 + move.l PC6502,d0 + add.l d7,PC6502 + sub.l memory_pointer,d0 + and.w #255,d0 | !!! + add.w d7,d0 + and.w #0xff00,d0 + bne.s SOLVE_PB + addq.l #cy_Bcc1,CD + bra.w NEXTCHANGE_WITHOUT +SOLVE_PB: + addq.l #cy_Bcc2,CD + bra.w NEXTCHANGE_WITHOUT + +opcode_90: |/* BCC */ + tst.b CFLAG + beq.s SOLVE + DONT_BRA + +opcode_b0: |/* BCS */ + tst.b CFLAG + bne.s SOLVE + DONT_BRA + +opcode_50: |/* BVC */ + tst.b VFLAG + beq.s SOLVE + DONT_BRA + +opcode_70: |/* BVS */ + tst.b VFLAG + bne.s SOLVE + DONT_BRA + + .macro GETANYBYTE_ADC + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s ADC_HW + move.b (memory_pointer,d7.l),d0 |get byte + bra.s adcb + .endm + +adc: + btst #D_FLAGB,_regP + bne.w BCD_ADC + bra.w adcb + +opcode_61: |/* ADC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_ADC + +opcode_71: |/* ADC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_ADC + +ADC_HW: + EXE_GETBYTE + bra.s adcb + +opcode_6d: |/* ADC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_ADC + +opcode_79: |/* ADC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_ADC + +opcode_7d: |/* ADC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_ADC + +adcb: + add.b CFLAG,CFLAG + addx.b d0,A + svs VFLAG + scs CFLAG + NEXTCHANGE_REG A + +opcode_65: |/* ADC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s adcb + +opcode_75: |/* ADC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s adcb + +opcode_69: |/* ADC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s adcb + + .macro GETANYBYTE_ADC_D + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s ADC_HW_D + move.b (memory_pointer,d7.l),d0 |get byte + bra.s BCD_ADC + .endm + +opcode_61_D: |/* ADC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_ADC_D + +opcode_6d_D: |/* ADC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_ADC_D + +opcode_71_D: |/* ADC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_ADC_D + +ADC_HW_D: + EXE_GETBYTE + bra.s BCD_ADC + +opcode_79_D: |/* ADC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_ADC_D + +opcode_7d_D: |/* ADC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_ADC_D + +| Version 1 : exact like Thor +| Z from binary calc. +| N + V after lower nibble decimal correction +| C from decimal calc. +| a lot of code necessary to replicate a 6502 bug +BCD_ADC: + move.w d0,a0 | needed first + moveq #15,d7 + and.b d7,d0 | low nibble Add + move.b A,ZFLAG + and.b d7,ZFLAG | low nibble A + add.b CFLAG,CFLAG + abcd d0,ZFLAG | low nibble BCD add + move.b A,d0 + move.b #0xf0,d7 /// PS! bylo moveq, ale pry operans mismatch + and.b d7,d0 | high nibble Add + add.b d0,ZFLAG + move.w a0,d0 + and.b d7,d0 | high nibble Add + add.b d0,ZFLAG + ext.w NFLAG | NFLAG finished + eor.b A,d0 | A eor data + eor.b A,ZFLAG | A eor temp + not.b ZFLAG + or.b d0,ZFLAG + smi VFLAG | VFLAG finished + move.w a0,d0 | restore data + add.b CFLAG,CFLAG + move.b A,ZFLAG + addx.b d0,ZFLAG | ZFLAG finished + add.b CFLAG,CFLAG + abcd d0,A | A finished + scs CFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_65_D: |/* ADC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s BCD_ADC + +opcode_75_D: |/* ADC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s BCD_ADC + +opcode_69_D: |/* ADC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s BCD_ADC + + .macro GETANYBYTE_SBC + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s SBC_HW + move.b (memory_pointer,d7.l),d0 |get byte + bra.s sbcb + .endm + +sbc: + btst #D_FLAGB,_regP + bne.w BCD_SBC + bra.w sbcb + +opcode_e1: |/* SBC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_SBC + +opcode_f1: |/* SBC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_SBC + +SBC_HW: + EXE_GETBYTE + bra.s sbcb + +opcode_ed: |/* SBC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_SBC + +opcode_f9: |/* SBC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_SBC + +opcode_fd: |/* SBC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_SBC + +sbcb: + subq.b #1,CFLAG + subx.b d0,A + svs VFLAG + scc CFLAG + NEXTCHANGE_REG A + +opcode_e5: |/* SBC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s sbcb + +opcode_f5: |/* SBC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s sbcb + +opcode_eb: |/* SBC #ab [unofficial] */ +opcode_e9: |/* SBC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s sbcb + + .macro GETANYBYTE_SBC_D + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s SBC_HW_D + move.b (memory_pointer,d7.l),d0 |get byte + bra.s BCD_SBC + .endm + +opcode_e1_D: |/* SBC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_SBC_D + +opcode_ed_D: |/* SBC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_SBC_D + +opcode_f1_D: |/* SBC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_SBC_D + +SBC_HW_D: + EXE_GETBYTE + bra.s BCD_SBC + +opcode_f9_D: |/* SBC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_SBC_D + +opcode_fd_D: |/* SBC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_SBC_D + +| Version exact like Thor +| C, Z, N, V from binary calc. +| A from decimal calc. +BCD_SBC: + move.b A,ZFLAG + not.b CFLAG + add.b CFLAG,CFLAG + sbcd d0,A + add.b CFLAG,CFLAG + subx.b d0,ZFLAG + svs VFLAG + scc CFLAG + bra.w NEXTCHANGE_N + +opcode_e5_D: |/* SBC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s BCD_SBC + +opcode_f5_D: |/* SBC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s BCD_SBC + +opcode_eb_D: |/* SBC #ab [unofficial] */ +opcode_e9_D: |/* SBC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s BCD_SBC + +opcode_cc: |/* CPY abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) | GETANYBYTE + beq.s pcode_cc_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + move.b Y,ZFLAG + bra COMPARE +pcode_cc_Getbyte_HW: + EXE_GETBYTE + move.b Y,ZFLAG + bra COMPARE + +opcode_c4: |/* CPY ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + move.b Y,ZFLAG + bra COMPARE + +opcode_c0: |/* CPY #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + move.b Y,ZFLAG + bra COMPARE + +opcode_ec: |/* CPX abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) | GETANYBYTE + beq.s pcode_ec_Getbyte_HW + move.b (memory_pointer,d7.l),d0 |get byte + move.b X,ZFLAG + bra COMPARE +pcode_ec_Getbyte_HW: + EXE_GETBYTE + move.b X,ZFLAG + bra COMPARE + +opcode_e4: |/* CPX ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + move.b X,ZFLAG + bra COMPARE + +opcode_e0: |/* CPX #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + move.b X,ZFLAG + bra COMPARE + + .macro GETANYBYTE_CMP + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s CMP_HW + move.b (memory_pointer,d7.l),d0 |get byte + bra COMPARE_A + .endm + +opcode_c1: |/* CMP (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_CMP + +opcode_d1: |/* CMP (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_CMP + +CMP_HW: + EXE_GETBYTE + bra.w COMPARE_A + +opcode_cd: |/* CMP abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_CMP + +opcode_d9: |/* CMP abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_CMP + +opcode_dd: |/* CMP abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_CMP + +opcode_d5: |/* CMP ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s COMPARE_A + +opcode_c5: |/* CMP ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 | GETZPBYTE + bra.s COMPARE_A + +opcode_c9: |/* CMP #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 +| bra.s COMPARE_A + +COMPARE_A: + move.b A,ZFLAG +COMPARE: + sub.b d0,ZFLAG + scc CFLAG +| bra.w NEXTCHANGE_N + +|MAIN LOOP , where we are counting cycles and working with other STUFF + +NEXTCHANGE_N: + ext.w NFLAG +NEXTCHANGE_WITHOUT: + cmp.l _xpos_limit,CD + bge.s END_OF_CYCLE +**************************************** + #ifdef MONITOR_BREAK +| following block of code allows you to enter a break address + move.l _remember_PC_curpos,d0 + lea _remember_PC,a0 + move.l PC6502,d7 + sub.l memory_pointer,d7 + move.w d7,(a0,d0*2) | remember program counter + addq.l #1,d0 + cmp.l #rem_pc_steps,d0 + bmi.s EXTCHANGE_WITHOUT_point_rem_pc + moveq #0,d0 +EXTCHANGE_WITHOUT_point_rem_pc: + move.l d0,_remember_PC_curpos + #ifdef NEW_CYCLE_EXACT + moveq #0,d0 + move.b _ypos,d0 + asl.w #8,d0 + move.l d0,a1 + move.l CD,d0 + cmp.l #-999,_cur_screen_pos + beq.s EXTCHANGE_WITHOUT_calc_all + move.l _cpu2antic_ptr,a0 + move.l (a0,d0*4),d0 + bra.s EXTCHANGE_WITHOUT_calc_all +EXTCHANGE_WITHOUT_calc_all: + add.l a1,d0 + move.l d0,a1 + move.l _remember_xpos,a0 + move.l _remember_xpos_curpos,d0 + move.l a1,(a0,d0*4) + addq.l #1,d0 + cmp.l #rem_pc_steps,d0 + bmi.s EXTCHANGE_WITHOUT_point_rem_xpos + moveq #0,d0 +EXTCHANGE_WITHOUT_point_rem_xpos: + move.l d0,_remember_xpos_curpos + #endif + cmp.w _break_addr,d7 | break address reached ? + beq.s EXTCHANGE_WITHOUT_go_monitor + move.l _ypos,d0 | !!! or EXTCHANGE_WITHOUT_w ? + cmp.l _ypos_break_addr,d0 | break address reached ? + beq.s EXTCHANGE_WITHOUT_go_monitor + tst.b _break_step | step mode active ? + beq.s EXTCHANGE_WITHOUT_get_first +EXTCHANGE_WITHOUT_go_monitor: + bsr go_monitor |on break monitor is invoked +EXTCHANGE_WITHOUT_get_first: + #endif +**************************************** + moveq #0,d7 + move.b (PC6502)+,d7 + #ifdef PROFILE + lea _instruction_count,a0 + addq.l #1,(a0,d7.l*4) + #endif +| move.w (OPMODE_TABLE,PC,d7.l*2),d0 +| jmp (OPMODE_TABLE,d0.w) + move.w (a3,d7.l*2),d0 + jmp (a3,d0.w) + +END_OF_CYCLE: + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + move.l CD,_xpos |returned value + movem.l (a7)+,d2-d7/a2-a6 +TERM_GO: + rts + +go_monitor: + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + Call_Atari800_Exit_true + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + rts + + .align 4 | doubleword alignment + +OPMODE_TABLE: +OP_T: + .word opcode_00-OP_T + .word opcode_01-OP_T + .word opcode_02-OP_T + .word opcode_03-OP_T + .word opcode_04-OP_T + .word opcode_05-OP_T + .word opcode_06-OP_T + .word opcode_07-OP_T + .word opcode_08-OP_T + .word opcode_09-OP_T + .word opcode_0a-OP_T + .word opcode_0b-OP_T + .word opcode_0c-OP_T + .word opcode_0d-OP_T + .word opcode_0e-OP_T + .word opcode_0f-OP_T + .word opcode_10-OP_T + .word opcode_11-OP_T + .word opcode_12-OP_T + .word opcode_13-OP_T + .word opcode_14-OP_T + .word opcode_15-OP_T + .word opcode_16-OP_T + .word opcode_17-OP_T + .word opcode_18-OP_T + .word opcode_19-OP_T + .word opcode_1a-OP_T + .word opcode_1b-OP_T + .word opcode_1c-OP_T + .word opcode_1d-OP_T + .word opcode_1e-OP_T + .word opcode_1f-OP_T + .word opcode_20-OP_T + .word opcode_21-OP_T + .word opcode_22-OP_T + .word opcode_23-OP_T + .word opcode_24-OP_T + .word opcode_25-OP_T + .word opcode_26-OP_T + .word opcode_27-OP_T + .word opcode_28-OP_T + .word opcode_29-OP_T + .word opcode_2a-OP_T + .word opcode_2b-OP_T + .word opcode_2c-OP_T + .word opcode_2d-OP_T + .word opcode_2e-OP_T + .word opcode_2f-OP_T + .word opcode_30-OP_T + .word opcode_31-OP_T + .word opcode_32-OP_T + .word opcode_33-OP_T + .word opcode_34-OP_T + .word opcode_35-OP_T + .word opcode_36-OP_T + .word opcode_37-OP_T + .word opcode_38-OP_T + .word opcode_39-OP_T + .word opcode_3a-OP_T + .word opcode_3b-OP_T + .word opcode_3c-OP_T + .word opcode_3d-OP_T + .word opcode_3e-OP_T + .word opcode_3f-OP_T + .word opcode_40-OP_T + .word opcode_41-OP_T + .word opcode_42-OP_T + .word opcode_43-OP_T + .word opcode_44-OP_T + .word opcode_45-OP_T + .word opcode_46-OP_T + .word opcode_47-OP_T + .word opcode_48-OP_T + .word opcode_49-OP_T + .word opcode_4a-OP_T + .word opcode_4b-OP_T + .word opcode_4c-OP_T + .word opcode_4d-OP_T + .word opcode_4e-OP_T + .word opcode_4f-OP_T + .word opcode_50-OP_T + .word opcode_51-OP_T + .word opcode_52-OP_T + .word opcode_53-OP_T + .word opcode_54-OP_T + .word opcode_55-OP_T + .word opcode_56-OP_T + .word opcode_57-OP_T + .word opcode_58-OP_T + .word opcode_59-OP_T + .word opcode_5a-OP_T + .word opcode_5b-OP_T + .word opcode_5c-OP_T + .word opcode_5d-OP_T + .word opcode_5e-OP_T + .word opcode_5f-OP_T + .word opcode_60-OP_T + .word opcode_61-OP_T + .word opcode_62-OP_T + .word opcode_63-OP_T + .word opcode_64-OP_T + .word opcode_65-OP_T + .word opcode_66-OP_T + .word opcode_67-OP_T + .word opcode_68-OP_T + .word opcode_69-OP_T + .word opcode_6a-OP_T + .word opcode_6b-OP_T + .word opcode_6c-OP_T + .word opcode_6d-OP_T + .word opcode_6e-OP_T + .word opcode_6f-OP_T + .word opcode_70-OP_T + .word opcode_71-OP_T + .word opcode_72-OP_T + .word opcode_73-OP_T + .word opcode_74-OP_T + .word opcode_75-OP_T + .word opcode_76-OP_T + .word opcode_77-OP_T + .word opcode_78-OP_T + .word opcode_79-OP_T + .word opcode_7a-OP_T + .word opcode_7b-OP_T + .word opcode_7c-OP_T + .word opcode_7d-OP_T + .word opcode_7e-OP_T + .word opcode_7f-OP_T + .word opcode_80-OP_T + .word opcode_81-OP_T + .word opcode_82-OP_T + .word opcode_83-OP_T + .word opcode_84-OP_T + .word opcode_85-OP_T + .word opcode_86-OP_T + .word opcode_87-OP_T + .word opcode_88-OP_T + .word opcode_89-OP_T + .word opcode_8a-OP_T + .word opcode_8b-OP_T + .word opcode_8c-OP_T + .word opcode_8d-OP_T + .word opcode_8e-OP_T + .word opcode_8f-OP_T + .word opcode_90-OP_T + .word opcode_91-OP_T + .word opcode_92-OP_T + .word opcode_93-OP_T + .word opcode_94-OP_T + .word opcode_95-OP_T + .word opcode_96-OP_T + .word opcode_97-OP_T + .word opcode_98-OP_T + .word opcode_99-OP_T + .word opcode_9a-OP_T + .word opcode_9b-OP_T + .word opcode_9c-OP_T + .word opcode_9d-OP_T + .word opcode_9e-OP_T + .word opcode_9f-OP_T + .word opcode_a0-OP_T + .word opcode_a1-OP_T + .word opcode_a2-OP_T + .word opcode_a3-OP_T + .word opcode_a4-OP_T + .word opcode_a5-OP_T + .word opcode_a6-OP_T + .word opcode_a7-OP_T + .word opcode_a8-OP_T + .word opcode_a9-OP_T + .word opcode_aa-OP_T + .word opcode_ab-OP_T + .word opcode_ac-OP_T + .word opcode_ad-OP_T + .word opcode_ae-OP_T + .word opcode_af-OP_T + .word opcode_b0-OP_T + .word opcode_b1-OP_T + .word opcode_b2-OP_T + .word opcode_b3-OP_T + .word opcode_b4-OP_T + .word opcode_b5-OP_T + .word opcode_b6-OP_T + .word opcode_b7-OP_T + .word opcode_b8-OP_T + .word opcode_b9-OP_T + .word opcode_ba-OP_T + .word opcode_bb-OP_T + .word opcode_bc-OP_T + .word opcode_bd-OP_T + .word opcode_be-OP_T + .word opcode_bf-OP_T + .word opcode_c0-OP_T + .word opcode_c1-OP_T + .word opcode_c2-OP_T + .word opcode_c3-OP_T + .word opcode_c4-OP_T + .word opcode_c5-OP_T + .word opcode_c6-OP_T + .word opcode_c7-OP_T + .word opcode_c8-OP_T + .word opcode_c9-OP_T + .word opcode_ca-OP_T + .word opcode_cb-OP_T + .word opcode_cc-OP_T + .word opcode_cd-OP_T + .word opcode_ce-OP_T + .word opcode_cf-OP_T + .word opcode_d0-OP_T + .word opcode_d1-OP_T + .word opcode_d2-OP_T + .word opcode_d3-OP_T + .word opcode_d4-OP_T + .word opcode_d5-OP_T + .word opcode_d6-OP_T + .word opcode_d7-OP_T + .word opcode_d8-OP_T + .word opcode_d9-OP_T + .word opcode_da-OP_T + .word opcode_db-OP_T + .word opcode_dc-OP_T + .word opcode_dd-OP_T + .word opcode_de-OP_T + .word opcode_df-OP_T + .word opcode_e0-OP_T + .word opcode_e1-OP_T + .word opcode_e2-OP_T + .word opcode_e3-OP_T + .word opcode_e4-OP_T + .word opcode_e5-OP_T + .word opcode_e6-OP_T + .word opcode_e7-OP_T + .word opcode_e8-OP_T + .word opcode_e9-OP_T + .word opcode_ea-OP_T + .word opcode_eb-OP_T + .word opcode_ec-OP_T + .word opcode_ed-OP_T + .word opcode_ee-OP_T + .word opcode_ef-OP_T + .word opcode_f0-OP_T + .word opcode_f1-OP_T + .word opcode_f2-OP_T + .word opcode_f3-OP_T + .word opcode_f4-OP_T + .word opcode_f5-OP_T + .word opcode_f6-OP_T + .word opcode_f7-OP_T + .word opcode_f8-OP_T + .word opcode_f9-OP_T + .word opcode_fa-OP_T + .word opcode_fb-OP_T + .word opcode_fc-OP_T + .word opcode_fd-OP_T + .word opcode_fe-OP_T + .word opcode_ff-OP_T + +OPMODE_TABLE_D: +OP_T_D: + .word opcode_00-OP_T_D + .word opcode_01-OP_T_D + .word opcode_02-OP_T_D + .word opcode_03-OP_T_D + .word opcode_04-OP_T_D + .word opcode_05-OP_T_D + .word opcode_06-OP_T_D + .word opcode_07-OP_T_D + .word opcode_08-OP_T_D + .word opcode_09-OP_T_D + .word opcode_0a-OP_T_D + .word opcode_0b-OP_T_D + .word opcode_0c-OP_T_D + .word opcode_0d-OP_T_D + .word opcode_0e-OP_T_D + .word opcode_0f-OP_T_D + .word opcode_10-OP_T_D + .word opcode_11-OP_T_D + .word opcode_12-OP_T_D + .word opcode_13-OP_T_D + .word opcode_14-OP_T_D + .word opcode_15-OP_T_D + .word opcode_16-OP_T_D + .word opcode_17-OP_T_D + .word opcode_18-OP_T_D + .word opcode_19-OP_T_D + .word opcode_1a-OP_T_D + .word opcode_1b-OP_T_D + .word opcode_1c-OP_T_D + .word opcode_1d-OP_T_D + .word opcode_1e-OP_T_D + .word opcode_1f-OP_T_D + .word opcode_20-OP_T_D + .word opcode_21-OP_T_D + .word opcode_22-OP_T_D + .word opcode_23-OP_T_D + .word opcode_24-OP_T_D + .word opcode_25-OP_T_D + .word opcode_26-OP_T_D + .word opcode_27-OP_T_D + .word opcode_28-OP_T_D + .word opcode_29-OP_T_D + .word opcode_2a-OP_T_D + .word opcode_2b-OP_T_D + .word opcode_2c-OP_T_D + .word opcode_2d-OP_T_D + .word opcode_2e-OP_T_D + .word opcode_2f-OP_T_D + .word opcode_30-OP_T_D + .word opcode_31-OP_T_D + .word opcode_32-OP_T_D + .word opcode_33-OP_T_D + .word opcode_34-OP_T_D + .word opcode_35-OP_T_D + .word opcode_36-OP_T_D + .word opcode_37-OP_T_D + .word opcode_38-OP_T_D + .word opcode_39-OP_T_D + .word opcode_3a-OP_T_D + .word opcode_3b-OP_T_D + .word opcode_3c-OP_T_D + .word opcode_3d-OP_T_D + .word opcode_3e-OP_T_D + .word opcode_3f-OP_T_D + .word opcode_40-OP_T_D + .word opcode_41-OP_T_D + .word opcode_42-OP_T_D + .word opcode_43-OP_T_D + .word opcode_44-OP_T_D + .word opcode_45-OP_T_D + .word opcode_46-OP_T_D + .word opcode_47-OP_T_D + .word opcode_48-OP_T_D + .word opcode_49-OP_T_D + .word opcode_4a-OP_T_D + .word opcode_4b-OP_T_D + .word opcode_4c-OP_T_D + .word opcode_4d-OP_T_D + .word opcode_4e-OP_T_D + .word opcode_4f-OP_T_D + .word opcode_50-OP_T_D + .word opcode_51-OP_T_D + .word opcode_52-OP_T_D + .word opcode_53-OP_T_D + .word opcode_54-OP_T_D + .word opcode_55-OP_T_D + .word opcode_56-OP_T_D + .word opcode_57-OP_T_D + .word opcode_58-OP_T_D + .word opcode_59-OP_T_D + .word opcode_5a-OP_T_D + .word opcode_5b-OP_T_D + .word opcode_5c-OP_T_D + .word opcode_5d-OP_T_D + .word opcode_5e-OP_T_D + .word opcode_5f-OP_T_D + .word opcode_60-OP_T_D + .word opcode_61_D-OP_T_D + .word opcode_62-OP_T_D + .word opcode_63-OP_T_D + .word opcode_64-OP_T_D + .word opcode_65_D-OP_T_D + .word opcode_66-OP_T_D + .word opcode_67-OP_T_D + .word opcode_68-OP_T_D + .word opcode_69_D-OP_T_D + .word opcode_6a-OP_T_D + .word opcode_6b-OP_T_D + .word opcode_6c-OP_T_D + .word opcode_6d_D-OP_T_D + .word opcode_6e-OP_T_D + .word opcode_6f-OP_T_D + .word opcode_70-OP_T_D + .word opcode_71_D-OP_T_D + .word opcode_72-OP_T_D + .word opcode_73-OP_T_D + .word opcode_74-OP_T_D + .word opcode_75_D-OP_T_D + .word opcode_76-OP_T_D + .word opcode_77-OP_T_D + .word opcode_78-OP_T_D + .word opcode_79_D-OP_T_D + .word opcode_7a-OP_T_D + .word opcode_7b-OP_T_D + .word opcode_7c-OP_T_D + .word opcode_7d_D-OP_T_D + .word opcode_7e-OP_T_D + .word opcode_7f-OP_T_D + .word opcode_80-OP_T_D + .word opcode_81-OP_T_D + .word opcode_82-OP_T_D + .word opcode_83-OP_T_D + .word opcode_84-OP_T_D + .word opcode_85-OP_T_D + .word opcode_86-OP_T_D + .word opcode_87-OP_T_D + .word opcode_88-OP_T_D + .word opcode_89-OP_T_D + .word opcode_8a-OP_T_D + .word opcode_8b-OP_T_D + .word opcode_8c-OP_T_D + .word opcode_8d-OP_T_D + .word opcode_8e-OP_T_D + .word opcode_8f-OP_T_D + .word opcode_90-OP_T_D + .word opcode_91-OP_T_D + .word opcode_92-OP_T_D + .word opcode_93-OP_T_D + .word opcode_94-OP_T_D + .word opcode_95-OP_T_D + .word opcode_96-OP_T_D + .word opcode_97-OP_T_D + .word opcode_98-OP_T_D + .word opcode_99-OP_T_D + .word opcode_9a-OP_T_D + .word opcode_9b-OP_T_D + .word opcode_9c-OP_T_D + .word opcode_9d-OP_T_D + .word opcode_9e-OP_T_D + .word opcode_9f-OP_T_D + .word opcode_a0-OP_T_D + .word opcode_a1-OP_T_D + .word opcode_a2-OP_T_D + .word opcode_a3-OP_T_D + .word opcode_a4-OP_T_D + .word opcode_a5-OP_T_D + .word opcode_a6-OP_T_D + .word opcode_a7-OP_T_D + .word opcode_a8-OP_T_D + .word opcode_a9-OP_T_D + .word opcode_aa-OP_T_D + .word opcode_ab-OP_T_D + .word opcode_ac-OP_T_D + .word opcode_ad-OP_T_D + .word opcode_ae-OP_T_D + .word opcode_af-OP_T_D + .word opcode_b0-OP_T_D + .word opcode_b1-OP_T_D + .word opcode_b2-OP_T_D + .word opcode_b3-OP_T_D + .word opcode_b4-OP_T_D + .word opcode_b5-OP_T_D + .word opcode_b6-OP_T_D + .word opcode_b7-OP_T_D + .word opcode_b8-OP_T_D + .word opcode_b9-OP_T_D + .word opcode_ba-OP_T_D + .word opcode_bb-OP_T_D + .word opcode_bc-OP_T_D + .word opcode_bd-OP_T_D + .word opcode_be-OP_T_D + .word opcode_bf-OP_T_D + .word opcode_c0-OP_T_D + .word opcode_c1-OP_T_D + .word opcode_c2-OP_T_D + .word opcode_c3-OP_T_D + .word opcode_c4-OP_T_D + .word opcode_c5-OP_T_D + .word opcode_c6-OP_T_D + .word opcode_c7-OP_T_D + .word opcode_c8-OP_T_D + .word opcode_c9-OP_T_D + .word opcode_ca-OP_T_D + .word opcode_cb-OP_T_D + .word opcode_cc-OP_T_D + .word opcode_cd-OP_T_D + .word opcode_ce-OP_T_D + .word opcode_cf-OP_T_D + .word opcode_d0-OP_T_D + .word opcode_d1-OP_T_D + .word opcode_d2-OP_T_D + .word opcode_d3-OP_T_D + .word opcode_d4-OP_T_D + .word opcode_d5-OP_T_D + .word opcode_d6-OP_T_D + .word opcode_d7-OP_T_D + .word opcode_d8-OP_T_D + .word opcode_d9-OP_T_D + .word opcode_da-OP_T_D + .word opcode_db-OP_T_D + .word opcode_dc-OP_T_D + .word opcode_dd-OP_T_D + .word opcode_de-OP_T_D + .word opcode_df-OP_T_D + .word opcode_e0-OP_T_D + .word opcode_e1_D-OP_T_D + .word opcode_e2-OP_T_D + .word opcode_e3-OP_T_D + .word opcode_e4-OP_T_D + .word opcode_e5_D-OP_T_D + .word opcode_e6-OP_T_D + .word opcode_e7-OP_T_D + .word opcode_e8-OP_T_D + .word opcode_e9_D-OP_T_D + .word opcode_ea-OP_T_D + .word opcode_eb_D-OP_T_D + .word opcode_ec-OP_T_D + .word opcode_ed_D-OP_T_D + .word opcode_ee-OP_T_D + .word opcode_ef-OP_T_D + .word opcode_f0-OP_T_D + .word opcode_f1_D-OP_T_D + .word opcode_f2-OP_T_D + .word opcode_f3-OP_T_D + .word opcode_f4-OP_T_D + .word opcode_f5_D-OP_T_D + .word opcode_f6-OP_T_D + .word opcode_f7-OP_T_D + .word opcode_f8-OP_T_D + .word opcode_f9_D-OP_T_D + .word opcode_fa-OP_T_D + .word opcode_fb-OP_T_D + .word opcode_fc-OP_T_D + .word opcode_fd_D-OP_T_D + .word opcode_fe-OP_T_D + .word opcode_ff-OP_T_D + +cycles: +_cycles: | dc.l for the world outside, equ for internal use + .long cy_BRK,cy_IndX,cy_CIM,cy_IndX_RW,cy_NOP3,cy_ZP,cy_ZP_RW,cy_ZP_RW + .long cy_RegPH,cy_Imm,cy_RegChg,cy_Imm,cy_SKW,cy_Abs,cy_Abs_RW,cy_Abs_RW + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + .long cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + .long cy_Sub,cy_IndX,cy_CIM,cy_IndX_RW,cy_ZP,cy_ZP,cy_ZP_RW,cy_ZP_RW + .long cy_RegPL,cy_Imm,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs_RW,cy_Abs_RW + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + .long cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + .long cy_Sub,cy_IndX,cy_CIM,cy_IndX_RW,cy_NOP3,cy_ZP,cy_ZP_RW,cy_ZP_RW + .long cy_RegPH,cy_Imm,cy_RegChg,cy_Imm,cy_JmpAbs,cy_Abs,cy_Abs_RW,cy_Abs_RW + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + .long cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + .long cy_Sub,cy_IndX,cy_CIM,cy_IndX_RW,cy_NOP3,cy_ZP,cy_ZP_RW,cy_ZP_RW + .long cy_RegPL,cy_Imm,cy_RegChg,cy_Imm,cy_JmpInd,cy_Abs,cy_Abs_RW,cy_Abs_RW + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + .long cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + .long cy_NOP2,cy_IndX,cy_NOP2,cy_IndX,cy_ZP,cy_ZP,cy_ZP,cy_ZP + .long cy_RegChg,cy_NOP2,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs,cy_Abs + .long cy_Bcc,cy_IndY2,cy_CIM,cy_IndY2,cy_ZPX,cy_ZPX,cy_ZPY,cy_ZPY + .long cy_RegChg,cy_IndY2,cy_RegChg,cy_IndY2,cy_AbsX2,cy_AbsX2,cy_IndY2,cy_IndY2 + .long cy_Imm,cy_IndX,cy_Imm,cy_IndX,cy_ZP,cy_ZP,cy_ZP,cy_ZP + .long cy_RegChg,cy_Imm,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs,cy_Abs + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY,cy_ZPX,cy_ZPX,cy_ZPY,cy_ZPY + .long cy_FlagCS,cy_AbsY,cy_RegChg,cy_AbsY,cy_AbsX,cy_AbsX,cy_AbsY,cy_AbsY + .long cy_Imm,cy_IndX,cy_NOP2,cy_IndX_RW,cy_ZP,cy_ZP,cy_ZP_RW,cy_ZP_RW + .long cy_RegChg,cy_Imm,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs_RW,cy_Abs_RW + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + .long cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + .long cy_Imm,cy_IndX,cy_NOP2,cy_IndX_RW,cy_ZP,cy_ZP,cy_ZP_RW,cy_ZP_RW + .long cy_RegChg,cy_Imm,cy_NOP,cy_Imm,cy_Abs,cy_Abs,cy_Abs_RW,cy_Abs_RW + .long cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + .long cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + + diff --git a/PVAtari800/atari800-src/cpu_m68k.asm b/PVAtari800/atari800-src/cpu_m68k.asm new file mode 100644 index 0000000000..319f7e240b --- /dev/null +++ b/PVAtari800/atari800-src/cpu_m68k.asm @@ -0,0 +1,4003 @@ +; cpu_m68k.asm - 6502 CPU emulation for Atari Falcon port +; +; Copyright (C) 2001 Karel Rous (empty head) +; Copyright (C) 2001-2003 Atari800 development team (see DOC/CREDITS) +; +; This file is part of the Atari800 emulator project which emulates +; the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. +; +; Atari800 is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; Atari800 is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Atari800; if not, write to the Free Software +; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +; +; Last changes : 30th March 2003, gerhard.janka + +; P65C02 ; we emulate this version of processor (6502 has a bug in jump code, + ; you can emulate this bug by commenting out this line :) +; PROFILE ; fills the 'instruction_count' array for instruction profiling +; MONITOR_BREAK ; jump to monitor at break +; CRASH_MENU ; enable crash menu output +; CYCLE_EXACT ; !NO_CYCLE_EXACT :) +; NEW_CYCLE_EXACT ; !NO_NEW_CYCLE_EXACT :) + + OPT P=68040,L1,O+,W- + output cpu_m68k.o + + xref _CART_BountyBob2 + xref _CART_BountyBob1 + xref _GTIA_GetByte + xref _POKEY_GetByte + xref _PIA_GetByte + xref _ANTIC_GetByte + xref _CART_GetByte + xref _GTIA_PutByte + xref _POKEY_PutByte + xref _PIA_PutByte + xref _ANTIC_PutByte + xref _CART_PutByte + xref _Atari800_RunEsc + xref _Atari800_Exit + xref _exit + xref _wsync_halt ;CPU is stopped + ifd NEW_CYCLE_EXACT + xref _delayed_wsync + xref _antic2cpu_ptr + xref _cur_screen_pos + endc + xref _xpos + xref _xpos_limit + xdef _regPC + xdef _regA + xdef _regP ;/* Processor Status Byte (Partial) */ + xdef _regS + xdef _regX + xdef _regY + xref _memory + xref _attrib + ifd PROFILE + xref _instruction_count + endc + ifd MONITOR_BREAK + xdef _remember_PC + xdef _remember_PC_curpos + ifd NEW_CYCLE_EXACT + xdef _remember_xpos + xdef _remember_xpos_curpos + endc + xdef _remember_JMP + xdef _remember_jmp_curpos + xref _ypos_break_addr + xref _ypos + xref _break_addr + xref _break_step + xref _break_ret + xref _break_cim + xref _break_here + xref _brkhere + xref _ret_nesting + endc + ifd CRASH_MENU + xref _crash_code + xref _crash_address + xref _crash_afterCIM + endc + xdef _IRQ + xdef _NMI + xdef _RTI + xdef _GO + xdef _CPUGET + xdef _CPUPUT + xdef _CPU_INIT + xdef _cycles ;temporarily needed outside :) + xdef _cim_encountered + xdef _rts_handler + + ifd MONITOR_BREAK + +rem_pc_steps equ 64 ; has to be equal to REMEMBER_PC_STEPS +rem_jmp_steps equ 16 ; has to be equal to REMEMBER_JMP_STEPS + +remember_PC +_remember_PC + ds.w rem_pc_steps ;REMEMBER_PC_STEPS +remember_PC_curpos +_remember_PC_curpos + ds.l 1 +remember_xpos +_remember_xpos + ds.l rem_pc_steps ;REMEMBER_PC_STEPS +remember_xpos_curpos +_remember_xpos_curpos + ds.l 1 + +remember_JMP +_remember_JMP + ds.w rem_jmp_steps ;REMEMBER_JMP_STEPS +remember_jmp_curpos +_remember_jmp_curpos + ds.l 1 + + endc + + even + + cnop 0,4 ; doubleword alignment + +regP + ds.b 1 ; +_regP ds.b 1 ; CCR + +regA + ds.b 1 +_regA ds.b 1 ; A + +regX + ds.b 1 +_regX ds.b 1 ; X + +regY + ds.b 1 +_regY ds.b 1 ; Y + +regPC +_regPC ds.w 1 ; PC + +regS + ds.b 1 +_regS ds.b 1 ; stack + +IRQ +_IRQ ds.b 1 + ds.b 1 ; dummy + +_cim_encountered + ds.b 1 + +_rts_handler + ds.l 1 + + even + +memory_pointer equr a5 +attrib_pointer equr a4 +PC6502 equr a2 + +CD equr a6 ; cycles counter up +ZFLAG equr d1 ; Bit 0..7 +NFLAG equr d1 ; Bit 8..15 +VFLAG equr d6 ; Bit 7 +DFLAG equr d6 ; Bit 15 +CFLAG equr d5 ; Bit 0..7, ( 1 = ff ) +A equr d2 +X equr d3 +Y equr d4 + +;d0 contains usually adress where we are working or temporary value +;d7 contains is a working register or adress + +LoHi macro ;change order of lo and hi byte (address) + ror.w #8,\1 + endm + +; ========================================================== +; Emulated Registers and Flags are kept local to this module +; ========================================================== + +; regP=processor flags; regPC=PC; regA=A; regX=X; regY=Y +UPDATE_GLOBAL_REGS macro + sub.l memory_pointer,PC6502 + movem.w d0/d2-d4/a2,regP ; d0->regP, d2-d4 (A,X,Y) a2 (regPC) + endm + +; PC=regPC; A=regA; X=regX; Y=regY +UPDATE_LOCAL_REGS macro + moveq #0,d7 + move.w regP,d0 + move.w regA,d2 + move.w regX,d3 + move.w regY,d4 + move.w regPC,d7 + move.l memory_pointer,PC6502 + add.l d7,PC6502 + lea OPMODE_TABLE,a3 + btst #D_FLAGB,_regP + beq.s .upd_end + lea OPMODE_TABLE_D,a3 +.upd_end: + endm + +_Local_GetByte: + move.l d7,d1 + moveq #0,d0 + move.b d1,d0 + lsr.w #8,d1 + move.b (HIxTable,d1.l),d1 +; jmp ([GetTable,PC,d1.l*4]) + move.w (GetTable,PC,d1.l*2),d1 + jmp (GetTable,d1.w) + +GetTable: + dc.w GetNone-GetTable,GetGTIA-GetTable + dc.w GetPOKEY-GetTable,GetPIA-GetTable + dc.w GetANTIC-GetTable,GetCART-GetTable + dc.w ItsBob1-GetTable,ItsBob2-GetTable + +GetNone: + st d0 ; higher bytes are 0 from before + rts +GetGTIA: + move.l d0,-(a7) + jsr _GTIA_GetByte + addq.l #4,a7 + rts +GetPOKEY: + move.l d0,-(a7) + jsr _POKEY_GetByte + addq.l #4,a7 + rts +GetPIA: + move.l d0,-(a7) + jsr _PIA_GetByte + addq.l #4,a7 + rts +GetANTIC: + move.l d0,-(a7) + jsr _ANTIC_GetByte + addq.l #4,a7 + rts +GetCART: + move.l d0,-(a7) + jsr _CART_GetByte + addq.l #4,a7 + rts +ItsBob2: + move.w d7,-(a7) + clr.w -(a7) + jsr _CART_BountyBob2 + addq.l #4,a7 + moveq #0,d0 + rts +ItsBob1: + move.w d7,-(a7) + clr.w -(a7) + jsr _CART_BountyBob1 + addq.l #4,a7 + moveq #0,d0 + rts + +_Local_PutByte: + moveq #0,d1 + move.w d7,d1 + lsr.w #8,d1 + move.b (HIxTable,d1.l),d1 + jmp ([PutTable,PC,d1.l*4]) + +PutTable: + dc.l PutNone,PutGTIA,PutPOKEY,PutPIA + dc.l PutANTIC,PutCART,ItsBob1,ItsBob2 + +PutNone: + moveq #0,d0 + rts +PutGTIA: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + ifd CYCLE_EXACT + move.l CD,_xpos + endc + jsr _GTIA_PutByte + addq.l #8,a7 + rts +PutPOKEY: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + ifd CYCLE_EXACT + move.l CD,_xpos + endc + jsr _POKEY_PutByte + addq.l #8,a7 + rts +PutPIA: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + jsr _PIA_PutByte + addq.l #8,a7 + rts +PutANTIC: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + move.l CD,_xpos + jsr _ANTIC_PutByte + move.l _xpos,CD + addq.l #8,a7 + rts +PutCART: + move.b d0,d1 + move.l d1,-(a7) + move.b d7,d1 + move.l d1,-(a7) + jsr _CART_PutByte + addq.l #8,a7 + rts + +HIxNone equ 0 +HIxGTIA8 equ 1 +HIxGTIA5 equ 1 +HIxPOKEY8 equ 2 +HIxPOKEY5 equ 2 +HIxPIA8 equ 3 +HIxANTIC8 equ 4 +HIxCART equ 5 +HIxBob1 equ 6 +HIxBob2 equ 7 + +HIxTable: + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 00..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 04..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 08..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 0c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 10..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 14..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 18..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 1c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 20..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 24..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 28..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 2c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 30..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 34..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 38..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 3c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 40..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 44..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 48..b + dc.b HIxNone,HIxNone,HIxNone,HIxBob1 ; 4c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 50..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 54..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 58..b + dc.b HIxNone,HIxNone,HIxNone,HIxBob2 ; 5c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 60..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 64..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 68..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 6c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 70..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 74..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 78..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 7c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 80..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 84..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 88..b + dc.b HIxNone,HIxNone,HIxNone,HIxBob1 ; 8c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 90..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 94..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; 98..b + dc.b HIxNone,HIxNone,HIxNone,HIxBob2 ; 9c..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; a0..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; a4..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; a8..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; ac..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; b0..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; b4..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; b8..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; bc..f + dc.b HIxGTIA5,HIxNone,HIxNone,HIxNone ; c0..3 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; c4..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; c8..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; cc..f + dc.b HIxGTIA8,HIxNone,HIxPOKEY8,HIxPIA8 ; d0..3 + dc.b HIxANTIC8,HIxCART,HIxNone,HIxNone ; d4..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; d8..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; dc..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; e0..3 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; e4..7 + dc.b HIxPOKEY5,HIxNone,HIxNone,HIxPOKEY5 ; e8..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; ec..f + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; f0..3 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; f4..7 + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; f8..b + dc.b HIxNone,HIxNone,HIxNone,HIxNone ; fc..f + +EXE_GETBYTE macro +; move.l d7,-(a7) + jsr _Local_GetByte +; addq.l #4,a7 ;put stack onto right place + endm + +EXE_PUTBYTE macro +; clr.l -(a7) +; move.b \1,3(a7) ;byte + jsr _Local_PutByte +; addq.l #8,a7 + endm + +RMW_GETBYTE macro + ifd CYCLE_EXACT + move.w d7,d0 + and.w #$ef1f,d0 + cmp.w #$c01a,d0 + bne.s .normal_get + EXE_GETBYTE + subq.l #1,CD + move.l d0,-(a7) + EXE_PUTBYTE d0 + move.l (a7)+,d0 + addq.l #1,CD + bra.s .end_rmw_get +.normal_get: + EXE_GETBYTE +.end_rmw_get: + elseif + EXE_GETBYTE + endc + endm + +_CPU_INIT: + ifd MONITOR_BREAK + moveq #0,d0 + move.l d0,_remember_PC_curpos + move.l d0,_remember_xpos_curpos + move.l d0,_remember_jmp_curpos + endc + moveq #1,d0 ; set regS to page 1 + move.b d0,regS + rts + +;these are bit in MC68000 CCR register +NB68 equ 3 +EB68 equ 4 ;X +ZB68 equ 2 +OB68 equ 1 +CB68 equ 0 + +WSYNC_C equ 106 + +N_FLAG equ $80 +N_FLAGN equ $7f +N_FLAGB equ 7 +V_FLAG equ $40 +V_FLAGN equ $bf +V_FLAGB equ 6 +G_FLAG equ $20 +G_FLAGB equ 5 +B_FLAG equ $10 +B_FLAGN equ $ef +B_FLAGB equ 4 +D_FLAG equ $08 +D_FLAGN equ $f7 +D_FLAGB equ 3 +I_FLAG equ $04 +I_FLAGN equ $fb +I_FLAGB equ 2 +Z_FLAG equ $02 +Z_FLAGN equ $fd +Z_FLAGB equ 1 +C_FLAG equ $01 +C_FLAGN equ $fe +C_FLAGB equ 0 +VCZN_FLAGS equ $c3 +VCZN_FLAGSN equ $3c + +SetI macro + ori.b #I_FLAG,_regP + endm + +ClrI macro + andi.b #I_FLAGN,_regP + endm + +SetB macro + ori.b #B_FLAG,_regP + endm + +SetD macro + ori.b #D_FLAG,_regP + lea OPMODE_TABLE_D,a3 + endm + +ClrD macro + andi.b #D_FLAGN,_regP + lea OPMODE_TABLE,a3 + endm + +;static UBYTE N; /* bit7 zero (0) or bit 7 non-zero (1) */ +;static UBYTE Z; /* zero (0) or non-zero (1) */ +;static UBYTE V; +;static UBYTE C; /* zero (0) or one(1) */ + +isRAM equ 0 +isROM equ 1 +isHARDWARE equ 2 + +;/* +; * The following array is used for 6502 instruction profiling +; */ + +;int instruction_count[256]; + +;UBYTE memory[65536]; +;UBYTE attrib[65536]; + +;/* +; =============================================================== +; Z flag: This actually contains the result of an operation which +; would modify the Z flag. The value is tested for +; equality by the BEQ and BNE instruction. +; =============================================================== +;*/ + +; Bit : 76543210 +; 68000 : ***XNZVC +; _RegP : NV*BDIZC + +ConvertSTATUS_RegP macro + move.b _regP,\1 ;put flag BDI into d0 + andi.b #VCZN_FLAGSN,\1 ; clear overflow, carry, zero & negative flag + tst.b CFLAG + beq.s .SETC\@ + addq.b #1,\1 +.SETC\@ + tst.w NFLAG + bpl.s .SETN\@ +; ori.b #N_FLAG,\1 + tas \1 +.SETN\@ + tst.b ZFLAG + bne.s .SETZ\@ ; beware! reverse compare is ok + addq.b #2,\1 +.SETZ\@ + tst.b VFLAG + bpl.s .SETV\@ ; !!! + ori.b #V_FLAG,\1 +.SETV\@ + endm + +ConvertSTATUS_RegP_destroy macro + move.b _regP,\1 ;put flag BDI into d0 + andi.b #VCZN_FLAGSN,\1 ; clear overflow, carry, zero & negative flag + lsr.b #7,CFLAG + or.b CFLAG,\1 + tst.w NFLAG + bpl.s .SETN\@ +; ori.b #N_FLAG,\1 + tas \1 +.SETN\@ + tst.b ZFLAG + bne.s .SETZ\@ ; beware! reverse compare is ok + addq.b #2,\1 +.SETZ\@ + tst.b VFLAG + bpl.s .SETV\@ ; !!! + ori.b #V_FLAG,\1 +.SETV\@ + endm + +ConvertRegP_STATUS macro + btst #V_FLAGB,\1 + sne VFLAG + btst #C_FLAGB,\1 + sne CFLAG + move.b \1,NFLAG + lsl.w #8,NFLAG ; sets NFLAG and clears ZFLAG + btst #Z_FLAGB,\1 + seq ZFLAG + endm + +Call_Atari800_RunEsc macro +; move.l d7,-(a7) !!!TEST!!! + clr.l -(a7) ;!!!TEST!!! + move.b d7,(3,a7) ;!!!TEST!!! + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + jsr _Atari800_RunEsc + addq.l #4,a7 + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + endm + +Call_Atari800_Exit_true macro + pea $1.W + jsr _Atari800_Exit + addq.l #4,a7 + tst.l d0 + bne.s .GOON\@ + clr.l -(a7) + jsr _exit +.GOON\@ + endm + +PLW macro + moveq #0,\2 + move.w regS,\2 + addq.b #2,\2 ; wrong way around + move.b (memory_pointer,\2.l),\1 + asl.w #8,\1 + subq.b #1,\2 + or.b (memory_pointer,\2.l),\1 + addq.b #1,\2 + move.b \2,_regS + endm + +SetVFLAG macro + st VFLAG + endm + +ClrVFLAG macro + clr.b VFLAG + endm + +SetCFLAG macro + st CFLAG + endm + +ClrCFLAG macro + clr.b CFLAG + endm + +CPUGET: +_CPUGET: + ConvertSTATUS_RegP d0 + move.b d0,_regP + rts + +CPUPUT: +_CPUPUT: + move.b _regP,d0 + ConvertRegP_STATUS d0 + rts + +NMI: +_NMI: + lea _memory,a0 + moveq #0,d1 + move.w regS,d1 + move.b _regPC,(a0,d1.l) + subq.b #1,d1 + move.b _regPC+1,(a0,d1.l) + subq.b #1,d1 +; move.b _regP,(a0,d1.l) ;put P onto stack + move.b _regP,d0 ; Test + andi.b #B_FLAGN,d0 ; Test + move.b d0,(a0,d1.l) ; Test + subq.b #1,d1 + move.b d1,_regS + SetI + ;put regPC & Stack pointer adress on its place + move.w (a0,$fffa.l),d1 + LoHi d1 + move.w d1,_regPC + addq.l #7,_xpos + ifd MONITOR_BREAK + addq.l #1,_ret_nesting + endc + rts + +_GO: ;cycles (d0) + +; UWORD PC; +; UBYTE S; +; UBYTE A; +; UBYTE X; +; UBYTE Y; +; +; UWORD addr; +; UBYTE data; + +;/* +; This used to be in the main loop but has been removed to improve +; execution speed. It does not seem to have any adverse effect on +; the emulation for two reasons:- +; +; 1. NMI's can only be raised in atari_custom.c - there is +; no way an NMI can be generated whilst in this routine. +; +; 2. The timing of the IRQs are not that critical. +;*/ + + move.l 4(a7),d0 + ifd NEW_CYCLE_EXACT + tst.b _wsync_halt + beq.s NO_WS_HALT + moveq.l #WSYNC_C-1,d1 ; TEST : no -1 if bpl.s + cmp.l #-999,_cur_screen_pos + beq.s .now_cmp + move.l _antic2cpu_ptr,a0 + move.l (a0,d1*4),d1 +.now_cmp: + add.l _delayed_wsync,d1 + cmp.l d0,d1 +; bpl.s TERM_GO ; TEST + bge TERM_GO ; TEST + addq.l #1,d1 ; TEST : not necessary if bpl.s + move.l d1,_xpos + clr.b _wsync_halt + clr.l _delayed_wsync + elseif + tst.b _wsync_halt + beq.s NO_WS_HALT + moveq.l #WSYNC_C-1,d1 ; TEST : no -1 if bpl.s + cmp.l d0,d1 +; bpl.s TERM_GO ; TEST + bge TERM_GO ; TEST + addq.l #1,d1 ; TEST : not necessary if bpl.s + move.l d1,_xpos + clr.b _wsync_halt + endc +NO_WS_HALT: + move.l d0,_xpos_limit ; needed for WSYNC store inside ANTIC + movem.l d2-d7/a2-a6,-(a7) + move.l _xpos,CD + lea _memory,memory_pointer + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + lea _attrib,attrib_pointer + tst.b _IRQ ; CPUCHECKIRQ + beq NEXTCHANGE_WITHOUT + move.b d0,d7 +; and.b #I_FLAG,d0 ;is interrupt active + btst #I_FLAG,d0 + bne NEXTCHANGE_WITHOUT ;yes, no other interrupt + moveq #0,d0 + move.w regS,d0 ; push PC and P to stack ( PHW + PHB ) start + move.b _regPC,(memory_pointer,d0.l) + subq.b #1,d0 + move.b _regPC+1,(memory_pointer,d0.l) + subq.b #1,d0 +; move.b d7,(memory_pointer,d0.l) ;put P onto stack + andi.b #B_FLAGN,d7 ; TEST + move.b d7,(memory_pointer,d0.l) ; TEST + subq.b #1,d0 + move.b d0,_regS ; push PC and P to stack ( PHW + PHB ) end + SetI + move.w (memory_pointer,$fffe.l),d0 ; d0 already cleared from before + LoHi d0 + move.l d0,PC6502 + add.l memory_pointer,PC6502 + addq.l #7,CD + clr.b _IRQ ;clear interrupt..... + ifd MONITOR_BREAK + addq.l #1,_ret_nesting + endc + bra NEXTCHANGE_WITHOUT + +;/* +; ===================================== +; Extract Address if Required by Opcode +; ===================================== +;*/ + +;d0 contains final value for use in program + +; addressing macros + +NCYCLES_XY macro + cmp.b \1,d7 ; if ( (UBYTE) addr < X,Y ) ncycles++; +; bpl.s .NCY_XY_NC\@ + bcc.s .NCY_XY_NC\@ ; !!! + addq.l #1,CD +.NCY_XY_NC\@: + endm + +ABSOLUTE macro + move.w (PC6502)+,d7 + LoHi d7 ;d7 contains reversed value + endm + +ABSOLUTE_X macro + ABSOLUTE + add.w X,d7 + endm + +ABSOLUTE_X_NCY macro + ABSOLUTE_X \1 + NCYCLES_XY X + endm + +ABSOLUTE_Y macro + ABSOLUTE + add.w Y,d7 + endm + +ABSOLUTE_Y_NCY macro + ABSOLUTE_Y \1 + NCYCLES_XY Y + endm + +IMMEDIATE macro + move.b (PC6502)+,\1 + endm + +INDIRECT_X macro + move.b (PC6502)+,d7 + add.b X,d7 + move.w (memory_pointer,d7.l),d7 + LoHi d7 + endm + +INDIRECT_Y macro + move.b (PC6502)+,d7 + move.w (memory_pointer,d7.l),d7 + LoHi d7 ;swap bytes + add.w Y,d7 + endm + +INDIRECT_Y_NCY macro + INDIRECT_Y + NCYCLES_XY Y + endm + +ZPAGE macro + move.b (PC6502)+,d7 + endm + +ZPAGE_X macro + move.b (PC6502)+,d7 + add.b X,d7 + endm + +ZPAGE_Y macro + move.b (PC6502)+,d7 + add.b Y,d7 + endm + +; miscellaneous macros + +NEXTCHANGE_REG macro + move.b \1,ZFLAG + bra.w NEXTCHANGE_N + endm + +; command macros + +ROL_C macro + add.b CFLAG,CFLAG + addx.b \1,\1 ;left + scs CFLAG + endm + +ROR_C macro + add.b CFLAG,CFLAG + roxr.b #1,\1 + scs CFLAG + endm + +ASL_C macro + add.b \1,\1 ;left + scs CFLAG + endm + +LSR_C macro + lsr.b #1,\1 + scs CFLAG + endm + +; opcodes + +; inofficial opcodes + +; unstable inofficial opcodes + +opcode_93: ;/* SHA (ab),y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] */ +; /* It seems previous memory value is important - also in 9f */; + addq.l #cy_IndY2,CD + move.b (PC6502)+,d7 + addq.b #1,d7 + move.b (memory_pointer,d7.l),d0 + addq.b #1,d0 + and.b A,d0 + and.b X,d0 + move.w (memory_pointer,d7.l),d7 + LoHi d7 ;swap bytes + add.w Y,d7 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9f: ;/* SHA abcd,y [unofficial, UNSTABLE - Store A AND X AND (H+1) ?] */ + addq.l #cy_IndY2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 ;d7 contains reversed value + addq.b #1,d0 + and.b A,d0 + and.b X,d0 + add.w Y,d7 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9e: ;/* SHX abcd,y [unofficial - Store X and (H+1)] (Fox) */ +; /* Seems to be stable */ + addq.l #cy_IndY2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 ;d7 contains reversed value + addq.b #1,d0 + and.b X,d0 + add.w Y,d7 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9c: ;/* SHY abcd,x [unofficial - Store Y and (H+1)] (Fox) */ +; /* Seems to be stable */ + addq.l #cy_AbsX2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 ;d7 contains reversed value + addq.b #1,d0 + and.b A,d0 + and.b Y,d0 + add.w X,d7 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_9b: ;/* SHS abcd,y [unofficial, UNSTABLE] (Fox) */ +; /* Transfer A AND X to S, then store S AND (H+1)] */ +; /* S seems to be stable, only memory values vary */ + addq.l #cy_IndY2,CD + move.w (PC6502)+,d7 + move.b d7,d0 + LoHi d7 ;d7 contains reversed value + move.b A,_regS + and.b X,_regS + addq.b #1,d0 + and.b _regS,d0 + add.w Y,d7 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +; stable inofficial opcodes + +opcode_6b: ;/* ARR #ab [unofficial - Acc AND Data, ROR result] */ +; not optimized because I think it will never be executed anyway + addq.l #cy_Imm,CD + IMMEDIATE ZFLAG + and.b A,ZFLAG + btst #D_FLAGB,_regP + beq.s .6b_noBCD +; 'BCD fixup' + move.b ZFLAG,d7 + ROR_C ZFLAG + move.b ZFLAG,A + move.b d7,VFLAG ;VFLAG + eor.b ZFLAG,VFLAG + and.b #$40,VFLAG + sne VFLAG + move.b A,d7 + move.b A,d7 + move.b d7,d0 + andi.b #15,d0 + move.b d7,CFLAG + andi.b #1,CFLAG + add.b CFLAG,d0 + cmpi.b #6,d0 ; check for >5 + bmi.s .6b_bcd1 ; <=5 + move.b A,CFLAG + and.b #240,CFLAG + move.b A,d0 + addq.b #6,d0 + and.b #15,d0 + move.b CFLAG,A + or.b d0,A +.6b_bcd1: + move.b d7,d0 + andi.b #$f0,d0 + move.b d7,CFLAG + andi.b #16,CFLAG + cmpi.b #$51,d0 ; check for >$50 + bmi.s .6b_bcd2 ; <=$50 + move.b A,CFLAG + and.b #15,CFLAG + move.b A,d0 + add.b #$60,d0 + and.b #$f0,d0 + move.b CFLAG,A + or.w d0,A + SetCFLAG + bra.w NEXTCHANGE_N +.6b_bcd2: + ClrCFLAG + bra.w NEXTCHANGE_N +; Binary +.6b_noBCD: + ROR_C ZFLAG + move.b ZFLAG,A + move.b A,VFLAG ;VFLAG + lsr.b #6,VFLAG + move.b A,CFLAG + lsr.b #5,CFLAG + eor.b CFLAG,VFLAG + and.b #1,VFLAG + sne VFLAG + move.b A,CFLAG ;CFLAG + and.b #$40,CFLAG + sne CFLAG + bra.w NEXTCHANGE_N + +opcode_02: ;/* CIM [unofficial - crash immediate] */ +opcode_12: +opcode_22: +opcode_32: +opcode_42: +opcode_52: +opcode_62: +opcode_72: +opcode_92: +opcode_b2: + addq.l #cy_CIM,CD + subq.w #1,PC6502 + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + ifd CRASH_MENU + move.w PC6502,_crash_address + addq.w #1,PC6502 + move.w PC6502,crash_afterCIM + move.l d7,_crash_code + move.l _atari_screen,-(sp) + jsr _ui + elseif + ifd MONITOR_BREAK + moveq #1,d0 + move.l d0,_break_cim + elseif + Call_Atari800_Exit_true + endc + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + endc + bra.w NEXTCHANGE_WITHOUT + +opcode_07: ;/* ASO ab [unofficial - ASL then ORA with Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + ASL_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_17: ;/* ASO ab,x [unofficial - ASL then ORA with Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + ASL_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +ASO_C_CONT macro ;/* [unofficial - ASL Mem, then ORA with A] */ + move.b (attrib_pointer,d7.l),d0 + bne.s ASO_Getbyte_ROMHW + move.b (memory_pointer,d7.l),d0 ;get byte + ASL_C d0 + bra ASO_STORE_MEM + endm + +opcode_03: ;/* ASO (ab,x) [unofficial - ASL then ORA with Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + ASO_C_CONT + +opcode_13: ;/* ASO (ab),y [unofficial - ASL then ORA with Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + ASO_C_CONT + +opcode_0f: ;/* ASO abcd [unofficial - ASL then ORA with Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + ASO_C_CONT + +opcode_1b: ;/* ASO abcd,y [unofficial - ASL then ORA with Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + ASO_C_CONT + +opcode_1f: ;/* ASO abcd,x [unofficial - ASL then ORA with Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + ASO_C_CONT + +ASO_Getbyte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + ASL_C d0 + bra.s ASO_NOW_ORA +.Getbyte_HW: + RMW_GETBYTE + ASL_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.s ASO_NOW_ORA +ASO_STORE_MEM: + move.b d0,(memory_pointer,d7.l) +ASO_NOW_ORA: + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_27: ;/* RLA ab [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + ROL_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_37: ;/* RLA ab,x [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + ROL_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +RLA_C_CONT macro ;/* [unofficial - ROL Mem, then AND with A] */ + move.b (attrib_pointer,d7.l),d0 + bne.w RLA_Getbyte_ROMHW + move.b (memory_pointer,d7.l),d0 ;get byte + ROL_C d0 + bra.w RLA_STORE_MEM + endm + +opcode_23: ;/* RLA (ab,x) [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + RLA_C_CONT + +opcode_33: ;/* RLA (ab),y [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + RLA_C_CONT + +opcode_2f: ;/* RLA abcd [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RLA_C_CONT + +opcode_3b: ;/* RLA abcd,y [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + RLA_C_CONT + +opcode_3f: ;/* RLA abcd,x [unofficial - ROL Mem, then AND with A] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RLA_C_CONT + +RLA_Getbyte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + ROL_C d0 + bra.s RLA_NOW_AND +.Getbyte_HW: + RMW_GETBYTE + ROL_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.s RLA_NOW_AND +RLA_STORE_MEM: + move.b d0,(memory_pointer,d7.l) +RLA_NOW_AND: + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_47: ;/* LSE ab [unofficial - LSR then EOR result with A] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + LSR_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_57: ;/* LSE ab,x [unofficial - LSR then EOR result with A] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + LSR_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +LSE_C_CONT macro ;/* [unofficial - LSR Mem then EOR with A] */ + move.b (attrib_pointer,d7.l),d0 + bne.s LSE_Getbyte_ROMHW + move.b (memory_pointer,d7.l),d0 ;get byte + LSR_C d0 + bra LSE_STORE_MEM + endm + +opcode_43: ;/* LSE (ab,x) [unofficial] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + LSE_C_CONT + +opcode_53: ;/* LSE (ab),y [unofficial] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + LSE_C_CONT + +opcode_4f: ;/* LSE abcd [unofficial] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + LSE_C_CONT + +opcode_5b: ;/* LSE abcd,y [unofficial] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + LSE_C_CONT + +opcode_5f: ;/* LSE abcd,x [unofficial] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + LSE_C_CONT + +LSE_Getbyte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + LSR_C d0 + bra.s LSE_NOW_EOR +.Getbyte_HW: + RMW_GETBYTE + LSR_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.s LSE_NOW_EOR +LSE_STORE_MEM: + move.b d0,(memory_pointer,d7.l) +LSE_NOW_EOR: + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_4b: ;/* ALR #ab [unofficial - Acc AND Data, LSR result] */ + addq.l #cy_Imm,CD + IMMEDIATE ZFLAG + and.b A,ZFLAG + LSR_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_67: ;/* RRA ab [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + ROR_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w adc + +opcode_77: ;/* RRA ab,x [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + ROR_C d0 + move.b d0,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w adc + +GETANYBYTE_RRA macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + bne RRA_RAMROM + RMW_GETBYTE + bra RRA_C_CONT + endm + +opcode_63: ;/* RRA (ab,x) [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + GETANYBYTE_RRA + +opcode_73: ;/* RRA (ab),y [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + GETANYBYTE_RRA + +opcode_6f: ;/* RRA abcd [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + GETANYBYTE_RRA + +opcode_7b: ;/* RRA abcd,y [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + GETANYBYTE_RRA + +opcode_7f: ;/* RRA abcd,x [unofficial - ROR Mem, then ADC to Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + GETANYBYTE_RRA + +RRA_RAMROM: + move.b (memory_pointer,d7.l),d0 ;get byte +RRA_C_CONT: ;/* [unofficial - ROR Mem, then ADC to Acc] */ + ROR_C d0 + tst.b (attrib_pointer,d7.l) + bne.s .ROM_OR_HW + move.b d0,(memory_pointer,d7.l) + bra.w adc +.ROM_OR_HW: + cmp.b #isROM,(attrib_pointer,d7.l) + beq.w adc ;ROM ? + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.w adc + +opcode_87: ;/* SAX ab [unofficial - Store result A AND X] */ + addq.l #cy_ZP,CD + ZPAGE + move.b A,d0 + and.b X,d0 + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_97: ;/* SAX ab,y [unofficial - Store result A AND X] */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b A,d0 + and.b X,d0 + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_83: ;/* SAX (ab,x) [unofficial - Store result A AND X] */ + addq.l #cy_IndX,CD + INDIRECT_X + move.b A,d0 + and.b X,d0 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_8f: ;/* SAX abcd [unofficial - Store result A AND X] */ + addq.l #cy_Abs,CD + ABSOLUTE + move.b A,d0 + and.b X,d0 + tst.b (attrib_pointer,d7.l) ; PUTANYBYTE + bne.w A800PUTB + move.b d0,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + +opcode_a7: ;/* LAX ab [unofficial] - LDA + LDX */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),A ; GETZPBYTE + move.b A,X + NEXTCHANGE_REG A + +opcode_b7: ;/* LAX ab,y [unofficial] - LDA + LDX */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b (memory_pointer,d7.l),A ; GETZPBYTE + move.b A,X + NEXTCHANGE_REG A + +GETANYBYTE_LAX macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LAX_HW + move.b (memory_pointer,d7.l),A ;get byte + move.b A,X + NEXTCHANGE_REG A + endm + +opcode_a3: ;/* LAX (ind,x) [unofficial] - LDA + LDX */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_LAX + +opcode_b3: ;/* LAX (ind),y [unofficial] - LDA + LDX */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_LAX + +opcode_af: ;/* LAX abcd [unofficial] - LDA + LDX */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_LAX + +opcode_bf: ;/* LAX abcd,y [unofficial] - LDA + LDX */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_LAX + +LAX_HW: + EXE_GETBYTE + move.b d0,A + move.b A,X + NEXTCHANGE_REG A + +opcode_bb: ;/* LAS abcd,y [unofficial - AND S with Mem, transfer to A and X */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + bne.s .Getbyte_RAMROM + EXE_GETBYTE + bra.s .AFTER_READ +.Getbyte_RAMROM + move.b (memory_pointer,d7.l),d0 ;get byte +.AFTER_READ + and.b _regS,d0 + move.b d0,A + move.b d0,X + move.b d0,ZFLAG + bra.w NEXTCHANGE_N + +opcode_c7: ;/* DCM ab [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + subq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w COMPARE_A + +opcode_d7: ;/* DCM ab,x [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + subq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w COMPARE_A + +DCM_C_CONT macro ;/* [unofficial - DEC Mem then CMP with Acc] */ + tst.b (attrib_pointer,d7.l) + bne.s DCM_ROM_HW + move.b (memory_pointer,d7.l),d0 ;get byte + subq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w COMPARE_A + endm + +opcode_c3: ;/* DCM (ab,x) [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + DCM_C_CONT + +opcode_d3: ;/* DCM (ab),y [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + DCM_C_CONT + +opcode_cf: ;/* DCM abcd [unofficial] - DEC Mem then CMP with Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + DCM_C_CONT + +opcode_db: ;/* DCM abcd,y [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + DCM_C_CONT + +DCM_ROM_HW: + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + subq.b #1,d0 + bra.w COMPARE_A +.Getbyte_HW + RMW_GETBYTE + subq.b #1,d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.w COMPARE_A + +opcode_df: ;/* DCM abcd,x [unofficial - DEC Mem then CMP with Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + DCM_C_CONT + +opcode_cb: ;/* SBX #ab [unofficial - store (A AND X - Mem) in X] */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + and.b A,X + subq.b #1,CFLAG + subx.b d0,X + scc CFLAG + NEXTCHANGE_REG X + +opcode_e7: ;/* INS ab [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + addq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra sbc + +opcode_f7: ;/* INS ab,x [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + addq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra sbc + +INS_C_CONT macro ;/* [unofficial - INC Mem then SBC with Acc] */ + tst.b (attrib_pointer,d7.l) + bne.s INS_ROM_HW + move.b (memory_pointer,d7.l),d0 ;get byte + addq.b #1,d0 + move.b d0,(memory_pointer,d7.l) + bra.w sbc + endm + +opcode_e3: ;/* INS (ab,x) [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_IndX_RW,CD + INDIRECT_X + INS_C_CONT + +opcode_f3: ;/* INS (ab),y [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_IndY_RW,CD + INDIRECT_Y + INS_C_CONT + +opcode_ef: ;/* INS abcd [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + INS_C_CONT + +opcode_fb: ;/* INS abcd,y [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_AbsY_RW,CD + ABSOLUTE_Y + INS_C_CONT + +INS_ROM_HW: + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + addq.b #1,d0 + bra.w sbc +.Getbyte_HW + RMW_GETBYTE + addq.b #1,d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,d0 + bra.w sbc + +opcode_ff: ;/* INS abcd,x [unofficial] - INC Mem then SBC with Acc] */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + INS_C_CONT + +opcode_80: ;/* NOP #ab [unofficial - skip byte] */ +opcode_82: +opcode_89: +opcode_c2: +opcode_e2: + addq.l #cy_NOP2,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_04: ;/* NOP ab [unofficial - skip byte] */ +opcode_44: +opcode_64: + addq.l #cy_NOP3,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_14: ;/* NOP ab,x [unofficial - skip byte] */ +opcode_34: +opcode_54: +opcode_74: +opcode_d4: +opcode_f4: + addq.l #cy_NOP4,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_0b: ;/* ANC #ab [unofficial - AND then copy N to C */ +opcode_2b: + addq.l #cy_Imm,CD + and.b (PC6502)+,A + move.b A,ZFLAG + smi CFLAG + bra.w NEXTCHANGE_N + +opcode_ab: ;/* ANX #ab [unofficial - AND #ab, then TAX] */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + and.b d0,A + move.b A,X + NEXTCHANGE_REG A + +opcode_8b: ;/* ANE #ab [unofficial - A AND X AND (Mem OR $EF) to Acc] */ + addq.l #cy_Imm,CD + move.b (PC6502)+,d0 + and.b X,A + move.b A,ZFLAG + and.b d0,ZFLAG + or.b #$ef,d0 + and.b d0,A + bra.w NEXTCHANGE_N + +opcode_0c: ;/* NOP abcd [unofficial - skip word] */ + addq.l #cy_SKW,CD + addq.l #2,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_1c: ;/* NOP abcd,x [unofficial - skip word] */ +opcode_3c: +opcode_5c: +opcode_7c: +opcode_dc: +opcode_fc: + addq.l #cy_SKW,CD + move.b (PC6502),d7 + add.l X,d7 + bcs.s .SOLVE_PB + addq.l #cy_Bcc1,CD + addq.l #2,PC6502 + bra.w NEXTCHANGE_WITHOUT +.SOLVE_PB: + addq.l #cy_Bcc2,CD + addq.l #2,PC6502 + bra.w NEXTCHANGE_WITHOUT + +opcode_1a: ;/* NOP [unofficial] */ +opcode_3a: +opcode_5a: +opcode_7a: +opcode_da: +opcode_fa: + addq.l #cy_NOP,CD + bra.w NEXTCHANGE_WITHOUT + +; official opcodes + +opcode_00: ;/* BRK */ + ifd MONITOR_BREAK + tst.l _brkhere + beq.s .oc_00_norm + move.b #1,_break_here + jsr go_monitor + bra.w NEXTCHANGE_WITHOUT +.oc_00_norm: + endc + addq.l #cy_BRK,CD +; btst #I_FLAGB,_regP +; bne.w NEXTCHANGE_WITHOUT + SetB + move.l PC6502,d7 + sub.l memory_pointer,d7 + addq.w #1,d7 + moveq #0,d0 ; PHW + PHP + move.w regS,d0 + subq.b #1,d0 ; wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #2,d0 + ConvertSTATUS_RegP d7 +; move.b d7,_regP ;put result to _regP ! TEST !!! + move.b d7,(memory_pointer,d0.l) + subq.b #1,d0 + move.b d0,_regS + SetI + move.w (memory_pointer,$fffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + ifd MONITOR_BREAK + addq.l #1,_ret_nesting + endc + bra.w NEXTCHANGE_WITHOUT + +opcode_08: ;/* PHP */ + addq.l #cy_RegPH,CD + move.w regS,d7 + ConvertSTATUS_RegP d0 + move.b d0,(memory_pointer,d7.l) + subq.b #1,d7 + move.b d7,_regS + bra.w NEXTCHANGE_WITHOUT + +opcode_28: ;/* PLP */ + addq.l #cy_RegPL,CD + moveq #0,d0 ; PLP + move.w regS,d0 + addq.b #1,d0 +; move.b (memory_pointer,d0.l),_regP + move.b (memory_pointer,d0.l),d7 ; TEST + ori.b #$30,d7 ; TEST + move.b d7,_regP ; TEST + ConvertRegP_STATUS d7 + move.b d0,_regS + tst.b _IRQ ; CPUCHECKIRQ + beq.w NEXTCHANGE_WITHOUT + btst #I_FLAGB,d7 + bne.w NEXTCHANGE_WITHOUT +; moveq #0,d0 +; move.w regS,d0 ; push PC and P to stack ( PHW + PHB ) start + subq.b #2,d0 ; but do it the wrong way around for optim. + andi.b #B_FLAGN,d7 ; + move.b d7,(memory_pointer,d0.l) ; Push P + move.l PC6502,d7 + sub.l memory_pointer,d7 + addq.b #1,d0 ; wrong way around + move.b d7,(memory_pointer,d0.l) ; Push High + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) ; Push Low + subq.b #3,d0 + move.b d0,_regS ; push PC and P to stack ( PHW + PHB ) end + SetI + move.w (memory_pointer,$fffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + addq.l #7,CD + ifd MONITOR_BREAK + addq.l #1,_ret_nesting + endc + bra.w NEXTCHANGE_WITHOUT + +opcode_48: ;/* PHA */ + addq.l #cy_RegPH,CD + move.w regS,d7 + move.b A,(memory_pointer,d7.l) + subq.b #1,d7 + move.b d7,_regS + bra.w NEXTCHANGE_WITHOUT + +opcode_68: ;/* PLA */ + addq.l #cy_RegPL,CD + move.w regS,d7 + addq.b #1,d7 + move.b (memory_pointer,d7.l),A + move.b d7,_regS + NEXTCHANGE_REG A + +OR_ANYBYTE macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s OR_HW + or.b (memory_pointer,d7.l),A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + endm + +opcode_01: ;/* ORA (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + OR_ANYBYTE + +opcode_11: ;/* ORA (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + OR_ANYBYTE + +OR_HW: + EXE_GETBYTE + or.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_0d: ;/* ORA abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + OR_ANYBYTE + +opcode_19: ;/* ORA abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + OR_ANYBYTE + +opcode_1d: ;/* ORA abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + OR_ANYBYTE + +opcode_05: ;/* ORA ab */ + addq.l #cy_ZP,CD + ZPAGE + or.b (memory_pointer,d7.l),A ; OR ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_15: ;/* ORA ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + or.b (memory_pointer,d7.l),A ; OR ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_09: ;/* ORA #ab */ + addq.l #cy_Imm,CD + or.b (PC6502)+,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +AND_ANYBYTE macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s AND_HW + and.b (memory_pointer,d7.l),A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + endm + +opcode_21: ;/* AND (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + AND_ANYBYTE + +opcode_31: ;/* AND (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + AND_ANYBYTE + +AND_HW: + EXE_GETBYTE + and.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_2d: ;/* AND abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + AND_ANYBYTE + +opcode_39: ;/* AND abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + AND_ANYBYTE + +opcode_3d: ;/* AND abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + AND_ANYBYTE + +opcode_25: ;/* AND ab */ + addq.l #cy_ZP,CD + ZPAGE + and.b (memory_pointer,d7.l),A ; AND ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_35: ;/* AND ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + and.b (memory_pointer,d7.l),A ; AND ZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_29: ;/* AND #ab */ + addq.l #cy_Imm,CD + and.b (PC6502)+,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +EOR_C_CONT macro + eor.b d0,A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + endm + +GETANYBYTE_EOR macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s EOR_HW + move.b (memory_pointer,d7.l),d0 ;get byte + EOR_C_CONT + endm + +opcode_41: ;/* EOR (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_EOR + +opcode_51: ;/* EOR (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_EOR + +EOR_HW: + EXE_GETBYTE + EOR_C_CONT + +opcode_4d: ;/* EOR abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_EOR + +opcode_59: ;/* EOR abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_EOR + +opcode_5d: ;/* EOR abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_EOR + +opcode_45: ;/* EOR ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 + EOR_C_CONT + +opcode_55: ;/* EOR ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 + EOR_C_CONT + +opcode_49: ;/* EOR #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 ; because eor only works with registers ! + EOR_C_CONT + +opcode_0a: ;/* ASLA */ + addq.l #cy_RegChg,CD + ASL_C A + NEXTCHANGE_REG A + +opcode_06: ;/* ASL ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),ZFLAG + ASL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_N + +opcode_16: ;/* ASL ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),ZFLAG + ASL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_N + +RPW_ASL_C macro + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_ASL + move.b (memory_pointer,d7.l),ZFLAG ;get byte + ASL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_N + endm + +opcode_0e: ;/* ASL abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_ASL_C + +opcode_1e: ;/* ASL abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_ASL_C + +RPW_HW_ASL: + cmp.b #isROM,d0 + beq.s RPW_ROM_ASL + RMW_GETBYTE + ASL_C d0 + ext.w d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_ASL: + move.b (memory_pointer,d7.l),ZFLAG ; get byte + ASL_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_2a: ;/* ROLA */ + addq.l #cy_RegChg,CD + ROL_C A + NEXTCHANGE_REG A + +opcode_26: ;/* ROL ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + ROL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_N + +opcode_36: ;/* ROL ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + ROL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_N + +RPW_ROL_C macro + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_ROL + move.b (memory_pointer,d7.l),ZFLAG ;get byte + ROL_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_N + endm + +opcode_2e: ;/* ROL abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_ROL_C + +opcode_3e: ;/* ROL abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_ROL_C + +RPW_HW_ROL: + cmp.b #isROM,d0 + beq.s RPW_ROM_ROL + RMW_GETBYTE + ROL_C d0 + ext.w d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_ROL: + move.b (memory_pointer,d7.l),ZFLAG ;get byte + ROL_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_4a: ;/* LSRA */ + addq.l #cy_RegChg,CD + clr.w NFLAG + lsr.b #1,A + scs CFLAG + move.b A,ZFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_46: ;/* LSR ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + clr.w NFLAG + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + lsr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_56: ;/* LSR ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + clr.w NFLAG + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + lsr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +RPW_LSR_C macro + clr.w NFLAG + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_LSR + move.b (memory_pointer,d7.l),ZFLAG ;get byte + LSR_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + endm + +opcode_4e: ;/* LSR abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_LSR_C + +opcode_5e: ;/* LSR abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_LSR_C + +RPW_HW_LSR: + cmp.b #isROM,d0 + beq.s RPW_ROM_LSR + RMW_GETBYTE + LSR_C d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_LSR: + move.b (memory_pointer,d7.l),ZFLAG ;get byte + LSR_C ZFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_6a: ;/* RORA */ + addq.l #cy_RegChg,CD + ROR_C A + NEXTCHANGE_REG A + +opcode_66: ;/* ROR ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + add.b CFLAG,CFLAG + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + roxr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_N + +opcode_76: ;/* ROR ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + add.b CFLAG,CFLAG + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + roxr.b #1,ZFLAG + scs CFLAG + move.b ZFLAG,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_N + +RPW_ROR_C macro + move.b (attrib_pointer,d7.l),d0 + bne.s RPW_HW_ROR + move.b (memory_pointer,d7.l),ZFLAG ;get byte + ROR_C ZFLAG + move.b ZFLAG,(memory_pointer,d7.l) + bra.w NEXTCHANGE_N + endm + +opcode_6e: ;/* ROR abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + RPW_ROR_C + +opcode_7e: ;/* ROR abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + RPW_ROR_C + +RPW_HW_ROR: + cmp.b #isROM,d0 + beq.s RPW_ROM_ROR + RMW_GETBYTE + ROR_C d0 + ext.w d0 + move.l d0,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG + bra.w NEXTCHANGE_WITHOUT +RPW_ROM_ROR: + move.b (memory_pointer,d7.l),ZFLAG ;get byte + ROR_C ZFLAG + bra.w NEXTCHANGE_N + +opcode_18: ;/* CLC */ + addq.l #cy_FlagCS,CD + ClrCFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_38: ;/* SEC */ + addq.l #cy_FlagCS,CD + SetCFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_58: ;/* CLI */ + addq.l #cy_FlagCS,CD + ClrI + tst.b _IRQ ; ~ CPUCHECKIRQ + beq.w NEXTCHANGE_WITHOUT + move.l PC6502,d7 + sub.l memory_pointer,d7 + moveq #0,d0 ; PHW + PHP (B0) + move.w regS,d0 + subq.b #1,d0 ; wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #2,d0 + ConvertSTATUS_RegP d7 +; move.b d7,_regP ;put result to _regP ! TEST !!! + andi.b #B_FLAGN,d7 ; TEST + move.b d7,(memory_pointer,d0.l) + subq.b #1,d0 + move.b d0,_regS + SetI + move.w (memory_pointer,$fffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + clr.b _IRQ + addq.l #7,CD + ifd MONITOR_BREAK + addq.l #1,_ret_nesting + endc + bra.w NEXTCHANGE_WITHOUT + +opcode_78: ;/* SEI */ + addq.l #cy_FlagCS,CD + SetI + bra.w NEXTCHANGE_WITHOUT + +opcode_b8: ;/* CLV */ + addq.l #cy_FlagCS,CD + ClrVFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_d8: ;/* CLD */ + addq.l #cy_FlagCS,CD + ClrD + bra.w NEXTCHANGE_WITHOUT + +opcode_f8: ;/* SED */ + addq.l #cy_FlagCS,CD + SetD + bra.w NEXTCHANGE_WITHOUT + +JMP_C macro + move.w (PC6502)+,d7 + LoHi d7 ;(in d7 adress where we want to jump) + lea (memory_pointer,d7.l),PC6502 + bra.w NEXTCHANGE_WITHOUT + endm + +opcode_4c: ;/* JMP abcd */ + ifd MONITOR_BREAK + move.l PC6502,d7 ;current pointer + sub.l memory_pointer,d7 + subq.l #1,d7 + lea _remember_JMP,a0 + move.l _remember_jmp_curpos,d0 + move.w d7,(a0,d0*2) + addq.l #1,d0 + cmp.l #rem_jmp_steps,d0 + bmi.s .point_rem_jmp + moveq #0,d0 +.point_rem_jmp: + move.l d0,_remember_jmp_curpos + endc + addq.l #cy_JmpAbs,CD + JMP_C + +opcode_6c: ;/* JMP (abcd) */ + ifd MONITOR_BREAK + move.l PC6502,d7 ;current pointer + sub.l memory_pointer,d7 + subq.l #1,d7 + lea _remember_JMP,a0 + move.l _remember_jmp_curpos,d0 + move.w d7,(a0,d0*2) + addq.l #1,d0 + cmp.l #rem_jmp_steps,d0 + bmi.s .point_rem_jmp + moveq #0,d0 +.point_rem_jmp: + move.l d0,_remember_jmp_curpos + endc + move.w (PC6502)+,d7 + LoHi d7 + ifd P65C02 + move.w (memory_pointer,d7.l),d7 + LoHi d7 + lea (memory_pointer,d7.l),PC6502 + else + ;/* original 6502 had a bug in jmp (addr) when addr crossed page boundary */ + cmp.b #$ff,d7 + beq.s .PROBLEM_FOUND ;when problematic jump is found + move.w (memory_pointer,d7.l),d7 + LoHi d7 + lea (memory_pointer,d7.l),PC6502 + addq.l #cy_JmpInd,CD + bra.w NEXTCHANGE_WITHOUT +.PROBLEM_FOUND: + move.l d7,d0 ;we have to use both of them + clr.b d7 ;instead of reading right this adress, + ;we read adress at this start of page + move.b (memory_pointer,d7.l),d7 + LoHi d7 + move.b (memory_pointer,d0.l),d7 + lea (memory_pointer,d7.l),PC6502 + endc + addq.l #cy_JmpInd,CD + bra.w NEXTCHANGE_WITHOUT + +opcode_20: ;/* JSR abcd */ + addq.l #cy_Sub,CD + move.l PC6502,d7 ;current pointer + sub.l memory_pointer,d7 + ifd MONITOR_BREAK + subq.l #1,d7 + lea _remember_JMP,a0 + move.l _remember_jmp_curpos,d0 + move.w d7,(a0,d0*2) + addq.l #1,d7 ; restore to PC + addq.l #1,d0 + cmp.l #rem_jmp_steps,d0 + bmi.s .point_rem_jmp + moveq #0,d0 +.point_rem_jmp: + move.l d0,_remember_jmp_curpos + addq.l #1,_ret_nesting + endc + addq.l #1,d7 ; return address + moveq #0,d0 ; PHW + move.w regS,d0 + subq.b #1,d0 ; wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #2,d0 + move.b d0,_regS + JMP_C + +opcode_60: ;/* RTS */ + addq.l #cy_Sub,CD + PLW d7,d0 + lea 1(memory_pointer,d7.l),PC6502 + ifd MONITOR_BREAK + tst.b _break_ret + beq.s .mb_end + tst.l _ret_nesting + bmi.s .mb_end + move.b #1,_break_step +.mb_end: + subq.l #1,_ret_nesting + endc + bra.w NEXTCHANGE_WITHOUT + +opcode_40: ;/* RTI */ +_RTI: + addq.l #cy_Sub,CD + moveq #0,d0 ; PLP + PLW + move.w regS,d0 + addq.b #1,d0 +; move.b (memory_pointer,d0.l),_regP + move.b (memory_pointer,d0.l),d7 ; TEST + ori.b #$30,d7 ; TEST + move.b d7,_regP ; TEST + ConvertRegP_STATUS d7 + addq.b #2,d0 ; wrong way around + move.b (memory_pointer,d0.l),d7 + asl.w #8,d7 + subq.b #1,d0 + or.b (memory_pointer,d0.l),d7 + addq.b #1,d0 + move.b d0,_regS + lea (memory_pointer,d7.l),PC6502 + ifd MONITOR_BREAK + tst.b _break_ret + beq.s .mb_end + tst.l _ret_nesting + bmi.s .mb_end + move.b #1,_break_step +.mb_end: + subq.l #1,_ret_nesting + endc + tst.b _IRQ ; CPUCHECKIRQ + beq.w NEXTCHANGE_WITHOUT + move.b _regP,d7 +; andi.b #I_FLAG,d7 + btst #I_FLAGB,d7 + bne.w NEXTCHANGE_WITHOUT + moveq #0,d0 + move.w regS,d0 ; push PC and P to stack ( PHW + PHB ) start + subq.b #2,d0 + andi.b #B_FLAGN,d7 ; TEST + move.b d7,(memory_pointer,d0.l) ; Push P + move.l PC6502,d7 + sub.l memory_pointer,d7 + addq.b #1,d0 ; wrong way around + move.b d7,(memory_pointer,d0.l) + addq.b #1,d0 + LoHi d7 + move.b d7,(memory_pointer,d0.l) + subq.b #3,d0 + move.b d0,_regS ; push PC and P to stack ( PHW + PHB ) end + SetI + move.w (memory_pointer,$fffe.l),d7 + LoHi d7 + move.l d7,PC6502 + add.l memory_pointer,PC6502 + addq.l #7,CD + ifd MONITOR_BREAK + addq.l #1,_ret_nesting + endc + bra.w NEXTCHANGE_WITHOUT + +BIT_C_CONT macro + ext.w NFLAG + btst #V_FLAGB,ZFLAG + sne VFLAG + and.b A,ZFLAG + bra.w NEXTCHANGE_WITHOUT + endm + +opcode_24: ;/* BIT ab */ + addq.l #cy_ZP,CD + ZPAGE +BIT_RAMROM: + move.b (memory_pointer,d7.l),ZFLAG ; GETZPBYTE + BIT_C_CONT + +opcode_2c: ;/* BIT abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + bne.s BIT_RAMROM + EXE_GETBYTE + move.b d0,ZFLAG + BIT_C_CONT + +STOREANYBYTE_A macro + tst.b (attrib_pointer,d7.l) + bne.s STA_HW + move.b A,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT + endm + +opcode_81: ;/* STA (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + STOREANYBYTE_A + +opcode_91: ;/* STA (ab),y */ + addq.l #cy_IndY2,CD + INDIRECT_Y + STOREANYBYTE_A + +opcode_8d: ;/* STA abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + STOREANYBYTE_A + +opcode_99: ;/* STA abcd,y */ + addq.l #cy_IndY2,CD + ABSOLUTE_Y + STOREANYBYTE_A + +opcode_9d: ;/* STA abcd,x */ + addq.l #cy_AbsX2,CD + ABSOLUTE_X + STOREANYBYTE_A + +STA_HW: + move.b A,d0 + bra.w A800PUTB + +opcode_85: ;/* STA ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b A,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_95: ;/* STA ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b A,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +STOREANYBYTE macro + tst.b (attrib_pointer,d7.l) + bne.s .GO_PUTBYTE\@ + move.b \1,(memory_pointer,d7.l) + bra.w NEXTCHANGE_WITHOUT +.GO_PUTBYTE\@: + move.b \1,d0 + bra.w A800PUTB + endm + +opcode_8e: ;/* STX abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + STOREANYBYTE X + +opcode_86: ;/* STX ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b X,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_96: ;/* STX ab,y */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b X,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_8c: ;/* STY abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + STOREANYBYTE Y + +opcode_84: ;/* STY ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b Y,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +opcode_94: ;/* STY ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b Y,(memory_pointer,d7.l) ; PUTZPBYTE + bra.w NEXTCHANGE_WITHOUT + +LOADANYBYTE_A macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LDA_HW + move.b (memory_pointer,d7.l),A ;get byte + NEXTCHANGE_REG A + endm + +opcode_a1: ;/* LDA (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + LOADANYBYTE_A + +opcode_b1: ;/* LDA (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + LOADANYBYTE_A + +LDA_HW: + EXE_GETBYTE + move.b d0,A + NEXTCHANGE_REG A + +opcode_ad: ;/* LDA abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + LOADANYBYTE_A + +opcode_b9: ;/* LDA abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + LOADANYBYTE_A + +opcode_bd: ;/* LDA abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + LOADANYBYTE_A + +opcode_a5: ;/* LDA ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),A ; GETZPBYTE + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +opcode_b5: ;/* LDA ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),A ; GETZPBYTE + NEXTCHANGE_REG A + +opcode_a9: ;/* LDA #ab */ + addq.l #cy_Imm,CD + IMMEDIATE A + move.b A,ZFLAG + bra.w NEXTCHANGE_N + +LOADANYBYTE_X macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LDX_HW + move.b (memory_pointer,d7.l),X ;get byte + NEXTCHANGE_REG X + endm + +opcode_ae: ;/* LDX abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + LOADANYBYTE_X + +opcode_be: ;/* LDX abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + LOADANYBYTE_X + +LDX_HW: + EXE_GETBYTE + move.b d0,X + NEXTCHANGE_REG X + +opcode_a6: ;/* LDX ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),X ; GETZPBYTE + move.b X,ZFLAG + bra.w NEXTCHANGE_N + +opcode_b6: ;/* LDX ab,y */ + addq.l #cy_ZPY,CD + ZPAGE_Y + move.b (memory_pointer,d7.l),X ; GETZPBYTE + NEXTCHANGE_REG X + +opcode_a2: ;/* LDX #ab */ + addq.l #cy_Imm,CD + IMMEDIATE X + move.b X,ZFLAG + bra.w NEXTCHANGE_N + +LOADANYBYTE_Y macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s LDY_HW + move.b (memory_pointer,d7.l),Y ;get byte + NEXTCHANGE_REG Y + endm + +opcode_ac: ;/* LDY abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + LOADANYBYTE_Y + +opcode_bc: ;/* LDY abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + LOADANYBYTE_Y + +LDY_HW: + EXE_GETBYTE + move.b d0,Y + NEXTCHANGE_REG Y + +opcode_a4: ;/* LDY ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),Y ; GETZPBYTE + move.b Y,ZFLAG + bra.w NEXTCHANGE_N + +opcode_b4: ;/* LDY ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),Y ; GETZPBYTE + NEXTCHANGE_REG Y + +opcode_a0: ;/* LDY #ab */ + addq.l #cy_Imm,CD + IMMEDIATE Y + move.b Y,ZFLAG + bra.w NEXTCHANGE_N + +opcode_8a: ;/* TXA */ + addq.l #cy_RegChg,CD + move.b X,A + NEXTCHANGE_REG A + +opcode_aa: ;/* TAX */ + addq.l #cy_RegChg,CD + move.b A,X + NEXTCHANGE_REG A + +opcode_98: ;/* TYA */ + addq.l #cy_RegChg,CD + move.b Y,A + NEXTCHANGE_REG A + +opcode_a8: ;/* TAY */ + addq.l #cy_RegChg,CD + move.b A,Y + NEXTCHANGE_REG A + +opcode_9a: ;/* TXS */ + addq.l #cy_RegChg,CD + move.b X,_regS + bra.w NEXTCHANGE_WITHOUT + +opcode_ba: ;/* TSX */ + addq.l #cy_RegChg,CD + move.b _regS,X + NEXTCHANGE_REG X + +opcode_d2: ;/* ESCRTS #ab (JAM) - on Atari is here instruction CIM + ;[unofficial] !RS! */ + addq.l #cy_CIM,CD + move.b (PC6502)+,d7 + Call_Atari800_RunEsc + PLW d7,d0 + lea (memory_pointer,d7.l),PC6502 + addq.l #1,PC6502 + ifd MONITOR_BREAK + tst.b _break_ret + beq.s .mb_end + tst.l _ret_nesting + bmi.s .mb_end + move.b #1,_break_step +.mb_end: + subq.l #1,_ret_nesting + endc + bra.w NEXTCHANGE_WITHOUT + +opcode_f2: ;/* ESC #ab (JAM) - on Atari is here instruction CIM + ;[unofficial] !RS! */ + addq.l #cy_CIM,CD + move.b (PC6502)+,d7 + Call_Atari800_RunEsc + bra.w NEXTCHANGE_WITHOUT + +opcode_ea: ;/* NOP */ ;official + addq.l #cy_NOP,CD + bra.w NEXTCHANGE_WITHOUT + +opcode_c6: ;/* DEC ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_d6: ;/* DEC ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_ce: ;/* DEC abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + move.b (attrib_pointer,d7.l),d0 + bne.s DEC_Byte_ROMHW + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N +DEC_Byte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),ZFLAG ;get byte + subq.b #1,ZFLAG + bra.w NEXTCHANGE_N +.Getbyte_HW: + RMW_GETBYTE + move.b d0,ZFLAG + subq.b #1,ZFLAG +; bra.w A800PUTB_Ld0_N +A800PUTB_Ld0_N: + ext.w NFLAG +A800PUTB_Ld0: + move.b ZFLAG,d0 +A800PUTB: + cmp.b #isROM,(attrib_pointer,d7.l) + beq.s A800PUTBE + move.l ZFLAG,-(a7) + EXE_PUTBYTE d7 + move.l (a7)+,ZFLAG +A800PUTBE: + bra.w NEXTCHANGE_WITHOUT + +opcode_de: ;/* DEC abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + move.b (attrib_pointer,d7.l),d0 + bne.s DEC_Byte_ROMHW + subq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_ca: ;/* DEX */ + addq.l #cy_RegChg,CD + subq.b #1,X + NEXTCHANGE_REG X + +opcode_88: ;/* DEY */ + addq.l #cy_RegChg,CD + subq.b #1,Y + NEXTCHANGE_REG Y + +opcode_e6: ;/* INC ab */ + addq.l #cy_ZP_RW,CD + ZPAGE + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_f6: ;/* INC ab,x */ + addq.l #cy_ZPX_RW,CD + ZPAGE_X + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_ee: ;/* INC abcd */ + addq.l #cy_Abs_RW,CD + ABSOLUTE + move.b (attrib_pointer,d7.l),d0 + bne.s INC_Byte_ROMHW + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N +INC_Byte_ROMHW: + cmp.b #isHARDWARE,d0 + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),ZFLAG ;get byte + addq.b #1,ZFLAG + bra.w NEXTCHANGE_N +.Getbyte_HW: + RMW_GETBYTE + move.b d0,ZFLAG + addq.b #1,ZFLAG + bra.w A800PUTB_Ld0_N + +opcode_fe: ;/* INC abcd,x */ + addq.l #cy_AbsX_RW,CD + ABSOLUTE_X + move.b (attrib_pointer,d7.l),d0 + bne.s INC_Byte_ROMHW + addq.b #1,(memory_pointer,d7.l) + move.b (memory_pointer,d7.l),ZFLAG + bra.w NEXTCHANGE_N + +opcode_e8: ;/* INX */ + addq.l #cy_RegChg,CD + addq.b #1,X + NEXTCHANGE_REG X + +opcode_c8: ;/* INY */ + addq.l #cy_RegChg,CD + addq.b #1,Y + NEXTCHANGE_REG Y + +DONT_BRA macro + addq.l #cy_Bcc,CD + addq.l #1,PC6502 + bra.w NEXTCHANGE_WITHOUT + endm + +opcode_10: ;/* BPL */ + tst.w NFLAG + bpl.s SOLVE + DONT_BRA + +opcode_30: ;/* BMI */ + tst.w NFLAG + bmi.s SOLVE + DONT_BRA + +opcode_d0: ;/* BNE */ + tst.b ZFLAG + bne.s SOLVE + DONT_BRA + +opcode_f0: ;/* BEQ */ + tst.b ZFLAG + beq.s SOLVE + DONT_BRA + +SOLVE: + move.b (PC6502)+,d7 + extb.l d7 + move.l PC6502,d0 + add.l d7,PC6502 + sub.l memory_pointer,d0 + and.w #255,d0 ; !!! + add.w d7,d0 + and.w #$ff00,d0 + bne.s SOLVE_PB + addq.l #cy_Bcc1,CD + bra.w NEXTCHANGE_WITHOUT +SOLVE_PB: + addq.l #cy_Bcc2,CD + bra.w NEXTCHANGE_WITHOUT + +opcode_90: ;/* BCC */ + tst.b CFLAG + beq.s SOLVE + DONT_BRA + +opcode_b0: ;/* BCS */ + tst.b CFLAG + bne.s SOLVE + DONT_BRA + +opcode_50: ;/* BVC */ + tst.b VFLAG + beq.s SOLVE + DONT_BRA + +opcode_70: ;/* BVS */ + tst.b VFLAG + bne.s SOLVE + DONT_BRA + +GETANYBYTE_ADC macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s ADC_HW + move.b (memory_pointer,d7.l),d0 ;get byte + bra.s adcb + endm + +adc: ; !!! put it where it's needed !!! + btst #D_FLAGB,_regP + bne.w BCD_ADC + bra.w adcb + +opcode_61: ;/* ADC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_ADC + +opcode_71: ;/* ADC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_ADC + +ADC_HW: + EXE_GETBYTE + bra.s adcb + +opcode_6d: ;/* ADC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_ADC + +opcode_79: ;/* ADC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_ADC + +opcode_7d: ;/* ADC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_ADC + +adcb: + add.b CFLAG,CFLAG + addx.b d0,A + svs VFLAG + scs CFLAG + NEXTCHANGE_REG A + +opcode_65: ;/* ADC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s adcb + +opcode_75: ;/* ADC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s adcb + +opcode_69: ;/* ADC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s adcb + +GETANYBYTE_ADC_D macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s ADC_HW_D + move.b (memory_pointer,d7.l),d0 ;get byte + bra.s BCD_ADC + endm + +opcode_61_D: ;/* ADC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_ADC_D + +opcode_6d_D: ;/* ADC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_ADC_D + +opcode_71_D: ;/* ADC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_ADC_D + +ADC_HW_D: + EXE_GETBYTE + bra.s BCD_ADC + +opcode_79_D: ;/* ADC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_ADC_D + +opcode_7d_D: ;/* ADC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_ADC_D + +; Version 1 : exact like Thor +; Z from binary calc. +; N + V after lower nibble decimal correction +; C from decimal calc. +; a lot of code necessary to replicate a 6502 bug +BCD_ADC: + move.w d0,a0 ; needed first + moveq #15,d7 + and.b d7,d0 ; low nibble Add + move.b A,ZFLAG + and.b d7,ZFLAG ; low nibble A + add.b CFLAG,CFLAG + abcd d0,ZFLAG ; low nibble BCD add + move.b A,d0 + moveq #$f0,d7 + and.b d7,d0 ; high nibble Add + add.b d0,ZFLAG + move.w a0,d0 + and.b d7,d0 ; high nibble Add + add.b d0,ZFLAG + ext.w NFLAG ; NFLAG finished + eor.b A,d0 ; A eor data + eor.b A,ZFLAG ; A eor temp + not.b ZFLAG + or.b d0,ZFLAG + smi VFLAG ; VFLAG finished + move.w a0,d0 ; restore data + add.b CFLAG,CFLAG + move.b A,ZFLAG + addx.b d0,ZFLAG ; ZFLAG finished + add.b CFLAG,CFLAG + abcd d0,A ; A finished + scs CFLAG + bra.w NEXTCHANGE_WITHOUT + +opcode_65_D: ;/* ADC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s BCD_ADC + +opcode_75_D: ;/* ADC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s BCD_ADC + +opcode_69_D: ;/* ADC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s BCD_ADC + +GETANYBYTE_SBC macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s SBC_HW + move.b (memory_pointer,d7.l),d0 ;get byte + bra.s sbcb + endm + +sbc: ; !!! put it where it's needed !!! + btst #D_FLAGB,_regP + bne.w BCD_SBC + bra.w sbcb + +opcode_e1: ;/* SBC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_SBC + +opcode_f1: ;/* SBC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_SBC + +SBC_HW: + EXE_GETBYTE + bra.s sbcb + +opcode_ed: ;/* SBC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_SBC + +opcode_f9: ;/* SBC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_SBC + +opcode_fd: ;/* SBC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_SBC + +sbcb: + subq.b #1,CFLAG + subx.b d0,A + svs VFLAG + scc CFLAG + NEXTCHANGE_REG A + +opcode_e5: ;/* SBC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s sbcb + +opcode_f5: ;/* SBC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s sbcb + +opcode_eb: ;/* SBC #ab [unofficial] */ +opcode_e9: ;/* SBC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s sbcb + +GETANYBYTE_SBC_D macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s SBC_HW_D + move.b (memory_pointer,d7.l),d0 ;get byte + bra.s BCD_SBC + endm + +opcode_e1_D: ;/* SBC (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_SBC_D + +opcode_ed_D: ;/* SBC abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_SBC_D + +opcode_f1_D: ;/* SBC (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_SBC_D + +SBC_HW_D: + EXE_GETBYTE + bra.s BCD_SBC + +opcode_f9_D: ;/* SBC abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_SBC_D + +opcode_fd_D: ;/* SBC abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_SBC_D + +; Version exact like Thor +; C, Z, N, V from binary calc. +; A from decimal calc. +BCD_SBC: + move.b A,ZFLAG + not.b CFLAG + add.b CFLAG,CFLAG + sbcd d0,A + add.b CFLAG,CFLAG + subx.b d0,ZFLAG + svs VFLAG + scc CFLAG + bra.w NEXTCHANGE_N + +opcode_e5_D: ;/* SBC ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s BCD_SBC + +opcode_f5_D: ;/* SBC ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s BCD_SBC + +opcode_eb_D: ;/* SBC #ab [unofficial] */ +opcode_e9_D: ;/* SBC #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + bra.s BCD_SBC + +opcode_cc: ;/* CPY abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) ; GETANYBYTE + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + move.b Y,ZFLAG + bra COMPARE +.Getbyte_HW: + EXE_GETBYTE + move.b Y,ZFLAG + bra COMPARE + +opcode_c4: ;/* CPY ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + move.b Y,ZFLAG + bra COMPARE + +opcode_c0: ;/* CPY #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + move.b Y,ZFLAG + bra COMPARE + +opcode_ec: ;/* CPX abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + cmp.b #isHARDWARE,(attrib_pointer,d7.l) ; GETANYBYTE + beq.s .Getbyte_HW + move.b (memory_pointer,d7.l),d0 ;get byte + move.b X,ZFLAG + bra COMPARE +.Getbyte_HW: + EXE_GETBYTE + move.b X,ZFLAG + bra COMPARE + +opcode_e4: ;/* CPX ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + move.b X,ZFLAG + bra COMPARE + +opcode_e0: ;/* CPX #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 + move.b X,ZFLAG + bra COMPARE + +GETANYBYTE_CMP macro + cmp.b #isHARDWARE,(attrib_pointer,d7.l) + beq.s CMP_HW + move.b (memory_pointer,d7.l),d0 ;get byte + bra COMPARE_A + endm + +opcode_c1: ;/* CMP (ab,x) */ + addq.l #cy_IndX,CD + INDIRECT_X + GETANYBYTE_CMP + +opcode_d1: ;/* CMP (ab),y */ + addq.l #cy_IndY,CD + INDIRECT_Y_NCY + GETANYBYTE_CMP + +CMP_HW: + EXE_GETBYTE + bra.w COMPARE_A + +opcode_cd: ;/* CMP abcd */ + addq.l #cy_Abs,CD + ABSOLUTE + GETANYBYTE_CMP + +opcode_d9: ;/* CMP abcd,y */ + addq.l #cy_AbsY,CD + ABSOLUTE_Y_NCY + GETANYBYTE_CMP + +opcode_dd: ;/* CMP abcd,x */ + addq.l #cy_AbsX,CD + ABSOLUTE_X_NCY + GETANYBYTE_CMP + +opcode_d5: ;/* CMP ab,x */ + addq.l #cy_ZPX,CD + ZPAGE_X + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s COMPARE_A + +opcode_c5: ;/* CMP ab */ + addq.l #cy_ZP,CD + ZPAGE + move.b (memory_pointer,d7.l),d0 ; GETZPBYTE + bra.s COMPARE_A + +opcode_c9: ;/* CMP #ab */ + addq.l #cy_Imm,CD + IMMEDIATE d0 +; bra.s COMPARE_A + +COMPARE_A: + move.b A,ZFLAG +COMPARE: + sub.b d0,ZFLAG + scc CFLAG +; bra.w NEXTCHANGE_N + +;MAIN LOOP , where we are counting cycles and working with other STUFF + +NEXTCHANGE_N: + ext.w NFLAG +NEXTCHANGE_WITHOUT: + cmp.l _xpos_limit,CD + bge.s END_OF_CYCLE +**************************************** + ifd MONITOR_BREAK ;following block of code allows you to enter + ;a break address + move.l _remember_PC_curpos,d0 + lea _remember_PC,a0 + move.l PC6502,d7 + sub.l memory_pointer,d7 + move.w d7,(a0,d0*2) ; remember program counter + addq.l #1,d0 + cmp.l #rem_pc_steps,d0 + bmi.s .point_rem_pc + moveq #0,d0 +.point_rem_pc: + move.l d0,_remember_PC_curpos + ifd NEW_CYCLE_EXACT + moveq #0,d0 + move.b _ypos,d0 + asl.w #8,d0 + move.l d0,a1 + move.l CD,d0 + cmp.l #-999,_cur_screen_pos + beq.s .calc_all + move.l _cpu2antic_ptr,a0 + move.l (a0,d0*4),d0 + bra.s .calc_all +.calc_all: + add.l a1,d0 + move.l d0,a1 + move.l _remember_xpos,a0 + move.l _remember_xpos_curpos,d0 + move.l a1,(a0,d0*4) + addq.l #1,d0 + cmp.l #rem_pc_steps,d0 + bmi.s .point_rem_xpos + moveq #0,d0 +.point_rem_xpos: + move.l d0,_remember_xpos_curpos + endc + cmp.w _break_addr,d7 ; break address reached ? + beq.s .go_monitor + move.l _ypos,d0 ; !!! or .w ? + cmp.l _ypos_break_addr,d0 ; break address reached ? + beq.s .go_monitor + tst.b _break_step ; step mode active ? + beq.s .get_first +.go_monitor: + bsr go_monitor ;on break monitor is invoked +.get_first + endc +**************************************** + moveq #0,d7 + move.b (PC6502)+,d7 + ifd PROFILE + lea _instruction_count,a0 + addq.l #1,(a0,d7.l*4) + endc +; move.w (OPMODE_TABLE,PC,d7.l*2),d0 +; jmp (OPMODE_TABLE,d0.w) + move.w (a3,d7.l*2),d0 + jmp (a3,d0.w) + +END_OF_CYCLE: + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + move.l CD,_xpos ;returned value + movem.l (a7)+,d2-d7/a2-a6 +TERM_GO: + rts + +go_monitor: + ConvertSTATUS_RegP_destroy d0 + UPDATE_GLOBAL_REGS + Call_Atari800_Exit_true + UPDATE_LOCAL_REGS + ConvertRegP_STATUS d0 + rts + + cnop 0,4 ; doubleword alignment + +OPMODE_TABLE: +OP_T: + dc.w opcode_00-OP_T + dc.w opcode_01-OP_T + dc.w opcode_02-OP_T + dc.w opcode_03-OP_T + dc.w opcode_04-OP_T + dc.w opcode_05-OP_T + dc.w opcode_06-OP_T + dc.w opcode_07-OP_T + dc.w opcode_08-OP_T + dc.w opcode_09-OP_T + dc.w opcode_0a-OP_T + dc.w opcode_0b-OP_T + dc.w opcode_0c-OP_T + dc.w opcode_0d-OP_T + dc.w opcode_0e-OP_T + dc.w opcode_0f-OP_T + dc.w opcode_10-OP_T + dc.w opcode_11-OP_T + dc.w opcode_12-OP_T + dc.w opcode_13-OP_T + dc.w opcode_14-OP_T + dc.w opcode_15-OP_T + dc.w opcode_16-OP_T + dc.w opcode_17-OP_T + dc.w opcode_18-OP_T + dc.w opcode_19-OP_T + dc.w opcode_1a-OP_T + dc.w opcode_1b-OP_T + dc.w opcode_1c-OP_T + dc.w opcode_1d-OP_T + dc.w opcode_1e-OP_T + dc.w opcode_1f-OP_T + dc.w opcode_20-OP_T + dc.w opcode_21-OP_T + dc.w opcode_22-OP_T + dc.w opcode_23-OP_T + dc.w opcode_24-OP_T + dc.w opcode_25-OP_T + dc.w opcode_26-OP_T + dc.w opcode_27-OP_T + dc.w opcode_28-OP_T + dc.w opcode_29-OP_T + dc.w opcode_2a-OP_T + dc.w opcode_2b-OP_T + dc.w opcode_2c-OP_T + dc.w opcode_2d-OP_T + dc.w opcode_2e-OP_T + dc.w opcode_2f-OP_T + dc.w opcode_30-OP_T + dc.w opcode_31-OP_T + dc.w opcode_32-OP_T + dc.w opcode_33-OP_T + dc.w opcode_34-OP_T + dc.w opcode_35-OP_T + dc.w opcode_36-OP_T + dc.w opcode_37-OP_T + dc.w opcode_38-OP_T + dc.w opcode_39-OP_T + dc.w opcode_3a-OP_T + dc.w opcode_3b-OP_T + dc.w opcode_3c-OP_T + dc.w opcode_3d-OP_T + dc.w opcode_3e-OP_T + dc.w opcode_3f-OP_T + dc.w opcode_40-OP_T + dc.w opcode_41-OP_T + dc.w opcode_42-OP_T + dc.w opcode_43-OP_T + dc.w opcode_44-OP_T + dc.w opcode_45-OP_T + dc.w opcode_46-OP_T + dc.w opcode_47-OP_T + dc.w opcode_48-OP_T + dc.w opcode_49-OP_T + dc.w opcode_4a-OP_T + dc.w opcode_4b-OP_T + dc.w opcode_4c-OP_T + dc.w opcode_4d-OP_T + dc.w opcode_4e-OP_T + dc.w opcode_4f-OP_T + dc.w opcode_50-OP_T + dc.w opcode_51-OP_T + dc.w opcode_52-OP_T + dc.w opcode_53-OP_T + dc.w opcode_54-OP_T + dc.w opcode_55-OP_T + dc.w opcode_56-OP_T + dc.w opcode_57-OP_T + dc.w opcode_58-OP_T + dc.w opcode_59-OP_T + dc.w opcode_5a-OP_T + dc.w opcode_5b-OP_T + dc.w opcode_5c-OP_T + dc.w opcode_5d-OP_T + dc.w opcode_5e-OP_T + dc.w opcode_5f-OP_T + dc.w opcode_60-OP_T + dc.w opcode_61-OP_T + dc.w opcode_62-OP_T + dc.w opcode_63-OP_T + dc.w opcode_64-OP_T + dc.w opcode_65-OP_T + dc.w opcode_66-OP_T + dc.w opcode_67-OP_T + dc.w opcode_68-OP_T + dc.w opcode_69-OP_T + dc.w opcode_6a-OP_T + dc.w opcode_6b-OP_T + dc.w opcode_6c-OP_T + dc.w opcode_6d-OP_T + dc.w opcode_6e-OP_T + dc.w opcode_6f-OP_T + dc.w opcode_70-OP_T + dc.w opcode_71-OP_T + dc.w opcode_72-OP_T + dc.w opcode_73-OP_T + dc.w opcode_74-OP_T + dc.w opcode_75-OP_T + dc.w opcode_76-OP_T + dc.w opcode_77-OP_T + dc.w opcode_78-OP_T + dc.w opcode_79-OP_T + dc.w opcode_7a-OP_T + dc.w opcode_7b-OP_T + dc.w opcode_7c-OP_T + dc.w opcode_7d-OP_T + dc.w opcode_7e-OP_T + dc.w opcode_7f-OP_T + dc.w opcode_80-OP_T + dc.w opcode_81-OP_T + dc.w opcode_82-OP_T + dc.w opcode_83-OP_T + dc.w opcode_84-OP_T + dc.w opcode_85-OP_T + dc.w opcode_86-OP_T + dc.w opcode_87-OP_T + dc.w opcode_88-OP_T + dc.w opcode_89-OP_T + dc.w opcode_8a-OP_T + dc.w opcode_8b-OP_T + dc.w opcode_8c-OP_T + dc.w opcode_8d-OP_T + dc.w opcode_8e-OP_T + dc.w opcode_8f-OP_T + dc.w opcode_90-OP_T + dc.w opcode_91-OP_T + dc.w opcode_92-OP_T + dc.w opcode_93-OP_T + dc.w opcode_94-OP_T + dc.w opcode_95-OP_T + dc.w opcode_96-OP_T + dc.w opcode_97-OP_T + dc.w opcode_98-OP_T + dc.w opcode_99-OP_T + dc.w opcode_9a-OP_T + dc.w opcode_9b-OP_T + dc.w opcode_9c-OP_T + dc.w opcode_9d-OP_T + dc.w opcode_9e-OP_T + dc.w opcode_9f-OP_T + dc.w opcode_a0-OP_T + dc.w opcode_a1-OP_T + dc.w opcode_a2-OP_T + dc.w opcode_a3-OP_T + dc.w opcode_a4-OP_T + dc.w opcode_a5-OP_T + dc.w opcode_a6-OP_T + dc.w opcode_a7-OP_T + dc.w opcode_a8-OP_T + dc.w opcode_a9-OP_T + dc.w opcode_aa-OP_T + dc.w opcode_ab-OP_T + dc.w opcode_ac-OP_T + dc.w opcode_ad-OP_T + dc.w opcode_ae-OP_T + dc.w opcode_af-OP_T + dc.w opcode_b0-OP_T + dc.w opcode_b1-OP_T + dc.w opcode_b2-OP_T + dc.w opcode_b3-OP_T + dc.w opcode_b4-OP_T + dc.w opcode_b5-OP_T + dc.w opcode_b6-OP_T + dc.w opcode_b7-OP_T + dc.w opcode_b8-OP_T + dc.w opcode_b9-OP_T + dc.w opcode_ba-OP_T + dc.w opcode_bb-OP_T + dc.w opcode_bc-OP_T + dc.w opcode_bd-OP_T + dc.w opcode_be-OP_T + dc.w opcode_bf-OP_T + dc.w opcode_c0-OP_T + dc.w opcode_c1-OP_T + dc.w opcode_c2-OP_T + dc.w opcode_c3-OP_T + dc.w opcode_c4-OP_T + dc.w opcode_c5-OP_T + dc.w opcode_c6-OP_T + dc.w opcode_c7-OP_T + dc.w opcode_c8-OP_T + dc.w opcode_c9-OP_T + dc.w opcode_ca-OP_T + dc.w opcode_cb-OP_T + dc.w opcode_cc-OP_T + dc.w opcode_cd-OP_T + dc.w opcode_ce-OP_T + dc.w opcode_cf-OP_T + dc.w opcode_d0-OP_T + dc.w opcode_d1-OP_T + dc.w opcode_d2-OP_T + dc.w opcode_d3-OP_T + dc.w opcode_d4-OP_T + dc.w opcode_d5-OP_T + dc.w opcode_d6-OP_T + dc.w opcode_d7-OP_T + dc.w opcode_d8-OP_T + dc.w opcode_d9-OP_T + dc.w opcode_da-OP_T + dc.w opcode_db-OP_T + dc.w opcode_dc-OP_T + dc.w opcode_dd-OP_T + dc.w opcode_de-OP_T + dc.w opcode_df-OP_T + dc.w opcode_e0-OP_T + dc.w opcode_e1-OP_T + dc.w opcode_e2-OP_T + dc.w opcode_e3-OP_T + dc.w opcode_e4-OP_T + dc.w opcode_e5-OP_T + dc.w opcode_e6-OP_T + dc.w opcode_e7-OP_T + dc.w opcode_e8-OP_T + dc.w opcode_e9-OP_T + dc.w opcode_ea-OP_T + dc.w opcode_eb-OP_T + dc.w opcode_ec-OP_T + dc.w opcode_ed-OP_T + dc.w opcode_ee-OP_T + dc.w opcode_ef-OP_T + dc.w opcode_f0-OP_T + dc.w opcode_f1-OP_T + dc.w opcode_f2-OP_T + dc.w opcode_f3-OP_T + dc.w opcode_f4-OP_T + dc.w opcode_f5-OP_T + dc.w opcode_f6-OP_T + dc.w opcode_f7-OP_T + dc.w opcode_f8-OP_T + dc.w opcode_f9-OP_T + dc.w opcode_fa-OP_T + dc.w opcode_fb-OP_T + dc.w opcode_fc-OP_T + dc.w opcode_fd-OP_T + dc.w opcode_fe-OP_T + dc.w opcode_ff-OP_T + +OPMODE_TABLE_D: +OP_T_D: + dc.w opcode_00-OP_T_D + dc.w opcode_01-OP_T_D + dc.w opcode_02-OP_T_D + dc.w opcode_03-OP_T_D + dc.w opcode_04-OP_T_D + dc.w opcode_05-OP_T_D + dc.w opcode_06-OP_T_D + dc.w opcode_07-OP_T_D + dc.w opcode_08-OP_T_D + dc.w opcode_09-OP_T_D + dc.w opcode_0a-OP_T_D + dc.w opcode_0b-OP_T_D + dc.w opcode_0c-OP_T_D + dc.w opcode_0d-OP_T_D + dc.w opcode_0e-OP_T_D + dc.w opcode_0f-OP_T_D + dc.w opcode_10-OP_T_D + dc.w opcode_11-OP_T_D + dc.w opcode_12-OP_T_D + dc.w opcode_13-OP_T_D + dc.w opcode_14-OP_T_D + dc.w opcode_15-OP_T_D + dc.w opcode_16-OP_T_D + dc.w opcode_17-OP_T_D + dc.w opcode_18-OP_T_D + dc.w opcode_19-OP_T_D + dc.w opcode_1a-OP_T_D + dc.w opcode_1b-OP_T_D + dc.w opcode_1c-OP_T_D + dc.w opcode_1d-OP_T_D + dc.w opcode_1e-OP_T_D + dc.w opcode_1f-OP_T_D + dc.w opcode_20-OP_T_D + dc.w opcode_21-OP_T_D + dc.w opcode_22-OP_T_D + dc.w opcode_23-OP_T_D + dc.w opcode_24-OP_T_D + dc.w opcode_25-OP_T_D + dc.w opcode_26-OP_T_D + dc.w opcode_27-OP_T_D + dc.w opcode_28-OP_T_D + dc.w opcode_29-OP_T_D + dc.w opcode_2a-OP_T_D + dc.w opcode_2b-OP_T_D + dc.w opcode_2c-OP_T_D + dc.w opcode_2d-OP_T_D + dc.w opcode_2e-OP_T_D + dc.w opcode_2f-OP_T_D + dc.w opcode_30-OP_T_D + dc.w opcode_31-OP_T_D + dc.w opcode_32-OP_T_D + dc.w opcode_33-OP_T_D + dc.w opcode_34-OP_T_D + dc.w opcode_35-OP_T_D + dc.w opcode_36-OP_T_D + dc.w opcode_37-OP_T_D + dc.w opcode_38-OP_T_D + dc.w opcode_39-OP_T_D + dc.w opcode_3a-OP_T_D + dc.w opcode_3b-OP_T_D + dc.w opcode_3c-OP_T_D + dc.w opcode_3d-OP_T_D + dc.w opcode_3e-OP_T_D + dc.w opcode_3f-OP_T_D + dc.w opcode_40-OP_T_D + dc.w opcode_41-OP_T_D + dc.w opcode_42-OP_T_D + dc.w opcode_43-OP_T_D + dc.w opcode_44-OP_T_D + dc.w opcode_45-OP_T_D + dc.w opcode_46-OP_T_D + dc.w opcode_47-OP_T_D + dc.w opcode_48-OP_T_D + dc.w opcode_49-OP_T_D + dc.w opcode_4a-OP_T_D + dc.w opcode_4b-OP_T_D + dc.w opcode_4c-OP_T_D + dc.w opcode_4d-OP_T_D + dc.w opcode_4e-OP_T_D + dc.w opcode_4f-OP_T_D + dc.w opcode_50-OP_T_D + dc.w opcode_51-OP_T_D + dc.w opcode_52-OP_T_D + dc.w opcode_53-OP_T_D + dc.w opcode_54-OP_T_D + dc.w opcode_55-OP_T_D + dc.w opcode_56-OP_T_D + dc.w opcode_57-OP_T_D + dc.w opcode_58-OP_T_D + dc.w opcode_59-OP_T_D + dc.w opcode_5a-OP_T_D + dc.w opcode_5b-OP_T_D + dc.w opcode_5c-OP_T_D + dc.w opcode_5d-OP_T_D + dc.w opcode_5e-OP_T_D + dc.w opcode_5f-OP_T_D + dc.w opcode_60-OP_T_D + dc.w opcode_61_D-OP_T_D + dc.w opcode_62-OP_T_D + dc.w opcode_63-OP_T_D + dc.w opcode_64-OP_T_D + dc.w opcode_65_D-OP_T_D + dc.w opcode_66-OP_T_D + dc.w opcode_67-OP_T_D + dc.w opcode_68-OP_T_D + dc.w opcode_69_D-OP_T_D + dc.w opcode_6a-OP_T_D + dc.w opcode_6b-OP_T_D + dc.w opcode_6c-OP_T_D + dc.w opcode_6d_D-OP_T_D + dc.w opcode_6e-OP_T_D + dc.w opcode_6f-OP_T_D + dc.w opcode_70-OP_T_D + dc.w opcode_71_D-OP_T_D + dc.w opcode_72-OP_T_D + dc.w opcode_73-OP_T_D + dc.w opcode_74-OP_T_D + dc.w opcode_75_D-OP_T_D + dc.w opcode_76-OP_T_D + dc.w opcode_77-OP_T_D + dc.w opcode_78-OP_T_D + dc.w opcode_79_D-OP_T_D + dc.w opcode_7a-OP_T_D + dc.w opcode_7b-OP_T_D + dc.w opcode_7c-OP_T_D + dc.w opcode_7d_D-OP_T_D + dc.w opcode_7e-OP_T_D + dc.w opcode_7f-OP_T_D + dc.w opcode_80-OP_T_D + dc.w opcode_81-OP_T_D + dc.w opcode_82-OP_T_D + dc.w opcode_83-OP_T_D + dc.w opcode_84-OP_T_D + dc.w opcode_85-OP_T_D + dc.w opcode_86-OP_T_D + dc.w opcode_87-OP_T_D + dc.w opcode_88-OP_T_D + dc.w opcode_89-OP_T_D + dc.w opcode_8a-OP_T_D + dc.w opcode_8b-OP_T_D + dc.w opcode_8c-OP_T_D + dc.w opcode_8d-OP_T_D + dc.w opcode_8e-OP_T_D + dc.w opcode_8f-OP_T_D + dc.w opcode_90-OP_T_D + dc.w opcode_91-OP_T_D + dc.w opcode_92-OP_T_D + dc.w opcode_93-OP_T_D + dc.w opcode_94-OP_T_D + dc.w opcode_95-OP_T_D + dc.w opcode_96-OP_T_D + dc.w opcode_97-OP_T_D + dc.w opcode_98-OP_T_D + dc.w opcode_99-OP_T_D + dc.w opcode_9a-OP_T_D + dc.w opcode_9b-OP_T_D + dc.w opcode_9c-OP_T_D + dc.w opcode_9d-OP_T_D + dc.w opcode_9e-OP_T_D + dc.w opcode_9f-OP_T_D + dc.w opcode_a0-OP_T_D + dc.w opcode_a1-OP_T_D + dc.w opcode_a2-OP_T_D + dc.w opcode_a3-OP_T_D + dc.w opcode_a4-OP_T_D + dc.w opcode_a5-OP_T_D + dc.w opcode_a6-OP_T_D + dc.w opcode_a7-OP_T_D + dc.w opcode_a8-OP_T_D + dc.w opcode_a9-OP_T_D + dc.w opcode_aa-OP_T_D + dc.w opcode_ab-OP_T_D + dc.w opcode_ac-OP_T_D + dc.w opcode_ad-OP_T_D + dc.w opcode_ae-OP_T_D + dc.w opcode_af-OP_T_D + dc.w opcode_b0-OP_T_D + dc.w opcode_b1-OP_T_D + dc.w opcode_b2-OP_T_D + dc.w opcode_b3-OP_T_D + dc.w opcode_b4-OP_T_D + dc.w opcode_b5-OP_T_D + dc.w opcode_b6-OP_T_D + dc.w opcode_b7-OP_T_D + dc.w opcode_b8-OP_T_D + dc.w opcode_b9-OP_T_D + dc.w opcode_ba-OP_T_D + dc.w opcode_bb-OP_T_D + dc.w opcode_bc-OP_T_D + dc.w opcode_bd-OP_T_D + dc.w opcode_be-OP_T_D + dc.w opcode_bf-OP_T_D + dc.w opcode_c0-OP_T_D + dc.w opcode_c1-OP_T_D + dc.w opcode_c2-OP_T_D + dc.w opcode_c3-OP_T_D + dc.w opcode_c4-OP_T_D + dc.w opcode_c5-OP_T_D + dc.w opcode_c6-OP_T_D + dc.w opcode_c7-OP_T_D + dc.w opcode_c8-OP_T_D + dc.w opcode_c9-OP_T_D + dc.w opcode_ca-OP_T_D + dc.w opcode_cb-OP_T_D + dc.w opcode_cc-OP_T_D + dc.w opcode_cd-OP_T_D + dc.w opcode_ce-OP_T_D + dc.w opcode_cf-OP_T_D + dc.w opcode_d0-OP_T_D + dc.w opcode_d1-OP_T_D + dc.w opcode_d2-OP_T_D + dc.w opcode_d3-OP_T_D + dc.w opcode_d4-OP_T_D + dc.w opcode_d5-OP_T_D + dc.w opcode_d6-OP_T_D + dc.w opcode_d7-OP_T_D + dc.w opcode_d8-OP_T_D + dc.w opcode_d9-OP_T_D + dc.w opcode_da-OP_T_D + dc.w opcode_db-OP_T_D + dc.w opcode_dc-OP_T_D + dc.w opcode_dd-OP_T_D + dc.w opcode_de-OP_T_D + dc.w opcode_df-OP_T_D + dc.w opcode_e0-OP_T_D + dc.w opcode_e1_D-OP_T_D + dc.w opcode_e2-OP_T_D + dc.w opcode_e3-OP_T_D + dc.w opcode_e4-OP_T_D + dc.w opcode_e5_D-OP_T_D + dc.w opcode_e6-OP_T_D + dc.w opcode_e7-OP_T_D + dc.w opcode_e8-OP_T_D + dc.w opcode_e9_D-OP_T_D + dc.w opcode_ea-OP_T_D + dc.w opcode_eb_D-OP_T_D + dc.w opcode_ec-OP_T_D + dc.w opcode_ed_D-OP_T_D + dc.w opcode_ee-OP_T_D + dc.w opcode_ef-OP_T_D + dc.w opcode_f0-OP_T_D + dc.w opcode_f1_D-OP_T_D + dc.w opcode_f2-OP_T_D + dc.w opcode_f3-OP_T_D + dc.w opcode_f4-OP_T_D + dc.w opcode_f5_D-OP_T_D + dc.w opcode_f6-OP_T_D + dc.w opcode_f7-OP_T_D + dc.w opcode_f8-OP_T_D + dc.w opcode_f9_D-OP_T_D + dc.w opcode_fa-OP_T_D + dc.w opcode_fb-OP_T_D + dc.w opcode_fc-OP_T_D + dc.w opcode_fd_D-OP_T_D + dc.w opcode_fe-OP_T_D + dc.w opcode_ff-OP_T_D + +cycles: +_cycles: ; dc.l for the world outside, equ for internal use + +cy_CIM equ 2 +cy_NOP equ 2 +cy_NOP2 equ 2 +cy_NOP3 equ 3 +cy_NOP4 equ 4 +cy_SKW equ 4 +cy_BRK equ 7 +cy_Sub equ 6 +cy_Bcc equ 2 +cy_Bcc1 equ 3 +cy_Bcc2 equ 4 +cy_JmpAbs equ 3 +cy_JmpInd equ 5 +cy_IndX equ 6 ; indirect X +cy_IndY equ 5 ; indirect Y +cy_IndY2 equ 6 ; indirect Y (+) +cy_IndX_RW equ 8 ; indirect X read/write ( all inofficial ) +cy_IndY_RW equ 8 ; indirect Y read/write ( all inofficial ) +cy_Abs equ 4 ; absolute +cy_Abs_RW equ 6 ; absolute read/write +cy_AbsX equ 4 ; absolute X +cy_AbsX2 equ 5 ; absolute X (+) +cy_AbsX_RW equ 7 ; absolute X read/write +cy_AbsY equ 4 ; absolute Y +cy_AbsY2 equ 5 ; absolute X (+) +cy_AbsY_RW equ 7 ; absolute Y read/write ( all inofficial ) +cy_ZP equ 3 ; zero page +cy_ZP_RW equ 5 ; zero page read/write +cy_ZPX equ 4 ; zero page X +cy_ZPX_RW equ 6 ; zero page X read/write +cy_ZPY equ 4 ; zero page X +cy_Imm equ 2 ; immediate +cy_FlagCS equ 2 ; flag clear/set +cy_RegChg equ 2 ; register only manipulation +cy_RegPH equ 3 ; push register to stack +cy_RegPL equ 4 ; pull register from stack + + dc.l cy_BRK,cy_IndX,cy_CIM,cy_IndX_RW,cy_NOP3,cy_ZP,cy_ZP_RW,cy_ZP_RW + dc.l cy_RegPH,cy_Imm,cy_RegChg,cy_Imm,cy_SKW,cy_Abs,cy_Abs_RW,cy_Abs_RW + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + dc.l cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + dc.l cy_Sub,cy_IndX,cy_CIM,cy_IndX_RW,cy_ZP,cy_ZP,cy_ZP_RW,cy_ZP_RW + dc.l cy_RegPL,cy_Imm,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs_RW,cy_Abs_RW + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + dc.l cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + dc.l cy_Sub,cy_IndX,cy_CIM,cy_IndX_RW,cy_NOP3,cy_ZP,cy_ZP_RW,cy_ZP_RW + dc.l cy_RegPH,cy_Imm,cy_RegChg,cy_Imm,cy_JmpAbs,cy_Abs,cy_Abs_RW,cy_Abs_RW + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + dc.l cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + dc.l cy_Sub,cy_IndX,cy_CIM,cy_IndX_RW,cy_NOP3,cy_ZP,cy_ZP_RW,cy_ZP_RW + dc.l cy_RegPL,cy_Imm,cy_RegChg,cy_Imm,cy_JmpInd,cy_Abs,cy_Abs_RW,cy_Abs_RW + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + dc.l cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + dc.l cy_NOP2,cy_IndX,cy_NOP2,cy_IndX,cy_ZP,cy_ZP,cy_ZP,cy_ZP + dc.l cy_RegChg,cy_NOP2,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs,cy_Abs + dc.l cy_Bcc,cy_IndY2,cy_CIM,cy_IndY2,cy_ZPX,cy_ZPX,cy_ZPY,cy_ZPY + dc.l cy_RegChg,cy_IndY2,cy_RegChg,cy_IndY2,cy_AbsX2,cy_AbsX2,cy_IndY2,cy_IndY2 + dc.l cy_Imm,cy_IndX,cy_Imm,cy_IndX,cy_ZP,cy_ZP,cy_ZP,cy_ZP + dc.l cy_RegChg,cy_Imm,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs,cy_Abs + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY,cy_ZPX,cy_ZPX,cy_ZPY,cy_ZPY + dc.l cy_FlagCS,cy_AbsY,cy_RegChg,cy_AbsY,cy_AbsX,cy_AbsX,cy_AbsY,cy_AbsY + dc.l cy_Imm,cy_IndX,cy_NOP2,cy_IndX_RW,cy_ZP,cy_ZP,cy_ZP_RW,cy_ZP_RW + dc.l cy_RegChg,cy_Imm,cy_RegChg,cy_Imm,cy_Abs,cy_Abs,cy_Abs_RW,cy_Abs_RW + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + dc.l cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + dc.l cy_Imm,cy_IndX,cy_NOP2,cy_IndX_RW,cy_ZP,cy_ZP,cy_ZP_RW,cy_ZP_RW + dc.l cy_RegChg,cy_Imm,cy_NOP,cy_Imm,cy_Abs,cy_Abs,cy_Abs_RW,cy_Abs_RW + dc.l cy_Bcc,cy_IndY,cy_CIM,cy_IndY_RW,cy_NOP4,cy_ZPX,cy_ZPX_RW,cy_ZPX_RW + dc.l cy_FlagCS,cy_AbsY,cy_NOP,cy_AbsY_RW,cy_SKW,cy_AbsX,cy_AbsX_RW,cy_AbsX_RW + + diff --git a/PVAtari800/atari800-src/crc32.c b/PVAtari800/atari800-src/crc32.c new file mode 100644 index 0000000000..31e54e9a9c --- /dev/null +++ b/PVAtari800/atari800-src/crc32.c @@ -0,0 +1,103 @@ +/* + * crc32.c - functions for computing CRC32 + * + * Copyright (C) 2012 Tomasz Krasuski + * Copyright (C) 2012 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "crc32.h" +#include "atari.h" + +#define BUF_SIZE 0x400 + +/* Table contents generated with the following algorithm: +#define POLYNOMIAL 0xedb88320 + int i; + for (i = 0; i < 0x100; ++i) { + ULONG crc = i; + int j; + for (j = 7; j >= 0; --j) { + ULONG mask = -(crc & 1); + crc = (crc >> 1) ^ (POLYNOMIAL & mask); + } + table[i] = crc; + } + */ +static ULONG table[0x100]= { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +ULONG CRC32_Update(ULONG crc, UBYTE const *buf, unsigned int len) +{ + while (len > 0) { + crc = (crc >> 8) ^ table[(crc ^ *(buf++)) & 0xff]; + --len; + } + + return crc; +} + +int CRC32_FromFile(FILE *f, ULONG *result) +{ + UBYTE buf[BUF_SIZE]; + ULONG crc = 0xffffffff; + + for (;;) { + size_t len = fread(buf, 1, BUF_SIZE, f); + crc = CRC32_Update(crc, buf, len); + if (len < BUF_SIZE) + break; + } + *result = ~crc; + return feof(f); +} diff --git a/PVAtari800/atari800-src/crc32.h b/PVAtari800/atari800-src/crc32.h new file mode 100644 index 0000000000..d3829fc921 --- /dev/null +++ b/PVAtari800/atari800-src/crc32.h @@ -0,0 +1,16 @@ +#ifndef CRC32_H_ +#define CRC32_H_ + +#include + +#include "atari.h" + +/* Compute CRC32 of LEN bytes from BUF. CRC should be set initially to + 0xffffffff. */ +ULONG CRC32_Update(ULONG crc, UBYTE const *buf, unsigned int len); + +/* Compute CRC32 of a stream F and store it at *RESULT. Return non-zero on + success or 0 on read error. */ +int CRC32_FromFile(FILE *f, ULONG *result); + +#endif /* CRC32_H_ */ diff --git a/PVAtari800/atari800-src/cycle_map.c b/PVAtari800/atari800-src/cycle_map.c new file mode 100644 index 0000000000..552e951eba --- /dev/null +++ b/PVAtari800/atari800-src/cycle_map.c @@ -0,0 +1,201 @@ +/* + * cycle_map.c - part of the ANTIC emulation + * + * Copyright (C) 1995-1998 Perry McFarlane + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include "cycle_map.h" + +int CYCLE_MAP_cpu2antic[CYCLE_MAP_SIZE * (17 * 7 + 1)]; +int CYCLE_MAP_antic2cpu[CYCLE_MAP_SIZE * (17 * 7 + 1)]; +static void try_all_scroll(int md, int use_char_index, + int use_font, int use_bitmap, int *cpu2antic, int *antic2cpu); +static void antic_steal_map(int width, int md, int scroll_offset, int use_char_index, + int use_font, int use_bitmap, char *antic_cycles, int *cpucycles, + int *actualcycles); +static void cpu_cycle_map(char *antic_cycles_orig, int *cpu_cycles, int *actual_cycles); + +#undef TEST_CYCLE_MAP +#ifdef TEST_CYCLE_MAP +int main() +{ + CYCLE_MAP_Create(); + return 0; +}; +#endif + +static void cpu_cycle_map(char *antic_cycles_orig, int *cpu_cycles, int *actual_cycles) +{ + int i; + char antic_cycles[CYCLE_MAP_SIZE]; + int antic_xpos; + int cpu_xpos = 0; + for (i = 0; i <= 113; i++) + antic_cycles[i] = antic_cycles_orig[i]; + for (i = 114; i < CYCLE_MAP_SIZE; i++) + antic_cycles[i] = '.'; + for (i = 0; i < CYCLE_MAP_SIZE; i++) + cpu_cycles[i]=-1; + for (antic_xpos = 0; antic_xpos < CYCLE_MAP_SIZE; antic_xpos++) { + char c = antic_cycles[antic_xpos]; + actual_cycles[antic_xpos] = cpu_xpos; + if (c != 'R' && c != 'S' && c != 'F' && c != 'I') { + /*Not a stolen cycle*/ + cpu_cycles[cpu_xpos] = antic_xpos; + cpu_xpos++; + } + } +} + +void CYCLE_MAP_Create(void) +{ +#ifdef TEST_CYCLE_MAP + int i, j; + int *cpu_cycles; + int *actual_cycles; +#endif + char antic_cycles[115]; + int k = 0; + antic_steal_map(1, 0, 0, 0, 0, 0, antic_cycles, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* blank line, or mode 8-F following line*/ + k = CYCLE_MAP_SIZE * (17 * 0 + 1); + try_all_scroll(0, 1, 1, 0, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode 2,3,4,5 first line */ + k = CYCLE_MAP_SIZE * (17 * 1 + 1); + try_all_scroll(0, 0, 1, 0, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode 2,3,4,5 following lines */ + k = CYCLE_MAP_SIZE * (17 * 2 + 1); + try_all_scroll(1, 1, 1, 0, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode 6,7 first line */ + k = CYCLE_MAP_SIZE * (17 * 3 + 1); + try_all_scroll(1, 0, 1, 0, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode 6,7 following lines */ + k = CYCLE_MAP_SIZE * (17 * 4 + 1); + try_all_scroll(0, 0, 0, 1, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode 8,9 first line */ + k = CYCLE_MAP_SIZE * (17 * 5 + 1); + try_all_scroll(1, 0, 0, 1, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode A,B,C first line */ + k = CYCLE_MAP_SIZE * (17 * 6 + 1); + try_all_scroll(2, 0, 0, 1, &CYCLE_MAP_cpu2antic[k], &CYCLE_MAP_antic2cpu[k]); /* mode D,E,F first line */ +#ifdef TEST_CYCLE_MAP + for(j = 0; j < 17 * 7 + 1; j++) { + cpu_cycles = &CYCLE_MAP_cpu2antic[CYCLE_MAP_SIZE * j]; + actual_cycles = &CYCLE_MAP_antic2cpu[CYCLE_MAP_SIZE * j]; + printf("%3d ", actual_cycles[114]); + for(i = 0; i <= actual_cycles[114] + 6; i++) + printf("%3d, ", cpu_cycles[i]); + printf("\n"); + } +#endif +} + +static void try_all_scroll(int md, int use_char_index, + int use_font, int use_bitmap, int *cpu2antic, int *antic2cpu) +{ + char antic_cycles[115]; + int width; + int scroll_offset = 0; + width = 1; /* narrow width without scroll*/ + antic_steal_map(width, md, scroll_offset, use_char_index, use_font, + use_bitmap, antic_cycles, &cpu2antic[CYCLE_MAP_SIZE * 0], &antic2cpu[CYCLE_MAP_SIZE * 0]); + width = 2; /* standard without scroll or narrow with scroll */ + for (scroll_offset = 0; scroll_offset <= 7; scroll_offset++) { + antic_steal_map(width, md, scroll_offset, use_char_index, use_font, + use_bitmap, antic_cycles, &cpu2antic[CYCLE_MAP_SIZE * (1 + scroll_offset)], + &antic2cpu[CYCLE_MAP_SIZE * (1 + scroll_offset)]); + } + width = 3; /* standard with scroll or wide */ + for (scroll_offset = 0; scroll_offset <= 7; scroll_offset++) { + antic_steal_map(width, md, scroll_offset, use_char_index, use_font, + use_bitmap, antic_cycles, &cpu2antic[CYCLE_MAP_SIZE * (9 + scroll_offset)], + &antic2cpu[CYCLE_MAP_SIZE * (9 + scroll_offset)]); + } +} + +static void antic_steal_map(int width, int md, int scroll_offset, int use_char_index, + int use_font, int use_bitmap, char *antic_cycles, int *cpu_cycles, + int *actual_cycles) +{ + int char_start; + int bitmap_start; + int font_start; + int i; + int dram_pending; + int interval; + int steal; + int max_chars; + /* defaults for wide playfield */ +#define CHAR_C 13 +#define BITMAP_C (CHAR_C + 2) +#define FONT_C (CHAR_C + 3) +#define END_C (CHAR_C + 95) +#define DMARS_C (CHAR_C + 15) +#define DMARE_C (DMARS_C + 32) + char_start = CHAR_C + scroll_offset; + bitmap_start = BITMAP_C + scroll_offset; + font_start = FONT_C + scroll_offset; + max_chars = 48; + if (width == 2) { /* standard width */ + char_start += 8; + bitmap_start += 8; + font_start += 8; + max_chars = 40; + } + else if (width == 1) { /* narrow */ + char_start += 16; + bitmap_start += 16; + font_start += 16; + max_chars = 32; + } + + interval = (2 << md); + max_chars = (max_chars >> md); + for (i = 0; i <= 113; i++) + antic_cycles[i] = '.'; + antic_cycles[114] = '\0'; + antic_cycles[0] = 'M'; + antic_cycles[1] = antic_cycles[6] = antic_cycles[7] = 'D'; + antic_cycles[2] = antic_cycles[3] = antic_cycles[4] = antic_cycles[5] = 'P'; + dram_pending = 0; + for (i = 0; i <= 114; i++) { + steal = 0; + if (i <= END_C) { + if (use_char_index && i >= char_start && ((i - char_start) % interval == 0) + && ((i - char_start) < max_chars * interval)) { + steal = 'I'; + } + if (use_font && i >= font_start && ((i - font_start) % interval == 0) + && ((i - font_start) < max_chars * interval)) { + steal = 'F'; + } + if (use_bitmap && i >= bitmap_start && ((i - bitmap_start) % interval == 0) + && ((i - bitmap_start) < max_chars * interval)) { + steal = 'S'; + } + if (i >= DMARS_C && i <= DMARE_C && ((i - DMARS_C) % 4 == 0)) { + dram_pending = 1; + } + } + if (steal !=0 ) { + antic_cycles[i] = steal; + } + else if (dram_pending != 0){ + antic_cycles[i] = 'R'; + dram_pending = 0; + } + } + cpu_cycle_map(antic_cycles, cpu_cycles, actual_cycles); +} diff --git a/PVAtari800/atari800-src/cycle_map.h b/PVAtari800/atari800-src/cycle_map.h new file mode 100644 index 0000000000..39d7831a7e --- /dev/null +++ b/PVAtari800/atari800-src/cycle_map.h @@ -0,0 +1,9 @@ +#ifndef CYCLE_MAP_H_ +#define CYCLE_MAP_H_ + +#define CYCLE_MAP_SIZE (114 + 9) +extern int CYCLE_MAP_cpu2antic[CYCLE_MAP_SIZE * (17 * 7 + 1)]; +extern int CYCLE_MAP_antic2cpu[CYCLE_MAP_SIZE * (17 * 7 + 1)]; +void CYCLE_MAP_Create(void); + +#endif /* CYCLE_MAP_H_ */ diff --git a/PVAtari800/atari800-src/devices.c b/PVAtari800/atari800-src/devices.c new file mode 100644 index 0000000000..07fc8b59e9 --- /dev/null +++ b/PVAtari800/atari800-src/devices.c @@ -0,0 +1,2713 @@ +/* + * devices.c - emulation of H:, P:, E: and K: Atari devices + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Bibliography: + [OSMAN] - Atari Home Computer System Technical Reference Notes - Operating System + User's Manual - CA016555 Rev. A - 1982 Atari, Inc. + */ +#include "config.h" +#include +#include +#include +#ifdef HAVE_ERRNO_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_UNIXIO_H +/* VMS */ +#include +#endif +#ifdef HAVE_FILE_H +/* VMS */ +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_DIRECT_H +/* WIN32 */ +#include /* mkdir, rmdir */ +#endif +/* XXX: , , */ +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#include "atari.h" +#include "binload.h" +#include "cpu.h" +#include "devices.h" +#include "esc.h" +#include "log.h" +#include "memory.h" +#include "sio.h" +#include "sysrom.h" +#include "util.h" +#ifdef R_IO_DEVICE +#include "rdevice.h" +#endif +#ifdef __PLUS +#include "misc_win.h" +#endif + +#ifndef S_IREAD +#define S_IREAD S_IRUSR +#endif +#ifndef S_IWRITE +#define S_IWRITE S_IWUSR +#endif + +#ifdef HAVE_WINDOWS_H + +#include + +#undef FILENAME_CONV +#undef FILENAME + +#ifdef UNICODE +#define FILENAME_CONV \ + WCHAR wfilename[FILENAME_MAX]; \ + if (MultiByteToWideChar(CP_ACP, 0, filename, -1, wfilename, FILENAME_MAX) <= 0) \ + return FALSE; +#define FILENAME wfilename +#else /* UNICODE */ +#define FILENAME_CONV +#define FILENAME filename +#endif /* UNICODE */ + +#endif /* HAVE_WINDOWS_H */ + + +/* Read Directory abstraction layer -------------------------------------- */ + +#ifdef HAVE_WINDOWS_H + +static char dir_path[FILENAME_MAX]; +static WIN32_FIND_DATA wfd; +static HANDLE dh = INVALID_HANDLE_VALUE; + +static int Devices_OpenDir(const char *filename) +{ + FILENAME_CONV; + Util_splitpath(filename, dir_path, NULL); + if (dh != INVALID_HANDLE_VALUE) + FindClose(dh); + dh = FindFirstFile(FILENAME, &wfd); + if (dh == INVALID_HANDLE_VALUE) { + /* don't raise error if the path is ok but no file matches: + Win98 returns ERROR_FILE_NOT_FOUND, + WinCE returns ERROR_NO_MORE_FILES */ + DWORD err = GetLastError(); + if (err != ERROR_FILE_NOT_FOUND && err != ERROR_NO_MORE_FILES) + return FALSE; + } + return TRUE; +} + +static int Devices_ReadDir(char *fullpath, char *filename, int *isdir, + int *readonly, int *size, char *timetext) +{ +#ifdef UNICODE + char afilename[MAX_PATH]; +#endif + if (dh == INVALID_HANDLE_VALUE) + return FALSE; + /* don't match "." nor ".." */ + while (wfd.cFileName[0] == '.' && + (wfd.cFileName[1] == '\0' || (wfd.cFileName[1] == '.' && wfd.cFileName[2] == '\0')) + ) { + if (!FindNextFile(dh, &wfd)) { + FindClose(dh); + dh = INVALID_HANDLE_VALUE; + return FALSE; + } + } +#ifdef UNICODE + if (WideCharToMultiByte(CP_ACP, 0, wfd.cFileName, -1, afilename, MAX_PATH, NULL, NULL) <= 0) + strcpy(afilename, "?ERROR"); +#define FOUND_FILENAME afilename +#else +#define FOUND_FILENAME wfd.cFileName +#endif /* UNICODE */ + if (filename != NULL) + strcpy(filename, FOUND_FILENAME); + if (fullpath != NULL) + Util_catpath(fullpath, dir_path, FOUND_FILENAME); + if (isdir != NULL) + *isdir = (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? TRUE : FALSE; + if (readonly != NULL) + *readonly = (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? TRUE : FALSE; + if (size != NULL) + *size = (int) wfd.nFileSizeLow; + if (timetext != NULL) { + FILETIME lt; + SYSTEMTIME st; + if (FileTimeToLocalFileTime(&wfd.ftLastWriteTime, <) != 0 + && FileTimeToSystemTime(<, &st) != 0) { + int hour = st.wHour; + char ampm = 'a'; + if (hour >= 12) { + hour -= 12; + ampm = 'p'; + } + if (hour == 0) + hour = 12; + sprintf(timetext, "%2d-%02d-%02d %2d:%02d%c", + st.wMonth, st.wDay, st.wYear % 100, hour, st.wMinute, ampm); + } + else + strcpy(timetext, " 1-01-01 12:00p"); + } + + if (!FindNextFile(dh, &wfd)) { + FindClose(dh); + dh = INVALID_HANDLE_VALUE; + } + return TRUE; +} + +#define DO_DIR + +#elif defined(HAVE_OPENDIR) + +static int match(const char *pattern, const char *filename) +{ + if (strcmp(pattern, "*.*") == 0) + return TRUE; + + for (;;) { + switch (*pattern) { + case '\0': + return (*filename == '\0'); + case '?': + if (*filename == '\0' || *filename == '.') + return FALSE; + pattern++; + filename++; + break; + case '*': + if (Util_chrieq(*filename, pattern[1])) + pattern++; + else if (*filename == '\0') + return FALSE; /* because pattern[1] != '\0' */ + else + filename++; + break; + default: + if (!Util_chrieq(*pattern, *filename)) + return FALSE; + pattern++; + filename++; + break; + } + } +} + +static char dir_path[FILENAME_MAX]; +static char filename_pattern[FILENAME_MAX]; +static DIR *dp = NULL; + +static int Devices_OpenDir(const char *filename) +{ + Util_splitpath(filename, dir_path, filename_pattern); + if (dp != NULL) + closedir(dp); + dp = opendir(dir_path); + return dp != NULL; +} + +static int Devices_ReadDir(char *fullpath, char *filename, int *isdir, + int *readonly, int *size, char *timetext) +{ + struct dirent *entry; + char temppath[FILENAME_MAX]; +#ifdef HAVE_STAT + struct stat status; +#endif + for (;;) { + entry = readdir(dp); + if (entry == NULL) { + closedir(dp); + dp = NULL; + return FALSE; + } + if (entry->d_name[0] == '.') { + /* don't match Unix hidden files unless specifically requested */ + if (filename_pattern[0] != '.') + continue; + /* never match "." */ + if (entry->d_name[1] == '\0') + continue; + /* never match ".." */ + if (entry->d_name[1] == '.' && entry->d_name[2] == '\0') + continue; + } + if (match(filename_pattern, entry->d_name)) + break; + } + if (filename != NULL) + strcpy(filename, entry->d_name); + Util_catpath(temppath, dir_path, entry->d_name); + if (fullpath != NULL) + strcpy(fullpath, temppath); +#ifdef HAVE_STAT + if (stat(temppath, &status) == 0) { + if (isdir != NULL) + *isdir = S_ISDIR(status.st_mode); + if (readonly != NULL) + *readonly = (status.st_mode & S_IWRITE) ? FALSE : TRUE; + if (size != NULL) + *size = (int) status.st_size; + if (timetext != NULL) { +#ifdef HAVE_LOCALTIME + struct tm *ft; + int hour; + char ampm = 'a'; + ft = localtime(&status.st_mtime); + hour = ft->tm_hour; + if (hour >= 12) { + hour -= 12; + ampm = 'p'; + } + if (hour == 0) + hour = 12; + sprintf(timetext, "%2d-%02d-%02d %2d:%02d%c", + ft->tm_mon + 1, ft->tm_mday, ft->tm_year % 100, + hour, ft->tm_min, ampm); +#else + strcpy(timetext, " 1-01-01 12:00p"); +#endif /* HAVE_LOCALTIME */ + } + } + else +#endif /* HAVE_STAT */ + { + if (isdir != NULL) + *isdir = FALSE; + if (readonly != NULL) + *readonly = FALSE; + if (size != NULL) + *size = 0; + if (timetext != NULL) + strcpy(timetext, " 1-01-01 12:00p"); + } + return TRUE; +} + +#define DO_DIR + +#elif defined(PS2) + +extern char dir_path[FILENAME_MAX]; + +int Atari_OpenDir(const char *filename); + +#define Devices_OpenDir Atari_OpenDir + +int Atari_ReadDir(char *fullpath, char *filename, int *isdir, + int *readonly, int *size, char *timetext); + +static int Devices_ReadDir(char *fullpath, char *filename, int *isdir, + int *readonly, int *size, char *timetext) +{ + char tmp_filename[FILENAME_MAX]; + if (filename == NULL) + filename = tmp_filename; + do { + if (!Atari_ReadDir(fullpath, filename, isdir, readonly, size, timetext)) + return FALSE; + /* reject "." and ".." */ + } while (filename[0] == '.' && + (filename[1] == '\0' || (filename[1] == '.' && filename[2] == '\0'))); + return TRUE; +} + +#define DO_DIR + +#endif /* defined(PS2) */ + + +/* Rename File/Directory abstraction layer ------------------------------- */ + +#ifdef HAVE_WINDOWS_H + +static int Devices_Rename(const char *oldname, const char *newname) +{ +#ifdef UNICODE + WCHAR woldname[FILENAME_MAX]; + WCHAR wnewname[FILENAME_MAX]; + if (MultiByteToWideChar(CP_ACP, 0, oldname, -1, woldname, FILENAME_MAX) <= 0 + || MultiByteToWideChar(CP_ACP, 0, newname, -1, wnewname, FILENAME_MAX) <= 0) + return FALSE; + return MoveFile(woldname, wnewname) != 0; +#else + return MoveFile(oldname, newname) != 0; +#endif /* UNICODE */ +} + +#define DO_RENAME + +#elif defined(HAVE_RENAME) + +static int Devices_Rename(const char *oldname, const char *newname) +{ + return rename(oldname, newname) == 0; +} + +#define DO_RENAME + +#endif + + +/* Set/Reset Read-Only Attribute abstraction layer ----------------------- */ + +#ifdef HAVE_WINDOWS_H + +/* Enables/disables read-only mode for the file. Returns TRUE on success. */ +static int Devices_SetReadOnly(const char *filename, int readonly) +{ + DWORD attr; + FILENAME_CONV; + attr = GetFileAttributes(FILENAME); + if (attr == 0xffffffff) + return FALSE; + return SetFileAttributes(FILENAME, readonly + ? (attr | FILE_ATTRIBUTE_READONLY) + : (attr & ~FILE_ATTRIBUTE_READONLY)) != 0; +} + +#define DO_LOCK + +#elif defined(HAVE_CHMOD) + +static int Devices_SetReadOnly(const char *filename, int readonly) +{ + return chmod(filename, readonly ? S_IREAD : (S_IREAD | S_IWRITE)) == 0; +} + +#define DO_LOCK + +#endif /* defined(HAVE_CHMOD) */ + + +/* Make Directory abstraction layer -------------------------------------- */ + +#ifdef HAVE_WINDOWS_H + +static int Devices_MakeDirectory(const char *filename) +{ + FILENAME_CONV; + return CreateDirectory(FILENAME, NULL) != 0; +} + +#define DO_MKDIR + +#elif defined(HAVE_MKDIR) + +static int Devices_MakeDirectory(const char *filename) +{ + return mkdir(filename +#ifndef MKDIR_TAKES_ONE_ARG + , 0777 +#endif + ) == 0; +} + +#define DO_MKDIR + +#endif /* defined(HAVE_MKDIR) */ + + +/* Remove Directory abstraction layer ------------------------------------ */ + +#ifdef HAVE_WINDOWS_H + +static UBYTE Devices_RemoveDirectory(const char *filename) +{ + FILENAME_CONV; + if (RemoveDirectory(FILENAME) != 0) + return 1; + return (UBYTE) ((HRESULT_CODE(GetLastError()) == ERROR_DIR_NOT_EMPTY) ? 167 : 150); +} + +#define DO_RMDIR + +#elif defined(HAVE_RMDIR) + +static UBYTE Devices_RemoveDirectory(const char *filename) +{ + if (rmdir(filename) == 0) + return 1; + return (UBYTE) ((errno == ENOTEMPTY) ? 167 : 150); +} + +#define DO_RMDIR + +#endif /* defined(HAVE_RMDIR) */ + + +/* H: device emulation --------------------------------------------------- */ + +#define DEFAULT_H_PATH "H1:>DOS;>DOS" + +/* emulator debugging mode */ +static int devbug = FALSE; + +/* host path for each H: unit */ +char Devices_atari_h_dir[4][FILENAME_MAX]; + +/* read only mode for H: device */ +int Devices_h_read_only = TRUE; + +/* ';'-separated list of Atari paths checked by the "load executable" + command. if a path does not start with "Hn:", then the selected device + is used. */ +char Devices_h_exe_path[FILENAME_MAX] = DEFAULT_H_PATH; + +/* Devices_h_current_dir must be empty or terminated with Util_DIR_SEP_CHAR; + only Util_DIR_SEP_CHAR can be used as a directory separator here */ +char Devices_h_current_dir[4][FILENAME_MAX]; + +/* stream open via H: device per IOCB */ +static FILE *h_fp[8] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; + +/* H: text mode per IOCB */ +static int h_textmode[8]; + +/* H: last read character per IOCB */ +static int h_lastbyte[8]; + +/* last read character was CR, per IOCB */ +static int h_wascr[8]; + +/* last operation: 'o': open, 'r': read, 'w': write, 'p': point, 'b': binary + load, per IOCB. This is needed to apply fseek(fp, 0, SEEK_CUR) between reads + and writes in update (12) mode, and to support the read-ahead of 1 byte + in Devices_h_read. */ +static char h_lastop[8]; + +Util_tmpbufdef(static, h_tmpbuf[8]) + +/* IOCB #, 0-7 */ +static int h_iocb; + +/* H: device number, 0-3 */ +static int h_devnum; + +/* filename as specified after "Hn:" */ +static char atari_filename[FILENAME_MAX]; + +#ifdef DO_RENAME +/* new filename (no directories!) */ +static char new_filename[FILENAME_MAX]; +#endif + +/* atari_filename applied to H:'s current dir, with Util_DIR_SEP_CHARs only */ +static char atari_path[FILENAME_MAX]; + +/* full filename for the current operation */ +static char host_path[FILENAME_MAX]; + +int Devices_H_CountOpen(void) +{ + int r = 0; + int i; + for (i = 0; i < 8; i++) + if (h_fp[i] != NULL) + r++; + return r; +} + +void Devices_H_CloseAll(void) +{ + int i; + for (i = 0; i < 8; i++) + if (h_fp[i] != NULL) { + Util_fclose(h_fp[i], h_tmpbuf[i]); + h_fp[i] = NULL; + } +} + +static void Devices_H_Init(void) +{ + if (devbug) + Log_print("HHINIT"); + Devices_h_current_dir[0][0] = '\0'; + Devices_h_current_dir[1][0] = '\0'; + Devices_h_current_dir[2][0] = '\0'; + Devices_h_current_dir[3][0] = '\0'; + Devices_H_CloseAll(); +} + +int Devices_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-H1") == 0) { + if (i_a) + Util_strlcpy(Devices_atari_h_dir[0], argv[++i], FILENAME_MAX); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-H2") == 0) { + if (i_a) + Util_strlcpy(Devices_atari_h_dir[1], argv[++i], FILENAME_MAX); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-H3") == 0) { + if (i_a) + Util_strlcpy(Devices_atari_h_dir[2], argv[++i], FILENAME_MAX); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-H4") == 0) { + if (i_a) + Util_strlcpy(Devices_atari_h_dir[3], argv[++i], FILENAME_MAX); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-Hpath") == 0) { + if (i_a) + Util_strlcpy(Devices_h_exe_path, argv[++i], FILENAME_MAX); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-hreadonly") == 0) + Devices_h_read_only = TRUE; + else if (strcmp(argv[i], "-hreadwrite") == 0) + Devices_h_read_only = FALSE; + else if (strcmp(argv[i], "-devbug") == 0) + devbug = TRUE; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-H1 Set path for H1: device"); + Log_print("\t-H2 Set path for H2: device"); + Log_print("\t-H3 Set path for H3: device"); + Log_print("\t-H4 Set path for H4: device"); + Log_print("\t-Hpath Set path for Atari executables on the H: device"); + Log_print("\t-hreadonly Enable read-only mode for H: device"); + Log_print("\t-hreadwrite Disable read-only mode for H: device"); + Log_print("\t-devbug Debugging messages for H: and P: devices"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + Devices_H_Init(); + + return TRUE; +} + +void Devices_Exit(void) +{ + Devices_H_CloseAll(); +} + +#define IS_DIR_SEP(c) ((c) == '/' || (c) == '\\' || (c) == ':' || (c) == '>') + +static int Devices_IsValidForFilename(char ch) +{ + if ((ch >= 'A' && ch <= 'Z') + || (ch >= 'a' && ch <= 'z') + || (ch >= '0' && ch <= '9')) + return TRUE; + switch (ch) { + case '!': + case '#': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '-': + case '.': + case '?': + case '@': + case '_': + return TRUE; + default: + return FALSE; + } +} + +UWORD Devices_SkipDeviceName(void) +{ + UWORD bufadr; + for (bufadr = MEMORY_dGetWordAligned(Devices_ICBALZ); ; bufadr++) { + char c = (char) MEMORY_dGetByte(bufadr); + if (c == ':') + return (UWORD) (bufadr + 1); + if (c < '!' || c > '\x7e') + return 0; + } +} + +/* devnum must be 0-3; p must point inside atari_filename */ +static UWORD Devices_GetAtariPath(int devnum, char *p) +{ + UWORD bufadr = Devices_SkipDeviceName(); + if (bufadr != 0) { + while (p < atari_filename + sizeof(atari_filename) - 1) { + char c = (char) MEMORY_dGetByte(bufadr); + if (Devices_IsValidForFilename(c) || IS_DIR_SEP(c) || c == '<') { + *p++ = c; + bufadr++; + } + else { + /* end of filename */ + /* now apply it to Devices_h_current_dir */ + const char *q = atari_filename; + *p = '\0'; + if (IS_DIR_SEP(*q)) { + /* absolute path on H: device */ + q++; + p = atari_path; + } + else { + strcpy(atari_path, Devices_h_current_dir[devnum]); + p = atari_path + strlen(atari_path); + } + for (;;) { + /* we are here at the beginning of a path element, + i.e. at the beginning of atari_path or after Util_DIR_SEP_CHAR */ + if (*q == '<' + || (*q == '.' && q[1] == '.' && (q[2] == '\0' || IS_DIR_SEP(q[2])))) { + /* "<" or "..": parent directory */ + if (p == atari_path) { + CPU_regY = 150; /* Sparta: directory not found */ + CPU_SetN; + return 0; + } + do + p--; + while (p > atari_path && p[-1] != Util_DIR_SEP_CHAR); + if (*q == '.') { + if (q[2] != '\0') + q++; + q++; + } + q++; + continue; + } + if (IS_DIR_SEP(*q)) { + /* duplicate DIR_SEP */ + CPU_regY = 165; /* bad filename */ + CPU_SetN; + return 0; + } + do { + if (p >= atari_path + sizeof(atari_path) - 1) { + CPU_regY = 165; /* bad filename */ + CPU_SetN; + return 0; + } + *p++ = *q; + if (*q == '\0') + return bufadr; + q++; + } while (!IS_DIR_SEP(*q)); + *p++ = Util_DIR_SEP_CHAR; + q++; + } + } + } + } + CPU_regY = 165; /* bad filename */ + CPU_SetN; + return 0; +} + +static int Devices_GetIOCB(void) +{ + if ((CPU_regX & 0x8f) != 0) { + CPU_regY = 134; /* invalid IOCB number */ + CPU_SetN; + return FALSE; + } + h_iocb = CPU_regX >> 4; + return TRUE; +} + +static int Devices_GetNumber(int set_textmode) +{ + int devnum; + if (!Devices_GetIOCB()) + return -1; + devnum = MEMORY_dGetByte(Devices_ICDNOZ); + if (devnum > 9 || devnum == 0 || devnum == 5) { + CPU_regY = 160; /* invalid unit/drive number */ + CPU_SetN; + return -1; + } + if (devnum < 5) { + if (set_textmode) + h_textmode[h_iocb] = FALSE; + return devnum - 1; + } + if (set_textmode) + h_textmode[h_iocb] = TRUE; + return devnum - 6; +} + +static UWORD Devices_GetHostPath(int set_textmode) +{ + UWORD bufadr; + h_devnum = Devices_GetNumber(set_textmode); + if (h_devnum < 0) + return 0; + bufadr = Devices_GetAtariPath(h_devnum, atari_filename); + if (bufadr == 0) + return 0; + Util_catpath(host_path, Devices_atari_h_dir[h_devnum], atari_path); + return bufadr; +} + +static void Devices_H_Open(void) +{ + FILE *fp; + UBYTE aux1; +#ifdef DO_DIR + UBYTE aux2; + char entryname[FILENAME_MAX]; + int isdir; + int readonly; + int size; + char timetext[16]; +#endif + + if (devbug) + Log_print("HHOPEN"); + + if (Devices_GetHostPath(TRUE) == 0) + return; + + if (h_fp[h_iocb] != NULL) + Util_fclose(h_fp[h_iocb], h_tmpbuf[h_iocb]); + +#if 0 + if (devbug) + Log_print("atari_filename=\"%s\", atari_path=\"%s\" host_path=\"%s\"", atari_filename, atari_path, host_path); +#endif + + fp = NULL; + h_wascr[h_iocb] = FALSE; + h_lastop[h_iocb] = 'o'; + + aux1 = MEMORY_dGetByte(Devices_ICAX1Z); + switch (aux1) { + case 4: + /* don't bother using "r" for textmode: + we want to support LF, CR/LF and CR, not only native EOLs */ + fp = Util_fopen(host_path, "rb", h_tmpbuf[h_iocb]); + if (fp != NULL) { + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 170; /* file not found */ + CPU_SetN; + } + break; +#ifdef DO_DIR + case 6: + case 7: + fp = Util_tmpopen(h_tmpbuf[h_iocb]); + if (fp == NULL) { + CPU_regY = 144; /* device done error */ + CPU_SetN; + break; + } + if (!Devices_OpenDir(host_path)) { + Util_fclose(fp, h_tmpbuf[h_iocb]); + fp = NULL; + CPU_regY = 144; /* device done error */ + CPU_SetN; + break; + } + aux2 = MEMORY_dGetByte(Devices_ICAX2Z); + if (aux2 >= 128) { + fprintf(fp, "\nVolume: HDISK%c\nDirectory: ", '1' + h_devnum); + /* if (strcmp(dir_path, Devices_atari_h_dir[h_devnum]) == 0) */ + if (strchr(atari_path, Util_DIR_SEP_CHAR) == NULL) + fprintf(fp, "MAIN\n\n"); + else { + char end_dir_str[FILENAME_MAX]; + Util_splitpath(dir_path, NULL, end_dir_str); + fprintf(fp, "%s\n\n", /* Util_strupper */(end_dir_str)); + } + } + + while (Devices_ReadDir(NULL, entryname, &isdir, &readonly, &size, + (aux2 >= 128) ? timetext : NULL)) { + char *ext; + /* Util_strupper(entryname); */ + ext = strrchr(entryname, '.'); + if (ext == NULL) + ext = ""; + else { + /* replace the dot with NUL, + so entryname is without extension */ + *ext++ = '\0'; + if (ext[0] != '\0' && ext[1] != '\0' && ext[2] != '\0' && ext[3] != '\0') { + ext[2] = '+'; + ext[3] = '\0'; + } + } + if (strlen(entryname) > 8) { + entryname[7] = '+'; + entryname[8] = '\0'; + } + if (aux2 >= 128) { + if (isdir) + fprintf(fp, "%-13s %s\n", entryname, timetext); + else { + if (size > 999999) + size = 999999; + fprintf(fp, "%-9s%-3s %6d %s\n", entryname, ext, size, timetext); + } + } + else { + char dirchar = ' '; + size = (size + 255) >> 8; + if (size > 999) + size = 999; + if (isdir) { + if (MEMORY_dGetByte(0x700) == 'M') /* MyDOS */ + dirchar = ':'; + else /* Sparta */ + ext = "\304\311\322"; /* "DIR" with bit 7 set */ + } + fprintf(fp, "%c%c%-8s%-3s %03d\n", readonly ? '*' : ' ', + dirchar, entryname, ext, size); + } + } + + if (aux2 >= 128) + fprintf(fp, " 999 FREE SECTORS\n"); + else + fprintf(fp, "999 FREE SECTORS\n"); + + Util_rewind(fp); + h_textmode[h_iocb] = TRUE; + CPU_regY = 1; + CPU_ClrN; + break; +#endif /* DO_DIR */ + case 8: /* write: "w" */ + case 9: /* write at end of file (append): "a" */ + case 12: /* write and read (update): "r+" || "w+" */ + case 13: /* append and read: "a+" */ + if (Devices_h_read_only) { + CPU_regY = 163; /* disk write-protected */ + CPU_SetN; + break; + } + { + char mode[4]; + char *p = mode + 1; + mode[0] = (aux1 & 1) ? 'a' : (aux1 < 12) ? 'w' : 'r'; + if (!h_textmode[h_iocb]) + *p++ = 'b'; + if (aux1 >= 12) + *p++ = '+'; + *p = '\0'; + fp = Util_fopen(host_path, mode, h_tmpbuf[h_iocb]); + if (fp == NULL && aux1 == 12) { + mode[0] = 'w'; + fp = Util_fopen(host_path, mode, h_tmpbuf[h_iocb]); + } + } + if (fp != NULL) { + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 144; /* device done error */ + CPU_SetN; + } + break; + default: + CPU_regY = 168; /* invalid device command */ + CPU_SetN; + break; + } + h_fp[h_iocb] = fp; +} + +static void Devices_H_Close(void) +{ + if (devbug) + Log_print("HHCLOS"); + if (!Devices_GetIOCB()) + return; + if (h_fp[h_iocb] != NULL) { + Util_fclose(h_fp[h_iocb], h_tmpbuf[h_iocb]); + h_fp[h_iocb] = NULL; + } + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_H_Read(void) +{ + if (devbug) + Log_print("HHREAD"); + if (!Devices_GetIOCB()) + return; + if (h_fp[h_iocb] != NULL) { + int ch; + if (h_lastop[h_iocb] != 'r') { + if (h_lastop[h_iocb] == 'w') + fseek(h_fp[h_iocb], 0, SEEK_CUR); + h_lastbyte[h_iocb] = fgetc(h_fp[h_iocb]); + h_lastop[h_iocb] = 'r'; + } + ch = h_lastbyte[h_iocb]; + if (ch != EOF) { + if (h_textmode[h_iocb]) { + switch (ch) { + case 0x0d: + h_wascr[h_iocb] = TRUE; + ch = 0x9b; + break; + case 0x0a: + if (h_wascr[h_iocb]) { + /* ignore LF next to CR */ + ch = fgetc(h_fp[h_iocb]); + if (ch != EOF) { + if (ch == 0x0d) { + h_wascr[h_iocb] = TRUE; + ch = 0x9b; + } + else + h_wascr[h_iocb] = FALSE; + } + else { + CPU_regY = 136; /* end of file */ + CPU_SetN; + break; + } + } + else + ch = 0x9b; + break; + default: + h_wascr[h_iocb] = FALSE; + break; + } + } + CPU_regA = (UBYTE) ch; + /* [OSMAN] p. 79: Status should be 3 if next read would yield EOF. + But to set the stream's EOF flag, we need to read the next byte. */ + h_lastbyte[h_iocb] = fgetc(h_fp[h_iocb]); + CPU_regY = feof(h_fp[h_iocb]) ? 3 : 1; + CPU_ClrN; + } + else { + CPU_regY = 136; /* end of file */ + CPU_SetN; + } + } + else { + CPU_regY = 136; /* end of file; XXX: this seems to be what Atari DOSes return */ + CPU_SetN; + } +} + +static void Devices_H_Write(void) +{ + if (devbug) + Log_print("HHWRIT"); + if (!Devices_GetIOCB()) + return; + if (h_fp[h_iocb] != NULL) { + int ch; + if (h_lastop[h_iocb] == 'r') + fseek(h_fp[h_iocb], 0, SEEK_CUR); + h_lastop[h_iocb] = 'w'; + ch = CPU_regA; + if (ch == 0x9b && h_textmode[h_iocb]) + ch = '\n'; + fputc(ch, h_fp[h_iocb]); + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 135; /* attempted to write to a read-only device */ + /* XXX: this seems to be what Atari DOSes return */ + CPU_SetN; + } +} + +static void Devices_H_Status(void) +{ + if (devbug) + Log_print("HHSTAT"); + + CPU_regY = 146; /* function not implemented in handler; XXX: check file existence? */ + CPU_SetN; +} + +#define CHECK_READ_ONLY \ + if (Devices_h_read_only) { \ + CPU_regY = 163; \ + CPU_SetN; \ + return; \ + } + +#ifdef DO_RENAME + +static void fillin(const char *pattern, char *filename) +{ + const char *filename_end = filename + strlen(filename); + for (;;) { + switch (*pattern) { + case '\0': + *filename = '\0'; + return; + case '?': + pattern++; + if (filename < filename_end) + filename++; + break; + case '*': + if (filename >= filename_end || *filename == pattern[1]) + pattern++; + else + filename++; + break; + default: + *filename++ = *pattern++; + break; + } + } +} + +static void Devices_H_Rename(void) +{ + UWORD bufadr; + char c; + char *p; + int num_changed = 0; + int num_failed = 0; + int num_locked = 0; + int readonly = FALSE; + + if (devbug) + Log_print("RENAME Command"); + CHECK_READ_ONLY; + + bufadr = Devices_GetHostPath(FALSE); + if (bufadr == 0) + return; + /* skip space between filenames */ + for (;;) { + c = (char) MEMORY_dGetByte(bufadr); + if (Devices_IsValidForFilename(c)) + break; + if (c == '\0' || (UBYTE) c > 0x80 || IS_DIR_SEP(c)) { + CPU_regY = 165; /* bad filename */ + CPU_SetN; + return; + } + bufadr++; + } + /* get new filename */ + p = new_filename; + do { + if (p >= new_filename + sizeof(new_filename) - 1) { + CPU_regY = 165; /* bad filename */ + CPU_SetN; + return; + } + *p++ = c; + bufadr++; + c = (char) MEMORY_dGetByte(bufadr); + } while (Devices_IsValidForFilename(c)); + *p = '\0'; + +#ifdef DO_DIR + if (!Devices_OpenDir(host_path)) { + CPU_regY = 170; /* file not found */ + CPU_SetN; + return; + } + while (Devices_ReadDir(host_path, NULL, NULL, &readonly, NULL, NULL)) +#endif /* DO_DIR */ + { + /* Check file write permission to mimic Atari + permission system: read-only ("locked") file + cannot be renamed. */ + if (readonly) + num_locked++; + else { + char new_dirpart[FILENAME_MAX]; + char new_filepart[FILENAME_MAX]; + char new_path[FILENAME_MAX]; + /* split old filepath into dir part and file part */ + Util_splitpath(host_path, new_dirpart, new_filepart); + /* replace old file part with new file part */ + fillin(new_filename, new_filepart); + /* combine new filepath */ + Util_catpath(new_path, new_dirpart, new_filepart); + if (Devices_Rename(host_path, new_path)) + num_changed++; + else + num_failed++; + } + } + + if (devbug) + Log_print("%d renamed, %d failed, %d locked", + num_changed, num_failed, num_locked); + + if (num_locked) { + CPU_regY = 167; /* file locked */ + CPU_SetN; + } + else if (num_failed != 0 || num_changed == 0) { + CPU_regY = 170; /* file not found */ + CPU_SetN; + } + else { + CPU_regY = 1; + CPU_ClrN; + } +} + +#endif /* DO_RENAME */ + +#ifdef HAVE_UTIL_UNLINK + +static void Devices_H_Delete(void) +{ + int num_deleted = 0; + int num_failed = 0; + int num_locked = 0; + int readonly = FALSE; + + if (devbug) + Log_print("DELETE Command"); + CHECK_READ_ONLY; + + if (Devices_GetHostPath(FALSE) == 0) + return; + +#ifdef DO_DIR + if (!Devices_OpenDir(host_path)) { + CPU_regY = 170; /* file not found */ + CPU_SetN; + return; + } + while (Devices_ReadDir(host_path, NULL, NULL, &readonly, NULL, NULL)) +#endif /* DO_DIR */ + { + /* Check file write permission to mimic Atari + permission system: read-only ("locked") file + cannot be deleted. Modern systems have + a different permission for file deletion. */ + if (readonly) + num_locked++; + else + if (Util_unlink(host_path) == 0) + num_deleted++; + else + num_failed++; + } + + if (devbug) + Log_print("%d deleted, %d failed, %d locked", + num_deleted, num_failed, num_locked); + + if (num_locked) { + CPU_regY = 167; /* file locked */ + CPU_SetN; + } + else if (num_failed != 0 || num_deleted == 0) { + CPU_regY = 170; /* file not found */ + CPU_SetN; + } + else { + CPU_regY = 1; + CPU_ClrN; + } +} + +#endif /* HAVE_UTIL_UNLINK */ + +#ifdef DO_LOCK + +static void Devices_H_LockUnlock(int readonly) +{ + int num_changed = 0; + int num_failed = 0; + + CHECK_READ_ONLY; + + if (Devices_GetHostPath(FALSE) == 0) + return; + +#ifdef DO_DIR + if (!Devices_OpenDir(host_path)) { + CPU_regY = 170; /* file not found */ + CPU_SetN; + return; + } + while (Devices_ReadDir(host_path, NULL, NULL, NULL, NULL, NULL)) +#endif /* DO_DIR */ + { + if (Devices_SetReadOnly(host_path, readonly)) + num_changed++; + else + num_failed++; + } + + if (devbug) + Log_print("%d changed, %d failed", + num_changed, num_failed); + + if (num_failed != 0 || num_changed == 0) { + CPU_regY = 170; /* file not found */ + CPU_SetN; + } + else { + CPU_regY = 1; + CPU_ClrN; + } +} + +static void Devices_H_Lock(void) +{ + if (devbug) + Log_print("LOCK Command"); + Devices_H_LockUnlock(TRUE); +} + +static void Devices_H_Unlock(void) +{ + if (devbug) + Log_print("UNLOCK Command"); + Devices_H_LockUnlock(FALSE); +} + +#endif /* DO_LOCK */ + +static void Devices_H_Note(void) +{ + if (devbug) + Log_print("NOTE Command"); + if (!Devices_GetIOCB()) + return; + if (h_fp[h_iocb] != NULL) { + long pos = ftell(h_fp[h_iocb]); + if (pos >= 0) { + int iocb = Devices_IOCB0 + h_iocb * 16; + /* In Devices_H_Read one byte is read ahead. Take it into account. */ + if (h_lastop[h_iocb] == 'r' && h_lastbyte[h_iocb] != EOF) + --pos; + MEMORY_dPutByte(iocb + Devices_ICAX5, (UBYTE) pos); + MEMORY_dPutByte(iocb + Devices_ICAX3, (UBYTE) (pos >> 8)); + MEMORY_dPutByte(iocb + Devices_ICAX4, (UBYTE) (pos >> 16)); + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 144; /* device done error */ + CPU_SetN; + } + } + else { + CPU_regY = 130; /* specified device does not exist; XXX: correct? */ + CPU_SetN; + } +} + +static void Devices_H_Point(void) +{ + if (devbug) + Log_print("POINT Command"); + if (!Devices_GetIOCB()) + return; + if (h_fp[h_iocb] != NULL) { + int iocb = Devices_IOCB0 + h_iocb * 16; + long pos = (MEMORY_dGetByte(iocb + Devices_ICAX4) << 16) + + (MEMORY_dGetByte(iocb + Devices_ICAX3) << 8) + (MEMORY_dGetByte(iocb + Devices_ICAX5)); + if (fseek(h_fp[h_iocb], pos, SEEK_SET) == 0) { + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 166; /* invalid POINT request */ + CPU_SetN; + } + h_lastop[h_iocb] = 'p'; + } + else { + CPU_regY = 130; /* specified device does not exist; XXX: correct? */ + CPU_SetN; + } +} + +static FILE *binf = NULL; +static int runBinFile; +static int initBinFile; + +/* Read a word from file */ +static int Devices_H_BinReadWord(void) +{ + UBYTE buf[2]; + if (fread(buf, 1, 2, binf) != 2) { + fclose(binf); + binf = NULL; + if (BINLOAD_start_binloading) { + BINLOAD_start_binloading = FALSE; + Log_print("binload: not valid BIN file"); + CPU_regY = 180; /* MyDOS: not a binary file */ + CPU_SetN; + return -1; + } + if (runBinFile) + CPU_regPC = MEMORY_dGetWordAligned(0x2e0); + CPU_regY = 1; + CPU_ClrN; + return -1; + } + return buf[0] + (buf[1] << 8); +} + +static void Devices_H_BinLoaderCont(void) +{ + if (binf == NULL) + return; + if (BINLOAD_start_binloading) { + MEMORY_dPutByte(0x244, 0); + MEMORY_dPutByte(0x09, 1); + } + else + CPU_regS += 2; /* pop ESC code */ + + MEMORY_dPutByte(0x2e3, 0xd7); + do { + int temp; + UWORD from; + UWORD to; + do + temp = Devices_H_BinReadWord(); + while (temp == 0xffff); + if (temp < 0) + return; + from = (UWORD) temp; + + temp = Devices_H_BinReadWord(); + if (temp < 0) + return; + to = (UWORD) temp; + + if (devbug) + Log_print("H: Load: From %04X to %04X", from, to); + + if (BINLOAD_start_binloading) { + if (runBinFile) + MEMORY_dPutWordAligned(0x2e0, from); + BINLOAD_start_binloading = FALSE; + } + + to++; + do { + int byte = fgetc(binf); + if (byte == EOF) { + fclose(binf); + binf = NULL; + if (runBinFile) + CPU_regPC = MEMORY_dGetWordAligned(0x2e0); + if (initBinFile && (MEMORY_dGetByte(0x2e3) != 0xd7)) { + /* run INIT routine which RTSes directly to RUN routine */ + CPU_regPC--; + MEMORY_dPutByte(0x0100 + CPU_regS--, CPU_regPC >> 8); /* high */ + MEMORY_dPutByte(0x0100 + CPU_regS--, CPU_regPC & 0xff); /* low */ + CPU_regPC = MEMORY_dGetWordAligned(0x2e2); + } + return; + } + MEMORY_PutByte(from, (UBYTE) byte); + from++; + } while (from != to); + } while (!initBinFile || MEMORY_dGetByte(0x2e3) == 0xd7); + + CPU_regS--; + ESC_Add((UWORD) (0x100 + CPU_regS), ESC_BINLOADER_CONT, Devices_H_BinLoaderCont); + CPU_regS--; + MEMORY_dPutByte(0x0100 + CPU_regS--, 0x01); /* high */ + MEMORY_dPutByte(0x0100 + CPU_regS, CPU_regS + 1); /* low */ + CPU_regS--; + CPU_regPC = MEMORY_dGetWordAligned(0x2e2); + CPU_SetC; + + MEMORY_dPutByte(0x0300, 0x31); /* for "Studio Dream" */ +} + +static void Devices_H_LoadProceed(int mydos) +{ + /* Log_print("MyDOS %d, AX1 %d, AX2 %d", mydos, MEMORY_dGetByte(Devices_ICAX1Z), MEMORY_dGetByte(Devices_ICAX2Z)); */ + if (mydos) { + switch (MEMORY_dGetByte(Devices_ICAX1Z) /* XXX: & 7 ? */) { + case 4: + runBinFile = TRUE; + initBinFile = TRUE; + break; + case 5: + runBinFile = TRUE; + initBinFile = FALSE; + break; + case 6: + runBinFile = FALSE; + initBinFile = TRUE; + break; + case 7: + default: + runBinFile = FALSE; + initBinFile = FALSE; + break; + } + } + else { + if (MEMORY_dGetByte(Devices_ICAX2Z) < 128) + runBinFile = TRUE; + else + runBinFile = FALSE; + initBinFile = TRUE; + } + + BINLOAD_start_binloading = TRUE; + Devices_H_BinLoaderCont(); +} + +static void Devices_H_Load(int mydos) +{ + const char *p; + UBYTE buf[2]; + if (devbug) + Log_print("LOAD Command"); + h_devnum = Devices_GetNumber(FALSE); + if (h_devnum < 0) + return; + + /* search for program on Devices_h_exe_path */ + for (p = Devices_h_exe_path; *p != '\0'; ) { + int devnum; + const char *q; + char *r; + if (p[0] == 'H' && p[1] >= '1' && p[1] <= '4' && p[2] == ':') { + devnum = p[1] - '1'; + p += 3; + } + else + devnum = h_devnum; + for (q = p; *q != '\0' && *q != ';'; q++); + r = atari_filename + (q - p); + if (q != p) { + memcpy(atari_filename, p, q - p); + if (!IS_DIR_SEP(q[-1])) + *r++ = '>'; + } + if (Devices_GetAtariPath(devnum, r) == 0) + return; + Util_catpath(host_path, Devices_atari_h_dir[devnum], atari_path); + binf = fopen(host_path, "rb"); + if (binf != NULL || *q == '\0') + break; + p = q + 1; + } + + if (binf == NULL) { + /* open from the specified location */ + if (Devices_GetAtariPath(h_devnum, atari_filename) == 0) + return; + Util_catpath(host_path, Devices_atari_h_dir[h_devnum], atari_path); + binf = fopen(host_path, "rb"); + if (binf == NULL) { + CPU_regY = 170; + CPU_SetN; + return; + } + } + + /* check header */ + if (fread(buf, 1, 2, binf) != 2 || buf[0] != 0xff || buf[1] != 0xff) { + fclose(binf); + binf = NULL; + Log_print("H: load: not valid BIN file"); + CPU_regY = 180; + CPU_SetN; + return; + } + + Devices_H_LoadProceed(mydos); +} + +static void Devices_H_FileLength(void) +{ + if (devbug) + Log_print("Get File Length Command"); + if (!Devices_GetIOCB()) + return; + /* if IOCB is closed then assume it is a MyDOS Load File command */ + if (h_fp[h_iocb] == NULL) + Devices_H_Load(TRUE); + /* if we are running MyDOS then assume it is a MyDOS Load File command */ + else if (MEMORY_dGetByte(0x700) == 'M') { + /* XXX: if (binf != NULL) fclose(binf); ? */ + + /* In Devices_H_Read one byte is read ahead. Take it into account. */ + if (h_lastop[h_iocb] == 'r' && h_lastbyte[h_iocb] != EOF) + fseek(h_fp[h_iocb], -1, SEEK_CUR); + + binf = h_fp[h_iocb]; + Devices_H_LoadProceed(TRUE); + /* XXX: don't close binf when complete? */ + h_lastop[h_iocb] = 'b'; + } + /* otherwise assume it is a file length command */ + else { + int iocb = Devices_IOCB0 + h_iocb * 16; + int filesize; +#if 0 + /* old, less portable implementation */ + struct stat fstatus; + fstat(fileno(h_fp[h_iocb]), &fstatus); + filesize = fstatus.st_size; +#else + FILE *fp = h_fp[h_iocb]; + long currentpos = ftell(fp); + filesize = Util_flen(fp); + fseek(fp, currentpos, SEEK_SET); +#endif + MEMORY_dPutByte(iocb + Devices_ICAX3, (UBYTE) filesize); + MEMORY_dPutByte(iocb + Devices_ICAX4, (UBYTE) (filesize >> 8)); + MEMORY_dPutByte(iocb + Devices_ICAX5, (UBYTE) (filesize >> 16)); + CPU_regY = 1; + CPU_ClrN; + } +} + +#ifdef DO_MKDIR +static void Devices_H_MakeDirectory(void) +{ + if (devbug) + Log_print("MKDIR Command"); + CHECK_READ_ONLY; + + if (Devices_GetHostPath(FALSE) == 0) + return; + + if (Devices_MakeDirectory(host_path)) { + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 144; /* device done error */ + CPU_SetN; + } +} +#endif + +#ifdef DO_RMDIR +static void Devices_H_RemoveDirectory(void) +{ + if (devbug) + Log_print("RMDIR Command"); + CHECK_READ_ONLY; + + if (Devices_GetHostPath(FALSE) == 0) + return; + + CPU_regY = Devices_RemoveDirectory(host_path); + if (CPU_regY >= 128) + CPU_SetN; + else + CPU_ClrN; +} +#endif + +static void Devices_H_ChangeDirectory(void) +{ + if (devbug) + Log_print("CD Command"); + + if (Devices_GetHostPath(FALSE) == 0) + return; + + if (!Util_direxists(host_path)) { + CPU_regY = 150; + CPU_SetN; + return; + } + + if (atari_path[0] == '\0') + Devices_h_current_dir[h_devnum][0] = '\0'; + else { + char *p = Util_stpcpy(Devices_h_current_dir[h_devnum], atari_path); + p[0] = Util_DIR_SEP_CHAR; + p[1] = '\0'; + } + + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_H_DiskInfo(void) +{ + static UBYTE info[16] = { + 0x20, /* disk version: Sparta >= 2.0 */ + 0x00, /* sector size: 0x100 */ + 0xff, 0xff, /* total sectors: 0xffff */ + 0xff, 0xff, /* free sectors: 0xffff */ + 'H', 'D', 'I', 'S', 'K', '1' /* + devnum */, ' ', ' ', /* disk name */ + 1, /* seq. number (number of writes) */ + 1 /* + devnum */ /* random number (disk id) */ + }; + int devnum; + + if (devbug) + Log_print("Get Disk Information Command"); + + devnum = Devices_GetNumber(FALSE); + if (devnum < 0) + return; + + info[11] = (UBYTE) ('1' + devnum); + info[15] = (UBYTE) (1 + devnum); + MEMORY_CopyToMem(info, (UWORD) MEMORY_dGetWordAligned(Devices_ICBLLZ), 16); + + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_H_ToAbsolutePath(void) +{ + UWORD bufadr; + const char *p; + + if (devbug) + Log_print("To Absolute Path Command"); + + if (Devices_GetHostPath(FALSE) == 0) + return; + + /* XXX: we sometimes check here for directories + with a trailing Util_DIR_SEP_CHAR. It seems to work on Win32 and DJGPP. */ + if (!Util_direxists(host_path)) { + CPU_regY = 150; + CPU_SetN; + return; + } + + bufadr = MEMORY_dGetWordAligned(Devices_ICBLLZ); + if (atari_path[0] != '\0') { + MEMORY_PutByte(bufadr, '>'); + bufadr++; + for (p = atari_path; *p != '\0'; p++) { + if (*p == Util_DIR_SEP_CHAR) { + if (p[1] == '\0') + break; + MEMORY_PutByte(bufadr, '>'); + } + else + MEMORY_PutByte(bufadr, (UBYTE) *p); + bufadr++; + } + } + MEMORY_PutByte(bufadr, 0x00); + + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_H_Special(void) +{ + if (devbug) + Log_print("HHSPEC"); + + switch (MEMORY_dGetByte(Devices_ICCOMZ)) { +#ifdef DO_RENAME + case 0x20: + Devices_H_Rename(); + return; +#endif +#ifdef HAVE_UTIL_UNLINK + case 0x21: + Devices_H_Delete(); + return; +#endif +#ifdef DO_LOCK + case 0x23: + Devices_H_Lock(); + return; + case 0x24: + Devices_H_Unlock(); + return; +#endif + case 0x26: + Devices_H_Note(); + return; + case 0x25: + Devices_H_Point(); + return; + case 0x27: /* Sparta, MyDOS=Load */ + Devices_H_FileLength(); + return; + case 0x28: /* Sparta */ + Devices_H_Load(FALSE); + return; +#ifdef DO_MKDIR + case 0x22: /* MyDOS */ + case 0x2a: /* MyDOS, Sparta */ + Devices_H_MakeDirectory(); + return; +#endif +#ifdef DO_RMDIR + case 0x2b: /* Sparta */ + Devices_H_RemoveDirectory(); + return; +#endif + case 0x29: /* MyDOS */ + case 0x2c: /* Sparta */ + Devices_H_ChangeDirectory(); + return; + case 0x2f: /* Sparta */ + Devices_H_DiskInfo(); + return; + case 0x30: /* Sparta */ + Devices_H_ToAbsolutePath(); + return; + case 0xfe: + if (devbug) + Log_print("FORMAT Command"); + break; + default: + if (devbug) + Log_print("UNKNOWN Command %02X", MEMORY_dGetByte(Devices_ICCOMZ)); + break; + } + + CPU_regY = 168; /* invalid device command */ + CPU_SetN; +} + + +/* P: device emulation --------------------------------------------------- */ + +char Devices_print_command[256] = "lpr %s"; + +int Devices_SetPrintCommand(const char *command) +{ + const char *p = command; + int was_percent_s = FALSE; + while (*p != '\0') { + if (*p++ == '%') { + char c = *p++; + if (c == '%') + continue; /* %% is safe */ + if (c == 's' && !was_percent_s) { + was_percent_s = TRUE; /* only one %s is safe */ + continue; + } + return FALSE; + } + } + strcpy(Devices_print_command, command); + return TRUE; +} + +#ifdef HAVE_SYSTEM + +static FILE *phf = NULL; +static char spool_file[FILENAME_MAX]; + +static void Devices_P_Close(void) +{ + if (devbug) + Log_print("PHCLOS"); + + if (phf != NULL) { + fclose(phf); + phf = NULL; + +#ifdef __PLUS + if (!Misc_ExecutePrintCmd(spool_file)) +#endif + { + char command[256 + FILENAME_MAX]; /* 256 for Devices_print_command + FILENAME_MAX for spool_file */ + int retval; + sprintf(command, Devices_print_command, spool_file); + if ((retval = system(command)) == -1) + Log_print("Print command \"%s\' failed", command); +#if defined(HAVE_UTIL_UNLINK) && !defined(VMS) && !defined(MACOSX) + if (Util_unlink(spool_file) != 0) { + perror(spool_file); + } +#endif + } + } + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_P_Open(void) +{ + if (devbug) + Log_print("PHOPEN"); + + if (phf != NULL) + Devices_P_Close(); + + phf = Util_uniqopen(spool_file, "w"); + if (phf != NULL) { + CPU_regY = 1; + CPU_ClrN; + } + else { + CPU_regY = 144; /* device done error */ + CPU_SetN; + } +} + +static void Devices_P_Write(void) +{ + UBYTE byte; + + if (devbug) + Log_print("PHWRIT"); + + byte = CPU_regA; + if (byte == 0x9b) + byte = '\n'; + + fputc(byte, phf); + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_P_Status(void) +{ + if (devbug) + Log_print("PHSTAT"); +} + +static void Devices_P_Init(void) +{ + if (devbug) + Log_print("PHINIT"); + + if (phf != NULL) { + fclose(phf); + phf = NULL; +#ifdef HAVE_UTIL_UNLINK + Util_unlink(spool_file); +#endif + } + CPU_regY = 1; + CPU_ClrN; +} + +#endif /* HAVE_SYSTEM */ + + +/* K: and E: handlers for BASIC version, using getchar() and putchar() --- */ + +#ifdef BASIC + +static void Devices_E_Read(void) +{ + int ch; + + ch = getchar(); + switch (ch) { + case EOF: + Atari800_Exit(FALSE); + exit(0); + break; + case '\n': + ch = 0x9b; + break; + default: + break; + } + CPU_regA = (UBYTE) ch; + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_E_Write(void) +{ + UBYTE ch; + + ch = CPU_regA; + /* XXX: are '\f', '\b' and '\a' fully portable? */ + switch (ch) { + case 0x7d: /* Clear Screen */ + putchar('\x0c'); /* ASCII Form Feed */ + break; + case 0x7e: + putchar('\x08'); /* ASCII Backspace */ + break; + case 0x7f: + putchar('\t'); + break; + case 0x9b: + putchar('\n'); + break; + case 0xfd: + putchar('\x07'); /* ASCII Bell */ + break; + default: + if ((ch >= 0x20) && (ch <= 0x7e)) + putchar(ch); + break; + } + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_K_Read(void) +{ + int ch; + int ch2; + + ch = getchar(); + switch (ch) { + case EOF: + Atari800_Exit(FALSE); + exit(0); + break; + case '\n': + ch = 0x9b; + break; + default: + /* ignore characters until EOF or EOL */ + do + ch2 = getchar(); + while (ch2 != EOF && ch2 != '\n'); + break; + } + CPU_regA = (UBYTE) ch; + CPU_regY = 1; + CPU_ClrN; +} + +#endif /* BASIC */ + +/* B: device emulation --------------------------------------------------- */ + +/* The B: device is intended as a handler for interoperating with a web browser. + * The device is OPENed, a url is WRITE-n, then it is CLOSEd. + * Upon closing, the ready flag in the structure is set to TRUE. + * This can tested by the host port, reset to FALSE then if the string contained + * in the url member looks like a url, a browser to can be spawned to that url. + * The user can also be notified via a popup that an Atari program is requesting + * browser access. + */ + +struct DEV_B dev_b_status; + +static void Devices_B_Open(void) +{ + if (devbug) + Log_print("B: OPEN"); + + if (MEMORY_dGetByte(Devices_ICAX1Z) != 8) { + CPU_regY = 163; /* read-only device */ + CPU_SetN; + return; + } + + memset(dev_b_status.url, 0, sizeof(dev_b_status.url)); + dev_b_status.pos = 0; + dev_b_status.ready = FALSE; + + CPU_regY = 1; /* open OK */ + CPU_ClrN; +} + +static void Devices_B_Close(void) +{ + if (devbug) + Log_print("B: CLOSE (%s)", dev_b_status.url); + + if (dev_b_status.pos > 0) + dev_b_status.ready = TRUE; + + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_B_Write(void) +{ + UBYTE byte; + + byte = CPU_regA; + + if (devbug) + Log_print("B: WRITE ([%d] %02X, '%c')", dev_b_status.pos, byte, byte); + + if (byte == 0x9b) + byte = '\0'; + + if (dev_b_status.pos >= sizeof(dev_b_status.url) - 1) { + CPU_regY = 135; /* attempted to write to a read-only device */ + CPU_SetN; + return; + } + dev_b_status.url[dev_b_status.pos++] = byte; + + CPU_regY = 1; + CPU_ClrN; +} + +static void Devices_B_Null(void) +{ + if (devbug) + Log_print("B: NULL"); +} + +static void Devices_B_Read(void) +{ + if (devbug) + Log_print("B: READ"); + + CPU_regY = 136; /* end of file */ + CPU_SetN; +} + +static void Devices_B_Init(void) +{ + if (devbug) + Log_print("B: INIT"); + + CPU_regY = 1; + CPU_ClrN; +} + + +/* Atari BASIC loader ---------------------------------------------------- */ + +static UWORD ehopen_addr = 0; +static UWORD ehclos_addr = 0; +static UWORD ehread_addr = 0; +static UWORD ehwrit_addr = 0; + +static void Devices_IgnoreReady(void); +static void Devices_GetBasicCommand(void); +static void Devices_OpenBasicFile(void); +static void Devices_ReadBasicFile(void); +static void Devices_CloseBasicFile(void); + +static void Devices_RestoreHandler(UWORD address, UBYTE esc_code) +{ + ESC_Remove(esc_code); + /* restore original OS code */ + MEMORY_dCopyToMem(MEMORY_os - (Atari800_machine_type == Atari800_MACHINE_800 + ? 0xd800 + : 0xc000) + address, + address, 3); +} + +static void Devices_RestoreEHOPEN(void) +{ + Devices_RestoreHandler(ehopen_addr, ESC_EHOPEN); +} + +static void Devices_RestoreEHCLOS(void) +{ + Devices_RestoreHandler(ehclos_addr, ESC_EHCLOS); +} + +#ifndef BASIC + +static void Devices_RestoreEHREAD(void) +{ + Devices_RestoreHandler(ehread_addr, ESC_EHREAD); +} + +static void Devices_RestoreEHWRIT(void) +{ + Devices_RestoreHandler(ehwrit_addr, ESC_EHWRIT); +} + +static void Devices_InstallIgnoreReady(void) +{ + ESC_AddEscRts(ehwrit_addr, ESC_EHWRIT, Devices_IgnoreReady); +} + +#endif + +/* Atari Basic loader step 1: ignore "READY" printed on E: after booting */ +/* or step 6: ignore "READY" printed on E: after the "ENTER" command */ + +static const UBYTE * const ready_prompt = (const UBYTE *) "\x9bREADY\x9b"; + +static const UBYTE *ready_ptr = NULL; + +static const UBYTE *basic_command_ptr = NULL; + +static void Devices_IgnoreReady(void) +{ + if (ready_ptr != NULL && CPU_regA == *ready_ptr) { + ready_ptr++; + if (*ready_ptr == '\0') { + ready_ptr = NULL; + /* uninstall patch */ +#ifdef BASIC + ESC_AddEscRts(ehwrit_addr, ESC_EHWRIT, Devices_E_Write); +#else + CPU_rts_handler = Devices_RestoreEHWRIT; +#endif + if (BINLOAD_loading_basic == BINLOAD_LOADING_BASIC_SAVED) { + basic_command_ptr = (const UBYTE *) "RUN \"E:\"\x9b"; + ESC_AddEscRts(ehread_addr, ESC_EHREAD, Devices_GetBasicCommand); + } + else if (BINLOAD_loading_basic == BINLOAD_LOADING_BASIC_LISTED) { + basic_command_ptr = (const UBYTE *) "ENTER \"E:\"\x9b"; + ESC_AddEscRts(ehread_addr, ESC_EHREAD, Devices_GetBasicCommand); + } + else if (BINLOAD_loading_basic == BINLOAD_LOADING_BASIC_RUN) { + basic_command_ptr = (const UBYTE *) "RUN\x9b"; + ESC_AddEscRts(ehread_addr, ESC_EHREAD, Devices_GetBasicCommand); + } + } + CPU_regY = 1; + CPU_ClrN; + return; + } + /* not "READY" (maybe "BOOT ERROR" or a DOS message) */ + if (BINLOAD_loading_basic == BINLOAD_LOADING_BASIC_RUN) { + /* don't "RUN" if no "READY" (probably "ERROR") */ + BINLOAD_loading_basic = 0; + ready_ptr = NULL; + } + if (ready_ptr != NULL) { + /* If ready_ptr != ready_prompt then we skipped some characters + from ready_prompt, which weren't part of full ready_prompt. + Well, they probably weren't that important. :-) */ + ready_ptr = ready_prompt; + } + /* call original handler */ +#ifdef BASIC + Devices_E_Write(); +#else + CPU_rts_handler = Devices_InstallIgnoreReady; + Devices_RestoreEHWRIT(); + CPU_regPC = ehwrit_addr; +#endif +} + +/* Atari Basic loader step 2: type command to load file from E: */ +/* or step 7: type "RUN" for ENTERed program */ + +static void Devices_GetBasicCommand(void) +{ + if (basic_command_ptr != NULL) { + CPU_regA = *basic_command_ptr++; + CPU_regY = 1; + CPU_ClrN; + if (*basic_command_ptr != '\0') + return; + if (BINLOAD_loading_basic == BINLOAD_LOADING_BASIC_SAVED || BINLOAD_loading_basic == BINLOAD_LOADING_BASIC_LISTED) + ESC_AddEscRts(ehopen_addr, ESC_EHOPEN, Devices_OpenBasicFile); + basic_command_ptr = NULL; + } +#ifdef BASIC + ESC_AddEscRts(ehread_addr, ESC_EHREAD, Devices_E_Read); +#else + CPU_rts_handler = Devices_RestoreEHREAD; +#endif +} + +/* Atari Basic loader step 3: open file */ + +static void Devices_OpenBasicFile(void) +{ + if (BINLOAD_bin_file != NULL) { + fseek(BINLOAD_bin_file, 0, SEEK_SET); + ESC_AddEscRts(ehclos_addr, ESC_EHCLOS, Devices_CloseBasicFile); + ESC_AddEscRts(ehread_addr, ESC_EHREAD, Devices_ReadBasicFile); + CPU_regY = 1; + CPU_ClrN; + } + CPU_rts_handler = Devices_RestoreEHOPEN; +} + +/* Atari Basic loader step 4: read byte */ + +static void Devices_ReadBasicFile(void) +{ + if (BINLOAD_bin_file != NULL) { + int ch = fgetc(BINLOAD_bin_file); + if (ch == EOF) { + CPU_regY = 136; + CPU_SetN; + return; + } + switch (BINLOAD_loading_basic) { + case BINLOAD_LOADING_BASIC_LISTED: + switch (ch) { + case 0x9b: + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_LISTED_ATARI; + break; + case 0x0a: + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_LISTED_LF; + ch = 0x9b; + break; + case 0x0d: + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_LISTED_CR_OR_CRLF; + ch = 0x9b; + break; + default: + break; + } + break; + case BINLOAD_LOADING_BASIC_LISTED_CR: + if (ch == 0x0d) + ch = 0x9b; + break; + case BINLOAD_LOADING_BASIC_LISTED_LF: + if (ch == 0x0a) + ch = 0x9b; + break; + case BINLOAD_LOADING_BASIC_LISTED_CRLF: + if (ch == 0x0a) { + ch = fgetc(BINLOAD_bin_file); + if (ch == EOF) { + CPU_regY = 136; + CPU_SetN; + return; + } + } + if (ch == 0x0d) + ch = 0x9b; + break; + case BINLOAD_LOADING_BASIC_LISTED_CR_OR_CRLF: + if (ch == 0x0a) { + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_LISTED_CRLF; + ch = fgetc(BINLOAD_bin_file); + if (ch == EOF) { + CPU_regY = 136; + CPU_SetN; + return; + } + } + else + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_LISTED_CR; + if (ch == 0x0d) + ch = 0x9b; + break; + case BINLOAD_LOADING_BASIC_SAVED: + case BINLOAD_LOADING_BASIC_LISTED_ATARI: + default: + break; + } + CPU_regA = (UBYTE) ch; + CPU_regY = 1; + CPU_ClrN; + } +} + +/* Atari Basic loader step 5: close file */ + +static void Devices_CloseBasicFile(void) +{ + if (BINLOAD_bin_file != NULL) { + fclose(BINLOAD_bin_file); + BINLOAD_bin_file = NULL; + /* "RUN" ENTERed program */ + if (BINLOAD_loading_basic != 0 && BINLOAD_loading_basic != BINLOAD_LOADING_BASIC_SAVED) { + ready_ptr = ready_prompt; + ESC_AddEscRts(ehwrit_addr, ESC_EHWRIT, Devices_IgnoreReady); + BINLOAD_loading_basic = BINLOAD_LOADING_BASIC_RUN; + } + else + BINLOAD_loading_basic = 0; + } +#ifdef BASIC + ESC_AddEscRts(ehread_addr, ESC_EHREAD, Devices_E_Read); +#else + Devices_RestoreEHREAD(); +#endif + CPU_rts_handler = Devices_RestoreEHCLOS; + CPU_regY = 1; + CPU_ClrN; +} + + +/* Patches management ---------------------------------------------------- */ + +int Devices_enable_h_patch = TRUE; +int Devices_enable_p_patch = TRUE; +int Devices_enable_r_patch = FALSE; +int Devices_enable_b_patch = FALSE; + +/* Devices_PatchOS is called by ESC_PatchOS to modify standard device + handlers in Atari OS. It puts escape codes at beginnings of OS routines, + so the patches work even if they are called directly, without CIO. + Returns TRUE if something has been patched. + Currently we only patch P: and, in BASIC version, E: and K:. + We don't replace C: with H: now, so the cassette works even + if H: is enabled. +*/ +int Devices_PatchOS(void) +{ + UWORD addr; + int i; + int patched = FALSE; + + switch (Atari800_os_version) { + case SYSROM_A_NTSC: + case SYSROM_A_PAL: + case SYSROM_B_NTSC: + case SYSROM_800_CUSTOM: + addr = 0xf0e3; + break; + case SYSROM_AA00R10: + addr = 0xc4fa; + break; + case SYSROM_AA01R11: + addr = 0xc479; + break; + case SYSROM_BB00R1: + addr = 0xc43c; + break; + case SYSROM_BB01R2: + case SYSROM_BB01R3: + case SYSROM_BB01R4_OS: + case SYSROM_BB01R59: + case SYSROM_BB01R59A: + case SYSROM_XL_CUSTOM: + addr = 0xc42e; + break; + case SYSROM_BB02R3: + addr = 0xc42c; + break; + case SYSROM_BB02R3V4: + addr = 0xc43b; + break; + case SYSROM_CC01R4: + addr = 0xc3eb; + break; + default: + return FALSE; + } + + for (i = 0; i < 5; i++) { + UWORD devtab = MEMORY_dGetWord(addr + 1); + switch (MEMORY_dGetByte(addr)) { +#ifdef HAVE_SYSTEM + case 'P': + if (Devices_enable_p_patch) { + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_OPEN) + 1), + ESC_PHOPEN, Devices_P_Open); + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_CLOS) + 1), + ESC_PHCLOS, Devices_P_Close); + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_WRIT) + 1), + ESC_PHWRIT, Devices_P_Write); + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_STAT) + 1), + ESC_PHSTAT, Devices_P_Status); + ESC_AddEscRts2((UWORD) (devtab + Devices_TABLE_INIT), ESC_PHINIT, + Devices_P_Init); + patched = TRUE; + } + else { + ESC_Remove(ESC_PHOPEN); + ESC_Remove(ESC_PHCLOS); + ESC_Remove(ESC_PHWRIT); + ESC_Remove(ESC_PHSTAT); + ESC_Remove(ESC_PHINIT); + } + break; +#endif + + case 'E': + if (BINLOAD_loading_basic) { + ehopen_addr = MEMORY_dGetWord(devtab + Devices_TABLE_OPEN) + 1; + ehclos_addr = MEMORY_dGetWord(devtab + Devices_TABLE_CLOS) + 1; + ehread_addr = MEMORY_dGetWord(devtab + Devices_TABLE_READ) + 1; + ehwrit_addr = MEMORY_dGetWord(devtab + Devices_TABLE_WRIT) + 1; + ready_ptr = ready_prompt; + ESC_AddEscRts(ehwrit_addr, ESC_EHWRIT, Devices_IgnoreReady); + patched = TRUE; + } +#ifdef BASIC + else + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_WRIT) + 1), + ESC_EHWRIT, Devices_E_Write); + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_READ) + 1), + ESC_EHREAD, Devices_E_Read); + patched = TRUE; + break; + case 'K': + ESC_AddEscRts((UWORD) (MEMORY_dGetWord(devtab + Devices_TABLE_READ) + 1), + ESC_KHREAD, Devices_K_Read); + patched = TRUE; + break; +#endif + default: + break; + } + addr += 3; /* Next Device in HATABS */ + } + return patched; +} + +/* New handling of H: device. + Previously we simply replaced C: device in OS with our H:. + Now we don't change ROM for H: patch, but add H: to HATABS in RAM + and put the device table and patches in unused address space + (0xd100-0xd1ff), which is meant for 'new devices' (like hard disk). + We have to continuously check if our H: is still in HATABS, + because RESET routine in Atari OS clears HATABS and initializes it + using a table in ROM (see Devices_PatchOS). + Before we put H: entry in HATABS, we must make sure that HATABS is there. + For example a program that doesn't use Atari OS can use this memory area + for its own data, and we shouldn't place 'H' there. + We also allow an Atari program to change address of H: device table. + So after we put H: entry in HATABS, we only check if 'H' is still where + we put it (h_entry_address). + Devices_UpdateHATABSEntry and Devices_RemoveHATABSEntry can be used to add + other devices than H:. */ + +#define HATABS 0x31a + +UWORD Devices_UpdateHATABSEntry(char device, UWORD entry_address, + UWORD table_address) +{ + UWORD address; + if (entry_address != 0 && MEMORY_dGetByte(entry_address) == device) + return entry_address; + if (MEMORY_dGetByte(HATABS) != 'P' || MEMORY_dGetByte(HATABS + 3) != 'C' + || MEMORY_dGetByte(HATABS + 6) != 'E' || MEMORY_dGetByte(HATABS + 9) != 'S' + || MEMORY_dGetByte(HATABS + 12) != 'K') + return entry_address; + for (address = HATABS + 15; address < HATABS + 33; address += 3) { + if (MEMORY_dGetByte(address) == device) + return address; + if (MEMORY_dGetByte(address) == 0) { + MEMORY_dPutByte(address, device); + MEMORY_dPutWord(address + 1, table_address); + return address; + } + } + /* HATABS full */ + return entry_address; +} + +void Devices_RemoveHATABSEntry(char device, UWORD entry_address, + UWORD table_address) +{ + if (entry_address != 0 && MEMORY_dGetByte(entry_address) == device + && MEMORY_dGetWord(entry_address + 1) == table_address) { + MEMORY_dPutByte(entry_address, 0); + MEMORY_dPutWord(entry_address + 1, 0); + } +} + +static UWORD h_entry_address = 0; +#ifdef R_IO_DEVICE +static UWORD r_entry_address = 0; +#endif +static UWORD b_entry_address = 0; + +#define H_DEVICE_BEGIN 0xd140 +#define H_TABLE_ADDRESS 0xd140 +#define H_PATCH_OPEN 0xd150 +#define H_PATCH_CLOS 0xd153 +#define H_PATCH_READ 0xd156 +#define H_PATCH_WRIT 0xd159 +#define H_PATCH_STAT 0xd15c +#define H_PATCH_SPEC 0xd15f +#define H_DEVICE_END 0xd161 + +#ifdef R_IO_DEVICE +#define R_DEVICE_BEGIN 0xd180 +#define R_TABLE_ADDRESS 0xd180 +#define R_PATCH_OPEN 0xd1a0 +#define R_PATCH_CLOS 0xd1a3 +#define R_PATCH_READ 0xd1a6 +#define R_PATCH_WRIT 0xd1a9 +#define R_PATCH_STAT 0xd1ac +#define R_PATCH_SPEC 0xd1af +#define R_PATCH_INIT 0xd1b3 +#define R_DEVICE_END 0xd1b5 +#endif + +#define B_DEVICE_BEGIN 0xd1c0 +#define B_TABLE_ADDRESS 0xd1c0 +#define B_PATCH_OPEN 0xd1d0 +#define B_PATCH_CLOS 0xd1d3 +#define B_PATCH_READ 0xd1d6 +#define B_PATCH_WRIT 0xd1d9 +#define B_PATCH_STAT 0xd1dc +#define B_PATCH_SPEC 0xd1df +#define B_PATCH_INIT 0xd1e3 +#define B_DEVICE_END 0xd1e5 + +void Devices_Frame(void) +{ + if (Devices_enable_h_patch) + h_entry_address = Devices_UpdateHATABSEntry('H', h_entry_address, H_TABLE_ADDRESS); + +#ifdef R_IO_DEVICE + if (Devices_enable_r_patch) + r_entry_address = Devices_UpdateHATABSEntry('R', r_entry_address, R_TABLE_ADDRESS); +#endif + + if (Devices_enable_b_patch) + b_entry_address = Devices_UpdateHATABSEntry('B', b_entry_address, B_TABLE_ADDRESS); +} + +/* this is called when Devices_enable_h_patch is toggled */ +void Devices_UpdatePatches(void) +{ + if (Devices_enable_h_patch) { /* enable H: device */ + /* change memory attributes for the area, where we put + the H: handler table and patches */ + MEMORY_SetROM(H_DEVICE_BEGIN, H_DEVICE_END); + /* set handler table */ + MEMORY_dPutWord(H_TABLE_ADDRESS + Devices_TABLE_OPEN, H_PATCH_OPEN - 1); + MEMORY_dPutWord(H_TABLE_ADDRESS + Devices_TABLE_CLOS, H_PATCH_CLOS - 1); + MEMORY_dPutWord(H_TABLE_ADDRESS + Devices_TABLE_READ, H_PATCH_READ - 1); + MEMORY_dPutWord(H_TABLE_ADDRESS + Devices_TABLE_WRIT, H_PATCH_WRIT - 1); + MEMORY_dPutWord(H_TABLE_ADDRESS + Devices_TABLE_STAT, H_PATCH_STAT - 1); + MEMORY_dPutWord(H_TABLE_ADDRESS + Devices_TABLE_SPEC, H_PATCH_SPEC - 1); + /* set patches */ + ESC_AddEscRts(H_PATCH_OPEN, ESC_HHOPEN, Devices_H_Open); + ESC_AddEscRts(H_PATCH_CLOS, ESC_HHCLOS, Devices_H_Close); + ESC_AddEscRts(H_PATCH_READ, ESC_HHREAD, Devices_H_Read); + ESC_AddEscRts(H_PATCH_WRIT, ESC_HHWRIT, Devices_H_Write); + ESC_AddEscRts(H_PATCH_STAT, ESC_HHSTAT, Devices_H_Status); + ESC_AddEscRts(H_PATCH_SPEC, ESC_HHSPEC, Devices_H_Special); + /* H: in HATABS will be added next frame by Devices_Frame */ + } + else { /* disable H: device */ + /* remove H: entry from HATABS */ + Devices_RemoveHATABSEntry('H', h_entry_address, H_TABLE_ADDRESS); + /* remove patches */ + ESC_Remove(ESC_HHOPEN); + ESC_Remove(ESC_HHCLOS); + ESC_Remove(ESC_HHREAD); + ESC_Remove(ESC_HHWRIT); + ESC_Remove(ESC_HHSTAT); + ESC_Remove(ESC_HHSPEC); + /* fill memory area used for table and patches with 0xff */ + MEMORY_dFillMem(H_DEVICE_BEGIN, 0xff, H_DEVICE_END - H_DEVICE_BEGIN + 1); + } + +#ifdef R_IO_DEVICE + if (Devices_enable_r_patch) { /* enable R: device */ + /* change memory attributes for the area, where we put + the R: handler table and patches */ + MEMORY_SetROM(R_DEVICE_BEGIN, R_DEVICE_END); + /* set handler table */ + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_OPEN, R_PATCH_OPEN - 1); + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_CLOS, R_PATCH_CLOS - 1); + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_READ, R_PATCH_READ - 1); + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_WRIT, R_PATCH_WRIT - 1); + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_STAT, R_PATCH_STAT - 1); + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_SPEC, R_PATCH_SPEC - 1); + MEMORY_dPutWord(R_TABLE_ADDRESS + Devices_TABLE_INIT, R_PATCH_INIT - 1); + /* set patches */ + ESC_AddEscRts(R_PATCH_OPEN, ESC_ROPEN, RDevice_OPEN); + ESC_AddEscRts(R_PATCH_CLOS, ESC_RCLOS, RDevice_CLOS); + ESC_AddEscRts(R_PATCH_READ, ESC_RREAD, RDevice_READ); + ESC_AddEscRts(R_PATCH_WRIT, ESC_RWRIT, RDevice_WRIT); + ESC_AddEscRts(R_PATCH_STAT, ESC_RSTAT, RDevice_STAT); + ESC_AddEscRts(R_PATCH_SPEC, ESC_RSPEC, RDevice_SPEC); + ESC_AddEscRts(R_PATCH_INIT, ESC_RINIT, RDevice_INIT); + /* R: in HATABS will be added next frame by Devices_Frame */ + } + else { /* disable R: device */ + /* remove R: entry from HATABS */ + Devices_RemoveHATABSEntry('R', r_entry_address, R_TABLE_ADDRESS); + /* remove patches */ + ESC_Remove(ESC_ROPEN); + ESC_Remove(ESC_RCLOS); + ESC_Remove(ESC_RREAD); + ESC_Remove(ESC_RWRIT); + ESC_Remove(ESC_RSTAT); + ESC_Remove(ESC_RSPEC); + /* fill memory area used for table and patches with 0xff */ + MEMORY_dFillMem(R_DEVICE_BEGIN, 0xff, R_DEVICE_END - R_DEVICE_BEGIN + 1); + } +#endif /* defined(R_IO_DEVICE) */ + + if (Devices_enable_b_patch) { + /* add B: device to HATABS */ + MEMORY_SetROM(B_DEVICE_BEGIN, B_DEVICE_END); + /* set handler table */ + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_OPEN, B_PATCH_OPEN - 1); + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_CLOS, B_PATCH_CLOS - 1); + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_READ, B_PATCH_READ - 1); + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_WRIT, B_PATCH_WRIT - 1); + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_STAT, B_PATCH_STAT - 1); + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_SPEC, B_PATCH_SPEC - 1); + MEMORY_dPutWord(B_TABLE_ADDRESS + Devices_TABLE_INIT, B_PATCH_INIT - 1); + /* set patches */ + ESC_AddEscRts(B_PATCH_OPEN, ESC_BOPEN, Devices_B_Open); + ESC_AddEscRts(B_PATCH_CLOS, ESC_BCLOS, Devices_B_Close); + ESC_AddEscRts(B_PATCH_READ, ESC_BREAD, Devices_B_Read); + ESC_AddEscRts(B_PATCH_WRIT, ESC_BWRIT, Devices_B_Write); + ESC_AddEscRts(B_PATCH_STAT, ESC_BSTAT, Devices_B_Null); + ESC_AddEscRts(B_PATCH_SPEC, ESC_BSPEC, Devices_B_Null); + ESC_AddEscRts(B_PATCH_INIT, ESC_BINIT, Devices_B_Init); + } + else { + /* remove B: entry from HATABS */ + Devices_RemoveHATABSEntry('B', b_entry_address, B_TABLE_ADDRESS); + /* remove patches */ + ESC_Remove(ESC_BOPEN); + ESC_Remove(ESC_BCLOS); + ESC_Remove(ESC_BREAD); + ESC_Remove(ESC_BWRIT); + ESC_Remove(ESC_BSTAT); + ESC_Remove(ESC_BSPEC); + /* fill memory area used for table and patches with 0xff */ + MEMORY_dFillMem(B_DEVICE_BEGIN, 0xff, B_DEVICE_END - B_DEVICE_BEGIN + 1); + } +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/devices.h b/PVAtari800/atari800-src/devices.h new file mode 100644 index 0000000000..9c707d17a0 --- /dev/null +++ b/PVAtari800/atari800-src/devices.h @@ -0,0 +1,85 @@ +#ifndef DEVICES_H_ +#define DEVICES_H_ + +#include /* FILENAME_MAX */ +#include "atari.h" /* UWORD */ + +int Devices_Initialise(int *argc, char *argv[]); +void Devices_Exit(void); +int Devices_PatchOS(void); +void Devices_Frame(void); +void Devices_UpdatePatches(void); + +UWORD Devices_SkipDeviceName(void); + +extern int Devices_enable_h_patch; +extern int Devices_enable_p_patch; +extern int Devices_enable_r_patch; +extern int Devices_enable_b_patch; + +extern char Devices_atari_h_dir[4][FILENAME_MAX]; +extern int Devices_h_read_only; + +extern char Devices_h_exe_path[FILENAME_MAX]; + +extern char Devices_h_current_dir[4][FILENAME_MAX]; + +int Devices_H_CountOpen(void); +void Devices_H_CloseAll(void); + +extern char Devices_print_command[256]; + +int Devices_SetPrintCommand(const char *command); + +struct DEV_B +{ + char url[512]; + int pos; + int ready; +}; +extern struct DEV_B dev_b_status; + + +#define Devices_ICHIDZ 0x0020 +#define Devices_ICDNOZ 0x0021 +#define Devices_ICCOMZ 0x0022 +#define Devices_ICSTAZ 0x0023 +#define Devices_ICBALZ 0x0024 +#define Devices_ICBAHZ 0x0025 +#define Devices_ICPTLZ 0x0026 +#define Devices_ICPTHZ 0x0027 +#define Devices_ICBLLZ 0x0028 +#define Devices_ICBLHZ 0x0029 +#define Devices_ICAX1Z 0x002a +#define Devices_ICAX2Z 0x002b + +#define Devices_IOCB0 0x0340 +#define Devices_ICHID 0x0000 +#define Devices_ICDNO 0x0001 +#define Devices_ICCOM 0x0002 +#define Devices_ICSTA 0x0003 +#define Devices_ICBAL 0x0004 +#define Devices_ICBAH 0x0005 +#define Devices_ICPTL 0x0006 +#define Devices_ICPTH 0x0007 +#define Devices_ICBLL 0x0008 +#define Devices_ICBLH 0x0009 +#define Devices_ICAX1 0x000a +#define Devices_ICAX2 0x000b +#define Devices_ICAX3 0x000c +#define Devices_ICAX4 0x000d +#define Devices_ICAX5 0x000e +#define Devices_ICAX6 0x000f + +#define Devices_TABLE_OPEN 0 +#define Devices_TABLE_CLOS 2 +#define Devices_TABLE_READ 4 +#define Devices_TABLE_WRIT 6 +#define Devices_TABLE_STAT 8 +#define Devices_TABLE_SPEC 10 +#define Devices_TABLE_INIT 12 + +UWORD Devices_UpdateHATABSEntry(char device, UWORD entry_address, UWORD table_address); +void Devices_RemoveHATABSEntry(char device, UWORD entry_address, UWORD table_address); + +#endif /* DEVICES_H_ */ diff --git a/PVAtari800/atari800-src/emuos.c b/PVAtari800/atari800-src/emuos.c new file mode 100644 index 0000000000..58a6fc7f8e --- /dev/null +++ b/PVAtari800/atari800-src/emuos.c @@ -0,0 +1,1054 @@ +/* + * emuos.c - OS bootstrapping ROM + * + * Copyright (C) 2012 Tomasz Krasuski + * Copyright (C) 2012 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "emuos.h" + +UBYTE const emuos_h[8192] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x00, + 0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00, + 0x00,0x66,0xff,0x66,0x66,0xff,0x66,0x00, + 0x18,0x3e,0x60,0x3c,0x06,0x7c,0x18,0x00, + 0x00,0x66,0x6c,0x18,0x30,0x66,0x46,0x00, + 0x1c,0x36,0x1c,0x38,0x6f,0x66,0x3b,0x00, + 0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00, + 0x00,0x0e,0x1c,0x18,0x18,0x1c,0x0e,0x00, + 0x00,0x70,0x38,0x18,0x18,0x38,0x70,0x00, + 0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00, + 0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30, + 0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00, + 0x00,0x06,0x0c,0x18,0x30,0x60,0x40,0x00, + 0x00,0x3c,0x66,0x6e,0x76,0x66,0x3c,0x00, + 0x00,0x18,0x38,0x18,0x18,0x18,0x7e,0x00, + 0x00,0x3c,0x66,0x0c,0x18,0x30,0x7e,0x00, + 0x00,0x7e,0x0c,0x18,0x0c,0x66,0x3c,0x00, + 0x00,0x0c,0x1c,0x3c,0x6c,0x7e,0x0c,0x00, + 0x00,0x7e,0x60,0x7c,0x06,0x66,0x3c,0x00, + 0x00,0x3c,0x60,0x7c,0x66,0x66,0x3c,0x00, + 0x00,0x7e,0x06,0x0c,0x18,0x30,0x30,0x00, + 0x00,0x3c,0x66,0x3c,0x66,0x66,0x3c,0x00, + 0x00,0x3c,0x66,0x3e,0x06,0x0c,0x38,0x00, + 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00, + 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30, + 0x06,0x0c,0x18,0x30,0x18,0x0c,0x06,0x00, + 0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00, + 0x60,0x30,0x18,0x0c,0x18,0x30,0x60,0x00, + 0x00,0x3c,0x66,0x0c,0x18,0x00,0x18,0x00, + 0x00,0x3c,0x66,0x6e,0x6e,0x60,0x3e,0x00, + 0x00,0x18,0x3c,0x66,0x66,0x7e,0x66,0x00, + 0x00,0x7c,0x66,0x7c,0x66,0x66,0x7c,0x00, + 0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x00, + 0x00,0x78,0x6c,0x66,0x66,0x6c,0x78,0x00, + 0x00,0x7e,0x60,0x7c,0x60,0x60,0x7e,0x00, + 0x00,0x7e,0x60,0x7c,0x60,0x60,0x60,0x00, + 0x00,0x3e,0x60,0x60,0x6e,0x66,0x3e,0x00, + 0x00,0x66,0x66,0x7e,0x66,0x66,0x66,0x00, + 0x00,0x7e,0x18,0x18,0x18,0x18,0x7e,0x00, + 0x00,0x06,0x06,0x06,0x06,0x66,0x3c,0x00, + 0x00,0x66,0x6c,0x78,0x78,0x6c,0x66,0x00, + 0x00,0x60,0x60,0x60,0x60,0x60,0x7e,0x00, + 0x00,0x63,0x77,0x7f,0x6b,0x63,0x63,0x00, + 0x00,0x66,0x76,0x7e,0x7e,0x6e,0x66,0x00, + 0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x00, + 0x00,0x7c,0x66,0x66,0x7c,0x60,0x60,0x00, + 0x00,0x3c,0x66,0x66,0x66,0x6c,0x36,0x00, + 0x00,0x7c,0x66,0x66,0x7c,0x6c,0x66,0x00, + 0x00,0x3c,0x60,0x3c,0x06,0x06,0x3c,0x00, + 0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x00, + 0x00,0x66,0x66,0x66,0x66,0x66,0x7e,0x00, + 0x00,0x66,0x66,0x66,0x66,0x3c,0x18,0x00, + 0x00,0x63,0x63,0x6b,0x7f,0x77,0x63,0x00, + 0x00,0x66,0x66,0x3c,0x3c,0x66,0x66,0x00, + 0x00,0x66,0x66,0x3c,0x18,0x18,0x18,0x00, + 0x00,0x7e,0x0c,0x18,0x30,0x60,0x7e,0x00, + 0x00,0x1e,0x18,0x18,0x18,0x18,0x1e,0x00, + 0x00,0x40,0x60,0x30,0x18,0x0c,0x06,0x00, + 0x00,0x78,0x18,0x18,0x18,0x18,0x78,0x00, + 0x00,0x08,0x1c,0x36,0x63,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00, + 0x00,0x36,0x7f,0x7f,0x3e,0x1c,0x08,0x00, + 0x18,0x18,0x18,0x1f,0x1f,0x18,0x18,0x18, + 0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03, + 0x18,0x18,0x18,0xf8,0xf8,0x00,0x00,0x00, + 0x18,0x18,0x18,0xf8,0xf8,0x18,0x18,0x18, + 0x00,0x00,0x00,0xf8,0xf8,0x18,0x18,0x18, + 0x03,0x07,0x0e,0x1c,0x38,0x70,0xe0,0xc0, + 0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x07,0x03, + 0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff, + 0x00,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f, + 0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff, + 0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00, + 0xf0,0xf0,0xf0,0xf0,0x00,0x00,0x00,0x00, + 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, + 0x00,0x00,0x00,0x00,0xf0,0xf0,0xf0,0xf0, + 0x00,0x1c,0x1c,0x77,0x77,0x08,0x1c,0x00, + 0x00,0x00,0x00,0x1f,0x1f,0x18,0x18,0x18, + 0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00, + 0x18,0x18,0x18,0xff,0xff,0x18,0x18,0x18, + 0x00,0x00,0x3c,0x7e,0x7e,0x7e,0x3c,0x00, + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, + 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0, + 0x00,0x00,0x00,0xff,0xff,0x18,0x18,0x18, + 0x18,0x18,0x18,0xff,0xff,0x00,0x00,0x00, + 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, + 0x18,0x18,0x18,0x1f,0x1f,0x00,0x00,0x00, + 0x78,0x60,0x78,0x60,0x7e,0x18,0x1e,0x00, + 0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x00, + 0x00,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00, + 0x00,0x18,0x30,0x7e,0x30,0x18,0x00,0x00, + 0x00,0x18,0x0c,0x7e,0x0c,0x18,0x00,0x00, + 0x00,0x18,0x3c,0x7e,0x7e,0x3c,0x18,0x00, + 0x00,0x00,0x3c,0x06,0x3e,0x66,0x3e,0x00, + 0x00,0x60,0x60,0x7c,0x66,0x66,0x7c,0x00, + 0x00,0x00,0x3c,0x60,0x60,0x60,0x3c,0x00, + 0x00,0x06,0x06,0x3e,0x66,0x66,0x3e,0x00, + 0x00,0x00,0x3c,0x66,0x7e,0x60,0x3c,0x00, + 0x00,0x0e,0x18,0x3e,0x18,0x18,0x18,0x00, + 0x00,0x00,0x3e,0x66,0x66,0x3e,0x06,0x7c, + 0x00,0x60,0x60,0x7c,0x66,0x66,0x66,0x00, + 0x00,0x18,0x00,0x38,0x18,0x18,0x3c,0x00, + 0x00,0x06,0x00,0x06,0x06,0x06,0x06,0x3c, + 0x00,0x60,0x60,0x6c,0x78,0x6c,0x66,0x00, + 0x00,0x38,0x18,0x18,0x18,0x18,0x3c,0x00, + 0x00,0x00,0x66,0x7f,0x7f,0x6b,0x63,0x00, + 0x00,0x00,0x7c,0x66,0x66,0x66,0x66,0x00, + 0x00,0x00,0x3c,0x66,0x66,0x66,0x3c,0x00, + 0x00,0x00,0x7c,0x66,0x66,0x7c,0x60,0x60, + 0x00,0x00,0x3e,0x66,0x66,0x3e,0x06,0x06, + 0x00,0x00,0x7c,0x66,0x60,0x60,0x60,0x00, + 0x00,0x00,0x3e,0x60,0x3c,0x06,0x7c,0x00, + 0x00,0x18,0x7e,0x18,0x18,0x18,0x0e,0x00, + 0x00,0x00,0x66,0x66,0x66,0x66,0x3e,0x00, + 0x00,0x00,0x66,0x66,0x66,0x3c,0x18,0x00, + 0x00,0x00,0x63,0x6b,0x7f,0x3e,0x36,0x00, + 0x00,0x00,0x66,0x3c,0x18,0x3c,0x66,0x00, + 0x00,0x00,0x66,0x66,0x66,0x3e,0x0c,0x78, + 0x00,0x00,0x7e,0x0c,0x18,0x30,0x7e,0x00, + 0x00,0x18,0x3c,0x7e,0x7e,0x18,0x3c,0x00, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x00,0x7e,0x78,0x7c,0x6e,0x66,0x06,0x00, + 0x08,0x18,0x38,0x78,0x38,0x18,0x08,0x00, + 0x10,0x18,0x1c,0x1e,0x1c,0x18,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x4c,0xd8,0xf8,0x4c,0xd8,0xf8,0x4c,0xd8, + 0xf8,0x4c,0xd8,0xf8,0x4c,0xd8,0xf8,0x4c, + 0xd8,0xf8,0x4c,0xb7,0xfd,0x4c,0xd8,0xf8, + 0x4c,0xd8,0xf8,0x4c,0xd8,0xf8,0x4c,0xd8, + 0xf8,0x4c,0xd8,0xf8,0x4c,0x00,0xf8,0x4c, + 0x00,0xf8,0x4c,0xd8,0xf8,0x4c,0xd8,0xf8, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xa2,0xff,0x9a,0xa9,0x0e,0x8d,0x22,0x02, + 0xa9,0xfd,0x8d,0x23,0x02,0xa9,0xb7,0x8d, + 0x24,0x02,0xa9,0xfd,0x8d,0x25,0x02,0xa9, + 0xbf,0x8d,0x16,0x02,0xa9,0xfd,0x8d,0x17, + 0x02,0xa5,0x00,0xd0,0x18,0xa5,0x01,0xd0, + 0x14,0xad,0xfc,0xbf,0xee,0xfc,0xbf,0xcd, + 0xfc,0xbf,0xd0,0x0c,0x20,0x3a,0xf8,0x6c, + 0xfa,0xbf,0x6c,0xfe,0xbf,0x6c,0x00,0x00, + 0xa9,0x31,0x8d,0x00,0x03,0xa9,0x01,0x8d, + 0x01,0x03,0xa9,0x52,0x8d,0x02,0x03,0xa9, + 0x00,0x8d,0x04,0x03,0xa9,0x04,0x8d,0x05, + 0x03,0xa9,0x80,0x8d,0x08,0x03,0xa9,0x00, + 0x8d,0x09,0x03,0xa9,0x01,0x8d,0x0a,0x03, + 0xa9,0x00,0x8d,0x0b,0x03,0x20,0x59,0xe4, + 0x30,0x66,0xad,0x00,0x04,0xc9,0xff,0xd0, + 0x07,0xad,0x01,0x04,0xc9,0xff,0xf0,0x58, + 0x85,0x00,0x18,0xad,0x02,0x04,0x8d,0x04, + 0x03,0x69,0x06,0x85,0x01,0xad,0x03,0x04, + 0x8d,0x05,0x03,0x69,0x00,0x85,0x02,0xad, + 0x04,0x04,0x85,0x03,0xad,0x05,0x04,0x85, + 0x04,0x20,0x59,0xe4,0x30,0x32,0x18,0xad, + 0x04,0x03,0x69,0x80,0x8d,0x04,0x03,0xad, + 0x05,0x03,0x69,0x00,0x8d,0x05,0x03,0xee, + 0x0a,0x03,0xd0,0x03,0xee,0x0b,0x03,0xc6, + 0x00,0xd0,0xde,0xc6,0x05,0x10,0xda,0x20, + 0xd2,0xf8,0xa9,0x01,0x85,0x09,0x20,0xd5, + 0xf8,0x60,0x6c,0x01,0x00,0x6c,0x03,0x00, + 0xa9,0x1b,0x8d,0x30,0x02,0x8d,0x02,0xd4, + 0xa9,0xf9,0x8d,0x31,0x02,0x8d,0x03,0xd4, + 0xa9,0xe0,0x8d,0x09,0xd4,0x8d,0xf4,0x02, + 0xa9,0x22,0x8d,0x00,0xd4,0x8d,0x2f,0x02, + 0xa9,0x02,0x8d,0x01,0xd4,0x8d,0xf3,0x02, + 0xa9,0xca,0x8d,0x1a,0xd0,0x8d,0xc8,0x02, + 0xa9,0x94,0x8d,0x18,0xd0,0x8d,0xc6,0x02, + 0xa9,0x0a,0x8d,0x17,0xd0,0x8d,0xc5,0x02, + 0x4c,0x18,0xf9,0x70,0x70,0x70,0x42,0x3b, + 0xf9,0x02,0x02,0x02,0x02,0x02,0x02,0x02, + 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, + 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, + 0x41,0x1b,0xf9,0x00,0x00,0x00,0x00,0x00, + 0x00,0x21,0x74,0x61,0x72,0x69,0x18,0x10, + 0x10,0x0f,0x2f,0x33,0x00,0x25,0x6d,0x75, + 0x6c,0x61,0x74,0x69,0x6f,0x6e,0x00,0x28, + 0x61,0x6c,0x74,0x65,0x64,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x6f, + 0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x00, + 0x08,0x63,0x09,0x00,0x11,0x19,0x19,0x17, + 0x00,0x24,0x61,0x76,0x69,0x64,0x00,0x2a, + 0x0e,0x00,0x26,0x69,0x72,0x74,0x68,0x00, + 0x00,0x00,0x00,0x08,0x63,0x09,0x00,0x11, + 0x19,0x19,0x18,0x0d,0x12,0x10,0x11,0x13, + 0x00,0x21,0x74,0x61,0x72,0x69,0x18,0x10, + 0x10,0x00,0x24,0x65,0x76,0x65,0x6c,0x6f, + 0x70,0x6d,0x65,0x6e,0x74,0x00,0x34,0x65, + 0x61,0x6d,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x68,0x74,0x74,0x70,0x1a,0x0f, + 0x0f,0x61,0x74,0x61,0x72,0x69,0x18,0x10, + 0x10,0x0e,0x61,0x74,0x61,0x72,0x69,0x0e, + 0x6f,0x72,0x67,0x0f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x33,0x6f,0x72,0x72,0x79, + 0x00,0x74,0x68,0x69,0x73,0x00,0x70,0x72, + 0x6f,0x67,0x72,0x61,0x6d,0x00,0x6e,0x65, + 0x65,0x64,0x73,0x00,0x61,0x00,0x72,0x65, + 0x61,0x6c,0x00,0x21,0x74,0x61,0x72,0x69, + 0x0f,0x2f,0x33,0x00,0x00,0x36,0x69,0x73, + 0x69,0x74,0x00,0x74,0x68,0x65,0x00,0x37, + 0x65,0x62,0x00,0x70,0x61,0x67,0x65,0x73, + 0x00,0x74,0x6f,0x00,0x66,0x69,0x6e,0x64, + 0x00,0x6f,0x75,0x74,0x00,0x6d,0x6f,0x72, + 0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x2c,0x0f,0xd4,0x10,0x03, + 0x6c,0x00,0x02,0x48,0x8a,0x48,0x98,0x48, + 0x8d,0x0f,0xd4,0x6c,0x22,0x02,0xe6,0x14, + 0xd0,0x06,0xe6,0x13,0xd0,0x02,0xe6,0x12, + 0xad,0x2f,0x02,0x8d,0x00,0xd4,0xad,0x30, + 0x02,0x8d,0x02,0xd4,0xad,0x31,0x02,0x8d, + 0x03,0xd4,0xad,0xc8,0x02,0x8d,0x1a,0xd0, + 0xad,0xc4,0x02,0x8d,0x16,0xd0,0xad,0xc5, + 0x02,0x8d,0x17,0xd0,0xad,0xc6,0x02,0x8d, + 0x18,0xd0,0xad,0xc7,0x02,0x8d,0x19,0xd0, + 0xad,0xc0,0x02,0x8d,0x12,0xd0,0xad,0xc1, + 0x02,0x8d,0x13,0xd0,0xad,0xc2,0x02,0x8d, + 0x14,0xd0,0xad,0xc3,0x02,0x8d,0x15,0xd0, + 0xad,0xf3,0x02,0x8d,0x01,0xd4,0xad,0xf4, + 0x02,0x8d,0x09,0xd4,0xad,0x00,0xd3,0x29, + 0x0f,0x8d,0x78,0x02,0xad,0x00,0xd3,0x0a, + 0x0a,0x0a,0x0a,0x8d,0x79,0x02,0xad,0x01, + 0xd3,0x29,0x0f,0x8d,0x7a,0x02,0xad,0x01, + 0xd3,0x0a,0x0a,0x0a,0x0a,0x8d,0x7b,0x02, + 0xad,0x6f,0x02,0x8d,0x1b,0xd0,0xad,0x32, + 0x02,0x8d,0x0f,0xd2,0xad,0x10,0xd0,0x8d, + 0x84,0x02,0xad,0x11,0xd0,0x8d,0x85,0x02, + 0xad,0x12,0xd0,0x8d,0x86,0x02,0xad,0x13, + 0xd0,0x8d,0x87,0x02,0x6c,0x24,0x02,0x68, + 0xa8,0x68,0xaa,0x68,0x6c,0x16,0x02,0x48, + 0xad,0x0e,0xd2,0x29,0x40,0xd0,0x06,0xad, + 0x09,0xd2,0x8d,0xfc,0x02,0x68,0x40,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xfb,0xfc,0x00,0xf8,0xbc,0xfd +}; diff --git a/PVAtari800/atari800-src/emuos.h b/PVAtari800/atari800-src/emuos.h new file mode 100644 index 0000000000..2070aef030 --- /dev/null +++ b/PVAtari800/atari800-src/emuos.h @@ -0,0 +1,8 @@ +#ifndef EMUOS_H_ +#define EMUOS_H_ + +#include "atari.h" + +extern UBYTE const emuos_h[8192]; + +#endif /* EMUOS_H_ */ diff --git a/PVAtari800/atari800-src/emuos.lis b/PVAtari800/atari800-src/emuos.lis new file mode 100644 index 0000000000..8a9dee44ce --- /dev/null +++ b/PVAtari800/atari800-src/emuos.lis @@ -0,0 +1,569 @@ + .OPT NO LIST +; emuos.lis - OS bootstrapping code +; +; Copyright (C) 1995-1998 David Firth +; Copyright (C) 2001-2009 Atari800 development team (see DOC/CREDITS) +; +; This file is part of the Atari800 emulator project which emulates +; the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. +; +; Atari800 is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. +; +; Atari800 is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with Atari800; if not, write to the Free Software +; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +; +; +; UPDATE EMUOS.LIS +; Start Emulator +; Insert MAC/65 Cartridge +; ENTER #H5:EMUOS.LIS,A +; ASM,,#H0:EMUOS.OBJ +; Exit Emulator +; mkimg -input emuos.obj -image emuos.img -header emuos.h e000 ffff +; +BOOT = $09 +RTCLOK = $12 +VVBLKI = $0222 +VVBLKD = $0224 +; +; ============================ +; OS Hardware Shadow Registers +; ============================ +; +CHART = $02F3 +CHBAS = $02F4 +CH = $02FC +COLOR4 = $02C8 +COLOR0 = $02C4 +COLOR1 = $02C5 +COLOR2 = $02C6 +COLOR3 = $02C7 +PCOLR0 = $02C0 +PCOLR1 = $02C1 +PCOLR2 = $02C2 +PCOLR3 = $02C3 +SDLSTH = $0231 +SDLSTL = $0230 +SDMCTL = $022F +STICK0 = $0278 +STICK1 = $0279 +STICK2 = $027A +STICK3 = $027B +GPRIOR = $026F +SSKCTL = $0232 +STRIG0 = $0284 +STRIG1 = $0285 +STRIG2 = $0286 +STRIG3 = $0287 +; +DDEVIC = $0300 +DUNIT = $0301 +DCOMND = $0302 +DSTATS = $0303 +DBUFLO = $0304 +DBUFHI = $0305 +DTIMLO = $0306 +DTIMHI = $0307 +DBYTLO = $0308 +DBYTHI = $0309 +DAUX1 = $030A +DAUX2 = $030B +; +; ================== +; Hardware Registers +; ================== +; +CHACTL = $D401 +CHBASE = $D409 +COLBK = $D01A +COLPF0 = $D016 +COLPF1 = $D017 +COLPF2 = $D018 +COLPF3 = $D019 +COLPM0 = $D012 +COLPM1 = $D013 +COLPM2 = $D014 +COLPM3 = $D015 +CONSOL = $D01F +DLISTH = $D403 +DLISTL = $D402 +DMACTL = $D400 +KBCODE = $D209 +IRQEN = $D20E +IRQST = $D20E +NMIRES = $D40F +NMIST = $D40F +PACTL = $D302 +PORTA = $D300 +PORTB = $D301 +PRIOR = $D01B +SKCTL = $D20F +TRIG0 = $D010 +TRIG1 = $D011 +TRIG2 = $D012 +TRIG3 = $D013 +VCOUNT = $D40B +; + *= $E000 + .BYTE $00,$00,$00,$00,$00,$00,$00,$00 + .BYTE $00,$18,$18,$18,$18,$00,$18,$00 + .BYTE $00,$66,$66,$66,$00,$00,$00,$00 + .BYTE $00,$66,$FF,$66,$66,$FF,$66,$00 + .BYTE $18,$3E,$60,$3C,$06,$7C,$18,$00 + .BYTE $00,$66,$6C,$18,$30,$66,$46,$00 + .BYTE $1C,$36,$1C,$38,$6F,$66,$3B,$00 + .BYTE $00,$18,$18,$18,$00,$00,$00,$00 + .BYTE $00,$0E,$1C,$18,$18,$1C,$0E,$00 + .BYTE $00,$70,$38,$18,$18,$38,$70,$00 + .BYTE $00,$66,$3C,$FF,$3C,$66,$00,$00 + .BYTE $00,$18,$18,$7E,$18,$18,$00,$00 + .BYTE $00,$00,$00,$00,$00,$18,$18,$30 + .BYTE $00,$00,$00,$7E,$00,$00,$00,$00 + .BYTE $00,$00,$00,$00,$00,$18,$18,$00 + .BYTE $00,$06,$0C,$18,$30,$60,$40,$00 + .BYTE $00,$3C,$66,$6E,$76,$66,$3C,$00 + .BYTE $00,$18,$38,$18,$18,$18,$7E,$00 + .BYTE $00,$3C,$66,$0C,$18,$30,$7E,$00 + .BYTE $00,$7E,$0C,$18,$0C,$66,$3C,$00 + .BYTE $00,$0C,$1C,$3C,$6C,$7E,$0C,$00 + .BYTE $00,$7E,$60,$7C,$06,$66,$3C,$00 + .BYTE $00,$3C,$60,$7C,$66,$66,$3C,$00 + .BYTE $00,$7E,$06,$0C,$18,$30,$30,$00 + .BYTE $00,$3C,$66,$3C,$66,$66,$3C,$00 + .BYTE $00,$3C,$66,$3E,$06,$0C,$38,$00 + .BYTE $00,$00,$18,$18,$00,$18,$18,$00 + .BYTE $00,$00,$18,$18,$00,$18,$18,$30 + .BYTE $06,$0C,$18,$30,$18,$0C,$06,$00 + .BYTE $00,$00,$7E,$00,$00,$7E,$00,$00 + .BYTE $60,$30,$18,$0C,$18,$30,$60,$00 + .BYTE $00,$3C,$66,$0C,$18,$00,$18,$00 + .BYTE $00,$3C,$66,$6E,$6E,$60,$3E,$00 + .BYTE $00,$18,$3C,$66,$66,$7E,$66,$00 + .BYTE $00,$7C,$66,$7C,$66,$66,$7C,$00 + .BYTE $00,$3C,$66,$60,$60,$66,$3C,$00 + .BYTE $00,$78,$6C,$66,$66,$6C,$78,$00 + .BYTE $00,$7E,$60,$7C,$60,$60,$7E,$00 + .BYTE $00,$7E,$60,$7C,$60,$60,$60,$00 + .BYTE $00,$3E,$60,$60,$6E,$66,$3E,$00 + .BYTE $00,$66,$66,$7E,$66,$66,$66,$00 + .BYTE $00,$7E,$18,$18,$18,$18,$7E,$00 + .BYTE $00,$06,$06,$06,$06,$66,$3C,$00 + .BYTE $00,$66,$6C,$78,$78,$6C,$66,$00 + .BYTE $00,$60,$60,$60,$60,$60,$7E,$00 + .BYTE $00,$63,$77,$7F,$6B,$63,$63,$00 + .BYTE $00,$66,$76,$7E,$7E,$6E,$66,$00 + .BYTE $00,$3C,$66,$66,$66,$66,$3C,$00 + .BYTE $00,$7C,$66,$66,$7C,$60,$60,$00 + .BYTE $00,$3C,$66,$66,$66,$6C,$36,$00 + .BYTE $00,$7C,$66,$66,$7C,$6C,$66,$00 + .BYTE $00,$3C,$60,$3C,$06,$06,$3C,$00 + .BYTE $00,$7E,$18,$18,$18,$18,$18,$00 + .BYTE $00,$66,$66,$66,$66,$66,$7E,$00 + .BYTE $00,$66,$66,$66,$66,$3C,$18,$00 + .BYTE $00,$63,$63,$6B,$7F,$77,$63,$00 + .BYTE $00,$66,$66,$3C,$3C,$66,$66,$00 + .BYTE $00,$66,$66,$3C,$18,$18,$18,$00 + .BYTE $00,$7E,$0C,$18,$30,$60,$7E,$00 + .BYTE $00,$1E,$18,$18,$18,$18,$1E,$00 + .BYTE $00,$40,$60,$30,$18,$0C,$06,$00 + .BYTE $00,$78,$18,$18,$18,$18,$78,$00 + .BYTE $00,$08,$1C,$36,$63,$00,$00,$00 + .BYTE $00,$00,$00,$00,$00,$00,$FF,$00 + .BYTE $00,$36,$7F,$7F,$3E,$1C,$08,$00 + .BYTE $18,$18,$18,$1F,$1F,$18,$18,$18 + .BYTE $03,$03,$03,$03,$03,$03,$03,$03 + .BYTE $18,$18,$18,$F8,$F8,$00,$00,$00 + .BYTE $18,$18,$18,$F8,$F8,$18,$18,$18 + .BYTE $00,$00,$00,$F8,$F8,$18,$18,$18 + .BYTE $03,$07,$0E,$1C,$38,$70,$E0,$C0 + .BYTE $C0,$E0,$70,$38,$1C,$0E,$07,$03 + .BYTE $01,$03,$07,$0F,$1F,$3F,$7F,$FF + .BYTE $00,$00,$00,$00,$0F,$0F,$0F,$0F + .BYTE $80,$C0,$E0,$F0,$F8,$FC,$FE,$FF + .BYTE $0F,$0F,$0F,$0F,$00,$00,$00,$00 + .BYTE $F0,$F0,$F0,$F0,$00,$00,$00,$00 + .BYTE $FF,$FF,$00,$00,$00,$00,$00,$00 + .BYTE $00,$00,$00,$00,$00,$00,$FF,$FF + .BYTE $00,$00,$00,$00,$F0,$F0,$F0,$F0 + .BYTE $00,$1C,$1C,$77,$77,$08,$1C,$00 + .BYTE $00,$00,$00,$1F,$1F,$18,$18,$18 + .BYTE $00,$00,$00,$FF,$FF,$00,$00,$00 + .BYTE $18,$18,$18,$FF,$FF,$18,$18,$18 + .BYTE $00,$00,$3C,$7E,$7E,$7E,$3C,$00 + .BYTE $00,$00,$00,$00,$FF,$FF,$FF,$FF + .BYTE $C0,$C0,$C0,$C0,$C0,$C0,$C0,$C0 + .BYTE $00,$00,$00,$FF,$FF,$18,$18,$18 + .BYTE $18,$18,$18,$FF,$FF,$00,$00,$00 + .BYTE $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 + .BYTE $18,$18,$18,$1F,$1F,$00,$00,$00 + .BYTE $78,$60,$78,$60,$7E,$18,$1E,$00 + .BYTE $00,$18,$3C,$7E,$18,$18,$18,$00 + .BYTE $00,$18,$18,$18,$7E,$3C,$18,$00 + .BYTE $00,$18,$30,$7E,$30,$18,$00,$00 + .BYTE $00,$18,$0C,$7E,$0C,$18,$00,$00 + .BYTE $00,$18,$3C,$7E,$7E,$3C,$18,$00 + .BYTE $00,$00,$3C,$06,$3E,$66,$3E,$00 + .BYTE $00,$60,$60,$7C,$66,$66,$7C,$00 + .BYTE $00,$00,$3C,$60,$60,$60,$3C,$00 + .BYTE $00,$06,$06,$3E,$66,$66,$3E,$00 + .BYTE $00,$00,$3C,$66,$7E,$60,$3C,$00 + .BYTE $00,$0E,$18,$3E,$18,$18,$18,$00 + .BYTE $00,$00,$3E,$66,$66,$3E,$06,$7C + .BYTE $00,$60,$60,$7C,$66,$66,$66,$00 + .BYTE $00,$18,$00,$38,$18,$18,$3C,$00 + .BYTE $00,$06,$00,$06,$06,$06,$06,$3C + .BYTE $00,$60,$60,$6C,$78,$6C,$66,$00 + .BYTE $00,$38,$18,$18,$18,$18,$3C,$00 + .BYTE $00,$00,$66,$7F,$7F,$6B,$63,$00 + .BYTE $00,$00,$7C,$66,$66,$66,$66,$00 + .BYTE $00,$00,$3C,$66,$66,$66,$3C,$00 + .BYTE $00,$00,$7C,$66,$66,$7C,$60,$60 + .BYTE $00,$00,$3E,$66,$66,$3E,$06,$06 + .BYTE $00,$00,$7C,$66,$60,$60,$60,$00 + .BYTE $00,$00,$3E,$60,$3C,$06,$7C,$00 + .BYTE $00,$18,$7E,$18,$18,$18,$0E,$00 + .BYTE $00,$00,$66,$66,$66,$66,$3E,$00 + .BYTE $00,$00,$66,$66,$66,$3C,$18,$00 + .BYTE $00,$00,$63,$6B,$7F,$3E,$36,$00 + .BYTE $00,$00,$66,$3C,$18,$3C,$66,$00 + .BYTE $00,$00,$66,$66,$66,$3E,$0C,$78 + .BYTE $00,$00,$7E,$0C,$18,$30,$7E,$00 + .BYTE $00,$18,$3C,$7E,$7E,$18,$3C,$00 + .BYTE $18,$18,$18,$18,$18,$18,$18,$18 + .BYTE $00,$7E,$78,$7C,$6E,$66,$06,$00 + .BYTE $08,$18,$38,$78,$38,$18,$08,$00 + .BYTE $10,$18,$1C,$1E,$1C,$18,$10,$00 +; +DISKIV = $E450 +DSKINV = $E453 +CIOV = $E456 +SIOV = $E459 +SETVBV = $E45C +SYSVBV = $E45F +XITVBV = $E462 +SIOINV = $E465 +SENDEV = $E468 +INTINV = $E46B +CIOINV = $E46E +BLKBDV = $E471 +WARMSV = $E474 +COLDSV = $E477 +RBLOKV = $E47A +CSOPIV = $E47D +; + *= DISKIV + JMP HALT + *= DSKINV + JMP HALT + *= CIOV + JMP HALT + *= SIOV + JMP HALT + *= SETVBV + JMP HALT + *= SYSVBV + JMP HALT + *= XITVBV + JMP XITVBL + *= SIOINV + JMP HALT + *= SENDEV + JMP HALT + *= INTINV + JMP HALT + *= CIOINV + JMP HALT + *= BLKBDV + JMP HALT + *= WARMSV + JMP COLDSTART + *= COLDSV + JMP COLDSTART + *= RBLOKV + JMP HALT + *= CSOPIV + JMP HALT +; + *= $F800 +COLDSTART + LDX #$FF + TXS + LDA # SYSVBL + STA VVBLKI+1 + LDA # XITVBL + STA VVBLKD+1 + LDA # IRQ + STA $0217 + LDA $0000 + BNE RPIIMG ; Run pre-installed image + LDA $0001 + BNE RPIIMG ; Run pre-installed image + LDA $BFFC + INC $BFFC + CMP $BFFC + BNE BOOTDISK +; BNE MONTY + JSR CART.INIT + JMP ($BFFA) +CART.INIT + JMP ($BFFE) +;MONTY +; STA $BFFC ; Restore original value to $BFFC +; JMP $0115 ; Run Montezummas Revenge +RPIIMG + JMP ($0000) ; Run pre-installed image +; +BOOTDISK + LDA #$31 + STA DDEVIC + LDA #$01 + STA DUNIT + LDA #$52 + STA DCOMND + LDA #0 + STA DBUFLO + LDA #4 + STA DBUFHI + LDA #$80 + STA DBYTLO + LDA #$00 + STA DBYTHI + LDA #1 + STA DAUX1 + LDA #0 + STA DAUX2 + JSR SIOV + BMI HALT + LDA $0400 + CMP #$FF + BNE BOOTDISK.1 + LDA $0401 + CMP #$FF + BEQ BINARY.FILE +BOOTDISK.1 + STA 0 + CLC + LDA $0402 + STA DBUFLO + ADC #6 + STA 1 + LDA $0403 + STA DBUFHI + ADC #0 + STA 2 + LDA $0404 + STA 3 + LDA $0405 + STA 4 +?L1 + JSR SIOV + BMI HALT + CLC + LDA DBUFLO + ADC #$80 + STA DBUFLO + LDA DBUFHI + ADC #0 + STA DBUFHI + INC DAUX1 + BNE ?L2 + INC DAUX2 +?L2 + DEC 0 + BNE ?L1 + DEC 5 + BPL ?L1 + JSR ?L3 ; Run initialisation code + LDA #1 + STA BOOT + JSR ?L4 ; Run main program + RTS +?L3 + JMP ($01) +?L4 + JMP ($03) +; +BINARY.FILE +; +HALT + LDA # DLIST + STA SDLSTH + STA DLISTH + LDA #$E0 + STA CHBASE + STA CHBAS + LDA #$22 + STA DMACTL + STA SDMCTL + LDA #$02 + STA CHACTL + STA CHART + LDA #$CA + STA COLBK + STA COLOR4 + LDA #$94 + STA COLPF2 + STA COLOR2 + LDA #$0A + STA COLPF1 + STA COLOR1 +; +HALT2 + JMP HALT2 +DLIST + .BYTE $70,$70,$70 + .BYTE $42, HALTMSG + .BYTE $02,$02,$02,$02,$02 + .BYTE $02,$02,$02,$02,$02 + .BYTE $02,$02,$02,$02,$02 + .BYTE $02,$02,$02,$02,$02 + .BYTE $02,$02,$02 + .BYTE $41, DLIST +; +HALTMSG + .SBYTE " Atari800/OS Emulation Halted " + .SBYTE " Copyright (c) 1997 David J. Firth " + .SBYTE "(c) 1998-2013 Atari800 Development Team " + .SBYTE " " + .SBYTE " http://atari800.atari.org/ " + .SBYTE " " + .SBYTE "Sorry this program needs a real Atari/OS" + .SBYTE " Visit the Web pages to find out more " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " + .SBYTE " " +; +NMI + BIT NMIST + BPL VBI + JMP ($0200) +VBI + PHA + TXA + PHA + TYA + PHA + STA NMIRES + JMP (VVBLKI) +SYSVBL + INC RTCLOK+2 + BNE SYSVBL.1 + INC RTCLOK+1 + BNE SYSVBL.1 + INC RTCLOK +SYSVBL.1 + LDA SDMCTL + STA DMACTL + LDA SDLSTL + STA DLISTL + LDA SDLSTH + STA DLISTH + LDA COLOR4 + STA COLBK + LDA COLOR0 + STA COLPF0 + LDA COLOR1 + STA COLPF1 + LDA COLOR2 + STA COLPF2 + LDA COLOR3 + STA COLPF3 + LDA PCOLR0 + STA COLPM0 + LDA PCOLR1 + STA COLPM1 + LDA PCOLR2 + STA COLPM2 + LDA PCOLR3 + STA COLPM3 + LDA CHART + STA CHACTL + LDA CHBAS + STA CHBASE + LDA PORTA + AND #$0F + STA STICK0 + LDA PORTA + ASL A + ASL A + ASL A + ASL A + STA STICK1 + LDA PORTB + AND #$0F + STA STICK2 + LDA PORTB + ASL A + ASL A + ASL A + ASL A + STA STICK3 + LDA GPRIOR + STA PRIOR + LDA SSKCTL + STA SKCTL + LDA TRIG0 + STA STRIG0 + LDA TRIG1 + STA STRIG1 + LDA TRIG2 + STA STRIG2 + LDA TRIG3 + STA STRIG3 + JMP (VVBLKD) +XITVBL + PLA + TAY + PLA + TAX + PLA +IRQ.VECTOR + JMP ($0216) +IRQ + PHA + LDA IRQST ; Get Interrupt Status + AND #$40 + BNE IRQ.EXIT + LDA KBCODE + STA CH +IRQ.EXIT + PLA + RTI +; + *= $FFFA + .WORD NMI + *= $FFFC + .WORD COLDSTART + *= $FFFE + .WORD IRQ.VECTOR diff --git a/PVAtari800/atari800-src/esc.c b/PVAtari800/atari800-src/esc.c new file mode 100755 index 0000000000..46dc34e5a6 --- /dev/null +++ b/PVAtari800/atari800-src/esc.c @@ -0,0 +1,243 @@ +/* + * esc.c - Patch the OS with escape sequences + * + * Copyright (c) 1995-1998 David Firth + * Copyright (c) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include "atari.h" +#include "cassette.h" +#include "cpu.h" +#include "devices.h" +#include "esc.h" +#include "log.h" +#include "memory.h" +#include "pia.h" +#include "sio.h" +#include "sysrom.h" +#include "ui.h" +#include + +int ESC_enable_sio_patch = TRUE; + +/* Now we check address of every escape code, to make sure that the patch + has been set by the emulator and is not a CIM in Atari program. + Also switch() for escape codes has been changed to array of pointers + to functions. This allows adding port-specific patches (e.g. modem device) + using ESC_Add, Devices_UpdateHATABSEntry etc. without modifying + atari.c/devices.c. Unfortunately it can't be done for patches in Atari OS, + because the OS in XL/XE can be disabled. +*/ +static UWORD esc_address[256]; +static ESC_FunctionType esc_function[256]; + +void ESC_ClearAll(void) +{ + int i; + for (i = 0; i < 256; i++) + esc_function[i] = NULL; +} + +void ESC_Add(UWORD address, UBYTE esc_code, ESC_FunctionType function) +{ + esc_address[esc_code] = address; + esc_function[esc_code] = function; + MEMORY_dPutByte(address, 0xf2); /* ESC */ + MEMORY_dPutByte(address + 1, esc_code); /* ESC CODE */ +} + +void ESC_AddEscRts(UWORD address, UBYTE esc_code, ESC_FunctionType function) +{ + esc_address[esc_code] = address; + esc_function[esc_code] = function; + MEMORY_dPutByte(address, 0xf2); /* ESC */ + MEMORY_dPutByte(address + 1, esc_code); /* ESC CODE */ + MEMORY_dPutByte(address + 2, 0x60); /* RTS */ +} + +/* 0xd2 is ESCRTS, which works same as pair of ESC and RTS (I think so...). + So this function does effectively the same as ESC_AddEscRts, + except that it modifies 2, not 3 bytes in Atari memory. + I don't know why it is done that way, so I simply leave it + unchanged (0xf2/0xd2 are used as in previous versions). +*/ +void ESC_AddEscRts2(UWORD address, UBYTE esc_code, ESC_FunctionType function) +{ + esc_address[esc_code] = address; + esc_function[esc_code] = function; + MEMORY_dPutByte(address, 0xd2); /* ESCRTS */ + MEMORY_dPutByte(address + 1, esc_code); /* ESC CODE */ +} + +void ESC_Remove(UBYTE esc_code) +{ + esc_function[esc_code] = NULL; +} + +void ESC_Run(UBYTE esc_code) +{ + if (esc_address[esc_code] == CPU_regPC - 2 && esc_function[esc_code] != NULL) { + esc_function[esc_code](); + return; + } +#ifdef CRASH_MENU + CPU_regPC -= 2; + UI_crash_address = CPU_regPC; + UI_crash_afterCIM = CPU_regPC + 2; + UI_crash_code = MEMORY_dGetByte(UI_crash_address); + UI_Run(); +#else /* CRASH_MENU */ + CPU_cim_encountered = 1; + Log_print("Invalid ESC code %02x at address %04x", esc_code, CPU_regPC - 2); +#ifndef __PLUS + if (!Atari800_Exit(TRUE)) + exit(0); +#else /* __PLUS */ + Atari800_Exit(TRUE); +#endif /* __PLUS */ +#endif /* CRASH_MENU */ +} + +void ESC_PatchOS(void) +{ + int patched = Devices_PatchOS(); + if (ESC_enable_sio_patch) { + UWORD addr_l; + UWORD addr_s; + UBYTE check_s_0; + UBYTE check_s_1; + /* patch Open() of C: so we know when a leader is processed */ + switch (Atari800_os_version) { + case SYSROM_A_NTSC: + case SYSROM_B_NTSC: + case SYSROM_800_CUSTOM: + addr_l = 0xef74; + addr_s = 0xefbc; + check_s_0 = 0xa0; + check_s_1 = 0x80; + break; + case SYSROM_A_PAL: + addr_l = 0xef74; + addr_s = 0xefbc; + check_s_0 = 0xa0; + check_s_1 = 0xc0; + break; + case SYSROM_AA00R10: + addr_l = 0xed47; + addr_s = 0xed94; + check_s_0 = 0xa9; + check_s_1 = 0x03; + break; + case SYSROM_AA01R11: + case SYSROM_BB00R1: + case SYSROM_BB01R2: + case SYSROM_BB02R3: + case SYSROM_BB02R3V4: + case SYSROM_BB01R3: + case SYSROM_BB01R4_OS: + case SYSROM_BB01R59: + case SYSROM_BB01R59A: + case SYSROM_XL_CUSTOM: + addr_l = 0xfd13; + addr_s = 0xfd60; + check_s_0 = 0xa9; + check_s_1 = 0x03; + break; + case SYSROM_CC01R4: + addr_l = 0xef74; + addr_s = 0xefbc; + check_s_0 = 0xa9; + check_s_1 = 0x03; + break; + default: + return; + } + /* don't hurt non-standard OSes that may not support cassette at all */ + if (MEMORY_dGetByte(addr_l) == 0xa9 && MEMORY_dGetByte(addr_l + 1) == 0x03 + && MEMORY_dGetByte(addr_l + 2) == 0x8d && MEMORY_dGetByte(addr_l + 3) == 0x2a + && MEMORY_dGetByte(addr_l + 4) == 0x02 + && MEMORY_dGetByte(addr_s) == check_s_0 + && MEMORY_dGetByte(addr_s + 1) == check_s_1 + && MEMORY_dGetByte(addr_s + 2) == 0x20 && MEMORY_dGetByte(addr_s + 3) == 0x5c + && MEMORY_dGetByte(addr_s + 4) == 0xe4) { + ESC_Add(addr_l, ESC_COPENLOAD, CASSETTE_LeaderLoad); + ESC_Add(addr_s, ESC_COPENSAVE, CASSETTE_LeaderSave); + } + ESC_AddEscRts(0xe459, ESC_SIOV, SIO_Handler); + patched = TRUE; + } + else { + ESC_Remove(ESC_COPENLOAD); + ESC_Remove(ESC_COPENSAVE); + ESC_Remove(ESC_SIOV); + }; + if (patched){ + UWORD addr; + switch (Atari800_os_version) { + case SYSROM_AA00R10: + addr = 0xc3d2; + break; + case SYSROM_AA01R11: + addr = 0xc346; + break; + case SYSROM_BB00R1: + addr = 0xc32b; + break; + case SYSROM_BB01R2: + case SYSROM_BB02R3: + case SYSROM_BB01R3: + case SYSROM_BB01R4_OS: + case SYSROM_BB01R59: + case SYSROM_BB01R59A: + case SYSROM_XL_CUSTOM: + addr = 0xc31d; + break; + case SYSROM_BB02R3V4: + addr = 0xc32c; + break; + case SYSROM_CC01R4: + addr = 0xc2e0; + break; + default: + /* Don't disable checksum test. */ + return; + } + /* Disable setting NGFLAG on wrong OS checksum. */ + MEMORY_dPutByte(addr, 0xea); + MEMORY_dPutByte(addr+1, 0xea); + } +} + +void ESC_UpdatePatches(void) +{ + /* Patch only if OS enabled. */ + if (Atari800_machine_type != Atari800_MACHINE_5200 && + (Atari800_machine_type != Atari800_MACHINE_XLXE || (PIA_PORTB & 1) != 0)) { + int const os_rom_start = Atari800_machine_type == Atari800_MACHINE_800 ? 0xd800 : 0xc000; + /* Restore unpatched OS */ + if (os_rom_start < 0xd000) + MEMORY_dCopyToMem(MEMORY_os, os_rom_start, 0xd000 - os_rom_start); + MEMORY_dCopyToMem(MEMORY_os + 0xd800 - os_rom_start, 0xd800, 0x2800); + /* Set patches */ + ESC_PatchOS(); + Devices_UpdatePatches(); + } +} diff --git a/PVAtari800/atari800-src/esc.h b/PVAtari800/atari800-src/esc.h new file mode 100755 index 0000000000..6ff9f6f4aa --- /dev/null +++ b/PVAtari800/atari800-src/esc.h @@ -0,0 +1,105 @@ +#ifndef ESC_H_ +#define ESC_H_ + +/* TRUE to enable patched (fast) Serial I/O. */ +extern int ESC_enable_sio_patch; + +/* Escape codes used to mark places in 6502 code that must + be handled specially by the emulator. An escape sequence + is an illegal 6502 opcode 0xF2 or 0xD2 followed + by one of these escape codes: */ +enum ESC_t { + + /* SIO patch. */ + ESC_SIOV, + + /* stdio-based handlers for the BASIC version + and handlers for Atari Basic loader. */ + ESC_EHOPEN, + ESC_EHCLOS, + ESC_EHREAD, + ESC_EHWRIT, + ESC_EHSTAT, + ESC_EHSPEC, + + ESC_KHOPEN, + ESC_KHCLOS, + ESC_KHREAD, + ESC_KHWRIT, + ESC_KHSTAT, + ESC_KHSPEC, + + /* Atari executable loader. */ + ESC_BINLOADER_CONT, + + /* Cassette emulation. */ + ESC_COPENLOAD = 0xa8, + ESC_COPENSAVE = 0xa9, + + /* Printer. */ + ESC_PHOPEN = 0xb0, + ESC_PHCLOS = 0xb1, + ESC_PHREAD = 0xb2, + ESC_PHWRIT = 0xb3, + ESC_PHSTAT = 0xb4, + ESC_PHSPEC = 0xb5, + ESC_PHINIT = 0xb6, + +#ifdef R_IO_DEVICE + /* R: device. */ + ESC_ROPEN = 0xd0, + ESC_RCLOS = 0xd1, + ESC_RREAD = 0xd2, + ESC_RWRIT = 0xd3, + ESC_RSTAT = 0xd4, + ESC_RSPEC = 0xd5, + ESC_RINIT = 0xd6, +#endif + + /* H: device. */ + ESC_HHOPEN = 0xc0, + ESC_HHCLOS = 0xc1, + ESC_HHREAD = 0xc2, + ESC_HHWRIT = 0xc3, + ESC_HHSTAT = 0xc4, + ESC_HHSPEC = 0xc5, + ESC_HHINIT = 0xc6, + + /* B: device. */ + ESC_BOPEN = 0xe0, + ESC_BCLOS = 0xe1, + ESC_BREAD = 0xe2, + ESC_BWRIT = 0xe3, + ESC_BSTAT = 0xe4, + ESC_BSPEC = 0xe5, + ESC_BINIT = 0xe6 +}; + +/* A function called to handle an escape sequence. */ +typedef void (*ESC_FunctionType)(void); + +/* Puts an escape sequence at the specified address. */ +void ESC_Add(UWORD address, UBYTE esc_code, ESC_FunctionType function); + +/* Puts an escape sequence followed by the RTS instruction. */ +void ESC_AddEscRts(UWORD address, UBYTE esc_code, ESC_FunctionType function); + +/* Puts an escape sequence with an integrated RTS. */ +void ESC_AddEscRts2(UWORD address, UBYTE esc_code, ESC_FunctionType function); + +/* Unregisters an escape sequence. You must cleanup the Atari memory yourself. */ +void ESC_Remove(UBYTE esc_code); + +/* Handles an escape sequence. */ +void ESC_Run(UBYTE esc_code); + +/* Installs SIO patch and disables ROM checksum test. */ +void ESC_PatchOS(void); + +/* Unregisters all escape sequences */ +void ESC_ClearAll(void); + +/* Reinitializes patches after enable_*_patch change. */ +void ESC_UpdatePatches(void); + +#endif /* ESC_H_ */ diff --git a/PVAtari800/atari800-src/filter_ntsc.c b/PVAtari800/atari800-src/filter_ntsc.c new file mode 100644 index 0000000000..e9ecb35eb8 --- /dev/null +++ b/PVAtari800/atari800-src/filter_ntsc.c @@ -0,0 +1,250 @@ +/* + * filter_ntsc.c - Atari800-specific interface for atari_ntsc module + * + * Copyright (C) 2009 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include + +#include "filter_ntsc.h" + +#include "atari.h" /* for TRUE/FALSE */ +#include "atari_ntsc/atari_ntsc.h" +#include "cfg.h" +#include "colours_ntsc.h" +#include "log.h" +#include "util.h" + +atari_ntsc_setup_t FILTER_NTSC_setup; + +static atari_ntsc_setup_t const * const presets[] = { + &atari_ntsc_composite, + &atari_ntsc_svideo, + &atari_ntsc_rgb, + &atari_ntsc_monochrome +}; + +static char const * const preset_cfg_strings[FILTER_NTSC_PRESET_SIZE] = { + "COMPOSITE", + "SVIDEO", + "RGB", + "MONOCHROME" +}; + +atari_ntsc_t *FILTER_NTSC_emu = NULL; + +atari_ntsc_t *FILTER_NTSC_New(void) +{ + atari_ntsc_t *filter = (atari_ntsc_t*) Util_malloc(sizeof(atari_ntsc_t)); + return filter; +} + +void FILTER_NTSC_Delete(atari_ntsc_t *filter) +{ + free(filter); +} + +void FILTER_NTSC_Update(atari_ntsc_t *filter) +{ + double yiq_table[768]; + + COLOURS_NTSC_GetYIQ(yiq_table, FILTER_NTSC_setup.burst_phase * M_PI); + /* The gamma setting is not used in atari_ntsc (palette generation is + placed in another module), so below we do not set the gamma field + of the FILTER_NTSC_setup structure. */ + if (COLOURS_NTSC_external.loaded && !COLOURS_NTSC_external.adjust) { + /* External palette must not be adjusted, so FILTER_NTSC + settings are set to defaults so they don't change the source + palette in any way. */ + FILTER_NTSC_setup.hue = 0.0; + FILTER_NTSC_setup.saturation = 0.0; + FILTER_NTSC_setup.contrast = 0.0; + FILTER_NTSC_setup.brightness = 0.0; + } else { + /* It's either generated palette, or external palette with + need for adjustments. Copy values from + COLOURS_NTSC_setup to FILTER_NTSC_setup. */ + FILTER_NTSC_setup.hue = COLOURS_NTSC_setup.hue; + FILTER_NTSC_setup.saturation = COLOURS_NTSC_setup.saturation; + FILTER_NTSC_setup.contrast = COLOURS_NTSC_setup.contrast; + FILTER_NTSC_setup.brightness = COLOURS_NTSC_setup.brightness; + } + + FILTER_NTSC_setup.yiq_palette = yiq_table; + atari_ntsc_init(filter, &FILTER_NTSC_setup); +} + +void FILTER_NTSC_RestoreDefaults(void) +{ + FILTER_NTSC_setup = atari_ntsc_composite; +} + +void FILTER_NTSC_SetPreset(int preset) +{ + if (preset < FILTER_NTSC_PRESET_CUSTOM) { + FILTER_NTSC_setup = *presets[preset]; + + /* Copy settings from the preset to NTSC setup. */ + COLOURS_NTSC_setup.hue = FILTER_NTSC_setup.hue; + COLOURS_NTSC_setup.saturation = FILTER_NTSC_setup.saturation; + COLOURS_NTSC_setup.contrast = FILTER_NTSC_setup.contrast; + COLOURS_NTSC_setup.brightness = FILTER_NTSC_setup.brightness; + COLOURS_NTSC_setup.gamma = FILTER_NTSC_setup.gamma; + } +} + +int FILTER_NTSC_GetPreset(void) +{ + int i; + + for (i = 0; i < FILTER_NTSC_PRESET_SIZE; i ++) { + if (Util_almostequal(FILTER_NTSC_setup.sharpness, presets[i]->sharpness, 0.001) && + Util_almostequal(FILTER_NTSC_setup.resolution, presets[i]->resolution, 0.001) && + Util_almostequal(FILTER_NTSC_setup.artifacts, presets[i]->artifacts, 0.001) && + Util_almostequal(FILTER_NTSC_setup.fringing, presets[i]->fringing, 0.001) && + Util_almostequal(FILTER_NTSC_setup.bleed, presets[i]->bleed, 0.001) && + Util_almostequal(FILTER_NTSC_setup.burst_phase, presets[i]->burst_phase, 0.001) && + Util_almostequal(COLOURS_NTSC_setup.hue, presets[i]->hue, 0.001) && + Util_almostequal(COLOURS_NTSC_setup.saturation, presets[i]->saturation, 0.001) && + Util_almostequal(COLOURS_NTSC_setup.contrast, presets[i]->contrast, 0.001) && + Util_almostequal(COLOURS_NTSC_setup.brightness, presets[i]->brightness, 0.001) && + Util_almostequal(COLOURS_NTSC_setup.gamma, presets[i]->gamma, 0.001)) + return i; + } + return FILTER_NTSC_PRESET_CUSTOM; +} + +void FILTER_NTSC_NextPreset(void) +{ + int preset = FILTER_NTSC_GetPreset(); + + if (preset == FILTER_NTSC_PRESET_CUSTOM) + preset = FILTER_NTSC_PRESET_COMPOSITE; + else + preset = (preset + 1) % FILTER_NTSC_PRESET_SIZE; + FILTER_NTSC_SetPreset(preset); +} + +void FILTER_NTSC_PreInitialise(void) +{ + /* atari_ntsc_composite acts as the default setup. */ + FILTER_NTSC_setup = atari_ntsc_composite; +} + +int FILTER_NTSC_ReadConfig(char *option, char *ptr) +{ + if (strcmp(option, "FILTER_NTSC_SHARPNESS") == 0) + return Util_sscandouble(ptr, &FILTER_NTSC_setup.sharpness); + else if (strcmp(option, "FILTER_NTSC_RESOLUTION") == 0) + return Util_sscandouble(ptr, &FILTER_NTSC_setup.resolution); + else if (strcmp(option, "FILTER_NTSC_ARTIFACTS") == 0) + return Util_sscandouble(ptr, &FILTER_NTSC_setup.artifacts); + else if (strcmp(option, "FILTER_NTSC_FRINGING") == 0) + return Util_sscandouble(ptr, &FILTER_NTSC_setup.fringing); + else if (strcmp(option, "FILTER_NTSC_BLEED") == 0) + return Util_sscandouble(ptr, &FILTER_NTSC_setup.bleed); + else if (strcmp(option, "FILTER_NTSC_BURST_PHASE") == 0) + return Util_sscandouble(ptr, &FILTER_NTSC_setup.burst_phase); + else + return FALSE; +} + +void FILTER_NTSC_WriteConfig(FILE *fp) +{ + fprintf(fp, "FILTER_NTSC_SHARPNESS=%g\n", FILTER_NTSC_setup.sharpness); + fprintf(fp, "FILTER_NTSC_RESOLUTION=%g\n", FILTER_NTSC_setup.resolution); + fprintf(fp, "FILTER_NTSC_ARTIFACTS=%g\n", FILTER_NTSC_setup.artifacts); + fprintf(fp, "FILTER_NTSC_FRINGING=%g\n", FILTER_NTSC_setup.fringing); + fprintf(fp, "FILTER_NTSC_BLEED=%g\n", FILTER_NTSC_setup.bleed); + fprintf(fp, "FILTER_NTSC_BURST_PHASE=%g\n", FILTER_NTSC_setup.burst_phase); +} + +int FILTER_NTSC_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-ntsc-sharpness") == 0) { + if (i_a) + FILTER_NTSC_setup.sharpness = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-resolution") == 0) { + if (i_a) + FILTER_NTSC_setup.resolution = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-artifacts") == 0) { + if (i_a) + FILTER_NTSC_setup.artifacts = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-fringing") == 0) { + if (i_a) + FILTER_NTSC_setup.fringing = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-bleed") == 0) { + if (i_a) + FILTER_NTSC_setup.bleed = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-burstphase") == 0) { + if (i_a) + FILTER_NTSC_setup.burst_phase = atof(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-ntsc-filter-preset") == 0) { + if (i_a) { + int idx = CFG_MatchTextParameter(argv[++i], preset_cfg_strings, FILTER_NTSC_PRESET_SIZE); + if (idx < 0) { + Log_print("Invalid value for -ntsc-filter-preset"); + return FALSE; + } + FILTER_NTSC_SetPreset(idx); + } else a_m = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-ntsc-sharpness Set sharpness for NTSC filter (default %.2g)", FILTER_NTSC_setup.sharpness); + Log_print("\t-ntsc-resolution Set resolution for NTSC filter (default %.2g)", FILTER_NTSC_setup.resolution); + Log_print("\t-ntsc-artifacts Set luma artifacts ratio for NTSC filter (default %.2g)", FILTER_NTSC_setup.artifacts); + Log_print("\t-ntsc-fringing Set chroma fringing ratio for NTSC filter (default %.2g)", FILTER_NTSC_setup.fringing); + Log_print("\t-ntsc-bleed Set bleed for NTSC filter (default %.2g)", FILTER_NTSC_setup.bleed); + Log_print("\t-ntsc-burstphase Set burst phase (artifact colours) for NTSC filter (default %.2g)", FILTER_NTSC_setup.burst_phase); + Log_print("\t-ntsc-filter-preset composite|svideo|rgb|monochrome"); + Log_print("\t Use one of predefined NTSC filter adjustments"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + return TRUE; +} diff --git a/PVAtari800/atari800-src/filter_ntsc.h b/PVAtari800/atari800-src/filter_ntsc.h new file mode 100644 index 0000000000..d388cf3e44 --- /dev/null +++ b/PVAtari800/atari800-src/filter_ntsc.h @@ -0,0 +1,64 @@ +#ifndef FILTER_NTSC_H_ +#define FILTER_NTSC_H_ + +#include +#include "atari_ntsc/atari_ntsc.h" + +/* Limits for the adjustable values. */ +#define FILTER_NTSC_SHARPNESS_MIN -1.0 +#define FILTER_NTSC_SHARPNESS_MAX 1.0 +#define FILTER_NTSC_RESOLUTION_MIN -1.0 +#define FILTER_NTSC_RESOLUTION_MAX 1.0 +#define FILTER_NTSC_ARTIFACTS_MIN -1.0 +#define FILTER_NTSC_ARTIFACTS_MAX 1.0 +#define FILTER_NTSC_FRINGING_MIN -1.0 +#define FILTER_NTSC_FRINGING_MAX 1.0 +#define FILTER_NTSC_BLEED_MIN -1.0 +#define FILTER_NTSC_BLEED_MAX 1.0 +#define FILTER_NTSC_BURST_PHASE_MIN -1.0 +#define FILTER_NTSC_BURST_PHASE_MAX 1.0 + +/* Contains controls used to adjust the palette in the NTSC filter. */ +extern atari_ntsc_setup_t FILTER_NTSC_setup; +/* Pointer to the NTSC filter structure. Initialise it by setting it to value + returned by FILTER_NTSC_New(). */ +extern atari_ntsc_t *FILTER_NTSC_emu; + +/* Allocates memory for a new NTSC filter. */ +atari_ntsc_t *FILTER_NTSC_New(void); +/* Frees memory used by an NTSC filter, FILTER. */ +void FILTER_NTSC_Delete(atari_ntsc_t *filter); +/* Reinitialises an NTSC filter, FILTER. Should be called after changing + palette setup or loading/unloading an external palette. */ +void FILTER_NTSC_Update(atari_ntsc_t *filter); +/* Restores default values for NTSC-filter-specific colour controls. + FILTER_NTSC_Update should be called afterwards to apply changes. */ +void FILTER_NTSC_RestoreDefaults(void); + +/* Set/get one of the available preset adjustments: Composite, S-Video, RGB, + Monochrome. */ +enum { + FILTER_NTSC_PRESET_COMPOSITE, + FILTER_NTSC_PRESET_SVIDEO, + FILTER_NTSC_PRESET_RGB, + FILTER_NTSC_PRESET_MONOCHROME, + FILTER_NTSC_PRESET_CUSTOM, + /* Number of "normal" (not including CUSTOM) values in enumerator */ + FILTER_NTSC_PRESET_SIZE = FILTER_NTSC_PRESET_CUSTOM +}; +/* FILTER_NTSC_Update should be called afterwards these functions to apply changes. */ +void FILTER_NTSC_SetPreset(int preset); +int FILTER_NTSC_GetPreset(void); +void FILTER_NTSC_NextPreset(void); + +/* Initialise variables before loading from config file. */ +void FILTER_NTSC_PreInitialise(void); + +/* Read/write to configuration file. */ +int FILTER_NTSC_ReadConfig(char *option, char *ptr); +void FILTER_NTSC_WriteConfig(FILE *fp); + +/* NTSC filter initialisation and processing of command-line arguments. */ +int FILTER_NTSC_Initialise(int *argc, char *argv[]); + +#endif /* FILTER_NTSC_H_ */ diff --git a/PVAtari800/atari800-src/gtia.c b/PVAtari800/atari800-src/gtia.c new file mode 100644 index 0000000000..66673d55bc --- /dev/null +++ b/PVAtari800/atari800-src/gtia.c @@ -0,0 +1,1298 @@ +/* + * gtia.c - GTIA chip emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include + +#include "antic.h" +#include "binload.h" +#include "cassette.h" +#include "cpu.h" +#include "gtia.h" +#ifndef BASIC +#include "input.h" +#include "statesav.h" +#endif +#include "pokeysnd.h" +#include "screen.h" + +/* GTIA Registers ---------------------------------------------------------- */ + +UBYTE GTIA_M0PL; +UBYTE GTIA_M1PL; +UBYTE GTIA_M2PL; +UBYTE GTIA_M3PL; +UBYTE GTIA_P0PL; +UBYTE GTIA_P1PL; +UBYTE GTIA_P2PL; +UBYTE GTIA_P3PL; +UBYTE GTIA_HPOSP0; +UBYTE GTIA_HPOSP1; +UBYTE GTIA_HPOSP2; +UBYTE GTIA_HPOSP3; +UBYTE GTIA_HPOSM0; +UBYTE GTIA_HPOSM1; +UBYTE GTIA_HPOSM2; +UBYTE GTIA_HPOSM3; +UBYTE GTIA_SIZEP0; +UBYTE GTIA_SIZEP1; +UBYTE GTIA_SIZEP2; +UBYTE GTIA_SIZEP3; +UBYTE GTIA_SIZEM; +UBYTE GTIA_GRAFP0; +UBYTE GTIA_GRAFP1; +UBYTE GTIA_GRAFP2; +UBYTE GTIA_GRAFP3; +UBYTE GTIA_GRAFM; +UBYTE GTIA_COLPM0; +UBYTE GTIA_COLPM1; +UBYTE GTIA_COLPM2; +UBYTE GTIA_COLPM3; +UBYTE GTIA_COLPF0; +UBYTE GTIA_COLPF1; +UBYTE GTIA_COLPF2; +UBYTE GTIA_COLPF3; +UBYTE GTIA_COLBK; +UBYTE GTIA_PRIOR; +UBYTE GTIA_VDELAY; +UBYTE GTIA_GRACTL; + +/* Internal GTIA state ----------------------------------------------------- */ + +int GTIA_speaker; +int GTIA_consol_override = 0; +static UBYTE consol; +UBYTE consol_mask; +UBYTE GTIA_TRIG[4]; +UBYTE GTIA_TRIG_latch[4]; + +#if defined(BASIC) || defined(CURSES_BASIC) + +static UBYTE PF0PM = 0; +static UBYTE PF1PM = 0; +static UBYTE PF2PM = 0; +static UBYTE PF3PM = 0; +#define GTIA_collisions_mask_missile_playfield 0 +#define GTIA_collisions_mask_player_playfield 0 +#define GTIA_collisions_mask_missile_player 0 +#define GTIA_collisions_mask_player_player 0 + +#else /* defined(BASIC) || defined(CURSES_BASIC) */ + +void set_prior(UBYTE byte); /* in antic.c */ + +/* Player/Missile stuff ---------------------------------------------------- */ + +/* change to 0x00 to disable collisions */ +UBYTE GTIA_collisions_mask_missile_playfield = 0x0f; +UBYTE GTIA_collisions_mask_player_playfield = 0x0f; +UBYTE GTIA_collisions_mask_missile_player = 0x0f; +UBYTE GTIA_collisions_mask_player_player = 0x0f; + +#ifdef NEW_CYCLE_EXACT +/* temporary collision registers for the current scanline only */ +UBYTE P1PL_T; +UBYTE P2PL_T; +UBYTE P3PL_T; +UBYTE M0PL_T; +UBYTE M1PL_T; +UBYTE M2PL_T; +UBYTE M3PL_T; +/* If partial collisions have been generated during a scanline, this + * is the position of the up-to-date collision point , otherwise it is 0 + */ +int collision_curpos; +/* if hitclr has been written to during a scanline, this is the position + * within pm_scaline at which it was written to, and collisions should + * only be generated from this point on, otherwise it is 0 + */ +int hitclr_pos; +#else +#define P1PL_T GTIA_P1PL +#define P2PL_T GTIA_P2PL +#define P3PL_T GTIA_P3PL +#define M0PL_T GTIA_M0PL +#define M1PL_T GTIA_M1PL +#define M2PL_T GTIA_M2PL +#define M3PL_T GTIA_M3PL +#endif /* NEW_CYCLE_EXACT */ + +static UBYTE *hposp_ptr[4]; +static UBYTE *hposm_ptr[4]; +static ULONG hposp_mask[4]; + +static ULONG grafp_lookup[4][256]; +static ULONG *grafp_ptr[4]; +static int global_sizem[4]; + +static const int PM_Width[4] = {1, 2, 1, 4}; + +/* Meaning of bits in GTIA_pm_scanline: +bit 0 - Player 0 +bit 1 - Player 1 +bit 2 - Player 2 +bit 3 - Player 3 +bit 4 - Missile 0 +bit 5 - Missile 1 +bit 6 - Missile 2 +bit 7 - Missile 3 +*/ + +UBYTE GTIA_pm_scanline[Screen_WIDTH / 2 + 8]; /* there's a byte for every *pair* of pixels */ +int GTIA_pm_dirty = TRUE; + +#define C_PM0 0x01 +#define C_PM1 0x02 +#define C_PM01 0x03 +#define C_PM2 0x04 +#define C_PM3 0x05 +#define C_PM23 0x06 +#define C_PM023 0x07 +#define C_PM123 0x08 +#define C_PM0123 0x09 +#define C_PM25 0x0a +#define C_PM35 0x0b +#define C_PM235 0x0c +#define C_COLLS 0x0d +#define C_BAK 0x00 +#define C_HI2 0x20 +#define C_HI3 0x30 +#define C_PF0 0x40 +#define C_PF1 0x50 +#define C_PF2 0x60 +#define C_PF3 0x70 + +#define PF0PM (*(UBYTE *) &ANTIC_cl[C_PF0 | C_COLLS]) +#define PF1PM (*(UBYTE *) &ANTIC_cl[C_PF1 | C_COLLS]) +#define PF2PM (*(UBYTE *) &ANTIC_cl[C_PF2 | C_COLLS]) +#define PF3PM (*(UBYTE *) &ANTIC_cl[C_PF3 | C_COLLS]) + +/* Colours ----------------------------------------------------------------- */ + +#ifdef USE_COLOUR_TRANSLATION_TABLE +UWORD colour_translation_table[256]; +#endif /* USE_COLOUR_TRANSLATION_TABLE */ + +static void setup_gtia9_11(void) { + int i; +#ifdef USE_COLOUR_TRANSLATION_TABLE + UWORD temp; + temp = colour_translation_table[GTIA_COLBK & 0xf0]; + ANTIC_lookup_gtia11[0] = ((ULONG) temp << 16) + temp; + for (i = 1; i < 16; i++) { + temp = colour_translation_table[GTIA_COLBK | i]; + ANTIC_lookup_gtia9[i] = ((ULONG) temp << 16) + temp; + temp = colour_translation_table[GTIA_COLBK | (i << 4)]; + ANTIC_lookup_gtia11[i] = ((ULONG) temp << 16) + temp; + } +#else + ULONG count9 = 0; + ULONG count11 = 0; + ANTIC_lookup_gtia11[0] = ANTIC_lookup_gtia9[0] & 0xf0f0f0f0; + for (i = 1; i < 16; i++) { + ANTIC_lookup_gtia9[i] = ANTIC_lookup_gtia9[0] | (count9 += 0x01010101); + ANTIC_lookup_gtia11[i] = ANTIC_lookup_gtia9[0] | (count11 += 0x10101010); + } +#endif +} + +#endif /* defined(BASIC) || defined(CURSES_BASIC) */ + +/* Initialization ---------------------------------------------------------- */ + +int GTIA_Initialise(int *argc, char *argv[]) +{ +#if !defined(BASIC) && !defined(CURSES_BASIC) + int i; + for (i = 0; i < 256; i++) { + int tmp = i + 0x100; + ULONG grafp1 = 0; + ULONG grafp2 = 0; + ULONG grafp4 = 0; + do { + grafp1 <<= 1; + grafp2 <<= 2; + grafp4 <<= 4; + if (tmp & 1) { + grafp1++; + grafp2 += 3; + grafp4 += 15; + } + tmp >>= 1; + } while (tmp != 1); + grafp_lookup[2][i] = grafp_lookup[0][i] = grafp1; + grafp_lookup[1][i] = grafp2; + grafp_lookup[3][i] = grafp4; + } + memset(ANTIC_cl, GTIA_COLOUR_BLACK, sizeof(ANTIC_cl)); + for (i = 0; i < 32; i++) + GTIA_PutByte((UWORD) i, 0); +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + + return TRUE; +} + +#ifdef NEW_CYCLE_EXACT + +/* generate updated PxPL and MxPL for part of a scanline */ +/* slow, but should be called rarely */ +static void generate_partial_pmpl_colls(int l, int r) +{ + int i; + if (r < 0 || l >= (int) sizeof(GTIA_pm_scanline) / (int) sizeof(GTIA_pm_scanline[0])) + return; + if (r >= (int) sizeof(GTIA_pm_scanline) / (int) sizeof(GTIA_pm_scanline[0])) { + r = (int) sizeof(GTIA_pm_scanline) / (int) sizeof(GTIA_pm_scanline[0]); + } + if (l < 0) + l = 0; + + for (i = l; i <= r; i++) { + UBYTE p = GTIA_pm_scanline[i]; +/* It is possible that some bits are set in PxPL/MxPL here, which would + * not otherwise be set ever in GTIA_NewPmScanline. This is because the + * player collisions are always generated in order in GTIA_NewPmScanline. + * However this does not cause any problem because we never use those bits + * of PxPL/MxPL in the collision reading code. + */ + GTIA_P1PL |= (p & (1 << 1)) ? p : 0; + GTIA_P2PL |= (p & (1 << 2)) ? p : 0; + GTIA_P3PL |= (p & (1 << 3)) ? p : 0; + GTIA_M0PL |= (p & (0x10 << 0)) ? p : 0; + GTIA_M1PL |= (p & (0x10 << 1)) ? p : 0; + GTIA_M2PL |= (p & (0x10 << 2)) ? p : 0; + GTIA_M3PL |= (p & (0x10 << 3)) ? p : 0; + } + +} + +/* update pm->pl collisions for a partial scanline */ +static void update_partial_pmpl_colls(void) +{ + int l = collision_curpos; + int r = ANTIC_XPOS * 2 - 37; + generate_partial_pmpl_colls(l, r); + collision_curpos = r; +} + +/* update pm-> pl collisions at the end of a scanline */ +void GTIA_UpdatePmplColls(void) +{ + if (hitclr_pos != 0){ + generate_partial_pmpl_colls(hitclr_pos, + sizeof(GTIA_pm_scanline) / sizeof(GTIA_pm_scanline[0]) - 1); +/* If hitclr was written to, then only part of GTIA_pm_scanline should be used + * for collisions */ + + } + else { +/* otherwise the whole of pm_scaline can be used for collisions. This will + * update the collision registers based on the generated collisions for the + * current line */ + GTIA_P1PL |= P1PL_T; + GTIA_P2PL |= P2PL_T; + GTIA_P3PL |= P3PL_T; + GTIA_M0PL |= M0PL_T; + GTIA_M1PL |= M1PL_T; + GTIA_M2PL |= M2PL_T; + GTIA_M3PL |= M3PL_T; + } + collision_curpos = 0; + hitclr_pos = 0; +} + +#else +#define update_partial_pmpl_colls() +#endif /* NEW_CYCLE_EXACT */ + +/* Prepare PMG scanline ---------------------------------------------------- */ + +#if !defined(BASIC) && !defined(CURSES_BASIC) + +void GTIA_NewPmScanline(void) +{ +#ifdef NEW_CYCLE_EXACT +/* reset temporary pm->pl collisions */ + P1PL_T = P2PL_T = P3PL_T = 0; + M0PL_T = M1PL_T = M2PL_T = M3PL_T = 0; +#endif /* NEW_CYCLE_EXACT */ +/* Clear if necessary */ + if (GTIA_pm_dirty) { + memset(GTIA_pm_scanline, 0, Screen_WIDTH / 2); + GTIA_pm_dirty = FALSE; + } + +/* Draw Players */ + +#define DO_PLAYER(n) if (GTIA_GRAFP##n) { \ + ULONG grafp = grafp_ptr[n][GTIA_GRAFP##n] & hposp_mask[n]; \ + if (grafp) { \ + UBYTE *ptr = hposp_ptr[n]; \ + GTIA_pm_dirty = TRUE; \ + do { \ + if (grafp & 1) \ + P##n##PL_T |= *ptr |= 1 << n; \ + ptr++; \ + grafp >>= 1; \ + } while (grafp); \ + } \ +} + + /* optimized DO_PLAYER(0): GTIA_pm_scanline is clear and P0PL is unused */ + if (GTIA_GRAFP0) { + ULONG grafp = grafp_ptr[0][GTIA_GRAFP0] & hposp_mask[0]; + if (grafp) { + UBYTE *ptr = hposp_ptr[0]; + GTIA_pm_dirty = TRUE; + do { + if (grafp & 1) + *ptr = 1; + ptr++; + grafp >>= 1; + } while (grafp); + } + } + + DO_PLAYER(1) + DO_PLAYER(2) + DO_PLAYER(3) + +/* Draw Missiles */ + +#define DO_MISSILE(n,p,m,r,l) if (GTIA_GRAFM & m) { \ + int j = global_sizem[n]; \ + UBYTE *ptr = hposm_ptr[n]; \ + if (GTIA_GRAFM & r) { \ + if (GTIA_GRAFM & l) \ + j <<= 1; \ + } \ + else \ + ptr += j; \ + if (ptr < GTIA_pm_scanline + 2) { \ + j += ptr - GTIA_pm_scanline - 2; \ + ptr = GTIA_pm_scanline + 2; \ + } \ + else if (ptr + j > GTIA_pm_scanline + Screen_WIDTH / 2 - 2) \ + j = GTIA_pm_scanline + Screen_WIDTH / 2 - 2 - ptr; \ + if (j > 0) \ + do \ + M##n##PL_T |= *ptr++ |= p; \ + while (--j); \ +} + + if (GTIA_GRAFM) { + GTIA_pm_dirty = TRUE; + DO_MISSILE(3, 0x80, 0xc0, 0x80, 0x40) + DO_MISSILE(2, 0x40, 0x30, 0x20, 0x10) + DO_MISSILE(1, 0x20, 0x0c, 0x08, 0x04) + DO_MISSILE(0, 0x10, 0x03, 0x02, 0x01) + } +} + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + +/* GTIA registers ---------------------------------------------------------- */ + +void GTIA_Frame(void) +{ +#ifdef BASIC + consol = 0xf; +#else + consol = INPUT_key_consol | 0x08; +#endif + + if (GTIA_GRACTL & 4) { + GTIA_TRIG_latch[0] &= GTIA_TRIG[0]; + GTIA_TRIG_latch[1] &= GTIA_TRIG[1]; + GTIA_TRIG_latch[2] &= GTIA_TRIG[2]; + GTIA_TRIG_latch[3] &= GTIA_TRIG[3]; + } +} + +UBYTE GTIA_GetByte(UWORD addr, int no_side_effects) +{ + switch (addr & 0x1f) { + case GTIA_OFFSET_M0PF: + return (((PF0PM & 0x10) >> 4) + + ((PF1PM & 0x10) >> 3) + + ((PF2PM & 0x10) >> 2) + + ((PF3PM & 0x10) >> 1)) & GTIA_collisions_mask_missile_playfield; + case GTIA_OFFSET_M1PF: + return (((PF0PM & 0x20) >> 5) + + ((PF1PM & 0x20) >> 4) + + ((PF2PM & 0x20) >> 3) + + ((PF3PM & 0x20) >> 2)) & GTIA_collisions_mask_missile_playfield; + case GTIA_OFFSET_M2PF: + return (((PF0PM & 0x40) >> 6) + + ((PF1PM & 0x40) >> 5) + + ((PF2PM & 0x40) >> 4) + + ((PF3PM & 0x40) >> 3)) & GTIA_collisions_mask_missile_playfield; + case GTIA_OFFSET_M3PF: + return (((PF0PM & 0x80) >> 7) + + ((PF1PM & 0x80) >> 6) + + ((PF2PM & 0x80) >> 5) + + ((PF3PM & 0x80) >> 4)) & GTIA_collisions_mask_missile_playfield; + case GTIA_OFFSET_P0PF: + return ((PF0PM & 0x01) + + ((PF1PM & 0x01) << 1) + + ((PF2PM & 0x01) << 2) + + ((PF3PM & 0x01) << 3)) & GTIA_collisions_mask_player_playfield; + case GTIA_OFFSET_P1PF: + return (((PF0PM & 0x02) >> 1) + + (PF1PM & 0x02) + + ((PF2PM & 0x02) << 1) + + ((PF3PM & 0x02) << 2)) & GTIA_collisions_mask_player_playfield; + case GTIA_OFFSET_P2PF: + return (((PF0PM & 0x04) >> 2) + + ((PF1PM & 0x04) >> 1) + + (PF2PM & 0x04) + + ((PF3PM & 0x04) << 1)) & GTIA_collisions_mask_player_playfield; + case GTIA_OFFSET_P3PF: + return (((PF0PM & 0x08) >> 3) + + ((PF1PM & 0x08) >> 2) + + ((PF2PM & 0x08) >> 1) + + (PF3PM & 0x08)) & GTIA_collisions_mask_player_playfield; + case GTIA_OFFSET_M0PL: + update_partial_pmpl_colls(); + return GTIA_M0PL & GTIA_collisions_mask_missile_player; + case GTIA_OFFSET_M1PL: + update_partial_pmpl_colls(); + return GTIA_M1PL & GTIA_collisions_mask_missile_player; + case GTIA_OFFSET_M2PL: + update_partial_pmpl_colls(); + return GTIA_M2PL & GTIA_collisions_mask_missile_player; + case GTIA_OFFSET_M3PL: + update_partial_pmpl_colls(); + return GTIA_M3PL & GTIA_collisions_mask_missile_player; + case GTIA_OFFSET_P0PL: + update_partial_pmpl_colls(); + return (((GTIA_P1PL & 0x01) << 1) /* mask in player 1 */ + + ((GTIA_P2PL & 0x01) << 2) /* mask in player 2 */ + + ((GTIA_P3PL & 0x01) << 3)) /* mask in player 3 */ + & GTIA_collisions_mask_player_player; + case GTIA_OFFSET_P1PL: + update_partial_pmpl_colls(); + return ((GTIA_P1PL & 0x01) /* mask in player 0 */ + + ((GTIA_P2PL & 0x02) << 1) /* mask in player 2 */ + + ((GTIA_P3PL & 0x02) << 2)) /* mask in player 3 */ + & GTIA_collisions_mask_player_player; + case GTIA_OFFSET_P2PL: + update_partial_pmpl_colls(); + return ((GTIA_P2PL & 0x03) /* mask in player 0 and 1 */ + + ((GTIA_P3PL & 0x04) << 1)) /* mask in player 3 */ + & GTIA_collisions_mask_player_player; + case GTIA_OFFSET_P3PL: + update_partial_pmpl_colls(); + return (GTIA_P3PL & 0x07) /* mask in player 0,1, and 2 */ + & GTIA_collisions_mask_player_player; + case GTIA_OFFSET_TRIG0: + return GTIA_TRIG[0] & GTIA_TRIG_latch[0]; + case GTIA_OFFSET_TRIG1: + return GTIA_TRIG[1] & GTIA_TRIG_latch[1]; + case GTIA_OFFSET_TRIG2: + return GTIA_TRIG[2] & GTIA_TRIG_latch[2]; + case GTIA_OFFSET_TRIG3: + return GTIA_TRIG[3] & GTIA_TRIG_latch[3]; + case GTIA_OFFSET_PAL: + return (Atari800_tv_mode == Atari800_TV_PAL) ? 0x01 : 0x0f; + case GTIA_OFFSET_CONSOL: + { + UBYTE byte = consol & consol_mask; + if (!no_side_effects && GTIA_consol_override > 0) { + /* Check if we're called from outside OS. This avoids sending + console keystrokes to diagnostic cartridges. */ + if (CPU_regPC < 0xc000) + /* Not from OS. Disable console override. */ + GTIA_consol_override = 0; + else { + --GTIA_consol_override; + if (Atari800_builtin_basic && Atari800_disable_basic && !BINLOAD_loading_basic) + /* Only for XL/XE - hold Option during reboot. */ + byte &= ~INPUT_CONSOL_OPTION; + if (CASSETTE_hold_start && Atari800_machine_type != Atari800_MACHINE_5200) { + /* Only for the computers - hold Start during reboot. */ + byte &= ~INPUT_CONSOL_START; + if (GTIA_consol_override == 0) { + /* press Space after Start to start cassette boot. */ + CASSETTE_press_space = 1; + CASSETTE_hold_start = CASSETTE_hold_start_on_reboot; + } + } + } + } + return byte; + } + default: + break; + } + + return 0xf; +} + +void GTIA_PutByte(UWORD addr, UBYTE byte) +{ +#if !defined(BASIC) && !defined(CURSES_BASIC) + UWORD cword; + UWORD cword2; + +#ifdef NEW_CYCLE_EXACT + int x; /* the cycle-exact update position in GTIA_pm_scanline */ + if (ANTIC_DRAWING_SCREEN) { + if ((addr & 0x1f) != GTIA_PRIOR) { + ANTIC_UpdateScanline(); + } else { + ANTIC_UpdateScanlinePrior(byte); + } + } +#define UPDATE_PM_CYCLE_EXACT if(ANTIC_DRAWING_SCREEN) GTIA_NewPmScanline(); +#else +#define UPDATE_PM_CYCLE_EXACT +#endif + +#endif /* !defined(BASIC) && !defined(CURSES_BASIC) */ + + switch (addr & 0x1f) { + case GTIA_OFFSET_CONSOL: + GTIA_speaker = !(byte & 0x08); +#ifdef CONSOLE_SOUND + POKEYSND_UpdateConsol(1); +#endif + consol_mask = (~byte) & 0x0f; + break; + +#if defined(BASIC) || defined(CURSES_BASIC) + + /* We use these for Antic modes 6, 7 on Curses */ + case GTIA_OFFSET_COLPF0: + GTIA_COLPF0 = byte; + break; + case GTIA_OFFSET_COLPF1: + GTIA_COLPF1 = byte; + break; + case GTIA_OFFSET_COLPF2: + GTIA_COLPF2 = byte; + break; + case GTIA_OFFSET_COLPF3: + GTIA_COLPF3 = byte; + break; + +#else + +#ifdef USE_COLOUR_TRANSLATION_TABLE + case GTIA_OFFSET_COLBK: + GTIA_COLBK = byte &= 0xfe; + ANTIC_cl[C_BAK] = cword = colour_translation_table[byte]; + if (cword != (UWORD) (ANTIC_lookup_gtia9[0]) ) { + ANTIC_lookup_gtia9[0] = cword + (cword << 16); + if (GTIA_PRIOR & 0x40) + setup_gtia9_11(); + } + break; + case GTIA_OFFSET_COLPF0: + GTIA_COLPF0 = byte &= 0xfe; + ANTIC_cl[C_PF0] = cword = GTIA_colour_translation_table[byte]; + if ((GTIA_PRIOR & 1) == 0) { + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF0 | C_PM3] = ANTIC_cl[C_PF0 | C_PM2] = cword; + if ((GTIA_PRIOR & 3) == 0) { + if (GTIA_PRIOR & 0xf) { + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF0 | C_PM1] = ANTIC_cl[C_PF0 | C_PM0] = cword; + if ((GTIA_PRIOR & 0xf) == 0xc) + ANTIC_cl[C_PF0 | C_PM0123] = ANTIC_cl[C_PF0 | C_PM123] = ANTIC_cl[C_PF0 | C_PM023] = cword; + } + else { + ANTIC_cl[C_PF0 | C_PM0] = colour_translation_table[byte | GTIA_COLPM0]; + ANTIC_cl[C_PF0 | C_PM1] = colour_translation_table[byte | GTIA_COLPM1]; + ANTIC_cl[C_PF0 | C_PM01] = colour_translation_table[byte | GTIA_COLPM0 | GTIA_COLPM1]; + } + } + if ((GTIA_PRIOR & 0xf) >= 0xa) + ANTIC_cl[C_PF0 | C_PM25] = cword; + } + break; + case GTIA_OFFSET_COLPF1: + GTIA_COLPF1 = byte &= 0xfe; + ANTIC_cl[C_PF1] = cword = GTIA_colour_translation_table[byte]; + if ((GTIA_PRIOR & 1) == 0) { + ANTIC_cl[C_PF1 | C_PM23] = ANTIC_cl[C_PF1 | C_PM3] = ANTIC_cl[C_PF1 | C_PM2] = cword; + if ((GTIA_PRIOR & 3) == 0) { + if (GTIA_PRIOR & 0xf) { + ANTIC_cl[C_PF1 | C_PM01] = ANTIC_cl[C_PF1 | C_PM1] = ANTIC_cl[C_PF1 | C_PM0] = cword; + if ((GTIA_PRIOR & 0xf) == 0xc) + ANTIC_cl[C_PF1 | C_PM0123] = ANTIC_cl[C_PF1 | C_PM123] = ANTIC_cl[C_PF1 | C_PM023] = cword; + } + else { + ANTIC_cl[C_PF1 | C_PM0] = colour_translation_table[byte | GTIA_COLPM0]; + ANTIC_cl[C_PF1 | C_PM1] = colour_translation_table[byte | GTIA_COLPM1]; + ANTIC_cl[C_PF1 | C_PM01] = colour_translation_table[byte | GTIA_COLPM0 | GTIA_COLPM1]; + } + } + } + { + UBYTE byte2 = (GTIA_COLPF2 & 0xf0) + (byte & 0xf); + ANTIC_cl[C_HI2] = cword = colour_translation_table[byte2]; + ANTIC_cl[C_HI3] = colour_translation_table[(GTIA_COLPF3 & 0xf0) | (byte & 0xf)]; + if (GTIA_PRIOR & 4) + ANTIC_cl[C_HI2 | C_PM01] = ANTIC_cl[C_HI2 | C_PM1] = ANTIC_cl[C_HI2 | C_PM0] = cword; + if ((GTIA_PRIOR & 9) == 0) { + if (GTIA_PRIOR & 0xf) + ANTIC_cl[C_HI2 | C_PM23] = ANTIC_cl[C_HI2 | C_PM3] = ANTIC_cl[C_HI2 | C_PM2] = cword; + else { + ANTIC_cl[C_HI2 | C_PM2] = colour_translation_table[byte2 | (GTIA_COLPM2 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM3] = colour_translation_table[byte2 | (GTIA_COLPM3 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM23] = colour_translation_table[byte2 | ((GTIA_COLPM2 | GTIA_COLPM3) & 0xf0)]; + } + } + } + break; + case GTIA_OFFSET_COLPF2: + GTIA_COLPF2 = byte &= 0xfe; + ANTIC_cl[C_PF2] = cword = GTIA_colour_translation_table[byte]; + { + UBYTE byte2 = (byte & 0xf0) + (GTIA_COLPF1 & 0xf); + ANTIC_cl[C_HI2] = cword2 = colour_translation_table[byte2]; + if (GTIA_PRIOR & 4) { + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PF2 | C_PM0] = cword; + ANTIC_cl[C_HI2 | C_PM01] = ANTIC_cl[C_HI2 | C_PM1] = ANTIC_cl[C_HI2 | C_PM0] = cword2; + } + if ((GTIA_PRIOR & 9) == 0) { + if (GTIA_PRIOR & 0xf) { + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF2 | C_PM3] = ANTIC_cl[C_PF2 | C_PM2] = cword; + ANTIC_cl[C_HI2 | C_PM23] = ANTIC_cl[C_HI2 | C_PM3] = ANTIC_cl[C_HI2 | C_PM2] = cword2; + } + else { + ANTIC_cl[C_PF2 | C_PM2] = colour_translation_table[byte | GTIA_COLPM2]; + ANTIC_cl[C_PF2 | C_PM3] = colour_translation_table[byte | GTIA_COLPM3]; + ANTIC_cl[C_PF2 | C_PM23] = colour_translation_table[byte | GTIA_COLPM2 | GTIA_COLPM3]; + ANTIC_cl[C_HI2 | C_PM2] = colour_translation_table[byte2 | (GTIA_COLPM2 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM3] = colour_translation_table[byte2 | (GTIA_COLPM3 & 0xf0)]; + ANTIC_cl[C_HI2 | C_PM23] = colour_translation_table[byte2 | ((GTIA_COLPM2 | GTIA_COLPM3) & 0xf0)]; + } + } + } + break; + case GTIA_OFFSET_COLPF3: + GTIA_COLPF3 = byte &= 0xfe; + ANTIC_cl[C_PF3] = cword = colour_translation_table[byte]; + ANTIC_cl[C_HI3] = cword2 = colour_translation_table[(byte & 0xf0) | (GTIA_COLPF1 & 0xf)]; + if (GTIA_PRIOR & 4) + ANTIC_cl[C_PF3 | C_PM01] = ANTIC_cl[C_PF3 | C_PM1] = ANTIC_cl[C_PF3 | C_PM0] = cword; + if ((GTIA_PRIOR & 9) == 0) { + if (GTIA_PRIOR & 0xf) + ANTIC_cl[C_PF3 | C_PM23] = ANTIC_cl[C_PF3 | C_PM3] = ANTIC_cl[C_PF3 | C_PM2] = cword; + else { + ANTIC_cl[C_PF3 | C_PM25] = ANTIC_cl[C_PF2 | C_PM25] = ANTIC_cl[C_PM25] = ANTIC_cl[C_PF3 | C_PM2] = colour_translation_table[byte | GTIA_COLPM2]; + ANTIC_cl[C_PF3 | C_PM35] = ANTIC_cl[C_PF2 | C_PM35] = ANTIC_cl[C_PM35] = ANTIC_cl[C_PF3 | C_PM3] = colour_translation_table[byte | GTIA_COLPM3]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23] = colour_translation_table[byte | GTIA_COLPM2 | GTIA_COLPM3]; + ANTIC_cl[C_PF0 | C_PM235] = ANTIC_cl[C_PF0 | C_PM35] = ANTIC_cl[C_PF0 | C_PM25] = + ANTIC_cl[C_PF1 | C_PM235] = ANTIC_cl[C_PF1 | C_PM35] = ANTIC_cl[C_PF1 | C_PM25] = cword; + } + } + break; + case GTIA_OFFSET_COLPM0: + GTIA_COLPM0 = byte &= 0xfe; + ANTIC_cl[C_PM023] = ANTIC_cl[C_PM0] = cword = colour_translation_table[byte]; + { + UBYTE byte2 = byte | GTIA_COLPM1; + ANTIC_cl[C_PM0123] = ANTIC_cl[C_PM01] = cword2 = colour_translation_table[byte2]; + if ((GTIA_PRIOR & 4) == 0) { + ANTIC_cl[C_PF2 | C_PM0] = ANTIC_cl[C_PF3 | C_PM0] = cword; + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF3 | C_PM01] = cword2; + ANTIC_cl[C_HI2 | C_PM0] = colour_translation_table[(byte & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM01] = colour_translation_table[(byte2 & 0xf0) | (GTIA_COLPF1 & 0xf)]; + if ((GTIA_PRIOR & 0xc) == 0) { + if (GTIA_PRIOR & 3) { + ANTIC_cl[C_PF0 | C_PM0] = ANTIC_cl[C_PF1 | C_PM0] = cword; + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF1 | C_PM01] = cword2; + } + else { + ANTIC_cl[C_PF0 | C_PM0] = colour_translation_table[byte | GTIA_COLPF0]; + ANTIC_cl[C_PF1 | C_PM0] = colour_translation_table[byte | GTIA_COLPF1]; + ANTIC_cl[C_PF0 | C_PM01] = colour_translation_table[byte2 | GTIA_COLPF0]; + ANTIC_cl[C_PF1 | C_PM01] = colour_translation_table[byte2 | GTIA_COLPF1]; + } + } + } + } + break; + case GTIA_OFFSET_COLPM1: + GTIA_COLPM1 = byte &= 0xfe; + ANTIC_cl[C_PM123] = ANTIC_cl[C_PM1] = cword = colour_translation_table[byte]; + { + UBYTE byte2 = byte | GTIA_COLPM0; + ANTIC_cl[C_PM0123] = ANTIC_cl[C_PM01] = cword2 = colour_translation_table[byte2]; + if ((GTIA_PRIOR & 4) == 0) { + ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PF3 | C_PM1] = cword; + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF3 | C_PM01] = cword2; + ANTIC_cl[C_HI2 | C_PM1] = colour_translation_table[(byte & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM01] = colour_translation_table[(byte2 & 0xf0) | (GTIA_COLPF1 & 0xf)]; + if ((GTIA_PRIOR & 0xc) == 0) { + if (GTIA_PRIOR & 3) { + ANTIC_cl[C_PF0 | C_PM1] = ANTIC_cl[C_PF1 | C_PM1] = cword; + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF1 | C_PM01] = cword2; + } + else { + ANTIC_cl[C_PF0 | C_PM1] = colour_translation_table[byte | GTIA_COLPF0]; + ANTIC_cl[C_PF1 | C_PM1] = colour_translation_table[byte | GTIA_COLPF1]; + ANTIC_cl[C_PF0 | C_PM01] = colour_translation_table[byte2 | GTIA_COLPF0]; + ANTIC_cl[C_PF1 | C_PM01] = colour_translation_table[byte2 | GTIA_COLPF1]; + } + } + } + } + break; + case GTIA_OFFSET_COLPM2: + GTIA_COLPM2 = byte &= 0xfe; + ANTIC_cl[C_PM2] = cword = colour_translation_table[byte]; + { + UBYTE byte2 = byte | GTIA_COLPM3; + ANTIC_cl[C_PM23] = cword2 = colour_translation_table[byte2]; + if (GTIA_PRIOR & 1) { + ANTIC_cl[C_PF0 | C_PM2] = ANTIC_cl[C_PF1 | C_PM2] = cword; + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF1 | C_PM23] = cword2; + } + if ((GTIA_PRIOR & 6) == 0) { + if (GTIA_PRIOR & 9) { + ANTIC_cl[C_PF2 | C_PM2] = ANTIC_cl[C_PF3 | C_PM2] = cword; + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF3 | C_PM23] = cword2; + ANTIC_cl[C_HI2 | C_PM2] = colour_translation_table[(byte & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM23] = colour_translation_table[(byte2 & 0xf0) | (GTIA_COLPF1 & 0xf)]; + } + else { + ANTIC_cl[C_PF2 | C_PM2] = colour_translation_table[byte | GTIA_COLPF2]; + ANTIC_cl[C_PF3 | C_PM25] = ANTIC_cl[C_PF2 | C_PM25] = ANTIC_cl[C_PM25] = ANTIC_cl[C_PF3 | C_PM2] = colour_translation_table[byte | GTIA_COLPF3]; + ANTIC_cl[C_PF2 | C_PM23] = colour_translation_table[byte2 | GTIA_COLPF2]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23] = colour_translation_table[byte2 | GTIA_COLPF3]; + ANTIC_cl[C_HI2 | C_PM2] = colour_translation_table[((byte | GTIA_COLPF2) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM25] = colour_translation_table[((byte | GTIA_COLPF3) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM23] = colour_translation_table[((byte2 | GTIA_COLPF2) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM235] = colour_translation_table[((byte2 | GTIA_COLPF3) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + } + } + } + break; + case GTIA_OFFSET_COLPM3: + GTIA_COLPM3 = byte &= 0xfe; + ANTIC_cl[C_PM3] = cword = colour_translation_table[byte]; + { + UBYTE byte2 = byte | GTIA_COLPM2; + ANTIC_cl[C_PM23] = cword2 = colour_translation_table[byte2]; + if (GTIA_PRIOR & 1) { + ANTIC_cl[C_PF0 | C_PM3] = ANTIC_cl[C_PF1 | C_PM3] = cword; + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF1 | C_PM23] = cword2; + } + if ((GTIA_PRIOR & 6) == 0) { + if (GTIA_PRIOR & 9) { + ANTIC_cl[C_PF2 | C_PM3] = ANTIC_cl[C_PF3 | C_PM3] = cword; + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF3 | C_PM23] = cword2; + } + else { + ANTIC_cl[C_PF2 | C_PM3] = colour_translation_table[byte | GTIA_COLPF2]; + ANTIC_cl[C_PF3 | C_PM35] = ANTIC_cl[C_PF2 | C_PM35] = ANTIC_cl[C_PM35] = ANTIC_cl[C_PF3 | C_PM3] = colour_translation_table[byte | GTIA_COLPF3]; + ANTIC_cl[C_PF2 | C_PM23] = colour_translation_table[byte2 | GTIA_COLPF2]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23] = colour_translation_table[byte2 | GTIA_COLPF3]; + ANTIC_cl[C_HI2 | C_PM3] = colour_translation_table[((byte | GTIA_COLPF2) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + ANTIC_cl[C_HI2 | C_PM23] = colour_translation_table[((byte2 | GTIA_COLPF2) & 0xf0) | (GTIA_COLPF1 & 0xf)]; + } + } + } + break; +#else /* USE_COLOUR_TRANSLATION_TABLE */ + case GTIA_OFFSET_COLBK: + GTIA_COLBK = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_BAK] = cword; + if (cword != (UWORD) (ANTIC_lookup_gtia9[0]) ) { + ANTIC_lookup_gtia9[0] = cword + (cword << 16); + if (GTIA_PRIOR & 0x40) + setup_gtia9_11(); + } + break; + case GTIA_OFFSET_COLPF0: + GTIA_COLPF0 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PF0] = cword; + if ((GTIA_PRIOR & 1) == 0) { + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF0 | C_PM3] = ANTIC_cl[C_PF0 | C_PM2] = cword; + if ((GTIA_PRIOR & 3) == 0) { + if (GTIA_PRIOR & 0xf) { + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF0 | C_PM1] = ANTIC_cl[C_PF0 | C_PM0] = cword; + if ((GTIA_PRIOR & 0xf) == 0xc) + ANTIC_cl[C_PF0 | C_PM0123] = ANTIC_cl[C_PF0 | C_PM123] = ANTIC_cl[C_PF0 | C_PM023] = cword; + } + else + ANTIC_cl[C_PF0 | C_PM01] = (ANTIC_cl[C_PF0 | C_PM0] = cword | ANTIC_cl[C_PM0]) | (ANTIC_cl[C_PF0 | C_PM1] = cword | ANTIC_cl[C_PM1]); + } + if ((GTIA_PRIOR & 0xf) >= 0xa) + ANTIC_cl[C_PF0 | C_PM25] = cword; + } + break; + case GTIA_OFFSET_COLPF1: + GTIA_COLPF1 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PF1] = cword; + if ((GTIA_PRIOR & 1) == 0) { + ANTIC_cl[C_PF1 | C_PM23] = ANTIC_cl[C_PF1 | C_PM3] = ANTIC_cl[C_PF1 | C_PM2] = cword; + if ((GTIA_PRIOR & 3) == 0) { + if (GTIA_PRIOR & 0xf) { + ANTIC_cl[C_PF1 | C_PM01] = ANTIC_cl[C_PF1 | C_PM1] = ANTIC_cl[C_PF1 | C_PM0] = cword; + if ((GTIA_PRIOR & 0xf) == 0xc) + ANTIC_cl[C_PF1 | C_PM0123] = ANTIC_cl[C_PF1 | C_PM123] = ANTIC_cl[C_PF1 | C_PM023] = cword; + } + else + ANTIC_cl[C_PF1 | C_PM01] = (ANTIC_cl[C_PF1 | C_PM0] = cword | ANTIC_cl[C_PM0]) | (ANTIC_cl[C_PF1 | C_PM1] = cword | ANTIC_cl[C_PM1]); + } + } + ((UBYTE *)ANTIC_hires_lookup_l)[0x80] = ((UBYTE *)ANTIC_hires_lookup_l)[0x41] = (UBYTE) + (ANTIC_hires_lookup_l[0x60] = cword & 0xf0f); + break; + case GTIA_OFFSET_COLPF2: + GTIA_COLPF2 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PF2] = cword; + if (GTIA_PRIOR & 4) + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PF2 | C_PM0] = cword; + if ((GTIA_PRIOR & 9) == 0) { + if (GTIA_PRIOR & 0xf) + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF2 | C_PM3] = ANTIC_cl[C_PF2 | C_PM2] = cword; + else + ANTIC_cl[C_PF2 | C_PM23] = (ANTIC_cl[C_PF2 | C_PM2] = cword | ANTIC_cl[C_PM2]) | (ANTIC_cl[C_PF2 | C_PM3] = cword | ANTIC_cl[C_PM3]); + } + break; + case GTIA_OFFSET_COLPF3: + GTIA_COLPF3 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PF3] = cword; + if (GTIA_PRIOR & 4) + ANTIC_cl[C_PF3 | C_PM01] = ANTIC_cl[C_PF3 | C_PM1] = ANTIC_cl[C_PF3 | C_PM0] = cword; + if ((GTIA_PRIOR & 9) == 0) { + if (GTIA_PRIOR & 0xf) + ANTIC_cl[C_PF3 | C_PM23] = ANTIC_cl[C_PF3 | C_PM3] = ANTIC_cl[C_PF3 | C_PM2] = cword; + else { + ANTIC_cl[C_PF3 | C_PM25] = ANTIC_cl[C_PF2 | C_PM25] = ANTIC_cl[C_PM25] = ANTIC_cl[C_PF3 | C_PM2] = cword | ANTIC_cl[C_PM2]; + ANTIC_cl[C_PF3 | C_PM35] = ANTIC_cl[C_PF2 | C_PM35] = ANTIC_cl[C_PM35] = ANTIC_cl[C_PF3 | C_PM3] = cword | ANTIC_cl[C_PM3]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23] = ANTIC_cl[C_PF3 | C_PM2] | ANTIC_cl[C_PF3 | C_PM3]; + ANTIC_cl[C_PF0 | C_PM235] = ANTIC_cl[C_PF0 | C_PM35] = ANTIC_cl[C_PF0 | C_PM25] = + ANTIC_cl[C_PF1 | C_PM235] = ANTIC_cl[C_PF1 | C_PM35] = ANTIC_cl[C_PF1 | C_PM25] = cword; + } + } + break; + case GTIA_OFFSET_COLPM0: + GTIA_COLPM0 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PM023] = ANTIC_cl[C_PM0] = cword; + ANTIC_cl[C_PM0123] = ANTIC_cl[C_PM01] = cword2 = cword | ANTIC_cl[C_PM1]; + if ((GTIA_PRIOR & 4) == 0) { + ANTIC_cl[C_PF2 | C_PM0] = ANTIC_cl[C_PF3 | C_PM0] = cword; + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF3 | C_PM01] = cword2; + if ((GTIA_PRIOR & 0xc) == 0) { + if (GTIA_PRIOR & 3) { + ANTIC_cl[C_PF0 | C_PM0] = ANTIC_cl[C_PF1 | C_PM0] = cword; + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF1 | C_PM01] = cword2; + } + else { + ANTIC_cl[C_PF0 | C_PM0] = cword | ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM0] = cword | ANTIC_cl[C_PF1]; + ANTIC_cl[C_PF0 | C_PM01] = cword2 | ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM01] = cword2 | ANTIC_cl[C_PF1]; + } + } + } + break; + case GTIA_OFFSET_COLPM1: + GTIA_COLPM1 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PM123] = ANTIC_cl[C_PM1] = cword; + ANTIC_cl[C_PM0123] = ANTIC_cl[C_PM01] = cword2 = cword | ANTIC_cl[C_PM0]; + if ((GTIA_PRIOR & 4) == 0) { + ANTIC_cl[C_PF2 | C_PM1] = ANTIC_cl[C_PF3 | C_PM1] = cword; + ANTIC_cl[C_PF2 | C_PM01] = ANTIC_cl[C_PF3 | C_PM01] = cword2; + if ((GTIA_PRIOR & 0xc) == 0) { + if (GTIA_PRIOR & 3) { + ANTIC_cl[C_PF0 | C_PM1] = ANTIC_cl[C_PF1 | C_PM1] = cword; + ANTIC_cl[C_PF0 | C_PM01] = ANTIC_cl[C_PF1 | C_PM01] = cword2; + } + else { + ANTIC_cl[C_PF0 | C_PM1] = cword | ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM1] = cword | ANTIC_cl[C_PF1]; + ANTIC_cl[C_PF0 | C_PM01] = cword2 | ANTIC_cl[C_PF0]; + ANTIC_cl[C_PF1 | C_PM01] = cword2 | ANTIC_cl[C_PF1]; + } + } + } + break; + case GTIA_OFFSET_COLPM2: + GTIA_COLPM2 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PM2] = cword; + ANTIC_cl[C_PM23] = cword2 = cword | ANTIC_cl[C_PM3]; + if (GTIA_PRIOR & 1) { + ANTIC_cl[C_PF0 | C_PM2] = ANTIC_cl[C_PF1 | C_PM2] = cword; + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF1 | C_PM23] = cword2; + } + if ((GTIA_PRIOR & 6) == 0) { + if (GTIA_PRIOR & 9) { + ANTIC_cl[C_PF2 | C_PM2] = ANTIC_cl[C_PF3 | C_PM2] = cword; + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF3 | C_PM23] = cword2; + } + else { + ANTIC_cl[C_PF2 | C_PM2] = cword | ANTIC_cl[C_PF2]; + ANTIC_cl[C_PF3 | C_PM25] = ANTIC_cl[C_PF2 | C_PM25] = ANTIC_cl[C_PM25] = ANTIC_cl[C_PF3 | C_PM2] = cword | ANTIC_cl[C_PF3]; + ANTIC_cl[C_PF2 | C_PM23] = cword2 | ANTIC_cl[C_PF2]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23] = cword2 | ANTIC_cl[C_PF3]; + } + } + break; + case GTIA_OFFSET_COLPM3: + GTIA_COLPM3 = byte &= 0xfe; + GTIA_COLOUR_TO_WORD(cword,byte); + ANTIC_cl[C_PM3] = cword; + ANTIC_cl[C_PM23] = cword2 = cword | ANTIC_cl[C_PM2]; + if (GTIA_PRIOR & 1) { + ANTIC_cl[C_PF0 | C_PM3] = ANTIC_cl[C_PF1 | C_PM3] = cword; + ANTIC_cl[C_PF0 | C_PM23] = ANTIC_cl[C_PF1 | C_PM23] = cword2; + } + if ((GTIA_PRIOR & 6) == 0) { + if (GTIA_PRIOR & 9) { + ANTIC_cl[C_PF2 | C_PM3] = ANTIC_cl[C_PF3 | C_PM3] = cword; + ANTIC_cl[C_PF2 | C_PM23] = ANTIC_cl[C_PF3 | C_PM23] = cword2; + } + else { + ANTIC_cl[C_PF2 | C_PM3] = cword | ANTIC_cl[C_PF2]; + ANTIC_cl[C_PF3 | C_PM35] = ANTIC_cl[C_PF2 | C_PM35] = ANTIC_cl[C_PM35] = ANTIC_cl[C_PF3 | C_PM3] = cword | ANTIC_cl[C_PF3]; + ANTIC_cl[C_PF2 | C_PM23] = cword2 | ANTIC_cl[C_PF2]; + ANTIC_cl[C_PF3 | C_PM235] = ANTIC_cl[C_PF2 | C_PM235] = ANTIC_cl[C_PM235] = ANTIC_cl[C_PF3 | C_PM23] = cword2 | ANTIC_cl[C_PF3]; + } + } + break; +#endif /* USE_COLOUR_TRANSLATION_TABLE */ + case GTIA_OFFSET_GRAFM: + GTIA_GRAFM = byte; + UPDATE_PM_CYCLE_EXACT + break; + +#ifdef NEW_CYCLE_EXACT +#define CYCLE_EXACT_GRAFP(n) x = ANTIC_XPOS * 2 - 3;\ + if (GTIA_HPOSP##n >= x) {\ + /* hpos right of x */\ + /* redraw */ \ + UPDATE_PM_CYCLE_EXACT\ + } +#else +#define CYCLE_EXACT_GRAFP(n) +#endif /* NEW_CYCLE_EXACT */ + +#define DO_GRAFP(n) case GTIA_OFFSET_GRAFP##n:\ + GTIA_GRAFP##n = byte;\ + CYCLE_EXACT_GRAFP(n);\ + break; + + DO_GRAFP(0) + DO_GRAFP(1) + DO_GRAFP(2) + DO_GRAFP(3) + + case GTIA_OFFSET_HITCLR: + GTIA_M0PL = GTIA_M1PL = GTIA_M2PL = GTIA_M3PL = 0; + GTIA_P0PL = GTIA_P1PL = GTIA_P2PL = GTIA_P3PL = 0; + PF0PM = PF1PM = PF2PM = PF3PM = 0; +#ifdef NEW_CYCLE_EXACT + hitclr_pos = ANTIC_XPOS * 2 - 37; + collision_curpos = hitclr_pos; +#endif + break; +/* TODO: cycle-exact missile HPOS, GRAF, SIZE */ +/* this is only an approximation */ + case GTIA_OFFSET_HPOSM0: + GTIA_HPOSM0 = byte; + hposm_ptr[0] = GTIA_pm_scanline + byte - 0x20; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_HPOSM1: + GTIA_HPOSM1 = byte; + hposm_ptr[1] = GTIA_pm_scanline + byte - 0x20; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_HPOSM2: + GTIA_HPOSM2 = byte; + hposm_ptr[2] = GTIA_pm_scanline + byte - 0x20; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_HPOSM3: + GTIA_HPOSM3 = byte; + hposm_ptr[3] = GTIA_pm_scanline + byte - 0x20; + UPDATE_PM_CYCLE_EXACT + break; + +#ifdef NEW_CYCLE_EXACT +#define CYCLE_EXACT_HPOSP(n) x = ANTIC_XPOS * 2 - 1;\ + if (GTIA_HPOSP##n < x && byte < x) {\ + /* case 1: both left of x */\ + /* do nothing */\ + }\ + else if (GTIA_HPOSP##n >= x && byte >= x ) {\ + /* case 2: both right of x */\ + /* redraw, clearing first */\ + UPDATE_PM_CYCLE_EXACT\ + }\ + else if (GTIA_HPOSP##n = x) {\ + /* case 3: new value is right, old value is left */\ + /* redraw without clearing first */\ + /* note: a hack, we can get away with it unless another change occurs */\ + /* before the original copy that wasn't erased due to changing */\ + /* GTIA_pm_dirty is drawn */\ + GTIA_pm_dirty = FALSE;\ + UPDATE_PM_CYCLE_EXACT\ + GTIA_pm_dirty = TRUE; /* can't trust that it was reset correctly */\ + }\ + else {\ + /* case 4: new value is left, old value is right */\ + /* remove old player and don't draw the new one */\ + UBYTE save_graf = GTIA_GRAFP##n;\ + GTIA_GRAFP##n = 0;\ + UPDATE_PM_CYCLE_EXACT\ + GTIA_GRAFP##n = save_graf;\ + } +#else +#define CYCLE_EXACT_HPOSP(n) +#endif /* NEW_CYCLE_EXACT */ +#define DO_HPOSP(n) case GTIA_OFFSET_HPOSP##n: \ + hposp_ptr[n] = GTIA_pm_scanline + byte - 0x20; \ + if (byte >= 0x22) { \ + if (byte > 0xbe) { \ + if (byte >= 0xde) \ + hposp_mask[n] = 0; \ + else \ + hposp_mask[n] = 0xffffffff >> (byte - 0xbe); \ + } \ + else \ + hposp_mask[n] = 0xffffffff; \ + } \ + else if (byte > 2) \ + hposp_mask[n] = 0xffffffff << (0x22 - byte); \ + else \ + hposp_mask[n] = 0; \ + CYCLE_EXACT_HPOSP(n)\ + GTIA_HPOSP##n = byte; \ + break; + + DO_HPOSP(0) + DO_HPOSP(1) + DO_HPOSP(2) + DO_HPOSP(3) + +/* TODO: cycle-exact size changes */ +/* this is only an approximation */ + case GTIA_OFFSET_SIZEM: + GTIA_SIZEM = byte; + global_sizem[0] = PM_Width[byte & 0x03]; + global_sizem[1] = PM_Width[(byte & 0x0c) >> 2]; + global_sizem[2] = PM_Width[(byte & 0x30) >> 4]; + global_sizem[3] = PM_Width[(byte & 0xc0) >> 6]; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_SIZEP0: + GTIA_SIZEP0 = byte; + grafp_ptr[0] = grafp_lookup[byte & 3]; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_SIZEP1: + GTIA_SIZEP1 = byte; + grafp_ptr[1] = grafp_lookup[byte & 3]; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_SIZEP2: + GTIA_SIZEP2 = byte; + grafp_ptr[2] = grafp_lookup[byte & 3]; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_SIZEP3: + GTIA_SIZEP3 = byte; + grafp_ptr[3] = grafp_lookup[byte & 3]; + UPDATE_PM_CYCLE_EXACT + break; + case GTIA_OFFSET_PRIOR: + ANTIC_SetPrior(byte); + GTIA_PRIOR = byte; + if (byte & 0x40) + setup_gtia9_11(); + break; + case GTIA_OFFSET_VDELAY: + GTIA_VDELAY = byte; + break; + case GTIA_OFFSET_GRACTL: + GTIA_GRACTL = byte; + ANTIC_missile_gra_enabled = (byte & 0x01); + ANTIC_player_gra_enabled = (byte & 0x02); + ANTIC_player_flickering = ((ANTIC_player_dma_enabled | ANTIC_player_gra_enabled) == 0x02); + ANTIC_missile_flickering = ((ANTIC_missile_dma_enabled | ANTIC_missile_gra_enabled) == 0x01); + if ((byte & 4) == 0) + GTIA_TRIG_latch[0] = GTIA_TRIG_latch[1] = GTIA_TRIG_latch[2] = GTIA_TRIG_latch[3] = 1; + break; + +#endif /* defined(BASIC) || defined(CURSES_BASIC) */ + } +} + +/* State ------------------------------------------------------------------- */ + +#ifndef BASIC + +void GTIA_StateSave(void) +{ + int next_console_value = 7; + + StateSav_SaveUBYTE(>IA_HPOSP0, 1); + StateSav_SaveUBYTE(>IA_HPOSP1, 1); + StateSav_SaveUBYTE(>IA_HPOSP2, 1); + StateSav_SaveUBYTE(>IA_HPOSP3, 1); + StateSav_SaveUBYTE(>IA_HPOSM0, 1); + StateSav_SaveUBYTE(>IA_HPOSM1, 1); + StateSav_SaveUBYTE(>IA_HPOSM2, 1); + StateSav_SaveUBYTE(>IA_HPOSM3, 1); + StateSav_SaveUBYTE(&PF0PM, 1); + StateSav_SaveUBYTE(&PF1PM, 1); + StateSav_SaveUBYTE(&PF2PM, 1); + StateSav_SaveUBYTE(&PF3PM, 1); + StateSav_SaveUBYTE(>IA_M0PL, 1); + StateSav_SaveUBYTE(>IA_M1PL, 1); + StateSav_SaveUBYTE(>IA_M2PL, 1); + StateSav_SaveUBYTE(>IA_M3PL, 1); + StateSav_SaveUBYTE(>IA_P0PL, 1); + StateSav_SaveUBYTE(>IA_P1PL, 1); + StateSav_SaveUBYTE(>IA_P2PL, 1); + StateSav_SaveUBYTE(>IA_P3PL, 1); + StateSav_SaveUBYTE(>IA_SIZEP0, 1); + StateSav_SaveUBYTE(>IA_SIZEP1, 1); + StateSav_SaveUBYTE(>IA_SIZEP2, 1); + StateSav_SaveUBYTE(>IA_SIZEP3, 1); + StateSav_SaveUBYTE(>IA_SIZEM, 1); + StateSav_SaveUBYTE(>IA_GRAFP0, 1); + StateSav_SaveUBYTE(>IA_GRAFP1, 1); + StateSav_SaveUBYTE(>IA_GRAFP2, 1); + StateSav_SaveUBYTE(>IA_GRAFP3, 1); + StateSav_SaveUBYTE(>IA_GRAFM, 1); + StateSav_SaveUBYTE(>IA_COLPM0, 1); + StateSav_SaveUBYTE(>IA_COLPM1, 1); + StateSav_SaveUBYTE(>IA_COLPM2, 1); + StateSav_SaveUBYTE(>IA_COLPM3, 1); + StateSav_SaveUBYTE(>IA_COLPF0, 1); + StateSav_SaveUBYTE(>IA_COLPF1, 1); + StateSav_SaveUBYTE(>IA_COLPF2, 1); + StateSav_SaveUBYTE(>IA_COLPF3, 1); + StateSav_SaveUBYTE(>IA_COLBK, 1); + StateSav_SaveUBYTE(>IA_PRIOR, 1); + StateSav_SaveUBYTE(>IA_VDELAY, 1); + StateSav_SaveUBYTE(>IA_GRACTL, 1); + + StateSav_SaveUBYTE(&consol_mask, 1); + StateSav_SaveINT(>IA_speaker, 1); + StateSav_SaveINT(&next_console_value, 1); + StateSav_SaveUBYTE(GTIA_TRIG_latch, 4); +} + +void GTIA_StateRead(UBYTE version) +{ + int next_console_value; /* ignored */ + + StateSav_ReadUBYTE(>IA_HPOSP0, 1); + StateSav_ReadUBYTE(>IA_HPOSP1, 1); + StateSav_ReadUBYTE(>IA_HPOSP2, 1); + StateSav_ReadUBYTE(>IA_HPOSP3, 1); + StateSav_ReadUBYTE(>IA_HPOSM0, 1); + StateSav_ReadUBYTE(>IA_HPOSM1, 1); + StateSav_ReadUBYTE(>IA_HPOSM2, 1); + StateSav_ReadUBYTE(>IA_HPOSM3, 1); + StateSav_ReadUBYTE(&PF0PM, 1); + StateSav_ReadUBYTE(&PF1PM, 1); + StateSav_ReadUBYTE(&PF2PM, 1); + StateSav_ReadUBYTE(&PF3PM, 1); + StateSav_ReadUBYTE(>IA_M0PL, 1); + StateSav_ReadUBYTE(>IA_M1PL, 1); + StateSav_ReadUBYTE(>IA_M2PL, 1); + StateSav_ReadUBYTE(>IA_M3PL, 1); + StateSav_ReadUBYTE(>IA_P0PL, 1); + StateSav_ReadUBYTE(>IA_P1PL, 1); + StateSav_ReadUBYTE(>IA_P2PL, 1); + StateSav_ReadUBYTE(>IA_P3PL, 1); + StateSav_ReadUBYTE(>IA_SIZEP0, 1); + StateSav_ReadUBYTE(>IA_SIZEP1, 1); + StateSav_ReadUBYTE(>IA_SIZEP2, 1); + StateSav_ReadUBYTE(>IA_SIZEP3, 1); + StateSav_ReadUBYTE(>IA_SIZEM, 1); + StateSav_ReadUBYTE(>IA_GRAFP0, 1); + StateSav_ReadUBYTE(>IA_GRAFP1, 1); + StateSav_ReadUBYTE(>IA_GRAFP2, 1); + StateSav_ReadUBYTE(>IA_GRAFP3, 1); + StateSav_ReadUBYTE(>IA_GRAFM, 1); + StateSav_ReadUBYTE(>IA_COLPM0, 1); + StateSav_ReadUBYTE(>IA_COLPM1, 1); + StateSav_ReadUBYTE(>IA_COLPM2, 1); + StateSav_ReadUBYTE(>IA_COLPM3, 1); + StateSav_ReadUBYTE(>IA_COLPF0, 1); + StateSav_ReadUBYTE(>IA_COLPF1, 1); + StateSav_ReadUBYTE(>IA_COLPF2, 1); + StateSav_ReadUBYTE(>IA_COLPF3, 1); + StateSav_ReadUBYTE(>IA_COLBK, 1); + StateSav_ReadUBYTE(>IA_PRIOR, 1); + StateSav_ReadUBYTE(>IA_VDELAY, 1); + StateSav_ReadUBYTE(>IA_GRACTL, 1); + + StateSav_ReadUBYTE(&consol_mask, 1); + StateSav_ReadINT(>IA_speaker, 1); + StateSav_ReadINT(&next_console_value, 1); + if (version >= 7) + StateSav_ReadUBYTE(GTIA_TRIG_latch, 4); + + GTIA_PutByte(GTIA_OFFSET_HPOSP0, GTIA_HPOSP0); + GTIA_PutByte(GTIA_OFFSET_HPOSP1, GTIA_HPOSP1); + GTIA_PutByte(GTIA_OFFSET_HPOSP2, GTIA_HPOSP2); + GTIA_PutByte(GTIA_OFFSET_HPOSP3, GTIA_HPOSP3); + GTIA_PutByte(GTIA_OFFSET_HPOSM0, GTIA_HPOSM0); + GTIA_PutByte(GTIA_OFFSET_HPOSM1, GTIA_HPOSM1); + GTIA_PutByte(GTIA_OFFSET_HPOSM2, GTIA_HPOSM2); + GTIA_PutByte(GTIA_OFFSET_HPOSM3, GTIA_HPOSM3); + GTIA_PutByte(GTIA_OFFSET_SIZEP0, GTIA_SIZEP0); + GTIA_PutByte(GTIA_OFFSET_SIZEP1, GTIA_SIZEP1); + GTIA_PutByte(GTIA_OFFSET_SIZEP2, GTIA_SIZEP2); + GTIA_PutByte(GTIA_OFFSET_SIZEP3, GTIA_SIZEP3); + GTIA_PutByte(GTIA_OFFSET_SIZEM, GTIA_SIZEM); + GTIA_PutByte(GTIA_OFFSET_GRAFP0, GTIA_GRAFP0); + GTIA_PutByte(GTIA_OFFSET_GRAFP1, GTIA_GRAFP1); + GTIA_PutByte(GTIA_OFFSET_GRAFP2, GTIA_GRAFP2); + GTIA_PutByte(GTIA_OFFSET_GRAFP3, GTIA_GRAFP3); + GTIA_PutByte(GTIA_OFFSET_GRAFM, GTIA_GRAFM); + GTIA_PutByte(GTIA_OFFSET_COLPM0, GTIA_COLPM0); + GTIA_PutByte(GTIA_OFFSET_COLPM1, GTIA_COLPM1); + GTIA_PutByte(GTIA_OFFSET_COLPM2, GTIA_COLPM2); + GTIA_PutByte(GTIA_OFFSET_COLPM3, GTIA_COLPM3); + GTIA_PutByte(GTIA_OFFSET_COLPF0, GTIA_COLPF0); + GTIA_PutByte(GTIA_OFFSET_COLPF1, GTIA_COLPF1); + GTIA_PutByte(GTIA_OFFSET_COLPF2, GTIA_COLPF2); + GTIA_PutByte(GTIA_OFFSET_COLPF3, GTIA_COLPF3); + GTIA_PutByte(GTIA_OFFSET_COLBK, GTIA_COLBK); + GTIA_PutByte(GTIA_OFFSET_PRIOR, GTIA_PRIOR); + GTIA_PutByte(GTIA_OFFSET_GRACTL, GTIA_GRACTL); +} + +#endif /* BASIC */ diff --git a/PVAtari800/atari800-src/gtia.h b/PVAtari800/atari800-src/gtia.h new file mode 100644 index 0000000000..2a00f95d9c --- /dev/null +++ b/PVAtari800/atari800-src/gtia.h @@ -0,0 +1,138 @@ +#ifndef GTIA_H_ +#define GTIA_H_ + +#include "atari.h" +#include "screen.h" + +#define GTIA_OFFSET_HPOSP0 0x00 +#define GTIA_OFFSET_M0PF 0x00 +#define GTIA_OFFSET_HPOSP1 0x01 +#define GTIA_OFFSET_M1PF 0x01 +#define GTIA_OFFSET_HPOSP2 0x02 +#define GTIA_OFFSET_M2PF 0x02 +#define GTIA_OFFSET_HPOSP3 0x03 +#define GTIA_OFFSET_M3PF 0x03 +#define GTIA_OFFSET_HPOSM0 0x04 +#define GTIA_OFFSET_P0PF 0x04 +#define GTIA_OFFSET_HPOSM1 0x05 +#define GTIA_OFFSET_P1PF 0x05 +#define GTIA_OFFSET_HPOSM2 0x06 +#define GTIA_OFFSET_P2PF 0x06 +#define GTIA_OFFSET_HPOSM3 0x07 +#define GTIA_OFFSET_P3PF 0x07 +#define GTIA_OFFSET_SIZEP0 0x08 +#define GTIA_OFFSET_M0PL 0x08 +#define GTIA_OFFSET_SIZEP1 0x09 +#define GTIA_OFFSET_M1PL 0x09 +#define GTIA_OFFSET_SIZEP2 0x0a +#define GTIA_OFFSET_M2PL 0x0a +#define GTIA_OFFSET_SIZEP3 0x0b +#define GTIA_OFFSET_M3PL 0x0b +#define GTIA_OFFSET_SIZEM 0x0c +#define GTIA_OFFSET_P0PL 0x0c +#define GTIA_OFFSET_GRAFP0 0x0d +#define GTIA_OFFSET_P1PL 0x0d +#define GTIA_OFFSET_GRAFP1 0x0e +#define GTIA_OFFSET_P2PL 0x0e +#define GTIA_OFFSET_GRAFP2 0x0f +#define GTIA_OFFSET_P3PL 0x0f +#define GTIA_OFFSET_GRAFP3 0x10 +#define GTIA_OFFSET_TRIG0 0x10 +#define GTIA_OFFSET_GRAFM 0x11 +#define GTIA_OFFSET_TRIG1 0x11 +#define GTIA_OFFSET_COLPM0 0x12 +#define GTIA_OFFSET_TRIG2 0x12 +#define GTIA_OFFSET_COLPM1 0x13 +#define GTIA_OFFSET_TRIG3 0x13 +#define GTIA_OFFSET_COLPM2 0x14 +#define GTIA_OFFSET_PAL 0x14 +#define GTIA_OFFSET_COLPM3 0x15 +#define GTIA_OFFSET_COLPF0 0x16 +#define GTIA_OFFSET_COLPF1 0x17 +#define GTIA_OFFSET_COLPF2 0x18 +#define GTIA_OFFSET_COLPF3 0x19 +#define GTIA_OFFSET_COLBK 0x1a +#define GTIA_OFFSET_PRIOR 0x1b +#define GTIA_OFFSET_VDELAY 0x1c +#define GTIA_OFFSET_GRACTL 0x1d +#define GTIA_OFFSET_HITCLR 0x1e +#define GTIA_OFFSET_CONSOL 0x1f + +extern UBYTE GTIA_GRAFM; +extern UBYTE GTIA_GRAFP0; +extern UBYTE GTIA_GRAFP1; +extern UBYTE GTIA_GRAFP2; +extern UBYTE GTIA_GRAFP3; +extern UBYTE GTIA_HPOSP0; +extern UBYTE GTIA_HPOSP1; +extern UBYTE GTIA_HPOSP2; +extern UBYTE GTIA_HPOSP3; +extern UBYTE GTIA_HPOSM0; +extern UBYTE GTIA_HPOSM1; +extern UBYTE GTIA_HPOSM2; +extern UBYTE GTIA_HPOSM3; +extern UBYTE GTIA_SIZEP0; +extern UBYTE GTIA_SIZEP1; +extern UBYTE GTIA_SIZEP2; +extern UBYTE GTIA_SIZEP3; +extern UBYTE GTIA_SIZEM; +extern UBYTE GTIA_COLPM0; +extern UBYTE GTIA_COLPM1; +extern UBYTE GTIA_COLPM2; +extern UBYTE GTIA_COLPM3; +extern UBYTE GTIA_COLPF0; +extern UBYTE GTIA_COLPF1; +extern UBYTE GTIA_COLPF2; +extern UBYTE GTIA_COLPF3; +extern UBYTE GTIA_COLBK; +extern UBYTE GTIA_GRACTL; +extern UBYTE GTIA_M0PL; +extern UBYTE GTIA_M1PL; +extern UBYTE GTIA_M2PL; +extern UBYTE GTIA_M3PL; +extern UBYTE GTIA_P0PL; +extern UBYTE GTIA_P1PL; +extern UBYTE GTIA_P2PL; +extern UBYTE GTIA_P3PL; +extern UBYTE GTIA_PRIOR; +extern UBYTE GTIA_VDELAY; + +#ifdef USE_COLOUR_TRANSLATION_TABLE + +extern UWORD GTIA_colour_translation_table[256]; +#define GTIA_COLOUR_BLACK GTIA_colour_translation_table[0] +#define GTIA_COLOUR_TO_WORD(dest,src) dest = GTIA_colour_translation_table[src]; + +#else + +#define GTIA_COLOUR_BLACK 0 +#define GTIA_COLOUR_TO_WORD(dest,src) dest = (((UWORD) (src)) << 8) | (src); + +#endif /* USE_COLOUR_TRANSLATION_TABLE */ + +extern UBYTE GTIA_pm_scanline[Screen_WIDTH / 2 + 8]; /* there's a byte for every *pair* of pixels */ +extern int GTIA_pm_dirty; + +extern UBYTE GTIA_collisions_mask_missile_playfield; +extern UBYTE GTIA_collisions_mask_player_playfield; +extern UBYTE GTIA_collisions_mask_missile_player; +extern UBYTE GTIA_collisions_mask_player_player; + +extern UBYTE GTIA_TRIG[4]; +extern UBYTE GTIA_TRIG_latch[4]; + +extern int GTIA_consol_override; +extern int GTIA_speaker; + +int GTIA_Initialise(int *argc, char *argv[]); +void GTIA_Frame(void); +void GTIA_NewPmScanline(void); +UBYTE GTIA_GetByte(UWORD addr, int no_side_effects); +void GTIA_PutByte(UWORD addr, UBYTE byte); +void GTIA_StateSave(void); +void GTIA_StateRead(UBYTE version); + +#ifdef NEW_CYCLE_EXACT +void GTIA_UpdatePmplColls(void); +#endif +#endif /* GTIA_H_ */ diff --git a/PVAtari800/atari800-src/ide.c b/PVAtari800/atari800-src/ide.c new file mode 100644 index 0000000000..06fc6ade64 --- /dev/null +++ b/PVAtari800/atari800-src/ide.c @@ -0,0 +1,910 @@ +/* + * ide.c - Emulate IDE interface + * + * Copyright (C) 2010 Ivo van Poorten + * + * Based on QEMU IDE disk emulator (hw/ide/{core.c,microdrive.c,mmio.c}) + * Copyright (C) 2003 Fabrice Bellard + * Copyright (C) 2006 Openhand Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. +*/ + +/* Emulate 8-bit and 16-bit IDE interface at $D500-$D50F + * + * Eight 16-bit IDE registers: + * + * LSB (bit 0..7) at 0xd500-0xd507 + * MSB (bit 8..15) at 0xd508-0xd50f + * + * Full 16-bits are read and written when accessing the LSB (latch) + * + * If the MSB is ignored, the interface is compatible with MyIDE + * + * 16-bit operations: + * + * Read: read LSB (device returns 1 16-bit word), read MSB + * Write: write MSB, write LSB (16-bit word is written to device) + */ + +#define _XOPEN_SOURCE 500 + +#include "config.h" +/* allow non-ansi fseek/ftell functions */ +#ifdef __STRICT_ANSI__ +# undef __STRICT_ANSI__ +# include +# define __STRICT_ANSI__ 1 +#else +# include +#endif +#include "ide.h" +#include "atari.h" +#include "log.h" +#include "util.h" +#include "ide_internal.h" + +#include +#ifdef HAVE_INTTYPES_H +# include +#endif +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#define SECTOR_SIZE 512 +#define STD_HEADS 16 +#define STD_SECTORS 63 + +#if defined (HAVE_WINDOWS_H) +# define fseeko fseeko64 +# define ftello ftello64 +#elif defined (__BEOS__) +# define fseeko _fseek +# define ftello _ftell +# define PRId64 "lld" +#elif defined (__DJGPP__) +# define fseeko fseek +# define ftello ftell +# define PRId64 "lld" +#endif + +int IDE_enabled = 0, IDE_debug = 0; + +struct ide_device device; + +static int count = 0; /* for debug stuff */ + +static inline void padstr(uint8_t *str, const char *src, int len) { + int i; + for(i = 0; i < len; i++) + str[i^1] = *src ? *src++ : ' '; +} + +#define LE16(x,y,z) (x)[(y)<<1] = (z)&0xff; (x)[((y)<<1)+1] = ((uint16_t)z)>>8; + +static void ide_identify(struct ide_device *s) { + unsigned int oldsize; + uint8_t *p = s->io_buffer; + memset(p, 0, 512); + + LE16(p, 0, GCBI_FIXED_DRIVE); + LE16(p, 1, s->cylinders); + LE16(p, 3, s->heads); +/* + LE16(p, 4, 512 * s->sectors); // bytes per track, obsolete ATA2 + LE16(p, 5, 512); // bytes per sector, obsolete ATA2 +*/ + LE16(p, 6, s->sectors); /* sectors per track */ + + padstr(p+10*2, s->drive_serial_str, 20); + +/* + LE16(p, 20, 3); // buffer type, obsolete ATA2 + LE16(p, 21, 16); // cache size in sectors, obsolete ATA2 +*/ + LE16(p, 22, 4); /* number of ECC bytes */ + + padstr(p+23*2, PACKAGE_VERSION, 8); + padstr(p+27*2, "ATARI800 HARDDISK", 40); + + if (MAX_MULT_SECTORS > 1) + LE16(p, 47, 0x8000 | MAX_MULT_SECTORS); + + LE16(p, 48, 0); /* cannot perform double word I/O */ + LE16(p, 49, CAP_LBA_SUPPORTED); + LE16(p, 51, 0x0200); /* PIO transfer cycle */ +/* + LE16(p, 52, 0x0200); // DMA transfer cycle, obsolete ATA3 +*/ + LE16(p, 53, 1/*+2+4*/); /* words 54-58[,64-70,88] are valid */ + LE16(p, 54, s->cylinders); + LE16(p, 55, s->heads); + LE16(p, 56, s->sectors); + oldsize = s->cylinders * s->heads * s->sectors; + LE16(p, 57, oldsize); + LE16(p, 58, oldsize >> 16); + if (s->mult_sectors) + LE16(p, 59, 0x100 | s->mult_sectors); + + LE16(p, 60, s->nb_sectors); /* total number of LBA sectors */ + LE16(p, 61, s->nb_sectors >> 16); + + if (s->is_cf) { + LE16(p, 0, 0x848a); /* CF Storage Card signature */ + padstr(p+27*2, "ATARI800 MICRODRIVE", 40); + LE16(p, 49, CAP_LBA_SUPPORTED); + LE16(p, 51, 2); + LE16(p, 52, 1); + } + + if (s->is_cdrom) { + LE16(p, 0, GCBI_HAS_PACKET_FEAT_SET | + GCBI_CDROM_DEVICE | + GCBI_HAS_REMOVABLE_MEDIA | + GCBI_50US_TILL_DRQ | + GCBI_12BYTE_PACKETS); + padstr(p+27*2, "ATARI800 DVD-ROM", 40); + LE16(p, 49, CAP_LBA_SUPPORTED); + } +} + +static void ide_dummy_transfer_stop(struct ide_device *s) { + s->data_ptr = s->data_end = s->io_buffer; + s->io_buffer[0] = s->io_buffer[1] = + s->io_buffer[2] = s->io_buffer[3] = 0xff; + count = 0; +} + +static void ide_reset(struct ide_device *s) { + if (IDE_debug) fprintf(stderr, "ide: reset\n"); + + if (s->is_cf) s->mult_sectors = 0; + else s->mult_sectors = MAX_MULT_SECTORS; + + /* ide regs */ + s->feature = s->error = s->nsector = s->sector = s->lcyl = s->hcyl = 0; + + /* lba48 */ + s->hob_feature = s->hob_sector = s->hob_nsector = + s->hob_lcyl = s->hob_hcyl = s->lba48 = 0; + + s->select = 0xa0; + s->status = READY_STAT | SEEK_STAT; + + /* ATAPI stuff skipped */ + + s->select &= 0xf0; /* clear head */ + s->nsector = s->sector = 1; + if (s->is_cdrom) { + s->lcyl = 0x14; + s->hcyl = 0xeb; + } else { + s->lcyl = s->hcyl = 0; + } + + s->end_transfer_func = ide_dummy_transfer_stop; + ide_dummy_transfer_stop(s); + s->media_changed = 0; +} + +static int ide_init_drive(struct ide_device *s, char *filename) { + if (!(s->file = fopen(filename, "rb+"))) { + Log_print("%s: %s", filename, strerror(errno)); + return FALSE; + } + + s->blocksize = SECTOR_SIZE; + + fseeko(s->file, 0, SEEK_END); + s->filesize = ftello(s->file); + + if (IDE_debug) + fprintf(stderr, "ide: filesize: %"PRId64"\n", (int64_t)s->filesize); + + if (!s->io_buffer) { + s->io_buffer_size = SECTOR_SIZE * MAX_MULT_SECTORS; + s->io_buffer = Util_malloc(s->io_buffer_size); + } + + s->nb_sectors = s->filesize / SECTOR_SIZE; + + /* use standard physical disk geometry */ + s->cylinders = s->nb_sectors / (STD_HEADS * STD_SECTORS); + + if (s->cylinders > 16383) + s->cylinders = 16383; + else if (s->cylinders < 2) { + Log_print("%s: image file too small\n", filename); + fclose(s->file); + return FALSE; + } + + s->heads = STD_HEADS; + s->sectors = STD_SECTORS; + + if (IDE_debug) + fprintf(stderr, "ide: cyls/heads/secs - %d/%d/%d\n", + s->cylinders, s->heads, s->sectors); + + s->drive_serial = 1; + snprintf(s->drive_serial_str, sizeof(s->drive_serial_str), + "QM%05d", s->drive_serial); + + ide_reset(s); + + return TRUE; +} + +static uint32_t ide_ioport_read(struct ide_device *s, uint16_t addr) { + int ret = 0xff, hob = 0; + + addr &= 7; + /* hob = s->select & (1<<7); */ + /* FIXME: HOB stuff is broken/disabled in QEMU */ + + switch(addr) { + case 0: /* bottom ide layer does nothing here */ break; + case 1: ret = hob ? s->hob_feature : s->error; break; + case 2: ret = hob ? s->hob_nsector : s->nsector & 0xff; break; + case 3: ret = hob ? s->hob_sector : s->sector; break; + case 4: ret = hob ? s->hob_lcyl : s->lcyl; break; + case 5: ret = hob ? s->hob_hcyl : s->hcyl; break; + case 6: ret = s->select; break; + default: + case 7: ret = s->status; break; + } + + if (IDE_debug) + fprintf(stderr, "ide: get: addr: %04x, ret: %02x\n", addr, ret); + + return ret; +} + +static inline void not_implemented(uint8_t val) { + if (IDE_debug) fprintf(stderr, "\tIDE: %02x not implemented\n", val); +} + +static inline void ide_abort_command(struct ide_device *s) { + s->status = READY_STAT | ERR_STAT; + s->error = ABRT_ERR; +} + +static void ide_cmd_lba48_transform(struct ide_device *s, int lba48) { + s->lba48 = lba48; + if (!s->lba48) { + if (!s->nsector) + s->nsector = 256; + } else { + if (!s->nsector && !s->hob_nsector) + s->nsector = 65536; + else + s->nsector = (s->hob_nsector << 8) | s->nsector; + } +} +static int64_t ide_get_sector(struct ide_device *s) { + int64_t sector_num; + if (s->select & 0x40) { /* lba */ + if (IDE_debug) + fprintf(stderr, "get_sector: lba\n"); + if (!s->lba48) { + sector_num = ((s->select & 0x0f) << 24) | + ( s->hcyl << 16) | + ( s->lcyl << 8) | s->sector; + } else { + sector_num = ((int64_t) s->hob_hcyl << 40) | + ((int64_t) s->hob_lcyl << 32) | + ((int64_t) s->hob_sector << 24) | + ((int64_t) s->hcyl << 16) | + ((int64_t) s->lcyl << 8) | s->sector; + } + } else { + sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors + + (s->select & 0x0f) * s->sectors + + (s->sector - 1); + + if (IDE_debug) + fprintf(stderr, "get_sector: large: hcyl %02x lcyl %02x heads %02x sectors %02x select&f %1x sector-1 %d sector_num %"PRId64"\n", s->hcyl, s->lcyl, s->heads, s->sectors, s->select&0x0f, s->sector-1, sector_num); + + } + return sector_num; +} + +static void ide_transfer_start(struct ide_device *s, uint8_t *buf, int size, + EndTransferFunc *end_transfer_func) { + if (IDE_debug) fprintf(stderr, "transfer start\n"); + + s->end_transfer_func = end_transfer_func; + s->data_ptr = buf; + s->data_end = buf + size; + s->cycle = 0; + + if (!(s->status & ERR_STAT)) s->status |= DRQ_STAT; +} + +static void ide_transfer_stop(struct ide_device *s) { + if (IDE_debug) fprintf(stderr, "transfer stop\n"); + + s->end_transfer_func = ide_transfer_stop; + s->data_ptr = s->io_buffer; + s->data_end = s->io_buffer; + s->status &= ~DRQ_STAT; + count = 0; +} + +static void ide_set_sector(struct ide_device *s, int64_t sector_num) { + unsigned int cyl, r; + + if (s->select & 0x40) { + if (!s->lba48) { + s->select = (s->select & 0xf0) | (sector_num >> 24); + s->hcyl = sector_num >> 16 ; + s->lcyl = sector_num >> 8 ; + s->sector = sector_num ; + } else { + s->sector = sector_num ; + s->lcyl = sector_num >> 8; + s->hcyl = sector_num >> 16; + s->hob_sector = sector_num >> 24; + s->hob_lcyl = sector_num >> 32; + s->hob_hcyl = sector_num >> 40; + } + } else { + cyl = sector_num / (s->heads * s->sectors); + r = sector_num % (s->heads * s->sectors); + + s->hcyl = cyl >> 8; + s->lcyl = cyl ; + s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f); + s->sector = (r % s->sectors) + 1; + } +} + +static void ide_sector_read(struct ide_device *s) { + int64_t sector_num; + int n; + + s->status = READY_STAT | SEEK_STAT; + s->error = 0; + sector_num = ide_get_sector(s); + n = s->nsector; + + if (!n) { + ide_transfer_stop(s); + } else { + if (IDE_debug) + fprintf(stderr, "IDE: read sector=%" PRId64 "\n", sector_num); + + if (n > s->req_nb_sectors) + n = s->req_nb_sectors; + + if (fseeko(s->file, sector_num * SECTOR_SIZE, SEEK_SET) < 0) + goto fail; + if (fread(s->io_buffer, n * SECTOR_SIZE, 1, s->file) != 1) + goto fail; + + if (IDE_debug) fprintf(stderr, "sector read OK\n"); + + ide_transfer_start(s, s->io_buffer, 512*n, ide_sector_read); + s->nsector -= n; + ide_set_sector(s, sector_num + n + (s->nsector ? 0 : -1)); + } + return; + +fail: + ide_abort_command(s); + if (IDE_debug) fprintf(stderr, "sector read FAILED\n"); +} + +static void ide_sector_write(struct ide_device *s) { + int64_t sector_num; + int n, n1; + + s->status = READY_STAT | SEEK_STAT; + sector_num = ide_get_sector(s); + + if (IDE_debug) + fprintf(stderr, "IDE: write sector=%" PRId64 "\n", sector_num); + + n = s->nsector; + if (n > s->req_nb_sectors) + n = s->req_nb_sectors; + + if (fseeko(s->file, sector_num * SECTOR_SIZE, SEEK_SET) < 0) { + fprintf(stderr, "FSEEKO FAILED\n"); + goto fail; + } + if (fwrite(s->io_buffer, n * SECTOR_SIZE, 1, s->file) != 1) { + fprintf(stderr, "FWRITE FAILED\n"); + goto fail; + } + fflush(s->file); + + s->nsector -= n; + if (s->nsector == 0) { + ide_transfer_stop(s); + } else { + n1 = s->nsector; + if (n1 > s->req_nb_sectors) + n1 = s->req_nb_sectors; + ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write); + } + ide_set_sector(s, sector_num + n + (s->nsector ? 0 : -1)); + return; + +fail: + ide_abort_command(s); +} + +static void ide_command(struct ide_device *s, uint8_t val) { + int lba48 = 0, n; + + switch(val) { + case WIN_IDENTIFY: + ide_identify(s); + s->status = READY_STAT | SEEK_STAT; + ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop); + break; + + case WIN_SPECIFY: + case WIN_RECAL: + s->error = 0; + s->status = READY_STAT | SEEK_STAT; + break; + + case WIN_SETMULT: + if (s->is_cf && !s->nsector) { + s->mult_sectors = 0; + s->status = READY_STAT | SEEK_STAT; + } else if ((s->nsector & 0xff) != 0 + && ((s->nsector & 0xff) > MAX_MULT_SECTORS + || (s->nsector & (s->nsector - 1)) != 0)) { + ide_abort_command(s); + } else { + s->mult_sectors = s->nsector & 0xff; + s->status = READY_STAT | SEEK_STAT; + } + break; + + case WIN_VERIFY_EXT: + lba48 = 1; + case WIN_VERIFY: + case WIN_VERIFY_ONCE: + /* do sector number check ? */ + ide_cmd_lba48_transform(s, lba48); + s->status = READY_STAT | SEEK_STAT; + break; + + case WIN_READ_EXT: + lba48 = 1; + case WIN_READ: + case WIN_READ_ONCE: + ide_cmd_lba48_transform(s, lba48); + s->req_nb_sectors = 1; + ide_sector_read(s); + break; + + case WIN_WRITE_EXT: + lba48 = 1; + case WIN_WRITE: + case WIN_WRITE_ONCE: + case CFA_WRITE_SECT_WO_ERASE: + case WIN_WRITE_VERIFY: + ide_cmd_lba48_transform(s, lba48); + s->error = 0; + s->status = SEEK_STAT | READY_STAT; + s->req_nb_sectors = 1; + ide_transfer_start(s, s->io_buffer, 512, ide_sector_write); + s->media_changed = 1; + break; + + case WIN_MULTREAD_EXT: + lba48 = 1; + case WIN_MULTREAD: + if (!s->mult_sectors) goto abort_cmd; + + ide_cmd_lba48_transform(s, lba48); + s->req_nb_sectors = s->mult_sectors; + ide_sector_read(s); + break; + + case WIN_MULTWRITE_EXT: + lba48 = 1; + case WIN_MULTWRITE: + case CFA_WRITE_MULTI_WO_ERASE: + if (!s->mult_sectors) goto abort_cmd; + + ide_cmd_lba48_transform(s, lba48); + s->error = 0; + s->status = SEEK_STAT | READY_STAT; + s->req_nb_sectors = s->mult_sectors; + n = s->nsector; + if (n > s->req_nb_sectors) + n = s->req_nb_sectors; + ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write); + s->media_changed = 1; + break; + + case WIN_READDMA_EXT: + case WIN_READDMA: + case WIN_READDMA_ONCE: + case WIN_WRITEDMA_EXT: + case WIN_WRITEDMA: + case WIN_WRITEDMA_ONCE: + not_implemented(val); + goto abort_cmd; + break; + + case WIN_READ_NATIVE_MAX_EXT: + lba48 = 1; + case WIN_READ_NATIVE_MAX: + ide_cmd_lba48_transform(s, lba48); + ide_set_sector(s, s->nb_sectors - 1); + s->status = READY_STAT | SEEK_STAT; + break; + + case WIN_CHECKPOWERMODE1: + case WIN_CHECKPOWERMODE2: + s->nsector = 0xff; /* device active or idle */ + s->status = READY_STAT | SEEK_STAT; + break; + + case WIN_SETFEATURES: + switch(s->feature) { + case FEAT_ENABLE_REVERTING_TO_DEFAULTS: + case FEAT_DISABLE_REVERTING_TO_DEFAULTS: + case FEAT_ENABLE_WRITE_CACHE: + case FEAT_DISABLE_WRITE_CACHE: + case FEAT_ENABLE_READ_LOOKAHEAD: + case FEAT_DISABLE_READ_LOOKAHEAD: + case FEAT_ENABLE_ADVANCED_PM: + case FEAT_DISABLE_ADVANCED_PM: + case FEAT_ENABLE_AUTO_ACOUSTIC_MNGMNT: + case FEAT_DISABLE_AUTO_ACOUSTIC_MNGMNT: + s->status = READY_STAT | SEEK_STAT; + break; + case FEAT_SET_TRANSFER_MODE: + if ( (s->nsector >> 3) <= 1) { /* 0: pio default, 1: pio mode */ + /* set identify_data accordingly */ + } else { /* single word dma, mdma and udma mode */ + goto abort_cmd; + } + s->status = READY_STAT | SEEK_STAT; + break; + case FEAT_ENABLE_8BIT_DATA_TRANSFERS: + if (IDE_debug) fprintf(stderr, "ide: enable 8-bit mode\n"); + s->do_8bit = 1; + s->cycle = 0; + s->status = READY_STAT | SEEK_STAT; + break; + case FEAT_DISABLE_8BIT_DATA_TRANSFERS: + if (IDE_debug) fprintf(stderr, "ide: disable 8-bit mode\n"); + s->do_8bit = 0; + s->status = READY_STAT | SEEK_STAT; + break; + default: + goto abort_cmd; + break; + } + break; + + case WIN_FLUSH_CACHE: + case WIN_FLUSH_CACHE_EXT: + fflush(s->file); + break; + + case WIN_STANDBY: + case WIN_STANDBY2: + case WIN_STANDBYNOW1: + case WIN_STANDBYNOW2: + case WIN_IDLEIMMEDIATE: + case CFA_IDLEIMMEDIATE: + case WIN_SETIDLE1: + case WIN_SETIDLE2: + case WIN_SLEEPNOW1: + case WIN_SLEEPNOW2: + s->status = READY_STAT; + break; + + case WIN_SEEK: + if(s->is_cdrom) goto abort_cmd; + /* XXX: Check that seek is within bounds and return error if not */ + s->status = READY_STAT | SEEK_STAT; + break; + + /* ATAPI Commands SKIPPED */ + + /* CF-ATA commands */ + case CFA_REQ_EXT_ERROR_CODE: + if (!s->is_cf) goto abort_cmd; + s->error = 0x09; /* miscellaneous error, MARK_ERR | MCR_ERR */ + s->status = READY_STAT | SEEK_STAT; + break; + + case CFA_ERASE_SECTORS: + case CFA_WEAR_LEVEL: + if (!s->is_cf) goto abort_cmd; + if (val == CFA_WEAR_LEVEL) s->nsector = 0; + if (val == CFA_ERASE_SECTORS) s->media_changed = 1; + s->error = 0; + s->status = READY_STAT | SEEK_STAT; + break; + + case CFA_TRANSLATE_SECTOR: + if (!s->is_cf) goto abort_cmd; + s->error = 0; + s->status = READY_STAT | SEEK_STAT; + memset(s->io_buffer, 0, 0x200); + s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */ + s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */ + s->io_buffer[0x02] = s->select; /* Head */ + s->io_buffer[0x03] = s->sector; /* Sector */ + s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */ + s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */ + s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */ + s->io_buffer[0x13] = 0x00; /* Erase flag */ + s->io_buffer[0x18] = 0x00; /* Hot count */ + s->io_buffer[0x19] = 0x00; /* Hot count */ + s->io_buffer[0x1a] = 0x01; /* Hot count */ + ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop); + break; + + case CFA_ACCESS_METADATA_STORAGE: + if (!s->is_cf) goto abort_cmd; + not_implemented(val); /* FIXME: ... not yet */ + goto abort_cmd; + break; + + case IBM_SENSE_CONDITION: + if (!s->is_cf) goto abort_cmd; + switch (s->feature) { + case 0x01: /* sense temperature in device */ + s->nsector = 0x50; /* +20 C */ + break; + default: + goto abort_cmd; + } + s->status = READY_STAT | SEEK_STAT; + break; + + case WIN_SMART: + not_implemented(val); /* FIXME: ... not yet */ + goto abort_cmd; + break; + + default: + abort_cmd: + ide_abort_command(s); + break; + } +} + +static void ide_clear_hob(struct ide_device *s) { + s->select &= ~(1<<7); +} + +static void ide_ioport_write(struct ide_device *s, uint16_t addr, uint8_t val){ + if (IDE_debug) + fprintf(stderr, "ide: put: addr: %04x, byte: %02x\n", addr, val); + + addr &= 7; + + /* ignore writes to command block while busy */ + if (addr != 7 && s->bus_status & (BUSY_STAT|DRQ_STAT)) + return; + + switch(addr) { + case 0: /* bottom ide layer does nothing here */ break; + case 1: + ide_clear_hob(s); + s->hob_feature = s->feature; + s->feature = val; + break; + case 2: + ide_clear_hob(s); + s->hob_nsector = s->nsector; + s->nsector = val; + break; + case 3: + ide_clear_hob(s); + s->hob_sector = s->sector; + s->sector = val; + break; + case 4: + ide_clear_hob(s); + s->hob_lcyl = s->lcyl; + s->lcyl = val; + break; + case 5: + ide_clear_hob(s); + s->hob_hcyl = s->hcyl; + s->hcyl = val; + break; + case 6: + /* FIXME: HOB readback uses bit 7 */ + s->select = (val & ~0x10) | 0xa0; + s->bus_unit = (val>>4)&1; + break; + default: + case 7: + if (IDE_debug) fprintf(stderr, "\tIDE: CMD=%02x\n", val); + + ide_transfer_stop(s); + +/* + if ( (s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET) + break; +*/ + + ide_command(s, val); + + break; + } +} + +static uint16_t ide_data_readw(struct ide_device *s, int addr) { + uint8_t *p; + uint16_t ret; + + /* PIO data access only when DRQ bit is set */ + if (!(s->status & DRQ_STAT)) return 0; + + /* LE16 */ + p = s->data_ptr; + ret = p[0]; + ret |= p[1] << 8; + p += 2; + s->data_ptr = p; + + if (IDE_debug) { + fprintf(stderr, "data_readw: %d, %04x (count: %d)\n", addr, ret, count); + count++; + count &= 0xff; + } + + if (p >= s->data_end) s->end_transfer_func(s); + + return ret; +} + +static void ide_data_writew(struct ide_device *s, int addr, uint16_t val) { + uint8_t *p; + + if (IDE_debug) fprintf(stderr, "data_writew: %d, %04x\n", addr, val); + + /* PIO data access only when DRQ bit is set */ + if (!(s->status & DRQ_STAT)) return; + + /* LE16 */ + p = s->data_ptr; + p[0] = val & 0xff; + p[1] = val >> 8; + p += 2; + s->data_ptr = p; + + if (p >= s->data_end) s->end_transfer_func(s); +} + +static uint8_t mmio_ide_read(struct ide_device *s, int addr) { + uint16_t ret; /* will be cast at return */ + + addr &= 15; + + if (addr == 0) { + if (!s->do_8bit) { + ret = ide_data_readw(s, 0); + s->upperhalf[0] = ret & 0xff00; + return ret; + } + if (!s->cycle) { + s->data = ide_data_readw(s, 0); + ret = s->data & 0xff; + } else { + ret = s->data >> 8; + } + s->cycle = !s->cycle; + return ret; + } else if (addr >= 8) { + return s->upperhalf[addr-8] >> 8; + } else { + ret = ide_ioport_read(s, addr); + s->upperhalf[addr] = ret & 0xff00; + return ret; + } +} + +static void mmio_ide_write(struct ide_device *s, int addr, uint8_t val) { + addr &= 15; + + if (addr == 0) { + if (!s->do_8bit) { + ide_data_writew(s, 0, s->upperhalf[0] | val); + return; + } + if (!s->cycle) { + s->data = val & 0xff; + } else { + ide_data_writew(s, 0, s->data | (val << 8)); + } + s->cycle = !s->cycle; + } else if (addr >= 8) { + s->upperhalf[addr-8] = val << 8; + } else { + ide_ioport_write(s, addr, s->upperhalf[addr] | val); + } +} + +void IDE_PutByte(uint16_t addr, uint8_t val) { + struct ide_device *s = &device; + mmio_ide_write(s, addr, val); +} + +uint8_t IDE_GetByte(uint16_t addr, int no_side_effects) { + struct ide_device *s = &device; + return mmio_ide_read(s, addr); +} + +int IDE_Initialise(int *argc, char *argv[]) { + int i, j, ret = TRUE; + char *filename = NULL; + + if (IDE_debug) + fprintf(stderr, "ide: init\n"); + + for (i = j = 1; i < *argc; i++) { + int available = i + 1 < *argc; + + if (!strcmp(argv[i], "-ide" )) { + if (!available) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + filename = Util_strdup(argv[++i]); + } else if (!strcmp(argv[i], "-ide_debug")) { + IDE_debug = 1; + } else if (!strcmp(argv[i], "-ide_cf")) { + device.is_cf = 1; + } else { + if (!strcmp(argv[i], "-help")) { + Log_print("\t-ide Enable IDE emulation"); + Log_print("\t-ide_debug Enable IDE Debug Output"); + Log_print("\t-ide_cf Enable CF emulation"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + if (filename) { + IDE_enabled = ret = ide_init_drive(&device, filename); + free(filename); + } + + return ret; +} + +void IDE_Exit(void) +{ + if (IDE_enabled) { + fclose(device.file); + IDE_enabled = FALSE; + } +} diff --git a/PVAtari800/atari800-src/ide.h b/PVAtari800/atari800-src/ide.h new file mode 100644 index 0000000000..0b9a8157f9 --- /dev/null +++ b/PVAtari800/atari800-src/ide.h @@ -0,0 +1,25 @@ +#ifndef IDE_H_ +#define IDE_H_ + +#include "atari.h" +#ifdef HAVE_INTTYPES_H +# include +#else + typedef signed char int8_t; + typedef unsigned char uint8_t; + typedef short int16_t; + typedef unsigned short uint16_t; + typedef int int32_t; + typedef unsigned uint32_t; + typedef long long int64_t; + typedef unsigned long long uint64_t; +#endif + +extern int IDE_enabled; + +int IDE_Initialise(int *argc, char *argv[]); +void IDE_Exit(void); +uint8_t IDE_GetByte(uint16_t addr, int no_side_effects); +void IDE_PutByte(uint16_t addr, uint8_t byte); + +#endif diff --git a/PVAtari800/atari800-src/ide_internal.h b/PVAtari800/atari800-src/ide_internal.h new file mode 100644 index 0000000000..1a7b440161 --- /dev/null +++ b/PVAtari800/atari800-src/ide_internal.h @@ -0,0 +1,729 @@ +#ifndef IDE_INTERNAL_H +#define IDE_INTERNAL_H + +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +struct ide_device; + +typedef void EndTransferFunc(struct ide_device *); + +struct ide_device { + int bus_status; + int bus_unit; + + int is_cdrom, is_cf; + + FILE *file; + off_t filesize; + int blocksize; + + int cylinders, heads, sectors; + + int drive_serial; + char drive_serial_str[21]; + + /* ide regs */ + uint8_t feature; + uint8_t error; + uint32_t nsector; + uint8_t sector; + uint8_t lcyl; + uint8_t hcyl; + /* other part of tf for lba48 support */ + uint8_t hob_feature; + uint8_t hob_nsector; + uint8_t hob_sector; + uint8_t hob_lcyl; + uint8_t hob_hcyl; + + uint8_t select; + uint8_t status; + + /* set for lba48 access */ + uint8_t lba48; + + + int64_t nb_sectors; + int mult_sectors; + + int req_nb_sectors; + EndTransferFunc *end_transfer_func; + uint8_t *data_ptr, *data_end, *io_buffer; + int io_buffer_size; + + /* CF-ATA extended error */ + uint8_t ext_error; + + /* CF-ATA metadata storage */ + uint32_t mdata_size; + uint8_t *mdata_storage; + int media_changed; + + /* 8-bit mode (ATA-1 devices and CF devices) */ + int cycle; + int do_8bit; + uint16_t data; + uint16_t upperhalf[8]; +}; + +/* Bits of HD_STATUS */ +#define ERR_STAT 0x01 +#define INDEX_STAT 0x02 +#define ECC_STAT 0x04 /* Corrected error */ +#define DRQ_STAT 0x08 +#define SEEK_STAT 0x10 +#define SRV_STAT 0x10 +#define WRERR_STAT 0x20 +#define READY_STAT 0x40 +#define BUSY_STAT 0x80 + +/* Bits for HD_ERROR */ +#define MARK_ERR 0x01 /* Bad address mark */ +#define TRK0_ERR 0x02 /* couldn't find track 0 */ +#define ABRT_ERR 0x04 /* Command aborted */ +#define MCR_ERR 0x08 /* media change request */ +#define ID_ERR 0x10 /* ID field not found */ +#define MC_ERR 0x20 /* media changed */ +#define ECC_ERR 0x40 /* Uncorrectable ECC error */ +#define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */ +#define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */ + +/* Bits of HD_NSECTOR */ +#define CD 0x01 +#define IO 0x02 +#define REL 0x04 +#define TAG_MASK 0xf8 + +#define IDE_CMD_RESET 0x04 +#define IDE_CMD_DISABLE_IRQ 0x02 + + +/* ATA/ATAPI COMMANDS: (M) Mandatory (O) Optional */ + +#define WIN_NOP 0x00 /* (O) ATA1 nop */ +#if 0 +#define 0x01 /* Reserved */ +#define 0x02 /* Reserved */ +#endif +#define CFA_REQ_EXT_ERROR_CODE 0x03 /* (O) ATA4 cfa request ext. error code */ +#if 0 +#define 0x04 /* Reserved */ +#define 0x05 /* Reserved */ +#define 0x06 /* Reserved */ +#define 0x07 /* Reserved */ +#endif +#define WIN_SRST 0x08 +#define WIN_DEVICE_RESET 0x08 /* (M) ATA4 device reset */ +#if 0 +#define 0x09 /* Reserved */ +#define 0x0a /* Reserved */ +#define 0x0b /* Reserved */ +#define 0x0c /* Reserved */ +#define 0x0d /* Reserved */ +#define 0x0e /* Reserved */ +#define 0x0f /* Reserved */ +#endif +#define WIN_RECAL 0x10 /* (M) ATA1 recalibrate */ +#if 0 +#define 0x11 /* Reserved */ +#define 0x12 /* Reserved */ +#define 0x13 /* Reserved */ +#define 0x14 /* Reserved */ +#define 0x15 /* Reserved */ +#define 0x16 /* Reserved */ +#define 0x17 /* Reserved */ +#define 0x18 /* Reserved */ +#define 0x19 /* Reserved */ +#define 0x1a /* Reserved */ +#define 0x1b /* Reserved */ +#define 0x1c /* Reserved */ +#define 0x1d /* Reserved */ +#define 0x1e /* Reserved */ +#define 0x1f /* Reserved */ +#endif +#define WIN_READ 0x20 /* (M) ATA1 read sector(s) w/ retry */ +#define WIN_READ_ONCE 0x21 /* (M) ATA1 read sector(s) w/o retry */ +#define WIN_READ_LONG 0x22 /* (M) ATA1 read long w/ retry */ +#define WIN_READ_LONG_ONCE 0x23 /* (M) ATA1 read long w/o retry */ +#define WIN_READ_EXT 0x24 /* (O) ATA6, LBA48 */ +#define WIN_READDMA_EXT 0x25 /* (O) ATA6, LBA48 */ +#define WIN_READDMA_QUEUED_EXT 0x26 /* (O) ATA6, LBA48 */ +#define WIN_READ_NATIVE_MAX_EXT 0x27 /* (O) ATA6, LBA48 */ +#if 0 +#define 0x28 /* Reserved */ +#endif +#define WIN_MULTREAD_EXT 0x29 /* (O) ATA6, LBA48 */ +#if 0 +#define 0x2a /* Reserved */ +#define 0x2b /* Reserved */ +#define 0x2c /* Reserved */ +#define 0x2d /* Reserved */ +#define 0x2e /* Reserved */ +#endif +#define WIN_READ_LOG_EXT 0x2f /* (O) ATA6 read log ext */ +#define WIN_WRITE 0x30 /* (M) ATA1 write sector(s) w/ retry */ +#define WIN_WRITE_ONCE 0x31 /* (M) ATA1 write sector(s) w/o retry */ +#define WIN_WRITE_LONG 0x32 /* (M) ATA1 write long w/ retry */ +#define WIN_WRITE_LONG_ONCE 0x33 /* (M) ATA1 write long w/o retry */ +#define WIN_WRITE_EXT 0x34 /* (O) ATA6, LBA48 */ +#define WIN_WRITEDMA_EXT 0x35 /* (O) ATA6, LBA48 */ +#define WIN_WRITEDMA_QUEUED_EXT 0x36 /* (O) ATA6, LBA48 */ +#define WIN_SET_MAX_EXT 0x37 /* (O) ATA6, LBA48 */ +#define CFA_WRITE_SECT_WO_ERASE 0x38 /* (O) ATA4 cfa write sectors w/o erase */ +#define WIN_MULTWRITE_EXT 0x39 /* (O) ATA6, LBA48 */ +#if 0 +#define 0x3a /* Reserved */ +#define 0x3b /* Reserved */ +#endif +#define WIN_WRITE_VERIFY 0x3c /* (O) ATA1 write verify, obsolete ATA4 */ +#if 0 +#define 0x3d /* Reserved */ +#define 0x3e /* Reserved */ +#define 0x3f /* Reserved */ +#endif +#define WIN_VERIFY 0x40 /* (M) ATA1 verify sector(s) w/ retry */ +#define WIN_VERIFY_ONCE 0x41 /* (M) ATA1 verify sector(s) w/o retry */ +#define WIN_VERIFY_EXT 0x42 /* (O) ATA6, LBA48 */ +#if 0 +#define 0x43 /* Reserved */ +#define 0x44 /* Reserved */ +#define 0x45 /* Reserved */ +#define 0x46 /* Reserved */ +#define 0x47 /* Reserved */ +#define 0x48 /* Reserved */ +#define 0x49 /* Reserved */ +#define 0x4a /* Reserved */ +#define 0x4b /* Reserved */ +#define 0x4c /* Reserved */ +#define 0x4d /* Reserved */ +#define 0x4e /* Reserved */ +#define 0x4f /* Reserved */ +#endif +#define WIN_FORMAT 0x50 /* (M) ATA1 format track */ +#if 0 +#define 0x51 /* Reserved */ +#define 0x52 /* Reserved */ +#define 0x53 /* Reserved */ +#define 0x54 /* Reserved */ +#define 0x55 /* Reserved */ +#define 0x56 /* Reserved */ +#define 0x57 /* Reserved */ +#define 0x58 /* Reserved */ +#define 0x59 /* Reserved */ +#define 0x5a /* Reserved */ +#define 0x5b /* Reserved */ +#define 0x5c /* Reserved */ +#define 0x5d /* Reserved */ +#define 0x5e /* Reserved */ +#define 0x5f /* Reserved */ +#endif +#define WIN_INIT 0x60 /* xxxx */ +#if 0 +#define 0x61 /* Reserved */ +#define 0x62 /* Reserved */ +#define 0x63 /* Reserved */ +#define 0x64 /* Reserved */ +#define 0x65 /* Reserved */ +#define 0x66 /* Reserved */ +#define 0x67 /* Reserved */ +#define 0x68 /* Reserved */ +#define 0x69 /* Reserved */ +#define 0x6a /* Reserved */ +#define 0x6b /* Reserved */ +#define 0x6c /* Reserved */ +#define 0x6d /* Reserved */ +#define 0x6e /* Reserved */ +#define 0x6f /* Reserved */ +#endif +#define WIN_SEEK 0x70 /* (M) ATA1 seek */ +#if 0 +#define 0x71 /* Reserved */ +#define 0x72 /* Reserved */ +#define 0x73 /* Reserved */ +#define 0x74 /* Reserved */ +#define 0x75 /* Reserved */ +#define 0x76 /* Reserved */ +#define 0x77 /* Reserved */ +#define 0x78 /* Reserved */ +#define 0x79 /* Reserved */ +#define 0x7a /* Reserved */ +#define 0x7b /* Reserved */ +#define 0x7c /* Reserved */ +#define 0x7d /* Reserved */ +#define 0x7e /* Reserved */ +#define 0x7f /* Reserved */ +#define 0x80 /* Reserved (Vendor) */ +#define 0x81 /* Reserved (Vendor) */ +#define 0x82 /* Reserved (Vendor) */ +#define 0x83 /* Reserved (Vendor) */ +#define 0x84 /* Reserved (Vendor) */ +#define 0x85 /* Reserved (Vendor) */ +#define 0x86 /* Reserved (Vendor) */ +#endif +#define CFA_TRANSLATE_SECTOR 0x87 /* (O) ATA4 cfa translate sector */ +#if 0 +#define 0x88 /* Reserved (Vendor) */ +#define 0x89 /* Reserved (Vendor) */ +#define 0x8a /* Reserved (Vendor) */ +#define 0x8b /* Reserved (Vendor) */ +#define 0x8c /* Reserved (Vendor) */ +#define 0x8d /* Reserved (Vendor) */ +#define 0x8e /* Reserved (Vendor) */ +#define 0x8f /* Reserved (Vendor) */ +#endif +#define WIN_DIAGNOSE 0x90 /* (M) ATA1 execute drive diagnostic */ +#define WIN_SPECIFY 0x91 /* (M) ATA1 initialize drive parameters */ +#define WIN_DOWNLOAD_MICROCODE 0x92 /* (O) ATA2 download microcode */ +#if 0 +#define 0x93 /* Reserved */ +#endif +#define WIN_STANDBYNOW2 0x94 /* (O) ATA1 standby immediate */ +#define CFA_IDLEIMMEDIATE 0x95 /* (O) ATA1 idle immediate */ +#define WIN_STANDBY2 0x96 /* (O) ATA1 standby */ +#define WIN_SETIDLE2 0x97 /* (O) ATA1 idle */ +#define WIN_CHECKPOWERMODE2 0x98 /* (O) ATA1 check power mode */ +#define WIN_SLEEPNOW2 0x99 /* (O) ATA1 sleep */ +#if 0 +#define 0x9a /* Reserved (Vendor) */ +#define 0x9b /* Reserved */ +#define 0x9c /* Reserved */ +#define 0x9d /* Reserved */ +#define 0x9e /* Reserved */ +#define 0x9f /* Reserved */ +#endif +#define WIN_PACKETCMD 0xa0 /* (O) ATA4 packet command */ +#define WIN_PIDENTIFY 0xa1 /* (O) ATA4 identify packet device */ +#define WIN_QUEUED_SERVICE 0xa2 /* (O) ATA4 service */ +#if 0 +#define 0xa3 /* Reserved */ +#define 0xa4 /* Reserved */ +#define 0xa5 /* Reserved */ +#define 0xa6 /* Reserved */ +#define 0xa7 /* Reserved */ +#define 0xa8 /* Reserved */ +#define 0xa9 /* Reserved */ +#define 0xaa /* Reserved */ +#define 0xab /* Reserved */ +#define 0xac /* Reserved */ +#define 0xad /* Reserved */ +#define 0xae /* Reserved */ +#define 0xaf /* Reserved */ +#endif +#define WIN_SMART 0xB0 /* (O) ATA3 smart */ +#if 0 +#define 0xb1 /* Reserved */ +#define 0xb2 /* Reserved */ +#define 0xb3 /* Reserved */ +#define 0xb4 /* Reserved */ +#define 0xb5 /* Reserved */ +#define 0xb6 /* Reserved */ +#define 0xb7 /* Reserved */ +#endif +#define CFA_ACCESS_METADATA_STORAGE 0xb8 +#if 0 +#define 0xb9 /* Reserved (CFA) */ +#define 0xba /* Reserved (CFA) */ +#define 0xbb /* Reserved (CFA) */ +#define 0xbc /* Reserved (CFA) */ +#define 0xbd /* Reserved (CFA) */ +#define 0xbe /* Reserved (CFA) */ +#define 0xbf /* Reserved (CFA) */ +#endif +#define CFA_ERASE_SECTORS 0xc0 /* (O) ATA4 erase sectors */ +#if 0 +#define 0xc1 /* Reserved (Vendor) */ +#define 0xc2 /* Reserved (Vendor) */ +#define 0xc3 /* Reserved (Vendor) */ +#endif +#define WIN_MULTREAD 0xc4 /* (M) ATA3 (O) ATA1 read multiple */ +#define WIN_MULTWRITE 0xc5 /* (M) ATA3 (O) ATA1 write multiple */ +#define WIN_SETMULT 0xc6 /* (M) ATA3 (O) ATA1 set multiple mode */ +#define WIN_READDMA_QUEUED 0xc7 /* (O) ATA4 read DMA queued */ +#define WIN_READDMA 0xc8 /* (M) ATA3 (O) ATA1 read DMA w/ retry */ +#define WIN_READDMA_ONCE 0xc9 /* (M) ATA3 (O) ATA1 read DMA w/o retry */ +#define WIN_WRITEDMA 0xca /* (M) ATA3 (O) ATA1 write DMA w/ retry */ +#define WIN_WRITEDMA_ONCE 0xcb /* (M) ATA3 (O) ATA1 write DMA w/o retry */ +#define WIN_WRITEDMA_QUEUED 0xcc /* (O) ATA4 write DMA queued */ +#define CFA_WRITE_MULTI_WO_ERASE 0xcd /* (O) ATA4 cfa write multiple w/o erase */ +#if 0 +#define 0xce /* Reserved */ +#define 0xcf /* Reserved */ +#define 0xd0 /* Reserved */ +#define 0xd1 /* Reserved */ +#define 0xd2 /* Reserved */ +#define 0xd3 /* Reserved */ +#define 0xd4 /* Reserved */ +#define 0xd5 /* Reserved */ +#define 0xd6 /* Reserved */ +#define 0xd7 /* Reserved */ +#define 0xd8 /* Reserved */ +#define 0xd9 /* Reserved */ +#endif +#define WIN_GETMEDIASTATUS 0xda /* (O) ATA4 get media status */ +#define WIN_ACKMEDIACHANGE 0xdb /* (O) ATA1 ack media chg, removed ATA3 */ +#define WIN_POSTBOOT 0xdc /* (O) ATA1 post-boot, removed ATA3 */ +#define WIN_PREBOOT 0xdd /* (O) ATA1 pre-boot, removed ATA3 */ +#define WIN_DOORLOCK 0xde /* (O) ATA1 door lock */ +#define WIN_DOORUNLOCK 0xdf /* (O) ATA1 door unlock */ +#define WIN_STANDBYNOW1 0xe0 /* (O) ATA1 standby immediate */ +#define WIN_IDLEIMMEDIATE 0xe1 /* (O) ATA1 idle immediate */ +#define WIN_STANDBY 0xe2 /* (O) ATA1 standby */ +#define WIN_SETIDLE1 0xe3 /* (O) ATA1 idle */ +#define WIN_READ_BUFFER 0xe4 /* (O) ATA1 read buffer */ +#define WIN_CHECKPOWERMODE1 0xe5 /* (O) ATA1 check power mode */ +#define WIN_SLEEPNOW1 0xe6 /* (O) ATA1 sleep */ +#define WIN_FLUSH_CACHE 0xe7 /* (M) ATA5, (O) ATA4 flush cache */ +#define WIN_WRITE_BUFFER 0xe8 /* (O) ATA1 write buffer */ +#define WIN_WRITE_SAME 0xe9 /* (O) ATA1 write same, removed ATA3 */ +#define WIN_FLUSH_CACHE_EXT 0xea /* (O) ATA6, LBA48 */ +#if 0 +#define 0xeb /* Reserved */ +#endif +#define WIN_IDENTIFY 0xec /* (M) ATA2 ((O) ATA1) identify drive */ +#define WIN_MEDIAEJECT 0xed /* (O) ATA2 media eject */ +#define WIN_IDENTIFY_DMA 0xee /* (O) ATA3 identify device DMA */ +#define WIN_SETFEATURES 0xef /* (M) ATA4, (O) ATA1 set features */ +#define EXABYTE_ENABLE_NEST 0xf0 /* */ +#define IBM_SENSE_CONDITION 0xf0 /* measure disk temperature */ +#define WIN_SECURITY_SET_PASS 0xf1 /* (O) ATA3 security set password */ +#define WIN_SECURITY_UNLOCK 0xf2 /* (O) ATA3 security unlock */ +#define WIN_SECURITY_ERASE_PREPARE 0xf3 /* (O) ATA3 security erase prepare */ +#define WIN_SECURITY_ERASE_UNIT 0xf4 /* (O) ATA3 security erase unit */ +#define WIN_SECURITY_FREEZE_LOCK 0xf5 /* (O) ATA3 security freeze lock */ +#define CFA_WEAR_LEVEL 0xf5 +#define WIN_SECURITY_DISABLE 0xf6 /* (O) ATA3 security disable password */ +#if 0 +#define 0xf7 /* Reserved (Vendor) */ +#endif +#define WIN_READ_NATIVE_MAX 0xf8 /* (O) ATA4 read native max address */ +#define WIN_SET_MAX 0xf9 /* (O) ATA4 set max address */ +#if 0 +#define 0xfa /* Reserved (Vendor) */ +#endif +#define DISABLE_SEAGATE 0xfb +#if 0 +#define 0xfc /* Reserved (Vendor) */ +#define 0xfd /* Reserved (Vendor) */ +#define 0xfe /* Reserved (Vendor) */ +#define 0xff /* Reserved (Vendor) */ +#endif + +#define MAX_MULT_SECTORS 16 + +#define ASC_ILLEGAL_OPCODE 0x20 +#define ASC_LOGICAL_BLOCK_OOR 0x21 +#define ASC_INV_FIELD_IN_CMD_PACKET 0x24 +#define ASC_MEDIUM_MAY_HAVE_CHANGED 0x28 +#define ASC_INCOMPATIBLE_FORMAT 0x30 +#define ASC_MEDIUM_NOT_PRESENT 0x3a +#define ASC_SAVING_PARAMETERS_NOT_SUPPORTED 0x39 +#define ASC_MEDIA_REMOVAL_PREVENTED 0x53 + +#define CFA_NO_ERROR 0x00 +#define CFA_MISC_ERROR 0x09 +#define CFA_INVALID_COMMAND 0x20 +#define CFA_INVALID_ADDRESS 0x21 +#define CFA_ADDRESS_OVERFLOW 0x2f + +#define SENSE_NONE 0 +#define SENSE_NOT_READY 2 +#define SENSE_ILLEGAL_REQUEST 5 +#define SENSE_UNIT_ATTENTION 6 + +/* Self Monitoring And Reporting Technology */ +#define SMART_READ_DATA 0xd0 /* ATA3 read attribute values */ +#define SMART_READ_THRESH 0xd1 /* ATA3 read attr. threshold, ATA4 obsolete */ +#define SMART_ATTR_AUTOSAVE 0xd2 /* ATA3 attribute autosave */ +#define SMART_SAVE_ATTR 0xd3 /* ATA3 save attribute values */ +#define SMART_EXECUTE_OFFLINE 0xd4 /* ATA4 execute offline immediate */ +#define SMART_READ_LOG 0xd5 /* ATA5 */ +#define SMART_WRITE_LOG 0xd6 /* ATA5 */ +/*#define unknown 0xd7 // ATA4 obsolete */ +#define SMART_ENABLE 0xd8 /* ATA3 enable operations */ +#define SMART_DISABLE 0xd9 /* ATA3 disable operations */ +#define SMART_STATUS 0xda /* ATA3 return status */ +/*#define unknown 0xdb // ATA4 obsolete */ + +/* Execute Device Diagnostic ATA1 (device 0) (device 1 OR 0x80) */ +#define DDIAG_NO_ERROR 0x01 +#define DDIAG_FORMAT_ERROR 0x02 +#define DDIAG_BUFFER_ERROR 0x03 +#define DDIAG_ECC_ERROR 0x04 +#define DDIAG_MPU_ERROR 0x05 +/* After ATA1, any value other than 0x01 or 0x81 should be considered Vendor */ + + +/* Identify Drive Information ATA1 */ + +/* General Configuration Bit-significant Information: */ +#define GCBI_ATAPI_DEVICE 0x8000 /* ATA3 */ +#define GCBI_FORMAT_SPEED_TOLERANCE_GAP_REQ 0x4000 /* ATA1, obsolete ATA2 */ +#define GCBI_TRACK_OFFSET_OPTION_AVAILABLE 0x2000 /* ATA1, obsolete ATA2 */ +#define GCBI_DATA_STROBE_OFFSET_AVAILABLE 0x1000 /* ATA1, obsolete ATA2 */ +#define GCBI_ROTATIONAL_SPEED_TOL_OVER_HALF 0x0800 /* ATA1, obsolete ATA2 */ +#define GCBI_DISK_TRANSFER_RATE_OVER_10MBS 0x0400 /* ATA1, obsolete ATA2 */ +#define GCBI_DISK_TRANSFER_RATE_OVER_5MBS 0x0200 /* ATA1, obsolete ATA2 */ +#define GCBI_DISK_TRANSFER_RATE_UNDER_5MBS 0x0100 /* ATA1, obsolete ATA2 */ +#define GCBI_REMOVABLE_CARTRIDGE_DRIVE 0x0080 /* ATA1 */ +#define GCBI_FIXED_DRIVE 0x0040 /* ATA1 */ +#define GCBI_SPINDLE_MOTOR_CONTROL 0x0020 /* ATA1, obsolete ATA2 */ +#define GCBI_HEAD_SWITCH_TIME_OVER_15USEC 0x0010 /* ATA1, obsolete ATA2 */ +#define GCBI_NOT_MFM_ENCODED 0x0008 /* ATA1, obsolete ATA2 */ +#define GCBI_SOFT_SECTORED 0x0004 /* ATA1, obsolete ATA2 */ +#define GCBI_HARD_SECTORED 0x0002 /* ATA1, obsolete ATA2 */ +/*#define 0x0001 // reserved */ + +/* ATAPI General Configuration Bit-significant Information: */ +#define GCBI_HAS_PACKET_FEAT_SET 0x8000 /* ATA4, ATAPI4 */ +#define GCBI_NO_PACKET_FEAT_SET 0x4000 /* ATA4, ATAPI4 */ + +#define GCBI_DIRECT_ACCESS_DEVICE 0x0000 /* ATA4, ATAPI4 */ +#define GCBI_SEQUENTIAL_ACCESS_DEVICE 0x0100 /* ATA4, ATAPI4 */ +#define GCBI_PRINTER_DEVICE 0x0200 /* ATA4, ATAPI4 */ +#define GCBI_PROCESSOR_DEVICE 0x0300 /* ATA4, ATAPI4 */ +#define GCBI_WRITE_ONCE_DEVICE 0x0400 /* ATA4, ATAPI4 */ +#define GCBI_CDROM_DEVICE 0x0500 /* ATA4, ATAPI4 */ +#define GCBI_SCANNER_DEVICE 0x0600 /* ATA4, ATAPI4 */ +#define GCBI_OPTICAL_MEMORY_DEVICE 0x0700 /* ATA4, ATAPI4 */ +#define GCBI_MEDIUM_CHANGER_DEVICE 0x0800 /* ATA4, ATAPI4 */ +#define GCBI_COMMUNICATIONS_DEVICE 0x0900 /* ATA4, ATAPI4 */ +#define GCBI_ARRAY_CONTROLLER_DEVICE 0x0c00 /* ATA4, ATAPI4 */ +#define GCBI_ENCLOSURE_SERVICES_DEVICE 0x0d00 /* ATA5, ATAPI5 */ +#define GCBI_REDUCED_BLOCK_COMMAND_DEVICE 0x0e00 /* ATA5, ATAPI5 */ +#define GCBI_OPTICAL_CARD_RW_DEVICE 0x0f00 /* ATA5, ATAPI5 */ +#define GCBI_UNKNOWN_DEVICE 0x1f00 /* ATA4, ATAPI4 */ + +#define GCBI_HAS_REMOVABLE_MEDIA 0x0080 /* ATA4, ATAPI4 */ + +#define GCBI_50US_TILL_DRQ 0x0400 /* ATA4, ATAPI4 */ +#define GCBI_10MS_TILL_INTRQ_DRQ 0x0200 /* ATA4, ATAPI4 */ +#define GCBI_3MS_TILL_DRQ 0x0000 /* ATA4, ATAPI4 */ + +#define GCBI_16BYTE_PACKETS 0x0001 /* ATA4, ATAPI4 */ +#define GCBI_12BYTE_PACKETS 0x0000 /* ATA4, ATAPI4 */ + +/* Capabilities */ +#define CAP_INTERLEAVED_DMA_SUPPORTED 0x8000 /* ATA4, ATAPI4 */ +#define CAP_COMMAND_QUEUING_SUPPORTED 0x4000 /* ATA4, ATAPI4 */ +#define CAP_STDBY_TIMER_SUPPORTED 0x2000 /* ATA2 */ +#define CAP_OVERLAP_OPERATION_SUPPORTED 0x2000 /* ATA4, ATAPI4 */ +#define CAP_ATA_SOFT_RESET_REQUIRED 0x1000 /* ATA , obsolete ATAPI4 */ +#define CAP_IORDY_SUPPORTED 0x0800 /* ATA2 */ +#define CAP_IORDY_CAN_BE_DISABLED 0x0400 /* ATA3 */ +#define CAP_LBA_SUPPORTED 0x0200 /* ATA1, obsolete ATA3 */ +#define CAP_DMA_SUPPORTED 0x0100 /* ATA1, obsolete ATA3 */ +/* ATA4, LBA and DMA should be set */ + +/* Features */ +#define FEAT_ENABLE_8BIT_DATA_TRANSFERS 0x01 /* ATA1, obsolete ATA3 */ + /* retired ATA4 */ + /* CFA ATA5 */ +#define FEAT_ENABLE_WRITE_CACHE 0x02 /* ATA1 / Vendor */ +#define FEAT_SET_TRANSFER_MODE 0x03 /* ATA1 */ +#define FEAT_ENABLE_AUTO_DEFECT_REASSIGN 0x04 /* ATA3, obsolete ATA4 */ +#define FEAT_ENABLE_ADVANCED_PM 0x05 /* ATA4 */ +#define FEAT_ENABLE_POWER_UP_IN_STANDBY 0x06 /* ATA5 */ +#define FEAT_POWER_UP_IN_STANDBY_SPIN_UP 0x07 /* ATA5 */ +#define FEAT_ENABLE_CFA_POWER_MODE_1 0x0a /* ATA5 */ +#define FEAT_DISABLE_MEDIA_STATUS_NOTIFY 0x31 /* ATA4 */ +#define FEAT_DISABLE_RETRIES 0x33 /* ATA1, obsolete ATA4 */ +#define FEAT_ENABLE_AUTO_ACOUSTIC_MNGMNT 0x42 /* ATA6 */ +#define FEAT_VENDOR_ECC_ON_RW_LONG 0x44 /* ATA1, obsolete ATA4 */ +#define FEAT_SET_CACHE_SEGMENTS 0x54 /* ATA1, obsolete ATA4 */ +#define FEAT_DISABLE_READ_LOOKAHEAD 0x55 /* ATA1 */ +#define FEAT_ENABLE_RELEASE_INTERRUPT 0x5d /* ATA4 */ +#define FEAT_ENABLE_SERVICE_INTERRUPT 0x5e /* ATA4 */ +#define FEAT_DISABLE_REVERTING_TO_DEFAULTS 0x66 /* ATA1 */ +#define FEAT_DISABLE_ECC 0x77 /* ATA1, obsolete ATA4 */ +#define FEAT_DISABLE_8BIT_DATA_TRANSFERS 0x81 /* ATA1, obsolete ATA3 */ + /* retired ATA4 */ + /* CFA ATA5 */ +#define FEAT_DISABLE_WRITE_CACHE 0x82 /* ATA1 */ +#define FEAT_DISABLE_AUTO_DEFECT_REASSIGN 0x84 /* ATA3, obsolete ATA4 */ +#define FEAT_DISABLE_ADVANCED_PM 0x85 /* ATA4 */ +#define FEAT_DISABLE_POWER_UP_IN_STANDBY 0x86 /* ATA5 */ +#define FEAT_ENABLE_ECC 0x88 /* ATA1, obsolete ATA4 */ +#define FEAT_DISABLE_CFA_POWER_MODE_1 0x8a /* ATA5 */ +#define FEAT_ENABLE_MEDIA_STATUS_NOTIFY 0x95 /* ATA4 */ +#define FEAT_ENABLE_RETRIES 0x99 /* ATA1, obsolete ATA4 */ +#define FEAT_SET_MAXIMUM_AVG_CURRENT 0x9a /* ATA3, obsolete ATA4 */ +#define FEAT_ENABLE_READ_LOOKAHEAD 0xaa /* ATA1 */ +#define FEAT_SET_MAXIMUM_PREFETCH 0xab /* ATA1, obsolete ATA4 */ +#define FEAT_4BYTE_ECC_ON_RW_LONG 0xbb /* ATA1, obsolete ATA4 */ +#define FEAT_DISABLE_AUTO_ACOUSTIC_MNGMNT 0xc2 /* ATA6 */ +#define FEAT_ENABLE_REVERTING_TO_DEFAULTS 0xcc /* ATA1 */ +#define FEAT_DISABLE_RELEASE_INTERRUPT 0xdd /* ATA4 */ +#define FEAT_DISABLE_SERVICE_INTERRUPT 0xde /* ATA4 */ +/* 0xf0-0xff reserved for CFA */ + +/* Transfer Modes */ +#define MODE_BLOCK_TRANSFER 0x00 /* ATA1 */ +#define MODE_PIO 0x00 /* ATA2 */ +#define MODE_PIO_NO_IORDY 0x01 /* ATA2 */ +#define MODE_PIO_FLOW_CONTROL 0x08 /* ATA2 (+0..7) */ +#define MODE_SINGLE_WORD_DMA 0x10 /* ATA1 (+0..3) */ + /* ATA2 (+0..7) */ + /* ATA3 removed */ +#define MODE_MULTIWORD_DMA 0x20 /* ATA1 */ + /* ATA2 (+0..7) */ +#define MODE_ULTRA_DMA 0x40 /* ATA4 (+0..7) */ + /* 0x80 reserved */ + +/* Advanced Power Management Levels */ +#define APML_MAXIMUM_PERFORMANC 0xfe /* ATA4 */ +#define APML_INTERMEDIATE_WITHOUT_STDBY 0x81 /* ATA4 0x81-0xfd */ +#define APML_MINIMUM_POWER_WITHOUT_STDBY 0x80 /* ATA4 */ +#define APML_INTERMEDIATE_WITH_STDBY 0x82 /* ATA4 0x81-0x7f */ +#define APML_MINIMUM_POWER_WITH_STDBY 0x01 /* ATA4 */ + +/* Valid Fields */ +#define FIELDS_VALID_54_58 0x01 /* ATA1 */ +#define FIELDS_VALID_64_70 0x02 /* ATA2 */ +#define FIELDS_VALID_88 0x04 /* ATA4 */ + +/* Version Numbers (index is bit number! (i.e. 1< +#include +#include + +#include "atari.h" +#include "cassette.h" +#include "img_tape.h" +#include "memory.h" +#include "sio.h" +#include "util.h" + +enum { MAX_BLOCKS = 2048 }; + +/* Standard record length, needed by ReadRecord() when reading raw files */ +enum { DEFAULT_BUFFER_SIZE = 132 }; + +/* Baudrate for all written blocks and for reading from raw files. */ +enum { DEFAULT_BAUDRATE = 600 }; + +struct IMG_TAPE_t { + FILE *file; /* Stream for reading/writing of the tape image */ + int isCAS; /* Indicates if the file is in CAS format, or a raw binary file */ + UBYTE *buffer; /* Holds bytes of the last read or currently written data block */ + size_t buffer_size; /* Size of the space allocated for BUFFER */ + ULONG savetime; /* Time elapsed since last byte writing, in CPU ticks */ + ULONG save_gap; /* Length of the IRG before the currently written block */ + int next_blockbyte; /* Index of the byte in this block that will be read next (counted from 0) */ + unsigned int current_block; /* Number of the currently-read/written block (counted from 0) */ + int block_length; /* Length of the block currently held in BUFFER */ + int num_blocks; /* Number of data blocks in the whole file */ + ULONG block_offsets[MAX_BLOCKS]; /* File offsets for each data block*/ + int block_baudrates[MAX_BLOCKS]; /* Baudrates for each data block in the file */ + char description[CASSETTE_DESCRIPTION_MAX]; /* Tape description, only for CAS files */ + int was_writing; /* Indicated if the last operation on the file was writing */ +}; + +typedef struct { + char identifier[4]; + UBYTE length_lo; + UBYTE length_hi; + UBYTE aux_lo; + UBYTE aux_hi; +} CAS_Header; +/* +Just for remembering - CAS format in short: +It consists of chunks. Each chunk has a header, possibly followed by data. +If a header is unknown or unexpected it may be skipped by the length of the +header (8 bytes), and additionally the length given in the length-field(s). +There are (until now) 3 types of chunks: +-CAS file marker, has to be at begin of file - identifier "FUJI", length is +number of characters of an (optional) ascii-name (without trailing 0), aux +is always 0. +-baud rate selector - identifier "baud", length always 0, aux is rate in baud +(usually 600; one byte is 8 bits + startbit + stopbit, makes 60 bytes per +second). +-data record - identifier "data", length is length of the data block (usually +$84 as used by the OS), aux is length of mark tone (including leader and gaps) +just before the record data in milliseconds. +*/ + +int IMG_TAPE_FileSupported(UBYTE const start_bytes[4]) +{ + /* Note: doesn't detect raw binary files. */ + return start_bytes[0] == 'F' && start_bytes[1] == 'U' + && start_bytes[2] == 'J' && start_bytes[3] == 'I'; +} + +/* Write contents of the file's block buffer to file, as a separate record; + then empty the buffer. + Returns TRUE on success or FALSE on write error. */ +static int WriteRecord(IMG_TAPE_t *file) +{ + CAS_Header header; + int result; + + /* on a raw file, saving is denied because it can hold + only 1 file and could cause confusion */ + if (!file->isCAS) + return FALSE; + /* always append */ + if (fseek(file->file, file->block_offsets[file->num_blocks], SEEK_SET) != 0) + return FALSE; + /* write record header */ + Util_strncpy(header.identifier, "data", 4); + header.length_lo = file->block_length & 0xFF; + header.length_hi = (file->block_length >> 8) & 0xFF; + header.aux_lo = file->save_gap & 0xff; + header.aux_hi = (file->save_gap >> 8) & 0xff; + if (fwrite(&header, 1, 8, file->file) != 8) + return FALSE; + /* Saving is supported only with standard baudrate. */ + file->block_baudrates[file->num_blocks] = DEFAULT_BAUDRATE; + file->num_blocks++; + file->block_offsets[file->num_blocks] = file->block_offsets[file->num_blocks - 1] + file->block_length + 8; + file->current_block = file->num_blocks; + /* write record */ + result = fwrite(file->buffer, 1, file->block_length, file->file) == file->block_length; + if (result) { + file->save_gap = 0; + file->block_length = 0; + } + return result; +} + +/* Flush any unwritten data to tape. */ +static int CassetteFlush(IMG_TAPE_t *file) +{ + if (file->block_length > 0) + return WriteRecord(file) && fflush(file->file) == 0; + return TRUE; +} + +IMG_TAPE_t *IMG_TAPE_Open(char const *filename, int *writable, char const **description) +{ + IMG_TAPE_t *img; + CAS_Header header; + + img = Util_malloc(sizeof(IMG_TAPE_t)); + /* Check if the file is writable. If not, recording will be disabled. */ + img->file = fopen(filename, "rb+"); + *writable = img->file != NULL; + /* If opening for reading+writing failed, reopen it as read-only. */ + if (img->file == NULL) + img->file = fopen(filename, "rb"); + if (img->file == NULL) { + free(img); + return NULL; + } + img->description[0] = '\0'; + + if (fread(&header, 1, 6, img->file) == 6 + && header.identifier[0] == 'F' + && header.identifier[1] == 'U' + && header.identifier[2] == 'J' + && header.identifier[3] == 'I') { + /* CAS file */ + UWORD length; + UWORD skip; + int blocks; + int baudrate = DEFAULT_BAUDRATE; + + img->isCAS = TRUE; + fseek(img->file, 2L, SEEK_CUR); /* ignore the aux bytes */ + + /* read or skip file description */ + skip = length = header.length_lo | (header.length_hi << 8); + if (length < CASSETTE_DESCRIPTION_MAX) + skip = 0; + else + skip -= CASSETTE_DESCRIPTION_MAX - 1; + if (fread(img->description, 1, length - skip, img->file) < (length - skip)) { + fclose(img->file); + free(img); + return NULL; + } + img->description[length - skip] = '\0'; + fseek(img->file, skip, SEEK_CUR); + + /* count number of blocks */ + blocks = 0; + img->block_baudrates[0] = DEFAULT_BAUDRATE; + img->block_offsets[0] = ftell(img->file); + for (;;) { + /* chunk header is always 8 bytes */ + if (fread(&header, 1, 8, img->file) != 8) + break; + length = header.length_lo + (header.length_hi << 8); + if (header.identifier[0] == 'b' + && header.identifier[1] == 'a' + && header.identifier[2] == 'u' + && header.identifier[3] == 'd') { + baudrate=header.aux_lo + (header.aux_hi << 8); + img->block_offsets[blocks] += length + 8; + } + else if (header.identifier[0] == 'd' + && header.identifier[1] == 'a' + && header.identifier[2] == 't' + && header.identifier[3] == 'a') { + img->block_baudrates[blocks] = baudrate; + if (++blocks >= MAX_BLOCKS) { + --blocks; + break; + } + img->block_offsets[blocks] = img->block_offsets[blocks - 1] + length + 8; + } + /* skip possibly present data block */ + fseek(img->file, length, SEEK_CUR); + } + img->num_blocks = blocks; + *description = img->description; + } + else { + /* raw file */ + int file_length = Util_flen(img->file); + img->num_blocks = ((file_length + 127) >> 7) + 1; + img->isCAS = FALSE; + *writable = FALSE; /* Writing raw files is not supported */ + *description = NULL; + } + + img->savetime = 0; + img->save_gap = 0; + img->next_blockbyte = 0; + img->block_length = 0; + img->current_block = 0; + img->buffer = Util_malloc((img->buffer_size = DEFAULT_BUFFER_SIZE) * sizeof(UBYTE)); + img->was_writing = FALSE; + + return img; +} + +void IMG_TAPE_Close(IMG_TAPE_t *file) +{ + if (file->was_writing) + CassetteFlush(file); + fclose(file->file); + free(file->buffer); + free(file); +} + +IMG_TAPE_t *IMG_TAPE_Create(char const *filename, char const *description) +{ + IMG_TAPE_t *img; + CAS_Header header; + size_t desc_len; + FILE *file = NULL; + + /* create new file */ + file = fopen(filename, "wb+"); + if (file == NULL) + return NULL; + + /* Write the initial FUJI and baud blocks of the CAS file. */ + desc_len = strlen(description); + memset(&header, 0, sizeof(header)); + /* write CAS-header */ + header.length_lo = (UBYTE) desc_len; + header.length_hi = (UBYTE) (desc_len >> 8); + if (fwrite("FUJI", 1, 4, file) != 4 + || fwrite(&header.length_lo, 1, 4, file) != 4 + || fwrite(description, 1, desc_len, file) != desc_len) { + fclose(file); + return NULL; + } + + memset(&header, 0, sizeof(header)); + /* All records are written with 600 baud speed. */ + header.aux_lo = DEFAULT_BAUDRATE & 0xff; + header.aux_hi = DEFAULT_BAUDRATE >> 8; + if (fwrite("baud", 1, 4, file) != 4 + || fwrite(&header.length_lo, 1, 4, file) != 4) { + fclose(file); + return NULL; + } + + img = Util_malloc(sizeof(IMG_TAPE_t)); + img->file = file; + if (description != NULL) + Util_strlcpy(img->description, description, CASSETTE_DESCRIPTION_MAX); + img->isCAS = TRUE; + img->savetime = 0; + img->save_gap = 0; + img->next_blockbyte = 0; + img->block_length = 0; + img->current_block = 0; + img->num_blocks = 0; + img->block_offsets[0] = strlen(description) + 16; + img->buffer = Util_malloc((img->buffer_size = DEFAULT_BUFFER_SIZE) * sizeof(UBYTE)); + img->was_writing = TRUE; + + return img; +} + +/* Enlarge file->buffer to (at least) SIZE if needed. */ +static void EnlargeBuffer(IMG_TAPE_t *file, size_t size) +{ + if (file->buffer_size < size) { + /* Enlarge the buffer at least 2 times. */ + file->buffer_size *= 2; + if (file->buffer_size < size) + file->buffer_size = size; + file->buffer = Util_realloc(file->buffer, file->buffer_size * sizeof(UBYTE)); + } +} + +/* Read a record from the file. FALSE on error/EOF. + Writes length of pre-record gap (in ms) into *gap. */ +static int ReadNextRecord(IMG_TAPE_t *file, int *gap) +{ + int length; + + /* 0 indicates that there was no previous block being read and + current_block already contains the current block number. */ + if (file->block_length != 0) { + /* Non-zero - a block was being read and it's finished, increase the block number. */ + file->block_length = 0; + if (++file->current_block >= file->num_blocks) + /* Last block was already read. */ + return FALSE; + } + + if (file->isCAS) { + CAS_Header header; + + /* While reading a block, offset by 4 to skip its 4-byte name (assume it's "data") */ + if (fseek(file->file, file->block_offsets[file->current_block] + 4, SEEK_SET) != 0 + || fread(&header.length_lo, 1, 4, file->file) < 4) + return FALSE; + length = header.length_lo + (header.length_hi << 8); + *gap = header.aux_lo + (header.aux_hi << 8); + /* read block into buffer */ + EnlargeBuffer(file, length); + if (fread(file->buffer, 1, length, file->file) < length) + return FALSE; + } + else { + length = 132; + /* Don't enlarge buffer - its default size is at least 132. */ + *gap = (file->current_block == 0 ? 19200 : 260); + file->buffer[0] = 0x55; + file->buffer[1] = 0x55; + if (file->current_block + 1 >= file->num_blocks) { + /* EOF record */ + file->buffer[2] = 0xfe; + memset(file->buffer + 3, 0, 128); + } + else { + int bytes; + if (fseek(file->file, file->current_block * 128, SEEK_SET) != 0 + || (bytes = fread(file->buffer + 3, 1, 128, file->file)) == 0) + return FALSE; + if (bytes < 128) { + file->buffer[2] = 0xfa; /* non-full record */ + memset(file->buffer + 3 + bytes, 0, 127 - bytes); + file->buffer[0x82] = bytes; + } + else + file->buffer[2] = 0xfc; /* full record */ + } + file->buffer[0x83] = SIO_ChkSum(file->buffer, 0x83); + } + file->block_length = length; + return TRUE; +} + +int IMG_TAPE_Read(IMG_TAPE_t *file, unsigned int *duration, int *is_gap, UBYTE *byte) +{ + int gap; + if (file->was_writing) { + CassetteFlush(file); + file->was_writing = FALSE; + } + if (file->next_blockbyte >= file->block_length) { + /* Buffer is exhausted, load next record. */ + + if (!ReadNextRecord(file, &gap)) + return FALSE; + file->next_blockbyte = 0; + if (gap > 0) { + /* Convert gap from ms to CPU ticks. */ + *duration = gap * 1789 + gap * 790 / 1000; /* (gap * 1789790 / 1000), avoiding overflow */ + *is_gap = TRUE; + return TRUE; + } + } + *byte = file->buffer[file->next_blockbyte++]; + *is_gap = FALSE; + /* Next event will be after 10 bits of data gets loaded. */ + *duration = 10 * 1789790 / (file->isCAS ? file->block_baudrates[file->current_block] : 600); + return TRUE; +} + +void IMG_TAPE_WriteAdvance(IMG_TAPE_t *file, unsigned int num_ticks) +{ + if (!file->was_writing) { + file->savetime = 0; + file->save_gap = 0; + file->next_blockbyte = 0; + file->block_length = 0; + file->was_writing = TRUE; + /* Always append to end of file. */ + file->current_block = file->num_blocks; + } + file->savetime += num_ticks; +} + +int IMG_TAPE_WriteByte(IMG_TAPE_t *file, UBYTE byte, unsigned int pokey_counter) +{ + /* put_delay is time between end of last byte write / motor start, and + start of writing of current BYTE (in ms). */ + /* Note: byte duration in seconds: pokey_counter / (1789790/2) * 10 + * in milliseconds: pokey_counter * 10 * 1000 / 1789790/2 */ + int put_delay = file->savetime /1790 - 10 * pokey_counter / 895; /* better accuracy not needed */ + if (put_delay > 05) { + + /* write previous block */ + if (file->block_length > 0) { + if (!WriteRecord(file)) + return FALSE; /* Write error */ + } + /* set new gap-time */ + file->save_gap += put_delay; + } + /* put byte into buffer */ + EnlargeBuffer(file, file->block_length + 1); + file->buffer[file->block_length++] = byte; + /* set new last byte-put time */ + file->savetime = 0; + + return TRUE; +} + +int IMG_TAPE_Flush(IMG_TAPE_t *file) +{ + if (file->was_writing) + return CassetteFlush(file); + return TRUE; +} + +/* Returns position in blocks/samples, counted from 0. */ +unsigned int IMG_TAPE_GetPosition(IMG_TAPE_t *file) +{ + return file->current_block; +} +/* Returns size in blocks/samples. */ +unsigned int IMG_TAPE_GetSize(IMG_TAPE_t *file) +{ + return file->num_blocks; +} + +void IMG_TAPE_Seek(IMG_TAPE_t *file, unsigned int position) +{ + if (file->was_writing) { + CassetteFlush(file); + file->was_writing = FALSE; + } + file->current_block = (int)position; + if (file->current_block > file->num_blocks) + file->current_block = file->num_blocks; + file->savetime = 0; + file->save_gap = 0; + file->next_blockbyte = 0; + file->block_length = 0; +} + +int IMG_TAPE_SerinStatus(IMG_TAPE_t *file, int event_time_left) +{ + int bit = 0; + + if (file->was_writing || file->next_blockbyte == 0) + return 1; + /* exam rate; if time_to_irq < duration of one byte */ + if (event_time_left < + 10 * 1789790 / (file->isCAS ? file->block_baudrates[file->current_block] : 600) - 1) { + bit = event_time_left / (1789790 / (file->isCAS ? file->block_baudrates[file->current_block] : 600)); + } + else { + bit = 0; + } + + /* if stopbit or out of range, return mark tone */ + if ((bit <= 0) || (bit > 9)) + return 1; + + /* if start bit, return space tone */ + if (bit == 9) + return 0; + + /* eval tone to return */ + return (file->buffer[file->next_blockbyte - 1] >> (8 - bit)) & 1; +} + +int IMG_TAPE_SkipToData(IMG_TAPE_t *file, int ms) +{ + if (file->was_writing) { + CassetteFlush(file); + file->was_writing = FALSE; + } + + while (ms > 0) { + if (file->next_blockbyte < file->block_length) { + int bytes = ms * (file->isCAS ? file->block_baudrates[file->current_block] : 600) / 1000 / 10; + if (bytes > file->block_length - file->next_blockbyte) + bytes = file->block_length - file->next_blockbyte; + file->next_blockbyte += bytes; + ms -= bytes * 10 * 1000 / (file->isCAS ? file->block_baudrates[file->current_block] : 600); + continue; + } + else { + int gap; + if (!ReadNextRecord(file, &gap)) + return FALSE; + file->next_blockbyte = 0; + ms -= gap; + } + } + return TRUE; +} + +int IMG_TAPE_ReadToMemory(IMG_TAPE_t *file, UWORD dest_addr, int length) +{ + int read_length; + if (file->was_writing) { + CassetteFlush(file); + file->was_writing = FALSE; + } + read_length = file->block_length - file->next_blockbyte; + + if (read_length == 0) { + /* No bytes left in current block, need to read next block. */ + int gap; + if (!ReadNextRecord(file, &gap)) + /* EOF or read error */ + return -1; + file->block_length = read_length; + file->next_blockbyte = 0; + } + /* Copy record to memory, excluding the checksum byte if it exists. */ + MEMORY_CopyToMem(file->buffer + file->next_blockbyte, dest_addr, read_length >= length ? length : read_length); + file->next_blockbyte += (read_length >= length + 1 ? length + 1 : read_length); + return read_length >= length + 1 && + file->buffer[length] == SIO_ChkSum(file->buffer, length); +} + +int IMG_TAPE_WriteFromMemory(IMG_TAPE_t *file, UWORD src_addr, int length, int gap) +{ + if (!file->was_writing) { + file->savetime = 0; + file->save_gap = 0; + file->next_blockbyte = 0; + file->block_length = 0; + file->was_writing = TRUE; + } + EnlargeBuffer(file, length + 1); + /* Put record into buffer. */ + MEMORY_CopyFromMem(src_addr, file->buffer, length); + /* Eval checksum over buffer data. */ + file->buffer[length] = SIO_ChkSum(file->buffer, length); + file->save_gap = gap; + file->block_length = length + 1; + return WriteRecord(file); +} diff --git a/PVAtari800/atari800-src/img_tape.h b/PVAtari800/atari800-src/img_tape.h new file mode 100644 index 0000000000..6d148859c0 --- /dev/null +++ b/PVAtari800/atari800-src/img_tape.h @@ -0,0 +1,99 @@ +/* + * img_tape.h - support for CAS and raw tape images + * + * Copyright (C) 2011 Tomasz Krasuski + * Copyright (C) 2011 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef IMG_TAPE_H_ +#define IMG_TAPE_H_ + +#include "atari.h" + +typedef struct IMG_TAPE_t IMG_TAPE_t; + +/* Checks if a file is a valid tape image, based on its first four bytes + stored in HEADER. */ +int IMG_TAPE_FileSupported(UBYTE const start_bytes[4]); + +/* Opens a cassette image pointed to by FILENAME. + Stores a boolean in *WRITABLE, indicating if the file is writable. + For CAS files, stores in *DESCRIPTION a pointer to the file's description. + Returns pointer to the opened file on success or NULL otherwise. */ +IMG_TAPE_t *IMG_TAPE_Open(char const *filename, int *writable, char const **description); + +/* Closes a tape image FILE. */ +void IMG_TAPE_Close(IMG_TAPE_t *file); + +/* Creates a new writable CAS file at FILENAME, with a given description. + Returns pointer to the opened file on success or NULL otherwise. */ +IMG_TAPE_t *IMG_TAPE_Create(char const *filename, char const *description); + +/* Reads the next tape event from FILE. + Stores duration of the event (in CPU ticks) in *DURATION. + Stores a boolean in *IS_GAP, indicating if the event is an IRG (TRUE) + or a byte (FALSE). + If *IS_GAP == FALSE, stores the byte being read in *BYTE. + Returns TRUE on success or FALSE on read error or EOF. */ +int IMG_TAPE_Read(IMG_TAPE_t *file, unsigned int *duration, int *is_gap, UBYTE *byte); + +/* Advances the tape file by a given DURATION (in CPU ticks) during + writing. */ +void IMG_TAPE_WriteAdvance(IMG_TAPE_t *file, unsigned int duration); + +/* Writes a BYTE to the tape file. POKEY_COUNTER is value of the POKEY counter + used for serial transmission. + Returns TRUE on success or FALSE on write error. */ +int IMG_TAPE_WriteByte(IMG_TAPE_t *file, UBYTE byte, unsigned int pokey_counter); + +/* Flushes the file's buffers. Any CAS chunk being currently written is + immediately ended. + Returns TRUE on success or FALSE on write error. */ +int IMG_TAPE_Flush(IMG_TAPE_t *file); + +/* Returns the file's current position (block), counted from 0. */ +unsigned int IMG_TAPE_GetPosition(IMG_TAPE_t *file); +/* Returns the file's size (blocks). */ +unsigned int IMG_TAPE_GetSize(IMG_TAPE_t *file); +/* Positions the file at the start of a block given in POSITION (counted from + 0). */ +void IMG_TAPE_Seek(IMG_TAPE_t *file, unsigned int position); + +/* Returns direct state of POKEY's serial input port during tape reading. + EVENT_TIME_LEFT is number of CPU ticks left till the end of the byte that's + currently being read. */ +int IMG_TAPE_SerinStatus(IMG_TAPE_t *file, int event_time_left); + +/* --- Functions used by patched SIO --- */ + +/* Forwards the tape past a given amount of milliseconds. + Returns TRUE on success or FALSE on read error or EOF. */ +int IMG_TAPE_SkipToData(IMG_TAPE_t *file, int ms); +/* Reads a record of specified LENGTH from tape and stores it in system's + memory starting ad DEST_ADDR. + Returns TRUE on success (requested number of bytes read successfully and + checksum is correct), FALSE on too short record or bad checksum, + or -1 on read error/EOF (also implicates too short record). */ +int IMG_TAPE_ReadToMemory(IMG_TAPE_t *file, UWORD dest_addr, int length); +/* Writes data from system memory starting at SRC_ADDR of specified LENGTH + to a tape record. GAP is length of the pre-record gap, in ms. + Returns TRUE on success or FALSE on write error. */ +int IMG_TAPE_WriteFromMemory(IMG_TAPE_t *file, UWORD src_addr, int length, int gap); + +#endif /* IMG_TAPE_H_ */ diff --git a/PVAtari800/atari800-src/input.c b/PVAtari800/atari800-src/input.c new file mode 100644 index 0000000000..ce316cfe6b --- /dev/null +++ b/PVAtari800/atari800-src/input.c @@ -0,0 +1,1047 @@ +/* + * input.c - keyboard, joysticks and mouse emulation + * + * Copyright (C) 2001-2002 Piotr Fusik + * Copyright (C) 2001-2006 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include /* for exit() */ +#include "antic.h" +#include "atari.h" +#include "cassette.h" +#include "cpu.h" +#include "gtia.h" +#include "input.h" +#include "akey.h" +#include "log.h" +#include "memory.h" +#include "pia.h" +#include "platform.h" +#include "pokey.h" +#include "util.h" +#ifndef CURSES_BASIC +#include "screen.h" /* for Screen_atari */ +#endif +#ifdef __PLUS +#include "input_win.h" +#endif +#ifdef EVENT_RECORDING +#include +#endif + +#ifdef DREAMCAST +extern int Atari_POT(int); +#else +#define Atari_POT(x) 228 +#endif + +int INPUT_key_code = AKEY_NONE; +int INPUT_key_shift = 0; +int INPUT_key_consol = INPUT_CONSOL_NONE; + +int INPUT_joy_autofire[4] = {INPUT_AUTOFIRE_OFF, INPUT_AUTOFIRE_OFF, INPUT_AUTOFIRE_OFF, INPUT_AUTOFIRE_OFF}; + +int INPUT_joy_block_opposite_directions = 1; + +int INPUT_joy_multijoy = 0; + +int INPUT_joy_5200_min = 6; +int INPUT_joy_5200_center = 114; +int INPUT_joy_5200_max = 220; + +int INPUT_cx85 = 0; + +int INPUT_mouse_mode = INPUT_MOUSE_OFF; +int INPUT_mouse_port = 0; +int INPUT_mouse_delta_x = 0; +int INPUT_mouse_delta_y = 0; +int INPUT_mouse_buttons = 0; +int INPUT_mouse_speed = 3; +int INPUT_mouse_pot_min = 1; /* min. value of POKEY's POT register */ +int INPUT_mouse_pot_max = 228; /* max. value of POKEY's POT register */ +/* There should be UI or options for light pen/gun offsets. + Below are best offsets for different programs: + AtariGraphics: H = 0..32, V = 0 (there's calibration in the program) + Bug Hunt: H = 44, V = 2 + Barnyard Blaster: H = 40, V = 0 + Operation Blood (light gun version): H = 40, V = 4 + */ +int INPUT_mouse_pen_ofs_h = 42; +int INPUT_mouse_pen_ofs_v = 2; +int INPUT_mouse_joy_inertia = 10; +int INPUT_direct_mouse = 0; + +#ifndef MOUSE_SHIFT +#define MOUSE_SHIFT 4 +#endif +static int mouse_x = 0; +static int mouse_y = 0; +static int mouse_move_x = 0; +static int mouse_move_y = 0; +static int mouse_pen_show_pointer = 0; +static int mouse_last_right = 0; +static int mouse_last_down = 0; + +static const UBYTE mouse_amiga_codes[16] = { + 0x00, 0x02, 0x0a, 0x08, + 0x01, 0x03, 0x0b, 0x09, + 0x05, 0x07, 0x0f, 0x0d, + 0x04, 0x06, 0x0e, 0x0c +}; + +static const UBYTE mouse_st_codes[16] = { + 0x00, 0x02, 0x03, 0x01, + 0x08, 0x0a, 0x0b, 0x09, + 0x0c, 0x0e, 0x0f, 0x0d, + 0x04, 0x06, 0x07, 0x05 +}; + +static UBYTE STICK[4]; +static UBYTE TRIG_input[4]; + +static int joy_multijoy_no = 0; /* number of selected joy */ + +static int cx85_port = 1; + +static int max_scanline_counter; +static int scanline_counter; + +#ifdef EVENT_RECORDING +static gzFile recordfp = NULL; /*output file for input recording*/ +static gzFile playbackfp = NULL; /*input file for playback*/ +static int recording = FALSE; +static int playingback = FALSE; +static void update_adler32_of_screen(void); +static unsigned int compute_adler32_of_screen(void); +static int recording_version; +#define GZBUFSIZE 256 +static char gzbuf[GZBUFSIZE+1]; +#define EVENT_RECORDING_VERSION 1 +#endif + +int INPUT_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-mouse") == 0) { + if (i_a) { + char *mode = argv[++i]; + if (strcmp(mode, "off") == 0) + INPUT_mouse_mode = INPUT_MOUSE_OFF; + else if (strcmp(mode, "pad") == 0) + INPUT_mouse_mode = INPUT_MOUSE_PAD; + else if (strcmp(mode, "touch") == 0) + INPUT_mouse_mode = INPUT_MOUSE_TOUCH; + else if (strcmp(mode, "koala") == 0) + INPUT_mouse_mode = INPUT_MOUSE_KOALA; + else if (strcmp(mode, "pen") == 0) + INPUT_mouse_mode = INPUT_MOUSE_PEN; + else if (strcmp(mode, "gun") == 0) + INPUT_mouse_mode = INPUT_MOUSE_GUN; + else if (strcmp(mode, "amiga") == 0) + INPUT_mouse_mode = INPUT_MOUSE_AMIGA; + else if (strcmp(mode, "st") == 0) + INPUT_mouse_mode = INPUT_MOUSE_ST; + else if (strcmp(mode, "trak") == 0) + INPUT_mouse_mode = INPUT_MOUSE_TRAK; + else if (strcmp(mode, "joy") == 0) + INPUT_mouse_mode = INPUT_MOUSE_JOY; + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-mouseport") == 0) { + if (i_a) { + INPUT_mouse_port = Util_sscandec(argv[++i]) - 1; + if (INPUT_mouse_port < 0 || INPUT_mouse_port > 3) { + Log_print("Invalid mouse port number - should be between 0 and 3"); + return FALSE; + } + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-mousespeed") == 0) { + if (i_a) { + INPUT_mouse_speed = Util_sscandec(argv[++i]); + if (INPUT_mouse_speed < 1 || INPUT_mouse_speed > 9) { + Log_print("Invalid mouse speed - should be between 1 and 9"); + return FALSE; + } + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-multijoy") == 0) { + INPUT_joy_multijoy = 1; + } +#ifdef EVENT_RECORDING + else if (strcmp(argv[i], "-record") == 0) { + if (i_a) { + char *recfilename = argv[++i]; + if ((recordfp = gzopen(recfilename, "wb")) == NULL) { + Log_print("Cannot open record file"); + return FALSE; + } + else { + recording = TRUE; + gzprintf(recordfp, "Atari800 event recording, version: %d\n", EVENT_RECORDING_VERSION); + } + } + else a_m = TRUE; + } + else if (strcmp(argv[i], "-playback") == 0) { + if (i_a) { + char *pbfilename = argv[++i]; + if ((playbackfp = gzopen(pbfilename, "rb")) == NULL) { + Log_print("Cannot open playback file"); + return FALSE; + } + else { + playingback = TRUE; + gzgets(playbackfp, gzbuf, GZBUFSIZE); + if (sscanf(gzbuf, "Atari800 event recording, version: %d\n", &recording_version) != 1) { + Log_print("Invalid playback file"); + playingback = FALSE; + gzclose(playbackfp); + return FALSE; + } + else if (recording_version > EVENT_RECORDING_VERSION) { + Log_print("Newer version of playback file than this version of Atari800 can handle"); + playingback = FALSE; + gzclose(playbackfp); + return FALSE; + } + } + } + else a_m = TRUE; + } +#endif /* EVENT_RECORDING */ + else if (strcmp(argv[i], "-directmouse") == 0) { + INPUT_direct_mouse = 1; + } + else if (strcmp(argv[i], "-cx85") == 0) { + if (i_a) { + INPUT_cx85 = 1; + cx85_port = Util_sscandec(argv[++i]) - 1; + if (cx85_port < 0 || cx85_port > 3) { + Log_print("Invalid cx85 port - should be between 0 and 3"); + return FALSE; + } + } + else a_m = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-mouse off Do not use mouse"); + Log_print("\t-mouse pad Emulate paddles"); + Log_print("\t-mouse touch Emulate Atari Touch Tablet"); + Log_print("\t-mouse koala Emulate Koala Pad"); + Log_print("\t-mouse pen Emulate Light Pen"); + Log_print("\t-mouse gun Emulate Light Gun"); + Log_print("\t-mouse amiga Emulate Amiga mouse"); + Log_print("\t-mouse st Emulate Atari ST mouse"); + Log_print("\t-mouse trak Emulate Atari Trak-Ball"); + Log_print("\t-mouse joy Emulate joystick using mouse"); + Log_print("\t-mouseport Set mouse port 1-4 (default 1)"); + Log_print("\t-mousespeed Set mouse speed 1-9 (default 3)"); + Log_print("\t-directmouse Use absolute X/Y mouse coords"); + Log_print("\t-cx85 Emulate CX85 numeric keypad on port "); + Log_print("\t-multijoy Emulate MultiJoy4 interface"); + Log_print("\t-record Record input to "); + Log_print("\t-playback Playback input from "); + } + argv[j++] = argv[i]; + } + + /* this is the end of the additional argument check */ + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + + if(INPUT_direct_mouse && !( + INPUT_mouse_mode == INPUT_MOUSE_PAD || + INPUT_mouse_mode == INPUT_MOUSE_TOUCH || + INPUT_mouse_mode == INPUT_MOUSE_KOALA)) { + Log_print("-directmouse only valid with -mouse pad|touch|koala"); + return FALSE; + } + + INPUT_CenterMousePointer(); + *argc = j; + + return TRUE; +} + +/* For event recording */ +void INPUT_Exit(void) { +#ifdef EVENT_RECORDING + if (recording) { + gzclose(recordfp); + recording = FALSE; + } + if (playingback) { + gzclose(playbackfp); + playingback = FALSE; + } +#endif +} + +/* mouse_step is used in Amiga, ST, trak-ball and joystick modes. + It moves mouse_x and mouse_y in the direction given by + mouse_move_x and mouse_move_y. + Bresenham's algorithm is used: + if (abs(deltaX) >= abs(deltaY)) { + if (deltaX == 0) + return; + MoveHorizontally(); + e -= abs(deltaY); + if (e < 0) { + e += abs(deltaX); + MoveVertically(); + } + } + else { + MoveVertically(); + e -= abs(deltaX); + if (e < 0) { + e += abs(deltaY); + MoveHorizontally(); + } + } + Returned is stick code for the movement direction. +*/ +static UBYTE mouse_step(void) +{ + static int e = 0; + UBYTE r = INPUT_STICK_CENTRE; + int dx = mouse_move_x >= 0 ? mouse_move_x : -mouse_move_x; + int dy = mouse_move_y >= 0 ? mouse_move_y : -mouse_move_y; + if (dx >= dy) { + if (mouse_move_x == 0) + return r; + if (mouse_move_x < 0) { + r &= INPUT_STICK_LEFT; + mouse_last_right = 0; + mouse_x--; + mouse_move_x += 1 << MOUSE_SHIFT; + if (mouse_move_x > 0) + mouse_move_x = 0; + } + else { + r &= INPUT_STICK_RIGHT; + mouse_last_right = 1; + mouse_x++; + mouse_move_x -= 1 << MOUSE_SHIFT; + if (mouse_move_x < 0) + mouse_move_x = 0; + } + e -= dy; + if (e < 0) { + e += dx; + if (mouse_move_y < 0) { + r &= INPUT_STICK_FORWARD; + mouse_last_down = 0; + mouse_y--; + mouse_move_y += 1 << MOUSE_SHIFT; + if (mouse_move_y > 0) + mouse_move_y = 0; + } + else { + r &= INPUT_STICK_BACK; + mouse_last_down = 1; + mouse_y++; + mouse_move_y -= 1 << MOUSE_SHIFT; + if (mouse_move_y < 0) + mouse_move_y = 0; + } + } + } + else { + if (mouse_move_y < 0) { + r &= INPUT_STICK_FORWARD; + mouse_last_down = 0; + mouse_y--; + mouse_move_y += 1 << MOUSE_SHIFT; + if (mouse_move_y > 0) + mouse_move_y = 0; + } + else { + r &= INPUT_STICK_BACK; + mouse_last_down = 1; + mouse_y++; + mouse_move_y -= 1 << MOUSE_SHIFT; + if (mouse_move_y < 0) + mouse_move_y = 0; + } + e -= dx; + if (e < 0) { + e += dy; + if (mouse_move_x < 0) { + r &= INPUT_STICK_LEFT; + mouse_last_right = 0; + mouse_x--; + mouse_move_x += 1 << MOUSE_SHIFT; + if (mouse_move_x > 0) + mouse_move_x = 0; + } + else { + r &= INPUT_STICK_RIGHT; + mouse_last_right = 1; + mouse_x++; + mouse_move_x -= 1 << MOUSE_SHIFT; + if (mouse_move_x < 0) + mouse_move_x = 0; + } + } + } + return r; +} + +void INPUT_Frame(void) +{ + int i; + static int last_key_code = AKEY_NONE; + static int last_key_break = 0; + static UBYTE last_stick[4] = {INPUT_STICK_CENTRE, INPUT_STICK_CENTRE, INPUT_STICK_CENTRE, INPUT_STICK_CENTRE}; + static int last_mouse_buttons = 0; + + scanline_counter = 10000; /* do nothing in INPUT_Scanline() */ + + /* handle keyboard */ + + if (Atari800_keyboard_detached) { + /* Disable keyboard if it's not connedted. */ + INPUT_key_code = AKEY_NONE; + INPUT_key_shift = 0; + } + + /* In Atari 5200 joystick there's a second fire button, which acts + like the Shift key in 800/XL/XE (bit 3 in SKSTAT) and generates IRQ + like the Break key (bit 7 in IRQST and IRQEN). + Note that in 5200 the joystick position and first fire button are + separate for each port, but the keypad and 2nd button are common. + That is, if you press a key in the emulator, it's like you really pressed + it in all the controllers simultaneously. Normally the port to read + keypad & 2nd button is selected with the CONSOL register in GTIA + (this is simply not emulated). + INPUT_key_code is used for keypad keys and INPUT_key_shift is used for 2nd button. + */ +#ifdef EVENT_RECORDING + if (playingback) { + gzgets(playbackfp, gzbuf, GZBUFSIZE); + sscanf(gzbuf, "%d %d %d ", &INPUT_key_code, &INPUT_key_shift, &INPUT_key_consol); + } + if (recording) { + gzprintf(recordfp, "%d %d %d \n", INPUT_key_code, INPUT_key_shift, INPUT_key_consol); + } +#endif + i = Atari800_machine_type == Atari800_MACHINE_5200 ? INPUT_key_shift : (INPUT_key_code == AKEY_BREAK); + if (i && !last_key_break) { + if (POKEY_IRQEN & 0x80) { + POKEY_IRQST &= ~0x80; + CPU_GenerateIRQ(); + } + } + last_key_break = i; + + POKEY_SKSTAT |= 0xc; + if (INPUT_key_shift) + POKEY_SKSTAT &= ~8; + + if (INPUT_key_code < 0) { + if (CASSETTE_press_space) { + INPUT_key_code = AKEY_SPACE; + CASSETTE_press_space = 0; + } + else { + last_key_code = AKEY_NONE; + } + } + /* Following keys cannot be read with both shift and control pressed: + J K L ; + * Z X C V B F1 F2 F3 F4 HELP */ + /* which are 0x00-0x07 and 0x10-0x17 */ + /* This is caused by the keyboard itself, these keys generate 'ghost keys' + * when pressed with shift and control */ + if (Atari800_machine_type != Atari800_MACHINE_5200 && (INPUT_key_code&~0x17) == AKEY_SHFTCTRL) { + INPUT_key_code = AKEY_NONE; + } + if (INPUT_key_code >= 0) { + /* The 5200 has only 4 of the 6 keyboard scan lines connected */ + /* Pressing one 5200 key is like pressing 4 Atari 800 keys. */ + /* The LSB (bit 0) and bit 5 are the two missing lines. */ + /* When debounce is enabled, multiple keys pressed generate + * no results. */ + /* When debounce is disabled, multiple keys pressed generate + * results only when in numerical sequence. */ + /* Thus the LSB being one of the missing lines is important + * because that causes events to be generated. */ + /* Two events are generated every 64 scan lines + * but this code only does one every frame. */ + /* Bit 5 is different for each keypress because it is one + * of the missing lines. */ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + static int bit5_5200 = 0; + if (bit5_5200) { + INPUT_key_code &= ~0x20; + } + bit5_5200 = !bit5_5200; + /* 5200 2nd fire button generates CTRL as well */ + if (INPUT_key_shift) { + INPUT_key_code |= AKEY_SHFTCTRL; + } + } + POKEY_SKSTAT &= ~4; + if ((INPUT_key_code ^ last_key_code) & ~AKEY_SHFTCTRL) { + /* ignore if only shift or control has changed its state */ + last_key_code = INPUT_key_code; + POKEY_KBCODE = (UBYTE) INPUT_key_code; + if (POKEY_IRQEN & 0x40) { + if (POKEY_IRQST & 0x40) { + POKEY_IRQST &= ~0x40; + CPU_GenerateIRQ(); + } + else { + /* keyboard over-run */ + POKEY_SKSTAT &= ~0x40; + /* assert(CPU_IRQ != 0); */ + } + } + } + } + + /* handle joysticks */ +#ifdef EVENT_RECORDING + if (playingback) { + gzgets(playbackfp, gzbuf, GZBUFSIZE); + sscanf(gzbuf,"%d ",&i); + } else { +#endif + i = PLATFORM_PORT(0); +#ifdef EVENT_RECORDING + } + if (recording) { + gzprintf(recordfp,"%d \n",i); + } +#endif + + STICK[0] = i & 0x0f; + STICK[1] = (i >> 4) & 0x0f; +#ifdef EVENT_RECORDING + if (playingback) { + gzgets(playbackfp, gzbuf, GZBUFSIZE); + sscanf(gzbuf,"%d ",&i); + } else { +#endif + i = PLATFORM_PORT(1); +#ifdef EVENT_RECORDING + } + if (recording) { + gzprintf(recordfp,"%d \n",i); + } +#endif + STICK[2] = i & 0x0f; + STICK[3] = (i >> 4) & 0x0f; + + for (i = 0; i < 4; i++) { + if (INPUT_joy_block_opposite_directions) { + if ((STICK[i] & 0x0c) == 0) { /* right and left simultaneously */ + if (last_stick[i] & 0x04) /* if wasn't left before, move left */ + STICK[i] |= 0x08; + else /* else move right */ + STICK[i] |= 0x04; + } + else { + last_stick[i] &= 0x03; + last_stick[i] |= STICK[i] & 0x0c; + } + if ((STICK[i] & 0x03) == 0) { /* up and down simultaneously */ + if (last_stick[i] & 0x01) /* if wasn't up before, move up */ + STICK[i] |= 0x02; + else /* else move down */ + STICK[i] |= 0x01; + } + else { + last_stick[i] &= 0x0c; + last_stick[i] |= STICK[i] & 0x03; + } + } + else + last_stick[i] = STICK[i]; + /* Joystick Triggers */ +#ifdef EVENT_RECORDING + if(playingback){ + int trigtemp; + gzgets(playbackfp, gzbuf, GZBUFSIZE); + sscanf(gzbuf,"%d ",&trigtemp); + TRIG_input[i] = trigtemp; + + } else { +#endif + TRIG_input[i] = PLATFORM_TRIG(i); +#ifdef EVENT_RECORDING + } + if(recording){ + gzprintf(recordfp,"%d \n",TRIG_input[i]); + } +#endif + if ((INPUT_joy_autofire[i] == INPUT_AUTOFIRE_FIRE && !TRIG_input[i]) || (INPUT_joy_autofire[i] == INPUT_AUTOFIRE_CONT)) + TRIG_input[i] = (Atari800_nframes & 2) ? 1 : 0; + } + + /* handle analog joysticks in Atari 5200 */ + if (Atari800_machine_type != Atari800_MACHINE_5200) { + if(!INPUT_direct_mouse) { + for (i = 0; i < 4; i++) + POKEY_POT_input[i] = Atari_POT(i); + if (Atari800_machine_type != Atari800_MACHINE_XLXE) { + for (i = 4; i < 8; ++i) + POKEY_POT_input[i] = Atari_POT(i); + } + } + } + else { + for (i = 0; i < 4; i++) { +#ifdef DREAMCAST + /* first get analog js data */ + POKEY_POT_input[2 * i] = Atari_POT(2 * i); /* x */ + POKEY_POT_input[2 * i + 1] = Atari_POT(2 * i + 1); /* y */ + if (POKEY_POT_input[2 * i] != INPUT_joy_5200_center + || POKEY_POT_input[2 * i + 1] != INPUT_joy_5200_center) + continue; + /* if analog js is unused, alternatively try keypad */ +#endif + if ((STICK[i] & (INPUT_STICK_CENTRE ^ INPUT_STICK_LEFT)) == 0) + POKEY_POT_input[2 * i] = INPUT_joy_5200_min; + else if ((STICK[i] & (INPUT_STICK_CENTRE ^ INPUT_STICK_RIGHT)) == 0) + POKEY_POT_input[2 * i] = INPUT_joy_5200_max; + else + POKEY_POT_input[2 * i] = INPUT_joy_5200_center; + if ((STICK[i] & (INPUT_STICK_CENTRE ^ INPUT_STICK_FORWARD)) == 0) + POKEY_POT_input[2 * i + 1] = INPUT_joy_5200_min; + else if ((STICK[i] & (INPUT_STICK_CENTRE ^ INPUT_STICK_BACK)) == 0) + POKEY_POT_input[2 * i + 1] = INPUT_joy_5200_max; + else + POKEY_POT_input[2 * i + 1] = INPUT_joy_5200_center; + } + } + + /* handle mouse */ +#ifdef __PLUS + if (g_Input.ulState & IS_CAPTURE_MOUSE) +#endif + switch (INPUT_mouse_mode) { + case INPUT_MOUSE_PAD: + case INPUT_MOUSE_TOUCH: + case INPUT_MOUSE_KOALA: + if(!INPUT_direct_mouse) { + if (INPUT_mouse_mode != INPUT_MOUSE_PAD || Atari800_machine_type == Atari800_MACHINE_5200) + mouse_x += INPUT_mouse_delta_x * INPUT_mouse_speed; + else + mouse_x -= INPUT_mouse_delta_x * INPUT_mouse_speed; + if (mouse_x < INPUT_mouse_pot_min << MOUSE_SHIFT) + mouse_x = INPUT_mouse_pot_min << MOUSE_SHIFT; + else if (mouse_x > INPUT_mouse_pot_max << MOUSE_SHIFT) + mouse_x = INPUT_mouse_pot_max << MOUSE_SHIFT; + if (INPUT_mouse_mode == INPUT_MOUSE_KOALA || Atari800_machine_type == Atari800_MACHINE_5200) + mouse_y += INPUT_mouse_delta_y * INPUT_mouse_speed; + else + mouse_y -= INPUT_mouse_delta_y * INPUT_mouse_speed; + if (mouse_y < INPUT_mouse_pot_min << MOUSE_SHIFT) + mouse_y = INPUT_mouse_pot_min << MOUSE_SHIFT; + else if (mouse_y > INPUT_mouse_pot_max << MOUSE_SHIFT) + mouse_y = INPUT_mouse_pot_max << MOUSE_SHIFT; + POKEY_POT_input[INPUT_mouse_port << 1] = mouse_x >> MOUSE_SHIFT; + POKEY_POT_input[(INPUT_mouse_port << 1) + 1] = mouse_y >> MOUSE_SHIFT; + } + if (Atari800_machine_type == Atari800_MACHINE_5200) { + if (INPUT_mouse_buttons & 1) + TRIG_input[INPUT_mouse_port] = 0; + if (INPUT_mouse_buttons & 2) + POKEY_SKSTAT &= ~8; + } + else + STICK[INPUT_mouse_port] &= ~(INPUT_mouse_buttons << 2); + break; + case INPUT_MOUSE_PEN: + case INPUT_MOUSE_GUN: + mouse_x += INPUT_mouse_delta_x * INPUT_mouse_speed; + if (mouse_x < 0) + mouse_x = 0; + else if (mouse_x > 167 << MOUSE_SHIFT) + mouse_x = 167 << MOUSE_SHIFT; + mouse_y += INPUT_mouse_delta_y * INPUT_mouse_speed; + if (mouse_y < 0) + mouse_y = 0; + else if (mouse_y > 119 << MOUSE_SHIFT) + mouse_y = 119 << MOUSE_SHIFT; + ANTIC_PENH_input = 44 + INPUT_mouse_pen_ofs_h + (mouse_x >> MOUSE_SHIFT); + ANTIC_PENV_input = 4 + INPUT_mouse_pen_ofs_v + (mouse_y >> MOUSE_SHIFT); + if ((INPUT_mouse_buttons & 1) == (INPUT_mouse_mode == INPUT_MOUSE_PEN)) + STICK[INPUT_mouse_port] &= ~1; + if ((INPUT_mouse_buttons & 2) && !(last_mouse_buttons & 2)) + mouse_pen_show_pointer = !mouse_pen_show_pointer; + break; + case INPUT_MOUSE_AMIGA: + case INPUT_MOUSE_ST: + case INPUT_MOUSE_TRAK: + mouse_move_x += (INPUT_mouse_delta_x * INPUT_mouse_speed) >> 1; + mouse_move_y += (INPUT_mouse_delta_y * INPUT_mouse_speed) >> 1; + + /* i = max(abs(mouse_move_x), abs(mouse_move_y)); */ + i = mouse_move_x >= 0 ? mouse_move_x : -mouse_move_x; + if (mouse_move_y > i) + i = mouse_move_y; + else if (-mouse_move_y > i) + i = -mouse_move_y; + + { + if (i > 0) { + i += (1 << MOUSE_SHIFT) - 1; + i >>= MOUSE_SHIFT; + if (i > 50) + max_scanline_counter = scanline_counter = 5; + else + max_scanline_counter = scanline_counter = Atari800_tv_mode / i; + mouse_step(); + } + if (INPUT_mouse_mode == INPUT_MOUSE_TRAK) { + /* bit 3 toggles - vertical movement, bit 2 = 0 - up */ + /* bit 1 toggles - horizontal movement, bit 0 = 0 - left */ + STICK[INPUT_mouse_port] = ((mouse_y & 1) << 3) | (mouse_last_down << 2) + | ((mouse_x & 1) << 1) | mouse_last_right; + } + else { + STICK[INPUT_mouse_port] = (INPUT_mouse_mode == INPUT_MOUSE_AMIGA ? mouse_amiga_codes : mouse_st_codes) + [(mouse_y & 3) * 4 + (mouse_x & 3)]; + } + } + + if (INPUT_mouse_buttons & 1) + TRIG_input[INPUT_mouse_port] = 0; + if (INPUT_mouse_buttons & 2) + POKEY_POT_input[INPUT_mouse_port << 1] = 1; + if (INPUT_mouse_buttons & 4) + POKEY_POT_input[(INPUT_mouse_port << 1) + 1] = 1; + break; + case INPUT_MOUSE_JOY: + if (Atari800_machine_type == Atari800_MACHINE_5200) { + /* 2 * INPUT_mouse_speed is ok for Super Breakout, for Ballblazer you need more */ + int val = INPUT_joy_5200_center + ((INPUT_mouse_delta_x * 2 * INPUT_mouse_speed) >> MOUSE_SHIFT); + if (val < INPUT_joy_5200_min) + val = INPUT_joy_5200_min; + else if (val > INPUT_joy_5200_max) + val = INPUT_joy_5200_max; + POKEY_POT_input[INPUT_mouse_port << 1] = val; + val = INPUT_joy_5200_center + ((INPUT_mouse_delta_y * 2 * INPUT_mouse_speed) >> MOUSE_SHIFT); + if (val < INPUT_joy_5200_min) + val = INPUT_joy_5200_min; + else if (val > INPUT_joy_5200_max) + val = INPUT_joy_5200_max; + POKEY_POT_input[(INPUT_mouse_port << 1) + 1] = val; + if (INPUT_mouse_buttons & 2) + POKEY_SKSTAT &= ~8; + } + else { + mouse_move_x += INPUT_mouse_delta_x * INPUT_mouse_speed; + mouse_move_y += INPUT_mouse_delta_y * INPUT_mouse_speed; + if (mouse_move_x < -INPUT_mouse_joy_inertia << MOUSE_SHIFT || + mouse_move_x > INPUT_mouse_joy_inertia << MOUSE_SHIFT || + mouse_move_y < -INPUT_mouse_joy_inertia << MOUSE_SHIFT || + mouse_move_y > INPUT_mouse_joy_inertia << MOUSE_SHIFT) { + mouse_move_x >>= 1; + mouse_move_y >>= 1; + } + STICK[INPUT_mouse_port] &= mouse_step(); + } + if (INPUT_mouse_buttons & 1) + TRIG_input[INPUT_mouse_port] = 0; + break; + default: + break; + } + last_mouse_buttons = INPUT_mouse_buttons; + + /* CX85 numeric keypad */ + if (INPUT_key_code <= AKEY_CX85_1 && INPUT_key_code >= AKEY_CX85_YES) { + int val = 0; + switch (INPUT_key_code) { + case AKEY_CX85_1: + val = 0x19; + break; + case AKEY_CX85_2: + val = 0x1a; + break; + case AKEY_CX85_3: + val = 0x1b; + break; + case AKEY_CX85_4: + val = 0x11; + break; + case AKEY_CX85_5: + val = 0x12; + break; + case AKEY_CX85_6: + val = 0x13; + break; + case AKEY_CX85_7: + val = 0x15; + break; + case AKEY_CX85_8: + val = 0x16; + break; + case AKEY_CX85_9: + val = 0x17; + break; + case AKEY_CX85_0: + val = 0x1c; + break; + case AKEY_CX85_PERIOD: + val = 0x1d; + break; + case AKEY_CX85_MINUS: + val = 0x1f; + break; + case AKEY_CX85_PLUS_ENTER: + val = 0x1e; + break; + case AKEY_CX85_ESCAPE: + val = 0x0c; + break; + case AKEY_CX85_NO: + val = 0x14; + break; + case AKEY_CX85_DELETE: + val = 0x10; + break; + case AKEY_CX85_YES: + val = 0x18; + break; + } + if (val > 0) { + STICK[cx85_port] = (val&0x0f); + POKEY_POT_input[cx85_port*2+1] = ((val&0x10) ? 0 : 228); + TRIG_input[cx85_port] = 0; + } + } + + if (INPUT_joy_multijoy && Atari800_machine_type != Atari800_MACHINE_5200) { + PIA_PORT_input[0] = 0xf0 | STICK[joy_multijoy_no]; + PIA_PORT_input[1] = 0xff; + GTIA_TRIG[0] = TRIG_input[joy_multijoy_no]; + GTIA_TRIG[1] = 1; + } + else { + GTIA_TRIG[0] = TRIG_input[0]; + GTIA_TRIG[1] = TRIG_input[1]; + PIA_PORT_input[0] = (STICK[1] << 4) | STICK[0]; + PIA_PORT_input[1] = (STICK[3] << 4) | STICK[2]; + } + if (Atari800_machine_type != Atari800_MACHINE_XLXE) { + GTIA_TRIG[2] = TRIG_input[2]; + GTIA_TRIG[3] = TRIG_input[3]; + } + +#ifdef EVENT_RECORDING + update_adler32_of_screen(); +#endif +} + +#ifdef EVENT_RECORDING +static void update_adler32_of_screen(void) +{ + unsigned int adler32val = 0; + static unsigned int adler32_errors = 0; + static int first = TRUE; + if (first) { /* don't calculate the first frame */ + first = FALSE; + adler32val = 0; + } + else if (recording || playingback){ + adler32val = compute_adler32_of_screen(); + } + + if (recording) { + gzprintf(recordfp, "%08X \n", adler32val); + } + if (playingback) { + unsigned int pb_adler32val; + gzgets(playbackfp, gzbuf, GZBUFSIZE); + sscanf(gzbuf, "%08X ", &pb_adler32val); + if (pb_adler32val != adler32val){ + Log_print("adler32 does not match"); + adler32_errors++; + } + + } + if (playingback && gzeof(playbackfp)) { + playingback = FALSE; + gzclose(playbackfp); + Atari800_ErrExit(); + exit(adler32_errors > 0 ? 1 : 0); /* return code indicates errors*/ + } +} +/* Compute the adler32 value of the visible screen */ +/* Note that the visible portion is 24..360 on the horizontal and */ +/* 0..Screen_HEIGHT on the vertical */ +static unsigned int compute_adler32_of_screen(void) +{ + int y; + unsigned int adler = adler32(0L,Z_NULL,0); + for (y = 0; y < Screen_HEIGHT; y++) { + adler = adler32(adler, (unsigned char*)Screen_atari + 24 + Screen_WIDTH*y, 360 - 24); + } + return adler; +} +#endif /* EVENT_RECORDING */ + +int INPUT_Recording(void) +{ +#ifdef EVENT_RECORDING + return recording; +#else + return 0; +#endif +} + +int INPUT_Playingback(void) +{ +#ifdef EVENT_RECORDING + return playingback; +#else + return 0; +#endif +} + +void INPUT_RecordInt(int i) +{ +#ifdef EVENT_RECORDING + if (recording) gzprintf(recordfp, "%d\n", i); +#endif +} + +int INPUT_PlaybackInt(void) +{ +#ifdef EVENT_RECORDING + int i; + if (playingback) { + gzgets(playbackfp, gzbuf, GZBUFSIZE); + sscanf(gzbuf, "%d", &i); + } + return i; +#else + return 0; +#endif +} + +void INPUT_Scanline(void) +{ + if (--scanline_counter == 0) { + mouse_step(); + if (INPUT_mouse_mode == INPUT_MOUSE_TRAK) { + /* bit 3 toggles - vertical movement, bit 2 = 0 - up */ + /* bit 1 toggles - horizontal movement, bit 0 = 0 - left */ + STICK[INPUT_mouse_port] = ((mouse_y & 1) << 3) | (mouse_last_down << 2) + | ((mouse_x & 1) << 1) | mouse_last_right; + } + else { + STICK[INPUT_mouse_port] = (INPUT_mouse_mode == INPUT_MOUSE_AMIGA ? mouse_amiga_codes : mouse_st_codes) + [(mouse_y & 3) * 4 + (mouse_x & 3)]; + } + PIA_PORT_input[0] = (STICK[1] << 4) | STICK[0]; + PIA_PORT_input[1] = (STICK[3] << 4) | STICK[2]; + scanline_counter = max_scanline_counter; + } +} + +void INPUT_SelectMultiJoy(int no) +{ + no &= 3; + joy_multijoy_no = no; + if (INPUT_joy_multijoy && Atari800_machine_type != Atari800_MACHINE_5200) { + PIA_PORT_input[0] = 0xf0 | STICK[no]; + GTIA_TRIG[0] = TRIG_input[no]; + } +} + +void INPUT_CenterMousePointer(void) +{ + switch (INPUT_mouse_mode) { + case INPUT_MOUSE_PAD: + case INPUT_MOUSE_TOUCH: + case INPUT_MOUSE_KOALA: + mouse_x = 114 << MOUSE_SHIFT; + mouse_y = 114 << MOUSE_SHIFT; + break; + case INPUT_MOUSE_PEN: + case INPUT_MOUSE_GUN: + mouse_x = 84 << MOUSE_SHIFT; + mouse_y = 60 << MOUSE_SHIFT; + break; + case INPUT_MOUSE_AMIGA: + case INPUT_MOUSE_ST: + case INPUT_MOUSE_TRAK: + case INPUT_MOUSE_JOY: + mouse_move_x = 0; + mouse_move_y = 0; + break; + } +} + +#ifndef CURSES_BASIC + +#define PLOT(dx, dy) do {\ + ptr[(dx) + Screen_WIDTH * (dy)] ^= 0x0f0f;\ + ptr[(dx) + Screen_WIDTH * (dy) + Screen_WIDTH / 2] ^= 0x0f0f;\ + } while (0) + +/* draw light pen cursor */ +void INPUT_DrawMousePointer(void) +{ + if ((INPUT_mouse_mode == INPUT_MOUSE_PEN || INPUT_mouse_mode == INPUT_MOUSE_GUN) && mouse_pen_show_pointer) { + int x = mouse_x >> MOUSE_SHIFT; + int y = mouse_y >> MOUSE_SHIFT; + if (x >= 0 && x <= 167 && y >= 0 && y <= 119) { + UWORD *ptr = & ((UWORD *) Screen_atari)[12 + x + Screen_WIDTH * y]; + PLOT(-2, 0); + PLOT(-1, 0); + PLOT(1, 0); + PLOT(2, 0); + if (y >= 1) { + PLOT(0, -1); + if (y >= 2) + PLOT(0, -2); + } + if (y <= 118) { + PLOT(0, 1); + if (y <= 117) + PLOT(0, 2); + } + } + } +} + +#endif /* CURSES_BASIC */ diff --git a/PVAtari800/atari800-src/input.h b/PVAtari800/atari800-src/input.h new file mode 100644 index 0000000000..00cf781f4f --- /dev/null +++ b/PVAtari800/atari800-src/input.h @@ -0,0 +1,93 @@ +#ifndef INPUT_H_ +#define INPUT_H_ + +/* Keyboard AKEY_* are in akey.h */ + +/* INPUT_key_consol masks */ +/* Note: INPUT_key_consol should be INPUT_CONSOL_NONE if no consol key is pressed. + When a consol key is pressed, corresponding bit should be cleared. + */ +#define INPUT_CONSOL_NONE 0x07 +#define INPUT_CONSOL_START 0x01 +#define INPUT_CONSOL_SELECT 0x02 +#define INPUT_CONSOL_OPTION 0x04 + +extern int INPUT_key_code; /* regular Atari key code */ +extern int INPUT_key_shift; /* Shift key pressed */ +extern int INPUT_key_consol; /* Start, Select and Option keys */ + +/* Joysticks ----------------------------------------------------------- */ + +/* joystick position */ +#define INPUT_STICK_LL 0x09 +#define INPUT_STICK_BACK 0x0d +#define INPUT_STICK_LR 0x05 +#define INPUT_STICK_LEFT 0x0b +#define INPUT_STICK_CENTRE 0x0f +#define INPUT_STICK_RIGHT 0x07 +#define INPUT_STICK_UL 0x0a +#define INPUT_STICK_FORWARD 0x0e +#define INPUT_STICK_UR 0x06 + +/* joy_autofire values */ +#define INPUT_AUTOFIRE_OFF 0 +#define INPUT_AUTOFIRE_FIRE 1 /* Fire dependent */ +#define INPUT_AUTOFIRE_CONT 2 /* Continuous */ + +extern int INPUT_joy_autofire[4]; /* autofire mode for each Atari port */ + +extern int INPUT_joy_block_opposite_directions; /* can't move joystick left + and right simultaneously */ + +extern int INPUT_joy_multijoy; /* emulate MultiJoy4 interface */ + +/* 5200 joysticks values */ +extern int INPUT_joy_5200_min; +extern int INPUT_joy_5200_center; +extern int INPUT_joy_5200_max; + +/* Mouse --------------------------------------------------------------- */ + +/* INPUT_mouse_mode values */ +#define INPUT_MOUSE_OFF 0 +#define INPUT_MOUSE_PAD 1 /* Paddles */ +#define INPUT_MOUSE_TOUCH 2 /* Atari touch tablet */ +#define INPUT_MOUSE_KOALA 3 /* Koala pad */ +#define INPUT_MOUSE_PEN 4 /* Light pen */ +#define INPUT_MOUSE_GUN 5 /* Light gun */ +#define INPUT_MOUSE_AMIGA 6 /* Amiga mouse */ +#define INPUT_MOUSE_ST 7 /* Atari ST mouse */ +#define INPUT_MOUSE_TRAK 8 /* Atari CX22 Trak-Ball */ +#define INPUT_MOUSE_JOY 9 /* Joystick */ + +extern int INPUT_mouse_mode; /* device emulated with mouse */ +extern int INPUT_mouse_port; /* Atari port, to which the emulated device is attached */ +extern int INPUT_mouse_delta_x; /* x motion since last frame */ +extern int INPUT_mouse_delta_y; /* y motion since last frame */ +extern int INPUT_mouse_buttons; /* buttons pressed (b0: left, b1: right, b2: middle */ +extern int INPUT_mouse_speed; /* how fast the mouse pointer moves */ +extern int INPUT_mouse_pot_min; /* min. value of POKEY's POT register */ +extern int INPUT_mouse_pot_max; /* max. value of POKEY's POT register */ +extern int INPUT_mouse_pen_ofs_h; /* light pen/gun horizontal offset (for calibration) */ +extern int INPUT_mouse_pen_ofs_v; /* light pen/gun vertical offset (for calibration) */ +extern int INPUT_mouse_joy_inertia; /* how long the mouse pointer can move (time in Atari frames) + after a fast motion of mouse */ +extern int INPUT_direct_mouse; /* When true, convert the mouse pointer + position directly into POKEY POT values */ + +extern int INPUT_cx85; /* emulate CX85 numeric keypad */ +/* Functions ----------------------------------------------------------- */ + +int INPUT_Initialise(int *argc, char *argv[]); +void INPUT_Exit(void); +void INPUT_Frame(void); +void INPUT_Scanline(void); +void INPUT_SelectMultiJoy(int no); +void INPUT_CenterMousePointer(void); +void INPUT_DrawMousePointer(void); +int INPUT_Recording(void); +int INPUT_Playingback(void); +void INPUT_RecordInt(int i); +int INPUT_PlaybackInt(void); + +#endif /* INPUT_H_ */ diff --git a/PVAtari800/atari800-src/install-sh b/PVAtari800/atari800-src/install-sh new file mode 100755 index 0000000000..89fc9b098b --- /dev/null +++ b/PVAtari800/atari800-src/install-sh @@ -0,0 +1,238 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +tranformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/PVAtari800/atari800-src/joycfg.c b/PVAtari800/atari800-src/joycfg.c new file mode 100644 index 0000000000..d8ed036703 --- /dev/null +++ b/PVAtari800/atari800-src/joycfg.c @@ -0,0 +1,550 @@ +/****************************************************************** + Joystick configuration utility for David Firth's Atari800 emulator + 22.5.1998 Robert Golias (golias@fi.muni.cz) + ******************************************************************/ +#include "config.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "pcjoy.h" + +/*color attributes*/ +#define BACKGROUND 0x10 +#define MENUHEADER 0xe +#define MENUITEM 0xb +#define MENUSELECT 0x0f +#define TITLE 0xf + +char joysticks[JOYSTICKTYPES][21]={"Off","PC Analog joystick", + "LPT1 joystick","LPT2 joystick","LPT3 joystick", + "Keyset 0","Keyset 1","Keyset 2","Keyset 3"}; + +int joytypes[4]={joy_keyset0,joy_keyset1,0,0}; +/*note: keyset order: fire, downleft, down, downright, left, right, upleft, up, upright*/ +int keysets[4][9]={ {82,79,80,81,75,77,71,72,73}, + {15,44,45,46,30,32,16,17,18}, + {255,255,255,255,255,255,255,255,255}, + {255,255,255,255,255,255,255,255,255}}; + +char keynames[256][11]={ +/*keys 0-127 = normal scancodes*/ + "none","ESC","1","2","3","4","5","6", + "7","8","9","0","-","+","Backspace","Tab", + "Q","W","E","R","T","Y","U","I", + "O","P","[","]","Enter","L Ctrl","A","S", + "D","F","G","H","J","K","L",";", + "\"","`","L Shift","\\","Z","X","C","V", + "B","N","M",",",".","/","R Shift","Num *", + "L Alt","Space","CapsLock","F1","F2","F3","F4","F5", + "F6","F7","F8","F9","F10","NumLock","ScrLock","Num Home", + "Num Up","Num PgDn","Num -","Num Left","Num 5","Num Right","Num +","Num End", + "Num Down","Num PgDn","Num Ins","Num Del","Alt+PrScr","?","?","F11", + "F12","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", +/*keys 127 - 255 = extended scancodes (preceded with 0xe0) */ + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","Num Enter","R Ctrl","?","?", + "?","?","?","?","?","?","?","PrScr", + "?","?","#","?","?","?","?","?", + "?","?","?","?","?","Num /","?","PrScr", + "R Alt","?","?","?","?","?","?","?", + "?","?","?","?","?","Pause","?","Gray Home", + "Gray Up","Gray PgUp","?","Gray Left","?","Gray Right","?","Gray End", + "Gray Down","Gray PgDn","Gray Ins","Gray Del","?","?","?","?", + "?","?","?","?","?","?","?","?", + "#","#","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","?", + "?","?","?","?","?","?","?","none" + }; +/* Note: "?" = unknown combination + "#" = special prefix, ignore (like 0xe0 0xaa with Shift+Insert) + "@" = known, but unusable +*/ + +/*-----------------------------------------------------------------------*/ + +void Screen(char *title,int attr) +{ + int i; + window(1,1,80,25); + textattr(attr); + clrscr(); + gotoxy(1,1); + cputs("Ŀ"); + for (i=2;i<24;i++) + { + gotoxy(1,i);cputs(""); + gotoxy(80,i);cputs(""); + } + gotoxy(1,3); + cputs("Ĵ"); + gotoxy(1,24); + cputs(""); + gotoxy((80-strlen(title))/2,2); + cputs(title); + window(2,4,79,23); +} + +int SelectItem(char *title,int *selection,int background,...) +{ + va_list params; + int y; + int i,pos; + char *text[20]; + int lines; + int key; + + lines=0; + va_start(params,background); + while (lines<20 && (text[lines]=va_arg(params,char*))!=NULL) + lines++; + va_end(params); + + clrscr(); + y=(20-lines)/2+2; + gotoxy((78-strlen(title))/2,y-1); + textattr(background+MENUHEADER); + cputs(title); + textattr(background+MENUITEM); + for (i=0;i1) pos-=2; + while (pos>0 && *text[pos]!='-') pos--; + if (pos!=0) pos++; + while (*text[pos]=='-') pos++; + break; + case 0x151: /*PgDn*/ + while (pos=59 && lastkey<=68) || lastkey==87 || lastkey==88 || lastkey==167 + || lastkey==183 || lastkey==70 || lastkey==197; + }while ((lastkey&0xff00) || *keynames[lastkey&0xff]=='?' || *keynames[lastkey&0xff]=='#' || bad); + newval=lastkey&0xff; + if (newval==1) newval=255; + sprintf(msg,"Current setting: %s",keynames[newval]); + gotoxy(1,11); + clreol(); + gotoxy((78-strlen(msg))/2,11); + cputs(msg); + /*wait until key is depressed*/ + do{ + while (hi==lo); + lastkey=buffer[lo++]; + if (lo==100) lo=0; + }while(!(lastkey&0xff00)); + key_done(); + return newval; +} +/*------------------------------------------------------------------------*/ +void setupkeyset(int no) +{ + int select,key,i; + int keyset[9]; + char tUL[80],tU[80],tUR[80],tL[80],tR[80],tDL[80],tDR[80],tD[80],tF[80]; + + for (i=0;i<9;i++) keyset[i]=keysets[no][i]; + select=0; + do{ + sprintf(tF,"Fire: %s",keynames[keyset[0]]); + sprintf(tDL,"Down+left: %s",keynames[keyset[1]]); + sprintf(tD,"Down: %s",keynames[keyset[2]]); + sprintf(tDR,"Down+right: %s",keynames[keyset[3]]); + sprintf(tL,"Left: %s",keynames[keyset[4]]); + sprintf(tR,"Right: %s",keynames[keyset[5]]); + sprintf(tUL,"Up+left: %s",keynames[keyset[6]]); + sprintf(tU,"Up: %s",keynames[keyset[7]]); + sprintf(tUR,"Up+right: %s",keynames[keyset[8]]); + + key=SelectItem("Change settings:",&select,BACKGROUND, + tUL,tU,tUR,tL,tR,tDL,tD,tDR,tF,"-","Clear all","-", + "Accept changes", + "Discard changes",NULL); + if (key==13) + switch(select) + { + case 0:keyset[6]=choosekey("up+left",keyset[6]);select++;break; + case 1:keyset[7]=choosekey("up",keyset[7]);select++;break; + case 2:keyset[8]=choosekey("up+right",keyset[8]);select++;break; + case 3:keyset[4]=choosekey("left",keyset[4]);select++;break; + case 4:keyset[5]=choosekey("right",keyset[5]);select++;break; + case 5:keyset[1]=choosekey("down+left",keyset[1]);select++;break; + case 6:keyset[2]=choosekey("down",keyset[2]);select++;break; + case 7:keyset[3]=choosekey("down+right",keyset[3]);select++;break; + case 8:keyset[0]=choosekey("fire",keyset[0]);break; + case 10:for (i=0;i<9;i++) keyset[i]=255;break; + } + }while (key!=27 && !(key==13 && select>11)); + if (key==13 && select==12) + for (i=0;i<9;i++) keysets[no][i]=keyset[i]; +} +/*------------------------------------------------------------------------*/ + +int mainmenu(void) +{ + char joytext[4][80]; + int i,select,key; + + select=0; + do{ + for (i=0;i<4;i++) + sprintf(joytext[i],"Joystick %i: %s",i,joysticks[joytypes[i]]); + + key=SelectItem("Select function",&select,BACKGROUND,joytext[0],joytext[1], + joytext[2],joytext[3],"-", + "Configure keyset 0","Configure keyset 1", + "Configure keyset 2","Configure keyset 3","-","Test keyboard collisions", + "-","Save and exit","Exit without saving",NULL); + switch(key) + { + case 0x14d: /*right*/ + if (select<4) + { + joytypes[select]++; + if (joytypes[select]==JOYSTICKTYPES) joytypes[select]=0; + } + break; + case 0x14b: /*left*/ + if (select<4) + { + joytypes[select]--; + if (joytypes[select]==-1) joytypes[select]=JOYSTICKTYPES-1; + } + break; + case 13: /*enter*/ + if (select<4) + { + joytypes[select]++; + if (joytypes[select]==JOYSTICKTYPES) joytypes[select]=0; + }else + if (select<9) + { + setupkeyset(select-5); + }else + if (select==10) + { + testcollisions(); + } + break; + } + }while(key!=27 && !(key==13 && select>=12)); + return (key==13 && select==12); /*Save only when user pressed ENTER on 'Save&Exit' */ +} +/*------------------------------------------------------------------------*/ +void read_config() +{ + FILE *fr; + char string[256]; + char *ptr; + int i,no; + int bad=0; + + if ((fr=fopen("atari800.cfg","r"))==NULL) + { + printf("Error opening configuration file.\n" + "Execute this utility from atari800 dir after configuring it!\n"); + exit(1); + } + while (fgets(string,sizeof(string),fr)) + { + i=strlen(string); + if (i >= 2 && string[i-2]=='\r' && string[i-1]=='\n') string[i-2]='\0'; + else if (i >= 1 && (string[i-1]=='\n' || string[i-1]=='\r')) string[i-1]='\0'; + ptr=strchr(string,'='); + if (ptr) + { + *ptr++='\0'; + if (strncmp(string,"JOYSTICK_",9)==0) + { + no=string[9]-'0'; + if (no<0 || no>3) {printf("Error in config lines: %s\n",string);bad=1;} + else{ + for (i=0;i4) {printf("Error in config line: %s\n",string);bad=1;} + else + { + i=sscanf(ptr,"%d %d %d %d %d %d %d %d %d",keysets[no]+0,keysets[no]+1, + keysets[no]+2,keysets[no]+3,keysets[no]+4,keysets[no]+5, + keysets[no]+6,keysets[no]+7,keysets[no]+8); + if (i!=9) {printf("Not enough parametres for KEYSET_x: %s\n",ptr);bad=1;} + for (i=0;i<9;i++) + if (keysets[no][i]<0 || keysets[no][i]>255) + { + keysets[no][i]=255; + printf("Invalid %i. scancode in KEYSET parameter: %s\n",i+1,ptr); + bad=1; + } + } + }/*other commands are ignored*/ + } + } /*while*/ + fclose(fr); + if (bad) + exit(1); +} +void save_config() +{ + FILE *fr; + FILE *fw; + char string[256]; + int i; + + if ((fr=fopen("atari800.cfg","r"))==NULL) + { + printf("Error opening atari800.cfg!\n"); + return; + } + if ((fw=fopen("atari800.tmp","w"))==NULL) + { + printf("Error creating temporary file atari800.tmp!\n"); + fclose(fr); + return; + } + while (fgets(string,sizeof(string),fr)) + { + if (strncmp(string,"JOYSTICK_",9)!=0 && strncmp(string,"KEYSET_",7)!=0) + fputs(string,fw); /*copy all lines except those with JOYSTICK_ and KEYSET_ parameters*/ + } + fclose(fr); + i=strlen(string)-1; + if (i>=0 && string[i]!='\n') fprintf(fw,"\n"); + for (i=0;i<4;i++) + fprintf(fw,"KEYSET_%i=%i %i %i %i %i %i %i %i %i\n",i, + keysets[i][0],keysets[i][1],keysets[i][2],keysets[i][3], + keysets[i][4],keysets[i][5],keysets[i][6],keysets[i][7], + keysets[i][8]); + for (i=0;i<4;i++) + fprintf(fw,"JOYSTICK_%i=%s\n",i,joyparams[joytypes[i]]); + fclose(fw); + if (rename("atari800.tmp","atari800.cfg")==0) + printf("Configuration successfully saved.\n"); + else + printf("Error when renaming atari800.tmp to atari800.cfg!\n"); +} +/*------------------------------------------------------------------------*/ +int main() +{ + int ok; + + read_config(); + _set_screen_lines(25); + _setcursortype(_NOCURSOR); + + Screen("Joystick configuration utility for Atari 800 emulator",BACKGROUND+TITLE); + ok=mainmenu(); + + window(1,1,80,25); + textattr(0xf); + clrscr(); + _setcursortype(_NORMALCURSOR); + + if (ok) save_config(); + + return 0; +} + diff --git a/PVAtari800/atari800-src/log.c b/PVAtari800/atari800-src/log.c new file mode 100644 index 0000000000..86992ba770 --- /dev/null +++ b/PVAtari800/atari800-src/log.c @@ -0,0 +1,86 @@ +/* + * log.c - A logging facility for debugging + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#define _POSIX_C_SOURCE 200112L /* for vsnprintf */ + +#include "config.h" +#include +#include +#include +#ifdef ANDROID +#include +#endif + +#include "log.h" + +#ifdef MACOSX +# define PRINT(a) ControlManagerMessagePrint(a) +#elif defined(ANDROID) +# define PRINT(a) __android_log_write(ANDROID_LOG_DEBUG, "A800Core", a) +#else +# define PRINT(a) printf("%s", a) +#endif + +#ifdef BUFFERED_LOG +char Log_buffer[Log_BUFFER_SIZE]; +#endif + +void Log_print(char *format, ...) +{ + va_list args; + char buffer[8192]; + + va_start(args, format); +#ifdef HAVE_VSNPRINTF + vsnprintf(buffer, sizeof(buffer) - 2 /* -2 for the strcat() */, format, args); +#else + vsprintf(buffer, format, args); +#endif + va_end(args); + +#ifdef __PLUS + strcat(buffer, "\r\n"); +#else + strcat(buffer, "\n"); +#endif + +#ifdef BUFFERED_LOG + if ((strlen(Log_buffer) + strlen(buffer) + 1) > Log_BUFFER_SIZE) + *Log_buffer = 0; + + strcat(Log_buffer, buffer); +#else + PRINT(buffer); +#endif +} + +void Log_flushlog(void) +{ +#ifdef BUFFERED_LOG + if (*Log_buffer) { + PRINT(Log_buffer); + *Log_buffer = 0; + } +#endif +} diff --git a/PVAtari800/atari800-src/log.h b/PVAtari800/atari800-src/log.h new file mode 100644 index 0000000000..1bb70b457d --- /dev/null +++ b/PVAtari800/atari800-src/log.h @@ -0,0 +1,10 @@ +#ifndef LOG_H_ +#define LOG_H_ + +#define Log_BUFFER_SIZE 8192 +extern char Log_buffer[Log_BUFFER_SIZE]; + +void Log_print(char *format, ...); +void Log_flushlog(void); + +#endif /* LOG_H_ */ diff --git a/PVAtari800/atari800-src/memory.c b/PVAtari800/atari800-src/memory.c new file mode 100644 index 0000000000..e81617633b --- /dev/null +++ b/PVAtari800/atari800-src/memory.c @@ -0,0 +1,1219 @@ +/* + * memory.c - memory emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include +#include + +#include "atari.h" +#include "antic.h" +#include "cpu.h" +#include "cartridge.h" +#include "emuos.h" +#include "esc.h" +#include "gtia.h" +#include "log.h" +#include "memory.h" +#include "pbi.h" +#include "pia.h" +#include "pokey.h" +#include "util.h" +#ifndef BASIC +#include "statesav.h" +#endif + +UBYTE MEMORY_mem[65536 + 2]; + +int MEMORY_ram_size = 64; + +#ifndef PAGED_ATTRIB + +UBYTE MEMORY_attrib[65536]; + +#else /* PAGED_ATTRIB */ + +MEMORY_rdfunc MEMORY_readmap[256]; +MEMORY_wrfunc MEMORY_writemap[256]; + +typedef struct map_save { + int code; + MEMORY_rdfunc rdptr; + MEMORY_wrfunc wrptr; +} map_save; + +void MEMORY_ROM_PutByte(UWORD addr, UBYTE value) +{ +} + +map_save save_map[2] = { + {0, NULL, NULL}, /* RAM */ + {1, NULL, MEMORY_ROM_PutByte} /* ROM */ +}; + +#endif /* PAGED_ATTRIB */ + +UBYTE MEMORY_basic[8192]; +UBYTE MEMORY_os[16384]; +UBYTE MEMORY_xegame[8192]; + +int MEMORY_xe_bank = 0; +int MEMORY_selftest_enabled = 0; + +static UBYTE under_atarixl_os[16384]; +static UBYTE under_cart809F[8192]; +static UBYTE under_cartA0BF[8192]; + +static int cart809F_enabled = FALSE; +int MEMORY_cartA0BF_enabled = FALSE; + +static UBYTE *atarixe_memory = NULL; +static ULONG atarixe_memory_size = 0; + +/* RAM shadowed by Self-Test in the XE bank seen by ANTIC, when ANTIC/CPU + separate XE access is active. */ +static UBYTE antic_bank_under_selftest[0x800]; + +int MEMORY_have_basic = FALSE; /* Atari BASIC image has been successfully read (Atari 800 only) */ + +/* Axlon and Mosaic RAM expansions for Atari 400/800 only */ +static void MosaicPutByte(UWORD addr, UBYTE byte); +static UBYTE MosaicGetByte(UWORD addr, int no_side_effects); +static void AxlonPutByte(UWORD addr, UBYTE byte); +static UBYTE AxlonGetByte(UWORD addr, int no_side_effects); +static UBYTE *axlon_ram = NULL; +static int axlon_current_bankmask = 0; +int axlon_curbank = 0; +int MEMORY_axlon_num_banks = 0x00; +int MEMORY_axlon_0f_mirror = FALSE; /* The real Axlon had a mirror bank register at 0x0fc0-0x0fff, compatibles did not*/ +static UBYTE *mosaic_ram = NULL; +static int mosaic_current_num_banks = 0; +static int mosaic_curbank = 0x3f; +int MEMORY_mosaic_num_banks = 0; + +int MEMORY_enable_mapram = FALSE; + +/* Buffer for storing of MapRAM memory. */ +static UBYTE *mapram_memory = NULL; + +static void alloc_axlon_memory(void){ + if (MEMORY_axlon_num_banks > 0 && Atari800_machine_type == Atari800_MACHINE_800) { + int size = MEMORY_axlon_num_banks * 0x4000; + if (axlon_ram == NULL || axlon_current_bankmask != MEMORY_axlon_num_banks - 1) { + axlon_current_bankmask = MEMORY_axlon_num_banks - 1; + axlon_ram = (UBYTE *)Util_realloc(axlon_ram, size); + } + memset(axlon_ram, 0, size); + } else { + if (axlon_ram != NULL) { + free(axlon_ram); + axlon_ram = NULL; + axlon_current_bankmask = 0; + } + } +} + +static void alloc_mosaic_memory(void){ + if (MEMORY_mosaic_num_banks > 0 && Atari800_machine_type == Atari800_MACHINE_800) { + int size = MEMORY_mosaic_num_banks * 0x1000; + if (mosaic_ram == NULL || mosaic_current_num_banks != MEMORY_mosaic_num_banks) { + mosaic_current_num_banks = MEMORY_mosaic_num_banks; + mosaic_ram = (UBYTE *)Util_realloc(mosaic_ram, size); + } + memset(mosaic_ram, 0, size); + } else { + if (mosaic_ram != NULL) { + free(mosaic_ram); + mosaic_ram = NULL; + mosaic_current_num_banks = 0; + } + } +} + +static void AllocXEMemory(void) +{ + if (MEMORY_ram_size > 64) { + /* don't count 64 KB of base memory */ + /* count number of 16 KB banks, add 1 for saving base memory 0x4000-0x7fff */ + ULONG size = (1 + (MEMORY_ram_size - 64) / 16) * 16384; + if (size != atarixe_memory_size) { + if (atarixe_memory != NULL) + free(atarixe_memory); + atarixe_memory = (UBYTE *) Util_malloc(size); + atarixe_memory_size = size; + memset(atarixe_memory, 0, size); + } + } + /* atarixe_memory not needed, free it */ + else if (atarixe_memory != NULL) { + free(atarixe_memory); + atarixe_memory = NULL; + atarixe_memory_size = 0; + } +} + +static void AllocMapRAM(void) +{ + if (MEMORY_enable_mapram && Atari800_machine_type == Atari800_MACHINE_XLXE + && MEMORY_ram_size > 20) { + if (mapram_memory == NULL) + mapram_memory = (UBYTE *)Util_malloc(0x800); + } + else if (mapram_memory != NULL) { + free(mapram_memory); + mapram_memory = NULL; + } +} + +int MEMORY_SizeValid(int size) +{ + return size == 8 || size == 16 || size == 24 || size == 32 + || size == 40 || size == 48 || size == 52 || size == 64 + || size == 128 || size == 192 || size == MEMORY_RAM_320_RAMBO + || size == MEMORY_RAM_320_COMPY_SHOP || size == 576 || size == 1088; +} + +void MEMORY_InitialiseMachine(void) +{ + int const os_size = Atari800_machine_type == Atari800_MACHINE_800 ? 0x2800 + : Atari800_machine_type == Atari800_MACHINE_5200 ? 0x800 + : 0x4000; + int const os_rom_start = 0x10000 - os_size; + ANTIC_xe_ptr = NULL; + cart809F_enabled = FALSE; + MEMORY_cartA0BF_enabled = FALSE; + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + GTIA_TRIG[3] = 0; + if (GTIA_GRACTL & 4) + GTIA_TRIG_latch[3] = 0; + } + memcpy(MEMORY_mem + os_rom_start, MEMORY_os, os_size); + switch (Atari800_machine_type) { + case Atari800_MACHINE_5200: + MEMORY_dFillMem(0x0000, 0x00, 0xf800); + MEMORY_SetRAM(0x0000, 0x3fff); + MEMORY_SetROM(0x4000, 0xffff); +#ifndef PAGED_ATTRIB + MEMORY_SetHARDWARE(0xc000, 0xcfff); /* 5200 GTIA Chip */ + MEMORY_SetHARDWARE(0xd400, 0xd4ff); /* 5200 ANTIC Chip */ + MEMORY_SetHARDWARE(0xe800, 0xefff); /* 5200 POKEY Chip */ +#else + MEMORY_readmap[0xc0] = GTIA_GetByte; + MEMORY_readmap[0xc1] = GTIA_GetByte; + MEMORY_readmap[0xc2] = GTIA_GetByte; + MEMORY_readmap[0xc3] = GTIA_GetByte; + MEMORY_readmap[0xc4] = GTIA_GetByte; + MEMORY_readmap[0xc5] = GTIA_GetByte; + MEMORY_readmap[0xc6] = GTIA_GetByte; + MEMORY_readmap[0xc7] = GTIA_GetByte; + MEMORY_readmap[0xc8] = GTIA_GetByte; + MEMORY_readmap[0xc9] = GTIA_GetByte; + MEMORY_readmap[0xca] = GTIA_GetByte; + MEMORY_readmap[0xcb] = GTIA_GetByte; + MEMORY_readmap[0xcc] = GTIA_GetByte; + MEMORY_readmap[0xcd] = GTIA_GetByte; + MEMORY_readmap[0xce] = GTIA_GetByte; + MEMORY_readmap[0xcf] = GTIA_GetByte; + MEMORY_readmap[0xd4] = ANTIC_GetByte; + MEMORY_readmap[0xe8] = POKEY_GetByte; + MEMORY_readmap[0xe9] = POKEY_GetByte; + MEMORY_readmap[0xea] = POKEY_GetByte; + MEMORY_readmap[0xeb] = POKEY_GetByte; + MEMORY_readmap[0xec] = POKEY_GetByte; + MEMORY_readmap[0xed] = POKEY_GetByte; + MEMORY_readmap[0xee] = POKEY_GetByte; + MEMORY_readmap[0xef] = POKEY_GetByte; + + MEMORY_writemap[0xc0] = GTIA_PutByte; + MEMORY_writemap[0xc1] = GTIA_PutByte; + MEMORY_writemap[0xc2] = GTIA_PutByte; + MEMORY_writemap[0xc3] = GTIA_PutByte; + MEMORY_writemap[0xc4] = GTIA_PutByte; + MEMORY_writemap[0xc5] = GTIA_PutByte; + MEMORY_writemap[0xc6] = GTIA_PutByte; + MEMORY_writemap[0xc7] = GTIA_PutByte; + MEMORY_writemap[0xc8] = GTIA_PutByte; + MEMORY_writemap[0xc9] = GTIA_PutByte; + MEMORY_writemap[0xca] = GTIA_PutByte; + MEMORY_writemap[0xcb] = GTIA_PutByte; + MEMORY_writemap[0xcc] = GTIA_PutByte; + MEMORY_writemap[0xcd] = GTIA_PutByte; + MEMORY_writemap[0xce] = GTIA_PutByte; + MEMORY_writemap[0xcf] = GTIA_PutByte; + MEMORY_writemap[0xd4] = ANTIC_PutByte; + MEMORY_writemap[0xe8] = POKEY_PutByte; + MEMORY_writemap[0xe9] = POKEY_PutByte; + MEMORY_writemap[0xea] = POKEY_PutByte; + MEMORY_writemap[0xeb] = POKEY_PutByte; + MEMORY_writemap[0xec] = POKEY_PutByte; + MEMORY_writemap[0xed] = POKEY_PutByte; + MEMORY_writemap[0xee] = POKEY_PutByte; + MEMORY_writemap[0xef] = POKEY_PutByte; +#endif + break; + default: + { + int const base_ram = MEMORY_ram_size > 64 ? 64 * 1024 : MEMORY_ram_size * 1024; + int const hole_end = (os_rom_start < 0xd000 ? os_rom_start : 0xd000); + int const hole_start = base_ram > hole_end ? hole_end : base_ram; + ESC_PatchOS(); + MEMORY_dFillMem(0x0000, 0x00, hole_start); + MEMORY_SetRAM(0x0000, hole_start - 1); + if (hole_start < hole_end) { + MEMORY_dFillMem(hole_start, 0xff, hole_end - hole_start); + MEMORY_SetROM(hole_start, hole_end - 1); + } + if (hole_end < 0xd000) + MEMORY_SetROM(hole_end, 0xcfff); + MEMORY_SetROM(0xd800, 0xffff); +#ifndef PAGED_ATTRIB + MEMORY_SetHARDWARE(0xd000, 0xd7ff); + if (Atari800_machine_type == Atari800_MACHINE_800) { + if (MEMORY_mosaic_num_banks > 0) MEMORY_SetHARDWARE(0xff00, 0xffff); + /* only 0xffc0-0xffff are used, but mark the whole + * page to make state saving easier */ + if (MEMORY_axlon_num_banks > 0) { + MEMORY_SetHARDWARE(0xcf00, 0xcfff); + if (MEMORY_axlon_0f_mirror) MEMORY_SetHARDWARE(0x0f00, 0x0fff); + /* only ?fc0-?fff are used, but mark the whole page*/ + } + } +#else + MEMORY_readmap[0xd0] = GTIA_GetByte; + MEMORY_readmap[0xd1] = PBI_D1GetByte; + MEMORY_readmap[0xd2] = POKEY_GetByte; + MEMORY_readmap[0xd3] = PIA_GetByte; + MEMORY_readmap[0xd4] = ANTIC_GetByte; + MEMORY_readmap[0xd5] = CARTRIDGE_GetByte; + MEMORY_readmap[0xd6] = PBI_D6GetByte; + MEMORY_readmap[0xd7] = PBI_D7GetByte; + MEMORY_writemap[0xd0] = GTIA_PutByte; + MEMORY_writemap[0xd1] = PBI_D1PutByte; + MEMORY_writemap[0xd2] = POKEY_PutByte; + MEMORY_writemap[0xd3] = PIA_PutByte; + MEMORY_writemap[0xd4] = ANTIC_PutByte; + MEMORY_writemap[0xd5] = CARTRIDGE_PutByte; + MEMORY_writemap[0xd6] = PBI_D6PutByte; + MEMORY_writemap[0xd7] = PBI_D7PutByte; + if (Atari800_machine_type == Atari800_MACHINE_800) { + if (MEMORY_mosaic_num_banks > 0) MEMORY_writemap[0xff] = MosaicPutByte; + if (MEMORY_axlon_num_banks > 0) { + MEMORY_writemap[0xcf] = AxlonPutByte; + if (MEMORY_axlon_0f_mirror) + MEMORY_writemap[0x0f] = AxlonPutByte; + } + } +#endif + } + break; + } + AllocXEMemory(); + alloc_axlon_memory(); + alloc_mosaic_memory(); + axlon_curbank = 0; + mosaic_curbank = 0x3f; + AllocMapRAM(); + Atari800_Coldstart(); +} + +#ifndef BASIC + +void MEMORY_StateSave(UBYTE SaveVerbose) +{ + int temp; + UBYTE byte; + + /* Axlon/Mosaic for 400/800 */ + if (Atari800_machine_type == Atari800_MACHINE_800) { + StateSav_SaveINT(&MEMORY_axlon_num_banks, 1); + if (MEMORY_axlon_num_banks > 0){ + StateSav_SaveINT(&axlon_curbank, 1); + StateSav_SaveINT(&MEMORY_axlon_0f_mirror, 1); + StateSav_SaveUBYTE(axlon_ram, MEMORY_axlon_num_banks * 0x4000); + } + StateSav_SaveINT(&mosaic_current_num_banks, 1); + if (mosaic_current_num_banks > 0) { + StateSav_SaveINT(&mosaic_curbank, 1); + StateSav_SaveUBYTE(mosaic_ram, mosaic_current_num_banks * 0x1000); + } + } + + /* Save amount of base RAM in kilobytes. */ + temp = MEMORY_ram_size > 64 ? 64 : MEMORY_ram_size; + StateSav_SaveINT(&temp, 1); + StateSav_SaveUBYTE(&MEMORY_mem[0], 65536); +#ifndef PAGED_ATTRIB + StateSav_SaveUBYTE(&MEMORY_attrib[0], 65536); +#else + { + /* I assume here that consecutive calls to StateSav_SaveUBYTE() + are equivalent to a single call with all the values + (i.e. StateSav_SaveUBYTE() doesn't write any headers). */ + UBYTE attrib_page[256]; + int i; + for (i = 0; i < 256; i++) { + if (MEMORY_writemap[i] == NULL) + memset(attrib_page, MEMORY_RAM, 256); + else if (MEMORY_writemap[i] == MEMORY_ROM_PutByte) + memset(attrib_page, MEMORY_ROM, 256); + else if (i == 0x4f || i == 0x5f || i == 0x8f || i == 0x9f) { + /* special case: Bounty Bob bank switching registers */ + memset(attrib_page, MEMORY_ROM, 256); + attrib_page[0xf6] = MEMORY_HARDWARE; + attrib_page[0xf7] = MEMORY_HARDWARE; + attrib_page[0xf8] = MEMORY_HARDWARE; + attrib_page[0xf9] = MEMORY_HARDWARE; + } + else { + memset(attrib_page, MEMORY_HARDWARE, 256); + } + StateSav_SaveUBYTE(&attrib_page[0], 256); + } + } +#endif + + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + if (SaveVerbose != 0) + StateSav_SaveUBYTE(&MEMORY_basic[0], 8192); + StateSav_SaveUBYTE(&under_cartA0BF[0], 8192); + + if (SaveVerbose != 0) + StateSav_SaveUBYTE(&MEMORY_os[0], 16384); + StateSav_SaveUBYTE(&under_atarixl_os[0], 16384); + if (SaveVerbose != 0) + StateSav_SaveUBYTE(MEMORY_xegame, 0x2000); + } + + /* Save amount of XE RAM in 16KB banks. */ + temp = (MEMORY_ram_size - 64) / 16; + if (temp < 0) + temp = 0; + StateSav_SaveINT(&temp, 1); + if (MEMORY_ram_size == MEMORY_RAM_320_RAMBO || MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP) { + /* Save specific banking type. */ + temp = MEMORY_ram_size - 320; + StateSav_SaveINT(&temp, 1); + } + byte = PIA_PORTB | PIA_PORTB_mask; + StateSav_SaveUBYTE(&byte, 1); + + StateSav_SaveINT(&MEMORY_cartA0BF_enabled, 1); + + if (MEMORY_ram_size > 64) { + StateSav_SaveUBYTE(&atarixe_memory[0], atarixe_memory_size); + if (ANTIC_xe_ptr != NULL && MEMORY_selftest_enabled) + StateSav_SaveUBYTE(antic_bank_under_selftest, 0x800); + } + + /* Simius XL/XE MapRAM expansion */ + if (Atari800_machine_type == Atari800_MACHINE_XLXE && MEMORY_ram_size > 20) { + StateSav_SaveINT(&MEMORY_enable_mapram, 1); + if (MEMORY_enable_mapram) { + StateSav_SaveUBYTE( mapram_memory, 0x800 ); + } + } +} + +void MEMORY_StateRead(UBYTE SaveVerbose, UBYTE StateVersion) +{ + int base_ram_kb; + int num_xe_banks; + UBYTE portb; + + /* Axlon/Mosaic for 400/800 */ + if (Atari800_machine_type == Atari800_MACHINE_800 && StateVersion >= 5) { + StateSav_ReadINT(&MEMORY_axlon_num_banks, 1); + if (MEMORY_axlon_num_banks > 0){ + StateSav_ReadINT(&axlon_curbank, 1); + if (StateVersion < 7) { + /* Read bank mask, then increase by 1 to get number of banks. */ + StateSav_ReadINT(&MEMORY_axlon_num_banks, 1); + ++ MEMORY_axlon_num_banks; + } + StateSav_ReadINT(&MEMORY_axlon_0f_mirror, 1); + if (StateVersion < 7) { + int temp; + /* Ignore saved RAM size - can be derived. */ + StateSav_ReadINT(&temp, 1); + } + alloc_axlon_memory(); + StateSav_ReadUBYTE(axlon_ram, MEMORY_axlon_num_banks * 0x4000); + } + StateSav_ReadINT(&MEMORY_mosaic_num_banks, 1); + if (MEMORY_mosaic_num_banks > 0) { + StateSav_ReadINT(&mosaic_curbank, 1); + if (StateVersion < 7) { + int temp; + /* Read max bank number, then increase by 1 to get number of banks. */ + StateSav_ReadINT(&MEMORY_mosaic_num_banks, 1); + ++ MEMORY_mosaic_num_banks; + StateSav_ReadINT(&temp, 1); /* Ignore Mosaic RAM size - can be derived. */ + } + alloc_mosaic_memory(); + StateSav_ReadUBYTE(mosaic_ram, mosaic_current_num_banks * 0x1000); + } + } + + if (StateVersion >= 7) + /* Read amount of base RAM in kilobytes. */ + StateSav_ReadINT(&base_ram_kb, 1); + StateSav_ReadUBYTE(&MEMORY_mem[0], 65536); +#ifndef PAGED_ATTRIB + StateSav_ReadUBYTE(&MEMORY_attrib[0], 65536); +#else + { + UBYTE attrib_page[256]; + int i; + for (i = 0; i < 256; i++) { + StateSav_ReadUBYTE(&attrib_page[0], 256); + /* note: 0x40 is intentional here: + we want ROM on page 0xd1 if H: patches are enabled */ + switch (attrib_page[0x40]) { + case MEMORY_RAM: + MEMORY_readmap[i] = NULL; + MEMORY_writemap[i] = NULL; + break; + case MEMORY_ROM: + if (i != 0xd1 && attrib_page[0xf6] == MEMORY_HARDWARE) { + if (i == 0x4f || i == 0x8f) { + MEMORY_readmap[i] = CARTRIDGE_BountyBob1GetByte; + MEMORY_writemap[i] = CARTRIDGE_BountyBob1PutByte; + } + else if (i == 0x5f || i == 0x9f) { + MEMORY_readmap[i] = CARTRIDGE_BountyBob2GetByte; + MEMORY_writemap[i] = CARTRIDGE_BountyBob2PutByte; + } + /* else something's wrong, so we keep current values */ + } + else { + MEMORY_readmap[i] = NULL; + MEMORY_writemap[i] = MEMORY_ROM_PutByte; + } + break; + case MEMORY_HARDWARE: + switch (i) { + case 0xc0: + case 0xd0: + MEMORY_readmap[i] = GTIA_GetByte; + MEMORY_writemap[i] = GTIA_PutByte; + break; + case 0xd1: + MEMORY_readmap[i] = PBI_D1GetByte; + MEMORY_writemap[i] = PBI_D1PutByte; + break; + case 0xd2: + case 0xe8: + case 0xeb: + MEMORY_readmap[i] = POKEY_GetByte; + MEMORY_writemap[i] = POKEY_PutByte; + break; + case 0xd3: + MEMORY_readmap[i] = PIA_GetByte; + MEMORY_writemap[i] = PIA_PutByte; + break; + case 0xd4: + MEMORY_readmap[i] = ANTIC_GetByte; + MEMORY_writemap[i] = ANTIC_PutByte; + break; + case 0xd5: + MEMORY_readmap[i] = CARTRIDGE_GetByte; + MEMORY_writemap[i] = CARTRIDGE_PutByte; + break; + case 0xd6: + MEMORY_readmap[i] = PBI_D6GetByte; + MEMORY_writemap[i] = PBI_D6PutByte; + break; + case 0xd7: + MEMORY_readmap[i] = PBI_D7GetByte; + MEMORY_writemap[i] = PBI_D7PutByte; + break; + case 0xff: + if (MEMORY_mosaic_num_banks > 0) MEMORY_writemap[0xff] = MosaicPutByte; + break; + case 0xcf: + if (MEMORY_axlon_num_banks > 0) MEMORY_writemap[0xcf] = AxlonPutByte; + break; + case 0x0f: + if (MEMORY_axlon_num_banks > 0 && MEMORY_axlon_0f_mirror) MEMORY_writemap[0x0f] = AxlonPutByte; + break; + default: + /* something's wrong, so we keep current values */ + break; + } + break; + default: + /* something's wrong, so we keep current values */ + break; + } + } + } +#endif + + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + if (SaveVerbose) + StateSav_ReadUBYTE(&MEMORY_basic[0], 8192); + StateSav_ReadUBYTE(&under_cartA0BF[0], 8192); + + if (SaveVerbose) + StateSav_ReadUBYTE(&MEMORY_os[0], 16384); + StateSav_ReadUBYTE(&under_atarixl_os[0], 16384); + if (StateVersion >= 7 && SaveVerbose) + StateSav_ReadUBYTE(MEMORY_xegame, 0x2000); + } + + if (StateVersion >= 7) { + /* Read amount of XE RAM in 16KB banks. */ + StateSav_ReadINT(&num_xe_banks, 1); + /* Compute value of MEMORY_ram_size. */ + MEMORY_ram_size = base_ram_kb + num_xe_banks * 16; + if (MEMORY_ram_size == 320) { + /* There are 2 different memory mappings for 320 KB. */ + /* In savestate version <= 6 this variable is read in PIA_StateRead. */ + int xe_type; + StateSav_ReadINT(&xe_type, 1); + MEMORY_ram_size += xe_type; + } + if (!MEMORY_SizeValid(MEMORY_ram_size)) { + MEMORY_ram_size = 64; + Log_print("Warning: Bad RAM size read in from state save, defaulting to 64 KB"); + } + + /* Read PORTB and set variables that are based on it. */ + StateSav_ReadUBYTE(&portb, 1); + MEMORY_xe_bank = 0; + if (MEMORY_ram_size > 64 && (portb & 0x30) != 0x30) { + switch (MEMORY_ram_size) { + case 128: + MEMORY_xe_bank = ((portb & 0x0c) >> 2) + 1; + break; + case 192: + MEMORY_xe_bank = (((portb & 0x0c) + ((portb & 0x40) >> 2)) >> 2) + 1; + break; + case MEMORY_RAM_320_RAMBO: + MEMORY_xe_bank = (((portb & 0x0c) + ((portb & 0x60) >> 1)) >> 2) + 1; + break; + case MEMORY_RAM_320_COMPY_SHOP: + MEMORY_xe_bank = (((portb & 0x0c) + ((portb & 0xc0) >> 2)) >> 2) + 1; + break; + case 576: + MEMORY_xe_bank = (((portb & 0x0e) + ((portb & 0x60) >> 1)) >> 1) + 1; + break; + case 1088: + MEMORY_xe_bank = (((portb & 0x0e) + ((portb & 0xe0) >> 1)) >> 1) + 1; + break; + } + } + /* In savestate version <= 6 this variable is read in PIA_StateRead. */ + MEMORY_selftest_enabled = (portb & 0x81) == 0x01 + && !((portb & 0x30) != 0x30 && MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP) + && !((portb & 0x10) == 0 && MEMORY_ram_size == 1088); + + StateSav_ReadINT(&MEMORY_cartA0BF_enabled, 1); + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + GTIA_TRIG[3] = MEMORY_cartA0BF_enabled; + if (MEMORY_cartA0BF_enabled == 0 && (GTIA_GRACTL & 4)) + GTIA_TRIG_latch[3] = 0; + } + } + ANTIC_xe_ptr = NULL; + AllocXEMemory(); + if (MEMORY_ram_size > 64) { + StateSav_ReadUBYTE(&atarixe_memory[0], atarixe_memory_size); + /* a hack that makes state files compatible with previous versions: + for 130 XE there's written 192 KB of unused data */ + if (MEMORY_ram_size == 128 && StateVersion <= 6) { + UBYTE buffer[256]; + int i; + for (i = 0; i < 192 * 4; i++) + StateSav_ReadUBYTE(&buffer[0], 256); + } + if (StateVersion >= 7 && (MEMORY_ram_size == 128 || MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP)) { + switch (portb & 0x30) { + case 0x20: /* ANTIC: base, CPU: extended */ + ANTIC_xe_ptr = atarixe_memory; + break; + case 0x10: /* ANTIC: extended, CPU: base */ + ANTIC_xe_ptr = atarixe_memory + (MEMORY_xe_bank << 14); + break; + default: /* ANTIC same as CPU */ + ANTIC_xe_ptr = NULL; + break; + } + + if (ANTIC_xe_ptr != NULL && MEMORY_selftest_enabled) + /* Also read ANTIC-visible memory shadowed by Self Test. */ + StateSav_ReadUBYTE(antic_bank_under_selftest, 0x800); + + } + } + + /* Simius XL/XE MapRAM expansion */ + if (StateVersion >= 7 && Atari800_machine_type == Atari800_MACHINE_XLXE && MEMORY_ram_size > 20) { + StateSav_ReadINT(&MEMORY_enable_mapram, 1); + AllocMapRAM(); + if (mapram_memory != NULL) { + StateSav_ReadUBYTE(mapram_memory, 0x800); + } + } +} + +#endif /* BASIC */ + +void MEMORY_CopyFromMem(UWORD from, UBYTE *to, int size) +{ + while (--size >= 0) { + *to++ = MEMORY_GetByte(from); + from++; + } +} + +void MEMORY_CopyToMem(const UBYTE *from, UWORD to, int size) +{ + while (--size >= 0) { + MEMORY_PutByte(to, *from); + from++; + to++; + } +} + + +/* Returns NULL if both builtin BASIC and XEGS game are disabled. + Otherwise returns a pointer to an 8KB array containing either + BASIC or XEGS game ROM contents. */ +static UBYTE const * builtin_cart(UBYTE portb) +{ + /* Normally BASIC is enabled by clearing bit 1 of PORTB, but it's disabled + when using 576K and 1088K memory expansions, where bit 1 is used for + selecting extended memory bank number. */ + if (Atari800_builtin_basic + && (portb & 0x02) == 0 + && ((portb & 0x10) != 0 || (MEMORY_ram_size != 576 && MEMORY_ram_size != 1088))) + return MEMORY_basic; + /* The builtin XEGS game is disabled when BASIC is enabled. It is enabled + by setting bit 6 of PORTB, but it's disabled when using 320K and larger + XE memory expansions, where bit 6 is used for selecting extended memory + bank number. */ + if (Atari800_builtin_game + && (portb & 0x40) == 0 + && ((portb & 0x10) != 0 || MEMORY_ram_size < 320)) + return MEMORY_xegame; + return NULL; +} + +/* Note: this function is only for XL/XE! */ +void MEMORY_HandlePORTB(UBYTE byte, UBYTE oldval) +{ + int antic_bank = 0; + int mapram_selected = FALSE; + int new_mapram_selected = FALSE; + + /* MapRAM is selected if RAM > 20 KB, Self Test is enabled while OS ROM is disabled, + and both CPU & ANTIC have access to base RAM. */ + if (mapram_memory != NULL && MEMORY_ram_size > 20) { + mapram_selected = (oldval & 0xb1) == 0x30; + new_mapram_selected = (byte & 0xb1) == 0x30; + } + + if (mapram_selected && !new_mapram_selected) { + /* Restore RAM hidden by MapRAM. */ + memcpy(mapram_memory, MEMORY_mem + 0x5000, 0x800); + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + } + + /* Switch XE memory bank in 0x4000-0x7fff */ + if (MEMORY_ram_size > 64) { + int bank = 0; + int cpu_bank, new_cpu_bank, new_antic_bank; + /* bank = 0 : base RAM */ + /* bank = 1..64 : extended RAM */ + if ((byte & 0x30) != 0x30) + switch (MEMORY_ram_size) { + case 128: + bank = ((byte & 0x0c) >> 2) + 1; + break; + case 192: + bank = (((byte & 0x0c) + ((byte & 0x40) >> 2)) >> 2) + 1; + break; + case MEMORY_RAM_320_RAMBO: + bank = (((byte & 0x0c) + ((byte & 0x60) >> 1)) >> 2) + 1; + break; + case MEMORY_RAM_320_COMPY_SHOP: + bank = (((byte & 0x0c) + ((byte & 0xc0) >> 2)) >> 2) + 1; + break; + case 576: + bank = (((byte & 0x0e) + ((byte & 0x60) >> 1)) >> 1) + 1; + break; + case 1088: + bank = (((byte & 0x0e) + ((byte & 0xe0) >> 1)) >> 1) + 1; + break; + } + cpu_bank = (oldval & 0x10) ? 0 : MEMORY_xe_bank; + new_cpu_bank = (byte & 0x10) ? 0 : bank; + antic_bank = (oldval & 0x20) ? 0 : MEMORY_xe_bank; + new_antic_bank = (byte & 0x20) ? 0 : bank; + + /* Note: in Compy Shop bit 5 (ANTIC access) disables Self Test */ + if (MEMORY_selftest_enabled + && (cpu_bank != new_cpu_bank + || antic_bank != new_antic_bank + || (MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP && (byte & 0x20) == 0))) { + /* Disable Self Test ROM */ + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also disable Self Test from XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_selftest, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + MEMORY_selftest_enabled = FALSE; + } + if (cpu_bank != new_cpu_bank) { + memcpy(atarixe_memory + (cpu_bank << 14), MEMORY_mem + 0x4000, 0x4000); + memcpy(MEMORY_mem + 0x4000, atarixe_memory + (new_cpu_bank << 14), 0x4000); + } + + if (MEMORY_ram_size == 128 || MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP) + ANTIC_xe_ptr = new_antic_bank == new_cpu_bank ? NULL : atarixe_memory + (new_antic_bank << 14); + + MEMORY_xe_bank = bank; + antic_bank = new_antic_bank; + } + + /* Enable/disable OS ROM in 0xc000-0xcfff and 0xd800-0xffff */ + if ((oldval ^ byte) & 0x01) { + if (byte & 0x01) { + /* Enable OS ROM */ + if (MEMORY_ram_size > 48) { + memcpy(under_atarixl_os, MEMORY_mem + 0xc000, 0x1000); + memcpy(under_atarixl_os + 0x1800, MEMORY_mem + 0xd800, 0x2800); + MEMORY_SetROM(0xc000, 0xcfff); + MEMORY_SetROM(0xd800, 0xffff); + } + memcpy(MEMORY_mem + 0xc000, MEMORY_os, 0x1000); + memcpy(MEMORY_mem + 0xd800, MEMORY_os + 0x1800, 0x2800); + ESC_PatchOS(); + } + else { + /* Disable OS ROM */ + if (MEMORY_ram_size > 48) { + memcpy(MEMORY_mem + 0xc000, under_atarixl_os, 0x1000); + memcpy(MEMORY_mem + 0xd800, under_atarixl_os + 0x1800, 0x2800); + MEMORY_SetRAM(0xc000, 0xcfff); + MEMORY_SetRAM(0xd800, 0xffff); + } else { + MEMORY_dFillMem(0xc000, 0xff, 0x1000); + MEMORY_dFillMem(0xd800, 0xff, 0x2800); + } + /* When OS ROM is disabled we also have to disable Self Test - Jindroush */ + if (MEMORY_selftest_enabled) { + if (MEMORY_ram_size > 20) { + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also disable Self Test from XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_selftest, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + } + else + MEMORY_dFillMem(0x5000, 0xff, 0x800); + MEMORY_selftest_enabled = FALSE; + } + } + } + + /* Enable/disable BASIC/game ROM in 0xa000-0xbfff */ + if (!MEMORY_cartA0BF_enabled) { + UBYTE const *builtin_cart_new = builtin_cart(byte); + UBYTE const *builtin_cart_old = builtin_cart(oldval); + if (builtin_cart_old != builtin_cart_new) { + if (builtin_cart_old == NULL && MEMORY_ram_size > 40) { /* switching RAM out */ + memcpy(under_cartA0BF, MEMORY_mem + 0xa000, 0x2000); + MEMORY_SetROM(0xa000, 0xbfff); + } + if (builtin_cart_new == NULL) { /* switching RAM in */ + if (MEMORY_ram_size > 40) { + memcpy(MEMORY_mem + 0xa000, under_cartA0BF, 0x2000); + MEMORY_SetRAM(0xa000, 0xbfff); + } + else + MEMORY_dFillMem(0xa000, 0xff, 0x2000); + } + else + memcpy(MEMORY_mem + 0xa000, builtin_cart_new, 0x2000); + } + } + + /* Enable/disable Self Test ROM in 0x5000-0x57ff */ + if (byte & 0x80) { + if (MEMORY_selftest_enabled) { + /* Disable Self Test ROM */ + if (MEMORY_ram_size > 20) { + memcpy(MEMORY_mem + 0x5000, under_atarixl_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also disable Self Test from XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, antic_bank_under_selftest, 0x800); + MEMORY_SetRAM(0x5000, 0x57ff); + } + else + MEMORY_dFillMem(0x5000, 0xff, 0x800); + MEMORY_selftest_enabled = FALSE; + } + } + else { + /* We can enable Self Test only if the OS ROM is enabled */ + /* and we're not accessing extended 320K Compy Shop or 1088K memory */ + /* Note: in Compy Shop bit 5 (ANTIC access) disables Self Test */ + if (!MEMORY_selftest_enabled && (byte & 0x01) + && !((byte & 0x30) != 0x30 && MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP) + && !((byte & 0x10) == 0 && MEMORY_ram_size == 1088)) { + /* Enable Self Test ROM */ + if (MEMORY_ram_size > 20) { + memcpy(under_atarixl_os + 0x1000, MEMORY_mem + 0x5000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also backup RAM under Self Test from XE bank accessed by ANTIC. */ + memcpy(antic_bank_under_selftest, atarixe_memory + (antic_bank << 14) + 0x1000, 0x800); + MEMORY_SetROM(0x5000, 0x57ff); + } + memcpy(MEMORY_mem + 0x5000, MEMORY_os + 0x1000, 0x800); + if (ANTIC_xe_ptr != NULL) + /* Also enable Self Test in the XE bank accessed by ANTIC. */ + memcpy(atarixe_memory + (antic_bank << 14) + 0x1000, MEMORY_os + 0x1000, 0x800); + MEMORY_selftest_enabled = TRUE; + } + else if (!mapram_selected && new_mapram_selected) { + /* Enable MapRAM */ + memcpy(under_atarixl_os + 0x1000, MEMORY_mem + 0x5000, 0x800); + memcpy(MEMORY_mem + 0x5000, mapram_memory, 0x800); + } + } +} + +/* Mosaic banking scheme: writing to 0xffc0+ selects ram bank , if + * that is past the last available bank, selects rom. Banks are 4k, + * located at 0xc000-0xcfff. Tested: Rambrandt (drawing program), Topdos1.5. + * Reverse engineered from software that uses it. May be incorrect in some + * details. Unknown: were there mirrors of the bank addresses? Was the RAM + * enabled at coldstart? Did the Mosaic home-bank on reset? + * The Topdos 1.5 manual has some information. + */ +static void MosaicPutByte(UWORD addr, UBYTE byte) +{ + int newbank; + if (addr < 0xffc0) return; +#ifdef DEBUG + Log_print("MosaicPutByte:%4X:%2X",addr,byte); +#endif + newbank = addr - 0xffc0; + if (newbank == mosaic_curbank || (newbank >= mosaic_current_num_banks && mosaic_curbank >= mosaic_current_num_banks)) return; /*same bank or rom -> rom*/ + if (newbank >= mosaic_current_num_banks && mosaic_curbank < mosaic_current_num_banks) { + /*ram ->rom*/ + memcpy(mosaic_ram + mosaic_curbank*0x1000, MEMORY_mem + 0xc000,0x1000); + MEMORY_dFillMem(0xc000, 0xff, 0x1000); + MEMORY_SetROM(0xc000, 0xcfff); + } + else if (newbank < mosaic_current_num_banks && mosaic_curbank >= mosaic_current_num_banks) { + /*rom->ram*/ + memcpy(MEMORY_mem + 0xc000, mosaic_ram+newbank*0x1000,0x1000); + MEMORY_SetRAM(0xc000, 0xcfff); + } + else { + /*ram -> ram*/ + memcpy(mosaic_ram + mosaic_curbank*0x1000, MEMORY_mem + 0xc000, 0x1000); + memcpy(MEMORY_mem + 0xc000, mosaic_ram + newbank*0x1000, 0x1000); + MEMORY_SetRAM(0xc000, 0xcfff); + } + mosaic_curbank = newbank; +} + +static UBYTE MosaicGetByte(UWORD addr, int no_side_effects) +{ +#ifdef DEBUG + Log_print("MosaicGetByte%4X",addr); +#endif + return MEMORY_mem[addr]; +} + +/* Axlon banking scheme: writing to 0xcfc0-0xcfff selects a bank. The Axlon + * used 3 bits, giving 8 banks. Extended versions were constructed that + * used additional bits, for up to 256 banks. Banks were 16k, at 0x4000-0x7fff. + * The total ram was 32+16*numbanks k. The Axlon did homebank on reset, + * compatibles did not. The Axlon had a shadow address at 0x0fc0-0x0fff. + * A possible explaination for the shadow address is that it allowed the + * Axlon to work in any 800 slot due to a hardware limitation. + * The shadow address could cause compatibility problems. The compatibles + * did not implement that shadow address. + * Source: comp.sys.atari.8bit postings, Andreas Magenheimer's FAQ + */ +static void AxlonPutByte(UWORD addr, UBYTE byte) +{ + int newbank; + /*Write-through to RAM if it is the page 0x0f shadow*/ + if ((addr&0xff00) == 0x0f00) MEMORY_mem[addr] = byte; + if ((addr&0xff) < 0xc0) return; /*0xffc0-0xffff and 0x0fc0-0x0fff only*/ +#ifdef DEBUG + Log_print("AxlonPutByte:%4X:%2X", addr, byte); +#endif + newbank = (byte&axlon_current_bankmask); + if (newbank == axlon_curbank) return; + memcpy(axlon_ram + axlon_curbank*0x4000, MEMORY_mem + 0x4000, 0x4000); + memcpy(MEMORY_mem + 0x4000, axlon_ram + newbank*0x4000, 0x4000); + axlon_curbank = newbank; +} + +static UBYTE AxlonGetByte(UWORD addr, int no_side_effects) +{ +#ifdef DEBUG + Log_print("AxlonGetByte%4X",addr); +#endif + return MEMORY_mem[addr]; +} + +void MEMORY_Cart809fDisable(void) +{ + if (cart809F_enabled) { + if (MEMORY_ram_size > 32) { + memcpy(MEMORY_mem + 0x8000, under_cart809F, 0x2000); + MEMORY_SetRAM(0x8000, 0x9fff); + } + else + MEMORY_dFillMem(0x8000, 0xff, 0x2000); + cart809F_enabled = FALSE; + } +} + +void MEMORY_Cart809fEnable(void) +{ + if (!cart809F_enabled) { + if (MEMORY_ram_size > 32) { + memcpy(under_cart809F, MEMORY_mem + 0x8000, 0x2000); + MEMORY_SetROM(0x8000, 0x9fff); + } + cart809F_enabled = TRUE; + } +} + +void MEMORY_CartA0bfDisable(void) +{ + if (MEMORY_cartA0BF_enabled) { + /* No BASIC if not XL/XE or bit 1 of PORTB set */ + /* or accessing extended 576K or 1088K memory */ + UBYTE const *builtin = builtin_cart(PIA_PORTB | PIA_PORTB_mask); + if (builtin == NULL) { /* switch RAM in */ + if (MEMORY_ram_size > 40) { + memcpy(MEMORY_mem + 0xa000, under_cartA0BF, 0x2000); + MEMORY_SetRAM(0xa000, 0xbfff); + } + else + MEMORY_dFillMem(0xa000, 0xff, 0x2000); + } + else + memcpy(MEMORY_mem + 0xa000, builtin, 0x2000); + MEMORY_cartA0BF_enabled = FALSE; + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + GTIA_TRIG[3] = 0; + if (GTIA_GRACTL & 4) + GTIA_TRIG_latch[3] = 0; + } + } +} + +void MEMORY_CartA0bfEnable(void) +{ + if (!MEMORY_cartA0BF_enabled) { + /* No BASIC if not XL/XE or bit 1 of PORTB set */ + /* or accessing extended 576K or 1088K memory */ + if (MEMORY_ram_size > 40 && builtin_cart(PIA_PORTB | PIA_PORTB_mask) == NULL) { + /* Back-up 0xa000-0xbfff RAM */ + memcpy(under_cartA0BF, MEMORY_mem + 0xa000, 0x2000); + MEMORY_SetROM(0xa000, 0xbfff); + } + MEMORY_cartA0BF_enabled = TRUE; + if (Atari800_machine_type == Atari800_MACHINE_XLXE) + GTIA_TRIG[3] = 1; + } +} + +void MEMORY_GetCharset(UBYTE *cs) +{ + /* copy font, but change screencode order to ATASCII order */ + memcpy(cs, emuos_h + 0x200, 0x100); /* control chars */ + memcpy(cs + 0x100, emuos_h, 0x200); /* !"#$..., uppercase letters */ + memcpy(cs + 0x300, emuos_h + 0x300, 0x100); /* lowercase letters */ +} + +#ifndef PAGED_MEM +UBYTE MEMORY_HwGetByte(UWORD addr, int no_side_effects) +{ + UBYTE byte = 0xff; + switch (addr & 0xff00) { + case 0x4f00: + case 0x8f00: + if (!no_side_effects) + CARTRIDGE_BountyBob1(addr); + byte = 0; + break; + case 0x5f00: + case 0x9f00: + if (!no_side_effects) + CARTRIDGE_BountyBob2(addr); + byte = 0; + break; + case 0xd000: /* GTIA */ + case 0xc000: /* GTIA - 5200 */ + case 0xc100: /* GTIA - 5200 */ + case 0xc200: /* GTIA - 5200 */ + case 0xc300: /* GTIA - 5200 */ + case 0xc400: /* GTIA - 5200 */ + case 0xc500: /* GTIA - 5200 */ + case 0xc600: /* GTIA - 5200 */ + case 0xc700: /* GTIA - 5200 */ + case 0xc800: /* GTIA - 5200 */ + case 0xc900: /* GTIA - 5200 */ + case 0xca00: /* GTIA - 5200 */ + case 0xcb00: /* GTIA - 5200 */ + case 0xcc00: /* GTIA - 5200 */ + case 0xcd00: /* GTIA - 5200 */ + case 0xce00: /* GTIA - 5200 */ + byte = GTIA_GetByte(addr, no_side_effects); + break; + case 0xd200: /* POKEY */ + case 0xe800: /* POKEY - 5200 */ + case 0xe900: /* POKEY - 5200 */ + case 0xea00: /* POKEY - 5200 */ + case 0xeb00: /* POKEY - 5200 */ + case 0xec00: /* POKEY - 5200 */ + case 0xed00: /* POKEY - 5200 */ + case 0xee00: /* POKEY - 5200 */ + case 0xef00: /* POKEY - 5200 */ + byte = POKEY_GetByte(addr, no_side_effects); + break; + case 0xd300: /* PIA */ + byte = PIA_GetByte(addr, no_side_effects); + break; + case 0xd400: /* ANTIC */ + byte = ANTIC_GetByte(addr, no_side_effects); + break; + case 0xd500: /* bank-switching cartridges, RTIME-8 */ + byte = CARTRIDGE_GetByte(addr, no_side_effects); + break; + case 0xff00: /* Mosaic memory expansion for 400/800 */ + byte = MosaicGetByte(addr, no_side_effects); + break; + case 0xcf00: /* Axlon memory expansion for 800 */ + case 0x0f00: /* Axlon shadow */ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + byte = GTIA_GetByte(addr, no_side_effects); /* GTIA-5200 cfxx */ + } + else { + byte = AxlonGetByte(addr, no_side_effects); + } + break; + case 0xd100: /* PBI page D1 */ + byte = PBI_D1GetByte(addr, no_side_effects); + break; + case 0xd600: /* PBI page D6 */ + byte = PBI_D6GetByte(addr, no_side_effects); + break; + case 0xd700: /* PBI page D7 */ + byte = PBI_D7GetByte(addr, no_side_effects); + break; + default: + break; + } + + return byte; +} + +void MEMORY_HwPutByte(UWORD addr, UBYTE byte) +{ + switch (addr & 0xff00) { + case 0x4f00: + case 0x8f00: + CARTRIDGE_BountyBob1(addr); + break; + case 0x5f00: + case 0x9f00: + CARTRIDGE_BountyBob2(addr); + break; + case 0xd000: /* GTIA */ + case 0xc000: /* GTIA - 5200 */ + case 0xc100: /* GTIA - 5200 */ + case 0xc200: /* GTIA - 5200 */ + case 0xc300: /* GTIA - 5200 */ + case 0xc400: /* GTIA - 5200 */ + case 0xc500: /* GTIA - 5200 */ + case 0xc600: /* GTIA - 5200 */ + case 0xc700: /* GTIA - 5200 */ + case 0xc800: /* GTIA - 5200 */ + case 0xc900: /* GTIA - 5200 */ + case 0xca00: /* GTIA - 5200 */ + case 0xcb00: /* GTIA - 5200 */ + case 0xcc00: /* GTIA - 5200 */ + case 0xcd00: /* GTIA - 5200 */ + case 0xce00: /* GTIA - 5200 */ + GTIA_PutByte(addr, byte); + break; + case 0xd200: /* POKEY */ + case 0xe800: /* POKEY - 5200 */ + case 0xe900: /* POKEY - 5200 */ + case 0xea00: /* POKEY - 5200 */ + case 0xeb00: /* POKEY - 5200 */ + case 0xec00: /* POKEY - 5200 */ + case 0xed00: /* POKEY - 5200 */ + case 0xee00: /* POKEY - 5200 */ + case 0xef00: /* POKEY - 5200 */ + POKEY_PutByte(addr, byte); + break; + case 0xd300: /* PIA */ + PIA_PutByte(addr, byte); + break; + case 0xd400: /* ANTIC */ + ANTIC_PutByte(addr, byte); + break; + case 0xd500: /* bank-switching cartridges, RTIME-8 */ + CARTRIDGE_PutByte(addr, byte); + break; + case 0xff00: /* Mosaic memory expansion for 400/800 */ + MosaicPutByte(addr,byte); + break; + case 0xcf00: /* Axlon memory expansion for 800 */ + case 0x0f00: /* Axlon shadow */ + if (Atari800_machine_type == Atari800_MACHINE_5200) { + GTIA_PutByte(addr, byte); /* GTIA-5200 cfxx */ + } + else { + AxlonPutByte(addr,byte); + } + break; + case 0xd100: /* PBI page D1 */ + PBI_D1PutByte(addr, byte); + break; + case 0xd600: /* PBI page D6 */ + PBI_D6PutByte(addr, byte); + break; + case 0xd700: /* PBI page D7 */ + PBI_D7PutByte(addr, byte); + break; + default: + break; + } +} +#endif /* PAGED_MEM */ diff --git a/PVAtari800/atari800-src/memory.h b/PVAtari800/atari800-src/memory.h new file mode 100644 index 0000000000..7518121075 --- /dev/null +++ b/PVAtari800/atari800-src/memory.h @@ -0,0 +1,138 @@ +#ifndef MEMORY_H_ +#define MEMORY_H_ + +#include "config.h" +#include /* memcpy, memset */ + +#include "atari.h" + +#define MEMORY_dGetByte(x) (MEMORY_mem[x]) +#define MEMORY_dPutByte(x, y) (MEMORY_mem[x] = y) + +#ifndef WORDS_BIGENDIAN +#ifdef WORDS_UNALIGNED_OK +#define MEMORY_dGetWord(x) UNALIGNED_GET_WORD(MEMORY_mem+(x), memory_read_word_stat) +#define MEMORY_dPutWord(x, y) UNALIGNED_PUT_WORD(MEMORY_mem+(x), (y), memory_write_word_stat) +#define MEMORY_dGetWordAligned(x) UNALIGNED_GET_WORD(MEMORY_mem+(x), memory_read_aligned_word_stat) +#define MEMORY_dPutWordAligned(x, y) UNALIGNED_PUT_WORD(MEMORY_mem+(x), (y), memory_write_aligned_word_stat) +#else /* WORDS_UNALIGNED_OK */ +#define MEMORY_dGetWord(x) (MEMORY_mem[x] + (MEMORY_mem[(x) + 1] << 8)) +#define MEMORY_dPutWord(x, y) (MEMORY_mem[x] = (UBYTE) (y), MEMORY_mem[(x) + 1] = (UBYTE) ((y) >> 8)) +/* faster versions of MEMORY_jdGetWord and MEMORY_dPutWord for even addresses */ +/* TODO: guarantee that memory is UWORD-aligned and use UWORD access */ +#define MEMORY_dGetWordAligned(x) MEMORY_dGetWord(x) +#define MEMORY_dPutWordAligned(x, y) MEMORY_dPutWord(x, y) +#endif /* WORDS_UNALIGNED_OK */ +#else /* WORDS_BIGENDIAN */ +/* can't do any word optimizations for big endian machines */ +#define MEMORY_dGetWord(x) (MEMORY_mem[x] + (MEMORY_mem[(x) + 1] << 8)) +#define MEMORY_dPutWord(x, y) (MEMORY_mem[x] = (UBYTE) (y), MEMORY_mem[(x) + 1] = (UBYTE) ((y) >> 8)) +#define MEMORY_dGetWordAligned(x) MEMORY_dGetWord(x) +#define MEMORY_dPutWordAligned(x, y) MEMORY_dPutWord(x, y) +#endif /* WORDS_BIGENDIAN */ + +#define MEMORY_dCopyFromMem(from, to, size) memcpy(to, MEMORY_mem + (from), size) +#define MEMORY_dCopyToMem(from, to, size) memcpy(MEMORY_mem + (to), from, size) +#define MEMORY_dFillMem(addr1, value, length) memset(MEMORY_mem + (addr1), value, length) + +extern UBYTE MEMORY_mem[65536 + 2]; + +/* RAM size in kilobytes. + Valid values for Atari800_MACHINE_800 are: 16, 48, 52. + Valid values for Atari800_MACHINE_XLXE are: 16, 64, 128, 192, RAM_320_RAMBO, + RAM_320_COMPY_SHOP, 576, 1088. + The only valid value for Atari800_MACHINE_5200 is 16. */ +#define MEMORY_RAM_320_RAMBO 320 +#define MEMORY_RAM_320_COMPY_SHOP 321 +extern int MEMORY_ram_size; + +#define MEMORY_RAM 0 +#define MEMORY_ROM 1 +#define MEMORY_HARDWARE 2 + +#ifndef PAGED_ATTRIB + +extern UBYTE MEMORY_attrib[65536]; +/* Reads a byte from ADDR. Can potentially have side effects, when reading + from hardware area. */ +#define MEMORY_GetByte(addr) (MEMORY_attrib[addr] == MEMORY_HARDWARE ? MEMORY_HwGetByte(addr, FALSE) : MEMORY_mem[addr]) +/* Reads a byte from ADDR, but without any side effects. */ +#define MEMORY_SafeGetByte(addr) (MEMORY_attrib[addr] == MEMORY_HARDWARE ? MEMORY_HwGetByte(addr, TRUE) : MEMORY_mem[addr]) +#define MEMORY_PutByte(addr, byte) do { if (MEMORY_attrib[addr] == MEMORY_RAM) MEMORY_mem[addr] = byte; else if (MEMORY_attrib[addr] == MEMORY_HARDWARE) MEMORY_HwPutByte(addr, byte); } while (0) +#define MEMORY_SetRAM(addr1, addr2) memset(MEMORY_attrib + (addr1), MEMORY_RAM, (addr2) - (addr1) + 1) +#define MEMORY_SetROM(addr1, addr2) memset(MEMORY_attrib + (addr1), MEMORY_ROM, (addr2) - (addr1) + 1) +#define MEMORY_SetHARDWARE(addr1, addr2) memset(MEMORY_attrib + (addr1), MEMORY_HARDWARE, (addr2) - (addr1) + 1) + +#else /* PAGED_ATTRIB */ + +typedef UBYTE (*MEMORY_rdfunc)(UWORD addr, int no_side_effects); +typedef void (*MEMORY_wrfunc)(UWORD addr, UBYTE value); +extern MEMORY_rdfunc MEMORY_readmap[256]; +extern MEMORY_rdfunc MEMORY_safe_readmap[256]; +extern MEMORY_wrfunc MEMORY_writemap[256]; +void MEMORY_ROM_PutByte(UWORD addr, UBYTE byte); +/* Reads a byte from ADDR. Can potentially have side effects, when reading + from hardware area. */ +#define MEMORY_GetByte(addr) (MEMORY_readmap[(addr) >> 8] ? (*MEMORY_readmap[(addr) >> 8])(addr, FALSE) : MEMORY_mem[addr]) +/* Reads a byte from ADDR, but without any side effects. */ +#define MEMORY_SafeGetByte(addr) (MEMORY_readmap[(addr) >> 8] ? (*MEMORY_readmap[(addr) >> 8])(addr, TRUE) : MEMORY_mem[addr]) +#define MEMORY_PutByte(addr,byte) (MEMORY_writemap[(addr) >> 8] ? ((*MEMORY_writemap[(addr) >> 8])(addr, byte), 0) : (MEMORY_mem[addr] = byte)) +#define MEMORY_SetRAM(addr1, addr2) do { \ + int i; \ + for (i = (addr1) >> 8; i <= (addr2) >> 8; i++) { \ + MEMORY_readmap[i] = NULL; \ + MEMORY_writemap[i] = NULL; \ + } \ + } while (0) +#define MEMORY_SetROM(addr1, addr2) do { \ + int i; \ + for (i = (addr1) >> 8; i <= (addr2) >> 8; i++) { \ + MEMORY_readmap[i] = NULL; \ + MEMORY_writemap[i] = MEMORY_ROM_PutByte; \ + } \ + } while (0) + +#endif /* PAGED_ATTRIB */ + +extern UBYTE MEMORY_basic[8192]; +extern UBYTE MEMORY_os[16384]; +extern UBYTE MEMORY_xegame[8192]; + +extern int MEMORY_xe_bank; +extern int MEMORY_selftest_enabled; + +extern int MEMORY_have_basic; +extern int MEMORY_cartA0BF_enabled; + +/* Verifies if SIZE is a correct value for RAM size. */ +int MEMORY_SizeValid(int size); +void MEMORY_InitialiseMachine(void); +void MEMORY_StateSave(UBYTE SaveVerbose); +void MEMORY_StateRead(UBYTE SaveVerbose, UBYTE StateVersion); +void MEMORY_CopyFromMem(UWORD from, UBYTE *to, int size); +void MEMORY_CopyToMem(const UBYTE *from, UWORD to, int size); +void MEMORY_HandlePORTB(UBYTE byte, UBYTE oldval); +void MEMORY_Cart809fDisable(void); +void MEMORY_Cart809fEnable(void); +void MEMORY_CartA0bfDisable(void); +void MEMORY_CartA0bfEnable(void); +#define MEMORY_CopyROM(addr1, addr2, src) memcpy(MEMORY_mem + (addr1), src, (addr2) - (addr1) + 1) +void MEMORY_GetCharset(UBYTE *cs); + +/* Mosaic and Axlon 400/800 RAM extensions */ +extern int MEMORY_mosaic_num_banks; +extern int MEMORY_axlon_0f_mirror; +extern int MEMORY_axlon_num_banks; + +/* Controls presence of MapRAM memory modification for XL/XE mode. */ +extern int MEMORY_enable_mapram; + +#ifndef PAGED_MEM +/* Reads a byte from the specified special address (not RAM or ROM). */ +UBYTE MEMORY_HwGetByte(UWORD addr, int safe); + +/* Stores a byte at the specified special address (not RAM or ROM). */ +void MEMORY_HwPutByte(UWORD addr, UBYTE byte); +#endif /* PAGED_MEM */ + +#endif /* MEMORY_H_ */ diff --git a/PVAtari800/atari800-src/mkimg.c b/PVAtari800/atari800-src/mkimg.c new file mode 100644 index 0000000000..afc5a63fc3 --- /dev/null +++ b/PVAtari800/atari800-src/mkimg.c @@ -0,0 +1,208 @@ +/* + * mkimg.c - Make an image or .h file from a binary + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + * Usage: mkimg -input filename + * -image filename + * -header filename + * hexaddr1 + * hexaddr2 + * + * Loads the input file into a 64K area of memory. The + * input file is in standard Atari Binary load format. + * The memory is initially filled with zeros. After the + * memory has been loaded the program creates either an + * image file or a standard C header file that contains + * the memory starting with hexaddr1 at going up to, + * but not including, hexaddr2. + */ + +#include +#include + +typedef enum { + Expect_Header1, + Expect_Header2, + Expect_StartLo, + Expect_StartHi, + Expect_FinishLo, + Expect_FinishHi, + Expect_Data +} State; + +int main(int argc, char *argv[]) +{ + unsigned char image[65536]; + char *in_filename = NULL; + char *image_filename = NULL; + char *header_filename = NULL; + int error = 0; + int start_addr = 0; + int finish_addr = 0; + int addr1 = -1; + int addr2 = -1; + int addr; + FILE *f; + int i; + + State state = Expect_Header1; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-input") == 0) + in_filename = argv[++i]; + else if (strcmp(argv[i], "-image") == 0) + image_filename = argv[++i]; + else if (strcmp(argv[i], "-header") == 0) + header_filename = argv[++i]; + else if (addr1 == -1) + sscanf(argv[i], "%x", &addr1); + else if (addr2 == -1) + sscanf(argv[i], "%x", &addr2); + else + error = 1; + } + + if (!in_filename || (!image_filename && !header_filename) || + error || (addr1 == -1) || (addr2 == -1)) { + printf("Usage: %s -input in_fname {-image image_fname|-header header_fname} hexaddr1 hexaddr2\n", + argv[0]); + return 0; + } + memset(image, 0, 65536); + + f = fopen(in_filename, "rb"); + if (!f) { + perror(in_filename); + return 1; + } + while (1) { + unsigned char byte; + + if (fread(&byte, 1, 1, f) != 1) + break; + + switch (state) { + case Expect_Header1: + if (byte == 0xff) + state = Expect_Header2; + else + printf("Error: Expecting Header1\n"); + break; + case Expect_Header2: + if (byte == 0xff) + state = Expect_StartLo; + else + printf("Error: Expecting Header2\n"); + break; + case Expect_StartLo: + start_addr = (start_addr & 0xff00) | byte; + state = Expect_StartHi; + break; + case Expect_StartHi: + start_addr = (start_addr & 0x00ff) | (byte << 8); + state = Expect_FinishLo; + printf("StartAddr = %x\n", start_addr); + if (start_addr == 0xffff) { + printf("Oops thats a header\n"); + state = Expect_StartLo; + } + break; + case Expect_FinishLo: + finish_addr = (finish_addr & 0xff00) | byte; + state = Expect_FinishHi; + break; + case Expect_FinishHi: + finish_addr = (finish_addr & 0x00ff) | (byte << 8); + state = Expect_Data; + addr = start_addr; + printf("FinishAddr = %x\n", finish_addr); + break; + case Expect_Data: + image[addr++] = byte; + if (addr > finish_addr) + state = Expect_StartLo; + break; + default: + printf("Error: Invalid State\n"); + return 1; + } + } + + fclose(f); + + /* + * Write image to file + */ + + if (image_filename) { + f = fopen(image_filename, "wb"); + if (!f) { + perror(image_filename); + return 1; + } + fwrite(&image[addr1], 1, addr2 - addr1 + 1, f); + + fclose(f); + } + if (header_filename) { + FILE *fp; + char *ptr; + int j; + + fp = fopen(header_filename, "wb"); + if (!fp) { + perror(header_filename); + return 1; + } + + for (ptr = header_filename; *ptr; ptr++) { + if (!( (*ptr >= 'a' && *ptr <= 'z') + || (*ptr >= 'A' && *ptr <= 'Z') + || (*ptr >= '0' && *ptr <= '9') )) + *ptr = '_'; + } + + fprintf(fp, "#ifndef _%s_\n", header_filename); + fprintf(fp, "#define _%s_\n\n", header_filename); + + fprintf(fp, "static unsigned char %s[] =\n{\n\t", header_filename); + + for (i = addr1, j = 0; i < addr2; i++) { + fprintf(fp, "0x%02x,", image[i]); + + if (++j == 8) { + fprintf(fp, "\n\t"); + j = 0; + } + } + + fprintf(fp, "0x%02x\n", image[addr2]); + fprintf(fp, "};\n"); + + fprintf(fp, "\n#endif\n"); + + fclose(fp); + } + return 0; +} diff --git a/PVAtari800/atari800-src/monitor.c b/PVAtari800/atari800-src/monitor.c new file mode 100644 index 0000000000..8828e39d58 --- /dev/null +++ b/PVAtari800/atari800-src/monitor.c @@ -0,0 +1,2463 @@ +/* + * monitor.c - Implements a builtin system monitor for debugging + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#define _POSIX_C_SOURCE 200112L /* for snprintf */ + +#include "config.h" +#include +#include +#include + +#include "antic.h" +#include "atari.h" +#include "cpu.h" +#include "gtia.h" +#include "memory.h" +#include "monitor.h" +#include "pia.h" +#include "pokey.h" +#include "util.h" +#ifdef STEREO_SOUND +#include "pokeysnd.h" +#endif + +#ifdef MONITOR_READLINE +#include +#include +#endif + +#ifdef __PLUS + +#include +#include "misc_win.h" + +FILE *mon_output, *mon_input; + +void monitor_printf(const char *format, ...) +{ + va_list args; + va_start(args, format); + vfprintf(mon_output, format, args); + va_end(args); +} + +#define printf monitor_printf +#define puts(s) fputs(s, mon_output) +#define putchar(c) fputc(c, mon_output) +#define perror(filename) printf("%s: %s\n", filename, strerror(errno)) + +#undef stdout +#define stdout mon_output + +#undef stdin +#define stdin mon_input + +#define PLUS_EXIT_MONITOR Misc_FreeMonitorConsole(mon_output, mon_input) + +#else /* __PLUS */ + +#define PLUS_EXIT_MONITOR + +#endif /* __PLUS */ + +unsigned char *trainer_memory = NULL; +unsigned char *trainer_flags = NULL; + +#ifdef MONITOR_TRACE +FILE *MONITOR_trace_file = NULL; +#endif + +#ifdef MONITOR_HINTS + +typedef struct { + char *name; + UWORD addr; +} symtable_rec; + + /* Symbol names taken from: + - XL OS sources, Atari Home Computer System - Operating System Manual - XL Addendum + - BASIC sources, The Atari BASIC Source Book + Symbols must be sorted by address. If the address has different names + when reading/writing to it, put the read name first. */ + +static const symtable_rec symtable_builtin[] = { + {"LNFLG", 0x0000}, {"NGFLAG", 0x0001}, {"CASINI", 0x0002}, {"CASINI+1",0x0003}, + {"RAMLO", 0x0004}, {"RAMLO+1", 0x0005}, {"TRAMSZ", 0x0006}, {"CMCMD", 0x0007}, + {"WARMST", 0x0008}, {"BOOT?", 0x0009}, {"DOSVEC", 0x000a}, {"DOSVEC+1",0x000b}, + {"DOSINI", 0x000c}, {"DOSINI+1",0x000d}, {"APPMHI", 0x000e}, {"APPMHI+1",0x000f}, + {"POKMSK", 0x0010}, {"BRKKEY", 0x0011}, {"RTCLOK", 0x0012}, {"RTCLOK+1",0x0013}, + {"RTCLOK+2",0x0014}, {"BUFADR", 0x0015}, {"BUFADR+1",0x0016}, {"ICCOMT", 0x0017}, + {"DSKFMS", 0x0018}, {"DSKFMS+1",0x0019}, {"DSKUTL", 0x001a}, {"DSKUTL+1",0x001b}, + {"ABUFPT", 0x001c}, {"ABUFPT+1",0x001d}, {"ABUFPT+2",0x001e}, {"ABUFPT+3",0x001f}, + {"ICHIDZ", 0x0020}, {"ICDNOZ", 0x0021}, {"ICCOMZ", 0x0022}, {"ICSTAZ", 0x0023}, + {"ICBALZ", 0x0024}, {"ICBAHZ", 0x0025}, {"ICPTLZ", 0x0026}, {"ICPTHZ", 0x0027}, + {"ICBLLZ", 0x0028}, {"ICBLHZ", 0x0029}, {"ICAX1Z", 0x002a}, {"ICAX2Z", 0x002b}, + {"ICSPRZ", 0x002c}, {"ICSPRZ+1",0x002d}, {"ICIDNO", 0x002e}, {"CIOCHR", 0x002f}, + {"STATUS", 0x0030}, {"CHKSUM", 0x0031}, {"BUFRLO", 0x0032}, {"BUFRHI", 0x0033}, + {"BFENLO", 0x0034}, {"BFENHI", 0x0035}, {"LTEMP", 0x0036}, {"LTEMP+1", 0x0037}, + {"BUFRFL", 0x0038}, {"RECVDN", 0x0039}, {"XMTDON", 0x003a}, {"CHKSNT", 0x003b}, + {"NOCKSM", 0x003c}, {"BPTR", 0x003d}, {"FTYPE", 0x003e}, {"FEOF", 0x003f}, + {"FREQ", 0x0040}, {"SOUNDR", 0x0041}, {"CRITIC", 0x0042}, {"FMSZPG", 0x0043}, + {"FMSZPG+1",0x0044}, {"FMSZPG+2",0x0045}, {"FMSZPG+3",0x0046}, {"FMSZPG+4",0x0047}, + {"FMSZPG+5",0x0048}, {"FMSZPG+6",0x0049}, {"ZCHAIN", 0x004a}, {"ZCHAIN+1",0x004b}, + {"DSTAT", 0x004c}, {"ATRACT", 0x004d}, {"DRKMSK", 0x004e}, {"COLRSH", 0x004f}, + {"TMPCHR", 0x0050}, {"HOLD1", 0x0051}, {"LMARGN", 0x0052}, {"RMARGN", 0x0053}, + {"ROWCRS", 0x0054}, {"COLCRS", 0x0055}, {"COLCRS+1",0x0056}, {"DINDEX", 0x0057}, + {"SAVMSC", 0x0058}, {"SAVMSC+1",0x0059}, {"OLDROW", 0x005a}, {"OLDCOL", 0x005b}, + {"OLDCOL+1",0x005c}, {"OLDCHR", 0x005d}, {"OLDADR", 0x005e}, {"OLDADR+1",0x005f}, + {"FKDEF", 0x0060}, {"FKDEF+1", 0x0061}, {"PALNTS", 0x0062}, {"LOGCOL", 0x0063}, + {"ADRESS", 0x0064}, {"ADRESS+1",0x0065}, {"TOADR", 0x0066}, {"TOADR+1", 0x0067}, + {"SAVADR", 0x0068}, {"SAVADR+1",0x0069}, {"RAMTOP", 0x006a}, {"BUFCNT", 0x006b}, + {"BUFSTR", 0x006c}, {"BUFSTR+1",0x006d}, {"BITMSK", 0x006e}, {"SHFAMT", 0x006f}, + {"ROWAC", 0x0070}, {"ROWAC+1", 0x0071}, {"COLAC", 0x0072}, {"COLAC+1", 0x0073}, + {"ENDPT", 0x0074}, {"ENDPT+1", 0x0075}, {"DELTAR", 0x0076}, {"DELTAC", 0x0077}, + {"DELTAC+1",0x0078}, {"KEYDEF", 0x0079}, {"KEYDEF+1",0x007a}, {"SWPFLG", 0x007b}, + {"HOLDCH", 0x007c}, {"INSDAT", 0x007d}, {"COUNTR", 0x007e}, {"COUNTR+1",0x007f}, + + {"LOMEM", 0x0080}, {"LOMEM+1", 0x0081}, {"VNTP", 0x0082}, {"VNTP+1", 0x0083}, + {"VNTD", 0x0084}, {"VNTD+1", 0x0085}, {"VVTP", 0x0086}, {"VVTP+1", 0x0087}, + {"STMTAB", 0x0088}, {"STMTAB+1",0x0089}, {"STMCUR", 0x008a}, {"STMCUR+1",0x008b}, + {"STARP", 0x008c}, {"STARP+1", 0x008d}, {"RUNSTK", 0x008e}, {"RUNSTK+1",0x008f}, + {"MEMTOP", 0x0090}, {"MEMTOP+1",0x0091}, {"MEOLFLG", 0x0092}, + {"COX", 0x0094}, {"POKADR", 0x0095}, {"POKADR+1",0x0096}, {"SVESA", 0x0097}, + {"SVESA+1", 0x0098}, {"MVFA", 0x0099}, {"MVFA+1", 0x009a}, {"MVTA", 0x009b}, + {"MVTA+1", 0x009c}, {"CPC", 0x009d}, {"CPC+1", 0x009e}, {"LLNGTH", 0x009f}, + {"TSLNUM", 0x00a0}, {"TSLNUM+1",0x00a1}, {"MVLNG", 0x00a2}, {"MVLNG+1", 0x00a3}, + {"ECSIZE", 0x00a4}, {"ECSIZE+1",0x00a5}, {"DIRFLG", 0x00a6}, {"STMLBD", 0x00a7}, + {"STINDEX", 0x00a8}, {"OPSTKX", 0x00a9}, {"ARSTKX", 0x00aa}, {"EXSVOP", 0x00ab}, + {"EXSVPR", 0x00ac}, {"LELNUM", 0x00ad}, {"LELNUM+1",0x00ae}, {"STENUM", 0x00af}, + {"COMCNT", 0x00b0}, {"ADFLAG", 0x00b1}, {"SVDISP", 0x00b2}, {"ONLOOP", 0x00b3}, + {"ENTDTD", 0x00b4}, {"LISTDTD", 0x00b5}, {"DATAD", 0x00b6}, {"DATALN", 0x00b7}, + {"DATALN+1",0x00b8}, {"ERRNUM", 0x00b9}, {"STOPLN", 0x00ba}, {"STOPLN+1",0x00bb}, + {"TRAPLN", 0x00bc}, {"TRAPLN+1",0x00bd}, {"SAVCUR", 0x00be}, {"SAVCUR+1",0x00bf}, + {"IOCMD", 0x00c0}, {"IODVC", 0x00c1}, {"PROMPT", 0x00c2}, {"ERRSAV", 0x00c3}, + {"TEMPA", 0x00c4}, {"TEMPA+1", 0x00c5}, {"ZTEMP2", 0x00c6}, {"ZTEMP2+1",0x00c7}, + {"COLOR", 0x00c8}, {"PTABW", 0x00c9}, {"LOADFLG", 0x00ca}, + {"VTYPE", 0x00d2}, {"VNUM", 0x00d3}, + {"FR0", 0x00d4}, {"FR0+1", 0x00d5}, {"FR0+2", 0x00d6}, {"FR0+3", 0x00d7}, + {"FR0+4", 0x00d8}, {"FR0+5", 0x00d9}, {"FRE", 0x00da}, {"FRE+1", 0x00db}, + {"FRE+2", 0x00dc}, {"FRE+3", 0x00dd}, {"FRE+4", 0x00de}, {"FRE+5", 0x00df}, + {"FR1", 0x00e0}, {"FR1+1", 0x00e1}, {"FR1+2", 0x00e2}, {"FR1+3", 0x00e3}, + {"FR1+4", 0x00e4}, {"FR1+5", 0x00e5}, {"FR2", 0x00e6}, {"FR2+1", 0x00e7}, + {"FR2+2", 0x00e8}, {"FR2+3", 0x00e9}, {"FR2+4", 0x00ea}, {"FR2+5", 0x00eb}, + {"FRX", 0x00ec}, {"EEXP", 0x00ed}, {"NSIGN", 0x00ee}, {"ESIGN", 0x00ef}, + {"FCHRFLG", 0x00f0}, {"DIGRT", 0x00f1}, {"CIX", 0x00f2}, {"INBUFF", 0x00f3}, + {"INBUFF+1",0x00f4}, {"ZTEMP1", 0x00f5}, {"ZTEMP1+1",0x00f6}, {"ZTEMP4", 0x00f7}, + {"ZTEMP4+1",0x00f8}, {"ZTEMP3", 0x00f9}, {"ZTEMP3+1",0x00fa}, {"RADFLG", 0x00fb}, + {"FLPTR", 0x00fc}, {"FLPTR+1", 0x00fd}, {"FPTR2", 0x00fe}, {"FPTR2+1", 0x00ff}, + + {"VDSLST", 0x0200}, {"VDSLST+1",0x0201}, {"VPRCED", 0x0202}, {"VPRCED+1",0x0203}, + {"VINTER", 0x0204}, {"VINTER+1",0x0205}, {"VBREAK", 0x0206}, {"VBREAK+1",0x0207}, + {"VKEYBD", 0x0208}, {"VKEYBD+1",0x0209}, {"VSERIN", 0x020a}, {"VSERIN+1",0x020b}, + {"VSEROR", 0x020c}, {"VSEROR+1",0x020d}, {"VSEROC", 0x020e}, {"VSEROC+1",0x020f}, + {"VTIMR1", 0x0210}, {"VTIMR1+1",0x0211}, {"VTIMR2", 0x0212}, {"VTIMR2+1",0x0213}, + {"VTIMR4", 0x0214}, {"VTIMR4+1",0x0215}, {"VIMIRQ", 0x0216}, {"VIMIRQ+1",0x0217}, + {"CDTMV1", 0x0218}, {"CDTMV1+1",0x0219}, {"CDTMV2", 0x021a}, {"CDTMV2+1",0x021b}, + {"CDTMV3", 0x021c}, {"CDTMV3+1",0x021d}, {"CDTMV4", 0x021e}, {"CDTMV4+1",0x021f}, + {"CDTMV5", 0x0220}, {"CDTMV5+1",0x0221}, {"VVBLKI", 0x0222}, {"VVBLKI+1",0x0223}, + {"VVBLKD", 0x0224}, {"VVBLKD+1",0x0225}, {"CDTMA1", 0x0226}, {"CDTMA1+1",0x0227}, + {"CDTMA2", 0x0228}, {"CDTMA2+1",0x0229}, {"CDTMF3", 0x022a}, {"SRTIMR", 0x022b}, + {"CDTMF4", 0x022c}, {"INTEMP", 0x022d}, {"CDTMF5", 0x022e}, {"SDMCTL", 0x022f}, + {"SDLSTL", 0x0230}, {"SDLSTH", 0x0231}, {"SSKCTL", 0x0232}, {"LCOUNT", 0x0233}, + {"LPENH", 0x0234}, {"LPENV", 0x0235}, {"BRKKY", 0x0236}, {"BRKKY+1", 0x0237}, + {"VPIRQ", 0x0238}, {"VPIRQ+1", 0x0239}, {"CDEVIC", 0x023a}, {"CCOMND", 0x023b}, + {"CAUX1", 0x023c}, {"CAUX2", 0x023d}, {"TEMP", 0x023e}, {"ERRFLG", 0x023f}, + {"DFLAGS", 0x0240}, {"DBSECT", 0x0241}, {"BOOTAD", 0x0242}, {"BOOTAD+1",0x0243}, + {"COLDST", 0x0244}, {"RECLEN", 0x0245}, {"DSKTIM", 0x0246}, {"PDVMSK", 0x0247}, + {"SHPDVS", 0x0248}, {"PDIMSK", 0x0249}, {"RELADR", 0x024a}, {"RELADR+1",0x024b}, + {"PPTMPA", 0x024c}, {"PPTMPX", 0x024d}, {"CHSALT", 0x026b}, + {"VSFLAG", 0x026c}, {"KEYDIS", 0x026d}, {"FINE", 0x026e}, {"GPRIOR", 0x026f}, + {"PADDL0", 0x0270}, {"PADDL1", 0x0271}, {"PADDL2", 0x0272}, {"PADDL3", 0x0273}, + {"PADDL4", 0x0274}, {"PADDL5", 0x0275}, {"PADDL6", 0x0276}, {"PADDL7", 0x0277}, + {"STICK0", 0x0278}, {"STICK1", 0x0279}, {"STICK2", 0x027a}, {"STICK3", 0x027b}, + {"PTRIG0", 0x027c}, {"PTRIG1", 0x027d}, {"PTRIG2", 0x027e}, {"PTRIG3", 0x027f}, + {"PTRIG4", 0x0280}, {"PTRIG5", 0x0281}, {"PTRIG6", 0x0282}, {"PTRIG7", 0x0283}, + {"STRIG0", 0x0284}, {"STRIG1", 0x0285}, {"STRIG2", 0x0286}, {"STRIG3", 0x0287}, + {"HIBYTE", 0x0288}, {"WMODE", 0x0289}, {"BLIM", 0x028a}, {"IMASK", 0x028b}, + {"JVECK", 0x028c}, {"JVECK+1", 0x028d}, {"NEWADR", 0x028e}, {"NEWADR+1",0x028f}, + {"TXTROW", 0x0290}, {"TXTCOL", 0x0291}, {"TXTCOL+1",0x0292}, {"TINDEX", 0x0293}, + {"TXTMSC", 0x0294}, {"TXTMSC+1",0x0295}, {"TXTOLD", 0x0296}, {"TXTOLD+1",0x0297}, + {"TXTOLD+2",0x0298}, {"TXTOLD+3",0x0299}, {"TXTOLD+4",0x029a}, {"TXTOLD+5",0x029b}, + {"CRETRY", 0x029c}, {"HOLD3", 0x029d}, {"SUBTMP", 0x029e}, {"HOLD2", 0x029f}, + {"DMASK", 0x02a0}, {"TMPLBT", 0x02a1}, {"ESCFLG", 0x02a2}, {"TABMAP", 0x02a3}, + {"TABMAP+1",0x02a4}, {"TABMAP+2",0x02a5}, {"TABMAP+3",0x02a6}, {"TABMAP+4",0x02a7}, + {"TABMAP+5",0x02a8}, {"TABMAP+6",0x02a9}, {"TABMAP+7",0x02aa}, {"TABMAP+8",0x02ab}, + {"TABMAP+9",0x02ac}, {"TABMAP+A",0x02ad}, {"TABMAP+B",0x02ae}, {"TABMAP+C",0x02af}, + {"TABMAP+D",0x02b0}, {"TABMAP+E",0x02b1}, {"LOGMAP", 0x02b2}, {"LOGMAP+1",0x02b3}, + {"LOGMAP+2",0x02b4}, {"LOGMAP+3",0x02b5}, {"INVFLG", 0x02b6}, {"FILFLG", 0x02b7}, + {"TMPROW", 0x02b8}, {"TMPCOL", 0x02b9}, {"TMPCOL+1",0x02ba}, {"SCRFLG", 0x02bb}, + {"HOLD4", 0x02bc}, {"DRETRY", 0x02bd}, {"SHFLOK", 0x02be}, {"BOTSCR", 0x02bf}, + {"PCOLR0", 0x02c0}, {"PCOLR1", 0x02c1}, {"PCOLR2", 0x02c2}, {"PCOLR3", 0x02c3}, + {"COLOR0", 0x02c4}, {"COLOR1", 0x02c5}, {"COLOR2", 0x02c6}, {"COLOR3", 0x02c7}, + {"COLOR4", 0x02c8}, {"RUNADR", 0x02c9}, {"RUNADR+1",0x02ca}, {"HIUSED", 0x02cb}, + {"HIUSED+1",0x02cc}, {"ZHIUSE", 0x02cd}, {"ZHIUSE+1",0x02ce}, {"GBYTEA", 0x02cf}, + {"GBYTEA+1",0x02d0}, {"LOADAD", 0x02d1}, {"LOADAD+1",0x02d2}, {"ZLOADA", 0x02d3}, + {"ZLOADA+1",0x02d4}, {"DSCTLN", 0x02d5}, {"DSCTLN+1",0x02d6}, {"ACMISR", 0x02d7}, + {"ACMISR+1",0x02d8}, {"KRPDEL", 0x02d9}, {"KEYREP", 0x02da}, {"NOCLIK", 0x02db}, + {"HELPFG", 0x02dc}, {"DMASAV", 0x02dd}, {"PBPNT", 0x02de}, {"PBUFSZ", 0x02df}, + {"RUNAD", 0x02e0}, {"RUNAD+1", 0x02e1}, {"INITAD", 0x02e2}, {"INITAD+1",0x02e3}, + {"RAMSIZ", 0x02e4}, {"MEMTOP", 0x02e5}, {"MEMTOP+1",0x02e6}, {"MEMLO", 0x02e7}, + {"MEMLO+1", 0x02e8}, {"HNDLOD", 0x02e9}, {"DVSTAT", 0x02ea}, {"DVSTAT+1",0x02eb}, + {"DVSTAT+2",0x02ec}, {"DVSTAT+3",0x02ed}, {"CBAUDL", 0x02ee}, {"CBAUDH", 0x02ef}, + {"CRSINH", 0x02f0}, {"KEYDEL", 0x02f1}, {"CH1", 0x02f2}, {"CHACT", 0x02f3}, + {"CHBAS", 0x02f4}, {"NEWROW", 0x02f5}, {"NEWCOL", 0x02f6}, {"NEWCOL+1",0x02f7}, + {"ROWINC", 0x02f8}, {"COLINC", 0x02f9}, {"CHAR", 0x02fa}, {"ATACHR", 0x02fb}, + {"CH", 0x02fc}, {"FILDAT", 0x02fd}, {"DSPFLG", 0x02fe}, {"SSFLAG", 0x02ff}, + + {"DDEVIC", 0x0300}, {"DUNIT", 0x0301}, {"DCOMND", 0x0302}, {"DSTATS", 0x0303}, + {"DBUFLO", 0x0304}, {"DBUFHI", 0x0305}, {"DTIMLO", 0x0306}, {"DUNUSE", 0x0307}, + {"DBYTLO", 0x0308}, {"DBYTHI", 0x0309}, {"DAUX1", 0x030a}, {"DAUX2", 0x030b}, + {"TIMER1", 0x030c}, {"TIMER1+1",0x030d}, {"ADDCOR", 0x030e}, {"CASFLG", 0x030f}, + {"TIMER2", 0x0310}, {"TIMER2+1",0x0311}, {"TEMP1", 0x0312}, {"TEMP2", 0x0313}, + {"PTIMOT", 0x0314}, {"TEMP3", 0x0315}, {"SAVIO", 0x0316}, {"TIMFLG", 0x0317}, + {"STACKP", 0x0318}, {"TSTAT", 0x0319}, {"HATABS", 0x031a}, /* HATABS 1-34 */ + {"PUPBT1", 0x033d}, {"PUPBT2", 0x033e}, {"PUPBT3", 0x033f}, + {"B0-ICHID",0x0340}, {"B0-ICDNO",0x0341}, {"B0-ICCOM",0x0342}, {"B0-ICSTA",0x0343}, + {"B0-ICBAL",0x0344}, {"B0-ICBAH",0x0345}, {"B0-ICPTL",0x0346}, {"B0-ICPTH",0x0347}, + {"B0-ICBLL",0x0348}, {"B0-ICBLH",0x0349}, {"B0-ICAX1",0x034a}, {"B0-ICAX2",0x034b}, + {"B0-ICAX3",0x034c}, {"B0-ICAX4",0x034d}, {"B0-ICAX5",0x034e}, {"B0-ICAX6",0x034f}, + {"B1-ICHID",0x0350}, {"B1-ICDNO",0x0351}, {"B1-ICCOM",0x0352}, {"B1-ICSTA",0x0353}, + {"B1-ICBAL",0x0354}, {"B1-ICBAH",0x0355}, {"B1-ICPTL",0x0356}, {"B1-ICPTH",0x0357}, + {"B1-ICBLL",0x0358}, {"B1-ICBLH",0x0359}, {"B1-ICAX1",0x035a}, {"B1-ICAX2",0x035b}, + {"B1-ICAX3",0x035c}, {"B1-ICAX4",0x035d}, {"B1-ICAX5",0x035e}, {"B1-ICAX6",0x035f}, + {"B2-ICHID",0x0360}, {"B2-ICDNO",0x0361}, {"B2-ICCOM",0x0362}, {"B2-ICSTA",0x0363}, + {"B2-ICBAL",0x0364}, {"B2-ICBAH",0x0365}, {"B2-ICPTL",0x0366}, {"B2-ICPTH",0x0367}, + {"B2-ICBLL",0x0368}, {"B2-ICBLH",0x0369}, {"B2-ICAX1",0x036a}, {"B2-ICAX2",0x036b}, + {"B2-ICAX3",0x036c}, {"B2-ICAX4",0x036d}, {"B2-ICAX5",0x036e}, {"B2-ICAX6",0x036f}, + {"B3-ICHID",0x0370}, {"B3-ICDNO",0x0371}, {"B3-ICCOM",0x0372}, {"B3-ICSTA",0x0373}, + {"B3-ICBAL",0x0374}, {"B3-ICBAH",0x0375}, {"B3-ICPTL",0x0376}, {"B3-ICPTH",0x0377}, + {"B3-ICBLL",0x0378}, {"B3-ICBLH",0x0379}, {"B3-ICAX1",0x037a}, {"B3-ICAX2",0x037b}, + {"B3-ICAX3",0x037c}, {"B3-ICAX4",0x037d}, {"B3-ICAX5",0x037e}, {"B3-ICAX6",0x037f}, + {"B4-ICHID",0x0380}, {"B4-ICDNO",0x0381}, {"B4-ICCOM",0x0382}, {"B4-ICSTA",0x0383}, + {"B4-ICBAL",0x0384}, {"B4-ICBAH",0x0385}, {"B4-ICPTL",0x0386}, {"B4-ICPTH",0x0387}, + {"B4-ICBLL",0x0388}, {"B4-ICBLH",0x0389}, {"B4-ICAX1",0x038a}, {"B4-ICAX2",0x038b}, + {"B4-ICAX3",0x038c}, {"B4-ICAX4",0x038d}, {"B4-ICAX5",0x038e}, {"B4-ICAX6",0x038f}, + {"B5-ICHID",0x0390}, {"B5-ICDNO",0x0391}, {"B5-ICCOM",0x0392}, {"B5-ICSTA",0x0393}, + {"B5-ICBAL",0x0394}, {"B5-ICBAH",0x0395}, {"B5-ICPTL",0x0396}, {"B5-ICPTH",0x0397}, + {"B5-ICBLL",0x0398}, {"B5-ICBLH",0x0399}, {"B5-ICAX1",0x039a}, {"B5-ICAX2",0x039b}, + {"B5-ICAX3",0x039c}, {"B5-ICAX4",0x039d}, {"B5-ICAX5",0x039e}, {"B5-ICAX6",0x039f}, + {"B6-ICHID",0x03a0}, {"B6-ICDNO",0x03a1}, {"B6-ICCOM",0x03a2}, {"B6-ICSTA",0x03a3}, + {"B6-ICBAL",0x03a4}, {"B6-ICBAH",0x03a5}, {"B6-ICPTL",0x03a6}, {"B6-ICPTH",0x03a7}, + {"B6-ICBLL",0x03a8}, {"B6-ICBLH",0x03a9}, {"B6-ICAX1",0x03aa}, {"B6-ICAX2",0x03ab}, + {"B6-ICAX3",0x03ac}, {"B6-ICAX4",0x03ad}, {"B6-ICAX5",0x03ae}, {"B6-ICAX6",0x03af}, + {"B7-ICHID",0x03b0}, {"B7-ICDNO",0x03b1}, {"B7-ICCOM",0x03b2}, {"B7-ICSTA",0x03b3}, + {"B7-ICBAL",0x03b4}, {"B7-ICBAH",0x03b5}, {"B7-ICPTL",0x03b6}, {"B7-ICPTH",0x03b7}, + {"B7-ICBLL",0x03b8}, {"B7-ICBLH",0x03b9}, {"B7-ICAX1",0x03ba}, {"B7-ICAX2",0x03bb}, + {"B7-ICAX3",0x03bc}, {"B7-ICAX4",0x03bd}, {"B7-ICAX5",0x03be}, {"B7-ICAX6",0x03bf}, + {"PRNBUF", 0x03c0}, /* PRNBUF 1-39 */ + {"SUPERF", 0x03e8}, {"CKEY", 0x03e9}, {"CASSBT", 0x03ea}, {"CARTCK", 0x03eb}, + {"DERRF", 0x03ec}, {"ACMVAR", 0x03ed}, /* ACMVAR 1-10 */ + {"BASICF", 0x03f8}, {"MINTLK", 0x03f9}, {"GINTLK", 0x03fa}, {"CHLINK", 0x03fb}, + {"CHLINK+1",0x03fc}, {"CASBUF", 0x03fd}, + + {"R-CARTCS",0x9ffa}, {"R-CARTCS+1",0x9ffb}, + {"R-CART", 0x9ffc}, {"R-CARTFG", 0x9ffd}, {"R-CARTAD",0x9ffe}, {"R-CARTAD+1",0x9fff}, + + {"CARTCS", 0xbffa}, {"CARTCS+1",0xbffb}, + {"CART", 0xbffc}, {"CARTFG", 0xbffd}, {"CARTAD", 0xbffe}, {"CARTAD+1",0xbfff}, + + {"M0PF", 0xd000}, {"HPOSP0",0xd000}, {"M1PF", 0xd001}, {"HPOSP1",0xd001}, + {"M2PF", 0xd002}, {"HPOSP2",0xd002}, {"M3PF", 0xd003}, {"HPOSP3",0xd003}, + {"P0PF", 0xd004}, {"HPOSM0",0xd004}, {"P1PF", 0xd005}, {"HPOSM1",0xd005}, + {"P2PF", 0xd006}, {"HPOSM2",0xd006}, {"P3PF", 0xd007}, {"HPOSM3",0xd007}, + {"M0PL", 0xd008}, {"SIZEP0",0xd008}, {"M1PL", 0xd009}, {"SIZEP1",0xd009}, + {"M2PL", 0xd00a}, {"SIZEP2",0xd00a}, {"M3PL", 0xd00b}, {"SIZEP3",0xd00b}, + {"P0PL", 0xd00c}, {"SIZEM", 0xd00c}, {"P1PL", 0xd00d}, {"GRAFP0",0xd00d}, + {"P2PL", 0xd00e}, {"GRAFP1",0xd00e}, {"P3PL", 0xd00f}, {"GRAFP2",0xd00f}, + {"TRIG0", 0xd010}, {"GRAFP3",0xd010}, {"TRIG1", 0xd011}, {"GRAFM", 0xd011}, + {"TRIG2", 0xd012}, {"COLPM0",0xd012}, {"TRIG3", 0xd013}, {"COLPM1",0xd013}, + {"PAL", 0xd014}, {"COLPM2",0xd014}, {"COLPM3",0xd015}, {"COLPF0",0xd016}, + {"COLPF1",0xd017}, + {"COLPF2",0xd018}, {"COLPF3",0xd019}, {"COLBK", 0xd01a}, {"PRIOR", 0xd01b}, + {"VDELAY",0xd01c}, {"GRACTL",0xd01d}, {"HITCLR",0xd01e}, {"CONSOL",0xd01f}, + + {"PBI", 0xd100}, /* PBI 1-254 */ {"PDVI", 0xd1ff}, {"PDVS", 0xd1ff}, + + {"POT0", 0xd200}, {"AUDF1", 0xd200}, {"POT1", 0xd201}, {"AUDC1", 0xd201}, + {"POT2", 0xd202}, {"AUDF2", 0xd202}, {"POT3", 0xd203}, {"AUDC2", 0xd203}, + {"POT4", 0xd204}, {"AUDF3", 0xd204}, {"POT5", 0xd205}, {"AUDC3", 0xd205}, + {"POT6", 0xd206}, {"AUDF4", 0xd206}, {"POT7", 0xd207}, {"AUDC4", 0xd207}, + {"ALLPOT",0xd208}, {"AUDCTL",0xd208}, {"KBCODE",0xd209}, {"STIMER",0xd209}, + {"RANDOM",0xd20a}, {"SKRES", 0xd20a}, {"POTGO", 0xd20b}, + {"SERIN", 0xd20d}, {"SEROUT",0xd20d}, {"IRQST", 0xd20e}, {"IRQEN", 0xd20e}, + {"SKSTAT",0xd20f}, {"SKCTL", 0xd20f}, + + {"PORTA", 0xd300}, {"PORTB", 0xd301}, {"PACTL", 0xd302}, {"PBCTL", 0xd303}, + + {"DMACTL",0xd400}, {"CHACTL",0xd401}, {"DLISTL",0xd402}, {"DLISTH",0xd403}, + {"HSCROL",0xd404}, {"VSCROL",0xd405}, {"PMBASE",0xd407}, {"CHBASE",0xd409}, + {"WSYNC", 0xd40a}, {"VCOUNT",0xd40b}, {"PENH", 0xd40c}, {"PENV", 0xd40d}, + {"NMIEN", 0xd40e}, {"NMIST", 0xd40f}, {"NMIRES",0xd40f}, + + {"PBIRAM",0xd600}, /* PMIRAM 1-255 */ + + {"AFP", 0xd800}, + + {"PDID1", 0xd803}, {"PDIOV", 0xd805}, {"PDIOV+1",0xd806},{"PDIRQV", 0xd808}, + {"PDIRQV+1",0xd809}, {"PDID2", 0xd80b}, {"PDVV", 0xd80d}, + + {"FASC", 0xd8e6}, {"IFP", 0xd9aa}, {"FPI", 0xd9d2}, + {"ZFR0", 0xda44}, {"ZF1", 0xda46}, {"FSUB", 0xda60}, {"FADD", 0xda66}, + {"FMUL", 0xdadb}, {"FDIV", 0xdb28}, {"PLYEVL",0xdd40}, {"FLD0R", 0xdd89}, + {"FLD0P", 0xdd8d}, {"FLD1R", 0xdd98}, {"FLD1P", 0xdd9c}, {"FST0R", 0xdda7}, + {"FST0P", 0xddab}, {"FMOVE", 0xddb6}, {"EXP", 0xddc0}, {"EXP10", 0xddcc}, + {"LOG", 0xdecd}, {"LOG10", 0xded1}, + + {"EDITRV",0xe400}, {"SCRENV",0xe410}, {"KEYBDV",0xe420}, {"PRINTV",0xe430}, + {"CASETV",0xe440}, + + {"DINITV",0xe450}, {"DSKINV",0xe453}, {"CIOV", 0xe456}, {"SIOV", 0xe459}, + {"SETVBV",0xe45c}, {"SYSVBV",0xe45f}, {"XITVBV",0xe462}, {"SIOINV",0xe465}, + {"SENDEV",0xe468}, {"INTINV",0xe46b}, {"CIOINV",0xe46e}, {"BLKBDV",0xe471}, + {"WARMSV",0xe474}, {"COLDSV",0xe477}, {"RBLOKV",0xe47a}, {"CSOPIV",0xe47d}, + {"PUPDIV",0xe480}, {"SLFTSV",0xe483}, {"PHENTV",0xe486}, {"PHUNLV",0xe489}, + {"PHINIV",0xe48c}, {"GPDVV", 0xe48f}, + + {NULL, 0x0000} +}; + +static const symtable_rec symtable_builtin_5200[] = { + {"POKMSK", 0x0000}, {"RTCLOKH", 0x0001}, {"RTCLOKL",0x0002}, {"CRITIC", 0x0003}, + {"ATRACT", 0x0004}, {"SDLSTL", 0x0005}, {"SDLSTH", 0x0006}, {"SDMCTL", 0x0007}, + {"PCOLR0", 0x0008}, {"PCOLR1", 0x0009}, {"PCOLR2",0x000a}, {"PCOLR3", 0x000b}, + {"COLOR0",0x000c}, {"COLOR1", 0x000d}, {"COLOR2",0x000e}, {"COLOR3", 0x000f}, + {"COLOR4", 0x0010}, {"PADDL0", 0x0011}, {"PADDL1",0x0012}, {"PADDL2",0x0013}, + {"PADDL3", 0x0014}, {"PADDL4",0x0015}, {"PADDL5", 0x0016}, {"PADDL6", 0x0017}, + {"PADDL7",0x0018}, + + {"VIMIRQ", 0x0200}, {"VIMIRQ+1",0x0201}, {"VVBLKI", 0x0202}, {"VVBLKI+1",0x0203}, + {"VVBLKD", 0x0204}, {"VVBLKD+1",0x0205}, {"VDSLST", 0x0206}, {"VDSLST+1",0x0207}, + {"VKEYBD", 0x0208}, {"VKEYBD+1",0x0209}, {"VKPD", 0x020a}, {"VKPD+1",0x020b}, + {"BRKKY", 0x020c}, {"BRKKY+1",0x020d}, {"VBREAK", 0x020e}, {"VBREAK+1",0x020f}, + {"VSERIN", 0x0210}, {"VSERIN+1",0x0211}, {"VSEROR", 0x0212}, {"VSEROR+1",0x0213}, + {"VSEROC", 0x0214}, {"VSEROC+1",0x0215}, {"VTIMR1", 0x0216}, {"VTIMR1+1",0x0217}, + {"VTIMR2", 0x0218}, {"VTIMR2+1",0x0219}, {"VTIMR4", 0x021a}, {"VTIMR4+1",0x021b}, + + {"M0PF", 0xc000}, {"HPOSP0",0xc000}, {"M1PF", 0xc001}, {"HPOSP1",0xc001}, + {"M2PF", 0xc002}, {"HPOSP2",0xc002}, {"M3PF", 0xc003}, {"HPOSP3",0xc003}, + {"P0PF", 0xc004}, {"HPOSM0",0xc004}, {"P1PF", 0xc005}, {"HPOSM1",0xc005}, + {"P2PF", 0xc006}, {"HPOSM2",0xc006}, {"P3PF", 0xc007}, {"HPOSM3",0xc007}, + {"M0PL", 0xc008}, {"SIZEP0",0xc008}, {"M1PL", 0xc009}, {"SIZEP1",0xc009}, + {"M2PL", 0xc00a}, {"SIZEP2",0xc00a}, {"M3PL", 0xc00b}, {"SIZEP3",0xc00b}, + {"P0PL", 0xc00c}, {"SIZEM", 0xc00c}, {"P1PL", 0xc00d}, {"GRAFP0",0xc00d}, + {"P2PL", 0xc00e}, {"GRAFP1",0xc00e}, {"P3PL", 0xc00f}, {"GRAFP2",0xc00f}, + {"TRIG0", 0xc010}, {"GRAFP3",0xc010}, {"TRIG1", 0xc011}, {"GRAFM", 0xc011}, + {"TRIG2", 0xc012}, {"COLPM0",0xc012}, {"TRIG3", 0xc013}, {"COLPM1",0xc013}, + {"PAL", 0xc014}, {"COLPM2",0xc014}, {"COLPM3",0xc015}, {"COLPF0",0xc016}, + {"COLPF1",0xc017}, + {"COLPF2",0xc018}, {"COLPF3",0xc019}, {"COLBK", 0xc01a}, {"PRIOR", 0xc01b}, + {"VDELAY",0xc01c}, {"GRACTL",0xc01d}, {"HITCLR",0xc01e}, {"CONSOL",0xc01f}, + {"DMACTL",0xd400}, {"CHACTL",0xd401}, {"DLISTL",0xd402}, {"DLISTH",0xd403}, + {"HSCROL",0xd404}, {"VSCROL",0xd405}, {"PMBASE",0xd407}, {"CHBASE",0xd409}, + {"WSYNC", 0xd40a}, {"VCOUNT",0xd40b}, {"PENH", 0xd40c}, {"PENV", 0xd40d}, + {"NMIEN", 0xd40e}, {"NMIST", 0xd40f}, {"NMIRES",0xd40f}, + + {"POT0", 0xe800}, {"AUDF1", 0xe800}, {"POT1", 0xe801}, {"AUDC1", 0xe801}, + {"POT2", 0xe802}, {"AUDF2", 0xe802}, {"POT3", 0xe803}, {"AUDC2", 0xe803}, + {"POT4", 0xe804}, {"AUDF3", 0xe804}, {"POT5", 0xe805}, {"AUDC3", 0xe805}, + {"POT6", 0xe806}, {"AUDF4", 0xe806}, {"POT7", 0xe807}, {"AUDC4", 0xe807}, + {"ALLPOT",0xe808}, {"AUDCTL",0xe808}, {"KBCODE",0xe809}, {"STIMER",0xe809}, + {"RANDOM",0xe80a}, {"SKRES", 0xe80a}, {"POTGO", 0xe80b}, + {"SERIN", 0xe80d}, {"SEROUT",0xe80d}, {"IRQST", 0xe80e}, {"IRQEN", 0xe80e}, + {"SKSTAT",0xe80f}, {"SKCTL", 0xe80f}, + + {NULL, 0x0000} +}; + +static int symtable_builtin_enable = TRUE; + +static symtable_rec *symtable_user = NULL; +static int symtable_user_size = 0; + +static const char *find_label_name(UWORD addr, int is_write) +{ + int i; + for (i = 0; i < symtable_user_size; i++) { + if (symtable_user[i].addr == addr) + return symtable_user[i].name; + } + if (symtable_builtin_enable) { + const symtable_rec *p; + for (p = (Atari800_machine_type == Atari800_MACHINE_5200 ? symtable_builtin_5200 : symtable_builtin); p->name != NULL; p++) { + if (p->addr == addr) { + if (is_write && p[1].addr == addr) + p++; + return p->name; + } + } + } + return NULL; +} + +static symtable_rec *find_user_label(const char *name) +{ + int i; + for (i = 0; i < symtable_user_size; i++) { + if (Util_stricmp(symtable_user[i].name, name) == 0) + return &symtable_user[i]; + } + return NULL; +} + +static int find_label_value(const char *name) +{ + const symtable_rec *p = find_user_label(name); + if (p != NULL) + return p->addr; + if (symtable_builtin_enable) { + for (p = (Atari800_machine_type == Atari800_MACHINE_5200 ? symtable_builtin_5200 : symtable_builtin); p->name != NULL; p++) { + if (Util_stricmp(p->name, name) == 0) + return p->addr; + } + } + return -1; +} + +static void free_user_labels(void) +{ + if (symtable_user != NULL) { + while (symtable_user_size > 0) + free(symtable_user[--symtable_user_size].name); + free(symtable_user); + symtable_user = NULL; + } +} + +static void add_user_label(const char *name, UWORD addr) +{ +#define SYMTABLE_USER_INITIAL_SIZE 128 + if (symtable_user == NULL) + symtable_user = (symtable_rec *) Util_malloc(SYMTABLE_USER_INITIAL_SIZE * sizeof(symtable_rec)); + else if (symtable_user_size >= SYMTABLE_USER_INITIAL_SIZE + && (symtable_user_size & (symtable_user_size - 1)) == 0) { + /* symtable_user_size is a power of two: allocate twice as much */ + symtable_user = (symtable_rec *) Util_realloc(symtable_user, + 2 * symtable_user_size * sizeof(symtable_rec)); + } + symtable_user[symtable_user_size].name = Util_strdup(name); + symtable_user[symtable_user_size].addr = addr; + symtable_user_size++; +} + +static void load_user_labels(const char *filename) +{ + FILE *fp; + char line[256]; + if (filename == NULL) { + printf("You must specify a filename\n"); + return; + } + /* "rb" and not "r", because we strip EOLs ourselves + - this is better, because we can use CR/LF files on Unix */ + fp = fopen(filename, "rb"); + if (fp == NULL) { + perror(filename); + return; + } + free_user_labels(); + while (fgets(line, sizeof(line), fp)) { + char *p; + unsigned int value = 0; + int digits = 0; + /* Find first 4 hex digits or more. */ + /* We don't support "Cafe Assembler", "Dead Assembler" or "C0de Assembler". ;-) */ + for (p = line; *p != '\0'; p++) { + if (*p >= '0' && *p <= '9') { + value = (value << 4) + *p - '0'; + digits++; + } + else if (*p >= 'A' && *p <= 'F') { + value = (value << 4) + *p - 'A' + 10; + digits++; + } + else if (*p >= 'a' && *p <= 'f') { + value = (value << 4) + *p - 'a' + 10; + digits++; + } + else if (digits >= 4) + break; + else if (*p == '-') + break; /* ignore labels with negative values */ + else { + /* note that xasm can put "2" before the label value and mads puts "00" */ + value = 0; + digits = 0; + } + } + if (*p != ' ' && *p != '\t') + continue; + if (value > 0xffff || digits > 8) + continue; + do + p++; + while (*p == ' ' || *p == '\t'); + Util_chomp(p); + if (*p == '\0') + continue; + add_user_label(p, (UWORD) value); + } + fclose(fp); + printf("Loaded %d labels\n", symtable_user_size); +} + +#endif /* MONITOR_HINTS */ + +static const char instr6502[256][10] = { + "BRK", "ORA (1,X)", "CIM", "ASO (1,X)", "NOP 1", "ORA 1", "ASL 1", "ASO 1", + "PHP", "ORA #1", "ASL", "ANC #1", "NOP 2", "ORA 2", "ASL 2", "ASO 2", + + "BPL 0", "ORA (1),Y", "CIM", "ASO (1),Y", "NOP 1,X", "ORA 1,X", "ASL 1,X", "ASO 1,X", + "CLC", "ORA 2,Y", "NOP !", "ASO 2,Y", "NOP 2,X", "ORA 2,X", "ASL 2,X", "ASO 2,X", + + "JSR 2", "AND (1,X)", "CIM", "RLA (1,X)", "BIT 1", "AND 1", "ROL 1", "RLA 1", + "PLP", "AND #1", "ROL", "ANC #1", "BIT 2", "AND 2", "ROL 2", "RLA 2", + + "BMI 0", "AND (1),Y", "CIM", "RLA (1),Y", "NOP 1,X", "AND 1,X", "ROL 1,X", "RLA 1,X", + "SEC", "AND 2,Y", "NOP !", "RLA 2,Y", "NOP 2,X", "AND 2,X", "ROL 2,X", "RLA 2,X", + + + "RTI", "EOR (1,X)", "CIM", "LSE (1,X)", "NOP 1", "EOR 1", "LSR 1", "LSE 1", + "PHA", "EOR #1", "LSR", "ALR #1", "JMP 2", "EOR 2", "LSR 2", "LSE 2", + + "BVC 0", "EOR (1),Y", "CIM", "LSE (1),Y", "NOP 1,X", "EOR 1,X", "LSR 1,X", "LSE 1,X", + "CLI", "EOR 2,Y", "NOP !", "LSE 2,Y", "NOP 2,X", "EOR 2,X", "LSR 2,X", "LSE 2,X", + + "RTS", "ADC (1,X)", "CIM", "RRA (1,X)", "NOP 1", "ADC 1", "ROR 1", "RRA 1", + "PLA", "ADC #1", "ROR", "ARR #1", "JMP (2)", "ADC 2", "ROR 2", "RRA 2", + + "BVS 0", "ADC (1),Y", "CIM", "RRA (1),Y", "NOP 1,X", "ADC 1,X", "ROR 1,X", "RRA 1,X", + "SEI", "ADC 2,Y", "NOP !", "RRA 2,Y", "NOP 2,X", "ADC 2,X", "ROR 2,X", "RRA 2,X", + + + "NOP #1", "STA (1,X)", "NOP #1", "SAX (1,X)", "STY 1", "STA 1", "STX 1", "SAX 1", + "DEY", "NOP #1", "TXA", "ANE #1", "STY 2", "STA 2", "STX 2", "SAX 2", + + "BCC 0", "STA (1),Y", "CIM", "SHA (1),Y", "STY 1,X", "STA 1,X", "STX 1,Y", "SAX 1,Y", + "TYA", "STA 2,Y", "TXS", "SHS 2,Y", "SHY 2,X", "STA 2,X", "SHX 2,Y", "SHA 2,Y", + + "LDY #1", "LDA (1,X)", "LDX #1", "LAX (1,X)", "LDY 1", "LDA 1", "LDX 1", "LAX 1", + "TAY", "LDA #1", "TAX", "ANX #1", "LDY 2", "LDA 2", "LDX 2", "LAX 2", + + "BCS 0", "LDA (1),Y", "CIM", "LAX (1),Y", "LDY 1,X", "LDA 1,X", "LDX 1,Y", "LAX 1,X", + "CLV", "LDA 2,Y", "TSX", "LAS 2,Y", "LDY 2,X", "LDA 2,X", "LDX 2,Y", "LAX 2,Y", + + + "CPY #1", "CMP (1,X)", "NOP #1", "DCM (1,X)", "CPY 1", "CMP 1", "DEC 1", "DCM 1", + "INY", "CMP #1", "DEX", "SBX #1", "CPY 2", "CMP 2", "DEC 2", "DCM 2", + + "BNE 0", "CMP (1),Y", "ESCRTS #1", "DCM (1),Y", "NOP 1,X", "CMP 1,X", "DEC 1,X", "DCM 1,X", + "CLD", "CMP 2,Y", "NOP !", "DCM 2,Y", "NOP 2,X", "CMP 2,X", "DEC 2,X", "DCM 2,X", + + + "CPX #1", "SBC (1,X)", "NOP #1", "INS (1,X)", "CPX 1", "SBC 1", "INC 1", "INS 1", + "INX", "SBC #1", "NOP", "SBC #1 !", "CPX 2", "SBC 2", "INC 2", "INS 2", + + "BEQ 0", "SBC (1),Y", "ESCAPE #1", "INS (1),Y", "NOP 1,X", "SBC 1,X", "INC 1,X", "INS 1,X", + "SED", "SBC 2,Y", "NOP !", "INS 2,Y", "NOP 2,X", "SBC 2,X", "INC 2,X", "INS 2,X" +}; + +/* Opcode type: + bits 1-0 = instruction length + bit 2 = instruction reads from memory (without stack-manipulating instructions) + bit 3 = instruction writes to memory (without stack-manipulating instructions) + bits 7-4 = adressing type: + 0 = NONE (implicit) + 1 = ABSOLUTE + 2 = ZPAGE + 3 = ABSOLUTE_X + 4 = ABSOLUTE_Y + 5 = INDIRECT_X + 6 = INDIRECT_Y + 7 = ZPAGE_X + 8 = ZPAGE_Y + 9 = RELATIVE + A = IMMEDIATE + B = STACK 2 (RTS) + C = STACK 3 (RTI) + D = INDIRECT (JMP () ) + E = ESCRTS + F = ESCAPE */ +const UBYTE MONITOR_optype6502[256] = { + 0x01, 0x56, 0x01, 0x5e, 0x22, 0x26, 0x2e, 0x2e, 0x01, 0xa2, 0x01, 0xa2, 0x13, 0x17, 0x1f, 0x1f, + 0x92, 0x66, 0x01, 0x6e, 0x72, 0x76, 0x7e, 0x7e, 0x01, 0x47, 0x01, 0x4f, 0x33, 0x37, 0x3f, 0x3f, + 0x13, 0x56, 0x01, 0x5e, 0x26, 0x26, 0x2e, 0x2e, 0x01, 0xa2, 0x01, 0xa2, 0x17, 0x17, 0x1f, 0x1f, + 0x92, 0x66, 0x01, 0x6e, 0x72, 0x76, 0x7e, 0x7e, 0x01, 0x47, 0x01, 0x4f, 0x33, 0x37, 0x3f, 0x3f, + 0xc1, 0x56, 0x01, 0x5e, 0x22, 0x26, 0x2e, 0x2e, 0x01, 0xa2, 0x01, 0xa2, 0x13, 0x17, 0x1f, 0x1f, + 0x92, 0x66, 0x01, 0x6e, 0x72, 0x76, 0x7e, 0x7e, 0x01, 0x47, 0x01, 0x4f, 0x33, 0x37, 0x3f, 0x3f, + 0xb1, 0x56, 0x01, 0x5e, 0x22, 0x26, 0x2e, 0x2e, 0x01, 0xa2, 0x01, 0xa2, 0xd3, 0x17, 0x1f, 0x1f, + 0x92, 0x66, 0x01, 0x6e, 0x72, 0x76, 0x7e, 0x7e, 0x01, 0x47, 0x01, 0x4f, 0x33, 0x37, 0x3f, 0x3f, + 0xa2, 0x5a, 0x01, 0x5a, 0x2a, 0x2a, 0x2a, 0x2a, 0x01, 0xa2, 0x01, 0xa2, 0x1b, 0x1b, 0x1b, 0x1b, + 0x92, 0x6a, 0x01, 0x6a, 0x7a, 0x7a, 0x8a, 0x8a, 0x01, 0x4b, 0x01, 0x4b, 0x3b, 0x3b, 0x4b, 0x4b, + 0xa2, 0x56, 0xa2, 0x56, 0x26, 0x26, 0x26, 0x26, 0x01, 0xa2, 0x01, 0xa2, 0x17, 0x17, 0x17, 0x17, + 0x92, 0x66, 0x01, 0x66, 0x76, 0x76, 0x86, 0x86, 0x01, 0x47, 0x01, 0x47, 0x37, 0x37, 0x47, 0x47, + 0xa2, 0x56, 0xa2, 0x5e, 0x26, 0x26, 0x2e, 0x2e, 0x01, 0xa2, 0x01, 0xa2, 0x17, 0x17, 0x1f, 0x1f, + 0x92, 0x66, 0xe2, 0x6e, 0x72, 0x76, 0x7e, 0x7e, 0x01, 0x47, 0x01, 0x4f, 0x33, 0x37, 0x3f, 0x3f, + 0xa2, 0x56, 0xa2, 0x5e, 0x26, 0x26, 0x2e, 0x2e, 0x01, 0xa2, 0x01, 0xa2, 0x17, 0x17, 0x1f, 0x1f, + 0x92, 0x66, 0xf2, 0x6e, 0x72, 0x76, 0x7e, 0x7e, 0x01, 0x47, 0x01, 0x4f, 0x33, 0x37, 0x3f, 0x3f +}; + + +static void safe_gets(char *buffer, size_t size, char const *prompt) +{ +#ifdef HAVE_FFLUSH + fflush(stdout); +#endif + +#ifdef MONITOR_READLINE + { + char *got = readline(prompt); + if (got) { + strncpy(buffer, got, size); + if (*got) + add_history(got); + free(got); /* Need to free buffer allocated by readline() */ + } + } +#else + fputs(prompt, stdout); + fgets(buffer, size, stdin); +#endif + Util_chomp(buffer); +} + +static int pager(void) +{ + char buf[100]; + safe_gets(buf, sizeof(buf), "Press Return to continue ('q' to quit): "); + return buf[0] == 'q' || buf[0] == 'Q'; +} + +static char *token_ptr; + +static char *get_token(void) +{ + char *p = token_ptr; + while (*p == ' ') + p++; + if (*p == '\0') + return NULL; + token_ptr = p; + do { + token_ptr++; + if (*token_ptr == ' ') { + *token_ptr++ = '\0'; + break; + } + } while (*token_ptr != '\0'); + return p; +} + +#if defined(MONITOR_BREAK) || !defined(NO_YPOS_BREAK_FLICKER) +static int get_dec(int *decval) +{ + const char *t; + t = get_token(); + if (t != NULL) { + int x = Util_sscandec(t); + if (x < 0) + return FALSE; + *decval = x; + return TRUE; + } + return FALSE; +} +#endif + +/* Parses S in search for a hexadecimal number. On success stores the number + in HEXVAL and returns TRUE; otherwise returns FALSE. */ +static int parse_hex(const char *s, UWORD *hexval) +{ + int x = Util_sscanhex(s); +#ifdef MONITOR_HINTS + int y = find_label_value(s); + if (y >= 0) { + if (x < 0 || x > 0xffff || x == y) { + *hexval = (UWORD) y; + return TRUE; + } + /* s can be a hex number or a label name */ + printf("%s is ambiguous. Use 0%X or %X instead.\n", s, x, y); + return FALSE; + } +#endif + if (x < 0 || x > 0xffff) + return FALSE; + *hexval = (UWORD) x; + return TRUE; +} + +/* Searches for a hexadecimal number in the command line. On success stores + the number in HEXVAL and returns TRUE; otherwise returns FALSE. */ +static int get_hex(UWORD *hexval) +{ + const char *t; + t = get_token(); + if (t != NULL) + return parse_hex(t, hexval); + return FALSE; +} + +static int get_hex2(UWORD *hexval1, UWORD *hexval2) +{ + return get_hex(hexval1) && get_hex(hexval2); +} + +static int get_hex3(UWORD *hexval1, UWORD *hexval2, UWORD *hexval3) +{ + return get_hex(hexval1) && get_hex(hexval2) && get_hex(hexval3); +} + +static void get_uword(UWORD *val) +{ + if (!get_hex(val)) + printf("Invalid argument!\n"); +} + +static void get_ubyte(UBYTE *val) +{ + UWORD uword; + if (!get_hex(&uword) || uword > 0xff) + printf("Invalid argument!\n"); + else + *val = (UBYTE) uword; +} + +static int get_bool(void) +{ + const char *t; + t = get_token(); + if (t != NULL) { + int result = Util_sscanbool(t); + if (result >= 0) + return result; + } + printf("Invalid argument (should be 0 or 1)!\n"); + return -1; +} + +static int get_attrib_range(UWORD *addr1, UWORD *addr2) +{ + if (get_hex2(addr1, addr2) && *addr1 <= *addr2) { +#ifdef PAGED_ATTRIB + if ((*addr1 & 0xff) != 0 || (*addr2 & 0xff) != 0xff) { + printf("This is PAGED_ATTRIB version of Atari800.\n" + "You can only change attributes of full memory pages.\n"); + return FALSE; + } +#endif + return TRUE; + } + printf("Missing or bad argument!\n"); + return FALSE; +} + +static UWORD show_instruction(FILE *fp, UWORD pc) +{ + UWORD addr = pc; + UBYTE insn; + const char *mnemonic; + const char *p; + int value = 0; + int nchars = 0; + + insn = MEMORY_SafeGetByte(pc); + pc++; + mnemonic = instr6502[insn]; + for (p = mnemonic + 3; *p != '\0'; p++) { + if (*p == '1') { + value = MEMORY_SafeGetByte(pc); + pc++; + nchars = fprintf(fp, "%04X: %02X %02X " /*"%Xcyc "*/ "%.*s$%02X%s", + addr, insn, value, /*cycles[insn],*/ (int) (p - mnemonic), mnemonic, value, p + 1); + break; + } + if (*p == '2') { + value = MEMORY_SafeGetByte(pc) + (MEMORY_SafeGetByte(pc + 1) << 8); + nchars = fprintf(fp, "%04X: %02X %02X %02X " /*"%Xcyc "*/ "%.*s$%04X%s", + addr, insn, value & 0xff, value >> 8, /*cycles[insn],*/ (int) (p - mnemonic), mnemonic, value, p + 1); + pc += 2; + break; + } + if (*p == '0') { + UBYTE op = MEMORY_SafeGetByte(pc); + pc++; + value = (UWORD) (pc + (SBYTE) op); + nchars = fprintf(fp, "%04X: %02X %02X " /*"3cyc "*/ "%.4s$%04X", addr, insn, op, mnemonic, value); + break; + } + } + if (*p == '\0') { + fprintf(fp, "%04X: %02X " /*"%Xcyc "*/ "%s\n", addr, insn, /*cycles[insn],*/ mnemonic); + return pc; + } +#ifdef MONITOR_HINTS + if (p[-1] != '#') { + /* different names when reading/writing memory */ + const char *label = find_label_name((UWORD) value, (MONITOR_optype6502[insn] & 0x08) != 0); + if (label != NULL) { + fprintf(fp, "%*s;%s\n", 28 - nchars, "", label); + return pc; + } + } +#endif + fputc('\n', fp); + return pc; +} + +void MONITOR_Exit(void) +{ + if (trainer_memory != NULL) { + free(trainer_memory); + trainer_memory=NULL; + trainer_flags=NULL; + } +} + +void MONITOR_ShowState(FILE *fp, UWORD pc, UBYTE a, UBYTE x, UBYTE y, UBYTE s, + char n, char v, char z, char c) +{ + fprintf(fp, "%3d %3d A=%02X X=%02X Y=%02X S=%02X P=%c%c*-%c%c%c%c PC=", + ANTIC_ypos, ANTIC_XPOS, a, x, y, s, + n, v, (CPU_regP & CPU_D_FLAG) ? 'D' : '-', (CPU_regP & CPU_I_FLAG) ? 'I' : '-', z, c); + show_instruction(fp, pc); +} + +static void show_state(void) +{ + MONITOR_ShowState(stdout, CPU_regPC, CPU_regA, CPU_regX, CPU_regY, CPU_regS, + (char) ((CPU_regP & CPU_N_FLAG) ? 'N' : '-'), (char) ((CPU_regP & CPU_V_FLAG) ? 'V' : '-'), + (char) ((CPU_regP & CPU_Z_FLAG) ? 'Z' : '-'), (char) ((CPU_regP & CPU_C_FLAG) ? 'C' : '-')); +} + +static UWORD disassemble(UWORD addr) +{ + int count = 24; + do + addr = show_instruction(stdout, addr); + while (--count > 0); + return addr; +} + +#ifdef MONITOR_ASSEMBLER +static UWORD assembler(UWORD addr) +{ + printf("Simple assembler (enter empty line to exit)\n"); + for (;;) { + char s[128]; /* input string */ + char c[128]; /* converted input */ + char *sp; /* input pointer */ + char *cp; /* converted input pointer */ + char *vp; /* value pointer (the value is stored in s) */ + char *tp; /* type pointer (points at type character '0', '1' or '2' in converted input) */ + int i; + int isa; /* the operand is "A" */ + UWORD value = 0; + + char prompt[7]; + snprintf(prompt, sizeof(prompt), "%04X: ", (int) addr); + safe_gets(s, sizeof(s), prompt); + if (s[0] == '\0') + return addr; + + Util_strupper(s); + + sp = s; + cp = c; + /* copy first three characters */ + for (i = 0; i < 3 && *sp != '\0'; i++) + *cp++ = *sp++; + /* insert space before operands */ + *cp++ = ' '; + + tp = NULL; + isa = FALSE; + + /* convert input to format of instr6502[] table */ + while (*sp != '\0') { + switch (*sp) { + case ' ': + case '\t': + case '$': + case '@': + sp++; + break; + case '#': + case '(': + case ')': + case ',': + isa = FALSE; + *cp++ = *sp++; + break; + default: + if (tp != NULL) { + if (*sp == 'X' || *sp == 'Y') { + *cp++ = *sp++; + break; + } + goto invalid_instr; + } + vp = s; + do + *vp++ = *sp++; + while (strchr(" \t$@#(),", *sp) == NULL && *sp != '\0'); + /* If *sp=='\0', strchr() should return non-NULL, + but we do an extra check to be on safe side. */ + *vp++ = '\0'; + tp = cp++; + *tp = '0'; + isa = (s[0] == 'A' && s[1] == '\0'); + break; + } + } + if (cp[-1] == ' ') + cp--; /* no arguments (e.g. NOP or ASL @) */ + *cp = '\0'; + + /* if there's an operand, get its value */ + if (tp != NULL && !parse_hex(s, &value)) { + printf("Invalid operand!\n"); + continue; + } + + for (;;) { + /* search table for instruction */ + for (i = 0; i < 256; i++) { + if (strcmp(instr6502[i], c) == 0) { + if (tp == NULL) { + MEMORY_dPutByte(addr, (UBYTE) i); + addr++; + } + else if (*tp == '0') { + value -= (addr + 2); + if ((SWORD) value < -128 || (SWORD) value > 127) + printf("Branch out of range!\n"); + else { + MEMORY_dPutByte(addr, (UBYTE) i); + addr++; + MEMORY_dPutByte(addr, (UBYTE) value); + addr++; + } + } + else if (*tp == '1') { + c[3] = '\0'; + if (isa && (strcmp(c, "ASL") == 0 || strcmp(c, "LSR") == 0 || + strcmp(c, "ROL") == 0 || strcmp(c, "ROR") == 0)) { + printf("\"%s A\" is ambiguous.\n" + "Use \"%s\" for accumulator mode or \"%s 0A\" for zeropage mode.\n", c, c, c); + } + else { + MEMORY_dPutByte(addr, (UBYTE) i); + addr++; + MEMORY_dPutByte(addr, (UBYTE) value); + addr++; + } + } + else { /* *tp == '2' */ + MEMORY_dPutByte(addr, (UBYTE) i); + addr++; + MEMORY_dPutWord(addr, value); + addr += 2; + } + goto next_instr; + } + } + /* not found */ + if (tp == NULL || *tp == '2') + break; + if (++*tp == '1' && value > 0xff) + *tp = '2'; + } + invalid_instr: + printf("Invalid instruction!\n"); + next_instr: + ; + } +} +#endif /* MONITOR_ASSEMBLER */ + +#ifdef MONITOR_BREAK +UWORD MONITOR_break_addr = 0xd000; +UBYTE MONITOR_break_step = FALSE; +static UBYTE break_over = FALSE; +UBYTE MONITOR_break_ret = FALSE; +UBYTE MONITOR_break_brk = FALSE; +int MONITOR_ret_nesting = 0; +#endif + +#ifdef MONITOR_BREAKPOINTS + +MONITOR_breakpoint_cond MONITOR_breakpoint_table[MONITOR_BREAKPOINT_TABLE_MAX]; +int MONITOR_breakpoint_table_size = 0; +int MONITOR_breakpoints_enabled = TRUE; + +static void breakpoint_print_flag(int flagmask) +{ + switch (flagmask) { + case CPU_N_FLAG: + putchar('N'); + break; + case CPU_V_FLAG: + putchar('V'); + break; + case CPU_D_FLAG: + putchar('D'); + break; + case CPU_I_FLAG: + putchar('I'); + break; + case CPU_Z_FLAG: + putchar('Z'); + break; + case CPU_C_FLAG: + putchar('C'); + break; + } +} + +static int breakpoint_scan_flag(char c) +{ + switch (c) { + case 'N': + return CPU_N_FLAG; + case 'V': + return CPU_V_FLAG; + case 'D': + return CPU_D_FLAG; + case 'I': + return CPU_I_FLAG; + case 'Z': + return CPU_Z_FLAG; + case 'C': + return CPU_C_FLAG; + default: + return -1; + } +} + +static void breakpoints_set(int enabled) +{ + int i; + if (get_dec(&i)) { + do { + if (/*i >= 0 &&*/ i < MONITOR_breakpoint_table_size) + MONITOR_breakpoint_table[i].enabled = (UBYTE) enabled; + } while (get_dec(&i)); + } + else + MONITOR_breakpoints_enabled = enabled; +} + +static void monitor_breakpoints(void) +{ + char *t = get_token(); + if (t == NULL) { + int i; + if (MONITOR_breakpoint_table_size == 0) { + printf("No breakpoints defined\n"); + return; + } + printf("Breakpoints are %sabled\n", MONITOR_breakpoints_enabled ? "en" : "dis"); + for (i = 0; i < MONITOR_breakpoint_table_size; i++) { + printf("%2d: ", i); + if (!MONITOR_breakpoint_table[i].enabled) + printf("OFF "); + switch (MONITOR_breakpoint_table[i].condition) { + case MONITOR_BREAKPOINT_OR: + printf("OR"); + break; + case MONITOR_BREAKPOINT_FLAG_CLEAR: + printf("CLR"); + breakpoint_print_flag(MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_FLAG_SET: + printf("SET"); + breakpoint_print_flag(MONITOR_breakpoint_table[i].value); + break; + default: + { + const char *op; + switch (MONITOR_breakpoint_table[i].condition & 7) { + case MONITOR_BREAKPOINT_LESS: + op = "<"; + break; + case MONITOR_BREAKPOINT_EQUAL: + op = "="; + break; + case MONITOR_BREAKPOINT_LESS | MONITOR_BREAKPOINT_EQUAL: + op = "<="; + break; + case MONITOR_BREAKPOINT_GREATER: + op = ">"; + break; + case MONITOR_BREAKPOINT_GREATER | MONITOR_BREAKPOINT_EQUAL: + op = ">="; + break; + case MONITOR_BREAKPOINT_LESS | MONITOR_BREAKPOINT_GREATER: + op = "!="; + break; + default: + op = "?"; + break; + } + switch (MONITOR_breakpoint_table[i].condition >> 3) { + case MONITOR_BREAKPOINT_PC >> 3: + printf("PC%s%04X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_A >> 3: + printf("A%s%02X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_X >> 3: + printf("X%s%02X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_Y >> 3: + printf("A%s%02X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_S >> 3: + printf("S%s%02X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_READ >> 3: + printf("READ%s%04X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_WRITE >> 3: + printf("WRITE%s%04X", op, MONITOR_breakpoint_table[i].value); + break; + case MONITOR_BREAKPOINT_ACCESS >> 3: + printf("ACCESS%s%04X", op, MONITOR_breakpoint_table[i].value); + break; + default: + printf("???"); + break; + } + } + } + putchar('\n'); + } + return; + } + if (strcmp(t, "?") == 0) { + printf( + "B - print breakpoint table\n" + "B ? - this help\n" + "B C - clear breakpoint table\n" + "B D pos - delete one entry\n" + "B ON - enable breakpoints\n" + "B OFF - disable breakpoints\n" + "B ON pos1... - enable specified breakpoints\n" + "B OFF pos1... - disable specified breakpoints\n" + "B [pos] cond1... - insert breakpoints (at the specified position)\n" + " cond is: TYPE OPERATOR VALUE (without spaces)\n" + " or: SETFLAG, CLRFLAG where FLAG is: N, V, D, I, Z, C\n"); + printf( + " TYPE is: PC, A, X, Y, S, READ, WRITE, ACCESS (read or write)\n" + "OPERATOR is: <, <=, =, ==, >, >=, !=, <>\n" + " VALUE is a hex number\n" + "Breakpoint conditions are connected by AND operator\n" + "unless you explicitly use OR.\n" + "Examples:\n" + "B PC>=203f A<3a OR PC=3a7f X<>0 - creates 5 new entries\n" + "B 2 Y<5 - adds a new entry at position 2\n" + "B D 1 - deletes the entry at position 1\n" + "B OR SETD - appends 2 new entries\n"); + return; + } + Util_strupper(t); + if (strcmp(t, "C") == 0) { + MONITOR_breakpoint_table_size = 0; + printf("Breakpoint table cleared\n"); + } + else if (strcmp(t, "D") == 0) { + int i; + if (get_dec(&i) && /*i >= 0 &&*/ i < MONITOR_breakpoint_table_size) { + MONITOR_breakpoint_table_size--; + while (i < MONITOR_breakpoint_table_size) { + MONITOR_breakpoint_table[i] = MONITOR_breakpoint_table[i + 1]; + i++; + } + printf("Entry deleted\n"); + } + else + printf("Missing or bad argument\n"); + } + else if (strcmp(t, "ON") == 0) { + breakpoints_set(TRUE); + } + else if (strcmp(t, "OFF") == 0) { + breakpoints_set(FALSE); + } + else { + int i; + if (t[0] >= '0' && t[0] <= '9') { + i = Util_sscandec(t); + if (i < 0 || i > MONITOR_breakpoint_table_size) { + printf("Bad argument\n"); + return; + } + t = get_token(); + if (t == NULL) { + printf("Missing arguments\n"); + return; + } + } + else + i = MONITOR_breakpoint_table_size; + while (MONITOR_breakpoint_table_size < MONITOR_BREAKPOINT_TABLE_MAX) { + UBYTE condition; + int value; + int j; + if (strcmp(t, "OR") == 0) { + condition = MONITOR_BREAKPOINT_OR; + value = 0; + } + else if (strncmp(t, "CLR", 3) == 0) { + condition = MONITOR_BREAKPOINT_FLAG_CLEAR; + value = breakpoint_scan_flag(t[3]); + } + else if (strncmp(t, "SET", 3) == 0) { + condition = MONITOR_BREAKPOINT_FLAG_SET; + value = breakpoint_scan_flag(t[3]); + } + else { + condition = 0; + switch (t[0]) { + case 'A': + if (strncmp(t, "ACCESS", 6) == 0) { + condition = MONITOR_BREAKPOINT_ACCESS; + t += 6; + } + else { + condition = MONITOR_BREAKPOINT_A; + t++; + } + break; + case 'X': + condition = MONITOR_BREAKPOINT_X; + t++; + break; + case 'Y': + condition = MONITOR_BREAKPOINT_Y; + t++; + break; + case 'P': + if (t[1] == 'C') { + condition = MONITOR_BREAKPOINT_PC; + t += 2; + } + break; + case 'R': + if (strncmp(t, "READ", 4) == 0) { + condition = MONITOR_BREAKPOINT_READ; + t += 4; + } + break; + case 'S': + condition = MONITOR_BREAKPOINT_S; + t++; + break; + case 'W': + if (strncmp(t, "WRITE", 5) == 0) { + condition = MONITOR_BREAKPOINT_WRITE; + t += 5; + } + break; + default: + break; + } + if (t[0] == '!' && t[1] == '=') { + condition += MONITOR_BREAKPOINT_LESS | MONITOR_BREAKPOINT_GREATER; + t += 2; + } + else { + if (*t == '<') { + condition += MONITOR_BREAKPOINT_LESS; + t++; + } + if (*t == '>') { + condition += MONITOR_BREAKPOINT_GREATER; + t++; + } + if (*t == '=') { + condition += MONITOR_BREAKPOINT_EQUAL; + t++; + if (*t == '=') + t++; + } + } + if ((condition >> 3) == 0 || (condition & 7) == 0) { + printf("Bad argument\n"); + return; + } + { + UWORD tmp; + if (parse_hex(t, &tmp)) + value = tmp; + else + value = -1; + } + } + if (value < 0 || value > 0xffff) { + printf("Bad argument\n"); + return; + } + for (j = MONITOR_breakpoint_table_size; j > i; j--) + MONITOR_breakpoint_table[j] = MONITOR_breakpoint_table[j - 1]; + MONITOR_breakpoint_table[i].enabled = TRUE; + MONITOR_breakpoint_table[i].condition = condition; + MONITOR_breakpoint_table[i].value = (UWORD) value; + i++; + MONITOR_breakpoint_table_size++; + t = get_token(); + if (t == NULL) { + printf("Breakpoint(s) added\n"); + return; + } + Util_strupper(t); + } + printf("Breakpoint table full\n"); + } +} + +#endif /* MONITOR_BREAKPOINTS */ + +#ifdef MONITOR_BREAK +/* Enables/disables breakpoints on BRK according to the command line. */ +static void monitor_break_BRK(void) +{ + char *t = get_token(); + if (t == NULL) + printf("Break on BRK is %sabled\n", MONITOR_break_brk ? "en" : "dis"); + else if (Util_stricmp(t, "ON") == 0) + MONITOR_break_brk = TRUE; + else if (Util_stricmp(t, "OFF") == 0) + MONITOR_break_brk = FALSE; + else + printf("Invalid argument. Usage: BBRK ON or OFF\n"); +} + +/* Enables/disables breakpoint in a specific program counter value, fetched + from command line. */ +static void monitor_break_PC(void) +{ + int addr_valid = get_hex(&MONITOR_break_addr); + if (addr_valid) + { + if (MONITOR_break_addr >= 0xd000 && MONITOR_break_addr <= 0xd7ff) + printf("PC breakpoint disabled\n"); + else + printf("Breakpoint set at PC=%04X\n", MONITOR_break_addr); + } + else + { + printf("Breakpoint is at PC=%04X\n", MONITOR_break_addr); + } +} + +/* Displays last 64 executed instructions. */ +static void show_history(void) +{ + int i; + for (i = 0; i < CPU_REMEMBER_PC_STEPS; i++) { + int j; + int k; + UWORD saved_cpu = CPU_remember_PC[(CPU_remember_PC_curpos + i) % CPU_REMEMBER_PC_STEPS]; + UBYTE save_op[3]; + j = CPU_remember_xpos[(CPU_remember_PC_curpos + i) % CPU_REMEMBER_PC_STEPS]; + printf("%3d %3d ", j >> 8, j & 0xff); + for (k = 0; k < 3; k++) { + save_op[k] = MEMORY_SafeGetByte(saved_cpu + k); + MEMORY_dPutByte(saved_cpu + k, CPU_remember_op[(CPU_remember_PC_curpos + i) % CPU_REMEMBER_PC_STEPS][k]); + } + show_instruction(stdout, CPU_remember_PC[(CPU_remember_PC_curpos + i) % CPU_REMEMBER_PC_STEPS]); + for (k = 0; k < 3; k++) { + MEMORY_dPutByte(saved_cpu + k, save_op[k]); + } + } +} + +/* Displays last 16 executed JMP/JSR instructions. */ +static void show_last_jumps(void) +{ + int i; + for (i = 0; i < CPU_REMEMBER_JMP_STEPS; i++) + show_instruction(stdout, CPU_remember_JMP[(CPU_remember_jmp_curpos + i) % CPU_REMEMBER_JMP_STEPS]); +} + +/* Stesp over the current instruction. */ +static void step_over(void) +{ + UBYTE opcode = MEMORY_SafeGetByte(CPU_regPC); + if ((opcode & 0x1f) == 0x10 || opcode == 0x20) { + /* branch or JSR: set breakpoint after it */ + MONITOR_break_addr = CPU_regPC + (MONITOR_optype6502[MEMORY_SafeGetByte(CPU_regPC)] & 0x3); + break_over = TRUE; + } + else + MONITOR_break_step = TRUE; +} +#endif /* MONITOR_BREAK */ + +#if defined(MONITOR_BREAK) || !defined(NO_YPOS_BREAK_FLICKER) +/* Enables/disables breakpoint or blinking of a scanline specified at command + line. */ +static void monitor_bline(void) +{ + get_dec(&ANTIC_break_ypos); + if (ANTIC_break_ypos >= 1008 && ANTIC_break_ypos <= 1247) + printf("Blinking scanline %d\n", ANTIC_break_ypos - 1000); +#ifdef MONITOR_BREAK + else if (ANTIC_break_ypos >= 0 && ANTIC_break_ypos <= 311) + printf("Breakpoint set at scanline %d\n", ANTIC_break_ypos); +#endif + else + printf("BLINE disabled\n"); +} +#endif + +/* Displays ANTIC's Display List. */ +static void show_dlist(void) +{ +#if 0 + /* one instruction per line */ + UWORD tdlist = dlist; + int nlines = 0; + get_hex(&tdlist); + for (;;) { + UBYTE IR; + + printf("%04X: ", tdlist); + IR = ANTIC_GetDLByte(&tdlist); + + if (IR & 0x80) + printf("DLI "); + + if ((IR & 0x0f) == 0) + printf("%c BLANK\n", ((IR >> 4) & 0x07) + '1'); + else if ((IR & 0x0f) == 1) { + tdlist = ANTIC_GetDLWord(&tdlist); + if (IR & 0x40) { + printf("JVB %04X\n", tdlist); + break; + } + printf("JMP %04X\n", tdlist); + } + else { + if (IR & 0x40) + printf("LMS %04X ", ANTIC_GetDLWord(&tdlist)); + if (IR & 0x20) + printf("VSCROL "); + if (IR & 0x10) + printf("HSCROL "); + printf("MODE %X\n", IR & 0x0f); + } + + if (++nlines == 24) { + if (pager()) + break; + nlines = 0; + } + } +#else + /* group identical instructions */ + UWORD tdlist = ANTIC_dlist; + UWORD new_tdlist; + UBYTE IR; + int scrnaddr = -1; + int nlines = 0; + get_hex(&tdlist); + new_tdlist = tdlist; + IR = ANTIC_GetDLByte(&new_tdlist); + for (;;) { + printf("%04X: ", tdlist); + if ((IR & 0x0f) == 0) { + UBYTE new_IR; + tdlist = new_tdlist; + new_IR = ANTIC_GetDLByte(&new_tdlist); + if (new_IR == IR) { + int count = 1; + do { + count++; + tdlist = new_tdlist; + new_IR = ANTIC_GetDLByte(&new_tdlist); + } while (new_IR == IR && count < 240); + printf("%dx ", count); + } + if (IR & 0x80) + printf("DLI "); + printf("%c BLANK\n", ((IR >> 4) & 0x07) + '1'); + IR = new_IR; + } + else if ((IR & 0x0f) == 1) { + tdlist = ANTIC_GetDLWord(&new_tdlist); + if (IR & 0x80) + printf("DLI "); + if (IR & 0x40) { + printf("JVB %04X\n", tdlist); + break; + } + printf("JMP %04X\n", tdlist); + new_tdlist = tdlist; + IR = ANTIC_GetDLByte(&new_tdlist); + } + else { + UBYTE new_IR; + int new_scrnaddr; + int count; + if ((IR & 0x40) && scrnaddr < 0) + scrnaddr = ANTIC_GetDLWord(&new_tdlist); + for (count = 1;; count++) { + tdlist = new_tdlist; + new_IR = ANTIC_GetDLByte(&new_tdlist); + if (new_IR != IR || count >= 240) { + new_scrnaddr = -1; + break; + } + if (IR & 0x40) { + new_scrnaddr = ANTIC_GetDLWord(&new_tdlist); + if (new_scrnaddr != scrnaddr) + break; + } + } + if (count > 1) + printf("%dx ", count); + if (IR & 0x80) + printf("DLI "); + if (IR & 0x40) + printf("LMS %04X ", scrnaddr); + if (IR & 0x20) + printf("VSCROL "); + if (IR & 0x10) + printf("HSCROL "); + printf("MODE %X\n", IR & 0x0f); + scrnaddr = new_scrnaddr; + IR = new_IR; + } + + if (++nlines == 24) { + if (pager()) + break; + nlines = 0; + } + } +#endif +} + +/* Sets the N flag to VAL, if it equals to 0 or 1. */ +static void monitor_set_N(int const val) +{ + if (val == 0) + CPU_ClrN; + else if (val == 1) + CPU_SetN; +} + +/* Sets the V flag to VAL, if it equals to 0 or 1. */ +static void monitor_set_V(int const val) +{ + if (val == 0) + CPU_ClrV; + else if (val == 1) + CPU_SetV; +} + +/* Sets the D flag to VAL, if it equals to 0 or 1. */ +static void monitor_set_D(int const val) +{ + if (val == 0) + CPU_ClrD; + else if (val == 1) + CPU_SetD; +} + +/* Sets the I flag to VAL, if it equals to 0 or 1. */ +static void monitor_set_I(int const val) +{ + if (val == 0) + CPU_ClrI; + else if (val == 1) + CPU_SetI; +} + +/* Sets the Z flag to VAL, if it equals to 0 or 1. */ +static void monitor_set_Z(int const val) +{ + if (val == 0) + CPU_ClrZ; + else if (val == 1) + CPU_SetZ; +} + +/* Sets the C flag to VAL, if it equals to 0 or 1. */ +static void monitor_set_C(int const val) +{ + if (val == 0) + CPU_ClrC; + else if (val == 1) + CPU_SetC; +} + +#ifdef MONITOR_TRACE +/* Opens/closes the 6502 trace file. */ +static void set_trace_file(char const *filename) +{ + if (MONITOR_trace_file != NULL) { + fclose(MONITOR_trace_file); + printf("Trace file closed\n"); + MONITOR_trace_file = NULL; + } + if (filename != NULL) { + MONITOR_trace_file = fopen(filename, "w"); + if (MONITOR_trace_file != NULL) + printf("Trace file open\n"); + else + perror(filename); + } +} +#endif /* MONITOR_TRACE */ + +#ifdef MONITOR_PROFILE +static void command_PROFILE(void) +{ + int i; + for (i = 0; i < 24; i++) { + int max, instr; + int j; + max = CPU_instruction_count[0]; + instr = 0; + for (j = 1; j < 256; j++) { + if (CPU_instruction_count[j] > max) { + max = CPU_instruction_count[j]; + instr = j; + } + } + if (max <= 0) + break; + CPU_instruction_count[instr] = 0; + printf("Opcode %02X: %-9s has been executed %d times\n", + instr, instr6502[instr], max); + } +} +#endif /* MONITOR_PROFILE */ + +/* Displays current contents of the processor stack. */ +static void show_stack(void) +{ + int ts; + for (ts = 0x101 + CPU_regS; ts < 0x200; ) { + if (ts < 0x1ff) { + UWORD ta = (UWORD) (MEMORY_dGetWord(ts) - 2); + if (MEMORY_dGetByte(ta) == 0x20) { + printf("%04X: %02X %02X %04X: JSR %04X\n", + ts, MEMORY_dGetByte(ts), MEMORY_dGetByte(ts + 1), ta, + MEMORY_dGetWord(ta + 1)); + ts += 2; + continue; + } + } + printf("%04X: %02X\n", ts, MEMORY_dGetByte(ts)); + ts++; + } +} + +/* Sets memory as read-only based on range fetched from command line. */ +static void monitor_set_ROM(void) +{ + UWORD addr1; + UWORD addr2; + if (get_attrib_range(&addr1, &addr2)) { + MEMORY_SetROM(addr1, addr2); + printf("Changed memory from %04X to %04X into ROM\n", + addr1, addr2); + } +} + +/* Sets memory as writable based on range fetched from command line. */ +static void monitor_set_RAM(void) +{ + UWORD addr1; + UWORD addr2; + if (get_attrib_range(&addr1, &addr2)) { + MEMORY_SetRAM(addr1, addr2); + printf("Changed memory from %04X to %04X into RAM\n", + addr1, addr2); + } +} + +#ifndef PAGED_ATTRIB +/* Sets memory as hardware based on range fetched from command line. */ +static void monitor_set_hardware(void) +{ + UWORD addr1; + UWORD addr2; + if (get_attrib_range(&addr1, &addr2)) { + MEMORY_SetHARDWARE(addr1, addr2); + printf("Changed memory from %04X to %04X into HARDWARE\n", + addr1, addr2); + } +} +#endif /* PAGED_ATTRIB */ + +#ifndef PAGED_MEM +/* Reads file into memory, under address fetched from command line. */ +static void monitor_read_from_file(UWORD *addr) +{ + const char *filename; + filename = get_token(); + if (filename != NULL) { + UWORD nbytes; + if (get_hex2(addr, &nbytes) && *addr + nbytes <= 0x10000) { + FILE *f = fopen(filename, "rb"); + if (f == NULL) + perror(filename); + else { + if (fread(&MEMORY_mem[*addr], 1, nbytes, f) == 0) + perror(filename); + fclose(f); + } + } + } +} + +/* Writes memory to file, from address fetched from command line. */ +static void monitor_write_to_file(void) +{ + UWORD addr1; + UWORD addr2; + if (get_hex2(&addr1, &addr2) && addr1 <= addr2) { + const char *filename; + FILE *f; + filename = get_token(); + if (filename == NULL) + filename = "memdump.dat"; + f = fopen(filename, "wb"); + if (f == NULL) + perror(filename); + else { + size_t nbytes = addr2 - addr1 + 1; + if (fwrite(&MEMORY_mem[addr1], 1, addr2 - addr1 + 1, f) < nbytes) + perror(filename); + fclose(f); + } + } +} + +/* Fills memory area witha value. Memory range and the value are fetched from + command line. */ +static void monitor_fill_mem(void) +{ + UWORD addr1; + UWORD addr2; + UWORD hexval; + if (get_hex3(&addr1, &addr2, &hexval)) { + /* use int to avoid endless loop with addr2==0xffff */ + int a; + for (a = addr1; a <= addr2; a++) + MEMORY_dPutByte(a, (UBYTE) hexval); + } +} + +/* Changes memory contents. Start address and byte values are fetched from + command line. */ +static void monitor_change_mem(UWORD *addr) +{ + UWORD temp = 0; + get_hex(addr); + while (get_hex(&temp)) { +#ifdef PAGED_ATTRIB + if (MEMORY_writemap[*addr >> 8] != NULL && MEMORY_writemap[*addr >> 8] != MEMORY_ROM_PutByte) + (*MEMORY_writemap[*addr >> 8])(*addr, (UBYTE) temp); +#else + if (MEMORY_attrib[*addr] == MEMORY_HARDWARE) + MEMORY_HwPutByte(*addr, (UBYTE) temp); +#endif + else /* RAM, ROM */ + MEMORY_dPutByte(*addr, (UBYTE) temp); + (*addr)++; + if (temp > 0xff) { +#ifdef PAGED_ATTRIB + if (MEMORY_writemap[*addr >> 8] != NULL && MEMORY_writemap[*addr >> 8] != MEMORY_ROM_PutByte) + (*MEMORY_writemap[*addr >> 8])(*addr, (UBYTE) (temp >> 8)); +#else + if (MEMORY_attrib[*addr] == MEMORY_HARDWARE) + MEMORY_HwPutByte(*addr, (UBYTE) (temp >> 8)); +#endif + else /* RAM, ROM */ + MEMORY_dPutByte(*addr, (UBYTE) (temp >> 8)); + (*addr)++; + } + } +} +#endif /* PAGED_MEM */ + +/* Displays sum of a memory range, fetched from command line. */ +static void monitor_sum_mem(void) +{ + UWORD addr1; + UWORD addr2; + if (get_hex2(&addr1, &addr2)) { + int sum = 0; + int i; + for (i = addr1; i <= addr2; i++) + sum += MEMORY_SafeGetByte(i); + printf("SUM: %X\n", sum); + } +} + +/* Show memory contents, starting from address fetched from command line. */ +static void monitor_show_mem(UWORD *addr) +{ + int count = 16; + get_hex(addr); + do { + int i; + printf("%04X: ", *addr); + for (i = 0; i < 16; i++) + printf("%02X ", MEMORY_SafeGetByte((UWORD) (*addr + i))); + putchar(' '); + for (i = 0; i < 16; i++) { + UBYTE c; + c = MEMORY_SafeGetByte(*addr); + (*addr)++; + putchar((c >= ' ' && c <= 'z' && c != '\x60') ? c : '.'); + } + putchar('\n'); + } while (--count > 0); +} + +/* Starts searching for memory locations that hold a value fetched from command line. */ +static void trainer_start_search(void) +{ + UWORD trainer_value = 0; + int value_valid = get_hex(&trainer_value); + + /* alloc needed memory at first use */ + if (trainer_memory == NULL) { + trainer_memory = malloc(65536*2); + if (trainer_memory != NULL) { + trainer_flags = trainer_memory + 65536; + } else { + printf("Memory allocation failed!\n" + "Trainer not available.\n"); + } + } + if (trainer_memory != NULL) { + /* copy memory into shadow buffer at first use */ + long int count = 65535; + do { + *(trainer_memory+count) = MEMORY_SafeGetByte((UWORD) count); + *(trainer_flags+count) = 0xff; + } while (--count > -1); + if (value_valid) { + count = 65535; + do { + if (trainer_value != *(trainer_memory+count)) { + *(trainer_flags+count) = 0; + } + } while (--count > -1); + } + } +} + +/* Locates memory addresses that haven't changed since TSS. */ +static void trainer_search_unchanged(void) +{ + UWORD trainer_value = 0; + int value_valid = get_hex(&trainer_value); + + if (trainer_memory != NULL) { + long int count = 65535; + do { + if (value_valid) { + if (trainer_value != MEMORY_SafeGetByte((UWORD) count)) { + *(trainer_flags+count) = 0; + } + } else { + if (*(trainer_memory+count) != MEMORY_SafeGetByte((UWORD) count)) { + *(trainer_flags+count) = 0; + } + } + *(trainer_memory+count) = MEMORY_SafeGetByte((UWORD) count); + } while (--count > -1); + } else { + printf("Use tss first.\n"); + } +} + +/* Locates memory addresses that have changed since TSS. */ +static void trainer_search_changed(void) +{ + UWORD trainer_value = 0; + int value_valid = get_hex(&trainer_value); + + if (trainer_memory != NULL) { + long int count = 65535; + do { + if (value_valid) { + if (trainer_value != MEMORY_SafeGetByte((UWORD) count)) { + *(trainer_flags+count) = 0; + } + } else { + if (*(trainer_memory+count) == MEMORY_SafeGetByte((UWORD) count)) { + *(trainer_flags+count) = 0; + } + }; + *(trainer_memory+count) = MEMORY_SafeGetByte((UWORD) count); + } while (--count > -1); + } else { + printf("Use tss first.\n"); + } +} + +/* Displays memory addresses located with TSS/TSN. */ +static void trainer_print_addresses(void) +{ + UWORD addr_count_max = 0; + int addr_valid = get_hex(&addr_count_max); + + /* default print size is 8*8 adresses */ + if (!addr_valid) { + addr_count_max = 64; + } + + if (trainer_memory != NULL) { + long int count = 0; + ULONG addr_count = 0; + int i = 0; + do { + if (*(trainer_flags+count) != 0) { + printf("%04X ", (UWORD) count); + addr_count++; + if (++i == 8) { + printf("\n"); + i = 0; + }; + }; + } while ((++count < 65536) && (addr_count < addr_count_max)); + printf("\n"); + } else { + printf("Use tss first.\n"); + } +} + +/* Searches in memory for a value. Memory range and value are fetched from + command line. */ +static void monitor_search_mem(void) +{ + /* static, so "S" without arguments repeats last search */ + static int n = 0; + static UWORD addr1; + static UWORD addr2; + static UBYTE tab[64]; + UWORD hexval; + if (get_hex3(&addr1, &addr2, &hexval)) { + n = 0; + do { + tab[n++] = (UBYTE) hexval; + if (hexval > 0xff && n < 64) + tab[n++] = (UBYTE) (hexval >> 8); + } while (n < 64 && get_hex(&hexval)); + } + if (n > 0) { + int a; + for (a = addr1; a <= addr2; a++) { + int i = 0; + while (MEMORY_SafeGetByte((UWORD) (a + i)) == tab[i]) { + i++; + if (i >= n) { + printf("Found at %04X\n", a); + break; + } + } + } + } +} + +/* Shows disassembly of a loop that spans over address ADDR. */ +static UWORD disassemble_loop(UWORD addr) +{ + int caddr; + caddr = addr; + for (;;) { + UBYTE opcode; + if (caddr > (UWORD) (addr + 0x7e)) { + printf("Conditional loop containing instruction at %04X not detected\n", addr); + break; + } + opcode = MEMORY_SafeGetByte(caddr); + if ((opcode & 0x1f) == 0x10) { + /* branch */ + UWORD target = caddr + 2 + (SBYTE) MEMORY_SafeGetByte(caddr + 1); + if (target <= addr) { + addr = disassemble(target); + break; + } + } + caddr += MONITOR_optype6502[opcode] & 3; + } + return addr; +} + +#ifdef MONITOR_HINTS +static void configure_labels(UWORD *addr) +{ + char *cmd = get_token(); + if (cmd == NULL) { + printf("Built-in labels are %sabled.\n", symtable_builtin_enable ? "en" : "dis"); + if (symtable_user_size > 0) + printf("Using %d user-defined label%s.\n", + symtable_user_size, (symtable_user_size > 1) ? "s" : ""); + else + printf("There are no user-defined labels.\n"); + printf( + "Labels are displayed in disassembly listings.\n" + "You may also use them as command arguments" +#ifdef MONITOR_ASSEMBLER + " and in the built-in assembler" +#endif + ".\n" + "Usage:\n" + "LABELS OFF - no labels\n" + "LABELS BUILTIN - use only built-in labels\n" + "LABELS LOAD filename - use only labels loaded from file\n" + "LABELS ADD filename - use built-in and loaded labels\n" + "LABELS SET name value - define a label\n" + "LABELS LIST - list user-defined labels\n" + ); + } + else { + Util_strupper(cmd); + if (strcmp(cmd, "OFF") == 0) { + symtable_builtin_enable = FALSE; + free_user_labels(); + } + else if (strcmp(cmd, "BUILTIN") == 0) { + symtable_builtin_enable = TRUE; + free_user_labels(); + } + else if (strcmp(cmd, "LOAD") == 0) { + symtable_builtin_enable = FALSE; + load_user_labels(get_token()); + } + else if (strcmp(cmd, "ADD") == 0) { + symtable_builtin_enable = TRUE; + load_user_labels(get_token()); + } + else if (strcmp(cmd, "SET") == 0) { + const char *name = get_token(); + if (name != NULL && get_hex(addr)) { + symtable_rec *p = find_user_label(name); + if (p != NULL) { + if (p->addr != *addr) { + printf("%s redefined (previous value: %04X)\n", name, p->addr); + p->addr = *addr; + } + } + else + add_user_label(name, *addr); + } + else + printf("Missing or bad arguments\n"); + } + else if (strcmp(cmd, "LIST") == 0) { + int i; + int nlines = 0; + for (i = 0; i < symtable_user_size; i++) { + if (++nlines == 24) { + if (pager()) + break; + nlines = 0; + } + printf("%04X %s\n", symtable_user[i].addr, symtable_user[i].name); + } + } + else + printf("Invalid command, type \"LABELS\" for help\n"); + } +} +#endif /* MONITOR_HINTS */ + +/* Displays current ANTIC state. */ +static void show_ANTIC(void) +{ + printf("DMACTL=%02X CHACTL=%02X DLISTL=%02X " + "DLISTH=%02X HSCROL=%02X VSCROL=%02X\n", + ANTIC_DMACTL, ANTIC_CHACTL, ANTIC_dlist & 0xff, ANTIC_dlist >> 8, ANTIC_HSCROL, ANTIC_VSCROL); + printf("PMBASE=%02X CHBASE=%02X VCOUNT=%02X " + "NMIEN= %02X ypos=%4d\n", + ANTIC_PMBASE, ANTIC_CHBASE, ANTIC_GetByte(ANTIC_OFFSET_VCOUNT, TRUE), ANTIC_NMIEN, ANTIC_ypos); +} + +/* Displays current PIA state. */ +static void show_PIA(void) +{ + printf("PACTL= %02X PBCTL= %02X PORTA= %02X " + "PORTB= %02X\n", PIA_PACTL, PIA_PBCTL, PIA_PORTA, PIA_PORTB); +} + +/* Displays current GTIA state. */ +static void show_GTIA(void) +{ + printf("HPOSP0=%02X HPOSP1=%02X HPOSP2=%02X HPOSP3=%02X\n", + GTIA_HPOSP0, GTIA_HPOSP1, GTIA_HPOSP2, GTIA_HPOSP3); + printf("HPOSM0=%02X HPOSM1=%02X HPOSM2=%02X HPOSM3=%02X\n", + GTIA_HPOSM0, GTIA_HPOSM1, GTIA_HPOSM2, GTIA_HPOSM3); + printf("SIZEP0=%02X SIZEP1=%02X SIZEP2=%02X SIZEP3=%02X SIZEM= %02X\n", + GTIA_SIZEP0, GTIA_SIZEP1, GTIA_SIZEP2, GTIA_SIZEP3, GTIA_SIZEM); + printf("GRAFP0=%02X GRAFP1=%02X GRAFP2=%02X GRAFP3=%02X GRAFM= %02X\n", + GTIA_GRAFP0, GTIA_GRAFP1, GTIA_GRAFP2, GTIA_GRAFP3, GTIA_GRAFM); + printf("COLPM0=%02X COLPM1=%02X COLPM2=%02X COLPM3=%02X\n", + GTIA_COLPM0, GTIA_COLPM1, GTIA_COLPM2, GTIA_COLPM3); + printf("COLPF0=%02X COLPF1=%02X COLPF2=%02X COLPF3=%02X COLBK= %02X\n", + GTIA_COLPF0, GTIA_COLPF1, GTIA_COLPF2, GTIA_COLPF3, GTIA_COLBK); + printf("PRIOR= %02X VDELAY=%02X GRACTL=%02X\n", + GTIA_PRIOR, GTIA_VDELAY, GTIA_GRACTL); +} + +/* Displays current POKEY state. */ +static void show_POKEY(void) +{ + printf("AUDF1= %02X AUDF2= %02X AUDF3= %02X AUDF4= %02X AUDCTL=%02X KBCODE=%02X\n", + POKEY_AUDF[POKEY_CHAN1], POKEY_AUDF[POKEY_CHAN2], POKEY_AUDF[POKEY_CHAN3], POKEY_AUDF[POKEY_CHAN4], POKEY_AUDCTL[0], POKEY_KBCODE); + printf("AUDC1= %02X AUDC2= %02X AUDC3= %02X AUDC4= %02X IRQEN= %02X IRQST= %02X\n", + POKEY_AUDC[POKEY_CHAN1], POKEY_AUDC[POKEY_CHAN2], POKEY_AUDC[POKEY_CHAN3], POKEY_AUDC[POKEY_CHAN4], POKEY_IRQEN, POKEY_IRQST); + printf("SKSTAT=%02X SKCTL= %02X\n", POKEY_SKSTAT, POKEY_SKCTL); +#ifdef STEREO_SOUND + if (POKEYSND_stereo_enabled) { + printf("Second chip:\n"); + printf("AUDF1= %02X AUDF2= %02X AUDF3= %02X AUDF4= %02X AUDCTL=%02X\n", + POKEY_AUDF[POKEY_CHAN1 + POKEY_CHIP2], POKEY_AUDF[POKEY_CHAN2 + POKEY_CHIP2], POKEY_AUDF[POKEY_CHAN3 + POKEY_CHIP2], POKEY_AUDF[POKEY_CHAN4 + POKEY_CHIP2], POKEY_AUDCTL[1]); + printf("AUDC1= %02X AUDC2= %02X AUDC3= %02X AUDC4= %02X\n", + POKEY_AUDC[POKEY_CHAN1 + POKEY_CHIP2], POKEY_AUDC[POKEY_CHAN2 + POKEY_CHIP2], POKEY_AUDC[POKEY_CHAN3 + POKEY_CHIP2], POKEY_AUDC[POKEY_CHAN4 + POKEY_CHIP2]); + } +#endif +} + +/* Displays monitor help. */ +static void show_help(void) +{ + printf( + "CONT - Continue emulation\n" + "SHOW - Show registers\n" + "STACK - Show stack\n" + "SET{PC,A,X,Y,S} hexval - Set register value\n" + "SET{N,V,D,I,Z,C} 0 or 1 - Set flag value\n" + "C startaddr hexval... - Change memory\n" + "D [startaddr] - Disassemble memory\n" + "F startaddr endaddr hexval - Fill memory\n" + "M [startaddr] - Memory list\n" + "S startaddr endaddr hexval... - Search memory\n"); + /* split into several printfs to avoid gcc -pedantic warning: "string length 'xxx' + is greater than the length '509' ISO C89 compilers are required to support" */ + printf( + "LOOP [inneraddr] - Disassemble a loop that contains inneraddr\n" + "RAM startaddr endaddr - Convert memory block into RAM\n" + "ROM startaddr endaddr - Convert memory block into ROM\n" + "HARDWARE startaddr endaddr - Convert memory block into HARDWARE\n" + "READ filename startaddr nbytes - Read file into memory\n" + "WRITE startaddr endaddr [file] - Write memory block to a file (memdump.dat)\n" + "SUM startaddr endaddr - Print sum of specified memory range\n"); +#ifdef MONITOR_TRACE + printf( + "TRACE [filename] - Output 6502 trace on/off\n"); +#endif +#ifdef MONITOR_BREAK + printf( + "BPC [addr] - Set breakpoint at address\n" + "BLINE [ypos] or [1000+ypos] - Break at scanline or blink scanline\n" + "BBRK ON or OFF - Breakpoint on BRK on/off\n" + "HISTORY or H - List last %d executed instructions\n", CPU_REMEMBER_PC_STEPS); + printf( + "JUMPS - List last %d executed JMP/JSR\n", CPU_REMEMBER_JMP_STEPS); + { + char buf[100]; + safe_gets(buf, sizeof(buf), "Press return to continue: "); + } + printf( + "G - Execute one instruction\n" + "O - Step over the instruction\n" + "R - Execute until return\n"); +#elif !defined(NO_YPOS_BREAK_FLICKER) + printf( + "BLINE [1000+ypos] - Blink scanline (8<=ypos<=247)\n"); +#endif + printf( +#ifdef MONITOR_BREAKPOINTS + "B [argument...] - Manage breakpoints (\"B ?\" for help)\n" +#endif +#ifdef MONITOR_ASSEMBLER + "A [startaddr] - Start simple assembler\n" +#endif + "ANTIC, GTIA, PIA, POKEY - Display hardware registers\n" + "DLIST [startaddr] - Show Display List\n"); + printf( +#ifdef MONITOR_PROFILE + "PROFILE - Display profiling statistics\n" +#endif +#ifdef MONITOR_HINTS + "LABELS [command] [filename] - Configure labels\n" +#endif + "TSS [value] - Start trainer search\n" + "TSC [value] - Perform when trainer value has changed\n" + "TSN [value] - Perform when trainer value has NOT changed\n" + " Without [value], perform a deep trainer search\n" + "TSP [count] - Print [count] possible trainer addresses\n"); + printf( + "COLDSTART, WARMSTART - Perform system coldstart/warmstart\n" +#ifdef HAVE_SYSTEM + "!command - Execute shell command\n" +#endif + "QUIT or EXIT - Quit emulator\n" + "HELP or ? - This text\n"); +} + +int MONITOR_Run(void) +{ + UWORD addr; + +#ifdef __PLUS + if (!Misc_AllocMonitorConsole(&mon_output, &mon_input)) + return TRUE; +#endif + + addr = CPU_regPC; + + CPU_GetStatus(); + + if (CPU_cim_encountered) { + printf("(CIM encountered)\n"); + CPU_cim_encountered = FALSE; + } + +#ifdef MONITOR_BREAK + if (break_over) { + /* "O" command was active */ + MONITOR_break_addr = 0xd000; + break_over = FALSE; + } + else if (CPU_regPC == MONITOR_break_addr) + printf("(breakpoint at %04X)\n", (unsigned int) MONITOR_break_addr); + else if (ANTIC_ypos == ANTIC_break_ypos) + printf("(breakpoint at scanline %d)\n", ANTIC_break_ypos); + else if (MONITOR_break_ret && MONITOR_ret_nesting <= 0) + printf("(returned)\n"); + MONITOR_break_step = FALSE; + MONITOR_break_ret = FALSE; +#endif /* MONITOR_BREAK */ + + show_state(); + + for (;;) { + char s[128]; + static char old_s[128]; + char *t; + + safe_gets(s, sizeof(s), "> "); + if (s[0] != '\0') + strcpy(old_s, s); + else { + /* if no command is given, restart the last one, but remove all + * arguments, so after a 'm 600' we will see 'm 700' ... */ + int i; + strcpy(s, old_s); + for (i = 0; i < (int) sizeof(s); i++) + if (s[i] == ' ') { + s[i] = '\0'; + break; + } + } +#ifdef HAVE_SYSTEM + if (s[0] == '!') { + if (system(s + 1) == -1) { + printf("Error executing '%s'\n", s+1); + } + continue; + } +#endif + token_ptr = s; + t = get_token(); + if (t == NULL) + continue; + + /* uppercase the command */ + Util_strupper(t); + + if (strcmp(t, "CONT") == 0) { +#ifdef MONITOR_PROFILE + memset(CPU_instruction_count, 0, sizeof(CPU_instruction_count)); +#endif /* MONITOR_PROFILE */ + PLUS_EXIT_MONITOR; + return TRUE; + } +#ifdef MONITOR_BREAK + else if (strcmp(t, "BBRK") == 0) + monitor_break_BRK(); + else if (strcmp(t, "BPC") == 0) + monitor_break_PC(); + else if (strcmp(t, "HISTORY") == 0 || strcmp(t, "H") == 0) + show_history(); + else if (strcmp(t, "JUMPS") == 0) + show_last_jumps(); + else if (strcmp(t, "G") == 0) { + MONITOR_break_step = TRUE; + PLUS_EXIT_MONITOR; + return TRUE; + } + else if (strcmp(t, "R") == 0 ) { + MONITOR_break_ret = TRUE; + MONITOR_ret_nesting = 1; + PLUS_EXIT_MONITOR; + return TRUE; + } + else if (strcmp(t, "O") == 0) { + step_over(); + PLUS_EXIT_MONITOR; + return TRUE; + } +#endif /* MONITOR_BREAK */ +#if defined(MONITOR_BREAK) || !defined(NO_YPOS_BREAK_FLICKER) + else if (strcmp(t, "BLINE") == 0) + monitor_bline(); +#endif /* defined(MONITOR_BREAK) || !defined(NO_YPOS_BREAK_FLICKER) */ + else if (strcmp(t, "DLIST") == 0) + show_dlist(); + else if (strcmp(t, "SETPC") == 0) + get_uword(&CPU_regPC); + else if (strcmp(t, "SETS") == 0) + get_ubyte(&CPU_regS); + else if (strcmp(t, "SETA") == 0) + get_ubyte(&CPU_regA); + else if (strcmp(t, "SETX") == 0) + get_ubyte(&CPU_regX); + else if (strcmp(t, "SETY") == 0) + get_ubyte(&CPU_regY); + else if (strcmp(t, "SETN") == 0) + monitor_set_N(get_bool()); + else if (strcmp(t, "SETV") == 0) + monitor_set_V(get_bool()); + else if (strcmp(t, "SETD") == 0) + monitor_set_D(get_bool()); + else if (strcmp(t, "SETI") == 0) + monitor_set_I(get_bool()); + else if (strcmp(t, "SETZ") == 0) + monitor_set_Z(get_bool()); + else if (strcmp(t, "SETC") == 0) + monitor_set_C(get_bool()); +#ifdef MONITOR_TRACE + else if (strcmp(t, "TRACE") == 0) { + const char *filename = get_token(); + set_trace_file(filename); + } +#endif /* MONITOR_TRACE */ +#ifdef MONITOR_PROFILE + else if (strcmp(t, "PROFILE") == 0) + command_PROFILE(); +#endif /* MONITOR_PROFILE */ + else if (strcmp(t, "SHOW") == 0) + show_state(); + else if (strcmp(t, "STACK") == 0) + show_stack(); + else if (strcmp(t, "ROM") == 0) + monitor_set_ROM(); + else if (strcmp(t, "RAM") == 0) + monitor_set_RAM(); +#ifndef PAGED_ATTRIB + else if (strcmp(t, "HARDWARE") == 0) + monitor_set_hardware(); +#endif /* PAGED_ATTRIB */ + else if (strcmp(t, "COLDSTART") == 0) { + Atari800_Coldstart(); + PLUS_EXIT_MONITOR; + return TRUE; /* perform reboot immediately */ + } + else if (strcmp(t, "WARMSTART") == 0) { + Atari800_Warmstart(); + PLUS_EXIT_MONITOR; + return TRUE; /* perform reboot immediately */ + } +#ifndef PAGED_MEM + else if (strcmp(t, "READ") == 0) + monitor_read_from_file(&addr); + else if (strcmp(t, "WRITE") == 0) + monitor_write_to_file(); + else if (strcmp(t, "F") == 0) + monitor_fill_mem(); + else if (strcmp(t, "C") == 0) + monitor_change_mem(&addr); +#endif /* PAGED_MEM */ + else if (strcmp(t, "SUM") == 0) + monitor_sum_mem(); + else if (strcmp(t, "M") == 0) + monitor_show_mem(&addr); + else if (strcmp(t, "TSS") == 0) + trainer_start_search(); + else if (strcmp(t, "TSN") == 0) + trainer_search_unchanged(); + else if (strcmp(t, "TSC") == 0) + trainer_search_changed(); + else if (strcmp(t, "TSP") == 0) + trainer_print_addresses(); + else if (strcmp(t, "S") == 0) + monitor_search_mem(); +#ifdef MONITOR_BREAKPOINTS + else if (strcmp(t, "B") == 0) + monitor_breakpoints(); +#endif + else if (strcmp(t, "D") == 0) { + get_hex(&addr); + addr = disassemble(addr); + } + else if (strcmp(t, "LOOP") == 0) { + get_hex(&addr); + addr = disassemble_loop(addr); + } +#ifdef MONITOR_HINTS + else if (strcmp(t, "LABELS") == 0) + configure_labels(&addr); +#endif + else if (strcmp(t, "ANTIC") == 0) + show_ANTIC(); + else if (strcmp(t, "PIA") == 0) + show_PIA(); + else if (strcmp(t, "GTIA") == 0) + show_GTIA(); + else if (strcmp(t, "POKEY") == 0) + show_POKEY(); +#ifdef MONITOR_ASSEMBLER + else if (strcmp(t, "A") == 0) { + get_hex(&addr); + addr = assembler(addr); + } +#endif + else if (strcmp(t, "HELP") == 0 || strcmp(t, "?") == 0) + show_help(); + else if (strcmp(t, "QUIT") == 0 || strcmp(t, "EXIT") == 0) { + PLUS_EXIT_MONITOR; + return FALSE; + } + else + printf("Invalid command!\n"); + } +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/monitor.h b/PVAtari800/atari800-src/monitor.h new file mode 100644 index 0000000000..fb84425110 --- /dev/null +++ b/PVAtari800/atari800-src/monitor.h @@ -0,0 +1,64 @@ +#ifndef MONITOR_H_ +#define MONITOR_H_ + +#include "config.h" +#include + +#include "atari.h" + +int MONITOR_Run(void); + +#ifdef MONITOR_TRACE +extern FILE *MONITOR_trace_file; +#endif + +#ifdef MONITOR_BREAK +extern UWORD MONITOR_break_addr; +extern UBYTE MONITOR_break_step; +extern UBYTE MONITOR_break_ret; +extern UBYTE MONITOR_break_brk; +extern int MONITOR_ret_nesting; +#endif + +extern const UBYTE MONITOR_optype6502[256]; + +void MONITOR_Exit(void); +void MONITOR_ShowState(FILE *fp, UWORD pc, UBYTE a, UBYTE x, UBYTE y, UBYTE s, + char n, char v, char z, char c); + +#ifdef MONITOR_BREAKPOINTS + +/* Breakpoint conditions */ + +#define MONITOR_BREAKPOINT_OR 1 +#define MONITOR_BREAKPOINT_FLAG_CLEAR 2 +#define MONITOR_BREAKPOINT_FLAG_SET 3 + +/* these three may be ORed together and must be ORed with MONITOR_BREAKPOINT_PC .. MONITOR_BREAKPOINT_WRITE */ +#define MONITOR_BREAKPOINT_LESS 1 +#define MONITOR_BREAKPOINT_EQUAL 2 +#define MONITOR_BREAKPOINT_GREATER 4 + +#define MONITOR_BREAKPOINT_PC 8 +#define MONITOR_BREAKPOINT_A 16 +#define MONITOR_BREAKPOINT_X 32 +#define MONITOR_BREAKPOINT_Y 40 +#define MONITOR_BREAKPOINT_S 48 +#define MONITOR_BREAKPOINT_READ 64 +#define MONITOR_BREAKPOINT_WRITE 128 +#define MONITOR_BREAKPOINT_ACCESS (MONITOR_BREAKPOINT_READ | MONITOR_BREAKPOINT_WRITE) + +typedef struct { + UBYTE enabled; + UBYTE condition; + UWORD value; +} MONITOR_breakpoint_cond; + +#define MONITOR_BREAKPOINT_TABLE_MAX 20 +extern MONITOR_breakpoint_cond MONITOR_breakpoint_table[MONITOR_BREAKPOINT_TABLE_MAX]; +extern int MONITOR_breakpoint_table_size; +extern int MONITOR_breakpoints_enabled; + +#endif /* MONITOR_BREAKPOINTS */ + +#endif /* MONITOR_H_ */ diff --git a/PVAtari800/atari800-src/mzpokeysnd.c b/PVAtari800/atari800-src/mzpokeysnd.c new file mode 100644 index 0000000000..38058532ac --- /dev/null +++ b/PVAtari800/atari800-src/mzpokeysnd.c @@ -0,0 +1,2553 @@ +/* + * mzpokeysnd.c - POKEY sound chip emulation, v1.6 + * + * Copyright (C) 2002 Michael Borisov + * Copyright (C) 2002-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include + +#ifdef ASAP /* external project, see http://asap.sf.net */ +#include "asap_internal.h" +#else +#include "atari.h" +#endif +#include "mzpokeysnd.h" +#include "pokeysnd.h" +#include "remez.h" +#include "antic.h" +#include "gtia.h" + +#define CONSOLE_VOL 8 +#ifdef NONLINEAR_MIXING +static const double pokeymix[61+CONSOLE_VOL] = { /* Nonlinear POKEY mixing array */ +0.000000, 5.169146, 10.157015, 15.166247, +20.073793, 24.927443, 29.728237, 34.495266, +39.181262, 43.839780, 48.429508, 52.932530, +57.327319, 61.586304, 65.673220, 69.547672, +73.207846, 76.594474, 79.739231, 82.631161, +85.300361, 87.750638, 90.020656, 92.108334, +94.051256, 95.848478, 97.521287, 99.080719, +100.540674, 101.902750, 103.185339, 104.375596, +105.491149, 106.523735, 107.473511, 108.361458, +109.185669, 109.962251, 110.685574, 111.367150, +112.008476, 112.612760, 113.185603, 113.722735, +114.227904, 114.712206, 115.171007, 115.605730, +116.024396, 116.416097, 116.803169, 117.155108, +117.532921, 117.835494, 118.196180, 118.502785, +118.825177, 119.138170, 119.421378, 119.734493, +/* need to add CONSOLE_VOL extra copies of the last val */ +120.000000,120.0,120.0,120.0,120.0,120.0,120.0,120.0,120.0}; +#endif + +#define SND_FILTER_SIZE 2048 + +#define NPOKEYS 2 + + +/* M_PI was not defined in MSVC headers */ +#ifndef M_PI +# define M_PI 3.141592653589793 +#endif + +static int num_cur_pokeys = 0; + +/* Filter */ +static int pokey_frq; /* Hz - for easier resampling */ +static int filter_size; +static double filter_data[SND_FILTER_SIZE]; +static int audible_frq; + +static const int pokey_frq_ideal = 1789790; /* Hz - True */ +#if 0 +static const int filter_size_44 = 1274; +static const int filter_size_44_8 = 884; +static const int filter_size_22 = 1239; +static const int filter_size_22_8 = 893; +static const int filter_size_11 = 1305; +static const int filter_size_11_8 = 937; +static const int filter_size_48 = 898; +static const int filter_size_48_8 = 626; +static const int filter_size_8 = 1322; +static const int filter_size_8_8 = 1214; +#endif + +/* Flags and quality */ +static int snd_quality = 0; + +/* Poly tables */ +static int poly4tbl[15]; +static int poly5tbl[31]; +static unsigned char poly17tbl[131071]; +static int poly9tbl[511]; + + +struct stPokeyState; + +typedef int (*readout_t)(struct stPokeyState* ps); +typedef void (*event_t)(struct stPokeyState* ps, int p5v, int p4v, int p917v); + +#ifdef NONLINEAR_MIXING +/* Change queue event value type */ +typedef double qev_t; +#else +typedef unsigned char qev_t; +#endif + +#ifdef SYNCHRONIZED_SOUND +static double ticks_per_sample; +static double samp_pos; +#endif /* SYNCHRONIZED_SOUND */ + +/* State variables for single Pokey Chip */ +typedef struct stPokeyState +{ + int curtick; + /* Poly positions */ + int poly4pos; + int poly5pos; + int poly17pos; + int poly9pos; + + /* Change queue */ + qev_t ovola; + int qet[1322]; /* maximal length of filter */ + qev_t qev[1322]; + int qebeg; + int qeend; + + /* Main divider (64khz/15khz) */ + int mdivk; /* 28 for 64khz, 114 for 15khz */ + + /* Main switches */ + int selpoly9; + int c0_hf; + int c1_f0; + int c2_hf; + int c3_f2; + + /* SKCTL for two-tone mode */ + int skctl; + + /* Main output state */ + qev_t outvol_all; + int forcero; /* Force readout */ + + /* channel 0 state */ + + readout_t readout_0; + event_t event_0; + + int c0divpos; + int c0divstart; /* AUDF0 recalculated */ + int c0divstart_p; /* start value when c1_f0 */ + int c0diva; /* AUDF0 register */ + + int c0t1; /* D - 5bit, Q goes to sw3 */ + int c0t2; /* D - out sw2, Q goes to sw4 and t3 */ + int c0t3; /* D - out t2, q goes to xor */ + + int c0sw1; /* in1 - 4bit, in2 - 17bit, out goes to sw2 */ + int c0sw2; /* in1 - /Q t2, in2 - out sw1, out goes to t2 */ + int c0sw3; /* in1 - +5, in2 - Q t1, out goes to C t2 */ + int c0sw4; /* hi-pass sw */ + int c0vo; /* volume only */ + +#ifndef NONLINEAR_MIXING + int c0stop; /* channel counter stopped */ +#endif + + int vol0; + + int outvol_0; + + /* channel 1 state */ + + readout_t readout_1; + event_t event_1; + + int c1divpos; + int c1divstart; + int c1diva; + + int c1t1; + int c1t2; + int c1t3; + + int c1sw1; + int c1sw2; + int c1sw3; + int c1sw4; + int c1vo; + +#ifndef NONLINEAR_MIXING + int c1stop; /* channel counter stopped */ +#endif + + int vol1; + + int outvol_1; + + /* channel 2 state */ + + readout_t readout_2; + event_t event_2; + + int c2divpos; + int c2divstart; + int c2divstart_p; /* start value when c1_f0 */ + int c2diva; + + int c2t1; + int c2t2; + + int c2sw1; + int c2sw2; + int c2sw3; + int c2vo; + +#ifndef NONLINEAR_MIXING + int c2stop; /* channel counter stopped */ +#endif + + int vol2; + + int outvol_2; + + /* channel 3 state */ + + readout_t readout_3; + event_t event_3; + + int c3divpos; + int c3divstart; + int c3diva; + + int c3t1; + int c3t2; + + int c3sw1; + int c3sw2; + int c3sw3; + int c3vo; + +#ifndef NONLINEAR_MIXING + int c3stop; /* channel counter stopped */ +#endif + + int vol3; + + int outvol_3; + + /* GTIA speaker */ + + int speaker; + +} PokeyState; + +PokeyState pokey_states[NPOKEYS]; + +/* Forward declarations for ResetPokeyState */ + +static int readout0_normal(PokeyState* ps); +static void event0_pure(PokeyState* ps, int p5v, int p4v, int p917v); + +static int readout1_normal(PokeyState* ps); +static void event1_pure(PokeyState* ps, int p5v, int p4v, int p917v); + +static int readout2_normal(PokeyState* ps); +static void event2_pure(PokeyState* ps, int p5v, int p4v, int p917v); + +static int readout3_normal(PokeyState* ps); +static void event3_pure(PokeyState* ps, int p5v, int p4v, int p917v); + +static void ResetPokeyState(PokeyState* ps) +{ + /* Poly positions */ + ps->poly4pos = 0; + ps->poly5pos = 0; + ps->poly9pos = 0; + ps->poly17pos = 0; + + /* Change queue */ + ps->ovola = 0; + ps->qebeg = 0; + ps->qeend = 0; + + /* Global Pokey controls */ + ps->mdivk = 28; + + ps->selpoly9 = 0; + ps->c0_hf = 0; + ps->c1_f0 = 0; + ps->c2_hf = 0; + ps->c3_f2 = 0; + + /* SKCTL for two-tone mode */ + ps->skctl = 0; + + ps->outvol_all = 0; + ps->forcero = 0; + + /* Channel 0 state */ + ps->readout_0 = readout0_normal; + ps->event_0 = event0_pure; + + ps->c0divpos = 1000; + ps->c0divstart = 1000; + ps->c0divstart_p = 1000; + ps->c0diva = 255; + + ps->c0t1 = 0; + ps->c0t2 = 0; + ps->c0t3 = 0; + + ps->c0sw1 = 0; + ps->c0sw2 = 0; + ps->c0sw3 = 0; + ps->c0sw4 = 0; + ps->c0vo = 1; + +#ifndef NONLINEAR_MIXING + ps->c0stop = 1; +#endif + + ps->vol0 = 0; + + ps->outvol_0 = 0; + + + /* Channel 1 state */ + ps->readout_1 = readout1_normal; + ps->event_1 = event1_pure; + + ps->c1divpos = 1000; + ps->c1divstart = 1000; + ps->c1diva = 255; + + ps->c1t1 = 0; + ps->c1t2 = 0; + ps->c1t3 = 0; + + ps->c1sw1 = 0; + ps->c1sw2 = 0; + ps->c1sw3 = 0; + ps->c1sw4 = 0; + ps->c1vo = 1; + +#ifndef NONLINEAR_MIXING + ps->c1stop = 1; +#endif + + ps->vol1 = 0; + + ps->outvol_1 = 0; + + /* Channel 2 state */ + ps->readout_2 = readout2_normal; + ps->event_2 = event2_pure; + + ps->c2divpos = 1000; + ps->c2divstart = 1000; + ps->c2divstart_p = 1000; + ps->c2diva = 255; + + ps->c2t1 = 0; + ps->c2t2 = 0; + + ps->c2sw1 = 0; + ps->c2sw2 = 0; + ps->c2sw3 = 0; + + ps->c2vo = 0; + +#ifndef NONLINEAR_MIXING + ps->c2stop = 1; +#endif + + ps->vol2 = 0; + + ps->outvol_2 = 0; + + /* Channel 3 state */ + ps->readout_3 = readout3_normal; + ps->event_3 = event3_pure; + + ps->c3divpos = 1000; + ps->c3divstart = 1000; + ps->c3diva = 255; + + ps->c3t1 = 0; + ps->c3t2 = 0; + + ps->c3sw1 = 0; + ps->c3sw2 = 0; + ps->c3sw3 = 0; + + ps->c3vo = 0; + +#ifndef NONLINEAR_MIXING + ps->c3stop = 1; +#endif + + ps->vol3 = 0; + + ps->outvol_3 = 0; + + /* GTIA speaker */ + ps->speaker = 0; +} + + +static double read_resam_all(PokeyState* ps) +{ + int i = ps->qebeg; + qev_t avol,bvol; + double sum; + + if(ps->qebeg == ps->qeend) + { + return ps->ovola * filter_data[0]; /* if no events in the queue */ + } + + avol = ps->ovola; + sum = 0; + + /* Separate two loop cases, for wrap-around and without */ + if(ps->qeend < ps->qebeg) /* With wrap */ + { + while(iqev[i]; + sum += (avol-bvol)*filter_data[ps->curtick - ps->qet[i]]; + avol = bvol; + ++i; + } + i=0; + } + + /* without wrap */ + while(iqeend) + { + bvol = ps->qev[i]; + sum += (avol-bvol)*filter_data[ps->curtick - ps->qet[i]]; + avol = bvol; + ++i; + } + + sum += avol*filter_data[0]; + return sum; +} + +#ifdef SYNCHRONIZED_SOUND +/* linear interpolation of filter data */ +static double interp_filter_data(int pos, double frac) +{ + if (pos+1 >= filter_size) { + return 0.0; + } + return (frac)*filter_data[pos+1]+(1-frac)*(filter_data[pos]-filter_data[filter_size-1]); +} + +/* returns the filtered output sample value using an interpolated filter */ +/* frac is the fractional distance of the output sample point between + * input sample values */ +static double interp_read_resam_all(PokeyState* ps, double frac) +{ + int i = ps->qebeg; + qev_t avol,bvol; + double sum; + + if (ps->qebeg == ps->qeend) + { + return ps->ovola * interp_filter_data(0,frac); /* if no events in the queue */ + } + + avol = ps->ovola; + sum = 0; + + /* Separate two loop cases, for wrap-around and without */ + if (ps->qeend < ps->qebeg) /* With wrap */ + { + while (i < filter_size) + { + bvol = ps->qev[i]; + sum += (avol-bvol)*interp_filter_data(ps->curtick - ps->qet[i],frac); + avol = bvol; + ++i; + } + i = 0; + } + + /* without wrap */ + while (i < ps->qeend) + { + bvol = ps->qev[i]; + sum += (avol-bvol)*interp_filter_data(ps->curtick - ps->qet[i],frac); + avol = bvol; + ++i; + } + + sum += avol*interp_filter_data(0,frac); + + return sum; +} +#endif /* SYNCHRONIZED_SOUND */ + +static void add_change(PokeyState* ps, qev_t a) +{ + ps->qev[ps->qeend] = a; + ps->qet[ps->qeend] = ps->curtick; /*0;*/ + ++ps->qeend; + if(ps->qeend >= filter_size) + ps->qeend = 0; +} + +static void bump_qe_subticks(PokeyState* ps, int subticks) +{ + /* Remove too old events from the queue while bumping */ + int i = ps->qebeg; + /* we must avoid curtick overflow in a 32-bit int, will happen in 20 min */ + static const int tickoverflowlimit = 1000000000; + ps->curtick += subticks; + if (ps->curtick > tickoverflowlimit) { + ps->curtick -= tickoverflowlimit/2; + for (i=0; iqet[i] > tickoverflowlimit/2) { + ps->qet[i] -= tickoverflowlimit/2; + } + } + } + + + if(ps->qeend < ps->qebeg) /* Loop with wrap */ + { + while(iqet[i] += subticks;*/ + if(ps->curtick - ps->qet[i] >= filter_size - 1) + { + ps->ovola = ps->qev[i]; + ++ps->qebeg; + if(ps->qebeg >= filter_size) + ps->qebeg = 0; + } + else { + return; + } + ++i; + } + i=0; + } + /* loop without wrap */ + while(iqeend) + { + /*ps->qet[i] += subticks;*/ + if(ps->curtick - ps->qet[i] >= filter_size - 1) + { + ps->ovola = ps->qev[i]; + ++ps->qebeg; + if(ps->qebeg >= filter_size) + ps->qebeg = 0; + } + else { + return; + } + ++i; + } +} + + + +static void build_poly4(void) +{ + unsigned char c; + unsigned char i; + unsigned char poly4=1; + + for(i=0; i<15; i++) + { + poly4tbl[i] = ~poly4; + c = ((poly4>>2)&1) ^ ((poly4>>3)&1); + poly4 = ((poly4<<1)&15) + c; + } +} + +static void build_poly5(void) +{ + unsigned char c; + unsigned char i; + unsigned char poly5 = 1; + + for(i = 0; i < 31; i++) { + poly5tbl[i] = ~poly5; /* Inversion! Attention! */ + c = ((poly5 >> 2) ^ (poly5 >> 4)) & 1; + poly5 = ((poly5 << 1) & 31) + c; + } +} + +static void build_poly17(void) +{ + unsigned int c; + unsigned int i; + unsigned int poly17 = 1; + + for(i = 0; i < 131071; i++) { + poly17tbl[i] = (unsigned char) poly17; + c = ((poly17 >> 11) ^ (poly17 >> 16)) & 1; + poly17 = ((poly17 << 1) & 131071) + c; + } +} + +static void build_poly9(void) +{ + unsigned int c; + unsigned int i; + unsigned int poly9 = 1; + + for(i = 0; i < 511; i++) { + poly9tbl[i] = (unsigned char) poly9; + c = ((poly9 >> 3) ^ (poly9 >> 8)) & 1; + poly9 = ((poly9 << 1) & 511) + c; + } +} + +static void advance_polies(PokeyState* ps, int tacts) +{ + ps->poly4pos = (tacts + ps->poly4pos) % 15; + ps->poly5pos = (tacts + ps->poly5pos) % 31; + ps->poly17pos = (tacts + ps->poly17pos) % 131071; + ps->poly9pos = (tacts + ps->poly9pos) % 511; +} + +/*********************************** + + READ OUTPUT 0 + + ************************************/ + +static int readout0_vo(PokeyState* ps) +{ + return ps->vol0; +} + +static int readout0_hipass(PokeyState* ps) +{ + if(ps->c0t2 ^ ps->c0t3) + return ps->vol0; + else return 0; +} + +static int readout0_normal(PokeyState* ps) +{ + if(ps->c0t2) + return ps->vol0; + else return 0; +} + +/*********************************** + + READ OUTPUT 1 + + ************************************/ + +static int readout1_vo(PokeyState* ps) +{ + return ps->vol1; +} + +static int readout1_hipass(PokeyState* ps) +{ + if(ps->c1t2 ^ ps->c1t3) + return ps->vol1; + else return 0; +} + +static int readout1_normal(PokeyState* ps) +{ + if(ps->c1t2) + return ps->vol1; + else return 0; +} + +/*********************************** + + READ OUTPUT 2 + + ************************************/ + +static int readout2_vo(PokeyState* ps) +{ + return ps->vol2; +} + +static int readout2_normal(PokeyState* ps) +{ + if(ps->c2t2) + return ps->vol2; + else return 0; +} + +/*********************************** + + READ OUTPUT 3 + + ************************************/ + +static int readout3_vo(PokeyState* ps) +{ + return ps->vol3; +} + +static int readout3_normal(PokeyState* ps) +{ + if(ps->c3t2) + return ps->vol3; + else return 0; +} + + +/*********************************** + + EVENT CHANNEL 0 + + ************************************/ + +static void event0_pure(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c0t2 = !ps->c0t2; + ps->c0t1 = p5v; +} + +static void event0_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c0t1) + ps->c0t2 = !ps->c0t2; + ps->c0t1 = p5v; +} + +static void event0_p4(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c0t2 = p4v; + ps->c0t1 = p5v; +} + +static void event0_p917(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c0t2 = p917v; + ps->c0t1 = p5v; +} + +static void event0_p4_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c0t1) + ps->c0t2 = p4v; + ps->c0t1 = p5v; +} + +static void event0_p917_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c0t1) + ps->c0t2 = p917v; + ps->c0t1 = p5v; +} + +/*********************************** + + EVENT CHANNEL 1 + + ************************************/ + +static void event1_pure(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c1t2 = !ps->c1t2; + ps->c1t1 = p5v; +} + +static void event1_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c1t1) + ps->c1t2 = !ps->c1t2; + ps->c1t1 = p5v; +} + +static void event1_p4(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c1t2 = p4v; + ps->c1t1 = p5v; +} + +static void event1_p917(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c1t2 = p917v; + ps->c1t1 = p5v; +} + +static void event1_p4_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c1t1) + ps->c1t2 = p4v; + ps->c1t1 = p5v; +} + +static void event1_p917_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c1t1) + ps->c1t2 = p917v; + ps->c1t1 = p5v; +} + +/*********************************** + + EVENT CHANNEL 2 + + ************************************/ + +static void event2_pure(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c2t2 = !ps->c2t2; + ps->c2t1 = p5v; + /* high-pass clock for channel 0 */ + ps->c0t3 = ps->c0t2; +} + +static void event2_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c2t1) + ps->c2t2 = !ps->c2t2; + ps->c2t1 = p5v; + /* high-pass clock for channel 0 */ + ps->c0t3 = ps->c0t2; +} + +static void event2_p4(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c2t2 = p4v; + ps->c2t1 = p5v; + /* high-pass clock for channel 0 */ + ps->c0t3 = ps->c0t2; +} + +static void event2_p917(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c2t2 = p917v; + ps->c2t1 = p5v; + /* high-pass clock for channel 0 */ + ps->c0t3 = ps->c0t2; +} + +static void event2_p4_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c2t1) + ps->c2t2 = p4v; + ps->c2t1 = p5v; + /* high-pass clock for channel 0 */ + ps->c0t3 = ps->c0t2; +} + +static void event2_p917_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c2t1) + ps->c2t2 = p917v; + ps->c2t1 = p5v; + /* high-pass clock for channel 0 */ + ps->c0t3 = ps->c0t2; +} + +/*********************************** + + EVENT CHANNEL 3 + + ************************************/ + +static void event3_pure(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c3t2 = !ps->c3t2; + ps->c3t1 = p5v; + /* high-pass clock for channel 1 */ + ps->c1t3 = ps->c1t2; +} + +static void event3_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c3t1) + ps->c3t2 = !ps->c3t2; + ps->c3t1 = p5v; + /* high-pass clock for channel 1 */ + ps->c1t3 = ps->c1t2; +} + +static void event3_p4(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c3t2 = p4v; + ps->c3t1 = p5v; + /* high-pass clock for channel 1 */ + ps->c1t3 = ps->c1t2; +} + +static void event3_p917(PokeyState* ps, int p5v, int p4v, int p917v) +{ + ps->c3t2 = p917v; + ps->c3t1 = p5v; + /* high-pass clock for channel 1 */ + ps->c1t3 = ps->c1t2; +} + +static void event3_p4_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c3t1) + ps->c3t2 = p4v; + ps->c3t1 = p5v; + /* high-pass clock for channel 1 */ + ps->c1t3 = ps->c1t2; +} + +static void event3_p917_p5(PokeyState* ps, int p5v, int p4v, int p917v) +{ + if(ps->c3t1) + ps->c3t2 = p917v; + ps->c3t1 = p5v; + /* high-pass clock for channel 1 */ + ps->c1t3 = ps->c1t2; +} + +static void advance_ticks(PokeyState* ps, int ticks) +{ + int ta,tbe, tbe0, tbe1, tbe2, tbe3; + int p5v,p4v,p917v; + + qev_t outvol_new; + int need0=0; + int need1=0; + int need2=0; + int need3=0; + + int need=0; + + if (ticks <= 0) return; + if(ps->forcero) + { + ps->forcero = 0; +#ifdef NONLINEAR_MIXING +#ifdef SYNCHRONIZED_SOUND + outvol_new = pokeymix[ps->outvol_0 + ps->outvol_1 + ps->outvol_2 + ps->outvol_3 + ps->speaker]; +#else + outvol_new = pokeymix[ps->outvol_0 + ps->outvol_1 + ps->outvol_2 + ps->outvol_3]; +#endif /* SYNCHRONIZED_SOUND */ +#else + outvol_new = ps->outvol_0 + ps->outvol_1 + ps->outvol_2 + ps->outvol_3; +#ifdef SYNCHRONIZED_SOUND + outvol_new += ps->speaker; +#endif /* SYNCHRONIZED_SOUND */ +#endif /* NONLINEAR_MIXING */ + if(outvol_new != ps->outvol_all) + { + ps->outvol_all = outvol_new; + add_change(ps, outvol_new); + } + } + + while(ticks>0) + { + tbe0 = ps->c0divpos; + tbe1 = ps->c1divpos; + tbe2 = ps->c2divpos; + tbe3 = ps->c3divpos; + + tbe = ticks+1; + +#ifdef NONLINEAR_MIXING + if(tbe0 < tbe) + tbe = tbe0; + if(tbe1 < tbe) + tbe = tbe1; + if(tbe2 < tbe) + tbe = tbe2; + if(tbe3 < tbe) + tbe = tbe3; +#else + if(!ps->c0stop && tbe0 < tbe) + tbe = tbe0; + if(!ps->c1stop && tbe1 < tbe) + tbe = tbe1; + if(!ps->c2stop && tbe2 < tbe) + tbe = tbe2; + if(!ps->c3stop && tbe3 < tbe) + tbe = tbe3; +#endif + + if(tbe>ticks) + ta = ticks; + else + { + ta = tbe; + need = 1; + } + + ticks -= ta; + +#ifdef NONLINEAR_MIXING + ps->c0divpos -= ta; + ps->c1divpos -= ta; + ps->c2divpos -= ta; + ps->c3divpos -= ta; +#else + if(!ps->c0stop) ps->c0divpos -= ta; + if(!ps->c1stop) ps->c1divpos -= ta; + if(!ps->c2stop) ps->c2divpos -= ta; + if(!ps->c3stop) ps->c3divpos -= ta; +#endif + + advance_polies(ps,ta); + bump_qe_subticks(ps,ta); + + if(need) + { + p5v = poly5tbl[ps->poly5pos] & 1; + p4v = poly4tbl[ps->poly4pos] & 1; + if(ps->selpoly9) + p917v = poly9tbl[ps->poly9pos] & 1; + else + p917v = poly17tbl[ps->poly17pos] & 1; + +#ifdef NONLINEAR_MIXING + if(ta == tbe0) +#else + if(!ps->c0stop && ta == tbe0) +#endif + { + ps->event_0(ps,p5v,p4v,p917v); + ps->c0divpos = ps->c0divstart; + need0 = 1; + } +#ifdef NONLINEAR_MIXING + if(ta == tbe1) +#else + if(!ps->c1stop && ta == tbe1) +#endif + { + ps->event_1(ps,p5v,p4v,p917v); + ps->c1divpos = ps->c1divstart; + if(ps->c1_f0) + ps->c0divpos = ps->c0divstart_p; + need1 = 1; + /*two-tone filter*/ + /*use if send break is on and two-tone mode is on*/ + /*reset channel 1 if channel 2 changed*/ + if((ps->skctl & 0x88) == 0x88) { + ps->c0divpos = ps->c0divstart; + /* it doesn't change the output state */ + /*need0 = 1;*/ + } + } +#ifdef NONLINEAR_MIXING + if(ta == tbe2) +#else + if(!ps->c2stop && ta == tbe2) +#endif + { + ps->event_2(ps,p5v,p4v,p917v); + ps->c2divpos = ps->c2divstart; + need2 = 1; + if(ps->c0sw4) + need0 = 1; + } +#ifdef NONLINEAR_MIXING + if(ta == tbe3) +#else + if(!ps->c3stop && ta == tbe3) +#endif + { + ps->event_3(ps,p5v,p4v,p917v); + ps->c3divpos = ps->c3divstart; + if(ps->c3_f2) + ps->c2divpos = ps->c2divstart_p; + need3 = 1; + if(ps->c1sw4) + need1 = 1; + } + + if(need0) + { +#ifdef NONLINEAR_MIXING + ps->outvol_0 = ps->readout_0(ps); +#else + ps->outvol_0 = 2*ps->readout_0(ps); +#endif + } + if(need1) + { +#ifdef NONLINEAR_MIXING + ps->outvol_1 = ps->readout_1(ps); +#else + ps->outvol_1 = 2*ps->readout_1(ps); +#endif + } + if(need2) + { +#ifdef NONLINEAR_MIXING + ps->outvol_2 = ps->readout_2(ps); +#else + ps->outvol_2 = 2*ps->readout_2(ps); +#endif + } + if(need3) + { +#ifdef NONLINEAR_MIXING + ps->outvol_3 = ps->readout_3(ps); +#else + ps->outvol_3 = 2*ps->readout_3(ps); +#endif + } + +#ifdef NONLINEAR_MIXING +#ifdef SYNCHRONIZED_SOUND + outvol_new = pokeymix[ps->outvol_0 + ps->outvol_1 + ps->outvol_2 + ps->outvol_3 + ps->speaker]; +#else + outvol_new = pokeymix[ps->outvol_0 + ps->outvol_1 + ps->outvol_2 + ps->outvol_3]; +#endif /* SYNCHRONIZED_SOUND */ +#else + outvol_new = ps->outvol_0 + ps->outvol_1 + ps->outvol_2 + ps->outvol_3; +#ifdef SYNCHRONIZED_SOUND + outvol_new += ps->speaker; +#endif /* SYNCHRONIZED_SOUND */ +#endif /* NONLINEAR_MIXING */ + if(outvol_new != ps->outvol_all) + { + ps->outvol_all = outvol_new; + add_change(ps, outvol_new); + } + } + } +} + +static double generate_sample(PokeyState* ps) +{ + /*unsigned long ta = (subticks+pokey_frq)/POKEYSND_playback_freq; + subticks = (subticks+pokey_frq)%POKEYSND_playback_freq;*/ + + advance_ticks(ps, pokey_frq/POKEYSND_playback_freq); + return read_resam_all(ps); +} + +/****************************************** + filter table generator by Krzysztof Nikiel + ******************************************/ + +static int remez_filter_table(double resamp_rate, /* output_rate/input_rate */ + double *cutoff, int quality) +{ + int i; + static const int orders[] = {600, 800, 1000, 1200}; + static const struct { + int stop; /* stopband ripple */ + double weight; /* stopband weight */ + double twidth[sizeof(orders)/sizeof(orders[0])]; + } paramtab[] = + { + {70, 90, {4.9e-3, 3.45e-3, 2.65e-3, 2.2e-3}}, + {55, 25, {3.4e-3, 2.7e-3, 2.05e-3, 1.7e-3}}, + {40, 6.0, {2.6e-3, 1.8e-3, 1.5e-3, 1.2e-3}}, + {-1, 0, {0, 0, 0, 0}} + }; + static const double passtab[] = {0.5, 0.6, 0.7}; + int ripple = 0, order = 0; + int size; + double weights[2], desired[2], bands[4]; + static const int interlevel = 5; + double step = 1.0 / interlevel; + + *cutoff = 0.95 * 0.5 * resamp_rate; + + if (quality >= (int) (sizeof(passtab) / sizeof(passtab[0]))) + quality = (int) (sizeof(passtab) / sizeof(passtab[0])) - 1; + + for (ripple = 0; paramtab[ripple].stop > 0; ripple++) + { + for (order = 0; order < (int) (sizeof(orders)/sizeof(orders[0])); order++) + { + if ((*cutoff - paramtab[ripple].twidth[order]) + > passtab[quality] * 0.5 * resamp_rate) + /* transition width OK */ + goto found; + } + } + + /* not found -- use shortest transition */ + ripple--; + order--; + +found: + +#if 0 + printf("order: %d, cutoff: %g\tstopband:%d\ttranswidth:%f\n", + orders[order], + 1789790 * *cutoff, + paramtab[ripple].stop, + 1789790 * paramtab[ripple].twidth[order]); + exit(1); +#endif + + size = orders[order] + 1; + + if (size > SND_FILTER_SIZE) /* static table too short */ + return 0; + + desired[0] = 1; + desired[1] = 0; + + weights[0] = 1; + weights[1] = paramtab[ripple].weight; + + bands[0] = 0; + bands[2] = *cutoff; + bands[1] = bands[2] - paramtab[ripple].twidth[order]; + bands[3] = 0.5; + + bands[1] *= (double)interlevel; + bands[2] *= (double)interlevel; + REMEZ_CreateFilter(filter_data, (size / interlevel) + 1, 2, bands, desired, weights, REMEZ_BANDPASS); + for (i = size - interlevel; i >= 0; i -= interlevel) + { + int s; + double h1 = filter_data[i/interlevel]; + double h2 = filter_data[i/interlevel+1]; + + for (s = 0; s < interlevel; s++) + { + double d = (double)s * step; + filter_data[i+s] = (h1*(1.0 - d) + h2 * d) * step; + } + } + + /* compute reversed cumulative sum table */ + for (i = size - 2; i >= 0; i--) + filter_data[i] += filter_data[i + 1]; + +#if 0 + for (i = 0; i < size; i++) + printf("%.15f,\n", filter_data[i]); + fflush(stdout); + exit(1); +#endif + + return size; +} + +static void mzpokeysnd_process_8(void* sndbuffer, int sndn); +static void mzpokeysnd_process_16(void* sndbuffer, int sndn); +static void Update_pokey_sound_mz(UWORD addr, UBYTE val, UBYTE chip, UBYTE gain); +#ifdef SERIO_SOUND +static void Update_serio_sound_mz(int out, UBYTE data); +#endif +#ifdef CONSOLE_SOUND +static void Update_consol_sound_mz( int set ); +#endif +#ifdef VOL_ONLY_SOUND +static void Update_vol_only_sound_mz( void ); +#endif + +/*****************************************************************************/ +/* Module: MZPOKEYSND_Init() */ +/* Purpose: to handle the power-up initialization functions */ +/* these functions should only be executed on a cold-restart */ +/* */ +/* Authors: Michael Borisov, Krzystof Nikiel */ +/* */ +/* Inputs: freq17 - the value for the '1.79MHz' Pokey audio clock */ +/* playback_freq - the playback frequency in samples per second */ +/* num_pokeys - specifies the number of pokey chips to be emulated */ +/* */ +/* Outputs: Adjusts local globals - no return value */ +/* */ +/*****************************************************************************/ + +#ifdef SYNCHRONIZED_SOUND +static void generate_sync(unsigned int num_ticks); + +static void init_syncsound(void) +{ + double samples_per_frame = (double)POKEYSND_playback_freq/(Atari800_tv_mode == Atari800_TV_PAL ? Atari800_FPS_PAL : Atari800_FPS_NTSC); + unsigned int ticks_per_frame = Atari800_tv_mode*114; + ticks_per_sample = (double)ticks_per_frame / samples_per_frame; + samp_pos = 0.0; + POKEYSND_GenerateSync = generate_sync; +} +#endif /* SYNCHRONIZED_SOUND */ + +int MZPOKEYSND_Init(ULONG freq17, int playback_freq, UBYTE num_pokeys, + int flags, int quality +#ifdef __PLUS + , int clear_regs +#endif + ) +{ + double cutoff; + + snd_quality = quality; + + POKEYSND_Update_ptr = Update_pokey_sound_mz; +#ifdef SERIO_SOUND + POKEYSND_UpdateSerio = Update_serio_sound_mz; +#endif +#ifdef CONSOLE_SOUND + POKEYSND_UpdateConsol_ptr = Update_consol_sound_mz; +#endif +#ifdef VOL_ONLY_SOUND + POKEYSND_UpdateVolOnly = Update_vol_only_sound_mz; +#endif + +#ifdef VOL_ONLY_SOUND + POKEYSND_samp_freq=playback_freq; +#endif /* VOL_ONLY_SOUND */ + + POKEYSND_Process_ptr = (flags & POKEYSND_BIT16) ? mzpokeysnd_process_16 : mzpokeysnd_process_8; + + switch(playback_freq) + { +#if 0 + case 44100: + if(flags & POKEYSND_BIT16) + { + filter_data = filter_44; + filter_size = filter_size_44; + } + else + { + filter_data = filter_44_8; + filter_size = filter_size_44_8; + } + pokey_frq = 1808100; /* 1.02% off ideal */ + audible_frq = 20000; /* ultrasound */ + break; + case 22050: + if(flags & POKEYSND_BIT16) + { + filter_data = filter_22; + filter_size = filter_size_22; + } + else + { + filter_data = filter_22_8; + filter_size = filter_size_22_8; + } + pokey_frq = 1786050; /* 0.2% off ideal */ + audible_frq = 10000; /* 30db filter attenuation */ + break; + case 11025: + if(flags & POKEYSND_BIT16) + { + filter_data = filter_11; + filter_size = filter_size_11; + } + else + { + filter_data = filter_11_8; + filter_size = filter_size_11_8; + } + pokey_frq = 1786050; /* 0.2% off ideal */ + audible_frq = 4500; /* 30db filter attenuation */ + break; + case 48000: + if(flags & POKEYSND_BIT16) + { + filter_data = filter_48; + filter_size = filter_size_48; + } + else + { + filter_data = filter_48_8; + filter_size = filter_size_48_8; + } + pokey_frq = 1776000; /* 0.7% off ideal */ + audible_frq = 20000; /* ultrasound */ + break; + case 8000: + if(flags & POKEYSND_BIT16) + { + filter_data = filter_8; + filter_size = filter_size_8; + } + else + { + filter_data = filter_8_8; + filter_size = filter_size_8_8; + } + pokey_frq = 1792000; /* 0.1% off ideal */ + audible_frq = 4000; /* Nyquist, also 30db attn, should be 50 */ + break; +#endif + default: + pokey_frq = (int)(((double)pokey_frq_ideal/POKEYSND_playback_freq) + 0.5) + * POKEYSND_playback_freq; + filter_size = remez_filter_table((double)POKEYSND_playback_freq/pokey_frq, + &cutoff, quality); + audible_frq = (int ) (cutoff * pokey_frq); + } + + build_poly4(); + build_poly5(); + build_poly9(); + build_poly17(); + +#ifdef __PLUS + if (clear_regs) +#endif + { + ResetPokeyState(pokey_states); + ResetPokeyState(pokey_states + 1); + } + num_cur_pokeys = num_pokeys; + +#ifdef SYNCHRONIZED_SOUND + init_syncsound(); +#endif + return 0; /* OK */ +} + + +static void Update_readout_0(PokeyState* ps) +{ + if(ps->c0vo) + ps->readout_0 = readout0_vo; + else if(ps->c0sw4) + ps->readout_0 = readout0_hipass; + else + ps->readout_0 = readout0_normal; +} + +static void Update_readout_1(PokeyState* ps) +{ + if(ps->c1vo) + ps->readout_1 = readout1_vo; + else if(ps->c1sw4) + ps->readout_1 = readout1_hipass; + else + ps->readout_1 = readout1_normal; +} + +static void Update_readout_2(PokeyState* ps) +{ + if(ps->c2vo) + ps->readout_2 = readout2_vo; + else + ps->readout_2 = readout2_normal; +} + +static void Update_readout_3(PokeyState* ps) +{ + if(ps->c3vo) + ps->readout_3 = readout3_vo; + else + ps->readout_3 = readout3_normal; +} + +static void Update_event0(PokeyState* ps) +{ + if(ps->c0sw3) + { + if(ps->c0sw2) + ps->event_0 = event0_pure; + else + { + if(ps->c0sw1) + ps->event_0 = event0_p4; + else + ps->event_0 = event0_p917; + } + } + else + { + if(ps->c0sw2) + ps->event_0 = event0_p5; + else + { + if(ps->c0sw1) + ps->event_0 = event0_p4_p5; + else + ps->event_0 = event0_p917_p5; + } + } +} + +static void Update_event1(PokeyState* ps) +{ + if(ps->c1sw3) + { + if(ps->c1sw2) + ps->event_1 = event1_pure; + else + { + if(ps->c1sw1) + ps->event_1 = event1_p4; + else + ps->event_1 = event1_p917; + } + } + else + { + if(ps->c1sw2) + ps->event_1 = event1_p5; + else + { + if(ps->c1sw1) + ps->event_1 = event1_p4_p5; + else + ps->event_1 = event1_p917_p5; + } + } +} + +static void Update_event2(PokeyState* ps) +{ + if(ps->c2sw3) + { + if(ps->c2sw2) + ps->event_2 = event2_pure; + else + { + if(ps->c2sw1) + ps->event_2 = event2_p4; + else + ps->event_2 = event2_p917; + } + } + else + { + if(ps->c2sw2) + ps->event_2 = event2_p5; + else + { + if(ps->c2sw1) + ps->event_2 = event2_p4_p5; + else + ps->event_2 = event2_p917_p5; + } + } +} + +static void Update_event3(PokeyState* ps) +{ + if(ps->c3sw3) + { + if(ps->c3sw2) + ps->event_3 = event3_pure; + else + { + if(ps->c3sw1) + ps->event_3 = event3_p4; + else + ps->event_3 = event3_p917; + } + } + else + { + if(ps->c3sw2) + ps->event_3 = event3_p5; + else + { + if(ps->c3sw1) + ps->event_3 = event3_p4_p5; + else + ps->event_3 = event3_p917_p5; + } + } +} + +static void Update_c0divstart(PokeyState* ps) +{ + if(ps->c1_f0) + { + if(ps->c0_hf) + { + ps->c0divstart = 256; + ps->c0divstart_p = ps->c0diva + 7; + } + else + { + ps->c0divstart = 256 * ps->mdivk; + ps->c0divstart_p = (ps->c0diva+1)*ps->mdivk; + } + } + else + { + if(ps->c0_hf) + ps->c0divstart = ps->c0diva + 4; + else + ps->c0divstart = (ps->c0diva+1) * ps->mdivk; + } +} + +static void Update_c1divstart(PokeyState* ps) +{ + if(ps->c1_f0) + { + if(ps->c0_hf) + ps->c1divstart = ps->c0diva + 256*ps->c1diva + 7; + else + ps->c1divstart = (ps->c0diva + 256*ps->c1diva + 1) * ps->mdivk; + } + else + ps->c1divstart = (ps->c1diva + 1) * ps->mdivk; +} + +static void Update_c2divstart(PokeyState* ps) +{ + if(ps->c3_f2) + { + if(ps->c2_hf) + { + ps->c2divstart = 256; + ps->c2divstart_p = ps->c2diva + 7; + } + else + { + ps->c2divstart = 256 * ps->mdivk; + ps->c2divstart_p = (ps->c2diva+1)*ps->mdivk; + } + } + else + { + if(ps->c2_hf) + ps->c2divstart = ps->c2diva + 4; + else + ps->c2divstart = (ps->c2diva+1) * ps->mdivk; + } +} + +static void Update_c3divstart(PokeyState* ps) +{ + if(ps->c3_f2) + { + if(ps->c2_hf) + ps->c3divstart = ps->c2diva + 256*ps->c3diva + 7; + else + ps->c3divstart = (ps->c2diva + 256*ps->c3diva + 1) * ps->mdivk; + } + else + ps->c3divstart = (ps->c3diva + 1) * ps->mdivk; +} + +static void Update_audctl(PokeyState* ps, unsigned char val) +{ + int nc0_hf,nc2_hf,nc1_f0,nc3_f2,nc0sw4,nc1sw4,new_divk; + int recalc0=0; + int recalc1=0; + int recalc2=0; + int recalc3=0; + + unsigned int cnt0 = 0; + unsigned int cnt1 = 0; + unsigned int cnt2 = 0; + unsigned int cnt3 = 0; + + nc0_hf = (val & 0x40) != 0; + nc2_hf = (val & 0x20) != 0; + nc1_f0 = (val & 0x10) != 0; + nc3_f2 = (val & 0x08) != 0; + nc0sw4 = (val & 0x04) != 0; + nc1sw4 = (val & 0x02) != 0; + if(val & 0x01) + new_divk = 114; + else + new_divk = 28; + + if(new_divk != ps->mdivk) + { + recalc0 = recalc1 = recalc2 = recalc3 = 1; + } + if(nc1_f0 != ps->c1_f0) + { + recalc0 = recalc1 = 1; + } + if(nc3_f2 != ps->c3_f2) + { + recalc2 = recalc3 = 1; + } + if(nc0_hf != ps->c0_hf) + { + recalc0 = 1; + if(nc1_f0) + recalc1 = 1; + } + if(nc2_hf != ps->c2_hf) + { + recalc2 = 1; + if(nc3_f2) + recalc3 = 1; + } + + if(recalc0) + { + if(ps->c0_hf) + cnt0 = ps->c0divpos; + else + cnt0 = ps->c0divpos/ps->mdivk; + } + if(recalc1) + { + if(ps->c1_f0) + { + if(ps->c0_hf) + cnt1 = ps->c1divpos/256; + else + cnt1 = ps->c1divpos/256/ps->mdivk; + } + else + { + cnt1 = ps->c1divpos/ps->mdivk; + } + } + if(recalc2) + { + if(ps->c2_hf) + cnt2 = ps->c2divpos; + else + cnt2 = ps->c2divpos/ps->mdivk; + } + if(recalc3) + { + if(ps->c3_f2) + { + if(ps->c2_hf) + cnt3 = ps->c3divpos/256; + else + cnt3 = ps->c3divpos/256/ps->mdivk; + } + } + + if(recalc0) + { + if(nc0_hf) + ps->c0divpos = cnt0; + else + ps->c0divpos = cnt0*new_divk; + } + if(recalc1) + { + if(nc1_f0) + { + if(nc0_hf) + ps->c1divpos = cnt1*256+cnt0; + else + ps->c1divpos = (cnt1*256+cnt0)*new_divk; + } + else + { + ps->c1divpos = cnt1*new_divk; + } + } + + if(recalc2) + { + if(nc2_hf) + ps->c2divpos = cnt2; + else + ps->c2divpos = cnt2*new_divk; + } + if(recalc3) + { + if(nc3_f2) + { + if(nc2_hf) + ps->c3divpos = cnt3*256+cnt2; + else + ps->c3divpos = (cnt3*256+cnt2)*new_divk; + } + } + + ps->c0_hf = nc0_hf; + ps->c2_hf = nc2_hf; + ps->c1_f0 = nc1_f0; + ps->c3_f2 = nc3_f2; + ps->c0sw4 = nc0sw4; + ps->c1sw4 = nc1sw4; + ps->mdivk = new_divk; +} + +/* SKCTL for two-tone mode */ +static void Update_skctl(PokeyState* ps, unsigned char val) +{ + ps->skctl = val; +} + +/* if using nonlinear mixing, don't stop ultrasounds */ +#ifdef NONLINEAR_MIXING +static void Update_c0stop(PokeyState* ps) +{ + ps->outvol_0 = ps->readout_0(ps); +} +static void Update_c1stop(PokeyState* ps) +{ + ps->outvol_1 = ps->readout_1(ps); +} +static void Update_c2stop(PokeyState* ps) +{ + ps->outvol_2 = ps->readout_2(ps); +} +static void Update_c3stop(PokeyState* ps) +{ + ps->outvol_3 = ps->readout_3(ps); +} +#else +static void Update_c0stop(PokeyState* ps) +{ + int lim = pokey_frq/2/audible_frq; + + int hfa = 0; + ps->c0stop = 0; + + if(ps->c0vo || ps->vol0 == 0) + ps->c0stop = 1; + else if(!ps->c0sw4 && ps->c0sw3 && ps->c0sw2) /* If channel 0 is a pure tone... */ + { + if(ps->c1_f0) + { + if(ps->c1divstart <= lim) + { + ps->c0stop = 1; + hfa = 1; + } + } + else + { + if(ps->c0divstart <= lim) + { + ps->c0stop = 1; + hfa = 1; + } + } + } + else if(!ps->c0sw4 && ps->c0sw3 && !ps->c0sw2 && ps->c0sw1) /* if channel 0 is poly4... */ + { + /* period for poly4 signal is 15 cycles */ + if(ps->c1_f0) + { + if(ps->c1divstart <= lim*2/15) /* all poly4 signal is above Nyquist */ + { + ps->c0stop = 1; + hfa = 1; + } + } + else + { + if(ps->c0divstart <= lim*2/15) + { + ps->c0stop = 1; + hfa = 1; + } + } + } + + ps->outvol_0 = 2*ps->readout_0(ps); + if(hfa) + ps->outvol_0 = ps->vol0; +} + +static void Update_c1stop(PokeyState* ps) +{ + int lim = pokey_frq/2/audible_frq; + + int hfa = 0; + ps->c1stop = 0; + + if(!ps->c1_f0 && (ps->c1vo || ps->vol1 == 0)) + ps->c1stop = 1; + else if(!ps->c1sw4 && ps->c1sw3 && ps->c1sw2 && ps->c1divstart <= lim) /* If channel 1 is a pure tone */ + { + ps->c1stop = 1; + hfa = 1; + } + else if(!ps->c1sw4 && ps->c1sw3 && !ps->c1sw2 && ps->c1sw1 && ps->c1divstart <= lim*2/15) /* all poly4 signal is above Nyquist */ + { + ps->c1stop = 1; + hfa = 1; + } + + ps->outvol_1 = 2*ps->readout_1(ps); + if(hfa) + ps->outvol_1 = ps->vol1; +} + +static void Update_c2stop(PokeyState* ps) +{ + int lim = pokey_frq/2/audible_frq; + + int hfa = 0; + ps->c2stop = 0; + + if(!ps->c0sw4 && (ps->c2vo || ps->vol2 == 0)) + ps->c2stop = 1; + /* If channel 2 is a pure tone and no filter for c0... */ + else if(ps->c2sw3 && ps->c2sw2 && !ps->c0sw4) + { + if(ps->c3_f2) + { + if(ps->c3divstart <= lim) + { + ps->c2stop = 1; + hfa = 1; + } + } + else + { + if(ps->c2divstart <= lim) + { + ps->c2stop = 1; + hfa = 1; + } + } + } + else if(ps->c2sw3 && !ps->c2sw2 && ps->c2sw1 && !ps->c0sw4) /* if channel 2 is poly4 and no filter for c0... */ + { + /* period for poly4 signal is 15 cycles */ + if(ps->c3_f2) + { + if(ps->c3divstart <= lim*2/15) /* all poly4 signal is above Nyquist */ + { + ps->c2stop = 1; + hfa = 1; + } + } + else + { + if(ps->c2divstart <= lim*2/15) + { + ps->c2stop = 1; + hfa = 1; + } + } + } + + ps->outvol_2 = 2*ps->readout_2(ps); + if(hfa) + ps->outvol_2 = ps->vol2; +} + +static void Update_c3stop(PokeyState* ps) +{ + int lim = pokey_frq/2/audible_frq; + int hfa = 0; + ps->c3stop = 0; + + if(!ps->c1sw4 && !ps->c3_f2 && (ps->c3vo || ps->vol3 == 0)) + ps->c3stop = 1; + /* If channel 3 is a pure tone */ + else if(ps->c3sw3 && ps->c3sw2 && !ps->c1sw4 && ps->c3divstart <= lim) + { + ps->c3stop = 1; + hfa = 1; + } + else if(ps->c3sw3 && !ps->c3sw2 && ps->c3sw1 && !ps->c1sw4 && ps->c3divstart <= lim*2/15) /* all poly4 signal is above Nyquist */ + { + ps->c3stop = 1; + hfa = 1; + } + + ps->outvol_3 = 2*ps->readout_3(ps); + if(hfa) + ps->outvol_3 = ps->vol3; +} +#endif /*NONLINEAR_MIXING*/ + +/*****************************************************************************/ +/* Function: Update_pokey_sound_mz() */ +/* */ +/* Inputs: addr - the address of the parameter to be changed */ +/* val - the new value to be placed in the specified address */ +/* chip - chip # for stereo */ +/* gain - specified as an 8-bit fixed point number - use 1 for no */ +/* amplification (output is multiplied by gain) */ +/* */ +/* Outputs: Adjusts local globals - no return value */ +/* */ +/*****************************************************************************/ +static void Update_pokey_sound_mz(UWORD addr, UBYTE val, UBYTE chip, UBYTE gain) +{ + PokeyState* ps = pokey_states+chip; + + switch(addr & 0x0f) + { + case POKEY_OFFSET_AUDF1: + ps->c0diva = val; + Update_c0divstart(ps); + if(ps->c1_f0) + { + Update_c1divstart(ps); + Update_c1stop(ps); + } + Update_c0stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDC1: + ps->c0sw1 = (val & 0x40) != 0; + ps->c0sw2 = (val & 0x20) != 0; + ps->c0sw3 = (val & 0x80) != 0; + ps->vol0 = (val & 0xF); + ps->c0vo = (val & 0x10) != 0; + Update_readout_0(ps); + Update_event0(ps); + Update_c0stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDF2: + ps->c1diva = val; + Update_c1divstart(ps); + if(ps->c1_f0) + { + Update_c0divstart(ps); + Update_c0stop(ps); + } + Update_c1stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDC2: + ps->c1sw1 = (val & 0x40) != 0; + ps->c1sw2 = (val & 0x20) != 0; + ps->c1sw3 = (val & 0x80) != 0; + ps->vol1 = (val & 0xF); + ps->c1vo = (val & 0x10) != 0; + Update_readout_1(ps); + Update_event1(ps); + Update_c1stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDF3: + ps->c2diva = val; + Update_c2divstart(ps); + if(ps->c3_f2) + { + Update_c3divstart(ps); + Update_c3stop(ps); + } + Update_c2stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDC3: + ps->c2sw1 = (val & 0x40) != 0; + ps->c2sw2 = (val & 0x20) != 0; + ps->c2sw3 = (val & 0x80) != 0; + ps->vol2 = (val & 0xF); + ps->c2vo = (val & 0x10) != 0; + Update_readout_2(ps); + Update_event2(ps); + Update_c2stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDF4: + ps->c3diva = val; + Update_c3divstart(ps); + if(ps->c3_f2) + { + Update_c2divstart(ps); + Update_c2stop(ps); + } + Update_c3stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDC4: + ps->c3sw1 = (val & 0x40) != 0; + ps->c3sw2 = (val & 0x20) != 0; + ps->c3sw3 = (val & 0x80) != 0; + ps->vol3 = val & 0xF; + ps->c3vo = (val & 0x10) != 0; + Update_readout_3(ps); + Update_event3(ps); + Update_c3stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_AUDCTL: + ps->selpoly9 = (val & 0x80) != 0; + Update_audctl(ps,val); + Update_readout_0(ps); + Update_readout_1(ps); + Update_readout_2(ps); + Update_readout_3(ps); + Update_c0divstart(ps); + Update_c1divstart(ps); + Update_c2divstart(ps); + Update_c3divstart(ps); + Update_c0stop(ps); + Update_c1stop(ps); + Update_c2stop(ps); + Update_c3stop(ps); + ps->forcero = 1; + break; + case POKEY_OFFSET_STIMER: + if(ps->c1_f0) + ps->c0divpos = ps->c0divstart_p; + else + ps->c0divpos = ps->c0divstart; + ps->c1divpos = ps->c1divstart; + if(ps->c3_f2) + ps->c2divpos = ps->c2divstart_p; + else + ps->c2divpos = ps->c2divstart; + + ps->c3divpos = ps->c3divstart; + /*Documentation is wrong about which voices are on after STIMER*/ + /*It is 3&4 which are on, tested on a real atari*/ + ps->c0t2 = 0; + ps->c1t2 = 0; + ps->c2t2 = 1; + ps->c3t2 = 1; + break; + case POKEY_OFFSET_SKCTL: + Update_skctl(ps,val); + break; + } +} + +#if 0 +void mzpokeysnd_debugreset(UBYTE chip) +{ + PokeyState* ps = pokey_states+chip; + + if(ps->c1_f0) + ps->c0divpos = ps->c0divstart_p; + else + ps->c0divpos = ps->c0divstart; + ps->c1divpos = ps->c1divstart; + if(ps->c3_f2) + ps->c2divpos = ps->c2divstart_p; + else + ps->c2divpos = ps->c2divstart; + ps->c3divpos = ps->c3divstart; + + ps->c0t2 = 1; + ps->c1t2 = 1; + ps->c2t2 = 1; + ps->c3t2 = 1; +} +#endif + +/************************************************************** + + Master gain and DC offset calculation + by Michael Borisov + + In order to use the available 8-bit or 16-bit dynamic range + to full extent, reducing the influence of quantization + noise while simultaneously avoiding overflows, gain + and DC offset should be set to appropriate value. + + All Pokey-generated sounds have maximal amplitude of 15. + When all four channels sound simultaneously and in the + same phase, amplidudes would add up to 60. + + If Pokey is generating a 'pure tone', it always has a DC + offset of half its amplitude. For other signals (produced + by poly generators) DC offset varies, but it is always near + to half amplitude and never exceeds this value. + + In case that pure tone base frequency is outside of audible + range (ultrasound frequency for high sample rates and above- + Nyquist frequency for low sample rates), to speed up the engine, + the generator is stopped while having only DC offset on the + output (half of corresponding AUDV value). In order that this + DC offset can be always represented as integer, AUDV values + are multiplied by 2 when the generator works. + + Therefore maximum integer value before resampling filters + would be 60*2 = 120 while having maximum DC offset of 60. + Resampling does not change the DC offset, therefore we may + subtract it from the signal either before or after resampling. + In mzpokeysnd, DC offset is subtracted after resampling, however + for better understanding in further measurements I assume + subtracting DC before. So, input range for the resampler + becomes [-60 .. 60]. + + Resampling filter removes some harmonics from the signal as if + the rectangular wave was Fourier transformed forth-and-back, + while zeroing all harmonics above cutoff frequency. In case + of high-frequency pure tone (above samplerate/8), only first + harmonic of the Fourier transofm will remain. As it + is known, Fourier-transform of the rectangular function of + amplitude 1 has first oscillation component of amplitude 4/M_PI. + Therefore, maximum sample values for filtered rectangular + signal may exceed the amplitude of rectangular signal + by up to 4/M_PI times. + + Since our range before resampler is -60 .. 60, taking into + account mentioned effect with band limiting, range of values + on the resampler output appears to be in the following bounds: + [-60*4/M_PI .. 60*4/M_PI] + + In order to map this into signed 8-bit range [-128 .. 127], we + should multiply the resampler output by 127/60/4*M_PI. + + As it is common for sound hardware to have 8-bit sound unsigned, + additional DC offset of 128 must be added. + + For 16-bit case the output range is [-32768 .. 32767], and + we should multiply the resampler output by 32767/60/4*M_PI + + To make some room for numerical errors, filter ripples and + quantization noise, so that they do not cause overflows in + quantization, dynamic range is reduced in mzpokeysnd by + multiplying the output amplitude with 0.95, reserving 5% + of the total range for such effects, which is about 0.51db. + + Mentioned gain and DC values were tested with 17kHz audio + playing synchronously on 4 channels, which showed to be + utilizing 95% of the sample values range. + + Since any other gain value will be not optimal, I removed + user gain setting and hard-coded the gain into mzpokeysnd + + --- + + A note from Piotr Fusik: + I've added support for the key click sound generated by GTIA. Its + volume seems to be pretty much like 8 on single POKEY's channel. + So, the volumes now can sum up to 136 (4 channels * 15 * 2 + + 8 * 2 for GTIA), not 120. + + A note from Mark Grebe: + I've added back in the console and sio sounds from the old + pokey version. So, now the volumes can sum up to 152 + (4 channesl * 15 * 2 + 8 * 4 for old sound), not 120 or 136. + + ******************************************************************/ + + +/****************************************************************** + + Quantization effects and dithering + by Michael Borisov + + Quantization error in the signal has an expectation value of half + the LSB, when the rounding is performed properly. Sometimes they + express quantization error as a random function with even + distribution over the range [-0.5 to 0.5]. Spectrum of this function + is flat, because it's a white noise. + + Power of a discrete signal (including noise) is calculated as + mean square of its samples. For the mentioned above noise + this is approximately 0.33. Therefore, in decibels for 8-bit case, + our noise will have power of 10*log10(0.33/256/256) = -53dB + + Because noise is white, this power of -53dB will be evenly + distributed over the whole signal band upto Nyquist frequency. + The larger the band is (higher sampling frequency), less + is the quantisation noise floor. For 8000Hz noise floor is + 10*log10(0.33/256/256/4000) = -89dB/Hz, and for 44100Hz noise + floor is 10*log10(0.33/256/256/22050) = -96.4dB/Hz. + This shows that higher sampling rates are better in sense of + quantization noise. Moreover, as large part of quantization noise + in case of 44100Hz will fall into ultrasound and hi-frequency + area 10-20kHz where human ear is less sensitive, this will + show up as great improvement in quantization noise performance + compared to 8000Hz. + + I was plotting spectral analysis for sounds produced by mzpokeysnd + to check these measures. And it showed up that in 8-bit case + there is no expected flat noise floor of -89db/Hz for 8000Hz, + but some distortion spectral peaks had higher amplitude than + the aliasing peaks in 16-bit case. This was a proof to another + statement which says that quantization noise tends to become + correlated with the signal. Correlation is especially strong + for simple signals generated by Pokey. Correlation means that + the noise power of -53db is no longer evenly distributed + across the whole frequency range, but concentrates in larger + peaks at locations which depend on the Pokey signal. + + To decorrelate quantization distortion and make it again + white noise, which would improve the sound spectrum, since + the maximum distortion peaks will have less amplitude, + dithering is used. Another white noise is added to the signal + before quantization. Since this added noise is not correlated + with the signal, it shows itself as a flat noise floor. + Quantization noise now tries to correlate with the dithering + noise, but this does not lead to appearance of sharp + spectral peaks any more :) + + Another thing is that for listening, white noise is better than + distortion. This is because human hearing has some 'noise + reduction' system which makes it easier to percept sounds + on the white noise background. + + From the other point of view, if a signal has high and low + spectral peaks, it is desirable that there is no distortion + component with peaks of amplitude comparable to those of + the true signal. Otherwise, perception of background low- + amplitude signals will be disrupted. That's why they say + that dithering extends dynamic range. + + Dithering does not eliminate correlation of quantization noise + completely. Degree of reduction of this effect depends on + the dithering noise power. The higher is dithering noise, + the more quantization noise is decorrelated. But this also + leads to increase of noise percepted by the listener. So, an + optimum value should be selected. My experiments show that + unbiased rand() noise of amplitude 0.25 LSB is doing well. + + Test spectral pictures for 8-bit sound, 8kHz sampling rate, + dithered, show a noise floor of approx. -87dB/Hz. + + ******************************************************************/ + +#define MAX_SAMPLE 152 + +static void mzpokeysnd_process_8(void* sndbuffer, int sndn) +{ + int i; + int nsam = sndn; + UBYTE *buffer = (UBYTE *) sndbuffer; + + if(num_cur_pokeys<1) + return; /* module was not initialized */ + + /* if there are two pokeys, then the signal is stereo + we assume even sndn */ + while(nsam >= (int) num_cur_pokeys) + { +#ifdef VOL_ONLY_SOUND + if( POKEYSND_sampbuf_rptr!=POKEYSND_sampbuf_ptr ) + { int l; + if( POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]>0 ) + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]-=1280; + while( (l=POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr])<=0 ) + { POKEYSND_sampout=POKEYSND_sampbuf_val[POKEYSND_sampbuf_rptr]; + POKEYSND_sampbuf_rptr++; + if( POKEYSND_sampbuf_rptr>=POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_rptr=0; + if( POKEYSND_sampbuf_rptr!=POKEYSND_sampbuf_ptr ) + { + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]+=l; + } + else break; + } + } +#endif + +#ifdef VOL_ONLY_SOUND + buffer[0] = (UBYTE)floor((generate_sample(pokey_states) + POKEYSND_sampout - MAX_SAMPLE / 2.0) + * (255.0 / MAX_SAMPLE / 4 * M_PI * 0.95) + 128 + 0.5 + 0.5 * rand() / RAND_MAX - 0.25); +#else + buffer[0] = (UBYTE)floor((generate_sample(pokey_states) - MAX_SAMPLE / 2.0) + * (255.0 / MAX_SAMPLE / 4 * M_PI * 0.95) + 128 + 0.5 + 0.5 * rand() / RAND_MAX - 0.25); +#endif + for(i=1; i= (int) num_cur_pokeys) + { +#ifdef VOL_ONLY_SOUND + if( POKEYSND_sampbuf_rptr!=POKEYSND_sampbuf_ptr ) + { int l; + if( POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]>0 ) + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]-=1280; + while( (l=POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr])<=0 ) + { POKEYSND_sampout=POKEYSND_sampbuf_val[POKEYSND_sampbuf_rptr]; + POKEYSND_sampbuf_rptr++; + if( POKEYSND_sampbuf_rptr>=POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_rptr=0; + if( POKEYSND_sampbuf_rptr!=POKEYSND_sampbuf_ptr ) + { + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]+=l; + } + else break; + } + } +#endif +#ifdef VOL_ONLY_SOUND + buffer[0] = (SWORD)floor((generate_sample(pokey_states) + POKEYSND_sampout - MAX_SAMPLE / 2.0) + * (65535.0 / MAX_SAMPLE / 4 * M_PI * 0.95) + 0.5 + 0.5 * rand() / RAND_MAX - 0.25); +#else + buffer[0] = (SWORD)floor((generate_sample(pokey_states) - MAX_SAMPLE / 2.0) + * (65535.0 / MAX_SAMPLE / 4 * M_PI * 0.95) + 0.5 + 0.5 * rand() / RAND_MAX - 0.25); +#endif + for(i=1; i num_ticks) { + samp_pos -= num_ticks; + break; + } + if (buffer >= buffer_end) + break; + + samp_pos = new_samp_pos; + num_ticks -= ticks; + + for (i = 0; i < num_cur_pokeys; ++i) { + /* advance pokey to the new position and produce a sample */ + advance_ticks(pokey_states + i, ticks); + if (POKEYSND_snd_flags & POKEYSND_BIT16) { + *((SWORD *)buffer) = (SWORD)floor( + (interp_read_resam_all(pokey_states + i, samp_pos) - MAX_SAMPLE / 2.0) + * (65535.0 / MAX_SAMPLE / 4 * M_PI * 0.95) + + 0.5 + 0.5 * rand() / RAND_MAX - 0.25 + ); + buffer += 2; + } + else + *buffer++ = (UBYTE)floor( + (interp_read_resam_all(pokey_states + i, samp_pos) - MAX_SAMPLE / 2.0) + * (255.0 / MAX_SAMPLE / 4 * M_PI * 0.95) + + 128 + 0.5 + 0.5 * rand() / RAND_MAX - 0.25 + ); + } + } + + POKEYSND_process_buffer_fill = buffer - POKEYSND_process_buffer; + if (num_ticks > 0) { + /* remaining ticks */ + for (i = 0; i < num_cur_pokeys; ++i) + advance_ticks(pokey_states + i, num_ticks); + } +} +#endif /* SYNCHRONIZED_SOUND */ + +#ifdef SERIO_SOUND +static void Update_serio_sound_mz( int out, UBYTE data ) +{ +#ifdef VOL_ONLY_SOUND + int bits,pv,future; + if (!POKEYSND_serio_sound_enabled) return; + + pv=0; + future=0; + bits= (data<<1) | 0x200; + while( bits ) + { + POKEYSND_sampbuf_lastval-=pv; + pv=(bits&0x01)*pokey_states[0].vol3; + POKEYSND_sampbuf_lastval+=pv; + + POKEYSND_sampbuf_val[POKEYSND_sampbuf_ptr]=POKEYSND_sampbuf_lastval; + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_ptr]= + (ANTIC_CPU_CLOCK+future-POKEYSND_sampbuf_last)*128*POKEYSND_samp_freq/178979; + POKEYSND_sampbuf_last=ANTIC_CPU_CLOCK+future; + POKEYSND_sampbuf_ptr++; + if( POKEYSND_sampbuf_ptr>=POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_ptr=0; + if( POKEYSND_sampbuf_ptr==POKEYSND_sampbuf_rptr ) + { POKEYSND_sampbuf_rptr++; + if( POKEYSND_sampbuf_rptr>=POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_rptr=0; + } + /* 1789790/19200 = 93 */ + future+=93; /* ~ 19200 bit/s - FIXME!!! set speed form AUDF [2] ??? */ + bits>>=1; + } + POKEYSND_sampbuf_lastval-=pv; +#endif /* VOL_ONLY_SOUND */ +} +#endif /* SERIO_SOUND */ + +#ifdef CONSOLE_SOUND +static void Update_consol_sound_mz( int set ) +{ +#ifdef SYNCHRONIZED_SOUND + if (set) { /* The set variable is 0 only in VOL_ONLY_SOUND routines */ + pokey_states[0].speaker = GTIA_speaker*CONSOLE_VOL; + pokey_states[0].forcero = 1; /* first chip */ + } +#elif defined(VOL_ONLY_SOUND) + static int prev_atari_speaker=0; + static unsigned int prev_cpu_clock=0; + int d; + + if( !set && POKEYSND_samp_consol_val==0 ) return; + POKEYSND_sampbuf_lastval-=POKEYSND_samp_consol_val; + if( prev_atari_speaker!=GTIA_speaker ) + { POKEYSND_samp_consol_val=GTIA_speaker*8*4; /* gain */ + prev_cpu_clock=ANTIC_CPU_CLOCK; + } + else if( !set ) + { d=ANTIC_CPU_CLOCK - prev_cpu_clock; + if( d<114 ) + { POKEYSND_sampbuf_lastval+=POKEYSND_samp_consol_val; return; } + while( d>=114 /* CPUL */ ) + { POKEYSND_samp_consol_val=POKEYSND_samp_consol_val*99/100; + d-=114; + } + prev_cpu_clock=ANTIC_CPU_CLOCK-d; + } + POKEYSND_sampbuf_lastval+=POKEYSND_samp_consol_val; + prev_atari_speaker=GTIA_speaker; + + POKEYSND_sampbuf_val[POKEYSND_sampbuf_ptr]=POKEYSND_sampbuf_lastval; + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_ptr]= + (ANTIC_CPU_CLOCK-POKEYSND_sampbuf_last)*128*POKEYSND_samp_freq/178979; + POKEYSND_sampbuf_last=ANTIC_CPU_CLOCK; + POKEYSND_sampbuf_ptr++; + if( POKEYSND_sampbuf_ptr>=POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_ptr=0; + if( POKEYSND_sampbuf_ptr==POKEYSND_sampbuf_rptr ) + { POKEYSND_sampbuf_rptr++; + if( POKEYSND_sampbuf_rptr>=POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_rptr=0; + } +#endif /* !SYNCHRONIZED_SOUND && VOL_ONLY_SOUND */ +} +#endif + +#ifdef VOL_ONLY_SOUND +static void Update_vol_only_sound_mz( void ) +{ +#ifdef CONSOLE_SOUND + POKEYSND_UpdateConsol(0); /* mmm */ +#endif /* CONSOLE_SOUND */ +} +#endif diff --git a/PVAtari800/atari800-src/mzpokeysnd.h b/PVAtari800/atari800-src/mzpokeysnd.h new file mode 100644 index 0000000000..ae49b3ce15 --- /dev/null +++ b/PVAtari800/atari800-src/mzpokeysnd.h @@ -0,0 +1,16 @@ +#ifndef MZPOKEYSND_H_ +#define MZPOKEYSND_H_ + +#include "atari.h" + +int MZPOKEYSND_Init(ULONG freq17, + int playback_freq, + UBYTE num_pokeys, + int flags, + int quality +#ifdef __PLUS + , int clear_regs +#endif + ); + +#endif /* MZPOKEYSND_H_ */ diff --git a/PVAtari800/atari800-src/pbi.c b/PVAtari800/atari800-src/pbi.c new file mode 100644 index 0000000000..2815bac449 --- /dev/null +++ b/PVAtari800/atari800-src/pbi.c @@ -0,0 +1,329 @@ +/* + * pbi.c - Parallel bus emulation + * + * Copyright (C) 2002 Jason Duerstock + * Copyright (C) 2007-2008 Perry McFarlane + * Copyright (C) 2002-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "pbi.h" +#include "memory.h" +#include "pia.h" +#include "cpu.h" +#include "log.h" +#include "util.h" +#include "statesav.h" +#include +#ifdef PBI_MIO +#include "pbi_mio.h" +#endif +#ifdef PBI_BB +#include "pbi_bb.h" +#endif +#ifdef PBI_XLD +#include "pbi_xld.h" +#endif +#ifdef PBI_PROTO80 +#include "pbi_proto80.h" +#endif +#ifdef AF80 +#include "af80.h" +#endif + +/* stores the current state of the D1FF register, real hardware has 1 + * bit per device, the bits are on the devices themselves */ +static UBYTE D1FF_LATCH = 0; + +/* 1400XL/1450XLD and 1090 have ram here */ +int PBI_D6D7ram = FALSE; + +/* So far as is currently implemented: PBI_IRQ can be generated by the 1400/1450 Votrax and the Black Box button */ +/* Each emulated PBI device will set a bit in this variable to indicate IRQ status */ +/* The actual hardware has only one common line. The device driver rom has to + * figure it out*/ +int PBI_IRQ = 0; + +#ifdef PBI_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +int PBI_Initialise(int *argc, char *argv[]) +{ + return TRUE +#ifdef PBI_XLD + && PBI_XLD_Initialise(argc, argv) +#endif +#ifdef PBI_BB + && PBI_BB_Initialise(argc, argv) +#endif +#ifdef PBI_MIO + && PBI_MIO_Initialise(argc, argv) +#endif +#ifdef PBI_PROTO80 + && PBI_PROTO80_Initialise(argc, argv) +#endif + ; +} + +void PBI_Exit(void) +{ +#ifdef PBI_PROTO80 + PBI_PROTO80_Exit(); +#endif +#ifdef PBI_MIO + PBI_MIO_Exit(); +#endif +#ifdef PBI_BB + PBI_BB_Exit(); +#endif +#ifdef PBI_XLD + PBI_XLD_Exit(); +#endif +} + +int PBI_ReadConfig(char *string, char *ptr) +{ + if (0) { + } +#ifdef PBI_XLD + else if (PBI_XLD_ReadConfig(string, ptr)) { + } +#endif +#ifdef PBI_MIO + else if (PBI_MIO_ReadConfig(string, ptr)) { + } +#endif +#ifdef PBI_BB + else if (PBI_BB_ReadConfig(string, ptr)) { + } +#endif +#ifdef PBI_PROTO80 + else if (PBI_PROTO80_ReadConfig(string, ptr)) { + } +#endif + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void PBI_WriteConfig(FILE *fp) +{ +#ifdef PBI_MIO + PBI_MIO_WriteConfig(fp); +#endif +#ifdef PBI_BB + PBI_BB_WriteConfig(fp); +#endif +#ifdef PBI_XLD + PBI_XLD_WriteConfig(fp); +#endif +#ifdef PBI_PROTO80 + PBI_PROTO80_WriteConfig(fp); +#endif +} + +void PBI_Reset(void) +{ + /* Reset all PBI ROMs */ + PBI_D1PutByte(0xd1ff, 0); +#ifdef PBI_XLD + if (PBI_XLD_enabled) PBI_XLD_Reset(); +#endif + PBI_IRQ = 0; +} + +UBYTE PBI_D1GetByte(UWORD addr, int no_side_effects) +{ + int result = 0xff; + /* MIO and BB do not follow the spec, they take over the bus: */ +#ifdef PBI_MIO + if (PBI_MIO_enabled) return PBI_MIO_D1GetByte(addr, no_side_effects); +#endif +#ifdef PBI_BB + if (PBI_BB_enabled) return PBI_BB_D1GetByte(addr, no_side_effects); +#endif + /* Remaining PBI devices cooperate, following spec */ +#ifdef PBI_XLD + if (PBI_XLD_enabled && !no_side_effects) result = PBI_XLD_D1GetByte(addr); +#endif +#ifdef PBI_PROTO80 + if (result == PBI_NOT_HANDLED && PBI_PROTO80_enabled) result = PBI_PROTO80_D1GetByte(addr, no_side_effects); +#endif + if(result != PBI_NOT_HANDLED) return (UBYTE)result; + /* Each bit of D1FF is set by one of the 8 PBI devices to signal IRQ */ + /* The XLD devices have been combined into a single handler */ + if (addr == 0xd1ff) { + /* D1FF IRQ status: */ + result = 0; +#ifdef PBI_XLD + if (PBI_XLD_enabled && !no_side_effects) result |= PBI_XLD_D1ffGetByte(); +#endif + /* add more devices here... */ + return result; + } + /* addr was not handled: */ + D(printf("PBI_GetByte:%4x:%2x PC:%4x IRQ:%d\n",addr,result,CPU_regPC,CPU_IRQ)); + return result; /* 0xff */ +} + +void PBI_D1PutByte(UWORD addr, UBYTE byte) +{ + static int fp_active = TRUE; +#ifdef PBI_MIO + if (PBI_MIO_enabled) { + PBI_MIO_D1PutByte(addr, byte); + return; + } +#endif +#ifdef PBI_BB + if (PBI_BB_enabled) { + PBI_BB_D1PutByte(addr, byte); + return; + } +#endif + /* Remaining PBI devices cooperate, following spec */ + if (addr != 0xd1ff) { + D(printf("PBI_PutByte:%4x <- %2x\n", addr, byte)); +#ifdef PBI_XLD + if (PBI_XLD_enabled) PBI_XLD_D1PutByte(addr, byte); +#endif +#ifdef PBI_PROTO_80 + if (PBI_PROTO80_enabled) PBI_PROTO80_D1PutByte(addr, byte); +#endif + /* add more devices here... */ + } + else if (addr == 0xd1ff) { + /* D1FF pbi rom bank select */ + D(printf("D1FF write:%x\n", byte)); + if (D1FF_LATCH != byte) { + /* if it's not valid, ignore it */ + if (byte != 0 && byte != 1 && byte != 2 && byte != 4 && byte != 8 && byte != 0x10 && byte !=0x20 && byte != 0x40 && byte != 0x80){ + D(printf("*****INVALID d1ff write:%2x********\n",byte)); + return; + } + /* otherwise, update the latch */ + D1FF_LATCH = byte; +#ifdef PBI_XLD + if (PBI_XLD_enabled && PBI_XLD_D1ffPutByte(byte) != PBI_NOT_HANDLED) { + /* handled */ + fp_active = FALSE; + return; + } +#endif +#ifdef PBI_PROTO80 + if (PBI_PROTO80_enabled && PBI_PROTO80_D1ffPutByte(byte) != PBI_NOT_HANDLED) { + /* handled */ + fp_active = FALSE; + return; + } +#endif + /* add more devices here... */ + /* reactivate the floating point rom */ + if (!fp_active) { + memcpy(MEMORY_mem + 0xd800, MEMORY_os + 0x1800, 0x800); + D(printf("Floating point rom activated\n")); + fp_active = TRUE; + } + } + } +} + +/* $D6xx */ +UBYTE PBI_D6GetByte(UWORD addr, int no_side_effects) +{ +#ifdef AF80 + if (AF80_enabled) return AF80_D6GetByte(addr, no_side_effects); +#endif +#ifdef PBI_MIO + if (PBI_MIO_enabled) return PBI_MIO_D6GetByte(addr, no_side_effects); +#endif +#ifdef PBI_BB + if(PBI_BB_enabled) return PBI_BB_D6GetByte(addr, no_side_effects); +#endif + /* XLD/1090 has ram here */ + if (PBI_D6D7ram) return MEMORY_mem[addr]; + else return 0xff; +} + +/* $D6xx */ +void PBI_D6PutByte(UWORD addr, UBYTE byte) +{ +#ifdef AF80 + if (AF80_enabled) { + AF80_D6PutByte(addr,byte); + return; + } +#endif +#ifdef PBI_MIO + if (PBI_MIO_enabled) { + PBI_MIO_D6PutByte(addr,byte); + return; + } +#endif +#ifdef PBI_BB + if(PBI_BB_enabled) { + PBI_BB_D6PutByte(addr,byte); + return; + } +#endif + /* XLD/1090 has ram here */ + if (PBI_D6D7ram) MEMORY_mem[addr]=byte; +} + +/* read page $D7xx */ +/* XLD/1090 has ram here */ +UBYTE PBI_D7GetByte(UWORD addr, int no_side_effects) +{ + D(printf("PBI_D7GetByte:%4x\n",addr)); + if (PBI_D6D7ram) return MEMORY_mem[addr]; + else return 0xff; +} + +/* write page $D7xx */ +/* XLD/1090 has ram here */ +void PBI_D7PutByte(UWORD addr, UBYTE byte) +{ + D(printf("PBI_D7PutByte:%4x <- %2x\n",addr,byte)); + if (PBI_D6D7ram) MEMORY_mem[addr]=byte; +} + +#ifndef BASIC + +void PBI_StateSave(void) +{ + StateSav_SaveUBYTE(&D1FF_LATCH, 1); + StateSav_SaveINT(&PBI_D6D7ram, 1); + StateSav_SaveINT(&PBI_IRQ, 1); +} + +void PBI_StateRead(void) +{ + StateSav_ReadUBYTE(&D1FF_LATCH, 1); + StateSav_ReadINT(&PBI_D6D7ram, 1); + StateSav_ReadINT(&PBI_IRQ, 1); +} + +#endif /* #ifndef BASIC */ + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/pbi.h b/PVAtari800/atari800-src/pbi.h new file mode 100644 index 0000000000..d473d9e9bc --- /dev/null +++ b/PVAtari800/atari800-src/pbi.h @@ -0,0 +1,24 @@ +#ifndef PBI_H_ +#define PBI_H_ + +#include "atari.h" +#include + +int PBI_Initialise(int *argc, char *argv[]); +void PBI_Exit(void); +int PBI_ReadConfig(char *string, char *ptr); +void PBI_WriteConfig(FILE *fp); +void PBI_Reset(void); +UBYTE PBI_D1GetByte(UWORD addr, int no_side_effects); +void PBI_D1PutByte(UWORD addr, UBYTE byte); +UBYTE PBI_D6GetByte(UWORD addr, int no_side_effects); +void PBI_D6PutByte(UWORD addr, UBYTE byte); +UBYTE PBI_D7GetByte(UWORD addr, int no_side_effects); +void PBI_D7PutByte(UWORD addr, UBYTE byte); +extern int PBI_IRQ; +extern int PBI_D6D7ram; +void PBI_StateSave(void); +void PBI_StateRead(void); +#define PBI_NOT_HANDLED -1 +/* #define PBI_DEBUG */ +#endif /* PBI_H_ */ diff --git a/PVAtari800/atari800-src/pbi_bb.c b/PVAtari800/atari800-src/pbi_bb.c new file mode 100755 index 0000000000..22ac61c132 --- /dev/null +++ b/PVAtari800/atari800-src/pbi_bb.c @@ -0,0 +1,328 @@ +/* + * pbi_bb.c - CSS Black Box emulation + * + * Copyright (C) 2007-2008 Perry McFarlane + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "pbi_bb.h" +#include "util.h" +#include "log.h" +#include "pbi.h" +#include "memory.h" +#include "pia.h" +#include "pokey.h" +#include "cpu.h" +#include "pbi_scsi.h" +#include "statesav.h" +#include "util.h" +#include + +#ifdef PBI_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +/* CSS Black Box emulation */ +/* information source: http://www.mathyvannisselroy.nl/bbdoku.txt*/ +#define BB_BUTTON_IRQ_MASK 1 + +int PBI_BB_enabled = FALSE; + +static UBYTE *bb_rom; +static int bb_ram_bank_offset = 0; +static UBYTE *bb_ram; +#define BB_RAM_SIZE 0x10000 +static UBYTE bb_rom_bank = 0; +static int bb_rom_size; +static int bb_rom_high_bit = 0x00;/*0x10*/ +static char bb_rom_filename[FILENAME_MAX]; +static UBYTE bb_PCR = 0; /* VIA Peripheral control register*/ +static int bb_scsi_enabled = FALSE; +static char bb_scsi_disk_filename[FILENAME_MAX] = Util_FILENAME_NOT_SET; + +static void init_bb(void) +{ + FILE *bbfp; + bbfp = fopen(bb_rom_filename,"rb"); + bb_rom_size = Util_flen(bbfp); + fclose(bbfp); + if (bb_rom_size != 0x10000 && bb_rom_size != 0x4000) { + Log_print("Invalid black box rom size\n"); + return; + } + free(bb_rom); + bb_rom = (UBYTE *)Util_malloc(bb_rom_size); + if (!Atari800_LoadImage(bb_rom_filename, bb_rom, bb_rom_size)) { + free(bb_rom); + bb_rom = NULL; + return; + } + D(printf("loaded black box rom image\n")); + PBI_BB_enabled = TRUE; + if (PBI_SCSI_disk != NULL) fclose(PBI_SCSI_disk); + if (!Util_filenamenotset(bb_scsi_disk_filename)) { + PBI_SCSI_disk = fopen(bb_scsi_disk_filename, "rb+"); + if (PBI_SCSI_disk == NULL) { + Log_print("Error opening BB SCSI disk image:%s", bb_scsi_disk_filename); + } + else { + D(printf("Opened BB SCSI disk image\n")); + bb_scsi_enabled = TRUE; + } + } + if (!bb_scsi_enabled) { + PBI_SCSI_BSY = TRUE; /* makes BB give up easier? */ + } + free(bb_ram); + bb_ram = (UBYTE *)Util_malloc(BB_RAM_SIZE); + memset(bb_ram,0,BB_RAM_SIZE); +} + +int PBI_BB_Initialise(int *argc, char *argv[]) +{ + int i, j; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-bb") == 0) { + init_bb(); + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-bb Emulate the CSS Black Box"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + return TRUE; +} + +void PBI_BB_Exit(void) +{ + if (PBI_SCSI_disk != NULL) { + fclose(PBI_SCSI_disk); + PBI_SCSI_disk = NULL; + } + free(bb_ram); + free(bb_rom); + bb_rom = bb_ram = NULL; +} + +int PBI_BB_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "BLACK_BOX_ROM") == 0) + Util_strlcpy(bb_rom_filename, ptr, sizeof(bb_rom_filename)); + else if (strcmp(string, "BB_SCSI_DISK") == 0) + Util_strlcpy(bb_scsi_disk_filename, ptr, sizeof(bb_scsi_disk_filename)); + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void PBI_BB_WriteConfig(FILE *fp) +{ + fprintf(fp, "BLACK_BOX_ROM=%s\n", bb_rom_filename); + if (!Util_filenamenotset(bb_scsi_disk_filename)) { + fprintf(fp, "BB_SCSI_DISK=%s\n", bb_scsi_disk_filename); + } +} + +UBYTE PBI_BB_D1GetByte(UWORD addr, int no_side_effects) +{ + UBYTE result = 0x00;/*ff;*/ + if (addr == 0xd1be) result = 0xff; + else if (addr == 0xd170) { + /* status */ + result = ((!(PBI_SCSI_REQ))<<7)|((!PBI_SCSI_BSY)<<6)|((!PBI_SCSI_SEL)<<2)|((!PBI_SCSI_CD)<<1)|(!PBI_SCSI_IO); + } + else if (addr == 0xd171) { + if (bb_scsi_enabled) { + result = PBI_SCSI_GetByte(); + if (!no_side_effects && ((bb_PCR & 0x0e)>>1) == 0x04) { + /* handshake output */ + PBI_SCSI_PutACK(1); + PBI_SCSI_PutACK(0); + } + } + } + else if (addr == 0xd1bc) result = (bb_ram_bank_offset >> 8);/*RAMPAGE*/ + else if (addr == 0xd1be) { + /* SWITCH */ + result = 0x02; + } + else if (addr == 0xd1ff) result = PBI_IRQ ? (0x08 | 0x02) : 0 ; + D(if (addr!=0xd1ff) printf("BB Read:%4x PC:%4x byte=%2x\n", addr, CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS], result)); + return result; +} + +void PBI_BB_D1PutByte(UWORD addr, UBYTE byte) +{ + D(printf("BB Write addr:%4x byte:%2x, cpu:%4x\n", addr, byte, CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + if (addr == 0xd170) { + if (bb_scsi_enabled) PBI_SCSI_PutSEL(!(byte&0x04)); + } + else if (addr == 0xd171) { + if (bb_scsi_enabled) { + PBI_SCSI_PutByte(byte); + if (((bb_PCR & 0x0e)>>1) == 0x04) { + /* handshake output */ + PBI_SCSI_PutACK(1); + PBI_SCSI_PutACK(0); + } + } + } + else if (addr == 0xd17c) { /* PCR */ + bb_PCR = byte; + if (((bb_PCR & 0x0e)>>1) == 0x06) { + /* low output */ + if (bb_scsi_enabled) PBI_SCSI_PutACK(1); + } + else if (((bb_PCR & 0x0e)>>1) == 0x07) { + /* high output */ + if (bb_scsi_enabled) PBI_SCSI_PutACK(0); + } + } + else if (addr == 0xd1bc) { + /* RAMPAGE */ + /* Copy old page to buffer, Copy new page from buffer */ + memcpy(bb_ram+bb_ram_bank_offset,MEMORY_mem + 0xd600,0x100); + bb_ram_bank_offset = (byte << 8); + memcpy(MEMORY_mem + 0xd600, bb_ram+bb_ram_bank_offset, 0x100); + } + else if (addr == 0xd1be) { + /* high rom bit */ + if (bb_rom_high_bit != ((byte & 0x04) << 2) && bb_rom_size == 0x10000) { + /* high bit has changed */ + bb_rom_high_bit = ((byte & 0x04) << 2); + if (bb_rom_bank > 0 && bb_rom_bank < 8) { + memcpy(MEMORY_mem + 0xd800, bb_rom + (bb_rom_bank + bb_rom_high_bit)*0x800, 0x800); + D(printf("black box bank:%2x activated\n", bb_rom_bank+bb_rom_high_bit)); + } + } + } + else if ((addr & 0xffc0) == 0xd1c0) { + /* byte &= 0x0f; */ + if (bb_rom_bank != byte) { + /* PDVS (d1ff) rom bank */ + int offset = -1; + if (bb_rom_size == 0x4000) { + if (byte >= 8 && byte <= 0x0f) offset = (byte - 8)*0x800; + else if (byte > 0 && byte < 0x08) offset = byte*0x800; + } + else { /* bb_rom_size == 0x10000 */ + if (byte > 0 && byte < 0x10) offset = (byte + bb_rom_high_bit)*0x800; + } + + if (offset != -1) { + memcpy(MEMORY_mem + 0xd800, bb_rom + offset, 0x800); + D(printf("black box bank:%2x activated\n", byte + bb_rom_high_bit)); + } + else { + memcpy(MEMORY_mem + 0xd800, MEMORY_os + 0x1800, 0x800); + if (byte != 0) D(printf("d1ff ERROR: byte=%2x\n", byte)); + D(printf("Floating point rom activated\n")); + } + bb_rom_bank = byte; + } + } +} + +/* Black Box RAM page at D600-D6ff*/ +/* Possible to put code in this ram, so we can't avoid using MEMORY_mem[] + * because opcode fetch doesn't call this function*/ +UBYTE PBI_BB_D6GetByte(UWORD addr, int no_side_effects) +{ + return MEMORY_mem[addr]; +} + +/* $D6xx */ +void PBI_BB_D6PutByte(UWORD addr, UBYTE byte) +{ + MEMORY_mem[addr]=byte; +} + +static int buttondown; + +void PBI_BB_Menu(void) +{ + if (!PBI_BB_enabled) return; + if (buttondown == FALSE) { + D(printf("blackbox button down interrupt generated\n")); + CPU_GenerateIRQ(); + PBI_IRQ |= BB_BUTTON_IRQ_MASK; + buttondown = TRUE; + } +} + +void PBI_BB_Frame(void) +{ + static int count = 0; + if (buttondown) { + if (count < 1) count++; + else { + D(printf("blackbox button up\n")); + PBI_IRQ &= ~BB_BUTTON_IRQ_MASK; + /* update pokey IRQ status */ + POKEY_PutByte(POKEY_OFFSET_IRQEN, POKEY_IRQEN); + buttondown = FALSE; + count = 0; + } + } +} + +#ifndef BASIC + +void PBI_BB_StateSave(void) +{ + StateSav_SaveINT(&PBI_BB_enabled, 1); + if (PBI_BB_enabled) { + StateSav_SaveFNAME(bb_scsi_disk_filename); + StateSav_SaveFNAME(bb_rom_filename); + + StateSav_SaveINT(&bb_ram_bank_offset, 1); + StateSav_SaveUBYTE(bb_ram, BB_RAM_SIZE); + StateSav_SaveUBYTE(&bb_rom_bank, 1); + StateSav_SaveINT(&bb_rom_high_bit, 1); + StateSav_SaveUBYTE(&bb_PCR, 1); + } +} + +void PBI_BB_StateRead(void) +{ + StateSav_ReadINT(&PBI_BB_enabled, 1); + if (PBI_BB_enabled) { + StateSav_ReadFNAME(bb_scsi_disk_filename); + StateSav_ReadFNAME(bb_rom_filename); + init_bb(); + StateSav_ReadINT(&bb_ram_bank_offset, 1); + StateSav_ReadUBYTE(bb_ram, BB_RAM_SIZE); + StateSav_ReadUBYTE(&bb_rom_bank, 1); + StateSav_ReadINT(&bb_rom_high_bit, 1); + StateSav_ReadUBYTE(&bb_PCR, 1); + } +} + +#endif /* #ifndef BASIC */ + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/pbi_bb.h b/PVAtari800/atari800-src/pbi_bb.h new file mode 100755 index 0000000000..40557a2624 --- /dev/null +++ b/PVAtari800/atari800-src/pbi_bb.h @@ -0,0 +1,21 @@ +#ifndef PBI_BB_H_ +#define PBI_BB_H_ + +#include "atari.h" +#include + +extern int PBI_BB_enabled; +void PBI_BB_Menu(void); +void PBI_BB_Frame(void); +int PBI_BB_Initialise(int *argc, char *argv[]); +void PBI_BB_Exit(void); +UBYTE PBI_BB_D1GetByte(UWORD addr, int no_side_effects); +void PBI_BB_D1PutByte(UWORD addr, UBYTE byte); +UBYTE PBI_BB_D6GetByte(UWORD addr, int no_side_effects); +void PBI_BB_D6PutByte(UWORD addr, UBYTE byte); +int PBI_BB_ReadConfig(char *string, char *ptr); +void PBI_BB_WriteConfig(FILE *fp); +void PBI_BB_StateSave(void); +void PBI_BB_StateRead(void); + +#endif /* PBI_BB_H_ */ diff --git a/PVAtari800/atari800-src/pbi_mio.c b/PVAtari800/atari800-src/pbi_mio.c new file mode 100755 index 0000000000..41dc70401e --- /dev/null +++ b/PVAtari800/atari800-src/pbi_mio.c @@ -0,0 +1,271 @@ +/* + * pbi_mio.c - ICD MIO board emulation + * + * Copyright (C) 2007-2008 Perry McFarlane + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "pbi_mio.h" +#include "util.h" +#include "log.h" +#include "memory.h" +#include "pia.h" +#include "pbi.h" +#include "cpu.h" +#include "stdlib.h" +#include "pbi_scsi.h" +#include "statesav.h" + +#ifdef PBI_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +int PBI_MIO_enabled = FALSE; + +static UBYTE *mio_rom; +static int mio_rom_size = 0x4000; +static int mio_ram_bank_offset = 0; +static UBYTE *mio_ram; +static int mio_ram_size = 0x100000; +static UBYTE mio_rom_bank = 0; +static int mio_ram_enabled = FALSE; +static char mio_rom_filename[FILENAME_MAX]; +static char mio_scsi_disk_filename[FILENAME_MAX] = Util_FILENAME_NOT_SET; +static int mio_scsi_enabled = FALSE; + +static void init_mio(void) +{ + free(mio_rom); + mio_rom = (UBYTE *)Util_malloc(mio_rom_size); + if (!Atari800_LoadImage(mio_rom_filename, mio_rom, mio_rom_size)) { + free(mio_rom); + mio_rom = NULL; + return; + } + D(printf("Loaded mio rom image\n")); + PBI_MIO_enabled = TRUE; + if (PBI_SCSI_disk != NULL) fclose(PBI_SCSI_disk); + if (!Util_filenamenotset(mio_scsi_disk_filename)) { + PBI_SCSI_disk = fopen(mio_scsi_disk_filename, "rb+"); + if (PBI_SCSI_disk == NULL) { + Log_print("Error opening SCSI disk image:%s", mio_scsi_disk_filename); + } + else { + D(printf("Opened SCSI disk image\n")); + mio_scsi_enabled = TRUE; + } + } + if (!mio_scsi_enabled) { + PBI_SCSI_BSY = TRUE; /* makes MIO give up easier */ + } + free(mio_ram); + mio_ram = (UBYTE *)Util_malloc(mio_ram_size); + memset(mio_ram, 0, mio_ram_size); +} + +int PBI_MIO_Initialise(int *argc, char *argv[]) +{ + int i, j; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-mio") == 0) { + init_mio(); + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-mio Emulate the ICD MIO board"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + return TRUE; +} + +void PBI_MIO_Exit(void) +{ + if (PBI_SCSI_disk != NULL) { + fclose(PBI_SCSI_disk); + PBI_SCSI_disk = NULL; + } + free(mio_ram); + free(mio_rom); + mio_rom = mio_ram = NULL; +} + +int PBI_MIO_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "MIO_ROM") == 0) + Util_strlcpy(mio_rom_filename, ptr, sizeof(mio_rom_filename)); + else if (strcmp(string, "MIO_SCSI_DISK") == 0) + Util_strlcpy(mio_scsi_disk_filename, ptr, sizeof(mio_scsi_disk_filename)); + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void PBI_MIO_WriteConfig(FILE *fp) +{ + fprintf(fp, "MIO_ROM=%s\n", mio_rom_filename); + if (!Util_filenamenotset(mio_scsi_disk_filename)) { + fprintf(fp, "MIO_SCSI_DISK=%s\n", mio_scsi_disk_filename); + } +} + +/* $D1xx */ +UBYTE PBI_MIO_D1GetByte(UWORD addr, int no_side_effects) +{ + UBYTE result = 0x00;/*ff*/; + addr &= 0xffe3; /* 7 mirrors */ + D(printf("MIO Read:%4x PC:%4x\n", addr, CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); + if (addr == 0xd1e2) { + result = ((!PBI_SCSI_CD) | (!PBI_SCSI_MSG<<1) | (!PBI_SCSI_IO<<2) | (!PBI_SCSI_BSY<<5) | (!PBI_SCSI_REQ<<7)); + } + else if (addr == 0xd1e1) { + if (mio_scsi_enabled) { + result = PBI_SCSI_GetByte()^0xff; + if (!no_side_effects) { + PBI_SCSI_PutACK(1); + PBI_SCSI_PutACK(0); + } + } + } + return result; +} + +/* $D1xx */ +void PBI_MIO_D1PutByte(UWORD addr, UBYTE byte) +{ + int old_mio_ram_bank_offset = mio_ram_bank_offset; + int old_mio_ram_enabled = mio_ram_enabled; + int offset_changed; + int ram_enabled_changed; + addr &= 0xffe3; /* 7 mirrors */ + if (addr == 0xd1e0) { + /* ram bank A15-A8 */ + mio_ram_bank_offset &= 0xf0000; + mio_ram_bank_offset |= (byte << 8); + } + else if (addr == 0xd1e1) { + if (mio_scsi_enabled) { + PBI_SCSI_PutByte(byte^0xff); + PBI_SCSI_PutACK(1); + PBI_SCSI_PutACK(0); + } + } + else if (addr == 0xd1e2) { + /* ram bank A19-A16, ram enable, other stuff */ + mio_ram_bank_offset &= 0x0ffff; + mio_ram_bank_offset |= ( (byte & 0x0f) << 16); + mio_ram_enabled = (byte & 0x20); + if (mio_scsi_enabled) PBI_SCSI_PutSEL(!!(byte & 0x10)); + } + else if (addr == 0xd1e3) { + /* or 0xd1ff. rom bank. */ + if (mio_rom_bank != byte){ + int offset = -1; + if (byte == 4) offset = 0x2000; + else if (byte == 8) offset = 0x2800; + else if (byte == 0x10) offset = 0x3000; + else if (byte == 0x20) offset = 0x3800; + if (offset != -1) { + memcpy(MEMORY_mem + 0xd800, mio_rom+offset, 0x800); + D(printf("mio bank:%2x activated\n", byte)); + }else{ + memcpy(MEMORY_mem + 0xd800, MEMORY_os + 0x1800, 0x800); + D(printf("Floating point rom activated\n")); + + } + mio_rom_bank = byte; + } + + } + offset_changed = (old_mio_ram_bank_offset != mio_ram_bank_offset); + ram_enabled_changed = (old_mio_ram_enabled != mio_ram_enabled); + if (mio_ram_enabled && ram_enabled_changed) { + /* Copy new page from buffer, overwrite ff page */ + memcpy(MEMORY_mem + 0xd600, mio_ram + mio_ram_bank_offset, 0x100); + } else if (mio_ram_enabled && offset_changed) { + /* Copy old page to buffer, copy new page from buffer */ + memcpy(mio_ram + old_mio_ram_bank_offset,MEMORY_mem + 0xd600, 0x100); + memcpy(MEMORY_mem + 0xd600, mio_ram + mio_ram_bank_offset, 0x100); + } else if (!mio_ram_enabled && ram_enabled_changed) { + /* Copy old page to buffer, set new page to ff */ + memcpy(mio_ram + old_mio_ram_bank_offset, MEMORY_mem + 0xd600, 0x100); + memset(MEMORY_mem + 0xd600, 0xff, 0x100); + } + D(printf("MIO Write addr:%4x byte:%2x, cpu:%4x\n", addr, byte,CPU_remember_PC[(CPU_remember_PC_curpos-1)%CPU_REMEMBER_PC_STEPS])); +} + +/* MIO RAM page at D600-D6ff */ +/* Possible to put code in this ram, so we can't avoid using MEMORY_mem[] */ +/* because opcode fetch doesn't call this function */ +UBYTE PBI_MIO_D6GetByte(UWORD addr, int no_side_effects) +{ + if (!mio_ram_enabled) return 0xff; + return MEMORY_mem[addr]; +} + +/* $D6xx */ +void PBI_MIO_D6PutByte(UWORD addr, UBYTE byte) +{ + if (!mio_ram_enabled) return; + MEMORY_mem[addr]=byte; +} + +#ifndef BASIC + +void PBI_MIO_StateSave(void) +{ + StateSav_SaveINT(&PBI_MIO_enabled, 1); + if (PBI_MIO_enabled) { + StateSav_SaveFNAME(mio_scsi_disk_filename); + StateSav_SaveFNAME(mio_rom_filename); + StateSav_SaveINT(&mio_ram_size, 1); + + StateSav_SaveINT(&mio_ram_bank_offset, 1); + StateSav_SaveUBYTE(mio_ram, mio_ram_size); + StateSav_SaveUBYTE(&mio_rom_bank, 1); + StateSav_SaveINT(&mio_ram_enabled, 1); + } +} + +void PBI_MIO_StateRead(void) +{ + StateSav_ReadINT(&PBI_MIO_enabled, 1); + if (PBI_MIO_enabled) { + StateSav_ReadFNAME(mio_scsi_disk_filename); + StateSav_ReadFNAME(mio_rom_filename); + StateSav_ReadINT(&mio_ram_size, 1); + init_mio(); + StateSav_ReadINT(&mio_ram_bank_offset, 1); + StateSav_ReadUBYTE(mio_ram, mio_ram_size); + StateSav_ReadUBYTE(&mio_rom_bank, 1); + StateSav_ReadINT(&mio_ram_enabled, 1); + } +} + +#endif /* #ifndef BASIC */ + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/pbi_mio.h b/PVAtari800/atari800-src/pbi_mio.h new file mode 100755 index 0000000000..a3e1254da0 --- /dev/null +++ b/PVAtari800/atari800-src/pbi_mio.h @@ -0,0 +1,20 @@ +#ifndef PBI_MIO_H_ +#define PBI_MIO_H_ + +#include "atari.h" +#include + +extern int PBI_MIO_enabled; + +int PBI_MIO_Initialise(int *argc, char *argv[]); +void PBI_MIO_Exit(void); +UBYTE PBI_MIO_D1GetByte(UWORD addr, int no_side_effects); +void PBI_MIO_D1PutByte(UWORD addr, UBYTE byte); +UBYTE PBI_MIO_D6GetByte(UWORD addr, int no_side_effects); +void PBI_MIO_D6PutByte(UWORD addr, UBYTE byte); +int PBI_MIO_ReadConfig(char *string, char *ptr); +void PBI_MIO_WriteConfig(FILE *fp); +void PBI_MIO_StateSave(void); +void PBI_MIO_StateRead(void); + +#endif /* PBI_MIO_H_ */ diff --git a/PVAtari800/atari800-src/pbi_proto80.c b/PVAtari800/atari800-src/pbi_proto80.c new file mode 100755 index 0000000000..ca92b54245 --- /dev/null +++ b/PVAtari800/atari800-src/pbi_proto80.c @@ -0,0 +1,152 @@ +/* + * pbi_proto.c - Emulation of a prototype 80 column board for the + * Atari 1090 expansion interface. + * + * Copyright (C) 2007-2008 Perry McFarlane + * Copyright (C) 2002-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "pbi.h" +#include "pbi_proto80.h" +#include "util.h" +#include "log.h" +#include "memory.h" +#include + +#define PROTO80_PBI_NUM 2 +#define PROTO80_MASK (1 << PROTO80_PBI_NUM) + +static UBYTE *proto80rom; +static char proto80_rom_filename[FILENAME_MAX]; + +int PBI_PROTO80_enabled = FALSE; + +#ifdef PBI_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +int PBI_PROTO80_Initialise(int *argc, char *argv[]) +{ + int i, j; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-proto80") == 0) { + Log_print("proto80 enabled"); + PBI_PROTO80_enabled = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-proto80 Emulate a prototype 80 column board for the 1090"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + if (PBI_PROTO80_enabled) { + proto80rom = (UBYTE *)Util_malloc(0x800); + if (!Atari800_LoadImage(proto80_rom_filename, proto80rom, 0x800)) { + free(proto80rom); + PBI_PROTO80_enabled = FALSE; + Log_print("Couldn't load proto80 rom image"); + return FALSE; + } + else { + Log_print("loaded proto80 rom image"); + PBI_D6D7ram = TRUE; + } + } + + return TRUE; +} + +void PBI_PROTO80_Exit(void) +{ + if (PBI_PROTO80_enabled) { + free(proto80rom); + PBI_PROTO80_enabled = FALSE; + } +} + +int PBI_PROTO80_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "PROTO80_ROM") == 0) + Util_strlcpy(proto80_rom_filename, ptr, sizeof(proto80_rom_filename)); + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void PBI_PROTO80_WriteConfig(FILE *fp) +{ + fprintf(fp, "PROTO80_ROM=%s\n", proto80_rom_filename); +} + +int PBI_PROTO80_D1GetByte(UWORD addr, int no_side_effects) +{ + int result = PBI_NOT_HANDLED; + if (PBI_PROTO80_enabled) { + } + return result; +} + +void PBI_PROTO80_D1PutByte(UWORD addr, UBYTE byte) +{ + +} + +int PBI_PROTO80_D1ffPutByte(UBYTE byte) +{ + int result = 0; /* handled */ + if (PBI_PROTO80_enabled && byte == PROTO80_MASK) { + memcpy(MEMORY_mem + 0xd800, proto80rom, 0x800); + D(printf("PROTO80 rom activated\n")); + } + else result = PBI_NOT_HANDLED; + return result; +} + +UBYTE PBI_PROTO80_GetPixels(int scanline, int column) +{ +#define PROTO80_ROWS 24 +#define PROTO80_CELL_HEIGHT 8 + UBYTE character; + UBYTE invert; + UBYTE font_data; + int row = scanline / PROTO80_CELL_HEIGHT; + int line = scanline % PROTO80_CELL_HEIGHT; + if (row >= PROTO80_ROWS) { + return 0; + } + character = MEMORY_mem[0x9800 + row*80 + column]; + invert = 0x00; + if (character & 0x80) { + invert = 0xff; + character &= 0x7f; + } + font_data = MEMORY_mem[0xe000 + character*8 + line]; + font_data ^= invert; + return font_data; +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/pbi_proto80.h b/PVAtari800/atari800-src/pbi_proto80.h new file mode 100755 index 0000000000..9c26eed0b6 --- /dev/null +++ b/PVAtari800/atari800-src/pbi_proto80.h @@ -0,0 +1,15 @@ +#ifndef PBI_PROTO80_H_ +#define PBI_PROTO80_H_ + +#include "atari.h" +int PBI_PROTO80_Initialise(int *argc, char *argv[]); +void PBI_PROTO80_Exit(void); +int PBI_PROTO80_ReadConfig(char *string, char *ptr); +void PBI_PROTO80_WriteConfig(FILE *fp); +int PBI_PROTO80_D1GetByte(UWORD addr, int no_side_effects); +void PBI_PROTO80_D1PutByte(UWORD addr, UBYTE byte); +int PBI_PROTO80_D1ffPutByte(UBYTE byte); +UBYTE PBI_PROTO80_GetPixels(int scanline, int column); +extern int PBI_PROTO80_enabled; + +#endif /* PBI_PROTO80_H_ */ diff --git a/PVAtari800/atari800-src/pbi_scsi.c b/PVAtari800/atari800-src/pbi_scsi.c new file mode 100755 index 0000000000..0e64094ade --- /dev/null +++ b/PVAtari800/atari800-src/pbi_scsi.c @@ -0,0 +1,241 @@ +/* + * pbi_scsi.c - SCSI emulation for the MIO and Black Box + * + * Copyright (C) 2007-2008 Perry McFarlane + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "util.h" +#include "log.h" +#include "pbi_scsi.h" + +#ifdef PBI_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +int PBI_SCSI_CD = FALSE; +int PBI_SCSI_MSG = FALSE; +int PBI_SCSI_IO = FALSE; +int PBI_SCSI_BSY = FALSE; +int PBI_SCSI_REQ = FALSE; +int PBI_SCSI_ACK = FALSE; + +int PBI_SCSI_SEL = FALSE; + +static UBYTE scsi_byte; + +#define SCSI_PHASE_SELECTION 0 +#define SCSI_PHASE_DATAIN 1 +#define SCSI_PHASE_DATAOUT 2 +#define SCSI_PHASE_COMMAND 3 +#define SCSI_PHASE_STATUS 4 +#define SCSI_PHASE_MSGIN 5 + +static int scsi_phase = SCSI_PHASE_SELECTION; +static int scsi_bufpos = 0; +static UBYTE scsi_buffer[256]; +static int scsi_count = 0; + +FILE *PBI_SCSI_disk = NULL; + +static void scsi_changephase(int phase) +{ + D(printf("scsi_changephase:%d\n",phase)); + switch(phase) { + case SCSI_PHASE_SELECTION: + PBI_SCSI_REQ = FALSE; + PBI_SCSI_BSY = FALSE; + PBI_SCSI_CD = FALSE; + PBI_SCSI_IO = FALSE; + PBI_SCSI_MSG = FALSE; + break; + case SCSI_PHASE_DATAOUT: + PBI_SCSI_REQ = TRUE; + PBI_SCSI_BSY = TRUE; + PBI_SCSI_CD = FALSE; + PBI_SCSI_IO = FALSE; + PBI_SCSI_MSG = FALSE; + break; + case SCSI_PHASE_DATAIN: + PBI_SCSI_REQ = TRUE; + PBI_SCSI_BSY = TRUE; + PBI_SCSI_CD = FALSE; + PBI_SCSI_IO = TRUE; + PBI_SCSI_MSG = FALSE; + break; + case SCSI_PHASE_COMMAND: + PBI_SCSI_REQ = TRUE; + PBI_SCSI_BSY = TRUE; + PBI_SCSI_CD = TRUE; + PBI_SCSI_IO = FALSE; + PBI_SCSI_MSG = FALSE; + break; + case SCSI_PHASE_STATUS: + PBI_SCSI_REQ = TRUE; + PBI_SCSI_BSY = TRUE; + PBI_SCSI_CD = TRUE; + PBI_SCSI_IO = TRUE; + PBI_SCSI_MSG = FALSE; + break; + case SCSI_PHASE_MSGIN: + PBI_SCSI_REQ = TRUE; + PBI_SCSI_BSY = TRUE; + PBI_SCSI_CD = TRUE; + PBI_SCSI_IO = FALSE; + PBI_SCSI_MSG = TRUE; + break; + } + scsi_bufpos = 0; + scsi_phase = phase; +} + +static void scsi_process_command(void) +{ + int i; + int lba; +/* int lun;*/ + D(printf("SCSI command:")); + for (i = 0; i < 6; i++) { + D(printf(" %02x",scsi_buffer[i])); + } + D(printf("\n")); + switch (scsi_buffer[0]) { + case 0x00: + /* test unit ready */ + D(printf("SCSI: test unit ready\n")); + scsi_changephase(SCSI_PHASE_STATUS); + scsi_buffer[0] = 0; + break; + case 0x03: + /* request sense */ + D(printf("SCSI: request sense\n")); + scsi_changephase(SCSI_PHASE_DATAIN); + memset(scsi_buffer,0,1); + scsi_count = 4; + break; + case 0x08: + /* read */ +/* lun = ((scsi_buffer[1]&0xe0)>>5);*/ + lba = (((scsi_buffer[1]&0x1f)<<16)|(scsi_buffer[2]<<8)|(scsi_buffer[3])); + D(printf("SCSI: read lun:%d lba:%d\n",lun,lba)); + fseek(PBI_SCSI_disk, lba*256, SEEK_SET); + scsi_count = fread(scsi_buffer, 1, 256, PBI_SCSI_disk); + scsi_changephase(SCSI_PHASE_DATAIN); + /* scsi_count = 256; */ + break; + case 0x0a: + /* write */ +/* lun = ((scsi_buffer[1]&0xe0)>>5);*/ + lba = (((scsi_buffer[1]&0x1f)<<16)|(scsi_buffer[2]<<8)|(scsi_buffer[3])); + D(printf("SCSI: write lun:%d lba:%d\n",lun,lba)); + fseek(PBI_SCSI_disk, lba*256, SEEK_SET); + scsi_changephase(SCSI_PHASE_DATAOUT); + scsi_count = 256; + break; + default: + D(printf("SCSI: unknown command:%2x\n", scsi_buffer[0])); + scsi_changephase(SCSI_PHASE_SELECTION); + break; + } +} + +static void scsi_nextbyte(void) +{ + if (scsi_phase == SCSI_PHASE_DATAIN) { + scsi_bufpos++; + if (scsi_bufpos >= scsi_count) { + scsi_changephase(SCSI_PHASE_STATUS); + scsi_buffer[0] = 0; + } + } + else if (scsi_phase == SCSI_PHASE_STATUS) { + D(printf("SCSI status\n")); + scsi_changephase(SCSI_PHASE_MSGIN); + scsi_buffer[0] = 0; + } + else if (scsi_phase == SCSI_PHASE_MSGIN) { + D(printf("SCSI msg\n")); + scsi_changephase(SCSI_PHASE_SELECTION); + } + else if (scsi_phase == SCSI_PHASE_COMMAND) { + scsi_buffer[scsi_bufpos++] = scsi_byte; + if (scsi_bufpos >= 0x06) { + scsi_process_command(); + scsi_bufpos = 0; + } + } + else if (scsi_phase == SCSI_PHASE_DATAOUT) { + D(printf("SCSI data out:%2x\n", scsi_byte)); + scsi_buffer[scsi_bufpos++] = scsi_byte; + if (scsi_bufpos >= scsi_count) { + fwrite(scsi_buffer, 1, 256, PBI_SCSI_disk); + scsi_changephase(SCSI_PHASE_STATUS); + scsi_buffer[0] = 0; + } + } +} + +void PBI_SCSI_PutSEL(int newsel) +{ + if (newsel != PBI_SCSI_SEL) { + /* SEL changed state */ + PBI_SCSI_SEL = newsel; + if (PBI_SCSI_SEL && scsi_phase == SCSI_PHASE_SELECTION && scsi_byte == 0x01) { + scsi_changephase(SCSI_PHASE_COMMAND); + } + D(printf("changed SEL:%d scsi_byte:%2x\n",PBI_SCSI_SEL, scsi_byte)); + } +} + +void PBI_SCSI_PutACK(int newack) +{ + if (newack != PBI_SCSI_ACK) { + /* ACK changed state */ + PBI_SCSI_ACK = newack; + if (PBI_SCSI_ACK) { + /* REQ goes false when ACK goes true */ + PBI_SCSI_REQ = FALSE; + } + else { + /* falling ACK triggers next byte */ + if (scsi_phase != SCSI_PHASE_SELECTION) { + PBI_SCSI_REQ = TRUE; + scsi_nextbyte(); + } + } + } +} + +UBYTE PBI_SCSI_GetByte(void) +{ + return (scsi_buffer[scsi_bufpos]); +} + +void PBI_SCSI_PutByte(UBYTE byte) +{ + scsi_byte = byte; +} + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/pbi_scsi.h b/PVAtari800/atari800-src/pbi_scsi.h new file mode 100755 index 0000000000..9e5f8a9aaa --- /dev/null +++ b/PVAtari800/atari800-src/pbi_scsi.h @@ -0,0 +1,21 @@ +#ifndef PBI_SCSI_H_ +#define PBI_SCSI_H_ + +#include "atari.h" +#include + +extern int PBI_SCSI_CD; +extern int PBI_SCSI_MSG; +extern int PBI_SCSI_IO; +extern int PBI_SCSI_BSY; +extern int PBI_SCSI_REQ; +extern int PBI_SCSI_SEL; +extern int PBI_SCSI_ACK; +extern FILE *PBI_SCSI_disk; + +void PBI_SCSI_PutByte(UBYTE byte); +UBYTE PBI_SCSI_GetByte(void); +void PBI_SCSI_PutSEL(int newsel); +void PBI_SCSI_PutACK(int newack); + +#endif /* PBI_MIO_H_ */ diff --git a/PVAtari800/atari800-src/pbi_xld.c b/PVAtari800/atari800-src/pbi_xld.c new file mode 100755 index 0000000000..0e62679764 --- /dev/null +++ b/PVAtari800/atari800-src/pbi_xld.c @@ -0,0 +1,741 @@ +/* + * pbi_xld.c - 1450XLD and 1400XL emulation + * + * Copyright (C) 2007-2008 Perry McFarlane + * Copyright (C) 2002-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "atari.h" +#include "votrax.h" +#include "pbi_xld.h" +#include "pbi.h" +#include "util.h" +#include "sio.h" +#include "log.h" +#include "pokey.h" +#include "cpu.h" +#include "memory.h" +#include "statesav.h" +#include "votraxsnd.h" +#include + +#define DISK_PBI_NUM 0 +#define MODEM_PBI_NUM 1 +#define VOICE_PBI_NUM 7 + +#define DISK_MASK (1 << DISK_PBI_NUM) +#define MODEM_MASK (1 << MODEM_PBI_NUM) +#define VOICE_MASK (1 << VOICE_PBI_NUM) + +static UBYTE *voicerom; +static UBYTE *diskrom; +static char xld_d_rom_filename[FILENAME_MAX]; +static char xld_v_rom_filename[FILENAME_MAX]; + +static UBYTE votrax_latch = 0; +static UBYTE modem_latch = 0; + +int PBI_XLD_enabled = FALSE; +int PBI_XLD_v_enabled = FALSE; +static int xld_d_enabled = FALSE; + +/* Parallel Disk I/O emulation support */ +#define PIO_NoFrame (0x00) +#define PIO_CommandFrame (0x01) +#define PIO_StatusRead (0x02) +#define PIO_ReadFrame (0x03) +#define PIO_WriteFrame (0x04) +#define PIO_FinalStatus (0x05) +#define PIO_FormatFrame (0x06) +static UBYTE CommandFrame[6]; +static int CommandIndex = 0; +static UBYTE DataBuffer[256 + 3]; +static int DataIndex = 0; +static int TransferStatus = PIO_CommandFrame; +static int ExpectedBytes = 5; +static void PIO_PutByte(int byte); +static int PIO_GetByte(void); +static UBYTE PIO_Command_Frame(void); + +#ifdef PBI_DEBUG +#define D(a) a +#else +#define D(a) do{}while(0) +#endif + +static void init_xld_v(void) +{ + free(voicerom); + voicerom = (UBYTE *)Util_malloc(0x1000); + if (!Atari800_LoadImage(xld_v_rom_filename, voicerom, 0x1000)) { + free(voicerom); + PBI_XLD_v_enabled = FALSE; + } + else { + printf("loaded XLD voice rom image\n"); + PBI_D6D7ram = TRUE; + } +} + +static void init_xld_d(void) +{ + free(diskrom); + diskrom = (UBYTE *)Util_malloc(0x800); + if (!Atari800_LoadImage(xld_d_rom_filename, diskrom, 0x800)) { + free(diskrom); + xld_d_enabled = FALSE; + } + else { + D(printf("loaded 1450XLD D: device driver rom image\n")); + PBI_D6D7ram = TRUE; + } +} + +int PBI_XLD_Initialise(int *argc, char *argv[]) +{ + int i, j; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-1400") == 0) { + PBI_XLD_v_enabled = TRUE; + PBI_XLD_enabled = TRUE; + }else if (strcmp(argv[i], "-xld") == 0){ + PBI_XLD_v_enabled = TRUE; + xld_d_enabled = TRUE; + PBI_XLD_enabled = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-1400 Emulate the Atari 1400XL"); + Log_print("\t-xld Emulate the Atari 1450XLD"); + } + + argv[j++] = argv[i]; + } + + } + *argc = j; + + if (PBI_XLD_v_enabled) { + init_xld_v(); + } + + /* If you set the drive to empty in the UI, the message is displayed */ + /* If you press select, I believe it tries to slow the I/O down */ + /* in order to increase compatibility. */ + /* dskcnt6 works. dskcnt10 does not */ + if (xld_d_enabled) { + init_xld_d(); + } + + return TRUE; +} + +void PBI_XLD_Exit(void) +{ + if (xld_d_enabled) { + free(diskrom); + xld_d_enabled = FALSE; + } + if (PBI_XLD_v_enabled) { + free(voicerom); + PBI_XLD_v_enabled = FALSE; + } + PBI_XLD_enabled = FALSE; +} + +int PBI_XLD_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "XLD_D_ROM") == 0) + Util_strlcpy(xld_d_rom_filename, ptr, sizeof(xld_d_rom_filename)); + else if (strcmp(string, "XLD_V_ROM") == 0) + Util_strlcpy(xld_v_rom_filename, ptr, sizeof(xld_v_rom_filename)); + else return FALSE; /* no match */ + return TRUE; /* matched something */ +} + +void PBI_XLD_WriteConfig(FILE *fp) +{ + fprintf(fp, "XLD_D_ROM=%s\n", xld_d_rom_filename); + fprintf(fp, "XLD_V_ROM=%s\n", xld_v_rom_filename); +} + +void PBI_XLD_Reset(void) +{ + votrax_latch = 0; +} + +int PBI_XLD_D1GetByte(UWORD addr) +{ + int result = PBI_NOT_HANDLED; + if (xld_d_enabled && addr == 0xd114) { + /* XLD input from disk to atari byte latch */ + result = (int)PIO_GetByte(); + D(printf("d114: disk read byte:%2x\n",result)); + } + return result; +} + + +/* D1FF: each bit indicates IRQ status of a device */ +UBYTE PBI_XLD_D1ffGetByte() +{ + UBYTE result = 0; + /* VOTRAX BUSY IRQ bit */ + /*if (!votraxsc01_status_r()) {*/ + if (!VOTRAXSND_busy) { + result |= VOICE_MASK; + } + return result; +} + +void PBI_XLD_D1PutByte(UWORD addr, UBYTE byte) +{ + if ((addr & ~3) == 0xd104) { + /* XLD disk strobe line */ + D(printf("votrax write:%4x\n",addr)); + if (VOTRAXSND_busy) { + PBI_XLD_votrax_busy_callback(TRUE); /* idle -> busy */ + } + VOTRAXSND_PutByte(votrax_latch & 0x3f); + + } + else if ((addr & ~3) == 0xd100 ) { + /* votrax phoneme+irq-enable latch */ + if ( !(votrax_latch & 0x80) && (byte & 0x80) && (!Votrax_GetStatus())) { + /* IRQ disabled -> enabled, and votrax idle: generate IRQ */ + D(printf("votrax IRQ generated: IRQ enable changed and idle\n")); + CPU_GenerateIRQ(); + PBI_IRQ |= VOICE_MASK; + } else if ((votrax_latch & 0x80) && !(byte & 0x80) ){ + /* IRQ enabled -> disabled : stop IRQ */ + PBI_IRQ &= ~VOICE_MASK; + /* update pokey IRQ status */ + POKEY_PutByte(POKEY_OFFSET_IRQEN, POKEY_IRQEN); + } + votrax_latch = byte; + } + else if (addr == 0xd108) { + /* modem latch and XLD 8040 T1 input */ + D(printf("XLD 8040 T1:%d loop-back:%d modem+phone:%d offhook(modem relay):%d phaudio:%d DTMF:%d O/!A(originate/answer):%d SQT(squelch transmitter):%d\n",!!(byte&0x80),!!(byte&0x40),!!(byte&0x20),!!(byte&0x10),!!(byte&0x08),!!(byte&0x04),!!(byte&0x02),!!(byte&0x01))); + modem_latch = byte; + } + else if (xld_d_enabled && addr == 0xd110) { + /* XLD byte output from atari to disk latch */ + D(printf("d110: disk output byte:%2x\n",byte)); + if (modem_latch & 0x80){ + /* 8040 T1=1 */ + CommandIndex = 0; + DataIndex = 0; + TransferStatus = PIO_CommandFrame; + ExpectedBytes = 5; + D(printf("command frame expected\n")); + } + else if (TransferStatus == PIO_StatusRead || TransferStatus == PIO_ReadFrame) { + D(printf("read ack strobe\n")); + } + else { + PIO_PutByte(byte); + } + } +} + +int PBI_XLD_D1ffPutByte(UBYTE byte) +{ + int result = 0; /* handled */ + if (xld_d_enabled && byte == DISK_MASK) { + memcpy(MEMORY_mem + 0xd800, diskrom, 0x800); + D(printf("DISK rom activated\n")); + } + else if (byte == MODEM_MASK) { + memcpy(MEMORY_mem + 0xd800, voicerom + 0x800, 0x800); + D(printf("MODEM rom activated\n")); + } + else if (byte == VOICE_MASK) { + memcpy(MEMORY_mem + 0xd800, voicerom, 0x800); + D(printf("VOICE rom activated\n")); + } + else result = PBI_NOT_HANDLED; + return result; +} + +void PBI_XLD_votrax_busy_callback(int busy_status) +{ + if (!busy_status && (votrax_latch & 0x80)){ + /* busy->idle and IRQ enabled */ + D(printf("votrax IRQ generated\n")); + CPU_GenerateIRQ(); + PBI_IRQ |= VOICE_MASK; + } + else if (busy_status && (PBI_IRQ & VOICE_MASK)) { + /* idle->busy and PBI_IRQ set */ + PBI_IRQ &= ~VOICE_MASK; + /* update pokey IRQ status */ + POKEY_PutByte(POKEY_OFFSET_IRQEN, POKEY_IRQEN); + } +} + +/* from sio.c */ +static UBYTE WriteSectorBack(void) +{ + UWORD sector; + UBYTE unit; + + sector = CommandFrame[2] + (CommandFrame[3] << 8); + unit = CommandFrame[0] - '1'; + if (unit >= SIO_MAX_DRIVES) /* UBYTE range ! */ + return 0; + switch (CommandFrame[1]) { + case 0x4f: /* Write Status Block */ + return SIO_WriteStatusBlock(unit, DataBuffer); + case 0x50: /* Write */ + case 0x57: + case 0xD0: /* xf551 hispeed */ + case 0xD7: + return SIO_WriteSector(unit, sector, DataBuffer); + default: + return 'E'; + } +} + +/* Put a byte that comes from the parallel bus */ +static void PIO_PutByte(int byte) +{ + D(printf("TransferStatus:%d\n",TransferStatus)); + switch (TransferStatus) { + case PIO_CommandFrame: + D(printf("CommandIndex:%d ExpectedBytes:%d\n",CommandIndex,ExpectedBytes)); + if (CommandIndex < ExpectedBytes) { + CommandFrame[CommandIndex++] = byte; + if (CommandIndex >= ExpectedBytes) { + if (CommandFrame[0] >= 0x31 && CommandFrame[0] <= 0x38) { + TransferStatus = PIO_StatusRead; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL + ACK_INTERVAL;*/ + D(printf("TransferStatus = PIO_StatusRead\n")); + } + else{ + TransferStatus = PIO_NoFrame; + D(printf("TransferStatus = PIO_NoFrame\n")); + } + } + } + else { + Log_print("Invalid command frame!"); + TransferStatus = PIO_NoFrame; + } + break; + case PIO_WriteFrame: /* Expect data */ + if (DataIndex < ExpectedBytes) { + DataBuffer[DataIndex++] = byte; + if (DataIndex >= ExpectedBytes) { + UBYTE sum = SIO_ChkSum(DataBuffer, ExpectedBytes - 1); + if (sum == DataBuffer[ExpectedBytes - 1]) { + UBYTE result = WriteSectorBack(); + if (result != 0) { + DataBuffer[0] = 'A'; + DataBuffer[1] = result; + DataIndex = 0; + ExpectedBytes = 2; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL + ACK_INTERVAL;*/ + TransferStatus = PIO_FinalStatus; + } + else + TransferStatus = PIO_NoFrame; + } + else { + DataBuffer[0] = 'E'; + DataIndex = 0; + ExpectedBytes = 1; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL + ACK_INTERVAL;*/ + TransferStatus = PIO_FinalStatus; + } + } + } + else { + Log_print("Invalid data frame!"); + } + break; + } + /*DELAYED_SEROUT_IRQ = SEROUT_INTERVAL;*/ +} + +/* Get a byte from the floppy to the parallel bus. */ +static int PIO_GetByte(void) +{ + int byte = 0; + D(printf("PIO_GetByte TransferStatus:%d\n",TransferStatus)); + + switch (TransferStatus) { + case PIO_StatusRead: + byte = PIO_Command_Frame(); /* Handle now the command */ + break; + case PIO_FormatFrame: + TransferStatus = PIO_ReadFrame; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL << 3;*/ + /* FALL THROUGH */ + case PIO_ReadFrame: + D(printf("ReadFrame: DataIndex:%d ExpectedBytes:%d\n",DataIndex,ExpectedBytes)); + if (DataIndex < ExpectedBytes) { + byte = DataBuffer[DataIndex++]; + if (DataIndex >= ExpectedBytes) { + TransferStatus = PIO_NoFrame; + } + /*else {*/ + /* set delay using the expected transfer speed */ + /*DELAYED_SERIN_IRQ = (DataIndex == 1) ? SERIN_INTERVAL*/ + /*: ((SERIN_INTERVAL * AUDF[CHAN3] - 1) / 0x28 + 1);*/ + /*}*/ + } + else { + Log_print("Invalid read frame!"); + TransferStatus = PIO_NoFrame; + } + break; + case PIO_FinalStatus: + if (DataIndex < ExpectedBytes) { + byte = DataBuffer[DataIndex++]; + if (DataIndex >= ExpectedBytes) { + TransferStatus = PIO_NoFrame; + } + /*else { + if (DataIndex == 0) + DELAYED_SERIN_IRQ = SERIN_INTERVAL + ACK_INTERVAL; + else + DELAYED_SERIN_IRQ = SERIN_INTERVAL; + }*/ + } + else { + Log_print("Invalid read frame!"); + TransferStatus = PIO_NoFrame; + } + break; + default: + break; + } + return byte; +} + +static UBYTE PIO_Command_Frame(void) +{ + int unit; + int sector; + int realsize; + + sector = CommandFrame[2] | (((UWORD) CommandFrame[3]) << 8); + unit = CommandFrame[0] - '1'; + + if (unit < 0 || unit >= SIO_MAX_DRIVES) { + /* Unknown device */ + Log_print("Unknown command frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); + TransferStatus = PIO_NoFrame; + return 0; + } + switch (CommandFrame[1]) { + case 0x01: + Log_print("PIO DISK: Set large mode (unimplemented)"); + return 'E'; + case 0x02: + Log_print("PIO DISK: Set small mode (unimplemented)"); + return 'E'; + case 0x23: + Log_print("PIO DISK: Drive Diagnostic In (unimplemented)"); + return 'E'; + case 0x24: + Log_print("PIO DISK: Drive Diagnostic Out (unimplemented)"); + return 'E'; + case 0x4e: /* Read Status */ +#ifdef PBI_DEBUG + Log_print("PIO DISK: Read-status frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + DataBuffer[0] = SIO_ReadStatusBlock(unit, DataBuffer + 1); + DataBuffer[13] = SIO_ChkSum(DataBuffer + 1, 12); + DataIndex = 0; + ExpectedBytes = 14; + TransferStatus = PIO_ReadFrame; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL;*/ + return 'A'; + case 0x4f: /* Write status */ +#ifdef PBI_DEBUG + Log_print("PIO DISK: Write-status frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + ExpectedBytes = 13; + DataIndex = 0; + TransferStatus = PIO_WriteFrame; + return 'A'; + case 0x50: /* Write */ + case 0x57: +#ifdef PBI_DEBUG + Log_print("PIO DISK: Write-sector frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + SIO_SizeOfSector((UBYTE) unit, sector, &realsize, NULL); + ExpectedBytes = realsize + 1; + DataIndex = 0; + TransferStatus = PIO_WriteFrame; + SIO_last_op = SIO_LAST_WRITE; + SIO_last_op_time = 10; + SIO_last_drive = unit + 1; + return 'A'; + case 0x52: /* Read */ +#ifdef PBI_DEBUG + Log_print("PIO DISK: Read-sector frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + SIO_SizeOfSector((UBYTE) unit, sector, &realsize, NULL); + DataBuffer[0] = SIO_ReadSector(unit, sector, DataBuffer + 1); + DataBuffer[1 + realsize] = SIO_ChkSum(DataBuffer + 1, realsize); + DataIndex = 0; + ExpectedBytes = 2 + realsize; + TransferStatus = PIO_ReadFrame; + /* wait longer before confirmation because bytes could be lost */ + /* before the buffer was set (see $E9FB & $EA37 in XL-OS) */ + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL << 2;*/ + /* +#ifndef NO_SECTOR_DELAY + if (sector == 1) { + //DELAYED_SERIN_IRQ += delay_counter; + delay_counter = SECTOR_DELAY; + } + else { + delay_counter = 0; + } +#endif*/ + SIO_last_op = SIO_LAST_READ; + SIO_last_op_time = 10; + SIO_last_drive = unit + 1; + return 'A'; + case 0x53: /* Status */ + /* + from spec doc: + BYTE 1 - DISK STATUS + + BIT 0 = 1 indicates an invalid + command frame was receiv- + ed. + BIT 1 = 1 indicates an invalid + data frame was received. + BIT 2 = 1 indicates an opera- + tion was unsuccessful. + BIT 3 = 1 indicates the disk- + ette is write protected. + BIT 4 = 1 indicates drive is + active. + BITS 5-7 = 100 indicates single + density format. + BITS 5-7 = 101 indicates double + density format. + + BYTE 2 - DISK CONTROLLER HARDWARE + STATUS + + This byte shall contain the in- + verted value of the disk con- + troller hardware status regis- + ter as of the last operation. + The hardware status value for + no errors shall be $FF. A zero + in any bit position shall indi- + cate an error. The definition + of the bit positions shall be: + + BIT 0 = 0 indicates device busy + BIT 1 = 0 indicates data re- + quest is full on a read + operation. + BIT 2 = 0 indicates data lost + BIT 3 = 0 indicates CRC error + BIT 4 = 0 indicates desired + track and sector not found + BIT 5 = 0 indicates record + type/write fault + BIT 6 NOT USED + *BIT 7 = 0 indicates device not + ready (door open) + + BYTES 3 & 4 - TIMEOUT + + These bytes shall contain a + disk controller provided maxi- + mum timeout value, in seconds, + for the worst case command. The + worst case operation is for a + disk format command (time TBD + seconds). Byte 4 is not used, + currently.*/ + /*****Compare with:******/ +/* + Status Request from Atari 400/800 Technical Reference Notes + + DVSTAT + 0 Command Status + DVSTAT + 1 Hardware Status + DVSTAT + 2 Timeout + DVSTAT + 3 Unused + + Command Status Bits + + Bit 0 = 1 indicates an invalid command frame was received(same) + Bit 1 = 1 indicates an invalid data frame was received(same) + Bit 2 = 1 indicates that last read/write operation was unsuccessful(same) + Bit 3 = 1 indicates that the diskette is write protected(same) + Bit 4 = 1 indicates active/standby(same) + + plus + + Bit 5 = 1 indicates double density + Bit 7 = 1 indicates dual density disk (1050 format) + */ + +#ifdef PBI_DEBUG + Log_print("PIO DISK: Status frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + /*if (SIO_drive_status[unit]==SIO_OFF) SIO_drive_status[unit]=SIO_NO_DISK;*/ + /*need to modify the line below also for SIO_OFF==SIO_NO_DISK*/ + DataBuffer[0] = SIO_DriveStatus(unit, DataBuffer + 1); + DataBuffer[2] = 0xff;/*/1;//SIO_DriveStatus(unit, DataBuffer + 1);*/ + if (SIO_drive_status[unit]==SIO_NO_DISK || SIO_drive_status[unit]==SIO_OFF){ + /*Can't turn 1450XLD drives off, so make SIO_OFF==SIO_NO_DISK*/ + DataBuffer[2]=0x7f; + } + DataBuffer[1 + 4] = SIO_ChkSum(DataBuffer + 1, 4); + DataIndex = 0; + ExpectedBytes = 6; + TransferStatus = PIO_ReadFrame; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL;*/ + return 'A'; + case 0x21: /* Format Disk */ +#ifdef PBI_DEBUG + Log_print("PIO DISK: Format-disk frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + realsize = SIO_format_sectorsize[unit]; + DataBuffer[0] = SIO_FormatDisk(unit, DataBuffer + 1, realsize, SIO_format_sectorcount[unit]); + DataBuffer[1 + realsize] = SIO_ChkSum(DataBuffer + 1, realsize); + DataIndex = 0; + ExpectedBytes = 2 + realsize; + TransferStatus = PIO_FormatFrame; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL;*/ + return 'A'; + case 0x22: /* Dual Density Format */ +#ifdef PBI_DEBUG + Log_print("PIO DISK: Format-Medium frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + DataBuffer[0] = SIO_FormatDisk(unit, DataBuffer + 1, 128, 1040); + DataBuffer[1 + 128] = SIO_ChkSum(DataBuffer + 1, 128); + DataIndex = 0; + ExpectedBytes = 2 + 128; + TransferStatus = PIO_FormatFrame; + /*DELAYED_SERIN_IRQ = SERIN_INTERVAL;*/ + return 'A'; + + /* + The Integral Disk Drive uses COMMAND BYTE $B1 and + $B2 for internal use. These COMMAND BYTES may not + be used by any other drivers.*/ + case 0xb1: + Log_print("PIO DISK: Internal Command 0xb1 (unimplemented)"); + return 'E'; + case 0xb2: + Log_print("PIO DISK: Internal Command 0xb2 (unimplemented)"); + return 'E'; + + + default: + /* Unknown command for a disk drive */ +#ifdef PBI_DEBUG + Log_print("PIO DISK: Unknown Command frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + TransferStatus = PIO_NoFrame; + return 'E'; + } +} + + +#ifndef BASIC + +void PBI_XLD_StateSave(void) +{ + StateSav_SaveINT(&PBI_XLD_enabled, 1); + if (PBI_XLD_enabled) { + StateSav_SaveINT(&PBI_XLD_v_enabled, 1); + StateSav_SaveINT(&xld_d_enabled, 1); + StateSav_SaveFNAME(xld_d_rom_filename); + StateSav_SaveFNAME(xld_v_rom_filename); + + StateSav_SaveUBYTE(&votrax_latch, 1); + StateSav_SaveUBYTE(&modem_latch, 1); + StateSav_SaveUBYTE(CommandFrame, sizeof(CommandFrame)); + StateSav_SaveINT(&CommandIndex, 1); + StateSav_SaveUBYTE(DataBuffer, sizeof(DataBuffer)); + StateSav_SaveINT(&DataIndex, 1); + StateSav_SaveINT(&TransferStatus, 1); + StateSav_SaveINT(&ExpectedBytes, 1); + StateSav_SaveINT(&VOTRAXSND_busy, 1); + } +} + +void PBI_XLD_StateRead(void) +{ + StateSav_ReadINT(&PBI_XLD_enabled, 1); + if (PBI_XLD_enabled) { + /* UI should have paused sound while doing this */ + StateSav_ReadINT(&PBI_XLD_v_enabled, 1); + StateSav_ReadINT(&xld_d_enabled, 1); + StateSav_ReadFNAME(xld_d_rom_filename); + StateSav_ReadFNAME(xld_v_rom_filename); + if (PBI_XLD_v_enabled) { + init_xld_v(); + VOTRAXSND_Reinit(); + } + if (xld_d_enabled) init_xld_d(); + StateSav_ReadUBYTE(&votrax_latch, 1); + StateSav_ReadUBYTE(&modem_latch, 1); + StateSav_ReadUBYTE(CommandFrame, sizeof(CommandFrame)); + StateSav_ReadINT(&CommandIndex, 1); + StateSav_ReadUBYTE(DataBuffer, sizeof(DataBuffer)); + StateSav_ReadINT(&DataIndex, 1); + StateSav_ReadINT(&TransferStatus, 1); + StateSav_ReadINT(&ExpectedBytes, 1); + StateSav_ReadINT(&VOTRAXSND_busy, 1); + } + else { + PBI_XLD_v_enabled = FALSE; + xld_d_enabled = FALSE; + } +} + +#endif /* #ifndef BASIC */ + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/pbi_xld.h b/PVAtari800/atari800-src/pbi_xld.h new file mode 100755 index 0000000000..8b595081fe --- /dev/null +++ b/PVAtari800/atari800-src/pbi_xld.h @@ -0,0 +1,23 @@ +#ifndef PBI_XLD_H_ +#define PBI_XLD_H_ + +#include "atari.h" +int PBI_XLD_Initialise(int *argc, char *argv[]); +void PBI_XLD_Exit(void); +int PBI_XLD_ReadConfig(char *string, char *ptr); +void PBI_XLD_WriteConfig(FILE *fp); +void PBI_XLD_Reset(void); +int PBI_XLD_D1GetByte(UWORD addr); +UBYTE PBI_XLD_D1ffGetByte(void); +void PBI_XLD_D1PutByte(UWORD addr, UBYTE byte); +int PBI_XLD_D1ffPutByte(UBYTE byte); +extern int PBI_XLD_enabled; +extern int PBI_XLD_v_enabled; +void PBI_XLD_VInit(int playback_freq, int num_pokeys, int bit16); +void PBI_XLD_VFrame(void); +void PBI_XLD_VProcess(void *sndbuffer, int sndn); +void PBI_XLD_StateSave(void); +void PBI_XLD_StateRead(void); +void PBI_XLD_votrax_busy_callback(int busy_status); + +#endif /* PBI_XLD_H_ */ diff --git a/PVAtari800/atari800-src/pcjoy.h b/PVAtari800/atari800-src/pcjoy.h new file mode 100644 index 0000000000..61ae793aff --- /dev/null +++ b/PVAtari800/atari800-src/pcjoy.h @@ -0,0 +1,17 @@ +/* joystick types for DOS port of David Firth's Atari800 emulator */ + +#define joy_off 0 +#define joy_analog 1 +#define joy_lpt1 2 +#define joy_lpt2 3 +#define joy_lpt3 4 +#define joy_keyset0 5 +#define joy_keyset1 6 +#define joy_keyset2 7 +#define joy_keyset3 8 + +#define JOYSTICKTYPES 9 + +char joyparams[JOYSTICKTYPES][10]={"OFF","PC","LPT1","LPT2", + "LPT3","KEYSET_0","KEYSET_1","KEYSET_2","KEYSET_3"}; + diff --git a/PVAtari800/atari800-src/pia.c b/PVAtari800/atari800-src/pia.c new file mode 100644 index 0000000000..f19de49529 --- /dev/null +++ b/PVAtari800/atari800-src/pia.c @@ -0,0 +1,221 @@ +/* + * pia.c - PIA chip emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" + +#include "atari.h" +#include "cpu.h" +#include "memory.h" +#include "pia.h" +#include "sio.h" +#ifdef XEP80_EMULATION +#include "xep80.h" +#endif +#ifndef BASIC +#include "input.h" +#include "statesav.h" +#endif + +UBYTE PIA_PACTL; +UBYTE PIA_PBCTL; +UBYTE PIA_PORTA; +UBYTE PIA_PORTB; +UBYTE PIA_PORT_input[2]; + +UBYTE PIA_PORTA_mask; +UBYTE PIA_PORTB_mask; + +int PIA_Initialise(int *argc, char *argv[]) +{ + PIA_PACTL = 0x3f; + PIA_PBCTL = 0x3f; + PIA_PORTA = 0xff; + PIA_PORTB = 0xff; + PIA_PORTA_mask = 0xff; + PIA_PORTB_mask = 0xff; + PIA_PORT_input[0] = 0xff; + PIA_PORT_input[1] = 0xff; + + return TRUE; +} + +void PIA_Reset(void) +{ + PIA_PORTA = 0xff; + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + MEMORY_HandlePORTB(0xff, (UBYTE) (PIA_PORTB | PIA_PORTB_mask)); + } + PIA_PORTB = 0xff; +} + +UBYTE PIA_GetByte(UWORD addr, int no_side_effects) +{ + switch (addr & 0x03) { + case PIA_OFFSET_PACTL: + return PIA_PACTL & 0x3f; + case PIA_OFFSET_PBCTL: + return PIA_PBCTL & 0x3f; + case PIA_OFFSET_PORTA: + if ((PIA_PACTL & 0x04) == 0) { + /* direction register */ + return ~PIA_PORTA_mask; + } + else { + /* port state */ +#ifdef XEP80_EMULATION + if (XEP80_enabled) { + return(XEP80_GetBit() & PIA_PORT_input[0] & (PIA_PORTA | PIA_PORTA_mask)); + } +#endif /* XEP80_EMULATION */ + return PIA_PORT_input[0] & (PIA_PORTA | PIA_PORTA_mask); + } + case PIA_OFFSET_PORTB: + if ((PIA_PBCTL & 0x04) == 0) { + /* direction register */ + return ~PIA_PORTB_mask; + } + else { + /* port state */ + if (!Atari800_machine_type != Atari800_MACHINE_XLXE) { + return PIA_PORTB | PIA_PORTB_mask; + } + else { + return PIA_PORT_input[1] & (PIA_PORTB | PIA_PORTB_mask); + } + } + } + /* for stupid compilers */ + return 0xff; +} + +void PIA_PutByte(UWORD addr, UBYTE byte) +{ + switch (addr & 0x03) { + case PIA_OFFSET_PACTL: + /* This code is part of the cassette emulation */ + /* The motor status has changed */ + SIO_TapeMotor(byte & 0x08 ? 0 : 1); + + PIA_PACTL = byte; + break; + case PIA_OFFSET_PBCTL: + /* This code is part of the serial I/O emulation */ + if ((PIA_PBCTL ^ byte) & 0x08) { + /* The command line status has changed */ + SIO_SwitchCommandFrame(byte & 0x08 ? 0 : 1); + } + PIA_PBCTL = byte; + break; + case PIA_OFFSET_PORTA: + if ((PIA_PACTL & 0x04) == 0) { + /* set direction register */ + PIA_PORTA_mask = ~byte; + } + else { + /* set output register */ +#ifdef XEP80_EMULATION + if (XEP80_enabled && (~PIA_PORTA_mask & 0x11)) { + XEP80_PutBit(byte); + } +#endif /* XEP80_EMULATION */ + PIA_PORTA = byte; /* change from thor */ + } +#ifndef BASIC + INPUT_SelectMultiJoy((PIA_PORTA | PIA_PORTA_mask) >> 4); +#endif + break; + case PIA_OFFSET_PORTB: + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + if ((PIA_PBCTL & 0x04) == 0) { + /* direction register */ + MEMORY_HandlePORTB((UBYTE) (PIA_PORTB | ~byte), (UBYTE) (PIA_PORTB | PIA_PORTB_mask)); + PIA_PORTB_mask = ~byte; + } + else { + /* output register */ + MEMORY_HandlePORTB((UBYTE) (byte | PIA_PORTB_mask), (UBYTE) (PIA_PORTB | PIA_PORTB_mask)); + PIA_PORTB = byte; + } + } + else { + if ((PIA_PBCTL & 0x04) == 0) { + /* direction register */ + PIA_PORTB_mask = ~byte; + } + else { + /* output register */ + PIA_PORTB = byte; + } + } + break; + } +} + +#ifndef BASIC + +void PIA_StateSave(void) +{ + StateSav_SaveUBYTE( &PIA_PACTL, 1 ); + StateSav_SaveUBYTE( &PIA_PBCTL, 1 ); + StateSav_SaveUBYTE( &PIA_PORTA, 1 ); + StateSav_SaveUBYTE( &PIA_PORTB, 1 ); + + StateSav_SaveUBYTE( &PIA_PORTA_mask, 1 ); + StateSav_SaveUBYTE( &PIA_PORTB_mask, 1 ); +} + +void PIA_StateRead(UBYTE version) +{ + UBYTE byte; + + StateSav_ReadUBYTE( &PIA_PACTL, 1 ); + SIO_TapeMotor(PIA_PACTL & 0x08 ? 0 : 1); + StateSav_ReadUBYTE( &byte, 1 ); + if ((PIA_PBCTL ^ byte) & 0x08) { + /* The command line status has changed. */ + SIO_SwitchCommandFrame(byte & 0x08 ? 0 : 1); + } + PIA_PBCTL = byte; + StateSav_ReadUBYTE( &PIA_PORTA, 1 ); + StateSav_ReadUBYTE( &PIA_PORTB, 1 ); + + /* In version 7 and later these variables are read in memory.c. */ + if (version <= 6) { + int Ram256; + StateSav_ReadINT( &MEMORY_xe_bank, 1 ); + StateSav_ReadINT( &MEMORY_selftest_enabled, 1 ); + StateSav_ReadINT( &Ram256, 1 ); + + if (Atari800_machine_type == Atari800_MACHINE_XLXE) { + if (Ram256 == 1 && MEMORY_ram_size == MEMORY_RAM_320_COMPY_SHOP) + MEMORY_ram_size = MEMORY_RAM_320_RAMBO; + } + StateSav_ReadINT( &MEMORY_cartA0BF_enabled, 1 ); + } + + StateSav_ReadUBYTE( &PIA_PORTA_mask, 1 ); + StateSav_ReadUBYTE( &PIA_PORTB_mask, 1 ); +} + +#endif /* BASIC */ diff --git a/PVAtari800/atari800-src/pia.h b/PVAtari800/atari800-src/pia.h new file mode 100644 index 0000000000..b43c90bcae --- /dev/null +++ b/PVAtari800/atari800-src/pia.h @@ -0,0 +1,26 @@ +#ifndef PIA_H_ +#define PIA_H_ + +#include "atari.h" + +#define PIA_OFFSET_PORTA 0x00 +#define PIA_OFFSET_PORTB 0x01 +#define PIA_OFFSET_PACTL 0x02 +#define PIA_OFFSET_PBCTL 0x03 + +extern UBYTE PIA_PACTL; +extern UBYTE PIA_PBCTL; +extern UBYTE PIA_PORTA; +extern UBYTE PIA_PORTB; +extern UBYTE PIA_PORTA_mask; +extern UBYTE PIA_PORTB_mask; +extern UBYTE PIA_PORT_input[2]; + +int PIA_Initialise(int *argc, char *argv[]); +void PIA_Reset(void); +UBYTE PIA_GetByte(UWORD addr, int no_side_effects); +void PIA_PutByte(UWORD addr, UBYTE byte); +void PIA_StateSave(void); +void PIA_StateRead(UBYTE version); + +#endif /* PIA_H_ */ diff --git a/PVAtari800/atari800-src/platform.h b/PVAtari800/atari800-src/platform.h new file mode 100644 index 0000000000..e9677cc56a --- /dev/null +++ b/PVAtari800/atari800-src/platform.h @@ -0,0 +1,175 @@ +#ifndef PLATFORM_H_ +#define PLATFORM_H_ + +#include "config.h" +#include +#include "atari.h" +#if SUPPORTS_CHANGE_VIDEOMODE +#include "videomode.h" +#endif +#if defined(SOUND) && defined(SOUND_THIN_API) +#include "sound.h" +#endif /* defined(SOUND) && defined(SOUND_THIN_API) */ + +/* This include file defines prototypes for platform-specific functions. */ + +int PLATFORM_Initialise(int *argc, char *argv[]); +int PLATFORM_Exit(int run_monitor); +int PLATFORM_Keyboard(void); +void PLATFORM_DisplayScreen(void); + +int PLATFORM_PORT(int num); +int PLATFORM_TRIG(int num); + +#ifdef SUPPORTS_PLATFORM_CONFIGINIT +/* This function sets the configuration parameters to default values */ +void PLATFORM_ConfigInit(void); +#endif + +#ifdef SUPPORTS_PLATFORM_CONFIGURE +/* This procedure processes lines not recognized by RtConfigLoad. */ +int PLATFORM_Configure(char *option, char *parameters); +#endif + +#ifdef SUPPORTS_PLATFORM_CONFIGSAVE +/* This function saves additional config lines */ +void PLATFORM_ConfigSave(FILE *fp); +#endif + +#ifdef SUPPORTS_PLATFORM_PALETTEUPDATE +/* This function updates the palette */ +/* If the platform does a conversion of colortable when it initialises + * and the user changes colortable (such as changing from PAL to NTSC) + * then this function should update the platform palette */ +void PLATFORM_PaletteUpdate(void); +#endif + +#ifdef SUPPORTS_PLATFORM_SLEEP +/* This function is for those ports that need their own version of sleep */ +void PLATFORM_Sleep(double s); +#endif + +#ifdef SUPPORTS_PLATFORM_TIME +/* This function is for those ports that need their own version of sleep */ +double PLATFORM_Time(void); +#endif + +#ifdef USE_CURSES +void curses_clear_screen(void); + +void curses_clear_rectangle(int x1, int y1, int x2, int y2); + +void curses_putch(int x, int y, int ascii, UBYTE fg, UBYTE bg); + +void curses_display_line(int anticmode, const UBYTE *screendata); +#endif + +#ifdef GUI_SDL +/* used in UI to show how the keyboard joystick is mapped */ +extern int PLATFORM_kbd_joy_0_enabled; +extern int PLATFORM_kbd_joy_1_enabled; +int PLATFORM_GetRawKey(void); +#endif /* GUI_SDL */ + +#ifdef DIRECTX +int PLATFORM_GetKeyName(void); +#endif + +#if SUPPORTS_CHANGE_VIDEOMODE +/* Returns whether the platform-specific code support the given display mode, MODE, + with/without stretching and with/without rotation. */ +int PLATFORM_SupportsVideomode(VIDEOMODE_MODE_t mode, int stretch, int rotate90); +/* Sets the screen (or window, if WINDOWED is TRUE) to resolution RES and + selects the display mode, MODE. If ROTATE90 is TRUE, then the display area + is rotated 90 degrees counter-clockwise. */ +void PLATFORM_SetVideoMode(VIDEOMODE_resolution_t const *res, int windowed, VIDEOMODE_MODE_t mode, int rotate90); +/* Returns list of all available resolutions. The result points to a newly + allocated memory. If no resolutions are found, the result is NULL and no + memory is allocated. Entries on the list may repeat.*/ +VIDEOMODE_resolution_t *PLATFORM_AvailableResolutions(unsigned int *size); +/* Returns the current desktop resolution. Used to compute pixel aspect ratio in windowed modes. */ +VIDEOMODE_resolution_t *PLATFORM_DesktopResolution(void); +/* When in windowed mode, returns whether the application window is maximised. */ +int PLATFORM_WindowMaximised(void); + +#endif /* SUPPORTS_CHANGE_VIDEOMODE */ + +#ifdef PLATFORM_MAP_PALETTE +typedef struct PLATFORM_pixel_format_t { + int bpp; /* Current bits per pixel */ + ULONG rmask; + ULONG gmask; + ULONG bmask; +} PLATFORM_pixel_format_t; +/* Returns parameters of the current display pixel format. Used when computing + lookup tables used for blitting the Atari screen to display surface. */ +void PLATFORM_GetPixelFormat(PLATFORM_pixel_format_t *format);/* Can be 8, 16, 32 */ + +/* Convert a table of RGB values, PALETTE, of size SIZE, to a display's native + format and store it in the lookup table DEST. */ +void PLATFORM_MapRGB(void *dest, int const *palette, int size); +#endif /* PLATFORM_MAP_PALETTE */ + +#if defined(SOUND) && defined(SOUND_THIN_API) +/* PLATFORM_SoundSetup opens the hardware sound output with parameters + set beforehand in Sound_out. The implementation If the code decides so, + the actual setup with which audio output is opened may differ from the + provided ones. In such case Sound_out will be modified accordingly. + The function returns TRUE if it successfully opened the sound output - in such + case the caller should set Sound_enabled to TRUE. Sound output is initially + paused - caller should call PLATFORM_SoundContinue to start sound output. + When opening failed, the function returns FALSE - in this case the caller + should set Sound_enabled to FALSE and not attempt to generate any sound. + Calling PLATFORM_SoundSetup again with Sound_out unmodified since the + previous call to the function, is guaranteed to not change them further - + after all, they had been determined to be OK (or modified to be OK) at the + previous call. + PLATFORM_SoundSetup may be called multiple times without calling + PLATFORM_SoundExit inbetween. */ +int PLATFORM_SoundSetup(Sound_setup_t *setup); + +/* PLATFORM_SoundExit is the reverse of PLATFORM_SoundSetup. It closes the + sound output completely. + The function will be called only if the last call to PLATFORM_SoundSetup + returned TRUE (ie. iff Sound_enabled == TRUE). */ +void PLATFORM_SoundExit(void); + +/* PLATFORM_SoundPause pauses the sound output. + The function will be called only if the last call to PLATFORM_SoundSetup + returned TRUE (ie. iff Sound_enabled == TRUE) and only when sound is + unpaused (ie. after PLATFORM_SoundContinue). */ +void PLATFORM_SoundPause(void); + +/* PLATFORM_SoundContinue unpauses the sound output. + The function will be called only if the last call to PLATFORM_SoundSetup + returned TRUE (ie. iff Sound_enabled == TRUE) and only when sound is paused + (ie. straight after PLATFORM_SoundSetup or after PLATFORM_SoundPause). */ +void PLATFORM_SoundContinue(void); + +#ifdef SOUND_CALLBACK +/* Data from sound buffer is sent to output device by calling Sound_Callback + in a separate thread. These two functions must be used in the main thread to + synchronise access to variables accessed by Sound_Callback. */ +void PLATFORM_SoundLock(void); +void PLATFORM_SoundUnlock(void); +#else /* !SOUND_CALLBACK */ + +/* Return number of bytes that can be written to the output device without + blocking. If it is equal or larger than + Sound_out.frag_frames*channels*sample_size, it probably means that sound + underflow has occurred. */ +unsigned int PLATFORM_SoundAvailable(void); + +/* Write contents of *BUFFER to audio output device. SIZE is the size of BUFFER. + SIZE must not be greater than + Sound_out.frag_frames*Sound_out.channels*Sound_out.sample_size. */ +void PLATFORM_SoundWrite(UBYTE const *buffer, unsigned int size); + +/* Dummy functions, not needed with no SOUND_CALLBACK. */ +#define PLATFORM_SoundLock() {} +#define PLATFORM_SoundUnlock() {} + +#endif /* !SOUND_CALLBACK */ +#endif /* defined(SOUND) && defined(SOUND_THIN_API) */ + +#endif /* PLATFORM_H_ */ diff --git a/PVAtari800/atari800-src/pokey.c b/PVAtari800/atari800-src/pokey.c new file mode 100644 index 0000000000..c04891fb1e --- /dev/null +++ b/PVAtari800/atari800-src/pokey.c @@ -0,0 +1,693 @@ +/* + * pokey.c - POKEY sound chip emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif + +#include "atari.h" +#include "cpu.h" +#include "esc.h" +#include "pia.h" +#include "pokey.h" +#include "gtia.h" +#include "sio.h" +#ifndef BASIC +#include "input.h" +#include "statesav.h" +#endif +#ifdef SOUND +#include "pokeysnd.h" +#endif +#include "antic.h" +#include "cassette.h" +#include "log.h" +#include "input.h" +#include "pbi.h" + +#ifdef VOICEBOX +#include "voicebox.h" +#include "votraxsnd.h" +#endif + +#ifdef POKEY_UPDATE +void pokey_update(void); +#endif + +UBYTE POKEY_KBCODE; +UBYTE POKEY_SERIN; +UBYTE POKEY_IRQST; +UBYTE POKEY_IRQEN; +UBYTE POKEY_SKSTAT; +UBYTE POKEY_SKCTL; +int POKEY_DELAYED_SERIN_IRQ; +int POKEY_DELAYED_SEROUT_IRQ; +int POKEY_DELAYED_XMTDONE_IRQ; + +/* structures to hold the 9 pokey control bytes */ +UBYTE POKEY_AUDF[4 * POKEY_MAXPOKEYS]; /* AUDFx (D200, D202, D204, D206) */ +UBYTE POKEY_AUDC[4 * POKEY_MAXPOKEYS]; /* AUDCx (D201, D203, D205, D207) */ +UBYTE POKEY_AUDCTL[POKEY_MAXPOKEYS]; /* AUDCTL (D208) */ +int POKEY_DivNIRQ[4], POKEY_DivNMax[4]; +int POKEY_Base_mult[POKEY_MAXPOKEYS]; /* selects either 64Khz or 15Khz clock mult */ + +UBYTE POKEY_POT_input[8] = {228, 228, 228, 228, 228, 228, 228, 228}; +static int pot_scanline; + +UBYTE POKEY_poly9_lookup[511]; +UBYTE POKEY_poly17_lookup[16385]; +static ULONG random_scanline_counter; + +ULONG POKEY_GetRandomCounter(void) +{ + return random_scanline_counter; +} + +void POKEY_SetRandomCounter(ULONG value) +{ + random_scanline_counter = value; +} + +UBYTE POKEY_GetByte(UWORD addr, int no_side_effects) +{ + UBYTE byte = 0xff; + +#ifdef STEREO_SOUND + if (addr & 0x0010 && POKEYSND_stereo_enabled) + return 0; +#endif + addr &= 0x0f; + if (addr < 8) { + byte = POKEY_POT_input[addr]; + if (byte <= pot_scanline) + return byte; + return pot_scanline; + } + switch (addr) { + case POKEY_OFFSET_ALLPOT: + { + int i; + for (i = 0; i < 8; i++) + if (POKEY_POT_input[i] <= pot_scanline) + byte &= ~(1 << i); /* reset bit if pot value known */ + } + break; + case POKEY_OFFSET_KBCODE: + byte = POKEY_KBCODE; + break; + case POKEY_OFFSET_RANDOM: + if ((POKEY_SKCTL & 0x03) != 0) { + int i = random_scanline_counter + ANTIC_XPOS; + if (POKEY_AUDCTL[0] & POKEY_POLY9) + byte = POKEY_poly9_lookup[i % POKEY_POLY9_SIZE]; + else { + const UBYTE *ptr; + i %= POKEY_POLY17_SIZE; + ptr = POKEY_poly17_lookup + (i >> 3); + i &= 7; + byte = (UBYTE) ((ptr[0] >> i) + (ptr[1] << (8 - i))); + } + } + break; + case POKEY_OFFSET_SERIN: + byte = POKEY_SERIN; +#ifdef DEBUG3 + printf("SERIO: SERIN read, bytevalue %02x\n", POKEY_SERIN); +#endif +#ifdef SERIO_SOUND + POKEYSND_UpdateSerio(0,byte); +#endif + break; + case POKEY_OFFSET_IRQST: + byte = POKEY_IRQST; + break; + case POKEY_OFFSET_SKSTAT: + byte = POKEY_SKSTAT + (CASSETTE_IOLineStatus() << 4); +#ifdef VOICEBOX + if (VOICEBOX_enabled) { + byte = POKEY_SKSTAT + (VOTRAXSND_busy << 4); + } +#endif + break; + } + + return byte; +} + +static void Update_Counter(int chan_mask); + +static int POKEY_siocheck(void) +{ + return (((POKEY_AUDF[POKEY_CHAN3] == 0x28 || POKEY_AUDF[POKEY_CHAN3] == 0x10 + || POKEY_AUDF[POKEY_CHAN3] == 0x08 || POKEY_AUDF[POKEY_CHAN3] == 0x0a) + && POKEY_AUDF[POKEY_CHAN4] == 0x00) /* intelligent peripherals speeds */ + || (POKEY_SKCTL & 0x78) == 0x28) /* cassette save mode */ + && (POKEY_AUDCTL[0] & 0x28) == 0x28; +} + +#ifndef SOUND_GAIN /* sound gain can be pre-defined in the configure/Makefile */ +#define SOUND_GAIN 4 +#endif + +#ifndef SOUND +#define POKEYSND_Update(addr, val, chip, gain) +#endif + +void POKEY_PutByte(UWORD addr, UBYTE byte) +{ +#ifdef STEREO_SOUND + addr &= POKEYSND_stereo_enabled ? 0x1f : 0x0f; +#else + addr &= 0x0f; +#endif + switch (addr) { + case POKEY_OFFSET_AUDC1: + POKEY_AUDC[POKEY_CHAN1] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC1, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDC2: + POKEY_AUDC[POKEY_CHAN2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC2, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDC3: + POKEY_AUDC[POKEY_CHAN3] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC3, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDC4: + POKEY_AUDC[POKEY_CHAN4] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC4, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDCTL: + POKEY_AUDCTL[0] = byte; + + /* determine the base multiplier for the 'div by n' calculations */ + if (byte & POKEY_CLOCK_15) + POKEY_Base_mult[0] = POKEY_DIV_15; + else + POKEY_Base_mult[0] = POKEY_DIV_64; + + Update_Counter((1 << POKEY_CHAN1) | (1 << POKEY_CHAN2) | (1 << POKEY_CHAN3) | (1 << POKEY_CHAN4)); + POKEYSND_Update(POKEY_OFFSET_AUDCTL, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF1: + POKEY_AUDF[POKEY_CHAN1] = byte; + Update_Counter((POKEY_AUDCTL[0] & POKEY_CH1_CH2) ? ((1 << POKEY_CHAN2) | (1 << POKEY_CHAN1)) : (1 << POKEY_CHAN1)); + POKEYSND_Update(POKEY_OFFSET_AUDF1, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF2: + POKEY_AUDF[POKEY_CHAN2] = byte; + Update_Counter(1 << POKEY_CHAN2); + POKEYSND_Update(POKEY_OFFSET_AUDF2, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF3: + POKEY_AUDF[POKEY_CHAN3] = byte; + Update_Counter((POKEY_AUDCTL[0] & POKEY_CH3_CH4) ? ((1 << POKEY_CHAN4) | (1 << POKEY_CHAN3)) : (1 << POKEY_CHAN3)); + POKEYSND_Update(POKEY_OFFSET_AUDF3, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF4: + POKEY_AUDF[POKEY_CHAN4] = byte; + Update_Counter(1 << POKEY_CHAN4); + POKEYSND_Update(POKEY_OFFSET_AUDF4, byte, 0, SOUND_GAIN); + break; + case POKEY_OFFSET_IRQEN: + POKEY_IRQEN = byte; +#ifdef DEBUG1 + printf("WR: IRQEN = %x, PC = %x\n", POKEY_IRQEN, PC); +#endif + POKEY_IRQST |= ~byte & 0xf7; /* Reset disabled IRQs except XMTDONE */ + if ((~POKEY_IRQST & POKEY_IRQEN) == 0 && PBI_IRQ == 0) + CPU_IRQ = 0; + else + CPU_GenerateIRQ(); + break; + case POKEY_OFFSET_SKRES: + POKEY_SKSTAT |= 0xe0; + break; + case POKEY_OFFSET_POTGO: + if (!(POKEY_SKCTL & 4)) + pot_scanline = 0; /* slow pot mode */ + break; + case POKEY_OFFSET_SEROUT: +#ifdef VOICEBOX + VOICEBOX_SEROUTPutByte(byte); +#endif + if ((POKEY_SKCTL & 0x70) == 0x20 && POKEY_siocheck()) + SIO_PutByte(byte); + /* check if cassette 2-tone mode has been enabled */ + if ((POKEY_SKCTL & 0x08) == 0x00) { + /* intelligent device */ + POKEY_DELAYED_SEROUT_IRQ = SIO_SEROUT_INTERVAL; + POKEY_IRQST |= 0x08; + POKEY_DELAYED_XMTDONE_IRQ = SIO_XMTDONE_INTERVAL; + } + else { + /* cassette */ + /* some savers patch the cassette baud rate, so we evaluate it here */ + /* scanlines per second*10 bit*audiofrequency/(1.79 MHz/2) */ + POKEY_DELAYED_SEROUT_IRQ = 312*50*10*(POKEY_AUDF[POKEY_CHAN3] + POKEY_AUDF[POKEY_CHAN4]*0x100)/895000; + /* safety check */ + if (POKEY_DELAYED_SEROUT_IRQ >= 3) { + POKEY_IRQST |= 0x08; + POKEY_DELAYED_XMTDONE_IRQ = 2*POKEY_DELAYED_SEROUT_IRQ - 2; + } + else { + POKEY_DELAYED_SEROUT_IRQ = 0; + POKEY_DELAYED_XMTDONE_IRQ = 0; + } + }; +#ifdef SERIO_SOUND + POKEYSND_UpdateSerio(1, byte); +#endif + break; + case POKEY_OFFSET_STIMER: + POKEY_DivNIRQ[POKEY_CHAN1] = POKEY_DivNMax[POKEY_CHAN1]; + POKEY_DivNIRQ[POKEY_CHAN2] = POKEY_DivNMax[POKEY_CHAN2]; + POKEY_DivNIRQ[POKEY_CHAN4] = POKEY_DivNMax[POKEY_CHAN4]; + POKEYSND_Update(POKEY_OFFSET_STIMER, byte, 0, SOUND_GAIN); +#ifdef DEBUG1 + printf("WR: STIMER = %x\n", byte); +#endif + break; + case POKEY_OFFSET_SKCTL: +#ifdef VOICEBOX + VOICEBOX_SKCTLPutByte(byte); +#endif + POKEY_SKCTL = byte; + POKEYSND_Update(POKEY_OFFSET_SKCTL, byte, 0, SOUND_GAIN); + if (byte & 4) + pot_scanline = 228; /* fast pot mode - return results immediately */ + if ((byte & 0x03) == 0) { + /* POKEY reset. */ + /* Stop serial IO. */ + POKEY_DELAYED_SERIN_IRQ = 0; + POKEY_DELAYED_SEROUT_IRQ = 0; + POKEY_DELAYED_XMTDONE_IRQ = 0; + CASSETTE_ResetPOKEY(); + /* TODO other registers should also be reset. */ + } + break; +#ifdef STEREO_SOUND + case POKEY_OFFSET_AUDC1 + POKEY_OFFSET_POKEY2: + POKEY_AUDC[POKEY_CHAN1 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC1, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDC2 + POKEY_OFFSET_POKEY2: + POKEY_AUDC[POKEY_CHAN2 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC2, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDC3 + POKEY_OFFSET_POKEY2: + POKEY_AUDC[POKEY_CHAN3 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC3, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDC4 + POKEY_OFFSET_POKEY2: + POKEY_AUDC[POKEY_CHAN4 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDC4, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDCTL + POKEY_OFFSET_POKEY2: + POKEY_AUDCTL[1] = byte; + /* determine the base multiplier for the 'div by n' calculations */ + if (byte & POKEY_CLOCK_15) + POKEY_Base_mult[1] = POKEY_DIV_15; + else + POKEY_Base_mult[1] = POKEY_DIV_64; + + POKEYSND_Update(POKEY_OFFSET_AUDCTL, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF1 + POKEY_OFFSET_POKEY2: + POKEY_AUDF[POKEY_CHAN1 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDF1, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF2 + POKEY_OFFSET_POKEY2: + POKEY_AUDF[POKEY_CHAN2 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDF2, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF3 + POKEY_OFFSET_POKEY2: + POKEY_AUDF[POKEY_CHAN3 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDF3, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_AUDF4 + POKEY_OFFSET_POKEY2: + POKEY_AUDF[POKEY_CHAN4 + POKEY_CHIP2] = byte; + POKEYSND_Update(POKEY_OFFSET_AUDF4, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_STIMER + POKEY_OFFSET_POKEY2: + POKEYSND_Update(POKEY_OFFSET_STIMER, byte, 1, SOUND_GAIN); + break; + case POKEY_OFFSET_SKCTL + POKEY_OFFSET_POKEY2: + POKEYSND_Update(POKEY_OFFSET_SKCTL, byte, 1, SOUND_GAIN); + break; +#endif + } +} + +int POKEY_Initialise(int *argc, char *argv[]) +{ + int i; + ULONG reg; + + /* Initialise Serial Port Interrupts */ + POKEY_DELAYED_SERIN_IRQ = 0; + POKEY_DELAYED_SEROUT_IRQ = 0; + POKEY_DELAYED_XMTDONE_IRQ = 0; + + POKEY_KBCODE = 0xff; + POKEY_SERIN = 0x00; /* or 0xff ? */ + POKEY_IRQST = 0xff; + POKEY_IRQEN = 0x00; + POKEY_SKSTAT = 0xef; + POKEY_SKCTL = 0x00; + + for (i = 0; i < (POKEY_MAXPOKEYS * 4); i++) { + POKEY_AUDC[i] = 0; + POKEY_AUDF[i] = 0; + } + + for (i = 0; i < POKEY_MAXPOKEYS; i++) { + POKEY_AUDCTL[i] = 0; + POKEY_Base_mult[i] = POKEY_DIV_64; + } + + for (i = 0; i < 4; i++) + POKEY_DivNIRQ[i] = POKEY_DivNMax[i] = 0; + + pot_scanline = 0; + + /* initialise poly9_lookup */ + reg = 0x1ff; + for (i = 0; i < 511; i++) { + reg = ((((reg >> 5) ^ reg) & 1) << 8) + (reg >> 1); + POKEY_poly9_lookup[i] = (UBYTE) reg; + } + /* initialise poly17_lookup */ + reg = 0x1ffff; + for (i = 0; i < 16385; i++) { + reg = ((((reg >> 5) ^ reg) & 0xff) << 9) + (reg >> 8); + POKEY_poly17_lookup[i] = (UBYTE) (reg >> 1); + } + +#ifndef BASIC + if (INPUT_Playingback()) { + random_scanline_counter = INPUT_PlaybackInt(); + } + else +#endif + { + random_scanline_counter = +#ifdef HAVE_WINDOWS_H + GetTickCount() % POKEY_POLY17_SIZE; +#elif defined(HAVE_TIME) + time(NULL) % POKEY_POLY17_SIZE; +#else + 0; +#endif + } +#ifndef BASIC + if (INPUT_Recording()) { + INPUT_RecordInt(random_scanline_counter); + } +#endif + + return TRUE; +} + +void POKEY_Frame(void) +{ + random_scanline_counter %= (POKEY_AUDCTL[0] & POKEY_POLY9) ? POKEY_POLY9_SIZE : POKEY_POLY17_SIZE; +} + +/*************************************************************************** + ** Generate POKEY Timer IRQs if required ** + ** called on a per-scanline basis, not very precise, but good enough ** + ** for most applications ** + ***************************************************************************/ + +void POKEY_Scanline(void) +{ +#ifdef POKEY_UPDATE + pokey_update(); +#endif + +#ifdef VOL_ONLY_SOUND + POKEYSND_UpdateVolOnly(); +#endif + +#ifndef BASIC + INPUT_Scanline(); /* Handle Amiga and ST mice. */ + /* It's not a part of POKEY emulation, */ + /* but it looks to be the best place to put it. */ +#endif + + /* on nonpatched i/o-operation, enable the cassette timing */ + if (!ESC_enable_sio_patch) { + if (CASSETTE_AddScanLine()) + POKEY_DELAYED_SERIN_IRQ = 1; + } + + if ((POKEY_SKCTL & 0x03) == 0) + /* Don't process timers when POKEY is in reset mode. */ + return; + + if (pot_scanline < 228) + pot_scanline++; + + random_scanline_counter += ANTIC_LINE_C; + + if (POKEY_DELAYED_SERIN_IRQ > 0) { + if (--POKEY_DELAYED_SERIN_IRQ == 0) { + /* Load a byte to SERIN - even when the IRQ is disabled. */ + POKEY_SERIN = SIO_GetByte(); + if (POKEY_IRQEN & 0x20) { + if (POKEY_IRQST & 0x20) { + POKEY_IRQST &= 0xdf; +#ifdef DEBUG2 + printf("SERIO: SERIN Interrupt triggered, bytevalue %02x\n", POKEY_SERIN); +#endif + } + else { + POKEY_SKSTAT &= 0xdf; +#ifdef DEBUG2 + printf("SERIO: SERIN Interrupt triggered, bytevalue %02x\n", POKEY_SERIN); +#endif + } + CPU_GenerateIRQ(); + } +#ifdef DEBUG2 + else { + printf("SERIO: SERIN Interrupt missed, bytevalue %02x\n", POKEY_SERIN); + } +#endif + } + } + + if (POKEY_DELAYED_SEROUT_IRQ > 0) { + if (--POKEY_DELAYED_SEROUT_IRQ == 0) { + if (POKEY_IRQEN & 0x10) { +#ifdef DEBUG2 + printf("SERIO: SEROUT Interrupt triggered\n"); +#endif + POKEY_IRQST &= 0xef; + CPU_GenerateIRQ(); + } +#ifdef DEBUG2 + else { + printf("SERIO: SEROUT Interrupt missed\n"); + } +#endif + } + } + + if (POKEY_DELAYED_XMTDONE_IRQ > 0) + if (--POKEY_DELAYED_XMTDONE_IRQ == 0) { + POKEY_IRQST &= 0xf7; + if (POKEY_IRQEN & 0x08) { +#ifdef DEBUG2 + printf("SERIO: XMTDONE Interrupt triggered\n"); +#endif + CPU_GenerateIRQ(); + } +#ifdef DEBUG2 + else + printf("SERIO: XMTDONE Interrupt missed\n"); +#endif + } + + if ((POKEY_DivNIRQ[POKEY_CHAN1] -= ANTIC_LINE_C) < 0 ) { + POKEY_DivNIRQ[POKEY_CHAN1] += POKEY_DivNMax[POKEY_CHAN1]; + if (POKEY_IRQEN & 0x01) { + POKEY_IRQST &= 0xfe; + CPU_GenerateIRQ(); + } + } + + if ((POKEY_DivNIRQ[POKEY_CHAN2] -= ANTIC_LINE_C) < 0 ) { + POKEY_DivNIRQ[POKEY_CHAN2] += POKEY_DivNMax[POKEY_CHAN2]; + if (POKEY_IRQEN & 0x02) { + POKEY_IRQST &= 0xfd; + CPU_GenerateIRQ(); + } + } + + if ((POKEY_DivNIRQ[POKEY_CHAN4] -= ANTIC_LINE_C) < 0 ) { + POKEY_DivNIRQ[POKEY_CHAN4] += POKEY_DivNMax[POKEY_CHAN4]; + if (POKEY_IRQEN & 0x04) { + POKEY_IRQST &= 0xfb; + CPU_GenerateIRQ(); + } + } +} + +/*****************************************************************************/ +/* Module: Update_Counter() */ +/* Purpose: To process the latest control values stored in the AUDF, AUDC, */ +/* and AUDCTL registers. It pre-calculates as much information as */ +/* possible for better performance. This routine has been added */ +/* here again as I need the precise frequency for the pokey timers */ +/* again. The pokey emulation is therefore somewhat sub-optimal */ +/* since the actual pokey emulation should grab the frequency values */ +/* directly from here instead of calculating them again. */ +/* */ +/* Author: Ron Fries,Thomas Richter */ +/* Date: March 27, 1998 */ +/* */ +/* Inputs: chan_mask: Channel mask, one bit per channel. */ +/* The channels that need to be updated */ +/* */ +/* Outputs: Adjusts local globals - no return value */ +/* */ +/*****************************************************************************/ + +static void Update_Counter(int chan_mask) +{ + +/************************************************************/ +/* As defined in the manual, the exact Div_n_cnt values are */ +/* different depending on the frequency and resolution: */ +/* 64 kHz or 15 kHz - AUDF + 1 */ +/* 1 MHz, 8-bit - AUDF + 4 */ +/* 1 MHz, 16-bit - AUDF[CHAN1]+256*AUDF[CHAN2] + 7 */ +/************************************************************/ + + /* only reset the channels that have changed */ + + if (chan_mask & (1 << POKEY_CHAN1)) { + /* process channel 1 frequency */ + if (POKEY_AUDCTL[0] & POKEY_CH1_179) + POKEY_DivNMax[POKEY_CHAN1] = POKEY_AUDF[POKEY_CHAN1] + 4; + else + POKEY_DivNMax[POKEY_CHAN1] = (POKEY_AUDF[POKEY_CHAN1] + 1) * POKEY_Base_mult[0]; + if (POKEY_DivNMax[POKEY_CHAN1] < ANTIC_LINE_C) + POKEY_DivNMax[POKEY_CHAN1] = ANTIC_LINE_C; + } + + if (chan_mask & (1 << POKEY_CHAN2)) { + /* process channel 2 frequency */ + if (POKEY_AUDCTL[0] & POKEY_CH1_CH2) { + if (POKEY_AUDCTL[0] & POKEY_CH1_179) + POKEY_DivNMax[POKEY_CHAN2] = POKEY_AUDF[POKEY_CHAN2] * 256 + POKEY_AUDF[POKEY_CHAN1] + 7; + else + POKEY_DivNMax[POKEY_CHAN2] = (POKEY_AUDF[POKEY_CHAN2] * 256 + POKEY_AUDF[POKEY_CHAN1] + 1) * POKEY_Base_mult[0]; + } + else + POKEY_DivNMax[POKEY_CHAN2] = (POKEY_AUDF[POKEY_CHAN2] + 1) * POKEY_Base_mult[0]; + if (POKEY_DivNMax[POKEY_CHAN2] < ANTIC_LINE_C) + POKEY_DivNMax[POKEY_CHAN2] = ANTIC_LINE_C; + } + + if (chan_mask & (1 << POKEY_CHAN4)) { + /* process channel 4 frequency */ + if (POKEY_AUDCTL[0] & POKEY_CH3_CH4) { + if (POKEY_AUDCTL[0] & POKEY_CH3_179) + POKEY_DivNMax[POKEY_CHAN4] = POKEY_AUDF[POKEY_CHAN4] * 256 + POKEY_AUDF[POKEY_CHAN3] + 7; + else + POKEY_DivNMax[POKEY_CHAN4] = (POKEY_AUDF[POKEY_CHAN4] * 256 + POKEY_AUDF[POKEY_CHAN3] + 1) * POKEY_Base_mult[0]; + } + else + POKEY_DivNMax[POKEY_CHAN4] = (POKEY_AUDF[POKEY_CHAN4] + 1) * POKEY_Base_mult[0]; + if (POKEY_DivNMax[POKEY_CHAN4] < ANTIC_LINE_C) + POKEY_DivNMax[POKEY_CHAN4] = ANTIC_LINE_C; + } +} + +#ifndef BASIC + +void POKEY_StateSave(void) +{ + int shift_key = 0; + int keypressed = 0; + + StateSav_SaveUBYTE(&POKEY_KBCODE, 1); + StateSav_SaveUBYTE(&POKEY_IRQST, 1); + StateSav_SaveUBYTE(&POKEY_IRQEN, 1); + StateSav_SaveUBYTE(&POKEY_SKCTL, 1); + + StateSav_SaveINT(&shift_key, 1); + StateSav_SaveINT(&keypressed, 1); + StateSav_SaveINT(&POKEY_DELAYED_SERIN_IRQ, 1); + StateSav_SaveINT(&POKEY_DELAYED_SEROUT_IRQ, 1); + StateSav_SaveINT(&POKEY_DELAYED_XMTDONE_IRQ, 1); + + StateSav_SaveUBYTE(&POKEY_AUDF[0], 4); + StateSav_SaveUBYTE(&POKEY_AUDC[0], 4); + StateSav_SaveUBYTE(&POKEY_AUDCTL[0], 1); + + StateSav_SaveINT(&POKEY_DivNIRQ[0], 4); + StateSav_SaveINT(&POKEY_DivNMax[0], 4); + StateSav_SaveINT(&POKEY_Base_mult[0], 1); +} + +void POKEY_StateRead(void) +{ + int i; + int shift_key; + int keypressed; + + StateSav_ReadUBYTE(&POKEY_KBCODE, 1); + StateSav_ReadUBYTE(&POKEY_IRQST, 1); + StateSav_ReadUBYTE(&POKEY_IRQEN, 1); + StateSav_ReadUBYTE(&POKEY_SKCTL, 1); + + StateSav_ReadINT(&shift_key, 1); + StateSav_ReadINT(&keypressed, 1); + StateSav_ReadINT(&POKEY_DELAYED_SERIN_IRQ, 1); + StateSav_ReadINT(&POKEY_DELAYED_SEROUT_IRQ, 1); + StateSav_ReadINT(&POKEY_DELAYED_XMTDONE_IRQ, 1); + + StateSav_ReadUBYTE(&POKEY_AUDF[0], 4); + StateSav_ReadUBYTE(&POKEY_AUDC[0], 4); + StateSav_ReadUBYTE(&POKEY_AUDCTL[0], 1); + for (i = 0; i < 4; i++) { + POKEY_PutByte((UWORD) (POKEY_OFFSET_AUDF1 + i * 2), POKEY_AUDF[i]); + POKEY_PutByte((UWORD) (POKEY_OFFSET_AUDC1 + i * 2), POKEY_AUDC[i]); + } + POKEY_PutByte(POKEY_OFFSET_AUDCTL, POKEY_AUDCTL[0]); + + StateSav_ReadINT(&POKEY_DivNIRQ[0], 4); + StateSav_ReadINT(&POKEY_DivNMax[0], 4); + StateSav_ReadINT(&POKEY_Base_mult[0], 1); +} + +#endif diff --git a/PVAtari800/atari800-src/pokey.h b/PVAtari800/atari800-src/pokey.h new file mode 100644 index 0000000000..b4fa847b4d --- /dev/null +++ b/PVAtari800/atari800-src/pokey.h @@ -0,0 +1,122 @@ +#ifndef POKEY_H_ +#define POKEY_H_ + +#ifdef ASAP /* external project, see http://asap.sf.net */ +#include "asap_internal.h" +#else +#include "atari.h" +#endif + +#define POKEY_OFFSET_AUDF1 0x00 +#define POKEY_OFFSET_AUDC1 0x01 +#define POKEY_OFFSET_AUDF2 0x02 +#define POKEY_OFFSET_AUDC2 0x03 +#define POKEY_OFFSET_AUDF3 0x04 +#define POKEY_OFFSET_AUDC3 0x05 +#define POKEY_OFFSET_AUDF4 0x06 +#define POKEY_OFFSET_AUDC4 0x07 +#define POKEY_OFFSET_AUDCTL 0x08 +#define POKEY_OFFSET_STIMER 0x09 +#define POKEY_OFFSET_SKRES 0x0a +#define POKEY_OFFSET_POTGO 0x0b +#define POKEY_OFFSET_SEROUT 0x0d +#define POKEY_OFFSET_IRQEN 0x0e +#define POKEY_OFFSET_SKCTL 0x0f + +#define POKEY_OFFSET_POT0 0x00 +#define POKEY_OFFSET_POT1 0x01 +#define POKEY_OFFSET_POT2 0x02 +#define POKEY_OFFSET_POT3 0x03 +#define POKEY_OFFSET_POT4 0x04 +#define POKEY_OFFSET_POT5 0x05 +#define POKEY_OFFSET_POT6 0x06 +#define POKEY_OFFSET_POT7 0x07 +#define POKEY_OFFSET_ALLPOT 0x08 +#define POKEY_OFFSET_KBCODE 0x09 +#define POKEY_OFFSET_RANDOM 0x0a +#define POKEY_OFFSET_SERIN 0x0d +#define POKEY_OFFSET_IRQST 0x0e +#define POKEY_OFFSET_SKSTAT 0x0f + +#define POKEY_OFFSET_POKEY2 0x10 /* offset to second pokey chip (STEREO expansion) */ + +#ifndef ASAP + +extern UBYTE POKEY_KBCODE; +extern UBYTE POKEY_IRQST; +extern UBYTE POKEY_IRQEN; +extern UBYTE POKEY_SKSTAT; +extern UBYTE POKEY_SKCTL; +extern int POKEY_DELAYED_SERIN_IRQ; +extern int POKEY_DELAYED_SEROUT_IRQ; +extern int POKEY_DELAYED_XMTDONE_IRQ; + +extern UBYTE POKEY_POT_input[8]; + +ULONG POKEY_GetRandomCounter(void); +void POKEY_SetRandomCounter(ULONG value); +UBYTE POKEY_GetByte(UWORD addr, int no_side_effects); +void POKEY_PutByte(UWORD addr, UBYTE byte); +int POKEY_Initialise(int *argc, char *argv[]); +void POKEY_Frame(void); +void POKEY_Scanline(void); +void POKEY_StateSave(void); +void POKEY_StateRead(void); + +#endif + +/* CONSTANT DEFINITIONS */ + +/* definitions for AUDCx (D201, D203, D205, D207) */ +#define POKEY_NOTPOLY5 0x80 /* selects POLY5 or direct CLOCK */ +#define POKEY_POLY4 0x40 /* selects POLY4 or POLY17 */ +#define POKEY_PURETONE 0x20 /* selects POLY4/17 or PURE tone */ +#define POKEY_VOL_ONLY 0x10 /* selects VOLUME OUTPUT ONLY */ +#define POKEY_VOLUME_MASK 0x0f /* volume mask */ + +/* definitions for AUDCTL (D208) */ +#define POKEY_POLY9 0x80 /* selects POLY9 or POLY17 */ +#define POKEY_CH1_179 0x40 /* selects 1.78979 MHz for Ch 1 */ +#define POKEY_CH3_179 0x20 /* selects 1.78979 MHz for Ch 3 */ +#define POKEY_CH1_CH2 0x10 /* clocks channel 1 w/channel 2 */ +#define POKEY_CH3_CH4 0x08 /* clocks channel 3 w/channel 4 */ +#define POKEY_CH1_FILTER 0x04 /* selects channel 1 high pass filter */ +#define POKEY_CH2_FILTER 0x02 /* selects channel 2 high pass filter */ +#define POKEY_CLOCK_15 0x01 /* selects 15.6999kHz or 63.9210kHz */ + +/* for accuracy, the 64kHz and 15kHz clocks are exact divisions of + the 1.79MHz clock */ +#define POKEY_DIV_64 28 /* divisor for 1.79MHz clock to 64 kHz */ +#define POKEY_DIV_15 114 /* divisor for 1.79MHz clock to 15 kHz */ + +/* the size (in entries) of the 4 polynomial tables */ +#define POKEY_POLY4_SIZE 0x000f +#define POKEY_POLY5_SIZE 0x001f +#define POKEY_POLY9_SIZE 0x01ff +#define POKEY_POLY17_SIZE 0x0001ffff + +#define POKEY_MAXPOKEYS 2 /* max number of emulated chips */ + +/* channel/chip definitions */ +#define POKEY_CHAN1 0 +#define POKEY_CHAN2 1 +#define POKEY_CHAN3 2 +#define POKEY_CHAN4 3 +#define POKEY_CHIP1 0 +#define POKEY_CHIP2 4 +#define POKEY_CHIP3 8 +#define POKEY_CHIP4 12 +#define POKEY_SAMPLE 127 + +/* structures to hold the 9 pokey control bytes */ +extern UBYTE POKEY_AUDF[4 * POKEY_MAXPOKEYS]; /* AUDFx (D200, D202, D204, D206) */ +extern UBYTE POKEY_AUDC[4 * POKEY_MAXPOKEYS]; /* AUDCx (D201, D203, D205, D207) */ +extern UBYTE POKEY_AUDCTL[POKEY_MAXPOKEYS]; /* AUDCTL (D208) */ + +extern int POKEY_DivNIRQ[4], POKEY_DivNMax[4]; +extern int POKEY_Base_mult[POKEY_MAXPOKEYS]; /* selects either 64Khz or 15Khz clock mult */ + +extern UBYTE POKEY_poly9_lookup[POKEY_POLY9_SIZE]; +extern UBYTE POKEY_poly17_lookup[16385]; + +#endif /* POKEY_H_ */ diff --git a/PVAtari800/atari800-src/pokeysnd.c b/PVAtari800/atari800-src/pokeysnd.c new file mode 100644 index 0000000000..d2815c54f9 --- /dev/null +++ b/PVAtari800/atari800-src/pokeysnd.c @@ -0,0 +1,1377 @@ +/* + * pokeysnd.c - POKEY sound chip emulation, v2.4 + * + * Copyright (C) 1996-1998 Ron Fries + * Copyright (C) 1998-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include +#include + +#ifdef ASAP /* external project, see http://asap.sf.net */ +#include "asap_internal.h" +#else +#include "atari.h" +#ifndef __PLUS +#include "sndsave.h" +#else +#include "sound_win.h" +#endif +#endif +#include "mzpokeysnd.h" +#include "pokeysnd.h" +#if defined(PBI_XLD) || defined (VOICEBOX) +#include "votraxsnd.h" +#endif +#include "antic.h" +#include "gtia.h" +#include "util.h" + +#ifdef WORDS_UNALIGNED_OK +# define READ_U32(x) (*(ULONG *) (x)) +# define WRITE_U32(x, d) (*(ULONG *) (x) = (d)) +#else +# ifdef WORDS_BIGENDIAN +# define READ_U32(x) (((*(unsigned char *)(x)) << 24) | ((*((unsigned char *)(x) + 1)) << 16) | \ + ((*((unsigned char *)(x) + 2)) << 8) | ((*((unsigned char *)(x) + 3)))) +# define WRITE_U32(x, d) \ + { \ + ULONG i = d; \ + (*(unsigned char *) (x)) = (((i) >> 24) & 255); \ + (*((unsigned char *) (x) + 1)) = (((i) >> 16) & 255); \ + (*((unsigned char *) (x) + 2)) = (((i) >> 8) & 255); \ + (*((unsigned char *) (x) + 3)) = ((i) & 255); \ + } +# else +# define READ_U32(x) ((*(unsigned char *) (x)) | ((*((unsigned char *) (x) + 1)) << 8) | \ + ((*((unsigned char *) (x) + 2)) << 16) | ((*((unsigned char *) (x) + 3)) << 24)) +# define WRITE_U32(x, d) \ + { \ + ULONG i = d; \ + (*(unsigned char *)(x)) = ((i) & 255); \ + (*((unsigned char *)(x) + 1)) = (((i) >> 8) & 255); \ + (*((unsigned char *)(x) + 2)) = (((i) >> 16) & 255); \ + (*((unsigned char *)(x) + 3)) = (((i) >> 24) & 255); \ + } +# endif +#endif + +/* GLOBAL VARIABLE DEFINITIONS */ + +/* number of pokey chips currently emulated */ +static UBYTE Num_pokeys; + +static UBYTE pokeysnd_AUDV[4 * POKEY_MAXPOKEYS]; /* Channel volume - derived */ + +static UBYTE Outbit[4 * POKEY_MAXPOKEYS]; /* current state of the output (high or low) */ + +static UBYTE Outvol[4 * POKEY_MAXPOKEYS]; /* last output volume for each channel */ + +/* Initialize the bit patterns for the polynomials. */ + +/* The 4bit and 5bit patterns are the identical ones used in the pokey chip. */ +/* Though the patterns could be packed with 8 bits per byte, using only a */ +/* single bit per byte keeps the math simple, which is important for */ +/* efficient processing. */ + +static UBYTE bit4[POKEY_POLY4_SIZE] = +#ifndef POKEY23_POLY +{1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0}; /* new table invented by Perry */ +#else +{1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0}; /* original POKEY 2.3 table */ +#endif + +static UBYTE bit5[POKEY_POLY5_SIZE] = +#ifndef POKEY23_POLY +{1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0}; +#else +{0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1}; +#endif + +static ULONG P4 = 0, /* Global position pointer for the 4-bit POLY array */ + P5 = 0, /* Global position pointer for the 5-bit POLY array */ + P9 = 0, /* Global position pointer for the 9-bit POLY array */ + P17 = 0; /* Global position pointer for the 17-bit POLY array */ + +static ULONG Div_n_cnt[4 * POKEY_MAXPOKEYS], /* Divide by n counter. one for each channel */ + Div_n_max[4 * POKEY_MAXPOKEYS]; /* Divide by n maximum, one for each channel */ + +static ULONG Samp_n_max, /* Sample max. For accuracy, it is *256 */ + Samp_n_cnt[2]; /* Sample cnt. */ + +#ifdef INTERPOLATE_SOUND +static UWORD last_val = 0; /* last output value */ +#ifdef STEREO_SOUND +static UWORD last_val2 = 0; /* last output value */ +#endif +#endif + +/* Volume only emulations declarations */ +#ifdef VOL_ONLY_SOUND + +int POKEYSND_sampbuf_val[POKEYSND_SAMPBUF_MAX]; /* volume values */ +int POKEYSND_sampbuf_cnt[POKEYSND_SAMPBUF_MAX]; /* relative start time */ +int POKEYSND_sampbuf_ptr = 0; /* pointer to sampbuf */ +int POKEYSND_sampbuf_rptr = 0; /* pointer to read from sampbuf */ +int POKEYSND_sampbuf_last = 0; /* last absolute time */ +int POKEYSND_sampbuf_AUDV[4 * POKEY_MAXPOKEYS]; /* prev. channel volume */ +int POKEYSND_sampbuf_lastval = 0; /* last volume */ +int POKEYSND_sampout; /* last out volume */ +int POKEYSND_samp_freq; +int POKEYSND_samp_consol_val = 0; /* actual value of console sound */ +#ifdef STEREO_SOUND +static int sampbuf_val2[POKEYSND_SAMPBUF_MAX]; /* volume values */ +static int sampbuf_cnt2[POKEYSND_SAMPBUF_MAX]; /* relative start time */ +static int sampbuf_ptr2 = 0; /* pointer to sampbuf */ +static int sampbuf_rptr2 = 0; /* pointer to read from sampbuf */ +static int sampbuf_last2 = 0; /* last absolute time */ +static int sampbuf_lastval2 = 0; /* last volume */ +static int sampout2; /* last out volume */ +#endif +#endif /* VOL_ONLY_SOUND */ + +static ULONG snd_freq17 = POKEYSND_FREQ_17_EXACT; +int POKEYSND_playback_freq = 44100; +UBYTE POKEYSND_num_pokeys = 1; +int POKEYSND_snd_flags = 0; +static int mz_quality = 0; /* default quality for mzpokeysnd */ +#ifdef __PLUS +int mz_clear_regs = 0; +#endif + +int POKEYSND_enable_new_pokey = TRUE; +int POKEYSND_bienias_fix = TRUE; /* when TRUE, high frequencies get emulated: better sound but slower */ +#if defined(__PLUS) && !defined(_WX_) +#define BIENIAS_FIX (g_Sound.nBieniasFix) +#else +#define BIENIAS_FIX POKEYSND_bienias_fix +#endif +#ifndef ASAP +int POKEYSND_stereo_enabled = FALSE; +#endif + +/* multiple sound engine interface */ +static void pokeysnd_process_8(void *sndbuffer, int sndn); +static void pokeysnd_process_16(void *sndbuffer, int sndn); +static void null_pokey_process(void *sndbuffer, int sndn) {} +void (*POKEYSND_Process_ptr)(void *sndbuffer, int sndn) = null_pokey_process; + +static void Update_pokey_sound_rf(UWORD, UBYTE, UBYTE, UBYTE); +static void null_pokey_sound(UWORD addr, UBYTE val, UBYTE chip, UBYTE gain) {} +void (*POKEYSND_Update_ptr) (UWORD addr, UBYTE val, UBYTE chip, UBYTE gain) + = null_pokey_sound; + +#ifdef SERIO_SOUND +static void Update_serio_sound_rf(int out, UBYTE data); +static void null_serio_sound(int out, UBYTE data) {} +void (*POKEYSND_UpdateSerio)(int out, UBYTE data) = null_serio_sound; +int POKEYSND_serio_sound_enabled = 1; +#endif + +#ifdef CONSOLE_SOUND +static void Update_consol_sound_rf(int set); +static void null_consol_sound(int set) {} +void (*POKEYSND_UpdateConsol_ptr)(int set) = null_consol_sound; +int POKEYSND_console_sound_enabled = 1; +#endif + +#ifdef VOL_ONLY_SOUND +static void Update_vol_only_sound_rf(void); +static void null_vol_only_sound(void) {} +void (*POKEYSND_UpdateVolOnly)(void) = null_vol_only_sound; +#endif + +#ifdef SYNCHRONIZED_SOUND +UBYTE *POKEYSND_process_buffer = NULL; +unsigned int POKEYSND_process_buffer_length; +unsigned int POKEYSND_process_buffer_fill; +static unsigned int prev_update_tick; + +static void Generate_sync_rf(unsigned int num_ticks); +static void null_generate_sync(unsigned int num_ticks) {} +void (*POKEYSND_GenerateSync)(unsigned int num_ticks) = null_generate_sync; + +static double ticks_per_sample; +static double samp_pos; +static int speaker; +static int const CONSOLE_VOL = 32; +#endif /* SYNCHRONIZED_SOUND */ + +/*****************************************************************************/ +/* In my routines, I treat the sample output as another divide by N counter */ +/* For better accuracy, the Samp_n_cnt has a fixed binary decimal point */ +/* which has 8 binary digits to the right of the decimal point. I use a two */ +/* byte array to give me a minimum of 40 bits, and then use pointer math to */ +/* reference either the 24.8 whole/fraction combination or the 32-bit whole */ +/* only number. This is mainly used to keep the math simple for */ +/* optimization. See below: */ +/* */ +/* Representation on little-endian machines: */ +/* xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx */ +/* fraction whole whole whole whole unused unused unused */ +/* */ +/* Samp_n_cnt[0] gives me a 32-bit int 24 whole bits with 8 fractional bits, */ +/* while (ULONG *)((UBYTE *)(&Samp_n_cnt[0])+1) gives me the 32-bit whole */ +/* number only. */ +/* */ +/* Representation on big-endian machines: */ +/* xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx | xxxxxxxx xxxxxxxx xxxxxxxx.xxxxxxxx */ +/* unused unused unused whole whole whole whole fraction */ +/* */ +/* Samp_n_cnt[1] gives me a 32-bit int 24 whole bits with 8 fractional bits, */ +/* while (ULONG *)((UBYTE *)(&Samp_n_cnt[0])+3) gives me the 32-bit whole */ +/* number only. */ +/*****************************************************************************/ + + +/*****************************************************************************/ +/* Module: pokeysnd_init_rf() */ +/* Purpose: to handle the power-up initialization functions */ +/* these functions should only be executed on a cold-restart */ +/* */ +/* Author: Ron Fries */ +/* Date: January 1, 1997 */ +/* */ +/* Inputs: freq17 - the value for the '1.79MHz' Pokey audio clock */ +/* playback_freq - the playback frequency in samples per second */ +/* num_pokeys - specifies the number of pokey chips to be emulated */ +/* */ +/* Outputs: Adjusts local globals - no return value */ +/* */ +/*****************************************************************************/ + +static int pokeysnd_init_rf(ULONG freq17, int playback_freq, + UBYTE num_pokeys, int flags); + +#ifdef VOL_ONLY_SOUND +/* Initialise variables related to volume-only sound. */ +static void init_vol_only(void) +{ + POKEYSND_sampbuf_rptr = POKEYSND_sampbuf_ptr; + POKEYSND_sampbuf_last = ANTIC_CPU_CLOCK; + POKEYSND_sampbuf_lastval = 0; + POKEYSND_samp_consol_val = 0; +#ifdef STEREO_SOUND + sampbuf_rptr2 = sampbuf_ptr2; + sampbuf_last2 = ANTIC_CPU_CLOCK; + sampbuf_lastval2 = 0; +#endif /* STEREO_SOUND */ +} +#endif /* VOL_ONLY_SOUND */ + +int POKEYSND_DoInit(void) +{ + SndSave_CloseSoundFile(); + +#ifdef VOL_ONLY_SOUND + init_vol_only(); +#endif /* VOL_ONLY_SOUND */ + + if (POKEYSND_enable_new_pokey) + return MZPOKEYSND_Init(snd_freq17, POKEYSND_playback_freq, + POKEYSND_num_pokeys, POKEYSND_snd_flags, mz_quality +#ifdef __PLUS + , mz_clear_regs +#endif + ); + else + return pokeysnd_init_rf(snd_freq17, POKEYSND_playback_freq, + POKEYSND_num_pokeys, POKEYSND_snd_flags); +} + +int POKEYSND_Init(ULONG freq17, int playback_freq, UBYTE num_pokeys, + int flags +#ifdef __PLUS + , int clear_regs +#endif +) +{ + snd_freq17 = freq17; + POKEYSND_playback_freq = playback_freq; + POKEYSND_num_pokeys = num_pokeys; + POKEYSND_snd_flags = flags; +#ifdef __PLUS + mz_clear_regs = clear_regs; +#endif +#ifdef SYNCHRONIZED_SOUND + { + /* A single call to Atari800_Frame may emulate a bit more CPU ticks than the exact number of + ticks per frame (Atari800_tv_mode*114). So we add a few ticks to buffer size just to be safe. */ + unsigned int const surplus_ticks = 10; + double samples_per_frame = (double)POKEYSND_playback_freq/(Atari800_tv_mode == Atari800_TV_PAL ? Atari800_FPS_PAL : Atari800_FPS_NTSC); + unsigned int ticks_per_frame = Atari800_tv_mode*114; + unsigned int max_ticks_per_frame = ticks_per_frame + surplus_ticks; + double ticks_per_sample = (double)ticks_per_frame / samples_per_frame; + POKEYSND_process_buffer_length = POKEYSND_num_pokeys * (unsigned int)ceil((double)max_ticks_per_frame / ticks_per_sample) * ((POKEYSND_snd_flags & POKEYSND_BIT16) ? 2:1); + free(POKEYSND_process_buffer); + POKEYSND_process_buffer = (UBYTE *)Util_malloc(POKEYSND_process_buffer_length); + POKEYSND_process_buffer_fill = 0; + prev_update_tick = ANTIC_CPU_CLOCK; + } +#endif /* SYNCHRONIZED_SOUND */ + +#if defined(PBI_XLD) || defined (VOICEBOX) + VOTRAXSND_Init(playback_freq, num_pokeys, (flags & POKEYSND_BIT16)); +#endif + return POKEYSND_DoInit(); +} + +void POKEYSND_SetMzQuality(int quality) /* specially for win32, perhaps not needed? */ +{ + mz_quality = quality; +} + +void POKEYSND_Process(void *sndbuffer, int sndn) +{ + POKEYSND_Process_ptr(sndbuffer, sndn); +#if defined(PBI_XLD) || defined (VOICEBOX) + VOTRAXSND_Process(sndbuffer,sndn); +#endif +#if !defined(__PLUS) && !defined(ASAP) + SndSave_WriteToSoundFile((const unsigned char *)sndbuffer, sndn); +#endif +} + +#ifdef SYNCHRONIZED_SOUND +static void Update_synchronized_sound(void) +{ + POKEYSND_GenerateSync(ANTIC_CPU_CLOCK - prev_update_tick); + prev_update_tick = ANTIC_CPU_CLOCK; +} + +int POKEYSND_UpdateProcessBuffer(void) +{ + int sndn; + Update_synchronized_sound(); + sndn = POKEYSND_process_buffer_fill / ((POKEYSND_snd_flags & POKEYSND_BIT16) ? 2 : 1); + POKEYSND_process_buffer_fill = 0; + +#if defined(PBI_XLD) || defined (VOICEBOX) + VOTRAXSND_Process(POKEYSND_process_buffer, sndn); +#endif +#if !defined(__PLUS) && !defined(ASAP) + SndSave_WriteToSoundFile((const unsigned char *)POKEYSND_process_buffer, sndn); +#endif + return sndn; +} +#endif /* SYNCHRONIZED_SOUND */ + +#ifdef SYNCHRONIZED_SOUND +static void init_syncsound(void) +{ + double samples_per_frame = (double)POKEYSND_playback_freq/(Atari800_tv_mode == Atari800_TV_PAL ? Atari800_FPS_PAL : Atari800_FPS_NTSC); + unsigned int ticks_per_frame = Atari800_tv_mode*114; + ticks_per_sample = (double)ticks_per_frame / samples_per_frame; + samp_pos = 0.0; + POKEYSND_GenerateSync = Generate_sync_rf; + speaker = 0; +} +#endif /* SYNCHRONIZED_SOUND */ + +static int pokeysnd_init_rf(ULONG freq17, int playback_freq, + UBYTE num_pokeys, int flags) +{ + UBYTE chan; + + POKEYSND_Update_ptr = Update_pokey_sound_rf; +#ifdef SERIO_SOUND + POKEYSND_UpdateSerio = Update_serio_sound_rf; +#endif +#ifdef CONSOLE_SOUND + POKEYSND_UpdateConsol_ptr = Update_consol_sound_rf; +#endif +#ifdef VOL_ONLY_SOUND + POKEYSND_UpdateVolOnly = Update_vol_only_sound_rf; +#endif + + POKEYSND_Process_ptr = (flags & POKEYSND_BIT16) ? pokeysnd_process_16 : pokeysnd_process_8; + +#ifdef VOL_ONLY_SOUND + POKEYSND_samp_freq = playback_freq; +#endif + + /* start all of the polynomial counters at zero */ + P4 = 0; + P5 = 0; + P9 = 0; + P17 = 0; + + /* calculate the sample 'divide by N' value based on the playback freq. */ + Samp_n_max = ((ULONG) freq17 << 8) / playback_freq; + + Samp_n_cnt[0] = 0; /* initialize all bits of the sample */ + Samp_n_cnt[1] = 0; /* 'divide by N' counter */ + + for (chan = 0; chan < (POKEY_MAXPOKEYS * 4); chan++) { + Outvol[chan] = 0; + Outbit[chan] = 0; + Div_n_cnt[chan] = 0; + Div_n_max[chan] = 0x7fffffffL; + pokeysnd_AUDV[chan] = 0; +#ifdef VOL_ONLY_SOUND + POKEYSND_sampbuf_AUDV[chan] = 0; +#endif + } + + /* set the number of pokey chips currently emulated */ + Num_pokeys = num_pokeys; + +#ifdef SYNCHRONIZED_SOUND + init_syncsound(); +#endif + return 0; /* OK */ +} + + +/*****************************************************************************/ +/* Module: Update_pokey_sound_rf() */ +/* Purpose: To process the latest control values stored in the AUDF, AUDC, */ +/* and AUDCTL registers. It pre-calculates as much information as */ +/* possible for better performance. This routine has not been */ +/* optimized. */ +/* */ +/* Author: Ron Fries */ +/* Date: January 1, 1997 */ +/* */ +/* Inputs: addr - the address of the parameter to be changed */ +/* val - the new value to be placed in the specified address */ +/* gain - specified as an 8-bit fixed point number - use 1 for no */ +/* amplification (output is multiplied by gain) */ +/* */ +/* Outputs: Adjusts local globals - no return value */ +/* */ +/*****************************************************************************/ + +void POKEYSND_Update(UWORD addr, UBYTE val, UBYTE chip, UBYTE gain) +{ +#ifdef SYNCHRONIZED_SOUND + Update_synchronized_sound(); +#endif /* SYNCHRONIZED_SOUND */ + POKEYSND_Update_ptr(addr, val, chip, gain); +} + +static void Update_pokey_sound_rf(UWORD addr, UBYTE val, UBYTE chip, + UBYTE gain) +{ + ULONG new_val = 0; + UBYTE chan; + UBYTE chan_mask; + UBYTE chip_offs; + + /* calculate the chip_offs for the channel arrays */ + chip_offs = chip << 2; + + /* determine which address was changed */ + switch (addr & 0x0f) { + case POKEY_OFFSET_AUDF1: + /* POKEY_AUDF[POKEY_CHAN1 + chip_offs] = val; */ + chan_mask = 1 << POKEY_CHAN1; + if (POKEY_AUDCTL[chip] & POKEY_CH1_CH2) /* if ch 1&2 tied together */ + chan_mask |= 1 << POKEY_CHAN2; /* then also change on ch2 */ + break; + case POKEY_OFFSET_AUDC1: + /* POKEY_AUDC[POKEY_CHAN1 + chip_offs] = val; */ + pokeysnd_AUDV[POKEY_CHAN1 + chip_offs] = (val & POKEY_VOLUME_MASK) * gain; + chan_mask = 1 << POKEY_CHAN1; + break; + case POKEY_OFFSET_AUDF2: + /* POKEY_AUDF[POKEY_CHAN2 + chip_offs] = val; */ + chan_mask = 1 << POKEY_CHAN2; + break; + case POKEY_OFFSET_AUDC2: + /* POKEY_AUDC[POKEY_CHAN2 + chip_offs] = val; */ + pokeysnd_AUDV[POKEY_CHAN2 + chip_offs] = (val & POKEY_VOLUME_MASK) * gain; + chan_mask = 1 << POKEY_CHAN2; + break; + case POKEY_OFFSET_AUDF3: + /* POKEY_AUDF[POKEY_CHAN3 + chip_offs] = val; */ + chan_mask = 1 << POKEY_CHAN3; + if (POKEY_AUDCTL[chip] & POKEY_CH3_CH4) /* if ch 3&4 tied together */ + chan_mask |= 1 << POKEY_CHAN4; /* then also change on ch4 */ + break; + case POKEY_OFFSET_AUDC3: + /* POKEY_AUDC[POKEY_CHAN3 + chip_offs] = val; */ + pokeysnd_AUDV[POKEY_CHAN3 + chip_offs] = (val & POKEY_VOLUME_MASK) * gain; + chan_mask = 1 << POKEY_CHAN3; + break; + case POKEY_OFFSET_AUDF4: + /* POKEY_AUDF[POKEY_CHAN4 + chip_offs] = val; */ + chan_mask = 1 << POKEY_CHAN4; + break; + case POKEY_OFFSET_AUDC4: + /* POKEY_AUDC[POKEY_CHAN4 + chip_offs] = val; */ + pokeysnd_AUDV[POKEY_CHAN4 + chip_offs] = (val & POKEY_VOLUME_MASK) * gain; + chan_mask = 1 << POKEY_CHAN4; + break; + case POKEY_OFFSET_AUDCTL: + /* POKEY_AUDCTL[chip] = val; */ + chan_mask = 15; /* all channels */ + break; + default: + chan_mask = 0; + break; + } + + /************************************************************/ + /* As defined in the manual, the exact Div_n_cnt values are */ + /* different depending on the frequency and resolution: */ + /* 64 kHz or 15 kHz - AUDF + 1 */ + /* 1 MHz, 8-bit - AUDF + 4 */ + /* 1 MHz, 16-bit - POKEY_AUDF[POKEY_CHAN1]+256*POKEY_AUDF[POKEY_CHAN2] + 7 */ + /************************************************************/ + + /* only reset the channels that have changed */ + + if (chan_mask & (1 << POKEY_CHAN1)) { + /* process channel 1 frequency */ + if (POKEY_AUDCTL[chip] & POKEY_CH1_179) + new_val = POKEY_AUDF[POKEY_CHAN1 + chip_offs] + 4; + else + new_val = (POKEY_AUDF[POKEY_CHAN1 + chip_offs] + 1) * POKEY_Base_mult[chip]; + + if (new_val != Div_n_max[POKEY_CHAN1 + chip_offs]) { + Div_n_max[POKEY_CHAN1 + chip_offs] = new_val; + + if (Div_n_cnt[POKEY_CHAN1 + chip_offs] > new_val) { + Div_n_cnt[POKEY_CHAN1 + chip_offs] = new_val; + } + } + } + + if (chan_mask & (1 << POKEY_CHAN2)) { + /* process channel 2 frequency */ + if (POKEY_AUDCTL[chip] & POKEY_CH1_CH2) { + if (POKEY_AUDCTL[chip] & POKEY_CH1_179) + new_val = POKEY_AUDF[POKEY_CHAN2 + chip_offs] * 256 + + POKEY_AUDF[POKEY_CHAN1 + chip_offs] + 7; + else + new_val = (POKEY_AUDF[POKEY_CHAN2 + chip_offs] * 256 + + POKEY_AUDF[POKEY_CHAN1 + chip_offs] + 1) * POKEY_Base_mult[chip]; + } + else + new_val = (POKEY_AUDF[POKEY_CHAN2 + chip_offs] + 1) * POKEY_Base_mult[chip]; + + if (new_val != Div_n_max[POKEY_CHAN2 + chip_offs]) { + Div_n_max[POKEY_CHAN2 + chip_offs] = new_val; + + if (Div_n_cnt[POKEY_CHAN2 + chip_offs] > new_val) { + Div_n_cnt[POKEY_CHAN2 + chip_offs] = new_val; + } + } + } + + if (chan_mask & (1 << POKEY_CHAN3)) { + /* process channel 3 frequency */ + if (POKEY_AUDCTL[chip] & POKEY_CH3_179) + new_val = POKEY_AUDF[POKEY_CHAN3 + chip_offs] + 4; + else + new_val = (POKEY_AUDF[POKEY_CHAN3 + chip_offs] + 1) * POKEY_Base_mult[chip]; + + if (new_val != Div_n_max[POKEY_CHAN3 + chip_offs]) { + Div_n_max[POKEY_CHAN3 + chip_offs] = new_val; + + if (Div_n_cnt[POKEY_CHAN3 + chip_offs] > new_val) { + Div_n_cnt[POKEY_CHAN3 + chip_offs] = new_val; + } + } + } + + if (chan_mask & (1 << POKEY_CHAN4)) { + /* process channel 4 frequency */ + if (POKEY_AUDCTL[chip] & POKEY_CH3_CH4) { + if (POKEY_AUDCTL[chip] & POKEY_CH3_179) + new_val = POKEY_AUDF[POKEY_CHAN4 + chip_offs] * 256 + + POKEY_AUDF[POKEY_CHAN3 + chip_offs] + 7; + else + new_val = (POKEY_AUDF[POKEY_CHAN4 + chip_offs] * 256 + + POKEY_AUDF[POKEY_CHAN3 + chip_offs] + 1) * POKEY_Base_mult[chip]; + } + else + new_val = (POKEY_AUDF[POKEY_CHAN4 + chip_offs] + 1) * POKEY_Base_mult[chip]; + + if (new_val != Div_n_max[POKEY_CHAN4 + chip_offs]) { + Div_n_max[POKEY_CHAN4 + chip_offs] = new_val; + + if (Div_n_cnt[POKEY_CHAN4 + chip_offs] > new_val) { + Div_n_cnt[POKEY_CHAN4 + chip_offs] = new_val; + } + } + } + + /* if channel is volume only, set current output */ + for (chan = POKEY_CHAN1; chan <= POKEY_CHAN4; chan++) { + if (chan_mask & (1 << chan)) { + +#ifdef VOL_ONLY_SOUND + +#ifdef __PLUS + if (g_Sound.nDigitized) +#endif + if ((POKEY_AUDC[chan + chip_offs] & POKEY_VOL_ONLY)) { + +#ifdef STEREO_SOUND + +#ifdef __PLUS + if (POKEYSND_stereo_enabled && chip & 0x01) +#else + if (chip & 0x01) +#endif + { + sampbuf_lastval2 += pokeysnd_AUDV[chan + chip_offs] + - POKEYSND_sampbuf_AUDV[chan + chip_offs]; + + sampbuf_val2[sampbuf_ptr2] = sampbuf_lastval2; + POKEYSND_sampbuf_AUDV[chan + chip_offs] = pokeysnd_AUDV[chan + chip_offs]; + sampbuf_cnt2[sampbuf_ptr2] = + (ANTIC_CPU_CLOCK - sampbuf_last2) * 128 * POKEYSND_samp_freq / 178979; + sampbuf_last2 = ANTIC_CPU_CLOCK; + sampbuf_ptr2++; + if (sampbuf_ptr2 >= POKEYSND_SAMPBUF_MAX) + sampbuf_ptr2 = 0; + if (sampbuf_ptr2 == sampbuf_rptr2) { + sampbuf_rptr2++; + if (sampbuf_rptr2 >= POKEYSND_SAMPBUF_MAX) + sampbuf_rptr2 = 0; + } + } + else +#endif /* STEREO_SOUND */ + { + POKEYSND_sampbuf_lastval += pokeysnd_AUDV[chan + chip_offs] + -POKEYSND_sampbuf_AUDV[chan + chip_offs]; + + POKEYSND_sampbuf_val[POKEYSND_sampbuf_ptr] = POKEYSND_sampbuf_lastval; + POKEYSND_sampbuf_AUDV[chan + chip_offs] = pokeysnd_AUDV[chan + chip_offs]; + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_ptr] = + (ANTIC_CPU_CLOCK - POKEYSND_sampbuf_last) * 128 * POKEYSND_samp_freq / 178979; + POKEYSND_sampbuf_last = ANTIC_CPU_CLOCK; + POKEYSND_sampbuf_ptr++; + if (POKEYSND_sampbuf_ptr >= POKEYSND_SAMPBUF_MAX) + POKEYSND_sampbuf_ptr = 0; + if (POKEYSND_sampbuf_ptr == POKEYSND_sampbuf_rptr) { + POKEYSND_sampbuf_rptr++; + if (POKEYSND_sampbuf_rptr >= POKEYSND_SAMPBUF_MAX) + POKEYSND_sampbuf_rptr = 0; + } + } + } + +#endif /* VOL_ONLY_SOUND */ + + /* I've disabled any frequencies that exceed the sampling + frequency. There isn't much point in processing frequencies + that the hardware can't reproduce. I've also disabled + processing if the volume is zero. */ + + /* if the channel is volume only */ + /* or the channel is off (volume == 0) */ + /* or the channel freq is greater than the playback freq */ + if ( (POKEY_AUDC[chan + chip_offs] & POKEY_VOL_ONLY) || + ((POKEY_AUDC[chan + chip_offs] & POKEY_VOLUME_MASK) == 0) + || (!BIENIAS_FIX && (Div_n_max[chan + chip_offs] < (Samp_n_max >> 8))) + ) { + /* indicate the channel is 'on' */ + Outvol[chan + chip_offs] = 1; + + /* can only ignore channel if filtering off */ + if ((chan == POKEY_CHAN3 && !(POKEY_AUDCTL[chip] & POKEY_CH1_FILTER)) || + (chan == POKEY_CHAN4 && !(POKEY_AUDCTL[chip] & POKEY_CH2_FILTER)) || + (chan == POKEY_CHAN1) || + (chan == POKEY_CHAN2) + || (!BIENIAS_FIX && (Div_n_max[chan + chip_offs] < (Samp_n_max >> 8))) + ) { + /* and set channel freq to max to reduce processing */ + Div_n_max[chan + chip_offs] = 0x7fffffffL; + Div_n_cnt[chan + chip_offs] = 0x7fffffffL; + } + } + } + } + + /* _enable(); */ /* RSF - removed for portability 31-MAR-97 */ +} + + +/*****************************************************************************/ +/* Module: pokeysnd_process() */ +/* Purpose: To fill the output buffer with the sound output based on the */ +/* pokey chip parameters. */ +/* */ +/* Author: Ron Fries */ +/* Date: January 1, 1997 */ +/* */ +/* Inputs: *buffer - pointer to the buffer where the audio output will */ +/* be placed */ +/* sndn - for mono, size of the playback buffer in samples */ +/* for stereo, size of the playback buffer in left samples */ +/* plus right samples. */ +/* num_pokeys - number of currently active pokeys to process */ +/* */ +/* Outputs: the buffer will be filled with n bytes of audio - no return val */ +/* Also the buffer will be written to disk if Sound recording is ON */ +/* */ +/*****************************************************************************/ + +static void pokeysnd_process_8(void *sndbuffer, int sndn) +{ + register UBYTE *buffer = (UBYTE *) sndbuffer; + register int n = sndn; + + register ULONG *div_n_ptr; + register UBYTE *samp_cnt_w_ptr; + register ULONG event_min; + register UBYTE next_event; +#ifdef CLIP_SOUND + register SWORD cur_val; /* then we have to count as 16-bit signed */ +#ifdef STEREO_SOUND + register SWORD cur_val2; +#endif +#else /* CLIP_SOUND */ + register UBYTE cur_val; /* otherwise we'll simplify as 8-bit unsigned */ +#ifdef STEREO_SOUND + register UBYTE cur_val2; +#endif +#endif /* CLIP_SOUND */ + register UBYTE *out_ptr; + register UBYTE audc; + register UBYTE toggle; + register UBYTE count; + register UBYTE *vol_ptr; + + /* set a pointer to the whole portion of the samp_n_cnt */ +#ifdef WORDS_BIGENDIAN + samp_cnt_w_ptr = ((UBYTE *) (&Samp_n_cnt[0]) + 3); +#else + samp_cnt_w_ptr = ((UBYTE *) (&Samp_n_cnt[0]) + 1); +#endif + + /* set a pointer for optimization */ + out_ptr = Outvol; + vol_ptr = pokeysnd_AUDV; + + /* The current output is pre-determined and then adjusted based on each */ + /* output change for increased performance (less over-all math). */ + /* add the output values of all 4 channels */ + cur_val = POKEYSND_SAMP_MIN; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + cur_val2 = POKEYSND_SAMP_MIN; +#endif /* STEREO_SOUND */ + + count = Num_pokeys; + do { + if (*out_ptr++) + cur_val += *vol_ptr; + vol_ptr++; + + if (*out_ptr++) + cur_val += *vol_ptr; + vol_ptr++; + + if (*out_ptr++) + cur_val += *vol_ptr; + vol_ptr++; + + if (*out_ptr++) + cur_val += *vol_ptr; + vol_ptr++; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + { + count--; + if (count) { + if (*out_ptr++) + cur_val2 += *vol_ptr; + vol_ptr++; + + if (*out_ptr++) + cur_val2 += *vol_ptr; + vol_ptr++; + + if (*out_ptr++) + cur_val2 += *vol_ptr; + vol_ptr++; + + if (*out_ptr++) + cur_val2 += *vol_ptr; + vol_ptr++; + } + else + break; + } +#endif /* STEREO_SOUND */ + count--; + } while (count); + +#ifdef SYNCHRONIZED_SOUND + cur_val += speaker; +#endif + + /* loop until the buffer is filled */ + while (n) { + /* Normally the routine would simply decrement the 'div by N' */ + /* counters and react when they reach zero. Since we normally */ + /* won't be processing except once every 80 or so counts, */ + /* I've optimized by finding the smallest count and then */ + /* 'accelerated' time by adjusting all pointers by that amount. */ + + /* find next smallest event (either sample or chan 1-4) */ + next_event = POKEY_SAMPLE; + event_min = READ_U32(samp_cnt_w_ptr); + + div_n_ptr = Div_n_cnt; + + count = 0; + do { + /* Though I could have used a loop here, this is faster */ + if (*div_n_ptr <= event_min) { + event_min = *div_n_ptr; + next_event = POKEY_CHAN1 + (count << 2); + } + div_n_ptr++; + if (*div_n_ptr <= event_min) { + event_min = *div_n_ptr; + next_event = POKEY_CHAN2 + (count << 2); + } + div_n_ptr++; + if (*div_n_ptr <= event_min) { + event_min = *div_n_ptr; + next_event = POKEY_CHAN3 + (count << 2); + } + div_n_ptr++; + if (*div_n_ptr <= event_min) { + event_min = *div_n_ptr; + next_event = POKEY_CHAN4 + (count << 2); + } + div_n_ptr++; + + count++; + } while (count < Num_pokeys); + + /* if the next event is a channel change */ + if (next_event != POKEY_SAMPLE) { + /* shift the polynomial counters */ + + count = Num_pokeys; + do { + /* decrement all counters by the smallest count found */ + /* again, no loop for efficiency */ + div_n_ptr--; + *div_n_ptr -= event_min; + div_n_ptr--; + *div_n_ptr -= event_min; + div_n_ptr--; + *div_n_ptr -= event_min; + div_n_ptr--; + *div_n_ptr -= event_min; + + count--; + } while (count); + + + WRITE_U32(samp_cnt_w_ptr, READ_U32(samp_cnt_w_ptr) - event_min); + + /* since the polynomials require a mod (%) function which is + division, I don't adjust the polynomials on the SAMPLE events, + only the CHAN events. I have to keep track of the change, + though. */ + + P4 = (P4 + event_min) % POKEY_POLY4_SIZE; + P5 = (P5 + event_min) % POKEY_POLY5_SIZE; + P9 = (P9 + event_min) % POKEY_POLY9_SIZE; + P17 = (P17 + event_min) % POKEY_POLY17_SIZE; + + /* adjust channel counter */ + Div_n_cnt[next_event] += Div_n_max[next_event]; + + /* get the current AUDC into a register (for optimization) */ + audc = POKEY_AUDC[next_event]; + + /* set a pointer to the current output (for opt...) */ + out_ptr = &Outvol[next_event]; + + /* assume no changes to the output */ + toggle = FALSE; + + /* From here, a good understanding of the hardware is required */ + /* to understand what is happening. I won't be able to provide */ + /* much description to explain it here. */ + + /* if VOLUME only then nothing to process */ + if (!(audc & POKEY_VOL_ONLY)) { + /* if the output is pure or the output is poly5 and the poly5 bit */ + /* is set */ + if ((audc & POKEY_NOTPOLY5) || bit5[P5]) { + /* if the PURETONE bit is set */ + if (audc & POKEY_PURETONE) { + /* then simply toggle the output */ + toggle = TRUE; + } + /* otherwise if POLY4 is selected */ + else if (audc & POKEY_POLY4) { + /* then compare to the poly4 bit */ + toggle = (bit4[P4] == !(*out_ptr)); + } + else { + /* if 9-bit poly is selected on this chip */ + if (POKEY_AUDCTL[next_event >> 2] & POKEY_POLY9) { + /* compare to the poly9 bit */ + toggle = ((POKEY_poly9_lookup[P9] & 1) == !(*out_ptr)); + } + else { + /* otherwise compare to the poly17 bit */ + toggle = (((POKEY_poly17_lookup[P17 >> 3] >> (P17 & 7)) & 1) == !(*out_ptr)); + } + } + } + } + + /* check channel 1 filter (clocked by channel 3) */ + if ( POKEY_AUDCTL[next_event >> 2] & POKEY_CH1_FILTER) { + /* if we're processing channel 3 */ + if ((next_event & 0x03) == POKEY_CHAN3) { + /* check output of channel 1 on same chip */ + if (Outvol[next_event & 0xfd]) { + /* if on, turn it off */ + Outvol[next_event & 0xfd] = 0; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled && (next_event & 0x04)) +#else + if ((next_event & 0x04)) +#endif + cur_val2 -= pokeysnd_AUDV[next_event & 0xfd]; + else +#endif /* STEREO_SOUND */ + cur_val -= pokeysnd_AUDV[next_event & 0xfd]; + } + } + } + + /* check channel 2 filter (clocked by channel 4) */ + if ( POKEY_AUDCTL[next_event >> 2] & POKEY_CH2_FILTER) { + /* if we're processing channel 4 */ + if ((next_event & 0x03) == POKEY_CHAN4) { + /* check output of channel 2 on same chip */ + if (Outvol[next_event & 0xfd]) { + /* if on, turn it off */ + Outvol[next_event & 0xfd] = 0; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled && (next_event & 0x04)) +#else + if ((next_event & 0x04)) +#endif + cur_val2 -= pokeysnd_AUDV[next_event & 0xfd]; + else +#endif /* STEREO_SOUND */ + cur_val -= pokeysnd_AUDV[next_event & 0xfd]; + } + } + } + + /* if the current output bit has changed */ + if (toggle) { + if (*out_ptr) { + /* remove this channel from the signal */ +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled && (next_event & 0x04)) +#else + if ((next_event & 0x04)) +#endif + cur_val2 -= pokeysnd_AUDV[next_event]; + else +#endif /* STEREO_SOUND */ + cur_val -= pokeysnd_AUDV[next_event]; + + /* and turn the output off */ + *out_ptr = 0; + } + else { + /* turn the output on */ + *out_ptr = 1; + + /* and add it to the output signal */ +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled && (next_event & 0x04)) +#else + if ((next_event & 0x04)) +#endif + cur_val2 += pokeysnd_AUDV[next_event]; + else +#endif /* STEREO_SOUND */ + cur_val += pokeysnd_AUDV[next_event]; + } + } + } + else { /* otherwise we're processing a sample */ + /* adjust the sample counter - note we're using the 24.8 integer + which includes an 8 bit fraction for accuracy */ + + int iout; +#ifdef STEREO_SOUND + int iout2; +#endif +#ifdef INTERPOLATE_SOUND + if (cur_val != last_val) { + if (*Samp_n_cnt < Samp_n_max) { /* need interpolation */ + iout = (cur_val * (*Samp_n_cnt) + + last_val * (Samp_n_max - *Samp_n_cnt)) + / Samp_n_max; + } + else + iout = cur_val; + last_val = cur_val; + } + else + iout = cur_val; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + if (cur_val2 != last_val2) { + if (*Samp_n_cnt < Samp_n_max) { /* need interpolation */ + iout2 = (cur_val2 * (*Samp_n_cnt) + + last_val2 * (Samp_n_max - *Samp_n_cnt)) + / Samp_n_max; + } + else + iout2 = cur_val2; + last_val2 = cur_val2; + } + else + iout2 = cur_val2; +#endif /* STEREO_SOUND */ +#else /* INTERPOLATE_SOUND */ + iout = cur_val; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + iout2 = cur_val2; +#endif /* STEREO_SOUND */ +#endif /* INTERPOLATE_SOUND */ + +#ifdef VOL_ONLY_SOUND +#ifdef __PLUS + if (g_Sound.nDigitized) +#endif + { + if (POKEYSND_sampbuf_rptr != POKEYSND_sampbuf_ptr) { + int l; + if (POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr] > 0) + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr] -= 1280; + while ((l = POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr]) <= 0) { + POKEYSND_sampout = POKEYSND_sampbuf_val[POKEYSND_sampbuf_rptr]; + POKEYSND_sampbuf_rptr++; + if (POKEYSND_sampbuf_rptr >= POKEYSND_SAMPBUF_MAX) + POKEYSND_sampbuf_rptr = 0; + if (POKEYSND_sampbuf_rptr != POKEYSND_sampbuf_ptr) + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_rptr] += l; + else + break; + } + } + iout += POKEYSND_sampout; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + { + if (sampbuf_rptr2 != sampbuf_ptr2) { + int l; + if (sampbuf_cnt2[sampbuf_rptr2] > 0) + sampbuf_cnt2[sampbuf_rptr2] -= 1280; + while ((l = sampbuf_cnt2[sampbuf_rptr2]) <= 0) { + sampout2 = sampbuf_val2[sampbuf_rptr2]; + sampbuf_rptr2++; + if (sampbuf_rptr2 >= POKEYSND_SAMPBUF_MAX) + sampbuf_rptr2 = 0; + if (sampbuf_rptr2 != sampbuf_ptr2) + sampbuf_cnt2[sampbuf_rptr2] += l; + else + break; + } + } + iout2 += sampout2; + } +#endif /* STEREO_SOUND */ + } +#endif /* VOL_ONLY_SOUND */ + +#ifdef CLIP_SOUND + if (iout > POKEYSND_SAMP_MAX) { /* then check high limit */ + *buffer++ = (UBYTE) POKEYSND_SAMP_MAX; /* and limit if greater */ + } + else if (iout < POKEYSND_SAMP_MIN) { /* else check low limit */ + *buffer++ = (UBYTE) POKEYSND_SAMP_MIN; /* and limit if less */ + } + else { /* otherwise use raw value */ + *buffer++ = (UBYTE) iout; + } +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) { + if (iout2 > POKEYSND_SAMP_MAX) + *buffer++ = (UBYTE) POKEYSND_SAMP_MAX; + else if (iout2 < POKEYSND_SAMP_MIN) + *buffer++ = (UBYTE) POKEYSND_SAMP_MIN; + else + *buffer++ = (UBYTE) iout2; + } +#else /* __PLUS */ + if (Num_pokeys > 1) { + if ((POKEYSND_stereo_enabled ? iout2 : iout) > POKEYSND_SAMP_MAX) { /* then check high limit */ + *buffer++ = (UBYTE) POKEYSND_SAMP_MAX; /* and limit if greater */ + } + else if ((POKEYSND_stereo_enabled ? iout2 : iout) < POKEYSND_SAMP_MIN) { /* else check low limit */ + *buffer++ = (UBYTE) POKEYSND_SAMP_MIN; /* and limit if less */ + } + else { /* otherwise use raw value */ + *buffer++ = (UBYTE) (POKEYSND_stereo_enabled ? iout2 : iout); + } + } +#endif /* __PLUS */ +#endif /* STEREO_SOUND */ +#else /* CLIP_SOUND */ + *buffer++ = (UBYTE) iout; /* clipping not selected, use value */ +#ifdef STEREO_SOUND + if (Num_pokeys > 1) +#ifdef ASAP + *buffer++ = (UBYTE) iout2; +#else + *buffer++ = (UBYTE) (POKEYSND_stereo_enabled ? iout2 : iout); +#endif +#endif /* STEREO_SOUND */ +#endif /* CLIP_SOUND */ + +#ifdef WORDS_BIGENDIAN + *(Samp_n_cnt + 1) += Samp_n_max; +#else + *Samp_n_cnt += Samp_n_max; +#endif + /* and indicate one less byte in the buffer */ + n--; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + if (Num_pokeys > 1) + n--; +#endif + } + } +#ifdef VOL_ONLY_SOUND +#ifdef __PLUS + if (g_Sound.nDigitized) +#endif + { + if (POKEYSND_sampbuf_rptr == POKEYSND_sampbuf_ptr) + POKEYSND_sampbuf_last = ANTIC_CPU_CLOCK; +#ifdef STEREO_SOUND +#ifdef __PLUS + if (POKEYSND_stereo_enabled) +#endif + if (sampbuf_rptr2 == sampbuf_ptr2) + sampbuf_last2 = ANTIC_CPU_CLOCK; +#endif /* STEREO_SOUND */ + } +#endif /* VOL_ONLY_SOUND */ +} + +#ifdef SERIO_SOUND +static void Update_serio_sound_rf(int out, UBYTE data) +{ +#ifdef VOL_ONLY_SOUND +#ifdef __PLUS + if (g_Sound.nDigitized) { +#endif + int bits, pv, future; + if (!POKEYSND_serio_sound_enabled) return; + + pv = 0; + future = 0; + bits = (data << 1) | 0x200; + while (bits) + { + POKEYSND_sampbuf_lastval -= pv; + pv = (bits & 0x01) * pokeysnd_AUDV[3]; /* FIXME!!! - set volume from AUDV */ + POKEYSND_sampbuf_lastval += pv; + + POKEYSND_sampbuf_val[POKEYSND_sampbuf_ptr] = POKEYSND_sampbuf_lastval; + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_ptr] = + (ANTIC_CPU_CLOCK + future-POKEYSND_sampbuf_last) * 128 * POKEYSND_samp_freq / 178979; + POKEYSND_sampbuf_last = ANTIC_CPU_CLOCK + future; + POKEYSND_sampbuf_ptr++; + if (POKEYSND_sampbuf_ptr >= POKEYSND_SAMPBUF_MAX ) + POKEYSND_sampbuf_ptr = 0; + if (POKEYSND_sampbuf_ptr == POKEYSND_sampbuf_rptr ) { + POKEYSND_sampbuf_rptr++; + if (POKEYSND_sampbuf_rptr >= POKEYSND_SAMPBUF_MAX) + POKEYSND_sampbuf_rptr = 0; + } + /* 1789790/19200 = 93 */ + future += 93; /* ~ 19200 bit/s - FIXME!!! set speed form AUDF [2] ??? */ + bits >>= 1; + } + POKEYSND_sampbuf_lastval -= pv; +#ifdef __PLUS + } +#endif +#endif /* VOL_ONLY_SOUND */ +} +#endif /* SERIO_SOUND */ + +static void pokeysnd_process_16(void *sndbuffer, int sndn) +{ + UWORD *buffer = (UWORD *) sndbuffer; + int i; + + pokeysnd_process_8(buffer, sndn); + + for (i = sndn - 1; i >= 0; i--) { + int smp = ((int) (((UBYTE *) buffer)[i]) - 0x80) * 0x100; + + if (smp > 32767) + smp = 32767; + else if (smp < -32768) + smp = -32768; + + buffer[i] = smp; + } +} + +#ifdef SYNCHRONIZED_SOUND +static void Generate_sync_rf(unsigned int num_ticks) +{ + double new_samp_pos; + unsigned int ticks; + UBYTE *buffer = POKEYSND_process_buffer + POKEYSND_process_buffer_fill; + UBYTE *buffer_end = POKEYSND_process_buffer + POKEYSND_process_buffer_length; + + for (;;) { + double int_part; + new_samp_pos = samp_pos + ticks_per_sample; + new_samp_pos = modf(new_samp_pos, &int_part); + ticks = (unsigned int)int_part; + if (ticks > num_ticks) { + samp_pos -= num_ticks; + break; + } + if (buffer >= buffer_end) + break; + + samp_pos = new_samp_pos; + num_ticks -= ticks; + + if (POKEYSND_snd_flags & POKEYSND_BIT16) { + pokeysnd_process_16(buffer, 1); + buffer += 2 * POKEYSND_num_pokeys; + } + else { + pokeysnd_process_8(buffer, 1); + buffer += POKEYSND_num_pokeys; + } + + } + + POKEYSND_process_buffer_fill = buffer - POKEYSND_process_buffer; +} +#endif /* SYNCHRONIZED_SOUND */ + +#ifdef CONSOLE_SOUND +void POKEYSND_UpdateConsol(int set) +{ + if (!POKEYSND_console_sound_enabled) + return; +#ifdef SYNCHRONIZED_SOUND + if (set) + Update_synchronized_sound(); +#endif /* SYNCHRONIZED_SOUND */ + POKEYSND_UpdateConsol_ptr(set); +} + +static void Update_consol_sound_rf(int set) +{ +#ifdef SYNCHRONIZED_SOUND + if (set) + speaker = CONSOLE_VOL * GTIA_speaker; +#elif defined(VOL_ONLY_SOUND) + static int prev_atari_speaker = 0; + static unsigned int prev_cpu_clock = 0; + int d; +#ifdef __PLUS + if (!g_Sound.nDigitized) + return; +#endif + + if (!set && POKEYSND_samp_consol_val == 0) + return; + POKEYSND_sampbuf_lastval -= POKEYSND_samp_consol_val; + if (prev_atari_speaker != GTIA_speaker) { + POKEYSND_samp_consol_val = GTIA_speaker * 8 * 4; /* gain */ + prev_cpu_clock = ANTIC_CPU_CLOCK; + } + else if (!set) { + d = ANTIC_CPU_CLOCK - prev_cpu_clock; + if (d < 114) { + POKEYSND_sampbuf_lastval += POKEYSND_samp_consol_val; + return; + } + while (d >= 114 /* CPUL */) { + POKEYSND_samp_consol_val = POKEYSND_samp_consol_val * 99 / 100; + d -= 114; + } + prev_cpu_clock = ANTIC_CPU_CLOCK - d; + } + POKEYSND_sampbuf_lastval += POKEYSND_samp_consol_val; + prev_atari_speaker = GTIA_speaker; + + POKEYSND_sampbuf_val[POKEYSND_sampbuf_ptr] = POKEYSND_sampbuf_lastval; + POKEYSND_sampbuf_cnt[POKEYSND_sampbuf_ptr] = + (ANTIC_CPU_CLOCK - POKEYSND_sampbuf_last) * 128 * POKEYSND_samp_freq / 178979; + POKEYSND_sampbuf_last = ANTIC_CPU_CLOCK; + POKEYSND_sampbuf_ptr++; + if (POKEYSND_sampbuf_ptr >= POKEYSND_SAMPBUF_MAX) + POKEYSND_sampbuf_ptr = 0; + if (POKEYSND_sampbuf_ptr == POKEYSND_sampbuf_rptr) { + POKEYSND_sampbuf_rptr++; + if (POKEYSND_sampbuf_rptr >= POKEYSND_SAMPBUF_MAX) + POKEYSND_sampbuf_rptr = 0; + } +#endif /* !SYNCHRONIZED_SOUND && VOL_ONLY_SOUND */ +} +#endif /* CONSOLE_SOUND */ + +#ifdef VOL_ONLY_SOUND +static void Update_vol_only_sound_rf(void) +{ +#ifdef CONSOLE_SOUND + POKEYSND_UpdateConsol(0); /* mmm */ +#endif /* CONSOLE_SOUND */ +} +#endif /* VOL_ONLY_SOUND */ diff --git a/PVAtari800/atari800-src/pokeysnd.h b/PVAtari800/atari800-src/pokeysnd.h new file mode 100644 index 0000000000..0981d97f63 --- /dev/null +++ b/PVAtari800/atari800-src/pokeysnd.h @@ -0,0 +1,140 @@ +/*****************************************************************************/ +/* */ +/* Module: POKEY Chip Simulator Includes, V2.3 */ +/* Purpose: To emulate the sound generation hardware of the Atari POKEY chip. */ +/* Author: Ron Fries */ +/* */ +/* Revision History: */ +/* */ +/* 09/22/96 - Ron Fries - Initial Release */ +/* 04/06/97 - Brad Oliver - Some cross-platform modifications. Added */ +/* big/little endian #defines, removed , */ +/* conditional defines for TRUE/FALSE */ +/* 01/19/98 - Ron Fries - Changed signed/unsigned sample support to a */ +/* compile-time option. Defaults to unsigned - */ +/* define SIGNED_SAMPLES to create signed. */ +/* */ +/*****************************************************************************/ +/* */ +/* License Information and Copyright Notice */ +/* ======================================== */ +/* */ +/* PokeySound is Copyright(c) 1996-1998 by Ron Fries */ +/* */ +/* This library is free software; you can redistribute it and/or modify it */ +/* under the terms of version 2 of the GNU Library General Public License */ +/* as published by the Free Software Foundation. */ +/* */ +/* This library is distributed in the hope that it will be useful, but */ +/* WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library */ +/* General Public License for more details. */ +/* To obtain a copy of the GNU Library General Public License, write to the */ +/* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +/* */ +/* Any permitted reproduction of these routines, in whole or in part, must */ +/* bear this legend. */ +/* */ +/*****************************************************************************/ + +#ifndef POKEYSND_H_ +#define POKEYSND_H_ + +#include "config.h" +#include "pokey.h" + +/* CONSTANT DEFINITIONS */ + +/* As an alternative to using the exact frequencies, selecting a playback + frequency that is an exact division of the main clock provides a higher + quality output due to less aliasing. For best results, a value of + 1787520 MHz is used for the main clock. With this value, both the + 64 kHz and 15 kHz clocks are evenly divisible. Selecting a playback + frequency that is also a division of the clock provides the best + results. The best options are FREQ_64 divided by either 2, 3, or 4. + The best selection is based on a trade off between performance and + sound quality. + + Of course, using a main clock frequency that is not exact will affect + the pitch of the output. With these numbers, the pitch will be low + by 0.127%. (More than likely, an actual unit will vary by this much!) */ + +#define POKEYSND_FREQ_17_EXACT 1789790 /* exact 1.79 MHz clock freq */ +#define POKEYSND_FREQ_17_APPROX 1787520 /* approximate 1.79 MHz clock freq */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* #define SIGNED_SAMPLES */ /* define for signed output */ + +#ifdef POKEYSND_SIGNED_SAMPLES /* if signed output selected */ +#define POKEYSND_SAMP_MAX 127 /* then set signed 8-bit clipping ranges */ +#define POKEYSND_SAMP_MIN -128 +#define POKEYSND_SAMP_MID 0 +#else +#define POKEYSND_SAMP_MAX 255 /* else set unsigned 8-bit clip ranges */ +#define POKEYSND_SAMP_MIN 0 +#define POKEYSND_SAMP_MID 128 +#endif + +/* init flags */ +#define POKEYSND_BIT16 1 + +extern SLONG POKEYSND_playback_freq; +extern UBYTE POKEYSND_num_pokeys; +extern int POKEYSND_snd_flags; + +extern int POKEYSND_enable_new_pokey; +extern int POKEYSND_stereo_enabled; +extern int POKEYSND_serio_sound_enabled; +extern int POKEYSND_console_sound_enabled; +extern int POKEYSND_bienias_fix; + +extern void (*POKEYSND_Process_ptr)(void *sndbuffer, int sndn); +extern void (*POKEYSND_Update_ptr)(UWORD addr, UBYTE val, UBYTE chip, UBYTE gain); +extern void (*POKEYSND_UpdateSerio)(int out, UBYTE data); +extern void (*POKEYSND_UpdateConsol_ptr)(int set); +extern void (*POKEYSND_UpdateVolOnly)(void); + +int POKEYSND_Init(ULONG freq17, int playback_freq, UBYTE num_pokeys, + int flags +#ifdef __PLUS + , int clear_regs +#endif + ); +void POKEYSND_Update(UWORD addr, UBYTE val, UBYTE /*chip*/, UBYTE gain); +void POKEYSND_UpdateConsol(int set); +void POKEYSND_Process(void *sndbuffer, int sndn); +int POKEYSND_DoInit(void); +void POKEYSND_SetMzQuality(int quality); + +/* Volume only emulations declarations */ +#ifdef VOL_ONLY_SOUND + +#define POKEYSND_SAMPBUF_MAX 2000 +extern int POKEYSND_sampbuf_val[POKEYSND_SAMPBUF_MAX]; /* volume values */ +extern int POKEYSND_sampbuf_cnt[POKEYSND_SAMPBUF_MAX]; /* relative start time */ +extern int POKEYSND_sampbuf_ptr; /* pointer to sampbuf */ +extern int POKEYSND_sampbuf_rptr; /* pointer to read from sampbuf */ +extern int POKEYSND_sampbuf_last; /* last absolute time */ +extern int POKEYSND_sampbuf_AUDV[4 * POKEY_MAXPOKEYS]; /* prev. channel volume */ +extern int POKEYSND_sampbuf_lastval; /* last volume */ +extern int POKEYSND_sampout; /* last out volume */ +extern int POKEYSND_samp_freq; +extern int POKEYSND_samp_consol_val; /* actual value of console sound */ +#endif /* VOL_ONLY_SOUND */ + +#ifdef SYNCHRONIZED_SOUND +extern UBYTE *POKEYSND_process_buffer; +extern unsigned int POKEYSND_process_buffer_length; +extern unsigned int POKEYSND_process_buffer_fill; +extern void (*POKEYSND_GenerateSync)(unsigned int num_ticks); +int POKEYSND_UpdateProcessBuffer(void); +#endif /* SYNCHRONIZED_SOUND */ + +#ifdef __cplusplus +} + +#endif +#endif /* POKEYSND_H_ */ diff --git a/PVAtari800/atari800-src/rdevice.c b/PVAtari800/atari800-src/rdevice.c new file mode 100644 index 0000000000..b71d71f3d4 --- /dev/null +++ b/PVAtari800/atari800-src/rdevice.c @@ -0,0 +1,1455 @@ +/* + * rdevice.c - Atari850 emulation + * + * Copyright (c) ???? Tom Hunt, Chris Martin + * Copyright (c) 2003-2005,2007-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* Originally From Closer To Home (Tom Hunt) + * + * 2003.04.03 cmartin@ti.com - Added connecting Host name lookup and port + * changing as well as CONNECT_STRING changing... + * 2003.04.03 cmartin@ti.com - Added setsockopt SO_REUSEADDR for socket to + * allow reconnections + * 2003.04.05 cmartin@ti.com - Added sighandler for catching SIGPIPE error... + * can get this and cause the emu to crash if + * the other end disconnects prematurely... + * 2003.04.06 cmartin@ti.com - Added translation on/off and line feeds + * - Fixed IP address lookup (print ip address if + * lookup fails...) + * 2003.04.07 cmartin@ti.com - Added Local echo when not connected. + * 2003.04.17 cmartin@ti.com - Added Telnet escape sequence parsing for + * connecting to telnet + * 2003.09.02 cmartin@ti.com - Cleaned up Serial port (/dev/ttyS*) Handling + * 2003.09.05 cmartin@ti.com - Included minor bug fixes submitted from + * Christian Groessler (thanks Chris!) + * - Removed erroneous return in RREAD(). + * - Fixed typo for 9600 baud in xio_36() + * - Modified serial port dev_name generation in + * open_connection_serial() + * - Now we only modify the serial port options if + * we can open a port (in open_connection_serial()) + * - Removed Telnet IAC escape sequence handling in + * RWRIT() and now we only + * write to the port if we are connected. + * 2003.09.08 cmartin@ti.com - Added missing baud rates and data word + * lengths (5,6,7,8) + * 2003.09.11 cmartin@ti.com - Fixed Address lookup in open_connection() + * - Reformatted and cleaned whole file. + * - Removed all memory writes to addresses + * 746 - 749 except within the RSTAT function. + * + * TODO: + * create a new socket and a buffer for each port number.... + * non-concurrent mode error reporting to 747 + * error bits in location 746 + * implement xio 32? + * error reporting to CPU_regY + * heavy ASCII translation + * controlling DTR, RTS, & XMT - xio 34 + * + * Dialing out via telnet: + * Type "ATDL" to toggle Linefeeds on/off (normally off) + * Type "ATDI " example: "ATDI localhost 23" + * if the port is omitted, then 23 is assumed. + * + */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DEBUG +#define DBG_APRINT(x) Log_print(x) +#else +#define DBG_APRINT(x) +#endif + +#if 0 /* debug stuff */ +#ifdef R_NETWORK +#warning R_NETWORK defined +#endif +#ifdef R_SERIAL +#warning R_SERIAL defined +#endif +#endif + +#ifdef HAVE_WINDOWS_H +#ifdef R_SERIAL +#error The Windows version does not support the serial R: device +#endif +#ifndef R_NETWORK +#error R_NETWORK must be defined to use the Windows R: device +#endif +#include + #define F_SETFL 0 + #define O_NONBLOCK 0 + #define WM_SOCKET (WM_USER+20) + #define inet_pton(fam,ip,addr) ((addr)->s_addr = inet_addr(ip), 0) +static u_long ioctlsocket_non_block = 1; /* for ioctlsocket */ +#define perror(a) printf("%s:WSA error code:%d\n",a,WSAGetLastError()) +#define close(a) closesocket(a) +typedef char *caddr_t; +static void catch_disconnect(int sig); +static int rdevice_win32_read(SOCKET s, char *buf, int len) { + int r; + r = recv(s, buf, len, 0); + if (r <= 0 ) { + switch (WSAGetLastError()) { + case WSAECONNRESET: + case WSAECONNABORTED: + case WSAESHUTDOWN: + catch_disconnect(0); + break; + } + } + return r; +} + +static int rdevice_win32_write(SOCKET s, char *buf, int len) { + int r; + r = send(s, buf, len, 0); + if (r <= 0 ) { + switch (WSAGetLastError()) { + case WSAECONNRESET: + case WSAECONNABORTED: + case WSAESHUTDOWN: + catch_disconnect(0); + break; + } + } + return r; +} + +#define read(a,b,c) rdevice_win32_read(a,b,c) +#define write(a,b,c) rdevice_win32_write(a,b,c) + +#elif defined(DREAMCAST) /* above WIN32, below DREAMCAST */ + +/* these functions reside in dc/atari_dc.c */ +extern void dc_init_serial(void); +extern int dc_write_serial(unsigned char byte); +extern int dc_read_serial(unsigned char *byte); +extern void dc_set_baud(int baud); + +#else /* above DREAMCAST, below not WIN32 and not DREAMCAST */ + +#if !defined(R_SERIAL) && !defined(R_NETWORK) +#error R: device needs serial or network or both +#endif +#ifdef R_NETWORK +#include +#include +#include +#include +#include +#endif /* R_NETWORK */ +#include +#include +#endif /* not WIN32 and not DREAMCAST */ + +#if defined(R_SERIAL) && !defined(DREAMCAST) +#include +#endif /* defined(R_SERIAL) && !defined(DREAMCAST) */ + +#include "atari.h" +#include "rdevice.h" +#include "cpu.h" +#include "devices.h" +#include "log.h" +#include "memory.h" +#include "util.h" + +#define Peek(a) MEMORY_dGetByte(a) +#define DPeek(a) MEMORY_dGetWord(a) +#define Poke(x,y) MEMORY_dPutByte(x, y) + +/*--------------------------------------------------------------------------- + Global Variables +---------------------------------------------------------------------------*/ +static int connected; +static int do_once; +static int rdev_fd; + +#ifdef R_NETWORK +static struct sockaddr_in in; +static struct sockaddr_in peer_in; +static int sock; +static int portnum = 9000; +static char inetaddress[256]; +static char CONNECT_STRING[40] = "\r\n_CONNECT 2400\r\n"; +static int retval; +#endif /* R_NETWORK */ + +static char MESSAGE[256]; +static char command_buf[256]; +static char bufout[256]; +static int concurrent; + +static int command_end = 0; +static int translation = 1; +static int trans_cr = 0; +static int linefeeds = 1; +static int bufend = 0; + +#ifndef R_NETWORK +int RDevice_serial_enabled = 1; +#else +int RDevice_serial_enabled = 0; /* Default to network, if enabled. Use parameter to -rdevice command line switch to enable serial mode. */ +#endif +char RDevice_serial_device[FILENAME_MAX]; + +/*--------------------------------------------------------------------------- + Host Support Function - If Disconnect signal is found, then close socket + and clean up. +---------------------------------------------------------------------------*/ +#ifdef R_NETWORK +static void catch_disconnect(int sig) +{ + DBG_APRINT("R*: Disconnected...."); + close(rdev_fd); + connected = 0; + do_once = 0; + bufout[0] = 0; + strcat(bufout, "\r\nNO CARRIER\r\n"); + bufend = 13; +#if 0 + Poke(747,bufend); + Poke(748,0); +#endif +} +#endif /* R_NETWORK */ + +/*--------------------------------------------------------------------------- + Host Support Function - XIO 34 - Called from RDevice_SPEC + Controls handshake lines DTR, RTS, SD +---------------------------------------------------------------------------*/ +static void xio_34(void) +{ +#ifndef DREAMCAST /* Dreamcast port doesn't currently support handshake lines */ + int temp; + /*int fid;*/ +#ifdef R_SERIAL + struct termios options; +#endif /* R_SERIAL */ + /*int status;*/ + + /*fid = MEMORY_dGetByte(0x2e) >> 4;*/ + temp = MEMORY_dGetByte(Devices_ICAX1Z); + +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { + tcgetattr(rdev_fd, &options); + /*ioctl(rdev_fd, TIOCMGET, &status);*/ + } +#endif /* R_SERIAL */ + + if(temp & 0x80) + { + if(temp & 0x40) + { + /* turn DTR on */ +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { + /*status |= TIOCM_DTR;*/ + } +#endif /* R_SERIAL */ + } + else + { + /*Drop DTR*/ +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { + cfsetispeed(&options, B0); + cfsetospeed(&options, B0); + } +#endif /* R_SERIAL */ + + if(connected != 0) + { + close ( rdev_fd ); + connected = 0; + do_once = 0; + /*bufend = 0;*/ + } + } + } + +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { + /* RTS Set/Clear*/ + if(temp & 0x20) + { + if(temp & 0x10) + { + /*status |= TIOCM_RTS;*/ + } + else + { + /*status &= ~TIOCM_RTS;*/ + } + } + + if(temp & 0x02) + { + if(temp & 0x01) + { + /*status |= TIOCM_RTS;*/ + } + else + { + /*status &= ~TIOCM_RTS;*/ + } + } + } +#endif /* R_SERIAL */ + +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { + tcsetattr(rdev_fd, TCSANOW, &options); + /*ioctl(rdev_fd, TIOCMSET, &status);*/ + } +#endif /* R_SERIAL */ +#endif /* not defined DREAMCAST */ + + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; + +} + +/*--------------------------------------------------------------------------- + Host Support Function - XIO 36 - Called from RDevice_SPEC + Sets baud, stop bits, and ready monitoring. +---------------------------------------------------------------------------*/ +static void xio_36(void) +{ + int aux1, aux2; +#if defined(R_SERIAL) && !defined(DREAMCAST) + struct termios options; +#endif /* defined(R_SERIAL) && !defined(DREAMCAST) */ + + aux1 = MEMORY_dGetByte(Devices_ICAX1Z); + aux2 = MEMORY_dGetByte(Devices_ICAX2Z); + +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { +#ifndef DREAMCAST + tcgetattr(rdev_fd, &options); + + /*Set Stop bits*/ + if(aux1 & 0x80) + { /*2 Stop bits*/ + options.c_cflag |= CSTOPB; + } + else + { /*1 Stop bit*/ + options.c_cflag &= ~CSTOPB; + } + + /*Set word size*/ + if((aux1 & 0x30) == 0) + { /*8 bit word size*/ + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + } + else if((aux1 & 0x30) == 0x10) + { /*7 bit word size*/ + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS7; + } + else if((aux1 & 0x30) == 0x20) + { /*6 bit word size*/ + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS6; + } + else if((aux1 & 0x30) == 0x30) + { /*5 bit word size*/ + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS5; + } + else + { /*8 bit word size*/ + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + } + + /*Set Baud Rate*/ + if((aux1 & 0x0f) == 0) + { /*300 Baud*/ + cfsetispeed(&options, B300); + cfsetospeed(&options, B300); + } + else if((aux1 & 0x0f) == 1) + { /* 45.5 Baud (unsupported) - now 57600 */ +#ifdef B57600 + cfsetispeed(&options, B57600); + cfsetospeed(&options, B57600); +#else + cfsetispeed(&options, B50); + cfsetospeed(&options, B50); +#endif + } + else if ((aux1 & 0x0f) == 2) + { /* 50 Baud */ + cfsetispeed(&options, B50); + cfsetospeed(&options, B50); + } + else if ((aux1 & 0x0f) == 3) + { /* 56.875 Baud (unsupported) - now 115200 */ +#ifdef B115200 + cfsetispeed(&options, B115200); + cfsetospeed(&options, B115200); +#else + cfsetispeed(&options, B50); + cfsetospeed(&options, B50); +#endif + } + else if((aux1 & 0x0f) == 4) + { /* 75 Baud */ + cfsetispeed(&options, B75); + cfsetospeed(&options, B75); + } + else if((aux1 & 0x0f) == 5) + { /* 110 Baud */ + cfsetispeed(&options, B110); + cfsetospeed(&options, B110); + } + else if((aux1 & 0x0f) == 6) + { /* 134.5 Baud */ + cfsetispeed(&options, B134); + cfsetospeed(&options, B134); + } + else if((aux1 & 0x0f) == 7) + { /* 150 Baud */ + cfsetispeed(&options, B150); + cfsetospeed(&options, B150); + } + else if((aux1 & 0x0f) == 8) + { /* 300 Baud */ + cfsetispeed(&options, B300); + cfsetospeed(&options, B300); + } + else if((aux1 & 0x0f) == 9) + { /* 600 Baud */ + cfsetispeed(&options, B600); + cfsetospeed(&options, B600); + } + else if((aux1 & 0x0f) == 10) + { /* 1200 Baud */ + cfsetispeed(&options, B1200); + cfsetospeed(&options, B1200); + } + else if((aux1 & 0x0f) == 12) + { /* 2400 Baud */ + cfsetispeed(&options, B2400); + cfsetospeed(&options, B2400); + } + else if((aux1 & 0x0f) == 13) + { /* 4800 Baud */ + cfsetispeed(&options, B4800); + cfsetospeed(&options, B4800); + } + else if((aux1 & 0x0f) == 14) + { /* 9600 Baud */ + cfsetispeed(&options, B9600); + cfsetospeed(&options, B9600); + } + else if((aux1 & 0x0f) == 15) + { /* 19200 Baud */ +#ifdef B19200 + cfsetispeed(&options, B19200); + cfsetospeed(&options, B19200); +#else + cfsetispeed(&options, B9600); + cfsetospeed(&options, B9600); +#endif + } + else + { /* 115200 Baud (can add 38400, 76800 if wanted) */ +#ifdef B115200 + cfsetispeed(&options, B115200); + cfsetospeed(&options, B115200); +#else + cfsetispeed(&options, B9600); + cfsetospeed(&options, B9600); +#endif + } + + if(aux1 & 0x40) + { /* 230400 Baud */ +#ifdef B230400 + cfsetispeed(&options, B230400); + cfsetospeed(&options, B230400); +#endif + } + + tcsetattr(rdev_fd, TCSANOW, &options); +#else /* below DREAMCAST, above not; both R_SERIAL */ + /* Set Stop bits */ + if(aux1 & 0x80) + { /* 2 Stop bits */ + /* currently not supported on DC */ + } + else + { /* 1 Stop bit */ + /* currently not supported on DC */ + } + + /* Set word size */ + if((aux1 & 0x30) == 0) + { /* 8 bit word size */ + /* currently not supported on DC */ + } + else if((aux1 & 0x30) == 0x10) + { /* 7 bit word size */ + /* currently not supported on DC */ + } + else if((aux1 & 0x30) == 0x20) + { /* 6 bit word size */ + /* currently not supported on DC */ + } + else if((aux1 & 0x30) == 0x30) + { /* 5 bit word size */ + /* currently not supported on DC */ + } + else + { /* 8 bit word size */ + /* currently not supported on DC */ + } + + /* Set Baud Rate */ + if((aux1 & 0x0f) == 0) + { /* 300 Baud */ + dc_set_baud(300); + } + else if((aux1 & 0x0f) == 1) + { /* 45.5 Baud (unsupported) - now 57600 */ + dc_set_baud(57600); + } + else if ((aux1 & 0x0f) == 2) + { /* 50 Baud */ + dc_set_baud(50); + } + else if ((aux1 & 0x0f) == 3) + { /* 56.875 Baud (unsupported) - now 115200 */ + dc_set_baud(115200); + } + else if((aux1 & 0x0f) == 4) + { /* 75 Baud */ + dc_set_baud(75); + } + else if((aux1 & 0x0f) == 5) + { /* 110 Baud */ + dc_set_baud(110); + } + else if((aux1 & 0x0f) == 6) + { /* 134.5 Baud */ + dc_set_baud(134); + } + else if((aux1 & 0x0f) == 7) + { /* 150 Baud */ + dc_set_baud(150); + } + else if((aux1 & 0x0f) == 8) + { /* 300 Baud */ + dc_set_baud(300); + } + else if((aux1 & 0x0f) == 9) + { /* 600 Baud */ + dc_set_baud(600); + } + else if((aux1 & 0x0f) == 10) + { /* 1200 Baud */ + dc_set_baud(1200); + } + else if((aux1 & 0x0f) == 12) + { /* 2400 Baud */ + dc_set_baud(2400); + } + else if((aux1 & 0x0f) == 13) + { /* 4800 Baud */ + dc_set_baud(4800); + } + else if((aux1 & 0x0f) == 14) + { /* 9600 Baud */ + dc_set_baud(9600); + } + else if((aux1 & 0x0f) == 15) + { /* 19200 Baud */ + dc_set_baud(19200); + } + else + { /* 115200 Baud (can add 38400, 76800 if wanted) */ + dc_set_baud(115200); + } + + if(aux1 & 0x40) + { /* 230400 Baud */ + dc_set_baud(230400); + } +#endif /* DREAMCAST */ + } +#endif /* R_SERIAL */ + + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; +} + +/*--------------------------------------------------------------------------- + Host Support Function - XIO 38 - Called from RDevice_SPEC + Sets Translation and parity +---------------------------------------------------------------------------*/ +static void xio_38(void) +{ + int aux1; +#if defined(R_SERIAL) && !defined(DREAMCAST) + struct termios options; +#endif /* defined(R_SERIAL) && !defined(DREAMCAST) */ + + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; + + aux1 = Peek(Devices_ICAX1Z); +#if defined(R_SERIAL) && !defined(DREAMCAST) + if(RDevice_serial_enabled) + { + if(aux1 & 0x04) + { /*Odd Parity*/ + tcgetattr(rdev_fd, &options); + options.c_cflag |= PARENB; + options.c_cflag |= PARODD; + tcsetattr(rdev_fd, TCSANOW, &options); + } + else if(aux1 & 0x08) + { /*Even Parity*/ + tcgetattr(rdev_fd, &options); + options.c_cflag |= PARENB; + options.c_cflag &= ~PARODD; + tcsetattr(rdev_fd, TCSANOW, &options); + + } + else + { /*No Parity*/ + tcgetattr(rdev_fd, &options); + options.c_cflag &= ~PARENB; + tcsetattr(rdev_fd, TCSANOW, &options); + } + } +#endif /* defined(R_SERIAL) && !defined(DREAMCAST) */ + + if(aux1 & 0x20) + { /* No Translation */ + DBG_APRINT("R*: No ATASCII/ASCII TRANSLATION"); + translation = 0; + } + else + { + translation = 1; + } + + if(aux1 & 0x40) + { /* Append line feed */ + DBG_APRINT("R*: Append Line Feeds"); + linefeeds = 1; + } + else + { + linefeeds = 0; + } + +} + +/*--------------------------------------------------------------------------- + Host Support Function - XIO 40 - Called from RDevice_SPEC + Sets concurrent mode. Also checks for dropped carrier. +---------------------------------------------------------------------------*/ +static void xio_40(void) +{ + + int aux1; +/* + if(connected == 0) + Poke(747,0); +*/ + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; + + aux1 = Peek(Devices_ICAX1Z); + + if(aux1 >= 12) + { + concurrent = 1; + DBG_APRINT("R*: Entering concurrent IO mode..."); + } + else + { + concurrent = 0; + snprintf(MESSAGE, sizeof(MESSAGE), "R*: XIO 40, %d", aux1); + DBG_APRINT(MESSAGE); + } + +} + +/*--------------------------------------------------------------------------- + Host Support Function - Internet Socket Open Connection +---------------------------------------------------------------------------*/ +#ifdef R_NETWORK +static void open_connection(char * address, int port) +{ + struct hostent *host; +#ifdef HAVE_WINDOWS_H + static int winsock_started; + WSADATA wdata; + WORD ver = MAKEWORD(1,1); + int ret; + if (!winsock_started) { + ret = WSAStartup(ver, &wdata); + if (ret) { + printf("Error in WSAStartup,return code:%d\n", ret); + } + winsock_started = 1; + } +#endif /* HAVE_WINDOWS_H */ + if((address != NULL) && (strlen(address) > 0)) + { + close(rdev_fd); + close(sock); + do_once = 1; + connected = 1; + memset ( &peer_in, 0, sizeof ( struct sockaddr_in ) ); + /*rdev_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);*/ + rdev_fd = socket(AF_INET, SOCK_STREAM, 0); +#ifdef HAVE_WINDOWS_H + ioctlsocket(rdev_fd, FIONBIO, &ioctlsocket_non_block); +#else + fcntl(rdev_fd, F_SETFL, O_NONBLOCK); +#endif + peer_in.sin_family = AF_INET; + if(inet_pton(AF_INET, address, &peer_in.sin_addr) == 0) + { /* invalid address if zero */ + if((peer_in.sin_addr.s_addr == -1) || (peer_in.sin_addr.s_addr == 0)) + { + host = gethostbyname(address); + if(host != NULL) + { + snprintf(MESSAGE, sizeof(MESSAGE), "R*: Host = '%s'.", host->h_name); + DBG_APRINT(MESSAGE); + memcpy((caddr_t)&peer_in.sin_addr, host->h_addr_list[0], host->h_length); + } + else + { + perror("gethostbyname"); + } + } + } + + if(port > 0) + { + peer_in.sin_port = htons (port); + } + else + { /* telnet port */ + peer_in.sin_port = htons (23); + } + if(connect(rdev_fd, (struct sockaddr *)&peer_in, sizeof(peer_in)) < 0) + { +#ifdef DEBUG + snprintf(MESSAGE, sizeof(MESSAGE), "R*: connect: '%s'", strerror(errno)); + DBG_APRINT(MESSAGE); +#endif + } +#ifndef HAVE_WINDOWS_H + signal(SIGPIPE, catch_disconnect); /*Need to see if the other end disconnects...*/ + signal(SIGHUP, catch_disconnect); /*Need to see if the other end disconnects...*/ +#endif /* HAVE_WINDOWS_H */ + snprintf(MESSAGE, sizeof(MESSAGE), "R*: Connecting to %s", address); + DBG_APRINT(MESSAGE); +#ifdef HAVE_WINDOWS_H + ioctlsocket(rdev_fd, FIONBIO, &ioctlsocket_non_block); +#else + fcntl(rdev_fd, F_SETFL, O_NONBLOCK); +#endif /* HAVE_WINDOWS_H */ + + /* Telnet negotiation */ + snprintf(MESSAGE, sizeof(MESSAGE), "%c%c%c%c%c%c%c%c%c", 0xff, 0xfb, 0x01, 0xff, 0xfb, 0x03, 0xff, 0xfd, 0x0f3); + write(rdev_fd, MESSAGE, 9); + DBG_APRINT("R*: Negotiating Terminal Options..."); + } +} +#endif /* R_NETWORK */ + + +#if defined(R_SERIAL) && !defined(DREAMCAST) +#ifdef __linux__ +#define TTY_DEV_NAME "/dev/ttyS0" /* Linux */ +#elif defined (__NetBSD__) && defined(__i386__) +#define TTY_DEV_NAME "/dev/tty00" /* NetBSD/x86 */ +#elif defined (__FreeBSD__) && defined(__i386__) +#define TTY_DEV_NAME "/dev/ttyd1" /* FreeBSD/x86 */ +#elif defined (__sun__) +#define TTY_DEV_NAME "/dev/ttya" /* Solaris */ +#else +#error tty name unknown! +#endif +#endif /* defined(R_SERIAL) && !defined(DREAMCAST) */ + +/*--------------------------------------------------------------------------- + Host Support Function - Serial Open Connection +---------------------------------------------------------------------------*/ +#ifdef R_SERIAL +static void open_connection_serial(int port) +{ +#ifdef DREAMCAST + dc_init_serial(); + connected = 1; +#else /* above DREAMCAST, below not */ + char dev_name[FILENAME_MAX] = TTY_DEV_NAME; /* reinitialize each time */ + struct termios options; + + if(connected) + close(rdev_fd); + do_once = 1; + + if (*RDevice_serial_device) /* got a device name from command line */ + { + strcpy(dev_name, RDevice_serial_device); + } + + dev_name[strlen(dev_name) - 1] += port - 1; + + snprintf(MESSAGE, sizeof(MESSAGE), "R*: using serial device %s", dev_name); + DBG_APRINT(MESSAGE); + + rdev_fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY); + if(rdev_fd == -1) + { + connected = 0; + perror("R*: open_port: Unable to open serial Port - "); + } + else + { + connected = 1; +#if 0 + fcntl(rdev_fd, F_SETFL, O_NONBLOCK); +#endif + /*Set 8N1 by default on open*/ + /*Set Baud to 115200 by default;*/ + tcgetattr(rdev_fd, &options); + options.c_lflag = 0; + options.c_iflag = 0; + options.c_oflag = 0; + options.c_cc[VMIN] = 1; + options.c_cc[VTIME] = 0; + + options.c_cflag = CS8 | CREAD | CLOCAL; +#if 0 + cfmakeraw(&options); +/*#else*/ + /* from glibc 2.3.2 */ + options.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); + options.c_oflag &= ~OPOST; + options.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); + options.c_cflag &= ~(CSIZE|PARENB); + options.c_cflag |= CS8; + options.c_cc[VMIN] = 1; /* read returns when one char is available. */ + options.c_cc[VTIME] = 0; +#endif + + cfsetispeed(&options, B115200); + cfsetospeed(&options, B115200); + tcsetattr(rdev_fd, TCSANOW, &options); + } +#endif /* not DREAMCAST */ +} +#endif /* R_SERIAL */ + +/*--------------------------------------------------------------------------- + Host Support Function - Retrieve address from open command: + From Basic: OPEN #1,8,23,"R:JYBOLAC.HOMELINUX.COM" + Returns: "jybolac.homelinux.com" +---------------------------------------------------------------------------*/ +#ifdef R_NETWORK +static void RDevice_GetInetAddress(void) +{ + UWORD bufadr = Devices_SkipDeviceName(); + char *p; + + if (bufadr == 0) { + /* XXX: signal error */ + inetaddress[0] = '\0'; + return; + } + + p = inetaddress; + while (p < inetaddress + sizeof(inetaddress) - 1) { + char c = (char) MEMORY_dGetByte(bufadr); + if (c < '!' || c > '\x7e') + break; + if (c >= 'A' && c <= 'Z') + c += 'a' - 'A'; + *p++ = c; + bufadr++; + } + *p = '\0'; +} +#endif /* R_NETWORK */ + + +/*--------------------------------------------------------------------------- + R Device OPEN vector - called from Atari OS Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_OPEN(void) +{ + int port; + int direction; + int devnum; + + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; + + bufend = 0; + + port = Peek(Devices_ICAX2Z); + direction = Peek(Devices_ICAX1Z); + devnum = MEMORY_dGetByte(Devices_ICDNOZ); + if(direction & 0x04) + { + DBG_APRINT("R*: Open for Reading..."); + } + + if(direction & 0x08) + { + DBG_APRINT("R*: Open for Writing..."); +#ifdef R_SERIAL + if(RDevice_serial_enabled) + { + DBG_APRINT("R*: serial mode."); + open_connection_serial(devnum); + } +#endif /* R_SERIAL */ +#if defined(R_SERIAL) && defined(R_NETWORK) + else +#endif +#ifdef R_NETWORK + { + DBG_APRINT("R*: Socket mode."); + RDevice_GetInetAddress(); + open_connection(inetaddress, port); + } +#endif /* R_NETWORK */ + } + if(direction & 0x01) + { + /* Open for concurrent mode */ + } + +} + +/*--------------------------------------------------------------------------- + R Device CLOSE vector - called from Atari OS Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_CLOS(void) +{ + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; + concurrent = 0; + bufend = 0; + close(rdev_fd); +} + +/*--------------------------------------------------------------------------- + R Device READ vector - called from Atari OS Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_READ(void) +{ + int j; + + /*bufend = Peek(747);*/ + /*printf("Bufend = %d.\n", bufend);*/ + +/* if(bufend >= 0) */ +/* { */ + if(translation) + { + if(bufout[0] == 0x0d) + { + CPU_regA = 0x9b; + } + } + else + { + CPU_regA = bufout[0]; + } + + bufend--; + + for(j = 0; j <= bufend; j++) + { + bufout[j] = bufout[j+1]; + } + + /*Cycle the buffer again to skip over linefeed....*/ + if(translation && linefeeds && (bufout[0] == 0x0a)) + { + for(j = 0; j <= bufend; j++) + { + bufout[j] = bufout[j+1]; + } + } + /*return; ???*/ +/* } */ + + CPU_regY = 1; + CPU_ClrN; +} + + + +/*--------------------------------------------------------------------------- + R Device WRITE vector - called from Atari OS Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_WRIT(void) +{ + unsigned char out_char; +#ifdef R_NETWORK + int port; +#endif + + CPU_regY = 1; + CPU_ClrN; + + /*bufend = Peek(747);*/ + + /* Translation mode */ + if(translation) + { + if(CPU_regA == 0x9b) + { + out_char = 0x0d; + if(linefeeds) + { + if((RDevice_serial_enabled == 0) && (connected == 0)) + { /* local echo */ + bufend++; + bufout[bufend-1] = out_char; + bufout[bufend] = 0; + + command_end = 0; + command_buf[command_end] = 0; + strcat(bufout, "OK\r\n"); + bufend += 4; + + } + else + { +#ifndef DREAMCAST + write(rdev_fd, (char *)&out_char, 1); /* Write return */ +#else + dc_write_serial(out_char); +#endif + } + out_char = 0x0a; /*set char for line feed to be output later....*/ + } + } + } + else + { + out_char = CPU_regA; + } + + /* Translate the CR to a LF for telnet, ftp, etc */ + if(connected && trans_cr && (out_char == 0x0d)) + { + out_char = 0x0a; + } + + /*if((RDevice_serial_enabled == 0) && (out_char == 255))*/ + /*{*/ + /* DBG_APRINT("R: Writing IAC..."); */ + /* retval = write(rdev_fd, &out_char, 1);*/ /* IAC escape sequence */ + /*}*/ + /*if(retval == -1)*/ + +#ifdef R_NETWORK + if((RDevice_serial_enabled == 0) && (connected == 0)) + { /* Local echo - only do if in socket mode */ + bufend++; + bufout[bufend-1] = out_char; + bufout[bufend] = 0; + + /* Grab Command */ + if((out_char == 0x9b) || (out_char == 0x0d)) + { /*process command with a return/enter*/ + command_end = 0; + + /*Make out going connection command 'ATDI'*/ + if((command_buf[0] == 'A') && (command_buf[1] == 'T') && (command_buf[2] == 'D') && (command_buf[3] == 'I')) + { + /*DBG_APRINT(command_buf);*/ + if(strchr(command_buf, ' ') != NULL) + { + if(strrchr(command_buf, ' ') != strchr(command_buf, ' ')) + { + port = atoi((char *)(strrchr(command_buf, ' ')+1)); + * strrchr(command_buf, ' ') = '\0'; /*zero last space in line*/ + } + else + { + port = 23; + } + open_connection((char *)(strchr(command_buf, ' ')+1), port); /*send string after first space in line*/ + } + command_buf[command_end] = 0; + strcat(bufout, "OK\r\n"); + bufend += 4; + /*Change translation command 'ATDL'*/ + } + else if((command_buf[0] == 'A') && (command_buf[1] == 'T') && (command_buf[2] == 'D') && (command_buf[3] == 'L')) + { + trans_cr = (trans_cr + 1) % 2; + + command_buf[command_end] = 0; + strcat(bufout, "OK\r\n"); + bufend += 4; + } + } + else + { + if(((out_char == 0x7f) || (out_char == 0x08)) && (command_end > 0)) + { + command_end--; /* backspace */ + command_buf[command_end] = 0; + } + else + { + command_buf[command_end] = out_char; + command_buf[command_end+1] = 0; + command_end = (command_end + 1) % 256; + } + } + } + else +#endif /* R_NETWORK */ +#ifndef DREAMCAST + if((connected) && (write(rdev_fd, (char *)&out_char, 1) < 1)) + { /* returns -1 if disconnected or 0 if could not send */ + perror("write"); + DBG_APRINT("R*: ERROR on write."); + CPU_SetN; + CPU_regY = 135; + /*bufend = 13;*/ /* To catch NO CARRIER message */ + } +#else + if (connected) + { + if (dc_write_serial(out_char) != 1) + { + Log_print("R*: ERROR on write."); + CPU_SetN; + CPU_regY = 135; + } + } +#endif + + CPU_regA = 1; +} + +/*--------------------------------------------------------------------------- + R Device GET STATUS vector - called from Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_STAT(void) +{ +#ifdef HAVE_WINDOWS_H + int len; +#else +#ifdef R_NETWORK + unsigned int len; +#endif +#endif + int bytesread; + unsigned char one; + int devnum; + int on; + unsigned char telnet_command[2]; + /*static char IACctr = 0;*/ + on = 1; + + if(Peek(764) == 1) + { /* Hack for Ice-T Terminal program to work! */ + Poke(764, 255); + } + devnum = MEMORY_dGetByte(Devices_ICDNOZ); + +#ifdef R_NETWORK + if(connected == 0) + { + if(RDevice_serial_enabled == 0) + { + if(do_once == 0) + { + + /*strcpy(PORT,"23\n");*/ + /*strcpy(PORT,"8000\n");*/ + /*sprintf(PORT, "%d", 8000 + devnum);*/ + portnum = portnum + devnum - 1; + + /* Set up the listening port. */ + do_once = 1; + memset ( &in, 0, sizeof ( struct sockaddr_in ) ); + sock = socket ( AF_INET, SOCK_STREAM, 0 ); + in.sin_family = AF_INET; + in.sin_addr.s_addr = INADDR_ANY; + /*in.sin_port = htons ( atoi ( PORT ) );*/ + in.sin_port = htons (portnum); + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &on, sizeof(on) ); /* cmartin */ + if(bind ( sock, (struct sockaddr *)&in, sizeof ( struct sockaddr_in ) ) < 0) perror("bind"); + listen ( sock, 5 ); + /* sethostent(1); */ +#ifdef HAVE_WINDOWS_H + retval = ioctlsocket(sock, FIONBIO, &ioctlsocket_non_block); +#else + retval = fcntl( sock, F_SETFL, O_NONBLOCK); +#endif /* HAVE_WINDOWS_H */ + len = sizeof ( struct sockaddr_in ); + /*bufend = 0;*/ + snprintf(MESSAGE, sizeof(MESSAGE), "R%d: Listening on port %d...", devnum, portnum); + DBG_APRINT(MESSAGE); + } + + rdev_fd = accept ( sock, (struct sockaddr *)&peer_in, &len ); + if(rdev_fd != -1) + { + struct hostent *host; + if (getpeername(rdev_fd, (struct sockaddr *) &peer_in, &len) < 0) + { + perror("getpeername"); + } + else + { + snprintf(MESSAGE, sizeof(MESSAGE), "R%d: Serving Connection from %s...", devnum, inet_ntoa(peer_in.sin_addr)); + if ((host = gethostbyaddr((char *) &peer_in.sin_addr, sizeof peer_in.sin_addr, AF_INET)) == NULL) + { + /*perror("gethostbyaddr");*/ + /*DBG_APRINT("Connected.");*/ + } else { + snprintf(MESSAGE, sizeof(MESSAGE), "R%d: Serving Connection from %s.", devnum, host->h_name); + } + } + DBG_APRINT(MESSAGE); +#ifndef HAVE_WINDOWS_H + signal(SIGPIPE, catch_disconnect); /*Need to see if the other end disconnects...*/ + signal(SIGHUP, catch_disconnect); /*Need to see if the other end disconnects...*/ +#endif /* HAVE_WINDOWS_H */ +#ifdef HAVE_WINDOWS_H + retval = ioctlsocket(rdev_fd, FIONBIO, &ioctlsocket_non_block); +#else + retval = fcntl( rdev_fd, F_SETFL, O_NONBLOCK); +#endif /* HAVE_WINDOWS_H */ + + /* Telnet negotiation */ + snprintf(MESSAGE, sizeof(MESSAGE), "%c%c%c%c%c%c%c%c%c", 0xff, 0xfb, 0x01, 0xff, 0xfb, 0x03, 0xff, 0xfd, 0x0f3); + write(rdev_fd, MESSAGE, 9); + DBG_APRINT("R*: Negotiating Terminal Options..."); + + connected = 1; + /* + retval = write(rdev_fd, &IACdoBinary, 3); + retval = write(rdev_fd, &IACwillBinary, 3); + retval = write(rdev_fd, &IACdontLinemode, 3); + retval = write(rdev_fd, &IACwontLinemode, 3); + */ + bufout[0] = 0; + strcat(bufout, CONNECT_STRING); + bufend = strlen(CONNECT_STRING); + close(sock); + } + } + } + else +#endif /* R_NETWORK */ + { + /* Actually reading and setting the Atari input buffer here */ + if(concurrent) + { +#ifndef DREAMCAST + bytesread = read(rdev_fd, (char *)&one, 1); +#else + bytesread = dc_read_serial(&one); +#endif + if(bytesread > 0) + { + if((RDevice_serial_enabled == 0) && (one == 0xff)) + { + /* Start Telnet escape seq processing... */ + while(read(rdev_fd, (char *)telnet_command,2) != 2) {}; + + /*sprintf(MESSAGE, "Telnet Command = 0x%x 0x%x", telnet_command[0], telnet_command[1]);*/ + /*DBG_APRINT(MESSAGE);*/ + if(telnet_command[0] == 0xfd) + { /*DO*/ + if((telnet_command[1] == 0x01) || (telnet_command[1] == 0x03)) + { /* WILL ECHO and GO AHEAD (char mode) */ + telnet_command[0] = 0xfb; /* WILL */ + } + else + { + telnet_command[0] = 0xfc; /* WONT */ + } + } + else if(telnet_command[0] == 0xfb) + { /*WILL*/ + /*telnet_command[0] = 0xfd;*/ /*DO*/ + telnet_command[0] = 0xfe; /*DONT*/ + } + else if(telnet_command[0] == 0xfe) + { /*DONT*/ + telnet_command[0] = 0xfc; + } + else if(telnet_command[0] == 0xfc) + { /*WONT*/ + telnet_command[0] = 0xfe; + } + + if(telnet_command[0] == 0xfa) + { /* subnegotiation */ + while(read(rdev_fd, (char *)&one, 1) != 1) {}; + + while(one != 0xf0) + { /* wait for end of sub negotiation */ + while(read(rdev_fd, (char *)&one, 1) != 1) {}; + } + } + else + { + write(rdev_fd, (char *)&one, 1); + write(rdev_fd, (char *)telnet_command, 2); + } + } + else + { + bufend++; + bufout[bufend-1] = one; + bufout[bufend] = 0; + /*return;*/ + } + } + } + } + + /* Set all values at all memory locations we modify on exit */ + Poke(746,0); + Poke(748,0); + Poke(749,0); + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; + + if(concurrent) + { + Poke(747,bufend); + } + else + { + DBG_APRINT("R*: Not in concurrent mode...."); + /*Poke(747,8);*/ + Poke(747,(12+48+192)); /* Write 0xfc to address 747 */ + } +} + +/*--------------------------------------------------------------------------- + R Device SPECIAL vector - called from Atari OS Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_SPEC(void) +{ + int iccom; + + iccom = Peek(Devices_ICCOMZ); + snprintf(MESSAGE, sizeof(MESSAGE), "R*: XIO %d", iccom); + DBG_APRINT(MESSAGE); + +/* + DBG_APRINT("Devices_ICCOMZ ="); + DBG_APRINT("%d",iccom); + DBG_APRINT("^^ in Devices_ICCOMZ"); +*/ + + switch (iccom) + { + case 32: /*Force Short Block*/ + break; + case 34: + xio_34(); + break; + case 36: + xio_36(); + break; + case 38: + xio_38(); + break; + case 40: + xio_40(); + break; + default: + DBG_APRINT("R*: Unsupported XIO #."); + break; + } +/* + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; +*/ + +} + +/*--------------------------------------------------------------------------- + R Device INIT vector - called from Atari OS Device Handler Address Table +---------------------------------------------------------------------------*/ +void RDevice_INIT(void) +{ + DBG_APRINT("R*: INIT"); + CPU_regA = 1; + CPU_regY = 1; + CPU_ClrN; +} + +void RDevice_Exit(void) +{ +#ifdef HAVE_WINDOWS_H + WSACleanup(); +#endif /* HAVE_WINDOWS_H */ +} diff --git a/PVAtari800/atari800-src/rdevice.h b/PVAtari800/atari800-src/rdevice.h new file mode 100644 index 0000000000..90ec944476 --- /dev/null +++ b/PVAtari800/atari800-src/rdevice.h @@ -0,0 +1,41 @@ +/* + * rdevice.h - Atari850 emulation header file + * + * Copyright (c) ???? Tom Hunt, Chris Martin + * Copyright (c) 2003,2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef RDEVICE_H_ +#define RDEVICE_H_ + +extern void RDevice_OPEN(void); +extern void RDevice_CLOS(void); +extern void RDevice_READ(void); +extern void RDevice_WRIT(void); +extern void RDevice_STAT(void); +extern void RDevice_SPEC(void); +extern void RDevice_INIT(void); + +extern int RDevice_serial_enabled; +extern char RDevice_serial_device[]; + +extern void RDevice_Exit(void); + +#endif /* RDEVICE_H_ */ diff --git a/PVAtari800/atari800-src/remez.c b/PVAtari800/atari800-src/remez.c new file mode 100644 index 0000000000..f2fe955d09 --- /dev/null +++ b/PVAtari800/atari800-src/remez.c @@ -0,0 +1,643 @@ +/* + * remez.c - Parks-McClellan algorithm for FIR filter design (C version) + * + * Copyright (C) 1995,1998 Jake Janovetz + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include + +#include "remez.h" +#ifdef ASAP /* external project, see http://asap.sf.net */ +#include "asap_internal.h" +#else +#include "log.h" +#include "util.h" +#endif + +#define NEGATIVE 0 +#define POSITIVE 1 + +#define Pi 3.1415926535897932 +#define Pi2 6.2831853071795865 + +#define GRIDDENSITY 16 +#define MAXITERATIONS 40 + +/******************* + * CreateDenseGrid + *================= + * Creates the dense grid of frequencies from the specified bands. + * Also creates the Desired Frequency Response function (D[]) and + * the Weight function (W[]) on that dense grid + * + * + * INPUT: + * ------ + * int r - 1/2 the number of filter coefficients + * int numtaps - Number of taps in the resulting filter + * int numband - Number of bands in user specification + * double bands[] - User-specified band edges [2*numband] + * double des[] - Desired response per band [numband] + * double weight[] - Weight per band [numband] + * int symmetry - Symmetry of filter - used for grid check + * + * OUTPUT: + * ------- + * int gridsize - Number of elements in the dense frequency grid + * double Grid[] - Frequencies (0 to 0.5) on the dense grid [gridsize] + * double D[] - Desired response on the dense grid [gridsize] + * double W[] - Weight function on the dense grid [gridsize] + *******************/ + +static void CreateDenseGrid(int r, int numtaps, int numband, double bands[], + const double des[], const double weight[], + int *gridsize, double Grid[], + double D[], double W[], int symmetry) +{ + int i, j, k, band; + double delf, lowf, highf; + + delf = 0.5 / (GRIDDENSITY * r); + + /* For differentiator, hilbert, + * symmetry is odd and Grid[0] = max(delf, band[0]) */ + + if (symmetry == NEGATIVE && delf > bands[0]) + bands[0] = delf; + + j = 0; + for (band = 0; band < numband; band++) { + Grid[j] = bands[2 * band]; + lowf = bands[2 * band]; + highf = bands[2 * band + 1]; + k = (int) ((highf - lowf) / delf + 0.5); /* .5 for rounding */ + for (i = 0; i < k; i++) { + D[j] = des[band]; + W[j] = weight[band]; + Grid[j] = lowf; + lowf += delf; + j++; + } + Grid[j - 1] = highf; + } + + /* Similar to above, if odd symmetry, last grid point can't be .5 + * - but, if there are even taps, leave the last grid point at .5 */ + if ((symmetry == NEGATIVE) && + (Grid[*gridsize - 1] > (0.5 - delf)) && + (numtaps % 2)) + { + Grid[*gridsize - 1] = 0.5 - delf; + } +} + + +/******************** + * InitialGuess + *============== + * Places Extremal Frequencies evenly throughout the dense grid. + * + * + * INPUT: + * ------ + * int r - 1/2 the number of filter coefficients + * int gridsize - Number of elements in the dense frequency grid + * + * OUTPUT: + * ------- + * int Ext[] - Extremal indexes to dense frequency grid [r+1] + ********************/ + +static void InitialGuess(int r, int Ext[], int gridsize) +{ + int i; + + for (i = 0; i <= r; i++) + Ext[i] = i * (gridsize - 1) / r; +} + + +/*********************** + * CalcParms + *=========== + * + * + * INPUT: + * ------ + * int r - 1/2 the number of filter coefficients + * int Ext[] - Extremal indexes to dense frequency grid [r+1] + * double Grid[] - Frequencies (0 to 0.5) on the dense grid [gridsize] + * double D[] - Desired response on the dense grid [gridsize] + * double W[] - Weight function on the dense grid [gridsize] + * + * OUTPUT: + * ------- + * double ad[] - 'b' in Oppenheim & Schafer [r+1] + * double x[] - [r+1] + * double y[] - 'C' in Oppenheim & Schafer [r+1] + ***********************/ + +static void CalcParms(int r, const int Ext[], const double Grid[], + const double D[], const double W[], + double ad[], double x[], double y[]) +{ + int i, j, k, ld; + double sign, xi, delta, denom, numer; + + /* Find x[] */ + for (i = 0; i <= r; i++) + x[i] = cos(Pi2 * Grid[Ext[i]]); + + /* Calculate ad[] - Oppenheim & Schafer eq 7.132 */ + ld = (r - 1) / 15 + 1; /* Skips around to avoid round errors */ + for (i = 0; i <= r; i++) { + denom = 1.0; + xi = x[i]; + for (j = 0; j < ld; j++) { + for (k = j; k <= r; k += ld) + if (k != i) + denom *= 2.0 * (xi - x[k]); + } + if (fabs(denom) < 0.00001) + denom = 0.00001; + ad[i] = 1.0 / denom; + } + + /* Calculate delta - Oppenheim & Schafer eq 7.131 */ + numer = denom = 0; + sign = 1; + for (i = 0; i <= r; i++) { + numer += ad[i] * D[Ext[i]]; + denom += sign * ad[i] / W[Ext[i]]; + sign = -sign; + } + delta = numer / denom; + sign = 1; + + /* Calculate y[] - Oppenheim & Schafer eq 7.133b */ + for (i = 0; i <= r; i++) { + y[i] = D[Ext[i]] - sign * delta / W[Ext[i]]; + sign = -sign; + } +} + + +/********************* + * ComputeA + *========== + * Using values calculated in CalcParms, ComputeA calculates the + * actual filter response at a given frequency (freq). Uses + * eq 7.133a from Oppenheim & Schafer. + * + * + * INPUT: + * ------ + * double freq - Frequency (0 to 0.5) at which to calculate A + * int r - 1/2 the number of filter coefficients + * double ad[] - 'b' in Oppenheim & Schafer [r+1] + * double x[] - [r+1] + * double y[] - 'C' in Oppenheim & Schafer [r+1] + * + * OUTPUT: + * ------- + * Returns double value of A[freq] + *********************/ + +static double ComputeA(double freq, int r, const double ad[], + const double x[], const double y[]) +{ + int i; + double xc, c, denom, numer; + + denom = numer = 0; + xc = cos(Pi2 * freq); + for (i = 0; i <= r; i++) { + c = xc - x[i]; + if (fabs(c) < 1.0e-7) { + numer = y[i]; + denom = 1; + break; + } + c = ad[i] / c; + denom += c; + numer += c * y[i]; + } + return numer / denom; +} + + +/************************ + * CalcError + *=========== + * Calculates the Error function from the desired frequency response + * on the dense grid (D[]), the weight function on the dense grid (W[]), + * and the present response calculation (A[]) + * + * + * INPUT: + * ------ + * int r - 1/2 the number of filter coefficients + * double ad[] - [r+1] + * double x[] - [r+1] + * double y[] - [r+1] + * int gridsize - Number of elements in the dense frequency grid + * double Grid[] - Frequencies on the dense grid [gridsize] + * double D[] - Desired response on the dense grid [gridsize] + * double W[] - Weight function on the desnse grid [gridsize] + * + * OUTPUT: + * ------- + * double E[] - Error function on dense grid [gridsize] + ************************/ + +static void CalcError(int r, const double ad[], + const double x[], const double y[], + int gridsize, const double Grid[], + const double D[], const double W[], double E[]) +{ + int i; + double A; + + for (i = 0; i < gridsize; i++) { + A = ComputeA(Grid[i], r, ad, x, y); + E[i] = W[i] * (D[i] - A); + } +} + +/************************ + * Search + *======== + * Searches for the maxima/minima of the error curve. If more than + * r+1 extrema are found, it uses the following heuristic (thanks + * Chris Hanson): + * 1) Adjacent non-alternating extrema deleted first. + * 2) If there are more than one excess extrema, delete the + * one with the smallest error. This will create a non-alternation + * condition that is fixed by 1). + * 3) If there is exactly one excess extremum, delete the smaller + * of the first/last extremum + * + * + * INPUT: + * ------ + * int r - 1/2 the number of filter coefficients + * int Ext[] - Indexes to Grid[] of extremal frequencies [r+1] + * int gridsize - Number of elements in the dense frequency grid + * double E[] - Array of error values. [gridsize] + * OUTPUT: + * ------- + * int Ext[] - New indexes to extremal frequencies [r+1] + ************************/ + +static void Search(int r, int Ext[], int gridsize, const double E[]) +{ + int i, j, k, l, extra; /* Counters */ + int up, alt; + int *foundExt; /* Array of found extremals */ + + /* Allocate enough space for found extremals. */ + foundExt = (int *) Util_malloc((2 * r) * sizeof(int)); + k = 0; + + /* Check for extremum at 0. */ + if (((E[0] > 0.0) && (E[0] > E[1])) || + ((E[0] < 0.0) && (E[0] < E[1]))) + foundExt[k++] = 0; + + /* Check for extrema inside dense grid */ + for (i = 1; i < gridsize - 1; i++) { + if (((E[i] >= E[i - 1]) && (E[i] > E[i + 1]) && (E[i] > 0.0)) || + ((E[i] <= E[i - 1]) && (E[i] < E[i + 1]) && (E[i] < 0.0))) + foundExt[k++] = i; + } + + /* Check for extremum at 0.5 */ + j = gridsize - 1; + if (((E[j] > 0.0) && (E[j] > E[j - 1])) || + ((E[j] < 0.0) && (E[j] < E[j - 1]))) + foundExt[k++] = j; + + /* Remove extra extremals */ + extra = k - (r + 1); + + while (extra > 0) { + if (E[foundExt[0]] > 0.0) + up = 1; /* first one is a maxima */ + else + up = 0; /* first one is a minima */ + + l = 0; + alt = 1; + for (j = 1; j < k; j++) { + if (fabs(E[foundExt[j]]) < fabs(E[foundExt[l]])) + l = j; /* new smallest error. */ + if ((up) && (E[foundExt[j]] < 0.0)) + up = 0; /* switch to a minima */ + else if ((!up) && (E[foundExt[j]] > 0.0)) + up = 1; /* switch to a maxima */ + else { + alt = 0; + break; /* Ooops, found two non-alternating */ + } /* extrema. Delete smallest of them */ + } /* if the loop finishes, all extrema are alternating */ + + /* If there's only one extremal and all are alternating, + * delete the smallest of the first/last extremals. */ + if ((alt) && (extra == 1)) { + if (fabs(E[foundExt[k - 1]]) < fabs(E[foundExt[0]])) + l = foundExt[k - 1]; /* Delete last extremal */ + else + l = foundExt[0]; /* Delete first extremal */ + } + + /* Loop that does the deletion */ + for (j = l; j < k; j++) { + foundExt[j] = foundExt[j+1]; + } + k--; + extra--; + } + + /* Copy found extremals to Ext[] */ + for (i = 0; i <= r; i++) { + Ext[i] = foundExt[i]; + } + + free(foundExt); +} + + +/********************* + * FreqSample + *============ + * Simple frequency sampling algorithm to determine the impulse + * response h[] from A's found in ComputeA + * + * + * INPUT: + * ------ + * int N - Number of filter coefficients + * double A[] - Sample points of desired response [N/2] + * int symm - Symmetry of desired filter + * + * OUTPUT: + * ------- + * double h[] - Impulse Response of final filter [N] + *********************/ +static void FreqSample(int N, const double A[], double h[], int symm) +{ + int n, k; + double x, val, M; + + M = (N - 1.0) / 2.0; + if (symm == POSITIVE) { + if (N % 2) { + for (n = 0; n < N; n++) { + val = A[0]; + x = Pi2 * (n - M) / N; + for (k = 1; k <= M; k++) + val += 2.0 * A[k] * cos(x * k); + h[n] = val / N; + } + } + else { + for (n = 0; n < N; n++) { + val = A[0]; + x = Pi2 * (n - M)/N; + for (k = 1; k <= (N / 2 - 1); k++) + val += 2.0 * A[k] * cos(x * k); + h[n] = val / N; + } + } + } + else { + if (N % 2) { + for (n = 0; n < N; n++) { + val = 0; + x = Pi2 * (n - M) / N; + for (k = 1; k <= M; k++) + val += 2.0 * A[k] * sin(x * k); + h[n] = val / N; + } + } + else { + for (n = 0; n < N; n++) { + val = A[N / 2] * sin(Pi * (n - M)); + x = Pi2 * (n - M) / N; + for (k = 1; k <= (N / 2 - 1); k++) + val += 2.0 * A[k] * sin(x * k); + h[n] = val / N; + } + } + } +} + +/******************* + * isDone + *======== + * Checks to see if the error function is small enough to consider + * the result to have converged. + * + * INPUT: + * ------ + * int r - 1/2 the number of filter coeffiecients + * int Ext[] - Indexes to extremal frequencies [r+1] + * double E[] - Error function on the dense grid [gridsize] + * + * OUTPUT: + * ------- + * Returns 1 if the result converged + * Returns 0 if the result has not converged + ********************/ + +static int isDone(int r, const int Ext[], const double E[]) +{ + int i; + double min, max, current; + + min = max = fabs(E[Ext[0]]); + for (i = 1; i <= r; i++) { + current = fabs(E[Ext[i]]); + if (current < min) + min = current; + if (current > max) + max = current; + } + if (((max - min) / max) < 0.0001) + return 1; + return 0; +} + +/******************** + * REMEZ_CreateFilter + *======= + * Calculates the optimal (in the Chebyshev/minimax sense) + * FIR filter impulse response given a set of band edges, + * the desired reponse on those bands, and the weight given to + * the error in those bands. + * + * INPUT: + * ------ + * int numtaps - Number of filter coefficients + * int numband - Number of bands in filter specification + * double bands[] - User-specified band edges [2 * numband] + * double des[] - User-specified band responses [numband] + * double weight[] - User-specified error weights [numband] + * int type - Type of filter + * + * OUTPUT: + * ------- + * double h[] - Impulse response of final filter [numtaps] + ********************/ + +void REMEZ_CreateFilter(double h[], int numtaps, int numband, double bands[], + const double des[], const double weight[], int type) +{ + double *Grid, *W, *D, *E; + int i, iter, gridsize, r, *Ext; + double *taps, c; + double *x, *y, *ad; + int symmetry; + + if (type == REMEZ_BANDPASS) + symmetry = POSITIVE; + else + symmetry = NEGATIVE; + + r = numtaps / 2; /* number of extrema */ + if ((numtaps % 2) && (symmetry == POSITIVE)) + r++; + + /* Predict dense grid size in advance for memory allocation + * .5 is so we round up, not truncate */ + gridsize = 0; + for (i = 0; i < numband; i++) { + gridsize += (int) (2 * r * GRIDDENSITY * + (bands[2 * i + 1] - bands[2 * i]) + .5); + } + if (symmetry == NEGATIVE) { + gridsize--; + } + + /* Dynamically allocate memory for arrays with proper sizes */ + Grid = (double *) Util_malloc(gridsize * sizeof(double)); + D = (double *) Util_malloc(gridsize * sizeof(double)); + W = (double *) Util_malloc(gridsize * sizeof(double)); + E = (double *) Util_malloc(gridsize * sizeof(double)); + Ext = (int *) Util_malloc((r + 1) * sizeof(int)); + taps = (double *) Util_malloc((r + 1) * sizeof(double)); + x = (double *) Util_malloc((r + 1) * sizeof(double)); + y = (double *) Util_malloc((r + 1) * sizeof(double)); + ad = (double *) Util_malloc((r + 1) * sizeof(double)); + + /* Create dense frequency grid */ + CreateDenseGrid(r, numtaps, numband, bands, des, weight, + &gridsize, Grid, D, W, symmetry); + InitialGuess(r, Ext, gridsize); + + /* For Differentiator: (fix grid) */ + if (type == REMEZ_DIFFERENTIATOR) { + for (i = 0; i < gridsize; i++) { + /* D[i] = D[i] * Grid[i]; */ + if (D[i] > 0.0001) + W[i] = W[i] / Grid[i]; + } + } + + /* For odd or Negative symmetry filters, alter the + * D[] and W[] according to Parks McClellan */ + if (symmetry == POSITIVE) { + if (numtaps % 2 == 0) { + for (i = 0; i < gridsize; i++) { + c = cos(Pi * Grid[i]); + D[i] /= c; + W[i] *= c; + } + } + } + else { + if (numtaps % 2) { + for (i = 0; i < gridsize; i++) { + c = sin(Pi2 * Grid[i]); + D[i] /= c; + W[i] *= c; + } + } + else { + for (i = 0; i < gridsize; i++) { + c = sin(Pi * Grid[i]); + D[i] /= c; + W[i] *= c; + } + } + } + + /* Perform the Remez Exchange algorithm */ + for (iter = 0; iter < MAXITERATIONS; iter++) { + CalcParms(r, Ext, Grid, D, W, ad, x, y); + CalcError(r, ad, x, y, gridsize, Grid, D, W, E); + Search(r, Ext, gridsize, E); + if (isDone(r, Ext, E)) + break; + } +#ifndef ASAP + if (iter == MAXITERATIONS) { + Log_print("remez(): reached maximum iteration count. Results may be bad."); + } +#endif + + CalcParms(r, Ext, Grid, D, W, ad, x, y); + + /* Find the 'taps' of the filter for use with Frequency + * Sampling. If odd or Negative symmetry, fix the taps + * according to Parks McClellan */ + for (i = 0; i <= numtaps / 2; i++) { + if (symmetry == POSITIVE) { + if (numtaps % 2) + c = 1; + else + c = cos(Pi * (double) i / numtaps); + } + else { + if (numtaps % 2) + c = sin(Pi2 * (double) i / numtaps); + else + c = sin(Pi * (double) i / numtaps); + } + taps[i] = ComputeA((double) i / numtaps, r, ad, x, y) * c; + } + + /* Frequency sampling design with calculated taps */ + FreqSample(numtaps, taps, h, symmetry); + + /* Delete allocated memory */ + free(Grid); + free(W); + free(D); + free(E); + free(Ext); + free(taps); + free(x); + free(y); + free(ad); +} diff --git a/PVAtari800/atari800-src/remez.h b/PVAtari800/atari800-src/remez.h new file mode 100644 index 0000000000..ca35aa3fb1 --- /dev/null +++ b/PVAtari800/atari800-src/remez.h @@ -0,0 +1,34 @@ +/************************************************************************** + * Parks-McClellan algorithm for FIR filter design (C version) + *------------------------------------------------- + * Copyright (c) 1995,1998 Jake Janovetz (janovetz@uiuc.edu) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + *************************************************************************/ +#ifndef REMEZ_H_ +#define REMEZ_H_ + +#define REMEZ_BANDPASS 1 +#define REMEZ_DIFFERENTIATOR 2 +#define REMEZ_HILBERT 3 + +/* Function prototype for REMEZ_CreateFilter() - the only function that should need be + * called from external code */ +void REMEZ_CreateFilter(double h[], int numtaps, + int numband, double bands[], const double des[], const double weight[], + int type); + +#endif /* REMEZ_H_ */ diff --git a/PVAtari800/atari800-src/rtime.c b/PVAtari800/atari800-src/rtime.c new file mode 100644 index 0000000000..b276e8e50e --- /dev/null +++ b/PVAtari800/atari800-src/rtime.c @@ -0,0 +1,192 @@ +/* + * rtime.c - Emulate ICD R-Time 8 cartridge + * + * Copyright (C) 2000 Jason Duerstock + * Copyright (C) 2000-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "config.h" +#include /* for NULL */ +#include +#include /* for strcmp() */ +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif + +#include "atari.h" +#include "log.h" +#include "rtime.h" +#include "util.h" + +int RTIME_enabled = 1; + +static int rtime_state = 0; + /* 0 = waiting for register # */ + /* 1 = got register #, waiting for hi nybble */ + /* 2 = got hi nybble, waiting for lo nybble */ +static int rtime_tmp = 0; +static int rtime_tmp2 = 0; + +static UBYTE regset[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +int RTIME_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "RTIME") == 0) { + int value = Util_sscanbool(ptr); + if (value < 0) + return FALSE; + RTIME_enabled = value; + } + else return FALSE; + return TRUE; +} + +void RTIME_WriteConfig(FILE *fp) +{ + fprintf(fp, "RTIME=%d\n", RTIME_enabled); +} + +int RTIME_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + for (i = j = 1; i < *argc; i++) { + if (strcmp(argv[i], "-rtime") == 0) + RTIME_enabled = TRUE; + else if (strcmp(argv[i], "-nortime") == 0) + RTIME_enabled = FALSE; + else { + if (strcmp(argv[i], "-help") == 0) { + Log_print("\t-rtime Enable R-Time 8 emulation"); + Log_print("\t-nortime Disable R-Time 8 emulation"); + } + argv[j++] = argv[i]; + } + } + *argc = j; + + return TRUE; +} + +#if defined(HAVE_WINDOWS_H) || (defined(HAVE_TIME) && defined(HAVE_LOCALTIME)) + +static int hex2bcd(int h) +{ + return ((h / 10) << 4) | (h % 10); +} + +static int gettime(int p) +{ +#ifdef HAVE_WINDOWS_H + SYSTEMTIME st; + GetLocalTime(&st); + switch (p) { + case 0: + return hex2bcd(st.wSecond); + case 1: + return hex2bcd(st.wMinute); + case 2: + return hex2bcd(st.wHour); + case 3: + return hex2bcd(st.wDay); + case 4: + return hex2bcd(st.wMonth); + case 5: + return hex2bcd(st.wYear % 100); + case 6: + return hex2bcd(((st.wDayOfWeek + 2) % 7) + 1); + } +#else /* HAVE_WINDOWS_H */ + time_t tt; + struct tm *lt; + + tt = time(NULL); + lt = localtime(&tt); + + switch (p) { + case 0: + return hex2bcd(lt->tm_sec); + case 1: + return hex2bcd(lt->tm_min); + case 2: + return hex2bcd(lt->tm_hour); + case 3: + return hex2bcd(lt->tm_mday); + case 4: + return hex2bcd(lt->tm_mon + 1); + case 5: + return hex2bcd(lt->tm_year % 100); + case 6: + return hex2bcd(((lt->tm_wday + 2) % 7) + 1); + } +#endif /* HAVE_WINDOWS_H */ + return 0; +} + +#define HAVE_GETTIME + +#endif /* defined(HAVE_WINDOWS_H) || (defined(HAVE_TIME) && defined(HAVE_LOCALTIME)) */ + +UBYTE RTIME_GetByte(void) +{ + switch (rtime_state) { + case 0: + /* Log_print("pretending rtime not busy, returning 0"); */ + return 0; + case 1: + rtime_state = 2; + return ( +#ifdef HAVE_GETTIME + rtime_tmp <= 6 ? + gettime(rtime_tmp) : +#endif + regset[rtime_tmp]) >> 4; + case 2: + rtime_state = 0; + return ( +#ifdef HAVE_GETTIME + rtime_tmp <= 6 ? + gettime(rtime_tmp) : +#endif + regset[rtime_tmp]) & 0x0f; + } + return 0; +} + +void RTIME_PutByte(UBYTE byte) +{ + switch (rtime_state) { + case 0: + rtime_tmp = byte & 0x0f; + rtime_state = 1; + break; + case 1: + rtime_tmp2 = byte << 4; + rtime_state = 2; + break; + case 2: + regset[rtime_tmp] = rtime_tmp2 | (byte & 0x0f); + rtime_state = 0; + break; + } +} diff --git a/PVAtari800/atari800-src/rtime.h b/PVAtari800/atari800-src/rtime.h new file mode 100644 index 0000000000..d3d08667f7 --- /dev/null +++ b/PVAtari800/atari800-src/rtime.h @@ -0,0 +1,29 @@ +#ifndef RTIME_H_ +#define RTIME_H_ +/* Emulate ICD R-Time 8 cartridge + Copyright 2000 Jason Duerstock + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "atari.h" + +extern int RTIME_enabled; + +int RTIME_ReadConfig(char *string, char *ptr); +void RTIME_WriteConfig(FILE *fp); +int RTIME_Initialise(int *argc, char *argv[]); +UBYTE RTIME_GetByte(void); +void RTIME_PutByte(UBYTE byte); +#endif /* RTIME_H_ */ diff --git a/PVAtari800/atari800-src/screen.c b/PVAtari800/atari800-src/screen.c new file mode 100644 index 0000000000..c0f4fd385b --- /dev/null +++ b/PVAtari800/atari800-src/screen.c @@ -0,0 +1,684 @@ +/* + * screen.c - Atari screen handling + * + * Copyright (c) 2001 Robert Golias and Piotr Fusik + * Copyright (C) 2001-2008 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#define _POSIX_C_SOURCE 200112L /* for snprintf */ + +#include "config.h" +#include +#include +#include + +#ifdef HAVE_LIBPNG +#include +#endif + +#include "antic.h" +#include "atari.h" +#include "cassette.h" +#include "colours.h" +#include "log.h" +#include "pia.h" +#include "screen.h" +#include "sio.h" +#include "util.h" + +#define ATARI_VISIBLE_WIDTH 336 +#define ATARI_LEFT_MARGIN 24 + +ULONG *Screen_atari = NULL; +#ifdef DIRTYRECT +UBYTE *Screen_dirty = NULL; +#endif +#ifdef BITPL_SCR +ULONG *Screen_atari_b = NULL; +ULONG *Screen_atari1 = NULL; +ULONG *Screen_atari2 = NULL; +#endif + +/* The area that can been seen is Screen_visible_x1 <= x < Screen_visible_x2, + Screen_visible_y1 <= y < Screen_visible_y2. + Full Atari screen is 336x240. Screen_WIDTH is 384 only because + the code in antic.c sometimes draws more than 336 bytes in a line. + Currently Screen_visible variables are used only to place + disk led and snailmeter in the corners of the screen. +*/ +int Screen_visible_x1 = 24; /* 0 .. Screen_WIDTH */ +int Screen_visible_y1 = 0; /* 0 .. Screen_HEIGHT */ +int Screen_visible_x2 = 360; /* 0 .. Screen_WIDTH */ +int Screen_visible_y2 = Screen_HEIGHT; /* 0 .. Screen_HEIGHT */ + +int Screen_show_atari_speed = FALSE; +int Screen_show_disk_led = TRUE; +int Screen_show_sector_counter = FALSE; +int Screen_show_1200_leds = TRUE; + +#ifdef HAVE_LIBPNG +#define DEFAULT_SCREENSHOT_FILENAME_FORMAT "atari%03d.png" +#else +#define DEFAULT_SCREENSHOT_FILENAME_FORMAT "atari%03d.pcx" +#endif + +static char screenshot_filename_format[FILENAME_MAX] = DEFAULT_SCREENSHOT_FILENAME_FORMAT; +static int screenshot_no_max = 1000; + +/* converts "foo%bar##.pcx" to "foo%%bar%02d.pcx" */ +static void Screen_SetScreenshotFilenamePattern(const char *p) +{ + char *f = screenshot_filename_format; + char no_width = '0'; + screenshot_no_max = 1; + /* 9 because sprintf'ed "no" can be 9 digits */ + while (f < screenshot_filename_format + FILENAME_MAX - 9) { + /* replace a sequence of hashes with e.g. "%05d" */ + if (*p == '#') { + if (no_width > '0') /* already seen a sequence of hashes */ + break; /* invalid */ + /* count hashes */ + do { + screenshot_no_max *= 10; + p++; + no_width++; + /* now no_width is the number of hashes seen so far + and p points after the counted hashes */ + } while (no_width < '9' && *p == '#'); /* no more than 9 hashes */ + *f++ = '%'; + *f++ = '0'; + *f++ = no_width; + *f++ = 'd'; + continue; + } + if (*p == '%') + *f++ = '%'; /* double the percents */ + *f++ = *p; + if (*p == '\0') + return; /* ok */ + p++; + } + Log_print("Invalid filename pattern for screenshots, using default."); + strcpy(screenshot_filename_format, DEFAULT_SCREENSHOT_FILENAME_FORMAT); + screenshot_no_max = 1000; +} + +int Screen_Initialise(int *argc, char *argv[]) +{ + int i; + int j; + int help_only = FALSE; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + + if (strcmp(argv[i], "-screenshots") == 0) { + if (i_a) + Screen_SetScreenshotFilenamePattern(argv[++i]); + else a_m = TRUE; + } + else if (strcmp(argv[i], "-showspeed") == 0) { + Screen_show_atari_speed = TRUE; + } + else { + if (strcmp(argv[i], "-help") == 0) { + help_only = TRUE; + Log_print("\t-screenshots

Set filename pattern for screenshots"); + Log_print("\t-showspeed Show percentage of actual speed"); + } + argv[j++] = argv[i]; + } + + if (a_m) { + Log_print("Missing argument for '%s'", argv[i]); + return FALSE; + } + } + *argc = j; + + /* don't bother mallocing Screen_atari with just "-help" */ + if (help_only) + return TRUE; + + if (Screen_atari == NULL) { /* platform-specific code can initialize it in theory */ + Screen_atari = (ULONG *) Util_malloc(Screen_HEIGHT * Screen_WIDTH); + /* Clear the screen. */ + memset(Screen_atari, 0, Screen_HEIGHT * Screen_WIDTH); +#ifdef DIRTYRECT + Screen_dirty = (UBYTE *) Util_malloc(Screen_HEIGHT * Screen_WIDTH / 8); + Screen_EntireDirty(); +#endif +#ifdef BITPL_SCR + Screen_atari_b = (ULONG *) Util_malloc(Screen_HEIGHT * Screen_WIDTH); + memset(Screen_atari_b, 0, Screen_HEIGHT * Screen_WIDTH); + Screen_atari1 = Screen_atari; + Screen_atari2 = Screen_atari_b; +#endif + } + + return TRUE; +} + +int Screen_ReadConfig(char *string, char *ptr) +{ + if (strcmp(string, "SCREEN_SHOW_SPEED") == 0) + return (Screen_show_atari_speed = Util_sscanbool(ptr)) != -1; + else if (strcmp(string, "SCREEN_SHOW_IO_ACTIVITY") == 0) + return (Screen_show_disk_led = Util_sscanbool(ptr)) != -1; + else if (strcmp(string, "SCREEN_SHOW_IO_COUNTER") == 0) + return (Screen_show_sector_counter = Util_sscanbool(ptr)) != -1; + else if (strcmp(string, "SCREEN_SHOW_1200XL_LEDS") == 0) + return (Screen_show_1200_leds = Util_sscanbool(ptr)) != -1; + else return FALSE; + return TRUE; +} + +void Screen_WriteConfig(FILE *fp) +{ + fprintf(fp, "SCREEN_SHOW_SPEED=%d\n", Screen_show_atari_speed); + fprintf(fp, "SCREEN_SHOW_IO_ACTIVITY=%d\n", Screen_show_disk_led); + fprintf(fp, "SCREEN_SHOW_IO_COUNTER=%d\n", Screen_show_sector_counter); + fprintf(fp, "SCREEN_SHOW_1200XL_LEDS=%d\n", Screen_show_1200_leds); +} + +#define SMALLFONT_WIDTH 5 +#define SMALLFONT_HEIGHT 7 +#define SMALLFONT_PERCENT 10 +#define SMALLFONT_C 11 +#define SMALLFONT_D 12 +#define SMALLFONT_L 13 +#define SMALLFONT_SLASH 14 +#define SMALLFONT_____ 0x00 +#define SMALLFONT___X_ 0x02 +#define SMALLFONT__X__ 0x04 +#define SMALLFONT__XX_ 0x06 +#define SMALLFONT_X___ 0x08 +#define SMALLFONT_X_X_ 0x0A +#define SMALLFONT_XX__ 0x0C +#define SMALLFONT_XXX_ 0x0E + +static void SmallFont_DrawChar(UBYTE *screen, int ch, UBYTE color1, UBYTE color2) +{ + static const UBYTE font[15][SMALLFONT_HEIGHT] = { + { + SMALLFONT_____, + SMALLFONT__X__, + SMALLFONT_X_X_, + SMALLFONT_X_X_, + SMALLFONT_X_X_, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT__X__, + SMALLFONT_XX__, + SMALLFONT__X__, + SMALLFONT__X__, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_XX__, + SMALLFONT___X_, + SMALLFONT__X__, + SMALLFONT_X___, + SMALLFONT_XXX_, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_XX__, + SMALLFONT___X_, + SMALLFONT__X__, + SMALLFONT___X_, + SMALLFONT_XX__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT___X_, + SMALLFONT__XX_, + SMALLFONT_X_X_, + SMALLFONT_XXX_, + SMALLFONT___X_, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_XXX_, + SMALLFONT_X___, + SMALLFONT_XXX_, + SMALLFONT___X_, + SMALLFONT_XX__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT__X__, + SMALLFONT_X___, + SMALLFONT_XX__, + SMALLFONT_X_X_, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_XXX_, + SMALLFONT___X_, + SMALLFONT__X__, + SMALLFONT__X__, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT__X__, + SMALLFONT_X_X_, + SMALLFONT__X__, + SMALLFONT_X_X_, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT__X__, + SMALLFONT_X_X_, + SMALLFONT__XX_, + SMALLFONT___X_, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_X_X_, + SMALLFONT___X_, + SMALLFONT__X__, + SMALLFONT_X___, + SMALLFONT_X_X_, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT__X__, + SMALLFONT_X_X_, + SMALLFONT_X___, + SMALLFONT_X_X_, + SMALLFONT__X__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_XX__, + SMALLFONT_X_X_, + SMALLFONT_X_X_, + SMALLFONT_X_X_, + SMALLFONT_XX__, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT_X___, + SMALLFONT_X___, + SMALLFONT_X___, + SMALLFONT_X___, + SMALLFONT_XXX_, + SMALLFONT_____ + }, + { + SMALLFONT_____, + SMALLFONT___X_, + SMALLFONT___X_, + SMALLFONT__X__, + SMALLFONT__X__, + SMALLFONT_X___, + SMALLFONT_____ + } + }; + int y; + for (y = 0; y < SMALLFONT_HEIGHT; y++) { + int src; + int mask; + src = font[ch][y]; + for (mask = 1 << (SMALLFONT_WIDTH - 1); mask != 0; mask >>= 1) { + ANTIC_VideoPutByte(screen, (UBYTE) ((src & mask) != 0 ? color1 : color2)); + screen++; + } + screen += Screen_WIDTH - SMALLFONT_WIDTH; + } +} + +/* Returns screen address for placing the next character on the left of the + drawn number. */ +static UBYTE *SmallFont_DrawInt(UBYTE *screen, int n, UBYTE color1, UBYTE color2) +{ + do { + SmallFont_DrawChar(screen, n % 10, color1, color2); + screen -= SMALLFONT_WIDTH; + n /= 10; + } while (n > 0); + return screen; +} + +void Screen_DrawAtariSpeed(double cur_time) +{ + if (Screen_show_atari_speed) { + static int percent_display = 100; + static int last_updated = 0; + static double last_time = 0; + if ((cur_time - last_time) >= 0.5) { + percent_display = (int) (100 * (Atari800_nframes - last_updated) / (cur_time - last_time) / (Atari800_tv_mode == Atari800_TV_PAL ? 50 : 60)); + last_updated = Atari800_nframes; + last_time = cur_time; + } + /* if (percent_display < 99 || percent_display > 101) */ + { + /* space for 5 digits - up to 99999% Atari speed */ + UBYTE *screen = (UBYTE *) Screen_atari + Screen_visible_x1 + 5 * SMALLFONT_WIDTH + + (Screen_visible_y2 - SMALLFONT_HEIGHT) * Screen_WIDTH; + SmallFont_DrawChar(screen, SMALLFONT_PERCENT, 0x0c, 0x00); + SmallFont_DrawInt(screen - SMALLFONT_WIDTH, percent_display, 0x0c, 0x00); + } + } +} + +void Screen_DrawDiskLED(void) +{ + if (SIO_last_op_time > 0) { + UBYTE *screen; + if (SIO_last_drive != 0x60) + SIO_last_op_time--; + screen = (UBYTE *) Screen_atari + Screen_visible_x2 - SMALLFONT_WIDTH + + (Screen_visible_y2 - SMALLFONT_HEIGHT) * Screen_WIDTH; + if (SIO_last_drive == 0x60 || SIO_last_drive == 0x61) { + if (CASSETTE_status != CASSETTE_STATUS_NONE) { + if (Screen_show_disk_led) + SmallFont_DrawChar(screen, SMALLFONT_C, 0x00, (UBYTE) (CASSETTE_record ? 0x2b : 0xac)); + + if (Screen_show_sector_counter) { + /* Displaying tape length during saving is pointless since it would equal the number + of the currently-written block, which is already displayed. */ + if (!CASSETTE_record) { + screen = SmallFont_DrawInt(screen - SMALLFONT_WIDTH, CASSETTE_GetSize(), 0x00, 0x88); + SmallFont_DrawChar(screen, SMALLFONT_SLASH, 0x00, 0x88); + } + SmallFont_DrawInt(screen - SMALLFONT_WIDTH, CASSETTE_GetPosition(), 0x00, 0x88); + } + } + } + else { + if (Screen_show_disk_led) { + SmallFont_DrawChar(screen, SIO_last_drive, 0x00, (UBYTE) (SIO_last_op == SIO_LAST_READ ? 0xac : 0x2b)); + SmallFont_DrawChar(screen -= SMALLFONT_WIDTH, SMALLFONT_D, 0x00, (UBYTE) (SIO_last_op == SIO_LAST_READ ? 0xac : 0x2b)); + } + + if (Screen_show_sector_counter) + SmallFont_DrawInt(screen - SMALLFONT_WIDTH, SIO_last_sector, 0x00, 0x88); + } + } +} + +void Screen_Draw1200LED(void) +{ + if (Screen_show_1200_leds && Atari800_keyboard_leds) { + UBYTE *screen = (UBYTE *) Screen_atari + Screen_visible_x1 + SMALLFONT_WIDTH * 10 + + (Screen_visible_y2 - SMALLFONT_HEIGHT) * Screen_WIDTH; + UBYTE portb = PIA_PORTB | PIA_PORTB_mask; + if ((portb & 0x04) == 0) { + SmallFont_DrawChar(screen, SMALLFONT_L, 0x00, 0x36); + SmallFont_DrawChar(screen + SMALLFONT_WIDTH, 1, 0x00, 0x36); + } + screen += SMALLFONT_WIDTH * 3; + if ((portb & 0x08) == 0) { + SmallFont_DrawChar(screen, SMALLFONT_L, 0x00, 0x36); + SmallFont_DrawChar(screen + SMALLFONT_WIDTH, 2, 0x00, 0x36); + } + } +} + +void Screen_FindScreenshotFilename(char *buffer, unsigned bufsize) +{ + static int no = -1; + static int overwrite = FALSE; + + for (;;) { + if (++no >= screenshot_no_max) { + no = 0; + overwrite = TRUE; + } + snprintf(buffer, bufsize, screenshot_filename_format, no); + if (overwrite) + break; + if (!Util_fileexists(buffer)) + break; /* file does not exist - we can create it */ + } +} + +static void fputw(int x, FILE *fp) +{ + fputc(x & 0xff, fp); + fputc(x >> 8, fp); +} + +static void Screen_SavePCX(FILE *fp, UBYTE *ptr1, UBYTE *ptr2) +{ + int i; + int x; + int y; + UBYTE plane = 16; /* 16 = Red, 8 = Green, 0 = Blue */ + UBYTE last; + UBYTE count; + + fputc(0xa, fp); /* pcx signature */ + fputc(0x5, fp); /* version 5 */ + fputc(0x1, fp); /* RLE encoding */ + fputc(0x8, fp); /* bits per pixel */ + fputw(0, fp); /* XMin */ + fputw(0, fp); /* YMin */ + fputw(ATARI_VISIBLE_WIDTH - 1, fp); /* XMax */ + fputw(Screen_HEIGHT - 1, fp); /* YMax */ + fputw(0, fp); /* HRes */ + fputw(0, fp); /* VRes */ + for (i = 0; i < 48; i++) + fputc(0, fp); /* EGA color palette */ + fputc(0, fp); /* reserved */ + fputc(ptr2 != NULL ? 3 : 1, fp); /* number of bit planes */ + fputw(ATARI_VISIBLE_WIDTH, fp); /* number of bytes per scan line per color plane */ + fputw(1, fp); /* palette info */ + fputw(ATARI_VISIBLE_WIDTH, fp); /* screen resolution */ + fputw(Screen_HEIGHT, fp); + for (i = 0; i < 54; i++) + fputc(0, fp); /* unused */ + + for (y = 0; y < Screen_HEIGHT; ) { + x = 0; + do { + last = ptr2 != NULL ? (((Colours_table[*ptr1] >> plane) & 0xff) + ((Colours_table[*ptr2] >> plane) & 0xff)) >> 1 : *ptr1; + count = 0xc0; + do { + ptr1++; + if (ptr2 != NULL) + ptr2++; + count++; + x++; + } while (last == (ptr2 != NULL ? (((Colours_table[*ptr1] >> plane) & 0xff) + ((Colours_table[*ptr2] >> plane) & 0xff)) >> 1 : *ptr1) + && count < 0xff && x < ATARI_VISIBLE_WIDTH); + if (count > 0xc1 || last >= 0xc0) + fputc(count, fp); + fputc(last, fp); + } while (x < ATARI_VISIBLE_WIDTH); + + if (ptr2 != NULL && plane) { + ptr1 -= ATARI_VISIBLE_WIDTH; + ptr2 -= ATARI_VISIBLE_WIDTH; + plane -= 8; + } + else { + ptr1 += Screen_WIDTH - ATARI_VISIBLE_WIDTH; + if (ptr2 != NULL) { + ptr2 += Screen_WIDTH - ATARI_VISIBLE_WIDTH; + plane = 16; + } + y++; + } + } + + if (ptr2 == NULL) { + /* write palette */ + fputc(0xc, fp); + for (i = 0; i < 256; i++) { + fputc(Colours_GetR(i), fp); + fputc(Colours_GetG(i), fp); + fputc(Colours_GetB(i), fp); + } + } +} + +static int striendswith(const char *s1, const char *s2) +{ + int pos; + pos = strlen(s1) - strlen(s2); + if (pos < 0) + return 0; + return Util_stricmp(s1 + pos, s2) == 0; +} + +#ifdef HAVE_LIBPNG +static void Screen_SavePNG(FILE *fp, UBYTE *ptr1, UBYTE *ptr2) +{ + png_structp png_ptr; + png_infop info_ptr; + png_bytep rows[Screen_HEIGHT]; + + png_ptr = png_create_write_struct( + PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL + ); + if (png_ptr == NULL) + return; + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == NULL) + return; + png_init_io(png_ptr, fp); + png_set_IHDR( + png_ptr, info_ptr, ATARI_VISIBLE_WIDTH, Screen_HEIGHT, + 8, ptr2 == NULL ? PNG_COLOR_TYPE_PALETTE : PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT + ); + if (ptr2 == NULL) { + int i; + png_color palette[256]; + for (i = 0; i < 256; i++) { + palette[i].red = Colours_GetR(i); + palette[i].green = Colours_GetG(i); + palette[i].blue = Colours_GetB(i); + } + png_set_PLTE(png_ptr, info_ptr, palette, 256); + for (i = 0; i < Screen_HEIGHT; i++) { + rows[i] = ptr1; + ptr1 += Screen_WIDTH; + } + } + else { + png_bytep ptr3; + int x; + int y; + ptr3 = (png_bytep) Util_malloc(3 * ATARI_VISIBLE_WIDTH * Screen_HEIGHT); + for (y = 0; y < Screen_HEIGHT; y++) { + rows[y] = ptr3; + for (x = 0; x < ATARI_VISIBLE_WIDTH; x++) { + *ptr3++ = (png_byte) ((Colours_GetR(*ptr1) + Colours_GetR(*ptr2)) >> 1); + *ptr3++ = (png_byte) ((Colours_GetG(*ptr1) + Colours_GetG(*ptr2)) >> 1); + *ptr3++ = (png_byte) ((Colours_GetB(*ptr1) + Colours_GetB(*ptr2)) >> 1); + ptr1++; + ptr2++; + } + ptr1 += Screen_WIDTH - ATARI_VISIBLE_WIDTH; + ptr2 += Screen_WIDTH - ATARI_VISIBLE_WIDTH; + } + } + png_set_rows(png_ptr, info_ptr, rows); + png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); + png_destroy_write_struct(&png_ptr, &info_ptr); + if (ptr2 != NULL) + free(rows[0]); +} +#endif /* HAVE_LIBPNG */ + +int Screen_SaveScreenshot(const char *filename, int interlaced) +{ + int is_png; + FILE *fp; + ULONG *main_screen_atari; + UBYTE *ptr1; + UBYTE *ptr2; + if (striendswith(filename, ".pcx")) + is_png = 0; +#ifdef HAVE_LIBPNG + else if (striendswith(filename, ".png")) + is_png = 1; +#endif + else + return FALSE; + fp = fopen(filename, "wb"); + if (fp == NULL) + return FALSE; + main_screen_atari = Screen_atari; + ptr1 = (UBYTE *) Screen_atari + ATARI_LEFT_MARGIN; + if (interlaced) { + Screen_atari = (ULONG *) Util_malloc(Screen_WIDTH * Screen_HEIGHT); + ptr2 = (UBYTE *) Screen_atari + ATARI_LEFT_MARGIN; + ANTIC_Frame(TRUE); /* draw on Screen_atari */ + } + else { + ptr2 = NULL; + } +#ifdef HAVE_LIBPNG + if (is_png) + Screen_SavePNG(fp, ptr1, ptr2); + else +#endif + Screen_SavePCX(fp, ptr1, ptr2); + fclose(fp); + if (interlaced) { + free(Screen_atari); + Screen_atari = main_screen_atari; + } + return TRUE; +} + +void Screen_SaveNextScreenshot(int interlaced) +{ + char filename[FILENAME_MAX]; + Screen_FindScreenshotFilename(filename, sizeof(filename)); + Screen_SaveScreenshot(filename, interlaced); +} + +void Screen_EntireDirty(void) +{ +#ifdef DIRTYRECT + if (Screen_dirty) + memset(Screen_dirty, 1, Screen_WIDTH * Screen_HEIGHT / 8); +#endif /* DIRTYRECT */ +} diff --git a/PVAtari800/atari800-src/screen.h b/PVAtari800/atari800-src/screen.h new file mode 100644 index 0000000000..057c4bfe9b --- /dev/null +++ b/PVAtari800/atari800-src/screen.h @@ -0,0 +1,58 @@ +#ifndef SCREEN_H_ +#define SCREEN_H_ + +#include + +#include "atari.h" /* UBYTE */ + +#ifdef DIRTYRECT +#ifndef CLIENTUPDATE +extern UBYTE *Screen_dirty; +#endif /* CLIENTUPDATE */ +#endif /* DIRTYRECT */ + +extern ULONG *Screen_atari; + +/* Dimensions of Screen_atari. + Screen_atari is Screen_WIDTH * Screen_HEIGHT bytes. + Each byte is an Atari color code - use Colours_Get[RGB] functions + to get actual RGB codes. + You should never display anything outside the middle 336 columns. */ +#define Screen_WIDTH 384 +#define Screen_HEIGHT 240 + +#ifdef BITPL_SCR +extern ULONG *Screen_atari_b; +extern ULONG *Screen_atari1; +extern ULONG *Screen_atari2; +#endif + +/* The area that can been seen is Screen_visible_x1 <= x < Screen_visible_x2, + Screen_visible_y1 <= y < Screen_visible_y2. + Full Atari screen is 336x240. Screen_WIDTH is 384 only because + the code in antic.c sometimes draws more than 336 bytes in a line. + Currently Screen_visible variables are used only to place + disk led and snailmeter in the corners of the screen. +*/ +extern int Screen_visible_x1; +extern int Screen_visible_y1; +extern int Screen_visible_x2; +extern int Screen_visible_y2; + +extern int Screen_show_atari_speed; +extern int Screen_show_disk_led; +extern int Screen_show_sector_counter; +extern int Screen_show_1200_leds; + +int Screen_Initialise(int *argc, char *argv[]); +int Screen_ReadConfig(char *string, char *ptr); +void Screen_WriteConfig(FILE *fp); +void Screen_DrawAtariSpeed(double); +void Screen_DrawDiskLED(void); +void Screen_Draw1200LED(void); +void Screen_FindScreenshotFilename(char *buffer, unsigned bufsize); +int Screen_SaveScreenshot(const char *filename, int interlaced); +void Screen_SaveNextScreenshot(int interlaced); +void Screen_EntireDirty(void); + +#endif /* SCREEN_H_ */ diff --git a/PVAtari800/atari800-src/sio.c b/PVAtari800/atari800-src/sio.c new file mode 100644 index 0000000000..ae342e4fa4 --- /dev/null +++ b/PVAtari800/atari800-src/sio.c @@ -0,0 +1,1739 @@ +/* + * sio.c - Serial I/O emulation + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2010 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#define _POSIX_C_SOURCE 200112L /* for snprintf */ + +#include "config.h" +#include +#include +#include +#include + +#include "afile.h" +#include "antic.h" /* ANTIC_ypos */ +#include "atari.h" +#include "binload.h" +#include "cassette.h" +#include "compfile.h" +#include "cpu.h" +#include "esc.h" +#include "log.h" +#include "memory.h" +#include "platform.h" +#include "pokey.h" +#include "pokeysnd.h" +#include "sio.h" +#include "util.h" +#ifndef BASIC +#include "statesav.h" +#endif + +#undef DEBUG_PRO +#undef DEBUG_VAPI + +/* If ATR image is in double density (256 bytes per sector), + then the boot sectors (sectors 1-3) can be: + - logical (as seen by Atari) - 128 bytes in each sector + - physical (as stored on the disk) - 256 bytes in each sector. + Only the first half of sector is used for storing data, the rest is zero. + - SIO2PC (the type used by the SIO2PC program) - 3 * 128 bytes for data + of boot sectors, then 3 * 128 unused bytes (zero) + The XFD images in double density have either logical or physical + boot sectors. */ +#define BOOT_SECTORS_LOGICAL 0 +#define BOOT_SECTORS_PHYSICAL 1 +#define BOOT_SECTORS_SIO2PC 2 +static int boot_sectors_type[SIO_MAX_DRIVES]; + +static int image_type[SIO_MAX_DRIVES]; +#define IMAGE_TYPE_XFD 0 +#define IMAGE_TYPE_ATR 1 +#define IMAGE_TYPE_PRO 2 +#define IMAGE_TYPE_VAPI 3 +static FILE *disk[SIO_MAX_DRIVES] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; +static int sectorcount[SIO_MAX_DRIVES]; +static int sectorsize[SIO_MAX_DRIVES]; +/* these two are used by the 1450XLD parallel disk device */ +int SIO_format_sectorcount[SIO_MAX_DRIVES]; +int SIO_format_sectorsize[SIO_MAX_DRIVES]; +static int io_success[SIO_MAX_DRIVES]; +/* stores dup sector counter for PRO images */ +typedef struct tagpro_additional_info_t { + int max_sector; + unsigned char *count; +} pro_additional_info_t; + +#define MAX_VAPI_PHANTOM_SEC 40 +#define VAPI_BYTES_PER_TRACK 26042.0 +#define VAPI_CYCLES_PER_ROT 372706 +#define VAPI_CYCLES_PER_TRACK_STEP 35780 /*70937*/ +#define VAPI_CYCLES_HEAD_SETTLE 70134 +#define VAPI_CYCLES_TRACK_READ_DELTA 1426 +#define VAPI_CYCLES_CMD_ACK_TRANS 3188 +#define VAPI_CYCLES_SECTOR_READ 29014 +#define VAPI_CYCLES_MISSING_SECTOR (2*VAPI_CYCLES_PER_ROT + 14453) +#define VAPI_CYCLES_BAD_SECTOR_NUM 1521 + +/* stores dup sector information for VAPI images */ +typedef struct tagvapi_sec_info_t { + int sec_count; + unsigned int sec_offset[MAX_VAPI_PHANTOM_SEC]; + unsigned char sec_status[MAX_VAPI_PHANTOM_SEC]; + unsigned int sec_rot_pos[MAX_VAPI_PHANTOM_SEC]; +} vapi_sec_info_t; + +typedef struct tagvapi_additional_info_t { + vapi_sec_info_t *sectors; + int sec_stat_buff[4]; + int vapi_delay_time; +} vapi_additional_info_t; + +/* VAPI Format Header */ +typedef struct tagvapi_file_header_t { + unsigned char signature[4]; + unsigned char majorver; + unsigned char minorver; + unsigned char reserved1[22]; + unsigned char startdata[4]; + unsigned char reserved[16]; +} vapi_file_header_t; + +typedef struct tagvapi_track_header_t { + unsigned char next[4]; + unsigned char type[2]; + unsigned char reserved1[2]; + unsigned char tracknum; + unsigned char reserved2; + unsigned char sectorcnt[2]; + unsigned char reserved3[8]; + unsigned char startdata[4]; + unsigned char reserved4[8]; +} vapi_track_header_t; + +typedef struct tagvapi_sector_list_header_t { + unsigned char sizelist[4]; + unsigned char type; + unsigned char reserved[3]; +} vapi_sector_list_header_t; + +typedef struct tagvapi_sector_header_t { + unsigned char sectornum; + unsigned char sectorstatus; + unsigned char sectorpos[2]; + unsigned char startdata[4]; +} vapi_sector_header_t; + +#define VAPI_32(x) (x[0] + (x[1] << 8) + (x[2] << 16) + (x[3] << 24)) +#define VAPI_16(x) (x[0] + (x[1] << 8)) + +/* Additional Info for all copy protected disk types */ +static void *additional_info[SIO_MAX_DRIVES]; + +SIO_UnitStatus SIO_drive_status[SIO_MAX_DRIVES]; +char SIO_filename[SIO_MAX_DRIVES][FILENAME_MAX]; + +Util_tmpbufdef(static, sio_tmpbuf[SIO_MAX_DRIVES]) + +int SIO_last_op; +int SIO_last_op_time = 0; +int SIO_last_drive; +int SIO_last_sector; +char SIO_status[256]; + +/* Serial I/O emulation support */ +#define SIO_NoFrame (0x00) +#define SIO_CommandFrame (0x01) +#define SIO_StatusRead (0x02) +#define SIO_ReadFrame (0x03) +#define SIO_WriteFrame (0x04) +#define SIO_FinalStatus (0x05) +#define SIO_FormatFrame (0x06) +#define SIO_CasReadWrite (0x60) +static UBYTE CommandFrame[6]; +static int CommandIndex = 0; +static UBYTE DataBuffer[256 + 3]; +static int DataIndex = 0; +static int TransferStatus = SIO_NoFrame; +static int ExpectedBytes = 0; + +int ignore_header_writeprotect = FALSE; + +int SIO_Initialise(int *argc, char *argv[]) +{ + int i; + for (i = 0; i < SIO_MAX_DRIVES; i++) { + strcpy(SIO_filename[i], "Off"); + SIO_drive_status[i] = SIO_OFF; + SIO_format_sectorsize[i] = 128; + SIO_format_sectorcount[i] = 720; + } + TransferStatus = SIO_NoFrame; + + return TRUE; +} + +/* umount disks so temporary files are deleted */ +void SIO_Exit(void) +{ + int i; + for (i = 1; i <= SIO_MAX_DRIVES; i++) + SIO_Dismount(i); +} + +int SIO_Mount(int diskno, const char *filename, int b_open_readonly) +{ + FILE *f = NULL; + SIO_UnitStatus status = SIO_READ_WRITE; + struct AFILE_ATR_Header header; + + /* avoid overruns in SIO_filename[] */ + if (strlen(filename) >= FILENAME_MAX) + return FALSE; + + /* release previous disk */ + SIO_Dismount(diskno); + + /* open file */ + if (!b_open_readonly) + f = Util_fopen(filename, "rb+", sio_tmpbuf[diskno - 1]); + if (f == NULL) { + f = Util_fopen(filename, "rb", sio_tmpbuf[diskno - 1]); + if (f == NULL) + return FALSE; + status = SIO_READ_ONLY; + } + + /* read header */ + if (fread(&header, 1, sizeof(struct AFILE_ATR_Header), f) != sizeof(struct AFILE_ATR_Header)) { + fclose(f); + return FALSE; + } + + /* detect compressed image and uncompress */ + switch (header.magic1) { + case 0xf9: + case 0xfa: + /* DCM */ + { + FILE *f2 = Util_tmpopen(sio_tmpbuf[diskno - 1]); + if (f2 == NULL) + return FALSE; + Util_rewind(f); + if (!CompFile_DCMtoATR(f, f2)) { + Util_fclose(f2, sio_tmpbuf[diskno - 1]); + fclose(f); + return FALSE; + } + fclose(f); + f = f2; + } + Util_rewind(f); + if (fread(&header, 1, sizeof(struct AFILE_ATR_Header), f) != sizeof(struct AFILE_ATR_Header)) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + return FALSE; + } + status = SIO_READ_ONLY; + /* XXX: status = b_open_readonly ? SIO_READ_ONLY : SIO_READ_WRITE; */ + break; + case 0x1f: + if (header.magic2 == 0x8b) { + /* ATZ/ATR.GZ, XFZ/XFD.GZ */ + fclose(f); + f = Util_tmpopen(sio_tmpbuf[diskno - 1]); + if (f == NULL) + return FALSE; + if (!CompFile_ExtractGZ(filename, f)) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + return FALSE; + } + Util_rewind(f); + if (fread(&header, 1, sizeof(struct AFILE_ATR_Header), f) != sizeof(struct AFILE_ATR_Header)) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + return FALSE; + } + status = SIO_READ_ONLY; + /* XXX: status = b_open_readonly ? SIO_READ_ONLY : SIO_READ_WRITE; */ + } + break; + default: + break; + } + + boot_sectors_type[diskno - 1] = BOOT_SECTORS_LOGICAL; + + if (header.magic1 == AFILE_ATR_MAGIC1 && header.magic2 == AFILE_ATR_MAGIC2) { + /* ATR (may be temporary from DCM or ATR/ATR.GZ) */ + image_type[diskno - 1] = IMAGE_TYPE_ATR; + + sectorsize[diskno - 1] = (header.secsizehi << 8) + header.secsizelo; + if (sectorsize[diskno - 1] != 128 && sectorsize[diskno - 1] != 256) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + return FALSE; + } + + if (header.writeprotect != 0 && !ignore_header_writeprotect) + status = SIO_READ_ONLY; + + /* ATR header contains length in 16-byte chunks. */ + /* First compute number of 128-byte chunks + - it's number of sectors on single density disk */ + sectorcount[diskno - 1] = ((header.hiseccounthi << 24) + + (header.hiseccountlo << 16) + + (header.seccounthi << 8) + + header.seccountlo) >> 3; + + /* Fix number of sectors if double density */ + if (sectorsize[diskno - 1] == 256) { + if ((sectorcount[diskno - 1] & 1) != 0) + /* logical (128-byte) boot sectors */ + sectorcount[diskno - 1] += 3; + else { + /* 256-byte boot sectors */ + /* check if physical or SIO2PC: physical if there's + a non-zero byte in bytes 0x190-0x30f of the ATR file */ + UBYTE buffer[0x180]; + int i; + fseek(f, 0x190, SEEK_SET); + if (fread(buffer, 1, 0x180, f) != 0x180) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + return FALSE; + } + boot_sectors_type[diskno - 1] = BOOT_SECTORS_SIO2PC; + for (i = 0; i < 0x180; i++) + if (buffer[i] != 0) { + boot_sectors_type[diskno - 1] = BOOT_SECTORS_PHYSICAL; + break; + } + } + sectorcount[diskno - 1] >>= 1; + } + } + else if (header.magic1 == 'A' && header.magic2 == 'T' && header.seccountlo == '8' && + header.seccounthi == 'X') { + int file_length = Util_flen(f); + vapi_additional_info_t *info; + vapi_file_header_t fileheader; + vapi_track_header_t trackheader; + int trackoffset, totalsectors; + + /* .atx is read only for now */ +#ifndef VAPI_WRITE_ENABLE + if (!b_open_readonly) { + fclose(f); + f = Util_fopen(filename, "rb", sio_tmpbuf[diskno - 1]); + if (f == NULL) + return FALSE; + status = SIO_READ_ONLY; + } +#endif + + image_type[diskno - 1] = IMAGE_TYPE_VAPI; + sectorsize[diskno - 1] = 128; + sectorcount[diskno - 1] = 720; + fseek(f,0,SEEK_SET); + if (fread(&fileheader,1,sizeof(fileheader),f) != sizeof(fileheader)) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad File Header"); + return(FALSE); + } + trackoffset = VAPI_32(fileheader.startdata); + if (trackoffset > file_length) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Track Offset"); + return(FALSE); + } +#ifdef DEBUG_VAPI + Log_print("VAPI File Version %d.%d",fileheader.majorver,fileheader.minorver); +#endif + /* Read all of the track headers to get the total sector count */ + totalsectors = 0; + while (trackoffset > 0 && trackoffset < file_length) { + ULONG next; + UWORD tracktype; + + fseek(f,trackoffset,SEEK_SET); + if (fread(&trackheader,1,sizeof(trackheader),f) != sizeof(trackheader)) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Track Header"); + return(FALSE); + } + next = VAPI_32(trackheader.next); + tracktype = VAPI_16(trackheader.type); + if (tracktype == 0) { + totalsectors += VAPI_16(trackheader.sectorcnt); + } + trackoffset += next; + } + + info = Util_malloc(sizeof(vapi_additional_info_t)); + additional_info[diskno-1] = info; + info->sectors = Util_malloc(sectorcount[diskno - 1] * + sizeof(vapi_sec_info_t)); + memset(info->sectors, 0, sectorcount[diskno - 1] * + sizeof(vapi_sec_info_t)); + + /* Now read all the sector data */ + trackoffset = VAPI_32(fileheader.startdata); + while (trackoffset > 0 && trackoffset < file_length) { + int sectorcnt, seclistdata,next; + vapi_sector_list_header_t sectorlist; + vapi_sector_header_t sectorheader; + vapi_sec_info_t *sector; + UWORD tracktype; + int j; + + fseek(f,trackoffset,SEEK_SET); + if (fread(&trackheader,1,sizeof(trackheader),f) != sizeof(trackheader)) { + free(info->sectors); + free(info); + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Track Header while reading sectors"); + return(FALSE); + } + next = VAPI_32(trackheader.next); + sectorcnt = VAPI_16(trackheader.sectorcnt); + tracktype = VAPI_16(trackheader.type); + seclistdata = VAPI_32(trackheader.startdata) + trackoffset; +#ifdef DEBUG_VAPI + Log_print("Track %d: next %x type %d seccnt %d secdata %x",trackheader.tracknum, + trackoffset + next,VAPI_16(trackheader.type),sectorcnt,seclistdata); +#endif + if (tracktype == 0) { + if (seclistdata > file_length) { + free(info->sectors); + free(info); + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Sector List Offset"); + return(FALSE); + } + fseek(f,seclistdata,SEEK_SET); + if (fread(§orlist,1,sizeof(sectorlist),f) != sizeof(sectorlist)) { + free(info->sectors); + free(info); + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Sector List"); + return(FALSE); + } +#ifdef DEBUG_VAPI + Log_print("Size sec list %x type %d",VAPI_32(sectorlist.sizelist),sectorlist.type); +#endif + for (j=0;jsectors); + free(info); + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Sector Header"); + return(FALSE); + } + if (sectorheader.sectornum > 18) { + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Bad Sector Index: Track %d Sec Num %d Index %d", + trackheader.tracknum,j,sectorheader.sectornum); + return(FALSE); + } + sector = &info->sectors[trackheader.tracknum * 18 + sectorheader.sectornum - 1]; + + percent_rot = ((double) VAPI_16(sectorheader.sectorpos))/VAPI_BYTES_PER_TRACK; + sector->sec_rot_pos[sector->sec_count] = (unsigned int) (percent_rot * VAPI_CYCLES_PER_ROT); + sector->sec_offset[sector->sec_count] = VAPI_32(sectorheader.startdata) + trackoffset; + sector->sec_status[sector->sec_count] = ~sectorheader.sectorstatus; + sector->sec_count++; + if (sector->sec_count > MAX_VAPI_PHANTOM_SEC) { + free(info->sectors); + free(info); + Util_fclose(f, sio_tmpbuf[diskno - 1]); + Log_print("VAPI: Too many Phantom Sectors"); + return(FALSE); + } +#ifdef DEBUG_VAPI + Log_print("Sector %d status %x position %f %d %d data %x",sectorheader.sectornum, + sector->sec_status[sector->sec_count-1],percent_rot, + sector->sec_rot_pos[sector->sec_count-1], + VAPI_16(sectorheader.sectorpos), + sector->sec_offset[sector->sec_count-1]); +#endif + } +#ifdef DEBUG_VAPI + Log_flushlog(); +#endif + } else { + Log_print("Unknown VAPI track type Track:%d Type:%d",trackheader.tracknum,tracktype); + } + trackoffset += next; + } + } + else { + int file_length = Util_flen(f); + /* check for PRO */ + if ((file_length-16)%(128+12) == 0 && + (header.magic1*256 + header.magic2 == (file_length-16)/(128+12)) && + header.seccountlo == 'P') { + pro_additional_info_t *info; + /* .pro is read only for now */ + if (!b_open_readonly) { + fclose(f); + f = Util_fopen(filename, "rb", sio_tmpbuf[diskno - 1]); + if (f == NULL) + return FALSE; + status = SIO_READ_ONLY; + } + image_type[diskno - 1] = IMAGE_TYPE_PRO; + sectorsize[diskno - 1] = 128; + if (file_length >= 1040*(128+12)+16) { + /* assume enhanced density */ + sectorcount[diskno - 1] = 1040; + } + else { + /* assume single density */ + sectorcount[diskno - 1] = 720; + } + + info = Util_malloc(sizeof(pro_additional_info_t)); + additional_info[diskno-1] = info; + info->count = Util_malloc(sectorcount[diskno - 1]); + memset(info->count, 0, sectorcount[diskno -1]); + info->max_sector = (file_length-16)/(128+12); + } + else { + /* XFD (may be temporary from XFZ/XFD.GZ) */ + + image_type[diskno - 1] = IMAGE_TYPE_XFD; + + if (file_length <= (1040 * 128)) { + /* single density */ + sectorsize[diskno - 1] = 128; + sectorcount[diskno - 1] = file_length >> 7; + } + else { + /* double density */ + sectorsize[diskno - 1] = 256; + if ((file_length & 0xff) == 0) { + boot_sectors_type[diskno - 1] = BOOT_SECTORS_PHYSICAL; + sectorcount[diskno - 1] = file_length >> 8; + } + else + sectorcount[diskno - 1] = (file_length + 0x180) >> 8; + } + } + } + +#ifdef DEBUG + Log_print("sectorcount = %d, sectorsize = %d", + sectorcount[diskno - 1], sectorsize[diskno - 1]); +#endif + SIO_format_sectorsize[diskno - 1] = sectorsize[diskno - 1]; + SIO_format_sectorcount[diskno - 1] = sectorcount[diskno - 1]; + strcpy(SIO_filename[diskno - 1], filename); + SIO_drive_status[diskno - 1] = status; + disk[diskno - 1] = f; + return TRUE; +} + +void SIO_Dismount(int diskno) +{ + if (disk[diskno - 1] != NULL) { + Util_fclose(disk[diskno - 1], sio_tmpbuf[diskno - 1]); + disk[diskno - 1] = NULL; + SIO_drive_status[diskno - 1] = SIO_NO_DISK; + strcpy(SIO_filename[diskno - 1], "Empty"); + if (image_type[diskno - 1] == IMAGE_TYPE_PRO) { + free(((pro_additional_info_t *)additional_info[diskno-1])->count); + } + else if (image_type[diskno - 1] == IMAGE_TYPE_VAPI) { + free(((vapi_additional_info_t *)additional_info[diskno-1])->sectors); + } + free(additional_info[diskno - 1]); + additional_info[diskno - 1] = 0; + } +} + +void SIO_DisableDrive(int diskno) +{ + SIO_Dismount(diskno); + SIO_drive_status[diskno - 1] = SIO_OFF; + strcpy(SIO_filename[diskno - 1], "Off"); +} + +void SIO_SizeOfSector(UBYTE unit, int sector, int *sz, ULONG *ofs) +{ + int size; + ULONG offset; + int header_size = (image_type[unit] == IMAGE_TYPE_ATR ? 16 : 0); + + if (BINLOAD_start_binloading) { + if (sz) + *sz = 128; + if (ofs) + *ofs = 0; + return; + } + + if (image_type[unit] == IMAGE_TYPE_PRO) { + size = 128; + offset = 16 + (128+12)*(sector -1); /* returns offset of header */ + } + else if (image_type[unit] == IMAGE_TYPE_VAPI) { + vapi_additional_info_t *info; + vapi_sec_info_t *secinfo; + + size = 128; + info = additional_info[unit]; + if (info == NULL) + offset = 0; + else if (sector > sectorcount[unit]) + offset = 0; + else { + secinfo = &info->sectors[sector-1]; + if (secinfo->sec_count == 0 ) + offset = 0; + else + offset = secinfo->sec_offset[0]; + } + } + else if (sector < 4) { + /* special case for first three sectors in ATR and XFD image */ + size = 128; + offset = header_size + (sector - 1) * (boot_sectors_type[unit] == BOOT_SECTORS_PHYSICAL ? 256 : 128); + } + else { + size = sectorsize[unit]; + offset = header_size + (boot_sectors_type[unit] == BOOT_SECTORS_LOGICAL ? 0x180 : 0x300) + (sector - 4) * size; + } + + if (sz) + *sz = size; + + if (ofs) + *ofs = offset; +} + +static int SeekSector(int unit, int sector) +{ + ULONG offset; + int size; + + SIO_last_sector = sector; + snprintf(SIO_status, sizeof(SIO_status), "%d: %d", unit + 1, sector); + SIO_SizeOfSector((UBYTE) unit, sector, &size, &offset); + fseek(disk[unit], offset, SEEK_SET); + + return size; +} + +/* Unit counts from zero up */ +int SIO_ReadSector(int unit, int sector, UBYTE *buffer) +{ + int size; + if (BINLOAD_start_binloading) + return BINLOAD_LoaderStart(buffer); + + io_success[unit] = -1; + if (SIO_drive_status[unit] == SIO_OFF) + return 0; + if (disk[unit] == NULL) + return 'N'; + if (sector <= 0 || sector > sectorcount[unit]) + return 'E'; + SIO_last_op = SIO_LAST_READ; + SIO_last_op_time = 1; + SIO_last_drive = unit + 1; + /* FIXME: what sector size did the user expect? */ + size = SeekSector(unit, sector); + if (image_type[unit] == IMAGE_TYPE_PRO) { + pro_additional_info_t *info; + unsigned char *count; + info = (pro_additional_info_t *)additional_info[unit]; + count = info->count; + if (fread(buffer, 1, 12, disk[unit]) < 12) { + Log_print("Error in header of .pro image: sector:%d", sector); + return 'E'; + } + /* handle duplicate sectors */ + if (buffer[5] != 0) { + int dupnum = count[sector]; +#ifdef DEBUG_PRO + Log_print("duplicate sector:%d dupnum:%d",sector, dupnum); +#endif + count[sector] = (count[sector]+1) % (buffer[5]+1); + if (dupnum != 0) { + sector = sectorcount[unit] + buffer[6+dupnum]; + /* can dupnum be 5? */ + if (dupnum > 4 || sector <= 0 || sector > info->max_sector) { + Log_print("Error in .pro image: sector:%d dupnum:%d", sector, dupnum); + return 'E'; + } + size = SeekSector(unit, sector); + /* read sector header */ + if (fread(buffer, 1, 12, disk[unit]) < 12) { + Log_print("Error in header2 of .pro image: sector:%d dupnum:%d", sector, dupnum); + return 'E'; + } + } + } + /* bad sector */ + if (buffer[1] != 0xff) { + if (fread(buffer, 1, size, disk[unit]) < size) { + Log_print("Error in bad sector of .pro image: sector:%d", sector); + } + io_success[unit] = sector; +#ifdef DEBUG_PRO + Log_print("bad sector:%d", sector); +#endif + return 'E'; + } + } + else if (image_type[unit] == IMAGE_TYPE_VAPI) { + vapi_additional_info_t *info; + vapi_sec_info_t *secinfo; + ULONG secindex = 0; + static int lasttrack = 0; + unsigned int currpos, time, delay, rotations, bestdelay; +/* unsigned char beststatus;*/ + int fromtrack, trackstostep, j; + + info = (vapi_additional_info_t *)additional_info[unit]; + info->vapi_delay_time = 0; + + if (sector > sectorcount[unit]) { +#ifdef DEBUG_VAPI + Log_print("bad sector num:%d", sector); +#endif + info->sec_stat_buff[0] = 9; + info->sec_stat_buff[1] = 0xFF; + info->sec_stat_buff[2] = 0xe0; + info->sec_stat_buff[3] = 0; + info->vapi_delay_time= VAPI_CYCLES_BAD_SECTOR_NUM; + return 'E'; + } + + secinfo = &info->sectors[sector-1]; + fromtrack = lasttrack; + lasttrack = (sector-1)/18; + + if (secinfo->sec_count == 0) { +#ifdef DEBUG_VAPI + Log_print("missing sector:%d", sector); +#endif + info->sec_stat_buff[0] = 0xC; + info->sec_stat_buff[1] = 0xEF; + info->sec_stat_buff[2] = 0xe0; + info->sec_stat_buff[3] = 0; + info->vapi_delay_time= VAPI_CYCLES_MISSING_SECTOR; + return 'E'; + } + + trackstostep = abs((sector-1)/18 - fromtrack); + time = (unsigned int) ANTIC_CPU_CLOCK; + if (trackstostep) + time += trackstostep * VAPI_CYCLES_PER_TRACK_STEP + VAPI_CYCLES_HEAD_SETTLE ; + time += VAPI_CYCLES_CMD_ACK_TRANS; + rotations = time/VAPI_CYCLES_PER_ROT; + currpos = time - rotations*VAPI_CYCLES_PER_ROT; + +#ifdef DEBUG_VAPI + Log_print(" sector:%d sector count :%d time %d", sector,secinfo->sec_count,ANTIC_CPU_CLOCK); +#endif + + bestdelay = 10 * VAPI_CYCLES_PER_ROT; +/* beststatus = 0;*/ + for (j=0;jsec_count;j++) { + if (secinfo->sec_rot_pos[j] < currpos) + delay = (VAPI_CYCLES_PER_ROT - currpos) + secinfo->sec_rot_pos[j]; + else + delay = secinfo->sec_rot_pos[j] - currpos; +#ifdef DEBUG_VAPI + Log_print("%d %d %d %d %d %x",j,secinfo->sec_rot_pos[j], + ((unsigned int) ANTIC_CPU_CLOCK) - ((((unsigned int) ANTIC_CPU_CLOCK)/VAPI_CYCLES_PER_ROT)*VAPI_CYCLES_PER_ROT), + currpos,delay,secinfo->sec_status[j]); +#endif + if (delay < bestdelay) { + bestdelay = delay; +/* beststatus = secinfo->sec_status[j];*/ + secindex = j; + } + } + if (trackstostep) + info->vapi_delay_time = bestdelay + trackstostep * VAPI_CYCLES_PER_TRACK_STEP + + VAPI_CYCLES_HEAD_SETTLE + VAPI_CYCLES_TRACK_READ_DELTA + + VAPI_CYCLES_CMD_ACK_TRANS + VAPI_CYCLES_SECTOR_READ; + else + info->vapi_delay_time = bestdelay + + VAPI_CYCLES_CMD_ACK_TRANS + VAPI_CYCLES_SECTOR_READ; +#ifdef DEBUG_VAPI + Log_print("Bestdelay = %d VapiDelay = %d",bestdelay,info->vapi_delay_time); + if (secinfo->sec_count > 1) + Log_print("duplicate sector:%d dupnum:%d delay:%d",sector, secindex,info->vapi_delay_time); +#endif + fseek(disk[unit],secinfo->sec_offset[secindex],SEEK_SET); + info->sec_stat_buff[0] = 0x8 | ((secinfo->sec_status[secindex] == 0xFF) ? 0 : 0x04); + info->sec_stat_buff[1] = secinfo->sec_status[secindex]; + info->sec_stat_buff[2] = 0xe0; + info->sec_stat_buff[3] = 0; + if (secinfo->sec_status[secindex] != 0xFF) { + if (fread(buffer, 1, size, disk[unit]) < size) { + Log_print("error reading sector:%d", sector); + } + io_success[unit] = sector; + info->vapi_delay_time += VAPI_CYCLES_PER_ROT + 10000; +#ifdef DEBUG_VAPI + Log_print("bad sector:%d 0x%0X delay:%d", sector, secinfo->sec_status[secindex],info->vapi_delay_time ); +#endif + { + int i; + if (secinfo->sec_status[secindex] == 0xB7) { + for (i=0;i<128;i++) { + Log_print("0x%02x",buffer[i]); + if (buffer[i] == 0x33) + buffer[i] = rand() & 0xFF; + } + } + } + return 'E'; + } +#ifdef DEBUG_VAPI + Log_flushlog(); +#endif + } + if (fread(buffer, 1, size, disk[unit]) < size) { + Log_print("incomplete sector num:%d", sector); + } + io_success[unit] = 0; + return 'C'; +} + +int SIO_WriteSector(int unit, int sector, const UBYTE *buffer) +{ + int size; + io_success[unit] = -1; + if (SIO_drive_status[unit] == SIO_OFF) + return 0; + if (disk[unit] == NULL) + return 'N'; + if (SIO_drive_status[unit] != SIO_READ_WRITE || sector <= 0 || sector > sectorcount[unit]) + return 'E'; + SIO_last_op = SIO_LAST_WRITE; + SIO_last_op_time = 1; + SIO_last_drive = unit + 1; +#ifdef VAPI_WRITE_ENABLE + if (image_type[unit] == IMAGE_TYPE_VAPI) { + vapi_additional_info_t *info; + vapi_sec_info_t *secinfo; + + info = (vapi_additional_info_t *)additional_info[unit]; + secinfo = &info->sectors[sector-1]; + + if (secinfo->sec_count != 1) { + /* No writes to sectors with duplicates or missing sectors */ + return 'E'; + } + + if (secinfo->sec_status[0] != 0xFF) { + /* No writes to bad sectors */ + return 'E'; + } + + size = SeekSector(unit, sector); + fseek(disk[unit],secinfo->sec_offset[0],SEEK_SET); + fwrite(buffer, 1, size, disk[unit]); + io_success[unit] = 0; + return 'C'; +#if 0 + } else if (image_type[unit] == IMAGE_TYPE_PRO) { + pro_additional_info_t *info; + pro_phantom_sec_info_t *phantom; + + info = (pro_additional_info_t *)additional_info[unit]; + phantom = &info->phantom[sector-1]; + + if (phantom->phantom_count != 0) { + /* No writes to sectors with duplicates */ + return 'E'; + } + + size = SeekSector(unit, sector); + if (buffer[1] != 0xff) { +#endif + } +#endif + size = SeekSector(unit, sector); + fwrite(buffer, 1, size, disk[unit]); + io_success[unit] = 0; + return 'C'; +} + +int SIO_FormatDisk(int unit, UBYTE *buffer, int sectsize, int sectcount) +{ + char fname[FILENAME_MAX]; + int is_atr; + int save_boot_sectors_type; + int bootsectsize; + int bootsectcount; + FILE *f; + int i; + io_success[unit] = -1; + if (SIO_drive_status[unit] == SIO_OFF) + return 0; + if (disk[unit] == NULL) + return 'N'; + if (SIO_drive_status[unit] != SIO_READ_WRITE) + return 'E'; + /* Note formatting the disk can change size of the file. + There is no portable way to truncate the file at given position. + We have to close the "rb+" open file and open it in "wb" mode. + First get the information about the disk image, because we are going + to umount it. */ + memcpy(fname, SIO_filename[unit], FILENAME_MAX); + is_atr = (image_type[unit] == IMAGE_TYPE_ATR); + save_boot_sectors_type = boot_sectors_type[unit]; + bootsectsize = 128; + if (sectsize == 256 && save_boot_sectors_type != BOOT_SECTORS_LOGICAL) + bootsectsize = 256; + bootsectcount = sectcount < 3 ? sectcount : 3; + /* Umount the file and open it in "wb" mode (it will truncate the file) */ + SIO_Dismount(unit + 1); + f = fopen(fname, "wb"); + if (f == NULL) { + Log_print("SIO_FormatDisk: failed to open %s for writing", fname); + return 'E'; + } + /* Write ATR header if necessary */ + if (is_atr) { + struct AFILE_ATR_Header header; + ULONG disksize = (bootsectsize * bootsectcount + sectsize * (sectcount - bootsectcount)) >> 4; + memset(&header, 0, sizeof(header)); + header.magic1 = AFILE_ATR_MAGIC1; + header.magic2 = AFILE_ATR_MAGIC2; + header.secsizelo = (UBYTE) sectsize; + header.secsizehi = (UBYTE) (sectsize >> 8); + header.seccountlo = (UBYTE) disksize; + header.seccounthi = (UBYTE) (disksize >> 8); + header.hiseccountlo = (UBYTE) (disksize >> 16); + header.hiseccounthi = (UBYTE) (disksize >> 24); + fwrite(&header, 1, sizeof(header), f); + } + /* Write boot sectors */ + memset(buffer, 0, sectsize); + for (i = 1; i <= bootsectcount; i++) + fwrite(buffer, 1, bootsectsize, f); + /* Write regular sectors */ + for ( ; i <= sectcount; i++) + fwrite(buffer, 1, sectsize, f); + /* Close file and mount the disk back */ + fclose(f); + SIO_Mount(unit + 1, fname, FALSE); + /* We want to keep the current PHYSICAL/SIO2PC boot sectors type + (since the image is blank it can't be figured out by SIO_Mount) */ + if (bootsectsize == 256) + boot_sectors_type[unit] = save_boot_sectors_type; + /* Return information for Atari (buffer filled with ff's - no bad sectors) */ + memset(buffer, 0xff, sectsize); + io_success[unit] = 0; + return 'C'; +} + +/* Set density and number of sectors + This function is used before the format (0x21) command + to set how the disk will be formatted. + Note this function does *not* affect the currently attached disk + (previously sectorsize/sectorcount were used which could result in + a corrupted image). +*/ +int SIO_WriteStatusBlock(int unit, const UBYTE *buffer) +{ + int size; +#ifdef DEBUG + Log_print("Write Status-Block: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + buffer[0], buffer[1], buffer[2], buffer[3], + buffer[4], buffer[5], buffer[6], buffer[7], + buffer[8], buffer[9], buffer[10], buffer[11]); +#endif + if (SIO_drive_status[unit] == SIO_OFF) + return 0; + /* We only care about the density and the sector count here. + Setting everything else right here seems to be non-sense. + I'm not sure about this density settings, my XF551 + honors only the sector size and ignores the density */ + size = buffer[6] * 256 + buffer[7]; + if (size == 128 || size == 256) + SIO_format_sectorsize[unit] = size; + /* Note that the number of heads are minus 1 */ + SIO_format_sectorcount[unit] = buffer[0] * (buffer[2] * 256 + buffer[3]) * (buffer[4] + 1); + if (SIO_format_sectorcount[unit] < 1 || SIO_format_sectorcount[unit] > 65535) + SIO_format_sectorcount[unit] = 720; + return 'C'; +} + +int SIO_ReadStatusBlock(int unit, UBYTE *buffer) +{ + UBYTE tracks; + UBYTE heads; + int spt; + if (SIO_drive_status[unit] == SIO_OFF) + return 0; + /* default to 1 track, 1 side for non-standard images */ + tracks = 1; + heads = 1; + spt = sectorcount[unit]; + + if (spt % 40 == 0) { + /* standard disk */ + tracks = 40; + spt /= 40; + if (spt > 26 && spt % 2 == 0) { + /* double-sided */ + heads = 2; + spt >>= 1; + if (spt > 26 && spt % 2 == 0) { + /* double-sided, 80 tracks */ + tracks = 80; + spt >>= 1; + } + } + } + + buffer[0] = tracks; /* # of tracks */ + buffer[1] = 1; /* step rate */ + buffer[2] = (UBYTE) (spt >> 8); /* sectors per track. HI byte */ + buffer[3] = (UBYTE) spt; /* sectors per track. LO byte */ + buffer[4] = (UBYTE) (heads - 1); /* # of heads minus 1 */ + /* FM for single density, MFM otherwise */ + buffer[5] = (sectorsize[unit] == 128 && sectorcount[unit] <= 720) ? 0 : 4; + buffer[6] = (UBYTE) (sectorsize[unit] >> 8); /* bytes per sector. HI byte */ + buffer[7] = (UBYTE) sectorsize[unit]; /* bytes per sector. LO byte */ + buffer[8] = 1; /* drive is online */ + buffer[9] = 192; /* transfer speed, whatever this means */ + buffer[10] = 0; + buffer[11] = 0; + return 'C'; +} + +/* + Status Request from Atari 400/800 Technical Reference Notes + + DVSTAT + 0 Command Status + DVSTAT + 1 Hardware Status + DVSTAT + 2 Timeout + DVSTAT + 3 Unused + + Command Status Bits + + Bit 0 = 1 indicates an invalid command frame was received + Bit 1 = 1 indicates an invalid data frame was received + Bit 2 = 1 indicates that last read/write operation was unsuccessful + Bit 3 = 1 indicates that the diskette is write protected + Bit 4 = 1 indicates active/standby + + plus + + Bit 5 = 1 indicates double density + Bit 7 = 1 indicates dual density disk (1050 format) + */ +int SIO_DriveStatus(int unit, UBYTE *buffer) +{ + if (BINLOAD_start_binloading) { + buffer[0] = 16 + 8; + buffer[1] = 255; + buffer[2] = 1; + buffer[3] = 0 ; + return 'C'; + } + + if (SIO_drive_status[unit] == SIO_OFF) + return 0; + + /* .PRO contains status information in the sector header */ + if (io_success[unit] != 0 && image_type[unit] == IMAGE_TYPE_PRO) { + int sector = io_success[unit]; + SeekSector(unit, sector); + if (fread(buffer, 1, 4, disk[unit]) < 4) { + Log_print("SIO_DriveStatus: failed to read sector header"); + } + return 'C'; + } + else if (io_success[unit] != 0 && image_type[unit] == IMAGE_TYPE_VAPI && + SIO_drive_status[unit] != SIO_NO_DISK) { + vapi_additional_info_t *info; + info = (vapi_additional_info_t *)additional_info[unit]; + buffer[0] = info->sec_stat_buff[0]; + buffer[1] = info->sec_stat_buff[1]; + buffer[2] = info->sec_stat_buff[2]; + buffer[3] = info->sec_stat_buff[3]; + Log_print("Drive Status unit %d %x %x %x %x",unit,buffer[0], buffer[1], buffer[2], buffer[3]); + return 'C'; + } + buffer[0] = 16; /* drive active */ + buffer[1] = disk[unit] != NULL ? 255 /* WD 177x OK */ : 127 /* no disk */; + if (io_success[unit] != 0) + buffer[0] |= 4; /* failed RW-operation */ + if (SIO_drive_status[unit] == SIO_READ_ONLY) + buffer[0] |= 8; /* write protection */ + if (SIO_format_sectorsize[unit] == 256) + buffer[0] |= 32; /* double density */ + if (SIO_format_sectorcount[unit] == 1040) + buffer[0] |= 128; /* 1050 enhanced density */ + buffer[2] = 1; + buffer[3] = 0; + return 'C'; +} + +#ifndef NO_SECTOR_DELAY +/* A hack for the "Overmind" demo. This demo verifies if sectors aren't read + faster than with a typical disk drive. We introduce a delay + of SECTOR_DELAY scanlines between successive reads of sector 1. */ +#define SECTOR_DELAY 3200 +static int delay_counter = 0; +static int last_ypos = 0; +#endif + +/* SIO patch emulation routine */ +void SIO_Handler(void) +{ + int sector = MEMORY_dGetWordAligned(0x30a); + UBYTE unit = (MEMORY_dGetByte(0x300) + MEMORY_dGetByte(0x301) + 0xff ) - 0x31; + UBYTE result = 0x00; + UWORD data = MEMORY_dGetWordAligned(0x304); + int length = MEMORY_dGetWordAligned(0x308); + int realsize = 0; + int cmd = MEMORY_dGetByte(0x302); + + if ((unsigned int)MEMORY_dGetByte(0x300) + (unsigned int)MEMORY_dGetByte(0x301) > 0xff) { + /* carry */ + unit++; + } + /* A real atari just adds the bytes and 0xff. The result could wrap.*/ + /* XL OS: E99D: LDA $0300 ADC $0301 ADC #$FF STA 023A */ + /* Disk 1 is ASCII '1' = 0x31 etc */ + /* Disk 1 -> unit = 0 */ + if (MEMORY_dGetByte(0x300) != 0x60 && unit < SIO_MAX_DRIVES && (SIO_drive_status[unit] != SIO_OFF || BINLOAD_start_binloading)) { /* UBYTE range ! */ +#ifdef DEBUG + Log_print("SIO disk command is %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + cmd, MEMORY_dGetByte(0x303), MEMORY_dGetByte(0x304), MEMORY_dGetByte(0x305), MEMORY_dGetByte(0x306), + MEMORY_dGetByte(0x308), MEMORY_dGetByte(0x309), MEMORY_dGetByte(0x30a), MEMORY_dGetByte(0x30b), + MEMORY_dGetByte(0x30c), MEMORY_dGetByte(0x30d)); +#endif + switch (cmd) { + case 0x4e: /* Read Status Block */ + if (12 == length) { + result = SIO_ReadStatusBlock(unit, DataBuffer); + if (result == 'C') + MEMORY_CopyToMem(DataBuffer, data, 12); + } + else + result = 'E'; + break; + case 0x4f: /* Write Status Block */ + if (12 == length) { + MEMORY_CopyFromMem(data, DataBuffer, 12); + result = SIO_WriteStatusBlock(unit, DataBuffer); + } + else + result = 'E'; + break; + case 0x50: /* Write */ + case 0x57: + case 0xD0: /* xf551 hispeed */ + case 0xD7: + SIO_SizeOfSector(unit, sector, &realsize, NULL); + if (realsize == length) { + MEMORY_CopyFromMem(data, DataBuffer, realsize); + result = SIO_WriteSector(unit, sector, DataBuffer); + } + else + result = 'E'; + break; + case 0x52: /* Read */ + case 0xD2: /* xf551 hispeed */ +#ifndef NO_SECTOR_DELAY + if (sector == 1) { + if (delay_counter > 0) { + if (last_ypos != ANTIC_ypos) { + last_ypos = ANTIC_ypos; + delay_counter--; + } + CPU_regPC = 0xe459; /* stay at SIO patch */ + return; + } + delay_counter = SECTOR_DELAY; + } + else { + delay_counter = 0; + } +#endif + SIO_SizeOfSector(unit, sector, &realsize, NULL); + if (realsize == length) { + result = SIO_ReadSector(unit, sector, DataBuffer); + if (result == 'C') + MEMORY_CopyToMem(DataBuffer, data, realsize); + } + else + result = 'E'; + break; + case 0x53: /* Status */ + if (4 == length) { + result = SIO_DriveStatus(unit, DataBuffer); + if (result == 'C') { + MEMORY_CopyToMem(DataBuffer, data, 4); + } + } + else + result = 'E'; + break; + /*case 0x66:*/ /* US Doubler Format - I think! */ + case 0x21: /* Format Disk */ + case 0xA1: /* xf551 hispeed */ + realsize = SIO_format_sectorsize[unit]; + if (realsize == length) { + result = SIO_FormatDisk(unit, DataBuffer, realsize, SIO_format_sectorcount[unit]); + if (result == 'C') + MEMORY_CopyToMem(DataBuffer, data, realsize); + } + else { + /* there are programs which send the format-command but don't wait for the result (eg xf-tools) */ + SIO_FormatDisk(unit, DataBuffer, realsize, SIO_format_sectorcount[unit]); + result = 'E'; + } + break; + case 0x22: /* Enhanced Density Format */ + case 0xA2: /* xf551 hispeed */ + realsize = 128; + if (realsize == length) { + result = SIO_FormatDisk(unit, DataBuffer, 128, 1040); + if (result == 'C') + MEMORY_CopyToMem(DataBuffer, data, realsize); + } + else { + SIO_FormatDisk(unit, DataBuffer, 128, 1040); + result = 'E'; + } + break; + default: + result = 'N'; + } + } + /* cassette i/o */ + else if (MEMORY_dGetByte(0x300) == 0x60) { + UBYTE gaps = MEMORY_dGetByte(0x30b); + switch (cmd){ + case 0x52: /* read */ + SIO_last_op = SIO_LAST_READ; + SIO_last_drive = 0x61; + SIO_last_op_time = 0x10; + /* set expected Gap */ + CASSETTE_AddGap(gaps == 0 ? 2000 : 160); + /* get record from storage medium */ + if (CASSETTE_ReadToMemory(data, length)) + result = 'C'; + else + result = 'E'; + break; + case 0x57: /* write */ + SIO_last_op = SIO_LAST_WRITE; + SIO_last_drive = 0x61; + SIO_last_op_time = 0x10; + /* add pregap length */ + CASSETTE_AddGap(gaps == 0 ? 3000 : 260); + /* write full record to storage medium */ + if (CASSETTE_WriteFromMemory(data, length)) + result = 'C'; + else + result = 'E'; + break; + default: + result = 'N'; + } + } + + switch (result) { + case 0x00: /* Device disabled, generate timeout */ + CPU_regY = 138; + CPU_SetN; + break; + case 'A': /* Device acknowledge */ + case 'C': /* Operation complete */ + CPU_regY = 1; + CPU_ClrN; + break; + case 'N': /* Device NAK */ + CPU_regY = 144; + CPU_SetN; + break; + case 'E': /* Device error */ + default: + CPU_regY = 146; + CPU_SetN; + break; + } + CPU_regA = 0; /* MMM */ + MEMORY_dPutByte(0x0303, CPU_regY); + MEMORY_dPutByte(0x42,0); + CPU_SetC; + + /* After each SIO operation a routine called SENDDS ($EC5F in OSB) is + invoked, which, among other functions, silences the sound + generators. With SIO patch we don't call SIOV and in effect SENDDS + is not called either, but this causes a problem with tape saving. + During tape saving sound generators are enabled before calling + SIOV, but are not disabled later (no call to SENDDS). The effect is + that after saving to tape the unwanted SIO sounds are left audible. + To avoid the problem, we silence the sound registers by hand. */ + POKEY_PutByte(POKEY_OFFSET_AUDC1, 0); + POKEY_PutByte(POKEY_OFFSET_AUDC2, 0); + POKEY_PutByte(POKEY_OFFSET_AUDC3, 0); + POKEY_PutByte(POKEY_OFFSET_AUDC4, 0); +} + +UBYTE SIO_ChkSum(const UBYTE *buffer, int length) +{ +#if 0 + /* old, less efficient version */ + int i; + int checksum = 0; + for (i = 0; i < length; i++, buffer++) { + checksum += *buffer; + while (checksum > 255) + checksum -= 255; + } +#else + int checksum = 0; + while (--length >= 0) + checksum += *buffer++; + do + checksum = (checksum & 0xff) + (checksum >> 8); + while (checksum > 255); +#endif + return checksum; +} + +static UBYTE Command_Frame(void) +{ + int unit; + int sector; + int realsize; + + sector = CommandFrame[2] | (((UWORD) CommandFrame[3]) << 8); + unit = CommandFrame[0] - '1'; + + if (unit < 0 || unit >= SIO_MAX_DRIVES) { + /* Unknown device */ + Log_print("Unknown command frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); + TransferStatus = SIO_NoFrame; + return 0; + } + switch (CommandFrame[1]) { + case 0x4e: /* Read Status */ +#ifdef DEBUG + Log_print("Read-status frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + DataBuffer[0] = SIO_ReadStatusBlock(unit, DataBuffer + 1); + DataBuffer[13] = SIO_ChkSum(DataBuffer + 1, 12); + DataIndex = 0; + ExpectedBytes = 14; + TransferStatus = SIO_ReadFrame; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL; + return 'A'; + case 0x4f: /* Write status */ +#ifdef DEBUG + Log_print("Write-status frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + ExpectedBytes = 13; + DataIndex = 0; + TransferStatus = SIO_WriteFrame; + return 'A'; + case 0x50: /* Write */ + case 0x57: + case 0xD0: /* xf551 hispeed */ + case 0xD7: +#ifdef DEBUG + Log_print("Write-sector frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + SIO_SizeOfSector((UBYTE) unit, sector, &realsize, NULL); + ExpectedBytes = realsize + 1; + DataIndex = 0; + TransferStatus = SIO_WriteFrame; + SIO_last_op = SIO_LAST_WRITE; + SIO_last_op_time = 10; + SIO_last_drive = unit + 1; + return 'A'; + case 0x52: /* Read */ + case 0xD2: /* xf551 hispeed */ +#ifdef DEBUG + Log_print("Read-sector frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + SIO_SizeOfSector((UBYTE) unit, sector, &realsize, NULL); + DataBuffer[0] = SIO_ReadSector(unit, sector, DataBuffer + 1); + DataBuffer[1 + realsize] = SIO_ChkSum(DataBuffer + 1, realsize); + DataIndex = 0; + ExpectedBytes = 2 + realsize; + TransferStatus = SIO_ReadFrame; + /* wait longer before confirmation because bytes could be lost */ + /* before the buffer was set (see $E9FB & $EA37 in XL-OS) */ + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL << 2; + if (image_type[unit] == IMAGE_TYPE_VAPI) { + vapi_additional_info_t *info; + info = (vapi_additional_info_t *)additional_info[unit]; + if (info == NULL) + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL << 2; + else + POKEY_DELAYED_SERIN_IRQ = ((info->vapi_delay_time + 114/2) / 114) - 12; + } +#ifndef NO_SECTOR_DELAY + else if (sector == 1) { + POKEY_DELAYED_SERIN_IRQ += delay_counter; + delay_counter = SECTOR_DELAY; + } + else { + delay_counter = 0; + } +#endif + SIO_last_op = SIO_LAST_READ; + SIO_last_op_time = 10; + SIO_last_drive = unit + 1; + return 'A'; + case 0x53: /* Status */ +#ifdef DEBUG + Log_print("Status frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + DataBuffer[0] = SIO_DriveStatus(unit, DataBuffer + 1); + DataBuffer[1 + 4] = SIO_ChkSum(DataBuffer + 1, 4); + DataIndex = 0; + ExpectedBytes = 6; + TransferStatus = SIO_ReadFrame; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL; + return 'A'; + /*case 0x66:*/ /* US Doubler Format - I think! */ + case 0x21: /* Format Disk */ + case 0xa1: /* xf551 hispeed */ +#ifdef DEBUG + Log_print("Format-disk frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + realsize = SIO_format_sectorsize[unit]; + DataBuffer[0] = SIO_FormatDisk(unit, DataBuffer + 1, realsize, SIO_format_sectorcount[unit]); + DataBuffer[1 + realsize] = SIO_ChkSum(DataBuffer + 1, realsize); + DataIndex = 0; + ExpectedBytes = 2 + realsize; + TransferStatus = SIO_FormatFrame; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL; + return 'A'; + case 0x22: /* Dual Density Format */ + case 0xa2: /* xf551 hispeed */ +#ifdef DEBUG + Log_print("Format-Medium frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + DataBuffer[0] = SIO_FormatDisk(unit, DataBuffer + 1, 128, 1040); + DataBuffer[1 + 128] = SIO_ChkSum(DataBuffer + 1, 128); + DataIndex = 0; + ExpectedBytes = 2 + 128; + TransferStatus = SIO_FormatFrame; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL; + return 'A'; + default: + /* Unknown command for a disk drive */ +#ifdef DEBUG + Log_print("Command frame: %02x %02x %02x %02x %02x", + CommandFrame[0], CommandFrame[1], CommandFrame[2], + CommandFrame[3], CommandFrame[4]); +#endif + TransferStatus = SIO_NoFrame; + return 'E'; + } +} + +/* Enable/disable the Tape Motor */ +void SIO_TapeMotor(int onoff) +{ + CASSETTE_TapeMotor(onoff); + if (onoff) { + /* set frame to cassette frame, if not */ + /* in a transfer with an intelligent peripheral */ + if (TransferStatus == SIO_NoFrame || TransferStatus == SIO_CasReadWrite) + TransferStatus = SIO_CasReadWrite; + SIO_last_drive = 0x60; + SIO_last_op_time = 0x10; + } + else { + /* set frame to none */ + if (TransferStatus == SIO_CasReadWrite) + TransferStatus = SIO_NoFrame; + SIO_last_op_time = 0; + } +} + +/* Enable/disable the command frame */ +void SIO_SwitchCommandFrame(int onoff) +{ + if (onoff) { /* Enabled */ + if (TransferStatus != SIO_NoFrame) + Log_print("Unexpected command frame at state %x.", TransferStatus); + CommandIndex = 0; + DataIndex = 0; + ExpectedBytes = 5; + TransferStatus = SIO_CommandFrame; + } + else { + if (TransferStatus != SIO_StatusRead && TransferStatus != SIO_NoFrame && + TransferStatus != SIO_ReadFrame) { + if (!(TransferStatus == SIO_CommandFrame && CommandIndex == 0)) + Log_print("Command frame %02x unfinished.", TransferStatus); + TransferStatus = SIO_NoFrame; + } + CommandIndex = 0; + } +} + +static UBYTE WriteSectorBack(void) +{ + UWORD sector; + UBYTE unit; + + sector = CommandFrame[2] + (CommandFrame[3] << 8); + unit = CommandFrame[0] - '1'; + if (unit >= SIO_MAX_DRIVES) /* UBYTE range ! */ + return 0; + switch (CommandFrame[1]) { + case 0x4f: /* Write Status Block */ + return SIO_WriteStatusBlock(unit, DataBuffer); + case 0x50: /* Write */ + case 0x57: + case 0xD0: /* xf551 hispeed */ + case 0xD7: + return SIO_WriteSector(unit, sector, DataBuffer); + default: + return 'E'; + } +} + +/* Put a byte that comes out of POKEY. So get it here... */ +void SIO_PutByte(int byte) +{ + switch (TransferStatus) { + case SIO_CommandFrame: + if (CommandIndex < ExpectedBytes) { + CommandFrame[CommandIndex++] = byte; + if (CommandIndex >= ExpectedBytes) { + if (CommandFrame[0] >= 0x31 && CommandFrame[0] <= 0x38 && (SIO_drive_status[CommandFrame[0]-0x31] != SIO_OFF || BINLOAD_start_binloading)) { + TransferStatus = SIO_StatusRead; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL + SIO_ACK_INTERVAL; + } + else + TransferStatus = SIO_NoFrame; + } + } + else { + Log_print("Invalid command frame!"); + TransferStatus = SIO_NoFrame; + } + break; + case SIO_WriteFrame: /* Expect data */ + if (DataIndex < ExpectedBytes) { + DataBuffer[DataIndex++] = byte; + if (DataIndex >= ExpectedBytes) { + UBYTE sum = SIO_ChkSum(DataBuffer, ExpectedBytes - 1); + if (sum == DataBuffer[ExpectedBytes - 1]) { + UBYTE result = WriteSectorBack(); + if (result != 0) { + DataBuffer[0] = 'A'; + DataBuffer[1] = result; + DataIndex = 0; + ExpectedBytes = 2; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL + SIO_ACK_INTERVAL; + TransferStatus = SIO_FinalStatus; + } + else + TransferStatus = SIO_NoFrame; + } + else { + DataBuffer[0] = 'E'; + DataIndex = 0; + ExpectedBytes = 1; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL + SIO_ACK_INTERVAL; + TransferStatus = SIO_FinalStatus; + } + } + } + else { + Log_print("Invalid data frame!"); + } + break; + case SIO_CasReadWrite: + CASSETTE_PutByte(byte); + break; + } + /* POKEY_DELAYED_SEROUT_IRQ = SIO_SEROUT_INTERVAL; */ /* already set in pokey.c */ +} + +/* Get a byte from the floppy to the pokey. */ +int SIO_GetByte(void) +{ + int byte = 0; + + switch (TransferStatus) { + case SIO_StatusRead: + byte = Command_Frame(); /* Handle now the command */ + break; + case SIO_FormatFrame: + TransferStatus = SIO_ReadFrame; + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL << 3; + /* FALL THROUGH */ + case SIO_ReadFrame: + if (DataIndex < ExpectedBytes) { + byte = DataBuffer[DataIndex++]; + if (DataIndex >= ExpectedBytes) { + TransferStatus = SIO_NoFrame; + } + else { + /* set delay using the expected transfer speed */ + POKEY_DELAYED_SERIN_IRQ = (DataIndex == 1) ? SIO_SERIN_INTERVAL + : ((SIO_SERIN_INTERVAL * POKEY_AUDF[POKEY_CHAN3] - 1) / 0x28 + 1); + } + } + else { + Log_print("Invalid read frame!"); + TransferStatus = SIO_NoFrame; + } + break; + case SIO_FinalStatus: + if (DataIndex < ExpectedBytes) { + byte = DataBuffer[DataIndex++]; + if (DataIndex >= ExpectedBytes) { + TransferStatus = SIO_NoFrame; + } + else { + if (DataIndex == 0) + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL + SIO_ACK_INTERVAL; + else + POKEY_DELAYED_SERIN_IRQ = SIO_SERIN_INTERVAL; + } + } + else { + Log_print("Invalid read frame!"); + TransferStatus = SIO_NoFrame; + } + break; + case SIO_CasReadWrite: + byte = CASSETTE_GetByte(); + break; + default: + break; + } + return byte; +} + +#if !defined(BASIC) && !defined(__PLUS) +int SIO_RotateDisks(void) +{ + char tmp_filenames[SIO_MAX_DRIVES][FILENAME_MAX]; + int i; + int bSuccess = TRUE; + + for (i = 0; i < SIO_MAX_DRIVES; i++) { + strcpy(tmp_filenames[i], SIO_filename[i]); + SIO_Dismount(i + 1); + } + + for (i = 1; i < SIO_MAX_DRIVES; i++) { + if (strcmp(tmp_filenames[i], "None") && strcmp(tmp_filenames[i], "Off") && strcmp(tmp_filenames[i], "Empty") ) { + if (!SIO_Mount(i, tmp_filenames[i], FALSE)) /* Note that this is NOT i-1 because SIO_Mount is 1 indexed */ + bSuccess = FALSE; + } + } + + i = SIO_MAX_DRIVES - 1; + while (i > -1 && (!strcmp(tmp_filenames[i], "None") || !strcmp(tmp_filenames[i], "Off") || !strcmp(tmp_filenames[i], "Empty")) ) { + i--; + } + + if (i > -1) { + if (!SIO_Mount(i + 1, tmp_filenames[0], FALSE)) + bSuccess = FALSE; + } + + return bSuccess; +} +#endif /* !defined(BASIC) && !defined(__PLUS) */ + +#ifndef BASIC + +void SIO_StateSave(void) +{ + int i; + + for (i = 0; i < 8; i++) { + StateSav_SaveINT((int *) &SIO_drive_status[i], 1); + StateSav_SaveFNAME(SIO_filename[i]); + } +} + +void SIO_StateRead(void) +{ + int i; + + for (i = 0; i < 8; i++) { + int saved_drive_status; + char filename[FILENAME_MAX]; + + StateSav_ReadINT(&saved_drive_status, 1); + SIO_drive_status[i] = (SIO_UnitStatus)saved_drive_status; + + StateSav_ReadFNAME(filename); + if (filename[0] == 0) + continue; + + /* If the disk drive wasn't empty or off when saved, + mount the disk */ + switch (saved_drive_status) { + case SIO_READ_ONLY: + SIO_Mount(i + 1, filename, TRUE); + break; + case SIO_READ_WRITE: + SIO_Mount(i + 1, filename, FALSE); + break; + default: + break; + } + } +} + +#endif /* BASIC */ + +/* +vim:ts=4:sw=4: +*/ diff --git a/PVAtari800/atari800-src/sio.h b/PVAtari800/atari800-src/sio.h new file mode 100644 index 0000000000..39676b5211 --- /dev/null +++ b/PVAtari800/atari800-src/sio.h @@ -0,0 +1,63 @@ +#ifndef SIO_H_ +#define SIO_H_ + +#include "config.h" + +#include /* FILENAME_MAX */ + +#include "atari.h" + +#define SIO_MAX_DRIVES 8 + +typedef enum SIO_tagUnitStatus { + SIO_OFF, + SIO_NO_DISK, + SIO_READ_ONLY, + SIO_READ_WRITE +} SIO_UnitStatus; + +extern char SIO_status[256]; +extern SIO_UnitStatus SIO_drive_status[SIO_MAX_DRIVES]; +extern char SIO_filename[SIO_MAX_DRIVES][FILENAME_MAX]; + +#define SIO_LAST_READ 0 +#define SIO_LAST_WRITE 1 +extern int SIO_last_op; +extern int SIO_last_op_time; +extern int SIO_last_drive; /* 1 .. 8 */ +extern int SIO_last_sector; + +int SIO_Mount(int diskno, const char *filename, int b_open_readonly); +void SIO_Dismount(int diskno); +void SIO_DisableDrive(int diskno); +int SIO_RotateDisks(void); +void SIO_Handler(void); + +UBYTE SIO_ChkSum(const UBYTE *buffer, int length); +void SIO_TapeMotor(int onoff); +void SIO_SwitchCommandFrame(int onoff); +void SIO_PutByte(int byte); +int SIO_GetByte(void); +int SIO_Initialise(int *argc, char *argv[]); +void SIO_Exit(void); + +/* Some defines about the serial I/O timing. Currently fixed! */ +#define SIO_XMTDONE_INTERVAL 15 +#define SIO_SERIN_INTERVAL 8 +#define SIO_SEROUT_INTERVAL 8 +#define SIO_ACK_INTERVAL 36 + +/* These functions are also used by the 1450XLD Parallel disk device */ +extern int SIO_format_sectorcount[SIO_MAX_DRIVES]; +extern int SIO_format_sectorsize[SIO_MAX_DRIVES]; +int SIO_ReadStatusBlock(int unit, UBYTE *buffer); +int SIO_FormatDisk(int unit, UBYTE *buffer, int sectsize, int sectcount); +void SIO_SizeOfSector(UBYTE unit, int sector, int *sz, ULONG *ofs); +int SIO_ReadSector(int unit, int sector, UBYTE *buffer); +int SIO_DriveStatus(int unit, UBYTE *buffer); +int SIO_WriteStatusBlock(int unit, const UBYTE *buffer); +int SIO_WriteSector(int unit, int sector, const UBYTE *buffer); +void SIO_StateSave(void); +void SIO_StateRead(void); + +#endif /* SIO_H_ */ diff --git a/PVAtari800/atari800-src/sndsave.c b/PVAtari800/atari800-src/sndsave.c new file mode 100644 index 0000000000..89f45c6ed5 --- /dev/null +++ b/PVAtari800/atari800-src/sndsave.c @@ -0,0 +1,191 @@ +/* + * sndsave.c - reading and writing sound to files + * + * Copyright (C) 1995-1998 David Firth + * Copyright (C) 1998-2005 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + * + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Atari800; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include "pokeysnd.h" +#include "sndsave.h" + +/* sndoutput is just the file pointer for the current sound file */ +static FILE *sndoutput = NULL; + +static ULONG byteswritten; + +/* write 32-bit word as little endian */ +static void write32(long x) +{ + fputc(x & 0xff, sndoutput); + fputc((x >> 8) & 0xff, sndoutput); + fputc((x >> 16) & 0xff, sndoutput); + fputc((x >> 24) & 0xff, sndoutput); +} + +/* SndSave_IsSoundFileOpen simply returns true if the sound file is currently open and able to receive writes + RETURNS: TRUE is file is open, FALSE if it is not */ +int SndSave_IsSoundFileOpen(void) +{ + return sndoutput != NULL; +} + + +/* SndSave_CloseSoundFile should be called when the program is exiting, or when all data required has been + written to the file. SndSave_CloseSoundFile will also be called automatically when a call is made to + SndSave_OpenSoundFile, or an error is made in SndSave_WriteToSoundFile. Note that CloseSoundFile has to back track + to the header written out in SndSave_OpenSoundFile and update it with the length of samples written + + RETURNS: TRUE if file closed with no problems, FALSE if failure during close */ + +int SndSave_CloseSoundFile(void) +{ + int bSuccess = TRUE; + char aligned = 0; + + if (sndoutput != NULL) { + /* A RIFF file's chunks must be word-aligned. So let's align. */ + if (byteswritten & 1) { + if (putc(0, sndoutput) == EOF) + bSuccess = FALSE; + else + aligned = 1; + } + + if (bSuccess) { + /* Sound file is finished, so modify header and close it. */ + if (fseek(sndoutput, 4, SEEK_SET) != 0) /* Seek past RIFF */ + bSuccess = FALSE; + else { + /* RIFF header's size field must equal the size of all chunks + * with alignment, so the alignment byte is added. + */ + write32(byteswritten + 36 + aligned); + if (fseek(sndoutput, 40, SEEK_SET) != 0) + bSuccess = FALSE; + else { + /* But in the "data" chunk size field, the alignment byte + * should be ignored. */ + write32(byteswritten); + } + } + } + fclose(sndoutput); + sndoutput = NULL; + } + + return bSuccess; +} + + +/* SndSave_OpenSoundFile will start a new sound file and write out the header. If an existing sound file is + already open it will be closed first, and the new file opened in it's place + + RETURNS: TRUE if file opened with no problems, FALSE if failure during open */ + +int SndSave_OpenSoundFile(const char *szFileName) +{ + SndSave_CloseSoundFile(); + + sndoutput = fopen(szFileName, "wb"); + + if (sndoutput == NULL) + return FALSE; + /* + The RIFF header: + + Offset Length Contents + 0 4 bytes 'RIFF' + 4 4 bytes + 8 4 bytes 'WAVE' + + The fmt chunk: + + 12 4 bytes 'fmt ' + 16 4 bytes 0x00000010 // Length of the fmt data (16 bytes) + 20 2 bytes 0x0001 // Format tag: 1 = PCM + 22 2 bytes // Channels: 1 = mono, 2 = stereo + 24 4 bytes // Samples per second: e.g., 44100 + 28 4 bytes // sample rate * block align + 32 2 bytes // channels * bits/sample / 8 + 34 2 bytes // 8 or 16 + + The data chunk: + + 36 4 bytes 'data' + 40 4 bytes + 44 bytes + + All chunks must be word-aligned. + + Good description of WAVE format: http://www.sonicspot.com/guide/wavefiles.html + */ + + if (fwrite("RIFF\0\0\0\0WAVEfmt \x10\0\0\0\1\0", 1, 22, sndoutput) != 22) { + fclose(sndoutput); + sndoutput = NULL; + return FALSE; + } + + fputc(POKEYSND_num_pokeys, sndoutput); + fputc(0, sndoutput); + write32(POKEYSND_playback_freq); + + + write32(POKEYSND_playback_freq * (POKEYSND_snd_flags & POKEYSND_BIT16 ? POKEYSND_num_pokeys << 1 : POKEYSND_num_pokeys)); + + fputc(POKEYSND_snd_flags & POKEYSND_BIT16 ? POKEYSND_num_pokeys << 1 : POKEYSND_num_pokeys, sndoutput); + fputc(0, sndoutput); + + fputc(POKEYSND_snd_flags & POKEYSND_BIT16? 16: 8, sndoutput); + + if (fwrite("\0data\0\0\0\0", 1, 9, sndoutput) != 9) { + fclose(sndoutput); + sndoutput = NULL; + return FALSE; + } + + byteswritten = 0; + return TRUE; +} + +/* SndSave_WriteToSoundFile will dump PCM data to the WAV file. The best way to do this for Atari800 is + probably to call it directly after POKEYSND_Process(buffer, size) with the same values (buffer, size) + + RETURNS: the number of bytes written to the file (should be equivalent to the input uiSize parm) */ + +int SndSave_WriteToSoundFile(const unsigned char *ucBuffer, unsigned int uiSize) +{ + /* XXX FIXME: doesn't work with big-endian architectures */ + if (sndoutput && ucBuffer && uiSize) { + int result; + if (POKEYSND_snd_flags & POKEYSND_BIT16) + uiSize <<= 1; + result = fwrite(ucBuffer, 1, uiSize, sndoutput); + byteswritten += result; + if (result != uiSize) { + SndSave_CloseSoundFile(); + } + + return result; + } + + return 0; +} diff --git a/PVAtari800/atari800-src/sndsave.h b/PVAtari800/atari800-src/sndsave.h new file mode 100644 index 0000000000..02a7c7ae97 --- /dev/null +++ b/PVAtari800/atari800-src/sndsave.h @@ -0,0 +1,12 @@ +#ifndef SNDSAVE_H_ +#define SNDSAVE_H_ + +#include "atari.h" + +int SndSave_IsSoundFileOpen(void); +int SndSave_CloseSoundFile(void); +int SndSave_OpenSoundFile(const char *szFileName); +int SndSave_WriteToSoundFile(const UBYTE *ucBuffer, unsigned int uiSize); + +#endif /* SNDSAVE_H_ */ + diff --git a/PVAtari800/atari800-src/sound.c b/PVAtari800/atari800-src/sound.c new file mode 100644 index 0000000000..6725528fbe --- /dev/null +++ b/PVAtari800/atari800-src/sound.c @@ -0,0 +1,547 @@ +/* + * sound.c - platform-independent interface for platform-specific sound output. + * + * Copyright (C) 2013 Tomasz Krasuski + * Copyright (C) 2013-2014 Atari800 development team (see DOC/CREDITS) + * + * This file is part of the Atari800 emulator project which emulates + * the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers. + + * Atari800 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * Atari800 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with Atari800; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include + +#include "sound.h" + +#include "atari.h" +#include "log.h" +#include "platform.h" +#include "pokeysnd.h" +#include "util.h" + +#define DEBUG 0 + +int Sound_enabled = 1; + +Sound_setup_t Sound_desired = { + 44100, + 2, + 1, + 0 +}; + +Sound_setup_t Sound_out; + +static int paused = TRUE; + +#ifndef SOUND_CALLBACK +static UBYTE *process_buffer = NULL; +static unsigned int process_buffer_size; +#endif /* !SOUND_CALLBACK */ + +#ifdef SYNCHRONIZED_SOUND +static UBYTE *sync_buffer = NULL; +static unsigned int sync_buffer_size; +/* Two invariants are held: + a) 0 <= sync_read_pos < sync_buffer_size + b) sync_read_pos <= sync_write_pos <= sync_buffer_size + sync_read_pos + sync_write_pos may be >= sync_buffer_size. In such case the actual write + position is sync_write_pos % sync_buffer_size. */ +static unsigned int sync_write_pos; +static unsigned int sync_read_pos; + +unsigned int Sound_latency = 20; +/* Cumulative audio difference. */ +static double avg_fill; +/* Estimated fill of sync_buffer */ +static unsigned int sync_est_fill; +/* If sync_est_fill goes outside this bounds, emulation speed is adjusted. */ +static unsigned int sync_min_fill; +static unsigned int sync_max_fill; +#ifdef SOUND_CALLBACK +#endif /* SOUND_CALLBACK */ +/* Time of last write of sudio to output device (either by Sound_Callback or + WriteOut). */ +double last_audio_write_time; +#endif /* SYNCHRONIZED_SOUND */ + +enum { MAX_SAMPLE_SIZE = 2, /* for 16-bit */ +#ifdef STEREO_SOUND + MAX_CHANNELS = 2, +#else /* !STEREO_SOUND */ + MAX_CHANNELS = 1, +#endif /* !STEREO_SOUND */ + MAX_FRAME_SIZE = MAX_SAMPLE_SIZE * MAX_CHANNELS +}; + +int Sound_ReadConfig(char *option, char *ptr) +{ + if (strcmp(option, "SOUND_ENABLED") == 0) + return (Sound_enabled = Util_sscanbool(ptr)) != -1; + else if (strcmp(option, "SOUND_RATE") == 0) + return (Sound_desired.freq = Util_sscandec(ptr)) != -1; + else if (strcmp(option, "SOUND_BITS") == 0) { + int bits = Util_sscandec(ptr); + if (bits != 8 && bits != 16) + return FALSE; + Sound_desired.sample_size = bits / 8; + } + else if (strcmp(option, "SOUND_FRAG_FRAMES") == 0) { + int val = Util_sscandec(ptr); + if (val == -1) + return FALSE; + Sound_desired.frag_frames = val; + } +#ifdef SYNCHRONIZED_SOUND + else if (strcmp(option, "SOUND_LATENCY") == 0) + return (Sound_latency = Util_sscandec(ptr)) != -1; +#endif /* SYNCHRONIZED_SOUND */ + else + return FALSE; + return TRUE; +} + +void Sound_WriteConfig(FILE *fp) +{ + fprintf(fp, "SOUND_ENABLED=%u\n", Sound_enabled); + fprintf(fp, "SOUND_RATE=%u\n", Sound_desired.freq); + fprintf(fp, "SOUND_BITS=%u\n", Sound_desired.sample_size * 8); + fprintf(fp, "SOUND_FRAG_FRAMES=%u\n", Sound_desired.frag_frames); +#ifdef SYNCHRONIZED_SOUND + fprintf(fp, "SOUND_LATENCY=%u\n", Sound_latency); +#endif /* SYNCHRONIZED_SOUND */ +} + +int Sound_Initialise(int *argc, char *argv[]) +{ + int i, j; + int help_only = FALSE; + + for (i = j = 1; i < *argc; i++) { + int i_a = (i + 1 < *argc); /* is argument available? */ + int a_m = FALSE; /* error, argument missing! */ + int a_i = FALSE; /* error, argument invalid! */ + + if (strcmp(argv[i], "-sound") == 0) + Sound_enabled = 1; + else if (strcmp(argv[i], "-nosound") == 0) + Sound_enabled = 0; + else if (strcmp(argv[i], "-dsprate") == 0) { + if (i_a) + a_i = (Sound_desired.freq = Util_sscandec(argv[++i])) == -1; + else a_m = TRUE; + } + else if (strcmp(argv[i], "-audio16") == 0) + Sound_desired.sample_size = 2; + else if (strcmp(argv[i], "-audio8") == 0) + Sound_desired.sample_size = 1; + else if (strcmp(argv[i], "snd-fragsize") == 0) { + if (i_a) { + int val = Util_sscandec(argv[++i]); + if (val == -1) + a_i = TRUE; + else + Sound_desired.frag_frames = val; + } + else a_m = TRUE; + } +#ifdef SYNCHRONIZED_SOUND + else if (strcmp(argv[i], "-snddelay") == 0) + if (i_a) + Sound_latency = Util_sscandec(argv[++i]); + else a_m = TRUE; +#endif /* SYNCHRONIZED_SOUND */ + else { + if (strcmp(argv[i], "-help") == 0) { + help_only = TRUE; + Log_print("\t-sound Enable sound"); + Log_print("\t-nosound Disable sound"); + Log_print("\t-dsprate Set sound output frequency in Hz"); + Log_print("\t-audio16 Set sound output format to 16-bit"); + Log_print("\t-audio8 Set sound output format to 8-bit"); + Log_print("\t-snd-fragsize Set size of the hardware sound buffer (fragment size)"); +#ifdef SYNCHRONIZED_SOUND + Log_print("\t-snddelay

+ /// Implements the common functionality needed for all s + /// + /// + public abstract class ChecksumGeneratorBase : ChecksumGenerator + { + /// + /// The value of the current checksum + /// + protected uint _current; + + /// + /// Initializes a new instance of the checksum generator base - the current checksum is + /// set to zero + /// + public ChecksumGeneratorBase() + { + _current = 0; + } + + /// + /// Initializes a new instance of the checksum generator basewith a specified value + /// + /// The value to set the current checksum to + public ChecksumGeneratorBase(uint initialValue) + { + _current = initialValue; + } + + /// + /// Resets the current checksum to zero + /// + public void Reset() { _current = 0; } + + /// + /// Gets the current checksum value + /// + public uint Value { get { return _current; } } + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + /// All the other Update methods are implmeneted in terms of this one. + /// This is therefore the only method a derived class has to implement + public abstract void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with an array of bytes. + /// + /// The data to update the checksum with + public void Update(byte[] data) + { + Update(data, 0, data.Length); + } + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + public void Update(string data) + { + Update(Encoding.UTF8.GetBytes(data)); + } + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + public void Update(string data, Encoding encoding) + { + Update(encoding.GetBytes(data)); + } + + } + #endregion + + #region CRC32 + /// + /// Implements a CRC32 checksum generator + /// + public sealed class CRC32Checksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint crc32(uint crc, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the CRC32 checksum generator + /// + public CRC32Checksum() : base() {} + + /// + /// Initializes a new instance of the CRC32 checksum generator with a specified value + /// + /// The value to set the current checksum to + public CRC32Checksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + + #region Adler + /// + /// Implements a checksum generator that computes the Adler checksum on data + /// + public sealed class AdlerChecksum : ChecksumGeneratorBase + { + #region DLL imports + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint adler32(uint adler, int data, uint length); + + #endregion + + /// + /// Initializes a new instance of the Adler checksum generator + /// + public AdlerChecksum() : base() {} + + /// + /// Initializes a new instance of the Adler checksum generator with a specified value + /// + /// The value to set the current checksum to + public AdlerChecksum(uint initialValue) : base(initialValue) {} + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + public override void Update(byte[] data, int offset, int count) + { + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count); + } + finally + { + hData.Free(); + } + } + + } + #endregion + +} \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs new file mode 100644 index 0000000000..9c8d601954 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs @@ -0,0 +1,83 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; + +namespace DotZLib +{ + + /// + /// This class implements a circular buffer + /// + internal class CircularBuffer + { + #region Private data + private int _capacity; + private int _head; + private int _tail; + private int _size; + private byte[] _buffer; + #endregion + + public CircularBuffer(int capacity) + { + Debug.Assert( capacity > 0 ); + _buffer = new byte[capacity]; + _capacity = capacity; + _head = 0; + _tail = 0; + _size = 0; + } + + public int Size { get { return _size; } } + + public int Put(byte[] source, int offset, int count) + { + Debug.Assert( count > 0 ); + int trueCount = Math.Min(count, _capacity - Size); + for (int i = 0; i < trueCount; ++i) + _buffer[(_tail+i) % _capacity] = source[offset+i]; + _tail += trueCount; + _tail %= _capacity; + _size += trueCount; + return trueCount; + } + + public bool Put(byte b) + { + if (Size == _capacity) // no room + return false; + _buffer[_tail++] = b; + _tail %= _capacity; + ++_size; + return true; + } + + public int Get(byte[] destination, int offset, int count) + { + int trueCount = Math.Min(count,Size); + for (int i = 0; i < trueCount; ++i) + destination[offset + i] = _buffer[(_head+i) % _capacity]; + _head += trueCount; + _head %= _capacity; + _size -= trueCount; + return trueCount; + } + + public int Get() + { + if (Size == 0) + return -1; + + int result = (int)_buffer[_head++ % _capacity]; + --_size; + return result; + } + + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/CodecBase.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/CodecBase.cs new file mode 100644 index 0000000000..b0eb78a022 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/CodecBase.cs @@ -0,0 +1,198 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements the common functionality needed for all s + /// + public abstract class CodecBase : Codec, IDisposable + { + + #region Data members + + /// + /// Instance of the internal zlib buffer structure that is + /// passed to all functions in the zlib dll + /// + internal ZStream _ztream = new ZStream(); + + /// + /// True if the object instance has been disposed, false otherwise + /// + protected bool _isDisposed = false; + + /// + /// The size of the internal buffers + /// + protected const int kBufferSize = 16384; + + private byte[] _outBuffer = new byte[kBufferSize]; + private byte[] _inBuffer = new byte[kBufferSize]; + + private GCHandle _hInput; + private GCHandle _hOutput; + + private uint _checksum = 0; + + #endregion + + /// + /// Initializes a new instance of the CodeBase class. + /// + public CodecBase() + { + try + { + _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned); + _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned); + } + catch (Exception) + { + CleanUp(false); + throw; + } + } + + + #region Codec Members + + /// + /// Occurs when more processed data are available. + /// + public event DataAvailableHandler DataAvailable; + + /// + /// Fires the event + /// + protected void OnDataAvailable() + { + if (_ztream.total_out > 0) + { + if (DataAvailable != null) + DataAvailable( _outBuffer, 0, (int)_ztream.total_out); + resetOutput(); + } + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + public void Add(byte[] data) + { + Add(data,0,data.Length); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + /// This must be implemented by a derived class + public abstract void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + /// This must be implemented by a derived class + public abstract void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + public uint Checksum { get { return _checksum; } } + + #endregion + + #region Destructor & IDisposable stuff + + /// + /// Destroys this instance + /// + ~CodecBase() + { + CleanUp(false); + } + + /// + /// Releases any unmanaged resources and calls the method of the derived class + /// + public void Dispose() + { + CleanUp(true); + } + + /// + /// Performs any codec specific cleanup + /// + /// This must be implemented by a derived class + protected abstract void CleanUp(); + + // performs the release of the handles and calls the dereived CleanUp() + private void CleanUp(bool isDisposing) + { + if (!_isDisposed) + { + CleanUp(); + if (_hInput.IsAllocated) + _hInput.Free(); + if (_hOutput.IsAllocated) + _hOutput.Free(); + + _isDisposed = true; + } + } + + + #endregion + + #region Helper methods + + /// + /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// + /// The byte array that contains the data to copy + /// The index of the first byte to copy + /// The number of bytes to copy from data + protected void copyInput(byte[] data, int startIndex, int count) + { + Array.Copy(data, startIndex, _inBuffer,0, count); + _ztream.next_in = _hInput.AddrOfPinnedObject(); + _ztream.total_in = 0; + _ztream.avail_in = (uint)count; + + } + + /// + /// Resets the internal output buffers to a known state - ready for processing + /// + protected void resetOutput() + { + _ztream.total_out = 0; + _ztream.avail_out = kBufferSize; + _ztream.next_out = _hOutput.AddrOfPinnedObject(); + } + + /// + /// Updates the running checksum property + /// + /// The new checksum value + protected void setChecksum(uint newSum) + { + _checksum = newSum; + } + #endregion + + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/Deflater.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/Deflater.cs new file mode 100644 index 0000000000..9039f41f66 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/Deflater.cs @@ -0,0 +1,106 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data compressor, using the deflate algorithm in the ZLib dll + /// + public sealed class Deflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int deflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Deflater + /// + /// The compression level to use for this Deflater + public Deflater(CompressLevel level) : base() + { + int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize deflater"); + + resetOutput(); + } + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + while (err >= 0 && _ztream.avail_in > 0) + { + err = deflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = deflate(ref _ztream, (int)FlushTypes.None); + } + inputIndex += (int)_ztream.total_in; + } + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = deflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + deflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib deflate stream + /// + protected override void CleanUp() { deflateEnd(ref _ztream); } + + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/DotZLib.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/DotZLib.cs new file mode 100644 index 0000000000..90c7c3b380 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/DotZLib.cs @@ -0,0 +1,288 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + + +namespace DotZLib +{ + + #region Internal types + + /// + /// Defines constants for the various flush types used with zlib + /// + internal enum FlushTypes + { + None, Partial, Sync, Full, Finish, Block + } + + #region ZStream structure + // internal mapping of the zlib zstream structure for marshalling + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + internal struct ZStream + { + public IntPtr next_in; + public uint avail_in; + public uint total_in; + + public IntPtr next_out; + public uint avail_out; + public uint total_out; + + [MarshalAs(UnmanagedType.LPStr)] + string msg; + uint state; + + uint zalloc; + uint zfree; + uint opaque; + + int data_type; + public uint adler; + uint reserved; + } + + #endregion + + #endregion + + #region Public enums + /// + /// Defines constants for the available compression levels in zlib + /// + public enum CompressLevel : int + { + /// + /// The default compression level with a reasonable compromise between compression and speed + /// + Default = -1, + /// + /// No compression at all. The data are passed straight through. + /// + None = 0, + /// + /// The maximum compression rate available. + /// + Best = 9, + /// + /// The fastest available compression level. + /// + Fastest = 1 + } + #endregion + + #region Exception classes + /// + /// The exception that is thrown when an error occurs on the zlib dll + /// + public class ZLibException : ApplicationException + { + /// + /// Initializes a new instance of the class with a specified + /// error message and error code + /// + /// The zlib error code that caused the exception + /// A message that (hopefully) describes the error + public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg)) + { + } + + /// + /// Initializes a new instance of the class with a specified + /// error code + /// + /// The zlib error code that caused the exception + public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode)) + { + } + } + #endregion + + #region Interfaces + + /// + /// Declares methods and properties that enables a running checksum to be calculated + /// + public interface ChecksumGenerator + { + /// + /// Gets the current value of the checksum + /// + uint Value { get; } + + /// + /// Clears the current checksum to 0 + /// + void Reset(); + + /// + /// Updates the current checksum with an array of bytes + /// + /// The data to update the checksum with + void Update(byte[] data); + + /// + /// Updates the current checksum with part of an array of bytes + /// + /// The data to update the checksum with + /// Where in data to start updating + /// The number of bytes from data to use + /// The sum of offset and count is larger than the length of data + /// data is a null reference + /// Offset or count is negative. + void Update(byte[] data, int offset, int count); + + /// + /// Updates the current checksum with the data from a string + /// + /// The string to update the checksum with + /// The characters in the string are converted by the UTF-8 encoding + void Update(string data); + + /// + /// Updates the current checksum with the data from a string, using a specific encoding + /// + /// The string to update the checksum with + /// The encoding to use + void Update(string data, Encoding encoding); + } + + + /// + /// Represents the method that will be called from a codec when new data + /// are available. + /// + /// The byte array containing the processed data + /// The index of the first processed byte in data + /// The number of processed bytes available + /// On return from this method, the data may be overwritten, so grab it while you can. + /// You cannot assume that startIndex will be zero. + /// + public delegate void DataAvailableHandler(byte[] data, int startIndex, int count); + + /// + /// Declares methods and events for implementing compressors/decompressors + /// + public interface Codec + { + /// + /// Occurs when more processed data are available. + /// + event DataAvailableHandler DataAvailable; + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data); + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + void Add(byte[] data, int offset, int count); + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + void Finish(); + + /// + /// Gets the checksum of the data that has been added so far + /// + uint Checksum { get; } + + + } + + #endregion + + #region Classes + /// + /// Encapsulates general information about the ZLib library + /// + public class Info + { + #region DLL imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern uint zlibCompileFlags(); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern string zlibVersion(); + #endregion + + #region Private stuff + private uint _flags; + + // helper function that unpacks a bitsize mask + private static int bitSize(uint bits) + { + switch (bits) + { + case 0: return 16; + case 1: return 32; + case 2: return 64; + } + return -1; + } + #endregion + + /// + /// Constructs an instance of the Info class. + /// + public Info() + { + _flags = zlibCompileFlags(); + } + + /// + /// True if the library is compiled with debug info + /// + public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } } + + /// + /// True if the library is compiled with assembly optimizations + /// + public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } } + + /// + /// Gets the size of the unsigned int that was compiled into Zlib + /// + public int SizeOfUInt { get { return bitSize(_flags & 3); } } + + /// + /// Gets the size of the unsigned long that was compiled into Zlib + /// + public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } } + + /// + /// Gets the size of the pointers that were compiled into Zlib + /// + public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } } + + /// + /// Gets the size of the z_off_t type that was compiled into Zlib + /// + public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } } + + /// + /// Gets the version of ZLib as a string, e.g. "1.2.1" + /// + public static string Version { get { return zlibVersion(); } } + } + + #endregion + +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj new file mode 100644 index 0000000000..dea7fb16a9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/GZipStream.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/GZipStream.cs new file mode 100644 index 0000000000..f0eada1d24 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/GZipStream.cs @@ -0,0 +1,301 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + /// + /// Implements a compressed , in GZip (.gz) format. + /// + public class GZipStream : Stream, IDisposable + { + #region Dll Imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern IntPtr gzopen(string name, string mode); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzclose(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzwrite(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzread(IntPtr gzFile, int data, int length); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzgetc(IntPtr gzFile); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int gzputc(IntPtr gzFile, int c); + + #endregion + + #region Private data + private IntPtr _gzFile; + private bool _isDisposed = false; + private bool _isWriting; + #endregion + + #region Constructors + /// + /// Creates a new file as a writeable GZipStream + /// + /// The name of the compressed file to create + /// The compression level to use when adding data + /// If an error occurred in the internal zlib function + public GZipStream(string fileName, CompressLevel level) + { + _isWriting = true; + _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level)); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + } + + /// + /// Opens an existing file as a readable GZipStream + /// + /// The name of the file to open + /// If an error occurred in the internal zlib function + public GZipStream(string fileName) + { + _isWriting = false; + _gzFile = gzopen(fileName, "rb"); + if (_gzFile == IntPtr.Zero) + throw new ZLibException(-1, "Could not open " + fileName); + + } + #endregion + + #region Access properties + /// + /// Returns true of this stream can be read from, false otherwise + /// + public override bool CanRead + { + get + { + return !_isWriting; + } + } + + + /// + /// Returns false. + /// + public override bool CanSeek + { + get + { + return false; + } + } + + /// + /// Returns true if this tsream is writeable, false otherwise + /// + public override bool CanWrite + { + get + { + return _isWriting; + } + } + #endregion + + #region Destructor & IDispose stuff + + /// + /// Destroys this instance + /// + ~GZipStream() + { + cleanUp(false); + } + + /// + /// Closes the external file handle + /// + public void Dispose() + { + cleanUp(true); + } + + // Does the actual closing of the file handle. + private void cleanUp(bool isDisposing) + { + if (!_isDisposed) + { + gzclose(_gzFile); + _isDisposed = true; + } + } + #endregion + + #region Basic reading and writing + /// + /// Attempts to read a number of bytes from the stream. + /// + /// The destination data buffer + /// The index of the first destination byte in buffer + /// The number of bytes requested + /// The number of bytes read + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not readable. + /// If this stream has been disposed. + public override int Read(byte[] buffer, int offset, int count) + { + if (!CanRead) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + int result; + try + { + result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + return result; + } + + /// + /// Attempts to read a single byte from the stream. + /// + /// The byte that was read, or -1 in case of error or End-Of-File + public override int ReadByte() + { + if (!CanRead) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + return gzgetc(_gzFile); + } + + /// + /// Writes a number of bytes to the stream + /// + /// + /// + /// + /// If buffer is null + /// If count or offset are negative + /// If offset + count is > buffer.Length + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void Write(byte[] buffer, int offset, int count) + { + if (!CanWrite) throw new NotSupportedException(); + if (buffer == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > buffer.Length) throw new ArgumentException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); + try + { + int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count); + if (result < 0) + throw new IOException(); + } + finally + { + h.Free(); + } + } + + /// + /// Writes a single byte to the stream + /// + /// The byte to add to the stream. + /// If this stream is not writeable. + /// If this stream has been disposed. + public override void WriteByte(byte value) + { + if (!CanWrite) throw new NotSupportedException(); + if (_isDisposed) throw new ObjectDisposedException("GZipStream"); + + int result = gzputc(_gzFile, (int)value); + if (result < 0) + throw new IOException(); + } + #endregion + + #region Position & length stuff + /// + /// Not supported. + /// + /// + /// Always thrown + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + /// + /// Not suppported. + /// + /// + /// + /// + /// Always thrown + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + /// + /// Flushes the GZipStream. + /// + /// In this implementation, this method does nothing. This is because excessive + /// flushing may degrade the achievable compression rates. + public override void Flush() + { + // left empty on purpose + } + + /// + /// Gets/sets the current position in the GZipStream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + /// + /// Gets the size of the stream. Not suppported. + /// + /// In this implementation this property is not supported + /// Always thrown + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + #endregion + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/Inflater.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/Inflater.cs new file mode 100644 index 0000000000..d295f26804 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/Inflater.cs @@ -0,0 +1,105 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace DotZLib +{ + + /// + /// Implements a data decompressor, using the inflate algorithm in the ZLib dll + /// + public class Inflater : CodecBase + { + #region Dll imports + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)] + private static extern int inflateInit_(ref ZStream sz, string vs, int size); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflate(ref ZStream sz, int flush); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateReset(ref ZStream sz); + + [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)] + private static extern int inflateEnd(ref ZStream sz); + #endregion + + /// + /// Constructs an new instance of the Inflater + /// + public Inflater() : base() + { + int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream)); + if (retval != 0) + throw new ZLibException(retval, "Could not initialize inflater"); + + resetOutput(); + } + + + /// + /// Adds more data to the codec to be processed. + /// + /// Byte array containing the data to be added to the codec + /// The index of the first byte to add from data + /// The number of bytes to add + /// Adding data may, or may not, raise the DataAvailable event + public override void Add(byte[] data, int offset, int count) + { + if (data == null) throw new ArgumentNullException(); + if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException(); + if ((offset+count) > data.Length) throw new ArgumentException(); + + int total = count; + int inputIndex = offset; + int err = 0; + + while (err >= 0 && inputIndex < total) + { + copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize)); + err = inflate(ref _ztream, (int)FlushTypes.None); + if (err == 0) + while (_ztream.avail_out == 0) + { + OnDataAvailable(); + err = inflate(ref _ztream, (int)FlushTypes.None); + } + + inputIndex += (int)_ztream.total_in; + } + setChecksum( _ztream.adler ); + } + + + /// + /// Finishes up any pending data that needs to be processed and handled. + /// + public override void Finish() + { + int err; + do + { + err = inflate(ref _ztream, (int)FlushTypes.Finish); + OnDataAvailable(); + } + while (err == 0); + setChecksum( _ztream.adler ); + inflateReset(ref _ztream); + resetOutput(); + } + + /// + /// Closes the internal zlib inflate stream + /// + protected override void CleanUp() { inflateEnd(ref _ztream); } + + + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/UnitTests.cs new file mode 100644 index 0000000000..528a0398e0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/DotZLib/UnitTests.cs @@ -0,0 +1,274 @@ +// +// Copyright Henrik Ravn 2004 +// +// Use, modification and distribution are subject to the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +using System; +using System.Collections; +using System.IO; + +// uncomment the define below to include unit tests +//#define nunit +#if nunit +using NUnit.Framework; + +// Unit tests for the DotZLib class library +// ---------------------------------------- +// +// Use this with NUnit 2 from http://www.nunit.org +// + +namespace DotZLibTests +{ + using DotZLib; + + // helper methods + internal class Utils + { + public static bool byteArrEqual( byte[] lhs, byte[] rhs ) + { + if (lhs.Length != rhs.Length) + return false; + for (int i = lhs.Length-1; i >= 0; --i) + if (lhs[i] != rhs[i]) + return false; + return true; + } + + } + + + [TestFixture] + public class CircBufferTests + { + #region Circular buffer tests + [Test] + public void SinglePutGet() + { + CircularBuffer buf = new CircularBuffer(10); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + + Assert.IsTrue(buf.Put( 1 )); + Assert.AreEqual( 1, buf.Size ); + Assert.AreEqual( 1, buf.Get() ); + Assert.AreEqual( 0, buf.Size ); + Assert.AreEqual( -1, buf.Get() ); + } + + [Test] + public void BlockPutGet() + { + CircularBuffer buf = new CircularBuffer(10); + byte[] arr = {1,2,3,4,5,6,7,8,9,10}; + Assert.AreEqual( 10, buf.Put(arr,0,10) ); + Assert.AreEqual( 10, buf.Size ); + Assert.IsFalse( buf.Put(11) ); + Assert.AreEqual( 1, buf.Get() ); + Assert.IsTrue( buf.Put(11) ); + + byte[] arr2 = (byte[])arr.Clone(); + Assert.AreEqual( 9, buf.Get(arr2,1,9) ); + Assert.IsTrue( Utils.byteArrEqual(arr,arr2) ); + } + + #endregion + } + + [TestFixture] + public class ChecksumTests + { + #region CRC32 Tests + [Test] + public void CRC32_Null() + { + CRC32Checksum crc32 = new CRC32Checksum(); + Assert.AreEqual( 0, crc32.Value ); + + crc32 = new CRC32Checksum(1); + Assert.AreEqual( 1, crc32.Value ); + + crc32 = new CRC32Checksum(556); + Assert.AreEqual( 556, crc32.Value ); + } + + [Test] + public void CRC32_Data() + { + CRC32Checksum crc32 = new CRC32Checksum(); + byte[] data = { 1,2,3,4,5,6,7 }; + crc32.Update(data); + Assert.AreEqual( 0x70e46888, crc32.Value ); + + crc32 = new CRC32Checksum(); + crc32.Update("penguin"); + Assert.AreEqual( 0x0e5c1a120, crc32.Value ); + + crc32 = new CRC32Checksum(1); + crc32.Update("penguin"); + Assert.AreEqual(0x43b6aa94, crc32.Value); + + } + #endregion + + #region Adler tests + + [Test] + public void Adler_Null() + { + AdlerChecksum adler = new AdlerChecksum(); + Assert.AreEqual(0, adler.Value); + + adler = new AdlerChecksum(1); + Assert.AreEqual( 1, adler.Value ); + + adler = new AdlerChecksum(556); + Assert.AreEqual( 556, adler.Value ); + } + + [Test] + public void Adler_Data() + { + AdlerChecksum adler = new AdlerChecksum(1); + byte[] data = { 1,2,3,4,5,6,7 }; + adler.Update(data); + Assert.AreEqual( 0x5b001d, adler.Value ); + + adler = new AdlerChecksum(); + adler.Update("penguin"); + Assert.AreEqual(0x0bcf02f6, adler.Value ); + + adler = new AdlerChecksum(1); + adler.Update("penguin"); + Assert.AreEqual(0x0bd602f7, adler.Value); + + } + #endregion + } + + [TestFixture] + public class InfoTests + { + #region Info tests + [Test] + public void Info_Version() + { + Info info = new Info(); + Assert.AreEqual("1.2.5", Info.Version); + Assert.AreEqual(32, info.SizeOfUInt); + Assert.AreEqual(32, info.SizeOfULong); + Assert.AreEqual(32, info.SizeOfPointer); + Assert.AreEqual(32, info.SizeOfOffset); + } + #endregion + } + + [TestFixture] + public class DeflateInflateTests + { + #region Deflate tests + [Test] + public void Deflate_Init() + { + using (Deflater def = new Deflater(CompressLevel.Default)) + { + } + } + + private ArrayList compressedData = new ArrayList(); + private uint adler1; + + private ArrayList uncompressedData = new ArrayList(); + private uint adler2; + + public void CDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + compressedData.Add(data[i+startIndex]); + } + + [Test] + public void Deflate_Compress() + { + compressedData.Clear(); + + byte[] testData = new byte[35000]; + for (int i = 0; i < testData.Length; ++i) + testData[i] = 5; + + using (Deflater def = new Deflater((CompressLevel)5)) + { + def.DataAvailable += new DataAvailableHandler(CDataAvail); + def.Add(testData); + def.Finish(); + adler1 = def.Checksum; + } + } + #endregion + + #region Inflate tests + [Test] + public void Inflate_Init() + { + using (Inflater inf = new Inflater()) + { + } + } + + private void DDataAvail(byte[] data, int startIndex, int count) + { + for (int i = 0; i < count; ++i) + uncompressedData.Add(data[i+startIndex]); + } + + [Test] + public void Inflate_Expand() + { + uncompressedData.Clear(); + + using (Inflater inf = new Inflater()) + { + inf.DataAvailable += new DataAvailableHandler(DDataAvail); + inf.Add((byte[])compressedData.ToArray(typeof(byte))); + inf.Finish(); + adler2 = inf.Checksum; + } + Assert.AreEqual( adler1, adler2 ); + } + #endregion + } + + [TestFixture] + public class GZipStreamTests + { + #region GZipStream test + [Test] + public void GZipStream_WriteRead() + { + using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best)) + { + BinaryWriter writer = new BinaryWriter(gzOut); + writer.Write("hi there"); + writer.Write(Math.PI); + writer.Write(42); + } + + using (GZipStream gzIn = new GZipStream("gzstream.gz")) + { + BinaryReader reader = new BinaryReader(gzIn); + string s = reader.ReadString(); + Assert.AreEqual("hi there",s); + double d = reader.ReadDouble(); + Assert.AreEqual(Math.PI, d); + int i = reader.ReadInt32(); + Assert.AreEqual(42,i); + } + + } + #endregion + } +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/LICENSE_1_0.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/LICENSE_1_0.txt new file mode 100644 index 0000000000..127a5bc39b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/readme.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/readme.txt new file mode 100644 index 0000000000..4d8c2dd932 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/dotzlib/readme.txt @@ -0,0 +1,58 @@ +This directory contains a .Net wrapper class library for the ZLib1.dll + +The wrapper includes support for inflating/deflating memory buffers, +.Net streaming wrappers for the gz streams part of zlib, and wrappers +for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples. + +Directory structure: +-------------------- + +LICENSE_1_0.txt - License file. +readme.txt - This file. +DotZLib.chm - Class library documentation +DotZLib.build - NAnt build file +DotZLib.sln - Microsoft Visual Studio 2003 solution file + +DotZLib\*.cs - Source files for the class library + +Unit tests: +----------- +The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher. +To include unit tests in the build, define nunit before building. + + +Build instructions: +------------------- + +1. Using Visual Studio.Net 2003: + Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll) + will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on + you are building the release or debug version of the library. Check + DotZLib/UnitTests.cs for instructions on how to include unit tests in the + build. + +2. Using NAnt: + Open a command prompt with access to the build environment and run nant + in the same directory as the DotZLib.build file. + You can define 2 properties on the nant command-line to control the build: + debug={true|false} to toggle between release/debug builds (default=true). + nunit={true|false} to include or esclude unit tests (default=true). + Also the target clean will remove binaries. + Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release + or ./DotZLib/bin/debug, depending on whether you are building the release + or debug version of the library. + + Examples: + nant -D:debug=false -D:nunit=false + will build a release mode version of the library without unit tests. + nant + will build a debug version of the library with unit tests + nant clean + will remove all previously built files. + + +--------------------------------- +Copyright (c) Henrik Ravn 2004 + +Use, modification and distribution are subject to the Boost Software License, Version 1.0. +(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/gcc_gvmat64/gvmat64.S b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/gcc_gvmat64/gvmat64.S new file mode 100644 index 0000000000..23309fa286 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/gcc_gvmat64/gvmat64.S @@ -0,0 +1,574 @@ +/* +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); // current match + +; gvmat64.S -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; this file is translation from gvmat64.asm to GCC 4.x (for Linux, Mac XCode) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for zLib, I use option: +; gcc -c -arch x86_64 gvmat64.S + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; // current match / +; +; with XCode for Mac, I had strange error with some jump on intel syntax +; this is why BEFORE_JMP and AFTER_JMP are used + */ + + +#define BEFORE_JMP .att_syntax +#define AFTER_JMP .intel_syntax noprefix + +#ifndef NO_UNDERLINE +# define match_init _match_init +# define longest_match _longest_match +#endif + +.intel_syntax noprefix + +.globl match_init, longest_match +.text +longest_match: + + + +#define LocalVarsSize 96 +/* +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp +*/ + +#define chainlenwmask (rsp + 8 - LocalVarsSize) +#define nicematch (rsp + 16 - LocalVarsSize) + +#define save_rdi (rsp + 24 - LocalVarsSize) +#define save_rsi (rsp + 32 - LocalVarsSize) +#define save_rbx (rsp + 40 - LocalVarsSize) +#define save_rbp (rsp + 48 - LocalVarsSize) +#define save_r12 (rsp + 56 - LocalVarsSize) +#define save_r13 (rsp + 64 - LocalVarsSize) +#define save_r14 (rsp + 72 - LocalVarsSize) +#define save_r15 (rsp + 80 - LocalVarsSize) + + +/* +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure +*/ + +#define MAX_MATCH 258 +#define MIN_MATCH 3 +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) + +/* +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). +*/ + + + +/* you can check the structure offset by running + +#include +#include +#include "deflate.h" + +void print_depl() +{ +deflate_state ds; +deflate_state *s=&ds; +printf("size pointer=%u\n",(int)sizeof(void*)); + +printf("#define dsWSize %u\n",(int)(((char*)&(s->w_size))-((char*)s))); +printf("#define dsWMask %u\n",(int)(((char*)&(s->w_mask))-((char*)s))); +printf("#define dsWindow %u\n",(int)(((char*)&(s->window))-((char*)s))); +printf("#define dsPrev %u\n",(int)(((char*)&(s->prev))-((char*)s))); +printf("#define dsMatchLen %u\n",(int)(((char*)&(s->match_length))-((char*)s))); +printf("#define dsPrevMatch %u\n",(int)(((char*)&(s->prev_match))-((char*)s))); +printf("#define dsStrStart %u\n",(int)(((char*)&(s->strstart))-((char*)s))); +printf("#define dsMatchStart %u\n",(int)(((char*)&(s->match_start))-((char*)s))); +printf("#define dsLookahead %u\n",(int)(((char*)&(s->lookahead))-((char*)s))); +printf("#define dsPrevLen %u\n",(int)(((char*)&(s->prev_length))-((char*)s))); +printf("#define dsMaxChainLen %u\n",(int)(((char*)&(s->max_chain_length))-((char*)s))); +printf("#define dsGoodMatch %u\n",(int)(((char*)&(s->good_match))-((char*)s))); +printf("#define dsNiceMatch %u\n",(int)(((char*)&(s->nice_match))-((char*)s))); +} +*/ + +#define dsWSize 68 +#define dsWMask 76 +#define dsWindow 80 +#define dsPrev 96 +#define dsMatchLen 144 +#define dsPrevMatch 148 +#define dsStrStart 156 +#define dsMatchStart 160 +#define dsLookahead 164 +#define dsPrevLen 168 +#define dsMaxChainLen 172 +#define dsGoodMatch 188 +#define dsNiceMatch 192 + +#define window_size [ rcx + dsWSize] +#define WMask [ rcx + dsWMask] +#define window_ad [ rcx + dsWindow] +#define prev_ad [ rcx + dsPrev] +#define strstart [ rcx + dsStrStart] +#define match_start [ rcx + dsMatchStart] +#define Lookahead [ rcx + dsLookahead] //; 0ffffffffh on infozip +#define prev_length [ rcx + dsPrevLen] +#define max_chain_length [ rcx + dsMaxChainLen] +#define good_match [ rcx + dsGoodMatch] +#define nice_match [ rcx + dsNiceMatch] + +/* +; windows: +; parameter 1 in rcx(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + +; +; gcc on macosx-linux: +; see http://www.x86-64.org/documentation/abi-0.99.pdf +; param 1 in rdi, param 2 in rsi +; rbx, rsp, rbp, r12 to r15 must be preserved + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; ms: parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) +; mac: param 1 in rdi, param 2 rsi +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx +*/ + mov [save_rbx],rbx + mov [save_rbp],rbp + + + mov rcx,rdi + + mov r8d,esi + + + mov [save_r12],r12 + mov [save_r13],r13 + mov [save_r14],r14 + mov [save_r15],r15 + + +//;;; uInt wmask = s->w_mask; +//;;; unsigned chain_length = s->max_chain_length; +//;;; if (s->prev_length >= s->good_match) { +//;;; chain_length >>= 2; +//;;; } + + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +//;;; chainlen is decremented once beforehand so that the function can +//;;; use the sign flag instead of the zero flag for the exit test. +//;;; It is then shifted into the high word, to make room for the wmask +//;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +//;;; on zlib only +//;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + + + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d + + + +//;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +//;;; Determine how many bytes the scan ptr is off from being +//;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +//;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +//;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + + mov eax, window_size + sub eax, MIN_LOOKAHEAD + + + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +//;;; int best_len = s->prev_length; + + +//;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +//;;; register ush scan_start = *(ushf*)scan; +//;;; register ush scan_end = *(ushf*)(scan+best_len-1); +//;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +//;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + + + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + + + + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jz LookupLoopIsZero + AFTER_JMP + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + jmp LookupLoopIsZero + AFTER_JMP +/* +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit +*/ +.balign 16 +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + BEFORE_JMP + jbe LeaveNow + AFTER_JMP + sub edx, 0x00010000 + BEFORE_JMP + js LeaveNow + AFTER_JMP + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + BEFORE_JMP + jnz LookupLoop1 + AFTER_JMP + + +//;;; Store the current value of chainlen. + mov [chainlenwmask], edx +/* +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). +*/ + lea rsi,[r8+r10] + mov rdx, 0xfffffffffffffef8 //; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0x0108] //;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0x0108] //;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + +/* +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. +*/ + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + BEFORE_JMP + jnz LoopCmps + jmp LenMaximum + AFTER_JMP + +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0x0000FFFF + jnz LenLower + + test eax,0xffffffff + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + BEFORE_JMP + jnz LenLower + AFTER_JMP + +LenLower32: + shr eax,16 + add rdx,2 + +LenLower: + sub al, 1 + adc rdx, 0 +//;;; Calculate the length of the match. If it is longer than MAX_MATCH, +//;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + BEFORE_JMP + jge LenMaximum + AFTER_JMP +/* +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// +*/ + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP +/* +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); +*/ +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + BEFORE_JMP + jge LeaveNow + AFTER_JMP + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + BEFORE_JMP + jmp LookupLoop + AFTER_JMP + +//;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +//;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +//;;; return s->lookahead; + +LeaveNow: + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d + + + +//;;; Restore the stack and return from whence we came. + + +// mov rsi,[save_rsi] +// mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] + mov r14,[save_r14] + mov r15,[save_r15] + + + ret 0 +//; please don't remove this string ! +//; Your can freely use gvmat64 in any free or commercial app +//; but it is far better don't remove the string in the binary! + // db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 + + +match_init: + ret 0 + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/README b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/README new file mode 100644 index 0000000000..e75ed13294 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/README @@ -0,0 +1 @@ +See infback9.h for what this is and how to use it. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/infback9.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/infback9.c new file mode 100644 index 0000000000..7bbe90ced2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/infback9.c @@ -0,0 +1,617 @@ +/* infback9.c -- inflate deflate64 data using a call-back interface + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "infback9.h" +#include "inftree9.h" +#include "inflate9.h" + +#define WSIZE 65536UL + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + window is a user-supplied window and output buffer that is 64K bytes. + */ +int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) +z_stream FAR *strm; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (voidpf)state; + state->window = window; + return Z_OK; +} + +/* + Build and output length and distance decoding tables for fixed code + decoding. + */ +#ifdef MAKEFIXED +#include + +void makefixed9(void) +{ + unsigned sym, bits, low, size; + code *next, *lenfix, *distfix; + struct inflate_state state; + code fixed[544]; + + /* literal/length table */ + sym = 0; + while (sym < 144) state.lens[sym++] = 8; + while (sym < 256) state.lens[sym++] = 9; + while (sym < 280) state.lens[sym++] = 7; + while (sym < 288) state.lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work); + + /* distance table */ + sym = 0; + while (sym < 32) state.lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work); + + /* write tables */ + puts(" /* inffix9.h -- table for decoding deflate64 fixed codes"); + puts(" * Generated automatically by makefixed9()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits, + lenfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 5) == 0) printf("\n "); + printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits, + distfix[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* Macros for inflateBack(): */ + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n <= 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = window; \ + left = WSIZE; \ + wrap = 1; \ + if (out(out_desc, put, (unsigned)left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) +z_stream FAR *strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have; /* available input */ + unsigned long left; /* available output */ + inflate_mode mode; /* current inflate mode */ + int lastblock; /* true if processing last block */ + int wrap; /* true if the window has wrapped */ + unsigned long write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned extra; /* extra bits needed */ + unsigned long length; /* literal or length of data to copy */ + unsigned long offset; /* distance back to copy string from */ + unsigned long copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; +#include "inffix9.h" + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + mode = TYPE; + lastblock = 0; + write = 0; + wrap = 0; + window = state->window; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = window; + left = WSIZE; + lencode = Z_NULL; + distcode = Z_NULL; + + /* Inflate until end of block marked as last */ + for (;;) + switch (mode) { + case TYPE: + /* determine and dispatch block type */ + if (lastblock) { + BYTEBITS(); + mode = DONE; + break; + } + NEEDBITS(3); + lastblock = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + lastblock ? " (last)" : "")); + mode = STORED; + break; + case 1: /* fixed block */ + lencode = lenfix; + lenbits = 9; + distcode = distfix; + distbits = 5; + Tracev((stderr, "inflate: fixed codes block%s\n", + lastblock ? " (last)" : "")); + mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + lastblock ? " (last)" : "")); + mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + mode = BAD; + break; + } + length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %lu\n", + length)); + INITBITS(); + + /* copy stored block from input to output */ + while (length != 0) { + copy = length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); + if (state->nlen > 286) { + strm->msg = (char *)"too many length symbols"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 7; + ret = inflate_table9(CODES, state->lens, 19, &(state->next), + &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftree9.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + lencode = (code const FAR *)(state->next); + lenbits = 9; + ret = inflate_table9(LENS, state->lens, state->nlen, + &(state->next), &(lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + mode = BAD; + break; + } + distcode = (code const FAR *)(state->next); + distbits = 6; + ret = inflate_table9(DISTS, state->lens + state->nlen, + state->ndist, &(state->next), &(distbits), + state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + mode = LEN; + + case LEN: + /* get a literal, length, or end-of-block code */ + for (;;) { + here = lencode[BITS(lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(length); + left--; + mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + extra = (unsigned)(here.op) & 31; + if (extra != 0) { + NEEDBITS(extra); + length += BITS(extra); + DROPBITS(extra); + } + Tracevv((stderr, "inflate: length %lu\n", length)); + + /* get distance code */ + for (;;) { + here = distcode[BITS(distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + mode = BAD; + break; + } + offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + extra = (unsigned)(here.op) & 15; + if (extra != 0) { + NEEDBITS(extra); + offset += BITS(extra); + DROPBITS(extra); + } + if (offset > WSIZE - (wrap ? 0: left)) { + strm->msg = (char *)"invalid distance too far back"; + mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %lu\n", offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = WSIZE - offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - offset; + copy = left; + } + if (copy > length) copy = length; + length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < WSIZE) { + if (out(out_desc, window, (unsigned)(WSIZE - left))) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBack9End(strm) +z_stream FAR *strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/infback9.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/infback9.h new file mode 100644 index 0000000000..1073c0a38e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/infback9.h @@ -0,0 +1,37 @@ +/* infback9.h -- header for using inflateBack9 functions + * Copyright (C) 2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * This header file and associated patches provide a decoder for PKWare's + * undocumented deflate64 compression method (method 9). Use with infback9.c, + * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported. + * This should be compiled with zlib, since it uses zutil.h and zutil.o. + * This code has not yet been tested on 16-bit architectures. See the + * comments in zlib.h for inflateBack() usage. These functions are used + * identically, except that there is no windowBits parameter, and a 64K + * window must be provided. Also if int's are 16 bits, then a zero for + * the third parameter of the "out" function actually means 65536UL. + * zlib.h must be included before this header file. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); +ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define inflateBack9Init(strm, window) \ + inflateBack9Init_((strm), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +#ifdef __cplusplus +} +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inffix9.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inffix9.h new file mode 100644 index 0000000000..ee5671d2df --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inffix9.h @@ -0,0 +1,107 @@ + /* inffix9.h -- table for decoding deflate64 fixed codes + * Generated automatically by makefixed9(). + */ + + /* WARNING: this file should *not* be used by applications. + It is part of the implementation of this library and is + subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112}, + {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160}, + {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88}, + {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208}, + {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136}, + {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227}, + {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232}, + {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124}, + {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184}, + {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82}, + {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196}, + {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130}, + {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148}, + {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106}, + {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244}, + {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118}, + {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172}, + {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94}, + {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220}, + {130,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,0},{0,8,81},{0,8,17},{133,8,131}, + {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97}, + {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226}, + {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121}, + {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178}, + {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85}, + {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202}, + {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133}, + {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154}, + {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109}, + {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250}, + {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115}, + {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166}, + {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91}, + {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214}, + {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139}, + {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0}, + {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103}, + {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238}, + {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127}, + {0,8,63},{0,9,222},{130,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,0},{0,8,80}, + {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193}, + {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128}, + {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145}, + {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104}, + {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241}, + {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116}, + {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169}, + {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92}, + {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217}, + {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140}, + {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163}, + {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98}, + {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122}, + {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181}, + {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86}, + {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205}, + {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134}, + {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157}, + {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,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,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113}, + {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163}, + {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89}, + {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211}, + {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137}, + {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3}, + {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101}, + {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235}, + {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125}, + {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187}, + {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83}, + {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199}, + {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151}, + {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107}, + {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247}, + {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119}, + {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175}, + {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95}, + {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223}, + {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143}, + {0,8,79},{0,9,255} + }; + + static const code distfix[32] = { + {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5}, + {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513}, + {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129}, + {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145}, + {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4}, + {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073}, + {134,5,193},{142,5,49153} + }; diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inflate9.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inflate9.h new file mode 100644 index 0000000000..ee9a79394b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inflate9.h @@ -0,0 +1,47 @@ +/* inflate9.h -- internal inflate state definition + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Possible inflate modes between inflate() calls */ +typedef enum { + TYPE, /* i: waiting for type bits, including last-flag bit */ + STORED, /* i: waiting for stored size (length and complement) */ + TABLE, /* i: waiting for dynamic block table lengths */ + LEN, /* i: waiting for length/lit code */ + DONE, /* finished check, done -- remain here until reset */ + BAD /* got a data error -- remain here until reset */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD mode -- not shown for clarity) + + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or DONE + STORED -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LEN or TYPE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + /* sliding window */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inftree9.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inftree9.c new file mode 100644 index 0000000000..306c5f1b19 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inftree9.c @@ -0,0 +1,324 @@ +/* inftree9.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftree9.h" + +#define MAXBITS 15 + +const char inflate9_copyright[] = + " inflate9 1.2.5 Copyright 1995-2010 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table9(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 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, 3, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, + 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, + 133, 133, 133, 133, 144, 73, 195}; + static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ + 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, 32769, 49153}; + static const unsigned short dext[32] = { /* Distance codes 0..31 extra */ + 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, + 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 141, 141, 142, 142}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) return -1; /* no codes! */ + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftree9.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += 1U << curr; + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + curr = root; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inftree9.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inftree9.h new file mode 100644 index 0000000000..5ab21f0c6d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/infback9/inftree9.h @@ -0,0 +1,61 @@ +/* inftree9.h -- header to use inftree9.c + * Copyright (C) 1995-2008 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 100eeeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1446, which is the sum of 852 for literal/length codes and 594 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 32 6 15" for distance codes returns 594. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in infback9.c. If the root table size is changed, + then these maximum sizes would be need to be recalculated and updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 594 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table9() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/inflate86/inffas86.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/inflate86/inffas86.c new file mode 100644 index 0000000000..7292f67b75 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/inflate86/inffas86.c @@ -0,0 +1,1157 @@ +/* inffas86.c is a hand tuned assembler version of + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } ar; + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + +#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 ) + __asm__ __volatile__ ( +" leaq %0, %%rax\n" +" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */ +" movq %%rsp, (%%rax)\n" +" movq %%rax, %%rsp\n" /* make rsp point to &ar */ +" movq 16(%%rsp), %%rsi\n" /* rsi = in */ +" movq 32(%%rsp), %%rdi\n" /* rdi = out */ +" movq 24(%%rsp), %%r9\n" /* r9 = last */ +" movq 48(%%rsp), %%r10\n" /* r10 = end */ +" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */ +" movq 72(%%rsp), %%r11\n" /* r11 = dcode */ +" movq 80(%%rsp), %%rdx\n" /* rdx = hold */ +" movl 88(%%rsp), %%ebx\n" /* ebx = bits */ +" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */ +" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */ + /* r14d = len */ + /* r15d = dist */ +" cld\n" +" cmpq %%rdi, %%r10\n" +" je .L_one_time\n" /* if only one decode left */ +" cmpq %%rsi, %%r9\n" +" je .L_one_time\n" +" jmp .L_do_loop\n" + +".L_one_time:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code_one_time\n" + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ +" jmp .L_get_length_code_one_time\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpq %%rdi, %%r10\n" +" jbe .L_break_loop\n" +" cmpq %%rsi, %%r9\n" +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" movq %%r12, %%r8\n" /* r8 = lmask */ +" cmpb $32, %%bl\n" +" ja .L_get_length_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_length_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" movq %%r12, %%r8\n" /* r8 = lmask */ +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" + +".L_get_length_code_one_time:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%r14d\n" /* len = this */ +" shrl $16, %%r14d\n" /* len = this.val */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r14d\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" movq %%r13, %%r8\n" /* r8 = dmask */ +" cmpb $32, %%bl\n" +" ja .L_get_distance_code\n" /* if (32 < bits) */ + +" lodsl\n" /* eax = *(uint *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $32, %%bl\n" /* bits += 32 */ +" shlq %%cl, %%rax\n" +" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */ + +".L_get_distance_code:\n" +" andq %%rdx, %%r8\n" /* r8 &= hold */ +" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%r15d\n" /* dist = this */ +" shrl $16, %%r15d\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrq %%cl, %%rdx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrq %%cl, %%rdx\n" +" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movq %%rsi, %%r8\n" /* save in so from can use it's reg */ +" movq %%rdi, %%rax\n" +" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */ + +" cmpl %%r15d, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%rsi), %%al\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%r15d\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */ +" je .L_check_window\n" + +" movl %%r14d, %%ecx\n" /* ecx = len */ +" movb -1(%%rdi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%rdi)\n" +" incq %%rdi\n" + +".L_set_two:\n" +" rep stosw\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r14d, %%eax\n" /* eax += len */ +" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%r15d, %%eax\n" /* eax += dist */ +" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" /* ecx = nbytes */ +" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */ +" negl %%ecx\n" /* nbytes = -nbytes */ + +" cmpl %%r15d, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 96(%%rsp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" addq %%rax, %%rsi\n" /* from += wsize - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%r14d\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* eax -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 96(%%rsp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" movl 92(%%rsp), %%esi\n" /* from = wsize */ +" addq 56(%%rsp), %%rsi\n" /* from += window */ +" addq %%rax, %%rsi\n" /* from += write */ +" subq %%rcx, %%rsi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq 56(%%rsp), %%rsi\n" /* from = window */ +" movl 96(%%rsp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" movq 56(%%rsp), %%rsi\n" /* rsi = window */ +" addq %%rax, %%rsi\n" +" subq %%rcx, %%rsi\n" /* from += write - nbytes */ + +" movl %%r14d, %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movq %%rdi, %%rsi\n" +" subq %%r15, %%rsi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" /* ecx = len */ +" rep movsb\n" + +" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl $4, 116(%%rsp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 116(%%rsp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movq %%rsi, 16(%%rsp)\n" /* in */ +" movq %%rdi, 32(%%rsp)\n" /* out */ +" movl %%ebx, 88(%%rsp)\n" /* bits */ +" movq %%rdx, 80(%%rsp)\n" /* hold */ +" movq (%%rsp), %%rax\n" /* restore rbp and rsp */ +" movq 8(%%rsp), %%rbp\n" +" movq %%rax, %%rsp\n" + : + : "m" (ar) + : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", + "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" + ); +#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 ) + __asm__ __volatile__ ( +" leal %0, %%eax\n" +" movl %%esp, (%%eax)\n" /* save esp, ebp */ +" movl %%ebp, 4(%%eax)\n" +" movl %%eax, %%esp\n" +" movl 8(%%esp), %%esi\n" /* esi = in */ +" movl 16(%%esp), %%edi\n" /* edi = out */ +" movl 40(%%esp), %%edx\n" /* edx = hold */ +" movl 44(%%esp), %%ebx\n" /* ebx = bits */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ + +" cld\n" +" jmp .L_do_loop\n" + +".align 32,0x90\n" +".L_while_test:\n" +" cmpl %%edi, 24(%%esp)\n" /* out < end */ +" jbe .L_break_loop\n" +" cmpl %%esi, 12(%%esp)\n" /* in < last */ +" jbe .L_break_loop\n" + +".L_do_loop:\n" +" cmpb $15, %%bl\n" +" ja .L_get_length_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_length_code:\n" +" movl 56(%%esp), %%eax\n" /* eax = lmask */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */ + +".L_dolen:\n" +" movb %%ah, %%cl\n" /* cl = this.bits */ +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ + +" testb %%al, %%al\n" +" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */ + +" shrl $16, %%eax\n" /* output this.val char */ +" stosb\n" +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_length_base:\n" +" movl %%eax, %%ecx\n" /* len = this */ +" shrl $16, %%ecx\n" /* len = this.val */ +" movl %%ecx, 64(%%esp)\n" /* save len */ +" movb %%al, %%cl\n" + +" testb $16, %%al\n" +" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */ +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_decode_distance\n" /* if (!op) */ +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_len\n" /* if (op <= bits) */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_len:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */ + +".L_decode_distance:\n" +" cmpb $15, %%bl\n" +" ja .L_get_distance_code\n" /* if (15 < bits) */ + +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ + +".L_get_distance_code:\n" +" movl 60(%%esp), %%eax\n" /* eax = dmask */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */ + +".L_dodist:\n" +" movl %%eax, %%ebp\n" /* dist = this */ +" shrl $16, %%ebp\n" /* dist = this.val */ +" movb %%ah, %%cl\n" +" subb %%ah, %%bl\n" /* bits -= this.bits */ +" shrl %%cl, %%edx\n" /* hold >>= this.bits */ +" movb %%al, %%cl\n" /* cl = this.op */ + +" testb $16, %%al\n" /* if ((op & 16) == 0) */ +" jz .L_test_for_second_level_dist\n" +" andb $15, %%cl\n" /* op &= 15 */ +" jz .L_check_dist_one\n" +" cmpb %%cl, %%bl\n" +" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */ + +" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */ +" xorl %%eax, %%eax\n" +" lodsw\n" /* al = *(ushort *)in++ */ +" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */ +" addb $16, %%bl\n" /* bits += 16 */ +" shll %%cl, %%eax\n" +" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */ +" movb %%ch, %%cl\n" /* move op back to ecx */ + +".L_add_bits_to_dist:\n" +" subb %%cl, %%bl\n" +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" /* (1 << op) - 1 */ +" andl %%edx, %%eax\n" /* eax &= hold */ +" shrl %%cl, %%edx\n" +" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */ + +".L_check_window:\n" +" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */ +" movl %%edi, %%eax\n" +" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */ + +" cmpl %%ebp, %%eax\n" +" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ + +" sarl %%ecx\n" +" jnc .L_copy_two\n" /* if len % 2 == 0 */ + +" rep movsw\n" +" movb (%%esi), %%al\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_copy_two:\n" +" rep movsw\n" +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_check_dist_one:\n" +" cmpl $1, %%ebp\n" /* if dist 1, is a memset */ +" jne .L_check_window\n" +" cmpl %%edi, 20(%%esp)\n" +" je .L_check_window\n" /* out == beg, if outside window */ + +" movl 64(%%esp), %%ecx\n" /* ecx = len */ +" movb -1(%%edi), %%al\n" +" movb %%al, %%ah\n" + +" sarl %%ecx\n" +" jnc .L_set_two\n" +" movb %%al, (%%edi)\n" +" incl %%edi\n" + +".L_set_two:\n" +" rep stosw\n" +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".align 32,0x90\n" +".L_test_for_second_level_length:\n" +" testb $64, %%al\n" +" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl 64(%%esp), %%eax\n" /* eax += len */ +" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/ +" jmp .L_dolen\n" + +".align 32,0x90\n" +".L_test_for_second_level_dist:\n" +" testb $64, %%al\n" +" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */ + +" xorl %%eax, %%eax\n" +" incl %%eax\n" +" shll %%cl, %%eax\n" +" decl %%eax\n" +" andl %%edx, %%eax\n" /* eax &= hold */ +" addl %%ebp, %%eax\n" /* eax += dist */ +" movl 36(%%esp), %%ecx\n" /* ecx = dcode */ +" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/ +" jmp .L_dodist\n" + +".align 32,0x90\n" +".L_clip_window:\n" +" movl %%eax, %%ecx\n" +" movl 48(%%esp), %%eax\n" /* eax = wsize */ +" negl %%ecx\n" /* nbytes = -nbytes */ +" movl 28(%%esp), %%esi\n" /* from = window */ + +" cmpl %%ebp, %%eax\n" +" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */ + +" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */ +" cmpl $0, 52(%%esp)\n" +" jne .L_wrap_around_window\n" /* if (write != 0) */ + +" subl %%ecx, %%eax\n" +" addl %%eax, %%esi\n" /* from += wsize - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_wrap_around_window:\n" +" movl 52(%%esp), %%eax\n" /* eax = write */ +" cmpl %%eax, %%ecx\n" +" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */ + +" addl 48(%%esp), %%esi\n" /* from += wsize */ +" addl %%eax, %%esi\n" /* from += write */ +" subl %%ecx, %%esi\n" /* from -= nbytes */ +" subl %%eax, %%ecx\n" /* nbytes -= write */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl 28(%%esp), %%esi\n" /* from = window */ +" movl 52(%%esp), %%ecx\n" /* nbytes = write */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" + +".align 32,0x90\n" +".L_contiguous_in_window:\n" +" addl %%eax, %%esi\n" +" subl %%ecx, %%esi\n" /* from += write - nbytes */ + +" movl 64(%%esp), %%eax\n" /* eax = len */ +" cmpl %%ecx, %%eax\n" +" jbe .L_do_copy\n" /* if (nbytes >= len) */ + +" subl %%ecx, %%eax\n" /* len -= nbytes */ +" rep movsb\n" +" movl %%edi, %%esi\n" +" subl %%ebp, %%esi\n" /* from = out - dist */ +" jmp .L_do_copy\n" /* if (nbytes >= len) */ + +".align 32,0x90\n" +".L_do_copy:\n" +" movl %%eax, %%ecx\n" +" rep movsb\n" + +" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */ +" movl 32(%%esp), %%ebp\n" /* ebp = lcode */ +" jmp .L_while_test\n" + +".L_test_for_end_of_block:\n" +" testb $32, %%al\n" +" jz .L_invalid_literal_length_code\n" +" movl $1, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_literal_length_code:\n" +" movl $2, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_code:\n" +" movl $3, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_invalid_distance_too_far:\n" +" movl 8(%%esp), %%esi\n" +" movl $4, 72(%%esp)\n" +" jmp .L_break_loop_with_status\n" + +".L_break_loop:\n" +" movl $0, 72(%%esp)\n" + +".L_break_loop_with_status:\n" +/* put in, out, bits, and hold back into ar and pop esp */ +" movl %%esi, 8(%%esp)\n" /* save in */ +" movl %%edi, 16(%%esp)\n" /* save out */ +" movl %%ebx, 44(%%esp)\n" /* save bits */ +" movl %%edx, 40(%%esp)\n" /* save hold */ +" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */ +" movl (%%esp), %%esp\n" + : + : "m" (ar) + : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi" + ); +#elif defined( _MSC_VER ) && ! defined( _M_AMD64 ) + __asm { + lea eax, ar + mov [eax], esp /* save esp, ebp */ + mov [eax+4], ebp + mov esp, eax + mov esi, [esp+8] /* esi = in */ + mov edi, [esp+16] /* edi = out */ + mov edx, [esp+40] /* edx = hold */ + mov ebx, [esp+44] /* ebx = bits */ + mov ebp, [esp+32] /* ebp = lcode */ + + cld + jmp L_do_loop + +ALIGN 4 +L_while_test: + cmp [esp+24], edi + jbe L_break_loop + cmp [esp+12], esi + jbe L_break_loop + +L_do_loop: + cmp bl, 15 + ja L_get_length_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_length_code: + mov eax, [esp+56] /* eax = lmask */ + and eax, edx /* eax &= hold */ + mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah /* cl = this.bits */ + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base /* if (op != 0) 45.7% */ + + shr eax, 16 /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov ecx, eax /* len = this */ + shr ecx, 16 /* len = this.val */ + mov [esp+64], ecx /* save len */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + and cl, 15 /* op &= 15 */ + jz L_decode_distance /* if (!op) */ + cmp bl, cl + jae L_add_bits_to_len /* if (op <= bits) */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + shr edx, cl + add [esp+64], eax /* len += hold & mask[op] */ + +L_decode_distance: + cmp bl, 15 + ja L_get_distance_code /* if (15 < bits) */ + + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + +L_get_distance_code: + mov eax, [esp+60] /* eax = dmask */ + mov ecx, [esp+36] /* ecx = dcode */ + and eax, edx /* eax &= hold */ + mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */ + +L_dodist: + mov ebp, eax /* dist = this */ + shr ebp, 16 /* dist = this.val */ + mov cl, ah + sub bl, ah /* bits -= this.bits */ + shr edx, cl /* hold >>= this.bits */ + mov cl, al /* cl = this.op */ + + test al, 16 /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 /* op &= 15 */ + jz L_check_dist_one + cmp bl, cl + jae L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + mov ch, cl /* stash op in ch, freeing cl */ + xor eax, eax + lodsw /* al = *(ushort *)in++ */ + mov cl, bl /* cl = bits, needs it for shifting */ + add bl, 16 /* bits += 16 */ + shl eax, cl + or edx, eax /* hold |= *((ushort *)in)++ << bits */ + mov cl, ch /* move op back to ecx */ + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax /* (1 << op) - 1 */ + and eax, edx /* eax &= hold */ + shr edx, cl + add ebp, eax /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov [esp+8], esi /* save in so from can use it's reg */ + mov eax, edi + sub eax, [esp+20] /* nbytes = out - beg */ + + cmp eax, ebp + jb L_clip_window /* if (dist > nbytes) 4.2% */ + + mov ecx, [esp+64] /* ecx = len */ + mov esi, edi + sub esi, ebp /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two + + rep movsw + mov al, [esi] + mov [edi], al + inc edi + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_copy_two: + rep movsw + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp ebp, 1 /* if dist 1, is a memset */ + jne L_check_window + cmp [esp+20], edi + je L_check_window /* out == beg, if outside window */ + + mov ecx, [esp+64] /* ecx = len */ + mov al, [edi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [edi], al /* memset out with from[-1] */ + inc edi + +L_set_two: + rep stosw + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, [esp+64] /* eax += len */ + mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx /* eax &= hold */ + add eax, ebp /* eax += dist */ + mov ecx, [esp+36] /* ecx = dcode */ + mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax + mov eax, [esp+48] /* eax = wsize */ + neg ecx /* nbytes = -nbytes */ + mov esi, [esp+28] /* from = window */ + + cmp eax, ebp + jb L_invalid_distance_too_far /* if (dist > wsize) */ + + add ecx, ebp /* nbytes = dist - nbytes */ + cmp dword ptr [esp+52], 0 + jne L_wrap_around_window /* if (write != 0) */ + + sub eax, ecx + add esi, eax /* from += wsize - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [esp+52] /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window /* if (write >= nbytes) */ + + add esi, [esp+48] /* from += wsize */ + add esi, eax /* from += write */ + sub esi, ecx /* from -= nbytes */ + sub ecx, eax /* nbytes -= write */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, [esp+28] /* from = window */ + mov ecx, [esp+52] /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + add esi, eax + sub esi, ecx /* from += write - nbytes */ + + mov eax, [esp+64] /* eax = len */ + cmp eax, ecx + jbe L_do_copy /* if (nbytes >= len) */ + + sub eax, ecx /* len -= nbytes */ + rep movsb + mov esi, edi + sub esi, ebp /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_do_copy: + mov ecx, eax + rep movsb + + mov esi, [esp+8] /* move in back to %esi, toss from */ + mov ebp, [esp+32] /* ebp = lcode */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [esp+72], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [esp+72], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [esp+72], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov esi, [esp+4] + mov dword ptr [esp+72], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [esp+72], 0 + +L_break_loop_with_status: +/* put in, out, bits, and hold back into ar and pop esp */ + mov [esp+8], esi /* save in */ + mov [esp+16], edi /* save out */ + mov [esp+44], ebx /* save bits */ + mov [esp+40], edx /* save hold */ + mov ebp, [esp+4] /* restore esp, ebp */ + mov esp, [esp] + } +#else +#error "x86 architecture not defined" +#endif + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = ar.hold; + state->bits = ar.bits; + return; +} + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/inflate86/inffast.S b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/inflate86/inffast.S new file mode 100644 index 0000000000..2245a2905b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/inflate86/inffast.S @@ -0,0 +1,1368 @@ +/* + * inffast.S is a hand tuned assembler version of: + * + * inffast.c -- fast decoding + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * This version (Jan-23-2003) of inflate_fast was coded and tested under + * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that + * machine, I found that gzip style archives decompressed about 20% faster than + * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will + * depend on how large of a buffer is used for z_stream.next_in & next_out + * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in + * stream processing I/O and crc32/addler32. In my case, this routine used + * 70% of the cpu time and crc32 used 20%. + * + * I am confident that this version will work in the general case, but I have + * not tested a wide variety of datasets or a wide variety of platforms. + * + * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating. + * It should be a runtime flag instead of compile time flag... + * + * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction. + * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code + * is compiled. Without either option, runtime detection is enabled. Runtime + * detection should work on all modern cpus and the recomended algorithm (flip + * ID bit on eflags and then use the cpuid instruction) is used in many + * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12 + * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o + * inffast.obj generates a COFF object which can then be linked with MSVC++ + * compiled code. Tested under FreeBSD 4.7 with gcc-2.95. + * + * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and + * slower than compiler generated code). Adjusted cpuid check to use the MMX + * code only for Pentiums < P4 until I have more data on the P4. Speed + * improvment is only about 15% on the Athlon when compared with code generated + * with MSVC++. Not sure yet, but I think the P4 will also be slower using the + * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and + * have less latency than MMX ops. Added code to buffer the last 11 bytes of + * the input stream since the MMX code grabs bits in chunks of 32, which + * differs from the inffast.c algorithm. I don't think there would have been + * read overruns where a page boundary was crossed (a segfault), but there + * could have been overruns when next_in ends on unaligned memory (unintialized + * memory read). + * + * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C + * version of the non-MMX code so that it doesn't depend on zstrm and zstate + * structure offsets which are hard coded in this file. This was last tested + * with zlib-1.2.0 which is currently in beta testing, newer versions of this + * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and + * http://www.charm.net/~christop/zlib/ + */ + + +/* + * if you have underscore linking problems (_inflate_fast undefined), try + * using -DGAS_COFF + */ +#if ! defined( GAS_COFF ) && ! defined( GAS_ELF ) + +#if defined( WIN32 ) || defined( __CYGWIN__ ) +#define GAS_COFF /* windows object format */ +#else +#define GAS_ELF +#endif + +#endif /* ! GAS_COFF && ! GAS_ELF */ + + +#if defined( GAS_COFF ) + +/* coff externals have underscores */ +#define inflate_fast _inflate_fast +#define inflate_fast_use_mmx _inflate_fast_use_mmx + +#endif /* GAS_COFF */ + + +.file "inffast.S" + +.globl inflate_fast + +.text +.align 4,0 +.L_invalid_literal_length_code_msg: +.string "invalid literal/length code" + +.align 4,0 +.L_invalid_distance_code_msg: +.string "invalid distance code" + +.align 4,0 +.L_invalid_distance_too_far_msg: +.string "invalid distance too far back" + +#if ! defined( NO_MMX ) +.align 4,0 +.L_mask: /* mask[N] = ( 1 << N ) - 1 */ +.long 0 +.long 1 +.long 3 +.long 7 +.long 15 +.long 31 +.long 63 +.long 127 +.long 255 +.long 511 +.long 1023 +.long 2047 +.long 4095 +.long 8191 +.long 16383 +.long 32767 +.long 65535 +.long 131071 +.long 262143 +.long 524287 +.long 1048575 +.long 2097151 +.long 4194303 +.long 8388607 +.long 16777215 +.long 33554431 +.long 67108863 +.long 134217727 +.long 268435455 +.long 536870911 +.long 1073741823 +.long 2147483647 +.long 4294967295 +#endif /* NO_MMX */ + +.text + +/* + * struct z_stream offsets, in zlib.h + */ +#define next_in_strm 0 /* strm->next_in */ +#define avail_in_strm 4 /* strm->avail_in */ +#define next_out_strm 12 /* strm->next_out */ +#define avail_out_strm 16 /* strm->avail_out */ +#define msg_strm 24 /* strm->msg */ +#define state_strm 28 /* strm->state */ + +/* + * struct inflate_state offsets, in inflate.h + */ +#define mode_state 0 /* state->mode */ +#define wsize_state 32 /* state->wsize */ +#define write_state 40 /* state->write */ +#define window_state 44 /* state->window */ +#define hold_state 48 /* state->hold */ +#define bits_state 52 /* state->bits */ +#define lencode_state 68 /* state->lencode */ +#define distcode_state 72 /* state->distcode */ +#define lenbits_state 76 /* state->lenbits */ +#define distbits_state 80 /* state->distbits */ + +/* + * inflate_fast's activation record + */ +#define local_var_size 64 /* how much local space for vars */ +#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */ +#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */ + +/* + * offsets for local vars on stack + */ +#define out 60 /* unsigned char* */ +#define window 56 /* unsigned char* */ +#define wsize 52 /* unsigned int */ +#define write 48 /* unsigned int */ +#define in 44 /* unsigned char* */ +#define beg 40 /* unsigned char* */ +#define buf 28 /* char[ 12 ] */ +#define len 24 /* unsigned int */ +#define last 20 /* unsigned char* */ +#define end 16 /* unsigned char* */ +#define dcode 12 /* code* */ +#define lcode 8 /* code* */ +#define dmask 4 /* unsigned int */ +#define lmask 0 /* unsigned int */ + +/* + * typedef enum inflate_mode consts, in inflate.h + */ +#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */ +#define INFLATE_MODE_BAD 26 + + +#if ! defined( USE_MMX ) && ! defined( NO_MMX ) + +#define RUN_TIME_MMX + +#define CHECK_MMX 1 +#define DO_USE_MMX 2 +#define DONT_USE_MMX 3 + +.globl inflate_fast_use_mmx + +.data + +.align 4,0 +inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */ +.long CHECK_MMX + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast_use_mmx,@object +.size inflate_fast_use_mmx,4 +#endif + +#endif /* RUN_TIME_MMX */ + +#if defined( GAS_COFF ) +/* coff info: scl 2 = extern, type 32 = function */ +.def inflate_fast; .scl 2; .type 32; .endef +#endif + +.text + +.align 32,0x90 +inflate_fast: + pushl %edi + pushl %esi + pushl %ebp + pushl %ebx + pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */ + subl $local_var_size, %esp + cld + +#define strm_r %esi +#define state_r %edi + + movl strm_sp(%esp), strm_r + movl state_strm(strm_r), state_r + + /* in = strm->next_in; + * out = strm->next_out; + * last = in + strm->avail_in - 11; + * beg = out - (start - strm->avail_out); + * end = out + (strm->avail_out - 257); + */ + movl avail_in_strm(strm_r), %edx + movl next_in_strm(strm_r), %eax + + addl %eax, %edx /* avail_in += next_in */ + subl $11, %edx /* avail_in -= 11 */ + + movl %eax, in(%esp) + movl %edx, last(%esp) + + movl start_sp(%esp), %ebp + movl avail_out_strm(strm_r), %ecx + movl next_out_strm(strm_r), %ebx + + subl %ecx, %ebp /* start -= avail_out */ + negl %ebp /* start = -start */ + addl %ebx, %ebp /* start += next_out */ + + subl $257, %ecx /* avail_out -= 257 */ + addl %ebx, %ecx /* avail_out += out */ + + movl %ebx, out(%esp) + movl %ebp, beg(%esp) + movl %ecx, end(%esp) + + /* wsize = state->wsize; + * write = state->write; + * window = state->window; + * hold = state->hold; + * bits = state->bits; + * lcode = state->lencode; + * dcode = state->distcode; + * lmask = ( 1 << state->lenbits ) - 1; + * dmask = ( 1 << state->distbits ) - 1; + */ + + movl lencode_state(state_r), %eax + movl distcode_state(state_r), %ecx + + movl %eax, lcode(%esp) + movl %ecx, dcode(%esp) + + movl $1, %eax + movl lenbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, lmask(%esp) + + movl $1, %eax + movl distbits_state(state_r), %ecx + shll %cl, %eax + decl %eax + movl %eax, dmask(%esp) + + movl wsize_state(state_r), %eax + movl write_state(state_r), %ecx + movl window_state(state_r), %edx + + movl %eax, wsize(%esp) + movl %ecx, write(%esp) + movl %edx, window(%esp) + + movl hold_state(state_r), %ebp + movl bits_state(state_r), %ebx + +#undef strm_r +#undef state_r + +#define in_r %esi +#define from_r %esi +#define out_r %edi + + movl in(%esp), in_r + movl last(%esp), %ecx + cmpl in_r, %ecx + ja .L_align_long /* if in < last */ + + addl $11, %ecx /* ecx = &in[ avail_in ] */ + subl in_r, %ecx /* ecx = avail_in */ + movl $12, %eax + subl %ecx, %eax /* eax = 12 - avail_in */ + leal buf(%esp), %edi + rep movsb /* memcpy( buf, in, avail_in ) */ + movl %eax, %ecx + xorl %eax, %eax + rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */ + leal buf(%esp), in_r /* in = buf */ + movl in_r, last(%esp) /* last = in, do just one iteration */ + jmp .L_is_aligned + + /* align in_r on long boundary */ +.L_align_long: + testl $3, in_r + jz .L_is_aligned + xorl %eax, %eax + movb (in_r), %al + incl in_r + movl %ebx, %ecx + addl $8, %ebx + shll %cl, %eax + orl %eax, %ebp + jmp .L_align_long + +.L_is_aligned: + movl out(%esp), out_r + +#if defined( NO_MMX ) + jmp .L_do_loop +#endif + +#if defined( USE_MMX ) + jmp .L_init_mmx +#endif + +/*** Runtime MMX check ***/ + +#if defined( RUN_TIME_MMX ) +.L_check_mmx: + cmpl $DO_USE_MMX, inflate_fast_use_mmx + je .L_init_mmx + ja .L_do_loop /* > 2 */ + + pushl %eax + pushl %ebx + pushl %ecx + pushl %edx + pushf + movl (%esp), %eax /* copy eflags to eax */ + xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21) + * to see if cpu supports cpuid... + * ID bit method not supported by NexGen but + * bios may load a cpuid instruction and + * cpuid may be disabled on Cyrix 5-6x86 */ + popf + pushf + popl %edx /* copy new eflags to edx */ + xorl %eax, %edx /* test if ID bit is flipped */ + jz .L_dont_use_mmx /* not flipped if zero */ + xorl %eax, %eax + cpuid + cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */ + jne .L_dont_use_mmx + cmpl $0x6c65746e, %ecx + jne .L_dont_use_mmx + cmpl $0x49656e69, %edx + jne .L_dont_use_mmx + movl $1, %eax + cpuid /* get cpu features */ + shrl $8, %eax + andl $15, %eax + cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */ + jne .L_dont_use_mmx + testl $0x800000, %edx /* test if MMX feature is set (bit 23) */ + jnz .L_use_mmx + jmp .L_dont_use_mmx +.L_use_mmx: + movl $DO_USE_MMX, inflate_fast_use_mmx + jmp .L_check_mmx_pop +.L_dont_use_mmx: + movl $DONT_USE_MMX, inflate_fast_use_mmx +.L_check_mmx_pop: + popl %edx + popl %ecx + popl %ebx + popl %eax + jmp .L_check_mmx +#endif + + +/*** Non-MMX code ***/ + +#if defined ( NO_MMX ) || defined( RUN_TIME_MMX ) + +#define hold_r %ebp +#define bits_r %bl +#define bitslong_r %ebx + +.align 32,0x90 +.L_while_test: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * do { + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = lcode[hold & lmask] + */ + cmpb $15, bits_r + ja .L_get_length_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_length_code: + movl lmask(%esp), %edx /* edx = lmask */ + movl lcode(%esp), %ecx /* ecx = lcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out + * + * dolen: + * bits -= this.bits; + * hold >>= this.bits + */ + movb %ah, %cl /* cl = this.bits */ + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* check if op is a literal + * if (op == 0) { + * PUP(out) = this.val; + * } + */ + testb %al, %al + jnz .L_test_for_length_base /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test + +.L_test_for_length_base: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len + * + * else if (op & 16) { + * len = this.val + * op &= 15 + * if (op) { + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * len += hold & mask[op]; + * bits -= op; + * hold >>= op; + * } + */ +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + movb %al, %cl + + testb $16, %al + jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */ + andb $15, %cl /* op &= 15 */ + jz .L_save_len /* if (!op) */ + cmpb %cl, bits_r + jae .L_add_bits_to_len /* if (op <= bits) */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_len: + movl $1, %eax + shll %cl, %eax + decl %eax + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, len_r /* len += hold & mask[op] */ + +.L_save_len: + movl len_r, len(%esp) /* save len */ +#undef len_r + +.L_decode_distance: + /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * + * if (bits < 15) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * this = dcode[hold & dmask]; + * dodist: + * bits -= this.bits; + * hold >>= this.bits; + * op = this.op; + */ + + cmpb $15, bits_r + ja .L_get_distance_code /* if (15 < bits) */ + + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + +.L_get_distance_code: + movl dmask(%esp), %edx /* edx = dmask */ + movl dcode(%esp), %ecx /* ecx = dcode */ + andl hold_r, %edx /* edx &= hold */ + movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */ + +#define dist_r %edx +.L_dodist: + movl %eax, dist_r /* dist = this */ + shrl $16, dist_r /* dist = this.val */ + movb %ah, %cl + subb %ah, bits_r /* bits -= this.bits */ + shrl %cl, hold_r /* hold >>= this.bits */ + + /* if (op & 16) { + * dist = this.val + * op &= 15 + * if (op > bits) { + * hold |= *((unsigned short *)in)++ << bits; + * bits += 16 + * } + * dist += hold & mask[op]; + * bits -= op; + * hold >>= op; + */ + movb %al, %cl /* cl = this.op */ + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist + andb $15, %cl /* op &= 15 */ + jz .L_check_dist_one + cmpb %cl, bits_r + jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */ + + movb %cl, %ch /* stash op in ch, freeing cl */ + xorl %eax, %eax + lodsw /* al = *(ushort *)in++ */ + movb bits_r, %cl /* cl = bits, needs it for shifting */ + addb $16, bits_r /* bits += 16 */ + shll %cl, %eax + orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */ + movb %ch, %cl /* move op back to ecx */ + +.L_add_bits_to_dist: + movl $1, %eax + shll %cl, %eax + decl %eax /* (1 << op) - 1 */ + subb %cl, bits_r + andl hold_r, %eax /* eax &= hold */ + shrl %cl, hold_r + addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */ + jmp .L_check_window + +.L_check_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * nbytes = out - beg; + * if (dist <= nbytes) { + * from = out - dist; + * do { + * PUP(out) = PUP(from); + * } while (--len > 0) { + * } + */ + + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window /* if (dist > nbytes) 4.2% */ + + movl len(%esp), %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +.align 16,0x90 +.L_check_dist_one: + cmpl $1, dist_r + jne .L_check_window + cmpl out_r, beg(%esp) + je .L_check_window + + decl out_r + movl len(%esp), %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + jmp .L_while_test + +.align 16,0x90 +.L_test_for_second_level_length: + /* else if ((op & 64) == 0) { + * this = lcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl lcode(%esp), %edx /* edx = lcode */ + movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */ + jmp .L_dolen + +.align 16,0x90 +.L_test_for_second_level_dist: + /* else if ((op & 64) == 0) { + * this = dcode[this.val + (hold & mask[op])]; + * } + */ + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + movl $1, %eax + shll %cl, %eax + decl %eax + andl hold_r, %eax /* eax &= hold */ + addl %edx, %eax /* eax += this.val */ + movl dcode(%esp), %edx /* edx = dcode */ + movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */ + jmp .L_dodist + +.align 16,0x90 +.L_clip_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes + * + * else { + * if (dist > wsize) { + * invalid distance + * } + * from = window; + * nbytes = dist - nbytes; + * if (write == 0) { + * from += wsize - nbytes; + */ +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = len + * + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define len_r %eax + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_wrap_around_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else if (write < nbytes) { + * from += wsize + write - nbytes; + * nbytes -= write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = window; + * nbytes = write; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while(--nbytes); + * from = out - dist; + * } + * } + * } + */ +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1 + +.L_contiguous_in_window: + /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist + * %ecx = nbytes, %eax = write, %eax = len + * + * else { + * from += write - nbytes; + * if (nbytes < len) { + * len -= nbytes; + * do { + * PUP(out) = PUP(from); + * } while (--nbytes); + * from = out - dist; + * } + * } + */ +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + movl len(%esp), len_r + cmpl nbytes_r, len_r + jbe .L_do_copy1 /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1: + /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out + * %eax = len + * + * while (len > 0) { + * PUP(out) = PUP(from); + * len--; + * } + * } + * } while (in < last && out < end); + */ +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + jmp .L_while_test + +#undef len_r +#undef dist_r + +#endif /* NO_MMX || RUN_TIME_MMX */ + + +/*** MMX code ***/ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +.align 32,0x90 +.L_init_mmx: + emms + +#undef bits_r +#undef bitslong_r +#define bitslong_r %ebp +#define hold_mm %mm0 + movd %ebp, hold_mm + movl %ebx, bitslong_r + +#define used_mm %mm1 +#define dmask2_mm %mm2 +#define lmask2_mm %mm3 +#define lmask_mm %mm4 +#define dmask_mm %mm5 +#define tmp_mm %mm6 + + movd lmask(%esp), lmask_mm + movq lmask_mm, lmask2_mm + movd dmask(%esp), dmask_mm + movq dmask_mm, dmask2_mm + pxor used_mm, used_mm + movl lcode(%esp), %ebx /* ebx = lcode */ + jmp .L_do_loop_mmx + +.align 32,0x90 +.L_while_test_mmx: + /* while (in < last && out < end) + */ + cmpl out_r, end(%esp) + jbe .L_break_loop /* if (out >= end) */ + + cmpl in_r, last(%esp) + jbe .L_break_loop + +.L_do_loop_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_length_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_length_code_mmx: + pand hold_mm, lmask_mm + movd lmask_mm, %eax + movq lmask2_mm, lmask_mm + movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */ + +.L_dolen_mmx: + movzbl %ah, %ecx /* ecx = this.bits */ + movd %ecx, used_mm + subl %ecx, bitslong_r /* bits -= this.bits */ + + testb %al, %al + jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */ + + shrl $16, %eax /* output this.val char */ + stosb + jmp .L_while_test_mmx + +.L_test_for_length_base_mmx: +#define len_r %edx + movl %eax, len_r /* len = this */ + shrl $16, len_r /* len = this.val */ + + testb $16, %al + jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */ + andl $15, %eax /* op &= 15 */ + jz .L_decode_distance_mmx /* if (!op) */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm + movd hold_mm, %ecx + subl %eax, bitslong_r + andl .L_mask(,%eax,4), %ecx + addl %ecx, len_r /* len += hold & mask[op] */ + +.L_decode_distance_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + + cmpl $32, bitslong_r + ja .L_get_dist_code_mmx /* if (32 < bits) */ + + movd bitslong_r, tmp_mm + movd (in_r), %mm7 + addl $4, in_r + psllq tmp_mm, %mm7 + addl $32, bitslong_r + por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */ + +.L_get_dist_code_mmx: + movl dcode(%esp), %ebx /* ebx = dcode */ + pand hold_mm, dmask_mm + movd dmask_mm, %eax + movq dmask2_mm, dmask_mm + movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */ + +.L_dodist_mmx: +#define dist_r %ebx + movzbl %ah, %ecx /* ecx = this.bits */ + movl %eax, dist_r + shrl $16, dist_r /* dist = this.val */ + subl %ecx, bitslong_r /* bits -= this.bits */ + movd %ecx, used_mm + + testb $16, %al /* if ((op & 16) == 0) */ + jz .L_test_for_second_level_dist_mmx + andl $15, %eax /* op &= 15 */ + jz .L_check_dist_one_mmx + +.L_add_bits_to_dist_mmx: + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd %eax, used_mm /* save bit length of current op */ + movd hold_mm, %ecx /* get the next bits on input stream */ + subl %eax, bitslong_r /* bits -= op bits */ + andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */ + addl %ecx, dist_r /* dist += hold & mask[op] */ + +.L_check_window_mmx: + movl in_r, in(%esp) /* save in so from can use it's reg */ + movl out_r, %eax + subl beg(%esp), %eax /* nbytes = out - beg */ + + cmpl dist_r, %eax + jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */ + + movl len_r, %ecx + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + + subl $3, %ecx + movb (from_r), %al + movb %al, (out_r) + movb 1(from_r), %al + movb 2(from_r), %dl + addl $3, from_r + movb %al, 1(out_r) + movb %dl, 2(out_r) + addl $3, out_r + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_check_dist_one_mmx: + cmpl $1, dist_r + jne .L_check_window_mmx + cmpl out_r, beg(%esp) + je .L_check_window_mmx + + decl out_r + movl len_r, %ecx + movb (out_r), %al + subl $3, %ecx + + movb %al, 1(out_r) + movb %al, 2(out_r) + movb %al, 3(out_r) + addl $4, out_r + rep stosb + + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +.align 16,0x90 +.L_test_for_second_level_length_mmx: + testb $64, %al + jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + addl len_r, %ecx + movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dolen_mmx + +.align 16,0x90 +.L_test_for_second_level_dist_mmx: + testb $64, %al + jnz .L_invalid_distance_code /* if ((op & 64) != 0) */ + + andl $15, %eax + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ecx + andl .L_mask(,%eax,4), %ecx + movl dcode(%esp), %eax /* ecx = dcode */ + addl dist_r, %ecx + movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */ + jmp .L_dodist_mmx + +.align 16,0x90 +.L_clip_window_mmx: +#define nbytes_r %ecx + movl %eax, nbytes_r + movl wsize(%esp), %eax /* prepare for dist compare */ + negl nbytes_r /* nbytes = -nbytes */ + movl window(%esp), from_r /* from = window */ + + cmpl dist_r, %eax + jb .L_invalid_distance_too_far /* if (dist > wsize) */ + + addl dist_r, nbytes_r /* nbytes = dist - nbytes */ + cmpl $0, write(%esp) + jne .L_wrap_around_window_mmx /* if (write != 0) */ + + subl nbytes_r, %eax + addl %eax, from_r /* from += wsize - nbytes */ + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_wrap_around_window_mmx: +#define write_r %eax + movl write(%esp), write_r + cmpl write_r, nbytes_r + jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */ + + addl wsize(%esp), from_r + addl write_r, from_r + subl nbytes_r, from_r /* from += wsize + write - nbytes */ + subl write_r, nbytes_r /* nbytes -= write */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl window(%esp), from_r /* from = window */ + movl write(%esp), nbytes_r /* nbytes = write */ + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + jmp .L_do_copy1_mmx + +.L_contiguous_in_window_mmx: +#define write_r %eax + addl write_r, from_r + subl nbytes_r, from_r /* from += write - nbytes */ +#undef write_r + + cmpl nbytes_r, len_r + jbe .L_do_copy1_mmx /* if (nbytes >= len) */ + + subl nbytes_r, len_r /* len -= nbytes */ + rep movsb + movl out_r, from_r + subl dist_r, from_r /* from = out - dist */ + +.L_do_copy1_mmx: +#undef nbytes_r +#define in_r %esi + movl len_r, %ecx + rep movsb + + movl in(%esp), in_r /* move in back to %esi, toss from */ + movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */ + jmp .L_while_test_mmx + +#undef hold_r +#undef bitslong_r + +#endif /* USE_MMX || RUN_TIME_MMX */ + + +/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/ + +.L_invalid_distance_code: + /* else { + * strm->msg = "invalid distance code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_distance_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_test_for_end_of_block: + /* else if (op & 32) { + * state->mode = TYPE; + * break; + * } + */ + testb $32, %al + jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */ + + movl $0, %ecx + movl $INFLATE_MODE_TYPE, %edx + jmp .L_update_stream_state + +.L_invalid_literal_length_code: + /* else { + * strm->msg = "invalid literal/length code"; + * state->mode = BAD; + * } + */ + movl $.L_invalid_literal_length_code_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_invalid_distance_too_far: + /* strm->msg = "invalid distance too far back"; + * state->mode = BAD; + */ + movl in(%esp), in_r /* from_r has in's reg, put in back */ + movl $.L_invalid_distance_too_far_msg, %ecx + movl $INFLATE_MODE_BAD, %edx + jmp .L_update_stream_state + +.L_update_stream_state: + /* set strm->msg = %ecx, strm->state->mode = %edx */ + movl strm_sp(%esp), %eax + testl %ecx, %ecx /* if (msg != NULL) */ + jz .L_skip_msg + movl %ecx, msg_strm(%eax) /* strm->msg = msg */ +.L_skip_msg: + movl state_strm(%eax), %eax /* state = strm->state */ + movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */ + jmp .L_break_loop + +.align 32,0x90 +.L_break_loop: + +/* + * Regs: + * + * bits = %ebp when mmx, and in %ebx when non-mmx + * hold = %hold_mm when mmx, and in %ebp when non-mmx + * in = %esi + * out = %edi + */ + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_next_in + +#endif /* RUN_TIME_MMX */ + + movl %ebp, %ebx + +.L_update_next_in: + +#endif + +#define strm_r %eax +#define state_r %edx + + /* len = bits >> 3; + * in -= len; + * bits -= len << 3; + * hold &= (1U << bits) - 1; + * state->hold = hold; + * state->bits = bits; + * strm->next_in = in; + * strm->next_out = out; + */ + movl strm_sp(%esp), strm_r + movl %ebx, %ecx + movl state_strm(strm_r), state_r + shrl $3, %ecx + subl %ecx, in_r + shll $3, %ecx + subl %ecx, %ebx + movl out_r, next_out_strm(strm_r) + movl %ebx, bits_state(state_r) + movl %ebx, %ecx + + leal buf(%esp), %ebx + cmpl %ebx, last(%esp) + jne .L_buf_not_used /* if buf != last */ + + subl %ebx, in_r /* in -= buf */ + movl next_in_strm(strm_r), %ebx + movl %ebx, last(%esp) /* last = strm->next_in */ + addl %ebx, in_r /* in += strm->next_in */ + movl avail_in_strm(strm_r), %ebx + subl $11, %ebx + addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */ + +.L_buf_not_used: + movl in_r, next_in_strm(strm_r) + + movl $1, %ebx + shll %cl, %ebx + decl %ebx + +#if defined( USE_MMX ) || defined( RUN_TIME_MMX ) + +#if defined( RUN_TIME_MMX ) + + cmpl $DO_USE_MMX, inflate_fast_use_mmx + jne .L_update_hold + +#endif /* RUN_TIME_MMX */ + + psrlq used_mm, hold_mm /* hold_mm >>= last bit length */ + movd hold_mm, %ebp + + emms + +.L_update_hold: + +#endif /* USE_MMX || RUN_TIME_MMX */ + + andl %ebx, %ebp + movl %ebp, hold_state(state_r) + +#define last_r %ebx + + /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */ + movl last(%esp), last_r + cmpl in_r, last_r + jbe .L_last_is_smaller /* if (in >= last) */ + + subl in_r, last_r /* last -= in */ + addl $11, last_r /* last += 11 */ + movl last_r, avail_in_strm(strm_r) + jmp .L_fixup_out +.L_last_is_smaller: + subl last_r, in_r /* in -= last */ + negl in_r /* in = -in */ + addl $11, in_r /* in += 11 */ + movl in_r, avail_in_strm(strm_r) + +#undef last_r +#define end_r %ebx + +.L_fixup_out: + /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/ + movl end(%esp), end_r + cmpl out_r, end_r + jbe .L_end_is_smaller /* if (out >= end) */ + + subl out_r, end_r /* end -= out */ + addl $257, end_r /* end += 257 */ + movl end_r, avail_out_strm(strm_r) + jmp .L_done +.L_end_is_smaller: + subl end_r, out_r /* out -= end */ + negl out_r /* out = -out */ + addl $257, out_r /* out += 257 */ + movl out_r, avail_out_strm(strm_r) + +#undef end_r +#undef strm_r +#undef state_r + +.L_done: + addl $local_var_size, %esp + popf + popl %ebx + popl %ebp + popl %esi + popl %edi + ret + +#if defined( GAS_ELF ) +/* elf info */ +.type inflate_fast,@function +.size inflate_fast,.-inflate_fast +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/test.cpp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/test.cpp new file mode 100644 index 0000000000..7d265b3b5c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/test.cpp @@ -0,0 +1,24 @@ + +#include "zfstream.h" + +int main() { + + // Construct a stream object with this filebuffer. Anything sent + // to this stream will go to standard out. + gzofstream os( 1, ios::out ); + + // This text is getting compressed and sent to stdout. + // To prove this, run 'test | zcat'. + os << "Hello, Mommy" << endl; + + os << setcompressionlevel( Z_NO_COMPRESSION ); + os << "hello, hello, hi, ho!" << endl; + + setcompressionlevel( os, Z_DEFAULT_COMPRESSION ) + << "I'm compressing again" << endl; + + os.close(); + + return 0; + +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/zfstream.cpp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/zfstream.cpp new file mode 100644 index 0000000000..d0cd85faaf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/zfstream.cpp @@ -0,0 +1,329 @@ + +#include "zfstream.h" + +gzfilebuf::gzfilebuf() : + file(NULL), + mode(0), + own_file_descriptor(0) +{ } + +gzfilebuf::~gzfilebuf() { + + sync(); + if ( own_file_descriptor ) + close(); + +} + +gzfilebuf *gzfilebuf::open( const char *name, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzopen(name, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 1; + + return this; + +} + +gzfilebuf *gzfilebuf::attach( int file_descriptor, + int io_mode ) { + + if ( is_open() ) + return NULL; + + char char_mode[10]; + char *p = char_mode; + + if ( io_mode & ios::in ) { + mode = ios::in; + *p++ = 'r'; + } else if ( io_mode & ios::app ) { + mode = ios::app; + *p++ = 'a'; + } else { + mode = ios::out; + *p++ = 'w'; + } + + if ( io_mode & ios::binary ) { + mode |= ios::binary; + *p++ = 'b'; + } + + // Hard code the compression level + if ( io_mode & (ios::out|ios::app )) { + *p++ = '9'; + } + + // Put the end-of-string indicator + *p = '\0'; + + if ( (file = gzdopen(file_descriptor, char_mode)) == NULL ) + return NULL; + + own_file_descriptor = 0; + + return this; + +} + +gzfilebuf *gzfilebuf::close() { + + if ( is_open() ) { + + sync(); + gzclose( file ); + file = NULL; + + } + + return this; + +} + +int gzfilebuf::setcompressionlevel( int comp_level ) { + + return gzsetparams(file, comp_level, -2); + +} + +int gzfilebuf::setcompressionstrategy( int comp_strategy ) { + + return gzsetparams(file, -2, comp_strategy); + +} + + +streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) { + + return streampos(EOF); + +} + +int gzfilebuf::underflow() { + + // If the file hasn't been opened for reading, error. + if ( !is_open() || !(mode & ios::in) ) + return EOF; + + // if a buffer doesn't exists, allocate one. + if ( !base() ) { + + if ( (allocate()) == EOF ) + return EOF; + setp(0,0); + + } else { + + if ( in_avail() ) + return (unsigned char) *gptr(); + + if ( out_waiting() ) { + if ( flushbuf() == EOF ) + return EOF; + } + + } + + // Attempt to fill the buffer. + + int result = fillbuf(); + if ( result == EOF ) { + // disable get area + setg(0,0,0); + return EOF; + } + + return (unsigned char) *gptr(); + +} + +int gzfilebuf::overflow( int c ) { + + if ( !is_open() || !(mode & ios::out) ) + return EOF; + + if ( !base() ) { + if ( allocate() == EOF ) + return EOF; + setg(0,0,0); + } else { + if (in_avail()) { + return EOF; + } + if (out_waiting()) { + if (flushbuf() == EOF) + return EOF; + } + } + + int bl = blen(); + setp( base(), base() + bl); + + if ( c != EOF ) { + + *pptr() = c; + pbump(1); + + } + + return 0; + +} + +int gzfilebuf::sync() { + + if ( !is_open() ) + return EOF; + + if ( out_waiting() ) + return flushbuf(); + + return 0; + +} + +int gzfilebuf::flushbuf() { + + int n; + char *q; + + q = pbase(); + n = pptr() - q; + + if ( gzwrite( file, q, n) < n ) + return EOF; + + setp(0,0); + + return 0; + +} + +int gzfilebuf::fillbuf() { + + int required; + char *p; + + p = base(); + + required = blen(); + + int t = gzread( file, p, required ); + + if ( t <= 0) return EOF; + + setg( base(), base(), base()+t); + + return t; + +} + +gzfilestream_common::gzfilestream_common() : + ios( gzfilestream_common::rdbuf() ) +{ } + +gzfilestream_common::~gzfilestream_common() +{ } + +void gzfilestream_common::attach( int fd, int io_mode ) { + + if ( !buffer.attach( fd, io_mode) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::open( const char *name, int io_mode ) { + + if ( !buffer.open( name, io_mode ) ) + clear( ios::failbit | ios::badbit ); + else + clear(); + +} + +void gzfilestream_common::close() { + + if ( !buffer.close() ) + clear( ios::failbit | ios::badbit ); + +} + +gzfilebuf *gzfilestream_common::rdbuf() +{ + return &buffer; +} + +gzifstream::gzifstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzifstream::gzifstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzifstream::gzifstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzifstream::~gzifstream() { } + +gzofstream::gzofstream() : + ios( gzfilestream_common::rdbuf() ) +{ + clear( ios::badbit ); +} + +gzofstream::gzofstream( const char *name, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::open( name, io_mode ); +} + +gzofstream::gzofstream( int fd, int io_mode ) : + ios( gzfilestream_common::rdbuf() ) +{ + gzfilestream_common::attach( fd, io_mode ); +} + +gzofstream::~gzofstream() { } diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/zfstream.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/zfstream.h new file mode 100644 index 0000000000..ed79098a3a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream/zfstream.h @@ -0,0 +1,128 @@ + +#ifndef zfstream_h +#define zfstream_h + +#include +#include "zlib.h" + +class gzfilebuf : public streambuf { + +public: + + gzfilebuf( ); + virtual ~gzfilebuf(); + + gzfilebuf *open( const char *name, int io_mode ); + gzfilebuf *attach( int file_descriptor, int io_mode ); + gzfilebuf *close(); + + int setcompressionlevel( int comp_level ); + int setcompressionstrategy( int comp_strategy ); + + inline int is_open() const { return (file !=NULL); } + + virtual streampos seekoff( streamoff, ios::seek_dir, int ); + + virtual int sync(); + +protected: + + virtual int underflow(); + virtual int overflow( int = EOF ); + +private: + + gzFile file; + short mode; + short own_file_descriptor; + + int flushbuf(); + int fillbuf(); + +}; + +class gzfilestream_common : virtual public ios { + + friend class gzifstream; + friend class gzofstream; + friend gzofstream &setcompressionlevel( gzofstream &, int ); + friend gzofstream &setcompressionstrategy( gzofstream &, int ); + +public: + virtual ~gzfilestream_common(); + + void attach( int fd, int io_mode ); + void open( const char *name, int io_mode ); + void close(); + +protected: + gzfilestream_common(); + +private: + gzfilebuf *rdbuf(); + + gzfilebuf buffer; + +}; + +class gzifstream : public gzfilestream_common, public istream { + +public: + + gzifstream(); + gzifstream( const char *name, int io_mode = ios::in ); + gzifstream( int fd, int io_mode = ios::in ); + + virtual ~gzifstream(); + +}; + +class gzofstream : public gzfilestream_common, public ostream { + +public: + + gzofstream(); + gzofstream( const char *name, int io_mode = ios::out ); + gzofstream( int fd, int io_mode = ios::out ); + + virtual ~gzofstream(); + +}; + +template class gzomanip { + friend gzofstream &operator<<(gzofstream &, const gzomanip &); +public: + gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { } +private: + gzofstream &(*func)(gzofstream &, T); + T val; +}; + +template gzofstream &operator<<(gzofstream &s, const gzomanip &m) +{ + return (*m.func)(s, m.val); +} + +inline gzofstream &setcompressionlevel( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionlevel(l); + return s; +} + +inline gzofstream &setcompressionstrategy( gzofstream &s, int l ) +{ + (s.rdbuf())->setcompressionstrategy(l); + return s; +} + +inline gzomanip setcompressionlevel(int l) +{ + return gzomanip(&setcompressionlevel,l); +} + +inline gzomanip setcompressionstrategy(int l) +{ + return gzomanip(&setcompressionstrategy,l); +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream2/zstream.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream2/zstream.h new file mode 100644 index 0000000000..43d2332b79 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream2/zstream.h @@ -0,0 +1,307 @@ +/* + * + * Copyright (c) 1997 + * Christian Michelsen Research AS + * Advanced Computing + * Fantoftvegen 38, 5036 BERGEN, Norway + * http://www.cmr.no + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. Christian Michelsen Research AS makes no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied warranty. + * + */ + +#ifndef ZSTREAM__H +#define ZSTREAM__H + +/* + * zstream.h - C++ interface to the 'zlib' general purpose compression library + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(_WIN32) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +class zstringlen { +public: + zstringlen(class izstream&); + zstringlen(class ozstream&, const char*); + size_t value() const { return val.word; } +private: + struct Val { unsigned char byte; size_t word; } val; +}; + +// ----------------------------- izstream ----------------------------- + +class izstream +{ + public: + izstream() : m_fp(0) {} + izstream(FILE* fp) : m_fp(0) { open(fp); } + izstream(const char* name) : m_fp(0) { open(name); } + ~izstream() { close(); } + + /* Opens a gzip (.gz) file for reading. + * open() can be used to read a file which is not in gzip format; + * in this case read() will directly read from the file without + * decompression. errno can be checked to distinguish two error + * cases (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name) { + if (m_fp) close(); + m_fp = ::gzopen(name, "rb"); + } + + void open(FILE* fp) { + SET_BINARY_MODE(fp); + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), "rb"); + } + + /* Flushes all pending input if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + int r = ::gzclose(m_fp); + m_fp = 0; return r; + } + + /* Binary read the given number of bytes from the compressed file. + */ + int read(void* buf, size_t len) { + return ::gzread(m_fp, buf, len); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + private: + gzFile m_fp; +}; + +/* + * Binary read the given (array of) object(s) from the compressed file. + * If the input file was not in gzip format, read() copies the objects number + * of bytes into the buffer. + * returns the number of uncompressed bytes actually read + * (0 for end of file, -1 for error). + */ +template +inline int read(izstream& zs, T* x, Items items) { + return ::gzread(zs.fp(), x, items*sizeof(T)); +} + +/* + * Binary input with the '>' operator. + */ +template +inline izstream& operator>(izstream& zs, T& x) { + ::gzread(zs.fp(), &x, sizeof(T)); + return zs; +} + + +inline zstringlen::zstringlen(izstream& zs) { + zs > val.byte; + if (val.byte == 255) zs > val.word; + else val.word = val.byte; +} + +/* + * Read length of string + the string with the '>' operator. + */ +inline izstream& operator>(izstream& zs, char* x) { + zstringlen len(zs); + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return zs; +} + +inline char* read_string(izstream& zs) { + zstringlen len(zs); + char* x = new char[len.value()+1]; + ::gzread(zs.fp(), x, len.value()); + x[len.value()] = '\0'; + return x; +} + +// ----------------------------- ozstream ----------------------------- + +class ozstream +{ + public: + ozstream() : m_fp(0), m_os(0) { + } + ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(fp, level); + } + ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION) + : m_fp(0), m_os(0) { + open(name, level); + } + ~ozstream() { + close(); + } + + /* Opens a gzip (.gz) file for writing. + * The compression level parameter should be in 0..9 + * errno can be checked to distinguish two error cases + * (if errno is zero, the zlib error is Z_MEM_ERROR). + */ + void open(const char* name, int level = Z_DEFAULT_COMPRESSION) { + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzopen(name, mode); + } + + /* open from a FILE pointer. + */ + void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) { + SET_BINARY_MODE(fp); + char mode[4] = "wb\0"; + if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level; + if (m_fp) close(); + m_fp = ::gzdopen(fileno(fp), mode); + } + + /* Flushes all pending output if necessary, closes the compressed file + * and deallocates all the (de)compression state. The return value is + * the zlib error number (see function error() below). + */ + int close() { + if (m_os) { + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = 0; + } + int r = ::gzclose(m_fp); m_fp = 0; return r; + } + + /* Binary write the given number of bytes into the compressed file. + */ + int write(const void* buf, size_t len) { + return ::gzwrite(m_fp, (voidp) buf, len); + } + + /* Flushes all pending output into the compressed file. The parameter + * _flush is as in the deflate() function. The return value is the zlib + * error number (see function gzerror below). flush() returns Z_OK if + * the flush_ parameter is Z_FINISH and all output could be flushed. + * flush() should be called only when strictly necessary because it can + * degrade compression. + */ + int flush(int _flush) { + os_flush(); + return ::gzflush(m_fp, _flush); + } + + /* Returns the error message for the last error which occurred on the + * given compressed file. errnum is set to zlib error number. If an + * error occurred in the file system and not in the compression library, + * errnum is set to Z_ERRNO and the application may consult errno + * to get the exact error code. + */ + const char* error(int* errnum) { + return ::gzerror(m_fp, errnum); + } + + gzFile fp() { return m_fp; } + + ostream& os() { + if (m_os == 0) m_os = new ostrstream; + return *m_os; + } + + void os_flush() { + if (m_os && m_os->pcount()>0) { + ostrstream* oss = new ostrstream; + oss->fill(m_os->fill()); + oss->flags(m_os->flags()); + oss->precision(m_os->precision()); + oss->width(m_os->width()); + ::gzwrite(m_fp, m_os->str(), m_os->pcount()); + delete[] m_os->str(); delete m_os; m_os = oss; + } + } + + private: + gzFile m_fp; + ostrstream* m_os; +}; + +/* + * Binary write the given (array of) object(s) into the compressed file. + * returns the number of uncompressed bytes actually written + * (0 in case of error). + */ +template +inline int write(ozstream& zs, const T* x, Items items) { + return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T)); +} + +/* + * Binary output with the '<' operator. + */ +template +inline ozstream& operator<(ozstream& zs, const T& x) { + ::gzwrite(zs.fp(), (voidp) &x, sizeof(T)); + return zs; +} + +inline zstringlen::zstringlen(ozstream& zs, const char* x) { + val.byte = 255; val.word = ::strlen(x); + if (val.word < 255) zs < (val.byte = val.word); + else zs < val; +} + +/* + * Write length of string + the string with the '<' operator. + */ +inline ozstream& operator<(ozstream& zs, const char* x) { + zstringlen len(zs, x); + ::gzwrite(zs.fp(), (voidp) x, len.value()); + return zs; +} + +#ifdef _MSC_VER +inline ozstream& operator<(ozstream& zs, char* const& x) { + return zs < (const char*) x; +} +#endif + +/* + * Ascii write with the << operator; + */ +template +inline ostream& operator<<(ozstream& zs, const T& x) { + zs.os_flush(); + return zs.os() << x; +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream2/zstream_test.cpp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream2/zstream_test.cpp new file mode 100644 index 0000000000..6273f62d62 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream2/zstream_test.cpp @@ -0,0 +1,25 @@ +#include "zstream.h" +#include +#include +#include + +void main() { + char h[256] = "Hello"; + char* g = "Goodbye"; + ozstream out("temp.gz"); + out < "This works well" < h < g; + out.close(); + + izstream in("temp.gz"); // read it back + char *x = read_string(in), *y = new char[256], z[256]; + in > y > z; + in.close(); + cout << x << endl << y << endl << z << endl; + + out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results + out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl; + out << z << endl << y << endl << x << endl; + out << 1.1234567890123456789 << endl; + + delete[] x; delete[] y; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/README b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/README new file mode 100644 index 0000000000..f7b319ab91 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/README @@ -0,0 +1,35 @@ +These classes provide a C++ stream interface to the zlib library. It allows you +to do things like: + + gzofstream outf("blah.gz"); + outf << "These go into the gzip file " << 123 << endl; + +It does this by deriving a specialized stream buffer for gzipped files, which is +the way Stroustrup would have done it. :-> + +The gzifstream and gzofstream classes were originally written by Kevin Ruland +and made available in the zlib contrib/iostream directory. The older version still +compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of +this version. + +The new classes are as standard-compliant as possible, closely following the +approach of the standard library's fstream classes. It compiles under gcc versions +3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard +library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs +from the previous one in the following respects: +- added showmanyc +- added setbuf, with support for unbuffered output via setbuf(0,0) +- a few bug fixes of stream behavior +- gzipped output file opened with default compression level instead of maximum level +- setcompressionlevel()/strategy() members replaced by single setcompression() + +The code is provided "as is", with the permission to use, copy, modify, distribute +and sell it for any purpose without fee. + +Ludwig Schwardt + + +DSP Lab +Electrical & Electronic Engineering Department +University of Stellenbosch +South Africa diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/TODO b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/TODO new file mode 100644 index 0000000000..7032f97be0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/TODO @@ -0,0 +1,17 @@ +Possible upgrades to gzfilebuf: + +- The ability to do putback (e.g. putbackfail) + +- The ability to seek (zlib supports this, but could be slow/tricky) + +- Simultaneous read/write access (does it make sense?) + +- Support for ios_base::ate open mode + +- Locale support? + +- Check public interface to see which calls give problems + (due to dependence on library internals) + +- Override operator<<(ostream&, gzfilebuf*) to allow direct copying + of stream buffer to stream ( i.e. os << is.rdbuf(); ) diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/test.cc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/test.cc new file mode 100644 index 0000000000..94235334f2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/test.cc @@ -0,0 +1,50 @@ +/* + * Test program for gzifstream and gzofstream + * + * by Ludwig Schwardt + * original version by Kevin Ruland + */ + +#include "zfstream.h" +#include // for cout + +int main() { + + gzofstream outf; + gzifstream inf; + char buf[80]; + + outf.open("test1.txt.gz"); + outf << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n" + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + + std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n"; + inf.open("test1.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + outf.rdbuf()->pubsetbuf(0,0); + outf.open("test2.txt.gz"); + outf << setcompression(Z_NO_COMPRESSION) + << "The quick brown fox sidestepped the lazy canine\n" + << 1.3 << "\nPlan " << 9 << std::endl; + outf.close(); + std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form"; + + std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n"; + inf.rdbuf()->pubsetbuf(0,0); + inf.open("test2.txt.gz"); + while (inf.getline(buf,80,'\n')) { + std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n"; + } + inf.close(); + + return 0; + +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/zfstream.cc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/zfstream.cc new file mode 100644 index 0000000000..94eb933444 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/zfstream.cc @@ -0,0 +1,479 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#include "zfstream.h" +#include // for strcpy, strcat, strlen (mode strings) +#include // for BUFSIZ + +// Internal buffer sizes (default and "unbuffered" versions) +#define BIGBUFSIZE BUFSIZ +#define SMALLBUFSIZE 1 + +/*****************************************************************************/ + +// Default constructor +gzfilebuf::gzfilebuf() +: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false), + buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true) +{ + // No buffers to start with + this->disable_buffer(); +} + +// Destructor +gzfilebuf::~gzfilebuf() +{ + // Sync output buffer and close only if responsible for file + // (i.e. attached streams should be left open at this stage) + this->sync(); + if (own_fd) + this->close(); + // Make sure internal buffer is deallocated + this->disable_buffer(); +} + +// Set compression level and strategy +int +gzfilebuf::setcompression(int comp_level, + int comp_strategy) +{ + return gzsetparams(file, comp_level, comp_strategy); +} + +// Open gzipped file +gzfilebuf* +gzfilebuf::open(const char *name, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to open file + if ((file = gzopen(name, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = true; + return this; +} + +// Attach to gzipped file +gzfilebuf* +gzfilebuf::attach(int fd, + std::ios_base::openmode mode) +{ + // Fail if file already open + if (this->is_open()) + return NULL; + // Don't support simultaneous read/write access (yet) + if ((mode & std::ios_base::in) && (mode & std::ios_base::out)) + return NULL; + + // Build mode string for gzdopen and check it [27.8.1.3.2] + char char_mode[6] = "\0\0\0\0\0"; + if (!this->open_mode(mode, char_mode)) + return NULL; + + // Attempt to attach to file + if ((file = gzdopen(fd, char_mode)) == NULL) + return NULL; + + // On success, allocate internal buffer and set flags + this->enable_buffer(); + io_mode = mode; + own_fd = false; + return this; +} + +// Close gzipped file +gzfilebuf* +gzfilebuf::close() +{ + // Fail immediately if no file is open + if (!this->is_open()) + return NULL; + // Assume success + gzfilebuf* retval = this; + // Attempt to sync and close gzipped file + if (this->sync() == -1) + retval = NULL; + if (gzclose(file) < 0) + retval = NULL; + // File is now gone anyway (postcondition [27.8.1.3.8]) + file = NULL; + own_fd = false; + // Destroy internal buffer if it exists + this->disable_buffer(); + return retval; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Convert int open mode to mode string +bool +gzfilebuf::open_mode(std::ios_base::openmode mode, + char* c_mode) const +{ + bool testb = mode & std::ios_base::binary; + bool testi = mode & std::ios_base::in; + bool testo = mode & std::ios_base::out; + bool testt = mode & std::ios_base::trunc; + bool testa = mode & std::ios_base::app; + + // Check for valid flag combinations - see [27.8.1.3.2] (Table 92) + // Original zfstream hardcoded the compression level to maximum here... + // Double the time for less than 1% size improvement seems + // excessive though - keeping it at the default level + // To change back, just append "9" to the next three mode strings + if (!testi && testo && !testt && !testa) + strcpy(c_mode, "w"); + if (!testi && testo && !testt && testa) + strcpy(c_mode, "a"); + if (!testi && testo && testt && !testa) + strcpy(c_mode, "w"); + if (testi && !testo && !testt && !testa) + strcpy(c_mode, "r"); + // No read/write mode yet +// if (testi && testo && !testt && !testa) +// strcpy(c_mode, "r+"); +// if (testi && testo && testt && !testa) +// strcpy(c_mode, "w+"); + + // Mode string should be empty for invalid combination of flags + if (strlen(c_mode) == 0) + return false; + if (testb) + strcat(c_mode, "b"); + return true; +} + +// Determine number of characters in internal get buffer +std::streamsize +gzfilebuf::showmanyc() +{ + // Calls to underflow will fail if file not opened for reading + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return -1; + // Make sure get area is in use + if (this->gptr() && (this->gptr() < this->egptr())) + return std::streamsize(this->egptr() - this->gptr()); + else + return 0; +} + +// Fill get area from gzipped file +gzfilebuf::int_type +gzfilebuf::underflow() +{ + // If something is left in the get area by chance, return it + // (this shouldn't normally happen, as underflow is only supposed + // to be called when gptr >= egptr, but it serves as error check) + if (this->gptr() && (this->gptr() < this->egptr())) + return traits_type::to_int_type(*(this->gptr())); + + // If the file hasn't been opened for reading, produce error + if (!this->is_open() || !(io_mode & std::ios_base::in)) + return traits_type::eof(); + + // Attempt to fill internal buffer from gzipped file + // (buffer must be guaranteed to exist...) + int bytes_read = gzread(file, buffer, buffer_size); + // Indicates error or EOF + if (bytes_read <= 0) + { + // Reset get area + this->setg(buffer, buffer, buffer); + return traits_type::eof(); + } + // Make all bytes read from file available as get area + this->setg(buffer, buffer, buffer + bytes_read); + + // Return next character in get area + return traits_type::to_int_type(*(this->gptr())); +} + +// Write put area to gzipped file +gzfilebuf::int_type +gzfilebuf::overflow(int_type c) +{ + // Determine whether put area is in use + if (this->pbase()) + { + // Double-check pointer range + if (this->pptr() > this->epptr() || this->pptr() < this->pbase()) + return traits_type::eof(); + // Add extra character to buffer if not EOF + if (!traits_type::eq_int_type(c, traits_type::eof())) + { + *(this->pptr()) = traits_type::to_char_type(c); + this->pbump(1); + } + // Number of characters to write to file + int bytes_to_write = this->pptr() - this->pbase(); + // Overflow doesn't fail if nothing is to be written + if (bytes_to_write > 0) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // If gzipped file won't accept all bytes written to it, fail + if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write) + return traits_type::eof(); + // Reset next pointer to point to pbase on success + this->pbump(-bytes_to_write); + } + } + // Write extra character to file if not EOF + else if (!traits_type::eq_int_type(c, traits_type::eof())) + { + // If the file hasn't been opened for writing, produce error + if (!this->is_open() || !(io_mode & std::ios_base::out)) + return traits_type::eof(); + // Impromptu char buffer (allows "unbuffered" output) + char_type last_char = traits_type::to_char_type(c); + // If gzipped file won't accept this character, fail + if (gzwrite(file, &last_char, 1) != 1) + return traits_type::eof(); + } + + // If you got here, you have succeeded (even if c was EOF) + // The return value should therefore be non-EOF + if (traits_type::eq_int_type(c, traits_type::eof())) + return traits_type::not_eof(c); + else + return c; +} + +// Assign new buffer +std::streambuf* +gzfilebuf::setbuf(char_type* p, + std::streamsize n) +{ + // First make sure stuff is sync'ed, for safety + if (this->sync() == -1) + return NULL; + // If buffering is turned off on purpose via setbuf(0,0), still allocate one... + // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at + // least a buffer of size 1 (very inefficient though, therefore make it bigger?) + // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems) + if (!p || !n) + { + // Replace existing buffer (if any) with small internal buffer + this->disable_buffer(); + buffer = NULL; + buffer_size = 0; + own_buffer = true; + this->enable_buffer(); + } + else + { + // Replace existing buffer (if any) with external buffer + this->disable_buffer(); + buffer = p; + buffer_size = n; + own_buffer = false; + this->enable_buffer(); + } + return this; +} + +// Write put area to gzipped file (i.e. ensures that put area is empty) +int +gzfilebuf::sync() +{ + return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Allocate internal buffer +void +gzfilebuf::enable_buffer() +{ + // If internal buffer required, allocate one + if (own_buffer && !buffer) + { + // Check for buffered vs. "unbuffered" + if (buffer_size > 0) + { + // Allocate internal buffer + buffer = new char_type[buffer_size]; + // Get area starts empty and will be expanded by underflow as need arises + this->setg(buffer, buffer, buffer); + // Setup entire internal buffer as put area. + // The one-past-end pointer actually points to the last element of the buffer, + // so that overflow(c) can safely add the extra character c to the sequence. + // These pointers remain in place for the duration of the buffer + this->setp(buffer, buffer + buffer_size - 1); + } + else + { + // Even in "unbuffered" case, (small?) get buffer is still required + buffer_size = SMALLBUFSIZE; + buffer = new char_type[buffer_size]; + this->setg(buffer, buffer, buffer); + // "Unbuffered" means no put buffer + this->setp(0, 0); + } + } + else + { + // If buffer already allocated, reset buffer pointers just to make sure no + // stale chars are lying around + this->setg(buffer, buffer, buffer); + this->setp(buffer, buffer + buffer_size - 1); + } +} + +// Destroy internal buffer +void +gzfilebuf::disable_buffer() +{ + // If internal buffer exists, deallocate it + if (own_buffer && buffer) + { + // Preserve unbuffered status by zeroing size + if (!this->pbase()) + buffer_size = 0; + delete[] buffer; + buffer = NULL; + this->setg(0, 0, 0); + this->setp(0, 0); + } + else + { + // Reset buffer pointers to initial state if external buffer exists + this->setg(buffer, buffer, buffer); + if (buffer) + this->setp(buffer, buffer + buffer_size - 1); + else + this->setp(0, 0); + } +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzifstream::gzifstream() +: std::istream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzifstream::gzifstream(const char* name, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzifstream::gzifstream(int fd, + std::ios_base::openmode mode) +: std::istream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzifstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzifstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::in)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzifstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} + +/*****************************************************************************/ + +// Default constructor initializes stream buffer +gzofstream::gzofstream() +: std::ostream(NULL), sb() +{ this->init(&sb); } + +// Initialize stream buffer and open file +gzofstream::gzofstream(const char* name, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->open(name, mode); +} + +// Initialize stream buffer and attach to file +gzofstream::gzofstream(int fd, + std::ios_base::openmode mode) +: std::ostream(NULL), sb() +{ + this->init(&sb); + this->attach(fd, mode); +} + +// Open file and go into fail() state if unsuccessful +void +gzofstream::open(const char* name, + std::ios_base::openmode mode) +{ + if (!sb.open(name, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Attach to file and go into fail() state if unsuccessful +void +gzofstream::attach(int fd, + std::ios_base::openmode mode) +{ + if (!sb.attach(fd, mode | std::ios_base::out)) + this->setstate(std::ios_base::failbit); + else + this->clear(); +} + +// Close file +void +gzofstream::close() +{ + if (!sb.close()) + this->setstate(std::ios_base::failbit); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/zfstream.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/zfstream.h new file mode 100644 index 0000000000..8574479ae1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/iostream3/zfstream.h @@ -0,0 +1,466 @@ +/* + * A C++ I/O streams interface to the zlib gz* functions + * + * by Ludwig Schwardt + * original version by Kevin Ruland + * + * This version is standard-compliant and compatible with gcc 3.x. + */ + +#ifndef ZFSTREAM_H +#define ZFSTREAM_H + +#include // not iostream, since we don't need cin/cout +#include +#include "zlib.h" + +/*****************************************************************************/ + +/** + * @brief Gzipped file stream buffer class. + * + * This class implements basic_filebuf for gzipped files. It doesn't yet support + * seeking (allowed by zlib but slow/limited), putback and read/write access + * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard + * file streambuf. +*/ +class gzfilebuf : public std::streambuf +{ +public: + // Default constructor. + gzfilebuf(); + + // Destructor. + virtual + ~gzfilebuf(); + + /** + * @brief Set compression level and strategy on the fly. + * @param comp_level Compression level (see zlib.h for allowed values) + * @param comp_strategy Compression strategy (see zlib.h for allowed values) + * @return Z_OK on success, Z_STREAM_ERROR otherwise. + * + * Unfortunately, these parameters cannot be modified separately, as the + * previous zfstream version assumed. Since the strategy is seldom changed, + * it can default and setcompression(level) then becomes like the old + * setcompressionlevel(level). + */ + int + setcompression(int comp_level, + int comp_strategy = Z_DEFAULT_STRATEGY); + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() const { return (file != NULL); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + open(const char* name, + std::ios_base::openmode mode); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + attach(int fd, + std::ios_base::openmode mode); + + /** + * @brief Close gzipped file. + * @return @c this on success, NULL on failure. + */ + gzfilebuf* + close(); + +protected: + /** + * @brief Convert ios open mode int to mode string used by zlib. + * @return True if valid mode flag combination. + */ + bool + open_mode(std::ios_base::openmode mode, + char* c_mode) const; + + /** + * @brief Number of characters available in stream buffer. + * @return Number of characters. + * + * This indicates number of characters in get area of stream buffer. + * These characters can be read without accessing the gzipped file. + */ + virtual std::streamsize + showmanyc(); + + /** + * @brief Fill get area from gzipped file. + * @return First character in get area on success, EOF on error. + * + * This actually reads characters from gzipped file to stream + * buffer. Always buffered. + */ + virtual int_type + underflow(); + + /** + * @brief Write put area to gzipped file. + * @param c Extra character to add to buffer contents. + * @return Non-EOF on success, EOF on error. + * + * This actually writes characters in stream buffer to + * gzipped file. With unbuffered output this is done one + * character at a time. + */ + virtual int_type + overflow(int_type c = traits_type::eof()); + + /** + * @brief Installs external stream buffer. + * @param p Pointer to char buffer. + * @param n Size of external buffer. + * @return @c this on success, NULL on failure. + * + * Call setbuf(0,0) to enable unbuffered output. + */ + virtual std::streambuf* + setbuf(char_type* p, + std::streamsize n); + + /** + * @brief Flush stream buffer to file. + * @return 0 on success, -1 on error. + * + * This calls underflow(EOF) to do the job. + */ + virtual int + sync(); + +// +// Some future enhancements +// +// virtual int_type uflow(); +// virtual int_type pbackfail(int_type c = traits_type::eof()); +// virtual pos_type +// seekoff(off_type off, +// std::ios_base::seekdir way, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); +// virtual pos_type +// seekpos(pos_type sp, +// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out); + +private: + /** + * @brief Allocate internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that a proper internal buffer exists if it is required. If the + * buffer already exists or is external, the buffer pointers will be + * reset to their original state. + */ + void + enable_buffer(); + + /** + * @brief Destroy internal buffer. + * + * This function is safe to call multiple times. It will ensure + * that the internal buffer is deallocated if it exists. In any + * case, it will also reset the buffer pointers. + */ + void + disable_buffer(); + + /** + * Underlying file pointer. + */ + gzFile file; + + /** + * Mode in which file was opened. + */ + std::ios_base::openmode io_mode; + + /** + * @brief True if this object owns file descriptor. + * + * This makes the class responsible for closing the file + * upon destruction. + */ + bool own_fd; + + /** + * @brief Stream buffer. + * + * For simplicity this remains allocated on the free store for the + * entire life span of the gzfilebuf object, unless replaced by setbuf. + */ + char_type* buffer; + + /** + * @brief Stream buffer size. + * + * Defaults to system default buffer size (typically 8192 bytes). + * Modified by setbuf. + */ + std::streamsize buffer_size; + + /** + * @brief True if this object owns stream buffer. + * + * This makes the class responsible for deleting the buffer + * upon destruction. + */ + bool own_buffer; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file input stream class. + * + * This class implements ifstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzifstream : public std::istream +{ +public: + // Default constructor + gzifstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + */ + explicit + gzifstream(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ifstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::in). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::in); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream class. + * + * This class implements ofstream for gzipped files. Seeking and putback + * is not supported yet. +*/ +class gzofstream : public std::ostream +{ +public: + // Default constructor + gzofstream(); + + /** + * @brief Construct stream on gzipped file to be opened. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Construct stream on already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + */ + explicit + gzofstream(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * Obtain underlying stream buffer. + */ + gzfilebuf* + rdbuf() const + { return const_cast(&sb); } + + /** + * @brief Check if file is open. + * @return True if file is open. + */ + bool + is_open() { return sb.is_open(); } + + /** + * @brief Open gzipped file. + * @param name File name. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if file opens successfully; + * otherwise in state fail(). This differs from the behavior of + * ofstream, which never sets the state to good() and therefore + * won't allow you to reuse the stream for a second file unless + * you manually clear() the state. The choice is a matter of + * convenience. + */ + void + open(const char* name, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Attach to already open gzipped file. + * @param fd File descriptor. + * @param mode Open mode flags (forced to contain ios::out). + * + * Stream will be in state good() if attach succeeded; otherwise + * in state fail(). + */ + void + attach(int fd, + std::ios_base::openmode mode = std::ios_base::out); + + /** + * @brief Close gzipped file. + * + * Stream will be in state fail() if close failed. + */ + void + close(); + +private: + /** + * Underlying stream buffer. + */ + gzfilebuf sb; +}; + +/*****************************************************************************/ + +/** + * @brief Gzipped file output stream manipulator class. + * + * This class defines a two-argument manipulator for gzofstream. It is used + * as base for the setcompression(int,int) manipulator. +*/ +template + class gzomanip2 + { + public: + // Allows insertor to peek at internals + template + friend gzofstream& + operator<<(gzofstream&, + const gzomanip2&); + + // Constructor + gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2), + T1 v1, + T2 v2); + private: + // Underlying manipulator function + gzofstream& + (*func)(gzofstream&, T1, T2); + + // Arguments for manipulator function + T1 val1; + T2 val2; + }; + +/*****************************************************************************/ + +// Manipulator function thunks through to stream buffer +inline gzofstream& +setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY) +{ + (gzs.rdbuf())->setcompression(l, s); + return gzs; +} + +// Manipulator constructor stores arguments +template + inline + gzomanip2::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2), + T1 v1, + T2 v2) + : func(f), val1(v1), val2(v2) + { } + +// Insertor applies underlying manipulator function to stream +template + inline gzofstream& + operator<<(gzofstream& s, const gzomanip2& m) + { return (*m.func)(s, m.val1, m.val2); } + +// Insert this onto stream to simplify setting of compression level +inline gzomanip2 +setcompression(int l, int s = Z_DEFAULT_STRATEGY) +{ return gzomanip2(&setcompression, l, s); } + +#endif // ZFSTREAM_H diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/bld_ml64.bat b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/bld_ml64.bat new file mode 100644 index 0000000000..f74bcef5b4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/bld_ml64.bat @@ -0,0 +1,2 @@ +ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +ml64.exe /Flgvmat64 /c /Zi gvmat64.asm diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/gvmat64.asm b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/gvmat64.asm new file mode 100644 index 0000000000..c1817f1be9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/gvmat64.asm @@ -0,0 +1,553 @@ +;uInt longest_match_x64( +; deflate_state *s, +; IPos cur_match); /* current match */ + +; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64 +; (AMD64 on Athlon 64, Opteron, Phenom +; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7) +; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; +; File written by Gilles Vollant, by converting to assembly the longest_match +; from Jean-loup Gailly in deflate.c of zLib and infoZip zip. +; +; and by taking inspiration on asm686 with masm, optimised assembly code +; from Brian Raiter, written 1998 +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Permission is granted to anyone to use this software for any purpose, +; including commercial applications, and to alter it and redistribute it +; freely, subject to the following restrictions: +; +; 1. The origin of this software must not be misrepresented; you must not +; claim that you wrote the original software. If you use this software +; in a product, an acknowledgment in the product documentation would be +; appreciated but is not required. +; 2. Altered source versions must be plainly marked as such, and must not be +; misrepresented as being the original software +; 3. This notice may not be removed or altered from any source distribution. +; +; +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; to compile this file for infozip Zip, I use option: +; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm +; +; to compile this file for zLib, I use option: +; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm +; Be carrefull to adapt zlib1222add below to your version of zLib +; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change +; value of zlib1222add later) +; +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ +.code +longest_match PROC + + +;LocalVarsSize equ 88 + LocalVarsSize equ 72 + +; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12 +; free register : r14,r15 +; register can be saved : rsp + + chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len + ; low word: s->wmask +;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10 +;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11 +;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w +;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx +;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13 +;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d +;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9 +IFDEF INFOZIP +ELSE + nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size +ENDIF + +save_rdi equ rsp + 24 - LocalVarsSize +save_rsi equ rsp + 32 - LocalVarsSize +save_rbx equ rsp + 40 - LocalVarsSize +save_rbp equ rsp + 48 - LocalVarsSize +save_r12 equ rsp + 56 - LocalVarsSize +save_r13 equ rsp + 64 - LocalVarsSize +;save_r14 equ rsp + 72 - LocalVarsSize +;save_r15 equ rsp + 80 - LocalVarsSize + + +; summary of register usage +; scanend ebx +; scanendw bx +; chainlenwmask edx +; curmatch rsi +; curmatchd esi +; windowbestlen r8 +; scanalign r9 +; scanalignd r9d +; window r10 +; bestlen r11 +; bestlend r11d +; scanstart r12d +; scanstartw r12w +; scan r13 +; nicematch r14d +; limit r15 +; limitd r15d +; prev rcx + +; all the +4 offsets are due to the addition of pending_buf_size (in zlib +; in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, remove the +4). +; Note : these value are good with a 8 bytes boundary pack structure + + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + +IFDEF INFOZIP + +_DATA SEGMENT +COMM window_size:DWORD +; WMask ; 7fff +COMM window:BYTE:010040H +COMM prev:WORD:08000H +; MatchLen : unused +; PrevMatch : unused +COMM strstart:DWORD +COMM match_start:DWORD +; Lookahead : ignore +COMM prev_length:DWORD ; PrevLen +COMM max_chain_length:DWORD +COMM good_match:DWORD +COMM nice_match:DWORD +prev_ad equ OFFSET prev +window_ad equ OFFSET window +nicematch equ nice_match +_DATA ENDS +WMask equ 07fffh + +ELSE + + IFNDEF zlib1222add + zlib1222add equ 8 + ENDIF +dsWSize equ 56+zlib1222add+(zlib1222add/2) +dsWMask equ 64+zlib1222add+(zlib1222add/2) +dsWindow equ 72+zlib1222add +dsPrev equ 88+zlib1222add +dsMatchLen equ 128+zlib1222add +dsPrevMatch equ 132+zlib1222add +dsStrStart equ 140+zlib1222add +dsMatchStart equ 144+zlib1222add +dsLookahead equ 148+zlib1222add +dsPrevLen equ 152+zlib1222add +dsMaxChainLen equ 156+zlib1222add +dsGoodMatch equ 172+zlib1222add +dsNiceMatch equ 176+zlib1222add + +window_size equ [ rcx + dsWSize] +WMask equ [ rcx + dsWMask] +window_ad equ [ rcx + dsWindow] +prev_ad equ [ rcx + dsPrev] +strstart equ [ rcx + dsStrStart] +match_start equ [ rcx + dsMatchStart] +Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip +prev_length equ [ rcx + dsPrevLen] +max_chain_length equ [ rcx + dsMaxChainLen] +good_match equ [ rcx + dsGoodMatch] +nice_match equ [ rcx + dsNiceMatch] +ENDIF + +; parameter 1 in r8(deflate state s), param 2 in rdx (cur match) + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch. + + + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + +;;; Retrieve the function arguments. r8d will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + +; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match) + +; this clear high 32 bits of r8, which can be garbage in both r8 and rdx + + mov [save_rdi],rdi + mov [save_rsi],rsi + mov [save_rbx],rbx + mov [save_rbp],rbp +IFDEF INFOZIP + mov r8d,ecx +ELSE + mov r8d,edx +ENDIF + mov [save_r12],r12 + mov [save_r13],r13 +; mov [save_r14],r14 +; mov [save_r15],r15 + + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov edi, prev_length + mov esi, good_match + mov eax, WMask + mov ebx, max_chain_length + cmp edi, esi + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + +;;; on zlib only +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + +IFDEF INFOZIP + mov [chainlenwmask], ebx +; on infozip nice_match = [nice_match] +ELSE + mov eax, nice_match + mov [chainlenwmask], ebx + mov r10d, Lookahead + cmp r10d, eax + cmovnl r10d, eax + mov [nicematch],r10d +ENDIF + +;;; register Bytef *scan = s->window + s->strstart; + mov r10, window_ad + mov ebp, strstart + lea r13, [r10 + rbp] + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov r9,r13 + neg r13 + and r13,3 + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; +IFDEF INFOZIP + mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1)) +ELSE + mov eax, window_size + sub eax, MIN_LOOKAHEAD +ENDIF + xor edi,edi + sub ebp, eax + + mov r11d, prev_length + + cmovng ebp,edi + +;;; int best_len = s->prev_length; + + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + lea rsi,[r10+r11] + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx r12d,word ptr [r9] + movzx ebx, word ptr [r9 + r11 - 1] + + mov rdi, prev_ad + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop1: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry1: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop2: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry2: + cmp bx,word ptr [rsi + r8 - 1] + jz LookupLoopIsZero + +LookupLoop4: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry4: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 + jmp LookupLoopIsZero + + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; r8d = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and r8d, edx + + movzx r8d, word ptr [rdi + r8*2] + cmp r8d, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow + +LoopEntry: + + cmp bx,word ptr [rsi + r8 - 1] + jnz LookupLoop1 +LookupLoopIsZero: + cmp r12w, word ptr [r10 + r8] + jnz LookupLoop1 + + +;;; Store the current value of chainlen. + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + lea rsi,[r8+r10] + mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8) + lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8] + lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8] + + prefetcht1 [rsi+rdx] + prefetcht1 [rdi+rdx] + + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust rdx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (rsi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + + +LoopCmps: + mov rax, [rsi + rdx] + xor rax, [rdi + rdx] + jnz LeaveLoopCmps + + mov rax, [rsi + rdx + 8] + xor rax, [rdi + rdx + 8] + jnz LeaveLoopCmps8 + + + mov rax, [rsi + rdx + 8+8] + xor rax, [rdi + rdx + 8+8] + jnz LeaveLoopCmps16 + + add rdx,8+8+8 + + jnz short LoopCmps + jmp short LenMaximum +LeaveLoopCmps16: add rdx,8 +LeaveLoopCmps8: add rdx,8 +LeaveLoopCmps: + + test eax, 0000FFFFh + jnz LenLower + + test eax,0ffffffffh + + jnz LenLower32 + + add rdx,4 + shr rax,32 + or ax,ax + jnz LenLower + +LenLower32: + shr eax,16 + add rdx,2 +LenLower: sub al, 1 + adc rdx, 0 +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea rax, [rdi + rdx] + sub rax, r9 + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. +;/////////////////////////////////// + + cmp eax, r11d + jg LongerMatch + + lea rsi,[r10+r11] + + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: + mov r11d, eax + mov match_start, r8d + cmp eax, [nicematch] + jge LeaveNow + + lea rsi,[r10+rax] + + movzx ebx, word ptr [r9 + rax - 1] + mov rdi, prev_ad + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: + mov r11d,MAX_MATCH + mov match_start, r8d + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: +IFDEF INFOZIP + mov eax,r11d +ELSE + mov eax, Lookahead + cmp r11d, eax + cmovng eax, r11d +ENDIF + +;;; Restore the stack and return from whence we came. + + + mov rsi,[save_rsi] + mov rdi,[save_rdi] + mov rbx,[save_rbx] + mov rbp,[save_rbp] + mov r12,[save_r12] + mov r13,[save_r13] +; mov r14,[save_r14] +; mov r15,[save_r15] + + + ret 0 +; please don't remove this string ! +; Your can freely use gvmat64 in any free or commercial app +; but it is far better don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0 +longest_match ENDP + +match_init PROC + ret 0 +match_init ENDP + + +END diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/inffas8664.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/inffas8664.c new file mode 100644 index 0000000000..aa861a3339 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/inffas8664.c @@ -0,0 +1,186 @@ +/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding + * version for AMD64 on Windows using Microsoft C compiler + * + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Copyright (C) 2003 Chris Anderson + * Please use the copyright conditions above. + * + * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant + * + * inffas8664.c call function inffas8664fnc in inffasx64.asm + * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c + * + * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also + * slightly quicker on x86 systems because, instead of using rep movsb to copy + * data, it uses rep movsw, which moves data in 2-byte chunks instead of single + * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates + * from http://fedora.linux.duke.edu/fc1_x86_64 + * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with + * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version, + * when decompressing mozilla-source-1.3.tar.gz. + * + * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from + * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at + * the moment. I have successfully compiled and tested this code with gcc2.96, + * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S + * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX + * enabled. I will attempt to merge the MMX code into this version. Newer + * versions of this and inffast.S can be found at + * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ + * + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* Mark Adler's comments from inffast.c: */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ + + + + typedef struct inffast_ar { +/* 64 32 x86 x86_64 */ +/* ar offset register */ +/* 0 0 */ void *esp; /* esp save */ +/* 8 4 */ void *ebp; /* ebp save */ +/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */ +/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */ +/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */ +/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */ +/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */ +/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */ +/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */ +/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */ +/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */ +/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */ +/* 92 48 */ unsigned wsize; /* window size */ +/* 96 52 */ unsigned write; /* window write index */ +/*100 56 */ unsigned lmask; /* r12 mask for lcode */ +/*104 60 */ unsigned dmask; /* r13 mask for dcode */ +/*108 64 */ unsigned len; /* r14 match length */ +/*112 68 */ unsigned dist; /* r15 match distance */ +/*116 72 */ unsigned status; /* set when state chng*/ + } type_ar; +#ifdef ASMINF + +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + type_ar ar; + void inffas8664fnc(struct inffast_ar * par); + + + +#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) +#define PAD_AVAIL_IN 6 +#define PAD_AVAIL_OUT 258 +#else +#define PAD_AVAIL_IN 5 +#define PAD_AVAIL_OUT 257 +#endif + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + + ar.in = strm->next_in; + ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN); + ar.out = strm->next_out; + ar.beg = ar.out - (start - strm->avail_out); + ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT); + ar.wsize = state->wsize; + ar.write = state->wnext; + ar.window = state->window; + ar.hold = state->hold; + ar.bits = state->bits; + ar.lcode = state->lencode; + ar.dcode = state->distcode; + ar.lmask = (1U << state->lenbits) - 1; + ar.dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + /* align in on 1/2 hold size boundary */ + while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) { + ar.hold += (unsigned long)*ar.in++ << ar.bits; + ar.bits += 8; + } + + inffas8664fnc(&ar); + + if (ar.status > 1) { + if (ar.status == 2) + strm->msg = "invalid literal/length code"; + else if (ar.status == 3) + strm->msg = "invalid distance code"; + else + strm->msg = "invalid distance too far back"; + state->mode = BAD; + } + else if ( ar.status == 1 ) { + state->mode = TYPE; + } + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + ar.len = ar.bits >> 3; + ar.in -= ar.len; + ar.bits -= ar.len << 3; + ar.hold &= (1U << ar.bits) - 1; + + /* update state and return */ + strm->next_in = ar.in; + strm->next_out = ar.out; + strm->avail_in = (unsigned)(ar.in < ar.last ? + PAD_AVAIL_IN + (ar.last - ar.in) : + PAD_AVAIL_IN - (ar.in - ar.last)); + strm->avail_out = (unsigned)(ar.out < ar.end ? + PAD_AVAIL_OUT + (ar.end - ar.out) : + PAD_AVAIL_OUT - (ar.out - ar.end)); + state->hold = (unsigned long)ar.hold; + state->bits = ar.bits; + return; +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/inffasx64.asm b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/inffasx64.asm new file mode 100644 index 0000000000..41ec82392e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/inffasx64.asm @@ -0,0 +1,396 @@ +; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding +; version for AMD64 on Windows using Microsoft C compiler +; +; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c +; inffasx64.asm is called by inffas8664.c, which contain more info. + + +; to compile this file, I use option +; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm +; with Microsoft Macro Assembler (x64) for AMD64 +; + +; This file compile with Microsoft Macro Assembler (x64) for AMD64 +; +; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK +; +; (you can get Windows WDK with ml64 for AMD64 from +; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price) +; + + +.code +inffas8664fnc PROC + +; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and +; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp +; +; All registers must be preserved across the call, except for +; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch. + + + mov [rsp-8],rsi + mov [rsp-16],rdi + mov [rsp-24],r12 + mov [rsp-32],r13 + mov [rsp-40],r14 + mov [rsp-48],r15 + mov [rsp-56],rbx + + mov rax,rcx + + mov [rax+8], rbp ; /* save regs rbp and rsp */ + mov [rax], rsp + + mov rsp, rax ; /* make rsp point to &ar */ + + mov rsi, [rsp+16] ; /* rsi = in */ + mov rdi, [rsp+32] ; /* rdi = out */ + mov r9, [rsp+24] ; /* r9 = last */ + mov r10, [rsp+48] ; /* r10 = end */ + mov rbp, [rsp+64] ; /* rbp = lcode */ + mov r11, [rsp+72] ; /* r11 = dcode */ + mov rdx, [rsp+80] ; /* rdx = hold */ + mov ebx, [rsp+88] ; /* ebx = bits */ + mov r12d, [rsp+100] ; /* r12d = lmask */ + mov r13d, [rsp+104] ; /* r13d = dmask */ + ; /* r14d = len */ + ; /* r15d = dist */ + + + cld + cmp r10, rdi + je L_one_time ; /* if only one decode left */ + cmp r9, rsi + + jne L_do_loop + + +L_one_time: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code_one_time + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + jmp L_get_length_code_one_time + +ALIGN 4 +L_while_test: + cmp r10, rdi + jbe L_break_loop + cmp r9, rsi + jbe L_break_loop + +L_do_loop: + mov r8, r12 ; /* r8 = lmask */ + cmp bl, 32 + ja L_get_length_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_length_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + mov r8, r12 ; /* r8 = lmask */ + shr eax, 16 ; /* output this.val char */ + stosb + +L_get_length_code_one_time: + and r8, rdx ; /* r8 &= hold */ + mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */ + +L_dolen: + mov cl, ah ; /* cl = this.bits */ + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + + test al, al + jnz L_test_for_length_base ; /* if (op != 0) 45.7% */ + + shr eax, 16 ; /* output this.val char */ + stosb + jmp L_while_test + +ALIGN 4 +L_test_for_length_base: + mov r14d, eax ; /* len = this */ + shr r14d, 16 ; /* len = this.val */ + mov cl, al + + test al, 16 + jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */ + and cl, 15 ; /* op &= 15 */ + jz L_decode_distance ; /* if (!op) */ + +L_add_bits_to_len: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r14d, eax ; /* len += hold & mask[op] */ + +L_decode_distance: + mov r8, r13 ; /* r8 = dmask */ + cmp bl, 32 + ja L_get_distance_code ; /* if (32 < bits) */ + + lodsd ; /* eax = *(uint *)in++ */ + mov cl, bl ; /* cl = bits, needs it for shifting */ + add bl, 32 ; /* bits += 32 */ + shl rax, cl + or rdx, rax ; /* hold |= *((uint *)in)++ << bits */ + +L_get_distance_code: + and r8, rdx ; /* r8 &= hold */ + mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */ + +L_dodist: + mov r15d, eax ; /* dist = this */ + shr r15d, 16 ; /* dist = this.val */ + mov cl, ah + sub bl, ah ; /* bits -= this.bits */ + shr rdx, cl ; /* hold >>= this.bits */ + mov cl, al ; /* cl = this.op */ + + test al, 16 ; /* if ((op & 16) == 0) */ + jz L_test_for_second_level_dist + and cl, 15 ; /* op &= 15 */ + jz L_check_dist_one + +L_add_bits_to_dist: + sub bl, cl + xor eax, eax + inc eax + shl eax, cl + dec eax ; /* (1 << op) - 1 */ + and eax, edx ; /* eax &= hold */ + shr rdx, cl + add r15d, eax ; /* dist += hold & ((1 << op) - 1) */ + +L_check_window: + mov r8, rsi ; /* save in so from can use it's reg */ + mov rax, rdi + sub rax, [rsp+40] ; /* nbytes = out - beg */ + + cmp eax, r15d + jb L_clip_window ; /* if (dist > nbytes) 4.2% */ + + mov ecx, r14d ; /* ecx = len */ + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + + sar ecx, 1 + jnc L_copy_two ; /* if len % 2 == 0 */ + + rep movsw + mov al, [rsi] + mov [rdi], al + inc rdi + + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +L_copy_two: + rep movsw + mov rsi, r8 ; /* move in back to %rsi, toss from */ + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp r15d, 1 ; /* if dist 1, is a memset */ + jne L_check_window + cmp [rsp+40], rdi ; /* if out == beg, outside window */ + je L_check_window + + mov ecx, r14d ; /* ecx = len */ + mov al, [rdi-1] + mov ah, al + + sar ecx, 1 + jnc L_set_two + mov [rdi], al + inc rdi + +L_set_two: + rep stosw + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + test al, 64 + jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r14d ; /* eax += len */ + mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/ + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + test al, 64 + jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */ + + xor eax, eax + inc eax + shl eax, cl + dec eax + and eax, edx ; /* eax &= hold */ + add eax, r15d ; /* eax += dist */ + mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/ + jmp L_dodist + +ALIGN 4 +L_clip_window: + mov ecx, eax ; /* ecx = nbytes */ + mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */ + neg ecx ; /* nbytes = -nbytes */ + + cmp eax, r15d + jb L_invalid_distance_too_far ; /* if (dist > wsize) */ + + add ecx, r15d ; /* nbytes = dist - nbytes */ + cmp dword ptr [rsp+96], 0 + jne L_wrap_around_window ; /* if (write != 0) */ + + mov rsi, [rsp+56] ; /* from = window */ + sub eax, ecx ; /* eax -= nbytes */ + add rsi, rax ; /* from += wsize - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp r14d, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* eax -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = &out[ -dist ] */ + jmp L_do_copy + +ALIGN 4 +L_wrap_around_window: + mov eax, [rsp+96] ; /* eax = write */ + cmp ecx, eax + jbe L_contiguous_in_window ; /* if (write >= nbytes) */ + + mov esi, [rsp+92] ; /* from = wsize */ + add rsi, [rsp+56] ; /* from += window */ + add rsi, rax ; /* from += write */ + sub rsi, rcx ; /* from -= nbytes */ + sub ecx, eax ; /* nbytes -= write */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, [rsp+56] ; /* from = window */ + mov ecx, [rsp+96] ; /* nbytes = write */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy + +ALIGN 4 +L_contiguous_in_window: + mov rsi, [rsp+56] ; /* rsi = window */ + add rsi, rax + sub rsi, rcx ; /* from += write - nbytes */ + + mov eax, r14d ; /* eax = len */ + cmp eax, ecx + jbe L_do_copy ; /* if (nbytes >= len) */ + + sub eax, ecx ; /* len -= nbytes */ + rep movsb + mov rsi, rdi + sub rsi, r15 ; /* from = out - dist */ + jmp L_do_copy ; /* if (nbytes >= len) */ + +ALIGN 4 +L_do_copy: + mov ecx, eax ; /* ecx = len */ + rep movsb + + mov rsi, r8 ; /* move in back to %esi, toss from */ + jmp L_while_test + +L_test_for_end_of_block: + test al, 32 + jz L_invalid_literal_length_code + mov dword ptr [rsp+116], 1 + jmp L_break_loop_with_status + +L_invalid_literal_length_code: + mov dword ptr [rsp+116], 2 + jmp L_break_loop_with_status + +L_invalid_distance_code: + mov dword ptr [rsp+116], 3 + jmp L_break_loop_with_status + +L_invalid_distance_too_far: + mov dword ptr [rsp+116], 4 + jmp L_break_loop_with_status + +L_break_loop: + mov dword ptr [rsp+116], 0 + +L_break_loop_with_status: +; /* put in, out, bits, and hold back into ar and pop esp */ + mov [rsp+16], rsi ; /* in */ + mov [rsp+32], rdi ; /* out */ + mov [rsp+88], ebx ; /* bits */ + mov [rsp+80], rdx ; /* hold */ + + mov rax, [rsp] ; /* restore rbp and rsp */ + mov rbp, [rsp+8] + mov rsp, rax + + + + mov rsi,[rsp-8] + mov rdi,[rsp-16] + mov r12,[rsp-24] + mov r13,[rsp-32] + mov r14,[rsp-40] + mov r15,[rsp-48] + mov rbx,[rsp-56] + + ret 0 +; : +; : "m" (ar) +; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi", +; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" +; ); + +inffas8664fnc ENDP +;_TEXT ENDS +END diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/readme.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/readme.txt new file mode 100644 index 0000000000..652571c7a5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx64/readme.txt @@ -0,0 +1,31 @@ +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t), +for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits. + +gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits + assembly optimized version from Jean-loup Gailly original longest_match function + +inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing + original function from Mark Adler + +Use instructions +---------------- +Assemble the .asm files using MASM and put the object files into the zlib source +directory. You can also get object files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +define ASMV and ASMINF in your project. Include inffas8664.c in your source tree, +and inffasx64.obj and gvmat64.obj as object to link. + + +Build instructions +------------------ +run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe) + +ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK + +You can get Windows 2003 server DDK with ml64 and cl for AMD64 from + http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price) diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/bld_ml32.bat b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/bld_ml32.bat new file mode 100644 index 0000000000..fcf5755e46 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/bld_ml32.bat @@ -0,0 +1,2 @@ +ml /coff /Zi /c /Flmatch686.lst match686.asm +ml /coff /Zi /c /Flinffas32.lst inffas32.asm diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/inffas32.asm b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/inffas32.asm new file mode 100644 index 0000000000..14f9d3514a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/inffas32.asm @@ -0,0 +1,1083 @@ +;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding +; * +; * inffas32.asm is derivated from inffas86.c, with translation of assembly code +; * +; * Copyright (C) 1995-2003 Mark Adler +; * For conditions of distribution and use, see copyright notice in zlib.h +; * +; * Copyright (C) 2003 Chris Anderson +; * Please use the copyright conditions above. +; * +; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from +; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at +; * the moment. I have successfully compiled and tested this code with gcc2.96, +; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S +; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX +; * enabled. I will attempt to merge the MMX code into this version. Newer +; * versions of this and inffast.S can be found at +; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/ +; * +; * 2005 : modification by Gilles Vollant +; */ +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is in directory \MASM611C of Win95 DDK +; ml.exe is also distributed in http://www.masm32.com/masmdl.htm +; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/ +; +; +; compile with command line option +; ml /coff /Zi /c /Flinffas32.lst inffas32.asm + +; if you define NO_GZIP (see inflate.h), compile with +; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm + + +; zlib122sup is 0 fort zlib 1.2.2.1 and lower +; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head +; in inflate_state in inflate.h) +zlib1222sup equ 8 + + +IFDEF GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 +ELSE + IFNDEF NO_GUNZIP + INFLATE_MODE_TYPE equ 11 + INFLATE_MODE_BAD equ 26 + ELSE + INFLATE_MODE_TYPE equ 3 + INFLATE_MODE_BAD equ 17 + ENDIF +ENDIF + + +; 75 "inffast.S" +;FILE "inffast.S" + +;;;GLOBAL _inflate_fast + +;;;SECTION .text + + + + .586p + .mmx + + name inflate_fast_x86 + .MODEL FLAT + +_DATA segment +inflate_fast_use_mmx: + dd 1 + + +_TEXT segment +PUBLIC _inflate_fast + +ALIGN 4 +_inflate_fast: + jmp inflate_fast_entry + + + +ALIGN 4 + db 'Fast decoding Code from Chris Anderson' + db 0 + +ALIGN 4 +invalid_literal_length_code_msg: + db 'invalid literal/length code' + db 0 + +ALIGN 4 +invalid_distance_code_msg: + db 'invalid distance code' + db 0 + +ALIGN 4 +invalid_distance_too_far_msg: + db 'invalid distance too far back' + db 0 + + +ALIGN 4 +inflate_fast_mask: +dd 0 +dd 1 +dd 3 +dd 7 +dd 15 +dd 31 +dd 63 +dd 127 +dd 255 +dd 511 +dd 1023 +dd 2047 +dd 4095 +dd 8191 +dd 16383 +dd 32767 +dd 65535 +dd 131071 +dd 262143 +dd 524287 +dd 1048575 +dd 2097151 +dd 4194303 +dd 8388607 +dd 16777215 +dd 33554431 +dd 67108863 +dd 134217727 +dd 268435455 +dd 536870911 +dd 1073741823 +dd 2147483647 +dd 4294967295 + + +mode_state equ 0 ;/* state->mode */ +wsize_state equ (32+zlib1222sup) ;/* state->wsize */ +write_state equ (36+4+zlib1222sup) ;/* state->write */ +window_state equ (40+4+zlib1222sup) ;/* state->window */ +hold_state equ (44+4+zlib1222sup) ;/* state->hold */ +bits_state equ (48+4+zlib1222sup) ;/* state->bits */ +lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */ +distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */ +lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */ +distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */ + + +;;SECTION .text +; 205 "inffast.S" +;GLOBAL inflate_fast_use_mmx + +;SECTION .data + + +; GLOBAL inflate_fast_use_mmx:object +;.size inflate_fast_use_mmx, 4 +; 226 "inffast.S" +;SECTION .text + +ALIGN 4 +inflate_fast_entry: + push edi + push esi + push ebp + push ebx + pushfd + sub esp,64 + cld + + + + + mov esi, [esp+88] + mov edi, [esi+28] + + + + + + + + mov edx, [esi+4] + mov eax, [esi+0] + + add edx,eax + sub edx,11 + + mov [esp+44],eax + mov [esp+20],edx + + mov ebp, [esp+92] + mov ecx, [esi+16] + mov ebx, [esi+12] + + sub ebp,ecx + neg ebp + add ebp,ebx + + sub ecx,257 + add ecx,ebx + + mov [esp+60],ebx + mov [esp+40],ebp + mov [esp+16],ecx +; 285 "inffast.S" + mov eax, [edi+lencode_state] + mov ecx, [edi+distcode_state] + + mov [esp+8],eax + mov [esp+12],ecx + + mov eax,1 + mov ecx, [edi+lenbits_state] + shl eax,cl + dec eax + mov [esp+0],eax + + mov eax,1 + mov ecx, [edi+distbits_state] + shl eax,cl + dec eax + mov [esp+4],eax + + mov eax, [edi+wsize_state] + mov ecx, [edi+write_state] + mov edx, [edi+window_state] + + mov [esp+52],eax + mov [esp+48],ecx + mov [esp+56],edx + + mov ebp, [edi+hold_state] + mov ebx, [edi+bits_state] +; 321 "inffast.S" + mov esi, [esp+44] + mov ecx, [esp+20] + cmp ecx,esi + ja L_align_long + + add ecx,11 + sub ecx,esi + mov eax,12 + sub eax,ecx + lea edi, [esp+28] + rep movsb + mov ecx,eax + xor eax,eax + rep stosb + lea esi, [esp+28] + mov [esp+20],esi + jmp L_is_aligned + + +L_align_long: + test esi,3 + jz L_is_aligned + xor eax,eax + mov al, [esi] + inc esi + mov ecx,ebx + add ebx,8 + shl eax,cl + or ebp,eax + jmp L_align_long + +L_is_aligned: + mov edi, [esp+60] +; 366 "inffast.S" +L_check_mmx: + cmp dword ptr [inflate_fast_use_mmx],2 + je L_init_mmx + ja L_do_loop + + push eax + push ebx + push ecx + push edx + pushfd + mov eax, [esp] + xor dword ptr [esp],0200000h + + + + + popfd + pushfd + pop edx + xor edx,eax + jz L_dont_use_mmx + xor eax,eax + cpuid + cmp ebx,0756e6547h + jne L_dont_use_mmx + cmp ecx,06c65746eh + jne L_dont_use_mmx + cmp edx,049656e69h + jne L_dont_use_mmx + mov eax,1 + cpuid + shr eax,8 + and eax,15 + cmp eax,6 + jne L_dont_use_mmx + test edx,0800000h + jnz L_use_mmx + jmp L_dont_use_mmx +L_use_mmx: + mov dword ptr [inflate_fast_use_mmx],2 + jmp L_check_mmx_pop +L_dont_use_mmx: + mov dword ptr [inflate_fast_use_mmx],3 +L_check_mmx_pop: + pop edx + pop ecx + pop ebx + pop eax + jmp L_check_mmx +; 426 "inffast.S" +ALIGN 4 +L_do_loop: +; 437 "inffast.S" + cmp bl,15 + ja L_get_length_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_length_code: + mov edx, [esp+0] + mov ecx, [esp+8] + and edx,ebp + mov eax, [ecx+edx*4] + +L_dolen: + + + + + + + mov cl,ah + sub bl,ah + shr ebp,cl + + + + + + + test al,al + jnz L_test_for_length_base + + shr eax,16 + stosb + +L_while_test: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop + jmp L_break_loop + +L_test_for_length_base: +; 502 "inffast.S" + mov edx,eax + shr edx,16 + mov cl,al + + test al,16 + jz L_test_for_second_level_length + and cl,15 + jz L_save_len + cmp bl,cl + jae L_add_bits_to_len + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_len: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + +L_save_len: + mov [esp+24],edx + + +L_decode_distance: +; 549 "inffast.S" + cmp bl,15 + ja L_get_distance_code + + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + +L_get_distance_code: + mov edx, [esp+4] + mov ecx, [esp+12] + and edx,ebp + mov eax, [ecx+edx*4] + + +L_dodist: + mov edx,eax + shr edx,16 + mov cl,ah + sub bl,ah + shr ebp,cl +; 584 "inffast.S" + mov cl,al + + test al,16 + jz L_test_for_second_level_dist + and cl,15 + jz L_check_dist_one + cmp bl,cl + jae L_add_bits_to_dist + + mov ch,cl + xor eax,eax + lodsw + mov cl,bl + add bl,16 + shl eax,cl + or ebp,eax + mov cl,ch + +L_add_bits_to_dist: + mov eax,1 + shl eax,cl + dec eax + sub bl,cl + and eax,ebp + shr ebp,cl + add edx,eax + jmp L_check_window + +L_check_window: +; 625 "inffast.S" + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,edx + jb L_clip_window + + mov ecx, [esp+24] + mov esi,edi + sub esi,edx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + jmp L_while_test + +ALIGN 4 +L_check_dist_one: + cmp edx,1 + jne L_check_window + cmp [esp+40],edi + je L_check_window + + dec edi + mov ecx, [esp+24] + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + jmp L_while_test + +ALIGN 4 +L_test_for_second_level_length: + + + + + test al,64 + jnz L_test_for_end_of_block + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+8] + mov eax, [edx+eax*4] + jmp L_dolen + +ALIGN 4 +L_test_for_second_level_dist: + + + + + test al,64 + jnz L_invalid_distance_code + + mov eax,1 + shl eax,cl + dec eax + and eax,ebp + add eax,edx + mov edx, [esp+12] + mov eax, [edx+eax*4] + jmp L_dodist + +ALIGN 4 +L_clip_window: +; 721 "inffast.S" + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,edx + jb L_invalid_distance_too_far + + add ecx,edx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window + + sub eax,ecx + add esi,eax +; 749 "inffast.S" + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_wrap_around_window: +; 793 "inffast.S" + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + jmp L_do_copy1 + +L_contiguous_in_window: +; 836 "inffast.S" + add esi,eax + sub esi,ecx + + + mov eax, [esp+24] + cmp eax,ecx + jbe L_do_copy1 + + sub eax,ecx + rep movsb + mov esi,edi + sub esi,edx + +L_do_copy1: +; 862 "inffast.S" + mov ecx,eax + rep movsb + + mov esi, [esp+44] + jmp L_while_test +; 878 "inffast.S" +ALIGN 4 +L_init_mmx: + emms + + + + + + movd mm0,ebp + mov ebp,ebx +; 896 "inffast.S" + movd mm4,dword ptr [esp+0] + movq mm3,mm4 + movd mm5,dword ptr [esp+4] + movq mm2,mm5 + pxor mm1,mm1 + mov ebx, [esp+8] + jmp L_do_loop_mmx + +ALIGN 4 +L_do_loop_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_length_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_length_code_mmx: + pand mm4,mm0 + movd eax,mm4 + movq mm4,mm3 + mov eax, [ebx+eax*4] + +L_dolen_mmx: + movzx ecx,ah + movd mm1,ecx + sub ebp,ecx + + test al,al + jnz L_test_for_length_base_mmx + + shr eax,16 + stosb + +L_while_test_mmx: + + + cmp [esp+16],edi + jbe L_break_loop + + cmp [esp+20],esi + ja L_do_loop_mmx + jmp L_break_loop + +L_test_for_length_base_mmx: + + mov edx,eax + shr edx,16 + + test al,16 + jz L_test_for_second_level_length_mmx + and eax,15 + jz L_decode_distance_mmx + + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add edx,ecx + +L_decode_distance_mmx: + psrlq mm0,mm1 + + cmp ebp,32 + ja L_get_dist_code_mmx + + movd mm6,ebp + movd mm7,dword ptr [esi] + add esi,4 + psllq mm7,mm6 + add ebp,32 + por mm0,mm7 + +L_get_dist_code_mmx: + mov ebx, [esp+12] + pand mm5,mm0 + movd eax,mm5 + movq mm5,mm2 + mov eax, [ebx+eax*4] + +L_dodist_mmx: + + movzx ecx,ah + mov ebx,eax + shr ebx,16 + sub ebp,ecx + movd mm1,ecx + + test al,16 + jz L_test_for_second_level_dist_mmx + and eax,15 + jz L_check_dist_one_mmx + +L_add_bits_to_dist_mmx: + psrlq mm0,mm1 + movd mm1,eax + movd ecx,mm0 + sub ebp,eax + and ecx, [inflate_fast_mask+eax*4] + add ebx,ecx + +L_check_window_mmx: + mov [esp+44],esi + mov eax,edi + sub eax, [esp+40] + + cmp eax,ebx + jb L_clip_window_mmx + + mov ecx,edx + mov esi,edi + sub esi,ebx + + sub ecx,3 + mov al, [esi] + mov [edi],al + mov al, [esi+1] + mov dl, [esi+2] + add esi,3 + mov [edi+1],al + mov [edi+2],dl + add edi,3 + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_check_dist_one_mmx: + cmp ebx,1 + jne L_check_window_mmx + cmp [esp+40],edi + je L_check_window_mmx + + dec edi + mov ecx,edx + mov al, [edi] + sub ecx,3 + + mov [edi+1],al + mov [edi+2],al + mov [edi+3],al + add edi,4 + rep stosb + + mov ebx, [esp+8] + jmp L_while_test_mmx + +ALIGN 4 +L_test_for_second_level_length_mmx: + test al,64 + jnz L_test_for_end_of_block + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + add ecx,edx + mov eax, [ebx+ecx*4] + jmp L_dolen_mmx + +ALIGN 4 +L_test_for_second_level_dist_mmx: + test al,64 + jnz L_invalid_distance_code + + and eax,15 + psrlq mm0,mm1 + movd ecx,mm0 + and ecx, [inflate_fast_mask+eax*4] + mov eax, [esp+12] + add ecx,ebx + mov eax, [eax+ecx*4] + jmp L_dodist_mmx + +ALIGN 4 +L_clip_window_mmx: + + mov ecx,eax + mov eax, [esp+52] + neg ecx + mov esi, [esp+56] + + cmp eax,ebx + jb L_invalid_distance_too_far + + add ecx,ebx + cmp dword ptr [esp+48],0 + jne L_wrap_around_window_mmx + + sub eax,ecx + add esi,eax + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_wrap_around_window_mmx: + + mov eax, [esp+48] + cmp ecx,eax + jbe L_contiguous_in_window_mmx + + add esi, [esp+52] + add esi,eax + sub esi,ecx + sub ecx,eax + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi, [esp+56] + mov ecx, [esp+48] + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + jmp L_do_copy1_mmx + +L_contiguous_in_window_mmx: + + add esi,eax + sub esi,ecx + + + cmp edx,ecx + jbe L_do_copy1_mmx + + sub edx,ecx + rep movsb + mov esi,edi + sub esi,ebx + +L_do_copy1_mmx: + + + mov ecx,edx + rep movsb + + mov esi, [esp+44] + mov ebx, [esp+8] + jmp L_while_test_mmx +; 1174 "inffast.S" +L_invalid_distance_code: + + + + + + mov ecx, invalid_distance_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_test_for_end_of_block: + + + + + + test al,32 + jz L_invalid_literal_length_code + + mov ecx,0 + mov edx,INFLATE_MODE_TYPE + jmp L_update_stream_state + +L_invalid_literal_length_code: + + + + + + mov ecx, invalid_literal_length_code_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_invalid_distance_too_far: + + + + mov esi, [esp+44] + mov ecx, invalid_distance_too_far_msg + mov edx,INFLATE_MODE_BAD + jmp L_update_stream_state + +L_update_stream_state: + + mov eax, [esp+88] + test ecx,ecx + jz L_skip_msg + mov [eax+24],ecx +L_skip_msg: + mov eax, [eax+28] + mov [eax+mode_state],edx + jmp L_break_loop + +ALIGN 4 +L_break_loop: +; 1243 "inffast.S" + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_next_in + + + + mov ebx,ebp + +L_update_next_in: +; 1266 "inffast.S" + mov eax, [esp+88] + mov ecx,ebx + mov edx, [eax+28] + shr ecx,3 + sub esi,ecx + shl ecx,3 + sub ebx,ecx + mov [eax+12],edi + mov [edx+bits_state],ebx + mov ecx,ebx + + lea ebx, [esp+28] + cmp [esp+20],ebx + jne L_buf_not_used + + sub esi,ebx + mov ebx, [eax+0] + mov [esp+20],ebx + add esi,ebx + mov ebx, [eax+4] + sub ebx,11 + add [esp+20],ebx + +L_buf_not_used: + mov [eax+0],esi + + mov ebx,1 + shl ebx,cl + dec ebx + + + + + + cmp dword ptr [inflate_fast_use_mmx],2 + jne L_update_hold + + + + psrlq mm0,mm1 + movd ebp,mm0 + + emms + +L_update_hold: + + + + and ebp,ebx + mov [edx+hold_state],ebp + + + + + mov ebx, [esp+20] + cmp ebx,esi + jbe L_last_is_smaller + + sub ebx,esi + add ebx,11 + mov [eax+4],ebx + jmp L_fixup_out +L_last_is_smaller: + sub esi,ebx + neg esi + add esi,11 + mov [eax+4],esi + + + + +L_fixup_out: + + mov ebx, [esp+16] + cmp ebx,edi + jbe L_end_is_smaller + + sub ebx,edi + add ebx,257 + mov [eax+16],ebx + jmp L_done +L_end_is_smaller: + sub edi,ebx + neg edi + add edi,257 + mov [eax+16],edi + + + + + +L_done: + add esp,64 + popfd + pop ebx + pop ebp + pop esi + pop edi + ret + +_TEXT ends +end diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/match686.asm b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/match686.asm new file mode 100644 index 0000000000..21ae7041b2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/match686.asm @@ -0,0 +1,478 @@ +; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86 +; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant. +; File written by Gilles Vollant, by converting match686.S from Brian Raiter +; for MASM. This is as assembly version of longest_match +; from Jean-loup Gailly in deflate.c +; +; http://www.zlib.net +; http://www.winimage.com/zLibDll +; http://www.muppetlabs.com/~breadbox/software/assembly.html +; +; For Visual C++ 4.x and higher and ML 6.x and higher +; ml.exe is distributed in +; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 +; +; this file contain two implementation of longest_match +; +; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro +; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom) +; +; for using an assembly version of longest_match, you need define ASMV in project +; +; compile the asm file running +; ml /coff /Zi /c /Flmatch686.lst match686.asm +; and do not include match686.obj in your project +; +; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for +; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor +; with autoselect (with cpu detection code) +; if you want support the old pentium optimization, you can still use these version +; +; this file is not optimized for old pentium, but it compatible with all x86 32 bits +; processor (starting 80386) +; +; +; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2 + +;uInt longest_match(s, cur_match) +; deflate_state *s; +; IPos cur_match; /* current match */ + + NbStack equ 76 + cur_match equ dword ptr[esp+NbStack-0] + str_s equ dword ptr[esp+NbStack-4] +; 5 dword on top (ret,ebp,esi,edi,ebx) + adrret equ dword ptr[esp+NbStack-8] + pushebp equ dword ptr[esp+NbStack-12] + pushedi equ dword ptr[esp+NbStack-16] + pushesi equ dword ptr[esp+NbStack-20] + pushebx equ dword ptr[esp+NbStack-24] + + chain_length equ dword ptr [esp+NbStack-28] + limit equ dword ptr [esp+NbStack-32] + best_len equ dword ptr [esp+NbStack-36] + window equ dword ptr [esp+NbStack-40] + prev equ dword ptr [esp+NbStack-44] + scan_start equ word ptr [esp+NbStack-48] + wmask equ dword ptr [esp+NbStack-52] + match_start_ptr equ dword ptr [esp+NbStack-56] + nice_match equ dword ptr [esp+NbStack-60] + scan equ dword ptr [esp+NbStack-64] + + windowlen equ dword ptr [esp+NbStack-68] + match_start equ dword ptr [esp+NbStack-72] + strend equ dword ptr [esp+NbStack-76] + NbStackAdd equ (NbStack-24) + + .386p + + name gvmatch + .MODEL FLAT + + + +; all the +zlib1222add offsets are due to the addition of fields +; in zlib in the deflate_state structure since the asm code was first written +; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)"). +; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0"). +; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8"). + + zlib1222add equ 8 + +; Note : these value are good with a 8 bytes boundary pack structure + dep_chain_length equ 74h+zlib1222add + dep_window equ 30h+zlib1222add + dep_strstart equ 64h+zlib1222add + dep_prev_length equ 70h+zlib1222add + dep_nice_match equ 88h+zlib1222add + dep_w_size equ 24h+zlib1222add + dep_prev equ 38h+zlib1222add + dep_w_mask equ 2ch+zlib1222add + dep_good_match equ 84h+zlib1222add + dep_match_start equ 68h+zlib1222add + dep_lookahead equ 6ch+zlib1222add + + +_TEXT segment + +IFDEF NOUNDERLINE + public longest_match + public match_init +ELSE + public _longest_match + public _match_init +ENDIF + + MAX_MATCH equ 258 + MIN_MATCH equ 3 + MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1) + + + +MAX_MATCH equ 258 +MIN_MATCH equ 3 +MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1) +MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h) + + +;;; stack frame offsets + +chainlenwmask equ esp + 0 ; high word: current chain len + ; low word: s->wmask +window equ esp + 4 ; local copy of s->window +windowbestlen equ esp + 8 ; s->window + bestlen +scanstart equ esp + 16 ; first two bytes of string +scanend equ esp + 12 ; last two bytes of string +scanalign equ esp + 20 ; dword-misalignment of string +nicematch equ esp + 24 ; a good enough match size +bestlen equ esp + 28 ; size of best match so far +scan equ esp + 32 ; ptr to string wanting match + +LocalVarsSize equ 36 +; saved ebx byte esp + 36 +; saved edi byte esp + 40 +; saved esi byte esp + 44 +; saved ebp byte esp + 48 +; return address byte esp + 52 +deflatestate equ esp + 56 ; the function arguments +curmatch equ esp + 60 + +;;; Offsets for fields in the deflate_state structure. These numbers +;;; are calculated from the definition of deflate_state, with the +;;; assumption that the compiler will dword-align the fields. (Thus, +;;; changing the definition of deflate_state could easily cause this +;;; program to crash horribly, without so much as a warning at +;;; compile time. Sigh.) + +dsWSize equ 36+zlib1222add +dsWMask equ 44+zlib1222add +dsWindow equ 48+zlib1222add +dsPrev equ 56+zlib1222add +dsMatchLen equ 88+zlib1222add +dsPrevMatch equ 92+zlib1222add +dsStrStart equ 100+zlib1222add +dsMatchStart equ 104+zlib1222add +dsLookahead equ 108+zlib1222add +dsPrevLen equ 112+zlib1222add +dsMaxChainLen equ 116+zlib1222add +dsGoodMatch equ 132+zlib1222add +dsNiceMatch equ 136+zlib1222add + + +;;; match686.asm -- Pentium-Pro-optimized version of longest_match() +;;; Written for zlib 1.1.2 +;;; Copyright (C) 1998 Brian Raiter +;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html +;;; +;; +;; This software is provided 'as-is', without any express or implied +;; warranty. In no event will the authors be held liable for any damages +;; arising from the use of this software. +;; +;; Permission is granted to anyone to use this software for any purpose, +;; including commercial applications, and to alter it and redistribute it +;; freely, subject to the following restrictions: +;; +;; 1. The origin of this software must not be misrepresented; you must not +;; claim that you wrote the original software. If you use this software +;; in a product, an acknowledgment in the product documentation would be +;; appreciated but is not required. +;; 2. Altered source versions must be plainly marked as such, and must not be +;; misrepresented as being the original software +;; 3. This notice may not be removed or altered from any source distribution. +;; + +;GLOBAL _longest_match, _match_init + + +;SECTION .text + +;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch) + +;_longest_match: + IFDEF NOUNDERLINE + longest_match proc near + ELSE + _longest_match proc near + ENDIF + +;;; Save registers that the compiler may be using, and adjust esp to +;;; make room for our stack frame. + + push ebp + push edi + push esi + push ebx + sub esp, LocalVarsSize + +;;; Retrieve the function arguments. ecx will hold cur_match +;;; throughout the entire function. edx will hold the pointer to the +;;; deflate_state structure during the function's setup (before +;;; entering the main loop. + + mov edx, [deflatestate] + mov ecx, [curmatch] + +;;; uInt wmask = s->w_mask; +;;; unsigned chain_length = s->max_chain_length; +;;; if (s->prev_length >= s->good_match) { +;;; chain_length >>= 2; +;;; } + + mov eax, [edx + dsPrevLen] + mov ebx, [edx + dsGoodMatch] + cmp eax, ebx + mov eax, [edx + dsWMask] + mov ebx, [edx + dsMaxChainLen] + jl LastMatchGood + shr ebx, 2 +LastMatchGood: + +;;; chainlen is decremented once beforehand so that the function can +;;; use the sign flag instead of the zero flag for the exit test. +;;; It is then shifted into the high word, to make room for the wmask +;;; value, which it will always accompany. + + dec ebx + shl ebx, 16 + or ebx, eax + mov [chainlenwmask], ebx + +;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + mov eax, [edx + dsNiceMatch] + mov ebx, [edx + dsLookahead] + cmp ebx, eax + jl LookaheadLess + mov ebx, eax +LookaheadLess: mov [nicematch], ebx + +;;; register Bytef *scan = s->window + s->strstart; + + mov esi, [edx + dsWindow] + mov [window], esi + mov ebp, [edx + dsStrStart] + lea edi, [esi + ebp] + mov [scan], edi + +;;; Determine how many bytes the scan ptr is off from being +;;; dword-aligned. + + mov eax, edi + neg eax + and eax, 3 + mov [scanalign], eax + +;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ? +;;; s->strstart - (IPos)MAX_DIST(s) : NIL; + + mov eax, [edx + dsWSize] + sub eax, MIN_LOOKAHEAD + sub ebp, eax + jg LimitPositive + xor ebp, ebp +LimitPositive: + +;;; int best_len = s->prev_length; + + mov eax, [edx + dsPrevLen] + mov [bestlen], eax + +;;; Store the sum of s->window + best_len in esi locally, and in esi. + + add esi, eax + mov [windowbestlen], esi + +;;; register ush scan_start = *(ushf*)scan; +;;; register ush scan_end = *(ushf*)(scan+best_len-1); +;;; Posf *prev = s->prev; + + movzx ebx, word ptr [edi] + mov [scanstart], ebx + movzx ebx, word ptr [edi + eax - 1] + mov [scanend], ebx + mov edi, [edx + dsPrev] + +;;; Jump into the main loop. + + mov edx, [chainlenwmask] + jmp short LoopEntry + +align 4 + +;;; do { +;;; match = s->window + cur_match; +;;; if (*(ushf*)(match+best_len-1) != scan_end || +;;; *(ushf*)match != scan_start) continue; +;;; [...] +;;; } while ((cur_match = prev[cur_match & wmask]) > limit +;;; && --chain_length != 0); +;;; +;;; Here is the inner loop of the function. The function will spend the +;;; majority of its time in this loop, and majority of that time will +;;; be spent in the first ten instructions. +;;; +;;; Within this loop: +;;; ebx = scanend +;;; ecx = curmatch +;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask) +;;; esi = windowbestlen - i.e., (window + bestlen) +;;; edi = prev +;;; ebp = limit + +LookupLoop: + and ecx, edx + movzx ecx, word ptr [edi + ecx*2] + cmp ecx, ebp + jbe LeaveNow + sub edx, 00010000h + js LeaveNow +LoopEntry: movzx eax, word ptr [esi + ecx - 1] + cmp eax, ebx + jnz LookupLoop + mov eax, [window] + movzx eax, word ptr [eax + ecx] + cmp eax, [scanstart] + jnz LookupLoop + +;;; Store the current value of chainlen. + + mov [chainlenwmask], edx + +;;; Point edi to the string under scrutiny, and esi to the string we +;;; are hoping to match it up with. In actuality, esi and edi are +;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is +;;; initialized to -(MAX_MATCH_8 - scanalign). + + mov esi, [window] + mov edi, [scan] + add esi, ecx + mov eax, [scanalign] + mov edx, 0fffffef8h; -(MAX_MATCH_8) + lea edi, [edi + eax + 0108h] ;MAX_MATCH_8] + lea esi, [esi + eax + 0108h] ;MAX_MATCH_8] + +;;; Test the strings for equality, 8 bytes at a time. At the end, +;;; adjust edx so that it is offset to the exact byte that mismatched. +;;; +;;; We already know at this point that the first three bytes of the +;;; strings match each other, and they can be safely passed over before +;;; starting the compare loop. So what this code does is skip over 0-3 +;;; bytes, as much as necessary in order to dword-align the edi +;;; pointer. (esi will still be misaligned three times out of four.) +;;; +;;; It should be confessed that this loop usually does not represent +;;; much of the total running time. Replacing it with a more +;;; straightforward "rep cmpsb" would not drastically degrade +;;; performance. + +LoopCmps: + mov eax, [esi + edx] + xor eax, [edi + edx] + jnz LeaveLoopCmps + mov eax, [esi + edx + 4] + xor eax, [edi + edx + 4] + jnz LeaveLoopCmps4 + add edx, 8 + jnz LoopCmps + jmp short LenMaximum +LeaveLoopCmps4: add edx, 4 +LeaveLoopCmps: test eax, 0000FFFFh + jnz LenLower + add edx, 2 + shr eax, 16 +LenLower: sub al, 1 + adc edx, 0 + +;;; Calculate the length of the match. If it is longer than MAX_MATCH, +;;; then automatically accept it as the best possible match and leave. + + lea eax, [edi + edx] + mov edi, [scan] + sub eax, edi + cmp eax, MAX_MATCH + jge LenMaximum + +;;; If the length of the match is not longer than the best match we +;;; have so far, then forget it and return to the lookup loop. + + mov edx, [deflatestate] + mov ebx, [bestlen] + cmp eax, ebx + jg LongerMatch + mov esi, [windowbestlen] + mov edi, [edx + dsPrev] + mov ebx, [scanend] + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; s->match_start = cur_match; +;;; best_len = len; +;;; if (len >= nice_match) break; +;;; scan_end = *(ushf*)(scan+best_len-1); + +LongerMatch: mov ebx, [nicematch] + mov [bestlen], eax + mov [edx + dsMatchStart], ecx + cmp eax, ebx + jge LeaveNow + mov esi, [window] + add esi, eax + mov [windowbestlen], esi + movzx ebx, word ptr [edi + eax - 1] + mov edi, [edx + dsPrev] + mov [scanend], ebx + mov edx, [chainlenwmask] + jmp LookupLoop + +;;; Accept the current string, with the maximum possible length. + +LenMaximum: mov edx, [deflatestate] + mov dword ptr [bestlen], MAX_MATCH + mov [edx + dsMatchStart], ecx + +;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len; +;;; return s->lookahead; + +LeaveNow: + mov edx, [deflatestate] + mov ebx, [bestlen] + mov eax, [edx + dsLookahead] + cmp ebx, eax + jg LookaheadRet + mov eax, ebx +LookaheadRet: + +;;; Restore the stack and return from whence we came. + + add esp, LocalVarsSize + pop ebx + pop esi + pop edi + pop ebp + + ret +; please don't remove this string ! +; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary! + db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah + + + IFDEF NOUNDERLINE + longest_match endp + ELSE + _longest_match endp + ENDIF + + IFDEF NOUNDERLINE + match_init proc near + ret + match_init endp + ELSE + _match_init proc near + ret + _match_init endp + ENDIF + + +_TEXT ends +end diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/readme.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/readme.txt new file mode 100644 index 0000000000..3f8888679f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/masmx86/readme.txt @@ -0,0 +1,27 @@ + +Summary +------- +This directory contains ASM implementations of the functions +longest_match() and inflate_fast(). + + +Use instructions +---------------- +Assemble using MASM, and copy the object files into the zlib source +directory, then run the appropriate makefile, as suggested below. You can +donwload MASM from here: + + http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64 + +You can also get objects files here: + + http://www.winimage.com/zLibDll/zlib124_masm_obj.zip + +Build instructions +------------------ +* With Microsoft C and MASM: +nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" + +* With Borland C and TASM: +make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj" + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/Makefile b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/Makefile new file mode 100644 index 0000000000..84eaad20d4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/Makefile @@ -0,0 +1,25 @@ +CC=cc +CFLAGS=-O -I../.. + +UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a +ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a + +.c.o: + $(CC) -c $(CFLAGS) $*.c + +all: miniunz minizip + +miniunz: $(UNZ_OBJS) + $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) + +minizip: $(ZIP_OBJS) + $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) + +test: miniunz minizip + ./minizip test readme.txt + ./miniunz -l test.zip + mv readme.txt readme.old + ./miniunz test.zip + +clean: + /bin/rm -f *.o *~ minizip miniunz diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/MiniZip64_Changes.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/MiniZip64_Changes.txt new file mode 100644 index 0000000000..13a1bd91a9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/MiniZip64_Changes.txt @@ -0,0 +1,6 @@ + +MiniZip 1.1 was derrived from MiniZip at version 1.01f + +Change in 1.0 (Okt 2009) + - **TODO - Add history** + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/MiniZip64_info.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/MiniZip64_info.txt new file mode 100644 index 0000000000..57d7152420 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/MiniZip64_info.txt @@ -0,0 +1,74 @@ +MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson + +Introduction +--------------------- +MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html ) + +When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0. +All possible work was done for compatibility. + + +Background +--------------------- +When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64 +support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ ) + +That was used as a starting point. And after that ZIP64 support was added to zip.c +some refactoring and code cleanup was also done. + + +Changed from MiniZip 1.0 to MiniZip 1.1 +--------------------------------------- +* Added ZIP64 support for unzip ( by Even Rouault ) +* Added ZIP64 support for zip ( by Mathias Svensson ) +* Reverted some changed that Even Rouault did. +* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users. +* Added unzip patch for BZIP Compression method (patch create by Daniel Borca) +* Added BZIP Compress method for zip +* Did some refactoring and code cleanup + + +Credits + + Gilles Vollant - Original MiniZip author + Even Rouault - ZIP64 unzip Support + Daniel Borca - BZip Compression method support in unzip + Mathias Svensson - ZIP64 zip support + Mathias Svensson - BZip Compression method support in zip + + Resources + + ZipLayout http://result42.com/projects/ZipFileLayout + Command line tool for Windows that shows the layout and information of the headers in a zip archive. + Used when debugging and validating the creation of zip files using MiniZip64 + + + ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT + Zip File specification + + +Notes. + * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined. + +License +---------------------------------------------------------- + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +---------------------------------------------------------- + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/crypt.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/crypt.h new file mode 100644 index 0000000000..a01d08d932 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/crypt.h @@ -0,0 +1,131 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const unsigned long* pcrc_32_tab, + unsigned long crcForCrypting) +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/ioapi.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/ioapi.c new file mode 100644 index 0000000000..49958f61ff --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/ioapi.c @@ -0,0 +1,235 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#if (defined(_WIN32)) + #define _CRT_SECURE_NO_WARNINGS +#endif + +#include "ioapi.h" + +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) +{ + if (pfilefunc->zfile_func64.zopen64_file != NULL) + return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); + else + { + return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode); + } +} + +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); + else + { + uLong offsetTruncated = (uLong)offset; + if (offsetTruncated != offset) + return -1; + else + return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin); + } +} + +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) +{ + if (pfilefunc->zfile_func64.zseek64_file != NULL) + return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); + else + { + uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + if ((tell_uLong) == ((uLong)-1)) + return (ZPOS64_T)-1; + else + return tell_uLong; + } +} + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) +{ + p_filefunc64_32->zfile_func64.zopen64_file = NULL; + p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; + p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; + p_filefunc64_32->zfile_func64.ztell64_file = NULL; + p_filefunc64_32->zfile_func64.zseek64_file = NULL; + p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file; + p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; + p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque; + p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file; + p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file; +} + + + +static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); +static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); +static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); +static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); +static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); + +static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + +static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen64((const char*)filename, mode_fopen); + return file; +} + + +static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + + +static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret; + ret = ftello64((FILE *)stream); + return ret; +} + +static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + if (fseek((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + return ret; +} + +static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + + if(fseeko64((FILE *)stream, offset, fseek_origin) != 0) + ret = -1; + + return ret; +} + + +static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = fopen64_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell64_file = ftell64_file_func; + pzlib_filefunc_def->zseek64_file = fseek64_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/ioapi.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/ioapi.h new file mode 100644 index 0000000000..8309c4cf8f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/ioapi.h @@ -0,0 +1,200 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + + Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this) + Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux. + More if/def section may be needed to support other platforms + Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows. + (but you should use iowin32.c for windows instead) + +*/ + +#ifndef _ZLIBIOAPI64_H +#define _ZLIBIOAPI64_H + +#if (!defined(_WIN32)) && (!defined(WIN32)) + + // Linux needs this to support file operation on files larger then 4+GB + // But might need better if/def to select just the platforms that needs them. + + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#include +#include +#include "zlib.h" + +#if defined(USE_FILE32API) +#define fopen64 fopen +#define ftello64 ftell +#define fseeko64 fseek +#else +#ifdef _MSC_VER + #define fopen64 fopen + #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC))) + #define ftello64 _ftelli64 + #define fseeko64 _fseeki64 + #else // old MSC + #define ftello64 ftell + #define fseeko64 fseek + #endif +#endif +#endif + +/* +#ifndef ZPOS64_T + #ifdef _WIN32 + #define ZPOS64_T fpos_t + #else + #include + #define ZPOS64_T uint64_t + #endif +#endif +*/ + +#ifdef HAVE_MINIZIP64_CONF_H +#include "mz64conf.h" +#endif + +/* a type choosen by DEFINE */ +#ifdef HAVE_64BIT_INT_CUSTOM +typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; +#else +#ifdef HAS_STDINT_H +#include "stdint.h" +typedef uint64_t ZPOS64_T; +#else + + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef unsigned __int64 ZPOS64_T; +#else +typedef unsigned long long int ZPOS64_T; +#endif +#endif +#endif + + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) + #define ZCALLBACK CALLBACK + #else + #define ZCALLBACK + #endif +#endif + + + + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); + + +/* here is the "old" 32 bits structure structure */ +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); + +typedef struct zlib_filefunc64_def_s +{ + open64_file_func zopen64_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell64_file_func ztell64_file; + seek64_file_func zseek64_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc64_def; + +void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +/* now internal definition, only for zip.c and unzip.h */ +typedef struct zlib_filefunc64_32_def_s +{ + zlib_filefunc64_def zfile_func64; + open_file_func zopen32_file; + tell_file_func ztell32_file; + seek_file_func zseek32_file; +} zlib_filefunc64_32_def; + + +#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size)) +//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream)) +//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) +#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) + +voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); +long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); +ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); + +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); + +#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) +#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) +#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode))) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/iowin32.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/iowin32.c new file mode 100644 index 0000000000..6a2a883be7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/iowin32.c @@ -0,0 +1,389 @@ +/* iowin32.c -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + +#include "zlib.h" +#include "ioapi.h" +#include "iowin32.h" + +#ifndef INVALID_HANDLE_VALUE +#define INVALID_HANDLE_VALUE (0xFFFFFFFF) +#endif + +#ifndef INVALID_SET_FILE_POINTER +#define INVALID_SET_FILE_POINTER ((DWORD)-1) +#endif + +voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); +uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); +long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); +int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); +int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); + +typedef struct +{ + HANDLE hf; + int error; +} WIN32FILE_IOWIN; + + +static void win32_translate_open_mode(int mode, + DWORD* lpdwDesiredAccess, + DWORD* lpdwCreationDisposition, + DWORD* lpdwShareMode, + DWORD* lpdwFlagsAndAttributes) +{ + *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; + + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + { + *lpdwDesiredAccess = GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + *lpdwShareMode = FILE_SHARE_READ; + } + else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = OPEN_EXISTING; + } + else if (mode & ZLIB_FILEFUNC_MODE_CREATE) + { + *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ; + *lpdwCreationDisposition = CREATE_ALWAYS; + } +} + +static voidpf win32_build_iowin(HANDLE hFile) +{ + voidpf ret=NULL; + + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) + { + WIN32FILE_IOWIN w32fiow; + w32fiow.hf = hFile; + w32fiow.error = 0; + ret = malloc(sizeof(WIN32FILE_IOWIN)); + + if (ret==NULL) + CloseHandle(hFile); + else + *((WIN32FILE_IOWIN*)ret) = w32fiow; + } + return ret; +} + +voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); + + return win32_build_iowin(hFile); +} + + +voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) +{ + const char* mode_fopen = NULL; + DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; + HANDLE hFile = NULL; + + win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes); + + if ((filename!=NULL) && (dwDesiredAccess != 0)) + hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL); + + return win32_build_iowin(hFile); +} + + +uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!ReadFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + + +uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) +{ + uLong ret=0; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + + if (hFile != NULL) + { + if (!WriteFile(hFile, buf, size, &ret, NULL)) + { + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_HANDLE_EOF) + dwErr = 0; + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + } + } + + return ret; +} + +long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) +{ + long ret=-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT); + if (dwSet == INVALID_SET_FILE_POINTER) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=(long)dwSet; + } + return ret; +} + +ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) +{ + ZPOS64_T ret= (ZPOS64_T)-1; + HANDLE hFile = NULL; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + if (hFile) + { + LARGE_INTEGER li; + li.QuadPart = 0; + li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT); + if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR)) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = (ZPOS64_T)-1; + } + else + ret=li.QuadPart; + } + return ret; +} + + +long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + + long ret=-1; + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile != NULL) + { + DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod); + if (dwSet == INVALID_SET_FILE_POINTER) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) +{ + DWORD dwMoveMethod=0xFFFFFFFF; + HANDLE hFile = NULL; + long ret=-1; + + if (stream!=NULL) + hFile = ((WIN32FILE_IOWIN*)stream)->hf; + + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + dwMoveMethod = FILE_CURRENT; + break; + case ZLIB_FILEFUNC_SEEK_END : + dwMoveMethod = FILE_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + dwMoveMethod = FILE_BEGIN; + break; + default: return -1; + } + + if (hFile) + { + LARGE_INTEGER* li = (LARGE_INTEGER*)&offset; + DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod); + if (dwSet == INVALID_SET_FILE_POINTER) + { + DWORD dwErr = GetLastError(); + ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr; + ret = -1; + } + else + ret=0; + } + return ret; +} + +int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) +{ + int ret=-1; + + if (stream!=NULL) + { + HANDLE hFile; + hFile = ((WIN32FILE_IOWIN*)stream) -> hf; + if (hFile != NULL) + { + CloseHandle(hFile); + ret=0; + } + free(stream); + } + return ret; +} + +int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) +{ + int ret=-1; + if (stream!=NULL) + { + ret = ((WIN32FILE_IOWIN*)stream) -> error; + } + return ret; +} + +void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen_file = win32_open_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell_file = win32_tell_file_func; + pzlib_filefunc_def->zseek_file = win32_seek_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_func; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} + + +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) +{ + pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; + pzlib_filefunc_def->zread_file = win32_read_file_func; + pzlib_filefunc_def->zwrite_file = win32_write_file_func; + pzlib_filefunc_def->ztell64_file = win32_tell64_file_func; + pzlib_filefunc_def->zseek64_file = win32_seek64_file_func; + pzlib_filefunc_def->zclose_file = win32_close_file_func; + pzlib_filefunc_def->zerror_file = win32_error_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/iowin32.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/iowin32.h new file mode 100644 index 0000000000..0ca0969a7d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/iowin32.h @@ -0,0 +1,28 @@ +/* iowin32.h -- IO base function header for compress/uncompress .zip + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + +*/ + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); + +#ifdef __cplusplus +} +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/make_vms.com b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/make_vms.com new file mode 100644 index 0000000000..9ac13a98fa --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/make_vms.com @@ -0,0 +1,25 @@ +$ if f$search("ioapi.h_orig") .eqs. "" then copy ioapi.h ioapi.h_orig +$ open/write zdef vmsdefs.h +$ copy sys$input: zdef +$ deck +#define unix +#define fill_zlib_filefunc64_32_def_from_filefunc32 fillzffunc64from +#define Write_Zip64EndOfCentralDirectoryLocator Write_Zip64EoDLocator +#define Write_Zip64EndOfCentralDirectoryRecord Write_Zip64EoDRecord +#define Write_EndOfCentralDirectoryRecord Write_EoDRecord +$ eod +$ close zdef +$ copy vmsdefs.h,ioapi.h_orig ioapi.h +$ cc/include=[--]/prefix=all ioapi.c +$ cc/include=[--]/prefix=all miniunz.c +$ cc/include=[--]/prefix=all unzip.c +$ cc/include=[--]/prefix=all minizip.c +$ cc/include=[--]/prefix=all zip.c +$ link miniunz,unzip,ioapi,[--]libz.olb/lib +$ link minizip,zip,ioapi,[--]libz.olb/lib +$ mcr []minizip test minizip_info.txt +$ mcr []miniunz -l test.zip +$ rename minizip_info.txt; minizip_info.txt_old +$ mcr []miniunz test.zip +$ delete test.zip;* +$exit diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/miniunz.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/miniunz.c new file mode 100644 index 0000000000..9ed009fbd9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/miniunz.c @@ -0,0 +1,648 @@ +/* + miniunz.c + Version 1.1, February 14h, 2010 + sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) +*/ + +#ifndef _WIN32 + #ifndef __USE_FILE_OFFSET64 + #define __USE_FILE_OFFSET64 + #endif + #ifndef __USE_LARGEFILE64 + #define __USE_LARGEFILE64 + #endif + #ifndef _LARGEFILE64_SOURCE + #define _LARGEFILE64_SOURCE + #endif + #ifndef _FILE_OFFSET_BIT + #define _FILE_OFFSET_BIT 64 + #endif +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef unix +# include +# include +#else +# include +# include +#endif + +#include "unzip.h" + +#define CASESENSITIVITY (0) +#define WRITEBUFFERSIZE (8192) +#define MAXFILENAME (256) + +#ifdef _WIN32 +#define USEWIN32IOAPI +#include "iowin32.h" +#endif +/* + mini unzip, demo of unzip package + + usage : + Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir] + + list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT + if it exists +*/ + + +/* change_file_date : change the date/time of a file + filename : the filename of the file where date/time must be modified + dosdate : the new date at the MSDos format (4 bytes) + tmu_date : the SAME new date at the tm_unz format */ +void change_file_date(filename,dosdate,tmu_date) + const char *filename; + uLong dosdate; + tm_unz tmu_date; +{ +#ifdef _WIN32 + HANDLE hFile; + FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; + + hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE, + 0,NULL,OPEN_EXISTING,0,NULL); + GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); + DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); + LocalFileTimeToFileTime(&ftLocal,&ftm); + SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); + CloseHandle(hFile); +#else +#ifdef unix + struct utimbuf ut; + struct tm newdate; + newdate.tm_sec = tmu_date.tm_sec; + newdate.tm_min=tmu_date.tm_min; + newdate.tm_hour=tmu_date.tm_hour; + newdate.tm_mday=tmu_date.tm_mday; + newdate.tm_mon=tmu_date.tm_mon; + if (tmu_date.tm_year > 1900) + newdate.tm_year=tmu_date.tm_year - 1900; + else + newdate.tm_year=tmu_date.tm_year ; + newdate.tm_isdst=-1; + + ut.actime=ut.modtime=mktime(&newdate); + utime(filename,&ut); +#endif +#endif +} + + +/* mymkdir and change_file_date are not 100 % portable + As I don't know well Unix, I wait feedback for the unix portion */ + +int mymkdir(dirname) + const char* dirname; +{ + int ret=0; +#ifdef _WIN32 + ret = _mkdir(dirname); +#else +#ifdef unix + ret = mkdir (dirname,0775); +#endif +#endif + return ret; +} + +int makedir (newdir) + char *newdir; +{ + char *buffer ; + char *p; + int len = (int)strlen(newdir); + + if (len <= 0) + return 0; + + buffer = (char*)malloc(len+1); + if (buffer==NULL) + { + printf("Error allocating memory\n"); + return UNZ_INTERNALERROR; + } + strcpy(buffer,newdir); + + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mymkdir(buffer) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mymkdir(buffer) == -1) && (errno == ENOENT)) + { + printf("couldn't create directory %s\n",buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + +void do_banner() +{ + printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); + printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); +} + +void do_help() +{ + printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ + " -e Extract without pathname (junk paths)\n" \ + " -x Extract with pathname\n" \ + " -v list files\n" \ + " -l list files\n" \ + " -d directory to extract into\n" \ + " -o overwrite files without prompting\n" \ + " -p extract crypted file using password\n\n"); +} + +void Display64BitsSize(ZPOS64_T n, int size_char) +{ + /* to avoid compatibility problem , we do here the conversion */ + char number[21]; + int offset=19; + int pos_string = 19; + number[20]=0; + for (;;) { + number[offset]=(char)((n%10)+'0'); + if (number[offset] != '0') + pos_string=offset; + n/=10; + if (offset==0) + break; + offset--; + } + { + int size_display_string = 19-pos_string; + while (size_char > size_display_string) + { + size_char--; + printf(" "); + } + } + + printf("%s",&number[pos_string]); +} + +int do_list(uf) + unzFile uf; +{ + uLong i; + unz_global_info64 gi; + int err; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + printf(" Length Method Size Ratio Date Time CRC-32 Name\n"); + printf(" ------ ------ ---- ----- ---- ---- ------ ----\n"); + for (i=0;i0) + ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); + + /* display a '*' if the file is crypted */ + if ((file_info.flag & 1) != 0) + charCrypt='*'; + + if (file_info.compression_method==0) + string_method="Stored"; + else + if (file_info.compression_method==Z_DEFLATED) + { + uInt iLevel=(uInt)((file_info.flag & 0x6)/2); + if (iLevel==0) + string_method="Defl:N"; + else if (iLevel==1) + string_method="Defl:X"; + else if ((iLevel==2) || (iLevel==3)) + string_method="Defl:F"; /* 2:fast , 3 : extra fast*/ + } + else + if (file_info.compression_method==Z_BZIP2ED) + { + string_method="BZip2 "; + } + else + string_method="Unkn. "; + + Display64BitsSize(file_info.uncompressed_size,7); + printf(" %6s%c",string_method,charCrypt); + Display64BitsSize(file_info.compressed_size,7); + printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n", + ratio, + (uLong)file_info.tmu_date.tm_mon + 1, + (uLong)file_info.tmu_date.tm_mday, + (uLong)file_info.tmu_date.tm_year % 100, + (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min, + (uLong)file_info.crc,filename_inzip); + if ((i+1)='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + } + + if (rep == 'N') + skip = 1; + + if (rep == 'A') + *popt_overwrite=1; + } + + if ((skip==0) && (err==UNZ_OK)) + { + fout=fopen64(write_filename,"wb"); + + /* some zipfile don't contain directory alone before file */ + if ((fout==NULL) && ((*popt_extract_without_path)==0) && + (filename_withoutpath!=(char*)filename_inzip)) + { + char c=*(filename_withoutpath-1); + *(filename_withoutpath-1)='\0'; + makedir(write_filename); + *(filename_withoutpath-1)=c; + fout=fopen64(write_filename,"wb"); + } + + if (fout==NULL) + { + printf("error opening %s\n",write_filename); + } + } + + if (fout!=NULL) + { + printf(" extracting: %s\n",write_filename); + + do + { + err = unzReadCurrentFile(uf,buf,size_buf); + if (err<0) + { + printf("error %d with zipfile in unzReadCurrentFile\n",err); + break; + } + if (err>0) + if (fwrite(buf,err,1,fout)!=1) + { + printf("error in writing extracted file\n"); + err=UNZ_ERRNO; + break; + } + } + while (err>0); + if (fout) + fclose(fout); + + if (err==0) + change_file_date(write_filename,file_info.dosDate, + file_info.tmu_date); + } + + if (err==UNZ_OK) + { + err = unzCloseCurrentFile (uf); + if (err!=UNZ_OK) + { + printf("error %d with zipfile in unzCloseCurrentFile\n",err); + } + } + else + unzCloseCurrentFile(uf); /* don't lose the error */ + } + + free(buf); + return err; +} + + +int do_extract(uf,opt_extract_without_path,opt_overwrite,password) + unzFile uf; + int opt_extract_without_path; + int opt_overwrite; + const char* password; +{ + uLong i; + unz_global_info64 gi; + int err; + FILE* fout=NULL; + + err = unzGetGlobalInfo64(uf,&gi); + if (err!=UNZ_OK) + printf("error %d with zipfile in unzGetGlobalInfo \n",err); + + for (i=0;i +#include +#include +#include +#include +#include + +#ifdef unix +# include +# include +# include +# include +#else +# include +# include +#endif + +#include "zip.h" + +#ifdef _WIN32 + #define USEWIN32IOAPI + #include "iowin32.h" +#endif + + + +#define WRITEBUFFERSIZE (16384) +#define MAXFILENAME (256) + +#ifdef _WIN32 +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret = 0; + { + FILETIME ftLocal; + HANDLE hFind; + WIN32_FIND_DATAA ff32; + + hFind = FindFirstFileA(f,&ff32); + if (hFind != INVALID_HANDLE_VALUE) + { + FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal); + FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0); + FindClose(hFind); + ret = 1; + } + } + return ret; +} +#else +#ifdef unix +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + int ret=0; + struct stat s; /* results of stat() */ + struct tm* filedate; + time_t tm_t=0; + + if (strcmp(f,"-")!=0) + { + char name[MAXFILENAME+1]; + int len = strlen(f); + if (len > MAXFILENAME) + len = MAXFILENAME; + + strncpy(name, f,MAXFILENAME-1); + /* strncpy doesnt append the trailing NULL, of the string is too long. */ + name[ MAXFILENAME ] = '\0'; + + if (name[len - 1] == '/') + name[len - 1] = '\0'; + /* not all systems allow stat'ing a file with / appended */ + if (stat(name,&s)==0) + { + tm_t = s.st_mtime; + ret = 1; + } + } + filedate = localtime(&tm_t); + + tmzip->tm_sec = filedate->tm_sec; + tmzip->tm_min = filedate->tm_min; + tmzip->tm_hour = filedate->tm_hour; + tmzip->tm_mday = filedate->tm_mday; + tmzip->tm_mon = filedate->tm_mon ; + tmzip->tm_year = filedate->tm_year; + + return ret; +} +#else +uLong filetime(f, tmzip, dt) + char *f; /* name of file to get info on */ + tm_zip *tmzip; /* return value: access, modific. and creation times */ + uLong *dt; /* dostime */ +{ + return 0; +} +#endif +#endif + + + + +int check_exist_file(filename) + const char* filename; +{ + FILE* ftestexist; + int ret = 1; + ftestexist = fopen64(filename,"rb"); + if (ftestexist==NULL) + ret = 0; + else + fclose(ftestexist); + return ret; +} + +void do_banner() +{ + printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); + printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); +} + +void do_help() +{ + printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ + " -o Overwrite existing file.zip\n" \ + " -a Append to existing file.zip\n" \ + " -0 Store only\n" \ + " -1 Compress faster\n" \ + " -9 Compress better\n\n" \ + " -j exclude path. store only the file name.\n\n"); +} + +/* calculate the CRC32 of a file, + because to encrypt a file, we need known the CRC32 of the file before */ +int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) +{ + unsigned long calculate_crc=0; + int err=ZIP_OK; + FILE * fin = fopen64(filenameinzip,"rb"); + unsigned long size_read = 0; + unsigned long total_read = 0; + if (fin==NULL) + { + err = ZIP_ERRNO; + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + calculate_crc = crc32(calculate_crc,buf,size_read); + total_read += size_read; + + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + *result_crc=calculate_crc; + printf("file %s crc %lx\n", filenameinzip, calculate_crc); + return err; +} + +int isLargeFile(const char* filename) +{ + int largeFile = 0; + ZPOS64_T pos = 0; + FILE* pFile = fopen64(filename, "rb"); + + if(pFile != NULL) + { + int n = fseeko64(pFile, 0, SEEK_END); + + pos = ftello64(pFile); + + printf("File : %s is %lld bytes\n", filename, pos); + + if(pos >= 0xffffffff) + largeFile = 1; + + fclose(pFile); + } + + return largeFile; +} + +int main(argc,argv) + int argc; + char *argv[]; +{ + int i; + int opt_overwrite=0; + int opt_compress_level=Z_DEFAULT_COMPRESSION; + int opt_exclude_path=0; + int zipfilenamearg = 0; + char filename_try[MAXFILENAME+16]; + int zipok; + int err=0; + int size_buf=0; + void* buf=NULL; + const char* password=NULL; + + + do_banner(); + if (argc==1) + { + do_help(); + return 0; + } + else + { + for (i=1;i='0') && (c<='9')) + opt_compress_level = c-'0'; + if ((c=='j') || (c=='J')) + opt_exclude_path = 1; + + if (((c=='p') || (c=='P')) && (i+1='a') && (rep<='z')) + rep -= 0x20; + } + while ((rep!='Y') && (rep!='N') && (rep!='A')); + if (rep=='N') + zipok = 0; + if (rep=='A') + opt_overwrite = 2; + } + } + + if (zipok==1) + { + zipFile zf; + int errclose; +# ifdef USEWIN32IOAPI + zlib_filefunc64_def ffunc; + fill_win32_filefunc64A(&ffunc); + zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc); +# else + zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0); +# endif + + if (zf == NULL) + { + printf("error opening %s\n",filename_try); + err= ZIP_ERRNO; + } + else + printf("creating %s\n",filename_try); + + for (i=zipfilenamearg+1;(i='0') || (argv[i][1]<='9'))) && + (strlen(argv[i]) == 2))) + { + FILE * fin; + int size_read; + const char* filenameinzip = argv[i]; + const char *savefilenameinzip; + zip_fileinfo zi; + unsigned long crcFile=0; + int zip64 = 0; + + zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = + zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; + zi.dosDate = 0; + zi.internal_fa = 0; + zi.external_fa = 0; + filetime(filenameinzip,&zi.tmz_date,&zi.dosDate); + +/* + err = zipOpenNewFileInZip(zf,filenameinzip,&zi, + NULL,0,NULL,0,NULL / * comment * /, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level); +*/ + if ((password != NULL) && (err==ZIP_OK)) + err = getFileCrc(filenameinzip,buf,size_buf,&crcFile); + + zip64 = isLargeFile(filenameinzip); + + /* The path name saved, should not include a leading slash. */ + /*if it did, windows/xp and dynazip couldn't read the zip file. */ + savefilenameinzip = filenameinzip; + while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' ) + { + savefilenameinzip++; + } + + /*should the zip file contain any path at all?*/ + if( opt_exclude_path ) + { + const char *tmpptr; + const char *lastslash = 0; + for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++) + { + if( *tmpptr == '\\' || *tmpptr == '/') + { + lastslash = tmpptr; + } + } + if( lastslash != NULL ) + { + savefilenameinzip = lastslash+1; // base filename follows last slash. + } + } + + /**/ + err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi, + NULL,0,NULL,0,NULL /* comment*/, + (opt_compress_level != 0) ? Z_DEFLATED : 0, + opt_compress_level,0, + /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */ + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + password,crcFile, zip64); + + if (err != ZIP_OK) + printf("error in opening %s in zipfile\n",filenameinzip); + else + { + fin = fopen64(filenameinzip,"rb"); + if (fin==NULL) + { + err=ZIP_ERRNO; + printf("error in opening %s for reading\n",filenameinzip); + } + } + + if (err == ZIP_OK) + do + { + err = ZIP_OK; + size_read = (int)fread(buf,1,size_buf,fin); + if (size_read < size_buf) + if (feof(fin)==0) + { + printf("error in reading %s\n",filenameinzip); + err = ZIP_ERRNO; + } + + if (size_read>0) + { + err = zipWriteInFileInZip (zf,buf,size_read); + if (err<0) + { + printf("error in writing %s in the zipfile\n", + filenameinzip); + } + + } + } while ((err == ZIP_OK) && (size_read>0)); + + if (fin) + fclose(fin); + + if (err<0) + err=ZIP_ERRNO; + else + { + err = zipCloseFileInZip(zf); + if (err!=ZIP_OK) + printf("error in closing %s in the zipfile\n", + filenameinzip); + } + } + } + errclose = zipClose(zf,NULL); + if (errclose != ZIP_OK) + printf("error in closing %s\n",filename_try); + } + else + { + do_help(); + } + + free(buf); + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/mztools.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/mztools.c new file mode 100644 index 0000000000..f9092e65ae --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/mztools.c @@ -0,0 +1,281 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) + +extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) +const char* file; +const char* fileOut; +const char* fileOutTmp; +uLong* nRecovered; +uLong* bytesRecovered; +{ + int err = Z_OK; + FILE* fpZip = fopen(file, "rb"); + FILE* fpOut = fopen(fileOut, "wb"); + FILE* fpOutCD = fopen(fileOutTmp, "wb"); + if (fpZip != NULL && fpOut != NULL) { + int entries = 0; + uLong totalBytes = 0; + char header[30]; + char filename[256]; + char extra[1024]; + int offset = 0; + int offsetCD = 0; + while ( fread(header, 1, 30, fpZip) == 30 ) { + int currentOffset = offset; + + /* File entry */ + if (READ_32(header) == 0x04034b50) { + unsigned int version = READ_16(header + 4); + unsigned int gpflag = READ_16(header + 6); + unsigned int method = READ_16(header + 8); + unsigned int filetime = READ_16(header + 10); + unsigned int filedate = READ_16(header + 12); + unsigned int crc = READ_32(header + 14); /* crc */ + unsigned int cpsize = READ_32(header + 18); /* compressed size */ + unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ + unsigned int fnsize = READ_16(header + 26); /* file name length */ + unsigned int extsize = READ_16(header + 28); /* extra field length */ + filename[0] = extra[0] = '\0'; + + /* Header */ + if (fwrite(header, 1, 30, fpOut) == 30) { + offset += 30; + } else { + err = Z_ERRNO; + break; + } + + /* Filename */ + if (fnsize > 0) { + if (fread(filename, 1, fnsize, fpZip) == fnsize) { + if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { + offset += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fread(extra, 1, extsize, fpZip) == extsize) { + if (fwrite(extra, 1, extsize, fpOut) == extsize) { + offset += extsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_ERRNO; + break; + } + } + + /* Data */ + { + int dataSize = cpsize; + if (dataSize == 0) { + dataSize = uncpsize; + } + if (dataSize > 0) { + char* data = malloc(dataSize); + if (data != NULL) { + if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { + if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { + offset += dataSize; + totalBytes += dataSize; + } else { + err = Z_ERRNO; + } + } else { + err = Z_ERRNO; + } + free(data); + if (err != Z_OK) { + break; + } + } else { + err = Z_MEM_ERROR; + break; + } + } + } + + /* Central directory entry */ + { + char header[46]; + char* comment = ""; + int comsize = (int) strlen(comment); + WRITE_32(header, 0x02014b50); + WRITE_16(header + 4, version); + WRITE_16(header + 6, version); + WRITE_16(header + 8, gpflag); + WRITE_16(header + 10, method); + WRITE_16(header + 12, filetime); + WRITE_16(header + 14, filedate); + WRITE_32(header + 16, crc); + WRITE_32(header + 20, cpsize); + WRITE_32(header + 24, uncpsize); + WRITE_16(header + 28, fnsize); + WRITE_16(header + 30, extsize); + WRITE_16(header + 32, comsize); + WRITE_16(header + 34, 0); /* disk # */ + WRITE_16(header + 36, 0); /* int attrb */ + WRITE_32(header + 38, 0); /* ext attrb */ + WRITE_32(header + 42, currentOffset); + /* Header */ + if (fwrite(header, 1, 46, fpOutCD) == 46) { + offsetCD += 46; + + /* Filename */ + if (fnsize > 0) { + if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { + offsetCD += fnsize; + } else { + err = Z_ERRNO; + break; + } + } else { + err = Z_STREAM_ERROR; + break; + } + + /* Extra field */ + if (extsize > 0) { + if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { + offsetCD += extsize; + } else { + err = Z_ERRNO; + break; + } + } + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { + offsetCD += comsize; + } else { + err = Z_ERRNO; + break; + } + } + + + } else { + err = Z_ERRNO; + break; + } + } + + /* Success */ + entries++; + + } else { + break; + } + } + + /* Final central directory */ + { + int entriesZip = entries; + char header[22]; + char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; + int comsize = (int) strlen(comment); + if (entriesZip > 0xffff) { + entriesZip = 0xffff; + } + WRITE_32(header, 0x06054b50); + WRITE_16(header + 4, 0); /* disk # */ + WRITE_16(header + 6, 0); /* disk # */ + WRITE_16(header + 8, entriesZip); /* hack */ + WRITE_16(header + 10, entriesZip); /* hack */ + WRITE_32(header + 12, offsetCD); /* size of CD */ + WRITE_32(header + 16, offset); /* offset to CD */ + WRITE_16(header + 20, comsize); /* comment */ + + /* Header */ + if (fwrite(header, 1, 22, fpOutCD) == 22) { + + /* Comment field */ + if (comsize > 0) { + if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { + err = Z_ERRNO; + } + } + + } else { + err = Z_ERRNO; + } + } + + /* Final merge (file + central directory) */ + fclose(fpOutCD); + if (err == Z_OK) { + fpOutCD = fopen(fileOutTmp, "rb"); + if (fpOutCD != NULL) { + int nRead; + char buffer[8192]; + while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { + if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { + err = Z_ERRNO; + break; + } + } + fclose(fpOutCD); + } + } + + /* Close */ + fclose(fpZip); + fclose(fpOut); + + /* Wipe temporary file */ + (void)remove(fileOutTmp); + + /* Number of recovered entries */ + if (err == Z_OK) { + if (nRecovered != NULL) { + *nRecovered = entries; + } + if (bytesRecovered != NULL) { + *bytesRecovered = totalBytes; + } + } + } else { + err = Z_STREAM_ERROR; + } + return err; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/mztools.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/mztools.h new file mode 100644 index 0000000000..88b34592bf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/mztools.h @@ -0,0 +1,31 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* Repair a ZIP file (missing central directory) + file: file to recover + fileOut: output file after recovery + fileOutTmp: temporary file name used for recovery +*/ +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, + uLong* nRecovered, + uLong* bytesRecovered); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/unzip.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/unzip.c new file mode 100644 index 0000000000..7617f41f1c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/unzip.c @@ -0,0 +1,2125 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + + ------------------------------------------------------------------------------------ + Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of + compatibility with older software. The following is from the original crypt.c. + Code woven in by Terry Thorsen 1/2003. + + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html + + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + ------------------------------------------------------------------------------------ + + Changes in unzip.c + + 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos + 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz* + 2007-2008 - Even Rouault - Remove old C style function prototypes + 2007-2008 - Even Rouault - Add unzip support for ZIP64 + + Copyright (C) 2007-2008 Even Rouault + + + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G + should only read the compressed/uncompressed size from the Zip64 format if + the size from normal header was 0xFFFFFFFF + Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Patch created by Daniel Borca + + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + + Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson + +*/ + + +#include +#include +#include + +#ifndef NOUNCRYPT + #define NOUNCRYPT +#endif + +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info64_internal_s +{ + ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ +} unz_file_info64_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + ZPOS64_T offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/ + ZPOS64_T total_out_64; + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ + ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip64_read_info_s; + + +/* unz64_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + int is64bitOpenFunction; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info64 gi; /* public global information */ + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + ZPOS64_T num_file; /* number of the current file in the zipfile*/ + ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/ + ZPOS64_T current_file_ok; /* flag about the usability of the current file*/ + ZPOS64_T central_pos; /* position of the beginning of the central dir*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info64 cur_file_info; /* public info about the current file in zip*/ + unz_file_info64_internal cur_file_info_internal; /* private info about it*/ + file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; + + int isZip64; + +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; +# endif +} unz64_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unz64local_getByte OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unz64local_getShort OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) +{ + uLong x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unz64local_getLong64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX)); + + +local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) +{ + ZPOS64_T x ; + int i = 0; + int err; + + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<8; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<16; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<24; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<32; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<40; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<48; + + if (err==UNZ_OK) + err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); + x |= ((ZPOS64_T)i)<<56; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, + const char* fileName2, + int iCaseSensitivity) + +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + + +/* + Locate the Central directory 64 of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T unz64local_SearchCentralDir64 OF(( + const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream)); + +local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK) + return 0; + + /* total number of disks */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) + return 0; + + if (uL != 0x06064b50) + return 0; + + return relativeOffset; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +local unzFile unzOpenInternal (const void *path, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def, + int is64bitOpenFunction) +{ + unz64_s us; + unz64_s *s; + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + us.z_filefunc.zseek32_file = NULL; + us.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&us.z_filefunc.zfile_func64); + else + us.z_filefunc = *pzlib_filefunc64_32_def; + us.is64bitOpenFunction = is64bitOpenFunction; + + + + us.filestream = ZOPEN64(us.z_filefunc, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream); + if (central_pos) + { + uLong uS; + ZPOS64_T uL64; + + us.isZip64 = 1; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* size of zip64 end of central directory record */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version made by */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* version needed to extract */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + us.gi.size_comment = 0; + } + else + { + central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + us.isZip64 = 0; + + if (ZSEEK64(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.gi.number_entry = uL; + + /* total number of entries in the central dir */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + number_entry_CD = uL; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.size_central_dir = uL; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + us.offset_central_dir = uL; + + /* zipfile comment length */ + if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + } + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE64(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + +extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) +{ + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + /* to do : check if number_entry is not truncated */ + pglobal_info32->number_entry = (uLong)s->gi.number_entry; + pglobal_info32->size_comment = s->gi.size_comment; + return UNZ_OK; +} +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) +{ + ZPOS64_T uDate; + uDate = (ZPOS64_T)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unz64local_GetCurrentFileInfoInternal (unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) +{ + unz64_s* s; + unz_file_info64 file_info; + unz_file_info64_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + uLong uL; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.compressed_size = uL; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info.uncompressed_size = uL; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + // relative offset of local header + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + file_info_internal.offset_curfile = uL; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + // Read extrafield + if ((err==UNZ_OK) && (extraField!=NULL)) + { + ZPOS64_T uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + + lSeek += file_info.size_file_extra - (uLong)uSizeRead; + } + else + lSeek += file_info.size_file_extra; + + + if ((err==UNZ_OK) && (file_info.size_file_extra != 0)) + { + uLong acc = 0; + + // since lSeek now points to after the extra field we need to move back + lSeek -= file_info.size_file_extra; + + if (lSeek!=0) + { + if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + while(acc < file_info.size_file_extra) + { + uLong headerId; + uLong dataSize; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK) + err=UNZ_ERRNO; + + /* ZIP64 extra fields */ + if (headerId == 0x0001) + { + uLong uL; + + if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == (ZPOS64_T)(unsigned long)-1) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == (ZPOS64_T)(unsigned long)-1) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == (unsigned long)-1) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) + err=UNZ_ERRNO; + } + + } + else + { + if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0) + err=UNZ_ERRNO; + } + + acc += 2 + 2 + dataSize; + } + } + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + } + + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) +{ + int err; + unz_file_info64 file_info64; + err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); + if (err==UNZ_OK) + { + pfile_info->version = file_info64.version; + pfile_info->version_needed = file_info64.version_needed; + pfile_info->flag = file_info64.flag; + pfile_info->compression_method = file_info64.compression_method; + pfile_info->dosDate = file_info64.dosDate; + pfile_info->crc = file_info64.crc; + + pfile_info->size_filename = file_info64.size_filename; + pfile_info->size_file_extra = file_info64.size_file_extra; + pfile_info->size_file_comment = file_info64.size_file_comment; + + pfile_info->disk_num_start = file_info64.disk_num_start; + pfile_info->internal_fa = file_info64.internal_fa; + pfile_info->external_fa = file_info64.external_fa; + + pfile_info->tmu_date = file_info64.tmu_date, + + + pfile_info->compressed_size = (uLong)file_info64.compressed_size; + pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size; + + } + return err; +} +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (unzFile file) +{ + int err=UNZ_OK; + unz64_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (unzFile file) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) +{ + unz64_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info64 cur_file_infoSaved; + unz_file_info64_internal cur_file_info_internalSaved; + ZPOS64_T num_fileSaved; + ZPOS64_T pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo64(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; // offset in file + ZPOS64_T num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) +{ + unz64_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + int err = unzGetFilePos64(file,&file_pos64); + if (err==UNZ_OK) + { + file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory; + file_pos->num_of_file = (uLong)file_pos64.num_of_file; + } + return err; +} + +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) +{ + unz64_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos) +{ + unz64_file_pos file_pos64; + if (file_pos == NULL) + return UNZ_PARAMERROR; + + file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory; + file_pos64.num_of_file = file_pos->num_of_file; + return unzGoToFilePos64(file,&file_pos64); +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + { + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + } + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, + int* level, int raw, const char* password) +{ + int err=UNZ_OK; + uInt iSizeVar; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + ZPOS64_T offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && +/* #ifdef HAVE_BZIP2 */ + (s->cur_file_info.compression_method!=Z_BZIP2ED) && +/* #endif */ + (s->cur_file_info.compression_method!=Z_DEFLATED)) + + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->total_out_64=0; + pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw)) + { +#ifdef HAVE_BZIP2 + pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0; + pfile_in_zip_read_info->bstream.bzfree = (free_func)0; + pfile_in_zip_read_info->bstream.opaque = (voidpf)0; + pfile_in_zip_read_info->bstream.state = (voidpf)0; + + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } +#else + pfile_in_zip_read_info->raw=1; +#endif + } + else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = 0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + s->encrypted = 0; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK64(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (unzFile file) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + s=(unz64_s*)file; + if (file==NULL) + return 0; //UNZ_PARAMERROR; + pfile_in_zip_read_info=s->pfile_in_zip_read; + if (pfile_in_zip_read_info==NULL) + return 0; //UNZ_PARAMERROR; + return pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile; +} + +/** Addition for GDAL : END */ + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) +{ + int err=UNZ_OK; + uInt iRead = 0; + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->read_buffer == NULL)) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + + pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in; + pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in; + pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in; + pfile_in_zip_read_info->bstream.total_in_hi32 = 0; + pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out; + pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out; + pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out; + pfile_in_zip_read_info->bstream.total_out_hi32 = 0; + + uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32; + bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out; + + err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream); + + uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); + pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in; + pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in; + pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32; + pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out; + pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out; + pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32; + + if (err==BZ_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=BZ_OK) + break; +#endif + } // end Z_BZIP2ED + else + { + ZPOS64_T uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + ZPOS64_T uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + +extern ZPOS64_T ZEXPORT unztell64 (unzFile file) +{ + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return (ZPOS64_T)-1; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return (ZPOS64_T)-1; + + return pfile_in_zip_read_info->total_out_64; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (unzFile file) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* +Read extra field from the current file (opened by unzOpenCurrentFile) +This is the local-header version of the extra field (sometimes, there is +more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) +{ + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + uInt read_now; + ZPOS64_T size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD64(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (unzFile file) +{ + int err=UNZ_OK; + + unz64_s* s; + file_in_zip64_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) + inflateEnd(&pfile_in_zip_read_info->stream); +#ifdef HAVE_BZIP2 + else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED) + BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream); +#endif + + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) +{ + unz64_s* s; + uLong uReadThis ; + if (file==NULL) + return (int)UNZ_PARAMERROR; + s=(unz64_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) +{ + unz64_s* s; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + s=(unz64_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern uLong ZEXPORT unzGetOffset (unzFile file) +{ + ZPOS64_T offset64; + + if (file==NULL) + return 0; //UNZ_PARAMERROR; + offset64 = unzGetOffset64(file); + return (uLong)offset64; +} + +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) +{ + unz64_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz64_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) +{ + return unzSetOffset64(file,pos); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/unzip.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/unzip.h new file mode 100644 index 0000000000..3183968b77 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/unzip.h @@ -0,0 +1,437 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications of Unzip for Zip64 + Copyright (C) 2007-2008 Even Rouault + + Modifications for Zip64 support on both zip and unzip + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------------- + + Changes + + See header of unzip64.c + +*/ + +#ifndef _unz64_H +#define _unz64_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info64_s +{ + ZPOS64_T number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info64; + +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info64_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + ZPOS64_T compressed_size; /* compressed size 8 bytes */ + ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info64; + +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. + the "64" function take a const void* pointer, because the path is just the + value passed to the open64_file_func callback. + Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path + is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char* + does not describe the reality +*/ + + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, + zlib_filefunc64_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unz64Open, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); + +extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, + unz_global_info64 *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +typedef struct unz64_file_pos_s +{ + ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */ + ZPOS64_T num_of_file; /* # of file */ +} unz64_file_pos; + +extern int ZEXPORT unzGetFilePos64( + unzFile file, + unz64_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos64( + unzFile file, + const unz64_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + + +/** Addition for GDAL : START */ + +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); + +/** Addition for GDAL : END */ + + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); + +extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file); +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos); +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz64_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/zip.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/zip.c new file mode 100644 index 0000000000..3c34fc8bd4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/zip.c @@ -0,0 +1,2004 @@ +/* zip.c -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + Changes + Oct-2009 - Mathias Svensson - Remove old C style function prototypes + Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives + Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. + Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data + It is used when recreting zip archive with RAW when deleting items from a zip. + ZIP64 data is automaticly added to items that needs it, and existing ZIP64 data need to be removed. + Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) + Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer + +*/ + + +#include +#include +#include +#include +#include "zlib.h" +#include "zip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +#ifndef VERSIONMADEBY +# define VERSIONMADEBY (0x0) /* platform depedent */ +#endif + +#ifndef Z_BUFSIZE +#define Z_BUFSIZE (64*1024) //(16384) +#endif + +#ifndef Z_MAXFILENAMEINZIP +#define Z_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +/* +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) +*/ + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + + +// NOT sure that this work on ALL platform +#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32)) + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +#ifndef DEF_MEM_LEVEL +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +#endif +const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + + +#define SIZEDATA_INDATABLOCK (4096-(4*4)) + +#define LOCALHEADERMAGIC (0x04034b50) +#define CENTRALHEADERMAGIC (0x02014b50) +#define ENDHEADERMAGIC (0x06054b50) +#define ZIP64ENDHEADERMAGIC (0x6064b50) +#define ZIP64ENDLOCHEADERMAGIC (0x7064b50) + +#define FLAG_LOCALHEADER_OFFSET (0x06) +#define CRC_LOCALHEADER_OFFSET (0x0e) + +#define SIZECENTRALHEADER (0x2e) /* 46 */ + +typedef struct linkedlist_datablock_internal_s +{ + struct linkedlist_datablock_internal_s* next_datablock; + uLong avail_in_this_block; + uLong filled_in_this_block; + uLong unused; /* for future use and alignement */ + unsigned char data[SIZEDATA_INDATABLOCK]; +} linkedlist_datablock_internal; + +typedef struct linkedlist_data_s +{ + linkedlist_datablock_internal* first_block; + linkedlist_datablock_internal* last_block; +} linkedlist_data; + + +typedef struct +{ + z_stream stream; /* zLib stream structure for inflate */ +#ifdef HAVE_BZIP2 + bz_stream bstream; /* bzLib stream structure for bziped */ +#endif + + int stream_initialised; /* 1 is stream is initialised */ + uInt pos_in_buffered_data; /* last written byte in buffered_data */ + + ZPOS64_T pos_local_header; /* offset of the local header of the file + currenty writing */ + char* central_header; /* central header data for the current file */ + uLong size_centralExtra; + uLong size_centralheader; /* size of the central header for cur file */ + uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ + uLong flag; /* flag of the file currently writing */ + + int method; /* compression method of file currenty wr.*/ + int raw; /* 1 for directly writing raw data */ + Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ + uLong dosDate; + uLong crc32; + int encrypt; + int zip64; /* Add ZIP64 extened information in the extra field */ + ZPOS64_T pos_zip64extrainfo; + ZPOS64_T totalCompressedData; + ZPOS64_T totalUncompressedData; +#ifndef NOCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; + int crypt_header_size; +#endif +} curfile64_info; + +typedef struct +{ + zlib_filefunc64_32_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + linkedlist_data central_dir;/* datablock with central dir in construction*/ + int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ + curfile64_info ci; /* info on the file curretly writing */ + + ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ + ZPOS64_T add_position_when_writting_offset; + ZPOS64_T number_entry; + +#ifndef NO_ADDFILEINEXISTINGZIP + char *globalcomment; +#endif + +} zip64_internal; + + +#ifndef NOCRYPT +#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED +#include "crypt.h" +#endif + +local linkedlist_datablock_internal* allocate_new_datablock() +{ + linkedlist_datablock_internal* ldi; + ldi = (linkedlist_datablock_internal*) + ALLOC(sizeof(linkedlist_datablock_internal)); + if (ldi!=NULL) + { + ldi->next_datablock = NULL ; + ldi->filled_in_this_block = 0 ; + ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; + } + return ldi; +} + +local void free_datablock(linkedlist_datablock_internal* ldi) +{ + while (ldi!=NULL) + { + linkedlist_datablock_internal* ldinext = ldi->next_datablock; + TRYFREE(ldi); + ldi = ldinext; + } +} + +local void init_linkedlist(linkedlist_data* ll) +{ + ll->first_block = ll->last_block = NULL; +} + +local void free_linkedlist(linkedlist_data* ll) +{ + free_datablock(ll->first_block); + ll->first_block = ll->last_block = NULL; +} + + +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) +{ + linkedlist_datablock_internal* ldi; + const unsigned char* from_copy; + + if (ll==NULL) + return ZIP_INTERNALERROR; + + if (ll->last_block == NULL) + { + ll->first_block = ll->last_block = allocate_new_datablock(); + if (ll->first_block == NULL) + return ZIP_INTERNALERROR; + } + + ldi = ll->last_block; + from_copy = (unsigned char*)buf; + + while (len>0) + { + uInt copy_this; + uInt i; + unsigned char* to_copy; + + if (ldi->avail_in_this_block==0) + { + ldi->next_datablock = allocate_new_datablock(); + if (ldi->next_datablock == NULL) + return ZIP_INTERNALERROR; + ldi = ldi->next_datablock ; + ll->last_block = ldi; + } + + if (ldi->avail_in_this_block < len) + copy_this = (uInt)ldi->avail_in_this_block; + else + copy_this = (uInt)len; + + to_copy = &(ldi->data[ldi->filled_in_this_block]); + + for (i=0;ifilled_in_this_block += copy_this; + ldi->avail_in_this_block -= copy_this; + from_copy += copy_this ; + len -= copy_this; + } + return ZIP_OK; +} + + + +/****************************************************************************/ + +#ifndef NO_ADDFILEINEXISTINGZIP +/* =========================================================================== + Inputs a long in LSB order to the given file + nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) +*/ + +local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); +local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) +{ + unsigned char buf[8]; + int n; + for (n = 0; n < nbByte; n++) + { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + if (x != 0) + { /* data overflow - hack for ZIP64 (X Roche) */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } + + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + return ZIP_ERRNO; + else + return ZIP_OK; +} + +local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) +{ + unsigned char* buf=(unsigned char*)dest; + int n; + for (n = 0; n < nbByte; n++) { + buf[n] = (unsigned char)(x & 0xff); + x >>= 8; + } + + if (x != 0) + { /* data overflow - hack for ZIP64 */ + for (n = 0; n < nbByte; n++) + { + buf[n] = 0xff; + } + } +} + +/****************************************************************************/ + + +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) +{ + uLong year = (uLong)ptm->tm_year; + if (year>=1980) + year-=1980; + else if (year>=80) + year-=80; + return + (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | + ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); +} + + +/****************************************************************************/ + +local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); + +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) +{ + unsigned char c; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return ZIP_OK; + } + else + { + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return ZIP_ERRNO; + else + return ZIP_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); + +local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) +{ + uLong x ; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); + + +local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) +{ + ZPOS64_T x; + int i = 0; + int err; + + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x = (ZPOS64_T)i; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<8; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<16; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<24; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<32; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<40; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<48; + + if (err==ZIP_OK) + err = zip64local_getByte(pzlib_filefunc_def,filestream,&i); + x += ((ZPOS64_T)i)<<56; + + if (err==ZIP_OK) + *pX = x; + else + *pX = 0; + + return err; +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* +Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before +the global comment) +*/ +local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); + +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) +{ + unsigned char* buf; + ZPOS64_T uSizeFile; + ZPOS64_T uBackRead; + ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ + ZPOS64_T uPosFound=0; + uLong uL; + ZPOS64_T relativeOffset; + + if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos); + if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + { + // Signature "0x07064b50" Zip64 end of central directory locater + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) + { + uPosFound = uReadPos+i; + break; + } + } + + if (uPosFound!=0) + break; + } + + TRYFREE(buf); + if (uPosFound == 0) + return 0; + + /* Zip64 end of central directory locator */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature, already checked */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + /* number of the disk with the start of the zip64 end of central directory */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 0) + return 0; + + /* relative offset of the zip64 end of central directory record */ + if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK) + return 0; + + /* total number of disks */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + if (uL != 1) + return 0; + + /* Goto Zip64 end of central directory record */ + if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0) + return 0; + + /* the signature */ + if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) + return 0; + + if (uL != 0x06064b50) // signature of 'Zip64 end of central directory' + return 0; + + return relativeOffset; +} + +int LoadCentralDirectoryRecord(zip64_internal* pziinit) +{ + int err=ZIP_OK; + ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + + ZPOS64_T size_central_dir; /* size of the central directory */ + ZPOS64_T offset_central_dir; /* offset of start of central directory */ + ZPOS64_T central_pos; + uLong uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + ZPOS64_T number_entry; + ZPOS64_T number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + uLong VersionMadeBy; + uLong VersionNeeded; + uLong size_comment; + + int hasZIP64Record = 0; + + // check first if we find a ZIP64 record + central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream); + if(central_pos > 0) + { + hasZIP64Record = 1; + } + else if(central_pos == 0) + { + central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream); + } + +/* disable to allow appending to empty ZIP archive + if (central_pos==0) + err=ZIP_ERRNO; +*/ + + if(hasZIP64Record) + { + ZPOS64_T sizeEndOfCentralDirectory; + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* size of zip64 end of central directory record */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version made by */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK) + err=ZIP_ERRNO; + + /* version needed to extract */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory on this disk */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK) + err=ZIP_ERRNO; + + // TODO.. + // read the comment from the standard central header. + size_comment = 0; + } + else + { + // Read End of central Directory info + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=ZIP_ERRNO; + + /* the signature, already checked */ + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of this disk */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK) + err=ZIP_ERRNO; + + /* number of the disk with the start of the central directory */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK) + err=ZIP_ERRNO; + + /* total number of entries in the central dir on this disk */ + number_entry = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry = uL; + + /* total number of entries in the central dir */ + number_entry_CD = 0; + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + number_entry_CD = uL; + + if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) + err=ZIP_BADZIPFILE; + + /* size of the central directory */ + size_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + size_central_dir = uL; + + /* offset of start of central directory with respect to the starting disk number */ + offset_central_dir = 0; + if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK) + err=ZIP_ERRNO; + else + offset_central_dir = uL; + + + /* zipfile global comment length */ + if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK) + err=ZIP_ERRNO; + } + + if ((central_posz_filefunc, pziinit->filestream); + return ZIP_ERRNO; + } + + if (size_comment>0) + { + pziinit->globalcomment = (char*)ALLOC(size_comment+1); + if (pziinit->globalcomment) + { + size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment); + pziinit->globalcomment[size_comment]=0; + } + } + + byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); + pziinit->add_position_when_writting_offset = byte_before_the_zipfile; + + { + ZPOS64_T size_central_dir_to_read = size_central_dir; + size_t buf_size = SIZEDATA_INDATABLOCK; + void* buf_read = (void*)ALLOC(buf_size); + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + while ((size_central_dir_to_read>0) && (err==ZIP_OK)) + { + ZPOS64_T read_this = SIZEDATA_INDATABLOCK; + if (read_this > size_central_dir_to_read) + read_this = size_central_dir_to_read; + + if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this) + err=ZIP_ERRNO; + + if (err==ZIP_OK) + err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this); + + size_central_dir_to_read-=read_this; + } + TRYFREE(buf_read); + } + pziinit->begin_pos = byte_before_the_zipfile; + pziinit->number_entry = number_entry_CD; + + if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0) + err=ZIP_ERRNO; + + return err; +} + + +#endif /* !NO_ADDFILEINEXISTINGZIP*/ + + +/************************************************************/ +extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) +{ + zip64_internal ziinit; + zip64_internal* zi; + int err=ZIP_OK; + + ziinit.z_filefunc.zseek32_file = NULL; + ziinit.z_filefunc.ztell32_file = NULL; + if (pzlib_filefunc64_32_def==NULL) + fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + else + ziinit.z_filefunc = *pzlib_filefunc64_32_def; + + ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + pathname, + (append == APPEND_STATUS_CREATE) ? + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : + (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); + + if (ziinit.filestream == NULL) + return NULL; + + if (append == APPEND_STATUS_CREATEAFTER) + ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + + ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); + ziinit.in_opened_file_inzip = 0; + ziinit.ci.stream_initialised = 0; + ziinit.number_entry = 0; + ziinit.add_position_when_writting_offset = 0; + init_linkedlist(&(ziinit.central_dir)); + + + + zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); + if (zi==NULL) + { + ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); + return NULL; + } + + /* now we add file in a zipfile */ +# ifndef NO_ADDFILEINEXISTINGZIP + ziinit.globalcomment = NULL; + if (append == APPEND_STATUS_ADDINZIP) + { + // Read and Cache Central Directory Records + err = LoadCentralDirectoryRecord(&ziinit); + } + + if (globalcomment) + { + *globalcomment = ziinit.globalcomment; + } +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + + if (err != ZIP_OK) + { +# ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(ziinit.globalcomment); +# endif /* !NO_ADDFILEINEXISTINGZIP*/ + TRYFREE(zi); + return NULL; + } + else + { + *zi = ziinit; + return (zipFile)zi; + } +} + +extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) +{ + if (pzlib_filefunc32_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def); + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + +extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) +{ + if (pzlib_filefunc_def != NULL) + { + zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; + zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def; + zlib_filefunc64_32_def_fill.ztell32_file = NULL; + zlib_filefunc64_32_def_fill.zseek32_file = NULL; + return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill); + } + else + return zipOpen3(pathname, append, globalcomment, NULL); +} + + + +extern zipFile ZEXPORT zipOpen (const char* pathname, int append) +{ + return zipOpen3((const void*)pathname,append,NULL,NULL); +} + +extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) +{ + return zipOpen3(pathname,append,NULL,NULL); +} + +int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) +{ + /* write the local header */ + int err; + uInt size_filename = (uInt)strlen(filename); + uInt size_extrafield = size_extrafield_local; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4); + + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); + + // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ + } + if (err==ZIP_OK) + { + if(zi->ci.zip64) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */ + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); + + if(zi->ci.zip64) + { + size_extrafield += 20; + } + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2); + + if ((err==ZIP_OK) && (size_filename > 0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) + err = ZIP_ERRNO; + } + + if ((err==ZIP_OK) && (size_extrafield_local > 0)) + { + if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local) + err = ZIP_ERRNO; + } + + + if ((err==ZIP_OK) && (zi->ci.zip64)) + { + // write the Zip64 extended info + short HeaderID = 1; + short DataSize = 16; + ZPOS64_T CompressedSize = 0; + ZPOS64_T UncompressedSize = 0; + + // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) + zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); + } + + return err; +} + +/* + NOTE. + When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped + before calling this function it can be done with zipRemoveExtraInfoBlock + + It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize + unnecessary allocations. + */ +extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) +{ + zip64_internal* zi; + uInt size_filename; + uInt size_comment; + uInt i; + int err = ZIP_OK; + +# ifdef NOCRYPT + if (password != NULL) + return ZIP_PARAMERROR; +# endif + + if (file == NULL) + return ZIP_PARAMERROR; + +#ifdef HAVE_BZIP2 + if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED)) + return ZIP_PARAMERROR; +#else + if ((method!=0) && (method!=Z_DEFLATED)) + return ZIP_PARAMERROR; +#endif + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + if (err != ZIP_OK) + return err; + } + + if (filename==NULL) + filename="-"; + + if (comment==NULL) + size_comment = 0; + else + size_comment = (uInt)strlen(comment); + + size_filename = (uInt)strlen(filename); + + if (zipfi == NULL) + zi->ci.dosDate = 0; + else + { + if (zipfi->dosDate != 0) + zi->ci.dosDate = zipfi->dosDate; + else + zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date); + } + + zi->ci.flag = flagBase; + if ((level==8) || (level==9)) + zi->ci.flag |= 2; + if ((level==2)) + zi->ci.flag |= 4; + if ((level==1)) + zi->ci.flag |= 6; + if (password != NULL) + zi->ci.flag |= 1; + + zi->ci.crc32 = 0; + zi->ci.method = method; + zi->ci.encrypt = 0; + zi->ci.stream_initialised = 0; + zi->ci.pos_in_buffered_data = 0; + zi->ci.raw = raw; + zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream); + + zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; + zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data + + zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree); + + zi->ci.size_centralExtra = size_extrafield_global; + zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); + /* version info */ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2); + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); + zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); + zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); + zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); + zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ + zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ + zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); + zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); + zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); + else + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); + + if (zipfi==NULL) + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); + + if(zi->ci.pos_local_header >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); + else + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset,4); + + for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = + *(((const char*)extrafield_global)+i); + + for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ + size_extrafield_global+i) = *(comment+i); + if (zi->ci.central_header == NULL) + return ZIP_INTERNALERROR; + + zi->ci.zip64 = zip64; + zi->ci.totalCompressedData = 0; + zi->ci.totalUncompressedData = 0; + zi->ci.pos_zip64extrainfo = 0; + + err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local); + +#ifdef HAVE_BZIP2 + zi->ci.bstream.avail_in = (uInt)0; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + zi->ci.bstream.total_in_hi32 = 0; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_out_hi32 = 0; + zi->ci.bstream.total_out_lo32 = 0; +#endif + + zi->ci.stream.avail_in = (uInt)0; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + zi->ci.stream.total_in = 0; + zi->ci.stream.total_out = 0; + zi->ci.stream.data_type = Z_BINARY; + +#ifdef HAVE_BZIP2 + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) +#else + if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) +#endif + { + if(zi->ci.method == Z_DEFLATED) + { + zi->ci.stream.zalloc = (alloc_func)0; + zi->ci.stream.zfree = (free_func)0; + zi->ci.stream.opaque = (voidpf)0; + + if (windowBits>0) + windowBits = -windowBits; + + err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); + + if (err==Z_OK) + zi->ci.stream_initialised = Z_DEFLATED; + } + else if(zi->ci.method == Z_BZIP2ED) + { +#ifdef HAVE_BZIP2 + // Init BZip stuff here + zi->ci.bstream.bzalloc = 0; + zi->ci.bstream.bzfree = 0; + zi->ci.bstream.opaque = (voidpf)0; + + err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35); + if(err == BZ_OK) + zi->ci.stream_initialised = Z_BZIP2ED; +#endif + } + + } + +# ifndef NOCRYPT + zi->ci.crypt_header_size = 0; + if ((err==Z_OK) && (password != NULL)) + { + unsigned char bufHead[RAND_HEAD_LEN]; + unsigned int sizeHead; + zi->ci.encrypt = 1; + zi->ci.pcrc_32_tab = get_crc_table(); + /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ + + sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); + zi->ci.crypt_header_size = sizeHead; + + if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) + err = ZIP_ERRNO; + } +# endif + + if (err==Z_OK) + zi->in_opened_file_inzip = 1; + return err; +} + +extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) +{ + return zipOpenNewFileInZip4_64 (file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); +} + +local int zip64FlushWriteBuffer(zip64_internal* zi) +{ + int err=ZIP_OK; + + if (zi->ci.encrypt != 0) + { +#ifndef NOCRYPT + uInt i; + int t; + for (i=0;ici.pos_in_buffered_data;i++) + zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); +#endif + } + + if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data) + err = ZIP_ERRNO; + + zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data; + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED) + { + zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32; + zi->ci.bstream.total_in_lo32 = 0; + zi->ci.bstream.total_in_hi32 = 0; + } + else +#endif + { + zi->ci.totalUncompressedData += zi->ci.stream.total_in; + zi->ci.stream.total_in = 0; + } + + + zi->ci.pos_in_buffered_data = 0; + + return err; +} + +extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) +{ + zip64_internal* zi; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + + zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len); + +#ifdef HAVE_BZIP2 + if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw)) + { + zi->ci.bstream.next_in = (void*)buf; + zi->ci.bstream.avail_in = len; + err = BZ_RUN_OK; + + while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0)) + { + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + + + if(err != BZ_RUN_OK) + break; + + if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32; +// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN); + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ; + } + } + + if(err == BZ_RUN_OK) + err = ZIP_OK; + } + else +#endif + { + zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.avail_in = len; + + while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) + { + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + + + if(err != ZIP_OK) + break; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + uLong uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_NO_FLUSH); + if(uTotalOutBefore > zi->ci.stream.total_out) + { + int bBreak = 0; + bBreak++; + } + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + else + { + uInt copy_this,i; + if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) + copy_this = zi->ci.stream.avail_in; + else + copy_this = zi->ci.stream.avail_out; + + for (i = 0; i < copy_this; i++) + *(((char*)zi->ci.stream.next_out)+i) = + *(((const char*)zi->ci.stream.next_in)+i); + { + zi->ci.stream.avail_in -= copy_this; + zi->ci.stream.avail_out-= copy_this; + zi->ci.stream.next_in+= copy_this; + zi->ci.stream.next_out+= copy_this; + zi->ci.stream.total_in+= copy_this; + zi->ci.stream.total_out+= copy_this; + zi->ci.pos_in_buffered_data += copy_this; + } + } + }// while(...) + } + + return err; +} + +extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) +{ + return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); +} + +extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) +{ + zip64_internal* zi; + ZPOS64_T compressed_size; + uLong invalidValue = 0xffffffff; + short datasize = 0; + int err=ZIP_OK; + + if (file == NULL) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 0) + return ZIP_PARAMERROR; + zi->ci.stream.avail_in = 0; + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + while (err==ZIP_OK) + { + uLong uTotalOutBefore; + if (zi->ci.stream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.stream.next_out = zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.stream.total_out; + err=deflate(&zi->ci.stream, Z_FINISH); + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; + } + } + else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { +#ifdef HAVE_BZIP2 + err = BZ_FINISH_OK; + while (err==BZ_FINISH_OK) + { + uLong uTotalOutBefore; + if (zi->ci.bstream.avail_out == 0) + { + if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO) + err = ZIP_ERRNO; + zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE; + zi->ci.bstream.next_out = (char*)zi->ci.buffered_data; + } + uTotalOutBefore = zi->ci.bstream.total_out_lo32; + err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH); + if(err == BZ_STREAM_END) + err = Z_STREAM_END; + + zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore); + } + + if(err == BZ_FINISH_OK) + err = ZIP_OK; +#endif + } + + if (err==Z_STREAM_END) + err=ZIP_OK; /* this is normal */ + + if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) + { + if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO) + err = ZIP_ERRNO; + } + + if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) + { + int tmp_err = deflateEnd(&zi->ci.stream); + if (err == ZIP_OK) + err = tmp_err; + zi->ci.stream_initialised = 0; + } +#ifdef HAVE_BZIP2 + else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw)) + { + int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream); + if (err==ZIP_OK) + err = tmperr; + zi->ci.stream_initialised = 0; + } +#endif + + if (!zi->ci.raw) + { + crc32 = (uLong)zi->ci.crc32; + uncompressed_size = zi->ci.totalUncompressedData; + } + compressed_size = zi->ci.totalCompressedData; + +# ifndef NOCRYPT + compressed_size += zi->ci.crypt_header_size; +# endif + + // update Current Item crc and sizes, + if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) + { + /*version Made by*/ + zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2); + /*version needed*/ + zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2); + + } + + zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ + + + if(compressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ + + /// set internal file attributes field + if (zi->ci.stream.data_type == Z_ASCII) + zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); + + if(uncompressed_size >= 0xffffffff) + zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/ + else + zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ + + // Add ZIP64 extra info field for uncompressed size + if(uncompressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for compressed size + if(compressed_size >= 0xffffffff) + datasize += 8; + + // Add ZIP64 extra info field for relative offset to local file header of current file + if(zi->ci.pos_local_header >= 0xffffffff) + datasize += 8; + + if(datasize > 0) + { + char* p = NULL; + + if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) + { + // we can not write more data to the buffer that we have room for. + return ZIP_BADZIPFILE; + } + + p = zi->ci.central_header + zi->ci.size_centralheader; + + // Add Extra Information Header for 'ZIP64 information' + zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID + p += 2; + zip64local_putValue_inmemory(p, datasize, 2); // DataSize + p += 2; + + if(uncompressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, uncompressed_size, 8); + p += 8; + } + + if(compressed_size >= 0xffffffff) + { + zip64local_putValue_inmemory(p, compressed_size, 8); + p += 8; + } + + if(zi->ci.pos_local_header >= 0xffffffff) + { + zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8); + p += 8; + } + + // Update how much extra free space we got in the memory buffer + // and increase the centralheader size so the new ZIP64 fields are included + // ( 4 below is the size of HeaderID and DataSize field ) + zi->ci.size_centralExtraFree -= datasize + 4; + zi->ci.size_centralheader += datasize + 4; + + // Update the extra info size field + zi->ci.size_centralExtra += datasize + 4; + zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2); + } + + if (err==ZIP_OK) + err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader); + + free(zi->ci.central_header); + + if (err==ZIP_OK) + { + // Update the LocalFileHeader with the new values. + + ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ + + if(uncompressed_size >= 0xffffffff) + { + if(zi->ci.pos_zip64extrainfo > 0) + { + // Update the size in the ZIP64 extended field. + if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8); + } + } + else + { + if (err==ZIP_OK) /* compressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); + + if (err==ZIP_OK) /* uncompressed size, unknown */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); + } + + if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) + err = ZIP_ERRNO; + } + + zi->number_entry ++; + zi->in_opened_file_inzip = 0; + + return err; +} + +extern int ZEXPORT zipCloseFileInZip (zipFile file) +{ + return zipCloseFileInZipRaw (file,0,0); +} + +int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) +{ + int err = ZIP_OK; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); + + /*num disks*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + /*relative offset*/ + if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8); + + /*total disks*/ /* Do not support spawning of disk so always say 1 here*/ + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4); + + return err; +} + +int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + uLong Zip64DataSize = 44; + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ? + + if (err==ZIP_OK) /* version made by */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* version needed */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* total number of entries in the central dir */ + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8); + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); + } + return err; +} +int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) +{ + int err = ZIP_OK; + + /*signature*/ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); + + if (err==ZIP_OK) /* number of this disk */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* number of the disk with the start of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); + + if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ + { + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + } + + if (err==ZIP_OK) /* total number of entries in the central dir */ + { + if(zi->number_entry >= 0xFFFF) + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); + } + + if (err==ZIP_OK) /* size of the central directory */ + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); + + if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ + { + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + if(pos >= 0xffffffff) + { + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); + } + else + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); + } + + return err; +} + +int Write_GlobalComment(zip64_internal* zi, const char* global_comment) +{ + int err = ZIP_OK; + uInt size_global_comment = 0; + + if(global_comment != NULL) + size_global_comment = (uInt)strlen(global_comment); + + err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); + + if (err == ZIP_OK && size_global_comment > 0) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment) + err = ZIP_ERRNO; + } + return err; +} + +extern int ZEXPORT zipClose (zipFile file, const char* global_comment) +{ + zip64_internal* zi; + int err = 0; + uLong size_centraldir = 0; + ZPOS64_T centraldir_pos_inzip; + ZPOS64_T pos; + + if (file == NULL) + return ZIP_PARAMERROR; + + zi = (zip64_internal*)file; + + if (zi->in_opened_file_inzip == 1) + { + err = zipCloseFileInZip (file); + } + +#ifndef NO_ADDFILEINEXISTINGZIP + if (global_comment==NULL) + global_comment = zi->globalcomment; +#endif + + centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream); + + if (err==ZIP_OK) + { + linkedlist_datablock_internal* ldi = zi->central_dir.first_block; + while (ldi!=NULL) + { + if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) + { + if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block) + err = ZIP_ERRNO; + } + + size_centraldir += ldi->filled_in_this_block; + ldi = ldi->next_datablock; + } + } + free_linkedlist(&(zi->central_dir)); + + pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + if(pos >= 0xffffffff) + { + ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); + Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos); + } + + if (err==ZIP_OK) + err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); + + if(err == ZIP_OK) + err = Write_GlobalComment(zi, global_comment); + + if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0) + if (err == ZIP_OK) + err = ZIP_ERRNO; + +#ifndef NO_ADDFILEINEXISTINGZIP + TRYFREE(zi->globalcomment); +#endif + TRYFREE(zi); + + return err; +} + +extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) +{ + char* p = pData; + int size = 0; + char* pNewHeader; + char* pTmp; + short header; + short dataSize; + + int retVal = ZIP_OK; + + if(pData == NULL || *dataLen < 4) + return ZIP_PARAMERROR; + + pNewHeader = (char*)ALLOC(*dataLen); + pTmp = pNewHeader; + + while(p < (pData + *dataLen)) + { + header = *(short*)p; + dataSize = *(((short*)p)+1); + + if( header == sHeader ) // Header found. + { + p += dataSize + 4; // skip it. do not copy to temp buffer + } + else + { + // Extra Info block should not be removed, So copy it to the temp buffer. + memcpy(pTmp, p, dataSize + 4); + p += dataSize + 4; + size += dataSize + 4; + } + + } + + if(size < *dataLen) + { + // clean old extra info block. + memset(pData,0, *dataLen); + + // copy the new extra info block over the old + if(size > 0) + memcpy(pData, pNewHeader, size); + + // set the new extra info size + *dataLen = size; + + retVal = ZIP_OK; + } + else + retVal = ZIP_ERRNO; + + TRYFREE(pNewHeader); + + return retVal; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/zip.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/zip.h new file mode 100644 index 0000000000..8aaebb6234 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/minizip/zip.h @@ -0,0 +1,362 @@ +/* zip.h -- IO on .zip files using zlib + Version 1.1, February 14h, 2010 + part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html ) + + Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html ) + + Modifications for Zip64 support + Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com ) + + For more info read MiniZip_info.txt + + --------------------------------------------------------------------------- + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + --------------------------------------------------------------------------- + + Changes + + See header of zip.h + +*/ + +#ifndef _zip12_H +#define _zip12_H + +#ifdef __cplusplus +extern "C" { +#endif + +//#define HAVE_BZIP2 + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#ifdef HAVE_BZIP2 +#include "bzlib.h" +#endif + +#define Z_BZIP2ED 12 + +#if defined(STRICTZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagzipFile__ { int unused; } zipFile__; +typedef zipFile__ *zipFile; +#else +typedef voidp zipFile; +#endif + +#define ZIP_OK (0) +#define ZIP_EOF (0) +#define ZIP_ERRNO (Z_ERRNO) +#define ZIP_PARAMERROR (-102) +#define ZIP_BADZIPFILE (-103) +#define ZIP_INTERNALERROR (-104) + +#ifndef DEF_MEM_LEVEL +# if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +# else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +# endif +#endif +/* default memLevel */ + +/* tm_zip contain date/time info */ +typedef struct tm_zip_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_zip; + +typedef struct +{ + tm_zip tmz_date; /* date in understandable format */ + uLong dosDate; /* if dos_date == 0, tmu_date is used */ +/* uLong flag; */ /* general purpose bit flag 2 bytes */ + + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ +} zip_fileinfo; + +typedef const char* zipcharpc; + + +#define APPEND_STATUS_CREATE (0) +#define APPEND_STATUS_CREATEAFTER (1) +#define APPEND_STATUS_ADDINZIP (2) + +extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); +extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +/* + Create a zipfile. + pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on + an Unix computer "zlib/zlib113.zip". + if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip + will be created at the end of the file. + (useful if the file contain a self extractor code) + if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will + add files in existing zip (be sure you don't add file that doesn't exist) + If the zipfile cannot be opened, the return value is NULL. + Else, the return value is a zipFile Handle, usable with other function + of this zip package. +*/ + +/* Note : there is no delete function into a zipfile. + If you want delete file into a zipfile, you must open a zipfile, and create another + Of couse, you can use RAW reading and writing to copy the file you did not want delte +*/ + +extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def)); + +extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_def* pzlib_filefunc_def)); + +extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level)); + +extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64)); + +/* + Open a file in the ZIP for writing. + filename : the filename in zip (if NULL, '-' without quote will be used + *zipfi contain supplemental information + if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local + contains the extrafield data the the local header + if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global + contains the extrafield data the the local header + if comment != NULL, comment contain the comment string + method contain the compression method (0 for store, Z_DEFLATED for deflate) + level contain the level of compression (can be Z_DEFAULT_COMPRESSION) + zip64 is set to 1 if a zip64 extended information block should be added to the local file header. + this MUST be '1' if the uncompressed size is >= 0xffffffff. + +*/ + + +extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw)); + + +extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64)); +/* + Same than zipOpenNewFileInZip, except if raw=1, we write raw file + */ + +extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting)); + +extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64 + )); + +/* + Same than zipOpenNewFileInZip2, except + windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 + password : crypting password (NULL for no crypting) + crcForCrypting : crc of file to compress (needed for crypting) + */ + +extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase + )); + + +extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64 + )); +/* + Same than zipOpenNewFileInZip4, except + versionMadeBy : value for Version made by field + flag : value for flag field (compression level info will be added) + */ + + +extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, + const void* buf, + unsigned len)); +/* + Write data in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +/* + Close the current file in the zipfile +*/ + +extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, + uLong uncompressed_size, + uLong crc32)); + +extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32)); + +/* + Close the current file in the zipfile, for file opened with + parameter raw=1 in zipOpenNewFileInZip2 + uncompressed_size and crc32 are value for the uncompressed size +*/ + +extern int ZEXPORT zipClose OF((zipFile file, + const char* global_comment)); +/* + Close the zipfile +*/ + + +extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +/* + zipRemoveExtraInfoBlock - Added by Mathias Svensson + + Remove extra information block from a extra information data for the local file header or central directory header + + It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode. + + 0x0001 is the signature header for the ZIP64 extra information blocks + + usage. + Remove ZIP64 Extra information from a central director extra field data + zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001); + + Remove ZIP64 Extra information from a Local File Header extra field data + zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001); +*/ + +#ifdef __cplusplus +} +#endif + +#endif /* _zip64_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/example.pas b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/example.pas new file mode 100644 index 0000000000..5518b36a73 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/example.pas @@ -0,0 +1,599 @@ +(* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Pascal translation + * Copyright (C) 1998 by Jacques Nomssi Nzali. + * For conditions of distribution and use, see copyright notice in readme.txt + * + * Adaptation to the zlibpas interface + * Copyright (C) 2003 by Cosmin Truta. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +program example; + +{$DEFINE TEST_COMPRESS} +{DO NOT $DEFINE TEST_GZIO} +{$DEFINE TEST_DEFLATE} +{$DEFINE TEST_INFLATE} +{$DEFINE TEST_FLUSH} +{$DEFINE TEST_SYNC} +{$DEFINE TEST_DICT} + +uses SysUtils, zlibpas; + +const TESTFILE = 'foo.gz'; + +(* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + *) +const hello: PChar = 'hello, hello!'; + +const dictionary: PChar = 'hello'; + +var dictId: LongInt; (* Adler32 value of the dictionary *) + +procedure CHECK_ERR(err: Integer; msg: String); +begin + if err <> Z_OK then + begin + WriteLn(msg, ' error: ', err); + Halt(1); + end; +end; + +procedure EXIT_ERR(const msg: String); +begin + WriteLn('Error: ', msg); + Halt(1); +end; + +(* =========================================================================== + * Test compress and uncompress + *) +{$IFDEF TEST_COMPRESS} +procedure test_compress(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + err := compress(compr, comprLen, hello, len); + CHECK_ERR(err, 'compress'); + + StrCopy(PChar(uncompr), 'garbage'); + + err := uncompress(uncompr, uncomprLen, compr, comprLen); + CHECK_ERR(err, 'uncompress'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad uncompress') + else + WriteLn('uncompress(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test read/write of .gz files + *) +{$IFDEF TEST_GZIO} +procedure test_gzio(const fname: PChar; (* compressed file name *) + uncompr: Pointer; + uncomprLen: LongInt); +var err: Integer; + len: Integer; + zfile: gzFile; + pos: LongInt; +begin + len := StrLen(hello)+1; + + zfile := gzopen(fname, 'wb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + gzputc(zfile, 'h'); + if gzputs(zfile, 'ello') <> 4 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$IFDEF GZ_FORMAT_STRING} + if gzprintf(zfile, ', %s!', 'hello') <> 8 then + begin + WriteLn('gzprintf err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ELSE} + if gzputs(zfile, ', hello!') <> 8 then + begin + WriteLn('gzputs err: ', gzerror(zfile, err)); + Halt(1); + end; + {$ENDIF} + gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *) + gzclose(zfile); + + zfile := gzopen(fname, 'rb'); + if zfile = NIL then + begin + WriteLn('gzopen error'); + Halt(1); + end; + + StrCopy(PChar(uncompr), 'garbage'); + + if gzread(zfile, uncompr, uncomprLen) <> len then + begin + WriteLn('gzread err: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello) <> 0 then + begin + WriteLn('bad gzread: ', PChar(uncompr)); + Halt(1); + end + else + WriteLn('gzread(): ', PChar(uncompr)); + + pos := gzseek(zfile, -8, SEEK_CUR); + if (pos <> 6) or (gztell(zfile) <> pos) then + begin + WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile)); + Halt(1); + end; + + if gzgetc(zfile) <> ' ' then + begin + WriteLn('gzgetc error'); + Halt(1); + end; + + if gzungetc(' ', zfile) <> ' ' then + begin + WriteLn('gzungetc error'); + Halt(1); + end; + + gzgets(zfile, PChar(uncompr), uncomprLen); + uncomprLen := StrLen(PChar(uncompr)); + if uncomprLen <> 7 then (* " hello!" *) + begin + WriteLn('gzgets err after gzseek: ', gzerror(zfile, err)); + Halt(1); + end; + if StrComp(PChar(uncompr), hello + 6) <> 0 then + begin + WriteLn('bad gzgets after gzseek'); + Halt(1); + end + else + WriteLn('gzgets() after gzseek: ', PChar(uncompr)); + + gzclose(zfile); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with small buffers + *) +{$IFDEF TEST_DEFLATE} +procedure test_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: LongInt; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + + while (c_stream.total_in <> len) and + (c_stream.total_out < comprLen) do + begin + c_stream.avail_out := 1; { force small buffers } + c_stream.avail_in := 1; + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + end; + + (* Finish the stream, still forcing small buffers: *) + while TRUE do + begin + c_stream.avail_out := 1; + err := deflate(c_stream, Z_FINISH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'deflate'); + end; + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with small buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_inflate(compr: Pointer; comprLen : LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 0; + d_stream.next_out := uncompr; + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while (d_stream.total_out < uncomprLen) and + (d_stream.total_in < comprLen) do + begin + d_stream.avail_out := 1; (* force small buffers *) + d_stream.avail_in := 1; + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate') + else + WriteLn('inflate(): ', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with large buffers and dynamic change of compression level + *) +{$IFDEF TEST_DEFLATE} +procedure test_large_deflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_SPEED); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + (* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + *) + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + if c_stream.avail_in <> 0 then + EXIT_ERR('deflate not greedy'); + + (* Feed in already compressed data and switch to no compression: *) + deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in := compr; + c_stream.avail_in := Integer(comprLen div 2); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + (* Switch back to compressing mode: *) + deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in := uncompr; + c_stream.avail_in := Integer(uncomprLen); + err := deflate(c_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'deflate'); + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with large buffers + *) +{$IFDEF TEST_INFLATE} +procedure test_large_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + while TRUE do + begin + d_stream.next_out := uncompr; (* discard the output *) + d_stream.avail_out := Integer(uncomprLen); + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + CHECK_ERR(err, 'large inflate'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then + begin + WriteLn('bad large inflate: ', d_stream.total_out); + Halt(1); + end + else + WriteLn('large_inflate(): OK'); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with full flush + *) +{$IFDEF TEST_FLUSH} +procedure test_flush(compr: Pointer; var comprLen : LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; + len: Integer; +begin + len := StrLen(hello)+1; + + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + c_stream.next_in := hello; + c_stream.next_out := compr; + c_stream.avail_in := 3; + c_stream.avail_out := Integer(comprLen); + err := deflate(c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, 'deflate'); + + Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *) + c_stream.avail_in := len - 3; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + CHECK_ERR(err, 'deflate'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); + + comprLen := c_stream.total_out; +end; +{$ENDIF} + +(* =========================================================================== + * Test inflateSync() + *) +{$IFDEF TEST_SYNC} +procedure test_sync(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen : LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := 2; (* just read the zlib header *) + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + inflate(d_stream, Z_NO_FLUSH); + CHECK_ERR(err, 'inflate'); + + d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *) + err := inflateSync(d_stream); (* but skip the damaged part *) + CHECK_ERR(err, 'inflateSync'); + + err := inflate(d_stream, Z_FINISH); + if err <> Z_DATA_ERROR then + EXIT_ERR('inflate should report DATA_ERROR'); + (* Because of incorrect adler32 *) + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + WriteLn('after inflateSync(): hel', PChar(uncompr)); +end; +{$ENDIF} + +(* =========================================================================== + * Test deflate with preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_deflate(compr: Pointer; comprLen: LongInt); +var c_stream: z_stream; (* compression stream *) + err: Integer; +begin + c_stream.zalloc := NIL; + c_stream.zfree := NIL; + c_stream.opaque := NIL; + + err := deflateInit(c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, 'deflateInit'); + + err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary)); + CHECK_ERR(err, 'deflateSetDictionary'); + + dictId := c_stream.adler; + c_stream.next_out := compr; + c_stream.avail_out := Integer(comprLen); + + c_stream.next_in := hello; + c_stream.avail_in := StrLen(hello)+1; + + err := deflate(c_stream, Z_FINISH); + if err <> Z_STREAM_END then + EXIT_ERR('deflate should report Z_STREAM_END'); + + err := deflateEnd(c_stream); + CHECK_ERR(err, 'deflateEnd'); +end; +{$ENDIF} + +(* =========================================================================== + * Test inflate with a preset dictionary + *) +{$IFDEF TEST_DICT} +procedure test_dict_inflate(compr: Pointer; comprLen: LongInt; + uncompr: Pointer; uncomprLen: LongInt); +var err: Integer; + d_stream: z_stream; (* decompression stream *) +begin + StrCopy(PChar(uncompr), 'garbage'); + + d_stream.zalloc := NIL; + d_stream.zfree := NIL; + d_stream.opaque := NIL; + + d_stream.next_in := compr; + d_stream.avail_in := Integer(comprLen); + + err := inflateInit(d_stream); + CHECK_ERR(err, 'inflateInit'); + + d_stream.next_out := uncompr; + d_stream.avail_out := Integer(uncomprLen); + + while TRUE do + begin + err := inflate(d_stream, Z_NO_FLUSH); + if err = Z_STREAM_END then + break; + if err = Z_NEED_DICT then + begin + if d_stream.adler <> dictId then + EXIT_ERR('unexpected dictionary'); + err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary)); + end; + CHECK_ERR(err, 'inflate with dict'); + end; + + err := inflateEnd(d_stream); + CHECK_ERR(err, 'inflateEnd'); + + if StrComp(PChar(uncompr), hello) <> 0 then + EXIT_ERR('bad inflate with dict') + else + WriteLn('inflate with dictionary: ', PChar(uncompr)); +end; +{$ENDIF} + +var compr, uncompr: Pointer; + comprLen, uncomprLen: LongInt; + +begin + if zlibVersion^ <> ZLIB_VERSION[1] then + EXIT_ERR('Incompatible zlib version'); + + WriteLn('zlib version: ', zlibVersion); + WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags])); + + comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *) + uncomprLen := comprLen; + GetMem(compr, comprLen); + GetMem(uncompr, uncomprLen); + if (compr = NIL) or (uncompr = NIL) then + EXIT_ERR('Out of memory'); + (* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + *) + FillChar(compr^, comprLen, 0); + FillChar(uncompr^, uncomprLen, 0); + + {$IFDEF TEST_COMPRESS} + WriteLn('** Testing compress'); + test_compress(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_GZIO} + WriteLn('** Testing gzio'); + if ParamCount >= 1 then + test_gzio(ParamStr(1), uncompr, uncomprLen) + else + test_gzio(TESTFILE, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with small buffers'); + test_deflate(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with small buffers'); + test_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_DEFLATE} + WriteLn('** Testing deflate with large buffers'); + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + {$IFDEF TEST_INFLATE} + WriteLn('** Testing inflate with large buffers'); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + {$IFDEF TEST_FLUSH} + WriteLn('** Testing deflate with full flush'); + test_flush(compr, comprLen); + {$ENDIF} + {$IFDEF TEST_SYNC} + WriteLn('** Testing inflateSync'); + test_sync(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + comprLen := uncomprLen; + + {$IFDEF TEST_DICT} + WriteLn('** Testing deflate and inflate with preset dictionary'); + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + {$ENDIF} + + FreeMem(compr, comprLen); + FreeMem(uncompr, uncomprLen); +end. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/readme.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/readme.txt new file mode 100644 index 0000000000..60e87c8a33 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/readme.txt @@ -0,0 +1,76 @@ + +This directory contains a Pascal (Delphi, Kylix) interface to the +zlib data compression library. + + +Directory listing +================= + +zlibd32.mak makefile for Borland C++ +example.pas usage example of zlib +zlibpas.pas the Pascal interface to zlib +readme.txt this file + + +Compatibility notes +=================== + +- Although the name "zlib" would have been more normal for the + zlibpas unit, this name is already taken by Borland's ZLib unit. + This is somehow unfortunate, because that unit is not a genuine + interface to the full-fledged zlib functionality, but a suite of + class wrappers around zlib streams. Other essential features, + such as checksums, are missing. + It would have been more appropriate for that unit to have a name + like "ZStreams", or something similar. + +- The C and zlib-supplied types int, uInt, long, uLong, etc. are + translated directly into Pascal types of similar sizes (Integer, + LongInt, etc.), to avoid namespace pollution. In particular, + there is no conversion of unsigned int into a Pascal unsigned + integer. The Word type is non-portable and has the same size + (16 bits) both in a 16-bit and in a 32-bit environment, unlike + Integer. Even if there is a 32-bit Cardinal type, there is no + real need for unsigned int in zlib under a 32-bit environment. + +- Except for the callbacks, the zlib function interfaces are + assuming the calling convention normally used in Pascal + (__pascal for DOS and Windows16, __fastcall for Windows32). + Since the cdecl keyword is used, the old Turbo Pascal does + not work with this interface. + +- The gz* function interfaces are not translated, to avoid + interfacing problems with the C runtime library. Besides, + gzprintf(gzFile file, const char *format, ...) + cannot be translated into Pascal. + + +Legal issues +============ + +The zlibpas interface is: + Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler. + Copyright (C) 1998 by Bob Dellaca. + Copyright (C) 2003 by Cosmin Truta. + +The example program is: + Copyright (C) 1995-2003 by Jean-loup Gailly. + Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali. + Copyright (C) 2003 by Cosmin Truta. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/zlibd32.mak b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/zlibd32.mak new file mode 100644 index 0000000000..0d0699a69a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/zlibd32.mak @@ -0,0 +1,99 @@ +# Makefile for zlib +# For use with Delphi and C++ Builder under Win32 +# Updated for zlib 1.2.x by Cosmin Truta + +# ------------ Borland C++ ------------ + +# This project uses the Delphi (fastcall/register) calling convention: +LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl + +CC = bcc32 +LD = bcc32 +AR = tlib +# do not use "-pr" in CFLAGS +CFLAGS = -a -d -k- -O2 $(LOC) +LDFLAGS = + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.tds + -del zlib.bak + -del foo.gz + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/zlibpas.pas b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/zlibpas.pas new file mode 100644 index 0000000000..637ae3a3f8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/pascal/zlibpas.pas @@ -0,0 +1,236 @@ +(* zlibpas -- Pascal interface to the zlib data compression library + * + * Copyright (C) 2003 Cosmin Truta. + * Derived from original sources by Bob Dellaca. + * For conditions of distribution and use, see copyright notice in readme.txt + *) + +unit zlibpas; + +interface + +const + ZLIB_VERSION = '1.2.5'; + +type + alloc_func = function(opaque: Pointer; items, size: Integer): Pointer; + cdecl; + free_func = procedure(opaque, address: Pointer); + cdecl; + + in_func = function(opaque: Pointer; var buf: PByte): Integer; + cdecl; + out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer; + cdecl; + + z_streamp = ^z_stream; + z_stream = packed record + next_in: PChar; (* next input byte *) + avail_in: Integer; (* number of bytes available at next_in *) + total_in: LongInt; (* total nb of input bytes read so far *) + + next_out: PChar; (* next output byte should be put there *) + avail_out: Integer; (* remaining free space at next_out *) + total_out: LongInt; (* total nb of bytes output so far *) + + msg: PChar; (* last error message, NULL if no error *) + state: Pointer; (* not visible by applications *) + + zalloc: alloc_func; (* used to allocate the internal state *) + zfree: free_func; (* used to free the internal state *) + opaque: Pointer; (* private data object passed to zalloc and zfree *) + + data_type: Integer; (* best guess about the data type: ascii or binary *) + adler: LongInt; (* adler32 value of the uncompressed data *) + reserved: LongInt; (* reserved for future use *) + end; + +(* constants *) +const + Z_NO_FLUSH = 0; + Z_PARTIAL_FLUSH = 1; + Z_SYNC_FLUSH = 2; + Z_FULL_FLUSH = 3; + Z_FINISH = 4; + + Z_OK = 0; + Z_STREAM_END = 1; + Z_NEED_DICT = 2; + Z_ERRNO = -1; + Z_STREAM_ERROR = -2; + Z_DATA_ERROR = -3; + Z_MEM_ERROR = -4; + Z_BUF_ERROR = -5; + Z_VERSION_ERROR = -6; + + Z_NO_COMPRESSION = 0; + Z_BEST_SPEED = 1; + Z_BEST_COMPRESSION = 9; + Z_DEFAULT_COMPRESSION = -1; + + Z_FILTERED = 1; + Z_HUFFMAN_ONLY = 2; + Z_RLE = 3; + Z_DEFAULT_STRATEGY = 0; + + Z_BINARY = 0; + Z_ASCII = 1; + Z_UNKNOWN = 2; + + Z_DEFLATED = 8; + +(* basic functions *) +function zlibVersion: PChar; +function deflateInit(var strm: z_stream; level: Integer): Integer; +function deflate(var strm: z_stream; flush: Integer): Integer; +function deflateEnd(var strm: z_stream): Integer; +function inflateInit(var strm: z_stream): Integer; +function inflate(var strm: z_stream; flush: Integer): Integer; +function inflateEnd(var strm: z_stream): Integer; + +(* advanced functions *) +function deflateInit2(var strm: z_stream; level, method, windowBits, + memLevel, strategy: Integer): Integer; +function deflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function deflateCopy(var dest, source: z_stream): Integer; +function deflateReset(var strm: z_stream): Integer; +function deflateParams(var strm: z_stream; level, strategy: Integer): Integer; +function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt; +function deflatePrime(var strm: z_stream; bits, value: Integer): Integer; +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +function inflateSetDictionary(var strm: z_stream; const dictionary: PChar; + dictLength: Integer): Integer; +function inflateSync(var strm: z_stream): Integer; +function inflateCopy(var dest, source: z_stream): Integer; +function inflateReset(var strm: z_stream): Integer; +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer; + out_fn: out_func; out_desc: Pointer): Integer; +function inflateBackEnd(var strm: z_stream): Integer; +function zlibCompileFlags: LongInt; + +(* utility functions *) +function compress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; +function compress2(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt; + level: Integer): Integer; +function compressBound(sourceLen: LongInt): LongInt; +function uncompress(dest: PChar; var destLen: LongInt; + const source: PChar; sourceLen: LongInt): Integer; + +(* checksum functions *) +function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt; +function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt; + +(* various hacks, don't look :) *) +function deflateInit_(var strm: z_stream; level: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit_(var strm: z_stream; const version: PChar; + stream_size: Integer): Integer; +function deflateInit2_(var strm: z_stream; + level, method, windowBits, memLevel, strategy: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateInit2_(var strm: z_stream; windowBits: Integer; + const version: PChar; stream_size: Integer): Integer; +function inflateBackInit_(var strm: z_stream; + windowBits: Integer; window: PChar; + const version: PChar; stream_size: Integer): Integer; + + +implementation + +{$L adler32.obj} +{$L compress.obj} +{$L crc32.obj} +{$L deflate.obj} +{$L infback.obj} +{$L inffast.obj} +{$L inflate.obj} +{$L inftrees.obj} +{$L trees.obj} +{$L uncompr.obj} +{$L zutil.obj} + +function adler32; external; +function compress; external; +function compress2; external; +function compressBound; external; +function crc32; external; +function deflate; external; +function deflateBound; external; +function deflateCopy; external; +function deflateEnd; external; +function deflateInit_; external; +function deflateInit2_; external; +function deflateParams; external; +function deflatePrime; external; +function deflateReset; external; +function deflateSetDictionary; external; +function inflate; external; +function inflateBack; external; +function inflateBackEnd; external; +function inflateBackInit_; external; +function inflateCopy; external; +function inflateEnd; external; +function inflateInit_; external; +function inflateInit2_; external; +function inflateReset; external; +function inflateSetDictionary; external; +function inflateSync; external; +function uncompress; external; +function zlibCompileFlags; external; +function zlibVersion; external; + +function deflateInit(var strm: z_stream; level: Integer): Integer; +begin + Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream)); +end; + +function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel, + strategy: Integer): Integer; +begin + Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit(var strm: z_stream): Integer; +begin + Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateInit2(var strm: z_stream; windowBits: Integer): Integer; +begin + Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream)); +end; + +function inflateBackInit(var strm: z_stream; + windowBits: Integer; window: PChar): Integer; +begin + Result := inflateBackInit_(strm, windowBits, window, + ZLIB_VERSION, sizeof(z_stream)); +end; + +function _malloc(Size: Integer): Pointer; cdecl; +begin + GetMem(Result, Size); +end; + +procedure _free(Block: Pointer); cdecl; +begin + FreeMem(Block); +end; + +procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl; +begin + FillChar(P^, count, B); +end; + +procedure _memcpy(dest, source: Pointer; count: Integer); cdecl; +begin + Move(source^, dest^, count); +end; + +end. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/Makefile b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/Makefile new file mode 100644 index 0000000000..b6b69404c7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/Makefile @@ -0,0 +1,8 @@ +puff: puff.c puff.h + cc -DTEST -o puff puff.c + +test: puff + puff zeros.raw + +clean: + rm -f puff puff.o diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/README b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/README new file mode 100644 index 0000000000..bbc4cb595e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/README @@ -0,0 +1,63 @@ +Puff -- A Simple Inflate +3 Mar 2003 +Mark Adler +madler@alumni.caltech.edu + +What this is -- + +puff.c provides the routine puff() to decompress the deflate data format. It +does so more slowly than zlib, but the code is about one-fifth the size of the +inflate code in zlib, and written to be very easy to read. + +Why I wrote this -- + +puff.c was written to document the deflate format unambiguously, by virtue of +being working C code. It is meant to supplement RFC 1951, which formally +describes the deflate format. I have received many questions on details of the +deflate format, and I hope that reading this code will answer those questions. +puff.c is heavily commented with details of the deflate format, especially +those little nooks and cranies of the format that might not be obvious from a +specification. + +puff.c may also be useful in applications where code size or memory usage is a +very limited resource, and speed is not as important. + +How to use it -- + +Well, most likely you should just be reading puff.c and using zlib for actual +applications, but if you must ... + +Include puff.h in your code, which provides this prototype: + +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ + +Then you can call puff() to decompress a deflate stream that is in memory in +its entirety at source, to a sufficiently sized block of memory for the +decompressed data at dest. puff() is the only external symbol in puff.c The +only C library functions that puff.c needs are setjmp() and longjmp(), which +are used to simplify error checking in the code to improve readabilty. puff.c +does no memory allocation, and uses less than 2K bytes off of the stack. + +If destlen is not enough space for the uncompressed data, then inflate will +return an error without writing more than destlen bytes. Note that this means +that in order to decompress the deflate data successfully, you need to know +the size of the uncompressed data ahead of time. + +If needed, puff() can determine the size of the uncompressed data with no +output space. This is done by passing dest equal to (unsigned char *)0. Then +the initial value of *destlen is ignored and *destlen is set to the length of +the uncompressed data. So if the size of the uncompressed data is not known, +then two passes of puff() can be used--first to determine the size, and second +to do the actual inflation after allocating the appropriate memory. Not +pretty, but it works. (This is one of the reasons you should be using zlib.) + +The deflate format is self-terminating. If the deflate stream does not end +in *sourcelen bytes, puff() will return an error without reading at or past +endsource. + +On return, *sourcelen is updated to the amount of input data consumed, and +*destlen is updated to the size of the uncompressed data. See the comments +in puff.c for the possible return codes for puff(). diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/puff.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/puff.c new file mode 100644 index 0000000000..650694e9ed --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/puff.c @@ -0,0 +1,955 @@ +/* + * puff.c + * Copyright (C) 2002-2010 Mark Adler + * For conditions of distribution and use, see copyright notice in puff.h + * version 2.1, 4 Apr 2010 + * + * puff.c is a simple inflate written to be an unambiguous way to specify the + * deflate format. It is not written for speed but rather simplicity. As a + * side benefit, this code might actually be useful when small code is more + * important than speed, such as bootstrap applications. For typical deflate + * data, zlib's inflate() is about four times as fast as puff(). zlib's + * inflate compiles to around 20K on my machine, whereas puff.c compiles to + * around 4K on my machine (a PowerPC using GNU cc). If the faster decode() + * function here is used, then puff() is only twice as slow as zlib's + * inflate(). + * + * All dynamically allocated memory comes from the stack. The stack required + * is less than 2K bytes. This code is compatible with 16-bit int's and + * assumes that long's are at least 32 bits. puff.c uses the short data type, + * assumed to be 16 bits, for arrays in order to to conserve memory. The code + * works whether integers are stored big endian or little endian. + * + * In the comments below are "Format notes" that describe the inflate process + * and document some of the less obvious aspects of the format. This source + * code is meant to supplement RFC 1951, which formally describes the deflate + * format: + * + * http://www.zlib.org/rfc-deflate.html + */ + +/* + * Change history: + * + * 1.0 10 Feb 2002 - First version + * 1.1 17 Feb 2002 - Clarifications of some comments and notes + * - Update puff() dest and source pointers on negative + * errors to facilitate debugging deflators + * - Remove longest from struct huffman -- not needed + * - Simplify offs[] index in construct() + * - Add input size and checking, using longjmp() to + * maintain easy readability + * - Use short data type for large arrays + * - Use pointers instead of long to specify source and + * destination sizes to avoid arbitrary 4 GB limits + * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), + * but leave simple version for readabilty + * - Make sure invalid distances detected if pointers + * are 16 bits + * - Fix fixed codes table error + * - Provide a scanning mode for determining size of + * uncompressed data + * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Jean-loup] + * - Add a puff.h file for the interface + * - Add braces in puff() for else do [Jean-loup] + * - Use indexes instead of pointers for readability + * 1.4 31 Mar 2002 - Simplify construct() code set check + * - Fix some comments + * - Add FIXLCODES #define + * 1.5 6 Apr 2002 - Minor comment fixes + * 1.6 7 Aug 2002 - Minor format changes + * 1.7 3 Mar 2003 - Added test code for distribution + * - Added zlib-like license + * 1.8 9 Jan 2004 - Added some comments on no distance codes case + * 1.9 21 Feb 2008 - Fix bug on 16-bit integer architectures [Pohland] + * - Catch missing end-of-block symbol error + * 2.0 25 Jul 2008 - Add #define to permit distance too far back + * - Add option in TEST code for puff to write the data + * - Add option in TEST code to skip input bytes + * - Allow TEST code to read from piped stdin + * 2.1 4 Apr 2010 - Avoid variable initialization for happier compilers + * - Avoid unsigned comparisons for even happier compilers + */ + +#include /* for setjmp(), longjmp(), and jmp_buf */ +#include "puff.h" /* prototype for puff() */ + +#define local static /* for local function definitions */ +#define NIL ((unsigned char *)0) /* for no output option */ + +/* + * Maximums for allocations and loops. It is not useful to change these -- + * they are fixed by the deflate format. + */ +#define MAXBITS 15 /* maximum bits in a code */ +#define MAXLCODES 286 /* maximum number of literal/length codes */ +#define MAXDCODES 30 /* maximum number of distance codes */ +#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */ +#define FIXLCODES 288 /* number of fixed literal/length codes */ + +/* input and output state */ +struct state { + /* output state */ + unsigned char *out; /* output buffer */ + unsigned long outlen; /* available space at out */ + unsigned long outcnt; /* bytes written to out so far */ + + /* input state */ + unsigned char *in; /* input buffer */ + unsigned long inlen; /* available input at in */ + unsigned long incnt; /* bytes read so far */ + int bitbuf; /* bit buffer */ + int bitcnt; /* number of bits in bit buffer */ + + /* input limit error return state for bits() and decode() */ + jmp_buf env; +}; + +/* + * Return need bits from the input stream. This always leaves less than + * eight bits in the buffer. bits() works properly for need == 0. + * + * Format notes: + * + * - Bits are stored in bytes from the least significant bit to the most + * significant bit. Therefore bits are dropped from the bottom of the bit + * buffer, using shift right, and new bytes are appended to the top of the + * bit buffer, using shift left. + */ +local int bits(struct state *s, int need) +{ + long val; /* bit accumulator (can use up to 20 bits) */ + + /* load at least need bits into val */ + val = s->bitbuf; + while (s->bitcnt < need) { + if (s->incnt == s->inlen) longjmp(s->env, 1); /* out of input */ + val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */ + s->bitcnt += 8; + } + + /* drop need bits and update buffer, always zero to seven bits left */ + s->bitbuf = (int)(val >> need); + s->bitcnt -= need; + + /* return need bits, zeroing the bits above that */ + return (int)(val & ((1L << need) - 1)); +} + +/* + * Process a stored block. + * + * Format notes: + * + * - After the two-bit stored block type (00), the stored block length and + * stored bytes are byte-aligned for fast copying. Therefore any leftover + * bits in the byte that has the last bit of the type, as many as seven, are + * discarded. The value of the discarded bits are not defined and should not + * be checked against any expectation. + * + * - The second inverted copy of the stored block length does not have to be + * checked, but it's probably a good idea to do so anyway. + * + * - A stored block can have zero length. This is sometimes used to byte-align + * subsets of the compressed data for random access or partial recovery. + */ +local int stored(struct state *s) +{ + unsigned len; /* length of stored block */ + + /* discard leftover bits from current byte (assumes s->bitcnt < 8) */ + s->bitbuf = 0; + s->bitcnt = 0; + + /* get length and check against its one's complement */ + if (s->incnt + 4 > s->inlen) return 2; /* not enough input */ + len = s->in[s->incnt++]; + len |= s->in[s->incnt++] << 8; + if (s->in[s->incnt++] != (~len & 0xff) || + s->in[s->incnt++] != ((~len >> 8) & 0xff)) + return -2; /* didn't match complement! */ + + /* copy len bytes from in to out */ + if (s->incnt + len > s->inlen) return 2; /* not enough input */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) + return 1; /* not enough output space */ + while (len--) + s->out[s->outcnt++] = s->in[s->incnt++]; + } + else { /* just scanning */ + s->outcnt += len; + s->incnt += len; + } + + /* done with a valid stored block */ + return 0; +} + +/* + * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of + * each length, which for a canonical code are stepped through in order. + * symbol[] are the symbol values in canonical order, where the number of + * entries is the sum of the counts in count[]. The decoding process can be + * seen in the function decode() below. + */ +struct huffman { + short *count; /* number of symbols of each length */ + short *symbol; /* canonically ordered symbols */ +}; + +/* + * Decode a code from the stream s using huffman table h. Return the symbol or + * a negative value if there is an error. If all of the lengths are zero, i.e. + * an empty code, or if the code is incomplete and an invalid code is received, + * then -10 is returned after reading MAXBITS bits. + * + * Format notes: + * + * - The codes as stored in the compressed data are bit-reversed relative to + * a simple integer ordering of codes of the same lengths. Hence below the + * bits are pulled from the compressed data one at a time and used to + * build the code value reversed from what is in the stream in order to + * permit simple integer comparisons for decoding. A table-based decoding + * scheme (as used in zlib) does not need to do this reversal. + * + * - The first code for the shortest length is all zeros. Subsequent codes of + * the same length are simply integer increments of the previous code. When + * moving up a length, a zero bit is appended to the code. For a complete + * code, the last code of the longest length will be all ones. + * + * - Incomplete codes are handled by this decoder, since they are permitted + * in the deflate format. See the format notes for fixed() and dynamic(). + */ +#ifdef SLOW +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + + code = first = index = 0; + for (len = 1; len <= MAXBITS; len++) { + code |= bits(s, 1); /* get next bit */ + count = h->count[len]; + if (code - count < first) /* if length len, return symbol */ + return h->symbol[index + (code - first)]; + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + } + return -10; /* ran out of codes */ +} + +/* + * A faster version of decode() for real applications of this code. It's not + * as readable, but it makes puff() twice as fast. And it only makes the code + * a few percent larger. + */ +#else /* !SLOW */ +local int decode(struct state *s, struct huffman *h) +{ + int len; /* current number of bits in code */ + int code; /* len bits being decoded */ + int first; /* first code of length len */ + int count; /* number of codes of length len */ + int index; /* index of first code of length len in symbol table */ + int bitbuf; /* bits from stream */ + int left; /* bits left in next or left to process */ + short *next; /* next number of codes */ + + bitbuf = s->bitbuf; + left = s->bitcnt; + code = first = index = 0; + len = 1; + next = h->count + 1; + while (1) { + while (left--) { + code |= bitbuf & 1; + bitbuf >>= 1; + count = *next++; + if (code - count < first) { /* if length len, return symbol */ + s->bitbuf = bitbuf; + s->bitcnt = (s->bitcnt - len) & 7; + return h->symbol[index + (code - first)]; + } + index += count; /* else update for next length */ + first += count; + first <<= 1; + code <<= 1; + len++; + } + left = (MAXBITS+1) - len; + if (left == 0) break; + if (s->incnt == s->inlen) longjmp(s->env, 1); /* out of input */ + bitbuf = s->in[s->incnt++]; + if (left > 8) left = 8; + } + return -10; /* ran out of codes */ +} +#endif /* SLOW */ + +/* + * Given the list of code lengths length[0..n-1] representing a canonical + * Huffman code for n symbols, construct the tables required to decode those + * codes. Those tables are the number of codes of each length, and the symbols + * sorted by length, retaining their original order within each length. The + * return value is zero for a complete code set, negative for an over- + * subscribed code set, and positive for an incomplete code set. The tables + * can be used if the return value is zero or positive, but they cannot be used + * if the return value is negative. If the return value is zero, it is not + * possible for decode() using that table to return an error--any stream of + * enough bits will resolve to a symbol. If the return value is positive, then + * it is possible for decode() using that table to return an error for received + * codes past the end of the incomplete lengths. + * + * Not used by decode(), but used for error checking, h->count[0] is the number + * of the n symbols not in the code. So n - h->count[0] is the number of + * codes. This is useful for checking for incomplete codes that have more than + * one symbol, which is an error in a dynamic block. + * + * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS + * This is assured by the construction of the length arrays in dynamic() and + * fixed() and is not verified by construct(). + * + * Format notes: + * + * - Permitted and expected examples of incomplete codes are one of the fixed + * codes and any code with a single symbol which in deflate is coded as one + * bit instead of zero bits. See the format notes for fixed() and dynamic(). + * + * - Within a given code length, the symbols are kept in ascending order for + * the code bits definition. + */ +local int construct(struct huffman *h, short *length, int n) +{ + int symbol; /* current symbol when stepping through length[] */ + int len; /* current length when stepping through h->count[] */ + int left; /* number of possible codes left of current length */ + short offs[MAXBITS+1]; /* offsets in symbol table for each length */ + + /* count number of codes of each length */ + for (len = 0; len <= MAXBITS; len++) + h->count[len] = 0; + for (symbol = 0; symbol < n; symbol++) + (h->count[length[symbol]])++; /* assumes lengths are within bounds */ + if (h->count[0] == n) /* no codes! */ + return 0; /* complete, but decode() will fail */ + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; /* one possible code of zero length */ + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; /* one more bit, double codes left */ + left -= h->count[len]; /* deduct count from possible codes */ + if (left < 0) return left; /* over-subscribed--return negative */ + } /* left > 0 means incomplete */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + h->count[len]; + + /* + * put symbols in table sorted by length, by symbol order within each + * length + */ + for (symbol = 0; symbol < n; symbol++) + if (length[symbol] != 0) + h->symbol[offs[length[symbol]]++] = symbol; + + /* return zero for complete set, positive for incomplete set */ + return left; +} + +/* + * Decode literal/length and distance codes until an end-of-block code. + * + * Format notes: + * + * - Compressed data that is after the block type if fixed or after the code + * description if dynamic is a combination of literals and length/distance + * pairs terminated by and end-of-block code. Literals are simply Huffman + * coded bytes. A length/distance pair is a coded length followed by a + * coded distance to represent a string that occurs earlier in the + * uncompressed data that occurs again at the current location. + * + * - Literals, lengths, and the end-of-block code are combined into a single + * code of up to 286 symbols. They are 256 literals (0..255), 29 length + * symbols (257..285), and the end-of-block symbol (256). + * + * - There are 256 possible lengths (3..258), and so 29 symbols are not enough + * to represent all of those. Lengths 3..10 and 258 are in fact represented + * by just a length symbol. Lengths 11..257 are represented as a symbol and + * some number of extra bits that are added as an integer to the base length + * of the length symbol. The number of extra bits is determined by the base + * length symbol. These are in the static arrays below, lens[] for the base + * lengths and lext[] for the corresponding number of extra bits. + * + * - The reason that 258 gets its own symbol is that the longest length is used + * often in highly redundant files. Note that 258 can also be coded as the + * base value 227 plus the maximum extra value of 31. While a good deflate + * should never do this, it is not an error, and should be decoded properly. + * + * - If a length is decoded, including its extra bits if any, then it is + * followed a distance code. There are up to 30 distance symbols. Again + * there are many more possible distances (1..32768), so extra bits are added + * to a base value represented by the symbol. The distances 1..4 get their + * own symbol, but the rest require extra bits. The base distances and + * corresponding number of extra bits are below in the static arrays dist[] + * and dext[]. + * + * - Literal bytes are simply written to the output. A length/distance pair is + * an instruction to copy previously uncompressed bytes to the output. The + * copy is from distance bytes back in the output stream, copying for length + * bytes. + * + * - Distances pointing before the beginning of the output data are not + * permitted. + * + * - Overlapped copies, where the length is greater than the distance, are + * allowed and common. For example, a distance of one and a length of 258 + * simply copies the last byte 258 times. A distance of four and a length of + * twelve copies the last four bytes three times. A simple forward copy + * ignoring whether the length is greater than the distance or not implements + * this correctly. You should not use memcpy() since its behavior is not + * defined for overlapped arrays. You should not use memmove() or bcopy() + * since though their behavior -is- defined for overlapping arrays, it is + * defined to do the wrong thing in this case. + */ +local int codes(struct state *s, + struct huffman *lencode, + struct huffman *distcode) +{ + int symbol; /* decoded symbol */ + int len; /* length for copy */ + unsigned dist; /* distance for copy */ + static const short lens[29] = { /* Size base for length codes 257..285 */ + 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}; + static const short lext[29] = { /* Extra bits for length codes 257..285 */ + 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}; + static const short dists[30] = { /* Offset base for distance codes 0..29 */ + 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}; + static const short dext[30] = { /* Extra bits for distance codes 0..29 */ + 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}; + + /* decode literals and length/distance pairs */ + do { + symbol = decode(s, lencode); + if (symbol < 0) return symbol; /* invalid symbol */ + if (symbol < 256) { /* literal: symbol is the byte */ + /* write out the literal */ + if (s->out != NIL) { + if (s->outcnt == s->outlen) return 1; + s->out[s->outcnt] = symbol; + } + s->outcnt++; + } + else if (symbol > 256) { /* length */ + /* get and compute length */ + symbol -= 257; + if (symbol >= 29) return -10; /* invalid fixed code */ + len = lens[symbol] + bits(s, lext[symbol]); + + /* get and check distance */ + symbol = decode(s, distcode); + if (symbol < 0) return symbol; /* invalid symbol */ + dist = dists[symbol] + bits(s, dext[symbol]); +#ifndef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (dist > s->outcnt) + return -11; /* distance too far back */ +#endif + + /* copy length bytes from distance bytes back */ + if (s->out != NIL) { + if (s->outcnt + len > s->outlen) return 1; + while (len--) { + s->out[s->outcnt] = +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + dist > s->outcnt ? 0 : +#endif + s->out[s->outcnt - dist]; + s->outcnt++; + } + } + else + s->outcnt += len; + } + } while (symbol != 256); /* end of block symbol */ + + /* done with a valid fixed or dynamic block */ + return 0; +} + +/* + * Process a fixed codes block. + * + * Format notes: + * + * - This block type can be useful for compressing small amounts of data for + * which the size of the code descriptions in a dynamic block exceeds the + * benefit of custom codes for that block. For fixed codes, no bits are + * spent on code descriptions. Instead the code lengths for literal/length + * codes and distance codes are fixed. The specific lengths for each symbol + * can be seen in the "for" loops below. + * + * - The literal/length code is complete, but has two symbols that are invalid + * and should result in an error if received. This cannot be implemented + * simply as an incomplete code since those two symbols are in the "middle" + * of the code. They are eight bits long and the longest literal/length\ + * code is nine bits. Therefore the code must be constructed with those + * symbols, and the invalid symbols must be detected after decoding. + * + * - The fixed distance codes also have two invalid symbols that should result + * in an error if received. Since all of the distance codes are the same + * length, this can be implemented as an incomplete code. Then the invalid + * codes are detected while decoding. + */ +local int fixed(struct state *s) +{ + static int virgin = 1; + static short lencnt[MAXBITS+1], lensym[FIXLCODES]; + static short distcnt[MAXBITS+1], distsym[MAXDCODES]; + static struct huffman lencode, distcode; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + int symbol; + short lengths[FIXLCODES]; + + /* literal/length table */ + for (symbol = 0; symbol < 144; symbol++) + lengths[symbol] = 8; + for (; symbol < 256; symbol++) + lengths[symbol] = 9; + for (; symbol < 280; symbol++) + lengths[symbol] = 7; + for (; symbol < FIXLCODES; symbol++) + lengths[symbol] = 8; + construct(&lencode, lengths, FIXLCODES); + + /* distance table */ + for (symbol = 0; symbol < MAXDCODES; symbol++) + lengths[symbol] = 5; + construct(&distcode, lengths, MAXDCODES); + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* do this just once */ + virgin = 0; + } + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Process a dynamic codes block. + * + * Format notes: + * + * - A dynamic block starts with a description of the literal/length and + * distance codes for that block. New dynamic blocks allow the compressor to + * rapidly adapt to changing data with new codes optimized for that data. + * + * - The codes used by the deflate format are "canonical", which means that + * the actual bits of the codes are generated in an unambiguous way simply + * from the number of bits in each code. Therefore the code descriptions + * are simply a list of code lengths for each symbol. + * + * - The code lengths are stored in order for the symbols, so lengths are + * provided for each of the literal/length symbols, and for each of the + * distance symbols. + * + * - If a symbol is not used in the block, this is represented by a zero as + * as the code length. This does not mean a zero-length code, but rather + * that no code should be created for this symbol. There is no way in the + * deflate format to represent a zero-length code. + * + * - The maximum number of bits in a code is 15, so the possible lengths for + * any code are 1..15. + * + * - The fact that a length of zero is not permitted for a code has an + * interesting consequence. Normally if only one symbol is used for a given + * code, then in fact that code could be represented with zero bits. However + * in deflate, that code has to be at least one bit. So for example, if + * only a single distance base symbol appears in a block, then it will be + * represented by a single code of length one, in particular one 0 bit. This + * is an incomplete code, since if a 1 bit is received, it has no meaning, + * and should result in an error. So incomplete distance codes of one symbol + * should be permitted, and the receipt of invalid codes should be handled. + * + * - It is also possible to have a single literal/length code, but that code + * must be the end-of-block code, since every dynamic block has one. This + * is not the most efficient way to create an empty block (an empty fixed + * block is fewer bits), but it is allowed by the format. So incomplete + * literal/length codes of one symbol should also be permitted. + * + * - If there are only literal codes and no lengths, then there are no distance + * codes. This is represented by one distance code with zero bits. + * + * - The list of up to 286 length/literal lengths and up to 30 distance lengths + * are themselves compressed using Huffman codes and run-length encoding. In + * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means + * that length, and the symbols 16, 17, and 18 are run-length instructions. + * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 + * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols + * are common, hence the special coding for zero lengths. + * + * - The symbols for 0..18 are Huffman coded, and so that code must be + * described first. This is simply a sequence of up to 19 three-bit values + * representing no code (0) or the code length for that symbol (1..7). + * + * - A dynamic block starts with three fixed-size counts from which is computed + * the number of literal/length code lengths, the number of distance code + * lengths, and the number of code length code lengths (ok, you come up with + * a better name!) in the code descriptions. For the literal/length and + * distance codes, lengths after those provided are considered zero, i.e. no + * code. The code length code lengths are received in a permuted order (see + * the order[] array below) to make a short code length code length list more + * likely. As it turns out, very short and very long codes are less likely + * to be seen in a dynamic code description, hence what may appear initially + * to be a peculiar ordering. + * + * - Given the number of literal/length code lengths (nlen) and distance code + * lengths (ndist), then they are treated as one long list of nlen + ndist + * code lengths. Therefore run-length coding can and often does cross the + * boundary between the two sets of lengths. + * + * - So to summarize, the code description at the start of a dynamic block is + * three counts for the number of code lengths for the literal/length codes, + * the distance codes, and the code length codes. This is followed by the + * code length code lengths, three bits each. This is used to construct the + * code length code which is used to read the remainder of the lengths. Then + * the literal/length code lengths and distance lengths are read as a single + * set of lengths using the code length codes. Codes are constructed from + * the resulting two sets of lengths, and then finally you can start + * decoding actual compressed data in the block. + * + * - For reference, a "typical" size for the code description in a dynamic + * block is around 80 bytes. + */ +local int dynamic(struct state *s) +{ + int nlen, ndist, ncode; /* number of lengths in descriptor */ + int index; /* index of lengths[] */ + int err; /* construct() return value */ + short lengths[MAXCODES]; /* descriptor code lengths */ + short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */ + short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */ + struct huffman lencode, distcode; /* length and distance codes */ + static const short order[19] = /* permutation of code length codes */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* construct lencode and distcode */ + lencode.count = lencnt; + lencode.symbol = lensym; + distcode.count = distcnt; + distcode.symbol = distsym; + + /* get number of lengths in each table, check lengths */ + nlen = bits(s, 5) + 257; + ndist = bits(s, 5) + 1; + ncode = bits(s, 4) + 4; + if (nlen > MAXLCODES || ndist > MAXDCODES) + return -3; /* bad counts */ + + /* read code length code lengths (really), missing lengths are zero */ + for (index = 0; index < ncode; index++) + lengths[order[index]] = bits(s, 3); + for (; index < 19; index++) + lengths[order[index]] = 0; + + /* build huffman table for code lengths codes (use lencode temporarily) */ + err = construct(&lencode, lengths, 19); + if (err != 0) return -4; /* require complete code set here */ + + /* read length/literal and distance code length tables */ + index = 0; + while (index < nlen + ndist) { + int symbol; /* decoded value */ + int len; /* last length to repeat */ + + symbol = decode(s, &lencode); + if (symbol < 16) /* length in 0..15 */ + lengths[index++] = symbol; + else { /* repeat instruction */ + len = 0; /* assume repeating zeros */ + if (symbol == 16) { /* repeat last length 3..6 times */ + if (index == 0) return -5; /* no last length! */ + len = lengths[index - 1]; /* last length */ + symbol = 3 + bits(s, 2); + } + else if (symbol == 17) /* repeat zero 3..10 times */ + symbol = 3 + bits(s, 3); + else /* == 18, repeat zero 11..138 times */ + symbol = 11 + bits(s, 7); + if (index + symbol > nlen + ndist) + return -6; /* too many lengths! */ + while (symbol--) /* repeat last or zero symbol times */ + lengths[index++] = len; + } + } + + /* check for end-of-block code -- there better be one! */ + if (lengths[256] == 0) + return -9; + + /* build huffman table for literal/length codes */ + err = construct(&lencode, lengths, nlen); + if (err < 0 || (err > 0 && nlen - lencode.count[0] != 1)) + return -7; /* only allow incomplete codes if just one code */ + + /* build huffman table for distance codes */ + err = construct(&distcode, lengths + nlen, ndist); + if (err < 0 || (err > 0 && ndist - distcode.count[0] != 1)) + return -8; /* only allow incomplete codes if just one code */ + + /* decode data until end-of-block code */ + return codes(s, &lencode, &distcode); +} + +/* + * Inflate source to dest. On return, destlen and sourcelen are updated to the + * size of the uncompressed data and the size of the deflate data respectively. + * On success, the return value of puff() is zero. If there is an error in the + * source data, i.e. it is not in the deflate format, then a negative value is + * returned. If there is not enough input available or there is not enough + * output space, then a positive error is returned. In that case, destlen and + * sourcelen are not updated to facilitate retrying from the beginning with the + * provision of more input data or more output space. In the case of invalid + * inflate data (a negative error), the dest and source pointers are updated to + * facilitate the debugging of deflators. + * + * puff() also has a mode to determine the size of the uncompressed output with + * no output written. For this dest must be (unsigned char *)0. In this case, + * the input value of *destlen is ignored, and on return *destlen is set to the + * size of the uncompressed output. + * + * The return codes are: + * + * 2: available inflate data did not terminate + * 1: output space exhausted before completing inflate + * 0: successful inflate + * -1: invalid block type (type == 3) + * -2: stored block length did not match one's complement + * -3: dynamic block code description: too many length or distance codes + * -4: dynamic block code description: code lengths codes incomplete + * -5: dynamic block code description: repeat lengths with no first length + * -6: dynamic block code description: repeat more than specified lengths + * -7: dynamic block code description: invalid literal/length code lengths + * -8: dynamic block code description: invalid distance code lengths + * -9: dynamic block code description: missing end-of-block code + * -10: invalid literal/length or distance code in fixed or dynamic block + * -11: distance is too far back in fixed or dynamic block + * + * Format notes: + * + * - Three bits are read for each block to determine the kind of block and + * whether or not it is the last block. Then the block is decoded and the + * process repeated if it was not the last block. + * + * - The leftover bits in the last byte of the deflate data after the last + * block (if it was a fixed or dynamic block) are undefined and have no + * expected values to check. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen) /* amount of input available */ +{ + struct state s; /* input/output state */ + int last, type; /* block information */ + int err; /* return value */ + + /* initialize output state */ + s.out = dest; + s.outlen = *destlen; /* ignored if dest is NIL */ + s.outcnt = 0; + + /* initialize input state */ + s.in = source; + s.inlen = *sourcelen; + s.incnt = 0; + s.bitbuf = 0; + s.bitcnt = 0; + + /* return if bits() or decode() tries to read past available input */ + if (setjmp(s.env) != 0) /* if came back here via longjmp() */ + err = 2; /* then skip do-loop, return error */ + else { + /* process blocks until last block or error */ + do { + last = bits(&s, 1); /* one if last block */ + type = bits(&s, 2); /* block type 0..3 */ + err = type == 0 ? stored(&s) : + (type == 1 ? fixed(&s) : + (type == 2 ? dynamic(&s) : + -1)); /* type == 3, invalid */ + if (err != 0) break; /* return with error */ + } while (!last); + } + + /* update the lengths and return */ + if (err <= 0) { + *destlen = s.outcnt; + *sourcelen = s.incnt; + } + return err; +} + +#ifdef TEST +/* Examples of how to use puff(). + + Usage: puff [-w] [-nnn] file + ... | puff [-w] [-nnn] + + where file is the input file with deflate data, nnn is the number of bytes + of input to skip before inflating (e.g. to skip a zlib or gzip header), and + -w is used to write the decompressed data to stdout */ + +#include +#include + +/* Return size times approximately the cube root of 2, keeping the result as 1, + 3, or 5 times a power of 2 -- the result is always > size, until the result + is the maximum value of an unsigned long, where it remains. This is useful + to keep reallocations less than ~33% over the actual data. */ +local size_t bythirds(size_t size) +{ + int n; + size_t m; + + m = size; + for (n = 0; m; n++) + m >>= 1; + if (n < 3) + return size + 1; + n -= 3; + m = size >> n; + m += m == 6 ? 2 : 1; + m <<= n; + return m > size ? m : (size_t)(-1); +} + +/* Read the input file *name, or stdin if name is NULL, into allocated memory. + Reallocate to larger buffers until the entire file is read in. Return a + pointer to the allocated data, or NULL if there was a memory allocation + failure. *len is the number of bytes of data read from the input file (even + if load() returns NULL). If the input file was empty or could not be opened + or read, *len is zero. */ +local void *load(char *name, size_t *len) +{ + size_t size; + void *buf, *swap; + FILE *in; + + *len = 0; + buf = malloc(size = 4096); + if (buf == NULL) + return NULL; + in = name == NULL ? stdin : fopen(name, "rb"); + if (in != NULL) { + for (;;) { + *len += fread((char *)buf + *len, 1, size - *len, in); + if (*len < size) break; + size = bythirds(size); + if (size == *len || (swap = realloc(buf, size)) == NULL) { + free(buf); + buf = NULL; + break; + } + buf = swap; + } + fclose(in); + } + return buf; +} + +int main(int argc, char **argv) +{ + int ret, put = 0; + unsigned skip = 0; + char *arg, *name = NULL; + unsigned char *source = NULL, *dest; + size_t len = 0; + unsigned long sourcelen, destlen; + + /* process arguments */ + while (arg = *++argv, --argc) + if (arg[0] == '-') { + if (arg[1] == 'w' && arg[2] == 0) + put = 1; + else if (arg[1] >= '0' && arg[1] <= '9') + skip = (unsigned)atoi(arg + 1); + else { + fprintf(stderr, "invalid option %s\n", arg); + return 3; + } + } + else if (name != NULL) { + fprintf(stderr, "only one file name allowed\n"); + return 3; + } + else + name = arg; + source = load(name, &len); + if (source == NULL) { + fprintf(stderr, "memory allocation failure\n"); + return 4; + } + if (len == 0) { + fprintf(stderr, "could not read %s, or it was empty\n", + name == NULL ? "" : name); + free(source); + return 3; + } + if (skip >= len) { + fprintf(stderr, "skip request of %d leaves no input\n", skip); + free(source); + return 3; + } + + /* test inflate data with offset skip */ + len -= skip; + sourcelen = (unsigned long)len; + ret = puff(NIL, &destlen, source + skip, &sourcelen); + if (ret) + fprintf(stderr, "puff() failed with return code %d\n", ret); + else { + fprintf(stderr, "puff() succeeded uncompressing %lu bytes\n", destlen); + if (sourcelen < len) fprintf(stderr, "%lu compressed bytes unused\n", + len - sourcelen); + } + + /* if requested, inflate again and write decompressd data to stdout */ + if (put) { + dest = malloc(destlen); + if (dest == NULL) { + fprintf(stderr, "memory allocation failure\n"); + free(source); + return 4; + } + puff(dest, &destlen, source + skip, &sourcelen); + fwrite(dest, 1, destlen, stdout); + free(dest); + } + + /* clean up */ + free(source); + return ret; +} +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/puff.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/puff.h new file mode 100644 index 0000000000..88d1b3844f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/puff.h @@ -0,0 +1,31 @@ +/* puff.h + Copyright (C) 2002-2010 Mark Adler, all rights reserved + version 2.1, 4 Apr 2010 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + + +/* + * See puff.c for purpose and usage. + */ +int puff(unsigned char *dest, /* pointer to destination pointer */ + unsigned long *destlen, /* amount of output space */ + unsigned char *source, /* pointer to source data pointer */ + unsigned long *sourcelen); /* amount of input available */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/zeros.raw b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/zeros.raw new file mode 100644 index 0000000000..637b7be6f5 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/puff/zeros.raw differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/testzlib/testzlib.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/testzlib/testzlib.c new file mode 100644 index 0000000000..f559a36461 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/testzlib/testzlib.c @@ -0,0 +1,275 @@ +#include +#include +#include + +#include "zlib.h" + + +void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) +{ + R->HighPart = A.HighPart - B.HighPart; + if (A.LowPart >= B.LowPart) + R->LowPart = A.LowPart - B.LowPart; + else + { + R->LowPart = A.LowPart - B.LowPart; + R->HighPart --; + } +} + +#ifdef _M_X64 +// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc +unsigned __int64 __rdtsc(void); +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + // printf("rdtsc = %I64x\n",__rdtsc()); + pbeginTime64->QuadPart=__rdtsc(); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres; + unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); + LIres.QuadPart=res; + // printf("rdtsc = %I64x\n",__rdtsc()); + return LIres; +} +#else +#ifdef _M_IX86 +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ + DWORD dwEdx,dwEax; + _asm + { + rdtsc + mov dwEax,eax + mov dwEdx,edx + } + pbeginTime64->LowPart=dwEax; + pbeginTime64->HighPart=dwEdx; +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ + myGetRDTSC32(pbeginTime64); +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER LIres,endTime64; + myGetRDTSC32(&endTime64); + + LIres.LowPart=LIres.HighPart=0; + MyDoMinus64(&LIres,endTime64,beginTime64); + return LIres; +} +#else +void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) +{ +} + +void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) +{ +} + +LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER lr; + lr.QuadPart=0; + return lr; +} +#endif +#endif + +void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) +{ + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) + { + pbeginTime64->LowPart = GetTickCount(); + pbeginTime64->HighPart = 0; + } +} + +DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) +{ + LARGE_INTEGER endTime64,ticksPerSecond,ticks; + DWORDLONG ticksShifted,tickSecShifted; + DWORD dwLog=16+0; + DWORD dwRet; + if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) + dwRet = (GetTickCount() - beginTime64.LowPart)*1; + else + { + MyDoMinus64(&ticks,endTime64,beginTime64); + QueryPerformanceFrequency(&ticksPerSecond); + + + { + ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); + tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); + + } + + dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); + dwRet *=1; + } + return dwRet; +} + +int ReadFileMemory(const char* filename,long* plFileSize,void** pFilePtr) +{ + FILE* stream; + void* ptr; + int retVal=1; + stream=fopen(filename, "rb"); + if (stream==NULL) + return 0; + + fseek(stream,0,SEEK_END); + + *plFileSize=ftell(stream); + fseek(stream,0,SEEK_SET); + ptr=malloc((*plFileSize)+1); + if (ptr==NULL) + retVal=0; + else + { + if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) + retVal=0; + } + fclose(stream); + *pFilePtr=ptr; + return retVal; +} + +int main(int argc, char *argv[]) +{ + int BlockSizeCompress=0x8000; + int BlockSizeUncompress=0x8000; + int cprLevel=Z_DEFAULT_COMPRESSION ; + long lFileSize; + unsigned char* FilePtr; + long lBufferSizeCpr; + long lBufferSizeUncpr; + long lCompressedSize=0; + unsigned char* CprPtr; + unsigned char* UncprPtr; + long lSizeCpr,lSizeUncpr; + DWORD dwGetTick,dwMsecQP; + LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; + + if (argc<=1) + { + printf("run TestZlib [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); + return 0; + } + + if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) + { + printf("error reading %s\n",argv[1]); + return 1; + } + else printf("file %s read, %u bytes\n",argv[1],lFileSize); + + if (argc>=3) + BlockSizeCompress=atol(argv[2]); + + if (argc>=4) + BlockSizeUncompress=atol(argv[3]); + + if (argc>=5) + cprLevel=(int)atol(argv[4]); + + lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; + lBufferSizeUncpr = lBufferSizeCpr; + + CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lFileSize; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + deflateInit(&zcpr,cprLevel); + + zcpr.next_in = FilePtr; + zcpr.next_out = CprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); + zcpr.avail_out = BlockSizeCompress; + ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeCpr=zcpr.total_out; + deflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total compress size = %u, in %u step\n",lSizeCpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); + UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); + + BeginCountPerfCounter(&li_qp,TRUE); + dwGetTick=GetTickCount(); + BeginCountRdtsc(&li_rdtsc); + { + z_stream zcpr; + int ret=Z_OK; + long lOrigToDo = lSizeCpr; + long lOrigDone = 0; + int step=0; + memset(&zcpr,0,sizeof(z_stream)); + inflateInit(&zcpr); + + zcpr.next_in = CprPtr; + zcpr.next_out = UncprPtr; + + + do + { + long all_read_before = zcpr.total_in; + zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); + zcpr.avail_out = BlockSizeUncompress; + ret=inflate(&zcpr,Z_SYNC_FLUSH); + lOrigDone += (zcpr.total_in-all_read_before); + lOrigToDo -= (zcpr.total_in-all_read_before); + step++; + } while (ret==Z_OK); + + lSizeUncpr=zcpr.total_out; + inflateEnd(&zcpr); + dwGetTick=GetTickCount()-dwGetTick; + dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); + dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); + printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); + printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); + printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); + printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); + } + + if (lSizeUncpr==lFileSize) + { + if (memcmp(FilePtr,UncprPtr,lFileSize)==0) + printf("compare ok\n"); + + } + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/testzlib/testzlib.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/testzlib/testzlib.txt new file mode 100644 index 0000000000..e508bb22ff --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/testzlib/testzlib.txt @@ -0,0 +1,10 @@ +To build testzLib with Visual Studio 2005: + +copy to a directory file from : +- root of zLib tree +- contrib/testzlib +- contrib/masmx86 +- contrib/masmx64 +- contrib/vstudio/vc7 + +and open testzlib8.sln \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/Makefile b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/Makefile new file mode 100644 index 0000000000..b54266fba2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/Makefile @@ -0,0 +1,14 @@ +CC=cc +CFLAGS=-g + +untgz: untgz.o ../../libz.a + $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz + +untgz.o: untgz.c ../../zlib.h + $(CC) $(CFLAGS) -c -I../.. untgz.c + +../../libz.a: + cd ../..; ./configure; make + +clean: + rm -f untgz untgz.o *~ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/Makefile.msc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/Makefile.msc new file mode 100644 index 0000000000..77b8602213 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/Makefile.msc @@ -0,0 +1,17 @@ +CC=cl +CFLAGS=-MD + +untgz.exe: untgz.obj ..\..\zlib.lib + $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib + +untgz.obj: untgz.c ..\..\zlib.h + $(CC) $(CFLAGS) -c -I..\.. untgz.c + +..\..\zlib.lib: + cd ..\.. + $(MAKE) -f win32\makefile.msc + cd contrib\untgz + +clean: + -del untgz.obj + -del untgz.exe diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/untgz.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/untgz.c new file mode 100644 index 0000000000..2c391e5986 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/untgz/untgz.c @@ -0,0 +1,674 @@ +/* + * untgz.c -- Display contents and extract files from a gzip'd TAR file + * + * written by Pedro A. Aranda Gutierrez + * adaptation to Unix by Jean-loup Gailly + * various fixes by Cosmin Truta + */ + +#include +#include +#include +#include +#include + +#include "zlib.h" + +#ifdef unix +# include +#else +# include +# include +#endif + +#ifdef WIN32 +#include +# ifndef F_OK +# define F_OK 0 +# endif +# define mkdir(dirname,mode) _mkdir(dirname) +# ifdef _MSC_VER +# define access(path,mode) _access(path,mode) +# define chmod(path,mode) _chmod(path,mode) +# define strdup(str) _strdup(str) +# endif +#else +# include +#endif + + +/* values used in typeflag field */ + +#define REGTYPE '0' /* regular file */ +#define AREGTYPE '\0' /* regular file */ +#define LNKTYPE '1' /* link */ +#define SYMTYPE '2' /* reserved */ +#define CHRTYPE '3' /* character special */ +#define BLKTYPE '4' /* block special */ +#define DIRTYPE '5' /* directory */ +#define FIFOTYPE '6' /* FIFO special */ +#define CONTTYPE '7' /* reserved */ + +/* GNU tar extensions */ + +#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */ +#define GNUTYPE_LONGLINK 'K' /* long link name */ +#define GNUTYPE_LONGNAME 'L' /* long file name */ +#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */ +#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */ +#define GNUTYPE_SPARSE 'S' /* sparse file */ +#define GNUTYPE_VOLHDR 'V' /* tape/volume header */ + + +/* tar header */ + +#define BLOCKSIZE 512 +#define SHORTNAMESIZE 100 + +struct tar_header +{ /* byte offset */ + char name[100]; /* 0 */ + char mode[8]; /* 100 */ + char uid[8]; /* 108 */ + char gid[8]; /* 116 */ + char size[12]; /* 124 */ + char mtime[12]; /* 136 */ + char chksum[8]; /* 148 */ + char typeflag; /* 156 */ + char linkname[100]; /* 157 */ + char magic[6]; /* 257 */ + char version[2]; /* 263 */ + char uname[32]; /* 265 */ + char gname[32]; /* 297 */ + char devmajor[8]; /* 329 */ + char devminor[8]; /* 337 */ + char prefix[155]; /* 345 */ + /* 500 */ +}; + +union tar_buffer +{ + char buffer[BLOCKSIZE]; + struct tar_header header; +}; + +struct attr_item +{ + struct attr_item *next; + char *fname; + int mode; + time_t time; +}; + +enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; + +char *TGZfname OF((const char *)); +void TGZnotfound OF((const char *)); + +int getoct OF((char *, int)); +char *strtime OF((time_t *)); +int setfiletime OF((char *, time_t)); +void push_attr OF((struct attr_item **, char *, int, time_t)); +void restore_attr OF((struct attr_item **)); + +int ExprMatch OF((char *, char *)); + +int makedir OF((char *)); +int matchname OF((int, int, char **, char *)); + +void error OF((const char *)); +int tar OF((gzFile, int, int, int, char **)); + +void help OF((int)); +int main OF((int, char **)); + +char *prog; + +const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; + +/* return the file name of the TGZ archive */ +/* or NULL if it does not exist */ + +char *TGZfname (const char *arcname) +{ + static char buffer[1024]; + int origlen,i; + + strcpy(buffer,arcname); + origlen = strlen(buffer); + + for (i=0; TGZsuffix[i]; i++) + { + strcpy(buffer+origlen,TGZsuffix[i]); + if (access(buffer,F_OK) == 0) + return buffer; + } + return NULL; +} + + +/* error message for the filename */ + +void TGZnotfound (const char *arcname) +{ + int i; + + fprintf(stderr,"%s: Couldn't find ",prog); + for (i=0;TGZsuffix[i];i++) + fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n", + arcname, + TGZsuffix[i]); + exit(1); +} + + +/* convert octal digits to int */ +/* on error return -1 */ + +int getoct (char *p,int width) +{ + int result = 0; + char c; + + while (width--) + { + c = *p++; + if (c == 0) + break; + if (c == ' ') + continue; + if (c < '0' || c > '7') + return -1; + result = result * 8 + (c - '0'); + } + return result; +} + + +/* convert time_t to string */ +/* use the "YYYY/MM/DD hh:mm:ss" format */ + +char *strtime (time_t *t) +{ + struct tm *local; + static char result[32]; + + local = localtime(t); + sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d", + local->tm_year+1900, local->tm_mon+1, local->tm_mday, + local->tm_hour, local->tm_min, local->tm_sec); + return result; +} + + +/* set file time */ + +int setfiletime (char *fname,time_t ftime) +{ +#ifdef WIN32 + static int isWinNT = -1; + SYSTEMTIME st; + FILETIME locft, modft; + struct tm *loctm; + HANDLE hFile; + int result; + + loctm = localtime(&ftime); + if (loctm == NULL) + return -1; + + st.wYear = (WORD)loctm->tm_year + 1900; + st.wMonth = (WORD)loctm->tm_mon + 1; + st.wDayOfWeek = (WORD)loctm->tm_wday; + st.wDay = (WORD)loctm->tm_mday; + st.wHour = (WORD)loctm->tm_hour; + st.wMinute = (WORD)loctm->tm_min; + st.wSecond = (WORD)loctm->tm_sec; + st.wMilliseconds = 0; + if (!SystemTimeToFileTime(&st, &locft) || + !LocalFileTimeToFileTime(&locft, &modft)) + return -1; + + if (isWinNT < 0) + isWinNT = (GetVersion() < 0x80000000) ? 1 : 0; + hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, + (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0), + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return -1; + result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1; + CloseHandle(hFile); + return result; +#else + struct utimbuf settime; + + settime.actime = settime.modtime = ftime; + return utime(fname,&settime); +#endif +} + + +/* push file attributes */ + +void push_attr(struct attr_item **list,char *fname,int mode,time_t time) +{ + struct attr_item *item; + + item = (struct attr_item *)malloc(sizeof(struct attr_item)); + if (item == NULL) + error("Out of memory"); + item->fname = strdup(fname); + item->mode = mode; + item->time = time; + item->next = *list; + *list = item; +} + + +/* restore file attributes */ + +void restore_attr(struct attr_item **list) +{ + struct attr_item *item, *prev; + + for (item = *list; item != NULL; ) + { + setfiletime(item->fname,item->time); + chmod(item->fname,item->mode); + prev = item; + item = item->next; + free(prev); + } + *list = NULL; +} + + +/* match regular expression */ + +#define ISSPECIAL(c) (((c) == '*') || ((c) == '/')) + +int ExprMatch (char *string,char *expr) +{ + while (1) + { + if (ISSPECIAL(*expr)) + { + if (*expr == '/') + { + if (*string != '\\' && *string != '/') + return 0; + string ++; expr++; + } + else if (*expr == '*') + { + if (*expr ++ == 0) + return 1; + while (*++string != *expr) + if (*string == 0) + return 0; + } + } + else + { + if (*string != *expr) + return 0; + if (*expr++ == 0) + return 1; + string++; + } + } +} + + +/* recursive mkdir */ +/* abort on ENOENT; ignore other errors like "directory already exists" */ +/* return 1 if OK */ +/* 0 on error */ + +int makedir (char *newdir) +{ + char *buffer = strdup(newdir); + char *p; + int len = strlen(buffer); + + if (len <= 0) { + free(buffer); + return 0; + } + if (buffer[len-1] == '/') { + buffer[len-1] = '\0'; + } + if (mkdir(buffer, 0755) == 0) + { + free(buffer); + return 1; + } + + p = buffer+1; + while (1) + { + char hold; + + while(*p && *p != '\\' && *p != '/') + p++; + hold = *p; + *p = 0; + if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT)) + { + fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer); + free(buffer); + return 0; + } + if (hold == 0) + break; + *p++ = hold; + } + free(buffer); + return 1; +} + + +int matchname (int arg,int argc,char **argv,char *fname) +{ + if (arg == argc) /* no arguments given (untgz tgzarchive) */ + return 1; + + while (arg < argc) + if (ExprMatch(fname,argv[arg++])) + return 1; + + return 0; /* ignore this for the moment being */ +} + + +/* tar file list or extract */ + +int tar (gzFile in,int action,int arg,int argc,char **argv) +{ + union tar_buffer buffer; + int len; + int err; + int getheader = 1; + int remaining = 0; + FILE *outfile = NULL; + char fname[BLOCKSIZE]; + int tarmode; + time_t tartime; + struct attr_item *attributes = NULL; + + if (action == TGZ_LIST) + printf(" date time size file\n" + " ---------- -------- --------- -------------------------------------\n"); + while (1) + { + len = gzread(in, &buffer, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + /* + * Always expect complete blocks to process + * the tar information. + */ + if (len != BLOCKSIZE) + { + action = TGZ_INVALID; /* force error exit */ + remaining = 0; /* force I/O cleanup */ + } + + /* + * If we have to get a tar header + */ + if (getheader >= 1) + { + /* + * if we met the end of the tar + * or the end-of-tar block, + * we are done + */ + if (len == 0 || buffer.header.name[0] == 0) + break; + + tarmode = getoct(buffer.header.mode,8); + tartime = (time_t)getoct(buffer.header.mtime,12); + if (tarmode == -1 || tartime == (time_t)-1) + { + buffer.header.name[0] = 0; + action = TGZ_INVALID; + } + + if (getheader == 1) + { + strncpy(fname,buffer.header.name,SHORTNAMESIZE); + if (fname[SHORTNAMESIZE-1] != 0) + fname[SHORTNAMESIZE] = 0; + } + else + { + /* + * The file name is longer than SHORTNAMESIZE + */ + if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0) + error("bad long name"); + getheader = 1; + } + + /* + * Act according to the type flag + */ + switch (buffer.header.typeflag) + { + case DIRTYPE: + if (action == TGZ_LIST) + printf(" %s
%s\n",strtime(&tartime),fname); + if (action == TGZ_EXTRACT) + { + makedir(fname); + push_attr(&attributes,fname,tarmode,tartime); + } + break; + case REGTYPE: + case AREGTYPE: + remaining = getoct(buffer.header.size,12); + if (remaining == -1) + { + action = TGZ_INVALID; + break; + } + if (action == TGZ_LIST) + printf(" %s %9d %s\n",strtime(&tartime),remaining,fname); + else if (action == TGZ_EXTRACT) + { + if (matchname(arg,argc,argv,fname)) + { + outfile = fopen(fname,"wb"); + if (outfile == NULL) { + /* try creating directory */ + char *p = strrchr(fname, '/'); + if (p != NULL) { + *p = '\0'; + makedir(fname); + *p = '/'; + outfile = fopen(fname,"wb"); + } + } + if (outfile != NULL) + printf("Extracting %s\n",fname); + else + fprintf(stderr, "%s: Couldn't create %s",prog,fname); + } + else + outfile = NULL; + } + getheader = 0; + break; + case GNUTYPE_LONGLINK: + case GNUTYPE_LONGNAME: + remaining = getoct(buffer.header.size,12); + if (remaining < 0 || remaining >= BLOCKSIZE) + { + action = TGZ_INVALID; + break; + } + len = gzread(in, fname, BLOCKSIZE); + if (len < 0) + error(gzerror(in, &err)); + if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining) + { + action = TGZ_INVALID; + break; + } + getheader = 2; + break; + default: + if (action == TGZ_LIST) + printf(" %s <---> %s\n",strtime(&tartime),fname); + break; + } + } + else + { + unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining; + + if (outfile != NULL) + { + if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes) + { + fprintf(stderr, + "%s: Error writing %s -- skipping\n",prog,fname); + fclose(outfile); + outfile = NULL; + remove(fname); + } + } + remaining -= bytes; + } + + if (remaining == 0) + { + getheader = 1; + if (outfile != NULL) + { + fclose(outfile); + outfile = NULL; + if (action != TGZ_INVALID) + push_attr(&attributes,fname,tarmode,tartime); + } + } + + /* + * Abandon if errors are found + */ + if (action == TGZ_INVALID) + { + error("broken archive"); + break; + } + } + + /* + * Restore file modes and time stamps + */ + restore_attr(&attributes); + + if (gzclose(in) != Z_OK) + error("failed gzclose"); + + return 0; +} + + +/* ============================================================ */ + +void help(int exitval) +{ + printf("untgz version 0.2.1\n" + " using zlib version %s\n\n", + zlibVersion()); + printf("Usage: untgz file.tgz extract all files\n" + " untgz file.tgz fname ... extract selected files\n" + " untgz -l file.tgz list archive contents\n" + " untgz -h display this help\n"); + exit(exitval); +} + +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + + +/* ============================================================ */ + +#if defined(WIN32) && defined(__GNUC__) +int _CRT_glob = 0; /* disable argument globbing in MinGW */ +#endif + +int main(int argc,char **argv) +{ + int action = TGZ_EXTRACT; + int arg = 1; + char *TGZfile; + gzFile *f; + + prog = strrchr(argv[0],'\\'); + if (prog == NULL) + { + prog = strrchr(argv[0],'/'); + if (prog == NULL) + { + prog = strrchr(argv[0],':'); + if (prog == NULL) + prog = argv[0]; + else + prog++; + } + else + prog++; + } + else + prog++; + + if (argc == 1) + help(0); + + if (strcmp(argv[arg],"-l") == 0) + { + action = TGZ_LIST; + if (argc == ++arg) + help(0); + } + else if (strcmp(argv[arg],"-h") == 0) + { + help(0); + } + + if ((TGZfile = TGZfname(argv[arg])) == NULL) + TGZnotfound(argv[arg]); + + ++arg; + if ((action == TGZ_LIST) && (arg != argc)) + help(1); + +/* + * Process the TGZ file + */ + switch(action) + { + case TGZ_LIST: + case TGZ_EXTRACT: + f = gzopen(TGZfile,"rb"); + if (f == NULL) + { + fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile); + return 1; + } + exit(tar(f, action, arg, argc, argv)); + break; + + default: + error("Unknown option"); + exit(1); + } + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/readme.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/readme.txt new file mode 100644 index 0000000000..ebe13bf1d8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/readme.txt @@ -0,0 +1,60 @@ +Building instructions for the DLL versions of Zlib 1.2.4 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 9.0/10.0, and Visual C++ . + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + +first compile assembly code by running +bld_ml64.bat in contrib\masmx64 +bld_ml32.bat in contrib\masmx86 + + + + +Build instructions for Visual Studio 2008 (32 bits or 64 bits) +-------------------------------------------------------------- +- Uncompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008.0 +- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" + +Build instructions for Visual Studio 2010 (32 bits or 64 bits) +-------------------------------------------------------------- +- Uncompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010.0 + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj new file mode 100644 index 0000000000..1b3624215a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + true + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + ia64\MiniUnzip$(Configuration)\ + ia64\MiniUnzip$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters new file mode 100644 index 0000000000..0bd12210ca --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {048af943-022b-4db6-beeb-a54c34774ee2} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c1d600d2-888f-4aea-b73e-8b0dd9befa0c} + h;hpp;hxx;hm;inl;inc + + + {0844199a-966b-4f19-81db-1e0125e141b9} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/miniunz.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj new file mode 100644 index 0000000000..ccd3651df6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj @@ -0,0 +1,307 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + true + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + ia64\$(Configuration)\ + ia64\$(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters new file mode 100644 index 0000000000..7076d76ff6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {c0419b40-bf50-40da-b153-ff74215b79de} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {bb87b070-735b-478e-92ce-7383abb2f36c} + h;hpp;hxx;hm;inl;inc + + + {f46ab6a6-548f-43cb-ae96-681abb5bd5db} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/minizip.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj new file mode 100644 index 0000000000..476b8ea453 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj @@ -0,0 +1,420 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + MultiByte + true + + + Application + MultiByte + true + + + Application + MultiByte + + + Application + true + + + Application + true + + + Application + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + true + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + ia64\TestZlib$(Configuration)\ + ia64\TestZlib$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + EditAndContinue + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + ..\..\..;%(AdditionalIncludeDirectories) + ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters new file mode 100644 index 0000000000..3276491039 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {c1f6a2e3-5da5-4955-8653-310d3efe05a9} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {c2aaffdc-2c95-4d6f-8466-4bec5890af2c} + h;hpp;hxx;hm;inl;inc + + + {c274fe07-05f2-461c-964b-f6341e4e7eb5} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlib.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj new file mode 100644 index 0000000000..c6e453b4a1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj @@ -0,0 +1,310 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + Application + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + true + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + ia64\TestZlibDll$(Configuration)\ + ia64\TestZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebug + false + + + $(IntDir) + Level3 + EditAndContinue + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + Itanium + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + MachineIA64 + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + MachineX64 + + + + + Itanium + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + MachineIA64 + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters new file mode 100644 index 0000000000..ab87f09f47 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {fa61a89f-93fc-4c89-b29e-36224b7592f4} + cpp;c;cxx;def;odl;idl;hpj;bat;asm + + + {d4b85da0-2ba2-4934-b57f-e2584e3848ee} + h;hpp;hxx;hm;inl;inc + + + {e573e075-00bd-4a7d-bd67-a8cc9bfc5aca} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe + + + + + Source Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlib.rc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlib.rc new file mode 100644 index 0000000000..a399bb07e4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1,2,5,0 + PRODUCTVERSION 1,2,5,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.5\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlib.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2010 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj new file mode 100644 index 0000000000..93820211be --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj @@ -0,0 +1,457 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + StaticLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + ia64\ZlibStat$(Configuration)\ + ia64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + Itanium + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters new file mode 100644 index 0000000000..0c8b2501cc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters @@ -0,0 +1,77 @@ + + + + + {174213f6-7f66-4ae8-a3a8-a1e0a1e6ffdd} + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.def b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.def new file mode 100644 index 0000000000..fa171ae925 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.def @@ -0,0 +1,130 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.24 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.sln b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.sln new file mode 100644 index 0000000000..649f40c7ea --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.sln @@ -0,0 +1,135 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj new file mode 100644 index 0000000000..9bb4c636d8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj @@ -0,0 +1,659 @@ + + + + + Debug + Itanium + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + Itanium + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + Itanium + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + DynamicLibrary + false + true + + + DynamicLibrary + false + true + + + DynamicLibrary + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + true + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + ia64\ZlibDll$(Configuration)\ + ia64\ZlibDll$(Configuration)\Tmp\ + false + false + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + AllRules.ruleset + + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + + + MultiThreadedDebug + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Itanium + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineIA64 + + + + + + + + + + + + + + true + true + true + true + true + true + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters new file mode 100644 index 0000000000..22786824fc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters @@ -0,0 +1,118 @@ + + + + + {07934a85-8b61-443d-a0ee-b2eedb74f3cd} + cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90 + + + {1d99675b-433d-4a21-9e50-ed4ab8b19762} + h;hpp;hxx;hm;inl;fi;fd + + + {431c0958-fa71-44d0-9084-2d19d100c0cc} + ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Source Files + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/miniunz.vcproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/miniunz.vcproj new file mode 100644 index 0000000000..038a9e5faf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/miniunz.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/minizip.vcproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/minizip.vcproj new file mode 100644 index 0000000000..ad40239914 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/minizip.vcproj @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/testzlib.vcproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/testzlib.vcproj new file mode 100644 index 0000000000..c9f19d24ef --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/testzlib.vcproj @@ -0,0 +1,852 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/testzlibdll.vcproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/testzlibdll.vcproj new file mode 100644 index 0000000000..d7530fd7dc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/testzlibdll.vcproj @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlib.rc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlib.rc new file mode 100644 index 0000000000..a399bb07e4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1,2,5,0 + PRODUCTVERSION 1,2,5,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.2.5\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlib.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2010 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibstat.vcproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibstat.vcproj new file mode 100644 index 0000000000..d4ffb46b24 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibstat.vcproj @@ -0,0 +1,835 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.def b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.def new file mode 100644 index 0000000000..fa171ae925 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.def @@ -0,0 +1,130 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.24 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.sln b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.sln new file mode 100644 index 0000000000..75c64c3f4a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.sln @@ -0,0 +1,144 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" + ProjectSection(ProjectDependencies) = postProject + {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Itanium = Debug|Itanium + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Itanium = Release|Itanium + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.vcproj b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.vcproj new file mode 100644 index 0000000000..95bb241f30 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/contrib/vstudio/vc9/zlibvc.vcproj @@ -0,0 +1,1156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/crc32.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/crc32.c new file mode 100644 index 0000000000..91be372d22 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/crc32.c @@ -0,0 +1,442 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2006, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); + + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +local uLong crc32_combine_(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/crc32.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/crc32.h new file mode 100644 index 0000000000..8053b6117c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/deflate.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/deflate.c new file mode 100644 index 0000000000..5c4022f3d4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/deflate.c @@ -0,0 +1,1834 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->high_water = 0; /* nothing written to s->window yet */ + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > s->w_size) { + length = s->w_size; + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_BLOCK); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong complen, wraplen; + Bytef *str; + + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + + /* if can't get parameters, return conservative bound plus zlib wrapper */ + if (strm == Z_NULL || strm->state == Z_NULL) + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } + + /* if not default parameters, return conservative bound */ + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return complen + wraplen; + + /* default settings: return tight bound for that case */ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_BLOCK || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + } + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ + +#else /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for FASTEST only + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#endif /* FASTEST */ + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, last) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (last)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = NIL; + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { + scan = s->window + s->strstart - 1; + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/deflate.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/deflate.h new file mode 100644 index 0000000000..cbf0d1ea5d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/deflate.h @@ -0,0 +1,342 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2010 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + + /* in trees.c */ +void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); +int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); +void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch ZLIB_INTERNAL _length_code[]; + extern uch ZLIB_INTERNAL _dist_code[]; +#else + extern const uch ZLIB_INTERNAL _length_code[]; + extern const uch ZLIB_INTERNAL _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/algorithm.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/algorithm.txt new file mode 100644 index 0000000000..34960bddac --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend too much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://www.ietf.org/rfc/rfc1951.txt diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1950.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1950.txt new file mode 100644 index 0000000000..ce6428a0f2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1950.txt @@ -0,0 +1,619 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1950 Aladdin Enterprises +Category: Informational J-L. Gailly + Info-ZIP + May 1996 + + + ZLIB Compressed Data Format Specification version 3.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format. The + data can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a priori + bounded amount of intermediate storage. The format presently uses + the DEFLATE compression method but can be easily extended to use + other compression methods. It can be implemented readily in a manner + not covered by patents. This specification also defines the ADLER-32 + checksum (an extension and improvement of the Fletcher checksum), + used for detection of data corruption, and provides an algorithm for + computing it. + + + + +Deutsch & Gailly Informational [Page 1] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 3 + 2.1. Overall conventions ....................................... 3 + 2.2. Data format ............................................... 4 + 2.3. Compliance ................................................ 7 + 3. References ..................................................... 7 + 4. Source code .................................................... 8 + 5. Security Considerations ........................................ 8 + 6. Acknowledgements ............................................... 8 + 7. Authors' Addresses ............................................. 8 + 8. Appendix: Rationale ............................................ 9 + 9. Appendix: Sample code ..........................................10 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence can + be used in data communications or similar structures such as + Unix filters; + + * Can use a number of different compression methods; + + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely. + + The data format defined by this specification does not attempt to + allow random access to compressed data. + + + + + + + +Deutsch & Gailly Informational [Page 2] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into zlib format and/or decompress data from zlib + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compressed data format that can be + used for in-memory compression of a sequence of arbitrary bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below, for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + Version 3.1 was the first public release of this specification. + In version 3.2, some terminology was changed and the Adler-32 + sample code was rewritten for clarity. In version 3.3, the + support for a preset dictionary was introduced, and the + specification was converted to RFC style. + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + + + +Deutsch & Gailly Informational [Page 3] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the MOST-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00000010|00001000| + +--------+--------+ + ^ ^ + | | + | + less significant byte = 8 + + more significant byte = 2 x 256 + + 2.2. Data format + + A zlib stream has the following structure: + + 0 1 + +---+---+ + |CMF|FLG| (more-->) + +---+---+ + + + + + + + + +Deutsch & Gailly Informational [Page 4] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + (if FLG.FDICT set) + + 0 1 2 3 + +---+---+---+---+ + | DICTID | (more-->) + +---+---+---+---+ + + +=====================+---+---+---+---+ + |...compressed data...| ADLER32 | + +=====================+---+---+---+---+ + + Any data which may appear after ADLER32 are not part of the zlib + stream. + + CMF (Compression Method and flags) + This byte is divided into a 4-bit compression method and a 4- + bit information field depending on the compression method. + + bits 0 to 3 CM Compression method + bits 4 to 7 CINFO Compression info + + CM (Compression method) + This identifies the compression method used in the file. CM = 8 + denotes the "deflate" compression method with a window size up + to 32K. This is the method used by gzip and PNG (see + references [1] and [2] in Chapter 3, below, for the reference + documents). CM = 15 is reserved. It might be used in a future + version of this specification to indicate the presence of an + extra field before the compressed data. + + CINFO (Compression info) + For CM = 8, CINFO is the base-2 logarithm of the LZ77 window + size, minus eight (CINFO=7 indicates a 32K window size). Values + of CINFO above 7 are not allowed in this version of the + specification. CINFO is not defined in this specification for + CM not equal to 8. + + FLG (FLaGs) + This flag byte is divided as follows: + + bits 0 to 4 FCHECK (check bits for CMF and FLG) + bit 5 FDICT (preset dictionary) + bits 6 to 7 FLEVEL (compression level) + + The FCHECK value must be such that CMF and FLG, when viewed as + a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), + is a multiple of 31. + + + + +Deutsch & Gailly Informational [Page 5] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + FDICT (Preset dictionary) + If FDICT is set, a DICT dictionary identifier is present + immediately after the FLG byte. The dictionary is a sequence of + bytes which are initially fed to the compressor without + producing any compressed output. DICT is the Adler-32 checksum + of this sequence of bytes (see the definition of ADLER32 + below). The decompressor can use this identifier to determine + which dictionary has been used by the compressor. + + FLEVEL (Compression level) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + 0 - compressor used fastest algorithm + 1 - compressor used fast algorithm + 2 - compressor used default algorithm + 3 - compressor used maximum compression, slowest algorithm + + The information in FLEVEL is not needed for decompression; it + is there to indicate if recompression might be worthwhile. + + compressed data + For compression method 8, the compressed data is stored in the + deflate compressed data format as described in the document + "DEFLATE Compressed Data Format Specification" by L. Peter + Deutsch. (See reference [3] in Chapter 3, below) + + Other compressed data formats are not specified in this version + of the zlib specification. + + ADLER32 (Adler-32 checksum) + This contains a checksum value of the uncompressed data + (excluding any dictionary data) computed according to Adler-32 + algorithm. This algorithm is a 32-bit extension and improvement + of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 + standard. See references [4] and [5] in Chapter 3, below) + + Adler-32 is composed of two sums accumulated per byte: s1 is + the sum of all bytes, s2 is the sum of all s1 values. Both sums + are done modulo 65521. s1 is initialized to 1, s2 to zero. The + Adler-32 checksum is stored as s2*65536 + s1 in most- + significant-byte first (network) order. + + + + + + + + +Deutsch & Gailly Informational [Page 6] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + 2.3. Compliance + + A compliant compressor must produce streams with correct CMF, FLG + and ADLER32, but need not support preset dictionaries. When the + zlib data format is used as part of another standard data format, + the compressor may use only preset dictionaries that are specified + by this other data format. If this other format does not use the + preset dictionary feature, the compressor must not set the FDICT + flag. + + A compliant decompressor must check CMF, FLG, and ADLER32, and + provide an error indication if any of these have incorrect values. + A compliant decompressor must give an error indication if CM is + not one of the values defined in this specification (only the + value 8 is permitted in this version), since another value could + indicate the presence of new features that would cause subsequent + data to be interpreted incorrectly. A compliant decompressor must + give an error indication if FDICT is set and DICTID is not the + identifier of a known preset dictionary. A decompressor may + ignore FLEVEL and still be compliant. When the zlib data format + is being used as a part of another standard format, a compliant + decompressor must support all the preset dictionaries specified by + the other format. When the other format does not use the preset + dictionary feature, a compliant decompressor must reject any + stream in which the FDICT flag is set. + +3. References + + [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [2] Thomas Boutell, "PNG (Portable Network Graphics) specification", + available in ftp://ftp.uu.net/graphics/png/documents/ + + [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Fletcher, J. G., "An Arithmetic Checksum for Serial + Transmissions," IEEE Transactions on Communications, Vol. COM-30, + No. 1, January 1982, pp. 247-252. + + [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms," + November, 1993, pp. 144, 145. (Available from + gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073. + + + + + + + +Deutsch & Gailly Informational [Page 7] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +4. Source code + + Source code for a C language implementation of a "zlib" compliant + library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +5. Security Considerations + + A decoder that fails to check the ADLER32 checksum value may be + subject to undetected data corruption. + +6. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly and Mark Adler designed the zlib format and wrote + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +7. Authors' Addresses + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + + Jean-Loup Gailly + + EMail: + + Questions about the technical content of this specification can be + sent by email to + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + +Deutsch & Gailly Informational [Page 8] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +8. Appendix: Rationale + + 8.1. Preset dictionaries + + A preset dictionary is specially useful to compress short input + sequences. The compressor can take advantage of the dictionary + context to encode the input in a more compact manner. The + decompressor can be initialized with the appropriate context by + virtually decompressing a compressed version of the dictionary + without producing any output. However for certain compression + algorithms such as the deflate algorithm this operation can be + achieved without actually performing any decompression. + + The compressor and the decompressor must use exactly the same + dictionary. The dictionary may be fixed or may be chosen among a + certain number of predefined dictionaries, according to the kind + of input data. The decompressor can determine which dictionary has + been chosen by the compressor by checking the dictionary + identifier. This document does not specify the contents of + predefined dictionaries, since the optimal dictionaries are + application specific. Standard data formats using this feature of + the zlib specification must precisely define the allowed + dictionaries. + + 8.2. The Adler-32 algorithm + + The Adler-32 algorithm is much faster than the CRC32 algorithm yet + still provides an extremely low probability of undetected errors. + + The modulo on unsigned long accumulators can be delayed for 5552 + bytes, so the modulo operation time is negligible. If the bytes + are a, b, c, the second sum is 3a + 2b + c + 3, and so is position + and order sensitive, unlike the first sum, which is just a + checksum. That 65521 is prime is important to avoid a possible + large class of two-byte errors that leave the check unchanged. + (The Fletcher checksum uses 255, which is not prime and which also + makes the Fletcher check insensitive to single byte changes 0 <-> + 255.) + + The sum s1 is initialized to 1 instead of zero to make the length + of the sequence part of s2, so that the length does not have to be + checked separately. (Any sequence of zeroes has a Fletcher + checksum of zero.) + + + + + + + + +Deutsch & Gailly Informational [Page 9] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + +9. Appendix: Sample code + + The following C code computes the Adler-32 checksum of a data buffer. + It is written for clarity, not for speed. The sample code is in the + ANSI C programming language. Non C users may find it easier to read + with these hints: + + & Bitwise AND operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero bit(s) + at the left. + << Bitwise left shift operator. Left shift inserts zero + bit(s) at the right. + ++ "n++" increments the variable n. + % modulo operator: a % b is the remainder of a divided by b. + + #define BASE 65521 /* largest prime smaller than 65536 */ + + /* + Update a running Adler-32 checksum with the bytes buf[0..len-1] + and return the updated checksum. The Adler-32 checksum should be + initialized to 1. + + Usage example: + + unsigned long adler = 1L; + + while (read_buffer(buffer, length) != EOF) { + adler = update_adler32(adler, buffer, length); + } + if (adler != original_adler) error(); + */ + unsigned long update_adler32(unsigned long adler, + unsigned char *buf, int len) + { + unsigned long s1 = adler & 0xffff; + unsigned long s2 = (adler >> 16) & 0xffff; + int n; + + for (n = 0; n < len; n++) { + s1 = (s1 + buf[n]) % BASE; + s2 = (s2 + s1) % BASE; + } + return (s2 << 16) + s1; + } + + /* Return the adler32 of the bytes buf[0..len-1] */ + + + + +Deutsch & Gailly Informational [Page 10] + +RFC 1950 ZLIB Compressed Data Format Specification May 1996 + + + unsigned long adler32(unsigned char *buf, int len) + { + return update_adler32(1L, buf, len); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch & Gailly Informational [Page 11] + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1951.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1951.txt new file mode 100644 index 0000000000..403c8c722f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1951.txt @@ -0,0 +1,955 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1951 Aladdin Enterprises +Category: Informational May 1996 + + + DEFLATE Compressed Data Format Specification version 1.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that + compresses data using a combination of the LZ77 algorithm and Huffman + coding, with efficiency comparable to the best currently available + general-purpose compression methods. The data can be produced or + consumed, even for an arbitrarily long sequentially presented input + data stream, using only an a priori bounded amount of intermediate + storage. The format can be implemented readily in a manner not + covered by patents. + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................ 3 + 1.6. Changes from previous versions ............................ 4 + 2. Compressed representation overview ............................. 4 + 3. Detailed specification ......................................... 5 + 3.1. Overall conventions ....................................... 5 + 3.1.1. Packing into bytes .................................. 5 + 3.2. Compressed block format ................................... 6 + 3.2.1. Synopsis of prefix and Huffman coding ............... 6 + 3.2.2. Use of Huffman coding in the "deflate" format ....... 7 + 3.2.3. Details of block format ............................. 9 + 3.2.4. Non-compressed blocks (BTYPE=00) ................... 11 + 3.2.5. Compressed blocks (length and distance codes) ...... 11 + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12 + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13 + 3.3. Compliance ............................................... 14 + 4. Compression algorithm details ................................. 14 + 5. References .................................................... 16 + 6. Security Considerations ....................................... 16 + 7. Source code ................................................... 16 + 8. Acknowledgements .............................................. 16 + 9. Author's Address .............................................. 17 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can be produced or consumed, even for an arbitrarily long + sequentially presented input data stream, using only an a + priori bounded amount of intermediate storage, and hence + can be used in data communications or similar structures + such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + + + +Deutsch Informational [Page 2] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + The data format defined by this specification does not attempt to: + + * Allow random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well + as the best currently available specialized algorithms. + + A simple counting argument shows that no lossless compression + algorithm can compress every possible input data set. For the + format defined here, the worst case expansion is 5 bytes per 32K- + byte block, i.e., a size increase of 0.015% for large data sets. + English text usually compresses by a factor of 2.5 to 3; + executable files usually compress somewhat less; graphical data + such as raster images may compress much more. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into "deflate" format and/or decompress data from + "deflate" format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. Familiarity with the technique of Huffman coding + is helpful but not required. + + 1.3. Scope + + The specification specifies a method for representing a sequence + of bytes as a (usually shorter) sequence of bits, and a method for + packing the latter bit sequence into bytes. + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any data set that conforms to all + the specifications presented here; a compliant compressor must + produce data sets that conform to all the specifications presented + here. + + 1.5. Definitions of terms and conventions used + + Byte: 8 bits stored or transmitted as a unit (same as an octet). + For this specification, a byte is exactly 8 bits, even on machines + + + +Deutsch Informational [Page 3] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + which store a character on a number of bits different from eight. + See below, for the numbering of bits within a byte. + + String: a sequence of arbitrary bytes. + + 1.6. Changes from previous versions + + There have been no technical changes to the deflate format since + version 1.1 of this specification. In version 1.2, some + terminology was changed. Version 1.3 is a conversion of the + specification to RFC style. + +2. Compressed representation overview + + A compressed data set consists of a series of blocks, corresponding + to successive blocks of input data. The block sizes are arbitrary, + except that non-compressible blocks are limited to 65,535 bytes. + + Each block is compressed using a combination of the LZ77 algorithm + and Huffman coding. The Huffman trees for each block are independent + of those for previous or subsequent blocks; the LZ77 algorithm may + use a reference to a duplicated string occurring in a previous block, + up to 32K input bytes before. + + Each block consists of two parts: a pair of Huffman code trees that + describe the representation of the compressed data part, and a + compressed data part. (The Huffman trees themselves are compressed + using Huffman encoding.) The compressed data consists of a series of + elements of two types: literal bytes (of strings that have not been + detected as duplicated within the previous 32K input bytes), and + pointers to duplicated strings, where a pointer is represented as a + pair . The representation used in the + "deflate" format limits distances to 32K bytes and lengths to 258 + bytes, but does not limit the size of a block, except for + uncompressible blocks, which are limited as noted above. + + Each type of value (literals, distances, and lengths) in the + compressed data is represented using a Huffman code, using one code + tree for literals and lengths and a separate code tree for distances. + The code trees for each block appear in a compact form just before + the compressed data for that block. + + + + + + + + + + +Deutsch Informational [Page 4] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +3. Detailed specification + + 3.1. Overall conventions In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + 3.1.1. Packing into bytes + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, + since the final data format described here is byte- rather than + + + +Deutsch Informational [Page 5] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + bit-oriented. However, we describe the compressed block format + in below, as a sequence of data elements of various bit + lengths, not a sequence of bytes. We must therefore specify + how to pack these data elements into bytes to form the final + compressed byte sequence: + + * Data elements are packed into bytes in order of + increasing bit number within the byte, i.e., starting + with the least-significant bit of the byte. + * Data elements other than Huffman codes are packed + starting with the least-significant bit of the data + element. + * Huffman codes are packed starting with the most- + significant bit of the code. + + In other words, if one were to print out the compressed data as + a sequence of bytes, starting with the first byte at the + *right* margin and proceeding to the *left*, with the most- + significant bit of each byte on the left as usual, one would be + able to parse the result from right to left, with fixed-width + elements in the correct MSB-to-LSB order and Huffman codes in + bit-reversed order (i.e., with the first bit of the code in the + relative LSB position). + + 3.2. Compressed block format + + 3.2.1. Synopsis of prefix and Huffman coding + + Prefix coding represents symbols from an a priori known + alphabet by bit sequences (codes), one code for each symbol, in + a manner such that different symbols may be represented by bit + sequences of different lengths, but a parser can always parse + an encoded string unambiguously symbol-by-symbol. + + We define a prefix code in terms of a binary tree in which the + two edges descending from each non-leaf node are labeled 0 and + 1 and in which the leaf nodes correspond one-for-one with (are + labeled with) the symbols of the alphabet; then the code for a + symbol is the sequence of 0's and 1's on the edges leading from + the root to the leaf labeled with that symbol. For example: + + + + + + + + + + + +Deutsch Informational [Page 6] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + /\ Symbol Code + 0 1 ------ ---- + / \ A 00 + /\ B B 1 + 0 1 C 011 + / \ D 010 + A /\ + 0 1 + / \ + D C + + A parser can decode the next symbol from an encoded input + stream by walking down the tree from the root, at each step + choosing the edge corresponding to the next input bit. + + Given an alphabet with known symbol frequencies, the Huffman + algorithm allows the construction of an optimal prefix code + (one which represents strings with those symbol frequencies + using the fewest bits of any possible prefix codes for that + alphabet). Such a code is called a Huffman code. (See + reference [1] in Chapter 5, references for additional + information on Huffman codes.) + + Note that in the "deflate" format, the Huffman codes for the + various alphabets must not exceed certain maximum code lengths. + This constraint complicates the algorithm for computing code + lengths from symbol frequencies. Again, see Chapter 5, + references for details. + + 3.2.2. Use of Huffman coding in the "deflate" format + + The Huffman codes used for each alphabet in the "deflate" + format have two additional rules: + + * All codes of a given bit length have lexicographically + consecutive values, in the same order as the symbols + they represent; + + * Shorter codes lexicographically precede longer codes. + + + + + + + + + + + + +Deutsch Informational [Page 7] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + We could recode the example above to follow this rule as + follows, assuming that the order of the alphabet is ABCD: + + Symbol Code + ------ ---- + A 10 + B 0 + C 110 + D 111 + + I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are + lexicographically consecutive. + + Given this rule, we can define the Huffman code for an alphabet + just by giving the bit lengths of the codes for each symbol of + the alphabet in order; this is sufficient to determine the + actual codes. In our example, the code is completely defined + by the sequence of bit lengths (2, 1, 3, 3). The following + algorithm generates the codes as integers, intended to be read + from most- to least-significant bit. The code lengths are + initially in tree[I].Len; the codes are produced in + tree[I].Code. + + 1) Count the number of codes for each code length. Let + bl_count[N] be the number of codes of length N, N >= 1. + + 2) Find the numerical value of the smallest code for each + code length: + + code = 0; + bl_count[0] = 0; + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code; + } + + 3) Assign numerical values to all codes, using consecutive + values for all codes of the same length with the base + values determined at step 2. Codes that are never used + (which have a bit length of zero) must not be assigned a + value. + + for (n = 0; n <= max_code; n++) { + len = tree[n].Len; + if (len != 0) { + tree[n].Code = next_code[len]; + next_code[len]++; + } + + + +Deutsch Informational [Page 8] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + } + + Example: + + Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3, + 3, 2, 4, 4). After step 1, we have: + + N bl_count[N] + - ----------- + 2 1 + 3 5 + 4 2 + + Step 2 computes the following next_code values: + + N next_code[N] + - ------------ + 1 0 + 2 0 + 3 2 + 4 14 + + Step 3 produces the following code values: + + Symbol Length Code + ------ ------ ---- + A 3 010 + B 3 011 + C 3 100 + D 3 101 + E 3 110 + F 2 00 + G 4 1110 + H 4 1111 + + 3.2.3. Details of block format + + Each block of compressed data begins with 3 header bits + containing the following data: + + first bit BFINAL + next 2 bits BTYPE + + Note that the header bits do not necessarily begin on a byte + boundary, since a block does not necessarily occupy an integral + number of bytes. + + + + + +Deutsch Informational [Page 9] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + BFINAL is set if and only if this is the last block of the data + set. + + BTYPE specifies how the data are compressed, as follows: + + 00 - no compression + 01 - compressed with fixed Huffman codes + 10 - compressed with dynamic Huffman codes + 11 - reserved (error) + + The only difference between the two compressed cases is how the + Huffman codes for the literal/length and distance alphabets are + defined. + + In all cases, the decoding algorithm for the actual data is as + follows: + + do + read block header from input stream. + if stored with no compression + skip any remaining bits in current partially + processed byte + read LEN and NLEN (see next section) + copy LEN bytes of data to output + otherwise + if compressed with dynamic Huffman codes + read representation of code trees (see + subsection below) + loop (until end of block code recognized) + decode literal/length value from input stream + if value < 256 + copy value (literal byte) to output stream + otherwise + if value = end of block (256) + break from loop + otherwise (value = 257..285) + decode distance from input stream + + move backwards distance bytes in the output + stream, and copy length bytes from this + position to the output stream. + end loop + while not last block + + Note that a duplicated string reference may refer to a string + in a previous block; i.e., the backward distance may cross one + or more block boundaries. However a distance cannot refer past + the beginning of the output stream. (An application using a + + + +Deutsch Informational [Page 10] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + preset dictionary might discard part of the output stream; a + distance can refer to that part of the output stream anyway) + Note also that the referenced string may overlap the current + position; for example, if the last 2 bytes decoded have values + X and Y, a string reference with + adds X,Y,X,Y,X to the output stream. + + We now specify each compression method in turn. + + 3.2.4. Non-compressed blocks (BTYPE=00) + + Any bits of input up to the next byte boundary are ignored. + The rest of the block consists of the following information: + + 0 1 2 3 4... + +---+---+---+---+================================+ + | LEN | NLEN |... LEN bytes of literal data...| + +---+---+---+---+================================+ + + LEN is the number of data bytes in the block. NLEN is the + one's complement of LEN. + + 3.2.5. Compressed blocks (length and distance codes) + + As noted above, encoded data blocks in the "deflate" format + consist of sequences of symbols drawn from three conceptually + distinct alphabets: either literal bytes, from the alphabet of + byte values (0..255), or pairs, + where the length is drawn from (3..258) and the distance is + drawn from (1..32,768). In fact, the literal and length + alphabets are merged into a single alphabet (0..285), where + values 0..255 represent literal bytes, the value 256 indicates + end-of-block, and values 257..285 represent length codes + (possibly in conjunction with extra bits following the symbol + code) as follows: + + + + + + + + + + + + + + + + +Deutsch Informational [Page 11] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + Extra Extra Extra + Code Bits Length(s) Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- + 257 0 3 267 1 15,16 277 4 67-82 + 258 0 4 268 1 17,18 278 4 83-98 + 259 0 5 269 2 19-22 279 4 99-114 + 260 0 6 270 2 23-26 280 4 115-130 + 261 0 7 271 2 27-30 281 5 131-162 + 262 0 8 272 2 31-34 282 5 163-194 + 263 0 9 273 3 35-42 283 5 195-226 + 264 0 10 274 3 43-50 284 5 227-257 + 265 1 11,12 275 3 51-58 285 0 258 + 266 1 13,14 276 3 59-66 + + The extra bits should be interpreted as a machine integer + stored with the most-significant bit first, e.g., bits 1110 + represent the value 14. + + Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- + 0 0 1 10 4 33-48 20 9 1025-1536 + 1 0 2 11 4 49-64 21 9 1537-2048 + 2 0 3 12 5 65-96 22 10 2049-3072 + 3 0 4 13 5 97-128 23 10 3073-4096 + 4 1 5,6 14 6 129-192 24 11 4097-6144 + 5 1 7,8 15 6 193-256 25 11 6145-8192 + 6 2 9-12 16 7 257-384 26 12 8193-12288 + 7 2 13-16 17 7 385-512 27 12 12289-16384 + 8 3 17-24 18 8 513-768 28 13 16385-24576 + 9 3 25-32 19 8 769-1024 29 13 24577-32768 + + 3.2.6. Compression with fixed Huffman codes (BTYPE=01) + + The Huffman codes for the two alphabets are fixed, and are not + represented explicitly in the data. The Huffman code lengths + for the literal/length alphabet are: + + Lit Value Bits Codes + --------- ---- ----- + 0 - 143 8 00110000 through + 10111111 + 144 - 255 9 110010000 through + 111111111 + 256 - 279 7 0000000 through + 0010111 + 280 - 287 8 11000000 through + 11000111 + + + +Deutsch Informational [Page 12] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + The code lengths are sufficient to generate the actual codes, + as described above; we show the codes in the table for added + clarity. Literal/length values 286-287 will never actually + occur in the compressed data, but participate in the code + construction. + + Distance codes 0-31 are represented by (fixed-length) 5-bit + codes, with possible additional bits as shown in the table + shown in Paragraph 3.2.5, above. Note that distance codes 30- + 31 will never actually occur in the compressed data. + + 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) + + The Huffman codes for the two alphabets appear in the block + immediately after the header bits and before the actual + compressed data, first the literal/length code and then the + distance code. Each code is defined by a sequence of code + lengths, as discussed in Paragraph 3.2.2, above. For even + greater compactness, the code length sequences themselves are + compressed using a Huffman code. The alphabet for code lengths + is as follows: + + 0 - 15: Represent code lengths of 0 - 15 + 16: Copy the previous code length 3 - 6 times. + The next 2 bits indicate repeat length + (0 = 3, ... , 3 = 6) + Example: Codes 8, 16 (+2 bits 11), + 16 (+2 bits 10) will expand to + 12 code lengths of 8 (1 + 6 + 5) + 17: Repeat a code length of 0 for 3 - 10 times. + (3 bits of length) + 18: Repeat a code length of 0 for 11 - 138 times + (7 bits of length) + + A code length of 0 indicates that the corresponding symbol in + the literal/length or distance alphabet will not occur in the + block, and should not participate in the Huffman code + construction algorithm given earlier. If only one distance + code is used, it is encoded using one bit, not zero bits; in + this case there is a single code length of one, with one unused + code. One distance code of zero bits means that there are no + distance codes used at all (the data is all literals). + + We can now define the format of the block: + + 5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286) + 5 Bits: HDIST, # of Distance codes - 1 (1 - 32) + 4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19) + + + +Deutsch Informational [Page 13] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + (HCLEN + 4) x 3 bits: code lengths for the code length + alphabet given just above, in the order: 16, 17, 18, + 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + + These code lengths are interpreted as 3-bit integers + (0-7); as above, a code length of 0 means the + corresponding symbol (literal/length or distance code + length) is not used. + + HLIT + 257 code lengths for the literal/length alphabet, + encoded using the code length Huffman code + + HDIST + 1 code lengths for the distance alphabet, + encoded using the code length Huffman code + + The actual compressed data of the block, + encoded using the literal/length and distance Huffman + codes + + The literal/length symbol 256 (end of data), + encoded using the literal/length Huffman code + + The code length repeat codes can cross from HLIT + 257 to the + HDIST + 1 code lengths. In other words, all code lengths form + a single sequence of HLIT + HDIST + 258 values. + + 3.3. Compliance + + A compressor may limit further the ranges of values specified in + the previous section and still be compliant; for example, it may + limit the range of backward pointers to some value smaller than + 32K. Similarly, a compressor may limit the size of blocks so that + a compressible block fits in memory. + + A compliant decompressor must accept the full range of possible + values defined in the previous section, and must accept blocks of + arbitrary size. + +4. Compression algorithm details + + While it is the intent of this document to define the "deflate" + compressed data format without reference to any particular + compression algorithm, the format is related to the compressed + formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below); + since many variations of LZ77 are patented, it is strongly + recommended that the implementor of a compressor follow the general + algorithm presented here, which is known not to be patented per se. + The material in this section is not part of the definition of the + + + +Deutsch Informational [Page 14] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + + specification per se, and a compressor need not follow it in order to + be compliant. + + The compressor terminates a block when it determines that starting a + new block with fresh trees would be useful, or when the block size + fills up the compressor's block buffer. + + The compressor uses a chained hash table to find duplicated strings, + using a hash function that operates on 3-byte sequences. At any + given point during compression, let XYZ be the next 3 input bytes to + be examined (not necessarily all different, of course). First, the + compressor examines the hash chain for XYZ. If the chain is empty, + the compressor simply writes out X as a literal byte and advances one + byte in the input. If the hash chain is not empty, indicating that + the sequence XYZ (or, if we are unlucky, some other 3 bytes with the + same hash function value) has occurred recently, the compressor + compares all strings on the XYZ hash chain with the actual input data + sequence starting at the current point, and selects the longest + match. + + The compressor searches the hash chains starting with the most recent + strings, to favor small distances and thus take advantage of the + Huffman encoding. The hash chains are singly linked. There are no + deletions from the hash chains; the algorithm simply discards matches + that are too old. To avoid a worst-case situation, very long hash + chains are arbitrarily truncated at a certain length, determined by a + run-time parameter. + + To improve overall compression, the compressor optionally defers the + selection of matches ("lazy matching"): after a match of length N has + been found, the compressor searches for a longer match starting at + the next input byte. If it finds a longer match, it truncates the + previous match to a length of one (thus producing a single literal + byte) and then emits the longer match. Otherwise, it emits the + original match, and, as described above, advances N bytes before + continuing. + + Run-time parameters also control this "lazy match" procedure. If + compression ratio is most important, the compressor attempts a + complete second search regardless of the length of the first match. + In the normal case, if the current match is "long enough", the + compressor reduces the search for a longer match, thus speeding up + the process. If speed is most important, the compressor inserts new + strings in the hash table only when no match was found, or when the + match is not "too long". This degrades the compression ratio but + saves time since there are both fewer insertions and fewer searches. + + + + + +Deutsch Informational [Page 15] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +5. References + + [1] Huffman, D. A., "A Method for the Construction of Minimum + Redundancy Codes", Proceedings of the Institute of Radio + Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101. + + [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data + Compression", IEEE Transactions on Information Theory, Vol. 23, + No. 3, pp. 337-343. + + [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources, + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources, + available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/ + + [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix + encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169. + + [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes," + Comm. ACM, 33,4, April 1990, pp. 449-459. + +6. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data. See + reference [3], for example. + +7. Source code + + Source code for a C language implementation of a "deflate" compliant + compressor and decompressor is available within the zlib package at + ftp://ftp.uu.net/pub/archiving/zip/zlib/. + +8. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Phil Katz designed the deflate format. Jean-Loup Gailly and Mark + Adler wrote the related software described in this specification. + Glenn Randers-Pehrson converted this document to RFC and HTML format. + + + +Deutsch Informational [Page 16] + +RFC 1951 DEFLATE Compressed Data Format Specification May 1996 + + +9. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Deutsch Informational [Page 17] + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1952.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1952.txt new file mode 100644 index 0000000000..a8e51b4567 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/rfc1952.txt @@ -0,0 +1,675 @@ + + + + + + +Network Working Group P. Deutsch +Request for Comments: 1952 Aladdin Enterprises +Category: Informational May 1996 + + + GZIP file format specification version 4.3 + +Status of This Memo + + This memo provides information for the Internet community. This memo + does not specify an Internet standard of any kind. Distribution of + this memo is unlimited. + +IESG Note: + + The IESG takes no position on the validity of any Intellectual + Property Rights statements contained in this document. + +Notices + + Copyright (c) 1996 L. Peter Deutsch + + Permission is granted to copy and distribute this document for any + purpose and without charge, including translations into other + languages and incorporation into compilations, provided that the + copyright notice and this notice are preserved, and that any + substantive changes or deletions from the original are clearly + marked. + + A pointer to the latest version of this and related documentation in + HTML format can be found at the URL + . + +Abstract + + This specification defines a lossless compressed data format that is + compatible with the widely used GZIP utility. The format includes a + cyclic redundancy check value for detecting data corruption. The + format presently uses the DEFLATE method of compression but can be + easily extended to use other compression methods. The format can be + implemented readily in a manner not covered by patents. + + + + + + + + + + +Deutsch Informational [Page 1] + +RFC 1952 GZIP File Format Specification May 1996 + + +Table of Contents + + 1. Introduction ................................................... 2 + 1.1. Purpose ................................................... 2 + 1.2. Intended audience ......................................... 3 + 1.3. Scope ..................................................... 3 + 1.4. Compliance ................................................ 3 + 1.5. Definitions of terms and conventions used ................. 3 + 1.6. Changes from previous versions ............................ 3 + 2. Detailed specification ......................................... 4 + 2.1. Overall conventions ....................................... 4 + 2.2. File format ............................................... 5 + 2.3. Member format ............................................. 5 + 2.3.1. Member header and trailer ........................... 6 + 2.3.1.1. Extra field ................................... 8 + 2.3.1.2. Compliance .................................... 9 + 3. References .................................................. 9 + 4. Security Considerations .................................... 10 + 5. Acknowledgements ........................................... 10 + 6. Author's Address ........................................... 10 + 7. Appendix: Jean-Loup Gailly's gzip utility .................. 11 + 8. Appendix: Sample CRC Code .................................. 11 + +1. Introduction + + 1.1. Purpose + + The purpose of this specification is to define a lossless + compressed data format that: + + * Is independent of CPU type, operating system, file system, + and character set, and hence can be used for interchange; + * Can compress or decompress a data stream (as opposed to a + randomly accessible file) to produce another data stream, + using only an a priori bounded amount of intermediate + storage, and hence can be used in data communications or + similar structures such as Unix filters; + * Compresses data with efficiency comparable to the best + currently available general-purpose compression methods, + and in particular considerably better than the "compress" + program; + * Can be implemented readily in a manner not covered by + patents, and hence can be practiced freely; + * Is compatible with the file format produced by the current + widely used gzip utility, in that conforming decompressors + will be able to read data produced by the existing gzip + compressor. + + + + +Deutsch Informational [Page 2] + +RFC 1952 GZIP File Format Specification May 1996 + + + The data format defined by this specification does not attempt to: + + * Provide random access to compressed data; + * Compress specialized data (e.g., raster graphics) as well as + the best currently available specialized algorithms. + + 1.2. Intended audience + + This specification is intended for use by implementors of software + to compress data into gzip format and/or decompress data from gzip + format. + + The text of the specification assumes a basic background in + programming at the level of bits and other primitive data + representations. + + 1.3. Scope + + The specification specifies a compression method and a file format + (the latter assuming only that a file can store a sequence of + arbitrary bytes). It does not specify any particular interface to + a file system or anything about character sets or encodings + (except for file names and comments, which are optional). + + 1.4. Compliance + + Unless otherwise indicated below, a compliant decompressor must be + able to accept and decompress any file that conforms to all the + specifications presented here; a compliant compressor must produce + files that conform to all the specifications presented here. The + material in the appendices is not part of the specification per se + and is not relevant to compliance. + + 1.5. Definitions of terms and conventions used + + byte: 8 bits stored or transmitted as a unit (same as an octet). + (For this specification, a byte is exactly 8 bits, even on + machines which store a character on a number of bits different + from 8.) See below for the numbering of bits within a byte. + + 1.6. Changes from previous versions + + There have been no technical changes to the gzip format since + version 4.1 of this specification. In version 4.2, some + terminology was changed, and the sample CRC code was rewritten for + clarity and to eliminate the requirement for the caller to do pre- + and post-conditioning. Version 4.3 is a conversion of the + specification to RFC style. + + + +Deutsch Informational [Page 3] + +RFC 1952 GZIP File Format Specification May 1996 + + +2. Detailed specification + + 2.1. Overall conventions + + In the diagrams below, a box like this: + + +---+ + | | <-- the vertical bars might be missing + +---+ + + represents one byte; a box like this: + + +==============+ + | | + +==============+ + + represents a variable number of bytes. + + Bytes stored within a computer do not have a "bit order", since + they are always treated as a unit. However, a byte considered as + an integer between 0 and 255 does have a most- and least- + significant bit, and since we write numbers with the most- + significant digit on the left, we also write bytes with the most- + significant bit on the left. In the diagrams below, we number the + bits of a byte so that bit 0 is the least-significant bit, i.e., + the bits are numbered: + + +--------+ + |76543210| + +--------+ + + This document does not address the issue of the order in which + bits of a byte are transmitted on a bit-sequential medium, since + the data format described here is byte- rather than bit-oriented. + + Within a computer, a number may occupy multiple bytes. All + multi-byte numbers in the format described here are stored with + the least-significant byte first (at the lower memory address). + For example, the decimal number 520 is stored as: + + 0 1 + +--------+--------+ + |00001000|00000010| + +--------+--------+ + ^ ^ + | | + | + more significant byte = 2 x 256 + + less significant byte = 8 + + + +Deutsch Informational [Page 4] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.2. File format + + A gzip file consists of a series of "members" (compressed data + sets). The format of each member is specified in the following + section. The members simply appear one after another in the file, + with no additional information before, between, or after them. + + 2.3. Member format + + Each member has the following structure: + + +---+---+---+---+---+---+---+---+---+---+ + |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->) + +---+---+---+---+---+---+---+---+---+---+ + + (if FLG.FEXTRA set) + + +---+---+=================================+ + | XLEN |...XLEN bytes of "extra field"...| (more-->) + +---+---+=================================+ + + (if FLG.FNAME set) + + +=========================================+ + |...original file name, zero-terminated...| (more-->) + +=========================================+ + + (if FLG.FCOMMENT set) + + +===================================+ + |...file comment, zero-terminated...| (more-->) + +===================================+ + + (if FLG.FHCRC set) + + +---+---+ + | CRC16 | + +---+---+ + + +=======================+ + |...compressed blocks...| (more-->) + +=======================+ + + 0 1 2 3 4 5 6 7 + +---+---+---+---+---+---+---+---+ + | CRC32 | ISIZE | + +---+---+---+---+---+---+---+---+ + + + + +Deutsch Informational [Page 5] + +RFC 1952 GZIP File Format Specification May 1996 + + + 2.3.1. Member header and trailer + + ID1 (IDentification 1) + ID2 (IDentification 2) + These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 + (0x8b, \213), to identify the file as being in gzip format. + + CM (Compression Method) + This identifies the compression method used in the file. CM + = 0-7 are reserved. CM = 8 denotes the "deflate" + compression method, which is the one customarily used by + gzip and which is documented elsewhere. + + FLG (FLaGs) + This flag byte is divided into individual bits as follows: + + bit 0 FTEXT + bit 1 FHCRC + bit 2 FEXTRA + bit 3 FNAME + bit 4 FCOMMENT + bit 5 reserved + bit 6 reserved + bit 7 reserved + + If FTEXT is set, the file is probably ASCII text. This is + an optional indication, which the compressor may set by + checking a small amount of the input data to see whether any + non-ASCII characters are present. In case of doubt, FTEXT + is cleared, indicating binary data. For systems which have + different file formats for ascii text and binary data, the + decompressor can use FTEXT to choose the appropriate format. + We deliberately do not specify the algorithm used to set + this bit, since a compressor always has the option of + leaving it cleared and a decompressor always has the option + of ignoring it and letting some other program handle issues + of data conversion. + + If FHCRC is set, a CRC16 for the gzip header is present, + immediately before the compressed data. The CRC16 consists + of the two least significant bytes of the CRC32 for all + bytes of the gzip header up to and not including the CRC16. + [The FHCRC bit was never set by versions of gzip up to + 1.2.4, even though it was documented with a different + meaning in gzip 1.2.4.] + + If FEXTRA is set, optional extra fields are present, as + described in a following section. + + + +Deutsch Informational [Page 6] + +RFC 1952 GZIP File Format Specification May 1996 + + + If FNAME is set, an original file name is present, + terminated by a zero byte. The name must consist of ISO + 8859-1 (LATIN-1) characters; on operating systems using + EBCDIC or any other character set for file names, the name + must be translated to the ISO LATIN-1 character set. This + is the original name of the file being compressed, with any + directory components removed, and, if the file being + compressed is on a file system with case insensitive names, + forced to lower case. There is no original file name if the + data was compressed from a source other than a named file; + for example, if the source was stdin on a Unix system, there + is no file name. + + If FCOMMENT is set, a zero-terminated file comment is + present. This comment is not interpreted; it is only + intended for human consumption. The comment must consist of + ISO 8859-1 (LATIN-1) characters. Line breaks should be + denoted by a single line feed character (10 decimal). + + Reserved FLG bits must be zero. + + MTIME (Modification TIME) + This gives the most recent modification time of the original + file being compressed. The time is in Unix format, i.e., + seconds since 00:00:00 GMT, Jan. 1, 1970. (Note that this + may cause problems for MS-DOS and other systems that use + local rather than Universal time.) If the compressed data + did not come from a file, MTIME is set to the time at which + compression started. MTIME = 0 means no time stamp is + available. + + XFL (eXtra FLags) + These flags are available for use by specific compression + methods. The "deflate" method (CM = 8) sets these flags as + follows: + + XFL = 2 - compressor used maximum compression, + slowest algorithm + XFL = 4 - compressor used fastest algorithm + + OS (Operating System) + This identifies the type of file system on which compression + took place. This may be useful in determining end-of-line + convention for text files. The currently defined values are + as follows: + + + + + + +Deutsch Informational [Page 7] + +RFC 1952 GZIP File Format Specification May 1996 + + + 0 - FAT filesystem (MS-DOS, OS/2, NT/Win32) + 1 - Amiga + 2 - VMS (or OpenVMS) + 3 - Unix + 4 - VM/CMS + 5 - Atari TOS + 6 - HPFS filesystem (OS/2, NT) + 7 - Macintosh + 8 - Z-System + 9 - CP/M + 10 - TOPS-20 + 11 - NTFS filesystem (NT) + 12 - QDOS + 13 - Acorn RISCOS + 255 - unknown + + XLEN (eXtra LENgth) + If FLG.FEXTRA is set, this gives the length of the optional + extra field. See below for details. + + CRC32 (CRC-32) + This contains a Cyclic Redundancy Check value of the + uncompressed data computed according to CRC-32 algorithm + used in the ISO 3309 standard and in section 8.1.1.6.2 of + ITU-T recommendation V.42. (See http://www.iso.ch for + ordering ISO documents. See gopher://info.itu.ch for an + online version of ITU-T V.42.) + + ISIZE (Input SIZE) + This contains the size of the original (uncompressed) input + data modulo 2^32. + + 2.3.1.1. Extra field + + If the FLG.FEXTRA bit is set, an "extra field" is present in + the header, with total length XLEN bytes. It consists of a + series of subfields, each of the form: + + +---+---+---+---+==================================+ + |SI1|SI2| LEN |... LEN bytes of subfield data ...| + +---+---+---+---+==================================+ + + SI1 and SI2 provide a subfield ID, typically two ASCII letters + with some mnemonic value. Jean-Loup Gailly + is maintaining a registry of subfield + IDs; please send him any subfield ID you wish to use. Subfield + IDs with SI2 = 0 are reserved for future use. The following + IDs are currently defined: + + + +Deutsch Informational [Page 8] + +RFC 1952 GZIP File Format Specification May 1996 + + + SI1 SI2 Data + ---------- ---------- ---- + 0x41 ('A') 0x70 ('P') Apollo file type information + + LEN gives the length of the subfield data, excluding the 4 + initial bytes. + + 2.3.1.2. Compliance + + A compliant compressor must produce files with correct ID1, + ID2, CM, CRC32, and ISIZE, but may set all the other fields in + the fixed-length part of the header to default values (255 for + OS, 0 for all others). The compressor must set all reserved + bits to zero. + + A compliant decompressor must check ID1, ID2, and CM, and + provide an error indication if any of these have incorrect + values. It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC + at least so it can skip over the optional fields if they are + present. It need not examine any other part of the header or + trailer; in particular, a decompressor may ignore FTEXT and OS + and always produce binary output, and still be compliant. A + compliant decompressor must give an error indication if any + reserved bit is non-zero, since such a bit could indicate the + presence of a new field that would cause subsequent data to be + interpreted incorrectly. + +3. References + + [1] "Information Processing - 8-bit single-byte coded graphic + character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987). + The ISO 8859-1 (Latin-1) character set is a superset of 7-bit + ASCII. Files defining this character set are available as + iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/ + + [2] ISO 3309 + + [3] ITU-T recommendation V.42 + + [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", + available in ftp://ftp.uu.net/pub/archiving/zip/doc/ + + [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in + ftp://prep.ai.mit.edu/pub/gnu/ + + [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table + Look-Up", Communications of the ACM, 31(8), pp.1008-1013. + + + + +Deutsch Informational [Page 9] + +RFC 1952 GZIP File Format Specification May 1996 + + + [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal, + pp.118-133. + + [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt, + describing the CRC concept. + +4. Security Considerations + + Any data compression method involves the reduction of redundancy in + the data. Consequently, any corruption of the data is likely to have + severe effects and be difficult to correct. Uncompressed text, on + the other hand, will probably still be readable despite the presence + of some corrupted bytes. + + It is recommended that systems using this data format provide some + means of validating the integrity of the compressed data, such as by + setting and checking the CRC-32 check value. + +5. Acknowledgements + + Trademarks cited in this document are the property of their + respective owners. + + Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler, + the related software described in this specification. Glenn + Randers-Pehrson converted this document to RFC and HTML format. + +6. Author's Address + + L. Peter Deutsch + Aladdin Enterprises + 203 Santa Margarita Ave. + Menlo Park, CA 94025 + + Phone: (415) 322-0103 (AM only) + FAX: (415) 322-1734 + EMail: + + Questions about the technical content of this specification can be + sent by email to: + + Jean-Loup Gailly and + Mark Adler + + Editorial comments on this specification can be sent by email to: + + L. Peter Deutsch and + Glenn Randers-Pehrson + + + +Deutsch Informational [Page 10] + +RFC 1952 GZIP File Format Specification May 1996 + + +7. Appendix: Jean-Loup Gailly's gzip utility + + The most widely used implementation of gzip compression, and the + original documentation on which this specification is based, were + created by Jean-Loup Gailly . Since this + implementation is a de facto standard, we mention some more of its + features here. Again, the material in this section is not part of + the specification per se, and implementations need not follow it to + be compliant. + + When compressing or decompressing a file, gzip preserves the + protection, ownership, and modification time attributes on the local + file system, since there is no provision for representing protection + attributes in the gzip file format itself. Since the file format + includes a modification time, the gzip decompressor provides a + command line switch that assigns the modification time from the file, + rather than the local modification time of the compressed input, to + the decompressed output. + +8. Appendix: Sample CRC Code + + The following sample code represents a practical implementation of + the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42 + for a formal specification.) + + The sample code is in the ANSI C programming language. Non C users + may find it easier to read with these hints: + + & Bitwise AND operator. + ^ Bitwise exclusive-OR operator. + >> Bitwise right shift operator. When applied to an + unsigned quantity, as here, right shift inserts zero + bit(s) at the left. + ! Logical NOT operator. + ++ "n++" increments the variable n. + 0xNNN 0x introduces a hexadecimal (base 16) constant. + Suffix L indicates a long value (at least 32 bits). + + /* Table of CRCs of all 8-bit messages. */ + unsigned long crc_table[256]; + + /* Flag: has the table been computed? Initially false. */ + int crc_table_computed = 0; + + /* Make the table for a fast CRC. */ + void make_crc_table(void) + { + unsigned long c; + + + +Deutsch Informational [Page 11] + +RFC 1952 GZIP File Format Specification May 1996 + + + int n, k; + for (n = 0; n < 256; n++) { + c = (unsigned long) n; + for (k = 0; k < 8; k++) { + if (c & 1) { + c = 0xedb88320L ^ (c >> 1); + } else { + c = c >> 1; + } + } + crc_table[n] = c; + } + crc_table_computed = 1; + } + + /* + Update a running crc with the bytes buf[0..len-1] and return + the updated crc. The crc should be initialized to zero. Pre- and + post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the caller. Usage example: + + unsigned long crc = 0L; + + while (read_buffer(buffer, length) != EOF) { + crc = update_crc(crc, buffer, length); + } + if (crc != original_crc) error(); + */ + unsigned long update_crc(unsigned long crc, + unsigned char *buf, int len) + { + unsigned long c = crc ^ 0xffffffffL; + int n; + + if (!crc_table_computed) + make_crc_table(); + for (n = 0; n < len; n++) { + c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); + } + return c ^ 0xffffffffL; + } + + /* Return the CRC of the bytes buf[0..len-1]. */ + unsigned long crc(unsigned char *buf, int len) + { + return update_crc(0L, buf, len); + } + + + + +Deutsch Informational [Page 12] + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/txtvsbin.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/txtvsbin.txt new file mode 100644 index 0000000000..3d0f0634f7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/doc/txtvsbin.txt @@ -0,0 +1,107 @@ +A Fast Method for Identifying Plain Text Files +============================================== + + +Introduction +------------ + +Given a file coming from an unknown source, it is sometimes desirable +to find out whether the format of that file is plain text. Although +this may appear like a simple task, a fully accurate detection of the +file type requires heavy-duty semantic analysis on the file contents. +It is, however, possible to obtain satisfactory results by employing +various heuristics. + +Previous versions of PKZip and other zip-compatible compression tools +were using a crude detection scheme: if more than 80% (4/5) of the bytes +found in a certain buffer are within the range [7..127], the file is +labeled as plain text, otherwise it is labeled as binary. A prominent +limitation of this scheme is the restriction to Latin-based alphabets. +Other alphabets, like Greek, Cyrillic or Asian, make extensive use of +the bytes within the range [128..255], and texts using these alphabets +are most often misidentified by this scheme; in other words, the rate +of false negatives is sometimes too high, which means that the recall +is low. Another weakness of this scheme is a reduced precision, due to +the false positives that may occur when binary files containing large +amounts of textual characters are misidentified as plain text. + +In this article we propose a new, simple detection scheme that features +a much increased precision and a near-100% recall. This scheme is +designed to work on ASCII, Unicode and other ASCII-derived alphabets, +and it handles single-byte encodings (ISO-8859, MacRoman, KOI8, etc.) +and variable-sized encodings (ISO-2022, UTF-8, etc.). Wider encodings +(UCS-2/UTF-16 and UCS-4/UTF-32) are not handled, however. + + +The Algorithm +------------- + +The algorithm works by dividing the set of bytecodes [0..255] into three +categories: +- The white list of textual bytecodes: + 9 (TAB), 10 (LF), 13 (CR), 32 (SPACE) to 255. +- The gray list of tolerated bytecodes: + 7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB), 27 (ESC). +- The black list of undesired, non-textual bytecodes: + 0 (NUL) to 6, 14 to 31. + +If a file contains at least one byte that belongs to the white list and +no byte that belongs to the black list, then the file is categorized as +plain text; otherwise, it is categorized as binary. (The boundary case, +when the file is empty, automatically falls into the latter category.) + + +Rationale +--------- + +The idea behind this algorithm relies on two observations. + +The first observation is that, although the full range of 7-bit codes +[0..127] is properly specified by the ASCII standard, most control +characters in the range [0..31] are not used in practice. The only +widely-used, almost universally-portable control codes are 9 (TAB), +10 (LF) and 13 (CR). There are a few more control codes that are +recognized on a reduced range of platforms and text viewers/editors: +7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB) and 27 (ESC); but these +codes are rarely (if ever) used alone, without being accompanied by +some printable text. Even the newer, portable text formats such as +XML avoid using control characters outside the list mentioned here. + +The second observation is that most of the binary files tend to contain +control characters, especially 0 (NUL). Even though the older text +detection schemes observe the presence of non-ASCII codes from the range +[128..255], the precision rarely has to suffer if this upper range is +labeled as textual, because the files that are genuinely binary tend to +contain both control characters and codes from the upper range. On the +other hand, the upper range needs to be labeled as textual, because it +is used by virtually all ASCII extensions. In particular, this range is +used for encoding non-Latin scripts. + +Since there is no counting involved, other than simply observing the +presence or the absence of some byte values, the algorithm produces +consistent results, regardless what alphabet encoding is being used. +(If counting were involved, it could be possible to obtain different +results on a text encoded, say, using ISO-8859-16 versus UTF-8.) + +There is an extra category of plain text files that are "polluted" with +one or more black-listed codes, either by mistake or by peculiar design +considerations. In such cases, a scheme that tolerates a small fraction +of black-listed codes would provide an increased recall (i.e. more true +positives). This, however, incurs a reduced precision overall, since +false positives are more likely to appear in binary files that contain +large chunks of textual data. Furthermore, "polluted" plain text should +be regarded as binary by general-purpose text detection schemes, because +general-purpose text processing algorithms might not be applicable. +Under this premise, it is safe to say that our detection method provides +a near-100% recall. + +Experiments have been run on many files coming from various platforms +and applications. We tried plain text files, system logs, source code, +formatted office documents, compiled object code, etc. The results +confirm the optimistic assumptions about the capabilities of this +algorithm. + + +-- +Cosmin Truta +Last updated: 2006-May-28 diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/example.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/example.c new file mode 100644 index 0000000000..604736f15f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/example.c @@ -0,0 +1,565 @@ +/* example.c -- usage example of the zlib compression library + * Copyright (C) 1995-2006 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#if defined(VMS) || defined(RISCOS) +# define TESTFILE "foo-gz" +#else +# define TESTFILE "foo.gz" +#endif + +#define CHECK_ERR(err, msg) { \ + if (err != Z_OK) { \ + fprintf(stderr, "%s error: %d\n", msg, err); \ + exit(1); \ + } \ +} + +const char hello[] = "hello, hello!"; +/* "hello world" would be more standard, but the repeated "hello" + * stresses the compression code better, sorry... + */ + +const char dictionary[] = "hello"; +uLong dictId; /* Adler32 value of the dictionary */ + +void test_compress OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_gzio OF((const char *fname, + Byte *uncompr, uLong uncomprLen)); +void test_deflate OF((Byte *compr, uLong comprLen)); +void test_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_deflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_large_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_flush OF((Byte *compr, uLong *comprLen)); +void test_sync OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +void test_dict_deflate OF((Byte *compr, uLong comprLen)); +void test_dict_inflate OF((Byte *compr, uLong comprLen, + Byte *uncompr, uLong uncomprLen)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Test compress() and uncompress() + */ +void test_compress(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + uLong len = (uLong)strlen(hello)+1; + + err = compress(compr, &comprLen, (const Bytef*)hello, len); + CHECK_ERR(err, "compress"); + + strcpy((char*)uncompr, "garbage"); + + err = uncompress(uncompr, &uncomprLen, compr, comprLen); + CHECK_ERR(err, "uncompress"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad uncompress\n"); + exit(1); + } else { + printf("uncompress(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test read/write of .gz files + */ +void test_gzio(fname, uncompr, uncomprLen) + const char *fname; /* compressed file name */ + Byte *uncompr; + uLong uncomprLen; +{ +#ifdef NO_GZCOMPRESS + fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); +#else + int err; + int len = (int)strlen(hello)+1; + gzFile file; + z_off_t pos; + + file = gzopen(fname, "wb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + gzputc(file, 'h'); + if (gzputs(file, "ello") != 4) { + fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); + exit(1); + } + if (gzprintf(file, ", %s!", "hello") != 8) { + fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); + exit(1); + } + gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ + gzclose(file); + + file = gzopen(fname, "rb"); + if (file == NULL) { + fprintf(stderr, "gzopen error\n"); + exit(1); + } + strcpy((char*)uncompr, "garbage"); + + if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { + fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); + exit(1); + } else { + printf("gzread(): %s\n", (char*)uncompr); + } + + pos = gzseek(file, -8L, SEEK_CUR); + if (pos != 6 || gztell(file) != pos) { + fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", + (long)pos, (long)gztell(file)); + exit(1); + } + + if (gzgetc(file) != ' ') { + fprintf(stderr, "gzgetc error\n"); + exit(1); + } + + if (gzungetc(' ', file) != ' ') { + fprintf(stderr, "gzungetc error\n"); + exit(1); + } + + gzgets(file, (char*)uncompr, (int)uncomprLen); + if (strlen((char*)uncompr) != 7) { /* " hello!" */ + fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); + exit(1); + } + if (strcmp((char*)uncompr, hello + 6)) { + fprintf(stderr, "bad gzgets after gzseek\n"); + exit(1); + } else { + printf("gzgets() after gzseek: %s\n", (char*)uncompr); + } + + gzclose(file); +#endif +} + +/* =========================================================================== + * Test deflate() with small buffers + */ +void test_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uLong len = (uLong)strlen(hello)+1; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (Bytef*)hello; + c_stream.next_out = compr; + + while (c_stream.total_in != len && c_stream.total_out < comprLen) { + c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + } + /* Finish the stream, still forcing small buffers: */ + for (;;) { + c_stream.avail_out = 1; + err = deflate(&c_stream, Z_FINISH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "deflate"); + } + + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with small buffers + */ +void test_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 0; + d_stream.next_out = uncompr; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { + d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate\n"); + exit(1); + } else { + printf("inflate(): %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Test deflate() with large buffers and dynamic change of compression level + */ +void test_large_deflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_SPEED); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + /* At this point, uncompr is still mostly zeroes, so it should compress + * very well: + */ + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + if (c_stream.avail_in != 0) { + fprintf(stderr, "deflate not greedy\n"); + exit(1); + } + + /* Feed in already compressed data and switch to no compression: */ + deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); + c_stream.next_in = compr; + c_stream.avail_in = (uInt)comprLen/2; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + /* Switch back to compressing mode: */ + deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); + c_stream.next_in = uncompr; + c_stream.avail_in = (uInt)uncomprLen; + err = deflate(&c_stream, Z_NO_FLUSH); + CHECK_ERR(err, "deflate"); + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with large buffers + */ +void test_large_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + for (;;) { + d_stream.next_out = uncompr; /* discard the output */ + d_stream.avail_out = (uInt)uncomprLen; + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + CHECK_ERR(err, "large inflate"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (d_stream.total_out != 2*uncomprLen + comprLen/2) { + fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); + exit(1); + } else { + printf("large_inflate(): OK\n"); + } +} + +/* =========================================================================== + * Test deflate() with full flush + */ +void test_flush(compr, comprLen) + Byte *compr; + uLong *comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + uInt len = (uInt)strlen(hello)+1; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + c_stream.next_in = (Bytef*)hello; + c_stream.next_out = compr; + c_stream.avail_in = 3; + c_stream.avail_out = (uInt)*comprLen; + err = deflate(&c_stream, Z_FULL_FLUSH); + CHECK_ERR(err, "deflate"); + + compr[3]++; /* force an error in first compressed block */ + c_stream.avail_in = len - 3; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + CHECK_ERR(err, "deflate"); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); + + *comprLen = c_stream.total_out; +} + +/* =========================================================================== + * Test inflateSync() + */ +void test_sync(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = 2; /* just read the zlib header */ + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + inflate(&d_stream, Z_NO_FLUSH); + CHECK_ERR(err, "inflate"); + + d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ + err = inflateSync(&d_stream); /* but skip the damaged part */ + CHECK_ERR(err, "inflateSync"); + + err = inflate(&d_stream, Z_FINISH); + if (err != Z_DATA_ERROR) { + fprintf(stderr, "inflate should report DATA_ERROR\n"); + /* Because of incorrect adler32 */ + exit(1); + } + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + printf("after inflateSync(): hel%s\n", (char *)uncompr); +} + +/* =========================================================================== + * Test deflate() with preset dictionary + */ +void test_dict_deflate(compr, comprLen) + Byte *compr; + uLong comprLen; +{ + z_stream c_stream; /* compression stream */ + int err; + + c_stream.zalloc = (alloc_func)0; + c_stream.zfree = (free_func)0; + c_stream.opaque = (voidpf)0; + + err = deflateInit(&c_stream, Z_BEST_COMPRESSION); + CHECK_ERR(err, "deflateInit"); + + err = deflateSetDictionary(&c_stream, + (const Bytef*)dictionary, sizeof(dictionary)); + CHECK_ERR(err, "deflateSetDictionary"); + + dictId = c_stream.adler; + c_stream.next_out = compr; + c_stream.avail_out = (uInt)comprLen; + + c_stream.next_in = (Bytef*)hello; + c_stream.avail_in = (uInt)strlen(hello)+1; + + err = deflate(&c_stream, Z_FINISH); + if (err != Z_STREAM_END) { + fprintf(stderr, "deflate should report Z_STREAM_END\n"); + exit(1); + } + err = deflateEnd(&c_stream); + CHECK_ERR(err, "deflateEnd"); +} + +/* =========================================================================== + * Test inflate() with a preset dictionary + */ +void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) + Byte *compr, *uncompr; + uLong comprLen, uncomprLen; +{ + int err; + z_stream d_stream; /* decompression stream */ + + strcpy((char*)uncompr, "garbage"); + + d_stream.zalloc = (alloc_func)0; + d_stream.zfree = (free_func)0; + d_stream.opaque = (voidpf)0; + + d_stream.next_in = compr; + d_stream.avail_in = (uInt)comprLen; + + err = inflateInit(&d_stream); + CHECK_ERR(err, "inflateInit"); + + d_stream.next_out = uncompr; + d_stream.avail_out = (uInt)uncomprLen; + + for (;;) { + err = inflate(&d_stream, Z_NO_FLUSH); + if (err == Z_STREAM_END) break; + if (err == Z_NEED_DICT) { + if (d_stream.adler != dictId) { + fprintf(stderr, "unexpected dictionary"); + exit(1); + } + err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, + sizeof(dictionary)); + } + CHECK_ERR(err, "inflate with dict"); + } + + err = inflateEnd(&d_stream); + CHECK_ERR(err, "inflateEnd"); + + if (strcmp((char*)uncompr, hello)) { + fprintf(stderr, "bad inflate with dict\n"); + exit(1); + } else { + printf("inflate with dictionary: %s\n", (char *)uncompr); + } +} + +/* =========================================================================== + * Usage: example [output.gz [input.gz]] + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + Byte *compr, *uncompr; + uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ + uLong uncomprLen = comprLen; + static const char* myVersion = ZLIB_VERSION; + + if (zlibVersion()[0] != myVersion[0]) { + fprintf(stderr, "incompatible zlib version\n"); + exit(1); + + } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { + fprintf(stderr, "warning: different zlib version\n"); + } + + printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", + ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); + + compr = (Byte*)calloc((uInt)comprLen, 1); + uncompr = (Byte*)calloc((uInt)uncomprLen, 1); + /* compr and uncompr are cleared to avoid reading uninitialized + * data and to ensure that uncompr compresses well. + */ + if (compr == Z_NULL || uncompr == Z_NULL) { + printf("out of memory\n"); + exit(1); + } + test_compress(compr, comprLen, uncompr, uncomprLen); + + test_gzio((argc > 1 ? argv[1] : TESTFILE), + uncompr, uncomprLen); + + test_deflate(compr, comprLen); + test_inflate(compr, comprLen, uncompr, uncomprLen); + + test_large_deflate(compr, comprLen, uncompr, uncomprLen); + test_large_inflate(compr, comprLen, uncompr, uncomprLen); + + test_flush(compr, &comprLen); + test_sync(compr, comprLen, uncompr, uncomprLen); + comprLen = uncomprLen; + + test_dict_deflate(compr, comprLen); + test_dict_inflate(compr, comprLen, uncompr, uncomprLen); + + free(compr); + free(uncompr); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/README.examples b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/README.examples new file mode 100644 index 0000000000..56a31714e5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/README.examples @@ -0,0 +1,49 @@ +This directory contains examples of the use of zlib and other relevant +programs and documentation. + +enough.c + calculation and justification of ENOUGH parameter in inftrees.h + - calculates the maximum table space used in inflate tree + construction over all possible Huffman codes + +fitblk.c + compress just enough input to nearly fill a requested output size + - zlib isn't designed to do this, but fitblk does it anyway + +gun.c + uncompress a gzip file + - illustrates the use of inflateBack() for high speed file-to-file + decompression using call-back functions + - is approximately twice as fast as gzip -d + - also provides Unix uncompress functionality, again twice as fast + +gzappend.c + append to a gzip file + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of deflatePrime() to start at any bit + +gzjoin.c + join gzip files without recalculating the crc or recompressing + - illustrates the use of the Z_BLOCK flush parameter for inflate() + - illustrates the use of crc32_combine() + +gzlog.c +gzlog.h + efficiently and robustly maintain a message log file in gzip format + - illustrates use of raw deflate, Z_PARTIAL_FLUSH, deflatePrime(), + and deflateSetDictionary() + - illustrates use of a gzip header extra field + +zlib_how.html + painfully comprehensive description of zpipe.c (see below) + - describes in excruciating detail the use of deflate() and inflate() + +zpipe.c + reads and writes zlib streams from stdin to stdout + - illustrates the proper use of deflate() and inflate() + - deeply commented in zlib_how.html (see above) + +zran.c + index a zlib or gzip stream and randomly access it + - illustrates the use of Z_BLOCK, inflatePrime(), and + inflateSetDictionary() to provide random access diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/enough.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/enough.c new file mode 100644 index 0000000000..c40410bade --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/enough.c @@ -0,0 +1,569 @@ +/* enough.c -- determine the maximum size of inflate's Huffman code tables over + * all possible valid and complete Huffman codes, subject to a length limit. + * Copyright (C) 2007, 2008 Mark Adler + * Version 1.3 17 February 2008 Mark Adler + */ + +/* Version history: + 1.0 3 Jan 2007 First version (derived from codecount.c version 1.4) + 1.1 4 Jan 2007 Use faster incremental table usage computation + Prune examine() search on previously visited states + 1.2 5 Jan 2007 Comments clean up + As inflate does, decrease root for short codes + Refuse cases where inflate would increase root + 1.3 17 Feb 2008 Add argument for initial root table size + Fix bug for initial root table size == max - 1 + Use a macro to compute the history index + */ + +/* + Examine all possible Huffman codes for a given number of symbols and a + maximum code length in bits to determine the maximum table size for zilb's + inflate. Only complete Huffman codes are counted. + + Two codes are considered distinct if the vectors of the number of codes per + length are not identical. So permutations of the symbol assignments result + in the same code for the counting, as do permutations of the assignments of + the bit values to the codes (i.e. only canonical codes are counted). + + We build a code from shorter to longer lengths, determining how many symbols + are coded at each length. At each step, we have how many symbols remain to + be coded, what the last code length used was, and how many bit patterns of + that length remain unused. Then we add one to the code length and double the + number of unused patterns to graduate to the next code length. We then + assign all portions of the remaining symbols to that code length that + preserve the properties of a correct and eventually complete code. Those + properties are: we cannot use more bit patterns than are available; and when + all the symbols are used, there are exactly zero possible bit patterns + remaining. + + The inflate Huffman decoding algorithm uses two-level lookup tables for + speed. There is a single first-level table to decode codes up to root bits + in length (root == 9 in the current inflate implementation). The table + has 1 << root entries and is indexed by the next root bits of input. Codes + shorter than root bits have replicated table entries, so that the correct + entry is pointed to regardless of the bits that follow the short code. If + the code is longer than root bits, then the table entry points to a second- + level table. The size of that table is determined by the longest code with + that root-bit prefix. If that longest code has length len, then the table + has size 1 << (len - root), to index the remaining bits in that set of + codes. Each subsequent root-bit prefix then has its own sub-table. The + total number of table entries required by the code is calculated + incrementally as the number of codes at each bit length is populated. When + all of the codes are shorter than root bits, then root is reduced to the + longest code length, resulting in a single, smaller, one-level table. + + The inflate algorithm also provides for small values of root (relative to + the log2 of the number of symbols), where the shortest code has more bits + than root. In that case, root is increased to the length of the shortest + code. This program, by design, does not handle that case, so it is verified + that the number of symbols is less than 2^(root + 1). + + In order to speed up the examination (by about ten orders of magnitude for + the default arguments), the intermediate states in the build-up of a code + are remembered and previously visited branches are pruned. The memory + required for this will increase rapidly with the total number of symbols and + the maximum code length in bits. However this is a very small price to pay + for the vast speedup. + + First, all of the possible Huffman codes are counted, and reachable + intermediate states are noted by a non-zero count in a saved-results array. + Second, the intermediate states that lead to (root + 1) bit or longer codes + are used to look at all sub-codes from those junctures for their inflate + memory usage. (The amount of memory used is not affected by the number of + codes of root bits or less in length.) Third, the visited states in the + construction of those sub-codes and the associated calculation of the table + size is recalled in order to avoid recalculating from the same juncture. + Beginning the code examination at (root + 1) bit codes, which is enabled by + identifying the reachable nodes, accounts for about six of the orders of + magnitude of improvement for the default arguments. About another four + orders of magnitude come from not revisiting previous states. Out of + approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes + need to be examined to cover all of the possible table memory usage cases + for the default arguments of 286 symbols limited to 15-bit codes. + + Note that an unsigned long long type is used for counting. It is quite easy + to exceed the capacity of an eight-byte integer with a large number of + symbols and a large maximum code length, so multiple-precision arithmetic + would need to replace the unsigned long long arithmetic in that case. This + program will abort if an overflow occurs. The big_t type identifies where + the counting takes place. + + An unsigned long long type is also used for calculating the number of + possible codes remaining at the maximum length. This limits the maximum + code length to the number of bits in a long long minus the number of bits + needed to represent the symbols in a flat code. The code_t type identifies + where the bit pattern counting takes place. + */ + +#include +#include +#include +#include + +#define local static + +/* special data types */ +typedef unsigned long long big_t; /* type for code counting */ +typedef unsigned long long code_t; /* type for bit pattern counting */ +struct tab { /* type for been here check */ + size_t len; /* length of bit vector in char's */ + char *vec; /* allocated bit vector */ +}; + +/* The array for saving results, num[], is indexed with this triplet: + + syms: number of symbols remaining to code + left: number of available bit patterns at length len + len: number of bits in the codes currently being assigned + + Those indices are constrained thusly when saving results: + + syms: 3..totsym (totsym == total symbols to code) + left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) + len: 1..max - 1 (max == maximum code length in bits) + + syms == 2 is not saved since that immediately leads to a single code. left + must be even, since it represents the number of available bit patterns at + the current length, which is double the number at the previous length. + left ends at syms-1 since left == syms immediately results in a single code. + (left > sym is not allowed since that would result in an incomplete code.) + len is less than max, since the code completes immediately when len == max. + + The offset into the array is calculated for the three indices with the + first one (syms) being outermost, and the last one (len) being innermost. + We build the array with length max-1 lists for the len index, with syms-3 + of those for each symbol. There are totsym-2 of those, with each one + varying in length as a function of sym. See the calculation of index in + count() for the index, and the calculation of size in main() for the size + of the array. + + For the deflate example of 286 symbols limited to 15-bit codes, the array + has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than + half of the space allocated for saved results is actually used -- not all + possible triplets are reached in the generation of valid Huffman codes. + */ + +/* The array for tracking visited states, done[], is itself indexed identically + to the num[] array as described above for the (syms, left, len) triplet. + Each element in the array is further indexed by the (mem, rem) doublet, + where mem is the amount of inflate table space used so far, and rem is the + remaining unused entries in the current inflate sub-table. Each indexed + element is simply one bit indicating whether the state has been visited or + not. Since the ranges for mem and rem are not known a priori, each bit + vector is of a variable size, and grows as needed to accommodate the visited + states. mem and rem are used to calculate a single index in a triangular + array. Since the range of mem is expected in the default case to be about + ten times larger than the range of rem, the array is skewed to reduce the + memory usage, with eight times the range for mem than for rem. See the + calculations for offset and bit in beenhere() for the details. + + For the deflate example of 286 symbols limited to 15-bit codes, the bit + vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[] + array itself. + */ + +/* Globals to avoid propagating constants or constant pointers recursively */ +local int max; /* maximum allowed bit length for the codes */ +local int root; /* size of base code table in bits */ +local int large; /* largest code table so far */ +local size_t size; /* number of elements in num and done */ +local int *code; /* number of symbols assigned to each bit length */ +local big_t *num; /* saved results array for code counting */ +local struct tab *done; /* states already evaluated array */ + +/* Index function for num[] and done[] */ +#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1) + +/* Free allocated space. Uses globals code, num, and done. */ +local void cleanup(void) +{ + size_t n; + + if (done != NULL) { + for (n = 0; n < size; n++) + if (done[n].len) + free(done[n].vec); + free(done); + } + if (num != NULL) + free(num); + if (code != NULL) + free(code); +} + +/* Return the number of possible Huffman codes using bit patterns of lengths + len through max inclusive, coding syms symbols, with left bit patterns of + length len unused -- return -1 if there is an overflow in the counting. + Keep a record of previous results in num to prevent repeating the same + calculation. Uses the globals max and num. */ +local big_t count(int syms, int len, int left) +{ + big_t sum; /* number of possible codes from this juncture */ + big_t got; /* value returned from count() */ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + size_t index; /* index of this case in *num */ + + /* see if only one possible code */ + if (syms == left) + return 1; + + /* note and verify the expected state */ + assert(syms > left && left > 0 && len < max); + + /* see if we've done this one already */ + index = INDEX(syms, left, len); + got = num[index]; + if (got) + return got; /* we have -- return the saved result */ + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* count all possible codes from this juncture and add them up */ + sum = 0; + for (use = least; use <= most; use++) { + got = count(syms - use, len + 1, (left - use) << 1); + sum += got; + if (got == -1 || sum < got) /* overflow */ + return -1; + } + + /* verify that all recursive calls are productive */ + assert(sum != 0); + + /* save the result and return it */ + num[index] = sum; + return sum; +} + +/* Return true if we've been here before, set to true if not. Set a bit in a + bit vector to indicate visiting this state. Each (syms,len,left) state + has a variable size bit vector indexed by (mem,rem). The bit vector is + lengthened if needed to allow setting the (mem,rem) bit. */ +local int beenhere(int syms, int len, int left, int mem, int rem) +{ + size_t index; /* index for this state's bit vector */ + size_t offset; /* offset in this state's bit vector */ + int bit; /* mask for this state's bit */ + size_t length; /* length of the bit vector in bytes */ + char *vector; /* new or enlarged bit vector */ + + /* point to vector for (syms,left,len), bit in vector for (mem,rem) */ + index = INDEX(syms, left, len); + mem -= 1 << root; + offset = (mem >> 3) + rem; + offset = ((offset * (offset + 1)) >> 1) + rem; + bit = 1 << (mem & 7); + + /* see if we've been here */ + length = done[index].len; + if (offset < length && (done[index].vec[offset] & bit) != 0) + return 1; /* done this! */ + + /* we haven't been here before -- set the bit to show we have now */ + + /* see if we need to lengthen the vector in order to set the bit */ + if (length <= offset) { + /* if we have one already, enlarge it, zero out the appended space */ + if (length) { + do { + length <<= 1; + } while (length <= offset); + vector = realloc(done[index].vec, length); + if (vector != NULL) + memset(vector + done[index].len, 0, length - done[index].len); + } + + /* otherwise we need to make a new vector and zero it out */ + else { + length = 1 << (len - root); + while (length <= offset) + length <<= 1; + vector = calloc(length, sizeof(char)); + } + + /* in either case, bail if we can't get the memory */ + if (vector == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + exit(1); + } + + /* install the new vector */ + done[index].len = length; + done[index].vec = vector; + } + + /* set the bit */ + done[index].vec[offset] |= bit; + return 0; +} + +/* Examine all possible codes from the given node (syms, len, left). Compute + the amount of memory required to build inflate's decoding tables, where the + number of code structures used so far is mem, and the number remaining in + the current sub-table is rem. Uses the globals max, code, root, large, and + done. */ +local void examine(int syms, int len, int left, int mem, int rem) +{ + int least; /* least number of syms to use at this juncture */ + int most; /* most number of syms to use at this juncture */ + int use; /* number of bit patterns to use in next call */ + + /* see if we have a complete code */ + if (syms == left) { + /* set the last code entry */ + code[len] = left; + + /* complete computation of memory used by this code */ + while (rem < left) { + left -= rem; + rem = 1 << (len - root); + mem += rem; + } + assert(rem == left); + + /* if this is a new maximum, show the entries used and the sub-code */ + if (mem > large) { + large = mem; + printf("max %d: ", mem); + for (use = root + 1; use <= max; use++) + if (code[use]) + printf("%d[%d] ", code[use], use); + putchar('\n'); + fflush(stdout); + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; + return; + } + + /* prune the tree if we can */ + if (beenhere(syms, len, left, mem, rem)) + return; + + /* we need to use at least this many bit patterns so that the code won't be + incomplete at the next length (more bit patterns than symbols) */ + least = (left << 1) - syms; + if (least < 0) + least = 0; + + /* we can use at most this many bit patterns, lest there not be enough + available for the remaining symbols at the maximum length (if there were + no limit to the code length, this would become: most = left - 1) */ + most = (((code_t)left << (max - len)) - syms) / + (((code_t)1 << (max - len)) - 1); + + /* occupy least table spaces, creating new sub-tables as needed */ + use = least; + while (rem < use) { + use -= rem; + rem = 1 << (len - root); + mem += rem; + } + rem -= use; + + /* examine codes from here, updating table space as we go */ + for (use = least; use <= most; use++) { + code[len] = use; + examine(syms - use, len + 1, (left - use) << 1, + mem + (rem ? 1 << (len - root) : 0), rem << 1); + if (rem == 0) { + rem = 1 << (len - root); + mem += rem; + } + rem--; + } + + /* remove entries as we drop back down in the recursion */ + code[len] = 0; +} + +/* Look at all sub-codes starting with root + 1 bits. Look at only the valid + intermediate code states (syms, left, len). For each completed code, + calculate the amount of memory required by inflate to build the decoding + tables. Find the maximum amount of memory required and show the code that + requires that maximum. Uses the globals max, root, and num. */ +local void enough(int syms) +{ + int n; /* number of remaing symbols for this node */ + int left; /* number of unused bit patterns at this length */ + size_t index; /* index of this case in *num */ + + /* clear code */ + for (n = 0; n <= max; n++) + code[n] = 0; + + /* look at all (root + 1) bit and longer codes */ + large = 1 << root; /* base table */ + if (root < max) /* otherwise, there's only a base table */ + for (n = 3; n <= syms; n++) + for (left = 2; left < n; left += 2) + { + /* look at all reachable (root + 1) bit nodes, and the + resulting codes (complete at root + 2 or more) */ + index = INDEX(n, left, root + 1); + if (root + 1 < max && num[index]) /* reachable node */ + examine(n, root + 1, left, 1 << root, 0); + + /* also look at root bit codes with completions at root + 1 + bits (not saved in num, since complete), just in case */ + if (num[index - 1] && n <= left << 1) + examine((n - left) << 1, root + 1, (n - left) << 1, + 1 << root, 0); + } + + /* done */ + printf("done: maximum of %d table entries\n", large); +} + +/* + Examine and show the total number of possible Huffman codes for a given + maximum number of symbols, initial root table size, and maximum code length + in bits -- those are the command arguments in that order. The default + values are 286, 9, and 15 respectively, for the deflate literal/length code. + The possible codes are counted for each number of coded symbols from two to + the maximum. The counts for each of those and the total number of codes are + shown. The maximum number of inflate table entires is then calculated + across all possible codes. Each new maximum number of table entries and the + associated sub-code (starting at root + 1 == 10 bits) is shown. + + To count and examine Huffman codes that are not length-limited, provide a + maximum length equal to the number of symbols minus one. + + For the deflate literal/length code, use "enough". For the deflate distance + code, use "enough 30 6". + + This uses the %llu printf format to print big_t numbers, which assumes that + big_t is an unsigned long long. If the big_t type is changed (for example + to a multiple precision type), the method of printing will also need to be + updated. + */ +int main(int argc, char **argv) +{ + int syms; /* total number of symbols to code */ + int n; /* number of symbols to code for this run */ + big_t got; /* return value of count() */ + big_t sum; /* accumulated number of codes over n */ + + /* set up globals for cleanup() */ + code = NULL; + num = NULL; + done = NULL; + + /* get arguments -- default to the deflate literal/length code */ + syms = 286; + root = 9; + max = 15; + if (argc > 1) { + syms = atoi(argv[1]); + if (argc > 2) { + root = atoi(argv[2]); + if (argc > 3) + max = atoi(argv[3]); + } + } + if (argc > 4 || syms < 2 || root < 1 || max < 1) { + fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", + stderr); + return 1; + } + + /* if not restricting the code length, the longest is syms - 1 */ + if (max > syms - 1) + max = syms - 1; + + /* determine the number of bits in a code_t */ + n = 0; + while (((code_t)1 << n) != 0) + n++; + + /* make sure that the calculation of most will not overflow */ + if (max > n || syms - 2 >= (((code_t)0 - 1) >> (max - 1))) { + fputs("abort: code length too long for internal types\n", stderr); + return 1; + } + + /* reject impossible code requests */ + if (syms - 1 > ((code_t)1 << max) - 1) { + fprintf(stderr, "%d symbols cannot be coded in %d bits\n", + syms, max); + return 1; + } + + /* allocate code vector */ + code = calloc(max + 1, sizeof(int)); + if (code == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + return 1; + } + + /* determine size of saved results array, checking for overflows, + allocate and clear the array (set all to zero with calloc()) */ + if (syms == 2) /* iff max == 1 */ + num = NULL; /* won't be saving any results */ + else { + size = syms >> 1; + if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) || + (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) || + (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) || + (num = calloc(size, sizeof(big_t))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + } + + /* count possible codes for all numbers of symbols, add up counts */ + sum = 0; + for (n = 2; n <= syms; n++) { + got = count(n, 1, 2); + sum += got; + if (got == -1 || sum < got) { /* overflow */ + fputs("abort: can't count that high!\n", stderr); + cleanup(); + return 1; + } + printf("%llu %d-codes\n", got, n); + } + printf("%llu total codes for 2 to %d symbols", sum, syms); + if (max < syms - 1) + printf(" (%d-bit length limit)\n", max); + else + puts(" (no length limit)"); + + /* allocate and clear done array for beenhere() */ + if (syms == 2) + done = NULL; + else if (size > ((size_t)0 - 1) / sizeof(struct tab) || + (done = calloc(size, sizeof(struct tab))) == NULL) { + fputs("abort: unable to allocate enough memory\n", stderr); + cleanup(); + return 1; + } + + /* find and show maximum inflate table usage */ + if (root > max) /* reduce root to max length */ + root = max; + if (syms < ((code_t)1 << (root + 1))) + enough(syms); + else + puts("cannot handle minimum code lengths > root"); + + /* done */ + cleanup(); + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/fitblk.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/fitblk.c new file mode 100644 index 0000000000..c61de5c996 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/fitblk.c @@ -0,0 +1,233 @@ +/* fitblk.c: example of fitting compressed output to a specified size + Not copyrighted -- provided to the public domain + Version 1.1 25 November 2004 Mark Adler */ + +/* Version history: + 1.0 24 Nov 2004 First version + 1.1 25 Nov 2004 Change deflateInit2() to deflateInit() + Use fixed-size, stack-allocated raw buffers + Simplify code moving compression to subroutines + Use assert() for internal errors + Add detailed description of approach + */ + +/* Approach to just fitting a requested compressed size: + + fitblk performs three compression passes on a portion of the input + data in order to determine how much of that input will compress to + nearly the requested output block size. The first pass generates + enough deflate blocks to produce output to fill the requested + output size plus a specfied excess amount (see the EXCESS define + below). The last deflate block may go quite a bit past that, but + is discarded. The second pass decompresses and recompresses just + the compressed data that fit in the requested plus excess sized + buffer. The deflate process is terminated after that amount of + input, which is less than the amount consumed on the first pass. + The last deflate block of the result will be of a comparable size + to the final product, so that the header for that deflate block and + the compression ratio for that block will be about the same as in + the final product. The third compression pass decompresses the + result of the second step, but only the compressed data up to the + requested size minus an amount to allow the compressed stream to + complete (see the MARGIN define below). That will result in a + final compressed stream whose length is less than or equal to the + requested size. Assuming sufficient input and a requested size + greater than a few hundred bytes, the shortfall will typically be + less than ten bytes. + + If the input is short enough that the first compression completes + before filling the requested output size, then that compressed + stream is return with no recompression. + + EXCESS is chosen to be just greater than the shortfall seen in a + two pass approach similar to the above. That shortfall is due to + the last deflate block compressing more efficiently with a smaller + header on the second pass. EXCESS is set to be large enough so + that there is enough uncompressed data for the second pass to fill + out the requested size, and small enough so that the final deflate + block of the second pass will be close in size to the final deflate + block of the third and final pass. MARGIN is chosen to be just + large enough to assure that the final compression has enough room + to complete in all cases. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +/* print nastygram and leave */ +local void quit(char *why) +{ + fprintf(stderr, "fitblk abort: %s\n", why); + exit(1); +} + +#define RAWLEN 4096 /* intermediate uncompressed buffer size */ + +/* compress from file to def until provided buffer is full or end of + input reached; return last deflate() return value, or Z_ERRNO if + there was read error on the file */ +local int partcompress(FILE *in, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + def->avail_in = fread(raw, 1, RAWLEN, in); + if (ferror(in)) + return Z_ERRNO; + def->next_in = raw; + if (feof(in)) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (def->avail_out != 0 && flush == Z_NO_FLUSH); + return ret; +} + +/* recompress from inf's input to def's output; the input for inf and + the output for def are set in those structures before calling; + return last deflate() return value, or Z_MEM_ERROR if inflate() + was not able to allocate enough memory when it needed to */ +local int recompress(z_streamp inf, z_streamp def) +{ + int ret, flush; + unsigned char raw[RAWLEN]; + + flush = Z_NO_FLUSH; + do { + /* decompress */ + inf->avail_out = RAWLEN; + inf->next_out = raw; + ret = inflate(inf, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR && + ret != Z_NEED_DICT); + if (ret == Z_MEM_ERROR) + return ret; + + /* compress what was decompresed until done or no room */ + def->avail_in = RAWLEN - inf->avail_out; + def->next_in = raw; + if (inf->avail_out != 0) + flush = Z_FINISH; + ret = deflate(def, flush); + assert(ret != Z_STREAM_ERROR); + } while (ret != Z_STREAM_END && def->avail_out != 0); + return ret; +} + +#define EXCESS 256 /* empirically determined stream overage */ +#define MARGIN 8 /* amount to back off for completion */ + +/* compress from stdin to fixed-size block on stdout */ +int main(int argc, char **argv) +{ + int ret; /* return code */ + unsigned size; /* requested fixed output block size */ + unsigned have; /* bytes written by deflate() call */ + unsigned char *blk; /* intermediate and final stream */ + unsigned char *tmp; /* close to desired size stream */ + z_stream def, inf; /* zlib deflate and inflate states */ + + /* get requested output size */ + if (argc != 2) + quit("need one argument: size of output block"); + ret = strtol(argv[1], argv + 1, 10); + if (argv[1][0] != 0) + quit("argument must be a number"); + if (ret < 8) /* 8 is minimum zlib stream size */ + quit("need positive size of 8 or greater"); + size = (unsigned)ret; + + /* allocate memory for buffers and compression engine */ + blk = malloc(size + EXCESS); + def.zalloc = Z_NULL; + def.zfree = Z_NULL; + def.opaque = Z_NULL; + ret = deflateInit(&def, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK || blk == NULL) + quit("out of memory"); + + /* compress from stdin until output full, or no more input */ + def.avail_out = size + EXCESS; + def.next_out = blk; + ret = partcompress(stdin, &def); + if (ret == Z_ERRNO) + quit("error reading input"); + + /* if it all fit, then size was undersubscribed -- done! */ + if (ret == Z_STREAM_END && def.avail_out >= EXCESS) { + /* write block to stdout */ + have = size + EXCESS - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (all input)\n", + size - have, size); + return 0; + } + + /* it didn't all fit -- set up for recompression */ + inf.zalloc = Z_NULL; + inf.zfree = Z_NULL; + inf.opaque = Z_NULL; + inf.avail_in = 0; + inf.next_in = Z_NULL; + ret = inflateInit(&inf); + tmp = malloc(size + EXCESS); + if (ret != Z_OK || tmp == NULL) + quit("out of memory"); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do first recompression close to the right amount */ + inf.avail_in = size + EXCESS; + inf.next_in = blk; + def.avail_out = size + EXCESS; + def.next_out = tmp; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + + /* set up for next reocmpression */ + ret = inflateReset(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateReset(&def); + assert(ret != Z_STREAM_ERROR); + + /* do second and final recompression (third compression) */ + inf.avail_in = size - MARGIN; /* assure stream will complete */ + inf.next_in = tmp; + def.avail_out = size; + def.next_out = blk; + ret = recompress(&inf, &def); + if (ret == Z_MEM_ERROR) + quit("out of memory"); + assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */ + + /* done -- write block to stdout */ + have = size - def.avail_out; + if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) + quit("error writing output"); + + /* clean up and print results to stderr */ + free(tmp); + ret = inflateEnd(&inf); + assert(ret != Z_STREAM_ERROR); + ret = deflateEnd(&def); + assert(ret != Z_STREAM_ERROR); + free(blk); + fprintf(stderr, + "%u bytes unused out of %u requested (%lu input)\n", + size - have, size, def.total_in); + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gun.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gun.c new file mode 100644 index 0000000000..72b0882ab8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gun.c @@ -0,0 +1,701 @@ +/* gun.c -- simple gunzip to give an example of the use of inflateBack() + * Copyright (C) 2003, 2005, 2008, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.6 17 January 2010 Mark Adler */ + +/* Version history: + 1.0 16 Feb 2003 First version for testing of inflateBack() + 1.1 21 Feb 2005 Decompress concatenated gzip streams + Remove use of "this" variable (C++ keyword) + Fix return value for in() + Improve allocation failure checking + Add typecasting for void * structures + Add -h option for command version and usage + Add a bunch of comments + 1.2 20 Mar 2005 Add Unix compress (LZW) decompression + Copy file attributes from input file to output file + 1.3 12 Jun 2005 Add casts for error messages [Oberhumer] + 1.4 8 Dec 2006 LZW decompression speed improvements + 1.5 9 Feb 2008 Avoid warning in latest version of gcc + 1.6 17 Jan 2010 Avoid signed/unsigned comparison warnings + */ + +/* + gun [ -t ] [ name ... ] + + decompresses the data in the named gzip files. If no arguments are given, + gun will decompress from stdin to stdout. The names must end in .gz, -gz, + .z, -z, _z, or .Z. The uncompressed data will be written to a file name + with the suffix stripped. On success, the original file is deleted. On + failure, the output file is deleted. For most failures, the command will + continue to process the remaining names on the command line. A memory + allocation failure will abort the command. If -t is specified, then the + listed files or stdin will be tested as gzip files for integrity (without + checking for a proper suffix), no output will be written, and no files + will be deleted. + + Like gzip, gun allows concatenated gzip streams and will decompress them, + writing all of the uncompressed data to the output. Unlike gzip, gun allows + an empty file on input, and will produce no error writing an empty output + file. + + gun will also decompress files made by Unix compress, which uses LZW + compression. These files are automatically detected by virtue of their + magic header bytes. Since the end of Unix compress stream is marked by the + end-of-file, they cannot be concantenated. If a Unix compress stream is + encountered in an input file, it is the last stream in that file. + + Like gunzip and uncompress, the file attributes of the orignal compressed + file are maintained in the final uncompressed file, to the extent that the + user permissions allow it. + + On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version + 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the + LZW decompression provided by gun is about twice as fast as the standard + Unix uncompress command. + */ + +/* external functions and related types and constants */ +#include /* fprintf() */ +#include /* malloc(), free() */ +#include /* strerror(), strcmp(), strlen(), memcpy() */ +#include /* errno */ +#include /* open() */ +#include /* read(), write(), close(), chown(), unlink() */ +#include +#include /* stat(), chmod() */ +#include /* utime() */ +#include "zlib.h" /* inflateBackInit(), inflateBack(), */ + /* inflateBackEnd(), crc32() */ + +/* function declaration */ +#define local static + +/* buffer constants */ +#define SIZE 32768U /* input and output buffer sizes */ +#define PIECE 16384 /* limits i/o chunks for 16-bit int case */ + +/* structure for infback() to pass to input function in() -- it maintains the + input file and a buffer of size SIZE */ +struct ind { + int infile; + unsigned char *inbuf; +}; + +/* Load input buffer, assumed to be empty, and return bytes loaded and a + pointer to them. read() is called until the buffer is full, or until it + returns end-of-file or error. Return 0 on error. */ +local unsigned in(void *in_desc, unsigned char **buf) +{ + int ret; + unsigned len; + unsigned char *next; + struct ind *me = (struct ind *)in_desc; + + next = me->inbuf; + *buf = next; + len = 0; + do { + ret = PIECE; + if ((unsigned)ret > SIZE - len) + ret = (int)(SIZE - len); + ret = (int)read(me->infile, next, ret); + if (ret == -1) { + len = 0; + break; + } + next += ret; + len += ret; + } while (ret != 0 && len < SIZE); + return len; +} + +/* structure for infback() to pass to output function out() -- it maintains the + output file, a running CRC-32 check on the output and the total number of + bytes output, both for checking against the gzip trailer. (The length in + the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and + the output is greater than 4 GB.) */ +struct outd { + int outfile; + int check; /* true if checking crc and total */ + unsigned long crc; + unsigned long total; +}; + +/* Write output buffer and update the CRC-32 and total bytes written. write() + is called until all of the output is written or an error is encountered. + On success out() returns 0. For a write failure, out() returns 1. If the + output file descriptor is -1, then nothing is written. + */ +local int out(void *out_desc, unsigned char *buf, unsigned len) +{ + int ret; + struct outd *me = (struct outd *)out_desc; + + if (me->check) { + me->crc = crc32(me->crc, buf, len); + me->total += len; + } + if (me->outfile != -1) + do { + ret = PIECE; + if ((unsigned)ret > len) + ret = (int)len; + ret = (int)write(me->outfile, buf, ret); + if (ret == -1) + return 1; + buf += ret; + len -= ret; + } while (len != 0); + return 0; +} + +/* next input byte macro for use inside lunpipe() and gunpipe() */ +#define NEXT() (have ? 0 : (have = in(indp, &next)), \ + last = have ? (have--, (int)(*next++)) : -1) + +/* memory for gunpipe() and lunpipe() -- + the first 256 entries of prefix[] and suffix[] are never used, could + have offset the index, but it's faster to waste the memory */ +unsigned char inbuf[SIZE]; /* input buffer */ +unsigned char outbuf[SIZE]; /* output buffer */ +unsigned short prefix[65536]; /* index to LZW prefix string */ +unsigned char suffix[65536]; /* one-character LZW suffix */ +unsigned char match[65280 + 2]; /* buffer for reversed match or gzip + 32K sliding window */ + +/* throw out what's left in the current bits byte buffer (this is a vestigial + aspect of the compressed data format derived from an implementation that + made use of a special VAX machine instruction!) */ +#define FLUSHCODE() \ + do { \ + left = 0; \ + rem = 0; \ + if (chunk > have) { \ + chunk -= have; \ + have = 0; \ + if (NEXT() == -1) \ + break; \ + chunk--; \ + if (chunk > have) { \ + chunk = have = 0; \ + break; \ + } \ + } \ + have -= chunk; \ + next += chunk; \ + chunk = 0; \ + } while (0) + +/* Decompress a compress (LZW) file from indp to outfile. The compress magic + header (two bytes) has already been read and verified. There are have bytes + of buffered input at next. strm is used for passing error information back + to gunpipe(). + + lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of + file, read error, or write error (a write error indicated by strm->next_in + not equal to Z_NULL), or Z_DATA_ERROR for invalid input. + */ +local int lunpipe(unsigned have, unsigned char *next, struct ind *indp, + int outfile, z_stream *strm) +{ + int last; /* last byte read by NEXT(), or -1 if EOF */ + unsigned chunk; /* bytes left in current chunk */ + int left; /* bits left in rem */ + unsigned rem; /* unused bits from input */ + int bits; /* current bits per code */ + unsigned code; /* code, table traversal index */ + unsigned mask; /* mask for current bits codes */ + int max; /* maximum bits per code for this stream */ + unsigned flags; /* compress flags, then block compress flag */ + unsigned end; /* last valid entry in prefix/suffix tables */ + unsigned temp; /* current code */ + unsigned prev; /* previous code */ + unsigned final; /* last character written for previous code */ + unsigned stack; /* next position for reversed string */ + unsigned outcnt; /* bytes in output buffer */ + struct outd outd; /* output structure */ + unsigned char *p; + + /* set up output */ + outd.outfile = outfile; + outd.check = 0; + + /* process remainder of compress header -- a flags byte */ + flags = NEXT(); + if (last == -1) + return Z_BUF_ERROR; + if (flags & 0x60) { + strm->msg = (char *)"unknown lzw flags set"; + return Z_DATA_ERROR; + } + max = flags & 0x1f; + if (max < 9 || max > 16) { + strm->msg = (char *)"lzw bits out of range"; + return Z_DATA_ERROR; + } + if (max == 9) /* 9 doesn't really mean 9 */ + max = 10; + flags &= 0x80; /* true if block compress */ + + /* clear table */ + bits = 9; + mask = 0x1ff; + end = flags ? 256 : 255; + + /* set up: get first 9-bit code, which is the first decompressed byte, but + don't create a table entry until the next code */ + if (NEXT() == -1) /* no compressed data is ok */ + return Z_OK; + final = prev = (unsigned)last; /* low 8 bits of code */ + if (NEXT() == -1) /* missing a bit */ + return Z_BUF_ERROR; + if (last & 1) { /* code must be < 256 */ + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + rem = (unsigned)last >> 1; /* remaining 7 bits */ + left = 7; + chunk = bits - 2; /* 7 bytes left in this chunk */ + outbuf[0] = (unsigned char)final; /* write first decompressed byte */ + outcnt = 1; + + /* decode codes */ + stack = 0; + for (;;) { + /* if the table will be full after this, increment the code size */ + if (end >= mask && bits < max) { + FLUSHCODE(); + bits++; + mask <<= 1; + mask++; + } + + /* get a code of length bits */ + if (chunk == 0) /* decrement chunk modulo bits */ + chunk = bits; + code = rem; /* low bits of code */ + if (NEXT() == -1) { /* EOF is end of compressed data */ + /* write remaining buffered output */ + if (outcnt && out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + return Z_OK; + } + code += (unsigned)last << left; /* middle (or high) bits of code */ + left += 8; + chunk--; + if (bits > left) { /* need more bits */ + if (NEXT() == -1) /* can't end in middle of code */ + return Z_BUF_ERROR; + code += (unsigned)last << left; /* high bits of code */ + left += 8; + chunk--; + } + code &= mask; /* mask to current code length */ + left -= bits; /* number of unused bits */ + rem = (unsigned)last >> (8 - left); /* unused bits from last byte */ + + /* process clear code (256) */ + if (code == 256 && flags) { + FLUSHCODE(); + bits = 9; /* initialize bits and mask */ + mask = 0x1ff; + end = 255; /* empty table */ + continue; /* get next code */ + } + + /* special code to reuse last match */ + temp = code; /* save the current code */ + if (code > end) { + /* Be picky on the allowed code here, and make sure that the code + we drop through (prev) will be a valid index so that random + input does not cause an exception. The code != end + 1 check is + empirically derived, and not checked in the original uncompress + code. If this ever causes a problem, that check could be safely + removed. Leaving this check in greatly improves gun's ability + to detect random or corrupted input after a compress header. + In any case, the prev > end check must be retained. */ + if (code != end + 1 || prev > end) { + strm->msg = (char *)"invalid lzw code"; + return Z_DATA_ERROR; + } + match[stack++] = (unsigned char)final; + code = prev; + } + + /* walk through linked list to generate output in reverse order */ + p = match + stack; + while (code >= 256) { + *p++ = suffix[code]; + code = prefix[code]; + } + stack = p - match; + match[stack++] = (unsigned char)code; + final = code; + + /* link new table entry */ + if (end < mask) { + end++; + prefix[end] = (unsigned short)prev; + suffix[end] = (unsigned char)final; + } + + /* set previous code for next iteration */ + prev = temp; + + /* write output in forward order */ + while (stack > SIZE - outcnt) { + while (outcnt < SIZE) + outbuf[outcnt++] = match[--stack]; + if (out(&outd, outbuf, outcnt)) { + strm->next_in = outbuf; /* signal write error */ + return Z_BUF_ERROR; + } + outcnt = 0; + } + p = match + stack; + do { + outbuf[outcnt++] = *--p; + } while (p > match); + stack = 0; + + /* loop for next code with final and prev as the last match, rem and + left provide the first 0..7 bits of the next code, end is the last + valid table entry */ + } +} + +/* Decompress a gzip file from infile to outfile. strm is assumed to have been + successfully initialized with inflateBackInit(). The input file may consist + of a series of gzip streams, in which case all of them will be decompressed + to the output file. If outfile is -1, then the gzip stream(s) integrity is + checked and nothing is written. + + The return value is a zlib error code: Z_MEM_ERROR if out of memory, + Z_DATA_ERROR if the header or the compressed data is invalid, or if the + trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends + prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip + stream) follows a valid gzip stream. + */ +local int gunpipe(z_stream *strm, int infile, int outfile) +{ + int ret, first, last; + unsigned have, flags, len; + unsigned char *next = NULL; + struct ind ind, *indp; + struct outd outd; + + /* setup input buffer */ + ind.infile = infile; + ind.inbuf = inbuf; + indp = &ind; + + /* decompress concatenated gzip streams */ + have = 0; /* no input data read in yet */ + first = 1; /* looking for first gzip header */ + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + for (;;) { + /* look for the two magic header bytes for a gzip stream */ + if (NEXT() == -1) { + ret = Z_OK; + break; /* empty gzip stream is ok */ + } + if (last != 31 || (NEXT() != 139 && last != 157)) { + strm->msg = (char *)"incorrect header check"; + ret = first ? Z_DATA_ERROR : Z_ERRNO; + break; /* not a gzip or compress header */ + } + first = 0; /* next non-header is junk */ + + /* process a compress (LZW) file -- can't be concatenated after this */ + if (last == 157) { + ret = lunpipe(have, next, indp, outfile, strm); + break; + } + + /* process remainder of gzip header */ + ret = Z_BUF_ERROR; + if (NEXT() != 8) { /* only deflate method allowed */ + if (last == -1) break; + strm->msg = (char *)"unknown compression method"; + ret = Z_DATA_ERROR; + break; + } + flags = NEXT(); /* header flags */ + NEXT(); /* discard mod time, xflgs, os */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); + NEXT(); + if (last == -1) break; + if (flags & 0xe0) { + strm->msg = (char *)"unknown header flags set"; + ret = Z_DATA_ERROR; + break; + } + if (flags & 4) { /* extra field */ + len = NEXT(); + len += (unsigned)(NEXT()) << 8; + if (last == -1) break; + while (len > have) { + len -= have; + have = 0; + if (NEXT() == -1) break; + len--; + } + if (last == -1) break; + have -= len; + next += len; + } + if (flags & 8) /* file name */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 16) /* comment */ + while (NEXT() != 0 && last != -1) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + if (last == -1) break; + + /* set up output */ + outd.outfile = outfile; + outd.check = 1; + outd.crc = crc32(0L, Z_NULL, 0); + outd.total = 0; + + /* decompress data to output */ + strm->next_in = next; + strm->avail_in = have; + ret = inflateBack(strm, in, indp, out, &outd); + if (ret != Z_STREAM_END) break; + next = strm->next_in; + have = strm->avail_in; + strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */ + + /* check trailer */ + ret = Z_BUF_ERROR; + if (NEXT() != (int)(outd.crc & 0xff) || + NEXT() != (int)((outd.crc >> 8) & 0xff) || + NEXT() != (int)((outd.crc >> 16) & 0xff) || + NEXT() != (int)((outd.crc >> 24) & 0xff)) { + /* crc error */ + if (last != -1) { + strm->msg = (char *)"incorrect data check"; + ret = Z_DATA_ERROR; + } + break; + } + if (NEXT() != (int)(outd.total & 0xff) || + NEXT() != (int)((outd.total >> 8) & 0xff) || + NEXT() != (int)((outd.total >> 16) & 0xff) || + NEXT() != (int)((outd.total >> 24) & 0xff)) { + /* length error */ + if (last != -1) { + strm->msg = (char *)"incorrect length check"; + ret = Z_DATA_ERROR; + } + break; + } + + /* go back and look for another gzip stream */ + } + + /* clean up and return */ + return ret; +} + +/* Copy file attributes, from -> to, as best we can. This is best effort, so + no errors are reported. The mode bits, including suid, sgid, and the sticky + bit are copied (if allowed), the owner's user id and group id are copied + (again if allowed), and the access and modify times are copied. */ +local void copymeta(char *from, char *to) +{ + struct stat was; + struct utimbuf when; + + /* get all of from's Unix meta data, return if not a regular file */ + if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG) + return; + + /* set to's mode bits, ignore errors */ + (void)chmod(to, was.st_mode & 07777); + + /* copy owner's user and group, ignore errors */ + (void)chown(to, was.st_uid, was.st_gid); + + /* copy access and modify times, ignore errors */ + when.actime = was.st_atime; + when.modtime = was.st_mtime; + (void)utime(to, &when); +} + +/* Decompress the file inname to the file outnname, of if test is true, just + decompress without writing and check the gzip trailer for integrity. If + inname is NULL or an empty string, read from stdin. If outname is NULL or + an empty string, write to stdout. strm is a pre-initialized inflateBack + structure. When appropriate, copy the file attributes from inname to + outname. + + gunzip() returns 1 if there is an out-of-memory error or an unexpected + return code from gunpipe(). Otherwise it returns 0. + */ +local int gunzip(z_stream *strm, char *inname, char *outname, int test) +{ + int ret; + int infile, outfile; + + /* open files */ + if (inname == NULL || *inname == 0) { + inname = "-"; + infile = 0; /* stdin */ + } + else { + infile = open(inname, O_RDONLY, 0); + if (infile == -1) { + fprintf(stderr, "gun cannot open %s\n", inname); + return 0; + } + } + if (test) + outfile = -1; + else if (outname == NULL || *outname == 0) { + outname = "-"; + outfile = 1; /* stdout */ + } + else { + outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666); + if (outfile == -1) { + close(infile); + fprintf(stderr, "gun cannot create %s\n", outname); + return 0; + } + } + errno = 0; + + /* decompress */ + ret = gunpipe(strm, infile, outfile); + if (outfile > 2) close(outfile); + if (infile > 2) close(infile); + + /* interpret result */ + switch (ret) { + case Z_OK: + case Z_ERRNO: + if (infile > 2 && outfile > 2) { + copymeta(inname, outname); /* copy attributes */ + unlink(inname); + } + if (ret == Z_ERRNO) + fprintf(stderr, "gun warning: trailing garbage ignored in %s\n", + inname); + break; + case Z_DATA_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg); + break; + case Z_MEM_ERROR: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + case Z_BUF_ERROR: + if (outfile > 2) unlink(outname); + if (strm->next_in != Z_NULL) { + fprintf(stderr, "gun write error on %s: %s\n", + outname, strerror(errno)); + } + else if (errno) { + fprintf(stderr, "gun read error on %s: %s\n", + inname, strerror(errno)); + } + else { + fprintf(stderr, "gun unexpected end of file on %s\n", + inname); + } + break; + default: + if (outfile > 2) unlink(outname); + fprintf(stderr, "gun internal error--aborting\n"); + return 1; + } + return 0; +} + +/* Process the gun command line arguments. See the command syntax near the + beginning of this source file. */ +int main(int argc, char **argv) +{ + int ret, len, test; + char *outname; + unsigned char *window; + z_stream strm; + + /* initialize inflateBack state for repeated use */ + window = match; /* reuse LZW match buffer */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = inflateBackInit(&strm, 15, window); + if (ret != Z_OK) { + fprintf(stderr, "gun out of memory error--aborting\n"); + return 1; + } + + /* decompress each file to the same name with the suffix removed */ + argc--; + argv++; + test = 0; + if (argc && strcmp(*argv, "-h") == 0) { + fprintf(stderr, "gun 1.6 (17 Jan 2010)\n"); + fprintf(stderr, "Copyright (C) 2003-2010 Mark Adler\n"); + fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n"); + return 0; + } + if (argc && strcmp(*argv, "-t") == 0) { + test = 1; + argc--; + argv++; + } + if (argc) + do { + if (test) + outname = NULL; + else { + len = (int)strlen(*argv); + if (strcmp(*argv + len - 3, ".gz") == 0 || + strcmp(*argv + len - 3, "-gz") == 0) + len -= 3; + else if (strcmp(*argv + len - 2, ".z") == 0 || + strcmp(*argv + len - 2, "-z") == 0 || + strcmp(*argv + len - 2, "_z") == 0 || + strcmp(*argv + len - 2, ".Z") == 0) + len -= 2; + else { + fprintf(stderr, "gun error: no gz type on %s--skipping\n", + *argv); + continue; + } + outname = malloc(len + 1); + if (outname == NULL) { + fprintf(stderr, "gun out of memory error--aborting\n"); + ret = 1; + break; + } + memcpy(outname, *argv, len); + outname[len] = 0; + } + ret = gunzip(&strm, *argv, outname, test); + if (outname != NULL) free(outname); + if (ret) break; + } while (argv++, --argc); + else + ret = gunzip(&strm, NULL, NULL, test); + + /* clean up */ + inflateBackEnd(&strm); + return ret; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzappend.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzappend.c new file mode 100644 index 0000000000..e9e878e116 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzappend.c @@ -0,0 +1,500 @@ +/* gzappend -- command to append to a gzip file + + Copyright (C) 2003 Mark Adler, all rights reserved + version 1.1, 4 Nov 2003 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 19 Oct 2003 - First version + * 1.1 4 Nov 2003 - Expand and clarify some comments and notes + * - Add version and copyright to help + * - Send help to stdout instead of stderr + * - Add some preemptive typecasts + * - Add L to constants in lseek() calls + * - Remove some debugging information in error messages + * - Use new data_type definition for zlib 1.2.1 + * - Simplfy and unify file operations + * - Finish off gzip file in gztack() + * - Use deflatePrime() instead of adding empty blocks + * - Keep gzip file clean on appended file read errors + * - Use in-place rotate instead of auxiliary buffer + * (Why you ask? Because it was fun to write!) + */ + +/* + gzappend takes a gzip file and appends to it, compressing files from the + command line or data from stdin. The gzip file is written to directly, to + avoid copying that file, in case it's large. Note that this results in the + unfriendly behavior that if gzappend fails, the gzip file is corrupted. + + This program was written to illustrate the use of the new Z_BLOCK option of + zlib 1.2.x's inflate() function. This option returns from inflate() at each + block boundary to facilitate locating and modifying the last block bit at + the start of the final deflate block. Also whether using Z_BLOCK or not, + another required feature of zlib 1.2.x is that inflate() now provides the + number of unusued bits in the last input byte used. gzappend will not work + with versions of zlib earlier than 1.2.1. + + gzappend first decompresses the gzip file internally, discarding all but + the last 32K of uncompressed data, and noting the location of the last block + bit and the number of unused bits in the last byte of the compressed data. + The gzip trailer containing the CRC-32 and length of the uncompressed data + is verified. This trailer will be later overwritten. + + Then the last block bit is cleared by seeking back in the file and rewriting + the byte that contains it. Seeking forward, the last byte of the compressed + data is saved along with the number of unused bits to initialize deflate. + + A deflate process is initialized, using the last 32K of the uncompressed + data from the gzip file to initialize the dictionary. If the total + uncompressed data was less than 32K, then all of it is used to initialize + the dictionary. The deflate output bit buffer is also initialized with the + last bits from the original deflate stream. From here on, the data to + append is simply compressed using deflate, and written to the gzip file. + When that is complete, the new CRC-32 and uncompressed length are written + as the trailer of the gzip file. + */ + +#include +#include +#include +#include +#include +#include "zlib.h" + +#define local static +#define LGCHUNK 14 +#define CHUNK (1U << LGCHUNK) +#define DSIZE 32768U + +/* print an error message and terminate with extreme prejudice */ +local void bye(char *msg1, char *msg2) +{ + fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2); + exit(1); +} + +/* return the greatest common divisor of a and b using Euclid's algorithm, + modified to be fast when one argument much greater than the other, and + coded to avoid unnecessary swapping */ +local unsigned gcd(unsigned a, unsigned b) +{ + unsigned c; + + while (a && b) + if (a > b) { + c = b; + while (a - c >= c) + c <<= 1; + a -= c; + } + else { + c = a; + while (b - c >= c) + c <<= 1; + b -= c; + } + return a + b; +} + +/* rotate list[0..len-1] left by rot positions, in place */ +local void rotate(unsigned char *list, unsigned len, unsigned rot) +{ + unsigned char tmp; + unsigned cycles; + unsigned char *start, *last, *to, *from; + + /* normalize rot and handle degenerate cases */ + if (len < 2) return; + if (rot >= len) rot %= len; + if (rot == 0) return; + + /* pointer to last entry in list */ + last = list + (len - 1); + + /* do simple left shift by one */ + if (rot == 1) { + tmp = *list; + memcpy(list, list + 1, len - 1); + *last = tmp; + return; + } + + /* do simple right shift by one */ + if (rot == len - 1) { + tmp = *last; + memmove(list + 1, list, len - 1); + *list = tmp; + return; + } + + /* otherwise do rotate as a set of cycles in place */ + cycles = gcd(len, rot); /* number of cycles */ + do { + start = from = list + cycles; /* start index is arbitrary */ + tmp = *from; /* save entry to be overwritten */ + for (;;) { + to = from; /* next step in cycle */ + from += rot; /* go right rot positions */ + if (from > last) from -= len; /* (pointer better not wrap) */ + if (from == start) break; /* all but one shifted */ + *to = *from; /* shift left */ + } + *to = tmp; /* complete the circle */ + } while (--cycles); +} + +/* structure for gzip file read operations */ +typedef struct { + int fd; /* file descriptor */ + int size; /* 1 << size is bytes in buf */ + unsigned left; /* bytes available at next */ + unsigned char *buf; /* buffer */ + unsigned char *next; /* next byte in buffer */ + char *name; /* file name for error messages */ +} file; + +/* reload buffer */ +local int readin(file *in) +{ + int len; + + len = read(in->fd, in->buf, 1 << in->size); + if (len == -1) bye("error reading ", in->name); + in->left = (unsigned)len; + in->next = in->buf; + return len; +} + +/* read from file in, exit if end-of-file */ +local int readmore(file *in) +{ + if (readin(in) == 0) bye("unexpected end of ", in->name); + return 0; +} + +#define read1(in) (in->left == 0 ? readmore(in) : 0, \ + in->left--, *(in->next)++) + +/* skip over n bytes of in */ +local void skip(file *in, unsigned n) +{ + unsigned bypass; + + if (n > in->left) { + n -= in->left; + bypass = n & ~((1U << in->size) - 1); + if (bypass) { + if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1) + bye("seeking ", in->name); + n -= bypass; + } + readmore(in); + if (n > in->left) + bye("unexpected end of ", in->name); + } + in->left -= n; + in->next += n; +} + +/* read a four-byte unsigned integer, little-endian, from in */ +unsigned long read4(file *in) +{ + unsigned long val; + + val = read1(in); + val += (unsigned)read1(in) << 8; + val += (unsigned long)read1(in) << 16; + val += (unsigned long)read1(in) << 24; + return val; +} + +/* skip over gzip header */ +local void gzheader(file *in) +{ + int flags; + unsigned n; + + if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file"); + if (read1(in) != 8) bye("unknown compression method in", in->name); + flags = read1(in); + if (flags & 0xe0) bye("unknown header flags set in", in->name); + skip(in, 6); + if (flags & 4) { + n = read1(in); + n += (unsigned)(read1(in)) << 8; + skip(in, n); + } + if (flags & 8) while (read1(in) != 0) ; + if (flags & 16) while (read1(in) != 0) ; + if (flags & 2) skip(in, 2); +} + +/* decompress gzip file "name", return strm with a deflate stream ready to + continue compression of the data in the gzip file, and return a file + descriptor pointing to where to write the compressed data -- the deflate + stream is initialized to compress using level "level" */ +local int gzscan(char *name, z_stream *strm, int level) +{ + int ret, lastbit, left, full; + unsigned have; + unsigned long crc, tot; + unsigned char *window; + off_t lastoff, end; + file gz; + + /* open gzip file */ + gz.name = name; + gz.fd = open(name, O_RDWR, 0); + if (gz.fd == -1) bye("cannot open ", name); + gz.buf = malloc(CHUNK); + if (gz.buf == NULL) bye("out of memory", ""); + gz.size = LGCHUNK; + gz.left = 0; + + /* skip gzip header */ + gzheader(&gz); + + /* prepare to decompress */ + window = malloc(DSIZE); + if (window == NULL) bye("out of memory", ""); + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = inflateInit2(strm, -15); + if (ret != Z_OK) bye("out of memory", " or library mismatch"); + + /* decompress the deflate stream, saving append information */ + lastbit = 0; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + left = 0; + strm->avail_in = gz.left; + strm->next_in = gz.next; + crc = crc32(0L, Z_NULL, 0); + have = full = 0; + do { + /* if needed, get more input */ + if (strm->avail_in == 0) { + readmore(&gz); + strm->avail_in = gz.left; + strm->next_in = gz.next; + } + + /* set up output to next available section of sliding window */ + strm->avail_out = DSIZE - have; + strm->next_out = window + have; + + /* inflate and check for errors */ + ret = inflate(strm, Z_BLOCK); + if (ret == Z_STREAM_ERROR) bye("internal stream error!", ""); + if (ret == Z_MEM_ERROR) bye("out of memory", ""); + if (ret == Z_DATA_ERROR) + bye("invalid compressed data--format violated in", name); + + /* update crc and sliding window pointer */ + crc = crc32(crc, window + have, DSIZE - have - strm->avail_out); + if (strm->avail_out) + have = DSIZE - strm->avail_out; + else { + have = 0; + full = 1; + } + + /* process end of block */ + if (strm->data_type & 128) { + if (strm->data_type & 64) + left = strm->data_type & 0x1f; + else { + lastbit = strm->data_type & 0x1f; + lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in; + } + } + } while (ret != Z_STREAM_END); + inflateEnd(strm); + gz.left = strm->avail_in; + gz.next = strm->next_in; + + /* save the location of the end of the compressed data */ + end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left; + + /* check gzip trailer and save total for deflate */ + if (crc != read4(&gz)) + bye("invalid compressed data--crc mismatch in ", name); + tot = strm->total_out; + if ((tot & 0xffffffffUL) != read4(&gz)) + bye("invalid compressed data--length mismatch in", name); + + /* if not at end of file, warn */ + if (gz.left || readin(&gz)) + fprintf(stderr, + "gzappend warning: junk at end of gzip file overwritten\n"); + + /* clear last block bit */ + lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + *gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7))); + lseek(gz.fd, -1L, SEEK_CUR); + if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name); + + /* if window wrapped, build dictionary from window by rotating */ + if (full) { + rotate(window, DSIZE, have); + have = DSIZE; + } + + /* set up deflate stream with window, crc, total_in, and leftover bits */ + ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + if (ret != Z_OK) bye("out of memory", ""); + deflateSetDictionary(strm, window, have); + strm->adler = crc; + strm->total_in = tot; + if (left) { + lseek(gz.fd, --end, SEEK_SET); + if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name); + deflatePrime(strm, 8 - left, *gz.buf); + } + lseek(gz.fd, end, SEEK_SET); + + /* clean up and return */ + free(window); + free(gz.buf); + return gz.fd; +} + +/* append file "name" to gzip file gd using deflate stream strm -- if last + is true, then finish off the deflate stream at the end */ +local void gztack(char *name, int gd, z_stream *strm, int last) +{ + int fd, len, ret; + unsigned left; + unsigned char *in, *out; + + /* open file to compress and append */ + fd = 0; + if (name != NULL) { + fd = open(name, O_RDONLY, 0); + if (fd == -1) + fprintf(stderr, "gzappend warning: %s not found, skipping ...\n", + name); + } + + /* allocate buffers */ + in = fd == -1 ? NULL : malloc(CHUNK); + out = malloc(CHUNK); + if (out == NULL) bye("out of memory", ""); + + /* compress input file and append to gzip file */ + do { + /* get more input */ + len = fd == -1 ? 0 : read(fd, in, CHUNK); + if (len == -1) { + fprintf(stderr, + "gzappend warning: error reading %s, skipping rest ...\n", + name); + len = 0; + } + strm->avail_in = (unsigned)len; + strm->next_in = in; + if (len) strm->adler = crc32(strm->adler, in, (unsigned)len); + + /* compress and write all available output */ + do { + strm->avail_out = CHUNK; + strm->next_out = out; + ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH); + left = CHUNK - strm->avail_out; + while (left) { + len = write(gd, out + CHUNK - strm->avail_out - left, left); + if (len == -1) bye("writing gzip file", ""); + left -= (unsigned)len; + } + } while (strm->avail_out == 0 && ret != Z_STREAM_END); + } while (len != 0); + + /* write trailer after last entry */ + if (last) { + deflateEnd(strm); + out[0] = (unsigned char)(strm->adler); + out[1] = (unsigned char)(strm->adler >> 8); + out[2] = (unsigned char)(strm->adler >> 16); + out[3] = (unsigned char)(strm->adler >> 24); + out[4] = (unsigned char)(strm->total_in); + out[5] = (unsigned char)(strm->total_in >> 8); + out[6] = (unsigned char)(strm->total_in >> 16); + out[7] = (unsigned char)(strm->total_in >> 24); + len = 8; + do { + ret = write(gd, out + 8 - len, len); + if (ret == -1) bye("writing gzip file", ""); + len -= ret; + } while (len); + close(gd); + } + + /* clean up and return */ + free(out); + if (in != NULL) free(in); + if (fd > 0) close(fd); +} + +/* process the compression level option if present, scan the gzip file, and + append the specified files, or append the data from stdin if no other file + names are provided on the command line -- the gzip file must be writable + and seekable */ +int main(int argc, char **argv) +{ + int gd, level; + z_stream strm; + + /* ignore command name */ + argv++; + + /* provide usage if no arguments */ + if (*argv == NULL) { + printf("gzappend 1.1 (4 Nov 2003) Copyright (C) 2003 Mark Adler\n"); + printf( + "usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n"); + return 0; + } + + /* set compression level */ + level = Z_DEFAULT_COMPRESSION; + if (argv[0][0] == '-') { + if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0) + bye("invalid compression level", ""); + level = argv[0][1] - '0'; + if (*++argv == NULL) bye("no gzip file name after options", ""); + } + + /* prepare to append to gzip file */ + gd = gzscan(*argv++, &strm, level); + + /* append files on command line, or from stdin if none */ + if (*argv == NULL) + gztack(NULL, gd, &strm, 1); + else + do { + gztack(*argv, gd, &strm, argv[1] == NULL); + } while (*++argv != NULL); + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzjoin.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzjoin.c new file mode 100644 index 0000000000..129347ce3c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzjoin.c @@ -0,0 +1,448 @@ +/* gzjoin -- command to join gzip files into one gzip file + + Copyright (C) 2004 Mark Adler, all rights reserved + version 1.0, 11 Dec 2004 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* + * Change history: + * + * 1.0 11 Dec 2004 - First version + * 1.1 12 Jun 2005 - Changed ssize_t to long for portability + */ + +/* + gzjoin takes one or more gzip files on the command line and writes out a + single gzip file that will uncompress to the concatenation of the + uncompressed data from the individual gzip files. gzjoin does this without + having to recompress any of the data and without having to calculate a new + crc32 for the concatenated uncompressed data. gzjoin does however have to + decompress all of the input data in order to find the bits in the compressed + data that need to be modified to concatenate the streams. + + gzjoin does not do an integrity check on the input gzip files other than + checking the gzip header and decompressing the compressed data. They are + otherwise assumed to be complete and correct. + + Each joint between gzip files removes at least 18 bytes of previous trailer + and subsequent header, and inserts an average of about three bytes to the + compressed data in order to connect the streams. The output gzip file + has a minimal ten-byte gzip header with no file name or modification time. + + This program was written to illustrate the use of the Z_BLOCK option of + inflate() and the crc32_combine() function. gzjoin will not compile with + versions of zlib earlier than 1.2.3. + */ + +#include /* fputs(), fprintf(), fwrite(), putc() */ +#include /* exit(), malloc(), free() */ +#include /* open() */ +#include /* close(), read(), lseek() */ +#include "zlib.h" + /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */ + +#define local static + +/* exit with an error (return a value to allow use in an expression) */ +local int bail(char *why1, char *why2) +{ + fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2); + exit(1); + return 0; +} + +/* -- simple buffered file input with access to the buffer -- */ + +#define CHUNK 32768 /* must be a power of two and fit in unsigned */ + +/* bin buffered input file type */ +typedef struct { + char *name; /* name of file for error messages */ + int fd; /* file descriptor */ + unsigned left; /* bytes remaining at next */ + unsigned char *next; /* next byte to read */ + unsigned char *buf; /* allocated buffer of length CHUNK */ +} bin; + +/* close a buffered file and free allocated memory */ +local void bclose(bin *in) +{ + if (in != NULL) { + if (in->fd != -1) + close(in->fd); + if (in->buf != NULL) + free(in->buf); + free(in); + } +} + +/* open a buffered file for input, return a pointer to type bin, or NULL on + failure */ +local bin *bopen(char *name) +{ + bin *in; + + in = malloc(sizeof(bin)); + if (in == NULL) + return NULL; + in->buf = malloc(CHUNK); + in->fd = open(name, O_RDONLY, 0); + if (in->buf == NULL || in->fd == -1) { + bclose(in); + return NULL; + } + in->left = 0; + in->next = in->buf; + in->name = name; + return in; +} + +/* load buffer from file, return -1 on read error, 0 or 1 on success, with + 1 indicating that end-of-file was reached */ +local int bload(bin *in) +{ + long len; + + if (in == NULL) + return -1; + if (in->left != 0) + return 0; + in->next = in->buf; + do { + len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left); + if (len < 0) + return -1; + in->left += (unsigned)len; + } while (len != 0 && in->left < CHUNK); + return len == 0 ? 1 : 0; +} + +/* get a byte from the file, bail if end of file */ +#define bget(in) (in->left ? 0 : bload(in), \ + in->left ? (in->left--, *(in->next)++) : \ + bail("unexpected end of file on ", in->name)) + +/* get a four-byte little-endian unsigned integer from file */ +local unsigned long bget4(bin *in) +{ + unsigned long val; + + val = bget(in); + val += (unsigned long)(bget(in)) << 8; + val += (unsigned long)(bget(in)) << 16; + val += (unsigned long)(bget(in)) << 24; + return val; +} + +/* skip bytes in file */ +local void bskip(bin *in, unsigned skip) +{ + /* check pointer */ + if (in == NULL) + return; + + /* easy case -- skip bytes in buffer */ + if (skip <= in->left) { + in->left -= skip; + in->next += skip; + return; + } + + /* skip what's in buffer, discard buffer contents */ + skip -= in->left; + in->left = 0; + + /* seek past multiples of CHUNK bytes */ + if (skip > CHUNK) { + unsigned left; + + left = skip & (CHUNK - 1); + if (left == 0) { + /* exact number of chunks: seek all the way minus one byte to check + for end-of-file with a read */ + lseek(in->fd, skip - 1, SEEK_CUR); + if (read(in->fd, in->buf, 1) != 1) + bail("unexpected end of file on ", in->name); + return; + } + + /* skip the integral chunks, update skip with remainder */ + lseek(in->fd, skip - left, SEEK_CUR); + skip = left; + } + + /* read more input and skip remainder */ + bload(in); + if (skip > in->left) + bail("unexpected end of file on ", in->name); + in->left -= skip; + in->next += skip; +} + +/* -- end of buffered input functions -- */ + +/* skip the gzip header from file in */ +local void gzhead(bin *in) +{ + int flags; + + /* verify gzip magic header and compression method */ + if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8) + bail(in->name, " is not a valid gzip file"); + + /* get and verify flags */ + flags = bget(in); + if ((flags & 0xe0) != 0) + bail("unknown reserved bits set in ", in->name); + + /* skip modification time, extra flags, and os */ + bskip(in, 6); + + /* skip extra field if present */ + if (flags & 4) { + unsigned len; + + len = bget(in); + len += (unsigned)(bget(in)) << 8; + bskip(in, len); + } + + /* skip file name if present */ + if (flags & 8) + while (bget(in) != 0) + ; + + /* skip comment if present */ + if (flags & 16) + while (bget(in) != 0) + ; + + /* skip header crc if present */ + if (flags & 2) + bskip(in, 2); +} + +/* write a four-byte little-endian unsigned integer to out */ +local void put4(unsigned long val, FILE *out) +{ + putc(val & 0xff, out); + putc((val >> 8) & 0xff, out); + putc((val >> 16) & 0xff, out); + putc((val >> 24) & 0xff, out); +} + +/* Load up zlib stream from buffered input, bail if end of file */ +local void zpull(z_streamp strm, bin *in) +{ + if (in->left == 0) + bload(in); + if (in->left == 0) + bail("unexpected end of file on ", in->name); + strm->avail_in = in->left; + strm->next_in = in->next; +} + +/* Write header for gzip file to out and initialize trailer. */ +local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out) +{ + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + *crc = crc32(0L, Z_NULL, 0); + *tot = 0; +} + +/* Copy the compressed data from name, zeroing the last block bit of the last + block if clr is true, and adding empty blocks as needed to get to a byte + boundary. If clr is false, then the last block becomes the last block of + the output, and the gzip trailer is written. crc and tot maintains the + crc and length (modulo 2^32) of the output for the trailer. The resulting + gzip file is written to out. gzinit() must be called before the first call + of gzcopy() to write the gzip header and to initialize crc and tot. */ +local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot, + FILE *out) +{ + int ret; /* return value from zlib functions */ + int pos; /* where the "last block" bit is in byte */ + int last; /* true if processing the last block */ + bin *in; /* buffered input file */ + unsigned char *start; /* start of compressed data in buffer */ + unsigned char *junk; /* buffer for uncompressed data -- discarded */ + z_off_t len; /* length of uncompressed data (support > 4 GB) */ + z_stream strm; /* zlib inflate stream */ + + /* open gzip file and skip header */ + in = bopen(name); + if (in == NULL) + bail("could not open ", name); + gzhead(in); + + /* allocate buffer for uncompressed data and initialize raw inflate + stream */ + junk = malloc(CHUNK); + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); + if (junk == NULL || ret != Z_OK) + bail("out of memory", ""); + + /* inflate and copy compressed data, clear last-block bit if requested */ + len = 0; + zpull(&strm, in); + start = strm.next_in; + last = start[0] & 1; + if (last && clr) + start[0] &= ~1; + strm.avail_out = 0; + for (;;) { + /* if input used and output done, write used input and get more */ + if (strm.avail_in == 0 && strm.avail_out != 0) { + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + + /* decompress -- return early when end-of-block reached */ + strm.avail_out = CHUNK; + strm.next_out = junk; + ret = inflate(&strm, Z_BLOCK); + switch (ret) { + case Z_MEM_ERROR: + bail("out of memory", ""); + case Z_DATA_ERROR: + bail("invalid compressed data in ", in->name); + } + + /* update length of uncompressed data */ + len += CHUNK - strm.avail_out; + + /* check for block boundary (only get this when block copied out) */ + if (strm.data_type & 128) { + /* if that was the last block, then done */ + if (last) + break; + + /* number of unused bits in last byte */ + pos = strm.data_type & 7; + + /* find the next last-block bit */ + if (pos != 0) { + /* next last-block bit is in last used byte */ + pos = 0x100 >> pos; + last = strm.next_in[-1] & pos; + if (last && clr) + strm.next_in[-1] &= ~pos; + } + else { + /* next last-block bit is in next unused byte */ + if (strm.avail_in == 0) { + /* don't have that byte yet -- get it */ + fwrite(start, 1, strm.next_in - start, out); + start = in->buf; + in->left = 0; + zpull(&strm, in); + } + last = strm.next_in[0] & 1; + if (last && clr) + strm.next_in[0] &= ~1; + } + } + } + + /* update buffer with unused input */ + in->left = strm.avail_in; + in->next = strm.next_in; + + /* copy used input, write empty blocks to get to byte boundary */ + pos = strm.data_type & 7; + fwrite(start, 1, in->next - start - 1, out); + last = in->next[-1]; + if (pos == 0 || !clr) + /* already at byte boundary, or last file: write last byte */ + putc(last, out); + else { + /* append empty blocks to last byte */ + last &= ((0x100 >> pos) - 1); /* assure unused bits are zero */ + if (pos & 1) { + /* odd -- append an empty stored block */ + putc(last, out); + if (pos == 1) + putc(0, out); /* two more bits in block header */ + fwrite("\0\0\xff\xff", 1, 4, out); + } + else { + /* even -- append 1, 2, or 3 empty fixed blocks */ + switch (pos) { + case 6: + putc(last | 8, out); + last = 0; + case 4: + putc(last | 0x20, out); + last = 0; + case 2: + putc(last | 0x80, out); + putc(0, out); + } + } + } + + /* update crc and tot */ + *crc = crc32_combine(*crc, bget4(in), len); + *tot += (unsigned long)len; + + /* clean up */ + inflateEnd(&strm); + free(junk); + bclose(in); + + /* write trailer if this is the last gzip file */ + if (!clr) { + put4(*crc, out); + put4(*tot, out); + } +} + +/* join the gzip files on the command line, write result to stdout */ +int main(int argc, char **argv) +{ + unsigned long crc, tot; /* running crc and total uncompressed length */ + + /* skip command name */ + argc--; + argv++; + + /* show usage if no arguments */ + if (argc == 0) { + fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n", + stderr); + return 0; + } + + /* join gzip files on command line and write to stdout */ + gzinit(&crc, &tot, stdout); + while (argc--) + gzcopy(*argv++, argc, &crc, &tot, stdout); + + /* done */ + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzlog.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzlog.c new file mode 100644 index 0000000000..d70aacabae --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzlog.c @@ -0,0 +1,1058 @@ +/* + * gzlog.c + * Copyright (C) 2004, 2008 Mark Adler, all rights reserved + * For conditions of distribution and use, see copyright notice in gzlog.h + * version 2.0, 25 Apr 2008 + */ + +/* + gzlog provides a mechanism for frequently appending short strings to a gzip + file that is efficient both in execution time and compression ratio. The + strategy is to write the short strings in an uncompressed form to the end of + the gzip file, only compressing when the amount of uncompressed data has + reached a given threshold. + + gzlog also provides protection against interruptions in the process due to + system crashes. The status of the operation is recorded in an extra field + in the gzip file, and is only updated once the gzip file is brought to a + valid state. The last data to be appended or compressed is saved in an + auxiliary file, so that if the operation is interrupted, it can be completed + the next time an append operation is attempted. + + gzlog maintains another auxiliary file with the last 32K of data from the + compressed portion, which is preloaded for the compression of the subsequent + data. This minimizes the impact to the compression ratio of appending. + */ + +/* + Operations Concept: + + Files (log name "foo"): + foo.gz -- gzip file with the complete log + foo.add -- last message to append or last data to compress + foo.dict -- dictionary of the last 32K of data for next compression + foo.temp -- temporary dictionary file for compression after this one + foo.lock -- lock file for reading and writing the other files + foo.repairs -- log file for log file recovery operations (not compressed) + + gzip file structure: + - fixed-length (no file name) header with extra field (see below) + - compressed data ending initially with empty stored block + - uncompressed data filling out originally empty stored block and + subsequent stored blocks as needed (16K max each) + - gzip trailer + - no junk at end (no other gzip streams) + + When appending data, the information in the first three items above plus the + foo.add file are sufficient to recover an interrupted append operation. The + extra field has the necessary information to restore the start of the last + stored block and determine where to append the data in the foo.add file, as + well as the crc and length of the gzip data before the append operation. + + The foo.add file is created before the gzip file is marked for append, and + deleted after the gzip file is marked as complete. So if the append + operation is interrupted, the data to add will still be there. If due to + some external force, the foo.add file gets deleted between when the append + operation was interrupted and when recovery is attempted, the gzip file will + still be restored, but without the appended data. + + When compressing data, the information in the first two items above plus the + foo.add file are sufficient to recover an interrupted compress operation. + The extra field has the necessary information to find the end of the + compressed data, and contains both the crc and length of just the compressed + data and of the complete set of data including the contents of the foo.add + file. + + Again, the foo.add file is maintained during the compress operation in case + of an interruption. If in the unlikely event the foo.add file with the data + to be compressed is missing due to some external force, a gzip file with + just the previous compressed data will be reconstructed. In this case, all + of the data that was to be compressed is lost (approximately one megabyte). + This will not occur if all that happened was an interruption of the compress + operation. + + The third state that is marked is the replacement of the old dictionary with + the new dictionary after a compress operation. Once compression is + complete, the gzip file is marked as being in the replace state. This + completes the gzip file, so an interrupt after being so marked does not + result in recompression. Then the dictionary file is replaced, and the gzip + file is marked as completed. This state prevents the possibility of + restarting compression with the wrong dictionary file. + + All three operations are wrapped by a lock/unlock procedure. In order to + gain exclusive access to the log files, first a foo.lock file must be + exclusively created. When all operations are complete, the lock is + released by deleting the foo.lock file. If when attempting to create the + lock file, it already exists and the modify time of the lock file is more + than five minutes old (set by the PATIENCE define below), then the old + lock file is considered stale and deleted, and the exclusive creation of + the lock file is retried. To assure that there are no false assessments + of the staleness of the lock file, the operations periodically touch the + lock file to update the modified date. + + Following is the definition of the extra field with all of the information + required to enable the above append and compress operations and their + recovery if interrupted. Multi-byte values are stored little endian + (consistent with the gzip format). File pointers are eight bytes long. + The crc's and lengths for the gzip trailer are four bytes long. (Note that + the length at the end of a gzip file is used for error checking only, and + for large files is actually the length modulo 2^32.) The stored block + length is two bytes long. The gzip extra field two-byte identification is + "ap" for append. It is assumed that writing the extra field to the file is + an "atomic" operation. That is, either all of the extra field is written + to the file, or none of it is, if the operation is interrupted right at the + point of updating the extra field. This is a reasonable assumption, since + the extra field is within the first 52 bytes of the file, which is smaller + than any expected block size for a mass storage device (usually 512 bytes or + larger). + + Extra field (35 bytes): + - Pointer to first stored block length -- this points to the two-byte length + of the first stored block, which is followed by the two-byte, one's + complement of that length. The stored block length is preceded by the + three-bit header of the stored block, which is the actual start of the + stored block in the deflate format. See the bit offset field below. + - Pointer to the last stored block length. This is the same as above, but + for the last stored block of the uncompressed data in the gzip file. + Initially this is the same as the first stored block length pointer. + When the stored block gets to 16K (see the MAX_STORE define), then a new + stored block as added, at which point the last stored block length pointer + is different from the first stored block length pointer. When they are + different, the first bit of the last stored block header is eight bits, or + one byte back from the block length. + - Compressed data crc and length. This is the crc and length of the data + that is in the compressed portion of the deflate stream. These are used + only in the event that the foo.add file containing the data to compress is + lost after a compress operation is interrupted. + - Total data crc and length. This is the crc and length of all of the data + stored in the gzip file, compressed and uncompressed. It is used to + reconstruct the gzip trailer when compressing, as well as when recovering + interrupted operations. + - Final stored block length. This is used to quickly find where to append, + and allows the restoration of the original final stored block state when + an append operation is interrupted. + - First stored block start as the number of bits back from the final stored + block first length byte. This value is in the range of 3..10, and is + stored as the low three bits of the final byte of the extra field after + subtracting three (0..7). This allows the last-block bit of the stored + block header to be updated when a new stored block is added, for the case + when the first stored block and the last stored block are the same. (When + they are different, the numbers of bits back is known to be eight.) This + also allows for new compressed data to be appended to the old compressed + data in the compress operation, overwriting the previous first stored + block, or for the compressed data to be terminated and a valid gzip file + reconstructed on the off chance that a compression operation was + interrupted and the data to compress in the foo.add file was deleted. + - The operation in process. This is the next two bits in the last byte (the + bits under the mask 0x18). The are interpreted as 0: nothing in process, + 1: append in process, 2: compress in process, 3: replace in process. + - The top three bits of the last byte in the extra field are reserved and + are currently set to zero. + + Main procedure: + - Exclusively create the foo.lock file using the O_CREAT and O_EXCL modes of + the system open() call. If the modify time of an existing lock file is + more than PATIENCE seconds old, then the lock file is deleted and the + exclusive create is retried. + - Load the extra field from the foo.gz file, and see if an operation was in + progress but not completed. If so, apply the recovery procedure below. + - Perform the append procedure with the provided data. + - If the uncompressed data in the foo.gz file is 1MB or more, apply the + compress procedure. + - Delete the foo.lock file. + + Append procedure: + - Put what to append in the foo.add file so that the operation can be + restarted if this procedure is interrupted. + - Mark the foo.gz extra field with the append operation in progress. + + Restore the original last-block bit and stored block length of the last + stored block from the information in the extra field, in case a previous + append operation was interrupted. + - Append the provided data to the last stored block, creating new stored + blocks as needed and updating the stored blocks last-block bits and + lengths. + - Update the crc and length with the new data, and write the gzip trailer. + - Write over the extra field (with a single write operation) with the new + pointers, lengths, and crc's, and mark the gzip file as not in process. + Though there is still a foo.add file, it will be ignored since nothing + is in process. If a foo.add file is leftover from a previously + completed operation, it is truncated when writing new data to it. + - Delete the foo.add file. + + Compress and replace procedures: + - Read all of the uncompressed data in the stored blocks in foo.gz and write + it to foo.add. Also write foo.temp with the last 32K of that data to + provide a dictionary for the next invocation of this procedure. + - Rewrite the extra field marking foo.gz with a compression in process. + * If there is no data provided to compress (due to a missing foo.add file + when recovering), reconstruct and truncate the foo.gz file to contain + only the previous compressed data and proceed to the step after the next + one. Otherwise ... + - Compress the data with the dictionary in foo.dict, and write to the + foo.gz file starting at the bit immediately following the last previously + compressed block. If there is no foo.dict, proceed anyway with the + compression at slightly reduced efficiency. (For the foo.dict file to be + missing requires some external failure beyond simply the interruption of + a compress operation.) During this process, the foo.lock file is + periodically touched to assure that that file is not considered stale by + another process before we're done. The deflation is terminated with a + non-last empty static block (10 bits long), that is then located and + written over by a last-bit-set empty stored block. + - Append the crc and length of the data in the gzip file (previously + calculated during the append operations). + - Write over the extra field with the updated stored block offsets, bits + back, crc's, and lengths, and mark foo.gz as in process for a replacement + of the dictionary. + @ Delete the foo.add file. + - Replace foo.dict with foo.temp. + - Write over the extra field, marking foo.gz as complete. + + Recovery procedure: + - If not a replace recovery, read in the foo.add file, and provide that data + to the appropriate recovery below. If there is no foo.add file, provide + a zero data length to the recovery. In that case, the append recovery + restores the foo.gz to the previous compressed + uncompressed data state. + For the the compress recovery, a missing foo.add file results in foo.gz + being restored to the previous compressed-only data state. + - Append recovery: + - Pick up append at + step above + - Compress recovery: + - Pick up compress at * step above + - Replace recovery: + - Pick up compress at @ step above + - Log the repair with a date stamp in foo.repairs + */ + +#include +#include /* rename, fopen, fprintf, fclose */ +#include /* malloc, free */ +#include /* strlen, strrchr, strcpy, strncpy, strcmp */ +#include /* open */ +#include /* lseek, read, write, close, unlink, sleep, */ + /* ftruncate, fsync */ +#include /* errno */ +#include /* time, ctime */ +#include /* stat */ +#include /* utimes */ +#include "zlib.h" /* crc32 */ + +#include "gzlog.h" /* header for external access */ + +#define local static +typedef unsigned int uint; +typedef unsigned long ulong; + +/* Macro for debugging to deterministically force recovery operations */ +#ifdef DEBUG + #include /* longjmp */ + jmp_buf gzlog_jump; /* where to go back to */ + int gzlog_bail = 0; /* which point to bail at (1..8) */ + int gzlog_count = -1; /* number of times through to wait */ +# define BAIL(n) do { if (n == gzlog_bail && gzlog_count-- == 0) \ + longjmp(gzlog_jump, gzlog_bail); } while (0) +#else +# define BAIL(n) +#endif + +/* how old the lock file can be in seconds before considering it stale */ +#define PATIENCE 300 + +/* maximum stored block size in Kbytes -- must be in 1..63 */ +#define MAX_STORE 16 + +/* number of stored Kbytes to trigger compression (must be >= 32 to allow + dictionary construction, and <= 204 * MAX_STORE, in order for >> 10 to + discard the stored block headers contribution of five bytes each) */ +#define TRIGGER 1024 + +/* size of a deflate dictionary (this cannot be changed) */ +#define DICT 32768U + +/* values for the operation (2 bits) */ +#define NO_OP 0 +#define APPEND_OP 1 +#define COMPRESS_OP 2 +#define REPLACE_OP 3 + +/* macros to extract little-endian integers from an unsigned byte buffer */ +#define PULL2(p) ((p)[0]+((uint)((p)[1])<<8)) +#define PULL4(p) (PULL2(p)+((ulong)PULL2(p+2)<<16)) +#define PULL8(p) (PULL4(p)+((off_t)PULL4(p+4)<<32)) + +/* macros to store integers into a byte buffer in little-endian order */ +#define PUT2(p,a) do {(p)[0]=a;(p)[1]=(a)>>8;} while(0) +#define PUT4(p,a) do {PUT2(p,a);PUT2(p+2,a>>16);} while(0) +#define PUT8(p,a) do {PUT4(p,a);PUT4(p+4,a>>32);} while(0) + +/* internal structure for log information */ +#define LOGID "\106\035\172" /* should be three non-zero characters */ +struct log { + char id[4]; /* contains LOGID to detect inadvertent overwrites */ + int fd; /* file descriptor for .gz file, opened read/write */ + char *path; /* allocated path, e.g. "/var/log/foo" or "foo" */ + char *end; /* end of path, for appending suffices such as ".gz" */ + off_t first; /* offset of first stored block first length byte */ + int back; /* location of first block id in bits back from first */ + uint stored; /* bytes currently in last stored block */ + off_t last; /* offset of last stored block first length byte */ + ulong ccrc; /* crc of compressed data */ + ulong clen; /* length (modulo 2^32) of compressed data */ + ulong tcrc; /* crc of total data */ + ulong tlen; /* length (modulo 2^32) of total data */ + time_t lock; /* last modify time of our lock file */ +}; + +/* gzip header for gzlog */ +local unsigned char log_gzhead[] = { + 0x1f, 0x8b, /* magic gzip id */ + 8, /* compression method is deflate */ + 4, /* there is an extra field (no file name) */ + 0, 0, 0, 0, /* no modification time provided */ + 0, 0xff, /* no extra flags, no OS specified */ + 39, 0, 'a', 'p', 35, 0 /* extra field with "ap" subfield */ + /* 35 is EXTRA, 39 is EXTRA + 4 */ +}; + +#define HEAD sizeof(log_gzhead) /* should be 16 */ + +/* initial gzip extra field content (52 == HEAD + EXTRA + 1) */ +local unsigned char log_gzext[] = { + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of first stored block length */ + 52, 0, 0, 0, 0, 0, 0, 0, /* offset of last stored block length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* compressed data crc and length */ + 0, 0, 0, 0, 0, 0, 0, 0, /* total data crc and length */ + 0, 0, /* final stored block data length */ + 5 /* op is NO_OP, last bit 8 bits back */ +}; + +#define EXTRA sizeof(log_gzext) /* should be 35 */ + +/* initial gzip data and trailer */ +local unsigned char log_gzbody[] = { + 1, 0, 0, 0xff, 0xff, /* empty stored block (last) */ + 0, 0, 0, 0, /* crc */ + 0, 0, 0, 0 /* uncompressed length */ +}; + +#define BODY sizeof(log_gzbody) + +/* Exclusively create foo.lock in order to negotiate exclusive access to the + foo.* files. If the modify time of an existing lock file is greater than + PATIENCE seconds in the past, then consider the lock file to have been + abandoned, delete it, and try the exclusive create again. Save the lock + file modify time for verification of ownership. Return 0 on success, or -1 + on failure, usually due to an access restriction or invalid path. Note that + if stat() or unlink() fails, it may be due to another process noticing the + abandoned lock file a smidge sooner and deleting it, so those are not + flagged as an error. */ +local int log_lock(struct log *log) +{ + int fd; + struct stat st; + + strcpy(log->end, ".lock"); + while ((fd = open(log->path, O_CREAT | O_EXCL, 0644)) < 0) { + if (errno != EEXIST) + return -1; + if (stat(log->path, &st) == 0 && time(NULL) - st.st_mtime > PATIENCE) { + unlink(log->path); + continue; + } + sleep(2); /* relinquish the CPU for two seconds while waiting */ + } + close(fd); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; + return 0; +} + +/* Update the modify time of the lock file to now, in order to prevent another + task from thinking that the lock is stale. Save the lock file modify time + for verification of ownership. */ +local void log_touch(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + utimes(log->path, NULL); + if (stat(log->path, &st) == 0) + log->lock = st.st_mtime; +} + +/* Check the log file modify time against what is expected. Return true if + this is not our lock. If it is our lock, touch it to keep it. */ +local int log_check(struct log *log) +{ + struct stat st; + + strcpy(log->end, ".lock"); + if (stat(log->path, &st) || st.st_mtime != log->lock) + return 1; + log_touch(log); + return 0; +} + +/* Unlock a previously acquired lock, but only if it's ours. */ +local void log_unlock(struct log *log) +{ + if (log_check(log)) + return; + strcpy(log->end, ".lock"); + unlink(log->path); + log->lock = 0; +} + +/* Check the gzip header and read in the extra field, filling in the values in + the log structure. Return op on success or -1 if the gzip header was not as + expected. op is the current operation in progress last written to the extra + field. This assumes that the gzip file has already been opened, with the + file descriptor log->fd. */ +local int log_head(struct log *log) +{ + int op; + unsigned char buf[HEAD + EXTRA]; + + if (lseek(log->fd, 0, SEEK_SET) < 0 || + read(log->fd, buf, HEAD + EXTRA) != HEAD + EXTRA || + memcmp(buf, log_gzhead, HEAD)) { + return -1; + } + log->first = PULL8(buf + HEAD); + log->last = PULL8(buf + HEAD + 8); + log->ccrc = PULL4(buf + HEAD + 16); + log->clen = PULL4(buf + HEAD + 20); + log->tcrc = PULL4(buf + HEAD + 24); + log->tlen = PULL4(buf + HEAD + 28); + log->stored = PULL2(buf + HEAD + 32); + log->back = 3 + (buf[HEAD + 34] & 7); + op = (buf[HEAD + 34] >> 3) & 3; + return op; +} + +/* Write over the extra field contents, marking the operation as op. Use fsync + to assure that the device is written to, and in the requested order. This + operation, and only this operation, is assumed to be atomic in order to + assure that the log is recoverable in the event of an interruption at any + point in the process. Return -1 if the write to foo.gz failed. */ +local int log_mark(struct log *log, int op) +{ + int ret; + unsigned char ext[EXTRA]; + + PUT8(ext, log->first); + PUT8(ext + 8, log->last); + PUT4(ext + 16, log->ccrc); + PUT4(ext + 20, log->clen); + PUT4(ext + 24, log->tcrc); + PUT4(ext + 28, log->tlen); + PUT2(ext + 32, log->stored); + ext[34] = log->back - 3 + (op << 3); + fsync(log->fd); + ret = lseek(log->fd, HEAD, SEEK_SET) < 0 || + write(log->fd, ext, EXTRA) != EXTRA ? -1 : 0; + fsync(log->fd); + return ret; +} + +/* Rewrite the last block header bits and subsequent zero bits to get to a byte + boundary, setting the last block bit if last is true, and then write the + remainder of the stored block header (length and one's complement). Leave + the file pointer after the end of the last stored block data. Return -1 if + there is a read or write failure on the foo.gz file */ +local int log_last(struct log *log, int last) +{ + int back, len, mask; + unsigned char buf[6]; + + /* determine the locations of the bytes and bits to modify */ + back = log->last == log->first ? log->back : 8; + len = back > 8 ? 2 : 1; /* bytes back from log->last */ + mask = 0x80 >> ((back - 1) & 7); /* mask for block last-bit */ + + /* get the byte to modify (one or two back) into buf[0] -- don't need to + read the byte if the last-bit is eight bits back, since in that case + the entire byte will be modified */ + buf[0] = 0; + if (back != 8 && (lseek(log->fd, log->last - len, SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1)) + return -1; + + /* change the last-bit of the last stored block as requested -- note + that all bits above the last-bit are set to zero, per the type bits + of a stored block being 00 and per the convention that the bits to + bring the stream to a byte boundary are also zeros */ + buf[1] = 0; + buf[2 - len] = (*buf & (mask - 1)) + (last ? mask : 0); + + /* write the modified stored block header and lengths, move the file + pointer to after the last stored block data */ + PUT2(buf + 2, log->stored); + PUT2(buf + 4, log->stored ^ 0xffff); + return lseek(log->fd, log->last - len, SEEK_SET) < 0 || + write(log->fd, buf + 2 - len, len + 4) != len + 4 || + lseek(log->fd, log->stored, SEEK_CUR) < 0 ? -1 : 0; +} + +/* Append len bytes from data to the locked and open log file. len may be zero + if recovering and no .add file was found. In that case, the previous state + of the foo.gz file is restored. The data is appended uncompressed in + deflate stored blocks. Return -1 if there was an error reading or writing + the foo.gz file. */ +local int log_append(struct log *log, unsigned char *data, size_t len) +{ + uint put; + off_t end; + unsigned char buf[8]; + + /* set the last block last-bit and length, in case recovering an + interrupted append, then position the file pointer to append to the + block */ + if (log_last(log, 1)) + return -1; + + /* append, adding stored blocks and updating the offset of the last stored + block as needed, and update the total crc and length */ + while (len) { + /* append as much as we can to the last block */ + put = (MAX_STORE << 10) - log->stored; + if (put > len) + put = (uint)len; + if (put) { + if (write(log->fd, data, put) != put) + return -1; + BAIL(1); + log->tcrc = crc32(log->tcrc, data, put); + log->tlen += put; + log->stored += put; + data += put; + len -= put; + } + + /* if we need to, add a new empty stored block */ + if (len) { + /* mark current block as not last */ + if (log_last(log, 0)) + return -1; + + /* point to new, empty stored block */ + log->last += 4 + log->stored + 1; + log->stored = 0; + } + + /* mark last block as last, update its length */ + if (log_last(log, 1)) + return -1; + BAIL(2); + } + + /* write the new crc and length trailer, and truncate just in case (could + be recovering from partial append with a missing foo.add file) */ + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + + /* write the extra field, marking the log file as done, delete .add file */ + if (log_mark(log, NO_OP)) + return -1; + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + return 0; +} + +/* Replace the foo.dict file with the foo.temp file. Also delete the foo.add + file, since the compress operation may have been interrupted before that was + done. Returns 1 if memory could not be allocated, or -1 if reading or + writing foo.gz fails, or if the rename fails for some reason other than + foo.temp not existing. foo.temp not existing is a permitted error, since + the replace operation may have been interrupted after the rename is done, + but before foo.gz is marked as complete. */ +local int log_replace(struct log *log) +{ + int ret; + char *dest; + + /* delete foo.add file */ + strcpy(log->end, ".add"); + unlink(log->path); /* ignore error, since may not exist */ + BAIL(3); + + /* rename foo.name to foo.dict, replacing foo.dict if it exists */ + strcpy(log->end, ".dict"); + dest = malloc(strlen(log->path) + 1); + if (dest == NULL) + return -2; + strcpy(dest, log->path); + strcpy(log->end, ".temp"); + ret = rename(log->path, dest); + free(dest); + if (ret && errno != ENOENT) + return -1; + BAIL(4); + + /* mark the foo.gz file as done */ + return log_mark(log, NO_OP); +} + +/* Compress the len bytes at data and append the compressed data to the + foo.gz deflate data immediately after the previous compressed data. This + overwrites the previous uncompressed data, which was stored in foo.add + and is the data provided in data[0..len-1]. If this operation is + interrupted, it picks up at the start of this routine, with the foo.add + file read in again. If there is no data to compress (len == 0), then we + simply terminate the foo.gz file after the previously compressed data, + appending a final empty stored block and the gzip trailer. Return -1 if + reading or writing the log.gz file failed, or -2 if there was a memory + allocation failure. */ +local int log_compress(struct log *log, unsigned char *data, size_t len) +{ + int fd; + uint got, max; + ssize_t dict; + off_t end; + z_stream strm; + unsigned char buf[DICT]; + + /* compress and append compressed data */ + if (len) { + /* set up for deflate, allocating memory */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -15, 8, + Z_DEFAULT_STRATEGY) != Z_OK) + return -2; + + /* read in dictionary (last 32K of data that was compressed) */ + strcpy(log->end, ".dict"); + fd = open(log->path, O_RDONLY, 0); + if (fd >= 0) { + dict = read(fd, buf, DICT); + close(fd); + if (dict < 0) { + deflateEnd(&strm); + return -1; + } + if (dict) + deflateSetDictionary(&strm, buf, (uint)dict); + } + log_touch(log); + + /* prime deflate with last bits of previous block, position write + pointer to write those bits and overwrite what follows */ + if (lseek(log->fd, log->first - (log->back > 8 ? 2 : 1), + SEEK_SET) < 0 || + read(log->fd, buf, 1) != 1 || lseek(log->fd, -1, SEEK_CUR) < 0) { + deflateEnd(&strm); + return -1; + } + deflatePrime(&strm, (8 - log->back) & 7, *buf); + + /* compress, finishing with a partial non-last empty static block */ + strm.next_in = data; + max = (((uint)0 - 1) >> 1) + 1; /* in case int smaller than size_t */ + do { + strm.avail_in = len > max ? max : (uint)len; + len -= strm.avail_in; + do { + strm.avail_out = DICT; + strm.next_out = buf; + deflate(&strm, len ? Z_NO_FLUSH : Z_PARTIAL_FLUSH); + got = DICT - strm.avail_out; + if (got && write(log->fd, buf, got) != got) { + deflateEnd(&strm); + return -1; + } + log_touch(log); + } while (strm.avail_out == 0); + } while (len); + deflateEnd(&strm); + BAIL(5); + + /* find start of empty static block -- scanning backwards the first one + bit is the second bit of the block, if the last byte is zero, then + we know the byte before that has a one in the top bit, since an + empty static block is ten bits long */ + if ((log->first = lseek(log->fd, -1, SEEK_CUR)) < 0 || + read(log->fd, buf, 1) != 1) + return -1; + log->first++; + if (*buf) { + log->back = 1; + while ((*buf & ((uint)1 << (8 - log->back++))) == 0) + ; /* guaranteed to terminate, since *buf != 0 */ + } + else + log->back = 10; + + /* update compressed crc and length */ + log->ccrc = log->tcrc; + log->clen = log->tlen; + } + else { + /* no data to compress -- fix up existing gzip stream */ + log->tcrc = log->ccrc; + log->tlen = log->clen; + } + + /* complete and truncate gzip stream */ + log->last = log->first; + log->stored = 0; + PUT4(buf, log->tcrc); + PUT4(buf + 4, log->tlen); + if (log_last(log, 1) || write(log->fd, buf, 8) != 8 || + (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end)) + return -1; + BAIL(6); + + /* mark as being in the replace operation */ + if (log_mark(log, REPLACE_OP)) + return -1; + + /* execute the replace operation and mark the file as done */ + return log_replace(log); +} + +/* log a repair record to the .repairs file */ +local void log_log(struct log *log, int op, char *record) +{ + time_t now; + FILE *rec; + + now = time(NULL); + strcpy(log->end, ".repairs"); + rec = fopen(log->path, "a"); + if (rec == NULL) + return; + fprintf(rec, "%.24s %s recovery: %s\n", ctime(&now), op == APPEND_OP ? + "append" : (op == COMPRESS_OP ? "compress" : "replace"), record); + fclose(rec); + return; +} + +/* Recover the interrupted operation op. First read foo.add for recovering an + append or compress operation. Return -1 if there was an error reading or + writing foo.gz or reading an existing foo.add, or -2 if there was a memory + allocation failure. */ +local int log_recover(struct log *log, int op) +{ + int fd, ret = 0; + unsigned char *data = NULL; + size_t len = 0; + struct stat st; + + /* log recovery */ + log_log(log, op, "start"); + + /* load foo.add file if expected and present */ + if (op == APPEND_OP || op == COMPRESS_OP) { + strcpy(log->end, ".add"); + if (stat(log->path, &st) == 0 && st.st_size) { + len = (size_t)(st.st_size); + if (len != st.st_size || (data = malloc(st.st_size)) == NULL) { + log_log(log, op, "allocation failure"); + return -2; + } + if ((fd = open(log->path, O_RDONLY, 0)) < 0) { + log_log(log, op, ".add file read failure"); + return -1; + } + ret = read(fd, data, len) != len; + close(fd); + if (ret) { + log_log(log, op, ".add file read failure"); + return -1; + } + log_log(log, op, "loaded .add file"); + } + else + log_log(log, op, "missing .add file!"); + } + + /* recover the interrupted operation */ + switch (op) { + case APPEND_OP: + ret = log_append(log, data, len); + break; + case COMPRESS_OP: + ret = log_compress(log, data, len); + break; + case REPLACE_OP: + ret = log_replace(log); + } + + /* log status */ + log_log(log, op, ret ? "failure" : "complete"); + + /* clean up */ + if (data != NULL) + free(data); + return ret; +} + +/* Close the foo.gz file (if open) and release the lock. */ +local void log_close(struct log *log) +{ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + log_unlock(log); +} + +/* Open foo.gz, verify the header, and load the extra field contents, after + first creating the foo.lock file to gain exclusive access to the foo.* + files. If foo.gz does not exist or is empty, then write the initial header, + extra, and body content of an empty foo.gz log file. If there is an error + creating the lock file due to access restrictions, or an error reading or + writing the foo.gz file, or if the foo.gz file is not a proper log file for + this object (e.g. not a gzip file or does not contain the expected extra + field), then return true. If there is an error, the lock is released. + Otherwise, the lock is left in place. */ +local int log_open(struct log *log) +{ + int op; + + /* release open file resource if left over -- can occur if lock lost + between gzlog_open() and gzlog_write() */ + if (log->fd >= 0) + close(log->fd); + log->fd = -1; + + /* negotiate exclusive access */ + if (log_lock(log) < 0) + return -1; + + /* open the log file, foo.gz */ + strcpy(log->end, ".gz"); + log->fd = open(log->path, O_RDWR | O_CREAT, 0644); + if (log->fd < 0) { + log_close(log); + return -1; + } + + /* if new, initialize foo.gz with an empty log, delete old dictionary */ + if (lseek(log->fd, 0, SEEK_END) == 0) { + if (write(log->fd, log_gzhead, HEAD) != HEAD || + write(log->fd, log_gzext, EXTRA) != EXTRA || + write(log->fd, log_gzbody, BODY) != BODY) { + log_close(log); + return -1; + } + strcpy(log->end, ".dict"); + unlink(log->path); + } + + /* verify log file and load extra field information */ + if ((op = log_head(log)) < 0) { + log_close(log); + return -1; + } + + /* check for interrupted process and if so, recover */ + if (op != NO_OP && log_recover(log, op)) { + log_close(log); + return -1; + } + + /* touch the lock file to prevent another process from grabbing it */ + log_touch(log); + return 0; +} + +/* See gzlog.h for the description of the external methods below */ +gzlog *gzlog_open(char *path) +{ + size_t n; + struct log *log; + + /* check arguments */ + if (path == NULL || *path == 0) + return NULL; + + /* allocate and initialize log structure */ + log = malloc(sizeof(struct log)); + if (log == NULL) + return NULL; + strcpy(log->id, LOGID); + log->fd = -1; + + /* save path and end of path for name construction */ + n = strlen(path); + log->path = malloc(n + 9); /* allow for ".repairs" */ + if (log->path == NULL) { + free(log); + return NULL; + } + strcpy(log->path, path); + log->end = log->path + n; + + /* gain exclusive access and verify log file -- may perform a + recovery operation if needed */ + if (log_open(log)) { + free(log->path); + free(log); + return NULL; + } + + /* return pointer to log structure */ + return log; +} + +/* gzlog_compress() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_compress(gzlog *logd) +{ + int fd, ret; + uint block; + size_t len, next; + unsigned char *data, buf[5]; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID) || len < 0) + return -3; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create space for uncompressed data */ + len = ((size_t)(log->last - log->first) & ~(((size_t)1 << 10) - 1)) + + log->stored; + if ((data = malloc(len)) == NULL) + return -2; + + /* do statement here is just a cheap trick for error handling */ + do { + /* read in the uncompressed data */ + if (lseek(log->fd, log->first - 1, SEEK_SET) < 0) + break; + next = 0; + while (next < len) { + if (read(log->fd, buf, 5) != 5) + break; + block = PULL2(buf + 1); + if (next + block > len || + read(log->fd, (char *)data + next, block) != block) + break; + next += block; + } + if (lseek(log->fd, 0, SEEK_CUR) != log->last + 4 + log->stored) + break; + log_touch(log); + + /* write the uncompressed data to the .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + ret = write(fd, data, len) != len; + if (ret | close(fd)) + break; + log_touch(log); + + /* write the dictionary for the next compress to the .temp file */ + strcpy(log->end, ".temp"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + break; + next = DICT > len ? len : DICT; + ret = write(fd, (char *)data + len - next, next) != next; + if (ret | close(fd)) + break; + log_touch(log); + + /* roll back to compressed data, mark the compress in progress */ + log->last = log->first; + log->stored = 0; + if (log_mark(log, COMPRESS_OP)) + break; + BAIL(7); + + /* compress and append the data (clears mark) */ + ret = log_compress(log, data, len); + free(data); + return ret; + } while (0); + + /* broke out of do above on i/o error */ + free(data); + return -1; +} + +/* gzlog_write() return values: + 0: all good + -1: file i/o error (usually access issue) + -2: memory allocation failure + -3: invalid log pointer argument */ +int gzlog_write(gzlog *logd, void *data, size_t len) +{ + int fd, ret; + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID) || len < 0) + return -3; + if (data == NULL || len == 0) + return 0; + + /* see if we lost the lock -- if so get it again and reload the extra + field information (it probably changed), recover last operation if + necessary */ + if (log_check(log) && log_open(log)) + return -1; + + /* create and write .add file */ + strcpy(log->end, ".add"); + fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + return -1; + ret = write(fd, data, len) != len; + if (ret | close(fd)) + return -1; + log_touch(log); + + /* mark log file with append in progress */ + if (log_mark(log, APPEND_OP)) + return -1; + BAIL(8); + + /* append data (clears mark) */ + if (log_append(log, data, len)) + return -1; + + /* check to see if it's time to compress -- if not, then done */ + if (((log->last - log->first) >> 10) + (log->stored >> 10) < TRIGGER) + return 0; + + /* time to compress */ + return gzlog_compress(log); +} + +/* gzlog_close() return values: + 0: ok + -3: invalid log pointer argument */ +int gzlog_close(gzlog *logd) +{ + struct log *log = logd; + + /* check arguments */ + if (log == NULL || strcmp(log->id, LOGID)) + return -3; + + /* close the log file and release the lock */ + log_close(log); + + /* free structure and return */ + if (log->path != NULL) + free(log->path); + strcpy(log->id, "bad"); + free(log); + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzlog.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzlog.h new file mode 100644 index 0000000000..c46142673d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/gzlog.h @@ -0,0 +1,89 @@ +/* gzlog.h + Copyright (C) 2004, 2008 Mark Adler, all rights reserved + version 2.0, 25 Apr 2008 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Mark Adler madler@alumni.caltech.edu + */ + +/* Version History: + 1.0 26 Nov 2004 First version + 2.0 25 Apr 2008 Complete redesign for recovery of interrupted operations + Interface changed slightly in that now path is a prefix + Compression now occurs as needed during gzlog_write() + gzlog_write() now always leaves the log file as valid gzip + */ + +/* + The gzlog object allows writing short messages to a gzipped log file, + opening the log file locked for small bursts, and then closing it. The log + object works by appending stored (uncompressed) data to the gzip file until + 1 MB has been accumulated. At that time, the stored data is compressed, and + replaces the uncompressed data in the file. The log file is truncated to + its new size at that time. After each write operation, the log file is a + valid gzip file that can decompressed to recover what was written. + + The gzlog operations can be interupted at any point due to an application or + system crash, and the log file will be recovered the next time the log is + opened with gzlog_open(). + */ + +#ifndef GZLOG_H +#define GZLOG_H + +/* gzlog object type */ +typedef void gzlog; + +/* Open a gzlog object, creating the log file if it does not exist. Return + NULL on error. Note that gzlog_open() could take a while to complete if it + has to wait to verify that a lock is stale (possibly for five minutes), or + if there is significant contention with other instantiations of this object + when locking the resource. path is the prefix of the file names created by + this object. If path is "foo", then the log file will be "foo.gz", and + other auxiliary files will be created and destroyed during the process: + "foo.dict" for a compression dictionary, "foo.temp" for a temporary (next) + dictionary, "foo.add" for data being added or compressed, "foo.lock" for the + lock file, and "foo.repairs" to log recovery operations performed due to + interrupted gzlog operations. A gzlog_open() followed by a gzlog_close() + will recover a previously interrupted operation, if any. */ +gzlog *gzlog_open(char *path); + +/* Write to a gzlog object. Return zero on success, -1 if there is a file i/o + error on any of the gzlog files (this should not happen if gzlog_open() + succeeded, unless the device has run out of space or leftover auxiliary + files have permissions or ownership that prevent their use), -2 if there is + a memory allocation failure, or -3 if the log argument is invalid (e.g. if + it was not created by gzlog_open()). This function will write data to the + file uncompressed, until 1 MB has been accumulated, at which time that data + will be compressed. The log file will be a valid gzip file upon successful + return. */ +int gzlog_write(gzlog *log, void *data, size_t len); + +/* Force compression of any uncompressed data in the log. This should be used + sparingly, if at all. The main application would be when a log file will + not be appended to again. If this is used to compress frequently while + appending, it will both significantly increase the execution time and + reduce the compression ratio. The return codes are the same as for + gzlog_write(). */ +int gzlog_compress(gzlog *log); + +/* Close a gzlog object. Return zero on success, -3 if the log argument is + invalid. The log object is freed, and so cannot be referenced again. */ +int gzlog_close(gzlog *log); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zlib_how.html b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zlib_how.html new file mode 100644 index 0000000000..444ff1c9a3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zlib_how.html @@ -0,0 +1,545 @@ + + + + +zlib Usage Example + + + +

zlib Usage Example

+We often get questions about how the deflate() and inflate() functions should be used. +Users wonder when they should provide more input, when they should use more output, +what to do with a Z_BUF_ERROR, how to make sure the process terminates properly, and +so on. So for those who have read zlib.h (a few times), and +would like further edification, below is an annotated example in C of simple routines to compress and decompress +from an input file to an output file using deflate() and inflate() respectively. The +annotations are interspersed between lines of the code. So please read between the lines. +We hope this helps explain some of the intricacies of zlib. +

+Without further adieu, here is the program zpipe.c: +


+/* zpipe.c: example of proper use of zlib's inflate() and deflate()
+   Not copyrighted -- provided to the public domain
+   Version 1.4  11 December 2005  Mark Adler */
+
+/* Version history:
+   1.0  30 Oct 2004  First version
+   1.1   8 Nov 2004  Add void casting for unused return values
+                     Use switch statement for inflate() return values
+   1.2   9 Nov 2004  Add assertions to document zlib guarantees
+   1.3   6 Apr 2005  Remove incorrect assertion in inf()
+   1.4  11 Dec 2005  Add hack to avoid MSDOS end-of-line conversions
+                     Avoid some compiler warnings for input and output buffers
+ */
+
+We now include the header files for the required definitions. From +stdio.h we use fopen(), fread(), fwrite(), +feof(), ferror(), and fclose() for file i/o, and +fputs() for error messages. From string.h we use +strcmp() for command line argument processing. +From assert.h we use the assert() macro. +From zlib.h +we use the basic compression functions deflateInit(), +deflate(), and deflateEnd(), and the basic decompression +functions inflateInit(), inflate(), and +inflateEnd(). +

+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include "zlib.h"
+
+This is an ugly hack required to avoid corruption of the input and output data on +Windows/MS-DOS systems. Without this, those systems would assume that the input and output +files are text, and try to convert the end-of-line characters from one standard to +another. That would corrupt binary data, and in particular would render the compressed data unusable. +This sets the input and output to binary which suppresses the end-of-line conversions. +SET_BINARY_MODE() will be used later on stdin and stdout, at the beginning of main(). +

+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+#  include <fcntl.h>
+#  include <io.h>
+#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+#  define SET_BINARY_MODE(file)
+#endif
+
+CHUNK is simply the buffer size for feeding data to and pulling data +from the zlib routines. Larger buffer sizes would be more efficient, +especially for inflate(). If the memory is available, buffers sizes +on the order of 128K or 256K bytes should be used. +

+#define CHUNK 16384
+
+The def() routine compresses data from an input file to an output file. The output data +will be in the zlib format, which is different from the gzip or zip +formats. The zlib format has a very small header of only two bytes to identify it as +a zlib stream and to provide decoding information, and a four-byte trailer with a fast +check value to verify the integrity of the uncompressed data after decoding. +

+/* Compress from file source to file dest until EOF on source.
+   def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_STREAM_ERROR if an invalid compression
+   level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
+   version of the library linked do not match, or Z_ERRNO if there is
+   an error reading or writing the files. */
+int def(FILE *source, FILE *dest, int level)
+{
+
+Here are the local variables for def(). ret will be used for zlib +return codes. flush will keep track of the current flushing state for deflate(), +which is either no flushing, or flush to completion after the end of the input file is reached. +have is the amount of data returned from deflate(). The strm structure +is used to pass information to and from the zlib routines, and to maintain the +deflate() state. in and out are the input and output buffers for +deflate(). +

+    int ret, flush;
+    unsigned have;
+    z_stream strm;
+    unsigned char in[CHUNK];
+    unsigned char out[CHUNK];
+
+The first thing we do is to initialize the zlib state for compression using +deflateInit(). This must be done before the first use of deflate(). +The zalloc, zfree, and opaque fields in the strm +structure must be initialized before calling deflateInit(). Here they are +set to the zlib constant Z_NULL to request that zlib use +the default memory allocation routines. An application may also choose to provide +custom memory allocation routines here. deflateInit() will allocate on the +order of 256K bytes for the internal state. +(See zlib Technical Details.) +

+deflateInit() is called with a pointer to the structure to be initialized and +the compression level, which is an integer in the range of -1 to 9. Lower compression +levels result in faster execution, but less compression. Higher levels result in +greater compression, but slower execution. The zlib constant Z_DEFAULT_COMPRESSION, +equal to -1, +provides a good compromise between compression and speed and is equivalent to level 6. +Level 0 actually does no compression at all, and in fact expands the data slightly to produce +the zlib format (it is not a byte-for-byte copy of the input). +More advanced applications of zlib +may use deflateInit2() here instead. Such an application may want to reduce how +much memory will be used, at some price in compression. Or it may need to request a +gzip header and trailer instead of a zlib header and trailer, or raw +encoding with no header or trailer at all. +

+We must check the return value of deflateInit() against the zlib constant +Z_OK to make sure that it was able to +allocate memory for the internal state, and that the provided arguments were valid. +deflateInit() will also check that the version of zlib that the zlib.h +file came from matches the version of zlib actually linked with the program. This +is especially important for environments in which zlib is a shared library. +

+Note that an application can initialize multiple, independent zlib streams, which can +operate in parallel. The state information maintained in the structure allows the zlib +routines to be reentrant. +


+    /* allocate deflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    ret = deflateInit(&strm, level);
+    if (ret != Z_OK)
+        return ret;
+
+With the pleasantries out of the way, now we can get down to business. The outer do-loop +reads all of the input file and exits at the bottom of the loop once end-of-file is reached. +This loop contains the only call of deflate(). So we must make sure that all of the +input data has been processed and that all of the output data has been generated and consumed +before we fall out of the loop at the bottom. +

+    /* compress until end of file */
+    do {
+
+We start off by reading data from the input file. The number of bytes read is put directly +into avail_in, and a pointer to those bytes is put into next_in. We also +check to see if end-of-file on the input has been reached. If we are at the end of file, then flush is set to the +zlib constant Z_FINISH, which is later passed to deflate() to +indicate that this is the last chunk of input data to compress. We need to use feof() +to check for end-of-file as opposed to seeing if fewer than CHUNK bytes have been read. The +reason is that if the input file length is an exact multiple of CHUNK, we will miss +the fact that we got to the end-of-file, and not know to tell deflate() to finish +up the compressed stream. If we are not yet at the end of the input, then the zlib +constant Z_NO_FLUSH will be passed to deflate to indicate that we are still +in the middle of the uncompressed data. +

+If there is an error in reading from the input file, the process is aborted with +deflateEnd() being called to free the allocated zlib state before returning +the error. We wouldn't want a memory leak, now would we? deflateEnd() can be called +at any time after the state has been initialized. Once that's done, deflateInit() (or +deflateInit2()) would have to be called to start a new compression process. There is +no point here in checking the deflateEnd() return code. The deallocation can't fail. +


+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)deflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
+        strm.next_in = in;
+
+The inner do-loop passes our chunk of input data to deflate(), and then +keeps calling deflate() until it is done producing output. Once there is no more +new output, deflate() is guaranteed to have consumed all of the input, i.e., +avail_in will be zero. +

+        /* run deflate() on input until output buffer not full, finish
+           compression if all of source has been read in */
+        do {
+
+Output space is provided to deflate() by setting avail_out to the number +of available output bytes and next_out to a pointer to that space. +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we call the compression engine itself, deflate(). It takes as many of the +avail_in bytes at next_in as it can process, and writes as many as +avail_out bytes to next_out. Those counters and pointers are then +updated past the input data consumed and the output data written. It is the amount of +output space available that may limit how much input is consumed. +Hence the inner loop to make sure that +all of the input is consumed by providing more output space each time. Since avail_in +and next_in are updated by deflate(), we don't have to mess with those +between deflate() calls until it's all used up. +

+The parameters to deflate() are a pointer to the strm structure containing +the input and output information and the internal compression engine state, and a parameter +indicating whether and how to flush data to the output. Normally deflate will consume +several K bytes of input data before producing any output (except for the header), in order +to accumulate statistics on the data for optimum compression. It will then put out a burst of +compressed data, and proceed to consume more input before the next burst. Eventually, +deflate() +must be told to terminate the stream, complete the compression with provided input data, and +write out the trailer check value. deflate() will continue to compress normally as long +as the flush parameter is Z_NO_FLUSH. Once the Z_FINISH parameter is provided, +deflate() will begin to complete the compressed output stream. However depending on how +much output space is provided, deflate() may have to be called several times until it +has provided the complete compressed stream, even after it has consumed all of the input. The flush +parameter must continue to be Z_FINISH for those subsequent calls. +

+There are other values of the flush parameter that are used in more advanced applications. You can +force deflate() to produce a burst of output that encodes all of the input data provided +so far, even if it wouldn't have otherwise, for example to control data latency on a link with +compressed data. You can also ask that deflate() do that as well as erase any history up to +that point so that what follows can be decompressed independently, for example for random access +applications. Both requests will degrade compression by an amount depending on how often such +requests are made. +

+deflate() has a return value that can indicate errors, yet we do not check it here. Why +not? Well, it turns out that deflate() can do no wrong here. Let's go through +deflate()'s return values and dispense with them one by one. The possible values are +Z_OK, Z_STREAM_END, Z_STREAM_ERROR, or Z_BUF_ERROR. Z_OK +is, well, ok. Z_STREAM_END is also ok and will be returned for the last call of +deflate(). This is already guaranteed by calling deflate() with Z_FINISH +until it has no more output. Z_STREAM_ERROR is only possible if the stream is not +initialized properly, but we did initialize it properly. There is no harm in checking for +Z_STREAM_ERROR here, for example to check for the possibility that some +other part of the application inadvertently clobbered the memory containing the zlib state. +Z_BUF_ERROR will be explained further below, but +suffice it to say that this is simply an indication that deflate() could not consume +more input or produce more output. deflate() can be called again with more output space +or more available input, which it will be in this code. +


+            ret = deflate(&strm, flush);    /* no bad return value */
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+
+Now we compute how much output deflate() provided on the last call, which is the +difference between how much space was provided before the call, and how much output space +is still available after the call. Then that data, if any, is written to the output file. +We can then reuse the output buffer for the next call of deflate(). Again if there +is a file i/o error, we call deflateEnd() before returning to avoid a memory leak. +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)deflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop is repeated until the last deflate() call fails to fill the +provided output buffer. Then we know that deflate() has done as much as it can with +the provided input, and that all of that input has been consumed. We can then fall out of this +loop and reuse the input buffer. +

+The way we tell that deflate() has no more output is by seeing that it did not fill +the output buffer, leaving avail_out greater than zero. However suppose that +deflate() has no more output, but just so happened to exactly fill the output buffer! +avail_out is zero, and we can't tell that deflate() has done all it can. +As far as we know, deflate() +has more output for us. So we call it again. But now deflate() produces no output +at all, and avail_out remains unchanged as CHUNK. That deflate() call +wasn't able to do anything, either consume input or produce output, and so it returns +Z_BUF_ERROR. (See, I told you I'd cover this later.) However this is not a problem at +all. Now we finally have the desired indication that deflate() is really done, +and so we drop out of the inner loop to provide more input to deflate(). +

+With flush set to Z_FINISH, this final set of deflate() calls will +complete the output stream. Once that is done, subsequent calls of deflate() would return +Z_STREAM_ERROR if the flush parameter is not Z_FINISH, and do no more processing +until the state is reinitialized. +

+Some applications of zlib have two loops that call deflate() +instead of the single inner loop we have here. The first loop would call +without flushing and feed all of the data to deflate(). The second loop would call +deflate() with no more +data and the Z_FINISH parameter to complete the process. As you can see from this +example, that can be avoided by simply keeping track of the current flush state. +


+        } while (strm.avail_out == 0);
+        assert(strm.avail_in == 0);     /* all input will be used */
+
+Now we check to see if we have already processed all of the input file. That information was +saved in the flush variable, so we see if that was set to Z_FINISH. If so, +then we're done and we fall out of the outer loop. We're guaranteed to get Z_STREAM_END +from the last deflate() call, since we ran it until the last chunk of input was +consumed and all of the output was generated. +

+        /* done when last data in file processed */
+    } while (flush != Z_FINISH);
+    assert(ret == Z_STREAM_END);        /* stream will be complete */
+
+The process is complete, but we still need to deallocate the state to avoid a memory leak +(or rather more like a memory hemorrhage if you didn't do this). Then +finally we can return with a happy return value. +

+    /* clean up and return */
+    (void)deflateEnd(&strm);
+    return Z_OK;
+}
+
+Now we do the same thing for decompression in the inf() routine. inf() +decompresses what is hopefully a valid zlib stream from the input file and writes the +uncompressed data to the output file. Much of the discussion above for def() +applies to inf() as well, so the discussion here will focus on the differences between +the two. +

+/* Decompress from file source to file dest until stream ends or EOF.
+   inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+   allocated for processing, Z_DATA_ERROR if the deflate data is
+   invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
+   the version of the library linked do not match, or Z_ERRNO if there
+   is an error reading or writing the files. */
+int inf(FILE *source, FILE *dest)
+{
+
+The local variables have the same functionality as they do for def(). The +only difference is that there is no flush variable, since inflate() +can tell from the zlib stream itself when the stream is complete. +

+    int ret;
+    unsigned have;
+    z_stream strm;
+    unsigned char in[CHUNK];
+    unsigned char out[CHUNK];
+
+The initialization of the state is the same, except that there is no compression level, +of course, and two more elements of the structure are initialized. avail_in +and next_in must be initialized before calling inflateInit(). This +is because the application has the option to provide the start of the zlib stream in +order for inflateInit() to have access to information about the compression +method to aid in memory allocation. In the current implementation of zlib +(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of +inflate() anyway. However those fields must be initialized since later versions +of zlib that provide more compression methods may take advantage of this interface. +In any case, no decompression is performed by inflateInit(), so the +avail_out and next_out fields do not need to be initialized before calling. +

+Here avail_in is set to zero and next_in is set to Z_NULL to +indicate that no input data is being provided. +


+    /* allocate inflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    ret = inflateInit(&strm);
+    if (ret != Z_OK)
+        return ret;
+
+The outer do-loop decompresses input until inflate() indicates +that it has reached the end of the compressed data and has produced all of the uncompressed +output. This is in contrast to def() which processes all of the input file. +If end-of-file is reached before the compressed data self-terminates, then the compressed +data is incomplete and an error is returned. +

+    /* decompress until deflate stream ends or end of file */
+    do {
+
+We read input data and set the strm structure accordingly. If we've reached the +end of the input file, then we leave the outer loop and report an error, since the +compressed data is incomplete. Note that we may read more data than is eventually consumed +by inflate(), if the input file continues past the zlib stream. +For applications where zlib streams are embedded in other data, this routine would +need to be modified to return the unused data, or at least indicate how much of the input +data was not used, so the application would know where to pick up after the zlib stream. +

+        strm.avail_in = fread(in, 1, CHUNK, source);
+        if (ferror(source)) {
+            (void)inflateEnd(&strm);
+            return Z_ERRNO;
+        }
+        if (strm.avail_in == 0)
+            break;
+        strm.next_in = in;
+
+The inner do-loop has the same function it did in def(), which is to +keep calling inflate() until has generated all of the output it can with the +provided input. +

+        /* run inflate() on input until output buffer not full */
+        do {
+
+Just like in def(), the same output space is provided for each call of inflate(). +

+            strm.avail_out = CHUNK;
+            strm.next_out = out;
+
+Now we run the decompression engine itself. There is no need to adjust the flush parameter, since +the zlib format is self-terminating. The main difference here is that there are +return values that we need to pay attention to. Z_DATA_ERROR +indicates that inflate() detected an error in the zlib compressed data format, +which means that either the data is not a zlib stream to begin with, or that the data was +corrupted somewhere along the way since it was compressed. The other error to be processed is +Z_MEM_ERROR, which can occur since memory allocation is deferred until inflate() +needs it, unlike deflate(), whose memory is allocated at the start by deflateInit(). +

+Advanced applications may use +deflateSetDictionary() to prime deflate() with a set of likely data to improve the +first 32K or so of compression. This is noted in the zlib header, so inflate() +requests that that dictionary be provided before it can start to decompress. Without the dictionary, +correct decompression is not possible. For this routine, we have no idea what the dictionary is, +so the Z_NEED_DICT indication is converted to a Z_DATA_ERROR. +

+inflate() can also return Z_STREAM_ERROR, which should not be possible here, +but could be checked for as noted above for def(). Z_BUF_ERROR does not need to be +checked for here, for the same reasons noted for def(). Z_STREAM_END will be +checked for later. +


+            ret = inflate(&strm, Z_NO_FLUSH);
+            assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
+            switch (ret) {
+            case Z_NEED_DICT:
+                ret = Z_DATA_ERROR;     /* and fall through */
+            case Z_DATA_ERROR:
+            case Z_MEM_ERROR:
+                (void)inflateEnd(&strm);
+                return ret;
+            }
+
+The output of inflate() is handled identically to that of deflate(). +

+            have = CHUNK - strm.avail_out;
+            if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+                (void)inflateEnd(&strm);
+                return Z_ERRNO;
+            }
+
+The inner do-loop ends when inflate() has no more output as indicated +by not filling the output buffer, just as for deflate(). In this case, we cannot +assert that strm.avail_in will be zero, since the deflate stream may end before the file +does. +

+        } while (strm.avail_out == 0);
+
+The outer do-loop ends when inflate() reports that it has reached the +end of the input zlib stream, has completed the decompression and integrity +check, and has provided all of the output. This is indicated by the inflate() +return value Z_STREAM_END. The inner loop is guaranteed to leave ret +equal to Z_STREAM_END if the last chunk of the input file read contained the end +of the zlib stream. So if the return value is not Z_STREAM_END, the +loop continues to read more input. +

+        /* done when inflate() says it's done */
+    } while (ret != Z_STREAM_END);
+
+At this point, decompression successfully completed, or we broke out of the loop due to no +more data being available from the input file. If the last inflate() return value +is not Z_STREAM_END, then the zlib stream was incomplete and a data error +is returned. Otherwise, we return with a happy return value. Of course, inflateEnd() +is called first to avoid a memory leak. +

+    /* clean up and return */
+    (void)inflateEnd(&strm);
+    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
+}
+
+That ends the routines that directly use zlib. The following routines make this +a command-line program by running data through the above routines from stdin to +stdout, and handling any errors reported by def() or inf(). +

+zerr() is used to interpret the possible error codes from def() +and inf(), as detailed in their comments above, and print out an error message. +Note that these are only a subset of the possible return values from deflate() +and inflate(). +


+/* report a zlib or i/o error */
+void zerr(int ret)
+{
+    fputs("zpipe: ", stderr);
+    switch (ret) {
+    case Z_ERRNO:
+        if (ferror(stdin))
+            fputs("error reading stdin\n", stderr);
+        if (ferror(stdout))
+            fputs("error writing stdout\n", stderr);
+        break;
+    case Z_STREAM_ERROR:
+        fputs("invalid compression level\n", stderr);
+        break;
+    case Z_DATA_ERROR:
+        fputs("invalid or incomplete deflate data\n", stderr);
+        break;
+    case Z_MEM_ERROR:
+        fputs("out of memory\n", stderr);
+        break;
+    case Z_VERSION_ERROR:
+        fputs("zlib version mismatch!\n", stderr);
+    }
+}
+
+Here is the main() routine used to test def() and inf(). The +zpipe command is simply a compression pipe from stdin to stdout, if +no arguments are given, or it is a decompression pipe if zpipe -d is used. If any other +arguments are provided, no compression or decompression is performed. Instead a usage +message is displayed. Examples are zpipe < foo.txt > foo.txt.z to compress, and +zpipe -d < foo.txt.z > foo.txt to decompress. +

+/* compress or decompress from stdin to stdout */
+int main(int argc, char **argv)
+{
+    int ret;
+
+    /* avoid end-of-line conversions */
+    SET_BINARY_MODE(stdin);
+    SET_BINARY_MODE(stdout);
+
+    /* do compression if no arguments */
+    if (argc == 1) {
+        ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* do decompression if -d specified */
+    else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
+        ret = inf(stdin, stdout);
+        if (ret != Z_OK)
+            zerr(ret);
+        return ret;
+    }
+
+    /* otherwise, report usage */
+    else {
+        fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
+        return 1;
+    }
+}
+
+
+Copyright (c) 2004, 2005 by Mark Adler
Last modified 11 December 2005
+ + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zpipe.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zpipe.c new file mode 100644 index 0000000000..83535d1693 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zpipe.c @@ -0,0 +1,205 @@ +/* zpipe.c: example of proper use of zlib's inflate() and deflate() + Not copyrighted -- provided to the public domain + Version 1.4 11 December 2005 Mark Adler */ + +/* Version history: + 1.0 30 Oct 2004 First version + 1.1 8 Nov 2004 Add void casting for unused return values + Use switch statement for inflate() return values + 1.2 9 Nov 2004 Add assertions to document zlib guarantees + 1.3 6 Apr 2005 Remove incorrect assertion in inf() + 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions + Avoid some compiler warnings for input and output buffers + */ + +#include +#include +#include +#include "zlib.h" + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define CHUNK 16384 + +/* Compress from file source to file dest until EOF on source. + def() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_STREAM_ERROR if an invalid compression + level is supplied, Z_VERSION_ERROR if the version of zlib.h and the + version of the library linked do not match, or Z_ERRNO if there is + an error reading or writing the files. */ +int def(FILE *source, FILE *dest, int level) +{ + int ret, flush; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate deflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + ret = deflateInit(&strm, level); + if (ret != Z_OK) + return ret; + + /* compress until end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + flush = feof(source) ? Z_FINISH : Z_NO_FLUSH; + strm.next_in = in; + + /* run deflate() on input until output buffer not full, finish + compression if all of source has been read in */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = deflate(&strm, flush); /* no bad return value */ + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)deflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + assert(strm.avail_in == 0); /* all input will be used */ + + /* done when last data in file processed */ + } while (flush != Z_FINISH); + assert(ret == Z_STREAM_END); /* stream will be complete */ + + /* clean up and return */ + (void)deflateEnd(&strm); + return Z_OK; +} + +/* Decompress from file source to file dest until stream ends or EOF. + inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be + allocated for processing, Z_DATA_ERROR if the deflate data is + invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and + the version of the library linked do not match, or Z_ERRNO if there + is an error reading or writing the files. */ +int inf(FILE *source, FILE *dest) +{ + int ret; + unsigned have; + z_stream strm; + unsigned char in[CHUNK]; + unsigned char out[CHUNK]; + + /* allocate inflate state */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit(&strm); + if (ret != Z_OK) + return ret; + + /* decompress until deflate stream ends or end of file */ + do { + strm.avail_in = fread(in, 1, CHUNK, source); + if (ferror(source)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + if (strm.avail_in == 0) + break; + strm.next_in = in; + + /* run inflate() on input until output buffer not full */ + do { + strm.avail_out = CHUNK; + strm.next_out = out; + ret = inflate(&strm, Z_NO_FLUSH); + assert(ret != Z_STREAM_ERROR); /* state not clobbered */ + switch (ret) { + case Z_NEED_DICT: + ret = Z_DATA_ERROR; /* and fall through */ + case Z_DATA_ERROR: + case Z_MEM_ERROR: + (void)inflateEnd(&strm); + return ret; + } + have = CHUNK - strm.avail_out; + if (fwrite(out, 1, have, dest) != have || ferror(dest)) { + (void)inflateEnd(&strm); + return Z_ERRNO; + } + } while (strm.avail_out == 0); + + /* done when inflate() says it's done */ + } while (ret != Z_STREAM_END); + + /* clean up and return */ + (void)inflateEnd(&strm); + return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR; +} + +/* report a zlib or i/o error */ +void zerr(int ret) +{ + fputs("zpipe: ", stderr); + switch (ret) { + case Z_ERRNO: + if (ferror(stdin)) + fputs("error reading stdin\n", stderr); + if (ferror(stdout)) + fputs("error writing stdout\n", stderr); + break; + case Z_STREAM_ERROR: + fputs("invalid compression level\n", stderr); + break; + case Z_DATA_ERROR: + fputs("invalid or incomplete deflate data\n", stderr); + break; + case Z_MEM_ERROR: + fputs("out of memory\n", stderr); + break; + case Z_VERSION_ERROR: + fputs("zlib version mismatch!\n", stderr); + } +} + +/* compress or decompress from stdin to stdout */ +int main(int argc, char **argv) +{ + int ret; + + /* avoid end-of-line conversions */ + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + /* do compression if no arguments */ + if (argc == 1) { + ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* do decompression if -d specified */ + else if (argc == 2 && strcmp(argv[1], "-d") == 0) { + ret = inf(stdin, stdout); + if (ret != Z_OK) + zerr(ret); + return ret; + } + + /* otherwise, report usage */ + else { + fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr); + return 1; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zran.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zran.c new file mode 100644 index 0000000000..617a13086f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/examples/zran.c @@ -0,0 +1,404 @@ +/* zran.c -- example of zlib/gzip stream indexing and random access + * Copyright (C) 2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + Version 1.0 29 May 2005 Mark Adler */ + +/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() + for random access of a compressed file. A file containing a zlib or gzip + stream is provided on the command line. The compressed stream is decoded in + its entirety, and an index built with access points about every SPAN bytes + in the uncompressed output. The compressed file is left open, and can then + be read randomly, having to decompress on the average SPAN/2 uncompressed + bytes before getting to the desired block of data. + + An access point can be created at the start of any deflate block, by saving + the starting file offset and bit of that block, and the 32K bytes of + uncompressed data that precede that block. Also the uncompressed offset of + that block is saved to provide a referece for locating a desired starting + point in the uncompressed stream. build_index() works by decompressing the + input zlib or gzip stream a block at a time, and at the end of each block + deciding if enough uncompressed data has gone by to justify the creation of + a new access point. If so, that point is saved in a data structure that + grows as needed to accommodate the points. + + To use the index, an offset in the uncompressed data is provided, for which + the latest accees point at or preceding that offset is located in the index. + The input file is positioned to the specified location in the index, and if + necessary the first few bits of the compressed data is read from the file. + inflate is initialized with those bits and the 32K of uncompressed data, and + the decompression then proceeds until the desired offset in the file is + reached. Then the decompression continues to read the desired uncompressed + data from the file. + + Another approach would be to generate the index on demand. In that case, + requests for random access reads from the compressed data would try to use + the index, but if a read far enough past the end of the index is required, + then further index entries would be generated and added. + + There is some fair bit of overhead to starting inflation for the random + access, mainly copying the 32K byte dictionary. So if small pieces of the + file are being accessed, it would make sense to implement a cache to hold + some lookahead and avoid many calls to extract() for small lengths. + + Another way to build an index would be to use inflateCopy(). That would + not be constrained to have access points at block boundaries, but requires + more memory per access point, and also cannot be saved to file due to the + use of pointers in the state. The approach here allows for storage of the + index in a file. + */ + +#include +#include +#include +#include "zlib.h" + +#define local static + +#define SPAN 1048576L /* desired distance between access points */ +#define WINSIZE 32768U /* sliding window size */ +#define CHUNK 16384 /* file input buffer size */ + +/* access point entry */ +struct point { + off_t out; /* corresponding offset in uncompressed data */ + off_t in; /* offset in input file of first full byte */ + int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ + unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ +}; + +/* access point list */ +struct access { + int have; /* number of list entries filled in */ + int size; /* number of list entries allocated */ + struct point *list; /* allocated list */ +}; + +/* Deallocate an index built by build_index() */ +local void free_index(struct access *index) +{ + if (index != NULL) { + free(index->list); + free(index); + } +} + +/* Add an entry to the access point list. If out of memory, deallocate the + existing list and return NULL. */ +local struct access *addpoint(struct access *index, int bits, + off_t in, off_t out, unsigned left, unsigned char *window) +{ + struct point *next; + + /* if list is empty, create it (start with eight points) */ + if (index == NULL) { + index = malloc(sizeof(struct access)); + if (index == NULL) return NULL; + index->list = malloc(sizeof(struct point) << 3); + if (index->list == NULL) { + free(index); + return NULL; + } + index->size = 8; + index->have = 0; + } + + /* if list is full, make it bigger */ + else if (index->have == index->size) { + index->size <<= 1; + next = realloc(index->list, sizeof(struct point) * index->size); + if (next == NULL) { + free_index(index); + return NULL; + } + index->list = next; + } + + /* fill in entry and increment how many we have */ + next = index->list + index->have; + next->bits = bits; + next->in = in; + next->out = out; + if (left) + memcpy(next->window, window + WINSIZE - left, left); + if (left < WINSIZE) + memcpy(next->window + left, window, WINSIZE - left); + index->have++; + + /* return list, possibly reallocated */ + return index; +} + +/* Make one entire pass through the compressed stream and build an index, with + access points about every span bytes of uncompressed output -- span is + chosen to balance the speed of random access against the memory requirements + of the list, about 32K bytes per access point. Note that data after the end + of the first zlib or gzip stream in the file is ignored. build_index() + returns the number of access points on success (>= 1), Z_MEM_ERROR for out + of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a + file read error. On success, *built points to the resulting index. */ +local int build_index(FILE *in, off_t span, struct access **built) +{ + int ret; + off_t totin, totout; /* our own total counters to avoid 4GB limit */ + off_t last; /* totout value of last access point */ + struct access *index; /* access points being generated */ + z_stream strm; + unsigned char input[CHUNK]; + unsigned char window[WINSIZE]; + + /* initialize inflate */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */ + if (ret != Z_OK) + return ret; + + /* inflate the input, maintain a sliding window, and build an index -- this + also validates the integrity of the compressed data using the check + information at the end of the gzip or zlib stream */ + totin = totout = last = 0; + index = NULL; /* will be allocated by first addpoint() */ + strm.avail_out = 0; + do { + /* get some compressed data from input file */ + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto build_index_error; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto build_index_error; + } + strm.next_in = input; + + /* process all of that, or until end of stream */ + do { + /* reset sliding window if necessary */ + if (strm.avail_out == 0) { + strm.avail_out = WINSIZE; + strm.next_out = window; + } + + /* inflate until out of input, output, or at end of block -- + update the total input and output counters */ + totin += strm.avail_in; + totout += strm.avail_out; + ret = inflate(&strm, Z_BLOCK); /* return at end of block */ + totin -= strm.avail_in; + totout -= strm.avail_out; + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto build_index_error; + if (ret == Z_STREAM_END) + break; + + /* if at end of block, consider adding an index entry (note that if + data_type indicates an end-of-block, then all of the + uncompressed data from that block has been delivered, and none + of the compressed data after that block has been consumed, + except for up to seven bits) -- the totout == 0 provides an + entry point after the zlib or gzip header, and assures that the + index always has at least one access point; we avoid creating an + access point after the last block by checking bit 6 of data_type + */ + if ((strm.data_type & 128) && !(strm.data_type & 64) && + (totout == 0 || totout - last > span)) { + index = addpoint(index, strm.data_type & 7, totin, + totout, strm.avail_out, window); + if (index == NULL) { + ret = Z_MEM_ERROR; + goto build_index_error; + } + last = totout; + } + } while (strm.avail_in != 0); + } while (ret != Z_STREAM_END); + + /* clean up and return index (release unused entries in list) */ + (void)inflateEnd(&strm); + index = realloc(index, sizeof(struct point) * index->have); + index->size = index->have; + *built = index; + return index->size; + + /* return error */ + build_index_error: + (void)inflateEnd(&strm); + if (index != NULL) + free_index(index); + return ret; +} + +/* Use the index to read len bytes from offset into buf, return bytes read or + negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past + the end of the uncompressed data, then extract() will return a value less + than len, indicating how much as actually read into buf. This function + should not return a data error unless the file was modified since the index + was generated. extract() may also return Z_ERRNO if there is an error on + reading or seeking the input file. */ +local int extract(FILE *in, struct access *index, off_t offset, + unsigned char *buf, int len) +{ + int ret, skip; + z_stream strm; + struct point *here; + unsigned char input[CHUNK]; + unsigned char discard[WINSIZE]; + + /* proceed only if something reasonable to do */ + if (len < 0) + return 0; + + /* find where in stream to start */ + here = index->list; + ret = index->have; + while (--ret && here[1].out <= offset) + here++; + + /* initialize file and inflate state to start there */ + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + ret = inflateInit2(&strm, -15); /* raw inflate */ + if (ret != Z_OK) + return ret; + ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); + if (ret == -1) + goto extract_ret; + if (here->bits) { + ret = getc(in); + if (ret == -1) { + ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; + goto extract_ret; + } + (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); + } + (void)inflateSetDictionary(&strm, here->window, WINSIZE); + + /* skip uncompressed bytes until offset reached, then satisfy request */ + offset -= here->out; + strm.avail_in = 0; + skip = 1; /* while skipping to offset */ + do { + /* define where to put uncompressed data, and how much */ + if (offset == 0 && skip) { /* at offset now */ + strm.avail_out = len; + strm.next_out = buf; + skip = 0; /* only do this once */ + } + if (offset > WINSIZE) { /* skip WINSIZE bytes */ + strm.avail_out = WINSIZE; + strm.next_out = discard; + offset -= WINSIZE; + } + else if (offset != 0) { /* last skip */ + strm.avail_out = (unsigned)offset; + strm.next_out = discard; + offset = 0; + } + + /* uncompress until avail_out filled, or end of stream */ + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (ferror(in)) { + ret = Z_ERRNO; + goto extract_ret; + } + if (strm.avail_in == 0) { + ret = Z_DATA_ERROR; + goto extract_ret; + } + strm.next_in = input; + } + ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */ + if (ret == Z_NEED_DICT) + ret = Z_DATA_ERROR; + if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) + goto extract_ret; + if (ret == Z_STREAM_END) + break; + } while (strm.avail_out != 0); + + /* if reach end of stream, then don't keep trying to get more */ + if (ret == Z_STREAM_END) + break; + + /* do until offset reached and requested data read, or stream ends */ + } while (skip); + + /* compute number of uncompressed bytes read after offset */ + ret = skip ? 0 : len - strm.avail_out; + + /* clean up and return bytes read or error */ + extract_ret: + (void)inflateEnd(&strm); + return ret; +} + +/* Demonstrate the use of build_index() and extract() by processing the file + provided on the command line, and the extracting 16K from about 2/3rds of + the way through the uncompressed output, and writing that to stdout. */ +int main(int argc, char **argv) +{ + int len; + off_t offset; + FILE *in; + struct access *index = NULL; + unsigned char buf[CHUNK]; + + /* open input file */ + if (argc != 2) { + fprintf(stderr, "usage: zran file.gz\n"); + return 1; + } + in = fopen(argv[1], "rb"); + if (in == NULL) { + fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); + return 1; + } + + /* build index */ + len = build_index(in, SPAN, &index); + if (len < 0) { + fclose(in); + switch (len) { + case Z_MEM_ERROR: + fprintf(stderr, "zran: out of memory\n"); + break; + case Z_DATA_ERROR: + fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); + break; + case Z_ERRNO: + fprintf(stderr, "zran: read error on %s\n", argv[1]); + break; + default: + fprintf(stderr, "zran: error %d while building index\n", len); + } + return 1; + } + fprintf(stderr, "zran: built index with %d access points\n", len); + + /* use index by reading some bytes from an arbitrary offset */ + offset = (index->list[index->have - 1].out << 1) / 3; + len = extract(in, index, offset, buf, CHUNK); + if (len < 0) + fprintf(stderr, "zran: extraction failed: %s error\n", + len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); + else { + fwrite(buf, 1, len, stdout); + fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); + } + + /* clean up and exit */ + free_index(index); + fclose(in); + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzclose.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzclose.c new file mode 100644 index 0000000000..caeb99a317 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzclose.c @@ -0,0 +1,25 @@ +/* gzclose.c -- zlib gzclose() function + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* gzclose() is in a separate file so that it is linked in only if it is used. + That way the other gzclose functions can be used instead to avoid linking in + unneeded compression or decompression routines. */ +int ZEXPORT gzclose(file) + gzFile file; +{ +#ifndef NO_GZCOMPRESS + gz_statep state; + + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); +#else + return gzclose_r(file); +#endif +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzguts.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzguts.h new file mode 100644 index 0000000000..0f8fb79f87 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzguts.h @@ -0,0 +1,132 @@ +/* gzguts.h -- zlib internal header definitions for gz* operations + * Copyright (C) 2004, 2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#ifdef _LARGEFILE64_SOURCE +# ifndef _LARGEFILE_SOURCE +# define _LARGEFILE_SOURCE 1 +# endif +# ifdef _FILE_OFFSET_BITS +# undef _FILE_OFFSET_BITS +# endif +#endif + +#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include +#include "zlib.h" +#ifdef STDC +# include +# include +# include +#endif +#include + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifdef _MSC_VER +# include +# define vsnprintf _vsnprintf +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +/* gz* functions always use library allocation functions */ +#ifndef STDC + extern voidp malloc OF((uInt size)); + extern void free OF((voidpf ptr)); +#endif + +/* get errno and strerror definition */ +#if defined UNDER_CE +# include +# define zstrerror() gz_strwinerror((DWORD)GetLastError()) +#else +# ifdef STDC +# include +# define zstrerror() strerror(errno) +# else +# define zstrerror() "stdio error (consult errno)" +# endif +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); +#endif + +/* default i/o buffer size -- double this for output when reading */ +#define GZBUFSIZE 8192 + +/* gzip modes, also provide a little integrity check on the passed structure */ +#define GZ_NONE 0 +#define GZ_READ 7247 +#define GZ_WRITE 31153 +#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ + +/* values for gz_state how */ +#define LOOK 0 /* look for a gzip header */ +#define COPY 1 /* copy input directly */ +#define GZIP 2 /* decompress a gzip stream */ + +/* internal gzip file state data structure */ +typedef struct { + /* used for both reading and writing */ + int mode; /* see gzip modes above */ + int fd; /* file descriptor */ + char *path; /* path or fd for error messages */ + z_off64_t pos; /* current position in uncompressed data */ + unsigned size; /* buffer size, zero if not allocated yet */ + unsigned want; /* requested buffer size, default is GZBUFSIZE */ + unsigned char *in; /* input buffer */ + unsigned char *out; /* output buffer (double-sized when reading) */ + unsigned char *next; /* next output data to deliver or write */ + /* just for reading */ + unsigned have; /* amount of output data unused at next */ + int eof; /* true if end of input file reached */ + z_off64_t start; /* where the gzip data started, for rewinding */ + z_off64_t raw; /* where the raw data started, for seeking */ + int how; /* 0: get header, 1: copy, 2: decompress */ + int direct; /* true if last read direct, false if gzip */ + /* just for writing */ + int level; /* compression level */ + int strategy; /* compression strategy */ + /* seek request */ + z_off64_t skip; /* amount to skip (already rewound if backwards) */ + int seek; /* true if seek request pending */ + /* error information */ + int err; /* error code */ + char *msg; /* error message */ + /* zlib inflate or deflate stream */ + z_stream strm; /* stream structure in-place (not a pointer) */ +} gz_state; +typedef gz_state FAR *gz_statep; + +/* shared functions */ +void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +#if defined UNDER_CE +char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +#endif + +/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t + value -- needed when comparing unsigned to z_off64_t, which is signed + (possible z_off64_t types off_t, off64_t, and long are all signed) */ +#ifdef INT_MAX +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) +#else +unsigned ZLIB_INTERNAL gz_intmax OF((void)); +# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzlib.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzlib.c new file mode 100644 index 0000000000..603e60ed54 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzlib.c @@ -0,0 +1,537 @@ +/* gzlib.c -- zlib functions common to reading and writing gzip files + * Copyright (C) 2004, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define LSEEK lseek64 +#else +# define LSEEK lseek +#endif + +/* Local functions */ +local void gz_reset OF((gz_statep)); +local gzFile gz_open OF((const char *, int, const char *)); + +#if defined UNDER_CE + +/* Map the Windows error number in ERROR to a locale-dependent error message + string and return a pointer to it. Typically, the values for ERROR come + from GetLastError. + + The string pointed to shall not be modified by the application, but may be + overwritten by a subsequent call to gz_strwinerror + + The gz_strwinerror function does not change the current setting of + GetLastError. */ +char ZLIB_INTERNAL *gz_strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +#endif /* UNDER_CE */ + +/* Reset gzip file state */ +local void gz_reset(state) + gz_statep state; +{ + if (state->mode == GZ_READ) { /* for reading ... */ + state->have = 0; /* no output data available */ + state->eof = 0; /* not at end of file */ + state->how = LOOK; /* look for gzip header */ + state->direct = 1; /* default for empty file */ + } + state->seek = 0; /* no seek request pending */ + gz_error(state, Z_OK, NULL); /* clear error */ + state->pos = 0; /* no uncompressed data yet */ + state->strm.avail_in = 0; /* no input data yet */ +} + +/* Open a gzip file either by name or file descriptor. */ +local gzFile gz_open(path, fd, mode) + const char *path; + int fd; + const char *mode; +{ + gz_statep state; + + /* allocate gzFile structure to return */ + state = malloc(sizeof(gz_state)); + if (state == NULL) + return NULL; + state->size = 0; /* no buffers allocated yet */ + state->want = GZBUFSIZE; /* requested buffer size */ + state->msg = NULL; /* no error message yet */ + + /* interpret mode */ + state->mode = GZ_NONE; + state->level = Z_DEFAULT_COMPRESSION; + state->strategy = Z_DEFAULT_STRATEGY; + while (*mode) { + if (*mode >= '0' && *mode <= '9') + state->level = *mode - '0'; + else + switch (*mode) { + case 'r': + state->mode = GZ_READ; + break; +#ifndef NO_GZCOMPRESS + case 'w': + state->mode = GZ_WRITE; + break; + case 'a': + state->mode = GZ_APPEND; + break; +#endif + case '+': /* can't read and write at the same time */ + free(state); + return NULL; + case 'b': /* ignore -- will request binary anyway */ + break; + case 'f': + state->strategy = Z_FILTERED; + break; + case 'h': + state->strategy = Z_HUFFMAN_ONLY; + break; + case 'R': + state->strategy = Z_RLE; + break; + case 'F': + state->strategy = Z_FIXED; + default: /* could consider as an error, but just ignore */ + ; + } + mode++; + } + + /* must provide an "r", "w", or "a" */ + if (state->mode == GZ_NONE) { + free(state); + return NULL; + } + + /* save the path name for error messages */ + state->path = malloc(strlen(path) + 1); + if (state->path == NULL) { + free(state); + return NULL; + } + strcpy(state->path, path); + + /* open the file with the appropriate mode (or just use fd) */ + state->fd = fd != -1 ? fd : + open(path, +#ifdef O_LARGEFILE + O_LARGEFILE | +#endif +#ifdef O_BINARY + O_BINARY | +#endif + (state->mode == GZ_READ ? + O_RDONLY : + (O_WRONLY | O_CREAT | ( + state->mode == GZ_WRITE ? + O_TRUNC : + O_APPEND))), + 0666); + if (state->fd == -1) { + free(state->path); + free(state); + return NULL; + } + if (state->mode == GZ_APPEND) + state->mode = GZ_WRITE; /* simplify later checks */ + + /* save the current position for rewinding (only if reading) */ + if (state->mode == GZ_READ) { + state->start = LSEEK(state->fd, 0, SEEK_CUR); + if (state->start == -1) state->start = 0; + } + + /* initialize stream */ + gz_reset(state); + + /* return stream */ + return (gzFile)state; +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzopen64(path, mode) + const char *path; + const char *mode; +{ + return gz_open(path, -1, mode); +} + +/* -- see zlib.h -- */ +gzFile ZEXPORT gzdopen(fd, mode) + int fd; + const char *mode; +{ + char *path; /* identifier for error messages */ + gzFile gz; + + if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) + return NULL; + sprintf(path, "", fd); /* for debugging */ + gz = gz_open(path, fd, mode); + free(path); + return gz; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzbuffer(file, size) + gzFile file; + unsigned size; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* make sure we haven't already allocated memory */ + if (state->size != 0) + return -1; + + /* check and set requested size */ + if (size == 0) + return -1; + state->want = size; + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzrewind(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* back up and start over */ + if (LSEEK(state->fd, state->start, SEEK_SET) == -1) + return -1; + gz_reset(state); + return 0; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzseek64(file, offset, whence) + gzFile file; + z_off64_t offset; + int whence; +{ + unsigned n; + z_off64_t ret; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* check that there's no error */ + if (state->err != Z_OK) + return -1; + + /* can only seek from start or relative to current position */ + if (whence != SEEK_SET && whence != SEEK_CUR) + return -1; + + /* normalize offset to a SEEK_CUR specification */ + if (whence == SEEK_SET) + offset -= state->pos; + else if (state->seek) + offset += state->skip; + state->seek = 0; + + /* if within raw area while reading, just go there */ + if (state->mode == GZ_READ && state->how == COPY && + state->pos + offset >= state->raw) { + ret = LSEEK(state->fd, offset - state->have, SEEK_CUR); + if (ret == -1) + return -1; + state->have = 0; + state->eof = 0; + state->seek = 0; + gz_error(state, Z_OK, NULL); + state->strm.avail_in = 0; + state->pos += offset; + return state->pos; + } + + /* calculate skip amount, rewinding if needed for back seek when reading */ + if (offset < 0) { + if (state->mode != GZ_READ) /* writing -- can't go backwards */ + return -1; + offset += state->pos; + if (offset < 0) /* before start of file! */ + return -1; + if (gzrewind(file) == -1) /* rewind, then skip to offset */ + return -1; + } + + /* if reading, skip what's in output buffer (one less gzgetc() check) */ + if (state->mode == GZ_READ) { + n = GT_OFF(state->have) || (z_off64_t)state->have > offset ? + (unsigned)offset : state->have; + state->have -= n; + state->next += n; + state->pos += n; + offset -= n; + } + + /* request skip (if not zero) */ + if (offset) { + state->seek = 1; + state->skip = offset; + } + return state->pos + offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzseek(file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + z_off64_t ret; + + ret = gzseek64(file, (z_off64_t)offset, whence); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gztell64(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* return position */ + return state->pos + (state->seek ? state->skip : 0); +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gztell(file) + gzFile file; +{ + z_off64_t ret; + + ret = gztell64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +z_off64_t ZEXPORT gzoffset64(file) + gzFile file; +{ + z_off64_t offset; + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return -1; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return -1; + + /* compute and return effective offset in file */ + offset = LSEEK(state->fd, 0, SEEK_CUR); + if (offset == -1) + return -1; + if (state->mode == GZ_READ) /* reading */ + offset -= state->strm.avail_in; /* don't count buffered input */ + return offset; +} + +/* -- see zlib.h -- */ +z_off_t ZEXPORT gzoffset(file) + gzFile file; +{ + z_off64_t ret; + + ret = gzoffset64(file); + return ret == (z_off_t)ret ? (z_off_t)ret : -1; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzeof(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return 0; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return 0; + + /* return end-of-file state */ + return state->mode == GZ_READ ? + (state->eof && state->strm.avail_in == 0 && state->have == 0) : 0; +} + +/* -- see zlib.h -- */ +const char * ZEXPORT gzerror(file, errnum) + gzFile file; + int *errnum; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return NULL; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return NULL; + + /* return error information */ + if (errnum != NULL) + *errnum = state->err; + return state->msg == NULL ? "" : state->msg; +} + +/* -- see zlib.h -- */ +void ZEXPORT gzclearerr(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure and check integrity */ + if (file == NULL) + return; + state = (gz_statep)file; + if (state->mode != GZ_READ && state->mode != GZ_WRITE) + return; + + /* clear error and end-of-file */ + if (state->mode == GZ_READ) + state->eof = 0; + gz_error(state, Z_OK, NULL); +} + +/* Create an error message in allocated memory and set state->err and + state->msg accordingly. Free any previous error message already there. Do + not try to free or allocate space if the error is Z_MEM_ERROR (out of + memory). Simply save the error message as a static string. If there is an + allocation failure constructing the error message, then convert the error to + out of memory. */ +void ZLIB_INTERNAL gz_error(state, err, msg) + gz_statep state; + int err; + const char *msg; +{ + /* free previously allocated message and clear */ + if (state->msg != NULL) { + if (state->err != Z_MEM_ERROR) + free(state->msg); + state->msg = NULL; + } + + /* set error code, and if no message, then done */ + state->err = err; + if (msg == NULL) + return; + + /* for an out of memory error, save as static string */ + if (err == Z_MEM_ERROR) { + state->msg = (char *)msg; + return; + } + + /* construct error message with path */ + if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { + state->err = Z_MEM_ERROR; + state->msg = (char *)"out of memory"; + return; + } + strcpy(state->msg, state->path); + strcat(state->msg, ": "); + strcat(state->msg, msg); + return; +} + +#ifndef INT_MAX +/* portably return maximum value for an int (when limits.h presumed not + available) -- we need to do this to cover cases where 2's complement not + used, since C standard permits 1's complement and sign-bit representations, + otherwise we could just use ((unsigned)-1) >> 1 */ +unsigned ZLIB_INTERNAL gz_intmax() +{ + unsigned p, q; + + p = 1; + do { + q = p; + p <<= 1; + p++; + } while (p > q); + return q >> 1; +} +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzread.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzread.c new file mode 100644 index 0000000000..548201ab00 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzread.c @@ -0,0 +1,653 @@ +/* gzread.c -- zlib functions for reading gzip files + * Copyright (C) 2004, 2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); +local int gz_avail OF((gz_statep)); +local int gz_next4 OF((gz_statep, unsigned long *)); +local int gz_head OF((gz_statep)); +local int gz_decomp OF((gz_statep)); +local int gz_make OF((gz_statep)); +local int gz_skip OF((gz_statep, z_off64_t)); + +/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from + state->fd, and update state->eof, state->err, and state->msg as appropriate. + This function needs to loop on read(), since read() is not guaranteed to + read the number of bytes requested, depending on the type of descriptor. */ +local int gz_load(state, buf, len, have) + gz_statep state; + unsigned char *buf; + unsigned len; + unsigned *have; +{ + int ret; + + *have = 0; + do { + ret = read(state->fd, buf + *have, len - *have); + if (ret <= 0) + break; + *have += ret; + } while (*have < len); + if (ret < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (ret == 0) + state->eof = 1; + return 0; +} + +/* Load up input buffer and set eof flag if last data loaded -- return -1 on + error, 0 otherwise. Note that the eof flag is set when the end of the input + file is reached, even though there may be unused data in the buffer. Once + that data has been used, no more attempts will be made to read the file. + gz_avail() assumes that strm->avail_in == 0. */ +local int gz_avail(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + if (state->err != Z_OK) + return -1; + if (state->eof == 0) { + if (gz_load(state, state->in, state->size, + (unsigned *)&(strm->avail_in)) == -1) + return -1; + strm->next_in = state->in; + } + return 0; +} + +/* Get next byte from input, or -1 if end or error. */ +#define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \ + (strm->avail_in == 0 ? -1 : \ + (strm->avail_in--, *(strm->next_in)++))) + +/* Get a four-byte little-endian integer and return 0 on success and the value + in *ret. Otherwise -1 is returned and *ret is not modified. */ +local int gz_next4(state, ret) + gz_statep state; + unsigned long *ret; +{ + int ch; + unsigned long val; + z_streamp strm = &(state->strm); + + val = NEXT(); + val += (unsigned)NEXT() << 8; + val += (unsigned long)NEXT() << 16; + ch = NEXT(); + if (ch == -1) + return -1; + val += (unsigned long)ch << 24; + *ret = val; + return 0; +} + +/* Look for gzip header, set up for inflate or copy. state->have must be zero. + If this is the first time in, allocate required memory. state->how will be + left unchanged if there is no more input data available, will be set to COPY + if there is no gzip header and direct copying will be performed, or it will + be set to GZIP for decompression, and the gzip header will be skipped so + that the next available input data is the raw deflate stream. If direct + copying, then leftover input data from the input buffer will be copied to + the output buffer. In that case, all further file reads will be directly to + either the output buffer or a user buffer. If decompressing, the inflate + state and the check value will be initialized. gz_head() will return 0 on + success or -1 on failure. Failures may include read errors or gzip header + errors. */ +local int gz_head(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + int flags; + unsigned len; + + /* allocate read buffers and inflate memory */ + if (state->size == 0) { + /* allocate buffers */ + state->in = malloc(state->want); + state->out = malloc(state->want << 1); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + state->size = state->want; + + /* allocate inflate memory */ + state->strm.zalloc = Z_NULL; + state->strm.zfree = Z_NULL; + state->strm.opaque = Z_NULL; + state->strm.avail_in = 0; + state->strm.next_in = Z_NULL; + if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ + free(state->out); + free(state->in); + state->size = 0; + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + } + + /* get some data in the input buffer */ + if (strm->avail_in == 0) { + if (gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) + return 0; + } + + /* look for the gzip magic header bytes 31 and 139 */ + if (strm->next_in[0] == 31) { + strm->avail_in--; + strm->next_in++; + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in && strm->next_in[0] == 139) { + /* we have a gzip header, woo hoo! */ + strm->avail_in--; + strm->next_in++; + + /* skip rest of header */ + if (NEXT() != 8) { /* compression method */ + gz_error(state, Z_DATA_ERROR, "unknown compression method"); + return -1; + } + flags = NEXT(); + if (flags & 0xe0) { /* reserved flag bits */ + gz_error(state, Z_DATA_ERROR, "unknown header flags set"); + return -1; + } + NEXT(); /* modification time */ + NEXT(); + NEXT(); + NEXT(); + NEXT(); /* extra flags */ + NEXT(); /* operating system */ + if (flags & 4) { /* extra field */ + len = (unsigned)NEXT(); + len += (unsigned)NEXT() << 8; + while (len--) + if (NEXT() < 0) + break; + } + if (flags & 8) /* file name */ + while (NEXT() > 0) + ; + if (flags & 16) /* comment */ + while (NEXT() > 0) + ; + if (flags & 2) { /* header crc */ + NEXT(); + NEXT(); + } + /* an unexpected end of file is not checked for here -- it will be + noticed on the first request for uncompressed data */ + + /* set up for decompression */ + inflateReset(strm); + strm->adler = crc32(0L, Z_NULL, 0); + state->how = GZIP; + state->direct = 0; + return 0; + } + else { + /* not a gzip file -- save first byte (31) and fall to raw i/o */ + state->out[0] = 31; + state->have = 1; + } + } + + /* doing raw i/o, save start of raw data for seeking, copy any leftover + input to output -- this assumes that the output buffer is larger than + the input buffer, which also assures space for gzungetc() */ + state->raw = state->pos; + state->next = state->out; + if (strm->avail_in) { + memcpy(state->next + state->have, strm->next_in, strm->avail_in); + state->have += strm->avail_in; + strm->avail_in = 0; + } + state->how = COPY; + state->direct = 1; + return 0; +} + +/* Decompress from input to the provided next_out and avail_out in the state. + If the end of the compressed data is reached, then verify the gzip trailer + check value and length (modulo 2^32). state->have and state->next are set + to point to the just decompressed data, and the crc is updated. If the + trailer is verified, state->how is reset to LOOK to look for the next gzip + stream or raw data, once state->have is depleted. Returns 0 on success, -1 + on failure. Failures may include invalid compressed data or a failed gzip + trailer verification. */ +local int gz_decomp(state) + gz_statep state; +{ + int ret; + unsigned had; + unsigned long crc, len; + z_streamp strm = &(state->strm); + + /* fill output buffer up to end of deflate stream */ + had = strm->avail_out; + do { + /* get more input for inflate() */ + if (strm->avail_in == 0 && gz_avail(state) == -1) + return -1; + if (strm->avail_in == 0) { + gz_error(state, Z_DATA_ERROR, "unexpected end of file"); + return -1; + } + + /* decompress and handle errors */ + ret = inflate(strm, Z_NO_FLUSH); + if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { + gz_error(state, Z_STREAM_ERROR, + "internal error: inflate stream corrupt"); + return -1; + } + if (ret == Z_MEM_ERROR) { + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ + gz_error(state, Z_DATA_ERROR, + strm->msg == NULL ? "compressed data error" : strm->msg); + return -1; + } + } while (strm->avail_out && ret != Z_STREAM_END); + + /* update available output and crc check value */ + state->have = had - strm->avail_out; + state->next = strm->next_out - state->have; + strm->adler = crc32(strm->adler, state->next, state->have); + + /* check gzip trailer if at end of deflate stream */ + if (ret == Z_STREAM_END) { + if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { + gz_error(state, Z_DATA_ERROR, "unexpected end of file"); + return -1; + } + if (crc != strm->adler) { + gz_error(state, Z_DATA_ERROR, "incorrect data check"); + return -1; + } + if (len != (strm->total_out & 0xffffffffL)) { + gz_error(state, Z_DATA_ERROR, "incorrect length check"); + return -1; + } + state->how = LOOK; /* ready for next stream, once have is 0 (leave + state->direct unchanged to remember how) */ + } + + /* good decompression */ + return 0; +} + +/* Make data and put in the output buffer. Assumes that state->have == 0. + Data is either copied from the input file or decompressed from the input + file depending on state->how. If state->how is LOOK, then a gzip header is + looked for (and skipped if found) to determine wither to copy or decompress. + Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY + or GZIP unless the end of the input file has been reached and all data has + been processed. */ +local int gz_make(state) + gz_statep state; +{ + z_streamp strm = &(state->strm); + + if (state->how == LOOK) { /* look for gzip header */ + if (gz_head(state) == -1) + return -1; + if (state->have) /* got some data from gz_head() */ + return 0; + } + if (state->how == COPY) { /* straight copy */ + if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) + return -1; + state->next = state->out; + } + else if (state->how == GZIP) { /* decompress */ + strm->avail_out = state->size << 1; + strm->next_out = state->out; + if (gz_decomp(state) == -1) + return -1; + } + return 0; +} + +/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ +local int gz_skip(state, len) + gz_statep state; + z_off64_t len; +{ + unsigned n; + + /* skip over len bytes or reach end-of-file, whichever comes first */ + while (len) + /* skip over whatever is in output buffer */ + if (state->have) { + n = GT_OFF(state->have) || (z_off64_t)state->have > len ? + (unsigned)len : state->have; + state->have -= n; + state->next += n; + state->pos += n; + len -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && state->strm.avail_in == 0) + break; + + /* need more data to skip -- load up output buffer */ + else { + /* get more output, looking for header if required */ + if (gz_make(state) == -1) + return -1; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + unsigned got, n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + return -1; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* get len bytes to buf, or less than len if at the end */ + got = 0; + do { + /* first just try copying data from the output buffer */ + if (state->have) { + n = state->have > len ? len : state->have; + memcpy(buf, state->next, n); + state->next += n; + state->have -= n; + } + + /* output buffer empty -- return if we're at the end of the input */ + else if (state->eof && strm->avail_in == 0) + break; + + /* need output data -- for small len or new stream load up our output + buffer */ + else if (state->how == LOOK || len < (state->size << 1)) { + /* get more output, looking for header if required */ + if (gz_make(state) == -1) + return -1; + continue; /* no progress yet -- go back to memcpy() above */ + /* the copy above assures that we will leave with space in the + output buffer, allowing at least one gzungetc() to succeed */ + } + + /* large len -- read directly into user buffer */ + else if (state->how == COPY) { /* read directly */ + if (gz_load(state, buf, len, &n) == -1) + return -1; + } + + /* large len -- decompress directly into user buffer */ + else { /* state->how == GZIP */ + strm->avail_out = len; + strm->next_out = buf; + if (gz_decomp(state) == -1) + return -1; + n = state->have; + state->have = 0; + } + + /* update progress */ + len -= n; + buf = (char *)buf + n; + got += n; + state->pos += n; + } while (len); + + /* return number of bytes read into user buffer (will fit in int) */ + return (int)got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzgetc(file) + gzFile file; +{ + int ret; + unsigned char buf[1]; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* try output buffer (no need to check for skip request) */ + if (state->have) { + state->have--; + state->pos++; + return *(state->next)++; + } + + /* nothing there -- try gzread() */ + ret = gzread(file, buf, 1); + return ret < 1 ? -1 : buf[0]; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return -1; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return -1; + } + + /* can't push EOF */ + if (c < 0) + return -1; + + /* if output buffer empty, put byte at end (allows more pushing) */ + if (state->have == 0) { + state->have = 1; + state->next = state->out + (state->size << 1) - 1; + state->next[0] = c; + state->pos--; + return c; + } + + /* if no room, give up (must have already done a gzungetc()) */ + if (state->have == (state->size << 1)) { + gz_error(state, Z_BUF_ERROR, "out of room to push characters"); + return -1; + } + + /* slide output data if needed and insert byte before existing data */ + if (state->next == state->out) { + unsigned char *src = state->out + state->have; + unsigned char *dest = state->out + (state->size << 1); + while (src > state->out) + *--dest = *--src; + state->next = dest; + } + state->have++; + state->next--; + state->next[0] = c; + state->pos--; + return c; +} + +/* -- see zlib.h -- */ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + unsigned left, n; + char *str; + unsigned char *eol; + gz_statep state; + + /* check parameters and get internal structure */ + if (file == NULL || buf == NULL || len < 1) + return NULL; + state = (gz_statep)file; + + /* check that we're reading and that there's no error */ + if (state->mode != GZ_READ || state->err != Z_OK) + return NULL; + + /* process a skip request */ + if (state->seek) { + state->seek = 0; + if (gz_skip(state, state->skip) == -1) + return NULL; + } + + /* copy output bytes up to new line or len - 1, whichever comes first -- + append a terminating zero to the string (we don't check for a zero in + the contents, let the user worry about that) */ + str = buf; + left = (unsigned)len - 1; + if (left) do { + /* assure that something is in the output buffer */ + if (state->have == 0) { + if (gz_make(state) == -1) + return NULL; /* error */ + if (state->have == 0) { /* end of file */ + if (buf == str) /* got bupkus */ + return NULL; + break; /* got something -- return it */ + } + } + + /* look for end-of-line in current output buffer */ + n = state->have > left ? left : state->have; + eol = memchr(state->next, '\n', n); + if (eol != NULL) + n = (unsigned)(eol - state->next) + 1; + + /* copy through end-of-line, or remainder if not found */ + memcpy(buf, state->next, n); + state->have -= n; + state->next += n; + state->pos += n; + left -= n; + buf += n; + } while (left && eol == NULL); + + /* found end-of-line or out of space -- terminate string and return it */ + buf[0] = 0; + return str; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzdirect(file) + gzFile file; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return 0; + + /* if the state is not known, but we can find out, then do so (this is + mainly for right after a gzopen() or gzdopen()) */ + if (state->how == LOOK && state->have == 0) + (void)gz_head(state); + + /* return 1 if reading direct, 0 if decompressing a gzip stream */ + return state->direct; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_r(file) + gzFile file; +{ + int ret; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're reading */ + if (state->mode != GZ_READ) + return Z_STREAM_ERROR; + + /* free memory and close file */ + if (state->size) { + inflateEnd(&(state->strm)); + free(state->out); + free(state->in); + } + gz_error(state, Z_OK, NULL); + free(state->path); + ret = close(state->fd); + free(state); + return ret ? Z_ERRNO : Z_OK; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzwrite.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzwrite.c new file mode 100644 index 0000000000..e8defc6887 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/gzwrite.c @@ -0,0 +1,531 @@ +/* gzwrite.c -- zlib functions for writing gzip files + * Copyright (C) 2004, 2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "gzguts.h" + +/* Local functions */ +local int gz_init OF((gz_statep)); +local int gz_comp OF((gz_statep, int)); +local int gz_zero OF((gz_statep, z_off64_t)); + +/* Initialize state for writing a gzip file. Mark initialization by setting + state->size to non-zero. Return -1 on failure or 0 on success. */ +local int gz_init(state) + gz_statep state; +{ + int ret; + z_streamp strm = &(state->strm); + + /* allocate input and output buffers */ + state->in = malloc(state->want); + state->out = malloc(state->want); + if (state->in == NULL || state->out == NULL) { + if (state->out != NULL) + free(state->out); + if (state->in != NULL) + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* allocate deflate memory, set up for gzip compression */ + strm->zalloc = Z_NULL; + strm->zfree = Z_NULL; + strm->opaque = Z_NULL; + ret = deflateInit2(strm, state->level, Z_DEFLATED, + 15 + 16, 8, state->strategy); + if (ret != Z_OK) { + free(state->in); + gz_error(state, Z_MEM_ERROR, "out of memory"); + return -1; + } + + /* mark state as initialized */ + state->size = state->want; + + /* initialize write buffer */ + strm->avail_out = state->size; + strm->next_out = state->out; + state->next = strm->next_out; + return 0; +} + +/* Compress whatever is at avail_in and next_in and write to the output file. + Return -1 if there is an error writing to the output file, otherwise 0. + flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, + then the deflate() state is reset to start a new gzip stream. */ +local int gz_comp(state, flush) + gz_statep state; + int flush; +{ + int ret, got; + unsigned have; + z_streamp strm = &(state->strm); + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return -1; + + /* run deflate() on provided input until it produces no more output */ + ret = Z_OK; + do { + /* write out current buffer contents if full, or if flushing, but if + doing Z_FINISH then don't write until we get to Z_STREAM_END */ + if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && + (flush != Z_FINISH || ret == Z_STREAM_END))) { + have = (unsigned)(strm->next_out - state->next); + if (have && ((got = write(state->fd, state->next, have)) < 0 || + (unsigned)got != have)) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + if (strm->avail_out == 0) { + strm->avail_out = state->size; + strm->next_out = state->out; + } + state->next = strm->next_out; + } + + /* compress */ + have = strm->avail_out; + ret = deflate(strm, flush); + if (ret == Z_STREAM_ERROR) { + gz_error(state, Z_STREAM_ERROR, + "internal error: deflate stream corrupt"); + return -1; + } + have -= strm->avail_out; + } while (have); + + /* if that completed a deflate stream, allow another to start */ + if (flush == Z_FINISH) + deflateReset(strm); + + /* all done, no errors */ + return 0; +} + +/* Compress len zeros to output. Return -1 on error, 0 on success. */ +local int gz_zero(state, len) + gz_statep state; + z_off64_t len; +{ + int first; + unsigned n; + z_streamp strm = &(state->strm); + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + + /* compress len zeros (len guaranteed > 0) */ + first = 1; + while (len) { + n = GT_OFF(state->size) || (z_off64_t)state->size > len ? + (unsigned)len : state->size; + if (first) { + memset(state->in, 0, n); + first = 0; + } + strm->avail_in = n; + strm->next_in = state->in; + state->pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return -1; + len -= n; + } + return 0; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + unsigned put = len; + unsigned n; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids the flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); + return 0; + } + + /* if len is zero, avoid unnecessary operations */ + if (len == 0) + return 0; + + /* allocate memory if this is the first time through */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* for small len, copy to input buffer, otherwise compress directly */ + if (len < state->size) { + /* copy to input buffer, compress when full */ + do { + if (strm->avail_in == 0) + strm->next_in = state->in; + n = state->size - strm->avail_in; + if (n > len) + n = len; + memcpy(strm->next_in + strm->avail_in, buf, n); + strm->avail_in += n; + state->pos += n; + buf = (char *)buf + n; + len -= n; + if (len && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } while (len); + } + else { + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* directly compress user buffer to file */ + strm->avail_in = len; + strm->next_in = (voidp)buf; + state->pos += len; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + } + + /* input was all buffered or compressed (put will fit in int) */ + return (int)put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char buf[1]; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* try writing to input buffer for speed (state->size == 0 if buffer not + initialized) */ + if (strm->avail_in < state->size) { + if (strm->avail_in == 0) + strm->next_in = state->in; + strm->next_in[strm->avail_in++] = c; + state->pos++; + return c; + } + + /* no room in buffer or not initialized, use gz_write() */ + buf[0] = c; + if (gzwrite(file, buf, 1) != 1) + return -1; + return c; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzputs(file, str) + gzFile file; + const char *str; +{ + int ret; + unsigned len; + + /* write string */ + len = (unsigned)strlen(str); + ret = gzwrite(file, str, len); + return ret == 0 && len != 0 ? -1 : ret; +} + +#ifdef STDC +#include + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) +{ + int size, len; + gz_statep state; + z_streamp strm; + va_list va; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(state->in, format, va); + va_end(va); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = vsprintf(state->in, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(state->in, size, format, va); + va_end(va); + len = strlen(state->in); +# else + len = vsnprintf((char *)(state->in), size, format, va); + va_end(va); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->pos += len; + return len; +} + +#else /* !STDC */ + +/* -- see zlib.h -- */ +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + int size, len; + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* make sure we have some buffer space */ + if (state->size == 0 && gz_init(state) == -1) + return 0; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return 0; + } + + /* consume whatever's left in the input buffer */ + if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + + /* do the printf() into the input buffer, put length in len */ + size = (int)(state->size); + state->in[size - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < size; len++) + if (state->in[len] == 0) break; +# else + len = sprintf(state->in, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(state->in); +# else + len = snprintf(state->in, size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + + /* check that printf() results fit in buffer */ + if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + return 0; + + /* update buffer and position, defer compression until needed */ + strm->avail_in = (unsigned)len; + strm->next_in = state->in; + state->pos += len; + return len; +} + +#endif + +/* -- see zlib.h -- */ +int ZEXPORT gzflush(file, flush) + gzFile file; + int flush; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* check flush parameter */ + if (flush < 0 || flush > Z_FINISH) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* compress remaining data with requested flush */ + gz_comp(state, flush); + return state->err; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzsetparams(file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_statep state; + z_streamp strm; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + strm = &(state->strm); + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return Z_STREAM_ERROR; + + /* if no change is requested, then do nothing */ + if (level == state->level && strategy == state->strategy) + return Z_OK; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + if (gz_zero(state, state->skip) == -1) + return -1; + } + + /* change compression parameters for subsequent input */ + if (state->size) { + /* flush previous input with previous parameters before changing */ + if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + return state->err; + deflateParams(strm, level, strategy); + } + state->level = level; + state->strategy = strategy; + return Z_OK; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzclose_w(file) + gzFile file; +{ + int ret = 0; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return Z_STREAM_ERROR; + state = (gz_statep)file; + + /* check that we're writing */ + if (state->mode != GZ_WRITE) + return Z_STREAM_ERROR; + + /* check for seek request */ + if (state->seek) { + state->seek = 0; + ret += gz_zero(state, state->skip); + } + + /* flush, free memory, and close file */ + ret += gz_comp(state, Z_FINISH); + (void)deflateEnd(&(state->strm)); + free(state->out); + free(state->in); + gz_error(state, Z_OK, NULL); + free(state->path); + ret += close(state->fd); + free(state); + return ret ? Z_ERRNO : Z_OK; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/infback.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/infback.c new file mode 100644 index 0000000000..af3a8c965d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/infback.c @@ -0,0 +1,632 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2009 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->wnext = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + state->length = (unsigned)here.val; + + /* process literal */ + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(here.bits); + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(here.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffast.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffast.c new file mode 100644 index 0000000000..2f1d60b43b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffast.c @@ -0,0 +1,340 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2008, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void ZLIB_INTERNAL inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code here; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + wnext = state->wnext; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = lcode[hold & lmask]; + dolen: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op == 0) { /* literal */ + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + here = dcode[hold & dmask]; + dodist: + op = (unsigned)(here.bits); + hold >>= op; + bits -= op; + op = (unsigned)(here.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(here.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif + } + from = window - OFF; + if (wnext == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + here = dcode[here.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + here = lcode[here.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and wnext == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffast.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffast.h new file mode 100644 index 0000000000..e5c1aa4ca8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffixed.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffixed.h new file mode 100644 index 0000000000..75ed4b5978 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,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,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,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,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,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,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inflate.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inflate.c new file mode 100644 index 0000000000..a8431abeac --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inflate.c @@ -0,0 +1,1480 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common wnext == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->wnext = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflateReset2(strm, windowBits) +z_streamp strm; +int windowBits; +{ + int wrap; + struct inflate_state FAR *state; + + /* get the state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + int ret; + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { + ZFREE(strm, state); + strm->state = Z_NULL; + } + return ret; +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->wnext = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->wnext = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->wnext; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->wnext = copy; + state->whave = state->wsize; + } + else { + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code here; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; + } + else { + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + if (state->mode == TYPE) + state->back = -1; + break; + } + state->back = 0; + for (;;) { + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if (here.op && (here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", here.val)); + state->mode = LIT; + break; + } + if (here.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; + state->mode = TYPE; + break; + } + if (here.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; + PULLBYTE(); + } + if ((here.op & 0xf0) == 0) { + last = here; + for (;;) { + here = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + here.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + state->back += last.bits; + } + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + state->back += state->extra; + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->wnext - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inflate.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inflate.h new file mode 100644 index 0000000000..95f4986d40 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inflate.h @@ -0,0 +1,122 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2009 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to BAD or MEM on error -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + (raw) -> TYPEDO + Read deflate blocks: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 10K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned wnext; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inftrees.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inftrees.c new file mode 100644 index 0000000000..11e9c52acc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inftrees.c @@ -0,0 +1,330 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code here; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 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}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 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, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + here.op = (unsigned char)0; + here.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; + } + else { + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = here; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + here.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = here; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inftrees.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inftrees.h new file mode 100644 index 0000000000..baa53a0b1a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/inftrees.h @@ -0,0 +1,62 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005, 2010 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) + +/* Type of code to build for inflate_table() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/make_vms.com b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/make_vms.com new file mode 100644 index 0000000000..6576490e65 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/make_vms.com @@ -0,0 +1,804 @@ +$! make libz under VMS written by +$! Martin P.J. Zinser +$! +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! zinser@sysdev.deutsche-boerse.com (work) +$! +$! Make procedure history for Zlib +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20060120 First version to receive a number +$! 0.02 20061008 Adapt to new Makefile.in +$! 0.03 20091224 Add support for large file check +$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite +$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in +$! +$ on error then goto err_exit +$ set proc/parse=ext +$! +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ define/nolog tconfig 'th' +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$ s_case = False +$! +$! Setup variables holding "config" information +$! +$ Make = "" +$ name = "Zlib" +$ version = "?.?.?" +$ v_string = "ZLIB_VERSION" +$ v_file = "zlib.h" +$ ccopt = "" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "zconf.h.in#zconf.h_in" +$ conf_check_string = "" +$ linkonly = false +$ optfile = name + ".opt" +$ libdefs = "" +$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 +$! +$ whoami = f$parse(f$enviornment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! +$! Check for MMK/MMS +$! +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$! +$! +$ gosub find_version +$! +$ open/write topt tmp.opt +$ open/write optf 'optfile' +$! +$ gosub check_opts +$! +$! Look for the compiler used +$! +$ gosub check_compiler +$ close topt +$! +$ if its_decc +$ then +$ ccopt = "/prefix=all" + ccopt +$ if f$trnlnm("SYS") .eqs. "" +$ then +$ if axp +$ then +$ define sys sys$library: +$ else +$ ccopt = "/decc" + ccopt +$ define sys decc$library_include: +$ endif +$ endif +$ endif +$ if its_vaxc .or. its_gnuc +$ then +$ if f$trnlnm("SYS").eqs."" then define sys sys$library: +$ endif +$! +$! Build a fake configure input header +$! +$ open/write conf_hin config.hin +$ write conf_hin "#undef _LARGEFILE64_SOURCE" +$ close conf_hin +$! +$! +$ i = 0 +$FIND_ACONF: +$ fname = f$element(i,"#",aconf_in_file) +$ if fname .eqs. "#" then goto AMISS_ERR +$ if f$search(fname) .eqs. "" +$ then +$ i = i + 1 +$ goto find_aconf +$ endif +$ open/read/err=aconf_err aconf_in 'fname' +$ open/write aconf zconf.h +$ACONF_LOOP: +$ read/end_of_file=aconf_exit aconf_in line +$ work = f$edit(line, "compress,trim") +$ if f$extract(0,6,work) .nes. "#undef" +$ then +$ if f$extract(0,12,work) .nes. "#cmakedefine" +$ then +$ write aconf line +$ endif +$ else +$ cdef = f$element(1," ",work) +$ gosub check_config +$ endif +$ goto aconf_loop +$ACONF_EXIT: +$ write aconf "#define VMS 1" +$ write aconf "#include " +$ write aconf "#include " +$ write aconf "#ifdef _LARGEFILE" +$ write aconf "#define off64_t __off64_t" +$ write aconf "#define fopen64 fopen" +$ write aconf "#define fseeko64 fseeko" +$ write aconf "#define lseek64 lseek" +$ write aconf "#define ftello64 ftell" +$ write aconf "#endif" +$ close aconf_in +$ close aconf +$ if f$search("''th'") .nes. "" then delete 'th';* +$! Build the thing plain or with mms +$! +$ write sys$output "Compiling Zlib sources ..." +$ if make.eqs."" +$ then +$ dele example.obj;*,minigzip.obj;* +$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - + adler32.c zlib.h zconf.h +$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - + compress.c zlib.h zconf.h +$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - + crc32.c zlib.h zconf.h +$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - + deflate.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" - + gzclose.c zutil.h zlib.h zconf.h +$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" - + gzlib.c zutil.h zlib.h zconf.h +$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" - + gzread.c zutil.h zlib.h zconf.h +$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" - + gzwrite.c zutil.h zlib.h zconf.h +$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - + infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - + inffast.c zutil.h zlib.h zconf.h inffast.h +$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - + inflate.c zutil.h zlib.h zconf.h infblock.h +$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - + inftrees.c zutil.h zlib.h zconf.h inftrees.h +$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - + trees.c deflate.h zutil.h zlib.h zconf.h +$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - + uncompr.c zlib.h zconf.h +$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - + zutil.c zutil.h zlib.h zconf.h +$ write sys$output "Building Zlib ..." +$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ +$ write sys$output "Building example..." +$ CALL MAKE example.OBJ "CC ''CCOPT' example" - + example.c zlib.h zconf.h +$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb +$ if f$search("x11vms:xvmsutils.olb") .nes. "" +$ then +$ write sys$output "Building minigzip..." +$ CALL MAKE minigzip.OBJ "CC ''CCOPT' minigzip" - + minigzip.c zlib.h zconf.h +$ call make minigzip.exe - + "LINK minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib" - + minigzip.obj libz.olb +$ endif +$ else +$ gosub crea_mms +$ write sys$output "Make ''name' ''version' with ''Make' " +$ 'make' +$ endif +$! +$! Alpha gets a shareable image +$! +$ If axp +$ Then +$ gosub crea_olist +$ write sys$output "Creating libzshr.exe" +$ call anal_obj_axp modules.opt _link.opt +$ if s_case +$ then +$ open/append optf modules.opt +$ write optf "case_sensitive=YES" +$ close optf +$ endif +$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,_link.opt/opt +$ endif +$ write sys$output "Zlib build completed" +$ exit +$CC_ERR: +$ write sys$output "C compiler required to build ''name'" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog topt +$ close/nolog conf_hin +$ close/nolog aconf_in +$ close/nolog aconf +$ close/nolog out +$ close/nolog min +$ close/nolog mod +$ close/nolog h_in +$ write sys$output "Exiting..." +$ exit 2 +$! +$! +$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES +$ V = 'F$Verify(0) +$! P1 = What we are trying to make +$! P2 = Command to make it +$! P3 - P8 What it depends on +$ +$ If F$Search(P1) .Eqs. "" Then Goto Makeit +$ Time = F$CvTime(F$File(P1,"RDT")) +$arg=3 +$Loop: +$ Argument = P'arg +$ If Argument .Eqs. "" Then Goto Exit +$ El=0 +$Loop2: +$ File = F$Element(El," ",Argument) +$ If File .Eqs. " " Then Goto Endl +$ AFile = "" +$Loop3: +$ OFile = AFile +$ AFile = F$Search(File) +$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl +$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit +$ Goto Loop3 +$NextEL: +$ El = El + 1 +$ Goto Loop2 +$EndL: +$ arg=arg+1 +$ If arg .Le. 8 Then Goto Loop +$ Goto Exit +$ +$Makeit: +$ VV=F$VERIFY(0) +$ write sys$output P2 +$ 'P2 +$ VV='F$Verify(VV) +$Exit: +$ If V Then Set Verify +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20041206 First version to receive a number +$! 0.02 20060126 Add new "HELP" target +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$! +$! Check if parameter actually contains something +$! +$ if f$edit(cparm,"trim") .nes. "" +$ then +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ if cparm .eqs. "HELP" then gosub bhelp +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Look for the compiler used +$! +$! Version history +$! 0.01 20040223 First version to receive a number +$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists +$! 0.03 20060202 Extend handling of GNU C +$! 0.04 20090402 Compaq -> hp +$CHECK_COMPILER: +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then +$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") +$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") +$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") +$ endif +$! +$! Exit if no compiler available +$! +$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) +$ then goto CC_ERR +$ else +$ if its_decc +$ then +$ write sys$output "CC compiler check ... hp C" +$ if f$trnlnm("decc$no_rooted_search_lists") .nes. "" +$ then +$ dnrsl = f$trnlnm("decc$no_rooted_search_lists") +$ endif +$ define/nolog decc$no_rooted_search_lists 1 +$ else +$ if its_vaxc then write sys$output "CC compiler check ... VAX C" +$ if its_gnuc +$ then +$ write sys$output "CC compiler check ... GNU C" +$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib" +$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib" +$ cc = "gcc" +$ endif +$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" +$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms..." +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser +# + +OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ + gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, \ + inftrees.obj, inffast.obj + +$ eod +$ write out "CFLAGS=", ccopt +$ write out "LOPTS=", lopts +$ copy sys$input: out +$ deck + +all : example.exe minigzip.exe libz.olb + @ write sys$output " Example applications available" + +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link $(LOPTS) example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link $(LOPTS) minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* + + +# Other dependencies. +adler32.obj : adler32.c zutil.h zlib.h zconf.h +compress.obj : compress.c zlib.h zconf.h +crc32.obj : crc32.c zutil.h zlib.h zconf.h +deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h +example.obj : example.c zlib.h zconf.h +gzclose.obj : gzclose.c zutil.h zlib.h zconf.h +gzlib.obj : gzlib.c zutil.h zlib.h zconf.h +gzread.obj : gzread.c zutil.h zlib.h zconf.h +gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h +inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h +inflate.obj : inflate.c zutil.h zlib.h zconf.h +inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h +minigzip.obj : minigzip.c zlib.h zconf.h +trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h +uncompr.obj : uncompr.c zlib.h zconf.h +zutil.obj : zutil.c zutil.h zlib.h zconf.h +infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Read list of core library sources from makefile.in and create options +$! needed to build shareable image +$! +$CREA_OLIST: +$ open/read min makefile.in +$ open/write mod modules.opt +$ src_check = "OBJC =" +$MRLOOP: +$ read/end=mrdone min rec +$ if (f$extract(0,6,rec) .nes. src_check) then goto mrloop +$ rec = rec - src_check +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .eqs. "\") then goto mrdone +$MRSLOOP: +$ read/end=mrdone min rec +$ gosub extra_filnam +$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop +$MRDONE: +$ close min +$ close mod +$ return +$!------------------------------------------------------------------------------ +$! +$! Take record extracted in crea_olist and split it into single filenames +$! +$EXTRA_FILNAM: +$ myrec = f$edit(rec - "\", "trim,compress") +$ i = 0 +$FELOOP: +$ srcfil = f$element(i," ", myrec) +$ if (srcfil .nes. " ") +$ then +$ write mod f$parse(srcfil,,,"NAME"), ".obj" +$ i = i + 1 +$ goto feloop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Find current Zlib version number +$! +$FIND_VERSION: +$ open/read h_in 'v_file' +$hloop: +$ read/end=hdone h_in rec +$ rec = f$edit(rec,"TRIM") +$ if (f$extract(0,1,rec) .nes. "#") then goto hloop +$ rec = f$edit(rec - "#", "TRIM") +$ if f$element(0," ",rec) .nes. "define" then goto hloop +$ if f$element(1," ",rec) .eqs. v_string +$ then +$ version = 'f$element(2," ",rec)' +$ goto hdone +$ endif +$ goto hloop +$hdone: +$ close h_in +$ return +$!------------------------------------------------------------------------------ +$! +$CHECK_CONFIG: +$! +$ in_ldef = f$locate(cdef,libdefs) +$ if (in_ldef .lt. f$length(libdefs)) +$ then +$ write aconf "#define ''cdef' 1" +$ libdefs = f$extract(0,in_ldef,libdefs) + - + f$extract(in_ldef + f$length(cdef) + 1, - + f$length(libdefs) - in_ldef - f$length(cdef) - 1, - + libdefs) +$ else +$ if (f$type('cdef') .eqs. "INTEGER") +$ then +$ write aconf "#define ''cdef' ", 'cdef' +$ else +$ if (f$type('cdef') .eqs. "STRING") +$ then +$ write aconf "#define ''cdef' ", """", '''cdef'', """" +$ else +$ gosub check_cc_def +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check if this is a define relating to the properties of the C/C++ +$! compiler +$! +$ CHECK_CC_DEF: +$ if (cdef .eqs. "_LARGEFILE64_SOURCE") +$ then +$ copy sys$input: 'tc' +$ deck +#include "tconfig" +#define _LARGEFILE +#include + +int main(){ +FILE *fp; + fp = fopen("temp.txt","r"); + fseeko(fp,1,SEEK_SET); + fclose(fp); +} + +$ eod +$ test_inv = false +$ comm_h = false +$ gosub cc_prop_check +$ return +$ endif +$ write aconf "/* ", line, " */" +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler +$! +$! Version history +$! 0.01 20031020 First version to receive a number +$! 0.02 20031022 Added logic for defines with value +$! 0.03 20040309 Make sure local config file gets not deleted +$! 0.04 20041230 Also write include for configure run +$! 0.05 20050103 Add processing of "comment defines" +$CC_PROP_CHECK: +$ cc_prop = true +$ is_need = false +$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true) +$ if f$search(th) .eqs. "" then create 'th' +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'.*;*/exclude='th' +$ if (cc_prop .and. .not. is_need) .or. - + (.not. cc_prop .and. is_need) +$ then +$ write sys$output "Checking for ''cdef'... yes" +$ if f$type('cdef_val'_yes) .nes. "" +$ then +$ if f$type('cdef_val'_yes) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes) +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes) +$ else +$ call write_config f$fao("#define !AS 1",cdef) +$ endif +$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. - + (cdef .eqs. "_LARGEFILE64_SOURCE") then - + call write_config f$string("#define _LARGEFILE 1") +$ else +$ write sys$output "Checking for ''cdef'... no" +$ if (comm_h) +$ then + call write_config f$fao("/* !AS */",line) +$ else +$ if f$type('cdef_val'_no) .nes. "" +$ then +$ if f$type('cdef_val'_no) .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no) +$ if f$type('cdef_val'_no) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no) +$ else +$ call write_config f$fao("#undef !AS",cdef) +$ endif +$ endif +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Check for properties of C/C++ compiler with multiple result values +$! +$! Version history +$! 0.01 20040127 First version +$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05 +$CC_MPROP_CHECK: +$ cc_prop = true +$ i = 1 +$ idel = 1 +$ MT_LOOP: +$ if f$type(result_'i') .eqs. "STRING" +$ then +$ set message/nofac/noident/nosever/notext +$ on error then continue +$ cc 'tmpnam'_'i' +$ if .not. ($status) then cc_prop = false +$ on error then continue +$! The headers might lie about the capabilities of the RTL +$ link 'tmpnam'_'i',tmp.opt/opt +$ if .not. ($status) then cc_prop = false +$ set message/fac/ident/sever/text +$ on error then goto err_exit +$ delete/nolog 'tmpnam'_'i'.*;* +$ if (cc_prop) +$ then +$ write sys$output "Checking for ''cdef'... ", mdef_'i' +$ if f$type(mdef_'i') .eqs. "INTEGER" - + then call write_config f$fao("#define !AS !UL",cdef,mdef_'i') +$ if f$type('cdef_val'_yes) .eqs. "STRING" - + then call write_config f$fao("#define !AS !AS",cdef,mdef_'i') +$ goto msym_clean +$ else +$ i = i + 1 +$ goto mt_loop +$ endif +$ endif +$ write sys$output "Checking for ''cdef'... no" +$ call write_config f$fao("#undef !AS",cdef) +$ MSYM_CLEAN: +$ if (idel .le. msym_max) +$ then +$ delete/sym mdef_'idel' +$ idel = idel + 1 +$ goto msym_clean +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Analyze Object files for OpenVMS AXP to extract Procedure and Data +$! information to build a symbol vector for a shareable image +$! All the "brains" of this logic was suggested by Hartmut Becker +$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me +$! (zinser@zinser.no-ip.info), so if you do have problem reports please do not +$! bother Hartmut/HP, but get in touch with me +$! +$! Version history +$! 0.01 20040406 Skip over shareable images in option file +$! 0.02 20041109 Fix option file for shareable images with case_sensitive=YES +$! 0.03 20050107 Skip over Identification labels in option file +$! 0.04 20060117 Add uppercase alias to code compiled with /name=as_is +$! +$ ANAL_OBJ_AXP: Subroutine +$ V = 'F$Verify(0) +$ SAY := "WRITE_ SYS$OUTPUT" +$ +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_aa +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP: Error, no output file provided" +$ goto exit_aa +$ ENDIF +$ +$ open/read in 'p1 +$ create a.tmp +$ open/append atmp a.tmp +$ loop: +$ read/end=end_loop in line +$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" +$ goto loop +$ endif +$ if f$locate("IDENTIFICATION=",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write sys$output "ANAL_OBJ_AXP-i-ident: Identification ", - + f$element(1,"=",line) +$ goto loop +$ endif +$ f= f$search(line) +$ if f .eqs. "" +$ then +$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" +$ goto loop +$ endif +$ define/user sys$output nl: +$ define/user sys$error nl: +$ anal/obj/gsd 'f /out=x.tmp +$ open/read xtmp x.tmp +$ XLOOP: +$ read/end=end_xloop xtmp xline +$ xline = f$edit(xline,"compress") +$ write atmp xline +$ goto xloop +$ END_XLOOP: +$ close xtmp +$ goto loop +$ end_loop: +$ close in +$ close atmp +$ if f$search("a.tmp") .eqs. "" - + then $ exit +$ ! all global definitions +$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp +$ ! all procedures +$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp +$ search c.tmp "symbol:"/out=d.tmp +$ define/user sys$output nl: +$ edito/edt/command=sys$input d.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=PROCEDURE)/whole +exit +$ ! all data +$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp +$ search e.tmp "symbol:"/out=f.tmp +$ define/user sys$output nl: +$ edito/edt/command=sys$input f.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=DATA)/whole +exit +$ sort/nodupl d.tmp,f.tmp g.tmp +$ open/read raw_vector g.tmp +$ open/write case_vector 'p2' +$ RAWLOOP: +$ read/end=end_rawloop raw_vector raw_element +$ write case_vector raw_element +$ if f$locate("=PROCEDURE)",raw_element) .lt. f$length(raw_element) +$ then +$ name = f$element(1,"=",raw_element) - "(" +$ if f$edit(name,"UPCASE") .nes. name then - + write case_vector f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)", - + f$edit(name,"UPCASE"), name) +$ endif +$ if f$locate("=DATA)",raw_element) .lt. f$length(raw_element) +$ then +$ name = f$element(1,"=",raw_element) - "(" +$ if f$edit(name,"UPCASE") .nes. name then - + write case_vector f$fao(" symbol_vector=(!AS/!AS=DATA)", - + f$edit(name,"UPCASE"), name) +$ endif +$ goto rawloop +$ END_RAWLOOP: +$ close raw_vector +$ close case_vector +$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;*,g.tmp;* +$ if f$search("x.tmp") .nes. "" - + then $ delete x.tmp;* +$! +$ EXIT_AA: +$ if V then set verify +$ endsubroutine +$!------------------------------------------------------------------------------ +$! +$! Write configuration to both permanent and temporary config file +$! +$! Version history +$! 0.01 20031029 First version to receive a number +$! +$WRITE_CONFIG: SUBROUTINE +$ write aconf 'p1' +$ open/append confh 'th' +$ write confh 'p1' +$ close confh +$ENDSUBROUTINE +$!------------------------------------------------------------------------------ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/minigzip.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/minigzip.c new file mode 100644 index 0000000000..9825ccc3a7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/minigzip.c @@ -0,0 +1,440 @@ +/* minigzip.c -- simulate gzip using the zlib compression library + * Copyright (C) 1995-2006, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * minigzip is a minimal implementation of the gzip utility. This is + * only an example of using zlib and isn't meant to replace the + * full-featured gzip. No attempt is made to deal with file systems + * limiting names to 14 or 8+3 characters, etc... Error checking is + * very limited. So use minigzip only for testing; use gzip for the + * real thing. On MSDOS, use only on file names without extension + * or in pipe mode. + */ + +/* @(#) $Id$ */ + +#include "zlib.h" +#include + +#ifdef STDC +# include +# include +#endif + +#ifdef USE_MMAP +# include +# include +# include +#endif + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# ifdef UNDER_CE +# include +# endif +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#ifdef VMS +# define unlink delete +# define GZ_SUFFIX "-gz" +#endif +#ifdef RISCOS +# define unlink remove +# define GZ_SUFFIX "-gz" +# define fileno(file) file->__file +#endif +#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fileno */ +#endif + +#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) +#ifndef WIN32 /* unlink already in stdio.h for WIN32 */ + extern int unlink OF((const char *)); +#endif +#endif + +#if defined(UNDER_CE) +# include +# define perror(s) pwinerror(s) + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +static char *strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +static void pwinerror (s) + const char *s; +{ + if (s && *s) + fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); + else + fprintf(stderr, "%s\n", strwinerror(GetLastError ())); +} + +#endif /* UNDER_CE */ + +#ifndef GZ_SUFFIX +# define GZ_SUFFIX ".gz" +#endif +#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) + +#define BUFLEN 16384 +#define MAX_NAME_LEN 1024 + +#ifdef MAXSEG_64K +# define local static + /* Needed for systems with limitation on stack size. */ +#else +# define local +#endif + +char *prog; + +void error OF((const char *msg)); +void gz_compress OF((FILE *in, gzFile out)); +#ifdef USE_MMAP +int gz_compress_mmap OF((FILE *in, gzFile out)); +#endif +void gz_uncompress OF((gzFile in, FILE *out)); +void file_compress OF((char *file, char *mode)); +void file_uncompress OF((char *file)); +int main OF((int argc, char *argv[])); + +/* =========================================================================== + * Display error message and exit + */ +void error(msg) + const char *msg; +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + +/* =========================================================================== + * Compress input to output then close both files. + */ + +void gz_compress(in, out) + FILE *in; + gzFile out; +{ + local char buf[BUFLEN]; + int len; + int err; + +#ifdef USE_MMAP + /* Try first compressing with mmap. If mmap fails (minigzip used in a + * pipe), use the normal fread loop. + */ + if (gz_compress_mmap(in, out) == Z_OK) return; +#endif + for (;;) { + len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) break; + + if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); + } + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); +} + +#ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ + +/* Try compressing the input file at once using mmap. Return Z_OK if + * if success, Z_ERRNO otherwise. + */ +int gz_compress_mmap(in, out) + FILE *in; + gzFile out; +{ + int len; + int err; + int ifd = fileno(in); + caddr_t buf; /* mmap'ed buffer for the entire input file */ + off_t buf_len; /* length of the input file */ + struct stat sb; + + /* Determine the size of the file, needed for mmap: */ + if (fstat(ifd, &sb) < 0) return Z_ERRNO; + buf_len = sb.st_size; + if (buf_len <= 0) return Z_ERRNO; + + /* Now do the actual mmap: */ + buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); + if (buf == (caddr_t)(-1)) return Z_ERRNO; + + /* Compress the whole file at once: */ + len = gzwrite(out, (char *)buf, (unsigned)buf_len); + + if (len != (int)buf_len) error(gzerror(out, &err)); + + munmap(buf, buf_len); + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); + return Z_OK; +} +#endif /* USE_MMAP */ + +/* =========================================================================== + * Uncompress input to output then close both files. + */ +void gz_uncompress(in, out) + gzFile in; + FILE *out; +{ + local char buf[BUFLEN]; + int len; + int err; + + for (;;) { + len = gzread(in, buf, sizeof(buf)); + if (len < 0) error (gzerror(in, &err)); + if (len == 0) break; + + if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { + error("failed fwrite"); + } + } + if (fclose(out)) error("failed fclose"); + + if (gzclose(in) != Z_OK) error("failed gzclose"); +} + + +/* =========================================================================== + * Compress the given file: create a corresponding .gz file and remove the + * original. + */ +void file_compress(file, mode) + char *file; + char *mode; +{ + local char outfile[MAX_NAME_LEN]; + FILE *in; + gzFile out; + + if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + + strcpy(outfile, file); + strcat(outfile, GZ_SUFFIX); + + in = fopen(file, "rb"); + if (in == NULL) { + perror(file); + exit(1); + } + out = gzopen(outfile, mode); + if (out == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); + exit(1); + } + gz_compress(in, out); + + unlink(file); +} + + +/* =========================================================================== + * Uncompress the given file and remove the original. + */ +void file_uncompress(file) + char *file; +{ + local char buf[MAX_NAME_LEN]; + char *infile, *outfile; + FILE *out; + gzFile in; + size_t len = strlen(file); + + if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + + strcpy(buf, file); + + if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { + infile = file; + outfile = buf; + outfile[len-3] = '\0'; + } else { + outfile = file; + infile = buf; + strcat(infile, GZ_SUFFIX); + } + in = gzopen(infile, "rb"); + if (in == NULL) { + fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); + exit(1); + } + out = fopen(outfile, "wb"); + if (out == NULL) { + perror(file); + exit(1); + } + + gz_uncompress(in, out); + + unlink(infile); +} + + +/* =========================================================================== + * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -c : write to standard output + * -d : decompress + * -f : compress with Z_FILTERED + * -h : compress with Z_HUFFMAN_ONLY + * -r : compress with Z_RLE + * -1 to -9 : compression level + */ + +int main(argc, argv) + int argc; + char *argv[]; +{ + int copyout = 0; + int uncompr = 0; + gzFile file; + char *bname, outmode[20]; + + strcpy(outmode, "wb6 "); + + prog = argv[0]; + bname = strrchr(argv[0], '/'); + if (bname) + bname++; + else + bname = argv[0]; + argc--, argv++; + + if (!strcmp(bname, "gunzip")) + uncompr = 1; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + + while (argc > 0) { + if (strcmp(*argv, "-c") == 0) + copyout = 1; + else if (strcmp(*argv, "-d") == 0) + uncompr = 1; + else if (strcmp(*argv, "-f") == 0) + outmode[3] = 'f'; + else if (strcmp(*argv, "-h") == 0) + outmode[3] = 'h'; + else if (strcmp(*argv, "-r") == 0) + outmode[3] = 'R'; + else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && + (*argv)[2] == 0) + outmode[2] = (*argv)[1]; + else + break; + argc--, argv++; + } + if (outmode[3] == ' ') + outmode[3] = 0; + if (argc == 0) { + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + if (uncompr) { + file = gzdopen(fileno(stdin), "rb"); + if (file == NULL) error("can't gzdopen stdin"); + gz_uncompress(file, stdout); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + gz_compress(stdin, file); + } + } else { + if (copyout) { + SET_BINARY_MODE(stdout); + } + do { + if (uncompr) { + if (copyout) { + file = gzopen(*argv, "rb"); + if (file == NULL) + fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + else + gz_uncompress(file, stdout); + } else { + file_uncompress(*argv); + } + } else { + if (copyout) { + FILE * in = fopen(*argv, "rb"); + + if (in == NULL) { + perror(*argv); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + + gz_compress(in, file); + } + + } else { + file_compress(*argv, outmode); + } + } + } while (argv++, --argc); + } + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.bor b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.bor new file mode 100644 index 0000000000..0c1b99c9b9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.bor @@ -0,0 +1,115 @@ +# Makefile for zlib +# Borland C++ +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.bor" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C++, Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# memory model: one of s, m, c, l (small, medium, compact, large) +MODEL=l + +# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version +CC=bcc +LD=bcc +AR=tlib + +# compiler flags +# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0 +CFLAGS=-O2 -Z -m$(MODEL) $(LOC) + +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.dj2 b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.dj2 new file mode 100644 index 0000000000..29b03954d7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.dj2 @@ -0,0 +1,104 @@ +# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.dj2; make test -fmakefile.dj2 +# +# To install libz.a, zconf.h and zlib.h in the djgpp directories, type: +# +# make install -fmakefile.dj2 +# +# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as +# in the sample below if the pattern of the DJGPP distribution is to +# be followed. Remember that, while 'es around <=> are ignored in +# makefiles, they are *not* in batch files or in djgpp.env. +# - - - - - +# [make] +# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include +# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib +# BUTT=-m486 +# - - - - - +# Alternately, these variables may be defined below, overriding the values +# in djgpp.env, as +# INCLUDE_PATH=c:\usr\include +# LIBRARY_PATH=c:\usr\lib + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DDEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lz +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=libz.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +OBJA = +# to use the asm code: make OBJA=match.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +check: test +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +libz.a: $(OBJS) $(OBJA) + $(AR) $@ $(OBJS) $(OBJA) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + +# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env . + +.PHONY : uninstall clean + +install: $(INCL) $(LIBS) + -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH) + -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH) + $(INSTALL) zlib.h $(INCLUDE_PATH) + $(INSTALL) zconf.h $(INCLUDE_PATH) + $(INSTALL) libz.a $(LIBRARY_PATH) + +uninstall: + $(RM) $(INCLUDE_PATH)\zlib.h + $(RM) $(INCLUDE_PATH)\zconf.h + $(RM) $(LIBRARY_PATH)\libz.a + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) libz.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.emx b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.emx new file mode 100644 index 0000000000..9c1b57a585 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DDEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \ + uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.msc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.msc new file mode 100644 index 0000000000..cd2816fbf3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.msc @@ -0,0 +1,112 @@ +# Makefile for zlib +# Microsoft C 5.1 or later +# Last updated: 19-Mar-2003 + +# To use, do "make makefile.msc" +# To compile in small model, set below: MODEL=S + +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to the LOC macro below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------- Microsoft C 5.1 and later ------------- + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added +# to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc. +CPU_TYP = 0 + +# Memory model: one of S, M, C, L (small, medium, compact, large) +MODEL=L + +CC=cl +CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC) +#-Ox generates bad code with MSC 5.1 +LIB_CFLAGS=-Zl $(CFLAGS) + +LD=link +LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode +# "/farcall/packcode" are only useful for `large code' memory models +# but should be a "no-op" for small code models. + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(LIB_CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + +minigzip.obj: minigzip.c zlib.h zconf.h + $(CC) -c $(CFLAGS) $*.c + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + if exist $(ZLIB_LIB) del $(ZLIB_LIB) + lib $(ZLIB_LIB) $(OBJ1); + lib $(ZLIB_LIB) $(OBJ2); + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB); + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB); + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del *.map + -del zlib_*.bak + -del foo.gz diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.tc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.tc new file mode 100644 index 0000000000..bcd0d1889c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/msdos/Makefile.tc @@ -0,0 +1,100 @@ +# Makefile for zlib +# Turbo C 2.01, Turbo C++ 1.01 +# Last updated: 15-Mar-2003 + +# To use, do "make -fmakefile.tc" +# To compile in small model, set below: MODEL=s + +# WARNING: the small model is supported but only for small values of +# MAX_WBITS and MAX_MEM_LEVEL. For example: +# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +# If you wish to reduce the memory requirements (default 256K for big +# objects plus a few K), you can add to CFLAGS below: +# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14 +# See zconf.h for details about the memory requirements. + +# ------------ Turbo C 2.01, Turbo C++ 1.01 ------------ +MODEL=l +CC=tcc +LD=tcc +AR=tlib +# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3 +CFLAGS=-O2 -G -Z -m$(MODEL) +LDFLAGS=-m$(MODEL) -f- + + +# variables +ZLIB_LIB = zlib_$(MODEL).lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +clean: + -del *.obj + -del *.lib + -del *.exe + -del zlib_*.bak + -del foo.gz diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/nintendods/Makefile b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/nintendods/Makefile new file mode 100644 index 0000000000..21337d01ab --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/nintendods/Makefile @@ -0,0 +1,126 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#--------------------------------------------------------------------------------- +TARGET := $(shell basename $(CURDIR)) +BUILD := build +SOURCES := ../../ +DATA := data +INCLUDES := include + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork + +CFLAGS := -Wall -O2\ + -march=armv5te -mtune=arm946e-s \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := $(ARCH) -march=armv5te -mtune=arm946e-s +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/lib/libz.a + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + @[ -d $@ ] || mkdir -p include + @cp ../../*.h include + +lib: + @[ -d $@ ] || mkdir -p $@ + +$(BUILD): lib + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) lib + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT) : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/nintendods/README b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/nintendods/README new file mode 100644 index 0000000000..ba7a37dbe8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/nintendods/README @@ -0,0 +1,5 @@ +This Makefile requires devkitARM (http://www.devkitpro.org/category/devkitarm/) and works inside "contrib/nds". It is based on a devkitARM template. + +Eduardo Costa +January 3, 2009 + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/Makefile.riscos b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/Makefile.riscos new file mode 100644 index 0000000000..57e29d3fba --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/Makefile.riscos @@ -0,0 +1,151 @@ +# Project: zlib_1_03 +# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430 +# test works out-of-the-box, installs `somewhere' on demand + +# Toolflags: +CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah +C++flags = -c -depend !Depend -IC: -throwback +Linkflags = -aif -c++ -o $@ +ObjAsmflags = -throwback -NoCache -depend !Depend +CMHGflags = +LibFileflags = -c -l -o $@ +Squeezeflags = -o $@ + +# change the line below to where _you_ want the library installed. +libdest = lib:zlib + +# Final targets: +@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \ + @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \ + @.o.uncompr @.o.zutil + LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \ + @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \ + @.o.trees @.o.uncompr @.o.zutil +test: @.minigzip @.example @.lib + @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV + @echo running tests: hang on. + @/@.minigzip -f -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -f -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -h -1 libc + @/@.minigzip -d libc-gz + @/@.minigzip -9 libc + @/@.minigzip -d libc-gz + @/@.minigzip -1 libc + @/@.minigzip -d libc-gz + @diff @.lib @.libc + @echo that should have reported '@.lib and @.libc identical' if you have diff. + @/@.example @.fred @.fred + @echo that will have given lots of hello!'s. + +@.minigzip: @.o.minigzip @.lib C:o.Stubs + Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs +@.example: @.o.example @.lib C:o.Stubs + Link $(Linkflags) @.o.example @.lib C:o.Stubs + +install: @.lib + cdir $(libdest) + cdir $(libdest).h + @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV + @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV + @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV + @echo okay, installed zlib in $(libdest) + +clean:; remove @.minigzip + remove @.example + remove @.libc + -wipe @.o.* F~r~cV + remove @.fred + +# User-editable dependencies: +.c.o: + cc $(ccflags) -o $@ $< + +# Static dependencies: + +# Dynamic dependencies: +o.example: c.example +o.example: h.zlib +o.example: h.zconf +o.minigzip: c.minigzip +o.minigzip: h.zlib +o.minigzip: h.zconf +o.adler32: c.adler32 +o.adler32: h.zlib +o.adler32: h.zconf +o.compress: c.compress +o.compress: h.zlib +o.compress: h.zconf +o.crc32: c.crc32 +o.crc32: h.zlib +o.crc32: h.zconf +o.deflate: c.deflate +o.deflate: h.deflate +o.deflate: h.zutil +o.deflate: h.zlib +o.deflate: h.zconf +o.gzio: c.gzio +o.gzio: h.zutil +o.gzio: h.zlib +o.gzio: h.zconf +o.infblock: c.infblock +o.infblock: h.zutil +o.infblock: h.zlib +o.infblock: h.zconf +o.infblock: h.infblock +o.infblock: h.inftrees +o.infblock: h.infcodes +o.infblock: h.infutil +o.infcodes: c.infcodes +o.infcodes: h.zutil +o.infcodes: h.zlib +o.infcodes: h.zconf +o.infcodes: h.inftrees +o.infcodes: h.infblock +o.infcodes: h.infcodes +o.infcodes: h.infutil +o.infcodes: h.inffast +o.inffast: c.inffast +o.inffast: h.zutil +o.inffast: h.zlib +o.inffast: h.zconf +o.inffast: h.inftrees +o.inffast: h.infblock +o.inffast: h.infcodes +o.inffast: h.infutil +o.inffast: h.inffast +o.inflate: c.inflate +o.inflate: h.zutil +o.inflate: h.zlib +o.inflate: h.zconf +o.inflate: h.infblock +o.inftrees: c.inftrees +o.inftrees: h.zutil +o.inftrees: h.zlib +o.inftrees: h.zconf +o.inftrees: h.inftrees +o.inftrees: h.inffixed +o.infutil: c.infutil +o.infutil: h.zutil +o.infutil: h.zlib +o.infutil: h.zconf +o.infutil: h.infblock +o.infutil: h.inftrees +o.infutil: h.infcodes +o.infutil: h.infutil +o.trees: c.trees +o.trees: h.deflate +o.trees: h.zutil +o.trees: h.zlib +o.trees: h.zconf +o.trees: h.trees +o.uncompr: c.uncompr +o.uncompr: h.zlib +o.uncompr: h.zconf +o.zutil: c.zutil +o.zutil: h.zutil +o.zutil: h.zlib +o.zutil: h.zconf diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/README b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/README new file mode 100644 index 0000000000..800bf07982 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/README @@ -0,0 +1,3 @@ +This directory contains files that have not been updated for zlib 1.2.x + +(Volunteers are encouraged to help clean this up. Thanks.) diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/bndsrc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/bndsrc new file mode 100644 index 0000000000..9cf94bb356 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/bndsrc @@ -0,0 +1,132 @@ +STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB') + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.1.3 entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + +/********************************************************************/ +/* *MODULE ADLER32 ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("adler32") + +/********************************************************************/ +/* *MODULE COMPRESS ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("compress") + EXPORT SYMBOL("compress2") + +/********************************************************************/ +/* *MODULE CRC32 ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("crc32") + EXPORT SYMBOL("get_crc_table") + +/********************************************************************/ +/* *MODULE DEFLATE ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("deflate") + EXPORT SYMBOL("deflateEnd") + EXPORT SYMBOL("deflateSetDictionary") + EXPORT SYMBOL("deflateCopy") + EXPORT SYMBOL("deflateReset") + EXPORT SYMBOL("deflateParams") + EXPORT SYMBOL("deflatePrime") + EXPORT SYMBOL("deflateInit_") + EXPORT SYMBOL("deflateInit2_") + +/********************************************************************/ +/* *MODULE GZIO ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("gzopen") + EXPORT SYMBOL("gzdopen") + EXPORT SYMBOL("gzsetparams") + EXPORT SYMBOL("gzread") + EXPORT SYMBOL("gzwrite") + EXPORT SYMBOL("gzprintf") + EXPORT SYMBOL("gzputs") + EXPORT SYMBOL("gzgets") + EXPORT SYMBOL("gzputc") + EXPORT SYMBOL("gzgetc") + EXPORT SYMBOL("gzflush") + EXPORT SYMBOL("gzseek") + EXPORT SYMBOL("gzrewind") + EXPORT SYMBOL("gztell") + EXPORT SYMBOL("gzeof") + EXPORT SYMBOL("gzclose") + EXPORT SYMBOL("gzerror") + +/********************************************************************/ +/* *MODULE INFLATE ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("inflate") + EXPORT SYMBOL("inflateEnd") + EXPORT SYMBOL("inflateSetDictionary") + EXPORT SYMBOL("inflateSync") + EXPORT SYMBOL("inflateReset") + EXPORT SYMBOL("inflateInit_") + EXPORT SYMBOL("inflateInit2_") + EXPORT SYMBOL("inflateSyncPoint") + +/********************************************************************/ +/* *MODULE UNCOMPR ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("uncompress") + +/********************************************************************/ +/* *MODULE ZUTIL ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("zlibVersion") + EXPORT SYMBOL("zError") + +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.1 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + +/********************************************************************/ +/* *MODULE COMPRESS ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("compressBound") + +/********************************************************************/ +/* *MODULE DEFLATE ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("deflateBound") + +/********************************************************************/ +/* *MODULE GZIO ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("gzungetc") + EXPORT SYMBOL("gzclearerr") + +/********************************************************************/ +/* *MODULE INFBACK ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("inflateBack") + EXPORT SYMBOL("inflateBackEnd") + EXPORT SYMBOL("inflateBackInit_") + +/********************************************************************/ +/* *MODULE INFLATE ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("inflateCopy") + +/********************************************************************/ +/* *MODULE ZUTIL ZLIB 01/02/01 00:15:09 */ +/********************************************************************/ + + EXPORT SYMBOL("zlibCompileFlags") + +ENDPGMEXP diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/compile.clp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/compile.clp new file mode 100644 index 0000000000..8554951500 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/compile.clp @@ -0,0 +1,123 @@ +/******************************************************************************/ +/* */ +/* ZLIB */ +/* */ +/* Compile sources into modules and link them into a service program. */ +/* */ +/******************************************************************************/ + + PGM + +/* Configuration adjustable parameters. */ + + DCL VAR(&SRCLIB) TYPE(*CHAR) LEN(10) + + VALUE('ZLIB') /* Source library. */ + DCL VAR(&SRCFILE) TYPE(*CHAR) LEN(10) + + VALUE('SOURCES') /* Source member file. */ + DCL VAR(&CTLFILE) TYPE(*CHAR) LEN(10) + + VALUE('TOOLS') /* Control member file. */ + + DCL VAR(&MODLIB) TYPE(*CHAR) LEN(10) + + VALUE('ZLIB') /* Module library. */ + + DCL VAR(&SRVLIB) TYPE(*CHAR) LEN(10) + + VALUE('LGPL') /* Service program library. */ + + DCL VAR(&CFLAGS) TYPE(*CHAR) + + VALUE('OPTIMIZE(40)') /* Compile options. */ + + +/* Working storage. */ + + DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5) VALUE(300) /* Command length. */ + DCL VAR(&CMD) TYPE(*CHAR) LEN(512) + + +/* Compile sources into modules. */ + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/ADLER32) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/COMPRESS) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/CRC32) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/DEFLATE) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/GZIO) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/INFBACK) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/INFFAST) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/INFLATE) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/INFTREES) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/TREES) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/UNCOMPR) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + CHGVAR VAR(&CMD) VALUE('CRTCMOD MODULE(' *TCAT &MODLIB *TCAT + + '/ZUTIL) SRCFILE(' *TCAT + + &SRCLIB *TCAT '/' *TCAT &SRCFILE *TCAT + + ') SYSIFCOPT(*IFSIO)' *BCAT &CFLAGS) + CALL PGM(QCMDEXC) PARM(&CMD &CMDLEN) + + +/* Link modules into a service program. */ + + CRTSRVPGM SRVPGM(&SRVLIB/ZLIB) + + MODULE(&MODLIB/ADLER32 &MODLIB/COMPRESS + + &MODLIB/CRC32 &MODLIB/DEFLATE + + &MODLIB/GZIO &MODLIB/INFBACK + + &MODLIB/INFFAST &MODLIB/INFLATE + + &MODLIB/INFTREES &MODLIB/TREES + + &MODLIB/UNCOMPR &MODLIB/ZUTIL) + + SRCFILE(&SRCLIB/&CTLFILE) SRCMBR(BNDSRC) + + TEXT('ZLIB 1.2.3') TGTRLS(V4R4M0) + + ENDPGM diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/readme.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/readme.txt new file mode 100644 index 0000000000..beae13f565 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/readme.txt @@ -0,0 +1,111 @@ + ZLIB version 1.2.3 for AS400 installation instructions + +I) From an AS400 *SAVF file: + +1) Unpacking archive to an AS400 save file + +On the AS400: + +_ Create the ZLIB AS400 library: + + CRTLIB LIB(ZLIB) TYPE(PROD) TEXT('ZLIB compression API library') + +_ Create a work save file, for example: + + CRTSAVF FILE(ZLIB/ZLIBSAVF) + +On a PC connected to the target AS400: + +_ Unpack the save file image to a PC file "ZLIBSAVF" +_ Upload this file into the save file on the AS400, for example + using ftp in BINARY mode. + + +2) Populating the ZLIB AS400 source library + +On the AS400: + +_ Extract the saved objects into the ZLIB AS400 library using: + +RSTOBJ OBJ(*ALL) SAVLIB(ZLIB) DEV(*SAVF) SAVF(ZLIB/ZLIBSAVF) RSTLIB(ZLIB) + + +3) Customize installation: + +_ Edit CL member ZLIB/TOOLS(COMPILE) and change parameters if needed, + according to the comments. + +_ Compile this member with: + + CRTCLPGM PGM(ZLIB/COMPILE) SRCFILE(ZLIB/TOOLS) SRCMBR(COMPILE) + + +4) Compile and generate the service program: + +_ This can now be done by executing: + + CALL PGM(ZLIB/COMPILE) + + + +II) From the original source distribution: + +1) On the AS400, create the source library: + + CRTLIB LIB(ZLIB) TYPE(PROD) TEXT('ZLIB compression API library') + +2) Create the source files: + + CRTSRCPF FILE(ZLIB/SOURCES) RCDLEN(112) TEXT('ZLIB library modules') + CRTSRCPF FILE(ZLIB/H) RCDLEN(112) TEXT('ZLIB library includes') + CRTSRCPF FILE(ZLIB/TOOLS) RCDLEN(112) TEXT('ZLIB library control utilities') + +3) From the machine hosting the distribution files, upload them (with + FTP in text mode, for example) according to the following table: + + Original AS400 AS400 AS400 AS400 + file file member type description + SOURCES Original ZLIB C subprogram sources + adler32.c ADLER32 C ZLIB - Compute the Adler-32 checksum of a dta strm + compress.c COMPRESS C ZLIB - Compress a memory buffer + crc32.c CRC32 C ZLIB - Compute the CRC-32 of a data stream + deflate.c DEFLATE C ZLIB - Compress data using the deflation algorithm + gzio.c GZIO C ZLIB - IO on .gz files + infback.c INFBACK C ZLIB - Inflate using a callback interface + inffast.c INFFAST C ZLIB - Fast proc. literals & length/distance pairs + inflate.c INFLATE C ZLIB - Interface to inflate modules + inftrees.c INFTREES C ZLIB - Generate Huffman trees for efficient decode + trees.c TREES C ZLIB - Output deflated data using Huffman coding + uncompr.c UNCOMPR C ZLIB - Decompress a memory buffer + zutil.c ZUTIL C ZLIB - Target dependent utility functions + H Original ZLIB C and ILE/RPG include files + crc32.h CRC32 C ZLIB - CRC32 tables + deflate.h DEFLATE C ZLIB - Internal compression state + inffast.h INFFAST C ZLIB - Header to use inffast.c + inffixed.h INFFIXED C ZLIB - Table for decoding fixed codes + inflate.h INFLATE C ZLIB - Internal inflate state definitions + inftrees.h INFTREES C ZLIB - Header to use inftrees.c + trees.h TREES C ZLIB - Created automatically with -DGEN_TREES_H + zconf.h ZCONF C ZLIB - Compression library configuration + zlib.h ZLIB C ZLIB - Compression library C user interface + as400/zlib.inc ZLIB.INC RPGLE ZLIB - Compression library ILE RPG user interface + zutil.h ZUTIL C ZLIB - Internal interface and configuration + TOOLS Building source software & AS/400 README + as400/bndsrc BNDSRC Entry point exportation list + as400/compile.clp COMPILE CLP Compile sources & generate service program + as400/readme.txt README TXT Installation instructions + +4) Continue as in I)3). + + + + +Notes: For AS400 ILE RPG programmers, a /copy member defining the ZLIB + API prototypes for ILE RPG can be found in ZLIB/H(ZLIB.INC). + Please read comments in this member for more information. + + Remember that most foreign textual data are ASCII coded: this + implementation does not handle conversion from/to ASCII, so + text data code conversions must be done explicitely. + + Always open zipped files in binary mode. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/zlib.inc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/zlib.inc new file mode 100644 index 0000000000..a9a4f5cf4f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/as400/zlib.inc @@ -0,0 +1,331 @@ + * ZLIB.INC - Interface to the general purpose compression library + * + * ILE RPG400 version by Patrick Monnerat, DATASPHERE. + * Version 1.2.3.9 + * + * + * WARNING: + * Procedures inflateInit(), inflateInit2(), deflateInit(), + * deflateInit2() and inflateBackInit() need to be called with + * two additional arguments: + * the package version string and the stream control structure. + * size. This is needed because RPG lacks some macro feature. + * Call these procedures as: + * inflateInit(...: ZLIB_VERSION: %size(z_stream)) + * + /if not defined(ZLIB_H_) + /define ZLIB_H_ + * + ************************************************************************** + * Constants + ************************************************************************** + * + * Versioning information. + * + D ZLIB_VERSION C '1.2.3.9' + D ZLIB_VERNUM C X'1239' + * + * Other equates. + * + D Z_NO_FLUSH C 0 + D Z_SYNC_FLUSH C 2 + D Z_FULL_FLUSH C 3 + D Z_FINISH C 4 + D Z_BLOCK C 5 + * + D Z_OK C 0 + D Z_STREAM_END C 1 + D Z_NEED_DICT C 2 + D Z_ERRNO C -1 + D Z_STREAM_ERROR C -2 + D Z_DATA_ERROR C -3 + D Z_MEM_ERROR C -4 + D Z_BUF_ERROR C -5 + DZ_VERSION_ERROR C -6 + * + D Z_NO_COMPRESSION... + D C 0 + D Z_BEST_SPEED C 1 + D Z_BEST_COMPRESSION... + D C 9 + D Z_DEFAULT_COMPRESSION... + D C -1 + * + D Z_FILTERED C 1 + D Z_HUFFMAN_ONLY C 2 + D Z_RLE C 3 + D Z_DEFAULT_STRATEGY... + D C 0 + * + D Z_BINARY C 0 + D Z_ASCII C 1 + D Z_UNKNOWN C 2 + * + D Z_DEFLATED C 8 + * + D Z_NULL C 0 + * + ************************************************************************** + * Types + ************************************************************************** + * + D z_streamp S * Stream struct ptr + D gzFile S * File pointer + D z_off_t S 10i 0 Stream offsets + * + ************************************************************************** + * Structures + ************************************************************************** + * + * The GZIP encode/decode stream support structure. + * + D z_stream DS align based(z_streamp) + D zs_next_in * Next input byte + D zs_avail_in 10U 0 Byte cnt at next_in + D zs_total_in 10U 0 Total bytes read + D zs_next_out * Output buffer ptr + D zs_avail_out 10U 0 Room left @ next_out + D zs_total_out 10U 0 Total bytes written + D zs_msg * Last errmsg or null + D zs_state * Internal state + D zs_zalloc * procptr Int. state allocator + D zs_free * procptr Int. state dealloc. + D zs_opaque * Private alloc. data + D zs_data_type 10i 0 ASC/BIN best guess + D zs_adler 10u 0 Uncompr. adler32 val + D 10U 0 Reserved + D 10U 0 Ptr. alignment + * + ************************************************************************** + * Utility function prototypes + ************************************************************************** + * + D compress PR 10I 0 extproc('compress') + D dest 32767 options(*varsize) Destination buffer + D destLen 10U 0 Destination length + D source 32767 const options(*varsize) Source buffer + D sourceLen 10u 0 value Source length + * + D compress2 PR 10I 0 extproc('compress2') + D dest 32767 options(*varsize) Destination buffer + D destLen 10U 0 Destination length + D source 32767 const options(*varsize) Source buffer + D sourceLen 10U 0 value Source length + D level 10I 0 value Compression level + * + D compressBound PR 10U 0 extproc('compressBound') + D sourceLen 10U 0 value + * + D uncompress PR 10I 0 extproc('uncompress') + D dest 32767 options(*varsize) Destination buffer + D destLen 10U 0 Destination length + D source 32767 const options(*varsize) Source buffer + D sourceLen 10U 0 value Source length + * + D gzopen PR extproc('gzopen') + D like(gzFile) + D path * value options(*string) File pathname + D mode * value options(*string) Open mode + * + D gzdopen PR extproc('gzdopen') + D like(gzFile) + D fd 10i 0 value File descriptor + D mode * value options(*string) Open mode + * + D gzsetparams PR 10I 0 extproc('gzsetparams') + D file value like(gzFile) File pointer + D level 10I 0 value + D strategy 10i 0 value + * + D gzread PR 10I 0 extproc('gzread') + D file value like(gzFile) File pointer + D buf 32767 options(*varsize) Buffer + D len 10u 0 value Buffer length + * + D gzwrite PR 10I 0 extproc('gzwrite') + D file value like(gzFile) File pointer + D buf 32767 const options(*varsize) Buffer + D len 10u 0 value Buffer length + * + D gzputs PR 10I 0 extproc('gzputs') + D file value like(gzFile) File pointer + D s * value options(*string) String to output + * + D gzgets PR * extproc('gzgets') + D file value like(gzFile) File pointer + D buf 32767 options(*varsize) Read buffer + D len 10i 0 value Buffer length + * + D gzflush PR 10i 0 extproc('gzflush') + D file value like(gzFile) File pointer + D flush 10I 0 value Type of flush + * + D gzseek PR extproc('gzseek') + D like(z_off_t) + D file value like(gzFile) File pointer + D offset value like(z_off_t) Offset + D whence 10i 0 value Origin + * + D gzrewind PR 10i 0 extproc('gzrewind') + D file value like(gzFile) File pointer + * + D gztell PR extproc('gztell') + D like(z_off_t) + D file value like(gzFile) File pointer + * + D gzeof PR 10i 0 extproc('gzeof') + D file value like(gzFile) File pointer + * + D gzclose PR 10i 0 extproc('gzclose') + D file value like(gzFile) File pointer + * + D gzerror PR * extproc('gzerror') Error string + D file value like(gzFile) File pointer + D errnum 10I 0 Error code + * + D gzclearerr PR extproc('gzclearerr') + D file value like(gzFile) File pointer + * + ************************************************************************** + * Basic function prototypes + ************************************************************************** + * + D zlibVersion PR * extproc('zlibVersion') Version string + * + D deflateInit PR 10I 0 extproc('deflateInit_') Init. compression + D strm like(z_stream) Compression stream + D level 10I 0 value Compression level + D version * value options(*string) Version string + D stream_size 10i 0 value Stream struct. size + * + D deflate PR 10I 0 extproc('deflate') Compress data + D strm like(z_stream) Compression stream + D flush 10I 0 value Flush type required + * + D deflateEnd PR 10I 0 extproc('deflateEnd') Termin. compression + D strm like(z_stream) Compression stream + * + D inflateInit PR 10I 0 extproc('inflateInit_') Init. expansion + D strm like(z_stream) Expansion stream + D version * value options(*string) Version string + D stream_size 10i 0 value Stream struct. size + * + D inflate PR 10I 0 extproc('inflate') Expand data + D strm like(z_stream) Expansion stream + D flush 10I 0 value Flush type required + * + D inflateEnd PR 10I 0 extproc('inflateEnd') Termin. expansion + D strm like(z_stream) Expansion stream + * + ************************************************************************** + * Advanced function prototypes + ************************************************************************** + * + D deflateInit2 PR 10I 0 extproc('deflateInit2_') Init. compression + D strm like(z_stream) Compression stream + D level 10I 0 value Compression level + D method 10I 0 value Compression method + D windowBits 10I 0 value log2(window size) + D memLevel 10I 0 value Mem/cmpress tradeoff + D strategy 10I 0 value Compression stategy + D version * value options(*string) Version string + D stream_size 10i 0 value Stream struct. size + * + D deflateSetDictionary... + D PR 10I 0 extproc('deflateSetDictionary') Init. dictionary + D strm like(z_stream) Compression stream + D dictionary 32767 const options(*varsize) Dictionary bytes + D dictLength 10U 0 value Dictionary length + * + D deflateCopy PR 10I 0 extproc('deflateCopy') Compress strm 2 strm + D dest like(z_stream) Destination stream + D source like(z_stream) Source stream + * + D deflateReset PR 10I 0 extproc('deflateReset') End and init. stream + D strm like(z_stream) Compression stream + * + D deflateParams PR 10I 0 extproc('deflateParams') Change level & strat + D strm like(z_stream) Compression stream + D level 10I 0 value Compression level + D strategy 10I 0 value Compression stategy + * + D deflateBound PR 10U 0 extproc('deflateBound') Change level & strat + D strm like(z_stream) Compression stream + D sourcelen 10U 0 value Compression level + * + D deflatePrime PR 10I 0 extproc('deflatePrime') Change level & strat + D strm like(z_stream) Compression stream + D bits 10I 0 value Number of bits to insert + D value 10I 0 value Bits to insert + * + D inflateInit2 PR 10I 0 extproc('inflateInit2_') Init. expansion + D strm like(z_stream) Expansion stream + D windowBits 10I 0 value log2(window size) + D version * value options(*string) Version string + D stream_size 10i 0 value Stream struct. size + * + D inflateSetDictionary... + D PR 10I 0 extproc('inflateSetDictionary') Init. dictionary + D strm like(z_stream) Expansion stream + D dictionary 32767 const options(*varsize) Dictionary bytes + D dictLength 10U 0 value Dictionary length + * + D inflateSync PR 10I 0 extproc('inflateSync') Sync. expansion + D strm like(z_stream) Expansion stream + * + D inflateCopy PR 10I 0 extproc('inflateCopy') + D dest like(z_stream) Destination stream + D source like(z_stream) Source stream + * + D inflateReset PR 10I 0 extproc('inflateReset') End and init. stream + D strm like(z_stream) Expansion stream + * + D inflateBackInit... + D PR 10I 0 extproc('inflateBackInit_') + D strm like(z_stream) Expansion stream + D windowBits 10I 0 value Log2(buffer size) + D window 32767 options(*varsize) Buffer + D version * value options(*string) Version string + D stream_size 10i 0 value Stream struct. size + * + D inflateBack PR 10I 0 extproc('inflateBack') + D strm like(z_stream) Expansion stream + D in * value procptr Input function + D in_desc * value Input descriptor + D out * value procptr Output function + D out_desc * value Output descriptor + * + D inflateBackEnd PR 10I 0 extproc('inflateBackEnd') + D strm like(z_stream) Expansion stream + * + D zlibCompileFlags... + D PR 10U 0 extproc('zlibCompileFlags') + * + ************************************************************************** + * Checksum function prototypes + ************************************************************************** + * + D adler32 PR 10U 0 extproc('adler32') New checksum + D adler 10U 0 value Old checksum + D buf 32767 const options(*varsize) Bytes to accumulate + D len 10U 0 value Buffer length + * + D crc32 PR 10U 0 extproc('crc32') New checksum + D crc 10U 0 value Old checksum + D buf 32767 const options(*varsize) Bytes to accumulate + D len 10U 0 value Buffer length + * + ************************************************************************** + * Miscellaneous function prototypes + ************************************************************************** + * + D zError PR * extproc('zError') Error string + D err 10I 0 value Error code + * + D inflateSyncPoint... + D PR 10I 0 extproc('inflateSyncPoint') + D strm like(z_stream) Expansion stream + * + D get_crc_table PR * extproc('get_crc_table') Ptr to ulongs + * + /endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/descrip.mms b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/descrip.mms new file mode 100644 index 0000000000..7066da5b55 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/descrip.mms @@ -0,0 +1,48 @@ +# descrip.mms: MMS description file for building zlib on VMS +# written by Martin P.J. Zinser + +cc_defs = +c_deb = + +.ifdef __DECC__ +pref = /prefix=all +.endif + +OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\ + deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\ + inftrees.obj, infcodes.obj, infutil.obj, inffast.obj + +CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF) + +all : example.exe minigzip.exe + @ write sys$output " Example applications available" +libz.olb : libz.olb($(OBJS)) + @ write sys$output " libz available" + +example.exe : example.obj libz.olb + link example,libz.olb/lib + +minigzip.exe : minigzip.obj libz.olb + link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib + +clean : + delete *.obj;*,libz.olb;* + + +# Other dependencies. +adler32.obj : zutil.h zlib.h zconf.h +compress.obj : zlib.h zconf.h +crc32.obj : zutil.h zlib.h zconf.h +deflate.obj : deflate.h zutil.h zlib.h zconf.h +example.obj : zlib.h zconf.h +gzio.obj : zutil.h zlib.h zconf.h +infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h +inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h +inflate.obj : zutil.h zlib.h zconf.h infblock.h +inftrees.obj : zutil.h zlib.h zconf.h inftrees.h +infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h +minigzip.obj : zlib.h zconf.h +trees.obj : deflate.h zutil.h zlib.h zconf.h +uncompr.obj : zlib.h zconf.h +zutil.obj : zutil.h zlib.h zconf.h diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/os2/Makefile.os2 b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/os2/Makefile.os2 new file mode 100644 index 0000000000..a105aaa5bb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/os2/Makefile.os2 @@ -0,0 +1,136 @@ +# Makefile for zlib under OS/2 using GCC (PGCC) +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile and test, type: +# cp Makefile.os2 .. +# cd .. +# make -f Makefile.os2 test + +# This makefile will build a static library z.lib, a shared library +# z.dll and a import library zdll.lib. You can use either z.lib or +# zdll.lib by specifying either -lz or -lzdll on gcc's command line + +CC=gcc -Zomf -s + +CFLAGS=-O6 -Wall +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-g -DDEBUG +#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ +# -Wstrict-prototypes -Wmissing-prototypes + +#################### BUG WARNING: ##################### +## infcodes.c hits a bug in pgcc-1.0, so you have to use either +## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem) +## This bug is reportedly fixed in pgcc >1.0, but this was not tested +CFLAGS+=-fno-force-mem + +LDFLAGS=-s -L. -lzdll -Zcrtdll +LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll + +VER=1.1.0 +ZLIB=z.lib +SHAREDLIB=z.dll +SHAREDLIBIMP=zdll.lib +LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP) + +AR=emxomfar cr +IMPLIB=emximp +RANLIB=echo +TAR=tar +SHELL=bash + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \ + zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o + +TEST_OBJS = example.o minigzip.o + +DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \ + algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \ + nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \ + contrib/asm386/*.asm contrib/asm386/*.c \ + contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \ + contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \ + contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 + +all: example.exe minigzip.exe + +test: all + @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \ + echo hello world | ./minigzip | ./minigzip -d || \ + echo ' *** minigzip test FAILED ***' ; \ + if ./example; then \ + echo ' *** zlib test OK ***'; \ + else \ + echo ' *** zlib test FAILED ***'; \ + fi + +$(ZLIB): $(OBJS) + $(AR) $@ $(OBJS) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +$(SHAREDLIB): $(OBJS) os2/z.def + $(LDSHARED) -o $@ $^ + +$(SHAREDLIBIMP): os2/z.def + $(IMPLIB) -o $@ $^ + +example.exe: example.o $(LIBS) + $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS) + +minigzip.exe: minigzip.o $(LIBS) + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + +clean: + rm -f *.o *~ example minigzip libz.a libz.so* foo.gz + +distclean: clean + +zip: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + zip -ul9 zlib$$v $(DISTFILES) + mv Makefile~ Makefile + +dist: + mv Makefile Makefile~; cp -p Makefile.in Makefile + rm -f test.c ztest*.c + d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\ + rm -f $$d.tar.gz; \ + if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \ + files=""; \ + for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \ + cd ..; \ + GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \ + if test ! -d $$d; then rm -f $$d; fi + mv Makefile~ Makefile + +tags: + etags *.[ch] + +depend: + makedepend -- $(CFLAGS) -- *.[ch] + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzio.o: zutil.h zlib.h zconf.h +infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h +infcodes.o: zutil.h zlib.h zconf.h +infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h +inffast.o: infblock.h infcodes.h infutil.h inffast.h +inflate.o: zutil.h zlib.h zconf.h infblock.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/os2/zlib.def b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/os2/zlib.def new file mode 100644 index 0000000000..4c753f1a3b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/os2/zlib.def @@ -0,0 +1,51 @@ +; +; Slightly modified version of ../nt/zlib.dnt :-) +; + +LIBRARY Z +DESCRIPTION "Zlib compression library for OS/2" +CODE PRELOAD MOVEABLE DISCARDABLE +DATA PRELOAD MOVEABLE MULTIPLE + +EXPORTS + adler32 + compress + crc32 + deflate + deflateCopy + deflateEnd + deflateInit2_ + deflateInit_ + deflateParams + deflateReset + deflateSetDictionary + gzclose + gzdopen + gzerror + gzflush + gzopen + gzread + gzwrite + inflate + inflateEnd + inflateInit2_ + inflateInit_ + inflateReset + inflateSetDictionary + inflateSync + uncompress + zlibVersion + gzprintf + gzputc + gzgetc + gzseek + gzrewind + gztell + gzeof + gzsetparams + zError + inflateSyncPoint + get_crc_table + compress2 + gzputs + gzgets diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visual-basic.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visual-basic.txt new file mode 100644 index 0000000000..57efe58124 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visual-basic.txt @@ -0,0 +1,160 @@ +See below some functions declarations for Visual Basic. + +Frequently Asked Question: + +Q: Each time I use the compress function I get the -5 error (not enough + room in the output buffer). + +A: Make sure that the length of the compressed buffer is passed by + reference ("as any"), not by value ("as long"). Also check that + before the call of compress this length is equal to the total size of + the compressed buffer and not zero. + + +From: "Jon Caruana" +Subject: Re: How to port zlib declares to vb? +Date: Mon, 28 Oct 1996 18:33:03 -0600 + +Got the answer! (I haven't had time to check this but it's what I got, and +looks correct): + +He has the following routines working: + compress + uncompress + gzopen + gzwrite + gzread + gzclose + +Declares follow: (Quoted from Carlos Rios , in Vb4 form) + +#If Win16 Then 'Use Win16 calls. +Declare Function compress Lib "ZLIB.DLL" (ByVal compr As + String, comprLen As Any, ByVal buf As String, ByVal buflen + As Long) As Integer +Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr + As String, uncomprLen As Any, ByVal compr As String, ByVal + lcompr As Long) As Integer +Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As + String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As + Long, ByVal uncompr As String, ByVal uncomprLen As Integer) + As Integer +Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As + Long) As Integer +#Else +Declare Function compress Lib "ZLIB32.DLL" + (ByVal compr As String, comprLen As Any, ByVal buf As + String, ByVal buflen As Long) As Integer +Declare Function uncompress Lib "ZLIB32.DLL" + (ByVal uncompr As String, uncomprLen As Any, ByVal compr As + String, ByVal lcompr As Long) As Long +Declare Function gzopen Lib "ZLIB32.DLL" + (ByVal file As String, ByVal mode As String) As Long +Declare Function gzread Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzwrite Lib "ZLIB32.DLL" + (ByVal file As Long, ByVal uncompr As String, ByVal + uncomprLen As Long) As Long +Declare Function gzclose Lib "ZLIB32.DLL" + (ByVal file As Long) As Long +#End If + +-Jon Caruana +jon-net@usa.net +Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member + + +Here is another example from Michael that he +says conforms to the VB guidelines, and that solves the problem of not +knowing the uncompressed size by storing it at the end of the file: + +'Calling the functions: +'bracket meaning: [optional] {Range of possible values} +'Call subCompressFile( [, , [level of compression {1..9}]]) +'Call subUncompressFile() + +Option Explicit +Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller' +Private Const SUCCESS As Long = 0 +Private Const strFilExt As String = ".cpr" +Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long, +ByVal level As Integer) As Long +Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef +dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) +As Long + +Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal +strargCprFilPth As String, Optional ByVal intLvl As Integer = 9) + Dim strCprPth As String + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim bytaryOri() As Byte + Dim bytaryCpr() As Byte + lngOriSiz = FileLen(strargOriFilPth) + ReDim bytaryOri(lngOriSiz - 1) + Open strargOriFilPth For Binary Access Read As #1 + Get #1, , bytaryOri() + Close #1 + strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth) +'Select file path and name + strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) = +strFilExt, "", strFilExt) 'Add file extension if not exists + lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit +more space then original file size + ReDim bytaryCpr(lngCprSiz - 1) + If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) = +SUCCESS Then + lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100 + ReDim Preserve bytaryCpr(lngCprSiz - 1) + Open strCprPth For Binary Access Write As #1 + Put #1, , bytaryCpr() + Put #1, , lngOriSiz 'Add the the original size value to the end +(last 4 bytes) + Close #1 + Else + MsgBox "Compression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub + +Public Sub subUncompressFile(ByVal strargFilPth As String) + Dim bytaryCpr() As Byte + Dim bytaryOri() As Byte + Dim lngOriSiz As Long + Dim lngCprSiz As Long + Dim strOriPth As String + lngCprSiz = FileLen(strargFilPth) + ReDim bytaryCpr(lngCprSiz - 1) + Open strargFilPth For Binary Access Read As #1 + Get #1, , bytaryCpr() + Close #1 + 'Read the original file size value: + lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _ + + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _ + + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _ + + bytaryCpr(lngCprSiz - 4) + ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value + ReDim bytaryOri(lngOriSiz - 1) + If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS +Then + strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt)) + Open strOriPth For Binary Access Write As #1 + Put #1, , bytaryOri() + Close #1 + Else + MsgBox "Uncompression error" + End If + Erase bytaryCpr + Erase bytaryOri +End Sub +Public Property Get lngPercentSmaller() As Long + lngPercentSmaller = lngpvtPcnSml +End Property diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/README.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/README.txt new file mode 100644 index 0000000000..3d0aef0a12 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/README.txt @@ -0,0 +1,73 @@ +Microsoft Developer Studio Project Files, Format Version 6.00 for zlib. + +Copyright (C) 2000-2004 Simon-Pierre Cadieux. +Copyright (C) 2004 Cosmin Truta. +For conditions of distribution and use, see copyright notice in zlib.h. + + +This project builds the zlib binaries as follows: + +* Win32_DLL_Release\zlib1.dll DLL build +* Win32_DLL_Debug\zlib1d.dll DLL build (debug version) +* Win32_DLL_ASM_Release\zlib1.dll DLL build using ASM code +* Win32_DLL_ASM_Debug\zlib1d.dll DLL build using ASM code (debug version) +* Win32_LIB_Release\zlib.lib static build +* Win32_LIB_Debug\zlibd.lib static build (debug version) +* Win32_LIB_ASM_Release\zlib.lib static build using ASM code +* Win32_LIB_ASM_Debug\zlibd.lib static build using ASM code (debug version) + + +For more information regarding the DLL builds, please see the DLL FAQ +in ..\..\win32\DLL_FAQ.txt. + + +To build and test: + +1) On the main menu, select "File | Open Workspace". + Open "zlib.dsw". + +2) Select "Build | Set Active Configuration". + Choose the configuration you wish to build. + +3) Select "Build | Clean". + +4) Select "Build | Build ... (F7)". Ignore warning messages about + not being able to find certain include files (e.g. alloc.h). + +5) If you built one of the sample programs (example or minigzip), + select "Build | Execute ... (Ctrl+F5)". + + +To use: + +1) Select "Project | Settings (Alt+F7)". + Make note of the configuration names used in your project. + Usually, these names are "Win32 Release" and "Win32 Debug". + +2) In the Workspace window, select the "FileView" tab. + Right-click on the root item "Workspace '...'". + Select "Insert Project into Workspace". + Switch on the checkbox "Dependency of:", and select the name + of your project. Open "zlib.dsp". + +3) Select "Build | Configurations". + For each configuration of your project: + 3.1) Choose the zlib configuration you wish to use. + 3.2) Click on "Add". + 3.3) Set the new zlib configuration name to the name used by + the configuration from the current iteration. + +4) Select "Build | Set Active Configuration". + Choose the configuration you wish to build. + +5) Select "Build | Build ... (F7)". + +6) If you built an executable program, select + "Build | Execute ... (Ctrl+F5)". + + +Note: + +To build the ASM-enabled code, you need Microsoft Assembler +(ML.EXE). You can get it by downloading and installing the +latest Processor Pack for Visual C++ 6.0. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/example.dsp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/example.dsp new file mode 100644 index 0000000000..2599efd269 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/example.dsp @@ -0,0 +1,278 @@ +# Microsoft Developer Studio Project File - Name="example" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=example - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "example.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "example.mak" CFG="example - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "example - Win32 DLL ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 DLL ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 DLL Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 DLL Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 LIB Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "example - Win32 DLL ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_DLL_ASM_Release" +# PROP BASE Intermediate_Dir "example___Win32_DLL_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_ASM_Release" +# PROP Intermediate_Dir "Win32_DLL_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 DLL ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_DLL_ASM_Debug" +# PROP BASE Intermediate_Dir "example___Win32_DLL_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_ASM_Debug" +# PROP Intermediate_Dir "Win32_DLL_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_DLL_Release" +# PROP BASE Intermediate_Dir "example___Win32_DLL_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_Release" +# PROP Intermediate_Dir "Win32_DLL_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_DLL_Debug" +# PROP BASE Intermediate_Dir "example___Win32_DLL_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_Debug" +# PROP Intermediate_Dir "Win32_DLL_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 LIB ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_LIB_ASM_Release" +# PROP BASE Intermediate_Dir "example___Win32_LIB_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_ASM_Release" +# PROP Intermediate_Dir "Win32_LIB_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 LIB ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_LIB_ASM_Debug" +# PROP BASE Intermediate_Dir "example___Win32_LIB_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_ASM_Debug" +# PROP Intermediate_Dir "Win32_LIB_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "example - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "example___Win32_LIB_Release" +# PROP BASE Intermediate_Dir "example___Win32_LIB_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_Release" +# PROP Intermediate_Dir "Win32_LIB_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "example___Win32_LIB_Debug" +# PROP BASE Intermediate_Dir "example___Win32_LIB_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_Debug" +# PROP Intermediate_Dir "Win32_LIB_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "example - Win32 DLL ASM Release" +# Name "example - Win32 DLL ASM Debug" +# Name "example - Win32 DLL Release" +# Name "example - Win32 DLL Debug" +# Name "example - Win32 LIB ASM Release" +# Name "example - Win32 LIB ASM Debug" +# Name "example - Win32 LIB Release" +# Name "example - Win32 LIB Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\example.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\zconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\zlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/minigzip.dsp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/minigzip.dsp new file mode 100644 index 0000000000..941582b7a7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/minigzip.dsp @@ -0,0 +1,278 @@ +# Microsoft Developer Studio Project File - Name="minigzip" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=minigzip - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "minigzip.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "minigzip.mak" CFG="minigzip - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "minigzip - Win32 DLL ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 DLL ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 DLL Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 DLL Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB ASM Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB ASM Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB Release" (based on "Win32 (x86) Console Application") +!MESSAGE "minigzip - Win32 LIB Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "minigzip - Win32 DLL ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_DLL_ASM_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_ASM_Release" +# PROP Intermediate_Dir "Win32_DLL_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 DLL ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_DLL_ASM_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_ASM_Debug" +# PROP Intermediate_Dir "Win32_DLL_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "minigzip - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_DLL_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_Release" +# PROP Intermediate_Dir "Win32_DLL_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_DLL_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_DLL_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_Debug" +# PROP Intermediate_Dir "Win32_DLL_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_LIB_ASM_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_ASM_Release" +# PROP Intermediate_Dir "Win32_LIB_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_LIB_ASM_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_ASM_Debug" +# PROP Intermediate_Dir "Win32_LIB_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "minigzip___Win32_LIB_Release" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_Release" +# PROP Intermediate_Dir "Win32_LIB_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "minigzip - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minigzip___Win32_LIB_Debug" +# PROP BASE Intermediate_Dir "minigzip___Win32_LIB_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_Debug" +# PROP Intermediate_Dir "Win32_LIB_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "minigzip - Win32 DLL ASM Release" +# Name "minigzip - Win32 DLL ASM Debug" +# Name "minigzip - Win32 DLL Release" +# Name "minigzip - Win32 DLL Debug" +# Name "minigzip - Win32 LIB ASM Release" +# Name "minigzip - Win32 LIB ASM Debug" +# Name "minigzip - Win32 LIB Release" +# Name "minigzip - Win32 LIB Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\minigzip.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\zconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\zlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/zlib.dsp b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/zlib.dsp new file mode 100644 index 0000000000..34f1f3000f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/zlib.dsp @@ -0,0 +1,621 @@ +# Microsoft Developer Studio Project File - Name="zlib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=zlib - Win32 LIB Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "zlib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "zlib.mak" CFG="zlib - Win32 LIB Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "zlib - Win32 DLL ASM Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 DLL ASM Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 DLL Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 DLL Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "zlib - Win32 LIB ASM Release" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 LIB ASM Debug" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 LIB Release" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 LIB Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_DLL_ASM_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_ASM_Release" +# PROP Intermediate_Dir "Win32_DLL_ASM_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /D "ASMV" /D "ASMINF" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 /nologo /dll /machine:I386 /out:"Win32_DLL_ASM_Release\zlib1.dll" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_DLL_ASM_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_ASM_Debug" +# PROP Intermediate_Dir "Win32_DLL_ASM_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /D "ASMV" /D "ASMINF" /FR /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /dll /debug /machine:I386 /out:"Win32_DLL_ASM_Debug\zlib1d.dll" /pdbtype:sept + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_DLL_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_DLL_Release" +# PROP Intermediate_Dir "Win32_DLL_Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 /nologo /dll /machine:I386 /out:"Win32_DLL_Release\zlib1.dll" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_DLL_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_DLL_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_DLL_Debug" +# PROP Intermediate_Dir "Win32_DLL_Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +MTL=midl.exe +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /dll /debug /machine:I386 /out:"Win32_DLL_Debug\zlib1d.dll" /pdbtype:sept + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_LIB_ASM_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_ASM_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_ASM_Release" +# PROP Intermediate_Dir "Win32_LIB_ASM_Release" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /D "ASMV" /D "ASMINF" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_LIB_ASM_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_ASM_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_ASM_Debug" +# PROP Intermediate_Dir "Win32_LIB_ASM_Debug" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /D "ASMV" /D "ASMINF" /FR /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"Win32_LIB_ASM_Debug\zlibd.lib" + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "zlib___Win32_LIB_Release" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Win32_LIB_Release" +# PROP Intermediate_Dir "Win32_LIB_Release" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /FD /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "NDEBUG" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "zlib___Win32_LIB_Debug" +# PROP BASE Intermediate_Dir "zlib___Win32_LIB_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Win32_LIB_Debug" +# PROP Intermediate_Dir "Win32_LIB_Debug" +# PROP Target_Dir "" +CPP=cl.exe +# ADD BASE CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /FD /GZ /c +# SUBTRACT BASE CPP /YX /Yc /Yu +# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /D "WIN32" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "_DEBUG" /FR /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +RSC=rc.exe +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"Win32_LIB_Debug\zlibd.lib" + +!ENDIF + +# Begin Target + +# Name "zlib - Win32 DLL ASM Release" +# Name "zlib - Win32 DLL ASM Debug" +# Name "zlib - Win32 DLL Release" +# Name "zlib - Win32 DLL Debug" +# Name "zlib - Win32 LIB ASM Release" +# Name "zlib - Win32 LIB ASM Debug" +# Name "zlib - Win32 LIB Release" +# Name "zlib - Win32 LIB Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\adler32.c +# End Source File +# Begin Source File + +SOURCE=..\..\compress.c +# End Source File +# Begin Source File + +SOURCE=..\..\crc32.c +# End Source File +# Begin Source File + +SOURCE=..\..\deflate.c +# End Source File +# Begin Source File + +SOURCE=..\..\gzclose.c +# End Source File +# Begin Source File + +SOURCE=..\..\gzlib.c +# End Source File +# Begin Source File + +SOURCE=..\..\gzread.c +# End Source File +# Begin Source File + +SOURCE=..\..\gzwrite.c +# End Source File +# Begin Source File + +SOURCE=..\..\infback.c +# End Source File +# Begin Source File + +SOURCE=..\..\inffast.c +# End Source File +# Begin Source File + +SOURCE=..\..\inflate.c +# End Source File +# Begin Source File + +SOURCE=..\..\inftrees.c +# End Source File +# Begin Source File + +SOURCE=..\..\trees.c +# End Source File +# Begin Source File + +SOURCE=..\..\uncompr.c +# End Source File +# Begin Source File + +SOURCE=..\..\win32\zlib.def + +!IF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Release" + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\zutil.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\crc32.h +# End Source File +# Begin Source File + +SOURCE=..\..\deflate.h +# End Source File +# Begin Source File + +SOURCE=..\..\inffast.h +# End Source File +# Begin Source File + +SOURCE=..\..\inffixed.h +# End Source File +# Begin Source File + +SOURCE=..\..\inflate.h +# End Source File +# Begin Source File + +SOURCE=..\..\inftrees.h +# End Source File +# Begin Source File + +SOURCE=..\..\trees.h +# End Source File +# Begin Source File + +SOURCE=..\..\zconf.h +# End Source File +# Begin Source File + +SOURCE=..\..\zlib.h +# End Source File +# Begin Source File + +SOURCE=..\..\zutil.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=..\..\win32\zlib1.rc +# End Source File +# End Group +# Begin Group "Assembler Files (Unsupported)" + +# PROP Default_Filter "asm;obj;c;cpp;cxx;h;hpp;hxx" +# Begin Source File + +SOURCE=..\..\contrib\masmx86\gvmat32.asm + +!IF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Release +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Debug +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Release +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Debug +InputPath=..\..\contrib\masmx86\gvmat32.asm +InputName=gvmat32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\contrib\masmx86\gvmat32c.c + +!IF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 +# ADD CPP /I "..\.." + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\..\contrib\masmx86\inffas32.asm + +!IF "$(CFG)" == "zlib - Win32 DLL ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Release +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_DLL_ASM_Debug +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 DLL Debug" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Release" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Release +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB ASM Debug" + +# Begin Custom Build - Assembling... +IntDir=.\Win32_LIB_ASM_Debug +InputPath=..\..\contrib\masmx86\inffas32.asm +InputName=inffas32 + +"$(IntDir)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + ml.exe /nologo /c /coff /Cx /Zi /Fo"$(IntDir)\$(InputName).obj" "$(InputPath)" + +# End Custom Build + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Release" + +# PROP Exclude_From_Build 1 + +!ELSEIF "$(CFG)" == "zlib - Win32 LIB Debug" + +# PROP Exclude_From_Build 1 + +!ENDIF + +# End Source File +# End Group +# Begin Source File + +SOURCE=.\README.txt +# End Source File +# End Target +# End Project diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/zlib.dsw b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/zlib.dsw new file mode 100644 index 0000000000..2644856efa --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/old/visualc6/zlib.dsw @@ -0,0 +1,59 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "example"=.\example.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "minigzip"=.\minigzip.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "zlib"=.\zlib.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/qnx/package.qpg b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/qnx/package.qpg new file mode 100644 index 0000000000..2bc63b21ac --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/qnx/package.qpg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Library + + Medium + + 2.0 + + + + zlib + zlib + alain.bonnefoy@icbt.com + Public + public + www.gzip.org/zlib + + + Jean-Loup Gailly,Mark Adler + www.gzip.org/zlib + + zlib@gzip.org + + + A massively spiffy yet delicately unobtrusive compression library. + zlib is designed to be a free, general-purpose, legally unencumbered, lossless data compression library for use on virtually any computer hardware and operating system. + http://www.gzip.org/zlib + + + + + 1.2.5 + Medium + Stable + + + + + + + No License + + + + Software Development/Libraries and Extensions/C Libraries + zlib,compression + qnx6 + qnx6 + None + Developer + + + + + + + + + + + + + + Install + Post + No + Ignore + + No + Optional + + + + + + + + + + + + + InstallOver + zlib + + + + + + + + + + + + + InstallOver + zlib-dev + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/treebuild.xml b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/treebuild.xml new file mode 100644 index 0000000000..6b8f5428d4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/treebuild.xml @@ -0,0 +1,116 @@ + + + + zip compression library + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/trees.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/trees.c new file mode 100644 index 0000000000..56e9bb1c11 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/trees.c @@ -0,0 +1,1244 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2010 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {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}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {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}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local int detect_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (ush)value << s->bi_valid; + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= (ush)value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (ush)val << s->bi_valid;\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void ZLIB_INTERNAL _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void ZLIB_INTERNAL _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int last; /* one if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, last); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+last, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+last, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*last)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int ZLIB_INTERNAL _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(s) + deflate_state *s; +{ + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/trees.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/trees.h new file mode 100644 index 0000000000..d35639d82a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 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}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 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}} +}; + +const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { + 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 +}; + +const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { + 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 +}; + +local const int base_length[LENGTH_CODES] = { +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 +}; + +local const int base_dist[D_CODES] = { + 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 +}; + diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/uncompr.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/uncompr.c new file mode 100644 index 0000000000..ad98be3a5d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/uncompr.c @@ -0,0 +1,59 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/watcom/watcom_f.mak b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/watcom/watcom_f.mak new file mode 100644 index 0000000000..37f4d74c19 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/watcom/watcom_f.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom flat model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_f.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc386 +LINKER = wcl386 +CFLAGS = -zq -mf -3r -fp3 -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_f.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -ldos32a -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -ldos32a -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/watcom/watcom_l.mak b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/watcom/watcom_l.mak new file mode 100644 index 0000000000..193eed7b31 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/watcom/watcom_l.mak @@ -0,0 +1,43 @@ +# Makefile for zlib +# OpenWatcom large model +# Last updated: 28-Dec-2005 + +# To use, do "wmake -f watcom_l.mak" + +C_SOURCE = adler32.c compress.c crc32.c deflate.c & + gzclose.c gzlib.c gzread.c gzwrite.c & + infback.c inffast.c inflate.c inftrees.c & + trees.c uncompr.c zutil.c + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj & + gzclose.obj gzlib.obj gzread.obj gzwrite.obj & + infback.obj inffast.obj inflate.obj inftrees.obj & + trees.obj uncompr.obj zutil.obj + +CC = wcc +LINKER = wcl +CFLAGS = -zq -ml -s -bt=dos -oilrtfm -fr=nul -wx +ZLIB_LIB = zlib_l.lib + +.C.OBJ: + $(CC) $(CFLAGS) $[@ + +all: $(ZLIB_LIB) example.exe minigzip.exe + +$(ZLIB_LIB): $(OBJS) + wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj + wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj + wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj + wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj + wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj + +example.exe: $(ZLIB_LIB) example.obj + $(LINKER) -fe=example.exe example.obj $(ZLIB_LIB) + +minigzip.exe: $(ZLIB_LIB) minigzip.obj + $(LINKER) -fe=minigzip.exe minigzip.obj $(ZLIB_LIB) + +clean: .SYMBOLIC + del *.obj + del $(ZLIB_LIB) + @echo Cleaning done diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/DLL_FAQ.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/DLL_FAQ.txt new file mode 100644 index 0000000000..12c009018c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/DLL_FAQ.txt @@ -0,0 +1,397 @@ + + Frequently Asked Questions about ZLIB1.DLL + + +This document describes the design, the rationale, and the usage +of the official DLL build of zlib, named ZLIB1.DLL. If you have +general questions about zlib, you should see the file "FAQ" found +in the zlib distribution, or at the following location: + http://www.gzip.org/zlib/zlib_faq.html + + + 1. What is ZLIB1.DLL, and how can I get it? + + - ZLIB1.DLL is the official build of zlib as a DLL. + (Please remark the character '1' in the name.) + + Pointers to a precompiled ZLIB1.DLL can be found in the zlib + web site at: + http://www.zlib.net/ + + Applications that link to ZLIB1.DLL can rely on the following + specification: + + * The exported symbols are exclusively defined in the source + files "zlib.h" and "zlib.def", found in an official zlib + source distribution. + * The symbols are exported by name, not by ordinal. + * The exported names are undecorated. + * The calling convention of functions is "C" (CDECL). + * The ZLIB1.DLL binary is linked to MSVCRT.DLL. + + The archive in which ZLIB1.DLL is bundled contains compiled + test programs that must run with a valid build of ZLIB1.DLL. + It is recommended to download the prebuilt DLL from the zlib + web site, instead of building it yourself, to avoid potential + incompatibilities that could be introduced by your compiler + and build settings. If you do build the DLL yourself, please + make sure that it complies with all the above requirements, + and it runs with the precompiled test programs, bundled with + the original ZLIB1.DLL distribution. + + If, for any reason, you need to build an incompatible DLL, + please use a different file name. + + + 2. Why did you change the name of the DLL to ZLIB1.DLL? + What happened to the old ZLIB.DLL? + + - The old ZLIB.DLL, built from zlib-1.1.4 or earlier, required + compilation settings that were incompatible to those used by + a static build. The DLL settings were supposed to be enabled + by defining the macro ZLIB_DLL, before including "zlib.h". + Incorrect handling of this macro was silently accepted at + build time, resulting in two major problems: + + * ZLIB_DLL was missing from the old makefile. When building + the DLL, not all people added it to the build options. In + consequence, incompatible incarnations of ZLIB.DLL started + to circulate around the net. + + * When switching from using the static library to using the + DLL, applications had to define the ZLIB_DLL macro and + to recompile all the sources that contained calls to zlib + functions. Failure to do so resulted in creating binaries + that were unable to run with the official ZLIB.DLL build. + + The only possible solution that we could foresee was to make + a binary-incompatible change in the DLL interface, in order to + remove the dependency on the ZLIB_DLL macro, and to release + the new DLL under a different name. + + We chose the name ZLIB1.DLL, where '1' indicates the major + zlib version number. We hope that we will not have to break + the binary compatibility again, at least not as long as the + zlib-1.x series will last. + + There is still a ZLIB_DLL macro, that can trigger a more + efficient build and use of the DLL, but compatibility no + longer dependents on it. + + + 3. Can I build ZLIB.DLL from the new zlib sources, and replace + an old ZLIB.DLL, that was built from zlib-1.1.4 or earlier? + + - In principle, you can do it by assigning calling convention + keywords to the macros ZEXPORT and ZEXPORTVA. In practice, + it depends on what you mean by "an old ZLIB.DLL", because the + old DLL exists in several mutually-incompatible versions. + You have to find out first what kind of calling convention is + being used in your particular ZLIB.DLL build, and to use the + same one in the new build. If you don't know what this is all + about, you might be better off if you would just leave the old + DLL intact. + + + 4. Can I compile my application using the new zlib interface, and + link it to an old ZLIB.DLL, that was built from zlib-1.1.4 or + earlier? + + - The official answer is "no"; the real answer depends again on + what kind of ZLIB.DLL you have. Even if you are lucky, this + course of action is unreliable. + + If you rebuild your application and you intend to use a newer + version of zlib (post- 1.1.4), it is strongly recommended to + link it to the new ZLIB1.DLL. + + + 5. Why are the zlib symbols exported by name, and not by ordinal? + + - Although exporting symbols by ordinal is a little faster, it + is risky. Any single glitch in the maintenance or use of the + DEF file that contains the ordinals can result in incompatible + builds and frustrating crashes. Simply put, the benefits of + exporting symbols by ordinal do not justify the risks. + + Technically, it should be possible to maintain ordinals in + the DEF file, and still export the symbols by name. Ordinals + exist in every DLL, and even if the dynamic linking performed + at the DLL startup is searching for names, ordinals serve as + hints, for a faster name lookup. However, if the DEF file + contains ordinals, the Microsoft linker automatically builds + an implib that will cause the executables linked to it to use + those ordinals, and not the names. It is interesting to + notice that the GNU linker for Win32 does not suffer from this + problem. + + It is possible to avoid the DEF file if the exported symbols + are accompanied by a "__declspec(dllexport)" attribute in the + source files. You can do this in zlib by predefining the + ZLIB_DLL macro. + + + 6. I see that the ZLIB1.DLL functions use the "C" (CDECL) calling + convention. Why not use the STDCALL convention? + STDCALL is the standard convention in Win32, and I need it in + my Visual Basic project! + + (For readability, we use CDECL to refer to the convention + triggered by the "__cdecl" keyword, STDCALL to refer to + the convention triggered by "__stdcall", and FASTCALL to + refer to the convention triggered by "__fastcall".) + + - Most of the native Windows API functions (without varargs) use + indeed the WINAPI convention (which translates to STDCALL in + Win32), but the standard C functions use CDECL. If a user + application is intrinsically tied to the Windows API (e.g. + it calls native Windows API functions such as CreateFile()), + sometimes it makes sense to decorate its own functions with + WINAPI. But if ANSI C or POSIX portability is a goal (e.g. + it calls standard C functions such as fopen()), it is not a + sound decision to request the inclusion of , or to + use non-ANSI constructs, for the sole purpose to make the user + functions STDCALL-able. + + The functionality offered by zlib is not in the category of + "Windows functionality", but is more like "C functionality". + + Technically, STDCALL is not bad; in fact, it is slightly + faster than CDECL, and it works with variable-argument + functions, just like CDECL. It is unfortunate that, in spite + of using STDCALL in the Windows API, it is not the default + convention used by the C compilers that run under Windows. + The roots of the problem reside deep inside the unsafety of + the K&R-style function prototypes, where the argument types + are not specified; but that is another story for another day. + + The remaining fact is that CDECL is the default convention. + Even if an explicit convention is hard-coded into the function + prototypes inside C headers, problems may appear. The + necessity to expose the convention in users' callbacks is one + of these problems. + + The calling convention issues are also important when using + zlib in other programming languages. Some of them, like Ada + (GNAT) and Fortran (GNU G77), have C bindings implemented + initially on Unix, and relying on the C calling convention. + On the other hand, the pre- .NET versions of Microsoft Visual + Basic require STDCALL, while Borland Delphi prefers, although + it does not require, FASTCALL. + + In fairness to all possible uses of zlib outside the C + programming language, we choose the default "C" convention. + Anyone interested in different bindings or conventions is + encouraged to maintain specialized projects. The "contrib/" + directory from the zlib distribution already holds a couple + of foreign bindings, such as Ada, C++, and Delphi. + + + 7. I need a DLL for my Visual Basic project. What can I do? + + - Define the ZLIB_WINAPI macro before including "zlib.h", when + building both the DLL and the user application (except that + you don't need to define anything when using the DLL in Visual + Basic). The ZLIB_WINAPI macro will switch on the WINAPI + (STDCALL) convention. The name of this DLL must be different + than the official ZLIB1.DLL. + + Gilles Vollant has contributed a build named ZLIBWAPI.DLL, + with the ZLIB_WINAPI macro turned on, and with the minizip + functionality built in. For more information, please read + the notes inside "contrib/vstudio/readme.txt", found in the + zlib distribution. + + + 8. I need to use zlib in my Microsoft .NET project. What can I + do? + + - Henrik Ravn has contributed a .NET wrapper around zlib. Look + into contrib/dotzlib/, inside the zlib distribution. + + + 9. If my application uses ZLIB1.DLL, should I link it to + MSVCRT.DLL? Why? + + - It is not required, but it is recommended to link your + application to MSVCRT.DLL, if it uses ZLIB1.DLL. + + The executables (.EXE, .DLL, etc.) that are involved in the + same process and are using the C run-time library (i.e. they + are calling standard C functions), must link to the same + library. There are several libraries in the Win32 system: + CRTDLL.DLL, MSVCRT.DLL, the static C libraries, etc. + Since ZLIB1.DLL is linked to MSVCRT.DLL, the executables that + depend on it should also be linked to MSVCRT.DLL. + + +10. Why are you saying that ZLIB1.DLL and my application should + be linked to the same C run-time (CRT) library? I linked my + application and my DLLs to different C libraries (e.g. my + application to a static library, and my DLLs to MSVCRT.DLL), + and everything works fine. + + - If a user library invokes only pure Win32 API (accessible via + and the related headers), its DLL build will work + in any context. But if this library invokes standard C API, + things get more complicated. + + There is a single Win32 library in a Win32 system. Every + function in this library resides in a single DLL module, that + is safe to call from anywhere. On the other hand, there are + multiple versions of the C library, and each of them has its + own separate internal state. Standalone executables and user + DLLs that call standard C functions must link to a C run-time + (CRT) library, be it static or shared (DLL). Intermixing + occurs when an executable (not necessarily standalone) and a + DLL are linked to different CRTs, and both are running in the + same process. + + Intermixing multiple CRTs is possible, as long as their + internal states are kept intact. The Microsoft Knowledge Base + articles KB94248 "HOWTO: Use the C Run-Time" and KB140584 + "HOWTO: Link with the Correct C Run-Time (CRT) Library" + mention the potential problems raised by intermixing. + + If intermixing works for you, it's because your application + and DLLs are avoiding the corruption of each of the CRTs' + internal states, maybe by careful design, or maybe by fortune. + + Also note that linking ZLIB1.DLL to non-Microsoft CRTs, such + as those provided by Borland, raises similar problems. + + +11. Why are you linking ZLIB1.DLL to MSVCRT.DLL? + + - MSVCRT.DLL exists on every Windows 95 with a new service pack + installed, or with Microsoft Internet Explorer 4 or later, and + on all other Windows 4.x or later (Windows 98, Windows NT 4, + or later). It is freely distributable; if not present in the + system, it can be downloaded from Microsoft or from other + software provider for free. + + The fact that MSVCRT.DLL does not exist on a virgin Windows 95 + is not so problematic. Windows 95 is scarcely found nowadays, + Microsoft ended its support a long time ago, and many recent + applications from various vendors, including Microsoft, do not + even run on it. Furthermore, no serious user should run + Windows 95 without a proper update installed. + + +12. Why are you not linking ZLIB1.DLL to + <> ? + + - We considered and abandoned the following alternatives: + + * Linking ZLIB1.DLL to a static C library (LIBC.LIB, or + LIBCMT.LIB) is not a good option. People are using the DLL + mainly to save disk space. If you are linking your program + to a static C library, you may as well consider linking zlib + in statically, too. + + * Linking ZLIB1.DLL to CRTDLL.DLL looks appealing, because + CRTDLL.DLL is present on every Win32 installation. + Unfortunately, it has a series of problems: it does not + work properly with Microsoft's C++ libraries, it does not + provide support for 64-bit file offsets, (and so on...), + and Microsoft discontinued its support a long time ago. + + * Linking ZLIB1.DLL to MSVCR70.DLL or MSVCR71.DLL, supplied + with the Microsoft .NET platform, and Visual C++ 7.0/7.1, + raises problems related to the status of ZLIB1.DLL as a + system component. According to the Microsoft Knowledge Base + article KB326922 "INFO: Redistribution of the Shared C + Runtime Component in Visual C++ .NET", MSVCR70.DLL and + MSVCR71.DLL are not supposed to function as system DLLs, + because they may clash with MSVCRT.DLL. Instead, the + application's installer is supposed to put these DLLs + (if needed) in the application's private directory. + If ZLIB1.DLL depends on a non-system runtime, it cannot + function as a redistributable system component. + + * Linking ZLIB1.DLL to non-Microsoft runtimes, such as + Borland's, or Cygwin's, raises problems related to the + reliable presence of these runtimes on Win32 systems. + It's easier to let the DLL build of zlib up to the people + who distribute these runtimes, and who may proceed as + explained in the answer to Question 14. + + +13. If ZLIB1.DLL cannot be linked to MSVCR70.DLL or MSVCR71.DLL, + how can I build/use ZLIB1.DLL in Microsoft Visual C++ 7.0 + (Visual Studio .NET) or newer? + + - Due to the problems explained in the Microsoft Knowledge Base + article KB326922 (see the previous answer), the C runtime that + comes with the VC7 environment is no longer considered a + system component. That is, it should not be assumed that this + runtime exists, or may be installed in a system directory. + Since ZLIB1.DLL is supposed to be a system component, it may + not depend on a non-system component. + + In order to link ZLIB1.DLL and your application to MSVCRT.DLL + in VC7, you need the library of Visual C++ 6.0 or older. If + you don't have this library at hand, it's probably best not to + use ZLIB1.DLL. + + We are hoping that, in the future, Microsoft will provide a + way to build applications linked to a proper system runtime, + from the Visual C++ environment. Until then, you have a + couple of alternatives, such as linking zlib in statically. + If your application requires dynamic linking, you may proceed + as explained in the answer to Question 14. + + +14. I need to link my own DLL build to a CRT different than + MSVCRT.DLL. What can I do? + + - Feel free to rebuild the DLL from the zlib sources, and link + it the way you want. You should, however, clearly state that + your build is unofficial. You should give it a different file + name, and/or install it in a private directory that can be + accessed by your application only, and is not visible to the + others (i.e. it's neither in the PATH, nor in the SYSTEM or + SYSTEM32 directories). Otherwise, your build may clash with + applications that link to the official build. + + For example, in Cygwin, zlib is linked to the Cygwin runtime + CYGWIN1.DLL, and it is distributed under the name CYGZ.DLL. + + +15. May I include additional pieces of code that I find useful, + link them in ZLIB1.DLL, and export them? + + - No. A legitimate build of ZLIB1.DLL must not include code + that does not originate from the official zlib source code. + But you can make your own private DLL build, under a different + file name, as suggested in the previous answer. + + For example, zlib is a part of the VCL library, distributed + with Borland Delphi and C++ Builder. The DLL build of VCL + is a redistributable file, named VCLxx.DLL. + + +16. May I remove some functionality out of ZLIB1.DLL, by enabling + macros like NO_GZCOMPRESS or NO_GZIP at compile time? + + - No. A legitimate build of ZLIB1.DLL must provide the complete + zlib functionality, as implemented in the official zlib source + code. But you can make your own private DLL build, under a + different file name, as suggested in the previous answer. + + +17. I made my own ZLIB1.DLL build. Can I test it for compliance? + + - We prefer that you download the official DLL from the zlib + web site. If you need something peculiar from this DLL, you + can send your suggestion to the zlib mailing list. + + However, in case you do rebuild the DLL yourself, you can run + it with the test programs found in the DLL distribution. + Running these test programs is not a guarantee of compliance, + but a failure can imply a detected problem. + +** + +This document is written and maintained by +Cosmin Truta diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.bor b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.bor new file mode 100644 index 0000000000..3981d4246b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.bor @@ -0,0 +1,110 @@ +# Makefile for zlib +# Borland C++ for Win32 +# +# Usage: +# make -f win32/Makefile.bor +# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj + +# ------------ Borland C++ ------------ + +# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7) +# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or +# added to the declaration of LOC here: +LOC = $(LOCAL_ZLIB) + +CC = bcc32 +AS = bcc32 +LD = bcc32 +AR = tlib +CFLAGS = -a -d -k- -O2 $(LOC) +ASFLAGS = $(LOC) +LDFLAGS = $(LOC) + + +# variables +ZLIB_LIB = zlib.lib + +OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj +OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +#OBJA = +OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj +OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj +#OBJPA= + + +# targets +all: $(ZLIB_LIB) example.exe minigzip.exe + +.c.obj: + $(CC) -c $(CFLAGS) $< + +.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + + +# For the sake of the old Borland make, +# the command line is cut to fit in the MS-DOS 128 byte limit: +$(ZLIB_LIB): $(OBJ1) $(OBJ2) $(OBJA) + -del $(ZLIB_LIB) + $(AR) $(ZLIB_LIB) $(OBJP1) + $(AR) $(ZLIB_LIB) $(OBJP2) + $(AR) $(ZLIB_LIB) $(OBJPA) + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +example.exe: example.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB) + +minigzip.exe: minigzip.obj $(ZLIB_LIB) + $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB) + + +# cleanup +clean: + -del $(ZLIB_LIB) + -del *.obj + -del *.exe + -del *.tds + -del zlib.bak + -del foo.gz diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.emx b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.emx new file mode 100644 index 0000000000..4d6ab0efa6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.emx @@ -0,0 +1,69 @@ +# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98. +# Copyright (C) 1995-1998 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.emx; make test -fmakefile.emx +# + +CC=gcc -Zwin32 + +#CFLAGS=-MMD -O +#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7 +#CFLAGS=-MMD -g -DDEBUG +CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes + +# If cp.exe is available, replace "copy /Y" with "cp -fp" . +CP=copy /Y +# If gnu install.exe is available, replace $(CP) with ginstall. +INSTALL=$(CP) +# The default value of RM is "rm -f." If "rm.exe" is found, comment out: +RM=del +LDLIBS=-L. -lzlib +LD=$(CC) -s -o +LDSHARED=$(CC) + +INCL=zlib.h zconf.h +LIBS=zlib.a + +AR=ar rcs + +prefix=/usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o + +TEST_OBJS = example.o minigzip.o + +all: example.exe minigzip.exe + +test: all + ./example + echo hello world | .\minigzip | .\minigzip -d + +%.o : %.c + $(CC) $(CFLAGS) -c $< -o $@ + +zlib.a: $(OBJS) + $(AR) $@ $(OBJS) + +%.exe : %.o $(LIBS) + $(LD) $@ $< $(LDLIBS) + + +.PHONY : clean + +clean: + $(RM) *.d + $(RM) *.o + $(RM) *.exe + $(RM) zlib.a + $(RM) foo.gz + +DEPS := $(wildcard *.d) +ifneq ($(DEPS),) +include $(DEPS) +endif diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.gcc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.gcc new file mode 100644 index 0000000000..0a33bf6a70 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.gcc @@ -0,0 +1,164 @@ +# Makefile for zlib, derived from Makefile.dj2. +# Modified for mingw32 by C. Spieler, 6/16/98. +# Updated for zlib 1.2.x by Christian Spieler and Cosmin Truta, Mar-2003. +# Last updated: 1-Aug-2003. +# Tested under Cygwin and MinGW. + +# Copyright (C) 1995-2003 Jean-loup Gailly. +# For conditions of distribution and use, see copyright notice in zlib.h + +# To compile, or to compile and test, type: +# +# make -fmakefile.gcc; make test testdll -fmakefile.gcc +# +# To use the asm code, type: +# cp contrib/asm?86/match.S ./match.S +# make LOC=-DASMV OBJA=match.o -fmakefile.gcc +# +# To install libz.a, zconf.h and zlib.h in the system directories, type: +# +# make install -fmakefile.gcc + +# Note: +# If the platform is *not* MinGW (e.g. it is Cygwin or UWIN), +# the DLL name should be changed from "zlib1.dll". + +STATICLIB = libz.a +SHAREDLIB = zlib1.dll +IMPLIB = libzdll.a + +# +# Set to 1 if shared object needs to be installed +# +SHARED_MODE=0 + +#LOC = -DASMV +#LOC = -DDEBUG -g + +PREFIX = +CC = $(PREFIX)gcc +CFLAGS = $(LOC) -O3 -Wall +EXTRA_CFLAGS = -DNO_VIZ + +AS = $(CC) +ASFLAGS = $(LOC) -Wall + +LD = $(CC) +LDFLAGS = $(LOC) + +AR = $(PREFIX)ar +ARFLAGS = rcs + +RC = $(PREFIX)windres +RCFLAGS = --define GCC_WINDRES + +STRIP = $(PREFIX)strip + +CP = cp -fp +# If GNU install is available, replace $(CP) with install. +INSTALL = $(CP) +RM = rm -f + +prefix = /usr/local +exec_prefix = $(prefix) + +OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \ + gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o +OBJA = + +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) example.exe minigzip.exe example_d.exe minigzip_d.exe + +test: example.exe minigzip.exe + ./example + echo hello world | ./minigzip | ./minigzip -d + +testdll: example_d.exe minigzip_d.exe + ./example_d + echo hello world | ./minigzip_d | ./minigzip_d -d + +.c.o: + $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< + +.S.o: + $(AS) $(ASFLAGS) -c -o $@ $< + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) $@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(CC) -shared -Wl,--out-implib,$(IMPLIB) $(LDFLAGS) \ + -o $@ win32/zlib.def $(OBJS) $(OBJA) zlibrc.o + $(STRIP) $@ + +example.exe: example.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(STATICLIB) + $(STRIP) $@ + +minigzip.exe: minigzip.o $(STATICLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(STATICLIB) + $(STRIP) $@ + +example_d.exe: example.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ example.o $(IMPLIB) + $(STRIP) $@ + +minigzip_d.exe: minigzip.o $(IMPLIB) + $(LD) $(LDFLAGS) -o $@ minigzip.o $(IMPLIB) + $(STRIP) $@ + +zlibrc.o: win32/zlib1.rc + $(RC) $(RCFLAGS) -o $@ win32/zlib1.rc + + +# BINARY_PATH, INCLUDE_PATH and LIBRARY_PATH must be set. + +.PHONY: install uninstall clean + +install: zlib.h zconf.h $(STATICLIB) $(IMPLIB) + -@mkdir -p $(INCLUDE_PATH) + -@mkdir -p $(LIBRARY_PATH) + -if [ "$(SHARED_MODE)" = "1" ]; then \ + mkdir -p $(BINARY_PATH); \ + $(INSTALL) $(SHAREDLIB) $(BINARY_PATH); \ + $(INSTALL) $(IMPLIB) $(LIBRARY_PATH); \ + fi + -$(INSTALL) zlib.h $(INCLUDE_PATH) + -$(INSTALL) zconf.h $(INCLUDE_PATH) + -$(INSTALL) $(STATICLIB) $(LIBRARY_PATH) + +uninstall: + -if [ "$(SHARED_MODE)" = "1" ]; then \ + $(RM) $(BINARY_PATH)/$(SHAREDLIB); \ + $(RM) $(LIBRARY_PATH)/$(IMPLIB); \ + fi + -$(RM) $(INCLUDE_PATH)/zlib.h + -$(RM) $(INCLUDE_PATH)/zconf.h + -$(RM) $(LIBRARY_PATH)/$(STATICLIB) + +clean: + -$(RM) $(STATICLIB) + -$(RM) $(SHAREDLIB) + -$(RM) $(IMPLIB) + -$(RM) *.o + -$(RM) *.exe + -$(RM) foo.gz + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: crc32.h zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +example.o: zlib.h zconf.h +gzclose.o: zlib.h zconf.h gzguts.h +gzlib.o: zlib.h zconf.h gzguts.h +gzread.o: zlib.h zconf.h gzguts.h +gzwrite.o: zlib.h zconf.h gzguts.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +minigzip.o: zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +uncompr.o: zlib.h zconf.h +zutil.o: zutil.h zlib.h zconf.h diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.msc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.msc new file mode 100644 index 0000000000..fa10a1aa5f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/Makefile.msc @@ -0,0 +1,157 @@ +# Makefile for zlib using Microsoft (Visual) C +# zlib is copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler +# +# Usage: +# nmake -f win32/Makefile.msc (standard build) +# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) +# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ +# OBJA="inffas32.obj match686.obj" (use ASM code, x86) +# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF" \ +# OBJA="inffasx64.obj gvmat64.obj inffas8664.c" (use ASM code, x64) + +# optional build flags +LOC = + +# variables +STATICLIB = zlib.lib +SHAREDLIB = zlib1.dll +IMPLIB = zdll.lib + +CC = cl +AS = ml +LD = link +AR = lib +RC = rc +CFLAGS = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC) +WFLAGS = -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE +ASFLAGS = -coff -Zi $(LOC) +LDFLAGS = -nologo -debug -incremental:no -opt:ref +ARFLAGS = -nologo +RCFLAGS = /dWIN32 /r + +OBJS = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj \ + gzwrite.obj infback.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj +OBJA = + + +# targets +all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \ + example.exe minigzip.exe example_d.exe minigzip_d.exe + +$(STATICLIB): $(OBJS) $(OBJA) + $(AR) $(ARFLAGS) -out:$@ $(OBJS) $(OBJA) + +$(IMPLIB): $(SHAREDLIB) + +$(SHAREDLIB): win32/zlib.def $(OBJS) $(OBJA) zlib1.res + $(LD) $(LDFLAGS) -def:win32/zlib.def -dll -implib:$(IMPLIB) \ + -out:$@ -base:0x5A4C0000 $(OBJS) $(OBJA) zlib1.res + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;2 + +example.exe: example.obj $(STATICLIB) + $(LD) $(LDFLAGS) example.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip.exe: minigzip.obj $(STATICLIB) + $(LD) $(LDFLAGS) minigzip.obj $(STATICLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +example_d.exe: example.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ example.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +minigzip_d.exe: minigzip.obj $(IMPLIB) + $(LD) $(LDFLAGS) -out:$@ minigzip.obj $(IMPLIB) + if exist $@.manifest \ + mt -nologo -manifest $@.manifest -outputresource:$@;1 + +.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{contrib/masmx64}.c.obj: + $(CC) -c $(WFLAGS) $(CFLAGS) $< + +{contrib/masmx64}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +{contrib/masmx86}.asm.obj: + $(AS) -c $(ASFLAGS) $< + +adler32.obj: adler32.c zlib.h zconf.h + +compress.obj: compress.c zlib.h zconf.h + +crc32.obj: crc32.c zlib.h zconf.h crc32.h + +deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h + +gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h + +gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h + +gzread.obj: gzread.c zlib.h zconf.h gzguts.h + +gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h + +infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h + +inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \ + inffast.h inffixed.h + +inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h + +trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h + +uncompr.obj: uncompr.c zlib.h zconf.h + +zutil.obj: zutil.c zutil.h zlib.h zconf.h + +gvmat64.obj: contrib\masmx64\gvmat64.asm + +inffasx64.obj: contrib\masmx64\inffasx64.asm + +inffas8664.obj: contrib\masmx64\inffas8664.c zutil.h zlib.h zconf.h \ + inftrees.h inflate.h inffast.h + +inffas32.obj: contrib\masmx86\inffas32.asm + +match686.obj: contrib\masmx86\match686.asm + +example.obj: example.c zlib.h zconf.h + +minigzip.obj: minigzip.c zlib.h zconf.h + +zlib1.res: win32/zlib1.rc + $(RC) $(RCFLAGS) /fo$@ win32/zlib1.rc + + +# testing +test: example.exe minigzip.exe + example + echo hello world | minigzip | minigzip -d + +testdll: example_d.exe minigzip_d.exe + example_d + echo hello world | minigzip_d | minigzip_d -d + + +# cleanup +clean: + -del $(STATICLIB) + -del $(SHAREDLIB) + -del $(IMPLIB) + -del *.obj + -del *.res + -del *.exp + -del *.exe + -del *.pdb + -del *.manifest + -del foo.gz diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/README-WIN32.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/README-WIN32.txt new file mode 100644 index 0000000000..1e4c093c5e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/README-WIN32.txt @@ -0,0 +1,103 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.4 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). Two compiled +examples are distributed in this package, example and minigzip. The example_d +and minigzip_d flavors validate that the zlib1.dll file is working correctly. + +Questions about zlib should be sent to . The zlib home page +is http://zlib.net/ . Before reporting a problem, please check this site to +verify that you have the latest version of zlib; otherwise get the latest +version and check whether the problem still exists or not. + +PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html +before asking for help. + + +Manifest: + +The package zlib-1.2.4-win32-x86.zip contains the following files: + + README-WIN32.txt This document + ChangeLog Changes since previous zlib packages + DLL_FAQ.txt Frequently asked questions about zlib1.dll + zlib.3.pdf Documentation of this library in Adobe Acrobat format + + example.exe A statically-bound example (using zlib.lib, not the dll) + example.pdb Symbolic information for debugging example.exe + + example_d.exe A zlib1.dll bound example (using zdll.lib) + example_d.pdb Symbolic information for debugging example_d.exe + + minigzip.exe A statically-bound test program (using zlib.lib, not the dll) + minigzip.pdb Symbolic information for debugging minigzip.exe + + minigzip_d.exe A zlib1.dll bound test program (using zdll.lib) + minigzip_d.pdb Symbolic information for debugging minigzip_d.exe + + zlib.h Install these files into the compilers' INCLUDE path to + zconf.h compile programs which use zlib.lib or zdll.lib + + zdll.lib Install these files into the compilers' LIB path if linking + zdll.exp a compiled program to the zlib1.dll binary + + zlib.lib Install these files into the compilers' LIB path to link zlib + zlib.pdb into compiled programs, without zlib1.dll runtime dependency + (zlib.pdb provides debugging info to the compile time linker) + + zlib1.dll Install this binary shared library into the system PATH, or + the program's runtime directory (where the .exe resides) + zlib1.pdb Install in the same directory as zlib1.dll, in order to debug + an application crash using WinDbg or similar tools. + +All .pdb files above are entirely optional, but are very useful to a developer +attempting to diagnose program misbehavior or a crash. Many additional +important files for developers can be found in the zlib124.zip source package +available from http://zlib.net/ - review that package's README file for details. + + +Acknowledgments: + +The deflate format used by zlib was defined by Phil Katz. The deflate and +zlib specifications were written by L. Peter Deutsch. Thanks to all the +people who reported problems and suggested various improvements in zlib; they +are too numerous to cite here. + + +Copyright notice: + + (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/VisualC.txt b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/VisualC.txt new file mode 100644 index 0000000000..579a5fc9e0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/VisualC.txt @@ -0,0 +1,3 @@ + +To build zlib using the Microsoft Visual C++ environment, +use the appropriate project from the projects/ directory. diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/zlib.def b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/zlib.def new file mode 100644 index 0000000000..03df8bf822 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/zlib.def @@ -0,0 +1,74 @@ +LIBRARY +; zlib data compression library + +EXPORTS +; basic functions + zlibVersion + deflate + deflateEnd + inflate + inflateEnd +; advanced functions + deflateSetDictionary + deflateCopy + deflateReset + deflateParams + deflateTune + deflateBound + deflatePrime + deflateSetHeader + inflateSetDictionary + inflateSync + inflateCopy + inflateReset + inflateReset2 + inflatePrime + inflateMark + inflateGetHeader + inflateBack + inflateBackEnd + zlibCompileFlags +; utility functions + compress + compress2 + compressBound + uncompress + gzopen + gzdopen + gzbuffer + gzsetparams + gzread + gzwrite + gzprintf + gzputs + gzgets + gzputc + gzgetc + gzungetc + gzflush + gzseek + gzrewind + gztell + gzoffset + gzeof + gzdirect + gzclose + gzclose_r + gzclose_w + gzerror + gzclearerr +; checksum functions + adler32 + crc32 + adler32_combine + crc32_combine +; various hacks, don't look :) + deflateInit_ + deflateInit2_ + inflateInit_ + inflateInit2_ + inflateBackInit_ + zError + inflateSyncPoint + get_crc_table + inflateUndermine diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/zlib1.rc b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/zlib1.rc new file mode 100644 index 0000000000..0d1d7ffcf7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/win32/zlib1.rc @@ -0,0 +1,40 @@ +#include +#include "../zlib.h" + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE +#endif + FILEVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + PRODUCTVERSION ZLIB_VER_MAJOR,ZLIB_VER_MINOR,ZLIB_VER_REVISION,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS 1 +#else + FILEFLAGS 0 +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "FileDescription", "zlib data compression library\0" + VALUE "FileVersion", ZLIB_VERSION "\0" + VALUE "InternalName", "zlib1.dll\0" + VALUE "LegalCopyright", "(C) 1995-2006 Jean-loup Gailly & Mark Adler\0" + VALUE "OriginalFilename", "zlib1.dll\0" + VALUE "ProductName", "zlib\0" + VALUE "ProductVersion", ZLIB_VERSION "\0" + VALUE "Comments", "For more information visit http://www.zlib.net/\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h new file mode 100644 index 0000000000..02ce56c431 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h @@ -0,0 +1,428 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress +# define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h.cmakein b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h.cmakein new file mode 100644 index 0000000000..a2f71b1f32 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h.cmakein @@ -0,0 +1,430 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H +#cmakedefine Z_PREFIX +#cmakedefine Z_HAVE_UNISTD_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress +# define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h.in b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h.in new file mode 100644 index 0000000000..02ce56c431 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zconf.h.in @@ -0,0 +1,428 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress +# define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#ifdef STDC +# include /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.3 b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.3 new file mode 100644 index 0000000000..27adc4cd10 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.3 @@ -0,0 +1,151 @@ +.TH ZLIB 3 "19 Apr 2010" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms may be added later +with the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in the case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I example.c +and +.IR minigzip.c, +as well as other examples in the +.IR examples/ +directory. +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source. +.LP +.I zlib +is available in Java using the java.util.zip package: +.IP +http://java.sun.com/developer/technicalArticles/Programming/compression/ +.LP +A Perl interface to +.IR zlib , +written by Paul Marquess (pmqs@cpan.org), +is available at CPAN (Comprehensive Perl Archive Network) sites, +including: +.IP +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ +.LP +A Python interface to +.IR zlib , +written by A.M. Kuchling (amk@magnet.com), +is available in Python 1.5 and later versions: +.IP +http://www.python.org/doc/lib/module-zlib.html +.LP +.I zlib +is built into +.IR tcl: +.IP +http://wiki.tcl.tk/4610 +.LP +An experimental package to read and write files in .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/minizip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +source distribution. +.SH "SEE ALSO" +The +.I zlib +web site can be found at: +.IP +http://zlib.net/ +.LP +The data format used by the zlib library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://www.ietf.org/rfc/rfc1950.txt (for the zlib header and trailer format) +.br +http://www.ietf.org/rfc/rfc1951.txt (for the deflate compressed data format) +.br +http://www.ietf.org/rfc/rfc1952.txt (for the gzip header and trailer format) +.LP +Mark Nelson wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://marknelson.us/1997/01/01/zlib-engine/ +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://zlib.net/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS +Version 1.2.5 +Copyright (C) 1995-2010 Jean-loup Gailly (jloup@gzip.org) +and Mark Adler (madler@alumni.caltech.edu). +.LP +This software is provided "as-is," +without any express or implied warranty. +In no event will the authors be held liable for any damages +arising from the use of this software. +See the distribution directory with respect to requirements +governing redistribution. +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.3.pdf b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.3.pdf new file mode 100644 index 0000000000..9f8a2c3999 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.3.pdf differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.h new file mode 100644 index 0000000000..bfbba83e8e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.h @@ -0,0 +1,1613 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.5, April 19th, 2010 + + Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.5" +#define ZLIB_VERNUM 0x1250 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all the uncompressed data. (The size + of the uncompressed data may have been saved by the compressor for this + purpose.) The next operation on this stream must be inflateEnd to deallocate + the decompression state. The use of Z_FINISH is never required, but can be + used to inform inflate that a faster approach may be used for the single + inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK or Z_TREES is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any call + of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been + found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the + success case, the application may save the current current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef voidp gzFile; /* opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) Also "a" + can be used instead of "w" to request that the gzip stream that will be + written be appended to the file. "+" will result in an error, since reading + and writing to the same gzip file is not supported. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file was not in gzip format, gzread copies the given number of + bytes into the buffer. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream, or failing that, reading the rest + of the input file directly without decompression. The entire input file + will be read if gzread is called until it returns less than the requested + len. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. This state can change from + false to true while reading the input file if the end of a gzip stream is + reached, but is followed by data that is not another gzip stream. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the for the crc. Pre- and post-conditioning (one's + complement) is performed within this function so it shouldn't be done by the + application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# ifdef _LARGEFILE64_SOURCE + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.map b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.map new file mode 100644 index 0000000000..f282d3624a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.map @@ -0,0 +1,68 @@ +ZLIB_1.2.0 { + global: + compressBound; + deflateBound; + inflateBack; + inflateBackEnd; + inflateBackInit_; + inflateCopy; + local: + deflate_copyright; + inflate_copyright; + inflate_fast; + inflate_table; + zcalloc; + zcfree; + z_errmsg; + gz_error; + gz_intmax; + _*; +}; + +ZLIB_1.2.0.2 { + gzclearerr; + gzungetc; + zlibCompileFlags; +} ZLIB_1.2.0; + +ZLIB_1.2.0.8 { + deflatePrime; +} ZLIB_1.2.0.2; + +ZLIB_1.2.2 { + adler32_combine; + crc32_combine; + deflateSetHeader; + inflateGetHeader; +} ZLIB_1.2.0.8; + +ZLIB_1.2.2.3 { + deflateTune; + gzdirect; +} ZLIB_1.2.2; + +ZLIB_1.2.2.4 { + inflatePrime; +} ZLIB_1.2.2.3; + +ZLIB_1.2.3.3 { + adler32_combine64; + crc32_combine64; + gzopen64; + gzseek64; + gztell64; + inflateUndermine; +} ZLIB_1.2.2.4; + +ZLIB_1.2.3.4 { + inflateReset2; + inflateMark; +} ZLIB_1.2.3.3; + +ZLIB_1.2.3.5 { + gzbuffer; + gzoffset; + gzoffset64; + gzclose_r; + gzclose_w; +} ZLIB_1.2.3.4; diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.pc.in b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.pc.in new file mode 100644 index 0000000000..7e5acf9c77 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +sharedlibdir=@sharedlibdir@ +includedir=@includedir@ + +Name: zlib +Description: zlib compression library +Version: @VERSION@ + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib2ansi b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib2ansi new file mode 100644 index 0000000000..15e3e165f3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zlib2ansi @@ -0,0 +1,152 @@ +#!/usr/bin/perl + +# Transform K&R C function definitions into ANSI equivalent. +# +# Author: Paul Marquess +# Version: 1.0 +# Date: 3 October 2006 + +# TODO +# +# Asumes no function pointer parameters. unless they are typedefed. +# Assumes no literal strings that look like function definitions +# Assumes functions start at the beginning of a line + +use strict; +use warnings; + +local $/; +$_ = <>; + +my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments + +my $d1 = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ; +my $decl = qr{ $sp (?: \w+ $sp )+ $d1 }xo ; +my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ; + + +while (s/^ + ( # Start $1 + ( # Start $2 + .*? # Minimal eat content + ( ^ \w [\w\s\*]+ ) # $3 -- function name + \s* # optional whitespace + ) # $2 - Matched up to before parameter list + + \( \s* # Literal "(" + optional whitespace + ( [^\)]+ ) # $4 - one or more anythings except ")" + \s* \) # optional whitespace surrounding a Literal ")" + + ( (?: $dList )+ ) # $5 + + $sp ^ { # literal "{" at start of line + ) # Remember to $1 + //xsom + ) +{ + my $all = $1 ; + my $prefix = $2; + my $param_list = $4 ; + my $params = $5; + + StripComments($params); + StripComments($param_list); + $param_list =~ s/^\s+//; + $param_list =~ s/\s+$//; + + my $i = 0 ; + my %pList = map { $_ => $i++ } + split /\s*,\s*/, $param_list; + my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ; + + my @params = split /\s*;\s*/, $params; + my @outParams = (); + foreach my $p (@params) + { + if ($p =~ /,/) + { + my @bits = split /\s*,\s*/, $p; + my $first = shift @bits; + $first =~ s/^\s*//; + push @outParams, $first; + $first =~ /^(\w+\s*)/; + my $type = $1 ; + push @outParams, map { $type . $_ } @bits; + } + else + { + $p =~ s/^\s+//; + push @outParams, $p; + } + } + + + my %tmp = map { /$pMatch/; $_ => $pList{$1} } + @outParams ; + + @outParams = map { " $_" } + sort { $tmp{$a} <=> $tmp{$b} } + @outParams ; + + print $prefix ; + print "(\n" . join(",\n", @outParams) . ")\n"; + print "{" ; + +} + +# Output any trailing code. +print ; +exit 0; + + +sub StripComments +{ + + no warnings; + + # Strip C & C++ coments + # From the perlfaq + $_[0] =~ + + s{ + /\* ## Start of /* ... */ comment + [^*]*\*+ ## Non-* followed by 1-or-more *'s + ( + [^/*][^*]*\*+ + )* ## 0-or-more things which don't start with / + ## but do end with '*' + / ## End of /* ... */ comment + + | ## OR C++ Comment + // ## Start of C++ comment // + [^\n]* ## followed by 0-or-more non end of line characters + + | ## OR various things which aren't comments: + + ( + " ## Start of " ... " string + ( + \\. ## Escaped char + | ## OR + [^"\\] ## Non "\ + )* + " ## End of " ... " string + + | ## OR + + ' ## Start of ' ... ' string + ( + \\. ## Escaped char + | ## OR + [^'\\] ## Non '\ + )* + ' ## End of ' ... ' string + + | ## OR + + . ## Anything other char + [^/"'\\]* ## Chars which doesn't start a comment, string or escape + ) + }{$2}gxs; + +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zutil.c b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zutil.c new file mode 100644 index 0000000000..898ed345b0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch ((int)(sizeof(uInt))) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch ((int)(sizeof(uLong))) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch ((int)(sizeof(voidpf))) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch ((int)(sizeof(z_off_t))) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int ZLIB_INTERNAL z_verbose = verbose; + +void ZLIB_INTERNAL z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void ZLIB_INTERNAL zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int ZLIB_INTERNAL zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void ZLIB_INTERNAL zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void ZLIB_INTERNAL zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zutil.h b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zutil.h new file mode 100644 index 0000000000..258fa88799 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dependencies/zlib/zutil.h @@ -0,0 +1,274 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2010 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + +#include "zlib.h" + +#ifdef STDC +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) +# include +# endif +# include +# include +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 +# include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + +#if defined(__BORLANDC__) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int ZLIB_INTERNAL z_verbose; + extern void ZLIB_INTERNAL z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); +void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/associateMin.sh b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/associateMin.sh new file mode 100644 index 0000000000..e0ec70431f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/associateMin.sh @@ -0,0 +1,169 @@ +#!/bin/bash +if [ -z "$1" ] || [ "$1" == "-?" ] || [ "$1" == "--help" ]; then + echo "Linux file association script for PokeMini by Wa (logicplace.com)" + echo "Usage: ${0##*/} [un/register] pokemini" + echo " register Literal word, registers associations" + echo " unregister Literal word, unregisters associations" + echo " pokemini PokeMini executable with full path" + exit 1 +elif [ -z "$2" ]; then + act="register" + emu="$1" +else + act=$1 + emu="$2" +fi +colormapper=$(dirname $emu)/color_mapper + +if [ "$act" == "register" ]; then + +mkdir -p ~/.local/share/mime/packages/ +mkdir -p ~/.local/share/icons/hicolor/16x16/apps/ +mkdir -p ~/.local/share/icons/hicolor/32x32/apps/ + +cat <~/.local/share/mime/packages/x-pokemon-mini.xml + + + + Pokémon Mini ROM + + + + + + +EOF +if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Unable to write to file ~/.local/share/mime/packages/x-pokemon-mini.xml" + exit 1 +fi + +cat <~/.local/share/mime/packages/x-pokemon-mini-color.xml + + + + Pokémon Mini Color Info + + + + + + +EOF +if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Unable to write to file ~/.local/share/mime/packages/x-pokemon-mini-color.xml" + exit 1 +fi + +update-mime-database ~/.local/share/mime/ +if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Error when updating mime database ~/.local/share/mime/" + exit 1 +fi + +cperr() { + cp $1 $2 + if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Unable to write to file $2" + exit 1 + fi +} + +cperr min16.png ~/.local/share/icons/hicolor/16x16/apps/application-x-pokemon-mini.png +cperr minc16.png ~/.local/share/icons/hicolor/16x16/apps/application-x-pokemon-mini-color.png +cperr min32.png ~/.local/share/icons/hicolor/32x32/apps/application-x-pokemon-mini.png +cperr minc32.png ~/.local/share/icons/hicolor/32x32/apps/application-x-pokemon-mini-color.png +cperr pokemini16.png ~/.local/share/icons/hicolor/16x16/apps/pokemini_debugger.png +cperr pokemini32.png ~/.local/share/icons/hicolor/32x32/apps/pokemini_debugger.png +cperr colormapper16.png ~/.local/share/icons/hicolor/16x16/apps/pokemini_colormapper.png +cperr colormapper32.png ~/.local/share/icons/hicolor/32x32/apps/pokemini_colormapper.png + +#~/.local/share/applications/ +cat </tmp/pokemini_debugger.desktop +#!/usr/bin/env xdg-open +[Desktop Entry] +Version=1.0 +Type=Application +Name=PokeMini Debugger +Comment=Pokémon-Mini emulator with debugging capabilities +Exec="$emu" %f +Categories=Game; +Icon=pokemini_debugger +MimeType=application/x-pokemon-mini;application/x-pokemon-mini-color; +EOF +if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Unable to write to file pokemini_debugger.desktop" + exit 1 +fi + +desktop-file-install --dir=$HOME/.local/share/applications/ --rebuild-mime-info-cache /tmp/pokemini_debugger.desktop +if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Error when installing pokemini_debugger.desktop" + exit 1 +fi +rm /tmp/pokemini_debugger.desktop + +if [ -f "$colormapper" ]; then + cat </tmp/pokemini_colormapper.desktop +#!/usr/bin/env xdg-open +[Desktop Entry] +Version=1.0 +Type=Application +Name=PokeMini Color Mapper +Comment=Colorize your Pokémon-Mini ROMs +Exec="$colormapper" %f +Categories=Game; +Icon=pokemini_colormapper +MimeType=application/x-pokemon-mini-color; +EOF + if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Unable to write to file pokemini_colormapper.desktop" + exit 1 + fi + + desktop-file-install --dir=$HOME/.local/share/applications/ --rebuild-mime-info-cache /tmp/pokemini_colormapper.desktop + if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Error when installing pokemini_colormapper.desktop" + exit 1 + fi + rm /tmp/pokemini_colormapper.desktop +fi + +zenity --info --title="PokeMini" --text="Associations were successful.\nPlease relog to apply changes." + +elif [ "$act" == "unregister" ]; then + + rm ~/.local/share/mime/packages/x-pokemon-mini.xml \ + ~/.local/share/mime/packages/x-pokemon-mini-color.xml \ + ~/.local/share/applications/pokemini_debugger.desktop \ + ~/.local/share/applications/pokemini_colormapper.desktop \ + ~/.local/share/icons/hicolor/16x16/apps/application-x-pokemon-mini*.png \ + ~/.local/share/icons/hicolor/32x32/apps/application-x-pokemon-mini*.png \ + ~/.local/share/icons/hicolor/16x16/apps/pokemini*.png \ + ~/.local/share/icons/hicolor/32x32/apps/pokemini*.png + + update-mime-database ~/.local/share/mime/ + if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Error when updating mime database ~/.local/share/mime/" + exit 1 + fi + update-desktop-database ~/.local/share/applications/ + if [ "$?" != "0" ]; then + zenity --error --title="PokeMini" \ + --text="Error when updating desktop database ~/.local/share/applications/" + exit 1 + fi + + zenity --info --title="PokeMini" --text="Unassociations were successful.\nPlease relog to apply changes." + +fi +exit 0 diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/colormapper16.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/colormapper16.png new file mode 100644 index 0000000000..b17f261f3e Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/colormapper16.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/colormapper32.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/colormapper32.png new file mode 100644 index 0000000000..c50ef63c03 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/colormapper32.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/min16.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/min16.png new file mode 100644 index 0000000000..04b513b6bc Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/min16.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/min32.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/min32.png new file mode 100644 index 0000000000..1f7ee8e911 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/min32.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/minc16.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/minc16.png new file mode 100644 index 0000000000..3aa14627a8 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/minc16.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/minc32.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/minc32.png new file mode 100644 index 0000000000..7ec8bfa8af Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/minc32.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/pokemini16.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/pokemini16.png new file mode 100644 index 0000000000..4130c8740c Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/pokemini16.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/pokemini32.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/pokemini32.png new file mode 100644 index 0000000000..0b9c1d7b09 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/associateMin/pokemini32.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/Makefile b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/Makefile new file mode 100644 index 0000000000..fe9962042b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/Makefile @@ -0,0 +1,33 @@ +.PHONY: all media run flash clean + +PMDEV_DIR = ../../.. + +IMAGE = background.pmimage pokeball.pmimage +MUSIC = +DEPS = +SRC = bouncing.asm +OUT = bouncing.min + +IMAGE_OUT = $(IMAGE:.pmimage=.bin) +MUSIC_OUT = $(MUSIC:.pmmusic=.asm) + +all: $(OUT) +media: $(IMAGE_OUT) $(MUSIC_OUT) + +%.bin: %.pmimage + $(PMDEV_DIR)/pokemini_imgconv -q -c $< -o $@ + +%.asm: %.pmmusic + $(PMDEV_DIR)/pokemini_musicconv -q -i $< -o $@ + +$(OUT): $(SRC) $(DEPS) $(IMAGE_OUT) $(MUSIC_OUT) + $(PMDEV_DIR)/pmas $< $@ + +run: $(OUT) + $(PMDEV_DIR)/PokeMiniD $< & + +flash: $(OUT) + $(PMDEV_DIR)/PokeFlash -f $< + +clean: + $(RM) $(OUT) $(IMAGE_OUT) $(MUSIC_OUT) diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.bin new file mode 100644 index 0000000000..ae9b294af2 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.bmp b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.bmp new file mode 100644 index 0000000000..5426e2fd7b Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.bmp differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.map b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.map new file mode 100644 index 0000000000..ff3ba88a5c Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.map differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.pmimage b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.pmimage new file mode 100644 index 0000000000..c045c8766f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/background.pmimage @@ -0,0 +1,7 @@ +format=raw +gfx=map + +img=background.bmp +out=background.bin +outgray=backgroundG.bin +outmap=background.map diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/backgroundG.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/backgroundG.bin new file mode 100644 index 0000000000..00e757de10 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/backgroundG.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.asm new file mode 100644 index 0000000000..024c5b4ce0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.asm @@ -0,0 +1,296 @@ + .include "pm_libs/pm_init.s" + + pm_header "TestFramebuf", IRQ_KEY_POWER | IRQ_PRC_COPY | IRQ_MUSIC | IRQ_SHOCK, 0 + + .include "pm_libs/pmrom_music.s" + + ; For grayscaling (3rd color) + .ram PRC_MAP_BASE_FLIP 2 + .ram PRC_SPR_BASE_FLIP 2 + + ; All coords are fixed-point 8.8 + .ram pokeball_px 2 ; Position + .ram pokeball_py 2 + .ram pokeball_vx 2 ; Velocity + .ram pokeball_vy 2 + .ram pokeball_ax 2 ; Acceleration + .ram pokeball_ay 2 + .ram pokeball_anim 2 ; Rolling animation + + .set pokeball_reducex 8 + .set pokeball_reducey 64 + + ; Shutdown down when power key pressed +irq_key_power: + cint CINT_SHUTDOWN + + ; Flip map & spr bases + ; This demo isn't over 64KB so we can skip upper address fliping +irq_prc_copy: + pushax + mov ba, [PRC_SPR_BASE] + mov hl, [PRC_SPR_BASE_FLIP] + mov [PRC_SPR_BASE], hl + mov [PRC_SPR_BASE_FLIP], ba + mov ba, [PRC_MAP_BASE] + mov hl, [PRC_MAP_BASE_FLIP] + mov [PRC_MAP_BASE], hl + mov [PRC_MAP_BASE_FLIP], ba + popax + rirq IRQ_PRC_COPY + + ; Shock detector handler +irq_shock: + pushax + mov hl, [pokeball_py] + cmp hl, 46<<8 ; If near ground... + jl _end + mov hl, [pokeball_vy] + cmp hl, $8000 ; and if going up... + jnc _end + add hl, 2<<8 ; Project ball way up + mov [pokeball_vy], hl + mov hl, [pokeball_vx] + mov a, [n+TMR256_CNT] + tst a, 0x01 ; We pick the lowest bit of 256hz timer to set the x direction + jnzb :f + add hl, 1<<8 ; Throw left + jmpb :ff +: sub hl, 1<<8 ; ... or right! +: mov [pokeball_vx], hl +_end: popax + rirq IRQ_SHOCK + + ; Main routine +main: + ; Setup ball + mov ba, 40<<8 + mov [pokeball_px], ba + mov ba, 24<<8 + mov [pokeball_py], ba + mov ba, 64 + mov [pokeball_vx], ba + mov ba, -64 + mov [pokeball_vy], ba + mov ba, 0 + mov [pokeball_ax], ba + mov ba, 16 + mov [pokeball_ay], ba + mov a, 0 + mov [pokeball_anim], ba + + ; Copy background map + mov x, background_map + mov y, MAP_BASE + mov b, 96 +: mov a, [x] + mov [y], a + inc x + inc y + jdbnz :b + + ; Setup map and sprite bases + ; This demo isn't over 64KB so we don't care about the upper address + mov ba, background_1 + mov [PRC_MAP_BASE], ba + mov ba, background_2 + mov [PRC_MAP_BASE_FLIP], ba + mov ba, pokeball_1 + mov [PRC_SPR_BASE], ba + mov ba, pokeball_2 + mov [PRC_SPR_BASE_FLIP], ba + + ; Enable Tmr256 + mov [n+TMR256_CTRL], TMR256_ENABLE + + ; Setup PRC + mov [n+PRC_MODE], PRC_ENABLE | PRC_SPR | PRC_MAP | PRC_MAP12x16 + mov [n+PRC_RATE], PRC_36FPS + + ; Enable interrupts + enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY | IRQ_SHOCK + enable_mirq + + ; Initialize pmmusic for our sound effect + mov ba, 0 + mov hl, $00FF + call pmmusic_init + + ; Begin loop +_loop: halt ; Battery likes HALT but be careful that it needs IRQs to wake up + tst [n+IRQ_ACT1], IRQ_ACT1_PRC_DIV ; Wait for PRC divider flag, IRQ cannot be active for this trick to work + jzb _loop + or [n+IRQ_ACT1], IRQ_ACT1_PRC_DIV ; Clear it + call update_position + call update_velocity + call update_anim + + ; Copy pokeball information into sprite 0 + mov a, [pokeball_py+1] + add a, 16 ; HW Sprites start at X of -16 + mov [SPR_BASE + SPR_Y], a + mov a, [pokeball_px+1] + add a, 16 ; HW Sprites start at Y of -16 + mov [SPR_BASE + SPR_X], a + mov a, [pokeball_anim+1] ; Use the integer part of our animation + mov [SPR_BASE + SPR_TILE], a + mov a, SPR_ENABLE + mov [SPR_BASE + SPR_CTRL], a + jmpb _loop + + ; Update ball position based of velocity +update_position: + ; X coord. + mov x, [pokeball_vx] + mov y, [pokeball_vy] + mov ba, [pokeball_px] + add ba, x ; px += vx; + cmp ba, 0<<8 ; if (px < 0.0) { + jge :f + mov ba, 0<<8 ; px = 0.0; + cmp x, $8000 + js :f + mov hl, 0 + sub hl, x + mov x, hl ; vx = abs(vx); + call oncollision ; oncollision(); } +: cmp ba, 80<<8 ; if (px >= 80.0) { + jle :f + mov ba, 80<<8 ; px = 80.0; + cmp x, $8000 + jns :f + mov hl, 0 + sub hl, x + mov x, hl ; vx = -abs(vx); + call oncollision ; oncollision(); } +: mov [pokeball_px], ba + ; Y coord. + mov ba, [pokeball_py] + add ba, y ; py += vy; + cmp ba, 0<<8 ; if (py < 0.0) { + jge :f + mov ba, 0<<8 ; py = 0.0; + cmp y, $8000 + js :f + mov hl, 0 + sub hl, y + mov y, hl ; vy = abs(vy); + call oncollision ; oncollision(); } +: cmp ba, 48<<8 ; if (py >= 48.0) { + jle :f + mov ba, 48<<8 ; py = 48.0; + cmp y, $8000 + jns :f + mov hl, 0 + sub hl, y + mov y, hl ; vy = -abs(vy); + call oncollision ; oncollision(); } +: mov [pokeball_py], ba + mov [pokeball_vx], x + mov [pokeball_vy], y + ret + + ; Update ball velocity based of acceleration +update_velocity: + mov hl, [pokeball_ax] + mov ba, [pokeball_vx] + add ba, hl ; vx += ax; + cmp ba, -3<<8 ; if (vx < -3.0) vx = -3.0; + jge :f + mov ba, -3<<8 +: cmp ba, 3<<8 ; if (vx > 3.0) vx = 3.0; + jle :f + mov ba, 3<<8 +: mov [pokeball_vx], ba + mov hl, [pokeball_ay] + mov ba, [pokeball_vy] + add ba, hl ; vy += ay; + cmp ba, -3<<8 ; if (vy < -3.0) vx = -3.0; + jge :f + mov ba, -3<<8 +: cmp ba, 3<<8 ; if (vy > 3.0) vx = 3.0; + jle :f + mov ba, 3<<8 +: mov [pokeball_vy], ba + ret + + ; Update animation based of velocity +update_anim: + mov ba, [pokeball_anim] + mov hl, [pokeball_vx] + add ba, hl + and b, $07 ; anim = (anim + vx) & 0x07FF; + mov [pokeball_anim], ba + ret + + ; Called when the ball collide with any wall + ; only HL can be destroyed +oncollision: + ; Reduce velocity, remember they are still in X and Y register +_x: + cmp x, $8000 + jncb _xneg +_xpos: + sub x, pokeball_reducex + jnc _y + mov x, 0 + jmpb _y +_xneg: + add x, pokeball_reducex + jnc _y + mov x, 0 +_y: + cmp y, $8000 + jncb _yneg +_ypos: + sub y, pokeball_reducey + jnc _z + mov y, 0 + jmpb _z +_yneg: + add y, pokeball_reducey + jnc _z + mov y, 0 +_z: + ; Only play SFX if ball is moving + cmp x, 0 + jnz _do_sfx + cmp y, 0 + jnz _do_sfx + ret +_do_sfx: + mov hl, wallsfx + call pmmusic_playsfx + ret + + + ; PMMusic stuff here! + pmmusic_align +wallsfx: + ; Note Pw V Wait + pmmusic_row N_C_2, $20, 2, 1 + pmmusic_row N_C_7, $80, 2, 1 + pmmusic_row N_C_5, $40, 2, 1 + pmmusic_row N_C_3, $20, 2, 1 + pmmusic_end + + + pm_rominfo + + + ; Tiles must be 8 bytes aligned! + pm_align_tiles +background_1: + .incbin "background.bin" +background_2: + .incbin "backgroundG.bin" +background_map: + .incbin "background.map" + + + ; Sprites must be 64 bytes aligned! + pm_align_spr +pokeball_1: + .incbin "pokeball.bin" +pokeball_2: + .incbin "pokeballG.bin" diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.min b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.min new file mode 100644 index 0000000000..ba193db43a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.min @@ -0,0 +1,20 @@ +MN + + "$&(*,{.uoic]NINTENDOHmBwTestFramebuf2P'@' '''''' ((((*@**()@) ))))))!EU h8ϴ nxxx#x$x%x&x'x(x)x*x x!x"B:  +- 0xqx x8 J L 4oĆH  : ; : ; 25΄΄'@Fp@E@E@E25&΄΄/'@Fp@E@E@E&AU + *# Ć8 J H%#8H%*)(%-# Ć8 &2 +J H%#8H%%| + A" E ΌΌΌ' E + %ʀι@ n%ʀм  %ʀм@%Sʀ>  U + %Gʀβ νC +đ h8hC F3E  +%&2%5 J  ΍Θ΍Θ΍Θ΍Θ΍Θ L "xq%6%/(*%A"/ E'ΌΌΌ' E (*%ʀι@ n%ʀм+ %ʀм-@% ʀ%Gʀβ νC3 (đ*h8hC6 F3E*(%%&25+J -'΍Θ΍Θ΍Θ΍Θ΍Θ'L "xq'  + + + + + HϹ E E C CϽϹI.#MMKDAKϽu(GI@KMOQSH*``FpX) )C* ,E@݀݁#%&@Tή'@'@+JHTʺKMG *PP *GI +n00 +UIKMOKKQMMSKΰS   @ @:)6qw666;wD 8DDDD8((DD8TTTTXIIIIN0 TTTx@AAAA"|xx` A \`& 4(pj5 P 8DDDD8((DD8TTTTXIIIIN0 TTTx@AAAA"|xx`ЌA)`4hU*+F @T"  + + + + + + ?ݮu_qCƄ?+w׮ՆaYW?u:=~u^pCƄ?+wW]Նo]W?u ^pC??wW]u]W?u a^|_?!cw}ծu]W?a_uW?!c‡ծu]W?u}a_uW?!czծ~\W?u]_uW??cz`XW?u]u_}OƄ?+ww>=zՆ`XW?ݮw+WYadž?u׮ݺCq_?z=>ww+WX`dž?u׮]uO}_?zc?WX`?׮]uWu_?zc!W\~׮?a}uWu_?c!W]u׮?aÆWu_?}wc!W]u׮?a u_|^?]Ww?W]u? uCp^?]Ww+W]odž?u~=:uCp^ \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.pnproj b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.pnproj new file mode 100644 index 0000000000..ce84ce79bf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.pnproj @@ -0,0 +1 @@ +bouncing.asmbouncing.minbouncing.sym \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.pnps b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.pnps new file mode 100644 index 0000000000..a0bbf9621b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/bouncing.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.bin new file mode 100644 index 0000000000..b4d11807bf Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.bmp b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.bmp new file mode 100644 index 0000000000..36f7722e4d Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.bmp differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.pmimage b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.pmimage new file mode 100644 index 0000000000..2f06519398 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeball.pmimage @@ -0,0 +1,7 @@ +format=raw +gfx=sprites +colorkey=#FF00FF + +img=pokeball.bmp +out=pokeball.bin +outgrey=pokeballG.bin diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeballG.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeballG.bin new file mode 100644 index 0000000000..52798bd1cf Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/bouncing/pokeballG.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/Makefile b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/Makefile new file mode 100644 index 0000000000..6643eae9ef --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/Makefile @@ -0,0 +1,33 @@ +.PHONY: all media run flash clean + +PMDEV_DIR = ../../.. + +IMAGE = teampokeme.pmimage +MUSIC = +DEPS = +SRC = framebuffer.asm +OUT = framebuffer.min + +IMAGE_OUT = $(IMAGE:.pmimage=.bin) +MUSIC_OUT = $(MUSIC:.pmmusic=.asm) + +all: $(OUT) +media: $(IMAGE_OUT) $(MUSIC_OUT) + +%.bin: %.pmimage + $(PMDEV_DIR)/pokemini_imgconv -q -c $< -o $@ + +%.asm: %.pmmusic + $(PMDEV_DIR)/pokemini_musicconv -q -i $< -o $@ + +$(OUT): $(SRC) $(DEPS) $(IMAGE_OUT) $(MUSIC_OUT) + $(PMDEV_DIR)/pmas $< $@ + +run: $(OUT) + $(PMDEV_DIR)/PokeMiniD $< & + +flash: $(OUT) + $(PMDEV_DIR)/PokeFlash -f $< + +clean: + $(RM) $(OUT) $(IMAGE_OUT) $(MUSIC_OUT) diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.asm new file mode 100644 index 0000000000..4daf3a618c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.asm @@ -0,0 +1,66 @@ + .include "pm_libs/pm_init.s" + + pm_header "TestFramebuf", IRQ_KEY_POWER, 0 + + ; Shutdown down when power key pressed +irq_key_power: + cint CINT_SHUTDOWN + +main: + ; Enable interrupts + enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY ; PRC_COPY declared to wake up HALT + enable_mirq + + ; Blank LCD + mov a, 0 + cint CINT_TMP_CONTRAST + + ; Setup PRC + mov [n+PRC_MODE], PRC_ENABLE + mov [n+PRC_RATE], PRC_24FPS + + ; Copy image to VRAM + mov y, teampokeme + mov x, VRAM_BASE + mov hl, 768 +: mov a, [y] + mov [x], a + inc x + inc y + dec hl + jnzb :b + + ; Fade in + mov a, 0 +: push a + cint CINT_TMP_CONTRAST + pop a + halt + inc a + cmp a, $20 + jnzb :b + + ; Wait for any key press + mov a, 0 +: halt + mov a, [n+KEY_PAD] + cmp a, $FF + jzb :b + + ; Fade out + mov a, $20 +: push a + cint CINT_TMP_CONTRAST + pop a + halt + dec a + jnzb :b + + ; Shutdown + cint CINT_SHUTDOWN + + pm_align_tiles +teampokeme: + .incbin "teampokeme.bin" + + pm_rominfo diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.min b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.min new file mode 100644 index 0000000000..949de55090 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.min @@ -0,0 +1,3 @@ +MN  + "$&(*,{.uoic]NINTENDOHmBwTestFramebuf2P'@' '''''' ((((*@**()@) ))))))!EU h8ϴ nxxx#x$x%x&x'x(x)x*x x!x"H#%T݀݁ǘ"G`ϰTϴή2 ήDR2 ϰTϴήH<.*dDDDPPPPPPPPPPPPPPPPPPPPPP G_C??ߟ??@@@@@@ =@ x?(<8  k;1o̻7߿ժu8h0 A@_W?=;?}juz?UKp + p0Xo?߀SmZ 0#s~Kݻa??????/Z-Sframebuffer.asmframebuffer.minframebuffer.sym \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.pnps b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.pnps new file mode 100644 index 0000000000..7c99e34c1c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/framebuffer.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.bin new file mode 100644 index 0000000000..f6d303dff0 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.bmp b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.bmp new file mode 100644 index 0000000000..cb9dc48e90 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.bmp differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.pmimage b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.pmimage new file mode 100644 index 0000000000..328ac0d520 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/framebuffer/teampokeme.pmimage @@ -0,0 +1,5 @@ +format=raw +gfx=tiles + +img=teampokeme.bmp +out=teampokeme.bin diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/Makefile b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/Makefile new file mode 100644 index 0000000000..90b976b039 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/Makefile @@ -0,0 +1,33 @@ +.PHONY: all media run flash clean + +PMDEV_DIR = ../../.. + +IMAGE = pokemap.pmimage +MUSIC = +DEPS = +SRC = mapview.asm +OUT = mapview.min + +IMAGE_OUT = $(IMAGE:.pmimage=.bin) +MUSIC_OUT = $(MUSIC:.pmmusic=.asm) + +all: $(OUT) +media: $(IMAGE_OUT) $(MUSIC_OUT) + +%.bin: %.pmimage + $(PMDEV_DIR)/pokemini_imgconv -q -c $< -o $@ + +%.asm: %.pmmusic + $(PMDEV_DIR)/pokemini_musicconv -q -i $< -o $@ + +$(OUT): $(SRC) $(DEPS) $(IMAGE_OUT) $(MUSIC_OUT) + $(PMDEV_DIR)/pmas $< $@ + +run: $(OUT) + $(PMDEV_DIR)/PokeMiniD $< & + +flash: $(OUT) + $(PMDEV_DIR)/PokeFlash -f $< + +clean: + $(RM) $(OUT) $(IMAGE_OUT) $(MUSIC_OUT) diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.asm new file mode 100644 index 0000000000..72490e6826 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.asm @@ -0,0 +1,203 @@ + .include "pm_libs/pm_init.s" + + pm_header "TestMapView ", IRQ_KEY_POWER | IRQ_PRC_COPY, 0 + + ; Shutdown down when power key pressed +irq_key_power: + cint CINT_SHUTDOWN + + ; Flip map bases + ; This demo isn't over 64KB so we can skip upper address fliping +irq_prc_copy: + pushax + mov ba, [PRC_MAP_BASE] + mov hl, [PRC_MAP_BASE_FLIP] + mov [PRC_MAP_BASE], hl + mov [PRC_MAP_BASE_FLIP], ba + popax + rirq IRQ_PRC_COPY + + .ram PRC_MAP_BASE_FLIP 2 + .ram camera_x 2 + .ram camera_y 2 + .ram camera_speed 2 + + ; Our map definitions + .include "pokemap.inc" + + ; Main routine +main: + ; Initialize RAM + mov ba, 16 + mov [camera_speed], ba + + ; Enable interrupts + enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY + enable_mirq + + ; Setup PRC + mov [n+PRC_MODE], PRC_ENABLE | PRC_MAP | PRC_MAP16x12 + mov [n+PRC_RATE], PRC_36FPS + mov ba, tileset_1 + mov [PRC_MAP_BASE], ba + mov ba, tileset_2 + mov [PRC_MAP_BASE_FLIP], ba + +loop: + ; Battery likes HALT but be careful that it needs IRQs to wake up + halt + + ; Render map + call rendermap + + ; Move + call movemap + + jmpb loop + + + ; Render map +rendermap: + ; Fine scroll + mov a, [camera_x] + rol a + rol a + rol a + and a, $7 + mov [n+PRC_SCROLL_X], a ; Set higher fractional 3-bits to scroll + mov a, [camera_y] + rol a + rol a + rol a + and a, $7 + mov [n+PRC_SCROLL_Y], a ; Set higher fractional 3-bits to scroll + + ; Transfer map + mov x, pokemap + mov l, [camera_x+1] + mov h, 0 + add x, hl + mov l, [camera_y+1] + mov a, pokemap_mapw + mul l, a + add x, hl ; src <= pokemap + (int)camera_x + (int)camera_y * mapw + mov y, MAP_BASE ; dst <= map_base + mov b, 9 ; Screen height + 1 +_y: + push b + mov b, 13 ; Screen width + 1 +_x: + mov a, [x] + mov [y], a + inc x + inc y + jdbnz _x + + add x, pokemap_mapw - 13 + add y, 16 - 13 ; Padding + pop b + jdbnz _y + ret + + ; Move around the map +movemap: + mov a, [n+KEY_PAD] + tst a, KEY_B + callzb _keyb + callnzb _keybx + tst a, KEY_A + callzb _keya + tst a, KEY_C + callzb _keyc + tst a, KEY_LEFT + callzb _left + tst a, KEY_RIGHT + callzb _right + tst a, KEY_UP + callzb _up + tst a, KEY_DOWN + callzb _down + ret +_keyb: + push a + mov ba, 64 + mov [camera_speed], ba + pop a + ret +_keybx: + push a + mov ba, 16 + mov [camera_speed], ba + pop a + ret +_keya: + push a + mov ba, 8 + mov [camera_speed], ba + pop a + ret +_keyc: + push a + mov ba, 128 + mov [camera_speed], ba + pop a + ret +_left: + push a + mov hl, camera_x + mov ba, [hl] + mov x, [camera_speed] + sub ba, x + cmp ba, 0 + jge :f + mov ba, 0 +: mov [hl], ba + pop a + ret +_right: + push a + mov hl, camera_x + mov ba, [hl] + mov x, [camera_speed] + add ba, x + cmp ba, (pokemap_mapw - 12) * 256 + jl :f + mov ba, (pokemap_mapw - 12) * 256 +: mov [hl], ba + pop a + ret +_up: + push a + mov hl, camera_y + mov ba, [hl] + mov x, [camera_speed] + sub ba, x + cmp ba, 0 + jge :f + mov ba, 0 +: mov [hl], ba + pop a + ret +_down: + push a + mov hl, camera_y + mov ba, [hl] + mov x, [camera_speed] + add ba, x + cmp ba, (pokemap_maph - 8) * 256 + jl :f + mov ba, (pokemap_maph - 8) * 256 +: mov [hl], ba + pop a + ret + +pokemap: + .incbin "pokemap.map" + + pm_align_map +tileset_1: + .incbin "tileset.bin" +tileset_2: + .incbin "tilesetG.bin" + + pm_rominfo diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.min b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.min new file mode 100644 index 0000000000..40988c29d4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.min @@ -0,0 +1,30 @@ +MN C + "$&(*,{.uoic]NINTENDOHmBwTestMapView 2P'@' '''''' ((((*@**()@) ))))))!EU h8ϴ nxxx#x$x%x&x'x(x)x*x x!x"HϹ  Ͻ#%݀݁Đ' Đ*ήNΔΔΔ"xΔΔΔ"xƍ#A A` ϱ FpϵDR%,3 :@Pf|ϰ@ϴϰϴϰϴϰĀϴϰ +ϴϰϴϰ +ϴϰϴ*+*+*+*+*+*+*+*+*+FG-.-.*+*+*+*+:;:;:;:;:;:;:;:;:;VW=>=>:;:;:;:;*+,, @A@A@A*+:;,,999PQPQPQ:;*+,,9999%& +BCDE +()@A@A@A*+:;,,9999\]9PQPQPQ:;*+,,99FG" +" " +"@A@A*+:;,,99VWNO9PQPQ:;*+,,@A*+:;,,99PQ:;*+,,*+:;,,99:;*+,,9999999999*+:;,,999999999999:;*+,,FG*+:;,,9UUUUUUUUVW9:;*+,,*+:;,,99:;*+,,9999999999*+:;,,99999999:;*+,,999999 *+:;,,99999999999:;*+,,%& +/? +()*+:;,,99999\]:;*+,,FG" " +"*+:;,,VWNO:;*+,,*+:;,,:;*+3333333333333333*+:;2$:;*+2$*+*+*+*+*+*+*+:;2$:;:;:;:;:;:;:;QSQQ P @DU@@`XTUVTP`@âӪת}WO_ +U<\UUӈDAWUUUUuUN(PEUUUUժ@UժUUUQQQQUQQQW`XNUU$tdTdt$t~kv8}DUtq(@@(|} UVYs]eҥJ~}RÿFbHĂ].wjѪUUU  /T q@@q U!QOp p}q}pvtO2z'r߶"///] [ [ +]_jhXxjX"UUQQUU.]:u8t?_.P)UUU{]4j @bq? +(XXXȯ?____?j + +Q@ UWWUTX@D@ PUQQ@`PTVUTX`@@}U + + +OW<|UUUUUeqUUUU%HVU DEUUUU@UUUQQQQՀEQQQU0LVUUt$TdTdt$mapview.asmmapview.minmapview.sym \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.pnps b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.pnps new file mode 100644 index 0000000000..48b8755d21 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/mapview.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.bin new file mode 100644 index 0000000000..e70fc370e0 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.inc b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.inc new file mode 100644 index 0000000000..3d2ee3a2ae --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.inc @@ -0,0 +1,13 @@ +; Image exported with PokeMini Image Converter v1.1 +; Header file + +.equ pokemap_tiles 1024 +.equ pokemap_mtiles 1024 +.equ tileset_tiles 96 +.equ tileset_mtiles 96 +.equ tilesetG_tiles 96 +.equ tilesetG_mtiles 96 +.equ pokemap_mapw 32 +.equ pokemap_maph 32 +.equ pokemap_mapsize 1024 + diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.map b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.map new file mode 100644 index 0000000000..b03366bb86 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.map differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.pmimage b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.pmimage new file mode 100644 index 0000000000..28e50fae3f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.pmimage @@ -0,0 +1,11 @@ +format=raw +gfx=exmap +dither=yes ; set to 'no' if there's too much motion but will cause minor flickering when stationary + +img=pokemap.png +tileset=tileset.bmp + +outmap=pokemap.map +outtileset=tileset.bin +outtilesetgray=tilesetG.bin +outheader=pokemap.inc diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.png b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.png new file mode 100644 index 0000000000..6b41d6a2fe Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/pokemap.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tileset.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tileset.bin new file mode 100644 index 0000000000..487cf82d89 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tileset.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tileset.bmp b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tileset.bmp new file mode 100644 index 0000000000..e0cbb47344 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tileset.bmp differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tilesetG.bin b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tilesetG.bin new file mode 100644 index 0000000000..de71ffafa1 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/mapview/tilesetG.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/Makefile b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/Makefile new file mode 100644 index 0000000000..746e8a8380 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/Makefile @@ -0,0 +1,33 @@ +.PHONY: all media run flash clean + +PMDEV_DIR = ../../.. + +IMAGE = +MUSIC = music_galactix.pmmusic music_metroid.pmmusic music_unknown.pmmusic +DEPS = +SRC = sound_tst.asm +OUT = sound_tst.min + +IMAGE_OUT = $(IMAGE:.pmimage=.bin) +MUSIC_OUT = $(MUSIC:.pmmusic=.asm) + +all: $(OUT) +media: $(IMAGE_OUT) $(MUSIC_OUT) + +%.bin: %.pmimage + $(PMDEV_DIR)/pokemini_imgconv -q -c $< -o $@ + +%.asm: %.pmmusic + $(PMDEV_DIR)/pokemini_musicconv -q -i $< -o $@ + +$(OUT): $(SRC) $(DEPS) $(IMAGE_OUT) $(MUSIC_OUT) + $(PMDEV_DIR)/pmas $< $@ + +run: $(OUT) + $(PMDEV_DIR)/PokeMiniD $< & + +flash: $(OUT) + $(PMDEV_DIR)/PokeFlash -f $< + +clean: + $(RM) $(OUT) $(IMAGE_OUT) $(MUSIC_OUT) diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_choco.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_choco.asm new file mode 100644 index 0000000000..93f1be1000 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_choco.asm @@ -0,0 +1,296 @@ +music_choco: + PMMUSIC_PATTERN music_chocoP1 + PMMUSIC_PATTERN music_chocoP2 + PMMUSIC_PATTERN music_chocoP2 + PMMUSIC_PATTERN music_chocoP3 + PMMUSIC_PATTERN music_chocoP4 + PMMUSIC_PATTERN music_chocoP5 + PMMUSIC_PATTERN music_chocoEnd +music_chocoEnd: + PMMUSIC_GOBACK 6 + +.equ cI0 $60 +.equ cI1 $30 + +music_chocoP1: + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 00 + PMMUSIC_ROW N____, -1, 2, 6 ; 01 + PMMUSIC_ROW N____, -1, 0, 6 ; 02 + PMMUSIC_ROW N____, -1, 0, 6 ; 03 + PMMUSIC_ROW N_D_6, cI0, 3, 6 ; 04 + PMMUSIC_ROW N____, -1, 2, 6 ; 05 + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 06 + PMMUSIC_ROW N____, -1, 2, 6 ; 07 + PMMUSIC_ROW N_F_5, cI0, 3, 6 ; 08 + PMMUSIC_ROW N____, -1, 2, 6 ; 09 + PMMUSIC_ROW N_C_6, cI0, 3, 6 ; 0A + PMMUSIC_ROW N____, -1, 2, 6 ; 0B + PMMUSIC_ROW N____, -1, 0, 6 ; 0C + PMMUSIC_ROW N____, -1, 0, 6 ; 0D + PMMUSIC_ROW N_C_6, cI0, 3, 6 ; 0E + PMMUSIC_ROW N____, -1, 2, 6 ; 0F + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 10 + PMMUSIC_ROW N____, -1, 2, 6 ; 11 + PMMUSIC_ROW N_D_6, cI0, 3, 6 ; 12 + PMMUSIC_ROW N____, -1, 2, 6 ; 13 + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 14 + PMMUSIC_ROW N____, -1, 2, 6 ; 15 + PMMUSIC_ROW N_D_6, cI0, 3, 6 ; 16 + PMMUSIC_ROW N____, -1, 2, 6 ; 17 + PMMUSIC_ROW N_F_5, cI0, 3, 6 ; 18 + PMMUSIC_ROW N____, -1, 2, 6 ; 19 + PMMUSIC_ROW N____, -1, 0, 6 ; 1A + PMMUSIC_ROW N____, -1, 0, 6 ; 1B + PMMUSIC_ROW N_C_6, cI0, 3, 6 ; 1C + PMMUSIC_ROW N____, -1, 2, 6 ; 1D + PMMUSIC_ROW N_F_5, cI0, 3, 6 ; 1E + PMMUSIC_ROW N____, -1, 2, 6 ; 1F + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 20 + PMMUSIC_ROW N____, -1, 2, 6 ; 21 + PMMUSIC_ROW N____, -1, 0, 6 ; 22 + PMMUSIC_ROW N____, -1, 0, 6 ; 23 + PMMUSIC_ROW N_D_6, cI0, 3, 6 ; 24 + PMMUSIC_ROW N____, -1, 2, 6 ; 25 + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 26 + PMMUSIC_ROW N____, -1, 2, 6 ; 27 + PMMUSIC_ROW N_F_5, cI0, 3, 6 ; 28 + PMMUSIC_ROW N____, -1, 2, 6 ; 29 + PMMUSIC_ROW N_C_6, cI0, 3, 6 ; 2A + PMMUSIC_ROW N____, -1, 2, 6 ; 2B + PMMUSIC_ROW N____, -1, 0, 6 ; 2C + PMMUSIC_ROW N____, -1, 0, 6 ; 2D + PMMUSIC_ROW N_C_6, cI0, 3, 6 ; 2E + PMMUSIC_ROW N____, -1, 2, 6 ; 2F + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 30 + PMMUSIC_ROW N____, -1, 2, 6 ; 31 + PMMUSIC_ROW N_D_6, cI0, 3, 6 ; 32 + PMMUSIC_ROW N____, -1, 2, 6 ; 33 + PMMUSIC_ROW N_G_5, cI0, 3, 6 ; 34 + PMMUSIC_ROW N____, -1, 2, 6 ; 35 + PMMUSIC_ROW N_D_6, cI0, 3, 6 ; 36 + PMMUSIC_ROW N____, -1, 2, 6 ; 37 + PMMUSIC_ROW N_F_5, cI0, 3, 6 ; 38 + PMMUSIC_ROW N____, -1, 2, 6 ; 39 + PMMUSIC_ROW N____, -1, 0, 6 ; 3A + PMMUSIC_ROW N____, -1, 0, 6 ; 3B + PMMUSIC_ROW N_C_6, cI0, 3, 6 ; 3C + PMMUSIC_ROW N____, -1, 2, 6 ; 3D + PMMUSIC_ROW N_F_5, cI0, 3, 6 ; 3E + PMMUSIC_ROW N____, -1, 2, 6 ; 3F + PMMUSIC_NEXT + +music_chocoP2: + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 00 + PMMUSIC_ROW N____, -1, 3, 6 ; 01 + PMMUSIC_ROW N____, -1, 2, 6 ; 02 + PMMUSIC_ROW N____, -1, 2, 6 ; 03 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 04 + PMMUSIC_ROW N____, -1, 2, 6 ; 05 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 06 + PMMUSIC_ROW N____, -1, 2, 6 ; 07 + PMMUSIC_ROW N_E_6, cI1, 3, 6 ; 08 + PMMUSIC_ROW N____, -1, 2, 6 ; 09 + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 0A + PMMUSIC_ROW N____, -1, 2, 6 ; 0B + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 0C + PMMUSIC_ROW N____, -1, 2, 6 ; 0D + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 0E + PMMUSIC_ROW N____, -1, 2, 6 ; 0F + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 10 + PMMUSIC_ROW N____, -1, 3, 6 ; 11 + PMMUSIC_ROW N____, -1, 2, 6 ; 12 + PMMUSIC_ROW N____, -1, 2, 6 ; 13 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 14 + PMMUSIC_ROW N____, -1, 3, 6 ; 15 + PMMUSIC_ROW N____, -1, 2, 6 ; 16 + PMMUSIC_ROW N____, -1, 2, 6 ; 17 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 18 + PMMUSIC_ROW N____, -1, 3, 6 ; 19 + PMMUSIC_ROW N____, -1, 3, 6 ; 1A + PMMUSIC_ROW N____, -1, 2, 6 ; 1B + PMMUSIC_ROW N____, -1, 2, 6 ; 1C + PMMUSIC_ROW N____, -1, 2, 6 ; 1D + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 1E + PMMUSIC_ROW N____, -1, 2, 6 ; 1F + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 20 + PMMUSIC_ROW N____, -1, 2, 6 ; 21 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 22 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 23 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 24 + PMMUSIC_ROW N____, -1, 2, 6 ; 25 + PMMUSIC_ROW N_F_6, cI1, 3, 6 ; 26 + PMMUSIC_ROW N____, -1, 2, 6 ; 27 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 28 + PMMUSIC_ROW N____, -1, 3, 6 ; 29 + PMMUSIC_ROW N____, -1, 3, 6 ; 2A + PMMUSIC_ROW N____, -1, 2, 6 ; 2B + PMMUSIC_ROW N____, -1, 2, 6 ; 2C + PMMUSIC_ROW N____, -1, 2, 6 ; 2D + PMMUSIC_ROW N_F_6, cI1, 3, 6 ; 2E + PMMUSIC_ROW N____, -1, 2, 6 ; 2F + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 30 + PMMUSIC_ROW N____, -1, 2, 6 ; 31 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 32 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 33 + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 34 + PMMUSIC_ROW N____, -1, 2, 6 ; 35 + PMMUSIC_ROW N_E_7, cI1, 3, 6 ; 36 + PMMUSIC_ROW N____, -1, 2, 6 ; 37 + PMMUSIC_ROW N_F_7, cI1, 3, 6 ; 38 + PMMUSIC_ROW N____, -1, 3, 6 ; 39 + PMMUSIC_ROW N____, -1, 3, 6 ; 3A + PMMUSIC_ROW N____, -1, 2, 6 ; 3B + PMMUSIC_ROW N____, -1, 2, 6 ; 3C + PMMUSIC_ROW N____, -1, 2, 6 ; 3D + PMMUSIC_ROW N____, -1, 1, 6 ; 3E + PMMUSIC_ROW N____, -1, 1, 6 ; 3F + PMMUSIC_NEXT + +music_chocoP3: + PMMUSIC_ROW N_E_7, cI1, 3, 6 ; 00 + PMMUSIC_ROW N____, -1, 3, 6 ; 01 + PMMUSIC_ROW N____, -1, 2, 6 ; 02 + PMMUSIC_ROW N____, -1, 2, 6 ; 03 + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 04 + PMMUSIC_ROW N____, -1, 2, 6 ; 05 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 06 + PMMUSIC_ROW N____, -1, 2, 6 ; 07 + PMMUSIC_ROW N_FS6, cI1, 3, 6 ; 08 + PMMUSIC_ROW N____, -1, 2, 6 ; 09 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 0A + PMMUSIC_ROW N____, -1, 2, 6 ; 0B + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 0C + PMMUSIC_ROW N____, -1, 2, 6 ; 0D + PMMUSIC_ROW N_E_7, cI1, 3, 6 ; 0E + PMMUSIC_ROW N____, -1, 2, 6 ; 0F + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 10 + PMMUSIC_ROW N____, -1, 3, 6 ; 11 + PMMUSIC_ROW N____, -1, 2, 6 ; 12 + PMMUSIC_ROW N____, -1, 2, 6 ; 13 + PMMUSIC_ROW N_G_7, cI1, 3, 6 ; 14 + PMMUSIC_ROW N____, -1, 3, 6 ; 15 + PMMUSIC_ROW N____, -1, 2, 6 ; 16 + PMMUSIC_ROW N____, -1, 2, 6 ; 17 + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 18 + PMMUSIC_ROW N____, -1, 3, 6 ; 19 + PMMUSIC_ROW N____, -1, 3, 6 ; 1A + PMMUSIC_ROW N____, -1, 2, 6 ; 1B + PMMUSIC_ROW N____, -1, 2, 6 ; 1C + PMMUSIC_ROW N____, -1, 2, 6 ; 1D + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 1E + PMMUSIC_ROW N____, -1, 2, 6 ; 1F + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 20 + PMMUSIC_ROW N____, -1, 3, 6 ; 21 + PMMUSIC_ROW N____, -1, 2, 6 ; 22 + PMMUSIC_ROW N____, -1, 2, 6 ; 23 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 24 + PMMUSIC_ROW N____, -1, 2, 6 ; 25 + PMMUSIC_ROW N_FS6, cI1, 3, 6 ; 26 + PMMUSIC_ROW N____, -1, 2, 6 ; 27 + PMMUSIC_ROW N_D_6, cI1, 3, 6 ; 28 + PMMUSIC_ROW N____, -1, 2, 6 ; 29 + PMMUSIC_ROW N_FS6, cI1, 3, 6 ; 2A + PMMUSIC_ROW N____, -1, 2, 6 ; 2B + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 2C + PMMUSIC_ROW N____, -1, 2, 6 ; 2D + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 2E + PMMUSIC_ROW N____, -1, 2, 6 ; 2F + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 30 + PMMUSIC_ROW N____, -1, 2, 6 ; 31 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 32 + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 33 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 34 + PMMUSIC_ROW N____, -1, 2, 6 ; 35 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 36 + PMMUSIC_ROW N____, -1, 2, 6 ; 37 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 38 + PMMUSIC_ROW N____, -1, 3, 6 ; 39 + PMMUSIC_ROW N____, -1, 3, 6 ; 3A + PMMUSIC_ROW N____, -1, 2, 6 ; 3B + PMMUSIC_ROW N____, -1, 2, 6 ; 3C + PMMUSIC_ROW N____, -1, 2, 6 ; 3D + PMMUSIC_ROW N____, -1, 1, 6 ; 3E + PMMUSIC_ROW N____, -1, 1, 6 ; 3F + PMMUSIC_NEXT + +music_chocoP4: + PMMUSIC_ROW N_E_7, cI1, 3, 6 ; 00 + PMMUSIC_ROW N____, -1, 3, 6 ; 01 + PMMUSIC_ROW N____, -1, 2, 6 ; 02 + PMMUSIC_ROW N____, -1, 2, 6 ; 03 + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 04 + PMMUSIC_ROW N____, -1, 2, 6 ; 05 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 06 + PMMUSIC_ROW N____, -1, 2, 6 ; 07 + PMMUSIC_ROW N_FS6, cI1, 3, 6 ; 08 + PMMUSIC_ROW N____, -1, 2, 6 ; 09 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 0A + PMMUSIC_ROW N____, -1, 2, 6 ; 0B + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 0C + PMMUSIC_ROW N____, -1, 2, 6 ; 0D + PMMUSIC_ROW N_E_7, cI1, 3, 6 ; 0E + PMMUSIC_ROW N____, -1, 2, 6 ; 0F + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 10 + PMMUSIC_ROW N____, -1, 3, 6 ; 11 + PMMUSIC_ROW N____, -1, 2, 6 ; 12 + PMMUSIC_ROW N____, -1, 2, 6 ; 13 + PMMUSIC_ROW N_G_7, cI1, 3, 6 ; 14 + PMMUSIC_ROW N____, -1, 3, 6 ; 15 + PMMUSIC_ROW N____, -1, 2, 6 ; 16 + PMMUSIC_ROW N____, -1, 2, 6 ; 17 + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 18 + PMMUSIC_ROW N____, -1, 3, 6 ; 19 + PMMUSIC_ROW N____, -1, 3, 6 ; 1A + PMMUSIC_ROW N____, -1, 2, 6 ; 1B + PMMUSIC_ROW N____, -1, 2, 6 ; 1C + PMMUSIC_ROW N____, -1, 2, 6 ; 1D + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 1E + PMMUSIC_ROW N____, -1, 2, 6 ; 1F + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 20 + PMMUSIC_ROW N____, -1, 3, 6 ; 21 + PMMUSIC_ROW N_A_6, -1, 2, 6 ; 22 + PMMUSIC_ROW N_B_6, -1, 2, 6 ; 23 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 24 + PMMUSIC_ROW N____, -1, 2, 6 ; 25 + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 26 + PMMUSIC_ROW N____, -1, 2, 6 ; 27 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 28 + PMMUSIC_ROW N____, -1, 3, 6 ; 29 + PMMUSIC_ROW N____, -1, 3, 6 ; 2A + PMMUSIC_ROW N____, -1, 2, 6 ; 2B + PMMUSIC_ROW N____, -1, 2, 6 ; 2C + PMMUSIC_ROW N____, -1, 2, 6 ; 2D + PMMUSIC_ROW N_G_6, cI1, 3, 6 ; 2E + PMMUSIC_ROW N____, -1, 2, 6 ; 2F + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 30 + PMMUSIC_ROW N____, -1, 2, 6 ; 31 + PMMUSIC_ROW N_A_6, cI1, 3, 6 ; 32 + PMMUSIC_ROW N_B_6, cI1, 3, 6 ; 33 + PMMUSIC_ROW N_C_7, cI1, 3, 6 ; 34 + PMMUSIC_ROW N____, -1, 2, 6 ; 35 + PMMUSIC_ROW N_D_7, cI1, 3, 6 ; 36 + PMMUSIC_ROW N____, -1, 2, 6 ; 37 + PMMUSIC_ROW N_E_7, cI1, 3, 6 ; 38 + PMMUSIC_ROW N____, -1, 3, 6 ; 39 + PMMUSIC_ROW N____, -1, 2, 6 ; 3A + PMMUSIC_ROW N____, -1, 2, 6 ; 3B + PMMUSIC_ROW N_FS7, cI1, 3, 6 ; 3C + PMMUSIC_ROW N____, -1, 3, 6 ; 3D + PMMUSIC_ROW N____, -1, 2, 6 ; 3E + PMMUSIC_ROW N____, -1, 2, 6 ; 3F + PMMUSIC_NEXT + +music_chocoP5: + PMMUSIC_ROW N_G_7, cI1, 3, 6 ; 00 + PMMUSIC_ROW N____, -1, 3, 6 ; 01 + PMMUSIC_ROW N____, -1, 3, 6 ; 02 + PMMUSIC_ROW N____, -1, 2, 6 ; 03 + PMMUSIC_ROW N____, -1, 2, 6 ; 02 + PMMUSIC_ROW N____, -1, 2, 6 ; 03 + PMMUSIC_ROW N____, -1, 1, 6 ; 02 + PMMUSIC_ROW N____, -1, 1, 6 ; 03 + PMMUSIC_ROW N____, -1, 0, 48 ; 03 + PMMUSIC_NEXT + +music_choco_end: + .printf "Music Chocobo size: %i bytes\n", music_choco_end - music_choco diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_galactix.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_galactix.asm new file mode 100644 index 0000000000..44c57890a6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_galactix.asm @@ -0,0 +1,105 @@ +; Music exported with PokeMini Music Converter v1.1 +; Data file +; +; Title: Galactix Music +; Composer: Original by Lupin +; Programmer: Remix by JustBurn +; Mastertime: $00FF, (255) +; +; 4 Pattern(s) +; + +music_galactix_p0: + .dw $370C,$1DDB,$0776,$370C,$1DDB,$003B,$370C,$1DDB + .dw $0776,$370C,$191B,$0646,$370C,$13ED,$04FB,$370C + .dw $13ED,$0027,$370C,$1DDB,$0776,$370C,$12CE,$04B3 + .dw $370C,$12CE,$0025,$370C,$165D,$0597,$370C,$165D + .dw $002C,$3718,$13ED,$04FB,$370C,$13ED,$0027,$370C + .dw $13ED,$04FB,$370C,$1A99,$06A6,$370C,$1DDB,$0776 + .dw $370C,$1DDB,$003B,$370C,$1DDB,$0776,$370C,$191B + .dw $0646,$370C,$13ED,$04FB,$370C,$13ED,$0027,$370C + .dw $1DDB,$0776,$370C,$12CE,$04B3,$370C,$12CE,$0025 + .dw $370C,$10C1,$0430,$370C,$10C1,$0021,$370C,$13ED + .dw $04FB,$370C,$13ED,$0027,$370C,$13ED,$04FB,$370C + .dw $13ED,$0027,$370C,$1A99,$06A6,$4300,$0004 + +music_galactix2_p0: + .dw $3701,$1DDB,$0EED,$3701,$865F,$432F,$3703,$09F6 + .dw $027D,$3603,$0EED,$03BB,$3703,$0EED,$0776,$3601 + .dw $0EED,$0776,$3703,$0EED,$03BB,$3603,$0BD8,$02F6 + .dw $3703,$0EED,$0776,$3602,$0EED,$0776,$3703,$0BD8 + .dw $03B3,$3603,$09F6,$031C,$3703,$0EED,$0776,$3602 + .dw $0EED,$0776,$3703,$0860,$029E,$3603,$0C8D,$03EC + .dw $3703,$0C8D,$0646,$3602,$0C8D,$0646,$3701,$1DDB + .dw $0EED,$3701,$865F,$432F,$3703,$0C8D,$04B4,$3603 + .dw $09F6,$03BC,$3703,$0C8D,$0646,$3601,$0C8D,$0646 + .dw $3703,$09F6,$03BC,$3603,$0860,$0324,$3703,$0C8D + .dw $0646,$3602,$0C8D,$0646,$3703,$06A5,$02E8,$3603 + .dw $09F6,$045B,$3703,$09F6,$04FB,$3602,$09F6,$04FB + .dw $3703,$09F6,$045B,$3603,$0776,$0343,$3703,$09F6 + .dw $04FB,$3602,$09F6,$04FB,$3701,$1DDB,$0EED,$3701 + .dw $865F,$432F,$3703,$0776,$0343,$3603,$06A5,$02E8 + .dw $3703,$09F6,$04FB,$3601,$09F6,$04FB,$3703,$06A5 + .dw $02E8,$3603,$09F6,$045B,$3703,$09F6,$04FB,$3602 + .dw $09F6,$04FB,$3703,$09F6,$03BC,$3603,$0776,$02CC + .dw $3703,$09F6,$04FB,$3602,$09F6,$04FB,$3703,$0776 + .dw $02CC,$3603,$06A5,$027D,$3703,$09F6,$04FB,$3602 + .dw $09F6,$04FB,$3701,$1DDB,$0EED,$3701,$865F,$432F + .dw $3703,$09F6,$031C,$3603,$0EED,$04AA,$3703,$0EED + .dw $0776,$3601,$0EED,$0776,$3703,$0EED,$04AA,$3603 + .dw $0BD8,$03B3,$3703,$0EED,$0776,$3602,$0EED,$0776 + .dw $3703,$0BD8,$02F6,$3603,$09F6,$027D,$3703,$0EED + .dw $0776,$3602,$0EED,$0776,$3703,$09F6,$027D,$3603 + .dw $0EED,$03BB,$3703,$0EED,$0776,$3602,$0EED,$0776 + .dw $3701,$1DDB,$0EED,$3701,$865F,$432F,$3703,$0966 + .dw $0259,$3603,$0776,$01DD,$3703,$0966,$04B3,$3601 + .dw $0966,$04B3,$3703,$0776,$01DD,$3603,$0646,$0191 + .dw $3703,$0966,$04B3,$3602,$0966,$04B3,$3703,$0646 + .dw $01F5,$3603,$0966,$02EF,$3703,$0966,$04B3,$3602 + .dw $0966,$04B3,$3703,$0B2E,$037E,$3603,$0860,$029E + .dw $3703,$0B2E,$0597,$3602,$0B2E,$0597,$3701,$1DDB + .dw $0EED,$3701,$865F,$432F,$3703,$0860,$0324,$3603 + .dw $0776,$02CC,$3703,$0B2E,$0597,$3601,$0B2E,$0597 + .dw $3703,$0776,$02CC,$3603,$0B2E,$0431,$3703,$0B2E + .dw $0597,$3602,$0B2E,$0597,$3703,$09F6,$045B,$3603 + .dw $0776,$0343,$3703,$09F6,$04FB,$3602,$09F6,$04FB + .dw $3703,$0776,$0343,$3603,$06A5,$02E8,$3703,$09F6 + .dw $04FB,$3602,$09F6,$04FB,$3701,$1DDB,$0EED,$3701 + .dw $865F,$432F,$3703,$06A5,$027D,$3603,$09F6,$03BC + .dw $3703,$09F6,$04FB,$3601,$09F6,$04FB,$3703,$09F6 + .dw $03BC,$3603,$0776,$02CC,$3703,$09F6,$04FB,$3602 + .dw $09F6,$04FB,$3703,$0776,$0254,$3603,$06A5,$0213 + .dw $3703,$09F6,$04FB,$3602,$09F6,$04FB,$3703,$06A5 + .dw $0213,$3603,$09F6,$031C,$3703,$09F6,$04FB,$3602 + .dw $09F6,$04FB,$3701,$1DDB,$0EED,$3701,$865F,$432F + .dw $3703,$0D4C,$0353,$3603,$0A8D,$02A3,$3703,$0D4C + .dw $06A6,$3601,$0D4C,$06A6,$3701,$1DDB,$0EED,$3701 + .dw $865F,$432F,$3703,$0A8D,$034C,$3603,$08DF,$02C5 + .dw $3703,$0D4C,$06A6,$3601,$0D4C,$06A6,$3701,$1DDB + .dw $0EED,$3701,$865F,$432F,$3703,$08DF,$0353,$3603 + .dw $0D4C,$04FC,$3703,$0D4C,$06A6,$3601,$0D4C,$06A6 + .dw $3701,$1DDB,$0077,$3701,$0FEA,$003F,$3703,$0D4C + .dw $0427,$3603,$0A8D,$034C,$3703,$0D4C,$06A6,$3601 + .dw $0D4C,$06A6,$4300,$0004 + +music_galactix_ENDBGM: + .dw $4300,$FFFC + +music_galactix2_ENDBGM: + .dw $4300,$FFFC +; +; 0 SFX +; +; +; 2 BGM +; + +music_galactix: + .dd music_galactix_p0 + .dd music_galactix_ENDBGM + + +music_galactix2: + .dd music_galactix2_p0 + .dd music_galactix2_ENDBGM + diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_galactix.pmmusic b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_galactix.pmmusic new file mode 100644 index 0000000000..9cfd29ca5f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_galactix.pmmusic @@ -0,0 +1,74 @@ +TITLE Galactix Music +COMPOSER Original by Lupin +PROGRAMMER Remix by JustBurn + +MTIME $00FF + +PAT music_galactix_p0 { w48 o4 %64 + c %2c%64 c d+ g %2g%64 c g+ + %2g+%64 f %2f%64 g2 %2g%64 g d + c %2c%64 c d+ g %2g%64 c g+ + %2g+%64 a+ %2a+%64 g %2g%64 g %2g%64 d +} + +BGM music_galactix { | music_galactix_p0 } + +MACRO D { + xt1 v15 xp-36 c12 xt3 v15 +} + +MACRO E { + %$04 xt1 v15 xp72 c9 xt3 v15 +} + +PAT music_galactix2_p0 { w48 s48 o5 l9 xt3 + D + %$40 xa4:7 c %$80 xd c12 + %$40 xa4:7 c %$80 xd c9 + %$50 xa4:7 c %$80 xd c9 + %$50 xa4:7 d+ %$80 xd d+9 + D + %$60 xa4:7 d+ %$80 xd d+12 + %$60 xa4:7 d+ %$80 xd d+9 + %$70 xa5:7 g %$80 xd g9 + %$70 xa5:7 g %$80 xd g9 + D + %$70 xa5:7 g %$80 xd g12 + %$70 xa5:7 g %$80 xd g9 + %$60 xa5:7 g %$80 xd g9 + %$60 xa5:7 g %$80 xd g9 + D + %$50 xa4:7 c %$80 xd c12 + %$50 xa4:7 c %$80 xd c9 + %$40 xa4:7 c %$80 xd c9 + %$40 xa4:7 c %$80 xd c9 + D + %$40 xa4:7 g+ %$80 xd g+12 + %$40 xa4:7 g+ %$80 xd g+9 + %$50 xa4:7 g+ %$80 xd g+9 + %$50 xa5:7 f %$80 xd f9 + D + %$60 xa5:7 f %$80 xd f12 + %$60 xa5:7 f %$80 xd f9 + %$70 xa5:7 g %$80 xd g9 + %$70 xa5:7 g %$80 xd g9 + D + %$60 xa5:7 g %$80 xd g12 + %$60 xa5:7 g %$80 xd g9 + %$50 xa5:7 g %$80 xd g9 + %$50 xa5:7 g %$80 xd g9 + D + %$40 xa4:7 d %$80 xd d12 + D + %$50 xa4:7 d %$80 xd d12 + D + %$60 xa4:7 d %$80 xd d12 + E + %$50 xa4:7 d %$80 xd d12 +} + +BGM music_galactix2 { | music_galactix2_p0 } + +/* +c c+ d d+ e f f+ g g+ a a+ b +*/ diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_metroid.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_metroid.asm new file mode 100644 index 0000000000..7d3ac9e3f1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_metroid.asm @@ -0,0 +1,120 @@ +; Music exported with PokeMini Music Converter v1.1 +; Data file +; +; Title: Metroid +; Composer: Nintendo +; Programmer: JustBurn +; Mastertime: $00FF, (255) +; +; 5 Pattern(s) +; + +music_metroid_p0: + .dw $8300,$0000,$370E,$1A99,$0BA2,$360E,$1A99,$0BA2 + .dw $3404,$1A99,$0BA2,$370E,$1A99,$0BA2,$360E,$1A99 + .dw $0BA2,$3404,$1A99,$0BA2,$370E,$1A99,$0BA2,$360E + .dw $1A99,$0BA2,$3404,$1A99,$0BA2,$360E,$1A99,$0BA2 + .dw $350E,$1A99,$0BA2,$3404,$1A99,$0BA2,$370E,$10C1 + .dw $0754,$360E,$10C1,$0754,$3404,$10C1,$0754,$370E + .dw $10C1,$0754,$360E,$10C1,$0754,$3404,$10C1,$0754 + .dw $370E,$10C1,$0754,$360E,$10C1,$0754,$3404,$10C1 + .dw $0754,$360E,$10C1,$0754,$350E,$10C1,$0754,$3404 + .dw $10C1,$0754,$370E,$165D,$09C8,$360E,$165D,$09C8 + .dw $3404,$165D,$09C8,$370E,$165D,$09C8,$360E,$165D + .dw $09C8,$3404,$165D,$09C8,$370E,$165D,$09C8,$360E + .dw $165D,$09C8,$3404,$165D,$09C8,$360E,$165D,$09C8 + .dw $350E,$165D,$09C8,$3404,$165D,$09C8,$0420,$0420 + .dw $0420,$0420,$370E,$1A99,$0BA2,$360E,$1A99,$0BA2 + .dw $3404,$1A99,$0BA2,$370E,$1A99,$0BA2,$360E,$1A99 + .dw $0BA2,$3404,$1A99,$0BA2,$370E,$1A99,$0BA2,$360E + .dw $1A99,$0BA2,$3404,$1A99,$0BA2,$360E,$1A99,$0BA2 + .dw $350E,$1A99,$0BA2,$3404,$1A99,$0BA2,$370E,$0EED + .dw $0687,$360E,$0EED,$0687,$3404,$0EED,$0687,$370E + .dw $0EED,$0687,$360E,$0EED,$0687,$3404,$0EED,$0687 + .dw $370E,$0EED,$0687,$360E,$0EED,$0687,$3404,$0EED + .dw $0687,$360E,$0EED,$0687,$350E,$0EED,$0687,$3404 + .dw $0EED,$0687,$370E,$10C1,$0754,$360E,$10C1,$0754 + .dw $3404,$10C1,$0754,$370E,$10C1,$0754,$360E,$10C1 + .dw $0754,$3404,$10C1,$0754,$370E,$10C1,$0754,$360E + .dw $10C1,$0754,$3404,$10C1,$0754,$360E,$10C1,$0754 + .dw $350E,$10C1,$0754,$3404,$10C1,$0754,$0420,$0420 + .dw $0420,$0420,$8300,$0001,$4300,$0004 + +music_metroid_p1: + .dw $8300,$0000,$3718,$11C0,$0852,$3608,$11C0,$0852 + .dw $3718,$2381,$10A4,$3608,$2381,$10A4,$3718,$13ED + .dw $0957,$3608,$13ED,$0957,$3718,$27DB,$12AE,$3608 + .dw $27DB,$12AE,$3718,$151C,$09E5,$3608,$151C,$09E5 + .dw $3718,$2A39,$13CA,$3608,$2A39,$13CA,$3718,$17B2 + .dw $0B1B,$3608,$17B2,$0B1B,$3718,$2F65,$1637,$3608 + .dw $2F65,$1637,$3718,$13ED,$0957,$3608,$13ED,$0957 + .dw $3718,$27DB,$12AE,$3608,$27DB,$12AE,$3718,$151C + .dw $09E5,$3608,$151C,$09E5,$3718,$2A39,$13CA,$3608 + .dw $2A39,$13CA,$3718,$17B2,$0B1B,$3608,$17B2,$0B1B + .dw $3718,$2F65,$1637,$3608,$2F65,$1637,$3718,$1A99 + .dw $0C77,$3608,$1A99,$0C77,$3718,$3533,$18EF,$3608 + .dw $3533,$18EF,$8300,$0001,$4300,$0004 + +music_metroid_p2: + .dw $3718,$151C,$0A8E,$3608,$151C,$0A8E,$3718,$13ED + .dw $09F6,$3608,$13ED,$09F6,$3718,$11C0,$08E0,$3608 + .dw $11C0,$08E0,$3718,$0FD0,$07E8,$3608,$0FD0,$07E8 + .dw $3718,$0D4C,$06A6,$3608,$0D4C,$06A6,$3718,$0BD8 + .dw $05EC,$3608,$0BD8,$05EC,$3718,$0A8D,$0546,$3608 + .dw $0A8D,$0546,$3718,$09F6,$04FB,$3608,$09F6,$04FB + .dw $3748,$08DF,$046F,$3618,$08DF,$046F,$370C,$09F6 + .dw $04FB,$3604,$09F6,$04FB,$370C,$0A8D,$0546,$3604 + .dw $0A8D,$0546,$3748,$09F6,$04FB,$3618,$09F6,$04FB + .dw $370C,$0A8D,$0546,$3604,$0A8D,$0546,$370C,$0BD8 + .dw $05EC,$3604,$0BD8,$05EC,$3748,$0D4C,$06A6,$3618 + .dw $0D4C,$06A6,$3718,$08DF,$046F,$3608,$08DF,$046F + .dw $3760,$06A5,$0352,$3620,$06A5,$0352,$3730,$0860 + .dw $0430,$3610,$0860,$0430,$3730,$08DF,$046F,$3610 + .dw $08DF,$046F,$3730,$09F6,$04FB,$3610,$09F6,$04FB + .dw $3730,$0A8D,$0546,$3610,$0A8D,$0546,$3748,$0BD8 + .dw $05EC,$3618,$0BD8,$05EC,$3718,$0A8D,$0546,$3608 + .dw $0A8D,$0546,$3748,$08DF,$046F,$3618,$08DF,$046F + .dw $3718,$06A5,$0352,$3608,$06A5,$0352,$3748,$0BD8 + .dw $05EC,$3618,$0BD8,$05EC,$3718,$0A8D,$0546,$3608 + .dw $0A8D,$0546,$3760,$0D4C,$06A6,$3620,$0D4C,$06A6 + .dw $3730,$11C0,$08E0,$3610,$11C0,$08E0,$3730,$0FD0 + .dw $07E8,$3610,$0FD0,$07E8,$3730,$0D4C,$06A6,$3610 + .dw $0D4C,$06A6,$3730,$0BD8,$05EC,$3610,$0BD8,$05EC + .dw $3748,$0D4C,$06A6,$3618,$0D4C,$06A6,$3718,$10C1 + .dw $0860,$3608,$10C1,$0860,$3760,$13ED,$09F6,$3620 + .dw $13ED,$09F6,$4300,$0004 + +music_metroid_p3: + .dw $3724,$0BD8,$058D,$360C,$0BD8,$058D,$3724,$0A8D + .dw $04F2,$360C,$0A8D,$04F2,$3724,$08DF,$0428,$360C + .dw $08DF,$0428,$3724,$06A5,$031D,$360C,$06A5,$031D + .dw $3724,$0D4C,$063B,$360C,$0D4C,$063B,$3724,$0B2E + .dw $053D,$360C,$0B2E,$053D,$3724,$0776,$037F,$360C + .dw $0776,$037F,$3724,$08DF,$0428,$360C,$08DF,$0428 + .dw $3724,$0C8D,$05E2,$360C,$0C8D,$05E2,$3724,$09F6 + .dw $04AB,$360C,$09F6,$04AB,$3724,$06A5,$031D,$360C + .dw $06A5,$031D,$3724,$0860,$03ED,$360C,$0860,$03ED + .dw $3724,$08DF,$0428,$360C,$08DF,$0428,$3724,$0BD8 + .dw $058D,$360C,$0BD8,$058D,$3724,$0FD0,$0769,$360C + .dw $0FD0,$0769,$3724,$0BD8,$058D,$360C,$0BD8,$058D + .dw $3724,$0966,$0467,$360C,$0966,$0467,$3724,$0BD8 + .dw $058D,$360C,$0BD8,$058D,$3724,$0FD0,$0769,$360C + .dw $0FD0,$0769,$3724,$0BD8,$058D,$360C,$0BD8,$058D + .dw $4300,$0004 + +music_metroid_ENDBGM: + .dw $4300,$FFF0 +; +; 0 SFX +; +; +; 1 BGM +; + +music_metroid: + .dd music_metroid_p0 + .dd music_metroid_p1 + .dd music_metroid_p2 + .dd music_metroid_p3 + .dd music_metroid_ENDBGM + diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_metroid.pmmusic b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_metroid.pmmusic new file mode 100644 index 0000000000..af0961dcb2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_metroid.pmmusic @@ -0,0 +1,33 @@ +TITLE Metroid +COMPOSER Nintendo +PROGRAMMER JustBurn + +MTIME $00FF + +VOLLVL system + +PAT music_metroid_p0 { w64 o4 %112 + q56 s32 l2 [ dddv2d v3b-b-b-v2b- v3fffv2f rrrr v3dddv2d v3>cccv2c< v3b-b-b-v2b- rrrr ] +} + +PAT music_metroid_p1 { w128 o4 %120 + s48 l4 [ agf#e gf#ed def#g a2.l8gf# g2.f#e + d2.a4> d1 d de d.dcde a-ee +} + +BGM music_metroid { | +music_metroid_p0 +music_metroid_p1 +music_metroid_p2 +music_metroid_p3 +} diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_pmintro.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_pmintro.asm new file mode 100644 index 0000000000..35fc093505 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_pmintro.asm @@ -0,0 +1,31 @@ +music_pmintro: + PMMUSIC_PATTERN music_pmintroPatt + +music_pmintroPatt: + + PMMUSIC_ROW N_E_5, $80, 3, 4 + PMMUSIC_ROW N_E_5, $80, 2, 4 + PMMUSIC_ROW N_A_5, $80, 3, 4 + PMMUSIC_ROW N_A_5, $80, 2, 4 + PMMUSIC_ROW N____, -1, 0, 9 + PMMUSIC_ROW N_D_6, $80, 3, 4 + PMMUSIC_ROW N_D_6, $80, 2, 4 + PMMUSIC_ROW N_CS6, $80, 3, 4 + PMMUSIC_ROW N_CS6, $80, 2, 4 + PMMUSIC_ROW N_A_5, $80, 3, 4 + PMMUSIC_ROW N_A_5, $80, 2, 4 + PMMUSIC_ROW N_E_6, $80, 3, 4 + PMMUSIC_ROW N_E_6, $80, 2, 4 + PMMUSIC_ROW N____, -1, 0, 24 + PMMUSIC_ROW N_D_6, $80, 3, 3 + PMMUSIC_ROW N_A_6, $80, 3, 3 + PMMUSIC_ROW N_E_7, $80, 3, 3 + PMMUSIC_ROW N_B_7, $80, 3, 3 + PMMUSIC_ROW N_E_7, $80, 3, 3 + PMMUSIC_ROW N_B_7, $80, 3, 3 + PMMUSIC_ROW N____, -1, 0, 6 + + PMMUSIC_END + +music_pmintro_end: + .printf "Music PMIntro size: %i bytes\n", music_pmintro_end - music_pmintro diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_test.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_test.asm new file mode 100644 index 0000000000..24b6d78042 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_test.asm @@ -0,0 +1,91 @@ +music_test: + PMMUSIC_PATTERN music_testPatt + +music_testPatt: + + ; Note test + PMMUSIC_WRITERAM (7 * 12 + 11), $30 + PMMUSIC_ROW N_C_5, $80, 3, 12 + PMMUSIC_ROW N_CS5, $80, -1, 12 + PMMUSIC_ROW N_D_5, $80, -1, 12 + PMMUSIC_ROW N_DS5, $80, -1, 12 + PMMUSIC_ROW N_E_5, $80, -1, 12 + PMMUSIC_ROW N_F_5, $80, -1, 12 + PMMUSIC_ROW N_FS5, $80, -1, 12 + PMMUSIC_ROW N_G_5, $80, -1, 12 + PMMUSIC_ROW N_GS5, $80, -1, 12 + PMMUSIC_ROW N_A_5, $80, -1, 12 + PMMUSIC_ROW N_AS5, $80, -1, 12 + PMMUSIC_ROW N_B_5, $80, -1, 12 + + ; Pulse width test + PMMUSIC_WRITERAM (7 * 12 + 11), $31 + PMMUSIC_MARK 0 + PMMUSIC_ROW N_C_5, $80, 3, 1 + PMMUSIC_ROW N_C_5, $70, -1, 1 + PMMUSIC_ROW N_C_5, $60, -1, 1 + PMMUSIC_ROW N_C_5, $50, -1, 1 + PMMUSIC_ROW N_C_5, $40, -1, 1 + PMMUSIC_ROW N_C_5, $30, -1, 1 + PMMUSIC_ROW N_C_5, $20, -1, 1 + PMMUSIC_ROW N_C_5, $10, -1, 1 + PMMUSIC_ROW N_C_5, $00, -1, 1 + PMMUSIC_ROW N_C_5, $10, -1, 1 + PMMUSIC_ROW N_C_5, $20, -1, 1 + PMMUSIC_ROW N_C_5, $30, -1, 1 + PMMUSIC_ROW N_C_5, $40, -1, 1 + PMMUSIC_ROW N_C_5, $50, -1, 1 + PMMUSIC_ROW N_C_5, $60, -1, 1 + PMMUSIC_LOOP 0, 3 + + ; Volume Test + PMMUSIC_WRITERAM (7 * 12 + 11), $32 + PMMUSIC_ROW N_A_5, $80, 3, 48 + PMMUSIC_ROW N_A_5, -1, 2, 48 + PMMUSIC_ROW N_A_5, -1, 1, 48 + PMMUSIC_ROW N_A_5, -1, 0, 48 + + ; Arpeggio & PMMUSIC_LOOP test + PMMUSIC_WRITERAM (7 * 12 + 11), $33 + PMMUSIC_MARK 0 + PMMUSIC_ROW N_C_5, $80, 3, 2 + PMMUSIC_ROW N_DS5, $80, 3, 2 + PMMUSIC_LOOP 0, 15 + PMMUSIC_MARK 0 + PMMUSIC_ROW N_C_5, $80, 3, 2 + PMMUSIC_ROW N_E_5, $80, 3, 2 + PMMUSIC_LOOP 0, 15 + + ; Speed Test + PMMUSIC_WRITERAM (7 * 12 + 11), $34 + PMMUSIC_ROW N_A_5, $40, 3, 12 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 11 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 10 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 9 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 8 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 7 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 6 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 5 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 4 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 3 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 2 + PMMUSIC_ROW N____, -1, 0, 6 + PMMUSIC_ROW N_A_5, $40, 3, 1 + PMMUSIC_ROW N____, -1, 0, 6 + + PMMUSIC_WRITERAM (7 * 12 + 11), $20 + + PMMUSIC_END + +music_test_end: + .printf "Music Test size: %i bytes\n", music_test_end - music_test diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_unknown.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_unknown.asm new file mode 100644 index 0000000000..ae21bb107c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_unknown.asm @@ -0,0 +1,202 @@ +; Music exported with PokeMini Music Converter v1.1 +; Data file +; +; Title: Unknown, received from Lupin +; Composer: Unknown +; Programmer: Lupin +; Mastertime: $00FF, (255) +; +; 4 Pattern(s) +; + +bgm_unk_tune1_p0: + .dw $8300,$0000,$8300,$0400,$3704,$1DDB,$0EED,$3602 + .dw $1DDB,$0EED,$3704,$0EED,$0776,$3602,$0EED,$0776 + .dw $3704,$191B,$0C8D,$3602,$191B,$0C8D,$3704,$0EED + .dw $0776,$3602,$0EED,$0776,$3704,$13ED,$09F6,$3602 + .dw $13ED,$09F6,$3704,$0EED,$0776,$3602,$0EED,$0776 + .dw $3704,$191B,$0C8D,$3602,$191B,$0C8D,$3704,$0EED + .dw $0776,$3602,$0EED,$0776,$8300,$0402,$3704,$1FA2 + .dw $0FD1,$3602,$1FA2,$0FD1,$3704,$0FD0,$07E8,$3602 + .dw $0FD0,$07E8,$3704,$3237,$191B,$3602,$3237,$191B + .dw $3704,$0FD0,$07E8,$3602,$0FD0,$07E8,$3704,$27DB + .dw $13ED,$3602,$27DB,$13ED,$3704,$0FD0,$07E8,$3602 + .dw $0FD0,$07E8,$3704,$3237,$191B,$3602,$3237,$191B + .dw $3704,$0FD0,$07E8,$3602,$0FD0,$07E8,$8300,$0004 + .dw $3724,$1DDB,$0EED,$360C,$1DDB,$0EED,$3724,$259E + .dw $12CF,$360C,$259E,$12CF,$3724,$2183,$10C1,$360C + .dw $2183,$10C1,$3724,$27DB,$13ED,$360C,$27DB,$13ED + .dw $4300,$0004 + +bgm_unk_tune2_p0: + .dw $3709,$1DDB,$0EED,$3603,$1DDB,$0EED,$3704,$2381 + .dw $11C0,$3602,$2381,$11C0,$3704,$1DDB,$0EED,$3602 + .dw $1DDB,$0EED,$3709,$17B2,$0BD9,$3603,$17B2,$0BD9 + .dw $3704,$1DDB,$0EED,$3602,$1DDB,$0EED,$3704,$17B2 + .dw $0BD9,$3602,$17B2,$0BD9,$3724,$13ED,$09F6,$360C + .dw $13ED,$09F6,$3704,$17B2,$0BD9,$3602,$17B2,$0BD9 + .dw $3704,$13ED,$09F6,$3602,$13ED,$09F6,$3736,$0FD0 + .dw $07E8,$3612,$0FD0,$07E8,$040C,$3709,$0EED,$0776 + .dw $3603,$0EED,$0776,$3704,$11C0,$08E0,$3602,$11C0 + .dw $08E0,$3704,$0FD0,$07E8,$3602,$0FD0,$07E8,$3724 + .dw $0EED,$0776,$360C,$0EED,$0776,$3709,$0D4C,$06A6 + .dw $3603,$0D4C,$06A6,$3704,$0EED,$0776,$3602,$0EED + .dw $0776,$3704,$0D4C,$06A6,$3602,$0D4C,$06A6,$371B + .dw $0BD8,$05EC,$3609,$0BD8,$05EC,$3704,$0BD8,$05EC + .dw $3602,$0BD8,$05EC,$3704,$0BD8,$05EC,$3602,$0BD8 + .dw $05EC,$3712,$0BD8,$05EC,$3606,$0BD8,$05EC,$3704 + .dw $11C0,$08E0,$3602,$11C0,$08E0,$3704,$0FD0,$07E8 + .dw $3602,$0FD0,$07E8,$3704,$0EED,$0776,$3602,$0EED + .dw $0776,$3704,$0D4C,$06A6,$3602,$0D4C,$06A6,$371B + .dw $0BD8,$05EC,$3609,$0BD8,$05EC,$3704,$0D4C,$06A6 + .dw $3602,$0D4C,$06A6,$3704,$0BD8,$05EC,$3602,$0BD8 + .dw $05EC,$371B,$09F6,$04FB,$3609,$09F6,$04FB,$3704 + .dw $0B2E,$0597,$3602,$0B2E,$0597,$3704,$0D4C,$06A6 + .dw $3602,$0D4C,$06A6,$371B,$0BD8,$05EC,$3609,$0BD8 + .dw $05EC,$3704,$0D4C,$06A6,$3602,$0D4C,$06A6,$3704 + .dw $0BD8,$05EC,$3602,$0BD8,$05EC,$371B,$09F6,$04FB + .dw $3609,$09F6,$04FB,$3704,$0B2E,$0597,$3602,$0B2E + .dw $0597,$3704,$0D4C,$06A6,$3602,$0D4C,$06A6,$3709 + .dw $0BD8,$05EC,$3603,$0BD8,$05EC,$3704,$0D4C,$06A6 + .dw $3602,$0D4C,$06A6,$3704,$0EED,$0776,$3602,$0EED + .dw $0776,$3712,$11C0,$08E0,$3606,$11C0,$08E0,$040C + .dw $3704,$13ED,$09F6,$3602,$13ED,$09F6,$3704,$11C0 + .dw $08E0,$3602,$11C0,$08E0,$3709,$0FD0,$07E8,$3603 + .dw $0FD0,$07E8,$3704,$11C0,$08E0,$3602,$11C0,$08E0 + .dw $3704,$13ED,$09F6,$3602,$13ED,$09F6,$3724,$17B2 + .dw $0BD9,$360C,$17B2,$0BD9,$0418,$3704,$11C0,$08E0 + .dw $3602,$11C0,$08E0,$3704,$0FD0,$07E8,$3602,$0FD0 + .dw $07E8,$3704,$0EED,$0776,$3602,$0EED,$0776,$3704 + .dw $0D4C,$06A6,$3602,$0D4C,$06A6,$371B,$0BD8,$05EC + .dw $3609,$0BD8,$05EC,$3704,$0D4C,$06A6,$3602,$0D4C + .dw $06A6,$3704,$0BD8,$05EC,$3602,$0BD8,$05EC,$371B + .dw $09F6,$04FB,$3609,$09F6,$04FB,$3704,$0B2E,$0597 + .dw $3602,$0B2E,$0597,$3704,$0D4C,$06A6,$3602,$0D4C + .dw $06A6,$371B,$0BD8,$05EC,$3609,$0BD8,$05EC,$3704 + .dw $0D4C,$06A6,$3602,$0D4C,$06A6,$3704,$0BD8,$05EC + .dw $3602,$0BD8,$05EC,$371B,$09F6,$04FB,$3609,$09F6 + .dw $04FB,$3704,$0B2E,$0597,$3602,$0B2E,$0597,$3704 + .dw $0D4C,$06A6,$3602,$0D4C,$06A6,$3709,$0BD8,$05EC + .dw $3603,$0BD8,$05EC,$3704,$0D4C,$06A6,$3602,$0D4C + .dw $06A6,$3704,$0BD8,$05EC,$3602,$0BD8,$05EC,$3712 + .dw $09F6,$04FB,$3606,$09F6,$04FB,$040C,$3704,$0BD8 + .dw $05EC,$3602,$0BD8,$05EC,$3704,$0B2E,$0597,$3602 + .dw $0B2E,$0597,$3709,$09F6,$04FB,$3603,$09F6,$04FB + .dw $3709,$07E7,$03F3,$3603,$07E7,$03F3,$3724,$0776 + .dw $03BB,$360C,$0776,$03BB,$3712,$07E7,$03F3,$3606 + .dw $07E7,$03F3,$0418,$371B,$0D4C,$06A6,$3609,$0D4C + .dw $06A6,$3704,$0EED,$0776,$3602,$0EED,$0776,$3704 + .dw $0FD0,$07E8,$3602,$0FD0,$07E8,$3712,$0EED,$0776 + .dw $3606,$0EED,$0776,$3712,$1DDB,$0EED,$3606,$1DDB + .dw $0EED,$3709,$0EED,$0776,$3603,$0EED,$0776,$3709 + .dw $165D,$0B2E,$3603,$165D,$0B2E,$3709,$11C0,$08E0 + .dw $3603,$11C0,$08E0,$3709,$0EED,$0776,$3603,$0EED + .dw $0776,$3709,$0FD0,$07E8,$3603,$0FD0,$07E8,$3709 + .dw $13ED,$09F6,$3603,$13ED,$09F6,$3709,$1A99,$0D4C + .dw $3603,$1A99,$0D4C,$3709,$13ED,$09F6,$3603,$13ED + .dw $09F6,$3709,$17B2,$0BD9,$3603,$17B2,$0BD9,$040C + .dw $3712,$17B2,$0BD9,$3606,$17B2,$0BD9,$3712,$0D4C + .dw $06A6,$3606,$0D4C,$06A6,$3709,$0EED,$0776,$3603 + .dw $0EED,$0776,$3709,$0FD0,$07E8,$3603,$0FD0,$07E8 + .dw $371B,$0EED,$0776,$3609,$0EED,$0776,$3704,$0FD0 + .dw $07E8,$3602,$0FD0,$07E8,$3704,$11C0,$08E0,$3602 + .dw $11C0,$08E0,$3712,$13ED,$09F6,$3606,$13ED,$09F6 + .dw $3712,$0FD0,$07E8,$3606,$0FD0,$07E8,$371B,$0D4C + .dw $06A6,$3609,$0D4C,$06A6,$3704,$0EED,$0776,$3602 + .dw $0EED,$0776,$3704,$0FD0,$07E8,$3602,$0FD0,$07E8 + .dw $3712,$0EED,$0776,$3606,$0EED,$0776,$3709,$0D4C + .dw $06A6,$3603,$0D4C,$06A6,$3709,$0BD8,$05EC,$3603 + .dw $0BD8,$05EC,$371B,$0B2E,$0597,$3609,$0B2E,$0597 + .dw $3709,$0BD8,$05EC,$3603,$0BD8,$05EC,$3709,$0D4C + .dw $06A6,$3603,$0D4C,$06A6,$3709,$0EED,$0776,$3603 + .dw $0EED,$0776,$3709,$0FD0,$07E8,$3603,$0FD0,$07E8 + .dw $3709,$0EED,$0776,$3603,$0EED,$0776,$3712,$0D4C + .dw $06A6,$3606,$0D4C,$06A6,$3709,$165D,$0B2E,$3603 + .dw $165D,$0B2E,$3709,$10C1,$0860,$3603,$10C1,$0860 + .dw $3712,$0D4C,$06A6,$3606,$0D4C,$06A6,$3709,$0BD8 + .dw $05EC,$3603,$0BD8,$05EC,$3709,$0B2E,$0597,$3603 + .dw $0B2E,$0597,$371B,$0BD8,$05EC,$3609,$0BD8,$05EC + .dw $3704,$0BD8,$05EC,$3602,$0BD8,$05EC,$3704,$0BD8 + .dw $05EC,$3602,$0BD8,$05EC,$3709,$0BD8,$05EC,$3603 + .dw $0BD8,$05EC,$3712,$0BD8,$05EC,$3606,$0BD8,$05EC + .dw $3709,$0BD8,$05EC,$3603,$0BD8,$05EC,$371B,$0BD8 + .dw $05EC,$3609,$0BD8,$05EC,$3704,$0BD8,$05EC,$3602 + .dw $0BD8,$05EC,$3704,$0BD8,$05EC,$3602,$0BD8,$05EC + .dw $3712,$0BD8,$05EC,$3606,$0BD8,$05EC,$3704,$2381 + .dw $11C0,$3602,$2381,$11C0,$3704,$1FA2,$0FD1,$3602 + .dw $1FA2,$0FD1,$3704,$1DDB,$0EED,$3602,$1DDB,$0EED + .dw $3704,$1A99,$0D4C,$3602,$1A99,$0D4C,$371B,$17B2 + .dw $0BD9,$3609,$17B2,$0BD9,$3704,$1A99,$0D4C,$3602 + .dw $1A99,$0D4C,$3704,$17B2,$0BD9,$3602,$17B2,$0BD9 + .dw $371B,$13ED,$09F6,$3609,$13ED,$09F6,$3704,$165D + .dw $0B2E,$3602,$165D,$0B2E,$3704,$1A99,$0D4C,$3602 + .dw $1A99,$0D4C,$371B,$17B2,$0BD9,$3609,$17B2,$0BD9 + .dw $3704,$1A99,$0D4C,$3602,$1A99,$0D4C,$3704,$17B2 + .dw $0BD9,$3602,$17B2,$0BD9,$371B,$13ED,$09F6,$3609 + .dw $13ED,$09F6,$3704,$165D,$0B2E,$3602,$165D,$0B2E + .dw $3704,$1A99,$0D4C,$3602,$1A99,$0D4C,$3709,$17B2 + .dw $0BD9,$3603,$17B2,$0BD9,$3704,$1A99,$0D4C,$3602 + .dw $1A99,$0D4C,$3704,$1DDB,$0EED,$3602,$1DDB,$0EED + .dw $3712,$2381,$11C0,$3606,$2381,$11C0,$040C,$3704 + .dw $27DB,$13ED,$3602,$27DB,$13ED,$3704,$2381,$11C0 + .dw $3602,$2381,$11C0,$3709,$1FA2,$0FD1,$3603,$1FA2 + .dw $0FD1,$3704,$2381,$11C0,$3602,$2381,$11C0,$3704 + .dw $27DB,$13ED,$3602,$27DB,$13ED,$3724,$2F65,$17B2 + .dw $360C,$2F65,$17B2,$0418,$3704,$2381,$11C0,$3602 + .dw $2381,$11C0,$3704,$1FA2,$0FD1,$3602,$1FA2,$0FD1 + .dw $3704,$1DDB,$0EED,$3602,$1DDB,$0EED,$3704,$1A99 + .dw $0D4C,$3602,$1A99,$0D4C,$371B,$17B2,$0BD9,$3609 + .dw $17B2,$0BD9,$3704,$1A99,$0D4C,$3602,$1A99,$0D4C + .dw $3704,$17B2,$0BD9,$3602,$17B2,$0BD9,$371B,$13ED + .dw $09F6,$3609,$13ED,$09F6,$3704,$165D,$0B2E,$3602 + .dw $165D,$0B2E,$3704,$1A99,$0D4C,$3602,$1A99,$0D4C + .dw $371B,$17B2,$0BD9,$3609,$17B2,$0BD9,$3704,$1A99 + .dw $0D4C,$3602,$1A99,$0D4C,$3704,$17B2,$0BD9,$3602 + .dw $17B2,$0BD9,$371B,$13ED,$09F6,$3609,$13ED,$09F6 + .dw $3704,$165D,$0B2E,$3602,$165D,$0B2E,$3704,$1A99 + .dw $0D4C,$3602,$1A99,$0D4C,$3709,$17B2,$0BD9,$3603 + .dw $17B2,$0BD9,$3704,$1A99,$0D4C,$3602,$1A99,$0D4C + .dw $3704,$17B2,$0BD9,$3602,$17B2,$0BD9,$3712,$13ED + .dw $09F6,$3606,$13ED,$09F6,$040C,$3704,$17B2,$0BD9 + .dw $3602,$17B2,$0BD9,$3704,$165D,$0B2E,$3602,$165D + .dw $0B2E,$3709,$13ED,$09F6,$3603,$13ED,$09F6,$3709 + .dw $0FD0,$07E8,$3603,$0FD0,$07E8,$3724,$11C0,$08E0 + .dw $360C,$11C0,$08E0,$3724,$11C0,$08E0,$360C,$11C0 + .dw $08E0,$3709,$1DDB,$0EED,$3603,$1DDB,$0EED,$3704 + .dw $2381,$11C0,$3602,$2381,$11C0,$3704,$1DDB,$0EED + .dw $3602,$1DDB,$0EED,$3709,$17B2,$0BD9,$3603,$17B2 + .dw $0BD9,$3704,$1DDB,$0EED,$3602,$1DDB,$0EED,$3704 + .dw $17B2,$0BD9,$3602,$17B2,$0BD9,$371B,$13ED,$09F6 + .dw $3609,$13ED,$09F6,$3704,$17B2,$0BD9,$3602,$17B2 + .dw $0BD9,$3704,$13ED,$09F6,$3602,$13ED,$09F6,$3709 + .dw $0FD0,$07E8,$3603,$0FD0,$07E8,$3704,$11C0,$08E0 + .dw $3602,$11C0,$08E0,$3704,$0FD0,$07E8,$3602,$0FD0 + .dw $07E8,$3724,$0EED,$0776,$360C,$0EED,$0776,$3712 + .dw $0FD0,$07E8,$3606,$0FD0,$07E8,$3709,$11C0,$08E0 + .dw $3603,$11C0,$08E0,$040C,$3704,$2381,$11C0,$3602 + .dw $2381,$11C0,$3704,$2381,$11C0,$3602,$2381,$11C0 + .dw $3704,$2381,$11C0,$3602,$2381,$11C0,$3704,$2381 + .dw $11C0,$3602,$2381,$11C0,$3724,$2381,$11C0,$360C + .dw $2381,$11C0,$4401,$0000,$4300,$0004 + +bgm_unk_tune1_ENDBGM: + .dw $4401,$0000 + +bgm_unk_tune2_ENDBGM: + .dw $4401,$0000 +; +; 0 SFX +; +; +; 2 BGM +; + +bgm_unk_tune1: + .dd bgm_unk_tune1_p0 + .dd bgm_unk_tune1_ENDBGM + + +bgm_unk_tune2: + .dd bgm_unk_tune2_p0 + .dd bgm_unk_tune2_ENDBGM + diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_unknown.pmmusic b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_unknown.pmmusic new file mode 100644 index 0000000000..98939598ef --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/music_unknown.pmmusic @@ -0,0 +1,18 @@ +TITLE Unknown, received from Lupin +COMPOSER Unknown +PROGRAMMER Lupin + +MTIME $00FF + +PAT bgm_unk_tune1_p0 { w48 s48 + o4 + [ [c8>c8c8c8c8<]3 b8b8b8b8 ]5 + c1< a-1 b-1 g1 +} + +PAT bgm_unk_tune2_p0 { w48 s48 + l8 v15c4ce4ceg1egb1.r4b+4ab>c1d4cde2.eee2cde2.deg2.fde2.deg2.fde4dccde2.deg2.fde2.deg2.fde4deg2r4efg4b4b+1b2r2d2.cc-c2cd2cc-c2.d2.c8c-8c2def2.edcc-cd2d2efe2.e8e8ee2ee2.e8e8e2<cde2.deg2.fde2.deg2.fde4dccde2.deg2.fde2.deg2.fde4deg2r4efg4b4a1a1c4ce4ceg2.egb4abb+1b2a4r4  U + %Gʀβ νC +đ h8hC F3E  +%&2%5 J  ΍Θ΍Θ΍Θ΍Θ΍Θ L "xq%6%/(*%A"/ E'ΌΌΌ' E (*%ʀι@ n%ʀм+ %ʀм-@% ʀ%Gʀβ νC3 (đ*h8hC6 F3E*(%%&25+J -'΍Θ΍Θ΍Θ΍Θ΍Θ'L "xq'  + + + + + HCSound TsT -f BGM 00 SFX 00 Vol BGM ? Vol SFX ? A= B= C=FX 8CDEF#%݀ +݁F A'``Fp`n%24DRϱLR9AϵΠCήC1HE߱t* EsEAt* ErF߱t* EFAt* E~t* EԎt* EԚ &2u 2ցO.;HirD222*2`D5/D5E΄΄΄΄Œ* M'hF΄΄+ Mqn8myԅԑ !@/EŐ* ƴ E`E5yE(+4c8myԅԑ( @F5r/F)+4_8myՅԑ @8myԅՑ @0123456789ABCDEF*+SndEng Tst ,PM Intro -OdekaChocobo2;Unk. Tune 1 :;Unk. Tune 2 ?Galactix 1P?GalactixRm1PDMetroidTitleDEBEEEE.+0_ 7v 0  0L  0 F 0  0.  0 +F 0  0f  0o 0`0 01_7v000000000000002_07o0003_7v7 F7v7 4_ 77 77 +77 777777777777777777 _D,7 6 7o6o 7R6R7 +6 +7o6o767R7o77z77z7D(-.../0$-@7 7}7 7. 17v7v7 7}7 7}7. 17v7. 17 7}7 7. 17v7v7 7}7 7}7. 17v7. 1@7R7777R777777o777o77 77 7777R77@777o7F7o777R7|w7R777o7F7>7F7o777777o7@777o7F7o777R7|w7R77oo7o77o77o7o777R77~@7|w0@767v6v7 6 7v6v7 6 7v6v7 6 7v6v7676772672767'6'7677267276$7 6$7% 6%$7! 6!$7' 6'C 767#6#76 7 6 767 6 $7 6 7 6 7 6 676  7v6v7676$7v 6v 7L 6L 7v6v7L 6L 7  6 7 6 7 6 7 6 76767v6v7L 6L 7  6 7L 6L 7 6 7  6 7. 6. 7L 6L 7  6 7L 6L 7 6 7  6 7. 6. 7L 6L  7 6 7L 6L 7v6v76 7 6 76 76767 6 $7 6 76767v6v7L 6L 7  6 7L 6L 7 6 7  6 7. 6. 7L 6L 7  6 7L 6L 7 6 7  6 7. 6. 7L 6L  7 6 7L 6L 7 6 7 6  7 6 7. 6.  7 6  76$7v 6v767L  6L 7v6v767v6v76 7v6v 7]. 6]. 76 7v6v 76 7 6 7L 6L 7 6 7 6 7 6 7L 6L  7v6v 767v 6v76767 6 767L  6L 7v6v767v6v 7L 6L  7 6 7.  6.  7 6  7L 6L  7v6v 76 7v6v7L 6L  7]. 6]. 7`6`7L 6L  7 6  7. 6. 7  6 7 6 7 6  7 6 7 6  7 6 7  6 7 6 7 6 7 6 7#6#76767L 6L 7 6 7L 6L 7 6 7 6 7]. 6]. 7L 6L 7 6 7L 6L 7 6 7 6 7]. 6]. 7L 6L 7 6 7L 6L 767#6# 7'6'7#6# 767#6#7'6'$7e/ 6e/7#6#76767L 6L 7 6 7L 6L 7 6 7 6 7]. 6]. 7L 6L 7 6 7L 6L 7 6 7 6 7]. 6]. 7L 6L 7 6 7L 6L 7 6 7 6 7 6 7]. 6]. 7 6 76$7 6$7 6 767#6#76 7 6 767 6 7 6 7 6 7 6 767676$7v 6v76 76 7#6#7#6#7#6#7#6#$7# 6#DCDD0*;1.; 7v 7; 7v 7F 7 7' 7v 7 7% 7] 7],7 7' 7 7 7v 7; 7v 7F 7 7' 7v 7 7% 70 7! 7 7' 7 7' 7C77_/C7 }67v6v76 7v6v7 6 7v6v7`6 7 F6 F77_/C7 6 7 F6 F7 6`$7 F6 F76 [7 6 7 [6vC7 6 77_/C7vC67 6 76 [7 6 7 6v7 6 7v6}7 6 77_/C7 67v6v76 7v6v7 6 }7v6v7 }67v6v77_/C7f Y6v7f 6f 7v6F7f 6f 7F6f 7f 6f 7. ~6`7. 6. 77_/C7`$6v7. 6. 7v6. 17. 6. 7 [6vC7 6 7vC67 6 77_/C7}6 7 6 7 6v7 6 7vT67 6 76 7 6 77_/C7L S6 +7L 6L 77_/C7 +L67L 6L 77_/C7S6L 7L 6L 7w7?7L '6 +L7L 6L CCCB;?<?7 6 4 7 6 4 7 6 4 6 5 4 7T6T4T7T6T4T7T6T4T6T5T4T7] 6] 4] 7] 6] 4] 7] 6] 4] 6] 5] 4]    7 6 4 7 6 4 7 6 4 6 5 4 7647647646547T6T4T7T6T4T7T6T4T6T5T4T    C7R6R7#6#7W 6W 7'6'7 6 79*69*7 6 7e/76e/77W 6W 7'6'7 6 79*69*7 6 7e/76e/77w 6w 735635C7 +6 +7 6 76767L 6L 7 6 7 +F6 +F7 6 H7o6o 7 6  7 +F6 +FH7 6  7 +F6 +F 7 6 H7L 6L 7o6o`7R 6R07`06`007o6o07 6 07 +F6 +FH7 6 7 +F6 +FH7o6o7R6RH7 6 7 +F6 +F`7L  6L 07607607L 6L 07 6 H7L 6L 7`6``7 6 C$7  6 $7 + 6 +$7( 6($7 6$7L ; 6L ;$7. = 6. =$7v 6v$7( 6($7  6 $7  6 $7 6$7` 6`$7( 6($7  6 $7i 6i$7  6 $7f g 6f g$7  6 $7i 6i$7  6 CC?lA8BCD77;7v7D7772 77v7777D7qw7^7oO7qw;7^f/7O'7;7e/7'77 7 D4v7v6;6qw6;6;D67+ +6- +D76] +7 q6e/76^6D~~~~?~?>><<>>>$ff$____ @ڿYpppppp00~<<~<< >>08<>><80>>__$.kk:Ff0 fb0zO]7zH>cAAc>*>>*>>````0 >qYM>@B@@bsYIof"cII6SP'gEE}9<~KIy0qy6II6OIi?fff6cA$$$$$$Ac6QY>A]]|~~|AII6>cAAc"AAc>AI]AcAI>cAQsrAA0p@A?AwcAA@`p >cAc>AI ?!q^A f&oMYs2AA@@?``?00Cg<D$<|@@<|@<``<<|p8p|<Dl88lD|Ldt\Ld>wAAwwAAw>pxLFLxpJ:z@@zz@8|TU]#uUU}{B!uTT}y@!uUT|x@ tWW|x@<@;}UU]9}TT]9}UT\E||AE}}CE}|@y}}ypx++xpD||UUE tTT||TT|~ I2{II{22zHHz22zJHx0:{AA{z@:zB@xx@z~~~~~~cw]Icc8|D|<~ >~|罙>kIk>L~ss~L0xJO}9<$<<$<d<>'=>kII~~******DD__DD@Q[ND@@DN[Q@`kk$66$6 0p<<<<~~~~~~ \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/sound_tst.pnproj b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/sound_tst.pnproj new file mode 100644 index 0000000000..cd2bc4a294 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/sound_tst.pnproj @@ -0,0 +1 @@ +sound_tst.asmsound_tst.minsound_tst.sym \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/sound_tst.pnps b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/sound_tst.pnps new file mode 100644 index 0000000000..9d344436eb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/sound_tst/sound_tst.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/Makefile b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/Makefile new file mode 100644 index 0000000000..f8d6657400 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/Makefile @@ -0,0 +1,33 @@ +.PHONY: all media run flash clean + +PMDEV_DIR = ../../.. + +IMAGE = +MUSIC = +DEPS = +SRC = main.asm +OUT = main.min + +IMAGE_OUT = $(IMAGE:.pmimage=.bin) +MUSIC_OUT = $(MUSIC:.pmmusic=.asm) + +all: $(OUT) +media: $(IMAGE_OUT) $(MUSIC_OUT) + +%.bin: %.pmimage + $(PMDEV_DIR)/pokemini_imgconv -q -c $< -o $@ + +%.asm: %.pmmusic + $(PMDEV_DIR)/pokemini_musicconv -q -i $< -o $@ + +$(OUT): $(SRC) $(DEPS) $(IMAGE_OUT) $(MUSIC_OUT) + $(PMDEV_DIR)/pmas $< $@ + +run: $(OUT) + $(PMDEV_DIR)/PokeMiniD $< & + +flash: $(OUT) + $(PMDEV_DIR)/PokeFlash -f $< + +clean: + $(RM) $(OUT) $(IMAGE_OUT) $(MUSIC_OUT) diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.asm b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.asm new file mode 100644 index 0000000000..881c1a5a3f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.asm @@ -0,0 +1,18 @@ + .include "pm_libs/pm_init.s" + + pm_header "MainTemplate", IRQ_KEY_POWER, 0 + + ; Shutdown down when power key pressed +irq_key_power: + cint CINT_SHUTDOWN + +main: + ; Enable interrupts + enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY + enable_mirq + +_loop: + halt + jmpb _loop + + pm_rominfo diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.min b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.min new file mode 100644 index 0000000000..0ea1589679 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.min @@ -0,0 +1,2 @@ +MN  + "$&(*,{.uoic]NINTENDOHmBwMainTemplate2P'@' '''''' ((((*@**()@) ))))))!EU h8ϴ nxxx#x$x%x&x'x(x)x*x x!x"H#%ή \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.pnproj b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.pnproj new file mode 100644 index 0000000000..d216dcef33 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.pnproj @@ -0,0 +1 @@ +main.asmmain.minmain.sym \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.pnps b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.pnps new file mode 100644 index 0000000000..7bd5015cd0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/examples/template/main.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/dev-misc/gedit_lang/pm_asm.lang b/PVPokeMini/PokeMini/pokemini-code/dev-misc/gedit_lang/pm_asm.lang new file mode 100644 index 0000000000..b8422f6f76 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/dev-misc/gedit_lang/pm_asm.lang @@ -0,0 +1,115 @@ + + + + + text/x-asm;text/x-assembler + *.asm;*.s + ; + + + + + + + + + + + +
+ +
+ +

LCD Controller

+

Overview

+

The Pokemon Mini LCD is a serial display with it's own on-board + framebuffer, and display settings. These are all abstracted by the PRC, + which handles display copies ($1000 ~ $12FF) and other various + functions. No commercial roms directly access the display, relying on + the PRC and BIOS to perform the various communications. This allows for + the PM to have hardware changes without having to rely on the same + display controller.

+

The display is driven by two data ports, $20FE and $20FF. Both + ports are read\write, the only difference between them is one sets the + CTRL line when accessing the data port on the LCD. The port is 8-bits + wide, and has a small set of standard commands.

+

The LCD is probably using the on-glass SSD1828 LCD controller or something very simliar.SED1565 LCD Controller

+

The controller got 96x65 132x65 Graphic Display Data RAM + (GDDRAM) with 96x64 pixels visible on the LCD. The additional RAM is for + an unused symbol driver. The PM most likely uses a parallel interface + to the controller, but serial interface might be available on the + connector of the LCD.

+

LCD Controller Commands

+

Lower case "x" denotes parameters used by the command. A question mark "?" denotes bits that are don't care.

+

The commands in this list are verified to work. The SSD1828 datasheet holds much more commands that are hardof which a few are hard to verify or didn't work on the PM.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ LCD Commands +
Command Description Notes
0000 xxxx Set Column (low nibble) xxxx = Column 0-15 (low nibble)
0001 0xxx Set Column (high nibble) xxxx = Column 0-8 (high nibble)
01xx xxxx Display Start line xxxxxx = 0-63 first line on display
1011 xxxx Set Page xxxx = Page (0-8, pages 0-7 are 8px high, Page 8 = 1px high)
1000 0001 Set Contrast Next write to FE or FF sets Constrast Level ($00-$3F)
1010 000x Segment Driver Direction Select x=0 (Normal) 1 (Reverse) Note on Reverse 131 is the leftmost + pixel and 36 the rightmost visible pixel. Pixels 35-0 are not visible. + This command only affects the addressing arithmetics on the next + read/writes and does not change any data that is already displayed.
1010 001x LCD Voltage Bias x=0 (1/9th = normal) 1 (1/7th = darker )
1010 010x Entire Display select x = 0 (normal) or 1 (all Pixels on)
1010 011x Invert Display select x = 0 (normal) or 1 (invert) effective immediately. Ram is not affected.
1010 111x Display ON/OFF x = 0 (off) or 1 (on)
1100 x??? Set scan direction (rows) x = 0 (normal from row 0 to 63) or 1 (from row 63 to 0 - verical mirror)
1110 0000 Read Modify Write A read to display ram wil not advance the ram pointer. Only a + write will advance the ram pointer. When active, column commands are not + available.
1110 1110 End Ends Read Modify Write mode.
1110 0010 Reset Initializes Display.
1110 0011 NOP No Operation. Also used to exit test mode.
+

Data reads/writes

+

Data can be read and written from/to the LCD at any time (but not when contrast command was executed, this is a special case). + The programmer should make sure that the page and column address pointers are pointing to the correct location.

+

When data was read or written the column address automatically increases by one.

+

After executing page address and both of the column address set operations data can be written to the selected location.

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/LIB_pm_init.html b/PVPokeMini/PokeMini/pokemini-code/doc/LIB_pm_init.html new file mode 100644 index 0000000000..3f13d7a689 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/LIB_pm_init.html @@ -0,0 +1,3159 @@ + + + + + +PokeMini Documentation + + + + + + + + + + +
+ +
+ +

LIB: pm_init

+

Initialize Pokemon-Mini and provide common declarations

+

pm_init.s

+

Type: Header File

+

Dependency: None

+

Including Rules: Must be on top of the main file

+

ROM/RAM Usage: None

+

Initialization

+

When the extra flag + IRQF_NOSTARTUP isn't expecified in PM_HEADER, + the following will be executed:

+
    +
  1. Interrupts are disabled
  2. +
  3. Upper addresses (Indexes) are cleared
  4. +
  5. Register N and stack are initialized
  6. +
  7. Upper address of map and sprite bases are set to 0
  8. +
  9. Seed of rand is set to 1
  10. +
  11. Interrupts enable are all cleared
  12. +
  13. Interrupts priorities set: PRC=1, Timers=2, Tmr256=1, Cartridge=3, Keypad=1, IR/Shock=2
  14. +
  15. Jump to main
  16. +
+

Otherwise only step 8 is executed.
+

+

Macros

+

Note: Macros names are case insensitive

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroDescription
PM_HEADER game_title, irq_flags, ex_flagsDeclare pokémon-mini header, ROM start
+ game_title = Maximum of 12 Characters
+ irq_flags = or IRQ_* flags
+ ex_flags = or IRQF_* flags
PM_ROMINFOOptional, report ROM and RAM size, must be included on the bottom of the main file.
CPU_CLEARClear BCD and NIBBLE modes
COLORPM_INITInitialize Color PM Interface
RIRQ rirq_flagReturn from IRQ, single IRQ_* only
PRIORITY_IRQS priority, irqs_selectSetup IRQ priorities, multiple IRQ_* allowed
+ priority = 0 - IRQs Disabled
+ priority = 1 - Low Priority
+ priority = 2 - Medium Priority
+ priority = 3 - High Priority
ENABLE_IRQS irqs_selectEnable IRQ(s), multiple IRQ_* allowed
DISABLE_IRQS irqs_selectDisable IRQ(s), multiple IRQ_* allowed
ENABLE_MIRQEnable Master Interrupt, same as "and f, ~FLAG_ID"
DISABLE_MIRQDisable Master Interrupt, same as "or f, FLAG_ID"
PM_ALIGN_MAP
+ PM_ALIGN_TILES
Align data for PRC map tiles, equivalent to ".align 8" but doesn't override assembler's aligment
PM_ALIGN_SPR
+ PM_ALIGN_OAM
Align data for PRC sprites tiles, equivalent to ".align 64" but doesn't override assembler's aligment
+

Peudo-instructions, automatically manage banks before jumping:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroDescription
fjmp labelFar version of JMP
fjc labelFar version of JC
fjnc labelFar version of JNC
fjz labelFar version of JZ
fjnz labelFar version of JNZ
fjdbnz labelFar version of JBDNZ
fjl labelFar version of JL
fjle labelFar version of JLE
fjg labelFar version of JG
fjge labelFar version of JGE
fjo labelFar version of JO
fjno labelFar version of JNO
fjns labelFar version of JNS
fjs labelFar version of JS
fcall labelFar version of CALL
fcallc labelFar version of CALLC
fcallnc labelFar version of CALLNC
fcallz labelFar version of CALLZ
fcallnz labelFar version of CALLNZ
fcalll labelFar version of CALLL
fcallle labelFar version of CALLLE
fcallg labelFar version of CALLG
fcallge labelFar version of CALLGE
fcallo labelFar version of CALLO
fcallno labelFar version of CALLNO
fcallns labelFar version of CALLNS
fcalls labelFar version of CALLS
+

Peudo-instructions, automatically update upper address:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroDescription
add24x numberAdd/Sub XI:X by number
add24y numberAdd/Sub YI:Y by number
add24hl numberAdd/Sub I:HL by number
add24x_a numberAdd/Sub XI:X by number, trash A on page cross
add24y_a numberAdd/Sub YI:Y by number, trash A on page cross
add24hl_a numberAdd/Sub I:HL by number, trash A on page cross
+

number value must be between -65535 and 65535
+ "INC" instruction will be used if number is 1
+ No code will be generated if number is 0

+

Defines

+

Definitions in bold have multiple definitions with the same value, hover the mouse over to see the list

+

RAM variables

+ + + + + + + + + + + + + + + + + + + + + +
DefinitionInitDescription
PMINIT_RAND0x000116-Bits Random Generator Seed
PMINIT_KEYPAD0x??Keypad status at start of ROM
PMINIT_FRAMECNT0x00Frame counter, used in CLib PRC wait routines
+

Memory bases

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionValueDescription
Registers bases  
SSTACK_BASE$1FFCSafe stack base (for RAM vector)
STACK_BASE$2000Stack base
REG_BASE$2000Registers base
N_BASE$20N register base
Memory bases  
VRAM_BASE$1000Videobuffer RAM base
SPR_BASE$1300Sprites base
MAP_BASE$1360MAP base
RAM_BASE$1500RAM base
PRC_MAP_BASE$2082PRC Map base
PRC_SPR_BASE$2085PRC Sprite base
Version  
PMINIT_VER5pminit library revision number
+

Registers

+

For more information about registers, check here

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionValueDescription
BIOS  
SYS_CTRL1$00System Control 1
SYS_CTRL2$01System Control 2
SYS_CTRL3$02System Control 3
Seconds Timer  
SEC_CTRL$08Second Counter Control
SEC_CNT_LO$09Second Counter Low
SEC_CNT_MID$0ASecond Counter Middle
SEC_CNT_HI$0BSecond Counter High
Battery status  
SYS_BATT$10Battery Sensor
Timers control  
TMR1_SCALE$18Timer 1 Prescalar
TMR1_ENA_OSC$19Timers Osc. Enable
+Timer 1 Osc. Select
TMR2_SCALE$1ATimer 2 Prescalar
TMR2_OSC$1BTimer 2 Osc. Select
TMR3_SCALE$1CTimer 3 Prescalar
TMR3_OSC$1DTimer 3 Osc. Select
Interrupts  
IRQ_PRI1$20IRQ Priority 1
IRQ_PRI2$21IRQ Priority 2
IRQ_PRI3$22IRQ Priority 3
IRQ_ENA1$23IRQ Enable 1
IRQ_ENA2$24IRQ Enable 2
IRQ_ENA3$25IRQ Enable 3
IRQ_ENA4$26IRQ Enable 4
IRQ_ACT1$27IRQ Active 1
IRQ_ACT2$28IRQ Active 2
IRQ_ACT3$29IRQ Active 3
IRQ_ACT4$2AIRQ Active 4
Timer 1  
TMR1_CTRL_L$30Timer 1 Control (Lo)
TMR1_CTRL_H$31Timer 1 Control (Hi)
TMR1_PRE_L$32Timer 1 Preset (Lo)
TMR1_PRE_H$33Timer 1 Preset (Hi)
TMR1_PVT_L$34Timer 1 Pivot (Lo)
TMR1_PVT_H$35Timer 1 Pivot (Hi)
TMR1_CNT_L$36Timer 1 Count (Lo)
TMR1_CNT_H$37Timer 1 Count (Hi)
Timer 2  
TMR2_CTRL_L$38Timer 2 Control (Lo)
TMR2_CTRL_H$39Timer 2 Control (Hi)
TMR2_PRE_L$3ATimer 2 Preset (Lo)
TMR2_PRE_H$3BTimer 2 Preset (Hi)
TMR2_PVT_L$3CTimer 2 Pivot (Lo)
TMR2_PVT_H$3DTimer 2 Pivot (Hi)
TMR2_CNT_L$3ETimer 2 Count (Lo)
TMR2_CNT_H$3FTimer 2 Count (Hi)
256 Hz Timer  
TMR256_CTRL$40256Hz Timer Control
TMR256_CNT$41256Hz Timer Counter
Timer 3  
TMR3_CTRL_L$48Timer 3 Control (Lo)
TMR3_CTRL_H$49Timer 3 Control (Hi)
TMR3_PRE_L$4ATimer 3 Preset (Lo)
TMR3_PRE_H$4BTimer 3 Preset (Hi)
TMR3_PVT_L$4CTimer 3 Pivot (Lo)
TMR3_PVT_H$4DTimer 3 Pivot (Hi)
TMR3_CNT_L$4ETimer 3 Count (Lo)
TMR3_CNT_H$4FTimer 3 Count (Hi)
Inputs  
KEY_PAD$52Key-Pad Status (Active 0)
CART_BUS$53Cart Bus
IO  
IO_DIR$60I/O Direction Select
IO_DATA$61I/O Data Register
Audio  
AUD_CTRL$70Audio Control
AUD_VOL$71Audio Volume
PRC  
PRC_MODE$80PRC Stage Control
PRC_RATE$81PRC Rate Control
PRC_MAP_LO$82PRC Map Tile Base Low
PRC_MAP_MID$83PRC Map Tile Base Middle
PRC_MAP_HI$84PRC Map Tile Base High
PRC_SCROLL_Y$85PRC Map Vertical Scroll
PRC_SCROLL_X$86PRC Map Horizontal Scroll
PRC_SPR_LO$87PRC Sprite Tile Base Low
PRC_SPR_MID$88PRC Sprite Tile Base Middle
PRC_SPR_HI$89PRC Sprite Tile Base High
PRC_CNT$8APRC Counter
PokeMini  
POKEMINI_CHR$D0Debug output a character
POKEMINI_HEX$D1Debug output a 8-bits hexadecimal
POKEMINI_UINTB$D2Debug output a unsigned 8-bits number
POKEMINI_SINTB$D3Debug output a signed 8-bits number
POKEMINI_UINTWL$D4Debug output a unsigned 16-bits number (Low Byte)
POKEMINI_UINTWH$D5Debug output a unsigned 16-bits number (High Byte)
POKEMINI_SINTWL$D6Debug output a signed 16-bits number (Low Byte)
POKEMINI_SINTWH$D7Debug output a signed 16-bits number (High Byte)
POKEMINI_FX8_8$DEDebug output a fixed point 8.8 number (Low Byte)
POKEMINI_FX8_8H$DFDebug output a fixed point 8.8 number (High Byte)
Color PM Interface  
COLORPM_CMD$F0Color PM Command, writing send a command.
+ Reading will check unlock status: $00 (Locked), $CE (Unlocked)
COLORPM_ADDR$F1CVRAM Address (Low Byte)
COLORPM_ADDRH$F2CVRAM Address (High Byte)
COLORPM_DATA$F3CVRAM Data
COLORPM_LP0$F4Low Nibble Pixel 0 Color
COLORPM_HP0$F5High Nibble Pixel 0 Color
COLORPM_LP1$F6Low Nibble Pixel 1 Color
COLORPM_HP1$F7Hig Nibble Pixel 1 Color
LCD Raw  
LCD_CTRL$FELCD Raw Control Byte
LCD_DATA$FFLCD Raw Data Byte
+

Misc. defines

+

Definitions to be used to comunicate with the hardware
+ For more information about registers, check here

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionValueUsageDescription
Master Interrupt   
DISABLE_IRQ$C0mov f, DISABLE_IRQDisable Master Interrupt
ENABLE_IRQ$80mov f, ENABLE_IRQEnable Master Interrupt
Timers Enable   
TMRS_ENABLE$30or [n+TMR1_ENA_OSC], TMRS_ENABLETimers Enable
  and [n+TMR1_ENA_OSC], ~TMRS_ENABLETimers Disable
TMRS_OSC1$20or [n+TMR1_ENA_OSC], TMRS_OSC1Timers 2Mhz Oscillator On
  and [n+TMR1_ENA_OSC], ~TMRS_OSC1Timers 2Mhz Oscillator Off
TMRS_OSC2$10or [n+TMR1_ENA_OSC], TMRS_OSC2Timers 32Khz Oscillator On
  and [n+TMR1_ENA_OSC], ~TMRS_OSC2Timers 32Khz Oscillator Off
Seconds Timer   
SEC_ENABLE$01or [n+SEC_CTRL], SEC_ENABLESecond Counter Enable
  and [n+SEC_CTRL], ~SEC_ENABLESecond Counter Disable
SEC_RESET$02or [n+SEC_CTRL], SEC_RESETSecond Counter Reset
Battery status   
LOW_BATTERY$20tst [n+SYS_BATT], LOW_BATTERYLow battery indicator
256Hz Timer   
TMR256_ENABLE$01or [n+TMR256_CTRL], TMR256_ENABLE256Hz Timer Enable
  and [n+TMR256_CTRL], ~TMR256_ENABLE256Hz Timer Disable
TMR256_RESET$02or [n+TMR256_CTRL], TMR256_RESET256Hz Timer Reset
Timer 1-3 Control   
TMR_8BITS$00mov [n+TMR1_CTRL_L], TMR8_BITS | ..
+ mov [n+TMR2_CTRL_L], TMR8_BITS | ..
+ mov [n+TMR3_CTRL_L], TMR8_BITS | ..
8-Bits Timer 1-3
TMR_16BITS$80mov [n+TMR1_CTRL_L], TMR16_BITS | ..
+ mov [n+TMR2_CTRL_L], TMR16_BITS | ..
+ mov [n+TMR3_CTRL_L], TMR16_BITS | ..
16-Bits Timer 1-3
TMR_PRESET$02or [n+TMR1_CTRL_L], TMR_PRESET
+ or [n+TMR1_CTRL_H],TMR_PRESET
+ or [n+TMR2_CTRL_L],TMR_PRESET
+ or [n+TMR2_CTRL_H],TMR_PRESET
+ or [n+TMR3_CTRL_L],TMR_PRESET
+ or [n+TMR3_CTRL_H],TMR_PRESET
Timer 1-3 Preset
TMR_ENABLE$04mov [n+TMR1_CTRL_L], TMR_ENABLE | ..
+ mov [n+TMR1_CTRL_H], TMR_ENABLE | ..
+ mov [n+TMR2_CTRL_L], TMR_ENABLE | ..
+ mov [n+TMR2_CTRL_H], TMR_ENABLE | ..
+ mov [n+TMR3_CTRL_L], TMR_ENABLE | ..
+ mov [n+TMR3_CTRL_H], TMR_ENABLE | ..
Timer 1-3 Enable
Timer 1-3 Scale   
TMR_DIV_OFF$00mov [n+TMR1_SCALE], TMR_DIV_OFF
+ mov [n+TMR2_SCALE], TMR_DIV_OFF
+ mov [n+TMR3_SCALE], TMR_DIV_OFF
Prescalar Off
TMR_DIV_2$08mov [n+TMR1_SCALE], TMR_DIV_2
+ mov [n+TMR2_SCALE], TMR_DIV_2
+ mov [n+TMR3_SCALE], TMR_DIV_2
Prescalar /2 (Osc. 1)
TMR_DIV_8$09mov [n+TMR1_SCALE], TMR_DIV_8
+ mov [n+TMR2_SCALE], TMR_DIV_8
+ mov [n+TMR3_SCALE], TMR_DIV_8
Prescalar /8 (Osc. 1)
TMR_DIV_32$0Amov [n+TMR1_SCALE], TMR_DIV_32
+ mov [n+TMR2_SCALE], TMR_DIV_32
+ mov [n+TMR3_SCALE], TMR_DIV_32
Prescalar /32 (Osc. 1)
TMR_DIV_64$0Bmov [n+TMR1_SCALE], TMR_DIV_64
+ mov [n+TMR2_SCALE], TMR_DIV_64
+ mov [n+TMR3_SCALE], TMR_DIV_64
Prescalar /64 (Osc. 1)
TMR_DIV_128$0Cmov [n+TMR1_SCALE], TMR_DIV_128
+ mov [n+TMR2_SCALE], TMR_DIV_128
+ mov [n+TMR3_SCALE], TMR_DIV_128
Prescalar /128 (Osc. 1)
TMR_DIV_256$0Dmov [n+TMR1_SCALE], TMR_DIV_256
+ mov [n+TMR2_SCALE], TMR_DIV_256
+ mov [n+TMR3_SCALE], TMR_DIV_256
Prescalar /256 (Osc. 1)
TMR_DIV_1024$0Emov [n+TMR1_SCALE], TMR_DIV_1024
+ mov [n+TMR2_SCALE], TMR_DIV_1024
+ mov [n+TMR3_SCALE], TMR_DIV_1024
Prescalar /1024 (Osc. 1)
TMR_DIV_4096$0Fmov [n+TMR1_SCALE], TMR_DIV_4096
+ mov [n+TMR2_SCALE], TMR_DIV_4096
+ mov [n+TMR3_SCALE], TMR_DIV_4096
Prescalar /4096 (Osc. 1)
TMR_DIV2_OFF$00mov [n+TMR1_SCALE], TMR_DIV2_OFF
+ mov [n+TMR2_SCALE], TMR_DIV2_OFF
+ mov [n+TMR3_SCALE], TMR_DIV2_OFF
Prescalar Off
TMR_DIV2_1$08mov [n+TMR1_SCALE], TMR_DIV2_1
+ mov [n+TMR2_SCALE], TMR_DIV2_1
+ mov [n+TMR3_SCALE], TMR_DIV2_1
Prescalar /1 (Osc. 2)
TMR_DIV2_2$09mov [n+TMR1_SCALE], TMR_DIV2_2
+ mov [n+TMR2_SCALE], TMR_DIV2_2
+ mov [n+TMR3_SCALE], TMR_DIV2_2
Prescalar /2 (Osc. 2)
TMR_DIV2_4$0Amov [n+TMR1_SCALE], TMR_DIV2_4
+ mov [n+TMR2_SCALE], TMR_DIV2_4
+ mov [n+TMR3_SCALE], TMR_DIV2_4
Prescalar /4 (Osc. 2)
TMR_DIV2_8$0Bmov [n+TMR1_SCALE], TMR_DIV2_8
+ mov [n+TMR2_SCALE], TMR_DIV2_8
+ mov [n+TMR3_SCALE], TMR_DIV2_8
Prescalar /8 (Osc. 2)
TMR_DIV2_16$0Cmov [n+TMR1_SCALE], TMR_DIV2_16
+ mov [n+TMR2_SCALE], TMR_DIV2_16
+ mov [n+TMR3_SCALE], TMR_DIV2_16
Prescalar /16 (Osc. 2)
TMR_DIV2_32$0Dmov [n+TMR1_SCALE], TMR_DIV2_32
+ mov [n+TMR2_SCALE], TMR_DIV2_32
+ mov [n+TMR3_SCALE], TMR_DIV2_32
Prescalar /32 (Osc. 2)
TMR_DIV2_64$0Emov [n+TMR1_SCALE], TMR_DIV2_64
+ mov [n+TMR2_SCALE], TMR_DIV2_64
+ mov [n+TMR3_SCALE], TMR_DIV2_64
Prescalar /64 (Osc. 2)
TMR_DIV2_128$0Fmov [n+TMR1_SCALE], TMR_DIV2_128
+ mov [n+TMR2_SCALE], TMR_DIV2_128
+ mov [n+TMR3_SCALE], TMR_DIV2_128
Prescalar /128 (Osc. 2)
TMR_HI_DIV_OFF$00mov [n+TMR1_SCALE], TMR_HI_DIV_OFF | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_OFF | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_OFF | ..
Prescalar Off
TMR_HI_DIV_2$80mov [n+TMR1_SCALE], TMR_HI_DIV_2 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_2 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_2 | ..
Prescalar /2 (Osc. 1)
TMR_HI_DIV_8$90mov [n+TMR1_SCALE], TMR_HI_DIV_8 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_8 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_8 | ..
Prescalar /8 (Osc. 1)
TMR_HI_DIV_32$A0mov [n+TMR1_SCALE], TMR_HI_DIV_32 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_32 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_32 | ..
Prescalar /32 (Osc. 1)
TMR_HI_DIV_64$B0mov [n+TMR1_SCALE], TMR_HI_DIV_64 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_64 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_64 | ..
Prescalar /64 (Osc. 1)
TMR_HI_DIV_128$C0mov [n+TMR1_SCALE], TMR_HI_DIV_128 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_128 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_128 | ..
Prescalar /128 (Osc. 1)
TMR_HI_DIV_256$D0mov [n+TMR1_SCALE], TMR_HI_DIV_256 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_256 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_256 | ..
Prescalar /256 (Osc. 1)
TMR_HI_DIV_1024$E0mov [n+TMR1_SCALE], TMR_HI_DIV_1024 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_1024 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_1024 | ..
Prescalar /1024 (Osc. 1)
TMR_HI_DIV_4096$F0mov [n+TMR1_SCALE], TMR_HI_DIV_4096 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV_4096 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV_4096 | ..
Prescalar /4096 (Osc. 1)
TMR_HI_DIV2_OFF$00mov [n+TMR1_SCALE], TMR_HI_DIV2_OFF | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_OFF | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_OFF | ..
Prescalar Off
TMR_HI_DIV2_1$80mov [n+TMR1_SCALE], TMR_HI_DIV2_1 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_1 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_1 | ..
Prescalar /1 (Osc. 2)
TMR_HI_DIV2_2$90mov [n+TMR1_SCALE], TMR_HI_DIV2_2 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_2 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_2 | ..
Prescalar /2 (Osc. 2)
TMR_HI_DIV2_4$A0mov [n+TMR1_SCALE], TMR_HI_DIV2_4 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_4 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_4 | ..
Prescalar /4 (Osc. 2)
TMR_HI_DIV2_8$B0mov [n+TMR1_SCALE], TMR_HI_DIV2_8 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_8 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_8 | ..
Prescalar /8 (Osc. 2)
TMR_HI_DIV2_16$C0mov [n+TMR1_SCALE], TMR_HI_DIV2_16 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_16 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_16 | ..
Prescalar /16 (Osc. 2)
TMR_HI_DIV2_32$D0mov [n+TMR1_SCALE], TMR_HI_DIV2_32 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_32 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_32 | ..
Prescalar /32 (Osc. 2)
TMR_HI_DIV2_64$E0mov [n+TMR1_SCALE], TMR_HI_DIV2_64 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_64 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_64 | ..
Prescalar /64 (Osc. 2)
TMR_HI_DIV2_128$F0mov [n+TMR1_SCALE], TMR_HI_DIV2_128 | ..
+ mov [n+TMR2_SCALE], TMR_HI_DIV2_128 | ..
+ mov [n+TMR3_SCALE], TMR_HI_DIV2_128 | ..
Prescalar /128 (Osc. 2)
Timer 1-3 Osc. Select   
TMR_OSC1_LO$00mov [n+TMR1_OSC], TMR_OSC1_LO | ..
+ mov [n+TMR2_OSC], TMR_OSC1_LO | ..
+ mov [n+TMR3_OSC], TMR_OSC1_LO | ..
Timer 1-3 Osc. 1 for Lo / 16Bits
TMR_OSC1_HI$00mov [n+TMR1_OSC], TMR_OSC1_HI | ..
+ mov [n+TMR2_OSC], TMR_OSC1_HI | ..
+ mov [n+TMR3_OSC], TMR_OSC1_HI | ..
Timer 1-3 Osc. 1 for Hi
TMR_OSC2_LO$01mov [n+TMR1_OSC], TMR_OSC2_LO | ..
+ mov [n+TMR2_OSC], TMR_OSC2_LO | ..
+ mov [n+TMR3_OSC], TMR_OSC2_LO | ..
Timer 1-3 Osc. 2 for Lo / 16Bits
TMR_OSC2_HI$02mov [n+TMR1_OSC], TMR_OSC2_HI | ..
+ mov [n+TMR2_OSC], TMR_OSC2_HI | ..
+ mov [n+TMR3_OSC], TMR_OSC2_HI | ..
Timer 1-3 Osc. 2 for Hi
Interrupts Priority   
IRQ_PRI1_TMR3$03mov [n+IRQ_PRI1],IRQ_PRI1_TMR3| ..IRQ Priority - Timer 3
IRQ_PRI1_TMR1$0Cmov [n+IRQ_PRI1],IRQ_PRI1_TMR1| ..IRQ Priority - Timer 1
IRQ_PRI1_TMR2$30mov [n+IRQ_PRI1] ,IRQ_PRI1_TMR2| ..IRQ Priority - Timer 2
IRQ_PRI1_PRC$C0mov [n+IRQ_PRI1], IRQ_PRI1_PRC| ..IRQ Priority - PRC
IRQ_PRI2_UNKNOWN$03mov [n+IRQ_PRI2], IRQ_PRI2_UNKNOWN| ..IRQ Priority - Unknown
IRQ_PRI2_KEY_PAD$0Cmov [n+IRQ_PRI2], IRQ_PRI2_KEY_PAD| ..IRQ Priority - Keypad
IRQ_PRI2_CARTRIDGE$30mov [n+IRQ_PRI2], IRQ_PRI2_CARTRIDGE| ..IRQ Priority - Cartridge
IRQ_PRI2_TMR256$C0mov [n+IRQ_PRI2], IRQ_PRI2_TMR256| ..IRQ Priority - 256 Hz Timer
IRQ_PRI3_IO$03mov [n+IRQ_PRI3], IRQ_PRI3_IO| ..IRQ Priority - I/O
Interrupts Enable   
IRQ_ENA1_TMR3_PVT$01mov [n+IRQ_ENA1], IRQ_ENA1_TMR3_PVT| ..IRQ Enable - Timer 3 Pivot
IRQ_ENA1_TMR3_HI$02mov [n+IRQ_ENA1], IRQ_ENA1_TMR3_HI| ..IRQ Enable - Timer 3 Upper-8
IRQ_ENA1_TMR1_LO$04mov [n+IRQ_ENA1], IRQ_ENA1_TMR1_LO| ..IRQ Enable - Timer 1 Lower-8
IRQ_ENA1_TMR1_HI$08mov [n+IRQ_ENA1], IRQ_ENA1_TMR1_HI| ..IRQ Enable - Timer 1 Upper-8
IRQ_ENA1_TMR2_LO$10mov [n+IRQ_ENA1], IRQ_ENA1_TMR2_LO| ..IRQ Enable - Timer 2 Lower-8
IRQ_ENA1_TMR2_HI$20mov [n+IRQ_ENA1], IRQ_ENA1_TMR2_HI| ..IRQ Enable - Timer 2 Upper-8
IRQ_ENA1_PRC_DIV$40mov [n+IRQ_ENA1], IRQ_ENA1_PRC_DIV| ..IRQ Enable - PRC Frame Divider
IRQ_ENA1_PRC_COPY$80mov [n+IRQ_ENA1], IRQ_ENA1_PRC_COPY| ..IRQ Enable - PRC Frame Copy
IRQ_ENA2_CARTRIDGE$01mov [n+IRQ_ENA2], IRQ_ENA2_CARTRIDGE| ..IRQ Enable - Cartridge IRQ
IRQ_ENA2_CART_EJECT$02mov [n+IRQ_ENA2], IRQ_ENA2_CARTRIDGE| ..IRQ Enable - Cartridge Eject
IRQ_ENA2_1HZ$04mov [n+IRQ_ENA2], IRQ_ENA2_1HZ| ..IRQ Enable - 1Hz
(From 256 Hz Timer)
IRQ_ENA2_2HZ$08mov [n+IRQ_ENA2], IRQ_ENA2_2HZ| ..IRQ Enable - 2 Hz
(From 256 Hz Timer)
IRQ_ENA2_8HZ$10mov [n+IRQ_ENA2], IRQ_ENA2_8HZ| ..IRQ Enable - 8 Hz
(From 256 Hz Timer)
IRQ_ENA2_32HZ$20mov [n+IRQ_ENA2], IRQ_ENA2_32HZ| ..IRQ Enable - 32 Hz
(From 256 Hz Timer)
IRQ_ENA3_KEY_A$01mov [n+IRQ_ENA3], IRQ_ENA3_KEY_A| ..IRQ Enable - A Key
IRQ_ENA3_KEY_B$02mov [n+IRQ_ENA3], IRQ_ENA3_KEY_B| ..IRQ Enable - B Key
IRQ_ENA3_KEY_C$04mov [n+IRQ_ENA3], IRQ_ENA3_KEY_C| ..IRQ Enable - C Key
IRQ_ENA3_KEY_UP$08mov [n+IRQ_ENA3], IRQ_ENA3_KEY_UP| ..IRQ Enable - Up Key
IRQ_ENA3_KEY_DOWN$10mov [n+IRQ_ENA3], IRQ_ENA3_KEY_DOWN| ..IRQ Enable - Down Key
IRQ_ENA3_KEY_LEFT$20mov [n+IRQ_ENA3], IRQ_ENA3_KEY_LEFT| ..IRQ Enable - Left Key
IRQ_ENA3_KEY_RIGHT$40mov [n+IRQ_ENA3], IRQ_ENA3_KEY_RIGHT| ..IRQ Enable - Right Key
IRQ_ENA3_KEY_POWER$80mov [n+IRQ_ENA3], IRQ_ENA3_KEY_POWER| ..IRQ Enable - Power Key
IRQ_ENA3_KEYS$FFmov [n+IRQ_ENA3], IRQ_ENA3_KEYSIRQ Enable - All Keys
IRQ_ENA4_UNKNOWN1$01mov [n+IRQ_ENA4], IRQ_ENA4_UNKNOWN1IRQ Enable - Unknown 1
IRQ_ENA4_UNKNOWN2$02mov [n+IRQ_ENA4], IRQ_ENA4_UNKNOWN2IRQ Enable - Unknown 2
IRQ_ENA4_UNKNOWN3$04mov [n+IRQ_ENA4], IRQ_ENA4_UNKNOWN3IRQ Enable - Unknown 3
IRQ_ENA4_UNMAPPED1$10mov [n+IRQ_ENA4], IRQ_ENA4_UNMAPPED1IRQ Enable - Unmapped 1
IRQ_ENA4_UNMAPPED2$20mov [n+IRQ_ENA4], IRQ_ENA4_UNMAPPED2IRQ Enable - Unmapped 2
IRQ_ENA4_SHOCK$40mov [n+IRQ_ENA4], IRQ_ENA4_SHOCKIRQ Enable - Shock Detector
IRQ_ENA4_IR_RX$80mov [n+IRQ_ENA4], IRQ_ENA4_IR_RXIRQ Enable - IR Receiver
Interrupts Active   
IRQ_ACT1_TMR3_PVT$01mov [n+IRQ_ACT1], IRQ_ACT1_TMR3_PVT| ..IRQ Active - Timer 3 Pivot
IRQ_ACT1_TMR3_HI$02mov [n+IRQ_ACT1], IRQ_ACT1_TMR3_HI| ..IRQ Active - Timer 3 Upper-8
IRQ_ACT1_TMR1_LO$04mov [n+IRQ_ACT1], IRQ_ACT1_TMR1_LO| ..IRQ Active - Timer 1 Lower-8
IRQ_ACT1_TMR1_HI$08mov [n+IRQ_ACT1], IRQ_ACT1_TMR1_HI| ..IRQ Active - Timer 1 Upper-8
IRQ_ACT1_TMR2_LO$10mov [n+IRQ_ACT1], IRQ_ACT1_TMR2_LO| ..IRQ Active - Timer 2 Lower-8
IRQ_ACT1_TMR2_HI$20mov [n+IRQ_ACT1], IRQ_ACT1_TMR2_HI| ..IRQ Active - Timer 2 Upper-8
IRQ_ACT1_PRC_DIV$40mov [n+IRQ_ACT1], IRQ_ACT1_PRC_DIV| ..IRQ Active - PRC Frame Divider
IRQ_ACT1_PRC_COPY$80mov [n+IRQ_ACT1], IRQ_ACT1_PRC_COPY| ..IRQ Active - PRC Frame Copy
IRQ_ACT2_CARTRIDGE$01mov [n+IRQ_ACT2], IRQ_ACT2_CARTRIDGE| ..IRQ Active - Cartridge IRQ
IRQ_ACT2_CART_EJECT$02mov [n+IRQ_ACT2], IRQ_ACT2_CARTRIDGE| ..IRQ Active - Cartridge Eject
IRQ_ACT2_1HZ$04mov [n+IRQ_ACT2], IRQ_ACT2_1HZ| ..IRQ Active - 1Hz
+ (From 256 Hz Timer)
IRQ_ACT2_2HZ$08mov [n+IRQ_ACT2], IRQ_ACT2_2HZ| ..IRQ Active - 2 Hz
+ (From 256 Hz Timer)
IRQ_ACT2_8HZ$10mov [n+IRQ_ACT2], IRQ_ACT2_8HZ| ..IRQ Active - 8 Hz
+ (From 256 Hz Timer)
IRQ_ACT2_32HZ$20mov [n+IRQ_ACT2], IRQ_ACT2_32HZ| ..IRQ Active - 32 Hz
+ (From 256 Hz Timer)
IRQ_ACT3_KEY_A$01mov [n+IRQ_ACT3], IRQ_ACT3_KEY_A| ..IRQ Active - A Key
IRQ_ACT3_KEY_B$02mov [n+IRQ_ACT3], IRQ_ACT3_KEY_B| ..IRQ Active - B Key
IRQ_ACT3_KEY_C$04mov [n+IRQ_ACT3], IRQ_ACT3_KEY_C| ..IRQ Active - C Key
IRQ_ACT3_KEY_UP$08mov [n+IRQ_ACT3], IRQ_ACT3_KEY_UP| ..IRQ Active - Up Key
IRQ_ACT3_KEY_DOWN$10mov [n+IRQ_ACT3], IRQ_ACT3_KEY_DOWN| ..IRQ Active - Down Key
IRQ_ACT3_KEY_LEFT$20mov [n+IRQ_ACT3], IRQ_ACT3_KEY_LEFT| ..IRQ Active - Left Key
IRQ_ACT3_KEY_RIGHT$40mov [n+IRQ_ACT3], IRQ_ACT3_KEY_RIGHT| ..IRQ Active - Right Key
IRQ_ACT3_KEY_POWER$80mov [n+IRQ_ACT3], IRQ_ACT3_KEY_POWER| ..IRQ Active - Power Key
IRQ_ACT3_KEYS$FFmov [n+IRQ_ACT3], IRQ_ACT3_KEYSIRQ Active - All Keys
IRQ_ACT4_UNKNOWN1$01mov [n+IRQ_ACT4], IRQ_ACT4_UNKNOWN1IRQ Active - Unknown 1
IRQ_ACT4_UNKNOWN2$02mov [n+IRQ_ACT4], IRQ_ACT4_UNKNOWN2IRQ Active - Unknown 2
IRQ_ACT4_UNKNOWN3$04mov [n+IRQ_ACT4], IRQ_ACT4_UNKNOWN3IRQ Active - Unknown 3
IRQ_ACT4_UNMAPPED1$10mov [n+IRQ_ACT4], IRQ_ACT4_UNMAPPED1IRQ Active - Unmapped 1
IRQ_ACT4_UNMAPPED2$20mov [n+IRQ_ACT4], IRQ_ACT4_UNMAPPED2IRQ Active - Unmapped 2
IRQ_ACT4_SHOCK$40mov [n+IRQ_ACT4], IRQ_ACT4_SHOCKIRQ Active - Shock Detector
IRQ_ACT4_IR_RX$80mov [n+IRQ_ACT4], IRQ_ACT4_IR_RXIRQ Active - IR Receiver
Keypad Input   
KEY_A$01tst [n+KEY_PAD], KEY_AA Key (Active Low)
KEY_B$02tst [n+KEY_PAD], KEY_BB Key (Active Low)
KEY_C$04tst [n+KEY_PAD], KEY_CC Key (Active Low)
KEY_UP$08tst [n+KEY_PAD], KEY_UPUp Key (Active Low)
KEY_DOWN$10tst [n+KEY_PAD], KEY_DOWNDown Key (Active Low)
KEY_LEFT$20tst [n+KEY_PAD], KEY_LEFTLeft Key (Active Low)
KEY_RIGHT$40tst [n+KEY_PAD], KEY_RIGHTRight Key (Active Low)
KEY_POWER$80tst [n+KEY_PAD], KEY_POWERPower Key (Active Low)
Parallel I/O IO_DIR: 0 = Output / 1 = Input 
IO_IR_TX$01mov [n+IO_DIR], IO_IR_TX| ..
+ mov [n+IO_DATA], IO_IR_TX| ..
IR Transmitter
IO_IR_RX$02mov [n+IO_DIR], IO_IR_RX| ..
+ mov [n+IO_DATA], IO_IR_RX| ..
IR Receiver
IO_EEPROM_DAT$04mov [n+IO_DIR], IO_EEPROM_DAT| ..
+ mov [n+IO_DATA], IO_EEPROM_DAT| ..
EEPROM Data
IO_EEPROM_CLK$08mov [n+IO_DIR], IO_EEPROM_CLK| ..
+ mov [n+IO_DATA], IO_EEPROM_CLK| ..
EEPROM Clock
IO_RUMBLE$10mov [n+IO_DIR], IO_RUMBLE| ..
+ mov [n+IO_DATA], IO_RUMBLE| ..
Rumble
IO_IR_DISABLE$20mov [n+IO_DIR], IO_IR_DISABLE| ..
+ mov [n+IO_DATA], IO_IR_DISABLE| ..
IR Disable
PRC Mode   
PRC_INVERTMAP$01mov [n+PRC_MODE], PRC_INVERTMAP| ..PRC Mode - Invert Map
PRC_ENABLEMAP$02mov [n+PRC_MODE], PRC_ENABLEMAP| ..PRC Mode - Enable Map
PRC_ENABLESPR$04mov [n+PRC_MODE], PRC_ENABLESPR| ..PRC Mode - Enable Sprite
PRC_ENABLE$08mov [n+PRC_MODE], PRC_ENABLE| ..PRC Mode - Enable
PRC_MAP12X16$00mov [n+PRC_MODE], PRC_MAP12X16| ..PRC Mode - 12 x 16 Map
PRC_MAP16X12$10mov [n+PRC_MODE], PRC_MAP16X12| ..PRC Mode - 16 x 12 Map
PRC_MAP24X8$20mov [n+PRC_MODE], PRC_MAP24X8| ..PRC Mode - 24 x 8 Map
PRC_MAP24X16$30mov [n+PRC_MODE], PRC_MAP24X16| ..PRC Mode - 24 x 16 Map
PRC_MAPMASK$30mov [n+PRC_MODE], ~PRC_MAPMASK
+ or [n+PRC_MODE], PRC_MAPnXn...
PRC Mode - Map Mask
PRC Rate   
PRC_RATE_3$00mov [n+PRC_RATE], PRC_RATE_3| ..PRC Rate - /3, 24 fps
PRC_RATE_6$02mov [n+PRC_RATE], PRC_RATE_6| ..PRC Rate - /6, 12 fps
PRC_RATE_9$04mov [n+PRC_RATE], PRC_RATE_9| ..PRC Rate - /9, 8 fps
PRC_RATE_12$06mov [n+PRC_RATE], PRC_RATE_12| ..PRC Rate - /12, 6 fps
PRC_RATE_2$08mov [n+PRC_RATE], PRC_RATE_2| ..PRC Rate - /2, 36 fps
PRC_RATE_4$0Amov [n+PRC_RATE], PRC_RATE_4| ..PRC Rate - /4, 18 fps
PRC_RATE_6ALT$0Cmov [n+PRC_RATE], PRC_RATE_6ALT| ..PRC Rate - /6, 12 fps
PRC_RATE_8$0Emov [n+PRC_RATE], PRC_RATE_8| ..PRC Rate - /8, 9 fps
PRC_RATEMASK$0Eand [n+PRC_RATE], ~PRC_RATEMASK
+ or [n+PRC_RATE], PRC_RATE_n
PRC Rate - Mask
LCD Data   
LCD_COLUMN_LO$00mov [n+LCD_CTRL], LCD_COLUMN_LO + #nLCD - Set Column Low
LCD_COLUMN_HI$10mov [n+LCD_CTRL], LCD_COLUMN_HI + #nLCD - Set Column High
LCD_STARTLINE$40mov [n+LCD_CTRL], LCD_STARTLINE + #nLCD - Set Start line
LCD_PAGE$B0mov [n+LCD_CTRL], LCD_PAGE + #nLCD - Set Page
LCD_CONTRAST$81mov [n+LCD_CTRL], LCD_CONTRAST
+ mov [n+LCD_DATA], #n
LCD - Set Contrast
LCD_SEGDIR$A0mov [n+LCD_CTRL], LCD_SEGDIRLCD - Segment Direction (Normal)
LCD_INVSEGDIR$A1mov [n+LCD_CTRL], LCD_INVSEGDIRLCD - Segment Direction (Inverted)
LCD_DISPSEL_ON$A4mov [n+LCD_CTRL], LCD_DISPSEL_ONLCD - Display Selection On
LCD_DISPSEL_OFF$A5mov [n+LCD_CTRL], LCD_DISPSEL_OFFLCD - Display Selection Off
LCD_DISPINV_ON$A6mov [n+LCD_CTRL], LCD_DISPINV_ONLCD - Display Invert On
LCD_DISPINV_OFF$A7mov [n+LCD_CTRL], LCD_DISPINV_OFFLCD - Display Invert Off
LCD_DISPENABLE$AEmov [n+LCD_CTRL], LCD_DISPENABLELCD - Display Enable
LCD_DISPDISABLE$AFmov [n+LCD_CTRL], LCD_DISPDISABLELCD - Display Disable
LCD_ROWNORMAL$C0mov [n+LCD_CTRL], LCD_ROWNORMALLCD - Row Normal
LCD_ROWINVERT$C4mov [n+LCD_CTRL], LCD_ROWINVERTLCD - Row Inverted
LCD_START_RMW$E0mov [n+LCD_CTRL], LCD_START_RMWLCD - Start Read-Modify-Write
LCD_END_RMW$EEmov [n+LCD_CTRL], LCD_END_RMWLCD - End Read-Modify-Write
LCD_RESET$E2mov [n+LCD_CTRL], LCD_RESETLCD - Reset
LCD_NOP$E3mov [n+LCD_CTRL], LCD_NOPLCD - No Operation
Color PM Interface   
COLORPM_UNLOCK1$5Amov [n+COLORPM_CMD], COLORPM_UNLOCK11st Unlock Code
COLORPM_UNLOCK2$CEmov [n+COLORPM_CMD], COLORPM_UNLOCK22nd Unlock Code
COLORPM_UNLOCKED$CEmov a, COLORPM_UNLOCKED
+ cmp a, [n+COLORPM_CMD]
+ ; Zero if Color PM Interface is unlocked
Check if Color PM interface is unlocked
COLORPM_LOCK$CFmov [n+COLORPM_CMD], COLORPM_LOCKLock Color PM interface
COLORPM_FIXED$A0mov [n+COLORPM_CMD], COLORPM_FIXEDSet CVRAM Access fixed
Address won't change when data R/W
COLORPM_POSTINC$A1mov [n+COLORPM_CMD], COLORPM_POSTINCSet CVRAM Access post-increment
+ Address add 1 after data R/W
COLORPM_POSTDEC$A2mov [n+COLORPM_CMD], COLORPM_POSTINCSet CVRAM Access post-decrement
+ Address subtract 1 after data R/W
COLORPM_PREINC$A3mov [n+COLORPM_CMD], COLORPM_POSTINCSet CVRAM Access pre-increment
+ Address add 1 before data R/W
COLORPM_VRAM_ON$D0mov [n+COLORPM_CMD], COLORPM_VRAM_ONEnable VRAM updates
+ Any access to VRAM will update CVRAM
COLORPM_LCD_ON$D1mov [n+COLORPM_CMD], COLORPM_LCD_ONEnable LCD updates
+ Any access to LCD will update CVRAM
COLORPM_PRC_ON$D2mov [n+COLORPM_CMD], COLORPM_PRC_ONEnable PRC updates
+ Any PRC rendering will update CVRAM
COLORPM_VRAM_OFF$D8mov [n+COLORPM_CMD], COLORPM_VRAM_OFFDisable VRAM updates
+ Any access to VRAM will be ignored
COLORPM_LCD_OFF$D9mov [n+COLORPM_CMD], COLORPM_LCD_OFFDisable LCD updates
+ Any access to LCD will be ignred
COLORPM_PRC_OFF$DAmov [n+COLORPM_CMD], COLORPM_PRC_OFFDisable PRC updates
+ Any PRC rendering will be ignored
COLORPM_FLIP$F0mov [n+COLORPM_CMD], COLORPM_FLIPFlip CVRAM page
+

Sprites

+

Sprites should be updated after IRQ_PRC_COPY.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionValueUsageDescription
Sprite Content   
SPR_X$00mov x, #sprite_id << 2
+ mov [x+SPR_X], a
Sprite X Position
Starting from -16
SPR_Y$01mov x, #sprite_id << 2
+ mov [x+SPR_Y], a
Sprite Y Position
Starting from -16
SPR_TILE$02mov x, #sprite_id << 2
+ mov [x+SPR_TILE], a
Sprite Tile Number
0 to 255
SPR_CTRL$03mov x, #sprite_id << 2
+ mov [x+SPR_CTRL], a
Sprite Control
Sprite Control   
SPR_HFLIP$01mov a, SPR_HFLIP|..
+ mov [x+SPR_CTRL], a
Sprite Horizontal Flip
SPR_VFLIP$02mov a, SPR_VFLIP|..
+ mov [x+SPR_CTRL], a
Sprite Vertical Flip
SPR_INVERT$04mov a, SPR_INVERT|..
+ mov [x+SPR_CTRL], a
Sprite Invert Pixels
SPR_ENABLE$08mov a, SPR_ENABLE|..
+ mov [x+SPR_CTRL], a
Sprite Enabled (Visible)
+

Call BIOS IRQs

+

This defines are used on CINT instruction

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionValueDescription
CINT_HARDRESET$00Hard Reset
CINT_SOFTRESET$01Soft Reset
CINT_SOFTRESET2$02Soft Reset
CINT_PRC_COPY$03IRQ PRC Copy Complete
CINT_PRC_DIV$04IRQ PRC Frame Divider Overflow
CINT_TMR2_HI$05Timer 2 Upper-8 Overflow
CINT_TMR2_LO$06Timer 2 Lower-8 Overflow (8b only)
CINT_TMR1_HI$07Timer 1 Upper-8 Overflow
CINT_TMR1_LO$08Timer 1 Lower-8 Overflow (8b only)
CINT_TMR3_HI$09Timer 3 Upper-8 Overflow
CINT_TMR3_PVT$0ATimer 3 Pivot
CINT_32HZ$0B32Hz (From 256 Hz Timer)
CINT_8HZ$0C8Hz (From 256 Hz Timer)
CINT_2HZ$0D2Hz (From 256 Hz Timer)
CINT_1HZ$0E1Hz (From 256 Hz Timer)
CINT_IR_RX$0FIR Receiver
CINT_SHOCK$10Shock Sensor
CINT_CART_EJECT$13Cartridge Eject
CINT_CARTRIDGE$14Cartridge IRQ
CINT_KEY_POWER$15Power Key
CINT_KEY_RIGHT$16Right Key
CINT_KEY_LEFT$17Left Key
CINT_KEY_DOWN$18Down Key
CINT_KEY_UP$19Up Key
CINT_KEY_C$1AC Key
CINT_KEY_B$1BB Key
CINT_KEY_A$1CA Key
CINT_UNKNOWN1D$1DUnknown $1D
CINT_UNKNOWN1E$1EUnknown $1E
CINT_UNKNOWN1F$1FUnknown $1F
CINT_IRQ_FFF1$20User IRQ Routine at PC 0xFFF1
CINT_SUSPEND$21Suspend System
CINT_SLEEP_LCDOFF$22Sleep ??
CINT_SLEEP_LCDON$23Sleep with display on ??
CINT_SHUTDOWN$24Shutdown System
+ (Use this to exit your game!)
CINT_UNKNOWN25$25?? (Involves Cartridge Eject)
CINT_SET_CONTRAST$26Set default LCD Constrast
+ A = Contrast level 0x00 to 0x3F
CINT_ADD_CONTRAST$27Increase or decrease Contrast based of Zero flag
+ 0 = Increase, 1 = Decrease
+ Return A = 0x00 if succeed, 0xFF if not.
CINT_APPLY_CONTRAST$28Apply default LCD Constrast
CINT_GET_CONTRAST$29Get default LCD Contrast
+ return A
CINT_TMP_CONTRAST$2ASet temporary LCD Constrast
+ A = Contrast level 0x00 to 0x3F
CINT_LCD_ON$2BTurn LCD On
CINT_LCD_INIT$2CInitialize LCD
CINT_LCD_OFF$2DTurn LCD Off
CINT_ENABLE_RAMVECTOR$2EEnable RAM vector.
+ (Check if Register 0x01 Bit 7 is set, if not, it set bit 6 and 7)
CINT_DISABLE_RAMVECTOR$2FDisable RAM vector
CINT_ENABLE_CART_EJECT$30Disable Cart Eject IRQ 13 (with abort)
CINT_DISABLE_CART_EJECT$31Enable Cart Eject IRQ 13 (with abort)
CINT_UNKNOWN32$32 ?? (Involves Cartridge Eject)
CINT_UNKNOWN33$33 ?? (Involves Cartridge Eject)
CINT_UNKNOWN34$34Nintendo Dev Card (??)
CINT_UNKNOWN35$35Nintendo Dev Card (??)
CINT_UNKNOWN36$36 ?? (Involves Cartridge Eject)
CINT_UNKNOWN37$37Disable Cartridge Eject IRQ
+ (Reg 0x24, Bit 1 = 0)
CINT_UNKNOWN38$38 ?? (Involves Cartridge Eject)
CINT_UNKNOWN39$39?? (Involves Cartridge Eject)
CINT_UNKNOWN3A$3ARumored to speed up CPU?
CINT_CART_DISABLE$3BRecover from IRQ $39?
CINT_CART_ENABLE$3CCart power on and update state
CINT_CART_DETECT$3D Cart detect. Z: No cart, NZ: Cart inserted
+ (Test Register 0x53 Bit 1 and invert Zero flag)
CINT_ROUTINE$3ERead structure, write 0xFF, compare values and optionally jump to subroutine
+
+
X point to a structure in memory:
+structure {
+  byte   type            ; 0x01 = Call subroutine
+                         ; 0x00 = Don't call subroutine
+  triple write_0xFF_addr ; Address that 0xFF will be written
+  triple compare_addr    ; Address to read for compare
+  byte   compare_value   ; Value that must match the compare
+  triple subroutine      ; Use byte POP to receive flag of the compare
+}
+if type is 0x00, register A return 0x01 if compare is equal
CINT_SET_PRC_RATE$3F Set PRC Rate
+ A = 0 to 7
CINT_GET_PRC_RATE$40Get PRC Rate
+ Return A
CINT_MULTICART$41Test cart type.
+ Returns Z: non multi cart, NZ: multi cart
+ (Register 0x01 Bit 3)
CINT_DEVCART_READID$42Nintendo Dev Card (Read IDs)
CINT_DEVCART_RESET$43Nintendo Dev Card (Reset)
CINT_DEVCART_PROGRAM$44 Nintendo Dev Card (Program Byte)
CINT_DEVCART_ERASE$45 Nintendo Dev Card (Erase Sector)
CINT_DEVCART_UNLOCK$46Nintendo Dev Card (Unlock flash page register. Command 0xD0)
CINT_DEVCART_BANK$47Nintendo Dev Card (Select flash bank. A=bank Nr, X last address of flash page)
CINT_DEVCART_CMD_C9$48 Nintendo Dev Card (Command 0xC9)
CINT_DEVCART_PREPID$49Nintendo Dev Card (Prepare Manufacturer and device ID readout. Command 0xC0)
CINT_DEVCART_SELGAME$4A Nintendo Dev Card (Select flash game. A = game Nr. ([0x041048 + 96 * A] if 0x08 -> Command 0xC9)
CINT_DEVCART_NSDK$4BNintendo SDK
CINT_IR_PULSE$4CIR pulse
+ MOV [Y], $02 ;
+ wait B*16 Cycles ;
+ MOV [Y], $00
+

IRQ Handling

+

This defines are used on macro PM_HEADER in the 3rd parameter and macros RIRQ, PRIORITY_IRQS, ENABLE_IRQS and DISABLE_IRQS. They can be combined with logic OR (character | ). Function name is the same as the definition but in lowercase.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionDescription
Individual 
IRQ_PRC_COPYIRQ PRC Copy Complete
IRQ_PRC_DIVIRQ PRC Frame Divider Overflow
IRQ_TMR2_HITimer 2 Upper-8 Overflow
IRQ_TMR2_LOTimer 2 Lower-8 Overflow (8b only)
IRQ_TMR1_HITimer 1 Upper-8 Overflow
IRQ_TMR1_LOTimer 1 Lower-8 Overflow (8b only)
IRQ_TMR3_HITimer 3 Upper-8 Overflow
IRQ_TMR3_PVTTimer 3 Pivot
IRQ_32HZ32Hz (From 256 Hz Timer)
IRQ_8HZ8Hz (From 256 Hz Timer)
IRQ_2HZ2Hz (From 256 Hz Timer)
IRQ_1HZ1Hz (From 256 Hz Timer)
IRQ_IR_RXIR Receiver
IRQ_SHOCKShock Sensor
IRQ_UNKNOWNUnknown $1D
IRQ_CARTRIDGECartridge IRQ
IRQ_KEY_POWERPower Key
IRQ_KEY_RIGHTRight Key
IRQ_KEY_LEFTLeft Key
IRQ_KEY_DOWNDown Key
IRQ_KEY_UPUp Key
IRQ_KEY_CC Key
IRQ_KEY_BB Key
IRQ_KEY_AA Key
Combined
IRQ_PRCINT_PRC_COPY and INT_PRC_DIV
IRQ_TMR2INT_TMR2_HI and INT_TMR2_LO
IRQ_TMR1INT_TMR1_HI and INT_TMR1_LO
IRQ_TMR3INT_TMR3_HI and INT_TMR3_PVT
IRQ_TMR256INT_32HZ, INT_8HZ, INT_2HZ and INT_1HZ
IRQ_IOIRQ_IR_RX and IRQ_SHOCK
IRQ_KEYINT_KEY_POWER, INT_KEY_RIGHT, INT_KEY_LEFT, INT_KEY_DOWN, INT_KEY_UP, INT_KEY_C, INT_KEY_B and INT_KEY_A
IRQ_ALLAll INT_* except IRQ_UNKNOWN and IRQ_CARTRIDGE
IRQ_TOTALLYALLAll INT_* including IRQ_UNKNOWN and IRQ_CARTRIDGE
+

Header Extra Flags

+

This defines are used on macro PM_HEADER in the 4th parameter, they can be combined with logic OR (character | ).

+ + + + + + + + + + + + + + + + + + +
DefinitionDescription
IRQF_FARAllow interrupt handlers to be over 32KB boundary
IRQF_NORIRQDon't generate RIRQ Handling (Not recommended)
IRQF_NOSTARTUPDon't generate initialization (Not recommended)
+

Example

+
+  .include "pm_libs/pm_init.s"
+
+  .ram variable  1
+  .ram var16bits 2
+
+  ; 1st: Game Title string, must be 12 characters
+  ; 2nd: Interrupts to map, OR flags for multiple interrupts
+  ; 3rd: Extra flags
+  pm_header "HelloWorld  ", IRQ_KEY_POWER | IRQ_PRC_COPY, 0
+
+  ; Power button, shutdown PM
+irq_key_power:	; Interrupt function (same name as definition but in lowercase)
+  cint CINT_SHUTDOWN	; Call shutdown in BIOS
+
+  ; PRC copy (for the example)
+irq_prc_copy:	; Interrupt function (same name as definition but in lowercase)
+  mov hl, variable
+  inc [hl]
+  rirq IRQ_PRC_COPY
+
+  ; Code starts here
+main:
+  ; Enable power key and PRC copy interrupts
+  enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY
+
+  ; Enable interrupts
+  mov f, ENABLE_IRQ
+
+: halt
+  jmp :b
+
+  pm_rominfo	; Optional, report ROM and RAM size
+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/LIB_pm_music.html b/PVPokeMini/PokeMini/pokemini-code/doc/LIB_pm_music.html new file mode 100644 index 0000000000..38222bda16 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/LIB_pm_music.html @@ -0,0 +1,550 @@ + + + + + +PokeMini Documentation + + + + + + + + + + +
+ +
+ +

LIB: pm_music

+

Background Music (BGM) and sound effects (SFX) playback

+

Note: IRQ_MUSIC must be included in PM_HEADER IRQ flags list for the mixer to work

+

pmrom_music.s

+

Type: Source File

+

Dependency: pm_init.s

+

Including Rules: Must be after ROM (PM_HEADER) declaration and inside Bank 0

+

ROM/RAM Usage: 1.2KB of ROM & 67 Bytes of RAM

+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunctionsParametersDescription
Initialize  
call pmmusic_initBA = RAM Pointer
+ HL = Master time
+ No return
Initialize tracker
+ Master time is Tmr 2 Preset with Prescale 6
+ TicksPerSec = 3906.25 / (Master Time + 1);
Manage master time  
call pmmusic_setmastertimeHL = Master time
+ No return
Modify master time (affects both BGM and SFX)
call pmmusic_getmastertimeNo parameters
+ Return HL = Master Timer
Get master time
Manage RAM pointer  
call pmmusic_setrampointerHL = RAM pointer
+ No return
Modify RAM pointer (affects both BGM and SFX)
call pmmusic_getrampointerNo parameters
+ Return HL = RAM pointer
Get RAM pointer
Manage master volume  
call pmmusic_setvolbgmA = Volume
+ No return

Set BGM master volume
+ 0 (Silence) to 3 (Max), default is 3
+ If out of range, the call will be ignored

call pmmusic_getvolbgmNo parameters
+ Return A = Volume
Get BGM master volume
call pmmusic_setvolsfxA = Volume
+ No return

Set SFX master volume
+ 0 (Silence) to 3 (Max), default is 3
+ If out of range, the call will be ignored

call pmmusic_getvolsfxNo parameters
+ Return A = Volume
Get SFX master volume
Play music (BGM)  
call pmmusic_playbgmI = BGM Address (Hi)
+ HL = BGM Address (Med & Lo)
+ No return
Play BGM, address must be a list of patterns
call pmmusic_stopbgmNo parameters
+ No return
Stop BGM
call pmmusic_isplayingbgmNo parameters
+ Return Non-Zero if playing
+ Return A != 0 if playing
Is playing BGM?
Play sound effect (SFX)  
call pmmusic_playsfxI = SFX Address (Hi)
+ HL = SFX Address (Med & Lo)
+ No return
Play SFX, address must be a patterns
call pmmusic_stopsfxNo parameters
+ No return
Stop SFX
call pmmusic_isplayingsfxNo parameters
+ Return Non-Zero if playing
+ Return A != 0 if playing
Is playing SFX?
+

Macros

+

Note: Macros names are case insensitive

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MacroDescription
PMMUSIC_ALIGNAlign data for music data, equivalent to ".align 2" but doesn't override assembler's aligment
PMMUSIC_PATTERN pataddrMust be inside BGM
+ Define pattern, BGM must have at least 1 pattern
+ pataddr = Label of pattern
PMMUSIC_ROW note_id, pwm_amt, volume, wait_amtMust be inside SFX or Pattern
+ Define row inside pattern
+ note_id = N_* definition
+ pwm_amt = Pulse-Width, 0 to 255, 128 = 50% (Square)
+ volume = Volume, 0 to 3
+ wait_amt = Wait ticks, 1 to 255
+ Set note_id to N____ and pwm_amt to -1 to not update note (saves 4 bytes)
+ Pulse-width changing require note definition!
PMMUSIC_WRITE_RAM address, valueMust be inside SFX or Pattern
+ Write to RAM
+ address = Relative adress
+ pwm_amt = Pulse-Width, 0 to 255, 128 = 50% (Square)
PMMUSIC_MARK loop_idMust be inside SFX or Pattern
+ Mark position for loop
+ loop_id = Loop identification, 0 to 3
PMMUSIC_LOOP loop_id, loop_numMust be inside SFX or Pattern
+ Loop back +
+loop_id = Loop identification, 0 to 3
+loop_num = Number of loops, 0 to 255
PMMUSIC_NEXTMust be inside Pattern
+ Go to next pattern
PMMUSIC_GOBACK pattnumMust be inside Pattern
+ Mark position for loop
+ pattnum = Number of patterns to go back
0 will repeat same pattern over and over
1 will jump to the previous pattern
PMMUSIC_ENDMust be inside SFX or Pattern
+ End BGM/SFX playback
+

Defines

+ + + + + + + + + +
DefinitionDescription
IRQ_MUSICInterrupt for handling the music, must be defined in PM_HEADER IRQ flags list for the mixer to work. This definition is equivalent to IRQ_TMR2_HI
+

Notes for PMMUSIC_ROW

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DefinitionDescription
N____Don't change note
N_C_nPlay C, n is octave number between 1 and 7
N_CSnPlay C#, n is octave number between 1 and 7
N_D_nPlay D, n is octave number between 1 and 7
N_DSnPlay D#, n is octave number between 1 and 7
N_E_nPlay E, n is octave number between 1 and 7
N_F_nPlay F, n is octave number between 1 and 7
N_FSnPlay F#, n is octave number between 1 and 7
N_G_nPlay G, n is octave number between 1 and 7
N_GSnPlay G#, n is octave number between 1 and 7
N_A_nPlay A, n is octave number between 1 and 7
N_ASnPlay A#, n is octave number between 1 and 7
N_B_nPlay B, n is octave number between 1 and 7
+

Example

+
+  .include "pm_libs/pm_init.s"
+
+  ; 1st: Game Title string, must be 12 characters
+  ; 2nd: Interrupts to map, OR flags for multiple interrupts
+  ; 3rd: Extra flags
+  pm_header "PMMusic TsT ", IRQ_KEY_POWER | IRQ_MUSIC, 0
+
+  ; Note! For pm_music to work you MUST define IRQ_MUSIC (or IRQ_TMR2_HI)
+  ; in PM_HEADER IRQs flag list!
+  .include "pm_libs/pmrom_music.s"
+
+  ; Power button, shutdown PM
+irq_key_power:	; Interrupt function (same name as definition but in lowercase)
+  cint CINT_SHUTDOWN	; Call shutdown in BIOS
+
+  ; Code starts here
+main:
+  ; Enable power key interrupt
+  enable_irqs IRQ_KEY_POWER
+
+  ; Initialize PM Music
+  mov ba, 0	; RAM pointer isn't needed
+  mov hl, $00FF	; Master time of 255 (approx. 61 Hz)
+  call pmmusic_init
+
+  ; Enable interrupts
+  mov f, ENABLE_IRQ
+
+  ; Play PM Intro sound
+  mov hl, pm_intro
+  call pmmusic_playbgm
+
+: halt
+  jmp :b
+
+  ; 2 bytes alignment is recommended before any pmmusic data
+  ; data can be located anywhere in 2MB range and support bank crossing
+  pmmusic_align
+
+  ; PM Intro list of patterns
+pm_intro:
+  pmmusic_pattern pm_intro_pat
+
+  ; PM Intro pattern
+pm_intro_pat:
+  ;           Note    Pw  V  Wait
+  pmmusic_row N_E_5, $80, 3, 4
+  pmmusic_row N____,  -1, 2, 4
+  pmmusic_row N_A_5, $80, 3, 4
+  pmmusic_row N____,  -1, 2, 4
+  pmmusic_row N____,  -1, 0, 9
+  pmmusic_row N_D_6, $80, 3, 4
+  pmmusic_row N____,  -1, 2, 4
+  pmmusic_row N_CS6, $80, 3, 4
+  pmmusic_row N____,  -1, 2, 4
+  pmmusic_row N_A_5, $80, 3, 4
+  pmmusic_row N____,  -1, 2, 4
+  pmmusic_row N_E_6, $80, 3, 4
+  pmmusic_row N____,  -1, 2, 4
+  pmmusic_row N____,  -1, 0, 24
+  pmmusic_row N_D_6, $80, 3, 3
+  pmmusic_row N_A_6, $80, 3, 3
+  pmmusic_row N_E_7, $80, 3, 3
+  pmmusic_row N_B_7, $80, 3, 3
+  pmmusic_row N_E_7, $80, 3, 3
+  pmmusic_row N_B_7, $80, 3, 3
+  pmmusic_row N____,  -1, 0, 6
+  pmmusic_end
+
+  pm_rominfo	; Optional, report ROM and RAM size
+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/Minx_Cpu.html b/PVPokeMini/PokeMini/pokemini-code/doc/Minx_Cpu.html new file mode 100644 index 0000000000..5fc6fc024b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/Minx_Cpu.html @@ -0,0 +1,397 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Minx CPU

+

Overview

+

The Pokemon Mini CPU (Coined the Minx by Team Pokeme) + is a microcontroller designed by Nintendo R&D3 for the Pokemon + Mini. The processor is 8-bit with 16-bit operations, with instructions + created especially for mathematical performance. The processor provides + numerous addressing modes with a 24bit addressing bus (with only 21bits + mapped externally)

+

Additionally, the Minx provides the capibility to handle up to 32 + hardware enabled interrupts with delayed response capbility. Up to 128 + interrupt vectors may be specified, allowing the remaining 96 for BIOS + calls.

+

The CPU is clocked at 4.00mhz, although the processor operates on + a 4 cycle data access period, leaving the system with a theoretical + limit of 1MIPS.

+

Minx Register Mapping

+

The Minx operates with a handful of registers. The CPU is an + amalgamation of Z80 like paradigms combined with an 8-bit + microcontroller like bank system.

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ General Purpose Registers +
8 Bit Registers (Low) 8 Bit Registers (Hi) 16 Bit Register Index Register
A B BA
L H HL I
N I
X Xi
Y Yi
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Fixed Function Registers +
Reg. Description
PC Program Cursor
V PC Bank Register
U V Delay Register
SP Stack Pointer
F Flag Register
E Exception Register
+

Since the program cursor is only 16 bits, it uses a special "delayed" + register to account for the upper 8 bits of program access space. When + PC has it's most significant bit set, the register V takes the place of the upper 8 bits, extending PC + out to 23 bits in total. To prevent bank switch problems, V is + "delayed" by the means of register U. After each branch instruction, + the value of U is copied to register V implicitly, allowing for full + 23bit jumps without special programming tricks or special functions.

+

The Minx also provides additional facilities to access 24bit + addresses using registers. X and Y both provide 24bit addresses using + the Xi and Yi register as their upper 8 bits.

+

Flag and Exception Register

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Flag Mapping +
Bit Flag F. Mne. Exception E. Mne.
0 Zero Z  ?? EX0
1 Carry C  ?? EX1
2 Overflow O  ?? EX2
3 Sign S  ?? EX3
4 Binary Coded Decimal Mode (8-bit add\sub) BCD Division By Zero EX4
5 Low-Mask Mode (8-bit add\sub) NIBBLE (Enable Exceptions \ Game cube emulator only) EEX
6 Interrupt Disable ID
7 Interrupt Branch IB
+


+ While the F register can, in some cases, be treated as a general purpose + 8-bit register, the exception register however is not directly + accessible by any conventional means. It is also to be noted that the + exception trapping needs to be "enabled" by some means we've not + discovered yet. Division by zero causes the system to hard lock, and + the existence of this register is only known through the reverse + engineering of Pokemon Channel's internal emulator. The lower 4 bits of + both registers are used for branch conditions and carry chaining for + arithmetic. The upper 4 bits are "control" registers.

+

The I register

+

Unlike X and Y, the upper 8 bits of the remaining addressing modes + are not unique. The register I provides a bank extension to the these + remaining 24 bit accesses: [HL], [I+$nnnn], and [N+$nn]. It is + generally good practice to maintain I as $00 unless otherwise necessary.

+

The N indexed mode

+

The N Indexed mode is most useful for accessing register memory + quickly. N provides the mid byte of a 24 bit addressing mode, and the + $nn is an 8-bit immediate. In example. [N+$8A] would point to $208A + (VPU_CNT) if N = $20 and I = $00. It is rare to see N with any value + other than $20, but it is not entirely out of the question to see it + change.

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Audio.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Audio.html new file mode 100644 index 0000000000..6801f1cf5c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Audio.html @@ -0,0 +1,232 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Audio / Sound

+

Overview

+

Single-channel square-wave with adjustable pulse-width.

+

3 Levels of volume: 0%, 50%, 100%

+
 Register 0x71, Bit 0 to 1
+ 0 = 0% (Silence)
+ 1 = 50%
+ 2 = 50%
+ 3 = 100% (Full volume)
+    
+

Can read back timer values (since sound is assigned to Timer 3).

+

To hear sound, you must:

+ +

Some useful information:

+
    +
  • To generate Square-Wave, use Timer 3 Pivot with half the value of the Timer 3 Preset.
  • +
  • Commercial games use very small Pulse-Width length to generate weak sounds (for example when Music Volume is 25%).
  • +
+

Formulas

+

Timer3_Frequency = The Timer 3 counting speed in Hz (Check Timers)

+

Sound_Frequency = The frequency of the note in Hz

+

Preset_Value = Timer 3 Preset value (to be written in Registers 0x4A and 0x4B)

+

Sound_Pivot = Timer 3 Pivot value (to be written in Registers 0x4C and 0x4D)

+

Pulse_Width = Pulse-Width from 0.0 to 1.0 (e.g. 0.0 = 0%, 0.5 = 50% (Square), 1.0 = 100%)

+

Sound Frequency into Timer 3 Preset

+

Preset_Value = (Timer3_Frequency / Sound_Frequency) - 1

+

Timer 3 Preset into Sound Frequency

+

Sound_Frequency = Timer3_Frequency / (Preset_Value + 1)

+

Pulse-Width into Sound-Pivot

+

Sound_Pivot = Preset_Value * Pulse_Width

+

Sound-Pivot into Pulse-Width

+

Pulse_Width = Sound_Pivot / Preset_Value

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Cartridge.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Cartridge.html new file mode 100644 index 0000000000..8076b42236 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Cartridge.html @@ -0,0 +1,423 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Cartridge

+

Overview

+

The Pokemon Mini cartridge has a 21 bit addressing bus, which up + until recently has gone completely unused. Since the PM has a + relatively wide address space, it can provide up to a 2MB worth of data + without additional hardware. One of the more bizzare design choices by + Nintendo is that the cartridge address space starts relative to the + beginning of the Pokemon Mini's memory space, which is then overwritten + by BIOS, RAM and Internal Register, making $2100 bytes of ROM space inaccessible except through mirrors.

+

After the overloaded memory space, the Pokemon Mini has $D0 byte + header standard. The vast majority of this space is reserved for IRQ + jump locations. Much of the remaining space is plain asciiz info about + the game, with a couple of BIOS checked watermarks to verify a ROM is a + PM image.

+

Following the header is completely user mapped data. It is + typical for the reset IRQ location to simply jump to $21D0. The IRQ + locations are 6 bytes in size to accommodate for a U load (3 bytes) and + a long jump (3 bytes)

+

Cartridge Header

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Location Size Required Description
$2100 2 No "PM" marker
$2102 6 Yes Reset Location
$2108 6 * PRC Frame Copy IRQ
$210e 6 * PRC Render IRQ
$2114 6 * Timer 2 Underflow (upper) IRQ
$211a 6 * Timer 2 Underflow (lower) IRQ
$2120 6 * Timer 1 Underflow (upper) IRQ
$2126 6 * Timer 1 Underflow (lower) IRQ
$212c 6 * Timer 3 Underflow (upper) IRQ
$2132 6 * Timer 3 Comparator IRQ
$2138 6 * 32hz Timer (256hz linked) IRQ
$213e 6 * 8hz Timer (256hz linked) IRQ
$2144 6 * 2hz Timer (256hz linked) IRQ
$214a 6 * 1hz Timer (256hz linked) IRQ
$2150 6 * IR Receiver IRQ
$2156 6 * Shake Sensor IRQ
$215c 6 * Power Key IRQ
$2162 6 * Right Key IRQ
$2168 6 * Left Key IRQ
$216e 6 * Down Key IRQ
$2174 6 * Up Key IRQ
$217a 6 * C Key IRQ
$2180 6 * B Key IRQ
$2186 6 * A Key IRQ
$218c 6 *
$2192 6 *
$2198 6 *
$219e 6 * Cartridge IRQ
$21A4 8 Yes "NINTENDO" in plain text
$21AC 4 No Game Code
$21B0 12 No Game Title (Zero Padded)
$21BC 2 No "2P" (Unknown purpose)
$21BE 18 No Reserved (Zero)
+

* = This is only required if the IRQ is ever enabled.

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_IO_Port.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_IO_Port.html new file mode 100644 index 0000000000..f0d069467a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_IO_Port.html @@ -0,0 +1,263 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Hardware I/O

+

I/O Port Overview

+

The Pokemon Mini provides a tri-state 8-bit I/O port. Each bit is + mapped to a different pin, and each has it's own configurable direction, + providing a relatively powerful interface to external hardware.

+

The I/O interface is shared among various parts of hardware, so + care must be taken when altering the direction and data as not to + disturb other processes.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Pin Mapping +
Pin Function
0 IR Receiver
1 IR Transmitter
2 EEPROM Data
3 EEPROM Clk
4 Rumble Motor
5 IR Disable
6 Always 1 (Pull-Up?)
7 (IR Transmitter? Used to double power?)
+

How the I/O Port Works

+

The I/O Port is configured using 2 8-bit registers. IO_DIR selects + the data direction of the respective pin. Reset is an input bit, Set is + an output pin. IO_DATA provides both a input read value as well as the + latch to drive output, the value read back from this port depends on + the state of IO_DIR.

+

When a pin is set to input, and there is no data being externally + driven on the pin, the state is left undetermined as that bit is + defined as floating.

+

Hardware

+

The EEPROM is a 24xx64 alike 64 kbit serial EEPROM using an I2C interface .

+

Rumble is simply a pin used to drive a motor, which is likely + driven through an amplifier. For rumble to be active, the rumble pin + must be set for output with a logical 1 driving the pin.

+

IR is a unmodulated diode transceiver. Setting the + IR Disable to output and setting data to logical 1, disables the + receiver.

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_IRQBios.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_IRQBios.html new file mode 100644 index 0000000000..07ba9bde5e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_IRQBios.html @@ -0,0 +1,754 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Interrupt / BIOS

+

Interrupt Overview

+

The Minx provides up to 32 hardware mapped interrupts and up to 96 + software interrupts (for bios calls). The full list is defined in the BIOS section of the standard. Out of the 32 interrupts, three are not maskable, $00~$02.

+

On startup, IRQ 0 (reset) fires. Since BIOS resets the processor state, it is unknown if this behaves like a normal IRQ.

+

Interrupt Priority

+

The Minx interrupt hardware is impressive in it's configurability. + The 29 maskable interrupts are divided into 9 groups. Each of these + groups are then provided a 2 bit priority encoder. These encoders + define the order in which IRQs are processed. IRQs are processed by + priority first, then by the internal IRQ number. If an IRQ group is + assigned a priority of 0, all the IRQs for the group are implicity + disabled.

+

Enabling Interrupts

+

All 29 of the maskable interrupts can be disabled in 3 ways. The + first way is if the interrupt disable flag or interrupt branch flag is + set in the Flag register. This will prevent all maskable IRQs from + occuring. The 2nd is by setting the IRQ group priority to zero. + Finally, you can reset the effective bit in the IRQ_ENA_* register. If + any of these three conditions occur, the IRQ is effectively disabled.

+

Note: If registers V and U are different, IRQ will not be called.

+

When Interrupts Occur

+

IRQs are set to "pending" on the rising edge of an event. Since IRQs + are not nessessarly processed immediately, they will remain in a + waiting state. This is where the IRQ_ACT_* registers come in. At any + point an IRQ is enabled, and the respective bit in an IRQ_ACT_* is set. + The down side to this is the IRQ will continue to fire until software + clears the bit by writing a logical '1' to the bit in IRQ_ACT_*.

+

After an IRQ branch occurs, the interrupt branch flag is set, preventing IRQs from colliding with one another.

+

What is Not Known

+

It is unknown which interrupts are masked by the interrupt disable + flag. Additionally, there are aproximately 7 hardware interrupts which + have not been mapped and as such we don't know entire know all the + details of their behavior.

+ +

The BIOS Overview

+

The internal BIOS consists of a 4kB program image built to initialize + the system, bring it out of sleep and various other system specific + tasks. Since the Pokemon Mini is never technically off, only suspended, + BIOS is used for tasks like enabling power to the system and responding + to various at rest IRQs.

+

The BIOS image begins with a 256 byte IRQ vector table, + consisting of 128 16-bit vectors (only first 76 are valid). The system + reserves 32 vectors for hardware IRQs, the rest are used for software + calls. It is worth noting that all IRQs are latched on the rising edge + of an event, so button presses and IR receive is only latched when the + IR receiver is active 1 or if a button has been press, but not released.

+

The IRQ Vector Table

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Bios IRQ Vector Table +
IRQ BIOS Cart IRQ IRQ Group Hardware Strobe Description
$00 0000:009A 0 Non-Maskable System Start-up / System Reset
$01 0002:00AB Non-Maskable Unused
$02 0004:00AB Non-Maskable Unused
$03 0006:01CF 1 $20[7..6] $27,7 PRC Copy Complete
$04 0008:01E0 2 $20[7..6] $27,6 PRC Frame Divider Overflow
$05 000A:01F1 3 $20[5..4] $27,5 Timer2 Upper-8 Underflow
$06 000C:0202 4 $20[5..4] $27,4 Timer2 Lower-8 Underflow (8-bit only)
$07 000E:0213 5 $20[3..2] $27,3 Timer1 Upper-8 Underflow
$08 0010:0224 6 $20[3..2] $27,2 Timer1 Lower-8 Underflow (8-bit only)
$09 0012:0235 7 $20[1..0] $27,1 Timer3 Upper-8 Underflow
$0A 0014:0246 8 $20[1..0] $27,0 Timer3 Pivot
$0B 0016:025A 9 $21[7..6] $28,5 32Hz (From 256Hz Timer)
$0C 0018:026B 10 $21[7..6] $28,4 8Hz (From 256Hz Timer)
$0D 001A:027C 11 $21[7..6] $28,3 2Hz (From 256Hz Timer)
$0E 001C:028D 12 $21[7..6] $28,2 1Hz (From 256Hz Timer)
$0F 001E:029E 13 $22[1..0] $2A,7 IR Receiver
$10 0020:02AF 14 $22[1..0] $2A,6 Shock Sensor
$11 0022:00AB $2A,5 Unused
$12 0024:00AB $2A,4 Unused
$13 0026:043E $21[5..4] $28,1 Cartridge Ejected
$14 0028:02C0 26 $21[5..4] $28,0 Cartridge IRQ
$15 002A:03BA 15 $21[3..2] $29,7 Power Key
$16 002C:02D1 16 $21[3..2] $29,6 Right Key
$17 002E:02E2 17 $21[3..2] $29,5 Left Key
$18 0030:02F3 18 $21[3..2] $29,4 Down Key
$19 0032:0304 19 $21[3..2] $29,3 Up Key
$1A 0034:0315 20 $21[3..2] $29,2 C Key
$1B 0036:0326 21 $21[3..2] $29,1 B Key
$1C 0038:0337 22 $21[3..2] $29,0 A Key
$1D 003A:0348 23 $2A,2
$1E 003C:035C 24 $2A,1
$1F 003E:036D 25 $2A,0
IRQ BIOS (Software only) Description
$20 0040:FFF1 User IRQ Routine at PC 0xFFF1
$21 0042:0713 Suspend System
$22 0044:077C Sleep ??
$23 0046:078B Sleep with display on ??
$24 0048:079D Shutdown System (Use this to exit your game!)
$25 004A:07B1  ?? (Involves Cartridge Eject)
$26 004C:07E9 Set default LCD Constrast (A = Contrast level 0x00 to 0x3F)
$27 004E:0802 Increase or decrease Contrast based of Zero flag (0 = Increase, 1 = Decrease)
+

Return A = 0x00 if succeed, 0xFF if not.

$28 0050:081B Apply default LCD Constrast
$29 0052:0821 Get default LCD Contrast (return A)
$2A 0054:0830 Set temporary LCD Constrast (A = Contrast level 0x00 to 0x3F)
$2B 0056:084E Turn LCD On
$2C 0058:0871 Initialize LCD
$2D 005A:08CB Turn LCD Off
$2E 005C:08EC Enable RAM vector. (Check if Register 0x01 Bit 7 is set, if not, it set bit 6 and 7)
$2F 005E:0904 Disable RAM vector
$30 0060:0923 Disable Cart Eject IRQ 13 (with abort)
$31 0062:092E Enable Cart Eject IRQ 13 (with abort)
$32 0064:0949  ?? (Involves Cartridge Eject)
$33 0066:0961  ?? (Involves Cartridge Eject)
$34 0068:097D Nintendo Dev Card (??)
$35 006A:09E4 Nintendo Dev Card (??)
$36 006C:0A4F  ?? (Involves Cartridge Eject)
$37 006E:0A76 Disable Cartridge Eject IRQ (Reg 0x24, Bit 1 = 0)
$38 0070:0A81  ?? (Involves Cartridge Eject)
$39 0072:0AA6 Rumored to speed up CPU?
$3A 0074:0ACD Recover from IRQ $39?
$3B 0076:0AE6 Cart power off and update state
$3C 0078:0AF9 Cart power on and update state
$3D 007A:0B20 Cart detect. Z: No cart, NZ: Cart inserted (Test Register 0x53 Bit 1 and invert Zero flag)
$3E 007C:0B2E Read structure, write 0xFF, compare values and optionally jump to subroutine
+
X point to a structure in memory:
+structure {
+  byte   type            ; 0x01 = Call subroutine
+                         ; 0x00 = Don't call subroutine
+  triple write_0xFF_addr ; Address that 0xFF will be written
+  triple compare_addr    ; Address to read for compare
+  byte   compare_value   ; Value that must match the compare
+  triple subroutine      ; Use byte POP to receive flag of the compare
+}
+if type is 0x00, register A return 0x01 if compare is equal
+      
$3F 007E:0B8F Set PRC Rate (A = 0 to 7)
$40 0080:0BA3 Get PRC Rate (return A)
$41 0082:0BB1 Test cart type. Returns Z: non multi cart, NZ: multi cart (Register 0x01 Bit 3)
$42 0084:047A Nintendo Dev Card (Read IDs)
$43 0086:0493 Nintendo Dev Card (Reset)
$44 0088:04A4 Nintendo Dev Card (Program Byte)
$45 008A:04C8 Nintendo Dev Card (Erase Sector)
$46 008C:04F5 Nintendo Dev Card (Unlock flash page register. Command 0xD0)
$47 008E:0506 Nintendo Dev Card (Select flash bank. A=bank Nr, X last address of flash page)
$48 0090:0517 Nintendo Dev Card (Command 0xC9)
$49 0092:0529 Nintendo Dev Card (Prepare Manufacturer and device ID readout. Command 0xC0)
$4A 0094:053A Nintendo Dev Card (Select flash game. A = game Nr. ([0x041048 + 96 * A] if 0x08 -> Command 0xC9)
$4B 0096:0000 Nintendo SDK
$4C 0098:0BBD IR pulse MOV [Y], $02 ; wait B*16 Cycles ; MOV [Y], $00
+
+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_InstructionList.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_InstructionList.html new file mode 100644 index 0000000000..debf74c26e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_InstructionList.html @@ -0,0 +1,3778 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Main Content

+

NOP = No Operation

+ + + + + + + + + + + + + +
HexMnemonicCycles
FF NOP 8
+

Flags Affected: None

+

MOV = Move Register

+

8 Bit Opcode overview

+

16 Bit Opcode overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
40 MOV A, A 4
41 MOV A, B 4
42 MOV A, L 4
43 MOV A, H 4
44 nn MOV A, [N+#nn] 12
45 MOV A, [HL] 8
46 MOV A, [X] 8
47 MOV A, [Y] 8
48 MOV B, A 4
49 MOV B, B 4
4A MOV B, L 4
4B MOV B, H 4
4C nn MOV B, [N+#nn] 12
4D MOV B, [HL] 8
4E MOV B, [X] 8
4F MOV B, [Y] 8
50 MOV L, A 4
51 MOV L, B 4
52 MOV L, L 4
53 MOV L, H 4
54 nn MOV L, [N+#nn] 12
55 MOV L, [HL] 8
56 MOV L, [X] 8
57 MOV L, [Y] 8
58 MOV H, A 4
59 MOV H, B 4
5A MOV H, L 4
5B MOV H, H 4
5C nn MOV H, [N+#nn] 12
5D MOV H, [HL] 8
5E MOV H, [X] 8
5F MOV H, [Y] 8
60 MOV [X], A 8
61 MOV [X], B 8
62 MOV [X], L 8
63 MOV [X], H 8
64 nn MOV [X], [N+#nn] 16
65 MOV [X], [HL] 12
66 MOV [X], [X] 12
67 MOV [X], [Y] 12
68 MOV [HL], A 8
69 MOV [HL], B 8
6A MOV [HL], L 8
6B MOV [HL], H 8
6C nn MOV [HL], [N+#nn] 16
6D MOV [HL], [HL] 12
6E MOV [HL], [X] 12
6F MOV [HL], [Y] 12
70 MOV [Y], A 8
71 MOV [Y], B 8
72 MOV [Y], L 8
73 MOV [Y], H 8
74 nn MOV [Y], [N+#nn] 16
75 MOV [Y], [HL] 12
76 MOV [Y], [X] 12
77 MOV [Y], [Y] 12
78 nn MOV [N+#nn], A 12
79 nn MOV [N+#nn], B 12
7A nn MOV [N+#nn], L 12
7B nn MOV [N+#nn], H 12
7D nn MOV [N+#nn], [HL] 16
7E nn MOV [N+#nn], [X] 16
7F nn MOV [N+#nn], [Y] 16
9F nn MOV F, #nn 12
B0 nn MOV A, #nn 8
B1 nn MOV B, #nn 8
B2 nn MOV L, #nn 8
B3 nn MOV H, #nn 8
B4 nn MOV N, #nn 8
B5 nn MOV [HL], #nn 12
B6 nn MOV [X], #nn 12
B7 nn MOV [Y], #nn 12
DD nn nn MOV [N+#nn], #nn 16
CE C4 nn MOV U, #nn 16
CE C5 nn MOV I, #nn 12
CE C6 nn MOV XI, #nn 12
CE C7 nn MOV YI, #nn 12
CE 40 ss MOV A, [X+#ss] 16
CE 41 ss MOV A, [Y+#ss] 16
CE 42 MOV A, [X+L] 16
CE 43 MOV A, [Y+L] 16
CE 48 ss MOV B, [X+#ss] 16
CE 49 ss MOV B, [Y+#ss] 16
CE 4A MOV B, [X+L] 16
CE 4B MOV B, [Y+L] 16
CE 50 ss MOV L, [X+#ss] 16
CE 51 ss MOV L, [Y+#ss] 16
CE 52 MOV L, [X+L] 16
CE 53 MOV L, [Y+L] 16
CE 58 ss MOV H, [X+#ss] 16
CE 59 ss MOV H, [Y+#ss] 16
CE 5A MOV H, [X+L] 16
CE 5B MOV H, [Y+L] 16
CE 44 ss MOV [X+#ss], A 16
CE 45 ss MOV [Y+#ss], A 16
CE 46 MOV [X+L], A 16
CE 47 MOV [Y+L], A 16
CE 4C ss MOV [X+#ss], B 16
CE 4D ss MOV [Y+#ss], B 16
CE 4E MOV [X+L], B 16
CE 4F MOV [Y+L], B 16
CE 54 ss MOV [X+#ss], L 16
CE 55 ss MOV [Y+#ss], L 16
CE 56 MOV [X+L], L 16
CE 57 MOV [Y+L], L 16
CE 5C ss MOV [X+#ss], H 16
CE 5D ss MOV [Y+#ss], H 16
CE 5E MOV [X+L], H 16
CE 5F MOV [Y+L], H 16
CE 60 ss MOV [HL], [X+#ss] 20
CE 61 ss MOV [HL], [Y+#ss] 20
CE 62 MOV [HL], [X+L] 20
CE 63 MOV [HL], [Y+L] 20
CE 68 ss MOV [X], [X+#ss] 20
CE 69 ss MOV [X], [Y+#ss] 20
CE 6A MOV [X], [X+L] 20
CE 6B MOV [X], [Y+L] 20
CE 78 ss MOV [Y], [X+#ss] 20
CE 79 ss MOV [Y], [Y+#ss] 20
CE 7A MOV [Y], [X+L] 20
CE 7B MOV [Y], [Y+L] 20
B8 nn nn MOV BA, [#nnnn] 20
B9 nn nn MOV HL, [#nnnn] 20
BA nn nn MOV X, [#nnnn] 20
BB nn nn MOV Y, [#nnnn] 20
CF 78 nn nn MOV SP, [#nnnn] 24
BC nn nn MOV [#nnnn], BA 20
BD nn nn MOV [#nnnn], HL 20
BE nn nn MOV [#nnnn], X 20
BF nn nn MOV [#nnnn], Y 20
CF 7C nn nn MOV [#nnnn], SP 24
C4 nn nn MOV BA, #nnnn 12
C5 nn nn MOV HL, #nnnn 12
C6 nn nn MOV X, #nnnn 12
C7 nn nn MOV Y, #nnnn 12
CF 6E nn nn MOV SP, #nnnn 16
CE C0 MOV A, N 8
CE C1 MOV A, F 8
CE C8 MOV A, V 8
CE C9 MOV A, I 8
CE CA MOV A, XI 8
CE CB MOV A, YI 8
CE C2 MOV N, A 8
CE C3 MOV F, A 12
CE CC MOV U, A 12
CE CD MOV I, A 8
CE CE MOV XI, A 8
CE CF MOV YI, A 8
CE D0 nn nn MOV A, [#nnnn] 20
CE D1 nn nn MOV B, [#nnnn] 20
CE D2 nn nn MOV L, [#nnnn] 20
CE D3 nn nn MOV H, [#nnnn] 20
CE D4 nn nn MOV [#nnnn], A 20
CE D5 nn nn MOV [#nnnn], B 20
CE D6 nn nn MOV [#nnnn], L 20
CE D7 nn nn MOV [#nnnn], H 20
CF 70 ss MOV BA, [SP+#ss] 24
CF 71 ss MOV HL, [SP+#ss] 24
CF 72 ss MOV X, [SP+#ss] 24
CF 73 ss MOV Y, [SP+#ss] 24
CF 74 ss MOV [SP+#ss], BA 24
CF 75 ss MOV [SP+#ss], HL 24
CF 76 ss MOV [SP+#ss], X 24
CF 77 ss MOV [SP+#ss], Y 24
CF C0 MOV BA, [HL] 20
CF C1 MOV HL, [HL] 20
CF C2 MOV X, [HL] 20
CF C3 MOV Y, [HL] 20
CF D0 MOV BA, [X] 20
CF D1 MOV HL, [X] 20
CF D2 MOV X, [X] 20
CF D3 MOV Y, [X] 20
CF D8 MOV BA, [Y] 20
CF D9 MOV HL, [Y] 20
CF DA MOV X, [Y] 20
CF DB MOV Y, [Y] 20
CF C4 MOV [HL], BA 20
CF C5 MOV [HL], HL 20
CF C6 MOV [HL], X 20
CF C7 MOV [HL], Y 20
CF D4 MOV [X], BA 20
CF D5 MOV [X], HL 20
CF D6 MOV [X], X 20
CF D7 MOV [X], Y 20
CF DC MOV [Y], BA 20
CF DD MOV [Y], HL 20
CF DE MOV [Y], X 20
CF DF MOV [Y], Y 20
CF E0 MOV BA, BA 8
CF E1 MOV BA, HL 8
CF E2 MOV BA, X 8
CF E3 MOV BA, Y 8
CF E4 MOV HL, BA 8
CF E5 MOV HL, HL 8
CF E6 MOV HL, X 8
CF E7 MOV HL, Y 8
CF E8 MOV X, BA 8
CF E9 MOV X, HL 8
CF EA MOV X, X 8
CF EB MOV X, Y 8
CF EC MOV Y, BA 8
CF ED MOV Y, HL 8
CF EE MOV Y, X 8
CF EF MOV Y, Y 8
CF F0 MOV SP, BA 8
CF F1 MOV SP, HL 8
CF F2 MOV SP, X 8
CF F3 MOV SP, Y 8
CF F4 MOV HL, SP 8
CF F5 MOV HL, PC 8
CF F8 MOV BA, SP 8
CF F9 MOV BA, PC 8
CF FA MOV X, SP 8
CF FE MOV Y, SP 8
+

Flags Affected: None

+

Arithmetic

+

ADD = Addition

+

8 Bit Opcode overview

+

16 Bit Opcode overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
00 ADD A, A 8
01 ADD A, B 8
02 nn ADD A, #nn 8
03 ADD A, [HL] 8
04 nn ADD A, [N+#nn] 12
05 nn nn ADD A, [#nnnn] 16
06 ADD A, [X] 8
07 ADD A, [Y] 8
C0 nn nn ADD BA, #nnnn 12
C1 nn nn ADD HL, #nnnn 12
C2 nn nn ADD X, #nnnn 12
C3 nn nn ADD Y, #nnnn 12
CF 68 nn nn ADD SP, #nnnn 16
CE 00 ss ADD A, [X+#ss] 16
CE 01 ss ADD A, [Y+#ss] 16
CE 02 ADD A, [X+L] 16
CE 03 ADD A, [Y+L] 16
CE 04 ADD [HL], A 16
CE 05 nn ADD [HL], #nn 20
CE 06 ADD [HL], [X] 20
CE 07 ADD [HL], [Y] 20
CF 00 ADD BA, BA 16
CF 01 ADD BA, HL 16
CF 02 ADD BA, X 16
CF 03 ADD BA, Y 16
CF 20 ADD HL, BA 16
CF 21 ADD HL, HL 16
CF 22 ADD HL, X 16
CF 23 ADD HL, Y 16
CF 40 ADD X, BA 16
CF 41 ADD X, HL 16
CF 42 ADD Y, BA 16
CF 43 ADD Y, HL 16
CF 44 ADD SP, BA 16
CF 45 ADD SP, HL 16
+

Flags Affected: All

+

SUB = Subtraction

+

8 Bit Opcode overview

+

16 Bit Opcode overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
10 SUB A, A 8
11 SUB A, B 8
12 nn SUB A, #nn 8
13 SUB A, [HL] 8
14 nn SUB A, [N+#nn] 12
15 nn nn SUB A, [#nnnn] 16
16 SUB A, [X] 8
17 SUB A, [Y] 8
D0 nn nn SUB BA, #nnnn 12
D1 nn nn SUB HL, #nnnn 12
D2 nn nn SUB X, #nnnn 12
D3 nn nn SUB Y, #nnnn 12
CF 6A nn nn SUB SP, #nnnn 16
CE 10 ss SUB A, [X+#ss] 16
CE 11 ss SUB A, [Y+#ss] 16
CE 12 SUB A, [X+L] 16
CE 13 SUB A, [Y+L] 16
CE 14 SUB [HL], A 16
CE 15 nn SUB [HL], #nn 20
CE 16 SUB [HL], [X] 20
CE 17 SUB [HL], [Y] 20
CF 08 SUB BA, BA 16
CF 09 SUB BA, HL 16
CF 0A SUB BA, X 16
CF 0B SUB BA, Y 16
CF 28 SUB HL, BA 16
CF 29 SUB HL, HL 16
CF 2A SUB HL, X 16
CF 2B SUB HL, Y 16
CF 48 SUB X, BA 16
CF 49 SUB X, HL 16
CF 4A SUB Y, BA 16
CF 4B SUB Y, HL 16
CF 4C SUB SP, BA 16
CF 4D SUB SP, HL 16
+

Flags Affected: All

+

ADC = Addition with Carry

+

8 Bit Opcode overview

+

16 Bit Opcode overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
08 ADC A, A 8
09 ADC A, B 8
0A nn ADC A, #nn 8
0B ADC A, [HL] 8
0C nn ADC A, [N+#nn] 12
0D nn nn ADC A, [#nnnn] 16
0E ADC A, [X] 8
0F ADC A, [Y] 8
CE 08 ss ADC A, [X+#ss] 16
CE 09 ss ADC A, [Y+#ss] 16
CE 0A ADC A, [X+L] 16
CE 0B ADC A, [Y+L] 16
CE 0C ADC [HL], A 16
CE 0D nn ADC [HL], #nn 20
CE 0E ADC [HL], [X] 20
CE 0F ADC [HL], [Y] 20
CF 04 ADC BA, BA 16
CF 05 ADC BA, HL 16
CF 06 ADC BA, X 16
CF 07 ADC BA, Y 16
CF 24 ADC HL, BA 16
CF 25 ADC HL, HL 16
CF 26 ADC HL, X 16
CF 27 ADC HL, Y 16
CF 60 nn nn ADC BA, #nnnn 16
CF 61 nn nn ADC HL, #nnnn 16
+

Flags Affected: All

+

SBC = Subtraction with Carry

+

8 Bit Opcode overview

+

16 Bit Opcode overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
18 SBC A, A 8
19 SBC A, B 8
1A nn SBC A, #nn 8
1B SBC A, [HL] 8
1C nn SBC A, [N+#nn] 12
1D nn nn SBC A, [#nnnn] 16
1E SBC A, [X] 8
1F SBC A, [Y] 8
CE 18 ss SBC A, [X+#ss] 16
CE 19 ss SBC A, [Y+#ss] 16
CE 1A SBC A, [X+L] 16
CE 1B SBC A, [Y+L] 16
CE 1C SBC [HL], A 16
CE 1D nn SBC [HL], #nn 20
CE 1E SBC [HL], [X] 20
CE 1F SBC [HL], [Y] 20
CF 0C SBC BA, BA 16
CF 0D SBC BA, HL 16
CF 0E SBC BA, X 16
CF 0F SBC BA, Y 16
CF 2C SBC HL, BA 16
CF 2D SBC HL, HL 16
CF 2E SBC HL, X 16
CF 2F SBC HL, Y 16
CF 62 nn nn SBC BA, #nnnn 16
CF 63 nn nn SBC HL, #nnnn 16
+

Flags Affected: All

+

CMP = Compare

+

8 Bit Opcode overview

+

16 Bit Opcode overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
30 CMP A, A 8
31 CMP A, B 8
32 nn CMP A, #nn 8
33 CMP A, [HL] 8
34 nn CMP A, [N+#nn] 12
35 nn nn CMP A, [#nnnn] 16
36 CMP A, [X] 8
37 CMP A, [Y] 8
D4 nn nn CMP BA, #nnnn 12
D5 nn nn CMP HL, #nnnn 12
D6 nn nn CMP X, #nnnn 12
D7 nn nn CMP Y, #nnnn 12
CF 6C nn nn CMP SP, #nnnn 16
DB nn nn CMP [N+#nn], #nn 16
CE 30 ss CMP A, [X+#ss] 16
CE 31 ss CMP A, [Y+#ss] 16
CE 32 CMP A, [X+L] 16
CE 33 CMP A, [Y+L] 16
CE 34 CMP [HL], A 16
CE 35 nn CMP [HL], #nn 20
CE 36 CMP [HL], [X] 20
CE 37 CMP [HL], [Y] 20
CE BC nn CMP B, #nn 12
CE BD nn CMP L, #nn 12
CE BE nn CMP H, #nn 12
CE BF nn CMP N, #nn 12
CF 18 CMP BA, BA 16
CF 19 CMP BA, HL 16
CF 1A CMP BA, X 16
CF 1B CMP BA, Y 16
CF 38 CMP HL, BA 16
CF 39 CMP HL, HL 16
CF 3A CMP HL, X 16
CF 3B CMP HL, Y 16
CF 5C CMP SP, BA 16
CF 5D CMP SP, HL 16
+

Flags Affected: All

+

INC = Increase Register by 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
80 INC A 8
81 INC B 8
82 INC L 8
83 INC H 8
84 INC N 8
85 nn INC [N+#nn] 16
86 INC [HL] 12
87 INC SP 8
90 INC BA 8
91 INC HL 8
92 INC X 8
93 INC Y 8
+

Flags Affected: Zero

+

DEC = Decrease Register by 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
88 DEC A 8
89 DEC B 8
8A DEC L 8
8B DEC H 8
8C DEC N 8
8D nn DEC [N+#nn] 16
8E DEC [HL] 12
8F DEC SP 8
98 DEC BA 8
99 DEC HL 8
9A DEC X 8
9B DEC Y 8
+

Flags Affected: Zero

+

NEG = Negate

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE A4 NEG A 12
CE A5 NEG B 12
CE A6 nn NEG [N+#nn] 20
CE A7 NEG [HL] 16
+

Flags Affected: All

+

MUL = Multiply

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE D8 MUL L, A 48
+

Flags Affected: All

+

DIV = Divide

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE D9 DIV HL, A 52
+

Flags Affected: All

+

Note: Can throw Division by Zero

+

Logic

+

TST = Test Bits

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
94 TST A, B 8
95 nn TST [HL], #nn 12
96 nn TST A, #nn 8
97 nn TST B, #nn 8
DC nn nn TST [N+#nn], #nn 16
+

Flags Affected: Zero, Sign

+

AND = Logical AND

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
20 AND A, A 8
21 AND A, B 8
22 nn AND A, #nn 8
23 AND A, [HL] 8
24 nn AND A, [N+#nn] 12
25 nn nn AND A, [#nnnn] 16
26 AND A, [X] 8
27 AND A, [Y] 8
9C nn AND F, #nn 12
CE B0 nn AND B, #nn 12
CE B1 nn AND L, #nn 12
CE B2 nn AND H, #nn 12
D8 nn nn AND [N+#nn], #nn 20
CE 20 ss AND A, [X+#ss] 16
CE 21 ss AND A, [Y+#ss] 16
CE 22 AND A, [X+L] 16
CE 23 AND A, [Y+L] 16
CE 24 AND [HL], A 16
CE 25 nn AND [HL], #nn 20
CE 26 AND [HL], [X] 20
CE 27 AND [HL], [Y] 20
+

Flags Affected: Zero, Sign

+

OR = Logical Inclusive-OR

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
28 OR A, A 8
29 OR A, B 8
2A nn OR A, #nn 8
2B OR A, [HL] 8
2C nn OR A, [N+#nn] 12
2D nn nn OR A, [#nnnn] 16
2E OR A, [X] 8
2F OR A, [Y] 8
9D nn OR F, #nn 12
CE B4 nn OR B, #nn 12
CE B5 nn OR L, #nn 12
CE B6 nn OR H, #nn 12
D9 nn nn OR [N+#nn], #nn 20
CE 28 ss OR A, [X+#ss] 16
CE 29 ss OR A, [Y+#ss] 16
CE 2A OR A, [X+L] 16
CE 2B OR A, [Y+L] 16
CE 2C OR [HL], A 16
CE 2D nn OR [HL], #nn 20
CE 2E OR [HL], [X] 20
CE 2F OR [HL], [Y] 20
+

Flags Affected: Zero, Sign

+

XOR = Logical Exclusive-OR

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
38 XOR A, A 8
39 XOR A, B 8
3A nn XOR A, #nn 8
3B XOR A, [HL] 8
3C nn XOR A, [N+#nn] 12
3D nn nn XOR A, [#nnnn] 16
3E XOR A, [X] 8
3F XOR A, [Y] 8
9E nn XOR F, #nn 12
CE B8 nn XOR B, #nn 12
CE B9 nn XOR L, #nn 12
CE BA nn XOR H, #nn 12
DA nn nn XOR [N+#nn], #nn 20
CE 38 ss XOR A, [X+#ss] 16
CE 39 ss XOR A, [Y+#ss] 16
CE 3A XOR A, [X+L] 16
CE 3B XOR A, [Y+L] 16
CE 3C XOR [HL], A 16
CE 3D nn XOR [HL], #nn 20
CE 3E XOR [HL], [X] 20
CE 3F XOR [HL], [Y] 20
+

Flags Affected: Zero, Sign

+

NOT = Logical NOT

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE A0 NOT A 12
CE A1 NOT B 12
CE A2 nn NOT [N+#nn] 20
CE A3 NOT [HL] 16
+

Flags Affected: Zero, Sign

+

Shift & Rotate

+

SHL = Shift Left

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 84 SHL A 12
CE 85 SHL B 12
CE 86 nn SHL [N+#nn] 20
CE 87 SHL [HL] 16
+

Flags Affected: Zero, Carry, Sign

+

SAL = Shift Arithmetic Left

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 80 SAL A 12
CE 81 SAL B 12
CE 82 nn SAL [N+#nn] 20
CE 83 SAL [HL] 16
+

Flags Affected: All

+

SHR = Shift Right

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 8C SHR A 12
CE 8D SHR B 12
CE 8E nn SHR [N+#nn] 20
CE 8F SHR [HL] 16
+

Flags Affected: Zero, Carry, Sign

+

SAR = Shift Arithmetic Right

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 88 SAR A 12
CE 89 SAR B 12
CE 8A nn SAR [N+#nn] 20
CE 8B SAR [HL] 16
+

Flags Affected: All

+

ROL = Rotate Left

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 94 ROL A 12
CE 95 ROL B 12
CE 96 nn ROL [N+#nn] 20
CE 97 ROL [HL] 16
+

Flags Affected: Zero, Carry, Sign

+

ROLC = Rotate Left through Carry

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 90 ROLC A 12
CE 91 ROLC B 12
CE 92 nn ROLC [N+#nn] 20
CE 93 ROLC [HL] 16
+

Flags Affected: Zero, Carry, Sign

+

ROR = Rotate Right

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 9C ROR A 12
CE 9D ROR B 12
CE 9E nn ROR [N+#nn] 20
CE 9F ROR [HL] 16
+

Flags Affected: Zero, Carry, Sign

+

RORC = Rotate Right through Carry

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 98 RORC A 12
CE 99 RORC B 12
CE 9A nn RORC [N+#nn] 20
CE 9B RORC [HL] 16
+

Flags Affected: Zero, Carry, Sign

+

Swap & Expand

+

XCHG = Exchange Registers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
C8 XCHG BA, HL 12
C9 XCHG BA, X 12
CA XCHG BA, Y 12
CB XCHG BA, SP 12
CC XCHG A, B 8
CD XCHG A, [HL] 12
+

Flags Affected: None

+

PACK / UNPACK = Pack and Unpack Nibbles

+ + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
DE PACK 8
DF UNPACK 8
+

Flags Affected: None

+

SWAP = Swap Low and High Nibbles

+ + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
F6 SWAP A 8
F7 SWAP [HL] 12
+

Flags Affected: None

+

EX = Expand Register

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE A8 EX BA, A 12
+

Flags Affected: None

+

Stack

+

PUSH = Push Register into Stack

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCyclesRegs stacked from top to bottom
A0 PUSH BA 16 B, A
A1 PUSH HL 16 H, L
A2 PUSH X 16 X(Hi), X(Lo)
A3 PUSH Y 16 Y(Hi), Y(Lo)
A4 PUSH N 12 N
A5 PUSH I 12 I
A6 PUSHX 16 XI, YI
A7 PUSH F 12 F
CF B0 PUSH A 12 A
CF B1 PUSH B 12 B
CF B2 PUSH L 12 L
CF B3 PUSH H 12 H
CF B8 PUSHA 48 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N
CF B9 PUSHAX 60 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N, I, XI, YI
+

Flags Affected: None

+

POP = Pop Register from Stack

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCyclesRegs stacked from top to bottom
A8 POP BA 12 B, A
A9 POP HL 12 H, L
AA POP X 12 X(Hi), X(Lo)
AB POP Y 12 Y(Hi), Y(Lo)
AC POP N 8 N
AD POP I 8 I
AE POPX 12 XI, YI
AF POP F 8 F
CF B4 POP A 12 A
CF B5 POP B 12 B
CF B6 POP L 12 L
CF B7 POP H 12 H
CF BC POPA 44 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N
CF BD POPAX 56 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N, I, XI, YI
+

Flags Affected: None

+

Branch

+

CALL = Call routine

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles,Trueor FalseCondition
E0 ss CALLCB #ss*1 20 8 Carry=1
E1 ss CALLNCB #ss*1 20 8 Carry=0
E2 ss CALLZB #ss*1 20 8 Zero=1
E3 ss CALLNZB #ss*1 20 8 Zero=0
E8 ss ss CALLCW #ssss*1 24 12 Carry=1
E9 ss ss CALLNCW #ssss*1 24 12 Carry=0
EA ss ss CALLZW #ssss*1 24 12 Zero=1
EB ss ss CALLNZW #ssss*1 24 12 Zero=0
F0 ss CALLB #ss*1 20 None None
F2 ss ss CALLW #ssss*1 24 None None
FB nn nn CALL [#nnnn] 20 None None
FC ss CINT #nn 20 None None
CE F0 ss CALLL #ss 24 12 (Overflow=1) != (Sign=1)
CE F1 ss CALLLE #ss 24 12 ((Overflow=0) != (Sign=0)) OR (Zero=1)
CE F2 ss CALLG #ss 24 12 ((Overflow=1) == (Sign=1)) AND (Zero=0)
CE F3 ss CALLGE #ss 24 12 (Overflow=0) == (Sign=0)
CE F4 ss CALLO #ss 24 12 Overflow=1
CE F5 ss CALLNO #ss 24 12 Overflow=0
CE F6 ss CALLNS #ss 24 12 Sign=0
CE F7 ss CALLS #ss 24 12 Sign=1
CE F8 ss CALLNX0 #ss 24 12 ??
CE F9 ss CALLNX1 #ss 24 12 ??
CE FA ss CALLNX2 #ss 24 12 ??
CE FB ss CALLNX3 #ss 24 12 ??
CE FC ss CALLX0 #ss 24 12 ??
CE FD ss CALLX1 #ss 24 12 ??
CE FE ss CALLX2 #ss 24 12 ??
CE FF ss CALLX3 #ss 24 12 ??
+

*1: CALL, CALLC, CALLNC, CALLZ and CALLNZ can be used in the assembler to auto-detect the appropriate range.

+

Flags Affected: None

+

JMP = Jump to routine

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCyclesCondition
E4 ss JCB #ss*1 8 Carry=1
E5 ss JNCB #ss*1 8 Carry=0
E6 ss JZB #ss*1 8 Zero=1
E7 ss JNZB #ss*1 8 Zero=0
EC ss ss JCW #ssss*1 12 Carry=1
ED ss ss JNCW #ssss*1 12 Carry=0
EE ss ss JZW #ssss*1 12 Zero=1
EF ss ss JNZW #ssss*1 12 Zero=0
F1 ss JMPB #ss*1 8 None
F3 ss ss JMPW #ssss*1 12 None
F4 JMP HL 8 None
F5 ss JDBNZ #ss 16 B <> 0x00, decrement B before check
FD nn JINT #nn 8 None
CE E0 ss JL #ss 12 (Overflow=1) != (Sign=1)
CE E1 ss JLE #ss 12 ((Overflow=0) != (Sign=0)) OR (Zero=1)
CE E2 ss JG #ss 12 ((Overflow=1) == (Sign=1)) AND (Zero=0)
CE E3 ss JGE #ss 12 (Overflow=0) == (Sign=0)
CE E4 ss JO #ss 12 Overflow=1
CE E5 ss JNO #ss 12 Overflow=0
CE E6 ss JNS #ss 12 Sign=0
CE E7 ss JS #ss 12 Sign=1
CE E8 ss JNX0 #ss 12 ??
CE E9 ss JNX1 #ss 12 ??
CE EA ss JNX2 #ss 12 ??
CE EB ss JNX3 #ss 12 ??
CE EC ss JX0 #ss 12 ??
CE ED ss JX1 #ss 12 ??
CE EE ss JX2 #ss 12 ??
CE EF ss JX3 #ss 12 ??
+

*1: JMP, JC, JNC, JZ and JNZ can be used in the assembler to auto-detect the appropriate range.

+

Flags Affected (0xF5 - JDBNZ #ss): Zero

+

Flags Affected (Others): None

+

RET = Return from routine

+ + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
F8 RET 16
F9 RETI 16
FA RETSKIP 16
+

Flags Affected: None

+

System

+

HALT = Halt CPU

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE AE HALT 8
+

Flags Affected: None

+

STOP = Stop CPU

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE AF STOP 8
+

Flags Affected: None

+

Illegal Instructions

+

The entire opcode table has been evaluated on Pokemon Mini units and new and exotic illegal opcodes have been found.

+

These opcodes are not officially supported (they are not used by + commercial games and not even found in the Pokemon Channel emulator) and + can produce random results or crashes in some cases. + The illegal opcodes have been documented on this page's Discussion page.

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Memory.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Memory.html new file mode 100644 index 0000000000..c42857b0b7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Memory.html @@ -0,0 +1,281 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Memory Map

+

Overview

+

The Pokemon Mini has a 24-bit internal addressing bus. The entire +bus is decoded, and thus nothing mirrors except cartridge memory. +Externally, the cartridge bus is only 21 bits wide, so anything at or +past $20000 is guaranteed to be a mirror of cartridge memory.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Pokemon Mini Memory Map +
Start End Size Description
$000000 $000FFF $001000 (4KB) Internal BIOS
$001000 $001FFF $001000 (4KB) PM RAM
$002000 $0020FF $000100 (256B) Hardware Registers
$002100 $1FFFFF $1FDF00 (~2MB) Cartridge Memory
$200000 $3FFFFF $200000 (2MB) Cartridge Memory (Mirror)
$400000 $5FFFFF $200000 (2MB) Cartridge Memory (Mirror)
$600000 $7FFFFF $200000 (2MB) Cartridge Memory (Mirror)
$800000 $9FFFFF $200000 (2MB) Cartridge Memory (Mirror)
$A00000 $BFFFFF $200000 (2MB) Cartridge Memory (Mirror)
$C00000 $DFFFFF $200000 (2MB) Cartridge Memory (Mirror)
$E00000 $FFFFFF $200000 (2MB) Cartridge Memory (Mirror)
+
+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADC16.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADC16.html new file mode 100644 index 0000000000..8dc522cdd7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADC16.html @@ -0,0 +1,300 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ADC = Addition with Carry (16-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CF 04 ADC BA, BA 16
CF 05 ADC BA, HL 16
CF 06 ADC BA, X 16
CF 07 ADC BA, Y 16
CF 24 ADC HL, BA 16
CF 25 ADC HL, HL 16
CF 26 ADC HL, X 16
CF 27 ADC HL, Y 16
CF 60 nn nn ADC BA, #nnnn 16
CF 61 nn nn ADC HL, #nnnn 16
+

Execute

+
#nnnn    = Immediate unsigned 16-Bits
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+    
+
; ADC Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds + Sc + Carry
+    
+

Description

+

16-Bits Source and Carry adds to the 16-Bits Destination.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is >= 65536

+

Overflow: Set when result overflow 16-bits signed range (< -32768 OR > 32767)

+

Sign: Set when bit 15 of the result is 1

+

Examples

+
; BA = 0x0EF0
+; F = (Carry=1)
+ADC BA, $1337
+; BA = 0x2228 (0x0EF0 + 0x1337 + 0x0001 = 0x(0)2228)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; HL = 0xBB7E
+; BA = 0xCF12
+; F = (Carry=0)
+ADC BA, HL
+; HL = 0xBB7E
+; BA = 0x8A90 (0xCF12 + 0xBB7E + 0x0000 = 0x(1)8A90)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+
; X = 0xBEEF
+; BA = 0xDEAD
+; F = (Carry=1)
+ADC BA, X
+; X = 0xBEEF
+; BA = 0x9D9D (0xDEAD + 0xBEEF + 0x0001 = 0x(1)9D9D)
+; F = (Zero=0):(Carry=1):(Overflow=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADC8.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADC8.html new file mode 100644 index 0000000000..4704c51a13 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADC8.html @@ -0,0 +1,393 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ADC = Addition with Carry (8-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
08 ADC A, A 8
09 ADC A, B 8
0A nn ADC A, #nn 8
0B ADC A, [HL] 8
0C nn ADC A, [N+#nn] 12
0D nn nn ADC A, [#nnnn] 16
0E ADC A, [X] 8
0F ADC A, [Y] 8
CE 08 ss ADC A, [X+#ss] 16
CE 09 ss ADC A, [Y+#ss] 16
CE 0A ADC A, [X+L] 16
CE 0B ADC A, [Y+L] 16
CE 0C ADC [HL], A 16
CE 0D nn ADC [HL], #nn 20
CE 0E ADC [HL], [X] 20
CE 0F ADC [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+#ss     = Immediate signed 8-Bits
+A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: (I shl 16) or #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; ADC Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+; (If flags BCD=0 and NIBBLE=0)
+Ds = Ds + Sc + Carry
+
+;------------------------------------------------ 
+
+; (If flags BCD=0 and NIBBLE=1)
+Ds & 0x0F = (Ds & 0x0F) + (Sc & 0x0F) + Carry
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=0)
+IF (((Ds & 15) + (Sc & 15) + Carry) >= 10) THEN
+  Ds = Ds + Sc + Carry + 6
+ELSE
+  Ds = Ds + Sc + Carry
+ENDIF
+IF (Ds >= 0xA0) Ds = Ds + 0x60
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=1)
+IF (((Ds & 15) + (Sc & 15) + Carry) >= 10) THEN
+  Ds & 0x0F = (Ds & 0x0F) + (Sc & 0x0F) + Carry + 6
+ELSE
+  Ds & 0x0F = (Ds & 0x0F) + (Sc & 0x0F) + Carry
+ENDIF
+    
+

Description

+

8-Bits Source and Carry adds to the 8-Bits Destination.

+

Conditions

+

If flags BCD=0 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is >= 256

+

Overflow: Set when result overflow 8-bits signed range (< -128 OR > 127)

+

Sign: Set when bit 7 of the result is 1

+

If flags BCD=0 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is >= 16

+

Overflow: Set when result overflow 4-bits signed range (< -16 OR > 15)

+

Sign: Set when bit 3 of the result is 1

+

If flags BCD=1 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is >= 100

+

Overflow: Always Reset

+

Sign: Always Reset

+

If flags BCD=1 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is >= 10

+

Overflow: Always Reset

+

Sign: Always Reset

+

Examples

+
; A = 0x55
+; F = (Carry=1)
+ADC A, $80
+; A = 0xD6 (0x55 + 0x80 + 0x01 = 0x(0)D6)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+
; B = 0x31
+; A = 0xCF
+; F = (Carry=0)
+ADC A, B
+; B = 0x31
+; A = 0x00 (0xCF + 0x31 + 0x00 = 0x(1)00)
+; F = (Zero=1):(Carry=1):(Overflow=0):(Sign=0)
+    
+
; [HL] = 0xDE
+; A = 0xCF
+; F = (Carry=0)
+ADC A, [HL]
+; [HL] = 0xDE
+; A = 0xAD (0xCF + 0xDE + 0x00 = 0x(1)AD)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+
; ( BCD = 1, NIBBLE = 0 )
+; A = 0x09
+; F = (Carry=1)
+ADC A, $01
+; A = 0x11 (09 + 01 + 01 = 11)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; ( BCD = 0, NIBBLE = 1 )
+; A = 0x3F (Note, in "nibble mode" the high nibble is always discarded)
+; F = (Carry=1)
+ADC A, $01
+; A = 0x01 (0xF + 0x1 + 0x1 = 0x(1)1)
+; F = (Zero=1):(Carry=1):(Overflow=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADD16.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADD16.html new file mode 100644 index 0000000000..4fa7e37635 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADD16.html @@ -0,0 +1,343 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ADD = Addition (16-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
C0 nn nn ADD BA, #nnnn 12
C1 nn nn ADD HL, #nnnn 12
C2 nn nn ADD X, #nnnn 12
C3 nn nn ADD Y, #nnnn 12
CF 68 nn nn ADD SP, #nnnn 16
CF 00 ADD BA, BA 16
CF 01 ADD BA, HL 16
CF 02 ADD BA, X 16
CF 03 ADD BA, Y 16
CF 20 ADD HL, BA 16
CF 21 ADD HL, HL 16
CF 22 ADD HL, X 16
CF 23 ADD HL, Y 16
CF 40 ADD X, BA 16
CF 41 ADD X, HL 16
CF 42 ADD Y, BA 16
CF 43 ADD Y, HL 16
CF 44 ADD SP, BA 16
CF 45 ADD SP, HL 16
+

Execute

+
#nnnn    = Immediate unsigned 16-Bits
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+SP       = Register SP (Stack Pointer)
+    
+
; ADD Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds + Sc
+    
+

Description

+

16-Bits Source adds to the 16-Bits Destination.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is >= 65536

+

Overflow: Set when result overflow 16-bits signed range (< -32768 OR > 32767)

+

Sign: Set when bit 15 of the result is 1

+

Examples

+
; BA = 0x0EF0
+ADD BA, $1337
+; BA = 0x2227 (0x0EF0 + 0x1337 = 0x(0)2227)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; HL = 0xBB7E
+; BA = 0xCF12
+ADD BA, HL
+; HL = 0xBB7E
+; BA = 0x8A90 (0xCF12 + 0xBB7E = 0x(1)8A90)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+
; X = 0xBEEF
+; BA = 0xDEAD
+ADD BA, X
+; X = 0xBEEF
+; BA = 0x9D9C (0xDEAD + 0xBEEF = 0x(1)9D9C)
+; F = (Zero=0):(Carry=1):(Overflow=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADD8.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADD8.html new file mode 100644 index 0000000000..22608639f9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ADD8.html @@ -0,0 +1,388 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ADD = Addition (8-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
00 ADD A, A 8
01 ADD A, B 8
02 nn ADD A, #nn 8
03 ADD A, [HL] 8
04 nn ADD A, [N+#nn] 12
05 nn nn ADD A, [#nnnn] 16
06 ADD A, [X] 8
07 ADD A, [Y] 8
CE 00 ss ADD A, [X+#ss] 16
CE 01 ss ADD A, [Y+#ss] 16
CE 02 ADD A, [X+L] 16
CE 03 ADD A, [Y+L] 16
CE 04 ADD [HL], A 16
CE 05 nn ADD [HL], #nn 20
CE 06 ADD [HL], [X] 20
CE 07 ADD [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+#ss     = Immediate signed 8-Bits
+A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: (I shl 16) or #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; ADD Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+; (If flags BCD=0 and NIBBLE=0)
+Ds = Ds + Sc
+
+;------------------------------------------------ 
+
+; (If flags BCD=0 and NIBBLE=1)
+Ds & 0x0F = (Ds & 0x0F) + (Sc & 0x0F)
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=0)
+IF (((Ds & 15) + (Sc & 15)) >= 10) THEN
+  Ds = Ds + Sc + 6
+ELSE
+  Ds = Ds + Sc
+ENDIF
+IF (Ds >= 0xA0) Ds = Ds + 0x60
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=1)
+IF (((Ds & 15) + (Sc & 15)) >= 10) THEN
+  Ds & 0x0F = (Ds & 0x0F) + (Sc & 0x0F) + 6
+ELSE
+  Ds & 0x0F = (Ds & 0x0F) + (Sc & 0x0F)
+ENDIF
+    
+

Description

+

8-Bits Source adds to the 8-Bits Destination.

+

Conditions

+

If flags BCD=0 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is >= 256

+

Overflow: Set when result overflow 8-bits signed range (< -128 OR > 127)

+

Sign: Set when bit 7 of the result is 1

+

If flags BCD=0 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is >= 16

+

Overflow: Set when result overflow 4-bits signed range (< -16 OR > 15)

+

Sign: Set when bit 3 of the result is 1

+

If flags BCD=1 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is >= 100

+

Overflow: Always Reset

+

Sign: Always Reset

+

If flags BCD=1 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is >= 10

+

Overflow: Always Reset

+

Sign: Always Reset

+

Examples

+
; A = 0x55
+ADD A, $80
+; A = 0xD5 (0x55 + 0x80 = 0x(0)D5)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+
; B = 0x31
+; A = 0xCF
+ADD A, B
+; B = 0x31
+; A = 0x00 (0xCF + 0x31 = 0x(1)00)
+; F = (Zero=1):(Carry=1):(Overflow=0):(Sign=0)
+    
+
; [HL] = 0xDE
+; A = 0xCF
+ADD A, [HL]
+; [HL] = 0xDE
+; A = 0xAD (0xCF + 0xDE = 0x(1)AD)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+
; ( BCD = 1, NIBBLE = 0 )
+; A = 0x09
+ADD A, $01
+; A = 0x10 (09 + 01 = 10)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; ( BCD = 0, NIBBLE = 1 )
+; A = 0x3F (Note, in "nibble mode" the high nibble is always discarded)
+ADD A, $01
+; A = 0x00 (0xF + 0x1 = 0x(1)0)
+; F = (Zero=1):(Carry=1):(Overflow=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_AND.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_AND.html new file mode 100644 index 0000000000..2ff0d27a95 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_AND.html @@ -0,0 +1,369 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

AND = Logical AND

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
20 AND A, A 8
21 AND A, B 8
22 nn AND A, #nn 8
23 AND A, [HL] 8
24 nn AND A, [N+#nn] 12
25 nn nn AND A, [#nnnn] 16
26 AND A, [X] 8
27 AND A, [Y] 8
9C nn AND F, #nn 12
CE B0 nn AND B, #nn 12
CE B1 nn AND L, #nn 12
CE B2 nn AND H, #nn 12
D8 nn nn AND [N+#nn], #nn 20
CE 20 ss AND A, [X+#ss] 16
CE 21 ss AND A, [Y+#ss] 16
CE 22 AND A, [X+L] 16
CE 23 AND A, [Y+L] 16
CE 24 AND [HL], A 16
CE 25 nn AND [HL], #nn 20
CE 26 AND [HL], [X] 20
CE 27 AND [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+A       = Register A
+B       = Register B
+L       = Register L
+H       = Register H
+F       = Register F
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; AND Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds AND Sc
+    
+

Description

+

"8-Bits Destination" Logic AND with "8-Bits Source".

+
Can be used to reset (clear) one or multiple bits.
+
+Bit 0 - Mask $FE
+Bit 1 - Mask $FD
+Bit 2 - Mask $FB
+Bit 3 - Mask $F7
+Bit 4 - Mask $EF
+Bit 5 - Mask $DF
+Bit 6 - Mask $BF
+Bit 7 - Mask $7F
+All   - Mask $00
+    
+

Conditions

+

Zero: Set when result is 0

+

Sign: Set when bit 7 of the result is 1

+

Carry and Overflow remain unchanged

+

Examples

+
; A = 0x85
+AND A, $80
+; A = 0x80
+; F = (Zero=0):(Sign=1)
+    
+
; B = 0xF0
+AND B, $04
+; B = 0x00
+; F = (Zero=1):(Sign=0)
+    
+
; A = 0xF0
+AND A, $55
+; A = 0x50
+; F = (Zero=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CALL.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CALL.html new file mode 100644 index 0000000000..0fd7e856ce --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CALL.html @@ -0,0 +1,508 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

CALL = Call routine

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles,Trueor FalseCondition
E0 ss CALLCB #ss*1 20 8 Carry=1
E1 ss CALLNCB #ss*1 20 8 Carry=0
E2 ss CALLZB #ss*1 20 8 Zero=1
E3 ss CALLNZB #ss*1 20 8 Zero=0
E8 ss ss CALLCW #ssss*1 24 12 Carry=1
E9 ss ss CALLNCW #ssss*1 24 12 Carry=0
EA ss ss CALLZW #ssss*1 24 12 Zero=1
EB ss ss CALLNZW #ssss*1 24 12 Zero=0
F0 ss CALLB #ss*1 20 None None
F2 ss ss CALLW #ssss*1 24 None None
FB nn nn CALL [#nnnn] 20 None None
FC nn CINT #nn 20 None None
CE F0 ss CALLL #ss 24 12 (Overflow=1) != (Sign=1)
CE F1 ss CALLLE #ss 24 12 ((Overflow=0) != (Sign=0)) OR (Zero=1)
CE F2 ss CALLG #ss 24 12 ((Overflow=1) == (Sign=1)) AND (Zero=0)
CE F3 ss CALLGE #ss 24 12 (Overflow=0) == (Sign=0)
CE F4 ss CALLO #ss 24 12 Overflow=1
CE F5 ss CALLNO #ss 24 12 Overflow=0
CE F6 ss CALLNS #ss 24 12 Sign=0
CE F7 ss CALLS #ss 24 12 Sign=1
CE F8 ss CALLNX0 #ss 24 12 ??
CE F9 ss CALLNX1 #ss 24 12 ??
CE FA ss CALLNX2 #ss 24 12 ??
CE FB ss CALLNX3 #ss 24 12 ??
CE FC ss CALLX0 #ss 24 12 ??
CE FD ss CALLX1 #ss 24 12 ??
CE FE ss CALLX2 #ss 24 12 ??
CE FF ss CALLX3 #ss 24 12 ??
+

*1: CALL, CALLC, CALLNC, CALLZ and CALLNZ can be used in the assembler to auto-detect the appropriate range.

+

Execute

+
#nn      = Immediate unsigned 8-Bits
+#ss      = Immediate signed 8-Bits
+#ssss    = Immediate signed 16-Bits
+U/V      = Register U or V
+SP       = Register SP (Stack Pointer)
+PC       = Register PC (Program Counter)
+[#nnnn]  = Memory: (I shl 16) or #nnnn
+    
+
; CALL*B #ss
+
+IF (Condition) THEN
+  SP = SP - 3
+  Memory[SP+2] = V
+  Memory[SP+1] = PC SHR 8
+  Memory[SP]   = PC AND 0x00FF
+  V = U
+  PC = PC + #ss - 1
+ENDIF
+    
+
; CALL*W #ssss
+
+IF (Condition) THEN
+  SP = SP - 3
+  Memory[SP+2] = V
+  Memory[SP+1] = PC SHR 8
+  Memory[SP]   = PC AND 0x00FF
+  V = U
+  PC = PC + #ssss - 1
+ENDIF
+    
+
; CALLB #ss
+
+SP = SP - 3
+Memory[SP+2] = V
+Memory[SP+1] = PC SHR 8
+Memory[SP]   = PC AND 0x00FF
+V = U
+PC = PC + #ss - 1
+    
+
; CALLW #ssss
+
+SP = SP - 3
+Memory[SP+2] = V
+Memory[SP+1] = PC SHR 8
+Memory[SP]   = PC AND 0x00FF
+V = U
+PC = PC + #ssss - 1
+    
+
; CALL [#nnnn]
+
+SP = SP - 3
+Memory[SP+2] = V
+Memory[SP+1] = PC SHR 8
+Memory[SP]   = PC AND 0x00FF
+V = U
+PC = Memory16[(I SHL 16) + #nnnn]
+    
+
; CINT #nn (not fully tested)
+
+SP = SP - 4
+Memory[SP+3] = V
+Memory[SP+2] = PC SHR 8
+Memory[SP+1] = PC AND 0x00FF
+Memory[SP]   = F
+V = U
+PC = Memory16[#nn SHL 1]
+    
+

Description

+

Call a subroutine (CALL*) or a interrupt vector (CINT).

+

Use RET to return from a subroutine and RETI from a interrupt.

+

NOTE: All non-branch instructions does "U <= V" causing U to be + restored, any branch that require banking needs "MOV U, A" or "MOV U, + #nn" before CALL...

+

Conditions

+

None

+

Examples

+
 ; A = 0x10
+ ; B = 0x10
+ CALL somefunction
+ ; A = 0x11
+ ; B = 0x0F
+ TST B, #0x10
+ ; F = (Zero=0):(Sign=0)
+ CALLZ somefunction    ; Condition fail, call not taken
+ ; A = 0x11
+ ; B = 0x0F
+ ; F = (Zero=0):(Sign=0)
+ CALLNS somefunction   ; Condition succeed
+ ; A = 0x12
+ ; B = 0x0E
+
+ (...)
+
+somefunction:
+ INC A
+ DEC B
+ RET                   ; Return from the call
+    
+
; Calling a subroutine at different bank
+MOV U, $0F
+CALL function_at_bank_16
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CMP16.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CMP16.html new file mode 100644 index 0000000000..f2a9bdcfe6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CMP16.html @@ -0,0 +1,319 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

CMP = Compare (16-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
D4 nn nn CMP BA, #nnnn 12
D5 nn nn CMP HL, #nnnn 12
D6 nn nn CMP X, #nnnn 12
D7 nn nn CMP Y, #nnnn 12
CF 6C nn nn CMP SP, #nnnn 16
CF 18 CMP BA, BA 16
CF 19 CMP BA, HL 16
CF 1A CMP BA, X 16
CF 1B CMP BA, Y 16
CF 38 CMP HL, BA 16
CF 39 CMP HL, HL 16
CF 3A CMP HL, X 16
CF 3B CMP HL, Y 16
CF 5C CMP SP, BA 16
CF 5D CMP SP, HL 16
+

Execute

+
#nnnn    = Immediate unsigned 16-Bits
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+SP       = Register SP (Stack Pointer)
+    
+
; CMP Sc2, Sc
+;
+; Sc2 = Source 2
+; Sc  = Source
+
+(discarded) = Sc2 - Sc
+    
+

Description

+

"16-Bits Source 2" subtracts with "16-Bits Source", result is discarded.

+

This instruction is used to compare values.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 16-bits signed range (< -32768 OR > 32767)

+

Sign: Set when bit 15 of the result is 1

+

Examples

+
; BA = 0x2EF0
+CMP BA, $1337
+; BA = 0x2EF0
+;      0x1BB9 (0x2EF0 - 0x1337 = 0x(0)1BB9)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; HL = 0xBB7E
+; BA = 0xCF12
+CMP BA, HL
+; HL = 0xBB7E
+; BA = 0xCF12
+;     0xEC6C (0xCF12 - 0xBB7E = 0x(1)EC6C)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CMP8.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CMP8.html new file mode 100644 index 0000000000..af337a98d4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_CMP8.html @@ -0,0 +1,357 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

CMP = Compare (8-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
30 CMP A, A 8
31 CMP A, B 8
32 nn CMP A, #nn 8
33 CMP A, [HL] 8
34 nn CMP A, [N+#nn] 12
35 nn nn CMP A, [#nnnn] 16
36 CMP A, [X] 8
37 CMP A, [Y] 8
DB nn nn CMP [N+#nn], #nn 16
CE 30 ss CMP A, [X+#ss] 16
CE 31 ss CMP A, [Y+#ss] 16
CE 32 CMP A, [X+L] 16
CE 33 CMP A, [Y+L] 16
CE 34 CMP [HL], A 16
CE 35 nn CMP [HL], #nn 20
CE 36 CMP [HL], [X] 20
CE 37 CMP [HL], [Y] 20
CE BC nn CMP B, #nn 12
CE BD nn CMP L, #nn 12
CE BE nn CMP H, #nn 12
CE BF nn CMP N, #nn 12
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+#ss     = Immediate signed 8-Bits
+A       = Register A
+B       = Register B
+N       = Register N
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: (I shl 16) or #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; CMP Sc2, Sc
+;
+; Sc2 = Source 2
+; Sc  = Source
+
+(discarded) = Sc2 - Sc
+    
+

Description

+

"8-Bits Source 2" subtracts with "8-Bits Source", result is discarded.

+

This instruction is used to compare values.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 8-bits signed range (< -128 OR > 127)

+

Sign: Set when bit 7 of the result is 1

+

Examples

+
; A = 0x55
+CMP A, $80
+; A = 0x55
+;     0xD5 (0x55 - 0x80 = 0x(1)D4)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+
; B = 0x31
+; A = 0xCF
+CMP A, B
+; B = 0x31
+; A = 0xCF
+;     0x9E (0xCF - 0x31 = 0x(0)9E)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_DEC.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_DEC.html new file mode 100644 index 0000000000..ea37eafd0e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_DEC.html @@ -0,0 +1,312 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

DEC = Decrease Register by 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
88 DEC A 8
89 DEC B 8
8A DEC L 8
8B DEC H 8
8C DEC N 8
8D nn DEC [N+#nn] 16
8E DEC [HL] 12
8F DEC SP 8
98 DEC BA 8
99 DEC HL 8
9A DEC X 8
9B DEC Y 8
+

Execute

+
A        =  (8-Bits) Register A
+B        =  (8-Bits) Register B
+L        =  (8-Bits) Register L
+H        =  (8-Bits) Register H
+N        =  (8-Bits) Register N
+SP       = (16-Bits) Register SP (Stack Pointer)
+BA       = (16-Bits) Register BA: (B shl 8) or A
+HL       = (16-Bits) Register HL: (H shl 8) or L
+X        = (16-Bits) Register X
+Y        = (16-Bits) Register Y
+[N+#nn]  =  (8-Bits) Memory: (I shl 16) or (N shl 8) or #nn
+[HL]     =  (8-Bits) Memory: (I shl 16) or HL
+    
+
; DEC Ds
+;
+; Ds = Source/Destination
+
+Ds = Ds - 1
+    
+

Description

+

"Destination" is decremented by 1.

+

Conditions

+

Zero: Set when result is 0

+

Carry, Overflow and Sign remain unchanged

+

Examples

+
; A = 0x55
+DEC A
+; A = 0x54 (0x55 - 1 = 0x54)
+; F = (Zero=0)
+    
+
; [N+0x88] = 0xFF
+DEC [N+$88]
+; [N+0x88] = 0xFE (0xFF - 1 = 0xFE)
+; F = (Zero=0)
+    
+
; BA = 0x2997
+DEC BA
+; BA = 0x2996 (0x2997 - 1 = 0x2996)
+; F = (Zero=0)
+    
+
; X = 0xFFFF
+DEC X
+; X = 0xFFFE (0xFFFF - 1 = 0xFFFE)
+; F = (Zero=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_DIV.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_DIV.html new file mode 100644 index 0000000000..0cab93cbcd --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_DIV.html @@ -0,0 +1,261 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

DIV = Divide

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE D9 DIV HL, A 52
+

Execute

+
; DIV HL, A
+;
+; HL is the Dividend
+; A is the Divisor
+; L will be the Quotient
+; H will be the Remainder/Rest
+
+Ds = HL ÷ A
+IF Ds < 256 THEN
+  L = Ds          ; Quotient
+  H = HL % A      ; Remainder
+ENDIF
+
+    
+

Note:

+

Can throw Division by Zero if Divisor is 0 (We need to research more about this).

+

If Quotient can't fit in 8-Bits range, Overflow flag will be set and the result won't be saved.

+

Description

+

"16-Bits Register HL" divide by "8-Bits Register A", Quotient will be + stored at "8-Bits Register L" and Remainder will be stored at "8-Bits + Register H".

+

Conditions

+

Zero: Set when result is 0

+

Carry: Always Clear

+

Overflow: Set when Quotient can't fit in 8-Bits range

+

Sign: Set when bit 7 of Quotient is 1

+

Examples

+
; A = 0x02
+; HL = 0x0007
+DIV HL, A
+; L = 0x03 (0x0007 / 0x02 = 0x03 (with rest 0x01))
+; H = 0x01 (Remainder/Rest)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; A = 0x00
+; HL = 0x0007
+DIV HL, A
+;          (0x0007 / 0x00 = Division by Zero)
+; HL = 0x????  (Unpredictable result!?)
+; F = (Zero=?):(Carry=?):(Overflow=?):(Sign=?)
+; - Throw Division by Zero Exception
+    
+
; A = 0x02
+; HL = 0xFFFD
+DIV HL, A
+;          (0xFFFD / 0x02 = 0x7FFE (with rest 0x01))
+; HL = 0xFFFD  (Results are unchanged since Quotient exceed 8-Bits range)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_EX.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_EX.html new file mode 100644 index 0000000000..b221771082 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_EX.html @@ -0,0 +1,251 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

EX = Expand Register

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE A8 EX BA, A 12
+

Execute

+
A       =  (8-Bits) Register A
+BA      = (16-Bits) Register BA: (B shl 8) or A
+    
+
; EX BA, A
+;
+; BA = Destination
+; A  = Source
+
+IF (A AND 0x80) THEN  ; Check for sign
+  B = 0xFF
+ELSE
+  B = 0x00
+ENDIF
+    
+

Description

+

EX expands register A into BA, turning a signed 8-bits value into 16-bits.

+

Conditions

+

None

+

Examples

+
; A = 0x05 (5)
+EX BA, A
+; BA = 0x0005 (5)
+    
+
; A = 0xF9 (-7)
+EX BA, A
+; BA = 0xFFF9 (-7)
+    
+
; A = 0x00 (0)
+EX BA, A
+; BA = 0x0000 (0)
+    
+
; A = 0x7F (127)
+EX BA, A
+; BA = 0x007F (127)
+    
+
; A = 0x80 (-128)
+EX BA, A
+; BA = 0xFF80 (-128)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_HALT.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_HALT.html new file mode 100644 index 0000000000..28e1a010a6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_HALT.html @@ -0,0 +1,228 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

HALT = Halt CPU

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE AE HALT 8
+

Execute

+
See description.
+    
+

Description

+

Halt the CPU until a interrupt is requested.

+

Using this instruction will reduce energy consumption.

+

NOTE:
+ If no interrupts are enabled, the system will be unable to resume operation.
+ Never call HALT in a middle of an interrupt.
+ Code will resume after HALT when the requested interrupt is completed.

+

Conditions

+

None

+

Examples

+
; Make sure interrupts are enabled and configured correctly.
+HALT
+; Operation will resume once the interrupt finish.
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_INC.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_INC.html new file mode 100644 index 0000000000..c0a2d9e04f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_INC.html @@ -0,0 +1,312 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

INC = Increase Register by 1

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
80 INC A 8
81 INC B 8
82 INC L 8
83 INC H 8
84 INC N 8
85 nn INC [N+#nn] 16
86 INC [HL] 12
87 INC SP 8
90 INC BA 8
91 INC HL 8
92 INC X 8
93 INC Y 8
+

Execute

+
A        =  (8-Bits) Register A
+B        =  (8-Bits) Register B
+L        =  (8-Bits) Register L
+H        =  (8-Bits) Register H
+N        =  (8-Bits) Register N
+SP       = (16-Bits) Register SP (Stack Pointer)
+BA       = (16-Bits) Register BA: (B shl 8) or A
+HL       = (16-Bits) Register HL: (H shl 8) or L
+X        = (16-Bits) Register X
+Y        = (16-Bits) Register Y
+[N+#nn]  =  (8-Bits) Memory: (I shl 16) or (N shl 8) or #nn
+[HL]     =  (8-Bits) Memory: (I shl 16) or HL
+    
+
; INC Ds
+;
+; Ds = Source/Destination
+
+Ds = Ds + 1
+    
+

Description

+

"Destination" is incremented by 1.

+

Conditions

+

Zero: Set when result is 0

+

Carry, Overflow and Sign remain unchanged

+

Examples

+
; A = 0x55
+INC A
+; A = 0x56 (0x55 + 1 = 0x56)
+; F = (Zero=0)
+    
+
; [N+0x88] = 0xFF
+INC [N+$88]
+; [N+0x88] = 0x00 (0xFF + 1 = 0x00)
+; F = (Zero=1)
+    
+
; BA = 0x2997
+INC BA
+; BA = 0x2998 (0x2997 + 1 = 0x2998)
+; F = (Zero=0)
+    
+
; X = 0xFFFF
+INC X
+; X = 0x0000 (0xFFFF + 1 = 0x0000)
+; F = (Zero=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_JMP.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_JMP.html new file mode 100644 index 0000000000..d4d9d29b6f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_JMP.html @@ -0,0 +1,459 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

JMP = Jump to routine

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCyclesCondition
E4 ss JCB #ss*1 8 Carry=1
E5 ss JNCB #ss*1 8 Carry=0
E6 ss JZB #ss*1 8 Zero=1
E7 ss JNZB #ss*1 8 Zero=0
EC ss ss JCW #ssss*1 12 Carry=1
ED ss ss JNCW #ssss*1 12 Carry=0
EE ss ss JZW #ssss*1 12 Zero=1
EF ss ss JNZW #ssss*1 12 Zero=0
F1 ss JMPB #ss*1 8 None
F3 ss ss JMPW #ssss*1 12 None
F4 JMP HL 8 None
F5 ss JDBNZ #ss 16 B <> 0x00, decrement B before check
FD nn JINT #nn 8 None
CE E0 ss JL #ss 12 (Overflow=1) != (Sign=1)
CE E1 ss JLE #ss 12 ((Overflow=0) != (Sign=0)) OR (Zero=1)
CE E2 ss JG #ss 12 ((Overflow=1) == (Sign=1)) AND (Zero=0)
CE E3 ss JGE #ss 12 (Overflow=0) == (Sign=0)
CE E4 ss JO #ss 12 Overflow=1
CE E5 ss JNO #ss 12 Overflow=0
CE E6 ss JNS #ss 12 Sign=0
CE E7 ss JS #ss 12 Sign=1
CE E8 ss JNX0 #ss 12 ??
CE E9 ss JNX1 #ss 12 ??
CE EA ss JNX2 #ss 12 ??
CE EB ss JNX3 #ss 12 ??
CE EC ss JX0 #ss 12 ??
CE ED ss JX1 #ss 12 ??
CE EE ss JX2 #ss 12 ??
CE EF ss JX3 #ss 12 ??
+

*1: JMP, JC, JNC, JZ and JNZ can be used in the assembler to auto-detect the appropriate range.

+

Execute

+
#nn      = Immediate unsigned 8-Bits
+#ss      = Immediate signed 8-Bits
+#ssss    = Immediate signed 16-Bits
+B        = Register B
+U/V      = Register U or V
+HL       = Register HL: (H shl 8) or L
+SP       = Register SP (Stack Pointer)
+PC       = Register PC (Program Counter)
+[#nnnn]  = Memory: (I shl 16) or #nnnn
+    
+
; J*B #ss
+
+IF (Condition) THEN
+  V = U
+  PC = PC + #ss - 1
+ENDIF
+    
+
; J*W #ssss
+
+IF (Condition) THEN
+  V = U
+  PC = PC + #ssss - 1
+ENDIF
+    
+
; JMPB #ss
+
+V = U
+PC = PC + #ss - 1
+    
+
; JMPW #ssss
+
+V = U
+PC = PC + #ssss - 1
+    
+
; JMP HL
+
+V = U
+PC = HL
+    
+
; JDBNZ #ss
+
+B = B - 1
+IF (B <> 0) THEN
+  V = U
+  PC = PC + #ss - 1
+ENDIF
+    
+
; JINT #nn (not fully tested)
+
+V = U
+PC = Memory16[#nn SHL 1]
+    
+

Description

+

Jump into a new position of the program.

+

NOTE: All non-branch instructions does "U = V" causing U to be + restored, any branch that require banking needs "MOV U, A" or "MOV U, + #nn" before JMP/J*...

+

Conditions

+

0xF5 - JDBNZ #ss

+

Zero: Set when result is 0

+

Carry, Overflow and Sign remain unchanged

+

All others:

+

None

+

Examples

+
 ; A = 0x10
+ CMP A, 0x10  ; Compare A with 0x10
+ ; F = (Zero=1):(Carry=0):(Overflow=0):(Sign=0)
+ JZ val_is_16
+ MOV A, 0x00
+val_is_16:
+ ; A = 0x10
+    
+
; Jump into a label located at a different bank
+MOV U, $0F
+JMP function_at_bank_15
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MOV16.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MOV16.html new file mode 100644 index 0000000000..992f426398 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MOV16.html @@ -0,0 +1,822 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

MOV = Move Register (16-Bits)

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
B8 nn nn MOV BA, [#nnnn] 20
B9 nn nn MOV HL, [#nnnn] 20
BA nn nn MOV X, [#nnnn] 20
BB nn nn MOV Y, [#nnnn] 20
CF 78 nn nn MOV SP, [#nnnn] 24
 
BC nn nn MOV [#nnnn], BA 20
BD nn nn MOV [#nnnn], HL 20
BE nn nn MOV [#nnnn], X 20
BF nn nn MOV [#nnnn], Y 20
CF 7C nn nn MOV [#nnnn], SP 24
 
C4 nn nn MOV BA, #nnnn 12
C5 nn nn MOV HL, #nnnn 12
C6 nn nn MOV X, #nnnn 12
C7 nn nn MOV Y, #nnnn 12
CF 6E nn nn MOV SP, #nnnn 16
 
CF 70 ss MOV BA, [SP+#ss] 24
CF 71 ss MOV HL, [SP+#ss] 24
CF 72 ss MOV X, [SP+#ss] 24
CF 73 ss MOV Y, [SP+#ss] 24
CF 74 ss MOV [SP+#ss], BA 24
CF 75 ss MOV [SP+#ss], HL 24
CF 76 ss MOV [SP+#ss], X 24
CF 77 ss MOV [SP+#ss], Y 24
CF C0 MOV BA, [HL] 20
CF C1 MOV HL, [HL] 20
CF C2 MOV X, [HL] 20
CF C3 MOV Y, [HL] 20
CF D0 MOV BA, [X] 20
CF D1 MOV HL, [X] 20
CF D2 MOV X, [X] 20
CF D3 MOV Y, [X] 20
CF D8 MOV BA, [Y] 20
CF D9 MOV HL, [Y] 20
CF DA MOV X, [Y] 20
CF DB MOV Y, [Y] 20
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CF C4 MOV [HL], BA 20
CF C5 MOV [HL], HL 20
CF C6 MOV [HL], X 20
CF C7 MOV [HL], Y 20
CF D4 MOV [X], BA 20
CF D5 MOV [X], HL 20
CF D6 MOV [X], X 20
CF D7 MOV [X], Y 20
CF DC MOV [Y], BA 20
CF DD MOV [Y], HL 20
CF DE MOV [Y], X 20
CF DF MOV [Y], Y 20
CF E0 MOV BA, BA 8
CF E1 MOV BA, HL 8
CF E2 MOV BA, X 8
CF E3 MOV BA, Y 8
CF E4 MOV HL, BA 8
CF E5 MOV HL, HL 8
CF E6 MOV HL, X 8
CF E7 MOV HL, Y 8
CF E8 MOV X, BA 8
CF E9 MOV X, HL 8
CF EA MOV X, X 8
CF EB MOV X, Y 8
CF EC MOV Y, BA 8
CF ED MOV Y, HL 8
CF EE MOV Y, X 8
CF EF MOV Y, Y 8
CF F0 MOV SP, BA 8
CF F1 MOV SP, HL 8
CF F2 MOV SP, X 8
CF F3 MOV SP, Y 8
CF F4 MOV HL, SP 8
CF F5 MOV HL, PC 8
CF F8 MOV BA, SP 8
CF F9 MOV BA, PC 8
CF FA MOV X, SP 8
CF FE MOV Y, SP 8
+

Source as the column, and Destination as the row:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#nnnn BA HL X Y SP PC [HL] [X] [Y] [#nnnn] [SP+#ss]
BA C4 nn nn CF E0 CF E1 CF E2 CF E3 CF F8 CF F9 CF C0 CF D0 CF D8 B8 nn nn CF 70 ss
HL C5 nn nn CF E4 CF E5 CF E6 CF E7 CF F4 CF F5 CF C1 CF D1 CF D9 B9 nn nn CF 71 ss
X C6 nn nn CF E8 CF E9 CF EA CF EB CF FA CF C2 CF D2 CF DA BA nn nn CF 72 ss
Y C7 nn nn CF EC CF ED CF EE CF EF CF FE CF C3 CF D3 CF DB BB nn nn CF 73 ss
SP CF 6E nn nn CF F0 CF F1 CF F2 CF F3 CF 78 nn nn
[HL] CF C4 CF C5 CF C6 CF C7
[X] CF D4 CF D5 CF D6 CF D7
[Y] CF DC CF DD CF DE CF DF
[#nnnn] BC nn nn BD nn nn BE nn nn BF nn nn CF 6E nn nn
[SP+#ss] CF 74 ss CF 75 ss CF 76 ss CF 77
+

Execute

+
#nnnn    = Immediate unsigned 16-Bits
+#ss      = Immediate signed 8-Bits
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+SP       = Register SP (Stack Pointer)
+PC       = Register PC (Program Counter)
+[HL]     = Memory: (I shl 16) or HL
+[X]      = Memory: (XI shl 16) or X
+[Y]      = Memory: (YI shl 16) or Y
+[#nnnn]  = Memory: (I shl 16) or #nnnn
+[SP+#ss] = Memory: SP + #ss
+    
+
; MOV Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Sc
+    
+

Description

+

16-Bits Source gets copied to the 16-Bits Destination.

+

Conditions

+

None

+

Examples

+
; A = 0xF0
+; B = 0x0E
+MOV BA, $1337
+; A = 0x37
+; B = 0x13
+    
+
; A = 0x12
+; B = 0xCF
+; L = 0x7E
+; H = 0xAB
+MOV BA, HL
+; A = 0x7E
+; B = 0xAB
+; L = 0x7E
+; H = 0xAB
+    
+
; [HL] = 0xBEEF
+; A = 0xAD
+; B = 0xDE
+MOV BA, [HL]
+; [HL] = 0xBEEF
+; A = 0xEF
+; B = 0xBE
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MOV8.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MOV8.html new file mode 100644 index 0000000000..bafe1c0d71 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MOV8.html @@ -0,0 +1,1542 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

MOV = Move Register (8-Bits)

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
40 MOV A, A 4
41 MOV A, B 4
42 MOV A, L 4
43 MOV A, H 4
44 nn MOV A, [N+#nn] 12
45 MOV A, [HL] 8
46 MOV A, [X] 8
47 MOV A, [Y] 8
48 MOV B, A 4
49 MOV B, B 4
4A MOV B, L 4
4B MOV B, H 4
4C nn MOV B, [N+#nn] 12
4D MOV B, [HL] 8
4E MOV B, [X] 8
4F MOV B, [Y] 8
50 MOV L, A 4
51 MOV L, B 4
52 MOV L, L 4
53 MOV L, H 4
54 nn MOV L, [N+#nn] 12
55 MOV L, [HL] 8
56 MOV L, [X] 8
57 MOV L, [Y] 8
58 MOV H, A 4
59 MOV H, B 4
5A MOV H, L 4
5B MOV H, H 4
5C nn MOV H, [N+#nn] 12
5D MOV H, [HL] 8
5E MOV H, [X] 8
5F MOV H, [Y] 8
60 MOV [X], A 8
61 MOV [X], B 8
62 MOV [X], L 8
63 MOV [X], H 8
64 nn MOV [X], [N+#nn] 16
65 MOV [X], [HL] 12
66 MOV [X], [X] 12
67 MOV [X], [Y] 12
68 MOV [HL], A 8
69 MOV [HL], B 8
6A MOV [HL], L 8
6B MOV [HL], H 8
6C nn MOV [HL], [N+#nn] 16
6D MOV [HL], [HL] 12
6E MOV [HL], [X] 12
6F MOV [HL], [Y] 12
70 MOV [Y], A 8
71 MOV [Y], B 8
72 MOV [Y], L 8
73 MOV [Y], H 8
74 nn MOV [Y], [N+#nn] 16
75 MOV [Y], [HL] 12
76 MOV [Y], [X] 12
77 MOV [Y], [Y] 12
78 nn MOV [N+#nn], A 12
79 nn MOV [N+#nn], B 12
7A nn MOV [N+#nn], L 12
7B nn MOV [N+#nn], H 12
7D nn MOV [N+#nn], [HL] 16
7E nn MOV [N+#nn], [X] 16
7F nn MOV [N+#nn], [Y] 16
9F nn MOV F, #nn 12
B0 nn MOV A, #nn 8
B1 nn MOV B, #nn 8
B2 nn MOV L, #nn 8
B3 nn MOV H, #nn 8
B4 nn MOV N, #nn 8
B5 nn MOV [HL], #nn 12
B6 nn MOV [X], #nn 12
B7 nn MOV [Y], #nn 12
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
DD nn nn MOV [N+#nn], #nn 16
CE C4 nn MOV U, #nn 16
CE C5 nn MOV I, #nn 12
CE C6 nn MOV XI, #nn 12
CE C7 nn MOV YI, #nn 12
CE 40 ss MOV A, [X+#ss] 16
CE 41 ss MOV A, [Y+#ss] 16
CE 42 MOV A, [X+L] 16
CE 43 MOV A, [Y+L] 16
CE 48 ss MOV B, [X+#ss] 16
CE 49 ss MOV B, [Y+#ss] 16
CE 4A MOV B, [X+L] 16
CE 4B MOV B, [Y+L] 16
CE 50 ss MOV L, [X+#ss] 16
CE 51 ss MOV L, [Y+#ss] 16
CE 52 MOV L, [X+L] 16
CE 53 MOV L, [Y+L] 16
CE 58 ss MOV H, [X+#ss] 16
CE 59 ss MOV H, [Y+#ss] 16
CE 5A MOV H, [X+L] 16
CE 5B MOV H, [Y+L] 16
CE 44 ss MOV [X+#ss], A 16
CE 45 ss MOV [Y+#ss], A 16
CE 46 MOV [X+L], A 16
CE 47 MOV [Y+L], A 16
CE 4C ss MOV [X+#ss], B 16
CE 4D ss MOV [Y+#ss], B 16
CE 4E MOV [X+L], B 16
CE 4F MOV [Y+L], B 16
CE 54 ss MOV [X+#ss], L 16
CE 55 ss MOV [Y+#ss], L 16
CE 56 MOV [X+L], L 16
CE 57 MOV [Y+L], L 16
CE 5C ss MOV [X+#ss], H 16
CE 5D ss MOV [Y+#ss], H 16
CE 5E MOV [X+L], H 16
CE 5F MOV [Y+L], H 16
CE 60 ss MOV [HL], [X+#ss] 20
CE 61 ss MOV [HL], [Y+#ss] 20
CE 62 MOV [HL], [X+L] 20
CE 63 MOV [HL], [Y+L] 20
CE 68 ss MOV [X], [X+#ss] 20
CE 69 ss MOV [X], [Y+#ss] 20
CE 6A MOV [X], [X+L] 20
CE 6B MOV [X], [Y+L] 20
CE 78 ss MOV [Y], [X+#ss] 20
CE 79 ss MOV [Y], [Y+#ss] 20
CE 7A MOV [Y], [X+L] 20
CE 7B MOV [Y], [Y+L] 20
CE C0 MOV A, N 8
CE C1 MOV A, F 8
CE C8 MOV A, V 8
CE C9 MOV A, I 8
CE CA MOV A, XI 8
CE CB MOV A, YI 8
CE C2 MOV N, A 8
CE C3 MOV F, A 12
CE CC MOV U, A 12
CE CD MOV I, A 8
CE CE MOV XI, A 8
CE CF MOV YI, A 8
CE D0 nn nn MOV A, [#nnnn] 20
CE D1 nn nn MOV B, [#nnnn] 20
CE D2 nn nn MOV L, [#nnnn] 20
CE D3 nn nn MOV H, [#nnnn] 20
CE D4 nn nn MOV [#nnnn], A 20
CE D5 nn nn MOV [#nnnn], B 20
CE D6 nn nn MOV [#nnnn], L 20
CE D7 nn nn MOV [#nnnn], H 20
   
   
   
+


+ Source as the column, and Destination as the row:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#nn A B L H N F V I XI YI
A B0 nn 40 41 42 43 CE C0 CE C1 CE C8 CE C9 CE CA CE CB
B B1 nn 48 49 4A 4B
L B2 nn 50 51 52 53
H B3 nn 58 59 5A 5B
N B4 nn CE C2
F 9F nn CE C3
U CE C4 nn CE CC
I CE C5 nn CE CD
XI CE C6 nn CE CE
YI CE C7 nn CE CF
[N+#nn] DD nn nn 78 nn 79 nn 7A nn 7B nn
[HL] B5 nn 68 69 6A 6B
[X] B6 nn 60 61 62 63
[Y] B7 nn 70 71 72 73
[#nnnn] CE D4 nn nn CE D5 nn nn CE D6 nn nn CE D7 nn nn
[X+#ss] CE 44 ss CE 4C ss CE 54 ss CE 5C ss
[Y+#ss] CE 45 ss CE 4D ss CE 55 ss CE 5D ss
[X+L] CE 46 CE 4E CE 56 CE 5E ss
[Y+L] CE 47 CE 4F CE 57 CE 5F ss
[N+#nn] [HL] [X] [Y] [#nnnn] [X+#ss] [Y+#ss] [X+L] [Y+L]
A 44 nn 45 46 47 CE D0 nn nn CE 40 ss CE 41 ss CE 42 CE 43
B 4C nn 4D 4E 4F CE D1 nn nn CE 48 ss CE 49 ss CE 4A CE 4B
L 54 nn 55 56 57 CE D2 nn nn CE 50 ss CE 51 ss CE 52 CE 53
H 5C nn 5D 5E 5F CE D3 nn nn CE 58 ss CE 59 ss CE 5A CE 5B
N
F
U
I
XI
YI
[N+#nn] 7D nn 7E nn 7F nn
[HL] 6C nn 6D 6E 6F CE 60 ss CE 61 ss CE 62 CE 63
[X] 64 nn 65 66 67 CE 68 ss CE 69 ss CE 6A CE 6B
[Y] 74 nn 75 76 77 CE 78 ss CE 79 ss CE 7A CE 7B
[#nnnn]
[X+#ss]
[Y+#ss]
[X+L]
[Y+L]
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+#ss     = Immediate signed 8-Bits
+A       = Register A
+B       = Register B
+L       = Register L
+H       = Register H
+N       = Register N
+F       = Register F
+U/V     = Register U or V
+I       = Register I
+XI      = Register XI
+YI      = Register YI
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; MOV Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Sc
+    
+

Description

+

8-Bits Source gets copied to the 8-Bits Destination.

+

Conditions

+

None

+

Examples

+
; A = 0x55
+MOV A, $80
+; A = 0x80
+    
+
; A = 0x12
+; B = 0xCF
+MOV B, A
+; A = 0x12
+; B = 0x12
+    
+
; [HL] = 0xDE
+; A = 0xCF
+MOV A, [HL]
+; [HL] = 0xDE
+; A = 0xDE
+    
+

« Back to Instruction set

+ + + + + +
+

 

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MUL.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MUL.html new file mode 100644 index 0000000000..87faad241a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_MUL.html @@ -0,0 +1,250 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

MUL = Multiply

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE D8 MUL L, A 48
+

Execute

+
; MUL L, A
+;
+; L is the Factor/Multiplicand
+; A is the Multiplier
+; HL will be the Product
+
+HL = L x A
+
+    
+

Description

+

"8-Bits Register L" multiply by "8-Bits Register A", 16-Bits result is placed on "16-Bits Register HL".

+

Conditions

+

Zero: Set when result is 0

+

Carry: Always Clear

+

Overflow: Always Clear

+

Sign: Set when bit 15 of the result is 1

+

Examples

+
; A = 0x03
+; L = 0x03
+MUL L, A
+; A = 0x03
+; HL = 0x0009 (0x03 * 0x03 = 0x0009)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; A = 0x00
+; L = 0x03
+MUL L, A
+; A = 0x00
+; HL = 0x0000 (0x03 * 0x00 = 0x0000)
+; F = (Zero=1):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; A = 0xFF
+; L = 0xFF
+MUL L, A
+; A = 0xFF
+; HL = 0xFE01 (0xFF * 0xFF = 0xFE01)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NEG.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NEG.html new file mode 100644 index 0000000000..f9081bc8a1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NEG.html @@ -0,0 +1,262 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

NEG = Negate

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE A4 NEG A 12
CE A5 NEG B 12
CE A6 nn NEG [N+#nn] 20
CE A7 NEG [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; NEG Ds
+;
+; Ds = Source/Destination
+
+Ds = 0 - Ds
+
+    
+

Description

+

8-Bits Destination is negated.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is not 0

+

Overflow: Set when result is 0x80

+

Sign: Set when bit 7 of the result is 1

+

Examples

+
; A = 0x01
+NEG A
+; A = 0xFF (0 - 0x01 = 0xFF)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+
; B = 0x00
+NEG B
+; B = 0x00 (0 - 0x00 = 0x00)
+; F = (Zero=1):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; [HL] = 0x80
+NEG [HL]
+; [HL] = 0x80 (0 - 0x80 = 0x80)
+; F = (Zero=0):(Carry=1):(Overflow=1):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NOP.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NOP.html new file mode 100644 index 0000000000..d57b301922 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NOP.html @@ -0,0 +1,221 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

NOP = No Operation

+ + + + + + + + + + + + + +
HexMnemonicCycles
FF NOP 8
+

Execute

+

Nothing

+

Description

+

Does nothing, used for short delays.

+

Conditions

+

None

+

Examples

+
; Delay 8 Cycles
+NOP
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NOT.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NOT.html new file mode 100644 index 0000000000..9b1e187da3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_NOT.html @@ -0,0 +1,261 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

NOT = Logical NOT

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE A0 NOT A 12
CE A1 NOT B 12
CE A2 nn NOT [N+#nn] 20
CE A3 NOT [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; NOT Ds
+;
+; Ds = Source/Destination
+
+Ds = Ds XOR $FF
+
+    
+

Description

+

8-Bits Destination is inverted (all bits).

+

Conditions

+

Zero: Set when result is 0

+

Sign: Set when bit 7 of the result is 1

+

Carry and Overflow remain unchanged

+

Examples

+
; A = 0x01
+NOT A
+; A = 0xFE
+; F = (Zero=0):(Sign=1)
+    
+
; B = 0x85
+NOT B
+; B = 0x7A
+; F = (Zero=0):(Sign=0)
+    
+
; [HL] = 0xFF
+NOT [HL]
+; [HL] = 0x00
+; F = (Zero=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_OR.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_OR.html new file mode 100644 index 0000000000..41aae24e5f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_OR.html @@ -0,0 +1,369 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

OR = Logical Inclusive-OR

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
28 OR A, A 8
29 OR A, B 8
2A nn OR A, #nn 8
2B OR A, [HL] 8
2C nn OR A, [N+#nn] 12
2D nn nn OR A, [#nnnn] 16
2E OR A, [X] 8
2F OR A, [Y] 8
9D nn OR F, #nn 12
CE B4 nn OR B, #nn 12
CE B5 nn OR L, #nn 12
CE B6 nn OR H, #nn 12
D9 nn nn OR [N+#nn], #nn 20
CE 28 ss OR A, [X+#ss] 16
CE 29 ss OR A, [Y+#ss] 16
CE 2A OR A, [X+L] 16
CE 2B OR A, [Y+L] 16
CE 2C OR [HL], A 16
CE 2D nn OR [HL], #nn 20
CE 2E OR [HL], [X] 20
CE 2F OR [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+A       = Register A
+B       = Register B
+L       = Register L
+H       = Register H
+F       = Register F
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; OR Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds OR Sc
+    
+

Description

+

"8-Bits Destination" Logic OR (Inclusive-OR) with "8-Bits Source".

+
Can be used to set one or multiple bits.
+
+Bit 0 - Mask $01
+Bit 1 - Mask $02
+Bit 2 - Mask $04
+Bit 3 - Mask $08
+Bit 4 - Mask $10
+Bit 5 - Mask $20
+Bit 6 - Mask $40
+Bit 7 - Mask $80
+All   - Mask $FF
+    
+

Conditions

+

Zero: Set when result is 0

+

Sign: Set when bit 7 of the result is 1

+

Carry and Overflow remain unchanged

+

Examples

+
; A = 0x45
+OR A, $40
+; A = 0x45
+; F = (Zero=0):(Sign=0)
+    
+
; B = 0xF0
+OR B, $04
+; B = 0xF4
+; F = (Zero=0):(Sign=1)
+    
+
; A = 0xF0
+OR A, $55
+; A = 0xF5
+; F = (Zero=0):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_PACK.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_PACK.html new file mode 100644 index 0000000000..519ade9aad --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_PACK.html @@ -0,0 +1,232 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

PACK = Pack Nibbles

+ + + + + + + + + + + + + +
HexMnemonicCycles
DE PACK 8
+

Execute

+
A        =  (8-Bits) Register A
+B        =  (8-Bits) Register B
+    
+
; PACK
+
+A = (A AND 0x0F) OR (B SHL 4)
+
+    
+

Description

+

Pack low nibble of register A and B and return the formed byte into register A.

+

Register A forms the lower nibble and register B forms the higher nibble.

+

Conditions

+

None

+

Examples

+
; A = 0x01
+; B = 0x02
+PACK
+; A = 0x21
+; B = 0x02 (Remain unchanged)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_POP.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_POP.html new file mode 100644 index 0000000000..132ddc7403 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_POP.html @@ -0,0 +1,372 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

POP = Pop Register from Stack

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCyclesRegs stacked from top to bottom
A8 POP BA 12 B, A
A9 POP HL 12 H, L
AA POP X 12 X(Hi), X(Lo)
AB POP Y 12 Y(Hi), Y(Lo)
AC POP N 8 N
AD POP I 8 I
AE POPX 12 XI, YI
AF POP F 8 F
CF B4 POP A 12 A
CF B5 POP B 12 B
CF B6 POP L 12 L
CF B7 POP H 12 H
CF BC POPA 44 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N
CF BD POPAX 56 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N, I, XI, YI
+

Execute

+
A        = Register A
+B        = Register B
+L        = Register L
+H        = Register H
+N        = Register N
+F        = Register F
+I        = Register I
+XI       = Register XI
+YI       = Register YI
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+SP       = Register SP (Stack Pointer)
+    
+
; POP r16
+;
+; r16 = 16-Bits Register (BA, HL, X or Y)
+
+r16 = (Memory[SP+1] SHL 8) OR Memory[SP]
+SP = SP + 2
+    
+
; POP r8
+;
+; r8  =  8-Bits Register (A, B, L, H, N, I and F)
+
+r8 = Memory[SP]
+SP = SP + 1
+    
+
; POPX
+
+XI = Memory[SP+1]
+YI = Memory[SP]
+SP = SP + 2
+    
+
; POPA
+
+B = Memory[SP+8] = B
+A = Memory[SP+7] = A
+H = Memory[SP+6] = H
+L = Memory[SP+5] = L
+X = (Memory[SP+4] SHL 8) OR Memory[SP+3]
+Y = (Memory[SP+2] SHL 8) OR Memory[SP+1]
+N = Memory[SP]
+SP = SP + 9
+    
+
; POPAX
+
+B = Memory[SP+11]
+A = Memory[SP+10]
+H = Memory[SP+9]
+L = Memory[SP+8]
+X = (Memory[SP+7] SHL 8) OR Memory[SP+6]
+Y = (Memory[SP+5] SHL 8) OR Memory[SP+4]
+N = Memory[SP+3]
+I = Memory[SP+2]
+XI = Memory[SP+1]
+YI = Memory[SP]
+SP = SP + 12
+    
+

Description

+

Pop register(s) from the stack.

+

Conditions

+

None

+

Examples

+
; BA = 0x1337
+; SP = 0x2000
+PUSH BA
+; BA = 0x1337
+; SP = 0x1FFE
+MOV A, 0x80
+; BA = 0x1380
+; SP = 0x1FFE
+INC B
+; BA = 0x1480
+; SP = 0x1FFE
+POP BA
+; BA = 0x1337
+; SP = 0x2000
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_PUSH.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_PUSH.html new file mode 100644 index 0000000000..6e81eb38ea --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_PUSH.html @@ -0,0 +1,377 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

PUSH = Push Register into Stack

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCyclesRegs stacked from top to bottom
A0 PUSH BA 16 B, A
A1 PUSH HL 16 H, L
A2 PUSH X 16 X(Hi), X(Lo)
A3 PUSH Y 16 Y(Hi), Y(Lo)
A4 PUSH N 12 N
A5 PUSH I 12 I
A6 PUSHX 16 XI, YI
A7 PUSH F 12 F
CF B0 PUSH A 12 A
CF B1 PUSH B 12 B
CF B2 PUSH L 12 L
CF B3 PUSH H 12 H
CF B8 PUSHA 48 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N
CF B9 PUSHAX 60 B, A, H, L, X(Hi:Lo), Y(Hi:Lo), N, I, XI, YI
+

Execute

+
A        = Register A
+B        = Register B
+L        = Register L
+H        = Register H
+N        = Register N
+F        = Register F
+I        = Register I
+XI       = Register XI
+YI       = Register YI
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+SP       = Register SP (Stack Pointer)
+    
+
; PUSH r16
+;
+; r16 = 16-Bits Register (BA, HL, X or Y)
+
+SP = SP - 2
+Memory[SP+1] = r16 SHR 8      ; (High Byte)
+Memory[SP]   = r16 AND 0x00FF ; (Low Byte)
+    
+
; PUSH r8
+;
+; r8  =  8-Bits Register (A, B, L, H, N, I and F)
+
+SP = SP - 1
+Memory[SP]   = r8
+    
+
; PUSHX
+
+SP = SP - 2
+Memory[SP+1] = XI
+Memory[SP]   = YI
+    
+
; PUSHA
+
+SP = SP - 9
+Memory[SP+8] = B
+Memory[SP+7] = A
+Memory[SP+6] = H
+Memory[SP+5] = L
+Memory[SP+4] = X SHR 8      ; X(Hi)
+Memory[SP+3] = X AND 0x00FF ; X(Lo)
+Memory[SP+2] = Y SHR 8      ; Y(Hi)
+Memory[SP+1] = Y AND 0x00FF ; Y(Lo)
+Memory[SP]   = N
+    
+
; PUSHAX
+
+SP = SP - 12
+Memory[SP+11] = B
+Memory[SP+10] = A
+Memory[SP+9]  = H
+Memory[SP+8]  = L
+Memory[SP+7]  = X SHR 8      ; X(Hi)
+Memory[SP+6]  = X AND 0x00FF ; X(Lo)
+Memory[SP+5]  = Y SHR 8      ; Y(Hi)
+Memory[SP+4]  = Y AND 0x00FF ; Y(Lo)
+Memory[SP+3]  = N
+Memory[SP+2]  = I
+Memory[SP+1]  = XI
+Memory[SP]    = YI
+    
+

Description

+

Push register(s) into the stack.

+

Conditions

+

None

+

Examples

+
; BA = 0x1337
+; SP = 0x2000
+PUSH BA
+; BA = 0x1337
+; SP = 0x1FFE
+MOV A, 0x80
+; BA = 0x1380
+; SP = 0x1FFE
+INC B
+; BA = 0x1480
+; SP = 0x1FFE
+POP BA
+; BA = 0x1337
+; SP = 0x2000
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_RET.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_RET.html new file mode 100644 index 0000000000..c3bf24bca5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_RET.html @@ -0,0 +1,265 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

RET = Return from routine

+ + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
F8 RET 16
F9 RETI 16
FA RETSKIP 16
+

Execute

+
F        = Register F
+U/V      = Register U or V
+SP       = Register SP (Stack Pointer)
+PC       = Register PC (Program Counter)
+    
+
; RET (Return from a subroutine)
+
+V = Memory[SP+2]
+PC = (Memory[SP+1] SHL 8) + Memory[SP]
+SP = SP + 3
+    
+
; RETI (Return from an interrupt)
+
+V = Memory[SP+3]
+PC = (Memory[SP+2] SHL 8) + Memory[SP+1]
+F = Memory[SP]
+SP = SP + 4
+    
+
; RETSKIP (Return from a subroutine and skip 2 bytes)
+
+V = Memory[SP+2]
+PC = (Memory[SP+1] SHL 8) + Memory[SP] + 2
+SP = SP + 3
+    
+

Description

+

Return from a subroutine or an interrupt.

+

Conditions

+

None

+

Examples

+
 ; A = 0x10
+ ; B = 0x10
+ CALL somefunction
+ ; A = 0x11
+ ; B = 0x0F
+
+ (...)
+
+somefunction:
+ INC A
+ DEC B
+ RET
+ INC A  ; Never executed
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROL.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROL.html new file mode 100644 index 0000000000..1d84c5bd2e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROL.html @@ -0,0 +1,267 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ROL = Rotate Left

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 94 ROL A 12
CE 95 ROL B 12
CE 96 nn ROL [N+#nn] 20
CE 97 ROL [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; ROL Ds
+;
+; Ds = Source/Destination
+
+Ds = (Ds SHL 1) OR (Ds SHR 7)
+
+    
+

Description

+

"8-Bits Destination" bits are rotated left by 1.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when bit 0 of the result is 1

+

Sign: Set when bit 7 of the result is 1

+

Overflow remain unchanged

+

Examples

+
; A = 0x04
+ROL A
+; A = 0x08
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; B = 0x45
+ROL B
+; B = 0x8A
+; F = (Zero=0):(Carry=0):(Sign=1)
+    
+
; B = 0x84
+ROL B
+; B = 0x15
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+
; [HL] = 0x80
+ROL [HL]
+; [HL] = 0x01
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROLC.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROLC.html new file mode 100644 index 0000000000..ed159fa964 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROLC.html @@ -0,0 +1,277 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ROLC = Rotate Left through Carry

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 90 ROLC A 12
CE 91 ROLC B 12
CE 92 nn ROLC [N+#nn] 20
CE 93 ROLC [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; ROLC Ds
+;
+; Ds = Source/Destination
+
+Ds = (Ds SHL 1) OR Carry
+
+    
+

Description

+

"8-Bits Destination" bits are rotated left by 1 through Carry.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when old bit 7 is 1

+

Sign: Set when bit 7 of the result is 1

+

Overflow remain unchanged

+

Examples

+
; A = 0x04
+; F = (Carry=0)
+ROLC A
+; A = 0x08
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; B = 0x45
+; F = (Carry=1)
+ROLC B
+; B = 0x8B
+; F = (Zero=0):(Carry=0):(Sign=1)
+    
+
; B = 0x84
+; F = (Carry=0)
+ROLC B
+; B = 0x08
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+
; [HL] = 0x80
+; F = (Carry=0)
+ROLC [HL]
+; [HL] = 0x00
+; F = (Zero=1):(Carry=1):(Sign=0)
+    
+
; [HL] = 0x80
+; F = (Carry=1)
+ROLC [HL]
+; [HL] = 0x01
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROR.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROR.html new file mode 100644 index 0000000000..8bce949b71 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_ROR.html @@ -0,0 +1,267 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

ROR = Rotate Right

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 9C ROR A 12
CE 9D ROR B 12
CE 9E nn ROR [N+#nn] 20
CE 9F ROR [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; ROR Ds
+;
+; Ds = Source/Destination
+
+Ds = (Ds SHR 1) OR (Ds SHL 7)
+
+    
+

Description

+

"8-Bits Destination" bits are rotated right by 1.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when bit 7 of the result is 1

+

Sign: Set when bit 7 of the result is 1

+

Overflow remain unchanged

+

Examples

+
; A = 0x04
+ROR A
+; A = 0x02
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; B = 0x45
+ROR B
+; B = 0xA2
+; F = (Zero=0):(Carry=1):(Sign=1)
+    
+
; B = 0x84
+ROR B
+; B = 0x42
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; [HL] = 0x01
+ROR [HL]
+; [HL] = 0x80
+; F = (Zero=0):(Carry=1):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_RORC.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_RORC.html new file mode 100644 index 0000000000..2cb27e5803 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_RORC.html @@ -0,0 +1,277 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

RORC = Rotate Right through Carry

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 98 RORC A 12
CE 99 RORC B 12
CE 9A nn RORC [N+#nn] 20
CE 9B RORC [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; RORC Ds
+;
+; Ds = Source/Destination
+
+Ds = (Ds SHR 1) OR (Carry SHL 7)
+
+    
+

Description

+

"8-Bits Destination" bits are rotated right by 1 through Carry.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when old bit 0 is 1

+

Sign: Set when bit 7 of the result is 1

+

Overflow remain unchanged

+

Examples

+
; A = 0x04
+; F = (Carry=0)
+RORC A
+; A = 0x02
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; B = 0x45
+; F = (Carry=1)
+RORC B
+; B = 0xA2
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+
; B = 0x84
+; F = (Carry=0)
+RORC B
+; B = 0x42
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; [HL] = 0x01
+; F = (Carry=0)
+RORC [HL]
+; [HL] = 0x00
+; F = (Zero=1):(Carry=1):(Sign=0)
+    
+
; [HL] = 0x01
+; F = (Carry=1)
+RORC [HL]
+; [HL] = 0x80
+; F = (Zero=0):(Carry=1):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SAL.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SAL.html new file mode 100644 index 0000000000..7f2a4c76c8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SAL.html @@ -0,0 +1,273 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SAL = Shift Arithmetic Left

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 80 SAL A 12
CE 81 SAL B 12
CE 82 nn SAL [N+#nn] 20
CE 83 SAL [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; SAL Ds
+;
+; Ds = Source/Destination
+
+Ds = Ds SHL 1
+
+    
+

Description

+

"8-Bits Destination" bits are arithmetically shifted left by 1.

+

NOTE: This instruction can be used as an signed integer multiplication by 2.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when the old bit 7 was 1

+

Overflow: Set when result overflow 8-bits signed range (< -128 OR > 127)

+

Sign: Set when bit 7 of the result is 1

+

Examples

+
; A = 0x04 (4)
+SAL A
+; A = 0x08 (8)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; A = 0xFE (-2)
+SAL A
+; A = 0xFC (-4)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+
; B = 0x45 (69)
+SAL B
+; B = 0x8A (-124)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+
; B = 0x84 (-124)
+SAL B
+; B = 0x14 (20)
+; F = (Zero=0):(Carry=1):(Overflow=1):(Sign=0)
+    
+
; [HL] = 0x80 (-128)
+SAL [HL]
+; [HL] = 0x00 (0)
+; F = (Zero=1):(Carry=1):(Overflow=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SAR.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SAR.html new file mode 100644 index 0000000000..f83353cdd0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SAR.html @@ -0,0 +1,273 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SAR = Shift Arithmetic Right

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 88 SAR A 12
CE 89 SAR B 12
CE 8A nn SAR [N+#nn] 20
CE 8B SAR [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; SAR Ds
+;
+; Ds = Source/Destination
+
+Ds = (Ds AND 0x80) OR (Ds SHR 1)
+
+    
+

Description

+

"8-Bits Destination" bits are arithmetically shifted right by 1.

+

NOTE: This instruction can be used as an signed integer division by 2.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when the old bit 0 was 1

+

Overflow: Always Reset (there's never a overflow)

+

Sign: Set when bit 7 of the result is 1

+

Examples

+
; A = 0x04 (4)
+SAR A
+; A = 0x02 (2)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; A = 0xFD (-4)
+SAR A
+; A = 0xFE (-2)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=1)
+    
+
; B = 0x45 (69)
+SAR B
+; B = 0x22 (34)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=0)
+    
+
; B = 0x84 (-124)
+SAR B
+; B = 0xC2 (-62)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=1)
+    
+
; [HL] = 0x01 (1)
+SAR [HL]
+; [HL] = 0x00 (0)
+; F = (Zero=1):(Carry=1):(Overflow=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SBC16.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SBC16.html new file mode 100644 index 0000000000..eb25a2f0c1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SBC16.html @@ -0,0 +1,292 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SBC = Subtract with Carry (16-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CF 0C SBC BA, BA 16
CF 0D SBC BA, HL 16
CF 0E SBC BA, X 16
CF 0F SBC BA, Y 16
CF 2C SBC HL, BA 16
CF 2D SBC HL, HL 16
CF 2E SBC HL, X 16
CF 2F SBC HL, Y 16
CF 62 nn nn SBC BA, #nnnn 16
CF 63 nn nn SBC HL, #nnnn 16
+

Execute

+
#nnnn    = Immediate unsigned 16-Bits
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+    
+
; SBC Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds - Sc - Carry
+    
+

Description

+

16-Bits Source and Carry subtracts to the 16-Bits Destination.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 16-bits signed range (< -32768 OR > 32767)

+

Sign: Set when bit 15 of the result is 1

+

Examples

+
; BA = 0x2EF0
+; F = (Carry=1)
+SBC BA, $1337
+; BA = 0x1BB8 (0x2EF0 - 0x1337 - 0x0001 = 0x(0)1BB8)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; HL = 0xBB7E
+; BA = 0xCF12
+; F = (Carry=0)
+SBC BA, HL
+; HL = 0xBB7E
+; BA = 0xEC6C (0xCF12 - 0xBB7E - 0x0000 = 0x(1)EC6C)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SBC8.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SBC8.html new file mode 100644 index 0000000000..dfee10aed0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SBC8.html @@ -0,0 +1,386 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SBC = Subtraction with Carry (8-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
18 SBC A, A 8
19 SBC A, B 8
1A nn SBC A, #nn 8
1B SBC A, [HL] 8
1C nn SBC A, [N+#nn] 12
1D nn nn SBC A, [#nnnn] 16
1E SBC A, [X] 8
1F SBC A, [Y] 8
CE 18 ss SBC A, [X+#ss] 16
CE 19 ss SBC A, [Y+#ss] 16
CE 1A SBC A, [X+L] 16
CE 1B SBC A, [Y+L] 16
CE 1C SBC [HL], A 16
CE 1D nn SBC [HL], #nn 20
CE 1E SBC [HL], [X] 20
CE 1F SBC [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+#ss     = Immediate signed 8-Bits
+A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: (I shl 16) or #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; SBC Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+; (If flags BCD=0 and NIBBLE=0)
+Ds = Ds - Sc - Carry
+
+;------------------------------------------------ 
+
+; (If flags BCD=0 and NIBBLE=1)
+Ds & 0x0F = (Ds & 0x0F) - (Sc & 0x0F) - Carry
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=0)
+IF (((Ds & 15) - (Sc & 15) - Carry) >= 10) THEN    ; Note: Should be an unsigned check
+  Ds = Ds - Sc - Carry - 6
+ELSE
+  Ds = Ds - Sc - Carry
+ENDIF
+IF (Ds >= 0xA0) Ds = Ds - 0x60
+; NOTE: This isn't accurate, there's some weird effect on a strange condition
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=1)
+IF (((Ds & 15) - (Sc & 15) - Carry) >= 10) THEN    ; Note: Should be an unsigned check
+  Ds & 0x0F = (Ds & 0x0F) - (Sc & 0x0F) - Carry - 6
+ELSE
+  Ds & 0x0F = (Ds & 0x0F) - (Sc & 0x0F) - Carry
+ENDIF
+    
+

Description

+

8-Bits Source and Carry subtracts to the 8-Bits Destination.

+

Conditions

+

If flags BCD=0 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 8-bits signed range (< -128 OR > 127)

+

Sign: Set when bit 7 of the result is 1

+

If flags BCD=0 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 4-bits signed range (< -16 OR > 15)

+

Sign: Set when bit 3 of the result is 1

+

If flags BCD=1 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Always Reset

+

Sign: Always Reset

+

If flags BCD=1 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Always Reset

+

Sign: Always Reset

+

Examples

+
; A = 0x55
+; F = (Carry=1)
+SBC A, $80
+; A = 0xD4 (0x55 - 0x80 - 0x01 = 0x(1)D4)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+
; B = 0x31
+; A = 0xCF
+; F = (Carry=0)
+SBC A, B
+; B = 0x31
+; A = 0x9E (0xCF - 0x31 - 0x00 = 0x(0)9E)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; ( BCD = 1, NIBBLE = 0 )
+; A = 0x10
+; F = (Carry=1)
+SBC A, $01
+; A = 0x08 (10 - 01 - 01 = 08)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; ( BCD = 0, NIBBLE = 1 )
+; A = 0x3F (Note, in "nibble mode" the high nibble is always discarded)
+; F = (Carry=1)
+SBC A, $01
+; A = 0x0D (0xF - 0x1 - 0x1 = 0x(0)D)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SHL.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SHL.html new file mode 100644 index 0000000000..a6c6f4ccca --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SHL.html @@ -0,0 +1,268 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SHL = Shift Left

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 84 SHL A 12
CE 85 SHL B 12
CE 86 nn SHL [N+#nn] 20
CE 87 SHL [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; SHL Ds
+;
+; Ds = Source/Destination
+
+Ds = Ds SHL 1
+
+    
+

Description

+

"8-Bits Destination" bits are shifted left by 1.

+

NOTE: This instruction can be used as an unsigned integer multiplication by 2.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when the old bit 7 was 1

+

Sign: Set when bit 7 of the result is 1

+

Overflow remain unchanged

+

Examples

+
; A = 0x04 (4)
+SHL A
+; A = 0x08 (8)
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; B = 0x45 (69)
+SHL B
+; B = 0x8A (138)
+; F = (Zero=0):(Carry=0):(Sign=1)
+    
+
; B = 0x84 (138)
+SHL B
+; B = 0x14 (20)
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+
; [HL] = 0x80 (128)
+SHL [HL]
+; [HL] = 0x00 (0)
+; F = (Zero=1):(Carry=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SHR.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SHR.html new file mode 100644 index 0000000000..596bd67923 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SHR.html @@ -0,0 +1,268 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SHR = Shift Right

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
CE 8C SHR A 12
CE 8D SHR B 12
CE 8E nn SHR [N+#nn] 20
CE 8F SHR [HL] 16
+

Execute

+
A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; SHR Ds
+;
+; Ds = Source/Destination
+
+Ds = Ds SHR 1
+
+    
+

Description

+

"8-Bits Destination" bits are shifted right by 1.

+

NOTE: This instruction can be used as an unsigned integer division by 2.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when the old bit 0 was 1

+

Sign: Set when bit 7 of the result is 1

+

Overflow remain unchanged

+

Examples

+
; A = 0x04 (4)
+SHR A
+; A = 0x02 (2)
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; B = 0x45 (69)
+SHR B
+; B = 0x22 (34)
+; F = (Zero=0):(Carry=1):(Sign=0)
+    
+
; B = 0x84 (132)
+SHR B
+; B = 0x42 (66)
+; F = (Zero=0):(Carry=0):(Sign=0)
+    
+
; [HL] = 0x01 (1)
+SHR [HL]
+; [HL] = 0x00 (0)
+; F = (Zero=1):(Carry=1):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_STOP.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_STOP.html new file mode 100644 index 0000000000..d1bc81b7b5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_STOP.html @@ -0,0 +1,229 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

STOP = Stop CPU

+ + + + + + + + + + + + + +
HexMnemonicCycles
CE AF STOP 8
+

Execute

+
See description.
+    
+

Description

+

Halt or disable most hardware until a interrupt is requested.

+

Used by BIOS to set the system in standby mode.

+

NOTE:
+ Almost all hardware gets disabled (CPU, LCD, Sound...).
+ If no interrupts are enabled, the system will be unable to resume operation.
+ Never call STOP directly, let BIOS to handle the shutdown by using "CINT $24".
+

+

Conditions

+

None

+

Examples

+
; STOP instruction isn't recommended to use.
+; Use this code to shutdown your program:
+CINT $24
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SUB16.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SUB16.html new file mode 100644 index 0000000000..d3552f882a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SUB16.html @@ -0,0 +1,336 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SUB = Subtraction (16-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
D0 nn nn SUB BA, #nnnn 12
D1 nn nn SUB HL, #nnnn 12
D2 nn nn SUB X, #nnnn 12
D3 nn nn SUB Y, #nnnn 12
CF 6A nn nn SUB SP, #nnnn 16
CF 08 SUB BA, BA 16
CF 09 SUB BA, HL 16
CF 0A SUB BA, X 16
CF 0B SUB BA, Y 16
CF 28 SUB HL, BA 16
CF 29 SUB HL, HL 16
CF 2A SUB HL, X 16
CF 2B SUB HL, Y 16
CF 48 SUB X, BA 16
CF 49 SUB X, HL 16
CF 4A SUB Y, BA 16
CF 4B SUB Y, HL 16
CF 4C SUB SP, BA 16
CF 4D SUB SP, HL 16
+

Execute

+
#nnnn    = Immediate unsigned 16-Bits
+BA       = Register BA: (B shl 8) or A
+HL       = Register HL: (H shl 8) or L
+X        = Register X
+Y        = Register Y
+SP       = Register SP (Stack Pointer)
+    
+
; SUB Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds - Sc
+    
+

Description

+

16-Bits Source subtracts to the 16-Bits Destination.

+

Conditions

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 16-bits signed range (< -32768 OR > 32767)

+

Sign: Set when bit 15 of the result is 1

+

Examples

+
; BA = 0x2EF0
+SUB BA, $1337
+; BA = 0x1BB9 (0x2EF0 - 0x1337 = 0x(0)1BB9)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; HL = 0xBB7E
+; BA = 0xCF12
+SUB BA, HL
+; HL = 0xBB7E
+; BA = 0xEC6C (0xCF12 - 0xBB7E = 0x(1)EC6C)
+; F = (Zero=0):(Carry=1):(Overflow=0):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SUB8.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SUB8.html new file mode 100644 index 0000000000..a91bd189c4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SUB8.html @@ -0,0 +1,382 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SUB = Subtraction (8-Bits)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
10 SUB A, A 8
11 SUB A, B 8
12 nn SUB A, #nn 8
13 SUB A, [HL] 8
14 nn SUB A, [N+#nn] 12
15 nn nn SUB A, [#nnnn]]] 16
16 SUB A, [X] 8
17 SUB A, [Y] 8
CE 10 ss SUB A, [X+#ss] 16
CE 11 ss SUB A, [Y+#ss] 16
CE 12 SUB A, [X+L] 16
CE 13 SUB A, [Y+L] 16
CE 14 SUB [HL], A 16
CE 15 nn SUB [HL], #nn 20
CE 16 SUB [HL], [X] 20
CE 17 SUB [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+#ss     = Immediate signed 8-Bits
+A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: (I shl 16) or #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; SUB Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+; (If flags BCD=0 and NIBBLE=0)
+Ds = Ds - Sc
+
+;------------------------------------------------ 
+
+; (If flags BCD=0 and NIBBLE=1)
+Ds & 0x0F = (Ds & 0x0F) - (Sc & 0x0F)
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=0)
+IF (((Ds & 15) - (Sc & 15)) >= 10) THEN    ; Note: Should be an unsigned check
+  Ds = Ds - Sc - 6
+ELSE
+  Ds = Ds - Sc
+ENDIF
+IF (Ds >= 0xA0) Ds = Ds - 0x60
+; NOTE: This isn't accurate, there's some weird effect on a strange condition
+
+;------------------------------------------------
+
+; (If flags BCD=1 and NIBBLE=1)
+IF (((Ds & 15) - (Sc & 15)) >= 10) THEN    ; Note: Should be an unsigned check
+  Ds & 0x0F = (Ds & 0x0F) - (Sc & 0x0F) - 6
+ELSE
+  Ds & 0x0F = (Ds & 0x0F) - (Sc & 0x0F)
+ENDIF
+    
+

Description

+

8-Bits Source subtracts to the 8-Bits Destination.

+

Conditions

+

If flags BCD=0 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 8-bits signed range (< -128 OR > 127)

+

Sign: Set when bit 7 of the result is 1

+

If flags BCD=0 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Set when result overflow 4-bits signed range (< -16 OR > 15)

+

Sign: Set when bit 3 of the result is 1

+

If flags BCD=1 and NIBBLE=0

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Always Reset

+

Sign: Always Reset

+

If flags BCD=1 and NIBBLE=1

+

Zero: Set when result is 0

+

Carry: Set when result is < 0

+

Overflow: Always Reset

+

Sign: Always Reset

+

Examples

+
; A = 0x55
+SUB A, $80
+; A = 0xD5 (0x55 - 0x80 = 0x(1)D5)
+; F = (Zero=0):(Carry=0):(Overflow=1):(Sign=1)
+    
+
; B = 0x31
+; A = 0xCF
+SUB A, B
+; B = 0x31
+; A = 0x9E (0xCF - 0x31 = 0x(0)9E)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; ( BCD = 1, NIBBLE = 0 )
+; A = 0x10
+SUB A, $01
+; A = 0x09 (10 - 01 = 09)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+
; ( BCD = 0, NIBBLE = 1 )
+; A = 0x3F (Note, in "nibble mode" the high nibble is always discarded)
+SUB A, $01
+; A = 0x0E (0xF - 0x1 = 0x(0)E)
+; F = (Zero=0):(Carry=0):(Overflow=0):(Sign=0)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SWAP.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SWAP.html new file mode 100644 index 0000000000..fa477a7c76 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_SWAP.html @@ -0,0 +1,239 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

SWAP = Swap Low and High Nibbles

+ + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
F6 SWAP A 8
F7 SWAP [HL] 12
+

Execute

+
A        = (8-Bits) Register A
+[HL]     = (8-Bits) Memory: (I shl 16) or HL
+    
+
; SWAP Ds
+;
+; Ds = Source/Destination
+
+Ds = (Ds SHL 4) OR (Ds SHR 4)
+    
+

Description

+

Swap low and high nibbles of a given byte.

+

Conditions

+

None

+

Examples

+
; A = 0x3A
+SWAP A
+; A = 0xA3
+    
+
; [HL] = 0xF6
+SWAP [HL]
+; [HL] = 0x6F
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_TST.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_TST.html new file mode 100644 index 0000000000..0dbb2cc7b1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_TST.html @@ -0,0 +1,281 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

TST = Test Bits

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
94 TST A, B 8
95 nn TST [HL], #nn 12
96 nn TST A, #nn 8
97 nn TST B, #nn 8
DC nn nn TST [N+#nn], #nn 16
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+A       = Register A
+B       = Register B
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+    
+
; TST Sc2, Sc
+;
+; Sc2 = Source 2
+; Sc  = Source
+
+(discarded) = Sc2 AND Sc
+    
+

Description

+

"8-Bits Source 2" Logic AND with "8-Bits Source", result is discarded.

+

Source is usually a mask, Flag Z (Zero) return true if the result masked bits are all 0.

+
Common usage:
+
+Check Bit 0 - Mask $01
+Check Bit 1 - Mask $02
+Check Bit 2 - Mask $04
+Check Bit 3 - Mask $08
+Check Bit 4 - Mask $10
+Check Bit 5 - Mask $20
+Check Bit 6 - Mask $40
+Check Bit 7 - Mask $80
+
+Zero result if Bit is 0.
+Non-zero result if Bit is 1.
+    
+

Conditions

+

Zero: Set when result is 0

+

Sign: Set when bit 7 of the result is 1

+

Carry and Overflow remain unchanged

+

Examples

+
; A = 0x85
+TST A, $80
+; F = (Zero=0):(Sign=1)
+    
+
; B = 0xF0
+TST B, $04
+; F = (Zero=1):(Sign=0)
+    
+
; A = 0x05
+TST A, $01
+; F = (Zero=0):(Sign=0)
+JNZ OddAccu  ; Called when first bit is 1.
+JZ EvenAccu
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_UNPACK.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_UNPACK.html new file mode 100644 index 0000000000..3093327493 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_UNPACK.html @@ -0,0 +1,232 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

UNPACK = Unpack Nibbles

+ + + + + + + + + + + + + +
HexMnemonicCycles
DF UNPACK 8
+

Execute

+
A        =  (8-Bits) Register A
+B        =  (8-Bits) Register B
+    
+
; UNPACK
+
+B = A SHR 4
+A = A AND 0x0F
+
+    
+

Description

+

Unpack byte in register A into 2 nibbles, storing them into register A and B.

+

Register A receive the lower nibble and register B receive the higher nibble.

+

Conditions

+

None

+

Examples

+
; A = 0x21
+UNPACK
+; A = 0x01
+; B = 0x02
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_XCHG.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_XCHG.html new file mode 100644 index 0000000000..3d5886b731 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_XCHG.html @@ -0,0 +1,276 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

XCHG = Exchange Registers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
C8 XCHG BA, HL 12
C9 XCHG BA, X 12
CA XCHG BA, Y 12
CB XCHG BA, SP 12
CC XCHG A, B 8
CD XCHG A, [HL] 12
+

Execute

+
A        =  (8-Bits) Register A
+B        =  (8-Bits) Register B
+BA       = (16-Bits) Register BA: (B shl 8) or A
+HL       = (16-Bits) Register HL: (H shl 8) or L
+X        = (16-Bits) Register X
+Y        = (16-Bits) Register Y
+SP       = (16-Bits) Register SP (Stack Pointer)
+[HL]     =  (8-Bits) Memory: (I shl 16) or HL
+    
+
; XCHG Sc2, Sc
+;
+; Sc2 = Source 2
+; Sc  = Source
+; Tr = Temporary Register
+
+Sc2   Sc
+   \ /
+    x
+   / \
+Sc2   Sc
+
+    
+

Description

+

"Source" content is exchanged (swapped) with "Source 2".

+

Conditions

+

None

+

Examples

+
; BA = 0x1337
+; HL = 0xC0D3
+XCHG BA, HL
+; BA = 0xC0D3
+; HL = 0x1337
+    
+
; A = 0x45
+; B = 0x12
+XCHG A, B
+; A = 0x12
+; B = 0x45
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_XOR.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_XOR.html new file mode 100644 index 0000000000..a4af039c63 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Opc_XOR.html @@ -0,0 +1,369 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

XOR = Logical Exclusive-OR

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexMnemonicCycles
38 XOR A, A 8
39 XOR A, B 8
3A nn XOR A, #nn 8
3B XOR A, [HL] 8
3C nn XOR A, [N+#nn] 12
3D nn nn XOR A, [#nnnn] 16
3E XOR A, [X] 8
3F XOR A, [Y] 8
9E nn XOR F, #nn 12
CE B8 nn XOR B, #nn 12
CE B9 nn XOR L, #nn 12
CE BA nn XOR H, #nn 12
DA nn nn XOR [N+#nn], #nn 20
CE 38 ss XOR A, [X+#ss] 16
CE 39 ss XOR A, [Y+#ss] 16
CE 3A XOR A, [X+L] 16
CE 3B XOR A, [Y+L] 16
CE 3C XOR [HL], A 16
CE 3D nn XOR [HL], #nn 20
CE 3E XOR [HL], [X] 20
CE 3F XOR [HL], [Y] 20
+

Execute

+
#nn     = Immediate unsigned 8-Bits
+A       = Register A
+B       = Register B
+L       = Register L
+H       = Register H
+F       = Register F
+[N+#nn] = Memory: (I shl 16) or (N shl 8) or #nn
+[HL]    = Memory: (I shl 16) or HL
+[X]     = Memory: (XI shl 16) or X
+[Y]     = Memory: (YI shl 16) or Y
+[#nnnn] = Memory: #nnnn
+[X+#ss] = Memory: (XI shl 16) or (X + #ss)
+[Y+#ss] = Memory: (YI shl 16) or (Y + #ss)
+[X+L]   = Memory: (XI shl 16) or (X + signed(L))
+[Y+L]   = Memory: (YI shl 16) or (Y + signed(L))
+    
+
; XOR Ds, Sc
+;
+; Ds = Destination
+; Sc = Source
+
+Ds = Ds XOR Sc
+    
+

Description

+

"8-Bits Destination" Logic XOR (Exclusive-OR) with "8-Bits Source".

+
Can be used to toggle one or multiple bits.
+
+Bit 0 - Mask $01
+Bit 1 - Mask $02
+Bit 2 - Mask $04
+Bit 3 - Mask $08
+Bit 4 - Mask $10
+Bit 5 - Mask $20
+Bit 6 - Mask $40
+Bit 7 - Mask $80
+All   - Mask $FF
+    
+

Conditions

+

Zero: Set when result is 0

+

Sign: Set when 7th bit of the result is 1

+

Carry and Overflow remain unchanged

+

Examples

+
; A = 0x45
+XOR A, $40
+; A = 0x05
+; F = (Zero=0):(Sign=0)
+    
+
; B = 0xF0
+XOR B, $04
+; B = 0xF4
+; F = (Zero=0):(Sign=1)
+    
+
; A = 0xF0
+XOR A, $55
+; A = 0xA5
+; F = (Zero=0):(Sign=1)
+    
+

« Back to Instruction set

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_PRC.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_PRC.html new file mode 100644 index 0000000000..5055b97f35 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_PRC.html @@ -0,0 +1,756 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

PRC (Program Rendering Chip)

+

Overview

+

Since the Pokemon Mini does not drive a conventional display, it does + not operate like typical display driver. The PRC was created as a + method for driving a serial LCD display. It's entire purpose is to blit images from various locations in memory to an internal frame buffer, and then force it out to GDRAM in on the LCD Controller. This is all done transparently.

+

The PRC operates by monitoring a display counter that can be accessed by reading PRC_CNT (Reg $8A), which overflows 65 times a frame (each frame is approx. 72 Hz), and a PRC rate divider PRC_RATE (Reg $81) that will trigger the PRC rendering process. When the counter reaches + specific values between the matching rate divider, the PRC triggers + various components. It can operates in 2 modes, "Rendering + Frame Copy" + and "Frame Copy Only".

+

During these various stages, the CPU is halted, and yields the + bus to the PRC. Depending on the enabled stages, the PRC will read + various locations from memory (cartridge and ram) and build a frame + buffer to $1000 ~ $12FF. Depending on the PRC rate divider and the + enabled modes, developers lose varying amounts of processor time.

+

Since all three display stages can be enabled or disabled + independently, users can perform a number of tricks such as multiplexing + sprites (by disabling frame copy on even frames, and map copy on odd + frames, changing the sprites each time), running in a pure + frame-buffered mode, or simply use the LCD controller manually by + disabling the VPU all together. - It seems disabling Frame Copy bit cause rendering to be disabled too.

+

The PRC shares ram with the CPU, so the more modes that are enabled, the less ram is usable by the developer (see PM RAM Layout).

+

Two IRQs are associated with the PRC, one associated with the Map + and Sprite stage, and one with the Frame Copy stage. After Frame Copy + is finished, a "PRC Render Done" IRQ fires. This event latches even if + the PRC has both the map and sprite renderer disabled, so this should be + taken into account. After the frame is copied to the LCD, the "PRC + Frame Copy" IRQ fires. It is not yet known if this fires if the frame + copy is disabled.

+

It is not uncommon for commercial games to disable the render + done IRQ, and simply probe the strobe manually. Shock tetris uses this + to double the number of on screen sprites.

+

Map Rendering Stage

+

Stage 1 of the PRC is a map renderer. This stage can render a + variable size 8x8 tile based map to the frame buffer (located at $1000). + This mode operates by using a 24bit address PRC_MAP_* (Reg $82 to $84) as the base for the tile set, and a tile map located at $1360. This stage is enabled by using bit 2 of PRC_MODE (Reg $80).

+ + + + + + + + + + + + + + + + + + + + + + + + +
+ Map Modes +
Mode Size
0 12 x 16
1 16 x 12
2 24 x 8
3 24 x 16
+


+ Tile maps are arranged in left to right order, wrapping around to the next line.

+


+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Mapping of 12x16 +
0 1 2 3 4 5 6 7 8 9 10 11
0 $1360 $1361 $1362 $1363 $1364 $1365 $1366 $1367 $1368 $1369 $136A $136B
1 $136C $136D $136E $136F $1370 $1371 $1372 $1373 $1374 $1375 $1376 $1377
2 $1378 $1379 $137A $137B $137C $137D $137E $137F $1380 $1381 $1382 $1383
3 $1384 $1385 $1386 $1387 $1388 $1389 $138A $138B $138C $138D $138E $138F
4 $1390 $1391 $1392 $1393 $1394 $1395 $1396 $1397 $1398 $1399 $139A $139B
5 $139C $139D $139E $139F $13A0 $13A1 $13A2 $13A3 $13A4 $13A5 $13A6 $13A7
6 $13A8 $13A9 $13AA $13AB $13AC $13AD $13AE $13AF $13B0 $13B1 $13B2 $13B3
7 $13B4 $13B5 $13B6 $13B7 $13B8 $13B9 $13BA $13BB $13BC $13BD $13BE $13BF
8 $13C0 $13C1 $13C2 $13C3 $13C4 $13C5 $13C6 $13C7 $13C8 $13C9 $13CA $13CB
9 $13CC $13CD $13CE $13CF $13D0 $13D1 $13D2 $13D3 $13D4 $13D5 $13D6 $13D7
10 $13D8 $13D9 $13DA $13DB $13DC $13DD $13DE $13DF $13E0 $13E1 $13E2 $13E3
11 $13E4 $13E5 $13E6 $13E7 $13E8 $13E9 $13EA $13EB $13EC $13ED $13EE $13EF
12 $13F0 $13F1 $13F2 $13F3 $13F4 $13F5 $13F6 $13F7 $13F8 $13F9 $13FA $13FB
13 $13FC $13FD $13FE $13FF $1400 $1401 $1402 $1403 $1404 $1405 $1406 $1407
14 $1408 $1409 $140A $140B $140C $140D $140E $140F $1410 $1411 $1412 $1413
15 $1414 $1415 $1416 $1417 $1418 $1419 $141A $141B $141C $141D $141E $141F
+


+ The value in the tile map then points to an 8 byte tile. The location of the tile is specified by (Tile * 8 + PRC_MAP_*). + The tiles are encoded in vertical strips, each 8 pixel strip = 1 byte. + The strips are encoded with the least significant bit on the top, + shifting by one bit right as it scans vertically. The PRC can also + invert the graphics as it renders them by setting the appropriate bit in PRC_MODE (Reg $80).

+

Maps can be offset up to 127 pixels vertically or horizontally (PRC_SCROLL_X (Reg. $86) and PRC_SCROLL_Y (Reg. $85)), + and is clamped to the size of the map itself, writes to the scroll + registers when the value is out of bounds does not update the location + in which rendering begins, but the values of the registers themselves + changes. Interestingly, these values are only verified when the + register is written, and changing the tile map size will result in maps + rendering gibberish tiles.

+

Under no circumstances do the maps wrap. To create smooth scrolling, the entire map must be rewritten to simulate wrap around.

+

Sprite Rendering Stage

+

After the map rendering stage, the Sprite Rendering stage takes + effect. The PRC allows for 24 16x16 on screen sprites per frame, which + can be positioned anywhere on screen.

+

Sprites are controlled by 24, 4 byte attribute blocks located between $1300 ~ $135F.

+


+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Sprite Attribute Blocks +
Address 7 6 5 4 3 2 1 0
0 Sprite X Position
1 Sprite Y Position
2 Sprite Tile
3 Enable Invert Color Vertical Flip Horizontal Flip
+


+ The Position operates on a virtual (128x128) screen, with is positioned + at (-16,-16) on the frame buffer. This allows for sprites to be + positioned partially off screen on all sides. The MSB of both + coordinate elements are ignored, so it can wrap around if care is not + taken.

+

Sprite Tiles are loaded using PRC_SPR_* (Reg. $87 to $89) as the base address, with sprites tiles being 64 bytes in length (making a full tile set 16kB).

+

Sprites are rendered by using 8 tiles, 4 mask and 4 graphic. The + mask tiles use a set pixel to signify which bits are to be left alone + and which bits are to be overwritten with the graphic bits. A set bit + leaves a pixel unchanged. The tiles are formatted in the same way as + the Map tiles.

+

The 8 tiles (in order) are: Mask (0,0) Mask (0,8) Graphic (0,0) Graphic (0,8) Mask (8,0) Mask (8,8) Graphic (8,0) Graphic (8,8)

+


+ Here is a graphical representation (taken from The Unofficial Poke Doc as distributed with PoKeKaMini):

+


+

+
+
+ + + + + + + + + + + + + + + + + + + +
1st 5th
2nd 6th
3rd 7th
4th 8th
+

White square = Draw
Dark square = Mask

+

VRAM = (VRAM & MASK) | (DRAW & ~MASK);

+

DRAW:
+  0 = white (black if inverted)
+  1 = black (white if inverted)
+
+ MASK:
+  0 = opaque
+  1 = transparent
+

+
+
+


+ Sprites are rendered in reverse order, so Sprite #0 would always been on + top. This means internally sprite #23 is drawn first, followed by #22 + up to #0 (painter's order)

+

Frame Copy Stage

+

The third and final stage is the simplest of all the PRC functions. + It simply sequentially moves the $300 bytes from $1000~$12FF to the + GDRAM of the LCD Controller. This + mode can be disabled independently of all the other modes allowing for + advanced rendering techniques by sacrificing frame rate.

+

PRC Timing Information

+

The PRC timing is controlled by two registers, the PRC counter PRC_CNT (Reg. $8A), + and a frame divider. The frame counter move between the values $01 to + $41, and overflows approximately 72 times per second (4,000,000 / + 55634). As previously mentioned, this counter controls when the PRC + fires the various display stages. These stages do not fire every time, + however. The PRC is configured to skip a certain number of display + cycles, only activating once every Nth frames as configured by PRC_RATE (Reg. $81). The top four bits of PRC_RATE (Reg. $81) is the current state of the divider, it counts up from 0, resetting + when it reaches the specified divider value. The PRC only renders and + copies when the PRC divider is at it's absolute maximum for the + configured divide rate.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ PRC Rate Values +
Rate Divider
0 3
1 6
2 9
3 12
4 2
5 4
6 6
7 8
+

There is no known way to use the PRC to use the full 72hz update + frequency. This can be circumvented by directly accessing GDRAM through + the LCD Controller

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ The stages trigger based on PRC_CNT (Reg. $8A) when rate divider match PRC_RATE (Reg. $81), CPU is stalled in the middle of the process. +
Mode PRC_MODE (Reg $8A) PRC_CNT Start PRC_CNT End PRC_CNT Time
Rendering + Frame Copy (7:0) xxxx101x
+

(7:0) xxxx110x
+ (7:0) xxxx111x
+

$17 $03 44 (67.7% PRC, 32.3% Free)
Frame Copy only (7:0) xxxx100x $38 $03 11 (16.9% PRC, 83.1% Free)
No Rendering (7:0) xxxx0xxx N/A N/A 0 (0.0% PRC, 100.0% Free)
+

x - Not important

+

The time for each logical frame is 55634 cycles + a few + (Determined by time between Frame Copy interrupts) and the time between + each PRC counter increment is approximately between 867 Cycles and 839 + Cycles (855 Cycles Average).

+

The time was determined by:

+


+

+
MOV BA, [0x2036]     ;  Read Timer
+MOV [NN+0x30], $8F   ;  Reset Timer to FFFF
+    
+


+ The extra cycles is the amount of time between the [0x2036] read and the + [NN+0x30] write, which is either or 6 and 8 cycles. Since we are + operating off a /2 divider, the error is also divided by two.

+

My estimation is it is 55638, since it is the first closest value divisible by $42

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Pinouts.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Pinouts.html new file mode 100644 index 0000000000..d312b85a76 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Pinouts.html @@ -0,0 +1,519 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Cartridge Pinouts

+

Connector edge

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Conn. Card TSOP Name Direction Function
1 B1 note 1 VCC . Power supply.
2 B1.5 note 1 VCC . Power supply.
3 B2 2 A20 OUT Address bit 20.
4 B2.5 3 A9/A19 OUT Address bit 9 is latched when LALH is high. Address bit 19 is latched when HALH is high.
5 B3 4 A8/A18 OUT Address bit 8 is latched when LALH is high. Address bit 18 is latched when HALH is high.
6 B3.5 5 A7/A17 OUT Address bit 7 is latched when LALH is high. Address bit 17 is latched when HALH is high.
7 B4 6 A6/A16 OUT Address bit 6 is latched when LALH is high. Address bit 16 is latched when HALH is high.
8 B4.5 7 A5/A15 OUT Address bit 5 is latched when LALH is high. Address bit 15 is latched when HALH is high.
9 B5 8 A4/A14 OUT Address bit 4 is latched when LALH is high. Address bit 14 is latched when HALH is high.
10 B5.5 9 A3/A13 OUT Address bit 3 is latched when LALH is high. Address bit 13 is latched when HALH is high.
11 B6 10 A2/A12 OUT Address bit 2 is latched when LALH is high. Address bit 12 is latched when HALH is high.
12 B6.5 11 A1/A11 OUT Address bit 1 is latched when LALH is high. Address bit 11 is latched when HALH is high.
13 B7 12 A0/A10 OUT Address bit 0 is latched when LALH is high. Address bit 10 is latched when HALH is high.
14 B7.5 note 1 VCC . Power supply.
15 B8 14 HALE OUT High address bits are latched when HALE is high.
16 . . . . No pad on cartridge.
17 B9/M1 15 LALE OUT Low address bits are latched when LALE is high.
18 B9.5 note 2 GND . Ground.
19 B10 31 D0 BIDIR Data bit 0 is output when OE is high.
20 B10.5 30 D1 BIDIR Data bit 1 is output when OE is high.
21 B11 29 D2 BIDIR Data bit 2 is output when OE is high.
22 B11.5 27 D3 BIDIR Data bit 3 is output when OE is high.
23 B12 26 D4 BIDIR Data bit 4 is output when OE is high.
24 B12.5 25 D5 BIDIR Data bit 5 is output when OE is high.
25 B13 23 D6 BIDIR Data bit 6 is output when OE is high.
26 B13.5 22 D7 BIDIR Data bit 7 is output when OE is high.
27 B14 20 OE OUT Output Enable. Data bits are output when OE is high.
28 B14.5 . IRQ IN Cause "Cartridge IRQ" interrupt when IRQ go high.
29 B15 19 WE OUT Write Enable. Pulled down with 100K in cartridge.
30 B15.5 18 CS OUT Chip select. Enables chip control. Pulled down with 100K in cartridge.
31 B16 . CARD_N IN Card detect. Active-low. It is connected to GND in the cartridge.
32 B16.5 note 2 GND . Ground.
33 B17 note 2 GND . Ground.
+

note 1: VCC on pin 1,21,28,32. LVTTL.

+

note 2: GND on pin 13,16,17,24.

+

note 3: Directions are relative to the system

+

Abbreviations

+

PM = Pokémon Mini

+

IN = Input

+

OUT = Output

+

BIDIR = Bi-Directional

+

TSOP = Thin Small Outline Package

+

LVTTL = Low Voltage Transistor-Transistor Level (3.3 Volt)

+

ROM = Read Only Memory

+

ALH = Address Latch High

+

OE = Output Enable

+

A? = Address signal

+

CS? = Chip Select

+

VCC = Power supply

+

GND = Signal ground

+

TSOP Chip

+
   MX23L4004    TSOP package
+.-------------/ /-------------.
+|  1 VCC               VCC 32 |
+|  2 A20               D0  31 |
+|  3 A9/A19            D1  30 |
+|  4 A8/A18            D2  29 |
+|  5 A7/A17            VCC 28 |
+|  6 A6/A16            D3  27 |
+|  7 A5/A15            D4  26 |
+|  8 A4/A14            D5  25 |
+|  9 A3/A13            GND 24 |
+| 10 A2/A12            D6  23 |
+| 11 A1/A11            D7  22 |
+| 12 A0/A10            VCC 21 |
+| 13 GND               OE  20 |
+| 14 HALE              WE  19 |
+| 15 LALE              CS  18 |
+| 16 GND               GND 17 |
+`-------------/ /-------------'
+    
+

PCB silk screen text

+

"MIN-KCM1-01"

+

"4M MASKROM" (4 Mbit)

+

Pads B1 to B17 are labeled.

+

IC U1

+

"MX23L4004-12A" (Macronix)

+

"MIN-MPBE-0 E" (Mini PinBall)

+

TSOP

+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_RAM.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_RAM.html new file mode 100644 index 0000000000..19f4367447 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_RAM.html @@ -0,0 +1,370 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

RAM (Random Access Memory)

+

Overview

+

The memory used in the Pokemon Mini is general purpose static ram. + It is high speed and there is no performance hit for accessing it other + than the instruction processing speed. The biggest problem with the + system is that the ram is small, and also shared with the picture rendering chip. Sections of this memory can be disabled, but up to 1248 bytes of 4k can be re-purposed for video.

+

General purpose memory is considered unused and is safe for all use at any time. Disabling various parts of the picture rendering chip can free up additional memory.

+

RAM Layout

+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ PRC rendering only sprites +
Start End Size Description
$1000 $12FF $0300 (768B) Frame Buffer
$1300 $135F $0060 (96B) Sprite Attributes
$1360 $1FFF $0CA0 (3232B) General Purpose Memory
+


+

+ + + + + + + + + + + + + + + + + + + + + + +
+ PRC blitting directly from frame buffer +
Start End Size Description
$1000 $12FF $0300 (768B) Frame Buffer
$1300 $1FFF $0D00 (3328B) General Purpose Memory
+


+

+ + + + + + + + + + + + + + + + +
+ PRC off (no BG, Sprites or frame buffer) +
Start End Size Description
$1000 $1FFF $1000 (4096B) General Purpose Memory
+ Memory layout schema's +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ PRC rendering sprites with Tile Map 0, 1 or 2 +
Start End Size Description
$1000 $12FF $0300 (768B) Frame Buffer
$1300 $135F $0060 (96B) Sprite Attributes
$1360 $141F $00C0 (192B) Tile Map
$1420 $1FFF $0BE0 (3040B) General Purpose Memory
+


+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ PRC rendering sprites with Tile Map 3 +
Start End Size Description
$1000 $12FF $0300 (768B) Frame Buffer
$1300 $135F $0060 (96B) Sprite Attributes
$1360 $14DF $0180 (384B) Tile Map
$14E0 $1FFF $0B20 (2848B) General Purpose Memory
+
+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Registers.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Registers.html new file mode 100644 index 0000000000..4886234aad --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Registers.html @@ -0,0 +1,989 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Hardware Registers

+

Overview

+

The Pokemon Mini maps $2000 ~ $20FF as hardware control registers. + This area is reserved for hardware related functions such as video, + audio, general purpose timers, hardware I/O and system control.

+

Much of this address space is mapped as Open-Bus, + leading us to beleive that this area is not used for any purpose. + Other areas respond to requests but their purpose is yet undetermined.

+

Registers tend to be controlled on a bit level, so for the sanity + purposes, they will be broken down to this level. At any point they + are shown spanning multiple columns, that indicates that it is a + multi-bit value and should be treated as if they were a number.

+

The bits themselves come in four flavors: Read-only, Write-Only, + Read-Write, and S-R Strobe. Write-Only registers typically return a + zero value, and are generally only used for things such as resetting + timers. S-R Strobes are used for clearing interrupt events, writting a + logical '1' to any bit that is set will result in a bit being cleared, + where as '0' leaves them unchanged. Unused bits always return '0'.

+

Any register not included on this list reads as Open-Bus and will be excluded unless a function has otherwise been determined.

+

Register Mapping

+ + + + + + + + + + + + + + + +
+ Register Map Legend +
Unused Read/Write Read Only Write Only S-R Strobe Read/Write (BIOS, Software only) Unknown (Read/Write) Unknown (Weird) Unknown (Unused)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Registers ($2000 to $20FF) +
Address Register Const Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
$00 System Control 1 SYS_CTRL1 Startup Contrast Cartridge I/O
+ Enable
LCD I/O
+ Enable
$01 System Control 2 SYS_CTRL2 Ram vector Int abort Enable cart interrupts Power on reset Cart type
$02 System Control 3 SYS_CTRL3 Cart power state Cart power required Suspend mode  ??? RTC Timer valid  ???
$08 Second Counter Control SEC_CTRL Reset Enable
$09 Second Counter Low SEC_CNT_LO Counter
$0A Second Counter Middle SEC_CNT_MID Counter
$0B Second Counter High SEC_CNT_HI Counter
$10 Battery Sensor SYS_BATT Low Battery Battery ADC control Battery ADC threshold value
$18 Timer 1 Prescalars TMR1_SCALE Enable Hi Hi Scalar Enable Lo Lo Scalar
$19 Timers Osc. Enable
+ Timer 1 Osc. Select
TMR1_ENA_OSC
+ TMR1_OSC
Enable Osc. 1 Enable Osc. 2 2nd Osc. (Hi) 2nd Osc. (Lo)
$1A Timer 2 Prescalars TMR2_SCALE Enable Hi Hi Scalar Enable Lo Lo Scalar
$1B Timer 2 Osc. Select TMR2_OSC 2nd Osc. (Hi) 2nd Osc. (Lo)
$1C Timer 3 Prescalars TMR3_SCALE Enable Hi Hi Scalar Enable Lo Lo Scalar
$1D Timer 3 Osc. Select TMR3_OSC 2nd Osc. (Hi) 2nd Osc. (Lo)
$20 IRQ Priority 1 IRQ_PRI1 IRQ $03 ~ $04 IRQ $05 ~ $06 IRQ $07 ~ $08 IRQ $09 ~ $0A
$21 IRQ Priority 2 IRQ_PRI2 IRQ $0B ~ $0E IRQ $13 ~ $14 IRQ $15 ~ $1C IRQ ??? ($1D ~ $1F?)
$22 IRQ Priority 3 IRQ_PRI3 IRQ $0F~$10
$23 IRQ Enable 1 IRQ_ENA1 IRQ $03 IRQ $04 IRQ $05 IRQ $06 IRQ $07 IRQ $08 IRQ $09 IRQ $0A
$24 IRQ Enable 2 IRQ_ENA2 IRQ $0B IRQ $0C IRQ $0D IRQ $0E IRQ $13 IRQ $14
$25 IRQ Enable 3 IRQ_ENA3 IRQ $15 IRQ $16 IRQ $17 IRQ $18 IRQ $19 IRQ $1A IRQ $1B IRQ $1C
$26 IRQ Enable 4 IRQ_ENA4 IRQ $0F IRQ $10 IRQ ??? IRQ ??? IRQ $1D IRQ $1E IRQ $1F
$27 IRQ Active 1 IRQ_ACT1 IRQ $03 IRQ $04 IRQ $05 IRQ $06 IRQ $07 IRQ $08 IRQ $09 IRQ $0A
$28 IRQ Active 2 IRQ_ACT2 IRQ $0B IRQ $0C IRQ $0D IRQ $0E IRQ $13 IRQ $14
$29 IRQ Active 3 IRQ_ACT3 IRQ $15 IRQ $16 IRQ $17 IRQ $18 IRQ $19 IRQ $1A IRQ $1B IRQ $1C
$2A IRQ Active 4 IRQ_ACT4 IRQ $0F IRQ $10 IRQ ??? IRQ ??? IRQ $1D IRQ $1E IRQ $1F
$30 Timer 1 Control (Lo) TMR1_CTRL_L 16-bit Mode  ??? Enable Reset  ???
$31 Timer 1 Control (Hi) TMR1_CTRL_H  ??? Enable Reset  ???
$32 Timer 1 Preset (Lo) TMR1_PRE_L Preset
$33 Timer 1 Preset (Hi) TMR1_PRE_H Preset
$34 Timer 1 Pivot (Lo) TMR1_PVT_L Pivot
$35 Timer 1 Pivot (Hi) TMR1_PVT_H Pivot
$36 Timer 1 Count (Lo) TMR1_CNT_L Count
$37 Timer 1 Count (Hi) TMR1_CNT_H Count
$38 Timer 2 Control (Lo) TMR2_CTRL_L 16-bit Mode  ??? Enable Reset  ???
$39 Timer 2 Control (Hi) TMR2_CTRL_H  ??? Enable Reset  ???
$3A Timer 2 Preset (Lo) TMR2_PRE_L Preset
$3B Timer 2 Preset (Hi) TMR2_PRE_H Preset
$3C Timer 2 Pivot (Lo) TMR2_PVT_L Pivot
$3D Timer 2 Pivot (Hi) TMR2_PVT_H Pivot
$3E Timer 2 Count (Lo) TMR2_CNT_L Count
$3F Timer 2 Count (Hi) TMR2_CNT_H Count
$40 256Hz Timer Control TMR256_CTRL Reset Enable
$41 256Hz Timer Counter TMR256_CNT Count
$44 Unknown  ???  ???  ???
$45 Unknown  ???  ???  ???  ???  ???
$46 Unknown  ???
$47 Unknown  ???  ???
$48 Timer 3 Control (Lo) TMR3_CTRL_L 16-bit Mode  ??? Enable Reset  ???
$49 Timer 3 Control (Hi) TMR3_CTRL_H  ??? Enable Reset  ???
$4A Timer 3 Preset (Lo) TMR3_PRE_L Preset
$4B Timer 3 Preset (Hi) TMR3_PRE_H Preset
$4C Timer 3 Pivot (Lo) TMR3_PVT_L Pivot
$4D Timer 3 Pivot (Hi) TMR3_PVT_H Pivot
$4E Timer 3 Count (Lo) TMR3_CNT_L Count
$4F Timer 3 Count (Hi) TMR3_CNT_H Count
$50 Unknown  ???
$51 Unknown  ???  ???
$52 Key-Pad Status (Active 0) KEY_PAD Power Right Left Down Up C B A
$53 Cart Bus CART_BUS CARD_N
$54 Unknown  ???  ???  ???  ???
$55 Unknown  ???  ???
$60 I/O Direction Select IO_DIR  ???  ??? IR Disable Rumble EEPROM Clock EEPROM Data IR Rx IR Tx
$61 I/O Data Register IO_DATA  ???  ??? IR Disable Rumble EEPROM Clock EEPROM Data IR Rx IR Tx
$62 Unknown  ???  ???
$70 Audio Control AUD_CTRL  ??? Mutes audio if not 0!?
$71 Audio Volume AUD_VOL Cart Power (1=Off;0=On) Volume
$80 PRC Stage Control PRC_MODE Map Size Ena Copy Ena Sprites Ena Map Invert Map
$81 PRC Rate Control PRC_RATE Frame counter Rate divider  ???
$82 PRC Map Tile Base Low PRC_MAP_LO Map Tile Base
$83 PRC Map Tile Base Middle PRC_MAP_MID Map Tile Base
$84 PRC Map Tile Base High PRC_MAP_HI Map Tile Base
$85 PRC Map Vertical Scroll PRC_SCROLL_Y Map Scroll Y
$86 PRC Map Horizontal Scroll PRC_SCROLL_X Map Scroll X
$87 PRC Sprite Tile Base Low PRC_SPR_LO Sprite Tile Base
$88 PRC Sprite Tile Base Middle PRC_SPR_MID Sprite Tile Base
$89 PRC Sprite Tile Base Hi PRC_SPR_HI Sprite Tile Base
$8A PRC Counter PRC_CNT Count
$8B Unused
$8C Unused
$8D Unused
$8E Unused
$8F Unused
$F0 Unused
$F1 Unused
$F2 Unused
$F3 Unused
$F4 Unused
$F5 Unused
$F6 Unused
$F7 Unused
$FE LCD Raw Control Byte LCD_CTRL LCD Control I/O
$FF LCD Raw Data Byte LCD_DATA LCD Data I/O
+
+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/PM_Timers.html b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Timers.html new file mode 100644 index 0000000000..15f0a1b596 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/PM_Timers.html @@ -0,0 +1,387 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Timers

+

Timers 1~3 Overview

+

The Pokemon Mini offers 3 general purpose timer units. Each timer is + broken down into several blocks to provide it with variable clock + rates, the ability to be broken down into two independent 8-bit timers, + and each timer can generate two unique interrupts.

+

Timers 1~3 Control

+

Each timer is configured using 6 registers, TIM_SCALE*, TIM_OSCI*, + TIM_CTL*_L, TIM_CTL*_H, TIM_PRE*_L and TIM_PRE*_H. These registers + provide the ability to change the clock rate of both the low and high + 8-bits of the counter, set if there is a borrow chain to the upper + 8-bits (16-bit counter mode) as well as enable and reset the timer (load + counter from the preset). Beginning with the TIM_OSCI*, each timer has + the ability to run from oscillator 1 (System Clock) or oscillator 2 + (32768 Hz RTC Clock). The pre-scale is further decided by selecting one + of 8 different pre-scale values from a table in the TIM_SCALE* + register.

+

Further more, timers must be enabled individually (by setting the + enable flag in TIM_SCALE* TIM_CTL*_L and TIM_CTL*_H) as well as by + group (Upper half of TIM_ENA_OSCI1). TIM_ENA_OSCI1 disables oscillator + 1 or 2 if either respective bit is clear ($10 and $20).

+


+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Timer Prescale (Oscillator 1) +
Prescale Clk Div. Hz
0 CPU / 2 2000000
1 CPU / 8 500000
2 CPU / 32 125000
3 CPU / 64 62500
4 CPU / 128 31250
5 CPU / 256 15625
6 CPU / 1024 3906.25
7 CPU / 4096 976.5625
+


+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Timer Prescale (Oscillator 2) +
Prescale Clk Div. Hz
0 32768 / 1 32768
1 32768 / 2 16384
2 32768 / 4 8192
3 32768 / 8 4096
4 32768 / 16 2048
5 32768 / 32 1024
6 32768 / 64 512
7 32768 / 128 256
+

The timer control registers affect the values of the timers + themselves. Enable must be set for timing, this means there are a total + of 3 bits that must be enabled for any timer to begin counting. + writing a logical 1 to a reset bit in a control register will cause that + respective 8-bit section to copy the respective value out of preset. + All timers count down. When any timer underflows, it's value is copied + from the preset value.

+

Timers 1~3 in 16-bit mode

+

When a timer is operating in 16-bit mode, all the upper-8 bit + settings are unceremoniously ignored. Enables, reset and and everything + no longer control the behavior of the timer. They remain writable, but + they no longer actively function. This includes enables, resets and + pre-scale values. The lower-8 bit configuration is effective over the + full 16-bit value. Additionally, all lower-8 underflow IRQs are + effectively disabled. The timer only presets when the full 16-bit value + underflows.

+

Timers 1~3 IRQ Operation

+

Each timer provides two irqs. These IRQs appear to be fixed + function, which provides the only known difference between Timers 1-2 + and Timer 3.

+

Timers 1-3 have a primary IRQ, this fires anytime the upper 8-bit + of the counter underflows (16- or 8-bit operations) + The secondary IRQ of Timer 1-2 occurs when the lower 8-bit counter + underflows (8-bit mode only) + The secondary IRQ of Timer 3 occurs when the value of the counter + becomes less than or equal-to the value in it's comparator. In 8-bit + mode only the upper 8-bit of the value is used.

+

Sound

+

Timer 3 is also used for sound within the Pokemon Mini.

+ +

256Hz Timer Operation

+

The 256Hz Timer is enabled by writing the LSB of TIM256_CTL to 1. + This activates the timer. It might be a good idea to also reset the + timer by writing the 2nd bit to 1 also.

+

When the timer is active register TIM256_CNT is incremented 256 + times a second. Since it's an 8 bit register counting from 0 to 255 it + overflows exactly 1 time a second.

+

IRQs tied to 256 Hz timer

+

The counter register TIM256_CNT is also used to fire some interrupts at frequencies derived from the 256 Hz clock:

+

When TIM256_CNT overflows the 1 Hz IRQ $0E is fired.
+ When TIM256_CNT bit 8 increments (overflow from bit 7) the 2 Hz IRQ $0D is fired.
+ When TIM256_CNT bit 6 increments (overflow from bit 5) the 8 Hz IRQ $0C is fired.
+ When TIM256_CNT bit 4 increments (overflow from bit 3) the 32 Hz IRQ $0B is fired.

+ +

Second Counter Overview

+

The second timer, while simple, was misunderstood for a good portion + of the initial reverse engineering process. SEC_CNT_* provides a 24 bit + second counter that increments with a one second period (based of a + 32768hz crystal) and can be enabled, disabled or reset to zero using the + SEC_CTL register. Initially, these registers were thought to be a + general purpose counter, but is actually one half of the system's real + time clock.

+

When a commercial game sets the time, it resets the timer and stores the current time and date in the EEPROM. + Calculating the current time consists of simply adding the number of + elapsed seconds to the second counter. Each time the system boots, + commercial games compare the current seconds against a 24 bit value + stored in EEPROM. This was the last known valid time. If the current + second counter is less than the previous know valid, it is assumed that + the clock is valid and a game resumes running normally.

+

Under no circumstances should any homebrew software reset or + pause the second counter, as it will invalidate the time on the system. + This counter continues to tick even when the system is suspended.

+
+ + + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_ImgConv.html b/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_ImgConv.html new file mode 100644 index 0000000000..673f053942 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_ImgConv.html @@ -0,0 +1,496 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Tool: Image Converter

+

Current Version: 1.3 (Released with PokeMini 0.5.5)

+

Convert an image to a data format that can be used on PRC unit

+

Command-Line

+

Input file or conf. file must be declared

+
+Usage: pokemini_imgconv [options]
+  -tiles              Convert to tiles (def)
+  -sprites            Convert to sprites
+  -map                Convert to map
+  -exmap              Convert to map from external tileset
+  -nodither           Disable dither
+  -dither             Enable dither (def)
+  -nocolorkey         No color key
+  -colorkey #FF00FF   Color key (def)
+  -metaw 1            Meta-tile width in tiles
+  -metah 1            Meta-tile height in tiles
+  -nometashl          Don't shift map index for meta (def)
+  -metashl            Shift map index left for meta-tiles
+  -rawf               Output in raw format (def)
+  -asmf               Output in asm format
+  -cf                 Output in C format
+  -autohf             Autodetect correct header format (def)
+  -asmhf              Output header in asm format
+  -chf                Output header in C format
+  -separated          Separate data to each file (def)
+  -joined             Join all data into a single file
+  -i img.png          Image input
+  -c img.txt          Conf. file input
+  -o img.raw          Output file
+  -og img2.raw        Output file (grey)
+  -ots img.raw        Output tileset file
+  -otsg img2.raw      Output tileset file (grey)
+  -om map.raw         Output map indexes file
+  -oh img.inc         Output header file
+  -vo img             Variable name for output
+  -vog imgg           Variable name for grey output
+  -vots imgts         Variable name for tileset output
+  -votsg imgtsg       Variable name for tileset grey output
+  -vom map            Variable name for map indexes
+  -idofs 0            Map index offset
+  -idsize 0           Map index size (0=Unlimited)
+  -maxtiles 65536     Maximum number of tiles
+  -dt 96              Dark threhold, lower lum. will be full dark
-lt 192 Light threhold, higher lum. will be full light
-q Quiet + -v Verbose +
+

Supported input images are:

+
    +
  • .bmp - Bitmap
  • +
  • .ico - Icon
  • +
  • .jpg, .jpeg- Jpeg
  • +
  • .pcx - PCX
  • +
  • .png - Png
  • +
  • .tga - Tanga
  • +
  • .tif, .tiff - TIFF
  • +
  • .gif - Gif
  • +
  • .psd - Photoshop document
  • +
  • .dds - DirectDraw surface
  • +
+

Conf. file

+

Command-line will take priority over the configuration file.

+

Keys in bold have multiple definitions with the same value, hover the mouse over to see the list

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyExample declarationCommand-line equivalentDescription
gfxgfx=tiles-tilesConvert to tiles
 gfx=sprites-spritesConvert to sprites
 gfx=map-mapConvert to map
 gfx=exmap-exmapConvert to map from external tileset
ditherdither=no-noditherDisable dither (def)
 dither=yes-ditherEnable dither
colorkeycolorkey=-1-nocolorkeyNo color key
 colorkey=#FF00FF-colorkey #FF00FFColor key
metawmetaw=1-metaw 1Meta-tile width in tiles
metahmetah=1-metah 1Meta-tile height in tiles
metashlmetashl=no-nometashlDon't shift map index for meta (def)
 metashl=yes-metashlShift map index left for meta-tiles
formatformat=raw-rawfOutput in raw format
 format=asm-asmfOutput in asm format
 format=c-cfOutput in C format
headerformatheaderformat=auto-autohfAutodetect correct header format (def)
 headerformat=asm-asmhfOutput header in asm format
 headerformat=c-chfOutput header in C format
joinedjoined=no-separatedSeparate data to each file (def)
 joined=yes-joinedJoin all data into a single file
imgimg=img.png-i img.pngImage input
outout=img.raw-o img.rawOutput file
outgreyoutgrey=imgg.raw-og imgg.rawOutput file (grey)
outtilesetouttileset=imgts.raw-ots img.rawOutput tileset file
outtilesetgreyouttilesetgrey=imgtsg.raw-otsg imgg.rawOutput tileset file (grey)
outmapoutmap=map.raw-om map.rawOutput map indexes file
outheaderoutheader=img.inc-oh img.incOutput header file
voutvout=img-vo imgVariable name for output
voutgreyvoutgrey=img2-vog img2Variable name for grey output
voutmapvoutmap=map-vom mapVariable name for map indexes
idofsidofs=0-idofs 0Map index offset
idsizeidsize=0-idsize 0Map index size (0=Unlimited)
maxtilesmaxtiles=65536-maxtiles 65536Maximum number of tiles
dtdt=96-dt 96Dark threhold, lower lum. will be full dark
ltlt=192-lt 192Light threhold, higher lum. will be full light
+

Tiles format

+

Image will be converted to PRC Map format (from top-left to bottom-right), meta-tiles dimension will affect how the graphics are stored

+

tileset, colorkey, idofs and idsize are ignored

+

Application: Converting tiles

+

Sprites format

+

Image will be converted to PRC Sprites format (from top-left to bottom-right), meta-tiles dimension is always 2x2 (16x16 pixels) and cannot be changed

+

Color key will define the color to be used for transparency if the image doesn't have alpha channel

+

tileset, metaw, metah, metashl, idofs and idsize are ignored

+

Application: Converting sprites

+

Map format

+

Image will be converted to PRC Tiles format (from top-left to bottom-right) while duplicated tiles aren't saved, meta-tiles dimension will affect how the graphics and map are stored

+

Map indexes will point to the meta-tile (or 1st tile offset if metashl is enabled) of the output

+

tileset and colorkey are ignored

+

Application: Converting an image (or sequence of images)

+

External map format

+

Image will be converted to PRC Tiles format (from top-left to bottom-right), meta-tiles dimension will affect how the graphics and map are stored

+

Tileset will be converted in the same way and will be used for map indexing

+

If certain tile on the image isn't found on the tileset, the tool will raise an error with the pixels position of the image

+

Map indexes will point to the meta-tile (or 1st tile offset if metashl is enabled) of the tileset

+

colorkey is ignored

+

Application: Converting a map with shared tiles

+

 

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_MusicConv.html b/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_MusicConv.html new file mode 100644 index 0000000000..4926fb74c6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_MusicConv.html @@ -0,0 +1,668 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Tool: Music Converter

+

Current Version: 1.3 (Released with PokeMini 0.5.5)

+

Convert music sheets to a data format that can be used with pm_music library

+

Command-Line

+
+Usage: pokemini_musicconv [options]
+  -asmf               Output in asm format (def)
+  -cf                 Output in C format
+  -i music.txt        Music input (required)
+  -o music.asm        Output file
+  -oh music.inc       Output header file
+  -vh music           Set prefix for header definitions
+  -q                  Quiet
+  -v                  Verbose
+  -sv                 Super-verbose
+  -play varname       Play specific BGM/SFX
+
+Play flags:
+  -snddirect          Sound Engine: Direct (def)
+  -sndemulated        Sound Engine: Emulated
+  -piezo              Use piezo filtering (def)
+  -nopiezo            Don't use piezo filtering
+  -towav music.wav    Save to WAV while playing
+
+

Music sheet format

+

Notes

+

// can be used for single-line comments

+

/* and */ are used for multi-line comments

+

{ and } can be used to brace content

+

Numbers can have $ or 0x prefix for hexadecimal notation +

PokeMini Music converter specify "s" and "q" to work as: +

Pic of how Quantize and Sustain affect sound
+ Figure 1 - How Quantize and Sustain affects volume output +
+

Using SHORTQ=yes allow quantize to meet the standard modern MML but sustain must still be specified.

+

Directives

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Directive NameDescription
INCLUDE anothersheet.txtInclude another file
TITLE sheet titleTitle of the music sheet
COMPOSER composer nameComposer name
PROGRAMMER programmer nameProgrammer name
DESCRIPTION description about thisExtra description
OUTFORMAT asm
+ OUTFORMAT c
Set output format
+ Overrides "-asmf" / "-cf" option
VARHEADER header.inc
+ VARHEADER
Set variable name (prefix) for definitions in the header
+ Overrides "-vh"
OUTHEADER header.inc
+ OUTHEADER
Set output header filename, don't write filename to disable header writing
+ Overrides "-oh"
OUTFILE music.asm
+ OUTFILE
Set output filename, don't write filename to disable output wiriting
+ Overrides "-o"
MTIME $00FF
+ MASTERTIME $00FF

Master time (In Timer 2 Preset at Prescale 6, CPU / 1024)
+ TicksPerSec = 3906.25 / (Master Time + 1);

MBPM 114, 128
+ MASTERBPM 114, 128

Master time in beats-per-minute in 4/4 format for certain wait value
+ 1st Parameter = Beats per minute
+ 2nd Parameter = Wait value (between 1 and 255)

VOLLVL mml
+ VOLLEVEL mml
Volume level:
+ mml = 0 to 15
+ system = 0 to 3
OCTREV no
+ OCTAVEREV no
Reverse octave signs in MML
+ no = Decrease octave is < and Increase octave is >
+ yes = Decrease octave is > and Increase octave is <
SHORTQ no
+ SHORTQUANTIZE no
Use shorter quantize/sustain range in MML
+ no = Range of 'q' and 's' commands is 0 to 64
+ yes = Range of 'q' and 's' commands is 0 to 8
BGM varname <pattern-list>Define Background music
PAT_T varname <trk-data>
+ PAT_TRACK varname <trk-data>
+ PATTERN_T varname <trk-data>
+ PATTERN_TRACK varname <trk-data>
Define Pattern (Track syntax)
SFX_T varname <trk-data>
+ SFX_TRACK varname <trk-data>
Define Sound effect (Track syntax)
MACRO_T uppercase-letter <trk-data>
+ MACRO_TRACK uppercase-letter <trk-data>
Define Macro (Track syntax)
PAT varname <mml-data>
+ PATTERN varname <mml-data>
Define Pattern (MML syntax)
SFX varname <mml-data>Define Sound effect (MML syntax)
MACRO uppercase-letter <mml-data>Define Macro (MML syntax)
+

Pattern List <pattern-list>

+

Syntax: varname varname ...

+

varname is a name of an existing pattern

+

Each pattern must be separated by spaces, tabs or new-lines

+

Loop can be marked with a | (pipe) character between spaces, this will cause to loop from the | (pipe) to end infinitely
+ ( e.g. BGM testmusic { start_pattern | looping_pattern } )

+

Track data <trk-data>

+

Data is case-insensitive: A is the same as a

+

-- Insert row --

+

Define a row

+

Syntax:

+
+ ROW {cmd}, {cmd}... {\n}
+
+

Default: w24 v15 %128 q64 s64 xt1 xd

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{cmd}Description
Cn, C-nSet note: C, D, E, F, G, A or B
+ n is octave number between 1 and 9
C#n, C+nSet note: C, D, E, F, G, A or B (sharp)
+ n is octave number between 1 and 9
%nSet pulse-width
+ n is between 0 to 255, ex. 128 = 50% (Square)
vnSet volume
+ n is 0 to 16, ex. 8 = 50% (VOLLVL=mml)
+ n is 0 to 3, ex. 2 = 50% (VOLLVL=system)
wnSet number of ticks to wait
n is between 1 to 255
!n:dWrite to RAM
+ n is relative address between 0 to 255
+ d is data to write (8-bits)
qn

Set quantization (gating)
+ n is 0 to 64, ex. 32 = 50% (SHORTQ=no)
+ n is 0 to 8, ex. 4 = 50% (SHORTQ=yes)

snSet sustain
+ n is 0 to 64, ex. 32 = 50% (SHORTQ=no)
+ n is 0 to 8, ex. 4 = 50% (SHORTQ=yes)
xtnSet effect ticks
+ Lower number provide better quality but will use more data
xdDisable effects
xan:mArpeggio effect (only 1 effect can be used at a time)
+ n is the offset of the 2nd note
+ m is the offset of the 3rd note
+ ticks will affect the speed of arpeggio
xpnPortamento effect (only 1 effect can be used at a time)
+ n is the offset of the note to slide
+ ticks will affect aliasing of the tone
xsnSet random seed number
+ n is a 32-bits seed number
xrnRandom frequencies effect (only 1 effect can be used at a time)
+ n is the range of the note to generate random tones
+ ticks will affect aliasing of the tone
+

-- End Sound --

+

End BGM/SFX playback

+

Syntax:

+
+ END
+

-- Start Loop --

+

Start loop, can go 3 level depth

+

Syntax:

+
+ LOOP
+ MARK
+ DO
+

-- End Loop --

+

End loop, can go 3 level depth

+

Syntax:

+
+

ENDL {loopnum}
+ ENDLOOP {loopnum}
+ REPEAT {loopnum}

+
+

loopnum - number of loops, between 1 and 255

+

-- Use Macro --

+

Use defined macro, macro must be declared before using it

+

Syntax:

+
+ MACRO {uppercase-letter}
+

uppercase-letter - Single uppercase letter

+

MML data <mml-data>

+

Data is case-sensitive: A is different than a

+

Syntax: {mml}{mml}...

+

Default: w24 l4 v15 o5 %128 q64 s64 xt1 xd

+

Spaces and Tabs are ignored between each mml command

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{mml}Description
;End sound
[Start loop
]End loop
+ This will loop 1 time only
]nEnd loop
+ n is number of times the sequence is played, 1 to 256
c[n]Play note: c, d, e, f, g, a or b
+ n is length of note (optional), sufix of . or .. will expand note to 1.5% and 1.75% respectively
c-[n]Play note: c, d, e, f, g, a or b (Flat)
+ n is length of note (optional), sufix of . or .. will expand note to 1.5% and 1.75% respectively
c+[n], c#[n]Play note: c, d, e, f, g, a or b (Sharp)
+ n is length of note (optional)
+ sufix of . or .. will expand note to 1.5% and 1.75% respectively
r[n]Rest / Silence
+ n is length of rest (optional)
+ sufix of . or .. will expand note to 1.5% and 1.75% respectively
%nSet pulse-width
+ n is between 0 to 255, ex. 128 = 50% (Square)
\n
+ /n
Set pulse-width in percentage
+ n is between 0 to 100, ex. 50 = 50% (Square)
vnSet volume
+ n is 0 to 16, ex. 8 = 50% (VOLLVL=mml)
+ n is 0 to 3, ex. 2 = 50% (VOLLVL=system)
wnSet number of ticks to wait on a whole length
+ n is between 1 to 255
!n:dWrite to RAM
+ n is relative address between 0 to 255
+ d is data to write (8-bits)
lnSet length
+ n is between 1 to 64, 1 = whole, 2 = half, 4 = quarter...
A, B, C, D...Insert macro, upper-case alphabetic letter
<Decrease octave
>Increase octave
onSet octave
+ n is between 1 to 9
qn

Set quantization (gating)
+ n is 0 to 64, ex. 32 = 50% (SHORTQ=no)
+ n is 0 to 8, ex. 4 = 50% (SHORTQ=yes)

snSet sustain
+ n is 0 to 64, ex. 32 = 50% (SHORTQ=no)
+ n is 0 to 8, ex. 4 = 50% (SHORTQ=yes)
xtnSet effect ticks
+ Lower number provide better quality but will use more data
xdDisable effects
xan:mArpeggio effect (only 1 effect can be used at a time)
+ n is the offset of the 2nd note
+ m is the offset of the 3rd note
+ ticks will affect the speed of arpeggio
xpnPortamento effect (only 1 effect can be used at a time)
+ n is the offset of the note to slide
+ ticks will affect aliasing of the tone
xsnSet random seed number
+ n is a 32-bits seed number
xrnRandom frequencies effect (only 1 effect can be used at a time)
+ n is the range of the note to generate random tones
+ ticks will affect aliasing of the tone
+

Example

+
TITLE Pokemon-Mini Intro
+COMPOSER Nintendo
+PROGRAMMER JustBurn
+DESCRIPTION Intro played when starting any commercial game
+
+MTIME $00FF
+
+BGM bgm_pmintro { bgm_pmintro_p0 }
+
+PAT bgm_pmintro_pat {    // This version works with any MML player
+ o6 l6
+ v15e v8e v15a v8a r3
+ > v15d v8d v15c+ v8c+
+ < v15a v8a > v15e v8e r1
+ v15 l8 d a > e b e b r4 ;
+}
+
+PAT bgm_pmintro_p0 {     /* Same as bgm_pmintro_pat */
+ o6 l3
+ s32 e a r >d c+ <a >e r1
+ s64 l8 d a >e b e b r4
+}
+
+PAT_T bgm_pmintro_p0t {     /* Same as bgm_pmintro_pat */
+ROW w4, v15, %$80, E-5
+ROW w4, v8
+ROW w4, v15, %$80, A-5
+ROW w4, v8
+ROW w9, v0
+ROW w4, v15, %$80, D-6
+ROW w4, v8
+ROW w4, v15, %$80, C#6
+ROW w4, v8
+ROW w4, v15, %$80, A-5
+ROW w4, v8
+ROW w4, v15, %$80, E-6
+ROW w4, v8
+ROW w24, v0
+ROW w3, v15, %$80, D-6
+ROW w3, v15, %$80, A-6
+ROW w3, v15, %$80, E-7
+ROW w3, v15, %$80, B-7
+ROW w3, v15, %$80, E-7
+ROW w3, v15, %$80, B-7
+ROW w6, v0
+END
+}
+
+

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_colormapper.html b/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_colormapper.html new file mode 100644 index 0000000000..26c3e86089 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/TOOLS_colormapper.html @@ -0,0 +1,300 @@ + + + + + +PokeMini Documentation + + + + + + + + + + +
+ +
+ +

Tool: Color Mapper

+

Current Version: v1.3 (Released with PokeMini 0.5.2)

+

Allow Pokémon-Mini games to have colors (Only work on PokeMini emulator)

+

This was an experiment of how to add colors information into roms while remaining 100% compability, the real system doesn't support colors, only the emulator can display the extra information.

+

color mapper

+

Command-Line

+
+Usage: colormapper [MIN file]
+
+

Note: Only Color Mapper v1.2 and up support loading MIN from command-line

+

Compability

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EmuColor MapperPal8x8 Attr4x4 AttrVRAM xfer
0.4.0Not supportedNoNoNoNo
0.4.1Not supportedNoNoNoNo
0.4.20.1 alphaOldOldNoNo
0.4.30.1 alphaOldOldNoNo
0.4.40.1 alphaOldOldNoNo
0.4.51.0OldYesYesNo
0.5.01.1NewYesYesYes
0.5.11.2NewYesYesYes
0.5.2+1.3NewYesYesYes
+

Note: Alpha version of color mapper is not compatible with stable releases

+

Red = Not supported, Yellow = Outdated, Green = Up to date

+

Information

+

Color information is stored in a .minc file that should hold the same name as the ROM, this file can be inside a ZIP file.

+

Graphics colorizing is processed by the PRC unit and goes directly to the screen (bypassing LCD unit), ROMs that use LCD directly will result in non-visible graphics, therefore color information shouldn't be used on such ROMs

+

Note that color information is not accessible by the ROM program

+

2 formats are supported:

+
    +
  • 8x8 Attributes - Use 1/4 of memory and storage for the color information
  • +
  • 4x4 Attributes - Avoid attribute clash better
  • +
+

"Require rendering video to RAM" improves compability for ROMs that manipulate the framebuffer (RAM $1000 to $12FF)

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/about_links.html b/PVPokeMini/PokeMini/pokemini-code/doc/about_links.html new file mode 100644 index 0000000000..19bedcafbe --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/about_links.html @@ -0,0 +1,218 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

About

+

Thank's to p0p, Dave|X, Onori, goldmomo, asterick, DarkFader, Agilo, MrBlinky, Wa, Lupin and everyone at #pmdev on IRC EFNET!

+

Google Play fee donated by MEGA - Museum of Electronic Games & Art
+ MEGA supports preservation projects of digital art & culture

+

Questions and Bugs reports are welcome!
+

+

Links

+

PokeMini webpage:
+ http://code.google.com/p/pokemini/

+

Pokemon-Mini Hardware:
+ http://wiki.sublab.net/index.php/Pokemon_Mini

+

Pokémon-mini.net:
+ http://www.pokemon-mini.net/

+

MEGA - Museum of Electronic Games & Art:
+ http://m-e-g-a.org/

+

Minimon (other Pokemon-Mini emulator):
+ http://www.sublab.net/projects/minimon/

+

DarkFader Pokemon-Mini webpage:
+ http://darkfader.net/pm/

+

Agilo's Weblog:
+ http://www.agilo.nl/

+

Dox's webpage:
+ http://slanina.pl/?page_id=67
+

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/colormapper12.png b/PVPokeMini/PokeMini/pokemini-code/doc/colormapper12.png new file mode 100644 index 0000000000..f951de9c43 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/doc/colormapper12.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/commandline.html b/PVPokeMini/PokeMini/pokemini-code/doc/commandline.html new file mode 100644 index 0000000000..f9101d27f6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/commandline.html @@ -0,0 +1,406 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Command-Line

+

Usage:
+PokeMini [Options] rom.min

+

Options:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FlagDescription
-freebiosForce FreeBIOS
-bios otherbios.min
Load BIOS
-noeeprom
Discard EEPROM data
-eeprom pokemini.eep
Load/Save EEPROM file
-eepromshare
Share EEPROM to all ROMs
-noeepromshare
Individual EEPROM for each ROM (def)
-nostate
Discard State data (default)
-state pokemini.sta
Load/Save state file
-nortc
No RTC
-statertc
RTC time difference in savestates
-hostrtc
RTC match the Host clock (def)
-nosound
Disable sound
-sound
Same as -sounddirectpwm (def)
-sounddirect
Use timer 3 directly for sound
-soundemulateEmulate sound circuit
-sounddirectpwmSame as direct, can play PWM samples (def)
-nopiezo
Disable piezo speaker filter
-piezo
Enable piezo speaker filter (def)
-scanline
50% Scanline LCD filter
-dotmatrix
LCD dot-matrix filter (def)
-nofilter
No LCD filter
-2shades
LCD Mode: No mixing
-3shades
LCD Mode: Grey emulation
-analog
LCD Mode: Pretend real LCD (def)
-fullbatteryEmulate with a full battery (default)
-lowbatteryEmulate with a weak battery
-palette 0
Select palette for colors (0 to 15)
-rumblelvl 3
Rumble level (0 to 3)
-nojoystick
Disable joystick (def)
-joystick
Enable joystick
-joyid 0
Set joystick ID
-custom1light 0xFFFFFFPalette Custom 1 Light
-custom1dark 0x000000
Palette Custom 1 Dark
-custom2light 0xFFFFFFPalette Custom 2 Light
-custom2dark 0x000000Palette Custom 2 Dark
-synccycles 8Number of cycles per hardware sync.
-multicart 0
Multicart type (0 to 2)
-lcdcontrast 64
LCD contrast boost in percent
-lcdbright 0
LCD brightness offset in percent
+

Only on SDL platform:

+ + + + + + + + + + + + + + + + + + + + + +
-dumpsound sound.wavDump sound into a WAV file
-windowed
Display in window (default)
-fullscreenDisplay in fullscreen
-zoom 4Zoom display: 1 to 6 (def 4)
-bpp 16 Bits-Per-Pixel: 16 or 32 (def 16)
+

Only on Debugger platform:

+ + + + + + + + + + + + + + + + + + + + + +
-autorun 0Autorun, 0=Off, 1=Full, 2=Dbg+Snd, 3=Dbg
-windowed
Display in window (default)
-fullscreenDisplay in fullscreen
-zoom 4Zoom display: 1 to 6 (def 4)
-bpp 16 Bits-Per-Pixel: 16 or 32 (def 16)
+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/cpudie.gif b/PVPokeMini/PokeMini/pokemini-code/doc/cpudie.gif new file mode 100644 index 0000000000..00f7a9df53 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/doc/cpudie.gif differ diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/history.html b/PVPokeMini/PokeMini/pokemini-code/doc/history.html new file mode 100644 index 0000000000..a567c270d6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/history.html @@ -0,0 +1,351 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

History

+

-: 0.60 Changes :-

+
    +
  • Changed version format to only 2 fields to avoid confusion
  • +
  • Fixed RTC month being reported wrong from host
  • +
  • Adjusted graphics, now it display darker shades to match more closely the real system
  • +
  • Added 2 new options: LCD contrast and LCD bright
  • +
  • Changed the way analog LCD mode works, now it's less blurry and can do up to 5 shades without artifacts
  • +
  • SDL port has been upgraded to SDL 2, this brings Haptic support and other improvements
  • +
  • New Keyboard/Joystick option to allow checking inputs
  • +
  • Applying joystick settings now can (re)enable the device
  • +
  • Share EEPROM is now disabled by default
  • +
  • Emulator can be compiled for 64-bit CPU without issues now
  • +
  • Limited sync-cycles to 64 on 'accurancy' platforms
  • +
  • Win32 Only: +
      +
    • Corrected Direct3D issue in some GPUs
    • +
    • Sound write position is now handled correctly
    • +
    +
  • +
  • NDS Only: Added 3-in-1 rumble support
  • +
  • PSP Only: +
      +
    • Analog stick now works
    • +
    • Added FPS display under Platform... (default is off)
    • +
    • Reached 100% emulation by skipping 1 frame, aparently hardware is limited to 60fps max
    • +
    +
  • +
  • Dreamcast Only: +
      +
    • Improved sound latency (thanks BlueCrab).
    • +
    • Added FPS display under Platform... (default is off)
    • +
    +
  • +
  • Debugger Only: +
      +
    • Minor fixes
    • +
    • Trace history is now 10000 instructions instead of 256
    • +
    • Added copy & paste buttons to timing counters
      +
    • +
    +
  • +
+

-: 0.5.4 Changes :-

+
    +
  • Fixed savestates load/save
  • +
  • Minor changes
  • +
  • PSP Only: +
      +
    • Timezone is now handled correctly
    • +
    +
  • +
+

-: 0.5.3 Changes :-

+
    +
  • Fixed command-line parsing which caused problems with lastest GCC
  • +
  • Directory '.' no longer listed
  • +
  • Configurations now save the directory of the last ROM loaded
  • +
  • Improved support on color PRC (now works on framebuffer and LCD)
  • +
  • Dreamcast Only: +
      +
    • Added read/write VMU support
    • +
    • EEPROM write disabled by default
    • +
    +
  • +
  • Debugger Only: +
      +
    • Fixed "Add watchpoint at..." in Memory Viewe
    • +
    • Added symbols list window
    • +
    • Added run trace window
    • +
    • Added "Go to cartridge IRQ" with ability to decode the address
    • +
    • Middle and Right click now set breakpoint/watchpoint
    • +
    • Go to address/IRQ now highlight the location
    • +
    • Added autorun .min after load
    • +
    • Fixed offset of CE jump instructions
    • +
    +
  • +
  • NDS Only: Removed real battery status
  • +
+

-: 0.5.2 Changes :-

+
    +
  • Opening .minc files now opens the linked .min files
  • +
  • More accurant PRC timing and triggering
  • +
  • Minor changes
  • +
  • Debugger Only: +
      +
    • Recent ROMs list
    • +
    • Drag & Drop ROM files support
    • +
    • Added file association to .min and .minc files
    • +
    • Moved PRC Counter from Timers Window to Misc. Window
    • +
    • Added more special registers for printing numbers and
    • +
    • clearing the debug output window
    • +
    • Reorganized the menu
    • +
    +
  • +
  • Win32 Only: +
      +
    • Fixed command-lines and closing code
    • +
    • Recent ROMs list
    • +
    • Drag & Drop ROM files support
    • +
    • Added "Pause when inactive" window option
    • +
    • Added file association to .min and .minc files
      +
    • +
    +
  • +
+

-: 0.5.1 Changes :-

+
    +
  • Relative files are now launched from current directory
  • +
  • Fixed notification message display in 32bpp
  • +
  • Added 50% Scanline LCD filter
  • +
  • New Tools (Available in Debugger package): +
      +
    • PokeMini Image Converte
    • +
    • PokeMini Music Converter
    • +
    +
  • +
  • Debugger only: +
      +
    • F1 shortcut for documentation
    • +
    • Improved external launcher
    • +
    +
  • +
      +
    • IRQ Window "Frames in single-row" initialization fixed
    • +
    • Minimized windows won't be rendered now
    • +
    • Added "Character Set -> From file..." in Memory viewer
    • +
    • Added "Memory data" in Memory viewer with Import, Export, Copy and Fill operations.
    • +
    +
  • Win32 Only: Fixed DirectDraw surface pitch
    +
  • +
+

-: 0.5.0 Changes :-

+
    +
  • Debugger is now complete!
  • +
  • Reordered menu items better
  • +
  • Added Dingux platform (Thanks coccijoe for the port src code)
  • +
  • Fixed issue of sound going out of sync
  • +
  • Separated piezo filtering (now works with any sound engine)
  • +
  • Fixed result of SUB instruction with decimal mode
  • +
  • Fixed PRC rate divider
  • +
  • Corrected some options in configurations file
  • +
  • Multicart support
  • +
  • Made sure shared EEPROM and cfg files are only saved on emulator's executable directory
  • +
  • Added "Sync cycles" option that allow to trade between performance and accurancy, higher value can speed up emulation but may cause problems
  • +
  • Pressing Left/Right while browsing will now page up/down, selecting drive is now C+Left and C+Right
  • +
  • Unofficial colors palette changed (but still backward compatible)
  • +
  • New zooms: 5x (480x320) and 6x (576x384)
  • +
  • Loading ROM from ZIP package is now supported
  • +
  • More palettes and 2 custom ones, they can be edited by pressing A
  • +
  • Win32 platform is now fixed and updated
  • +
  • Joystick can now be re-defined in portable devices
  • +
  • SDL Only: Keyboard can now be re-defined under "Platform..."
  • +
  • Dreamcast Only: PAL/NTSC can now be selected under "Platform..."
  • +
  • NDS Only: Added FPS counter and rumble pak level adjustment
  • +
  • PSP Only: Zoom from 1x to 4x can now be changed under "Platform..."
  • +
+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/ico_minus.gif b/PVPokeMini/PokeMini/pokemini-code/doc/ico_minus.gif new file mode 100644 index 0000000000..f1f859ee78 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/doc/ico_minus.gif differ diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/ico_plus.gif b/PVPokeMini/PokeMini/pokemini-code/doc/ico_plus.gif new file mode 100644 index 0000000000..6fdb732623 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/doc/ico_plus.gif differ diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/index.html b/PVPokeMini/PokeMini/pokemini-code/doc/index.html new file mode 100644 index 0000000000..b189a51837 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/index.html @@ -0,0 +1,283 @@ + + + + + +PokeMini Documentation + + + + + + + + + + + +
+ +
+ +

PokeMini

+

Portable homebrew-emulator for Pokémon-Mini.

+

Current version is 0.60

+

Download lastest version in:
+ http://pokemini.sourceforge.net/

+

For hardware documentation, visit:
+ http://wiki.sublab.net/index.php/Pokemon_Mini
+

+
+

Official platforms:

+
    +
  • Windows (Debugger, SDL 2 and Native)
  • +
  • Linux (Debugger, SDL 2)
  • +
  • Nintendo DS
  • +
  • PlayStation Portable
  • +
  • Dreamcast
  • +
+

Other platforms:

+
    +
  • Windows (SDL 1)
  • +
  • Linux (SDL 1)
  • +
  • GP2x Wiz (SDL and uWiz)
  • +
  • Dingoo (Dingux)
  • +
  • Gamecube (Untested)
  • +
  • Wii (Untested)
  • +
  • Android 2.3.3
  • +
+

Available tools

+ +

License GPLv3 (emulator and tools)

+
PokeMini - Pokémon-Mini Emulator
+Copyright (C) 2015  JustBurn
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+

Available libraries

+

Requires PMAS 0.20+ or better

+
    +
  • pm_init - Common pokémon-mini definitions
  • +
  • pm_music - BGM & SFX playback
  • +
+

Legacy/deplecated

+

Legacy and CStyle libraries are no longer supported and aren't included anymore in the debugger package.

+

License MIT (libraries)

+
Copyright (C) 2015 by JustBurn
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+

+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/keys_info.html b/PVPokeMini/PokeMini/pokemini-code/doc/keys_info.html new file mode 100644 index 0000000000..92a048432b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/doc/keys_info.html @@ -0,0 +1,497 @@ + + + + + +PokeMini Documentation + + + + + + + + + +
+ +
+ +

Information

+

To include real BIOS, place "bios.min" on the emulator's directory.
+When no "bios.min" is present, emulator will use Pokemon-Mini FreeBIOS.

+

Supported multicarts

+

Type 0 - Disabled (Commercial, Prototype)
+ Read only

+

Type 1 - Normal 512KB Flash (AM29LV040B)
+ Read, Erase, Write, Banking and Manufacturer ID

+

Type 2 - Lupin's 512KB Flash (AM29LV040B)
+ Read, Erase, Write, Banking and Manufacturer ID

+

Keys

+

Debugger, SDL & Win32 Platforms

+

Default Keys:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pokémon-MiniPC Keys
D-PAD LeftArrow Left
D-PAD RightArrow Right
D-PAD UpArrow Up
D-PAD DownArrow Down
Key AKeyboard X
Key BKeyboard Z
Key CKeyboard S or C
Power ButtonKeyboard E
Shock DetectorKeyboard A
UI MenuKeyboard Esc
+

F9 will capture the screen and save as "snap_(sequence number).bmp"

+

F10 can toggle between Fullscreen and Windowed.

+

F11 will disable/enable speed throttle

+

TAB can be hold to temporary disable speed throttle

+

NDS - Nintendo DS

+

Default Keys:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pokémon-MiniNDS Keys
D-PAD LeftD-PAD Left
D-PAD RightD-PAD Right
D-PAD UpD-PAD Up
D-PAD DownD-PAD Down
Key AKey A
Key BKey B
Key CShoulder R
Power ButtonStart
Shock DetectorShoulder L
UI MenuSelect
+

PSP - PlayStation Portable

+

Default Keys:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pokémon-MiniPSP Keys
D-PAD LeftD-PAD Left
D-PAD RightD-PAD Right
D-PAD UpD-PAD Up
D-PAD DownD-PAD Down
Key ACircle
Key BCross
Key CShoulder R
Power ButtonStart
Shock DetectorShoulder L
UI MenuSelect
+

WIZ - GP2x Wiz

+

Default Keys:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pokémon-MiniWiz Keys
D-PAD LeftD-PAD Left
D-PAD RightD-PAD Right
D-PAD UpD-PAD Up
D-PAD DownD-PAD Down
Key AKey B
Key BKey X
Key CShoulder R
Power ButtonSelect
Shock DetectorShoulder L
UI MenuMenu
+

DC - Dreamcast

+

Default Keys:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pokémon-MiniDC Keys
D-PAD LeftD-PAD Left or Joystick
D-PAD RightD-PAD Right or Joystick
D-PAD UpD-PAD Up or Joystick
D-PAD DownD-PAD Down or Joystick
Key AKey B
Key BKey A
Key CShoulder R
Power ButtonStart
Shock DetectorShoulder L
UI MenuKey X
+

Dingux - Dingoo in Linux

+

Default Keys:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pokémon-MiniDingoo Keys
D-PAD LeftD-PAD Left
D-PAD RightD-PAD Right
D-PAD UpD-PAD Up
D-PAD DownD-PAD Down
Key AKey A
Key BKey B
Key CShoulder R
Power ButtonStart
Shock DetectorShoulder L
UI MenuSelect
+ + +
+
+ + + diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/logo.png b/PVPokeMini/PokeMini/pokemini-code/doc/logo.png new file mode 100644 index 0000000000..21b929d3b1 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/doc/logo.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/doc/pmmusic_qs.png b/PVPokeMini/PokeMini/pokemini-code/doc/pmmusic_qs.png new file mode 100644 index 0000000000..ee485bfe0d Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/doc/pmmusic_qs.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.asm b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.asm new file mode 100644 index 0000000000..aa7131188d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.asm @@ -0,0 +1,1111 @@ +;-------------------------------------; +; Freeware Pokemon-Mini BIOS Ver 1.3 ; +; (Fruit of reverse enginnering!!) ; +; ; +; V1.3: ; +; Fixed Suspend System ; +; ; +; V1.2: ; +; Added graphics for no cart ; +; ; +; V1.1: ; +; New functions added ; +; Sound on commercial games works ; +; once you change vol. in Options ; +; Fake PM Suspend / Shutdown. ; +; (We need more info of the PM) ; +; ; +; V1.0: ; +; First release of the PD-BIOS. ; +; No sound for commercial games but ; +; since this is for freeware games ; +; that doesn't seems to be much of ; +; a problem. ; +; ; +; Team Pokeme 19-06-2009 ; +;-------------------------------------; + + .dw hreset ; 00 - NMI - System Start-up (Hard reset) + .dw sreset ; 01 - NMI - System Reset (Soft reset) + .dw sreset ; 02 - NMI - System Reset (Soft reset) + .dw int03_2108 ; 03 - IRQ - PRC Copy Complete + .dw int04_210E ; 04 - IRQ - PRC Frame Divider Overflow + .dw int05_2114 ; 05 - IRQ - Timer2 Upper-8 Underflow + .dw int06_211A ; 06 - IRQ - Timer2 Lower-8 Underflow (8-bit only) + .dw int07_2120 ; 07 - IRQ - Timer1 Upper-8 Underflow + .dw int08_2126 ; 08 - IRQ - Timer1 Lower-8 Underflow (8-bit only) + .dw int09_212C ; 09 - IRQ - Timer3 Upper-8 Underflow + .dw int0A_2132 ; 0A - IRQ - Timer3 Pivot + .dw int0B_2138 ; 0B - IRQ - 32Hz (From 256Hz Timer) + .dw int0C_213E ; 0C - IRQ - 8Hz (From 256Hz Timer) + .dw int0D_2144 ; 0D - IRQ - 2Hz (From 256Hz Timer) + .dw int0E_214A ; 0E - IRQ - 1Hz (From 256Hz Timer) + .dw int0F_2150 ; 0F - IRQ - IR Receiver + .dw int10_2156 ; 10 - IRQ - Shock Sensor + .dw sreset ; 11 + .dw sreset ; 12 + .dw reticode ; 13 + .dw int14_219E ; 14 - IRQ - Cartridge IRQ + .dw int15_215C ; 15 - IRQ - Power Key + .dw int16_2162 ; 16 - IRQ - Right Key + .dw int17_2168 ; 17 - IRQ - Left Key + .dw int18_216E ; 18 - IRQ - Down Key + .dw int19_2174 ; 19 - IRQ - Up Key + .dw int1A_217A ; 1A - IRQ - C Key + .dw int1B_2180 ; 1B - IRQ - B Key + .dw int1C_2186 ; 1C - IRQ - A Key + .dw int1D_218C ; 1D - IRQ - Unknown + .dw int1E_2192 ; 1E - IRQ - Unknown + .dw int1F_2198 ; 1F - IRQ - Unknown + .dw 0xFFF1 ; 20 - IRQ - User IRQ Routine at PC 0xFFF1 + .dw Intr21h ; 21 - ROU - Suspend System + .dw reticode ; 22 + .dw reticode ; 23 + .dw Intr24h ; 24 - ROU - Shutdown System + .dw reticode ; 25 + .dw Intr26h ; 26 - ROU - Set default LCD Constrast + .dw Intr27h ; 27 - ROU - Increase or decrease Contrast based of Zero flag... + .dw Intr28h ; 28 - ROU - Apply default LCD Constrast + .dw Intr29h ; 29 - ROU - Get default LCD Contrast + .dw Intr2Ah ; 2A - ROU - Set temporary LCD Constrast + .dw Intr2Bh ; 2B - ROU - Turn LCD On + .dw Intr2Ch ; 2C - ROU - Initialize LCD + .dw Intr2Dh ; 2D - ROU - Turn LCD Off + .dw Intr2Eh ; 2E - ROU - Check if Register 0x01 Bit 7 is set, if not, it set bit 6 and 7 + .dw reticode ; 2F + .dw reticode ; 30 + .dw reticode ; 31 + .dw reticode ; 32 + .dw reticode ; 33 + .dw reticode ; 34 + .dw reticode ; 35 + .dw reticode ; 36 + .dw reticode ; 37 + .dw reticode ; 38 + .dw Intr39h ; 39 - ROU - Disable Cartridge and LCD + .dw Intr3Ah ; 3A - ROU - Enable Cartridge and LCD + .dw reticode ; 3B + .dw reticode ; 3C + .dw Intr3Dh ; 3D - ROU - Test Register 0x53 Bit 1 and invert Zero flag + .dw Intr3Eh ; 3E - ROU - Read structure, write 0xFF, compare values and optionally jump to subroutine... + .dw Intr3Fh ; 3F - ROU - Set PRC Rate + .dw Intr40h ; 40 - ROU - Get PRC Rate + .dw Intr41h ; 41 - ROU - Test Register 0x01 Bit 3 + .dw reticode ; 42 + .dw reticode ; 43 + .dw reticode ; 44 + .dw reticode ; 45 + .dw reticode ; 46 + .dw reticode ; 47 + .dw reticode ; 48 + .dw reticode ; 49 + .dw reticode ; 4A + .dw 0x0000 ; 4B + .dw Intr4Ch ; 4C - ROU - MOV [Y], $02 ; wait B*16 Cycles ; MOV [Y], $00 + + .equ ram_vector $1FFD ; RAM Vector + + .org 0x009A +; Hard reset +hreset: + mov n, $20 ; n to $20xx + xor a, a + mov i, a + mov [n+$08], $02 ; Reset seconds counter + or [n+$08], $01 ; Enable seconds counter + mov [n+$00], $7C ; Preset contrast to 1F, disable Cartridge/LCD + mov [n+$02], $00 ; Signal cold reset, bit 2=0: Invalid time +; Soft reset +sreset: + mov f, $C0 ; Disable interrupts + mov n, $20 ; n to $20xx + xor a, a + mov i, a + mov xi, a + mov yi, a + mov sp, $2000 ; Init stack + mov [n+$80], $00 ; Disable PRC + mov u, $01 + jmp dobanking +dobanking: ; Set U(01) to V + or [n+$00], $03 ; Enable Cartridge and LCD + or [n+$01], $30 ; ??? + or [n+$02], $C0 ; ??? + call init_io + mov x, Graphics + mov [$2082], x + mov [n+$84], b ; PRC Map Tile Base = FreeBIOS Graphics + mov [n+$85], b ; PRC Map Vertical Scroll = $00 + mov [n+$86], b ; PRC Map Horizontal Scroll = $00 + mov [n+$87], b + mov [n+$88], b + mov [n+$89], b ; PRC Sprite Tile Base = $000000 + ; Clear RAM + xor a, a + mov x, $1000 +clearram_1: + mov [x], a + inc x + cmp x, $2000 + jnz clearram_1 + ; Init LCD + call init_lcd ; Init LCD + mov [n+$FE], $AF ; Display On + callw clear_lcd ; Clear directly the LCD + or [n+$80], $0A ; Enable PRC Map (FreeBIOS) + or [n+$81], $01 ; Set bit 0 + ; Detect low power + tst [n+$10], $20 + jnz freebioslogo +checkgame: + call checkcartridge + jnz freebioslogo +startgame: + ; Restore default PRC map + xor a, a + mov [n+$80], $00 ; Disable PRC + mov [n+$81], $07 + mov [n+$82], a + mov [n+$83], a ; PRC Map Tile Base = $000000 + and [n+$01], $EF ; Clear Reg[$01] bit 4 + ; Clear RAM again + mov x, $1000 +clearram_2: + mov [x], a + inc x + cmp x, $2000 + jnz clearram_2 + ; Initialize registers + mov ba, 0 + mov hl, ba + mov x, ba + mov y, ba + mov b, [n+$52] ; B = Power on keys + mov a, $ff ; A = Cart type + and f, $C0 ; Clear all flags except interrupt flag + ; Start the game... + jmp @00002102 + +; Detect cartridge (FreeBIOS) +checkcartridge: + mov a, [$2100] + cmp a, $4D + ret nz + mov a, [$2101] + cmp a, $4E + ret + +; Draw FreeBIOS Logo (FreeBIOS) +freebioslogo: + mov b, 3 +freebioslogo_loop: + push ba + ; Draw logo + mov a, $01 + mov x, $137D + mov b, $03 + call drawsequence + mov x, $1388 + mov b, $04 + call drawsequence + ; Draw low power + tst [n+$10], $20 + jz freebioslogo_haspower + mov x, $1394 + mov a, $08 + mov b, $04 + call drawsequence +freebioslogo_haspower: + ; Draw no-cartridge + call checkcartridge + jz freebioslogo_hascart + mov x, $13A0 + mov a, $0C + mov b, $04 + call drawsequence +freebioslogo_hascart: + ; Delay + call delay_some + ; Clear low power + mov x, $1394 + mov a, $00 + mov b, $04 + call drawfixed + ; Delay + call delay_some + pop ba + jdbnz freebioslogo_loop + ; Clear no-cartridge + mov x, $13A0 + mov a, $00 + mov b, $04 + call drawfixed + ; Delay + call delay_some + jmp checkgame + +; Draw fixed (FreeBIOS) +drawfixed: + mov [x], a + inc x + jdbnz drawfixed + ret + +; Draw sequence (FreeBIOS) +drawsequence: + mov [x], a + inc x + inc a + jdbnz drawsequence + ret + +; Delay some time (FreeBIOS) +delay_some: + mov a, 255 +delay_some_loop1: + mov b, 255 +delay_some_loop2: + jdbnz delay_some_loop2 + dec a + jnz delay_some_loop1 + ret + +; Initialize I/O +init_io: + mov b, $00 + mov [n+$10], $08 ; Battery Sensor + and [n+$19], $CF ; Clear Timer 1 but leave Osci. enablers + mov [n+$20], b + mov [n+$21], $30 ; Cartridge Interrupts Priority 3 + mov [n+$22], $02 ; IR/Shock Priority 2 + mov [n+$23], b + mov [n+$24], $02 ; Enable 1Hz Timer Interrupt + mov [n+$25], b + mov [n+$26], b + mov [n+$40], b ; Disable 256 Hz Timer + mov [n+$44], b ; ??? + mov [n+$50], $FF ; ??? + mov [n+$51], b ; ??? + mov [n+$54], b ; ??? + mov [n+$55], b ; ??? + or [n+$60], $0C ; Set EEPROM pins high + and [n+$61], $FB ; EEPROM Data as input + or [n+$61], $08 ; EEPROM Clock as output + or [n+$61], $04 ; EEPROM Data as output + mov [n+$61], $20 ; IR Disable as output, all others as input + mov [n+$60], $32 ; Disable IR + mov [n+$62], b ; ??? + mov [n+$70], b ; ??? + mov [n+$71], b ; Disable sound + mov [n+$FE], $81 ; Set contrast ... + mov [n+$FE], $1F ; ... to $1F + ret + +; Initialize LCD +init_lcd: + push hl + mov hl, $20FE + mov [hl], $E3 ; ?? + mov [hl], $A4 ; Set All Pixels: Disable + mov [hl], $AD ; ?? + mov [hl], $00 ; Set column $00 + mov [hl], $10 + mov [hl], $EE ; ?? + mov [hl], $40 ; initial display line to 0 + mov [hl], $A2 ; Max Contrast: Disable + mov [hl], $A0 ; Invert Half Horizontal: Disable + mov [hl], $C0 ; From top to bottom + mov [hl], $A6 ; Invert All Pixels: Disable + mov [hl], $2F ; Turn on internal voltage booster & regulator + pop hl + ret + +; Clear LCD directly +clear_lcd: + mov hl, $20FE ; Mem[20FE] + mov [hl], $E3 ; ?? + mov h, $B0 ; Set Page 0 +clear_lcd_B0_to_B8: + mov [hl], h ; Write Page + mov [hl], $00 ; Set Column x0 + mov [hl], $10 ; Set Column 0x + mov b, $60 ; Number of columns per page + inc hl ; Mem[20FF] +clear_lcd_clearcolumns: + mov [n+$FF], $00 + jdbnz clear_lcd_clearcolumns + dec hl ; Mem[20FE] + inc h ; Increase the Page + cmp h, $B8 ; Check if reached the last page + jnz clear_lcd_B0_to_B8 + ret + +int03_2108: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002108 + +int04_210E: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000210E + +int05_2114: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002114 + +int06_211A: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000211A + +int07_2120: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002120 + +int08_2126: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002126 + +int09_212C: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000212C + +int0A_2132: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002132 + +int0B_2138: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002138 + +int0C_213E: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000213E + +int0D_2144: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002144 + +int0E_214A: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000214A + +int0F_2150: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002150 + +int10_2156: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002156 + +int14_219E: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000219E + +int16_2162: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002162 + +int17_2168: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002168 + +int18_216E: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000216E + +int19_2174: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002174 + +int1A_217A: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000217A + +int1B_2180: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002180 + +int1C_2186: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002186 + +int1D_218C: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @0000218C + +int1E_2192: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002192 + +int1F_2198: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 + callz IntrAlt + pop n + pop i + jmp @00002198 + +int15_215C: + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $20 ; Handle IRQs in cartrige + jnz int15_215C_2 + tst [n+$01], $10 ; Test Reg[$01] Bit 4 + jnz sreset ; Reset if set (Shutdown) + tst [n+$71], $04 ; Cart power + jz int15_215C_3 + tst [n+$02], $40 ; ??? + jz int15_215C_3 + ; Cart power is off and something else... + and [n+$71], $FB + or [n+$02], $80 +int15_215C_3: + tst [n+$01], $80 ; RAM Vector defined? + jz int15_215C_4 + tst [n+$02], $20 ; ??? + jnz int15_215C_5 + pop n + pop i + jmp ram_vector +int15_215C_2: ; Handle power button interrupt in cartridge + pop n + pop i + jmp @0000215C +int15_215C_4: ; No RAM vector + or [n+$01], $20 ; Set Handle IRQs in cartridge + tst [n+$02], $20 ; ??? + jnz int15_215C_2 +int15_215C_5: ; Exit power button IRQ + mov [n+$29], $80 ; Mask as complete + pop n + pop i + reti + +; Interrupt alternative (when IRQ not handled by the cartridge) +IntrAlt: + tst [n+$71], $04 ; Cart power + jz IntrAlt_haspower + tst [n+$02], $40 ; ??? + jz IntrAlt_haspower + ; Cart power is off and something else... + and [n+$71], $FB + or [n+$02], $80 +IntrAlt_haspower: + tst [n+$01], $80 ; RAM Vector defined? + jz IntrAlt_noramvector + add sp, 3 ; Unstack interrupt return address + pop n + pop i + jmp ram_vector +IntrAlt_noramvector: + or [n+$01], $20 ; Set Handle IRQs in cartridge + ret + +reticode: + reti + +; Suspend/Shutdown pokemon-mini +SuspendShutdown: + ; This is not how the real BIOS does... but oh well. + and [n+$80], $F7 ; Disable PRC + mov [n+$FE], $AE ; Display Off + mov [n+$FE], $AC ; ??? + mov [n+$FE], $28 ; Turn off voltage booster / op-amp buffer + mov [n+$FE], $A5 ; Set All Pixels: Enable + and [n+$02], $E3 ; Unknown + and [n+$81], $FE ; ??? + or [n+$02], $01 ; ??? + or [n+$24], $02 ; Cartridge Eject IRQ + or [n+$21], $30 ; Enable Cartridge IRQ + and [n+$01], $DF ; Disable cart interrupts + and [n+$02], $E3 ; ??? + push f + mov f, $80 ; Enable interrupt (!?) + halt ; Halt the CPU + pop f + or [n+$02], $10 ; ??? + or [n+$81], $01 ; ??? + callw init_lcd ; Init LCD + mov [n+$FE], $AF ; Display On + and [n+$02], $DF ; Enable cart interrupts + or [n+$00], $03 ; Enable Cartridge and LCD + ret + +; cint $21 - ROU - Suspend System +Intr21h: + ; Suspend System + push i + push n + mov f, $C0 + mov i, $00 + mov n, $20 + ; Back up registers + mov b, [n+$80] + mov a, [n+$21] + and a, $0C + push ba + mov b, [n+$23] + mov a, [n+$24] + push ba + mov b, [n+$25] + mov a, [n+$26] + push ba + ; Setup registers + mov [n+$23], $00 + mov [n+$24], $00 + mov [n+$25], $80 ; Only enable power key interrupt + mov [n+$26], $00 + or [n+$21], $0C + mov [n+$29], $80 + mov [n+$80], $00 + ; Something cause the PM to suspend + call SuspendShutdown + ; Restore registers + pop ba + mov [n+$25], b + mov [n+$26], a + pop ba + mov [n+$23], b + mov [n+$24], a + pop ba + mov [n+$80], b + and a, $F3 + mov [n+$21], a + pop n + pop i + reti + +; cint $24 - ROU - Shutdown System +Intr24h: + ; Shutdown System + mov f, $C0 + mov sp, $2000 + mov i, $00 + mov n, $20 + callw init_io + mov [n+$23], $00 + mov [n+$24], $00 + mov [n+$25], $80 ; Only enable power key interrupt + mov [n+$26], $00 + mov [n+$29], $80 + mov [n+$80], $00 + mov [n+$21], $0C + callw SuspendShutdown + jmp sreset + +; cint $26 - ROU - Set default LCD Constrast +Intr26h: + ; Set default LCD Constrast (A = Contrast level 0x00 to 0x3F) + pop f +Intr26h_0: + push i + push hl + mov i, $00 + mov hl, $2000 + shl a + shl a + and [hl], $03 + or [hl], a + pop hl + pop i + jmp Intr28h_0 + +; cint $27 - ROU - Increase or decrease Contrast based of Zero flag... +Intr27h: + ; Increase or decrease Contrast based of Zero flag (0 = Increase, 1 = Decrease) + ; Return A = 0x00 if succeed, 0xFF if not. + call Intr29h_0 + pop f + push f ; We need to get the flags that were stored in stack but still remain stack intact + jz Intr27h_Inc +Intr27h_Dec: + cmp a, $3F ; Check if is $3F ... + jz Intr27h_Err ; ... return error if so + inc a + jmp Intr27h_SetOk +Intr27h_Inc: + or a, a ; Check if is $00 ... + jz Intr27h_Err ; ... return error if so + dec a + jmp Intr27h_SetOk +Intr27h_Err: + mov a, $FF + reti +Intr27h_SetOk: + call Intr26h_0 + xor a, a + reti + +; cint $28 - ROU - Apply default LCD Constrast +Intr28h: + ; Apply default LCD Constrast + pop f +Intr28h_0: + call Intr29h_0 + jmp Intr2Ah_0 + +; cint $29 - ROU - Get default LCD Contrast +Intr29h: + ; Get default LCD Contrast (return A) + pop f +Intr29h_0: + push i + push n + mov i, $00 + mov n, $20 + mov a, [n+$00] + shr a + shr a + pop n + pop i + ret + +; cint $2A - ROU - Set temporary LCD Constrast +Intr2Ah: + ; Set temporary LCD Constrast (A = Contrast level 0x00 to 0x3F) + pop f ; We need to return the flags (beats me why...) +Intr2Ah_0: + push i + push n + mov i, $00 + mov n, $20 + mov b, a + tst [n+$80], $08 ; Test if PRC Copy is enabled + push f + and [n+$80], $F7 ; Disable PRC Copy (...for safety) + mov [n+$FE], $81 + mov [n+$FE], b + pop f + jz Intr2Ah_1 + or [n+$80], $08 ; Restore PRC Copy if was set before +Intr2Ah_1: + pop n + pop i + ret + +; cint $2B - ROU - Turn LCD On +Intr2Bh: + ; Turn LCD On + push i + push n + mov i, $00 + mov n, $20 + callw init_lcd ; Init LCD + mov [n+$FE], $AF ; Display On + or [n+$80], $04 ; Enable PRC Copy + or [n+$81], $01 ; Set bit 0 + pop n + pop i + reti + +; cint $2C - ROU - Initialize LCD +Intr2Ch: + ; Initialize LCD + push i + push n + mov i, $00 + mov n, $20 + callw init_lcd ; Init LCD + pop n + pop i + reti + +; cint $2D - ROU - Turn LCD Off +Intr2Dh: + ; Turn LCD Off + push i + push n + mov i, $00 + mov n, $20 + and [n+$80], $F7 ; Disable PRC Copy + mov [n+$FE], $AE ; Display Off + mov [n+$FE], $AC ; ??? + mov [n+$FE], $28 ; Turn off voltage booster / op-amp buffer + mov [n+$FE], $A5 ; Set All Pixels: Enable + and [n+$81], $FE ; Clear bit 0 + pop n + pop i + reti + +; cint $2E - ROU - Check if Register 0x01 Bit 7 is set, if not then set bit 6 and 7 +Intr2Eh: + ; Check if Register 0x01 Bit 7 is set, if not, it set bit 6 and 7 + push i + push n + mov i, $00 + mov n, $20 + mov f, $C0 + tst [n+$01], $80 + jnz Intr2Eh_0 + or [n+$01], $80 + or [n+$01], $40 + and [n+$01], $DF +Intr2Eh_0: + pop n + pop i + reti + +; cint $39 - ROU - Disable Cartridge and LCD +Intr39h: + ; Disable Cartridge and LCD + push i + push n + mov i, $00 + mov n, $20 + and [n+$00], $FC + pop n + pop i + reti + +; cint $3A - ROU - Enable Cartridge and LCD +Intr3Ah: + ; Recover from IRQ $39 (Enable Cartridge and LCD) + push i + push n + mov i, $00 + mov n, $20 + or [n+$00], $03 + pop n + pop i + reti + +; cint $3D - ROU - Test Register 0x53 Bit 1 and invert Zero flag +Intr3Dh: + ; Test Register 0x53 Bit 1 and invert Zero flag + pop f + push i + push n + mov i, $00 + mov n, $20 + tst [n+$53], $02 + xor f, $01 + pop n + pop i + ret + +; cint $3E - ROU - Read structure, write 0xFF, compare values and optionally jump to subroutine... +Intr3Eh: + ; Read structure, write 0xFF, compare values and optionally jump to subroutine + ; X point to a structure in memory: + ; structure { + ; byte type ; 0x01 = Call subroutine, 0x00 = Don't call subroutine + ; triple write_0xFF_addr ; Address that 0xFF will be written + ; triple compare_addr ; Address to read for compare + ; byte compare_value ; Value that must match the compare + ; triple subroutine ; Use byte POP to receive flag of the compare + ; } + ; if type is 0x00, register A return 0x01 if compare is equal + push i + push n + mov i, $00 + mov n, $20 + pushx + push x + push y + push hl + push b ; Push all registers except "A" + mov f, $C0 + mov a, [x] + tst a, $01 ; Test Bit 0 of type in the structure + mov a, f + jz Intr3Eh_0 ; Jump if type 0x00 + + add x, $000A + mov h, [x] + dec x + mov l, [x] + dec x + push hl + mov b, [x] + dec x + jmp Intr3Eh_1 + +Intr3Eh_0: + add x, $0007 +Intr3Eh_1: + + push ba + mov b, [x] ; B = compare_value + dec x + mov a, [x] + dec x + mov h, [x] + dec x + mov l, [x] + dec x + mov yi, a + mov y, hl ; YI & Y = compare_address + mov a, [x] + dec x + mov h, [x] + dec x + mov l, [x] + mov xi, a + mov x, hl ; XI & X = write_0xFF_addr + + or [n+$02], $80 ; No clue why... but... maybe there's a reason... + mov [x], $FF ; ?? + or [n+$02], $80 + mov a, [y] + or [n+$02], $80 + cmp a, b + pop ba ; Restore top push, it holds the low addr byte of the subroutine... \ + push f ; (Backup compare result) | + mov f, a ; ...and bit 0 test of the type in structure... <-------------------' + jz Intr3Eh_2 ; Skip if type is 0x00 + pop f ; Restore the compare result + mov l, b ; L = Low Byte Address + pop ba + mov h, a ; H = High Byte Address + mov a, b ; A = Bank of Address + push f ; Push the compare result into stack + call Intr3Eh_3 +Intr3Eh_2: + pop ba + and a, $01 ; Only return the lowest bit as the result + pop hl + pop y + pop x + popx ; Restore all registers except "A" + pop n + pop i + reti + +Intr3Eh_3: + mov u, a + jmp hl ; jump to the Subroutine... use POP to receive compare result + +; cint $3F - ROU - Set PRC Rate +Intr3Fh: + ; Set PRC Rate (A = 0 to 7) + push i + push hl + mov i, $00 + mov hl, $2081 + and [hl], $F1 + and a, $07 + shl a + or [hl], a + pop hl + pop i + reti + +; cint $40 - ROU - Get PRC Rate +Intr40h: + ; Get PRC Rate (return A) + push i + push n + mov i, $00 + mov n, $20 + mov a, [n+$81] + shr a + and a, $07 + pop n + pop i + reti + +; cint $41 - ROU - Test Register 0x01 Bit 3 +Intr41h: + ; Test Register 0x01 Bit 3 + pop f + push i + push n + mov i, $00 + mov n, $20 + tst [n+$01], $08 + pop n + pop i + ret + +; cint $4C - ROU - MOV [Y], $02 ; wait B*16 Cycles ; MOV [Y], $00 +Intr4Ch: + ; MOV [Y], $02 ; wait B*16 Cycles ; MOV [Y], $00 + mov [y], $02 +Intr4Ch_0: + jdbnz Intr4Ch_0 + mov [y], $00 + reti + + .align 8 +Graphics: + .incbin gfx.bin + + .orgfill 0x1000 - 64 + + ; 0123456789ABCDEF + .db " Freeware " + .db "PokemonMini BIOS" + .db " Version 1.3 " + .db " by Team Pokeme " diff --git a/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.c b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.c new file mode 100644 index 0000000000..58f06edda0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.c @@ -0,0 +1,259 @@ +const unsigned char FreeBIOS[] = +{ + 0x9A,0x00,0xAB,0x00,0xAB,0x00,0x2F,0x02,0x41,0x02,0x53,0x02,0x65,0x02,0x77,0x02, + 0x89,0x02,0x9B,0x02,0xAD,0x02,0xBF,0x02,0xD1,0x02,0xE3,0x02,0xF5,0x02,0x07,0x03, + 0x19,0x03,0xAB,0x00,0xAB,0x00,0x60,0x04,0x2B,0x03,0xF1,0x03,0x3D,0x03,0x4F,0x03, + 0x61,0x03,0x73,0x03,0x85,0x03,0x97,0x03,0xA9,0x03,0xBB,0x03,0xCD,0x03,0xDF,0x03, + 0xF1,0xFF,0x9E,0x04,0x60,0x04,0x60,0x04,0xE4,0x04,0x60,0x04,0x0D,0x05,0x24,0x05, + 0x45,0x05,0x4C,0x05,0x5D,0x05,0x7C,0x05,0x92,0x05,0x9F,0x05,0xBB,0x05,0x60,0x04, + 0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04, + 0x60,0x04,0xD6,0x05,0xE3,0x05,0x60,0x04,0x60,0x04,0xF0,0x05,0x00,0x06,0x66,0x06, + 0x7A,0x06,0x8A,0x06,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04,0x60,0x04, + 0x60,0x04,0x60,0x04,0x60,0x04,0x00,0x00,0x98,0x06,0xB4,0x20,0x38,0xCE,0xCD,0xDD, + 0x08,0x02,0xD9,0x08,0x01,0xDD,0x00,0x7C,0xDD,0x02,0x00,0x9F,0xC0,0xB4,0x20,0x38, + 0xCE,0xCD,0xCE,0xCE,0xCE,0xCF,0xCF,0x6E,0x00,0x20,0xDD,0x80,0x00,0xCE,0xC4,0x01, + 0xF3,0x01,0x00,0xD9,0x00,0x03,0xD9,0x01,0x30,0xD9,0x02,0xC0,0xF2,0xE1,0x00,0xC6, + 0xA0,0x06,0xBE,0x82,0x20,0x79,0x84,0x79,0x85,0x79,0x86,0x79,0x87,0x79,0x88,0x79, + 0x89,0x38,0xC6,0x00,0x10,0x60,0x92,0xD6,0x00,0x20,0xEF,0xF9,0xFF,0xF2,0x05,0x01, + 0xDD,0xFE,0xAF,0xF2,0x1D,0x01,0xD9,0x80,0x0A,0xD9,0x81,0x01,0xDC,0x10,0x20,0xEF, + 0x40,0x00,0xF2,0x2F,0x00,0xEF,0x3A,0x00,0x38,0xDD,0x80,0x00,0xDD,0x81,0x07,0x78, + 0x82,0x78,0x83,0xD8,0x01,0xEF,0xC6,0x00,0x10,0x60,0x92,0xD6,0x00,0x20,0xEF,0xF9, + 0xFF,0xC4,0x00,0x00,0xCF,0xE4,0xCF,0xE8,0xCF,0xEC,0x4C,0x52,0xB0,0xFF,0x9C,0xC0, + 0xF3,0xD0,0x1F,0xCE,0xD0,0x00,0x21,0x32,0x4D,0xF8,0xCE,0xD0,0x01,0x21,0x32,0x4E, + 0xF8,0xB1,0x03,0xA0,0xB0,0x01,0xC6,0x7D,0x13,0xB1,0x03,0xF2,0x51,0x00,0xC6,0x88, + 0x13,0xB1,0x04,0xF2,0x49,0x00,0xDC,0x10,0x20,0xEE,0x0B,0x00,0xC6,0x94,0x13,0xB0, + 0x08,0xB1,0x04,0xF2,0x39,0x00,0xF2,0xCB,0xFF,0xEE,0x0B,0x00,0xC6,0xA0,0x13,0xB0, + 0x0C,0xB1,0x04,0xF2,0x29,0x00,0xF2,0x2C,0x00,0xC6,0x94,0x13,0xB0,0x00,0xB1,0x04, + 0xF2,0x17,0x00,0xF2,0x1F,0x00,0xA8,0xF5,0xBB,0xC6,0xA0,0x13,0xB0,0x00,0xB1,0x04, + 0xF2,0x07,0x00,0xF2,0x0F,0x00,0xF3,0x6A,0xFF,0x60,0x92,0xF5,0xFD,0xF8,0x60,0x92, + 0x80,0xF5,0xFC,0xF8,0xB0,0xFF,0xB1,0xFF,0xF5,0xFF,0x88,0xEF,0xF9,0xFF,0xF8,0xB1, + 0x00,0xDD,0x10,0x08,0xD8,0x19,0xCF,0x79,0x20,0xDD,0x21,0x30,0xDD,0x22,0x02,0x79, + 0x23,0xDD,0x24,0x02,0x79,0x25,0x79,0x26,0x79,0x40,0x79,0x44,0xDD,0x50,0xFF,0x79, + 0x51,0x79,0x54,0x79,0x55,0xD9,0x60,0x0C,0xD8,0x61,0xFB,0xD9,0x61,0x08,0xD9,0x61, + 0x04,0xDD,0x61,0x20,0xDD,0x60,0x32,0x79,0x62,0x79,0x70,0x79,0x71,0xDD,0xFE,0x81, + 0xDD,0xFE,0x1F,0xF8,0xA1,0xC5,0xFE,0x20,0xB5,0xE3,0xB5,0xA4,0xB5,0xAD,0xB5,0x00, + 0xB5,0x10,0xB5,0xEE,0xB5,0x40,0xB5,0xA2,0xB5,0xA0,0xB5,0xC0,0xB5,0xA6,0xB5,0x2F, + 0xA9,0xF8,0xC5,0xFE,0x20,0xB5,0xE3,0xB3,0xB0,0x6B,0xB5,0x00,0xB5,0x10,0xB1,0x60, + 0x91,0xDD,0xFF,0x00,0xF5,0xFC,0x99,0x83,0xCE,0xBE,0xB8,0xEF,0xEC,0xFF,0xF8,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x00,0x02,0xAC,0xAD,0xF3,0xC8, + 0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xEE,0x01,0xAC,0xAD, + 0xF3,0xBC,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xDC,0x01, + 0xAC,0xAD,0xF3,0xB0,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA, + 0xCA,0x01,0xAC,0xAD,0xF3,0xA4,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01, + 0x20,0xEA,0xB8,0x01,0xAC,0xAD,0xF3,0x98,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20, + 0xDC,0x01,0x20,0xEA,0xA6,0x01,0xAC,0xAD,0xF3,0x8C,0x1E,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x20,0xEA,0x94,0x01,0xAC,0xAD,0xF3,0x80,0x1E,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x82,0x01,0xAC,0xAD,0xF3,0x74,0x1E,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x70,0x01,0xAC,0xAD,0xF3,0x68, + 0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x5E,0x01,0xAC,0xAD, + 0xF3,0x5C,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x4C,0x01, + 0xAC,0xAD,0xF3,0x50,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA, + 0x3A,0x01,0xAC,0xAD,0xF3,0x44,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01, + 0x20,0xEA,0x28,0x01,0xAC,0xAD,0xF3,0x38,0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20, + 0xDC,0x01,0x20,0xEA,0x16,0x01,0xAC,0xAD,0xF3,0x2C,0x1E,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x20,0xEA,0x04,0x01,0xAC,0xAD,0xF3,0x62,0x1E,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xF2,0x00,0xAC,0xAD,0xF3,0x14,0x1E,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xE0,0x00,0xAC,0xAD,0xF3,0x08, + 0x1E,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xCE,0x00,0xAC,0xAD, + 0xF3,0xFC,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0xBC,0x00, + 0xAC,0xAD,0xF3,0xF0,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA, + 0xAA,0x00,0xAC,0xAD,0xF3,0xE4,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01, + 0x20,0xEA,0x98,0x00,0xAC,0xAD,0xF3,0xD8,0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20, + 0xDC,0x01,0x20,0xEA,0x86,0x00,0xAC,0xAD,0xF3,0xCC,0x1D,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x20,0xEA,0x74,0x00,0xAC,0xAD,0xF3,0xC0,0x1D,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x62,0x00,0xAC,0xAD,0xF3,0xB4,0x1D,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEA,0x50,0x00,0xAC,0xAD,0xF3,0xA8, + 0x1D,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x01,0x20,0xEF,0x2A,0x00,0xDC,0x01, + 0x10,0xEF,0xA8,0xFC,0xDC,0x71,0x04,0xEE,0x0D,0x00,0xDC,0x02,0x40,0xEE,0x07,0x00, + 0xD8,0x71,0xFB,0xD9,0x02,0x80,0xDC,0x01,0x80,0xEE,0x11,0x00,0xDC,0x02,0x20,0xEF, + 0x14,0x00,0xAC,0xAD,0xF3,0xD7,0x1B,0xAC,0xAD,0xF3,0x31,0x1D,0xD9,0x01,0x20,0xDC, + 0x02,0x20,0xEF,0xF3,0xFF,0xDD,0x29,0x80,0xAC,0xAD,0xF9,0xDC,0x71,0x04,0xEE,0x0D, + 0x00,0xDC,0x02,0x40,0xEE,0x07,0x00,0xD8,0x71,0xFB,0xD9,0x02,0x80,0xDC,0x01,0x80, + 0xEE,0x0A,0x00,0xCF,0x68,0x03,0x00,0xAC,0xAD,0xF3,0xA2,0x1B,0xD9,0x01,0x20,0xF8, + 0xF9,0xD8,0x80,0xF7,0xDD,0xFE,0xAE,0xDD,0xFE,0xAC,0xDD,0xFE,0x28,0xDD,0xFE,0xA5, + 0xD8,0x02,0xE3,0xD8,0x81,0xFE,0xD9,0x02,0x01,0xD9,0x24,0x02,0xD9,0x21,0x30,0xD8, + 0x01,0xDF,0xD8,0x02,0xE3,0xA7,0x9F,0x80,0xCE,0xAE,0xAF,0xD9,0x02,0x10,0xD9,0x81, + 0x01,0xF2,0x61,0xFD,0xDD,0xFE,0xAF,0xD8,0x02,0xDF,0xD9,0x00,0x03,0xF8,0xA5,0xA4, + 0x9F,0xC0,0xCE,0xC5,0x00,0xB4,0x20,0x4C,0x80,0x44,0x21,0x22,0x0C,0xA0,0x4C,0x23, + 0x44,0x24,0xA0,0x4C,0x25,0x44,0x26,0xA0,0xDD,0x23,0x00,0xDD,0x24,0x00,0xDD,0x25, + 0x80,0xDD,0x26,0x00,0xD9,0x21,0x0C,0xDD,0x29,0x80,0xDD,0x80,0x00,0xF2,0x92,0xFF, + 0xA8,0x79,0x25,0x78,0x26,0xA8,0x79,0x23,0x78,0x24,0xA8,0x79,0x80,0x22,0xF3,0x78, + 0x21,0xAC,0xAD,0xF9,0x9F,0xC0,0xCF,0x6E,0x00,0x20,0xCE,0xC5,0x00,0xB4,0x20,0xF2, + 0xBE,0xFC,0xDD,0x23,0x00,0xDD,0x24,0x00,0xDD,0x25,0x80,0xDD,0x26,0x00,0xDD,0x29, + 0x80,0xDD,0x80,0x00,0xDD,0x21,0x0C,0xF2,0x58,0xFF,0xF3,0x9F,0xFB,0xAF,0xA5,0xA1, + 0xCE,0xC5,0x00,0xC5,0x00,0x20,0xCE,0x84,0xCE,0x84,0xCE,0x25,0x03,0xCE,0x2C,0xA9, + 0xAD,0xF3,0x23,0x00,0xF2,0x27,0x00,0xAF,0xA7,0xEE,0x0A,0x00,0x32,0x3F,0xEE,0x0D, + 0x00,0x80,0xF3,0x0C,0x00,0x28,0xEE,0x05,0x00,0x88,0xF3,0x04,0x00,0xB0,0xFF,0xF9, + 0xF2,0xCC,0xFF,0x38,0xF9,0xAF,0xF2,0x05,0x00,0xF3,0x13,0x00,0xAF,0xA5,0xA4,0xCE, + 0xC5,0x00,0xB4,0x20,0x44,0x00,0xCE,0x8C,0xCE,0x8C,0xAC,0xAD,0xF8,0xAF,0xA5,0xA4, + 0xCE,0xC5,0x00,0xB4,0x20,0x48,0xDC,0x80,0x08,0xA7,0xD8,0x80,0xF7,0xDD,0xFE,0x81, + 0x79,0xFE,0xAF,0xEE,0x04,0x00,0xD9,0x80,0x08,0xAC,0xAD,0xF8,0xA5,0xA4,0xCE,0xC5, + 0x00,0xB4,0x20,0xF2,0x6F,0xFC,0xDD,0xFE,0xAF,0xD9,0x80,0x04,0xD9,0x81,0x01,0xAC, + 0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xF2,0x59,0xFC,0xAC,0xAD,0xF9,0xA5, + 0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xD8,0x80,0xF7,0xDD,0xFE,0xAE,0xDD,0xFE,0xAC,0xDD, + 0xFE,0x28,0xDD,0xFE,0xA5,0xD8,0x81,0xFE,0xAC,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0x9F,0xC0,0xDC,0x01,0x80,0xEF,0x0A,0x00,0xD9,0x01,0x80,0xD9,0x01,0x40, + 0xD8,0x01,0xDF,0xAC,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xD8,0x00,0xFC, + 0xAC,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xD9,0x00,0x03,0xAC,0xAD,0xF9, + 0xAF,0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xDC,0x53,0x02,0x9E,0x01,0xAC,0xAD,0xF8, + 0xA5,0xA4,0xCE,0xC5,0x00,0xB4,0x20,0xA6,0xA2,0xA3,0xA1,0xCF,0xB1,0x9F,0xC0,0x46, + 0x96,0x01,0xCE,0xC1,0xEE,0x0E,0x00,0xC2,0x0A,0x00,0x5E,0x9A,0x56,0x9A,0xA1,0x4E, + 0x9A,0xF3,0x04,0x00,0xC2,0x07,0x00,0xA0,0x4E,0x9A,0x46,0x9A,0x5E,0x9A,0x56,0x9A, + 0xCE,0xCF,0xCF,0xED,0x46,0x9A,0x5E,0x9A,0x56,0xCE,0xCE,0xCF,0xE9,0xD9,0x02,0x80, + 0xB6,0xFF,0xD9,0x02,0x80,0x47,0xD9,0x02,0x80,0x31,0xA8,0xCE,0xC3,0xEE,0x0A,0x00, + 0xAF,0x51,0xA8,0x58,0x41,0xA7,0xF2,0x0B,0x00,0xA8,0x22,0x01,0xA9,0xAB,0xAA,0xAE, + 0xAC,0xAD,0xF9,0xCE,0xCC,0xF4,0xA5,0xA1,0xCE,0xC5,0x00,0xC5,0x81,0x20,0xCE,0x25, + 0xF1,0x22,0x07,0xCE,0x84,0xCE,0x2C,0xA9,0xAD,0xF9,0xA5,0xA4,0xCE,0xC5,0x00,0xB4, + 0x20,0x44,0x81,0xCE,0x8C,0x22,0x07,0xAC,0xAD,0xF9,0xAF,0xA5,0xA4,0xCE,0xC5,0x00, + 0xB4,0x20,0xDC,0x01,0x08,0xAC,0xAD,0xF8,0xB7,0x02,0xF5,0xFF,0xB7,0x00,0xF9,0xFF, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x04,0x82,0xE1,0xE1,0x31,0x31, + 0x39,0x39,0x39,0x39,0x39,0x39,0x31,0x31,0xE1,0xE1,0x82,0x06,0xFA,0x04,0xF8,0x00, + 0xFE,0x82,0xEA,0x3A,0xFE,0x82,0xEA,0x96,0xFC,0xC7,0xAA,0xBB,0xFF,0xC7,0xAA,0xBA, + 0xFE,0x82,0xAA,0xD6,0xFE,0x8A,0xFE,0xC6,0xBB,0xC7,0xFD,0xB6,0xAB,0xAB,0xDA,0x7E, + 0x7C,0x7C,0x40,0x40,0x00,0x38,0x7C,0x44,0x7C,0x38,0x00,0x3C,0x7C,0x20,0x7C,0x3C, + 0x00,0x00,0x7C,0x7C,0x7C,0x74,0x6C,0x54,0x64,0x44,0x44,0x44,0x44,0x6C,0x38,0x00, + 0x7C,0x7C,0x08,0x10,0x7C,0x7C,0x00,0x38,0x7C,0x44,0x7C,0x38,0x00,0x00,0x00,0x38, + 0x44,0x44,0x00,0x78,0x14,0x14,0x78,0x00,0x7C,0x14,0x14,0x68,0x00,0x04,0x7C,0x04, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x20,0x20,0x20,0x20,0x46,0x72,0x65,0x65,0x77,0x61,0x72,0x65,0x20,0x20,0x20,0x20, + 0x50,0x6F,0x6B,0x65,0x6D,0x6F,0x6E,0x4D,0x69,0x6E,0x69,0x20,0x42,0x49,0x4F,0x53, + 0x20,0x20,0x56,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x20,0x31,0x2E,0x33,0x20,0x20, + 0x20,0x62,0x79,0x20,0x54,0x65,0x61,0x6D,0x20,0x50,0x6F,0x6B,0x65,0x6D,0x65,0x20, +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.h b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.h new file mode 100644 index 0000000000..065413910f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.h @@ -0,0 +1,25 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef FREEBIOS_H +#define FREEBIOS_H + +// Free BIOS (4KB) +extern const unsigned char FreeBIOS[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.min b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.min new file mode 100644 index 0000000000..0aa1419060 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/freebios/freebios.min differ diff --git a/PVPokeMini/PokeMini/pokemini-code/freebios/gfx.bin b/PVPokeMini/PokeMini/pokemini-code/freebios/gfx.bin new file mode 100644 index 0000000000..127be2943c Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/freebios/gfx.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/freebios/makefile b/PVPokeMini/PokeMini/pokemini-code/freebios/makefile new file mode 100644 index 0000000000..bfea45b002 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/freebios/makefile @@ -0,0 +1,16 @@ +# FreeBIOS Makefile + +POKEROOT = ../ +PMAS = $(POKEROOT)tools/pmas/pmas +BIN2C = $(POKEROOT)tools/bin2c/bin2c + +.PHONY: all clean + +all: freebios.c + +freebios.c : freebios.asm + $(PMAS) freebios.asm freebios.min + $(BIN2C) freebios.min freebios.c FreeBIOS + +clean: + -rm -f freebios.min freebios.c diff --git a/PVPokeMini/PokeMini/pokemini-code/history.txt b/PVPokeMini/PokeMini/pokemini-code/history.txt new file mode 100644 index 0000000000..f803f1c87c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/history.txt @@ -0,0 +1,170 @@ + -: 0.60 Changes :- + Changed version format to only 2 fields to avoid confusion + Fixed RTC month being reported wrong from host + Adjusted graphics, now it display darker shades to match more closely the real system + Added 2 new options: LCD contrast and LCD bright + Changed the way analog LCD mode works, now it's less blurry and can do up to 5 shades without artifacts + SDL port has been upgraded to SDL 2, this brings Haptic support and other improvements + New Keyboard/Joystick option to allow checking inputs + Applying joystick settings now can (re)enable the device + Share EEPROM is now disabled by default + Emulator can be compiled for 64-bit CPU without issues now + Limited sync-cycles to 64 on 'accurancy' platforms + Win32 Only: + Corrected Direct3D issue in some GPUs + Sound write position is now handled correctly + NDS Only: Added 3-in-1 rumble support + PSP Only: + Analog stick now works + Added FPS display under Platform... (default is off) + Reached 100% emulation by skipping 1 frame, aparently hardware is limited to 60fps max + Dreamcast Only: + Improved sound latency (thanks BlueCrab). + Added FPS display under Platform... (default is off) + Debugger Only: + Minor fixes + Trace history is now 10000 instructions instead of 256 + Added copy & paste buttons to timing counters + + -: 0.5.4 Changes :- + Fixed savestates load/save + Minor changes + PSP Only: + Timezone is now handled correctly + + -: 0.5.3 Changes :- + Fixed command-line parsing which caused problems with lastest GCC + Directory '.' no longer listed + Configurations now save the directory of the last ROM loaded + Improved support on color PRC (now works on framebuffer and LCD) + Dreamcast Only: + Added read/write VMU support + EEPROM write disabled by default + Debugger Only: + Fixed "Add watchpoint at..." in Memory Viewer + Added symbols list window + Added run trace window + Added "Go to cartridge IRQ" with ability to decode the address + Middle and Right click now set breakpoint/watchpoint + Go to address/IRQ now highlight the location + Added autorun .min after load + Fixed offset of CE jump instructions + NDS Only: Removed real battery status + + -: 0.5.2 Changes :- + Opening .minc files now opens the linked .min files + More accurant PRC timing and triggering + Minor changes + Debugger Only: + Recent ROMs list + Drag & Drop ROM files support + Added file association to .min and .minc files + Moved PRC Counter from Timers Window to Misc. Window + Added more special registers for printing and controlling the debug output + Reorganized the menu + Improved the memory content components + Added 16-bits memory filler into memory viewer + All viewers and main window position & size are now saved + Win32 Only: + Fixed command-lines and closing code + Recent ROMs list + Drag & Drop ROM files support + Added "Pause when inactive" window option + Added file association to .min and .minc files + + -: 0.5.1 Changes :- + Relative files are now launched from current directory + Fixed notification message display in 32bpp + Added 50% Scanline LCD filter + New Tools (Available in Debugger package): + PokeMini Image Converter + PokeMini Music Converter + Debugger only: + F1 shortcut for documentation + Improved external launcher + IRQ Window "Frames in single-row" initialization fixed + Minimized windows won't be rendered now + Added "Character Set -> From file..." in Memory viewer + Added "Memory data" in Memory viewer with Import, Export, + Copy and Fill operations. + Win32 Only: Fixed DirectDraw surface pitch + + -: 0.5.0 Changes :- + Debugger is now complete! + Reordered menu items better + Added Dingux platform (Thanks coccijoe for the port src code) + Fixed issue of sound going out of sync + Separated piezo filtering (now works with any sound engine) + Fixed result of SUB instruction with decimal mode + Fixed PRC rate divider + Corrected some options in configurations file + Multicart support + Made sure shared EEPROM and cfg files are only saved on emulator's + executable directory + Added "Sync cycles" option that allow to trade between performance and + accurancy, higher value can speed up emulation but may cause problems + Pressing Left/Right while browsing will now page up/down, selecting + drive is now C+Left and C+Right + Unofficial colors palette changed (but still backward compatible) + New zooms: 5x (480x320) and 6x (576x384) + Loading ROM from ZIP package is now supported + More palettes and 2 custom ones, they can be edited by pressing A + Win32 platform is now fixed and updated + Joystick can now be re-defined in portable devices + SDL Only: Keyboard can now be re-defined under "Platform..." + Dreamcast Only: PAL/NTSC can now be selected under "Platform..." + NDS Only: Added FPS counter and rumble pak level adjustment + PSP Only: Zoom from 1x to 4x can now be changed under "Platform..." + + -: 0.4.5 Changes :- + Fixed interrupt flag status after interrupt jump/call + Added "Generated", "Direct PWM" and "PWM+Filter" sound modes + Generated - Mode used in slow platforms + Direct PWM - Same as direct but with ability to play PWM raw sounds + PWM+Filter - Direct PWM with filtering to simulate PM's piezo speaker + LCD update now when "dirty" instead of PRC rate counter match + Unofficial colors information structure changed to lower memory usage + Support for 4x4 attributes in unofficial colors + Added "Reload colors info..." to reload the .minc file + Soft reset now supported, changing rom won't reset clock + FreeBIOS 1.2: Display status and improved compatibility + SDL Only: Added joystick support (disabled by default) + Joystick can be enabled under "Platform..." -> "Define Joystick..." + SDL Only: Color depth can be changed between 16bpp and 32bpp + Wiz Only: Fixed crash when sound disabled and added SDL port (wizsdl) + NDS, Wiz and PSP Only: Battery can be setup to reflect real battery + Source Only: Added some simplified platforms to help porting + + -: 0.4.4 Changes :- + Fixed POPA/POPAX timings (thanks asterick). + Added support to read/write configurations @ 'pokemini.cfg'. + Load/save state are now working! + Added support for unshared EEPROM files (Each ROM can have his own EEPROM). + SDL Only: Zoom can now be changed on the fly under "Platform..." + Added more options. + + -: 0.4.3 Changes :- + Some fixes. + Added zoom support for SDL platform (1x, 2x, 3x or 4x). + Added Dreamcast platform. + Fullscreen toggle works now on Windows. + Added emulated sound support for all platforms. + Improved UI. + + -: 0.4.2 Changes :- + Palette support in SDL. + Rumble now shake the display up & down. + Added Wiz platform. + Fixed EEPROM access. + Fixed signed jump/call instructions. + Removed load/save state until a problem is solved. + Added unofficial colors support into games! + + -: 0.4.1 Changes :- + Minor changes. + Audio dumping/capture is now WAV format. + + -: 0.4.0 Changes :- + Complete rewrite, source code seems very portable. + Added FreeBIOS, a public domain BIOS that try to behave like the real BIOS. + Added SDL and some platforms. diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/CPUWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/CPUWindow.c new file mode 100644 index 0000000000..91a7972e57 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/CPUWindow.c @@ -0,0 +1,3488 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "ExportBMP.h" +#include "ExportWAV.h" + +#include "PokeMiniIcon_96x128.h" +#include "InstructionProc.h" +#include "InstructionInfo.h" +#include "HelpSupport.h" +#include "FileAssociation.h" + +#include "CPUWindow.h" +#include "InputWindow.h" +#include "PalEditWindow.h" +#include "MemWindow.h" +#include "PRCTilesWindow.h" +#include "PRCMapWindow.h" +#include "PRCSprWindow.h" +#include "TimersWindow.h" +#include "HardIOWindow.h" +#include "IRQWindow.h" +#include "MiscWindow.h" +#include "SymbWindow.h" +#include "TraceWindow.h" +#include "ExternalWindow.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +const char *AboutTxt = "PokeMini " PokeMini_Version " Debugger" + "\n\n" + "Coded by JustBurn\n" + "Thanks to p0p, Dave|X,\n" + "Onori, goldmono, Agilo,\n" + "DarkFader, asterick,\n" + "MrBlinky, Wa, Lupin and\n" + "everyone in #pmdev on\n" + "IRC EFNET!\n\n" + "Please check readme.txt\n\n" + "For latest version visit:\n" + "http://pokemini.sourceforge.net/\n\n" + "Special thanks to:\n" + "Museum of Electronic Games & Art\n" + "http://m-e-g-a.org\n" + "MEGA supports preservation\n" + "projects of digital art & culture\n"; + +const char *WebsiteTxt = "http://pokemini.sourceforge.net/"; + +// Loaded color info file +char ColorInfoFile[PMTMPV] = {0}; + +static int CPUWindow_InConfigs = 0; + +GtkWindow *MainWindow; +static int MainWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkTable *MTable; +static SGtkXDrawingView ProgramView; +static SGtkXDrawingView RegistersView; +static SGtkXDrawingView StackView; +static GtkNotebook *BottomNB; +static SGtkXDrawingView RAMView; +static SGtkXDrawingView EEPROMView; +static SGtkXDrawingView IOView; +static GtkScrolledWindow *EditInfoMsgSW; +static GtkTextView *EditInfoMsg; +static GtkTextBuffer *EditInfoMsgBuf; +static GtkScrolledWindow *EditInfoDebugSW; +static GtkTextView *EditInfoDebug; +static GtkTextBuffer *EditInfoDebugBuf; +static GtkFrame *StatusFrame; +static GtkLabel *StatusLabel; + +static const char *CartridgeIRQVectStr[27] = { + "Reset Location", + "PRC Frame Copy IRQ", + "PRC Render IRQ", + "Timer 2 Underflow (upper) IRQ", + "Timer 2 Underflow (lower) IRQ", + "Timer 1 Underflow (upper) IRQ", + "Timer 1 Underflow (lower) IRQ", + "Timer 3 Underflow (upper) IRQ", + "Timer 3 Comparator IRQ", + "32hz Timer (256hz linked) IRQ", + "8hz Timer (256hz linked) IRQ", + "2hz Timer (256hz linked) IRQ", + "1hz Timer (256hz linked) IRQ", + "IR Receiver IRQ", + "Shake Sensor IRQ", + "Power Key IRQ", + "Right Key IRQ", + "Left Key IRQ", + "Down Key IRQ", + "Up Key IRQ", + "C Key IRQ", + "B Key IRQ", + "A Key IRQ", + "Unknown 1 IRQ", + "Unknown 2 IRQ", + "Unknown 3 IRQ", + "Cartridge IRQ", +}; + +static uint32_t CartridgeIRQVectAddr[27] = { + 0x2102, 0x2108, 0x210E, 0x2114, + 0x211A, 0x2120, 0x2126, 0x212C, + 0x2132, 0x2138, 0x213E, 0x2144, + 0x214A, 0x2150, 0x2156, 0x215C, + 0x2162, 0x2168, 0x216E, 0x2174, + 0x217A, 0x2180, 0x2186, 0x218C, + 0x2192, 0x2198, 0x219E +}; + +void Set_StatusLabel(const char *format, ...) +{ + char txt[4096]; + + va_list args; + va_start (args, format); + vsprintf (txt, format, args); + gtk_label_set_text(StatusLabel, txt); + va_end (args); +} + +void Add_InfoMessage(const char *format, ...) +{ + GtkTextIter textiter; + char txt[4096]; + int si; + + va_list args; + va_start (args, format); + vsprintf (txt, format, args); + gtk_text_buffer_get_end_iter(EditInfoMsgBuf, &textiter); + gtk_text_buffer_insert(EditInfoMsgBuf, &textiter, txt, -1); + GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(EditInfoMsgSW); + gtk_adjustment_set_value(adj, adj->upper); + va_end (args); + + si = strlen(txt); + if (txt[si-1] == '\n') txt[si-1] = 0; + gtk_label_set_text(StatusLabel, txt); +} + +char *DebugOutBuff = NULL; +int DebugOutBuffMode = 0; // 0 = Disabled, 1 = Add, 2 = Clear & Add +int DebugOutBuffSize = 0; +int DebugOutBuffAlloc = 0; + +static void Print_DebugOutput(const char *txt, int size) +{ + GtkTextIter textiter; + + if (!DebugOutBuffMode) { + // Directly + gtk_text_buffer_get_end_iter(EditInfoDebugBuf, &textiter); + gtk_text_buffer_insert(EditInfoDebugBuf, &textiter, txt, size); + if ((dclc_autodebugout) && (gtk_notebook_get_current_page(BottomNB) != 4)) { + gtk_notebook_set_current_page(BottomNB, 4); + } + GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(EditInfoDebugSW); + gtk_adjustment_set_value(adj, adj->upper-1); + } else { + // Buffered + if ((DebugOutBuffSize + size) >= 1048576) return; + if (DebugOutBuffAlloc <= (DebugOutBuffSize + size + 1)) { + DebugOutBuffAlloc += (size < 1024) ? 1024 : size; + DebugOutBuff = (char *)realloc(DebugOutBuff, DebugOutBuffAlloc); + } + memcpy((char *)DebugOutBuff + DebugOutBuffSize, txt, size); + DebugOutBuffSize += size; + DebugOutBuff[DebugOutBuffSize] = 0; + } +} + +void Cmd_DebugOutput(int ctrl) +{ + GtkTextIter startiter, enditer; + + if (ctrl < 0) { + // Initialize + DebugOutBuffMode = 0; + DebugOutBuffAlloc = 0; + DebugOutBuffSize = 0; + if (DebugOutBuff) { + free(DebugOutBuff); + DebugOutBuff = NULL; + } + if (ctrl <= -2) { + gtk_text_buffer_get_start_iter(EditInfoDebugBuf, &startiter); + gtk_text_buffer_get_end_iter(EditInfoDebugBuf, &enditer); + gtk_text_buffer_delete(EditInfoDebugBuf, &startiter, &enditer); + } + } else if (ctrl == 'C') { + // Clear debug output + if (DebugOutBuffMode) { + DebugOutBuffMode = 2; + DebugOutBuffSize = 0; + } else { + gtk_text_buffer_get_start_iter(EditInfoDebugBuf, &startiter); + gtk_text_buffer_get_end_iter(EditInfoDebugBuf, &enditer); + gtk_text_buffer_delete(EditInfoDebugBuf, &startiter, &enditer); + } + } else if (ctrl == 'L') { + // Lock (Buffer) + if (DebugOutBuffMode) return; + if (!DebugOutBuff) { + DebugOutBuffAlloc = 1024; + DebugOutBuff = (char *)malloc(DebugOutBuffAlloc); + } + if (DebugOutBuff) { + DebugOutBuffMode = 1; + DebugOutBuffSize = 0; + } + } else if (ctrl == 'U') { + // Unlock (Unbuffer) + if (!DebugOutBuffMode) return; + if (DebugOutBuffMode == 2) { + gtk_text_buffer_get_start_iter(EditInfoDebugBuf, &startiter); + gtk_text_buffer_get_end_iter(EditInfoDebugBuf, &enditer); + gtk_text_buffer_delete(EditInfoDebugBuf, &startiter, &enditer); + } + gtk_text_buffer_get_end_iter(EditInfoDebugBuf, &enditer); + gtk_text_buffer_insert(EditInfoDebugBuf, &enditer, DebugOutBuff, DebugOutBuffSize); + if ((dclc_autodebugout) && (gtk_notebook_get_current_page(BottomNB) != 4)) { + gtk_notebook_set_current_page(BottomNB, 4); + } + GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(EditInfoDebugSW); + gtk_adjustment_set_value(adj, adj->upper-1); + DebugOutBuffMode = 0; + DebugOutBuffSize = 0; + } +} + +void Add_DebugOutputChar(unsigned char ch) +{ + char txt[2] = {ch, 0}; + + if ((ch < 0x20) && (ch != 0x0A)) return; // Disallow controls except new lines + Print_DebugOutput(txt, 1); +} + +void Add_DebugOutputNumber8(unsigned char num, int reg) +{ + char txt[16]; + + if (reg == 1) sprintf(txt, "%02X", num); + else if (reg == 2) sprintf(txt, "%i", num); + else { + if (num & 0x80) sprintf(txt, "%i", -256 + num); + else sprintf(txt, "%i", num); + } + Print_DebugOutput(txt, strlen(txt)); +} + +void Add_DebugOutputNumber16(unsigned char num, int reg) +{ + static unsigned char numlow = 0x00; + char txt[16]; + + if (reg & 1) { + if (reg & 2) { + if (num & 0x80) sprintf(txt, "%i", -65536 + (numlow + num * 256)); + else sprintf(txt, "%i", (numlow + num * 256)); + } else sprintf(txt, "%i", numlow + num * 256); + + Print_DebugOutput(txt, strlen(txt)); + } else { + numlow = num; + } +} + +void Add_DebugOutputFixed8_8(unsigned char num, int reg) +{ + static unsigned char numlow = 0x00; + char txt[64]; + float f; + + + if (reg & 1) { + if (num & 0x80) { + f = (float)numlow / 256.0f + (float)(-256 + num); + sprintf(txt, "%.2f", f); + } else { + f = (float)numlow / 256.0f + (float)num; + sprintf(txt, "%.2f", f); + } + Print_DebugOutput(txt, strlen(txt)); + } else { + numlow = num; + } +} + +// ------ +// DisAsm +// ------ + +static char *ColDCPUInstructions_Operand[] = { + "", + "\e234%j", "\e234%J", "\e234%i", "\e234%u", "\e234%U", "\e234%s", "\e234%S", + "\e240A", "\e240B", "\e234%u", "\e203[HL]", + "\e203[N+\e234%u\e203]", "\e203[\e234%U\e203]", "\e203[X]", "\e203[Y]", + "\e240L", "\e240H", "\e240N", "\e240SP", + "\e240BA", "\e240HL", "\e240X", "\e240Y", + "\e240F", "\e240I", "\e240XI", "\e240YI", + "\e203[X+\e234%s\e203]", "\e203[Y+\e234%s\e203]", "\e203[X+L]", "\e203[Y+L]", + "\e240U", "\e240V", "\e240XI", "\e240YI", + "\e203[SP+\e234%s\e203]", "\e240PC", "\e234%h", + NULL +}; + +// Disassembler with color codes +TSOpcDec CDisAsm_SOpcDec = { + DefaultOperandNumberDec, // Operand number decode + DefaultOperandNumberEnc, // Operand number encode + DebugCPUInstructions_Opcode, // Opcode dictionary + ColDCPUInstructions_Operand, // Operand dictionary + "\e024", // Opcode pre-text + " ", // Opcode post-text + "\e024, " // Operand separator +}; + +// ------- +// Viewers +// ------- + +static uint32_t *ProgramView_Table = NULL; + +// Get physical address of program view top +uint32_t ProgramView_GetTop(void) +{ + int pp = ProgramView.sboffset; + if (!dclc_fullrange) { + if (pp >= 0x8000) { + pp = (MinxCPU.PC.B.I << 15) | (pp & 0x7FFF); + } + } + return pp; +} + +// Recalculate program view table +uint32_t ProgramView_Recalc(uint32_t addr) +{ + int y, size; + for (y=0; y= 0x8000) laddr = 0x8000 | (addr & 0x7FFF); + + // Sync program viewI should had them separate + ProgramView_Sync(); + + // Highlight address + if (highlight) { + ProgramView.highlight_addr = addr; + ProgramView.highlight_rem = 16; + } + + // Try to point at the center + if ((addr < ProgramView.first_addr) || (addr >= ProgramView.last_addr)) { + // Not exactly in the center, but oh well + offset = ProgramView.total_lines >> 1; + if (dclc_fullrange) { + sgtkx_drawing_view_sbvalue(&ProgramView, addr - offset); + } else { + sgtkx_drawing_view_sbvalue(&ProgramView, laddr - offset); + } + } +} + +// Program view go to SP +void StackView_GotoSP(void) +{ + int val, begin, end; + + begin = ProgramView.sboffset; + end = begin + StackView.total_lines; + val = MinxCPU.SP.W.L - 1; + if ((val < begin) || (val >= end)) { + sgtkx_drawing_view_sbvalue(&StackView, (val - 0x1000) - (StackView.total_lines >> 1)); + } +} + +static const char *ProgramView_CurType[4] = { "", "!", "->", "!>" }; + +// Program view resize event +static int ProgramView_resize(SGtkXDrawingView *widg, int width, int height, int _c) +{ + int newsize; + + newsize = height / 12; + if (newsize != widg->total_lines) { + widg->total_lines = newsize; + sgtkx_drawing_view_sbpage(widg, widg->total_lines - 1, widg->total_lines - 2); + + // Resize table + ProgramView_Table = (uint32_t *)realloc(ProgramView_Table, ProgramView.total_lines * sizeof(uint32_t)); + ProgramView_Sync(); + } + + return (emumode == EMUMODE_STOP); +} + +// Program view exposure event +static int ProgramView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + int stripe, spp, pp, lastpp, lp, pPC; + InstructionInfo *opcode; + uint8_t data[4]; + char opcodename[PMTMPV]; + int size, onCur; + int y, yc, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) ys = (widg->mousey - 12) / 12; + + // Get physical cursor location and PC + lp = pp = spp = widg->sboffset; + if (!dclc_fullrange) { + if (lp >= 0x8000) { + pp = (MinxCPU.PC.B.I << 15) | (lp & 0x7FFF); + } + } + pPC = PhysicalPC(); + + // Decrement highlighting remain timer + if (ProgramView.highlight_rem) { + ProgramView.highlight_rem--; + sgtkx_drawing_view_repaint_after(&ProgramView, 250); + } + + // Draw content + widg->first_addr = stripe = pp; + lastpp = pp - 1; + for (y=1; y= 0x8000) { + pp = (MinxCPU.PC.B.I << 15) | (lp & 0x7FFF); + } + } + + // Bar color + onCur = 0; + if (emumode != EMUMODE_RUNFULL) { + if (ProgramView.highlight_rem && ((ProgramView.highlight_addr > lastpp) & (ProgramView.highlight_addr <= pp))) { + lastpp = pp = ProgramView.highlight_addr; + color = 0xFFE060; + } else if ((pPC > lastpp) & (pPC <= pp)) { + lastpp = pp = pPC; + if (!dclc_fullrange) { + if (lp >= 0x8000) { + pp = (MinxCPU.PC.B.I << 15) | (lp & 0x7FFF); + } + } + if (PMD_TrapPoints[pp & PM_ROM_Mask] & TRAPPOINT_BREAK) { + color = 0xFF8000; + onCur = 3; + } else { + color = 0xFFCC98; + onCur = 2; + } + } else if (PMD_TrapPoints[pp & PM_ROM_Mask] & TRAPPOINT_BREAK) { + color = 0xFF2000; + onCur = 1; + } else if ((y-1) == ys) { + if (stripe & 1) color = 0xF8F8DC; + else color = 0xF8F8F8; + } else { + if (stripe & 1) color = 0xFFFFE4; + else color = 0xFFFFFF; + } + } else { + if (stripe & 1) color = 0x808064; + else color = 0x808080; + } + sgtkx_drawing_view_drawfrect(widg, 0, y * 12, widg->width, 12, color); + stripe++; + + // Decode instruction + ProgramView_Table[y-1] = lastpp; + if (pp >= PM_ROM_Size) continue; + if (!dclc_fullrange && (lp >= 65536)) continue; + opcode = GetInstructionInfo(MinxCPU_OnRead, 1, pp, data, &size); + DisasmSingleOpcode(opcode, pp, data, opcodename, &CDisAsm_SOpcDec); + ProgramView_Table[y-1] = pp; + + // Draw instruction + if (onCur) sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x603000, "%s", ProgramView_CurType[onCur]); + if (dclc_fullrange) { + sgtkx_drawing_view_drawtext(widg, 20, y * 12, 0x4C3000, "$%06X", pp); + } else { + sgtkx_drawing_view_drawtext(widg, 20, y * 12, 0x406080, "%02X\e320@%04X", (int)MinxCPU.PC.B.I, lp); + } + if (size >= 1) sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605020, "%02X", data[0]); + if (size >= 2) sgtkx_drawing_view_drawtext(widg, 100, y * 12, 0x605040, "%02X", data[1]); + if (size >= 3) sgtkx_drawing_view_drawtext(widg, 116, y * 12, 0x605060, "%02X", data[2]); + if (size >= 4) sgtkx_drawing_view_drawtext(widg, 132, y * 12, 0x605080, "%02X", data[3]); + sgtkx_drawing_view_drawtext(widg, 156, y * 12, 0x4C3000, "%s", opcodename); + + // Next one... + lastpp = pp; + pp += size; lp += size; + } + widg->last_addr = pp; + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + if (ys >= 0) { + lp = pp = ProgramView_Table[ys]; + if (pp >= 0x8000) lp = 0x8000 | (pp & 0x7FFF); + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Program Viewer - \e345%02X\e320$%04X / $%06X", (int)MinxCPU.PC.B.I, (int)lp, pp); + } else { + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Program Viewer"); + } + + return 1; +} + +static GtkXCustomDialog ProgramView_leftbpress[] = { + {GTKXCD_CHECK, "Change Opcode:", 1}, + {GTKXCD_ENTRY, ""}, + {GTKXCD_CHECK, "Enable breakpoint", 1}, + {GTKXCD_EOL, ""} +}; + +// Program view button press +static int ProgramView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + InstructionInfo *opcode; + uint8_t data[16]; + char opcodename[PMTMPV], errfail[PMTMPV]; + int size, pp, ys; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + ys = (widg->mousey - 12) / 12; + + set_emumode(EMUMODE_STOP, 1); + + // Process selected item + pp = ProgramView_Table[ys]; + opcode = GetInstructionInfo(MinxCPU_OnRead, 1, pp, data, &size); + DisasmSingleOpcode(opcode, pp, data, opcodename, &DefaultSOpcDec); + strcpy(ProgramView_leftbpress[1].text, opcodename); + ProgramView_leftbpress[2].number = PMD_TrapPoints[pp & PM_ROM_Mask] & TRAPPOINT_BREAK; + if (button == SGTKXDV_BLEFT) { + if (CustomDialog(MainWindow, "Modify opcode", ProgramView_leftbpress)) { + if (ProgramView_leftbpress[0].number) { + // Change opcode + opcode = AsmSingleOpcode(ProgramView_leftbpress[1].text, pp, data, &DefaultSOpcDec, errfail); + if (opcode) { + if (opcode->size != size) { + if (!YesNoDialog(MainWindow, "Opcode size doesn't match\nChange anyway?", "Change opcode", GTK_MESSAGE_QUESTION, NULL)) pp = -1; + } + if (pp == -1) { + // Do nothing... + } else if (pp < 0x1000) { + memset(&PM_BIOS[pp], 0xFF, size); // NOP extra space + memcpy(&PM_BIOS[pp], data, opcode->size); + } else if (pp < 0x2000) { + memset(&PM_RAM[pp-0x1000], 0xFF, size); // NOP extra space + memcpy(&PM_RAM[pp-0x1000], data, opcode->size); + } else if (pp < 0x2100) { + MessageDialog(MainWindow, "Cannot assembly hardware I/O!", "Modify opcode", GTK_MESSAGE_ERROR, NULL); + } else { + memset(&PM_ROM[pp & PM_ROM_Mask], 0xFF, size); // NOP extra space + memcpy(&PM_ROM[pp & PM_ROM_Mask], data, opcode->size); + } + } else { + MessageDialog(MainWindow, errfail, "Modify opcode", GTK_MESSAGE_ERROR, NULL); + } + } + // Change breakpoint + PMD_TrapPoints[pp & PM_ROM_Mask] &= ~TRAPPOINT_BREAK; + if (ProgramView_leftbpress[2].number) PMD_TrapPoints[pp & PM_ROM_Mask] |= TRAPPOINT_BREAK; + refresh_debug(1); + } + } else if ((button == SGTKXDV_BMIDDLE) || (button == SGTKXDV_BRIGHT)) { + // Toggle breakpoint + PMD_TrapPoints[pp & PM_ROM_Mask] ^= TRAPPOINT_BREAK; + refresh_debug(1); + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// CPU status string +static const char *CPUStatusStr[4] = { + "Normal", + "Halt", + "Stop", + "IRQ" +}; + +// Registers view exposure event +static int RegistersView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + int y, yc, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + ys = (widg->mousey - 12) / 12; + } + + // Draw background + for (y=1; ywidth, 12, color); + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Registers Viewer"); + + // Draw registers + y = 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "BA = $%04X,%i", (int)MinxCPU.BA.W.L, (int)MinxCPU.BA.W.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "HL = $\e345%02X\e003%04X,%i", (int)MinxCPU.HL.B.I, (int)MinxCPU.HL.W.L, (int)MinxCPU.HL.W.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " X = $\e345%02X\e003%04X,%i", (int)MinxCPU.X.B.I, (int)MinxCPU.X.W.L, (int)MinxCPU.X.W.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " Y = $\e345%02X\e003%04X,%i", (int)MinxCPU.Y.B.I, (int)MinxCPU.Y.W.L, (int)MinxCPU.Y.W.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "SP = $%04X,%i", (int)MinxCPU.SP.W.L, (int)MinxCPU.SP.W.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "PC = \e345%02X\e003$%04X,%i", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L, (int)MinxCPU.PC.W.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " U = $%02X->$%02X (%i)", (int)MinxCPU.U1, (int)MinxCPU.U2, (int)MinxCPU.Shift_U); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " V = $%02X,%i", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.B.I); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " N = $%02X,%i", (int)MinxCPU.N.B.H, (int)MinxCPU.N.B.H); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " I = $%02X,%i", (int)MinxCPU.HL.B.I, (int)MinxCPU.HL.B.I); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "XI = $%02X,%i", (int)MinxCPU.X.B.I, (int)MinxCPU.X.B.I); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "YI = $%02X,%i", (int)MinxCPU.Y.B.I, (int)MinxCPU.Y.B.I); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " A = $%02X,%i", (int)MinxCPU.BA.B.L, (int)MinxCPU.BA.B.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " B = $%02X,%i", (int)MinxCPU.BA.B.H, (int)MinxCPU.BA.B.H); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " L = $%02X,%i", (int)MinxCPU.HL.B.L, (int)MinxCPU.HL.B.L); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " H = $%02X,%i", (int)MinxCPU.HL.B.H, (int)MinxCPU.HL.B.H); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, " F = $%02X,%i", (int)MinxCPU.F, (int)MinxCPU.F); + y += 12; + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "\e%sI.D. \e%sI.F. \e%sNib. \e%sBCD", + (MinxCPU.F & 0x80) ? "003" : "766", + (MinxCPU.F & 0x40) ? "003" : "766", + (MinxCPU.F & 0x20) ? "003" : "766", + (MinxCPU.F & 0x10) ? "003" : "766"); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "\e%sSign \e%sOvFl \e%sCar. \e%sZe.", + (MinxCPU.F & 0x08) ? "003" : "766", + (MinxCPU.F & 0x04) ? "003" : "766", + (MinxCPU.F & 0x02) ? "003" : "766", + (MinxCPU.F & 0x01) ? "003" : "766"); + y += 12; + } else { + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "\e%sI.D. \e%sI.F. \e%sNib. \e%sBCD", + (MinxCPU.F & 0x80) ? "003" : "433", + (MinxCPU.F & 0x40) ? "003" : "433", + (MinxCPU.F & 0x20) ? "003" : "433", + (MinxCPU.F & 0x10) ? "003" : "433"); + y += 12; + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "\e%sSign \e%sOvFl \e%sCar. \e%sZe.", + (MinxCPU.F & 0x08) ? "003" : "433", + (MinxCPU.F & 0x04) ? "003" : "433", + (MinxCPU.F & 0x02) ? "003" : "433", + (MinxCPU.F & 0x01) ? "003" : "433"); + y += 12; + } + if (MinxCPU.Status == MINX_STATUS_IRQ) { + sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "CPU Status: %s $%02X", CPUStatusStr[MinxCPU.Status], MinxCPU.IRQ_Vector); + } else sgtkx_drawing_view_drawtext(widg, 4, y, 0x00004C, "CPU Status: %s", CPUStatusStr[MinxCPU.Status]); + + return 1; +} + +static GtkXCustomDialog RegistersView_Uregister[] = { + {GTKXCD_LABEL, "Set U (Latch 1):"}, + {GTKXCD_NUMIN, "", 0, 2, 1, -255, 255}, + {GTKXCD_LABEL, "Set U (Latch 2):"}, + {GTKXCD_NUMIN, "", 0, 2, 1, -255, 255}, + {GTKXCD_LABEL, "Shift U ammount:"}, + {GTKXCD_NUMIN, "", 0, 2, 0, 0, 3}, + {GTKXCD_EOL, ""} +}; + +static GtkXCustomDialog RegistersView_CPUStatus[] = { + {GTKXCD_RADIO, "Normal", 1}, + {GTKXCD_RADIO, "Halt", 0}, + {GTKXCD_RADIO, "Stop", 0}, + {GTKXCD_RADIO, "IRQ", 0}, + {GTKXCD_LABEL, "IRQ Vector:"}, + {GTKXCD_NUMIN, "", 0, 2, 0, 0, 127}, + {GTKXCD_EOL, ""} +}; + +// Registers view button press +static int RegistersView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int result = 0, val; + int ys = -1, xs = -1; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + ys = (widg->mousey - 12) / 12; + xs = widg->mousex / 40; + + set_emumode(EMUMODE_STOP, 1); + + if (button == SGTKXDV_BLEFT) { + switch (ys) { + case 0: result = EnterNumberDialog(MainWindow, "Change register", "Set BA value:", &val, (int)MinxCPU.BA.W.L, 4, 1, -65535, 65535); + break; + case 1: result = EnterNumberDialog(MainWindow, "Change register", "Set HL value:", &val, (int)MinxCPU.HL.W.L, 4, 1, -65535, 65535); + break; + case 2: result = EnterNumberDialog(MainWindow, "Change register", "Set X value:", &val, (int)MinxCPU.X.W.L, 4, 1, -65535, 65535); + break; + case 3: result = EnterNumberDialog(MainWindow, "Change register", "Set Y value:", &val, (int)MinxCPU.Y.W.L, 4, 1, -65535, 65535); + break; + case 4: result = EnterNumberDialog(MainWindow, "Change register", "Set SP value:", &val, (int)MinxCPU.SP.W.L, 4, 1, -65535, 65535); + break; + case 5: result = EnterNumberDialog(MainWindow, "Change register", "Set PC value:", &val, (int)MinxCPU.PC.W.L, 4, 1, -65535, 65535); + break; + case 6: RegistersView_Uregister[1].number = (int)MinxCPU.U1; + RegistersView_Uregister[3].number = (int)MinxCPU.U2; + RegistersView_Uregister[5].number = (int)MinxCPU.Shift_U; + result = CustomDialog(MainWindow, "Change register", RegistersView_Uregister); + break; + case 7: result = EnterNumberDialog(MainWindow, "Change register", "Set V value:", &val, (int)MinxCPU.PC.B.I, 2, 1, -255, 255); + break; + case 8: result = EnterNumberDialog(MainWindow, "Change register", "Set N value:", &val, (int)MinxCPU.N.B.H, 2, 1, -255, 255); + break; + case 9: result = EnterNumberDialog(MainWindow, "Change register", "Set I value:", &val, (int)MinxCPU.HL.B.I, 2, 1, -255, 255); + break; + case 10:result = EnterNumberDialog(MainWindow, "Change register", "Set XI value:", &val, (int)MinxCPU.X.B.I, 2, 1, -255, 255); + break; + case 11:result = EnterNumberDialog(MainWindow, "Change register", "Set YI value:", &val, (int)MinxCPU.Y.B.I, 2, 1, -255, 255); + break; + case 12:result = EnterNumberDialog(MainWindow, "Change register", "Set A value:", &val, (int)MinxCPU.BA.B.L, 2, 1, -255, 255); + break; + case 13:result = EnterNumberDialog(MainWindow, "Change register", "Set B value:", &val, (int)MinxCPU.BA.B.H, 2, 1, -255, 255); + break; + case 14:result = EnterNumberDialog(MainWindow, "Change register", "Set L value:", &val, (int)MinxCPU.HL.B.L, 2, 1, -255, 255); + break; + case 15:result = EnterNumberDialog(MainWindow, "Change register", "Set H value:", &val, (int)MinxCPU.HL.B.H, 2, 1, -255, 255); + break; + case 16:result = EnterNumberDialog(MainWindow, "Change register", "Set F value:", &val, (int)MinxCPU.F, 2, 1, -255, 255); + break; + case 17:if (xs == 0) MinxCPU.F ^= 0x80; + if (xs == 1) MinxCPU.F ^= 0x40; + if (xs == 2) MinxCPU.F ^= 0x20; + if (xs == 3) MinxCPU.F ^= 0x10; + break; + case 18:if (xs == 0) MinxCPU.F ^= 0x08; + if (xs == 1) MinxCPU.F ^= 0x04; + if (xs == 2) MinxCPU.F ^= 0x02; + if (xs == 3) MinxCPU.F ^= 0x01; + break; + case 19:RegistersView_CPUStatus[0].number = (MinxCPU.Status == MINX_STATUS_NORMAL); + RegistersView_CPUStatus[1].number = (MinxCPU.Status == MINX_STATUS_HALT); + RegistersView_CPUStatus[2].number = (MinxCPU.Status == MINX_STATUS_STOP); + RegistersView_CPUStatus[3].number = (MinxCPU.Status == MINX_STATUS_IRQ); + RegistersView_CPUStatus[5].number = MinxCPU.IRQ_Vector >> 1; + result = CustomDialog(MainWindow, "Change register", RegistersView_CPUStatus); + break; + } + if (result == 1) { + switch (ys) { + case 0: MinxCPU.BA.W.L = val; + break; + case 1: MinxCPU.HL.W.L = val; + break; + case 2: MinxCPU.X.W.L = val; + break; + case 3: MinxCPU.Y.W.L = val; + break; + case 4: MinxCPU.SP.W.L = val; + break; + case 5: MinxCPU.PC.W.L = val; + break; + case 6: MinxCPU.U1 = RegistersView_Uregister[1].number; + MinxCPU.U2 = RegistersView_Uregister[3].number = (int)MinxCPU.U2; + MinxCPU.Shift_U = RegistersView_Uregister[5].number & 3; + break; + case 7: MinxCPU.PC.B.I = val; + break; + case 8: MinxCPU.N.B.H = val; + break; + case 9: MinxCPU.HL.B.I = val; + break; + case 10:MinxCPU.X.B.I = val; + break; + case 11:MinxCPU.Y.B.I = val; + break; + case 12:MinxCPU.BA.B.L = val; + break; + case 13:MinxCPU.BA.B.H = val; + break; + case 14:MinxCPU.HL.B.L = val; + break; + case 15:MinxCPU.HL.B.H = val; + break; + case 16:MinxCPU.F = val; + break; + case 19: // Status + if (RegistersView_CPUStatus[0].number) MinxCPU.Status = MINX_STATUS_NORMAL; + if (RegistersView_CPUStatus[1].number) MinxCPU.Status = MINX_STATUS_HALT; + if (RegistersView_CPUStatus[2].number) MinxCPU.Status = MINX_STATUS_STOP; + if (RegistersView_CPUStatus[3].number) MinxCPU.Status = MINX_STATUS_IRQ; + MinxCPU.IRQ_Vector = RegistersView_CPUStatus[5].number << 1; + break; + } + } else if (result == -1) { + MessageDialog(MainWindow, "Invalid number", "Change register", GTK_MESSAGE_ERROR, NULL); + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// Stack view exposure event +static int StackView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + uint8_t dat, watch; + int pp, y, yc, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + ys = (widg->mousey - 12) / 12; + } + + // Draw content + pp = widg->sboffset + 0x1000; + for (y=1; ywidth, 12, color); + + if (pp >= 0x2000) continue; + dat = PM_RAM[pp & 4095]; + sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%04X: $%02X,%d", pp, (int)dat, (int)dat); + pp++; + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Stack Viewer"); + + return 1; +} + +// Stack view button press +static int StackView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int pp, ys = -1; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + ys = (widg->mousey - 12) / 12; + + set_emumode(EMUMODE_STOP, 1); + + // Process selected item + pp = widg->sboffset + 0x1000 + ys; + if (button == SGTKXDV_BLEFT) { + if (pp < 0x2000) { + AnyView_NewValue_CD[1].number = (int)PM_RAM[pp & 4095]; + AnyView_NewValue_CD[3].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHREAD; + AnyView_NewValue_CD[4].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHWRITE; + sprintf(AnyView_NewValue_CD[0].text, "Set new value for $%04X:", pp); + if (CustomDialog(MainWindow, "Change stack", AnyView_NewValue_CD)) { + PM_RAM[pp & 4095] = AnyView_NewValue_CD[1].number; + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + if (AnyView_NewValue_CD[3].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHREAD; + if (AnyView_NewValue_CD[4].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHWRITE; + refresh_debug(1); + } + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// RAM view go to addr +void RAMView_GotoAddr(uint32_t addr, int highlight) +{ + int set_line = (addr - 0x1000) >> 4; + + // Don't do anything if it's outside range + if ((addr < 0x1000) || (addr > 0x1FFF)) return; + + // Highlight address + if (highlight) { + RAMView.highlight_addr = addr; + RAMView.highlight_rem = 16; + } + + // Try to point at the top + if ((set_line < RAMView.sboffset) || (set_line >= (RAMView.sboffset + RAMView.total_lines - 1))) { + sgtkx_drawing_view_sbvalue(&RAMView, set_line - (RAMView.total_lines >> 1)); + } +} + +// RAM view exposure event +static int RAMView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + uint8_t dat, sdat, watch; + int x, y, pp, spp; + int yc, xs = -1, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + if ((widg->mousex >= 56) && (widg->mousex < 376)) { + xs = (widg->mousex - 56) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 376) && (widg->mousex < 504)) { + xs = (widg->mousex - 376) / 8; + ys = (widg->mousey - 12) / 12; + } + } + + // Decrement highlighting remain timer + if (RAMView.highlight_rem) { + RAMView.highlight_rem--; + sgtkx_drawing_view_repaint_after(&RAMView, 250); + } + + // Draw content + pp = spp = widg->sboffset * 16 + 0x1000; + for (y=1; ywidth, 12, color); + if (RAMView.highlight_rem && ((RAMView.highlight_addr & ~15) == pp)) { + dat = RAMView.highlight_addr & 15; + sgtkx_drawing_view_drawfrect(widg, 56+dat*20, y * 12, 16, 12, 0xFFE060); + sgtkx_drawing_view_drawfrect(widg, 376+dat*8, y * 12, 8, 12, 0xFFE060); + } + if (((y-1) == ys) && (xs >= 0)) { + sgtkx_drawing_view_drawfrect(widg, 56+xs*20, y * 12, 16, 12, color - 0x181818); + sgtkx_drawing_view_drawfrect(widg, 376+xs*8, y * 12, 8, 12, color - 0x181818); + } + + if (pp >= 0x2000) continue; + sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%04X:", pp); + for (x=0; x<16; x++) { + dat = PM_RAM[pp & 4095]; + sdat = (dat < 0x01) ? '.' : dat; + watch = PMD_TrapPoints[pp & PM_ROM_Mask] & TRAPPOINT_WATCH; + if (watch) { + sgtkx_drawing_view_drawfrect(widg, 56 + x * 20, y * 12, 16, 12, AnyView_TrapColor[watch]); + } + sgtkx_drawing_view_drawtext(widg, 56 + x * 20, y * 12, 0x4C4C00, "%02X", (int)dat); + sgtkx_drawing_view_drawchar(widg, 376 + x * 8, y * 12, 0x304C00, sdat); + pp++; + } + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + pp = spp + ys * 16 + xs; + if ((ys >= 0) && (pp < 0x2000)) { + dat = PM_RAM[pp & 4095]; + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "RAM Content [ $%04X => $%02X, %i ]", pp, dat, dat); + } else { + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "RAM Content"); + } + + return 1; +} + +// RAM view button press +static int RAMView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int pp, xs = -1, ys = -1; + uint8_t val; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + if ((widg->mousex >= 56) && (widg->mousex < 376)) { + xs = (widg->mousex - 56) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 376) && (widg->mousex < 504)) { + xs = (widg->mousex - 376) / 8; + ys = (widg->mousey - 12) / 12; + } else return 0; + + set_emumode(EMUMODE_STOP, 1); + + // Process selected item + pp = widg->sboffset * 16 + 0x1000 + ys * 16 + xs; + if (button == SGTKXDV_BLEFT) { + if (pp < 0x2000) { + AnyView_NewValue_CD[1].number = (int)PM_RAM[pp & 4095]; + AnyView_NewValue_CD[3].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHREAD; + AnyView_NewValue_CD[4].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHWRITE; + sprintf(AnyView_NewValue_CD[0].text, "Set new value for $%04X:", pp); + if (CustomDialog(MainWindow, "Change RAM", AnyView_NewValue_CD)) { + PM_RAM[pp & 4095] = AnyView_NewValue_CD[1].number; + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + if (AnyView_NewValue_CD[3].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHREAD; + if (AnyView_NewValue_CD[4].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHWRITE; + refresh_debug(1); + } + } + } else if (button == SGTKXDV_BMIDDLE) { + if (pp < 0x2000) { + val = PMD_TrapPoints[pp]; + switch (val & TRAPPOINT_WATCH) { + case 0: val = TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE: val = TRAPPOINT_WATCHREAD; break; + case TRAPPOINT_WATCHREAD: val = TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHWRITE: val = 0; break; + } + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[pp] |= val; + refresh_debug(1); + } + } else if (button == SGTKXDV_BRIGHT) { + if (pp < 0x2000) { + val = PMD_TrapPoints[pp]; + switch (val & TRAPPOINT_WATCH) { + case TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE: val = 0; break; + case TRAPPOINT_WATCHREAD: val = TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHWRITE: val = TRAPPOINT_WATCHREAD; break; + case 0: val = TRAPPOINT_WATCHWRITE; break; + } + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[pp] |= val; + refresh_debug(1); + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// Hardware IO exposure event +static int IOView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + uint8_t dat, sdat, watch; + int x, y, pp, spp; + int yc, xs = -1, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + if ((widg->mousex >= 56) && (widg->mousex < 376)) { + xs = (widg->mousex - 56) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 376) && (widg->mousex < 504)) { + xs = (widg->mousex - 376) / 8; + ys = (widg->mousey - 12) / 12; + } + } + + // Draw content + pp = spp = widg->sboffset * 16 + 0x2000; + for (y=1; ywidth, 12, color); + if (((y-1) == ys) && (xs >= 0)) { + sgtkx_drawing_view_drawfrect(widg, 56+xs*20, y * 12, 16, 12, color - 0x181818); + sgtkx_drawing_view_drawfrect(widg, 376+xs*8, y * 12, 8, 12, color - 0x181818); + } + + if (pp >= 0x2100) continue; + sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%04X:", pp); + for (x=0; x<16; x++) { + dat = MinxCPU_OnRead(0, pp); + sdat = (dat < 0x01) ? '.' : dat; + watch = PMD_TrapPoints[pp & PM_ROM_Mask] & TRAPPOINT_WATCH; + if (watch) { + sgtkx_drawing_view_drawfrect(widg, 56 + x * 20, y * 12, 16, 12, AnyView_TrapColor[watch]); + } + sgtkx_drawing_view_drawtext(widg, 56 + x * 20, y * 12, 0x4C4C00, "%02X", (int)dat); + sgtkx_drawing_view_drawchar(widg, 376 + x * 8, y * 12, 0x304C00, sdat); + pp++; + } + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + pp = spp + ys * 16 + xs; + if ((ys >= 0) && (pp < 0x2100)) { + dat = MinxCPU_OnRead(0, pp); + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Hardware I/O [ $%04X => $%02X, %i ]", pp, dat, dat); + } else { + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Hardware I/O"); + } + + return 1; +} + +// Hardware IO view button press +static int IOView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int pp, xs = -1, ys = -1; + uint8_t val; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + if ((widg->mousex >= 56) && (widg->mousex < 376)) { + xs = (widg->mousex - 56) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 376) && (widg->mousex < 504)) { + xs = (widg->mousex - 376) / 8; + ys = (widg->mousey - 12) / 12; + } else return 0; + + set_emumode(EMUMODE_STOP, 1); + + // Process selected item + pp = widg->sboffset * 16 + 0x2000 + ys * 16 + xs; + if (button == SGTKXDV_BLEFT) { + if (pp < 0x2100) { + AnyView_NewValue_CD[1].number = (int)MinxCPU_OnRead(0, pp); + AnyView_NewValue_CD[3].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHREAD; + AnyView_NewValue_CD[4].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHWRITE; + sprintf(AnyView_NewValue_CD[0].text, "Set new value for $%04X:", pp); + if (CustomDialog(MainWindow, "Change Hardware IO", AnyView_NewValue_CD)) { + MinxCPU_OnWrite(0, pp, AnyView_NewValue_CD[1].number); + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + if (AnyView_NewValue_CD[3].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHREAD; + if (AnyView_NewValue_CD[4].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHWRITE; + refresh_debug(1); + } + } + } else if (button == SGTKXDV_BMIDDLE) { + if (pp < 0x2100) { + val = PMD_TrapPoints[pp]; + switch (val & TRAPPOINT_WATCH) { + case 0: val = TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE: val = TRAPPOINT_WATCHREAD; break; + case TRAPPOINT_WATCHREAD: val = TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHWRITE: val = 0; break; + } + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[pp] |= val; + refresh_debug(1); + } + } else if (button == SGTKXDV_BRIGHT) { + if (pp < 0x2100) { + val = PMD_TrapPoints[pp]; + switch (val & TRAPPOINT_WATCH) { + case TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE: val = 0; break; + case TRAPPOINT_WATCHREAD: val = TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHWRITE: val = TRAPPOINT_WATCHREAD; break; + case 0: val = TRAPPOINT_WATCHWRITE; break; + } + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[pp] |= val; + refresh_debug(1); + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// EEPROM view exposure event +static int EEPROMView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + uint8_t dat, sdat; + int x, y, pp, spp; + int yc, xs = -1, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + if ((widg->mousex >= 56) && (widg->mousex < 376)) { + xs = (widg->mousex - 56) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 376) && (widg->mousex < 504)) { + xs = (widg->mousex - 376) / 8; + ys = (widg->mousey - 12) / 12; + } + } + + // Draw content + pp = spp = widg->sboffset * 16; + for (y=1; ywidth, 12, color); + if (((y-1) == ys) && (xs >= 0)) { + sgtkx_drawing_view_drawfrect(widg, 56+xs*20, y * 12, 16, 12, color - 0x181818); + sgtkx_drawing_view_drawfrect(widg, 376+xs*8, y * 12, 8, 12, color - 0x181818); + } + + if (pp >= 0x2000) continue; + sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%04X:", pp); + for (x=0; x<16; x++) { + dat = EEPROM[pp & 8191]; + sdat = (dat < 0x01) ? '.' : dat; + sgtkx_drawing_view_drawtext(widg, 56 + x * 20, y * 12, 0x4C4C00, "%02X", (int)dat); + sgtkx_drawing_view_drawchar(widg, 376 + x * 8, y * 12, 0x304C00, sdat); + pp++; + } + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + pp = spp + ys * 16 + xs; + if (ys >= 0) { + dat = EEPROM[pp & 8191]; + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "EEPROM Content [ $%04X => $%02X, %i ]", pp, dat, dat); + } else { + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "EEPROM Content"); + } + + return 1; +} + +// EEPROM view button press +static int EEPROMView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int pp, val; + int xs = -1, ys = -1; + char tmp[64]; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + if ((widg->mousex >= 56) && (widg->mousex < 376)) { + xs = (widg->mousex - 56) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 376) && (widg->mousex < 504)) { + xs = (widg->mousex - 376) / 8; + ys = (widg->mousey - 12) / 12; + } else return 0; + + set_emumode(EMUMODE_STOP, 1); + + // Process selected item + pp = widg->sboffset * 16 + ys * 16 + xs; + if (button == SGTKXDV_BLEFT) { + if (pp < 0x2000) { + sprintf(tmp, "Set new value for $%04X:", pp); + if (EnterNumberDialog(MainWindow, "Change EEPROM", tmp, &val, (int)EEPROM[pp & 8191], 2, 1, -255, 255)) { + EEPROM[pp & 8191] = val; + refresh_debug(1); + } + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +void AnyView_DrawBackground(SGtkXDrawingView *widg, int width, int height, int zoom) +{ + uint32_t *scanptr; + int x, y, xp, yp; + + // Sane size + if ((width <= 0) || (width >= widg->width)) width = widg->width; + if ((height <= 0) || (height >= widg->height)) height = widg->height; + + // Draw pattern + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + scanptr[x] = ((yp ^ xp) & 1) ? 0x808080 : 0x404040; + } + } +} + +void AnyView_DrawDisableMask(SGtkXDrawingView *widg) +{ + uint32_t *scanptr; + int x, y; + + // Draw mask + for (y=0; yheight; y++) { + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + if ((y ^ x) & 1) scanptr[x] = 0x808080; + } + } +} + +uint32_t AnyView_TrapColor[8] = { + 0x000000, // No Watch + 0x000000, // No Watch (trace over) + 0xE02000, // Watch Read + 0xFF8040, // Watch Read (trace over) + 0x20E000, // Watch Write + 0x80FF40, // Watch Write (trace over) + 0xE0D000, // Watch RW + 0xFFE040, // Watch RW (trace over) +}; + +GtkXCustomDialog AnyView_NewValue_CD[] = { + {GTKXCD_LABEL, "Set new value for $XXXX:"}, + {GTKXCD_NUMIN, "", 0, 2, 1, -255, 255}, + {GTKXCD_LABEL, "Prefix \"$\" for hexadecimal numbers"}, + {GTKXCD_CHECK, "Watchpoint Read access", 1}, + {GTKXCD_CHECK, "Watchpoint Write access", 1}, + {GTKXCD_LABEL, "Warning: Watchpoints are only triggered at\nthe end of the instruction causing it."}, + {GTKXCD_EOL, ""} +}; + +GtkXCustomDialog AnyView_AddWPAt_CD[] = { + {GTKXCD_LABEL, "Watchpoint address:"}, + {GTKXCD_NUMIN, "", 0, 6, 1, 0, 2097151}, + {GTKXCD_LABEL, "Watchpoint size:"}, + {GTKXCD_NUMIN, "", 1, 2, 0, 0, 2097151}, + {GTKXCD_LABEL, "Prefix \"$\" for hexadecimal numbers"}, + {GTKXCD_CHECK, "Read access", 1}, + {GTKXCD_CHECK, "Write access", 1}, + {GTKXCD_LABEL, "Warning: Watchpoints are only triggered at\nthe end of the instruction causing it."}, + {GTKXCD_EOL, ""} +}; + +static GtkXCustomDialog CPUWindow_GotoCartIRQ_CD[] = { + {GTKXCD_LABEL, "Go to cartridge IRQ:"}, + {GTKXCD_COMBO, "", 0, 27, 0, 0, 0, CartridgeIRQVectStr}, + {GTKXCD_CHECK, "Decode address from IRQ code", 1}, + {GTKXCD_EOL, ""} +}; + +int AnyView_scroll(SGtkXDrawingView *widg, int value, int min, int max) +{ + return (emumode == EMUMODE_STOP); +} + +int AnyView_resize(SGtkXDrawingView *widg, int width, int height, int _c) +{ + widg->total_lines = height / 12; + sgtkx_drawing_view_sbpage(widg, widg->total_lines - 1, widg->total_lines - 2); + + return (emumode == EMUMODE_STOP); +} + +int AnyView_enterleave(SGtkXDrawingView *widg, int inside, int _b, int _c) +{ + return (emumode == EMUMODE_STOP); +} + +int AnyView_motion(SGtkXDrawingView *widg, int x, int y, int _c) +{ + return (emumode == EMUMODE_STOP); +} + +// -------------- +// Menu callbacks +// -------------- + +void CPUWindow_AddMinOnRecent(const char *filename) +{ + int i, x; + for (x=0; x<9; x++) { + if (!strcmp(filename, dclc_recent[x])) break; + } + if (x == 10) { + // Not found, shift down + for (i=8; i>=0; i--) { + strcpy(dclc_recent[i+1], dclc_recent[i]); + } + } else if (x == 0) { + // Last loaded, do nothing + return; + } else { + // Found at x, shift middle + for (i=x-1; i>=0; i--) { + strcpy(dclc_recent[i+1], dclc_recent[i]); + } + } + strcpy(dclc_recent[0], filename); +} + +static void CPUWindow_CheckDirtyROM(void) +{ + char tmp[PMTMPV]; + if (clc_fullscreen) return; // Dialog + Fullscreen = Hazard + if (PM_MM_Dirty) { + if (YesNoDialog(MainWindow, "ROM has been changed by Flash I/O, save MIN?", "ROM changed", GTK_MESSAGE_QUESTION, NULL)) { + if (SaveFileDialogEx(MainWindow, "Save MIN", tmp, CommandLine.min_file, "MIN Rom (*.min)\0*.min\0All (*.*)\0*.*\0", 0)) { + if (ExtensionCheck(tmp, ".zip")) { + RemoveExtension(tmp); + strcat(tmp, ".min"); + } + if (!PokeMini_SaveMINFile(tmp)) { + MessageDialog(MainWindow, "Error saving ROM", "MIN save error", GTK_MESSAGE_ERROR, NULL); + } + PM_MM_Dirty = 0; + } + } + } +} + +static void Menu_File_OpenMIN(GtkWidget *widget, gpointer data) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + if (OpenFileDialogEx(MainWindow, "Open MIN", tmp, CommandLine.min_file, "ZIP Package or MIN Rom (*.zip;*.min)\0*.zip;*.min\0ZIP Package (*.zip)\0*.zip\0MIN Rom (*.min)\0*.min\0All (*.*)\0*.*\0", 0)) { + if (!ExtensionCheck(tmp, ".zip") && !ExtensionCheck(tmp, ".min") && !ExtensionCheck(tmp, ".minc")) { + if (!YesNoDialog(MainWindow, "File extension should be .zip or .min, continue?", "File Extension", GTK_MESSAGE_QUESTION, NULL)) { + set_emumode(EMUMODE_RESTORE, 1); + return; + } + } + CPUWindow_CheckDirtyROM(); + if (!PokeMini_LoadROM(tmp)) { + MessageDialog(MainWindow, "Error loading ROM", "MIN load error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + strcpy(CommandLine.rom_dir, PokeMini_CurrDir); + CPUWindow_AddMinOnRecent(CommandLine.min_file); + ExtractPath(tmp, 0); + PokeMini_SetCurrentDir(tmp); + CPUWindow_UpdateConfigs(); + PokeMini_ApplyChanges(); + set_emumode(EMUMODE_RESTORE, 1); + switch (clc_autorun) { + case 1: set_emumode(EMUMODE_RUNFULL, 0); break; + case 2: set_emumode(EMUMODE_RUNDEBFRAMESND, 0); break; + case 3: set_emumode(EMUMODE_RUNDEBFRAME, 0); break; + } + } else set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_File_OpenBIOS(GtkWidget *widget, gpointer data) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + if (OpenFileDialogEx(MainWindow, "Open BIOS", tmp, CommandLine.bios_file, "MIN Rom (*.min)\0*.min\0All (*.*)\0*.*\0", 0)) { + if (!ExtensionCheck(tmp, ".min")) { + if (!YesNoDialog(MainWindow, "File extension should be .min, continue?", "File Extension", GTK_MESSAGE_QUESTION, NULL)) { + set_emumode(EMUMODE_RESTORE, 1); + return; + } + } + if (YesNoDialog(MainWindow, "Loading new BIOS will reset emulation\nContinue?", "Open BIOS", GTK_MESSAGE_QUESTION, NULL)) { + if (!PokeMini_LoadBIOSFile(tmp)) { + MessageDialog(MainWindow, "Error loading BIOS\nReverting to FreeBIOS", "BIOS load error", GTK_MESSAGE_ERROR, NULL); + PokeMini_LoadFreeBIOS(); + return; + } + strcpy(CommandLine.bios_file, tmp); + PokeMini_Reset(0); + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_File_ReloadMIN(GtkWidget *widget, gpointer data) +{ + if (clc_fullscreen) return; // Dialog + Fullscreen = Hazard + set_emumode(EMUMODE_STOP, 1); + if (!StringIsSet(CommandLine.min_file)) { + Menu_File_OpenMIN(widget, data); + } else { + CPUWindow_CheckDirtyROM(); + if (!PokeMini_LoadROM(CommandLine.min_file)) { + MessageDialog(MainWindow, "Error loading ROM", "MIN load error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + } + CPUWindow_AddMinOnRecent(CommandLine.min_file); + CPUWindow_UpdateConfigs(); + PokeMini_ApplyChanges(); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_File_FreeBIOS(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 1); + if (YesNoDialog(MainWindow, "Loading FreeBIOS will reset emulation\nContinue?", "FreeBIOS", GTK_MESSAGE_QUESTION, NULL)) { + PokeMini_LoadFreeBIOS(); + CommandLine.bios_file[0] = 0; + PokeMini_Reset(0); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_File_Autorun(GtkWidget *widget, gpointer data) +{ + int index = (int)data; + clc_autorun = index; +} + +static void Menu_File_OpenColor(GtkWidget *widget, gpointer data) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + sprintf(tmp, "%sc", CommandLine.min_file); + if (OpenFileDialogEx(MainWindow, "Open Color Info", tmp, tmp, "Color Info (*.minc)\0*.minc\0All (*.*)\0*.*\0", 0)) { + if (!ExtensionCheck(tmp, ".minc")) { + if (!YesNoDialog(MainWindow, "File extension should be .minc, continue?", "File Extension", GTK_MESSAGE_QUESTION, NULL)) { + set_emumode(EMUMODE_RESTORE, 1); + return; + } + } + if (!PokeMini_LoadColorFile(tmp)) { + MessageDialog(MainWindow, "Error loading color info", "Color Info load error", GTK_MESSAGE_ERROR, NULL); + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_File_ReloadColor(GtkWidget *widget, gpointer data) +{ + if (clc_fullscreen) return; // Dialog + Fullscreen = Hazard + set_emumode(EMUMODE_STOP, 1); + if (ExtensionCheck(ColorInfoFile, ".zip")) { + MessageDialog(MainWindow, "Cannot reload color file from a ZIP package", "Color Info load error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + if (!StringIsSet(ColorInfoFile)) { + MessageDialog(MainWindow, "Error loading color info", "Color Info load error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + if (!PokeMini_LoadColorFile(ColorInfoFile)) { + MessageDialog(MainWindow, "Error reloading color info", "Color Info load error", GTK_MESSAGE_ERROR, NULL); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Capt_Snapshot1x(GtkWidget *widget, gpointer data) +{ + char filename[PMTMPV]; + cairo_surface_t *surface; + uint32_t *imgptr = NULL; + cairo_status_t cairerr; + FILE *capf; + int y; + + set_emumode(EMUMODE_STOP, 1); + if (SaveFileDialogEx(MainWindow, "Save snapshot (1x preview)", filename, "snapshot.png", "PNG (*.png)\0*.png\0BMP (*.bmp)\0*.bmp\0", 0)) { + surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 96, 64); + imgptr = (uint32_t *)cairo_image_surface_get_data(surface); + PokeMini_VideoPreview_32(imgptr, 96, PokeMini_LCDMode); + if (ExtensionCheck(filename, ".png")) { + cairerr = cairo_surface_write_to_png(surface, filename); + if (cairerr == CAIRO_STATUS_SUCCESS) { + Add_InfoMessage("[Info] Snapshot saved to '%s'\n", filename); + } else if (cairerr == CAIRO_STATUS_NO_MEMORY) { + MessageDialog(MainWindow, "No enough memory!", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } else if (cairerr == CAIRO_STATUS_SURFACE_TYPE_MISMATCH) { + MessageDialog(MainWindow, "Surface mismatch", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } else if (cairerr == CAIRO_STATUS_WRITE_ERROR) { + MessageDialog(MainWindow, "Write I/O error", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } + } else if (ExtensionCheck(filename, ".bmp")) { + capf = Open_ExportBMP(filename, 96, 64); + if (!capf) { + MessageDialog(MainWindow, "Open failed", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&imgptr[(63-y) * 96], 96); + } + Close_ExportBMP(capf); + Add_InfoMessage("[Info] Snapshot saved to '%s'\n", filename); + } else { + MessageDialog(MainWindow, "Unsupported extension", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } + cairo_surface_destroy(surface); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Capt_SnapshotLCD(GtkWidget *widget, gpointer data) +{ + char filename[PMTMPV]; + cairo_surface_t *surface; + uint32_t *imgptr = NULL; + cairo_status_t cairerr; + FILE *capf; + int w, h, y; + + w = 96 * PMZoom; + h = 64 * PMZoom; + set_emumode(EMUMODE_STOP, 1); + if (SaveFileDialogEx(MainWindow, "Save snapshot (from LCD)", filename, "snapshot.png", "PNG (*.png)\0*.png\0BMP (*.bmp)\0*.bmp\0", 0)) { + surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, w, h); + imgptr = (uint32_t *)cairo_image_surface_get_data(surface); + PokeMini_VideoBlit32(imgptr, w); + if (ExtensionCheck(filename, ".png")) { + cairerr = cairo_surface_write_to_png(surface, filename); + if (cairerr == CAIRO_STATUS_SUCCESS) { + Add_InfoMessage("[Info] Snapshot saved to '%s'\n", filename); + } else if (cairerr == CAIRO_STATUS_NO_MEMORY) { + MessageDialog(MainWindow, "No enough memory!", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } else if (cairerr == CAIRO_STATUS_SURFACE_TYPE_MISMATCH) { + MessageDialog(MainWindow, "Surface mismatch", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } else if (cairerr == CAIRO_STATUS_WRITE_ERROR) { + MessageDialog(MainWindow, "Write I/O error", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + } + } else if (ExtensionCheck(filename, ".bmp")) { + capf = Open_ExportBMP(filename, w, h); + if (!capf) { + MessageDialog(MainWindow, "Open failed", "Save snapshot error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + for (y=0; y= 0x8000) val = (MinxCPU.PC.B.I << 15) | (val & 0x7FFF); + sgtkx_drawing_view_sbminmax(&ProgramView, 0, PM_ROM_Size-1); + sgtkx_drawing_view_sbvalue(&ProgramView, val); + } else { + if (val >= 0x8000) val = 0x8000 | (val & 0x7FFF); + if (PM_ROM_Size <= 65535) sgtkx_drawing_view_sbminmax(&ProgramView, 0, PM_ROM_Size-1); + else sgtkx_drawing_view_sbminmax(&ProgramView, 0, 65535); + sgtkx_drawing_view_sbvalue(&ProgramView, val); + } + refresh_debug(1); +} + +static void Menu_Debug_FollowPC(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/Follow PC"); + dclc_followPC = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); +} + +static void Menu_Debug_FollowSP(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/Follow SP"); + dclc_followSP = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); +} + +static void Menu_Debug_GotoProgAddr(GtkWidget *widget, gpointer data) +{ + int addr = PhysicalPC(); + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Go to program address...", "Go to program address:", &addr, addr, 6, 1, 0, PM_ROM_Size-1)) { + ProgramView_GotoAddr(addr, 1); + refresh_debug(1); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Debug_GotoRAMAddr(GtkWidget *widget, gpointer data) +{ + int addr = 0x1000 + (RAMView.sboffset * 16); + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Go to RAM address...", "Go to RAM address:", &addr, addr, 4, 1, 0x1000, 0x1FFF)) { + RAMView_GotoAddr(addr, 1); + refresh_debug(1); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Debug_GotoBIOSIRQ(GtkWidget *widget, gpointer data) +{ + uint32_t addr; + int irq; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Go to IRQ...", "Go to IRQ:", &irq, 0, 2, 0, 0, 127)) { + addr = (PM_BIOS[irq*2+1] << 8) | PM_BIOS[irq*2]; + ProgramView_GotoAddr(addr, 1); + refresh_debug(1); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Debug_GotoCartIRQ(GtkWidget *widget, gpointer data) +{ + uint32_t addr; + uint16_t laddr; + uint8_t dat, haddr; + int result, aoff; + + set_emumode(EMUMODE_STOP, 1); + + result = CustomDialog(MainWindow, "Go to cartridge IRQ", CPUWindow_GotoCartIRQ_CD); + if (result == 1) { + if (CPUWindow_GotoCartIRQ_CD[2].number) { + // Decode + haddr = 0; + laddr = 0; + addr = CartridgeIRQVectAddr[CPUWindow_GotoCartIRQ_CD[1].number]; + + // Try to decode a few instructions + for (aoff = 0; aoff < 6; ) { + dat = MinxCPU_OnRead(0, addr + aoff); + if (aoff++ == 6) break; + if (dat == 0xCE) { + // EXPAND + dat = MinxCPU_OnRead(0, addr + aoff); + if (aoff++ == 6) break; + if (dat == 0xC4) { + // MOV U, #nn + haddr = MinxCPU_OnRead(0, addr + aoff); + if (aoff++ == 6) break; + } + } else if (dat == 0xF1) { + // JMPb @nn + laddr = MinxCPU_OnRead(0, addr + aoff); + if (aoff++ == 6) break; + if (laddr & 0x80) laddr |= 0xFF00; + laddr = addr + aoff + laddr - 1; + addr = (haddr << 16) | laddr; + break; + } else if (dat == 0xF3) { + // JMPw @nnnn + laddr = MinxCPU_OnRead(0, addr + aoff); + if (aoff++ == 6) break; + laddr |= MinxCPU_OnRead(0, addr + aoff) << 8; + if (aoff++ == 6) break; + laddr = addr + aoff + laddr - 1; + addr = (haddr << 16) | laddr; + break; + } else { + // RETI + break; + } + } + ProgramView_GotoAddr(addr, 1); + refresh_debug(1); + } else { + // Don't decode + addr = CartridgeIRQVectAddr[CPUWindow_GotoCartIRQ_CD[1].number]; + ProgramView_GotoAddr(addr, 1); + refresh_debug(1); + } + } else if (result == -1) { + MessageDialog(MainWindow, "Invalid number", "Manage data symbol", GTK_MESSAGE_ERROR, NULL); + } + + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Debug_GotoPC(GtkWidget *widget, gpointer data) +{ + ProgramView_GotoAddr(PhysicalPC(), 0); +} + +static void Menu_Debug_GotoSP(GtkWidget *widget, gpointer data) +{ + StackView_GotoSP(); +} + +static void Menu_DebPRC_ShowBG(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/PRC/Show Background"); + dclc_PRC_bg = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCRenderBD = !dclc_PRC_bg; + PRCRenderBG = dclc_PRC_bg; +} + +static void Menu_DebPRC_ShowSpr(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/PRC/Show Sprites"); + dclc_PRC_spr = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCRenderSpr = dclc_PRC_spr; +} + +static void Menu_DebPRC_StallCPU(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/PRC/Stall CPU"); + dclc_PRC_stallcpu = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCAllowStall = dclc_PRC_stallcpu; +} + +static void Menu_DebPRC_StallCycles(GtkWidget *widget, gpointer data) +{ + int val; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Stall Idle Cycles", "Number of idle cycles on stall:", &val, StallCycles, 2, 0, 8, 64)) { + StallCycles = val; + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Debug_IRQCall(GtkWidget *widget, gpointer data) +{ + int val; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "IRQ Call...", "IRQ call vector:", &val, (int)0, 2, 1, 0, 127)) { + MinxCPU.Status = MINX_STATUS_IRQ; + MinxCPU.IRQ_Vector = (val & 0x7F) << 1; + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_Debug_RunFull(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_RUNFULL, 0); +} + +void Menu_Debug_RunDFrameSnd(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_RUNDEBFRAMESND, 0); +} + +void Menu_Debug_RunDFrame(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_RUNDEBFRAME, 0); +} + +void Menu_Debug_RunDStep(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_RUNDEBSTEP, 0); +} + +void Menu_Debug_SingleFrame(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_FRAME, 0); +} + +void Menu_Debug_SingleStep(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STEP, 0); +} + +void Menu_Debug_StepSkip(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STEPSKIP, 0); +} + +void Menu_Debug_Stop(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 0); +} + +static void Menu_Debug_ResetHard(GtkWidget *widget, gpointer data) +{ + Add_InfoMessage("[Info] Emulator has been hard reset (Full)\n"); + PokeMini_Reset(1); + refresh_debug(1); +} + +static void Menu_Debug_ResetSoft(GtkWidget *widget, gpointer data) +{ + Add_InfoMessage("[Info] Emulator has been soft reset (Partial)\n"); + PokeMini_Reset(0); + refresh_debug(1); +} + +static void Menu_Break_EnableBP(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Break/Enable breakpoints"); + PMD_EnableBreakpoints = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); +} + +static void Menu_Break_AddBPAt(GtkWidget *widget, gpointer data) +{ + int addr = PhysicalPC(); + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Add breakpoint at...", "Breakpoint address:", &addr, addr, 6, 1, 0, PM_ROM_Size-1)) { + if ((addr < 0) || (addr >= PM_ROM_Size)) { + MessageDialog(MainWindow, "Address out of range", "Add breakpoint at...", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + PMD_TrapPoints[addr] |= TRAPPOINT_BREAK; + refresh_debug(1); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Break_DelBPAt(GtkWidget *widget, gpointer data) +{ + int addr = PhysicalPC(); + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Delete breakpoint at...", "Breakpoint address:", &addr, addr, 6, 1, 0, PM_ROM_Size-1)) { + PMD_TrapPoints[addr] &= ~TRAPPOINT_BREAK; + refresh_debug(1); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Break_DelAllBP(GtkWidget *widget, gpointer data) +{ + int i; + for (i=0; i= PM_ROM_Size)) { + MessageDialog(MainWindow, "Address out of range", "Add watchpoint at...", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + PMD_TrapPoints[num] &= ~TRAPPOINT_WATCH; + if (AnyView_AddWPAt_CD[5].number) PMD_TrapPoints[num] |= TRAPPOINT_WATCHREAD; + if (AnyView_AddWPAt_CD[6].number) PMD_TrapPoints[num] |= TRAPPOINT_WATCHWRITE; + } + refresh_debug(1); + } + + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Break_DelAllWP(GtkWidget *widget, gpointer data) +{ + int i; + for (i=0; i= 0) { + dclc_cpuwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MainWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_cpuwin_refresh, 4, 0, 0, 1000)) { + dclc_cpuwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static void Menu_Help_CommandLine(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 1); + display_commandline(); + set_emumode(EMUMODE_RESTORE, 1); +} + +static void Menu_Help_Documentation(GtkWidget *widget, gpointer data) +{ + HelpLaunchDoc("index"); +} + +static void Menu_Help_VisitWebsite(GtkWidget *widget, gpointer data) +{ + HelpLaunchURL(WebsiteTxt); +} + +static void Menu_Help_About(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 1); + MessageDialog(MainWindow, AboutTxt, "About...", GTK_MESSAGE_INFO, PokeMiniIcon_96x128); + set_emumode(EMUMODE_RESTORE, 1); +} + +static gint MainWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + set_emumode(EMUMODE_STOP, 0); + emurunning = 0; + + return TRUE; +} + +static gboolean MainWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) MainWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static void MainWindow_drag_data_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, gpointer data) +{ + char tmp[PMTMPV], *ptr = NULL; + gchar **urilist; + + // Must contain data + if((selection_data == NULL) || (selection_data->length < 0)) { + gtk_drag_finish(context, FALSE, FALSE, time); + return; + } + + // Get URI convert to filename + urilist = gtk_selection_data_get_uris(selection_data); + if (urilist[0]) { + ptr = g_filename_from_uri(urilist[0], NULL, NULL); + } + g_strfreev(urilist); + if (!ptr) { + gtk_drag_finish(context, FALSE, FALSE, time); + return; + } + strncpy(tmp, ptr, PMTMPV); + tmp[PMTMPV-1] = 0; + g_free(ptr); + gtk_drag_finish(context, TRUE, FALSE, time); + + set_emumode(EMUMODE_STOP, 1); + if (!ExtensionCheck(tmp, ".zip") && !ExtensionCheck(tmp, ".min") && !ExtensionCheck(tmp, ".minc")) { + if (!YesNoDialog(MainWindow, "File extension should be .zip or .min, continue?", "File Extension", GTK_MESSAGE_QUESTION, NULL)) { + set_emumode(EMUMODE_RESTORE, 1); + return; + } + } + CPUWindow_CheckDirtyROM(); + if (!PokeMini_LoadROM(tmp)) { + MessageDialog(MainWindow, "Error loading ROM", "MIN load error", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + CPUWindow_AddMinOnRecent(CommandLine.min_file); + ExtractPath(tmp, 0); + PokeMini_SetCurrentDir(tmp); + CPUWindow_UpdateConfigs(); + PokeMini_ApplyChanges(); + set_emumode(EMUMODE_RESTORE, 1); + switch (clc_autorun) { + case 1: set_emumode(EMUMODE_RUNFULL, 0); break; + case 2: set_emumode(EMUMODE_RUNDEBFRAMESND, 0); break; + case 3: set_emumode(EMUMODE_RUNDEBFRAME, 0); break; + } +} + +// Mod: 0 = None, 1 = Ctrl, 2 = Shift, 4 = Alt +TMenu_items_accel Menu_item_accel[] = { + { SDLK_o, 5, Menu_File_ReloadMIN }, + { SDLK_c, 5, Menu_File_ReloadColor }, + { SDLK_q, 1, Menu_File_Quit }, + { SDLK_F5, 0, Menu_Debug_RunFull }, + { SDLK_F5, 2, Menu_Debug_RunDFrameSnd }, + { SDLK_F5, 1, Menu_Debug_RunDFrame }, + { SDLK_F3, 1, Menu_Debug_RunDStep }, + { SDLK_F4, 0, Menu_Debug_SingleFrame }, + { SDLK_F3, 0, Menu_Debug_SingleStep }, + { SDLK_F3, 2, Menu_Debug_StepSkip }, + { SDLK_F2, 0, Menu_Debug_Stop }, + { SDLK_r, 1, Menu_Debug_ResetHard }, + { SDLK_r, 2, Menu_Debug_ResetSoft }, + { 0, 0, NULL } +}; +static GtkItemFactoryEntry CPUWindow_MenuItems[] = { + { "/_File", NULL, NULL, 0, "" }, + { "/File/Open _Min...", "O", Menu_File_OpenMIN, 0, "" }, + { "/File/Open _BIOS...", "B", Menu_File_OpenBIOS, 0, "" }, + { "/File/_Reload Min", "O", Menu_File_ReloadMIN, 0, "" }, + { "/File/Use internal _FreeBIOS", NULL, Menu_File_FreeBIOS, 0, "" }, + { "/File/Autorun/Disabled", NULL, Menu_File_Autorun, 0, "" }, + { "/File/Autorun/Run full speed", NULL, Menu_File_Autorun, 1, "/File/Autorun/Disabled" }, + { "/File/Autorun/Debug frames (Sound)", NULL, Menu_File_Autorun, 2, "/File/Autorun/Disabled" }, + { "/File/Autorun/Debug frames", NULL, Menu_File_Autorun, 3, "/File/Autorun/Disabled" }, + { "/File/sep0", NULL, NULL, 0, "" }, + { "/File/_Recent", NULL, NULL, 0, "" }, + { "/File/Recent/ROM0", "1",Menu_Recent_Run, 0, "" }, + { "/File/Recent/ROM1", "2",Menu_Recent_Run, 1, "" }, + { "/File/Recent/ROM2", "3",Menu_Recent_Run, 2, "" }, + { "/File/Recent/ROM3", "4",Menu_Recent_Run, 3, "" }, + { "/File/Recent/ROM4", "5",Menu_Recent_Run, 4, "" }, + { "/File/Recent/ROM5", "6",Menu_Recent_Run, 5, "" }, + { "/File/Recent/ROM6", "7",Menu_Recent_Run, 6, "" }, + { "/File/Recent/ROM7", "8",Menu_Recent_Run, 7, "" }, + { "/File/Recent/ROM8", "9",Menu_Recent_Run, 8, "" }, + { "/File/Recent/ROM9", "0",Menu_Recent_Run, 9, "" }, + { "/File/Recent/sep1", NULL, NULL, 0, "" }, + { "/File/Recent/Clear List", NULL, Menu_Recent_Clear, 0, "" }, + { "/File/sep1", NULL, NULL, 0, "" }, + { "/File/_Load state...", NULL, Menu_File_LoadState, 0, "" }, + { "/File/_Save state...", NULL, Menu_File_SaveState, 0, "" }, + { "/File/sep2", NULL, NULL, 0, "" }, + { "/File/Open _Color Info...", "C",Menu_File_OpenColor, 0, "" }, + { "/File/Reload _Color Info", "C",Menu_File_ReloadColor, 0, "" }, + { "/File/sep3", NULL, NULL, 0, "" }, + { "/File/_Capture", NULL, NULL, 0, "" }, + { "/File/Capture/Snapshot 1x preview", NULL, Menu_Capt_Snapshot1x, 0, "" }, + { "/File/Capture/Snapshot from LCD", NULL, Menu_Capt_SnapshotLCD, 0, "" }, + { "/File/Capture/Sound (Start & Stop)", NULL, Menu_Capt_Sound, 0, "" }, + { "/File/Save _Min...", "S", Menu_File_SaveMIN, 0, "" }, + { "/File/Save _BIOS...", NULL, Menu_File_SaveBIOS, 0, "" }, + { "/File/sep4", NULL, NULL, 0, "" }, + { "/File/_Quit", "Q", Menu_File_Quit, 0, "" }, + + { "/_Options", NULL, NULL, 0, "" }, + { "/Options/_Zoom", NULL, NULL, 0, "" }, + { "/Options/Zoom/1x (96x64)", NULL, Menu_Options_Zoom, 1, "" }, + { "/Options/Zoom/2x (192x128)", NULL, Menu_Options_Zoom, 2, "/Options/Zoom/1x (96x64)" }, + { "/Options/Zoom/3x (288x192)", NULL, Menu_Options_Zoom, 3, "/Options/Zoom/1x (96x64)" }, + { "/Options/Zoom/4x (384x256)", NULL, Menu_Options_Zoom, 4, "/Options/Zoom/1x (96x64)" }, + { "/Options/Zoom/5x (480x320)", NULL, Menu_Options_Zoom, 5, "/Options/Zoom/1x (96x64)" }, + { "/Options/Zoom/6x (576x384)", NULL, Menu_Options_Zoom, 6, "/Options/Zoom/1x (96x64)" }, + { "/Options/_Bits-Per-Pixel", NULL, NULL, 0, "" }, + { "/Options/Bits-Per-Pixel/16 bpp", NULL, Menu_Options_BPP, 16, "" }, + { "/Options/Bits-Per-Pixel/32 bpp", NULL, Menu_Options_BPP, 32, "/Options/Bits-Per-Pixel/16 bpp" }, + { "/Options/_Palette", NULL, NULL, 0, "" }, + { "/Options/Palette/Default", NULL, Menu_Options_Palette, 0, "" }, + { "/Options/Palette/Old", NULL, Menu_Options_Palette, 1, "/Options/Palette/Default" }, + { "/Options/Palette/Black & White", NULL, Menu_Options_Palette, 2, "/Options/Palette/Default" }, + { "/Options/Palette/Green Palette", NULL, Menu_Options_Palette, 3, "/Options/Palette/Default" }, + { "/Options/Palette/Green Vector", NULL, Menu_Options_Palette, 4, "/Options/Palette/Default" }, + { "/Options/Palette/Red Palette", NULL, Menu_Options_Palette, 5, "/Options/Palette/Default" }, + { "/Options/Palette/Red Vector", NULL, Menu_Options_Palette, 6, "/Options/Palette/Default" }, + { "/Options/Palette/Blue LCD", NULL, Menu_Options_Palette, 7, "/Options/Palette/Default" }, + { "/Options/Palette/LED Backlight", NULL, Menu_Options_Palette, 8, "/Options/Palette/Default" }, + { "/Options/Palette/Girl Power", NULL, Menu_Options_Palette, 9, "/Options/Palette/Default" }, + { "/Options/Palette/Blue Palette", NULL, Menu_Options_Palette, 10, "/Options/Palette/Default" }, + { "/Options/Palette/Blue Vector", NULL, Menu_Options_Palette, 11, "/Options/Palette/Default" }, + { "/Options/Palette/Sepia", NULL, Menu_Options_Palette, 12, "/Options/Palette/Default" }, + { "/Options/Palette/Inverted B&W", NULL, Menu_Options_Palette, 13, "/Options/Palette/Default" }, + { "/Options/Palette/Custom 1", NULL, Menu_Options_Palette, 14, "/Options/Palette/Default" }, + { "/Options/Palette/Custom 2", NULL, Menu_Options_Palette, 15, "/Options/Palette/Default" }, + { "/Options/_LCD Mode", NULL, NULL, 0, "" }, + { "/Options/LCD Mode/Analog", NULL, Menu_Options_LCDMode, 0, "" }, + { "/Options/LCD Mode/3-Shades", NULL, Menu_Options_LCDMode, 1, "/Options/LCD Mode/Analog" }, + { "/Options/LCD Mode/2-Shades", NULL, Menu_Options_LCDMode, 2, "/Options/LCD Mode/Analog" }, + { "/Options/LCD Mode/Colors*", NULL, Menu_Options_LCDMode, 3, "/Options/LCD Mode/Analog" }, + { "/Options/LCD _Filter", NULL, NULL, 0, "" }, + { "/Options/LCD Filter/None", NULL, Menu_Options_LCDFilt, 0, "" }, + { "/Options/LCD Filter/Dot-Matrix", NULL, Menu_Options_LCDFilt, 1, "/Options/LCD Filter/None" }, + { "/Options/LCD Filter/50% Scanline", NULL, Menu_Options_LCDFilt, 2, "/Options/LCD Filter/None" }, + { "/Options/LCD _Contrast", NULL, NULL, 0, "" }, + { "/Options/LCD Contrast/Default", NULL, Menu_Options_LCDContrast, 64, "" }, + { "/Options/LCD Contrast/Lowest", NULL, Menu_Options_LCDContrast, 0, "/Options/LCD Contrast/Default" }, + { "/Options/LCD Contrast/Low", NULL, Menu_Options_LCDContrast, 25, "/Options/LCD Contrast/Default" }, + { "/Options/LCD Contrast/Medium", NULL, Menu_Options_LCDContrast, 50, "/Options/LCD Contrast/Default" }, + { "/Options/LCD Contrast/High", NULL, Menu_Options_LCDContrast, 75, "/Options/LCD Contrast/Default" }, + { "/Options/LCD Contrast/Highest", NULL, Menu_Options_LCDContrast, 100, "/Options/LCD Contrast/Default" }, + { "/Options/LCD Contrast/Custom...", NULL, Menu_Options_LCDContrast, -1, "" }, + { "/Options/LCD _Brightness", NULL, NULL, 0, "" }, + { "/Options/LCD Brightness/Default", NULL, Menu_Options_LCDBright, 0, "" }, + { "/Options/LCD Brightness/Lighter", NULL, Menu_Options_LCDBright, 24, "/Options/LCD Brightness/Default" }, + { "/Options/LCD Brightness/Light", NULL, Menu_Options_LCDBright, 12, "/Options/LCD Brightness/Default" }, + { "/Options/LCD Brightness/Dark", NULL, Menu_Options_LCDBright, -12, "/Options/LCD Brightness/Default" }, + { "/Options/LCD Brightness/Darker", NULL, Menu_Options_LCDBright, -24, "/Options/LCD Brightness/Default" }, + { "/Options/LCD Brightness/Custom...", NULL, Menu_Options_LCDBright, -200, "" }, + { "/Options/_Rumble Level", NULL, NULL, 0, "" }, + { "/Options/Rumble Level/None", NULL, Menu_Options_RumbleLvl, 0, "" }, + { "/Options/Rumble Level/Weak", NULL, Menu_Options_RumbleLvl, 1, "/Options/Rumble Level/None" }, + { "/Options/Rumble Level/Medium", NULL, Menu_Options_RumbleLvl, 2, "/Options/Rumble Level/None" }, + { "/Options/Rumble Level/Strong", NULL, Menu_Options_RumbleLvl, 3, "/Options/Rumble Level/None" }, + { "/Options/sep1", NULL, NULL, 0, "" }, + { "/Options/_Sound", NULL, NULL, 0, "" }, + { "/Options/Sound/Disabled", NULL, Menu_Options_Sound, 0, "" }, + { "/Options/Sound/Generated", NULL, Menu_Options_Sound, 1, "/Options/Sound/Disabled" }, + { "/Options/Sound/Direct", NULL, Menu_Options_Sound, 2, "/Options/Sound/Disabled" }, + { "/Options/Sound/Emulated", NULL, Menu_Options_Sound, 3, "/Options/Sound/Disabled" }, + { "/Options/Sound/Direct PWM", NULL, Menu_Options_Sound, 4, "/Options/Sound/Disabled" }, + { "/Options/Pie_zo Filter", NULL, Menu_Options_PiezoFilter, 0, "" }, + { "/Options/sep2", NULL, NULL, 0, "" }, + { "/Options/_Sync Cycles", NULL, NULL, 0, "" }, + { "/Options/Sync Cycles/ 8 (Accurancy)", NULL, Menu_Options_SyncCyc, 8, "" }, + { "/Options/Sync Cycles/ 16", NULL, Menu_Options_SyncCyc, 16, "/Options/Sync Cycles/ 8 (Accurancy)" }, + { "/Options/Sync Cycles/ 32", NULL, Menu_Options_SyncCyc, 32, "/Options/Sync Cycles/ 8 (Accurancy)" }, + { "/Options/Sync Cycles/ 64 (Performance)", NULL, Menu_Options_SyncCyc, 64, "/Options/Sync Cycles/ 8 (Accurancy)" }, + { "/Options/sep3", NULL, NULL, 0, "" }, + { "/Options/_Low Battery", NULL, Menu_Options_LowBatt, 0, "" }, + { "/Options/_RTC", NULL, NULL, 0, "" }, + { "/Options/RTC/No RTC", NULL, Menu_Options_RTC, 0, "" }, + { "/Options/RTC/State time difference", NULL, Menu_Options_RTC, 1, "/Options/RTC/No RTC" }, + { "/Options/RTC/RTC from Host", NULL, Menu_Options_RTC, 2, "/Options/RTC/No RTC" }, + { "/Options/Share _EEPROM", NULL, Menu_Options_ShareEEP, 0, "" }, + { "/Options/_Multicart", NULL, NULL, 0, "" }, + { "/Options/Multicart/Disabled", NULL, Menu_Options_Multicart, 0, "" }, + { "/Options/Multicart/Flash 512KB (AM29LV040B)",NULL, Menu_Options_Multicart, 1, "/Options/Multicart/Disabled" }, + { "/Options/Multicart/Lupin 512KB (AM29LV040B)",NULL, Menu_Options_Multicart, 2, "/Options/Multicart/Disabled" }, + { "/Options/Force Free_BIOS", NULL, Menu_Options_FreeBIOS, 0, "" }, + { "/Options/sep3", NULL, NULL, 0, "" }, + { "/Options/File association", NULL, NULL, 0, "" }, + { "/Options/File association/Register", NULL, Menu_FileAss_Reg, 0, "" }, + { "/Options/File association/Unregister", NULL, Menu_FileAss_Unreg, 0, "" }, + { "/Options/sep4", NULL, NULL, 0, "" }, + { "/Options/_Custom Palette Edit...", NULL, Menu_Options_PalEdit, 0, "" }, + { "/Options/Define _Keyboard...", NULL, Menu_Options_DefKeyboard, 0, "" }, + { "/Options/Define _Joystick...", NULL, Menu_Options_DefJoystick, 0, "" }, + { "/Options/_Update EEPROM", NULL, Menu_Options_UpdEEPROM, 0, "" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/_Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (_Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug _frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug _steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single _frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single _step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step s_kip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/_Stop", "F2", Menu_Debug_Stop, 0, "" }, + { "/Debugger/sep1", NULL, NULL, 0, "" }, + { "/Debugger/_Physical range", "P", Menu_Debug_FullRange, 0, "" }, + { "/Debugger/_Follow PC", "F", Menu_Debug_FollowPC, 0, "" }, + { "/Debugger/_Follow SP", "F", Menu_Debug_FollowSP, 0, "" }, + { "/Debugger/_Go to program address...", "G", Menu_Debug_GotoProgAddr, 0, "" }, + { "/Debugger/_Go to RAM address...", "G", Menu_Debug_GotoRAMAddr, 0, "" }, + { "/Debugger/_Go to BIOS IRQ...", NULL, Menu_Debug_GotoBIOSIRQ, 0, "" }, + { "/Debugger/_Go to cartridge IRQ...", "G", Menu_Debug_GotoCartIRQ, 0, "" }, + { "/Debugger/Go to _PC", "P", Menu_Debug_GotoPC, 0, "" }, + { "/Debugger/Go to _SP", "S", Menu_Debug_GotoSP, 0, "" }, + { "/Debugger/sep2", NULL, NULL, 0, "" }, + { "/Debugger/_PRC", NULL, NULL, 0, "" }, + { "/Debugger/PRC/Show _Background", NULL, Menu_DebPRC_ShowBG, 0, "" }, + { "/Debugger/PRC/Show _Sprites", NULL, Menu_DebPRC_ShowSpr, 0, "" }, + { "/Debugger/PRC/Stall _CPU", NULL, Menu_DebPRC_StallCPU, 0, "" }, + { "/Debugger/PRC/Stall _Cycles...", NULL, Menu_DebPRC_StallCycles, 0, "" }, + { "/Debugger/_IRQ call...", NULL, Menu_Debug_IRQCall, 0, "" }, + { "/Debugger/_Reset", NULL, NULL, 0, "" }, + { "/Debugger/Reset/_Soft (Partial)", "R", Menu_Debug_ResetSoft, 0, "" }, + { "/Debugger/Reset/_Hard (Full)", "R", Menu_Debug_ResetHard, 0, "" }, + + { "/_Break", NULL, NULL, 0, "" }, + { "/Break/_Enable breakpoints", "B",Menu_Break_EnableBP, 0, "" }, + { "/Break/_Add breakpoint at...", "B", Menu_Break_AddBPAt, 0, "" }, + { "/Break/_Delete breakpoint at...", "B",Menu_Break_DelBPAt, 0, "" }, + { "/Break/_Delete all breakpoints", NULL, Menu_Break_DelAllBP, 0, "" }, + { "/Break/sep1", NULL, NULL, 0, "" }, + { "/Break/_Enable watchpoints", "W",Menu_Break_EnableWP, 0, "" }, + { "/Break/_Add Watchpoint at...", "W", Menu_Break_AddWPAt, 0, "" }, + { "/Break/_Delete all watchpoints", NULL, Menu_Break_DelAllWP, 0, "" }, + { "/Break/sep1", NULL, NULL, 0, "" }, + { "/Break/_Enable exceptions", NULL, Menu_Break_EnableEx, 0, "" }, + { "/Break/_Enable HALT break", NULL, Menu_Break_EnableHalt, 0, "" }, + { "/Break/_Enable STOP break", NULL, Menu_Break_EnableStop, 0, "" }, + + { "/_Viewers", NULL, NULL, 0, "" }, + { "/Viewers/_Memory View", "1", Menu_View_Memory, 0, "" }, + { "/Viewers/_PRC Tiles View", "2", Menu_View_PRCTiles, 0, "" }, + { "/Viewers/_PRC Map View", "3", Menu_View_PRCMap, 0, "" }, + { "/Viewers/_PRC Sprites View", "4", Menu_View_PRCSpr, 0, "" }, + { "/Viewers/_Timers View", "5", Menu_View_Timers, 0, "" }, + { "/Viewers/_Hardware IO View", "6", Menu_View_HardIO, 0, "" }, + { "/Viewers/_IRQ View", "7", Menu_View_IRQ, 0, "" }, + { "/Viewers/_Misc. View", "8", Menu_View_Misc, 0, "" }, + { "/Viewers/_Symbols List View", "9", Menu_View_Symb, 0, "" }, + { "/Viewers/_Run Trace View", "0", Menu_View_Trace, 0, "" }, + + { "/_External", NULL, NULL, 0, "" }, + { "/External/App1", "1", Menu_External_Run, 0, "" }, + { "/External/App2", "2", Menu_External_Run, 1, "" }, + { "/External/App3", "3", Menu_External_Run, 2, "" }, + { "/External/App4", "4", Menu_External_Run, 3, "" }, + { "/External/App5", "5", Menu_External_Run, 4, "" }, + { "/External/App6", "6", Menu_External_Run, 5, "" }, + { "/External/App7", "7", Menu_External_Run, 6, "" }, + { "/External/App8", "8", Menu_External_Run, 7, "" }, + { "/External/App9", "9", Menu_External_Run, 8, "" }, + { "/External/App10", "0", Menu_External_Run, 9, "" }, + { "/External/sep1", NULL, NULL, 0, "" }, + { "/External/Configure...", NULL, Menu_External_Conf, 0, "" }, + + { "/Messages/Enable _messages", NULL, NULL, 0, "" }, + { "/Messages/Enable messages/Breakpoints",NULL, Menu_Messages_BPMsg, 0, "" }, + { "/Messages/Enable messages/Watchpoints",NULL, Menu_Messages_WPMsg, 0, "" }, + { "/Messages/Enable messages/Exceptions", NULL, Menu_Messages_ExMsg, 0, "" }, + { "/Messages/Enable messages/HALT break", NULL, Menu_Messages_HaltMsg, 0, "" }, + { "/Messages/Enable messages/STOP break", NULL, Menu_Messages_StopMsg, 0, "" }, + { "/Messages/sep1", NULL, NULL, 0, "" }, + { "/Messages/_Enable debug output", NULL, Menu_Messages_EnableDbgOut, 0, "" }, + { "/Messages/_Auto-open debug output", NULL, Menu_Messages_AutoDbgOut, 0, "" }, + { "/Messages/sep2", NULL, NULL, 0, "" }, + { "/Messages/Clear _messages", NULL, Menu_Messages_ClearMsgs, 0, "" }, + { "/Messages/Clear debug _output", NULL, Menu_Messages_ClearDebugOut, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, Menu_Refresh_Now, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, Menu_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, Menu_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, Menu_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, Menu_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, Menu_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, Menu_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, Menu_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, Menu_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, Menu_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, Menu_Refresh, -1, "/Refresh/100% 72fps" }, + + { "/_Help", NULL, NULL, 0, "" }, + { "/Help/_Documentation", "F1", Menu_Help_Documentation, 0, "" }, + { "/Help/_Visit website", NULL, Menu_Help_VisitWebsite, 0, "" }, + { "/Help/sep1", NULL, NULL, 0, "" }, + { "/Help/_Command-line switches...", NULL, Menu_Help_CommandLine, 0, "" }, + { "/Help/_About...", NULL, Menu_Help_About, 0, "" }, +}; +static gint CPUWindow_MenuItemsNum = sizeof(CPUWindow_MenuItems) / sizeof(*CPUWindow_MenuItems); + +// Process menu item accelerator, execute callback and return if match +int ProcessMenuItemAccel(int key, int modifier, TMenu_items_accel *list) +{ + if (!list) return 0; + while (list->callback) { + if ((list->key == key) && (list->modifier == modifier)) { + list->callback(NULL, NULL); + return 1; + } + list++; + } + return 0; +} + +// ---------- +// CPU Window +// ---------- + +static GtkTargetEntry drag_target_list[] = { + { "text/uri-list", 0, 0 } +}; + +int CPUWindow_Create(void) +{ + // Window + MainWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(MainWindow), AppName); + gtk_widget_set_size_request(GTK_WIDGET(MainWindow), 500, 500); + gtk_window_set_default_size(MainWindow, 500, 500); + g_signal_connect(MainWindow, "delete_event", G_CALLBACK(MainWindow_delete_event), NULL); + g_signal_connect(MainWindow, "window-state-event", G_CALLBACK(MainWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(MainWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + gtk_drag_dest_set(GTK_WIDGET(MainWindow), GTK_DEST_DEFAULT_ALL, drag_target_list, 1, GDK_ACTION_COPY | GDK_ACTION_MOVE); + g_signal_connect(MainWindow, "drag-data-received", G_CALLBACK(MainWindow_drag_data_received), NULL); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, CPUWindow_MenuItemsNum, CPUWindow_MenuItems, NULL); + gtk_window_add_accel_group(MainWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Table on middle + MTable = GTK_TABLE(gtk_table_new(3, 2, FALSE)); + gtk_box_pack_start(VBox1, GTK_WIDGET(MTable), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MTable)); + + // Program View + ProgramView.on_exposure = SGtkXDVCB(ProgramView_exposure); + ProgramView.on_scroll = SGtkXDVCB(AnyView_scroll); + ProgramView.on_resize = SGtkXDVCB(ProgramView_resize); + ProgramView.on_motion = SGtkXDVCB(AnyView_motion); + ProgramView.on_buttonpress = SGtkXDVCB(ProgramView_buttonpress); + ProgramView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + ProgramView.total_lines = ProgramView.height / 12; + ProgramView_Table = (uint32_t *)malloc(ProgramView.total_lines * sizeof(uint32_t)); + sgtkx_drawing_view_new(&ProgramView, 1); + sgtkx_drawing_view_sbminmax(&ProgramView, 0, 0x001FFF); // $0000 to $1FFF + gtk_table_attach(MTable, GTK_WIDGET(ProgramView.box), 0, 1, 0, 2, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 2, 2); + gtk_widget_show(GTK_WIDGET(ProgramView.box)); + + // Registers View + RegistersView.on_exposure = SGtkXDVCB(RegistersView_exposure); + RegistersView.on_scroll = SGtkXDVCB(AnyView_scroll); + RegistersView.on_resize = SGtkXDVCB(AnyView_resize); + RegistersView.on_motion = SGtkXDVCB(AnyView_motion); + RegistersView.on_buttonpress = SGtkXDVCB(RegistersView_buttonpress); + RegistersView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&RegistersView, 0); + gtk_widget_set_size_request(GTK_WIDGET(RegistersView.box), 160, 252); + gtk_table_attach(MTable, GTK_WIDGET(RegistersView.box), 1, 2, 0, 1, GTK_FILL, GTK_FILL, 2, 2); + gtk_widget_show(GTK_WIDGET(RegistersView.box)); + + // Stack View + StackView.on_exposure = SGtkXDVCB(StackView_exposure); + StackView.on_scroll = SGtkXDVCB(AnyView_scroll); + StackView.on_resize = SGtkXDVCB(AnyView_resize); + StackView.on_motion = SGtkXDVCB(AnyView_motion); + StackView.on_buttonpress = SGtkXDVCB(StackView_buttonpress); + StackView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&StackView, 1); + sgtkx_drawing_view_sbminmax(&StackView, 0, 0xFFF); // $1000 to $FFF + gtk_widget_set_size_request(GTK_WIDGET(StackView.box), 160, 48); + gtk_table_attach(MTable, GTK_WIDGET(StackView.box), 1, 2, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 2, 2); + gtk_widget_show(GTK_WIDGET(StackView.box)); + + // RAM View + RAMView.on_exposure = SGtkXDVCB(RAMView_exposure); + RAMView.on_scroll = SGtkXDVCB(AnyView_scroll); + RAMView.on_resize = SGtkXDVCB(AnyView_resize); + RAMView.on_motion = SGtkXDVCB(AnyView_motion); + RAMView.on_buttonpress = SGtkXDVCB(RAMView_buttonpress); + RAMView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&RAMView, 1); + sgtkx_drawing_view_sbminmax(&RAMView, 0, 255); // $1000 to $1FFF + gtk_widget_set_size_request(GTK_WIDGET(RAMView.box), 192, 108); + gtk_widget_show(GTK_WIDGET(RAMView.box)); + + // IO View + IOView.on_exposure = SGtkXDVCB(IOView_exposure); + IOView.on_scroll = SGtkXDVCB(AnyView_scroll); + IOView.on_resize = SGtkXDVCB(AnyView_resize); + IOView.on_motion = SGtkXDVCB(AnyView_motion); + IOView.on_buttonpress = SGtkXDVCB(IOView_buttonpress); + IOView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&IOView, 1); + sgtkx_drawing_view_sbminmax(&IOView, 0, 15); // $2100 to $21FF + gtk_widget_set_size_request(GTK_WIDGET(IOView.box), 192, 108); + gtk_widget_show(GTK_WIDGET(IOView.box)); + + // EEPROM View + EEPROMView.on_exposure = SGtkXDVCB(EEPROMView_exposure); + EEPROMView.on_scroll = SGtkXDVCB(AnyView_scroll); + EEPROMView.on_resize = SGtkXDVCB(AnyView_resize); + EEPROMView.on_motion = SGtkXDVCB(AnyView_motion); + EEPROMView.on_buttonpress = SGtkXDVCB(EEPROMView_buttonpress); + EEPROMView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&EEPROMView, 1); + sgtkx_drawing_view_sbminmax(&EEPROMView, 0, 511); // $0000 to $1FFF + gtk_widget_set_size_request(GTK_WIDGET(EEPROMView.box), 192, 108); + gtk_widget_show(GTK_WIDGET(EEPROMView.box)); + + // Info Messages Text + EditInfoMsgBuf = GTK_TEXT_BUFFER(gtk_text_buffer_new(NULL)); + EditInfoMsg = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(EditInfoMsgBuf)); + gtk_text_view_set_editable(EditInfoMsg, FALSE); + gtk_text_view_set_cursor_visible(EditInfoMsg, FALSE); + gtk_widget_show(GTK_WIDGET(EditInfoMsg)); + EditInfoMsgSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(EditInfoMsgSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(EditInfoMsgSW), GTK_WIDGET(EditInfoMsg)); + gtk_widget_show(GTK_WIDGET(EditInfoMsgSW)); + + // Info Debug Text + EditInfoDebugBuf = GTK_TEXT_BUFFER(gtk_text_buffer_new(NULL)); + EditInfoDebug = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(EditInfoDebugBuf)); + gtk_widget_show(GTK_WIDGET(EditInfoDebug)); + EditInfoDebugSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(EditInfoDebugSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(EditInfoDebugSW), GTK_WIDGET(EditInfoDebug)); + gtk_widget_show(GTK_WIDGET(EditInfoDebugSW)); + + // Bottom Notebook + BottomNB = GTK_NOTEBOOK(gtk_notebook_new()); + gtk_table_attach(MTable, GTK_WIDGET(BottomNB), 0, 2, 2, 3, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 2); + gtk_notebook_append_page(GTK_NOTEBOOK(BottomNB), GTK_WIDGET(RAMView.box), gtk_label_new("RAM")); + gtk_notebook_append_page(GTK_NOTEBOOK(BottomNB), GTK_WIDGET(IOView.box), gtk_label_new("Hard. I/O")); + gtk_notebook_append_page(GTK_NOTEBOOK(BottomNB), GTK_WIDGET(EEPROMView.box), gtk_label_new("EEPROM")); + gtk_notebook_append_page(GTK_NOTEBOOK(BottomNB), GTK_WIDGET(EditInfoMsgSW), gtk_label_new("Messages")); + gtk_notebook_append_page(GTK_NOTEBOOK(BottomNB), GTK_WIDGET(EditInfoDebugSW), gtk_label_new("Debug output")); + gtk_widget_show(GTK_WIDGET(BottomNB)); + + // Status bar on the bottom + StatusFrame = GTK_FRAME(gtk_frame_new(NULL)); + gtk_frame_set_label_align(StatusFrame, 1.0f, 0.5f); + gtk_box_pack_start(VBox1, GTK_WIDGET(StatusFrame), FALSE, FALSE, 0); + gtk_widget_show(GTK_WIDGET(StatusFrame)); + StatusLabel = GTK_LABEL(gtk_label_new("")); + gtk_label_set_justify(StatusLabel, GTK_JUSTIFY_LEFT); + gtk_label_set_ellipsize(StatusLabel, PANGO_ELLIPSIZE_END); + gtk_container_add(GTK_CONTAINER(StatusFrame), GTK_WIDGET(StatusLabel)); + gtk_widget_show(GTK_WIDGET(StatusLabel)); + + return 1; +} + +void CPUWindow_Destroy(void) +{ + int x, y, width, height; + gtk_window_deiconify(MainWindow); + gtk_window_get_position(MainWindow, &x, &y); + gtk_window_get_size(MainWindow, &width, &height); + dclc_cpuwin_winx = x; + dclc_cpuwin_winy = y; + dclc_cpuwin_winw = width; + dclc_cpuwin_winh = height; + CPUWindow_CheckDirtyROM(); +} + +void CPUWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(MainWindow)); + if ((dclc_cpuwin_winx > -15) && (dclc_cpuwin_winy > -16)) { + gtk_window_move(MainWindow, dclc_cpuwin_winx, dclc_cpuwin_winy); + } + if ((dclc_cpuwin_winw > 0) && (dclc_cpuwin_winh > 0)) { + gtk_window_resize(MainWindow, dclc_cpuwin_winw, dclc_cpuwin_winh); + } + gtk_widget_show(GTK_WIDGET(MainWindow)); + + CPUWindow_Refresh(1); + if (dclc_followPC) ProgramView_GotoAddr(PhysicalPC(), 0); + if (dclc_followSP) StackView_GotoSP(); +} + +void CPUWindow_UpdateConfigs(void) +{ + char tmp[PMTMPV]; + GtkWidget *widg; + int i, j; + + CPUWindow_InConfigs = 1; + + // Refresh recent list + for (i=0; i<10; i++) { + sprintf(tmp, "/File/Recent/ROM%i", i); + if (strlen(dclc_recent[i]) > 0) { + for (j=(int)strlen(dclc_recent[i])-1; j>=0; j--) if ((dclc_recent[i][j] == '/') || (dclc_recent[i][j] == '\\')) { j++; break; } + widg = gtk_item_factory_get_item(ItemFactory, tmp); + gtk_menu_item_set_label(GTK_MENU_ITEM(widg), &dclc_recent[i][j]); + } else { + widg = gtk_item_factory_get_item(ItemFactory, tmp); + gtk_menu_item_set_label(GTK_MENU_ITEM(widg), "---"); + } + } + + // Apply all options + widg = gtk_item_factory_get_item(ItemFactory, "/File/Autorun/Disabled"); + if (clc_autorun == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/File/Autorun/Run full speed"); + if (clc_autorun == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/File/Autorun/Debug frames (Sound)"); + if (clc_autorun == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/File/Autorun/Debug frames"); + if (clc_autorun == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Zoom/1x (96x64)"); + if (clc_zoom == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Zoom/2x (192x128)"); + if (clc_zoom == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Zoom/3x (288x192)"); + if (clc_zoom == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Zoom/4x (384x256)"); + if (clc_zoom == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Zoom/5x (480x320)"); + if (clc_zoom == 5) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Zoom/6x (576x384)"); + if (clc_zoom == 6) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Bits-Per-Pixel/16 bpp"); + if (clc_bpp == 16) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Bits-Per-Pixel/32 bpp"); + if (clc_bpp == 32) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Default"); + if (CommandLine.palette == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Old"); + if (CommandLine.palette == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Black & White"); + if (CommandLine.palette == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Green Palette"); + if (CommandLine.palette == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Green Vector"); + if (CommandLine.palette == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Red Palette"); + if (CommandLine.palette == 5) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Red Vector"); + if (CommandLine.palette == 6) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Blue LCD"); + if (CommandLine.palette == 7) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/LED Backlight"); + if (CommandLine.palette == 8) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Girl Power"); + if (CommandLine.palette == 9) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Blue Palette"); + if (CommandLine.palette == 10) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Blue Vector"); + if (CommandLine.palette == 11) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Sepia"); + if (CommandLine.palette == 12) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Inverted B&W"); + if (CommandLine.palette == 13) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Custom 1"); + if (CommandLine.palette == 14) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Palette/Custom 2"); + if (CommandLine.palette == 15) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Mode/Analog"); + if (CommandLine.lcdmode == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Mode/3-Shades"); + if (CommandLine.lcdmode == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Mode/2-Shades"); + if (CommandLine.lcdmode == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Mode/Colors*"); + if (CommandLine.lcdmode == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Filter/None"); + if (CommandLine.lcdfilter == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Filter/Dot-Matrix"); + if (CommandLine.lcdfilter == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Filter/50% Scanline"); + if (CommandLine.lcdfilter == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Contrast/Default"); + if (CommandLine.lcdcontrast == 64) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Contrast/Lowest"); + if (CommandLine.lcdcontrast == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Contrast/Low"); + if (CommandLine.lcdcontrast == 25) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Contrast/Medium"); + if (CommandLine.lcdcontrast == 50) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Contrast/High"); + if (CommandLine.lcdcontrast == 75) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Contrast/Highest"); + if (CommandLine.lcdcontrast == 100) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Brightness/Default"); + if (CommandLine.lcdbright == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Brightness/Lighter"); + if (CommandLine.lcdbright == 24) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Brightness/Light"); + if (CommandLine.lcdbright == 12) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Brightness/Dark"); + if (CommandLine.lcdbright == -12) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/LCD Brightness/Darker"); + if (CommandLine.lcdbright == -24) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Rumble Level/None"); + if (CommandLine.rumblelvl == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Rumble Level/Weak"); + if (CommandLine.rumblelvl == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Rumble Level/Medium"); + if (CommandLine.rumblelvl == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Rumble Level/Strong"); + if (CommandLine.rumblelvl == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sound/Disabled"); + if (CommandLine.sound == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sound/Generated"); + if (CommandLine.sound == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sound/Direct"); + if (CommandLine.sound == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sound/Emulated"); + if (CommandLine.sound == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sound/Direct PWM"); + if (CommandLine.sound == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sync Cycles/ 8 (Accurancy)"); + if (CommandLine.synccycles == 8) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sync Cycles/ 16"); + if (CommandLine.synccycles == 16) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sync Cycles/ 32"); + if (CommandLine.synccycles == 32) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Sync Cycles/ 64 (Performance)"); + if (CommandLine.synccycles == 64) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Piezo Filter"); + if (CommandLine.piezofilter) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Low Battery"); + if (CommandLine.low_battery) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/RTC/No RTC"); + if (CommandLine.updatertc == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/RTC/State time difference"); + if (CommandLine.updatertc == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/RTC/RTC from Host"); + if (CommandLine.updatertc == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Share EEPROM"); + if (CommandLine.eeprom_share) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Multicart/Disabled"); + if (CommandLine.multicart == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Multicart/Flash 512KB (AM29LV040B)"); + if (CommandLine.multicart == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Multicart/Lupin 512KB (AM29LV040B)"); + if (CommandLine.multicart == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Options/Force Free BIOS"); + if (CommandLine.forcefreebios) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/Physical range"); + if (dclc_fullrange) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/Follow PC"); + if (dclc_followPC) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/Follow SP"); + if (dclc_followSP) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/PRC/Show Background"); + if (dclc_PRC_bg) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/PRC/Show Sprites"); + if (dclc_PRC_spr) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Debugger/PRC/Stall CPU"); + if (dclc_PRC_stallcpu) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + PRCRenderBD = !dclc_PRC_bg; + PRCRenderBG = dclc_PRC_bg; + PRCRenderSpr = dclc_PRC_spr; + PRCAllowStall = dclc_PRC_stallcpu; + + widg = gtk_item_factory_get_item(ItemFactory, "/Break/Enable breakpoints"); + if (PMD_EnableBreakpoints) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Break/Enable watchpoints"); + if (PMD_EnableWatchpoints) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Break/Enable exceptions"); + if (PMD_EnableExceptions) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Break/Enable HALT break"); + if (PMD_EnableHalt) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Break/Enable STOP break"); + if (PMD_EnableStop) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Enable messages/Breakpoints"); + if (PMD_MessageBreakpoints) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Enable messages/Watchpoints"); + if (PMD_MessageWatchpoints) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Enable messages/Exceptions"); + if (PMD_MessageExceptions) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Enable messages/HALT break"); + if (PMD_MessageHalt) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Enable messages/STOP break"); + if (PMD_MessageStop) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Enable debug output"); + if (dclc_debugout) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Messages/Auto-open debug output"); + if (dclc_autodebugout) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + // Update external items + ExternalWindow_UpdateMenu(ItemFactory); + + switch (dclc_cpuwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + CPUWindow_InConfigs = 0; +} + +void CPUWindow_ROMResized(void) +{ + if (dclc_fullrange) { + sgtkx_drawing_view_sbminmax(&ProgramView, 0, PM_ROM_Size-1); + } else { + if (PM_ROM_Size <= 65535) sgtkx_drawing_view_sbminmax(&ProgramView, 0, PM_ROM_Size-1); + sgtkx_drawing_view_sbminmax(&ProgramView, 0, 65535); + } + if (!PMHD_MINLoaded()) { + MessageDialog(MainWindow, "Memory allocation error!", "Allocation error", GTK_MESSAGE_ERROR, NULL); + } +} + +void CPUWindow_EmumodeChanged(void) +{ + if (dclc_followPC) ProgramView_GotoAddr(PhysicalPC(), 0); + if (dclc_followSP) StackView_GotoSP(); +} + +void CPUWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_cpuwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(MainWindow)) || MainWindow_minimized) return; + } + if (emumode != EMUMODE_STOP) { + if (dclc_followPC) ProgramView_GotoAddr(PhysicalPC(), 0); + if (dclc_followSP) StackView_GotoSP(); + } + sgtkx_drawing_view_refresh(&ProgramView); + sgtkx_drawing_view_refresh(&RegistersView); + sgtkx_drawing_view_refresh(&StackView); + sgtkx_drawing_view_refresh(&RAMView); + sgtkx_drawing_view_refresh(&IOView); + sgtkx_drawing_view_refresh(&EEPROMView); + } else refreshcnt--; +} + +void CPUWindow_FrameRendered(void) +{ + char tmp[128]; + if (sdump) { + sprintf(tmp, "Recording audio: %.2f sec(s)", sdumptime); + gtk_frame_set_label(StatusFrame, tmp); + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/CPUWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/CPUWindow.h new file mode 100644 index 0000000000..277b605919 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/CPUWindow.h @@ -0,0 +1,124 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef CPUWINDOW_H +#define CPUWINDOW_H + +#include +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" +#include "InstructionProc.h" + +extern GtkWindow *MainWindow; + +typedef struct { + int key; + int modifier; + GtkItemFactoryCallback callback; +} TMenu_items_accel; +extern TMenu_items_accel Menu_item_accel[]; + +// Loaded color info file +extern char ColorInfoFile[256]; + +// Process menu item accelerator, execute callback and return if match +int ProcessMenuItemAccel(int key, int modifier, TMenu_items_accel *list); + +// Messaging +void Set_StatusLabel(const char *format, ...); +void Add_InfoMessage(const char *format, ...); +void Cmd_DebugOutput(int ctrl); +void Add_DebugOutputChar(unsigned char ch); +void Add_DebugOutputBinary(unsigned char bin); +void Add_DebugOutputNumber8(unsigned char num, int reg); +void Add_DebugOutputNumber16(unsigned char num, int reg); +void Add_DebugOutputFixed8_8(unsigned char num, int reg); + +// Callbacks +void PMDebug_OnLoadBIOSFile(const char *filename, int success); +void PMDebug_OnLoadMINFile(const char *filename, int success); +void PMDebug_OnLoadColorFile(const char *filename, int success); +void PMDebug_OnLoadEEPROMFile(const char *filename, int success); +void PMDebug_OnSaveEEPROMFile(const char *filename, int success); +void PMDebug_OnLoadStateFile(const char *filename, int success); +void PMDebug_OnSaveStateFile(const char *filename, int success); +void PMDebug_OnReset(int hardreset); + +// Get physical address of program view top +uint32_t ProgramView_GetTop(void); + +// Recalculate program view table +uint32_t ProgramView_Recalc(uint32_t addr); + +// Syncronize program view +int ProgramView_Sync(void); + +// Program view go to addr +void ProgramView_GotoAddr(uint32_t addr, int highlight); + +// Program view go to SP +void StackView_GotoSP(void); + +// RAM view go to addr +void RAMView_GotoAddr(uint32_t addr, int highlight); + +// Disassembler with color codes +TSOpcDec CDisAsm_SOpcDec; + +// Any view trap colors +uint32_t AnyView_TrapColor[8]; + +// Any view new value custom dialog +extern GtkXCustomDialog AnyView_NewValue_CD[]; +extern GtkXCustomDialog AnyView_AddWPAt_CD[]; + +// Any view helpers +void AnyView_DrawBackground(SGtkXDrawingView *widg, int width, int height, int zoom); +void AnyView_DrawDisableMask(SGtkXDrawingView *widg); + +// Any view callbacks events +int AnyView_scroll(SGtkXDrawingView *widg, int value, int min, int max); +int AnyView_resize(SGtkXDrawingView *widg, int width, int height, int _c); +int AnyView_enterleave(SGtkXDrawingView *widg, int inside, int _b, int _c); +int AnyView_motion(SGtkXDrawingView *widg, int x, int y, int _c); + +// Common menus +void Menu_Debug_RunFull(GtkWidget *widget, gpointer data); +void Menu_Debug_RunDFrameSnd(GtkWidget *widget, gpointer data); +void Menu_Debug_RunDFrame(GtkWidget *widget, gpointer data); +void Menu_Debug_RunDStep(GtkWidget *widget, gpointer data); +void Menu_Debug_SingleFrame(GtkWidget *widget, gpointer data); +void Menu_Debug_SingleStep(GtkWidget *widget, gpointer data); +void Menu_Debug_StepSkip(GtkWidget *widget, gpointer data); +void Menu_Debug_Stop(GtkWidget *widget, gpointer data); + +// For min on command-line +void CPUWindow_AddMinOnRecent(const char *filename); + +// This window management +int CPUWindow_Create(void); +void CPUWindow_Destroy(void); +void CPUWindow_Activate(void); +void CPUWindow_UpdateConfigs(void); +void CPUWindow_ROMResized(void); +void CPUWindow_EmumodeChanged(void); +void CPUWindow_Refresh(int now); +void CPUWindow_FrameRendered(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/ExternalWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/ExternalWindow.c new file mode 100644 index 0000000000..b39932c97e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/ExternalWindow.c @@ -0,0 +1,401 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" + +#include "CPUWindow.h" +#include "ExternalWindow.h" +#include "PokeMiniIcon_96x128.h" +#include "InstructionProc.h" +#include "InstructionInfo.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +int ExternalWindow_InConfigs = 0; + +GtkWindow *ExternalWindow; +static GtkScrolledWindow *ExternalSW; +static GtkBox *VBox1; +static GtkTable *MTable; +static GtkLabel *MLabelTitle[10]; +static GtkLabel *MLabelExec[10]; +static GtkEntry *MEntryTitle[10]; +static GtkEntry *MEntryExec[10]; +static GtkToggleButton *MCurrDir[10]; +static GtkLabel *LabelDesc; +static GtkButtonBox *HButtonBox; +static GtkButton *ButtonOk; +static GtkButton *ButtonCancel; + +// Locals +GtkItemFactory *CPUItemFactory = NULL; + +#define EXTMPV (4096) + +// -------- +// Launcher +// -------- + +static int RunCmdNoWait(const char *runcmd, int atcurrdir) +{ + char **argv, *argpars = "", *launchdir; + int i, res = 1, argc; + + // Select launch directory + launchdir = atcurrdir ? PokeMini_CurrDir : PokeMini_ExecDir; + + // Decode arguments + argc = GetArgument(runcmd, 1, NULL, 0, &argpars); + argv = (char **)malloc((argc + 1) * sizeof(char *)); + for (i=0; i 32; +#else + // Fork and execute + i = fork(); + if (i == -1) { + fprintf(stderr, "Error: Couldn't fork()\n"); + res = 0; + } else if (i == 0) { + // Child process + PokeMini_GotoCustomDir(launchdir); + execvp(argv[0], argv); + _exit(0); + } +#endif + + // Free memory + for (i=0; i. +*/ + +#ifndef EXTERNALWINDOW_H +#define EXTERNALWINDOW_H + +#include +#include + +// External launcher +int ExternalWindow_Launch(const char *execcod, int atcurrdir); + +// This window management +int ExternalWindow_Create(void); +void ExternalWindow_Destroy(void); +void ExternalWindow_Activate(GtkItemFactory *itemfact); +void ExternalWindow_UpdateConfigs(void); +void ExternalWindow_UpdateMenu(GtkItemFactory *itemfact); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/FileAssociation.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/FileAssociation.c new file mode 100644 index 0000000000..867f39b831 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/FileAssociation.c @@ -0,0 +1,196 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include + +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "ExternalWindow.h" + +// int FileAssociation_DoRegister(void) +// return: +// 3 = Silent +// 2 = Fully success +// 1 = Partial success +// 0 = Failed to register +// -1 = Unsupported + +// int FileAssociation_DoUnregister(void) +// return: +// 3 = Silent +// 2 = Fully success +// 1 = Partial success +// 0 = Failed to unregister +// -1 = Unsupported + +#ifdef _WIN32 +#include + +// Windows file association + +int FileAssociation_DoRegister(void) +{ + const char *tenam1 = "PokeMini_min"; + const char *tenam2 = "PokeMini_minc"; + const char *tenam3 = "PokeMini Emulator ROM"; + const char *tenam4 = "PokeMini Emulator Color File"; + const char *tenam5 = "debug"; + const char *tenam6 = "&Debug"; + const char *tenam7 = "&Color map"; + char tmp[PMTMPV]; + char tmp2[PMTMPV]; + char argv0[PMTMPV]; + int i; + HKEY key, key2; + DWORD dispo; + + // Receive module filename + GetModuleFileName(NULL, argv0, PMTMPV); + + // HKEY_CLASSES_ROOT\.min + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, ".min", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam1, (DWORD)strlen(tenam1)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\.minc + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, ".minc", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam2, (DWORD)strlen(tenam2)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam3, (DWORD)strlen(tenam3)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam4, (DWORD)strlen(tenam4)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min\DefaultIcon + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\DefaultIcon", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + sprintf(tmp, "\"%s\",1", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc\DefaultIcon + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\DefaultIcon", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + sprintf(tmp, "\"%s\",2", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min?\shell + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dispo) != ERROR_SUCCESS) return 0; + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key2, NULL) != ERROR_SUCCESS) return 0; + if (dispo == REG_CREATED_NEW_KEY) { + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam5, (DWORD)strlen(tenam5)+1) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key2, NULL, 0, REG_SZ, (LPBYTE)tenam5, (DWORD)strlen(tenam5)+1) != ERROR_SUCCESS) return 0; + } + RegCloseKey(key); + RegCloseKey(key2); + + // HKEY_CLASSES_ROOT\PokeMini_min?\shell\debug + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\debug", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\debug", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key2, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam6, (DWORD)strlen(tenam6)+1) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key2, NULL, 0, REG_SZ, (LPBYTE)tenam6, (DWORD)strlen(tenam6)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + RegCloseKey(key2); + + // HKEY_CLASSES_ROOT\PokeMini_min?\shell\debug\command + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\debug\\command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\debug\\command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key2, NULL) != ERROR_SUCCESS) return 0; + sprintf(tmp, "\"%s\" \"%%1\"", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key2, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + RegCloseKey(key2); + + // HKEY_CLASSES_ROOT\PokeMini_min?\shell\paint + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\paint", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\paint", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key2, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam7, (DWORD)strlen(tenam7)+1) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key2, NULL, 0, REG_SZ, (LPBYTE)tenam7, (DWORD)strlen(tenam7)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + RegCloseKey(key2); + + // HKEY_CLASSES_ROOT\PokeMini_min?\shell\paint\command + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\paint\\command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\paint\\command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key2, NULL) != ERROR_SUCCESS) return 0; + strcpy(tmp2, argv0); + for (i=(int)strlen(tmp2)-1; i>=0; i--) if (tmp2[i] == '\\') { tmp2[i] = 0; break; } + sprintf(tmp, "\"%s\\color_mapper.exe\" \"%%1\"", tmp2); + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key2, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + RegCloseKey(key2); + + return 2; +} + +int FileAssociation_DoUnregister(void) +{ + int success = 2; + + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\paint\\command")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\paint\\command")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\paint")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\paint")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\debug\\command")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\debug\\command")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\debug")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\debug")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell")) success = 1; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell")) success = 1; + if (success == 2) { + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\DefaultIcon")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\DefaultIcon")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, ".min")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, ".minc")) success = 0; + } + + return success; +} + + +#else + +// Linux file association + +int FileAssociation_DoRegister(void) +{ + char tmp[PMTMPV]; + sprintf(tmp, "sh -c './associateMin.sh register \"%s\"'", argv0); + if (ExternalWindow_Launch(tmp, 0)) return 3; + return 0; +} + +int FileAssociation_DoUnregister(void) +{ + char tmp[PMTMPV]; + sprintf(tmp, "sh -c './associateMin.sh unregister \"%s\"'", argv0); + if (ExternalWindow_Launch(tmp, 0)) return 3; + return 0; +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/FileAssociation.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/FileAssociation.h new file mode 100644 index 0000000000..4c102f0ec1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/FileAssociation.h @@ -0,0 +1,25 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef FILEASSOCIATION_H +#define FILEASSOCIATION_H + +int FileAssociation_DoRegister(void); +int FileAssociation_DoUnregister(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/HardIOWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/HardIOWindow.c new file mode 100644 index 0000000000..c786af65ee --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/HardIOWindow.c @@ -0,0 +1,1161 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "HardIOWindow.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int HardIOWindow_InConfigs = 0; + +GtkWindow *HardIOWindow; +static int HardIOWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkScrolledWindow *HardIOSW; +static GtkBox *VBox2; +static GtkComboBox *ComboReg; +static GtkToggleButton *CheckRegData[8]; +static GtkToggleButton *CheckAutoWrite; +static GtkButton *ButtonWrite; + +// Locals +static uint8_t SelRegAddr = 0x00; + +// Registers information table +// Bit type: +// 0 = Unused +// 1 = Read-Only +// 2 = Write-Only +// 3 = Read/Write +static const THardIOWindow_RegInfo HardIORegInfo[] = { + {0x00, "SYS_CTRL1",{ + {3, "Start-up contrast (6-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "Cartridge IO power"}, + {3, "LCD IO power"}, + },"System Control 1"}, + {0x01, "SYS_CTRL2",{ + {3, "Ram vector (BIOS)"}, + {3, "Int abort (BIOS)"}, + {3, "Enable cart interrupts (BIOS)"}, + {3, "Power on reset (BIOS)"}, + {3, "Cart type (BIOS, 4-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + },"System Control 2"}, + {0x02, "SYS_CTRL3",{ + {3, "Cart power state (BIOS)"}, + {3, "Cart power required (BIOS)"}, + {3, "Suspend mode (BIOS)"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "RTC Time valid (BIOS)"}, + {3, "???"}, + },"System Control 3"}, + {0x08, "SEC_CTRL",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {2, "Reset"}, + {3, "Enable"}, + },"Second Counter Control"}, + {0x09, "SEC_CNT_LO",{ + {1, "Counter (Low 8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + },"Second Counter Low"}, + {0x0A, "SEC_CNT_MID",{ + {1, "Counter (Med. 8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + },"Second Counter Middle"}, + {0x0B, "SEC_CNT_HI",{ + {1, "Counter (High 8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + },"Second Counter High"}, + {0x10, "SYS_BATT",{ + {0, "Unused"}, + {0, "Unused"}, + {1, "Low Battery"}, + {3, "Battery ADC control"}, + {3, "Battery ADC threshold value (4-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + },"Battery Sensor"}, + {0x18, "TMR1_SCALE",{ + {3, "Enable Hi"}, + {3, "Hi Scalar (3-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "Enable Lo"}, + {3, "Lo Scalar (3-Bits)"}, + {3, "..."}, + {3, "..."}, + },"Timer 1 Prescalars"}, + {0x19, "TMR1_ENA_OSC",{ + {0, ""}, + {0, ""}, + {3, "Enable Osc. 1"}, + {3, "Enable Osc. 2"}, + {0, ""}, + {0, ""}, + {3, "2nd Osc. (Hi)"}, + {3, "2nd Osc. (Lo)"}, + },"Timers Osc. Enable, Timer 1 Osc. Select"}, + {0x1A, "TMR2_SCALE",{ + {3, "Enable Hi"}, + {3, "Hi Scalar (3-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "Enable Lo"}, + {3, "Lo Scalar (3-Bits)"}, + {3, "..."}, + {3, "..."}, + },"Timer 2 Prescalars"}, + {0x1B, "TMR2_OSC",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "2nd Osc. (Hi)"}, + {3, "2nd Osc. (Lo)"}, + },"Timer 2 Osc. Select"}, + {0x1C, "TMR3_SCALE",{ + {3, "Enable Hi"}, + {3, "Hi Scalar (3-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "Enable Lo"}, + {3, "Lo Scalar (3-Bits)"}, + {3, "..."}, + {3, "..."}, + },"Timer 3 Prescalars"}, + {0x1D, "TMR3_OSC",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "2nd Osc. (Hi)"}, + {3, "2nd Osc. (Lo)"}, + }, "Timer 3 Osc. Select"}, + {0x20, "IRQ_PRI1",{ + {3, "PRC IRQs ($03~$04)"}, + {3, "..."}, + {3, "Timer 2 IRQs ($05~$06)"}, + {3, "..."}, + {3, "Timer 1 IRQs ($07~$08)"}, + {3, "..."}, + {3, "Timer 3 IRQs ($09~$0A)"}, + {3, "..."}, + }, "IRQ Priority 1"}, + {0x21, "IRQ_PRI2",{ + {3, "256 Hz IRQs ($0B~$0E)"}, + {3, "..."}, + {3, "IR/Shock IRQs ($13~$14)"}, + {3, "..."}, + {3, "Keypad IRQs ($15~$1C)"}, + {3, "..."}, + {3, "Unknown IRQs ($1D~$1F)"}, + {3, "..."}, + }, "IRQ Priority 2"}, + {0x22, "IRQ_PRI3",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "Cartridge IRQs ($0F~$10)"}, + {3, "..."}, + }, "IRQ Priority 3"}, + {0x23, "IRQ_ENA1",{ + {3, "PRC Copy Complete ($03)"}, + {3, "PRC Frame Divider Overflow ($04)"}, + {3, "Timer 2-B Underflow ($05)"}, + {3, "Timer 2-A Underflow 8-Bits ($06)"}, + {3, "Timer 1-B Underflow ($07)"}, + {3, "Timer 1-A Underflow 8-Bits ($08)"}, + {3, "Timer 3 Underflow ($09)"}, + {3, "Timer 3 Pivot ($0A)"}, + }, "IRQ Enable 1"}, + {0x24, "IRQ_ENA2",{ + {0, ""}, + {0, ""}, + {3, "32 Hz ($05)"}, + {3, " 8 Hz ($06)"}, + {3, " 2 Hz ($07)"}, + {3, " 1 Hz ($08)"}, + {3, "IR Receiver ($13)"}, + {3, "Shock Sensor ($14)"}, + }, "IRQ Enable 2"}, + {0x25, "IRQ_ENA3",{ + {3, "Power Key ($15)"}, + {3, "Right Key ($16)"}, + {3, "Left Key ($17)"}, + {3, "Down Key ($18)"}, + {3, "Up Key ($19)"}, + {3, "C Key ($1A)"}, + {3, "B Key ($1B)"}, + {3, "A Key ($1C)"}, + }, "IRQ Enable 3"}, + {0x26, "IRQ_ENA4",{ + {3, "Cartridge Ejected ($0F)"}, + {3, "Cartridge IRQ ($10)"}, + {3, "???"}, + {3, "???"}, + {0, ""}, + {3, "Unknown 1 ($1D)"}, + {3, "Unknown 2 ($1E)"}, + {3, "Unknown 3 ($1F)"}, + }, "IRQ Enable 4"}, + {0x27, "IRQ_ACT1",{ + {2, "PRC Copy Complete ($03)"}, + {2, "PRC Frame Divider Overflow ($04)"}, + {2, "Timer 2-B Underflow ($05)"}, + {2, "Timer 2-A Underflow 8-Bits ($06)"}, + {2, "Timer 1-B Underflow ($07)"}, + {2, "Timer 1-A Underflow 8-Bits ($08)"}, + {2, "Timer 3 Underflow ($09)"}, + {2, "Timer 3 Pivot ($0A)"}, + }, "IRQ Active 1"}, + {0x28, "IRQ_ACT2",{ + {0, ""}, + {0, ""}, + {2, "32 Hz ($05)"}, + {2, " 8 Hz ($06)"}, + {2, " 2 Hz ($07)"}, + {2, " 1 Hz ($08)"}, + {2, "IR Receiver ($13)"}, + {2, "Shock Sensor ($14)"}, + }, "IRQ Active 2"}, + {0x29, "IRQ_ACT3",{ + {2, "Power Key ($15)"}, + {2, "Right Key ($16)"}, + {2, "Left Key ($17)"}, + {2, "Down Key ($18)"}, + {2, "Up Key ($19)"}, + {2, "C Key ($1A)"}, + {2, "B Key ($1B)"}, + {2, "A Key ($1C)"}, + }, "IRQ Active 3"}, + {0x2A, "IRQ_ACT4",{ + {2, "Cartridge Ejected ($0F)"}, + {2, "Cartridge IRQ ($10)"}, + {2, "???"}, + {2, "???"}, + {0, ""}, + {2, "Unknown 1 ($1D)"}, + {2, "Unknown 2 ($1E)"}, + {2, "Unknown 3 ($1F)"}, + }, "IRQ Active 4"}, + {0x30, "TMR1_CTRL_L",{ + {3, "16-Bits Mode"}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "Enable"}, + {3, "Reset"}, + {3, "???"}, + }, "Timer 1 Control (Lo)"}, + {0x31, "TMR1_CTRL_H",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "Enable"}, + {3, "Reset"}, + {3, "???"}, + }, "Timer 1 Control (Hi)"}, + {0x32, "TMR1_PRE_L",{ + {3, "Preset (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 1 Preset (Lo)"}, + {0x33, "TMR1_PRE_H",{ + {3, "Preset (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 1 Preset (Hi)"}, + {0x34, "TMR1_PVT_L",{ + {3, "Pivot (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 1 Pivot (Lo)"}, + {0x35, "TMR1_PVT_H",{ + {3, "Pivot (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 1 Pivot (Hi)"}, + {0x36, "TMR1_CNT_L",{ + {1, "Count (8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + }, "Timer 1 Count (Lo)"}, + {0x37, "TMR1_CNT_H",{ + {1, "Count (8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + }, "Timer 1 Count (Hi)"}, + {0x38, "TMR2_CTRL_L",{ + {3, "16-Bits Mode"}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "Enable"}, + {3, "Reset"}, + {3, "???"}, + }, "Timer 2 Control (Lo)"}, + {0x39, "TMR2_CTRL_H",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "Enable"}, + {3, "Reset"}, + {3, "???"}, + }, "Timer 2 Control (Hi)"}, + {0x3A, "TMR2_PRE_L",{ + {3, "Preset (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 2 Preset (Lo)"}, + {0x3B, "TMR2_PRE_H",{ + {3, "Preset (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 2 Preset (Hi)"}, + {0x3C, "TMR2_PVT_L",{ + {3, "Pivot (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 2 Pivot (Lo)"}, + {0x3D, "TMR2_PVT_H",{ + {3, "Pivot (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 2 Pivot (Hi)"}, + {0x3E, "TMR2_CNT_L",{ + {1, "Count (8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + }, "Timer 2 Count (Lo)"}, + {0x3F, "TMR2_CNT_H",{ + {1, "Count (8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + }, "Timer 2 Count (Hi)"}, + {0x40, "TMR256_CTRL",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {2, "Reset"}, + {3, "Enable"}, + }, "256Hz Timer Control"}, + {0x41, "TMR256_CNT",{ + {1, "Count (8-Bits)"}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + }, "256Hz Timer Count"}, + {0x44, "UNKNOWN",{ + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x45, "UNKNOWN",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x46, "UNKNOWN",{ + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x47, "UNKNOWN",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x48, "TMR3_CTRL_L",{ + {3, "16-Bits Mode"}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "Enable"}, + {3, "Reset"}, + {3, "???"}, + }, "Timer 3 Control (Lo)"}, + {0x49, "TMR3_CTRL_H",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "Enable"}, + {3, "Reset"}, + {3, "???"}, + }, "Timer 3 Control (Hi)"}, + {0x4A, "TMR3_PRE_L",{ + {3, "Preset (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 3 Preset (Lo)"}, + {0x4B, "TMR3_PRE_H",{ + {3, "Preset (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 3 Preset (Hi)"}, + {0x4C, "TMR3_PVT_L",{ + {3, "Pivot (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 3 Pivot (Lo)"}, + {0x4D, "TMR3_PVT_H",{ + {3, "Pivot (8-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + {3, "..."}, + }, "Timer 3 Pivot (Hi)"}, + {0x4E, "TMR3_CNT_L",{ + {1, "Count (8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + }, "Timer 3 Count (Lo)"}, + {0x4F, "TMR3_CNT_H",{ + {1, "Count (8-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + }, "Timer 3 Count (Hi)"}, + {0x50, "UNKNOWN",{ + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x51, "UNKNOWN",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x52, "KEY_PAD",{ + {1, "!Power Key"}, + {1, "!Right Key"}, + {1, "!Left Key"}, + {1, "!Down Key"}, + {1, "!Up Key"}, + {1, "!C Key"}, + {1, "!B Key"}, + {1, "!A Key"}, + }, "Key-Pad Status (Active 0)"}, + {0x53, "CART_BUS",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {1, "!Cartrige power"}, + {0, ""}, + }, "Cart Bus (Active 0)"}, + {0x54, "UNKNOWN",{ + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x55, "UNKNOWN",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Unknown"}, + {0x60, "IO_DIR",{ + {3, "???"}, + {3, "???"}, + {3, "IR Disable"}, + {3, "Rumble"}, + {3, "EEPROM Clock"}, + {3, "EEPROM Data"}, + {3, "IR Receive"}, + {3, "IR Transmit"}, + }, "I/O Direction Select"}, + {0x61, "IO_DATA",{ + {3, "???"}, + {3, "???"}, + {3, "IR Disable"}, + {3, "Rumble"}, + {3, "EEPROM Clock"}, + {3, "EEPROM Data"}, + {3, "IR Receive"}, + {3, "IR Transmit"}, + }, "I/O Data Register"}, + {0x62, "UNKNOWN",{ + {3, "???"}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + }, "Unknown"}, + {0x70, "AUD_CTRL",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "???"}, + {3, "???"}, + {3, "???"}, + }, "Audio Control"}, + {0x71, "AUD_VOL",{ + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {3, "!Cart power"}, + {3, "Volume (2-Bits)"}, + {3, "..."}, + }, "Audio Volume"}, + {0x80, "PRC_MODE",{ + {0, ""}, + {0, ""}, + {3, "Map Size (2-Bits)"}, + {3, "..."}, + {3, "Enable Copy"}, + {3, "Enable Sprites"}, + {3, "Enable Map"}, + {3, "Invert Map"}, + }, "PRC Stage Control"}, + {0x81, "PRC_RATE",{ + {1, "Frame counter (4-Bits)"}, + {1, "..."}, + {1, "..."}, + {1, "..."}, + {3, "Rate divider (3-Bits)"}, + {3, "..."}, + {3, "..."}, + {3, "???"}, + }, "PRC Rate Control"}, + {0x82, "PRC_MAP_LO",{ + {3, "Map Tile Base (5-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + }, "PRC Map Tile Base Low"}, + {0x83, "PRC_MAP_MID",{ + {3, "Map Tile Base (8-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "PRC Map Tile Base Middle"}, + {0x84, "PRC_MAP_HI",{ + {0, ""}, + {0, ""}, + {0, ""}, + {3, "Map Tile Base (5-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "PRC Map Tile Base High"}, + {0x85, "PRC_SCROLL_Y",{ + {0, ""}, + {3, "Map Scroll Y (7-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "PRC Map Vertical Scroll"}, + {0x86, "PRC_SCROLL_X",{ + {0, ""}, + {3, "Map Scroll X (7-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "PRC Map Horizontal Scroll"}, + {0x87, "PRC_SPR_LO",{ + {3, "Sprite Tile Base (2-Bits)"}, + {3, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + {0, ""}, + }, "PRC Sprite Tile Base Low"}, + {0x88, "PRC_SPR_MID",{ + {3, "Sprite Tile Base (8-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "PRC Sprite Tile Base Middle"}, + {0x89, "PRC_SPR_HI",{ + {0, ""}, + {0, ""}, + {0, ""}, + {3, "Sprite Tile Base (5-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "PRC Sprite Tile Base High"}, + {0x8A, "PRC_CNT",{ + {0, ""}, + {1, "Count (7-Bits)"}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + {1, ""}, + }, "PRC Counter"}, + {0xFE, "LCD_CTRL",{ + {3, "LCD Control I/O (8-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "LCD Raw Control Byte"}, + {0xFF, "LCD_DATA",{ + {3, "LCD Data I/O (8-Bits)"}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + {3, ""}, + }, "LCD Raw Data Byte"}, +}; +static int HardIORegInfo_Len = sizeof(HardIORegInfo) / sizeof(*HardIORegInfo); + +static void HardIOWindow_Render(int force) +{ + uint8_t din; + + HardIOWindow_InConfigs = 1; + + din = MinxCPU_OnRead(0, 0x2000 + SelRegAddr); + gtk_toggle_button_set_active(CheckRegData[0], din & 0x80); + gtk_toggle_button_set_active(CheckRegData[1], din & 0x40); + gtk_toggle_button_set_active(CheckRegData[2], din & 0x20); + gtk_toggle_button_set_active(CheckRegData[3], din & 0x10); + gtk_toggle_button_set_active(CheckRegData[4], din & 0x08); + gtk_toggle_button_set_active(CheckRegData[5], din & 0x04); + gtk_toggle_button_set_active(CheckRegData[6], din & 0x02); + gtk_toggle_button_set_active(CheckRegData[7], din & 0x01); + + HardIOWindow_InConfigs = 0; +} + +static void ButtonWrite_clicked(GtkButton *button, gpointer data) +{ + MinxCPU_OnWrite(0, 0x2000 + SelRegAddr, + (gtk_toggle_button_get_active(CheckRegData[0]) ? 0x80 : 0) + + (gtk_toggle_button_get_active(CheckRegData[1]) ? 0x40 : 0) + + (gtk_toggle_button_get_active(CheckRegData[2]) ? 0x20 : 0) + + (gtk_toggle_button_get_active(CheckRegData[3]) ? 0x10 : 0) + + (gtk_toggle_button_get_active(CheckRegData[4]) ? 0x08 : 0) + + (gtk_toggle_button_get_active(CheckRegData[5]) ? 0x04 : 0) + + (gtk_toggle_button_get_active(CheckRegData[6]) ? 0x02 : 0) + + (gtk_toggle_button_get_active(CheckRegData[7]) ? 0x01 : 0) + ); + refresh_debug(1); +} + +static void ComboReg_changed(GtkComboBox *widget, gpointer data) +{ + char tmp[PMTMPV]; + int i, bit; + THardIOWindow_RegInfo *reginfo = (THardIOWindow_RegInfo *)&HardIORegInfo[gtk_combo_box_get_active(ComboReg)]; + SelRegAddr = reginfo->regaddr; + for (i=0; i<8; i++) { + bit = 7 - i; + switch (reginfo->bit[i].type) { + case 0: sprintf(tmp, "%i", bit); + gtk_widget_set_sensitive(GTK_WIDGET(CheckRegData[i]), FALSE); + break; + case 1: sprintf(tmp, "%i (R): %s", bit, reginfo->bit[i].name); + gtk_widget_set_sensitive(GTK_WIDGET(CheckRegData[i]), TRUE); + break; + case 2: sprintf(tmp, "%i (W): %s", bit, reginfo->bit[i].name); + gtk_widget_set_sensitive(GTK_WIDGET(CheckRegData[i]), TRUE); + break; + case 3: sprintf(tmp, "%i (RW): %s", bit, reginfo->bit[i].name); + gtk_widget_set_sensitive(GTK_WIDGET(CheckRegData[i]), TRUE); + break; + } + gtk_button_set_label(GTK_BUTTON(CheckRegData[i]), tmp); + } + refresh_debug(1); +} + +static void CheckRegData_toggled(GtkToggleButton *widget, gpointer data) +{ + int mask = 1 << (int)data; + uint8_t din; + + if (HardIOWindow_InConfigs) return; + if (!gtk_toggle_button_get_active(CheckAutoWrite)) return; + + din = MinxCPU_OnRead(0, 0x2000 + SelRegAddr); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { + MinxCPU_OnWrite(0, 0x2000 + SelRegAddr, din | mask); + } else { + MinxCPU_OnWrite(0, 0x2000 + SelRegAddr, din & ~mask); + } + refresh_debug(1); +} + +// -------------- +// Menu callbacks +// -------------- + +static void HardIOW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void HardIOW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (HardIOWindow_InConfigs) return; + + if (index >= 0) { + dclc_hardiowin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(HardIOWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_hardiowin_refresh, 4, 0, 0, 1000)) { + dclc_hardiowin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint HardIOWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(HardIOWindow)); + return TRUE; +} + +static gboolean HardIOWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) HardIOWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry HardIOWindow_MenuItems[] = { + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, HardIOW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, HardIOW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, HardIOW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, HardIOW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, HardIOW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, HardIOW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, HardIOW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, HardIOW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, HardIOW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, HardIOW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, HardIOW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint HardIOWindow_MenuItemsNum = sizeof(HardIOWindow_MenuItems) / sizeof(*HardIOWindow_MenuItems); + +// ------------------ +// Hardware IO Window +// ------------------ + +int HardIOWindow_Create(void) +{ + char tmp[PMTMPV]; + int i; + + // Window + HardIOWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(HardIOWindow), "Hardware IO View"); + gtk_widget_set_size_request(GTK_WIDGET(HardIOWindow), 200, 100); + gtk_window_set_default_size(HardIOWindow, 420, 280); + g_signal_connect(HardIOWindow, "delete_event", G_CALLBACK(HardIOWindow_delete_event), NULL); + g_signal_connect(HardIOWindow, "window-state-event", G_CALLBACK(HardIOWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(HardIOWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, HardIOWindow_MenuItemsNum, HardIOWindow_MenuItems, NULL); + gtk_window_add_accel_group(HardIOWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Scrolling window with vertical box + HardIOSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(HardIOSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(VBox1), GTK_WIDGET(HardIOSW)); + gtk_widget_show(GTK_WIDGET(HardIOSW)); + VBox2 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_scrolled_window_add_with_viewport(HardIOSW, GTK_WIDGET(VBox2)); + gtk_widget_show(GTK_WIDGET(VBox2)); + + // Registers + ComboReg = GTK_COMBO_BOX(gtk_combo_box_new_text()); + g_signal_connect(ComboReg, "changed", G_CALLBACK(ComboReg_changed), NULL); + for (i=0; i -15) && (dclc_hardiowin_winy > -16)) { + gtk_window_move(HardIOWindow, dclc_hardiowin_winx, dclc_hardiowin_winy); + } + if ((dclc_hardiowin_winw > 0) && (dclc_hardiowin_winh > 0)) { + gtk_window_resize(HardIOWindow, dclc_hardiowin_winw, dclc_hardiowin_winh); + } + gtk_widget_show(GTK_WIDGET(HardIOWindow)); + gtk_window_present(HardIOWindow); +} + +void HardIOWindow_UpdateConfigs(void) +{ + HardIOWindow_InConfigs = 1; + + gtk_combo_box_set_active(ComboReg, 0); + + switch (dclc_hardiowin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + HardIOWindow_InConfigs = 0; +} + +void HardIOWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(HardIOSW)); + gtk_widget_show(GTK_WIDGET(CheckAutoWrite)); + gtk_widget_show(GTK_WIDGET(ButtonWrite)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(HardIOSW)); + gtk_widget_hide(GTK_WIDGET(CheckAutoWrite)); + gtk_widget_hide(GTK_WIDGET(ButtonWrite)); + } +} + +void HardIOWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_hardiowin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(HardIOWindow)) || HardIOWindow_minimized) return; + } + HardIOWindow_Render(0); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/HardIOWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/HardIOWindow.h new file mode 100644 index 0000000000..2c400ac595 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/HardIOWindow.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef HARDIOWINDOW_H +#define HARDIOWINDOW_H + +#include +#include + +typedef struct { + int regaddr; + char *idname; + struct { + int type; + char *name; + } bit[8]; // Order is inversed! + char *description; +} THardIOWindow_RegInfo; + +// This window management +int HardIOWindow_Create(void); +void HardIOWindow_Destroy(void); +void HardIOWindow_Activate(void); +void HardIOWindow_UpdateConfigs(void); +void HardIOWindow_Sensitive(int enabled); +void HardIOWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/Hardware_Debug.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/Hardware_Debug.c new file mode 100644 index 0000000000..6e9ec7d0f0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/Hardware_Debug.c @@ -0,0 +1,586 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Include Standards +#include +#include +#include +#include + +#include "PokeMini.h" +#include "InstructionProc.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +int PMD_TrapFound = 0; +int PMD_EnableBreakpoints = 1; +int PMD_EnableWatchpoints = 1; +int PMD_EnableExceptions = 1; +int PMD_EnableHalt = 0; +int PMD_EnableStop = 1; +int PMD_MessageBreakpoints = 0; +int PMD_MessageWatchpoints = 0; +int PMD_MessageExceptions = 1; +int PMD_MessageHalt = 0; +int PMD_MessageStop = 1; +uint8_t *PMD_TrapPoints; // Trap points for breakpoint & watchpoint: + // &1 = Breakpoint, &16 = Watchpoint Read, &32 = Watchpoint Write + +uint32_t TRACAddr[TRACECODE_LENGTH]; // 0xFFFFFFFF == Invalid +int TRACPoint = 0; + +int CYCTmr1Ena = 0; // Cycles Timer 1 +uint32_t CYCTmr1Cnt = 0; +int CYCTmr2Ena = 0; // Cycles Timer 2 +uint32_t CYCTmr2Cnt = 0; +int CYCTmr3Ena = 0; // Cycles Timer 3 +uint32_t CYCTmr3Cnt = 0; + +static void BreakpointReport(void) +{ + int val; + if (dclc_fullrange) { + if (MinxCPU.PC.W.L >= 0x8000) { + val = (MinxCPU.PC.B.I << 15) | (MinxCPU.PC.W.L & 0x7FFF); + if (PMD_MessageBreakpoints) Add_InfoMessage("[Break] Breakpoint at $%06X", val); + else Set_StatusLabel("[Break] Breakpoint at $%06X", val); + } else { + if (PMD_MessageBreakpoints) Add_InfoMessage("[Break] Breakpoint at $%06X", (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Breakpoint at $%06X", (int)MinxCPU.PC.W.L); + } + } else { + if (PMD_MessageBreakpoints) Add_InfoMessage("[Break] Breakpoint at (%02X)$%04X", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Breakpoint at (%02X)$%04X", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } +} + +static void WatchpointReport(int access, uint32_t addr) +{ + int val; + if (dclc_fullrange) { + if (MinxCPU.PC.W.L >= 0x8000) { + val = (MinxCPU.PC.B.I << 15) | (MinxCPU.PC.W.L & 0x7FFF); + if (PMD_MessageBreakpoints) Add_InfoMessage("[Break] Watchpoint at $%06X before $%06X", access ? "write" : "read", (int)addr, val); + else Set_StatusLabel("[Break] Watchpoint at $%06X before $%06X", access ? "write" : "read", (int)addr, val); + } else { + if (PMD_MessageBreakpoints) Add_InfoMessage("[Break] Watchpoint at $%06X before $%06X", access ? "write" : "read", (int)addr, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Watchpoint at $%06X before $%06X", access ? "write" : "read", (int)addr, (int)MinxCPU.PC.W.L); + } + } else { + if (PMD_MessageBreakpoints) Add_InfoMessage("[Break] Watchpoint %s at $%06X before (%02X)$%04X", access ? "write" : "read", (int)addr, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Watchpoint %s at $%06X before (%02X)$%04X", access ? "write" : "read", (int)addr, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } +} + +// New MIN was loaded +int PMHD_MINLoaded(void) +{ + static int PM_ROM_OldSize = 0; + if (PMD_TrapPoints) { + // Resize + PMD_TrapPoints = (uint8_t *)realloc(PMD_TrapPoints, PM_ROM_Size); + if (PM_ROM_Size > PM_ROM_OldSize) { + memset((uint8_t *)PMD_TrapPoints + PM_ROM_OldSize, 0, PM_ROM_Size - PM_ROM_OldSize); + } + PM_ROM_OldSize = PM_ROM_Size; + } else { + // New + PMD_TrapPoints = (uint8_t *)malloc(PM_ROM_Size); + if (!PMD_TrapPoints) return 0; + memset(PMD_TrapPoints, 0, PM_ROM_Size); + PM_ROM_OldSize = PM_ROM_Size; + } + + return 1; +} + +// Free resources +void PMHD_FreeResources(void) +{ + if (PMD_TrapPoints) { + free(PMD_TrapPoints); + PMD_TrapPoints = NULL; + } +} + +// System reset +void PMHD_Reset(int hardreset) +{ + int i; + for (i=0; i= 0x8000) { + pp = (MinxCPU.PC.B.I << 15) | (pp & 0x7FFF); + } + GetInstructionInfo(MinxCPU_OnRead, 1, pp, NULL, &size); + MinxCPU.PC.W.L += size; + + return size; +} + +// Emulate X cycles, return remaining +int PokeMini_EmulateCycles(int lcylc) +{ + PMD_TrapFound = 0; + + if (RequireSoundSync) { + while (lcylc > 0) { + if (StallCPU) PokeHWCycles = StallCycles; + else PokeHWCycles = MinxCPU_Exec(); + MinxTimers_Sync(); + MinxPRC_Sync(); + MinxAudio_Sync(); + lcylc -= PokeHWCycles; + if (PokeMini_BreakPointTest(PokeHWCycles)) { + PMD_TrapFound = 1; + BreakpointReport(); + } + if (PMD_TrapFound) { + set_emumode(EMUMODE_STOP, 0); + return lcylc; + } + } + } else { + while (lcylc > 0) { + if (StallCPU) PokeHWCycles = StallCycles; + else PokeHWCycles = MinxCPU_Exec(); + MinxTimers_Sync(); + MinxPRC_Sync(); + lcylc -= PokeHWCycles; + if (PokeMini_BreakPointTest(PokeHWCycles)) { + PMD_TrapFound = 1; + BreakpointReport(); + } + if (PMD_TrapFound) { + set_emumode(EMUMODE_STOP, 0); + return lcylc; + } + } + } + + return lcylc; +} + +// Emulate 1 frame, return cycles ran +static int PokeMini_EmulateFrameRun; +int PokeMini_EmulateFrame(void) +{ + int lcylc = 0; + + PMD_TrapFound = 0; + PokeMini_EmulateFrameRun = 1; + + if (RequireSoundSync) { + while (PokeMini_EmulateFrameRun) { + PokeHWCycles = 0; + while (PokeHWCycles < CommandLine.synccycles) { + if (StallCPU) PokeHWCycles += StallCycles; + else { + PokeHWCycles += MinxCPU_Exec(); + if (PokeMini_BreakPointTest(PokeHWCycles)) { + PMD_TrapFound = 1; + BreakpointReport(); + } + if (PMD_TrapFound) { + set_emumode(EMUMODE_STOP, 0); + MinxTimers_Sync(); + MinxPRC_Sync(); + MinxAudio_Sync(); + return lcylc + PokeHWCycles; + } + } + } + MinxTimers_Sync(); + MinxPRC_Sync(); + MinxAudio_Sync(); + lcylc += PokeHWCycles; + } + } else { + while (PokeMini_EmulateFrameRun) { + PokeHWCycles = 0; + while (PokeHWCycles < CommandLine.synccycles) { + if (StallCPU) PokeHWCycles += StallCycles; + else { + PokeHWCycles += MinxCPU_Exec(); + if (PokeMini_BreakPointTest(PokeHWCycles)) { + PMD_TrapFound = 1; + BreakpointReport(); + } + if (PMD_TrapFound) { + set_emumode(EMUMODE_STOP, 0); + MinxTimers_Sync(); + MinxPRC_Sync(); + return lcylc + PokeHWCycles; + } + } + } + MinxTimers_Sync(); + MinxPRC_Sync(); + lcylc += PokeHWCycles; + } + } + + return lcylc; +} + +// ------------------- +// Internal Processing +// ------------------- + +uint8_t MinxCPU_OnRead(int cpu, uint32_t addr) +{ + if (cpu && (PMD_TrapPoints[addr & PM_ROM_Mask] & TRAPPOINT_WATCHREAD) && PMD_EnableWatchpoints) { + PMD_TrapFound = 1; + WatchpointReport(0, addr); + } + if (addr >= 0x2100) { + // ROM Read +#ifdef PERFORMANCE + if (PM_ROM) return PM_ROM[addr & PM_ROM_Mask]; +#else + return MulticartRead(addr); +#endif + } else if (addr >= 0x2000) { + // I/O Read + uint8_t reg = (uint8_t)addr; + switch(reg) { + // Misc interface + case 0x00: // System Control 1 + return PMR_SYS_CTRL1; + case 0x01: // System Control 2 + return PMR_SYS_CTRL2; + case 0x02: // System Control 3 + return PMR_SYS_CTRL3; + + // IRQ interface + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2A: + return MinxIRQ_ReadReg(cpu, reg); + + // Timers interface + case 0x08: case 0x09: case 0x0A: case 0x0B: + case 0x18: case 0x19: case 0x1A: case 0x1B: + case 0x1C: case 0x1D: case 0x1E: case 0x1F: + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3A: case 0x3B: + case 0x3C: case 0x3D: case 0x3E: case 0x3F: + case 0x40: case 0x41: + case 0x48: case 0x49: case 0x4A: case 0x4B: + case 0x4C: case 0x4D: case 0x4E: case 0x4F: + return MinxTimers_ReadReg(reg); + + // Parallel I/O interface & Power + case 0x10: + case 0x44: case 0x45: case 0x46: case 0x47: + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: + case 0x60: case 0x61: case 0x62: + return MinxIO_ReadReg(cpu, reg); + + // Program Rendering Chip interface + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: + return MinxPRC_ReadReg(reg); + + // Color PRC interface + case 0xF0: case 0xF1: case 0xF2: case 0xF3: + case 0xF4: case 0xF5: case 0xF6: case 0xF7: + return MinxColorPRC_ReadReg(cpu, reg); + + // LCD interface + case 0xFE: case 0xFF: + return MinxLCD_ReadReg(cpu, reg); + + // Audio interface + case 0x70: case 0x71: + return MinxAudio_ReadReg(reg); + + // Open bus + default: + return MinxCPU.IR; + } + } else if (addr >= 0x1000) { + // RAM Read + return PM_RAM[addr-0x1000]; + } else { + // BIOS Read + return PM_BIOS[addr]; + } + return 0xFF; +} + +void MinxCPU_OnWrite(int cpu, uint32_t addr, uint8_t data) +{ + static uint8_t dataold = 0x00; + if (cpu && (PMD_TrapPoints[addr & PM_ROM_Mask] & TRAPPOINT_WATCHWRITE) && PMD_EnableWatchpoints) { + PMD_TrapFound = 1; + WatchpointReport(1, addr); + } + if (addr >= 0x2100) { + // ROM Write +#ifndef PERFORMANCE + MulticartWrite(addr, data); +#endif + return; + } else if (addr >= 0x2000) { + // I/O Write + uint8_t reg = (uint8_t)addr; + switch(reg) { + // Misc interface + case 0x00: // System Control 1 + PMR_SYS_CTRL1 = data; + return; + case 0x01: // System Control 2 + PMR_SYS_CTRL2 = data; + return; + case 0x02: // System Control 3 + PMR_SYS_CTRL3 = data; + return; + + // IRQ interface + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2A: + MinxIRQ_WriteReg(cpu, reg, data); + return; + + // Timers interface + case 0x08: case 0x09: case 0x0A: case 0x0B: + case 0x18: case 0x19: case 0x1A: case 0x1B: + case 0x1C: case 0x1D: case 0x1E: case 0x1F: + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3A: case 0x3B: + case 0x3C: case 0x3D: case 0x3E: case 0x3F: + case 0x40: case 0x41: + case 0x48: case 0x49: case 0x4A: case 0x4B: + case 0x4C: case 0x4D: case 0x4E: case 0x4F: + MinxTimers_WriteReg(reg, data); + return; + + // Parallel I/O interface & Power + case 0x10: + case 0x44: case 0x45: case 0x46: case 0x47: + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: + case 0x60: case 0x61: case 0x62: + MinxIO_WriteReg(cpu, reg, data); + return; + + // Program Rendering Chip interface + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: case 0x8B: + case 0x8C: case 0x8D: case 0x8E: case 0x8F: + MinxPRC_WriteReg(reg, data); + return; + + // Color PRC interface + case 0xF0: case 0xF1: case 0xF2: case 0xF3: + case 0xF4: case 0xF5: case 0xF6: case 0xF7: + MinxColorPRC_WriteReg(reg, data); + return; + + // LCD interface + case 0xFE: case 0xFF: + MinxLCD_WriteReg(cpu, reg, data); + return; + + // Audio interface + case 0x70: case 0x71: + MinxAudio_WriteReg(reg, data); + return; + + // Debug output (Char, Hex, Dec) + case 0xD0: + if (dclc_debugout) { + if (data != 27) { + if (dataold == 27) { + Cmd_DebugOutput((int)data); + } else { + Add_DebugOutputChar(data); + } + } + } + dataold = data; + return; + case 0xD1: case 0xD2: case 0xD3: + if (dclc_debugout) Add_DebugOutputNumber8(data, reg & 3); + return; + case 0xD4: case 0xD5: case 0xD6: case 0xD7: + if (dclc_debugout) Add_DebugOutputNumber16(data, reg & 3); + return; + case 0xDE: case 0xDF: + if (dclc_debugout) Add_DebugOutputFixed8_8(data, reg & 1); + return; + } + } else if (addr >= 0x1300) { + // RAM Write + PM_RAM[addr-0x1000] = data; + return; + } else if (addr >= 0x1000) { + // RAM Write / FrameBuffer + PM_RAM[addr-0x1000] = data; + if (PRCColorMap) MinxColorPRC_WriteFramebuffer(addr-0x1000, data); + return; + } else { + // BIOS Write (Ignored) + return; + } +} + +void MinxCPU_OnException(int type, uint32_t ir) +{ + switch (type) { + case EXCEPTION_UNKNOWN_INSTRUCTION: + if (PMD_EnableExceptions) { + PMD_TrapFound = 1; + if (PMD_MessageExceptions) Add_InfoMessage("[Break] Unknown instruction %08X before V=%02X,PC=%04X\n", ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Unknown instruction %08X before V=%02X,PC=%04X\n", ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } + return; + case EXCEPTION_CRASH_INSTRUCTION: + if (PMD_EnableExceptions) { + PMD_TrapFound = 1; + if (PMD_MessageExceptions) Add_InfoMessage("[Break] Crash instruction %08X before V=%02X,PC=%04X\n", ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Crash instruction %08X before V=%02X,PC=%04X\n", ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } + return; + case EXCEPTION_UNSTABLE_INSTRUCTION: + if (PMD_EnableExceptions) { + PMD_TrapFound = 1; + if (PMD_MessageExceptions) Add_InfoMessage("[Break] Unstable instruction %08X before V=%02X,PC=%04X\n", ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Unstable instruction %08X before V=%02X,PC=%04X\n", ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } + return; + case EXCEPTION_DIVISION_BY_ZERO: + if (PMD_EnableExceptions) { + PMD_TrapFound = 1; + if (PMD_MessageExceptions) Add_InfoMessage("[Break] Division by zero before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Break] Division by zero before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } + return; + default: + return; + } +} + +void MinxCPU_OnSleep(int type) +{ + switch (type) { + case MINX_SLEEP_HALT: + if (PMD_EnableHalt) { + PMD_TrapFound = 1; + if (PMD_MessageHalt) Add_InfoMessage("[Sleep] Halt called before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Sleep] Halt called before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } + return; + case MINX_SLEEP_STOP: + if (PMD_EnableStop) { + PMD_TrapFound = 1; + if (PMD_MessageStop) Add_InfoMessage("[Sleep] Stop called before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + else Set_StatusLabel("[Sleep] Stop called before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + } + return; + default: + return; + } +} + +void MinxCPU_OnIRQHandle(uint8_t cpuflag, uint8_t shift_u) +{ + // Disable or enable master interrupt and check for interrupts + if (shift_u) { + MinxIRQ_MasterIRQ = 0; + } else { + if ((cpuflag & 0xC0) == 0xC0) MinxIRQ_MasterIRQ = 0; + else { + MinxIRQ_MasterIRQ = 1; + MinxIRQ_Process(); + } + } +} + +void MinxCPU_OnIRQAct(uint8_t intr) +{ + // Set and process interrupt + MinxIRQ_SetIRQ(intr); +} + +void MinxIRQ_OnIRQ(uint8_t intr) +{ + // From IRQ module, call the CPU interrupt + MinxCPU_CallIRQ(intr << 1); +} + +void MinxPRC_On72HzRefresh(int prcrender) +{ + // Frame rendered + if ((PokeMini_LCDMode == LCDMODE_3SHADES) && (prcrender)) memcpy(LCDPixelsA, LCDPixelsD, 96*64); + if (LCDDirty) MinxLCD_Render(); + if (PokeMini_LCDMode == LCDMODE_ANALOG) MinxLCD_DecayRefresh(); + PokeMini_EmulateFrameRun = 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/Hardware_Debug.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/Hardware_Debug.h new file mode 100644 index 0000000000..ba04e4d62c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/Hardware_Debug.h @@ -0,0 +1,93 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef HARDWARE_EMU +#define HARDWARE_EMU + +#include + +enum { + TRAPPOINT_BREAK = 1, // Break + TRAPPOINT_WATCHREAD = 2, // Watch (Read) + TRAPPOINT_WATCHWRITE = 4, // Watch (Write) + TRAPPOINT_WATCH = 6 // Watch (Read & Write) +}; + +// Trap points for breakpoints/watchpoints +extern uint8_t *PMD_TrapPoints; + +// Trace code addresses +#define TRACECODE_LENGTH 10000 +extern uint32_t TRACAddr[TRACECODE_LENGTH]; +extern int TRACPoint; + +// Cycle timers +extern int CYCTmr1Ena; +extern uint32_t CYCTmr1Cnt; +extern int CYCTmr2Ena; +extern uint32_t CYCTmr2Cnt; +extern int CYCTmr3Ena; +extern uint32_t CYCTmr3Cnt; + +// Breakpoints, watchpoints, exceptions and halt/stop +extern int PMD_EnableBreakpoints; +extern int PMD_EnableWatchpoints; +extern int PMD_EnableExceptions; +extern int PMD_EnableHalt; +extern int PMD_EnableStop; +extern int PMD_MessageBreakpoints; +extern int PMD_MessageWatchpoints; +extern int PMD_MessageExceptions; +extern int PMD_MessageHalt; +extern int PMD_MessageStop; + +// Get physical PC location +static inline uint32_t PhysicalPC() +{ + if (MinxCPU.PC.W.L >= 0x8000) { + return (MinxCPU.PC.B.I << 15) | (MinxCPU.PC.W.L & 0x7FFF); + } else { + return MinxCPU.PC.W.L; + } +} + +// New MIN was loaded +int PMHD_MINLoaded(); + +// Free resources +void PMHD_FreeResources(); + +// System reset +void PMHD_Reset(int hardreset); + +// Get physical PC location +uint32_t PokeMini_GetPhysicalPC(); + +// Emulate single instruction, return cycles ran +int PokeMini_EmulateStep(); + +// Skip current instruction, return cycles skipped +int PokeMini_EmulateStepSkip(); + +// Emulate X cycles, return remaining +int PokeMini_EmulateCycles(int lcylc); + +// Emulate 1 frame, return cycles ran +int PokeMini_EmulateFrame(); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/IRQWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/IRQWindow.c new file mode 100644 index 0000000000..9fdd30b059 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/IRQWindow.c @@ -0,0 +1,652 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "IRQWindow.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int IRQWindow_InConfigs = 0; + +GtkWindow *IRQWindow; +static int IRQWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkScrolledWindow *IRQSW; +static GtkTable *MTable; +static GtkFrame *FramePri; +static GtkTable *TablePri; +static GtkLabel *LabelsPri[9]; +static GtkComboBox *ComboPri[9]; +static GtkFrame *FrameEna; +static GtkBox *VBoxEna; +static GtkToggleButton *CheckEna[27]; +static GtkFrame *FrameAct; +static GtkBox *VBoxAct; +static GtkToggleButton *CheckAct[27]; + +// Enable/Disable frames +static int IRQShow_Pri = 1; +static int IRQShow_Ena = 1; +static int IRQShow_Act = 1; + +static void IRQWindow_Render(int force) +{ + IRQWindow_InConfigs = 1; + + // Priority + if (IRQShow_Pri) { + gtk_combo_box_set_active(ComboPri[0], (PMR_IRQ_PRI1 & 0xC0) >> 6); + gtk_combo_box_set_active(ComboPri[1], (PMR_IRQ_PRI1 & 0x30) >> 4); + gtk_combo_box_set_active(ComboPri[2], (PMR_IRQ_PRI1 & 0x0C) >> 2); + gtk_combo_box_set_active(ComboPri[3], (PMR_IRQ_PRI1 & 0x03)); + gtk_combo_box_set_active(ComboPri[4], (PMR_IRQ_PRI2 & 0xC0) >> 6); + gtk_combo_box_set_active(ComboPri[5], (PMR_IRQ_PRI3 & 0x03)); + gtk_combo_box_set_active(ComboPri[6], (PMR_IRQ_PRI2 & 0x30) >> 4); + gtk_combo_box_set_active(ComboPri[7], (PMR_IRQ_PRI2 & 0x0C) >> 2); + gtk_combo_box_set_active(ComboPri[8], (PMR_IRQ_PRI2 & 0x03)); + } + + // Enable + if (IRQShow_Ena) { + gtk_toggle_button_set_active(CheckEna[0], PMR_IRQ_ENA1 & 0x80); + gtk_toggle_button_set_active(CheckEna[1], PMR_IRQ_ENA1 & 0x40); + gtk_toggle_button_set_active(CheckEna[2], PMR_IRQ_ENA1 & 0x20); + gtk_toggle_button_set_active(CheckEna[3], PMR_IRQ_ENA1 & 0x10); + gtk_toggle_button_set_active(CheckEna[4], PMR_IRQ_ENA1 & 0x08); + gtk_toggle_button_set_active(CheckEna[5], PMR_IRQ_ENA1 & 0x04); + gtk_toggle_button_set_active(CheckEna[6], PMR_IRQ_ENA1 & 0x02); + gtk_toggle_button_set_active(CheckEna[7], PMR_IRQ_ENA1 & 0x01); + gtk_toggle_button_set_active(CheckEna[8], PMR_IRQ_ENA2 & 0x20); + gtk_toggle_button_set_active(CheckEna[9], PMR_IRQ_ENA2 & 0x10); + gtk_toggle_button_set_active(CheckEna[10], PMR_IRQ_ENA2 & 0x08); + gtk_toggle_button_set_active(CheckEna[11], PMR_IRQ_ENA2 & 0x04); + gtk_toggle_button_set_active(CheckEna[12], PMR_IRQ_ENA4 & 0x80); + gtk_toggle_button_set_active(CheckEna[13], PMR_IRQ_ENA4 & 0x40); + gtk_toggle_button_set_active(CheckEna[14], PMR_IRQ_ENA2 & 0x02); + gtk_toggle_button_set_active(CheckEna[15], PMR_IRQ_ENA2 & 0x01); + gtk_toggle_button_set_active(CheckEna[16], PMR_IRQ_ENA3 & 0x80); + gtk_toggle_button_set_active(CheckEna[17], PMR_IRQ_ENA3 & 0x40); + gtk_toggle_button_set_active(CheckEna[18], PMR_IRQ_ENA3 & 0x20); + gtk_toggle_button_set_active(CheckEna[19], PMR_IRQ_ENA3 & 0x10); + gtk_toggle_button_set_active(CheckEna[20], PMR_IRQ_ENA3 & 0x08); + gtk_toggle_button_set_active(CheckEna[21], PMR_IRQ_ENA3 & 0x04); + gtk_toggle_button_set_active(CheckEna[22], PMR_IRQ_ENA3 & 0x02); + gtk_toggle_button_set_active(CheckEna[23], PMR_IRQ_ENA3 & 0x01); + gtk_toggle_button_set_active(CheckEna[24], PMR_IRQ_ENA4 & 0x04); + gtk_toggle_button_set_active(CheckEna[25], PMR_IRQ_ENA4 & 0x02); + gtk_toggle_button_set_active(CheckEna[26], PMR_IRQ_ENA4 & 0x01); + } + + // Active + if (IRQShow_Act) { + gtk_toggle_button_set_active(CheckAct[0], PMR_IRQ_ACT1 & 0x80); + gtk_toggle_button_set_active(CheckAct[1], PMR_IRQ_ACT1 & 0x40); + gtk_toggle_button_set_active(CheckAct[2], PMR_IRQ_ACT1 & 0x20); + gtk_toggle_button_set_active(CheckAct[3], PMR_IRQ_ACT1 & 0x10); + gtk_toggle_button_set_active(CheckAct[4], PMR_IRQ_ACT1 & 0x08); + gtk_toggle_button_set_active(CheckAct[5], PMR_IRQ_ACT1 & 0x04); + gtk_toggle_button_set_active(CheckAct[6], PMR_IRQ_ACT1 & 0x02); + gtk_toggle_button_set_active(CheckAct[7], PMR_IRQ_ACT1 & 0x01); + gtk_toggle_button_set_active(CheckAct[8], PMR_IRQ_ACT2 & 0x20); + gtk_toggle_button_set_active(CheckAct[9], PMR_IRQ_ACT2 & 0x10); + gtk_toggle_button_set_active(CheckAct[10], PMR_IRQ_ACT2 & 0x08); + gtk_toggle_button_set_active(CheckAct[11], PMR_IRQ_ACT2 & 0x04); + gtk_toggle_button_set_active(CheckAct[12], PMR_IRQ_ACT4 & 0x80); + gtk_toggle_button_set_active(CheckAct[13], PMR_IRQ_ACT4 & 0x40); + gtk_toggle_button_set_active(CheckAct[14], PMR_IRQ_ACT2 & 0x02); + gtk_toggle_button_set_active(CheckAct[15], PMR_IRQ_ACT2 & 0x01); + gtk_toggle_button_set_active(CheckAct[16], PMR_IRQ_ACT3 & 0x80); + gtk_toggle_button_set_active(CheckAct[17], PMR_IRQ_ACT3 & 0x40); + gtk_toggle_button_set_active(CheckAct[18], PMR_IRQ_ACT3 & 0x20); + gtk_toggle_button_set_active(CheckAct[19], PMR_IRQ_ACT3 & 0x10); + gtk_toggle_button_set_active(CheckAct[20], PMR_IRQ_ACT3 & 0x08); + gtk_toggle_button_set_active(CheckAct[21], PMR_IRQ_ACT3 & 0x04); + gtk_toggle_button_set_active(CheckAct[22], PMR_IRQ_ACT3 & 0x02); + gtk_toggle_button_set_active(CheckAct[23], PMR_IRQ_ACT3 & 0x01); + gtk_toggle_button_set_active(CheckAct[24], PMR_IRQ_ACT4 & 0x04); + gtk_toggle_button_set_active(CheckAct[25], PMR_IRQ_ACT4 & 0x02); + gtk_toggle_button_set_active(CheckAct[26], PMR_IRQ_ACT4 & 0x01); + } + + IRQWindow_InConfigs = 0; +} + +static void ComboPri_changed(GtkComboBox *widget, gpointer data) +{ + if (IRQWindow_InConfigs) return; + switch((int)data) { + case 0: PMR_IRQ_PRI1 &= ~0xC0; + PMR_IRQ_PRI1 |= gtk_combo_box_get_active(ComboPri[0]) << 6; + break; + case 1: PMR_IRQ_PRI1 &= ~0x30; + PMR_IRQ_PRI1 |= gtk_combo_box_get_active(ComboPri[1]) << 4; + break; + case 2: PMR_IRQ_PRI1 &= ~0x0C; + PMR_IRQ_PRI1 |= gtk_combo_box_get_active(ComboPri[2]) << 2; + break; + case 3: PMR_IRQ_PRI1 &= ~0x03; + PMR_IRQ_PRI1 |= gtk_combo_box_get_active(ComboPri[3]); + break; + case 4: PMR_IRQ_PRI2 &= ~0xC0; + PMR_IRQ_PRI2 |= gtk_combo_box_get_active(ComboPri[4]) << 6; + break; + case 5: PMR_IRQ_PRI3 &= ~0x03; + PMR_IRQ_PRI3 |= gtk_combo_box_get_active(ComboPri[5]); + break; + case 6: PMR_IRQ_PRI2 &= ~0x30; + PMR_IRQ_PRI2 |= gtk_combo_box_get_active(ComboPri[6]) << 4; + break; + case 7: PMR_IRQ_PRI2 &= ~0x0C; + PMR_IRQ_PRI2 |= gtk_combo_box_get_active(ComboPri[7]) << 2; + break; + case 8: PMR_IRQ_PRI2 &= ~0x03; + PMR_IRQ_PRI2 |= gtk_combo_box_get_active(ComboPri[8]); + break; + } + MinxIRQ_Process(); + refresh_debug(1); +} + +static void CheckEna_toggled(GtkToggleButton *togglebutton, gpointer data) +{ + uint8_t regn, mask; + if (IRQWindow_InConfigs) return; + switch ((int)data) { + case 0: regn = 1; mask = 0x80; break; + case 1: regn = 1; mask = 0x40; break; + case 2: regn = 1; mask = 0x20; break; + case 3: regn = 1; mask = 0x10; break; + case 4: regn = 1; mask = 0x08; break; + case 5: regn = 1; mask = 0x04; break; + case 6: regn = 1; mask = 0x02; break; + case 7: regn = 1; mask = 0x01; break; + case 8: regn = 2; mask = 0x20; break; + case 9: regn = 2; mask = 0x10; break; + case 10: regn = 2; mask = 0x08; break; + case 11: regn = 2; mask = 0x04; break; + case 12: regn = 4; mask = 0x80; break; + case 13: regn = 4; mask = 0x40; break; + case 14: regn = 2; mask = 0x02; break; + case 15: regn = 2; mask = 0x01; break; + case 16: regn = 3; mask = 0x80; break; + case 17: regn = 3; mask = 0x40; break; + case 18: regn = 3; mask = 0x20; break; + case 19: regn = 3; mask = 0x10; break; + case 20: regn = 3; mask = 0x08; break; + case 21: regn = 3; mask = 0x04; break; + case 22: regn = 3; mask = 0x02; break; + case 23: regn = 3; mask = 0x01; break; + case 24: regn = 4; mask = 0x04; break; + case 25: regn = 4; mask = 0x02; break; + case 26: regn = 4; mask = 0x01; break; + default: return; + } + if (gtk_toggle_button_get_active(togglebutton)) { + switch (regn) { + case 1: PMR_IRQ_ENA1 |= mask; break; + case 2: PMR_IRQ_ENA2 |= mask; break; + case 3: PMR_IRQ_ENA3 |= mask; break; + case 4: PMR_IRQ_ENA4 |= mask; break; + } + } else { + switch (regn) { + case 1: PMR_IRQ_ENA1 &= ~mask; break; + case 2: PMR_IRQ_ENA2 &= ~mask; break; + case 3: PMR_IRQ_ENA3 &= ~mask; break; + case 4: PMR_IRQ_ENA4 &= ~mask; break; + } + } + MinxIRQ_Process(); + refresh_debug(1); +} + +static void CheckAct_toggled(GtkToggleButton *togglebutton, gpointer data) +{ + uint8_t regn, mask; + if (IRQWindow_InConfigs) return; + switch ((int)data) { + case 0: regn = 1; mask = 0x80; break; + case 1: regn = 1; mask = 0x40; break; + case 2: regn = 1; mask = 0x20; break; + case 3: regn = 1; mask = 0x10; break; + case 4: regn = 1; mask = 0x08; break; + case 5: regn = 1; mask = 0x04; break; + case 6: regn = 1; mask = 0x02; break; + case 7: regn = 1; mask = 0x01; break; + case 8: regn = 2; mask = 0x20; break; + case 9: regn = 2; mask = 0x10; break; + case 10: regn = 2; mask = 0x08; break; + case 11: regn = 2; mask = 0x04; break; + case 12: regn = 4; mask = 0x80; break; + case 13: regn = 4; mask = 0x40; break; + case 14: regn = 2; mask = 0x02; break; + case 15: regn = 2; mask = 0x01; break; + case 16: regn = 3; mask = 0x80; break; + case 17: regn = 3; mask = 0x40; break; + case 18: regn = 3; mask = 0x20; break; + case 19: regn = 3; mask = 0x10; break; + case 20: regn = 3; mask = 0x08; break; + case 21: regn = 3; mask = 0x04; break; + case 22: regn = 3; mask = 0x02; break; + case 23: regn = 3; mask = 0x01; break; + case 24: regn = 4; mask = 0x04; break; + case 25: regn = 4; mask = 0x02; break; + case 26: regn = 4; mask = 0x01; break; + default: return; + } + if (gtk_toggle_button_get_active(togglebutton)) { + switch (regn) { + case 1: PMR_IRQ_ACT1 |= mask; break; + case 2: PMR_IRQ_ACT2 |= mask; break; + case 3: PMR_IRQ_ACT3 |= mask; break; + case 4: PMR_IRQ_ACT4 |= mask; break; + } + } else { + switch (regn) { + case 1: PMR_IRQ_ACT1 &= ~mask; break; + case 2: PMR_IRQ_ACT2 &= ~mask; break; + case 3: PMR_IRQ_ACT3 &= ~mask; break; + case 4: PMR_IRQ_ACT4 &= ~mask; break; + } + } + MinxIRQ_Process(); + refresh_debug(1); +} + +static void UpdateWidgetsOrder() +{ + g_object_ref(G_OBJECT(FrameEna)); + gtk_container_remove(GTK_CONTAINER(MTable), GTK_WIDGET(FrameEna)); + g_object_ref(G_OBJECT(FrameAct)); + gtk_container_remove(GTK_CONTAINER(MTable), GTK_WIDGET(FrameAct)); + if (dclc_irqframes_on_1row) { + gtk_table_attach(MTable, GTK_WIDGET(FrameEna), 2, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + gtk_table_attach(MTable, GTK_WIDGET(FrameAct), 3, 4, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + } else { + gtk_table_attach(MTable, GTK_WIDGET(FrameEna), 0, 1, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + gtk_table_attach(MTable, GTK_WIDGET(FrameAct), 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + } +} + +// -------------- +// Menu callbacks +// -------------- + +static void IRQW_View_Priority(GtkWidget *widget, gpointer data) +{ + if (IRQWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/IRQ Priority"); + IRQShow_Pri = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (IRQShow_Pri) gtk_widget_show(GTK_WIDGET(FramePri)); + else gtk_widget_hide(GTK_WIDGET(FramePri)); + IRQWindow_Refresh(1); +} + +static void IRQW_View_Enable(GtkWidget *widget, gpointer data) +{ + if (IRQWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/IRQ Enable"); + IRQShow_Ena = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (IRQShow_Ena) gtk_widget_show(GTK_WIDGET(FrameEna)); + else gtk_widget_hide(GTK_WIDGET(FrameEna)); + IRQWindow_Refresh(1); +} + +static void IRQW_View_Active(GtkWidget *widget, gpointer data) +{ + if (IRQWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/IRQ Active"); + IRQShow_Act = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (IRQShow_Act) gtk_widget_show(GTK_WIDGET(FrameAct)); + else gtk_widget_hide(GTK_WIDGET(FrameAct)); + IRQWindow_Refresh(1); +} + +static void IRQW_View_Frame1Row(GtkWidget *widget, gpointer data) +{ + if (IRQWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Frames in single-row"); + dclc_irqframes_on_1row = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + UpdateWidgetsOrder(); +} + +static void IRQW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void IRQW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (IRQWindow_InConfigs) return; + + if (index >= 0) { + dclc_irqwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(IRQWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_irqwin_refresh, 4, 0, 0, 1000)) { + dclc_irqwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint IRQWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(IRQWindow)); + return TRUE; +} + +static gboolean IRQWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) IRQWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry IRQWindow_MenuItems[] = { + { "/_View", NULL, NULL, 0, "" }, + { "/View/IRQ Priority", NULL, IRQW_View_Priority, 0, "" }, + { "/View/IRQ Enable", NULL, IRQW_View_Enable, 0, "" }, + { "/View/IRQ Active", NULL, IRQW_View_Active, 0, "" }, + { "/View/sep1", NULL, NULL, 0, "" }, + { "/View/Frames in single-row", NULL, IRQW_View_Frame1Row, 0, "" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, IRQW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, IRQW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, IRQW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, IRQW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, IRQW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, IRQW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, IRQW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, IRQW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, IRQW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, IRQW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, IRQW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint IRQWindow_MenuItemsNum = sizeof(IRQWindow_MenuItems) / sizeof(*IRQWindow_MenuItems); + +// ---------- +// IRQ Window +// ---------- + +static char *IRQPri_Txt[] = { + "PRC IRQs ($03~$04):", + "Timer 2 IRQs ($05~$06):", + "Timer 3 IRQs ($07~$08):", + "Timer 1 IRQs ($09~$0A):", + "256 Hz IRQs ($0B~$0E):", + "IR/Shock IRQs ($13~$14):", + "Cartridge IRQs ($0F~$10):", + "Keypad IRQs ($15~$1C):", + "Unknown IRQs ($1D~$1F):" +}; + +static char *IRQEnaAct_Txt[] = { + "PRC Copy Complete ($03)", + "PRC Frame Divider Overflow ($04)", + "Timer 2-B Underflow ($05)", + "Timer 2-A Underflow 8-Bits ($06)", + "Timer 1-B Underflow ($07)", + "Timer 1-A Underflow 8-Bits ($08)", + "Timer 3 Underflow ($09)", + "Timer 3 Pivot ($0A)", + "32 Hz ($0B)", + " 8 Hz ($0C)", + " 2 Hz ($0D)", + " 1 Hz ($0E)", + "IR Receiver ($13)", + "Shock Sensor ($14)", + "Cartridge Ejected ($0F)", + "Cartridge IRQ ($10)", + "Power Key ($15)", + "Right Key ($16)", + "Left Key ($17)", + "Down Key ($18)", + "Up Key ($19)", + "C Key ($1A)", + "B Key ($1B)", + "A Key ($1C)", + "Unknown 1 ($1D)", + "Unknown 2 ($1E)", + "Unknown 3 ($1F)" +}; + +static void LoadPriOnCombo(GtkComboBox *combo) +{ + gtk_combo_box_append_text(combo, "0 - IRQs Disabled"); + gtk_combo_box_append_text(combo, "1 - Low Priority"); + gtk_combo_box_append_text(combo, "2 - Medium Priority"); + gtk_combo_box_append_text(combo, "3 - High Priority"); +} + +int IRQWindow_Create(void) +{ + int i; + + // Window + IRQWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(IRQWindow), "IRQ View"); + gtk_widget_set_size_request(GTK_WIDGET(IRQWindow), 200, 100); + gtk_window_set_default_size(IRQWindow, 420, 300); + g_signal_connect(IRQWindow, "delete_event", G_CALLBACK(IRQWindow_delete_event), NULL); + g_signal_connect(IRQWindow, "window-state-event", G_CALLBACK(IRQWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(IRQWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, IRQWindow_MenuItemsNum, IRQWindow_MenuItems, NULL); + gtk_window_add_accel_group(IRQWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Scrolling window with vertical box + IRQSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(IRQSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(VBox1), GTK_WIDGET(IRQSW)); + gtk_widget_show(GTK_WIDGET(IRQSW)); + MTable = GTK_TABLE(gtk_table_new(2, 4, FALSE)); + gtk_scrolled_window_add_with_viewport(IRQSW, GTK_WIDGET(MTable)); + gtk_widget_show(GTK_WIDGET(MTable)); + + // Priority + FramePri = GTK_FRAME(gtk_frame_new(" IRQ Priority ")); + gtk_table_attach(MTable, GTK_WIDGET(FramePri), 0, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + gtk_widget_show(GTK_WIDGET(FramePri)); + TablePri = GTK_TABLE(gtk_table_new(9, 2, FALSE)); + gtk_container_add(GTK_CONTAINER(FramePri), GTK_WIDGET(TablePri)); + gtk_widget_show(GTK_WIDGET(TablePri)); + for (i=0; i<9; i++) { + LabelsPri[i] = GTK_LABEL(gtk_label_new(IRQPri_Txt[i])); + gtk_misc_set_alignment(GTK_MISC(LabelsPri[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsPri[i], GTK_JUSTIFY_LEFT); + gtk_table_attach(TablePri, GTK_WIDGET(LabelsPri[i]), 0, 1, i, i+1, GTK_FILL, GTK_FILL, 2, 2); + gtk_widget_show(GTK_WIDGET(LabelsPri[i])); + ComboPri[i] = GTK_COMBO_BOX(gtk_combo_box_new_text()); + g_signal_connect(ComboPri[i], "changed", G_CALLBACK(ComboPri_changed), (gpointer)i); + LoadPriOnCombo(ComboPri[i]); + gtk_table_attach(TablePri, GTK_WIDGET(ComboPri[i]), 1, 2, i, i+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + gtk_widget_show(GTK_WIDGET(ComboPri[i])); + } + + // Enable + FrameEna = GTK_FRAME(gtk_frame_new(" IRQ Enable ")); + gtk_table_attach(MTable, GTK_WIDGET(FrameEna), 2, 3, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + gtk_widget_show(GTK_WIDGET(FrameEna)); + VBoxEna = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameEna), GTK_WIDGET(VBoxEna)); + gtk_widget_show(GTK_WIDGET(VBoxEna)); + for (i=0; i<27; i++) { + CheckEna[i] = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label(IRQEnaAct_Txt[i])); + g_signal_connect(CheckEna[i], "toggled", G_CALLBACK(CheckEna_toggled), (gpointer)i); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(CheckEna[i]), TRUE); + gtk_box_pack_start(VBoxEna, GTK_WIDGET(CheckEna[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(CheckEna[i])); + } + + // Active + FrameAct = GTK_FRAME(gtk_frame_new(" IRQ Active ")); + gtk_table_attach(MTable, GTK_WIDGET(FrameAct), 3, 4, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); + gtk_widget_show(GTK_WIDGET(FrameAct)); + VBoxAct = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameAct), GTK_WIDGET(VBoxAct)); + gtk_widget_show(GTK_WIDGET(VBoxAct)); + for (i=0; i<27; i++) { + CheckAct[i] = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label(IRQEnaAct_Txt[i])); + g_signal_connect(CheckAct[i], "toggled", G_CALLBACK(CheckAct_toggled), (gpointer)i); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(CheckAct[i]), TRUE); + gtk_box_pack_start(VBoxAct, GTK_WIDGET(CheckAct[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(CheckAct[i])); + } + + return 1; +} + +void IRQWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(IRQWindow))) { + gtk_widget_show(GTK_WIDGET(IRQWindow)); + gtk_window_deiconify(IRQWindow); + gtk_window_get_position(IRQWindow, &x, &y); + gtk_window_get_size(IRQWindow, &width, &height); + dclc_irqwin_winx = x; + dclc_irqwin_winy = y; + dclc_irqwin_winw = width; + dclc_irqwin_winh = height; + } +} + +void IRQWindow_Activate(void) +{ + IRQWindow_Render(1); + gtk_widget_realize(GTK_WIDGET(IRQWindow)); + if ((dclc_irqwin_winx > -15) && (dclc_irqwin_winy > -16)) { + gtk_window_move(IRQWindow, dclc_irqwin_winx, dclc_irqwin_winy); + } + if ((dclc_irqwin_winw > 0) && (dclc_irqwin_winh > 0)) { + gtk_window_resize(IRQWindow, dclc_irqwin_winw, dclc_irqwin_winh); + } + gtk_widget_show(GTK_WIDGET(IRQWindow)); + gtk_window_present(IRQWindow); +} + +void IRQWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + + IRQWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/View/IRQ Priority"); + if (IRQShow_Pri) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/IRQ Enable"); + if (IRQShow_Ena) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/IRQ Active"); + if (IRQShow_Act) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Frames in single-row"); + if (dclc_irqframes_on_1row) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + UpdateWidgetsOrder(); + + switch (dclc_irqwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + IRQWindow_InConfigs = 0; +} + +void IRQWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(IRQSW)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(IRQSW)); + } +} + +void IRQWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_irqwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(IRQWindow)) || IRQWindow_minimized) return; + } + IRQWindow_Render(0); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/IRQWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/IRQWindow.h new file mode 100644 index 0000000000..ab8701983d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/IRQWindow.h @@ -0,0 +1,33 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef IRQWINDOW_H +#define IRQWINDOW_H + +#include +#include + +// This window management +int IRQWindow_Create(void); +void IRQWindow_Destroy(void); +void IRQWindow_Activate(void); +void IRQWindow_UpdateConfigs(void); +void IRQWindow_Sensitive(int enabled); +void IRQWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/InputWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/InputWindow.c new file mode 100644 index 0000000000..46a06bdb53 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/InputWindow.c @@ -0,0 +1,344 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" + +#include "InputWindow.h" +#include "PokeMiniIcon_96x128.h" +#include "InstructionProc.h" +#include "InstructionInfo.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +#include "Joystick.h" +#include "Keyboard.h" +#include "KeybMapSDL.h" + +int InputWindow_InConfigs = 0; + +GtkWindow *InputWindow; +static GtkScrolledWindow *InputSW; +static GtkBox *VBox1; +static GtkNotebook *NBook; +static GtkTable *KTable; +static GtkLabel *KLabelK[10]; +static GtkComboBox *KComboA[10]; +static GtkComboBox *KComboB[10]; +static GtkBox *JVBox; +static GtkTable *JTable; +static GtkToggleButton *JEnabled; +static GtkComboBox *JJoyID; +static GtkToggleButton *JAxisAsDPad; +static GtkToggleButton *JHatsAsDPad; +static GtkLabel *JLabelJ[10]; +static GtkComboBox *JCombo[10]; +static GtkButtonBox *HButtonBox; +static GtkButton *ButtonApply; +static GtkButton *ButtonRestore; +static GtkButton *ButtonDefaults; +static GtkButton *ButtonClose; + +// ----------------- +// Widgets callbacks +// ----------------- + +static gint InputWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(InputWindow)); + return TRUE; +} + +static void InputWindow_ButtonApply_clicked(GtkWidget *widget, gpointer data) +{ + int i, newdevice = 0; + + if (CommandLine.joyid != gtk_combo_box_get_active(JJoyID)) newdevice = 1; + + // Joystick configs + CommandLine.joyenabled = gtk_toggle_button_get_active(JEnabled) ? 1 : 0; + CommandLine.joyid = gtk_combo_box_get_active(JJoyID); + CommandLine.joyaxis_dpad = gtk_toggle_button_get_active(JAxisAsDPad) ? 1 : 0; + CommandLine.joyhats_dpad = gtk_toggle_button_get_active(JHatsAsDPad) ? 1 : 0; + + // Keyboard / Joystick buttons mapping + for (i=0; i<10; i++) { + CommandLine.keyb_a[i] = gtk_combo_box_get_active(KComboA[i]); + CommandLine.keyb_b[i] = gtk_combo_box_get_active(KComboB[i]); + CommandLine.joybutton[i] = gtk_combo_box_get_active(JCombo[i]); + } + + if (newdevice) reopenjoystick(); + KeyboardRemap(&KeybMapSDL); +} + +static void InputWindow_ButtonRestore_clicked(GtkWidget *widget, gpointer data) +{ + InputWindow_UpdateConfigs(); +} + +static void InputWindow_ButtonDefaults_clicked(GtkWidget *widget, gpointer data) +{ + // This definitions were taken from "CommandLine.c": + CommandLine.joyaxis_dpad = 1; // Joystick Axis as DPad + CommandLine.joyhats_dpad = 1; // Joystick Hats as DPad + // Joystick mapping + CommandLine.joybutton[0] = 8; // Menu: Button 8 + CommandLine.joybutton[1] = 1; // A: Button 1 + CommandLine.joybutton[2] = 2; // B: Button 2 + CommandLine.joybutton[3] = 7; // C: Button 7 + CommandLine.joybutton[4] = 10; // Up: Button 10 + CommandLine.joybutton[5] = 11; // Down: Button 11 + CommandLine.joybutton[6] = 4; // Left: Button 4 + CommandLine.joybutton[7] = 5; // Right: Button 5 + CommandLine.joybutton[8] = 9; // Power: Button 9 + CommandLine.joybutton[9] = 6; // Shake: Button 6 + // Keyboard mapping (Magic numbers!) + CommandLine.keyb_a[0] = PMKEYB_ESCAPE; // Menu: ESCAPE + CommandLine.keyb_a[1] = PMKEYB_X; // A: X + CommandLine.keyb_a[2] = PMKEYB_Z; // B: Z + CommandLine.keyb_a[3] = PMKEYB_C; // C: C + CommandLine.keyb_a[4] = PMKEYB_UP; // Up: UP + CommandLine.keyb_a[5] = PMKEYB_DOWN; // Down: DOWN + CommandLine.keyb_a[6] = PMKEYB_LEFT; // Left: LEFT + CommandLine.keyb_a[7] = PMKEYB_RIGHT; // Right: RIGHT + CommandLine.keyb_a[8] = PMKEYB_E; // Power: E + CommandLine.keyb_a[9] = PMKEYB_A; // Shake: A + // Keyboard alternative mapping (Magic numbers!) + CommandLine.keyb_b[0] = PMKEYB_Q; // Menu: Q + CommandLine.keyb_b[1] = PMKEYB_NONE; // A: NONE + CommandLine.keyb_b[2] = PMKEYB_NONE; // B: NONE + CommandLine.keyb_b[3] = PMKEYB_D; // C: D + CommandLine.keyb_b[4] = PMKEYB_KP_8; // Up: KP_8 + CommandLine.keyb_b[5] = PMKEYB_KP_2; // Down: KP_2 + CommandLine.keyb_b[6] = PMKEYB_KP_4; // Left: KP_4 + CommandLine.keyb_b[7] = PMKEYB_KP_6; // Right: KP_6 + CommandLine.keyb_b[8] = PMKEYB_P; // Power: P + CommandLine.keyb_b[9] = PMKEYB_S; // Shake: S + + InputWindow_UpdateConfigs(); +} + +static void InputWindow_ButtonClose_clicked(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(InputWindow)); +} + +// ------------ +// Input Window +// ------------ + +static void LoadKeybsymOnCombo(GtkComboBox *combo) +{ + int i; + for (i=0; i. +*/ + +#ifndef INPUTWINDOW_H +#define INPUTWINDOW_H + +#include +#include + +// This window management +int InputWindow_Create(void); +void InputWindow_Destroy(void); +void InputWindow_Activate(int tab); +void InputWindow_UpdateConfigs(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/MemWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MemWindow.c new file mode 100644 index 0000000000..628d823e26 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MemWindow.c @@ -0,0 +1,797 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "MemWindow.h" +#include "PokeMiniIcon_96x128.h" +#include "InstructionProc.h" +#include "InstructionInfo.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int MemWindow_InConfigs = 0; + +GtkWindow *MemWindow; +static int MemWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static SGtkXDrawingView MemView; + +static int CustomFont8x12Display = 0; +static uint32_t CustomFont8x12Addr = 0; +static uint8_t CustomFont8x12[8*12*256]; + +void WriteToPMMem(uint32_t addr, uint8_t data) +{ + if (addr < 0x1000) { + // BIOS + PM_BIOS[addr & 4095] = data; + } else if (addr < 0x2000) { + // RAM + PM_RAM[addr & 4095] = data; + } else if (addr < 0x2100) { + // Hardware IO + MinxCPU_OnWrite(0, addr, data); + } else { + // ROM + PM_ROM[addr & PM_ROM_Mask] = data; + } +} + +static void GenerateFont8x12FromAddr(uint8_t *CustomFont8x12, uint32_t addr) +{ + int ch, tx; + uint8_t dat, *ptr; + memset(CustomFont8x12, 0, 8*12*256); + for (ch=0; ch<256; ch++) { + ptr = &CustomFont8x12[(ch >> 4) * 1536 + (ch & 15) * 8 + 2 * 128]; + for (tx=0; tx<8; tx++) { + dat = MinxCPU_OnRead(0, addr++); + ptr[0*128+tx] = dat & 0x01; + ptr[1*128+tx] = dat & 0x02; + ptr[2*128+tx] = dat & 0x04; + ptr[3*128+tx] = dat & 0x08; + ptr[4*128+tx] = dat & 0x10; + ptr[5*128+tx] = dat & 0x20; + ptr[6*128+tx] = dat & 0x40; + ptr[7*128+tx] = dat & 0x80; + } + } +} + +static void GenerateFont8x12FromPtr(uint8_t *CustomFont8x12, uint8_t *fontptr) +{ + int ch, tx; + uint8_t dat, *ptr; + memset(CustomFont8x12, 0, 8*12*256); + for (ch=0; ch<256; ch++) { + ptr = &CustomFont8x12[(ch >> 4) * 1536 + (ch & 15) * 8 + 2 * 128]; + for (tx=0; tx<8; tx++) { + dat = *fontptr++; + ptr[0*128+tx] = dat & 0x01; + ptr[1*128+tx] = dat & 0x02; + ptr[2*128+tx] = dat & 0x04; + ptr[3*128+tx] = dat & 0x08; + ptr[4*128+tx] = dat & 0x10; + ptr[5*128+tx] = dat & 0x20; + ptr[6*128+tx] = dat & 0x40; + ptr[7*128+tx] = dat & 0x80; + } + } +} + +// ------- +// Viewers +// ------- + +// Memory view go to addr +static void MemView_GotoAddr(uint32_t addr, int highlight) +{ + int set_line = addr >> 4; + + // Don't do anything if it's outside range + if ((addr < 0) || (addr > PM_ROM_Size)) return; + + // Highlight address + if (highlight) { + MemView.highlight_addr = addr; + MemView.highlight_rem = 16; + } + + // Try to point at the top + if ((set_line < MemView.sboffset) || (set_line >= (MemView.sboffset + MemView.total_lines - 1))) { + sgtkx_drawing_view_sbvalue(&MemView, set_line - (MemView.total_lines >> 1)); + } +} + +// Memory view exposure event +static int MemView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + uint8_t dat, sdat, watch; + int x, y, pp, spp; + int yc, xs = -1, ys = -1; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + if ((widg->mousex >= 72) && (widg->mousex < 392)) { + xs = (widg->mousex - 72) / 20; + ys = (widg->mousey - 12) / 12; + } + if ((widg->mousex >= 392) && (widg->mousex < 520)) { + xs = (widg->mousex - 392) / 8; + ys = (widg->mousey - 12) / 12; + } + } + + // Decrement highlighting remain timer + if (MemView.highlight_rem) { + MemView.highlight_rem--; + sgtkx_drawing_view_repaint_after(&MemView, 250); + } + + // Draw content + pp = spp = widg->sboffset * 16; + for (y=1; ywidth, 12, color); + if (MemView.highlight_rem && ((MemView.highlight_addr & ~15) == pp)) { + dat = MemView.highlight_addr & 15; + sgtkx_drawing_view_drawfrect(widg, 72+dat*20, y * 12, 16, 12, 0xFFE060); + sgtkx_drawing_view_drawfrect(widg, 392+dat*8, y * 12, 8, 12, 0xFFE060); + } + if (((y-1) == ys) && (xs >= 0)) { + sgtkx_drawing_view_drawfrect(widg, 72+xs*20, y * 12, 16, 12, color - 0x181818); + sgtkx_drawing_view_drawfrect(widg, 392+xs*8, y * 12, 8, 12, color - 0x181818); + } + + if (pp >= PM_ROM_Size) continue; + sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%06X:", pp); + for (x=0; x<16; x++) { + dat = MinxCPU_OnRead(0, pp); + sdat = (dat < 0x01) ? '.' : dat; + watch = PMD_TrapPoints[pp & PM_ROM_Mask] & TRAPPOINT_WATCH; + if (watch) { + sgtkx_drawing_view_drawfrect(widg, 72 + x * 20, y * 12, 16, 12, AnyView_TrapColor[watch]); + } + sgtkx_drawing_view_drawtext(widg, 72 + x * 20, y * 12, 0x4C4C00, "%02X", (int)dat); + if (CustomFont8x12Display) sgtkx_drawing_view_setfont(CustomFont8x12); + sgtkx_drawing_view_drawchar(widg, 392 + x * 8, y * 12, 0x304C00, sdat); + sgtkx_drawing_view_setfont(NULL); + pp++; + } + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + pp = spp + ys * 16 + xs; + if ((ys >= 0) && (pp < PM_ROM_Size)) { + dat = MinxCPU_OnRead(0, pp); + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Memory Content [ $%04X => $%02X, %i ]", pp, dat, dat); + } else { + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Memory Content"); + } + + return 1; +} + +// Memory view button press +static int MemView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int result = 0, pp; + int xs = -1, ys = -1; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + if ((widg->mousex >= 72) && (widg->mousex < 392)) { + xs = (widg->mousex - 72) / 20; + ys = (widg->mousey - 12) / 12; + } else if ((widg->mousex >= 392) && (widg->mousex < 520)) { + xs = (widg->mousex - 392) / 8; + ys = (widg->mousey - 12) / 12; + } else return 0; + + set_emumode(EMUMODE_STOP, 1); + + // Process selected item + pp = widg->sboffset * 16 + ys * 16 + xs; + if (button == SGTKXDV_BLEFT) { + if (pp < PM_ROM_Size) { + AnyView_NewValue_CD[1].number = (int)MinxCPU_OnRead(0, pp); + AnyView_NewValue_CD[3].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHREAD; + AnyView_NewValue_CD[4].number = PMD_TrapPoints[pp] & TRAPPOINT_WATCHWRITE; + sprintf(AnyView_NewValue_CD[0].text, "Set new value for $%04X:", pp); + result = CustomDialog(MemWindow, "Change memory", AnyView_NewValue_CD); + if (result == 1) { + WriteToPMMem(pp, AnyView_NewValue_CD[1].number); + PMD_TrapPoints[pp] &= ~TRAPPOINT_WATCH; + if (AnyView_NewValue_CD[3].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHREAD; + if (AnyView_NewValue_CD[4].number) PMD_TrapPoints[pp] |= TRAPPOINT_WATCHWRITE; + refresh_debug(1); + } else if (result == -1) { + MessageDialog(MemWindow, "Invalid number", "Change register", GTK_MESSAGE_ERROR, NULL); + } + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// -------------- +// Menu callbacks +// -------------- + +static void MemW_Goto_Address(GtkWidget *widget, gpointer data) +{ + int val = MemView.sboffset * 16; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MemWindow, "Go to address", "Set address to top of view:", &val, val, 6, 1, 0, PM_ROM_Size-1)) { + MemView_GotoAddr(val, 1); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void MemW_Goto_SAddress(GtkWidget *widget, gpointer data) +{ + int addr = (int)data; + sgtkx_drawing_view_sbvalue(&MemView, addr/16); +} + +static void MemW_Goto_BAddress(GtkWidget *widget, gpointer data) +{ + int val = MemView.sboffset * 16 / 0x8000; + int mbanks = PM_ROM_Mask / 0x8000; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MemWindow, "Go to bank", "Set bank to top of view:", &val, val, 2, 0, 0, mbanks)) { + if (val) sgtkx_drawing_view_sbvalue(&MemView, val*0x8000/16); + else sgtkx_drawing_view_sbvalue(&MemView, 0x2100/16); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void MemW_Break_AddWPAt(GtkWidget *widget, gpointer data) +{ + int i, num; + + set_emumode(EMUMODE_STOP, 1); + + AnyView_AddWPAt_CD[1].number = 0x1000; + AnyView_AddWPAt_CD[3].number = 1; + AnyView_AddWPAt_CD[5].number = 1; + AnyView_AddWPAt_CD[6].number = 1; + if (CustomDialog(MainWindow, "Add watchpoing at...", AnyView_AddWPAt_CD)) { + for (i=0; i= PM_ROM_Size)) { + MessageDialog(MemWindow, "Address out of range", "Add watchpoint at...", GTK_MESSAGE_ERROR, NULL); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + PMD_TrapPoints[num] &= ~TRAPPOINT_WATCH; + if (AnyView_AddWPAt_CD[5].number) PMD_TrapPoints[num] |= TRAPPOINT_WATCHREAD; + if (AnyView_AddWPAt_CD[6].number) PMD_TrapPoints[num] |= TRAPPOINT_WATCHWRITE; + } + refresh_debug(1); + } + + set_emumode(EMUMODE_RESTORE, 1); +} + +static void MemW_Break_DelAllWP(GtkWidget *widget, gpointer data) +{ + int i; + for (i=0; i> 8); + else WriteToPMMem(MemView_FillData16[1].number + i, dat & 0xFF); + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void MemW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void MemW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (MemWindow_InConfigs) return; + + if (index >= 0) { + dclc_memwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MemWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_memwin_refresh, 4, 0, 0, 1000)) { + dclc_memwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint MemWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(MemWindow)); + return TRUE; +} + +static gboolean MemWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) MemWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry MemWindow_MenuItems[] = { + { "/_Go to", NULL, NULL, 0, "" }, + { "/Go to/_Address...", "G", MemW_Goto_Address, 0, "" }, + { "/Go to/_BIOS top", "B", MemW_Goto_SAddress, 0x0000, "" }, + { "/Go to/RA_M top", "M", MemW_Goto_SAddress, 0x1000, "" }, + { "/Go to/_Hardware IO top", "H", MemW_Goto_SAddress, 0x2000, "" }, + { "/Go to/Cartridge R_OM top", "O", MemW_Goto_SAddress, 0x2100, "" }, + { "/Go to/Cartridge _Bank n top", "B", MemW_Goto_BAddress, 0, "" }, + + { "/_Break", NULL, NULL, 0, "" }, + { "/Break/_Add Watchpoint at...", "W", MemW_Break_AddWPAt, 0, "" }, + { "/Break/_Delete all watchpoints", NULL, MemW_Break_DelAllWP, 0, "" }, + + { "/_Character set", NULL, NULL, 0, "" }, + { "/Character set/_Default", "C", MemW_CharSet_Default, 0, "" }, + { "/Character set/From _ROM...", "C", MemW_CharSet_FromROM, 0, "" }, + { "/Character set/From _file...", "C",MemW_CharSet_FromFile, 0, "" }, + + { "/_Memory data", NULL, NULL, 0, "" }, + { "/Memory data/_Import from file...", "I", MemW_ImportData, 0, "" }, + { "/Memory data/_Export to file...", "E", MemW_ExportData, 0, "" }, + { "/Memory data/_Copy block", "V", MemW_CopyData, 0, "" }, + { "/Memory data/_Fill 8-bits value", "X", MemW_FillData8, 0, "" }, + { "/Memory data/_Fill 16-bits value", "Y", MemW_FillData16, 0, "" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, MemW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, MemW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, MemW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, MemW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, MemW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, MemW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, MemW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, MemW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, MemW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, MemW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, MemW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint MemWindow_MenuItemsNum = sizeof(MemWindow_MenuItems) / sizeof(*MemWindow_MenuItems); + +// ---------- +// Mem Window +// ---------- + +int MemWindow_Create(void) +{ + // Window + MemWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(MemWindow), "Memory View"); + gtk_widget_set_size_request(GTK_WIDGET(MemWindow), 200, 100); + gtk_window_set_default_size(MemWindow, 420, 200); + g_signal_connect(MemWindow, "delete_event", G_CALLBACK(MemWindow_delete_event), NULL); + g_signal_connect(MemWindow, "window-state-event", G_CALLBACK(MemWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(MemWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, MemWindow_MenuItemsNum, MemWindow_MenuItems, NULL); + gtk_window_add_accel_group(MemWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Mem View + MemView.on_exposure = SGtkXDVCB(MemView_exposure); + MemView.on_scroll = SGtkXDVCB(AnyView_scroll); + MemView.on_resize = SGtkXDVCB(AnyView_resize); + MemView.on_motion = SGtkXDVCB(AnyView_motion); + MemView.on_buttonpress = SGtkXDVCB(MemView_buttonpress); + MemView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&MemView, 1); + sgtkx_drawing_view_sbminmax(&MemView, 0, 255); // $1000 to $1FFF + gtk_widget_set_size_request(GTK_WIDGET(MemView.box), 64, 64); + gtk_box_pack_start(VBox1, GTK_WIDGET(MemView.box), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MemView.box)); + + return 1; +} + +void MemWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(MemWindow))) { + gtk_widget_show(GTK_WIDGET(MemWindow)); + gtk_window_deiconify(MemWindow); + gtk_window_get_position(MemWindow, &x, &y); + gtk_window_get_size(MemWindow, &width, &height); + dclc_memwin_winx = x; + dclc_memwin_winy = y; + dclc_memwin_winw = width; + dclc_memwin_winh = height; + } +} + +void MemWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(MemWindow)); + if ((dclc_memwin_winx > -15) && (dclc_memwin_winy > -16)) { + gtk_window_move(MemWindow, dclc_memwin_winx, dclc_memwin_winy); + } + if ((dclc_memwin_winw > 0) && (dclc_memwin_winh > 0)) { + gtk_window_resize(MemWindow, dclc_memwin_winw, dclc_memwin_winh); + } + gtk_widget_show(GTK_WIDGET(MemWindow)); + gtk_window_present(MemWindow); +} + +void MemWindow_UpdateConfigs(void) +{ + MemWindow_InConfigs = 1; + + switch (dclc_memwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + MemWindow_InConfigs = 0; +} + +void MemWindow_ROMResized(void) +{ + sgtkx_drawing_view_sbminmax(&MemView, 0, (PM_ROM_Size/16)-1); +} + +void MemWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(MemView.box)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(MemView.box)); + } +} + +void MemWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_memwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(MemWindow)) || MemWindow_minimized) return; + } + sgtkx_drawing_view_refresh(&MemView); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/MemWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MemWindow.h new file mode 100644 index 0000000000..b79fa2cfa7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MemWindow.h @@ -0,0 +1,37 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MEMWINDOW_H +#define MEMWINDOW_H + +#include +#include + +// Write to pokemon-mini memory directly +void WriteToPMMem(uint32_t addr, uint8_t data); + +// This window management +int MemWindow_Create(void); +void MemWindow_Destroy(void); +void MemWindow_Activate(void); +void MemWindow_UpdateConfigs(void); +void MemWindow_ROMResized(void); +void MemWindow_Sensitive(int enabled); +void MemWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/MiscWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MiscWindow.c new file mode 100644 index 0000000000..eed2d3ece8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MiscWindow.c @@ -0,0 +1,589 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "MiscWindow.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int MiscWindow_InConfigs = 0; + +GtkWindow *MiscWindow; +static int MiscWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkScrolledWindow *MiscSW; +static GtkBox *VBox2; +static GtkFrame *FramePRC; +static GtkBox *VBoxPRC; +static GtkLabel *LabelsPRC[8]; +static GtkFrame *FrameColorPRC; +static GtkBox *VBoxColorPRC; +static GtkLabel *LabelsColorPRC[11]; +static GtkFrame *FrameLCD; +static GtkBox *VBoxLCD; +static GtkLabel *LabelsLCD[12]; +static GtkFrame *FrameEEPROM; +static GtkBox *VBoxEEPROM; +static GtkLabel *LabelsEEPROM[5]; +static GtkFrame *FrameMulticart; +static GtkBox *VBoxMulticart; +static GtkLabel *LabelsMulticart[10]; + +// Enable/Disable frames +static int MiscShow_PRC = 1; +static int MiscShow_ColorPRC = 1; +static int MiscShow_LCD = 1; +static int MiscShow_EEPROM = 1; +static int MiscShow_Multicart = 1; + +// --------------- +// Get information +// --------------- + +static char *EEPROM_TxtOperState[] = { + "Device ID", + "High Address Byte", + "Low Address Byte", + "Write Byte", + "Read Byte" +}; + +static char *Multicart_TxtType[] = { + "0 - Disabled", + "1 - Flash 512KB (AM29LV040B)", + "2 - Lupin 512KB (AM29LV040B)" +}; + +static char *Multicart_TxtBusCycle[] = { + "1st", "2nd", "3rd", "4th", "5th" +}; + +static char *Multicart_TxtCommand[] = { + "None", "Programming", "Erasing" +}; + +static char *ColorPRC_Access[] = { + "Fixed", "Post-Increment", "Post-Decrement", "Pre-Increment" +}; + +static void MiscWindow_Render(int force) +{ + char tmp[PMTMPV]; + int val; + + // PRC + if (MiscShow_PRC) { + sprintf(tmp, "Copy to LCD: %s", MinxPRC.PRCMode ? "Yes" : "No"); + gtk_label_set_text(LabelsPRC[0], tmp); + sprintf(tmp, "Map Render: %s", (MinxPRC.PRCMode == 2) && (PMR_PRC_MODE & 0x02) ? "Yes" : "No"); + gtk_label_set_text(LabelsPRC[1], tmp); + sprintf(tmp, "Map Tile Base: $%06X", (int)MinxPRC.PRCBGBase); + gtk_label_set_text(LabelsPRC[2], tmp); + sprintf(tmp, "Sprites Render: %s", (MinxPRC.PRCMode == 2) && (PMR_PRC_MODE & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsPRC[3], tmp); + sprintf(tmp, "Sprite Tile Base: $%06X", (int)MinxPRC.PRCSprBase); + gtk_label_set_text(LabelsPRC[4], tmp); + val = (MinxPRC.PRCRateMatch >> 4) + 1; + sprintf(tmp, "Frame Rate: /%i (%i Hz)", val, 72 / val); + gtk_label_set_text(LabelsPRC[5], tmp); + sprintf(tmp, "Frame Match: %i (%i)", (int)(PMR_PRC_RATE >> 4), (int)(MinxPRC.PRCRateMatch >> 4)); + gtk_label_set_text(LabelsPRC[6], tmp); + val = MinxPRC.PRCCnt >> 24; + sprintf(tmp, "PRC Counter: $%02X, %i", val, val); + gtk_label_set_text(LabelsPRC[7], tmp); + } + + // Color PRC + if (MiscShow_ColorPRC) { + sprintf(tmp, "Color available: %s", PRCColorMap ? "Yes" : "No"); + gtk_label_set_text(LabelsColorPRC[0], tmp); + if (PRCColorMap) { + sprintf(tmp, "Color Mode: %s%s", PokeMini_ColorFormat ? "4x4" : "8x8", (PRCColorFlags & 2) ? " +RAM Copy" : ""); + gtk_label_set_text(LabelsColorPRC[1], tmp); + sprintf(tmp, "Unlock Code <%04X< (5ACE)", (int)MinxColorPRC.UnlockCode); + gtk_label_set_text(LabelsColorPRC[2], tmp); + sprintf(tmp, "Unlocked: %s", MinxColorPRC.Unlocked ? "Yes" : "No"); + gtk_label_set_text(LabelsColorPRC[3], tmp); + sprintf(tmp, "CVRAM Active Page: %i", (int)MinxColorPRC.ActivePage); + gtk_label_set_text(LabelsColorPRC[4], tmp); + sprintf(tmp, "CVRAM Address: $%04X", (int)MinxColorPRC.Address); + gtk_label_set_text(LabelsColorPRC[5], tmp); + sprintf(tmp, "Access Mode: %s", ColorPRC_Access[MinxColorPRC.Access & 3]); + gtk_label_set_text(LabelsColorPRC[6], tmp); + val = MinxColorPRC.LNColor0; + sprintf(tmp, "Low Nibble Pixel 0 Color: $%02X, %i", val, val); + gtk_label_set_text(LabelsColorPRC[7], tmp); + val = MinxColorPRC.HNColor0; + sprintf(tmp, "High Nibble Pixel 0 Color: $%02X, %i", val, val); + gtk_label_set_text(LabelsColorPRC[8], tmp); + val = MinxColorPRC.LNColor1; + sprintf(tmp, "Low Nibble Pixel 1 Color: $%02X, %i", val, val); + gtk_label_set_text(LabelsColorPRC[9], tmp); + val = MinxColorPRC.HNColor1; + sprintf(tmp, "High Nibble Pixel 1 Color: $%02X, %i", val, val); + gtk_label_set_text(LabelsColorPRC[10], tmp); + } else { + gtk_label_set_text(LabelsColorPRC[1], "----"); + gtk_label_set_text(LabelsColorPRC[2], "----"); + gtk_label_set_text(LabelsColorPRC[3], "----"); + gtk_label_set_text(LabelsColorPRC[4], "----"); + gtk_label_set_text(LabelsColorPRC[5], "----"); + gtk_label_set_text(LabelsColorPRC[6], "----"); + gtk_label_set_text(LabelsColorPRC[7], "----"); + gtk_label_set_text(LabelsColorPRC[8], "----"); + gtk_label_set_text(LabelsColorPRC[9], "----"); + gtk_label_set_text(LabelsColorPRC[10], "----"); + } + } + + // LCD + if (MiscShow_LCD) { + sprintf(tmp, "Display On: %s", MinxLCD.DisplayOn ? "Yes" : "No"); + gtk_label_set_text(LabelsLCD[0], tmp); + sprintf(tmp, "Column: %i%c", (int)MinxLCD.Column, MinxLCD.RequireDummyR ? '*' : ' '); + gtk_label_set_text(LabelsLCD[1], tmp); + sprintf(tmp, "Page: %i", (int)MinxLCD.Page); + gtk_label_set_text(LabelsLCD[2], tmp); + sprintf(tmp, "Start Line: %i", (int)MinxLCD.StartLine); + gtk_label_set_text(LabelsLCD[3], tmp); + sprintf(tmp, "Next CMD is Contrast: %s", MinxLCD.SetContrast ? "Yes" : "No"); + gtk_label_set_text(LabelsLCD[4], tmp); + sprintf(tmp, "Contrast: %i", (int)MinxLCD.Contrast); + gtk_label_set_text(LabelsLCD[5], tmp); + sprintf(tmp, "Segment Direction: %s", MinxLCD.SegmentDir ? "Inverted" : "Normal"); + gtk_label_set_text(LabelsLCD[6], tmp); + sprintf(tmp, "Max Contrast: %s", MinxLCD.MaxContrast ? "Yes" : "No"); + gtk_label_set_text(LabelsLCD[7], tmp); + sprintf(tmp, "Set All Pixels: %s", MinxLCD.SetAllPix ? "Yes" : "No"); + gtk_label_set_text(LabelsLCD[8], tmp); + sprintf(tmp, "Invert All Pixels: %s", MinxLCD.InvAllPix ? "Yes" : "No"); + gtk_label_set_text(LabelsLCD[9], tmp); + sprintf(tmp, "Row Order: %s", MinxLCD.RowOrder ? "Top->Bottom" : "Bottom->Top"); + gtk_label_set_text(LabelsLCD[10], tmp); + sprintf(tmp, "Read Modify Write: %s (%i)", MinxLCD.ReadModifyMode ? "On" : "Off", MinxLCD.RMWColumn); + gtk_label_set_text(LabelsLCD[11], tmp); + } + + // EEPROM + if (MiscShow_EEPROM) { + sprintf(tmp, "Listening: %s", MinxIO.ListenState ? "Yes" : "No"); + gtk_label_set_text(LabelsEEPROM[0], tmp); + if (MinxIO.ListenState) { + sprintf(tmp, "Operation State: Waiting %s", EEPROM_TxtOperState[MinxIO.OperState]); + } else { + strcpy(tmp, "Operation State: Idle"); + } + gtk_label_set_text(LabelsEEPROM[1], tmp); + sprintf(tmp, "Address: $%04X", (int)(MinxIO.EEPAddress & 0x1FFF)); + gtk_label_set_text(LabelsEEPROM[2], tmp); + sprintf(tmp, "Data Latch: $%02X", (int)MinxIO.EEPData); + gtk_label_set_text(LabelsEEPROM[3], tmp); + sprintf(tmp, "Data Bit Offset: %i", (int)MinxIO.EEPBit); + gtk_label_set_text(LabelsEEPROM[4], tmp); + } + + // Multicart + if (MiscShow_Multicart) { + sprintf(tmp, "Multicart type: %s", Multicart_TxtType[PM_MM_Type]); + gtk_label_set_text(LabelsMulticart[0], tmp); + sprintf(tmp, "ROM Changed: %s", PM_MM_Dirty ? "Yes" : "No"); + gtk_label_set_text(LabelsMulticart[1], tmp); + sprintf(tmp, "ROM Offset: $%06X", (int)PM_MM_Offset); + gtk_label_set_text(LabelsMulticart[2], tmp); + sprintf(tmp, "Bus Cycle: %s", Multicart_TxtBusCycle[PM_MM_BusCycle]); + gtk_label_set_text(LabelsMulticart[3], tmp); + sprintf(tmp, "Product ID Mode: %s", PM_MM_GetID ? "Yes" : "No"); + gtk_label_set_text(LabelsMulticart[4], tmp); + sprintf(tmp, "Bypass Mode: %s", PM_MM_Bypass ? "Yes" : "No"); + gtk_label_set_text(LabelsMulticart[5], tmp); + sprintf(tmp, "Command: %s", Multicart_TxtCommand[PM_MM_Command]); + gtk_label_set_text(LabelsMulticart[6], tmp); + sprintf(tmp, "Last erase start: $%06X", PM_MM_LastErase_Start); + gtk_label_set_text(LabelsMulticart[7], tmp); + sprintf(tmp, "Last erase end: $%06X", PM_MM_LastErase_End); + gtk_label_set_text(LabelsMulticart[8], tmp); + sprintf(tmp, "Last programmed address: $%06X", PM_MM_LastProg); + gtk_label_set_text(LabelsMulticart[9], tmp); + } +} + +// -------------- +// Menu callbacks +// -------------- + +static void MiscW_View_PRC(GtkWidget *widget, gpointer data) +{ + if (MiscWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/PRC Status"); + MiscShow_PRC = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (MiscShow_PRC) gtk_widget_show(GTK_WIDGET(FramePRC)); + else gtk_widget_hide(GTK_WIDGET(FramePRC)); + MiscWindow_Refresh(1); +} + +static void MiscW_View_ColorPRC(GtkWidget *widget, gpointer data) +{ + if (MiscWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Color PRC Status"); + MiscShow_ColorPRC = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (MiscShow_ColorPRC) gtk_widget_show(GTK_WIDGET(FrameColorPRC)); + else gtk_widget_hide(GTK_WIDGET(FrameColorPRC)); + MiscWindow_Refresh(1); +} + +static void MiscW_View_LCD(GtkWidget *widget, gpointer data) +{ + if (MiscWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/LCD Internals"); + MiscShow_LCD = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (MiscShow_LCD) gtk_widget_show(GTK_WIDGET(FrameLCD)); + else gtk_widget_hide(GTK_WIDGET(FrameLCD)); + MiscWindow_Refresh(1); +} + +static void MiscW_View_EEPROM(GtkWidget *widget, gpointer data) +{ + if (MiscWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/EEPROM Internals"); + MiscShow_EEPROM = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (MiscShow_EEPROM) gtk_widget_show(GTK_WIDGET(FrameEEPROM)); + else gtk_widget_hide(GTK_WIDGET(FrameEEPROM)); + MiscWindow_Refresh(1); +} + +static void MiscW_View_Multicart(GtkWidget *widget, gpointer data) +{ + if (MiscWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Multicart Internals"); + MiscShow_Multicart = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (MiscShow_Multicart) gtk_widget_show(GTK_WIDGET(FrameMulticart)); + else gtk_widget_hide(GTK_WIDGET(FrameMulticart)); + MiscWindow_Refresh(1); +} + +static void MiscW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void MiscW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (MiscWindow_InConfigs) return; + + if (index >= 0) { + dclc_miscwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(MiscWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_miscwin_refresh, 4, 0, 0, 1000)) { + dclc_miscwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint MiscWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(MiscWindow)); + return TRUE; +} + +static gboolean MiscWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) MiscWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry MiscWindow_MenuItems[] = { + { "/_View", NULL, NULL, 0, "" }, + { "/View/PRC Status", NULL, MiscW_View_PRC, 0, "" }, + { "/View/Color PRC Status", NULL, MiscW_View_ColorPRC, 0, "" }, + { "/View/LCD Internals", NULL, MiscW_View_LCD, 0, "" }, + { "/View/EEPROM Internals", NULL, MiscW_View_EEPROM, 0, "" }, + { "/View/Multicart Internals", NULL, MiscW_View_Multicart, 0, "" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, MiscW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, MiscW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, MiscW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, MiscW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, MiscW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, MiscW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, MiscW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, MiscW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, MiscW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, MiscW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, MiscW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint MiscWindow_MenuItemsNum = sizeof(MiscWindow_MenuItems) / sizeof(*MiscWindow_MenuItems); + +// ----------- +// Misc Window +// ----------- + +int MiscWindow_Create(void) +{ + int i; + + // Window + MiscWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(MiscWindow), "Misc. View"); + gtk_widget_set_size_request(GTK_WIDGET(MiscWindow), 200, 100); + gtk_window_set_default_size(MiscWindow, 420, 200); + g_signal_connect(MiscWindow, "delete_event", G_CALLBACK(MiscWindow_delete_event), NULL); + g_signal_connect(MiscWindow, "window-state-event", G_CALLBACK(MiscWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(MiscWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, MiscWindow_MenuItemsNum, MiscWindow_MenuItems, NULL); + gtk_window_add_accel_group(MiscWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Scrolling window with vertical box + MiscSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(MiscSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(VBox1), GTK_WIDGET(MiscSW)); + gtk_widget_show(GTK_WIDGET(MiscSW)); + VBox2 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_scrolled_window_add_with_viewport(MiscSW, GTK_WIDGET(VBox2)); + gtk_widget_show(GTK_WIDGET(VBox2)); + + // PRC + FramePRC = GTK_FRAME(gtk_frame_new(" PRC Status ")); + gtk_box_pack_start(VBox2, GTK_WIDGET(FramePRC), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(FramePRC)); + VBoxPRC = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FramePRC), GTK_WIDGET(VBoxPRC)); + gtk_widget_show(GTK_WIDGET(VBoxPRC)); + for (i=0; i<8; i++) { + LabelsPRC[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsPRC[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsPRC[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxPRC, GTK_WIDGET(LabelsPRC[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsPRC[i])); + } + + // Color PRC + FrameColorPRC = GTK_FRAME(gtk_frame_new(" Color PRC Status ")); + gtk_box_pack_start(VBox2, GTK_WIDGET(FrameColorPRC), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(FrameColorPRC)); + VBoxColorPRC = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameColorPRC), GTK_WIDGET(VBoxColorPRC)); + gtk_widget_show(GTK_WIDGET(VBoxColorPRC)); + for (i=0; i<11; i++) { + LabelsColorPRC[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsColorPRC[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsColorPRC[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxColorPRC, GTK_WIDGET(LabelsColorPRC[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsColorPRC[i])); + } + + // LCD + FrameLCD = GTK_FRAME(gtk_frame_new(" LCD Internals ")); + gtk_box_pack_start(VBox2, GTK_WIDGET(FrameLCD), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(FrameLCD)); + VBoxLCD = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameLCD), GTK_WIDGET(VBoxLCD)); + gtk_widget_show(GTK_WIDGET(VBoxLCD)); + for (i=0; i<12; i++) { + LabelsLCD[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsLCD[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsLCD[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxLCD, GTK_WIDGET(LabelsLCD[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsLCD[i])); + } + + // EEPROM + FrameEEPROM = GTK_FRAME(gtk_frame_new(" EEPROM Internals ")); + gtk_box_pack_start(VBox2, GTK_WIDGET(FrameEEPROM), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(FrameEEPROM)); + VBoxEEPROM = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameEEPROM), GTK_WIDGET(VBoxEEPROM)); + gtk_widget_show(GTK_WIDGET(VBoxEEPROM)); + for (i=0; i<5; i++) { + LabelsEEPROM[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsEEPROM[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsEEPROM[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxEEPROM, GTK_WIDGET(LabelsEEPROM[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsEEPROM[i])); + } + + // Multicart + FrameMulticart = GTK_FRAME(gtk_frame_new(" Multicart Internals ")); + gtk_box_pack_start(VBox2, GTK_WIDGET(FrameMulticart), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(FrameMulticart)); + VBoxMulticart = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameMulticart), GTK_WIDGET(VBoxMulticart)); + gtk_widget_show(GTK_WIDGET(VBoxMulticart)); + for (i=0; i<10; i++) { + LabelsMulticart[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsMulticart[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsMulticart[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxMulticart, GTK_WIDGET(LabelsMulticart[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsMulticart[i])); + } + + return 1; +} + +void MiscWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(MiscWindow))) { + gtk_widget_show(GTK_WIDGET(MiscWindow)); + gtk_window_deiconify(MiscWindow); + gtk_window_get_position(MiscWindow, &x, &y); + gtk_window_get_size(MiscWindow, &width, &height); + dclc_miscwin_winx = x; + dclc_miscwin_winy = y; + dclc_miscwin_winw = width; + dclc_miscwin_winh = height; + } +} + +void MiscWindow_Activate(void) +{ + MiscWindow_Render(1); + if (MiscShow_PRC) gtk_widget_show(GTK_WIDGET(FramePRC)); + else gtk_widget_hide(GTK_WIDGET(FramePRC)); + if (MiscShow_ColorPRC) gtk_widget_show(GTK_WIDGET(FrameColorPRC)); + else gtk_widget_hide(GTK_WIDGET(FrameColorPRC)); + if (MiscShow_LCD) gtk_widget_show(GTK_WIDGET(FrameLCD)); + else gtk_widget_hide(GTK_WIDGET(FrameLCD)); + if (MiscShow_EEPROM) gtk_widget_show(GTK_WIDGET(FrameEEPROM)); + else gtk_widget_hide(GTK_WIDGET(FrameEEPROM)); + if (MiscShow_Multicart) gtk_widget_show(GTK_WIDGET(FrameMulticart)); + else gtk_widget_hide(GTK_WIDGET(FrameMulticart)); + gtk_widget_realize(GTK_WIDGET(MiscWindow)); + if ((dclc_miscwin_winx > -15) && (dclc_miscwin_winy > -16)) { + gtk_window_move(MiscWindow, dclc_miscwin_winx, dclc_miscwin_winy); + } + if ((dclc_miscwin_winw > 0) && (dclc_miscwin_winh > 0)) { + gtk_window_resize(MiscWindow, dclc_miscwin_winw, dclc_miscwin_winh); + } + gtk_widget_show(GTK_WIDGET(MiscWindow)); + gtk_window_present(MiscWindow); +} + +void MiscWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + + MiscWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/View/PRC Status"); + if (MiscShow_PRC) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Color PRC Status"); + if (MiscShow_ColorPRC) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/LCD Internals"); + if (MiscShow_LCD) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/EEPROM Internals"); + if (MiscShow_EEPROM) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Multicart Internals"); + if (MiscShow_Multicart) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + switch (dclc_miscwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + MiscWindow_InConfigs = 0; +} + +void MiscWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(MiscSW)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(MiscSW)); + } +} + +void MiscWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_miscwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(MiscWindow)) || MiscWindow_minimized) return; + } + MiscWindow_Render(0); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/MiscWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MiscWindow.h new file mode 100644 index 0000000000..9778e4a077 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/MiscWindow.h @@ -0,0 +1,33 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MISCWINDOW_H +#define MISCWINDOW_H + +#include +#include + +// This window management +int MiscWindow_Create(void); +void MiscWindow_Destroy(void); +void MiscWindow_Activate(void); +void MiscWindow_UpdateConfigs(void); +void MiscWindow_Sensitive(int enabled); +void MiscWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCMapWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCMapWindow.c new file mode 100644 index 0000000000..8992520998 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCMapWindow.c @@ -0,0 +1,575 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "PRCMapWindow.h" +#include "PokeMini_ColorPal.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int PRCMapWindow_InConfigs = 0; + +GtkWindow *PRCMapWindow; +static int PRCMapWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkLabel *LabelInfo; +static SGtkXDrawingView PRCMapView; +static GtkLabel *MapPosInfo; + +// Locals +static int FullRedraw = 1; +static int ShowGrid = 1; +static int ShowVisible = 1; +static int Negative = 0; + +static uint32_t VisibleBorderCol[4] = {0xFF0000, 0xFFFF00, 0xFF8080, 0xFF0000}; + +// PRC Map render (Mono) +static void PRCMapRenderMono(SGtkXDrawingView *widg, int zoom, int negative) +{ + uint32_t *scanptr; + int x, y, xp, yp, xl, yl; + uint32_t tileidxaddr, ltileidxaddr = -1; + uint32_t tiledataddr = 0; + uint8_t tileidx = 0, data; + xl = MinxPRC.PRCMapTW * 8; + yl = MinxPRC.PRCMapTH * 8; + + for (y=0; yheight; y++) { + yp = y / zoom; + if (yp >= yl) break; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + if (xp >= xl) break; + + // Index address + tileidxaddr = 0x1360 + (yp >> 3) * MinxPRC.PRCMapTW + (xp >> 3); + + // Read tile index + if (ltileidxaddr != tileidxaddr) { + ltileidxaddr = tileidxaddr; + tileidx = MinxPRC_OnRead(0, tileidxaddr); + tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); + } + + // Read tile data + data = MinxPRC_OnRead(0, tiledataddr + (xp & 7)) & (1 << (yp & 7)); + if (PMR_PRC_MODE & 0x01) data = !data; + if (negative) data = !data; + + // Write result + scanptr[x] = data ? 0x000000 : 0xFFFFFF; + } + } +} + +// PRC Map render (Color 8x8) +static void PRCMapRenderColor8x8(SGtkXDrawingView *widg, int zoom, int negative) +{ + uint32_t *scanptr; + int x, y, xp, yp, xl, yl; + uint32_t tileidxaddr, ltileidxaddr = -1; + uint32_t tiledataddr = 0; + uint8_t tileidx = 0, data; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + xl = MinxPRC.PRCMapTW * 8; + yl = MinxPRC.PRCMapTH * 8; + + negative = negative ? 1 : 0; + for (y=0; yheight; y++) { + yp = y / zoom; + if (yp >= yl) break; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + if (xp >= xl) break; + + // Index address + tileidxaddr = 0x1360 + (yp >> 3) * MinxPRC.PRCMapTW + (xp >> 3); + + // Read tile index + if (ltileidxaddr != tileidxaddr) { + ltileidxaddr = tileidxaddr; + tileidx = MinxPRC_OnRead(0, tileidxaddr); + tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); + ColorMap = (uint8_t *)PRCColorMap + (tiledataddr >> 2) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + } + + // Read tile data + data = MinxPRC_OnRead(0, tiledataddr + (xp & 7)) & (1 << (yp & 7)); + if (PMR_PRC_MODE & 0x01) data = !data; + if (negative) data = !data; + data = data ? ColorMap[1] : ColorMap[0]; + + // Write result + scanptr[x] = PokeMini_ColorPalBGR32[data]; + } + } +} + +// PRC Map render (Color 4x4) +static void PRCMapRenderColor4x4(SGtkXDrawingView *widg, int zoom, int negative) +{ + uint32_t *scanptr; + int x, y, xp, yp, xl, yl, quad; + uint32_t tileidxaddr, ltileidxaddr = -1; + uint32_t tiledataddr = 0; + uint8_t tileidx = 0, data; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + xl = MinxPRC.PRCMapTW * 8; + yl = MinxPRC.PRCMapTH * 8; + + negative = negative ? 1 : 0; + for (y=0; yheight; y++) { + yp = y / zoom; + if (yp >= yl) break; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + if (xp >= xl) break; + + // Get quad index + quad = (yp & 4) + ((xp & 4) >> 1); + + // Index address + tileidxaddr = 0x1360 + (yp >> 3) * MinxPRC.PRCMapTW + (xp >> 3); + + // Read tile index + if (ltileidxaddr != tileidxaddr) { + ltileidxaddr = tileidxaddr; + tileidx = MinxPRC_OnRead(0, tileidxaddr); + tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); + ColorMap = (uint8_t *)PRCColorMap + tiledataddr - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + } + + // Read tile data + data = MinxPRC_OnRead(0, tiledataddr + (xp & 7)) & (1 << (yp & 7)); + if (PMR_PRC_MODE & 0x01) data = !data; + if (negative) data = !data; + data = data ? ColorMap[quad+1] : ColorMap[quad]; + + // Write result + scanptr[x] = PokeMini_ColorPalBGR32[data]; + } + } +} + +static void PRCMapDrawGrid(SGtkXDrawingView *widg, int zoom) +{ + int x, y; + + for (x=0; xwidth; x+=(zoom*8)) { + sgtkx_drawing_view_drawvline(widg, x, 0, widg->height, 0xC0C0C0); + sgtkx_drawing_view_drawvline(widg, x+1, 0, widg->height, 0x404040); + } + for (y=0; yheight; y+=(zoom*8)) { + sgtkx_drawing_view_drawhline(widg, y, 0, widg->width, 0xC0C0C0); + sgtkx_drawing_view_drawhline(widg, y+1, 0, widg->width, 0x404040); + } +} + +static void PRCMapDrawVisible(SGtkXDrawingView *widg, int zoom) +{ + int x, y, w, h; + x = MinxPRC.PRCMapPX * zoom; + y = MinxPRC.PRCMapPY * zoom; + w = 96 * zoom; + h = 64 * zoom; + if (zoom >= 4) sgtkx_drawing_view_drawsrect(widg, x-3, y-3, w+6, h+6, VisibleBorderCol[3]); + if (zoom >= 3) sgtkx_drawing_view_drawsrect(widg, x-2, y-2, w+4, h+4, VisibleBorderCol[2]); + if (zoom >= 2) sgtkx_drawing_view_drawsrect(widg, x-1, y-1, w+2, h+2, VisibleBorderCol[1]); + else sgtkx_drawing_view_drawsrect(widg, x-1, y-1, w+2, h+2, VisibleBorderCol[0]); + if (zoom >= 2) sgtkx_drawing_view_drawsrect(widg, x, y, w, h, VisibleBorderCol[0]); +} + +// ------- +// Viewers +// ------- + +static int PRCMapView_imgresize(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + AnyView_DrawBackground(widg, width, height, dclc_zoom_prcmap); + return 1; +} + +static int PRCMapView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + char txt[PMTMPV]; + + if (FullRedraw) { + AnyView_DrawBackground(widg, width, height, dclc_zoom_prcmap); + FullRedraw = 0; + } else { + AnyView_DrawBackground(widg, MinxPRC.PRCMapTW*8+4, MinxPRC.PRCMapTH*8+4, dclc_zoom_prcmap); + } + if (PRCColorMap) { + if (PokeMini_ColorFormat == 1) { + // Color 4x4 Attributes + PRCMapRenderColor4x4(widg, dclc_zoom_prcmap, Negative); + } else { + // Color 8x8 Attributes + PRCMapRenderColor8x8(widg, dclc_zoom_prcmap, Negative); + } + + } else { + // Mono + PRCMapRenderMono(widg, dclc_zoom_prcmap, Negative); + } + if (emumode != EMUMODE_RUNFULL) { + if (ShowGrid) PRCMapDrawGrid(widg, dclc_zoom_prcmap); + if (ShowVisible) PRCMapDrawVisible(widg, dclc_zoom_prcmap); + } else { + AnyView_DrawDisableMask(widg); + } + + // Map position label + sprintf(txt, "Map X=($%02X, %i) -:- Map Y=($%02X, %i)", + (int)MinxPRC.PRCMapPX, (int)MinxPRC.PRCMapPX, + (int)MinxPRC.PRCMapPY, (int)MinxPRC.PRCMapPY); + gtk_label_set_text(MapPosInfo, txt); + + return 1; +} + +static int PRCMapView_motion(SGtkXDrawingView *widg, int x, int y, int _c) +{ + char txt[PMTMPV]; + int tzoom, tx, ty; + int mapaddr, mapnum; + int tileaddr, tilenum; + + tzoom = 8 * dclc_zoom_prcmap; + tx = x / tzoom; + ty = y / tzoom; + mapnum = ty * MinxPRC.PRCMapTW + tx; + mapaddr = 0x1360 + mapnum; + + // Info label + if ((tx < MinxPRC.PRCMapTW) && (ty < MinxPRC.PRCMapTH)) { + tilenum = MinxPRC_OnRead(0, mapaddr); + tileaddr = MinxPRC.PRCBGBase + (tilenum << 3); + sprintf(txt, "Map=($%04X, %i) @%06X -:- Tile=($%02X, %i) @$%06X", + mapnum, mapnum, mapaddr, tilenum, tilenum, tileaddr); + } else { + strcpy(txt, "-:-"); + } + gtk_label_set_text(LabelInfo, txt); + + return 0; +} + +// -------------- +// Menu callbacks +// -------------- + +static void PRCMapW_ShowVisible(GtkWidget *widget, gpointer data) +{ + if (PRCMapWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Visible"); + ShowVisible = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + FullRedraw = 1; + PRCMapWindow_Refresh(1); +} + +static void PRCMapW_ShowGrid(GtkWidget *widget, gpointer data) +{ + if (PRCMapWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Grid"); + ShowGrid = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + FullRedraw = 1; + PRCMapWindow_Refresh(1); +} + +static void PRCMapW_Negative(GtkWidget *widget, gpointer data) +{ + if (PRCMapWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Negative"); + Negative = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCMapWindow_Refresh(1); +} + +static void PRCMapW_Zoom(GtkWidget *widget, gpointer data) +{ + if (PRCMapWindow_InConfigs) return; + dclc_zoom_prcmap = (int)data; + FullRedraw = 1; + PRCMapWindow_Refresh(1); +} + +static void PRCMapW_RefreshNow(GtkWidget *widget, gpointer data) +{ + FullRedraw = 1; + refresh_debug(1); +} + +static void PRCMapW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (PRCMapWindow_InConfigs) return; + + if (index >= 0) { + dclc_prcmapwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCMapWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_prcmapwin_refresh, 4, 0, 0, 1000)) { + dclc_prcmapwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint PRCMapWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(PRCMapWindow)); + return TRUE; +} + +static gboolean PRCMapWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) PRCMapWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry PRCMapWindow_MenuItems[] = { + { "/_View", NULL, NULL, 0, "" }, + { "/View/Show Visible", NULL, PRCMapW_ShowVisible, 0, "" }, + { "/View/Show Grid", NULL, PRCMapW_ShowGrid, 0, "" }, + { "/View/Show Negative", NULL, PRCMapW_Negative, 0, "" }, + { "/View/Zoom", NULL, NULL, 0, "" }, + { "/View/Zoom/100%", NULL, PRCMapW_Zoom, 1, "" }, + { "/View/Zoom/200%", NULL, PRCMapW_Zoom, 2, "/View/Zoom/100%" }, + { "/View/Zoom/300%", NULL, PRCMapW_Zoom, 3, "/View/Zoom/100%" }, + { "/View/Zoom/400%", NULL, PRCMapW_Zoom, 4, "/View/Zoom/100%" }, + { "/View/Zoom/500%", NULL, PRCMapW_Zoom, 5, "/View/Zoom/100%" }, + { "/View/Zoom/600%", NULL, PRCMapW_Zoom, 6, "/View/Zoom/100%" }, + { "/View/Zoom/700%", NULL, PRCMapW_Zoom, 7, "/View/Zoom/100%" }, + { "/View/Zoom/800%", NULL, PRCMapW_Zoom, 8, "/View/Zoom/100%" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, PRCMapW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, PRCMapW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, PRCMapW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, PRCMapW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, PRCMapW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, PRCMapW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, PRCMapW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, PRCMapW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, PRCMapW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, PRCMapW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, PRCMapW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint PRCMapWindow_MenuItemsNum = sizeof(PRCMapWindow_MenuItems) / sizeof(*PRCMapWindow_MenuItems); + +// -------------- +// PRC Map Window +// -------------- + +int PRCMapWindow_Create(void) +{ + // Window + PRCMapWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(PRCMapWindow), "PRC Map View"); + gtk_widget_set_size_request(GTK_WIDGET(PRCMapWindow), 200, 100); + gtk_window_set_default_size(PRCMapWindow, 420, 200); + g_signal_connect(PRCMapWindow, "delete_event", G_CALLBACK(PRCMapWindow_delete_event), NULL); + g_signal_connect(PRCMapWindow, "window-state-event", G_CALLBACK(PRCMapWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(PRCMapWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, PRCMapWindow_MenuItemsNum, PRCMapWindow_MenuItems, NULL); + gtk_window_add_accel_group(PRCMapWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Info label + LabelInfo = GTK_LABEL(gtk_label_new("-:-")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelInfo), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(LabelInfo)); + + // PRC Map View + PRCMapView.on_imgresize = SGtkXDVCB(PRCMapView_imgresize); + PRCMapView.on_exposure = SGtkXDVCB(PRCMapView_exposure); + PRCMapView.on_motion = SGtkXDVCB(PRCMapView_motion); + PRCMapView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&PRCMapView, 0); + gtk_widget_set_size_request(GTK_WIDGET(PRCMapView.box), 64, 64); + gtk_box_pack_start(VBox1, GTK_WIDGET(PRCMapView.box), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(PRCMapView.box)); + + // Map position label + MapPosInfo = GTK_LABEL(gtk_label_new("Map X=($00, 0) -:- Map Y=($00, 0)")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MapPosInfo), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MapPosInfo)); + + return 1; +} + +void PRCMapWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(PRCMapWindow))) { + gtk_widget_show(GTK_WIDGET(PRCMapWindow)); + gtk_window_deiconify(PRCMapWindow); + gtk_window_get_position(PRCMapWindow, &x, &y); + gtk_window_get_size(PRCMapWindow, &width, &height); + dclc_prcmapwin_winx = x; + dclc_prcmapwin_winy = y; + dclc_prcmapwin_winw = width; + dclc_prcmapwin_winh = height; + } +} + +void PRCMapWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(PRCMapWindow)); + if ((dclc_prcmapwin_winx > -15) && (dclc_prcmapwin_winy > -16)) { + gtk_window_move(PRCMapWindow, dclc_prcmapwin_winx, dclc_prcmapwin_winy); + } + if ((dclc_prcmapwin_winw > 0) && (dclc_prcmapwin_winh > 0)) { + gtk_window_resize(PRCMapWindow, dclc_prcmapwin_winw, dclc_prcmapwin_winh); + } + gtk_widget_show(GTK_WIDGET(PRCMapWindow)); + gtk_window_present(PRCMapWindow); +} + +void PRCMapWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + + PRCMapWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Visible"); + if (ShowVisible) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Grid"); + if (ShowGrid) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Negative"); + if (Negative) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/100%"); + if (dclc_zoom_prcmap == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/200%"); + if (dclc_zoom_prcmap == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/300%"); + if (dclc_zoom_prcmap == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/400%"); + if (dclc_zoom_prcmap == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/500%"); + if (dclc_zoom_prcmap == 5) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/600%"); + if (dclc_zoom_prcmap == 6) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/700%"); + if (dclc_zoom_prcmap == 7) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/800%"); + if (dclc_zoom_prcmap == 8) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + switch (dclc_prcmapwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + PRCMapWindow_InConfigs = 0; +} + +void PRCMapWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(PRCMapView.box)); + gtk_widget_show(GTK_WIDGET(LabelInfo)); + gtk_widget_show(GTK_WIDGET(MapPosInfo)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(PRCMapView.box)); + gtk_widget_hide(GTK_WIDGET(LabelInfo)); + gtk_widget_hide(GTK_WIDGET(MapPosInfo)); + } +} + +void PRCMapWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_prcmapwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(PRCMapWindow)) || PRCMapWindow_minimized) return; + } + sgtkx_drawing_view_refresh(&PRCMapView); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCMapWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCMapWindow.h new file mode 100644 index 0000000000..c74e265e20 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCMapWindow.h @@ -0,0 +1,34 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PRCMAPWINDOW_H +#define PRCMAPWINDOW_H + +#include +#include + +// This window management +int PRCMapWindow_Create(void); +void PRCMapWindow_Destroy(void); +void PRCMapWindow_Activate(void); +void PRCMapWindow_UpdateConfigs(void); +void PRCMapWindow_ROMResized(void); +void PRCMapWindow_Sensitive(int enabled); +void PRCMapWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCSprWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCSprWindow.c new file mode 100644 index 0000000000..2c330fa7d7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCSprWindow.c @@ -0,0 +1,805 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "PRCSprWindow.h" +#include "PokeMini_ColorPal.h" +#include "MinxPRC.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int PRCSprWindow_InConfigs = 0; + +GtkWindow *PRCSprWindow; +static int PRCSprWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static SGtkXDrawingView PRCSprView; +static GtkFrame *MFrame; +static GtkBox *MBox; +static GtkLabel *SprLabels[4]; + +// Locals +static int FullRedraw = 1; +static int SelectedSprite = 0; + +// Transparency +static const char *TransparencyColorMenu[16] = { + "/View/Transparency/Pink", + "/View/Transparency/Red", + "/View/Transparency/Green", + "/View/Transparency/Blue", + "/View/Transparency/Yellow", + "/View/Transparency/Orange", + "/View/Transparency/Purple", + "/View/Transparency/Bright Red", + "/View/Transparency/Bright Green", + "/View/Transparency/Bright Blue", + "/View/Transparency/Bright Yellow", + "/View/Transparency/Cyan", + "/View/Transparency/Black", + "/View/Transparency/Grey", + "/View/Transparency/Silver", + "/View/Transparency/White" +}; +static const uint32_t TransparencyColor[16] = { + 0xFF00FF, // Pink + 0xC00000, // Red + 0x00C000, // Green + 0x0000C0, // Blue + 0xC0C000, // Yellow + 0xFF8000, // Orange + 0x800080, // Purple + 0xFF0000, // Bright Red + 0x00FF00, // Bright Green + 0x0000FF, // Bright Blue + 0xFFFF00, // Bright Yellow + 0x00FFFF, // Cyan + 0x000000, // Black + 0x808080, // Grey + 0xC0C0C0, // Silver + 0xFFFFFF // White +}; + +static inline void PRCSprView_DrawSprite8x8_Mono(SGtkXDrawingView *widg, uint32_t transparent, + uint8_t cfg, int zoom, int X, int Y, int DrawT, int MaskT) +{ + uint32_t *scanptr; + int x, y, xp, yp, xP; + uint8_t sdata, smask; + + // Draw sprite + for (y=0; y<8*zoom; y++) { + yp = y / zoom; + if (((Y+y) < 0) || ((Y+y) >= widg->height)) break; + scanptr = &widg->imgptr[(Y+y) * widg->pitch]; + for (x=0; x<8*zoom; x++) { + xp = x / zoom; + if (((X+x) < 0) || ((X+x) >= widg->width)) break; + + xP = (cfg & 0x01) ? (7 - xp) : xp; + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + if (cfg & 0x02) smask = PRCInvertBit[smask]; + smask = smask & (1 << (yp & 7)); + + // Write result + if (!smask) { + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + if (cfg & 0x02) sdata = PRCInvertBit[sdata]; + if (cfg & 0x04) sdata = ~sdata; + sdata = sdata & (1 << (yp & 7)); + + scanptr[X+x] = sdata ? 0x000000 : 0xFFFFFF; + } else { + scanptr[X+x] = transparent; + } + } + } +} + +static inline void PRCSprView_DrawSprite8x8_Color8(SGtkXDrawingView *widg, uint32_t transparent, + uint8_t cfg, int zoom, int X, int Y, int DrawT, int MaskT) +{ + uint32_t *scanptr; + uint8_t *ColorMap; + int x, y, xp, yp, xP; + uint8_t sdata, smask; + + // Pre calculate + ColorMap = (uint8_t *)PRCColorMap + (MinxPRC.PRCSprBase >> 2) + (DrawT << 1) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Draw sprite + for (y=0; y<8*zoom; y++) { + yp = y / zoom; + if (((Y+y) < 0) || ((Y+y) >= widg->height)) break; + scanptr = &widg->imgptr[(Y+y) * widg->pitch]; + for (x=0; x<8*zoom; x++) { + xp = x / zoom; + if (((X+x) < 0) || ((X+x) >= widg->width)) break; + + xP = (cfg & 0x01) ? (7 - xp) : xp; + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + if (cfg & 0x02) smask = PRCInvertBit[smask]; + smask = smask & (1 << (yp & 7)); + + // Write result + if (!smask) { + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + if (cfg & 0x02) sdata = PRCInvertBit[sdata]; + if (cfg & 0x04) sdata = ~sdata; + sdata = sdata & (1 << (yp & 7)); + sdata = sdata ? ColorMap[1] : *ColorMap; + + scanptr[X+x] = PokeMini_ColorPalBGR32[sdata]; + } else { + scanptr[X+x] = transparent; + } + } + } +} + +static inline void PRCSprView_DrawSprite8x8_Color4(SGtkXDrawingView *widg, uint32_t transparent, + uint8_t cfg, int zoom, int X, int Y, int DrawT, int MaskT) +{ + uint32_t *scanptr; + uint8_t *ColorMap; + int x, y, xp, yp, xP, subtile2; + uint8_t sdata, smask; + + // Pre calculate + ColorMap = (uint8_t *)PRCColorMap + MinxPRC.PRCSprBase + (DrawT << 3) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Draw sprite + for (y=0; y<8*zoom; y++) { + yp = y / zoom; + if (((Y+y) < 0) || ((Y+y) >= widg->height)) break; + scanptr = &widg->imgptr[(Y+y) * widg->pitch]; + for (x=0; x<8*zoom; x++) { + xp = x / zoom; + if (((X+x) < 0) || ((X+x) >= widg->width)) break; + subtile2 = (yp & 4) + ((xp & 4) >> 1); + + xP = (cfg & 0x01) ? (7 - xp) : xp; + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + if (cfg & 0x02) smask = PRCInvertBit[smask]; + smask = smask & (1 << (yp & 7)); + + // Write result + if (!smask) { + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + if (cfg & 0x02) sdata = PRCInvertBit[sdata]; + if (cfg & 0x04) sdata = ~sdata; + sdata = sdata & (1 << (yp & 7)); + sdata = sdata ? ColorMap[subtile2+1] : ColorMap[subtile2]; + + scanptr[X+x] = PokeMini_ColorPalBGR32[sdata]; + } else { + scanptr[X+x] = transparent; + } + } + } +} + +static void PRCSprView_DrawSpriteMono(SGtkXDrawingView *widg, uint32_t transparent, uint8_t cfg, int zoom, int X, int Y, int Tile) +{ + uint32_t *scanptr; + int x, y, z = 8 * zoom; + Tile <<= 3; + + // Draw 16x16 sprite + PRCSprView_DrawSprite8x8_Mono(widg, transparent, cfg, zoom, X + (cfg & 1 ? z : 0), Y + (cfg & 2 ? z : 0), Tile+2, Tile); + PRCSprView_DrawSprite8x8_Mono(widg, transparent, cfg, zoom, X + (cfg & 1 ? z : 0), Y + (cfg & 2 ? 0 : z), Tile+3, Tile+1); + PRCSprView_DrawSprite8x8_Mono(widg, transparent, cfg, zoom, X + (cfg & 1 ? 0 : z), Y + (cfg & 2 ? z : 0), Tile+6, Tile+4); + PRCSprView_DrawSprite8x8_Mono(widg, transparent, cfg, zoom, X + (cfg & 1 ? 0 : z), Y + (cfg & 2 ? 0 : z), Tile+7, Tile+5); + + // Mask if disabled + if (!(cfg & 8)) { + z <<= 1; + for (y=Y; y= widg->height)) break; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=X; x= widg->width)) break; + if ((x ^ y) & 1) scanptr[x] = 0x808080; + } + } + } +} + +static void PRCSprView_DrawSpriteColor8x8(SGtkXDrawingView *widg, uint32_t transparent, uint8_t cfg, int zoom, int X, int Y, int Tile) +{ + uint32_t *scanptr; + int x, y, z = 8 * zoom; + Tile <<= 3; + + // Draw 16x16 sprite + PRCSprView_DrawSprite8x8_Color8(widg, transparent, cfg, zoom, X + (cfg & 1 ? z : 0), Y + (cfg & 2 ? z : 0), Tile+2, Tile); + PRCSprView_DrawSprite8x8_Color8(widg, transparent, cfg, zoom, X + (cfg & 1 ? z : 0), Y + (cfg & 2 ? 0 : z), Tile+3, Tile+1); + PRCSprView_DrawSprite8x8_Color8(widg, transparent, cfg, zoom, X + (cfg & 1 ? 0 : z), Y + (cfg & 2 ? z : 0), Tile+6, Tile+4); + PRCSprView_DrawSprite8x8_Color8(widg, transparent, cfg, zoom, X + (cfg & 1 ? 0 : z), Y + (cfg & 2 ? 0 : z), Tile+7, Tile+5); + + // Mask if disabled + if (!(cfg & 8)) { + z <<= 1; + for (y=Y; y= widg->height)) break; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=X; x= widg->width)) break; + if ((x ^ y) & 1) scanptr[x] = 0x808080; + } + } + } +} + +static void PRCSprView_DrawSpriteColor4x4(SGtkXDrawingView *widg, uint32_t transparent, uint8_t cfg, int zoom, int X, int Y, int Tile) +{ + uint32_t *scanptr; + int x, y, z = 8 * zoom; + Tile <<= 3; + + // Draw 16x16 sprite + PRCSprView_DrawSprite8x8_Color4(widg, transparent, cfg, zoom, X + (cfg & 1 ? z : 0), Y + (cfg & 2 ? z : 0), Tile+2, Tile); + PRCSprView_DrawSprite8x8_Color4(widg, transparent, cfg, zoom, X + (cfg & 1 ? z : 0), Y + (cfg & 2 ? 0 : z), Tile+3, Tile+1); + PRCSprView_DrawSprite8x8_Color4(widg, transparent, cfg, zoom, X + (cfg & 1 ? 0 : z), Y + (cfg & 2 ? z : 0), Tile+6, Tile+4); + PRCSprView_DrawSprite8x8_Color4(widg, transparent, cfg, zoom, X + (cfg & 1 ? 0 : z), Y + (cfg & 2 ? 0 : z), Tile+7, Tile+5); + + // Mask if disabled + if (!(cfg & 8)) { + z <<= 1; + for (y=Y; y= widg->height)) break; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=X; x= widg->width)) break; + if ((x ^ y) & 1) scanptr[x] = 0x808080; + } + } + } +} + +// ------- +// Viewers +// ------- + +static int PRCSprView_imgresize(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t *scanimg; + int x, y; + + for (y=0; yimgptr[y * pitch]; + for (x=0; x> 1) - (sprsize >> 1); + spry = y * h + 20; + ify = spry + sprsize + 8; + dsprx = MinxPRC_OnRead(0, 0x1300 + i*4) & 0x7F; + dspry = MinxPRC_OnRead(0, 0x1300 + i*4+1) & 0x7F; + dsprt = MinxPRC_OnRead(0, 0x1300 + i*4+2); + dsprc = MinxPRC_OnRead(0, 0x1300 + i*4+3); + visible = (dsprc & 8) && (dsprx > 0) && (dsprx < 112) && (dspry > 0) && (dspry < 80); + + // Draw stuffz + sgtkx_drawing_view_drawfrect(widg, x*w, y*h, w, h, color); + if (w >= 92) { + sgtkx_drawing_view_drawtext(widg, x*w+6, y*h+4, 0x4C3000, "Sprite \e340#%i", i); + } else { + sgtkx_drawing_view_drawtext(widg, x*w+6, y*h+4, 0x4C3000, "Spr. \e340#%i", i); + } + if (emumode != EMUMODE_RUNFULL) { + if (dclc_show_hspr || visible) { + if (PRCColorMap) { + if (PokeMini_ColorFormat == 1) { + // Color 4x4 Attributes + PRCSprView_DrawSpriteColor4x4(widg, dclc_trans_prcspr, dsprc, dclc_zoom_prcspr, sprx, spry, dsprt); + } else { + // Color 8x8 Attributes + PRCSprView_DrawSpriteColor8x8(widg, dclc_trans_prcspr, dsprc, dclc_zoom_prcspr, sprx, spry, dsprt); + } + } else { + // Mono + PRCSprView_DrawSpriteMono(widg, dclc_trans_prcspr, dsprc, dclc_zoom_prcspr, sprx, spry, dsprt); + } + // Sprite frame + if (visible) { + sgtkx_drawing_view_drawsrect(widg, sprx-1, spry-1, sprsize+2, sprsize+2, 0xFF0000); + sgtkx_drawing_view_drawsrect(widg, sprx-2, spry-2, sprsize+4, sprsize+4, 0xFFFF00); + sgtkx_drawing_view_drawsrect(widg, sprx-3, spry-3, sprsize+6, sprsize+6, 0xFF8080); + } else { + sgtkx_drawing_view_drawsrect(widg, sprx-1, spry-1, sprsize+2, sprsize+2, 0xA0A0A0); + sgtkx_drawing_view_drawsrect(widg, sprx-2, spry-2, sprsize+4, sprsize+4, 0xD0D0D0); + sgtkx_drawing_view_drawsrect(widg, sprx-3, spry-3, sprsize+6, sprsize+6, 0xB0B0B0); + } + } + if (!dclc_minimalist_sprview) { + // Sprite information + if (dclc_zoom_prcspr >= 2) { + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+ 0, 0x605020, "C.: $%02X,%i", dsprc, dsprc); + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+12, 0x605040, "ID: $%02X,%i", dsprt, dsprt); + if (dsprx < 16) sgtkx_drawing_view_drawtext(widg, x*w+6, ify+24, 0x605060, " X:-$%02X,-%i", 16 - dsprx, 16 - dsprx); + else sgtkx_drawing_view_drawtext(widg, x*w+6, ify+24, 0x605060, " X: $%02X,%i", dsprx - 16, dsprx - 16); + if (dspry < 16) sgtkx_drawing_view_drawtext(widg, x*w+6, ify+36, 0x605070, " Y:-$%02X,-%i", 16 - dspry, 16 - dspry); + else sgtkx_drawing_view_drawtext(widg, x*w+6, ify+36, 0x605070, " Y: $%02X,%i", dspry - 16, dspry - 16); + } else { + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+ 0, 0x605020, "C.: $%02X", dsprc); + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+12, 0x605040, "ID: $%02X", dsprt); + if (dsprx < 16) sgtkx_drawing_view_drawtext(widg, x*w+6, ify+24, 0x605060, " X:-$%02X", 16 - dsprx); + else sgtkx_drawing_view_drawtext(widg, x*w+6, ify+24, 0x605060, " X: $%02X", dsprx - 16); + if (dspry < 16) sgtkx_drawing_view_drawtext(widg, x*w+6, ify+36, 0x605070, " Y:-$%02X", 16 - dspry); + else sgtkx_drawing_view_drawtext(widg, x*w+6, ify+36, 0x605070, " Y: $%02X", dspry - 16); + } + // Sprite control + if (dclc_zoom_prcspr >= 4) { + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+48, 0x605080, "\e%sEnabled \e%sInvert", + dsprc & 8 ? "240" : "897", dsprc & 4 ? "240" : "897"); + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+60, 0x605090, "\e%sVFlip \e%sHFlip", + dsprc & 2 ? "240" : "897", dsprc & 1 ? "240" : "897"); + } else { + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+48, 0x605080, "\e%sEna. \e%sInv.", + dsprc & 8 ? "240" : "897", dsprc & 4 ? "240" : "897"); + sgtkx_drawing_view_drawtext(widg, x*w+6, ify+60, 0x605090, "\e%sVFlp \e%sHFlp", + dsprc & 2 ? "240" : "897", dsprc & 1 ? "240" : "897"); + } + } else { + if (i == SelectedSprite) { + sgtkx_drawing_view_drawsrect(widg, x*w, y*h, w, h, 0xFF0000); + sgtkx_drawing_view_drawsrect(widg, x*w+1, y*h+1, w-2, h-2, 0xFF8000); + } + } + } + } + } + + // Minimalist view + if (dclc_minimalist_sprview) { + i = SelectedSprite; + dsprx = MinxPRC_OnRead(0, 0x1300 + i*4) & 0x7F; + dspry = MinxPRC_OnRead(0, 0x1300 + i*4+1) & 0x7F; + dsprt = MinxPRC_OnRead(0, 0x1300 + i*4+2); + dsprc = MinxPRC_OnRead(0, 0x1300 + i*4+3); + sprintf(tmp, "Control: $%02X, %i - %s %s %s %s", dsprc, dsprc, + dsprc & 8 ? "(Enabled)" : "(Disabled)", + dsprc & 4 ? "(Inverted)" : "", + dsprc & 2 ? "(Hozizontal Flip)" : "", + dsprc & 1 ? "(Vertical Flip)" : "" + ); + gtk_label_set_text(SprLabels[0], tmp); + sprintf(tmp, "Tile ID: $%02X, %i", dsprt, dsprt); + gtk_label_set_text(SprLabels[1], tmp); + if (dsprx < 16) sprintf(tmp, "X Position: -$%02X, -%i", 16 - dsprx, 16 - dsprx); + else sprintf(tmp, "X Position: $%02X, %i", dsprx - 16, dsprx - 16); + gtk_label_set_text(SprLabels[2], tmp); + if (dspry < 16) sprintf(tmp, "Y Position: -$%02X, -%i", 16 - dspry, 16 - dspry); + else sprintf(tmp, "Y Position: $%02X, %i", dspry - 16, dspry - 16); + gtk_label_set_text(SprLabels[3], tmp); + } + + return 1; +} + +static int PRCSprView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int x, y, w, h, sprsize; + char tmp[64]; + + // Must be minimalist + if (!dclc_minimalist_sprview) return 0; + + // Calculate + sprsize = 16 * dclc_zoom_prcspr; + w = 32 + sprsize; + h = 28 + sprsize; + if (w < 72) w = 72; + x = widg->mousex / w; + y = widg->mousey / h; + if ((x < 0) || (x >= 6) || (y < 0) || (y >= 4)) return 0; + + // Set as selected + SelectedSprite = y * 6 + x; + sprintf(tmp, " Sprite #%i ", SelectedSprite); + gtk_frame_set_label(MFrame, tmp); + return 1; +} + +// -------------- +// Menu callbacks +// -------------- + +static void PRCSprW_ShowHSpr(GtkWidget *widget, gpointer data) +{ + if (PRCSprWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show hidden sprites"); + dclc_show_hspr = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCSprWindow_Refresh(1); +} + +static void PRCSprW_Minimalist(GtkWidget *widget, gpointer data) +{ + if (PRCSprWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Minimalist view"); + dclc_minimalist_sprview = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (dclc_minimalist_sprview) { + gtk_widget_show(GTK_WIDGET(MFrame)); + } else { + gtk_widget_hide(GTK_WIDGET(MFrame)); + } + FullRedraw = 1; + PRCSprWindow_Refresh(1); +} + +static void PRCSprW_Zoom(GtkWidget *widget, gpointer data) +{ + if (PRCSprWindow_InConfigs) return; + dclc_zoom_prcspr = (int)data; + FullRedraw = 1; + PRCSprWindow_Refresh(1); +} + +static void PRCSprW_Transparency(GtkWidget *widget, gpointer data) +{ + int number, index = (int)data; + static int lasttransindex = -2; + + if (lasttransindex == index) return; + lasttransindex = index; + if (PRCSprWindow_InConfigs) return; + + if (index >= 0) { + dclc_trans_prcspr = TransparencyColor[index]; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCSprWindow, "Custom tranparent color", "Transparency value:", &number, dclc_trans_prcspr, 6, 1, 0x000000, 0xFFFFFF)) { + dclc_trans_prcspr = number & 0xFFFFFF; + } + set_emumode(EMUMODE_RESTORE, 1); + } + PRCSprWindow_Refresh(1); +} + +static void PRCSprW_RefreshNow(GtkWidget *widget, gpointer data) +{ + FullRedraw = 1; + refresh_debug(1); +} + +static void PRCSprW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (PRCSprWindow_InConfigs) return; + + if (index >= 0) { + dclc_prcsprwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCSprWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_prcsprwin_refresh, 4, 0, 0, 1000)) { + dclc_prcsprwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint PRCSprWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(PRCSprWindow)); + return TRUE; +} + +static gboolean PRCSprWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) PRCSprWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry PRCSprWindow_MenuItems[] = { + { "/_View", NULL, NULL, 0, "" }, + { "/View/Show hidden sprites", NULL, PRCSprW_ShowHSpr, 0, "" }, + { "/View/Minimalist view", NULL, PRCSprW_Minimalist, 0, "" }, + { "/View/Zoom", NULL, NULL, 0, "" }, + { "/View/Zoom/100%", NULL, PRCSprW_Zoom, 1, "" }, + { "/View/Zoom/200%", NULL, PRCSprW_Zoom, 2, "/View/Zoom/100%" }, + { "/View/Zoom/300%", NULL, PRCSprW_Zoom, 3, "/View/Zoom/100%" }, + { "/View/Zoom/400%", NULL, PRCSprW_Zoom, 4, "/View/Zoom/100%" }, + { "/View/Zoom/500%", NULL, PRCSprW_Zoom, 5, "/View/Zoom/100%" }, + { "/View/Zoom/600%", NULL, PRCSprW_Zoom, 6, "/View/Zoom/100%" }, + { "/View/Zoom/700%", NULL, PRCSprW_Zoom, 7, "/View/Zoom/100%" }, + { "/View/Zoom/800%", NULL, PRCSprW_Zoom, 8, "/View/Zoom/100%" }, + { "/View/Transparency", NULL, NULL, 0, "" }, + { "/View/Transparency/Pink", NULL, PRCSprW_Transparency, 0, "" }, + { "/View/Transparency/Red", NULL, PRCSprW_Transparency, 1, "/View/Transparency/Pink" }, + { "/View/Transparency/Green", NULL, PRCSprW_Transparency, 2, "/View/Transparency/Pink" }, + { "/View/Transparency/Blue", NULL, PRCSprW_Transparency, 3, "/View/Transparency/Pink" }, + { "/View/Transparency/Yellow", NULL, PRCSprW_Transparency, 4, "/View/Transparency/Pink" }, + { "/View/Transparency/Orange", NULL, PRCSprW_Transparency, 5, "/View/Transparency/Pink" }, + { "/View/Transparency/Purple", NULL, PRCSprW_Transparency, 6, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Red", NULL, PRCSprW_Transparency, 7, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Green", NULL, PRCSprW_Transparency, 8, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Blue", NULL, PRCSprW_Transparency, 9, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Yellow", NULL, PRCSprW_Transparency, 10, "/View/Transparency/Pink" }, + { "/View/Transparency/Cyan", NULL, PRCSprW_Transparency, 11, "/View/Transparency/Pink" }, + { "/View/Transparency/Black", NULL, PRCSprW_Transparency, 12, "/View/Transparency/Pink" }, + { "/View/Transparency/Grey", NULL, PRCSprW_Transparency, 13, "/View/Transparency/Pink" }, + { "/View/Transparency/Silver", NULL, PRCSprW_Transparency, 14, "/View/Transparency/Pink" }, + { "/View/Transparency/White", NULL, PRCSprW_Transparency, 15, "/View/Transparency/Pink" }, + { "/View/Transparency/Custom", NULL, PRCSprW_Transparency, -1, "/View/Transparency/Pink" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, PRCSprW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, PRCSprW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, PRCSprW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, PRCSprW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, PRCSprW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, PRCSprW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, PRCSprW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, PRCSprW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, PRCSprW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, PRCSprW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, PRCSprW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint PRCSprWindow_MenuItemsNum = sizeof(PRCSprWindow_MenuItems) / sizeof(*PRCSprWindow_MenuItems); + +// ------------------ +// PRC Sprites Window +// ------------------ + +int PRCSprWindow_Create(void) +{ + int i; + + // Window + PRCSprWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(PRCSprWindow), "PRC Sprites View"); + gtk_widget_set_size_request(GTK_WIDGET(PRCSprWindow), 200, 100); + gtk_window_set_default_size(PRCSprWindow, 420, 200); + g_signal_connect(PRCSprWindow, "delete_event", G_CALLBACK(PRCSprWindow_delete_event), NULL); + g_signal_connect(PRCSprWindow, "window-state-event", G_CALLBACK(PRCSprWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(PRCSprWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, PRCSprWindow_MenuItemsNum, PRCSprWindow_MenuItems, NULL); + gtk_window_add_accel_group(PRCSprWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // PRC Map View + PRCSprView.on_imgresize = SGtkXDVCB(PRCSprView_imgresize); + PRCSprView.on_exposure = SGtkXDVCB(PRCSprView_exposure); + PRCSprView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + PRCSprView.on_buttonpress = SGtkXDVCB(PRCSprView_buttonpress); + sgtkx_drawing_view_new(&PRCSprView, 0); + gtk_widget_set_size_request(GTK_WIDGET(PRCSprView.box), 64, 64); + gtk_box_pack_start(VBox1, GTK_WIDGET(PRCSprView.box), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(PRCSprView.box)); + + // Minimalist view + MFrame = GTK_FRAME(gtk_frame_new(" Sprite #0 ")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MFrame), FALSE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(MFrame)); + MBox = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(MFrame), GTK_WIDGET(MBox)); + gtk_widget_show(GTK_WIDGET(MBox)); + for (i=0; i<4; i++) { + SprLabels[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(SprLabels[i]), 0.0, 0.5); + gtk_label_set_justify(SprLabels[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(MBox, GTK_WIDGET(SprLabels[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(SprLabels[i])); + } + + return 1; +} + +void PRCSprWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(PRCSprWindow))) { + gtk_widget_show(GTK_WIDGET(PRCSprWindow)); + gtk_window_deiconify(PRCSprWindow); + gtk_window_get_position(PRCSprWindow, &x, &y); + gtk_window_get_size(PRCSprWindow, &width, &height); + dclc_prcsprwin_winx = x; + dclc_prcsprwin_winy = y; + dclc_prcsprwin_winw = width; + dclc_prcsprwin_winh = height; + } +} + +void PRCSprWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(PRCSprWindow)); + if ((dclc_prcsprwin_winx > -15) && (dclc_prcsprwin_winy > -16)) { + gtk_window_move(PRCSprWindow, dclc_prcsprwin_winx, dclc_prcsprwin_winy); + } + if ((dclc_prcsprwin_winw > 0) && (dclc_prcsprwin_winh > 0)) { + gtk_window_resize(PRCSprWindow, dclc_prcsprwin_winw, dclc_prcsprwin_winh); + } + gtk_widget_show(GTK_WIDGET(PRCSprWindow)); + gtk_window_present(PRCSprWindow); +} + +void PRCSprWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + int i; + + PRCSprWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Show hidden sprites"); + if (dclc_show_hspr) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Minimalist view"); + if (dclc_minimalist_sprview) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/100%"); + if (dclc_zoom_prcspr == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/200%"); + if (dclc_zoom_prcspr == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/300%"); + if (dclc_zoom_prcspr == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/400%"); + if (dclc_zoom_prcspr == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/500%"); + if (dclc_zoom_prcspr == 5) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/600%"); + if (dclc_zoom_prcspr == 6) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/700%"); + if (dclc_zoom_prcspr == 7) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/800%"); + if (dclc_zoom_prcspr == 8) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Transparency/Custom"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + for (i=0; i<16; i++) { + widg = gtk_item_factory_get_item(ItemFactory, TransparencyColorMenu[i]); + if (dclc_trans_prcspr == TransparencyColor[i]) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + } + + if (dclc_minimalist_sprview) { + gtk_widget_show(GTK_WIDGET(MFrame)); + } else { + gtk_widget_hide(GTK_WIDGET(MFrame)); + } + + switch (dclc_prcsprwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + PRCSprWindow_InConfigs = 0; +} + +void PRCSprWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(PRCSprView.box)); + if (dclc_minimalist_sprview) { + gtk_widget_show(GTK_WIDGET(MFrame)); + } + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(PRCSprView.box)); + gtk_widget_hide(GTK_WIDGET(MFrame)); + } +} + +void PRCSprWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_prcsprwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(PRCSprWindow)) || PRCSprWindow_minimized) return; + } + sgtkx_drawing_view_refresh(&PRCSprView); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCSprWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCSprWindow.h new file mode 100644 index 0000000000..4015537401 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCSprWindow.h @@ -0,0 +1,34 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PRCSPRWINDOW_H +#define PRCSPRWINDOW_H + +#include +#include + +// This window management +int PRCSprWindow_Create(void); +void PRCSprWindow_Destroy(void); +void PRCSprWindow_Activate(void); +void PRCSprWindow_UpdateConfigs(void); +void PRCSprWindow_ROMResized(void); +void PRCSprWindow_Sensitive(int enabled); +void PRCSprWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCTilesWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCTilesWindow.c new file mode 100644 index 0000000000..46358883c0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCTilesWindow.c @@ -0,0 +1,842 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "PRCTilesWindow.h" +#include "PokeMini_ColorPal.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int PRCTilesWindow_InConfigs = 0; + +GtkWindow *PRCTilesWindow; +static int PRCTilesWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkLabel *LabelInfo; +static SGtkXDrawingView PRCTilesView; + +// Locals +static int Follow = 0; +static int SpriteMode = 0; +static int ShowGrid = 1; +static int Negative = 0; + +// Transparency +static const char *TransparencyColorMenu[16] = { + "/View/Transparency/Pink", + "/View/Transparency/Red", + "/View/Transparency/Green", + "/View/Transparency/Blue", + "/View/Transparency/Yellow", + "/View/Transparency/Orange", + "/View/Transparency/Purple", + "/View/Transparency/Bright Red", + "/View/Transparency/Bright Green", + "/View/Transparency/Bright Blue", + "/View/Transparency/Bright Yellow", + "/View/Transparency/Cyan", + "/View/Transparency/Black", + "/View/Transparency/Grey", + "/View/Transparency/Silver", + "/View/Transparency/White" +}; +static const uint32_t TransparencyColor[16] = { + 0xFF00FF, // Pink + 0xC00000, // Red + 0x00C000, // Green + 0x0000C0, // Blue + 0xC0C000, // Yellow + 0xFF8000, // Orange + 0x800080, // Purple + 0xFF0000, // Bright Red + 0x00FF00, // Bright Green + 0x0000FF, // Bright Blue + 0xFFFF00, // Bright Yellow + 0x00FFFF, // Cyan + 0x000000, // Black + 0x808080, // Grey + 0xC0C0C0, // Silver + 0xFFFFFF // White +}; + +static void PRCTilesRender_decodespriteidx(int spriteidx, int x, int y, int *dataidx, int *maskidx) +{ + switch ((y & 8) + ((x & 8) >> 1)) { + case 0: // Top-Left + if (dataidx) *dataidx = (spriteidx << 3) + 2; + if (maskidx) *maskidx = (spriteidx << 3) + 0; + break; + case 4: // Top-Right + if (dataidx) *dataidx = (spriteidx << 3) + 6; + if (maskidx) *maskidx = (spriteidx << 3) + 4; + break; + case 8: // Bottom-Left + if (dataidx) *dataidx = (spriteidx << 3) + 3; + if (maskidx) *maskidx = (spriteidx << 3) + 1; + break; + case 12: // Bottom-Right + if (dataidx) *dataidx = (spriteidx << 3) + 7; + if (maskidx) *maskidx = (spriteidx << 3) + 5; + break; + } +} + +// PRC Tiles render (Mono) +static void PRCTilesRenderMono(SGtkXDrawingView *widg, + int spritemode, int zoom, uint32_t offset, + int negative, uint32_t transparency) +{ + uint32_t *scanptr; + int x, y; + int xp, yp, pitchp; + int tileidx, tileidxD = 0, tileidxM = 0, tiledataaddr, tilemaskaddr; + + uint8_t ddata = 0, mdata = 0; + + if (spritemode) { + // Draw sprites + offset = offset & ~7; + pitchp = widg->pitch / zoom; + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + + // Calculate + tileidx = (yp >> 4) * (pitchp >> 4) + (xp >> 4); + PRCTilesRender_decodespriteidx(tileidx, xp, yp, &tileidxD, &tileidxM); + tiledataaddr = ((offset << 3) + (tileidxD << 3)); + tilemaskaddr = ((offset << 3) + (tileidxM << 3)); + + // Draw sprite + if (tiledataaddr < PM_ROM_Size) { + // Decode and draw sprite + mdata = MinxPRC_OnRead(0, tilemaskaddr + (xp & 7)) & (1 << (yp & 7)); + if (!mdata) { + ddata = MinxPRC_OnRead(0, tiledataaddr + (xp & 7)) & (1 << (yp & 7)); + if (negative) ddata = !ddata; + scanptr[x] = ddata ? 0x000000 : 0xFFFFFF; + } else { + scanptr[x] = transparency; + } + } else { + // Outside ROM range + scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + } + } + } else { + // Draw tiles + pitchp = widg->pitch / zoom; + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + + // Calculate + tileidx = (yp >> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = ((offset << 3) + (tileidx << 3)); + + // Draw tile + if (tiledataaddr < PM_ROM_Size) { + // Decode and draw tile + ddata = MinxPRC_OnRead(0, tiledataaddr + (xp & 7)) & (1 << (yp & 7)); + if (negative) ddata = !ddata; + scanptr[x] = ddata ? 0x000000 : 0xFFFFFF; + } else { + // Outside ROM range + scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + } + } + } +} + +// PRC Tiles render (Color 8x8) +static void PRCTilesRenderColor8x8(SGtkXDrawingView *widg, + int spritemode, int zoom, uint32_t offset, + int negative, uint32_t transparency) +{ + uint32_t *scanptr, mapoff; + int x, y; + int xp, yp, pitchp; + int tileidx, tileidxD = 0, tileidxM = 0, tiledataaddr, tilemaskaddr; + + negative = negative ? 1 : 0; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + uint8_t ddata = 0, mdata = 0, odata; + + if (spritemode) { + // Draw sprites + offset = offset & ~7; + pitchp = widg->pitch / zoom; + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + + // Calculate + tileidx = (yp >> 4) * (pitchp >> 4) + (xp >> 4); + PRCTilesRender_decodespriteidx(tileidx, xp, yp, &tileidxD, &tileidxM); + tiledataaddr = ((offset << 3) + (tileidxD << 3)); + tilemaskaddr = ((offset << 3) + (tileidxM << 3)); + mapoff = (offset << 1) + (tileidxD << 1); + + // Draw sprite + if (tiledataaddr < PM_ROM_Size) { + // Get map offset + ColorMap = (uint8_t *)PRCColorMap + mapoff - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw sprite + mdata = MinxPRC_OnRead(0, tilemaskaddr + (xp & 7)) & (1 << (yp & 7)); + if (!mdata) { + ddata = MinxPRC_OnRead(0, tiledataaddr + (xp & 7)) & (1 << (yp & 7)); + odata = ddata ? ColorMap[1 ^ negative] : ColorMap[0 ^ negative]; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + scanptr[x] = transparency; + } + } else { + // Outside ROM range + scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + } + } + } else { + // Draw tiles + pitchp = widg->pitch / zoom; + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + + // Calculate + tileidx = (yp >> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = ((offset << 3) + (tileidx << 3)); + mapoff = (offset << 1) + (tileidx << 1); + + // Draw tile + if (tiledataaddr < PM_ROM_Size) { + // Get map offset + ColorMap = (uint8_t *)PRCColorMap + mapoff - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw tile + ddata = MinxPRC_OnRead(0, tiledataaddr + (xp & 7)) & (1 << (yp & 7)); + odata = ddata ? ColorMap[1 ^ negative] : ColorMap[0 ^ negative]; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + // Outside ROM range + scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + } + } + } +} + +// PRC Tiles render (Color 4x4) +static void PRCTilesRenderColor4x4(SGtkXDrawingView *widg, + int spritemode, int zoom, uint32_t offset, + int negative, uint32_t transparency) +{ + uint32_t *scanptr, mapoff; + int x, y; + int xp, yp, pitchp, subtile2; + int tileidx, tileidxD = 0, tileidxM = 0, tiledataaddr, tilemaskaddr; + + negative = negative ? 1 : 0; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + uint8_t ddata = 0, mdata = 0, odata; + + if (spritemode) { + // Draw sprites + offset = offset & ~7; + pitchp = widg->pitch / zoom; + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + + // Calculate + tileidx = (yp >> 4) * (pitchp >> 4) + (xp >> 4); + PRCTilesRender_decodespriteidx(tileidx, xp, yp, &tileidxD, &tileidxM); + tiledataaddr = (offset << 3) + (tileidxD << 3); + tilemaskaddr = (offset << 3) + (tileidxM << 3); + mapoff = (offset << 3) + (tileidxD << 3); + subtile2 = (yp & 4) + ((xp & 4) >> 1); + + // Draw sprite + if (tiledataaddr < PM_ROM_Size) { + // Get map offset + ColorMap = (uint8_t *)PRCColorMap + mapoff - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw sprite + mdata = MinxPRC_OnRead(0, tilemaskaddr + (xp & 7)) & (1 << (yp & 7)); + if (!mdata) { + ddata = MinxPRC_OnRead(0, tiledataaddr + (xp & 7)) & (1 << (yp & 7)); + odata = ddata ? ColorMap[(subtile2 + 1) ^ negative] : ColorMap[subtile2 ^ negative]; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + scanptr[x] = transparency; + } + } else { + // Outside ROM range + scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + } + } + } else { + // Draw tiles + pitchp = widg->pitch / zoom; + for (y=0; yheight; y++) { + yp = y / zoom; + scanptr = &widg->imgptr[y * widg->pitch]; + for (x=0; xwidth; x++) { + xp = x / zoom; + + // Calculate + tileidx = (yp >> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = (offset << 3) + (tileidx << 3); + mapoff = (offset << 3) + (tileidx << 3); + subtile2 = (yp & 4) + ((xp & 4) >> 1); + + // Draw tile + if (tiledataaddr < PM_ROM_Size) { + // Get map offset + ColorMap = (uint8_t *)PRCColorMap + mapoff - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw tile + ddata = MinxPRC_OnRead(0, tiledataaddr + (xp & 7)) & (1 << (yp & 7)); + odata = ddata ? ColorMap[(subtile2 + 1) ^ negative] : ColorMap[subtile2 ^ negative]; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + // Outside ROM range + scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + } + } + } +} + +static void PRCTilesDrawGrid(SGtkXDrawingView *widg, int zoom) +{ + int x, y; + + if (SpriteMode) { + for (x=0; xwidth; x+=(zoom*16)) { + sgtkx_drawing_view_drawvline(widg, x, 0, widg->height, 0xC0C0C0); + sgtkx_drawing_view_drawvline(widg, x+1, 0, widg->height, 0x404040); + } + for (y=0; yheight; y+=(zoom*16)) { + sgtkx_drawing_view_drawhline(widg, y, 0, widg->width, 0xC0C0C0); + sgtkx_drawing_view_drawhline(widg, y+1, 0, widg->width, 0x404040); + } + } else { + for (x=0; xwidth; x+=(zoom*8)) { + sgtkx_drawing_view_drawvline(widg, x, 0, widg->height, 0xC0C0C0); + sgtkx_drawing_view_drawvline(widg, x+1, 0, widg->height, 0x404040); + } + for (y=0; yheight; y+=(zoom*8)) { + sgtkx_drawing_view_drawhline(widg, y, 0, widg->width, 0xC0C0C0); + sgtkx_drawing_view_drawhline(widg, y+1, 0, widg->width, 0x404040); + } + } +} + +// ------- +// Viewers +// ------- + +static int PRCTilesView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + if (PRCColorMap) { + if (PokeMini_ColorFormat == 1) { + // Color 4x4 Attributes + PRCTilesRenderColor4x4(widg, SpriteMode, dclc_zoom_prctiles, widg->sboffset, Negative, dclc_trans_prctiles); + } else { + // Color 8x8 Attributes + PRCTilesRenderColor8x8(widg, SpriteMode, dclc_zoom_prctiles, widg->sboffset, Negative, dclc_trans_prctiles); + } + + } else { + // Mono + PRCTilesRenderMono(widg, SpriteMode, dclc_zoom_prctiles, widg->sboffset, Negative, dclc_trans_prctiles); + } + if (ShowGrid) PRCTilesDrawGrid(widg, dclc_zoom_prctiles); + if (emumode == EMUMODE_RUNFULL) AnyView_DrawDisableMask(widg); + + return 1; +} + +static int PRCTilesView_motion(SGtkXDrawingView *widg, int x, int y, int _c) +{ + char txt[PMTMPV]; + int tileaddr, tilenum, tzoom, tx, ty, tp; + + if (SpriteMode) { + tzoom = 16 * dclc_zoom_prctiles; + tx = x / tzoom; + ty = y / tzoom; + tp = widg->pitch / tzoom; + tilenum = ty * tp + tx + widg->sboffset; + tileaddr = tilenum * 64; + } else { + tzoom = 8 * dclc_zoom_prctiles; + tx = x / tzoom; + ty = y / tzoom; + tp = widg->pitch / tzoom; + tilenum = ty * tp + tx + widg->sboffset; + tileaddr = tilenum * 8; + } + + sprintf(txt, "%s Tile=($%04X, %i) -:- Addr=($%06X, %i)", SpriteMode ? "Sprite" : "BG", tilenum, tilenum, tileaddr, tileaddr); + gtk_label_set_text(LabelInfo, txt); + + return 0; +} + +// -------------- +// Menu callbacks +// -------------- + +static void PRCTilesW_SpriteMode(GtkWidget *widget, gpointer data) +{ + if (PRCTilesWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Sprite Mode"); + SpriteMode = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (SpriteMode) { + sgtkx_drawing_view_sbpage(&PRCTilesView, 8, 128); + } else { + sgtkx_drawing_view_sbpage(&PRCTilesView, 1, 16); + } + PRCTilesWindow_Refresh(1); +} + +static void PRCTilesW_ShowGrid(GtkWidget *widget, gpointer data) +{ + if (PRCTilesWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Grid"); + ShowGrid = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCTilesWindow_Refresh(1); +} + +static void PRCTilesW_Negative(GtkWidget *widget, gpointer data) +{ + if (PRCTilesWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Negative"); + Negative = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + PRCTilesWindow_Refresh(1); +} + +static void PRCTilesW_Zoom(GtkWidget *widget, gpointer data) +{ + if (PRCTilesWindow_InConfigs) return; + dclc_zoom_prctiles = (int)data; + PRCTilesWindow_Refresh(1); +} + +static void PRCTilesW_Transparency(GtkWidget *widget, gpointer data) +{ + int number, index = (int)data; + static int lasttransindex = -2; + + if (lasttransindex == index) return; + lasttransindex = index; + if (PRCTilesWindow_InConfigs) return; + + if (index >= 0) { + dclc_trans_prctiles = TransparencyColor[index]; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCTilesWindow, "Custom tranparent color", "Transparency value:", &number, dclc_trans_prctiles, 6, 1, 0x000000, 0xFFFFFF)) { + dclc_trans_prctiles = number & 0xFFFFFF; + } + set_emumode(EMUMODE_RESTORE, 1); + } + PRCTilesWindow_Refresh(1); +} + +static void PRCTilesW_Goto_Address(GtkWidget *widget, gpointer data) +{ + int val = PRCTilesView.sboffset * 8; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCTilesWindow, "Go to address", "Set address to top of view:", &val, val, 6, 1, 0, PM_ROM_Size-1)) { + sgtkx_drawing_view_sbvalue(&PRCTilesView, val/8); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void PRCTilesW_Goto_Tile(GtkWidget *widget, gpointer data) +{ + int val = PRCTilesView.sboffset; + + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCTilesWindow, "Go to tile", "Set tile to top of view:", &val, val, 6, 1, 0, PM_ROM_Size-1)) { + sgtkx_drawing_view_sbvalue(&PRCTilesView, val); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void PRCTilesW_Goto_FrameTB(GtkWidget *widget, gpointer data) +{ + sgtkx_drawing_view_sbvalue(&PRCTilesView, 0x1000 / 8); +} + +static void PRCTilesW_Goto_MapTB(GtkWidget *widget, gpointer data) +{ + sgtkx_drawing_view_sbvalue(&PRCTilesView, MinxPRC.PRCBGBase / 8); +} + +static void PRCTilesW_Goto_SpriteTB(GtkWidget *widget, gpointer data) +{ + sgtkx_drawing_view_sbvalue(&PRCTilesView, MinxPRC.PRCSprBase / 8); +} + +static void PRCTilesW_Follow(GtkWidget *widget, gpointer data) +{ + Follow = (int)data; + PRCTilesWindow_Refresh(1); +} + +static void PRCTilesW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void PRCTilesW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefreshindex = -2; + + if (lastrefreshindex == index) return; + lastrefreshindex = index; + if (PRCTilesWindow_InConfigs) return; + + if (index >= 0) { + dclc_prctileswin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(PRCTilesWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_prctileswin_refresh, 4, 0, 0, 1000)) { + dclc_prctileswin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint PRCTilesWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(PRCTilesWindow)); + return TRUE; +} + +static gboolean PRCTilesWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) PRCTilesWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry PRCTilesWindow_MenuItems[] = { + { "/_View", NULL, NULL, 0, "" }, + { "/View/Sprite Mode", NULL, PRCTilesW_SpriteMode, 0, "" }, + { "/View/Show Grid", NULL, PRCTilesW_ShowGrid, 0, "" }, + { "/View/Show Negative", NULL, PRCTilesW_Negative, 0, "" }, + { "/View/Zoom", NULL, NULL, 0, "" }, + { "/View/Zoom/100%", NULL, PRCTilesW_Zoom, 1, "" }, + { "/View/Zoom/200%", NULL, PRCTilesW_Zoom, 2, "/View/Zoom/100%" }, + { "/View/Zoom/300%", NULL, PRCTilesW_Zoom, 3, "/View/Zoom/100%" }, + { "/View/Zoom/400%", NULL, PRCTilesW_Zoom, 4, "/View/Zoom/100%" }, + { "/View/Zoom/500%", NULL, PRCTilesW_Zoom, 5, "/View/Zoom/100%" }, + { "/View/Zoom/600%", NULL, PRCTilesW_Zoom, 6, "/View/Zoom/100%" }, + { "/View/Zoom/700%", NULL, PRCTilesW_Zoom, 7, "/View/Zoom/100%" }, + { "/View/Zoom/800%", NULL, PRCTilesW_Zoom, 8, "/View/Zoom/100%" }, + { "/View/Transparency", NULL, NULL, 0, "" }, + { "/View/Transparency/Pink", NULL, PRCTilesW_Transparency, 0, "" }, + { "/View/Transparency/Red", NULL, PRCTilesW_Transparency, 1, "/View/Transparency/Pink" }, + { "/View/Transparency/Green", NULL, PRCTilesW_Transparency, 2, "/View/Transparency/Pink" }, + { "/View/Transparency/Blue", NULL, PRCTilesW_Transparency, 3, "/View/Transparency/Pink" }, + { "/View/Transparency/Yellow", NULL, PRCTilesW_Transparency, 4, "/View/Transparency/Pink" }, + { "/View/Transparency/Orange", NULL, PRCTilesW_Transparency, 5, "/View/Transparency/Pink" }, + { "/View/Transparency/Purple", NULL, PRCTilesW_Transparency, 6, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Red", NULL, PRCTilesW_Transparency, 7, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Green", NULL, PRCTilesW_Transparency, 8, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Blue", NULL, PRCTilesW_Transparency, 9, "/View/Transparency/Pink" }, + { "/View/Transparency/Bright Yellow", NULL, PRCTilesW_Transparency, 10, "/View/Transparency/Pink" }, + { "/View/Transparency/Cyan", NULL, PRCTilesW_Transparency, 11, "/View/Transparency/Pink" }, + { "/View/Transparency/Black", NULL, PRCTilesW_Transparency, 12, "/View/Transparency/Pink" }, + { "/View/Transparency/Grey", NULL, PRCTilesW_Transparency, 13, "/View/Transparency/Pink" }, + { "/View/Transparency/Silver", NULL, PRCTilesW_Transparency, 14, "/View/Transparency/Pink" }, + { "/View/Transparency/White", NULL, PRCTilesW_Transparency, 15, "/View/Transparency/Pink" }, + { "/View/Transparency/Custom", NULL, PRCTilesW_Transparency, -1, "/View/Transparency/Pink" }, + + { "/_Go to", NULL, NULL, 0, "" }, + { "/Go to/_Address...", "G", PRCTilesW_Goto_Address, 0, "" }, + { "/Go to/_Tile...", "T", PRCTilesW_Goto_Tile, 0, "" }, + { "/Go to/_Framebuffer Base", "F", PRCTilesW_Goto_FrameTB, 0, "" }, + { "/Go to/_Map Tile Base", "M", PRCTilesW_Goto_MapTB, 0, "" }, + { "/Go to/_Sprite Tile Base", "S", PRCTilesW_Goto_SpriteTB, 0, "" }, + + { "/_Follow", NULL, NULL, 0, "" }, + { "/Follow/Don't follow", NULL, PRCTilesW_Follow, 0, "" }, + { "/Follow/Follow Map Tile Base", NULL, PRCTilesW_Follow, 1, "/Follow/Don't follow" }, + { "/Follow/Follow Sprite Tile Base", NULL, PRCTilesW_Follow, 2, "/Follow/Don't follow" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, PRCTilesW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, PRCTilesW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, PRCTilesW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, PRCTilesW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, PRCTilesW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, PRCTilesW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, PRCTilesW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, PRCTilesW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, PRCTilesW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, PRCTilesW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, PRCTilesW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint PRCTilesWindow_MenuItemsNum = sizeof(PRCTilesWindow_MenuItems) / sizeof(*PRCTilesWindow_MenuItems); + +// ---------------- +// PRC Tiles Window +// ---------------- + +int PRCTilesWindow_Create(void) +{ + // Window + PRCTilesWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(PRCTilesWindow), "PRC Tiles View"); + gtk_widget_set_size_request(GTK_WIDGET(PRCTilesWindow), 200, 100); + gtk_window_set_default_size(PRCTilesWindow, 420, 200); + g_signal_connect(PRCTilesWindow, "delete_event", G_CALLBACK(PRCTilesWindow_delete_event), NULL); + g_signal_connect(PRCTilesWindow, "window-state-event", G_CALLBACK(PRCTilesWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(PRCTilesWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, PRCTilesWindow_MenuItemsNum, PRCTilesWindow_MenuItems, NULL); + gtk_window_add_accel_group(PRCTilesWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Info label + LabelInfo = GTK_LABEL(gtk_label_new("-:-")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelInfo), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(LabelInfo)); + + // PRC Tiles View + PRCTilesView.on_exposure = SGtkXDVCB(PRCTilesView_exposure); + PRCTilesView.on_scroll = SGtkXDVCB(AnyView_scroll); + PRCTilesView.on_resize = SGtkXDVCB(AnyView_resize); + PRCTilesView.on_motion = SGtkXDVCB(PRCTilesView_motion); + PRCTilesView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&PRCTilesView, 1); + sgtkx_drawing_view_sbminmax(&PRCTilesView, 0, 512); // $1000 to $1FFF + gtk_widget_set_size_request(GTK_WIDGET(PRCTilesView.box), 64, 64); + gtk_box_pack_start(VBox1, GTK_WIDGET(PRCTilesView.box), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(PRCTilesView.box)); + + return 1; +} + +void PRCTilesWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(PRCTilesWindow))) { + gtk_widget_show(GTK_WIDGET(PRCTilesWindow)); + gtk_window_deiconify(PRCTilesWindow); + gtk_window_get_position(PRCTilesWindow, &x, &y); + gtk_window_get_size(PRCTilesWindow, &width, &height); + dclc_prctileswin_winx = x; + dclc_prctileswin_winy = y; + dclc_prctileswin_winw = width; + dclc_prctileswin_winh = height; + } +} + +void PRCTilesWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(PRCTilesWindow)); + if ((dclc_prctileswin_winx > -15) && (dclc_prctileswin_winy > -16)) { + gtk_window_move(PRCTilesWindow, dclc_prctileswin_winx, dclc_prctileswin_winy); + } + if ((dclc_prctileswin_winw > 0) && (dclc_prctileswin_winh > 0)) { + gtk_window_resize(PRCTilesWindow, dclc_prctileswin_winw, dclc_prctileswin_winh); + } + gtk_widget_show(GTK_WIDGET(PRCTilesWindow)); + gtk_window_present(PRCTilesWindow); +} + +void PRCTilesWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + int i; + + PRCTilesWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/Follow/Don't follow"); + if (Follow == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Follow/Follow Map Tile Base"); + if (Follow == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/Follow/Follow Sprite Tile Base"); + if (Follow == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Sprite Mode"); + if (SpriteMode) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Grid"); + if (ShowGrid) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Negative"); + if (Negative) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/100%"); + if (dclc_zoom_prctiles == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/200%"); + if (dclc_zoom_prctiles == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/300%"); + if (dclc_zoom_prctiles == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/400%"); + if (dclc_zoom_prctiles == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/500%"); + if (dclc_zoom_prctiles == 5) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/600%"); + if (dclc_zoom_prctiles == 6) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/700%"); + if (dclc_zoom_prctiles == 7) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/800%"); + if (dclc_zoom_prctiles == 8) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Transparency/Custom"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + for (i=0; i<16; i++) { + widg = gtk_item_factory_get_item(ItemFactory, TransparencyColorMenu[i]); + if (dclc_trans_prctiles == TransparencyColor[i]) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + } + + if (SpriteMode) { + sgtkx_drawing_view_sbpage(&PRCTilesView, 8, 128); + } else { + sgtkx_drawing_view_sbpage(&PRCTilesView, 1, 16); + } + + switch (dclc_prctileswin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + PRCTilesWindow_InConfigs = 0; +} + +void PRCTilesWindow_ROMResized(void) +{ + sgtkx_drawing_view_sbminmax(&PRCTilesView, 0, (PM_ROM_Size/8)-1); + PRCTilesWindow_Refresh(1); +} + +void PRCTilesWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(PRCTilesView.box)); + gtk_widget_show(GTK_WIDGET(LabelInfo)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(PRCTilesView.box)); + gtk_widget_hide(GTK_WIDGET(LabelInfo)); + } +} + +void PRCTilesWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_prctileswin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(PRCTilesWindow)) || PRCTilesWindow_minimized) return; + } + if (emumode != EMUMODE_STOP) { + switch (Follow) { + case 1: sgtkx_drawing_view_sbvalue(&PRCTilesView, MinxPRC.PRCBGBase / 8); + break; + case 2: sgtkx_drawing_view_sbvalue(&PRCTilesView, MinxPRC.PRCSprBase / 8); + break; + } + } + sgtkx_drawing_view_refresh(&PRCTilesView); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCTilesWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCTilesWindow.h new file mode 100644 index 0000000000..36d2b97c9a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PRCTilesWindow.h @@ -0,0 +1,34 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PRCTILESWINDOW_H +#define PRCTILESWINDOW_H + +#include +#include + +// This window management +int PRCTilesWindow_Create(void); +void PRCTilesWindow_Destroy(void); +void PRCTilesWindow_Activate(void); +void PRCTilesWindow_UpdateConfigs(void); +void PRCTilesWindow_ROMResized(void); +void PRCTilesWindow_Sensitive(int enabled); +void PRCTilesWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PalEditWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PalEditWindow.c new file mode 100644 index 0000000000..62209b70c6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PalEditWindow.c @@ -0,0 +1,233 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" + +#include "PalEditWindow.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int PalEditWindow_InConfigs = 0; + +GtkWindow *PalEditWindow; +static GtkScrolledWindow *PalEditSW; +static GtkBox *VBox1; +static GtkTable *CTable; +static GtkLabel *ColorLabel[4]; +static GtkDrawingArea *ColorPrev[4]; +static GtkAdjustment *ColorComp_Adj[4][3]; +static GtkScale *ColorComp[4][3]; +static GtkButtonBox *HButtonBox; +static GtkButton *ButtonClose; + +// ----------------- +// Widgets callbacks +// ----------------- + +static gint PalEditWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(PalEditWindow)); + return TRUE; +} + +static gboolean ColorPrev_exposure(GtkWidget *widget, GdkEventExpose *event, gpointer data) +{ + int index = (int)data; + uint32_t color; + cairo_t *cr; + + // Initialize cairo + cr = gdk_cairo_create(widget->window); + gdk_cairo_rectangle(cr, &event->area); + cairo_clip(cr); + + // Get color + color = CommandLine.custompal[index]; + cairo_set_source_rgb(cr, GetValH24(color) / 255.0, GetValM24(color) / 255.0, GetValL24(color) / 255.0); + cairo_set_line_width(cr, 1); + + // Draw preview color + cairo_rectangle(cr, 0, 0, widget->allocation.width, widget->allocation.height); + cairo_fill(cr); + + // Draw border + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + cairo_rectangle(cr, 0, 0, widget->allocation.width, widget->allocation.height); + cairo_stroke(cr); + + // Destroy cairo + cairo_destroy (cr); + + return TRUE; +} + + +static void ColorComp_Adj_changed(GtkAdjustment *adj, gpointer data) +{ + int index = (int)data; + int r, g, b, ix, ic; + + if (PalEditWindow_InConfigs) return; + + ix = index >> 2; + ic = index & 3; + r = GetValH24(CommandLine.custompal[ix]); + g = GetValM24(CommandLine.custompal[ix]); + b = GetValL24(CommandLine.custompal[ix]); + if (ic == 0) r = (int)(adj->value); + if (ic == 1) g = (int)(adj->value); + if (ic == 2) b = (int)(adj->value); + CommandLine.custompal[ix] = RGB24(b, g, r); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + gtk_widget_queue_draw(GTK_WIDGET(ColorPrev[ix])); +} + +static gchar *ColorComp_formatvalue(GtkScale *scale, gdouble value, gpointer data) +{ + int index = (int)data; + switch (index) { + case 0: return g_strdup_printf("Red: %i", (int)value); + case 1: return g_strdup_printf("Green: %i", (int)value); + case 2: return g_strdup_printf("Blue: %i", (int)value); + case 4: return g_strdup_printf("Red: %i", (int)value); + case 5: return g_strdup_printf("Green: %i", (int)value); + case 6: return g_strdup_printf("Blue: %i", (int)value); + case 8: return g_strdup_printf("Red: %i", (int)value); + case 9: return g_strdup_printf("Green: %i", (int)value); + case 10: return g_strdup_printf("Blue: %i", (int)value); + case 12: return g_strdup_printf("Red: %i", (int)value); + case 13: return g_strdup_printf("Green: %i", (int)value); + case 14: return g_strdup_printf("Blue: %i", (int)value); + } + return NULL; +} + +static void PalEditWindow_ButtonClose_clicked(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(PalEditWindow)); +} + +// -------------- +// PalEdit Window +// -------------- + +static const char *PalEditLab[4] = { + "Custom 1 (Light Pixel):", + "Custom 1 (Dark Pixel):", + "Custom 2 (Light Pixel):", + "Custom 2 (Dark Pixel):" +}; + +int PalEditWindow_Create(void) +{ + int x, y; + + // Window + PalEditWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(PalEditWindow), "Custom palette edit"); + gtk_widget_set_size_request(GTK_WIDGET(PalEditWindow), 350, 450); + gtk_window_set_default_size(PalEditWindow, 350, 450); + g_signal_connect(PalEditWindow, "delete_event", G_CALLBACK(PalEditWindow_delete_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(PalEditWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Table + CTable = GTK_TABLE(gtk_table_new(12, 3, FALSE)); + gtk_widget_show(GTK_WIDGET(CTable)); + + // Keyboard labels & comboboxes + for (y=0; y<4; y++) { + ColorLabel[y] = GTK_LABEL(gtk_label_new(PalEditLab[y])); + gtk_table_attach(CTable, GTK_WIDGET(ColorLabel[y]), 0, 3, y*3, y*3+1, GTK_FILL | GTK_EXPAND, GTK_FILL, 12, 2); + gtk_widget_show(GTK_WIDGET(ColorLabel[y])); + ColorPrev[y] = GTK_DRAWING_AREA(gtk_drawing_area_new()); + gtk_widget_set_size_request(GTK_WIDGET(ColorPrev[y]), 32, 32); + g_signal_connect(GTK_WIDGET(ColorPrev[y]), "expose_event", G_CALLBACK(ColorPrev_exposure), (gpointer)y); + gtk_table_attach(CTable, GTK_WIDGET(ColorPrev[y]), 0, 3, y*3+1, y*3+2, GTK_FILL | GTK_EXPAND, GTK_FILL, 12, 2); + gtk_widget_show(GTK_WIDGET(ColorPrev[y])); + for (x=0; x<3; x++) { + ColorComp_Adj[y][x] = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 255.0, 1.0, 16.0, 0.0)); + g_signal_connect(ColorComp_Adj[y][x], "value_changed", G_CALLBACK(ColorComp_Adj_changed), (gpointer)(y*4+x)); + ColorComp[x][y] = GTK_SCALE(gtk_hscale_new(ColorComp_Adj[y][x])); + g_signal_connect(ColorComp[x][y], "format-value", G_CALLBACK(ColorComp_formatvalue), (gpointer)(y*4+x)); + gtk_table_attach(CTable, GTK_WIDGET(ColorComp[x][y]), x, x+1, y*3+2, y*3+3, GTK_FILL | GTK_EXPAND, GTK_FILL, 12, 2); + gtk_widget_show(GTK_WIDGET(ColorComp[x][y])); + } + } + + // Scrolling window + PalEditSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(PalEditSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport(PalEditSW, GTK_WIDGET(CTable)); + gtk_container_add(GTK_CONTAINER(VBox1), GTK_WIDGET(PalEditSW)); + gtk_widget_show(GTK_WIDGET(PalEditSW)); + + // Horizontal buttons box and they buttons + HButtonBox = GTK_BUTTON_BOX(gtk_hbutton_box_new()); + gtk_button_box_set_layout(GTK_BUTTON_BOX(HButtonBox), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(HButtonBox), 0); + gtk_box_pack_start(VBox1, GTK_WIDGET(HButtonBox), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(HButtonBox)); + + ButtonClose = GTK_BUTTON(gtk_button_new_with_label("Close")); + g_signal_connect(ButtonClose, "clicked", G_CALLBACK(PalEditWindow_ButtonClose_clicked), NULL); + gtk_container_add(GTK_CONTAINER(HButtonBox), GTK_WIDGET(ButtonClose)); + gtk_widget_show(GTK_WIDGET(ButtonClose)); + + return 1; +} + +void PalEditWindow_Destroy(void) +{ +} + +void PalEditWindow_Activate(void) +{ + gtk_widget_show(GTK_WIDGET(PalEditWindow)); + gtk_window_present(PalEditWindow); +} + +void PalEditWindow_UpdateConfigs(void) +{ + int y; + + PalEditWindow_InConfigs = 1; + + // Modify adjusters + for (y=0; y<4; y++) { + gtk_adjustment_set_value(ColorComp_Adj[y][0], (double)GetValH24(CommandLine.custompal[y])); + gtk_adjustment_set_value(ColorComp_Adj[y][1], (double)GetValM24(CommandLine.custompal[y])); + gtk_adjustment_set_value(ColorComp_Adj[y][2], (double)GetValL24(CommandLine.custompal[y])); + } + + PalEditWindow_InConfigs = 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PalEditWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PalEditWindow.h new file mode 100644 index 0000000000..ab57ae7c35 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PalEditWindow.h @@ -0,0 +1,31 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PALEDITWINDOW_H +#define PALEDITWINDOW_H + +#include +#include + +// This window management +int PalEditWindow_Create(void); +void PalEditWindow_Destroy(void); +void PalEditWindow_Activate(void); +void PalEditWindow_UpdateConfigs(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PokeMini_Debug.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PokeMini_Debug.c new file mode 100644 index 0000000000..63dec7cbda --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PokeMini_Debug.c @@ -0,0 +1,828 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware_Debug.h" +#include "ExportBMP.h" +#include "ExportWAV.h" +#include "Joystick.h" +#include "Keyboard.h" +#include "KeybMapSDL.h" + +#include "Video_x1.h" +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" + +#include + +#include "PokeMini_Debug.h" +#include "PokeMiniIcon_96x128.h" +#include "GtkXDialogs.h" + +#include "CPUWindow.h" +#include "InputWindow.h" +#include "PalEditWindow.h" +#include "MemWindow.h" +#include "PRCTilesWindow.h" +#include "PRCMapWindow.h" +#include "PRCSprWindow.h" +#include "TimersWindow.h" +#include "HardIOWindow.h" +#include "IRQWindow.h" +#include "MiscWindow.h" +#include "SymbWindow.h" +#include "TraceWindow.h" +#include "ExternalWindow.h" + +const char *LCDName = "Pokemon-Mini LCD"; +const char *AppName = "PokeMini " PokeMini_Version " Debugger"; + +int emurunning = 1, emulimiter = 1; +SDL_Joystick *joystick; +SDL_Surface *screen; +int PMWidth, PMHeight; +int PixPitch, PMOff, PMZoom; +void setup_screen(void); + +char argv0[PMTMPV]; + +FILE *sdump = NULL; +double sdumptime = 0.0; + +volatile int emumode = EMUMODE_STOP; + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) + +// Custom command line (NEW IN 0.4.6) +int clc_zoom = 4, clc_bpp = 16, clc_fullscreen = 0, clc_autorun = 0; +const TCommandLineCustom CustomArgs[] = { + { "-zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "-bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "-windowed", &clc_fullscreen, COMMANDLINE_INTSET, 0 }, + { "-fullscreen", &clc_fullscreen, COMMANDLINE_INTSET, 1 }, + { "-autorun", &clc_autorun, COMMANDLINE_INT, 0, 3 }, + { "", NULL, COMMANDLINE_EOL } +}; +int dclc_fullrange = 1; +int dclc_followPC = 1; +int dclc_followSP = 1; +int dclc_PRC_bg = 1; +int dclc_PRC_spr = 1; +int dclc_PRC_stallcpu = 1; +int dclc_PRC_stallcycles = 1; +int dclc_cpuwin_refresh = 7; +int dclc_cpuwin_winx = -16, dclc_cpuwin_winy = -16; +int dclc_cpuwin_winw = -1, dclc_cpuwin_winh = -1; +int dclc_memwin_refresh = 7; +int dclc_memwin_winx = -16, dclc_memwin_winy = -16; +int dclc_memwin_winw = -1, dclc_memwin_winh = -1; +int dclc_prctileswin_refresh = 7; +int dclc_prctileswin_winx = -16, dclc_prctileswin_winy = -16; +int dclc_prctileswin_winw = -1, dclc_prctileswin_winh = -1; +int dclc_prcmapwin_refresh = 7; +int dclc_prcmapwin_winx = -16, dclc_prcmapwin_winy = -16; +int dclc_prcmapwin_winw = -1, dclc_prcmapwin_winh = -1; +int dclc_prcsprwin_refresh = 7; +int dclc_prcsprwin_winx = -16, dclc_prcsprwin_winy = -16; +int dclc_prcsprwin_winw = -1, dclc_prcsprwin_winh = -1; +int dclc_timerswin_refresh = 7; +int dclc_timerswin_winx = -16, dclc_timerswin_winy = -16; +int dclc_timerswin_winw = -1, dclc_timerswin_winh = -1; +int dclc_hardiowin_refresh = 7; +int dclc_hardiowin_winx = -16, dclc_hardiowin_winy = -16; +int dclc_hardiowin_winw = -1, dclc_hardiowin_winh = -1; +int dclc_irqwin_refresh = 7; +int dclc_irqwin_winx = -16, dclc_irqwin_winy = -16; +int dclc_irqwin_winw = -1, dclc_irqwin_winh = -1; +int dclc_miscwin_refresh = 7; +int dclc_miscwin_winx = -16, dclc_miscwin_winy = -16; +int dclc_miscwin_winw = -1, dclc_miscwin_winh = -1; +int dclc_symbwin_refresh = 7; +int dclc_symbwin_winx = -16, dclc_symbwin_winy = -16; +int dclc_symbwin_winw = -1, dclc_symbwin_winh = -1; +int dclc_tracewin_refresh = 7; +int dclc_tracewin_winx = -16, dclc_tracewin_winy = -16; +int dclc_tracewin_winw = -1, dclc_tracewin_winh = -1; +int dclc_zoom_prctiles = 4; +int dclc_zoom_prcmap = 4; +int dclc_zoom_prcspr = 2; +int dclc_trans_prctiles = 0xFF00FF; +int dclc_trans_prcspr = 0xFF00FF; +int dclc_show_hspr = 1; +int dclc_minimalist_sprview = 0; +int dclc_irqframes_on_1row = 0; +int dclc_autoread_minsym = 1; +int dclc_autorw_emusym = 1; +char dclc_extapp_title[10][PMTMPV]; +char dclc_extapp_exec[10][PMTMPV]; +int dclc_extapp_atcurrdir[10]; +char dclc_recent[10][PMTMPV]; +int dclc_debugout = 1; +int dclc_autodebugout = 1; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "fullscreen", &clc_fullscreen, COMMANDLINE_BOOL }, + { "autorun", &clc_autorun, COMMANDLINE_INT, 0, 3 }, + // Debugger configs + { "fullrange", &dclc_fullrange, COMMANDLINE_BOOL }, + { "follow_pc", &dclc_followPC, COMMANDLINE_BOOL }, + { "follow_sp", &dclc_followSP, COMMANDLINE_BOOL }, + { "prc_background", &dclc_PRC_bg, COMMANDLINE_BOOL }, + { "prc_sprites", &dclc_PRC_spr, COMMANDLINE_BOOL }, + { "prc_stallcpu", &dclc_PRC_stallcpu, COMMANDLINE_BOOL }, + { "prc_stallidlecycles", &dclc_PRC_stallcycles, COMMANDLINE_INT, 8, 64 }, + { "debug_out", &dclc_debugout, COMMANDLINE_BOOL }, + { "auto_debug_out", &dclc_autodebugout, COMMANDLINE_BOOL }, + { "cpuwin_refresh", &dclc_cpuwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "cpuwin_winx", &dclc_cpuwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "cpuwin_winy", &dclc_cpuwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "cpuwin_winw", &dclc_cpuwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "cpuwin_winh", &dclc_cpuwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "memwin_refresh", &dclc_memwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "memwin_winx", &dclc_memwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "memwin_winy", &dclc_memwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "memwin_winw", &dclc_memwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "memwin_winh", &dclc_memwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "prctileswin_refresh", &dclc_prctileswin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "prctileswin_winx", &dclc_prctileswin_winx, COMMANDLINE_INT, -16, 4095 }, + { "prctileswin_winy", &dclc_prctileswin_winy, COMMANDLINE_INT, -16, 4095 }, + { "prctileswin_winw", &dclc_prctileswin_winw, COMMANDLINE_INT, -1, 4095 }, + { "prctileswin_winh", &dclc_prctileswin_winh, COMMANDLINE_INT, -1, 4095 }, + { "prcmapwin_refresh", &dclc_prcmapwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "prcmapwin_winx", &dclc_prcmapwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "prcmapwin_winy", &dclc_prcmapwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "prcmapwin_winw", &dclc_prcmapwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "prcmapwin_winh", &dclc_prcmapwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "prcsprwin_refresh", &dclc_prcsprwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "prcsprwin_winx", &dclc_prcsprwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "prcsprwin_winy", &dclc_prcsprwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "prcsprwin_winw", &dclc_prcsprwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "prcsprwin_winh", &dclc_prcsprwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "timerswin_refresh", &dclc_timerswin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "timerswin_winx", &dclc_timerswin_winx, COMMANDLINE_INT, -16, 4095 }, + { "timerswin_winy", &dclc_timerswin_winy, COMMANDLINE_INT, -16, 4095 }, + { "timerswin_winw", &dclc_timerswin_winw, COMMANDLINE_INT, -1, 4095 }, + { "timerswin_winh", &dclc_timerswin_winh, COMMANDLINE_INT, -1, 4095 }, + { "hardiowin_refresh", &dclc_hardiowin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "hardiowin_winx", &dclc_hardiowin_winx, COMMANDLINE_INT, -16, 4095 }, + { "hardiowin_winy", &dclc_hardiowin_winy, COMMANDLINE_INT, -16, 4095 }, + { "hardiowin_winw", &dclc_hardiowin_winw, COMMANDLINE_INT, -1, 4095 }, + { "hardiowin_winh", &dclc_hardiowin_winh, COMMANDLINE_INT, -1, 4095 }, + { "irqwin_refresh", &dclc_irqwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "irqwin_winx", &dclc_irqwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "irqwin_winy", &dclc_irqwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "irqwin_winw", &dclc_irqwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "irqwin_winh", &dclc_irqwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "miscwin_refresh", &dclc_miscwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "miscwin_winx", &dclc_miscwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "miscwin_winy", &dclc_miscwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "miscwin_winw", &dclc_miscwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "miscwin_winh", &dclc_miscwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "symbwin_refresh", &dclc_symbwin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "symbwin_winx", &dclc_symbwin_winx, COMMANDLINE_INT, -16, 4095 }, + { "symbwin_winy", &dclc_symbwin_winy, COMMANDLINE_INT, -16, 4095 }, + { "symbwin_winw", &dclc_symbwin_winw, COMMANDLINE_INT, -1, 4095 }, + { "symbwin_winh", &dclc_symbwin_winh, COMMANDLINE_INT, -1, 4095 }, + { "tracewin_refresh", &dclc_tracewin_refresh, COMMANDLINE_INT, 0, 1000 }, + { "tracewin_winx", &dclc_tracewin_winx, COMMANDLINE_INT, -16, 4095 }, + { "tracewin_winy", &dclc_tracewin_winy, COMMANDLINE_INT, -16, 4095 }, + { "tracewin_winw", &dclc_tracewin_winw, COMMANDLINE_INT, -1, 4095 }, + { "tracewin_winh", &dclc_tracewin_winh, COMMANDLINE_INT, -1, 4095 }, + { "zoom_prctiles", &dclc_zoom_prctiles, COMMANDLINE_INT, 1, 8 }, + { "zoom_prcmap", &dclc_zoom_prcmap, COMMANDLINE_INT, 1, 8 }, + { "zoom_prcspr", &dclc_zoom_prcspr, COMMANDLINE_INT, 1, 8 }, + { "transparency_prctiles", &dclc_trans_prctiles, COMMANDLINE_INT, 0x000000, 0xFFFFFF }, + { "transparency_prcspr", &dclc_trans_prcspr, COMMANDLINE_INT, 0x000000, 0xFFFFFF }, + { "show_hidden_sprites", &dclc_show_hspr, COMMANDLINE_BOOL }, + { "minimalist_sprview", &dclc_minimalist_sprview, COMMANDLINE_BOOL }, + { "irqframes_on_1row", &dclc_irqframes_on_1row, COMMANDLINE_BOOL }, + { "autoread_min_symbols", &dclc_autoread_minsym, COMMANDLINE_BOOL }, + { "autorw_emu_symbols", &dclc_autorw_emusym, COMMANDLINE_BOOL }, + { "extapp1_title", (int *)&dclc_extapp_title[0], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp1_exec", (int *)&dclc_extapp_exec[0], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp1_atcurrdir", (int *)&dclc_extapp_atcurrdir[0], COMMANDLINE_BOOL }, + { "extapp2_title", (int *)&dclc_extapp_title[1], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp2_exec", (int *)&dclc_extapp_exec[1], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp2_atcurrdir", (int *)&dclc_extapp_atcurrdir[1], COMMANDLINE_BOOL }, + { "extapp3_title", (int *)&dclc_extapp_title[2], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp3_exec", (int *)&dclc_extapp_exec[2], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp3_atcurrdir", (int *)&dclc_extapp_atcurrdir[2], COMMANDLINE_BOOL }, + { "extapp4_title", (int *)&dclc_extapp_title[3], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp4_exec", (int *)&dclc_extapp_exec[3], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp4_atcurrdir", (int *)&dclc_extapp_atcurrdir[3], COMMANDLINE_BOOL }, + { "extapp5_title", (int *)&dclc_extapp_title[4], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp5_exec", (int *)&dclc_extapp_exec[4], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp5_atcurrdir", (int *)&dclc_extapp_atcurrdir[4], COMMANDLINE_BOOL }, + { "extapp6_title", (int *)&dclc_extapp_title[5], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp6_exec", (int *)&dclc_extapp_exec[5], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp6_atcurrdir", (int *)&dclc_extapp_atcurrdir[5], COMMANDLINE_BOOL }, + { "extapp7_title", (int *)&dclc_extapp_title[6], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp7_exec", (int *)&dclc_extapp_exec[6], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp7_atcurrdir", (int *)&dclc_extapp_atcurrdir[6], COMMANDLINE_BOOL }, + { "extapp8_title", (int *)&dclc_extapp_title[7], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp8_exec", (int *)&dclc_extapp_exec[7], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp8_atcurrdir", (int *)&dclc_extapp_atcurrdir[7], COMMANDLINE_BOOL }, + { "extapp9_title", (int *)&dclc_extapp_title[8], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp9_exec", (int *)&dclc_extapp_exec[8], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp9_atcurrdir", (int *)&dclc_extapp_atcurrdir[8], COMMANDLINE_BOOL }, + { "extapp10_title", (int *)&dclc_extapp_title[9], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp10_exec", (int *)&dclc_extapp_exec[9], COMMANDLINE_STR, PMTMPV-1 }, + { "extapp10_atcurrdir", (int *)&dclc_extapp_atcurrdir[9], COMMANDLINE_BOOL }, + { "recent_rom0", (int *)&dclc_recent[0], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom1", (int *)&dclc_recent[1], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom2", (int *)&dclc_recent[2], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom3", (int *)&dclc_recent[3], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom4", (int *)&dclc_recent[4], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom5", (int *)&dclc_recent[5], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom6", (int *)&dclc_recent[6], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom7", (int *)&dclc_recent[7], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom8", (int *)&dclc_recent[8], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom9", (int *)&dclc_recent[9], COMMANDLINE_STR, PMTMPV-1 }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + { 0, 0, "Go back...", UIItems_PlatformDefC }, + { 9, 0, "Platform", UIItems_PlatformDefC } +}; + +// Setup screen +void setup_screen(void) +{ + TPokeMini_VideoSpec *videospec; + int depth, PMOffX, PMOffY; + + // Calculate size based of zoom + if (clc_zoom == 1) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video1x1; + PMWidth = 192; PMHeight = 128; PMOffX = 48; PMOffY = 32; PMZoom = 1; + } else if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 208; PMHeight = 144; PMOffX = 8; PMOffY = 8; PMZoom = 2; + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 304; PMHeight = 208; PMOffX = 8; PMOffY = 8; PMZoom = 3; + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 400; PMHeight = 272; PMOffX = 8; PMOffY = 8; PMZoom = 4; + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 496; PMHeight = 336; PMOffX = 8; PMOffY = 8; PMZoom = 5; + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 592; PMHeight = 400; PMOffX = 8; PMOffY = 8; PMZoom = 6; + } + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, clc_bpp, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + fprintf(stderr, "Couldn't set video spec from %i bpp\n", clc_bpp); + exit(1); + } + + // Set video mode + screen = SDL_SetVideoMode(PMWidth, PMHeight, depth, SDL_HWSURFACE | SDL_DOUBLEBUF | (clc_fullscreen ? SDL_FULLSCREEN : 0)); + if (!screen) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + + // Calculate pitch and offset + if (depth == 32) { + PixPitch = screen->pitch / 4; + PMOff = (PMOffY * screen->pitch) + (PMOffX * 4); + } else { + PixPitch = screen->pitch / 2; + PMOff = (PMOffY * screen->pitch) + (PMOffX * 2); + } + clc_bpp = depth; +} + +// Capture screen +void capture_screen(void) +{ + FILE *capf; + int y, capnum; + unsigned long Video[96*64]; + PokeMini_VideoPreview_32((uint32_t *)Video, 96, PokeMini_LCDMode); + capf = OpenUnique_ExportBMP(&capnum, 96, 64); + if (!capf) { + Add_InfoMessage("[Error] Saving capture\n"); + return; + } + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&Video[(63-y) * 96], 96); + } + Add_InfoMessage("[Info] Capture saved at 'snap_%03d.bmp'\n", capnum); + Close_ExportBMP(capf); +} + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + int modx; + switch (event->type) { + case SDL_KEYDOWN: + modx = 0; + if (event->key.keysym.mod & KMOD_CTRL) modx |= 1; + if (event->key.keysym.mod & KMOD_SHIFT) modx |= 2; + if (event->key.keysym.mod & KMOD_ALT) modx |= 4; + if (ProcessMenuItemAccel(event->key.keysym.sym, modx, Menu_item_accel)) break; + + // Process rest of the keys + if (event->key.keysym.sym == SDLK_F9) { // Capture screen + capture_screen(); + } else if (event->key.keysym.sym == SDLK_F10) { // Fullscreen/Window + clc_fullscreen = !clc_fullscreen; + setup_screen(); + } else if (event->key.keysym.sym == SDLK_F11) { // Disable speed throttling + emulimiter = !emulimiter; + } else if (event->key.keysym.sym == SDLK_TAB) { // Temp disable speed throttling + emulimiter = 0; + } else { + KeyboardPressEvent(event->key.keysym.sym); + } + break; + case SDL_KEYUP: + if (event->key.keysym.sym == SDLK_TAB) { // Speed threhold + emulimiter = 1; + } else { + KeyboardReleaseEvent(event->key.keysym.sym); + } + break; + case SDL_JOYBUTTONDOWN: + JoystickButtonsEvent(event->jbutton.button, 1); + break; + case SDL_JOYBUTTONUP: + JoystickButtonsEvent(event->jbutton.button, 0); + break; + case SDL_JOYAXISMOTION: + JoystickAxisEvent(event->jaxis.axis & 1, event->jaxis.value); + break; + case SDL_JOYHATMOTION: + JoystickHatsEvent(event->jhat.value); + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesS16((int16_t *)stream, len>>1); + if (sdump) { + WriteS16A_ExportWAV(sdump, (int16_t *)stream, len>>1); + sdumptime += (double)len / 88200.0; + } +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Re-open joystick +void reopenjoystick(void) +{ + if (joystick) SDL_JoystickClose(joystick); + joystick = SDL_JoystickOpen(CommandLine.joyid); +} + +void PMDebug_OnAllocMIN(int newsize, int success) +{ + ColorInfoFile[0] = 0; + CPUWindow_ROMResized(); + MemWindow_ROMResized(); + PRCTilesWindow_ROMResized(); +} + +void PMDebug_OnUnzipError(const char *zipfile, const char *reason) +{ + Add_InfoMessage("[Error] Decompressing %s: %s\n", zipfile, reason); +} + +void PMDebug_OnLoadBIOSFile(const char *filename, int success) +{ + if (success == 1) Add_InfoMessage("[Info] BIOS '%s' loaded\n", filename); + else if (success == -1) Add_InfoMessage("[Error] Loading BIOS '%s': file not found, Using FreeBIOS\n", filename); + else Add_InfoMessage("[Error] Loading BIOS '%s': read error, Using FreeBIOS\n", filename); +} + +void PMDebug_OnLoadMINFile(const char *filename, int success) +{ + if (success == 1) { + Add_InfoMessage("[Info] ROM '%s' loaded\n", filename); + SymbWindow_ROMLoaded(filename); + CPUWindow_Refresh(1); + } else if (success == -1) Add_InfoMessage("[Error] Loading ROM '%s': file not found\n", filename); + else if (success == -2) Add_InfoMessage("[Error] Loading ROM '%s': invalid size\n", filename); + else Add_InfoMessage("[Error] Loading ROM '%s', read error\n", filename); +} + +void PMDebug_OnLoadColorFile(const char *filename, int success) +{ + if (success == 1) { + Add_InfoMessage("[Info] Color info '%s' loaded\n", filename); + strcpy(ColorInfoFile, filename); + } else if (success == -1) Add_InfoMessage("[Error] Loading color info '%s': file not found\n", filename); + else Add_InfoMessage("[Error] Loading color info '%s': read error\n", filename); +} + +void PMDebug_OnLoadEEPROMFile(const char *filename, int success) +{ + if (success == 1) Add_InfoMessage("[Info] EEPROM '%s' loaded\n", filename); + else if (success == -1) Add_InfoMessage("[Error] Loading EEPROM '%s': file not found\n", filename); + else Add_InfoMessage("[Error] Loading EEPROM '%s': read error\n", filename); +} + +void PMDebug_OnSaveEEPROMFile(const char *filename, int success) +{ + if (success == 1) Add_InfoMessage("[Info] EEPROM '%s' saved\n", filename); + else if (success == -1) Add_InfoMessage("[Error] Saving EEPROM '%s': filename invalid\n", filename); + else Add_InfoMessage("[Error] Saving EEPROM '%s': write error\n", filename); +} + +void PMDebug_OnLoadStateFile(const char *filename, int success) +{ + if (success == 1) Add_InfoMessage("[Info] State '%s' loaded\n", filename); + else if (success == -1) Add_InfoMessage("[Error] Loading state '%s': file not found\n", filename); + else if (success == -2) Add_InfoMessage("[Error] Loading state '%s': invalid file\n", filename); + else if (success == -3) Add_InfoMessage("[Error] Loading state '%s': wrong version\n", filename); + else if (success == -4) Add_InfoMessage("[Error] Loading state '%s': invalid header\n", filename); + else if (success == -5) Add_InfoMessage("[Error] Loading state '%s': invalid internal block\n", filename); + else Add_InfoMessage("[Error] Loading state '%s': read error\n", filename); +} + +void PMDebug_OnSaveStateFile(const char *filename, int success) +{ + if (success == 1) Add_InfoMessage("[Info] State '%s' saved\n", filename); + else if (success == -1) Add_InfoMessage("[Error] Saving state '%s': filename invalid\n", filename); + else Add_InfoMessage("[Error] Saving state '%s': write error\n", filename); +} + +void PMDebug_OnReset(int hardreset) +{ + PMHD_Reset(hardreset); + Cmd_DebugOutput(-1); +} + +// Set emulator mode +void set_emumode(int mode, int tempsave) +{ + static int temp_emumode = EMUMODE_STOP; + int dorefresh = 0; + + if (mode == EMUMODE_RESTORE) mode = temp_emumode; + else if (tempsave) temp_emumode = emumode; + + if ((emumode & EMUMODE_SOUND) && !(mode & EMUMODE_SOUND)) enablesound(0); + if (!(emumode & EMUMODE_SOUND) && (mode & EMUMODE_SOUND)) enablesound(CommandLine.sound); + if ((emumode != EMUMODE_RUNFULL) && (mode == EMUMODE_RUNFULL)) sensitive_debug(0); + if ((emumode == EMUMODE_RUNFULL) && (mode != EMUMODE_RUNFULL)) sensitive_debug(1); + if (emumode != mode) dorefresh = 1; + + emumode = mode; + if (dorefresh) { + CPUWindow_EmumodeChanged(); + refresh_debug(1); + } +} + +// Refresh all debug components +void refresh_debug(int now) +{ + CPUWindow_Refresh(now); + MemWindow_Refresh(now); + PRCTilesWindow_Refresh(now); + PRCMapWindow_Refresh(now); + PRCSprWindow_Refresh(now); + TimersWindow_Refresh(now); + HardIOWindow_Refresh(now); + IRQWindow_Refresh(now); + MiscWindow_Refresh(now); + SymbWindow_Refresh(now); + TraceWindow_Refresh(now); +} + +// "Run full" status changed +void sensitive_debug(int enable) +{ + MemWindow_Sensitive(enable); + PRCTilesWindow_Sensitive(enable); + PRCMapWindow_Sensitive(enable); + PRCSprWindow_Sensitive(enable); + TimersWindow_Sensitive(enable); + HardIOWindow_Sensitive(enable); + IRQWindow_Sensitive(enable); + MiscWindow_Sensitive(enable); + SymbWindow_Sensitive(enable); + TraceWindow_Sensitive(enable); +} + +// Display command-line switches +void display_commandline(void) +{ + char *buffer; + buffer = (char *)malloc(PrintHelpUsageStr(NULL)+256); + PrintHelpUsageStr(buffer); + strcat(buffer, " -autorun Autorun, 0=Off, 1=Full, 2=Dbg+Snd, 3=Dbg\n"); + strcat(buffer, " -windowed Display in window (default)\n"); + strcat(buffer, " -fullscreen Display in fullscreen\n"); + strcat(buffer, " -zoom n Zoom display: 1 to 6 (def 4)\n"); + strcat(buffer, " -bpp n Bits-Per-Pixel: 16 or 32 (def 16)\n"); + MessageDialog(MainWindow, buffer, "Command line", GTK_MESSAGE_INFO, PokeMiniIcon_96x128); + free(buffer); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Event event; + char title[PMTMPV]; + int AutoRun = 0; + + // Get current directory + PokeMini_InitDirs(argv[0], argv0); + + // Change to executable directory + PokeMini_GotoExecDir(); + + // Init GTK & create main window + gtk_init(&argc, &argv); + if (!CPUWindow_Create()) { fprintf(stderr, "Error creating CPU window"); return 1; } + if (!InputWindow_Create()) { fprintf(stderr, "Error creating input window"); return 1; } + if (!PalEditWindow_Create()) { fprintf(stderr, "Error creating palette edit window"); return 1; } + if (!MemWindow_Create()) { fprintf(stderr, "Error creating memory window"); return 1; } + if (!PRCTilesWindow_Create()) { fprintf(stderr, "Error creating PRC tiles window"); return 1; } + if (!PRCMapWindow_Create()) { fprintf(stderr, "Error creating PRC map window"); return 1; } + if (!PRCSprWindow_Create()) { fprintf(stderr, "Error creating PRC sprites window"); return 1; } + if (!TimersWindow_Create()) { fprintf(stderr, "Error creating misc. window"); return 1; } + if (!HardIOWindow_Create()) { fprintf(stderr, "Error creating hardware IO window"); return 1; } + if (!IRQWindow_Create()) { fprintf(stderr, "Error creating IRQ window"); return 1; } + if (!MiscWindow_Create()) { fprintf(stderr, "Error creating misc. window"); return 1; } + if (!SymbWindow_Create()) { fprintf(stderr, "Error creating symbol list window"); return 1; } + if (!TraceWindow_Create()) { fprintf(stderr, "Error creating trace window"); return 1; } + if (!ExternalWindow_Create()) { fprintf(stderr, "Error creating external window"); return 1; } + + // Process arguments + Add_InfoMessage("%s\n\n", AppName); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", "pokemini_debug.cfg", CustomConf); + if (!CommandLineArgs(argc, argv, CustomArgs)) { + display_commandline(); + } + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + return 1; + } + joystick = SDL_JoystickOpen(CommandLine.joyid); // Open joystick + atexit(SDL_Quit); // Clean up on exit + + // Initialize the display + setup_screen(); + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_S16; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + Add_InfoMessage("[Error] Unable to open audio: %s\n", SDL_GetError()); + Add_InfoMessage("[Error] Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Set the window manager title bar + SDL_WM_SetCaption(LCDName, "PokeMini"); + SDL_EnableKeyRepeat(0, 0); + + // Restore current directory + PokeMini_GotoCurrentDir(); + + // Initialize the emulator + if (!PokeMini_Create(0, PMSNDBUFFER)) { + fprintf(stderr, "Error while initializing emulator\n"); + return 1; + } + PMHD_MINLoaded(); + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff & allocate dummy ROM + PokeMini_OnAllocMIN = PMDebug_OnAllocMIN; + PokeMini_OnUnzipError = PMDebug_OnUnzipError; + PokeMini_OnLoadBIOSFile = PMDebug_OnLoadBIOSFile; + PokeMini_OnLoadMINFile = PMDebug_OnLoadMINFile; + PokeMini_OnLoadColorFile = PMDebug_OnLoadColorFile; + PokeMini_OnLoadEEPROMFile = PMDebug_OnLoadEEPROMFile; + PokeMini_OnSaveEEPROMFile = PMDebug_OnSaveEEPROMFile; + PokeMini_OnLoadStateFile = PMDebug_OnLoadStateFile; + PokeMini_OnSaveStateFile = PMDebug_OnSaveStateFile; + PokeMini_OnReset = PMDebug_OnReset; + CPUWindow_UpdateConfigs(); + InputWindow_UpdateConfigs(); + PalEditWindow_UpdateConfigs(); + MemWindow_UpdateConfigs(); + PRCTilesWindow_UpdateConfigs(); + PRCMapWindow_UpdateConfigs(); + PRCSprWindow_UpdateConfigs(); + TimersWindow_UpdateConfigs(); + HardIOWindow_UpdateConfigs(); + IRQWindow_UpdateConfigs(); + MiscWindow_UpdateConfigs(); + SymbWindow_UpdateConfigs(); + TraceWindow_UpdateConfigs(); + ExternalWindow_UpdateConfigs(); + if (PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + CPUWindow_AddMinOnRecent(CommandLine.min_file); + AutoRun = 1; + } + if (!PM_ROM_Alloc) { + if (!PokeMini_NewMIN(65536)) { + fprintf(stderr, "Not enough memory for 64KB ROM!\n"); + return 1; + } + } + + // Activate CPU window and map keyboard + CPUWindow_Activate(); + Add_InfoMessage("[Info] Emulator started.\n"); + KeyboardRemap(&KeybMapSDL); + refresh_debug(1); + enablesound(0); + + // Autorun if MIN was loaded in command-lines + if (AutoRun) { + switch (clc_autorun) { + case 1: set_emumode(EMUMODE_RUNFULL, 0); break; + case 2: set_emumode(EMUMODE_RUNDEBFRAMESND, 0); break; + case 3: set_emumode(EMUMODE_RUNDEBFRAME, 0); break; + } + } + + // Emulator's loop + unsigned long time, NewTickFPS = 0, NewTickSync = 0; + int fpscnt = 0; + while (emurunning) { + time = SDL_GetTicks(); + switch (emumode) { + case EMUMODE_STOP: + SDL_Delay(50); // This lower CPU usage + break; + case EMUMODE_STEP: + PokeMini_EmulateStep(); + set_emumode(EMUMODE_STOP, 0); + break; + case EMUMODE_STEPSKIP: + PokeMini_EmulateStepSkip(); + set_emumode(EMUMODE_STOP, 0); + break; + case EMUMODE_FRAME: + PokeMini_EmulateFrame(); + set_emumode(EMUMODE_STOP, 0); + break; + case EMUMODE_RUNDEBSTEP: + PokeMini_EmulateStep(); + refresh_debug(0); + break; + case EMUMODE_RUNDEBFRAME: case EMUMODE_RUNDEBFRAMESND: + refresh_debug(0); + // continue with EMUMODE_RUNFULL + case EMUMODE_RUNFULL: + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + if (emulimiter) while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + PokeMini_EmulateFrame(); + if (emulimiter) { + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + } + break; + } + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((void *)((uint8_t *)screen->pixels + PMOff + PokeMini_GenRumbleOffset(screen->pitch)), PixPitch); + } else { + PokeMini_VideoBlit((void *)((uint8_t *)screen->pixels + PMOff), PixPitch); + } + LCDDirty--; + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + CPUWindow_FrameRendered(); + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + while (gtk_events_pending()) gtk_main_iteration(); + + // calculate FPS + fpscnt++; + if (time >= NewTickFPS) { + if (emumode == EMUMODE_STOP) { + sprintf(title, "%s - Stopped", LCDName); + SDL_WM_SetCaption(title, "PokeMini"); + } else { + sprintf(title, "%s - %d%%", LCDName, fpscnt * 100 / 72); + SDL_WM_SetCaption(title, "PokeMini"); + } + NewTickFPS = time + 1000; + fpscnt = 0; + } + } + + // Disable sound + enablesound(0); + + // Destroy windows + CPUWindow_Destroy(); + InputWindow_Destroy(); + PalEditWindow_Destroy(); + MemWindow_Destroy(); + PRCTilesWindow_Destroy(); + PRCMapWindow_Destroy(); + PRCSprWindow_Destroy(); + TimersWindow_Destroy(); + HardIOWindow_Destroy(); + IRQWindow_Destroy(); + MiscWindow_Destroy(); + SymbWindow_Destroy(); + TraceWindow_Destroy(); + ExternalWindow_Destroy(); + + // Restore launch directory and save stuff + PokeMini_SaveFromCommandLines(1); + CommandLineConfSave(); + + // Close joystick + if (joystick) SDL_JoystickClose(joystick); + + // Terminate... + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Close sound dump if still open + if (sdump) { + Close_ExportWAV(sdump); + sdump = NULL; + } + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/PokeMini_Debug.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PokeMini_Debug.h new file mode 100644 index 0000000000..cd97111610 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/PokeMini_Debug.h @@ -0,0 +1,129 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_DEBUG +#define POKEMINI_DEBUG + +extern const char *AppName; // Application name +extern int PMZoom; // Pokemon-Mini LCD Zoom (Safe) +extern char argv0[PMTMPV]; // Argument 0 + +extern int clc_zoom; // Command-Line: Zoom +extern int clc_bpp; // Command-Line: Bits-Per-Pixel +extern int clc_fullscreen; // Command-Line: Fullscreen +extern int clc_autorun; // Command-Line: Autorun + +extern int dclc_fullrange; // Debugger Conf: Full range (Physical range) +extern int dclc_followPC; // Debugger Conf: Follow PC +extern int dclc_followSP; // Debugger Conf: Follow SP +extern int dclc_PRC_bg; // Debugger Conf: PRC Background +extern int dclc_PRC_spr; // Debugger Conf: PRC Sprites +extern int dclc_PRC_stallcpu; // Debugger Conf: PRC Stall CPU +extern int dclc_PRC_stallcycles; // Debugger Conf: PRC Stall Idle Cycles +extern int dclc_cpuwin_refresh; // Debugger Conf: CPU Window refresh +extern int dclc_cpuwin_winx, dclc_cpuwin_winy; +extern int dclc_cpuwin_winw, dclc_cpuwin_winh; +extern int dclc_memwin_refresh; // Debugger Conf: Memory Window refresh +extern int dclc_memwin_winx, dclc_memwin_winy; +extern int dclc_memwin_winw, dclc_memwin_winh; +extern int dclc_prctileswin_refresh; // Debugger Conf: PRC Tiles Window refresh +extern int dclc_prctileswin_winx, dclc_prctileswin_winy; +extern int dclc_prctileswin_winw, dclc_prctileswin_winh; +extern int dclc_prcmapwin_refresh; // Debugger Conf: PRC Map Window refresh +extern int dclc_prcmapwin_winx, dclc_prcmapwin_winy; +extern int dclc_prcmapwin_winw, dclc_prcmapwin_winh; +extern int dclc_prcsprwin_refresh; // Debugger Conf: PRC Sprites Window refresh +extern int dclc_prcsprwin_winx, dclc_prcsprwin_winy; +extern int dclc_prcsprwin_winw, dclc_prcsprwin_winh; +extern int dclc_timerswin_refresh; // Debugger Conf: Timers Window refresh +extern int dclc_timerswin_winx, dclc_timerswin_winy; +extern int dclc_timerswin_winw, dclc_timerswin_winh; +extern int dclc_hardiowin_refresh; // Debugger Conf: Hardware IO Window refresh +extern int dclc_hardiowin_winx, dclc_hardiowin_winy; +extern int dclc_hardiowin_winw, dclc_hardiowin_winh; +extern int dclc_irqwin_refresh; // Debugger Conf: IRQ Window refresh +extern int dclc_irqwin_winx, dclc_irqwin_winy; +extern int dclc_irqwin_winw, dclc_irqwin_winh; +extern int dclc_miscwin_refresh; // Debugger Conf: Misc Window refresh +extern int dclc_miscwin_winx, dclc_miscwin_winy; +extern int dclc_miscwin_winw, dclc_miscwin_winh; +extern int dclc_symbwin_refresh; // Debugger Conf: Symbols List Window refresh +extern int dclc_symbwin_winx, dclc_symbwin_winy; +extern int dclc_symbwin_winw, dclc_symbwin_winh; +extern int dclc_tracewin_refresh; // Debugger Conf: Code Trace Window refresh +extern int dclc_tracewin_winx, dclc_tracewin_winy; +extern int dclc_tracewin_winw, dclc_tracewin_winh; +extern int dclc_zoom_prctiles; // Debugger Conf: Zoom (PRC Tiles) +extern int dclc_zoom_prcmap; // Debugger Conf: Zoom (PRC Map) +extern int dclc_zoom_prcspr; // Debugger Conf: Zoom (PRC Sprites) +extern int dclc_trans_prctiles; // Debugger Conf: Transparency color (PRC Tiles) +extern int dclc_trans_prcspr; // Debugger Conf: Transparency color (PRC Sprites) +extern int dclc_show_hspr; // Debugger Conf: Show hidden sprites +extern int dclc_minimalist_sprview; // Debugger Conf: Minimalist sprite view +extern int dclc_irqframes_on_1row; // Debugger Conf: IRQ frames on single row +extern int dclc_autoread_minsym; // Debugger Conf: Auto Read PMAS Symbols +extern int dclc_autorw_emusym; // Debugger Conf: Auto Read/Write PokeMini Symbols +extern char dclc_extapp_title[10][PMTMPV]; // Debugger Conf: External application n title +extern char dclc_extapp_exec[10][PMTMPV]; // Debugger Conf: External application n executable +extern int dclc_extapp_atcurrdir[10]; // Debugger Conf: Launch at current directory +extern char dclc_recent[10][PMTMPV]; // Debugger Conf: Recent ROMs list +extern int dclc_debugout; // Debugger Conf: Enable debug output +extern int dclc_autodebugout; // Debugger Conf: Auto open debug output +extern int emurunning; // Emulator running, set 0 to exit +extern int emulimiter; // Emulator limiter + +enum { + EMUMODE_RESTORE = -1, // Restore mode + EMUMODE_STOP = 0, // Stopped + EMUMODE_STEP, // Step into (Run single instruction) + EMUMODE_STEPSKIP, // Step skip (Jump over current instruction) + EMUMODE_FRAME, // Run single frame + EMUMODE_RUNDEBSTEP, // Run and refresh debugger in each step + EMUMODE_RUNDEBFRAME, // Run and refresh debugger in each frame + EMUMODE_RUNDEBFRAMESND = 8, // Run and refresh debugger in each frame (with sound) + EMUMODE_RUNFULL, // Run at full speed + EMUMODE_SOUND = (1 << 3) // AND to mask sound +}; +extern volatile int emumode; // Read-Only, current emulator mode + +// Sound dump file +extern FILE *sdump; +extern double sdumptime; + +// Setup screen +void setup_screen(void); + +// Enable sound +void enablesound(int sound); + +// Re-open joystick +void reopenjoystick(void); + +// Set emulator mode +void set_emumode(int mode, int tempsave); + +// Refresh all debug components +void refresh_debug(int now); + +// "Run full" status changed +void sensitive_debug(int enable); + +// Display command-line switches +void display_commandline(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/SymbWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/SymbWindow.c new file mode 100644 index 0000000000..1e0d8baf24 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/SymbWindow.c @@ -0,0 +1,1242 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" +#include "MemWindow.h" + +#include "SymbWindow.h" +#include "PokeMiniIcon_96x128.h" +#include "InstructionProc.h" +#include "InstructionInfo.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int SymbWindow_InConfigs = 0; + +GtkWindow *SymbWindow; +static int SymbWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkNotebook *ViewNB; +static SGtkXDrawingView CodeView; +static SGtkXDrawingView DataView; +static GtkLabel *PMSymbFile; + +static int SymbsModified = 0; +static SymbItem *FirstCode = NULL; +static SymbItem *FirstData = NULL; + +static char pmsymbfile[PMTMPV]; + +static GtkXCustomDialog SymbView_NewValue_CD[] = { + {GTKXCD_LABEL, "Set new value for $XXXX:"}, + {GTKXCD_ENTRY, ""}, + {GTKXCD_LABEL, "Prefix \"$\" for hexadecimal numbers"}, + {GTKXCD_CHECK, "Watchpoint Read access", 1}, + {GTKXCD_CHECK, "Watchpoint Write access", 1}, + {GTKXCD_LABEL, "Warning: Watchpoints are only triggered at\nthe end of the instruction causing it."}, + {GTKXCD_EOL, ""} +}; + +static GtkXCustomDialog SymbView_AddSetCode_CD[] = { + {GTKXCD_LABEL, "Symbol name:"}, + {GTKXCD_ENTRY, ""}, + {GTKXCD_LABEL, "Address:"}, + {GTKXCD_NUMIN, "", 0, 6, 1, 0, 2097151}, + {GTKXCD_LABEL, "NOTE: If symbol already exists\nit will be overwritten."}, + {GTKXCD_EOL, ""} +}; + +static GtkXCustomDialog SymbView_AddSetData_CD[] = { + {GTKXCD_LABEL, "Symbol name:"}, + {GTKXCD_ENTRY, ""}, + {GTKXCD_LABEL, "Address:"}, + {GTKXCD_NUMIN, "", 0, 6, 1, 0, 2097151}, + {GTKXCD_RADIO, "8-Bits", 1}, + {GTKXCD_RADIO, "16-Bits", 0}, + {GTKXCD_RADIO, "24-Bits", 0}, + {GTKXCD_RADIO, "32-Bits", 0}, + {GTKXCD_HSEP, ""}, + {GTKXCD_RADIO2, "Hide number", 0}, + {GTKXCD_RADIO2, "Hexadecimal", 1}, + {GTKXCD_RADIO2, "Signed number", 0}, + {GTKXCD_RADIO2, "Unsigned number", 0}, + {GTKXCD_LABEL, "NOTE: If symbol already exists\nit will be overwritten."}, + {GTKXCD_EOL, ""} +}; + +static GtkXCustomDialog SymbView_ManageCode_CD[] = { + {GTKXCD_RADIO2, "Modify symbol", 1}, + {GTKXCD_LABEL, "Symbol name:"}, + {GTKXCD_ENTRY, ""}, + {GTKXCD_LABEL, "Address:"}, + {GTKXCD_NUMIN, "", 0, 6, 1, 0, 2097151}, + {GTKXCD_LABEL, "NOTE: If symbol already exists\nit will be overwritten."}, + {GTKXCD_HSEP, ""}, + {GTKXCD_HSEP, ""}, + {GTKXCD_RADIO2, "Delete symbol", 0}, + {GTKXCD_EOL, ""} +}; + +static GtkXCustomDialog SymbView_ManageData_CD[] = { + {GTKXCD_RADIO2, "Modify symbol", 1}, + {GTKXCD_LABEL, "Symbol name:"}, + {GTKXCD_ENTRY, ""}, + {GTKXCD_LABEL, "Address:"}, + {GTKXCD_NUMIN, "", 0, 6, 1, 0, 2097151}, + {GTKXCD_RADIO, "8-Bits", 1}, + {GTKXCD_RADIO, "16-Bits", 0}, + {GTKXCD_RADIO, "24-Bits", 0}, + {GTKXCD_RADIO, "32-Bits", 0}, + {GTKXCD_HSEP, ""}, + {GTKXCD_RADIO3, "Hide number", 0}, + {GTKXCD_RADIO3, "Hexadecimal", 1}, + {GTKXCD_RADIO3, "Signed number", 0}, + {GTKXCD_RADIO3, "Unsigned number", 0}, + {GTKXCD_LABEL, "NOTE: If symbol already exists\nit will be overwritten."}, + {GTKXCD_HSEP, ""}, + {GTKXCD_HSEP, ""}, + {GTKXCD_RADIO2, "Delete symbol", 0}, + {GTKXCD_EOL, ""} +}; + +// ------------------- +// Symb items handlers +// ------------------- + +void SymbItemsClearAll(SymbItem **list) +{ + SymbItem *next, *item = *list; + while (item != NULL) { + next = item->next; + free(item); + item = next; + } + *list = NULL; +} + +SymbItem *SymbItemsGetIndex(SymbItem **list, int index) +{ + SymbItem *item = *list; + if (index < 0) return NULL; + while (item != NULL) { + if (index-- == 0) return item; + item = item->next; + } + return NULL; +} + +SymbItem *SymbItemsGet(SymbItem **list, char *symbname) +{ + SymbItem *item = *list; + while (item != NULL) { + if (!strcmp(item->name, symbname)) return item; + item = item->next; + } + return NULL; +} + +void SymbItemsSet(SymbItem **list, SymbItem *setitem, int updateex) +{ + SymbItem *item, *pitem, *newitem; + item = SymbItemsGet(list, setitem->name); + if (item != NULL) { + item->addr = setitem->addr; + if (updateex) { + item->size = setitem->size; + item->ctrl = setitem->ctrl; + } + return; + } + newitem = (SymbItem *)malloc(sizeof(SymbItem)); + memcpy(newitem, setitem, sizeof(SymbItem)); + if (*list == NULL) { + *list = newitem; + newitem->prev = NULL; + newitem->next = NULL; + return; + } + pitem = NULL; + item = *list; + while (item != NULL) { + if (strcmp(item->name, newitem->name) < 0) { + pitem = item; + item = item->next; + } else break; + } + newitem->prev = pitem; + newitem->next = item; + if (pitem) { + pitem->next = newitem; + } else { + *list = newitem; + } + if (item) item->prev = newitem; +} + +void SymbItemsDelete(SymbItem **list, SymbItem *item) +{ + if (!item) return; + if (item->prev) { + item->prev->next = item->next; + } else { + *list = item->next; + } + if (item->next) item->next->prev = item->prev; + free(item); +} + +int SymbItemsLength(SymbItem **list) +{ + int count = 0; + SymbItem *item = *list; + while (item != NULL) { + count++; + item = item->next; + } + return count; +} + +int SymbItemsSetFromFile(char *filename) +{ + FILE *fi; + char tmp[PMTMPV]; + char stype[PMTMPV]; + char sval[PMTMPV]; + char ssize[PMTMPV]; + char ssymb[PMTMPV]; + uint32_t value; + int32_t size; + SymbItem item; + + fi = fopen(filename, "r"); + if (!fi) return 0; + + while (fgets(tmp, PMTMPV, fi) != NULL) { + if (sscanf(tmp, "%s %s %s %s", stype, sval, ssize, ssymb) == 4) { + // Some future PMAS version + value = atoi_Ex(sval, 0); + size = atoi_Ex(ssize, -1); + if (!strcasecmp(stype, "LAB")) { + // Code + strcpy(item.name, ssymb); + item.addr = value; + SymbItemsSet(&FirstCode, &item, 0); + } else if (!strcasecmp(stype, "RAM")) { + // Data + strcpy(item.name, ssymb); + item.addr = value; + item.size = 0; + if (size == 2) item.size = 1; + else if (size == 3) item.size = 2; + else if (size == 4) item.size = 3; + item.ctrl = 1; + SymbItemsSet(&FirstData, &item, 0); + } + } else if (sscanf(tmp, "%s %s %s", stype, sval, ssymb) == 3) { + // PMAS == v0.20 Symbols + value = atoi_Ex(sval, 0); + if (!strcasecmp(stype, "LAB")) { + // Code + strcpy(item.name, ssymb); + item.addr = value; + SymbItemsSet(&FirstCode, &item, 0); + } else if (!strcasecmp(stype, "RAM")) { + // Data + strcpy(item.name, ssymb); + item.addr = value; + item.size = 0; + item.ctrl = 1; + SymbItemsSet(&FirstData, &item, 0); + } + } else if (sscanf(tmp, "%s %s", sval, ssymb) == 2) { + // PMAS <= 0.19 Symbols + // Code and Data + value = atoi_Ex(sval, 0); + strcpy(item.name, ssymb); + item.addr = value; + item.size = 0; + item.ctrl = 1; + SymbItemsSet(&FirstCode, &item, 0); + SymbItemsSet(&FirstData, &item, 0); + } + } + fclose(fi); + + return 1; +} + +int SymbItemsLoadFromFile(char *filename) +{ + char tmp[PMTMPV], *txt; + char par[PMTMPV]; + char tok; + SymbItem item; + FILE *fi; + + SymbItemsClearAll(&FirstCode); + SymbItemsClearAll(&FirstData); + + fi = fopen(filename, "r"); + if (!fi) return 0; + + while (fgets(tmp, PMTMPV, fi) != NULL) { + RemoveComments(tmp); + txt = TrimStr(tmp); + txt = UpToToken(par, txt, " \t\n", &tok); + if (tok == '\n') continue; + if (!strcasecmp(par, "CODE1")) { + txt = UpToToken(par, txt, " \t\n", &tok); + if (tok == '\n') continue; + item.addr = atoi_Ex(par, 0); + txt = UpToToken(item.name, txt, " \t\n", &tok); + SymbItemsSet(&FirstCode, &item, 1); + } else if (!strcasecmp(par, "DATA1")) { + txt = UpToToken(par, txt, " \t\n", &tok); + if (tok == '\n') continue; + item.addr = atoi_Ex(par, 0); + txt = UpToToken(par, txt, " \t\n", &tok); + if (tok == '\n') continue; + item.size = atoi_Ex(par, 0); + if ((item.size < 0) || (item.size > 3)) item.size = 0; + txt = UpToToken(par, txt, " \t\n", &tok); + if (tok == '\n') continue; + item.ctrl = atoi_Ex(par, 0); + txt = UpToToken(item.name, txt, " \t\n", &tok); + SymbItemsSet(&FirstData, &item, 1); + } + } + + return 1; +} + +int SymbItemsSaveToFile(char *filename) +{ + SymbItem *item; + FILE *fo; + + fo = fopen(filename, "w"); + if (!fo) return 0; + + // Write header + fprintf(fo, "# Symbols list generated by PokeMini %s\n", PokeMini_Version); + fprintf(fo, "# Min file: %s\n", GetFilename(CommandLine.min_file)); + + // Write code + item = FirstCode; + while (item != NULL) { + fprintf(fo, "CODE1 $%06X %s\n", item->addr, item->name); + item = item->next; + } + + // Write data + item = FirstData; + while (item != NULL) { + fprintf(fo, "DATA1 $%06X %i %i %s\n", item->addr, item->size, item->ctrl, item->name); + item = item->next; + } + + fclose(fo); + + return 1; +} + +void SymbWindow_Reload(void) +{ + char tmp[PMTMPV]; + if (!strlen(pmsymbfile)) SymbsModified = 0; + sprintf(tmp, "%c%s", (SymbsModified) ? '*' : ' ', pmsymbfile); + gtk_label_set_text(PMSymbFile, tmp); + + sgtkx_drawing_view_sbminmax(&CodeView, 0, SymbItemsLength(&FirstCode)); + sgtkx_drawing_view_sbminmax(&DataView, 0, SymbItemsLength(&FirstData)); + SymbWindow_Refresh(1); +} + +static void SymbWindow_AddSetCode() +{ + SymbItem item; + int result; + + SymbView_AddSetCode_CD[3].number = PhysicalPC(); + sprintf(SymbView_AddSetCode_CD[1].text, "L%06X", SymbView_AddSetCode_CD[3].number); + result = CustomDialog(SymbWindow, "Add/set code symbol", SymbView_AddSetCode_CD); + if (result == 1) { + if (strlen(SymbView_AddSetCode_CD[1].text)) { + strcpy(item.name, SymbView_AddSetCode_CD[1].text); + item.addr = SymbView_AddSetCode_CD[3].number; + SymbItemsSet(&FirstCode, &item, 1); + SymbsModified = 1; + SymbWindow_Reload(); + } else { + MessageDialog(SymbWindow, "Missing symbol name", "Add/set code symbol", GTK_MESSAGE_ERROR, NULL); + } + } else if (result == -1) { + MessageDialog(SymbWindow, "Invalid number", "Add/set code symbol", GTK_MESSAGE_ERROR, NULL); + } +} + +static void SymbWindow_AddSetData() +{ + SymbItem item; + int result; + + SymbView_AddSetData_CD[3].number = 0x1000; + SymbView_AddSetData_CD[1].text[0] = 0; + result = CustomDialog(SymbWindow, "Add/set data symbol", SymbView_AddSetData_CD); + if (result == 1) { + if (strlen(SymbView_AddSetData_CD[1].text)) { + strcpy(item.name, SymbView_AddSetData_CD[1].text); + item.addr = SymbView_AddSetData_CD[3].number; + item.size = 0; + if (SymbView_AddSetData_CD[5].number) item.size = 1; + if (SymbView_AddSetData_CD[6].number) item.size = 2; + if (SymbView_AddSetData_CD[7].number) item.size = 3; + item.ctrl = 1; + if (SymbView_AddSetData_CD[9].number) item.ctrl = 0; + if (SymbView_AddSetData_CD[11].number) item.ctrl = 2; + if (SymbView_AddSetData_CD[12].number) item.ctrl = 3; + SymbItemsSet(&FirstData, &item, 1); + SymbsModified = 1; + SymbWindow_Reload(); + } else { + MessageDialog(SymbWindow, "Missing symbol name", "Add/set data symbol", GTK_MESSAGE_ERROR, NULL); + } + } else if (result == -1) { + MessageDialog(SymbWindow, "Invalid number", "Add/set data symbol", GTK_MESSAGE_ERROR, NULL); + } +} + +// ------- +// Viewers +// ------- + +// Code view exposure event +static int CodeView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + int y, pp; + int yc, ys = -1; + SymbItem *item; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + ys = (widg->mousey - 12) / 12; + } + + // Draw content + pp = widg->sboffset; + item = SymbItemsGetIndex(&FirstCode, pp); + for (y=1; ywidth, 12, color); + + if (item == NULL) { + pp++; + continue; + } + + // Draw trap + if (PMD_TrapPoints[item->addr & PM_ROM_Mask] & TRAPPOINT_BREAK) { + sgtkx_drawing_view_drawfrect(widg, 2, y * 12, 72, 12, 0xFF2000); + } + + // Draw symbol + if (item->addr >= 0x01000000) sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%08X", item->addr); + else sgtkx_drawing_view_drawtext(widg, 20, y * 12, 0x4C3000, "$%06X", item->addr); + sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "-----------"); + sgtkx_drawing_view_drawtext(widg, 180, y * 12, 0x402090, "%s", item->name); + + // Next item + item = item->next; + pp++; + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Left click => Go to address -:- Right click => Manage symbol(s) -:- Middle click => Toggle breakpoint"); + + return 1; +} + +// Code view button press +static int CodeView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int result, pp, ys = -1; + SymbItem *item; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + ys = (widg->mousey - 12) / 12; + + pp = widg->sboffset + ys; + item = SymbItemsGetIndex(&FirstCode, pp); + if ((item == NULL) || (item->addr >= PM_ROM_Size)) { + if (button == SGTKXDV_BRIGHT) { + set_emumode(EMUMODE_STOP, 1); + SymbWindow_AddSetCode(); + set_emumode(EMUMODE_RESTORE, 1); + } + return 1; + } + + set_emumode(EMUMODE_STOP, 1); + + if (button == SGTKXDV_BLEFT) { + // Go to address + ProgramView_GotoAddr(item->addr, 1); + refresh_debug(1); + } else if (button == SGTKXDV_BMIDDLE) { + // Toggle breakpoint + PMD_TrapPoints[item->addr & PM_ROM_Mask] ^= TRAPPOINT_BREAK; + refresh_debug(1); + } else if (button == SGTKXDV_BRIGHT) { + // Manage symbol + SymbView_ManageCode_CD[0].number = 1; + SymbView_ManageCode_CD[8].number = 0; + SymbView_ManageCode_CD[4].number = item->addr; + strcpy(SymbView_ManageCode_CD[2].text, item->name); + result = CustomDialog(SymbWindow, "Manage code symbol", SymbView_ManageCode_CD); + if (result == 1) { + if (strlen(SymbView_ManageCode_CD[2].text)) { + if (SymbView_ManageCode_CD[0].number) { + // Modify symbol + if (strcmp(item->name, SymbView_ManageCode_CD[2].text) && SymbItemsGet(&FirstCode, SymbView_ManageCode_CD[2].text)) { + MessageDialog(SymbWindow, "Symbol already exists", "Manage code symbol", GTK_MESSAGE_ERROR, NULL); + } else { + strcpy(item->name, SymbView_ManageCode_CD[2].text); + item->addr = SymbView_ManageCode_CD[4].number; + SymbsModified = 1; + SymbWindow_Reload(); + } + } else { + // Delele symbol + SymbItemsDelete(&FirstCode, item); + SymbsModified = 1; + SymbWindow_Reload(); + } + } else { + MessageDialog(SymbWindow, "Missing symbol name", "Manage code symbol", GTK_MESSAGE_ERROR, NULL); + } + } else if (result == -1) { + MessageDialog(SymbWindow, "Invalid number", "Manage code symbol", GTK_MESSAGE_ERROR, NULL); + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// Data view exposure event +static int DataView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + + uint32_t color, val; + int y, pp, watch; + int yc, ys = -1; + SymbItem *item; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + ys = (widg->mousey - 12) / 12; + } + + // Draw content + pp = widg->sboffset; + item = SymbItemsGetIndex(&FirstData, pp); + for (y=1; ywidth, 12, color); + + if (item == NULL) { + pp++; + continue; + } + + // Draw trap + watch = PMD_TrapPoints[item->addr & PM_ROM_Mask] & TRAPPOINT_WATCH; + if (watch) { + sgtkx_drawing_view_drawfrect(widg, 82, y * 12, 72, 12, AnyView_TrapColor[watch]); + } + + // Draw symbol + if (item->addr >= 0x01000000) sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "$%08X", item->addr); + else sgtkx_drawing_view_drawtext(widg, 20, y * 12, 0x4C3000, "$%06X", item->addr); + if (item->size == 0) { + val = MinxCPU_OnRead(0, item->addr); + switch (item->ctrl & 3) { + case 1: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "$%02X", val); break; + case 2: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%i", (int)((int8_t)val)); break; + case 3: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%u", (unsigned int)val); break; + } + } else if (item->size == 1) { + val = MinxCPU_OnRead(0, item->addr) + + (MinxCPU_OnRead(0, item->addr+1) << 8); + switch (item->ctrl & 3) { + case 1: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "$%04X", val); break; + case 2: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%i", (int)((int16_t)val)); break; + case 3: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%u", (unsigned int)val); break; + } + } else if (item->size == 2) { + val = MinxCPU_OnRead(0, item->addr) + + (MinxCPU_OnRead(0, item->addr+1) << 8) + + (MinxCPU_OnRead(0, item->addr+2) << 16); + switch (item->ctrl & 3) { + case 1: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "$%06X", val); break; + case 2: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%i", (int)((int32_t)(val << 8)) >> 8); break; + case 3: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%u", (unsigned int)val); break; + } + } else if (item->size == 3) { + val = MinxCPU_OnRead(0, item->addr) + + (MinxCPU_OnRead(0, item->addr+1) << 8) + + (MinxCPU_OnRead(0, item->addr+2) << 16) + + (MinxCPU_OnRead(0, item->addr+3) << 24); + switch (item->ctrl & 3) { + case 1: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "$%08X", val); break; + case 2: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%i", (int)val); break; + case 3: sgtkx_drawing_view_drawtext(widg, 84, y * 12, 0x605080, "%u", (unsigned int)val); break; + } + } + sgtkx_drawing_view_drawtext(widg, 180, y * 12, 0x402090, "%s", item->name); + + // Next item + item = item->next; + pp++; + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Left click => Edit value -:- Right click => Manage symbol(s) -:- Middle click => Toggle watchpoints"); + + return 1; +} + +// Data view button press +static int DataView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int result, pp, ys = -1; + SymbItem *item; + uint32_t val; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + ys = (widg->mousey - 12) / 12; + + pp = widg->sboffset + ys; + item = SymbItemsGetIndex(&FirstData, pp); + if ((item == NULL) || (item->addr >= PM_ROM_Size)) { + if (button == SGTKXDV_BRIGHT) { + set_emumode(EMUMODE_STOP, 1); + SymbWindow_AddSetData(); + set_emumode(EMUMODE_RESTORE, 1); + } + return 1; + } + + set_emumode(EMUMODE_STOP, 1); + + if (button == SGTKXDV_BLEFT) { + // Edit value + val = (uint32_t)MinxCPU_OnRead(0, item->addr); + if (item->size >= 1) val += (uint32_t)MinxCPU_OnRead(0, item->addr+1) << 8; + if (item->size >= 2) val += (uint32_t)MinxCPU_OnRead(0, item->addr+2) << 16; + if (item->size >= 3) val += (uint32_t)MinxCPU_OnRead(0, item->addr+3) << 24; + if ((item->ctrl & 3) == 1) { + sprintf(SymbView_NewValue_CD[1].text, "$%02X", val); + if (item->size == 1) sprintf(SymbView_NewValue_CD[1].text, "$%04X", val); + if (item->size == 2) sprintf(SymbView_NewValue_CD[1].text, "$%06X", val); + if (item->size == 3) sprintf(SymbView_NewValue_CD[1].text, "$%08X", val); + } else { + sprintf(SymbView_NewValue_CD[1].text, "%i", val); + } + SymbView_NewValue_CD[3].number = PMD_TrapPoints[item->addr] & TRAPPOINT_WATCHREAD; + SymbView_NewValue_CD[4].number = PMD_TrapPoints[item->addr] & TRAPPOINT_WATCHWRITE; + sprintf(SymbView_NewValue_CD[0].text, "Set new value for $%04X (%s):", item->addr, item->name); + result = CustomDialog(SymbWindow, "Change memory", SymbView_NewValue_CD); + if (result == 1) { + val = atoi_Ex(SymbView_NewValue_CD[1].text, 0); + WriteToPMMem(item->addr, val); + PMD_TrapPoints[item->addr] &= ~TRAPPOINT_WATCH; + if (SymbView_NewValue_CD[3].number) PMD_TrapPoints[item->addr] |= TRAPPOINT_WATCHREAD; + if (SymbView_NewValue_CD[4].number) PMD_TrapPoints[item->addr] |= TRAPPOINT_WATCHWRITE; + if (item->size >= 1) { + WriteToPMMem(item->addr+1, val >> 8); + PMD_TrapPoints[item->addr+1] &= ~TRAPPOINT_WATCH; + if (SymbView_NewValue_CD[3].number) PMD_TrapPoints[item->addr+1] |= TRAPPOINT_WATCHREAD; + if (SymbView_NewValue_CD[4].number) PMD_TrapPoints[item->addr+1] |= TRAPPOINT_WATCHWRITE; + } + if (item->size >= 2) { + WriteToPMMem(item->addr+2, val >> 16); + PMD_TrapPoints[item->addr+2] &= ~TRAPPOINT_WATCH; + if (SymbView_NewValue_CD[3].number) PMD_TrapPoints[item->addr+2] |= TRAPPOINT_WATCHREAD; + if (SymbView_NewValue_CD[4].number) PMD_TrapPoints[item->addr+2] |= TRAPPOINT_WATCHWRITE; + } + if (item->size >= 3) { + WriteToPMMem(item->addr+3, val >> 24); + PMD_TrapPoints[item->addr+3] &= ~TRAPPOINT_WATCH; + if (SymbView_NewValue_CD[3].number) PMD_TrapPoints[item->addr+3] |= TRAPPOINT_WATCHREAD; + if (SymbView_NewValue_CD[4].number) PMD_TrapPoints[item->addr+3] |= TRAPPOINT_WATCHWRITE; + } + refresh_debug(1); + } else if (result == -1) { + MessageDialog(SymbWindow, "Invalid number", "Change memory", GTK_MESSAGE_ERROR, NULL); + } + } else if (button == SGTKXDV_BMIDDLE) { + val = PMD_TrapPoints[item->addr]; + switch (val & TRAPPOINT_WATCH) { + case 0: val = TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHREAD | TRAPPOINT_WATCHWRITE: val = TRAPPOINT_WATCHREAD; break; + case TRAPPOINT_WATCHREAD: val = TRAPPOINT_WATCHWRITE; break; + case TRAPPOINT_WATCHWRITE: val = 0; break; + } + PMD_TrapPoints[item->addr] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[item->addr] |= val; + if (item->size >= 1) { + PMD_TrapPoints[item->addr+1] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[item->addr+1] |= val; + } + if (item->size >= 2) { + PMD_TrapPoints[item->addr+2] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[item->addr+2] |= val; + } + if (item->size >= 3) { + PMD_TrapPoints[item->addr+3] &= ~TRAPPOINT_WATCH; + PMD_TrapPoints[item->addr+3] |= val; + } + refresh_debug(1); + } else if (button == SGTKXDV_BRIGHT) { + // Manage symbol + SymbView_ManageData_CD[0].number = 1; + SymbView_ManageData_CD[17].number = 0; + SymbView_ManageData_CD[4].number = item->addr; + SymbView_ManageData_CD[5].number = (item->size == 0) ? 1 : 0; + SymbView_ManageData_CD[6].number = (item->size == 1) ? 1 : 0; + SymbView_ManageData_CD[7].number = (item->size == 2) ? 1 : 0; + SymbView_ManageData_CD[8].number = (item->size == 3) ? 1 : 0; + SymbView_ManageData_CD[10].number = (item->ctrl == 0) ? 1 : 0; + SymbView_ManageData_CD[11].number = (item->ctrl == 1) ? 1 : 0; + SymbView_ManageData_CD[12].number = (item->ctrl == 2) ? 1 : 0; + SymbView_ManageData_CD[13].number = (item->ctrl == 3) ? 1 : 0; + strcpy(SymbView_ManageData_CD[2].text, item->name); + result = CustomDialog(SymbWindow, "Manage data symbol", SymbView_ManageData_CD); + if (result == 1) { + if (strlen(SymbView_ManageData_CD[2].text)) { + if (SymbView_ManageData_CD[0].number) { + // Modify symbol + if (strcmp(item->name, SymbView_ManageData_CD[2].text) && SymbItemsGet(&FirstData, SymbView_ManageData_CD[2].text)) { + MessageDialog(SymbWindow, "Symbol already exists", "Manage data symbol", GTK_MESSAGE_ERROR, NULL); + } else { + strcpy(item->name, SymbView_ManageData_CD[2].text); + item->addr = SymbView_ManageData_CD[4].number; + item->size = 0; + if (SymbView_ManageData_CD[6].number) item->size = 1; + if (SymbView_ManageData_CD[7].number) item->size = 2; + if (SymbView_ManageData_CD[8].number) item->size = 3; + item->ctrl = 1; + if (SymbView_ManageData_CD[10].number) item->ctrl = 0; + if (SymbView_ManageData_CD[12].number) item->ctrl = 2; + if (SymbView_ManageData_CD[13].number) item->ctrl = 3; + SymbsModified = 1; + SymbWindow_Reload(); + } + } else { + // Delele symbol + SymbItemsDelete(&FirstData, item); + SymbsModified = 1; + SymbWindow_Reload(); + } + + } else { + MessageDialog(SymbWindow, "Missing symbol name", "Manage data symbol", GTK_MESSAGE_ERROR, NULL); + } + } else if (result == -1) { + MessageDialog(SymbWindow, "Invalid number", "Manage data symbol", GTK_MESSAGE_ERROR, NULL); + } + } + + set_emumode(EMUMODE_RESTORE, 1); + + return 1; +} + +// -------------- +// Menu callbacks +// -------------- + +static void SymbW_ImportSym(GtkWidget *widget, gpointer data) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + strcpy(tmp, CommandLine.min_file); + RemoveExtension(tmp); + strcat(tmp, ".sym"); + if (OpenFileDialogEx(SymbWindow, "Import SYM", tmp, tmp, "PMAS symbols (*.sym)\0*.sym\0All (*.*)\0*.*\0", 0)) { + if (!SymbItemsSetFromFile(tmp)) { + MessageDialog(SymbWindow, "Error loading PMAS symbols list from ROM", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } else SymbsModified = 1; + SymbWindow_Reload(); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void SymbW_LoadPMSymbols(GtkWidget *widget, gpointer data) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + strcpy(tmp, CommandLine.min_file); + RemoveExtension(tmp); + strcat(tmp, ".pmsymbols"); + if (SymbsModified && !YesNoDialog(MainWindow, "Changes not saved\nLoad anyway?", "Load pmsymbols", GTK_MESSAGE_QUESTION, NULL)) { + set_emumode(EMUMODE_RESTORE, 1); + return; + } + if (OpenFileDialogEx(SymbWindow, "Load PokeMini Symbols", tmp, tmp, "PokeMini Symbols (*.pmsymbols)\0*.pmsymbols\0All (*.*)\0*.*\0", 0)) { + if (!SymbItemsLoadFromFile(tmp)) { + MessageDialog(SymbWindow, "Error loading PokeMini symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } else { + strcpy(pmsymbfile, tmp); + SymbsModified = 0; + } + SymbWindow_Reload(); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void SymbW_SavePMSymbols(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 1); + if (strlen(pmsymbfile)) { + if (!SymbItemsSaveToFile(pmsymbfile)) { + MessageDialog(SymbWindow, "Error saving PokeMini symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } + } + SymbsModified = 0; + SymbWindow_Reload(); + set_emumode(EMUMODE_RESTORE, 1); +} + +static void SymbW_SaveAsPMSymbols(GtkWidget *widget, gpointer data) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + strcpy(tmp, CommandLine.min_file); + RemoveExtension(tmp); + strcat(tmp, ".pmsymbols"); + if (SaveFileDialogEx(SymbWindow, "Save PokeMini Symbols", tmp, tmp, "PokeMini Symbols (*.pmsymbols)\0*.pmsymbols\0All (*.*)\0*.*\0", 0)) { + if (!SymbItemsSaveToFile(tmp)) { + MessageDialog(SymbWindow, "Error saving PokeMini symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +static void SymbW_AutoReadSym(GtkWidget *widget, gpointer data) +{ + if (SymbWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/File/Auto read .sym"); + dclc_autoread_minsym = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); +} + +static void SymbW_AutoRWPMSym(GtkWidget *widget, gpointer data) +{ + if (SymbWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/File/Auto rw .pmsymbols"); + dclc_autorw_emusym = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); +} + +static void SymbW_AddSetCode(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 1); + SymbWindow_AddSetCode(); + set_emumode(EMUMODE_RESTORE, 1); +} + +static void SymbW_AddSetData(GtkWidget *widget, gpointer data) +{ + set_emumode(EMUMODE_STOP, 1); + SymbWindow_AddSetData(); + set_emumode(EMUMODE_RESTORE, 1); +} + +static void SymbW_ClrAllCode(GtkWidget *widget, gpointer data) +{ + if (SymbItemsLength(&FirstCode)) { + SymbItemsClearAll(&FirstCode); + SymbsModified = 1; + SymbWindow_Reload(); + } +} + +static void SymbW_ClrAllData(GtkWidget *widget, gpointer data) +{ + if (SymbItemsLength(&FirstData)) { + SymbItemsClearAll(&FirstData); + SymbsModified = 1; + SymbWindow_Reload(); + } +} + +static void SymbW_ClrAll(GtkWidget *widget, gpointer data) +{ + if (SymbItemsLength(&FirstCode) || SymbItemsLength(&FirstData)) { + SymbItemsClearAll(&FirstCode); + SymbItemsClearAll(&FirstData); + SymbsModified = 1; + SymbWindow_Reload(); + } +} + +static void SymbW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void SymbW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (SymbWindow_InConfigs) return; + + if (index >= 0) { + dclc_symbwin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(SymbWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_symbwin_refresh, 4, 0, 0, 1000)) { + dclc_symbwin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint SymbWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(SymbWindow)); + return TRUE; +} + +static gboolean SymbWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) SymbWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry SymbWindow_MenuItems[] = { + + { "/_File", NULL, NULL, 0, "" }, + { "/File/_Import sym...", "I", SymbW_ImportSym, 0, "" }, + { "/File/_Load pmsymbols...", "L", SymbW_LoadPMSymbols, 0, "" }, + { "/File/_Save pmsymbols", "S", SymbW_SavePMSymbols, 0, "" }, + { "/File/S_ave pmsymbols as...", "S", SymbW_SaveAsPMSymbols, 0, "" }, + { "/File/sep1", NULL, NULL, 0, "" }, + { "/File/Auto read .sym", NULL, SymbW_AutoReadSym, 0, "" }, + { "/File/Auto rw .pmsymbols", NULL, SymbW_AutoRWPMSym, 0, "" }, + + { "/_Symbols", NULL, NULL, 0, "" }, + { "/Symbols/Add code symbol...", "C", SymbW_AddSetCode, 0, "" }, + { "/Symbols/Add data symbol...", "D", SymbW_AddSetData, 0, "" }, + { "/Symbols/sep1", NULL, NULL, 0, "" }, + { "/Symbols/Clear all", NULL, NULL, 0, "" }, + { "/Symbols/Clear all/Code symbols", NULL, SymbW_ClrAllCode, 0, "" }, + { "/Symbols/Clear all/Data symbols", NULL, SymbW_ClrAllData, 0, "" }, + { "/Symbols/Clear all/Code and data", NULL, SymbW_ClrAll, 0, "" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, SymbW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, SymbW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, SymbW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, SymbW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, SymbW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, SymbW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, SymbW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, SymbW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, SymbW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, SymbW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, SymbW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint SymbWindow_MenuItemsNum = sizeof(SymbWindow_MenuItems) / sizeof(*SymbWindow_MenuItems); + +// ----------- +// Symb Window +// ----------- + +int SymbWindow_Create(void) +{ + // Window + SymbWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(SymbWindow), "Symbols List View"); + gtk_widget_set_size_request(GTK_WIDGET(SymbWindow), 200, 100); + gtk_window_set_default_size(SymbWindow, 420, 200); + g_signal_connect(SymbWindow, "delete_event", G_CALLBACK(SymbWindow_delete_event), NULL); + g_signal_connect(SymbWindow, "window-state-event", G_CALLBACK(SymbWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(SymbWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, SymbWindow_MenuItemsNum, SymbWindow_MenuItems, NULL); + gtk_window_add_accel_group(SymbWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Code View + CodeView.on_exposure = SGtkXDVCB(CodeView_exposure); + CodeView.on_scroll = SGtkXDVCB(AnyView_scroll); + CodeView.on_resize = SGtkXDVCB(AnyView_resize); + CodeView.on_motion = SGtkXDVCB(AnyView_motion); + CodeView.on_buttonpress = SGtkXDVCB(CodeView_buttonpress); + CodeView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&CodeView, 1); + sgtkx_drawing_view_sbminmax(&CodeView, 0, 255); + gtk_widget_set_size_request(GTK_WIDGET(CodeView.box), 64, 64); + gtk_widget_show(GTK_WIDGET(CodeView.box)); + + // Data View + DataView.on_exposure = SGtkXDVCB(DataView_exposure); + DataView.on_scroll = SGtkXDVCB(AnyView_scroll); + DataView.on_resize = SGtkXDVCB(AnyView_resize); + DataView.on_motion = SGtkXDVCB(AnyView_motion); + DataView.on_buttonpress = SGtkXDVCB(DataView_buttonpress); + DataView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + sgtkx_drawing_view_new(&DataView, 1); + sgtkx_drawing_view_sbminmax(&DataView, 0, 255); + gtk_widget_set_size_request(GTK_WIDGET(DataView.box), 64, 64); + gtk_widget_show(GTK_WIDGET(DataView.box)); + + // View Notebook + ViewNB = GTK_NOTEBOOK(gtk_notebook_new()); + gtk_box_pack_start(VBox1, GTK_WIDGET(ViewNB), TRUE, TRUE, 0); + gtk_notebook_append_page(GTK_NOTEBOOK(ViewNB), GTK_WIDGET(CodeView.box), gtk_label_new("Code / Labels")); + gtk_notebook_append_page(GTK_NOTEBOOK(ViewNB), GTK_WIDGET(DataView.box), gtk_label_new("Data / RAM")); + gtk_widget_show(GTK_WIDGET(ViewNB)); + + // Write file + pmsymbfile[0] = 0; + PMSymbFile = GTK_LABEL(gtk_label_new(pmsymbfile)); + gtk_misc_set_alignment(GTK_MISC(PMSymbFile), 0.5, 0.0); + gtk_label_set_justify(PMSymbFile, GTK_JUSTIFY_CENTER); + gtk_box_pack_start(VBox1, GTK_WIDGET(PMSymbFile), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(PMSymbFile)); + + return 1; +} + +void SymbWindow_Destroy(void) +{ + int x, y, width, height; + if (SymbsModified) { + if (strlen(pmsymbfile) && (SymbItemsLength(&FirstCode) || SymbItemsLength(&FirstData))) { + if (!SymbItemsSaveToFile(pmsymbfile)) { + MessageDialog(SymbWindow, "Error saving PokeMini symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } + } + } + if (gtk_widget_get_realized(GTK_WIDGET(SymbWindow))) { + gtk_widget_show(GTK_WIDGET(SymbWindow)); + gtk_window_deiconify(SymbWindow); + gtk_window_get_position(SymbWindow, &x, &y); + gtk_window_get_size(SymbWindow, &width, &height); + dclc_symbwin_winx = x; + dclc_symbwin_winy = y; + dclc_symbwin_winw = width; + dclc_symbwin_winh = height; + } +} + +void SymbWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(SymbWindow)); + if ((dclc_symbwin_winx > -15) && (dclc_symbwin_winy > -16)) { + gtk_window_move(SymbWindow, dclc_symbwin_winx, dclc_symbwin_winy); + } + if ((dclc_symbwin_winw > 0) && (dclc_symbwin_winh > 0)) { + gtk_window_resize(SymbWindow, dclc_symbwin_winw, dclc_symbwin_winh); + } + gtk_widget_show(GTK_WIDGET(SymbWindow)); + gtk_window_present(SymbWindow); +} + +void SymbWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + + SymbWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/File/Auto read .sym"); + if (dclc_autoread_minsym) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/File/Auto rw .pmsymbols"); + if (dclc_autorw_emusym) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + switch (dclc_symbwin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + SymbWindow_InConfigs = 0; +} + +void SymbWindow_ROMLoaded(const char *filename) +{ + char tmp[PMTMPV]; + if (dclc_autorw_emusym) { + if (SymbsModified) { + if (strlen(pmsymbfile) && (SymbItemsLength(&FirstCode) || SymbItemsLength(&FirstData))) { + if (!SymbItemsSaveToFile(pmsymbfile)) { + MessageDialog(SymbWindow, "Error saving PokeMini symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } + } + } + SymbItemsClearAll(&FirstCode); + SymbItemsClearAll(&FirstData); + strcpy(tmp, filename); + RemoveExtension(tmp); + strcat(tmp, ".pmsymbols"); + strcpy(pmsymbfile, tmp); + if (FileExist(tmp)) { + if (!SymbItemsLoadFromFile(tmp)) { + MessageDialog(SymbWindow, "Error loading PokeMini symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } + } + } else pmsymbfile[0] = 0; + if (dclc_autoread_minsym) { + strcpy(tmp, filename); + RemoveExtension(tmp); + strcat(tmp, ".sym"); + if (FileExist(tmp)) { + if (!SymbItemsSetFromFile(tmp)) { + MessageDialog(SymbWindow, "Error loading PMAS symbols list", "Symbols List Error", GTK_MESSAGE_ERROR, NULL); + } + } + } + SymbsModified = 0; + SymbWindow_Reload(); +} + +void SymbWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(ViewNB)); + gtk_widget_show(GTK_WIDGET(PMSymbFile)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(ViewNB)); + gtk_widget_hide(GTK_WIDGET(PMSymbFile)); + } +} + +void SymbWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_symbwin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(SymbWindow)) || SymbWindow_minimized) return; + } + sgtkx_drawing_view_refresh(&CodeView); + sgtkx_drawing_view_refresh(&DataView); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/SymbWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/SymbWindow.h new file mode 100644 index 0000000000..9129fbce3f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/SymbWindow.h @@ -0,0 +1,44 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef SYMBWINDOW_H +#define SYMBWINDOW_H + +#include +#include + +typedef struct TSymbItem { + struct TSymbItem *prev; + struct TSymbItem *next; + char name[PMTMPV]; + uint32_t addr; + int size; // Data only: 0 = 8-Bits, 1 = 16-Bits, 2 = 24-Bits, 3 = 32-Bits + int ctrl; // Data only: Control / Display + // Bit 0-1: 0 = None, 1 = Hexadecimal, 2 = Signed integer, 3 = Unsigned integer +} SymbItem; + +// This window management +int SymbWindow_Create(void); +void SymbWindow_Destroy(void); +void SymbWindow_Activate(void); +void SymbWindow_UpdateConfigs(void); +void SymbWindow_ROMLoaded(const char *filename); +void SymbWindow_Sensitive(int enabled); +void SymbWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/TimersWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TimersWindow.c new file mode 100644 index 0000000000..8ecd2f93b6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TimersWindow.c @@ -0,0 +1,713 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "TimersWindow.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int TimersWindow_InConfigs = 0; + +GtkWindow *TimersWindow; +static int TimersWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static GtkScrolledWindow *TimersSW; +static GtkBox *VBox2; +static GtkBox *HBox1; +static GtkBox *HBox2; +static GtkFrame *FrameOsc; +static GtkBox *VBoxOsc; +static GtkLabel *LabelsOsc[2]; +static GtkFrame *FrameTmrF; +static GtkBox *VBoxTmrF; +static GtkLabel *LabelsTmrF[4]; +static GtkFrame *FrameTmr1; +static GtkBox *VBoxTmr1; +static GtkLabel *LabelsTmr1[15]; +static GtkFrame *FrameTmr2; +static GtkBox *VBoxTmr2; +static GtkLabel *LabelsTmr2[15]; +static GtkFrame *FrameTmr3; +static GtkBox *VBoxTmr3; +static GtkLabel *LabelsTmr3[15]; + +// Enable/Disable frames +static int TimersShow_Osc = 1; +static int TimersShow_F = 1; +static int TimersShow_1 = 1; +static int TimersShow_2 = 1; +static int TimersShow_3 = 1; + +// --------------- +// Get information +// --------------- + +static char *TmrScalar_Txt[32] = { + "Disabled", "Disabled", "Disabled", "Disabled", + "Disabled", "Disabled", "Disabled", "Disabled", + "/2 - 2000000 Hz", + "/8 - 500000 Hz", + "/32 - 125000 Hz", + "/64 - 62500 Hz", + "/128 - 31250 Hz", + "/256 - 15625 Hz", + "/1024 - 3906.25 Hz", + "/4096 - 976.5625 Hz", + "Disabled", "Disabled", "Disabled", "Disabled", + "Disabled", "Disabled", "Disabled", "Disabled", + "/1 - 32768 Hz", + "/2 - 16384 Hz", + "/4 - 8192 Hz", + "/8 - 4096 Hz", + "/16 - 2048 Hz", + "/32 - 1024 Hz", + "/64 - 512 Hz", + "/128 - 256 Hz" +}; + +static void TimersWindow_Render(int force) +{ + char tmp[PMTMPV]; + int val, pre, piv, lopx, hipx; + double fl; + + // Oscillators + if (TimersShow_Osc) { + sprintf(tmp, "2MHz for Timers 1~3: %s", MinxTimers.TmrXEna1 ? "Yes" : "No"); + gtk_label_set_text(LabelsOsc[0], tmp); + sprintf(tmp, "32KHz for Timers 1~3: %s", MinxTimers.TmrXEna2 ? "Yes" : "No"); + gtk_label_set_text(LabelsOsc[1], tmp); + } + + // Fixed Timers + if (TimersShow_F) { + sprintf(tmp, "Seconds Timer Enabled: %s", (PMR_SEC_CTRL & 0x01) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmrF[0], tmp); + val = (int)MinxTimers.SecTimerCnt; + sprintf(tmp, "Seconds Timer Counter: $%06X, %i", val, val); + gtk_label_set_text(LabelsTmrF[1], tmp); + sprintf(tmp, "256 Hz Enabled: %s", (PMR_TMR256_CTRL & 0x01) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmrF[2], tmp); + val = (int)(MinxTimers.Tmr8Cnt >> 24); + sprintf(tmp, "256 Hz Counter: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmrF[3], tmp); + val = (int)(MinxPRC.PRCCnt >> 24); + } + + // Timer 1 + if (TimersShow_1) { + lopx = (PMR_TMR1_SCALE & 0x0F) + ((PMR_TMR1_ENA_OSC & 0x01) ? 16 : 0); + hipx = (PMR_TMR1_SCALE >> 4) + ((PMR_TMR1_ENA_OSC & 0x02) ? 16 : 0); + sprintf(tmp, "16-Bits Mode: %s", (PMR_TMR1_CTRL_L & 0x80) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr1[0], tmp); + if (PMR_TMR1_CTRL_L & 0x80) { + sprintf(tmp, "Oscillator: %s", (PMR_TMR1_ENA_OSC & 0x01) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr1[1], tmp); + sprintf(tmp, "Scalar: %s", TmrScalar_Txt[lopx]); + gtk_label_set_text(LabelsTmr1[2], tmp); + sprintf(tmp, "Enabled: %s", (PMR_TMR1_CTRL_L & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr1[3], tmp); + pre = (int)((MinxTimers.Tmr1PreA >> 24) + ((MinxTimers.Tmr1PreB >> 24) << 8)); + sprintf(tmp, "Preset: $%04X, %i", pre, pre); + gtk_label_set_text(LabelsTmr1[4], tmp); + piv = ((int)PMR_TMR1_PVT_L) + ((int)PMR_TMR1_PVT_H << 8); + sprintf(tmp, "Pivot: $%04X, %i", piv, piv); + gtk_label_set_text(LabelsTmr1[5], tmp); + val = (int)((MinxTimers.Tmr1CntA >> 24) + ((MinxTimers.Tmr1CntB >> 24) << 8)); + sprintf(tmp, "Count: $%04X, %i", val, val); + gtk_label_set_text(LabelsTmr1[6], tmp); + fl = (double)MinxTimers_CountFreq[lopx] / (double)(pre + 1); + sprintf(tmp, "Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr1[7], tmp); + gtk_label_set_text(LabelsTmr1[8], "---"); + gtk_label_set_text(LabelsTmr1[9], "---"); + gtk_label_set_text(LabelsTmr1[10], "---"); + gtk_label_set_text(LabelsTmr1[11], "---"); + gtk_label_set_text(LabelsTmr1[12], "---"); + gtk_label_set_text(LabelsTmr1[13], "---"); + gtk_label_set_text(LabelsTmr1[14], "---"); + } else { + sprintf(tmp, "Lo Oscillator: %s", (PMR_TMR1_ENA_OSC & 0x01) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr1[1], tmp); + sprintf(tmp, "Lo Scalar: %s", TmrScalar_Txt[lopx]); + gtk_label_set_text(LabelsTmr1[2], tmp); + sprintf(tmp, "Lo Enabled: %s", (PMR_TMR1_CTRL_L & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr1[3], tmp); + pre = (int)(MinxTimers.Tmr1PreA >> 24); + sprintf(tmp, "Lo Preset: $%02X, %i", pre, pre); + gtk_label_set_text(LabelsTmr1[4], tmp); + piv = (int)PMR_TMR1_PVT_L; + sprintf(tmp, "Lo Pivot: $%02X, %i", piv, piv); + gtk_label_set_text(LabelsTmr1[5], tmp); + val = (int)(MinxTimers.Tmr1CntA >> 24); + sprintf(tmp, "Lo Count: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmr1[6], tmp); + fl = (double)MinxTimers_CountFreq[lopx] / (double)(pre + 1); + sprintf(tmp, "Lo Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr1[7], tmp); + sprintf(tmp, "Hi Oscillator: %s", (PMR_TMR1_ENA_OSC & 0x02) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr1[8], tmp); + sprintf(tmp, "Hi Scalar: %s", TmrScalar_Txt[hipx]); + gtk_label_set_text(LabelsTmr1[9], tmp); + sprintf(tmp, "Hi Enabled: %s", (PMR_TMR1_CTRL_H & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr1[10], tmp); + pre = (int)(MinxTimers.Tmr1PreB >> 24); + sprintf(tmp, "Hi Preset: $%02X, %i", pre, pre); + gtk_label_set_text(LabelsTmr1[11], tmp); + piv = (int)PMR_TMR1_PVT_H; + sprintf(tmp, "Hi Pivot: $%02X, %i", piv, piv); + gtk_label_set_text(LabelsTmr1[12], tmp); + val = (int)(MinxTimers.Tmr1CntB >> 24); + sprintf(tmp, "Hi Count: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmr1[13], tmp); + fl = (double)MinxTimers_CountFreq[hipx] / (double)(pre + 1); + sprintf(tmp, "Hi Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr1[14], tmp); + } + } + + // Timer 2 + if (TimersShow_2) { + lopx = (PMR_TMR2_SCALE & 0x0F) + ((PMR_TMR2_OSC & 0x01) ? 16 : 0); + hipx = (PMR_TMR2_SCALE >> 4) + ((PMR_TMR2_OSC & 0x02) ? 16 : 0); + sprintf(tmp, "16-Bits Mode: %s", (PMR_TMR2_CTRL_L & 0x80) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr2[0], tmp); + if (PMR_TMR2_CTRL_L & 0x80) { + sprintf(tmp, "Oscillator: %s", (PMR_TMR2_OSC & 0x01) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr2[1], tmp); + sprintf(tmp, "Scalar: %s", TmrScalar_Txt[lopx]); + gtk_label_set_text(LabelsTmr2[2], tmp); + sprintf(tmp, "Enabled: %s", (PMR_TMR2_CTRL_L & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr2[3], tmp); + pre = (int)((MinxTimers.Tmr2PreA >> 24) + ((MinxTimers.Tmr2PreB >> 24) << 8)); + sprintf(tmp, "Preset: $%04X, %i", pre, pre); + gtk_label_set_text(LabelsTmr2[4], tmp); + piv = ((int)PMR_TMR2_PVT_L) + ((int)PMR_TMR2_PVT_H << 8); + sprintf(tmp, "Pivot: $%04X, %i", piv, piv); + gtk_label_set_text(LabelsTmr2[5], tmp); + val = (int)((MinxTimers.Tmr2CntA >> 24) + ((MinxTimers.Tmr2CntB >> 24) << 8)); + sprintf(tmp, "Count: $%04X, %i", val, val); + gtk_label_set_text(LabelsTmr2[6], tmp); + fl = (double)MinxTimers_CountFreq[lopx] / (double)(pre + 1); + sprintf(tmp, "Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr2[7], tmp); + gtk_label_set_text(LabelsTmr2[8], "---"); + gtk_label_set_text(LabelsTmr2[9], "---"); + gtk_label_set_text(LabelsTmr2[10], "---"); + gtk_label_set_text(LabelsTmr2[11], "---"); + gtk_label_set_text(LabelsTmr2[12], "---"); + gtk_label_set_text(LabelsTmr2[13], "---"); + gtk_label_set_text(LabelsTmr2[14], "---"); + } else { + sprintf(tmp, "Lo Oscillator: %s", (PMR_TMR2_OSC & 0x01) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr2[1], tmp); + sprintf(tmp, "Lo Scalar: %s", TmrScalar_Txt[lopx]); + gtk_label_set_text(LabelsTmr2[2], tmp); + sprintf(tmp, "Lo Enabled: %s", (PMR_TMR2_CTRL_L & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr2[3], tmp); + pre = (int)(MinxTimers.Tmr2PreA >> 24); + sprintf(tmp, "Lo Preset: $%02X, %i", pre, pre); + gtk_label_set_text(LabelsTmr2[4], tmp); + piv = (int)PMR_TMR2_PVT_L; + sprintf(tmp, "Lo Pivot: $%02X, %i", piv, piv); + gtk_label_set_text(LabelsTmr2[5], tmp); + val = (int)(MinxTimers.Tmr2CntA >> 24); + sprintf(tmp, "Lo Count: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmr2[6], tmp); + fl = (double)MinxTimers_CountFreq[lopx] / (double)(pre + 1); + sprintf(tmp, "Lo Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr2[7], tmp); + sprintf(tmp, "Hi Oscillator: %s", (PMR_TMR2_OSC & 0x02) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr2[8], tmp); + sprintf(tmp, "Hi Scalar: %s", TmrScalar_Txt[hipx]); + gtk_label_set_text(LabelsTmr2[9], tmp); + sprintf(tmp, "Hi Enabled: %s", (PMR_TMR2_CTRL_H & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr2[10], tmp); + pre = (int)(MinxTimers.Tmr2PreB >> 24); + sprintf(tmp, "Hi Preset: $%02X, %i", pre, pre); + gtk_label_set_text(LabelsTmr2[11], tmp); + piv = (int)PMR_TMR2_PVT_H; + sprintf(tmp, "Hi Pivot: $%02X, %i", piv, piv); + gtk_label_set_text(LabelsTmr2[12], tmp); + val = (int)(MinxTimers.Tmr2CntB >> 24); + sprintf(tmp, "Hi Count: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmr2[13], tmp); + fl = (double)MinxTimers_CountFreq[hipx] / (double)(pre + 1); + sprintf(tmp, "Hi Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr2[14], tmp); + } + } + + // Timer 3 + Sound + if (TimersShow_3) { + lopx = (PMR_TMR3_SCALE & 0x0F) + ((PMR_TMR3_OSC & 0x01) ? 16 : 0); + hipx = (PMR_TMR3_SCALE >> 4) + ((PMR_TMR3_OSC & 0x02) ? 16 : 0); + sprintf(tmp, "16-Bits Mode: %s", (PMR_TMR3_CTRL_L & 0x80) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr3[0], tmp); + if (PMR_TMR3_CTRL_L & 0x80) { + sprintf(tmp, "Oscillator: %s", (PMR_TMR3_OSC & 0x01) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr3[1], tmp); + sprintf(tmp, "Scalar: %s", TmrScalar_Txt[lopx]); + gtk_label_set_text(LabelsTmr3[2], tmp); + sprintf(tmp, "Enabled: %s", (PMR_TMR3_CTRL_L & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr3[3], tmp); + pre = (int)((MinxTimers.Tmr3PreA >> 24) + ((MinxTimers.Tmr3PreB >> 24) << 8)); + sprintf(tmp, "Preset: $%04X, %i", pre, pre); + gtk_label_set_text(LabelsTmr3[4], tmp); + piv = (int)MinxTimers.Timer3Piv; + sprintf(tmp, "Pivot: $%04X, %i", piv, piv); + gtk_label_set_text(LabelsTmr3[5], tmp); + val = (int)((MinxTimers.Tmr3CntA >> 24) + ((MinxTimers.Tmr3CntB >> 24) << 8)); + sprintf(tmp, "Count: $%04X, %i", val, val); + gtk_label_set_text(LabelsTmr3[6], tmp); + fl = (double)MinxTimers_CountFreq[lopx] / (double)(pre + 1); + sprintf(tmp, "Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr3[7], tmp); + if (pre) fl = 100.0 - ((double)piv / (double)pre * 100.0); + else fl = 0.0; + if (fl < 0.0) fl = 0.0; + sprintf(tmp, "Pulse Width: %.4f%%", fl); + gtk_label_set_text(LabelsTmr3[8], tmp); + switch (PMR_AUD_VOL & 3) { + case 0: val = 0; break; + case 1: case 2: val = 50; break; + default: val = 100; break; + } + sprintf(tmp, "Volume: %i%%", val); + gtk_label_set_text(LabelsTmr3[9], tmp); + gtk_label_set_text(LabelsTmr3[10], "---"); + gtk_label_set_text(LabelsTmr3[11], "---"); + gtk_label_set_text(LabelsTmr3[12], "---"); + gtk_label_set_text(LabelsTmr3[13], "---"); + gtk_label_set_text(LabelsTmr3[14], "---"); + } else { + sprintf(tmp, "Lo Oscillator: %s", (PMR_TMR3_OSC & 0x01) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr3[1], tmp); + sprintf(tmp, "Lo Scalar: %s", TmrScalar_Txt[lopx]); + gtk_label_set_text(LabelsTmr3[2], tmp); + sprintf(tmp, "Lo Enabled: %s", (PMR_TMR3_CTRL_L & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr3[3], tmp); + pre = (int)(MinxTimers.Tmr3PreA >> 24); + sprintf(tmp, "Lo Preset: $%02X, %i", pre, pre); + gtk_label_set_text(LabelsTmr3[4], tmp); + piv = (int)(MinxTimers.Timer3Piv & 0xFF); + sprintf(tmp, "Lo Pivot: $%02X, %i", piv, piv); + gtk_label_set_text(LabelsTmr3[5], tmp); + val = (int)(MinxTimers.Tmr3CntA >> 24); + sprintf(tmp, "Lo Count: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmr3[6], tmp); + fl = (double)MinxTimers_CountFreq[lopx] / (double)(pre + 1); + sprintf(tmp, "Lo Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr3[7], tmp); + sprintf(tmp, "Hi Oscillator: %s", (PMR_TMR3_OSC & 0x02) ? "32Khz" : "2Mhz"); + gtk_label_set_text(LabelsTmr3[8], tmp); + sprintf(tmp, "Hi Scalar: %s", TmrScalar_Txt[hipx]); + gtk_label_set_text(LabelsTmr3[9], tmp); + sprintf(tmp, "Hi Enabled: %s", (PMR_TMR3_CTRL_H & 0x04) ? "Yes" : "No"); + gtk_label_set_text(LabelsTmr3[10], tmp); + pre = (int)(MinxTimers.Tmr3PreB >> 24); + sprintf(tmp, "Hi Preset: $%02X, %i", pre, pre); + gtk_label_set_text(LabelsTmr3[11], tmp); + piv = (int)(MinxTimers.Timer3Piv >> 8); + sprintf(tmp, "Hi Pivot: $%02X, %i", piv, piv); + gtk_label_set_text(LabelsTmr3[12], tmp); + val = (int)(MinxTimers.Tmr3CntB >> 24); + sprintf(tmp, "Hi Count: $%02X, %i", val, val); + gtk_label_set_text(LabelsTmr3[13], tmp); + fl = (double)MinxTimers_CountFreq[hipx] / (double)(pre + 1); + sprintf(tmp, "Hi Underflow Freq.: %.2f Hz", fl); + gtk_label_set_text(LabelsTmr3[14], tmp); + } + } +} + +// -------------- +// Menu callbacks +// -------------- + +static void TimersW_View_Osc(GtkWidget *widget, gpointer data) +{ + if (TimersWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Oscillators"); + TimersShow_Osc = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (TimersShow_Osc) gtk_widget_show(GTK_WIDGET(FrameOsc)); + else gtk_widget_hide(GTK_WIDGET(FrameOsc)); + TimersWindow_Refresh(1); +} + +static void TimersW_View_TmrF(GtkWidget *widget, gpointer data) +{ + if (TimersWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Fixed Timers"); + TimersShow_F = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (TimersShow_F) gtk_widget_show(GTK_WIDGET(FrameTmrF)); + else gtk_widget_hide(GTK_WIDGET(FrameTmrF)); + TimersWindow_Refresh(1); +} + +static void TimersW_View_Tmr1(GtkWidget *widget, gpointer data) +{ + if (TimersWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Timer 1"); + TimersShow_1 = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (TimersShow_1) gtk_widget_show(GTK_WIDGET(FrameTmr1)); + else gtk_widget_hide(GTK_WIDGET(FrameTmr1)); + TimersWindow_Refresh(1); +} + +static void TimersW_View_Tmr2(GtkWidget *widget, gpointer data) +{ + if (TimersWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Timer 2"); + TimersShow_2 = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (TimersShow_2) gtk_widget_show(GTK_WIDGET(FrameTmr2)); + else gtk_widget_hide(GTK_WIDGET(FrameTmr2)); + TimersWindow_Refresh(1); +} + +static void TimersW_View_Tmr3(GtkWidget *widget, gpointer data) +{ + if (TimersWindow_InConfigs) return; + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Timer 3 + Sound"); + TimersShow_3 = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + if (TimersShow_3) gtk_widget_show(GTK_WIDGET(FrameTmr3)); + else gtk_widget_hide(GTK_WIDGET(FrameTmr3)); + TimersWindow_Refresh(1); +} + +static void TimersW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void TimersW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (TimersWindow_InConfigs) return; + + if (index >= 0) { + dclc_timerswin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(TimersWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_timerswin_refresh, 4, 0, 0, 1000)) { + dclc_timerswin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint TimersWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(TimersWindow)); + return TRUE; +} + +static gboolean TimersWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) TimersWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry TimersWindow_MenuItems[] = { + { "/_View", NULL, NULL, 0, "" }, + { "/View/Oscillators", NULL, TimersW_View_Osc, 0, "" }, + { "/View/Fixed Timers", NULL, TimersW_View_TmrF, 0, "" }, + { "/View/Timer 1", NULL, TimersW_View_Tmr1, 0, "" }, + { "/View/Timer 2", NULL, TimersW_View_Tmr2, 0, "" }, + { "/View/Timer 3 + Sound", NULL, TimersW_View_Tmr3, 0, "" }, + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, TimersW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, TimersW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, TimersW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, TimersW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, TimersW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, TimersW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, TimersW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, TimersW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, TimersW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, TimersW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, TimersW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint TimersWindow_MenuItemsNum = sizeof(TimersWindow_MenuItems) / sizeof(*TimersWindow_MenuItems); + +// ------------- +// Timers Window +// ------------- + +int TimersWindow_Create(void) +{ + int i; + + // Window + TimersWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(TimersWindow), "Timers View"); + gtk_widget_set_size_request(GTK_WIDGET(TimersWindow), 200, 100); + gtk_window_set_default_size(TimersWindow, 480, 240); + g_signal_connect(TimersWindow, "delete_event", G_CALLBACK(TimersWindow_delete_event), NULL); + g_signal_connect(TimersWindow, "window-state-event", G_CALLBACK(TimersWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(TimersWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, TimersWindow_MenuItemsNum, TimersWindow_MenuItems, NULL); + gtk_window_add_accel_group(TimersWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Scrolling window with vertical box + TimersSW = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); + gtk_scrolled_window_set_policy(TimersSW, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(VBox1), GTK_WIDGET(TimersSW)); + gtk_widget_show(GTK_WIDGET(TimersSW)); + VBox2 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_scrolled_window_add_with_viewport(TimersSW, GTK_WIDGET(VBox2)); + gtk_widget_show(GTK_WIDGET(VBox2)); + + // 1st Row + HBox1 = GTK_BOX(gtk_hbox_new(TRUE, 0)); + gtk_box_pack_start(VBox2, GTK_WIDGET(HBox1), FALSE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(HBox1)); + + // Oscillators + FrameOsc = GTK_FRAME(gtk_frame_new(" Oscillators ")); + gtk_box_pack_start(HBox1, GTK_WIDGET(FrameOsc), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(FrameOsc)); + VBoxOsc = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameOsc), GTK_WIDGET(VBoxOsc)); + gtk_widget_show(GTK_WIDGET(VBoxOsc)); + for (i=0; i<2; i++) { + LabelsOsc[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsOsc[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsOsc[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxOsc, GTK_WIDGET(LabelsOsc[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsOsc[i])); + } + + // Fixed Timers + FrameTmrF = GTK_FRAME(gtk_frame_new(" Fixed Timers ")); + gtk_box_pack_start(HBox1, GTK_WIDGET(FrameTmrF), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(FrameTmrF)); + VBoxTmrF = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameTmrF), GTK_WIDGET(VBoxTmrF)); + gtk_widget_show(GTK_WIDGET(VBoxTmrF)); + for (i=0; i<4; i++) { + LabelsTmrF[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsTmrF[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsTmrF[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxTmrF, GTK_WIDGET(LabelsTmrF[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsTmrF[i])); + } + + // 2nd Row + HBox2 = GTK_BOX(gtk_hbox_new(TRUE, 0)); + gtk_box_pack_start(VBox2, GTK_WIDGET(HBox2), FALSE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(HBox2)); + + // Timer 1 + FrameTmr1 = GTK_FRAME(gtk_frame_new(" Timer 1 ")); + gtk_box_pack_start(HBox2, GTK_WIDGET(FrameTmr1), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(FrameTmr1)); + VBoxTmr1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameTmr1), GTK_WIDGET(VBoxTmr1)); + gtk_widget_show(GTK_WIDGET(VBoxTmr1)); + for (i=0; i<15; i++) { + LabelsTmr1[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsTmr1[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsTmr1[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxTmr1, GTK_WIDGET(LabelsTmr1[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsTmr1[i])); + } + + // Timer 2 + FrameTmr2 = GTK_FRAME(gtk_frame_new(" Timer 2 ")); + gtk_box_pack_start(HBox2, GTK_WIDGET(FrameTmr2), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(FrameTmr2)); + VBoxTmr2 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameTmr2), GTK_WIDGET(VBoxTmr2)); + gtk_widget_show(GTK_WIDGET(VBoxTmr2)); + for (i=0; i<15; i++) { + LabelsTmr2[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsTmr2[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsTmr2[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxTmr2, GTK_WIDGET(LabelsTmr2[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsTmr2[i])); + } + + // Timer 3 + Sound + FrameTmr3 = GTK_FRAME(gtk_frame_new(" Timer 3 + Sound ")); + gtk_box_pack_start(HBox2, GTK_WIDGET(FrameTmr3), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(FrameTmr3)); + VBoxTmr3 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(FrameTmr3), GTK_WIDGET(VBoxTmr3)); + gtk_widget_show(GTK_WIDGET(VBoxTmr3)); + for (i=0; i<15; i++) { + LabelsTmr3[i] = GTK_LABEL(gtk_label_new("???")); + gtk_misc_set_alignment(GTK_MISC(LabelsTmr3[i]), 0.0, 0.5); + gtk_label_set_justify(LabelsTmr3[i], GTK_JUSTIFY_LEFT); + gtk_box_pack_start(VBoxTmr3, GTK_WIDGET(LabelsTmr3[i]), TRUE, TRUE, 2); + gtk_widget_show(GTK_WIDGET(LabelsTmr3[i])); + } + + return 1; +} + +void TimersWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(TimersWindow))) { + gtk_widget_show(GTK_WIDGET(TimersWindow)); + gtk_window_deiconify(TimersWindow); + gtk_window_get_position(TimersWindow, &x, &y); + gtk_window_get_size(TimersWindow, &width, &height); + dclc_timerswin_winx = x; + dclc_timerswin_winy = y; + dclc_timerswin_winw = width; + dclc_timerswin_winh = height; + } +} + +void TimersWindow_Activate(void) +{ + TimersWindow_Render(1); + if (TimersShow_Osc) gtk_widget_show(GTK_WIDGET(FrameOsc)); + else gtk_widget_hide(GTK_WIDGET(FrameOsc)); + if (TimersShow_F) gtk_widget_show(GTK_WIDGET(FrameTmrF)); + else gtk_widget_hide(GTK_WIDGET(FrameTmrF)); + if (TimersShow_1) gtk_widget_show(GTK_WIDGET(FrameTmr1)); + else gtk_widget_hide(GTK_WIDGET(FrameTmr1)); + if (TimersShow_2) gtk_widget_show(GTK_WIDGET(FrameTmr2)); + else gtk_widget_hide(GTK_WIDGET(FrameTmr2)); + if (TimersShow_3) gtk_widget_show(GTK_WIDGET(FrameTmr3)); + else gtk_widget_hide(GTK_WIDGET(FrameTmr3)); + gtk_widget_realize(GTK_WIDGET(TimersWindow)); + if ((dclc_timerswin_winx > -15) && (dclc_timerswin_winy > -16)) { + gtk_window_move(TimersWindow, dclc_timerswin_winx, dclc_timerswin_winy); + } + if ((dclc_timerswin_winw > 0) && (dclc_timerswin_winh > 0)) { + gtk_window_resize(TimersWindow, dclc_timerswin_winw, dclc_timerswin_winh); + } + gtk_widget_show(GTK_WIDGET(TimersWindow)); + gtk_window_present(TimersWindow); +} + +void TimersWindow_UpdateConfigs(void) +{ + GtkWidget *widg; + + TimersWindow_InConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/View/Oscillators"); + if (TimersShow_Osc) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Fixed Timers"); + if (TimersShow_F) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Timer 1"); + if (TimersShow_1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Timer 2"); + if (TimersShow_2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + widg = gtk_item_factory_get_item(ItemFactory, "/View/Timer 3 + Sound"); + if (TimersShow_3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + + switch (dclc_timerswin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + TimersWindow_InConfigs = 0; +} + +void TimersWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(TimersSW)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(TimersSW)); + } +} + +void TimersWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_timerswin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(TimersWindow)) || TimersWindow_minimized) return; + } + TimersWindow_Render(0); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/TimersWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TimersWindow.h new file mode 100644 index 0000000000..ea44debf4c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TimersWindow.h @@ -0,0 +1,33 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef TIMERSWINDOW_H +#define TIMERSWINDOW_H + +#include +#include + +// This window management +int TimersWindow_Create(void); +void TimersWindow_Destroy(void); +void TimersWindow_Activate(void); +void TimersWindow_UpdateConfigs(void); +void TimersWindow_Sensitive(int enabled); +void TimersWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/TraceWindow.c b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TraceWindow.c new file mode 100644 index 0000000000..9f03f10153 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TraceWindow.c @@ -0,0 +1,492 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "SDL.h" +#include "PokeMini.h" +#include "PokeMini_Debug.h" +#include "Hardware_Debug.h" +#include "CPUWindow.h" + +#include "TraceWindow.h" +#include "PokeMiniIcon_96x128.h" +#include "InstructionProc.h" +#include "InstructionInfo.h" + +#include +#include "GtkXDialogs.h" +#include "SGtkXDrawingView.h" + +static int TraceWindow_InConfigs = 0; + +GtkWindow *TraceWindow; +static int TraceWindow_minimized; +static GtkItemFactory *ItemFactory; +static GtkAccelGroup *AccelGroup; +static GtkBox *VBox1; +static GtkMenuBar *MenuBar; +static GtkLabel *LabelRunFull; +static SGtkXDrawingView TraceView; +static GtkBox *HBox1; +static GtkBox *VBox2[3]; +static GtkLabel *TmrTitle[3]; +static GtkToggleButton *TmrEna[3]; +static GtkLabel *TmrValue[3]; +static GtkButton *TmrClear[3]; +static GtkButton *TmrClipCopy[3]; +static GtkButton *TmrClipPaste[3]; + +static char *TmrTitle_Txt[3] = { + "-: Timing Counter 1 :-", + "-: Timing Counter 2 :-", + "-: Timing Counter 3 :-" +}; + +// ----------------- +// Widgets callbacks +// ----------------- + +static void TraceWindow_Render(void) +{ + char txt[PMTMPV]; + + // Update cycle timers values + sprintf(txt, "%i", CYCTmr1Cnt); + gtk_label_set_text(TmrValue[0], txt); + sprintf(txt, "%i", CYCTmr2Cnt); + gtk_label_set_text(TmrValue[1], txt); + sprintf(txt, "%i", CYCTmr3Cnt); + gtk_label_set_text(TmrValue[2], txt); + + // Render trace view + sgtkx_drawing_view_refresh(&TraceView); +} + +static void TmrEna_toggled(GtkToggleButton *togglebutton, gpointer data) +{ + if (TraceWindow_InConfigs) return; + switch ((int)data) { + case 0: CYCTmr1Ena = gtk_toggle_button_get_active(togglebutton); break; + case 1: CYCTmr2Ena = gtk_toggle_button_get_active(togglebutton); break; + case 2: CYCTmr3Ena = gtk_toggle_button_get_active(togglebutton); break; + } +} + +static void TmrClear_clicked(GtkWidget *widget, gpointer data) +{ + switch ((int)data) { + case 0: CYCTmr1Cnt = 0; break; + case 1: CYCTmr2Cnt = 0; break; + case 2: CYCTmr3Cnt = 0; break; + } + TraceWindow_Render(); +} + +static void TmrClipCopy_clicked(GtkWidget *widget, gpointer data) +{ + char txt[PMTMPV]; + txt[0] = 0; + switch ((int)data) { + case 0: sprintf(txt, "%i", CYCTmr1Cnt); break; + case 1: sprintf(txt, "%i", CYCTmr2Cnt); break; + case 2: sprintf(txt, "%i", CYCTmr3Cnt); break; + } + gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), txt, -1); + gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), txt, -1); +} + +static void TmrClipPaste_clicked(GtkWidget *widget, gpointer data) +{ + gchar *clip = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)); + if (clip == NULL) return; + switch ((int)data) { + case 0: CYCTmr1Cnt = atoi(clip); break; + case 1: CYCTmr2Cnt = atoi(clip); break; + case 2: CYCTmr3Cnt = atoi(clip); break; + } + g_free(clip); + TraceWindow_Render(); +} + +// ------- +// Viewers +// ------- + +// Trace view exposure event +static int TraceView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) +{ + uint32_t color; + int y, pp, ppp; + int yc, ys = -1; + int size; + InstructionInfo *opcode; + uint8_t data[4]; + char opcodename[PMTMPV]; + + // Calculate height and selected item + yc = height / 12; + if ((widg->mouseinside) && (widg->mousey >= 12)) { + ys = (widg->mousey - 12) / 12; + } + + // Draw content + pp = widg->sboffset; + for (y=1; ywidth, 12, color); + + if (pp >= TRACECODE_LENGTH) continue; + + // Get address from history + ppp = TRACAddr[(TRACPoint + (TRACECODE_LENGTH - 1 - pp) + 1) % TRACECODE_LENGTH]; + + // Draw timelapse + if (pp == (TRACECODE_LENGTH - 1)) sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "====>"); + else sgtkx_drawing_view_drawtext(widg, 4, y * 12, 0x4C3000, "%5d", -(TRACECODE_LENGTH - 1) + pp); + + if (ppp != 0xFFFFFFFF) { + // Decode instruction + opcode = GetInstructionInfo(MinxCPU_OnRead, 1, ppp, data, &size); + DisasmSingleOpcode(opcode, ppp, data, opcodename, &CDisAsm_SOpcDec); + + // Draw instruction + sgtkx_drawing_view_drawtext(widg, 52, y * 12, 0x4C3000, "$%06X", ppp); + if (size >= 1) sgtkx_drawing_view_drawtext(widg, 108, y * 12, 0x605020, "%02X", data[0]); + if (size >= 2) sgtkx_drawing_view_drawtext(widg, 124, y * 12, 0x605040, "%02X", data[1]); + if (size >= 3) sgtkx_drawing_view_drawtext(widg, 140, y * 12, 0x605060, "%02X", data[2]); + if (size >= 4) sgtkx_drawing_view_drawtext(widg, 156, y * 12, 0x605080, "%02X", data[3]); + sgtkx_drawing_view_drawtext(widg, 188, y * 12, 0x4C3000, "%s", opcodename); + } else { + sgtkx_drawing_view_drawtext(widg, 52, y * 12, 0x404040, "$------"); + } + pp++; + } + + // Draw top bar + if (emumode != EMUMODE_RUNFULL) { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0xD8D8CC); + } else { + sgtkx_drawing_view_drawfrect(widg, 0, 0, widg->width, 12, 0x68685C); + } + sgtkx_drawing_view_drawtext(widg, 4, 0, 0x00004C, "Run Trace List (Click will go to address)"); + + return 1; +} + +// Trace view button press +static int TraceView_buttonpress(SGtkXDrawingView *widg, int button, int press, int _c) +{ + int ys = -1; + int pp, ppp; + + // Calculate selected item + if (emumode == EMUMODE_RUNFULL) return 0; + if ((!widg->mouseinside) || (widg->mousey < 12)) return 0; + ys = (widg->mousey - 12) / 12; + + // Process selected item + pp = widg->sboffset + ys; + if (pp >= TRACECODE_LENGTH) return 1; + ppp = TRACAddr[(TRACPoint + (TRACECODE_LENGTH - 1 - pp) + 1) % TRACECODE_LENGTH]; + if (button == SGTKXDV_BLEFT) { + if (ppp != 0xFFFFFFFF) { + ProgramView_GotoAddr(ppp, 1); + refresh_debug(1); + } + } + + return 1; +} + +// Trace view resize +static int TraceView_resize(SGtkXDrawingView *widg, int width, int height, int _c) +{ + int lastheight = widg->total_lines; + int currpos = widg->sboffset; + widg->total_lines = height / 12; + sgtkx_drawing_view_sbpage(widg, widg->total_lines, widg->total_lines - 2); + sgtkx_drawing_view_sbvalue(widg, currpos + (lastheight - widg->total_lines)); + + return (emumode == EMUMODE_STOP); +} + +// -------------- +// Menu callbacks +// -------------- + +static void TraceW_RefreshNow(GtkWidget *widget, gpointer data) +{ + refresh_debug(1); +} + +static void TraceW_Refresh(GtkWidget *widget, gpointer data) +{ + int val, index = (int)data; + static int lastrefrindex = -2; + + if (lastrefrindex == index) return; + lastrefrindex = index; + if (TraceWindow_InConfigs) return; + + if (index >= 0) { + dclc_tracewin_refresh = index; + } else { + set_emumode(EMUMODE_STOP, 1); + if (EnterNumberDialog(TraceWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_tracewin_refresh, 4, 0, 0, 1000)) { + dclc_tracewin_refresh = val; + } + set_emumode(EMUMODE_RESTORE, 1); + } +} + +static gint TraceWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + gtk_widget_hide(GTK_WIDGET(TraceWindow)); + return TRUE; +} + +static gboolean TraceWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) +{ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) TraceWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; + return TRUE; +} + +static GtkItemFactoryEntry TraceWindow_MenuItems[] = { + + { "/_Debugger", NULL, NULL, 0, "" }, + { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, + { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, + { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, + { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, + { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, + { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, + { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, + { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, + + { "/_Refresh", NULL, NULL, 0, "" }, + { "/Refresh/Now!", NULL, TraceW_RefreshNow, 0, "" }, + { "/Refresh/sep1", NULL, NULL, 0, "" }, + { "/Refresh/100% 72fps", NULL, TraceW_Refresh, 0, "" }, + { "/Refresh/ 50% 36fps", NULL, TraceW_Refresh, 1, "/Refresh/100% 72fps" }, + { "/Refresh/ 33% 24fps", NULL, TraceW_Refresh, 2, "/Refresh/100% 72fps" }, + { "/Refresh/ 25% 18fps", NULL, TraceW_Refresh, 3, "/Refresh/100% 72fps" }, + { "/Refresh/ 17% 12fps", NULL, TraceW_Refresh, 5, "/Refresh/100% 72fps" }, + { "/Refresh/ 12% 9fps", NULL, TraceW_Refresh, 7, "/Refresh/100% 72fps" }, + { "/Refresh/ 8% 6fps", NULL, TraceW_Refresh, 11, "/Refresh/100% 72fps" }, + { "/Refresh/ 3% 2fps", NULL, TraceW_Refresh, 35, "/Refresh/100% 72fps" }, + { "/Refresh/ 1% 1fps", NULL, TraceW_Refresh, 71, "/Refresh/100% 72fps" }, + { "/Refresh/Custom...", NULL, TraceW_Refresh, -1, "/Refresh/100% 72fps" }, +}; +static gint TraceWindow_MenuItemsNum = sizeof(TraceWindow_MenuItems) / sizeof(*TraceWindow_MenuItems); + +// ------------ +// Trace Window +// ------------ + +int TraceWindow_Create(void) +{ + int i; + + // Window + TraceWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(TraceWindow), "Run Trace View"); + gtk_widget_set_size_request(GTK_WIDGET(TraceWindow), 200, 100); + gtk_window_set_default_size(TraceWindow, 420, 200); + g_signal_connect(TraceWindow, "delete_event", G_CALLBACK(TraceWindow_delete_event), NULL); + g_signal_connect(TraceWindow, "window-state-event", G_CALLBACK(TraceWindow_state_event), NULL); + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(TraceWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Menu bar + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, TraceWindow_MenuItemsNum, TraceWindow_MenuItems, NULL); + gtk_window_add_accel_group(TraceWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Label that warn when running full speed + LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); + + // Trace View + TraceView.on_exposure = SGtkXDVCB(TraceView_exposure); + TraceView.on_scroll = SGtkXDVCB(AnyView_scroll); + TraceView.on_resize = SGtkXDVCB(TraceView_resize); + TraceView.on_motion = SGtkXDVCB(AnyView_motion); + TraceView.on_buttonpress = SGtkXDVCB(TraceView_buttonpress); + TraceView.on_enterleave = SGtkXDVCB(AnyView_enterleave); + TraceView.total_lines = 2; + sgtkx_drawing_view_new(&TraceView, 1); + sgtkx_drawing_view_sbminmax(&TraceView, 0, TRACECODE_LENGTH - 1); + sgtkx_drawing_view_sbvalue(&TraceView, TRACECODE_LENGTH - 1); + gtk_widget_set_size_request(GTK_WIDGET(TraceView.box), 64, 64); + gtk_box_pack_start(VBox1, GTK_WIDGET(TraceView.box), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TraceView.box)); + + // Timers box + HBox1 = GTK_BOX(gtk_hbox_new(FALSE, 0)); + gtk_box_pack_start(VBox1, GTK_WIDGET(HBox1), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(HBox1)); + for (i=0; i<3; i++) { + // Container + VBox2[i] = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_box_pack_start(HBox1, GTK_WIDGET(VBox2[i]), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(VBox2[i])); + + // Timer name + TmrTitle[i] = GTK_LABEL(gtk_label_new(TmrTitle_Txt[i])); + gtk_misc_set_alignment(GTK_MISC(TmrTitle[i]), 0.5, 0.0); + gtk_label_set_justify(TmrTitle[i], GTK_JUSTIFY_CENTER); + gtk_box_pack_start(VBox2[i], GTK_WIDGET(TmrTitle[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TmrTitle[i])); + + // Timer value + TmrValue[i] = GTK_LABEL(gtk_label_new("0")); + gtk_box_pack_start(VBox2[i], GTK_WIDGET(TmrValue[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TmrValue[i])); + + // Enable checkbox + TmrEna[i] = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label("Enable")); + g_signal_connect(TmrEna[i], "toggled", G_CALLBACK(TmrEna_toggled), (gpointer)i); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(TmrEna[i]), TRUE); + gtk_box_pack_start(VBox2[i], GTK_WIDGET(TmrEna[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TmrEna[i])); + + // Timer clear button + TmrClear[i] = GTK_BUTTON(gtk_button_new_with_label("Clear")); + g_signal_connect(TmrClear[i], "clicked", G_CALLBACK(TmrClear_clicked), (gpointer)i); + gtk_box_pack_start(VBox2[i], GTK_WIDGET(TmrClear[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TmrClear[i])); + + // Timer clipboard copy button + TmrClipCopy[i] = GTK_BUTTON(gtk_button_new_with_label("Copy")); + g_signal_connect(TmrClipCopy[i], "clicked", G_CALLBACK(TmrClipCopy_clicked), (gpointer)i); + gtk_box_pack_start(VBox2[i], GTK_WIDGET(TmrClipCopy[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TmrClipCopy[i])); + + // Timer clipboard copy button + TmrClipPaste[i] = GTK_BUTTON(gtk_button_new_with_label("Paste")); + g_signal_connect(TmrClipPaste[i], "clicked", G_CALLBACK(TmrClipPaste_clicked), (gpointer)i); + gtk_box_pack_start(VBox2[i], GTK_WIDGET(TmrClipPaste[i]), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(TmrClipPaste[i])); + } + + return 1; +} + +void TraceWindow_Destroy(void) +{ + int x, y, width, height; + if (gtk_widget_get_realized(GTK_WIDGET(TraceWindow))) { + gtk_widget_show(GTK_WIDGET(TraceWindow)); + gtk_window_deiconify(TraceWindow); + gtk_window_get_position(TraceWindow, &x, &y); + gtk_window_get_size(TraceWindow, &width, &height); + dclc_tracewin_winx = x; + dclc_tracewin_winy = y; + dclc_tracewin_winw = width; + dclc_tracewin_winh = height; + } +} + +void TraceWindow_Activate(void) +{ + gtk_widget_realize(GTK_WIDGET(TraceWindow)); + if ((dclc_tracewin_winx > -15) && (dclc_tracewin_winy > -16)) { + gtk_window_move(TraceWindow, dclc_tracewin_winx, dclc_tracewin_winy); + } + if ((dclc_tracewin_winw > 0) && (dclc_tracewin_winh > 0)) { + gtk_window_resize(TraceWindow, dclc_tracewin_winw, dclc_tracewin_winh); + } + gtk_widget_show(GTK_WIDGET(TraceWindow)); + gtk_window_present(TraceWindow); +} + +void TraceWindow_UpdateConfigs(void) +{ + TraceWindow_InConfigs = 1; + + switch (dclc_tracewin_refresh) { + case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); + break; + case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); + break; + case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); + break; + case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); + break; + case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); + break; + case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); + break; + case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); + break; + case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); + break; + default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); + break; + } + + TraceWindow_InConfigs = 0; +} + +void TraceWindow_Sensitive(int enabled) +{ + if (enabled) { + gtk_widget_hide(GTK_WIDGET(LabelRunFull)); + gtk_widget_show(GTK_WIDGET(TraceView.box)); + gtk_widget_show(GTK_WIDGET(HBox1)); + } else { + gtk_widget_show(GTK_WIDGET(LabelRunFull)); + gtk_widget_hide(GTK_WIDGET(TraceView.box)); + gtk_widget_hide(GTK_WIDGET(HBox1)); + } +} + +void TraceWindow_Refresh(int now) +{ + static int refreshcnt = 0; + if ((refreshcnt <= 0) || (now)) { + refreshcnt = dclc_tracewin_refresh; + if (!now) { + if (!gtk_widget_get_visible(GTK_WIDGET(TraceWindow)) || TraceWindow_minimized) return; + } + TraceWindow_Render(); + } else refreshcnt--; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/TraceWindow.h b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TraceWindow.h new file mode 100644 index 0000000000..abf4371561 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/TraceWindow.h @@ -0,0 +1,33 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef TRACEWINDOW_H +#define TRACEWINDOW_H + +#include +#include + +// This window management +int TraceWindow_Create(void); +void TraceWindow_Destroy(void); +void TraceWindow_Activate(void); +void TraceWindow_UpdateConfigs(void); +void TraceWindow_Sensitive(int enabled); +void TraceWindow_Refresh(int now); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile new file mode 100644 index 0000000000..dafd6eb014 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile @@ -0,0 +1,156 @@ +# PokeMini Makefile for GTK + SDL 1.2 (Linux) + +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMiniD + +WINTARGET = PokeMiniD.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS += -Wall `$(SDL_BASE)sdl-config --cflags` `pkg-config --cflags gtk+-2.0` $(INCLUDE) +SLFLAGS += `$(SDL_BASE)sdl-config --libs` `pkg-config --libs gtk+-2.0` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_Debug.o \ + CPUWindow.o \ + InputWindow.o \ + PalEditWindow.o \ + MemWindow.o \ + PRCTilesWindow.o \ + PRCMapWindow.o \ + PRCSprWindow.o \ + TimersWindow.o \ + HardIOWindow.o \ + IRQWindow.o \ + MiscWindow.o \ + SymbWindow.o \ + TraceWindow.o \ + ExternalWindow.o \ + FileAssociation.o \ + sourcex/KeybMapSDL.o \ + sourcex/GtkXDialogs.o \ + sourcex/Font8x12.o \ + sourcex/PokeMiniIcon_96x128.o \ + sourcex/InstructionProc.o \ + sourcex/InstructionInfo.o \ + sourcex/SGtkXDrawingView.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + sourcex/HelpSupport.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + Hardware_Debug.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/NoUI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o + +DEPENDS_LOCAL = \ + PokeMini_Debug.h \ + CPUWindow.h \ + InputWindow.h \ + PalEditWindow.h \ + MemWindow.h \ + PRCTilesWindow.h \ + PRCMapWindow.h \ + PRCSprWindow.h \ + TimersWindow.h \ + HardIOWindow.h \ + IRQWindow.h \ + MiscWindow.h \ + SymbWindow.h \ + TraceWindow.h \ + ExternalWindow.h \ + FileAssociation.h \ + Hardware_Debug.h + +DEPENDS = \ + freebios/freebios.h \ + sourcex/KeybMapSDL.h \ + sourcex/GtkXDialogs.h \ + sourcex/Font8x12.h \ + sourcex/PokeMiniIcon_96x128.h \ + sourcex/InstructionProc.h \ + sourcex/InstructionInfo.h \ + sourcex/SGtkXDrawingView.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + sourcex/HelpSupport.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) $(DEPENDS_LOCAL) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(CC) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + +win: + make -f makefile.win + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile.old b/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile.old new file mode 100644 index 0000000000..cc99a52251 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile.old @@ -0,0 +1,168 @@ +# PokeMini Makefile for GTK + SDL + +CC = gcc +LD = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMiniD + +RELEASE_DIR = ../../release + +WINTARGET = PokeMiniD.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl-config --cflags` `pkg-config --cflags gtk+-2.0` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl-config --libs` `pkg-config --libs gtk+-2.0` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_Debug.o \ + CPUWindow.o \ + InputWindow.o \ + PalEditWindow.o \ + MemWindow.o \ + PRCTilesWindow.o \ + PRCMapWindow.o \ + PRCSprWindow.o \ + TimersWindow.o \ + HardIOWindow.o \ + IRQWindow.o \ + MiscWindow.o \ + SymbWindow.o \ + TraceWindow.o \ + ExternalWindow.o \ + FileAssociation.o \ + sourcex/KeybMapSDL.o \ + sourcex/GtkXDialogs.o \ + sourcex/Font8x12.o \ + sourcex/PokeMiniIcon_96x128.o \ + sourcex/InstructionProc.o \ + sourcex/InstructionInfo.o \ + sourcex/SGtkXDrawingView.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + sourcex/HelpSupport.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + Hardware_Debug.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/NoUI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o + +DEPENDS_LOCAL = \ + PokeMini_Debug.h \ + CPUWindow.h \ + InputWindow.h \ + PalEditWindow.h \ + MemWindow.h \ + PRCTilesWindow.h \ + PRCMapWindow.h \ + PRCSprWindow.h \ + TimersWindow.h \ + HardIOWindow.h \ + IRQWindow.h \ + MiscWindow.h \ + SymbWindow.h \ + TraceWindow.h \ + ExternalWindow.h \ + FileAssociation.h \ + Hardware_Debug.h + +DEPENDS = \ + freebios/freebios.h \ + sourcex/KeybMapSDL.h \ + sourcex/GtkXDialogs.h \ + sourcex/Font8x12.h \ + sourcex/PokeMiniIcon_96x128.h \ + sourcex/InstructionProc.h \ + sourcex/InstructionInfo.h \ + sourcex/SGtkXDrawingView.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + sourcex/HelpSupport.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) $(DEPENDS_LOCAL) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + if [ -d $(RELEASE_DIR) ]; then cp $(TARGET) $(RELEASE_DIR); fi + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) -DDEBUGGER + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + if [ -d $(RELEASE_DIR) ]; then cp $(TARGET) $(RELEASE_DIR); fi + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile.win b/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile.win new file mode 100644 index 0000000000..571c3b00fb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/debug/makefile.win @@ -0,0 +1,159 @@ +# PokeMini Makefile for GTK + SDL 1.2 (Mingw) + +CC = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build + +WINTARGET = PokeMiniD.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl-config --cflags` `pkg-config --cflags gtk+-2.0` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl-config --libs` `pkg-config --libs gtk+-2.0` -lm -lz + +RELEASE_DIR = ../../release + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_Debug.o \ + CPUWindow.o \ + InputWindow.o \ + PalEditWindow.o \ + MemWindow.o \ + PRCTilesWindow.o \ + PRCMapWindow.o \ + PRCSprWindow.o \ + TimersWindow.o \ + HardIOWindow.o \ + IRQWindow.o \ + MiscWindow.o \ + SymbWindow.o \ + TraceWindow.o \ + ExternalWindow.o \ + FileAssociation.o \ + sourcex/KeybMapSDL.o \ + sourcex/GtkXDialogs.o \ + sourcex/Font8x12.o \ + sourcex/PokeMiniIcon_96x128.o \ + sourcex/InstructionProc.o \ + sourcex/InstructionInfo.o \ + sourcex/SGtkXDrawingView.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + sourcex/HelpSupport.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + Hardware_Debug.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/NoUI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o + +DEPENDS_LOCAL = \ + PokeMini_Debug.h \ + CPUWindow.h \ + InputWindow.h \ + PalEditWindow.h \ + MemWindow.h \ + PRCTilesWindow.h \ + PRCMapWindow.h \ + PRCSprWindow.h \ + TimersWindow.h \ + HardIOWindow.h \ + IRQWindow.h \ + MiscWindow.h \ + SymbWindow.h \ + TraceWindow.h \ + ExternalWindow.h \ + FileAssociation.h \ + Hardware_Debug.h + +DEPENDS = \ + freebios/freebios.h \ + sourcex/KeybMapSDL.h \ + sourcex/GtkXDialogs.h \ + sourcex/Font8x12.h \ + sourcex/PokeMiniIcon_96x128.h \ + sourcex/InstructionProc.h \ + sourcex/InstructionInfo.h \ + sourcex/SGtkXDrawingView.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + sourcex/HelpSupport.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(WINTARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) $(DEPENDS_LOCAL) + $(CC) $(CFLAGS) -o $@ -c $< + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) -DDEBUGGER + $(CC) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + if [ -d $(RELEASE_DIR) ]; then cp $(WINTARGET) $(RELEASE_DIR); fi + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/dingux/PokeMini_Dingux.c b/PVPokeMini/PokeMini/pokemini-code/platform/dingux/PokeMini_Dingux.c new file mode 100644 index 0000000000..63cb6da69b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/dingux/PokeMini_Dingux.c @@ -0,0 +1,354 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" + +#include "UI.h" +#include "Video_x3.h" +#include "PokeMini_BG3.h" + +const char *AppName = "PokeMini " PokeMini_Version " Dingux"; + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSOUNDBUFF (SOUNDBUFFER*2) + +// -------- + +// Joystick names and mapping (NEW IN 0.5.0) +char *Joy_KeysNames[] = { + "Off", // -1 + "Select", // 0 + "Start", // 1 + "Up", // 2 + "Down", // 3 + "Left", // 4 + "Right", // 5 + "A", // 6 + "B", // 7 + "X", // 8 + "Y", // 9 + "L", // 10 + "R" // 11 +}; +int Joy_KeysMapping[] = { + 0, // Menu + 6, // A + 7, // B + 11, // C + 2, // Up + 3, // Down + 4, // Left + 5, // Right + 1, // Power + 10 // Shake +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + if (reason == UIMENU_OK) reason = UIMENU_RIGHT; + if (reason == UIMENU_CANCEL) UIMenu_PrevMenu(); + if (reason == UIMENU_RIGHT) { + if (index == 9) JoystickEnterMenu(); + } + return 1; +} + +// For the emulator loop and video +int emurunning = 1; +SDL_Surface *screen; +int PixPitch, ScOffP; + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_KEYDOWN: + if (event->key.keysym.sym == SDLK_ESCAPE) { // Dingoo Select + JoystickButtonsEvent(0, 1); + } else if (event->key.keysym.sym == SDLK_RETURN) { // Dingoo Start + JoystickButtonsEvent(1, 1); + } else if (event->key.keysym.sym == SDLK_UP) { // Dingoo Up + JoystickButtonsEvent(2, 1); + } else if (event->key.keysym.sym == SDLK_DOWN) { // Dingoo Down + JoystickButtonsEvent(3, 1); + } else if (event->key.keysym.sym == SDLK_LEFT) { // Dingoo Left + JoystickButtonsEvent(4, 1); + } else if (event->key.keysym.sym == SDLK_RIGHT) { // Dingoo Right + JoystickButtonsEvent(5, 1); + } else if (event->key.keysym.sym == SDLK_LCTRL) { // Dingoo A + JoystickButtonsEvent(6, 1); + } else if (event->key.keysym.sym == SDLK_LALT) { // Dingoo B + JoystickButtonsEvent(7, 1); + } else if (event->key.keysym.sym == SDLK_SPACE) { // Dingoo X + JoystickButtonsEvent(8, 1); + } else if (event->key.keysym.sym == SDLK_LSHIFT) { // Dingoo Y + JoystickButtonsEvent(9, 1); + } else if (event->key.keysym.sym == SDLK_TAB) { // Dingoo L + JoystickButtonsEvent(10, 1); + } else if (event->key.keysym.sym == SDLK_BACKSPACE) { // Dingoo R + JoystickButtonsEvent(11, 1); + } + break; + case SDL_KEYUP: + if (event->key.keysym.sym == SDLK_ESCAPE) { // Dingoo Select + JoystickButtonsEvent(0, 0); + } else if (event->key.keysym.sym == SDLK_RETURN) { // Dingoo Start + JoystickButtonsEvent(1, 0); + } else if (event->key.keysym.sym == SDLK_UP) { // Dingoo Up + JoystickButtonsEvent(2, 0); + } else if (event->key.keysym.sym == SDLK_DOWN) { // Dingoo Down + JoystickButtonsEvent(3, 0); + } else if (event->key.keysym.sym == SDLK_LEFT) { // Dingoo Left + JoystickButtonsEvent(4, 0); + } else if (event->key.keysym.sym == SDLK_RIGHT) { // Dingoo Right + JoystickButtonsEvent(5, 0); + } else if (event->key.keysym.sym == SDLK_LCTRL) { // Dingoo A + JoystickButtonsEvent(6, 0); + } else if (event->key.keysym.sym == SDLK_LALT) { // Dingoo B + JoystickButtonsEvent(7, 0); + } else if (event->key.keysym.sym == SDLK_SPACE) { // Dingoo X + JoystickButtonsEvent(8, 0); + } else if (event->key.keysym.sym == SDLK_LSHIFT) { // Dingoo Y + JoystickButtonsEvent(9, 0); + } else if (event->key.keysym.sym == SDLK_TAB) { // Dingoo L + JoystickButtonsEvent(10, 0); + } else if (event->key.keysym.sym == SDLK_BACKSPACE) { // Dingoo R + JoystickButtonsEvent(11, 0); + } + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesS16((int16_t *)stream, len>>1); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + + // Stop sound + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(16); + + // Process UI + UIMenu_Process(); + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + UIMenu_Display_16((uint16_t *)screen->pixels + ScOffP, PixPitch); + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); + SDL_EnableKeyRepeat(0, 0); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Joystick *joy; + SDL_Event event; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", NULL, NULL); + if (!CommandLineArgs(argc, argv, NULL)) { + PrintHelpUsage(stdout); + return 1; + } + JoystickSetup("Dingoo", 0, 30000, Joy_KeysNames, 12, Joy_KeysMapping); + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + joy = SDL_JoystickOpen(0); + atexit(SDL_Quit); // Clean up on exit + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video3x3, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + + // Initialize the display + screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE); // SDL_HWSURFACE | SDL_DOUBLEBUF + if (screen == NULL) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + PixPitch = screen->pitch / 2; + ScOffP = (24 * PixPitch) + 16; + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_S16; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Disable key repeat and hide cursor + SDL_EnableKeyRepeat(0, 0); + SDL_ShowCursor(SDL_DISABLE); + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSOUNDBUFF)) { + fprintf(stderr, "Error while initializing emulator.\n"); + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Starting emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickSync = 0; + while (emurunning) { + // Emulate and syncronize + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + time = SDL_GetTicks(); + PokeMini_EmulateFrame(); + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((uint16_t *)screen->pixels + ScOffP + PokeMini_GenRumbleOffset(PixPitch), PixPitch); + } else { + PokeMini_VideoBlit((uint16_t *)screen->pixels + ScOffP, PixPitch); + } + LCDDirty = 0; + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Close joystick + if (joy) SDL_JoystickClose(joy); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/dingux/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/dingux/makefile new file mode 100644 index 0000000000..3905ba5fd3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/dingux/makefile @@ -0,0 +1,106 @@ +# PokeMini Makefile for Dingux + +DINGUX_TK = /opt/mipsel-linux-uclibc/usr +HOST = mipsel-linux- + +ifeq ($(DINGUX_TK),) +CC = $(HOST)gcc +LD = $(HOST)gcc +STRIP = $(HOST)strip +else +CC = $(DINGUX_TK)/bin/$(HOST)gcc +LD = $(DINGUX_TK)/bin/$(HOST)gcc +STRIP = $(DINGUX_TK)/bin/$(HOST)strip +endif + +BUILD = Build +TARGET = PokeMini.dge +POKEROOT = ../../ + +CFLAGS = -O2 -Wall -g -lSDL $(INCLUDE) -DPERFORMANCE +SLFLAGS = -O2 -lm -lz -g -lSDL + +INCDIRS = source resource freebios dependencies/minizip + +OBJS = \ + PokeMini_Dingux.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x3.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG3.o + +DEPENDS = \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x3.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG3.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) + -rmdir --ignore-fail-on-non-empty $(BUILD) + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/PokeMini_DC.c b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/PokeMini_DC.c new file mode 100644 index 0000000000..1891b4a591 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/PokeMini_DC.c @@ -0,0 +1,704 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +// KOS Documentation: http://gamedev.allusion.net/docs/kos-current/ + +#include +#include +#include +#include + +#include +#include +#include +#include + +#define SPU_RAM_BASE 0xa0800000 + +#include "PokeMini.h" +#include "Hardware.h" +#include "Video_x3.h" +#include "PokeMini_BG3.h" +#include "Joystick.h" + +#include "VMUIcon.h" + +const char *AppName = "PokeMini " PokeMini_Version " Dreamcast"; + +KOS_INIT_FLAGS(INIT_DEFAULT); + +// -------- + +int emurunning = 1; +unsigned short *VIDEO; +int PixPitch, ScOffP; + +#define DC_CONT_TRG_DEAD 80 +#define DC_CONT_JOY_DEAD 40 +#define CONT_LTRIG 0x10000 +#define CONT_RTRIG 0x20000 + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*2) + +int VideoMode(int pal); + +// Joystick names and mapping (NEW IN 0.5.0) +char *DCJoy_KeysNames[] = { + "Off", // -1 + "C", // 0 + "B", // 1 + "A", // 2 + "Start", // 3 + "DPad Up", // 4 + "DPad Down", // 5 + "DPad Left", // 6 + "DPad Right", // 7 + "Z", // 8 + "Y", // 9 + "X", // 10 + "D", // 11 + "DPad2 Up", // 12 + "DPad2 Down", // 13 + "DPad2 Left", // 14 + "DPad2 Right", // 15 + "L Trigger", // 16 + "R Trigger" // 17 +}; +int DCJoy_KeysMapping[] = { + 10, // Menu + 1, // A + 2, // B + 17, // C + 4, // Up + 5, // Down + 6, // Left + 7, // Right + 3, // Power + 16 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_tvout_pal = 0; +int clc_vmu_eeprom = 0; +int clc_displayfps = 0; +const TCommandLineCustom CustomConf[] = { + { "tvout_pal", &clc_tvout_pal, COMMANDLINE_BOOL }, + { "vmu_eeprom", &clc_vmu_eeprom, COMMANDLINE_BOOL }, + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "TV Out: %s", UIItems_PlatformC }, + { 0, 2, "EEPROM: %s", UIItems_PlatformC }, + { 0, 3, "Display FPS: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int videochanged = 0; + if (reason == UIMENU_OK) reason = UIMENU_RIGHT; + if (reason == UIMENU_CANCEL) UIMenu_PrevMenu(); + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // TV Out + clc_tvout_pal = !clc_tvout_pal; + videochanged = 1; + break; + case 2: // VMU EEPROM + clc_vmu_eeprom = !clc_vmu_eeprom; + break; + case 3: // Display FPS + clc_displayfps = !clc_displayfps; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // TV Out + clc_tvout_pal = !clc_tvout_pal; + videochanged = 1; + break; + case 2: // VMU EEPROM + clc_vmu_eeprom = !clc_vmu_eeprom; + break; + case 3: // Display FPS + clc_displayfps = !clc_displayfps; + break; + case 9: // Define keys + JoystickEnterMenu(); + break; + } + } + if (videochanged) VideoMode(clc_tvout_pal); + UIMenu_ChangeItem(UIItems_Platform, 1, "TV Out: %s", clc_tvout_pal ? "PAL" : "NTSC"); + UIMenu_ChangeItem(UIItems_Platform, 2, "EEPROM: %s", clc_vmu_eeprom ? "Auto write to VMU" : "Write discarded"); + UIMenu_ChangeItem(UIItems_Platform, 3, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + return 1; +} + +// Set video +int VideoMode(int pal) +{ + if (vid_check_cable() == CT_VGA) { + // VGA + vid_set_mode(DM_320x240_VGA, PM_RGB565); + } else { + // Composite or RGB + if (pal) { + vid_set_mode(DM_320x240_PAL, PM_RGB565); + } else { + vid_set_mode(DM_320x240_NTSC, PM_RGB565); + } + } + PixPitch = 320; + vid_border_color(0, 0, 0); + memset(vram_s, 0, 1024*1024*2); + VIDEO = vram_s + (24 * PixPitch) + 16; + + return 1; +} + +// Handle keys +void HandleKeys() +{ + maple_device_t *cont; + cont_state_t *state; + uint32_t keys; + + cont = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); + if (!cont) return; + state = (cont_state_t *)maple_dev_status(cont); + if (!state) return; + + JoystickAxisEvent(0, state->joyx); + JoystickAxisEvent(1, state->joyy); + + keys = (state->buttons & 0xFFFF) + | (state->ltrig > DC_CONT_TRG_DEAD ? CONT_LTRIG : 0) + | (state->rtrig > DC_CONT_TRG_DEAD ? CONT_RTRIG : 0); + JoystickBitsEvent(keys); +} + +// Emulator sound +enum { + soundstate_idle, + soundstate_start, + soundstate_playing, + soundstate_stop, + soundstate_end, + soundstate_endok, +}; +volatile int emulatorsoundstate = soundstate_idle; +static semaphore_t *emulatorsound_sem = NULL; +int16_t soundsamp[SOUNDBUFFER / 2]; +void *emulatorsoundthr(void *ptr) +{ + AICA_CMDSTR_CHANNEL(tmp, cmd, chan); + int sndpos, buff_sndpos; + uint32 soundptr; + + snd_init(); + emulatorsound_sem = sem_create(0); + buff_sndpos = SOUNDBUFFER; + + // Allocate sound buffer + soundptr = snd_mem_malloc(PMSNDBUFFER); + spu_memset(soundptr, 0x00, PMSNDBUFFER); + snd_sh4_to_aica_stop(); + + // Setup channel + cmd->cmd = AICA_CMD_CHAN; + cmd->timestamp = 0; + cmd->size = AICA_CMDSTR_CHANNEL_SIZE; + cmd->cmd_id = 0; // (1 << 0) + chan->cmd = AICA_CH_CMD_START | AICA_CH_START_DELAY; + chan->base = soundptr; + chan->type = AICA_SM_16BIT; + chan->length = PMSNDBUFFER / 2; + chan->loop = 1; + chan->loopstart = 0; + chan->loopend = PMSNDBUFFER / 2; + chan->freq = MINX_AUDIOFREQ; + chan->vol = 255; + chan->pan = 128; + snd_sh4_to_aica(tmp, cmd->size); + snd_sh4_to_aica_start(); + + while (emulatorsoundstate != soundstate_end) { + switch(emulatorsoundstate) { + case soundstate_idle: + sem_wait(emulatorsound_sem); + break; + case soundstate_start: + cmd->cmd_id = 1 << 0; + chan->cmd = AICA_CH_CMD_START | AICA_CH_START_SYNC; + snd_sh4_to_aica(tmp, cmd->size); + emulatorsoundstate = soundstate_playing; + break; + case soundstate_playing: + sndpos = g2_read_32(SPU_RAM_BASE + AICA_CHANNEL(0) + offsetof(aica_channel_t, pos)) << 1; + while(buff_sndpos < sndpos && (buff_sndpos + SOUNDBUFFER) > sndpos) { + thd_pass(); + sndpos = g2_read_32(SPU_RAM_BASE + AICA_CHANNEL(0) + offsetof(aica_channel_t, pos)) << 1; + }; + MinxAudio_GenerateEmulatedS16(soundsamp, SOUNDBUFFER / 2, 1); + spu_memload(soundptr + buff_sndpos, soundsamp, SOUNDBUFFER); + buff_sndpos += SOUNDBUFFER; + if (buff_sndpos >= PMSNDBUFFER) buff_sndpos = 0; + break; + case soundstate_stop: + if (emulatorsoundstate != soundstate_idle) { + snd_sh4_to_aica_stop(); + cmd->cmd_id = 1 << 0; + chan->cmd = AICA_CH_CMD_STOP; + snd_sh4_to_aica(tmp, cmd->size); + spu_memset(soundptr, 0x00, PMSNDBUFFER); + snd_sh4_to_aica_start(); + } + emulatorsoundstate = soundstate_idle; + break; + } + thd_pass(); + } + snd_sh4_to_aica_stop(); + cmd->cmd_id = 1 << 0; + chan->cmd = AICA_CH_CMD_STOP; + snd_sh4_to_aica(tmp, cmd->size); + snd_sh4_to_aica_start(); + snd_mem_free(soundptr); + emulatorsoundstate = soundstate_endok; + + return NULL; +} + +// Enable / Disable sound +void enablesound(int sound) +{ + static int lastsound = 0; + MinxAudio_ChangeEngine(sound); + if (sound && !lastsound) { + // Enabling + emulatorsoundstate = soundstate_start; + sem_signal(emulatorsound_sem); + while(emulatorsoundstate != soundstate_playing) thd_pass(); + } + if (!sound && lastsound) { + // Disabling + emulatorsoundstate = soundstate_stop; + sem_signal(emulatorsound_sem); + while(emulatorsoundstate != soundstate_idle) thd_pass(); + } + lastsound = sound; +} + +const char *VMUDevName[8] = { + "a1", "a2", + "b1", "b2", + "c1", "c2", + "d1", "d2" +}; + +// Transfer VMU file to RAM +int loadFileDCRAM(const char *vmufile, const char *ramfile) +{ + maple_device_t *vmu; + vmu_pkg_t pkg; + uint8 *pkg_out; + FILE *fp; + file_t f; + int dev, pkg_size; + char savfile[64]; + + // Search a VMU with the file + for (dev = 0; dev < 8; dev++) { + vmu = maple_enum_dev(dev >> 1, (dev & 1) + 1); + if (!vmu || !vmu->valid || !(vmu->info.functions & MAPLE_FUNC_MEMCARD)) continue; + sprintf(savfile, "/vmu/%s/%s", VMUDevName[dev], vmufile); + f = fs_open(savfile, O_RDONLY); + if (f != FILEHND_INVALID) { + fs_close(f); + break; + } + } + if (dev == 8) { + // No VMU found, return error + return 0; + } + printf("VMU load at %s\n", savfile); + + // Read package + fp = fopen(savfile, "rb"); + fseek(fp, 0, SEEK_END); + pkg_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + pkg_out = (uint8 *)malloc(pkg_size); + fread(pkg_out, pkg_size, 1, fp); + fclose(fp); + vmu_pkg_parse(pkg_out, &pkg); + + // Copy data + fp = fopen(ramfile, "wb"); + fwrite(pkg.data, pkg.data_len, 1, fp); + fclose(fp); + + free(pkg_out); + return 1; + +} + +// Transfer RAM file to VMU +int saveFileDCRAM(const char *vmufile, const char *ramfile, const char *desc_short, const char *desc_long) +{ + maple_device_t *vmu; + vmu_pkg_t pkg; + uint8 *pkg_out, *data_out; + FILE *fp; + file_t f; + int dev, pkg_size, blocks_freed = 0; + int data_len; + char savfile[64]; + + // Read RAM file + fp = fopen(ramfile, "rb"); + if (!fp) { + printf("RAM file %s not found!\n", ramfile); + return 0; + } + fseek(fp, 0, SEEK_END); + data_len = ftell(fp); + fseek(fp, 0, SEEK_SET); + data_out = (uint8 *)malloc(data_len); + fread(data_out, data_len, 1, fp); + fclose(fp); + + // Setup package + strcpy(pkg.desc_long, desc_long); + strcpy(pkg.desc_short, desc_short); + strcpy(pkg.app_id, "PokeMini"); + pkg.icon_cnt = 1; + pkg.icon_anim_speed = 0; + memcpy(pkg.icon_pal, vmuicon_pal, 32); + pkg.icon_data = vmuicon_img; + pkg.eyecatch_type = VMUPKG_EC_NONE; + pkg.data_len = data_len; + pkg.data = data_out; + vmu_pkg_build(&pkg, &pkg_out, &pkg_size); + + // Detect a suitable VMU + // Search a VMU with the file + for (dev = 0; dev < 8; dev++) { + vmu = maple_enum_dev(dev >> 1, (dev & 1) + 1); + if (!vmu || !vmu->valid || !(vmu->info.functions & MAPLE_FUNC_MEMCARD)) continue; + sprintf(savfile, "/vmu/%s/%s", VMUDevName[dev], vmufile); + f = fs_open(savfile, O_RDONLY); + if (f != FILEHND_INVALID) { + fs_close(f); + break; + } + } + if (dev == 8) { + // No file found, try to find a VMU with enough free space + for (dev = 0; dev < 8; dev++) { + vmu = maple_enum_dev(dev >> 1, (dev & 1) + 1); + if (!vmu || !vmu->valid || !(vmu->info.functions & MAPLE_FUNC_MEMCARD)) continue; + sprintf(savfile, "/vmu/%s/%s", VMUDevName[dev], vmufile); + if (vmufs_free_blocks(vmu) >= (pkg_size >> 9)) break; + } + } + if (dev == 8) { + // No VMU free, return error + free(data_out); + free(pkg_out); + return -2; + } + printf("VMU save at %s\n", savfile); + + // Check file if there's one + f = fs_open(savfile, O_RDONLY); + if (f != FILEHND_INVALID) { + blocks_freed = fs_total(f) >> 9; + fs_close(f); + } + + // Make sure there's enough free space on the VMU + if (vmufs_free_blocks(vmu) + blocks_freed < (pkg_size >> 9)) { + free(data_out); + free(pkg_out); + return -2; + } + + // Open file and write + if(!(fp = fopen(savfile, "wb"))) { + free(data_out); + free(pkg_out); + return 0; + } + if (fwrite(pkg_out, 1, pkg_size, fp) != (size_t)pkg_size) { + fclose(fp); + free(data_out); + free(pkg_out); + return 0; + } + + fclose(fp); + free(data_out); + free(pkg_out); + return 1; +} + +// Read configurations +int loadConfs(const char *filename, const char *platcfgfile) +{ + if (!loadFileDCRAM("pokemini.sav", filename)) return 0; + if (!loadFileDCRAM("pokemini.sDC", platcfgfile)) return 0; + return 1; +} + +// Write configurations +int saveConfs(int success, const char *filename, const char *platcfgfile) +{ + printf("Success is %d\n", success); + if (!success) return 0; + if (!saveFileDCRAM("pokemini.sav", filename, "Configurations", "PokeMini Common Conf.")) return 0; + if (!saveFileDCRAM("pokemini.sDC", platcfgfile, "Configurations", "PokeMini Dreamcast Conf.")) return 0; + return 1; +} + +// Read EEPROM +int loadEEPROM(const char *filename) +{ + FILE *fp; + + // Transfer VMU to RAM file + if (!loadFileDCRAM("pokemini.eep", filename)) return 0; + + // Read EEPROM from RAM file + fp = fopen(filename, "rb"); + if (!fp) return 0; + fread(EEPROM, 8192, 1, fp); + fclose(fp); + + return 1; +} + +// Write EEPROM +int saveEEPROM(const char *filename) +{ + FILE *fp; + + // Silently exit on EEPROM discard + if (!clc_vmu_eeprom) return 1; + + // Write EEPROM to RAM file + fp = fopen(filename, "wb"); + if (!fp) return 0; + fwrite(EEPROM, 8192, 1, fp); + fclose(fp); + + // Transfer RAM file to VMU + if (!saveFileDCRAM("pokemini.eep", filename, "EEPROM", "PokeMini EEPROM data")) return 0; + + return 1; +} + +// Menu loop +void menuloop() +{ + uint16_t *VIDEOOFF; + + // Stop sound + enablesound(0); + + // Create offscreen buffer + VIDEOOFF = (uint16_t *)malloc(PixPitch*192*2); + memset(VIDEOOFF, 0, PixPitch*192*2); + + // Update EEPROM + UIMenu_SaveEEPDisplay_16((uint16_t *)VIDEOOFF, PixPitch); + memcpy(VIDEO, VIDEOOFF, PixPitch*192*2); + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Delay some time + thd_sleep(16); + + // Handle keys + HandleKeys(); + + // Process UI + UIMenu_Process(); + + // Screen rendering + UIMenu_Display_16((uint16_t *)VIDEOOFF, PixPitch); + + // Copy offscreen to display + memcpy(VIDEO, VIDEOOFF, PixPitch*192*2); + } + + // Free offscreen buffer and apply configs + free(VIDEOOFF); + vid_border_color(0, 0, 0); + + // Apply configs + CommandLine.eeprom_share = 1; + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else if (CommandLine.sound) enablesound(CommandLine.sound); + PokeMini_VideoBlit(VIDEO, PixPitch); +} + +// Main function +int main(int argc, char **argv) +{ + int rumbling_old = 0; + char fpstxt[16]; + + // Setup custom EEPROM access + PokeMini_PreConfigLoad = loadConfs; + PokeMini_PostConfigSave = saveConfs; + PokeMini_CustomLoadEEPROM = loadEEPROM; + PokeMini_CustomSaveEEPROM = saveEEPROM; + + // Process no arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs("/cd/PokeMini", NULL); + CommandLineInit(); + CommandLineConfFile("/ram/PokeMini.cfg", "/ram/PokeMini.cDC", CustomConf); + CommandLine.sound = CommandLine.sound ? 1 : 0; + CommandLine.eeprom_share = 1; + JoystickSetup("Dreamcast", 0, DC_CONT_JOY_DEAD, DCJoy_KeysNames, 18, DCJoy_KeysMapping); + + // Load EEPROM to RAM + strcpy(CommandLine.eeprom_file, "/ram/PokeMini.eep"); + loadEEPROM(CommandLine.eeprom_file); + + // Allocate sound stream + emulatorsoundstate = soundstate_idle; + if (!thd_create(1, emulatorsoundthr, NULL)) { + printf("Error creating sound thread\n"); + } + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video3x3, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + + // Initialize video + VideoMode(0); + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(POKEMINI_GENSOUND, 0)) { + fprintf(stderr, "Error while initializing emulator.\n"); + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + uint64 time = 0, nexttime = 0, fpsnexttime = 0; + int fps = 72, fpscnt = 0; + strcpy(fpstxt, ""); + while (emurunning) { + // Emulate 1 frame + PokeMini_EmulateFrame(); + do { + time = timer_us_gettime64(); + } while (time < nexttime); + nexttime = time + 13888; + + // Screen rendering + if (PokeMini_Rumbling || rumbling_old) { + PokeMini_VideoRect_16(VIDEO, PixPitch, 0, -2, PixPitch, 2, 0x0000); + PokeMini_VideoRect_16(VIDEO, PixPitch, 0, 192, PixPitch, 2, 0x0000); + rumbling_old = PokeMini_Rumbling; + } + if (LCDDirty) { + if (PokeMini_Rumbling) { + PokeMini_VideoBlit(VIDEO + PokeMini_GenRumbleOffset(PixPitch), PixPitch); + } else { + PokeMini_VideoBlit(VIDEO, PixPitch); + } + LCDDirty--; + } + + // Display FPS counter + if (clc_displayfps) { + time = timer_us_gettime64(); + if (time >= fpsnexttime) { + fpsnexttime = time + 1000000; + fps = fpscnt; + fpscnt = 0; + sprintf(fpstxt, "%i FPS", fps); + } else fpscnt++; + UIDraw_String_16(VIDEO, PixPitch, 4, 4, 10, fpstxt, UI_Font1_Pal16); + } + + // Handle keys + HandleKeys(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + thd_pass(); + } + + // Stop sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Destroy sound stream + emulatorsoundstate = soundstate_end; + sem_signal(emulatorsound_sem); + while(emulatorsoundstate != soundstate_endok) thd_pass(); + + // Going back to dctool + printf("Exit!\n"); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/PokeMini_DC_sndstream.c b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/PokeMini_DC_sndstream.c new file mode 100644 index 0000000000..6e2df65180 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/PokeMini_DC_sndstream.c @@ -0,0 +1,663 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +// KOS Documentation: http://gamedev.allusion.net/docs/kos-current/ + +#include +#include +#include +#include + +#include + +#include "PokeMini.h" +#include "Hardware.h" +#include "Video_x3.h" +#include "PokeMini_BG3.h" +#include "Joystick.h" + +#include "VMUIcon.h" + +const char *AppName = "PokeMini " PokeMini_Version " Dreamcast"; + +KOS_INIT_FLAGS(INIT_DEFAULT); + +// -------- + +int emurunning = 1; +unsigned short *VIDEO; +int PixPitch, ScOffP; +snd_stream_hnd_t SoundStreamH; + +#define DC_CONT_TRG_DEAD 80 +#define DC_CONT_JOY_DEAD 40 +#define CONT_LTRIG 0x10000 +#define CONT_RTRIG 0x20000 + +int VideoMode(int pal); + +// Joystick names and mapping (NEW IN 0.5.0) +char *DCJoy_KeysNames[] = { + "Off", // -1 + "C", // 0 + "B", // 1 + "A", // 2 + "Start", // 3 + "DPad Up", // 4 + "DPad Down", // 5 + "DPad Left", // 6 + "DPad Right", // 7 + "Z", // 8 + "Y", // 9 + "X", // 10 + "D", // 11 + "DPad2 Up", // 12 + "DPad2 Down", // 13 + "DPad2 Left", // 14 + "DPad2 Right", // 15 + "L Trigger", // 16 + "R Trigger" // 17 +}; +int DCJoy_KeysMapping[] = { + 10, // Menu + 1, // A + 2, // B + 17, // C + 4, // Up + 5, // Down + 6, // Left + 7, // Right + 3, // Power + 16 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_tvout_pal = 0; +int clc_vmu_eeprom = 0; +int clc_displayfps = 0; +const TCommandLineCustom CustomConf[] = { + { "tvout_pal", &clc_tvout_pal, COMMANDLINE_BOOL }, + { "vmu_eeprom", &clc_vmu_eeprom, COMMANDLINE_BOOL }, + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "TV Out: %s", UIItems_PlatformC }, + { 0, 2, "EEPROM: %s", UIItems_PlatformC }, + { 0, 3, "Display FPS: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int videochanged = 0; + if (reason == UIMENU_OK) reason = UIMENU_RIGHT; + if (reason == UIMENU_CANCEL) UIMenu_PrevMenu(); + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // TV Out + clc_tvout_pal = !clc_tvout_pal; + videochanged = 1; + break; + case 2: // VMU EEPROM + clc_vmu_eeprom = !clc_vmu_eeprom; + break; + case 3: // Display FPS + clc_displayfps = !clc_displayfps; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // TV Out + clc_tvout_pal = !clc_tvout_pal; + videochanged = 1; + break; + case 2: // VMU EEPROM + clc_vmu_eeprom = !clc_vmu_eeprom; + break; + case 3: // Display FPS + clc_displayfps = !clc_displayfps; + break; + case 9: // Define keys + JoystickEnterMenu(); + break; + } + } + if (videochanged) VideoMode(clc_tvout_pal); + UIMenu_ChangeItem(UIItems_Platform, 1, "TV Out: %s", clc_tvout_pal ? "PAL" : "NTSC"); + UIMenu_ChangeItem(UIItems_Platform, 2, "EEPROM: %s", clc_vmu_eeprom ? "Auto write to VMU" : "Write discarded"); + UIMenu_ChangeItem(UIItems_Platform, 3, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + return 1; +} + +// Set video +int VideoMode(int pal) +{ + if (vid_check_cable() == CT_VGA) { + // VGA + vid_set_mode(DM_320x240_VGA, PM_RGB565); + } else { + // Composite or RGB + if (pal) { + vid_set_mode(DM_320x240_PAL, PM_RGB565); + } else { + vid_set_mode(DM_320x240_NTSC, PM_RGB565); + } + } + PixPitch = 320; + vid_border_color(0, 0, 0); + memset(vram_s, 0, 1024*1024*2); + VIDEO = vram_s + (24 * PixPitch) + 16; + + return 1; +} + +// Handle keys +void HandleKeys() +{ + maple_device_t *cont; + cont_state_t *state; + uint32_t keys; + + cont = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); + if (!cont) return; + state = (cont_state_t *)maple_dev_status(cont); + if (!state) return; + + JoystickAxisEvent(0, state->joyx); + JoystickAxisEvent(1, state->joyy); + + keys = (state->buttons & 0xFFFF) + | (state->ltrig > DC_CONT_TRG_DEAD ? CONT_LTRIG : 0) + | (state->rtrig > DC_CONT_TRG_DEAD ? CONT_RTRIG : 0); + JoystickBitsEvent(keys); +} + +// Emulator sound +int16_t soundsamp[SND_STREAM_BUFFER_MAX/8 + 1024]; +void *emulatorsound(snd_stream_hnd_t hnd, int smp_req, int *smp_recv) // smp_* is actually bytes? +{ + MinxAudio_GenerateEmulatedS16(soundsamp, smp_req>>1, 1); + *smp_recv = smp_req; + return soundsamp; +} + +enum { + soundstate_idle, + soundstate_start, + soundstate_playing, + soundstate_stop, + soundstate_end, + soundstate_endok, +}; +volatile int emulatorsoundstate = soundstate_idle; +static semaphore_t *emulatorsound_sem = NULL; +void *emulatorsoundthr(void *ptr) +{ + snd_stream_hnd_t SoundStreamH; + emulatorsound_sem = sem_create(0); + + snd_stream_init(); + SoundStreamH = snd_stream_alloc(NULL, SND_STREAM_BUFFER_MAX/8); + while (emulatorsoundstate != soundstate_end) { + switch(emulatorsoundstate) { + case soundstate_idle: + sem_wait(emulatorsound_sem); + break; + case soundstate_start: + snd_stream_reinit(SoundStreamH, emulatorsound); + snd_stream_start(SoundStreamH, MINX_AUDIOFREQ, 0); + snd_stream_volume(SoundStreamH, 255); + emulatorsoundstate = soundstate_playing; + break; + case soundstate_playing: + if (snd_stream_poll(SoundStreamH) < 0) { + snd_stream_stop(SoundStreamH); + snd_stream_reinit(SoundStreamH, emulatorsound); + snd_stream_start(SoundStreamH, MINX_AUDIOFREQ, 0); + snd_stream_volume(SoundStreamH, 255); + } + break; + case soundstate_stop: + if (emulatorsoundstate != soundstate_idle) snd_stream_stop(SoundStreamH); + emulatorsoundstate = soundstate_idle; + break; + } + thd_pass(); + } + snd_stream_destroy(SoundStreamH); + snd_stream_shutdown(); + emulatorsoundstate = soundstate_endok; + + return NULL; +} + +// Enable / Disable sound +void enablesound(int sound) +{ + static int lastsound = 0; + MinxAudio_ChangeEngine(sound); + if (sound && !lastsound) { + // Enabling + emulatorsoundstate = soundstate_start; + sem_signal(emulatorsound_sem); + while(emulatorsoundstate != soundstate_playing) thd_pass(); + } + if (!sound && lastsound) { + // Disabling + emulatorsoundstate = soundstate_stop; + sem_signal(emulatorsound_sem); + while(emulatorsoundstate != soundstate_idle) thd_pass(); + } + lastsound = sound; +} + +const char *VMUDevName[8] = { + "a1", "a2", + "b1", "b2", + "c1", "c2", + "d1", "d2" +}; + +// Transfer VMU file to RAM +int loadFileDCRAM(const char *vmufile, const char *ramfile) +{ + maple_device_t *vmu; + vmu_pkg_t pkg; + uint8 *pkg_out; + FILE *fp; + file_t f; + int dev, pkg_size; + char savfile[64]; + + // Search a VMU with the file + for (dev = 0; dev < 8; dev++) { + vmu = maple_enum_dev(dev >> 1, (dev & 1) + 1); + if (!vmu || !vmu->valid || !(vmu->info.functions & MAPLE_FUNC_MEMCARD)) continue; + sprintf(savfile, "/vmu/%s/%s", VMUDevName[dev], vmufile); + f = fs_open(savfile, O_RDONLY); + if (f != FILEHND_INVALID) { + fs_close(f); + break; + } + } + if (dev == 8) { + // No VMU found, return error + return 0; + } + printf("VMU load at %s\n", savfile); + + // Read package + fp = fopen(savfile, "rb"); + fseek(fp, 0, SEEK_END); + pkg_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + pkg_out = (uint8 *)malloc(pkg_size); + fread(pkg_out, pkg_size, 1, fp); + fclose(fp); + vmu_pkg_parse(pkg_out, &pkg); + + // Copy data + fp = fopen(ramfile, "wb"); + fwrite(pkg.data, pkg.data_len, 1, fp); + fclose(fp); + + free(pkg_out); + return 1; + +} + +// Transfer RAM file to VMU +int saveFileDCRAM(const char *vmufile, const char *ramfile, const char *desc_short, const char *desc_long) +{ + maple_device_t *vmu; + vmu_pkg_t pkg; + uint8 *pkg_out, *data_out; + FILE *fp; + file_t f; + int dev, pkg_size, blocks_freed = 0; + int data_len; + char savfile[64]; + + // Read RAM file + fp = fopen(ramfile, "rb"); + if (!fp) { + printf("RAM file %s not found!\n", ramfile); + return 0; + } + fseek(fp, 0, SEEK_END); + data_len = ftell(fp); + fseek(fp, 0, SEEK_SET); + data_out = (uint8 *)malloc(data_len); + fread(data_out, data_len, 1, fp); + fclose(fp); + + // Setup package + strcpy(pkg.desc_long, desc_long); + strcpy(pkg.desc_short, desc_short); + strcpy(pkg.app_id, "PokeMini"); + pkg.icon_cnt = 1; + pkg.icon_anim_speed = 0; + memcpy(pkg.icon_pal, vmuicon_pal, 32); + pkg.icon_data = vmuicon_img; + pkg.eyecatch_type = VMUPKG_EC_NONE; + pkg.data_len = data_len; + pkg.data = data_out; + vmu_pkg_build(&pkg, &pkg_out, &pkg_size); + + // Detect a suitable VMU + // Search a VMU with the file + for (dev = 0; dev < 8; dev++) { + vmu = maple_enum_dev(dev >> 1, (dev & 1) + 1); + if (!vmu || !vmu->valid || !(vmu->info.functions & MAPLE_FUNC_MEMCARD)) continue; + sprintf(savfile, "/vmu/%s/%s", VMUDevName[dev], vmufile); + f = fs_open(savfile, O_RDONLY); + if (f != FILEHND_INVALID) { + fs_close(f); + break; + } + } + if (dev == 8) { + // No file found, try to find a VMU with enough free space + for (dev = 0; dev < 8; dev++) { + vmu = maple_enum_dev(dev >> 1, (dev & 1) + 1); + if (!vmu || !vmu->valid || !(vmu->info.functions & MAPLE_FUNC_MEMCARD)) continue; + sprintf(savfile, "/vmu/%s/%s", VMUDevName[dev], vmufile); + if (vmufs_free_blocks(vmu) >= (pkg_size >> 9)) break; + } + } + if (dev == 8) { + // No VMU free, return error + free(data_out); + free(pkg_out); + return -2; + } + printf("VMU save at %s\n", savfile); + + // Check file if there's one + f = fs_open(savfile, O_RDONLY); + if (f != FILEHND_INVALID) { + blocks_freed = fs_total(f) >> 9; + fs_close(f); + } + + // Make sure there's enough free space on the VMU + if (vmufs_free_blocks(vmu) + blocks_freed < (pkg_size >> 9)) { + free(data_out); + free(pkg_out); + return -2; + } + + // Open file and write + if(!(fp = fopen(savfile, "wb"))) { + free(data_out); + free(pkg_out); + return 0; + } + if (fwrite(pkg_out, 1, pkg_size, fp) != (size_t)pkg_size) { + fclose(fp); + free(data_out); + free(pkg_out); + return 0; + } + + fclose(fp); + free(data_out); + free(pkg_out); + return 1; +} + +// Read configurations +int loadConfs(const char *filename, const char *platcfgfile) +{ + if (!loadFileDCRAM("pokemini.sav", filename)) return 0; + if (!loadFileDCRAM("pokemini.sDC", platcfgfile)) return 0; + return 1; +} + +// Write configurations +int saveConfs(int success, const char *filename, const char *platcfgfile) +{ + printf("Success is %d\n", success); + if (!success) return 0; + if (!saveFileDCRAM("pokemini.sav", filename, "Configurations", "PokeMini Common Conf.")) return 0; + if (!saveFileDCRAM("pokemini.sDC", platcfgfile, "Configurations", "PokeMini Dreamcast Conf.")) return 0; + return 1; +} + +// Read EEPROM +int loadEEPROM(const char *filename) +{ + FILE *fp; + + // Transfer VMU to RAM file + if (!loadFileDCRAM("pokemini.eep", filename)) return 0; + + // Read EEPROM from RAM file + fp = fopen(filename, "rb"); + if (!fp) return 0; + fread(EEPROM, 8192, 1, fp); + fclose(fp); + + return 1; +} + +// Write EEPROM +int saveEEPROM(const char *filename) +{ + FILE *fp; + + // Silently exit on EEPROM discard + if (!clc_vmu_eeprom) return 1; + + // Write EEPROM to RAM file + fp = fopen(filename, "wb"); + if (!fp) return 0; + fwrite(EEPROM, 8192, 1, fp); + fclose(fp); + + // Transfer RAM file to VMU + if (!saveFileDCRAM("pokemini.eep", filename, "EEPROM", "PokeMini EEPROM data")) return 0; + + return 1; +} + +// Menu loop +void menuloop() +{ + uint16_t *VIDEOOFF; + + // Stop sound + enablesound(0); + + // Create offscreen buffer + VIDEOOFF = (uint16_t *)malloc(PixPitch*192*2); + memset(VIDEOOFF, 0, PixPitch*192*2); + + // Update EEPROM + UIMenu_SaveEEPDisplay_16((uint16_t *)VIDEOOFF, PixPitch); + memcpy(VIDEO, VIDEOOFF, PixPitch*192*2); + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Delay some time + thd_sleep(16); + + // Handle keys + HandleKeys(); + + // Process UI + UIMenu_Process(); + + // Screen rendering + UIMenu_Display_16((uint16_t *)VIDEOOFF, PixPitch); + + // Copy offscreen to display + memcpy(VIDEO, VIDEOOFF, PixPitch*192*2); + } + + // Free offscreen buffer and apply configs + free(VIDEOOFF); + vid_border_color(0, 0, 0); + + // Apply configs + CommandLine.eeprom_share = 1; + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else if (CommandLine.sound) enablesound(CommandLine.sound); + PokeMini_VideoBlit(VIDEO, PixPitch); +} + +// Main function +int main(int argc, char **argv) +{ + int rumbling_old = 0; + char fpstxt[16]; + + // Setup custom EEPROM access + PokeMini_PreConfigLoad = loadConfs; + PokeMini_PostConfigSave = saveConfs; + PokeMini_CustomLoadEEPROM = loadEEPROM; + PokeMini_CustomSaveEEPROM = saveEEPROM; + + // Process no arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs("/cd/PokeMini", NULL); + CommandLineInit(); + CommandLineConfFile("/ram/PokeMini.cfg", "/ram/PokeMini.cDC", CustomConf); + CommandLine.sound = CommandLine.sound ? 1 : 0; + CommandLine.eeprom_share = 1; + JoystickSetup("Dreamcast", 0, DC_CONT_JOY_DEAD, DCJoy_KeysNames, 18, DCJoy_KeysMapping); + + // Load EEPROM to RAM + strcpy(CommandLine.eeprom_file, "/ram/PokeMini.eep"); + loadEEPROM(CommandLine.eeprom_file); + + // Allocate sound stream + emulatorsoundstate = soundstate_idle; + if (!thd_create(1, emulatorsoundthr, NULL)) { + printf("Error creating sound thread\n"); + } + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video3x3, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + + // Initialize video + VideoMode(0); + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(POKEMINI_GENSOUND, 0)) { + fprintf(stderr, "Error while initializing emulator.\n"); + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + uint64 time = 0, nexttime = 0, fpsnexttime = 0; + int fps = 72, fpscnt = 0; + strcpy(fpstxt, ""); + while (emurunning) { + // Emulate 1 frame + PokeMini_EmulateFrame(); + do { + time = timer_us_gettime64(); + } while (time < nexttime); + nexttime = time + 13888; + + // Screen rendering + if (PokeMini_Rumbling || rumbling_old) { + PokeMini_VideoRect_16(VIDEO, PixPitch, 0, -2, PixPitch, 2, 0x0000); + PokeMini_VideoRect_16(VIDEO, PixPitch, 0, 192, PixPitch, 2, 0x0000); + rumbling_old = PokeMini_Rumbling; + } + if (LCDDirty) { + if (PokeMini_Rumbling) { + PokeMini_VideoBlit(VIDEO + PokeMini_GenRumbleOffset(PixPitch), PixPitch); + } else { + PokeMini_VideoBlit(VIDEO, PixPitch); + } + LCDDirty--; + } + + // Display FPS counter + if (clc_displayfps) { + time = timer_us_gettime64(); + if (time >= fpsnexttime) { + fpsnexttime = time + 1000000; + fps = fpscnt; + fpscnt = 0; + sprintf(fpstxt, "%i FPS", fps); + } else fpscnt++; + UIDraw_String_16(VIDEO, PixPitch, 4, 4, 10, fpstxt, UI_Font1_Pal16); + } + + // Handle keys + HandleKeys(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + thd_pass(); + } + + // Stop sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Destroy sound stream + emulatorsoundstate = soundstate_end; + sem_signal(emulatorsound_sem); + while(emulatorsoundstate != soundstate_endok) thd_pass(); + + // Going back to dctool + printf("Exit!\n"); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/VMUIcon.h b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/VMUIcon.h new file mode 100644 index 0000000000..1fee8f25a0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/VMUIcon.h @@ -0,0 +1,63 @@ +/* + PokeMini - Pokémon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef VMUICON_H +#define VMUICON_H + +static const uint16 vmuicon_pal[32] = { + 0xFFFF,0xF888,0xF000,0xF006,0xF00A,0xF00F,0xF03C,0xF444, + 0xF694,0xF999,0xFAAA,0xF9C6,0xFCCC,0xFDDD,0xFFF0,0xFCFF +}; + +static const uint8 vmuicon_img[512] = { + 0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xAA,0xDD,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0A,0x00,0x65,0x54,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0x0D,0xDD,0x65,0x44,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0x99,0xDD,0x22,0x65,0x44,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0x00,0x99,0x12,0x22,0x65,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0xCC,0xCC,0x99,0x22,0x22,0x65,0x55,0x40,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0xCC,0xAC,0xCC,0x99,0xDD,0xD6,0x53,0x40,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0xC2,0x22,0xAC,0xCC,0x99,0xDD,0x33,0x33,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0x22,0x22,0x22,0xCA,0xCC,0x9D,0x33,0x33,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xA0,0x22,0x88,0x22,0x22,0xAC,0xC9,0xA3,0x33,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xAC,0x22,0x8B,0x88,0x22,0x2C,0xC9,0xA3,0x33,0x31,0x10,0x00,0x00,0x00, + 0x00,0x0A,0x0C,0x22,0x8B,0xBB,0x88,0x22,0xA9,0xA3,0x34,0x31,0x11,0x10,0x00,0x00, + 0x00,0x0A,0x0C,0x22,0x8B,0x8B,0xBB,0x22,0xC9,0xA3,0x34,0x31,0x11,0x11,0x00,0x00, + 0x00,0x0A,0x0C,0xC2,0x8B,0xB8,0xBB,0x22,0xC9,0xA3,0x34,0x31,0x11,0x11,0x10,0x00, + 0x00,0x0A,0x0C,0xC2,0xD2,0xBB,0xBB,0x22,0xC9,0xA3,0x44,0x31,0x11,0x11,0x10,0x00, + 0x00,0xA0,0xFF,0xFF,0x2D,0xDB,0xBB,0x2C,0x9A,0xA4,0x43,0x11,0x11,0x11,0x10,0x00, + 0x00,0xAF,0x22,0x22,0xFC,0x2E,0xE2,0x1C,0x97,0xA4,0x43,0x11,0x11,0x11,0x10,0x00, + 0x00,0xAF,0x22,0x22,0x2F,0xFF,0x21,0xFC,0x9A,0x7F,0xF3,0x11,0x11,0x11,0x10,0x00, + 0x00,0xAF,0x22,0xF2,0x2F,0x22,0xFF,0x2F,0xF9,0xF2,0x2F,0x11,0x11,0x11,0x10,0x00, + 0x00,0xAF,0x22,0x22,0x22,0xFF,0x2F,0x2F,0x2F,0x2F,0xF2,0xF1,0x11,0x11,0x00,0x00, + 0x00,0xAF,0x22,0x22,0xF2,0xFF,0x2F,0x22,0xFF,0x22,0x22,0xF1,0x11,0x11,0x00,0x00, + 0x00,0x0F,0x22,0xFF,0xF2,0xFF,0x2F,0x2F,0x2F,0x2F,0xFF,0x11,0x11,0x10,0x00,0x00, + 0x00,0x0F,0x22,0xFC,0x1F,0x22,0xFF,0x2F,0xF2,0xF2,0x22,0xF1,0x11,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x9C,0xFF,0xF1,0xFF,0xAF,0xAF,0xFF,0x11,0x10,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x22,0xF9,0xF2,0x2F,0xCF,0xA9,0xF4,0x3F,0x11,0xF0,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x22,0x2F,0x22,0x2F,0xF2,0xFF,0x2F,0xF2,0xFF,0x2F,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x22,0xF2,0xF2,0x2F,0x2F,0xAF,0x22,0xF2,0xF2,0xF0,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x22,0xFF,0xF2,0x2F,0xF2,0xFF,0x2F,0x22,0xFF,0x2F,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x22,0xF2,0xF2,0x2F,0xF2,0xFF,0x2F,0xF2,0xFF,0x2F,0x00,0x00,0x00, + 0x00,0x00,0x0F,0x22,0xF2,0xF2,0x2F,0xF2,0xFF,0x2F,0xF2,0xFF,0x2F,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x22,0x2F,0xF2,0x9F,0x99,0xF2,0x2F,0x22,0xF0,0x00,0x00,0x00 +}; + +#endif + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/makefile new file mode 100644 index 0000000000..131c6f5a40 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/dreamcast/makefile @@ -0,0 +1,113 @@ +# PokeMini Makefile for Dreamcast + +CC = kos-cc +LD = kos-cc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini.elf +LIBS = + +INCDIRS = source resource freebios sourcex dependencies/minizip dependencies/zlib + +OBJS = \ + PokeMini_DC.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x3.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + dependencies/zlib/adler32.o \ + dependencies/zlib/crc32.o \ + dependencies/zlib/inffast.o \ + dependencies/zlib/inflate.o \ + dependencies/zlib/inftrees.o \ + dependencies/zlib/zutil.o \ + sourcex/Zip64comp.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG3.o + +DEPENDS = \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x3.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + dependencies/zlib/zlib.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG3.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean scramble run + +all: $(BUILD) $(TARGET) + +include $(KOS_BASE)/Makefile.rules + +KOS_LOCAL_CFLAGS = -O -Wall $(INCLUDE) -I. -I $(KOS_BASE)/kernel/arch/dreamcast/sound -DFS_DC -DPERFORMANCE +KOS_LOCAL_LDFLAGS = -O $(LIBS) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(KOS_LOCAL_CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(CC) -o $(TARGET) $(BUILDOBJS) $(KOS_LOCAL_LDFLAGS) $(KOS_LIBS) + $(KOS_STRIP) $(TARGET) + +scramble: $(TARGET) + $(KOS_OBJCOPY) -R .stack -O binary $(TARGET) $(TARGET).bin + scramble $(TARGET).bin 1ST_READ.BIN + +run: $(TARGET) + $(KOS_LOADER) $< + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(TARGET).bin 1ST_READ.BIN + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/gamecube/PokeMini_GC.c b/PVPokeMini/PokeMini/pokemini-code/platform/gamecube/PokeMini_GC.c new file mode 100644 index 0000000000..9a6abbd991 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/gamecube/PokeMini_GC.c @@ -0,0 +1,567 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include +//#include +#include + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" + +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" +#include "PokeMini_BG2.h" +#include "PokeMini_BG3.h" +#include "PokeMini_BG4.h" +#include "PokeMini_BG5.h" +#include "PokeMini_BG6.h" + +const char *AppName = "PokeMini " PokeMini_Version " GameCube"; + +#define DEFAULT_FIFO_SIZE (256*1024) +#define STACKSIZE (8192) + +int emurunning = 1; +int PMWidth, PMHeight; +int PixPitch; + +GXRModeObj *rmode; +static void *xfb = NULL; +GXTexObj vbuf_tex; +u16 *vbuf = NULL; +u16 *vbuftiled = NULL; +int vbuf_w, vbuf_h, vbuf_t; +float vbuf_fnw, vbuf_fnh; + +static lwp_t h_snd = LWP_THREAD_NULL; +static u8 h_snd_stack[STACKSIZE]; +static s16 *h_snd_buffer[2] = {NULL, NULL}; +static int h_snd_ptr = 0; +static int h_snd_mode = 0; + +void setup_screen(); + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) + +const char *clc_zoom_txt[] = { + "0x (Illegal)", + "1x ( 96x 64)", + "2x (192x128)", + "3x (288x192)", + "4x (384x256)", + "5x (480x320)", + "6x (576x384)", +}; + +// Joystick names and mapping (NEW IN 0.5.0) +char *GC_KeysNames[] = { + "Off", // -1 + "DPad Left", // 0 + "DPad Right", // 1 + "DPad Down", // 2 + "DPad Up", // 3 + "Trigger Z", // 4 + "Trigger R", // 5 + "Trigger L", // 6 + NULL, // 7 + "Button A", // 8 + "Button B", // 9 + "Button X", // 10 + "Button Y", // 11 + "Start", // 12 +}; +int GC_KeysMapping[] = { + 11, // Menu + 8, // A + 9, // B + 5, // C + 3, // Up + 2, // Down + 0, // Left + 1, // Right + 12, // Power + 6 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_zoom = 4; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 2, 6 }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Zoom: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int zoomchanged = 0; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // Zoom + clc_zoom--; + if (clc_zoom < 2) clc_zoom = 6; + zoomchanged = 1; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // Zoom + clc_zoom++; + if (clc_zoom > 6) clc_zoom = 2; + zoomchanged = 1; + break; + case 9: // Define keys... + JoystickEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Zoom: %s", clc_zoom_txt[clc_zoom]); + if (zoomchanged) { + setup_screen(); + return 0; + } + return 1; +} + +// A helper to calculate the power of 2 needed by the texture +static inline int getpow2siz16(int n) +{ + n--; + n |= n >> 8; + n |= n >> 4; + n |= n >> 2; + n |= n >> 1; + return n + 1; +} + +// Setup screen +void setup_screen() +{ + TPokeMini_VideoSpec *videospec; + int depth; + + // Calculate size based of zoom + if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 192; PMHeight = 128; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 288; PMHeight = 192; + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 384; PMHeight = 256; + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 480; PMHeight = 320; + UIMenu_SetDisplay(480, 320, PokeMini_BGR16, (uint8_t *)PokeMini_BG5, (uint16_t *)PokeMini_BG5_PalBGR16, (uint32_t *)PokeMini_BG5_PalBGR32); + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 576; PMHeight = 384; + UIMenu_SetDisplay(576, 384, PokeMini_BGR16, (uint8_t *)PokeMini_BG6, (uint16_t *)PokeMini_BG6_PalBGR16, (uint32_t *)PokeMini_BG6_PalBGR32); + } + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, 16, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + fprintf(stderr, "Couldn't set video spec from 16 bpp\n"); + exit(1); + } + + // Set video mode + vbuf_w = getpow2siz16(PMWidth); + vbuf_fnw = (float)PMWidth / (float)vbuf_w; + vbuf_h = getpow2siz16(PMHeight); + vbuf_fnh = (float)PMHeight / (float)vbuf_h; + vbuf_t = vbuf_w * vbuf_h; + GX_InvVtxCache(); + GX_InvalidateTexAll(); + if (vbuf) { + free(vbuf); + vbuf = NULL; + } + vbuf = MEM_K0_TO_K1(memalign(32, vbuf_t * 2)); + if (vbuftiled) { + free(vbuftiled); + vbuftiled = NULL; + } + vbuftiled = MEM_K0_TO_K1(memalign(32, vbuf_t * 2)); + GX_InitTexObj(&vbuf_tex, vbuftiled, vbuf_w, vbuf_h, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, 0); + + // Calculate pitch and offset + PixPitch = vbuf_w; +} + +// Render graphics +void rendergraphics(int offset, int waitvsync) +{ + int x, y, phy, vbuf_wZ; + u16 *vbt, *vb = vbuf; + static float ffoffsetT[8] = { + -0.04f, -0.03f, -0.02f, -0.01f, + 0.00f, 0.01f, 0.02f, 0.03f, + }; + float ffoffset = ffoffsetT[offset+4]; + float varea = 0.85f; + + vbuf_wZ = vbuf_w >> 2; + for (y=0; y> 2) * vbuf_wZ) << 4) | ((y & 3) << 2); + for (x=0; xviTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); + + // Setup the fifo and then init the flipper + void *gp_fifo = NULL; + gp_fifo = MEM_K0_TO_K1(memalign(32, DEFAULT_FIFO_SIZE)); + memset(gp_fifo, 0, DEFAULT_FIFO_SIZE); + GX_Init(gp_fifo, DEFAULT_FIFO_SIZE); + + // Clears the bg to color and clears the z buffer + GXColor background = {0, 0, 0, 0xff}; + GX_SetCopyClear(background, 0x00ffffff); + + // Other GX setup + GX_SetViewport(0, 0, rmode->fbWidth,rmode->efbHeight, 0, 1); + yscale = GX_GetYScaleFactor(rmode->efbHeight, rmode->xfbHeight); + xfbHeight = GX_SetDispCopyYScale(yscale); + GX_SetScissor(0, 0, rmode->fbWidth, rmode->efbHeight); + GX_SetDispCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); + GX_SetDispCopyDst(rmode->fbWidth, xfbHeight); + GX_SetCopyFilter(rmode->aa, rmode->sample_pattern, GX_TRUE, rmode->vfilter); + GX_SetFieldMode(rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); + if (rmode->aa) + GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); + else + GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); + GX_SetCullMode(GX_CULL_NONE); + GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GX_SetColorUpdate(GX_TRUE); + GX_CopyDisp(xfb, GX_TRUE); + GX_SetDispCopyGamma(GX_GM_1_0); + + // setup the vertex descriptor and attribute table + GX_ClearVtxDesc(); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + + // Setup the TEV combiner operation + GX_SetNumTexGens(1); + GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GX_SetTevOp(GX_TEVSTAGE0, GX_DECAL); + GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); + + // setup our projection matrix + guOrtho(projection, -1.0f, 1.0f, -1.0f, 1.0f, 0, 10.0f); + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + + // Initialize dvd + DVD_Init(); + DVD_Mount(); + if (__io_gcdvd.isInserted()) ISO9660_Mount("dvd", &__io_gcdvd); + + // Initialize fat lib + if (!fatInitDefault()) { + printf("fatInitDefault failure: terminating\n"); + //exit(0); + + // Does this even work!? + } + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs("/PokeMini", NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", "pokemini_gc.cfg", CustomConf); + JoystickSetup("GC", 0, 30000, GC_KeysNames, 13, GC_KeysMapping); + + // Initialize the display + setup_screen(); + + // Initialize the sound + h_snd_buffer[0] = (s16 *)memalign(32, SOUNDBUFFER); + memset(h_snd_buffer[0], 0, SOUNDBUFFER); + h_snd_buffer[1] = (s16 *)memalign(32, SOUNDBUFFER); + memset(h_snd_buffer[1], 0, SOUNDBUFFER); + if (LWP_CreateThread(&h_snd, (void *)snd_thread, NULL, h_snd_stack, STACKSIZE, 80) == -1) { + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSNDBUFFER)) { + fprintf(stderr, "Error while initializing emulator\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickSync = 0; + while (emurunning) { + // Emulate and syncronize + time = gettickscount(); + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) usleep(1000); + } else { + PokeMini_EmulateFrame(); + do { + usleep(1000); + time = gettickscount(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + + // Screen rendering + PokeMini_VideoBlit(vbuf, PixPitch); + if (PokeMini_Rumbling) { + rendergraphics(PokeMini_GenRumbleOffset(1), 0); + } else { + rendergraphics(0, 0); + } + LCDDirty = 0; + + // Handle inputs + HandleInputs(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // calculate FPS + // TODO + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Wait for thread to finish + if(h_snd != LWP_THREAD_NULL) + { + LWP_JoinThread(h_snd, NULL); + h_snd = LWP_THREAD_NULL; + } + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Free up memory + if (vbuf) free(vbuf); + if (vbuftiled) free(vbuftiled); + if (h_snd_buffer[0]) free(h_snd_buffer[0]); + if (h_snd_buffer[1]) free(h_snd_buffer[1]); + + exit(0); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/gamecube/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/gamecube/makefile new file mode 100644 index 0000000000..c9292f4fc6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/gamecube/makefile @@ -0,0 +1,183 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/gamecube_rules + +POKEROOT = ../../ + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := PokeMini +BUILD := build +SOURCES := $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios $(POKEROOT)sourcex $(POKEROOT)dependencies/zlib $(POKEROOT)dependencies/minizip . +DATA := +INCLUDES := $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios $(POKEROOT)sourcex $(POKEROOT)dependencies/zlib $(POKEROOT)dependencies/minizip +NITRODATA := nitrofiles + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lfat -lasnd -logc -lm +# -liso9660 + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +ifneq ($(strip $(NITRODATA)),) + export NITRO_FILES := $(CURDIR)/$(NITRODATA) +endif + +# Only include what's really needed +CFILES := PokeMini_GC.c \ + freebios/freebios.c \ + source/PMCommon.c \ + source/PokeMini.c \ + source/Multicart.c \ + source/Hardware.c \ + source/Video.c \ + source/Video_x1.c \ + source/Video_x2.c \ + source/Video_x3.c \ + source/Video_x4.c \ + source/Video_x5.c \ + source/Video_x6.c \ + source/CommandLine.c \ + source/MinxCPU.c \ + source/MinxCPU_XX.c \ + source/MinxCPU_CE.c \ + source/MinxCPU_CF.c \ + source/MinxCPU_SP.c \ + source/MinxTimers.c \ + source/MinxIO.c \ + source/MinxIRQ.c \ + source/MinxPRC.c \ + source/MinxColorPRC.c \ + source/MinxLCD.c \ + source/MinxAudio.c \ + source/UI.c \ + source/Joystick.c \ + dependencies/minizip/unzip.c \ + dependencies/minizip/ioapi.c \ + dependencies/zlib/adler32.o \ + dependencies/zlib/crc32.o \ + dependencies/zlib/inffast.o \ + dependencies/zlib/inflate.o \ + dependencies/zlib/inftrees.o \ + dependencies/zlib/zutil.o \ + sourcex/Zip64comp.c \ + resource/PokeMini_ColorPal.c \ + resource/PokeMini_Font12.c \ + resource/PokeMini_Icons12.c \ + resource/PokeMini_BG2.c \ + resource/PokeMini_BG3.c \ + resource/PokeMini_BG4.c \ + resource/PokeMini_BG5.c \ + resource/PokeMini_BG6.c + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(notdir $(CFILES)) +# CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + $(DEVKITPRO)/emulators/gcube/gcube $(OUTPUT).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/microsdl/PokeMini_uSDL.c b/PVPokeMini/PokeMini/pokemini-code/platform/microsdl/PokeMini_uSDL.c new file mode 100644 index 0000000000..f7c1ea4da5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/microsdl/PokeMini_uSDL.c @@ -0,0 +1,259 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "Keyboard.h" +#include "KeybMapSDL.h" + +#include "Video_x4.h" +#include "PokeMini_BG4.h" + +const char *AppName = "PokeMini " PokeMini_Version " uSDL"; + +int emurunning = 1; +SDL_Surface *screen; +int PixPitch; + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSOUNDBUFF (SOUNDBUFFER*2) + +// Platform menu (REQUIRED >= 0.4.4) +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformDefC) +}; + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_KEYDOWN: + KeyboardPressEvent(event->key.keysym.sym); + break; + case SDL_KEYUP: + KeyboardReleaseEvent(event->key.keysym.sym); + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesU8(stream, len); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + + // Update window's title and stop sound + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(16); + + // Process UI + UIMenu_Process(); + + // Screen rendering + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + UIMenu_Display_16((uint16_t *)screen->pixels, PixPitch); + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while(SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); + SDL_EnableKeyRepeat(0, 0); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Event event; + static int rumbleani = 0; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", NULL, NULL); + if (!CommandLineArgs(argc, argv, NULL)) { + PrintHelpUsage(stdout); + return 1; + } + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); // Clean up on exit + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video4x4, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + + // Initialize the display + screen = SDL_SetVideoMode(96*4, 64*4, 16, SDL_HWSURFACE | SDL_DOUBLEBUF); + if (screen == NULL) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + PixPitch = screen->pitch / 2; + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_U8; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Set the window manager title bar + SDL_WM_SetCaption(AppName, "PMEWindow"); + SDL_EnableKeyRepeat(0, 0); + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSOUNDBUFF)) { + fprintf(stderr, "Error while initializing emulator.\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound and init UI + printf("Running emulator...\n"); + UIMenu_Init(); + KeyboardRemap(&KeybMapSDL); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickSync = 0; + while (emurunning) { + // Emulate and syncronize + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + time = SDL_GetTicks(); + PokeMini_EmulateFrame(); + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + + // Screen rendering + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + PokeMini_VideoBlit(screen->pixels, PixPitch); + + // When rumbling, show rumble text + if (PokeMini_RumblingLatch) { + rumbleani++; + UIDraw_String_16((uint16_t *)screen->pixels, PixPitch, 96*4-96, 64*4-24 + ((rumbleani>>2) & 1), 12, "Rubling", ((rumbleani>>2) & 1) ? UI_Font1_Pal16 : UI_Font2_Pal16); + PokeMini_RumblingLatch = 0; + } + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/microsdl/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/microsdl/makefile new file mode 100644 index 0000000000..15037fedd5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/microsdl/makefile @@ -0,0 +1,106 @@ +# PokeMini Makefile for SDL + +CC = gcc +LD = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl-config --cflags` $(INCLUDE) -DNO_ZIP +SLFLAGS = -O `$(SDL_BASE)sdl-config --libs` -lm + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_uSDL.o \ + sourcex/KeybMapSDL.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x4.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG4.o + +DEPENDS = \ + sourcex/KeybMapSDL.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x4.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG4.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/minisdl/PokeMini_mSDL.c b/PVPokeMini/PokeMini/pokemini-code/platform/minisdl/PokeMini_mSDL.c new file mode 100644 index 0000000000..3703b489ab --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/minisdl/PokeMini_mSDL.c @@ -0,0 +1,291 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" +#include "Keyboard.h" +#include "KeybMapSDL.h" + +#include "Video_x4.h" +#include "PokeMini_BG4.h" + +const char *AppName = "PokeMini " PokeMini_Version " mSDL"; + +int emurunning = 1; +SDL_Surface *screen; +int PixPitch, ScOffP; + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSOUNDBUFF (SOUNDBUFFER*2) + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Define Joystick...", UIItems_PlatformC }, + { 0, 2, "Define Keyboard...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + if (reason == UIMENU_OK) { + if (index == 1) JoystickEnterMenu(); + else if (index == 2) KeyboardEnterMenu(); + } + if (reason == UIMENU_CANCEL) { + UIItems_PlatformDefC(0, UIMENU_CANCEL); + } + return 1; +} + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_KEYDOWN: + KeyboardPressEvent(event->key.keysym.sym); + break; + case SDL_KEYUP: + KeyboardReleaseEvent(event->key.keysym.sym); + break; + case SDL_JOYBUTTONDOWN: + JoystickButtonsEvent(event->jbutton.button, 1); + break; + case SDL_JOYBUTTONUP: + JoystickButtonsEvent(event->jbutton.button, 0); + break; + case SDL_JOYAXISMOTION: + JoystickAxisEvent(event->jaxis.axis & 1, event->jaxis.value); + break; + case SDL_JOYHATMOTION: + JoystickHatsEvent(event->jhat.value); + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesU8(stream, len); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + + // Update window's title and stop sound + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(16); + + // Process UI + UIMenu_Process(); + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + UIMenu_Display_16((uint16_t *)screen->pixels + ScOffP, PixPitch); + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); + SDL_EnableKeyRepeat(0, 0); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Joystick *joy; + SDL_Event event; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", NULL, NULL); + if (!CommandLineArgs(argc, argv, NULL)) { + PrintHelpUsage(stdout); + return 1; + } + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + joy = SDL_JoystickOpen(CommandLine.joyid); // Open joystick + atexit(SDL_Quit); // Clean up on exit + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video4x4, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + + // Initialize the display + screen = SDL_SetVideoMode(400, 272, 16, SDL_HWSURFACE | SDL_DOUBLEBUF); + if (screen == NULL) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + PixPitch = screen->pitch / 2; + ScOffP = (8 * PixPitch) + 8; + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_U8; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Set the window manager title bar + SDL_WM_SetCaption(AppName, "PMEWindow"); + SDL_EnableKeyRepeat(0, 0); + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSOUNDBUFF)) { + fprintf(stderr, "Error while initializing emulator.\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + KeyboardRemap(&KeybMapSDL); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickSync = 0; + while (emurunning) { + // Emulate and syncronize + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + time = SDL_GetTicks(); + PokeMini_EmulateFrame(); + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((uint16_t *)screen->pixels + ScOffP + PokeMini_GenRumbleOffset(PixPitch), PixPitch); + } else { + PokeMini_VideoBlit((uint16_t *)screen->pixels + ScOffP, PixPitch); + } + LCDDirty = 0; + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Close joystick + if (joy) SDL_JoystickClose(joy); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/minisdl/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/minisdl/makefile new file mode 100644 index 0000000000..749b338a5c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/minisdl/makefile @@ -0,0 +1,110 @@ +# PokeMini Makefile for SDL (Mini) + +CC = gcc +LD = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl-config --cflags` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_mSDL.o \ + sourcex/KeybMapSDL.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x4.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG4.o + +DEPENDS = \ + sourcex/KeybMapSDL.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x4.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG4.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/3in1.c b/PVPokeMini/PokeMini/pokemini-code/platform/nds/3in1.c new file mode 100644 index 0000000000..ec58bde7bf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/nds/3in1.c @@ -0,0 +1,103 @@ +#include + +//Partial code from dsCard.cpp: http://www.ezflash.cn/zip/512triplecardsrc.rar +//Original author: aladdin +//Copyright: EZFlash Group + +//Original header below + +/************************************************************************************************************** + * 此文件为 dsCard.cpp 文件的第二版 + * 日期:2006年11月27日11点33分 第一版 version 1.0 + * 作者:aladdin + * CopyRight : EZFlash Group + * + **************************************************************************************************************/ + + +#define FlashBase 0x08000000 +void OpenNorWrite() +{ + *(vuint16 *)0x9fe0000 = 0xd200; + *(vuint16 *)0x8000000 = 0x1500; + *(vuint16 *)0x8020000 = 0xd200; + *(vuint16 *)0x8040000 = 0x1500; + *(vuint16 *)0x9C40000 = 0x1500; + *(vuint16 *)0x9fc0000 = 0x1500; +} + + +void CloseNorWrite() +{ + *(vuint16 *)0x9fe0000 = 0xd200; + *(vuint16 *)0x8000000 = 0x1500; + *(vuint16 *)0x8020000 = 0xd200; + *(vuint16 *)0x8040000 = 0x1500; + *(vuint16 *)0x9C40000 = 0xd200; + *(vuint16 *)0x9fc0000 = 0x1500; +} +uint32 ReadNorFlashID() +{ + vuint16 id1,id2,id3,id4; + uint32 ID = 0; + //check intel 512M 3in1 card + *((vuint16 *)(FlashBase+0)) = 0xFF ; + *((vuint16 *)(FlashBase+0x1000*2)) = 0xFF ; + *((vuint16 *)(FlashBase+0)) = 0x90 ; + *((vuint16 *)(FlashBase+0x1000*2)) = 0x90 ; + id1 = *((vuint16 *)(FlashBase+0)) ; + id2 = *((vuint16 *)(FlashBase+0x1000*2)) ; + id3 = *((vuint16 *)(FlashBase+1*2)) ; + id4 = *((vuint16 *)(FlashBase+0x1001*2)) ; + if(id3==0x8810) + id3=0x8816; + if(id4==0x8810) + id4=0x8816; + //_consolePrintf("id1=%x\,id2=%x,id3=%x,id4=%xn",id1,id2,id3,id4); + if( (id1==0x89)&& (id2==0x89) &&(id3==0x8816) && (id4==0x8816)) + { + ID = 0x89168916; + return ID; + } + //256M + *((vuint16 *)(FlashBase+0x555*2)) = 0xAA ; + *((vuint16 *)(FlashBase+0x2AA*2)) = 0x55 ; + *((vuint16 *)(FlashBase+0x555*2)) = 0x90 ; + + *((vuint16 *)(FlashBase+0x1555*2)) = 0xAA ; + *((vuint16 *)(FlashBase+0x12AA*2)) = 0x55 ; + *((vuint16 *)(FlashBase+0x1555*2)) = 0x90 ; + + id1 = *((vuint16 *)(FlashBase+0x2)) ; + id2 = *((vuint16 *)(FlashBase+0x2002)) ; + if( (id1!=0x227E)|| (id2!=0x227E)) + return 0; + + id1 = *((vuint16 *)(FlashBase+0xE*2)) ; + id2 = *((vuint16 *)(FlashBase+0x100e*2)) ; + if(id1==0x2218 && id2==0x2218) //H6H6 + { + ID = 0x227E2218; + return 0x227E2218; + } + + if(id1==0x2202 && id2==0x2202) //VZ064 + { + ID = 0x227E2202; + return 0x227E2202; + } + if(id1==0x2202 && id2==0x2220) //VZ064 + { + ID = 0x227E2202; + return 0x227E2202; + } + if(id1==0x2202 && id2==0x2215) //VZ064 + { + ID = 0x227E2202; + return 0x227E2202; + } + + + return 0; + +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/PokeMini_NDS.c b/PVPokeMini/PokeMini/pokemini-code/platform/nds/PokeMini_NDS.c new file mode 100644 index 0000000000..a808bee2cb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/nds/PokeMini_NDS.c @@ -0,0 +1,455 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" +#include "PokeMini_ColorPal.h" + +#include "UI.h" +#include "Video_x2.h" +#include "PokeMini_BG2.h" + +#include "fps_counter_gfx.h" +#include "RumbleSupport.h" + +const char *AppName = "PokeMini " PokeMini_Version " NDS"; + +const char *RumbleLevel[] = { + "Off", "Weak", "Med.", "Max." +}; + +const char *RumbleInserted[] = { + "No", "In" +}; + +// -------- + +// Joystick names and mapping (NEW IN 0.5.0) +char *NDS_KeysNames[] = { + "Off", // -1 + "A", // 0 + "B", // 1 + "Select", // 2 + "Start", // 3 + "Right", // 4 + "Left", // 5 + "Up", // 6 + "Down", // 7 + "R", // 8 + "L", // 9 + "X", // 10 + "Y" // 11 +}; +int NDS_KeysMapping[] = { + 2, // Menu + 0, // A + 1, // B + 8, // C + 6, // Up + 7, // Down + 5, // Left + 4, // Right + 3, // Power + 9 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_displayfps = 1, clc_rumblepak = 0; +const TCommandLineCustom CustomConf[] = { + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "rumblepak", &clc_rumblepak, COMMANDLINE_INT, 0, 3 }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "FPS Counter: %s", UIItems_PlatformC }, + { 0, 2, "Rumble Pak: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // FPS Counter + clc_displayfps = !clc_displayfps; + break; + case 2: // Rumble pak + clc_rumblepak--; + if (clc_rumblepak < 0) clc_rumblepak = 3; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // FPS Counter + clc_displayfps = !clc_displayfps; + break; + case 2: // Rumble pak + clc_rumblepak++; + if (clc_rumblepak > 3) clc_rumblepak = 0; + break; + case 9: // Define keys... + JoystickEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Platform, 2, "Rumble Pak: %s (%s)", RumbleLevel[clc_rumblepak & 3], RumbleInserted[RumbleCheck() ? 1 : 0]); + return 1; +} + +// For the emulator loop and video +int emurunning = 1; +uint16_t *VIDEO8, *VIDEO16; +u16 *FPSCountGFX[12]; // 10 characters + "FPS" +int FPSCountIdx[16]; +uint16_t VIDEOOFF[256*128]; // For menu graphics + +// Handle keys +void HandleKeys() +{ + uint16_t keys; + scanKeys(); + keys = keysHeld(); + if (UI_Status) keys = keysDownRepeat(); // Allow key repeat inside menu + JoystickBitsEvent(keys); +} + +// Rumble effect +void VBlankHandler() +{ + static int rumbleani = 0; + + // Rumble animation + if ((PokeMini_Rumbling) && (UI_Status == UI_STATUS_GAME)) { + if (clc_rumblepak) { + if (clc_rumblepak == 3) RumbleEnable(1); + else if (clc_rumblepak == 2) RumbleEnable(!(rumbleani & 1)); + else RumbleEnable(!(rumbleani & 3)); + rumbleani++; + } + REG_BG3Y = PokeMini_GenRumbleOffset(256); + } else { + if (clc_rumblepak) RumbleEnable(0); + REG_BG3Y = 0; + } + + // FPS counter + if ((clc_displayfps) && (UI_Status == UI_STATUS_GAME)) { + oamSet(&oamMain, 0, // oam index + 4, 12, 0, // x & y position, priority + 0, SpriteSize_16x16, SpriteColorFormat_16Color, // pal index, sprite size and format + FPSCountGFX[FPSCountIdx[0]], // pointer to the loaded graphics + -1, 0, FPSCountIdx[0] >= 10, // sprite rotation data, double size, hide sprite + 0, 0, 0 // vflip, hflip, mosaic + ); + oamSet(&oamMain, 1, // oam index + 16, 12, 0, // x & y position, priority + 0, SpriteSize_16x16, SpriteColorFormat_16Color, // pal index, sprite size and format + FPSCountGFX[FPSCountIdx[1]], // pointer to the loaded graphics + -1, 0, FPSCountIdx[1] >= 10, // sprite rotation data, double size, hide sprite + 0, 0, 0 // vflip, hflip, mosaic + ); + oamSet(&oamMain, 2, // oam index + 28, 12, 0, // x & y position, priority + 0, SpriteSize_16x16, SpriteColorFormat_16Color, // pal index, sprite size and format + FPSCountGFX[FPSCountIdx[2]], // pointer to the loaded graphics + -1, 0, FPSCountIdx[2] >= 10, // sprite rotation data, double size, hide sprite + 0, 0, 0 // vflip, hflip, mosaic + ); + oamUpdate(&oamMain); + } +} + +// FPS Counter +volatile u32 vfpscounter = 0; +void FPSCounterHandler() +{ + vfpscounter++; +} + +// Sound stream +mm_word audiostreamcallback( mm_word length, mm_addr dest, mm_stream_formats format ) +{ + MinxAudio_GenerateEmulatedS8(dest, length, 1); + return length; +} +void enablesound(int enable) +{ + static int soundenabled = 0; + if ((!soundenabled) && (enable)) { + // Enable sound + mm_stream mystream; + mystream.sampling_rate = 22050; + mystream.buffer_length = 1024; + mystream.callback = audiostreamcallback; + mystream.format = MM_STREAM_8BIT_MONO; + mystream.timer = MM_TIMER0; + mystream.manual = false; + mmStreamOpen(&mystream); + } else if ((soundenabled) && (!enable)) { + // Disable sound + mmStreamClose(); + } + soundenabled = enable; +} + +// Menu loop +void menuloop() +{ + // Stop sound + enablesound(0); + + // Set 15-bits mode & create offscreen buffer + oamDisable(&oamMain); + REG_BG3CNT = BG_BMP16_256x256; + memset(BG_GFX, 0, 256*256*2); + BG_PALETTE[0] = 0x0000; + memset(VIDEOOFF, 0, 256*128*2); + + // Update EEPROM + UIMenu_SaveEEPDisplay_16((uint16_t *)VIDEOOFF, 256); + memcpy(VIDEO16, VIDEOOFF, 256*128*2); + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Handle keys + HandleKeys(); + + // Process UI + UIMenu_Process(); + + // Screen rendering + UIMenu_Display_16((uint16_t *)VIDEOOFF, 256); + + // Wait VSync & Render (72 Hz) + memcpy(VIDEO16, VIDEOOFF, 256*128*2); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); + + // Restore 8-bits mode + REG_BG3CNT = BG_BMP8_256x256; + memset(BG_GFX, 0, 256*256*2); + if (clc_displayfps) oamEnable(&oamMain); + + // Copy palette and refresh + if (CommandLine.lcdmode == 3) memcpy(BG_PALETTE, PokeMini_ColorPalRGB15, 256*2); + else memcpy(BG_PALETTE, VidPalette16, 256*2); + PokeMini_VideoBlit(VIDEO8, 128); +} + +// Main function +int main(int argc, char **argv) +{ + //int battimeout = 0; + int fpscount = 0; + u32 time = 0, nexttime = 0, fpstime = 0; + char fpscountstr[32]; + int i; + + // Setup interrupts + irqSet(IRQ_VBLANK, VBlankHandler); + timerStart(3, ClockDivider_1024, timerFreqToTicks_1024(72), FPSCounterHandler); // 72 Hz Timer + irqEnable(IRQ_VBLANK | IRQ_TIMER3); + RumbleCheck(); + + // Console init + consoleDemoInit(); + + // Initialize libfat + if (!fatInitDefault()) { + printf("Error, libfat failed!\n"); + } + + // Init video + printf("%s\n\n", AppName); + if (argv) PokeMini_InitDirs(argv[0], NULL); + else PokeMini_InitDirs("/", NULL); + CommandLineInit(); + //CommandLine.low_battery = 2; // NDS can report battery status + CommandLine.lcdfilter = 0; // Disable LCD filtering + CommandLine.lcdmode = LCDMODE_3SHADES; + CommandLineConfFile("pokemini.cfg", "pokemini_nds.cfg", CustomConf); + JoystickSetup("NDS", 0, 30000, NDS_KeysNames, 12, NDS_KeysMapping); + keysSetRepeat(30, 8); + + // Initialize NDS video + printf("Initializing video...\n"); + videoSetMode(MODE_5_2D | DISPLAY_BG3_ACTIVE); + vramSetPrimaryBanks(VRAM_A_MAIN_BG_0x06000000, VRAM_B_MAIN_SPRITE_0x06400000, VRAM_C_SUB_BG_0x06200000, VRAM_D_SUB_SPRITE); + + // NDS Sprites + oamInit(&oamMain, SpriteMapping_1D_32, false); + for (i=0; i<12; i++) { + FPSCountGFX[i] = oamAllocateGfx(&oamMain, SpriteSize_16x16, SpriteColorFormat_16Color); + dmaCopy(&fps_counter_gfxTiles[i*64], FPSCountGFX[i], 128); + } + dmaCopy(fps_counter_gfxPal, SPRITE_PALETTE, 512); + FPSCountIdx[0] = FPSCountIdx[1] = 10; + FPSCountIdx[2] = 0; + oamSet(&oamMain, 4, // oam index + 40, 12, 0, // x & y position, priority + 0, SpriteSize_16x16, SpriteColorFormat_16Color, // pal index, sprite size and format + FPSCountGFX[10], // pointer to the loaded graphics + -1, 0, 0, // sprite rotation data, double size, hide sprite + 0, 0, 0 // vflip, hflip, mosaic + ); + oamSet(&oamMain, 5, // oam index + 56, 12, 0, // x & y position, priority + 0, SpriteSize_16x16, SpriteColorFormat_16Color, // pal index, sprite size and format + FPSCountGFX[11], // pointer to the loaded graphics + -1, 0, 0, // sprite rotation data, double size, hide sprite + 0, 0, 0 // vflip, hflip, mosaic + ); + + // NDS Background + REG_BG3CNT = BG_BMP8_256x256; + REG_BG3PA = 256; // 1.0 + REG_BG3PB = 0; // 0.0 + REG_BG3PC = 0; // 0.0 + REG_BG3PD = 256; // 1.0 + REG_BG3X = 0; // 0.0 + REG_BG3Y = 0; // 0.0 + memset(BG_GFX, 0, 256*256*2); + VIDEO8 = (uint16_t *)&BG_GFX[(32 * 128) + 16]; + VIDEO16 = (uint16_t *)&BG_GFX[(64 * 128) + 32]; + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video2x2_NDS, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(192, 128, PokeMini_RGB15, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalRGB15, (uint32_t *)PokeMini_BG2_PalRGB15); + + // Initialize maxmod + printf("Initializing maxmod...\n"); + mm_ds_system sys; + sys.mod_count = 0; + sys.samp_count = 0; + sys.mem_bank = 0; + sys.fifo_channel = FIFO_MAXMOD; + mmInit(&sys); + + // Create emulator and load test roms + printf("Starting emulator...\n"); + if (!PokeMini_Create(POKEMINI_GENSOUND, 0)) { + fprintf(stderr, "Error while initializing emulator.\n"); + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_RGB15, 0); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + if (CommandLine.lcdmode == 3) memcpy(BG_PALETTE, PokeMini_ColorPalRGB15, 256*2); + else memcpy(BG_PALETTE, VidPalette16, 256*2); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + while (emurunning) { + // Emulate 1 frame + PokeMini_EmulateFrame(); + do { + time = vfpscounter; + } while (time < nexttime); + nexttime = time + 1; + + // FPS counter + fpscount++; + if (time >= fpstime) { + sprintf(fpscountstr, "%3i", fpscount); + if (fpscountstr[0] != ' ') FPSCountIdx[0] = fpscountstr[0] - '0'; + else FPSCountIdx[0] = 10; + if (fpscountstr[1] != ' ') FPSCountIdx[1] = fpscountstr[1] - '0'; + else FPSCountIdx[1] = 10; + if (fpscountstr[2] != ' ') FPSCountIdx[2] = fpscountstr[2] - '0'; + else FPSCountIdx[2] = 10; + fpscount = 0; + fpstime = time + 74; + } + + // Screen rendering if LCD changes + if (LCDDirty) { + PokeMini_VideoBlit(VIDEO8, 128); + LCDDirty--; + } + + // Handle keys + HandleKeys(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // Check battery + /*if (battimeout <= 0) { + PokeMini_LowPower(getBatteryLevel() < 4); + battimeout = 600; + } else battimeout--;*/ + } + + // Stop sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/RumbleSupport.c b/PVPokeMini/PokeMini/pokemini-code/platform/nds/RumbleSupport.c new file mode 100644 index 0000000000..9473436946 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/nds/RumbleSupport.c @@ -0,0 +1,56 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +void OpenNorWrite(); +void CloseNorWrite(); +uint32 ReadNorFlashID(); + +int rumbleType; + +int RumbleCheck(void) +{ + sysSetCartOwner(BUS_OWNER_ARM9); + + if (isRumbleInserted()) { + // Warioware / Official rumble + rumbleType = 1; + } else { + // 3-in-1 found + OpenNorWrite(); + uint32 rumbleID = ReadNorFlashID(); + CloseNorWrite(); + if (rumbleID != 0) rumbleType = 2; + else rumbleType = 0; + } + + return rumbleType; +} + +void RumbleEnable(int enable) +{ + if (rumbleType == 2) { + GBA_BUS[0x1FE0000/2] = 0xD200; + GBA_BUS[0x0000000/2] = 0x1500; + GBA_BUS[0x0020000/2] = 0xD200; + GBA_BUS[0x0040000/2] = 0x1500; + GBA_BUS[0x1E20000/2] = enable ? 0x00F3 : 0x0008; + GBA_BUS[0x1FC0000/2] = 0x1500; + } else setRumble(enable); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/RumbleSupport.h b/PVPokeMini/PokeMini/pokemini-code/platform/nds/RumbleSupport.h new file mode 100644 index 0000000000..638068b06e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/nds/RumbleSupport.h @@ -0,0 +1,26 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef RUMBLE_SUPPORT_H +#define RUMBLE_SUPPORT_H + +int RumbleCheck(void); + +void RumbleEnable(int enable); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/gfx/fps_counter_gfx.grit b/PVPokeMini/PokeMini/pokemini-code/platform/nds/gfx/fps_counter_gfx.grit new file mode 100644 index 0000000000..3721160cbc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/nds/gfx/fps_counter_gfx.grit @@ -0,0 +1,8 @@ +# 4 bit tile +-gB4 +-gu16 + +# tilemap format +-gt +-mR4 +-m! diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/gfx/fps_counter_gfx.png b/PVPokeMini/PokeMini/pokemini-code/platform/nds/gfx/fps_counter_gfx.png new file mode 100644 index 0000000000..c88aa5a74a Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/nds/gfx/fps_counter_gfx.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/nds/makefile new file mode 100644 index 0000000000..425078b7a3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/nds/makefile @@ -0,0 +1,185 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +POKEROOT = ../../ + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +# MAXMOD_SOUNDBANK contains a directory of music and sound effect files +#--------------------------------------------------------------------------------- +TARGET := PokeMini +BUILD := build +SOURCES := $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios $(POKEROOT)sourcex $(POKEROOT)dependencies/zlib $(POKEROOT)dependencies/minizip . +DATA := +INCLUDES := $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios $(POKEROOT)sourcex $(POKEROOT)dependencies/zlib $(POKEROOT)dependencies/minizip +GRAPHICS := gfx + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork -march=armv5te -mtune=arm946e-s + +CFLAGS := -save-temps -g -Wall -O2\ + -fomit-frame-pointer\ + -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 -DUI_MAXCACHE=128 -DMINX_AUDIOFREQ=22050 -DPERFORMANCE +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project (order is important) +#--------------------------------------------------------------------------------- +LIBS := -lfat -lnds9 -lmm9 + + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ + $(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +ifneq ($(strip $(NITRODATA)),) + export NITRO_FILES := $(CURDIR)/$(NITRODATA) +endif + +# Only include what's really needed +CFILES := PokeMini_NDS.c \ + 3in1.c \ + RumbleSupport.c \ + freebios/freebios.c \ + source/PMCommon.c \ + source/PokeMini.c \ + source/Multicart.c \ + source/Hardware.c \ + source/Video.c \ + source/Video_x2.c \ + source/CommandLine.c \ + source/MinxCPU.c \ + source/MinxCPU_XX.c \ + source/MinxCPU_CE.c \ + source/MinxCPU_CF.c \ + source/MinxCPU_SP.c \ + source/MinxTimers.c \ + source/MinxIO.c \ + source/MinxIRQ.c \ + source/MinxPRC.c \ + source/MinxColorPRC.c \ + source/MinxLCD.c \ + source/MinxAudio.c \ + source/UI.c \ + source/Joystick.c \ + dependencies/minizip/unzip.c \ + dependencies/minizip/ioapi.c \ + dependencies/zlib/adler32.o \ + dependencies/zlib/crc32.o \ + dependencies/zlib/inffast.o \ + dependencies/zlib/inflate.o \ + dependencies/zlib/inftrees.o \ + dependencies/zlib/zutil.o \ + sourcex/Zip64comp.c \ + resource/PokeMini_ColorPal.c \ + resource/PokeMini_Font12.c \ + resource/PokeMini_Icons12.c \ + resource/PokeMini_BG2.c + +CFILES := $(notdir $(CFILES)) +# CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) +PNGFILES := $(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.png))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(PNGFILES:.png=.o) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +export GAME_ICON := $(CURDIR)/nds_icon.bmp + +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).elf $(TARGET).nds $(TARGET).arm9 $(TARGET).ds.gba + +#--------------------------------------------------------------------------------- +else + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).nds : $(OUTPUT).arm9 +$(OUTPUT).arm9 : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +#--------------------------------------------------------------------------------- +%.s %.h : %.png %.grit +#--------------------------------------------------------------------------------- + grit $< -fts -o$* + +-include $(DEPSDIR)/*.d + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/nds/nds_icon.bmp b/PVPokeMini/PokeMini/pokemini-code/platform/nds/nds_icon.bmp new file mode 100644 index 0000000000..05ac925275 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/nds/nds_icon.bmp differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/psp/PSPStuffz.c b/PVPokeMini/PokeMini/pokemini-code/platform/psp/PSPStuffz.c new file mode 100644 index 0000000000..732936c40e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/psp/PSPStuffz.c @@ -0,0 +1,117 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "PSPStuffz.h" + +PSP_MODULE_INFO("PokeMini", 0, 1, 1); +PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER); + +int _isatty(int fildes) { return 1; } // devkitPro Hack + +static unsigned int __attribute__((aligned(16))) list[262144]; +extern uint16_t *VIDEO; +extern int emurunning; +uint16_t *PSP_DispVideo, *PSP_DrawVideo; + +int callbackThread(SceSize args, void *argp) +{ + int cbid; + cbid = sceKernelCreateCallback("Exit Callback", exitCallback, NULL); + sceKernelRegisterExitCallback(cbid); + sceKernelSleepThreadCB(); + return 0; +} + +int setupCallbacks(void) +{ + int thid = 0; + thid = sceKernelCreateThread("update_thread", callbackThread, 0x11, 0xFA0, 0, 0); + if(thid >= 0) sceKernelStartThread(thid, 0, 0); + return thid; +} + +void PSP_Correct_Timezone() +{ + char tzStr[32]; + int tzOffset = 0; + int dst = 0; + sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_TIMEZONE, &tzOffset); + sceUtilityGetSystemParamInt(PSP_SYSTEMPARAM_ID_INT_DAYLIGHTSAVINGS, &dst); + int tzOffsetAbs = tzOffset < 0 ? -tzOffset : tzOffset; + sprintf(tzStr, "GMT%s%02i:%02i%s", (tzOffset < 0) ? "+" : "-", tzOffsetAbs / 60, tzOffsetAbs % 60, (dst == 1) ? " DST" : ""); + setenv("TZ", tzStr, 1); + tzset(); +} + +void PSP_Init() +{ + setupCallbacks(); + + PSP_Correct_Timezone(); + sceCtrlSetSamplingCycle(0); + sceCtrlSetSamplingMode(PSP_CTRL_MODE_DIGITAL); + + sceGuInit(); + + sceDisplaySetMode(0, 480, 272); // Seems optional + sceDisplaySetFrameBuf((void *)0, 512, PSP_DISPLAY_PIXEL_FORMAT_565, PSP_DISPLAY_SETBUF_IMMEDIATE); + sceGuStart(GU_DIRECT, list); + + sceGuDrawBuffer(GU_PSM_5650, (void *)0, 512); + sceGuDispBuffer(480, 272, (void *)(512*512*2), 512); + sceDisplayWaitVblankStart(); + sceGuDisplay(GU_TRUE); + + PSP_DrawVideo = (uint16_t *)sceGeEdramGetAddr(); + PSP_DispVideo = PSP_DrawVideo + (512*512*2); + + // Clear screen and offset to the center + memset(PSP_DrawVideo, 0, 512*272*2); + + // Initialize sound + pspAudioInit(); +} + +void PSP_Flip() +{ + uint16_t *tmp; + + // Flush all data cache + sceKernelDcacheWritebackAll(); + + // Swap buffers + tmp = PSP_DrawVideo; + PSP_DrawVideo = PSP_DispVideo; + PSP_DispVideo = tmp; + sceDisplaySetFrameBuf(PSP_DispVideo, 512, PSP_DISPLAY_PIXEL_FORMAT_565, PSP_DISPLAY_SETBUF_IMMEDIATE); +} + +void PSP_ClearDraw() +{ + memset(PSP_DrawVideo, 0, 512*272*2); +} + +void PSP_Quit() +{ + pspAudioEnd(); + sceGuTerm(); + sceKernelExitGame(); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/psp/PSPStuffz.h b/PVPokeMini/PokeMini/pokemini-code/platform/psp/PSPStuffz.h new file mode 100644 index 0000000000..7302ac8ee5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/psp/PSPStuffz.h @@ -0,0 +1,48 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Video access +extern uint16_t *PSP_DrawVideo; + +// Exit callback (Defined by the user) +int exitCallback(int arg1, int arg2, void *common); + +// Initialize +void PSP_Init(); + +// Flip image +void PSP_Flip(); + +// Clear drawing +void PSP_ClearDraw(); + +// Quit +void PSP_Quit(); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/psp/PokeMini_PSP.c b/PVPokeMini/PokeMini/pokemini-code/platform/psp/PokeMini_PSP.c new file mode 100644 index 0000000000..73fd17aa22 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/psp/PokeMini_PSP.c @@ -0,0 +1,384 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PSPStuffz.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" + +#include "Video_x1.h" +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "PokeMini_BG2.h" +#include "PokeMini_BG3.h" +#include "PokeMini_BG4.h" + +const char *AppName = "PokeMini " PokeMini_Version " PSP"; + +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) + +// For the emulator loop and video +int emurunning = 1; +int ui_offset; +int pm_offset; + +void setup_screen(); + +// -------- + +int exitCallback(int arg1, int arg2, void *common) +{ + emurunning = 0; + return 0; +} + +// -------- + +const char *clc_zoom_txt[] = { + "0x (Illegal)", + "1x ( 96x 64)", + "2x (192x128)", + "3x (288x192)", + "4x (384x256)", +}; + +// Joystick names and mapping (NEW IN 0.5.0) +char *PSP_KeysNames[] = { + "Off", // -1 + "Select", // 0 + "Unused 1", // 1 + "Unused 2", // 2 + "Start", // 3 + "Up", // 4 + "Right", // 5 + "Down", // 6 + "Left", // 7 + "L Trigger", // 8 + "R Trigger", // 9 + "Unused 4", // 10 + "Unused 5", // 11 + "Triangle", // 12 + "Circle", // 13 + "Cross", // 14 + "Square", // 15 + "Menu" // 16 but not used +}; +int PSP_KeysMapping[] = { + 0, // Menu + 13, // A + 14, // B + 9, // C + 4, // Up + 6, // Down + 7, // Left + 5, // Right + 3, // Power + 8 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_zoom = 4; +int clc_displayfps = 0; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 1, 4 }, + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Zoom: %s", UIItems_PlatformC }, + { 0, 2, "Display FPS: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int zoomchanged = 0; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // Zoom + clc_zoom--; + if (clc_zoom < 1) clc_zoom = 4; + zoomchanged = 1; + break; + case 2: // Display FPS + clc_displayfps = !clc_displayfps; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // Zoom + clc_zoom++; + if (clc_zoom > 4) clc_zoom = 1; + zoomchanged = 1; + break; + case 2: // Display FPS + clc_displayfps = !clc_displayfps; + break; + case 9: // Define joystick + JoystickEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Zoom: %s", clc_zoom_txt[clc_zoom]); + UIMenu_ChangeItem(UIItems_Platform, 2, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + if (zoomchanged) setup_screen(); + return 1; +} + +// Setup screen +void setup_screen() +{ + TPokeMini_VideoSpec *videospec; + + if (clc_zoom == 1) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video1x1; + ui_offset = (72 * 512) + 144; + pm_offset = (104 * 512) + 192; + UIMenu_SetDisplay(192, 128, PokeMini_RGB16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + ui_offset = pm_offset = (72 * 512) + 144; + UIMenu_SetDisplay(192, 128, PokeMini_RGB16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + ui_offset = pm_offset = (40 * 512) + 96; + UIMenu_SetDisplay(288, 192, PokeMini_RGB16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + ui_offset = pm_offset = (8 * 512) + 48; + UIMenu_SetDisplay(384, 256, PokeMini_RGB16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + } + + // Set video spec and check if is supported + if (!PokeMini_SetVideo(videospec, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + PokeDPrint(POKEMSG_ERR, "Couldn't set video spec\n"); + exit(1); + } +} + +// Handle keys +void HandleKeys() +{ + SceCtrlData pad; + sceCtrlReadBufferPositive(&pad, 1); + JoystickAxisEvent(0, ((int)pad.Lx - 128) * 256); + JoystickAxisEvent(1, ((int)pad.Ly - 128) * 256); + JoystickBitsEvent(pad.Buttons); +} + +// Sound stream +void audiostreamcallback(void *buf, unsigned int length, void *userdata) +{ + MinxAudio_GenerateEmulatedS16((int16_t *)buf, length, 2); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + static int soundenabled = 0; + if ((!soundenabled) && sound) { + // Enable sound + pspAudioSetChannelCallback(0, audiostreamcallback, NULL); + } else if ((soundenabled) && !sound) { + // Disable sound + pspAudioSetChannelCallback(0, NULL, NULL); + } + soundenabled = sound; +} + +// Menu loop +void menuloop() +{ + // Stop sound + enablesound(0); + + // Update EEPROM + sceDisplayWaitVblank(); + UIMenu_SaveEEPDisplay_16((uint16_t *)PSP_DrawVideo + ui_offset, 512); + PSP_Flip(); + PSP_ClearDraw(); + PokeMini_SaveFromCommandLines(0); + + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + sceDisplayWaitVblank(); + + // Handle keys + HandleKeys(); + + // Process UI + UIMenu_Process(); + + // Screen rendering + UIMenu_Display_16((uint16_t *)PSP_DrawVideo + ui_offset, 512); + + // Wait VSync & Render (72 Hz) + PSP_Flip(); + PSP_ClearDraw(); + } + + // Flip and clear again + PSP_Flip(); + PSP_ClearDraw(); + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); +} + +// Main function +int main(int argc, char **argv) +{ + int battimeout = 0; + char fpstxt[16]; + + // Open debug files + PokeDebugFOut = fopen("dbg_stdout.txt", "w"); + PokeDebugFErr = fopen("dbg_stderr.txt", "w"); + + // Init video + PokeDPrint(POKEMSG_OUT, "%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLine.low_battery = 2; // PSP can report battery status + CommandLineConfFile("pokemini.cfg", "pokemini_psp.cfg", CustomConf); + JoystickSetup("PSP", 0, 30000, PSP_KeysNames, 16, PSP_KeysMapping); + + // PSP Init and set screen + PSP_Init(); + setup_screen(); + + // Create emulator and load test roms + PokeDPrint(POKEMSG_OUT, "Starting emulator...\n"); + PokeMini_Create(POKEMINI_GENSOUND | POKEMINI_AUTOBATT, 0); + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_RGB16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + PokeDPrint(POKEMSG_OUT, "Running emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + sceCtrlSetSamplingCycle(0); + sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); + + // Emulator's loop + u64 tickcurr; + u64 fpsticknext,fpstickres = (u64)sceRtcGetTickResolution(); + u64 frmticknext, frmtickres = (u64)sceRtcGetTickResolution() / 36; + sceRtcGetCurrentTick(&tickcurr); + fpsticknext = tickcurr + fpstickres; + frmticknext = tickcurr + frmtickres; + int fps = 72, fpscnt = 0; + strcpy(fpstxt, ""); + while (emurunning) { + // Emulate 2 frames + PokeMini_EmulateFrame(); + PokeMini_EmulateFrame(); + if (RequireSoundSync) { + while (MinxAudio_SyncWithAudio()) sceKernelDelayThread(1000); + } else { + do { + sceRtcGetCurrentTick(&tickcurr); + sceKernelDelayThread(1000); + } while (tickcurr < frmticknext); + frmticknext = tickcurr + frmtickres; // Aprox 36 times per sec + } + + // Screen rendering + PSP_ClearDraw(); + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((uint16_t *)PSP_DrawVideo + pm_offset + PokeMini_GenRumbleOffset(512), 512); + } else { + PokeMini_VideoBlit((uint16_t *)PSP_DrawVideo + pm_offset, 512); + } + LCDDirty = 0; + + // Display FPS counter + if (clc_displayfps) { + sceRtcGetCurrentTick(&tickcurr); + if (tickcurr >= fpsticknext) { + fpsticknext = tickcurr + fpstickres; + fps = fpscnt; + fpscnt = 0; + sprintf(fpstxt, "%i FPS", fps); + } else fpscnt++; + UIDraw_String_16((uint16_t *)PSP_DrawVideo, 512, 4, 4, 10, fpstxt, UI_Font1_Pal16); + } + + // Handle keys + HandleKeys(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // Wait VSync & Render (72 Hz) + PSP_Flip(); + + // Check battery + if (battimeout <= 0) { + PokeMini_LowPower(scePowerIsLowBattery()); + battimeout = 600; + } else battimeout--; + } + + // Stop sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + PokeDPrint(POKEMSG_OUT, "Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Close debug files + fclose(PokeDebugFOut); + fclose(PokeDebugFErr); + + // PSP Quit + PSP_Quit(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/psp/icon0.png b/PVPokeMini/PokeMini/pokemini-code/platform/psp/icon0.png new file mode 100644 index 0000000000..afc0e34b45 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/psp/icon0.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/psp/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/psp/makefile new file mode 100644 index 0000000000..9b2d3bee41 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/psp/makefile @@ -0,0 +1,66 @@ +# PokeMini Makefile for PSP + +TARGET = PokeMini +POKEROOT = ../../ + +OBJS = \ + PokeMini_PSP.o \ + PSPStuffz.o \ + $(POKEROOT)freebios/freebios.o \ + $(POKEROOT)source/PMCommon.o \ + $(POKEROOT)source/PokeMini.o \ + $(POKEROOT)source/Multicart.o \ + $(POKEROOT)source/Hardware.o \ + $(POKEROOT)source/Video.o \ + $(POKEROOT)source/Video_x1.o \ + $(POKEROOT)source/Video_x2.o \ + $(POKEROOT)source/Video_x3.o \ + $(POKEROOT)source/Video_x4.o \ + $(POKEROOT)source/MinxCPU.o \ + $(POKEROOT)source/MinxCPU_XX.o \ + $(POKEROOT)source/MinxCPU_CE.o \ + $(POKEROOT)source/MinxCPU_CF.o \ + $(POKEROOT)source/MinxCPU_SP.o \ + $(POKEROOT)source/MinxIRQ.o \ + $(POKEROOT)source/MinxTimers.o \ + $(POKEROOT)source/MinxIO.o \ + $(POKEROOT)source/MinxPRC.o \ + $(POKEROOT)source/MinxColorPRC.o \ + $(POKEROOT)source/MinxLCD.o \ + $(POKEROOT)source/MinxAudio.o \ + $(POKEROOT)source/CommandLine.o \ + $(POKEROOT)source/UI.o \ + $(POKEROOT)source/Joystick.o \ + $(POKEROOT)dependencies/minizip/unzip.o \ + $(POKEROOT)dependencies/minizip/ioapi.o \ + $(POKEROOT)dependencies/zlib/adler32.o \ + $(POKEROOT)dependencies/zlib/crc32.o \ + $(POKEROOT)dependencies/zlib/inffast.o \ + $(POKEROOT)dependencies/zlib/inflate.o \ + $(POKEROOT)dependencies/zlib/inftrees.o \ + $(POKEROOT)dependencies/zlib/zutil.o \ + $(POKEROOT)sourcex/Zip64comp.o \ + $(POKEROOT)resource/PokeMini_Font12.o \ + $(POKEROOT)resource/PokeMini_Icons12.o \ + $(POKEROOT)resource/PokeMini_BG2.o \ + $(POKEROOT)resource/PokeMini_BG3.o \ + $(POKEROOT)resource/PokeMini_BG4.o \ + $(POKEROOT)resource/PokeMini_ColorPal.o + +INCDIR = $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios \ + $(POKEROOT)sourcex $(POKEROOT)dependencies/minizip $(POKEROOT)dependencies/zlib + +CFLAGS = -G0 -Wall -O2 -DPERFORMANCE +CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti $(INCLUDE) +ASFLAGS = $(CFLAGS) + +LIBDIR = +LDFLAGS = +LIBS= -lpspgum -lpspgu -lpspaudiolib -lpspaudio -lpsppower -lpsprtc -lm + +EXTRA_TARGETS = EBOOT.PBP +PSP_EBOOT_TITLE = PokeMini 0.60 PSP +PSP_EBOOT_ICON = icon0.png + +PSPSDK=$(shell psp-config --pspsdk-path) +include $(PSPSDK)/lib/build.mak diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl/PokeMini_SDL.c b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/PokeMini_SDL.c new file mode 100644 index 0000000000..23cd415377 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/PokeMini_SDL.c @@ -0,0 +1,552 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "ExportBMP.h" +#include "ExportWAV.h" +#include "Joystick.h" +#include "Keyboard.h" +#include "KeybMapSDL.h" + +#include "Video_x1.h" +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" +#include "PokeMini_BG2.h" +#include "PokeMini_BG3.h" +#include "PokeMini_BG4.h" +#include "PokeMini_BG5.h" +#include "PokeMini_BG6.h" + +const char *AppName = "PokeMini " PokeMini_Version " SDL"; + +int emurunning = 1, emulimiter = 1; +SDL_Surface *screen; +SDL_Joystick *joystick = NULL; +int PMWidth, PMHeight; +int PixPitch, PMOff, UIOff; + +FILE *sdump; +void setup_screen(); + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) + +const char *clc_zoom_txt[] = { + "0x (Illegal)", + "1x ( 96x 64)", + "2x (192x128)", + "3x (288x192)", + "4x (384x256)", + "5x (480x320)", + "6x (576x384)", +}; + +// Custom command line (NEW IN 0.5.0) +int clc_zoom = 4, clc_bpp = 16, clc_fullscreen = 0; +char clc_dump_sound[PMTMPV] = {0}; +int clc_displayfps = 0; +const TCommandLineCustom CustomArgs[] = { + { "-dumpsound", (int *)&clc_dump_sound, COMMANDLINE_STR, PMTMPV-1 }, + { "-zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "-bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "-windowed", &clc_fullscreen, COMMANDLINE_INTSET, 0 }, + { "-fullscreen", &clc_fullscreen, COMMANDLINE_INTSET, 1 }, + { "-displayfps", &clc_displayfps, COMMANDLINE_INTSET, 1 }, + { "", NULL, COMMANDLINE_EOL } +}; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "fullscreen", &clc_fullscreen, COMMANDLINE_BOOL }, + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Zoom: %s", UIItems_PlatformC }, + { 0, 2, "Depth: %dbpp", UIItems_PlatformC }, + { 0, 3, "Fullscreen: %s", UIItems_PlatformC }, + { 0, 4, "Display FPS: %s", UIItems_PlatformC }, + { 0, 8, "Define Joystick...", UIItems_PlatformC }, + { 0, 9, "Define Keyboard...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int zoomchanged = 0; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // Zoom + clc_zoom--; + if (clc_zoom < 1) clc_zoom = 6; + zoomchanged = 1; + break; + case 2: // Bits-Per-Pixel + if (clc_bpp == 32) + clc_bpp = 16; + else + clc_bpp = 32; + zoomchanged = 1; + break; + case 3: // Fullscreen + clc_fullscreen = !clc_fullscreen; + zoomchanged = 1; + break; + case 4: // Display FPS + clc_displayfps = !clc_displayfps; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // Zoom + clc_zoom++; + if (clc_zoom > 6) clc_zoom = 1; + zoomchanged = 1; + break; + case 2: // Bits-Per-Pixel + if (clc_bpp == 32) + clc_bpp = 16; + else + clc_bpp = 32; + zoomchanged = 1; + break; + case 3: // Fullscreen + clc_fullscreen = !clc_fullscreen; + zoomchanged = 1; + break; + case 4: // Display FPS + clc_displayfps = !clc_displayfps; + break; + case 8: // Define Joystick... + JoystickEnterMenu(); + break; + case 9: // Define Keyboard... + KeyboardEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Zoom: %s", clc_zoom_txt[clc_zoom]); + UIMenu_ChangeItem(UIItems_Platform, 2, "Depth: %dbpp", clc_bpp); + UIMenu_ChangeItem(UIItems_Platform, 3, "Fullscreen: %s", clc_fullscreen ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Platform, 4, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + if (zoomchanged) { + SDL_UnlockSurface(screen); + setup_screen(); + SDL_LockSurface(screen); + return 0; + } + return 1; +} + +// Setup screen +void setup_screen() +{ + TPokeMini_VideoSpec *videospec; + int depth, PMOffX, PMOffY, UIOffX, UIOffY; + + // Calculate size based of zoom + if (clc_zoom == 1) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video1x1; + PMWidth = 192; PMHeight = 128; PMOffX = 48; PMOffY = 32; UIOffX = 0; UIOffY = 0; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 208; PMHeight = 144; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 304; PMHeight = 208; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 400; PMHeight = 272; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 496; PMHeight = 336; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(480, 320, PokeMini_BGR16, (uint8_t *)PokeMini_BG5, (uint16_t *)PokeMini_BG5_PalBGR16, (uint32_t *)PokeMini_BG5_PalBGR32); + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 592; PMHeight = 400; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(576, 384, PokeMini_BGR16, (uint8_t *)PokeMini_BG6, (uint16_t *)PokeMini_BG6_PalBGR16, (uint32_t *)PokeMini_BG6_PalBGR32); + } + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, clc_bpp, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + fprintf(stderr, "Couldn't set video spec from %i bpp\n", clc_bpp); + exit(1); + } + + // Set video mode + screen = SDL_SetVideoMode(PMWidth, PMHeight, depth, SDL_HWSURFACE | SDL_DOUBLEBUF | (clc_fullscreen ? SDL_FULLSCREEN : 0)); + if (screen == NULL) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + + // Calculate pitch and offset + if (depth == 32) { + PixPitch = screen->pitch / 4; + PMOff = (PMOffY * screen->pitch) + (PMOffX * 4); + UIOff = (UIOffY * screen->pitch) + (UIOffX * 4); + } else { + PixPitch = screen->pitch / 2; + PMOff = (PMOffY * screen->pitch) + (PMOffX * 2); + UIOff = (UIOffY * screen->pitch) + (UIOffX * 2); + } + clc_bpp = depth; +} + +// Capture screen +void capture_screen() +{ + FILE *capf; + int y, capnum; + unsigned long Video[96*64]; + PokeMini_VideoPreview_32((uint32_t *)Video, 96, PokeMini_LCDMode); + capf = OpenUnique_ExportBMP(&capnum, 96, 64); + if (!capf) { + fprintf(stderr, "Error while saving capture\n"); + return; + } + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&Video[(63-y) * 96], 96); + } + printf("Capture saved at 'snap_%03d.bmp'\n", capnum); + Close_ExportBMP(capf); +} + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_KEYDOWN: + if (event->key.keysym.sym == SDLK_F9) { // Capture screen + capture_screen(); + } else if (event->key.keysym.sym == SDLK_F4) { // Emulator Exit + if (event->key.keysym.mod & KMOD_ALT) { + emurunning = 0; + } + } else if (event->key.keysym.sym == SDLK_F10) { // Fullscreen/Window + clc_fullscreen = !clc_fullscreen; + setup_screen(); + UIItems_PlatformC(0, UIMENU_LOAD); + } else if (event->key.keysym.sym == SDLK_F11) { // Disable speed throttling + emulimiter = !emulimiter; + } else if (event->key.keysym.sym == SDLK_TAB) { // Temp disable speed throttling + emulimiter = 0; + } else { + KeyboardPressEvent(event->key.keysym.sym); + } + break; + case SDL_KEYUP: + if (event->key.keysym.sym == SDLK_TAB) { // Speed threhold + emulimiter = 1; + } else { + KeyboardReleaseEvent(event->key.keysym.sym); + } + break; + case SDL_JOYBUTTONDOWN: + JoystickButtonsEvent(event->jbutton.button, 1); + break; + case SDL_JOYBUTTONUP: + JoystickButtonsEvent(event->jbutton.button, 0); + break; + case SDL_JOYAXISMOTION: + JoystickAxisEvent(event->jaxis.axis & 1, event->jaxis.value); + break; + case SDL_JOYHATMOTION: + JoystickHatsEvent(event->jhat.value); + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesS16((int16_t *)stream, len>>1); + if (clc_dump_sound[0]) WriteS16A_ExportWAV(sdump, (int16_t *)stream, len>>1); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Callback when joystick is re-opened +void reopen_joystick(int enable, int index) +{ + if (joystick) { + SDL_JoystickClose(joystick); + joystick = NULL; + } + if (enable && (SDL_NumJoysticks() > 0)) { + SDL_JoystickEventState(SDL_ENABLE); + joystick = SDL_JoystickOpen(index); // Open joystick + if (joystick) { + printf("Opened joystick: %s\n", SDL_JoystickName(index)); + } + } +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + + // Update window's title and stop sound + SDL_WM_SetCaption(AppName, "PMEWindow"); + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(16); + + // Process UI + UIMenu_Process(); + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_VideoDepth == 32) + UIMenu_Display_32((uint32_t *)((uint8_t *)screen->pixels + UIOff), PixPitch); + else + UIMenu_Display_16((uint16_t *)((uint8_t *)screen->pixels + UIOff), PixPitch); + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); + SDL_EnableKeyRepeat(0, 0); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Event event; + char title[256]; + char fpstxt[16]; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", "pokemini_sdl.cfg", CustomConf); + if (!CommandLineArgs(argc, argv, CustomArgs)) { + PrintHelpUsage(stdout); + printf(" -dumpsound sound.wav Dump sound into a WAV file\n"); + printf(" -windowed Display in window (default)\n"); + printf(" -fullscreen Display in fullscreen\n"); + printf(" -displayfps Display FPS counter on screen\n"); + printf(" -zoom n Zoom display: 1 to 6 (def 4)\n"); + printf(" -bpp n Bits-Per-Pixel: 16 or 32 (def 16)\n"); + return 1; + } + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + return 1; + } + atexit(SDL_Quit); // Clean up on exit + + // Initialize the display + setup_screen(); + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_S16; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Set the window manager title bar + SDL_WM_SetCaption(AppName, "PMEWindow"); + SDL_EnableKeyRepeat(0, 0); + + // Open WAV capture if was requested + if (clc_dump_sound[0]) { + sdump = Open_ExportWAV(clc_dump_sound, EXPORTWAV_44KHZ | EXPORTWAV_MONO | EXPORTWAV_16BITS); + if (!sdump) { + fprintf(stderr, "Error opening sound export file.\n"); + return 1; + } + } + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSNDBUFFER)) { + fprintf(stderr, "Error while initializing emulator\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + KeyboardRemap(&KeybMapSDL); + enablesound(CommandLine.sound); + JoystickUpdateCallback(reopen_joystick); + + // Emulator's loop + unsigned long time, NewTickFPS = 0, NewTickSync = 0; + int fps = 72, fpscnt = 0; + while (emurunning) { + // Emulate and syncronize + time = SDL_GetTicks(); + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + if (emulimiter) while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + PokeMini_EmulateFrame(); + if (emulimiter) { + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + } + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((void *)((uint8_t *)screen->pixels + PMOff + PokeMini_GenRumbleOffset(screen->pitch)), PixPitch); + } else { + PokeMini_VideoBlit((void *)((uint8_t *)screen->pixels + PMOff), PixPitch); + } + LCDDirty = 0; + + // Display FPS counter + if (clc_displayfps) { + if (PokeMini_VideoDepth == 32) + UIDraw_String_32((uint32_t *)screen->pixels, PixPitch, 4, 4, 10, fpstxt, UI_Font1_Pal32); + else + UIDraw_String_16((uint16_t *)screen->pixels, PixPitch, 4, 4, 10, fpstxt, UI_Font1_Pal16); + } + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // calculate FPS + fpscnt++; + if (time >= NewTickFPS) { + fps = fpscnt; + sprintf(title, "%s - %d%%", AppName, fps * 100 / 72); + sprintf(fpstxt, "%i FPS", fps); + SDL_WM_SetCaption(title, "PMEWindow"); + NewTickFPS = time + 1000; + fpscnt = 0; + } + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Close WAV capture if there's one + if (clc_dump_sound[0]) Close_ExportWAV(sdump); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Close joystick + if (joystick) SDL_JoystickClose(joystick); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile new file mode 100644 index 0000000000..16c8171b6d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile @@ -0,0 +1,124 @@ +# PokeMini Makefile for SDL 1.2 (Linux) + +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS += -Wall `$(SDL_BASE)sdl-config --cflags` $(INCLUDE) +SLFLAGS += `$(SDL_BASE)sdl-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_SDL.o \ + sourcex/KeybMapSDL.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG2.o \ + resource/PokeMini_BG3.o \ + resource/PokeMini_BG4.o \ + resource/PokeMini_BG5.o \ + resource/PokeMini_BG6.o + +DEPENDS = \ + sourcex/KeybMapSDL.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG2.h \ + resource/PokeMini_BG3.h \ + resource/PokeMini_BG4.h \ + resource/PokeMini_BG5.h \ + resource/PokeMini_BG6.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(CC) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + +win: + make -f makefile.win + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile.old b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile.old new file mode 100644 index 0000000000..72a05d14a0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile.old @@ -0,0 +1,132 @@ +# PokeMini Makefile for SDL + +CC = gcc +LD = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl-config --cflags` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_SDL.o \ + sourcex/KeybMapSDL.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG2.o \ + resource/PokeMini_BG3.o \ + resource/PokeMini_BG4.o \ + resource/PokeMini_BG5.o \ + resource/PokeMini_BG6.o + +DEPENDS = \ + sourcex/KeybMapSDL.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG2.h \ + resource/PokeMini_BG3.h \ + resource/PokeMini_BG4.h \ + resource/PokeMini_BG5.h \ + resource/PokeMini_BG6.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile.win b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile.win new file mode 100644 index 0000000000..de5cdbd717 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl/makefile.win @@ -0,0 +1,124 @@ +# PokeMini Makefile for SDL 1.2 (Mingw) + +CC = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl-config --cflags` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_SDL.o \ + sourcex/KeybMapSDL.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG2.o \ + resource/PokeMini_BG3.o \ + resource/PokeMini_BG4.o \ + resource/PokeMini_BG5.o \ + resource/PokeMini_BG6.o + +DEPENDS = \ + sourcex/KeybMapSDL.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG2.h \ + resource/PokeMini_BG3.h \ + resource/PokeMini_BG4.h \ + resource/PokeMini_BG5.h \ + resource/PokeMini_BG6.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(WINTARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(CC) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + +clean: + -rm -f $(BUILDOBJS) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/PokeMini_SDL2.c b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/PokeMini_SDL2.c new file mode 100644 index 0000000000..2918dbaef5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/PokeMini_SDL2.c @@ -0,0 +1,621 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "ExportBMP.h" +#include "ExportWAV.h" +#include "Joystick.h" +#include "Keyboard.h" +#include "KeybMapSDL2.h" + +#include "Video_x1.h" +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" +#include "PokeMini_BG2.h" +#include "PokeMini_BG3.h" +#include "PokeMini_BG4.h" +#include "PokeMini_BG5.h" +#include "PokeMini_BG6.h" + +const char *AppName = "PokeMini " PokeMini_Version " SDL2"; + +int emurunning = 1, emulimiter = 1; +SDL_Surface *screen; +SDL_Window *window; +SDL_Texture *texture; +SDL_Renderer *renderer; +SDL_Joystick *joystick = NULL; +SDL_Haptic *haptic = NULL; +int PMWidth, PMHeight; +int PMOffX, PMOffY, UIOffX, UIOffY; + +FILE *sdump; +void setup_screen(); + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) + +const char *clc_zoom_txt[] = { + "0x (Illegal)", + "1x ( 96x 64)", + "2x (192x128)", + "3x (288x192)", + "4x (384x256)", + "5x (480x320)", + "6x (576x384)", +}; + +// Custom command line +int clc_zoom = 4, clc_bpp = 16, clc_fullscreen = 0; +char clc_dump_sound[PMTMPV] = {0}; +int clc_displayfps = 0; +const TCommandLineCustom CustomArgs[] = { + { "-dumpsound", (int *)&clc_dump_sound, COMMANDLINE_STR, PMTMPV-1 }, + { "-zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "-bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "-windowed", &clc_fullscreen, COMMANDLINE_INTSET, 0 }, + { "-fullscreen", &clc_fullscreen, COMMANDLINE_INTSET, 1 }, + { "-displayfps", &clc_displayfps, COMMANDLINE_INTSET, 1 }, + { "", NULL, COMMANDLINE_EOL } +}; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "bpp", &clc_bpp, COMMANDLINE_INT, 16, 32 }, + { "fullscreen", &clc_fullscreen, COMMANDLINE_BOOL }, + { "displayfps", &clc_displayfps, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Zoom: %s", UIItems_PlatformC }, + { 0, 2, "Depth: %dbpp", UIItems_PlatformC }, + { 0, 3, "Fullscreen: %s", UIItems_PlatformC }, + { 0, 4, "Display FPS: %s", UIItems_PlatformC }, + { 0, 8, "Define Joystick...", UIItems_PlatformC }, + { 0, 9, "Define Keyboard...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int zoomchanged = 0; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // Zoom + clc_zoom--; + if (clc_zoom < 1) clc_zoom = 6; + zoomchanged = 1; + break; + case 2: // Bits-Per-Pixel + if (clc_bpp == 32) + clc_bpp = 16; + else + clc_bpp = 32; + zoomchanged = 1; + break; + case 3: // Fullscreen + clc_fullscreen = !clc_fullscreen; + zoomchanged = 1; + break; + case 4: // Display FPS + clc_displayfps = !clc_displayfps; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // Zoom + clc_zoom++; + if (clc_zoom > 6) clc_zoom = 1; + zoomchanged = 1; + break; + case 2: // Bits-Per-Pixel + if (clc_bpp == 32) + clc_bpp = 16; + else + clc_bpp = 32; + zoomchanged = 1; + break; + case 3: // Fullscreen + clc_fullscreen = !clc_fullscreen; + zoomchanged = 1; + break; + case 4: // Display FPS + clc_displayfps = !clc_displayfps; + break; + case 8: // Define Joystick... + JoystickEnterMenu(); + break; + case 9: // Define Keyboard... + KeyboardEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Zoom: %s", clc_zoom_txt[clc_zoom]); + UIMenu_ChangeItem(UIItems_Platform, 2, "Depth: %dbpp", clc_bpp); + UIMenu_ChangeItem(UIItems_Platform, 3, "Fullscreen: %s", clc_fullscreen ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Platform, 4, "Display FPS: %s", clc_displayfps ? "Yes" : "No"); + if (zoomchanged) { + setup_screen(); + return 0; + } + return 1; +} + +// Setup screen +int decorationWidth, decorationHeight; +void setup_screen() +{ + TPokeMini_VideoSpec *videospec; + int depth; + + // Calculate size based of zoom + if (clc_zoom == 1) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video1x1; + PMWidth = 192; PMHeight = 128; PMOffX = 48; PMOffY = 32; UIOffX = 0; UIOffY = 0; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 208; PMHeight = 144; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 304; PMHeight = 208; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 400; PMHeight = 272; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 496; PMHeight = 336; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(480, 320, PokeMini_BGR16, (uint8_t *)PokeMini_BG5, (uint16_t *)PokeMini_BG5_PalBGR16, (uint32_t *)PokeMini_BG5_PalBGR32); + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 592; PMHeight = 400; PMOffX = 8; PMOffY = 8; UIOffX = 8; UIOffY = 8; + UIMenu_SetDisplay(576, 384, PokeMini_BGR16, (uint8_t *)PokeMini_BG6, (uint16_t *)PokeMini_BG6_PalBGR16, (uint32_t *)PokeMini_BG6_PalBGR32); + } + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, clc_bpp, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + fprintf(stderr, "Couldn't set video spec from %i bpp\n", clc_bpp); + exit(1); + } + clc_bpp = depth; + + // (Re)create window + if (renderer) { + SDL_DestroyRenderer(renderer); + renderer = NULL; + } + if (window) { + SDL_DestroyWindow(window); + window = NULL; + } + + SDL_Delay(200); + window = SDL_CreateWindow(AppName, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, PMWidth, PMHeight, SDL_WINDOW_RESIZABLE | (clc_fullscreen ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0)); + if (window == NULL) { + fprintf(stderr, "Couldn't create SDL window: %s\n", SDL_GetError()); + exit(1); + } + renderer = SDL_CreateRenderer(window, -1, 0); + if (renderer == NULL) { + fprintf(stderr, "Couldn't create SDL renderer: %s\n", SDL_GetError()); + exit(1); + } + + // (Re)Create texture + if (texture != NULL) { + SDL_DestroyTexture(texture); + } + texture = SDL_CreateTexture(renderer, (depth == 32) ? SDL_PIXELFORMAT_ARGB8888 : SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STREAMING, PMWidth, PMHeight); + if (texture == NULL) { + fprintf(stderr, "Couldn't create texture: %s\n", SDL_GetError()); + exit(1); + } + SDL_SetWindowSize(window, PMWidth + decorationWidth, PMHeight + decorationHeight); +} + +// Capture screen +void capture_screen() +{ + FILE *capf; + int y, capnum; + unsigned long Video[96*64]; + PokeMini_VideoPreview_32((uint32_t *)Video, 96, PokeMini_LCDMode); + capf = OpenUnique_ExportBMP(&capnum, 96, 64); + if (!capf) { + fprintf(stderr, "Error while saving capture\n"); + return; + } + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&Video[(63-y) * 96], 96); + } + printf("Capture saved at 'snap_%03d.bmp'\n", capnum); + Close_ExportBMP(capf); +} + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_KEYDOWN: + if (event->key.keysym.sym == SDLK_F9) { // Capture screen + capture_screen(); + } else if ((event->key.keysym.mod & KMOD_ALT) && (event->key.keysym.sym == SDLK_RETURN)) { + clc_fullscreen = !clc_fullscreen; + setup_screen(); + UIItems_PlatformC(0, UIMENU_LOAD); + } else if (event->key.keysym.sym == SDLK_F10) { // Fullscreen/Window + clc_fullscreen = !clc_fullscreen; + setup_screen(); + UIItems_PlatformC(0, UIMENU_LOAD); + } else if (event->key.keysym.sym == SDLK_F11) { // Disable speed throttling + emulimiter = !emulimiter; + } else if (event->key.keysym.sym == SDLK_TAB) { // Temp disable speed throttling + emulimiter = 0; + } else { + KeyboardPressEvent(event->key.keysym.sym); + } + break; + case SDL_KEYUP: + if (event->key.keysym.sym == SDLK_TAB) { // Speed threhold + emulimiter = 1; + } else { + KeyboardReleaseEvent(event->key.keysym.sym); + } + break; + case SDL_JOYBUTTONDOWN: + JoystickButtonsEvent(event->jbutton.button, 1); + break; + case SDL_JOYBUTTONUP: + JoystickButtonsEvent(event->jbutton.button, 0); + break; + case SDL_JOYAXISMOTION: + JoystickAxisEvent(event->jaxis.axis & 1, event->jaxis.value); + break; + case SDL_JOYHATMOTION: + JoystickHatsEvent(event->jhat.value); + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesS16((int16_t *)stream, len>>1); + if (clc_dump_sound[0]) WriteS16A_ExportWAV(sdump, (int16_t *)stream, len>>1); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Callback when joystick is re-opened +void reopen_joystick(int enable, int index) +{ + if (haptic) { + SDL_HapticClose(haptic); + haptic = NULL; + } + if (joystick) { + SDL_JoystickClose(joystick); + joystick = NULL; + } + if (enable && (SDL_NumJoysticks() > 0)) { + SDL_JoystickEventState(SDL_ENABLE); + joystick = SDL_JoystickOpen(index); // Open joystick + if (joystick) { + printf("Opened joystick: %s\n", SDL_JoystickName(joystick)); + haptic = SDL_HapticOpenFromJoystick(joystick); + if (haptic) { + printf(" Rumble support: %s\n", SDL_HapticRumbleSupported(haptic) ? "Yes" : "No"); + SDL_HapticRumbleInit(haptic); + } else { + printf(" Rumble support: Haptic not supported\n"); + } + printf("\n"); + } + } +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + void *pixscreen; + int pixpitch, uioff; + + // Update window's title and stop sound + SDL_SetWindowTitle(window, AppName); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(16); + + // Process UI + UIMenu_Process(); + + // Screen rendering + if (SDL_LockTexture(texture, NULL, &pixscreen, &pixpitch) >= 0) { + // Clear texture + memset(pixscreen, 0, PMHeight * pixpitch); + + // Setup pitch in pixel size and screen offset + if (clc_bpp == 32) { + pixpitch >>= 2; + } else { + pixpitch >>= 1; + } + uioff = (UIOffY * pixpitch) + UIOffX; + + // Render the menu or the game screen + if (PokeMini_VideoDepth == 32) + UIMenu_Display_32((uint32_t *)pixscreen + uioff, pixpitch); + else + UIMenu_Display_16((uint16_t *)pixscreen + uioff, pixpitch); + + // Unlock texture + SDL_UnlockTexture(texture); + } + + // Render texture to screen + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Event event; + char title[256]; + char fpstxt[16]; + void *pixscreen; + int bytpitch, pixpitch, pmoff; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", "pokemini_sdl2.cfg", CustomConf); + if (!CommandLineArgs(argc, argv, CustomArgs)) { + PrintHelpUsage(stdout); + printf(" -dumpsound sound.wav Dump sound into a WAV file\n"); + printf(" -windowed Display in window (default)\n"); + printf(" -fullscreen Display in fullscreen\n"); + printf(" -displayfps Display FPS counter on screen\n"); + printf(" -zoom n Zoom display: 1 to 6 (def 4)\n"); + printf(" -bpp n Bits-Per-Pixel: 16 or 32 (def 16)\n"); + return 1; + } + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + return 1; + } + SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"); + atexit(SDL_Quit); // Clean up on exit + + // Initialize the display + setup_screen(); + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_S16; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Open WAV capture if was requested + if (clc_dump_sound[0]) { + sdump = Open_ExportWAV(clc_dump_sound, EXPORTWAV_44KHZ | EXPORTWAV_MONO | EXPORTWAV_16BITS); + if (!sdump) { + fprintf(stderr, "Error opening sound export file.\n"); + return 1; + } + } + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSNDBUFFER)) { + fprintf(stderr, "Error while initializing emulator\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + KeyboardRemap(&KeybMapSDL2); + JoystickUpdateCallback(reopen_joystick); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickFPS = 0, NewTickSync = 0; + int fps = 72, fpscnt = 0, oldrumbling = 0; + while (emurunning) { + // Emulate and syncronize + time = SDL_GetTicks(); + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + if (emulimiter) while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + PokeMini_EmulateFrame(); + if (emulimiter) { + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + } + + // Screen rendering + if (SDL_LockTexture(texture, NULL, &pixscreen, &bytpitch) >= 0) { + // Clear texture + memset(pixscreen, 0, PMHeight * bytpitch); + + // Setup pitch in pixel size and screen offset + if (clc_bpp == 32) { + pmoff = (PMOffY * bytpitch) + (PMOffX << 2); + pixpitch = bytpitch >> 2; + } else { + pmoff = (PMOffY * bytpitch) + (PMOffX << 1); + pixpitch = bytpitch >> 1; + } + + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((void *)((uint8_t *)pixscreen + pmoff + PokeMini_GenRumbleOffset(bytpitch)), pixpitch); + } else { + PokeMini_VideoBlit((void *)((uint8_t *)pixscreen + pmoff), pixpitch); + } + if (haptic) { + if (!oldrumbling && PokeMini_Rumbling) { + if (SDL_HapticRumblePlay(haptic, 1.0f, 60000) < 0) { + printf("SDL failed: %s\n", SDL_GetError()); + } + } else if (oldrumbling && !PokeMini_Rumbling) { + SDL_HapticRumbleStop(haptic); + } + } + oldrumbling = PokeMini_Rumbling; + LCDDirty = 0; + + // Display FPS counter + if (clc_displayfps) { + if (PokeMini_VideoDepth == 32) + UIDraw_String_32((uint32_t *)pixscreen, pixpitch, 4, 4, 10, fpstxt, UI_Font1_Pal32); + else + UIDraw_String_16((uint16_t *)pixscreen, pixpitch, 4, 4, 10, fpstxt, UI_Font1_Pal16); + } + + // Unlock texture + SDL_UnlockTexture(texture); + } + + // Render texture to screen + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_RenderPresent(renderer); + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // calculate FPS + fpscnt++; + if (time >= NewTickFPS) { + fps = fpscnt; + sprintf(title, "%s - %d%%", AppName, fps * 100 / 72); + sprintf(fpstxt, "%i FPS", fps); + SDL_SetWindowTitle(window, title); + NewTickFPS = time + 1000; + fpscnt = 0; + } + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Close WAV capture if there's one + if (clc_dump_sound[0]) Close_ExportWAV(sdump); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Close joystick + if (haptic) SDL_HapticClose(haptic); + if (joystick) SDL_JoystickClose(joystick); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile new file mode 100644 index 0000000000..ef262d252c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile @@ -0,0 +1,124 @@ +# PokeMini Makefile for SDL 2.x (Linux) + +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS += -Wall `$(SDL_BASE)sdl2-config --cflags` $(INCLUDE) +SLFLAGS += `$(SDL_BASE)sdl2-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_SDL2.o \ + sourcex/KeybMapSDL2.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG2.o \ + resource/PokeMini_BG3.o \ + resource/PokeMini_BG4.o \ + resource/PokeMini_BG5.o \ + resource/PokeMini_BG6.o + +DEPENDS = \ + sourcex/KeybMapSDL2.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG2.h \ + resource/PokeMini_BG3.h \ + resource/PokeMini_BG4.h \ + resource/PokeMini_BG5.h \ + resource/PokeMini_BG6.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(CC) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + +win: + make -f makefile.win + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile.old b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile.old new file mode 100644 index 0000000000..24d0e17b50 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile.old @@ -0,0 +1,132 @@ +# PokeMini Makefile for SDL 2 + +CC = gcc +LD = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = PokeMini + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl2-config --cflags` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl2-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_SDL2.o \ + sourcex/KeybMapSDL2.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG2.o \ + resource/PokeMini_BG3.o \ + resource/PokeMini_BG4.o \ + resource/PokeMini_BG5.o \ + resource/PokeMini_BG6.o + +DEPENDS = \ + sourcex/KeybMapSDL2.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG2.h \ + resource/PokeMini_BG3.h \ + resource/PokeMini_BG4.h \ + resource/PokeMini_BG5.h \ + resource/PokeMini_BG6.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile.win b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile.win new file mode 100644 index 0000000000..e1590111f7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/sdl2/makefile.win @@ -0,0 +1,124 @@ +# PokeMini Makefile for SDL 2.x (Mingw) + +CC = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build + +WINTARGET = PokeMini.exe +WINRES_TRG = $(BUILD)/pokemini_rc.o +WINRES_SRC = $(POKEROOT)resource/pokemini.rc + +CFLAGS = -O -Wall `$(SDL_BASE)sdl2-config --cflags` $(INCLUDE) +SLFLAGS = -O `$(SDL_BASE)sdl2-config --libs` -lm -lz + +INCDIRS = source sourcex resource freebios dependencies/minizip + +OBJS = \ + PokeMini_SDL2.o \ + sourcex/KeybMapSDL2.o \ + sourcex/ExportBMP.o \ + sourcex/ExportWAV.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x1.o \ + source/Video_x2.o \ + source/Video_x3.o \ + source/Video_x4.o \ + source/Video_x5.o \ + source/Video_x6.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + source/Keyboard.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG2.o \ + resource/PokeMini_BG3.o \ + resource/PokeMini_BG4.o \ + resource/PokeMini_BG5.o \ + resource/PokeMini_BG6.o + +DEPENDS = \ + sourcex/KeybMapSDL2.h \ + sourcex/ExportBMP.h \ + sourcex/ExportWAV.h \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x1.h \ + source/Video_x2.h \ + source/Video_x3.h \ + source/Video_x4.h \ + source/Video_x5.h \ + source/Video_x6.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + source/Keyboard.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG2.h \ + resource/PokeMini_BG3.h \ + resource/PokeMini_BG4.h \ + resource/PokeMini_BG5.h \ + resource/PokeMini_BG6.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(WINTARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(CC) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + +clean: + -rm -f $(BUILDOBJS) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.gpe b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.gpe new file mode 100644 index 0000000000..6cac4881c4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.gpe @@ -0,0 +1,11 @@ +#!/bin/sh + +sync +echo 3 > /proc/sys/vm/drop_caches + +./PokeMini 1>./stdout.txt 2>./stderr.txt +/mnt/nand/logview ./stderr.txt ./stdout.txt + +sync +cd /usr/gp2x +exec ./gp2xmenu diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.ini b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.ini new file mode 100644 index 0000000000..43cf9cd9af --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.ini @@ -0,0 +1,4 @@ +[info] +name="PokeMini (uWIZ Lib)" +path="/PokeMini/PokeMini.gpe" +icon="/PokeMini/PokeMini.png" diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.png b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.png new file mode 100644 index 0000000000..1e12b2ef66 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini32.png b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini32.png new file mode 100644 index 0000000000..e159c67914 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini32.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini_uWIZ.c b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini_uWIZ.c new file mode 100644 index 0000000000..7e9228088c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/PokeMini_uWIZ.c @@ -0,0 +1,316 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" + +#include "Video_x3.h" +#include "PokeMini_BG3.h" + +const char *AppName = "PokeMini " PokeMini_Version " WIZ (uWIZ Lib)"; + +// Fragments +#define FSOUNDBUFFER 4 +// Block size in bits +#define BSOUNDBUFFER 12 +// PM sound buffer size +#define PMSNDBUFFER 8192 + +// -------- + +// Joystick names and mapping (NEW IN 0.5.0) +char *WIZ_KeysNames[] = { + "Off", // -1 + "Up", // 0 + "Unused 1", // 1 + "Left", // 2 + "Unused 2", // 3 + "Down", // 4 + "Unused 3", // 5 + "Right", // 6 + "Unused 4", // 7 + "Menu", // 8 + "Select", // 9 + "L", // 10 + "R", // 11 + "A", // 12 + "B", // 13 + "X", // 14 + "Y" // 15 +}; +int WIZ_KeysMapping[] = { + 8, // Menu + 13, // A + 14, // B + 11, // C + 0, // Up + 4, // Down + 2, // Left + 6, // Right + 9, // Power + 10 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_fpscounter = 1; +const TCommandLineCustom CustomConf[] = { + { "fpscounter", &clc_fpscounter, COMMANDLINE_BOOL }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "FPS Counter: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // FPS Counter + clc_fpscounter = !clc_fpscounter; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // FPS Counter + clc_fpscounter = !clc_fpscounter; + break; + case 9: // Define joystick + JoystickEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "FPS Counter: %s", clc_fpscounter ? "Yes" : "No"); + return 1; +} + +// For the emulator loop and video +int emurunning = 1; +uint16_t *VIDEO; + +// Handle keys +void HandleKeys() +{ + uint32_t keys; + uWIZ_scankeys(); + keys = uWIZ_keysheld(); + if (UI_Status) keys = uWIZ_keysdownrepeat(); // Allow key repeat inside menu + JoystickBitsEvent(keys); +} + +// Used to fill the sound buffer +void sound_callback(signed short *sound, int samples) +{ + MinxAudio_GetSamplesS16((int16_t *)sound, samples); + uWIZ_yieldthread(); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + // Enable asyncronous sound filling (using a thread) + if (!uWIZ_soundenable(sound, (uWIZ_soundcallback)sound_callback)) { + fprintf(stderr, "Sound async failed.\n"); + } +} + +// Menu loop +void menuloop() +{ + // Stop sound + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + uWIZ_fillscreen(0x0000); + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + uWIZ_simulatevsync(uWIZ_60fps); + + // Handle keys + HandleKeys(); + + // Process UI + UIMenu_Process(); + + // Screen rendering + UIMenu_Display_16((uint16_t *)VIDEO, 320); + + // Render to screen + uWIZ_render(); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); +} + +// Main function +int main(int argc, char **argv) +{ + int fpscnt = 0, currtick = 0, nexttick = 0; + char fpsstr[16]; + int battimeout = 0; + int err; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLine.low_battery = 2; // libuwiz can report battery status + CommandLineConfFile("pokemini.cfg", "pokemini_uwiz.cfg", CustomConf); + if (!CommandLineArgs(argc, argv, NULL)) { + PrintHelpUsage(stdout); + return 1; + } + JoystickSetup("WIZ", 0, 0, WIZ_KeysNames, 16, WIZ_KeysMapping); + + // Initialize lib + if ((err = uWIZ_init()) < 0) { + fprintf(stderr, "Error %d.\n", err); + exit(1); + } + VIDEO = uWIZ_fb16 + (24 * 320) + 16; + uWIZ_setrepeat(30, 8); + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video3x3, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + + // Setup 44Khz Mono (Output is always Signed 16-Bits) + if (!uWIZ_soundsetup(44100, 1, FSOUNDBUFFER, BSOUNDBUFFER)) { // Setup sound + fprintf(stderr, "Sound setup failed.\n"); + } + uWIZ_setvolume(64); + uWIZ_autovolume(1); + + // Create emulator and load test roms + printf("Starting emulator...\n"); + PokeMini_Create(POKEMINI_AUTOBATT, PMSNDBUFFER); + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Starting emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + while (emurunning) { + // Emulate and syncronize + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) uWIZ_yieldthread(); + } else { + PokeMini_EmulateFrame(); + uWIZ_simulatevsync(1000000/72); // Aprox 72 times per sec + } + + // Screen rendering + uWIZ_fillscreen(0x0000); + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((uint16_t *)VIDEO + PokeMini_GenRumbleOffset(320), 320); + } else { + PokeMini_VideoBlit((uint16_t *)VIDEO, 320); + } + + LCDDirty = 0; + + // FPS counter + if (clc_fpscounter) { + currtick = uWIZ_getticks32(); + if (currtick >= nexttick) { + nexttick = currtick + 1000; + sprintf(fpsstr, "%3d fps", fpscnt); + fpscnt = 0; + } else fpscnt++; + uWIZ_basprint(12, 8, 0xFFFF, fpsstr); + } + + // Handle keys + HandleKeys(); + + // Render to screen + uWIZ_render(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // Check battery + if (battimeout <= 0) { + PokeMini_LowPower(uWIZ_getbatterylevel() >= uWIZ_BATT_LOW); + battimeout = 600; + } + } + + // Stop sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Disable async. filling + uWIZ_soundenable(0, NULL); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Close lib + uWIZ_end(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/libgcc_s.so.1 b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/libgcc_s.so.1 new file mode 100644 index 0000000000..fc4ee13e02 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/libgcc_s.so.1 differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/libuwiz.so.0 b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/libuwiz.so.0 new file mode 100644 index 0000000000..435a61b467 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/libuwiz.so.0 differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/makefile new file mode 100644 index 0000000000..d57945da01 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/uwiz/makefile @@ -0,0 +1,106 @@ +# PokeMini Makefile for WIZ + +OPENWIZ = /opt/arm-openwiz-linux-gnu +HOST = arm-openwiz-linux-gnu- + +ifeq ($(OPENWIZ),) +CC = $(HOST)gcc +LD = $(HOST)gcc +STRIP = $(HOST)strip +else +CC = $(OPENWIZ)/bin/$(HOST)gcc +LD = $(OPENWIZ)/bin/$(HOST)gcc +STRIP = $(OPENWIZ)/bin/$(HOST)strip +endif + +BUILD = Build +TARGET = PokeMini +POKEROOT = ../../ + +CFLAGS = -O2 -Wall -I$(OPENWIZ)/include $(INCLUDE) -DPERFORMANCE +SLFLAGS = -O2 -L$(OPENWIZ)/lib -Wl,-rpath,$(OPENWIZ)/lib -lm -lz -luwiz -lpthread + +INCDIRS = source resource freebios dependencies/minizip + +OBJS = \ + PokeMini_uWIZ.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x3.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG3.o + +DEPENDS = \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x3.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG3.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) + -rmdir --ignore-fail-on-non-empty $(BUILD) + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wii/PokeMini_Wii.c b/PVPokeMini/PokeMini/pokemini-code/platform/wii/PokeMini_Wii.c new file mode 100644 index 0000000000..fc37ff5142 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/wii/PokeMini_Wii.c @@ -0,0 +1,577 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" + +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" +#include "PokeMini_BG2.h" +#include "PokeMini_BG3.h" +#include "PokeMini_BG4.h" +#include "PokeMini_BG5.h" +#include "PokeMini_BG6.h" + +const char *AppName = "PokeMini " PokeMini_Version " Wii"; + +#define DEFAULT_FIFO_SIZE (256*1024) +#define STACKSIZE (8192) + +int emurunning = 1; +int PMWidth, PMHeight; +int PixPitch; + +GXRModeObj *rmode; +static void *xfb = NULL; +GXTexObj vbuf_tex; +u16 *vbuf = NULL; +u16 *vbuftiled = NULL; +int vbuf_w, vbuf_h, vbuf_t; +float vbuf_fnw, vbuf_fnh; + +static lwp_t h_snd = LWP_THREAD_NULL; +static u8 h_snd_stack[STACKSIZE]; +static s16 *h_snd_buffer[2] = {NULL, NULL}; +static int h_snd_ptr = 0; +static int h_snd_mode = 0; + +void setup_screen(); + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) + +const char *clc_zoom_txt[] = { + "0x (Illegal)", + "1x ( 96x 64)", + "2x (192x128)", + "3x (288x192)", + "4x (384x256)", + "5x (480x320)", + "6x (576x384)", +}; + +// Joystick names and mapping (NEW IN 0.5.0) +char *Wii_KeysNames[] = { + "Off", // -1 + "Mote 2", // 0 + "Mote 1", // 1 + "Mote B", // 2 + "Mote A", // 3 + "Mote -", // 4 + NULL, // 5 + NULL, // 6 + NULL, // 7 + "Mote Left", // 8 + "Mote Right", // 9 + "Mote Down", // 10 + "Mote Up", // 11 + "Mote +", // 12 + NULL, // 13 + NULL, // 14 + NULL, // 15 + "N.Z/C.Up", // 16 + "N.C/C.Left", // 17 + "Classic ZR", // 18 + "Classic X", // 19 + "Classic A", // 20 + "Classic Y", // 21 + "Classic B", // 22 + "Classic ZL", // 23 + NULL, // 24 + "Classic FR", // 25 + "Classic +", // 26 + "Classic H", // 27 + "Classic -", // 28 + "Classic FL", // 29 + "C.Down", // 30 + "C.Right", // 31 +}; +int Wii_KeysMapping[] = { + 1, // Menu + 3, // A + 2, // B + 12, // C + 11, // Up + 10, // Down + 8, // Left + 9, // Right + 0, // Power + 4 // Shake +}; + +// Custom command line (NEW IN 0.5.0) +int clc_zoom = 4; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 2, 6 }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 1, "Zoom: %s", UIItems_PlatformC }, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + int zoomchanged = 0; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: // Zoom + clc_zoom--; + if (clc_zoom < 2) clc_zoom = 6; + zoomchanged = 1; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: // Zoom + clc_zoom++; + if (clc_zoom > 6) clc_zoom = 2; + zoomchanged = 1; + break; + case 9: // Define keys... + JoystickEnterMenu(); + break; + } + } + UIMenu_ChangeItem(UIItems_Platform, 1, "Zoom: %s", clc_zoom_txt[clc_zoom]); + if (zoomchanged) { + setup_screen(); + return 0; + } + return 1; +} + +// A helper to calculate the power of 2 needed by the texture +static inline int getpow2siz16(int n) +{ + n--; + n |= n >> 8; + n |= n >> 4; + n |= n >> 2; + n |= n >> 1; + return n + 1; +} + +// Setup screen +void setup_screen() +{ + TPokeMini_VideoSpec *videospec; + int depth; + + // Calculate size based of zoom + if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 192; PMHeight = 128; + UIMenu_SetDisplay(192, 128, PokeMini_BGR16, (uint8_t *)PokeMini_BG2, (uint16_t *)PokeMini_BG2_PalBGR16, (uint32_t *)PokeMini_BG2_PalBGR32); + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 288; PMHeight = 192; + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 384; PMHeight = 256; + UIMenu_SetDisplay(384, 256, PokeMini_BGR16, (uint8_t *)PokeMini_BG4, (uint16_t *)PokeMini_BG4_PalBGR16, (uint32_t *)PokeMini_BG4_PalBGR32); + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 480; PMHeight = 320; + UIMenu_SetDisplay(480, 320, PokeMini_BGR16, (uint8_t *)PokeMini_BG5, (uint16_t *)PokeMini_BG5_PalBGR16, (uint32_t *)PokeMini_BG5_PalBGR32); + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 576; PMHeight = 384; + UIMenu_SetDisplay(576, 384, PokeMini_BGR16, (uint8_t *)PokeMini_BG6, (uint16_t *)PokeMini_BG6_PalBGR16, (uint32_t *)PokeMini_BG6_PalBGR32); + } + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, 16, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + fprintf(stderr, "Couldn't set video spec from 16 bpp\n"); + exit(1); + } + + // Set video mode + vbuf_w = getpow2siz16(PMWidth); + vbuf_fnw = (float)PMWidth / (float)vbuf_w; + vbuf_h = getpow2siz16(PMHeight); + vbuf_fnh = (float)PMHeight / (float)vbuf_h; + vbuf_t = vbuf_w * vbuf_h; + GX_InvVtxCache(); + GX_InvalidateTexAll(); + if (vbuf) { + free(vbuf); + vbuf = NULL; + } + vbuf = MEM_K0_TO_K1(memalign(32, vbuf_t * 2)); + if (vbuftiled) { + free(vbuftiled); + vbuftiled = NULL; + } + vbuftiled = MEM_K0_TO_K1(memalign(32, vbuf_t * 2)); + GX_InitTexObj(&vbuf_tex, vbuftiled, vbuf_w, vbuf_h, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, 0); + + // Calculate pitch and offset + PixPitch = vbuf_w; +} + +// Render graphics +void rendergraphics(int offset, int waitvsync) +{ + int x, y, phy, vbuf_wZ; + u16 *vbt, *vb = vbuf; + static float ffoffsetT[8] = { + -0.04f, -0.03f, -0.02f, -0.01f, + 0.00f, 0.01f, 0.02f, 0.03f, + }; + float ffoffset = ffoffsetT[offset+4]; + float varea = 0.85f; + + vbuf_wZ = vbuf_w >> 2; + for (y=0; y> 2) * vbuf_wZ) << 4) | ((y & 3) << 2); + for (x=0; xviTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); + + // Setup the fifo and then init the flipper + void *gp_fifo = NULL; + gp_fifo = MEM_K0_TO_K1(memalign(32, DEFAULT_FIFO_SIZE)); + memset(gp_fifo, 0, DEFAULT_FIFO_SIZE); + GX_Init(gp_fifo, DEFAULT_FIFO_SIZE); + + // Clears the bg to color and clears the z buffer + GXColor background = {0, 0, 0, 0xff}; + GX_SetCopyClear(background, 0x00ffffff); + + // Other GX setup + GX_SetViewport(0, 0, rmode->fbWidth,rmode->efbHeight, 0, 1); + yscale = GX_GetYScaleFactor(rmode->efbHeight, rmode->xfbHeight); + xfbHeight = GX_SetDispCopyYScale(yscale); + GX_SetScissor(0, 0, rmode->fbWidth, rmode->efbHeight); + GX_SetDispCopySrc(0, 0, rmode->fbWidth, rmode->efbHeight); + GX_SetDispCopyDst(rmode->fbWidth, xfbHeight); + GX_SetCopyFilter(rmode->aa, rmode->sample_pattern, GX_TRUE, rmode->vfilter); + GX_SetFieldMode(rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); + if (rmode->aa) + GX_SetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR); + else + GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); + GX_SetCullMode(GX_CULL_NONE); + GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GX_SetColorUpdate(GX_TRUE); + GX_CopyDisp(xfb, GX_TRUE); + GX_SetDispCopyGamma(GX_GM_1_0); + + // setup the vertex descriptor and attribute table + GX_ClearVtxDesc(); + GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); + GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + + // Setup the TEV combiner operation + GX_SetNumChans(0); + GX_SetNumTexGens(1); + GX_SetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY); + GX_SetTevOp(GX_TEVSTAGE0, GX_REPLACE); + GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); + + // setup our projection matrix + guOrtho(projection, -1.0f, 1.0f, -1.0f, 1.0f, 0, 10.0f); + GX_LoadProjectionMtx(projection, GX_ORTHOGRAPHIC); + + // Initialize fat lib + if (!fatInitDefault()) { + printf("fatInitDefault failure: terminating\n"); + //exit(0); + } + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs("/PokeMini", NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", "pokemini_wii.cfg", CustomConf); + JoystickSetup("WII", 0, 30000, Wii_KeysNames, 32, Wii_KeysMapping); + + // Initialize the display + setup_screen(); + + // Initialize the sound + h_snd_buffer[0] = (s16 *)memalign(32, SOUNDBUFFER); + memset(h_snd_buffer[0], 0, SOUNDBUFFER); + h_snd_buffer[1] = (s16 *)memalign(32, SOUNDBUFFER); + memset(h_snd_buffer[1], 0, SOUNDBUFFER); + if (LWP_CreateThread(&h_snd, (void *)snd_thread, NULL, h_snd_stack, STACKSIZE, 80) == -1) { + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSNDBUFFER)) { + fprintf(stderr, "Error while initializing emulator\n"); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Running emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickSync = 0; + while (emurunning) { + // Emulate and syncronize + time = gettickscount(); + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) usleep(1000); + } else { + PokeMini_EmulateFrame(); + do { + usleep(1000); + time = gettickscount(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + + // Screen rendering + PokeMini_VideoBlit(vbuf, PixPitch); + if (PokeMini_Rumbling) { + rendergraphics(PokeMini_GenRumbleOffset(1), 0); + } else { + rendergraphics(0, 0); + } + LCDDirty = 0; + + // Handle inputs + HandleInputs(); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + + // calculate FPS + // TODO + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Wait for thread to finish + if(h_snd != LWP_THREAD_NULL) + { + LWP_JoinThread(h_snd, NULL); + h_snd = LWP_THREAD_NULL; + } + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Free up memory + if (vbuf) free(vbuf); + if (vbuftiled) free(vbuftiled); + if (h_snd_buffer[0]) free(h_snd_buffer[0]); + if (h_snd_buffer[1]) free(h_snd_buffer[1]); + + exit(0); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wii/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/wii/makefile new file mode 100644 index 0000000000..8c25d64c01 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/wii/makefile @@ -0,0 +1,179 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +# prevent deletion of implicit targets +#--------------------------------------------------------------------------------- +.SECONDARY: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/wii_rules + +POKEROOT = ../../ + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := PokeMini +BUILD := build +SOURCES := $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios $(POKEROOT)sourcex $(POKEROOT)dependencies/zlib $(POKEROOT)dependencies/minizip . +DATA := +INCLUDES := $(POKEROOT)source $(POKEROOT)resource $(POKEROOT)freebios $(POKEROOT)sourcex $(POKEROOT)dependencies/zlib $(POKEROOT)dependencies/minizip + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lwiiuse -lbte -lfat -lasnd -logc -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + + +export DEPSDIR := $(CURDIR)/$(BUILD) + +# Only include what's really needed +CFILES := PokeMini_Wii.c \ + freebios/freebios.c \ + source/PMCommon.c \ + source/PokeMini.c \ + source/Multicart.c \ + source/Hardware.c \ + source/Video.c \ + source/Video_x1.c \ + source/Video_x2.c \ + source/Video_x3.c \ + source/Video_x4.c \ + source/Video_x5.c \ + source/Video_x6.c \ + source/CommandLine.c \ + source/MinxCPU.c \ + source/MinxCPU_XX.c \ + source/MinxCPU_CE.c \ + source/MinxCPU_CF.c \ + source/MinxCPU_SP.c \ + source/MinxTimers.c \ + source/MinxIO.c \ + source/MinxIRQ.c \ + source/MinxPRC.c \ + source/MinxColorPRC.c \ + source/MinxLCD.c \ + source/MinxAudio.c \ + source/UI.c \ + source/Joystick.c \ + dependencies/minizip/unzip.c \ + dependencies/minizip/ioapi.c \ + dependencies/zlib/adler32.o \ + dependencies/zlib/crc32.o \ + dependencies/zlib/inffast.o \ + dependencies/zlib/inflate.o \ + dependencies/zlib/inftrees.o \ + dependencies/zlib/zutil.o \ + sourcex/Zip64comp.c \ + resource/PokeMini_ColorPal.c \ + resource/PokeMini_Font12.c \ + resource/PokeMini_Icons12.c \ + resource/PokeMini_BG2.c \ + resource/PokeMini_BG3.c \ + resource/PokeMini_BG4.c \ + resource/PokeMini_BG5.c \ + resource/PokeMini_BG6.c + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(notdir $(CFILES)) +# CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol +#--------------------------------------------------------------------------------- +run: + wiiload $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +else + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +-include $(DEPSDIR)/*.d + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend.c new file mode 100644 index 0000000000..a4c06a00a0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend.c @@ -0,0 +1,30 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "AudioRend.h" + +TAudioRend *AudioRend = NULL; + +void AudioRend_Set(int index) +{ + switch (index) { + default: // DirectSound + AudioRend = (TAudioRend *)&AudioRend_DSound; + break; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend.h new file mode 100644 index 0000000000..a64aa556ed --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include + +typedef void (*AudioRend_Callback)(unsigned char *buf, int len); + +typedef struct { + // Audio was initialized? + int (*WasInit)(); + + // Audio initialize, return if was successful + int (*Init)(HWND hWnd, int freq, int bits, int channels, int buffsize, AudioRend_Callback callback); + + // Audio terminate + void (*Terminate)(); + + // Audio enable stream? + void (*Enable)(int play); +} TAudioRend; + +extern TAudioRend *AudioRend; + +extern const TAudioRend AudioRend_DSound; + +void AudioRend_Set(int index); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend_DSound.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend_DSound.c new file mode 100644 index 0000000000..4bf8f05989 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/AudioRend_DSound.c @@ -0,0 +1,196 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "AudioRend.h" + +// Local variables +static int RendWasInit = 0; +static int RendWasIsPlaying = 0; +static int RendBuffblock = 0; +static int RendBuffsize = 0; +static HANDLE RendThread = NULL; +static volatile int RendThreadRun = 0; +static AudioRend_Callback RendCallback = NULL; +static LPDIRECTSOUND pDS = NULL; +static LPDIRECTSOUNDBUFFER pDSBP = NULL; +static LPDIRECTSOUNDBUFFER pDSBS = NULL; +static WAVEFORMATEX Wavf; +static int SndNextWriteOffset = 0; + +// Prototypes +int AudioRend_DSound_WasInit(void); +int AudioRend_DSound_Init(HWND hWnd, int freq, int bits, int channels, int buffsize, AudioRend_Callback callback); +void AudioRend_DSound_Terminate(void); +void AudioRend_DSound_Enable(int play); + +// Audio was initialized? +int AudioRend_DSound_WasInit(void) +{ + return RendWasInit; +} + +// Audio initialize, return if was successful +int AudioRend_DSound_Init(HWND hWnd, int freq, int bits, int channels, int buffsize, AudioRend_Callback callback) +{ + WAVEFORMATEX pcmwf; + DSBUFFERDESC dsbdesc; + + // Create and set cooperative level + if FAILED(DirectSoundCreate(NULL, &pDS, NULL)) { + MessageBox(0, "DirectSoundCreate() Failed", "DirectSound", MB_OK | MB_ICONERROR); + AudioRend_DSound_Terminate(); + return 0; + } + if FAILED(IDirectSound_SetCooperativeLevel(pDS, hWnd, DSSCL_EXCLUSIVE)) { + MessageBox(0, "SetCooperativeLevel Failed", "DirectSound", MB_OK | MB_ICONERROR); + AudioRend_DSound_Terminate(); + return 0; + } + + // Create the primary buffer and set the format + ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC)); + dsbdesc.dwSize = sizeof(DSBUFFERDESC); + dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER; + if FAILED(IDirectSound_CreateSoundBuffer(pDS, &dsbdesc, &pDSBP, NULL)) { + MessageBox(0, "CreateSoundBuffer Failed", "DirectSound", MB_OK | MB_ICONERROR); + AudioRend_DSound_Terminate(); + return 0; + } + ZeroMemory(&pcmwf, sizeof(PCMWAVEFORMAT)); + pcmwf.wFormatTag = WAVE_FORMAT_PCM; + pcmwf.nChannels = channels; + pcmwf.nSamplesPerSec = freq; + pcmwf.wBitsPerSample = bits; + pcmwf.nBlockAlign = (unsigned short)(((unsigned short)pcmwf.nChannels * (unsigned short)pcmwf.wBitsPerSample) / 8); + pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign; + if FAILED(IDirectSoundBuffer_SetFormat(pDSBP, &pcmwf)) { + MessageBox(0, "SetFormat Failed", "DirectX", MB_OK | MB_ICONERROR); + AudioRend_DSound_Terminate(); + return 0; + } + + // Create the secondary buffer + dsbdesc.dwSize = sizeof(DSBUFFERDESC); + dsbdesc.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS; + dsbdesc.dwBufferBytes = buffsize*2; + dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf; + if FAILED(IDirectSound_CreateSoundBuffer(pDS, &dsbdesc, &pDSBS, NULL)) { + MessageBox(0, "CreateSoundBuffer 2 Failed", "DirectX", MB_OK | MB_ICONERROR); + AudioRend_DSound_Terminate(); + return 0; + } + + RendCallback = callback; + RendWasInit = 1; + RendWasIsPlaying = 0; + RendBuffblock = buffsize; + RendBuffsize = buffsize*2; + return 1; +} + +void AudioRend_DSound_Terminate(void) +{ + if (RendWasIsPlaying) AudioRend_DSound_Enable(0); + if (pDSBS) IDirectSoundBuffer_Release(pDSBS); + if (pDSBP) IDirectSoundBuffer_Release(pDSBP); + if (pDS) IDirectSound_Release(pDS); + RendWasInit = 0; +} + +// Calculate distance on a circular buffer +static int Sound_Distance(int play, int write) +{ + if (play > write) { + // Warparound + return (RendBuffsize - play) + write; + } else { + // Doesn't warp-around + return write - play; + } +} + +static DWORD WINAPI AudioRend_DSound_Thread(LPVOID lpParameter) +{ + int hr; + LPVOID pData1; + DWORD dwData1Size; + LPVOID pData2; + DWORD dwData2Size; + DWORD writep; + DWORD dwStatus; + + while (RendThreadRun) { + // Restore lost buffer + IDirectSoundBuffer_GetStatus(pDSBS, &dwStatus); + if (dwStatus && DSBSTATUS_BUFFERLOST) { + do { + hr = IDirectSoundBuffer_Restore(pDSBS); + if (hr == DSERR_BUFFERLOST) Sleep(10); + if (!RendThreadRun) return 0; + } while ((hr = IDirectSoundBuffer_Restore(pDSBS)) == DSERR_BUFFERLOST); + } + + // Wait until we sync the buffers + if (dwStatus && DSBSTATUS_PLAYING) { + do { + Sleep(20); + IDirectSoundBuffer_GetCurrentPosition(pDSBS, 0, &writep); + if (Sound_Distance(writep, SndNextWriteOffset) <= RendBuffblock) break; + } while (RendThreadRun); + } + + // Transfer the buffer data + IDirectSoundBuffer_Lock(pDSBS, SndNextWriteOffset, RendBuffblock, &pData1, &dwData1Size, &pData2, &dwData2Size, 0); + SndNextWriteOffset = (SndNextWriteOffset + RendBuffblock) % RendBuffsize; + if (RendCallback) RendCallback((void *)pData1, dwData1Size); + if (pData2) if (RendCallback) ((void *)pData2, dwData2Size); + IDirectSoundBuffer_Unlock(pDSBS, pData1, dwData1Size, pData2, dwData2Size); + } + + return 1; +} + +void AudioRend_DSound_Enable(int play) +{ + DWORD ThrID; + if (!RendWasInit) return; + if (play && !RendWasIsPlaying) { + // Clear the sound and start looping + IDirectSoundBuffer_SetCurrentPosition(pDSBS, 0); + IDirectSoundBuffer_Play(pDSBS, 0, 0, DSBPLAY_LOOPING); + RendThreadRun = 1; + RendThread = CreateThread(NULL, 0, AudioRend_DSound_Thread, NULL, 0, &ThrID); + } + if (!play && RendWasIsPlaying) { + RendThreadRun = 0; + WaitForSingleObject(RendThread, INFINITE); + IDirectSoundBuffer_Stop(pDSBS); + } + RendWasIsPlaying = play; +} + +// Video render driver +const TAudioRend AudioRend_DSound = { + AudioRend_DSound_WasInit, + AudioRend_DSound_Init, + AudioRend_DSound_Terminate, + AudioRend_DSound_Enable, +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomBright.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomBright.c new file mode 100644 index 0000000000..6cd5b13180 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomBright.c @@ -0,0 +1,80 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +#include "PokeMini.h" +#include "PokeMini_Win32.h" +#include "CustomBright.h" + +int newbright; + +static void SetTrackbarSpecs(HWND hWndDlg, int DlgID_T, int DlgID_S, int spos) +{ + char tmp[PMTMPV]; + SendDlgItemMessage(hWndDlg, DlgID_S, TBM_SETRANGE, FALSE, MAKELONG(0, 200)); + SendDlgItemMessage(hWndDlg, DlgID_S, TBM_SETPOS, TRUE, spos + 100); + sprintf_s(tmp, PMTMPV, "Bright: %i%%", spos); + SetDlgItemText(hWndDlg, DlgID_T, tmp); +} + +LRESULT CALLBACK CustomBright_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + int spos; + + switch(Msg) { + case WM_INITDIALOG: + SetWindowText(hWndDlg, "Set new brightness..."); + newbright = CommandLine.lcdbright; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOMSLIDERT, IDC_CUSTOMSLIDER, newbright); + return TRUE; + case WM_COMMAND: + switch(wParam) { + case IDOK: + CommandLine.lcdbright = newbright; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + EndDialog(hWndDlg, 1); + return TRUE; + case IDCANCEL: + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + EndDialog(hWndDlg, 0); + return TRUE; + } + break; + case WM_HSCROLL: + switch (GetDlgCtrlID((HWND)lParam)) { + case IDC_CUSTOMSLIDER: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOMSLIDER, TBM_GETPOS, 0, 0) - 100; + if ((spos >= -100) && (spos <= 100)) newbright = spos; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOMSLIDERT, IDC_CUSTOMSLIDER, newbright); + break; + } + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, newbright); + render_dummyframe(); + break; + } + + return FALSE; +} + +void CustomBright_Dialog(HINSTANCE hInst, HWND hParentWnd) +{ + DialogBox(hInst, MAKEINTRESOURCE(IDD_CUSTOMSLIDER), hParentWnd, (DLGPROC)CustomBright_DlgProc); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomBright.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomBright.h new file mode 100644 index 0000000000..1c95cd13a2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomBright.h @@ -0,0 +1,24 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include + +LRESULT CALLBACK CustomBright_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam); +void CustomBright_Dialog(HINSTANCE hInst, HWND hParentWnd); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomContrast.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomContrast.c new file mode 100644 index 0000000000..95d059b566 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomContrast.c @@ -0,0 +1,80 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +#include "PokeMini.h" +#include "PokeMini_Win32.h" +#include "CustomContrast.h" + +int newcontrast; + +static void SetTrackbarSpecs(HWND hWndDlg, int DlgID_T, int DlgID_S, int spos) +{ + char tmp[PMTMPV]; + SendDlgItemMessage(hWndDlg, DlgID_S, TBM_SETRANGE, FALSE, MAKELONG(0, 100)); + SendDlgItemMessage(hWndDlg, DlgID_S, TBM_SETPOS, TRUE, spos); + sprintf_s(tmp, PMTMPV, "Contrast: %i%%", spos); + SetDlgItemText(hWndDlg, DlgID_T, tmp); +} + +LRESULT CALLBACK CustomContrast_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + int spos; + + switch(Msg) { + case WM_INITDIALOG: + SetWindowText(hWndDlg, "Set new contrast..."); + newcontrast = CommandLine.lcdcontrast; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOMSLIDERT, IDC_CUSTOMSLIDER, newcontrast); + return TRUE; + case WM_COMMAND: + switch(wParam) { + case IDOK: + CommandLine.lcdcontrast = newcontrast; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + EndDialog(hWndDlg, 1); + return TRUE; + case IDCANCEL: + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + EndDialog(hWndDlg, 0); + return TRUE; + } + break; + case WM_HSCROLL: + switch (GetDlgCtrlID((HWND)lParam)) { + case IDC_CUSTOMSLIDER: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOMSLIDER, TBM_GETPOS, 0, 0); + if ((spos >= 0) && (spos <= 100)) newcontrast = spos; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOMSLIDERT, IDC_CUSTOMSLIDER, newcontrast); + break; + } + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, newcontrast, CommandLine.lcdbright); + render_dummyframe(); + break; + } + + return FALSE; +} + +void CustomContrast_Dialog(HINSTANCE hInst, HWND hParentWnd) +{ + DialogBox(hInst, MAKEINTRESOURCE(IDD_CUSTOMSLIDER), hParentWnd, (DLGPROC)CustomContrast_DlgProc); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomContrast.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomContrast.h new file mode 100644 index 0000000000..a511d8f668 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomContrast.h @@ -0,0 +1,24 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include + +LRESULT CALLBACK CustomContrast_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam); +void CustomContrast_Dialog(HINSTANCE hInst, HWND hParentWnd); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomPalEdit.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomPalEdit.c new file mode 100644 index 0000000000..3b4d19c4c6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomPalEdit.c @@ -0,0 +1,259 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +#include "PokeMini.h" +#include "PokeMini_Win32.h" +#include "CustomPalEdit.h" + +static int custompal[4]; + +LRESULT CALLBACK CustomPalEdit_cpaleditProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + HDC hDC; + HBRUSH hOldBrs, hBrs; + COLORREF bgcolor; + PAINTSTRUCT ps; + RECT rect; + + switch (Msg) { + case WM_NCCREATE: + SetWindowLong(hWnd, 0, 0xFFFFFF); + break; + case WM_NCDESTROY: + break; + case WM_PAINT: + hDC = BeginPaint(hWnd, &ps); + GetClientRect(hWnd, &rect); + + // Draw the background + bgcolor = (COLORREF)GetWindowLong(hWnd, 0); + hBrs = CreateSolidBrush(bgcolor); + hOldBrs = SelectObject(hDC, hBrs); + Rectangle(hDC, 0, 0, rect.right, rect.bottom); + SelectObject(hDC, hOldBrs); + DeleteObject(hDC); + + EndPaint(hWnd, &ps); + return FALSE; + case WMC_SETCOLOR: + bgcolor = (COLORREF)wParam; + bgcolor = RGB(GetBValue(bgcolor), GetGValue(bgcolor), GetRValue(bgcolor)); + SetWindowLong(hWnd, 0, (LONG)bgcolor); + return TRUE; + } + return DefWindowProc(hWnd, Msg, wParam, lParam); +} + +void CustomPalEdit_Register(HINSTANCE hInst) +{ + WNDCLASSEX wcex; + + // Register Main Window Class + ZeroMemory(&wcex, sizeof(WNDCLASSEX)); + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.lpfnWndProc = (WNDPROC)CustomPalEdit_cpaleditProc; + wcex.hInstance = hInst; + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.lpszClassName = "POKEMINI_cpaledit"; + wcex.cbWndExtra = sizeof(COLORREF); + RegisterClassEx(&wcex); +} + +static void SetTrackbarSpecs(HWND hWndDlg, int DlgID_L, int DlgID_S, int colortype, int spos) +{ + char tmp[PMTMPV]; + + SendDlgItemMessage(hWndDlg, DlgID_S, TBM_SETRANGE, FALSE, MAKELONG(0, 255)); + SendDlgItemMessage(hWndDlg, DlgID_S, TBM_SETPOS, TRUE, spos); + switch (colortype) { + case 2: + sprintf_s(tmp, PMTMPV, "Blue: %i", spos); + break; + case 1: + sprintf_s(tmp, PMTMPV, "Green: %i", spos); + break; + default: + sprintf_s(tmp, PMTMPV, "Red: %i", spos); + break; + } + SetDlgItemText(hWndDlg, DlgID_L, tmp); +} + +LRESULT CALLBACK CustomPalEdit_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + int spos, scolor; + + switch(Msg) { + case WM_INITDIALOG: + CopyMemory(custompal, CommandLine.custompal, sizeof(CommandLine.custompal)); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1LIGHTRL, IDC_CUSTOM1LIGHTRS, 0, (custompal[0] >> 16) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1LIGHTGL, IDC_CUSTOM1LIGHTGS, 1, (custompal[0] >> 8) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1LIGHTBL, IDC_CUSTOM1LIGHTBS, 2, custompal[0] & 255); + SendDlgItemMessage(hWndDlg, IDC_CUSTOM1LIGHTP, WMC_SETCOLOR, custompal[0], 0); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1DARKRL, IDC_CUSTOM1DARKRS, 0, (custompal[1] >> 16) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1DARKGL, IDC_CUSTOM1DARKGS, 1, (custompal[1] >> 8) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1DARKBL, IDC_CUSTOM1DARKBS, 2, custompal[1] & 255); + SendDlgItemMessage(hWndDlg, IDC_CUSTOM1DARKP, WMC_SETCOLOR, custompal[1], 0); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2LIGHTRL, IDC_CUSTOM2LIGHTRS, 0, (custompal[2] >> 16) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2LIGHTGL, IDC_CUSTOM2LIGHTGS, 1, (custompal[2] >> 8) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2LIGHTBL, IDC_CUSTOM2LIGHTBS, 2, custompal[2] & 255); + SendDlgItemMessage(hWndDlg, IDC_CUSTOM2LIGHTP, WMC_SETCOLOR, custompal[2], 0); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2DARKRL, IDC_CUSTOM2DARKRS, 0, (custompal[3] >> 16) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2DARKGL, IDC_CUSTOM2DARKGS, 1, (custompal[3] >> 8) & 255); + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2DARKBL, IDC_CUSTOM2DARKBS, 2, custompal[3] & 255); + SendDlgItemMessage(hWndDlg, IDC_CUSTOM2DARKP, WMC_SETCOLOR, custompal[3], 0); + return TRUE; + case WM_COMMAND: + switch(wParam) { + case IDOK: + CopyMemory(CommandLine.custompal, custompal, sizeof(CommandLine.custompal)); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + EndDialog(hWndDlg, 1); + return TRUE; + case IDCANCEL: + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + EndDialog(hWndDlg, 0); + return TRUE; + } + break; + case WM_HSCROLL: + switch (GetDlgCtrlID((HWND)lParam)) { + case IDC_CUSTOM1LIGHTRS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM1LIGHTRS, TBM_GETPOS, 0, 0) & 255; + custompal[0] &= 0x00FFFF; + custompal[0] |= spos << 16; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1LIGHTRL, IDC_CUSTOM1LIGHTRS, 0, spos); + scolor = 0; + break; + case IDC_CUSTOM1LIGHTGS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM1LIGHTGS, TBM_GETPOS, 0, 0) & 255; + custompal[0] &= 0xFF00FF; + custompal[0] |= spos << 8; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1LIGHTGL, IDC_CUSTOM1LIGHTGS, 1, spos); + scolor = 0; + break; + case IDC_CUSTOM1LIGHTBS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM1LIGHTBS, TBM_GETPOS, 0, 0) & 255; + custompal[0] &= 0xFFFF00; + custompal[0] |= spos; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1LIGHTBL, IDC_CUSTOM1LIGHTBS, 2, spos); + scolor = 0; + break; + case IDC_CUSTOM1DARKRS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM1DARKRS, TBM_GETPOS, 0, 0) & 255; + custompal[1] &= 0x00FFFF; + custompal[1] |= spos << 16; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1DARKRL, IDC_CUSTOM1DARKRS, 0, spos); + scolor = 1; + break; + case IDC_CUSTOM1DARKGS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM1DARKGS, TBM_GETPOS, 0, 0) & 255; + custompal[1] &= 0xFF00FF; + custompal[1] |= spos << 8; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1DARKGL, IDC_CUSTOM1DARKGS, 1, spos); + scolor = 1; + break; + case IDC_CUSTOM1DARKBS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM1DARKBS, TBM_GETPOS, 0, 0) & 255; + custompal[1] &= 0xFFFF00; + custompal[1] |= spos; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM1DARKBL, IDC_CUSTOM1DARKBS, 2, spos); + scolor = 1; + break; + case IDC_CUSTOM2LIGHTRS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM2LIGHTRS, TBM_GETPOS, 0, 0) & 255; + custompal[2] &= 0x00FFFF; + custompal[2] |= spos << 16; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2LIGHTRL, IDC_CUSTOM2LIGHTRS, 0, spos); + scolor = 2; + break; + case IDC_CUSTOM2LIGHTGS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM2LIGHTGS, TBM_GETPOS, 0, 0) & 255; + custompal[2] &= 0xFF00FF; + custompal[2] |= spos << 8; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2LIGHTGL, IDC_CUSTOM2LIGHTGS, 1, spos); + scolor = 2; + break; + case IDC_CUSTOM2LIGHTBS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM2LIGHTBS, TBM_GETPOS, 0, 0) & 255; + custompal[2] &= 0xFFFF00; + custompal[2] |= spos; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2LIGHTBL, IDC_CUSTOM2LIGHTBS, 2, spos); + scolor = 2; + break; + case IDC_CUSTOM2DARKRS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM2DARKRS, TBM_GETPOS, 0, 0) & 255; + custompal[3] &= 0x00FFFF; + custompal[3] |= spos << 16; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2DARKRL, IDC_CUSTOM2DARKRS, 0, spos); + scolor = 3; + break; + case IDC_CUSTOM2DARKGS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM2DARKGS, TBM_GETPOS, 0, 0) & 255; + custompal[3] &= 0xFF00FF; + custompal[3] |= spos << 8; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2DARKGL, IDC_CUSTOM2DARKGS, 0, spos); + scolor = 3; + break; + case IDC_CUSTOM2DARKBS: + spos = (int)SendDlgItemMessage(hWndDlg, IDC_CUSTOM2DARKBS, TBM_GETPOS, 0, 0) & 255; + custompal[3] &= 0xFFFF00; + custompal[3] |= spos; + SetTrackbarSpecs(hWndDlg, IDC_CUSTOM2DARKBL, IDC_CUSTOM2DARKBS, 0, spos); + scolor = 3; + break; + } + switch (scolor) { + case 0: + SendDlgItemMessage(hWndDlg, IDC_CUSTOM1LIGHTP, WMC_SETCOLOR, custompal[0], 0); + InvalidateRect(GetDlgItem(hWndDlg, IDC_CUSTOM1LIGHTP), NULL, FALSE); + UpdateWindow(GetDlgItem(hWndDlg, IDC_CUSTOM1LIGHTP)); + break; + case 1: + SendDlgItemMessage(hWndDlg, IDC_CUSTOM1DARKP, WMC_SETCOLOR, custompal[1], 0); + InvalidateRect(GetDlgItem(hWndDlg, IDC_CUSTOM1DARKP), NULL, FALSE); + UpdateWindow(GetDlgItem(hWndDlg, IDC_CUSTOM1DARKP)); + break; + case 2: + SendDlgItemMessage(hWndDlg, IDC_CUSTOM2LIGHTP, WMC_SETCOLOR, custompal[2], 0); + InvalidateRect(GetDlgItem(hWndDlg, IDC_CUSTOM2LIGHTP), NULL, FALSE); + UpdateWindow(GetDlgItem(hWndDlg, IDC_CUSTOM2LIGHTP)); + break; + case 3: + SendDlgItemMessage(hWndDlg, IDC_CUSTOM2DARKP, WMC_SETCOLOR, custompal[3], 0); + InvalidateRect(GetDlgItem(hWndDlg, IDC_CUSTOM2DARKP), NULL, FALSE); + UpdateWindow(GetDlgItem(hWndDlg, IDC_CUSTOM2DARKP)); + break; + } + PokeMini_VideoPalette_Index(CommandLine.palette, custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + render_dummyframe(); + break; + } + + return FALSE; +} + +void CustomPalEdit_Dialog(HINSTANCE hInst, HWND hParentWnd) +{ + CustomPalEdit_Register(hInst); + DialogBox(hInst, MAKEINTRESOURCE(IDD_CUSTOMPALEDIT), hParentWnd, (DLGPROC)CustomPalEdit_DlgProc); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomPalEdit.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomPalEdit.h new file mode 100644 index 0000000000..b45f52cdf3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/CustomPalEdit.h @@ -0,0 +1,26 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include + +#define WMC_SETCOLOR (WM_USER+1) + +LRESULT CALLBACK CustomPalEdit_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam); +void CustomPalEdit_Dialog(HINSTANCE hInst, HWND hParentWnd); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/DefineInput.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/DefineInput.c new file mode 100644 index 0000000000..7e1ee99634 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/DefineInput.c @@ -0,0 +1,197 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include + +#include "PokeMini.h" +#include "PokeMini_Win32.h" +#include "Joystick_DInput.h" +#include "Joystick.h" +#include "Keyboard.h" + +static void ComboSetIndex(HWND hWndDlg, int nIDDlgItem, int index) +{ + SendDlgItemMessage(hWndDlg, nIDDlgItem, CB_SETCURSEL, index, 0); +} + +static int ComboGetIndex(HWND hWndDlg, int nIDDlgItem) +{ + return (int)SendDlgItemMessage(hWndDlg, nIDDlgItem, CB_GETCURSEL, 0, 0); +} + +// ----- Keyboard ----- + +static void ComboFillKeyAndSet(HWND hWndDlg, int nIDDlgItem, int index) +{ + int i; + for (i=0; i. +*/ + +#pragma once + +#include + +LRESULT CALLBACK DefineKeyboard_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam); +void DefineKeyboard_Dialog(HINSTANCE hInst, HWND hParentWnd); +LRESULT CALLBACK DefineJoystick_DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam); +void DefineJoystick_Dialog(HINSTANCE hInst, HWND hParentWnd); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/Joystick_DInput.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Joystick_DInput.c new file mode 100644 index 0000000000..64c05e1ebb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Joystick_DInput.c @@ -0,0 +1,258 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#define DIRECTINPUT_VERSION 0x0800 +#include + +#include "Joystick_DInput.h" +#include "Joystick.h" + +static Joystick_HasFF = 0; +static HWND Joystick_nWnd = NULL; +static int Joystick_DInput_NumDevices = 0; +static LPDIRECTINPUT8 pDI = NULL; +static LPDIRECTINPUTDEVICE8 pDIDev = NULL; +static LPDIRECTINPUTEFFECT pDIEffect = NULL; +static DIDEVCAPS gDIDC; +static GUID guidEffect; +static int RumbleState = 0; +static struct { + int valid; + char name[256]; + GUID guid; +} Joystick_DInput_Device[8]; + +BOOL FAR PASCAL Joystick_DInput_EnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) +{ + if (Joystick_DInput_NumDevices < 8) { + strcpy_s(Joystick_DInput_Device[Joystick_DInput_NumDevices].name, 256, lpddi->tszProductName); + Joystick_DInput_Device[Joystick_DInput_NumDevices].guid = lpddi->guidInstance; + Joystick_DInput_Device[Joystick_DInput_NumDevices].valid = 1; + Joystick_DInput_NumDevices++; + } + return DIENUM_CONTINUE; +} + +BOOL FAR PASCAL Joystick_DInput_EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) +{ + DIPROPRANGE diprg; + diprg.diph.dwSize = sizeof(DIPROPRANGE); + diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER); + diprg.diph.dwHow = DIPH_BYID; + diprg.diph.dwObj = lpddoi->dwType; + diprg.lMin = -32767; + diprg.lMax = +32767; + if FAILED(IDirectInputDevice8_SetProperty(pDIDev, DIPROP_RANGE, &diprg.diph)) return DIENUM_STOP; + return DIENUM_CONTINUE; +} + +BOOL FAR PASCAL Joystick_DInput_EnumEffectsProc(LPCDIEFFECTINFO pdei, LPVOID pvRef) +{ + guidEffect = pdei->guid; + Joystick_HasFF = 1; + return DIENUM_STOP; +} + +// ----- + +int Joystick_DInput_Init(HINSTANCE hInst, HWND hWnd) +{ + // Clear structure + ZeroMemory(Joystick_DInput_Device, sizeof(Joystick_DInput_Device)); + Joystick_DInput_NumDevices = 0; + + // Initialize DirectInput + if FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, &IID_IDirectInput8, (void**)&pDI, NULL)) { + MessageBox(0, "DirectInput8Create Failed", "Joystick", MB_OK | MB_ICONERROR); + Joystick_DInput_Terminate(); + return 0; + } + + // Enumerate joystick devices + IDirectInput8_EnumDevices(pDI, DI8DEVCLASS_GAMECTRL, Joystick_DInput_EnumDevicesCallback, NULL, DIEDFL_ATTACHEDONLY); + Joystick_nWnd = hWnd; + + return 1; +} + +void Joystick_DInput_Terminate(void) +{ + Joystick_DInput_JoystickClose(); + if (pDI) { + IDirectInput8_Release(pDI); + pDI = NULL; + } + Joystick_DInput_NumDevices = 0; +} + +int Joystick_DInput_NumJoysticks() +{ + return Joystick_DInput_NumDevices; +} + +char *Joystick_DInput_JoystickName(int index) +{ + if ((index < 0) || (index >= Joystick_DInput_NumDevices)) return "None"; + return Joystick_DInput_Device[index].name; +} + +int Joystick_DInput_JoystickOpen(int index) +{ + DWORD dwAxes[2] = {DIJOFS_X, DIJOFS_Y}; + LONG lDirection[2] = {10000, 10000}; + DICONSTANTFORCE diConstantForce; + DIEFFECT diEffect; + + if ((index < 0) || (index >= Joystick_DInput_NumDevices)) return 0; + if (!Joystick_DInput_Device[index].valid) return 0; + + if FAILED(IDirectInput8_CreateDevice(pDI, &Joystick_DInput_Device[index].guid, &pDIDev, NULL)) { + return 0; + } + if FAILED(IDirectInputDevice8_SetDataFormat(pDIDev, &c_dfDIJoystick2)) { + Joystick_DInput_JoystickClose(); + return 0; + } + if FAILED(IDirectInputDevice8_SetCooperativeLevel(pDIDev, Joystick_nWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND)) { + Joystick_DInput_JoystickClose(); + return 0; + } + gDIDC.dwSize = sizeof(DIDEVCAPS); + if FAILED(IDirectInputDevice8_GetCapabilities(pDIDev, &gDIDC)) { + Joystick_DInput_JoystickClose(); + return 0; + } + if FAILED(IDirectInputDevice8_EnumObjects(pDIDev, Joystick_DInput_EnumAxesCallback, (VOID*)Joystick_nWnd, DIDFT_AXIS)) { + Joystick_DInput_JoystickClose(); + return 0; + } + + // Force-Feedback + Joystick_HasFF = 0; + IDirectInputDevice8_EnumEffects(pDIDev, Joystick_DInput_EnumEffectsProc, NULL, DIEFT_CONSTANTFORCE); + if (Joystick_HasFF) { + // FF Constant Force + ZeroMemory(&diConstantForce, sizeof(DICONSTANTFORCE)); + diConstantForce.lMagnitude = DI_FFNOMINALMAX; + + // FF Effect + ZeroMemory(&diEffect, sizeof(DIEFFECT)); + diEffect.dwSize = sizeof(DIEFFECT); + diEffect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; + diEffect.dwDuration = INFINITE; + diEffect.dwSamplePeriod = 0; + diEffect.dwGain = DI_FFNOMINALMAX; + diEffect.dwTriggerButton = DIEB_NOTRIGGER; + diEffect.dwTriggerRepeatInterval = 0; + diEffect.cAxes = 2; + diEffect.rgdwAxes = dwAxes; + diEffect.rglDirection = lDirection; + diEffect.lpEnvelope = NULL; + diEffect.cbTypeSpecificParams = sizeof(diConstantForce); + diEffect.lpvTypeSpecificParams = &diConstantForce; + + if FAILED(IDirectInputDevice8_CreateEffect(pDIDev, &guidEffect, &diEffect, &pDIEffect, NULL)) { + Joystick_DInput_JoystickClose(); + return 0; + } + } + + return 1; +} + +void Joystick_DInput_JoystickClose() +{ + if (pDIEffect) { + IDirectInputEffect_Release(pDIEffect); + pDIEffect = NULL; + } + if (pDIDev) { + IDirectInputDevice8_Release(pDIDev); + pDIDev = NULL; + } +} + +void Joystick_DInput_StopRumble() +{ + if (RumbleState) { + IDirectInputEffect_Stop(pDIEffect); + RumbleState = 0; + } +} + +int Joystick_DInput_Process(int rumbling) +{ + DIJOYSTATE2 js; + static BYTE JoyButtons[32]; + static rumblelvl = 0; + int i, deg, hats; + + if (!pDIDev) return 0; + + // Poll and get device state + if FAILED(IDirectInputDevice8_Poll(pDIDev)) { + while(IDirectInputDevice8_Acquire(pDIDev) == DIERR_INPUTLOST) Sleep(3); + } + if FAILED(IDirectInputDevice8_GetDeviceState(pDIDev, sizeof(DIJOYSTATE2), &js)) { + return 0; + } + + // Process axis, hats and buttons + if (gDIDC.dwAxes >= 2) { + JoystickAxisEvent(0, js.lX); + JoystickAxisEvent(1, js.lY); + } + for (i=0; i<(int)gDIDC.dwPOVs; i++) { + if (js.rgdwPOV[i] == -1) hats = 0; + else { + deg = (js.rgdwPOV[i] + 2250) % 36000; + if (deg >= 31500) hats = JHAT_UP | JHAT_LEFT; + else if (deg >= 27000) hats = JHAT_LEFT; + else if (deg >= 22500) hats = JHAT_DOWN | JHAT_LEFT; + else if (deg >= 18000) hats = JHAT_DOWN; + else if (deg >= 13500) hats = JHAT_DOWN | JHAT_RIGHT; + else if (deg >= 9000) hats = JHAT_RIGHT; + else if (deg >= 4500) hats = JHAT_UP | JHAT_RIGHT; + else if (deg >= 0) hats = JHAT_UP; + } + JoystickHatsEvent(hats); + } + for (i=0; i<32; i++) { + if (js.rgbButtons[i] ^ JoyButtons[i]) { + JoystickButtonsEvent(i, js.rgbButtons[i]); + } + } + + // Process force-feedback + if (Joystick_HasFF) { + if (rumblelvl && !RumbleState) { + IDirectInputEffect_Start(pDIEffect, 1, 0); + RumbleState = 1; + } else if (!rumblelvl && RumbleState) { + IDirectInputEffect_Stop(pDIEffect); + RumbleState = 0; + } + if (rumbling && (rumblelvl < 16)) rumblelvl += 4; + } + if (rumblelvl) rumblelvl--; + + // Transfer buttons states + CopyMemory(JoyButtons, js.rgbButtons, sizeof(JoyButtons)); + return 1; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/Joystick_DInput.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Joystick_DInput.h new file mode 100644 index 0000000000..40fc45f900 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Joystick_DInput.h @@ -0,0 +1,30 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include + +int Joystick_DInput_Init(HINSTANCE hInst, HWND hWnd); +void Joystick_DInput_Terminate(void); +int Joystick_DInput_NumJoysticks(); +char *Joystick_DInput_JoystickName(int index); +int Joystick_DInput_JoystickOpen(int index); +void Joystick_DInput_JoystickClose(); +void Joystick_DInput_StopRumble(); +int Joystick_DInput_Process(int rumbling); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/KeybWinMap.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/KeybWinMap.c new file mode 100644 index 0000000000..0f9545e428 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/KeybWinMap.c @@ -0,0 +1,139 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include "Keyboard.h" + +TKeyboardRemap KeybWinRemap = { + 0, + VK_ESCAPE, + VK_RETURN, + VK_BACK, + VK_TAB, + VK_OEM_3, + + VK_SHIFT, + VK_LSHIFT, + VK_CONTROL, + VK_LCONTROL, + VK_MENU, + VK_LMENU, + + VK_INSERT, + VK_DELETE, + VK_HOME, + VK_END, + VK_PRIOR, + VK_NEXT, + + VK_NUMLOCK, + VK_CAPITAL, + VK_SCROLL, + VK_DECIMAL, + VK_DIVIDE, + VK_MULTIPLY, + VK_SUBTRACT, + VK_ADD, + VK_SEPARATOR, + VK_OEM_NEC_EQUAL, + + VK_UP, + VK_DOWN, + VK_RIGHT, + VK_LEFT, + + VK_SPACE, + 0x100, // EXCLAIM + 0x101, // QUOTEDBL + 0x102, // HASH + 0x103, // DOLLAR + 0x104, // UNKNOWN + 0x105, // AMPERSAND + 0x106, // QUOTE + 0x107, // LEFTPAREN + 0x108, // RIGHTPAREN + 0x109, // ASTERISK + 0x10A, // PLUS + 0x10B, // COMMA + 0x10C, // MINUS + 0x10D, // PERIOD + 0x10E, // SLASH + + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + + 0x110, // COLON + 0x111, // SEMICOLON + 0x112, // LESS + 0x113, // EQUALS + 0x114, // GREATER + 0x115, // QUESTION + 0x116, // AT + + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + 'Y', + 'Z', + + 0x120, // LEFTBRACKET + 0x121, // BACKSLASH + 0x122, // RIGHTBRACKET + 0x123, // CARET + 0x124, // UNDERSCORE + + VK_NUMPAD0, + VK_NUMPAD1, + VK_NUMPAD2, + VK_NUMPAD3, + VK_NUMPAD4, + VK_NUMPAD5, + VK_NUMPAD6, + VK_NUMPAD7, + VK_NUMPAD8, + VK_NUMPAD9 +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/KeybWinMap.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/KeybWinMap.h new file mode 100644 index 0000000000..fd759e1485 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/KeybWinMap.h @@ -0,0 +1,26 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef KEYBWINMAP_H +#define KEYBWINMAP_H + +#include "Keyboard.h" + +extern TKeyboardRemap KeybWinRemap; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/PokeMini_Win32.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/PokeMini_Win32.c new file mode 100644 index 0000000000..a9afe1dae8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/PokeMini_Win32.c @@ -0,0 +1,1868 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "PokeMini_Win32.h" +#include "Win32Stuffz.h" +#include "VideoRend.h" +#include "AudioRend.h" +#include "CustomPalEdit.h" +#include "CustomContrast.h" +#include "CustomBright.h" +#include "DefineInput.h" +#include "Joystick_DInput.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "ExportBMP.h" +#include "ExportWAV.h" +#include "Video_x1.h" +#include "Video_x2.h" +#include "Video_x3.h" +#include "Video_x4.h" +#include "Video_x5.h" +#include "Video_x6.h" +#include "KeybWinMap.h" + +const char *AppName = "PokeMini " PokeMini_Version; +HINSTANCE hInst = NULL; // Current instance +HWND hMainWnd = NULL; // Current window header +HMENU hMainMenu = NULL; // Current menu header +RECT rWindowed; // Windowed rectangle + +const char *AboutTxt = "PokeMini " PokeMini_Version " Win32" + "\n\n" + "Coded by JustBurn\n" + "Thanks to p0p, Dave|X,\n" + "Onori, goldmono, Agilo,\n" + "DarkFader, asterick,\n" + "MrBlinky, Wa, Lupin and\n" + "everyone in #pmdev on\n" + "IRC EFNET!\n\n" + "Please check readme.txt\n\n" + "For latest version visit:\n" + "http://pokemini.sourceforge.net/\n\n" + "Special thanks to:\n" + "Museum of Electronic Games & Art\n" + "http://m-e-g-a.org\n" + "MEGA supports preservation\n" + "projects of digital art & culture\n"; + +const char *WebsiteTxt = "http://pokemini.sourceforge.net/"; + +// Variables +volatile int emumodeE = EMUMODE_STOP; // Emulation thread +volatile int emumodeA = EMUMODE_STOP; // Application thread +int FirstROMLoad = 1; +int emulimiter = 1; +int PMWidth, PMHeight, FPS; +int BytPitch, PixPitch, PMOff; + +// Sound buffer size +#define SOUNDBUFFER 4096 +#define PMSNDBUFFER (SOUNDBUFFER*2) + +// -------------------------------------------------------------------------------- + +// Custom command line (NEW IN 0.5.0) +int clc_zoom = 4, clc_fullscreen = 0; +const TCommandLineCustom CustomArgs[] = { + { "-zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "-windowed", &clc_fullscreen, COMMANDLINE_INTSET, 0 }, + { "-fullscreen", &clc_fullscreen, COMMANDLINE_INTSET, 1 }, + { "", NULL, COMMANDLINE_EOL } +}; +// Win32 custom conf +int wclc_winx = 0; +int wclc_winy = 0; +int wclc_winw = 400; +int wclc_winh = 272; +int wclc_autorun = 1; +int wclc_pauseinactive = 1; +int wclc_inactivestate = 2; // 0 = Inactive, 1 = Active, 2 = Stoped +int wclc_videorend = 2; +int wclc_audiorend = 1; +int wclc_forcefeedback = 1; +char wclc_recent[10][PMTMPV]; +const int wclc_recent_ids[10] = {ID_RECENT0, ID_RECENT1, ID_RECENT2, ID_RECENT3, ID_RECENT4, ID_RECENT5, ID_RECENT6, ID_RECENT7, ID_RECENT8, ID_RECENT9}; +const TCommandLineCustom CustomConf[] = { + { "zoom", &clc_zoom, COMMANDLINE_INT, 1, 6 }, + { "fullscreen", &clc_fullscreen, COMMANDLINE_BOOL }, + // Win32 Platform + { "window_x", &wclc_winx, COMMANDLINE_INT, 0, 65535 }, + { "window_y", &wclc_winy, COMMANDLINE_INT, 0, 65535 }, + { "window_width", &wclc_winw, COMMANDLINE_INT, 0, 65535 }, + { "window_height", &wclc_winh, COMMANDLINE_INT, 0, 65535 }, + { "autorun", &wclc_autorun, COMMANDLINE_BOOL }, + { "pauseinactive", &wclc_pauseinactive, COMMANDLINE_BOOL }, + { "videorend", &wclc_videorend, COMMANDLINE_INT, 0, 2 }, + { "audiorend", &wclc_audiorend, COMMANDLINE_INT, 1, 1 }, + { "forcefeedback", &wclc_forcefeedback, COMMANDLINE_BOOL }, + { "recent_rom0", (int *)&wclc_recent[0], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom1", (int *)&wclc_recent[1], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom2", (int *)&wclc_recent[2], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom3", (int *)&wclc_recent[3], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom4", (int *)&wclc_recent[4], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom5", (int *)&wclc_recent[5], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom6", (int *)&wclc_recent[6], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom7", (int *)&wclc_recent[7], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom8", (int *)&wclc_recent[8], COMMANDLINE_STR, PMTMPV-1 }, + { "recent_rom9", (int *)&wclc_recent[9], COMMANDLINE_STR, PMTMPV-1 }, + { "", NULL, COMMANDLINE_EOL } +}; + +// Platform menu (REQUIRED >= 0.4.4) +TUIMenu_Item UIItems_Platform[] = { + { 0, 0, "Go back...", UIItems_PlatformDefC }, + { 9, 0, "Platform", UIItems_PlatformDefC } +}; + +// -------------------------------------------------------------------------------- + +DWORD WINAPI EmulatorThread(LPVOID lpParameter) +{ + DWORD time, NewTickFPS = 0, NewTickSync = 0; + int fpscnt = 0; + uint8_t *vidbuf; + + timeBeginPeriod(1); + while (emumodeE != EMUMODE_TERMINATE) { + time = timeGetTime(); + emumodeE = emumodeA; + if (emumodeE == EMUMODE_RUNFULL) { + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + if (emulimiter) while (MinxAudio_SyncWithAudio()) Sleep(1); + Sleep(1); // This lower CPU usage + } else { + PokeMini_EmulateFrame(); + if (emulimiter) { + do { + Sleep(1); // This lower CPU usage + time = timeGetTime(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + } + + VideoRend->ClearVideo(); + if (VideoRend->Lock((void *)&vidbuf)) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((void *)&vidbuf[PMOff + PokeMini_GenRumbleOffset(BytPitch)], PixPitch); + } else { + PokeMini_VideoBlit((void *)&vidbuf[PMOff], PixPitch); + } + LCDDirty = 0; + + // Unlock surface + VideoRend->Unlock(); + VideoRend->Flip(hMainWnd); + } + + // Poll joystick if enabled + if (CommandLine.joyenabled) { + Joystick_DInput_Process(wclc_forcefeedback ? PokeMini_RumblingLatch : 0); + PokeMini_RumblingLatch = 0; + } + + // calculate FPS + fpscnt++; + if (time >= NewTickFPS) { + FPS = fpscnt * 100 / 72; + NewTickFPS = time + 1000; + fpscnt = 0; + } + } else if (emumodeE == EMUMODE_STOP) { + Joystick_DInput_StopRumble(); + Sleep(250); + } + } + timeEndPeriod(1); + return 0; +} + +// -------------------------------------------------------------------------------- + +// Update window title caption +DWORD title_timer_id = 0; +void CALLBACK title_timer(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) +{ + char tmp[PMTMPV]; + if (emumodeE == EMUMODE_RUNFULL) { + sprintf_s(tmp, PMTMPV, "%s - %d%%", AppName, FPS); + SetWindowText(hMainWnd, tmp); + } else { + SetWindowText(hMainWnd, AppName); + } +} + +// Used to fill the sound buffer +void emulatorsound(void *stream, int len) +{ + MinxAudio_GetSamplesS16((int16_t *)stream, len>>1); +} + +// Enable/Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) AudioRend->Enable(sound); +} + +// Set emulator mode +void set_emumode(int mode, int tempsave) +{ + static int temp_emumode = EMUMODE_STOP; + + // Backup/restore mode + if (mode == EMUMODE_RESTORE) mode = temp_emumode; + else if (tempsave) temp_emumode = emumodeA; + + // Enable/disable sound + if ((emumodeA == EMUMODE_RUNFULL) && (mode != EMUMODE_RUNFULL)) { + enablesound(0); + timeKillEvent(title_timer_id); + SetWindowText(hMainWnd, AppName); + } + if ((emumodeA != EMUMODE_RUNFULL) && (mode == EMUMODE_RUNFULL)) { + enablesound(CommandLine.sound); + title_timer_id = (DWORD)timeSetEvent(900, 64, title_timer, 0, TIME_PERIODIC); + } + + // Set mode and wait for thread + emumodeA = mode; + while (emumodeA != emumodeE) Sleep(16); +} + +// Setup screen +void setup_screen(int resizewin) +{ + TPokeMini_VideoSpec *videospec; + int viddepth, depth, PMOffX, PMOffY; + RECT cRect; + static int wasFullScreen = 0; + + // Backup RECT when entering fullscreen + if (clc_fullscreen & !wasFullScreen) { + GetWindowRect(hMainWnd, &rWindowed); + rWindowed.right -= rWindowed.left; + rWindowed.bottom -= rWindowed.top; + } + + // Calculate size based of zoom + if (clc_zoom == 1) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video1x1; + PMWidth = 192; PMHeight = 128; PMOffX = 48; PMOffY = 32; + } else if (clc_zoom == 2) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video2x2; + PMWidth = 208; PMHeight = 144; PMOffX = 8; PMOffY = 8; + } else if (clc_zoom == 3) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video3x3; + PMWidth = 304; PMHeight = 208; PMOffX = 8; PMOffY = 8; + } else if (clc_zoom == 4) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video4x4; + PMWidth = 400; PMHeight = 272; PMOffX = 8; PMOffY = 8; + } else if (clc_zoom == 5) { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video5x5; + PMWidth = 496; PMHeight = 336; PMOffX = 8; PMOffY = 8; + } else { + videospec = (TPokeMini_VideoSpec *)&PokeMini_Video6x6; + PMWidth = 592; PMHeight = 400; PMOffX = 8; PMOffY = 8; + } + + // Set video mode + if (VideoRend->WasInit()) VideoRend->Terminate(); + VideoRend_Set(wclc_videorend); + viddepth = VideoRend->Init(hMainWnd, PMWidth, PMHeight, clc_fullscreen); + if (!viddepth) { + VideoRend_Set(0); wclc_videorend = 0; + viddepth = VideoRend->Init(hMainWnd, PMWidth, PMHeight, clc_fullscreen); + if (!viddepth) { + MessageBox(hMainWnd, "Couldn't initialize video", "Video init error", MB_ICONERROR); + ExitProcess(1); + } + } + VideoRend->GetPitch(&BytPitch, &PixPitch); + + // Set video spec and check if is supported + depth = PokeMini_SetVideo(videospec, viddepth, CommandLine.lcdfilter, CommandLine.lcdmode); + if (!depth) { + MessageBox(hMainWnd, "Couldn't set video spec", "Video init error", MB_ICONERROR); + ExitProcess(1); + } + + // Calculate pitch and offset + if (depth == 32) { + PMOff = (PMOffY * BytPitch) + (PMOffX * 4); + } else { + PMOff = (PMOffY * BytPitch) + (PMOffX * 2); + } + + // Handle window style + if (clc_fullscreen) { + SetWindowLong(hMainWnd, GWL_STYLE, GetWindowLong(hMainWnd, GWL_STYLE) & ~WS_OVERLAPPEDWINDOW | WS_POPUP); + SetWindowLong(hMainWnd, GWL_EXSTYLE, GetWindowLong(hMainWnd, GWL_EXSTYLE) | WS_EX_TOPMOST); + } else { + SetWindowLong(hMainWnd, GWL_STYLE, GetWindowLong(hMainWnd, GWL_STYLE) & ~WS_POPUP | WS_OVERLAPPEDWINDOW); + SetWindowLong(hMainWnd, GWL_EXSTYLE, GetWindowLong(hMainWnd, GWL_EXSTYLE) & ~WS_EX_TOPMOST); + } + + // Restore RECT when exiting fullscreen + if (!clc_fullscreen & wasFullScreen) { + MoveWindow(hMainWnd, rWindowed.left, rWindowed.top, rWindowed.right, rWindowed.bottom, 1); + } + + // Resize window + if (!clc_fullscreen) { + if (resizewin) { + MainWndClientSize(hMainWnd, PMWidth, PMHeight); + } + } else { + if (resizewin) { + VMainWndClientSize(hMainWnd, PMWidth, PMHeight); + } + } + + // Resize and refresh windows + RedrawWindow(hMainWnd, NULL, NULL, RDW_INVALIDATE); + GetClientRect(hMainWnd, &cRect); + VideoRend->ResizeWin(cRect.right, cRect.bottom); + wasFullScreen = clc_fullscreen; + Sleep(250); +} + +// Render dummy frame +void render_dummyframe(void) +{ + uint8_t *vidbuf; + + if ((VidPalette32) && (emumodeE != EMUMODE_RUNFULL)) { + VideoRend->ClearVideo(); + if (VideoRend->Lock((void *)&vidbuf)) { + + // Render the menu or the game screen + PokeMini_VideoBlit((void *)&vidbuf[PMOff], PixPitch); + + // Unlock surface + VideoRend->Unlock(); + VideoRend->Flip(hMainWnd); + } + } +} + +// Capture screen +void capture_screen(void) +{ + FILE *capf; + int y, capnum; + unsigned long Video[96*64]; + PokeMini_VideoPreview_32((uint32_t *)Video, 96, PokeMini_LCDMode); + capf = OpenUnique_ExportBMP(&capnum, 96, 64); + if (!capf) return; + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&Video[(63-y) * 96], 96); + } + Close_ExportBMP(capf); +} + +void PMWin_OnUnzipError(const char *zipfile, const char *reason) +{ + SetStatusBarText("Error decompressing %s: %s\n", zipfile, reason); +} + +void PMWin_OnLoadBIOSFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("BIOS '%s' loaded\n", filename); + else if (success == -1) SetStatusBarText("Error loading BIOS '%s': file not found, Using FreeBIOS\n", filename); + else SetStatusBarText("Error loading BIOS '%s': read error, Using FreeBIOS\n", filename); +} + +void PMWin_OnLoadMINFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("ROM '%s' loaded\n", filename); + else if (success == -1) SetStatusBarText("Error loading ROM '%s': file not found\n", filename); + else if (success == -2) SetStatusBarText("Error loading ROM '%s': invalid size\n", filename); + else SetStatusBarText("Error loading ROM '%s', read error\n", filename); +} + +void PMWin_OnLoadColorFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("Color info '%s' loaded\n", filename); + else if (success == -1) SetStatusBarText("Error loading color info '%s': file not found\n", filename); + else SetStatusBarText("Error loading color info '%s': read error\n", filename); +} + +void PMWin_OnLoadEEPROMFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("EEPROM '%s' loaded\n", filename); + else if (success == -1) SetStatusBarText("Error loading EEPROM '%s': file not found\n", filename); + else SetStatusBarText("Error loading EEPROM '%s': read error\n", filename); +} + +void PMWin_OnSaveEEPROMFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("EEPROM '%s' saved\n", filename); + else if (success == -1) SetStatusBarText("Error saving EEPROM '%s': filename invalid\n", filename); + else SetStatusBarText("Error saving EEPROM '%s': write error\n", filename); +} + +void PMWin_OnLoadStateFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("State '%s' loaded\n", filename); + else if (success == -1) SetStatusBarText("Error loading state '%s': file not found\n", filename); + else if (success == -2) SetStatusBarText("Error loading state '%s': invalid file\n", filename); + else if (success == -3) SetStatusBarText("Error loading state '%s': wrong version\n", filename); + else if (success == -4) SetStatusBarText("Error loading state '%s': invalid header\n", filename); + else if (success == -5) SetStatusBarText("Error loading state '%s': invalid internal block\n", filename); + else SetStatusBarText("Error loading state '%s': read error\n", filename); +} + +void PMWin_OnSaveStateFile(const char *filename, int success) +{ + if (success == 1) SetStatusBarText("State '%s' saved\n", filename); + else if (success == -1) SetStatusBarText("Error saving state '%s': filename invalid\n", filename); + else SetStatusBarText("Error saving state '%s': write error\n", filename); +} + +// -------------------------------------------------------------------------------- + +int Menu_FileAssociation_DoRegister(void) +{ + const char *tenam1 = "PokeMini_min"; + const char *tenam2 = "PokeMini_minc"; + const char *tenam3 = "PokeMini Emulator ROM"; + const char *tenam4 = "PokeMini Emulator Color File"; + const char *tenam5 = "open"; + const char *tenam6 = "&Open"; + char tmp[PMTMPV]; + char argv0[PMTMPV]; + HKEY key; + DWORD dispo; + + // Receive module filename + GetModuleFileName(NULL, argv0, PMTMPV); + + // HKEY_CLASSES_ROOT\.min + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, ".min", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam1, (DWORD)strlen(tenam1)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\.minc + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, ".minc", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam2, (DWORD)strlen(tenam2)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam3, (DWORD)strlen(tenam3)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam4, (DWORD)strlen(tenam4)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min\DefaultIcon + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\DefaultIcon", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + sprintf_s(tmp, PMTMPV, "\"%s\",2", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc\DefaultIcon + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\DefaultIcon", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + sprintf_s(tmp, PMTMPV, "\"%s\",3", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min\shell + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dispo) != ERROR_SUCCESS) return 0; + if (dispo == REG_CREATED_NEW_KEY) { + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam5, (DWORD)strlen(tenam5)+1) != ERROR_SUCCESS) return 0; + } + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc\shell + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dispo) != ERROR_SUCCESS) return 0; + if (dispo == REG_CREATED_NEW_KEY) { + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam5, (DWORD)strlen(tenam5)+1) != ERROR_SUCCESS) return 0; + } + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min\shell\open + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\open", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam6, (DWORD)strlen(tenam6)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc\shell\open + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\open", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + if (RegSetValueExA(key, NULL, 0, REG_SZ, (LPBYTE)tenam6, (DWORD)strlen(tenam6)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_min\shell\open\command + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\open\\command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + sprintf_s(tmp, PMTMPV, "\"%s\" \"%%1\"", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + // HKEY_CLASSES_ROOT\PokeMini_minc\shell\open\command + if (RegCreateKeyEx(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\open\\command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL) != ERROR_SUCCESS) return 0; + sprintf_s(tmp, PMTMPV, "\"%s\" \"%%1\"", argv0); + if (RegSetValueExA(key, NULL, 0, REG_SZ, tmp, (DWORD)strlen(tmp)+1) != ERROR_SUCCESS) return 0; + RegCloseKey(key); + + return 1; +} + +int Menu_FileAssociation_DoUnregister(void) +{ + int success = 2; + + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\open\\command")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\open\\command")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell\\open")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell\\open")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\shell")) success = 1; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\shell")) success = 1; + if (success == 2) { + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min\\DefaultIcon")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc\\DefaultIcon")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_min")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, "PokeMini_minc")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, ".min")) success = 0; + if (RegDeleteKey(HKEY_CLASSES_ROOT, ".minc")) success = 0; + } + + return success; +} + +void Menu_FileAssociation_Register(void) +{ + set_emumode(EMUMODE_STOP, 1); + if (MessageBox(hMainWnd, "Are you sure you want to add\n.min and .minc associations?", "Question", MB_YESNO | MB_ICONQUESTION)) { + if (Menu_FileAssociation_DoRegister()) { + MessageBox(hMainWnd, ".min and .minc have been successfuly registered", "Success", MB_ICONINFORMATION); + } else { + MessageBox(hMainWnd, "Error while trying to associate extensions", "Error", MB_ICONERROR); + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_FileAssociation_Unregister(void) +{ + int ret; + set_emumode(EMUMODE_STOP, 1); + if (MessageBox(hMainWnd, "Are you sure you want to remove\n.min and .minc associations?", "Question", MB_YESNO | MB_ICONQUESTION)) { + ret = Menu_FileAssociation_DoUnregister(); + if (ret == 2) { + MessageBox(hMainWnd, ".min and .minc have been successfuly unregistered", "Success", MB_ICONINFORMATION); + } else if (ret == 1) { + MessageBox(hMainWnd, ".min and .minc are still associated with other program", "Note", MB_ICONINFORMATION); + } else { + MessageBox(hMainWnd, "Error while trying to remove association", "Error", MB_ICONERROR); + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void AddMinOnRecent(const char *filename) +{ + int i, x; + for (x=0; x<9; x++) { + if (!strcmp(filename, wclc_recent[x])) break; + } + if (x == 10) { + // Not found, shift down + for (i=8; i>=0; i--) { + strcpy_s(wclc_recent[i+1], PMTMPV, wclc_recent[i]); + } + } else if (x == 0) { + // Last loaded, do nothing + return; + } else { + // Found at x, shift middle + for (i=x-1; i>=0; i--) { + strcpy_s(wclc_recent[i+1], PMTMPV, wclc_recent[i]); + } + } + strcpy_s(wclc_recent[0], PMTMPV, filename); +} + +void Recent_OpenMin(const char *filename) +{ + set_emumode(EMUMODE_STOP, 1); + if (!PokeMini_LoadROM(filename)) { + MessageBox(hMainWnd, "Error loading ROM", "MIN load error", MB_ICONERROR); + } else { + if ((emumodeA == EMUMODE_STOP) && wclc_autorun) { + SetStatusBarText("Emulation auto-started\n"); + set_emumode(EMUMODE_RUNFULL, 1); + wclc_inactivestate = 1; + return; + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void DragDrop_OpenMin(const char *filename) +{ + set_emumode(EMUMODE_STOP, 1); + if (!PokeMini_LoadROM(filename)) { + MessageBox(hMainWnd, "Error loading ROM", "MIN load error", MB_ICONERROR); + } else { + AddMinOnRecent(CommandLine.min_file); + if ((emumodeA == EMUMODE_STOP) && wclc_autorun) { + SetStatusBarText("Emulation auto-started\n"); + set_emumode(EMUMODE_RUNFULL, 1); + wclc_inactivestate = 1; + return; + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_File_OpenMin(void) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + if (FirstROMLoad) { + if (strlen(CommandLine.rom_dir)) PokeMini_SetCurrentDir(CommandLine.rom_dir); + FirstROMLoad = 0; + } + if (OpenFileDialogEx(hMainWnd, "Open MIN", tmp, CommandLine.min_file, "ZIP Package or MIN Rom (*.zip;*.min)\0*.zip;*.min\0ZIP Package (*.zip)\0*.zip\0MIN Rom (*.min)\0*.min\0All (*.*)\0*.*\0", 0)) { + if (!PokeMini_LoadROM(tmp)) { + MessageBox(hMainWnd, "Error loading ROM", "MIN load error", MB_ICONERROR); + } else { + strcpy_s(CommandLine.rom_dir, PMTMPV, PokeMini_CurrDir); + AddMinOnRecent(CommandLine.min_file); + if ((emumodeA == EMUMODE_STOP) && wclc_autorun) { + SetStatusBarText("Emulation auto-started\n"); + set_emumode(EMUMODE_RUNFULL, 1); + wclc_inactivestate = 1; + return; + } + } + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_File_LoadState(void) +{ + char tmp[PMTMPV], romfile[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + sprintf_s(tmp, PMTMPV, "%s.sta", CommandLine.min_file); + if (OpenFileDialogEx(hMainWnd, "Load state", tmp, tmp, "State (*.sta)\0*.sta\0All (*.*)\0*.*\0", 0)) { + if (!PokeMini_CheckSSFile(tmp, romfile)) { + MessageBox(hMainWnd, "Invalid state file", "Load state error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + if (strcmp(romfile, CommandLine.min_file)) { + if (!MessageBox(hMainWnd, "Assigned ROM does not match, continue?", "Load state", MB_YESNO | MB_ICONERROR)) { + if (MessageBox(hMainWnd, "Want to load with the assigned ROM?", "Load state", MB_YESNO | MB_ICONERROR)) { + if (!PokeMini_LoadROM(romfile)) { + MessageBox(hMainWnd, "Error loading ROM", "MIN load error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + if (!PokeMini_LoadSSFile(tmp)) { + MessageBox(hMainWnd, "Error loading state", "Load state error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + AddMinOnRecent(CommandLine.min_file); + } + SetStatusBarText("State loaded\n"); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + } + if (!PokeMini_LoadSSFile(tmp)) { + MessageBox(hMainWnd, "Error loading state", "Load state error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + SetStatusBarText("State loaded\n"); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_File_SaveState(void) +{ + char tmp[PMTMPV]; + set_emumode(EMUMODE_STOP, 1); + sprintf_s(tmp, PMTMPV, "%s.sta", CommandLine.min_file); + if (SaveFileDialogEx(hMainWnd, "Save state", tmp, tmp, "State (*.sta)\0*.sta\0All (*.*)\0*.*\0", 0)) { + if (!PokeMini_SaveSSFile(tmp, CommandLine.min_file)) { + MessageBox(hMainWnd, "Error saving state", "Save state error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + SetStatusBarText("State saved\n"); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_Capt_Snapshot1x(void) +{ + char filename[PMTMPV]; + uint32_t *imgptr = NULL; + FILE *capf; + int y; + + set_emumode(EMUMODE_STOP, 1); + if (SaveFileDialogEx(hMainWnd, "Save snapshot (1x preview)", filename, "snapshot.bmp", "BMP (*.bmp)\0*.bmp\0", 0)) { + imgptr = (uint32_t *)LocalAlloc(LPTR, 96*64*4); + PokeMini_VideoPreview_32(imgptr, 96, PokeMini_LCDMode); + capf = Open_ExportBMP(filename, 96, 64); + if (!capf) { + MessageBox(hMainWnd, "Open failed", "Save snapshot error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + for (y=0; y<64; y++) { + WriteArray_ExportBMP(capf, (uint32_t *)&imgptr[(63-y) * 96], 96); + } + Close_ExportBMP(capf); + LocalFree(imgptr); + } + set_emumode(EMUMODE_RESTORE, 1); +} + +void Menu_Capt_SnapshotLCD(void) +{ + char filename[PMTMPV]; + uint32_t *imgptr = NULL; + FILE *capf; + int w, h, y; + + w = 96 * clc_zoom; + h = 64 * clc_zoom; + set_emumode(EMUMODE_STOP, 1); + if (SaveFileDialogEx(hMainWnd, "Save snapshot (from LCD)", filename, "snapshot.bmp", "BMP (*.bmp)\0*.bmp\0", 0)) { + imgptr = (uint32_t *)LocalAlloc(LPTR, w*h*4); + PokeMini_VideoBlit32(imgptr, w); + capf = Open_ExportBMP(filename, w, h); + if (!capf) { + MessageBox(hMainWnd, "Open failed", "Save snapshot error", MB_ICONERROR); + set_emumode(EMUMODE_RESTORE, 1); + return; + } + for (y=0; y 0) { + for (j=(int)strlen(wclc_recent[i])-1; j>=0; j--) if (wclc_recent[i][j] == '\\') { j++; break; } + sprintf_s(tmp, PMTMPV, "%s\tCtrl+F%i", &wclc_recent[i][j], i+1); + ModifyMenu(hMainMenu, wclc_recent_ids[i], MF_BYCOMMAND | MF_STRING | MF_ENABLED, wclc_recent_ids[i], tmp); + } else { + sprintf_s(tmp, PMTMPV, "---\tCtrl+F%i", i+1); + ModifyMenu(hMainMenu, wclc_recent_ids[i], MF_BYCOMMAND | MF_STRING | MF_GRAYED, wclc_recent_ids[i], tmp); + } + } +} + +// Windows Start Point +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) +{ + MSG msg; + HACCEL hAccelTable; + HANDLE EmuThread; + DWORD EmuThreadID; + int i, argc; + char **argv; + size_t sz; + + // Get argc/argv parameters + LPWSTR *pathnam; + pathnam = CommandLineToArgvW(GetCommandLineW(), &argc); + argv = (char **)LocalAlloc(LPTR, argc * sizeof(char **)); + for (i=0; iInit(hMainWnd, 44100, 16, 1, SOUNDBUFFER, (AudioRend_Callback)emulatorsound)) { + MessageBox(NULL, "Couldn't initialize sound!\nUsing no sound.", "Error", MB_ICONERROR); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Initialize joystick + Joystick_DInput_Init(hInst, hMainWnd); + if (CommandLine.joyenabled) { + Joystick_DInput_JoystickOpen(CommandLine.joyid); + } + + // Initialize the emulator + if (!PokeMini_Create(0, PMSNDBUFFER)) { + MessageBox(NULL, "Error while initializing emulator", "Error", MB_ICONERROR); + return 1; + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Sound, keyboard mapping and options + enablesound(0); + KeyboardRemap(&KeybWinRemap); + render_dummyframe(); + + // Create and run emulator thread + EmuThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)EmulatorThread, NULL, 0, &EmuThreadID); + + // Load stuff + PokeMini_OnUnzipError = PMWin_OnUnzipError; + PokeMini_OnLoadBIOSFile = PMWin_OnLoadBIOSFile; + PokeMini_OnLoadMINFile = PMWin_OnLoadMINFile; + PokeMini_OnLoadColorFile = PMWin_OnLoadColorFile; + PokeMini_OnLoadEEPROMFile = PMWin_OnLoadEEPROMFile; + PokeMini_OnSaveEEPROMFile = PMWin_OnSaveEEPROMFile; + PokeMini_OnLoadStateFile = PMWin_OnLoadStateFile; + PokeMini_OnSaveStateFile = PMWin_OnSaveStateFile; + if (PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + AddMinOnRecent(CommandLine.min_file); + if ((emumodeA == EMUMODE_STOP) && wclc_autorun) { + SetStatusBarText("Emulation auto-started\n"); + set_emumode(EMUMODE_RUNFULL, 1); + wclc_inactivestate = 1; + } + } + if (emumodeA == EMUMODE_STOP) SetStatusBarText("Emulator started\n"); + RedrawWindow(hMainWnd, NULL, NULL, RDW_INVALIDATE); + update_options(); + + // Main message loop + while (GetMessage(&msg, NULL, 0, 0)) { + if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + // Wait for emulator thread to finish + set_emumode(EMUMODE_TERMINATE, 0); + WaitForSingleObject(EmuThread, INFINITE); + + // Free video + if (VideoRend->WasInit()) VideoRend->Terminate(); + if (AudioRend->WasInit()) AudioRend->Terminate(); + Joystick_DInput_Terminate(); + + // Save Stuff and terminate + CommandLineConfSave(); + PokeMini_SaveFromCommandLines(1); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + // Free argc/argv parameters + for (i=0; iResizeWin(Width, Height); + if (emumodeE != EMUMODE_RUNFULL) { + InvalidateRect(hMainWnd, NULL, FALSE); + UpdateWindow(hMainWnd); + } +} + +// Limit the minimum/maximum size of the window +void OnWinSizing(WPARAM sizedtype, LPRECT area) +{ + if ((area->right - area->left) < 192) area->right = area->left + 192; + if ((area->bottom - area->top) < 128) area->bottom = area->top + 128; +} + +// Register main window class +void PokeMiniW_RegisterClasses(HINSTANCE hInstance) +{ + WNDCLASSEX wcex; + + // Register Main Window Class + wcex.cbSize = sizeof(WNDCLASSEX); + wcex.style = 0; + wcex.lpfnWndProc = (WNDPROC)PokeMiniW_WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); + wcex.hCursor = LoadCursor(NULL, IDC_ARROW); + wcex.hbrBackground = NULL; + wcex.lpszMenuName = (LPCSTR)IDR_MENU; + wcex.lpszClassName = "POKEMINIWIN"; + wcex.hIconSm = (HICON)LoadImage(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_SHARED); + RegisterClassEx(&wcex); +} + +// Create main window +int PokeMiniW_CreateWindow(HINSTANCE hInstance, int nCmdShow) +{ + int Width, Height; + + // Create window + + hMainWnd = CreateWindowEx(WS_EX_LEFT | WS_EX_ACCEPTFILES, "POKEMINIWIN", AppName, WS_OVERLAPPEDWINDOW, 0, 0, 384, 256, NULL, NULL, hInstance, NULL); + if (!hMainWnd) return FALSE; + + // Assign menu into the window + hMainMenu = GetMenu(hMainWnd); + if (!hMainMenu) return FALSE; + + // Correct the window size + if ((wclc_winw < 16) || (wclc_winh < 16)) { + Width = 384; Height = 256; + MainWndClientSize(hMainWnd, Width, Height); + } else { + MoveWindow(hMainWnd, wclc_winx, wclc_winy, wclc_winw, wclc_winh, 0); + } + + // Turn window visible + ShowWindow(hMainWnd, nCmdShow); + UpdateWindow(hMainWnd); + + return TRUE; +} + +// Destroy main window +void PokeMiniW_DestroyWindow(void) +{ + RECT wRect; + + // Save position and size + if (!clc_fullscreen) { + GetWindowRect(hMainWnd, &wRect); + wclc_winx = wRect.left; + wclc_winy = wRect.top; + wclc_winw = wRect.right - wRect.left; + wclc_winh = wRect.bottom - wRect.top; + } +} + +// Virtually Resize Client Area +void VMainWndClientSize(HWND hWnd, int Width, int Height) +{ + RECT cRect; + if (hWnd == NULL) return; + + cRect.left = 0; + cRect.top = 0; + cRect.right = Width; + cRect.bottom = Height; + AdjustWindowRect(&cRect, WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX, 1); + rWindowed.right = cRect.right - cRect.left; + rWindowed.bottom = cRect.bottom - cRect.top; +} + +// Resize Client Area +void MainWndClientSize(HWND hWnd, int Width, int Height) +{ + RECT cRect; + if (hWnd == NULL) return; + + cRect.left = 0; + cRect.top = 0; + cRect.right = Width; + cRect.bottom = Height; + AdjustWindowRect(&cRect, WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_SIZEBOX, 1); + cRect.right -= cRect.left; + cRect.bottom -= cRect.top; + SetWindowPos(hWnd, NULL, 0, 0, cRect.right, cRect.bottom, SWP_NOMOVE | SWP_NOOWNERZORDER); + OnWinResize(Width, Height); +} + +// Set StatusBar Text +void SetStatusBarText(char *format, ...) +{ + // Still nothing coded yet... +} + +// Main window callbacks +LRESULT CALLBACK PokeMiniW_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent, i; + char tmp[PMTMPV]; + + switch (message) { + case WM_COMMAND: + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); + switch (wmId) { + case ID_FILE_OPENMIN: + Menu_File_OpenMin(); + update_options(); + break; + case ID_RECENT0: + Recent_OpenMin(wclc_recent[0]); + break; + case ID_RECENT1: + Recent_OpenMin(wclc_recent[1]); + break; + case ID_RECENT2: + Recent_OpenMin(wclc_recent[2]); + break; + case ID_RECENT3: + Recent_OpenMin(wclc_recent[3]); + break; + case ID_RECENT4: + Recent_OpenMin(wclc_recent[4]); + break; + case ID_RECENT5: + Recent_OpenMin(wclc_recent[5]); + break; + case ID_RECENT6: + Recent_OpenMin(wclc_recent[6]); + break; + case ID_RECENT7: + Recent_OpenMin(wclc_recent[7]); + break; + case ID_RECENT8: + Recent_OpenMin(wclc_recent[8]); + break; + case ID_RECENT9: + Recent_OpenMin(wclc_recent[9]); + break; + case ID_RECENT_CLEARLIST: + for (i=0; i<10; i++) wclc_recent[i][0] = 0; + update_options(); + break; + case ID_FILE_LOADSTATE: + Menu_File_LoadState(); + update_options(); + break; + case ID_FILE_SAVESTATE: + Menu_File_SaveState(); + break; + case ID_CAPTURE_SNAPSHOT1XPREVIEW: + Menu_Capt_Snapshot1x(); + break; + case ID_CAPTURE_SNAPSHOTFROMLCD: + Menu_Capt_SnapshotLCD(); + break; + case ID_FILE_QUIT: + DestroyWindow(hWnd); + break; + case ID_ZOOM_1X: + Menu_Options_Zoom(1); + update_options(); + break; + case ID_ZOOM_2X: + Menu_Options_Zoom(2); + update_options(); + break; + case ID_ZOOM_3X: + Menu_Options_Zoom(3); + update_options(); + break; + case ID_ZOOM_4X: + Menu_Options_Zoom(4); + update_options(); + break; + case ID_ZOOM_5X: + Menu_Options_Zoom(5); + update_options(); + break; + case ID_ZOOM_6X: + Menu_Options_Zoom(6); + update_options(); + break; + case ID_PALETTE_0: + Menu_Options_Palette(0); + update_options(); + break; + case ID_PALETTE_1: + Menu_Options_Palette(1); + update_options(); + break; + case ID_PALETTE_2: + Menu_Options_Palette(2); + update_options(); + break; + case ID_PALETTE_3: + Menu_Options_Palette(3); + update_options(); + break; + case ID_PALETTE_4: + Menu_Options_Palette(4); + update_options(); + break; + case ID_PALETTE_5: + Menu_Options_Palette(5); + update_options(); + break; + case ID_PALETTE_6: + Menu_Options_Palette(6); + update_options(); + break; + case ID_PALETTE_7: + Menu_Options_Palette(7); + update_options(); + break; + case ID_PALETTE_8: + Menu_Options_Palette(8); + update_options(); + break; + case ID_PALETTE_9: + Menu_Options_Palette(9); + update_options(); + break; + case ID_PALETTE_10: + Menu_Options_Palette(10); + update_options(); + break; + case ID_PALETTE_11: + Menu_Options_Palette(11); + update_options(); + break; + case ID_PALETTE_12: + Menu_Options_Palette(12); + update_options(); + break; + case ID_PALETTE_13: + Menu_Options_Palette(13); + update_options(); + break; + case ID_PALETTE_14: + Menu_Options_Palette(14); + update_options(); + break; + case ID_PALETTE_15: + Menu_Options_Palette(15); + update_options(); + break; + case ID_LCDMODE_ANALOG: + Menu_Options_LCDMode(0); + update_options(); + break; + case ID_LCDMODE_3SHADES: + Menu_Options_LCDMode(1); + update_options(); + break; + case ID_LCDMODE_2SHADES: + Menu_Options_LCDMode(2); + update_options(); + break; + case ID_LCDMODE_COLORS: + Menu_Options_LCDMode(3); + update_options(); + break; + case ID_LCDFILTER_NONE: + Menu_Options_LCDFilter(0); + update_options(); + break; + case ID_LCDFILTER_MATRIX: + Menu_Options_LCDFilter(1); + update_options(); + break; + case ID_LCDFILTER_SCANLINE: + Menu_Options_LCDFilter(2); + update_options(); + break; + case ID_LCDCONTRAST_DEFAULT: + Menu_Options_LCDContrast(64); + update_options(); + break; + case ID_LCDCONTRAST_LOWEST: + Menu_Options_LCDContrast(0); + update_options(); + break; + case ID_LCDCONTRAST_LOW: + Menu_Options_LCDContrast(25); + update_options(); + break; + case ID_LCDCONTRAST_MEDIUM: + Menu_Options_LCDContrast(50); + update_options(); + break; + case ID_LCDCONTRAST_HIGH: + Menu_Options_LCDContrast(75); + update_options(); + break; + case ID_LCDCONTRAST_HIGHEST: + Menu_Options_LCDContrast(100); + update_options(); + break; + case ID_LCDCONTRAST_CUSTOM: + CustomContrast_Dialog(hInst, hMainWnd); + update_options(); + break; + case ID_LCDBRIGHT_DEFAULT: + Menu_Options_LCDBright(0); + update_options(); + break; + case ID_LCDBRIGHT_LIGHTER: + Menu_Options_LCDBright(24); + update_options(); + break; + case ID_LCDBRIGHT_LIGHT: + Menu_Options_LCDBright(12); + update_options(); + break; + case ID_LCDBRIGHT_DARK: + Menu_Options_LCDBright(-12); + update_options(); + break; + case ID_LCDBRIGHT_DARKER: + Menu_Options_LCDBright(-24); + update_options(); + break; + case ID_LCDBRIGHT_CUSTOM: + CustomBright_Dialog(hInst, hMainWnd); + update_options(); + break; + case ID_RUMBLELEVEL_0: + Menu_Options_RumbleLevel(0); + update_options(); + break; + case ID_RUMBLELEVEL_1: + Menu_Options_RumbleLevel(1); + update_options(); + break; + case ID_RUMBLELEVEL_2: + Menu_Options_RumbleLevel(2); + update_options(); + break; + case ID_RUMBLELEVEL_3: + Menu_Options_RumbleLevel(3); + update_options(); + break; + case ID_OPTIONS_FULLSCREEN: + Menu_Options_Fullscreen(); + update_options(); + break; + case ID_SOUND_DISABLED: + Menu_Options_Sound(0); + update_options(); + break; + case ID_SOUND_GENERATED: + Menu_Options_Sound(1); + update_options(); + break; + case ID_SOUND_DIRECT: + Menu_Options_Sound(2); + update_options(); + break; + case ID_SOUND_EMULATED: + Menu_Options_Sound(3); + update_options(); + break; + case ID_SOUND_DIRECTPWM: + Menu_Options_Sound(4); + update_options(); + break; + case ID_OPTIONS_PIEZOFILTER: + Menu_Options_PiezoFilter(); + update_options(); + break; + case ID_SYNCCYCLES_8: + Menu_Options_SyncCycles(8); + update_options(); + break; + case ID_SYNCCYCLES_16: + Menu_Options_SyncCycles(16); + update_options(); + break; + case ID_SYNCCYCLES_32: + Menu_Options_SyncCycles(32); + update_options(); + break; + case ID_SYNCCYCLES_64: + Menu_Options_SyncCycles(64); + update_options(); + break; + case ID_SYNCCYCLES_128: + Menu_Options_SyncCycles(128); + update_options(); + break; + case ID_SYNCCYCLES_256: + Menu_Options_SyncCycles(256); + update_options(); + break; + case ID_SYNCCYCLES_512: + Menu_Options_SyncCycles(512); + update_options(); + break; + case ID_OPTIONS_LOWBATTERY: + Menu_Options_LowBattery(); + update_options(); + break; + case ID_RTC_NORTC: + Menu_Options_RTC(0); + update_options(); + break; + case ID_RTC_STATE: + Menu_Options_RTC(1); + update_options(); + break; + case ID_RTC_HOST: + Menu_Options_RTC(2); + update_options(); + break; + case ID_OPTIONS_SHAREEEPROM: + Menu_Options_ShareEEPROM(); + update_options(); + break; + case ID_MULTICART_DISABLED: + Menu_Options_Multicart(0); + update_options(); + break; + case ID_MULTICART_FLASH512KB: + Menu_Options_Multicart(1); + update_options(); + break; + case ID_MULTICART_LUPIN512KB: + Menu_Options_Multicart(2); + update_options(); + break; + case ID_OPTIONS_FORCEFREEBIOS: + Menu_Options_ForceFreeBIOS(); + update_options(); + break; + case ID_OPTIONS_CUSTOMPALETTEEDIT: + set_emumode(EMUMODE_STOP, 1); + CustomPalEdit_Dialog(hInst, hMainWnd); + set_emumode(EMUMODE_RESTORE, 1); + break; + case ID_OPTIONS_DEFINEKEYBOARD: + set_emumode(EMUMODE_STOP, 1); + DefineKeyboard_Dialog(hInst, hMainWnd); + set_emumode(EMUMODE_RESTORE, 1); + break; + case ID_OPTIONS_DEFINEJOYSTICK: + set_emumode(EMUMODE_STOP, 1); + DefineJoystick_Dialog(hInst, hMainWnd); + set_emumode(EMUMODE_RESTORE, 1); + break; + case ID_OPTIONS_UPDATEEEPROM: + Menu_Options_UpdateEEPROM(); + break; + case ID_EMULATOR_START: + set_emumode(EMUMODE_RUNFULL, 0); + wclc_inactivestate = 1; + SetStatusBarText("Emulation started\n"); + break; + case ID_EMULATOR_STOP: + set_emumode(EMUMODE_STOP, 0); + wclc_inactivestate = 2; + SetStatusBarText("Emulation stoped\n"); + break; + case ID_RESET_HARD: + Menu_Emulator_Reset(1); + break; + case ID_RESET_SOFT: + Menu_Emulator_Reset(0); + break; + case ID_VIDEO_GDI: + Menu_Emulator_VideoRend(0); + update_options(); + break; + case ID_VIDEO_DIRECTDRAW: + Menu_Emulator_VideoRend(1); + update_options(); + break; + case ID_VIDEO_DIRECT3D: + Menu_Emulator_VideoRend(2); + update_options(); + break; + case ID_EMULATOR_AUTORUN: + Menu_Emulator_Autorun(); + update_options(); + break; + case ID_EMULATOR_PAUSEWHENINACTIVE: + Menu_Emulator_PauseInactive(); + update_options(); + break; + case ID_FILEASSOCIATION_REGISTER: + Menu_FileAssociation_Register(); + break; + case ID_FILEASSOCIATION_UNREGISTER: + Menu_FileAssociation_Unregister(); + break; + case ID_HELP_VISITWEBSITE: + Menu_Help_VisitWebsite(); + break; + case ID_HELP_COMMANDLINE: + Menu_Help_CommandLine(); + break; + case ID_HELP_ABOUT: + Menu_Help_About(); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + case WM_KEYDOWN: + OnWinKeyDownEvent((uint32_t)wParam); + break; + case WM_KEYUP: + OnWinKeyUpEvent((uint32_t)wParam); + break; + case WM_PAINT: + VideoRend->Paint(hMainWnd); + break; + case WM_SIZE: + OnWinResize(LOWORD(lParam), HIWORD(lParam)); + break; + case WM_SIZING: + OnWinSizing(wParam, (RECT *)lParam); + break; + case WM_DESTROY: + PokeMiniW_DestroyWindow(); + PostQuitMessage(0); + break; + case WM_ACTIVATE: + if (wclc_pauseinactive) { + if (LOWORD(wParam) > 0) { + if (wclc_inactivestate == 0) { + set_emumode(EMUMODE_RUNFULL, 0); + wclc_inactivestate = 1; + } + } else { + if (wclc_inactivestate == 1) { + set_emumode(EMUMODE_STOP, 0); + wclc_inactivestate = 0; + } + } + } + break; + case WM_DROPFILES: + DragQueryFile((HDROP)wParam, 0, tmp, PMTMPV); + DragDrop_OpenMin(tmp); + update_options(); + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/PokeMini_Win32.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/PokeMini_Win32.h new file mode 100644 index 0000000000..066de6cc82 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/PokeMini_Win32.h @@ -0,0 +1,50 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include "resource.h" + +enum { + EMUMODE_RESTORE = -1, // Restore mode + EMUMODE_STOP = 0, // Stopped + EMUMODE_RUNFULL, // Run at full speed + EMUMODE_TERMINATE, // Terminate +}; +extern volatile int emumodeE; // Read-Only, current emulation mode +extern volatile int emumodeA; // Read-Only, current app emu mode +void set_emumode(int mode, int tempsave); + +void PokeMiniW_RegisterClasses(HINSTANCE hInstance); +int PokeMiniW_CreateWindow(HINSTANCE hInstance, int nCmdShow); +void PokeMiniW_DestroyWindow(void); +void VMainWndClientSize(HWND hWnd, int Width, int Height); +void MainWndClientSize(HWND hWnd, int Width, int Height); +LRESULT CALLBACK PokeMiniW_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +void SetStatusBarText(char *format, ...); + +extern int wclc_winx; +extern int wclc_winy; +extern int wclc_winw; +extern int wclc_winh; +extern int wclc_autorun; +extern int wclc_videorend; +extern int wclc_audiorend; +extern int wclc_forcefeedback; + +void render_dummyframe(void); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini.sln b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini.sln new file mode 100644 index 0000000000..8ecbfb46ba --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PokeMini", "PokeMini.vcproj", "{A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Debug|Win32.ActiveCfg = Debug|Win32 + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Debug|Win32.Build.0 = Debug|Win32 + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Release|Win32.ActiveCfg = Release|Win32 + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini.vcproj b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini.vcproj new file mode 100644 index 0000000000..2c90f04fbe --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini.vcproj @@ -0,0 +1,623 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini_Win32.rc b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini_Win32.rc new file mode 100644 index 0000000000..b9a0a23cc8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/PokeMini_Win32.rc @@ -0,0 +1,474 @@ +// Microsoft Visual C++ generated resource script. +// +#include "Resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" +#include "pokemini.rc" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON "Icon_PkBl_48.ico" +IDI_ICON2 ICON "Icon_Min1_48.ico" +IDI_ICON3 ICON "Icon_Min2_48.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "Resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "#include ""pokemini.rc""\r\n" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Open Min...\tCtrl+O", ID_FILE_OPENMIN + POPUP "Recent" + BEGIN + MENUITEM "---\tCtrl+F1", ID_RECENT0 + MENUITEM "---\tCtrl+F2", ID_RECENT1 + MENUITEM "---\tCtrl+F3", ID_RECENT2 + MENUITEM "---\tCtrl+F4", ID_RECENT3 + MENUITEM "---\tCtrl+F5", ID_RECENT4 + MENUITEM "---\tCtrl+F6", ID_RECENT5 + MENUITEM "---\tCtrl+F7", ID_RECENT6 + MENUITEM "---\tCtrl+F8", ID_RECENT7 + MENUITEM "---\tCtrl+F9", ID_RECENT8 + MENUITEM "---\tCtrl+F10", ID_RECENT9 + MENUITEM SEPARATOR + MENUITEM "Clear List", ID_RECENT_CLEARLIST + END + MENUITEM SEPARATOR + MENUITEM "&Load State...\tCtrl+L", ID_FILE_LOADSTATE + MENUITEM "&Save State...\tCtrl+K", ID_FILE_SAVESTATE + MENUITEM SEPARATOR + POPUP "Capture" + BEGIN + MENUITEM "Snapshot 1x preview", ID_CAPTURE_SNAPSHOT1XPREVIEW + MENUITEM "Snapshot from LCD", ID_CAPTURE_SNAPSHOTFROMLCD + END + MENUITEM SEPARATOR + MENUITEM "&Quit\tCtrl+Q", ID_FILE_QUIT + END + POPUP "&Options" + BEGIN + POPUP "&Zoom" + BEGIN + MENUITEM "1x (96x64)", ID_ZOOM_1X + MENUITEM "2x (192x128)", ID_ZOOM_2X + MENUITEM "3x (288x192)", ID_ZOOM_3X + MENUITEM "4x (384x256)", ID_ZOOM_4X + MENUITEM "5x (480x320)", ID_ZOOM_5X + MENUITEM "6x (576x384)", ID_ZOOM_6X + END + POPUP "&Palette" + BEGIN + MENUITEM "Original", ID_PALETTE_0 + MENUITEM "Old PokeMini", ID_PALETTE_1 + MENUITEM "Black && White", ID_PALETTE_2 + MENUITEM "Green Palette", ID_PALETTE_3 + MENUITEM "Green Vector", ID_PALETTE_4 + MENUITEM "Red Palette", ID_PALETTE_5 + MENUITEM "Red Vector", ID_PALETTE_6 + MENUITEM "Blue LCD", ID_PALETTE_7 + MENUITEM "LED Backlight", ID_PALETTE_8 + MENUITEM "Girlish", ID_PALETTE_9 + MENUITEM "Blue Palette", ID_PALETTE_10 + MENUITEM "Blue Vector", ID_PALETTE_11 + MENUITEM "Sepia", ID_PALETTE_12 + MENUITEM "Inverted B&&W", ID_PALETTE_13 + MENUITEM "Custom 1", ID_PALETTE_14 + MENUITEM "Custom 2", ID_PALETTE_15 + END + POPUP "&LCD Mode" + BEGIN + MENUITEM "Analog", ID_LCDMODE_ANALOG + MENUITEM "3-Shades", ID_LCDMODE_3SHADES + MENUITEM "2-Shades", ID_LCDMODE_2SHADES + MENUITEM "Colors*", ID_LCDMODE_COLORS + END + POPUP "LCD &Filter" + BEGIN + MENUITEM "None", ID_LCDFILTER_NONE + MENUITEM "Dot-Matrix / High", ID_LCDFILTER_MATRIX + MENUITEM "50% Scanline", ID_LCDFILTER_SCANLINE + END + POPUP "LCD Contrast" + BEGIN + MENUITEM "Default", ID_LCDCONTRAST_DEFAULT + MENUITEM "Lowest", ID_LCDCONTRAST_LOWEST + MENUITEM "Low", ID_LCDCONTRAST_LOW + MENUITEM "Medium", ID_LCDCONTRAST_MEDIUM + MENUITEM "High", ID_LCDCONTRAST_HIGH + MENUITEM "Highest", ID_LCDCONTRAST_HIGHEST + MENUITEM "Custom...", ID_LCDCONTRAST_CUSTOM + END + POPUP "LCD Brightness" + BEGIN + MENUITEM "Default", ID_LCDBRIGHT_DEFAULT + MENUITEM "Lighter", ID_LCDBRIGHT_LIGHTER + MENUITEM "Light", ID_LCDBRIGHT_LIGHT + MENUITEM "Dark", ID_LCDBRIGHT_DARK + MENUITEM "Darker", ID_LCDBRIGHT_DARKER + MENUITEM "Custom...", ID_LCDBRIGHT_CUSTOM + END + POPUP "Rumble Level" + BEGIN + MENUITEM "None", ID_RUMBLELEVEL_0 + MENUITEM "Weak", ID_RUMBLELEVEL_1 + MENUITEM "Medium", ID_RUMBLELEVEL_2 + MENUITEM "Strong", ID_RUMBLELEVEL_3 + END + MENUITEM "Fullscreen\tF10", ID_OPTIONS_FULLSCREEN + MENUITEM SEPARATOR + POPUP "&Sound" + BEGIN + MENUITEM "Disabled", ID_SOUND_DISABLED + MENUITEM "Generated", ID_SOUND_GENERATED + MENUITEM "Direct", ID_SOUND_DIRECT + MENUITEM "Emulated", ID_SOUND_EMULATED + MENUITEM "Direct PWM", ID_SOUND_DIRECTPWM + END + MENUITEM "Pie&zo Filter", ID_OPTIONS_PIEZOFILTER + MENUITEM SEPARATOR + POPUP "&Sync Cycles" + BEGIN + MENUITEM "8 (Accurancy)", ID_SYNCCYCLES_8 + MENUITEM "16", ID_SYNCCYCLES_16 + MENUITEM "32", ID_SYNCCYCLES_32 + MENUITEM "64 (Performance)", ID_SYNCCYCLES_64 + MENUITEM "128 (Not recommended)", ID_SYNCCYCLES_128 + MENUITEM "256 (Not recommended)", ID_SYNCCYCLES_256 + MENUITEM "512 (Not recommended)", ID_SYNCCYCLES_512 + END + MENUITEM SEPARATOR + MENUITEM "&Low Battery", ID_OPTIONS_LOWBATTERY + POPUP "&RTC" + BEGIN + MENUITEM "No RTC", ID_RTC_NORTC + MENUITEM "State time difference", ID_RTC_STATE + MENUITEM "RTC from Host", ID_RTC_HOST + END + MENUITEM "Share &EEPROM", ID_OPTIONS_SHAREEEPROM + POPUP "&Multicart" + BEGIN + MENUITEM "Disabled", ID_MULTICART_DISABLED + MENUITEM "Flash 512KB (AM29LV040B)", ID_MULTICART_FLASH512KB + MENUITEM "Lupin 512KB (AM29LV040B)", ID_MULTICART_LUPIN512KB + END + MENUITEM "Force Free&BIOS", ID_OPTIONS_FORCEFREEBIOS + MENUITEM SEPARATOR + POPUP "File association" + BEGIN + MENUITEM "Register", ID_FILEASSOCIATION_REGISTER + MENUITEM "Unregister", ID_FILEASSOCIATION_UNREGISTER + END + MENUITEM SEPARATOR + MENUITEM "&Custom Palette Edit...", ID_OPTIONS_CUSTOMPALETTEEDIT + MENUITEM "Define &Keyboard...", ID_OPTIONS_DEFINEKEYBOARD + MENUITEM "Define &Joystick...", ID_OPTIONS_DEFINEJOYSTICK + MENUITEM "&Update EEPROM", ID_OPTIONS_UPDATEEEPROM + END + POPUP "&Emulator" + BEGIN + MENUITEM "Start\tF5", ID_EMULATOR_START + MENUITEM "Stop\tF2", ID_EMULATOR_STOP + MENUITEM SEPARATOR + POPUP "&Reset" + BEGIN + MENUITEM "&Soft (Partial)\tShift+R", ID_RESET_SOFT + MENUITEM "&Hard (Full)\tCtrl+R", ID_RESET_HARD + END + POPUP "Video" + BEGIN + MENUITEM "GDI", ID_VIDEO_GDI + MENUITEM "DirectDraw", ID_VIDEO_DIRECTDRAW + MENUITEM "Direct3D", ID_VIDEO_DIRECT3D + END + MENUITEM "Autorun", ID_EMULATOR_AUTORUN + MENUITEM "Pause when inactive", ID_EMULATOR_PAUSEWHENINACTIVE + END + POPUP "&Help" + BEGIN + MENUITEM "Visit website", ID_HELP_VISITWEBSITE + MENUITEM SEPARATOR + MENUITEM "&Command-Line switches...", ID_HELP_COMMANDLINE + MENUITEM "&About", ID_HELP_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +IDR_WINXP RT_MANIFEST "winxp.manifest" + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_ACCELERATOR ACCELERATORS +BEGIN + VK_F5, ID_EMULATOR_START, VIRTKEY, NOINVERT + VK_F2, ID_EMULATOR_STOP, VIRTKEY, NOINVERT + "O", ID_FILE_OPENMIN, VIRTKEY, CONTROL, NOINVERT + "Q", ID_FILE_QUIT, VIRTKEY, CONTROL, NOINVERT + VK_F10, ID_OPTIONS_FULLSCREEN, VIRTKEY, NOINVERT + "R", ID_RESET_HARD, VIRTKEY, CONTROL, NOINVERT + "R", ID_RESET_SOFT, VIRTKEY, SHIFT, NOINVERT + VK_F1, ID_RECENT0, VIRTKEY, CONTROL, NOINVERT + VK_F2, ID_RECENT1, VIRTKEY, CONTROL, NOINVERT + VK_F3, ID_RECENT2, VIRTKEY, CONTROL, NOINVERT + VK_F4, ID_RECENT3, VIRTKEY, CONTROL, NOINVERT + VK_F5, ID_RECENT4, VIRTKEY, CONTROL, NOINVERT + VK_F6, ID_RECENT5, VIRTKEY, CONTROL, NOINVERT + VK_F7, ID_RECENT6, VIRTKEY, CONTROL, NOINVERT + VK_F8, ID_RECENT7, VIRTKEY, CONTROL, NOINVERT + VK_F9, ID_RECENT8, VIRTKEY, CONTROL, NOINVERT + VK_F10, ID_RECENT9, VIRTKEY, CONTROL, NOINVERT + "L", ID_FILE_LOADSTATE, VIRTKEY, CONTROL, NOINVERT + "K", ID_FILE_SAVESTATE, VIRTKEY, CONTROL, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_KEYDEF DIALOGEX 0, 0, 267, 185 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Define Keyboard" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,157,164,50,14 + PUSHBUTTON "Cancel",IDCANCEL,210,164,50,14 + RTEXT "Key Menu:",IDC_KEYL_MENU,7,7,40,10,SS_CENTERIMAGE + RTEXT "Key A:",IDC_KEYL_A,7,22,40,10,SS_CENTERIMAGE + RTEXT "Key B:",IDC_KEYL_B,7,37,40,10,SS_CENTERIMAGE + RTEXT "Key C:",IDC_KEYL_C,7,52,40,10,SS_CENTERIMAGE + RTEXT "Key Up:",IDC_KEYL_UP,7,67,40,10,SS_CENTERIMAGE + RTEXT "Key Down:",IDC_KEYL_DOWN,7,82,40,10,SS_CENTERIMAGE + RTEXT "Key Left:",IDC_KEYL_LEFT,7,97,40,10,SS_CENTERIMAGE + RTEXT "Key Right:",IDC_KEYL_RIGHT,7,112,40,10,SS_CENTERIMAGE + RTEXT "Key Power:",IDC_KEYL_POWER,7,127,40,10,SS_CENTERIMAGE + RTEXT "Key Shake:",IDC_KEYL_SHAKE,7,142,40,10,SS_CENTERIMAGE + COMBOBOX IDC_KEYC1_MENU,56,7,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_MENU,160,7,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_A,56,22,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_A,160,22,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_B,56,37,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_B,160,37,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_C,56,52,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_C,160,52,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_UP,56,67,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_UP,160,67,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_DOWN,56,82,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_DOWN,160,82,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_LEFT,56,97,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_LEFT,160,97,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_RIGHT,56,112,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_RIGHT,160,112,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_POWER,56,127,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_POWER,160,127,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_SHAKE,56,142,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_SHAKE,160,142,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + +IDD_JOYDEF DIALOGEX 0, 0, 163, 262 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Define Joystick" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,53,241,50,14 + PUSHBUTTON "Cancel",IDCANCEL,106,241,50,14 + CONTROL "Enable Joystick",IDC_ENABLEJOY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,65,10 + COMBOBOX IDC_JOYDEVSELECT,56,20,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Device:",IDC_JOYDEVLABEL,7,23,40,10,SS_CENTERIMAGE + CONTROL "Axis as D-Pad",IDC_AXISASDPAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,55,60,10 + CONTROL "Hats as D-Pad",IDC_HATSASDPAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,68,61,10 + RTEXT "Key Menu:",IDC_KEYL_MENU,7,84,40,10,SS_CENTERIMAGE + RTEXT "Key A:",IDC_KEYL_A,7,100,40,10,SS_CENTERIMAGE + RTEXT "Key B:",IDC_KEYL_B,7,115,40,10,SS_CENTERIMAGE + RTEXT "Key C:",IDC_KEYL_C,7,130,40,10,SS_CENTERIMAGE + RTEXT "Key Up:",IDC_KEYL_UP,7,145,40,10,SS_CENTERIMAGE + RTEXT "Key Down:",IDC_KEYL_DOWN,7,160,40,10,SS_CENTERIMAGE + RTEXT "Key Left:",IDC_KEYL_LEFT,7,175,40,10,SS_CENTERIMAGE + RTEXT "Key Right:",IDC_KEYL_RIGHT,7,190,40,10,SS_CENTERIMAGE + RTEXT "Key Power:",IDC_KEYL_POWER,7,205,40,10,SS_CENTERIMAGE + RTEXT "Key Shake:",IDC_KEYL_SHAKE,7,220,40,10,SS_CENTERIMAGE + COMBOBOX IDC_KEYC1_MENU,56,85,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_A,56,100,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_B,56,115,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_C,56,130,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_UP,56,145,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_DOWN,56,160,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_LEFT,56,175,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_RIGHT,56,190,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_POWER,56,205,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_SHAKE,56,220,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Force-Feedback for Rumble",IDC_FORCEFEEDBACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,42,104,10 +END + +IDD_CUSTOMPALEDIT DIALOGEX 0, 0, 190, 330 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Custom Palette Edit..." +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,78,309,50,14 + PUSHBUTTON "Cancel",IDCANCEL,131,309,50,14 + CTEXT "Custom 1 (Light Pixel):",IDC_STATIC,7,7,174,8 + CONTROL "Custom 1 (Light Pixel)",IDC_CUSTOM1LIGHTP, + "POKEMINI_cpaledit",WS_TABSTOP,7,17,174,24 + CONTROL "",IDC_CUSTOM1LIGHTRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,42,58,16 + CONTROL "",IDC_CUSTOM1LIGHTGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,42,58,16 + CONTROL "",IDC_CUSTOM1LIGHTBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,42,58,16 + CTEXT "Red: 255",IDC_CUSTOM1LIGHTRL,7,60,58,16 + CTEXT "Green: 255",IDC_CUSTOM1LIGHTGL,65,60,58,16 + CTEXT "Blue: 255",IDC_CUSTOM1LIGHTBL,123,60,58,16 + CTEXT "Custom 1 (Dark Pixel):",IDC_STATIC,7,83,174,8 + CONTROL "Custom 1 (Dark Pixel)",IDC_CUSTOM1DARKP, + "POKEMINI_cpaledit",WS_TABSTOP,7,93,174,24 + CONTROL "",IDC_CUSTOM1DARKRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,118,58,16 + CONTROL "",IDC_CUSTOM1DARKGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,118,58,16 + CONTROL "",IDC_CUSTOM1DARKBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,118,58,16 + CTEXT "Red: 255",IDC_CUSTOM1DARKRL,7,136,58,16 + CTEXT "Green: 255",IDC_CUSTOM1DARKGL,65,136,58,16 + CTEXT "Blue: 255",IDC_CUSTOM1DARKBL,123,136,58,16 + CTEXT "Custom 2 (Light Pixel):",IDC_STATIC,7,158,174,8 + CONTROL "Custom 2 (Light Pixel)",IDC_CUSTOM2LIGHTP, + "POKEMINI_cpaledit",WS_TABSTOP,7,167,174,24 + CONTROL "",IDC_CUSTOM2LIGHTRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,193,58,16 + CONTROL "",IDC_CUSTOM2LIGHTGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,193,58,16 + CONTROL "",IDC_CUSTOM2LIGHTBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,193,58,16 + CTEXT "Red: 255",IDC_CUSTOM2LIGHTRL,7,210,58,16 + CTEXT "Green: 255",IDC_CUSTOM2LIGHTGL,65,210,58,16 + CTEXT "Blue: 255",IDC_CUSTOM2LIGHTBL,123,210,58,16 + CTEXT "Custom 2 (Dark Pixel):",IDC_STATIC,7,233,174,8 + CONTROL "Custom 1 (Dark Pixel)",IDC_CUSTOM2DARKP, + "POKEMINI_cpaledit",WS_TABSTOP,7,242,174,24 + CONTROL "",IDC_CUSTOM2DARKRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,267,58,16 + CONTROL "",IDC_CUSTOM2DARKGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,267,58,16 + CONTROL "",IDC_CUSTOM2DARKBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,267,58,16 + CTEXT "Red: 255",IDC_CUSTOM2DARKRL,7,286,58,16 + CTEXT "Green: 255",IDC_CUSTOM2DARKGL,65,286,58,16 + CTEXT "Blue: 255",IDC_CUSTOM2DARKBL,123,286,58,16 +END + +IDD_CUSTOMSLIDER DIALOGEX 0, 0, 186, 49 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Set custom value..." +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,75,28,50,14 + PUSHBUTTON "Cancel",IDCANCEL,129,28,50,14 + CONTROL "",IDC_CUSTOMSLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,7,172,15 + CTEXT "Value: 0",IDC_CUSTOMSLIDERT,7,26,58,16 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_KEYDEF, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 260 + TOPMARGIN, 7 + BOTTOMMARGIN, 178 + END + + IDD_JOYDEF, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 156 + TOPMARGIN, 7 + BOTTOMMARGIN, 255 + END + + IDD_CUSTOMPALEDIT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 181 + TOPMARGIN, 7 + BOTTOMMARGIN, 323 + END + + IDD_CUSTOMSLIDER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 42 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/Resource.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/Resource.h new file mode 100644 index 0000000000..8e4dd86633 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/Resource.h @@ -0,0 +1,234 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by PokeMini_Win32.rc +// +#define IDI_ICON1 100 +#define IDI_ICON2 101 +#define IDI_ICON3 102 +#define IDR_MENU 103 +#define IDR_WINXP 104 +#define IDR_ACCELERATOR 105 +#define IDD_KEYDEF 106 +#define IDD_JOYDEF 107 +#define IDD_CUSTOMPALEDIT 108 +#define IDD_CUSTOMSLIDER 109 +#define IDC_STATUSBAR 120 +#define IDC_KEYL_C 120 +#define IDC_TITLETIMER 121 +#define IDC_KEYL_MENU 1001 +#define IDC_KEYC1_MENU 1002 +#define IDC_KEYL_A 1003 +#define IDC_KEYL_B 1004 +#define IDC_KEYL_UP 1006 +#define IDC_KEYL_DOWN 1007 +#define IDC_KEYL_LEFT 1008 +#define IDC_KEYL_RIGHT 1009 +#define IDC_KEYL_POWER 1010 +#define IDC_KEYL_SHAKE 1011 +#define IDC_KEYC2_MENU 1012 +#define IDC_JOYDEVLABEL 1012 +#define IDC_KEYC1_A 1013 +#define IDC_KEYC2_A 1014 +#define IDC_KEYC1_B 1015 +#define IDC_KEYC2_B 1016 +#define IDC_KEYC1_C 1017 +#define IDC_KEYC2_C 1018 +#define IDC_KEYC1_UP 1019 +#define IDC_KEYC2_UP 1020 +#define IDC_KEYC1_DOWN 1021 +#define IDC_COMBO12 1022 +#define IDC_KEYC2_DOWN 1022 +#define IDC_KEYC1_LEFT 1023 +#define IDC_KEYC2_LEFT 1024 +#define IDC_KEYC1_RIGHT 1025 +#define IDC_KEYC2_RIGHT 1026 +#define IDC_KEYC1_POWER 1027 +#define IDC_KEYC2_POWER 1028 +#define IDC_KEYC1_SHAKE 1029 +#define IDC_COMBO8 1030 +#define IDC_KEYC2_SHAKE 1030 +#define IDC_ENABLEJOY 1031 +#define IDC_JOYDEVSELECT 1032 +#define IDC_AXISASDPAD 1033 +#define IDC_CHECK3 1034 +#define IDC_HATSASDPAD 1034 +#define IDC_CHECK1 1035 +#define IDC_FORCEFEEDBACK 1035 +#define IDC_CUSTOM1LIGHT 1036 +#define IDC_CUSTOM1DARK 1036 +#define IDC_CUSTOM1LIGHTP 1036 +#define IDC_CUSTOM1LIGHTRS 1037 +#define IDC_CUSTOM1LIGHTGS 1038 +#define IDC_SLIDER3 1039 +#define IDC_CUSTOM1LIGHTBS 1039 +#define IDC_CUSTOM1LIGHTRL 1040 +#define IDC_CUSTOM1LIGHTGL 1041 +#define IDC_CUSTOM1LIGHTBL 1042 +#define IDC_CUSTOM1LIGHT2 1043 +#define IDC_CUSTOM1DARKP 1043 +#define IDC_CUSTOM1DARKRS 1044 +#define IDC_CUSTOM1DARKGS 1045 +#define IDC_CUSTOM1DARKBS 1046 +#define IDC_CUSTOM1DARKRL 1047 +#define IDC_CUSTOM1DARKGL 1048 +#define IDC_CUSTOM1LIGHTBL2 1049 +#define IDC_CUSTOM1DARKBL 1049 +#define IDC_CUSTOMSLIDER 1052 +#define IDC_CUSTOMSLIDERL 1053 +#define IDC_CUSTOMSLIDERT 1053 +#define IDC_CUSTOM2LIGHTP 1057 +#define IDC_CUSTOM2LIGHTRS 1058 +#define IDC_CUSTOM2LIGHTGS 1059 +#define IDC_CUSTOM2LIGHTBS 1060 +#define IDC_CUSTOM2LIGHTRL 1061 +#define IDC_CUSTOM2LIGHTGL 1062 +#define IDC_CUSTOM2LIGHTBL 1063 +#define IDC_CUSTOM2DARKP 1071 +#define IDC_CUSTOM2DARKRS 1072 +#define IDC_CUSTOM2DARKGS 1073 +#define IDC_CUSTOM2DARKBS 1074 +#define IDC_CUSTOM2DARKRL 1075 +#define IDC_CUSTOM2DARKGL 1076 +#define IDC_CUSTOM1DARKBL2 1077 +#define IDC_CUSTOM2DARKBL 1077 +#define ID_FILE_OPENMIN 40001 +#define ID_FILE_OPENBIOS 40002 +#define ID_FILE_RELOADMIN 40003 +#define ID_FILE_LOADSTATE 40005 +#define ID_FILE_SAVESTATE 40006 +#define ID_FILE_QUIT 40007 +#define ID_FILE_FREEBIOS 40008 +#define ID_ZOOM_1X 40010 +#define ID_ZOOM_2X 40011 +#define ID_ZOOM_3X 40012 +#define ID_ZOOM_4X 40013 +#define ID_ZOOM_5X 40014 +#define ID_ZOOM_6X 40015 +#define ID_PALETTE_0 40033 +#define ID_PALETTE_1 40034 +#define ID_PALETTE_2 40035 +#define ID_PALETTE_3 40036 +#define ID_PALETTE_4 40037 +#define ID_PALETTE_5 40038 +#define ID_PALETTE_6 40039 +#define ID_PALETTE_7 40040 +#define ID_PALETTE_8 40041 +#define ID_PALETTE_9 40042 +#define ID_PALETTE_10 40043 +#define ID_PALETTE_11 40044 +#define ID_PALETTE_12 40045 +#define ID_PALETTE_13 40046 +#define ID_PALETTE_14 40047 +#define ID_PALETTE_15 40048 +#define ID_LCDMODE_ANALOG 40050 +#define ID_LCDMODE_COLORS 40053 +#define ID_LCDMODE_3SHADES 40054 +#define ID_LCDMODE_2SHADES 40055 +#define ID_LCDFILTER_NONE 40057 +#define ID_LCDFILTER_MATRIX 40059 +#define ID_SOUND_DISABLED 40061 +#define ID_SOUND_DIRECT 40062 +#define ID_SOUND_EMULATED 40063 +#define ID_SOUND_GENERATED 40064 +#define ID_SOUND_DIRECTPWM 40065 +#define ID_OPTIONS_PIEZOFILTER 40066 +#define ID_SYNCCYCLES_8 40068 +#define ID_SYNCCYCLES_16 40069 +#define ID_SYNCCYCLES_32 40070 +#define ID_SYNCCYCLES_64 40071 +#define ID_SYNCCYCLES_128 40072 +#define ID_SYNCCYCLES_256 40073 +#define ID_SYNCCYCLES_512 40074 +#define ID_OPTIONS_LOWBATTERY 40075 +#define ID_RTC_NORTC 40077 +#define ID_RTC_STATE 40080 +#define ID_RTC_HOST 40081 +#define ID_OPTIONS_SHAREEEPROM 40082 +#define ID_MULTICART_DISABLED 40084 +#define ID_MULTICART_FLASH512KB 40085 +#define ID_MULTICART_LUPIN512KB 40086 +#define ID_OPTIONS_FORCEFREEBIOS 40087 +#define ID_OPTIONS_UPDATEEEPROM 40088 +#define ID_OPTIONS_SAVEOPTIONS 40089 +#define ID_RESET_HARD 40091 +#define ID_RESET_SOFT 40092 +#define ID_HELP_ABOUT 40094 +#define ID_HELP_COMMANDLINE 40095 +#define ID_EMULATOR_START 40098 +#define ID_EMULATOR_STOP 40099 +#define ID_BPP_16BPP 40103 +#define ID_BPP_32BPP 40104 +#define ID_EMULATOR_AUTORUN 40105 +#define ID_EMULATOR_VIDEO 40106 +#define ID_VIDEO_GDI 40107 +#define ID_VIDEO_DIRECTDRAW 40108 +#define ID_VIDEO_DIRECT3D 40109 +#define ID_OPTIONS_FULLSCREEN 40118 +#define ID_OPTIONS_DEFINEKEYBOARD 40119 +#define ID_OPTIONS_DEFINEJOYSTICK 40120 +#define ID_OPTIONS_CUSTOMPALETTEEDIT 40121 +#define ID_HELP_VISITWEBSITE 40122 +#define ID_FILE_CAPTURE 40123 +#define ID_CAPTURE_SNAPSHOT1XPREVIEW 40124 +#define ID_CAPTURE_SNAPSHOTFROMLCD 40125 +#define ID_LCDFILTER_50 40126 +#define ID_LCDFILTER_SCANLINE 40127 +#define ID_FILE_RECENT 40128 +#define ID_RECENT_CLEARLIST 40129 +#define ID_RECENT_ 40130 +#define ID_RECENT0 40131 +#define ID_RECENT1 40132 +#define ID_RECENT2 40133 +#define ID_RECENT3 40134 +#define ID_RECENT4 40135 +#define ID_RECENT5 40136 +#define ID_RECENT6 40137 +#define ID_RECENT7 40138 +#define ID_RECENT8 40139 +#define ID_RECENT9 40140 +#define ID_EMULATOR_PAUSEWHENINACTIVE 40145 +#define ID_EMULATOR_FILEASSOCIATION 40146 +#define ID_FILEASSOCIATION_REGISTER 40147 +#define ID_FILEASSOCIATION_UNREGISTER 40148 +#define ID_OPTIONS_RUMBLEAMOUNT 40149 +#define ID_OPTIONS_RUMBLELEVEL 40150 +#define ID_RUMBLELEVEL_NONE 40151 +#define ID_RUMBLELEVEL_WEAK 40152 +#define ID_RUMBLELEVEL_MEDIUM 40153 +#define ID_RUMBLELEVEL_STRONG 40154 +#define ID_RUMBLELEVEL_0 40155 +#define ID_RUMBLELEVEL_1 40156 +#define ID_RUMBLELEVEL_2 40157 +#define ID_RUMBLELEVEL_3 40158 +#define ID_OPTIONS_LCDCONTRAST 40159 +#define ID_LCDCONTRAST_DEFAULT 40160 +#define ID_LCDCONTRAST_LOWEST 40161 +#define ID_LCDCONTRAST_HIGHEST 40162 +#define ID_LCDCONTRAST_CUSTOM 40163 +#define ID_OPTIONS_LCDBRIGHTNESS 40164 +#define ID_LCDBRIGHTNESS_DEFAULT 40165 +#define ID_LCDBRIGHTNESS_LIGHTER 40166 +#define ID_LCDBRIGHTNESS_LIGHT 40167 +#define ID_LCDBRIGHTNESS_DARK 40168 +#define ID_LCDBRIGHTNESS_DARKER 40169 +#define ID_LCDBRIGHTNESS_CUSTOM 40170 +#define ID_LCDCONTRAST_MEDIUM 40171 +#define ID_LCDBRIGHT_DEFAULT 40172 +#define ID_LCDBRIGHT_LIGHTER 40173 +#define ID_LCDBRIGHT_LIGHT 40174 +#define ID_LCDBRIGHT_DARK 40175 +#define ID_LCDBRIGHT_DARKER 40176 +#define ID_LCDBRIGHT_CUSTOM 40177 +#define ID_LCDCONTRAST_LOW 40178 +#define ID_LCDCONTRAST_HIGH 40179 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 110 +#define _APS_NEXT_COMMAND_VALUE 40180 +#define _APS_NEXT_CONTROL_VALUE 1054 +#define _APS_NEXT_SYMED_VALUE 103 +#endif +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/winxp.manifest b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/winxp.manifest new file mode 100644 index 0000000000..9022235b05 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2005/winxp.manifest @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.sln b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.sln new file mode 100644 index 0000000000..036e2e4de8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PokeMini", "PokeMini.vcxproj", "{A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Debug|Win32.ActiveCfg = Debug|Win32 + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Debug|Win32.Build.0 = Debug|Win32 + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Release|Win32.ActiveCfg = Release|Win32 + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj new file mode 100644 index 0000000000..91de3d22c0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj @@ -0,0 +1,209 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {A9E4D423-8C5B-4F1B-AE80-DA4F848ECBA9} + PokeMini + Win32Proj + + + + Application + NotSet + true + + + Application + NotSet + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + AllRules.ruleset + + + AllRules.ruleset + + + + + + Disabled + .;..\..\..\freebios;..\..\..\source;..\..\..\sourcex;..\..\..\resource;..\..\..\dependencies\minizip;..\..\..\dependencies\zlib;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_WINDOWS;NO_SCANDIRS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + + Level3 + EditAndContinue + + + comctl32.lib;winmm.lib;ddraw.lib;d3d9.lib;dxguid.lib;dsound.lib;dinput8.lib;%(AdditionalDependencies) + $(DXSDK_DIR)Lib\x86;%(AdditionalLibraryDirectories) + true + Windows + MachineX86 + + + + + .;..\..\..\freebios;..\..\..\source;..\..\..\sourcex;..\..\..\resource;..\..\..\dependencies\minizip;..\..\..\dependencies\zlib;$(DXSDK_DIR)Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_WINDOWS;NO_SCANDIRS;%(PreprocessorDefinitions) + MultiThreadedDLL + + + Level3 + ProgramDatabase + + + comctl32.lib;winmm.lib;ddraw.lib;d3d9.lib;dxguid.lib;dsound.lib;dinput8.lib;%(AdditionalDependencies) + $(DXSDK_DIR)Lib\x86;%(AdditionalLibraryDirectories) + true + Windows + true + true + MachineX86 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\..\resource;..\..\..\source;%(AdditionalIncludeDirectories) + ..\..\..\resource;..\..\..\source;%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj.filters b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj.filters new file mode 100644 index 0000000000..662984b1b1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj.filters @@ -0,0 +1,340 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {571bc8f9-b349-4534-9eb4-e141c5e8c3bc} + + + {8e0a3a2f-3589-4830-acb3-c987e839d5c4} + + + {6c15f83e-2182-462b-8905-eec550aa87bf} + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {a2d75a63-a488-4d0c-bf3a-890349020d6d} + + + {79869ec3-1e73-45d3-b2f3-4ddc24e1562e} + + + {59393cca-9d79-4f3a-b116-ad2f2ed71397} + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Source + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Zip + + + Source Files\Misc + + + Source Files\Misc + + + Source Files\Source + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Source + + + Header Files\Misc + + + Header Files\Misc + + + Header Files\Zip + + + Header Files\Zip + + + + + Resource Files + + + + + + + + Resource Files + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj.user b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj.user new file mode 100644 index 0000000000..ace9a86acb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini_Win32.rc b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini_Win32.rc new file mode 100644 index 0000000000..b9a0a23cc8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/PokeMini_Win32.rc @@ -0,0 +1,474 @@ +// Microsoft Visual C++ generated resource script. +// +#include "Resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" +#include "pokemini.rc" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON1 ICON "Icon_PkBl_48.ico" +IDI_ICON2 ICON "Icon_Min1_48.ico" +IDI_ICON3 ICON "Icon_Min2_48.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "Resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "#include ""pokemini.rc""\r\n" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDR_MENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Open Min...\tCtrl+O", ID_FILE_OPENMIN + POPUP "Recent" + BEGIN + MENUITEM "---\tCtrl+F1", ID_RECENT0 + MENUITEM "---\tCtrl+F2", ID_RECENT1 + MENUITEM "---\tCtrl+F3", ID_RECENT2 + MENUITEM "---\tCtrl+F4", ID_RECENT3 + MENUITEM "---\tCtrl+F5", ID_RECENT4 + MENUITEM "---\tCtrl+F6", ID_RECENT5 + MENUITEM "---\tCtrl+F7", ID_RECENT6 + MENUITEM "---\tCtrl+F8", ID_RECENT7 + MENUITEM "---\tCtrl+F9", ID_RECENT8 + MENUITEM "---\tCtrl+F10", ID_RECENT9 + MENUITEM SEPARATOR + MENUITEM "Clear List", ID_RECENT_CLEARLIST + END + MENUITEM SEPARATOR + MENUITEM "&Load State...\tCtrl+L", ID_FILE_LOADSTATE + MENUITEM "&Save State...\tCtrl+K", ID_FILE_SAVESTATE + MENUITEM SEPARATOR + POPUP "Capture" + BEGIN + MENUITEM "Snapshot 1x preview", ID_CAPTURE_SNAPSHOT1XPREVIEW + MENUITEM "Snapshot from LCD", ID_CAPTURE_SNAPSHOTFROMLCD + END + MENUITEM SEPARATOR + MENUITEM "&Quit\tCtrl+Q", ID_FILE_QUIT + END + POPUP "&Options" + BEGIN + POPUP "&Zoom" + BEGIN + MENUITEM "1x (96x64)", ID_ZOOM_1X + MENUITEM "2x (192x128)", ID_ZOOM_2X + MENUITEM "3x (288x192)", ID_ZOOM_3X + MENUITEM "4x (384x256)", ID_ZOOM_4X + MENUITEM "5x (480x320)", ID_ZOOM_5X + MENUITEM "6x (576x384)", ID_ZOOM_6X + END + POPUP "&Palette" + BEGIN + MENUITEM "Original", ID_PALETTE_0 + MENUITEM "Old PokeMini", ID_PALETTE_1 + MENUITEM "Black && White", ID_PALETTE_2 + MENUITEM "Green Palette", ID_PALETTE_3 + MENUITEM "Green Vector", ID_PALETTE_4 + MENUITEM "Red Palette", ID_PALETTE_5 + MENUITEM "Red Vector", ID_PALETTE_6 + MENUITEM "Blue LCD", ID_PALETTE_7 + MENUITEM "LED Backlight", ID_PALETTE_8 + MENUITEM "Girlish", ID_PALETTE_9 + MENUITEM "Blue Palette", ID_PALETTE_10 + MENUITEM "Blue Vector", ID_PALETTE_11 + MENUITEM "Sepia", ID_PALETTE_12 + MENUITEM "Inverted B&&W", ID_PALETTE_13 + MENUITEM "Custom 1", ID_PALETTE_14 + MENUITEM "Custom 2", ID_PALETTE_15 + END + POPUP "&LCD Mode" + BEGIN + MENUITEM "Analog", ID_LCDMODE_ANALOG + MENUITEM "3-Shades", ID_LCDMODE_3SHADES + MENUITEM "2-Shades", ID_LCDMODE_2SHADES + MENUITEM "Colors*", ID_LCDMODE_COLORS + END + POPUP "LCD &Filter" + BEGIN + MENUITEM "None", ID_LCDFILTER_NONE + MENUITEM "Dot-Matrix / High", ID_LCDFILTER_MATRIX + MENUITEM "50% Scanline", ID_LCDFILTER_SCANLINE + END + POPUP "LCD Contrast" + BEGIN + MENUITEM "Default", ID_LCDCONTRAST_DEFAULT + MENUITEM "Lowest", ID_LCDCONTRAST_LOWEST + MENUITEM "Low", ID_LCDCONTRAST_LOW + MENUITEM "Medium", ID_LCDCONTRAST_MEDIUM + MENUITEM "High", ID_LCDCONTRAST_HIGH + MENUITEM "Highest", ID_LCDCONTRAST_HIGHEST + MENUITEM "Custom...", ID_LCDCONTRAST_CUSTOM + END + POPUP "LCD Brightness" + BEGIN + MENUITEM "Default", ID_LCDBRIGHT_DEFAULT + MENUITEM "Lighter", ID_LCDBRIGHT_LIGHTER + MENUITEM "Light", ID_LCDBRIGHT_LIGHT + MENUITEM "Dark", ID_LCDBRIGHT_DARK + MENUITEM "Darker", ID_LCDBRIGHT_DARKER + MENUITEM "Custom...", ID_LCDBRIGHT_CUSTOM + END + POPUP "Rumble Level" + BEGIN + MENUITEM "None", ID_RUMBLELEVEL_0 + MENUITEM "Weak", ID_RUMBLELEVEL_1 + MENUITEM "Medium", ID_RUMBLELEVEL_2 + MENUITEM "Strong", ID_RUMBLELEVEL_3 + END + MENUITEM "Fullscreen\tF10", ID_OPTIONS_FULLSCREEN + MENUITEM SEPARATOR + POPUP "&Sound" + BEGIN + MENUITEM "Disabled", ID_SOUND_DISABLED + MENUITEM "Generated", ID_SOUND_GENERATED + MENUITEM "Direct", ID_SOUND_DIRECT + MENUITEM "Emulated", ID_SOUND_EMULATED + MENUITEM "Direct PWM", ID_SOUND_DIRECTPWM + END + MENUITEM "Pie&zo Filter", ID_OPTIONS_PIEZOFILTER + MENUITEM SEPARATOR + POPUP "&Sync Cycles" + BEGIN + MENUITEM "8 (Accurancy)", ID_SYNCCYCLES_8 + MENUITEM "16", ID_SYNCCYCLES_16 + MENUITEM "32", ID_SYNCCYCLES_32 + MENUITEM "64 (Performance)", ID_SYNCCYCLES_64 + MENUITEM "128 (Not recommended)", ID_SYNCCYCLES_128 + MENUITEM "256 (Not recommended)", ID_SYNCCYCLES_256 + MENUITEM "512 (Not recommended)", ID_SYNCCYCLES_512 + END + MENUITEM SEPARATOR + MENUITEM "&Low Battery", ID_OPTIONS_LOWBATTERY + POPUP "&RTC" + BEGIN + MENUITEM "No RTC", ID_RTC_NORTC + MENUITEM "State time difference", ID_RTC_STATE + MENUITEM "RTC from Host", ID_RTC_HOST + END + MENUITEM "Share &EEPROM", ID_OPTIONS_SHAREEEPROM + POPUP "&Multicart" + BEGIN + MENUITEM "Disabled", ID_MULTICART_DISABLED + MENUITEM "Flash 512KB (AM29LV040B)", ID_MULTICART_FLASH512KB + MENUITEM "Lupin 512KB (AM29LV040B)", ID_MULTICART_LUPIN512KB + END + MENUITEM "Force Free&BIOS", ID_OPTIONS_FORCEFREEBIOS + MENUITEM SEPARATOR + POPUP "File association" + BEGIN + MENUITEM "Register", ID_FILEASSOCIATION_REGISTER + MENUITEM "Unregister", ID_FILEASSOCIATION_UNREGISTER + END + MENUITEM SEPARATOR + MENUITEM "&Custom Palette Edit...", ID_OPTIONS_CUSTOMPALETTEEDIT + MENUITEM "Define &Keyboard...", ID_OPTIONS_DEFINEKEYBOARD + MENUITEM "Define &Joystick...", ID_OPTIONS_DEFINEJOYSTICK + MENUITEM "&Update EEPROM", ID_OPTIONS_UPDATEEEPROM + END + POPUP "&Emulator" + BEGIN + MENUITEM "Start\tF5", ID_EMULATOR_START + MENUITEM "Stop\tF2", ID_EMULATOR_STOP + MENUITEM SEPARATOR + POPUP "&Reset" + BEGIN + MENUITEM "&Soft (Partial)\tShift+R", ID_RESET_SOFT + MENUITEM "&Hard (Full)\tCtrl+R", ID_RESET_HARD + END + POPUP "Video" + BEGIN + MENUITEM "GDI", ID_VIDEO_GDI + MENUITEM "DirectDraw", ID_VIDEO_DIRECTDRAW + MENUITEM "Direct3D", ID_VIDEO_DIRECT3D + END + MENUITEM "Autorun", ID_EMULATOR_AUTORUN + MENUITEM "Pause when inactive", ID_EMULATOR_PAUSEWHENINACTIVE + END + POPUP "&Help" + BEGIN + MENUITEM "Visit website", ID_HELP_VISITWEBSITE + MENUITEM SEPARATOR + MENUITEM "&Command-Line switches...", ID_HELP_COMMANDLINE + MENUITEM "&About", ID_HELP_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +IDR_WINXP RT_MANIFEST "winxp.manifest" + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_ACCELERATOR ACCELERATORS +BEGIN + VK_F5, ID_EMULATOR_START, VIRTKEY, NOINVERT + VK_F2, ID_EMULATOR_STOP, VIRTKEY, NOINVERT + "O", ID_FILE_OPENMIN, VIRTKEY, CONTROL, NOINVERT + "Q", ID_FILE_QUIT, VIRTKEY, CONTROL, NOINVERT + VK_F10, ID_OPTIONS_FULLSCREEN, VIRTKEY, NOINVERT + "R", ID_RESET_HARD, VIRTKEY, CONTROL, NOINVERT + "R", ID_RESET_SOFT, VIRTKEY, SHIFT, NOINVERT + VK_F1, ID_RECENT0, VIRTKEY, CONTROL, NOINVERT + VK_F2, ID_RECENT1, VIRTKEY, CONTROL, NOINVERT + VK_F3, ID_RECENT2, VIRTKEY, CONTROL, NOINVERT + VK_F4, ID_RECENT3, VIRTKEY, CONTROL, NOINVERT + VK_F5, ID_RECENT4, VIRTKEY, CONTROL, NOINVERT + VK_F6, ID_RECENT5, VIRTKEY, CONTROL, NOINVERT + VK_F7, ID_RECENT6, VIRTKEY, CONTROL, NOINVERT + VK_F8, ID_RECENT7, VIRTKEY, CONTROL, NOINVERT + VK_F9, ID_RECENT8, VIRTKEY, CONTROL, NOINVERT + VK_F10, ID_RECENT9, VIRTKEY, CONTROL, NOINVERT + "L", ID_FILE_LOADSTATE, VIRTKEY, CONTROL, NOINVERT + "K", ID_FILE_SAVESTATE, VIRTKEY, CONTROL, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_KEYDEF DIALOGEX 0, 0, 267, 185 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Define Keyboard" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,157,164,50,14 + PUSHBUTTON "Cancel",IDCANCEL,210,164,50,14 + RTEXT "Key Menu:",IDC_KEYL_MENU,7,7,40,10,SS_CENTERIMAGE + RTEXT "Key A:",IDC_KEYL_A,7,22,40,10,SS_CENTERIMAGE + RTEXT "Key B:",IDC_KEYL_B,7,37,40,10,SS_CENTERIMAGE + RTEXT "Key C:",IDC_KEYL_C,7,52,40,10,SS_CENTERIMAGE + RTEXT "Key Up:",IDC_KEYL_UP,7,67,40,10,SS_CENTERIMAGE + RTEXT "Key Down:",IDC_KEYL_DOWN,7,82,40,10,SS_CENTERIMAGE + RTEXT "Key Left:",IDC_KEYL_LEFT,7,97,40,10,SS_CENTERIMAGE + RTEXT "Key Right:",IDC_KEYL_RIGHT,7,112,40,10,SS_CENTERIMAGE + RTEXT "Key Power:",IDC_KEYL_POWER,7,127,40,10,SS_CENTERIMAGE + RTEXT "Key Shake:",IDC_KEYL_SHAKE,7,142,40,10,SS_CENTERIMAGE + COMBOBOX IDC_KEYC1_MENU,56,7,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_MENU,160,7,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_A,56,22,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_A,160,22,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_B,56,37,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_B,160,37,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_C,56,52,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_C,160,52,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_UP,56,67,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_UP,160,67,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_DOWN,56,82,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_DOWN,160,82,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_LEFT,56,97,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_LEFT,160,97,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_RIGHT,56,112,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_RIGHT,160,112,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_POWER,56,127,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_POWER,160,127,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_SHAKE,56,142,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC2_SHAKE,160,142,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + +IDD_JOYDEF DIALOGEX 0, 0, 163, 262 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Define Joystick" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,53,241,50,14 + PUSHBUTTON "Cancel",IDCANCEL,106,241,50,14 + CONTROL "Enable Joystick",IDC_ENABLEJOY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,65,10 + COMBOBOX IDC_JOYDEVSELECT,56,20,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Device:",IDC_JOYDEVLABEL,7,23,40,10,SS_CENTERIMAGE + CONTROL "Axis as D-Pad",IDC_AXISASDPAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,55,60,10 + CONTROL "Hats as D-Pad",IDC_HATSASDPAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,68,61,10 + RTEXT "Key Menu:",IDC_KEYL_MENU,7,84,40,10,SS_CENTERIMAGE + RTEXT "Key A:",IDC_KEYL_A,7,100,40,10,SS_CENTERIMAGE + RTEXT "Key B:",IDC_KEYL_B,7,115,40,10,SS_CENTERIMAGE + RTEXT "Key C:",IDC_KEYL_C,7,130,40,10,SS_CENTERIMAGE + RTEXT "Key Up:",IDC_KEYL_UP,7,145,40,10,SS_CENTERIMAGE + RTEXT "Key Down:",IDC_KEYL_DOWN,7,160,40,10,SS_CENTERIMAGE + RTEXT "Key Left:",IDC_KEYL_LEFT,7,175,40,10,SS_CENTERIMAGE + RTEXT "Key Right:",IDC_KEYL_RIGHT,7,190,40,10,SS_CENTERIMAGE + RTEXT "Key Power:",IDC_KEYL_POWER,7,205,40,10,SS_CENTERIMAGE + RTEXT "Key Shake:",IDC_KEYL_SHAKE,7,220,40,10,SS_CENTERIMAGE + COMBOBOX IDC_KEYC1_MENU,56,85,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_A,56,100,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_B,56,115,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_C,56,130,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_UP,56,145,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_DOWN,56,160,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_LEFT,56,175,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_RIGHT,56,190,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_POWER,56,205,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYC1_SHAKE,56,220,100,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Force-Feedback for Rumble",IDC_FORCEFEEDBACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,42,104,10 +END + +IDD_CUSTOMPALEDIT DIALOGEX 0, 0, 190, 330 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Custom Palette Edit..." +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,78,309,50,14 + PUSHBUTTON "Cancel",IDCANCEL,131,309,50,14 + CTEXT "Custom 1 (Light Pixel):",IDC_STATIC,7,7,174,8 + CONTROL "Custom 1 (Light Pixel)",IDC_CUSTOM1LIGHTP, + "POKEMINI_cpaledit",WS_TABSTOP,7,17,174,24 + CONTROL "",IDC_CUSTOM1LIGHTRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,42,58,16 + CONTROL "",IDC_CUSTOM1LIGHTGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,42,58,16 + CONTROL "",IDC_CUSTOM1LIGHTBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,42,58,16 + CTEXT "Red: 255",IDC_CUSTOM1LIGHTRL,7,60,58,16 + CTEXT "Green: 255",IDC_CUSTOM1LIGHTGL,65,60,58,16 + CTEXT "Blue: 255",IDC_CUSTOM1LIGHTBL,123,60,58,16 + CTEXT "Custom 1 (Dark Pixel):",IDC_STATIC,7,83,174,8 + CONTROL "Custom 1 (Dark Pixel)",IDC_CUSTOM1DARKP, + "POKEMINI_cpaledit",WS_TABSTOP,7,93,174,24 + CONTROL "",IDC_CUSTOM1DARKRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,118,58,16 + CONTROL "",IDC_CUSTOM1DARKGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,118,58,16 + CONTROL "",IDC_CUSTOM1DARKBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,118,58,16 + CTEXT "Red: 255",IDC_CUSTOM1DARKRL,7,136,58,16 + CTEXT "Green: 255",IDC_CUSTOM1DARKGL,65,136,58,16 + CTEXT "Blue: 255",IDC_CUSTOM1DARKBL,123,136,58,16 + CTEXT "Custom 2 (Light Pixel):",IDC_STATIC,7,158,174,8 + CONTROL "Custom 2 (Light Pixel)",IDC_CUSTOM2LIGHTP, + "POKEMINI_cpaledit",WS_TABSTOP,7,167,174,24 + CONTROL "",IDC_CUSTOM2LIGHTRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,193,58,16 + CONTROL "",IDC_CUSTOM2LIGHTGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,193,58,16 + CONTROL "",IDC_CUSTOM2LIGHTBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,193,58,16 + CTEXT "Red: 255",IDC_CUSTOM2LIGHTRL,7,210,58,16 + CTEXT "Green: 255",IDC_CUSTOM2LIGHTGL,65,210,58,16 + CTEXT "Blue: 255",IDC_CUSTOM2LIGHTBL,123,210,58,16 + CTEXT "Custom 2 (Dark Pixel):",IDC_STATIC,7,233,174,8 + CONTROL "Custom 1 (Dark Pixel)",IDC_CUSTOM2DARKP, + "POKEMINI_cpaledit",WS_TABSTOP,7,242,174,24 + CONTROL "",IDC_CUSTOM2DARKRS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,267,58,16 + CONTROL "",IDC_CUSTOM2DARKGS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,65,267,58,16 + CONTROL "",IDC_CUSTOM2DARKBS,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,123,267,58,16 + CTEXT "Red: 255",IDC_CUSTOM2DARKRL,7,286,58,16 + CTEXT "Green: 255",IDC_CUSTOM2DARKGL,65,286,58,16 + CTEXT "Blue: 255",IDC_CUSTOM2DARKBL,123,286,58,16 +END + +IDD_CUSTOMSLIDER DIALOGEX 0, 0, 186, 49 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Set custom value..." +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,75,28,50,14 + PUSHBUTTON "Cancel",IDCANCEL,129,28,50,14 + CONTROL "",IDC_CUSTOMSLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,7,172,15 + CTEXT "Value: 0",IDC_CUSTOMSLIDERT,7,26,58,16 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_KEYDEF, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 260 + TOPMARGIN, 7 + BOTTOMMARGIN, 178 + END + + IDD_JOYDEF, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 156 + TOPMARGIN, 7 + BOTTOMMARGIN, 255 + END + + IDD_CUSTOMPALEDIT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 181 + TOPMARGIN, 7 + BOTTOMMARGIN, 323 + END + + IDD_CUSTOMSLIDER, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 42 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/Resource.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/Resource.h new file mode 100644 index 0000000000..8e4dd86633 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/Resource.h @@ -0,0 +1,234 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by PokeMini_Win32.rc +// +#define IDI_ICON1 100 +#define IDI_ICON2 101 +#define IDI_ICON3 102 +#define IDR_MENU 103 +#define IDR_WINXP 104 +#define IDR_ACCELERATOR 105 +#define IDD_KEYDEF 106 +#define IDD_JOYDEF 107 +#define IDD_CUSTOMPALEDIT 108 +#define IDD_CUSTOMSLIDER 109 +#define IDC_STATUSBAR 120 +#define IDC_KEYL_C 120 +#define IDC_TITLETIMER 121 +#define IDC_KEYL_MENU 1001 +#define IDC_KEYC1_MENU 1002 +#define IDC_KEYL_A 1003 +#define IDC_KEYL_B 1004 +#define IDC_KEYL_UP 1006 +#define IDC_KEYL_DOWN 1007 +#define IDC_KEYL_LEFT 1008 +#define IDC_KEYL_RIGHT 1009 +#define IDC_KEYL_POWER 1010 +#define IDC_KEYL_SHAKE 1011 +#define IDC_KEYC2_MENU 1012 +#define IDC_JOYDEVLABEL 1012 +#define IDC_KEYC1_A 1013 +#define IDC_KEYC2_A 1014 +#define IDC_KEYC1_B 1015 +#define IDC_KEYC2_B 1016 +#define IDC_KEYC1_C 1017 +#define IDC_KEYC2_C 1018 +#define IDC_KEYC1_UP 1019 +#define IDC_KEYC2_UP 1020 +#define IDC_KEYC1_DOWN 1021 +#define IDC_COMBO12 1022 +#define IDC_KEYC2_DOWN 1022 +#define IDC_KEYC1_LEFT 1023 +#define IDC_KEYC2_LEFT 1024 +#define IDC_KEYC1_RIGHT 1025 +#define IDC_KEYC2_RIGHT 1026 +#define IDC_KEYC1_POWER 1027 +#define IDC_KEYC2_POWER 1028 +#define IDC_KEYC1_SHAKE 1029 +#define IDC_COMBO8 1030 +#define IDC_KEYC2_SHAKE 1030 +#define IDC_ENABLEJOY 1031 +#define IDC_JOYDEVSELECT 1032 +#define IDC_AXISASDPAD 1033 +#define IDC_CHECK3 1034 +#define IDC_HATSASDPAD 1034 +#define IDC_CHECK1 1035 +#define IDC_FORCEFEEDBACK 1035 +#define IDC_CUSTOM1LIGHT 1036 +#define IDC_CUSTOM1DARK 1036 +#define IDC_CUSTOM1LIGHTP 1036 +#define IDC_CUSTOM1LIGHTRS 1037 +#define IDC_CUSTOM1LIGHTGS 1038 +#define IDC_SLIDER3 1039 +#define IDC_CUSTOM1LIGHTBS 1039 +#define IDC_CUSTOM1LIGHTRL 1040 +#define IDC_CUSTOM1LIGHTGL 1041 +#define IDC_CUSTOM1LIGHTBL 1042 +#define IDC_CUSTOM1LIGHT2 1043 +#define IDC_CUSTOM1DARKP 1043 +#define IDC_CUSTOM1DARKRS 1044 +#define IDC_CUSTOM1DARKGS 1045 +#define IDC_CUSTOM1DARKBS 1046 +#define IDC_CUSTOM1DARKRL 1047 +#define IDC_CUSTOM1DARKGL 1048 +#define IDC_CUSTOM1LIGHTBL2 1049 +#define IDC_CUSTOM1DARKBL 1049 +#define IDC_CUSTOMSLIDER 1052 +#define IDC_CUSTOMSLIDERL 1053 +#define IDC_CUSTOMSLIDERT 1053 +#define IDC_CUSTOM2LIGHTP 1057 +#define IDC_CUSTOM2LIGHTRS 1058 +#define IDC_CUSTOM2LIGHTGS 1059 +#define IDC_CUSTOM2LIGHTBS 1060 +#define IDC_CUSTOM2LIGHTRL 1061 +#define IDC_CUSTOM2LIGHTGL 1062 +#define IDC_CUSTOM2LIGHTBL 1063 +#define IDC_CUSTOM2DARKP 1071 +#define IDC_CUSTOM2DARKRS 1072 +#define IDC_CUSTOM2DARKGS 1073 +#define IDC_CUSTOM2DARKBS 1074 +#define IDC_CUSTOM2DARKRL 1075 +#define IDC_CUSTOM2DARKGL 1076 +#define IDC_CUSTOM1DARKBL2 1077 +#define IDC_CUSTOM2DARKBL 1077 +#define ID_FILE_OPENMIN 40001 +#define ID_FILE_OPENBIOS 40002 +#define ID_FILE_RELOADMIN 40003 +#define ID_FILE_LOADSTATE 40005 +#define ID_FILE_SAVESTATE 40006 +#define ID_FILE_QUIT 40007 +#define ID_FILE_FREEBIOS 40008 +#define ID_ZOOM_1X 40010 +#define ID_ZOOM_2X 40011 +#define ID_ZOOM_3X 40012 +#define ID_ZOOM_4X 40013 +#define ID_ZOOM_5X 40014 +#define ID_ZOOM_6X 40015 +#define ID_PALETTE_0 40033 +#define ID_PALETTE_1 40034 +#define ID_PALETTE_2 40035 +#define ID_PALETTE_3 40036 +#define ID_PALETTE_4 40037 +#define ID_PALETTE_5 40038 +#define ID_PALETTE_6 40039 +#define ID_PALETTE_7 40040 +#define ID_PALETTE_8 40041 +#define ID_PALETTE_9 40042 +#define ID_PALETTE_10 40043 +#define ID_PALETTE_11 40044 +#define ID_PALETTE_12 40045 +#define ID_PALETTE_13 40046 +#define ID_PALETTE_14 40047 +#define ID_PALETTE_15 40048 +#define ID_LCDMODE_ANALOG 40050 +#define ID_LCDMODE_COLORS 40053 +#define ID_LCDMODE_3SHADES 40054 +#define ID_LCDMODE_2SHADES 40055 +#define ID_LCDFILTER_NONE 40057 +#define ID_LCDFILTER_MATRIX 40059 +#define ID_SOUND_DISABLED 40061 +#define ID_SOUND_DIRECT 40062 +#define ID_SOUND_EMULATED 40063 +#define ID_SOUND_GENERATED 40064 +#define ID_SOUND_DIRECTPWM 40065 +#define ID_OPTIONS_PIEZOFILTER 40066 +#define ID_SYNCCYCLES_8 40068 +#define ID_SYNCCYCLES_16 40069 +#define ID_SYNCCYCLES_32 40070 +#define ID_SYNCCYCLES_64 40071 +#define ID_SYNCCYCLES_128 40072 +#define ID_SYNCCYCLES_256 40073 +#define ID_SYNCCYCLES_512 40074 +#define ID_OPTIONS_LOWBATTERY 40075 +#define ID_RTC_NORTC 40077 +#define ID_RTC_STATE 40080 +#define ID_RTC_HOST 40081 +#define ID_OPTIONS_SHAREEEPROM 40082 +#define ID_MULTICART_DISABLED 40084 +#define ID_MULTICART_FLASH512KB 40085 +#define ID_MULTICART_LUPIN512KB 40086 +#define ID_OPTIONS_FORCEFREEBIOS 40087 +#define ID_OPTIONS_UPDATEEEPROM 40088 +#define ID_OPTIONS_SAVEOPTIONS 40089 +#define ID_RESET_HARD 40091 +#define ID_RESET_SOFT 40092 +#define ID_HELP_ABOUT 40094 +#define ID_HELP_COMMANDLINE 40095 +#define ID_EMULATOR_START 40098 +#define ID_EMULATOR_STOP 40099 +#define ID_BPP_16BPP 40103 +#define ID_BPP_32BPP 40104 +#define ID_EMULATOR_AUTORUN 40105 +#define ID_EMULATOR_VIDEO 40106 +#define ID_VIDEO_GDI 40107 +#define ID_VIDEO_DIRECTDRAW 40108 +#define ID_VIDEO_DIRECT3D 40109 +#define ID_OPTIONS_FULLSCREEN 40118 +#define ID_OPTIONS_DEFINEKEYBOARD 40119 +#define ID_OPTIONS_DEFINEJOYSTICK 40120 +#define ID_OPTIONS_CUSTOMPALETTEEDIT 40121 +#define ID_HELP_VISITWEBSITE 40122 +#define ID_FILE_CAPTURE 40123 +#define ID_CAPTURE_SNAPSHOT1XPREVIEW 40124 +#define ID_CAPTURE_SNAPSHOTFROMLCD 40125 +#define ID_LCDFILTER_50 40126 +#define ID_LCDFILTER_SCANLINE 40127 +#define ID_FILE_RECENT 40128 +#define ID_RECENT_CLEARLIST 40129 +#define ID_RECENT_ 40130 +#define ID_RECENT0 40131 +#define ID_RECENT1 40132 +#define ID_RECENT2 40133 +#define ID_RECENT3 40134 +#define ID_RECENT4 40135 +#define ID_RECENT5 40136 +#define ID_RECENT6 40137 +#define ID_RECENT7 40138 +#define ID_RECENT8 40139 +#define ID_RECENT9 40140 +#define ID_EMULATOR_PAUSEWHENINACTIVE 40145 +#define ID_EMULATOR_FILEASSOCIATION 40146 +#define ID_FILEASSOCIATION_REGISTER 40147 +#define ID_FILEASSOCIATION_UNREGISTER 40148 +#define ID_OPTIONS_RUMBLEAMOUNT 40149 +#define ID_OPTIONS_RUMBLELEVEL 40150 +#define ID_RUMBLELEVEL_NONE 40151 +#define ID_RUMBLELEVEL_WEAK 40152 +#define ID_RUMBLELEVEL_MEDIUM 40153 +#define ID_RUMBLELEVEL_STRONG 40154 +#define ID_RUMBLELEVEL_0 40155 +#define ID_RUMBLELEVEL_1 40156 +#define ID_RUMBLELEVEL_2 40157 +#define ID_RUMBLELEVEL_3 40158 +#define ID_OPTIONS_LCDCONTRAST 40159 +#define ID_LCDCONTRAST_DEFAULT 40160 +#define ID_LCDCONTRAST_LOWEST 40161 +#define ID_LCDCONTRAST_HIGHEST 40162 +#define ID_LCDCONTRAST_CUSTOM 40163 +#define ID_OPTIONS_LCDBRIGHTNESS 40164 +#define ID_LCDBRIGHTNESS_DEFAULT 40165 +#define ID_LCDBRIGHTNESS_LIGHTER 40166 +#define ID_LCDBRIGHTNESS_LIGHT 40167 +#define ID_LCDBRIGHTNESS_DARK 40168 +#define ID_LCDBRIGHTNESS_DARKER 40169 +#define ID_LCDBRIGHTNESS_CUSTOM 40170 +#define ID_LCDCONTRAST_MEDIUM 40171 +#define ID_LCDBRIGHT_DEFAULT 40172 +#define ID_LCDBRIGHT_LIGHTER 40173 +#define ID_LCDBRIGHT_LIGHT 40174 +#define ID_LCDBRIGHT_DARK 40175 +#define ID_LCDBRIGHT_DARKER 40176 +#define ID_LCDBRIGHT_CUSTOM 40177 +#define ID_LCDCONTRAST_LOW 40178 +#define ID_LCDCONTRAST_HIGH 40179 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 110 +#define _APS_NEXT_COMMAND_VALUE 40180 +#define _APS_NEXT_CONTROL_VALUE 1054 +#define _APS_NEXT_SYMED_VALUE 103 +#endif +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/winxp.manifest b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/winxp.manifest new file mode 100644 index 0000000000..9022235b05 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VC2010/winxp.manifest @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend.c new file mode 100644 index 0000000000..88d6080d73 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend.c @@ -0,0 +1,39 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "VideoRend.h" + +TVideoRend *VideoRend = NULL; + +void VideoRend_Set(int index) +{ + switch (index) { + case 0: // GDI + VideoRend = (TVideoRend *)&VideoRend_GDI; + break; + case 1: // DirectDraw + VideoRend = (TVideoRend *)&VideoRend_DDraw; + break; + case 2: // Direct3D + VideoRend = (TVideoRend *)&VideoRend_D3D; + break; + default: // Illegal + VideoRend = (TVideoRend *)&VideoRend_GDI; + break; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend.h new file mode 100644 index 0000000000..a45d08cd68 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend.h @@ -0,0 +1,61 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include + +typedef struct { + // Video was initialized? + int (*WasInit)(); + + // Video initialize, return bpp + int (*Init)(HWND hWnd, int width, int height, int fullscreen); + + // Video terminate + void (*Terminate)(); + + // Window resize + void (*ResizeWin)(int width, int height); + + // Get pitch in bytes and pixels + void (*GetPitch)(int *bytpitch, int *pixpitch); + + // Clear video, do not call inside locked buffer + void (*ClearVideo)(); + + // Lock video buffer, return true on success + int (*Lock)(void **videobuffer); + + // Unlock video buffer + void (*Unlock)(); + + // Flip and render to window + void (*Flip)(HWND hWnd); + + // Window requesting painting + void (*Paint)(HWND hWnd); +} TVideoRend; + +extern TVideoRend *VideoRend; + +extern const TVideoRend VideoRend_GDI; +extern const TVideoRend VideoRend_DDraw; +extern const TVideoRend VideoRend_D3D; + +void VideoRend_Set(int index); diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_D3D.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_D3D.c new file mode 100644 index 0000000000..3ee42dcdf6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_D3D.c @@ -0,0 +1,222 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "VideoRend.h" + +// Local variables +static int RendFrame = 0, RendWasInit = 0; +static int RendImgBpp = 0; +static int RendImgWidth = 0, RendImgHeight = 0; +static int RendWinWidth = 0, RendWinHeight = 0; +static D3DPRESENT_PARAMETERS d3dpp; +static LPDIRECT3D9 pD3D = NULL; +static LPDIRECT3DDEVICE9 pD3DDevice = NULL; +static LPDIRECT3DSURFACE9 pD3DSurface = NULL; + +// Prototypes +int VideoRend_D3D_WasInit(void); +int VideoRend_D3D_Init(HWND hWnd, int width, int height, int fullscreen); +void VideoRend_D3D_Terminate(void); +void VideoRend_D3D_ResizeWin(int width, int height); +void VideoRend_D3D_GetPitch(int *bytpitch, int *pixpitch); +void VideoRend_D3D_ClearVideo(void); +int VideoRend_D3D_Lock(void **videobuffer); +void VideoRend_D3D_Unlock(void); +void VideoRend_D3D_Flip(HWND hWnd); +void VideoRend_D3D_Paint(HWND hWnd); + +// Video was initialized? +int VideoRend_D3D_WasInit(void) +{ + return RendWasInit; +} + +// Video initialize, return bpp +int VideoRend_D3D_Init(HWND hWnd, int width, int height, int fullscreen) +{ + D3DDISPLAYMODE d3ddm; + RECT fsRect; + + // Create Direct3D object + if ((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) { + MessageBox(0, "Direct3DCreate9() Failed", "Direct3D", MB_ICONERROR); + VideoRend_D3D_Terminate(); + return 0; + } + + // Create Direct3D device + ZeroMemory(&d3dpp, sizeof(d3dpp)); + d3dpp.Windowed = TRUE; + d3dpp.hDeviceWindow = hWnd; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.BackBufferWidth = width; + d3dpp.BackBufferHeight = height; + d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; + d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + if FAILED(IDirect3D9_CreateDevice(pD3D, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, + D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &pD3DDevice)) + { + MessageBox(0, "CreateDevice Failed", "Direct3D", MB_ICONERROR); + VideoRend_D3D_Terminate(); + return 0; + } + + // Get BPP format + IDirect3DDevice9_GetDisplayMode(pD3DDevice, 0, &d3ddm); + switch (d3ddm.Format) { + case D3DFMT_A8R8G8B8: + case D3DFMT_X8R8G8B8: + RendImgBpp = 32; + break; + case D3DFMT_A1R5G5B5: + case D3DFMT_X1R5G5B5: + // TODO BGR15 mode + VideoRend_D3D_Terminate(); + return 0; + case D3DFMT_R5G6B5: + RendImgBpp = 16; + break; + } + + // Get backbuffer + if FAILED(IDirect3DDevice9_GetBackBuffer(pD3DDevice, 0, 0, D3DBACKBUFFER_TYPE_MONO, &pD3DSurface)) { + MessageBox(0, "Get Back-Buffer Failed", "Direct3D", MB_ICONERROR); + VideoRend_D3D_Terminate(); + return 0; + } + + // Disable Z-Buffer, Culling and Lighting + IDirect3DDevice9_SetRenderState(pD3DDevice, D3DRS_ZENABLE, FALSE); + IDirect3DDevice9_SetRenderState(pD3DDevice, D3DRS_CULLMODE, D3DCULL_NONE); + IDirect3DDevice9_SetRenderState(pD3DDevice, D3DRS_LIGHTING, FALSE); + + // Fullscreen + if (fullscreen) { + GetWindowRect(GetDesktopWindow(), &fsRect); + MoveWindow(hWnd, 0, 0, fsRect.right, fsRect.bottom, 0); + } + + // Clear video and set specs + RendImgWidth = width; + RendImgHeight = height; + RendWasInit = 1; + VideoRend_D3D_ClearVideo(); + return RendImgBpp; +} + +// Video terminate +void VideoRend_D3D_Terminate(void) +{ + if (pD3DSurface) { + IDirect3DSurface9_Release(pD3DSurface); + pD3DSurface = NULL; + } + if (pD3DDevice) { + IDirect3DDevice9_Release(pD3DDevice); + pD3DDevice = NULL; + } + if (pD3D) { + IDirect3D9_Release(pD3D); + pD3D = NULL; + } + RendWasInit = 0; +} + +// Window resize +void VideoRend_D3D_ResizeWin(int width, int height) +{ + RendWinWidth = width; + RendWinHeight = height; +} + +// Get pitch in bytes and pixels +void VideoRend_D3D_GetPitch(int *bytpitch, int *pixpitch) +{ + D3DLOCKED_RECT pLockedRect; + if (!RendWasInit) return; + IDirect3DSurface9_LockRect(pD3DSurface, &pLockedRect, NULL, 0); + IDirect3DSurface9_UnlockRect(pD3DSurface); + *bytpitch = pLockedRect.Pitch; + if (RendImgBpp == 32) *pixpitch = pLockedRect.Pitch >> 2; + else *pixpitch = pLockedRect.Pitch >> 1; +} + +// Clear video, do not call inside locked buffer +void VideoRend_D3D_ClearVideo(void) +{ + if (!RendWasInit) return; + IDirect3DDevice9_Clear(pD3DDevice, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); +} + +// Lock video buffer, return true on success +int VideoRend_D3D_Lock(void **videobuffer) +{ + D3DLOCKED_RECT pLockedRect; + if (!RendWasInit) return 0; + if FAILED(IDirect3DSurface9_LockRect(pD3DSurface, &pLockedRect, NULL, 0)) return 0; + *videobuffer = (void *)pLockedRect.pBits; + return 1; +} + +// Unlock video buffer +void VideoRend_D3D_Unlock(void) +{ + if (!RendWasInit) return; + IDirect3DSurface9_UnlockRect(pD3DSurface); +} + +// Flip and render to window +void VideoRend_D3D_Flip(HWND hWnd) +{ + POINT pointD = {0, 0}; + RECT rDst = {0, 0, RendWinWidth, RendWinHeight}; + HRESULT hr; + if (!RendWasInit) return; + hr = IDirect3DDevice9_TestCooperativeLevel(pD3DDevice); + if (hr == D3DERR_DEVICENOTRESET) { + hr = IDirect3DDevice9_Reset(pD3DDevice, &d3dpp); + } + if (hr == D3D_OK) { + IDirect3DDevice9_Present(pD3DDevice, NULL, &rDst, NULL, NULL); + } +} + +// Window requesting painting +void VideoRend_D3D_Paint(HWND hWnd) +{ + VideoRend_D3D_Flip(hWnd); + ValidateRect(hWnd, NULL); +} + +// Video render driver +const TVideoRend VideoRend_D3D = { + VideoRend_D3D_WasInit, + VideoRend_D3D_Init, + VideoRend_D3D_Terminate, + VideoRend_D3D_ResizeWin, + VideoRend_D3D_GetPitch, + VideoRend_D3D_ClearVideo, + VideoRend_D3D_Lock, + VideoRend_D3D_Unlock, + VideoRend_D3D_Flip, + VideoRend_D3D_Paint +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_DDraw.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_DDraw.c new file mode 100644 index 0000000000..9078420b52 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_DDraw.c @@ -0,0 +1,268 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include "VideoRend.h" + +#ifdef NO_DIRECTDRAW + +int VideoRend_DDraw_WasInit(void) { return 0; } +int VideoRend_DDraw_Init(HWND hWnd, int width, int height, int fullscreen) { return 0; } +void VideoRend_DDraw_Terminate(void) {} +void VideoRend_DDraw_ResizeWin(int width, int height) {} +void VideoRend_DDraw_GetPitch(int *bytpitch, int *pixpitch) {} +void VideoRend_DDraw_ClearVideo(void) {} +int VideoRend_DDraw_Lock(void **videobuffer) { return 0; } +void VideoRend_DDraw_Unlock(void) {} +void VideoRend_DDraw_Flip(HWND hWnd) {} +void VideoRend_DDraw_Paint(HWND hWnd) {} + +#else + +#include + +// Local variables +static int RendFrame = 0, RendWasInit = 0; +static int RendImgBpp = 0; +static int RendImgWidth = 0, RendImgHeight = 0; +static int RendWinWidth = 0, RendWinHeight = 0; +LPDIRECTDRAW7 DD = NULL; +LPDIRECTDRAWSURFACE7 DDP = NULL; +LPDIRECTDRAWSURFACE7 DDB = NULL; +LPDIRECTDRAWCLIPPER DDC = NULL; // DirectDraw classes +DDSURFACEDESC2 ddsd; // Fast access to surface description + +// Prototypes +int VideoRend_DDraw_WasInit(void); +int VideoRend_DDraw_Init(HWND hWnd, int width, int height, int fullscreen); +void VideoRend_DDraw_Terminate(void); +void VideoRend_DDraw_ResizeWin(int width, int height); +void VideoRend_DDraw_GetPitch(int *bytpitch, int *pixpitch); +void VideoRend_DDraw_ClearVideo(void); +int VideoRend_DDraw_Lock(void **videobuffer); +void VideoRend_DDraw_Unlock(void); +void VideoRend_DDraw_Flip(HWND hWnd); +void VideoRend_DDraw_Paint(HWND hWnd); + +// Video was initialized? +int VideoRend_DDraw_WasInit(void) +{ + return RendWasInit; +} + +// Video initialize, return bpp +int VideoRend_DDraw_Init(HWND hWnd, int width, int height, int fullscreen) +{ + DDPIXELFORMAT ddpf; + char errormsg[256]; + RECT fsRect; + + // Create DirectDraw + if FAILED(DirectDrawCreateEx(NULL, (VOID**)&DD, &IID_IDirectDraw7, NULL)) { + MessageBox(0, "DirectDrawCreateEx() Failed", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + + // Get exclusive, fullscreen mode + if FAILED(IDirectDraw7_SetCooperativeLevel(DD, hWnd, DDSCL_NORMAL)) { + MessageBox(0, "Failed DirectDraw->SetCooperativeLevel", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + + // Create the primary surface + ZeroMemory(&ddsd, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + if FAILED(IDirectDraw7_CreateSurface(DD, &ddsd, &DDP, NULL)) { + MessageBox(0, "CreateSurface Failed", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + + // Create clipping (avoid graphics going outside window) + if FAILED(IDirectDraw7_CreateClipper(DD, 0, &DDC, NULL)) { + MessageBox(0, "CreateClipper Failed", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + if FAILED(IDirectDrawClipper_SetHWnd(DDC, 0, hWnd)) { + MessageBox(0, "Clipper SetHWnd Failed", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + if FAILED(IDirectDrawSurface7_SetClipper(DDP, DDC)) { + MessageBox(0, "SetClipper Failed", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + + // Create the back surface + ZeroMemory(&ddsd, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY; + ddsd.dwWidth = width; + ddsd.dwHeight = height; + if FAILED(IDirectDraw7_CreateSurface(DD, &ddsd, &DDB, NULL)) { + MessageBox(0, "CreateSurface2 Failed", "DirectDraw", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } + + // Fullscreen + if (fullscreen) { + GetWindowRect(GetDesktopWindow(), &fsRect); + MoveWindow(hWnd, 0, 0, fsRect.right, fsRect.bottom, 0); + } + + // Detect BPP of the back buffer + ZeroMemory(&ddpf, sizeof(ddpf)); + ddpf.dwSize = sizeof(ddpf); + IDirectDrawSurface7_GetPixelFormat(DDB, &ddpf); + if (ddpf.dwRGBBitCount == 16) { + // 16-Bits + RendImgWidth = width; + RendImgHeight = height; + RendWasInit = 1; + RendImgBpp = 16; + VideoRend_DDraw_ClearVideo(); + return 16; + } else if (ddpf.dwRGBBitCount == 32) { + // 32-Bits + RendImgWidth = width; + RendImgHeight = height; + RendWasInit = 1; + RendImgBpp = 32; + VideoRend_DDraw_ClearVideo(); + return 32; + } else { + // Unsupported + sprintf_s(errormsg, 256, "Unsupported bits-per-pixels: %d Bits\nMust be 16 or 32.", ddpf.dwRGBBitCount); + MessageBox(0, errormsg, "DirectX", MB_ICONERROR); + VideoRend_DDraw_Terminate(); + return 0; + } +} + +// Video terminate +void VideoRend_DDraw_Terminate(void) +{ + if (DDB) { + IDirectDrawSurface7_Release(DDB); + DDB = NULL; + } + if (DDC) { + IDirectDrawClipper_Release(DDC); + DDC = NULL; + } + if (DDP) { + IDirectDrawSurface7_Release(DDP); + DDP = NULL; + } + if (DD) { + IDirectDraw7_Release(DD); + DD = NULL; + } + RendWasInit = 0; +} + +// Window resize +void VideoRend_DDraw_ResizeWin(int width, int height) +{ + RendWinWidth = width; + RendWinHeight = height; +} + +// Get pitch in bytes and pixels +void VideoRend_DDraw_GetPitch(int *bytpitch, int *pixpitch) +{ + if (!RendWasInit) return; + *bytpitch = ddsd.lPitch; + *pixpitch = ddsd.lPitch * 8 / RendImgBpp; +} + +// Clear video, do not call inside locked buffer +void VideoRend_DDraw_ClearVideo(void) +{ + if (!RendWasInit) return; + if FAILED(IDirectDrawSurface7_Lock(DDB, NULL, &ddsd, DDLOCK_WAIT, NULL)) { + IDirectDrawSurface7_Restore(DDB); + return; + } + ZeroMemory(ddsd.lpSurface, ddsd.lPitch * ddsd.dwHeight); + IDirectDrawSurface7_Unlock(DDB, NULL); +} + +// Lock video buffer, return true on success +int VideoRend_DDraw_Lock(void **videobuffer) +{ + if (!RendWasInit) return 0; + if FAILED(IDirectDrawSurface7_Lock(DDB, NULL, &ddsd, DDLOCK_WAIT, NULL)) { + IDirectDrawSurface7_Restore(DDB); + return 0; + } + *videobuffer = ddsd.lpSurface; + return 1; +} + +// Unlock video buffer +void VideoRend_DDraw_Unlock(void) +{ + if (!RendWasInit) return; + IDirectDrawSurface7_Unlock(DDB, NULL); +} + +// Flip and render to window +void VideoRend_DDraw_Flip(HWND hWnd) +{ + POINT pointD = {0, 0}; + RECT rSrc = {0, 0, RendImgWidth, RendImgHeight}; + RECT rDst = {0, 0, RendWinWidth, RendWinHeight}; + if (!RendWasInit) return; + ClientToScreen(hWnd, &pointD); + OffsetRect(&rDst, pointD.x, pointD.y); + IDirectDrawSurface7_Blt(DDP, &rDst, DDB, &rSrc, DDBLT_WAIT, NULL); +} + +// Window requesting painting +void VideoRend_DDraw_Paint(HWND hWnd) +{ + if (!RendWasInit) return; + VideoRend_DDraw_Flip(hWnd); + ValidateRect(hWnd, NULL); +} + +#endif + +// Video render driver +const TVideoRend VideoRend_DDraw = { + VideoRend_DDraw_WasInit, + VideoRend_DDraw_Init, + VideoRend_DDraw_Terminate, + VideoRend_DDraw_ResizeWin, + VideoRend_DDraw_GetPitch, + VideoRend_DDraw_ClearVideo, + VideoRend_DDraw_Lock, + VideoRend_DDraw_Unlock, + VideoRend_DDraw_Flip, + VideoRend_DDraw_Paint +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_GDI.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_GDI.c new file mode 100644 index 0000000000..fd1ffd3ad9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/VideoRend_GDI.c @@ -0,0 +1,186 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include "VideoRend.h" + +// Local variables +static int RendFrame = 0, RendWasInit = 0; +static int RendImgWidth = 0, RendImgHeight = 0; +static int RendWinWidth = 0, RendWinHeight = 0; +static HBITMAP RendBitmap[2] = {NULL, NULL}; +static HDC RendHDC[2] = {NULL, NULL}; +static void *RendVideoBuff[2] = {NULL, NULL}; + +// Prototypes +int VideoRend_GDI_WasInit(void); +int VideoRend_GDI_Init(HWND hWnd, int width, int height, int fullscreen); +void VideoRend_GDI_Terminate(void); +void VideoRend_GDI_ResizeWin(int width, int height); +void VideoRend_GDI_GetPitch(int *bytpitch, int *pixpitch); +void VideoRend_GDI_ClearVideo(void); +int VideoRend_GDI_Lock(void **videobuffer); +void VideoRend_GDI_Unlock(void); +void VideoRend_GDI_Flip(HWND hWnd); +void VideoRend_GDI_Paint(HWND hWnd); + +// Video was initialized? +int VideoRend_GDI_WasInit(void) +{ + return RendWasInit; +} + +// Video initialize +int VideoRend_GDI_Init(HWND hWnd, int width, int height, int fullscreen) +{ + BITMAPINFO BitmapInfo; + RECT fsRect; + + // Bitmap Structure + BitmapInfo.bmiHeader.biSize = sizeof(BitmapInfo.bmiHeader); + BitmapInfo.bmiHeader.biWidth = width; + BitmapInfo.bmiHeader.biHeight = -height; + BitmapInfo.bmiHeader.biPlanes = 1; + BitmapInfo.bmiHeader.biBitCount = 32; + BitmapInfo.bmiHeader.biCompression = BI_RGB; + BitmapInfo.bmiHeader.biSizeImage = 0; + BitmapInfo.bmiHeader.biXPelsPerMeter = 96; + BitmapInfo.bmiHeader.biYPelsPerMeter = 96; + BitmapInfo.bmiHeader.biClrUsed = 0; + BitmapInfo.bmiHeader.biClrImportant = 0; + RendHDC[0] = CreateCompatibleDC(NULL); + RendHDC[1] = CreateCompatibleDC(NULL); + if (!RendHDC[0] || !RendHDC[1]) { + MessageBox(0, "Can't create compatible DC", "GDI Video", MB_OK | MB_ICONERROR); + VideoRend_GDI_Terminate(); + return 0; + } + + // Create DIB Bitmap + RendImgWidth = width; + RendImgHeight = height; + RendBitmap[0] = CreateDIBSection(RendHDC[0], &BitmapInfo, DIB_RGB_COLORS, (void **)&RendVideoBuff[0], NULL, 0); + RendBitmap[1] = CreateDIBSection(RendHDC[1], &BitmapInfo, DIB_RGB_COLORS, (void **)&RendVideoBuff[1], NULL, 0); + if (!RendBitmap[0] || !RendBitmap[1]) { + MessageBox(0, "Can't create bitmap", "GDI Video", MB_OK | MB_ICONERROR); + VideoRend_GDI_Terminate(); + return 0; + } + + // Assign DIB Bitmap into the device + GdiFlush(); + SelectObject(RendHDC[0], RendBitmap[0]); + SelectObject(RendHDC[1], RendBitmap[1]); + + // Fullscreen + if (fullscreen) { + GetWindowRect(GetDesktopWindow(), &fsRect); + MoveWindow(hWnd, 0, 0, fsRect.right, fsRect.bottom, 0); + } + + // Clear the image + RendFrame = 0; + RendWasInit = 1; + VideoRend_GDI_ClearVideo(); + VideoRend_GDI_Flip(hWnd); + VideoRend_GDI_ClearVideo(); + + return 32; +} + +// Video terminate +void VideoRend_GDI_Terminate(void) +{ + if (RendBitmap[0]) DeleteObject(RendBitmap[0]); + if (RendBitmap[1]) DeleteObject(RendBitmap[1]); + if (RendHDC[0]) DeleteDC(RendHDC[0]); + if (RendHDC[1]) DeleteDC(RendHDC[1]); + RendWasInit = 0; +} + +// Window resize +void VideoRend_GDI_ResizeWin(int width, int height) +{ + RendWinWidth = width; + RendWinHeight = height; +} + +// Get pitch in bytes and pixels +void VideoRend_GDI_GetPitch(int *bytpitch, int *pixpitch) +{ + *bytpitch = RendImgWidth * 4; + *pixpitch = RendImgWidth; +} + +// Clear video, do not call inside locked buffer +void VideoRend_GDI_ClearVideo(void) +{ + if (!RendWasInit) return; + ZeroMemory(RendVideoBuff[RendFrame], RendImgWidth * RendImgHeight * 4); +} + +// Lock video buffer, return true on success +int VideoRend_GDI_Lock(void **videobuffer) +{ + if (!RendWasInit) return 0; + *videobuffer = RendVideoBuff[RendFrame]; + return 1; +} + +// Unlock video buffer +void VideoRend_GDI_Unlock(void) +{ +} + +// Flip and render to window +void VideoRend_GDI_Flip(HWND hWnd) +{ + HDC hdc; + if (!RendWasInit) return; + + RendFrame ^= 1; + hdc = GetDC(hWnd); + StretchBlt(hdc, 0, 0, RendWinWidth, RendWinHeight, RendHDC[RendFrame^1], 0, 0, RendImgWidth, RendImgHeight, SRCCOPY); + ReleaseDC(hWnd, hdc); +} + +// Window requesting painting +void VideoRend_GDI_Paint(HWND hWnd) +{ + PAINTSTRUCT ps; + HDC hdc; + if (!RendWasInit) return; + + hdc = BeginPaint(hWnd, &ps); + StretchBlt(hdc, 0, 0, RendWinWidth, RendWinHeight, RendHDC[RendFrame^1], 0, 0, RendImgWidth, RendImgHeight, SRCCOPY); + EndPaint(hWnd, &ps); +} + +// Video render driver +const TVideoRend VideoRend_GDI = { + VideoRend_GDI_WasInit, + VideoRend_GDI_Init, + VideoRend_GDI_Terminate, + VideoRend_GDI_ResizeWin, + VideoRend_GDI_GetPitch, + VideoRend_GDI_ClearVideo, + VideoRend_GDI_Lock, + VideoRend_GDI_Unlock, + VideoRend_GDI_Flip, + VideoRend_GDI_Paint +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/Win32Stuffz.c b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Win32Stuffz.c new file mode 100644 index 0000000000..ef62ef43fc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Win32Stuffz.c @@ -0,0 +1,80 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +// Open file dialog +int OpenFileDialogEx(HWND parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx) +{ + OPENFILENAME ofn; + char szFile[256]; + + strcpy_s(szFile, 256, filein); + ZeroMemory(&ofn, sizeof(OPENFILENAME)); + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = parentwindow; + ofn.lpstrFile = szFile; + ofn.nMaxFile = sizeof(szFile); + ofn.lpstrFilter = exts; + ofn.nFilterIndex = extidx + 1; + ofn.lpstrFileTitle = (char *)title; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + + if (GetOpenFileName(&ofn)) { + strcpy_s(fileout, 256, ofn.lpstrFile); + return 1; + } + return 0; +} + +// Save file dialog +int SaveFileDialogEx(HWND parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx) +{ + OPENFILENAME ofn; + char szFile[256]; + + strcpy_s(szFile, 256, filein); + ZeroMemory(&ofn, sizeof(OPENFILENAME)); + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = parentwindow; + ofn.lpstrFile = szFile; + ofn.nMaxFile = sizeof(szFile); + ofn.lpstrFilter = exts; + ofn.nFilterIndex = extidx + 1; + ofn.lpstrFileTitle = (char *)title; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.Flags = OFN_PATHMUSTEXIST; + + if (GetSaveFileName(&ofn)) { + strcpy_s(fileout, 256, ofn.lpstrFile); + return 1; + } + return 0; +} + +// For Visual C++ compability +#ifdef _MSC_VER +int strcasecmp(const char *s1, const char *s2) +{ + return _stricmp(s1, s2); +} +#endif + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/Win32Stuffz.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Win32Stuffz.h new file mode 100644 index 0000000000..919cb3a32a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/Win32Stuffz.h @@ -0,0 +1,31 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +// Open file dialog +int OpenFileDialogEx(HWND parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx); + +// Save file dialog +int SaveFileDialogEx(HWND parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx); + +// For Visual C++ compability +#ifdef _MSC_VER +int strcasecmp(const char *s1, const char *s2); +#endif + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/win32/stdint.h b/PVPokeMini/PokeMini/pokemini-code/platform/win32/stdint.h new file mode 100644 index 0000000000..e236bb0001 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/win32/stdint.h @@ -0,0 +1,247 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +# include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef char int8_t; + typedef short int16_t; + typedef int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini.png b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini.png new file mode 100644 index 0000000000..1e12b2ef66 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini32.png b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini32.png new file mode 100644 index 0000000000..e159c67914 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini32.png differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMiniSDL.gpe b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMiniSDL.gpe new file mode 100644 index 0000000000..e4acdacd82 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMiniSDL.gpe @@ -0,0 +1,11 @@ +#!/bin/sh + +sync +echo 3 > /proc/sys/vm/drop_caches + +./PokeMiniSDL 1>./stdoutSDL.txt 2>./stderrSDL.txt +/mnt/nand/logview ./stderrSDL.txt ./stdoutSDL.txt + +sync +cd /usr/gp2x +exec ./gp2xmenu diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMiniSDL.ini b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMiniSDL.ini new file mode 100644 index 0000000000..1b10ebb608 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMiniSDL.ini @@ -0,0 +1,4 @@ +[info] +name="PokeMini (SDL Lib)" +path="/PokeMini/PokeMiniSDL.gpe" +icon="/PokeMini/PokeMini.png" diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini_WIZ.c b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini_WIZ.c new file mode 100644 index 0000000000..f0554fbef6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/PokeMini_WIZ.c @@ -0,0 +1,331 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "SDL.h" + +#include "PokeMini.h" +#include "Hardware.h" +#include "Joystick.h" + +#include "Video_x3.h" +#include "PokeMini_BG3.h" + +const char *AppName = "PokeMini " PokeMini_Version " WIZ (SDL Lib)"; + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSOUNDBUFF (SOUNDBUFFER*2) + +// -------- + +// Joystick names and mapping (NEW IN 0.5.0) +char *WIZ_KeysNames[] = { + "Off", // -1 + "Up", // 0 + "Unused 1", // 1 + "Left", // 2 + "Unused 2", // 3 + "Down", // 4 + "Unused 3", // 5 + "Right", // 6 + "Unused 4", // 7 + "Menu", // 8 + "Select", // 9 + "L", // 10 + "R", // 11 + "A", // 12 + "B", // 13 + "X", // 14 + "Y" // 15 +}; +int WIZ_KeysMapping[] = { + 8, // Menu + 13, // A + 14, // B + 11, // C + 0, // Up + 4, // Down + 2, // Left + 6, // Right + 9, // Power + 10 // Shake +}; + +// Platform menu (REQUIRED >= 0.4.4) +int UIItems_PlatformC(int index, int reason); +TUIMenu_Item UIItems_Platform[] = { + PLATFORMDEF_GOBACK, + { 0, 9, "Define Joystick...", UIItems_PlatformC }, + PLATFORMDEF_SAVEOPTIONS, + PLATFORMDEF_END(UIItems_PlatformC) +}; +int UIItems_PlatformC(int index, int reason) +{ + if (reason == UIMENU_OK) reason = UIMENU_RIGHT; + if (reason == UIMENU_CANCEL) UIMenu_PrevMenu(); + if (reason == UIMENU_RIGHT) { + if (index == 9) JoystickEnterMenu(); + } + return 1; +} + +// For the emulator loop and video +int emurunning = 1; +SDL_Surface *screen; +int PixPitch, ScOffP; + +// WIZ Joystick Keys +#define WIZ_BUTTON_UP (0) +#define WIZ_BUTTON_UPLEFT (1) +#define WIZ_BUTTON_LEFT (2) +#define WIZ_BUTTON_DOWNLEFT (3) +#define WIZ_BUTTON_DOWN (4) +#define WIZ_BUTTON_DOWNRIGHT (5) +#define WIZ_BUTTON_RIGHT (6) +#define WIZ_BUTTON_UPRIGHT (7) +#define WIZ_BUTTON_MENU (8) +#define WIZ_BUTTON_SELECT (9) +#define WIZ_BUTTON_L (10) +#define WIZ_BUTTON_R (11) +#define WIZ_BUTTON_A (12) +#define WIZ_BUTTON_B (13) +#define WIZ_BUTTON_X (14) +#define WIZ_BUTTON_Y (15) +#define WIZ_BUTTON_VOLUP (16) +#define WIZ_BUTTON_VOLDOWN (17) +#define WIZ_BUTTON_CLICK (18) + +// Handle keyboard and quit events +void handleevents(SDL_Event *event) +{ + switch (event->type) { + case SDL_JOYBUTTONDOWN: + if (event->jbutton.button < 16) JoystickButtonsEvent(event->jbutton.button, 1); + break; + case SDL_JOYBUTTONUP: + if (event->jbutton.button < 16) JoystickButtonsEvent(event->jbutton.button, 0); + break; + case SDL_QUIT: + emurunning = 0; + break; + }; +} + +// Used to fill the sound buffer +void emulatorsound(void *unused, Uint8 *stream, int len) +{ + MinxAudio_GetSamplesU8(stream, len); +} + +// Enable / Disable sound +void enablesound(int sound) +{ + MinxAudio_ChangeEngine(sound); + if (AudioEnabled) SDL_PauseAudio(!sound); +} + +// Menu loop +void menuloop() +{ + SDL_Event event; + + // Stop sound + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + enablesound(0); + + // Update EEPROM + PokeMini_SaveFromCommandLines(0); + + // Menu's loop + while (emurunning && (UI_Status == UI_STATUS_MENU)) { + // Slowdown to approx. 60fps + SDL_Delay(16); + + // Process UI + UIMenu_Process(); + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + UIMenu_Display_16((uint16_t *)screen->pixels + ScOffP, PixPitch); + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + } + + // Apply configs + PokeMini_ApplyChanges(); + if (UI_Status == UI_STATUS_EXIT) emurunning = 0; + else enablesound(CommandLine.sound); + SDL_EnableKeyRepeat(0, 0); +} + +// Main function +int main(int argc, char **argv) +{ + SDL_Joystick *joy; + SDL_Event event; + + // Process arguments + printf("%s\n\n", AppName); + PokeMini_InitDirs(argv[0], NULL); + CommandLineInit(); + CommandLineConfFile("pokemini.cfg", NULL, NULL); + if (!CommandLineArgs(argc, argv, NULL)) { + PrintHelpUsage(stdout); + return 1; + } + JoystickSetup("WIZ", 0, 0, WIZ_KeysNames, 16, WIZ_KeysMapping); + + // Initialize SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { + fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); + exit(1); + } + joy = SDL_JoystickOpen(0); + atexit(SDL_Quit); // Clean up on exit + + // Set video spec and check if is supported + if (!PokeMini_SetVideo((TPokeMini_VideoSpec *)&PokeMini_Video3x3, 16, CommandLine.lcdfilter, CommandLine.lcdmode)) { + fprintf(stderr, "Couldn't set video spec\n"); + exit(1); + } + UIMenu_SetDisplay(288, 192, PokeMini_BGR16, (uint8_t *)PokeMini_BG3, (uint16_t *)PokeMini_BG3_PalBGR16, (uint32_t *)PokeMini_BG3_PalBGR32); + + // Initialize the display + screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE); // SDL_HWSURFACE | SDL_DOUBLEBUF + if (screen == NULL) { + fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError()); + exit(1); + } + PixPitch = screen->pitch / 2; + ScOffP = (24 * PixPitch) + 16; + + // Initialize the sound + SDL_AudioSpec audfmt; + audfmt.freq = 44100; + audfmt.format = AUDIO_U8; + audfmt.channels = 1; + audfmt.samples = SOUNDBUFFER; + audfmt.callback = emulatorsound; + audfmt.userdata = NULL; + + // Open the audio device + if (SDL_OpenAudio(&audfmt, NULL) < 0) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + fprintf(stderr, "Audio will be disabled\n"); + AudioEnabled = 0; + } else { + AudioEnabled = 1; + } + + // Disable key repeat and hide cursor + SDL_EnableKeyRepeat(0, 0); + SDL_ShowCursor(SDL_DISABLE); + + // Initialize the emulator + printf("Starting emulator...\n"); + if (!PokeMini_Create(0, PMSOUNDBUFF)) { + fprintf(stderr, "Error while initializing emulator.\n"); + } + + // Setup palette and LCD mode + PokeMini_VideoPalette_Init(PokeMini_BGR16, 1); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + PokeMini_ApplyChanges(); + + // Load stuff + PokeMini_UseDefaultCallbacks(); + if (!PokeMini_LoadFromCommandLines("Using FreeBIOS", "EEPROM data will be discarded!")) { + UI_Status = UI_STATUS_MENU; + } + + // Enable sound & init UI + printf("Starting emulator...\n"); + UIMenu_Init(); + enablesound(CommandLine.sound); + + // Emulator's loop + unsigned long time, NewTickSync = 0; + while (emurunning) { + // Emulate and syncronize + if (RequireSoundSync) { + PokeMini_EmulateFrame(); + // Sleep a little in the hope to free a few samples + while (MinxAudio_SyncWithAudio()) SDL_Delay(1); + } else { + time = SDL_GetTicks(); + PokeMini_EmulateFrame(); + do { + SDL_Delay(1); // This lower CPU usage + time = SDL_GetTicks(); + } while (time < NewTickSync); + NewTickSync = time + 13; // Aprox 72 times per sec + } + + // Screen rendering + SDL_FillRect(screen, NULL, 0); + if (SDL_LockSurface(screen) == 0) { + // Render the menu or the game screen + if (PokeMini_Rumbling) { + PokeMini_VideoBlit((uint16_t *)screen->pixels + ScOffP + PokeMini_GenRumbleOffset(PixPitch), PixPitch); + } else { + PokeMini_VideoBlit((uint16_t *)screen->pixels + ScOffP, PixPitch); + } + LCDDirty = 0; + + // Unlock surface + SDL_UnlockSurface(screen); + SDL_Flip(screen); + } + + // Handle events + while (SDL_PollEvent(&event)) handleevents(&event); + + // Menu + if (UI_Status == UI_STATUS_MENU) menuloop(); + } + + // Disable sound & free UI + enablesound(0); + UIMenu_Destroy(); + + // Save Stuff + PokeMini_SaveFromCommandLines(1); + + // Close joystick + if (joy) SDL_JoystickClose(joy); + + // Terminate... + printf("Shutdown emulator...\n"); + PokeMini_VideoPalette_Free(); + PokeMini_Destroy(); + + return 0; +} + diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/libgcc_s.so.1 b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/libgcc_s.so.1 new file mode 100644 index 0000000000..fc4ee13e02 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/libgcc_s.so.1 differ diff --git a/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/makefile b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/makefile new file mode 100644 index 0000000000..e0d39a3cbe --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/platform/wizsdl/makefile @@ -0,0 +1,106 @@ +# PokeMini Makefile for WIZ + +OPENWIZ = /opt/arm-openwiz-linux-gnu +HOST = arm-openwiz-linux-gnu- + +ifeq ($(OPENWIZ),) +CC = $(HOST)gcc +LD = $(HOST)gcc +STRIP = $(HOST)strip +else +CC = $(OPENWIZ)/bin/$(HOST)gcc +LD = $(OPENWIZ)/bin/$(HOST)gcc +STRIP = $(OPENWIZ)/bin/$(HOST)strip +endif + +BUILD = Build +TARGET = PokeMiniSDL +POKEROOT = ../../ + +CFLAGS = -O2 -Wall -I$(OPENWIZ)/include `$(SDL_BASE)sdl-config --cflags` $(INCLUDE) -DPERFORMANCE +SLFLAGS = -O2 -L$(OPENWIZ)/lib -Wl,-rpath,$(OPENWIZ)/lib -lm -lz -lSDL + +INCDIRS = source resource freebios dependencies/minizip + +OBJS = \ + PokeMini_WIZ.o \ + freebios/freebios.o \ + source/PMCommon.o \ + source/PokeMini.o \ + source/Multicart.o \ + source/Hardware.o \ + source/Video.o \ + source/Video_x3.o \ + source/CommandLine.o \ + source/MinxCPU.o \ + source/MinxCPU_XX.o \ + source/MinxCPU_CE.o \ + source/MinxCPU_CF.o \ + source/MinxCPU_SP.o \ + source/MinxTimers.o \ + source/MinxIO.o \ + source/MinxIRQ.o \ + source/MinxPRC.o \ + source/MinxColorPRC.o \ + source/MinxLCD.o \ + source/MinxAudio.o \ + source/UI.o \ + source/Joystick.o \ + dependencies/minizip/unzip.o \ + dependencies/minizip/ioapi.o \ + resource/PokeMini_ColorPal.o \ + resource/PokeMini_Font12.o \ + resource/PokeMini_Icons12.o \ + resource/PokeMini_BG3.o + +DEPENDS = \ + freebios/freebios.h \ + source/IOMap.h \ + source/PMCommon.h \ + source/PokeMini.h \ + source/PokeMini_Version.h \ + source/Multicart.h \ + source/Hardware.h \ + source/Video.h \ + source/Video_x3.h \ + source/CommandLine.h \ + source/MinxCPU.h \ + source/MinxTimers.h \ + source/MinxIO.h \ + source/MinxIRQ.h \ + source/MinxPRC.h \ + source/MinxColorPRC.h \ + source/MinxLCD.h \ + source/MinxAudio.h \ + source/UI.h \ + source/Joystick.h \ + dependencies/minizip/unzip.h \ + dependencies/minizip/ioapi.h \ + resource/PokeMini_ColorPal.h \ + resource/PokeMini_Font12.h \ + resource/PokeMini_Icons12.h \ + resource/PokeMini_BG3.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + +clean: + -rm -f $(BUILDOBJS) $(TARGET) + -rmdir --ignore-fail-on-non-empty $(BUILD) + diff --git a/PVPokeMini/PokeMini/pokemini-code/pm_libs/font8x8.bin b/PVPokeMini/PokeMini/pokemini-code/pm_libs/font8x8.bin new file mode 100644 index 0000000000..d8529ebd53 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/pm_libs/font8x8.bin differ diff --git a/PVPokeMini/PokeMini/pokemini-code/pm_libs/pm_init.s b/PVPokeMini/PokeMini/pokemini-code/pm_libs/pm_init.s new file mode 100644 index 0000000000..193597a80f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/pm_libs/pm_init.s @@ -0,0 +1,2015 @@ +; Copyright (C) 2015 by JustBurn +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in +; all copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +; THE SOFTWARE. + + ; Pokemon-Mini definitions + ; Version 5 +.equ PMINIT_VER 5 + + ; Flags +.equ FLAG_Z $01 +.equ FLAG_C $02 +.equ FLAG_O $04 +.equ FLAG_S $08 +.equ FLAG_BCD $10 +.equ FLAG_NIBBLE $20 +.equ FLAG_ID $40 +.equ FLAG_IB $80 + + ; Registers base +.equ SSTACK_BASE $1FFC +.equ STACK_BASE $2000 +.equ REG_BASE $2000 +.equ N_BASE $20 + + ; Memory defines +.equ VRAM_BASE $1000 +.equ VRAM $1000 +.equ SPR_BASE $1300 +.equ OAM_BASE $1300 +.equ MAP_BASE $1360 +.equ MAP $1360 +.equ TILEMAP $1360 + + ; RAM defines +.ifndef PM_STARTRAM +.equ PM_STARTRAM $14E0 ; Map up to 24x16 +.endif +.if PM_STARTRAM < $1000 +.error "Invalid PM_STARTRAM value, too small" +.endif +.if PM_STARTRAM >= $2000 +.error "Invalid PM_STARTRAM value, too big" +.endif + +.equ PMINIT_RAND (PM_STARTRAM + 0) +.equ PMINIT_KEYPAD (PM_STARTRAM + 2) +.equ PMINIT_FRAMECNT (PM_STARTRAM + 3) +.equ RAM (PM_STARTRAM + 4) +.equ RAM_BASE (PM_STARTRAM + 4) +.equ RAM_SIZE ($2000 - RAM_BASE) +.option ram_base RAM_BASE +.option symoutput 1 + + ; --------- + ; Registers + + ; BIOS +.equ SYS_CTRL1 $00 +.equ SYS_CTRL2 $01 +.equ SYS_CTRL3 $02 + + ; Secound timer +.equ SEC_CTRL $08 +.equ SEC_CNT_LO $09 +.equ SEC_CNT_MID $0A +.equ SEC_CNT_HI $0B + + ; Battery status +.equ SYS_BATT $10 + + ; Timers control +.equ TMR1_SCALE $18 +.equ TMR1_ENA_OSC $19 +.equ TMR1_OSC $19 +.equ TMR2_SCALE $1A +.equ TMR2_OSC $1B +.equ TMR3_SCALE $1C +.equ TMR3_OSC $1D + + ; Interrupts +.equ IRQ_PRI1 $20 +.equ IRQ_PRI2 $21 +.equ IRQ_PRI3 $22 +.equ IRQ_ENA1 $23 +.equ IRQ_ENA2 $24 +.equ IRQ_ENA3 $25 +.equ IRQ_ENA4 $26 +.equ IRQ_ACT1 $27 +.equ IRQ_ACT2 $28 +.equ IRQ_ACT3 $29 +.equ IRQ_ACT4 $2A + + ; Timer 1 +.equ TMR1_CTRL_L $30 +.equ TMR1_CTRL_H $31 +.equ TMR1_CTRL $30 +.equ TMR1_PRE_L $32 +.equ TMR1_PRE_H $33 +.equ TMR1_PRE $32 +.equ TMR1_PVT_L $34 +.equ TMR1_PVT_H $35 +.equ TMR1_PVT $34 +.equ TMR1_CNT_L $36 +.equ TMR1_CNT_H $37 +.equ TMR1_CNT $36 + + ; Timer 2 +.equ TMR2_CTRL_L $38 +.equ TMR2_CTRL_H $39 +.equ TMR2_CTRL $38 +.equ TMR2_PRE_L $3A +.equ TMR2_PRE_H $3B +.equ TMR2_PRE $3A +.equ TMR2_PVT_L $3C +.equ TMR2_PVT_H $3D +.equ TMR2_PVT $3C +.equ TMR2_CNT_L $3E +.equ TMR2_CNT_H $3F +.equ TMR2_CNT $3E + + ; 256 Hz Timer +.equ TMR256_CTRL $40 +.equ TMR256_CNT $41 + + ; Timer 3 +.equ TMR3_CTRL_L $48 +.equ TMR3_CTRL_H $49 +.equ TMR3_CTRL $48 +.equ TMR3_PRE_L $4A +.equ TMR3_PRE_H $4B +.equ TMR3_PRE $4A +.equ TMR3_PVT_L $4C +.equ TMR3_PVT_H $4D +.equ TMR3_PVT $4C +.equ TMR3_CNT_L $4E +.equ TMR3_CNT_H $4F +.equ TMR3_CNT $4E + + ; Inputs +.equ KEY_PAD $52 +.equ KEYPAD $52 +.equ CART_BUS $53 + + ; IO +.equ IO_DIR $60 +.equ IO_DATA $61 + + ; Audio +.equ AUD_CTRL $70 +.equ AUD_VOL $71 + + ; PRC +.equ PRC_MODE $80 +.equ PRC_RATE $81 +.equ PRC_MAP_LO $82 +.equ PRC_MAP_MID $83 +.equ PRC_MAP_HI $84 +.equ PRC_SCROLL_Y $85 +.equ PRC_SCROLL_X $86 +.equ PRC_SPR_LO $87 +.equ PRC_OAM_LO $87 +.equ PRC_SPR_MID $88 +.equ PRC_OAM_MID $88 +.equ PRC_SPR_HI $89 +.equ PRC_OAM_HI $89 +.equ PRC_CNT $8A + +.equ PRC_MAP_BASE $2082 +.equ PRC_SPR_BASE $2087 +.equ PRC_OAM_BASE $2087 + + ; PokeMini Debugger +.equ POKEMINI_CHR $D0 +.equ POKEMINI_HEX $D1 +.equ POKEMINI_NUM $D2 +.equ POKEMINI_UINTB $D2 +.equ POKEMINI_SINTB $D3 +.equ POKEMINI_UINTW $D4 +.equ POKEMINI_UINTWL $D4 +.equ POKEMINI_UINTWH $D5 +.equ POKEMINI_SINTW $D6 +.equ POKEMINI_SINTWL $D6 +.equ POKEMINI_SINTWH $D7 +.equ POKEMINI_FX8_8 $DE +.equ POKEMINI_FX8_8L $DE +.equ POKEMINI_FX8_8H $DF + + ; Color interface +.equ COLORPM_CMD $F0 +.equ COLORPM_CTRL $F0 +.equ COLORPM_ADDR $F1 +.equ COLORPM_ADDRL $F1 +.equ COLORPM_ADDRH $F2 +.equ COLORPM_DATA $F3 +.equ COLORPM_LP0 $F4 +.equ COLORPM_HP0 $F5 +.equ COLORPM_LP1 $F6 +.equ COLORPM_HP1 $F7 + + ; LCD +.equ LCD_CTRL $FE +.equ LCD_DATA $FF + + ; --------------- + ; Helpful defines + +.equ DISABLE_IRQ $C0 ; F register +.equ ENABLE_IRQ $80 + +.equ TMRS_ENABLE $30 ; n+TMR1_ENA_OSC +.equ TMRS_ON $30 +.equ TMRS_OSC1 $20 +.equ TMRS_OSC2 $10 + +.equ SEC_ENABLE $01 ; n+SEC_CTRL +.equ SEC_RESET $02 + +.equ LOW_BATTERY $20 ; n+SYS_BATT + +.equ TMR256_ENABLE $01 ; n+TMR256_CNT +.equ TMR256_RESET $02 + +.equ TMR_8BITS $00 ; n+TMRn_CTRL_L +.equ TMR_16BITS $80 + +.equ TMR_PRESET $02 ; n+TMRn_CTRL_L / n+TMRn_CTRL_H +.equ TMR_RESET $02 +.equ TMR_ENABLE $04 + +.equ TMR_LO_DIV_OFF $00 ; n+TMRn_SCALE +.equ TMR_LO_DIV_DISABLE $00 +.equ TMR_LO_DIV_2 $08 +.equ TMR_LO_DIV_8 $09 +.equ TMR_LO_DIV_32 $0A +.equ TMR_LO_DIV_64 $0B +.equ TMR_LO_DIV_128 $0C +.equ TMR_LO_DIV_256 $0D +.equ TMR_LO_DIV_1024 $0E +.equ TMR_LO_DIV_4096 $0F + +.equ TMR_LO_DIV2_OFF $00 ; n+TMRn_SCALE +.equ TMR_LO_DIV2_DISABLE $00 +.equ TMR_LO_DIV2_1 $08 +.equ TMR_LO_DIV2_2 $09 +.equ TMR_LO_DIV2_4 $0A +.equ TMR_LO_DIV2_8 $0B +.equ TMR_LO_DIV2_16 $0C +.equ TMR_LO_DIV2_32 $0D +.equ TMR_LO_DIV2_64 $0E +.equ TMR_LO_DIV2_128 $0F + +.equ TMR_HI_DIV_OFF $00 ; n+TMRn_SCALE +.equ TMR_HI_DIV_DISABLE $00 +.equ TMR_HI_DIV_2 $80 +.equ TMR_HI_DIV_8 $90 +.equ TMR_HI_DIV_32 $A0 +.equ TMR_HI_DIV_64 $B0 +.equ TMR_HI_DIV_128 $C0 +.equ TMR_HI_DIV_256 $D0 +.equ TMR_HI_DIV_1024 $E0 +.equ TMR_HI_DIV_4096 $F0 + +.equ TMR_HI_DIV2_OFF $00 ; n+TMRn_SCALE +.equ TMR_HI_DIV2_DISABLE $00 +.equ TMR_HI_DIV2_1 $80 +.equ TMR_HI_DIV2_2 $90 +.equ TMR_HI_DIV2_4 $A0 +.equ TMR_HI_DIV2_8 $B0 +.equ TMR_HI_DIV2_16 $C0 +.equ TMR_HI_DIV2_32 $D0 +.equ TMR_HI_DIV2_64 $E0 +.equ TMR_HI_DIV2_128 $F0 + +.equ TMR_DIV_OFF $00 ; n+TMRn_SCALE +.equ TMR_DIV_2 $08 +.equ TMR_DIV_8 $09 +.equ TMR_DIV_32 $0A +.equ TMR_DIV_64 $0B +.equ TMR_DIV_128 $0C +.equ TMR_DIV_256 $0D +.equ TMR_DIV_1024 $0E +.equ TMR_DIV_4096 $0F + +.equ TMR_DIV2_OFF $00 ; n+TMRn_SCALE +.equ TMR_DIV2_1 $08 +.equ TMR_DIV2_2 $09 +.equ TMR_DIV2_4 $0A +.equ TMR_DIV2_8 $0B +.equ TMR_DIV2_16 $0C +.equ TMR_DIV2_32 $0D +.equ TMR_DIV2_64 $0E +.equ TMR_DIV2_128 $0F + +.equ TMR_OSC1_LO $00 ; n+TMRn_OSC +.equ TMR_OSC1_HI $00 +.equ TMR_OSC2_LO $01 +.equ TMR_OSC2_HI $02 + +.equ IRQ_PRI1_TMR3 $03 ; n+IRQ_PRI1 +.equ IRQ_PRI1_TMR1 $0C +.equ IRQ_PRI1_TMR2 $30 +.equ IRQ_PRI1_PRC $C0 + +.equ IRQ_PRI2_UNKNOWN $03 ; n+IRQ_PRI2 +.equ IRQ_PRI2_KEY_PAD $0C +.equ IRQ_PRI2_KEYPAD $0C +.equ IRQ_PRI2_CARTRIDGE $30 +.equ IRQ_PRI2_TMR256 $C0 +.equ IRQ_PRI2_HZ $C0 + +.equ IRQ_PRI3_IO $03 ; n+IRQ_PRI3 +.equ IRQ_PRI3_PIO $03 + +.equ IRQ_ENA1_TMR3_PVT $01 ; n+IRQ_ENA1 +.equ IRQ_ENA1_TMR3_HI $02 +.equ IRQ_ENA1_TMR1_LO $04 +.equ IRQ_ENA1_TMR1_HI $08 +.equ IRQ_ENA1_TMR2_LO $10 +.equ IRQ_ENA1_TMR2_HI $20 +.equ IRQ_ENA1_PRC_DIV $40 +.equ IRQ_ENA1_PRC_COPY $80 + +.equ IRQ_ENA2_CARTRIDGE $01 ; n+IRQ_ENA2 +.equ IRQ_ENA2_CART_EJECT $02 +.equ IRQ_ENA2_1HZ $04 +.equ IRQ_ENA2_2HZ $08 +.equ IRQ_ENA2_8HZ $10 +.equ IRQ_ENA2_32HZ $20 + +.equ IRQ_ENA3_KEY_A $01 ; n+IRQ_ENA3 +.equ IRQ_ENA3_KEY_B $02 +.equ IRQ_ENA3_KEY_C $04 +.equ IRQ_ENA3_KEY_UP $08 +.equ IRQ_ENA3_KEY_DOWN $10 +.equ IRQ_ENA3_KEY_LEFT $20 +.equ IRQ_ENA3_KEY_RIGHT $40 +.equ IRQ_ENA3_KEY_POWER $80 +.equ IRQ_ENA3_KEYS $FF + +.equ IRQ_ENA4_UNKNOWN1 $01 ; n+IRQ_ENA4 +.equ IRQ_ENA4_UNKNOWN2 $02 +.equ IRQ_ENA4_UNKNOWN3 $04 +.equ IRQ_ENA4_UNMAPPED1 $10 +.equ IRQ_ENA4_UNMAPPED2 $20 +.equ IRQ_ENA4_SHOCK $40 +.equ IRQ_ENA4_IR_RX $80 + +.equ IRQ_ACT1_TMR3_PVT $01 ; n+IRQ_ACT1 +.equ IRQ_ACT1_TMR3_HI $02 +.equ IRQ_ACT1_TMR1_LO $04 +.equ IRQ_ACT1_TMR1_HI $08 +.equ IRQ_ACT1_TMR2_LO $10 +.equ IRQ_ACT1_TMR2_HI $20 +.equ IRQ_ACT1_PRC_DIV $40 +.equ IRQ_ACT1_PRC_COPY $80 + +.equ IRQ_ACT2_CARTRIDGE $01 ; n+IRQ_ACT2 +.equ IRQ_ACT2_CART_EJECT $02 +.equ IRQ_ACT2_1HZ $04 +.equ IRQ_ACT2_2HZ $08 +.equ IRQ_ACT2_8HZ $10 +.equ IRQ_ACT2_32HZ $20 + +.equ IRQ_ACT3_KEY_A $01 ; n+IRQ_ACT3 +.equ IRQ_ACT3_KEY_B $02 +.equ IRQ_ACT3_KEY_C $04 +.equ IRQ_ACT3_KEY_UP $08 +.equ IRQ_ACT3_KEY_DOWN $10 +.equ IRQ_ACT3_KEY_LEFT $20 +.equ IRQ_ACT3_KEY_RIGHT $40 +.equ IRQ_ACT3_KEY_POWER $80 +.equ IRQ_ACT3_KEYS $FF + +.equ IRQ_ACT4_UNKNOWN1 $01 ; n+IRQ_ACT4 +.equ IRQ_ACT4_UNKNOWN2 $02 +.equ IRQ_ACT4_UNKNOWN3 $04 +.equ IRQ_ACT4_UNMAPPED1 $10 +.equ IRQ_ACT4_UNMAPPED2 $20 +.equ IRQ_ACT4_SHOCK $40 +.equ IRQ_ACT4_IR_RX $80 + +.equ KEY_A $01 ; n+KEY_PAD +.equ KEY_B $02 +.equ KEY_C $04 +.equ KEY_UP $08 +.equ KEY_DOWN $10 +.equ KEY_LEFT $20 +.equ KEY_RIGHT $40 +.equ KEY_POWER $80 + +.equ IO_IR_TX $01 ; n+IO_DIR / n+IO_DATA +.equ IO_IR_TRANSMIT $01 +.equ IO_IR_RX $02 +.equ IO_IR_RECEIVE $02 +.equ IO_EEPROM_DAT $04 +.equ IO_EEPROM_DATA $04 +.equ IO_EEPROM_CLK $08 +.equ IO_EEPROM_CLOCK $08 +.equ IO_RUMBLE $10 +.equ IO_IR_DISABLE $20 +.equ IO_IR_OFF $20 + +.equ PRC_INVERTMAP $01 ; n+PRC_MODE +.equ PRC_INVERTBG $01 +.equ PRC_ENABLEMAP $02 +.equ PRC_ENABLEBG $02 +.equ PRC_MAP $02 +.equ PRC_BG $02 +.equ PRC_ENABLESPR $04 +.equ PRC_ENABLEOAM $04 +.equ PRC_SPR $04 +.equ PRC_OAM $04 +.equ PRC_ENABLE $08 +.equ PRC_ENABLECOPY $08 +.equ PRC_ENABLECPY $08 + +.equ PRC_MAP12X16 $00 ; n+PRC_MODE +.equ PRC_BG12X16 $00 +.equ PRC_MAP12x16 $00 +.equ PRC_BG12x16 $00 +.equ PRC_MAP16X12 $10 +.equ PRC_BG16X12 $10 +.equ PRC_MAP16x12 $10 +.equ PRC_BG16x12 $10 +.equ PRC_MAP24X8 $20 +.equ PRC_BG24X8 $20 +.equ PRC_MAP24x8 $20 +.equ PRC_BG24x8 $20 +.equ PRC_MAP24X16 $30 +.equ PRC_BG24X16 $30 +.equ PRC_MAP24x16 $30 +.equ PRC_BG24x16 $30 +.equ PRC_MAPMASK $30 +.equ PRC_BGMASK $30 + +.equ PRC_RATE_3 $00 ;n+PRC_RATE +.equ PRC_RATE_6 $02 +.equ PRC_RATE_9 $04 +.equ PRC_RATE_12 $06 +.equ PRC_RATE_2 $08 +.equ PRC_RATE_4 $0A +.equ PRC_RATE_6ALT $0C +.equ PRC_RATE_8 $0E +.equ PRC_RATEMASK $0E +.equ PRC_24FPS $00 +.equ PRC_12FPS $02 +.equ PRC_8FPS $04 +.equ PRC_6FPS $06 +.equ PRC_36FPS $08 +.equ PRC_18FPS $0A +.equ PRC_12FPSALT $0C +.equ PRC_9FPS $0E +.equ PRC_FPSMASK $0E + +.equ LCD_COLUMN_LO $00 ; n+LCD_CTRL +.equ LCD_COLUMN_HI $10 +.equ LCD_STARTLINE $40 +.equ LCD_PAGE $B0 +.equ LCD_CONTRAST $81 +.equ LCD_SEGDIR $A0 +.equ LCD_INVSEGDIR $A1 +.equ LCD_DISPSEL_ON $A4 +.equ LCD_DISPSEL_OFF $A5 +.equ LCD_DISPINV_ON $A6 +.equ LCD_DISPINV_OFF $A7 +.equ LCD_DISPENABLE $AE +.equ LCD_DISPDISABLE $AF +.equ LCD_ROWNORMAL $C0 +.equ LCD_ROWINVERT $C4 +.equ LCD_START_RMW $E0 +.equ LCD_BEGIN_RMW $E0 +.equ LCD_END_RMW $EE +.equ LCD_RESET $E2 +.equ LCD_NOP $E3 + +.equ COLORPM_UNLOCKED $CE + +.equ COLORPM_UNLOCK1 $5A +.equ COLORPM_UNLOCK2 $CE +.equ COLORPM_LOCK $CF + +.equ COLORPM_FIXED $A0 +.equ COLORPM_POSTINC $A1 +.equ COLORPM_POSTDEC $A2 +.equ COLORPM_PREINC $A3 + +.equ COLORPM_VRAM_ON $D0 +.equ COLORPM_LCD_ON $D1 +.equ COLORPM_PRC_ON $D2 + +.equ COLORPM_VRAM_OFF $D8 +.equ COLORPM_LCD_OFF $D9 +.equ COLORPM_PRC_OFF $DA + +.equ COLORPM_FLIP $F0 + +.equ SPR_X $00 ; spr * 4 + ... +.equ SPR_Y $01 +.equ SPR_TILE $02 +.equ SPR_CTRL $03 + +.equ OAM_X $00 ; spr * 4 + ... +.equ OAM_Y $01 +.equ OAM_TILE $02 +.equ OAM_CTRL $03 + +.equ SPR_HFLIP $01 ; spr * 4 + SPR_CTRL +.equ SPR_VFLIP $02 +.equ SPR_INVERT $04 +.equ SPR_ENABLE $08 +.equ SPR_DISABLE $00 + +.equ OAM_FLIPH $01 ; spr * 4 + SPR_CTRL +.equ OAM_FLIPV $02 +.equ OAM_INVERT $04 +.equ OAM_ENABLE $08 +.equ OAM_DISABLE $00 + + ; --------- + ; CINT IRQs + +.equ CINT_HARDRESET $00 +.equ CINT_SOFTRESET $01 +.equ CINT_SOFTRESET2 $02 +.equ CINT_PRC_COPY $03 +.equ CINT_PRC_DIV $04 +.equ CINT_TMR2_HI $05 +.equ CINT_TMR2_LO $06 +.equ CINT_TMR1_HI $07 +.equ CINT_TMR1_LO $08 +.equ CINT_TMR3_HI $09 +.equ CINT_TMR3_PVT $0A +.equ CINT_32HZ $0B +.equ CINT_8HZ $0C +.equ CINT_2HZ $0D +.equ CINT_1HZ $0E +.equ CINT_IR_RX $0F +.equ CINT_SHOCK $10 +.equ CINT_CART_EJECT $13 +.equ CINT_CARTRIDGE $14 +.equ CINT_KEY_POWER $15 +.equ CINT_KEY_RIGHT $16 +.equ CINT_KEY_LEFT $17 +.equ CINT_KEY_DOWN $18 +.equ CINT_KEY_UP $19 +.equ CINT_KEY_C $1A +.equ CINT_KEY_B $1B +.equ CINT_KEY_A $1C +.equ CINT_UNKNOWN1D $1D +.equ CINT_UNKNOWN1E $1E +.equ CINT_UNKNOWN1F $1F +.equ CINT_IRQ_FFF1 $20 +.equ CINT_SUSPEND $21 +.equ CINT_SLEEP_LCDOFF $22 +.equ CINT_SLEEP_LCDON $23 +.equ CINT_SHUTDOWN $24 +.equ CINT_EXIT $24 +.equ CINT_UNKNOWN25 $25 +.equ CINT_SET_CONTRAST $26 +.equ CINT_ADD_CONTRAST $27 +.equ CINT_APPLY_CONTRAST $28 +.equ CINT_GET_CONTRAST $29 +.equ CINT_TMP_CONTRAST $2A +.equ CINT_LCD_ON $2B +.equ CINT_LCD_INIT $2C +.equ CINT_LCD_OFF $2D +.equ CINT_ENABLE_RAMVECTOR $2E +.equ CINT_DISABLE_RAMVECTOR $2F +.equ CINT_ENABLE_CART_EJECT $30 +.equ CINT_DISABLE_CART_EJECT $31 +.equ CINT_UNKNOWN32 $32 +.equ CINT_UNKNOWN33 $33 +.equ CINT_UNKNOWN34 $34 +.equ CINT_UNKNOWN35 $35 +.equ CINT_UNKNOWN36 $36 +.equ CINT_UNKNOWN37 $37 +.equ CINT_UNKNOWN38 $38 +.equ CINT_UNKNOWN39 $39 +.equ CINT_UNKNOWN3A $3A +.equ CINT_CART_DISABLE $3B +.equ CINT_CART_ENABLE $3C +.equ CINT_CART_DETECT $3D +.equ CINT_ROUTINE $3E +.equ CINT_SET_PRC_RATE $3F +.equ CINT_GET_PRC_RATE $40 +.equ CINT_MULTICART $41 +.equ CINT_DEVCART_READID $42 +.equ CINT_DEVCART_RESET $43 +.equ CINT_DEVCART_PROGRAM $44 +.equ CINT_DEVCART_ERASE $45 +.equ CINT_DEVCART_UNLOCK $46 +.equ CINT_DEVCART_BANK $47 +.equ CINT_DEVCART_CMD_C9 $48 +.equ CINT_DEVCART_PREPID $49 +.equ CINT_DEVCART_SELGAME $4A +.equ CINT_DEVCART_NSDK $4B +.equ CINT_IR_PULSE $4C + + ; -------------- + ; Helpful Macros + +.macroicase FJMP pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jmp ((pmpar_offset & $7FFF) | $8000) + .else + jmp pmpar_offset + .endif +.endm + +.macroicase FJC pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jc ((pmpar_offset & $7FFF) | $8000) + .else + jc pmpar_offset + .endif +.endm + +.macroicase FJNC pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jnc ((pmpar_offset & $7FFF) | $8000) + .else + jnc pmpar_offset + .endif +.endm + +.macroicase FJZ pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jz ((pmpar_offset & $7FFF) | $8000) + .else + jz pmpar_offset + .endif +.endm + +.macroicase FJNZ pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jnz ((pmpar_offset & $7FFF) | $8000) + .else + jnz pmpar_offset + .endif +.endm + +.macroicase FJDBNZ pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jdbnz ((pmpar_offset & $7FFF) | $8000) + .else + jdbnz pmpar_offset + .endif +.endm + +.macroicase FJL pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jl ((pmpar_offset & $7FFF) | $8000) + .else + jl pmpar_offset + .endif +.endm + +.macroicase FJLE pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jle ((pmpar_offset & $7FFF) | $8000) + .else + jle pmpar_offset + .endif +.endm + +.macroicase FJG pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jg ((pmpar_offset & $7FFF) | $8000) + .else + jg pmpar_offset + .endif +.endm + +.macroicase FJGE pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jge ((pmpar_offset & $7FFF) | $8000) + .else + jge pmpar_offset + .endif +.endm + +.macroicase FJO pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jo ((pmpar_offset & $7FFF) | $8000) + .else + jo pmpar_offset + .endif +.endm + +.macroicase FJNO pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jno ((pmpar_offset & $7FFF) | $8000) + .else + jno pmpar_offset + .endif +.endm + +.macroicase FJNS pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + jns ((pmpar_offset & $7FFF) | $8000) + .else + jns pmpar_offset + .endif +.endm + +.macroicase FJS pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + js ((pmpar_offset & $7FFF) | $8000) + .else + js pmpar_offset + .endif +.endm + +.macroicase FCALL pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + call ((pmpar_offset & $7FFF) | $8000) + .else + call pmpar_offset + .endif +.endm + +.macroicase FCALLC pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callc ((pmpar_offset & $7FFF) | $8000) + .else + callc pmpar_offset + .endif +.endm + +.macroicase FCALLNC pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callnc ((pmpar_offset & $7FFF) | $8000) + .else + callnc pmpar_offset + .endif +.endm + +.macroicase FCALLZ pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callz ((pmpar_offset & $7FFF) | $8000) + .else + callz pmpar_offset + .endif +.endm + +.macroicase FCALLNZ pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callnz ((pmpar_offset & $7FFF) | $8000) + .else + callnz pmpar_offset + .endif +.endm + +.macroicase FCALLL pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + calll ((pmpar_offset & $7FFF) | $8000) + .else + calll pmpar_offset + .endif +.endm + +.macroicase FCALLLE pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callle ((pmpar_offset & $7FFF) | $8000) + .else + callle pmpar_offset + .endif +.endm + +.macroicase FCALLG pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callg ((pmpar_offset & $7FFF) | $8000) + .else + callg pmpar_offset + .endif +.endm + +.macroicase FCALLGE pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callge ((pmpar_offset & $7FFF) | $8000) + .else + callge pmpar_offset + .endif +.endm + +.macroicase FCALLO pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callo ((pmpar_offset & $7FFF) | $8000) + .else + callo pmpar_offset + .endif +.endm + +.macroicase FCALLNO pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callno ((pmpar_offset & $7FFF) | $8000) + .else + callno pmpar_offset + .endif +.endm + +.macroicase FCALLNS pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + callns ((pmpar_offset & $7FFF) | $8000) + .else + callns pmpar_offset + .endif +.endm + +.macroicase FCALLS pmpar_offset + .if pmpar_offset >= $8000 + mov u, (pmpar_offset >> 15) + calls ((pmpar_offset & $7FFF) | $8000) + .else + calls pmpar_offset + .endif +.endm + +.macroicase CPU_CLEAR + and f, $CF +.endm + +.macroicase SET_F pmpar_flags + or f, pmpar_flags +.endm + +.macroicase CLEAR_F pmpar_flags + and f, ~pmpar_flags +.endm + +.macroicase PM_ALIGN_MAP + .org (. + 7) & ~7 +.endm + +.macroicase PM_ALIGN_TILES + .org (. + 7) & ~7 +.endm + +.macroicase PM_ALIGN_BG + .org (. + 7) & ~7 +.endm + +.macroicase PM_ALIGN_BACKGROUND + .org (. + 7) & ~7 +.endm + +.macroicase PM_ALIGN_SPR + .org (. + 63) & ~63 +.endm + +.macroicase PM_ALIGN_OAM + .org (. + 63) & ~63 +.endm + +.macroicase PM_ALIGN_SPRITES + .org (. + 63) & ~63 +.endm + +.macroicase PM_CODEINFO + .printf "Code size: %i Bytes\n", (. - ROM_BASE) +.endm + +.macroicase PM_DATAINFO + .printf "ROM size: %i Bytes\n", (.) + .printf "ROM banks: %i Bank(s)\n", (. + 32767) / 32768 + .printf "RAM size: %i Bytes\n", (__RAMBASE__ - RAM_BASE) + .printf "RAM usage: %i%%\n", (__RAMBASE__ - RAM_BASE) * 100 / RAM_SIZE +.endm + +.macroicase PM_ROMINFO + .printf "ROM size: %i Bytes\n", (.) + .printf "ROM banks: %i Bank(s)\n", (. + 32767) / 32768 +.endm + +.macroicase COLORPM_INIT + mov [n+COLORPM_CMD], COLORPM_UNLOCK1 + mov [n+COLORPM_CMD], COLORPM_UNLOCK2 +.endm + + ; ---------------- + ; Interrupt Macros + +; 3rd macro parameter +.define IRQ_PRC_COPY $000001 +.define IRQ_PRC_DIV $000002 +.define IRQ_TMR2_HI $000004 +.define IRQ_TMR2_LO $000008 +.define IRQ_TMR1_HI $000010 +.define IRQ_TMR1_LO $000020 +.define IRQ_TMR3_HI $000040 +.define IRQ_TMR3_PVT $000080 +.define IRQ_32HZ $000100 +.define IRQ_8HZ $000200 +.define IRQ_2HZ $000400 +.define IRQ_1HZ $000800 +.define IRQ_IR_RX $001000 +.define IRQ_SHOCK $002000 +.define IRQ_UNKNOWN $004000 +.define IRQ_CARTRIDGE $008000 +.define IRQ_KEY_POWER $010000 +.define IRQ_KEY_RIGHT $020000 +.define IRQ_KEY_LEFT $040000 +.define IRQ_KEY_DOWN $080000 +.define IRQ_KEY_UP $100000 +.define IRQ_KEY_C $200000 +.define IRQ_KEY_B $400000 +.define IRQ_KEY_A $800000 + +.define IRQ_PRC $000003 +.define IRQ_TMR2 $00000C +.define IRQ_TMR1 $000030 +.define IRQ_TMR3 $0000C0 +.define IRQ_TMR256 $000F00 +.define IRQ_HZ $000F00 +.define IRQ_IO $003000 +.define IRQ_PIO $003000 +.define IRQ_KEY $FF0000 +.define IRQ_ALL $FF3FFF +.define IRQ_TOTALLYALL $FFFFFF + +; 4th macro parameter +.define IRQF_FAR $01 +.define IRQF_NORIRQ $02 +.define IRQF_NOSTARTUP $04 + +.macroicase RIRQ pmpar_irq_select + push hl + .if (pmpar_irq_select == IRQ_PRC_COPY) + mov l, $00 + .elif (pmpar_irq_select == IRQ_PRC_DIV) + mov l, $02 + .elif (pmpar_irq_select == IRQ_TMR2_HI) + mov l, $04 + .elif (pmpar_irq_select == IRQ_TMR2_LO) + mov l, $06 + .elif (pmpar_irq_select == IRQ_TMR1_HI) + mov l, $08 + .elif (pmpar_irq_select == IRQ_TMR1_LO) + mov l, $0A + .elif (pmpar_irq_select == IRQ_TMR3_HI) + mov l, $0C + .elif (pmpar_irq_select == IRQ_TMR3_PVT) + mov l, $0E + .elif (pmpar_irq_select == IRQ_32HZ) + mov l, $10 + .elif (pmpar_irq_select == IRQ_8HZ) + mov l, $12 + .elif (pmpar_irq_select == IRQ_2HZ) + mov l, $14 + .elif (pmpar_irq_select == IRQ_1HZ) + mov l, $16 + .elif (pmpar_irq_select == IRQ_IR_RX) + mov l, $18 + .elif (pmpar_irq_select == IRQ_SHOCK) + mov l, $1A + .elif (pmpar_irq_select == IRQ_UNKNOWN) + mov l, $1C + .elif (pmpar_irq_select == IRQ_CARTRIDGE) + mov l, $1E + .elif (pmpar_irq_select == IRQ_KEY_POWER) + mov l, $20 + .elif (pmpar_irq_select == IRQ_KEY_RIGHT) + mov l, $22 + .elif (pmpar_irq_select == IRQ_KEY_LEFT) + mov l, $24 + .elif (pmpar_irq_select == IRQ_KEY_DOWN) + mov l, $26 + .elif (pmpar_irq_select == IRQ_KEY_UP) + mov l, $28 + .elif (pmpar_irq_select == IRQ_KEY_C) + mov l, $2A + .elif (pmpar_irq_select == IRQ_KEY_B) + mov l, $2C + .elif (pmpar_irq_select == IRQ_KEY_A) + mov l, $2E + .else + .error "Unsupported IRQ value in rirq macro" + .endif + .if (pmpar_irq_select == IRQ_PRC_DIV) + jmp rirq_handle_prcdiv + .else + jmp rirq_handle + .endif +.endm + +.macroicase DISABLE_MIRQ + or f, $40 +.endm + +.macroicase ENABLE_MIRQ + and f, $BF +.endm + +.macroicase PRIORITY_IRQS pmpar_priority, pmpar_irqs_select + .if ((pmpar_priority < 0) && (pmpar_priority > 3)) + .error "Priority must be between 0 and 3" + .endif + .set priority_irqs___enable1 0 + .set priority_irqs___enable2 0 + .set priority_irqs___enable3 0 + .set priority_irqs___enable4 0 + .if (pmpar_irqs_select & (IRQ_PRC_COPY | IRQ_PRC_DIV)) + .set priority_irqs___enable1 priority_irqs___enable1+IRQ_PRI1_PRC + .endif + .if (pmpar_irqs_select & (IRQ_TMR2_HI | IRQ_TMR2_LO)) + .set priority_irqs___enable1 priority_irqs___enable1+IRQ_PRI1_TMR2 + .endif + .if (pmpar_irqs_select & (IRQ_TMR1_HI | IRQ_TMR1_LO)) + .set priority_irqs___enable1 priority_irqs___enable1+IRQ_PRI1_TMR1 + .endif + .if (pmpar_irqs_select & (IRQ_TMR3_HI | IRQ_TMR3_PVT)) + .set priority_irqs___enable1 priority_irqs___enable1+IRQ_PRI1_TMR3 + .endif + .if (pmpar_irqs_select & (IRQ_32HZ | IRQ_8HZ | IRQ_2HZ | IRQ_1HZ)) + .set priority_irqs___enable2 priority_irqs___enable2+IRQ_PRI2_TMR256 + .endif + .if (pmpar_irqs_select & (IRQ_IR_RX | IRQ_SHOCK)) + .set priority_irqs___enable3 priority_irqs___enable3+IRQ_PRI3_IO + .endif + .if (pmpar_irqs_select & IRQ_UNKNOWN) + .set priority_irqs___enable2 priority_irqs___enable2+IRQ_PRI2_UNKNOWN + .endif + .if (pmpar_irqs_select & IRQ_CARTRIDGE) + .set priority_irqs___enable2 priority_irqs___enable2+IRQ_PRI2_CARTRIDGE + .endif + .if (pmpar_irqs_select & (IRQ_KEY_POWER | IRQ_KEY_RIGHT | IRQ_KEY_LEFT | IRQ_KEY_DOWN | IRQ_KEY_UP | IRQ_KEY_C | IRQ_KEY_B | IRQ_KEY_A)) + .set priority_irqs___enable2 priority_irqs___enable2+IRQ_PRI2_KEY_PAD + .endif + .if (priority_irqs___enable1 != 0) + .if (pmpar_priority == 0) + and [n+IRQ_PRI1], ~priority_irqs___enable1 + .elif (pmpar_priority == 3) + or [n+IRQ_PRI1], priority_irqs___enable1 + .else + and [n+IRQ_PRI1], ~priority_irqs___enable1 + or [n+IRQ_PRI1], (priority_irqs___enable1 & 0x55) * pmpar_priority + .endif + .endif + .if (priority_irqs___enable2 != 0) + .if (pmpar_priority == 0) + and [n+IRQ_PRI2], ~priority_irqs___enable2 + .elif (pmpar_priority == 3) + or [n+IRQ_PRI2], priority_irqs___enable2 + .else + and [n+IRQ_PRI2], ~priority_irqs___enable2 + or [n+IRQ_PRI2], (priority_irqs___enable2 & 0x55) * pmpar_priority + .endif + .endif + .if (priority_irqs___enable3 != 0) + .if (pmpar_priority == 0) + and [n+IRQ_PRI3], ~priority_irqs___enable3 + .elif (pmpar_priority == 3) + or [n+IRQ_PRI3], priority_irqs___enable3 + .else + and [n+IRQ_PRI3], ~priority_irqs___enable3 + or [n+IRQ_PRI3], (priority_irqs___enable3 & 0x55) * pmpar_priority + .endif + .endif + .if (priority_irqs___enable4 != 0) + .if (pmpar_priority == 0) + and [n+IRQ_PRI4], ~priority_irqs___enable4 + .elif (pmpar_priority == 3) + or [n+IRQ_PRI4], priority_irqs___enable4 + .else + and [n+IRQ_PRI4], ~priority_irqs___enable4 + or [n+IRQ_PRI4], (priority_irqs___enable4 & 0x55) * pmpar_priority + .endif + .endif + .unset priority_irqs___enable1 + .unset priority_irqs___enable2 + .unset priority_irqs___enable3 + .unset priority_irqs___enable4 +.endm + +.macroicase ENABLE_IRQS pmpar_irqs_select + .set enable_irqs___enable1 0 + .set enable_irqs___enable2 0 + .set enable_irqs___enable3 0 + .set enable_irqs___enable4 0 + .if (pmpar_irqs_select & IRQ_PRC_COPY) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_PRC_COPY + .endif + .if (pmpar_irqs_select & IRQ_PRC_DIV) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_PRC_DIV + .endif + .if (pmpar_irqs_select & IRQ_TMR2_HI) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_TMR2_HI + .endif + .if (pmpar_irqs_select & IRQ_TMR2_LO) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_TMR2_LO + .endif + .if (pmpar_irqs_select & IRQ_TMR1_HI) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_TMR1_HI + .endif + .if (pmpar_irqs_select & IRQ_TMR1_LO) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_TMR1_LO + .endif + .if (pmpar_irqs_select & IRQ_TMR3_HI) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_TMR3_HI + .endif + .if (pmpar_irqs_select & IRQ_TMR3_PVT) + .set enable_irqs___enable1 enable_irqs___enable1+IRQ_ENA1_TMR3_PVT + .endif + .if (pmpar_irqs_select & IRQ_32HZ) + .set enable_irqs___enable2 enable_irqs___enable2+IRQ_ENA2_32HZ + .endif + .if (pmpar_irqs_select & IRQ_8HZ) + .set enable_irqs___enable2 enable_irqs___enable2+IRQ_ENA2_8HZ + .endif + .if (pmpar_irqs_select & IRQ_2HZ) + .set enable_irqs___enable2 enable_irqs___enable2+IRQ_ENA2_2HZ + .endif + .if (pmpar_irqs_select & IRQ_1HZ) + .set enable_irqs___enable2 enable_irqs___enable2+IRQ_ENA2_1HZ + .endif + .if (pmpar_irqs_select & IRQ_IR_RX) + .set enable_irqs___enable4 enable_irqs___enable4+IRQ_ENA4_IR_RX + .endif + .if (pmpar_irqs_select & IRQ_SHOCK) + .set enable_irqs___enable4 enable_irqs___enable4+IRQ_ENA4_SHOCK + .endif + .if (pmpar_irqs_select & IRQ_UNKNOWN) + .set enable_irqs___enable4 enable_irqs___enable4+IRQ_ENA4_UNKNOWN1+IRQ_ENA4_UNKNOWN2+IRQ_ENA4_UNKNOWN3 + .endif + .if (pmpar_irqs_select & IRQ_CARTRIDGE) + .set enable_irqs___enable2 enable_irqs___enable2+IRQ_ENA2_CARTRIDGE + .endif + .if (pmpar_irqs_select & IRQ_KEY_POWER) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_POWER + .endif + .if (pmpar_irqs_select & IRQ_KEY_RIGHT) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_RIGHT + .endif + .if (pmpar_irqs_select & IRQ_KEY_LEFT) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_LEFT + .endif + .if (pmpar_irqs_select & IRQ_KEY_DOWN) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_DOWN + .endif + .if (pmpar_irqs_select & IRQ_KEY_UP) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_UP + .endif + .if (pmpar_irqs_select & IRQ_KEY_C) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_C + .endif + .if (pmpar_irqs_select & IRQ_KEY_B) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_B + .endif + .if (pmpar_irqs_select & IRQ_KEY_A) + .set enable_irqs___enable3 enable_irqs___enable3+IRQ_ENA3_KEY_A + .endif + .if (enable_irqs___enable1 != 0) + or [n+IRQ_ENA1], enable_irqs___enable1 + .endif + .if (enable_irqs___enable2 != 0) + or [n+IRQ_ENA2], enable_irqs___enable2 + .endif + .if (enable_irqs___enable3 != 0) + or [n+IRQ_ENA3], enable_irqs___enable3 + .endif + .if (enable_irqs___enable4 != 0) + or [n+IRQ_ENA4], enable_irqs___enable4 + .endif + .unset enable_irqs___enable1 + .unset enable_irqs___enable2 + .unset enable_irqs___enable3 + .unset enable_irqs___enable4 +.endm + +.macroicase DISABLE_IRQS pmpar_irqs_select + .set disable_irqs___enable1 0 + .set disable_irqs___enable2 0 + .set disable_irqs___enable3 0 + .set disable_irqs___enable4 0 + .if (pmpar_irqs_select & IRQ_PRC_COPY) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_PRC_COPY + .endif + .if (pmpar_irqs_select & IRQ_PRC_DIV) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_PRC_DIV + .endif + .if (pmpar_irqs_select & IRQ_TMR2_HI) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_TMR2_HI + .endif + .if (pmpar_irqs_select & IRQ_TMR2_LO) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_TMR2_LO + .endif + .if (pmpar_irqs_select & IRQ_TMR1_HI) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_TMR1_HI + .endif + .if (pmpar_irqs_select & IRQ_TMR1_LO) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_TMR1_LO + .endif + .if (pmpar_irqs_select & IRQ_TMR3_HI) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_TMR3_HI + .endif + .if (pmpar_irqs_select & IRQ_TMR3_PVT) + .set disable_irqs___enable1 disable_irqs___enable1+IRQ_ENA1_TMR3_PVT + .endif + .if (pmpar_irqs_select & IRQ_32HZ) + .set disable_irqs___enable2 disable_irqs___enable2+IRQ_ENA2_32HZ + .endif + .if (pmpar_irqs_select & IRQ_8HZ) + .set disable_irqs___enable2 disable_irqs___enable2+IRQ_ENA2_8HZ + .endif + .if (pmpar_irqs_select & IRQ_2HZ) + .set disable_irqs___enable2 disable_irqs___enable2+IRQ_ENA2_2HZ + .endif + .if (pmpar_irqs_select & IRQ_1HZ) + .set disable_irqs___enable2 disable_irqs___enable2+IRQ_ENA2_1HZ + .endif + .if (pmpar_irqs_select & IRQ_IR_RX) + .set disable_irqs___enable4 disable_irqs___enable4+IRQ_ENA4_IR_RX + .endif + .if (pmpar_irqs_select & IRQ_SHOCK) + .set disable_irqs___enable4 disable_irqs___enable4+IRQ_ENA4_SHOCK + .endif + .if (pmpar_irqs_select & IRQ_UNKNOWN) + .set disable_irqs___enable4 disable_irqs___enable4+IRQ_ENA4_UNKNOWN1+IRQ_ENA4_UNKNOWN2+IRQ_ENA4_UNKNOWN3 + .endif + .if (pmpar_irqs_select & IRQ_CARTRIDGE) + .set disable_irqs___enable2 disable_irqs___enable2+IRQ_ENA2_CARTRIDGE + .endif + .if (pmpar_irqs_select & IRQ_KEY_POWER) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_POWER + .endif + .if (pmpar_irqs_select & IRQ_KEY_RIGHT) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_RIGHT + .endif + .if (pmpar_irqs_select & IRQ_KEY_LEFT) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_LEFT + .endif + .if (pmpar_irqs_select & IRQ_KEY_DOWN) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_DOWN + .endif + .if (pmpar_irqs_select & IRQ_KEY_UP) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_UP + .endif + .if (pmpar_irqs_select & IRQ_KEY_C) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_C + .endif + .if (pmpar_irqs_select & IRQ_KEY_B) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_B + .endif + .if (pmpar_irqs_select & IRQ_KEY_A) + .set disable_irqs___enable3 disable_irqs___enable3+IRQ_ENA3_KEY_A + .endif + .if (disable_irqs___enable1 != 0) + and [n+IRQ_ENA1], ~disable_irqs___enable1 + .endif + .if (disable_irqs___enable2 != 0) + and [n+IRQ_ENA2], ~disable_irqs___enable2 + .endif + .if (disable_irqs___enable3 != 0) + and [n+IRQ_ENA3], ~disable_irqs___enable3 + .endif + .if (disable_irqs___enable4 != 0) + and [n+IRQ_ENA4], ~disable_irqs___enable4 + .endif + .unset disable_irqs___enable1 + .unset disable_irqs___enable2 + .unset disable_irqs___enable3 + .unset disable_irqs___enable4 +.endm + + ; ------------- + ; Header Macros + +.ifndef PM_GAMECODE +.define PM_GAMECODE "HmBw" +.endif + +.macroicase PM_HEADER pmpar_txt_name, pmpar_irq_active, pmpar_irq_flag +.org $2100 +.db "MN" +.if (pmpar_irq_flag & IRQF_NOSTARTUP) + jmp main +.else + jmp main_pm_entry +.endif + +.org $2108 ; IRQ $03 - PRC Copy Complete +.if (pmpar_irq_active & IRQ_PRC_COPY) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_prc_copy >> 15) + .endif + jmp irq_prc_copy +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $00 + jmp rirq_handle + .endif +.endif + +.org $210E ; IRQ $04 - PRC Frame Divider Overflow +.if (pmpar_irq_active & IRQ_PRC_DIV) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_prc_div >> 15) + .endif + jmp irq_prc_div +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $02 + jmp rirq_handle_prcdiv + .endif +.endif + +.org $2114 ; IRQ $05 - Timer2 Upper-8 Underflow +.if (pmpar_irq_active & IRQ_TMR2_HI) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_tmr2_hi >> 15) + .endif + jmp irq_tmr2_hi +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $04 + jmp rirq_handle + .endif +.endif + +.org $211A ; IRQ $06 - Timer2 Lower-8 Underflow (8-bit only) +.if (pmpar_irq_active & IRQ_TMR2_LO) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_tmr2_lo >> 15) + .endif + jmp irq_tmr2_lo +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $06 + jmp rirq_handle + .endif +.endif + +.org $2120 ; IRQ $07 - Timer1 Upper-8 Underflow +.if (pmpar_irq_active & IRQ_TMR1_HI) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_tmr1_hi >> 15) + .endif + jmp irq_tmr1_hi +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $08 + jmp rirq_handle + .endif +.endif + +.org $2126 ; IRQ $08 - Timer1 Lower-8 Underflow (8-bit only) +.if (pmpar_irq_active & IRQ_TMR1_LO) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_tmr1_lo >> 15) + .endif + jmp irq_tmr1_lo +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $0A + jmp rirq_handle + .endif +.endif + +.org $212C ; IRQ $09 - Timer3 Upper-8 Underflow +.if (pmpar_irq_active & IRQ_TMR3_HI) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_tmr3_hi >> 15) + .endif + jmp irq_tmr3_hi +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $0C + jmp rirq_handle + .endif +.endif + +.org $2132 ; IRQ $0A - Timer3 Pivot +.if (pmpar_irq_active & IRQ_TMR3_PVT) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_tmr3_pvt >> 15) + .endif + jmp irq_tmr3_pvt +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $0E + jmp rirq_handle + .endif +.endif + +.org $2138 ; IRQ $0B - 32Hz (From 256Hz Timer) +.if (pmpar_irq_active & IRQ_32HZ) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_32hz >> 15) + .endif + jmp irq_32hz +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $10 + jmp rirq_handle + .endif +.endif + +.org $213E ; IRQ $0C - 8Hz (From 256Hz Timer) +.if (pmpar_irq_active & IRQ_8HZ) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_8hz >> 15) + .endif + jmp irq_8hz +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $12 + jmp rirq_handle + .endif +.endif + +.org $2144 ; IRQ $0D - 2Hz (From 256Hz Timer) +.if (pmpar_irq_active & IRQ_2HZ) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_2hz >> 15) + .endif + jmp irq_2hz +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $14 + jmp rirq_handle + .endif +.endif + +.org $214A ; IRQ $0E - 1Hz (From 256Hz Timer) +.if (pmpar_irq_active & IRQ_1HZ) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_1hz >> 15) + .endif + jmp irq_1hz +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $16 + jmp rirq_handle + .endif +.endif + +.org $2150 ; IRQ $0F - IR Receiver +.if (pmpar_irq_active & IRQ_IR_RX) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_ir_rx >> 15) + .endif + jmp irq_ir_rx +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $18 + jmp rirq_handle + .endif +.endif + +.org $2156 ; IRQ $10 - Shock Sensor +.if (pmpar_irq_active & IRQ_SHOCK) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_shock >> 15) + .endif + jmp irq_shock +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $1A + jmp rirq_handle + .endif +.endif + +.org $215C ; IRQ $15 - Power Key +.if (pmpar_irq_active & IRQ_KEY_POWER) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_power >> 15) + .endif + jmp irq_key_power +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $20 + jmp rirq_handle + .endif +.endif + +.org $2162 ; IRQ $16 - Right Key +.if (pmpar_irq_active & IRQ_KEY_RIGHT) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_right >> 15) + .endif + jmp irq_key_right +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $22 + jmp rirq_handle + .endif +.endif + +.org $2168 ; IRQ $17 - Left Key +.if (pmpar_irq_active & IRQ_KEY_LEFT) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_left >> 15) + .endif + jmp irq_key_left +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $24 + jmp rirq_handle + .endif +.endif + +.org $216E ; IRQ $18 - Down Key +.if (pmpar_irq_active & IRQ_KEY_DOWN) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_down >> 15) + .endif + jmp irq_key_down +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $26 + jmp rirq_handle + .endif +.endif + +.org $2174 ; IRQ $19 - Up Key +.if (pmpar_irq_active & IRQ_KEY_UP) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_up >> 15) + .endif + jmp irq_key_up +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $28 + jmp rirq_handle + .endif +.endif + +.org $217A ; IRQ $1A - C Key +.if (pmpar_irq_active & IRQ_KEY_C) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_c >> 15) + .endif + jmp irq_key_c +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $2A + jmp rirq_handle + .endif +.endif + +.org $2180 ; IRQ $1B - B Key +.if (pmpar_irq_active & IRQ_KEY_B) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_b >> 15) + .endif + jmp irq_key_b +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $2C + jmp rirq_handle + .endif +.endif + +.org $2186 ; IRQ $1C - A Key +.if (pmpar_irq_active & IRQ_KEY_A) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_key_a >> 15) + .endif + jmp irq_key_a +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $2E + jmp rirq_handle + .endif +.endif + +.org $218C ; IRQ $1D - Unknown +.if (pmpar_irq_active & IRQ_UNKNOWN) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_unknown >> 15) + .endif + jmp irq_unknown +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $1C + jmp rirq_handle + .endif +.endif + +.org $2192 ; IRQ $1E - Unknown +.if (pmpar_irq_active & IRQ_UNKNOWN) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_unknown >> 15) + .endif + jmp irq_unknown +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $1C + jmp rirq_handle + .endif +.endif + +.org $2198 ; IRQ $1F - Unknown +.if (pmpar_irq_active & IRQ_UNKNOWN) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_unknown >> 15) + .endif + jmp irq_unknown +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $1C + jmp rirq_handle + .endif +.endif + +.org $219E ; IRQ $14 - Cartridge IRQ +.if (pmpar_irq_active & IRQ_CARTRIDGE) + .if (pmpar_irq_flag & IRQF_FAR) + mov u, (irq_cartridge >> 15) + .endif + jmp irq_cartridge +.else + .if (pmpar_irq_flag & IRQF_NORIRQ) + reti + .else + push hl + mov l, $1E + jmp rirq_handle + .endif +.endif + +.org $21A4 +.db "NINTENDO" +.org $21AC +.db PM_GAMECODE +.org $21B0 +.db pmpar_txt_name +.org $21BC +.db "2P" + +.org $21D0 +.if (!(pmpar_irq_flag & IRQF_NORIRQ)) +rirq_table: +.db $80, IRQ_ACT1 ; IRQ $03 - PRC Copy Complete +.db $40, IRQ_ACT1 ; IRQ $04 - PRC Frame Divider Overflow +.db $20, IRQ_ACT1 ; IRQ $05 - Timer2 Upper-8 Underflow +.db $10, IRQ_ACT1 ; IRQ $06 - Timer2 Lower-8 Underflow (8-bit only) +.db $08, IRQ_ACT1 ; IRQ $07 - Timer1 Upper-8 Underflow +.db $04, IRQ_ACT1 ; IRQ $08 - Timer1 Lower-8 Underflow (8-bit only) +.db $02, IRQ_ACT1 ; IRQ $09 - Timer3 Upper-8 Underflow +.db $01, IRQ_ACT1 ; IRQ $0A - Timer3 Pivot +.db $20, IRQ_ACT2 ; IRQ $0B - 32Hz (From 256Hz Timer) +.db $10, IRQ_ACT2 ; IRQ $0C - 8Hz (From 256Hz Timer) +.db $08, IRQ_ACT2 ; IRQ $0D - 2Hz (From 256Hz Timer) +.db $04, IRQ_ACT2 ; IRQ $0E - 1Hz (From 256Hz Timer) +.db $80, IRQ_ACT4 ; IRQ $0F - IR Receiver +.db $40, IRQ_ACT4 ; IRQ $10 - Shock Sensor +.db $07, IRQ_ACT4 ; IRQ $1D~$1F - Unknown +.db $01, IRQ_ACT2 ; IRQ $14 - Cartridge IRQ +.db $80, IRQ_ACT3 ; IRQ $15 - Power Key +.db $40, IRQ_ACT3 ; IRQ $16 - Right Key +.db $20, IRQ_ACT3 ; IRQ $17 - Left Key +.db $10, IRQ_ACT3 ; IRQ $18 - Down Key +.db $08, IRQ_ACT3 ; IRQ $19 - Up Key +.db $04, IRQ_ACT3 ; IRQ $1A - C Key +.db $02, IRQ_ACT3 ; IRQ $1B - B Key +.db $01, IRQ_ACT3 ; IRQ $1C - A Key + +rirq_handle_prcdiv: + push i + mov i, $00 + mov hl, PMINIT_FRAMECNT + inc [hl] + mov [n+IRQ_ACT1], IRQ_ACT1_PRC_DIV + pop i + pop hl + reti + +rirq_handle: + push i + push ba + mov i, $00 + mov h, $00 + add hl, rirq_table + mov a, [hl] + inc hl + mov l, [hl] + mov h, $20 + mov [hl], a + pop ba + pop i + pop hl + reti +.endif + +.if (!(pmpar_irq_flag & IRQF_NOSTARTUP)) +main_pm_entry: + mov f, DISABLE_IRQ + xor a, a + mov i, a + mov xi, a + mov yi, a + mov n, N_BASE + mov sp, SSTACK_BASE + mov [n+PRC_MAP_HI], a + mov [n+PRC_SPR_HI], a + mov [PMINIT_RAND+1], a ; Hi Rand + mov [PMINIT_FRAMECNT], a ; Frame Cnt + mov [PMINIT_KEYPAD], b ; InitKeys + mov [n+IRQ_ENA1], a + mov [n+IRQ_ENA2], a + mov [n+IRQ_ENA3], a + mov [n+IRQ_ENA4], a + mov a, $FF + mov [n+IRQ_ACT1], a + mov [n+IRQ_ACT2], a + mov [n+IRQ_ACT3], a + mov [n+IRQ_ACT4], a + mov [n+IRQ_PRI1], a + mov [n+IRQ_PRI2], a + mov [n+IRQ_PRI3], a + mov a, $01 + mov [PMINIT_RAND], a ; Lo Rand = $0001 + jmp main +.endif + +ROM_BASE: +.endm + +.macroicase ADD24X pminitp_addsub24 + .if pminitp_addsub24 == 1 + inc x + jnzb _skip + push a + mov a, xi + inc a + mov xi, a + pop a + .elif pminitp_addsub24 >= 65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 <= -65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 > 0 + add x, pminitp_addsub24 + jncb _skip + push a + mov a, xi + inc a + mov xi, a + pop a + .elif pminitp_addsub24 < 0 + sub x, -pminitp_addsub24 + jncb _skip + push a + mov a, xi + dec a + mov xi, a + pop a + .endif +_skip: +.endm + +.macroicase ADD24Y pminitp_addsub24 + .if pminitp_addsub24 == 1 + inc y + jnzb _skip + push a + mov a, yi + inc a + mov yi, a + pop a + .elif pminitp_addsub24 >= 65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 <= -65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 > 0 + add y, pminitp_addsub24 + jncb _skip + push a + mov a, yi + inc a + mov yi, a + pop a + .elif pminitp_addsub24 < 0 + sub y, -pminitp_addsub24 + jncb _skip + push a + mov a, yi + dec a + mov yi, a + pop a + .endif +_skip: +.endm + +.macroicase ADD24HL pminitp_addsub24 + .if pminitp_addsub24 == 1 + inc hl + jnzb _skip + push a + mov a, i + inc a + mov i, a + pop a + .elif pminitp_addsub24 >= 65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 <= -65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 > 0 + add hl, pminitp_addsub24 + jncb _skip + push a + mov a, i + inc a + mov i, a + pop a + .elif pminitp_addsub24 < 0 + sub y, -pminitp_addsub24 + jncb _skip + push a + mov a, i + dec a + mov i, a + pop a + .endif +_skip: +.endm + +.macroicase ADD24X_A pminitp_addsub24 + .if pminitp_addsub24 == 1 + inc x + jnzb _skip + mov a, xi + inc a + mov xi, a + .elif pminitp_addsub24 >= 65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 <= -65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 > 0 + add x, pminitp_addsub24 + jncb _skip + mov a, xi + inc a + mov xi, a + .elif pminitp_addsub24 < 0 + sub x, -pminitp_addsub24 + jncb _skip + mov a, xi + dec a + mov xi, a + .endif +_skip: +.endm + +.macroicase ADD24Y_A pminitp_addsub24 + .if pminitp_addsub24 == 1 + inc y + jnzb _skip + mov a, yi + inc a + mov yi, a + .elif pminitp_addsub24 >= 65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 <= -65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 > 0 + add y, pminitp_addsub24 + jncb _skip + mov a, yi + inc a + mov yi, a + .elif pminitp_addsub24 < 0 + sub y, -pminitp_addsub24 + jncb _skip + mov a, yi + dec a + mov yi, a + .endif +_skip: +.endm + +.macroicase ADD24HL_A pminitp_addsub24 + .if pminitp_addsub24 == 1 + inc hl + jnzb _skip + mov a, i + inc a + mov i, a + .elif pminitp_addsub24 >= 65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 <= -65536 + .error "Value is out-of-range, must be 16-bits" + .elif pminitp_addsub24 > 0 + add hl, pminitp_addsub24 + jncb _skip + mov a, i + inc a + mov i, a + .elif pminitp_addsub24 < 0 + sub y, -pminitp_addsub24 + jncb _skip + mov a, i + dec a + mov i, a + .endif +_skip: +.endm diff --git a/PVPokeMini/PokeMini/pokemini-code/pm_libs/pmrom_music.s b/PVPokeMini/PokeMini/pokemini-code/pm_libs/pmrom_music.s new file mode 100644 index 0000000000..081ecf27e6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/pm_libs/pmrom_music.s @@ -0,0 +1,988 @@ +; Copyright (C) 2015 by JustBurn +; +; Permission is hereby granted, free of charge, to any person obtaining a copy +; of this software and associated documentation files (the "Software"), to deal +; in the Software without restriction, including without limitation the rights +; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +; copies of the Software, and to permit persons to whom the Software is +; furnished to do so, subject to the following conditions: +; +; The above copyright notice and this permission notice shall be included in +; all copies or substantial portions of the Software. +; +; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +; THE SOFTWARE. + +.if . < 0x2200 +.error "this file must be included after pm_header" +.endif + + ; PokeMini Music Player + ; + ; Timers used: + ; TIMER 2 to tick music + ; TIMER 3 for the sound + ; + ; Ctrl [Data...] + ; Bit 15 - Loop* + ; Bit 14 - Jump Pattern or End Sound* + ; Bit 13 - Set Pivot* + ; Bit 12 - Set Frequency* + ; Bit 11 - Write RAM* + ; Bit 10 - Set Volume + ; Bit 8~9 - Volume, 0 to 3 + ; Bit 0~7 - Wait time, 0 to 255 (0 = Immediate) + +.equ IRQ_MUSIC $000004 ; Same as IRQ_TMR2_HI + + ; Main Data +.ram pmmusram_aud_ena 1 ; &1 = BGM, &2 = SFX +.ram pmmusram_aud_cfg 1 + ; &128 = Unused + ; &64 = Unused + ; &32 = Jump pattern / End Sound + ; &16 = Write to RAM + ; &8 = Set Pivot + ; &4 = Set Frequency +.ram pmmusram_ram_ptr 2 ; RAM pointer +.ram pmmusram_bgm_ptb 3 ; BGM Absolute pattern address + + ; BGM Data +.ram pmmusram_bgm_wait 1 ; BGM wait num ticks +.ram pmmusram_bgm_mvol 1 ; BGM Master volume +.ram pmmusram_bgm_pvol 1 ; BGM Play volume +.ram pmmusram_bgm_ppr 3 ; BGM Absolute music pointer address +.ram pmmusram_bgm_frq 2 ; BGM Playing Frequency +.ram pmmusram_bgm_pvt 2 ; BGM Playing Pivot +.ram pmmusram_bgm_tvol 4 ; BGM volume table, &3 = Volume, &4 = SHR Pivot +.ram pmmusram_bgm_loop0 4 ; BGM Loop 0 (Ptr3, Num loops) +.ram pmmusram_bgm_loop1 4 ; BGM Loop 1 (Ptr3, Num loops) +.ram pmmusram_bgm_loop2 4 ; BGM Loop 2 (Ptr3, Num loops) +.ram pmmusram_bgm_loop3 4 ; BGM Loop 3 (Ptr3, Num loops) + + ; SFX Data +.ram pmmusram_sfx_wait 1 ; SFX Wait num ticks +.ram pmmusram_sfx_mvol 1 ; SFX Master volume +.ram pmmusram_sfx_pvol 1 ; SFX Play volume +.ram pmmusram_sfx_ppr 3 ; SFX Absolute music pointer address +.ram pmmusram_sfx_frq 2 ; SFX Playing Frequency +.ram pmmusram_sfx_pvt 2 ; SFX Playing Pivot +.ram pmmusram_sfx_tvol 4 ; SFX volume table, &3 = Volume, &4 = SHR Pivot +.ram pmmusram_sfx_loop0 4 ; SFX Loop 0 (Ptr3, Num loops) +.ram pmmusram_sfx_loop1 4 ; SFX Loop 1 (Ptr3, Num loops) +.ram pmmusram_sfx_loop2 4 ; SFX Loop 2 (Ptr3, Num loops) +.ram pmmusram_sfx_loop3 4 ; SFX Loop 3 (Ptr3, Num loops) + + ; (( Initialize tracker )) + ; BA = RAM Pointer + ; HL = Master time + ; No return +pmmusic_init: + push i + push ba + mov i, 0 + ; Set master time + mov [REG_BASE+TMR2_PRE], hl + ; Set RAM pointer + mov [pmmusram_ram_ptr], ba + ; Registers to zero + mov ba, 0 + mov [pmmusram_aud_ena], a + mov [pmmusram_bgm_frq], ba + mov [pmmusram_bgm_pvt], ba + mov [pmmusram_sfx_frq], ba + mov [pmmusram_sfx_pvt], ba + or [n+IRQ_PRI1], IRQ_PRI1_TMR2 + mov [n+AUD_VOL], a + mov [n+TMR2_OSC], a + mov [n+TMR2_SCALE], TMR_DIV_256 + mov [n+TMR3_OSC], a + mov [n+TMR3_SCALE], TMR_DIV_2 + mov [REG_BASE+TMR2_CTRL], ba + mov [REG_BASE+TMR3_PRE], ba + mov [REG_BASE+TMR3_PVT], ba + ; Registers to non-zero + mov a, 3 + mov b, [$14E2] + tst b, KEY_C + jnz :f + mov a, 0 +: call pmmusic_setvolbgm + call pmmusic_setvolsfx + mov ba, TMR_ENABLE | TMR_16BITS | TMR_PRESET + mov [REG_BASE+TMR3_CTRL], ba + or [n+TMR1_ENA_OSC], TMRS_OSC1 + pop ba + pop i + ret + + ; (( Set master time )) + ; HL = Master time + ; No return +pmmusic_setmastertime: + mov [REG_BASE+TMR2_PRE_L], l + mov [REG_BASE+TMR2_PRE_H], h + ret + + ; (( Get master time )) + ; No parameters + ; Return HL = Master time +pmmusic_getmastertime: + mov l, [REG_BASE+TMR2_PRE_L] + mov h, [REG_BASE+TMR2_PRE_H] + ret + + ; (( Set RAM pointer )) + ; HL = RAM Pointer + ; No return +pmmusic_setrampointer: + mov [pmmusram_ram_ptr], l + mov [pmmusram_ram_ptr+1], h + ret + + ; (( Get RAM pointer )) + ; No parameters + ; Return HL = RAM Pointer +pmmusic_getrampointer: + mov l, [pmmusram_ram_ptr] + mov h, [pmmusram_ram_ptr+1] + ret + + ; (( Set BGM master volume )) + ; A = Volume + ; No return +pmmusic_setvolbgm: + cmp a, 4 + jncb :f + pushx + push ba + push x + push y + mov yi, 0 + mov xi, 0 + mov [pmmusram_bgm_mvol], a + shl a + shl a + mov y, pmmusram_bgm_tvol + mov x, pmmusic_voltable + mov b, 0 + add x, ba + mov a, [x] + mov [y], a + mov a, [x+1] + mov [y+1], a + mov a, [x+2] + mov [y+2], a + mov a, [x+3] + mov [y+3], a + pop y + pop x + pop ba + popx +: ret + + ; (( Get BGM master volume )) + ; No parameters + ; Return A = Volume +pmmusic_getvolbgm: + mov a, [pmmusram_bgm_mvol] + ret + + ; (( Set SFX master volume )) + ; A = Volume + ; No return +pmmusic_setvolsfx: + cmp a, 4 + jncb :f + pushx + push ba + push x + push y + mov yi, 0 + mov xi, 0 + mov [pmmusram_sfx_mvol], a + shl a + shl a + mov y, pmmusram_sfx_tvol + mov x, pmmusic_voltable + mov b, 0 + add x, ba + mov a, [x] + mov [y], a + mov a, [x+1] + mov [y+1], a + mov a, [x+2] + mov [y+2], a + mov a, [x+3] + mov [y+3], a + pop y + pop x + pop ba + popx +: ret + + ; (( Get SFX master volume )) + ; No parameters + ; Return A = Volume +pmmusic_getvolsfx: + mov a, [pmmusram_sfx_mvol] + ret + + ; (( Play BGM )) + ; I+HL = BGM Address + ; No return +pmmusic_playbgm: + push f + push i + push ba + mov f, $C0 + ; Set pattern table + mov a, i + mov [pmmusram_bgm_ptb+2], a + mov [pmmusram_bgm_ptb+1], h + mov [pmmusram_bgm_ptb], l + ; Set BGM pointer + mov a, b + mov i, a + mov ba, [hl] + inc hl + inc hl + mov l, [hl] + mov i, 0 + mov [pmmusram_bgm_ppr], ba + mov [pmmusram_bgm_ppr+2], l + mov a, 1 + mov [pmmusram_bgm_wait], a + ; Enable BGM play + mov a, [pmmusram_aud_ena] + or a, $01 + mov [pmmusram_aud_ena], a + or [n+IRQ_ENA1], IRQ_ENA1_TMR2_HI + tst a, $02 + jnzb :f + mov ba, TMR_ENABLE | TMR_16BITS | TMR_PRESET + mov [REG_BASE+TMR2_CTRL], ba + mov ba, 0 + mov [REG_BASE+TMR3_PRE], ba + or [n+TMR3_CTRL], TMR_ENABLE | TMR_PRESET +: pop ba + pop i + pop f + ret + + ; (( Stop BGM )) + ; No parameters + ; No return +pmmusic_stopbgm: + push f + push ba + mov f, $C0 + ; Disable BGM play + mov a, $02 + and a, [pmmusram_aud_ena] + mov [pmmusram_aud_ena], a + jnzb :f + push i + mov i, 0 + and [n+IRQ_ENA1], ~IRQ_ENA1_TMR2_HI + and [n+TMR2_CTRL], ~TMR_ENABLE + and [n+TMR3_CTRL], ~TMR_ENABLE + pop i +: pop ba + pop f + ret + + ; (( Is playing BGM? )) + ; No parameters + ; Return F = Playing if Non-Zero + ; Return A = Playing is Non-Zero +pmmusic_isplayingbgm: + push i + mov i, 0 + mov a, $01 + and a, [pmmusram_aud_ena] + pop i + ret + + ; (( Play SFX )) + ; I+HL = SFX Address + ; No return +pmmusic_playsfx: + push f + push i + push ba + mov f, $C0 + ; Set SFX pointer + mov a, i + mov [pmmusram_sfx_ppr+2], a + mov [pmmusram_sfx_ppr+1], h + mov [pmmusram_sfx_ppr], l + mov a, 1 + mov [pmmusram_sfx_wait], a + mov i, 0 + ; Enable SFX play + mov i, 0 + mov a, $02 + or a, [pmmusram_aud_ena] + mov [pmmusram_aud_ena], a + or [n+IRQ_ENA1], IRQ_ENA1_TMR2_HI + mov ba, TMR_ENABLE | TMR_16BITS | TMR_PRESET + mov [REG_BASE+TMR2_CTRL], ba + ; Clear timer 3 preset + mov a, [pmmusram_sfx_mvol] + cmp a, 0 + jzb :f + mov ba, 0 + mov [REG_BASE+TMR3_PRE], ba + or [n+TMR3_CTRL], TMR_ENABLE | TMR_PRESET +: pop ba + pop i + pop f + ret + + ; (( Stop SFX )) + ; No parameters + ; No return +pmmusic_stopsfx: + push f + push ba + mov f, $C0 + ; Disable SFX play + mov a, $01 + and a, [pmmusram_aud_ena] + mov [pmmusram_aud_ena], a + jnzb :f + push i + mov i, 0 + and [n+IRQ_ENA1], ~IRQ_ENA1_TMR2_HI + and [n+TMR2_CTRL], ~TMR_ENABLE + and [n+TMR3_CTRL], ~TMR_ENABLE + pop i +: pop ba + pop f + ret + + ; (( Is playing SFX? )) + ; No parameters + ; Return F = Playing if Non-Zero + ; Return A = Playing is Non-Zero +pmmusic_isplayingsfx: + push i + mov i, 0 + mov a, $02 + and a, [pmmusram_aud_ena] + pop i + ret + + ; (( Process sound from interrupt )) + ; No parameters + ; No return +irq_tmr2_hi: + push ba + push hl + push x + push i + pushx + mov i, 0 + ; Process BGM +_checkBGM: + mov a, $01 + and a, [pmmusram_aud_ena] + jzw _checkSFX +_decwaitBGM: + ; Decrease BGM wait + mov hl, pmmusram_bgm_wait + dec [hl] + jnzw _checkSFX +_goBGM: + ; Read data from BGM pointer + mov x, [pmmusram_bgm_ppr] + mov a, [pmmusram_bgm_ppr+2] + mov xi, a + ; Set wait and volume + mov ba, [x] + mov [pmmusram_bgm_wait], a + mov [pmmusram_aud_cfg], b + tst b, $04 + jzb _BGMnovol + mov a, b + mov b, 0 + and a, $03 + mov hl, pmmusram_bgm_tvol + add hl, ba + mov a, [hl] + mov [pmmusram_bgm_pvol], a +_BGMnovol: + ; Increment BGM pointer to next command + mov b, 0 + mov a, [pmmusram_aud_cfg] + shr a + shr a + shr a + mov hl, pmmusic_cmdextableadd + add hl, ba + mov a, [hl] + mov hl, x + add hl, ba + mov [pmmusram_bgm_ppr], hl + jncb _bgm_noinc1 + mov hl, pmmusram_bgm_ppr+2 + inc [hl] +_bgm_noinc1: + ; --------- + ; Write RAM +_BGM_Cwriteram: + mov a, $08 + and a, [pmmusram_aud_cfg] + jzb _BGM_Csetfreq + inc x + inc x + jnzb _BGM_Rwriteram + mov a, xi + inc a + mov xi, a +_BGM_Rwriteram: + mov hl, [pmmusram_ram_ptr] + mov b, 0 + mov a, [x+1] + add hl, ba + mov [hl], [x] + ; ------------- + ; Set Frequency +_BGM_Csetfreq: + mov a, $10 + and a, [pmmusram_aud_cfg] + jzb _BGM_Csetpivot + inc x + inc x + jnzb _BGM_Rsetfreq + mov a, xi + inc a + mov xi, a +_BGM_Rsetfreq: + mov ba, [x] + mov [pmmusram_bgm_frq], ba + ; --------- + ; Set Pivot +_BGM_Csetpivot: + mov a, $20 + and a, [pmmusram_aud_cfg] + jzb _BGM_Cnextend + inc x + inc x + jnzb _BGM_Rsetpivot + mov a, xi + inc a + mov xi, a +_BGM_Rsetpivot: + mov ba, [x] + mov [pmmusram_bgm_pvt], ba + ; ------------------------ + ; Jump pattern / End Sound +_BGM_Cnextend: + mov a, $40 + and a, [pmmusram_aud_cfg] + jzb _BGM_Cloop + inc x + inc x + jnzb _BGM_Rnextend + mov a, xi + inc a + mov xi, a +_BGM_Rnextend: + mov ba, [x] + cmp ba, 0 + jnzb _BGM_Rpatt + call pmmusic_stopbgm + jmpb _BGM_Cloop +_BGM_Rpatt: + tst b, $80 + jnzb _BGM_Rpattsub + mov hl, [pmmusram_bgm_ptb] + add hl, ba + mov [pmmusram_bgm_ptb], hl + mov a, [pmmusram_bgm_ptb+2] + jncb _BGM_Rpatt_noinc1 + inc a + mov [pmmusram_bgm_ptb+2], a +_BGM_Rpatt_noinc1: + jmpb _BGM_Rpatt_set +_BGM_Rpattsub: + mov hl, [pmmusram_bgm_ptb] + add hl, ba + mov [pmmusram_bgm_ptb], hl + mov a, [pmmusram_bgm_ptb+2] + jcb _BGM_Rpatt_noinc2 + inc a + mov [pmmusram_bgm_ptb+2], a +_BGM_Rpatt_noinc2: +_BGM_Rpatt_set: + mov i, a + mov ba, [hl] + inc hl + inc hl + mov l, [hl] + mov i, 0 + mov [pmmusram_bgm_ppr], ba + mov [pmmusram_bgm_ppr+2], l + ; ---- + ; Loop +_BGM_Cloop: + mov a, $80 + and a, [pmmusram_aud_cfg] + jzb _BGM_Cdone + inc x + inc x + jnzb _BGM_Rloop + mov a, xi + inc a + mov xi, a +_BGM_Rloop: + mov hl, [x] + and h, $0C + cmp l, 0 + jnzb _BGM_Rloop_loop + ; Mark Loop + mov a, h + mov b, 0 + mov hl, pmmusram_bgm_loop0 + add hl, ba + mov ba, [pmmusram_bgm_ppr] + mov [hl], ba + inc hl + inc hl + mov a, [pmmusram_bgm_ppr+2] + mov [hl], a + inc hl + xor a, a + mov [hl], a + jmpb _BGM_Cdone +_BGM_Rloop_loop: + ; Loop back + mov a, h + mov b, 0 + mov hl, pmmusram_bgm_loop0+3 + add hl, ba + mov a, [x] + cmp a, [hl] + jzb _BGM_Cdone + inc [hl] + dec hl + mov a, [hl] + mov [pmmusram_bgm_ppr+2], a + dec hl + dec hl + mov ba, [hl] + mov [pmmusram_bgm_ppr], ba + ; --------- + ; All done! +_BGM_Cdone: + mov a, $FF + and a, [pmmusram_bgm_wait] + jzw _goBGM + ; Check SFX first as it have higher priority + mov a, [pmmusram_sfx_mvol] + cmp a, 0 + jzb _setBGMaudio + mov a, $02 + and a, [pmmusram_aud_ena] + jnzb _checkSFX + ; Set BGM audio +_setBGMaudio: + mov hl, [pmmusram_bgm_frq] + mov [REG_BASE+TMR3_PRE], hl + mov hl, [pmmusram_bgm_pvt] + mov a, [pmmusram_bgm_pvol] + tst a, $04 + jzb _BGM_noSHRpivot + mov ba, hl + shr b + rorc a + shr b + rorc a + shr b + rorc a + shr b + rorc a + shr b + rorc a + mov hl, ba + mov a, [pmmusram_bgm_pvol] +_BGM_noSHRpivot: + mov [REG_BASE+TMR3_PVT], hl + and a, $03 + mov [n+AUD_VOL], a + ; Process SFX +_checkSFX: + mov a, $02 + and a, [pmmusram_aud_ena] + jzw _goEND +_decwaitSFX: + ; Decrease SFX wait + mov hl, pmmusram_sfx_wait + dec [hl] + jnzw _goEND +_goSFX: + ; Read data from SFX pointer + mov x, [pmmusram_sfx_ppr] + mov a, [pmmusram_sfx_ppr+2] + mov xi, a + ; Set wait and volume + mov ba, [x] + mov [pmmusram_sfx_wait], a + mov [pmmusram_aud_cfg], b + tst b, $04 + jzb _SFXnovol + mov a, b + mov b, 0 + and a, $03 + mov hl, pmmusram_sfx_tvol + add hl, ba + mov a, [hl] + mov [pmmusram_sfx_pvol], a +_SFXnovol: + ; Increment SFX pointer to next command + mov b, 0 + mov a, [pmmusram_aud_cfg] + shr a + shr a + shr a + mov hl, pmmusic_cmdextableadd + add hl, ba + mov a, [hl] + mov hl, x + add hl, ba + mov [pmmusram_sfx_ppr], hl + jncb _sfx_noinc1 + mov hl, pmmusram_sfx_ppr+2 + inc [hl] +_sfx_noinc1: + ; --------- + ; Write RAM +_SFX_Cwriteram: + mov a, $08 + and a, [pmmusram_aud_cfg] + jzb _SFX_Csetfreq + inc x + inc x + jnzb _SFX_Rwriteram + mov a, xi + inc a + mov xi, a +_SFX_Rwriteram: + mov hl, [pmmusram_ram_ptr] + mov b, 0 + mov a, [x+1] + add hl, ba + mov [hl], [x] + ; ------------- + ; Set Frequency +_SFX_Csetfreq: + mov a, $10 + and a, [pmmusram_aud_cfg] + jzb _SFX_Csetpivot + inc x + inc x + jnzb _SFX_Rsetfreq + mov a, xi + inc a + mov xi, a +_SFX_Rsetfreq: + mov ba, [x] + mov [pmmusram_sfx_frq], ba + ; --------- + ; Set Pivot +_SFX_Csetpivot: + mov a, $20 + and a, [pmmusram_aud_cfg] + jzb _SFX_Cnextend + inc x + inc x + jnzb _SFX_Rsetpivot + mov a, xi + inc a + mov xi, a +_SFX_Rsetpivot: + mov ba, [x] + mov [pmmusram_sfx_pvt], ba + ; ------------------------ + ; Jump pattern / End Sound +_SFX_Cnextend: + mov a, $40 + and a, [pmmusram_aud_cfg] + jzb _SFX_Cloop + inc x + inc x + jnzb _SFX_Rnextend + mov a, xi + inc a + mov xi, a +_SFX_Rnextend: + call pmmusic_stopsfx + ; ---- + ; Loop +_SFX_Cloop: + mov a, $80 + and a, [pmmusram_aud_cfg] + jzb _SFX_Cdone + inc x + inc x + jnzb _SFX_Rloop + mov a, xi + inc a + mov xi, a +_SFX_Rloop: + mov hl, [x] + and h, $0C + cmp l, 0 + jnzb _SFX_Rloop_loop + ; Mark Loop + mov a, h + mov b, 0 + mov hl, pmmusram_sfx_loop0 + add hl, ba + mov ba, [pmmusram_sfx_ppr] + mov [hl], ba + inc hl + inc hl + mov a, [pmmusram_sfx_ppr+2] + mov [hl], a + inc hl + xor a, a + mov [hl], a + jmpb _SFX_Cdone +_SFX_Rloop_loop: + ; Loop back + mov a, h + mov b, 0 + mov hl, pmmusram_sfx_loop0+3 + add hl, ba + mov a, [x] + cmp a, [hl] + jzb _SFX_Cdone + inc [hl] + dec hl + mov a, [hl] + mov [pmmusram_sfx_ppr+2], a + dec hl + dec hl + mov ba, [hl] + mov [pmmusram_sfx_ppr], ba + ; --------- + ; All done! +_SFX_Cdone: + mov a, $FF + and a, [pmmusram_sfx_wait] + jzw _goSFX + ; Set SFX audio + mov a, [pmmusram_sfx_mvol] + cmp a, 0 + jzb _goEND +_setSFXaudio: + mov hl, [pmmusram_sfx_frq] + mov [REG_BASE+TMR3_PRE], hl + mov hl, [pmmusram_sfx_pvt] + mov a, [pmmusram_sfx_pvol] + tst a, $04 + jzb _SFX_noSHRpivot + mov ba, hl + shr b + rorc a + shr b + rorc a + shr b + rorc a + shr b + rorc a + shr b + rorc a + mov hl, ba + mov a, [pmmusram_sfx_pvol] +_SFX_noSHRpivot: + mov [REG_BASE+TMR3_PVT], hl + and a, $03 + mov [n+AUD_VOL], a +_goEND: + popx + pop i + pop x + pop hl + pop ba + mov [n+IRQ_ACT1], $20 + reti + +pmmusic_voltable: + .db $00, $00, $00, $00 + .db $00, $00, $06, $06 + .db $00, $06, $02, $02 + .db $00, $06, $02, $03 + +pmmusic_cmdextableadd: + .db 2, 4, 4, 6, 4, 6, 6, 8, 4, 6, 6, 8, 6, 8, 8, 10 + .db 4, 6, 6, 8, 6, 8, 8, 10, 6, 8, 8, 10, 8, 10, 10, 12 + + + ; Macros + +.equ N____ -1 + +.equ N_C_1 $EEE3 ; 32.70 Hz +.equ N_CS1 $E17A ; 34.65 Hz +.equ N_D_1 $D4D2 ; 36.71 Hz +.equ N_DS1 $C8E0 ; 38.89 Hz +.equ N_E_1 $BD9A ; 41.20 Hz +.equ N_F_1 $B2F6 ; 43.65 Hz +.equ N_FS1 $A8EA ; 46.25 Hz +.equ N_G_1 $9F6F ; 49.00 Hz +.equ N_GS1 $967C ; 51.91 Hz +.equ N_A_1 $8E0A ; 55.00 Hz +.equ N_AS1 $8611 ; 58.27 Hz +.equ N_B_1 $7E8B ; 61.74 Hz + +.equ N_C_2 $7771 ; 65.41 Hz +.equ N_CS2 $70BC ; 69.30 Hz +.equ N_D_2 $6A68 ; 73.42 Hz +.equ N_DS2 $646F ; 77.78 Hz +.equ N_E_2 $5ECC ; 82.41 Hz +.equ N_F_2 $597A ; 87.31 Hz +.equ N_FS2 $5474 ; 92.50 Hz +.equ N_G_2 $4FB7 ; 98.00 Hz +.equ N_GS2 $4B3D ; 103.83 Hz +.equ N_A_2 $4704 ; 110.00 Hz +.equ N_AS2 $4308 ; 116.54 Hz +.equ N_B_2 $3F45 ; 123.47 Hz + +.equ N_C_3 $3BB8 ; 130.81 Hz +.equ N_CS3 $385D ; 138.59 Hz +.equ N_D_3 $3533 ; 146.83 Hz +.equ N_DS3 $3237 ; 155.56 Hz +.equ N_E_3 $2F65 ; 164.81 Hz +.equ N_F_3 $2CBC ; 174.61 Hz +.equ N_FS3 $2A39 ; 185.00 Hz +.equ N_G_3 $27DB ; 196.00 Hz +.equ N_GS3 $259E ; 207.65 Hz +.equ N_A_3 $2381 ; 220.00 Hz +.equ N_AS3 $2183 ; 233.08 Hz +.equ N_B_3 $1FA2 ; 246.94 Hz + +.equ N_C_4 $1DDB ; 261.63 Hz +.equ N_CS4 $1C2E ; 277.18 Hz +.equ N_D_4 $1A99 ; 293.66 Hz +.equ N_DS4 $191B ; 311.13 Hz +.equ N_E_4 $17B2 ; 329.63 Hz +.equ N_F_4 $165D ; 349.23 Hz +.equ N_FS4 $151C ; 369.99 Hz +.equ N_G_4 $13ED ; 392.00 Hz +.equ N_GS4 $12CE ; 415.30 Hz +.equ N_A_4 $11C0 ; 440.00 Hz +.equ N_AS4 $10C1 ; 466.16 Hz +.equ N_B_4 $0FD0 ; 493.88 Hz + +.equ N_C_5 $0EED ; 523.25 Hz +.equ N_CS5 $0E16 ; 554.37 Hz +.equ N_D_5 $0D4C ; 587.33 Hz +.equ N_DS5 $0C8D ; 622.25 Hz +.equ N_E_5 $0BD8 ; 659.26 Hz +.equ N_F_5 $0B2E ; 698.46 Hz +.equ N_FS5 $0A8D ; 739.99 Hz +.equ N_G_5 $09F6 ; 783.99 Hz +.equ N_GS5 $0966 ; 830.61 Hz +.equ N_A_5 $08DF ; 880.00 Hz +.equ N_AS5 $0860 ; 932.33 Hz +.equ N_B_5 $07E7 ; 987.77 Hz + +.equ N_C_6 $0776 ; 1046.50 Hz +.equ N_CS6 $070A ; 1108.73 Hz +.equ N_D_6 $06A5 ; 1174.66 Hz +.equ N_DS6 $0646 ; 1244.51 Hz +.equ N_E_6 $05EB ; 1318.51 Hz +.equ N_F_6 $0596 ; 1396.91 Hz +.equ N_FS6 $0546 ; 1479.98 Hz +.equ N_G_6 $04FA ; 1567.98 Hz +.equ N_GS6 $04B2 ; 1661.22 Hz +.equ N_A_6 $046F ; 1760.00 Hz +.equ N_AS6 $042F ; 1864.66 Hz +.equ N_B_6 $03F3 ; 1975.53 Hz + +.equ N_C_7 $03BA ; 2093.00 Hz +.equ N_CS7 $0384 ; 2217.46 Hz +.equ N_D_7 $0352 ; 2349.32 Hz +.equ N_DS7 $0322 ; 2489.02 Hz +.equ N_E_7 $02F5 ; 2637.02 Hz +.equ N_F_7 $02CA ; 2793.83 Hz +.equ N_FS7 $02A2 ; 2959.96 Hz +.equ N_G_7 $027C ; 3135.96 Hz +.equ N_GS7 $0258 ; 3322.44 Hz +.equ N_A_7 $0237 ; 3520.00 Hz +.equ N_AS7 $0217 ; 3729.31 Hz +.equ N_B_7 $01F9 ; 3951.07 Hz + +.macroicase PMMUSIC_ALIGN + .align 2 +.endm + +.macroicase PMMUSIC_PATTERN pataddr + .dw pataddr & 0xFFFF, pataddr >> 16 +.endm + +.macroicase PMMUSIC_ROW note_id, pwm_amt, volume, wait_amt + .if (note_id >= 0) && (pwm_amt >= 0) && (volume >= 0) + .dw $3400 | (volume << 8) | (wait_amt & 255) + .dw note_id + .dw (note_id * pwm_amt / 256) + .elif (note_id >= 0) && (pwm_amt >= 0) + .dw $3000 | (wait_amt & 255) + .dw note_id + .dw (note_id * pwm_amt / 256) + .elif (pwm_amt >= 0) && (volume >= 0) + .dw $2400 | (volume << 8) | (wait_amt & 255) + .dw (note_id * pwm_amt / 256) + .elif (pwm_amt >= 0) + .dw $2000 | (wait_amt & 255) + .dw (note_id * pwm_amt / 256) + .elif (note_id >= 0) && (volume >= 0) + .dw $1400 | (volume << 8) | (wait_amt & 255) + .dw note_id + .elif (note_id >= 0) + .dw $1000 | (wait_amt & 255) + .dw note_id + .elif (volume >= 0) + .dw $0400 | (volume << 8) | (wait_amt & 255) + .else + .dw $0000 | (wait_amt & 255) + .endif +.endm + +.macroicase PMMUSIC_WRITERAM address, value + .dw $0800 + .db value, address +.endm + +.macroicase PMMUSIC_MARK loop_id + .dw $8000 + .db 0, (loop_id << 2) +.endm + +.macroicase PMMUSIC_LOOP loop_id, loop_num + .if (loop_num >= 0) + .dw $8000 + .db loop_num, (loop_id << 2) + .endif +.endm + +.macroicase PMMUSIC_NEXT + .dw $4000, $0004 +.endm + +.macroicase PMMUSIC_GOBACK patt + .dw $4000, -(patt * 4) +.endm + +.macroicase PMMUSIC_END + .dw $4401, $0000 +.endm diff --git a/PVPokeMini/PokeMini/pokemini-code/pm_libs/readme.txt b/PVPokeMini/PokeMini/pokemini-code/pm_libs/readme.txt new file mode 100644 index 0000000000..bacf52a223 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/pm_libs/readme.txt @@ -0,0 +1,52 @@ + ___ _ _ + | _ \ | \_/ | + | _/ | _ | + | | | | | | + |_| OKE |_| |_| INI + Pokmon-Mini Library + ------------------- + + Download lastest version in: + http://sourceforge.net/projects/pokemini/ + + For hardware documentation, visit: + http://wiki.sublab.net/index.php/Pokemon_Mini + + For all Pokmon-Mini needs: + http://www.pokemon-mini.net/ + +> Libraries + +** pm_init ** +************* + Initialize Pokemon-Mini and provide common declarations + +** pm_music ** +************** + Background Music (BGM) and sound effects (SFX) playback + +Check 'PokeMini Debugger' documentation for information of how to use + +You're free to use, modify and distribute the source of any library + +> License MIT (libraries): + +Copyright (C) 2015 by JustBurn + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/PVPokeMini/PokeMini/pokemini-code/readme.txt b/PVPokeMini/PokeMini/pokemini-code/readme.txt new file mode 100644 index 0000000000..78f092bb04 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/readme.txt @@ -0,0 +1,204 @@ + ___ _ _ + | _ \ | \_/ | + | _/ | _ | + | | | | | | + |_| OKE |_| |_| INI + ------------------- + Version 0.60 + + Homebrew-emulator for Pokmon-Mini! + + Latest version can be found in: + http://pokemini.sourceforge.net/ + + For hardware documentation, visit: + http://wiki.sublab.net/index.php/Pokemon_Mini + +> Keys & Information: + + To include real BIOS, place "bios.min" on the emulator's directory. + When no "bios.min" is present, emulator will use Pokmon-Mini FreeBIOS. + + Pokmon-Mini PC Keys + ---------------------------- + D-PAD Left Arrow Left + D-PAD Right Arrow Right + D-PAD Up Arrow Up + D-PAD Down Arrow Down + Key A Keyboard X + Key B Keyboard Z + Key C Keyboard S or C + Power Button Keyboard E + Shock Detector Keyboard A + ---------------------------- + UI Menu Keyboard Esc + + F9 will capture the screen and save as "snap_(sequence number).bmp" + + F10 can toggle between Fullscreen and Windowed. + + F11 will disable/enable speed throttle + + TAB can be hold to temporary disable speed throttle + +> Supported multicarts: + + Type 0 - Disabled (Commercial, Prototype) + Read only + + Type 1 - Normal 512KB Flash (AM29LV040B) + Read, Erase, Write, Banking and Manufacturer ID + + Type 2 - Lupin's 512KB Flash (AM29LV040B) + Read, Erase, Write, Banking and Manufacturer ID + +> Command-Line: + + Usage: + PokeMini [Options] rom.min + + Options: + -freebios Force FreeBIOS + -bios otherbios.min Load BIOS + -noeeprom Discard EEPROM data + -eeprom pokemini.eep Load/Save EEPROM file + -eepromshare Share EEPROM to all ROMs (default) + -noeepromshare Each ROM will use individual EEPROM + -nostate Discard State data (default) + -state pokemini.sta Load/Save state file + -nortc No RTC + -statertc RTC time difference in savestates + -hostrtc RTC match the Host clock (def) + -nosound Disable sound + -sound Same as -soundpiezo (def) + -sounddirect Use timer 3 directly for sound (default) + -soundemulate Use sound circuit emulation + -sounddirectpwm Same as direct, can play PWM samples + -nopiezo Disable piezo speaker filter + -piezo Enable piezo speaker filter (def) + -scanline 50% Scanline LCD filter + -dotmatrix LCD dot-matrix filter (def) + -nofilter No LCD filter + -2shades LCD Mode: No mixing + -3shades LCD Mode: Grey emulation + -analog LCD Mode: Pretend real LCD (default) + -fullbattery Emulate with a full battery (default) + -lowbattery Emulate with a weak battery + -palette n Select palette for colors (0 to 15) + -rumblelvl 3 Rumble level (0 to 3) + -nojoystick Disable joystick (def) + -joystick Enable joystick + -joyid 0 Set joystick ID + -custom1light 0xFFFFFF Palette Custom 1 Light + -custom1dark 0x000000 Palette Custom 1 Dark + -custom2light 0xFFFFFF Palette Custom 2 Light + -custom2dark 0x000000 Palette Custom 2 Dark + -synccycles 8 Number of cycles per hardware sync. + -multicart 0 Multicart type (0 to 2) + -lcdcontrast 64 LCD contrast boost in percent + -lcdbright 0 LCD brightness offset in percent + + Only on SDL platform: + -dumpsound sound.wav Dump sound into a WAV file + -windowed Display in window (default) + -fullscreen Display in fullscreen + -zoom n Zoom display: 1 to 4 (def 4) + -bpp n Bits-Per-Pixel: 16 or 32 (def 16) + + Only on Debugger platform: + -autorun 0 Autorun, 0=Off, 1=Full, 2=Dbg+Snd, 3=Dbg + -windowed Display in window (default) + -fullscreen Display in fullscreen + -zoom n Zoom display: 1 to 4 (def 4) + -bpp n Bits-Per-Pixel: 16 or 32 (def 16) + + +> System requirements: + + No sound: + Pentium III 733 Mhz or better recommended. + + With sound: + Pentium IV 1.7 Ghz or better recommended. + + Note: Performance tests were based on 0.4.0 version + +> History: + + -: 0.60 Changes :- + Changed version format to only 2 fields to avoid confusion + Fixed RTC month being reported wrong from host + Adjusted graphics, now it display darker shades to match more closely the real system + Added 2 new options: LCD contrast and LCD bright + Changed the way analog LCD mode works, now it's less blurry and can do up to 5 shades without artifacts + SDL port has been upgraded to SDL 2, this brings Haptic support and other improvements + New Keyboard/Joystick option to allow checking inputs + Applying joystick settings now can (re)enable the device + Share EEPROM is now disabled by default + Emulator can be compiled for 64-bit CPU without issues now + Limited sync-cycles to 64 on 'accurancy' platforms + Win32 Only: + Corrected Direct3D issue in some GPUs + Sound write position is now handled correctly + NDS Only: Added 3-in-1 rumble support + PSP Only: + Analog stick now works + Added FPS display under Platform... (default is off) + Reached 100% emulation by skipping 1 frame, aparently hardware is limited to 60fps max + Dreamcast Only: + Improved sound latency (thanks BlueCrab). + Added FPS display under Platform... (default is off) + Debugger Only: + Minor fixes + Trace history is now 10000 instructions instead of 256 + Added copy & paste buttons to timing counters + + Older History can be found at: + http://sourceforge.net/p/pokemini/wiki/History/ + +> License GPLv3 (emulator and tools): + +PokeMini - Pokmon-Mini Emulator +Copyright (C) 2015 JustBurn + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +> Greetings & Links: + + Thank's to p0p, Dave|X, Onori + goldmomo, asterick, DarkFader, Agilo + MrBlinky, Wa, Lupin and everyone at + #pmdev on IRC EFNET! + Questions and Bugs reports are welcome! + + PokeMini webpage: + https://sourceforge.net/projects/pokemini/ + + Pokemon-Mini Hardware: + http://wiki.sublab.net/index.php/Pokemon_Mini + + Pokmon-mini.net: + http://www.pokemon-mini.net/ + + MEGA - Museum of Electronic Games & Art: + http://m-e-g-a.org/ + + Minimon (other Pokemon-Mini emulator): + http://www.sublab.net/projects/minimon/ + + DarkFader Pokemon-Mini webpage: + http://darkfader.net/pm/ + + Agilo's Weblog: + http://www.agilo.nl/ diff --git a/PVPokeMini/PokeMini/pokemini-code/readme_portable.txt b/PVPokeMini/PokeMini/pokemini-code/readme_portable.txt new file mode 100644 index 0000000000..cf83186581 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/readme_portable.txt @@ -0,0 +1,202 @@ + ___ _ _ + | _ \ | \_/ | + | _/ | _ | + | | | | | | + |_| OKE |_| |_| INI + ------------------- + Version 0.60 + + Homebrew-emulator for Pokmon-Mini! + + For hardware documentation, visit: + http://wiki.sublab.net/index.php/Pokemon_Mini + + This information apply to handhelds or video game consoles. + +> Keys & Information: + + ( NDS - Nintendo DS ) + + Pokmon-Mini NDS Keys + ---------------------------- + D-PAD Left D-PAD Left + D-PAD Right D-PAD Right + D-PAD Up D-PAD Up + D-PAD Down D-PAD Down + Key A Key A + Key B Key B + Key C Shoulder R + Shock Detector Shoulder L + Power Button Start + ---------------------------- + UI Menu Select + + ( PSP - PlayStation Portable ) + + Pokmon-Mini PSP Keys + ---------------------------- + D-PAD Left D-PAD Left + D-PAD Right D-PAD Right + D-PAD Up D-PAD Up + D-PAD Down D-PAD Down + Key A Circle + Key B Cross + Key C Shoulder R + Shock Detector Shoulder L + Power Button Start + ---------------------------- + UI Menu Select + + ( DC - Dreamcast ) + + Pokmon-Mini DC Keys + ---------------------------- + D-PAD Left D-PAD Left or Joystick + D-PAD Right D-PAD Right or Joystick + D-PAD Up D-PAD Up or Joystick + D-PAD Down D-PAD Down or Joystick + Key A Key B + Key B Key A + Key C Shoulder R + Shock Detector Shoulder L + Power Button Start + ---------------------------- + UI Menu Key X + + ( WIZ - GP2x Wiz ) + + Pokmon-Mini Wiz Keys + ---------------------------- + D-PAD Left D-PAD Left + D-PAD Right D-PAD Right + D-PAD Up D-PAD Up + D-PAD Down D-PAD Down + Key A Key B + Key B Key X + Key C Shoulder R + Shock Detector Shoulder L + Power Button Select + ---------------------------- + UI Menu Menu + + ( DINGUX - Dingoo in Linux ) + + Pokmon-Mini Dingoo Keys + ---------------------------- + D-PAD Left D-PAD Left + D-PAD Right D-PAD Right + D-PAD Up D-PAD Up + D-PAD Down D-PAD Down + Key A Key A + Key B Key B + Key C Shoulder R + Shock Detector Shoulder L + Power Button Start + ---------------------------- + UI Menu Select + + ( GAMECUBE - Nintendo GameCube ) + + Pokmon-Mini Wiz Keys + ---------------------------- + D-PAD Left D-PAD Left + D-PAD Right D-PAD Right + D-PAD Up D-PAD Up + D-PAD Down D-PAD Down + Key A Key A + Key B Key B + Key C Trigger R + Shock Detector Trigger L + Power Button Key Y + ---------------------------- + UI Menu Menu + + ( WII - Nintendo Wii ) + + Pokmon-Mini Wiz Keys + ---------------------------- + D-PAD Left Mote Left + D-PAD Right Mote Right + D-PAD Up Mote Up + D-PAD Down Mote Down + Key A Mote A + Key B Mote B + Key C Mote + + Shock Detector Mote - + Power Button Mote 2 + ---------------------------- + UI Menu Mote 1 + +> History: + + -: 0.60 Changes :- + Changed version format to only 2 fields to avoid confusion + Fixed RTC month being reported wrong from host + Adjusted graphics, now it display darker shades to match more closely the real system + Added 2 new options: LCD contrast and LCD bright + Changed the way analog LCD mode works, now it's less blurry and can do up to 5 shades without artifacts + SDL port has been upgraded to SDL 2, this brings Haptic support and other improvements + New Keyboard/Joystick option to allow checking inputs + Applying joystick settings now can (re)enable the device + Share EEPROM is now disabled by default + Emulator can be compiled for 64-bit CPU without issues now + Limited sync-cycles to 64 on 'accurancy' platforms + Win32 Only: + Corrected Direct3D issue in some GPUs + Sound write position is now handled correctly + NDS Only: Added 3-in-1 rumble support + PSP Only: Analog stick now works + Debugger Only: + Minor fixes + Trace history is now 10000 instructions instead of 256 + Added copy & paste buttons to timing counters + + Older History can be found at: + http://sourceforge.net/p/pokemini/wiki/History/ + +> License GPLv3 (emulator and tools): + +PokeMini - Pokmon-Mini Emulator +Copyright (C) 2015 JustBurn + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +> Greetings & Links: + + Thank's to p0p, Dave|X, Onori + goldmomo, asterick, DarkFader, Agilo + MrBlinky, Wa, Lupin and everyone at + #pmdev on IRC EFNET! + Questions and Bugs reports are welcome! + + PokeMini webpage: + https://sourceforge.net/projects/pokemini/ + + Pokemon-Mini Hardware: + http://wiki.sublab.net/index.php/Pokemon_Mini + + Pokmon-mini.net: + http://www.pokemon-mini.net/ + + MEGA - Museum of Electronic Games & Art: + http://m-e-g-a.org/ + + Minimon (other Pokemon-Mini emulator): + http://www.sublab.net/projects/minimon/ + + DarkFader Pokemon-Mini webpage: + http://darkfader.net/pm/ + + Agilo's Weblog: + http://www.agilo.nl/ diff --git a/PVPokeMini/PokeMini/pokemini-code/readme_source.txt b/PVPokeMini/PokeMini/pokemini-code/readme_source.txt new file mode 100644 index 0000000000..8036104133 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/readme_source.txt @@ -0,0 +1,109 @@ + ___ _ _ + | _ \ | \_/ | + | _/ | _ | + | | | | | | + |_| OKE |_| |_| INI + ------------------- + Version 0.60 + + Homebrew-emulator for Pokmon-Mini! + + Latest version can be found in: + http://pokemini.sourceforge.net/ + + For hardware documentation, visit: + http://wiki.sublab.net/index.php/Pokemon_Mini + + Please read "readme.txt" for emulator information. + +> Compiling PokeMini Source-Code: + + For big-endian platforms use _BIG_ENDIAN define + + Debugger + GCC compiler, SDL libs and GTK+ libs are required + Go to "platform/debug" + Do "make clean" and "make", use "make win" on Windows OS + + SDL + GCC compiler and SDL libs are required + Go to "platform/pc" + Do "make clean" and "make", use "make win" on Windows OS + + Win32 + Visual Studio 2005 or later is required + DirectX SDK is required* + Go to "platform/win32" + Double click "PokeMini.sln" + *Note: + June 2010 or later you will need to disable the DirectDraw driver, + to disable define "NO_DIRECTDRAW" under "Preprocessor Definitions" + + NDS + devkitPro is required + Go to "platform/nds" + Do "make clean" and "make" + + PSP + devkitPro or PSP Toolchain are required + Go to "platform/psp" + Do "make clean" and "make" + + Dreamcast + DevKitDC is required + Go to "platform/dreamcast" + Do "make clean" and "make" + + GameCube + devkitPro is required + This is an experimental platform and was never tested! + Go to "platform/gamecube" + Do "make clean" and "make" + + Wii + devkitPro is required + This is an experimental platform and was never tested! + Go to "platform/wii" + Do "make clean" and "make" + + GP2X Wiz (uWIZ lib) + Toolchain for wiz is required + libuwiz is required + Go to "platform/uwiz" + Modify OPENWIZ and HOST on "Makefile" to match your toolkit + Do "make clean" and "make" + + GP2X Wiz (SDL lib) + Toolchain for wiz is required + Go to "platform/wizsdl" + Modify OPENWIZ and HOST on "Makefile" to match your toolkit + Do "make clean" and "make" + + Dingux + Dingux toolkit is required + Go to "platform/dingux" + Modify DINGUX_TK and HOST on "Makefile" to match your toolkit + Do "make clean" and "make" + +> Compiling Tools Source-Code: + + BIN2C + GCC compiler is required + Go to "tools/bin2c" + Do "make clean" and "make" + + PMAS (Assembler) - Maintained by DarkFader + GCC compiler is required + Download PMAS from http://sourceforge.net/projects/pmas/ + Deploy package into "tools/pmas" and go there + Do "make clean" and "make" + + FreeBIOS + PMAS and BIN2C are required + Go to "freebios" + Do "make clean" and "make" + + Color Mapper + GCC compiler and GTK+ libs are required + Go to "tools/color_mapper" + Do "make clean" and "make", use "make win" on Windows OS diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/Icon_Min1_48.ico b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_Min1_48.ico new file mode 100644 index 0000000000..42350fae39 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_Min1_48.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/Icon_Min2_48.ico b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_Min2_48.ico new file mode 100644 index 0000000000..b61199638a Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_Min2_48.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/Icon_PkBl_48.ico b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_PkBl_48.ico new file mode 100644 index 0000000000..d3bea24ef9 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_PkBl_48.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/Icon_PkGn_48.ico b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_PkGn_48.ico new file mode 100644 index 0000000000..36ef61797d Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/Icon_PkGn_48.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/Min1Cartridge.ico b/PVPokeMini/PokeMini/pokemini-code/resource/Min1Cartridge.ico new file mode 100644 index 0000000000..4caba02443 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/Min1Cartridge.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/Min2Cartridge.ico b/PVPokeMini/PokeMini/pokemini-code/resource/Min2Cartridge.ico new file mode 100644 index 0000000000..36ef7257ad Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/Min2Cartridge.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeDebug.ico b/PVPokeMini/PokeMini/pokemini-code/resource/PokeDebug.ico new file mode 100644 index 0000000000..9f50c7a157 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/PokeDebug.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini.ico b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini.ico new file mode 100644 index 0000000000..f4a95c9c73 Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini.rc b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini.rc new file mode 100644 index 0000000000..5cb07343f4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini.rc @@ -0,0 +1,48 @@ +#ifndef IDI_ICON1 +#ifdef DEBUGGER +IDI_ICON1 ICON "Icon_PkGn_48.ico" +#else +IDI_ICON1 ICON "Icon_PkBl_48.ico" +#endif +IDI_ICON2 ICON "Icon_Min1_48.ico" +IDI_ICON3 ICON "Icon_Min2_48.ico" +#endif + +#ifndef VERSIONINFO +#include +#endif +#include "PokeMini_version.h" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION RES_VERSION +PRODUCTVERSION RES_VERSION +FILEFLAGSMASK 0x3FL +#ifdef _DEBUG +FILEFLAGS 0x1L +#else +FILEFLAGS 0x0L +#endif +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "A Pokmon-Mini Emulator\r\nhttp://pokemini.sourceforge.net/\r\nhttp://www.pokemon-mini.net/" + VALUE "CompanyName", "JustBurn, Team Pokeme" + VALUE "FileDescription", "Portable Pokmon Mini Emulator" + VALUE "FileVersion", RES_VERSION_STR + VALUE "InternalName", "PokeMini" + VALUE "LegalCopyright", RES_COPYRIGHT + VALUE "OriginalFilename", "PokeMini.exe" + VALUE "ProductName", "PokeMini Emulator" + VALUE "ProductVersion", RES_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG2.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG2.c new file mode 100644 index 0000000000..31015c4fb9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG2.c @@ -0,0 +1,820 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_BG2[] = { + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x85,0x21,0x37, + 0x88,0x88,0x88,0x88,0x10,0x01,0x88,0x88,0x88,0x88,0x84,0x11,0x14,0x62,0x11,0x43, + 0x12,0x68,0x88,0x88,0x86,0x21,0x38,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00, + 0x01,0x33,0x33,0x30,0x00,0x00,0x03,0x33,0x33,0x33,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x02,0x33,0x33,0x20,0x00,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x00,0x12,0x10, + 0x00,0x31,0x11,0x30,0x08,0x80,0x01,0x13,0x11,0x13,0x00,0x22,0x30,0x01,0x22,0x00, + 0x41,0x00,0x13,0x12,0x00,0x14,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x09,0xFF,0xFF, + 0x10,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x0F,0xFF,0x11, + 0xF9,0x00,0x00,0x00,0x00,0xEE,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x30,0x0F,0xF5,0xEF, + 0x90,0x00,0x11,0x00,0x1F,0xF0,0x11,0x00,0x01,0x10,0x02,0xFF,0xF1,0x2F,0xFF,0x00, + 0x41,0x01,0x00,0x10,0x00,0x22,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x1F,0xF0,0x9F, + 0xF0,0x9F,0xFF,0x70,0x2F,0x84,0xFF,0x15,0xFF,0xF8,0x05,0xFF,0xF1,0xEF,0xFF,0x08, + 0xF2,0x2F,0xCC,0xFE,0x02,0xF9,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x2F,0xFC,0xFF, + 0x78,0xFF,0xEF,0xF1,0x8F,0xCF,0xF1,0x2F,0xF7,0xFF,0x0C,0xF7,0xF5,0xF9,0xF9,0x0F, + 0xF1,0x5F,0xF9,0xFF,0x18,0xF5,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x5F,0xFF,0xF8, + 0x0F,0xF9,0x1F,0xF1,0xEF,0xFF,0x40,0x8F,0xFF,0xFE,0x0F,0xF2,0xFF,0xE4,0xF8,0x0F, + 0xF0,0x8F,0x51,0xFF,0x0C,0xF2,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x8F,0x51,0x00, + 0x1F,0xF2,0xCF,0xF1,0xFF,0xFF,0xC0,0xCF,0xC8,0x40,0x1F,0x82,0xFF,0x27,0xF2,0x1F, + 0xF0,0xFF,0x12,0xFE,0x0F,0xF1,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0xFF,0x10,0x00, + 0x0E,0xFF,0xFF,0x81,0xFF,0x1F,0xF1,0x7F,0xFC,0xF1,0x5F,0x22,0xFF,0x08,0xF2,0x2F, + 0x80,0xFF,0x05,0xF8,0x1F,0xF0,0x02,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x21,0x00,0xFF,0x00,0x20, + 0x01,0xEF,0xF5,0x02,0xF9,0x0C,0xF7,0x0C,0xFF,0x80,0xCF,0x11,0x82,0x0F,0xF1,0x8F, + 0x41,0xFF,0x08,0xF2,0x2F,0xC0,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x32, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x00,0x01,0x33, + 0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x75,0x43,0x32,0x23,0x32,0x22,0x33,0x32,0x23,0x32,0x23,0x33,0x32,0x23,0x32,0x22, + 0x22,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x23,0x22,0x22,0x22,0x22,0x23,0x33,0x33,0x34,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x86,0x44,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x22,0x11,0x11,0x11,0x11,0x11,0x11, + 0x12,0x21,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x11,0x11,0x21,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x21,0x12,0x22,0x22,0x11,0x11,0x11,0x11,0x12,0x32,0x22,0x33, + 0x33,0x33,0x33,0x32,0x23,0x33,0x33,0x33,0x44,0x43,0x33,0x44,0x44,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x87,0x46,0x55,0x55,0x55,0x55,0x45,0x44,0x44,0x45,0x54,0x44,0x44,0x45,0x44,0x44, + 0x43,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x11,0x11,0x11,0x13,0x54,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x54,0x56,0x66,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x98,0x68,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x63,0x23,0x33,0x23,0x23,0x22,0x23,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x33,0x43,0x33,0x34,0x44,0x43,0x33,0x43,0x33,0x33,0x23,0x44,0x33,0x33,0x33, + 0x33,0x43,0x33,0x33,0x33,0x44,0x44,0x44,0x44,0x32,0x22,0x22,0x25,0x66,0x77,0x76, + 0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x78,0x87,0x77,0x88,0x88,0x99,0x99, + 0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xA8,0x79,0x88,0x9A,0x98,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x87, + 0x73,0x33,0x33,0x33,0x33,0x33,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x44,0x44,0x54,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x45,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x33,0x33,0x36,0x87,0x88,0x88, + 0x87,0x88,0x78,0x88,0x87,0x78,0x88,0x99,0x99,0x99,0x99,0x88,0x9A,0xAB,0xCC,0xCC, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xC8,0x8B,0xAA,0xBB,0xA9,0xAB,0xA9,0x9A,0xA9,0x99,0x98,0x89,0x9A,0xAA,0x88,0x88, + 0x64,0x44,0x44,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x67,0x67,0x66,0x66,0x66,0x66, + 0x66,0x55,0x65,0x55,0x55,0x55,0x55,0x55,0x54,0x56,0x66,0x56,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x76,0x76,0x65,0x44,0x44,0x48,0x88,0x88,0x99, + 0x99,0x89,0x99,0x9A,0x99,0x9A,0xAB,0xBB,0xBA,0xBB,0xBB,0xA9,0x9B,0xBD,0xDE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xD8,0xAD,0xCC,0xCB,0xBB,0xCD,0xBB,0xBB,0xBB,0xA9,0xA9,0x9A,0xAB,0xCC,0xA8,0x89, + 0x54,0x44,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x65,0x56,0x56,0x66,0x65,0x56,0x67,0x77,0x77,0x76, + 0x76,0x76,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x69,0x89,0x99,0xA9, + 0xAA,0xA9,0x9A,0xAB,0xBA,0xAB,0xBC,0xCB,0xBC,0xCD,0xDD,0xDC,0xAA,0xCD,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xCD,0xDD,0xDD,0xCB,0xDD,0xDC,0xCB,0xCB,0xBB,0xCB,0x9A,0xAA,0xAB,0xA8,0x98, + 0x65,0x45,0x44,0x44,0x67,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x66,0x67,0x67,0x77,0x66,0x66,0x66,0x67,0x67,0x65,0x55,0x55,0x67,0x77,0x77,0x77, + 0x77,0x65,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44,0x7A,0x99,0x99,0x99, + 0xAB,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDB,0xCD,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xDD,0xDD,0xBC,0xCB,0xCB,0xCC,0xBC,0xCC,0xDD,0xDB,0xB9,0xA9,0xAA,0x99,0xA7, + 0x54,0x54,0x44,0x47,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x76,0x67,0x77,0x76,0x56,0x65,0x55,0x55,0x67,0x77,0x77,0x77, + 0x67,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x44,0x45,0x44,0x7A,0x99,0x9A,0x9A, + 0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xBC,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xED,0xDC,0xDC,0xBD,0xCD,0xCC,0xCC,0xCC,0xDC,0xDD,0xCA,0x99,0x99,0x89,0xA6, + 0x45,0x44,0x45,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x77,0x77,0x76,0x77,0x66,0x77,0x77,0x66,0x56,0x76,0x55,0x55,0x67,0x77,0x77,0x76, + 0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x55,0x45,0x44,0x45,0x88,0x99,0x99,0xAA, + 0xAB,0xBA,0xAA,0xAA,0xBA,0xAA,0xBC,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDB,0xCE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC9,0xEE,0xDD,0xCC,0xDD,0xDC,0xDC,0xDB,0xCC,0xCD,0xBD,0xCC,0xB9,0x99,0x99,0x85, + 0x54,0x44,0x57,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x67,0x77,0x77,0x66,0x66,0x67,0x76,0x55,0x66,0x56,0x65,0x56,0x77,0x77,0x77,0x76, + 0x66,0x77,0x77,0x77,0x77,0x77,0x76,0x75,0x44,0x44,0x45,0x46,0x99,0x89,0xA9,0xAB, + 0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xCD,0xDD,0xDD,0xCC,0xDD,0xDD,0xDC,0xBC,0xEE, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCA,0xEE,0xDC,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xBD,0xCB,0x99,0x9A,0x75, + 0x44,0x55,0x77,0x87,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x67, + 0x76,0x76,0x76,0x66,0x67,0x76,0x55,0x66,0x76,0x66,0x76,0x57,0x77,0x77,0x76,0x66, + 0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x44,0x44,0x47,0xA9,0x99,0xAB,0xBA, + 0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xCD,0xDD,0xDC,0xDC,0xCD,0xCD,0xDC,0xDB,0xCE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCA,0xEE,0xDD,0xDC,0xDC,0xDB,0xDC,0xDD,0xCC,0xCC,0xCB,0xCC,0xCD,0xA9,0xAA,0x75, + 0x44,0x45,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76, + 0x66,0x77,0x76,0x76,0x77,0x65,0x66,0x67,0x67,0x76,0x56,0x77,0x77,0x77,0x65,0x57, + 0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x45,0x44,0x45,0x58,0x98,0xAA,0xBA,0xBB, + 0xBA,0xBA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xCD,0xDC,0xBC,0xDD,0xDD,0xCC,0xBC, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xEE,0xDD,0xCD,0xDD,0xCD,0xCB,0xDB,0xDB,0xDC,0xCB,0xBB,0xCB,0xBB,0xCA,0x65, + 0x54,0x45,0x67,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76, + 0x66,0x66,0x77,0x67,0x76,0x56,0x67,0x56,0x76,0x55,0x57,0x77,0x77,0x66,0x65,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x44,0x45,0x44,0x69,0x89,0xAA,0xBB,0xBA, + 0xBB,0xAB,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0x99,0x9A,0xBB,0xBB,0xBC,0xDD,0xDC,0xBB, + 0xCE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB9,0xEE,0xED,0xDD,0xCD,0xBC,0xCC,0xCD,0xBD,0xBC,0xBC,0xBB,0xBB,0xBB,0xA9,0x54, + 0x44,0x54,0x57,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x76, + 0x77,0x76,0x55,0x67,0x65,0x66,0x56,0x76,0x55,0x55,0x77,0x76,0x67,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x44,0x79,0x9A,0xBA,0xBA,0xBB, + 0xAB,0xBB,0xBB,0xBB,0xAA,0x9A,0x99,0x9A,0x99,0x99,0x9A,0xBB,0xBB,0xCD,0xDD,0xCB, + 0xBD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB9,0xEE,0xED,0xDD,0xDD,0xDC,0xCB,0xCC,0xDC,0xDD,0xCB,0xBB,0xBB,0xBB,0xB9,0x55, + 0x54,0x44,0x45,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x67,0x66, + 0x77,0x66,0x77,0x76,0x57,0x77,0x65,0x66,0x55,0x67,0x77,0x76,0x56,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x75,0x54,0x44,0x46,0x74,0x44,0x55,0x8A,0xBA,0xAA,0xAB,0xAB, + 0xBB,0xBB,0xCC,0xBA,0xAA,0x99,0x9A,0x99,0x9A,0x99,0x99,0x9A,0xAB,0xBC,0xCD,0xCD, + 0xBC,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB8,0xEE,0xEE,0xDD,0xCC,0xCB,0xBC,0xDC,0xDD,0xCC,0xCB,0xBB,0xBB,0xAB,0xB8,0x54, + 0x44,0x54,0x45,0x57,0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x67,0x76,0x77,0x77,0x65, + 0x66,0x77,0x77,0x66,0x67,0x77,0x76,0x55,0x57,0x77,0x77,0x66,0x65,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x54,0x44,0x45,0x65,0x77,0x45,0x47,0xAA,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xBC,0xBB,0xBA,0xA9,0xA9,0xA9,0xAA,0x99,0x9A,0x99,0x99,0xAA,0xBB,0xCD,0xDC, + 0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB8,0xDE,0xEE,0xDD,0xDD,0xCB,0xBC,0xCD,0xDD,0xDD,0xCC,0xBB,0xAA,0xBB,0xC8,0x54, + 0x54,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x66,0x66,0x66,0x77,0x77, + 0x67,0x77,0x76,0x56,0x77,0x67,0x65,0x55,0x77,0x77,0x76,0x65,0x77,0x77,0x78,0x77, + 0x77,0x77,0x77,0x65,0x44,0x44,0x68,0x97,0x59,0x64,0x58,0xAB,0xBA,0xBA,0xBB,0xBB, + 0xCB,0xBB,0xBB,0xAA,0xA9,0x9A,0x9A,0xBA,0x9A,0x99,0xA9,0x99,0xAA,0xAB,0xBC,0xDD, + 0xDC,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC8,0xCE,0xEE,0xED,0xDD,0xBB,0xBB,0xCD,0xDC,0xDC,0xDB,0xBB,0xBA,0xAB,0xC8,0x55, + 0x44,0x54,0x54,0x45,0x67,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x67,0x75,0x67,0x77, + 0x76,0x77,0x66,0x55,0x67,0x66,0x55,0x67,0x77,0x76,0x76,0x57,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x44,0x44,0x44,0x88,0x58,0x74,0x44,0x7A,0xBB,0xBA,0xBB,0xBB,0xCC, + 0xCB,0xBB,0xAB,0xAA,0xA9,0xA9,0x99,0xAB,0xB9,0xA9,0x99,0x9A,0x9A,0xAA,0xBB,0xCD, + 0xDC,0xCB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC7,0xAE,0xEE,0xEE,0xDD,0xDB,0xBB,0xBC,0xDD,0xDC,0xDC,0xBB,0xBB,0xAB,0xB8,0x54, + 0x54,0x44,0x44,0x44,0x57,0x77,0x77,0x77,0x78,0x77,0x78,0x78,0x77,0x77,0x66,0x66, + 0x67,0x77,0x65,0x55,0x55,0x65,0x67,0x77,0x76,0x67,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x54,0x44,0x44,0x76,0x59,0x75,0x64,0x45,0x8B,0xBC,0xBB,0xBB,0xCC,0xDD, + 0xCB,0xBB,0xBB,0xBA,0xA9,0x99,0xAA,0x9A,0xCC,0xAA,0x9A,0x99,0x9A,0xAA,0xBB,0xBD, + 0xCD,0xCB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC8,0x9E,0xEE,0xEE,0xDD,0xDC,0xBB,0xAC,0xCC,0xDD,0xCD,0xBB,0xBA,0xBB,0xB8,0x54, + 0x44,0x54,0x44,0x54,0x45,0x77,0x77,0x78,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x77, + 0x67,0x77,0x75,0x55,0x55,0x67,0x77,0x77,0x66,0x56,0x77,0x77,0x87,0x78,0x77,0x87, + 0x77,0x75,0x44,0x54,0x67,0x57,0x76,0x75,0x45,0x57,0xBB,0xBA,0xBB,0xCC,0xDD,0xDD, + 0xDB,0xBB,0xBA,0xBA,0xA9,0x9A,0x99,0xA9,0xAB,0xBA,0xA9,0x99,0xAA,0xAA,0xAB,0xBC, + 0xDD,0xDC,0xBB,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB9,0x8D,0xEE,0xEE,0xED,0xDD,0xBA,0xAA,0xBD,0xCD,0xDC,0xBB,0xBB,0xAB,0xB8,0x55, + 0x54,0x44,0x44,0x44,0x44,0x57,0x78,0x77,0x78,0x77,0x77,0x87,0x78,0x77,0x87,0x87, + 0x77,0x77,0x76,0x56,0x77,0x77,0x77,0x76,0x56,0x76,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x54,0x44,0x47,0x89,0x75,0x85,0x44,0x44,0x68,0xBB,0xAA,0xBB,0xBD,0xED,0xED, + 0xDC,0xBB,0xAB,0xBA,0xA8,0x99,0xAA,0x9A,0xA9,0xAA,0xA9,0xA9,0x9A,0xAA,0xAB,0xBB, + 0xCC,0xDC,0xDB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0x8D,0xDE,0xEE,0xED,0xDD,0xBB,0xAB,0xBC,0xDD,0xCD,0xBB,0xBB,0xBB,0xB8,0x54, + 0x44,0x54,0x54,0x44,0x44,0x55,0x77,0x78,0x77,0x78,0x77,0x77,0x87,0x77,0x77,0x77, + 0x87,0x77,0x87,0x77,0x77,0x77,0x67,0x66,0x76,0x77,0x77,0x78,0x78,0x78,0x77,0x77, + 0x64,0x44,0x45,0x8A,0x84,0x97,0x44,0x44,0x55,0x8A,0xAA,0xAB,0xBB,0xCD,0xDD,0xDD, + 0xDB,0xBA,0xBA,0xBB,0xA8,0x9A,0xAA,0xA9,0xAA,0x9A,0x99,0x99,0xAA,0xAA,0xBA,0xBB, + 0xCD,0xDD,0xBB,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBC,0x9D,0xDE,0xEE,0xEE,0xDD,0xDC,0xAB,0xCB,0xDB,0xDC,0xCC,0xBC,0xBB,0xB9,0x65, + 0x54,0x44,0x44,0x45,0x44,0x44,0x57,0x77,0x77,0x87,0x77,0x87,0x77,0x78,0x77,0x87, + 0x77,0x87,0x77,0x87,0x87,0x76,0x66,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x75, + 0x44,0x44,0x48,0x96,0x87,0x55,0x44,0x45,0x57,0xAC,0xAA,0xAA,0xBB,0xDC,0xDD,0xDD, + 0xCB,0xBB,0xBB,0xBB,0xA9,0x89,0xBC,0xAA,0x9A,0x9A,0x9A,0x99,0xAA,0xAB,0xAB,0xBB, + 0xBC,0xCD,0xDD,0xCB,0xCE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xAE,0xDD,0xEE,0xEE,0xED,0xDC,0xDB,0xCC,0xCD,0xBD,0xCC,0xDD,0xCC,0xBA,0x64, + 0x45,0x45,0x44,0x44,0x44,0x44,0x56,0x77,0x87,0x77,0x87,0x78,0x77,0x87,0x78,0x77, + 0x87,0x78,0x77,0x77,0x77,0x77,0x66,0x77,0x77,0x87,0x87,0x78,0x77,0x87,0x77,0x54, + 0x44,0x44,0x46,0x96,0x57,0x44,0x54,0x55,0x69,0xDE,0xDA,0xAA,0xBC,0xCD,0xDD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBA,0x89,0xBE,0xB9,0xA9,0xA9,0xA9,0x99,0xAA,0xBB,0xAB,0xBB, + 0xBB,0xCC,0xDD,0xCB,0xBD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xBC,0xED,0xDE,0xEE,0xED,0xDD,0xCC,0xCC,0xCC,0xBC,0xCD,0xCC,0xDB,0xBB,0x75, + 0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x67,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87, + 0x78,0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x65,0x44, + 0x45,0x99,0x54,0x68,0x44,0x44,0x44,0x45,0x8A,0xBB,0xAB,0xBB,0xBB,0xCD,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xA8,0x9A,0xBA,0xAA,0xAA,0x99,0x99,0xAB,0xBA,0xBA,0xBB, + 0xBB,0xBB,0xDC,0xDC,0xBC,0xED,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0xED,0xDE,0xEE,0xEE,0xDC,0xCD,0xBB,0xCB,0xDC,0xDB,0xCB,0xBB,0xBB,0x85, + 0x44,0x54,0x44,0x45,0x45,0x45,0x44,0x57,0x77,0x78,0x77,0x87,0x78,0x77,0x87,0x78, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x87,0x87,0x87,0x87,0x78,0x77,0x75,0x44,0x54, + 0x6A,0xBD,0xC5,0x44,0x44,0x45,0x45,0x57,0x89,0x9A,0xAA,0xBB,0xBB,0xCC,0xCB,0xBB, + 0xBB,0xAB,0xAB,0xBB,0xBB,0xB9,0x89,0x99,0x99,0x99,0x99,0x89,0xAB,0xAA,0xAA,0xAB, + 0xAA,0xAB,0xBD,0xDD,0xBB,0xCE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBA,0xED,0xDD,0xEE,0xEE,0xDD,0xDC,0xDC,0xBC,0xCC,0xBB,0xBA,0xBA,0xBB,0x85, + 0x55,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x78,0x87,0x87,0x87,0x87,0x78,0x77,0x87, + 0x87,0x87,0x87,0x76,0x77,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x77,0x54,0x44,0x56, + 0x7D,0x96,0xB8,0x44,0x45,0x44,0x55,0x79,0xAA,0x99,0xAB,0xBB,0xCB,0xBB,0xBB,0xBB, + 0xAB,0xBA,0xBA,0xAB,0xBC,0xBB,0xA8,0x98,0x98,0x98,0x88,0x89,0xBB,0xBB,0xAA,0xBA, + 0xAA,0xAB,0xBB,0xDC,0xDC,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBB,0xBE,0xDD,0xEE,0xEE,0xDD,0xDD,0xCC,0xBC,0xBB,0xBB,0xBA,0xAB,0xBB,0x96, + 0x54,0x54,0x44,0x45,0x44,0x54,0x44,0x54,0x57,0x77,0x87,0x78,0x78,0x78,0x78,0x77, + 0x78,0x77,0x77,0x65,0x67,0x77,0x87,0x87,0x87,0x78,0x78,0x77,0x65,0x44,0x45,0xAD, + 0xD9,0xD9,0x54,0x54,0x44,0x45,0x57,0x9A,0xAA,0xA9,0xAB,0xBB,0xCB,0xBB,0xBB,0xAB, + 0xBB,0xAB,0xAA,0xBB,0xBB,0xBC,0xCB,0x99,0x88,0x89,0x88,0x9B,0xBB,0xBB,0xBB,0xAA, + 0xAA,0xAA,0xBB,0xCD,0xDC,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0xBA,0xAE,0xED,0xDE,0xEE,0xED,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xCC,0xB8, + 0x55,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x77,0x87,0x87,0x78,0x77,0x87, + 0x87,0x77,0x66,0x77,0x67,0x87,0x87,0x87,0x87,0x87,0x78,0x75,0x44,0x54,0x47,0xE7, + 0x9C,0x77,0x44,0x44,0x44,0x55,0x78,0xAA,0xBA,0xAA,0xAA,0xBB,0xCC,0xBB,0xAA,0xAB, + 0xAB,0xAB,0xAA,0xBB,0xBB,0xBB,0xCB,0xCC,0xBA,0x99,0xAB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0x9A,0x9A,0xAA,0xBB,0xDC,0xDC,0xBD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBA,0xBB,0xEE,0xDD,0xEE,0xEE,0xDD,0xDC,0xCB,0xCB,0xBB,0xBB,0xBB,0xCC,0xB8, + 0x64,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x45,0x57,0x78,0x77,0x78,0x77,0x87,0x78, + 0x77,0x77,0x65,0x77,0x87,0x87,0x87,0x78,0x78,0x78,0x87,0x54,0x44,0x48,0xC8,0xDB, + 0xBA,0x44,0x44,0x54,0x45,0x46,0x8A,0xAA,0xAA,0xAA,0xBA,0xBB,0xCD,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xCD,0xDD,0xEE,0xDB,0xBB,0xBB,0xBA,0xAB,0xAB,0xBA, + 0xAA,0xAA,0xAB,0xBB,0xDD,0xCB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xAA,0xDE,0xDD,0xDD,0xEE,0xED,0xDB,0xDC,0xBB,0xBB,0xBB,0xBA,0xAB,0x99, + 0x75,0x55,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x77,0x87,0x87,0x87,0x87,0x87, + 0x76,0x57,0x76,0x87,0x78,0x78,0x78,0x87,0x87,0x87,0x54,0x45,0x45,0x9D,0xBE,0x99, + 0x85,0x44,0x54,0x44,0x55,0x68,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xCB,0xBA,0xAA,0xAA, + 0xAB,0xAB,0xAA,0xBB,0xBB,0xBB,0xCC,0xDD,0xED,0xDC,0xBB,0xBB,0xBB,0xBA,0xAB,0xAA, + 0xA9,0xAA,0xAB,0xBB,0xCC,0xDD,0xCB,0xCE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xAB,0xAE,0xED,0xDE,0xEE,0xED,0xDD,0xDC,0xCB,0xBA,0xAB,0xAA,0x99,0x98, + 0x85,0x54,0x45,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x57,0x78,0x78,0x78,0x78,0x78, + 0x77,0x57,0x78,0x78,0x87,0x87,0x87,0x78,0x78,0x75,0x46,0x74,0x6A,0xDE,0x88,0xB5, + 0x44,0x54,0x44,0x55,0x57,0x8A,0xAA,0xAA,0xAB,0xAB,0xBA,0xAB,0xBB,0xAB,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xAB,0xBB,0xBC,0xCC,0xDD,0xDD,0xCB,0xBA,0xBA,0xBA,0xBB,0xBA,0xAA, + 0x9A,0xAA,0xBC,0xCB,0xBC,0xDD,0xCB,0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDB,0xAA,0xAC,0xED,0xDD,0xEE,0xEE,0xDD,0xDD,0xBB,0xAA,0xAA,0xAA,0xA9,0x99, + 0x97,0x55,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x87,0x87,0x87,0x87, + 0x87,0x77,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x54,0x4A,0x96,0x7E,0x98,0xE7,0x54, + 0x54,0x44,0x54,0x45,0x79,0xAB,0xAA,0xAA,0xAA,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xAA, + 0xAA,0xAA,0xBC,0xDD,0xCB,0xCC,0xDD,0xBC,0xDD,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDB,0xBA,0xBA,0xEE,0xDD,0xEE,0xEE,0xED,0xDD,0xDB,0xA9,0x99,0x99,0xA9,0x99, + 0x98,0x65,0x44,0x54,0x54,0x54,0x44,0x45,0x44,0x54,0x45,0x58,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x54,0x45,0x48,0xAD,0xA8,0xE8,0x75,0x44, + 0x44,0x54,0x44,0x57,0x9A,0xBB,0xAA,0xAB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBD,0xCC,0xBD,0xDC,0xBB,0xCE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xBA,0x9A,0xCE,0xEE,0xDE,0xEE,0xEE,0xDD,0xDB,0xA9,0x99,0x99,0x9A,0xA9, + 0xA9,0x85,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x55,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x75,0x45,0x64,0x67,0xDB,0xC8,0x88,0x44,0x54, + 0x54,0x45,0x55,0x8A,0xBC,0xDB,0xAA,0xAB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBC,0xCB,0xBA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAC,0xDC,0xCC,0xCD,0xDC,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xBB,0xAA,0xAE,0xED,0xDE,0xEE,0xEE,0xED,0xDD,0xB9,0x99,0x89,0x9A,0xAA, + 0xAB,0xA7,0x65,0x54,0x54,0x45,0x44,0x54,0x44,0x45,0x44,0x54,0x68,0x78,0x78,0x78, + 0x78,0x78,0x87,0x87,0x88,0x78,0x86,0x54,0x48,0xE7,0xB8,0xAE,0xBC,0x54,0x45,0x44, + 0x45,0x55,0x69,0xCC,0xDD,0xBA,0xAB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBC,0xCC,0xCC,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xAB,0xAA,0xA9,0xAA,0xBC,0xDB,0xCD,0xDB,0xBB,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xED,0xDB,0xA9,0xBA,0xEE,0xDD,0xEE,0xEE,0xEE,0xDD,0xCA,0x99,0x99,0x9A,0xAA, + 0xBB,0xBA,0x76,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x46,0x87,0x87,0x88, + 0x87,0x88,0x78,0x87,0x87,0x87,0x54,0x44,0x45,0xAE,0xDC,0x89,0x85,0x54,0x54,0x54, + 0x55,0x57,0x9D,0xEE,0xDA,0xAA,0xBC,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xCB,0xBB,0xBC,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xBA,0xAA,0xAA,0xAA,0xAB,0xDD,0xBC,0xDD,0xDC,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xDB,0xBA,0xAA,0xCE,0xED,0xEE,0xEE,0xEE,0xDD,0xDB,0x99,0x9A,0x9A,0xBC, + 0xBC,0xCB,0xA7,0x54,0x54,0x45,0x45,0x44,0x44,0x45,0x44,0x44,0x54,0x68,0x87,0x87, + 0x88,0x78,0x78,0x78,0x88,0x65,0x45,0x44,0x79,0x8B,0xEC,0xD6,0x44,0x45,0x44,0x55, + 0x56,0x8A,0xAB,0xDD,0xBA,0xBB,0xCC,0xBB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBC, + 0xBA,0xAA,0xAA,0xAA,0xAD,0xDE,0xDB,0xCD,0xCB,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xDD,0xBB,0x9B,0xAE,0xED,0xDE,0xEE,0xEE,0xED,0xDD,0xB9,0xAA,0xBC,0xCC, + 0xDC,0xDC,0xBA,0x75,0x54,0x54,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x56,0x88,0x78, + 0x87,0x88,0x87,0x88,0x75,0x44,0x46,0x56,0xDB,0xE9,0xBA,0x55,0x54,0x54,0x54,0x56, + 0x7A,0xDD,0xAA,0xAA,0xAB,0xBC,0xCB,0xAB,0xBA,0xBA,0xBA,0xBA,0xAB,0xAA,0xAB,0xBC, + 0xBB,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBA,0xBA,0xAA,0xBB,0xBD,0xCD, + 0xCB,0xAA,0xBA,0xAA,0xBD,0xEE,0xEC,0xCD,0xCD,0xCC,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xED,0xCB,0xA9,0xAC,0xEE,0xDD,0xEE,0xEE,0xEE,0xDD,0xCA,0xAB,0xCC,0xDC, + 0xBC,0xED,0xBC,0xA7,0x65,0x54,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x68,0x88, + 0x78,0x78,0x78,0x86,0x54,0x45,0x8E,0xB9,0xE6,0xAD,0x66,0x54,0x54,0x55,0x55,0x79, + 0xCD,0xEE,0xCA,0xAA,0xBC,0xDC,0xBB,0xBA,0xBB,0xAB,0xAB,0xAB,0xAA,0xAA,0xBB,0xBC, + 0xBC,0xBB,0xBB,0xBA,0xA9,0x99,0x99,0x9A,0xAA,0xBA,0xBB,0xBA,0xAB,0xBC,0xCC,0xDC, + 0xDC,0xAA,0xBB,0xBB,0xDE,0xEE,0xEE,0xDC,0xCD,0xBB,0xCD,0xDE,0xEF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xED,0xDB,0xAA,0xAA,0xEE,0xDD,0xEE,0xEE,0xEE,0xDD,0xDC,0xAC,0xBD,0xCC, + 0xCB,0xBC,0xDC,0xBA,0x86,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x56,0x87, + 0x88,0x88,0x87,0x55,0x44,0x4A,0xE9,0xEA,0xBE,0xD8,0x44,0x54,0x55,0x55,0x68,0xBD, + 0xED,0xED,0xBB,0xBB,0xCC,0xCB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xAB,0xAB,0xBB, + 0xCB,0xBB,0xAA,0x9A,0x9A,0x9A,0x99,0xA9,0xAA,0xAA,0xAA,0xAB,0xBB,0xDD,0xDB,0xBC, + 0xCD,0xDC,0xCC,0xCE,0xEE,0xEF,0xEE,0xDC,0xBC,0xDC,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xDD,0xBA,0x9B,0xAE,0xED,0xDE,0xEE,0xEE,0xED,0xDC,0xDB,0xCC,0xCC, + 0xCB,0xBC,0xED,0xBB,0xB8,0x76,0x55,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x45,0x68, + 0x87,0x88,0x75,0x44,0x54,0x47,0xED,0xD7,0x58,0x75,0x45,0x45,0x56,0x78,0xAD,0xDE, + 0xEE,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBB,0xA9,0xA9,0xA9,0x9A,0x9A,0x99,0x99,0xAA,0xAA,0xBB,0xBD,0xDD,0xDB,0xBA, + 0xBD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xDB,0xBB,0xCD,0xBB,0xCE,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xDD,0xBB,0xAA,0xAC,0xEE,0xDE,0xEE,0xEE,0xED,0xDD,0xCD,0xBB,0xCC, + 0xCC,0xCB,0xCE,0xED,0xAA,0x97,0x65,0x55,0x45,0x44,0x54,0x54,0x44,0x45,0x45,0x46, + 0x88,0x75,0x54,0x44,0x44,0x44,0x8F,0xB5,0x54,0x45,0x45,0x67,0x78,0xBD,0xDD,0xDE, + 0xDB,0xBB,0xCD,0xCB,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBB,0xAA,0x9A,0x9A,0xAA,0x9A,0x9A,0x9A,0x9A,0xAA,0xAB,0xBC,0xED,0xDB,0xAA, + 0xAB,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDA,0xAA,0xBC,0xCB,0xBD,0xDE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFE,0xED,0xDB,0xAA,0xBA,0xEE,0xDD,0xEE,0xEE,0xEE,0xDB,0xDB,0xCB,0xBC, + 0xDD,0xDC,0xBC,0xEE,0xBA,0xA9,0x87,0x65,0x54,0x54,0x44,0x44,0x54,0x54,0x44,0x54, + 0x55,0x45,0x45,0x45,0x45,0x44,0x48,0xE7,0x44,0x55,0x67,0x8A,0xBD,0xDD,0xDE,0xDB, + 0xBB,0xDD,0xDD,0xCB,0xBB,0xBB,0xBC,0xDC,0xCB,0xBB,0xBA,0xAB,0xBE,0xDB,0xBB,0xBB, + 0xBC,0xCB,0x9A,0x9A,0xAA,0xAA,0x9A,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xCE,0xDD,0xBA, + 0x9A,0xDE,0xEE,0xFE,0xEE,0xED,0xEE,0xCA,0x9A,0xBD,0xCB,0xBD,0xEE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xDB,0xBA,0x9B,0xCE,0xED,0xDE,0xEE,0xEE,0xDD,0xDD,0xDB,0xBC, + 0xCD,0xDD,0xDB,0xBC,0xBA,0x9A,0xBA,0x98,0x76,0x55,0x55,0x45,0x44,0x44,0x54,0x44, + 0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x65,0x56,0x78,0x89,0xCD,0xDD,0xDE,0xDB,0xBB, + 0xCD,0xDE,0xDC,0xBA,0xBB,0xBB,0xCD,0xCC,0xBB,0xBB,0xCB,0xBB,0xAB,0xEC,0xBB,0xBB, + 0xBC,0xB9,0x99,0xA9,0xAA,0xA9,0xA9,0xA9,0xA9,0x9A,0xAB,0xBB,0xAB,0xBD,0xDD,0xCA, + 0x9A,0xBD,0xEE,0xEE,0xEE,0xDD,0xBC,0xCB,0x9A,0xAB,0xCC,0xCB,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xED,0xBB,0xAA,0xAD,0xEE,0xDE,0xEE,0xEE,0xED,0xDD,0xDC,0xBB, + 0xCD,0xDD,0xDD,0xCB,0xAA,0xAA,0xAA,0xCF,0xEB,0x86,0x55,0x54,0x55,0x45,0x44,0x44, + 0x54,0x45,0x45,0x44,0x44,0x44,0x55,0x67,0x89,0xBB,0xCD,0xEE,0xED,0xDC,0xBC,0xDD, + 0xDE,0xDD,0xDB,0xBB,0xBB,0xBB,0xCC,0xBB,0xBB,0xBC,0xCD,0xDD,0xCB,0xCC,0xBB,0xAB, + 0xCB,0xA8,0x99,0xAA,0xAA,0xAA,0xAA,0x9A,0x99,0xAA,0xAB,0xBA,0xAA,0xBC,0xED,0xDB, + 0xAA,0xBC,0xEE,0xEE,0xEE,0xDC,0xBA,0xAB,0xAA,0xAB,0xBC,0xDC,0xCD,0xDE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xED,0xCB,0xA9,0xBA,0xEE,0xDD,0xEE,0xEE,0xEE,0xDD,0xDD,0xCA, + 0xBC,0xCD,0xED,0xCB,0xBA,0xAA,0xAD,0xEF,0xFF,0xEC,0x98,0x76,0x65,0x55,0x56,0x77, + 0x55,0x54,0x55,0x66,0x66,0x78,0x88,0xAB,0xBB,0xBB,0xDD,0xEE,0xEC,0xBB,0xBD,0xDD, + 0xED,0xDD,0xCC,0xBB,0xCB,0xBD,0xCB,0xBB,0xBB,0xBC,0xDE,0xDE,0xDD,0xBB,0xAB,0xBB, + 0xBB,0xA8,0x99,0x9A,0x9A,0xAA,0xBA,0x9A,0x9A,0x9A,0xAB,0xAB,0xAA,0xAB,0xCB,0xCC, + 0xCB,0xDD,0xEE,0xEE,0xEE,0xDB,0xBB,0xBA,0xAA,0xAA,0xBC,0xCD,0xCC,0xEE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDB,0xBA,0xAA,0xCE,0xED,0xDE,0xEE,0xEE,0xED,0xDD,0xBB, + 0xBB,0xCD,0xDC,0xCB,0xBA,0xBB,0xDE,0xEF,0xEF,0xEE,0xDD,0xBB,0x98,0x88,0x7A,0xFD, + 0x87,0x77,0x78,0x98,0x99,0xAB,0xBB,0xBB,0xCD,0xBB,0xBD,0xCB,0xCC,0xBD,0xDE,0xEE, + 0xDD,0xDC,0xBB,0xBB,0xBB,0xCC,0xBB,0xBB,0xBB,0xAB,0xCE,0xFE,0xDC,0xBB,0xBA,0xBB, + 0xBB,0xB8,0x89,0xAA,0xAA,0xAA,0xAA,0x9A,0x99,0xAA,0xAB,0xAA,0xAA,0xAB,0xAA,0xBC, + 0xCD,0xDE,0xEE,0xED,0xDD,0xCB,0xBB,0xAA,0xBB,0xBA,0xAB,0xBC,0xCB,0xDE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xCA,0xAA,0xAE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDD,0xDA, + 0xBB,0xCC,0xCC,0xBB,0xAB,0xBD,0xDD,0xEF,0xFE,0xEE,0xEB,0xBB,0xBC,0xBA,0xA9,0xAA, + 0xBB,0xAA,0xAA,0x9A,0xAB,0xBC,0xCC,0xBB,0xDD,0xBB,0xBB,0xBD,0xCD,0xEE,0xEE,0xED, + 0xDD,0xDB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xAA,0x9A,0xAD,0xEE,0xDD,0xBB,0xBA,0xBB, + 0xBC,0xA8,0x89,0xAA,0xAA,0xAA,0xA9,0xAA,0x9A,0x9A,0xAB,0xBA,0xBA,0xAA,0xAA,0xAA, + 0xBD,0xEE,0xFE,0xEE,0xCB,0xCC,0xDB,0xBA,0xAC,0xBA,0x9A,0xBB,0xDC,0xBD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xBB,0xA9,0xBA,0xEE,0xDD,0xEE,0xEF,0xEE,0xDE,0xDC, + 0xBB,0xCC,0xBB,0xBB,0xAB,0xBD,0xDD,0xED,0xED,0xEF,0xED,0xCC,0xBB,0xAB,0xA9,0x9B, + 0xDA,0xAC,0xAA,0x9A,0xBB,0xCC,0xCB,0xAB,0xCB,0xBA,0xBB,0xDD,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xCB,0xBB,0xAB,0xBC,0xCB,0xBB,0xBB,0xA9,0xAA,0xAA,0xBD,0xCC,0xCB,0xBB,0xAB, + 0xBB,0xC9,0x89,0xAC,0xDA,0xAA,0xA9,0xA9,0xA9,0xAA,0xBB,0xAA,0xAA,0xBB,0xAA,0x9A, + 0xBD,0xEE,0xFE,0xED,0xDB,0xCD,0xCB,0xBA,0xAB,0xBA,0x99,0xAB,0xCC,0xCC,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDB,0xBA,0xAA,0xCE,0xED,0xDE,0xEE,0xEE,0xED,0xDD, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xDE,0xEE,0xDE,0xDE,0xEE,0xED,0xDC,0xBB,0xBB,0xBB,0xCD, + 0xB9,0x9B,0xBA,0xBB,0xBB,0xBD,0xBB,0xBB,0xBB,0xCB,0xDD,0xDE,0xEE,0xEE,0xDD,0xDD, + 0xCD,0xCB,0xBB,0xBB,0xBC,0xBB,0xBA,0xAA,0xAA,0xAA,0xA9,0xAB,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0x88,0x9D,0xFB,0xAA,0x9A,0x9A,0xA9,0x9A,0xAA,0xBA,0xAB,0xBB,0xBA,0xAA, + 0xAD,0xEE,0xFE,0xEE,0xCB,0xCD,0xDC,0xBA,0xAA,0xBA,0x99,0xAA,0xBD,0xCC,0xCE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDC,0xBB,0xAB,0xAE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDD, + 0xDB,0xBB,0xAB,0xBB,0xBD,0xEE,0xEE,0xED,0xEE,0xEE,0xEC,0xCC,0xBB,0xCB,0xAB,0xDD, + 0xCA,0xAA,0xBB,0xCB,0xBC,0xCB,0xCB,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xBA,0xBB,0xCB,0xBB, + 0xBB,0xCB,0xA8,0x99,0x9A,0xAA,0xAA,0xA9,0x9A,0xAA,0xBB,0xAB,0xBB,0xBC,0xDB,0xAA, + 0xBC,0xDE,0xEF,0xED,0xBB,0xDD,0xDD,0xBA,0x9A,0xB9,0x99,0x99,0xAB,0xCC,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xCB,0xA9,0xBA,0xEE,0xDD,0xEE,0xEF,0xEE,0xED, + 0xDC,0xBA,0xAA,0xBD,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xED,0xDD,0xCC,0xCB,0xDB,0xBB, + 0xBB,0xBB,0xBC,0xCD,0xCC,0xCB,0xDC,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xA9,0xAA,0xBB,0xAA,0x9A,0xAB,0xBB,0xCC,0xBB, + 0xBC,0xCC,0xB9,0x89,0x99,0x99,0x99,0x99,0x99,0xAB,0xBA,0xBB,0xCD,0xDC,0xED,0xCB, + 0xCD,0xDE,0xFE,0xEE,0xBB,0xDD,0xDC,0xBA,0xAA,0xA9,0x88,0x99,0xAB,0xBC,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDB,0xAA,0xAA,0xCE,0xED,0xDE,0xEE,0xEE,0xED, + 0xDD,0xBA,0xAA,0xDE,0xEF,0xEE,0xDE,0xDE,0xEE,0xEF,0xED,0xDD,0xDD,0xDD,0xDD,0xBB, + 0xBB,0xCC,0xCD,0xCC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xCD,0xDD,0xDD,0xDC,0xDD,0xDC, + 0xDC,0xDB,0xBB,0xBB,0xBB,0xBA,0xAA,0x98,0x9A,0xBB,0xA9,0x9A,0xAA,0xBC,0xCB,0xBB, + 0xBB,0xCC,0xDB,0xA8,0x99,0x99,0x99,0x99,0x99,0xAB,0xAB,0xAC,0xDE,0xED,0xEE,0xED, + 0xDD,0xEE,0xFE,0xEE,0xEE,0xED,0xDB,0xBA,0xBA,0x99,0x88,0x89,0x9A,0xBB,0xCC,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xBA,0x9B,0xAE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xDD,0xDA,0x9A,0xCE,0xEE,0xEE,0xED,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xCD,0xDD,0xDB, + 0xBB,0xDD,0xDB,0xDC,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xCC,0xBB,0xBB,0xBA,0xAA,0xAA,0x89,0x99,0x98,0xAA,0xAB,0xBB,0xDC,0xBB, + 0xBB,0xBD,0xCD,0xCB,0x99,0x99,0x98,0x99,0xBB,0xBB,0xBB,0xBC,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xEF,0xED,0xCB,0xBB,0xBA,0x88,0x89,0x89,0x99,0xBC,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xBB,0xA9,0xBA,0xEE,0xDD,0xEE,0xEF,0xEE, + 0xED,0xDC,0xAA,0xBE,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xDC,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDC,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCC,0xDB,0xCB, + 0xCB,0xCC,0xCB,0xCB,0xBB,0xBA,0xAA,0xAA,0x98,0x99,0x99,0xAA,0xAA,0xBC,0xCC,0xCB, + 0xCB,0xCC,0xDC,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBD,0xEE,0xFE,0xFE,0xFE, + 0xED,0xDE,0xEF,0xEE,0xDD,0xDC,0xBB,0xBB,0xBB,0xA8,0x88,0x88,0x99,0xAB,0xBB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB,0xBA,0xAA,0xCE,0xED,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xCA,0xBC,0xEF,0xFF,0xFE,0xEF,0xFF,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDB,0xDC,0xDD,0xDD,0xDD,0xCD,0xDC,0xCB,0xBB,0xDE,0xDD,0xDC,0xDD,0xCC,0xCC, + 0xBC,0xBD,0xCD,0xCC,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xBB,0xBA,0xAB,0xBC,0xCC,0xBC, + 0xBD,0xCB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xBB,0xBA,0xBB,0xCD,0xEE,0xEF,0xEF,0xFE, + 0xDB,0xCE,0xEE,0xFF,0xED,0xBB,0xBB,0xBB,0xAA,0xA9,0x99,0x99,0x99,0xAB,0xBC,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDC,0xBA,0x9B,0xAE,0xEE,0xDD,0xEE,0xEE, + 0xEE,0xDE,0xDB,0xAB,0xDE,0xFF,0xFF,0xFF,0xFF,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDB,0xA9,0xAA,0xBC,0xED,0xDD,0xCC,0xDC,0xCC, + 0xBC,0xBC,0xCD,0xCD,0xCD,0xCD,0xBB,0xBA,0xBB,0xBB,0xBB,0xCC,0xBB,0xBC,0xCB,0xBC, + 0xCC,0xDB,0xCC,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xDD,0xEF,0xEF,0xFE,0xFE, + 0xEC,0xBD,0xEE,0xEF,0xFE,0xCB,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x99,0xAB,0xBB,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xBB,0xA9,0xBA,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xED,0xDD,0xBB,0xBD,0xEF,0xFF,0xFF,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xCC,0xB9,0xAA,0xAA,0xBB,0xCE,0xDD,0xDD,0xDC,0xCC, + 0xBB,0xBB,0xBD,0xDC,0xDC,0xCD,0xDB,0xBB,0xBB,0xBB,0xBB,0xCB,0xDC,0xDC,0xBB,0xBB, + 0xBD,0xBD,0xCB,0xCC,0xDC,0xCC,0xDD,0xCC,0xBB,0xAB,0xBC,0xDE,0xFE,0xFF,0xEF,0xEF, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEB,0xBA,0xAA,0xAA,0xAA,0x9A,0x99,0x99,0xAA,0xBB,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDB,0xBA,0xAA,0xCE,0xED,0xDE,0xEE, + 0xEE,0xEE,0xDD,0xDB,0xBC,0xCD,0xDE,0xDC,0xDD,0xED,0xDC,0xDD,0xDD,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xBA,0x99,0xBB,0xBB,0xAA,0xBD,0xDD,0xCD,0xCD,0xBC, + 0xBA,0xAA,0xAA,0xCD,0xDD,0xDB,0xCB,0xCC,0xBB,0xBB,0xBB,0xBD,0xBD,0xBB,0xBB,0xCC, + 0xDB,0xCD,0xCD,0xBD,0xBC,0xBC,0xDB,0xBB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFE,0xFF,0xFE, + 0xFE,0xEE,0xED,0xDE,0xEF,0xEE,0xBA,0x99,0xAA,0xAA,0xA9,0x99,0x99,0xAB,0xBB,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDC,0xBA,0x9B,0xAE,0xEE,0xDD,0xEE, + 0xEE,0xEE,0xDE,0xDC,0xBB,0xBD,0xBD,0xBB,0xBD,0xEC,0xDD,0xDD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xDD,0xDB,0xAA,0x9B,0xBC,0xCB,0xAA,0xAB,0xDD,0xDC,0xDC,0xBB, + 0xAA,0x9A,0xAA,0xAB,0xDD,0xCD,0xCD,0xCC,0xDC,0xCB,0xCC,0xDC,0xDC,0xBB,0xCD,0xCD, + 0xCD,0xCC,0xCD,0xCD,0xCB,0xBA,0xAB,0xBC,0xBB,0xBB,0xCE,0xEE,0xEF,0xFF,0xEF,0xEF, + 0xEF,0xEE,0xEE,0xDD,0xEE,0xFE,0xDA,0xA9,0x9A,0xAA,0xAA,0xA9,0x9A,0xAB,0xBB,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xBB,0xA9,0xBA,0xEE,0xED,0xEE, + 0xEE,0xEE,0xED,0xDD,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xBA,0xA9,0xBC,0xBC,0xCB,0xB9,0xAA,0xBD,0xDC,0xCC,0xBA, + 0x99,0xAB,0xB9,0xAA,0xCD,0xDD,0xCC,0xDC,0xDD,0xCD,0xDC,0xDD,0xBC,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xCC,0xCC,0xDB,0xAA,0xBB,0xBB,0xCB,0xBD,0xDE,0xEF,0xFE,0xFE,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xDE,0xEE,0xFE,0xFD,0xAA,0x99,0xAA,0xAA,0xAA,0x9A,0xAB,0xBC,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0xAA,0xCE,0xED,0xDE, + 0xEE,0xEE,0xEE,0xDD,0xDB,0xBB,0xBB,0xBB,0xCD,0xDE,0xDE,0xDD,0xDD,0xDE,0xED,0xED, + 0xDD,0xDC,0xDC,0xDD,0xCB,0xB9,0x9B,0xDD,0xCC,0xCB,0xBA,0x99,0xAB,0xDC,0xCA,0xA9, + 0x9A,0xBD,0xCB,0x9A,0xAD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDC, + 0xDC,0xDC,0xDD,0xCC,0xCC,0xCC,0xBD,0xCC,0xCB,0xBD,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xFF,0xEE,0xCA,0x9A,0x9A,0xAA,0xAA,0x9A,0xBB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDC,0xBA,0xAA,0xAE,0xEE,0xDD, + 0xEE,0xEF,0xEE,0xED,0xDD,0xBB,0xBC,0xBC,0xCD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDB,0xA9,0x9A,0xED,0xBC,0xCC,0xBB,0xA9,0xAA,0xBC,0xAA,0x99, + 0xBC,0xCC,0xDB,0xB9,0xAB,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDB,0xDC,0xDD,0xDC,0xCD, + 0xCD,0xDD,0xCD,0xBB,0xCC,0xDC,0xDC,0xCC,0xBB,0xDD,0xEE,0xEF,0xFE,0xFE,0xFF,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xBA,0xA9,0xA9,0xAA,0xAA,0xBB,0xBB,0xBD,0xDC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xBB,0xA9,0xBA,0xEE,0xED, + 0xDE,0xEE,0xEE,0xDE,0xDD,0xDC,0xCC,0xDC,0xDD,0xDD,0xDD,0xED,0xDD,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xDB,0xA9,0x89,0xCE,0xDC,0xCB,0xBB,0xBA,0x9A,0xBB,0x99,0x9B, + 0xBD,0xDD,0xCC,0xCA,0x9A,0xBE,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xBD,0xED,0xDD,0xDD,0xBD,0xCC,0xCC,0xCB,0xBB,0xCD,0xEE,0xDF,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xEF,0xEE,0xED,0xAA,0xA9,0xA9,0xAA,0xAA,0xBB,0xBB,0xCC,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0xAA,0xCE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xDD,0xDB,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xB9,0x99,0x9D,0xDC,0xBB,0xCC,0xDB,0xA9,0xAA,0x9A,0xBD, + 0xDD,0xDD,0xCD,0xDB,0xAA,0xBC,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xBC, + 0xBD,0xDE,0xDD,0xCD,0xBC,0xCC,0xBB,0xCB,0xBB,0xCD,0xCC,0xDE,0xEF,0xFF,0xFE,0xFE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xCA,0xA9,0x9A,0x9A,0x9A,0xBB,0xBB,0xBB,0xCD,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xBA,0xAA,0xAD,0xEE, + 0xDD,0xEE,0xEE,0xEE,0xDE,0xDD,0xAB,0xDC,0xBD,0xDD,0xDD,0xCD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xC9,0x98,0x9A,0xDC,0xBB,0xCC,0xCC,0xBA,0xA9,0xAB,0xDD, + 0xDD,0xED,0xDC,0xCC,0xAA,0xBC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB, + 0xBB,0xDD,0xDD,0xDD,0xDC,0xCC,0xCC,0xBB,0xBB,0xDE,0xCB,0xDE,0xEF,0xFE,0xEF,0xEF, + 0xFF,0xEF,0xEE,0xED,0xEE,0xED,0xAA,0x9A,0xA9,0xAA,0xAA,0xBC,0xCB,0xBC,0xCC,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xBB,0xA9,0xBA,0xEE, + 0xED,0xDE,0xEE,0xFE,0xED,0xDD,0xCA,0xBC,0xED,0xED,0xED,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDE,0xDE,0xDC,0x99,0x89,0xAD,0xDC,0xCC,0xDC,0xDC,0xCD,0xDD,0xCD, + 0xCD,0xDC,0xCD,0xCA,0x8A,0xCC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDB,0xCC,0xBB, + 0xBC,0xCD,0xCD,0xCD,0xCB,0xCB,0xCB,0xBB,0xBC,0xEE,0xED,0xCD,0xEE,0xED,0xEE,0xEF, + 0xEF,0xEE,0xEE,0xDC,0xDB,0xBA,0xAA,0xAA,0xBB,0xBD,0xCD,0xDB,0xCB,0xCC,0xDA,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB,0xBA,0x9B,0xCE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDB,0xAD,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xFE, + 0xEE,0xDD,0xDD,0xDD,0xEE,0xED,0xB9,0x98,0x9B,0xDD,0xCD,0xCC,0xCB,0xCC,0xCD,0xDD, + 0xCB,0xCC,0xDC,0x98,0x8A,0xDC,0xCC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xCC,0xBB,0xBB, + 0xBB,0xBC,0xCC,0xCC,0xDB,0xBB,0xBB,0xBB,0xDE,0xFE,0xFE,0xEE,0xDD,0xDD,0xDE,0xEE, + 0xFF,0xEE,0xDC,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xBC,0xCD,0xBB,0xBD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDC,0xBA,0xAA,0xAD, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xDA,0x99,0x99,0xCD,0xDC,0xBB,0xAB,0xBC,0xDD,0xCD, + 0xDD,0xCC,0xB9,0x89,0x9A,0xBC,0xDC,0xDC,0xDB,0xDC,0xDC,0xDD,0xDC,0xDB,0xDB,0xCC, + 0xBB,0xBB,0xCC,0xCD,0xBB,0xBB,0xBC,0xBD,0xEF,0xEE,0xFE,0xED,0xEE,0xDD,0xDD,0xDD, + 0xEE,0xDB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xCC,0xCD,0xDB,0xAB,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xCB,0xA9,0xBA, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xFE, + 0xED,0xDD,0xDD,0xDD,0xEE,0xDE,0xDD,0xA9,0x89,0xAD,0xCC,0xBA,0xBB,0xCC,0xDC,0xDC, + 0xDC,0xDB,0x99,0x89,0xAA,0xCD,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD, + 0xDD,0xDC,0xCB,0xCC,0xBB,0xBB,0xCC,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD, + 0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xED,0xDC,0xDC,0xDC,0xD9,0xAB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDB,0xBA,0x9B, + 0xCE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xDD,0xD9,0x98,0x9A,0xDB,0xBA,0xBC,0xDD,0xCC,0xCD, + 0xCD,0xA9,0x89,0x99,0xAC,0xDD,0xDD,0xCD,0xCD,0xCC,0xCD,0xCD,0xDC,0xDD,0xDD,0xDE, + 0xDD,0xDB,0xCB,0xCC,0xCB,0xBD,0xCE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xED,0xDD,0xCD,0xBC,0xDE,0xAA,0xBB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xBA,0xAA, + 0xAC,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDD,0xDE,0xFE, + 0xEE,0xDD,0xDD,0xED,0xEE,0xED,0xED,0xCB,0x99,0x9A,0xBB,0xAA,0xBB,0xDC,0xBB,0xCC, + 0xC9,0x98,0x99,0x9A,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCB,0xDC,0xDD,0xCD,0xDD,0xDE, + 0xDD,0xDD,0xCB,0xCC,0xBB,0xCD,0xEE,0xEE,0xFE,0xFF,0xEE,0xEE,0xED,0xDD,0xDE,0xDD, + 0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDC,0xDC,0xCB,0xCD,0xDD,0x9A,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB,0xA9, + 0xAA,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xEE,0xEE, + 0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xED,0xDC,0xA8,0xAA,0xBB,0xAA,0xAB,0xCB,0xBB,0xBC, + 0xA9,0x89,0x99,0xBD,0xDD,0xDD,0xDC,0xCC,0xDC,0xDB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xCD,0xBC,0xCB,0xEE,0xEE,0xFE,0xFF,0xFF,0xEE,0xDE,0xDE,0xDD,0xED,0xED, + 0xDE,0xDD,0xDD,0xDE,0xED,0xDD,0xDD,0xDC,0xBC,0xBB,0xCD,0xCC,0xDB,0xAB,0xBD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB,0xBA, + 0x9B,0xAE,0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDD,0xDE,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xED,0xBB,0x99,0xAB,0xBB,0xBA,0xAA,0xAA,0xAB,0xBB, + 0xA9,0x99,0x9B,0xDD,0xED,0xDD,0xDD,0xCD,0xCD,0xDB,0xDB,0xBD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCC,0xDC,0xCB,0xCE,0xEE,0xEE,0xEF,0xEF,0xEE,0xED,0xED,0xED,0xED,0xED,0xEE, + 0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xCC,0xCB,0xDC,0xCD,0xCD,0xCB,0xCA,0xBB,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBA, + 0xA9,0xBC,0xEE,0xEE,0xDE,0xEE,0xFE,0xEE,0xED,0xDB,0xCD,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xDC,0xBA,0x9A,0xBB,0xBB,0xBA,0xAA,0xAB,0xBB,0xCB, + 0xA9,0x99,0xCD,0xED,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xEE,0xEF,0xEF,0xEE,0xEE,0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xDD, + 0xED,0xED,0xED,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xBC,0x9A,0xBC,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB, + 0xAA,0xAB,0xDE,0xEE,0xDD,0xEE,0xEE,0xEE,0xDE,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xEE,0xEE,0xED,0xAA,0x99,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xBA,0x9B,0xCD,0xDE,0xDE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDD,0xC9,0xAB,0xBD,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDB, + 0xBA,0x9B,0xBE,0xEE,0xEE,0xDE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xDA,0xA9,0xAA,0xBA,0xBB,0xBB,0xBB,0xBC,0xCC,0xBC,0xBB, + 0xBA,0x9A,0xCD,0xEE,0xDD,0xDD,0xDD,0xCD,0xBD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xEB,0x9A,0xBB,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD, + 0xBB,0xA9,0xBC,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xAA,0x9A,0xBA,0xAB,0xBA,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB, + 0xBB,0xA9,0xBB,0xCE,0xEE,0xEE,0xDD,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xAA,0xAB,0xBD,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED, + 0xDB,0xAA,0x9A,0xCE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xCA,0xAA,0xBB,0xBB,0xAA,0xBB,0xBB,0xBB,0xBC,0xDC,0xCB,0xBB, + 0xBA,0xBA,0x9A,0xBD,0xDE,0xED,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD, + 0xDE,0xEE,0xEE,0xED,0xED,0xCC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xED,0xDE,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xA9,0xAA,0xBB,0xDD,0xDE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xDC,0xBA,0xAA,0xBE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xBA,0xAA,0xCB,0xBB,0xBB,0xAB,0xBA,0xB9,0x99,0xBD,0xCB,0xBB, + 0xAB,0xBA,0xA9,0xBC,0xEE,0xEE,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD, + 0xDE,0xEE,0xED,0xDD,0xDB,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED, + 0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0x99,0x9A,0xAB,0xBD,0xDE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xED,0xBB,0xA9,0xBB,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDD,0xEE,0xEF,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xED,0xB9,0x9A,0xCC,0xBB,0xBA,0xAA,0xBA,0x99,0x89,0x9B,0xCB,0xBB, + 0xBB,0xAB,0xAA,0xAA,0xCE,0xEE,0xED,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD, + 0xEE,0xED,0xDC,0xDC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xCB,0xA9,0x89,0x89,0x9A,0xAB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xED,0xDB,0xBA,0x9B,0xCE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xB9,0x99,0xBC,0xCB,0xBB,0xBB,0x99,0x98,0x98,0x99,0xBC,0xBB, + 0xBB,0xBB,0xBB,0xAA,0xBD,0xEE,0xED,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDE, + 0xEE,0xDD,0xCB,0xBC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xED,0xEE,0xDE, + 0xDD,0xDD,0xDB,0xA8,0x88,0x98,0x99,0x9A,0xAA,0xBB,0xCD,0xEE,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEE,0xDC,0xBB,0xA9,0xBC,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xD9,0x89,0x9C,0xCC,0xCB,0xB9,0x98,0x99,0x99,0x98,0x9B,0xBB, + 0xBB,0xBB,0xBB,0xAA,0xBC,0xDE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDB,0xDC,0xDD,0xEE, + 0xED,0xCC,0xBB,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xED,0xEE,0xED,0xED, + 0xDC,0xB9,0x88,0x89,0x99,0x99,0xAA,0xAA,0xBB,0xCD,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xED,0xCB,0xAA,0xAB,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDB,0x98,0x9A,0xDD,0xBA,0x98,0x99,0xA9,0xBC,0x99,0x99,0xBB, + 0xBB,0xBC,0xBB,0xAA,0xBC,0xDE,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xEE,0xED, + 0xDC,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xCA, + 0x98,0x88,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xDB,0xBA,0x9B,0xBE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xED,0xA8,0x99,0xAD,0xA9,0x99,0x9A,0xAC,0xEE,0xA9,0x98,0xAB, + 0xCC,0xBC,0xCB,0x99,0xAC,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDE,0xEE,0xED, + 0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xA9,0x88, + 0x99,0x99,0xA9,0xAA,0xBB,0xBB,0xBC,0xDD,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xDD,0xCA,0xA9,0xBC,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xCA,0x99,0x99,0x99,0x99,0x9A,0xDD,0xEE,0xDA,0x99,0x9A, + 0xDC,0xCC,0xA9,0x99,0xAB,0xDE,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xEE,0xEE,0xCB, + 0xCB,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDB,0x98,0x89,0x99, + 0x99,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xCB,0xBA,0x9B,0xCE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xDE,0xDD,0xEE, + 0xEE,0xEF,0xEE,0xFE,0xFE,0xEB,0x99,0x99,0x99,0x9A,0xBD,0xEE,0xEE,0xEC,0x98,0x89, + 0xBD,0xCA,0x98,0x89,0xBD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xEE,0xFE,0xDC,0xBB, + 0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDA,0x88,0x99,0x99,0xAA, + 0xAB,0xBB,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xDC,0xBA,0xAA,0xBE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE, + 0xFE,0xEE,0xEF,0xEF,0xEF,0xEE,0xBA,0x9A,0x99,0xAB,0xDE,0xEF,0xEE,0xED,0xC9,0x88, + 0x9A,0xA9,0x98,0x9B,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xEE,0xEE,0xDB,0xBD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xC9,0x88,0x99,0x99,0xAA,0xAB, + 0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xED,0xBB,0xA9,0xAB,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDD,0xDE, + 0xEF,0xEE,0xEE,0xFE,0xFE,0xFE,0xEC,0xAA,0xAA,0xCE,0xEE,0xEE,0xEE,0xEE,0xDB,0x99, + 0x98,0x99,0x99,0xAD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xDC,0xDD, + 0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB9,0x89,0x99,0x9A,0xAB,0xBB,0xBC, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xED,0xDB,0xAA,0x9B,0xCE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xDE, + 0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xED,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xDD,0xA9, + 0x99,0x99,0xAB,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xDE,0xDD,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB9,0x89,0x99,0x9A,0xAB,0xBB,0xBD,0xDD, + 0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xA9,0xBC,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xDE, + 0xEF,0xFE,0xEE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xDA, + 0x99,0x9A,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB9,0x89,0x99,0xAA,0xBB,0xBB,0xCD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xED,0xCB,0xAA,0x9B,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEF,0xEF,0xEF,0xFF,0xEF,0xEE,0xED, + 0xCB,0xCD,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEC,0xDD,0xDE,0xDD,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xC9,0x89,0x99,0xAA,0xBB,0xBB,0xDD,0xED,0xEE,0xEE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDB,0xBA,0xAA,0xBE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xED, + 0xDE,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xFE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xED,0xCB,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xD9,0x99,0x99,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xFE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xBB,0xA9,0xAC,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEF,0xFF,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xEE,0xED,0xCB,0xDD,0xDE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xE9,0x89,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x9B,0xCE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE, + 0xDD,0xEE,0xFF,0xFF,0xEF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xED,0xED,0xDD,0xDE,0xEE,0xCB,0xBD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEB,0x89,0x99,0xAA,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBA,0xA9,0xBD,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xEF,0xFF,0xFF,0xEF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xCC,0xBD,0xED,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xED,0x98,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB,0xAA,0x9C,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xCC,0xBC,0xBD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xA8,0x99,0xAA,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB,0xBA,0xAA,0xCE,0xEF,0xEE,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xEF,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xEE,0xED,0xDD,0xBB,0xBB,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xD8,0x99,0xAA,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xBB,0xA9,0xAC,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xCB,0xBB,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEA,0x89,0x9A,0xAB,0xBC,0xDD,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB,0xBA,0x9B,0xCE,0xEF,0xEE,0xED,0xEE, + 0xEE,0xEE,0xED,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDC,0xCB,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0x99,0x9A,0xAA,0xBB,0xDD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBB,0xA9,0xBC,0xEE,0xEE,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDC,0xCB,0xCD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB8, + 0x99,0xAA,0xBB,0xDD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xCB,0xAA,0x9C,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xED,0xCB,0xBD,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xE9,0x89, + 0xAA,0xBB,0xCD,0xDE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDB,0xBA,0xA9,0xCE,0xEE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xFE,0xFE, + 0xEE,0xDE,0xCC,0xBD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0x89,0x9A, + 0xAB,0xBC,0xDD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xBB,0xA9,0xAC,0xEE,0xFE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE, + 0xDE,0xDD,0xBC,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xA8,0x99,0xAB, + 0xBB,0xDD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x9A,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xED, + 0xED,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xD9,0x99,0xAA,0xBB, + 0xCD,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCA,0xA9,0xAD,0xEE,0xFE, + 0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xED,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEA,0x89,0x9A,0xBB,0xBD, + 0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xCB,0xBA,0x9B,0xDE,0xEE, + 0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD, + 0xED,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEC,0x99,0x99,0xAB,0xBC,0xDD, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDC,0xBA,0xA9,0xBD,0xEE, + 0xFE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE, + 0xEE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xA8,0x99,0xAB,0xBC,0xCD,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xDD,0xCB,0xAA,0x9C,0xEE, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xB9,0x99,0x9A,0xBB,0xCD,0xDE,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x99,0xBE, + 0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDA,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF +}; + +const uint32_t PokeMini_BG2_PalRGB32[] = { + 0x00101010,0x00606058,0x00787878,0x00808080, + 0x00989880,0x00A0A090,0x00A8A898,0x00B0B0A0, + 0x00C0C0B8,0x00C8C8C0,0x00D0D0C8,0x00D8D8D0, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint32_t PokeMini_BG2_PalBGR32[] = { + 0x00101010,0x00586060,0x00787878,0x00808080, + 0x00809898,0x0090A0A0,0x0098A8A8,0x00A0B0B0, + 0x00B8C0C0,0x00C0C8C8,0x00C8D0D0,0x00D0D8D8, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint16_t PokeMini_BG2_PalRGB16[] = { + 0x1082,0x630B,0x7BCF,0x8410,0x9CD0,0xA512,0xAD53,0xB594, + 0xC617,0xCE58,0xD699,0xDEDA,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG2_PalBGR16[] = { + 0x1082,0x5B0C,0x7BCF,0x8410,0x84D3,0x9514,0x9D55,0xA596, + 0xBE18,0xC659,0xCE9A,0xD6DB,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG2_PalRGB15[] = { + 0x8842,0xB18B,0xBDEF,0xC210,0xCE70,0xD292,0xD6B3,0xDAD4, + 0xE317,0xE738,0xEB59,0xEF7A,0xEF7B,0xF39C,0xF7BD,0xFFFF +}; + diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG2.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG2.h new file mode 100644 index 0000000000..011897b291 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG2.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_BG_X2 +#define POKEMINI_BG_X2 + +#include + +// PokeMini Background Image +// 192 x 128 (2x2) - 4bpp (LSn Left pixel) +extern const uint8_t PokeMini_BG2[]; + +// PokeMini Background Palette (RGBX8888) +extern const uint32_t PokeMini_BG2_PalRGB32[]; + +// PokeMini Background Palette (BGRX8888) +extern const uint32_t PokeMini_BG2_PalBGR32[]; + +// PokeMini Background Palette (RGB565) +extern const uint16_t PokeMini_BG2_PalRGB16[]; + +// PokeMini Background Palette (BGR565) +extern const uint16_t PokeMini_BG2_PalBGR16[]; + +// PokeMini Background Palette (RGB555) +extern const uint16_t PokeMini_BG2_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG3.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG3.c new file mode 100644 index 0000000000..3aa4adfd8a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG3.c @@ -0,0 +1,1780 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_BG3[] = { + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x85,0x21,0x37, + 0x88,0x88,0x88,0x88,0x10,0x01,0x88,0x88,0x88,0x88,0x84,0x11,0x14,0x62,0x11,0x43, + 0x12,0x68,0x88,0x88,0x86,0x21,0x38,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00, + 0x01,0x33,0x33,0x30,0x00,0x00,0x03,0x33,0x33,0x33,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x02,0x33,0x33,0x20,0x00,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x00,0x12,0x10, + 0x00,0x31,0x11,0x30,0x08,0x80,0x01,0x13,0x11,0x13,0x00,0x22,0x30,0x01,0x22,0x00, + 0x41,0x00,0x13,0x12,0x00,0x14,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x09,0xFF,0xFF, + 0x10,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x0F,0xFF,0x11, + 0xF9,0x00,0x00,0x00,0x00,0xEE,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x30,0x0F,0xF5,0xEF, + 0x90,0x00,0x11,0x00,0x1F,0xF0,0x11,0x00,0x01,0x10,0x02,0xFF,0xF1,0x2F,0xFF,0x00, + 0x41,0x01,0x00,0x10,0x00,0x22,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x1F,0xF0,0x9F, + 0xF0,0x9F,0xFF,0x70,0x2F,0x84,0xFF,0x15,0xFF,0xF8,0x05,0xFF,0xF1,0xEF,0xFF,0x08, + 0xF2,0x2F,0xCC,0xFE,0x02,0xF9,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x2F,0xFC,0xFF, + 0x78,0xFF,0xEF,0xF1,0x8F,0xCF,0xF1,0x2F,0xF7,0xFF,0x0C,0xF7,0xF5,0xF9,0xF9,0x0F, + 0xF1,0x5F,0xF9,0xFF,0x18,0xF5,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x5F,0xFF,0xF8, + 0x0F,0xF9,0x1F,0xF1,0xEF,0xFF,0x40,0x8F,0xFF,0xFE,0x0F,0xF2,0xFF,0xE4,0xF8,0x0F, + 0xF0,0x8F,0x51,0xFF,0x0C,0xF2,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x8F,0x51,0x00, + 0x1F,0xF2,0xCF,0xF1,0xFF,0xFF,0xC0,0xCF,0xC8,0x40,0x1F,0x82,0xFF,0x27,0xF2,0x1F, + 0xF0,0xFF,0x12,0xFE,0x0F,0xF1,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0xFF,0x10,0x00, + 0x0E,0xFF,0xFF,0x81,0xFF,0x1F,0xF1,0x7F,0xFC,0xF1,0x5F,0x22,0xFF,0x08,0xF2,0x2F, + 0x80,0xFF,0x05,0xF8,0x1F,0xF0,0x02,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x21,0x00,0xFF,0x00,0x20, + 0x01,0xEF,0xF5,0x02,0xF9,0x0C,0xF7,0x0C,0xFF,0x80,0xCF,0x11,0x82,0x0F,0xF1,0x8F, + 0x41,0xFF,0x08,0xF2,0x2F,0xC0,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x32, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x00,0x01,0x33, + 0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x86,0x54,0x43,0x33,0x33,0x32,0x22,0x33,0x33,0x33,0x33,0x32,0x22,0x23,0x22,0x22, + 0x22,0x33,0x33,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x11,0x11,0x11, + 0x11,0x13,0x11,0x12,0x31,0x11,0x12,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x22,0x22,0x21,0x22,0x22, + 0x22,0x22,0x23,0x23,0x23,0x33,0x33,0x32,0x22,0x22,0x23,0x33,0x33,0x33,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x97,0x65,0x55,0x44,0x44,0x33,0x33,0x44,0x44,0x44,0x33,0x33,0x34,0x44,0x43,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,0x32,0x11,0x11,0x11, + 0x11,0x13,0x31,0x11,0x22,0x12,0x42,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x11,0x11, + 0x21,0x11,0x11,0x11,0x11,0x11,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x32,0x22,0x22,0x23,0x22, + 0x22,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x44,0x45,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0xA8,0x87,0x77,0x66,0x65,0x55,0x55,0x55,0x55,0x55,0x54,0x45,0x55,0x55,0x55,0x55, + 0x55,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x32,0x11,0x11,0x11, + 0x11,0x13,0x54,0x22,0x23,0x45,0x31,0x11,0x11,0x11,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x44,0x44,0x43,0x33,0x33, + 0x33,0x44,0x54,0x44,0x44,0x44,0x45,0x55,0x55,0x55,0x54,0x44,0x56,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0xDB,0xA9,0x88,0x88,0x87,0x77,0x78,0x88,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x65,0x55,0x66,0x42,0x33,0x33,0x23, + 0x23,0x22,0x36,0x77,0x78,0x64,0x22,0x32,0x22,0x23,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x43,0x43,0x33,0x33,0x34,0x33,0x33,0x44,0x33,0x33,0x33,0x34,0x33, + 0x43,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x44,0x44,0x44,0x44, + 0x34,0x22,0x23,0x23,0x22,0x22,0x22,0x22,0x32,0x33,0x23,0x56,0x56,0x65,0x55,0x55, + 0x55,0x66,0x77,0x76,0x77,0x77,0x77,0x77,0x78,0x88,0x87,0x77,0x77,0x88,0x88,0x99, + 0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xEE,0xCB,0xBA,0xAA,0x98,0x88,0x99,0x99,0x98,0x88,0x88,0x89,0x99,0x99,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x87,0x78,0x77,0x77,0x75,0x43,0x33,0x33,0x33, + 0x33,0x33,0x33,0x35,0x54,0x33,0x33,0x33,0x33,0x45,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x44,0x44,0x44,0x44,0x54,0x44, + 0x45,0x55,0x55,0x55,0x54,0x55,0x55,0x55,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x54,0x43,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x77,0x77,0x77,0x67,0x77, + 0x77,0x78,0x88,0x88,0x88,0x88,0x88,0x89,0x99,0xAA,0xA9,0x88,0x88,0x9A,0xBB,0xBC, + 0xCC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xFE,0xEE,0xDC,0xDB,0xBA,0xAA,0xBC,0xBB,0xBA,0xAA,0xBA,0xAB,0xBB,0xAA,0xAA,0x99, + 0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA,0x98,0x88,0x89,0x88,0x85,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x46,0x67,0x67,0x67,0x66,0x76,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x65,0x55,0x55,0x65,0x45,0x56,0x66, + 0x56,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x67, + 0x77,0x55,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x79,0xA9,0x88,0x88,0x88, + 0x88,0x89,0x99,0xAA,0x99,0x99,0x99,0x99,0x9A,0xBC,0xCD,0xBA,0x9A,0x9A,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xFF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xED,0xDC,0xBB,0xBD,0xDD,0xDB,0xBB,0xCB,0xBC,0xCC,0xCB,0xBA,0xBA,0xBB, + 0xBB,0xAB,0xBA,0xBB,0xBA,0xBB,0xCC,0xA9,0xAA,0xAA,0x99,0x75,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x47,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x76,0x77,0x67,0x67,0x67,0x67,0x67,0x66,0x65,0x66,0x67,0x66,0x66,0x66, + 0x66,0x77,0x66,0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x77,0x77,0x77,0x77, + 0x77,0x77,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x89,0xAA,0x99,0xC9,0x9A, + 0x9A,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xDD,0xDD,0xBA,0xBB,0xCD,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xFE,0xED,0xDD,0xDB,0xDD,0xDD,0xDC,0xDC,0xCB,0xDC,0xDC,0xCB,0xBB,0xBC,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xA8,0x64,0x54,0x54,0x44,0x44, + 0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x67,0x66,0x66,0x66,0x67,0x67,0x67, + 0x66,0x67,0x76,0x66,0x66,0x76,0x77,0x76,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x76,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x9A,0x99,0x99,0x99,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xCE,0xED,0xBB,0xAB,0xBD,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xDC,0xCB,0xDD,0xDD,0xDC,0xCC,0xCD,0xCD,0xBC,0xBB,0xBB,0xCB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xBB,0xBA,0x9A,0xAA,0xBA,0xBA,0x97,0x55,0x44,0x44,0x45,0x45, + 0x44,0x45,0x44,0x44,0x44,0x54,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x76,0x66,0x66,0x76,0x66,0x77,0x77, + 0x66,0x76,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x64,0x44,0x44,0x44,0x44,0x54,0x54,0x55,0x8A,0x99,0x99,0x9A,0xAA, + 0xAA,0xAA,0xBA,0xAB,0xAA,0xA9,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xDD,0xCD,0xBD,0xCD,0xDD,0xDB,0xCB,0xDC,0xDC,0xBB,0xBB,0xBB,0xCB,0xBB, + 0xBB,0xCC,0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAA,0xAA,0x75,0x54,0x45,0x45,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x67,0x66,0x66,0x67,0x66,0x66,0x67,0x76, + 0x76,0x67,0x66,0x66,0x66,0x66,0x77,0x77,0x67,0x77,0x77,0x67,0x77,0x77,0x77,0x77, + 0x77,0x87,0x77,0x76,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x8A,0x98,0x99,0x9A,0xAA, + 0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCE, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xAD,0xDC,0xCC,0xCD,0xCD,0xCD,0xBB,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xCB,0xBB,0xBB,0xBB,0xBB,0xCC,0xBA,0xAA,0xAA,0xA9,0x65,0x44,0x54,0x44,0x45,0x44, + 0x45,0x44,0x44,0x45,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x76,0x77,0x76,0x66,0x66,0x77,0x66,0x67,0x66,0x76,0x66,0x76,0x67, + 0x67,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x54,0x55,0x9A,0x99,0x99,0x8A,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0xAA,0xCB,0xBA,0xBB,0xBB,0xBB,0xCD,0xBB,0xBC, + 0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEC,0xAD,0xCD,0xCB,0xDC,0xDC,0xDC,0xDC,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xCB, + 0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAB,0xAA,0xA7,0x54,0x54,0x44,0x45,0x44,0x44, + 0x44,0x45,0x44,0x44,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x66,0x67,0x67,0x66,0x66,0x67,0x76,0x66,0x66,0x66,0x66,0x66,0x66, + 0x76,0x66,0x66,0x66,0x66,0x66,0x76,0x77,0x67,0x76,0x77,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x45,0x44,0x44,0x45,0x9A,0xAA,0x99,0x89,0xAA, + 0x9A,0xAA,0xAA,0x9A,0x9A,0xA9,0xA9,0x9A,0xBA,0xBA,0xAB,0xBC,0xDD,0xDD,0xDD,0xBC, + 0xCE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEA,0xBD,0xDC,0xBD,0xBC,0xDB,0xDC,0xCC,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xBA,0xAA,0xAB,0xAA,0x86,0x54,0x45,0x45,0x44,0x44,0x54, + 0x44,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x76,0x76,0x66,0x77,0x66,0x67,0x67,0x66,0x66,0x56,0x66,0x66,0x66, + 0x67,0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x54,0x55,0x9A,0xAA,0xAA,0xAA,0x99, + 0xAA,0xAA,0x9A,0x9A,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xBB,0xDD,0xDD,0xDD,0xDD,0xCB, + 0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xE8,0xCD,0xDB,0xDC,0xDD,0xBD,0xCD,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xBC,0xBA,0xAA,0xAA,0xAA,0x75,0x54,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x76,0x66,0x66,0x67,0x77,0x77,0x76,0x76,0x77,0x77,0x76,0x67,0x66, + 0x56,0x66,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x77,0x76,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x74,0x54,0x44,0x54,0x44,0x55,0x9B,0xAA,0xAB,0xBA,0xAA, + 0x99,0xAA,0xAA,0x9A,0x9A,0xA9,0xA9,0xAA,0xAA,0xAA,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xBB,0xDE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xC8,0xDD,0xCD,0xCD,0xDD,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xA8,0x65,0x44,0x44,0x54,0x44,0x54,0x45, + 0x44,0x54,0x57,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x76,0x66,0x66,0x76,0x77,0x77,0x76,0x66,0x67,0x67,0x65,0x66,0x66, + 0x56,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x87,0x78,0x77,0x77,0x44,0x44,0x44,0x54,0x56,0x9A,0xAA,0xAB,0xBB,0xBA, + 0xA9,0x9A,0xAA,0xA9,0xAA,0xAA,0xAA,0x9A,0xAA,0xAB,0xBC,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xCB,0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xA8,0xDD,0xDC,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xAA,0xAB,0xAB,0xBB,0xBC,0xBA,0xAA,0xAA,0xA7,0x55,0x54,0x54,0x44,0x44,0x44,0x44, + 0x44,0x47,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x66,0x67,0x76,0x66,0x67,0x77,0x77,0x66,0x66,0x66,0x66,0x56,0x66, + 0x65,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x44,0x44,0x56,0x9A,0x9A,0xAB,0xBB,0xBB, + 0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xA9,0xAA,0xBB,0xCC,0xCD,0xCD,0xCD,0xDD,0xDE, + 0xDC,0xBB,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0x88,0xDD,0xDC,0xDD,0xDD,0xDB,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBA,0xAA, + 0xAA,0xAA,0xBB,0xBB,0xBD,0xBA,0xBB,0xAA,0x96,0x54,0x44,0x45,0x45,0x45,0x44,0x54, + 0x45,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x66,0x67,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x67,0x66,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x77,0x77,0x75,0x54,0x45,0x45,0x46,0xA9,0x99,0xAA,0xAA,0xBB, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCB,0xBD,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x89,0xDD,0xCD,0xBD,0xDD,0xCB,0xBB,0xDC,0xDC,0xBB,0xCB,0xCC,0xBA,0xAA,0xBA, + 0xAA,0xAA,0xBB,0xCD,0xBC,0xA9,0x99,0x9A,0x76,0x45,0x45,0x44,0x44,0x44,0x44,0x44, + 0x57,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x66,0x66,0x67,0x66,0x67,0x76,0x66,0x66,0x66,0x65,0x67,0x76,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x78,0x77,0x65,0x54,0x44,0x44,0x57,0xA9,0x99,0xA9,0xAA,0xAA, + 0xBB,0xAA,0x9A,0x9A,0xAB,0xBB,0xBB,0xBB,0xAB,0xBD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDE, + 0xDD,0xCD,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0x89,0xDD,0xDC,0xDD,0xCD,0xBB,0xCD,0xDD,0xDB,0xCB,0xBC,0xCC,0xBB,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xCD,0xDD,0xB9,0x99,0x9A,0x75,0x54,0x44,0x45,0x45,0x44,0x44,0x46, + 0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x76,0x66,0x66,0x66,0x76,0x67,0x66,0x66,0x67,0x66,0x55,0x56,0x65,0x66,0x77,0x67, + 0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x78,0x77,0x77,0x75,0x44,0x45,0x45,0x57,0xA9,0x99,0xA9,0xA9,0xAA, + 0xAB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCB,0xBA,0xBB,0xBD,0xDD,0xDB,0xDB,0xDD,0xDD,0xDD, + 0xED,0xDC,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x7A,0xED,0xDD,0xCD,0xDD,0xCB,0xBC,0xDD,0xDD,0xCC,0xBB,0xCB,0xCB,0xAA,0xBB, + 0xA9,0xAA,0xAB,0xCD,0xDB,0xB9,0x99,0xA8,0x65,0x55,0x45,0x44,0x44,0x44,0x54,0x77, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x66,0x67,0x67,0x67,0x66,0x66,0x77,0x66,0x67,0x66,0x56,0x67,0x66,0x77,0x67,0x65, + 0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x54,0x44,0x44,0x58,0xA8,0x99,0xA9,0x9A,0x9A, + 0xAA,0xBA,0xAA,0x9A,0xAA,0xBB,0xBB,0xBB,0xAB,0xBC,0xCD,0xBD,0xCD,0xCD,0xCD,0xDD, + 0xDE,0xDD,0xDC,0xBC,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x7B,0xED,0xDC,0xDD,0xDC,0xBB,0xCD,0xDD,0xDC,0xCB,0xBC,0xCD,0xBC,0xBB,0xCD, + 0xBA,0xA9,0xAA,0xBA,0xBB,0xA9,0x89,0xA7,0x65,0x44,0x44,0x45,0x44,0x54,0x57,0x77, + 0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x66,0x67,0x76,0x67,0x77,0x77,0x77,0x65,0x65,0x65,0x66,0x76,0x77,0x76,0x55,0x55, + 0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x56,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x45,0x45,0x58,0xA9,0x99,0x9A,0xA9,0x99, + 0xAA,0xBB,0xAA,0x9A,0xAA,0xAB,0xBA,0xBA,0xBB,0xBB,0xDC,0xDB,0xCC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE9,0x7D,0xED,0xDD,0xDD,0xCD,0xCB,0xCB,0xDC,0xDC,0xCB,0xBC,0xBC,0xCC,0xCD,0xDD, + 0xCB,0xAA,0xAA,0xAA,0xAD,0xA9,0x9A,0xA7,0x55,0x45,0x45,0x44,0x44,0x45,0x77,0x87, + 0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67, + 0x77,0x67,0x76,0x66,0x77,0x77,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x65,0x55,0x55, + 0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x67,0x66,0x66,0x65,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x75,0x45,0x45,0x44,0x45,0x69,0xA9,0x99,0x99,0xA9,0xA9, + 0xAA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xBA,0xBB,0xCC,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xDD,0xDD,0xDD,0xCB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x8E,0xED,0xDC,0xDB,0xDB,0xCC,0xCC,0xCC,0xCC,0xBC,0xBC,0xDB,0xDC,0xDD,0xDD, + 0xDB,0xAA,0x9A,0x9A,0xA9,0x99,0x9B,0x96,0x54,0x54,0x44,0x54,0x54,0x67,0x87,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77, + 0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x77,0x76,0x55,0x66,0x66,0x55, + 0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x65,0x76,0x55,0x66,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x45,0x45,0x45,0x69,0x99,0x99,0x99,0x99,0x9A, + 0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xCD,0xDD,0xDD,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x8E,0xED,0xDD,0xDD,0xCC,0xBC,0xCC,0xDC,0xCC,0xCC,0xCB,0xCB,0xCC,0xCD,0xDC, + 0xDD,0xCA,0xA9,0x99,0x99,0x99,0x9B,0x85,0x45,0x44,0x54,0x44,0x47,0x77,0x77,0x87, + 0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x77,0x77,0x77,0x77,0x67,0x66,0x76,0x67,0x77,0x77,0x77,0x55,0x55,0x57,0x76,0x55, + 0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x65,0x56,0x65,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x65,0x54,0x44,0x54,0x44,0x55,0x7A,0x98,0x99,0x99,0x99,0xAA, + 0xAB,0xBB,0xBA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xBB,0xBD,0xDE,0xDD,0xDD,0xCD,0xCD, + 0xBD,0xDD,0xDD,0xDD,0xCB,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x8E,0xEE,0xDD,0xBC,0xCC,0xDD,0xDD,0xCD,0xBD,0xCC,0xCC,0xCD,0xBD,0xCD,0xCD, + 0xCD,0xCB,0xAA,0x99,0x99,0x98,0x9A,0x75,0x54,0x45,0x44,0x55,0x77,0x78,0x77,0x77, + 0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66, + 0x67,0x77,0x77,0x77,0x77,0x76,0x77,0x66,0x77,0x77,0x65,0x56,0x66,0x65,0x66,0x66, + 0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x76,0x56,0x56,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x44,0x44,0x44,0x44,0x54,0x55,0x89,0x88,0x9A,0xA9,0x9A,0xAB, + 0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xAB,0xAB,0xCD,0xDD,0xDE,0xDD,0xDC,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0x9E,0xEE,0xDC,0xDB,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xCD,0xCC,0xDC,0xDD,0xCD, + 0xCC,0xDC,0xCB,0x99,0x99,0x99,0xA9,0x65,0x45,0x44,0x45,0x57,0x78,0x77,0x87,0x87, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x67,0x67,0x77,0x77,0x76,0x76,0x66,0x66,0x77,0x76,0x55,0x66,0x77,0x65,0x57,0x66, + 0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x65,0x44,0x44,0x54,0x44,0x44,0x56,0x9A,0x89,0x99,0xAA,0xAB,0xAB, + 0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xCC,0xDC,0xDD,0xDD,0xDC,0xCB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0xAE,0xEE,0xDD,0xCD,0xCD,0xCD,0xDB,0xDB,0xDD,0xDD,0xDD,0xDC,0xCD,0xCD,0xBC, + 0xCD,0xCD,0xDB,0xB9,0x99,0x99,0xA8,0x65,0x44,0x54,0x45,0x67,0x87,0x77,0x77,0x77, + 0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x77,0x66, + 0x77,0x76,0x67,0x76,0x66,0x66,0x66,0x77,0x77,0x65,0x56,0x67,0x77,0x66,0x56,0x76, + 0x55,0x67,0x77,0x77,0x77,0x77,0x67,0x76,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x75,0x44,0x54,0x44,0x44,0x45,0x45,0x57,0xA9,0x99,0x8A,0xAB,0xAB,0xBB, + 0xAB,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xBB,0xBB,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0xAE,0xEE,0xDD,0xCD,0xCD,0xDC,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCC, + 0xBC,0xCD,0xCD,0xCA,0xA9,0x99,0xA7,0x65,0x54,0x45,0x46,0x77,0x77,0x87,0x87,0x87, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x67, + 0x76,0x76,0x76,0x77,0x66,0x67,0x77,0x77,0x65,0x56,0x55,0x77,0x67,0x67,0x66,0x55, + 0x56,0x77,0x77,0x77,0x77,0x75,0x65,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x55,0x44,0x44,0x54,0x45,0x44,0x45,0x58,0xA9,0x9A,0xAA,0xAB,0xBB,0xAB, + 0xBB,0xAB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xCC,0xDD,0xDC,0xDC, + 0xCC,0xCD,0xCD,0xCD,0xDD,0xDC,0xBB,0xBE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xBE,0xEE,0xED,0xBD,0xCD,0xBD,0xDC,0xCC,0xDC,0xDD,0xCD,0xCC,0xCC,0xCC,0xCB, + 0xCB,0xCC,0xCD,0xBB,0x99,0xAA,0xA7,0x54,0x44,0x54,0x45,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x67,0x76, + 0x67,0x67,0x67,0x77,0x76,0x77,0x77,0x76,0x55,0x66,0x66,0x67,0x76,0x67,0x75,0x56, + 0x67,0x77,0x77,0x77,0x77,0x65,0x56,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x75,0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x69,0x98,0x88,0xAB,0xAB,0xBB,0xBB, + 0xAB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0xAB,0xBC,0xCC, + 0xCB,0xBC,0xCD,0xDD,0xDD,0xDC,0xCB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xBE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xBD,0xCC,0xBD,0xCD,0xBD,0xCD,0xCC, + 0xBB,0xBC,0xBC,0xCB,0xBD,0xDB,0x96,0x55,0x54,0x45,0x45,0x67,0x77,0x77,0x87,0x87, + 0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x76,0x76,0x76, + 0x66,0x66,0x76,0x67,0x76,0x67,0x76,0x65,0x55,0x67,0x76,0x56,0x77,0x65,0x55,0x56, + 0x77,0x77,0x77,0x77,0x66,0x65,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x54,0x44,0x54,0x45,0x44,0x45,0x44,0x45,0x79,0x99,0x9A,0xAB,0xBB,0xAB,0xAB, + 0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x99,0x9A,0xBB, + 0xCB,0xBB,0xCC,0xCD,0xCD,0xDD,0xCC,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xAE,0xEE,0xED,0xDC,0xDD,0xDC,0xDC,0xCC,0xDB,0xCD,0xCD,0xCC,0xDB,0xCC,0xBC, + 0xBB,0xBB,0xCB,0xBB,0xBC,0xBA,0x86,0x54,0x45,0x44,0x44,0x57,0x77,0x87,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x67,0x76, + 0x76,0x77,0x66,0x56,0x65,0x76,0x65,0x55,0x66,0x65,0x66,0x65,0x67,0x65,0x55,0x57, + 0x77,0x77,0x77,0x76,0x66,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x55,0x8A,0x89,0xAB,0xBA,0xBB,0xBB,0xBB, + 0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9,0xA9,0x99,0x99,0x99,0xA9,0x99,0x99,0x9A, + 0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDB,0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xAE,0xEE,0xED,0xDD,0xCD,0xDD,0xDC,0xDC,0xBC,0xCC,0xBD,0xCD,0xCD,0xBD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0x86,0x54,0x54,0x44,0x54,0x45,0x77,0x77,0x87,0x78, + 0x77,0x78,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x67,0x66,0x66,0x77, + 0x77,0x77,0x66,0x65,0x67,0x76,0x65,0x56,0x77,0x65,0x67,0x76,0x55,0x55,0x56,0x77, + 0x77,0x76,0x66,0x65,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75, + 0x54,0x45,0x44,0x44,0x44,0x45,0x44,0x54,0x56,0x99,0x9A,0xAA,0xAA,0xAB,0xAB,0xAB, + 0xBA,0xBB,0xBB,0xBB,0xCC,0xBB,0xAA,0xAA,0x99,0x99,0x99,0xA9,0x99,0x99,0xA9,0x99, + 0x9A,0xAB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDB,0xBB,0xCE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xAE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xBC,0xBC,0xCC,0xDC,0xDC,0xDB,0xDC,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0x85,0x54,0x44,0x54,0x44,0x45,0x57,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x66,0x76,0x67, + 0x77,0x76,0x57,0x76,0x77,0x76,0x55,0x77,0x77,0x76,0x56,0x76,0x55,0x55,0x67,0x77, + 0x77,0x76,0x55,0x66,0x57,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x54, + 0x44,0x44,0x44,0x46,0x85,0x44,0x44,0x45,0x57,0x9A,0xAA,0xBA,0xBA,0xBA,0xBB,0xBA, + 0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xAA,0x9A,0x99,0x9A,0x9A,0x99,0xA9,0xA9,0x99,0x99, + 0x99,0xAA,0xAB,0xBB,0xCC,0xDD,0xCD,0xCC,0xBB,0xBD,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0xAE,0xEE,0xEE,0xDD,0xDC,0xDD,0xDC,0xCC,0xCB,0xCB,0xCD,0xCD,0xDD,0xDB,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0x85,0x54,0x54,0x45,0x45,0x44,0x45,0x77,0x77,0x77, + 0x87,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x66,0x77,0x77,0x77,0x77,0x77,0x76,0x65, + 0x65,0x65,0x77,0x77,0x77,0x55,0x67,0x77,0x76,0x77,0x65,0x55,0x55,0x57,0x77,0x77, + 0x77,0x76,0x65,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x54, + 0x54,0x44,0x44,0x46,0x86,0x44,0x45,0x45,0x68,0xAA,0xBA,0xAA,0xAB,0xAA,0xBA,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xCB,0xBA,0xAA,0xA9,0x99,0xA9,0x99,0xA9,0xA9,0x99,0xA9,0x99, + 0x99,0x9A,0xAA,0xBB,0xBB,0xCD,0xDD,0xDD,0xCB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0x8E,0xEE,0xFE,0xED,0xDD,0xDC,0xDB,0xBB,0xBB,0xCD,0xDC,0xDD,0xCD,0xCD,0xBC, + 0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0x85,0x54,0x45,0x44,0x44,0x45,0x45,0x67,0x77,0x87, + 0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x66,0x66,0x76,0x67,0x77,0x77,0x77,0x66, + 0x56,0x67,0x77,0x77,0x65,0x66,0x77,0x77,0x76,0x67,0x65,0x55,0x57,0x77,0x77,0x77, + 0x76,0x66,0x76,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44, + 0x44,0x44,0x68,0x74,0x49,0x85,0x44,0x55,0x7A,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xBB,0xBB,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xA9,0x9A,0x99,0x9A,0x99, + 0xA9,0x99,0xAA,0xAB,0xBB,0xCC,0xDD,0xCD,0xCB,0xBB,0xCE,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0x8D,0xEE,0xEE,0xED,0xDD,0xCD,0xCD,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDC,0xDC, + 0xCB,0xBB,0xBA,0xAA,0xBB,0xBC,0x85,0x54,0x54,0x44,0x45,0x44,0x44,0x47,0x77,0x77, + 0x77,0x87,0x78,0x78,0x77,0x77,0x87,0x77,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x76, + 0x76,0x77,0x77,0x77,0x66,0x56,0x77,0x66,0x76,0x66,0x55,0x55,0x77,0x77,0x77,0x77, + 0x66,0x65,0x67,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44, + 0x45,0x47,0x99,0x97,0x47,0xA8,0x44,0x56,0x8B,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0xA9,0xAB,0xB9,0xA9,0x9A,0x9A,0x99, + 0x99,0x99,0x99,0xAA,0xBB,0xBC,0xCD,0xDD,0xDC,0xCB,0xBC,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0x8C,0xEE,0xEE,0xEE,0xDD,0xDD,0xDB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDC,0xDD,0xCC, + 0xCB,0xBB,0xBA,0xAB,0xBB,0xBC,0x85,0x54,0x45,0x45,0x44,0x44,0x54,0x55,0x77,0x77, + 0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x87,0x77,0x66,0x66,0x66,0x65,0x67,0x77,0x77, + 0x76,0x77,0x77,0x76,0x55,0x55,0x67,0x76,0x67,0x65,0x55,0x67,0x77,0x77,0x77,0x66, + 0x55,0x77,0x67,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x75,0x44,0x44,0x54, + 0x44,0x89,0x86,0x8A,0x74,0x66,0x55,0x57,0xAB,0xBB,0xBA,0xAB,0xAB,0xBB,0xBB,0xCC, + 0xCC,0xBB,0xBB,0xBB,0xBA,0xAA,0xA9,0x9A,0x9A,0x9A,0x9A,0xCB,0xA9,0xA9,0x99,0x9A, + 0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xCC,0xDD,0xDD,0xBB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD8,0x7B,0xEE,0xEF,0xEE,0xED,0xDD,0xCD,0xCB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDC,0xDD, + 0xCB,0xBB,0xBB,0xAA,0xAB,0xBB,0x85,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x57,0x77, + 0x77,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x77,0x77,0x67,0x77,0x66,0x66,0x67,0x77, + 0x66,0x77,0x77,0x76,0x55,0x55,0x56,0x77,0x65,0x55,0x56,0x77,0x77,0x77,0x76,0x77, + 0x65,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x54,0x44,0x54,0x44, + 0x44,0x7A,0x84,0x48,0xA6,0x44,0x45,0x69,0xBC,0xCC,0xBA,0xAA,0xBB,0xBB,0xCB,0xCC, + 0xDC,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0x99,0x9A,0x99,0xA9,0xAB,0xDC,0x9A,0xA9,0xA9, + 0xA9,0x99,0x9A,0xAA,0xAA,0xBB,0xBD,0xCD,0xCD,0xDC,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x79,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCB,0xBB,0xBB,0xDD,0xCD,0xDC,0xDD,0xBD, + 0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0x75,0x54,0x45,0x45,0x44,0x44,0x54,0x44,0x55,0x77, + 0x77,0x77,0x77,0x77,0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x65,0x66,0x67, + 0x65,0x77,0x77,0x65,0x55,0x55,0x55,0x67,0x65,0x55,0x77,0x77,0x77,0x76,0x77,0x65, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x54,0x44,0x46, + 0x96,0x48,0xA8,0x45,0x65,0x45,0x55,0x7A,0xBB,0xCD,0xBA,0xBB,0xBB,0xBC,0xCD,0xDD, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xAA,0xA9,0x99,0xA9,0xA9,0x99,0xAA,0xCD,0xCA,0xA9,0x99, + 0x99,0xA9,0x9A,0xAA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDC,0xCB,0xBB,0xDE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0x79,0xDD,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC,0xBA,0xBB,0xBC,0xDC,0xDD,0xCD,0xDC, + 0xDC,0xBB,0xBC,0xAB,0xAB,0xBB,0x75,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x67, + 0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x66,0x56, + 0x67,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x65,0x57,0x65, + 0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x87,0x77,0x76,0x54,0x44,0x44,0x45,0x44, + 0x87,0x54,0x8A,0x74,0x44,0x45,0x66,0x9A,0xBB,0xBA,0xAD,0xBB,0xBC,0xCD,0xDD,0xDD, + 0xDD,0xCB,0xBB,0xBB,0xBA,0xBA,0xA9,0x99,0xA9,0xAA,0x9A,0x9A,0xAA,0xDC,0xAA,0xA9, + 0xA9,0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xCC,0xDC,0xDD,0xCC,0xBB,0xCE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0x78,0xCE,0xEE,0xEE,0xEE,0xED,0xDD,0xDB,0xBB,0xAB,0xBB,0xCD,0xDC,0xDC,0xDC, + 0xCC,0xBB,0xBB,0xAB,0xAB,0xBB,0x85,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x44,0x56, + 0x77,0x77,0x77,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x77, + 0x67,0x77,0x77,0x75,0x55,0x55,0x56,0x56,0x77,0x77,0x77,0x77,0x66,0x76,0x56,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x54,0x44,0x54,0x44,0x68,0x85, + 0x48,0xA6,0x47,0x64,0x45,0x45,0x68,0xBB,0xBB,0xAB,0xBC,0xBB,0xDC,0xDD,0xDE,0xDD, + 0xDC,0xCB,0xBB,0xAB,0xAB,0xBB,0xAA,0x99,0xAA,0x9A,0x99,0xAA,0x9A,0xAB,0xBA,0xA9, + 0x9A,0x99,0x9A,0xAA,0xAA,0xAB,0xAB,0xBC,0xDD,0xDD,0xDB,0xBB,0xBC,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0x88,0xBD,0xEE,0xEF,0xEE,0xED,0xDD,0xDD,0xCB,0xAA,0xAB,0xBC,0xCD,0xDD,0xDC, + 0xDC,0xBB,0xBB,0xBA,0xBB,0xBB,0x85,0x54,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x44, + 0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x78,0x77,0x78,0x77,0x87,0x87,0x87,0x77,0x78, + 0x77,0x78,0x77,0x76,0x65,0x55,0x67,0x77,0x77,0x77,0x67,0x76,0x65,0x76,0x57,0x77, + 0x87,0x87,0x77,0x87,0x87,0x87,0x77,0x77,0x77,0x75,0x45,0x44,0x44,0x47,0x99,0x98, + 0x55,0x99,0x44,0x45,0x44,0x55,0x79,0xBB,0xCB,0xAA,0xBB,0xBC,0xCD,0xDD,0xED,0xED, + 0xDD,0xCB,0xBA,0xBA,0xBA,0xBB,0xA9,0x99,0xA9,0xAA,0x9A,0x9A,0xAA,0xAA,0xAB,0xA9, + 0xA9,0x99,0x9A,0xBA,0xAA,0xAA,0xBB,0xBC,0xCB,0xDC,0xDD,0xCB,0xBB,0xCE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0x98,0xBD,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xBB,0xAA,0xAA,0xBC,0xCD,0xDD,0xDC, + 0xDB,0xCB,0xBB,0xAA,0xBA,0xBB,0x85,0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x54,0x45, + 0x57,0x77,0x77,0x87,0x87,0x77,0x87,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x87,0x77, + 0x78,0x77,0x78,0x77,0x76,0x77,0x77,0x77,0x77,0x66,0x76,0x67,0x65,0x67,0x77,0x77, + 0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x76,0x54,0x44,0x45,0x45,0x89,0x96,0x7A, + 0x84,0x56,0x54,0x54,0x45,0x56,0x8A,0xAA,0xBB,0xAB,0xAB,0xBC,0xDD,0xDE,0xDE,0xDD, + 0xDC,0xBB,0xBA,0xBA,0xBB,0xBB,0xAA,0x89,0x9A,0xAA,0xA9,0xA9,0xAA,0x99,0x9A,0x9A, + 0x9A,0x99,0x9A,0xAA,0xAA,0xBB,0xAB,0xBB,0xCD,0xDD,0xDD,0xDB,0xBB,0xBD,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xAB,0xA8,0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBA,0xAB,0xCB,0xDC,0xDD,0xCD, + 0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0x86,0x55,0x44,0x45,0x45,0x44,0x54,0x54,0x44,0x44, + 0x45,0x77,0x87,0x77,0x77,0x87,0x77,0x87,0x77,0x87,0x87,0x77,0x87,0x78,0x77,0x78, + 0x77,0x78,0x77,0x78,0x77,0x77,0x87,0x77,0x76,0x67,0x77,0x66,0x76,0x67,0x77,0x87, + 0x77,0x87,0x77,0x77,0x87,0x87,0x77,0x77,0x64,0x44,0x44,0x44,0x68,0x99,0x96,0x47, + 0xA7,0x44,0x44,0x44,0x55,0x67,0x9A,0xAA,0x9A,0xAD,0xBB,0xBD,0xCD,0xDD,0xED,0xDD, + 0xDD,0xBB,0xBA,0xBA,0xBA,0xBB,0xAA,0x89,0x9A,0xAA,0xAA,0x9A,0xAA,0xAA,0x9A,0x9A, + 0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xBB,0xCB,0xCC,0xCC,0xDD,0xCD,0xCB,0xBB,0xDE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xD8,0xDD,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBA,0xAB,0xBC,0xDB,0xDC,0xDC, + 0xDB,0xBB,0xCC,0xBB,0xBB,0xBB,0x86,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x57,0x77,0x87,0x87,0x78,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x87,0x78,0x77, + 0x78,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x76,0x66,0x66,0x77,0x67,0x87,0x87,0x77, + 0x87,0x77,0x87,0x87,0x77,0x77,0x77,0x75,0x45,0x44,0x54,0x55,0x99,0x76,0x99,0x64, + 0x65,0x44,0x54,0x54,0x55,0x79,0xCA,0xAA,0xA9,0xAA,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD, + 0xCC,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA,0x99,0x9A,0xAB,0xAA,0xA9,0xAA,0x9A,0xA9,0x9A, + 0x9A,0x99,0x9A,0xAB,0xBB,0xAB,0xBB,0xBC,0xBC,0xCD,0xDD,0xDD,0xBC,0xBB,0xCE,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xC8,0xBE,0xCD,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xBB,0xDC,0xBD,0xBD,0xBD, + 0xBC,0xCC,0xCC,0xDC,0xCB,0xBB,0x96,0x54,0x54,0x54,0x54,0x54,0x45,0x44,0x54,0x45, + 0x44,0x45,0x77,0x77,0x78,0x77,0x87,0x87,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x78, + 0x77,0x87,0x77,0x87,0x87,0x77,0x87,0x87,0x77,0x66,0x67,0x67,0x77,0x77,0x77,0x87, + 0x77,0x87,0x77,0x77,0x78,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x89,0x84,0x69,0x84, + 0x44,0x44,0x44,0x45,0x56,0x8D,0xEE,0xDA,0xAA,0xAA,0xAB,0xBD,0xCC,0xDD,0xDD,0xCD, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xA8,0x99,0xBE,0xEC,0xAA,0x99,0xA9,0xAA,0xA9, + 0xA9,0x99,0xAA,0xAB,0xBA,0xBB,0xAB,0xBB,0xCB,0xBC,0xCC,0xDD,0xDC,0xBB,0xBC,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0x9E,0xDD,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xCD,0xBC,0xCC,0xCC,0xDC, + 0xDC,0xCC,0xDD,0xDD,0xCC,0xBB,0xA7,0x55,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x45,0x67,0x78,0x77,0x78,0x77,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77, + 0x87,0x78,0x78,0x77,0x77,0x87,0x77,0x77,0x76,0x76,0x67,0x77,0x87,0x87,0x87,0x78, + 0x78,0x77,0x87,0x87,0x87,0x77,0x65,0x44,0x54,0x54,0x55,0x44,0x48,0xA7,0x45,0x65, + 0x44,0x54,0x54,0x55,0x67,0x9B,0xCE,0xED,0xAA,0xAA,0xBB,0xCC,0xDD,0xDD,0xCD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xB9,0x99,0xAD,0xED,0xBA,0xA9,0xAA,0x9A,0x9A, + 0x99,0x99,0x9A,0xBB,0xAB,0xAA,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xBB,0xBB,0xDE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAC,0x9E,0xEC,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xCB,0xDB,0xDC,0xCC,0xCC, + 0xCC,0xDD,0xCD,0xCC,0xCC,0xBB,0xA7,0x55,0x44,0x45,0x44,0x54,0x45,0x44,0x44,0x44, + 0x54,0x44,0x56,0x77,0x78,0x77,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87, + 0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x77,0x78,0x77,0x87, + 0x77,0x78,0x77,0x77,0x77,0x75,0x44,0x44,0x44,0x57,0xB8,0x54,0x45,0x8A,0x55,0x44, + 0x44,0x44,0x45,0x55,0x78,0xAB,0xAA,0xAB,0xBB,0xAB,0xBB,0xBD,0xBD,0xCD,0xDC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0x99,0x99,0xAA,0xBA,0xAA,0x9A,0xA9,0xA9, + 0x99,0x99,0xAA,0xBB,0xBB,0xAB,0xAA,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xCD,0xBB,0xBD, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xAB,0x9C,0xED,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xBC,0xDB,0xBC,0xCC,0xBC,0xCC, + 0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xB8,0x65,0x54,0x54,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x44,0x45,0x67,0x77,0x87,0x87,0x78,0x78,0x78,0x77,0x78,0x77,0x87,0x87,0x87, + 0x87,0x78,0x78,0x78,0x77,0x87,0x76,0x77,0x77,0x66,0x77,0x77,0x87,0x87,0x78,0x78, + 0x78,0x77,0x87,0x87,0x77,0x54,0x54,0x54,0x45,0x7D,0xEE,0xA5,0x44,0x56,0x44,0x44, + 0x54,0x45,0x45,0x56,0x89,0x99,0xAA,0xAA,0xCA,0xBB,0xBB,0xBC,0xDD,0xDC,0xCC,0xBB, + 0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xCC,0xBB,0xA8,0x99,0x99,0x9A,0xAA,0xAA,0x9A,0x99, + 0x99,0x99,0xAB,0xAB,0xBA,0xAA,0xAB,0xBA,0xBA,0xBB,0xBB,0xCD,0xDD,0xDB,0xBB,0xBB, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xAA,0xBA,0xEE,0xDD,0xDE,0xEE,0xEE,0xED,0xDD,0xDC,0xCD,0xDC,0xBB,0xCB,0xBD, + 0xCD,0xCC,0xBB,0xBB,0xAB,0xAB,0xB8,0x65,0x45,0x44,0x54,0x54,0x54,0x54,0x44,0x44, + 0x44,0x54,0x44,0x57,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x77,0x78, + 0x77,0x87,0x87,0x77,0x87,0x77,0x66,0x77,0x77,0x77,0x87,0x87,0x78,0x77,0x87,0x87, + 0x77,0x78,0x77,0x77,0x65,0x44,0x44,0x44,0x5B,0xCC,0x7B,0xEA,0x54,0x44,0x45,0x44, + 0x44,0x54,0x55,0x68,0x99,0x99,0x99,0xAA,0xAB,0xCC,0xBC,0xBC,0xCC,0xCC,0xBB,0xBB, + 0xBA,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xCB,0xBA,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x98,0x89,0xBB,0xBB,0xAA,0xAA,0xBA,0xAB,0xBA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDC,0xBB, + 0xCE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBA,0xC9,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xDD,0xCD,0xCD,0xCB,0xBB,0xBC,0xDB, + 0xDB,0xCB,0xBB,0xAA,0xAB,0xBB,0xA9,0x75,0x54,0x45,0x44,0x44,0x44,0x44,0x54,0x45, + 0x44,0x44,0x44,0x45,0x77,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x78,0x77, + 0x87,0x78,0x78,0x78,0x77,0x67,0x77,0x67,0x67,0x78,0x77,0x87,0x87,0x87,0x87,0x78, + 0x78,0x77,0x87,0x75,0x54,0x54,0x54,0x55,0x5A,0xEC,0x65,0xBE,0x84,0x45,0x44,0x44, + 0x45,0x45,0x56,0x89,0x9A,0xA9,0x9A,0xAA,0xAB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xCB,0xB9,0x99,0x89,0x99,0x99,0x99,0x88, + 0x88,0x8A,0xBB,0xBB,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAB,0xBB,0xCD,0xDD,0xCC,0xBB, + 0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBA,0xAA,0xCE,0xED,0xDD,0xEE,0xEE,0xEE,0xED,0xDC,0xDC,0xDD,0xCB,0xBC,0xCC, + 0xCB,0xBB,0xBA,0xBA,0xBA,0xBB,0xB9,0x75,0x54,0x54,0x44,0x54,0x45,0x44,0x44,0x44, + 0x54,0x44,0x45,0x44,0x57,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x78, + 0x78,0x78,0x77,0x87,0x77,0x55,0x77,0x67,0x77,0x87,0x78,0x77,0x87,0x87,0x78,0x78, + 0x77,0x87,0x77,0x54,0x44,0x44,0x46,0x9B,0xA8,0xAE,0xA6,0x68,0x55,0x44,0x44,0x54, + 0x54,0x56,0x67,0x9A,0xAA,0xAA,0x99,0xAA,0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xBA,0xBA,0xAB,0xAB,0xBB,0xCB,0xBC,0xBB,0x98,0x88,0x98,0x88,0x88,0x88, + 0x88,0x8A,0xBC,0xCB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBB,0xCC,0xDD,0xDD,0xCB, + 0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBA,0x9C,0x9E,0xEE,0xDD,0xED,0xEE,0xEE,0xDD,0xDD,0xDD,0xDC,0xBC,0xDB,0xCB, + 0xBB,0xBB,0xBB,0xBA,0xAB,0xBC,0xBB,0x86,0x55,0x45,0x45,0x44,0x54,0x45,0x44,0x45, + 0x44,0x54,0x44,0x44,0x55,0x77,0x77,0x87,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x87, + 0x78,0x77,0x87,0x77,0x77,0x65,0x57,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77, + 0x87,0x87,0x64,0x45,0x45,0x45,0x5A,0xEB,0xEE,0x8A,0xFA,0x54,0x44,0x44,0x54,0x44, + 0x45,0x56,0x79,0x9B,0xBA,0xA9,0x9A,0xAA,0xBB,0xBC,0xCC,0xCB,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBA,0xBA,0xAA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xCB,0x99,0x98,0x89,0x89,0x88, + 0x9A,0xBB,0xCC,0xBC,0xBB,0xBB,0xBA,0xBA,0xAA,0x9A,0xAA,0xBA,0xBB,0xCD,0xDD,0xBB, + 0xBB,0xBD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xAB,0x9B,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xDD,0xDD,0xCD,0xDC,0xCC,0xCB, + 0xBB,0xAB,0xBB,0xAB,0xBB,0xCC,0xCB,0x97,0x55,0x45,0x44,0x54,0x44,0x44,0x45,0x44, + 0x44,0x44,0x45,0x45,0x44,0x57,0x78,0x77,0x87,0x78,0x78,0x78,0x77,0x87,0x87,0x78, + 0x77,0x78,0x77,0x66,0x67,0x77,0x57,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x78, + 0x77,0x75,0x45,0x44,0x44,0x44,0x7E,0xA5,0x8E,0xB6,0x97,0x55,0x45,0x44,0x44,0x44, + 0x55,0x67,0x8A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCB,0xBB,0xAB,0xAA,0xBA, + 0xBB,0xAB,0xBA,0xBA,0xAA,0xBB,0xBB,0xBB,0xCB,0xDC,0xCC,0xCC,0xBA,0xA9,0x99,0x9A, + 0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0x9A,0xAA,0xAB,0xAB,0xBD,0xCD,0xDD, + 0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xCB,0xA9,0xB9,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xCD,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xCD,0xCB,0xA8,0x65,0x44,0x54,0x45,0x44,0x54,0x44,0x45, + 0x44,0x44,0x44,0x44,0x44,0x55,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x78,0x78, + 0x78,0x77,0x77,0x65,0x66,0x77,0x77,0x87,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x87, + 0x77,0x54,0x44,0x45,0x45,0x87,0x7E,0xC7,0x6E,0xC5,0x44,0x44,0x44,0x45,0x45,0x45, + 0x55,0x78,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xDD,0xCB,0xBA,0xAA,0xAA,0xBA, + 0xBA,0xBB,0xAB,0xAA,0xBA,0xBB,0xBB,0xBA,0xBB,0xCC,0xDB,0xDD,0xDD,0xDD,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBA,0xA9,0xA9,0xAA,0xAA,0xBB,0xBC,0xDD,0xDC, + 0xCB,0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xCB,0xAA,0xB9,0xBE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xDD,0xCD,0xCC,0xDC,0xBC, + 0xBB,0xBB,0xCB,0xBB,0xBB,0xBD,0xBA,0x98,0x65,0x55,0x45,0x44,0x44,0x44,0x45,0x44, + 0x45,0x44,0x44,0x44,0x54,0x45,0x57,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x77, + 0x87,0x76,0x67,0x75,0x57,0x87,0x87,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x65,0x54,0x54,0x54,0x5A,0xFE,0x8A,0xFD,0xCE,0x84,0x45,0x45,0x45,0x44,0x44,0x54, + 0x57,0x99,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xBA,0xBB,0xCC,0xCB,0xBB,0xAB,0xAA,0xAA, + 0xBA,0xAB,0xAB,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBD,0xCD,0xDE,0xEE,0xED,0xDC,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xAA,0xAB,0xAB,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xBB,0xCD,0xDD, + 0xDC,0xBB,0xBD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDB,0xBA,0x9C,0x9E,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xED,0xDC,0xDC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBA,0x99,0x75,0x54,0x54,0x45,0x45,0x45,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x44,0x55,0x77,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x87,0x65,0x77,0x77,0x67,0x78,0x78,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x75, + 0x44,0x44,0x44,0x58,0x9D,0xCE,0xE8,0x8B,0xB8,0x54,0x54,0x44,0x44,0x54,0x55,0x56, + 0x79,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBA,0xAA,0xAB,0xAB, + 0xAB,0xBA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xEE,0xED,0xDB,0xBB, + 0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xA9,0xA9,0xAA,0xAB,0xBB,0xBB,0xBC,0xDD, + 0xDC,0xCB,0xBB,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDC,0xBA,0xAA,0x9A,0xEE,0xEC,0xDD,0xDD,0xEE,0xEE,0xDD,0xDC,0xDD,0xDC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBA,0xA9,0x99,0x99,0x86,0x55,0x54,0x54,0x44,0x44,0x45,0x45, + 0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x67,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87, + 0x76,0x65,0x67,0x87,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x54, + 0x54,0x45,0x45,0x8E,0xEE,0x77,0xEE,0x74,0x54,0x44,0x44,0x54,0x54,0x44,0x55,0x67, + 0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBD,0xCC,0xDD,0xED,0xDD,0xCB,0xBB, + 0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xAA,0xAA,0x9A,0xAA,0xAB,0xBC,0xBB,0xBB,0xCD, + 0xDD,0xCC,0xBB,0xCE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xBB,0xA9,0xB8,0xDE,0xED,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xDD,0xBB, + 0xBB,0xAB,0xAB,0xAA,0xAA,0x99,0x99,0x99,0x97,0x55,0x54,0x45,0x45,0x44,0x44,0x44, + 0x44,0x44,0x54,0x45,0x44,0x44,0x45,0x56,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x77,0x76,0x57,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x54,0x44, + 0x89,0x54,0x6A,0xCD,0xAE,0xD6,0x8D,0x84,0x44,0x54,0x54,0x44,0x45,0x45,0x56,0x79, + 0x9A,0xAA,0xAA,0xAA,0xAA,0xBB,0xAB,0xAA,0xAA,0xAB,0xAB,0xBA,0xBA,0xAA,0xBA,0xAA, + 0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xCB,0xBB,0xBC,0xBC,0xCD,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xAB,0xAB,0xAB,0xBB,0xBA,0xBA,0xBA,0xAA,0x9A,0xAA,0xAA,0xAB,0xDD,0xCB,0xBB,0xCD, + 0xDD,0xDB,0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xBB,0xA9,0xAA,0x9E,0xEE,0xCD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCB, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x88,0x65,0x54,0x54,0x44,0x45,0x44,0x45, + 0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x67,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x77,0x67,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x75,0x54,0x55, + 0xBC,0x55,0x5B,0xEA,0x59,0xFD,0x65,0x54,0x54,0x44,0x45,0x44,0x54,0x55,0x68,0x9A, + 0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBA,0xBB,0xBC,0xBC,0xBB,0xBC,0xCB,0xBC,0xDD,0xDD,0xDC,0xBB,0xBA, + 0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xCD,0xDD,0xCB,0xBB, + 0xDD,0xDD,0xCB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDB,0xBA,0x9B,0x8C,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDB, + 0xBA,0xAA,0xA9,0xA9,0xA9,0xA9,0x99,0x99,0x98,0x76,0x55,0x44,0x54,0x44,0x45,0x44, + 0x44,0x45,0x44,0x54,0x45,0x44,0x45,0x45,0x56,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x76,0x54,0x44,0x47, + 0xD8,0x8B,0x87,0xCE,0x85,0xAB,0x65,0x44,0x45,0x45,0x44,0x54,0x45,0x56,0x89,0xAA, + 0xBB,0xBA,0xAA,0xAA,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBC,0xBC,0xBB,0xBA,0xBB,0xCC,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xCC,0xBB, + 0xCD,0xDD,0xCB,0xBB,0xBD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xDC,0xBA,0xAA,0xB9,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC, + 0xBA,0xA9,0x99,0x99,0x99,0xAA,0xA9,0x99,0x99,0x87,0x55,0x55,0x45,0x45,0x44,0x45, + 0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x78,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x88,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x54,0x54,0x54,0x56, + 0x7A,0xED,0xEB,0x7D,0xE8,0x45,0x44,0x45,0x44,0x44,0x45,0x45,0x55,0x78,0xAA,0xAB, + 0xCC,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBC,0xBB,0xBB,0xAB,0xBB,0xBB,0xCB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBA, + 0xBA,0xBA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xAB,0xBC,0xDC,0xBB, + 0xCB,0xDD,0xDD,0xCB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xDC,0xBB,0xA9,0xB9,0xBE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xBA,0x99,0x99,0x98,0x99,0x9A,0xA9,0x99,0x9A,0x98,0x65,0x54,0x44,0x44,0x45,0x44, + 0x44,0x45,0x45,0x44,0x54,0x44,0x44,0x54,0x45,0x57,0x88,0x78,0x78,0x87,0x87,0x87, + 0x87,0x87,0x87,0x88,0x78,0x87,0x88,0x78,0x78,0x87,0x88,0x75,0x45,0x55,0x55,0x55, + 0x6E,0xB9,0xEB,0x77,0xB8,0x54,0x54,0x54,0x45,0x45,0x44,0x55,0x57,0x8A,0xBA,0xCD, + 0xDA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xBC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBA,0xBB, + 0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xBB,0xCD,0xCB, + 0xBC,0xDD,0xDD,0xBB,0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xED,0xBB,0xAA,0x9B,0x8D,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xCB,0xA9,0x99,0x99,0x99,0x99,0xAA,0x9A,0xAA,0xA9,0x76,0x55,0x55,0x45,0x54,0x45, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x78,0x87,0x87,0x87,0x87,0x87, + 0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x75,0x54,0x45,0x8C,0x75,0x8A, + 0x7D,0xEE,0x98,0xD7,0x54,0x54,0x45,0x44,0x54,0x44,0x55,0x56,0x79,0xBB,0xBD,0xDD, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xCC,0xCD,0xCC,0xCB,0xAB,0xAB,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xAB,0xBA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0x9A,0x9A,0xAB,0xBD,0xCD, + 0xCC,0xBD,0xDD,0xDC,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xDB,0xBA,0x9A,0xAA,0xEE,0xED,0xDE,0xDE,0xEE,0xEF,0xEE,0xDD,0xDD, + 0xDB,0xA9,0x99,0x89,0x89,0x9A,0xAA,0xAA,0xAB,0xBB,0xA7,0x75,0x54,0x44,0x44,0x54, + 0x44,0x45,0x44,0x54,0x45,0x44,0x54,0x54,0x44,0x45,0x57,0x87,0x87,0x87,0x88,0x78, + 0x78,0x78,0x88,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x54,0x44,0x55,0x9E,0xD7,0xBE, + 0x77,0xEE,0xCE,0xA5,0x54,0x45,0x45,0x45,0x45,0x45,0x55,0x68,0xBD,0xED,0xDD,0xCA, + 0xAA,0xAB,0xBB,0xBC,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBC,0xDB,0xCB,0xCD,0xCB,0xBB,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBA,0xAA,0xAA,0xA9,0xAA,0xAB,0xDD, + 0xCC,0xCC,0xDD,0xDC,0xCB,0xBB,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xED,0xDC,0xBA,0xA9,0xB8,0xDE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xBA,0x99,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBA,0x87,0x55,0x54,0x54,0x44, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x78,0x87,0x87,0x87,0x88, + 0x78,0x87,0x87,0x88,0x78,0x78,0x87,0x88,0x88,0x64,0x54,0x45,0x45,0x49,0xFD,0xAE, + 0xA7,0x79,0xA8,0x55,0x44,0x54,0x54,0x54,0x54,0x55,0x67,0x8A,0xEE,0xEE,0xEC,0xAA, + 0xAA,0xBB,0xBC,0xCB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xCC,0xCB,0xBB,0xBC,0xCC,0xBB,0xAB,0xBA,0xBA,0xBA,0xBA,0xAB,0xBB,0xBA,0xBA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xAA,0x9A,0xAA,0xAA,0x9A,0xAB,0xBD, + 0xDD,0xBD,0xCD,0xDD,0xCB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xDD,0xBB,0xA9,0xAB,0x9E,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xBB,0xA9,0x99,0x99,0x9A,0xAB,0xBA,0xBC,0xCC,0xBC,0x97,0x65,0x55,0x45,0x45, + 0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x54,0x44,0x54,0x45,0x57,0x88,0x87,0x88,0x78, + 0x87,0x88,0x78,0x78,0x88,0x78,0x78,0x78,0x75,0x45,0x44,0x54,0x55,0x55,0xAF,0xEE, + 0xEE,0xB7,0x44,0x44,0x45,0x44,0x54,0x54,0x55,0x56,0x89,0xAA,0xBE,0xEE,0xBA,0xAA, + 0xAB,0xBC,0xCC,0xBB,0xBB,0xBB,0xAB,0xAA,0xBA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAB,0xBC, + 0xCB,0xBB,0xBB,0xBB,0xCC,0xBB,0xAA,0xAB,0xAB,0xBB,0xAB,0xAA,0xAB,0xAB,0xBB,0xBA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xCD, + 0xDD,0xDC,0xCD,0xDD,0xDB,0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xED,0xCB,0xAA,0x9A,0x9B,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDB,0xA9,0x99,0x9A,0xAA,0xBB,0xBC,0xCC,0xCB,0xCB,0xBA,0x76,0x55,0x45,0x44, + 0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x78,0x78,0x87,0x88, + 0x78,0x78,0x87,0x87,0x87,0x87,0x88,0x86,0x54,0x44,0x54,0x55,0x6A,0xCA,0x8A,0xEC, + 0x9C,0xA6,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x78,0xBA,0xAA,0xAA,0xDD,0xAA,0xAA, + 0xBC,0xBD,0xCB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAB,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xAB,0xAB, + 0xAB,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC,0xBD,0xCB,0xAA,0xAA,0xAB,0xAA,0xAA,0xAB,0xCD, + 0xEE,0xED,0xCB,0xDC,0xDD,0xCB,0xBB,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x99,0xC8,0xDE,0xEE,0xDD,0xEE,0xEE,0xFE,0xEE,0xDD, + 0xDD,0xDD,0xBA,0x9A,0xAA,0xBB,0xBC,0xDB,0xDB,0xDD,0xCC,0xBB,0x97,0x75,0x55,0x45, + 0x44,0x54,0x45,0x45,0x44,0x54,0x54,0x45,0x44,0x54,0x54,0x44,0x57,0x88,0x78,0x87, + 0x88,0x87,0x88,0x88,0x78,0x78,0x87,0x55,0x45,0x55,0x55,0x56,0xDE,0xDE,0xD8,0xCF, + 0x95,0x54,0x54,0x54,0x54,0x54,0x55,0x56,0x68,0xAD,0xDD,0xAA,0xBA,0xAA,0xAA,0xBB, + 0xDC,0xDC,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAB,0xBB,0xCB, + 0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB, + 0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCC,0xDC,0xCB,0xBA,0xAA,0xAB,0xAA,0xAA,0xBC,0xDE, + 0xEE,0xEE,0xDB,0xCD,0xDD,0xCB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xBA,0xA9,0x9A,0xAE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xBB,0xAA,0xAB,0xBB,0xDC,0xDC,0xCC,0xCD,0xDD,0xCB,0xBA,0x77,0x55,0x45, + 0x45,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x45,0x78,0x87,0x88, + 0x78,0x78,0x87,0x87,0x88,0x88,0x65,0x44,0x44,0x57,0xA9,0x68,0xE9,0x59,0xFB,0x6A, + 0x75,0x45,0x45,0x45,0x44,0x55,0x56,0x77,0x8B,0xDD,0xED,0xDB,0xAA,0xAA,0xAB,0xBC, + 0xCD,0xCB,0xBB,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAB,0xBD, + 0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0xAA,0x99,0x99,0xA9,0xA9,0xAA,0xAB,0xAB,0xAB,0xAB, + 0xAB,0xBA,0xAA,0xAB,0xBB,0xCC,0xDD,0xDD,0xDC,0xBB,0xAA,0xBA,0xBB,0xBB,0xCD,0xEE, + 0xEE,0xEE,0xDD,0xCC,0xCD,0xCD,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xAA,0x9B,0x9D,0xEE,0xED,0xDE,0xEE,0xEE,0xFE,0xEE, + 0xDD,0xDD,0xDB,0xBA,0xBB,0xCD,0xCD,0xCD,0xBB,0xBD,0xED,0xCC,0xCC,0xA7,0x75,0x55, + 0x44,0x54,0x44,0x54,0x54,0x45,0x45,0x44,0x44,0x54,0x45,0x44,0x45,0x57,0x88,0x78, + 0x88,0x87,0x88,0x78,0x78,0x75,0x45,0x45,0x46,0x9E,0xFF,0xB9,0xEC,0x67,0xEC,0x54, + 0x55,0x54,0x55,0x45,0x55,0x55,0x67,0x8A,0xCD,0xDE,0xEE,0xDB,0xAA,0xAB,0xBB,0xDC, + 0xDC,0xCB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBA,0xBA,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xCC,0xBB,0xBB,0xBB,0xBA,0xBA,0x9A,0x9A,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBA,0xBA, + 0xBB,0xAB,0xAB,0xBB,0xCD,0xCD,0xCC,0xCD,0xDD,0xCB,0xAB,0xBB,0xBB,0xBD,0xDE,0xEF, + 0xEF,0xEE,0xED,0xCB,0xCD,0xDC,0xCB,0xBB,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0x99,0xB9,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xDE,0xDD,0xDD,0xBA,0xBC,0xCC,0xDC,0xCC,0xBB,0xBB,0xDC,0xDD,0xCB,0xBA,0x87,0x65, + 0x55,0x45,0x45,0x44,0x45,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x45,0x78,0x87, + 0x87,0x88,0x78,0x88,0x86,0x54,0x54,0x45,0x6B,0xFB,0x8D,0xE8,0xBE,0xDD,0xE8,0x55, + 0x55,0x45,0x45,0x55,0x55,0x66,0x8B,0xBD,0xDD,0xEE,0xED,0xBA,0xBA,0xBB,0xBD,0xCD, + 0xCB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB, + 0xCC,0xCB,0xBB,0xBA,0xAA,0x9A,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0xAA,0xAB,0xAA, + 0xAB,0xBB,0xAB,0xBC,0xDD,0xDD,0xBB,0xBB,0xDD,0xDD,0xCC,0xDC,0xCD,0xDD,0xEE,0xEE, + 0xFE,0xEF,0xEE,0xDB,0xBB,0xDD,0xCC,0xBB,0xBE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBA,0xAA,0xA9,0xBE,0xEE,0xDD,0xEE,0xEE,0xEF,0xEE, + 0xED,0xDD,0xDD,0xBB,0xBC,0xDC,0xCC,0xCC,0xCC,0xBB,0xBC,0xDE,0xCA,0xBA,0xB8,0x77, + 0x65,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x44,0x54,0x54,0x54,0x54,0x54,0x57,0x88, + 0x88,0x78,0x87,0x87,0x54,0x54,0x44,0x54,0x5C,0xFD,0x7C,0xE7,0x5A,0xDB,0x75,0x54, + 0x54,0x54,0x55,0x55,0x67,0x79,0xBC,0xDD,0xEE,0xDE,0xDB,0xBB,0xBB,0xBB,0xCC,0xCC, + 0xBB,0xBA,0xBB,0xBA,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB, + 0xCC,0xCB,0xBB,0xAA,0xA9,0xA9,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xCD,0xED,0xDC,0xBB,0xBB,0xBD,0xDD,0xEE,0xED,0xED,0xEE,0xEF,0xEE, + 0xEF,0xEE,0xEE,0xDB,0xBB,0xCD,0xDB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xA9,0x9C,0x8D,0xEE,0xED,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xCD,0xCC,0xBC,0xCC,0xCC,0xBB,0xBB,0xED,0xCB,0xCB,0xAB,0x97, + 0x77,0x55,0x55,0x45,0x45,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x45,0x78, + 0x78,0x88,0x88,0x65,0x44,0x44,0x45,0x44,0x56,0xDE,0xEE,0x95,0x54,0x45,0x45,0x44, + 0x55,0x55,0x56,0x67,0x89,0xBC,0xDD,0xDE,0xEE,0xDB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xCB,0xAB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBC,0xCB,0xBA,0xAA,0xA9,0x9A,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0xA9,0xAA,0xAA, + 0xAB,0xAB,0xBB,0xDD,0xDE,0xDC,0xBB,0xAA,0xBB,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF, + 0xFE,0xFF,0xED,0xDB,0xAA,0xBC,0xDC,0xDB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xCB,0xAA,0x9A,0xAA,0xEE,0xEE,0xDD,0xEE,0xEE,0xFE, + 0xEE,0xDE,0xDD,0xCD,0xBC,0xCB,0xCC,0xCD,0xCC,0xDB,0xBB,0xBD,0xEE,0xDD,0xBA,0xA9, + 0x87,0x76,0x65,0x54,0x54,0x45,0x44,0x54,0x45,0x44,0x54,0x54,0x54,0x44,0x45,0x57, + 0x88,0x88,0x75,0x54,0x54,0x45,0x44,0x45,0x45,0x6D,0xED,0x75,0x54,0x54,0x54,0x55, + 0x55,0x66,0x77,0x8A,0xBC,0xDD,0xDE,0xEE,0xEC,0xBB,0xBB,0xBD,0xCD,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xCA,0xBC,0xBC,0xBB,0xBB,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBC,0xBB,0xAA,0x9A,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xDD,0xED,0xDC,0xBB,0xAA,0xAA,0xBD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xBA,0xAA,0xBB,0xCD,0xCB,0xBB,0xBD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0x99,0xB9,0xBE,0xEE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xED,0xDC,0xDB,0xDC,0xCB,0xBB,0xCC,0xBD,0xCD,0xCC,0xBB,0xEF,0xED,0xAA,0xA9, + 0xA9,0x76,0x76,0x55,0x55,0x54,0x45,0x45,0x44,0x54,0x44,0x44,0x45,0x45,0x44,0x45, + 0x67,0x76,0x54,0x44,0x45,0x44,0x45,0x44,0x54,0x47,0xEE,0xB6,0x54,0x54,0x55,0x55, + 0x77,0x88,0x9A,0xBB,0xDD,0xDE,0xED,0xED,0xBB,0xBB,0xBD,0xDD,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xAB,0xDC,0xBB,0xDC,0xCB,0xBB,0xBA,0xAA,0xAB,0xBC,0xDB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xDB,0xBB,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0xAA, + 0xAB,0xAB,0xBB,0xBD,0xDE,0xDD,0xBB,0xAA,0x9A,0xBC,0xDE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xED,0xBA,0xA9,0xAB,0xCC,0xDC,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xA9,0x9B,0x9E,0xEE,0xED,0xEE,0xEE,0xEE, + 0xFE,0xED,0xDD,0xCD,0xDD,0xBB,0xBB,0xCC,0xDD,0xDD,0xDC,0xBB,0xBE,0xFD,0xCC,0xA9, + 0xAA,0xA8,0x77,0x76,0x55,0x55,0x54,0x44,0x54,0x44,0x54,0x45,0x44,0x44,0x54,0x44, + 0x44,0x44,0x54,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x7F,0xD6,0x55,0x55,0x56,0x77, + 0x78,0x8B,0xBD,0xDD,0xDD,0xED,0xED,0xBB,0xBB,0xBD,0xDD,0xDD,0xDC,0xBB,0xBB,0xDB, + 0xBD,0xCB,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xEE,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xBB,0x99,0xA9,0xAA,0xAA,0xAB,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0x9A,0xAA, + 0xBB,0xBB,0xBB,0xBC,0xDD,0xED,0xDB,0xA9,0x99,0xAB,0xCE,0xEE,0xFE,0xEE,0xEE,0xED, + 0xED,0xDD,0xDC,0xBA,0x9A,0xAA,0xBC,0xCC,0xCB,0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xCB,0xAA,0x9A,0xAB,0xEE,0xED,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xCD,0xDD,0xDC,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xBB,0xBD,0xDA,0x9A, + 0x9A,0xBB,0xA9,0x87,0x76,0x65,0x55,0x55,0x45,0x45,0x45,0x44,0x54,0x54,0x45,0x45, + 0x45,0x45,0x44,0x44,0x54,0x45,0x45,0x44,0x45,0x44,0x57,0x55,0x55,0x56,0x77,0x77, + 0xAC,0xDD,0xDD,0xDD,0xEE,0xED,0xCB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB, + 0xAC,0xBD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBE,0xEB,0xBA,0xBB,0xBB, + 0xBC,0xCC,0xA9,0x99,0x9A,0xA9,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0xAB, + 0xBA,0xBB,0xAB,0xAB,0xCD,0xDE,0xDC,0xBA,0xA9,0xAA,0xBD,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xDD,0xCD,0xDD,0xCB,0x9A,0xAB,0xBB,0xBB,0xCC,0xCC,0xCE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x99,0xC9,0xDE,0xEE,0xDD,0xEE,0xEE, + 0xEF,0xEE,0xDD,0xDD,0xDD,0xDC,0xBB,0xBC,0xCD,0xDD,0xDE,0xDD,0xCB,0xBA,0xAA,0xA9, + 0xAA,0xBA,0xAB,0xCD,0xA8,0x86,0x65,0x55,0x55,0x45,0x44,0x45,0x44,0x45,0x44,0x44, + 0x44,0x44,0x54,0x54,0x44,0x54,0x44,0x54,0x54,0x55,0x54,0x56,0x77,0x8A,0x89,0xBC, + 0xDD,0xEE,0xED,0xDD,0xDD,0xCB,0xBB,0xBC,0xDD,0xDD,0xED,0xDC,0xBB,0xBB,0xAB,0xAB, + 0xAB,0xCD,0xCC,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xCD,0xBC,0xAB,0xDD,0xBB,0xBB,0xBB, + 0xCC,0xCC,0x98,0x89,0xAA,0x9A,0xA9,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x99,0xAA,0xAB, + 0xAB,0xBA,0xBA,0xBB,0xBD,0xDE,0xDD,0xBB,0x9A,0xAB,0xBC,0xDE,0xEE,0xEE,0xFE,0xEE, + 0xDB,0xBA,0xAA,0xCC,0xBA,0xAA,0xAB,0xBC,0xDC,0xCC,0xBD,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCA,0xA9,0xAB,0x9E,0xEE,0xED,0xDE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCB,0xBB,0xBC,0xCD,0xDD,0xEE,0xDD,0xBB,0xAA,0xAA, + 0x9A,0xAB,0xCC,0xEF,0xFF,0xDA,0x87,0x66,0x55,0x55,0x55,0x54,0x54,0x54,0x54,0x55, + 0x55,0x45,0x44,0x44,0x54,0x54,0x55,0x55,0x55,0x55,0x67,0x88,0x88,0xAA,0xBB,0xCD, + 0xDE,0xEE,0xED,0xDD,0xCB,0xBB,0xBC,0xDD,0xED,0xEE,0xED,0xDD,0xBB,0xAB,0xBB,0xAB, + 0xBD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCB,0x98,0x99,0x9A,0xA9,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9,0x9A,0xAB, + 0xBB,0xBA,0xBA,0xAA,0xBC,0xDD,0xDD,0xDB,0xBA,0xBB,0xBC,0xDE,0xEE,0xEE,0xEE,0xED, + 0xDC,0xBB,0xA9,0xAA,0xBA,0xAA,0xAA,0xBC,0xDD,0xCD,0xCB,0xDE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xAA,0x9B,0x9B,0xEE,0xED,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDC,0xCB,0xBA,0xAA, + 0xAA,0xAB,0xDE,0xFF,0xFF,0xFF,0xEA,0x98,0x77,0x66,0x65,0x55,0x55,0x55,0x56,0x66, + 0x55,0x54,0x55,0x45,0x55,0x55,0x56,0x66,0x77,0x88,0x8A,0xAB,0xBB,0xBB,0xAB,0xDD, + 0xDD,0xEE,0xED,0xBB,0xBB,0xCC,0xDD,0xDE,0xDE,0xED,0xDD,0xDC,0xCB,0xBA,0xBC,0xBB, + 0xCC,0xCC,0xBB,0xBB,0xAB,0xBB,0xBC,0xDD,0xED,0xDD,0xDD,0xCC,0xBB,0xAB,0xBA,0xBB, + 0xCC,0xCB,0xA9,0x89,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0xAB, + 0xBB,0xAA,0xAA,0xAA,0xBB,0xCC,0xBC,0xDC,0xCB,0xCC,0xCD,0xEE,0xEE,0xDE,0xEF,0xED, + 0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xBB,0xCD,0xDC,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0x99,0xB9,0xEE,0xEE,0xCD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDB,0xBA,0xBB,0xBC,0xDD,0xDD,0xDD,0xBB,0xBB,0xAB, + 0xAB,0xAC,0xEE,0xEF,0xFE,0xFE,0xEE,0xEE,0xCB,0x98,0x87,0x76,0x66,0x66,0x9E,0xCA, + 0x76,0x66,0x66,0x66,0x87,0x88,0x78,0x88,0xAB,0xBB,0xBB,0xBB,0xCC,0xCB,0xAA,0xBE, + 0xDD,0xEE,0xDC,0xBB,0xBC,0xDD,0xDD,0xEE,0xEE,0xDD,0xDD,0xCC,0xCC,0xBB,0xBB,0xBC, + 0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xEE,0xED,0xDD,0xDC,0xBB,0xBB,0xAB,0xBB, + 0xBC,0xBB,0x99,0x89,0x9A,0xAA,0x9A,0xAA,0xAA,0xAB,0xA9,0xA9,0xA9,0xA9,0x9A,0xAB, + 0xAB,0xAB,0xAA,0xAA,0xAB,0xAB,0xBB,0xDD,0xCD,0xBD,0xDE,0xEE,0xEE,0xDE,0xDE,0xDD, + 0xCB,0xBB,0xBB,0xAA,0xAB,0xBB,0xAA,0xAB,0xBB,0xDC,0xDC,0xCC,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBA,0xA9,0xAA,0xAE,0xEE,0xED,0xDE, + 0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDC,0xBB,0xAB,0xCD,0xCD,0xCD,0xCC,0xCB,0xBA,0xBB, + 0xBB,0xBE,0xEE,0xFF,0xFF,0xFE,0xEE,0xDC,0xCB,0xDC,0xBB,0xA9,0x88,0x88,0xBE,0xEE, + 0xA8,0x88,0x87,0x77,0x89,0x89,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xCD,0xEB,0xAB,0xBC, + 0xDC,0xCC,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC, + 0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xAB,0xCD,0xEF,0xFE,0xDD,0xCC,0xBB,0xAB,0xBB,0xAB, + 0xBB,0xCB,0xA8,0x89,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0xAB, + 0xBB,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xBC,0xCC,0xDD,0xEE,0xEE,0xEE,0xED,0xDC,0xDB, + 0xCC,0xCB,0xBA,0xAA,0xAB,0xDC,0xBA,0xAA,0xBB,0xCD,0xCB,0xBB,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xA9,0x9B,0x9B,0xEE,0xED,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xCA,0xBB,0xCC,0xDC,0xDC,0xDC,0xBB,0xBA,0xAB, + 0xBD,0xDD,0xDE,0xFF,0xEF,0xEE,0xEE,0xED,0xBB,0xBC,0xBB,0xBB,0xAB,0xAA,0x99,0x9A, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCC,0xCA,0xBC,0xDD,0xDD,0xAA,0xAB, + 0xBB,0xBC,0xBD,0xDD,0xEE,0xEE,0xEE,0xDE,0xDD,0xDC,0xDC,0xBB,0xBB,0xBC,0xBB,0xBD, + 0xCC,0xBB,0xBB,0xBB,0xBA,0xAA,0x9A,0xAC,0xEF,0xFD,0xDD,0xCC,0xBB,0xBA,0xBA,0xBB, + 0xBB,0xCB,0xA8,0x88,0x9A,0xAA,0xAA,0xAA,0xBA,0xA9,0xAA,0x9A,0xA9,0xA9,0x9A,0xAB, + 0xAB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xBC,0xDE,0xEF,0xEF,0xEE,0xED,0xDC,0xBB, + 0xCC,0xDC,0xBB,0xAA,0xAB,0xDC,0xAA,0x9A,0xAB,0xBC,0xDC,0xDB,0xBD,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xCB,0xBA,0x99,0xC9,0xEE,0xEE,0xDD, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDB,0xBB,0xCC,0xCC,0xCC,0xBC,0xBB,0xAB,0xBB, + 0xCD,0xDD,0xDE,0xDE,0xEE,0xED,0xEF,0xEE,0xDB,0xCB,0xBB,0xBB,0xBA,0xBA,0x98,0xAB, + 0xDB,0xBA,0xBB,0xAA,0x99,0x9A,0xAB,0xAB,0xDC,0xDD,0xBA,0xAC,0xDD,0xBB,0xBB,0xBB, + 0xBB,0xBD,0xDE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xCC, + 0xCB,0xBB,0xBB,0xBB,0xA9,0x9A,0x9A,0x9A,0xBD,0xDD,0xDC,0xCC,0xBB,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xA8,0x88,0x99,0xAB,0xAA,0xAA,0xBB,0xAA,0x9A,0xA9,0xA9,0xA9,0xAA,0xAB, + 0xBB,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAC,0xEE,0xFE,0xFE,0xFE,0xED,0xDB,0xBC, + 0xDD,0xCC,0xBB,0xAA,0xAA,0xBC,0xAA,0x9A,0xAA,0xBB,0xDC,0xCB,0xCC,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDB,0xBA,0xA9,0xAA,0xAE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDC,0xBB,0xBB,0xBC,0xCB,0xBB,0xBA,0xBB,0xBC, + 0xDD,0xEE,0xED,0xED,0xED,0xEE,0xFF,0xFE,0xDD,0xDC,0xBB,0xAB,0xAB,0xBA,0x99,0x9B, + 0xDC,0xA9,0xCC,0xBA,0xA9,0x9A,0xAB,0xBC,0xCD,0xCB,0xBB,0xAA,0xBB,0xBB,0xBB,0xBB, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xDD,0xCD,0xBB,0xBB,0xAB,0xBB,0xBB,0xDC, + 0xCB,0xBB,0xBB,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xBD,0xCD,0xCC,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBC,0xC9,0x88,0x99,0xBD,0xEC,0xAA,0xAA,0xA9,0xAA,0x9A,0xA9,0xA9,0x9A,0xAB, + 0xBA,0xBA,0xBA,0xAA,0xBB,0xBA,0xA9,0x9A,0xAB,0xDE,0xEE,0xFE,0xFE,0xED,0xDB,0xBC, + 0xCD,0xDC,0xBB,0xAA,0xAA,0xBC,0xAA,0x99,0x9A,0xAB,0xCC,0xDC,0xCB,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xA9,0x9C,0x9C,0xEE,0xED, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xCD, + 0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xEE,0xED,0xDC,0xDC,0xBB,0xBB,0xBA,0xAB,0xAA,0xDD, + 0xBA,0x99,0xAB,0xAA,0xAA,0xBB,0xBB,0xBC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBC,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC, + 0xBB,0xAB,0xBA,0xAA,0x9A,0xAA,0xAA,0xAA,0x9A,0xAB,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xBC,0xBA,0x88,0x89,0xAD,0xFF,0xBA,0xA9,0xAA,0xA9,0xAA,0x9A,0x99,0xAA,0xBB, + 0xAB,0xAA,0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xDD,0xEF,0xFE,0xFE,0xED,0xDB,0xBC, + 0xDD,0xDD,0xCB,0xBA,0xAA,0xAC,0xA9,0x99,0x99,0xAA,0xBC,0xDC,0xBB,0xCD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xAA,0x99,0xB9,0xEE,0xEE, + 0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC,0xDD, + 0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xED,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xCD,0xEE, + 0xCB,0x9A,0xAA,0xBA,0xBB,0xCB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xCD,0xCD,0xCC,0xBB,0xBB,0xAB,0xBC,0xCB, + 0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xBB,0xBB,0xBC,0xCB,0xBB,0xBA, + 0xBB,0xBC,0xCC,0x98,0x89,0x9A,0xBD,0xBA,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xAA,0xAB, + 0xBB,0xAA,0xBB,0xBB,0xBC,0xCB,0xBA,0xAA,0xAB,0xCD,0xEE,0xEE,0xFE,0xEE,0xCB,0xBC, + 0xDD,0xDD,0xCB,0xBA,0xAA,0xAB,0xA9,0x99,0x99,0xAA,0xBB,0xCC,0xDB,0xCC,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0xA9,0xAA,0xAE,0xEE, + 0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDC,0xBB,0xAB,0xAA,0xAB,0xBB,0xBD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xFE,0xED,0xDC,0xCB,0xCB,0xBC,0xCB,0xBB,0xBD,0xBB, + 0xCB,0xAA,0xAA,0xBB,0xBB,0xCB,0xCB,0xCB,0xCB,0xCC,0xBC,0xBC,0xDC,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCD,0xBC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBC,0xCB, + 0xBB,0xAA,0xAA,0xA9,0xAB,0xBA,0xBA,0xAA,0x9A,0xAA,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB, + 0xBB,0xBC,0xCC,0xB9,0x88,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x9A,0xAA,0xBB, + 0xAB,0xAB,0xBB,0xBB,0xBC,0xDD,0xCB,0xBB,0xBC,0xCD,0xEE,0xFE,0xEF,0xED,0xCB,0xBC, + 0xDE,0xED,0xDB,0xAA,0xAA,0xAB,0xA9,0x98,0x99,0x99,0xAB,0xBD,0xCC,0xBC,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xA9,0x8C,0x9D,0xEE, + 0xED,0xDD,0xEE,0xEF,0xEF,0xEE,0xEE,0xDD,0xDD,0xBB,0xAA,0x9A,0xBB,0xBD,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xBD,0xCC,0xCC,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xDC,0xDB,0xDC,0xCC,0xCC,0xCC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xCB, + 0xBA,0xAA,0xAA,0x99,0xAA,0xBC,0xBA,0xAA,0xA9,0xAA,0xAB,0xAB,0xBC,0xCC,0xBB,0xAB, + 0xBB,0xCC,0xBD,0xCB,0x98,0x98,0x99,0x99,0x9A,0x9A,0x9A,0x99,0x99,0x9A,0xAB,0xBA, + 0xBA,0xAB,0xCC,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xDD,0xEE,0xEF,0xEE,0xED,0xBC,0xBD, + 0xDD,0xDD,0xCB,0xBA,0xAA,0xAB,0xA9,0x88,0x98,0x99,0xAA,0xBB,0xDC,0xBB,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB,0xAA,0x99,0xB9,0xEE, + 0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDB,0xAA,0xAA,0xAB,0xDE,0xEE,0xEE, + 0xEE,0xED,0xED,0xED,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xDC,0xDC,0xDC,0xCD,0xCD,0xCD,0xDC,0xDB,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xDD,0xDC,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xBD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xAA,0xAA,0x99,0x9A,0xAD,0xDC,0xAA,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xBB,0xBB, + 0xBB,0xBC,0xDC,0xCC,0xB9,0x89,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xBB,0xAB, + 0xBA,0xBB,0xCD,0xEE,0xED,0xEE,0xEE,0xED,0xDD,0xDE,0xEF,0xEF,0xEE,0xEE,0xDC,0xDE, + 0xED,0xDD,0xBB,0xBA,0xBA,0xBA,0x98,0x98,0x88,0x99,0x9A,0xBB,0xCC,0xCB,0xCE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBA,0xA9,0xAA,0xBE, + 0xEE,0xED,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDC,0xBA,0x9A,0xAC,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xED,0xDE,0xEE,0xEF,0xEF,0xEE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xBC,0xCD,0xCC,0xDC,0xCB,0xDB,0xDC,0xDC,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xAA,0xAA,0xA8,0x99,0xAA,0xBB,0xA9,0x99,0xAA,0xBA,0xAB,0xBB,0xDC,0xCB,0xBB, + 0xBB,0xCC,0xCC,0xDB,0xDB,0x99,0x98,0x99,0x89,0x99,0x98,0x99,0x99,0xAB,0xBB,0xBB, + 0xAB,0xBB,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xFE, + 0xED,0xDD,0xCB,0xAB,0xAB,0xA9,0x98,0x88,0x89,0x89,0x99,0xAB,0xCC,0xCB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBB,0xA9,0x8C,0x9D, + 0xEE,0xED,0xDE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDD,0xBA,0xAA,0xAB,0xDE,0xFF,0xEE, + 0xEE,0xDE,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDE,0xDD,0xDD,0xBD,0xDE,0xDD,0xCB, + 0xBB,0xDC,0xDC,0xDD,0xBD,0xCD,0xBD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD, + 0xCD,0xDC,0xDD,0xDC,0xDD,0xCD,0xCC,0xDD,0xCD,0xCD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xA9,0xAA,0xA8,0x98,0x99,0xA9,0x99,0x99,0xAA,0xAA,0xBB,0xBD,0xCD,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xCD,0xBD,0xBB,0x99,0x99,0x99,0x99,0x99,0x99,0x9B,0xBB,0xBA,0xBA, + 0xBA,0xBD,0xDE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEF,0xFE,0xFE,0xEE,0xEF,0xFE, + 0xED,0xCC,0xBB,0xBB,0xBB,0xA9,0x98,0x89,0x88,0x89,0x89,0xAA,0xBC,0xBB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xCB,0xAA,0xA9,0xB9, + 0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDB,0xAA,0xAB,0xDE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xED,0xDD,0xED,0xED,0xDD,0xDC,0xDD,0xED,0xDB, + 0xBD,0xCD,0xDD,0xDC,0xDC,0xCB,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCC,0xCB,0xDB,0xDC,0xDC,0xBC,0xBB,0xBB,0xBB, + 0xBA,0xAA,0xAA,0xAA,0x89,0x99,0x99,0x99,0x8A,0xAA,0xAA,0xAB,0xBC,0xCD,0xCB,0xBB, + 0xCB,0xBB,0xBD,0xCD,0xDC,0xDC,0xCB,0xA9,0x99,0x99,0x99,0xAB,0xCB,0xBB,0xBB,0xBB, + 0xAB,0xBC,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xDD,0xEE,0xEF,0xEF,0xEE,0xED,0xEE, + 0xED,0xBB,0xBB,0xBB,0xBB,0xA9,0x98,0x88,0x88,0x98,0x99,0x9A,0xBC,0xCB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0x99,0xAA, + 0xAE,0xEE,0xED,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xAA,0xAB,0xCE,0xEF,0xFF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xEE,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xBD,0xBC,0xCC,0xBC,0xBB,0xCC,0xCD,0xCC,0xDB,0xCC,0xBB,0xBB, + 0xBA,0xAA,0xAB,0xAA,0xA9,0x99,0x99,0xA9,0xAA,0xAA,0xAA,0xAB,0xBC,0xCC,0xCB,0xBC, + 0xCC,0xCB,0xCC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDC,0xCD,0xDD,0xCC,0xBC,0xBB,0xBB,0xAA, + 0xBB,0xBD,0xEE,0xEF,0xEF,0xFE,0xFE,0xFE,0xED,0xCD,0xDE,0xEE,0xFF,0xEF,0xEE,0xDC, + 0xDB,0xBB,0xBB,0xBB,0xAB,0xBA,0x98,0x98,0x98,0x98,0x99,0x9A,0xAB,0xCB,0xBC,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDC,0xBB,0xA9,0x8C, + 0x8C,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCA,0xAB,0xBD,0xEF,0xFF, + 0xFF,0xFF,0xEE,0xFF,0xFF,0xFF,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xDC,0xDD,0xBB,0xBC,0xDE, + 0xED,0xDD,0xDD,0xCD,0xDD,0xCD,0xBC,0xCB,0xBC,0xBC,0xCC,0xBD,0xCC,0xCC,0xCB,0xBB, + 0xBB,0xBA,0xAB,0xAB,0xAB,0xA9,0x9A,0xAB,0xBB,0xBB,0xAA,0xBB,0xBC,0xDC,0xCB,0xCB, + 0xCC,0xBD,0xBD,0xBD,0xCD,0xCD,0xCD,0xCD,0xDE,0xDE,0xDD,0xCD,0xCB,0xBB,0xBA,0xBB, + 0xBB,0xDD,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xED,0xBB,0xDD,0xEF,0xEF,0xEF,0xEE,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xA9,0x89,0x89,0x99,0x89,0x9A,0xBB,0xCB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xBB,0xAA,0x99, + 0xB9,0xEE,0xEE,0xDD,0xED,0xEE,0xEF,0xEE,0xEE,0xDE,0xDD,0xDB,0xBA,0xBC,0xDE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xCC,0xBA,0xAA,0xAA,0xBC, + 0xED,0xDD,0xDD,0xDC,0xDC,0xCC,0xDB,0xBC,0xBB,0xBC,0xCD,0xCC,0xDC,0xDB,0xCC,0xCC, + 0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xAB,0xBB,0xDB,0xCC,0xBC,0xCC, + 0xDC,0xDC,0xCC,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xCB,0xBB,0xBB,0xAB, + 0xBB,0xDD,0xEE,0xFE,0xFE,0xFE,0xFF,0xEE,0xED,0xBB,0xCE,0xEE,0xFF,0xFF,0xFE,0xED, + 0xBB,0xBA,0xBA,0xBB,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x99, + 0xAA,0xAE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xBA,0xBB,0xDD,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xCD,0xCC,0xDC,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xBA,0xAA,0x99,0xAA,0xBB, + 0xCE,0xED,0xDD,0xDD,0xCD,0xDD,0xCD,0xCC,0xBC,0xBC,0xCC,0xDD,0xDD,0xCD,0xCD,0xBD, + 0xCD,0xDB,0xBB,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCD,0xCC,0xBC,0xBD,0xCC,0xBB,0xBB, + 0xCC,0xCD,0xCD,0xCC,0xCB,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xCC,0xBB,0xBA,0xBA,0xBB, + 0xBD,0xDE,0xEE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEE,0xDC,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xDB,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x99,0xAB,0xBB,0xBB,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xA9, + 0x8C,0x8D,0xEE,0xEE,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xDE,0xDD,0xDB,0xBB,0xBD,0xDE, + 0xEF,0xFF,0xFF,0xFF,0xFE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCB,0xAA,0x9A,0x9A,0xAA,0xAB, + 0xBC,0xED,0xDD,0xCD,0xDC,0xDC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBC,0xDD,0xDD,0xCD,0xCD, + 0xDD,0xCC,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xDB,0xDC,0xDB,0xCC,0xBB,0xBB,0xCB, + 0xCC,0xDC,0xDC,0xCB,0xCC,0xCD,0xDD,0xCC,0xCD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xBB, + 0xBD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xFE,0xFE, + 0xDC,0xBA,0xA9,0xAA,0xAA,0xAA,0x9A,0xA9,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xBC,0xDC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xAA, + 0x99,0xB9,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xBB,0xBB,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCB,0xAA,0x99,0xAA,0xBB,0xAA,0xAB, + 0xBB,0xCE,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xBB,0xBA,0xBA,0xAB,0xBD,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBD, + 0xCC,0xCC,0xCD,0xCD,0xCC,0xCC,0xCD,0xCB,0xBC,0xCD,0xCC,0xCC,0xBB,0xAB,0xAB,0xBB, + 0xDD,0xEE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFF,0xFE,0xFE,0xEE,0xDE,0xDD,0xEE,0xEF,0xEF, + 0xED,0xBA,0xAA,0xA9,0xAA,0xAA,0xA9,0xA9,0xA9,0x99,0x99,0x9A,0xAB,0xBB,0xBC,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBA, + 0x99,0xAA,0xAE,0xEE,0xED,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xCB,0xBB,0xBD, + 0xDD,0xDD,0xDD,0xDC,0xCD,0xDD,0xED,0xBD,0xDD,0xDC,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xCC,0xBA,0xA9,0xA9,0xBB,0xCB,0xBB,0xA9, + 0xAB,0xBC,0xED,0xDC,0xDC,0xDC,0xCC,0xCC,0xBB,0xAA,0xA9,0xAB,0xAB,0xDD,0xDD,0xCD, + 0xBD,0xBC,0xBC,0xCC,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD,0xBD,0xBC,0xBB,0xCB,0xBC,0xDB, + 0xCC,0xBD,0xBD,0xCD,0xCD,0xBD,0xDC,0xCB,0xBB,0xCB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBD, + 0xDE,0xEF,0xEF,0xEF,0xFE,0xFF,0xFE,0xFE,0xFF,0xEE,0xEE,0xED,0xED,0xDE,0xEE,0xFE, + 0xEE,0xDB,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x9A,0xAB,0xBB,0xBC,0xDC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xBB, + 0xA9,0x8C,0x9C,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDC,0xBB,0xBB, + 0xCC,0xDC,0xDC,0xBB,0xBB,0xDE,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xDD,0xED,0xDE, + 0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xCD,0xCB,0xAA,0xA9,0xAB,0xBC,0xBD,0xCB,0xAA, + 0xAA,0xAB,0xCD,0xDD,0xDC,0xDC,0xDC,0xBB,0xBA,0xA9,0x9A,0x99,0xAA,0xBC,0xED,0xDD, + 0xDC,0xDC,0xDB,0xDC,0xCB,0xDB,0xCB,0xBC,0xCD,0xCD,0xCD,0xCC,0xBB,0xBC,0xDC,0xCD, + 0xDD,0xCC,0xBD,0xBD,0xCC,0xDC,0xCC,0xBB,0xAA,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xCD, + 0xDE,0xEE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xDE,0xDD,0xEE,0xFE, + 0xFE,0xEB,0xAA,0x9A,0x99,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x9A,0xAB,0xBB,0xBC,0xDC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB, + 0xAA,0x99,0xB9,0xEE,0xEE,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xBB,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDB,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xBA,0xA9,0x9A,0xBC,0xCB,0xCC,0xCB,0xBA, + 0x9A,0xAB,0xBD,0xDD,0xCD,0xCC,0xCB,0xBA,0xAA,0x9A,0xAA,0xBA,0xA9,0xAB,0xCE,0xDD, + 0xCD,0xCC,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDB,0xCB,0xCC,0xDC,0xDD,0xDC, + 0xDD,0xDD,0xCC,0xDB,0xDD,0xCD,0xBD,0xBB,0xAA,0xAA,0xBB,0xBC,0xCB,0xBB,0xBB,0xDD, + 0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFE,0xFF,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEF, + 0xFE,0xEE,0xBA,0x99,0x9A,0x9A,0xAA,0xAA,0xAA,0xA9,0x99,0xAA,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB, + 0xBA,0x99,0xAA,0xAE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xCB,0xBA, + 0xBB,0xAB,0xBA,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCB,0xAA,0x99,0xBB,0xDC,0xCB,0xBC,0xCB,0xBA, + 0xA9,0xAA,0xBB,0xDD,0xDC,0xDC,0xBB,0xAA,0x99,0x9A,0xBB,0xBB,0xAA,0xAA,0xBC,0xED, + 0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xCC,0xDB,0xDC,0xCB,0xAB,0xBB,0xBB,0xCB,0xDB,0xBB,0xBD,0xDE, + 0xEE,0xEF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xEE,0xFE, + 0xFE,0xFE,0xDA,0x9A,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0x99,0xAA,0xBB,0xBB,0xBC,0xEC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDC, + 0xBB,0xA9,0x8B,0x9C,0xEE,0xEE,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDB,0xBB, + 0xAB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDB,0xCB,0xA9,0x9A,0xBD,0xDC,0xBC,0xCC,0xBC,0xBB, + 0xAA,0x9A,0xAB,0xBD,0xDC,0xCC,0xBA,0xA9,0x99,0xAB,0xCD,0xDB,0xBA,0xA9,0xAC,0xDD, + 0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xCC,0xBC,0xDD,0xDD,0xCD,0xDD, + 0xCD,0xDD,0xDD,0xDB,0xDB,0xCC,0xCC,0xCC,0xBB,0xCB,0xBC,0xBC,0xCC,0xBB,0xCD,0xEE, + 0xEF,0xEF,0xEF,0xFE,0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xEE,0xFE,0xED,0xEE,0xEE,0xEF, + 0xFF,0xEF,0xED,0xBA,0x9A,0x99,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xBB,0xCB,0xCD,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD, + 0xCB,0xAA,0x99,0xB9,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xED,0xDC,0xDD,0xDD,0xED,0xED,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xBA,0xA9,0x9A,0xCE,0xDD,0xCC,0xBD,0xCC,0xBB, + 0xAA,0x99,0xAA,0xBB,0xCB,0xBA,0xAA,0x99,0x9B,0xBD,0xCD,0xCC,0xBB,0xAA,0xAA,0xBE, + 0xDD,0xDB,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xDC,0xCC,0xBB,0xDC,0xDD,0xCD,0xDC,0xDC,0xCB,0xBB,0xDD,0xEE, + 0xEF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xFE,0xFE,0xED,0xBA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCD,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED, + 0xDB,0xBA,0x99,0xAA,0xAE,0xEE,0xED,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xED,0xDB, + 0xBB,0xBB,0xBB,0xCB,0xDD,0xDD,0xED,0xED,0xED,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDB,0xBB,0x99,0x89,0xAE,0xED,0xCB,0xCC,0xCB,0xBB, + 0xBA,0xAA,0x9A,0xAB,0xCB,0xAA,0x99,0x99,0xBB,0xDC,0xDC,0xDB,0xCB,0xB9,0xAA,0xBB, + 0xED,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xCC,0xCD,0xDD,0xDD,0xDD,0xDC,0xDB, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xBB,0xCD,0xBD,0xCD,0xCD,0xCD,0xCC,0xBB,0xBC,0xDD,0xEE, + 0xEE,0xFE,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xFF,0xEE,0xED,0xAA,0x9A,0x9A,0x9A,0x9A,0xAB,0xAA,0xBB,0xBB,0xBC,0xBB,0xCD,0xCB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xDC,0xBB,0xA9,0x8B,0x9B,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xBB,0xCB,0xDC,0xDB,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCB,0x99,0x89,0x9B,0xEE,0xDC,0xCD,0xBB,0xBB, + 0xBB,0xBA,0x9A,0xAA,0xBA,0xA9,0x99,0xAB,0xCD,0xDD,0xCD,0xBD,0xCC,0xBA,0x9A,0xAB, + 0xDD,0xDD,0xBD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCC, + 0xBD,0xDE,0xDD,0xDD,0xDD,0xCD,0xCC,0xCC,0xBD,0xBD,0xCC,0xCB,0xBB,0xBB,0xDD,0xED, + 0xEE,0xEF,0xFE,0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xFE,0xEE,0xDA,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xBA,0xAB,0xBB,0xCB,0xBC,0xDD,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xED,0xBB,0xAA,0x98,0xC9,0xDE,0xEE,0xED,0xDE,0xEE,0xEF,0xEF,0xEE,0xED,0xED,0xDD, + 0xCB,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xDC,0xDD,0xED,0xDD,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xA9,0x88,0x9A,0xDE,0xDB,0xBB,0xBB,0xBB, + 0xBC,0xBB,0x99,0xAB,0xAA,0x99,0x9B,0xBC,0xDD,0xDD,0xDC,0xDC,0xDD,0xCB,0xAA,0xAB, + 0xBE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xCB, + 0xCC,0xDE,0xED,0xDD,0xDC,0xDC,0xDC,0xDB,0xBC,0xBB,0xBC,0xBC,0xBB,0xBB,0xDD,0xDD, + 0xDD,0xEE,0xEF,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEC,0xBA,0xAA,0x9A,0x9A,0x9A,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC,0xDC,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xED,0xDB,0xBA,0xA9,0x9A,0xAE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED, + 0xDB,0xBB,0xBD,0xDC,0xCC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDE,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDB,0x99,0x99,0x89,0xAD,0xED,0xCB,0xBB,0xBB, + 0xDB,0xDB,0xB9,0xAA,0xA9,0x99,0xAB,0xCD,0xDD,0xDD,0xDD,0xCB,0xDD,0xDC,0xA9,0xAB, + 0xBC,0xED,0xDC,0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB, + 0xBC,0xBD,0xDE,0xDD,0xDD,0xDC,0xDC,0xCB,0xCB,0xCC,0xCC,0xBB,0xAB,0xBB,0xDD,0xDC, + 0xBC,0xDE,0xFE,0xFE,0xFF,0xFE,0xFF,0xEF,0xEF,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xCB,0xAA,0xA9,0xA9,0xA9,0x9A,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xBD,0xDA,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xEE,0xDD,0xBB,0xA9,0x8B,0x9B,0xEE,0xEE,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD, + 0xDD,0xBB,0xBC,0xCC,0xBD,0xDD,0xDD,0xDD,0xBC,0xDC,0xDD,0xDD,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xAA,0x98,0x89,0x9A,0xDD,0xCB,0xBB,0xCD, + 0xBD,0xCC,0xBB,0xAA,0xA9,0xAB,0xCD,0xDD,0xCD,0xEE,0xDD,0xCD,0xCD,0xCC,0xAA,0xAB, + 0xBC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCC,0xCB, + 0xBB,0xCD,0xDE,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xBC,0xCB,0xBB,0xBB,0xBC,0xDD,0xDB, + 0xBC,0xDE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEE,0xFE,0xEE,0xDE,0xEE,0xEE, + 0xEC,0xBA,0xA9,0x99,0xA9,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCB,0xBB,0xDC,0xCB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xDD,0xCB,0xAA,0x98,0xC9,0xDE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xDD,0xCA,0xBB,0xBD,0xCD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDA,0xA9,0x98,0x99,0xAD,0xED,0xCC,0xCB, + 0xDC,0xDB,0xDC,0xBA,0xAB,0xCC,0xDD,0xCD,0xDC,0xDE,0xDD,0xCC,0xDC,0xCA,0x99,0xAB, + 0xBC,0xCD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB, + 0xBB,0xCC,0xCD,0xDD,0xDC,0xDC,0xDC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xCC,0xEE,0xED, + 0xBB,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xEE,0xEE,0xDD,0xEE,0xDD, + 0xCA,0xAA,0x9A,0x99,0x9A,0xAA,0xAA,0xBB,0xCB,0xDC,0xDC,0xBB,0xBC,0xCE,0xAA,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xED,0xDB,0xBA,0xA9,0x9B,0x9E,0xEE,0xEE,0xDD,0xEE,0xEE,0xFE,0xEE,0xED,0xDD, + 0xED,0xDA,0xAA,0xCD,0xED,0xED,0xED,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xDC,0xA9,0x99,0x89,0x9B,0xED,0xDB,0xCC, + 0xDC,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xBC,0xDC,0xDC,0xDD,0xB9,0x98,0xAD, + 0xCC,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBC, + 0xBC,0xBC,0xDC,0xDC,0xCD,0xDD,0xCD,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE, + 0xDD,0xDE,0xEE,0xDE,0xDD,0xEE,0xEE,0xEF,0xFF,0xEF,0xEE,0xEE,0xED,0xCD,0xBB,0xBB, + 0xAB,0xAA,0xAA,0xAB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xCB,0xCD,0xDB,0xAB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xDD,0xBB,0xA9,0x8B,0xAB,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xED, + 0xDD,0xDD,0xAA,0xBD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xDC,0xDD,0xDD,0xDD,0xED,0xEE,0xED,0xC9,0x99,0x88,0x9A,0xCE,0xDD,0xCD, + 0xCC,0xDC,0xCC,0xCC,0xCD,0xDD,0xDD,0xCD,0xDC,0xCB,0xBC,0xCD,0xCA,0x99,0x88,0xAD, + 0xDB,0xDB,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDD,0xCB,0xCB,0xBB,0xBB, + 0xBB,0xBC,0xCB,0xDB,0xDC,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xFF,0xEF, + 0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xEE,0xED,0xCB,0xBB,0xBB,0xAB, + 0xBB,0xBD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xDD,0xD9,0xAB,0xBD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xCB,0xAA,0x98,0xB9,0xDE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xBB,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xED,0xDB,0x99,0x98,0x99,0xAD,0xDD,0xCC, + 0xDC,0xCB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDC,0xDD,0xBC,0xBC,0xCB,0xA9,0x89,0x89,0xAC, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xDD,0xDD,0xCD,0xBD,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xCC,0xDC,0xDB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDE,0xEF,0xEE,0xFE, + 0xFE,0xED,0xED,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEC,0xCB,0xBB,0xBC,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xDD,0xDD,0xCD,0xBC,0xCD,0xCD,0x9A,0xAB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xED,0xDB,0xBA,0xA9,0x9B,0x9E,0xEE,0xEE,0xDD,0xEE,0xEE,0xFE,0xEE,0xED, + 0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xDD,0xB9,0x99,0x89,0x9A,0xDD,0xDD, + 0xCC,0xBB,0xBA,0xBB,0xBB,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xB9,0x98,0x88,0x99,0xAB, + 0xBC,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDC,0xCC,0xCB,0xDC,0xBD, + 0xCB,0xBC,0xCB,0xCC,0xCC,0xCC,0xDC,0xBB,0xBB,0xBB,0xBC,0xCE,0xEE,0xFE,0xEF,0xEE, + 0xFE,0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xEE,0xED,0xBB,0xBC,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xED,0xDD,0xDD,0xCD,0xCD,0xCD,0xEA,0xAA,0xBB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xDD,0xBB,0xA9,0x9A,0xAA,0xEE,0xEF,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xEE,0xEE,0xFE,0xFE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xEE,0xED,0xED,0xCA,0x99,0x88,0x9A,0xCD,0xDC, + 0xCB,0xBA,0xBB,0xBB,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDB,0x99,0x88,0x99,0x99,0xBB, + 0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xDB,0xDD,0xCD,0xDD, + 0xDD,0xDC,0xCC,0xBB,0xBC,0xCD,0xBC,0xBB,0xBB,0xBB,0xDD,0xEF,0xEF,0xEE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xDE,0xDD,0xDC,0xDC,0xCC,0xDD,0xA9,0xAA,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xED,0xCC,0xAA,0x98,0xB9,0xCE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xEF,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xED,0xEE,0xEE,0xDC,0xA9,0x99,0x89,0xAD,0xDC, + 0xBB,0xAA,0xBB,0xBD,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xB9,0x99,0x89,0x99,0xAA,0xBD, + 0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xED,0xDD,0xCD,0xCB,0xBC,0xCC,0xCB,0xBB,0xBB,0xBD,0xDE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCB,0xDD,0xDD,0x89,0xAB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0xA9,0x8C,0x9E,0xEE,0xEE,0xEE,0xDE,0xEE,0xEF,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xFE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xEE,0xED,0xED,0xDD,0xB9,0x98,0x99,0x9B,0xCC, + 0xBB,0xAB,0xAB,0xCD,0xDC,0xDC,0xCC,0xDD,0xCC,0xCA,0x99,0x88,0x99,0x9A,0xAB,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDD,0xDB,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xEE, + 0xDE,0xDD,0xDC,0xCB,0xBC,0xCD,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xEF,0xEF,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xCC,0xCD,0xCD,0xEA,0x9A,0xAB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xA9,0x99,0xBA,0xEE,0xFE,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xDE,0xED,0xEE,0xEE,0xDD,0xBB,0x99,0x89,0x9A,0xBB, + 0xBB,0xAA,0xAB,0xCD,0xDD,0xCB,0xBC,0xCC,0xBC,0xA9,0x88,0x99,0x99,0x9A,0xCD,0xDD, + 0xED,0xDD,0xCD,0xCD,0xCD,0xCD,0xCC,0xCC,0xCC,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE, + 0xED,0xDD,0xCD,0xCC,0xBC,0xCC,0xBB,0xBB,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xCB,0xCB,0xCC,0xDE,0xE9,0xAA,0xBB,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xED,0xCB,0xBA,0x98,0xBA,0xBE,0xEE,0xEE,0xED,0xEE,0xEE,0xEF, + 0xEE,0xED,0xDD,0xED,0xED,0xDD,0xDE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE, + 0xEE,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xED,0xEE,0xDD,0xDB,0xA8,0x89,0xAB,0xBB, + 0xBA,0xAA,0xAB,0xBD,0xCB,0xBB,0xBB,0xDB,0xBA,0x98,0x98,0x99,0xA9,0xAD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xCC,0xDC,0xDC,0xDB,0xCB,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xBD,0xBC,0xCC,0xBB,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDE,0xDD,0xEE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xED,0xDD,0xDD,0xDC,0xCC,0xBB,0xBC,0xBC,0xDD,0xDD,0xB9,0xAA,0xBC,0xDE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBA,0xA9,0x8C,0x9D,0xEE,0xEE,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xED,0xDD,0xDD,0xDE,0xDE,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xCC,0xA8,0x9A,0xAB,0xBB, + 0xBB,0xAA,0xAA,0xAB,0xBB,0xAB,0xBB,0xCC,0xA9,0x98,0x89,0x99,0x9B,0xDD,0xDD,0xED, + 0xDD,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xCB,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDC,0xDB,0xDC,0xCC,0xBC,0xCE,0xEE,0xFE,0xEE,0xEF,0xEF,0xFF,0xEF,0xEE, + 0xEE,0xDE,0xDE,0xDE,0xDD,0xEE,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xBB,0xCB,0xDD,0xCC,0xCD,0x9A,0xAB,0xBD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0xBA,0xEE,0xEF,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xFE, + 0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xBC,0xA8,0x9A,0xBB,0xBB, + 0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBC,0xCB,0xA9,0x88,0x99,0x9A,0xBD,0xDE,0xDE,0xDD, + 0xDD,0xCD,0xDC,0xCD,0xBD,0xCD,0xDB,0xCB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xCC,0xCC,0xCD,0xCD,0xCC,0xCC,0xEE,0xFE,0xEE,0xFE,0xFE,0xFF,0xEE,0xEE,0xED, + 0xED,0xDE,0xED,0xED,0xEE,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xED,0xDD, + 0xDD,0xCD,0xBD,0xBC,0xBB,0xCC,0xCD,0xCD,0xDB,0xCB,0xDA,0x9A,0xBB,0xDD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDB,0xBA,0x99,0x9A,0xBE,0xEE,0xEE,0xDD,0xDE,0xEE, + 0xEE,0xFE,0xEE,0xDE,0xDE,0xDD,0xCC,0xCC,0xDD,0xDE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xCB,0xBA,0x9A,0xAA,0xBB,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xAA,0xAB,0xBC,0xBB,0xA9,0x99,0x99,0xAC,0xDD,0xDE,0xDE,0xDD, + 0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCC,0xCD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDD, + 0xDE,0xDE,0xDE,0xED,0xED,0xEE,0xDE,0xDE,0xDD,0xDD,0xED,0xED,0xEE,0xDD,0xDD,0xDC, + 0xDC,0xCC,0xCC,0xCC,0xDD,0xCD,0xDD,0xDD,0xDC,0xBD,0xA9,0xAA,0xBC,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDC,0xBA,0xA9,0x8B,0x9D,0xEE,0xEE,0xED,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDB,0xCD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDC,0xBB,0xA9,0xAA,0xAB,0xBB,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xAB,0xBB,0xBC,0xDB,0xBA,0x99,0x9A,0xBD,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xBD,0xCD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xDC,0xDD,0xDD, + 0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDD,0xDD,0xDB,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDB,0xDB,0x9A,0xAB,0xCD,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xAA,0x98,0xC9,0xEE,0xEF,0xEE,0xED,0xED, + 0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDB,0xBD,0xDE,0xDD,0xDE,0xEE,0xEE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xED,0xBA,0xA9,0x99,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xCC,0xCC,0xBA,0xA9,0x9B,0xCD,0xDE,0xEE,0xDE,0xDD, + 0xDD,0xDC,0xDD,0xDB,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDC,0xBD,0xDD,0xDD, + 0xED,0xDD,0xEE,0xEE,0xDE,0xEE,0xDE,0xED,0xED,0xED,0xED,0xDD,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xA9,0x9A,0xBB,0xCD,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0x99,0x9B,0xAE,0xEE,0xEE,0xDD,0xDE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xDB,0xBA,0x99,0xAA,0xAB,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBC,0xCC,0xBB,0xA9,0xAA,0xCD,0xDD,0xED,0xED,0xED, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDC,0xCD,0xDD,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xEE,0xEA,0x99,0xAA,0xBC,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBB,0xA9,0x8A,0xAC,0xEE,0xEE,0xEE,0xED, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xDE,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEC,0xBA,0xA9,0xAA,0xAA,0xBA,0xBB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCB,0xBC,0xBC,0xCC,0xBB,0xAA,0xAA,0xCB,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDC,0xBD,0xDD,0xDE,0xDD,0xDE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0x99,0x9A,0xAB,0xBD,0xDE,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xBB,0xAA,0x98,0xB9,0xDE,0xEF,0xEE,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xCB,0xA9,0x9A,0xAB,0xAA,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xCB,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBA,0xAA,0xBB,0xBC,0xEE,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xCC,0xDC,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xBD,0xDD,0xDE,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xB8,0x99,0xAA,0xBC,0xDD,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0xA9,0x8C,0xAE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0xBA,0xAA,0xAB,0xBB,0xBA,0xAA,0xBB,0xAB,0xBB, + 0xBB,0xBC,0xBC,0xDC,0xDC,0xBC,0xBB,0xBB,0xAB,0xBA,0xAA,0xAB,0xBB,0xDE,0xEE,0xED, + 0xEE,0xED,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xED, + 0xED,0xDD,0xEE,0xFE,0xEE,0xDE,0xEE,0xEE,0xDC,0xCC,0xDD,0xDE,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xC9,0x89,0x9A,0xAB,0xBC,0xDE,0xEF,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xCB,0xA9,0x99,0xBC,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xCB,0xA9,0xAA,0xBB,0xCB,0xBB,0xAB,0xAB,0xBB,0xAB, + 0xBB,0xBA,0xBB,0xCD,0xDC,0xDB,0xCB,0xBA,0xBB,0xAB,0xAA,0xA9,0xBB,0xCD,0xEE,0xEE, + 0xED,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDB,0xDC,0xDD,0xDD,0xED,0xDE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xCD,0xDC,0xB9,0x88,0x99,0xAA,0xBB,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xCC,0xAA,0x98,0xAA,0xCE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xED,0xCA,0xA9,0xAB,0xCC,0xCB,0xBB,0xBA,0xBA,0xBA,0xBB, + 0xBA,0xBA,0x99,0x9B,0xDC,0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0xAA,0xAB,0xBC,0xEE,0xEE, + 0xEE,0xED,0xDC,0xDC,0xDB,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCC,0xCD,0xDE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xED,0xDD,0xDD,0xED,0xDD,0xDD, + 0xDC,0xDD,0xCC,0xBA,0x98,0x88,0x99,0x9A,0xAB,0xBC,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0xA9,0x8B,0xAE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD,0xEE,0xFF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xBB,0x99,0xAA,0xCC,0xCB,0xBB,0xBA,0xBA,0xAB,0xBA, + 0xBA,0x99,0x89,0x99,0xAC,0xCC,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAA,0xBB,0xCE,0xEE, + 0xEE,0xED,0xDD,0xBD,0xCD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD, + 0xDE,0xEE,0xEE,0xDD,0xDD,0xDC,0xCB,0xCD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xCB,0xA9,0x88,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xAA,0x98,0xCA,0xEE,0xEF, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xCA,0x89,0x9A,0xDC,0xCB,0xBB,0xBA,0xBA,0xBA,0xAA, + 0x99,0x99,0x89,0x89,0x9A,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAB,0xBD,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xDE, + 0xEE,0xEE,0xED,0xDD,0xCC,0xBB,0xBD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xED,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xCB,0xA8, + 0x87,0x88,0x88,0x88,0x99,0x99,0xAA,0xBB,0xBD,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0x99,0x9B,0xCE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xED,0xBA,0x99,0x99,0xAD,0xCC,0xBB,0xBB,0xBB,0xAB,0xA9, + 0x98,0x88,0x98,0x88,0x99,0xAC,0xBB,0xBB,0xCB,0xBB,0xAB,0xBB,0xBA,0x9A,0xBC,0xDE, + 0xEE,0xED,0xDD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xBD,0xCD,0xDD,0xEE, + 0xEE,0xEE,0xDD,0xCB,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xED,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xCB,0x98,0x87,0x88, + 0x88,0x88,0x89,0x99,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDC,0xBA,0xA9,0x8A,0xAC,0xEE, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xCA,0x98,0x99,0xAB,0xDC,0xBC,0xBB,0xBB,0xAA,0x99, + 0x89,0x99,0x99,0x99,0x89,0x9B,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xBB,0xDE, + 0xEE,0xED,0xDD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xDE,0xEE, + 0xEE,0xED,0xDC,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xDD,0xDD,0xDB,0xA8,0x87,0x88,0x88,0x88, + 0x89,0x89,0x99,0x9A,0xAA,0xBB,0xBB,0xDD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xAA,0x98,0xBA,0xDE, + 0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xDB,0xA9,0x89,0x9A,0xCC,0xDC,0xCB,0xBB,0xA9,0x89, + 0x89,0x99,0x99,0x99,0x88,0x99,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xAA,0xBC,0xCD, + 0xEE,0xED,0xDD,0xDC,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC,0xCD,0xBD,0xCD,0xDD,0xEE,0xEE, + 0xED,0xDC,0xCB,0xBB,0xCD,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xB9,0x88,0x78,0x88,0x88,0x88,0x99, + 0x99,0x9A,0xAA,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0x99,0x8B,0xAE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xDE,0xED,0xDD,0xDE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xB9,0x98,0x99,0xAC,0xDD,0xCB,0xA9,0x99,0x89, + 0x99,0x99,0xAC,0xA9,0x99,0x89,0xAA,0xBB,0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAD,0xDD, + 0xDD,0xED,0xDC,0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xBD,0xDC,0xDC,0xDD,0xEE,0xEE,0xEE, + 0xDD,0xDB,0xBB,0xBC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE, + 0xEE,0xEE,0xDE,0xDE,0xEE,0xED,0xEE,0xDB,0x98,0x88,0x88,0x88,0x89,0x89,0x99,0x99, + 0xAA,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xA9,0x99,0xBC, + 0xEE,0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xB9,0x99,0x89,0x9A,0xEE,0xBA,0x99,0x89,0x99, + 0x9A,0x9A,0xDE,0xDA,0xA9,0x99,0x99,0xBB,0xCB,0xBB,0xBC,0xCB,0xBA,0x99,0xAC,0xCD, + 0xDE,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xCD,0xCD,0xDE,0xEE,0xEE,0xDD, + 0xDC,0xBB,0xBC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xDE,0xED,0xB8,0x88,0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xCD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xAA,0x98,0xAA, + 0xCE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xDB,0xA9,0x89,0x99,0xBC,0xB9,0x99,0x89,0x99, + 0xAA,0xBD,0xEE,0xEC,0xA9,0x98,0x99,0xAC,0xCC,0xCB,0xCC,0xBB,0xA9,0x98,0xAB,0xBD, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xDD, + 0xBB,0xBB,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEC,0x98,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB, + 0xBB,0xCB,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0xA9,0x8B, + 0xAE,0xEE,0xFE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xED,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xAA,0x98,0x99,0x99,0x99,0x89,0x99,0xAA, + 0xAC,0xDE,0xEE,0xED,0xB9,0x98,0x89,0x9A,0xDC,0xCC,0xCB,0xAA,0x99,0x89,0xAB,0xCD, + 0xDE,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDE,0xEE,0xEE,0xDD,0xCB, + 0xBB,0xBD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xDA,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xCB,0xAA,0x98, + 0xBA,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDE,0xDD,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xED,0xDB,0xA9,0x99,0x99,0x99,0x99,0x9A,0xAB, + 0xBD,0xEE,0xEE,0xED,0xDA,0xA9,0x98,0x9A,0xCD,0xDC,0xBB,0xA9,0x98,0x99,0xAB,0xCD, + 0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDE,0xEE,0xEE,0xED,0xDC,0xBB, + 0xBC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xB9,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB,0xBA,0x99, + 0x9B,0xCE,0xEF,0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDE,0xFE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xDB,0xBA,0x99,0x99,0x99,0x99,0xAA,0xBD, + 0xDE,0xEE,0xEE,0xEE,0xDD,0xAA,0x98,0x89,0x9B,0xDD,0xAA,0x98,0x89,0x9A,0xBB,0xDE, + 0xDD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xEF,0xEE,0xEC,0xBB,0xBB, + 0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xA8,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDC,0xBA,0xA9, + 0x9A,0xAC,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xEE, + 0xFE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xDA,0xAA,0x99,0x99,0xAA,0xAB,0xDE, + 0xEE,0xEE,0xFE,0xEE,0xED,0xCA,0x99,0x89,0x99,0xBA,0x99,0x98,0x99,0xAB,0xBD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xDC,0xBB,0xBD, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEC, + 0x98,0x88,0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xAA, + 0x98,0xBB,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDE, + 0xFE,0xFE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEC,0xAA,0xAA,0xAA,0xAB,0xCD,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xDB,0x99,0x98,0x99,0x99,0x98,0x99,0x9A,0xBB,0xDE,0xED, + 0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xDB,0xCD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0x88, + 0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA, + 0xA9,0x8B,0xAE,0xEE,0xEF,0xEE,0xEE,0xDE,0xDE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xEE, + 0xFE,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xDB,0xAB,0xAA,0xBD,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xB9,0x99,0x89,0x89,0x89,0x9A,0xAB,0xCD,0xDE,0xDD, + 0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEB,0x88,0x88, + 0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xCB, + 0xA9,0x98,0xBB,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDE, + 0xEF,0xFE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDC,0xBC,0xDE,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xEF,0xEE,0xED,0xDA,0x99,0x99,0x99,0x99,0xAB,0xBD,0xDE,0xED,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xED,0xED,0xED,0xDD,0xDD, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0x88,0x88,0x89, + 0x99,0x9A,0xAA,0xBB,0xBB,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB, + 0xBA,0x99,0x9B,0xCE,0xEF,0xEE,0xEE,0xDE,0xDE,0xDE,0xEF,0xEE,0xEE,0xED,0xED,0xED, + 0xEF,0xEF,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDC,0xAA,0xA9,0x99,0xAA,0xBC,0xDD,0xEE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xED,0xDD,0xDE,0xDD,0xDD,0xED, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEA,0x88,0x88,0x88,0x99, + 0x9A,0xAA,0xBB,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC, + 0xBA,0xA9,0x89,0xBD,0xEE,0xEF,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE, + 0xEF,0xFF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xEE,0xEE, + 0xFE,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xBA,0xAA,0xAA,0xAB,0xDD,0xEE,0xED,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEB,0x88,0x88,0x89,0x99,0x9A, + 0xAA,0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD, + 0xBB,0xAA,0x98,0xBB,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDE,0xEF,0xFF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDC,0xBB,0xAB,0xCD,0xDD,0xEE,0xED,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xED,0xBD,0xDE,0xDE,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0x88,0x88,0x89,0x99,0xAA,0xAB, + 0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED, + 0xCC,0xBA,0x99,0x8B,0xBE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xFE,0xEE,0xED,0xED, + 0xDD,0xEF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xED,0xBB,0xDD,0xED,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEC,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE, + 0xDC,0xBB,0xA9,0x99,0xCC,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xED,0xEE,0xFF,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xDC,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCC, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xED,0xCB,0xAA,0x99,0x9B,0xCE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xEF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF, + 0xFF,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xCB,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xA8,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xED,0xDB,0xBA,0xA9,0x8A,0xBD,0xEE,0xEE,0xFE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xED, + 0xED,0xED,0xEE,0xFF,0xFF,0xEF,0xFE,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xED, + 0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xDB,0xBB,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xB8,0x88,0x88,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xEE,0xDD,0xBB,0xAA,0x98,0xBB,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDE,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xFE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xDC,0xCC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xC8,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xED,0xDB,0xBA,0x99,0x8B,0xCE,0xEF,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xED,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDE,0xDC,0xBC,0xCD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEA,0x88,0x88,0x99,0x9A,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xDC,0xBB,0xA9,0x98,0xCC,0xEE,0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xEE,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFE,0xFE,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD, + 0xED,0xDD,0xDD,0xDD,0xCB,0xBC,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEB,0x88,0x88,0x99,0x9A,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xDD,0xCB,0xAA,0x99,0x9C,0xCE,0xEE,0xFE,0xEE,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFF, + 0xFF,0xFE,0xFF,0xFE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE, + 0xDD,0xDC,0xCB,0xBB,0xBC,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0x98,0x88,0x99,0x9A,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xDB,0xBA,0xA9,0x99,0xBD,0xEE,0xEE,0xFE,0xED,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xED,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDD, + 0xDD,0xBB,0xBB,0xBB,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xA8,0x88,0x89,0x9A,0xAA,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xDD,0xBB,0xAA,0x98,0xBB,0xEE,0xFE,0xEF,0xEE,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xEF, + 0xFF,0xFE,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD, + 0xDC,0xBB,0xBB,0xDD,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xD9,0x88,0x89,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0x99,0x8B,0xCE,0xEE,0xFE,0xEE,0xED,0xED,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF, + 0xFE,0xFF,0xEF,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDE,0xDE,0xDD,0xDC, + 0xBB,0xBB,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEC,0x88,0x88,0x99,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xED,0xDC,0xBB,0xA9,0x98,0xCC,0xEE,0xEE,0xEF,0xEE,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDB, + 0xBB,0xBD,0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xA8,0x88,0x99,0xAA,0xAB,0xBB,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xED,0xCB,0xAA,0x99,0x9C,0xCE,0xEF,0xEE,0xEE,0xED,0xDE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xEF,0xFE,0xFE,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCC,0xBB, + 0xBD,0xDD,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xD9, + 0x88,0x89,0x9A,0xAB,0xBB,0xDD,0xDE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0xA9,0x99,0xCD,0xEE,0xEE,0xFE,0xEE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xEF,0xFE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xBB,0xBD, + 0xDE,0xDE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEB,0x88, + 0x89,0x9A,0xAA,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xAA,0x98,0x9C,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF, + 0xFE,0xFF,0xEF,0xEE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEC,0xBB,0xCD,0xDD, + 0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0x98,0x89, + 0x99,0xAA,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x8A,0xBE,0xEE,0xFE,0xEF,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xFE,0xFE,0xFE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xBB,0xDD,0xED, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB9,0x88,0x99, + 0x9A,0xAB,0xBB,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBB,0xA9,0x98,0xBC,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xCB,0xBB,0xDD,0xDD,0xED, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEA,0x88,0x89,0x9A, + 0xAB,0xBB,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xCB,0xBA,0x99,0x8C,0xCE,0xEF,0xEE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xCB,0xDD,0xDD,0xEE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0x98,0x89,0x99,0xAA, + 0xBB,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBA,0xA9,0x98,0xCD,0xEE,0xEF,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xA8,0x88,0x99,0xAA,0xBB, + 0xBD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD,0xBB,0xAA,0x99,0x9C,0xDE,0xEE,0xFE,0xEE, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDE,0xDE,0xDD,0xED,0xED,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xD9,0x88,0x99,0x9A,0xAB,0xBC, + 0xDD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9,0x89,0xCE,0xEE,0xEE,0xFE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xFF,0xEE,0xEE,0xDD,0xEE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEB,0x88,0x89,0x9A,0xAA,0xBB,0xCD, + 0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xAA,0x98,0xAC,0xEE,0xFE,0xEE, + 0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xED,0xED,0xED,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0x98,0x89,0x99,0xAA,0xBB,0xBD,0xDD, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xCB,0xBA,0x99,0x8B,0xCE,0xEE,0xFE, + 0xEF,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xA8,0x88,0x99,0x9A,0xAB,0xBD,0xDD,0xEE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBB,0xA9,0x98,0xBC,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xD9,0x88,0x89,0x9A,0xAB,0xBC,0xCD,0xDE,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x8C,0xCE,0xEF, + 0xEF,0xEE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEA,0x88,0x89,0x9A,0xAA,0xBB,0xCD,0xDE,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xCD,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0x88,0x88,0x99,0x9A,0xAB,0xBC,0xDD,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF +}; + +const uint32_t PokeMini_BG3_PalRGB32[] = { + 0x00101010,0x00606058,0x00787878,0x00808080, + 0x00989880,0x00A0A090,0x00A8A898,0x00B0B0A0, + 0x00C0C0B8,0x00C8C8C0,0x00D0D0C8,0x00D8D8D0, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint32_t PokeMini_BG3_PalBGR32[] = { + 0x00101010,0x00586060,0x00787878,0x00808080, + 0x00809898,0x0090A0A0,0x0098A8A8,0x00A0B0B0, + 0x00B8C0C0,0x00C0C8C8,0x00C8D0D0,0x00D0D8D8, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint16_t PokeMini_BG3_PalRGB16[] = { + 0x1082,0x630B,0x7BCF,0x8410,0x9CD0,0xA512,0xAD53,0xB594, + 0xC617,0xCE58,0xD699,0xDEDA,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG3_PalBGR16[] = { + 0x1082,0x5B0C,0x7BCF,0x8410,0x84D3,0x9514,0x9D55,0xA596, + 0xBE18,0xC659,0xCE9A,0xD6DB,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG3_PalRGB15[] = { + 0x8842,0xB18B,0xBDEF,0xC210,0xCE70,0xD292,0xD6B3,0xDAD4, + 0xE317,0xE738,0xEB59,0xEF7A,0xEF7B,0xF39C,0xF7BD,0xFFFF +}; + diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG3.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG3.h new file mode 100644 index 0000000000..f1171f8cdb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG3.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_BG_X3 +#define POKEMINI_BG_X3 + +#include + +// PokeMini Background Image +// 288 x 192 (3x3) - 4bpp (LSn Left pixel) +extern const uint8_t PokeMini_BG3[]; + +// PokeMini Background Palette (RGBX8888) +extern const uint32_t PokeMini_BG3_PalRGB32[]; + +// PokeMini Background Palette (BGRX8888) +extern const uint32_t PokeMini_BG3_PalBGR32[]; + +// PokeMini Background Palette (RGB565) +extern const uint16_t PokeMini_BG3_PalRGB16[]; + +// PokeMini Background Palette (BGR565) +extern const uint16_t PokeMini_BG3_PalBGR16[]; + +// PokeMini Background Palette (RGB555) +extern const uint16_t PokeMini_BG3_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG4.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG4.c new file mode 100644 index 0000000000..afd3d5785c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG4.c @@ -0,0 +1,3124 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_BG4[] = { + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x85,0x21,0x37, + 0x88,0x88,0x88,0x88,0x10,0x01,0x88,0x88,0x88,0x88,0x84,0x11,0x14,0x62,0x11,0x43, + 0x12,0x68,0x88,0x88,0x86,0x21,0x38,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00, + 0x01,0x33,0x33,0x30,0x00,0x00,0x03,0x33,0x33,0x33,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x02,0x33,0x33,0x20,0x00,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x00,0x12,0x10, + 0x00,0x31,0x11,0x30,0x08,0x80,0x01,0x13,0x11,0x13,0x00,0x22,0x30,0x01,0x22,0x00, + 0x41,0x00,0x13,0x12,0x00,0x14,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x09,0xFF,0xFF, + 0x10,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x0F,0xFF,0x11, + 0xF9,0x00,0x00,0x00,0x00,0xEE,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x30,0x0F,0xF5,0xEF, + 0x90,0x00,0x11,0x00,0x1F,0xF0,0x11,0x00,0x01,0x10,0x02,0xFF,0xF1,0x2F,0xFF,0x00, + 0x41,0x01,0x00,0x10,0x00,0x22,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x1F,0xF0,0x9F, + 0xF0,0x9F,0xFF,0x70,0x2F,0x84,0xFF,0x15,0xFF,0xF8,0x05,0xFF,0xF1,0xEF,0xFF,0x08, + 0xF2,0x2F,0xCC,0xFE,0x02,0xF9,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x2F,0xFC,0xFF, + 0x78,0xFF,0xEF,0xF1,0x8F,0xCF,0xF1,0x2F,0xF7,0xFF,0x0C,0xF7,0xF5,0xF9,0xF9,0x0F, + 0xF1,0x5F,0xF9,0xFF,0x18,0xF5,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x5F,0xFF,0xF8, + 0x0F,0xF9,0x1F,0xF1,0xEF,0xFF,0x40,0x8F,0xFF,0xFE,0x0F,0xF2,0xFF,0xE4,0xF8,0x0F, + 0xF0,0x8F,0x51,0xFF,0x0C,0xF2,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x8F,0x51,0x00, + 0x1F,0xF2,0xCF,0xF1,0xFF,0xFF,0xC0,0xCF,0xC8,0x40,0x1F,0x82,0xFF,0x27,0xF2,0x1F, + 0xF0,0xFF,0x12,0xFE,0x0F,0xF1,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0xFF,0x10,0x00, + 0x0E,0xFF,0xFF,0x81,0xFF,0x1F,0xF1,0x7F,0xFC,0xF1,0x5F,0x22,0xFF,0x08,0xF2,0x2F, + 0x80,0xFF,0x05,0xF8,0x1F,0xF0,0x02,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x21,0x00,0xFF,0x00,0x20, + 0x01,0xEF,0xF5,0x02,0xF9,0x0C,0xF7,0x0C,0xFF,0x80,0xCF,0x11,0x82,0x0F,0xF1,0x8F, + 0x41,0xFF,0x08,0xF2,0x2F,0xC0,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x32, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x00,0x01,0x33, + 0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x87,0x54,0x44,0x44,0x44,0x44,0x44,0x43,0x34,0x33,0x23,0x22,0x23,0x33,0x33,0x33, + 0x33,0x33,0x32,0x32,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x33,0x22,0x22,0x22,0x22,0x23,0x21,0x11,0x11,0x11,0x11,0x22,0x21, + 0x11,0x12,0x21,0x12,0x22,0x11,0x21,0x11,0x22,0x21,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x33,0x32,0x22,0x33,0x33,0x33,0x22,0x22,0x22,0x33,0x33,0x33,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x98,0x76,0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x43,0x33,0x33,0x44,0x44,0x44,0x44, + 0x44,0x44,0x43,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x22,0x22,0x22,0x23, + 0x33,0x33,0x33,0x43,0x33,0x32,0x22,0x23,0x43,0x22,0x11,0x11,0x11,0x13,0x43,0x11, + 0x23,0x21,0x24,0x22,0x44,0x21,0x11,0x24,0x42,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x21,0x11,0x11,0x11,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x12,0x11,0x11,0x11, + 0x21,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x23,0x33,0x23,0x22,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x45,0x45,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0xB9,0x88,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x53,0x22,0x11,0x11,0x12,0x55,0x32,0x21, + 0x25,0x63,0x25,0x53,0x24,0x31,0x24,0x54,0x21,0x11,0x11,0x11,0x11,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x35,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x55,0x55,0x55,0x54,0x44,0x44,0x44,0x44,0x55,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0xDC,0xAA,0xAA,0xA9,0x99,0x99,0x98,0x88,0x87,0x77,0x77,0x78,0x88,0x88,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x66, + 0x67,0x77,0x76,0x66,0x66,0x65,0x55,0x77,0x54,0x23,0x33,0x32,0x26,0x75,0x34,0x54, + 0x23,0x77,0x44,0x77,0x32,0x25,0x77,0x53,0x33,0x23,0x32,0x22,0x23,0x34,0x44,0x44, + 0x44,0x44,0x34,0x33,0x44,0x43,0x34,0x33,0x33,0x33,0x44,0x33,0x33,0x33,0x33,0x33, + 0x34,0x33,0x33,0x43,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x43,0x33, + 0x33,0x34,0x44,0x44,0x44,0x44,0x44,0x33,0x32,0x22,0x22,0x22,0x23,0x22,0x32,0x22, + 0x22,0x22,0x22,0x32,0x32,0x32,0x33,0x32,0x46,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x77,0x88,0x88,0x99, + 0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xEE,0xDD,0xDD,0xCC,0xCC,0xCC,0xBB,0xBA,0x98,0x88,0x89,0x99,0x99,0x99,0x99,0x89, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x87,0x77,0x77,0x77,0x88, + 0x88,0x88,0x88,0x88,0x87,0x77,0x78,0x98,0x54,0x43,0x33,0x33,0x49,0x84,0x58,0xA8, + 0x86,0x79,0xA6,0x56,0x44,0x79,0x85,0x43,0x33,0x33,0x33,0x33,0x44,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x55,0x55,0x55,0x45,0x54,0x54,0x54,0x55, + 0x45,0x44,0x54,0x54,0x54,0x55,0x54,0x54,0x54,0x55,0x54,0x54,0x55,0x45,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x44,0x33,0x33,0x33,0x33,0x33,0x33,0x34, + 0x33,0x33,0x43,0x33,0x33,0x33,0x33,0x33,0x47,0x87,0x87,0x77,0x78,0x88,0x87,0x87, + 0x87,0x88,0x78,0x88,0x88,0x88,0x88,0x88,0x88,0x99,0x98,0x88,0x88,0x89,0xBB,0xBC, + 0xCC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xEE,0xED,0xDB,0xBA,0xAA,0xAB,0xCB,0xBB,0xBB,0xBB,0xAA, + 0xAA,0x99,0xAB,0xAA,0xAA,0xBB,0xBB,0xAA,0xBA,0xAA,0xAA,0x99,0x88,0x88,0x98,0x98, + 0x99,0xA9,0x98,0x98,0x88,0x88,0x9A,0x97,0x54,0x44,0x44,0x44,0x7A,0x84,0x48,0xA9, + 0x77,0x9A,0xA8,0x44,0x69,0xA8,0x54,0x44,0x44,0x44,0x44,0x45,0x66,0x67,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x65,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x66,0x55,0x54,0x44,0x44,0x44,0x44,0x44,0x43, + 0x44,0x44,0x34,0x43,0x44,0x44,0x44,0x44,0x58,0x88,0x88,0x88,0x88,0x89,0x88,0x88, + 0x88,0x88,0x98,0x9A,0xA9,0xAA,0x9A,0xAA,0xAA,0xBA,0xAA,0xA9,0x99,0xAA,0xBD,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDB,0xBB,0xBC,0xDD,0xDD,0xDD,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A, + 0xAA,0xAA,0xAA,0x99,0x99,0x89,0xCC,0x85,0x54,0x44,0x44,0x44,0x7D,0x95,0x44,0x9D, + 0xA6,0x55,0x75,0x58,0xBC,0x85,0x54,0x44,0x44,0x44,0x46,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x67,0x77,0x67,0x76,0x76,0x76,0x76,0x76,0x67,0x66,0x76,0x76,0x76, + 0x67,0x66,0x67,0x66,0x76,0x76,0x66,0x66,0x67,0x67,0x67,0x67,0x67,0x66,0x76,0x76, + 0x66,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x58,0x99,0x98,0x98,0x98,0x99,0x89,0x89, + 0x89,0x89,0x9A,0xAA,0xBA,0xAB,0xBB,0xBC,0xBB,0xBB,0xBA,0xBA,0xBA,0xAB,0xBD,0xDE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xDD,0xBB,0xDD,0xED,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xBC,0xCD,0xDD,0xCD,0xCD,0xCD,0xCC,0xCC,0xCB,0xBB,0xBA,0xBA,0xAA,0xBA,0xAA,0xBA, + 0xAA,0xAA,0xAA,0x99,0x99,0x9B,0xD9,0x65,0x54,0x45,0x44,0x45,0x6D,0xB6,0x55,0x5A, + 0xDB,0x64,0x47,0xAD,0xA7,0x54,0x44,0x44,0x54,0x55,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x67,0x67,0x77,0x67,0x67,0x67, + 0x77,0x67,0x77,0x67,0x67,0x67,0x67,0x77,0x77,0x67,0x67,0x67,0x76,0x77,0x77,0x67, + 0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x64,0x44,0x44,0x44,0x44,0x45, + 0x44,0x44,0x54,0x45,0x45,0x44,0x45,0x44,0x57,0xA9,0x98,0x99,0x98,0x88,0x99,0x89, + 0x89,0x99,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBC,0xDE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xBC,0xCD,0xDD,0xDE,0xDD,0xDD,0xDC,0xCB,0xBB, + 0xDC,0xDD,0xCD,0xDC,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xAA,0xAB,0xAB,0xAA,0xAB,0xAB, + 0xAA,0xAA,0x99,0x99,0x9A,0xAB,0xA7,0x55,0x45,0x44,0x54,0x44,0x5A,0xE8,0x55,0x55, + 0xAA,0x65,0x8D,0xE9,0x65,0x45,0x44,0x54,0x45,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x67,0x76,0x76,0x76, + 0x76,0x77,0x66,0x66,0x66,0x77,0x76,0x76,0x76,0x77,0x76,0x76,0x77,0x77,0x67,0x77, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x44,0x44,0x45,0x44,0x44, + 0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x45,0x57,0x99,0x99,0x99,0x99,0x88,0x88,0x89, + 0x89,0x99,0xAB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xBA,0xCE, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xDB,0xBD,0xDD,0xED,0xDD,0xDD,0xCB,0xBB,0xBC, + 0xCD,0xDD,0xDD,0xCD,0xDC,0xCC,0xBB,0xBB,0xBB,0xBA,0xAB,0xBA,0xBA,0xBB,0xAA,0xAA, + 0xA9,0x99,0x99,0x99,0x99,0xAA,0x75,0x54,0x54,0x54,0x45,0x44,0x47,0xDC,0x85,0x54, + 0x55,0x69,0xDC,0x85,0x54,0x44,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x77,0x67,0x77,0x67,0x77,0x77, + 0x77,0x66,0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x67,0x67,0x77,0x67,0x67,0x76,0x77, + 0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x56,0x99,0x99,0x99,0x99,0x88,0x89,0x89, + 0x89,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC,0xBC,0xCD,0xDD,0xDB,0xBB,0xBC, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDC,0xCC,0xDD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xCD, + 0xDC,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xBB,0xAA, + 0x99,0x99,0x99,0x99,0x9A,0xA8,0x64,0x45,0x45,0x45,0x44,0x45,0x44,0x6D,0xEB,0x87, + 0x89,0xCD,0xA7,0x54,0x45,0x44,0x54,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x76,0x76,0x76,0x66, + 0x66,0x66,0x66,0x76,0x76,0x77,0x67,0x67,0x67,0x77,0x77,0x67,0x77,0x77,0x77,0x76, + 0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x54,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x45,0x46,0x89,0x99,0x99,0xA9,0x88,0x88,0x89, + 0x89,0x9A,0xAB,0xBB,0xAA,0xBA,0xBB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xBB,0xBB, + 0xBE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDC,0xCB,0xDD,0xDE,0xDD,0xDD,0xCC,0xBB,0xBD,0xCC, + 0xDD,0xDD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xA9, + 0x98,0xA9,0x99,0x99,0x9A,0x86,0x55,0x54,0x44,0x44,0x45,0x44,0x54,0x46,0x9B,0xDD, + 0xDD,0xC8,0x55,0x45,0x44,0x44,0x44,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x77,0x77,0x66,0x66, + 0x66,0x66,0x66,0x76,0x66,0x67,0x77,0x77,0x77,0x77,0x67,0x77,0x67,0x76,0x76,0x77, + 0x76,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x44,0x44,0x44, + 0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x55,0x89,0x99,0x99,0x99,0x88,0x89,0x89, + 0x99,0x9A,0xAA,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBC,0xCD,0xDD,0xEE,0xED,0xDB,0xBB, + 0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xEC,0xCB,0xCD,0xDE,0xDD,0xDD,0xCD,0xBC,0xCC,0xDC,0xDD, + 0xCD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xA9, + 0x99,0x99,0x9A,0x99,0xA9,0x75,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x67, + 0x77,0x55,0x44,0x44,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x76,0x77,0x66,0x66,0x66, + 0x66,0x55,0x66,0x77,0x66,0x66,0x77,0x67,0x67,0x67,0x77,0x67,0x77,0x67,0x77,0x76, + 0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x74,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x55,0x89,0xA9,0xAA,0x99,0x98,0x88,0x99, + 0x99,0xAA,0xAB,0xAB,0xBA,0xAA,0xBA,0xAB,0xBB,0xBB,0xBC,0xDD,0xDE,0xEE,0xDD,0xBB, + 0xBB,0xCE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xFE,0xEE,0xDD,0xDB,0xBD,0xDD,0xDD,0xDD,0xDC,0xBC,0xBD,0xBD,0xCC, + 0xDD,0xDC,0xBB,0xBA,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xCC,0xCB,0xA9, + 0x99,0xA9,0x99,0xA9,0xA7,0x55,0x54,0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x54,0x44,0x54,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x77,0x67,0x66,0x66,0x77, + 0x66,0x66,0x66,0x67,0x67,0x67,0x67,0x77,0x77,0x76,0x76,0x77,0x67,0x77,0x76,0x77, + 0x76,0x77,0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x45,0x44,0x44, + 0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x7A,0xAB,0xBB,0xA9,0x98,0x99,0x99, + 0x99,0x9A,0xAA,0xBA,0xBB,0xBB,0xAA,0xBA,0xBB,0xAB,0xBB,0xBC,0xDD,0xEE,0xED,0xDB, + 0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xCC,0xDD,0xDE,0xDD,0xDB,0xCC,0xCD,0xBC,0xDC,0xDD, + 0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDB,0x99, + 0xAA,0xAA,0xAA,0xAA,0x86,0x55,0x45,0x44,0x54,0x44,0x44,0x54,0x45,0x44,0x54,0x54, + 0x54,0x44,0x44,0x44,0x44,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x67,0x77,0x77,0x76,0x66,0x66,0x67, + 0x76,0x66,0x66,0x67,0x66,0x66,0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x67,0x77,0x76, + 0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x64,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x55,0x79,0xAC,0xCB,0xAA,0xBB,0x89,0x99, + 0x99,0xAA,0xAA,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBB,0xCD,0xDE,0xEE,0xDC, + 0xBB,0xAB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xDD,0xDD,0xBB,0xDD,0xDD,0xDD,0xDD,0xCC,0xCB,0xDC,0xCC,0xDC, + 0xDC,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDA,0x9A, + 0xAA,0xAA,0xAA,0xA9,0x75,0x54,0x44,0x54,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x45,0x45,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x77,0x77,0x67,0x67,0x66,0x56,0x66, + 0x67,0x67,0x66,0x67,0x77,0x66,0x66,0x77,0x77,0x76,0x77,0x67,0x67,0x77,0x67,0x77, + 0x76,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x45,0x44, + 0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x7A,0xAA,0xAA,0xAA,0xAE,0x9A,0xAA, + 0x9A,0xAA,0xAA,0xAA,0xBA,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xDD,0xEE,0xED, + 0xBB,0xBA,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDD,0xCC,0xCD,0xDD,0xED,0xDD,0xCC,0xCC,0xDB,0xCC,0xDB,0xDC, + 0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xA7,0x65,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x44, + 0x44,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77,0x76,0x66,0x65,0x66, + 0x66,0x67,0x76,0x76,0x77,0x66,0x67,0x77,0x66,0x66,0x66,0x67,0x77,0x67,0x77,0x67, + 0x77,0x76,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x64,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x7A,0xA9,0x99,0x99,0x99,0x9A,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xCD,0xEE,0xED, + 0xBB,0xBB,0xBB,0xCE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xDD,0xDD,0xDC,0xCC,0xDD,0xDD,0xDC,0xDB,0xDC,0xCB,0xDC,0xDD,0xCC, + 0xCB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9,0x9A,0xAA, + 0xAA,0xBA,0xAA,0x86,0x54,0x54,0x54,0x54,0x44,0x44,0x54,0x54,0x44,0x45,0x44,0x44, + 0x45,0x44,0x54,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x66,0x66,0x66,0x77,0x76,0x66,0x66, + 0x67,0x66,0x67,0x77,0x76,0x76,0x76,0x77,0x66,0x66,0x66,0x66,0x67,0x77,0x67,0x77, + 0x76,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x76,0x76,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x45,0x45,0x7A,0xA9,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xAB,0xAA,0xAB,0xAB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xBD,0xBB, + 0xBA,0xBA,0xAB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xCD,0xDC,0xBB,0xCD,0xDD,0xDD,0xDC,0xDB,0xCC,0xCD,0xCD,0xBC,0xCB, + 0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xA9,0xAA,0xAA, + 0xBA,0xBA,0xA9,0x76,0x55,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45, + 0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x67,0x66,0x66,0x66,0x66,0x67, + 0x76,0x66,0x66,0x77,0x67,0x76,0x66,0x76,0x66,0x76,0x66,0x66,0x67,0x77,0x77,0x77, + 0x77,0x76,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54, + 0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x55,0x7A,0x99,0x98,0x99,0x99,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAB,0xAB,0xAA,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xFE,0xED,0xBC,0xDD,0xDC,0xCB,0xDD,0xDD,0xDD,0xCC,0xBC,0xCD,0xCD,0xCB,0xBB, + 0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xAA,0xAA, + 0xAB,0xAA,0xB8,0x65,0x54,0x54,0x54,0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x45,0x44, + 0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x76,0x77,0x66,0x66,0x66,0x67, + 0x66,0x66,0x66,0x67,0x77,0x67,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x77,0x77,0x76, + 0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x75, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x6A,0xA9,0x99,0x89,0x98,0xBA,0xAA, + 0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAB,0xBB,0xBB,0xAA,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEB,0xCD,0xDB,0xCC,0xBC,0xDC,0xDD,0xDC,0xCB,0xBC,0xCD,0xCD,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xAA,0xAA, + 0xAA,0xAB,0xA7,0x55,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x66,0x66,0x67,0x76,0x76,0x66,0x76,0x66, + 0x76,0x66,0x66,0x76,0x76,0x77,0x66,0x76,0x66,0x66,0x66,0x66,0x66,0x77,0x77,0x67, + 0x77,0x76,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x55,0x6A,0xA9,0x99,0x99,0x98,0xAA,0xA9, + 0xAA,0xAA,0xBA,0xAA,0x9A,0xAA,0xAA,0x9A,0x9A,0xAA,0xAB,0xBB,0xAB,0xBA,0xBB,0xBB, + 0xBB,0xBD,0xCC,0xBB,0xBC,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEA,0xBC,0xDD,0xCB,0xDB,0xDB,0xDC,0xDD,0xCD,0xCC,0xCC,0xCC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAA, + 0xAA,0xAB,0x86,0x55,0x44,0x54,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45, + 0x57,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x66,0x77,0x67,0x66,0x66,0x66,0x77,0x76,0x66,0x66,0x66, + 0x66,0x67,0x66,0x66,0x66,0x77,0x66,0x66,0x66,0x66,0x56,0x66,0x67,0x67,0x67,0x77, + 0x76,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77, + 0x74,0x54,0x44,0x44,0x44,0x44,0x54,0x45,0x45,0x6A,0xAA,0x99,0x99,0x98,0xAB,0xAA, + 0x9A,0xAA,0xAA,0xAA,0xA9,0xAA,0xA9,0xAA,0x99,0x99,0xAB,0xBB,0xBA,0xAB,0xBB,0xBC, + 0xCD,0xDD,0xDD,0xDC,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xB9,0xDD,0xDB,0xCC,0xCC,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBA,0xAA,0xBB, + 0xAA,0xA9,0x75,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x45, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x66,0x67,0x66,0x66,0x76,0x76,0x66,0x66,0x65, + 0x56,0x66,0x66,0x66,0x66,0x67,0x76,0x66,0x66,0x66,0x65,0x65,0x67,0x77,0x77,0x77, + 0x77,0x76,0x76,0x77,0x76,0x77,0x76,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x7A,0xAA,0xAA,0x99,0xA9,0xAA,0xA9, + 0xAA,0xAA,0xAA,0xA9,0x9A,0xAA,0xAA,0x99,0x9A,0x9A,0xAA,0xBA,0xAA,0xBA,0xBB,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xBB,0xCD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xA9,0xDD,0xDC,0xDC,0xBD,0xCC,0xCC,0xDC,0xDD,0xCC,0xBB,0xCB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCD,0xBA,0x9A,0xAA,0xAB, + 0xBA,0xA7,0x64,0x54,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x57, + 0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x66,0x77,0x76,0x66,0x66,0x77,0x67,0x66,0x67,0x76,0x76,0x76,0x66, + 0x66,0x67,0x66,0x67,0x66,0x67,0x66,0x66,0x66,0x66,0x66,0x56,0x67,0x77,0x76,0x77, + 0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77, + 0x77,0x74,0x54,0x44,0x45,0x44,0x44,0x54,0x45,0x6A,0xAA,0xAA,0xA9,0xAA,0xA9,0x99, + 0xA9,0xAA,0xAA,0xAA,0x9A,0x9A,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDB,0xBC,0xCD,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0x8A,0xDD,0xDC,0xCC,0xDC,0xDC,0xDB,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBA,0xAA,0x9A,0xAA, + 0xAA,0x97,0x55,0x44,0x54,0x54,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x45,0x47,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x76,0x66,0x76,0x66,0x77,0x77,0x67,0x67,0x76,0x66,0x77,0x76, + 0x76,0x77,0x66,0x67,0x66,0x56,0x76,0x56,0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77, + 0x76,0x77,0x77,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77, + 0x76,0x86,0x44,0x45,0x44,0x44,0x54,0x44,0x55,0x7B,0xAA,0xAA,0xBA,0xBA,0xAA,0xA9, + 0x9A,0x9A,0xAA,0x9A,0x99,0xAA,0x9A,0x9A,0x9A,0xA9,0xAA,0xAA,0xAA,0xAB,0xBD,0xCD, + 0xDD,0xDD,0xDD,0xED,0xDD,0xBB,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEB,0x8A,0xDD,0xDC,0xDC,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xAB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0x86,0x54,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x55,0x77,0x78, + 0x78,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x67,0x66,0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x66,0x67,0x67, + 0x77,0x66,0x56,0x67,0x65,0x55,0x55,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x68,0x64,0x44,0x44,0x44,0x44,0x45,0x45,0x7A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBA, + 0xA9,0xA9,0xAA,0xAA,0xA9,0x9A,0xAA,0x9A,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xCB,0xDD, + 0xDD,0xCD,0xDD,0xDD,0xDD,0xCC,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEA,0x8C,0xDD,0xCC,0xCC,0xDD,0xED,0xDB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0x75,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x57,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x66,0x66,0x67,0x66,0x66,0x77,0x77,0x77,0x77,0x76,0x66,0x67, + 0x67,0x65,0x55,0x55,0x56,0x65,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x67,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77, + 0x77,0x77,0x85,0x44,0x44,0x54,0x44,0x54,0x55,0x8A,0xA9,0xAA,0xAB,0xBB,0xBB,0xAA, + 0x99,0x9A,0x9A,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0x99,0x9A,0xAA,0xAB,0xBB,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xDC,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xE9,0x8C,0xDD,0xCD,0xBD,0xDD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC,0xBA,0xAA,0xAA,0xAA, + 0xB8,0x65,0x54,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x54,0x44,0x46,0x77,0x77,0x78, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x66,0x67,0x67,0x77,0x66,0x67,0x77,0x77,0x77,0x66,0x66,0x66, + 0x66,0x65,0x66,0x56,0x66,0x76,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x78,0x54,0x44,0x44,0x54,0x44,0x45,0x7B,0xA9,0x99,0xAB,0xAB,0xBB,0xBB, + 0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAB,0xBB,0xBB,0xCC,0xDD, + 0xDC,0xDC,0xDD,0xDD,0xDE,0xDD,0xCB,0xBC,0xCE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xD8,0x8C,0xDD,0xDC,0xDC,0xDD,0xDD,0xCC,0xBC,0xBB,0xBC,0xBB,0xBB,0xBC,0xBC, + 0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xBD,0xBA,0xAC,0xCA,0xAA, + 0xA7,0x64,0x54,0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x55,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x66,0x67,0x66,0x67,0x66,0x66,0x67,0x67,0x67,0x66,0x76,0x67, + 0x66,0x66,0x76,0x56,0x67,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x78, + 0x77,0x77,0x77,0x74,0x44,0x44,0x44,0x54,0x55,0x8B,0xA9,0x9A,0x9A,0xAA,0xBB,0xBB, + 0xBA,0xAA,0x9A,0xAA,0x9A,0xAA,0xAB,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xBC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDB,0xBB,0xCD,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xC8,0x8D,0xDD,0xCD,0xCC,0xDD,0xDD,0xDC,0xCB,0xBB,0xCC,0xCC,0xCB,0xBB,0xBB, + 0xCB,0xBB,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAB,0xBC,0xCA,0xBB,0xAA,0x9A,0x99,0xAA, + 0x86,0x55,0x45,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x57,0x77,0x87,0x77,0x87, + 0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x66,0x76,0x66,0x67,0x66,0x66,0x66,0x66,0x66,0x66,0x56,0x66, + 0x77,0x66,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x78,0x77,0x77,0x75,0x54,0x44,0x54,0x44,0x55,0x8B,0x99,0x99,0x9A,0x9A,0xAA,0xAB, + 0xAB,0xAA,0xAA,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xBB,0xCC,0xDD,0xDD,0xDC, + 0xDC,0xDC,0xDD,0xDD,0xDD,0xED,0xDD,0xCB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xB8,0x8D,0xDD,0xDC,0xDC,0xDD,0xDC,0xBC,0xBB,0xCD,0xDD,0xDB,0xBB,0xBB,0xCB, + 0xBC,0xBB,0xBA,0xAA,0xAA,0xAA,0xA9,0xAA,0xBB,0xBD,0xDD,0xDC,0xBA,0x98,0x99,0x9A, + 0x76,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x77,0x87,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x66,0x66,0x66,0x67,0x66,0x66,0x67,0x66,0x66,0x66,0x77,0x66,0x56,0x56,0x67, + 0x65,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87, + 0x77,0x77,0x77,0x65,0x44,0x54,0x44,0x54,0x56,0x8A,0x99,0x9A,0x9A,0xA9,0xAA,0xAB, + 0xBB,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xBC,0xBB,0xBB,0xAB,0xBB,0xCD,0xDD,0xDD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xCB,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0x97,0x8D,0xDD,0xCD,0xCD,0xCD,0xDD,0xCB,0xBB,0xCD,0xDD,0xCD,0xCC,0xBB,0xBB, + 0xDB,0xDB,0xBA,0xAA,0xBA,0xA9,0xAA,0xAA,0xAB,0xCC,0xDD,0xDE,0xB9,0x99,0x99,0xA9, + 0x75,0x45,0x45,0x44,0x54,0x44,0x45,0x45,0x44,0x44,0x67,0x77,0x77,0x87,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x76,0x66,0x67,0x66,0x66,0x76,0x66,0x76,0x66,0x76,0x66,0x67,0x66,0x65,0x55,0x56, + 0x66,0x66,0x77,0x77,0x67,0x67,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x87,0x77,0x65,0x44,0x44,0x44,0x44,0x56,0x9A,0x99,0x99,0xA9,0xA9,0xA9,0xAA, + 0xAB,0xBB,0xAA,0x9A,0xA9,0xAA,0xAB,0xBB,0xCC,0xBB,0xBA,0xAB,0xBC,0xDD,0xDD,0xDC, + 0xDB,0xDC,0xDC,0xDD,0xDD,0xED,0xDD,0xDD,0xCB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0x97,0x8D,0xDD,0xDB,0xDD,0xDD,0xDB,0xBB,0xBC,0xDD,0xDD,0xDC,0xCC,0xBB,0xBC, + 0xBC,0xCB,0xBA,0xAA,0xBB,0xBA,0x99,0xAA,0xAB,0xBD,0xCD,0xCD,0xC9,0x98,0x99,0xB8, + 0x75,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x56,0x78,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x66,0x66,0x77,0x66,0x77,0x66,0x66,0x67,0x67,0x67,0x66,0x76,0x66,0x65,0x56,0x66, + 0x66,0x67,0x76,0x67,0x65,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78, + 0x77,0x77,0x77,0x55,0x45,0x44,0x45,0x45,0x56,0x99,0x89,0x99,0xA9,0xA9,0x9A,0x9A, + 0xAA,0xBA,0xAA,0xA9,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xAA,0xBA,0xBD,0xDC,0xDB,0xCC, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x97,0xAE,0xDD,0xDD,0xDC,0xDD,0xDD,0xCB,0xBB,0xBD,0xDD,0xDD,0xCC,0xBB,0xBB, + 0xCB,0xDC,0xBB,0xAA,0xBD,0xBB,0xAA,0x9A,0xAA,0xBA,0xAB,0xCA,0xA9,0x98,0x99,0xA7, + 0x65,0x55,0x45,0x45,0x44,0x44,0x44,0x44,0x45,0x78,0x77,0x77,0x78,0x77,0x77,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66, + 0x66,0x66,0x67,0x76,0x66,0x77,0x66,0x77,0x77,0x76,0x66,0x55,0x55,0x56,0x66,0x77, + 0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x45,0x57,0xAA,0x99,0x99,0x99,0xA9,0xA9,0x99, + 0xAA,0xAB,0xBA,0xA9,0xA9,0xAA,0xAB,0xAB,0xBB,0xBB,0xBA,0xAB,0xBB,0xCD,0xCD,0xBD, + 0xCD,0xBD,0xCD,0xCD,0xDD,0xDD,0xED,0xDD,0xDC,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x87,0xCE,0xDD,0xDC,0xDD,0xCD,0xCC,0xBC,0xBC,0xCD,0xDD,0xDC,0xDB,0xBB,0xBC, + 0xCC,0xBC,0xCC,0xCC,0xDD,0xCB,0xB9,0xAA,0xAA,0xAB,0xAA,0xCC,0x99,0x98,0x9A,0x96, + 0x55,0x54,0x54,0x44,0x45,0x44,0x54,0x54,0x57,0x77,0x78,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67, + 0x66,0x66,0x77,0x76,0x66,0x77,0x77,0x77,0x77,0x66,0x55,0x66,0x65,0x56,0x77,0x67, + 0x77,0x67,0x65,0x55,0x55,0x55,0x54,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x75,0x44,0x54,0x45,0x45,0x45,0x58,0xBA,0x99,0x89,0x9A,0x9A,0x99,0xA9, + 0xAA,0xAB,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xBA,0xBA,0xAB,0xBB,0xBB,0xBC,0xDC,0xDC, + 0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xBB,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0x87,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xCC,0xBC,0xCC,0xDC,0xDC,0xCB,0xCB,0xBB, + 0xCC,0xDB,0xDC,0xDD,0xDD,0xDC,0xBA,0xA9,0xAA,0xAA,0xAA,0xAD,0xA9,0x99,0xAB,0x86, + 0x55,0x45,0x44,0x44,0x54,0x44,0x44,0x46,0x78,0x78,0x77,0x87,0x77,0x78,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77, + 0x77,0x76,0x77,0x76,0x66,0x67,0x77,0x77,0x66,0x66,0x56,0x66,0x67,0x77,0x77,0x77, + 0x67,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x67,0x66,0x57,0x65,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x45,0x58,0xA9,0x99,0x99,0x99,0xAA,0x9A,0x99, + 0x9A,0xAA,0xBB,0xAA,0xA9,0xAA,0xAA,0xAB,0xAB,0xAA,0xBA,0xAA,0xBB,0xBC,0xCD,0xDD, + 0xDD,0xCD,0xBD,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x88,0xEE,0xED,0xDC,0xDC,0xDC,0xCC,0xCB,0xCB,0xCC,0xBC,0xBC,0xBB,0xBB,0xCC, + 0xCC,0xCC,0xCD,0xCD,0xDD,0xDC,0xCB,0xA9,0x9A,0x99,0xAA,0xAB,0xA9,0x99,0xAB,0x85, + 0x54,0x54,0x45,0x45,0x44,0x54,0x55,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x77, + 0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x67,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x76, + 0x55,0x56,0x66,0x65,0x55,0x55,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x65,0x67,0x65,0x56,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x65,0x44,0x54,0x45,0x45,0x45,0x45,0x69,0xA9,0x99,0x99,0x99,0x9A,0x99,0x9A, + 0xAA,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xBA,0xAB,0xAB,0xBB,0xBD,0xDD,0xDD, + 0xDD,0xDC,0xDB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xDE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x88,0xEE,0xED,0xDD,0xDD,0xCD,0xBB,0xBC,0xBD,0xCC,0xDB,0xDB,0xDC,0xCC,0xBC, + 0xCB,0xCB,0xDB,0xDD,0xCD,0xDD,0xCB,0xBA,0xA9,0x99,0x99,0x99,0x98,0x8A,0xBB,0x76, + 0x45,0x45,0x44,0x44,0x44,0x44,0x57,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67, + 0x77,0x77,0x77,0x77,0x67,0x66,0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x76,0x55, + 0x55,0x55,0x67,0x66,0x55,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x65,0x56,0x75,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x54,0x44,0x44,0x54,0x54,0x44,0x55,0x79,0x99,0x89,0x98,0x99,0x99,0x99,0xAA, + 0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xAB,0xAB,0xBC,0xDD,0xDD, + 0xED,0xDD,0xCD,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBC,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x89,0xEE,0xED,0xDD,0xCD,0xBC,0xDB,0xDC,0xDC,0xDC,0xCC,0xCC,0xCC,0xBC,0xBB, + 0xCD,0xBD,0xCD,0xDC,0xDD,0xCD,0xDC,0xBB,0xAA,0x99,0x99,0xA9,0x98,0x99,0xB9,0x75, + 0x45,0x44,0x54,0x45,0x45,0x45,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x77,0x77,0x76,0x55,0x55, + 0x56,0x56,0x67,0x66,0x55,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x64,0x54,0x44,0x44,0x44,0x44,0x54,0x55,0x8A,0x98,0x89,0x9A,0x99,0x99,0x9A,0xAA, + 0xBA,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xDE, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xDE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x8A,0xEE,0xED,0xDD,0xDC,0xDC,0xBC,0xCC,0xDD,0xDD,0xDC,0xDC,0xDC,0xDB,0xDC, + 0xCC,0xCC,0xCD,0xCD,0xBD,0xCD,0xCD,0xCB,0xAA,0xA9,0x99,0x99,0x99,0x99,0xA7,0x65, + 0x54,0x54,0x45,0x44,0x44,0x77,0x87,0x77,0x87,0x87,0x87,0x78,0x77,0x77,0x77,0x87, + 0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x66,0x67,0x77,0x77,0x76,0x65,0x56, + 0x66,0x65,0x55,0x66,0x66,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x65,0x65,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75, + 0x54,0x44,0x44,0x44,0x44,0x54,0x45,0x56,0x8A,0x88,0x89,0x9B,0xA9,0x99,0xAA,0xAB, + 0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBC,0xCD,0xDD, + 0xED,0xED,0xDD,0xCD,0xCC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDB,0xBB,0xBD,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x8B,0xEE,0xEE,0xDD,0xCC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCC, + 0xCD,0xBD,0xCD,0xDC,0xDB,0xDC,0xDC,0xDC,0xBB,0xB9,0x89,0x99,0x99,0x9A,0x97,0x65, + 0x54,0x44,0x54,0x45,0x47,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66, + 0x66,0x76,0x67,0x77,0x77,0x67,0x66,0x76,0x56,0x56,0x67,0x77,0x76,0x55,0x55,0x66, + 0x77,0x76,0x56,0x57,0x76,0x65,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x56,0x65,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54, + 0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x66,0x9A,0x98,0x88,0x99,0xAB,0xAA,0xAA,0xBA, + 0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDB,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xDE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x8B,0xEE,0xEE,0xDD,0xDC,0xDC,0xCC,0xDC,0xDC,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD, + 0xDC,0xDB,0xDC,0xDC,0xDC,0xCB,0xDC,0xDC,0xDD,0xB9,0x99,0x99,0x99,0x9A,0x97,0x54, + 0x54,0x54,0x45,0x44,0x67,0x77,0x87,0x77,0x78,0x77,0x87,0x87,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x66,0x67,0x77,0x77,0x66, + 0x67,0x77,0x76,0x77,0x77,0x66,0x65,0x65,0x66,0x66,0x77,0x77,0x66,0x55,0x56,0x67, + 0x77,0x77,0x65,0x66,0x67,0x65,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x65, + 0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44, + 0x44,0x54,0x44,0x45,0x44,0x45,0x45,0x67,0xAA,0x99,0x99,0x9A,0xAA,0xBA,0xBB,0xBB, + 0xBB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBD,0xCD, + 0xDD,0xDD,0xDD,0xDC,0xDB,0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBD,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x8C,0xEE,0xEE,0xDC,0xCD,0xBD,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD, + 0xDC,0xCD,0xCD,0xCD,0xBC,0xBC,0xCD,0xDC,0xDC,0xCB,0x99,0x99,0x99,0x9A,0x86,0x55, + 0x44,0x45,0x44,0x46,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x76,0x66,0x67,0x76,0x76, + 0x77,0x77,0x66,0x67,0x77,0x66,0x66,0x66,0x66,0x77,0x77,0x66,0x55,0x55,0x66,0x77, + 0x66,0x77,0x66,0x55,0x66,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x56,0x76, + 0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x45, + 0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x58,0xA9,0x9A,0xA9,0x9A,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xAB,0xAA,0xAA,0xAB,0xAA,0xAA,0x9A,0xAA,0xBB,0xBB,0xBC,0xBC, + 0xCD,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x8C,0xEF,0xEE,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCC,0xBD,0xBD,0xDD,0xDD, + 0xCD,0xBD,0xBD,0xCD,0xCC,0xCB,0xBC,0xCD,0xCD,0xDC,0xBA,0x99,0x99,0x9A,0x76,0x54, + 0x45,0x44,0x44,0x56,0x77,0x78,0x77,0x77,0x78,0x78,0x77,0x87,0x77,0x77,0x78,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x66,0x66,0x67, + 0x67,0x76,0x76,0x76,0x77,0x76,0x66,0x77,0x77,0x77,0x76,0x65,0x55,0x65,0x56,0x77, + 0x76,0x67,0x76,0x65,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x75,0x65,0x55,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x44,0x55,0x69,0xA9,0x98,0x9A,0xAA,0xAB,0xAB,0xBB,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xBB, + 0xCC,0xCD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xCE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x8D,0xEE,0xEE,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDD,0xCD,0xCD, + 0xBD,0xBC,0xDB,0xCC,0xCC,0xBB,0xCB,0xCD,0xCD,0xCC,0xB9,0x99,0xA9,0xAA,0x76,0x45, + 0x44,0x54,0x54,0x46,0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x76, + 0x67,0x66,0x67,0x67,0x77,0x77,0x66,0x77,0x77,0x77,0x65,0x55,0x66,0x66,0x65,0x67, + 0x76,0x56,0x67,0x65,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x57,0x65,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x44, + 0x44,0x44,0x44,0x54,0x54,0x54,0x55,0x79,0x98,0x88,0x9A,0xAB,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0x99, + 0xAA,0xAB,0xAB,0xCD,0xCC,0xCC,0xCB,0xCC,0xDC,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBC, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x8D,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xCB,0xDC,0xDC, + 0xDB,0xDC,0xBD,0xCD,0xCC,0xCB,0xBC,0xBC,0xCC,0xCC,0xBA,0xAB,0xDC,0xA9,0x75,0x55, + 0x54,0x44,0x44,0x55,0x77,0x77,0x77,0x77,0x87,0x87,0x87,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x76, + 0x65,0x66,0x67,0x66,0x77,0x77,0x66,0x77,0x77,0x66,0x55,0x55,0x66,0x76,0x65,0x57, + 0x67,0x76,0x67,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x67,0x65,0x56,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x45, + 0x44,0x44,0x44,0x44,0x44,0x44,0x56,0x89,0x98,0x88,0xAA,0xBA,0xBA,0xBB,0xBB,0xBA, + 0xBA,0xBB,0xAB,0xAB,0xAA,0xBA,0xBB,0xBA,0xBA,0xAA,0x9A,0xAA,0xAA,0x99,0x99,0x99, + 0x99,0x99,0x99,0xAB,0xBB,0xCB,0xBB,0xBC,0xCC,0xCD,0xDC,0xDD,0xDD,0xDC,0xBB,0xBB, + 0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x8D,0xEE,0xFE,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCD, + 0xCD,0xBD,0xCC,0xCB,0xCC,0xBB,0xBB,0xBC,0xCB,0xBB,0xBC,0xCE,0xDB,0xB8,0x65,0x54, + 0x45,0x45,0x44,0x44,0x57,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77, + 0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x67,0x76,0x67,0x66, + 0x66,0x66,0x77,0x66,0x67,0x76,0x56,0x77,0x76,0x55,0x55,0x65,0x56,0x76,0x66,0x56, + 0x67,0x66,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x75,0x56,0x76,0x56,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x54,0x45,0x44, + 0x44,0x54,0x45,0x44,0x54,0x55,0x56,0x99,0x98,0x8A,0xAB,0xBB,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0x9A,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAB,0xAB,0xBB,0xBB,0xBC,0xDC,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB, + 0xBC,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x8C,0xEE,0xEE,0xED,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCC,0xCC,0xCD, + 0xBD,0xCC,0xBD,0xCD,0xCB,0xCB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xAA,0xA8,0x65,0x44, + 0x54,0x44,0x44,0x45,0x46,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x78,0x77,0x77,0x78, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x76,0x76,0x77,0x77, + 0x76,0x67,0x77,0x66,0x56,0x56,0x67,0x76,0x65,0x55,0x66,0x66,0x65,0x56,0x66,0x65, + 0x57,0x75,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x66,0x65,0x67,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x54,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x57,0x99,0x89,0xAA,0xAA,0xBA,0xBA,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0x9A,0xA9,0x99,0x99,0x99,0x9A, + 0x9A,0x99,0x9A,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x8B,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xCC,0xDB,0xCC,0xCC,0xCC,0xDB, + 0xDC,0xDC,0xDB,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xA8,0x65,0x54, + 0x45,0x45,0x45,0x44,0x54,0x67,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x78,0x77,0x77,0x76,0x76,0x66,0x67,0x77, + 0x77,0x77,0x76,0x66,0x65,0x66,0x77,0x76,0x65,0x55,0x67,0x77,0x65,0x66,0x77,0x66, + 0x55,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x67,0x67,0x65,0x66,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44,0x44,0x44,0x44, + 0x44,0x45,0x44,0x45,0x45,0x45,0x68,0xA9,0x9A,0xBA,0xBA,0xAA,0xBB,0xBA,0xBB,0xBB, + 0xBA,0xBA,0xBB,0xBB,0xBB,0xCC,0xBC,0xBB,0xAA,0xAA,0xA9,0x99,0x99,0xA9,0x9A,0x99, + 0x99,0x9A,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xCD,0xCD,0xDD,0xCD,0xCC,0xBB, + 0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x8A,0xEE,0xEE,0xEE,0xDD,0xDC,0xDD,0xDD,0xDC,0xDC,0xCC,0xBB,0xBC,0xCB,0xDC, + 0xDC,0xCD,0xBD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xB8,0x65,0x45, + 0x44,0x44,0x44,0x44,0x44,0x56,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x87,0x78,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x66,0x77, + 0x67,0x77,0x76,0x66,0x76,0x67,0x77,0x76,0x55,0x57,0x77,0x77,0x76,0x55,0x77,0x76, + 0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x66,0x55,0x56,0x55,0x56,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x44,0x54,0x44,0x45, + 0x64,0x44,0x45,0x44,0x44,0x55,0x78,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xAB,0xBA,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xAA,0xA9,0xA9,0x99,0x99,0x9A,0x99,0xA9, + 0xA9,0xA9,0x99,0xA9,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xCC,0xCC,0xDD,0xDD,0xDD,0xCB, + 0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE9,0x8B,0xEE,0xEF,0xEE,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xBC,0xBC,0xCC,0xCD,0xCD, + 0xCD,0xDC,0xDD,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xB8,0x65,0x44, + 0x54,0x54,0x54,0x45,0x44,0x55,0x77,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x78,0x78, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x77,0x76,0x66, + 0x66,0x76,0x56,0x67,0x77,0x77,0x77,0x65,0x66,0x77,0x77,0x67,0x77,0x65,0x56,0x75, + 0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x76,0x55,0x57,0x65,0x77,0x77,0x77,0x77,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x45,0x44,0x44,0x44,0x44,0x49, + 0xB7,0x44,0x44,0x44,0x54,0x56,0x89,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xBB,0xAB,0xBB, + 0xAB,0xBB,0xBB,0xCC,0xCC,0xCC,0xBB,0xBA,0xAA,0x9A,0x99,0x99,0x9A,0x99,0xA9,0x99, + 0x99,0x99,0xA9,0x99,0x9A,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xCD,0xCD,0xDC,0xDD,0xDB, + 0xBB,0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x7A,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xDD,0xDD,0xCC,0xCB,0xCB,0xBC,0xBB,0xDC, + 0xDD,0xCD,0xDC,0xDB,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xA7,0x65,0x45, + 0x44,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x87,0x77,0x87,0x78,0x77,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x55, + 0x55,0x55,0x67,0x77,0x77,0x77,0x65,0x55,0x67,0x77,0x77,0x66,0x77,0x65,0x55,0x55, + 0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x65,0x65,0x55,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x54,0x44,0x44,0x54,0x44,0x44,0x46, + 0x86,0x54,0x44,0x54,0x44,0x66,0x9A,0xAA,0xAB,0xAA,0xAB,0xAB,0xAA,0xBA,0xBB,0xAB, + 0xBB,0xBB,0xBB,0xCC,0xCC,0xCC,0xBB,0xBA,0xAA,0xA9,0xA9,0x9A,0x9A,0x9A,0x99,0xA9, + 0xA9,0xA9,0x99,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xCC,0xDD,0xDD,0xCD, + 0xCB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x79,0xDE,0xEE,0xFE,0xEE,0xDD,0xDD,0xCD,0xCD,0xBB,0xBB,0xBC,0xBC,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBB,0xA7,0x64,0x54, + 0x54,0x54,0x54,0x45,0x44,0x44,0x55,0x77,0x77,0x77,0x87,0x77,0x87,0x78,0x77,0x77, + 0x77,0x87,0x77,0x77,0x77,0x76,0x56,0x76,0x77,0x66,0x77,0x77,0x77,0x77,0x76,0x65, + 0x56,0x65,0x77,0x77,0x77,0x76,0x55,0x66,0x77,0x77,0x77,0x76,0x67,0x76,0x55,0x55, + 0x55,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x76,0x56,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x54,0x44,0x44,0x46,0x88,0x44, + 0x48,0xA8,0x45,0x44,0x55,0x68,0xAA,0xAB,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0x9A,0x9A,0x9A,0xAA,0x9A, + 0x99,0x99,0xA9,0xA9,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xCD,0xCD,0xDD,0xDD, + 0xCB,0xBB,0xBB,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x79,0xDE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDD,0xDC,0xDB,0xBB,0xBB,0xBC,0xCC,0xDC, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCB,0xBB,0xBA,0xBA,0xAA,0xAB,0xBB,0xBB,0xB7,0x65,0x45, + 0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77, + 0x87,0x77,0x78,0x78,0x77,0x76,0x66,0x56,0x67,0x66,0x66,0x77,0x77,0x77,0x77,0x75, + 0x66,0x77,0x77,0x77,0x77,0x76,0x65,0x67,0x77,0x67,0x67,0x76,0x67,0x75,0x55,0x55, + 0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x55,0x67,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44,0x44,0x44,0x44,0x79,0x99,0x84, + 0x47,0xA9,0x74,0x45,0x55,0x69,0xAA,0xBA,0xBB,0xAA,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0x9A,0xAA,0x99,0xA9,0xA9,0xAA,0xAB,0xAA, + 0x9A,0x9A,0x99,0x99,0xA9,0xA9,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBC,0xCD,0xCD,0xDC, + 0xDD,0xBB,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD9,0x78,0xDD,0xEE,0xEF,0xEE,0xED,0xDD,0xCD,0xDC,0xCB,0xBB,0xBB,0xBC,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xCC,0xBC,0xBB,0xBB,0xBA,0xAA,0xAB,0xBB,0xBC,0xB7,0x64,0x54, + 0x55,0x45,0x44,0x54,0x45,0x44,0x54,0x56,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x56,0x55,0x66,0x66,0x67,0x77,0x77,0x76, + 0x76,0x67,0x77,0x77,0x77,0x65,0x55,0x55,0x77,0x76,0x67,0x77,0x65,0x55,0x55,0x57, + 0x77,0x77,0x77,0x77,0x77,0x65,0x57,0x65,0x57,0x77,0x77,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x45,0x44,0x44,0x58,0x99,0x99,0x98, + 0x44,0x7A,0x94,0x54,0x56,0x79,0xBB,0xBB,0xAA,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0x99,0x9A,0x9A,0x9A,0x9A,0xBC,0xBA, + 0xA9,0xA9,0xA9,0xA9,0x99,0x99,0x99,0x99,0xAA,0x9A,0xAB,0xBB,0xBB,0xCC,0xDD,0xCD, + 0xDC,0xDB,0xBB,0xBC,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x78,0xBE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDC,0xBB,0xBB,0xBC,0xCC,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xBB,0xBB,0xCB,0xAA,0xBA,0xBB,0xBC,0xA7,0x55,0x54, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87, + 0x78,0x78,0x77,0x78,0x77,0x77,0x77,0x66,0x66,0x66,0x65,0x65,0x66,0x77,0x77,0x77, + 0x76,0x67,0x77,0x77,0x76,0x65,0x55,0x55,0x67,0x77,0x66,0x77,0x65,0x55,0x55,0x77, + 0x77,0x77,0x77,0x66,0x67,0x55,0x56,0x76,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x45,0x44,0x45,0x44,0x44,0x44,0x8A,0x88,0x56,0x99, + 0x84,0x46,0x54,0x45,0x67,0x9B,0xBB,0xBB,0xBA,0xAA,0xAB,0xBA,0xBB,0xBB,0xBB,0xCC, + 0xBD,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0x9A,0x99,0x99,0xAB,0xBB, + 0xAA,0xA9,0xA9,0x9A,0x99,0xA9,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBD,0xCD,0xDD, + 0xDD,0xCD,0xBB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x87,0xAD,0xEE,0xEF,0xEE,0xEE,0xDD,0xDC,0xDD,0xCC,0xBB,0xBB,0xBB,0xDD,0xCD, + 0xDD,0xDD,0xCD,0xCD,0xDC,0xCC,0xBB,0xBB,0xBB,0xAA,0xAB,0xBA,0xBC,0xA7,0x65,0x45, + 0x45,0x45,0x45,0x44,0x54,0x45,0x44,0x45,0x57,0x77,0x78,0x77,0x78,0x77,0x77,0x77, + 0x77,0x77,0x78,0x77,0x77,0x87,0x77,0x77,0x66,0x77,0x77,0x66,0x56,0x66,0x77,0x77, + 0x76,0x67,0x77,0x77,0x76,0x55,0x55,0x55,0x56,0x77,0x76,0x65,0x55,0x55,0x67,0x77, + 0x77,0x77,0x77,0x66,0x77,0x65,0x55,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x65,0x44,0x44,0x44,0x44,0x54,0x44,0x8A,0x88,0x44,0x79, + 0xA7,0x44,0x44,0x55,0x68,0xAB,0xCC,0xDB,0xBA,0xAA,0xBA,0xBB,0xBB,0xBC,0xCC,0xDC, + 0xDB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xA9,0x99,0x9A,0xA9,0xA9,0x99,0xAA,0xAB, + 0xCC,0xAA,0x99,0xA9,0x9A,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCD,0xCD, + 0xDD,0xDC,0xCB,0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0x87,0x9D,0xDE,0xEE,0xEF,0xEE,0xED,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xCC,0xDD, + 0xDD,0xCD,0xDD,0xDC,0xDC,0xDB,0xCB,0xBB,0xBB,0xAB,0xAA,0xBB,0xBB,0x97,0x55,0x45, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x87,0x87, + 0x78,0x78,0x77,0x77,0x87,0x78,0x78,0x77,0x77,0x77,0x77,0x67,0x66,0x65,0x67,0x67, + 0x66,0x57,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x67,0x76,0x55,0x55,0x57,0x77,0x77, + 0x77,0x77,0x67,0x77,0x66,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x78, + 0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x45,0x44,0x54,0x57,0x74,0x48,0x99,0x84,0x47, + 0x86,0x44,0x45,0x55,0x79,0xBB,0xBC,0xDD,0xBA,0xAB,0xAB,0xBB,0xBB,0xBC,0xBD,0xCD, + 0xCD,0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xAA,0x99,0x99,0xAA,0x9A,0x99,0x9A,0xAA, + 0xDE,0xDA,0x9A,0x9A,0x99,0x9A,0x9A,0x99,0x9A,0xAA,0xAA,0xAA,0xAB,0xBC,0xBD,0xCD, + 0xCD,0xCD,0xDC,0xBB,0xBB,0xCE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBC,0x87,0x8C,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xBB,0xBB,0xAB,0xBC,0xCD, + 0xCD,0xDD,0xCD,0xCD,0xDC,0xCD,0xBC,0xBB,0xBB,0xBA,0xAB,0xBA,0xBC,0x97,0x65,0x44, + 0x54,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x45,0x57,0x77,0x77,0x87,0x78,0x77,0x77, + 0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x76,0x66,0x65,0x67, + 0x66,0x67,0x77,0x77,0x65,0x55,0x55,0x55,0x55,0x56,0x55,0x66,0x76,0x77,0x87,0x77, + 0x77,0x76,0x56,0x77,0x55,0x57,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x54,0x44,0x45,0x44,0x44,0x44,0x5A,0xA5,0x44,0x89,0x97,0x44, + 0x45,0x44,0x55,0x56,0x8A,0xAB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD, + 0xDB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xA9,0x99,0x9A,0x99,0xA9,0xA9,0x9A,0x9A, + 0xAC,0xDE,0xB9,0x99,0xA9,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBA,0xBB,0xBC,0xDD, + 0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0x87,0x8B,0xDE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xCD,0xDC,0xBA,0xBA,0xBB,0xCC, + 0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xCB,0xBB,0xBD,0xBB,0xAA,0xBB,0xBC,0xA7,0x55,0x45, + 0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x54,0x46,0x77,0x87,0x77,0x77,0x77,0x87, + 0x87,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x76,0x77,0x66, + 0x66,0x77,0x87,0x87,0x66,0x55,0x55,0x55,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x55,0x57,0x65,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x78,0x77, + 0x78,0x77,0x77,0x75,0x44,0x54,0x44,0x44,0x54,0x54,0x46,0x76,0x64,0x48,0xA9,0x45, + 0x44,0x45,0x45,0x67,0x9A,0xBB,0xAB,0xBA,0xAD,0xDB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD, + 0xDD,0xCB,0xBB,0xBA,0xBB,0xAB,0xBA,0xBA,0xA9,0x99,0x99,0xAA,0xA9,0xA9,0xA9,0xA9, + 0xAA,0xAC,0xDB,0xAA,0x9A,0x9A,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xCC, + 0xDC,0xDD,0xCD,0xCB,0xBB,0xBB,0xDE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0x97,0x8A,0xDD,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCC,0xBB,0xAA,0xBB,0xBB, + 0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xBC,0xBB,0xBC,0xBA,0xAB,0xAB,0xBB,0xA7,0x65,0x54, + 0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x67,0x77,0x77,0x87,0x77,0x77, + 0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x78,0x77,0x77,0x77, + 0x66,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x55,0x66,0x57,0x77,0x77,0x77,0x77,0x77, + 0x67,0x67,0x65,0x56,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x77, + 0x77,0x77,0x76,0x44,0x44,0x44,0x45,0x44,0x48,0x98,0x54,0x4A,0xA7,0x44,0x76,0x54, + 0x45,0x45,0x56,0x68,0xBB,0xBB,0xBA,0xAA,0xBC,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xCB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xAA,0x99,0x9A,0x9A,0xAA,0x99,0xA9,0xAA, + 0x9A,0xAA,0xAB,0xBA,0xA9,0x99,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC, + 0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xA7,0x8A,0xCD,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xBB,0xAA,0xAA,0xBB, + 0xBC,0xBD,0xDC,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBA,0xA7,0x65,0x45, + 0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x54,0x47,0x77,0x87,0x78,0x77,0x77, + 0x87,0x77,0x87,0x87,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x57,0x76,0x77,0x77,0x77,0x77,0x77,0x76, + 0x55,0x66,0x55,0x57,0x77,0x87,0x77,0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x78, + 0x77,0x77,0x64,0x54,0x44,0x45,0x44,0x45,0x89,0x99,0x84,0x47,0xA9,0x74,0x44,0x44, + 0x54,0x45,0x56,0x79,0xCB,0xBC,0xBB,0xAA,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xED,0xED, + 0xDD,0xCC,0xBB,0xBB,0xAA,0xBA,0xBB,0xAB,0xAA,0x89,0x99,0xA9,0xA9,0xAA,0x99,0xAA, + 0xAA,0xAA,0xAB,0xAA,0xAA,0x9A,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xBC, + 0xCD,0xBD,0xDD,0xCD,0xCB,0xBB,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xB8,0x7B,0xCD,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xCB,0xAA,0xAA,0xAB, + 0xBB,0xDC,0xDD,0xDC,0xDD,0xBD,0xBC,0xBB,0xAB,0xAA,0xAB,0xBA,0xBB,0xA7,0x65,0x44, + 0x45,0x45,0x44,0x44,0x45,0x45,0x44,0x44,0x54,0x44,0x55,0x77,0x77,0x77,0x78,0x78, + 0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x78,0x78,0x78,0x78,0x77,0x78,0x77,0x78,0x77, + 0x78,0x78,0x78,0x77,0x78,0x77,0x55,0x76,0x77,0x78,0x77,0x77,0x76,0x66,0x67,0x76, + 0x55,0x57,0x76,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x87,0x87,0x77,0x77, + 0x77,0x75,0x44,0x44,0x45,0x44,0x44,0x79,0x99,0x89,0x98,0x44,0x79,0x74,0x45,0x44, + 0x45,0x45,0x67,0x8A,0xAA,0xBC,0xCA,0xAA,0xCB,0xBB,0xCD,0xDD,0xDE,0xDE,0xDE,0xDD, + 0xDD,0xCB,0xBB,0xBA,0xBA,0xAB,0xAB,0xBB,0xAA,0x99,0x99,0xAA,0xAA,0x99,0x9A,0x9A, + 0xAA,0x9A,0x9A,0xAA,0xA9,0xA9,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0xBA,0xBB,0xAB,0xBB, + 0xCD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xDE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xAA,0xD8,0x7B,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDB,0xBA,0xAA,0xAB, + 0xBB,0xBD,0xCD,0xDD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xB7,0x65,0x54, + 0x54,0x44,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x78,0x77,0x77, + 0x87,0x77,0x87,0x87,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x56,0x77,0x66,0x67, + 0x65,0x56,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x87,0x87,0x77,0x77,0x78,0x77, + 0x76,0x45,0x44,0x45,0x44,0x44,0x48,0x99,0x97,0x47,0x99,0x84,0x44,0x44,0x44,0x44, + 0x54,0x55,0x68,0x9A,0xAA,0xAA,0xBA,0xAA,0xBB,0xBB,0xCB,0xDD,0xDD,0xEE,0xEE,0xDD, + 0xDD,0xCB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBA,0xBA,0x88,0x99,0x9A,0xAA,0xAA,0xA9,0xAA, + 0xAA,0x9A,0x99,0x9A,0x9A,0x99,0x9A,0x99,0x99,0xAB,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB, + 0xCC,0xBD,0xCD,0xCD,0xDC,0xBB,0xBB,0xBD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xC9,0x7A,0xDC,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDB,0xBA,0xAA,0xAB, + 0xBC,0xDC,0xDD,0xCD,0xDC,0xDB,0xDB,0xBB,0xBC,0xBB,0xAB,0xAB,0xBA,0xA8,0x65,0x45, + 0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x55,0x77,0x77,0x78,0x77, + 0x77,0x87,0x77,0x78,0x78,0x77,0x77,0x78,0x78,0x78,0x77,0x77,0x78,0x77,0x87,0x87, + 0x77,0x87,0x78,0x78,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x65,0x67,0x77,0x77,0x66, + 0x76,0x57,0x77,0x77,0x77,0x78,0x78,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77, + 0x65,0x44,0x44,0x44,0x45,0x45,0x89,0x89,0x98,0x44,0x7A,0xA6,0x44,0x45,0x44,0x54, + 0x45,0x57,0x79,0x9A,0xAA,0x9A,0x99,0xDE,0xBA,0xBC,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD, + 0xDC,0xCB,0xBB,0xAA,0xAB,0xAB,0xAB,0xBB,0xBA,0x99,0x99,0xAA,0xAA,0xAA,0x99,0x9A, + 0xAA,0x9A,0x9A,0x99,0xA9,0xA9,0xA9,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xBB,0x89,0xEC,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDB,0xAA,0xBB, + 0xBC,0xBC,0xDC,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xB8,0x65,0x54, + 0x54,0x45,0x45,0x45,0x44,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x57,0x78,0x77,0x77, + 0x87,0x77,0x87,0x87,0x77,0x87,0x78,0x77,0x77,0x77,0x78,0x78,0x77,0x78,0x77,0x77, + 0x87,0x77,0x87,0x77,0x87,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x56,0x66,0x75, + 0x77,0x77,0x78,0x78,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x76,0x77,0x75, + 0x44,0x44,0x44,0x44,0x44,0x69,0x99,0x88,0x99,0x74,0x47,0x75,0x44,0x44,0x45,0x44, + 0x55,0x67,0x89,0xBB,0xAA,0xA9,0xA9,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xED,0xDD,0xDD, + 0xCD,0xCB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBA,0xA8,0x89,0x9A,0xAB,0xAA,0xAA,0xA9, + 0x9A,0xAA,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x9A,0xAA,0xBB,0xAB,0xAB,0xAB,0xBB,0xCB, + 0xCC,0xCC,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xCE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xAD,0x88,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCB,0xBA,0xBC, + 0xDB,0xDB,0xCC,0xDC,0xCD,0xCD,0xBC,0xBC,0xBD,0xCC,0xBB,0xBB,0xBB,0xB8,0x65,0x54, + 0x45,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x56,0x77,0x78,0x77, + 0x78,0x78,0x77,0x77,0x87,0x78,0x77,0x78,0x77,0x87,0x87,0x77,0x87,0x77,0x78,0x77, + 0x77,0x87,0x78,0x77,0x77,0x77,0x87,0x77,0x87,0x78,0x77,0x66,0x65,0x77,0x67,0x77, + 0x67,0x77,0x77,0x77,0x77,0x87,0x87,0x78,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x54, + 0x54,0x45,0x45,0x45,0x44,0x8A,0x97,0x44,0x89,0x97,0x44,0x44,0x45,0x45,0x44,0x54, + 0x56,0x68,0xBD,0xCB,0xAA,0xAA,0x9A,0xAA,0xAB,0xBC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xA9,0x99,0x9A,0xAC,0xCB,0xAA,0x9A, + 0x99,0xAA,0x9A,0xA9,0xA9,0x9A,0x99,0x99,0x9A,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xCC, + 0xBC,0xBC,0xDC,0xDD,0xDD,0xCD,0xBB,0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAD,0xA8,0xEE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDB,0xCC, + 0xCC,0xCB,0xDB,0xDB,0xDC,0xCC,0xCB,0xCB,0xDC,0xDD,0xDC,0xBB,0xBB,0xB9,0x76,0x45, + 0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x67,0x77,0x78, + 0x77,0x77,0x87,0x87,0x78,0x77,0x78,0x77,0x87,0x77,0x77,0x87,0x78,0x78,0x77,0x87, + 0x87,0x78,0x77,0x87,0x87,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x66,0x66,0x67,0x67, + 0x77,0x87,0x78,0x77,0x87,0x77,0x78,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x65,0x44, + 0x44,0x44,0x44,0x44,0x44,0x58,0x98,0x64,0x48,0xA8,0x44,0x44,0x44,0x44,0x45,0x45, + 0x56,0x79,0xCE,0xFE,0xDB,0xAA,0x9A,0xAA,0xAB,0xBC,0xCB,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xAA,0x88,0x99,0xAD,0xFF,0xCA,0xA9, + 0xA9,0x99,0xAA,0x9A,0xA9,0xA9,0xA9,0x99,0x9A,0xAB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBC, + 0xCB,0xCB,0xCC,0xCC,0xDD,0xDD,0xDC,0xBB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAB,0xB8,0xDF,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xCD,0xBD, + 0xBD,0xCD,0xBC,0xCD,0xBD,0xCD,0xBD,0xBD,0xCD,0xDD,0xCC,0xDB,0xBB,0xCA,0x76,0x54, + 0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x57,0x77,0x77, + 0x87,0x87,0x77,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x77,0x78,0x77, + 0x77,0x87,0x78,0x77,0x77,0x78,0x77,0x77,0x87,0x87,0x87,0x56,0x76,0x56,0x77,0x77, + 0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x78,0x78,0x77,0x75,0x44,0x54, + 0x54,0x45,0x44,0x45,0x54,0x55,0x89,0x96,0x45,0x75,0x44,0x54,0x45,0x45,0x44,0x55, + 0x77,0x8A,0xBB,0xDE,0xEE,0xBA,0xAA,0xAA,0xBB,0xBC,0xCD,0xCD,0xDD,0xDC,0xDC,0xCC, + 0xCC,0xBB,0xBA,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0x99,0x99,0xAC,0xEF,0xEB,0xAA, + 0x9A,0xAA,0x9A,0xA9,0xA9,0xA9,0x99,0x99,0x9A,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB, + 0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xA9,0xD8,0xBF,0xEC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xDC,0xCC, + 0xCC,0xCC,0xBC,0xCB,0xDC,0xCC,0xCC,0xDC,0xDC,0xDC,0xDD,0xCC,0xBB,0xA9,0x86,0x55, + 0x45,0x45,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x77,0x87, + 0x77,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x87,0x78,0x78,0x77,0x78, + 0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x77,0x77,0x77,0x75,0x67,0x66,0x77,0x77, + 0x77,0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x77,0x54,0x54,0x44, + 0x44,0x55,0x67,0x86,0x55,0x44,0x59,0x99,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x56, + 0x78,0x9B,0xBB,0xBB,0xBA,0xBB,0xAA,0xAB,0xBB,0xBB,0xDC,0xDC,0xDD,0xDD,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xA9,0x99,0x99,0xAA,0xBB,0xAA, + 0xAA,0xA9,0xAA,0x9A,0xA9,0xA9,0x98,0x99,0xAA,0xAB,0xBB,0xBB,0xAB,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xCB,0xBB,0xBC,0xDE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xAA,0xBA,0x9E,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xCC,0xDB, + 0xCC,0xDB,0xDB,0xBC,0xCC,0xDB,0xDD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB,0xAA,0x86,0x55, + 0x44,0x44,0x44,0x45,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x45,0x57,0x77, + 0x87,0x78,0x77,0x78,0x77,0x77,0x87,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x87, + 0x77,0x87,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x76,0x56,0x77,0x77,0x77, + 0x87,0x77,0x87,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x78,0x77,0x75,0x44,0x44,0x45, + 0x45,0x56,0xAD,0xEC,0x75,0x54,0x45,0x99,0x54,0x54,0x54,0x54,0x54,0x54,0x55,0x56, + 0x79,0x99,0xAB,0xBA,0xA9,0xCD,0xBA,0xBB,0xBB,0xBC,0xCD,0xCD,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBA,0x89,0x99,0x9A,0x9A,0xAA, + 0xAA,0x9A,0x9A,0xA9,0xA9,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xAA,0xAA,0xAB,0xAB,0xBB, + 0xBA,0xBA,0xBB,0xBC,0xCD,0xDD,0xDD,0xDB,0xBB,0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0xAA,0x9C,0x8D,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDB,0xCC, + 0xCB,0xCC,0xCC,0xBB,0xCC,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0x86,0x55, + 0x45,0x45,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x77, + 0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78, + 0x78,0x78,0x78,0x77,0x87,0x87,0x78,0x77,0x66,0x67,0x77,0x67,0x66,0x77,0x77,0x87, + 0x78,0x78,0x77,0x87,0x87,0x77,0x87,0x78,0x77,0x78,0x77,0x76,0x45,0x44,0x45,0x44, + 0x45,0x58,0xDE,0xEE,0xC7,0x55,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x55,0x67, + 0x89,0x9A,0x99,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBD,0xCD,0xCD,0xCC,0xCB,0xBB, + 0xBB,0xAB,0xBB,0xBA,0xBB,0xAB,0xAB,0xBB,0xCB,0xCB,0xBB,0x98,0x89,0x99,0xA9,0xA9, + 0xAA,0xAA,0xAA,0x9A,0x99,0x99,0x98,0x9A,0xAA,0xBB,0xBA,0xBB,0xAA,0xAA,0xAB,0xBA, + 0xBB,0xBB,0xAB,0xBB,0xCD,0xCD,0xDD,0xCD,0xCB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCC,0xBA,0x9C,0x9B,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCC,0xCD,0xDC, + 0xDB,0xBB,0xBC,0xBC,0xCC,0xDC,0xDC,0xDB,0xCB,0xBA,0xBA,0xBB,0xBB,0xBB,0x87,0x65, + 0x54,0x54,0x44,0x45,0x44,0x45,0x44,0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x54,0x57, + 0x77,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77, + 0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x66,0x76,0x76,0x77,0x77,0x87,0x78,0x77, + 0x87,0x78,0x78,0x77,0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x54,0x44,0x45,0x44,0x45, + 0x58,0xCB,0xD8,0x8E,0xEC,0x74,0x54,0x44,0x45,0x44,0x44,0x45,0x45,0x45,0x56,0x78, + 0x99,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBC,0xBB,0xCB,0xCC,0xCD,0xCD,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCB,0xB9,0x89,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x98,0x88,0x9A,0xCB,0xBA,0xAB,0xAA,0xAA,0xBA,0xBB,0xAB, + 0xBA,0xAA,0xBA,0xBB,0xBC,0xDC,0xDD,0xDD,0xCB,0xBB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBA,0xAA,0xB9,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC,0xCD, + 0xCD,0xBB,0xBB,0xBC,0xBD,0xBD,0xCC,0xCC,0xBA,0xBB,0xAA,0xAB,0xBA,0xBA,0x97,0x65, + 0x45,0x44,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x54,0x54,0x44,0x45,0x44,0x44,0x46, + 0x77,0x87,0x78,0x77,0x87,0x77,0x87,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78, + 0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x67,0x77,0x77,0x67,0x77,0x78,0x77,0x87,0x78, + 0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x77,0x87,0x77,0x64,0x54,0x54,0x54,0x45,0x55, + 0x59,0xED,0xD7,0x58,0xDE,0xD6,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x56,0x67,0x89, + 0x99,0x99,0x99,0x99,0xAA,0xAA,0xBD,0xCC,0xCB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xAB, + 0xAB,0xAB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBC,0xBB,0xBB,0x98,0x89,0x89,0x99, + 0x99,0x99,0x99,0x99,0x89,0x88,0x88,0x8A,0xAB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA, + 0xAA,0xAA,0xAA,0xAB,0xBB,0xCD,0xCD,0xDD,0xCD,0xBB,0xBB,0xBD,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0xBA,0xA9,0xD8,0xDE,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDB,0xCD,0xDD, + 0xDB,0xBB,0xBB,0xCC,0xCC,0xDC,0xCC,0xBB,0xBB,0xBA,0xAB,0xAB,0xBB,0xBA,0xA8,0x65, + 0x54,0x45,0x44,0x44,0x44,0x45,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54, + 0x67,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77, + 0x87,0x78,0x77,0x87,0x78,0x77,0x76,0x66,0x77,0x67,0x77,0x77,0x77,0x87,0x78,0x78, + 0x78,0x77,0x87,0x78,0x77,0x77,0x78,0x78,0x77,0x76,0x45,0x44,0x44,0x45,0x55,0x67, + 0x66,0xAE,0xD9,0x55,0x7D,0xD7,0x54,0x44,0x54,0x44,0x44,0x54,0x55,0x56,0x78,0x99, + 0xAA,0xAA,0x99,0x9A,0xAA,0xAB,0xBC,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xCB,0xBB,0xBA,0x89,0x88,0x89, + 0x89,0x99,0x89,0x88,0x98,0x88,0x88,0x8A,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xAB, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xDD,0xDD,0xDC,0xCB,0xBB,0xBC,0xEE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xA9,0xB9,0xAE,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD, + 0xCD,0xCB,0xBC,0xCB,0xDC,0xCC,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xBB,0xBB,0xA8,0x75, + 0x55,0x45,0x44,0x54,0x45,0x44,0x44,0x44,0x45,0x44,0x55,0x45,0x44,0x45,0x44,0x44, + 0x55,0x78,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x87, + 0x87,0x87,0x78,0x78,0x87,0x87,0x76,0x55,0x77,0x57,0x77,0x78,0x78,0x78,0x78,0x77, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x77,0x55,0x44,0x44,0x54,0x55,0x69,0xDD, + 0xDB,0x7A,0xED,0x85,0x57,0x65,0x44,0x44,0x44,0x54,0x54,0x45,0x55,0x66,0x89,0x9A, + 0xAB,0xAA,0x99,0xA9,0x9A,0xAB,0xBB,0xCC,0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB, + 0xAB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xBB,0xBB,0xBC,0xBB,0xCB,0xCB,0xB9,0x89,0x98, + 0x98,0x88,0x88,0x98,0x88,0x88,0x88,0x9B,0xBB,0xCB,0xCB,0xBB,0xBB,0xBA,0xBA,0xAA, + 0xAA,0x9A,0xAA,0xAB,0xAB,0xBB,0xCD,0xCD,0xDD,0xDC,0xBB,0xBB,0xCE,0xEF,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xAA,0xAB,0x8D,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC, + 0xDD,0xCB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xA9,0x76, + 0x55,0x44,0x45,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44, + 0x45,0x67,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x77,0x87,0x78,0x78,0x77, + 0x78,0x77,0x87,0x77,0x77,0x77,0x76,0x55,0x67,0x77,0x78,0x77,0x87,0x87,0x78,0x78, + 0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x77,0x75,0x44,0x54,0x54,0x44,0x55,0xAE,0xED, + 0xEE,0xB7,0xBE,0xE8,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x56,0x68,0x89,0xAA, + 0xBA,0xBA,0xA9,0x9A,0xAA,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xBA,0xBB,0xBC,0xBB,0xBC,0xBC,0xBC,0xBB,0xA9,0x99, + 0x99,0x98,0x88,0x88,0x89,0x88,0x9B,0xBB,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0xAA,0xA9,0xAA,0xAA,0xBB,0xBB,0xBC,0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xCB,0xAA,0x9C,0x8B,0xEE,0xEE,0xCD,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xBD,0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xAB,0xBC,0xCB,0xBA,0x86, + 0x55,0x54,0x54,0x45,0x45,0x44,0x44,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x44,0x54, + 0x54,0x56,0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x77,0x87, + 0x87,0x87,0x87,0x87,0x76,0x77,0x67,0x75,0x57,0x78,0x77,0x87,0x87,0x87,0x87,0x87, + 0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x76,0x54,0x44,0x44,0x45,0x45,0x57,0xED,0x76, + 0x9E,0xE9,0x6B,0xD7,0x54,0x54,0x44,0x45,0x44,0x45,0x44,0x55,0x67,0x78,0x9A,0xAA, + 0xBB,0xAA,0x9A,0x9A,0xAA,0xAB,0xBB,0xBB,0xCC,0xDC,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB, + 0xAB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xCB,0xDB,0xDC,0xCC,0xBB, + 0xA9,0x98,0x88,0x88,0x89,0x9B,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA, + 0xA9,0xA9,0x9A,0xAA,0xAA,0xBB,0xBC,0xBD,0xCD,0xDD,0xCB,0xBB,0xBB,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xDB,0xBA,0xAA,0xB8,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xCD,0xCD,0xCB,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xCD,0xCC,0xBB,0x97, + 0x65,0x54,0x54,0x54,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x45,0x77,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78, + 0x77,0x78,0x77,0x77,0x65,0x66,0x66,0x77,0x67,0x77,0x87,0x87,0x87,0x78,0x78,0x78, + 0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x54,0x54,0x54,0x54,0x55,0x55,0x58,0xEE,0x75, + 0x5B,0xEB,0x55,0x54,0x44,0x44,0x54,0x44,0x44,0x54,0x45,0x55,0x77,0x89,0xAA,0xAA, + 0xAA,0xAA,0xA9,0xAA,0xAA,0xBA,0xBB,0xBC,0xCC,0xCC,0xBB,0xBA,0xBA,0xAA,0xBA,0xBA, + 0xBA,0xBB,0xBB,0xAB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCC,0xBC,0xDD, + 0xDD,0xDB,0xAA,0x9A,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBA,0xBA, + 0xAA,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xCD,0xDD,0xDD,0xDB,0xBB,0xBB,0xCE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDB,0xBA,0xA9,0xD8,0xAE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDD,0xCC,0xBD,0xCC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xAB,0xAB,0xCC,0xDB,0xAA,0x88, + 0x65,0x54,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x54,0x54,0x44,0x54,0x44,0x44,0x45, + 0x44,0x44,0x57,0x77,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87, + 0x87,0x87,0x77,0x77,0x66,0x57,0x77,0x87,0x77,0x78,0x78,0x77,0x87,0x87,0x87,0x87, + 0x87,0x78,0x78,0x77,0x87,0x77,0x65,0x54,0x44,0x44,0x45,0x56,0x98,0x68,0xEE,0xA7, + 0x6B,0xEB,0x54,0x45,0x44,0x54,0x44,0x44,0x54,0x45,0x45,0x56,0x78,0x9A,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBC,0xCD,0xDD,0xBB,0xAB,0xAB,0xAA,0xAA,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xBD,0xCD,0xDC, + 0xDE,0xDD,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xBA,0xBA,0xBB,0xAA, + 0xA9,0xA9,0xA9,0xAA,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xCD,0xCB,0xBB,0xBC,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDC,0xBB,0xA9,0xAB,0x8D,0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDB,0xDB,0xDB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBA,0x98, + 0x76,0x54,0x45,0x44,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x45,0x44,0x44, + 0x45,0x44,0x45,0x77,0x78,0x77,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87, + 0x78,0x77,0x76,0x67,0x75,0x55,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x77,0x87,0x88,0x75,0x54,0x45,0x45,0x45,0x55,0x6C,0xEE,0xC7,0xBF,0xED, + 0xBE,0xE7,0x55,0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x55,0x67,0x8A,0xAA,0xAA,0xAA, + 0xA9,0xAA,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB,0xCD,0xCC,0xBB,0xAB,0xAA,0xAA,0xAA,0xBA, + 0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xAB,0xBB,0xBB,0xBA,0xBA,0xBB,0xCC,0xCC,0xDD,0xDE, + 0xEE,0xEE,0xDD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAB,0xAA,0xBA,0xBA,0xBA, + 0xAA,0x9A,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xCD,0xDD,0xDD,0xCB,0xBB,0xBB,0xDE,0xEF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xBB,0xAA,0x9C,0x9A,0xEE,0xEE,0xCD,0xDD,0xDE,0xDE,0xEE,0xEE,0xED,0xDD, + 0xCD,0xBD,0xCD,0xCB,0xCB,0xCB,0xBB,0xAB,0xBC,0xCB,0xBB,0xCB,0xAB,0xCC,0xAA,0x98, + 0x76,0x55,0x54,0x54,0x45,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x54,0x57,0x77,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77, + 0x87,0x77,0x67,0x77,0x77,0x55,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x54,0x45,0x44,0x44,0x55,0x66,0x8E,0xEE,0xEC,0x7A,0xEE, + 0xED,0x84,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x55,0x56,0x79,0x99,0xAA,0xAA,0xAA, + 0x9A,0xAA,0xBA,0xAB,0xAB,0xAA,0xBA,0xAB,0xBC,0xCB,0xBB,0xBA,0xAB,0xAA,0xBA,0xAA, + 0xAA,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBD,0xCD,0xCD,0xDE, + 0xEE,0xEE,0xED,0xDB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAA,0xAB,0xAB,0xBB,0xAA, + 0xA9,0xA9,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBC,0xCD,0xDD,0xCD,0xBB,0xBB,0xCD,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xCB,0xBA,0x9A,0xB8,0xCE,0xEE,0xEC,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xDC,0xDD,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0x99,0x99, + 0x86,0x65,0x45,0x45,0x44,0x45,0x45,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x54,0x44, + 0x54,0x44,0x44,0x45,0x77,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x78,0x78, + 0x77,0x65,0x56,0x77,0x87,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x77,0x65,0x45,0x44,0x45,0x45,0x56,0xBD,0xDE,0x89,0xEE,0xB6,0x67, + 0x75,0x54,0x54,0x44,0x54,0x44,0x44,0x54,0x54,0x56,0x68,0x89,0xAA,0xAA,0xAA,0xA9, + 0xAA,0xAA,0xAB,0xBA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBA,0xAB,0xAA,0xAA,0xAA,0xBA, + 0xBA,0xAB,0xAB,0xAB,0xAB,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD, + 0xEE,0xED,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA, + 0xA9,0xA9,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDC,0xCB,0xBB,0xBC,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDB,0xBA,0x99,0xC9,0x9E,0xEE,0xEC,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xDC,0xDD,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0x99, + 0x87,0x65,0x55,0x45,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x54,0x57,0x77,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87, + 0x76,0x77,0x55,0x67,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x75,0x54,0x55,0x55,0x54,0x55,0x5A,0xEE,0xED,0x85,0x8E,0xEA,0x54, + 0x54,0x44,0x44,0x54,0x45,0x44,0x54,0x44,0x55,0x66,0x78,0x9A,0xAA,0xAA,0xA9,0xAA, + 0xAA,0xAA,0xBA,0xBB,0xAB,0xAA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xDC,0xCD,0xDD, + 0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBB,0xAB,0xAB,0xBA,0xAA, + 0x9A,0x9A,0x9A,0xAA,0xAB,0xBC,0xCB,0xBB,0xBB,0xCC,0xDD,0xDD,0xCC,0xBB,0xBB,0xCE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDB,0xBA,0xA9,0x9C,0x8A,0xEE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBA,0xBA,0xBB,0xAB,0xAA,0xAA,0x99,0x99,0x99,0x89, + 0x98,0x65,0x54,0x54,0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x54,0x44, + 0x44,0x44,0x45,0x44,0x55,0x77,0x78,0x77,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x77, + 0x77,0x77,0x66,0x57,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x54,0x45,0x58,0x96,0x45,0x58,0xBD,0xEB,0xDE,0xD7,0x59,0xEB,0x65, + 0x44,0x54,0x45,0x44,0x54,0x45,0x44,0x55,0x55,0x67,0x99,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xBB,0xAB,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBC,0xBB,0xBB,0xBB,0xCC,0xCC,0xDD,0xDE, + 0xDE,0xDD,0xCC,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xBA,0xBB,0xBA,0xBA,0xAA, + 0x9A,0x9A,0xAA,0xAA,0xBB,0xBD,0xDD,0xBB,0xBB,0xBC,0xDD,0xDD,0xDB,0xBB,0xBB,0xBD, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xDD,0xBB,0xA9,0x9B,0xA8,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDB,0xDD,0xDD,0xCB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x98, + 0x98,0x76,0x55,0x45,0x45,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x45, + 0x44,0x45,0x44,0x44,0x44,0x57,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87, + 0x87,0x87,0x75,0x67,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x55,0x45,0x44,0x6D,0xE8,0x55,0x5B,0xEE,0xB6,0x8E,0xEC,0x75,0x75,0x54, + 0x54,0x45,0x44,0x45,0x44,0x44,0x54,0x55,0x57,0x89,0x9A,0xAA,0xAA,0xAA,0xA9,0xAA, + 0xAA,0xAB,0xAB,0xBA,0xBB,0xBA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA, + 0xAB,0xAA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xCB,0xCC,0xBC,0xCD,0xDD, + 0xDD,0xDD,0xDC,0xCB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAA, + 0xA9,0xA9,0xAA,0xAA,0xAB,0xCC,0xDD,0xCD,0xBB,0xBB,0xCB,0xDD,0xDD,0xDB,0xBB,0xBB, + 0xDE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xDD,0xCB,0xAA,0x99,0xD8,0xAE,0xEE,0xEC,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDD,0xDB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x99, + 0x98,0x87,0x65,0x54,0x54,0x45,0x44,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x54,0x55,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x78,0x77,0x88,0x78,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78, + 0x78,0x75,0x45,0x44,0x44,0x8E,0xA6,0x66,0x57,0xDE,0xD7,0x57,0xEF,0xC6,0x54,0x45, + 0x44,0x44,0x45,0x44,0x45,0x45,0x45,0x56,0x78,0x99,0xAA,0xAB,0xBB,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xAB,0xBA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBC,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xDC, + 0xCD,0xDD,0xCC,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xBB,0xCD,0xDD,0xDC,0xBB,0xBB,0xCD,0xDD,0xDD,0xCB,0xBB,0xBB, + 0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xED,0xCB,0xBA,0xA9,0xAB,0x8D,0xEE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDC,0xBA,0xA9,0xAA,0x9A,0x9A,0x99,0x9A,0xAA,0xA9,0x99,0x99, + 0x89,0x87,0x65,0x45,0x44,0x54,0x44,0x54,0x44,0x44,0x54,0x54,0x54,0x44,0x54,0x45, + 0x44,0x54,0x44,0x54,0x44,0x45,0x57,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x77,0x88,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x54,0x44,0x45,0x45,0xAE,0x88,0xDD,0xB7,0x7D,0xEC,0x75,0x8B,0x75,0x45,0x44, + 0x45,0x45,0x44,0x45,0x44,0x54,0x55,0x57,0x89,0xAA,0xAB,0xBB,0xBA,0x9A,0xAA,0xAA, + 0xBB,0xBB,0xAB,0xBB,0xAB,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBC,0xBB,0xBC,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0x9A,0xAA, + 0xA9,0xAA,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD,0xDC,0xBB,0xBC,0xCD,0xDD,0xDD,0xCB,0xBB, + 0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xDC,0xBA,0xA9,0x8C,0x9A,0xEE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xBB,0xAA,0x99,0xA9,0x99,0x99,0x99,0xAA,0x99,0x99,0x99, + 0x99,0x98,0x76,0x55,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x54,0x44,0x54,0x44,0x46,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x87, + 0x55,0x44,0x54,0x44,0x45,0x67,0x8F,0xFD,0xEE,0x88,0xEE,0xD7,0x45,0x44,0x54,0x45, + 0x44,0x44,0x54,0x54,0x45,0x45,0x56,0x78,0xAA,0xAB,0xAB,0xCC,0xAA,0xAA,0xAA,0xAB, + 0xAB,0xBB,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCC,0xCC,0xBB,0xBB,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xCD,0xDC,0xBB,0xBB,0xCD,0xDD,0xDD,0xCB,0xBB, + 0xBB,0xDE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDC,0xBB,0xA9,0x9A,0xC8,0xBE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xCB,0xA9,0x99,0x99,0x99,0x89,0x99,0x9A,0xA9,0xA9,0x99, + 0x99,0x98,0x86,0x65,0x54,0x54,0x44,0x44,0x45,0x45,0x44,0x54,0x54,0x44,0x45,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x67,0x78,0x78,0x87,0x88,0x78,0x78,0x78,0x78, + 0x78,0x78,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x75, + 0x44,0x55,0x45,0x55,0x55,0x46,0xDE,0x88,0xEE,0xA5,0x7E,0xE8,0x54,0x45,0x45,0x44, + 0x45,0x45,0x44,0x45,0x45,0x55,0x67,0x8A,0xAA,0xAB,0xCD,0xCA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBC,0xCB,0xDC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAB,0xBC,0xDD,0xCC,0xBB,0xBC,0xCD,0xDD,0xDC,0xBB, + 0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xDD,0xBB,0xAA,0x98,0xBA,0x9E,0xEE,0xEE,0xDD,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDB,0xAA,0x99,0x99,0x99,0x99,0x89,0x9A,0xAA,0x99,0xA9, + 0x99,0xAA,0x97,0x66,0x55,0x45,0x45,0x45,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x44, + 0x44,0x54,0x44,0x45,0x44,0x54,0x44,0x56,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x88,0x76,0x54, + 0x54,0x55,0x76,0x55,0x57,0x77,0xEE,0xAD,0xE8,0x89,0x57,0x75,0x45,0x44,0x54,0x54, + 0x54,0x44,0x54,0x54,0x55,0x56,0x88,0xAB,0xBB,0xDD,0xDB,0xAA,0xAA,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xCC,0xCC,0xCC,0xCB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB, + 0xAB,0xAA,0xAB,0xAB,0xAB,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBB,0xCD,0xDC,0xCB,0xCC,0xDD,0xDD,0xDD,0xBB, + 0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0x99,0x8D,0x8A,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDC,0xBA,0x99,0x99,0x99,0x98,0x99,0x9A,0xAA,0xA9,0x9A, + 0xAB,0xAA,0x99,0x77,0x55,0x54,0x54,0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x54,0x44, + 0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x68,0x78,0x78,0x78,0x87,0x88,0x78,0x78, + 0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x87,0x54,0x44, + 0x45,0x6B,0xEA,0x65,0x8E,0x96,0xDE,0xED,0x88,0xDE,0x74,0x45,0x45,0x45,0x44,0x54, + 0x45,0x45,0x44,0x55,0x66,0x78,0xAB,0xCB,0xBD,0xDD,0xCA,0xAA,0xAA,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xCC,0xDC,0xCC,0xDB,0xDC,0xBB,0xAB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBB,0xAB,0xAB, + 0xAB,0xBA,0xBA,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA, + 0xAA,0xAA,0xBB,0xAA,0xA9,0xA9,0xAA,0xAB,0xBC,0xDC,0xDC,0xBC,0xCC,0xDD,0xDD,0xCC, + 0xBB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x89,0xA8,0xDE,0xEE,0xEC,0xDE,0xDE,0xDE,0xEE, + 0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xBB,0xA9,0x99,0x89,0x89,0x98,0x99,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xBA,0x87,0x76,0x55,0x45,0x45,0x44,0x54,0x45,0x44,0x44,0x54,0x44,0x45, + 0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x56,0x77,0x87,0x87,0x87,0x87,0x87,0x88, + 0x78,0x87,0x87,0x88,0x77,0x88,0x78,0x78,0x78,0x78,0x87,0x88,0x88,0x65,0x45,0x45, + 0x45,0x6D,0xEE,0x96,0xBE,0xB5,0x7E,0xED,0xBE,0xF9,0x65,0x44,0x44,0x54,0x54,0x54, + 0x54,0x44,0x55,0x56,0x67,0x8B,0xDD,0xDD,0xDD,0xDB,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xCC,0xCC,0xCB,0xCD,0xCC,0xBB,0xBA,0xBB,0xAB,0xBA,0xBB,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xBB,0xCD,0xDC,0xCB,0xCD,0xCD,0xDD,0xDB, + 0xBB,0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xAA,0x98,0xC9,0x9E,0xEE,0xED,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCB,0xA9,0x99,0x99,0x99,0x89,0x99,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xA8,0x77,0x55,0x54,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x44, + 0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x78,0x78,0x78,0x78,0x78,0x78,0x87, + 0x88,0x78,0x87,0x87,0x88,0x87,0x88,0x87,0x87,0x88,0x78,0x78,0x75,0x45,0x44,0x44, + 0x54,0x55,0xCE,0xE9,0x9E,0xC7,0x57,0xCE,0xED,0x85,0x54,0x45,0x45,0x45,0x45,0x44, + 0x45,0x45,0x56,0x66,0x88,0xBE,0xEE,0xEE,0xDD,0xCA,0xAA,0xAA,0xAB,0xBB,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xCC,0xDC,0xCB,0xBB,0xBC,0xCD,0xCB,0xBB,0xAB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBB, + 0xAB,0xBB,0xAB,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB, + 0xBB,0xBA,0xAA,0xA9,0xAA,0xAA,0x9A,0x99,0xAB,0xBD,0xDD,0xDC,0xCC,0xCD,0xDD,0xDD, + 0xDB,0xBB,0xBC,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xDD,0xCB,0xAA,0x99,0x9B,0x8C,0xEE,0xEE,0xDD,0xED,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xDE,0xDD,0xDD,0xDB,0xBA,0x99,0x89,0x99,0x99,0x99,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xBC,0xBA,0x87,0x75,0x55,0x45,0x44,0x45,0x45,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x54,0x54,0x45,0x44,0x57,0x87,0x87,0x87,0x88,0x87,0x87, + 0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x54,0x44,0x54,0x54, + 0x45,0x55,0x6D,0xEE,0xCE,0xED,0x97,0x67,0x65,0x54,0x45,0x44,0x54,0x54,0x54,0x54, + 0x54,0x55,0x56,0x78,0x9A,0xAD,0xEE,0xED,0xDB,0xAA,0xAA,0xAB,0xBB,0xCC,0xCC,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB, + 0xCC,0xCC,0xBB,0xBB,0xBC,0xCC,0xCC,0xBA,0xAB,0xAB,0xAA,0xBB,0xBA,0xBA,0xBA,0xBA, + 0xBB,0xAB,0xBA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB, + 0xBB,0xBA,0xA9,0xAA,0xAB,0xAA,0xA9,0xAA,0xAA,0xBC,0xDD,0xDD,0xCC,0xCC,0xDD,0xDD, + 0xCC,0xBB,0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0xA9,0x8B,0xA9,0xEE,0xEE,0xED,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCA,0xA9,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB, + 0xBC,0xCC,0xCB,0xCB,0xA8,0x77,0x55,0x54,0x54,0x54,0x44,0x44,0x54,0x44,0x54,0x54, + 0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x78,0x87,0x88,0x78,0x78,0x88, + 0x78,0x87,0x88,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x87,0x54,0x45,0x45,0x44,0x45, + 0x55,0x66,0x57,0xEE,0xED,0xEE,0xEE,0xB6,0x54,0x45,0x44,0x54,0x45,0x45,0x45,0x45, + 0x55,0x56,0x68,0x89,0xAA,0xAA,0xEE,0xED,0xBA,0xAA,0xAA,0xAB,0xBB,0xCC,0xCB,0xBB, + 0xBA,0xBB,0xBA,0xBA,0xAA,0xAB,0xAB,0xAA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBB,0xCC, + 0xCB,0xBB,0xBA,0xBB,0xBB,0xBC,0xCB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBB,0xAB,0xAA,0xAA, + 0xAA,0xBA,0xBB,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC, + 0xBB,0xAA,0x9A,0xAA,0xAA,0xBA,0xAA,0x99,0xAA,0xBC,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD, + 0xDC,0xCB,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xED,0xDC,0xBB,0xA9,0x98,0xC8,0xAE,0xEE,0xED,0xDD,0xDE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCB,0xAA,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xCB, + 0xDB,0xCC,0xCC,0xBB,0xBA,0x87,0x75,0x55,0x45,0x45,0x45,0x44,0x45,0x44,0x44,0x44, + 0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x57,0x88,0x78,0x87,0x88,0x78, + 0x87,0x88,0x78,0x78,0x78,0x87,0x88,0x78,0x78,0x78,0x75,0x45,0x44,0x54,0x54,0x55, + 0x58,0xAB,0xA7,0x8E,0xED,0x99,0xDD,0x85,0x54,0x54,0x54,0x45,0x45,0x45,0x45,0x55, + 0x56,0x67,0x8A,0xBA,0xAA,0xAA,0xAD,0xED,0xAA,0xAA,0xAB,0xBB,0xDC,0xDB,0xCB,0xBA, + 0xAB,0xAB,0xBB,0xAA,0xBA,0xBA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAB,0xBB,0xBC,0xDB, + 0xCB,0xAA,0xA9,0xAA,0xBB,0xAA,0xA9,0xAA,0xAB,0xBC,0xDE,0xEE,0xDD,0xCB,0xCD,0xDD, + 0xDD,0xBB,0xBB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0xAA,0x8D,0xEE,0xEE,0xCD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDB,0xBA,0x99,0x9A,0xAA,0xBB,0xBB,0xBC,0xCD, + 0xCD,0xCC,0xCC,0xCB,0xBB,0xA8,0x77,0x55,0x54,0x54,0x44,0x45,0x44,0x44,0x54,0x54, + 0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x45,0x78,0x78,0x78,0x87,0x88, + 0x78,0x87,0x88,0x78,0x88,0x78,0x87,0x87,0x88,0x75,0x45,0x44,0x45,0x55,0x55,0x56, + 0xAE,0xEE,0xEE,0x88,0xEE,0xD7,0x66,0x55,0x45,0x45,0x45,0x45,0x44,0x54,0x55,0x55, + 0x67,0x89,0xCC,0xDB,0xAA,0xBA,0xAA,0xBA,0xAA,0xAA,0xBB,0xBC,0xCD,0xCC,0xBB,0xAA, + 0xBA,0xBA,0xBA,0xBA,0xAA,0xAB,0xAB,0xAA,0xBA,0xBA,0xAA,0xBA,0xAB,0xAB,0xBC,0xCC, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xAB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCD,0xCD, + 0xCB,0xBA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAB,0xBD,0xEE,0xEE,0xED,0xDC,0xCC,0xBD, + 0xCD,0xDC,0xBB,0xBB,0xCE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB,0xBA,0x99,0x8C,0x9A,0xEE,0xEE,0xED,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xBA,0xAA,0x9A,0xAB,0xBB,0xCD,0xCD,0xBC, + 0xCC,0xCD,0xDD,0xDB,0xBB,0xBA,0x87,0x75,0x55,0x45,0x45,0x44,0x54,0x45,0x44,0x44, + 0x54,0x44,0x54,0x54,0x44,0x45,0x45,0x45,0x45,0x44,0x45,0x57,0x88,0x87,0x88,0x78, + 0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x88,0x87,0x54,0x54,0x45,0x55,0x66,0x65,0x58, + 0xEE,0x88,0xEE,0xE7,0x8E,0xE9,0x54,0x54,0x54,0x45,0x45,0x45,0x45,0x45,0x55,0x77, + 0x78,0xAC,0xDD,0xDD,0xBB,0xAA,0xAA,0x9A,0xAA,0xBB,0xBC,0xDD,0xCC,0xCB,0xBA,0xBB, + 0xAB,0xAB,0xAA,0xBA,0xBA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBC,0xCC, + 0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0xAA, + 0xAB,0xBB,0xAB,0xAB,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCD,0xCD,0xCD, + 0xDB,0xBA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE,0xED,0xBC,0xCD, + 0xDD,0xDB,0xCB,0xBB,0xBC,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xFE,0xED,0xDC,0xBA,0xA9,0x99,0xC8,0xBE,0xEE,0xEC,0xDD,0xDE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDB,0xAA,0xAA,0xAB,0xBB,0xDB,0xDC,0xDC, + 0xDB,0xCC,0xDD,0xDD,0xCB,0xBB,0xB8,0x77,0x65,0x54,0x54,0x55,0x44,0x54,0x44,0x54, + 0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x78,0x78,0x78,0x87, + 0x88,0x87,0x87,0x88,0x78,0x88,0x78,0x87,0x54,0x54,0x44,0x55,0x57,0xAD,0xB8,0x6A, + 0xEC,0x65,0x7E,0xFA,0x57,0x85,0x55,0x45,0x45,0x54,0x54,0x54,0x55,0x55,0x67,0x78, + 0x9B,0xDD,0xDE,0xED,0xDC,0xAA,0xAA,0xAA,0xBB,0xBB,0xCD,0xDC,0xDC,0xBA,0xBA,0xBB, + 0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xBC,0xBD, + 0xCC,0xBB,0xBA,0xBA,0xBB,0xBA,0xBB,0xBA,0xA9,0xA9,0x99,0x99,0x99,0x99,0xA9,0xAA, + 0xAA,0xBA,0xBB,0xBA,0xBA,0xBA,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xCC,0xDC,0xDD,0xDD, + 0xDD,0xBB,0xBA,0xAA,0xAB,0xBA,0xBB,0xBB,0xCD,0xEE,0xEE,0xFE,0xFE,0xED,0xDB,0xCC, + 0xCD,0xDD,0xCC,0xBB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xA9,0x98,0xBA,0x9E,0xEE,0xEE,0xCD,0xDE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDB,0xBA,0xAA,0xBB,0xBC,0xDC,0xDC,0xCC, + 0xCB,0xBB,0xDE,0xED,0xCB,0xBC,0xBC,0x87,0x76,0x55,0x54,0x44,0x45,0x44,0x54,0x44, + 0x54,0x45,0x45,0x45,0x44,0x45,0x45,0x44,0x44,0x44,0x45,0x45,0x57,0x88,0x87,0x88, + 0x78,0x78,0x88,0x78,0x87,0x87,0x88,0x75,0x45,0x44,0x55,0x56,0x8D,0xFF,0xEE,0x8A, + 0xEE,0x86,0x6C,0xEB,0x65,0x45,0x54,0x45,0x54,0x55,0x45,0x45,0x55,0x67,0x78,0x9B, + 0xBD,0xDE,0xEE,0xED,0xDB,0xAA,0xAA,0xAA,0xBB,0xCD,0xCD,0xCD,0xBB,0xBB,0xAA,0xBA, + 0xBA,0xBC,0xBB,0xAB,0xAB,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xAB,0xAB,0xBB,0xCC, + 0xCB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0x99,0x99,0x9A,0x99,0x9A,0x99,0x99,0xAA, + 0xAA,0xBB,0xAB,0xAB,0xAA,0xBB,0xBB,0xAB,0xAA,0xBB,0xBB,0xCC,0xDB,0xDC,0xDC,0xDD, + 0xDD,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xEE,0xFE,0xEE,0xEE,0xEE,0xDC,0xBB, + 0xCD,0xDC,0xDB,0xBB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xBA,0x99,0x8D,0x8B,0xEE,0xEE,0xDD,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xBB,0xAB,0xBB,0xDC,0xDC,0xDB,0xDC, + 0xCB,0xBA,0xBD,0xDC,0xCD,0xCC,0xBB,0xB8,0x77,0x75,0x55,0x54,0x54,0x45,0x44,0x54, + 0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x45,0x45,0x44,0x44,0x45,0x78,0x78,0x87, + 0x88,0x88,0x87,0x87,0x87,0x88,0x75,0x55,0x44,0x54,0x45,0x6A,0xEE,0xBB,0xEF,0xD8, + 0xEE,0xDA,0xAE,0xE8,0x55,0x56,0x55,0x54,0x54,0x54,0x55,0x55,0x66,0x67,0x8B,0xBC, + 0xDD,0xDD,0xEE,0xEE,0xDB,0xAA,0xAA,0xBB,0xBB,0xDC,0xDD,0xCC,0xBB,0xAB,0xBA,0xBA, + 0xBB,0xBB,0xCB,0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC, + 0xCD,0xCB,0xBB,0xBB,0xBB,0xBA,0xAA,0x9A,0x99,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99, + 0xAA,0xAA,0xBA,0xBA,0xBA,0xAB,0xAB,0xBA,0xBA,0xBB,0xBD,0xDD,0xDD,0xDC,0xBB,0xCC, + 0xDD,0xDD,0xDC,0xCB,0xBB,0xCB,0xBB,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xBB, + 0xBB,0xDD,0xDD,0xBB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x89,0xB9,0xDE,0xEE,0xEC,0xDD, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDB,0xBB,0xBD,0xCC,0xDB,0xCC,0xCC, + 0xCB,0xBB,0xBB,0xBD,0xDC,0xDC,0xBB,0xBA,0x97,0x77,0x65,0x55,0x44,0x54,0x45,0x44, + 0x54,0x44,0x54,0x44,0x44,0x54,0x54,0x44,0x44,0x44,0x45,0x44,0x54,0x57,0x88,0x78, + 0x87,0x88,0x78,0x88,0x78,0x87,0x54,0x44,0x54,0x45,0x45,0x9E,0xED,0x76,0xBE,0xE7, + 0x8E,0xEF,0xFE,0x95,0x54,0x54,0x54,0x54,0x55,0x55,0x55,0x56,0x67,0x8A,0xBC,0xDD, + 0xDE,0xEE,0xEE,0xDB,0xBA,0xBA,0xBB,0xBB,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xAA, + 0xBA,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xAB,0xAA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xCC,0xCB,0xCB,0xBB,0xAA,0xAA,0x9A,0x99,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0x99, + 0x99,0xAA,0xAA,0xBA,0xAA,0xAB,0xBB,0xBB,0xAB,0xBC,0xDD,0xDE,0xDC,0xCB,0xBB,0xBB, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xEE,0xEE,0xFE,0xFE,0xEF,0xEF,0xEE,0xED,0xBB, + 0xBB,0xCD,0xDC,0xDB,0xBB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDC,0xBB,0xA9,0x98,0xC9,0x9E,0xEE,0xEE,0xCD, + 0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCC,0xBD,0xCD,0xCC,0xBC,0xCC, + 0xCB,0xBB,0xBA,0xBC,0xDE,0xEC,0xBB,0xAB,0xBA,0x87,0x77,0x55,0x55,0x44,0x54,0x45, + 0x44,0x54,0x44,0x54,0x54,0x44,0x45,0x45,0x45,0x45,0x44,0x44,0x44,0x45,0x78,0x87, + 0x88,0x78,0x88,0x78,0x87,0x55,0x54,0x54,0x44,0x54,0x45,0x7D,0xEE,0xC8,0xDE,0xC6, + 0x47,0xAB,0xA7,0x54,0x45,0x45,0x44,0x54,0x55,0x55,0x66,0x77,0x89,0xBB,0xDC,0xDD, + 0xEE,0xED,0xED,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB,0xAB,0xAB,0xBB,0xAA, + 0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAB,0xBB,0xBB,0xAB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB, + 0xCB,0xDC,0xBB,0xBB,0xBA,0xA9,0xA9,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xA9, + 0xA9,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBD,0xDD,0xED,0xDD,0xBB,0xAB,0xBB, + 0xBC,0xDD,0xEE,0xEE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xED,0xBB, + 0xBB,0xBC,0xDD,0xCD,0xBB,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB,0xAA,0x99,0x9C,0x8B,0xEE,0xEE,0xDD, + 0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xCC,0xCB,0xCB,0xCB,0xCD, + 0xCD,0xBB,0xBB,0xBB,0xEE,0xBB,0xCC,0xBB,0xAA,0xB8,0x77,0x77,0x55,0x55,0x44,0x54, + 0x54,0x45,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x54,0x45,0x44,0x57,0x88, + 0x78,0x87,0x87,0x88,0x75,0x44,0x44,0x44,0x45,0x44,0x54,0x47,0xEE,0xEE,0xED,0x75, + 0x44,0x45,0x45,0x45,0x55,0x45,0x55,0x55,0x55,0x67,0x77,0x89,0xBC,0xDD,0xDD,0xEE, + 0xEE,0xED,0xBB,0xAB,0xBB,0xBB,0xBB,0xCB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xDA, + 0xBA,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCB,0xBA,0xAA,0x99,0x9A,0x9A,0x9A,0x9A,0xA9,0xA9,0xA9,0xA9,0xA9,0x99, + 0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCD,0xDE,0xDD,0xDC,0xBB,0xBA,0xBA, + 0xBB,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xED,0xBB, + 0xAB,0xBB,0xCD,0xDC,0xCB,0xBB,0xBC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0xA9,0x8B,0xA9,0xEE,0xEE,0xED, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC,0xCD,0xBC,0xBC,0xBD,0xCC, + 0xCC,0xCC,0xBB,0xBB,0xBC,0xDE,0xDC,0xBB,0xAA,0xA9,0x98,0x77,0x75,0x55,0x55,0x45, + 0x45,0x44,0x44,0x44,0x54,0x44,0x54,0x54,0x54,0x54,0x44,0x45,0x44,0x54,0x45,0x78, + 0x87,0x88,0x88,0x86,0x44,0x54,0x54,0x45,0x44,0x54,0x45,0x44,0x7E,0xEE,0xE7,0x55, + 0x54,0x54,0x54,0x54,0x44,0x55,0x55,0x55,0x67,0x78,0x89,0xBD,0xCD,0xDD,0xDE,0xEE, + 0xDE,0xDB,0xAB,0xBB,0xBB,0xCB,0xDC,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xBB,0xBB,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A, + 0x9A,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBD,0xDE,0xEE,0xDC,0xBB,0xBA,0xAA, + 0xAA,0xBD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xED,0xBA, + 0xAA,0xBB,0xBB,0xDC,0xDC,0xBB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBB,0xA9,0x98,0xD8,0xAE,0xEE,0xEE, + 0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xCD,0xBD,0xBC,0xCB,0xBB,0xCC,0xCD, + 0xBD,0xCD,0xBC,0xBB,0xBB,0xEF,0xEE,0xDD,0xBA,0xAA,0xA9,0x87,0x77,0x66,0x55,0x54, + 0x54,0x54,0x54,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x45,0x44,0x56, + 0x88,0x88,0x87,0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x54,0x45,0x48,0xEE,0xE9,0x65, + 0x45,0x45,0x45,0x45,0x55,0x55,0x57,0x77,0x78,0x8B,0xBD,0xBC,0xDD,0xDE,0xDE,0xDE, + 0xDB,0xAB,0xBB,0xBB,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xCC,0xAB,0xBC, + 0xCC,0xCC,0xBB,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCD,0xBC,0xBA,0xAA,0xA9,0xA9,0xAA,0xA9,0xAA,0x9A,0x99,0xA9,0xA9,0xA9,0x9A, + 0x99,0x9A,0x9A,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xCD,0xDD,0xED,0xDD,0xBB,0xBA,0xAA, + 0x9A,0xAB,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDC,0xBA, + 0x9A,0xAA,0xBC,0xDD,0xCC,0xBB,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xAA,0x99,0x9B,0x8D,0xEE,0xEE, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDB,0xDC,0xDC,0xCB,0xBC,0xBB,0xBC, + 0xCC,0xCD,0xCD,0xCC,0xBB,0xBE,0xFF,0xED,0xAA,0xAA,0x9A,0x99,0x86,0x77,0x75,0x55, + 0x55,0x45,0x44,0x45,0x44,0x54,0x45,0x45,0x44,0x54,0x44,0x45,0x44,0x44,0x45,0x44, + 0x56,0x66,0x54,0x45,0x44,0x44,0x45,0x44,0x54,0x54,0x45,0x45,0x44,0x8E,0xEE,0x95, + 0x55,0x44,0x54,0x55,0x55,0x67,0x88,0x89,0xAB,0xBC,0xCC,0xDD,0xDE,0xDE,0xEE,0xDB, + 0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDC,0xCB,0xBA,0xBC,0xBB,0xCA,0xAB,0xCD,0xDD,0xCD, + 0xCD,0xCC,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB, + 0xBB,0xCC,0xCB,0xBB,0xAA,0x99,0xA9,0xA9,0x9A,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A, + 0x9A,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xDD,0xDE,0xDD,0xCB,0xBA,0xA9, + 0x9A,0xAB,0xBD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xA9, + 0xA9,0xAA,0xBB,0xCC,0xDC,0xBB,0xBB,0xBC,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xCB,0xBA,0x99,0x8C,0x99,0xEE,0xEF, + 0xEC,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDC,0xCD,0xCD,0xDD,0xBB,0xBB,0xBC,0xCC, + 0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xEF,0xFC,0xBD,0xAA,0x99,0xAA,0xA8,0x87,0x77,0x65, + 0x55,0x55,0x55,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x54,0x45, + 0x45,0x45,0x45,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x45,0x49,0xFF,0xA5, + 0x54,0x55,0x55,0x56,0x77,0x78,0x78,0x9B,0xBC,0xCC,0xDD,0xDD,0xEE,0xEE,0xEB,0xBB, + 0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xCD,0xBB,0xDD,0xBA,0xBC,0xDC,0xDC, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xEF,0xEB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xDC,0xCB,0xBB,0x99,0xA9,0xAA,0xAA,0xAA,0xAB,0xCA,0xA9,0xAA,0x9A,0x9A,0x9A, + 0x99,0xA9,0x99,0x9A,0xAA,0xBB,0xBB,0xBA,0xBB,0xBB,0xCD,0xDE,0xED,0xDC,0xBA,0xA9, + 0x99,0xAA,0xBD,0xDE,0xEE,0xFE,0xEE,0xEF,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDB,0xAA, + 0x99,0x9A,0xBB,0xCD,0xCC,0xCB,0xBB,0xBC,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xED,0xDB,0xBA,0xA9,0x99,0xC8,0xBE,0xEE, + 0xEE,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xDC,0xCD,0xDD,0xDC,0xBB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBD,0xCC,0xEC,0xA9,0x99,0xAA,0xBB,0xB9,0x87,0x77, + 0x76,0x55,0x55,0x55,0x45,0x45,0x44,0x54,0x54,0x45,0x44,0x45,0x44,0x54,0x45,0x44, + 0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x54,0x44,0x54,0x45,0x44,0x45,0x45,0x98,0x55, + 0x55,0x55,0x56,0x78,0x77,0x79,0xAB,0xDD,0xCC,0xDD,0xDD,0xEE,0xED,0xED,0xBB,0xBB, + 0xBB,0xBC,0xDD,0xDE,0xDD,0xDD,0xCC,0xBA,0xBB,0xBC,0xCB,0xBD,0xDC,0xBC,0xDD,0xCC, + 0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBA,0xAD,0xFE,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xCA,0x99,0x99,0x99,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9, + 0x9A,0x99,0x99,0x9A,0xAA,0xBA,0xBA,0xBB,0xBB,0xAB,0xBC,0xDD,0xED,0xED,0xBB,0xA9, + 0xA9,0x9A,0xAB,0xDD,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xCC,0xBA, + 0xA9,0xAA,0xAB,0xBB,0xBB,0xBC,0xCC,0xCB,0xDD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0x98,0xAA,0x8D,0xEE, + 0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCD,0xDD,0xDD,0xDB,0xBB,0xBB,0xCC, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xCB,0xBA,0xBD,0xBA,0x9A,0xA9,0xAA,0xBA,0xAA,0xBB,0x98, + 0x87,0x77,0x65,0x55,0x55,0x45,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x54,0x54, + 0x54,0x54,0x45,0x44,0x54,0x44,0x54,0x44,0x54,0x44,0x54,0x45,0x44,0x54,0x55,0x55, + 0x56,0x67,0x78,0x77,0x88,0xBC,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEC,0xBB,0xBB,0xBC, + 0xBC,0xDD,0xDE,0xDD,0xDD,0xDB,0xCB,0xAB,0xBB,0xBB,0xBA,0xBB,0xDC,0xDC,0xCC,0xCB, + 0xBB,0xBB,0xBC,0xBC,0xBC,0xCC,0xCC,0xCC,0xBB,0xBA,0xCE,0xEB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xBA,0x98,0x89,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xA9,0x99,0xA9,0xA9,0xA9, + 0xA9,0xA9,0x9A,0x9A,0xAB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xDD,0xEE,0xDD,0xDB,0xBA, + 0x99,0xAA,0xAB,0xBD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBB,0xCD,0xCB, + 0xAA,0xAA,0xBB,0xBB,0xBB,0xDC,0xCC,0xBC,0xCD,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xBA,0x99,0x8D,0x9A,0xEE, + 0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xBB,0xEE, + 0xD9,0x88,0x76,0x65,0x55,0x55,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x45,0x44,0x44, + 0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x54,0x45,0x45,0x44,0x54,0x55,0x55,0x55,0x67, + 0x78,0x78,0xDA,0x9A,0xBC,0xCD,0xDE,0xEE,0xEE,0xDE,0xDD,0xDD,0xBB,0xBB,0xBB,0xBB, + 0xDD,0xDD,0xED,0xEE,0xDD,0xCB,0xAB,0xBA,0xBA,0xAB,0xAB,0xBB,0xCD,0xCD,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xCC,0xCC,0xDC,0xDB,0xDC,0xBB,0xBC,0xDC,0xBB,0xBB,0xAB,0xBB, + 0xBC,0xCC,0xBA,0x88,0x89,0x9A,0x9A,0xA9,0xA9,0xAA,0xA9,0xAA,0xAA,0x9A,0x9A,0x9A, + 0x9A,0x9A,0x99,0x9A,0xAB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAB,0xCD,0xDE,0xED,0xDC,0xBB, + 0xAA,0xAA,0xAB,0xBD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xBA,0xA9,0xAA,0xCC, + 0xBB,0xAA,0xAA,0xAA,0xBC,0xBD,0xCD,0xCC,0xCB,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x99,0xC8,0xCE, + 0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB, + 0xBC,0xCD,0xDD,0xDE,0xEE,0xDD,0xDB,0xBB,0xAA,0xAA,0x99,0x9A,0xAA,0xBB,0xBD,0xFF, + 0xFF,0xEB,0x98,0x77,0x66,0x55,0x55,0x55,0x54,0x54,0x44,0x45,0x44,0x54,0x55,0x54, + 0x54,0x54,0x45,0x44,0x45,0x44,0x45,0x45,0x45,0x45,0x55,0x55,0x55,0x56,0x77,0x88, + 0x88,0x8A,0xAB,0xBB,0xDD,0xDD,0xEE,0xEE,0xEE,0xDD,0xDC,0xBB,0xBB,0xCC,0xCD,0xDD, + 0xDD,0xED,0xEE,0xDD,0xDC,0xCB,0xBA,0xBB,0xBA,0xBA,0xAB,0xBC,0xDC,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDB,0xCB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBC,0xCC,0xBA,0x88,0x89,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0x9A, + 0x99,0xA9,0x9A,0x9A,0xAB,0xBB,0xBA,0xBA,0xBA,0xAA,0xBB,0xBC,0xDD,0xDD,0xDD,0xBB, + 0xBA,0xBB,0xBB,0xCC,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xDD,0xBB,0xBB,0xA9,0x9A,0xAB, + 0xAA,0xAA,0xAA,0xAB,0xBC,0xDD,0xDC,0xDB,0xBC,0xDD,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBB,0xA9,0x98,0xBA,0x9E, + 0xEF,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB, + 0xBB,0xBD,0xCD,0xDD,0xDE,0xDD,0xDC,0xBB,0xAB,0xAA,0xAA,0xAA,0xAB,0xBD,0xDE,0xFF, + 0xFF,0xFF,0xFD,0xA8,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x54,0x55,0x55,0x55,0x55, + 0x55,0x45,0x54,0x54,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x77,0x78,0x8A,0x9A, + 0xBB,0xBA,0xBB,0xAB,0xCD,0xDD,0xEE,0xEE,0xEE,0xDC,0xBB,0xBC,0xBB,0xBC,0xDD,0xDE, + 0xED,0xEE,0xED,0xDD,0xDD,0xCB,0xBA,0xAB,0xBC,0xBA,0xAB,0xBD,0xCD,0xCB,0xBB,0xBB, + 0xAB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB,0xAB,0xBB,0xBB,0xAB,0xBB, + 0xCC,0xCB,0xBA,0x88,0x89,0x99,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xBB,0xAA,0x9A,0x9A, + 0x9A,0x9A,0x99,0x9A,0xBA,0xBB,0xAB,0xAB,0xAA,0xAA,0xAB,0xBB,0xCC,0xCC,0xDC,0xDC, + 0xBB,0xBB,0xBC,0xCD,0xDE,0xEE,0xEE,0xDE,0xEE,0xEE,0xDD,0xCB,0xBB,0xBB,0xBA,0xAB, + 0xAA,0xAA,0xAA,0xAB,0xBB,0xCD,0xCD,0xCD,0xCC,0xCC,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB,0xAA,0x99,0x8D,0x8A, + 0xEE,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDD,0xBB,0xBA, + 0xBB,0xBC,0xDD,0xCD,0xDD,0xDD,0xCC,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xDE,0xEF,0xEF, + 0xEF,0xFF,0xFE,0xEE,0xDB,0x98,0x87,0x77,0x76,0x66,0x55,0x55,0x55,0x57,0x88,0x77, + 0x65,0x55,0x55,0x55,0x55,0x55,0x56,0x66,0x67,0x77,0x78,0xA9,0x99,0x99,0xAB,0xBB, + 0xBC,0xCB,0xBA,0xAB,0xDE,0xDD,0xDE,0xEE,0xEC,0xBB,0xBB,0xCB,0xCD,0xDD,0xDE,0xED, + 0xEE,0xDE,0xDD,0xDD,0xCD,0xBC,0xCB,0xBB,0xBB,0xDC,0xCC,0xDC,0xCC,0xBC,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xCC,0xDD,0xDE,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB,0xBA,0xBB,0xBB, + 0xCC,0xCB,0xBA,0x98,0x99,0x9A,0xAA,0x9A,0x9A,0xAA,0xAA,0x9A,0xAC,0xAA,0xA9,0xA9, + 0xA9,0xA9,0xA9,0x9A,0xAB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBD,0xDD, + 0xCB,0xCB,0xDC,0xDD,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xDB,0xBB,0xBB,0xBB,0xAB,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xDD,0xDC,0xCB,0xBC,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBA,0xA9,0x99,0xB8, + 0xDE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xBB,0xAB, + 0xAB,0xBB,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xEE,0xFE,0xEE, + 0xFE,0xEE,0xEE,0xDD,0xEE,0xED,0xDC,0xB8,0x88,0x77,0x77,0x77,0x77,0x7C,0xFE,0xDB, + 0x87,0x66,0x66,0x66,0x66,0x78,0x8A,0xA8,0x88,0x88,0x8A,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCB,0xBA,0xAA,0xBE,0xED,0xDD,0xED,0xDC,0xCB,0xBB,0xBC,0xDD,0xDD,0xED,0xEE, + 0xDE,0xED,0xDD,0xCD,0xCC,0xCC,0xDC,0xBA,0xBB,0xBB,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB, + 0xAB,0xBB,0xBB,0xCC,0xCD,0xEE,0xFF,0xED,0xDD,0xCD,0xDB,0xBA,0xBB,0xAB,0xBB,0xAB, + 0xBB,0xCB,0xBA,0x98,0x89,0x9A,0x9A,0xAA,0x9A,0xAA,0xAA,0xAA,0xAB,0xAA,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0xAB,0xBB,0xBA,0xAB,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBB,0xCC, + 0xDC,0xDB,0xDD,0xDE,0xEE,0xEE,0xED,0xDD,0xED,0xED,0xCC,0xBB,0xBB,0xBB,0xBA,0xAA, + 0xAA,0xBB,0xBB,0xAA,0xAB,0xBC,0xCC,0xDC,0xDC,0xCB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDC,0xBB,0xA9,0x98,0xBA, + 0x9E,0xEE,0xFE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xCB,0xAB, + 0xAB,0xBC,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xFF, + 0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xBC,0xDC,0xBB,0xB9,0x98,0x88,0x88,0x8D,0xFF,0xFE, + 0xB9,0x98,0x88,0x87,0x77,0x78,0x88,0x88,0x8A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xCB,0xDD,0xAB,0xAB,0xBB,0xDC,0xBC,0xCC,0xCC,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBA,0xBC,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xCD,0xDE,0xFF,0xFE,0xDD,0xDB,0xCB,0xBB,0xAB,0xBA,0xBA,0xBB, + 0xBC,0xCB,0xBA,0x98,0x88,0x9A,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0x9A, + 0x9A,0x9A,0x99,0x9A,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xBA,0xAB,0xBC, + 0xCC,0xCD,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xCD,0xBB,0xCC,0xBB,0xBB,0xAA,0xAA, + 0xAB,0xBD,0xBB,0xAA,0x9A,0xAB,0xBC,0xDD,0xCC,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x8D, + 0x8B,0xEE,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xED,0xDD,0xDB,0xBA, + 0xAB,0xBB,0xDB,0xDC,0xDC,0xDD,0xDC,0xBB,0xBA,0xAB,0xBB,0xCB,0xDD,0xDE,0xEE,0xFF, + 0xFF,0xFE,0xEE,0xEE,0xED,0xCB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9,0x99,0x99, + 0x98,0x88,0x89,0x99,0x99,0x9A,0xBA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC,0xCB,0xBA,0xBC, + 0xDD,0xDE,0xDA,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDC,0xDD,0xCC,0xBB,0xBB,0xBB,0xCB,0xBB,0xBC,0xDC,0xCC,0xBB,0xBB,0xBC,0xBB, + 0xBB,0xBB,0xA9,0xAA,0xBC,0xDE,0xFF,0xEE,0xDD,0xCD,0xCB,0xBB,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xBA,0x98,0x88,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0x9A,0x9A,0xA9,0xAA, + 0x9A,0x9A,0x9A,0x9A,0xAA,0xBB,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAB, + 0xBB,0xDD,0xEE,0xEF,0xEE,0xFE,0xEE,0xDD,0xDC,0xCB,0xBC,0xCC,0xDD,0xCB,0xAA,0xAA, + 0xAB,0xBC,0xBB,0xAA,0xAA,0xAB,0xBB,0xCC,0xCD,0xCC,0xBC,0xCE,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xCB,0xBA,0xA9,0x99, + 0xB8,0xDE,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDE,0xDD,0xDD,0xBB, + 0xAB,0xBD,0xCD,0xCC,0xDC,0xCC,0xCC,0xBB,0xAA,0xAA,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE, + 0xEF,0xEE,0xDE,0xEE,0xEE,0xDC,0xBB,0xBC,0xBB,0xBB,0xBA,0xAA,0xBA,0x99,0x99,0xBB, + 0xDD,0xDB,0xBC,0xBB,0xAA,0xAA,0x99,0x9A,0xAA,0xBA,0xBC,0xCC,0xDC,0xCB,0xAA,0xBD, + 0xDE,0xDC,0xEB,0xAA,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD, + 0xDD,0xDD,0xCC,0xDB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBC,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB, + 0xAA,0x99,0x9A,0x99,0xAA,0xCD,0xDE,0xDD,0xDC,0xCC,0xCB,0xBB,0xBA,0xBA,0xAB,0xAB, + 0xBB,0xBC,0xBB,0x98,0x88,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0x9A,0x9A,0x9A, + 0x9A,0x9A,0x99,0x9A,0xBB,0xBB,0xBA,0xAB,0xAA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xDD,0xEE,0xFE,0xFE,0xFE,0xEE,0xED,0xCB,0xBB,0xCC,0xDD,0xCC,0xBB,0xBA,0xAA, + 0xAA,0xBC,0xCB,0x99,0x9A,0xAA,0xAB,0xBD,0xDC,0xCB,0xBB,0xCD,0xEE,0xFF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDC,0xBA,0xA9,0x98, + 0xCA,0x9E,0xEF,0xEE,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDE,0xDD,0xCB, + 0xBB,0xBC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBA,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xDC,0xDB,0xDC,0xBA,0xBB,0xBB,0xBA,0xBA,0x99,0x99,0xAB, + 0xDC,0xBA,0xAB,0xBB,0xAA,0xA9,0x99,0x9A,0xAB,0xAB,0xBB,0xDC,0xDD,0xBB,0xAA,0xAC, + 0xDD,0xDB,0xBA,0xBB,0xBB,0xBB,0xBB,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDB,0xDC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBA, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xAB,0xDD,0xCD,0xDD,0xDC,0xCB,0xBB,0xAB,0xAB,0xBA,0xBB, + 0xBB,0xBB,0xCB,0xA8,0x88,0x89,0xAA,0xBB,0xBA,0xAA,0xAA,0xBA,0xA9,0xAA,0x9A,0xA9, + 0xA9,0xA9,0xA9,0xAA,0xAB,0xBB,0xAB,0xAA,0xAB,0xAA,0xAA,0xBA,0xAA,0xAA,0x9A,0x9A, + 0xAB,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xBC,0xCD,0xCD,0xCB,0xBB,0xAA, + 0xAA,0xBB,0xBB,0xA9,0x9A,0x9A,0xAB,0xBB,0xCD,0xCD,0xCC,0xBB,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0x99, + 0x9D,0x8B,0xEE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDB, + 0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBA,0xAB,0xAB,0xBD,0xDE,0xDE,0xDE,0xDD,0xDE, + 0xDE,0xDE,0xEE,0xFF,0xFE,0xDD,0xCD,0xCB,0xBB,0xAB,0xBA,0xBB,0xBB,0xAA,0x99,0xAC, + 0xED,0xB9,0x9B,0xDB,0xAA,0xA9,0x99,0xAA,0xBA,0xBB,0xBC,0xDC,0xCB,0xBB,0xBA,0xAA, + 0xBA,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD, + 0xDD,0xCD,0xCC,0xBB,0xBB,0xAB,0xBB,0xBB,0xAB,0xCD,0xBC,0xBB,0xBB,0xBB,0xAB,0xAA, + 0x9A,0x9A,0xAA,0xAA,0xA9,0x9A,0xBB,0xBD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBC,0xBC,0xA8,0x88,0x89,0x9A,0xBE,0xEC,0xAA,0xAA,0x9A,0xAA,0x9A,0xA9,0xA9, + 0xAA,0x9A,0x99,0xAA,0xAB,0xBA,0xBA,0xAA,0xAA,0xBA,0xBA,0xBB,0xAA,0xA9,0xA9,0xAA, + 0xAB,0xCE,0xEE,0xFE,0xFE,0xFE,0xFE,0xED,0xCB,0xBB,0xCD,0xDD,0xDC,0xCB,0xBA,0xAA, + 0xAA,0xAB,0xBB,0xA9,0x99,0x9A,0xAA,0xBB,0xCD,0xCC,0xCB,0xBC,0xDE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xCB,0xBA,0x99, + 0x8A,0xB8,0xDE,0xEF,0xED,0xDD,0xED,0xEE,0xEF,0xEE,0xEF,0xEE,0xDE,0xDE,0xDE,0xDD, + 0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xDD,0xDE,0xEE,0xDE,0xED,0xED, + 0xDD,0xDD,0xDE,0xFE,0xFE,0xDD,0xDD,0xDC,0xBB,0xBA,0xAB,0xAA,0xAB,0xAA,0xAA,0xCC, + 0xCA,0x99,0x9A,0xBB,0xBA,0xAA,0x9A,0xBB,0xBB,0xBB,0xBD,0xDD,0xBB,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xBC,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xCD,0xDC,0xCB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBC,0xCD,0xCC,0xBB,0xBA,0xBB,0xBB,0xAA, + 0x99,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xBB,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xB9,0x88,0x88,0x9A,0xBE,0xFF,0xCA,0xA9,0xAA,0x9A,0xA9,0xAA,0xAA, + 0xA9,0xA9,0x99,0x9A,0xBA,0xBB,0xBA,0xBA,0xAB,0xAA,0xBB,0xBB,0xBB,0xAA,0x99,0x9A, + 0xAB,0xBD,0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xDB,0xBB,0xCC,0xDD,0xDC,0xDB,0xBB,0xAA, + 0xA9,0xAB,0xBA,0xA9,0x99,0x99,0xAA,0xAB,0xBC,0xCD,0xCC,0xCB,0xBD,0xEE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9, + 0x98,0xD9,0xAE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBD,0xDE,0xEE,0xEE,0xED,0xEE,0xDE, + 0xDE,0xDD,0xDE,0xEE,0xED,0xDC,0xDC,0xCD,0xBB,0xBB,0xBB,0xBA,0xAA,0xBA,0xBD,0xDD, + 0xCA,0x99,0x99,0xAB,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB,0xAB,0xAB,0xAA,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x9A,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xAB,0xAB, + 0xBB,0xBC,0xCB,0xCB,0x88,0x88,0x99,0xAC,0xEF,0xEB,0xAA,0x9A,0xA9,0xA9,0xA9,0xA9, + 0x9A,0x9A,0x9A,0xAA,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xBC,0xBB,0xBA,0xAA,0xAA, + 0xAB,0xBD,0xDE,0xEE,0xFE,0xFE,0xFE,0xED,0xDB,0xBB,0xCD,0xDD,0xDD,0xCC,0xBB,0xAA, + 0xAA,0xAA,0xBB,0xA9,0x99,0x99,0x9A,0xAA,0xBB,0xDC,0xDB,0xBC,0xBD,0xEE,0xEF,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xBB,0xAA, + 0x99,0x9C,0x8C,0xEE,0xFE,0xEC,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xDD,0xDE,0xEE,0xEE,0xEE,0xDE,0xED, + 0xED,0xDE,0xEE,0xEE,0xDD,0xCC,0xBD,0xCC,0xCB,0xBB,0xBB,0xBB,0xAB,0xBC,0xEE,0xEE, + 0xDC,0xA9,0xAA,0xAA,0xBA,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB, + 0xCC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD, + 0xBD,0xCD,0xCD,0xCB,0xCB,0xBB,0xBB,0xAB,0xBB,0xDC,0xBB,0xBB,0xAB,0xAB,0xAA,0x9A, + 0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xCB,0xCC,0xA8,0x88,0x99,0x99,0xAA,0xCA,0xAA,0xA9,0xAA,0xAA,0x9A,0x9A, + 0xA9,0x99,0x99,0xAA,0xBA,0xBB,0xBA,0xAA,0xBB,0xBB,0xBB,0xCB,0xDC,0xBB,0xAA,0xAA, + 0xAB,0xBC,0xDE,0xEF,0xEF,0xEE,0xEE,0xED,0xCB,0xBB,0xCD,0xDD,0xDD,0xDC,0xBB,0xAA, + 0xA9,0xAB,0xBA,0x99,0x98,0x99,0x99,0xAA,0xBB,0xBD,0xCD,0xCB,0xBB,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA, + 0x99,0x8B,0xA8,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDE,0xDD, + 0xDD,0xBB,0xBB,0xBA,0xAA,0xAB,0xBB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE, + 0xDE,0xEE,0xEE,0xEF,0xEE,0xDD,0xCC,0xCB,0xCB,0xBB,0xBC,0xCB,0xBB,0xBC,0xDB,0xBB, + 0xCB,0xBA,0xBA,0xAA,0xBB,0xBC,0xBC,0xBC,0xBC,0xBB,0xCB,0xBC,0xCB,0xBB,0xBC,0xBC, + 0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB, + 0xDB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBA,0xBA,0xAA,0xAA,0x99, + 0xAB,0xAB,0xAA,0xAA,0xAA,0xA9,0xA9,0xAB,0xBB,0xBA,0xBB,0xBC,0xCC,0xBB,0xBA,0xBB, + 0xBB,0xBC,0xCC,0xCC,0xB9,0x88,0x98,0x99,0x9A,0xAA,0xAA,0xAA,0x9A,0x9A,0xAA,0xA9, + 0x9A,0x99,0x9A,0xAB,0xAB,0xBA,0xAA,0xBA,0xBB,0xBB,0xBB,0xCC,0xDC,0xDB,0xBB,0xAB, + 0xBB,0xCC,0xDD,0xEF,0xEE,0xFE,0xFE,0xED,0xBB,0xBB,0xCD,0xDE,0xEE,0xDD,0xBB,0xAA, + 0xA9,0xAA,0xBA,0xA9,0x89,0x99,0x99,0x9A,0xAB,0xBC,0xDC,0xCB,0xBB,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBA, + 0xA9,0x98,0xC9,0xAE,0xEE,0xFE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED, + 0xDD,0xDB,0xBA,0xAA,0xAA,0xAA,0xBB,0xBD,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xDE,0xED, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDC,0xDC,0xCC,0xBC,0xCC,0xBB,0xCB,0xBB,0xBB,0xBB, + 0xBA,0xBA,0xAA,0xAB,0xBB,0xBB,0xDC,0xCC,0xDB,0xDC,0xBC,0xBC,0xCB,0xDB,0xDB,0xDC, + 0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD, + 0xCC,0xCB,0xBB,0xCB,0xBB,0xBA,0xBB,0xAB,0xBB,0xCC,0xBB,0xBA,0xAA,0xAB,0xAA,0x99, + 0xAA,0xBB,0xBB,0xBA,0xAA,0xAA,0x99,0xAA,0xAA,0xBA,0xBB,0xBC,0xBD,0xCB,0xBB,0xBA, + 0xBB,0xBC,0xCC,0xCB,0xCB,0x98,0x89,0x89,0x99,0x99,0xAA,0x9A,0xAA,0xAA,0x9A,0x9A, + 0x99,0x99,0xAA,0xAB,0xBB,0xBA,0xBA,0xAB,0xBB,0xDC,0xDB,0xDC,0xDD,0xDD,0xDC,0xBB, + 0xBC,0xCD,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xBB,0xBB,0xCD,0xDD,0xED,0xDC,0xBB,0xAA, + 0xAA,0xAB,0xAA,0x98,0x98,0x98,0x99,0x99,0xAA,0xBB,0xBD,0xCC,0xCB,0xBD,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDC,0xBB, + 0xAA,0x99,0x9B,0x8C,0xEE,0xEE,0xEC,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDB,0xBA,0xAA,0xAA,0xAA,0xBC,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xEE,0xDD,0xDD,0xDC,0xDC,0xCC,0xCD,0xDD,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDC,0xDB,0xCC,0xCC,0xDB,0xDB,0xCD,0xBD,0xCD,0xCD, + 0xCD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDC, + 0xDD,0xBD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xAA,0xAA,0xAA,0xAA,0x89, + 0x9B,0xBB,0xCB,0xBB,0xBA,0xA9,0x9A,0xAA,0xBB,0xAB,0xBB,0xBC,0xCC,0xCB,0xBB,0xAB, + 0xBB,0xBB,0xCD,0xCD,0xCC,0xB9,0x88,0x99,0x99,0x99,0x99,0xA9,0xA9,0xA9,0xA9,0x99, + 0x99,0x99,0xAA,0xBB,0xAB,0xBB,0xAA,0xBB,0xBD,0xDD,0xDD,0xCD,0xDD,0xEE,0xDD,0xCC, + 0xBD,0xCD,0xDE,0xEE,0xFE,0xFE,0xEE,0xED,0xDC,0xCD,0xDD,0xDD,0xDD,0xCB,0xBA,0xAA, + 0xBA,0xAB,0xAA,0x99,0x88,0x88,0x98,0x99,0x9A,0xAB,0xCD,0xCC,0xBB,0xCD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xCB, + 0xBA,0x99,0x8B,0xA9,0xEE,0xFE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD, + 0xDD,0xDD,0xBA,0xA9,0xA9,0xAB,0xBC,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xBB,0xBB, + 0xAB,0xBB,0xBB,0xBB,0xDB,0xDC,0xDC,0xBD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xDC,0xDC,0xDC,0xBC,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA,0xA9,0xAA,0xA9,0x99, + 0x9A,0xAA,0xCE,0xDC,0xAA,0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xDC,0xDB,0xBB,0xBB, + 0xBB,0xBC,0xBC,0xCC,0xCC,0xCB,0x98,0x89,0x89,0x99,0x99,0x99,0x99,0x99,0x99,0x98, + 0x99,0x9A,0xAB,0xAB,0xBB,0xAB,0xAB,0xBB,0xDD,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xDD,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xDD,0xDD,0xED,0xED,0xDC,0xDB,0xBB,0xAB, + 0xAB,0xBA,0xA9,0x98,0x88,0x98,0x89,0x89,0x9A,0xAB,0xBC,0xCC,0xBB,0xBC,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB, + 0xBA,0xA9,0x98,0xD9,0xAE,0xEE,0xFE,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xED, + 0xDD,0xDD,0xDB,0xAA,0x9A,0xAA,0xBD,0xEE,0xEF,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xFE,0xFE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xBB,0xBB,0xCD,0xBD,0xCD,0xDB,0xDB,0xDB,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC, + 0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD, + 0xCD,0xDC,0xDC,0xDB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0x98, + 0x99,0x9A,0xAA,0xBA,0xA9,0x99,0x99,0xAA,0xAB,0xAB,0xBB,0xCD,0xCD,0xCB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xCD,0xCD,0xCD,0xBA,0x99,0x98,0x89,0x89,0x89,0x99,0x99,0x89,0x99, + 0x99,0xAA,0xBB,0xBB,0xAB,0xBA,0xBA,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xFE,0xEF,0xEE,0xED,0xDD,0xCC,0xBB,0xAB, + 0xAB,0xAA,0x99,0x88,0x88,0x88,0x98,0x99,0x99,0xAA,0xBB,0xDB,0xCB,0xBB,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC, + 0xBB,0xAA,0x99,0x9B,0x8C,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xED,0xED,0xDB,0xBA,0x9A,0xAA,0xBD,0xEE,0xFE,0xFE,0xEE,0xED,0xED,0xDD,0xED,0xDE, + 0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xDE,0xDD,0xDD,0xDD,0xCD,0xBD,0xDE,0xDD,0xDC,0xBB, + 0xBB,0xBC,0xCD,0xCD,0xCD,0xCD,0xCC,0xCB,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xBD,0xBD,0xCC,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xCD,0xCC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0x9A,0x9A,0xBA,0x99, + 0x89,0x99,0xAA,0x9A,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xBB,0xBC,0xCD,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xCD,0xCC,0xDC,0xDC,0xB9,0x99,0x99,0x99,0x99,0x98,0x98,0x99,0x99, + 0xA9,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBC,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xFE,0xFE,0xDD,0xDD,0xCC,0xBB,0xBB, + 0xBB,0xBA,0x99,0x89,0x88,0x98,0x89,0x88,0x99,0x9A,0xBB,0xCC,0xCB,0xBB,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD, + 0xBB,0xAA,0x99,0x8B,0xA8,0xDE,0xEF,0xEE,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xBA,0xA9,0xAA,0xBC,0xEE,0xEF,0xEF,0xEE,0xEE,0xDE,0xED,0xDE,0xEE, + 0xEF,0xEE,0xEF,0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xEE,0xDD,0xBB, + 0xBC,0xCD,0xCD,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCD,0xCD, + 0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDB,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xA9, + 0x88,0x99,0x99,0x99,0x99,0x89,0x9A,0xAA,0xAA,0xAB,0xBB,0xCD,0xCD,0xCC,0xBB,0xBB, + 0xBB,0xCB,0xCC,0xDC,0xDD,0xCC,0xDC,0xDB,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0xA9, + 0xBB,0xBB,0xBB,0xAB,0xBA,0xAB,0xAB,0xBD,0xDE,0xEE,0xFE,0xEF,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xFF,0xEE,0xEC,0xCB,0xBB,0xBB,0xBA, + 0xBB,0xAA,0x98,0x88,0x88,0x88,0x88,0x89,0x89,0x9A,0xAB,0xBC,0xCB,0xBB,0xDE,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED, + 0xDC,0xBA,0xA9,0x98,0xC9,0xAE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDB,0xAA,0xAA,0xBD,0xDE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xEE,0xED,0xDD,0xDE,0xDE,0xED,0xDD,0xDC,0xDC,0xDD,0xDE,0xDD,0xDC, + 0xCB,0xDD,0xDD,0xCD,0xDD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDB, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD,0xCD,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xBD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xA9,0xAA,0xAB,0xAA, + 0x89,0x89,0x99,0x99,0x99,0x98,0xAA,0xAA,0xAA,0xAA,0xBB,0xCC,0xCD,0xCB,0xBB,0xBB, + 0xCB,0xBC,0xBC,0xCC,0xDC,0xDD,0xDC,0xDC,0xDC,0xAA,0xA9,0x99,0x99,0x99,0x9A,0xAB, + 0xBC,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE, + 0xEE,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xED,0xDE,0xEE,0xED,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xA9,0x88,0x89,0x88,0x98,0x98,0x99,0x9A,0xAB,0xBC,0xCC,0xBB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED, + 0xDC,0xBB,0xAA,0x99,0x9B,0x8C,0xEE,0xEF,0xED,0xDE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xDD,0xED,0xDD,0xDC,0xAA,0xAA,0xBC,0xDE,0xEF,0xFF,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xEE,0xED,0xDD,0xEE,0xED,0xEE,0xDD,0xDD,0xCD,0xDD,0xDE,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD, + 0xDD,0xDD,0xDE,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xBD,0xBC,0xCB, + 0xCB,0xBC,0xCC,0xCD,0xCD,0xBD,0xBD,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xAA, + 0xAA,0x89,0x99,0x99,0x9A,0x9A,0xAB,0xAA,0xAA,0xAB,0xAB,0xBC,0xDB,0xCB,0xBB,0xCC, + 0xCC,0xCC,0xBC,0xBD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDB,0xCB,0xBD,0xCC,0xCD, + 0xBC,0xBB,0xBB,0xBA,0xBA,0xAB,0xBB,0xCD,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xEE, + 0xED,0xDC,0xDD,0xDE,0xFE,0xFF,0xEF,0xEE,0xEE,0xDC,0xCD,0xDB,0xBB,0xBA,0xBB,0xBB, + 0xAB,0xBB,0xA9,0x98,0x88,0x89,0x88,0x98,0x98,0x99,0xAB,0xBC,0xCB,0xBB,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xDD,0xCB,0xAA,0x99,0x8B,0xA8,0xDE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xBB,0xAA,0xAB,0xDD,0xEE,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xDD,0xDD,0xED,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD, + 0xCD,0xCD,0xCB,0xBC,0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCB,0xCB, + 0xBB,0xBB,0xCB,0xDC,0xCC,0xDC,0xCB,0xCC,0xBB,0xBB,0xBB,0xBB,0xAA,0xAB,0xAB,0xAB, + 0xAA,0xA9,0x99,0xAA,0xAA,0xAB,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xCD,0xCC,0xBB,0xCC, + 0xBC,0xCB,0xCB,0xDB,0xDC,0xDD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDC, + 0xCC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE, + 0xED,0xCB,0xBC,0xDE,0xEE,0xFE,0xFF,0xEF,0xEE,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xAB,0xAA,0x99,0x88,0x98,0x98,0x98,0x99,0x99,0xAA,0xBB,0xCB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE, + 0xED,0xDB,0xBA,0xA9,0x98,0xC9,0xAE,0xEE,0xFE,0xED,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDB,0xAA,0xBB,0xBD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xDC,0xDC,0xDC, + 0xDC,0xBB,0xAB,0xBB,0xBD,0xED,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xBD,0xBC,0xBC,0xBC, + 0xBB,0xBC,0xBC,0xCC,0xDB,0xCD,0xCD,0xBC,0xBC,0xBC,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBC,0xBB,0xAA,0xAB,0xBB,0xCD,0xCC,0xCB,0xBC,0xCC, + 0xDC,0xDB,0xDB,0xCC,0xCD,0xCD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xED,0xED,0xDD,0xCC, + 0xCB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBD,0xDD,0xEE,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xEE, + 0xED,0xBB,0xBC,0xDD,0xEE,0xFF,0xEF,0xFF,0xEF,0xED,0xCB,0xBB,0xBA,0xBA,0xBB,0xBA, + 0xAA,0xAA,0xAA,0xA9,0x98,0x98,0x99,0x99,0x89,0x99,0x9A,0xBB,0xBC,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEE,0xDC,0xBB,0xA9,0x99,0x9B,0x8C,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xBB,0xAA,0xBC,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCC,0xDC,0xDB,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xCD,0xCD,0xCB, + 0xBA,0xAA,0xAA,0xAB,0xBB,0xCE,0xED,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCC,0xCB, + 0xBC,0xBC,0xBC,0xCC,0xCC,0xDC,0xCC,0xDB,0xDC,0xCB,0xBD,0xCB,0xBB,0xBA,0xBB,0xAA, + 0xBB,0xCB,0xCB,0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xBB,0xBC,0xDC,0xCC,0xBB,0xCB,0xCC, + 0xCC,0xCD,0xBD,0xCC,0xCC,0xCC,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBC,0xDE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE, + 0xED,0xDC,0xBB,0xDE,0xEE,0xFE,0xFF,0xEF,0xFE,0xFE,0xDC,0xBB,0xAB,0xBA,0xBA,0xBB, + 0xBA,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x99,0x98,0x99,0xAA,0xBB,0xCB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xEE,0xDD,0xBB,0xBA,0x99,0x8B,0xA8,0xDE,0xEF,0xEE,0xCD,0xDE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xED,0xDE,0xDD,0xDD,0xCB,0xBA,0xBB,0xDD,0xDE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xDD,0xCC,0xDB,0xDC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xCD,0xDD,0xDB,0xBA, + 0xAA,0x99,0xAA,0xAA,0xBB,0xBD,0xEE,0xDD,0xDD,0xDC,0xDD,0xCD,0xCC,0xDB,0xDB,0xBC, + 0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDC,0xCD,0xBD,0xBD,0xDC,0xDD,0xBB,0xBB,0xAA,0xBA, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDC,0xCB,0xBB,0xBC,0xCD,0xBB,0xBB,0xBB,0xBB, + 0xCD,0xCD,0xDB,0xDB,0xBB,0xBC,0xDC,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xCD,0xBC, + 0xCB,0xBB,0xAB,0xAB,0xBB,0xBB,0xDD,0xDE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF, + 0xEE,0xDD,0xCD,0xDD,0xEE,0xEE,0xEF,0xFF,0xEF,0xEE,0xED,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xBA,0xAA,0x9A,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xBB,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xD9,0xAE,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xED,0xDE,0xDD,0xDC,0xBB,0xBB,0xCD,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xED,0xDD,0xDD,0xED,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xCC,0xBB,0xAA, + 0xA9,0xA9,0x99,0xAA,0xAB,0xBB,0xCE,0xED,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xBD,0xCC, + 0xCB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xCD,0xDE,0xDC,0xBB,0xBB,0xAA, + 0xAB,0xAB,0xAB,0xBA,0xBB,0xBC,0xCC,0xCC,0xDB,0xDB,0xDB,0xDC,0xCB,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xDC,0xDB,0xDC,0xCC,0xBC,0xBD,0xDD,0xDC,0xCC,0xCC,0xDD,0xDD,0xDC,0xDC, + 0xBB,0xBB,0xBA,0xBA,0xBB,0xBC,0xCD,0xEE,0xEE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xEF, + 0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xCB,0xBA,0xAA,0xAA,0xAA, + 0xAB,0xAA,0xA9,0xA9,0xAA,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEE,0xED,0xDC,0xBB,0xA9,0x99,0x9B,0x8C,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xED,0xBB,0xBB,0xBC,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFE, + 0xED,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xCB,0xAA,0xA9, + 0x9A,0x9A,0xAA,0x9A,0xAA,0xBB,0xBC,0xED,0xDD,0xDD,0xCD,0xCD,0xCD,0xCC,0xCC,0xCC, + 0xCC,0xBB,0xBA,0xBB,0xBB,0xBD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBB, + 0xBA,0xBA,0xBA,0xAB,0xBA,0xBB,0xBC,0xDC,0xDD,0xCC,0xCC,0xCC,0xBB,0xBB,0xBC,0xDB, + 0xBC,0xDB,0xDD,0xCD,0xBC,0xCC,0xCC,0xDC,0xDD,0xCD,0xBC,0xDD,0xDC,0xDC,0xDC,0xCB, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xCC,0xDD,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xEF,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xFF,0xEF,0xEE,0xDB,0xBA,0xAA,0xA9,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0xA9,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x8B,0xA8,0xEE,0xEE,0xEE,0xCD,0xDE,0xDE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDB,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDD,0xDD,0xED,0xDD,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCD,0xDD,0xDB,0xBA,0xAA,0x99, + 0xAA,0xBB,0xBB,0xAA,0xAB,0xAB,0xBB,0xDE,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xAA,0xAB,0xAB,0xCE,0xDD,0xDC,0xDC,0xDC,0xDB,0xDC,0xCC,0xBB,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBC,0xCD, + 0xCB,0xCC,0xCC,0xCD,0xCD,0xCC,0xCB,0xCB,0xDC,0xDC,0xBB,0xBC,0xDD,0xDC,0xCB,0xBC, + 0xBB,0xBB,0xAB,0xAB,0xBB,0xBD,0xDE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE, + 0xFE,0xFE,0xEE,0xEE,0xDE,0xDD,0xED,0xDE,0xEE,0xEF,0xEE,0xED,0xBA,0xAA,0x9A,0x99, + 0x9A,0xAA,0xAA,0x9A,0xAA,0xA9,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xED,0xCC,0xBA,0xA9,0x98,0xD9,0xAE,0xEE,0xFE,0xED,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xDD,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xCC,0xDD,0xEE,0xDD,0xBC,0xDD,0xDC,0xDC,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCC,0xCA,0xAA,0x99,0x9A, + 0xAB,0xBB,0xCC,0xBA,0xA9,0xAA,0xBB,0xBD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xBC,0xDB, + 0xBB,0xBA,0xAA,0xAA,0xAB,0xAB,0xBB,0xDD,0xDD,0xCD,0xCD,0xCD,0xBC,0xBC,0xCD,0xBC, + 0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDB,0xDC,0xDB,0xCC,0xBB,0xBB,0xBB,0xCC,0xDC, + 0xDB,0xBC,0xCD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCD,0xCB,0xBB,0xBB,0xDC,0xBB,0xBB,0xCB, + 0xCB,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF, + 0xEF,0xEF,0xEE,0xEE,0xED,0xED,0xDE,0xEE,0xEE,0xFF,0xEF,0xED,0xDB,0xAA,0x99,0x9A, + 0x9A,0xAA,0xAA,0xA9,0xAA,0xAA,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDC,0xBB,0xA9,0x99,0x9C,0x8B,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xEE, + 0xFE,0xFE,0xEE,0xED,0xED,0xDD,0xDD,0xCB,0xBA,0xBB,0xBC,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xDD,0xED,0xDC,0xBD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xDD,0xCB,0xAA,0xA9,0x9A,0xAB, + 0xBC,0xBD,0xCC,0xBB,0xAA,0x9A,0xAB,0xBB,0xDD,0xDD,0xCD,0xCD,0xCD,0xCC,0xDC,0xBB, + 0xBB,0xAA,0x9A,0x99,0x99,0xAA,0xAB,0xBD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCC,0xBD, + 0xBD,0xBD,0xBB,0xBB,0xBB,0xBC,0xCC,0xDC,0xDC,0xCD,0xCB,0xBB,0xCC,0xCC,0xCC,0xBD, + 0xCD,0xCC,0xBC,0xBD,0xBD,0xCD,0xDB,0xDC,0xCD,0xCB,0xBA,0xAB,0xBB,0xAB,0xBB,0xBC, + 0xCB,0xBA,0xBA,0xBB,0xCC,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE, + 0xFF,0xFE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xDC,0xAA,0x9A,0x99, + 0xA9,0x9A,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBD,0xEC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0x8B,0xA8,0xEE,0xEE,0xFE,0xCD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDB,0xBB,0xAB,0xBB,0xCC,0xCC,0xCC,0xCB,0xBB, + 0xBB,0xDD,0xED,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xBB,0xAA,0x99,0xAA,0xBB, + 0xCC,0xBC,0xDC,0xDB,0xAA,0x9A,0xAA,0xBB,0xBD,0xDD,0xDD,0xCD,0xCC,0xDC,0xCB,0xBB, + 0xAA,0xA9,0xA9,0x9A,0x9A,0x9A,0xAA,0xBB,0xDD,0xDD,0xCD,0xBD,0xCD,0xBD,0xBD,0xCC, + 0xDC,0xDB,0xCC,0xCC,0xCC,0xDC,0xDD,0xCD,0xBD,0xBC,0xBC,0xBC,0xCD,0xDD,0xCD,0xDD, + 0xDD,0xDB,0xDB,0xCB,0xDC,0xCD,0xCD,0xCD,0xBD,0xCB,0xBA,0xAA,0xBB,0xBB,0xBB,0xBC, + 0xCB,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xFF, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xBA,0xA9,0x99, + 0x99,0xAA,0xAA,0xAA,0xA9,0xAA,0xA9,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xCD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xD9,0x9E,0xEE,0xEE,0xED,0xDD,0xED,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xDD,0xDC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCB,0xBA,0xA9,0x9A,0xAB,0xCC, + 0xCB,0xBB,0xCC,0xCB,0xBA,0xA9,0x9A,0xAB,0xBC,0xED,0xDC,0xDC,0xDC,0xDC,0xBB,0xBA, + 0xAA,0x99,0x9A,0xAB,0xBA,0xA9,0xAA,0xAB,0xBE,0xDD,0xDD,0xDC,0xDB,0xDB,0xDC,0xDD, + 0xCD,0xCD,0xDC,0xDC,0xDD,0xDD,0xCD,0xCD,0xCD,0xCC,0xBB,0xBC,0xBD,0xDD,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xCB,0xDC,0xDC,0xDB,0xDC,0xCB,0xBA,0xAA,0xAA,0xAA,0xBB,0xCC, + 0xCC,0xBB,0xBB,0xBB,0xDD,0xEE,0xEE,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xFF,0xEF,0xEE,0xDB,0xA9,0xA9, + 0x9A,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xCD,0xDC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xEE,0xDC,0xBB,0xA9,0x99,0x9C,0x8B,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xED,0xDE,0xDD,0xED,0xDB,0xBA,0xBA,0xBB,0xBB,0xAB,0xAB,0xBA, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xED,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDB,0xBB,0xAA,0x9A,0xAB,0xBC,0xDC, + 0xCB,0xCC,0xCC,0xCB,0xBB,0xA9,0xAA,0xAA,0xBB,0xDE,0xDD,0xCD,0xCD,0xCB,0xBA,0xAA, + 0x99,0x99,0xAB,0xBC,0xBB,0xBA,0x9A,0xAA,0xBC,0xED,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD, + 0xDD,0xDC,0xDD,0xDD,0xCD,0xCD,0xDD,0xDC,0xDB,0xCC,0xCD,0xCD,0xDC,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xBC,0xDC,0xCD,0xBD,0xBC,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC, + 0xDB,0xBB,0xBB,0xDD,0xDD,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF, + 0xFF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xEE,0xFE,0xFE,0xFE,0xFE,0xED,0xBA,0x99, + 0x99,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xDD,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x8B,0xA8,0xDE,0xEF,0xEE,0xDD,0xDE,0xDE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xAB, + 0xBD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xED,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDB,0xBA,0xA9,0x99,0xAB,0xDD,0xCC, + 0xCB,0xBC,0xCB,0xCB,0xBB,0xAA,0x99,0xAA,0xAB,0xBD,0xCD,0xDD,0xCC,0xCB,0xAA,0xA9, + 0x99,0x99,0xBB,0xCC,0xDC,0xBA,0xAA,0x9A,0xAB,0xCE,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xBC,0xCC,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xCC,0xBB,0xBC,0xCD,0xDE,0xEE,0xFE,0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xED,0xDE,0xEE,0xEE,0xFF,0xFF,0xEF,0xEE,0xCB,0xAA, + 0x9A,0x9A,0x9A,0x9A,0xBA,0xAA,0xAA,0xAA,0xA9,0x9A,0xAB,0xBB,0xBC,0xBB,0xDE,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xED,0xCC,0xBA,0xA9,0x98,0xD9,0xAE,0xEE,0xEE,0xED,0xDD,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xED,0xDD,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xDD,0xCD,0xDD,0xDE,0xED,0xED,0xDD,0xDE,0xDE, + 0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDC,0xBB,0xBA,0x99,0x99,0xBD,0xDD,0xDB, + 0xBB,0xCC,0xCC,0xCC,0xBB,0xAA,0xA9,0x9A,0xAA,0xBB,0xCD,0xCC,0xBB,0xBA,0xAA,0x99, + 0x9A,0xAB,0xBD,0xCD,0xCD,0xBB,0xAA,0xAA,0xAB,0xBC,0xED,0xDD,0xCD,0xCD,0xCD,0xCD, + 0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xCD,0xDD,0xDD,0xCD,0xDD,0xDB, + 0xDC,0xDD,0xCD,0xDD,0xDC,0xDC,0xCC,0xBB,0xCC,0xDB,0xDB,0xCD,0xCC,0xCC,0xDB,0xCC, + 0xCC,0xBB,0xBC,0xDD,0xEE,0xEF,0xEF,0xFF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFF,0xEF, + 0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xDB,0xAA, + 0x99,0xA9,0x99,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBC,0xDE,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xFE,0xEE,0xDC,0xBB,0xAA,0x98,0x9C,0x8A,0xEE,0xEE,0xEE,0xDD,0xED, + 0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBD,0xDD,0xDD,0xEE,0xED,0xEE,0xDD,0xCD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xDB,0xAA,0x99,0x99,0xAD,0xEE,0xDD, + 0xCB,0xCB,0xDC,0xBC,0xBB,0xBA,0xA9,0x99,0xAA,0xAB,0xBC,0xCB,0xBA,0xAA,0x99,0x99, + 0xAA,0xBD,0xCD,0xCD,0xCD,0xCB,0xBA,0x9A,0xAA,0xBB,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xCC,0xDD,0xDD,0xCD,0xDD,0xDC,0xDC,0xCD, + 0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCC,0xCB,0xCC,0xBD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCC, + 0xCB,0xBB,0xBC,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFE,0xEE,0xDB,0xAA, + 0xA9,0xA9,0xA9,0xA9,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC,0xBB,0xBB,0xDD,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0x8A,0xA8,0xDE,0xEE,0xEE,0xED,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xBB,0xBB,0xBB,0xCB,0xBB,0xBC, + 0xCD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDC,0xCB,0xAA,0x98,0x99,0x9B,0xEE,0xDD, + 0xCB,0xBD,0xCD,0xBB,0xBB,0xBA,0xBA,0xA9,0xAA,0xAA,0xBB,0xCB,0xAA,0xA9,0x99,0x9A, + 0xBB,0xDC,0xDD,0xCD,0xBC,0xCC,0xBB,0xA9,0xAA,0xAB,0xBE,0xDD,0xDD,0xCD,0xCD,0xDD, + 0xDD,0xDC,0xDC,0xDB,0xDD,0xDC,0xDC,0xCB,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xCD,0xBD, + 0xCD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDB,0xCB,0xCC,0xCC,0xDC,0xDD,0xCD,0xCD,0xCC,0xCC, + 0xCB,0xBB,0xCD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xEF, + 0xFE,0xFE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEF,0xEE,0xCB,0xAA, + 0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xBA,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCD,0xDC,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xC9,0x9E,0xEE,0xFE,0xED,0xDD, + 0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xCC,0xBB,0xBC,0xCC,0xCD,0xCC, + 0xCD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xDC,0xDC,0xDD,0xDE,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDB,0xBA,0x99,0x88,0x9A,0xBE,0xED, + 0xDC,0xCB,0xDC,0xBB,0xBA,0xBB,0xBB,0xAA,0x99,0xAA,0xBB,0xAB,0xA9,0x99,0x9A,0xAB, + 0xBC,0xDC,0xDC,0xDC,0xDC,0xCC,0xCB,0xBA,0x9A,0xAB,0xBC,0xED,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC, + 0xCC,0xDD,0xED,0xDC,0xDD,0xCD,0xDC,0xDC,0xBD,0xBD,0xCC,0xDC,0xDC,0xDC,0xDC,0xCB, + 0xBB,0xBB,0xBD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xFE,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xEE,0xEC,0xBA,0xAA, + 0xAA,0x9A,0x9A,0x9A,0x9A,0xAA,0xBA,0xAA,0xAB,0xBB,0xBC,0xBC,0xBB,0xBD,0xEA,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x98,0x8C,0x8A,0xEE,0xEE,0xEE,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xED,0xDD,0xDB,0xBC,0xCD,0xCD,0xDC,0xCD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xED,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBA,0x99,0x89,0x99,0xAD,0xEE, + 0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xCB,0xBA,0x99,0x9A,0xAB,0xBA,0xA9,0x99,0xAA,0xBC, + 0xDD,0xDD,0xCC,0xDC,0xDC,0xDC,0xDC,0xBB,0xA9,0xAA,0xBB,0xDD,0xED,0xDC,0xDB,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDB,0xCB, + 0xBC,0xDD,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD,0xBC,0xDB,0xCC,0xCB,0xCB,0xCC,0xCC,0xCB, + 0xBB,0xAB,0xBD,0xDD,0xED,0xDD,0xEE,0xEF,0xFF,0xFE,0xFF,0xFE,0xFE,0xFF,0xEF,0xFE, + 0xFF,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xCB,0xAA,0xA9, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0xAB,0xAA,0xAB,0xBB,0xBC,0xBB,0xBC,0xDD,0xDA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x8A,0xB8,0xDE,0xEE,0xEE,0xED, + 0xDD,0xDE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xDE,0xDE,0xDD,0xCB,0xCC,0xDC,0xDD,0xDC, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDB,0xDD,0xDD,0xED,0xDD,0xDE,0xDD,0xED, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDC,0xCA,0x99,0x88,0x89,0xAA,0xEE, + 0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xAA,0x9A,0xAA,0xAA,0x99,0x9A,0xBC,0xCC, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xDD,0xCB,0xAA,0xAA,0xBB,0xCE,0xDD,0xCD,0xDD,0xCD, + 0xCD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xCB, + 0xBC,0xCC,0xDE,0xED,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCB,0xCB,0xCB,0xBB,0xCB,0xCB, + 0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF, + 0xFE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xDC,0xBA,0xAA,0xAA, + 0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0xAB,0xAA,0xAB,0xBC,0xBB,0xBB,0xBC,0xDE,0xCA,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xCA,0x9E,0xEE,0xFE,0xED, + 0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCB,0xBB,0xCD,0xDC,0xDB, + 0xCC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xDE,0xDD,0xDE,0xDD,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBA,0x99,0x98,0x98,0x99,0xAE, + 0xED,0xBB,0xBB,0xBB,0xBC,0xCC,0xDB,0xCB,0xBA,0x9A,0xAA,0xA9,0x9A,0xAB,0xBC,0xCD, + 0xDD,0xDE,0xDD,0xDC,0xBC,0xDD,0xDD,0xDB,0xB9,0xAA,0xBB,0xBD,0xED,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB, + 0xBC,0xCD,0xDD,0xEE,0xDD,0xDD,0xDD,0xCD,0xBC,0xDB,0xCB,0xCB,0xCC,0xCB,0xCC,0xBB, + 0xBB,0xAB,0xBD,0xDD,0xCC,0xBC,0xCD,0xEE,0xFE,0xFF,0xFE,0xFF,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xFF,0xFE,0xEE,0xEF,0xEE,0xEE,0xDE,0xEE,0xEF,0xEE,0xED,0xCB,0xBA,0xAA,0x9A, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xAA,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDC,0xBB,0xA9,0x99,0x8C,0x8A,0xEE,0xEE,0xEE, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xED,0xED,0xED,0xED,0xDB,0xBB,0xBB,0xCD,0xCC, + 0xBB,0xDD,0xDD,0xDD,0xDD,0xCC,0xDC,0xDD,0xDC,0xDD,0xDE,0xDE,0xDD,0xED,0xED,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xA9,0x98,0x98,0x99,0xAA, + 0xDD,0xDB,0xBB,0xBB,0xBD,0xBD,0xBD,0xCC,0xBB,0xAA,0xA9,0xA9,0xAB,0xBB,0xDD,0xDD, + 0xCD,0xED,0xEE,0xDD,0xDC,0xCD,0xDD,0xCC,0xAA,0xAA,0xAB,0xBC,0xED,0xDD,0xCD,0xCD, + 0xCD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xCC,0xBB, + 0xBB,0xCC,0xCD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xCC,0xCC,0xBC,0xCC,0xCC,0xCB,0xBB, + 0xAB,0xBB,0xBC,0xDD,0xDB,0xBB,0xBD,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xBA,0xAA,0xA9,0xA9, + 0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBD,0xDB,0xAB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xBA,0x99,0x89,0xB8,0xCE,0xEE,0xFE, + 0xED,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xBA,0xBB,0xBC,0xDB, + 0xBD,0xDD,0xED,0xDD,0xDD,0xDC,0xCD,0xCD,0xDC,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xCD,0xDC,0xDD,0xDE,0xDE,0xDD,0xDC,0xAA,0x99,0x88,0x89,0x9A, + 0xAC,0xDD,0xCB,0xBC,0xCC,0xDC,0xDC,0xDC,0xDB,0xBB,0xAA,0x9A,0xBB,0xCD,0xDC,0xDD, + 0xDB,0xDD,0xDE,0xDD,0xBC,0xDD,0xCD,0xBB,0xA9,0xAA,0xBB,0xBC,0xDD,0xDC,0xDD,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xCD,0xBD,0xBD,0xBC,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xDD,0xEE,0xED,0xBB,0xBD,0xDE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xEF,0xEF,0xEE,0xDE,0xDE,0xEE,0xDE,0xED,0xCB,0xAA,0xA9,0x99,0x99, + 0xA9,0xAA,0xAA,0xAA,0xBB,0xAB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xDD,0xD9,0xAB,0xBD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBA,0xA9,0x98,0xBA,0x9E,0xEE,0xEE, + 0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDD,0xED,0xBB,0xAA,0xBB,0xBD, + 0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xCA,0xA9,0x98,0x98,0x99, + 0xAB,0xEE,0xDD,0xCC,0xCB,0xCC,0xDC,0xCD,0xCD,0xCC,0xBB,0xBB,0xBD,0xDC,0xDD,0xDC, + 0xDD,0xCD,0xED,0xDC,0xCB,0xCD,0xCC,0xBA,0x99,0x9B,0xBB,0xBC,0xCD,0xCD,0xDB,0xDD, + 0xCD,0xCD,0xDB,0xDD,0xCD,0xCD,0xDC,0xDD,0xED,0xDD,0xDD,0xCD,0xCD,0xCC,0xCC,0xBB, + 0xBB,0xBC,0xBD,0xCD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB, + 0xBB,0xCC,0xDE,0xEE,0xEE,0xCB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFE,0xFF,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0xA9,0xA9,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xCB,0xDC,0xDC,0xDC,0xCB,0xBB,0xBC,0xDE,0xBA,0xAB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDC,0xBB,0xAA,0x99,0x8C,0x9A,0xEE,0xEF, + 0xEE,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDB,0xBA,0xAB,0xDD, + 0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xED,0xDB,0xA9,0x99,0x88,0x99, + 0x9A,0xDE,0xDD,0xCB,0xBD,0xBD,0xBD,0xCC,0xDC,0xDC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD, + 0xDC,0xCB,0xCD,0xDC,0xBC,0xDD,0xDB,0xA9,0x88,0x8A,0xDC,0xBB,0xCD,0xDC,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDB,0xDB,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDC,0xCB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xCD,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xEE,0xED,0xED,0xDE,0xDE,0xEE,0xEE,0xEF, + 0xEF,0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xCC,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xCC,0xBB,0xBC,0xCD,0xDC,0x9A,0xAB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x99,0xC8,0xCE,0xEE, + 0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xED,0xED,0xDD,0xDE,0xDD,0xBA,0xAB,0xDD, + 0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xDD,0xB9,0x99,0x98,0x88, + 0x99,0xBD,0xDD,0xCD,0xCC,0xDC,0xDC,0xCD,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDC,0xBC,0xDD,0xCD,0xCD,0xB9,0x99,0x98,0x9A,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xBD,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xDB,0xDB,0xDB,0xCD,0xCD,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBD,0xDE,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xED,0xEE,0xFE, + 0xFF,0xEF,0xFE,0xEE,0xEE,0xED,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xBB,0xBB,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBC,0xBB,0xDD,0xD9,0xAA,0xBB,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xBA,0x9D,0xEE, + 0xEE,0xEE,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDA,0xAB,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xED,0xED,0xDB,0xA9,0x99,0x89, + 0x99,0xAC,0xED,0xDC,0xCC,0xCD,0xBD,0xCC,0xBB,0xBC,0xBB,0xCD,0xDD,0xDD,0xCD,0xDD, + 0xCD,0xBC,0xBB,0xBC,0xCC,0xCB,0x99,0x98,0x89,0x9B,0xBD,0xCC,0xCC,0xDC,0xDC,0xDC, + 0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDB,0xCC,0xCC,0xCB,0xBB,0xBB,0xBC, + 0xBB,0xBC,0xBC,0xCC,0xCD,0xBD,0xBC,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD, + 0xDE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xFE,0xFE,0xEE,0xDE,0xDC,0xBB,0xBB,0xBB,0xBB,0xBC,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDB,0xDB,0xCC,0xCD,0xDE,0xAA,0x9A,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD,0xBB,0xAA,0x99,0x8D,0x99,0xEE, + 0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDE,0xDC,0xBC,0xDD, + 0xED,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE, + 0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xDC,0xBA,0x99,0x89, + 0x89,0x9A,0xBD,0xDD,0xDC,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xDC,0xDC,0xDD,0xCD, + 0xDC,0xDC,0xCB,0xCC,0xCB,0xA9,0x98,0x98,0x89,0x9A,0xBB,0xDB,0xDC,0xBD,0xCB,0xDC, + 0xDC,0xDD,0xBD,0xCD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xCB,0xDC,0xCB,0xBB,0xBC, + 0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xBD,0xCD,0xCD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD, + 0xEE,0xEF,0xEF,0xEE,0xFF,0xEF,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xED,0xED,0xEE, + 0xEE,0xEE,0xED,0xDB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDE,0xDE,0xDE,0xDD,0xDC,0xDD,0xCD,0xCC,0xCB,0xCD,0xEC,0x99,0xAB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0x99,0x89,0xC8,0xBE, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xDE,0xDE,0xDD,0xBA,0x99,0x98, + 0x89,0x99,0xAC,0xDD,0xDC,0xCC,0xCC,0xBB,0xAB,0xAB,0xBB,0xBC,0xDC,0xDD,0xCD,0xDD, + 0xDD,0xCD,0xCD,0xCC,0xAA,0x98,0x98,0x88,0x99,0xAA,0xBB,0xCD,0xCD,0xDC,0xDC,0xDD, + 0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDC,0xCC,0xCD,0xCD,0xBC,0xCD,0xBC, + 0xBC,0xBB,0xBC,0xBC,0xBC,0xBC,0xCC,0xCC,0xDB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDE, + 0xEE,0xFE,0xFE,0xFE,0xEE,0xFE,0xEE,0xED,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xED,0xDD, + 0xEE,0xEE,0xDB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDC,0xDC,0xDB,0xCD,0xDD,0xD8,0x9A,0xAB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBA,0xA9,0x99,0x9B,0x9D, + 0xEE,0xEF,0xEE,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xED,0xED,0xDB,0xA9,0x98, + 0x98,0x89,0xAB,0xDD,0xDB,0xDC,0xBB,0xBA,0xAB,0xBB,0xBB,0xCC,0xBD,0xCD,0xCD,0xCD, + 0xDC,0xDD,0xDD,0xBB,0x99,0x99,0x88,0x89,0x99,0xAA,0xBB,0xCC,0xCD,0xCD,0xBD,0xCD, + 0xCD,0xDC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDC,0xCB,0xDC,0xDC,0xCC,0xDD, + 0xDD,0xCD,0xCB,0xCC,0xCB,0xCB,0xCB,0xDC,0xDC,0xBB,0xAB,0xBB,0xBB,0xCC,0xDE,0xEE, + 0xEF,0xEF,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xCC,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE, + 0xDE,0xDE,0xEE,0xED,0xDD,0xDC,0xDD,0xCC,0xCC,0xCD,0xDE,0x99,0x9A,0xAB,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDC,0xBB,0xAA,0x99,0x8C,0xA9, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE,0xEE,0xEF,0xEF,0xEE, + 0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED,0xEE,0xED,0xDD,0xB9,0x99, + 0x88,0x99,0x9A,0xDD,0xDD,0xCC,0xBA,0xAB,0xBA,0xBB,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC, + 0xDD,0xCD,0xDD,0xA9,0x99,0x88,0x89,0x99,0x99,0xAB,0xBD,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEE, + 0xFE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xBD,0xCD,0xCD,0xDD,0xEA,0x99,0xAA,0xBB,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x88,0xD9, + 0xBE,0xEE,0xFE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xEE,0xEE,0xDE,0xDD,0xCB,0x99, + 0x99,0x88,0x99,0xAD,0xCD,0xCB,0xBB,0xAA,0xAB,0xBB,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC, + 0xCD,0xDC,0xCB,0x99,0x89,0x88,0x99,0x99,0xAA,0xAB,0xDD,0xDD,0xDD,0xDC,0xDB,0xDC, + 0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xDD,0xDD,0xCD,0xCB,0xBB,0xBC,0xBD,0xCB,0xBB,0xBB,0xCB,0xBD,0xDE,0xEE,0xFE, + 0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xCC,0xDC,0xCC,0xCD,0xDE,0xC8,0x99,0xAA,0xBC,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0x9B, + 0x8D,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDD,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xDE,0xED,0xEE,0xDD,0xDB,0xB9, + 0x99,0x88,0x99,0xAA,0xCC,0xCB,0xBA,0xAA,0xBB,0xBC,0xDD,0xDD,0xCC,0xCC,0xDC,0xDD, + 0xDC,0xCC,0xA9,0x99,0x88,0x99,0x99,0x9A,0xAA,0xCD,0xDD,0xDD,0xDD,0xDC,0xCD,0xCD, + 0xCD,0xCD,0xCD,0xBD,0xBC,0xDC,0xDC,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xEE, + 0xDE,0xDD,0xDD,0xDC,0xCB,0xBB,0xCC,0xDC,0xCB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xFF,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xDD,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xEE,0xEE, + 0xDE,0xED,0xDD,0xDD,0xCC,0xDC,0xCD,0xBD,0xCD,0xEE,0x99,0x9A,0xAB,0xBD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x8B, + 0xA9,0xEE,0xEF,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xED,0xED,0xDD,0xBA, + 0x99,0x89,0x89,0xAB,0xBC,0xBB,0xAA,0xAB,0xAB,0xBC,0xDD,0xDC,0xDC,0xBB,0xBC,0xDC, + 0xCD,0xBA,0x99,0x88,0x89,0x99,0x99,0xAA,0xBD,0xDD,0xDE,0xDD,0xDD,0xCD,0xDC,0xDC, + 0xDC,0xDC,0xDB,0xDB,0xDC,0xCC,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xDD,0xDD,0xCD,0xCC,0xCB,0xBC,0xCC,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xEE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED, + 0xED,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xCD,0xCD,0xCC,0xCB,0xBC,0xDD,0xEE,0x89,0x9A,0xBB,0xCD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xCB,0xBA,0xA9,0x98, + 0xC9,0xBE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xED, + 0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDC,0xDD,0xDD,0xEE,0xFE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xDD,0xBB, + 0x98,0x88,0x99,0xAB,0xBC,0xBB,0xAA,0xAA,0xAB,0xBD,0xDD,0xDC,0xCB,0xBB,0xBD,0xCD, + 0xBB,0xA9,0x89,0x89,0x89,0x9A,0x9A,0xAB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCD,0xBD, + 0xDC,0xDD,0xCD,0xBC,0xBC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xEE, + 0xDD,0xDD,0xDC,0xDC,0xDB,0xBB,0xCD,0xBC,0xBB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xED, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDC,0xDC,0xCB,0xCB,0xBB,0xCB,0xDD,0xDD,0xEC,0x89,0xAA,0xBC,0xDD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBA,0xA9,0x98, + 0x9C,0x9C,0xEE,0xFE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD, + 0xED,0xDD,0xDD,0xED,0xEE,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xDE,0xEE,0xDD,0xDD,0xCB, + 0xA9,0x98,0x99,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xBC,0xDC,0xBB,0xBB,0xBB,0xBC,0xCB, + 0xBA,0x99,0x98,0x88,0x99,0x99,0xAA,0xBD,0xDD,0xED,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC, + 0xCD,0xCD,0xCD,0xCD,0xCC,0xBB,0xDC,0xCD,0xDD,0xDD,0xDC,0xDB,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xCC,0xCB,0xBB,0xCD,0xEE,0xEF,0xEE,0xEF,0xEF, + 0xEF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xDD, + 0xED,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xD9,0x99,0xAB,0xBC,0xDD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0x99, + 0x8A,0xB9,0xDE,0xEE,0xFE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xCC, + 0xA9,0x89,0x9A,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xAB,0xBC,0xDB, + 0xAA,0x98,0x88,0x99,0x99,0x99,0xAC,0xDD,0xDE,0xDD,0xED,0xDD,0xDC,0xDD,0xCC,0xCD, + 0xBD,0xCD,0xDD,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xBC,0xCC,0xDB,0xDB,0xCB,0xBB,0xCD,0xEE,0xEF,0xEE,0xEE,0xFE,0xEF, + 0xEF,0xEF,0xEF,0xFF,0xEE,0xEE,0xDD,0xEE,0xED,0xED,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xCB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xCC,0xCD,0xB8,0x9A,0xAB,0xCD,0xDE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9, + 0x88,0xBA,0xAE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xED,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xCB, + 0xA9,0x99,0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xAB,0xBC,0xBB, + 0xA9,0x98,0x89,0x89,0x9A,0xAB,0xDD,0xED,0xED,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xCB, + 0xDC,0xDD,0xCD,0xDD,0xCC,0xBB,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xDC,0xDB,0xDC,0xCD,0xCC,0xCB,0xBC,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xED,0xDE,0xED,0xED,0xED,0xED,0xED,0xEE,0xDE,0xDE, + 0xDD,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xED,0xDD,0xDD,0xDC,0xDC,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBD,0xCD,0xDD,0xDC,0xBB,0xCD,0x89,0xAA,0xBB,0xDD,0xEE,0xFE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xA9, + 0x99,0x8D,0x9B,0xEE,0xEE,0xFE,0xEE,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDE,0xDD,0xDC,0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xED,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCC,0xCB, + 0x99,0x9A,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xCD,0xBB, + 0xA9,0x98,0x98,0x99,0xAA,0xBD,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDD,0xCC,0xDB, + 0xDC,0xDC,0xDC,0xCC,0xCB,0xBB,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xCB,0xCC,0xDB,0xCC,0xDB,0xDB,0xCC,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFF, + 0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xDE,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDD, + 0xDE,0xDD,0xDE,0xDD,0xED,0xED,0xED,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD,0xBB,0xBB,0xCC, + 0xDC,0xDC,0xDD,0xDC,0xDD,0xDC,0xCB,0xAC,0xD8,0x99,0xAB,0xBC,0xDD,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xAA, + 0x98,0x99,0xC9,0xDE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED, + 0xED,0xED,0xDC,0xCC,0xCB,0xDD,0xDD,0xED,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xCC,0xBB,0xBA, + 0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xCB, + 0xA9,0x99,0x89,0x9A,0xAB,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xBD,0xCD,0xDD,0xDD,0xCC,0xDB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xED,0xDC,0xDD,0xDE,0xDE,0xDD,0xED,0xED,0xED,0xEE,0xED,0xED,0xED,0xED, + 0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDC,0xCC,0xCB,0xCC,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xCB,0xCD,0x99,0x9A,0xAB,0xBD,0xDE,0xEF,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA, + 0xA9,0x98,0xAA,0x9E,0xEE,0xFE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED, + 0xED,0xED,0xDD,0xBB,0xCD,0xDD,0xDD,0xDE,0xDE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEC,0xCB,0xBA,0x99, + 0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCC,0xBC, + 0xBA,0x99,0x99,0x9A,0xCD,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xDC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xED,0xDB,0xCD,0xDD,0xDE,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xEE,0xED,0xDE, + 0xDD,0xED,0xEE,0xDE,0xED,0xED,0xDD,0xDD,0xDC,0xCC,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xBC,0xD9,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDC,0xBB, + 0xAA,0x98,0x8C,0x9B,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xDD,0xDC,0xBB,0xDD,0xDE,0xDD,0xDD,0xDE,0xDE,0xDE,0xED,0xEE,0xEE,0xFE, + 0xEE,0xDE,0xDE,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xCB,0xAB,0x99,0x99, + 0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xBD,0xCC, + 0xBA,0xA9,0x99,0x9B,0xBD,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD, + 0xED,0xED,0xDD,0xDD,0xDC,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xED, + 0xED,0xCC,0xBD,0xDD,0xDD,0xED,0xDE,0xDD,0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xDE,0xED, + 0xED,0xEE,0xED,0xEE,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0x99,0x99,0xAB,0xBB,0xDD,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB, + 0xBA,0x99,0x88,0xD9,0xBE,0xEE,0xFE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xED,0xED,0xED,0xDC,0xBD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDB,0xBA,0xA9,0x99,0x9A, + 0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xCC, + 0xBB,0xAA,0x99,0xAB,0xBD,0xDD,0xED,0xEE,0xDE,0xDD,0xED,0xDD,0xDC,0xDC,0xDB,0xDB, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED, + 0xBC,0xCD,0xDD,0xDE,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xDE,0xDD,0xD8,0x89,0x9A,0xAB,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC, + 0xBA,0xA9,0x99,0xAB,0x9D,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xDD,0xDC,0xDD,0xDE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xED,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xBB,0xAA,0x99,0x9A,0xAA, + 0xAA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBC,0xBC,0xBC,0xCC, + 0xCB,0xAA,0x99,0xAB,0xCC,0xDE,0xDE,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDC,0xDD,0xCD, + 0xCC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xDD,0xCB, + 0xCC,0xDE,0xDD,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC, + 0xDC,0xDC,0xDD,0xDD,0xDE,0xED,0x88,0x99,0xAA,0xBB,0xCD,0xEE,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDC, + 0xBB,0xAA,0x98,0x8B,0xAA,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xFE,0xFE,0xEE,0xDB,0xBA,0x9A,0x9A,0xAA,0xAA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xBB,0xCC,0xCB,0xCC,0xBC, + 0xBB,0xBA,0xA9,0xAB,0xCC,0xCD,0xEE,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xCC,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xBD, + 0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xDD,0xDD,0xDD,0xEE,0xDE,0xB8,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD, + 0xCB,0xBA,0xA9,0x88,0xD9,0xBE,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xDE,0xDD,0xCD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEC,0xBA,0xAA,0x99,0xAA,0xAB,0xAA, + 0xAA,0xBB,0xBB,0xBA,0xBB,0xBC,0xBB,0xBC,0xBB,0xBC,0xCC,0xCC,0xCB,0xCC,0xBB,0xCB, + 0xBB,0xAB,0xAA,0x9A,0xCB,0xBB,0xDE,0xEE,0xED,0xED,0xDE,0xDE,0xDD,0xDC,0xDD,0xCB, + 0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xCC,0xDD, + 0xDD,0xED,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDE,0xDE,0xEA,0x88,0x99,0x9A,0xAB,0xBD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED, + 0xDB,0xBA,0xA9,0x98,0x8C,0x9D,0xEE,0xEF,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xCB,0xBA,0xA9,0xAA,0xBB,0xBB,0xAA, + 0xAB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBC,0xBC,0xCD,0xCC,0xCC,0xCC,0xCB,0xBB,0xBC,0xBB, + 0xBB,0xBB,0xAA,0xA9,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xCC,0xDC, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xCD,0xBC,0xDD,0xDE, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xEB,0x88,0x88,0x99,0xAB,0xBC,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xDD,0xBB,0xAA,0x99,0x99,0xB9,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xED,0xDD,0xCD,0xDD,0xEE,0xFE,0xFE,0xEE,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEC,0xBA,0xA9,0x9A,0xAB,0xBB,0xBA,0xBA, + 0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xCC,0xCC,0xBC,0xBB,0xBB, + 0xBA,0xBA,0xBA,0xA9,0x9A,0xBB,0xBC,0xDD,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xCB, + 0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xEE,0xEE, + 0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xDC,0xBB,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xED,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0x88,0x88,0x99,0xAA,0xAB,0xBC,0xDE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE, + 0xED,0xCB,0xBA,0x99,0x98,0xBA,0xAE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xED,0xDB,0xAA,0x9A,0xAA,0xBB,0xBB,0xBB,0xBA, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBA,0xBC,0xCD,0xDD,0xDC,0xBC,0xCB,0xBB,0xBB, + 0xAB,0xAB,0xBA,0xBA,0xA9,0xAA,0xBB,0xDE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xCD,0xBC,0xDD,0xDD,0xDD,0xED, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xCC,0xDA,0x88,0x88,0x89,0x99,0xAA,0xBC,0xDD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xED,0xDC,0xBB,0xA9,0x98,0x8D,0x9B,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xDC,0xDD,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xCB,0xAA,0x9A,0xAB,0xBD,0xCC,0xBB,0xBB, + 0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xAA,0xA9,0xAA,0xCE,0xDD,0xCC,0xCB,0xBB,0xAB, + 0xAB,0xBA,0xBA,0xBA,0xA9,0x9A,0xBB,0xCC,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDB, + 0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDC,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDD,0xED,0xED,0xDD,0xED,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xCC, + 0xA8,0x88,0x88,0x88,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xEE,0xDD,0xBB,0xAA,0x99,0x89,0xC9,0xDE,0xEE,0xFE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xBB,0xA9,0x99,0xAB,0xBC,0xCC,0xBB,0xBB, + 0xBB,0xAB,0xAB,0xAB,0xAB,0xBA,0xAA,0x99,0x99,0x99,0xAB,0xDC,0xDB,0xBB,0xBA,0xBB, + 0xBB,0xAB,0xBB,0xAB,0xAA,0xA9,0xAB,0xBC,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xCD, + 0xCD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCC,0xCB,0xCD,0xDD,0xED,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED, + 0xED,0xDE,0xDE,0xDD,0xED,0xDD,0xED,0xED,0xDD,0xDD,0xDC,0xCB,0xCB,0xBB,0xA8,0x87, + 0x87,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEE,0xDD,0xDB,0xBA,0xA9,0x89,0x9B,0xAE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xDE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xDD,0xCB,0xA9,0x99,0xAB,0xCC,0xCB,0xBB,0xBB, + 0xBA,0xBA,0xBA,0xAA,0xBB,0xBB,0xA9,0x99,0x98,0x99,0x99,0xAD,0xCC,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xBA,0xBA,0xBB,0xAA,0x9B,0xBB,0xCD,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD, + 0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xCC,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE, + 0xDD,0xED,0xDD,0xED,0xDE,0xDE,0xDD,0xDD,0xDC,0xDC,0xCB,0xCA,0x88,0x78,0x78,0x78, + 0x88,0x88,0x89,0x99,0xAA,0xBB,0xBD,0xDD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x8B,0xAB,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xA8,0x99,0x9A,0xDC,0xCB,0xBB,0xBB, + 0xAB,0xBA,0xAA,0xAA,0xAA,0xA9,0x99,0x98,0x88,0x89,0x89,0x9A,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xBA,0xAA,0xAA,0xAB,0xBC,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDD, + 0xCD,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xCB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xED,0xEE,0xDE,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDB,0xB9,0x87,0x87,0x87,0x87,0x88,0x88, + 0x88,0x89,0x99,0xAA,0xAB,0xBC,0xDD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xDD,0xCB,0xAA,0x99,0x88,0xD9,0xBE,0xEE,0xEE,0xFE,0xEE,0xDE,0xDE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCA,0x99,0x89,0x9A,0xBD,0xCD,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBB,0xAA,0x99,0x99,0x89,0x89,0x98,0x89,0x9A,0xAC,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xA9,0xAB,0xBC,0xCE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDC,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEE,0xDE,0xED,0xEE,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDB,0xA9,0x87,0x87,0x78,0x78,0x78,0x88,0x88,0x88, + 0x99,0x99,0x9A,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0x9C,0x9D,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xBB,0x99,0x89,0x99,0xAC,0xDC,0xCB,0xBB, + 0xBB,0xBB,0xAB,0xAA,0xA9,0x98,0x98,0x89,0x89,0x88,0x98,0x99,0x9B,0xCB,0xBB,0xBB, + 0xCC,0xBB,0xBA,0xAB,0xBB,0xBB,0xAA,0x9A,0xBB,0xDD,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC, + 0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCD,0xCD,0xCD,0xCD,0xDE,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xCB,0xBB,0xBB,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xDE,0xEE,0xDE,0xED,0xEE,0xDE,0xED,0xED, + 0xED,0xED,0xDD,0xDD,0xDD,0xA9,0x88,0x78,0x78,0x78,0x87,0x88,0x88,0x88,0x89,0x99, + 0x99,0xAA,0xAB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x8A,0xB9,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE, + 0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xED,0xCB,0xA9,0x98,0x99,0x9A,0xCC,0xCD,0xCC, + 0xBB,0xBB,0xBB,0xA9,0x99,0x89,0x89,0x99,0x99,0x99,0x89,0x89,0x99,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xBC,0xCC,0xEE,0xEE,0xED,0xDD,0xCD,0xCD, + 0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCC,0xDC,0xDC,0xDC,0xBD,0xDE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xEE,0xDE,0xED,0xEE,0xDE,0xED,0xEE,0xED, + 0xED,0xDD,0xDD,0xB9,0x88,0x78,0x77,0x87,0x88,0x88,0x88,0x88,0x88,0x99,0x99,0x99, + 0xAA,0xAB,0xBB,0xBC,0xDD,0xDE,0xEF,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xBA,0xBE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDB,0xA9,0x98,0x89,0x9A,0xAB,0xCC,0xCC, + 0xCC,0xBB,0xAA,0x99,0x98,0x98,0x99,0x99,0x99,0x99,0x98,0x89,0x99,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xCC,0xCC,0xDE,0xEE,0xDE,0xDD,0xDD,0xDC, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDB,0xDB,0xDC,0xDB,0xCD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xDD,0xDC,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xDE,0xED,0xDD, + 0xDD,0xDB,0x88,0x78,0x78,0x78,0x88,0x88,0x88,0x88,0x89,0x99,0x99,0x99,0xAA,0xAA, + 0xAB,0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xED,0xDC,0xBA,0xA9,0x98,0x8D,0x9C,0xEE,0xEE,0xFE,0xEE,0xED,0xEE, + 0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xDD,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xDD,0xBA,0x99,0x88,0x99,0xAB,0xDD,0xDD, + 0xCB,0xBA,0xA9,0x98,0x98,0x99,0x99,0x99,0x9A,0xA9,0x99,0x89,0x89,0x9A,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBA,0x9A,0xAD,0xDB,0xDD,0xEE,0xED,0xDD,0xCD,0xCD, + 0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xBD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xCB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xED,0xDD, + 0xB9,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xBB, + 0xBB,0xBC,0xDD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0x89,0xD9,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xCB,0xA9,0x98,0x99,0x9A,0xBD,0xDD, + 0xCB,0xA9,0x99,0x89,0x89,0x99,0x99,0xA9,0xBD,0xDA,0x99,0x98,0x99,0x99,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCB,0xCB,0xAA,0x99,0xAB,0xCD,0xDD,0xED,0xED,0xDC,0xDC,0xDD, + 0xCD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xEE,0xEE,0xEE,0xED, + 0xDD,0xCC,0xBB,0xBB,0xCD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xDB,0x98, + 0x78,0x78,0x78,0x88,0x88,0x88,0x89,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x89,0x9B,0xAE,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xDE,0xED,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDC,0xA9,0x99,0x89,0x99,0xAB,0xED, + 0xBA,0xA9,0x99,0x88,0x99,0x99,0xA9,0xAB,0xDE,0xED,0xA9,0x99,0x98,0x99,0x9A,0xCC, + 0xCB,0xCB,0xBB,0xBC,0xCC,0xBA,0xA9,0x99,0xAB,0xBD,0xCD,0xDE,0xDD,0xDD,0xCD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xDE,0xED,0xB8,0x87,0x87, + 0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC,0xCD, + 0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xFE,0xED,0xDC,0xBB,0xAA,0x99,0x8B,0xAB,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEC,0xBA,0x99,0x88,0x99,0x9A,0xBC, + 0xBA,0x99,0x98,0x99,0x99,0xAA,0xAA,0xCD,0xEE,0xED,0xDA,0xA9,0x99,0x89,0x99,0xBB, + 0xCC,0xCB,0xCB,0xCC,0xBB,0xBA,0x99,0x99,0xAA,0xBC,0xDD,0xDE,0xDD,0xCD,0xCD,0xDC, + 0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xEE,0xEE,0xEE,0xED,0xDC, + 0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0x88,0x78,0x78,0x78, + 0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBB,0xAA,0x99,0x88,0xCA,0xCE,0xEE,0xFE,0xEE,0xEE, + 0xDE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xCB,0xA9,0x99,0x89,0x99,0xA9, + 0xA9,0x99,0x88,0x99,0x99,0xAA,0xBD,0xDE,0xEE,0xEE,0xDB,0xA9,0x98,0x98,0x99,0xAB, + 0xCC,0xCC,0xCC,0xCB,0xBA,0xA9,0x98,0x99,0xAB,0xBB,0xDD,0xED,0xDD,0xDC,0xDC,0xDC, + 0xDD,0xBD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xCB, + 0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDA,0x88,0x78,0x78,0x88,0x88, + 0x88,0x89,0x99,0x9A,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0x8D,0x9E,0xEE,0xEE,0xFE,0xEE, + 0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xED,0xDE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xDC,0xBA,0x99,0x98,0x99,0x99, + 0x99,0x98,0x99,0x99,0xAA,0xAB,0xDD,0xEE,0xEE,0xED,0xDD,0xBA,0x99,0x88,0x89,0x9A, + 0xDD,0xCC,0xCC,0xBB,0xAA,0x99,0x98,0x99,0xAB,0xBC,0xDD,0xED,0xDC,0xDC,0xDC,0xDD, + 0xCD,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xDD,0xDB,0xBB, + 0xBB,0xBC,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xB8,0x87,0x87,0x88,0x88,0x88,0x89, + 0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x89,0xBA,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xDE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xED,0xDD,0xDE,0xEF,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xED,0xCA,0xA9,0x99,0x99,0x99, + 0x99,0x89,0x99,0x9A,0xAB,0xBD,0xDE,0xEE,0xEE,0xEE,0xED,0xDB,0xA9,0x98,0x98,0x9A, + 0xBD,0xDD,0xCB,0xBB,0xA9,0x98,0x88,0x9A,0xAB,0xBC,0xDE,0xDD,0xDD,0xCD,0xDD,0xDC, + 0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDD,0xEE,0xEF,0xEE,0xED,0xDD,0xCB,0xBB, + 0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEC,0x98,0x87,0x87,0x88,0x88,0x88,0x89,0x99, + 0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xCB,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xBA,0xBE,0xEE,0xFE,0xEF, + 0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xED,0xDD,0xCD,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDB,0xBA,0x99,0x99,0x99, + 0x99,0x99,0x9A,0xAA,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xBA,0x99,0x88,0x99, + 0x9A,0xDD,0xCB,0xA9,0x99,0x89,0x89,0x9A,0xBB,0xDD,0xDE,0xDD,0xCD,0xDC,0xDC,0xDD, + 0xCD,0xDC,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xEF,0xEE,0xEE,0xED,0xCB,0xBB,0xBB, + 0xCD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEA,0x88,0x78,0x78,0x88,0x88,0x89,0x99,0x99,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xBA,0xA9,0x98,0x8C,0xAC,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDF,0xFE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xEE,0xED,0xBB,0xA9,0x99,0x99, + 0x99,0x99,0xAA,0xBB,0xCD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xBA,0x99,0x89,0x89, + 0x9A,0xBD,0xBA,0x99,0x89,0x88,0x99,0xAB,0xBC,0xDD,0xED,0xDD,0xDC,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xDD,0xCB,0xBB,0xBD, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDA,0x87,0x87,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA, + 0xBB,0xBB,0xBB,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0x88,0xCA,0xDE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xDC,0xDE,0xEE, + 0xFE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDB,0xAA,0xAA,0x99, + 0x99,0x9A,0xAB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xA9,0x98,0x98, + 0x99,0x99,0x99,0x98,0x98,0x99,0x9A,0xAB,0xDD,0xDE,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEF,0xEE,0xFE,0xDB,0xBB,0xBC,0xDD, + 0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xC9,0x87,0x87,0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xAB,0xBB, + 0xBC,0xCD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x98,0x9C,0xAE,0xEF,0xEE, + 0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDC,0xDD,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xBA,0xAA,0xAA, + 0xAA,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xBA,0x99,0x89, + 0x89,0x99,0x99,0x89,0x89,0x99,0xAB,0xBC,0xDD,0xEE,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xDD,0xBB,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xC8,0x87,0x78,0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xED,0xDC,0xBB,0xA9,0x99,0x89,0xBA,0xEE,0xEF, + 0xEE,0xFE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xEE, + 0xEF,0xEF,0xEE,0xFE,0xEE,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEC,0xBB,0xBA, + 0xAB,0xBB,0xCD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDB,0xA9,0x98, + 0x99,0x99,0x89,0x89,0x99,0xAA,0xBB,0xDD,0xDE,0xED,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xB8,0x87,0x88,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xCD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xCB,0xBA,0x99,0x88,0xBA,0xCE,0xEE, + 0xFE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDC,0xBB, + 0xBB,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xDB,0xAA,0x99, + 0x98,0x98,0x99,0x99,0x9A,0xBB,0xBD,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD, + 0xCD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xB8,0x88,0x78,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0x8C,0xAC,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDE, + 0xEF,0xEF,0xEF,0xEE,0xEE,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xBA,0x99, + 0x99,0x99,0x99,0x9A,0xAB,0xBD,0xDD,0xEE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xFE,0xFF,0xEE,0xED,0xDD,0xED,0xED,0xDD,0xDD,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xB8,0x78,0x78,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBD,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x88,0xCA,0xEE, + 0xFE,0xEE,0xFE,0xEE,0xDE,0xDE,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xED,0xED,0xDE, + 0xEF,0xEF,0xFE,0xFF,0xEF,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEE,0xFE,0xFF, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFE,0xFE,0xEE,0xEE,0xED,0xDB,0xAA, + 0xA9,0x99,0x99,0xAA,0xBB,0xDD,0xDD,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xEE,0xB8, + 0x87,0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x9C,0xAE, + 0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD, + 0xEE,0xFF,0xFF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xBA, + 0xAA,0xAA,0xAA,0xAB,0xDD,0xDE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xB8,0x78, + 0x78,0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBA,0xA9,0x98,0x8A,0xAC, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED, + 0xDE,0xEF,0xFF,0xFF,0xFE,0xEF,0xEE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xEF,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xEF,0xEE,0xEE,0xEE,0xED,0xDB, + 0xBA,0xAA,0xAB,0xDD,0xDD,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xB8,0x87,0x88, + 0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0x99,0x88,0xBB, + 0xCE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDD, + 0xDD,0xEE,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED, + 0xDC,0xCB,0xCD,0xDD,0xED,0xEE,0xED,0xDD,0xDD,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xFE,0xEE,0xED,0xBC,0xCD,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xC8,0x87,0x88,0x88, + 0x89,0x99,0x9A,0xAA,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBA,0xA9,0x98,0x8C, + 0xAD,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xED,0xDE,0xEF,0xFF,0xFF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEE,0xFE, + 0xEF,0xEE,0xEF,0xEF,0xEF,0xFE,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD, + 0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xDB,0xBB,0xCD,0xDD,0xEE,0xDE,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xD8,0x78,0x78,0x88,0x88, + 0x99,0x9A,0xAA,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x89, + 0xCA,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE, + 0xDD,0xDD,0xEE,0xFF,0xFF,0xFF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xEE,0xFE,0xEE,0xEE,0xDC,0xBB,0xCD,0xDD,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xEE,0xE9,0x87,0x88,0x88,0x89,0x99, + 0x9A,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x89, + 0x9C,0xBE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xED,0xDD,0xEE,0xEF,0xFF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xDC,0xCB,0xBD,0xDD,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEA,0x87,0x88,0x88,0x88,0x99,0x9A, + 0xAA,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xED,0xDB,0xBB,0xA9,0x98, + 0x8A,0xAC,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED, + 0xED,0xED,0xDE,0xEF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF, + 0xEF,0xEF,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xDE, + 0xDE,0xEE,0xEE,0xEC,0xBB,0xBC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF,0xEE,0xEC,0x88,0x78,0x88,0x89,0x99,0x9A,0xAA, + 0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD,0xCB,0xAA,0x99, + 0x88,0xBB,0xCE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xED,0xDE,0xDE, + 0xEE,0xEE,0xED,0xCB,0xBB,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xED,0x88,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB, + 0xCB,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xCC,0xBA,0xA9, + 0x98,0x8C,0xAE,0xEE,0xFE,0xEE,0xEF,0xEE,0xDE,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xDD,0xDE,0xEF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xDE,0xDE,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xED,0xCC,0xCB,0xDD,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xA7,0x87,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC, + 0xCD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xBB,0xAA, + 0x99,0x88,0xDA,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xED,0xED,0xDE,0xEE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE, + 0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDD,0xCB,0xBB,0xBD,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xD8,0x87,0x88,0x88,0x99,0x99,0xAA,0xBB,0xBB,0xCD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA, + 0x99,0x89,0x9D,0xBE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xED,0xEE,0xEF,0xEE,0xEE, + 0xED,0xED,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDB,0xBB,0xBD,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEF,0xEF,0xEE,0xE9,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB, + 0xAA,0x98,0x89,0xBC,0xEE,0xFE,0xEE,0xEF,0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF, + 0xFE,0xFF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xDE,0xDE,0xDD,0xDC,0xDD,0xCD,0xCB, + 0xBB,0xBB,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEB,0x87,0x88,0x88,0x89,0x9A,0xAA,0xAB,0xBB,0xBD,0xDD,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB, + 0xAA,0x99,0x88,0xBB,0xCE,0xEE,0xFE,0xEE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF, + 0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xDD,0xCD,0xBC,0xBB,0xBB, + 0xBC,0xDD,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xED,0x98,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDB, + 0xBA,0xA9,0x98,0x8B,0xBD,0xEE,0xEF,0xEF,0xEF,0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xEF,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB, + 0xCD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xA8,0x88,0x88,0x88,0x99,0xAA,0xAB,0xBB,0xCC,0xDD,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xED,0xDC, + 0xBB,0xAA,0x99,0x88,0xDA,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xEF, + 0xFF,0xFF,0xEF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xDC,0xBB,0xBB,0xBB,0xCD, + 0xDD,0xED,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xE9,0x87,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD, + 0xCB,0xBA,0x99,0x98,0x9D,0xBE,0xEF,0xEF,0xEE,0xFE,0xEE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xCB,0xBB,0xBB,0xBD,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEA,0x87,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED, + 0xDB,0xBB,0xA9,0x99,0x89,0xCC,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE, + 0xFF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDE,0xDE,0xED,0xDD,0xCC,0xBB,0xBB,0xBC,0xDD,0xDE, + 0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE, + 0xEE,0x98,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE, + 0xDD,0xCB,0xAA,0x99,0x88,0xAB,0xCE,0xEF,0xEE,0xEE,0xFE,0xED,0xDD,0xDE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFF,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xCB,0xBB,0xBB,0xDD,0xDE,0xDE, + 0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xC8,0x78,0x88,0x89,0x99,0xAA,0xBB,0xBC,0xCD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xED,0xCB,0xBA,0xA9,0x98,0x8B,0xBD,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xCB,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xE9, + 0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xED,0xDD,0xBB,0xAA,0x99,0x88,0xCA,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFF,0xFE,0xFE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBB,0xBB,0xCD,0xDE,0xED,0xED,0xED, + 0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xED,0x88, + 0x88,0x88,0x99,0x9A,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF, + 0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8D,0xBE,0xEE,0xEE,0xFE,0xFE,0xEE,0xDD,0xEE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE,0xEE,0xDE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xB8,0x88, + 0x88,0x99,0x9A,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEE,0xED,0xDC,0xBA,0xA9,0x99,0x89,0xCB,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEF,0xFF,0xEF,0xFF,0xEF,0xEF,0xFE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xBB,0xBB,0xCD,0xDE,0xDE,0xDE,0xED,0xED,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xE9,0x88,0x88, + 0x89,0x9A,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xDC,0xCB,0xBA,0x99,0x89,0x9C,0xCE,0xEE,0xFE,0xEE,0xEF,0xED,0xDE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xBB,0xBB,0xCD,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xED,0x88,0x88,0x89, + 0x99,0xAA,0xAB,0xBC,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0x8A,0xBC,0xEE,0xEF,0xEF,0xEE,0xEE,0xDD,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFE,0xFE,0xEE,0xEE,0xFE,0xFE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xBB,0xBD,0xDD,0xED,0xDE,0xED,0xEE,0xDE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0x98,0x88,0x88,0x99, + 0x9A,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xED,0xDD,0xBB,0xAA,0x99,0x88,0xBB,0xDE,0xEE,0xEE,0xEF,0xEE,0xED,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xFE,0xFE,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xCB,0xBB,0xBD,0xDD,0xDE,0xDE,0xED,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xE8,0x88,0x88,0x89,0x9A, + 0xAA,0xBB,0xCC,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0x99,0x98,0x8C,0xBE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED, + 0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEB,0x88,0x88,0x89,0x99,0xAA, + 0xBB,0xBB,0xDD,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xCB,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEF,0xEE,0xEE,0x98,0x88,0x89,0x99,0x9A,0xAB, + 0xBB,0xDD,0xDE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0x99,0x98,0x9C,0xBE,0xEF,0xEE,0xEE,0xFE,0xEE, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xB8,0x88,0x88,0x89,0x9A,0xAB,0xBB, + 0xCD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0x99,0xCC,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xEF,0xEF,0xEE,0xEE,0xED, + 0xDD,0xED,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xE8,0x88,0x88,0x89,0x9A,0xAA,0xBB,0xBC, + 0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xED,0xDD,0xCB,0xAA,0x99,0x88,0x9C,0xDE,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xED,0xDE, + 0xDE,0xDE,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEB,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xDD, + 0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xEE,0xED,0xCC,0xBA,0xA9,0x98,0x8B,0xBD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFF,0xEF,0xFF,0xFE,0xEF,0xFE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xED, + 0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xA8,0x88,0x88,0x99,0x9A,0xAB,0xBC,0xDD,0xDE, + 0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xBB,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDC,0xDD,0xDE, + 0xDE,0xED,0xED,0xED,0xEE,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xEF,0xEE,0xEE,0xB8,0x88,0x88,0x89,0x9A,0xAA,0xBB,0xBC,0xDD,0xEE, + 0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0x99,0x98,0x8C,0xCE,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE, + 0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xFE,0xEE,0xD8,0x87,0x88,0x89,0x99,0xAA,0xBB,0xCC,0xDD,0xDE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xCC,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xED,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED, + 0xEE,0xEE,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEB,0x88,0x88,0x88,0x99,0xAA,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0x88,0x8C,0xCE,0xEE,0xFE, + 0xFE,0xFE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xEE,0xEE,0x98,0x78,0x88,0x99,0x9A,0xAA,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x89,0xDC,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xA8,0x78,0x88,0x89,0x99,0xAA,0xAB,0xBC,0xDD,0xDE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF +}; + +const uint32_t PokeMini_BG4_PalRGB32[] = { + 0x00101010,0x00606058,0x00787878,0x00808080, + 0x00989880,0x00A0A090,0x00A8A898,0x00B0B0A0, + 0x00C0C0B8,0x00C8C8C0,0x00D0D0C8,0x00D8D8D0, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint32_t PokeMini_BG4_PalBGR32[] = { + 0x00101010,0x00586060,0x00787878,0x00808080, + 0x00809898,0x0090A0A0,0x0098A8A8,0x00A0B0B0, + 0x00B8C0C0,0x00C0C8C8,0x00C8D0D0,0x00D0D8D8, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint16_t PokeMini_BG4_PalRGB16[] = { + 0x1082,0x630B,0x7BCF,0x8410,0x9CD0,0xA512,0xAD53,0xB594, + 0xC617,0xCE58,0xD699,0xDEDA,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG4_PalBGR16[] = { + 0x1082,0x5B0C,0x7BCF,0x8410,0x84D3,0x9514,0x9D55,0xA596, + 0xBE18,0xC659,0xCE9A,0xD6DB,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG4_PalRGB15[] = { + 0x8842,0xB18B,0xBDEF,0xC210,0xCE70,0xD292,0xD6B3,0xDAD4, + 0xE317,0xE738,0xEB59,0xEF7A,0xEF7B,0xF39C,0xF7BD,0xFFFF +}; + diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG4.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG4.h new file mode 100644 index 0000000000..90e93e98a3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG4.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_BG_X4 +#define POKEMINI_BG_X4 + +#include + +// PokeMini Background Image +// 384 x 256 (4x4) - 4bpp (LSn Left pixel) +extern const uint8_t PokeMini_BG4[]; + +// PokeMini Background Palette (RGBX8888) +extern const uint32_t PokeMini_BG4_PalRGB32[]; + +// PokeMini Background Palette (BGRX8888) +extern const uint32_t PokeMini_BG4_PalBGR32[]; + +// PokeMini Background Palette (RGB565) +extern const uint16_t PokeMini_BG4_PalRGB16[]; + +// PokeMini Background Palette (BGR565) +extern const uint16_t PokeMini_BG4_PalBGR16[]; + +// PokeMini Background Palette (RGB555) +extern const uint16_t PokeMini_BG4_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG5.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG5.c new file mode 100644 index 0000000000..900ad40af6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG5.c @@ -0,0 +1,4852 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_BG5[] = { + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x85,0x21,0x37, + 0x88,0x88,0x88,0x88,0x10,0x01,0x88,0x88,0x88,0x88,0x84,0x11,0x14,0x62,0x11,0x43, + 0x12,0x68,0x88,0x88,0x86,0x21,0x38,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00, + 0x01,0x33,0x33,0x30,0x00,0x00,0x03,0x33,0x33,0x33,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x02,0x33,0x33,0x20,0x00,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x00,0x12,0x10, + 0x00,0x31,0x11,0x30,0x08,0x80,0x01,0x13,0x11,0x13,0x00,0x22,0x30,0x01,0x22,0x00, + 0x41,0x00,0x13,0x12,0x00,0x14,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x09,0xFF,0xFF, + 0x10,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x0F,0xFF,0x11, + 0xF9,0x00,0x00,0x00,0x00,0xEE,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x30,0x0F,0xF5,0xEF, + 0x90,0x00,0x11,0x00,0x1F,0xF0,0x11,0x00,0x01,0x10,0x02,0xFF,0xF1,0x2F,0xFF,0x00, + 0x41,0x01,0x00,0x10,0x00,0x22,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x1F,0xF0,0x9F, + 0xF0,0x9F,0xFF,0x70,0x2F,0x84,0xFF,0x15,0xFF,0xF8,0x05,0xFF,0xF1,0xEF,0xFF,0x08, + 0xF2,0x2F,0xCC,0xFE,0x02,0xF9,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x2F,0xFC,0xFF, + 0x78,0xFF,0xEF,0xF1,0x8F,0xCF,0xF1,0x2F,0xF7,0xFF,0x0C,0xF7,0xF5,0xF9,0xF9,0x0F, + 0xF1,0x5F,0xF9,0xFF,0x18,0xF5,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x5F,0xFF,0xF8, + 0x0F,0xF9,0x1F,0xF1,0xEF,0xFF,0x40,0x8F,0xFF,0xFE,0x0F,0xF2,0xFF,0xE4,0xF8,0x0F, + 0xF0,0x8F,0x51,0xFF,0x0C,0xF2,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x8F,0x51,0x00, + 0x1F,0xF2,0xCF,0xF1,0xFF,0xFF,0xC0,0xCF,0xC8,0x40,0x1F,0x82,0xFF,0x27,0xF2,0x1F, + 0xF0,0xFF,0x12,0xFE,0x0F,0xF1,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0xFF,0x10,0x00, + 0x0E,0xFF,0xFF,0x81,0xFF,0x1F,0xF1,0x7F,0xFC,0xF1,0x5F,0x22,0xFF,0x08,0xF2,0x2F, + 0x80,0xFF,0x05,0xF8,0x1F,0xF0,0x02,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x21,0x00,0xFF,0x00,0x20, + 0x01,0xEF,0xF5,0x02,0xF9,0x0C,0xF7,0x0C,0xFF,0x80,0xCF,0x11,0x82,0x0F,0xF1,0x8F, + 0x41,0xFF,0x08,0xF2,0x2F,0xC0,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x32, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x00,0x01,0x33, + 0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x87,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x43,0x33,0x34,0x33,0x32, + 0x22,0x22,0x23,0x33,0x33,0x33,0x33,0x22,0x22,0x22,0x23,0x33,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x21,0x12,0x22,0x22, + 0x22,0x22,0x22,0x22,0x23,0x22,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x33,0x21,0x11, + 0x11,0x11,0x11,0x11,0x22,0x31,0x11,0x11,0x11,0x23,0x31,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x12,0x22,0x22,0x22,0x22,0x22,0x23,0x22,0x22,0x22,0x32, + 0x33,0x33,0x22,0x23,0x33,0x33,0x33,0x33,0x32,0x22,0x22,0x22,0x33,0x34,0x33,0x34, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x98,0x76,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x54,0x33,0x33, + 0x33,0x34,0x44,0x44,0x44,0x44,0x44,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x22, + 0x22,0x33,0x33,0x33,0x32,0x22,0x22,0x22,0x22,0x22,0x23,0x32,0x22,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x32,0x21,0x11,0x11,0x11,0x11,0x12,0x44,0x32,0x11,0x11, + 0x11,0x12,0x34,0x31,0x13,0x43,0x11,0x11,0x24,0x43,0x21,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x21,0x11,0x22,0x11,0x11,0x11,0x11,0x11, + 0x11,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x21,0x11,0x11,0x11,0x11,0x11,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x23,0x33,0x33,0x22,0x22,0x23,0x34,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x34,0x44,0x44,0x44,0x44,0x33,0x33,0x33,0x33,0x34,0x44,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0xB9,0x88,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x55, + 0x55,0x55,0x55,0x56,0x66,0x66,0x55,0x55,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x43,0x33,0x34,0x44,0x44,0x44,0x44,0x55,0x55,0x44, + 0x44,0x44,0x44,0x45,0x55,0x33,0x22,0x11,0x11,0x11,0x12,0x45,0x53,0x32,0x12,0x11, + 0x12,0x44,0x35,0x55,0x22,0x32,0x22,0x34,0x55,0x32,0x11,0x11,0x11,0x11,0x11,0x11, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x24,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x44,0x44,0x44,0x45,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0xEC,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x98,0x88,0x88,0x77,0x77,0x77, + 0x78,0x88,0x87,0x88,0x88,0x88,0x87,0x77,0x76,0x67,0x77,0x77,0x76,0x66,0x66,0x66, + 0x66,0x66,0x76,0x55,0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x66, + 0x66,0x66,0x66,0x78,0x65,0x43,0x23,0x32,0x22,0x22,0x47,0x78,0x44,0x23,0x56,0x32, + 0x47,0x74,0x23,0x78,0x73,0x22,0x36,0x87,0x64,0x33,0x32,0x32,0x32,0x22,0x22,0x33, + 0x33,0x44,0x44,0x44,0x43,0x43,0x33,0x33,0x33,0x34,0x43,0x34,0x44,0x33,0x34,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x33, + 0x32,0x22,0x23,0x22,0x22,0x22,0x22,0x32,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x32, + 0x32,0x32,0x32,0x33,0x32,0x34,0x66,0x66,0x66,0x66,0x56,0x66,0x77,0x66,0x66,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x88,0x77,0x78,0x77,0x77,0x77,0x77,0x78,0x98, + 0x89,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCC,0xCC,0xBB,0xBA,0xA9,0x88,0x88,0x89, + 0x99,0x99,0x99,0x99,0x99,0xAA,0x99,0x99,0x88,0x88,0x88,0x88,0x88,0x88,0x77,0x77, + 0x77,0x88,0x87,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x88,0x88,0x99,0x88,0x88,0x78, + 0x77,0x87,0x78,0x98,0x75,0x44,0x34,0x34,0x33,0x47,0x99,0x85,0x44,0x34,0x77,0x44, + 0x49,0x98,0x53,0x58,0x74,0x34,0x89,0x98,0x53,0x33,0x33,0x33,0x33,0x43,0x34,0x44, + 0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x55,0x54,0x55,0x45,0x55, + 0x55,0x55,0x45,0x54,0x55,0x54,0x54,0x54,0x54,0x54,0x54,0x55,0x54,0x45,0x45,0x45, + 0x45,0x44,0x55,0x45,0x45,0x55,0x55,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54, + 0x44,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x34,0x34,0x78,0x87,0x77,0x78,0x77,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x98,0x89,0x99,0x99,0x99,0x98,0x88,0x88,0x88,0x88,0x89,0xAB, + 0xBB,0xCC,0xCC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xFF,0xFF,0xEE,0xEE,0xEE,0xEF,0xFE,0xEE,0xEE,0xEE,0xED,0xDB,0xBA,0xAA,0xAA,0xAB, + 0xCB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xAA,0xBB,0x99,0x9A,0x99,0xA9,0x99,0x88,0x88, + 0x89,0x99,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x9A,0x9A,0xAA,0x99,0x99,0x88, + 0x88,0x88,0x9A,0xA8,0x65,0x44,0x44,0x44,0x45,0x8A,0xB8,0x64,0x57,0x95,0x46,0x98, + 0x47,0xCB,0x95,0x44,0x44,0x69,0xCA,0x75,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x56,0x66,0x66,0x65,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56,0x65,0x66,0x66, + 0x66,0x66,0x56,0x66,0x66,0x66,0x66,0x65,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x55,0x54,0x44,0x44,0x44,0x44,0x44,0x43,0x44,0x34,0x43,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x78,0x89,0x98,0x98,0x88,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x9A,0x9A,0xAA,0xAA,0xBB,0xBB,0xBA,0xAA,0xA9,0xA9,0x99,0x9A,0x9A,0xBC, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDC,0xCB,0xBB,0xCD,0xDD, + 0xDD,0xDD,0xDC,0xCC,0xCC,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA, + 0xAA,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xA9,0x9A,0x99,0x99, + 0x99,0x9A,0xBB,0x97,0x55,0x44,0x44,0x54,0x6A,0xCB,0x96,0x54,0x7D,0xDB,0x67,0xDD, + 0xA5,0x7C,0xC7,0x54,0x58,0xBC,0xA6,0x54,0x44,0x44,0x44,0x44,0x44,0x56,0x77,0x77, + 0x77,0x77,0x77,0x67,0x67,0x66,0x76,0x76,0x77,0x67,0x67,0x67,0x66,0x76,0x76,0x67, + 0x66,0x76,0x67,0x67,0x67,0x66,0x76,0x67,0x66,0x76,0x76,0x66,0x76,0x67,0x66,0x66, + 0x66,0x66,0x76,0x67,0x67,0x67,0x67,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x75,0x65,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x54,0x45,0x79,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAA,0x9A,0x9A, + 0x9A,0xAA,0xAA,0xBB,0xAB,0xBB,0xCC,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xAA,0xAB,0xBC, + 0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xED,0xDC,0xCB,0xBC,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xAA,0xA9,0xA9,0x9A,0x99,0xA9,0xAA,0xAA,0xBB,0xBB,0xBA,0xAA,0xAA,0x99,0x99, + 0x99,0xAB,0xC9,0x75,0x55,0x54,0x54,0x45,0x9D,0xD8,0x65,0x65,0x48,0xCD,0xB6,0x9E, + 0xDA,0x57,0x85,0x57,0xAD,0xD9,0x65,0x54,0x54,0x44,0x44,0x45,0x56,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x67,0x76, + 0x77,0x67,0x76,0x77,0x67,0x76,0x77,0x77,0x77,0x76,0x76,0x77,0x67,0x67,0x67,0x76, + 0x76,0x77,0x67,0x77,0x76,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x67,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x44,0x55,0x79,0x9A,0x9A,0xA9,0xA9,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xBC,0xCC,0xCB,0xBB,0xBB,0xCB,0xBB,0xBA,0xBB, + 0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEE,0xED,0xCC,0xBC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xCD,0xBB,0xBB,0xCD,0xCD,0xCC,0xDB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAA,0xAA,0x99,0x9A,0x9A,0x9A,0xAA,0xAB,0xBB,0xBB,0xAA,0xAA,0xA9,0x99,0x99, + 0x99,0xBC,0xA8,0x65,0x54,0x54,0x45,0x48,0xDC,0x86,0x68,0x87,0x65,0x8C,0xDA,0x59, + 0xCD,0x84,0x45,0x8C,0xDC,0x86,0x54,0x44,0x44,0x54,0x45,0x55,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x76,0x77,0x67,0x76,0x77, + 0x67,0x67,0x67,0x67,0x76,0x76,0x76,0x77,0x67,0x67,0x67,0x76,0x77,0x67,0x67,0x67, + 0x77,0x67,0x67,0x67,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x65,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44, + 0x44,0x54,0x45,0x45,0x45,0x45,0x68,0xAA,0xA9,0x9A,0x99,0xA9,0xAA,0xAA,0xAA,0x9A, + 0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xCC,0xCB,0xCB,0xDC,0xDC,0xBB,0xAB,0xAB, + 0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xCC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xDC,0xCD,0xBC,0xCC,0xCB,0xDC,0xBB,0xBC,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xA9,0x9A,0x9A,0xAA,0xBA,0xBB,0xAB,0xBA,0xAA,0xA9,0x99,0x99, + 0xAB,0xDA,0x76,0x55,0x44,0x44,0x54,0x5A,0xEA,0x66,0xAD,0xEC,0xD9,0x79,0xDD,0xB6, + 0x78,0x65,0x79,0xDC,0x97,0x54,0x45,0x44,0x54,0x44,0x55,0x67,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x77,0x67,0x77,0x77,0x76, + 0x77,0x76,0x77,0x76,0x77,0x67,0x67,0x67,0x76,0x77,0x77,0x67,0x76,0x77,0x67,0x66, + 0x76,0x77,0x67,0x67,0x77,0x67,0x76,0x76,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x57,0xAA,0x9A,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xA9,0xA9,0xA9,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC,0xCC,0xBC,0xBD,0xCD,0xCB,0xBA,0xBA, + 0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDB,0xCD,0xCD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBC,0xCD,0xCC,0xDC,0xDC,0xDD,0xCC,0xDB,0xDC,0xDC, + 0xCB,0xBA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBA,0xAA,0xA9,0x99,0x98,0x99, + 0xBD,0xB8,0x65,0x54,0x54,0x54,0x44,0x6A,0xD8,0x55,0x7B,0xCA,0x89,0xBB,0xDD,0xD8, + 0x54,0x57,0xBC,0xD8,0x65,0x44,0x54,0x45,0x44,0x54,0x66,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x76,0x77, + 0x67,0x67,0x76,0x77,0x67,0x67,0x67,0x77,0x67,0x67,0x67,0x77,0x67,0x67,0x67,0x77, + 0x67,0x76,0x77,0x67,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x76,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44, + 0x54,0x44,0x45,0x44,0x45,0x45,0x57,0x99,0xA9,0x99,0x99,0x99,0x9A,0xAA,0x99,0x99, + 0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDC,0xBB,0xAB,0xBA, + 0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xDC,0xBB,0xCD,0xDE,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xBB,0xBB,0xBC,0xBB,0xDC,0xDC,0xDB,0xDC,0xDC,0xCD,0xCD,0xDC,0xDC, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x9B, + 0xDC,0x86,0x55,0x45,0x44,0x45,0x44,0x6C,0xD7,0x55,0x48,0xCC,0xA6,0x57,0x8A,0x86, + 0x55,0xAD,0xDA,0x75,0x54,0x45,0x44,0x44,0x44,0x56,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x76,0x77,0x67,0x76,0x77,0x67, + 0x77,0x76,0x77,0x67,0x77,0x77,0x76,0x76,0x76,0x76,0x77,0x67,0x76,0x76,0x76,0x76, + 0x77,0x67,0x67,0x77,0x77,0x67,0x76,0x77,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x67,0x64,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44, + 0x44,0x45,0x44,0x45,0x44,0x44,0x57,0x89,0xA9,0x99,0x89,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xCC,0xCC,0xDC,0xCB,0xBB,0xBA,0xAB, + 0xAB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDC,0xBC,0xCD,0xDD,0xDD,0xDD,0xED, + 0xDD,0xCD,0xCB,0xBB,0xBB,0xBC,0xDD,0xCD,0xBD,0xCD,0xCD,0xBD,0xBD,0xCD,0xCD,0xCB, + 0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAB,0xAA,0xAA,0x99,0x99,0x99,0xAD, + 0xD9,0x76,0x54,0x44,0x54,0x44,0x45,0x5B,0xE9,0x65,0x54,0xAD,0xDA,0x65,0x55,0x55, + 0x7A,0xBD,0xA6,0x54,0x44,0x54,0x45,0x44,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x76, + 0x76,0x77,0x76,0x77,0x67,0x66,0x77,0x67,0x77,0x77,0x67,0x76,0x76,0x77,0x77,0x77, + 0x67,0x67,0x76,0x76,0x77,0x76,0x77,0x76,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x75,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x45,0x45,0x56,0x8A,0x99,0x98,0x99,0x99,0x89,0x99,0x99,0x99, + 0x98,0x99,0x99,0xAA,0xBB,0xBB,0xBA,0xBB,0xBC,0xCC,0xCB,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xCD,0xCB,0xCD,0xDD,0xED,0xED,0xDD, + 0xDD,0xDC,0xCB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xCC,0xCC,0xCB,0xBB, + 0xBB,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0xBD, + 0xA8,0x65,0x45,0x45,0x45,0x45,0x44,0x5A,0xDA,0x66,0x45,0x6A,0xCD,0xA5,0x55,0x58, + 0xBD,0xC8,0x55,0x54,0x54,0x45,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x76,0x76,0x76,0x77,0x67,0x76,0x77, + 0x77,0x67,0x67,0x76,0x77,0x77,0x67,0x77,0x67,0x67,0x67,0x67,0x67,0x76,0x76,0x76, + 0x77,0x77,0x67,0x77,0x67,0x77,0x76,0x77,0x77,0x67,0x76,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x67,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x45, + 0x44,0x44,0x54,0x45,0x44,0x44,0x55,0x7A,0x99,0x98,0x99,0x99,0x88,0x89,0x89,0x88, + 0x99,0x99,0x9A,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xDD,0xCC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDB,0xBB,0xBB,0xCD,0xDD,0xDD,0xCD,0xCD,0xDB,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB, + 0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xAB,0xAB,0xAA,0xBA,0xAA,0x99,0x99,0x99,0xAA,0xBB, + 0x86,0x55,0x45,0x44,0x44,0x44,0x44,0x48,0xDD,0x85,0x55,0x45,0xBC,0x96,0x56,0xAD, + 0xEA,0x75,0x54,0x44,0x44,0x44,0x45,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76, + 0x76,0x77,0x67,0x67,0x67,0x67,0x76,0x76,0x66,0x66,0x77,0x76,0x77,0x67,0x77,0x77, + 0x67,0x67,0x76,0x76,0x77,0x67,0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x74,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x54,0x44,0x44,0x45,0x45,0x45,0x7A,0x99,0x99,0x99,0x99,0x88,0x88,0x98,0x98, + 0x89,0x89,0x99,0xAB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xBB,0xBA,0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDD,0xCB,0xCC,0xDD,0xDE,0xDE,0xDD,0xDD, + 0xCD,0xCB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDC,0xBC,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xAB,0xBA,0xBA,0xBA,0xAA,0xBA,0xAA,0x99,0x99,0x99,0x99,0x99,0x9A,0xB9, + 0x65,0x54,0x54,0x54,0x54,0x54,0x45,0x45,0xBE,0xB7,0x55,0x54,0x57,0x55,0x7B,0xDC, + 0x96,0x54,0x44,0x54,0x54,0x44,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x67,0x67,0x67, + 0x67,0x76,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x77,0x67,0x77,0x67,0x76, + 0x76,0x76,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x45,0x44,0x44,0x55,0x79,0x99,0x99,0x99,0x99,0x98,0x89,0x88,0x88, + 0x98,0x99,0x9A,0xAB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0xCB,0xBB,0xBB,0xDD, + 0xDC,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBC,0xCD,0xDD,0xED,0xDD,0xDD,0xDC, + 0xCC,0xBB,0xBC,0xBD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xA9,0x99,0xA9,0x99,0x99,0x99,0xAA,0x97, + 0x55,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x6B,0xDC,0x97,0x55,0x55,0x79,0xBD,0xA8, + 0x55,0x45,0x44,0x44,0x44,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x67,0x67,0x67,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x77,0x67,0x76,0x77,0x77,0x67, + 0x77,0x77,0x67,0x67,0x67,0x67,0x77,0x76,0x76,0x77,0x77,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x66,0x64,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x44,0x44, + 0x54,0x44,0x45,0x44,0x45,0x45,0x45,0x69,0x99,0x99,0x99,0xA9,0x98,0x88,0x89,0x89, + 0x89,0x89,0x9A,0xAB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD, + 0xDD,0xCB,0xBB,0xAB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xCD,0xBB,0xCD,0xDD,0xDE,0xDD,0xDD,0xCD, + 0xCB,0xBB,0xCB,0xDD,0xCD,0xDD,0xDD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0x98,0x99,0x99,0x99,0x99,0x9A,0xA9,0x75, + 0x55,0x44,0x54,0x54,0x44,0x54,0x44,0x45,0x45,0xAE,0xDD,0xB9,0xAC,0xEE,0xC8,0x65, + 0x45,0x44,0x45,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x76,0x76,0x77,0x76,0x76,0x76, + 0x77,0x77,0x76,0x66,0x66,0x66,0x56,0x66,0x76,0x76,0x66,0x77,0x67,0x77,0x76,0x77, + 0x77,0x67,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x76,0x77,0x76,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x68,0x99,0x99,0x99,0x99,0x98,0x88,0x88,0x89, + 0x89,0x99,0x9A,0xAB,0xBB,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xBB,0xCC,0xCD,0xDD,0xDD, + 0xED,0xDD,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDC,0xCC,0xCD,0xDD,0xDE,0xDD,0xDD,0xDC,0xCC, + 0xCB,0xBB,0xCD,0xCD,0xDC,0xDD,0xCC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xA9,0x99,0x9A,0x99,0x99,0x99,0xA9,0xA7,0x65, + 0x54,0x45,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x57,0xAB,0xEE,0xCD,0xCB,0x85,0x45, + 0x44,0x44,0x44,0x44,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x76,0x66,0x66,0x66,0x56,0x56,0x66,0x77,0x66,0x66,0x77,0x77,0x67,0x67,0x67, + 0x67,0x77,0x67,0x67,0x67,0x67,0x77,0x76,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x64,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44, + 0x44,0x44,0x54,0x44,0x44,0x54,0x54,0x58,0x99,0x99,0x99,0x99,0x98,0x88,0x89,0x98, + 0x99,0x99,0xAA,0xAB,0xBB,0xAB,0xAA,0xAB,0xAB,0xAB,0xBA,0xBB,0xBC,0xDD,0xDD,0xEE, + 0xEE,0xED,0xCB,0xBB,0xAB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCC,0xBC,0xDD,0xED,0xDD,0xDD,0xCD,0xCB, + 0xBB,0xBD,0xBD,0xCD,0xCD,0xDC,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xA9,0x99,0x99,0x99,0x99,0x99,0x9A,0x87,0x55, + 0x54,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x45,0x78,0x88,0x65,0x55,0x45, + 0x44,0x54,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x67,0x67,0x67,0x76, + 0x77,0x66,0x66,0x66,0x66,0x65,0x65,0x67,0x67,0x66,0x66,0x67,0x67,0x77,0x77,0x77, + 0x77,0x67,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x67,0x76,0x77,0x77,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44, + 0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x57,0x99,0xA9,0xAA,0xA9,0x99,0x88,0x88,0x89, + 0x99,0x99,0xAA,0xBA,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBC,0xDD,0xDE, + 0xEE,0xEE,0xDD,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xCC,0xCB,0xDD,0xDD,0xDE,0xDD,0xDD,0xBC,0xCB, + 0xCC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0x99,0x99,0xA9,0x99,0xA9,0x9A,0xA9,0x75,0x54, + 0x54,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x67, + 0x66,0x66,0x67,0x67,0x66,0x66,0x56,0x66,0x77,0x67,0x66,0x67,0x77,0x67,0x67,0x67, + 0x67,0x77,0x67,0x67,0x67,0x76,0x77,0x76,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x64,0x44,0x44,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x58,0xAA,0xAA,0xBA,0xAA,0x99,0x98,0x89,0x99, + 0x99,0x9A,0x9A,0xAA,0xBA,0xBA,0xBB,0xAA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xCC,0xDD, + 0xEE,0xEE,0xED,0xCB,0xBB,0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xCC,0xCD,0xDE,0xDD,0xDD,0xDC,0xDB,0xBD, + 0xBD,0xCC,0xCC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB, + 0xAB,0xBB,0xBB,0xBB,0xCB,0xCD,0xCA,0xA9,0x9A,0xA9,0xA9,0xA9,0xAA,0x97,0x65,0x55, + 0x45,0x44,0x44,0x54,0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x54,0x54,0x44,0x54,0x45, + 0x44,0x44,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77, + 0x76,0x66,0x66,0x76,0x77,0x66,0x66,0x66,0x67,0x67,0x66,0x67,0x67,0x77,0x77,0x77, + 0x77,0x67,0x77,0x77,0x76,0x77,0x76,0x77,0x77,0x67,0x77,0x77,0x76,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x75,0x44,0x44,0x44,0x54,0x44,0x44,0x44, + 0x44,0x45,0x44,0x54,0x44,0x45,0x45,0x57,0x9A,0xAB,0xCB,0xAA,0xAA,0x98,0x99,0x99, + 0x99,0x99,0xAA,0xAA,0xBA,0xBB,0xBA,0xBB,0xAA,0xBA,0xBA,0xBA,0xAA,0xAB,0xBB,0xCD, + 0xDD,0xEE,0xEE,0xDC,0xBB,0xAB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBC,0xCC,0xDD,0xDD,0xED,0xDC,0xCC,0xCC,0xCC, + 0xCC,0xDC,0xDC,0xDD,0xCD,0xBC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xCA,0x99,0xA9,0xAA,0xAA,0xAA,0x9A,0x87,0x55,0x45, + 0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44, + 0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x76,0x76,0x76,0x77,0x76, + 0x66,0x66,0x66,0x67,0x76,0x66,0x66,0x66,0x67,0x76,0x76,0x67,0x77,0x67,0x67,0x67, + 0x77,0x77,0x76,0x76,0x77,0x76,0x77,0x76,0x77,0x77,0x67,0x67,0x77,0x76,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x55,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x57,0x9A,0xAB,0xCB,0xAA,0x9B,0xEA,0x89,0x9A, + 0x99,0xA9,0xAA,0xAA,0xAB,0xAB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC, + 0xDD,0xEE,0xEE,0xED,0xCB,0xBA,0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xDD,0xCB,0xCB,0xDD,0xED,0xDD,0xDD,0xDB,0xDB,0xDB, + 0xDC,0xBC,0xCD,0xDC,0xDC,0xCB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xBA,0x9A,0xAA,0xAA,0xBA,0xAA,0xA9,0x75,0x55,0x44, + 0x45,0x44,0x54,0x45,0x45,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x44, + 0x45,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x77, + 0x76,0x56,0x56,0x66,0x67,0x77,0x67,0x66,0x66,0x77,0x66,0x66,0x67,0x77,0x77,0x76, + 0x66,0x76,0x77,0x77,0x76,0x77,0x76,0x77,0x77,0x67,0x77,0x77,0x76,0x77,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x75,0x54,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x57,0xAA,0xAA,0xAA,0xAA,0xAA,0xDB,0x8A,0xAA, + 0x9A,0x9A,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xCC,0xDD,0xEE,0xED,0xDB,0xBB,0xAB,0xBC,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xFE,0xED,0xDD,0xCC,0xCC,0xCD,0xDD,0xDE,0xDD,0xDC,0xCC,0xBC,0xCB, + 0xCC,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xA7,0x65,0x54,0x54, + 0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x45, + 0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x67,0x66,0x66,0x77,0x76, + 0x66,0x66,0x56,0x56,0x66,0x66,0x76,0x77,0x77,0x76,0x76,0x66,0x67,0x77,0x76,0x66, + 0x66,0x66,0x66,0x77,0x67,0x76,0x77,0x76,0x77,0x77,0x67,0x67,0x77,0x77,0x77,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x45,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x44,0x44,0x45,0x57,0xAA,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xDD,0xDE,0xEE,0xCB,0xBA,0xBA,0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFF,0xEE,0xDD,0xDD,0xDD,0xCB,0xBD,0xDD,0xED,0xDD,0xDC,0xDC,0xDB,0xDB, + 0xDB,0xDC,0xDC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xAA,0x99,0x9A,0xAA,0xAB,0xAB,0xAA,0xAA,0x87,0x55,0x45,0x44, + 0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x45, + 0x57,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x66,0x66,0x66,0x77, + 0x76,0x66,0x65,0x66,0x65,0x66,0x66,0x77,0x67,0x67,0x77,0x66,0x66,0x77,0x66,0x66, + 0x76,0x66,0x66,0x67,0x77,0x77,0x76,0x77,0x76,0x77,0x77,0x77,0x76,0x76,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x74,0x45,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x45,0x45,0x44,0x56,0x9A,0xA9,0x99,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xAB,0xBD,0xCD,0xCC,0xBB,0xBB,0xAB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xCD,0xDD,0xBC,0xBC,0xDD,0xDD,0xDD,0xDD,0xCD,0xBC,0xCC,0xCC, + 0xCD,0xCD,0xBD,0xBC,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xAA,0x9A,0xAA,0xAB,0xAB,0xAB,0xAA,0xAA,0x76,0x55,0x44,0x54, + 0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x46, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x76, + 0x77,0x66,0x66,0x67,0x67,0x66,0x66,0x67,0x77,0x77,0x67,0x66,0x77,0x76,0x65,0x66, + 0x67,0x67,0x66,0x66,0x77,0x76,0x77,0x77,0x77,0x76,0x76,0x76,0x77,0x77,0x77,0x77, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x56,0x9A,0x99,0x99,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBA,0xAA,0xAA,0x9A,0xAA,0xAB,0xAA,0xAA,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xCE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xED,0xBD,0xDD,0xDC,0xCB,0xBD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xBD, + 0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xBC,0xBB,0xBB,0xBB,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xBA,0x9A,0xAA,0xAA,0xAA,0xBA,0xAA,0xA8,0x75,0x54,0x54,0x54, + 0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x44,0x55,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x76,0x66,0x67,0x76,0x66,0x66, + 0x66,0x66,0x66,0x66,0x77,0x67,0x66,0x66,0x67,0x67,0x77,0x66,0x66,0x77,0x66,0x66, + 0x66,0x66,0x66,0x56,0x76,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x76,0x76,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x67,0x64,0x44,0x44,0x44,0x44, + 0x45,0x44,0x44,0x45,0x44,0x54,0x45,0x56,0x9A,0x99,0x89,0x89,0x99,0x99,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xBB,0xBA,0xAA, + 0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEB,0xCD,0xDC,0xBC,0xCC,0xDC,0xDD,0xDD,0xDD,0xCB,0xBC,0xBC,0xDC, + 0xDC,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xCB,0xBA,0xAA,0xAA,0xAB,0xAA,0xBB,0xA7,0x65,0x54,0x54,0x45, + 0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x57,0x77, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x77,0x76,0x66, + 0x66,0x66,0x67,0x67,0x66,0x66,0x66,0x66,0x77,0x77,0x67,0x66,0x66,0x66,0x76,0x66, + 0x56,0x66,0x67,0x67,0x77,0x77,0x77,0x77,0x76,0x76,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x56,0x9A,0x99,0x98,0x99,0x99,0x99,0xBA,0xA9, + 0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xBB,0xBB,0xAA, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDA,0xBD,0xDD,0xDC,0xCB,0xCB,0xDC,0xDD,0xCD,0xCD,0xCB,0xBC,0xCD, + 0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xCB,0xCA,0xAA,0xAA,0xAA,0xAA,0xAB,0x87,0x55,0x44,0x45,0x44, + 0x44,0x54,0x45,0x44,0x54,0x44,0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x67,0x77,0x76, + 0x66,0x67,0x66,0x66,0x66,0x66,0x66,0x76,0x67,0x66,0x77,0x76,0x65,0x67,0x66,0x66, + 0x66,0x66,0x76,0x66,0x67,0x67,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x54,0x44,0x44,0x45, + 0x44,0x44,0x45,0x44,0x44,0x54,0x44,0x56,0x9A,0xA9,0x99,0x89,0x99,0x99,0xBA,0xAA, + 0x9A,0xAA,0xAA,0xBA,0xAA,0xAA,0x9A,0xAA,0xAA,0x9A,0xA9,0xAA,0xAA,0xBB,0xBB,0xBA, + 0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xCC,0xDB,0xBB,0xBB,0xBD,0xEE,0xEF,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xBA,0xDD,0xDC,0xCC,0xCC,0xDB,0xDC,0xDC,0xDD,0xCC,0xCB,0xBB,0xCC, + 0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xDB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0x76,0x54,0x54,0x44,0x54, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x67,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x77,0x77,0x76,0x66,0x66,0x66,0x67,0x76,0x77, + 0x66,0x66,0x76,0x66,0x76,0x66,0x66,0x66,0x76,0x66,0x67,0x77,0x66,0x66,0x66,0x76, + 0x66,0x56,0x65,0x66,0x77,0x77,0x77,0x67,0x77,0x67,0x67,0x76,0x76,0x76,0x77,0x77, + 0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x75,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x56,0x9B,0xAA,0x99,0x99,0x99,0x99,0xBA,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xA9,0xA9,0x99,0xA9,0x9A,0xAB,0xBB,0xAB, + 0xAB,0xAB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xBB,0xBB,0xBD,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEE,0x9B,0xDD,0xDC,0xDC,0xCC,0xCC,0xDB,0xDC,0xDC,0xDD,0xCD,0xCB,0xBB, + 0xCC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAA,0xBB,0xAA,0xAA,0xA8,0x65,0x45,0x45,0x44,0x45, + 0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x57,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x77,0x66,0x66,0x76,0x66,0x66,0x77,0x76, + 0x66,0x67,0x66,0x56,0x66,0x56,0x67,0x66,0x66,0x66,0x66,0x77,0x66,0x67,0x66,0x67, + 0x65,0x66,0x66,0x66,0x76,0x77,0x67,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x76,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x54,0x44,0x44, + 0x45,0x44,0x44,0x44,0x54,0x45,0x44,0x56,0x9A,0xAA,0xAA,0x99,0x99,0x89,0xAA,0x9A, + 0x9A,0xAA,0xAA,0xAA,0xAA,0x99,0xAA,0xAA,0xAA,0xA9,0xA9,0x99,0xA9,0xAA,0xBB,0xBA, + 0xAB,0xAB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEC,0x8B,0xCD,0xDC,0xCC,0xCC,0xDB,0xCD,0xBD,0xCD,0xCD,0xCC,0xCC,0xBB, + 0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBA,0xBB,0xCC,0xBA,0xAB,0xAA,0xAA,0xCD,0xBA,0xAB,0x97,0x55,0x45,0x44,0x45,0x44, + 0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x46,0x77,0x77,0x78,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x76,0x76,0x66,0x66,0x66,0x67,0x76,0x66,0x66,0x67,0x77, + 0x66,0x67,0x66,0x65,0x55,0x66,0x76,0x66,0x66,0x76,0x66,0x67,0x66,0x66,0x76,0x56, + 0x76,0x55,0x65,0x67,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x67,0x77,0x76, + 0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x84,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x56,0x9A,0xAA,0xAA,0xA9,0x9A,0x99,0xA9,0xA9, + 0xA9,0xAA,0xAA,0xAA,0xA9,0xA9,0x9A,0xAA,0xA9,0xA9,0x99,0xAA,0xA9,0xAA,0xBA,0xAA, + 0xAB,0xAB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEA,0x8C,0xDD,0xDC,0xDC,0xBC,0xCC,0xDC,0xCC,0xDB,0xDC,0xDD,0xCC,0xBB, + 0xBB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xBA,0xA9,0xAA,0xAA,0xAA,0xBA,0xAA,0x76,0x54,0x54,0x45,0x44,0x54, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x67,0x77,0x78,0x77,0x78, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x77,0x76,0x66,0x66,0x66,0x77,0x77,0x76,0x66,0x76,0x77, + 0x76,0x66,0x76,0x66,0x66,0x76,0x76,0x66,0x67,0x76,0x66,0x66,0x76,0x66,0x66,0x76, + 0x65,0x65,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x67,0x77, + 0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x76,0x77,0x45,0x44, + 0x44,0x44,0x45,0x44,0x44,0x54,0x45,0x56,0x9A,0xAA,0xAA,0xAA,0x9B,0xAA,0xA9,0x99, + 0xA9,0xAA,0x9A,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0xA9,0xA9,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBC,0xBC,0xCD,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xD9,0x8C,0xDD,0xCD,0xBC,0xDC,0xDB,0xCC,0xDC,0xCD,0xCC,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xCD,0xBA,0x9A,0x9A,0x9A,0xAA,0xAA,0xA8,0x75,0x54,0x45,0x44,0x54,0x44, + 0x44,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x45,0x45,0x56,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x67,0x76,0x66,0x67,0x66,0x66,0x67,0x77,0x67,0x67,0x67,0x76, + 0x66,0x67,0x76,0x76,0x67,0x67,0x76,0x65,0x67,0x66,0x65,0x67,0x76,0x56,0x67,0x76, + 0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x76,0x77,0x67,0x77,0x77, + 0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x68,0x74,0x45, + 0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x56,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xA9,0xA9, + 0x9A,0x9A,0xAA,0xAA,0xAA,0x99,0x9A,0xAA,0xAA,0x9A,0x9A,0xAA,0x9A,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xCB,0xCB,0xCD,0xDE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xC8,0x8D,0xDD,0xDC,0xDC,0xCC,0xDD,0xDD,0xCC,0xDC,0xCD,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xAA,0xAA,0xAA,0xAA,0xAA,0xA7,0x65,0x54,0x54,0x54,0x44,0x45, + 0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x78,0x77,0x87,0x78,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x67,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x77,0x77,0x77, + 0x76,0x66,0x77,0x77,0x77,0x77,0x76,0x56,0x67,0x66,0x55,0x65,0x65,0x56,0x67,0x77, + 0x76,0x77,0x67,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x76,0x87,0x44, + 0x44,0x54,0x44,0x45,0x44,0x54,0x45,0x67,0xAB,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xAA, + 0x99,0x9A,0x9A,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0xA9,0xAA,0xAA,0x9A,0xAA,0xAA, + 0xAA,0xBB,0xCC,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xBB,0xCB,0xDD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xA8,0x9D,0xDD,0xCD,0xBC,0xDD,0xDD,0xED,0xDB,0xBD,0xBC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x97,0x65,0x45,0x44,0x45,0x44,0x44, + 0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x54,0x57,0x77,0x87,0x77,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x67,0x77, + 0x66,0x66,0x66,0x67,0x67,0x66,0x65,0x65,0x66,0x56,0x55,0x55,0x55,0x56,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x76,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x68,0x64, + 0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x57,0x9A,0xA9,0xAA,0xBA,0xBA,0xBB,0xBB,0xAA, + 0xA9,0x99,0xA9,0xAA,0xA9,0xA9,0x9A,0xAA,0xA9,0xA9,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xBC,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDE,0xDD,0xDD,0xBB,0xBB,0xCD,0xDE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0x98,0xAD,0xDD,0xDB,0xDC,0xBD,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB,0xAB, + 0xBB,0xBB,0xCB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0x86,0x55,0x54,0x45,0x44,0x44,0x54, + 0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x56,0x77,0x77,0x77,0x77,0x87,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x67,0x67,0x66,0x67,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x67,0x66,0x65,0x55,0x55,0x55,0x66,0x65,0x55,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67, + 0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x85, + 0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x57,0xAA,0xA9,0x99,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xA9,0x9A,0x9A,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0xAA,0xAA, + 0xAB,0xBB,0xCB,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDB,0xBB,0xBB,0xDD,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xED,0x97,0xAD,0xDD,0xCD,0xBC,0xDD,0xDE,0xDD,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xBB,0xAA,0xAB,0xAA,0xAA,0xB9,0x75,0x54,0x44,0x54,0x54,0x54,0x44, + 0x45,0x44,0x45,0x44,0x44,0x54,0x45,0x45,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x56,0x66,0x67,0x77,0x77,0x66,0x66,0x77,0x77,0x77,0x77, + 0x66,0x66,0x66,0x66,0x66,0x65,0x56,0x66,0x55,0x56,0x77,0x65,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78, + 0x54,0x44,0x44,0x44,0x54,0x44,0x54,0x57,0xAA,0x99,0x9A,0xAB,0xAB,0xBB,0xBB,0xBA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0xAA,0xAB,0xBB, + 0xBB,0xBC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xBB,0xBB,0xCD,0xDE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEB,0x87,0xBC,0xDD,0xDC,0xDC,0xCD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB, + 0xBB,0xBB,0xDD,0xBA,0xAA,0xDD,0xAA,0xAA,0xB8,0x65,0x54,0x54,0x54,0x44,0x44,0x44, + 0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x57,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x76,0x66,0x67,0x66,0x56,0x67,0x77,0x76,0x67, + 0x66,0x67,0x66,0x67,0x66,0x66,0x56,0x66,0x56,0x67,0x76,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76, + 0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77, + 0x74,0x44,0x54,0x44,0x44,0x54,0x45,0x58,0xAA,0x99,0x99,0x9A,0xAA,0xAA,0xBA,0xBB, + 0xBA,0xBA,0xA9,0xAA,0xAA,0xAA,0x9A,0xAA,0xBA,0xBB,0xAA,0xBA,0xAA,0xAA,0xAB,0xBC, + 0xCB,0xBD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDC,0xBB,0xBB,0xDE, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xEA,0x88,0xCD,0xDD,0xCD,0xBD,0xCD,0xDD,0xDD,0xCC,0xBB,0xCB,0xCC,0xCB,0xBC, + 0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xAA,0xBA,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xBB, + 0xCC,0xAA,0xBD,0xBA,0xA9,0xBA,0x99,0xAA,0xA7,0x65,0x45,0x44,0x44,0x54,0x45,0x45, + 0x44,0x44,0x44,0x54,0x44,0x45,0x46,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x77,0x66,0x66,0x66,0x76,0x66,0x66,0x67,0x66,0x66,0x65,0x66,0x66,0x66, + 0x76,0x56,0x66,0x67,0x77,0x66,0x66,0x76,0x66,0x77,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77, + 0x75,0x54,0x44,0x54,0x45,0x44,0x55,0x58,0xBA,0x99,0x9A,0x99,0xA9,0xAA,0xAB,0xBB, + 0xBB,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDC,0xBB,0xBB,0xCD, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xE9,0x78,0xCD,0xDD,0xDC,0xDC,0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBC,0xCD,0xDC, + 0xCC,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xAA,0xAA,0xBA,0xAA,0xAA,0x9A,0xAA,0xBA,0xBB, + 0xDE,0xDB,0xBA,0xAA,0x99,0x98,0x99,0xAA,0x87,0x55,0x54,0x54,0x54,0x44,0x44,0x44, + 0x45,0x44,0x54,0x44,0x44,0x55,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x78, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x66,0x66,0x76,0x76,0x66,0x67,0x76,0x66,0x66,0x66,0x76,0x66, + 0x65,0x65,0x55,0x66,0x76,0x65,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x77, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77, + 0x65,0x45,0x44,0x44,0x44,0x45,0x45,0x68,0xBA,0x99,0x99,0x9A,0x9A,0x9A,0xAA,0xAB, + 0xAB,0xAB,0xAA,0x9A,0xAA,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xBB,0xCB, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDE,0xDD,0xED,0xDD,0xCB,0xBB,0xBC, + 0xDE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xD9,0x88,0xCD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDB,0xCB,0xBB,0xCC,0xDD,0xDD,0xCD, + 0xBB,0xBB,0xBC,0xBC,0xCD,0xBC,0xBB,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xBC, + 0xCD,0xED,0xED,0xAA,0x99,0x89,0x99,0xAA,0x86,0x54,0x44,0x44,0x44,0x44,0x45,0x45, + 0x44,0x44,0x44,0x44,0x54,0x56,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x66,0x67,0x67,0x66,0x66,0x67,0x66,0x67,0x66,0x66,0x77,0x76, + 0x65,0x55,0x65,0x66,0x76,0x56,0x56,0x67,0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x65,0x44,0x44,0x54,0x45,0x44,0x55,0x69,0xA9,0x99,0x99,0xAA,0xA9,0xA9,0xAA,0xAA, + 0xBB,0xBB,0xAA,0xA9,0x9A,0xA9,0xAA,0xAB,0xBB,0xBC,0xBC,0xBC,0xBB,0xAA,0xBB,0xBC, + 0xDD,0xDD,0xDC,0xDC,0xDB,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDB,0xBB,0xBB, + 0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xC8,0x78,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCC,0xBB,0xBB,0xDD,0xDD,0xDB, + 0xDC,0xBB,0xBB,0xBB,0xCC,0xCC,0xBB,0xAA,0xAA,0xAB,0xAA,0xA9,0xA9,0xAA,0xBA,0xBB, + 0xDC,0xDD,0xDE,0xCA,0x98,0x98,0x99,0xAA,0x75,0x55,0x45,0x45,0x45,0x45,0x44,0x44, + 0x45,0x44,0x44,0x54,0x46,0x78,0x77,0x78,0x78,0x77,0x78,0x77,0x77,0x87,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x67,0x66,0x66,0x76,0x76,0x66,0x76,0x67,0x66,0x76,0x76,0x66,0x76,0x66,0x67,0x76, + 0x66,0x55,0x55,0x56,0x56,0x56,0x66,0x77,0x77,0x77,0x67,0x76,0x66,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77, + 0x65,0x45,0x44,0x44,0x44,0x45,0x45,0x69,0xA9,0x89,0x99,0xA9,0xA9,0xA9,0xA9,0xAA, + 0xAB,0xAB,0xAB,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xBB,0xCC,0xCB,0xBA,0xBA,0xBA,0xBC, + 0xCD,0xDD,0xDD,0xDC,0xDC,0xCC,0xDC,0xDC,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDB,0xBB, + 0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xB8,0x78,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xCC,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD, + 0xBC,0xCB,0xBB,0xBC,0xCC,0xDB,0xBB,0xBA,0x9A,0xBB,0xBA,0xAA,0x9A,0xAA,0xAB,0xBB, + 0xCD,0xDD,0xCD,0xDA,0x99,0x89,0x9A,0xB8,0x76,0x54,0x54,0x54,0x44,0x44,0x44,0x54, + 0x44,0x45,0x44,0x44,0x67,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66, + 0x66,0x56,0x67,0x77,0x66,0x67,0x77,0x66,0x66,0x67,0x66,0x67,0x66,0x66,0x76,0x67, + 0x65,0x65,0x56,0x66,0x66,0x56,0x77,0x77,0x76,0x66,0x55,0x55,0x56,0x66,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x67,0x77,0x77, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77, + 0x65,0x44,0x44,0x44,0x44,0x44,0x55,0x79,0xA9,0x99,0x99,0xA9,0xA9,0xA9,0xA9,0x9A, + 0xAA,0xBB,0xBA,0xAA,0x99,0xA9,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAB,0xBB, + 0xCD,0xDD,0xCD,0xCC,0xCD,0xCD,0xBD,0xDD,0xDC,0xDD,0xDD,0xED,0xDE,0xDD,0xCB,0xBB, + 0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x78,0xDE,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCB,0xBB,0xBB,0xDD,0xDD,0xDC, + 0xDC,0xBC,0xBB,0xBC,0xBC,0xCB,0xDB,0xBA,0x9A,0xBC,0xBB,0xAA,0x9A,0x9A,0xAA,0xBB, + 0xBC,0xCD,0xBA,0xCA,0x99,0x89,0x99,0xA7,0x65,0x55,0x45,0x45,0x44,0x44,0x54,0x45, + 0x44,0x44,0x45,0x57,0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66, + 0x66,0x66,0x66,0x77,0x76,0x66,0x77,0x76,0x66,0x77,0x77,0x77,0x66,0x66,0x76,0x65, + 0x65,0x56,0x66,0x66,0x77,0x67,0x77,0x66,0x67,0x65,0x55,0x55,0x55,0x55,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77, + 0x54,0x45,0x45,0x44,0x45,0x44,0x55,0x7A,0xA9,0x99,0x99,0x99,0x9A,0x9A,0x99,0xA9, + 0xAA,0xAB,0xAB,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB, + 0xBD,0xCD,0xCC,0xBD,0xCB,0xDC,0xDC,0xDB,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCB, + 0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x7A,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD, + 0xCD,0xBB,0xBB,0xBB,0xCC,0xBC,0xCB,0xCB,0xBC,0xDC,0xDB,0xBA,0xA9,0xAA,0xAA,0xBA, + 0xAA,0xAB,0xCA,0x9A,0x99,0x89,0x9A,0x87,0x66,0x55,0x45,0x44,0x45,0x44,0x44,0x44, + 0x45,0x44,0x45,0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66, + 0x66,0x66,0x66,0x77,0x76,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x56,0x55,0x56, + 0x56,0x66,0x76,0x77,0x77,0x77,0x77,0x65,0x55,0x55,0x55,0x55,0x45,0x55,0x56,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x56,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x44,0x44,0x44,0x45,0x44,0x45,0x56,0x8B,0xA9,0x98,0x99,0x99,0xA9,0xA9,0x99,0x9A, + 0x9A,0xAA,0xBB,0xBA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB, + 0xBC,0xCD,0xCD,0xBC,0xDB,0xDB,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xCB, + 0xBB,0xBB,0xCD,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0x98,0x7B,0xEE,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB,0xCC,0xDD,0xCD, + 0xCC,0xCB,0xBB,0xBB,0xCB,0xDB,0xDC,0xCC,0xCD,0xDD,0xDD,0xCA,0xAA,0x9A,0xAA,0xAB, + 0xAA,0xA9,0xED,0xA9,0xA9,0x99,0xAB,0x87,0x55,0x54,0x54,0x54,0x44,0x44,0x54,0x45, + 0x44,0x44,0x67,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67, + 0x77,0x66,0x67,0x77,0x76,0x66,0x66,0x77,0x77,0x77,0x77,0x66,0x65,0x65,0x56,0x66, + 0x56,0x67,0x67,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x65,0x55,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65, + 0x45,0x44,0x45,0x44,0x44,0x54,0x56,0x8B,0xB9,0x99,0x98,0x99,0xAA,0xAA,0x9A,0x99, + 0x9A,0xAA,0xAB,0xAB,0xAA,0x9A,0x9A,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB, + 0xBB,0xCC,0xCC,0xDD,0xCD,0xCD,0xBD,0xCD,0xBD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD, + 0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xA8,0x7D,0xEE,0xDD,0xDD,0xCD,0xDC,0xDD,0xCC,0xCC,0xBC,0xCC,0xDB,0xDB,0xDB, + 0xDB,0xCB,0xBB,0xCC,0xCC,0xCC,0xCC,0xDC,0xDC,0xDD,0xDD,0xBB,0xBA,0x9A,0x9A,0xAA, + 0xAA,0xAA,0xBC,0xA9,0x99,0x9A,0xAA,0x86,0x55,0x45,0x44,0x44,0x54,0x54,0x44,0x44, + 0x45,0x47,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x77, + 0x77,0x76,0x67,0x77,0x76,0x66,0x66,0x67,0x77,0x77,0x76,0x66,0x56,0x66,0x66,0x77, + 0x77,0x77,0x77,0x76,0x67,0x76,0x55,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x77,0x65,0x57,0x65,0x56,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44, + 0x44,0x44,0x44,0x44,0x54,0x45,0x56,0x8A,0x99,0x99,0x99,0x99,0x9A,0x9A,0x99,0xA9, + 0xA9,0xAA,0xAB,0xBA,0xAA,0xA9,0xAA,0xAA,0xAB,0xAA,0xBA,0xBA,0xBA,0xAB,0xAB,0xBB, + 0xBB,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD, + 0xBB,0xBB,0xBB,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x98,0x7D,0xEE,0xED,0xDD,0xDC,0xDD,0xDC,0xDC,0xCB,0xCB,0xBC,0xBD,0xBD,0xCC, + 0xBC,0xBB,0xBC,0xBC,0xCC,0xBD,0xBD,0xCC,0xDD,0xDD,0xDD,0xDC,0xBA,0xA9,0xA9,0xA9, + 0xA9,0xAA,0xAB,0xA9,0x89,0x9A,0xB9,0x76,0x54,0x54,0x54,0x54,0x44,0x45,0x44,0x44, + 0x45,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x77, + 0x77,0x77,0x77,0x77,0x76,0x66,0x56,0x76,0x66,0x67,0x66,0x56,0x66,0x66,0x67,0x77, + 0x77,0x77,0x77,0x76,0x65,0x65,0x55,0x66,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x56,0x76,0x65,0x55,0x76,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x55,0x45, + 0x44,0x44,0x54,0x54,0x44,0x45,0x56,0x99,0x99,0x99,0x89,0x99,0xA9,0xA9,0xA9,0x99, + 0x9A,0xAA,0xBA,0xBB,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAB, + 0xBC,0xCC,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCB,0xBB,0xBD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x97,0x8E,0xEE,0xDD,0xDC,0xDC,0xDC,0xDB,0xCC,0xBC,0xCC,0xDB,0xCC,0xCB,0xCC, + 0xCC,0xCC,0xBB,0xCB,0xCD,0xBC,0xCC,0xDD,0xCD,0xDD,0xCD,0xDC,0xCB,0xAA,0x9A,0x99, + 0x99,0xAA,0x99,0x99,0x89,0x9B,0xCA,0x75,0x54,0x54,0x44,0x45,0x44,0x44,0x45,0x44, + 0x57,0x77,0x78,0x78,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x65,0x55,0x55,0x56,0x77,0x66,0x55,0x55,0x54,0x55,0x55,0x56,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x67,0x65,0x55,0x66,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44, + 0x45,0x45,0x55,0x45,0x45,0x55,0x57,0x99,0x98,0x99,0x99,0x99,0x99,0x99,0x9A,0x9A, + 0xAA,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xBA,0xAB,0xAA,0xBA,0xBB, + 0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xBB,0xBB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x97,0x8E,0xEE,0xED,0xDD,0xDD,0xCD,0xCC,0xCB,0xCB,0xCC,0xBD,0xBD,0xBD,0xCC, + 0xBC,0xCC,0xBC,0xBC,0xCC,0xCC,0xBD,0xCC,0xDD,0xCD,0xDD,0xCD,0xCB,0xBA,0xA9,0x99, + 0x99,0x99,0x99,0x98,0x89,0x9B,0xB8,0x75,0x54,0x54,0x45,0x44,0x44,0x54,0x44,0x45, + 0x77,0x78,0x77,0x77,0x87,0x87,0x77,0x78,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x76,0x65,0x67,0x76,0x67,0x77,0x77,0x77, + 0x77,0x77,0x65,0x55,0x55,0x55,0x56,0x67,0x76,0x55,0x55,0x55,0x55,0x55,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x56,0x76,0x56,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x68,0xA9,0x88,0x89,0x98,0x99,0x99,0x99,0x99,0x9A, + 0xAB,0xAB,0xAB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xBA, + 0xBB,0xCD,0xDD,0xDE,0xDE,0xDD,0xDD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xBB,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x97,0x9E,0xEE,0xED,0xDD,0xCD,0xCC,0xCC,0xCC,0xBD,0xCD,0xDC,0xDB,0xCC,0xCC, + 0xCD,0xBC,0xCB,0xBB,0xCC,0xCC,0xCC,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xBB,0xAA,0x99, + 0x98,0x9A,0xA9,0x98,0x89,0xAB,0xA7,0x65,0x45,0x45,0x44,0x45,0x45,0x44,0x54,0x57, + 0x78,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77,0x77,0x77, + 0x77,0x66,0x55,0x55,0x55,0x65,0x55,0x67,0x65,0x65,0x55,0x55,0x55,0x55,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x55,0x66,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x54,0x44, + 0x44,0x44,0x54,0x45,0x45,0x55,0x68,0xA9,0x88,0x89,0x9A,0x99,0x99,0x99,0x9A,0xAB, + 0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xCC,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCC,0xDC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xCB,0xBB,0xBC,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x97,0xAE,0xEE,0xED,0xDD,0xDD,0xCD,0xCC,0xCB,0xDC,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDB,0xDB,0xDC,0xDC,0xCB,0xDB,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xCB,0xBA,0xAA, + 0x99,0x99,0x99,0x99,0x99,0x9A,0x87,0x55,0x45,0x44,0x54,0x54,0x44,0x45,0x57,0x77, + 0x77,0x78,0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66, + 0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x76,0x56,0x67,0x77,0x77, + 0x76,0x66,0x55,0x55,0x66,0x76,0x65,0x55,0x66,0x76,0x65,0x55,0x55,0x55,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x55,0x66,0x55,0x67,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x45,0x45, + 0x44,0x44,0x44,0x44,0x44,0x56,0x79,0xA8,0x88,0x88,0x9A,0xBA,0x99,0xA9,0xAA,0xAA, + 0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA, + 0xBB,0xBD,0xCD,0xDD,0xED,0xED,0xED,0xDC,0xDD,0xBD,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCC,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xCE,0xEE,0xEE,0xDD,0xCD,0xCC,0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xCD,0xCC,0xBC,0xCD,0xCC,0xCD,0xCD,0xCD,0xCC,0xDB,0xDD,0xCD,0xDB,0xCB,0xBA, + 0x98,0x99,0x99,0x99,0x99,0xAA,0x86,0x55,0x54,0x54,0x44,0x44,0x54,0x45,0x77,0x77, + 0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x66,0x66,0x67,0x77,0x77,0x77,0x77,0x76,0x67,0x76,0x66,0x65,0x66,0x67,0x77,0x77, + 0x65,0x55,0x55,0x66,0x77,0x76,0x66,0x55,0x67,0x76,0x66,0x55,0x55,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x76,0x56,0x67,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x54,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x54,0x55,0x56,0x8A,0xA9,0x98,0x89,0x89,0xAA,0xBA,0xAA,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB, + 0xBB,0xBC,0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xCC,0xCC,0xDB,0xDB,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xBB,0xBB,0xBC,0xDE,0xEF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xDE,0xFE,0xED,0xDD,0xDC,0xCD,0xBD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDD,0xCD, + 0xDC,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xCD,0xDC,0xDC,0xCC,0xCC,0xDD,0xBD,0xCC,0xCB, + 0x99,0x99,0x99,0x99,0x99,0xA9,0x76,0x55,0x45,0x44,0x54,0x54,0x44,0x67,0x77,0x87, + 0x77,0x78,0x77,0x77,0x78,0x78,0x78,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x66,0x67,0x77,0x77,0x77,0x66, + 0x66,0x76,0x76,0x66,0x77,0x77,0x76,0x76,0x65,0x65,0x55,0x56,0x57,0x77,0x77,0x76, + 0x56,0x55,0x56,0x66,0x77,0x77,0x76,0x65,0x57,0x77,0x76,0x55,0x55,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x57,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x54,0x45,0x44,0x54,0x45, + 0x44,0x44,0x44,0x44,0x45,0x56,0x8A,0xAA,0x99,0x98,0x99,0xAA,0xAB,0xAB,0xAB,0xAB, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xAB,0xBB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBD,0xCD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xDE,0xEE,0xEE,0xDD,0xCD,0xBC,0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xDB,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDC,0xDC,0xDC,0xCD,0xBC,0xCD,0xCD,0xDD,0xDD,0xCC, + 0xA9,0x99,0x99,0x98,0x9A,0xA9,0x76,0x55,0x44,0x54,0x44,0x44,0x55,0x67,0x77,0x77, + 0x87,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x67,0x66,0x77,0x76,0x66, + 0x77,0x77,0x77,0x66,0x67,0x77,0x66,0x65,0x56,0x66,0x66,0x66,0x77,0x77,0x66,0x65, + 0x55,0x55,0x56,0x77,0x77,0x77,0x76,0x65,0x56,0x76,0x76,0x55,0x55,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x66,0x76,0x76,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x45,0x66,0x8A,0x99,0x9A,0x99,0x99,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBA, + 0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xCC,0xDC,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xBC,0xBB,0xBB,0xBC,0xDE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xDE,0xFE,0xED,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xBD,0xCC,0xBC,0xBC,0xCC,0xDC,0xDC,0xDC, + 0xBA,0xA9,0x99,0x99,0x99,0xA8,0x75,0x54,0x45,0x44,0x54,0x54,0x46,0x77,0x77,0x87, + 0x77,0x77,0x77,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x66,0x66,0x67,0x66,0x67, + 0x77,0x77,0x76,0x77,0x66,0x77,0x76,0x66,0x66,0x66,0x67,0x67,0x77,0x77,0x66,0x56, + 0x55,0x55,0x66,0x77,0x76,0x67,0x77,0x66,0x55,0x56,0x55,0x55,0x57,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x44,0x44,0x44,0x45,0x67,0xAA,0x99,0x9A,0xA9,0x8A,0xAB,0xAB,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xBB,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xDE,0xEE,0xEE,0xDD,0xDC,0xCD,0xCD,0xDC,0xDC,0xDC,0xDB,0xDB,0xCD,0xBD, + 0xCD,0xDD,0xDD,0xDC,0xDC,0xCB,0xDB,0xDC,0xDB,0xDB,0xCB,0xBC,0xCC,0xDD,0xCD,0xDD, + 0xCB,0xA9,0x9A,0x99,0x99,0xA8,0x65,0x54,0x54,0x44,0x44,0x44,0x55,0x77,0x78,0x77, + 0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x76,0x66,0x66,0x67,0x76, + 0x66,0x76,0x66,0x76,0x67,0x77,0x77,0x66,0x67,0x77,0x77,0x77,0x77,0x66,0x55,0x55, + 0x55,0x55,0x66,0x77,0x76,0x66,0x67,0x76,0x65,0x55,0x55,0x56,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x55,0x65,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x54,0x45,0x44,0x45,0x44,0x44,0x54, + 0x44,0x44,0x54,0x45,0x55,0x68,0xA9,0x98,0x89,0xAA,0xAA,0xBB,0xBA,0xBB,0xBA,0xBA, + 0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAB,0xAA,0xBA,0xAB,0xAA,0xAA,0xA9,0xAA,0xAA,0xBA, + 0xBA,0xBA,0xAA,0xBB,0xBB,0xBC,0xCC,0xDC,0xDD,0xDC,0xCC,0xCC,0xCC,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xEE,0xEF,0xEE,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xBD,0xCB,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xBD,0xBD,0xBD,0xCC,0xCB,0xCB,0xBC,0xCC,0xDC,0xDC, + 0xDB,0xA9,0x99,0xA9,0x9A,0xA7,0x65,0x55,0x45,0x45,0x45,0x44,0x56,0x77,0x77,0x77, + 0x77,0x77,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x66, + 0x66,0x76,0x66,0x76,0x76,0x77,0x77,0x76,0x66,0x77,0x77,0x77,0x76,0x65,0x65,0x55, + 0x56,0x65,0x55,0x67,0x77,0x66,0x66,0x77,0x65,0x55,0x55,0x67,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x65,0x55,0x76,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x44,0x54,0x56,0x78,0xA9,0x88,0x88,0x9A,0xAB,0xBA,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xDC,0xCC,0xDC,0xCC,0xBC,0xCB,0xDC,0xCD, + 0xCD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xEE,0xEE,0xEE,0xDD,0xDB,0xDC,0xDD,0xDC,0xCD,0xCD,0xBD,0xDC,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDC,0xDB,0xCC,0xCC,0xDC,0xCC,0xCB,0xCB,0xBB,0xCB,0xCC,0xDC,0xCC, + 0xCC,0xB9,0x99,0xBC,0xBA,0x97,0x65,0x45,0x44,0x44,0x44,0x45,0x45,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x77,0x76, + 0x67,0x76,0x66,0x77,0x66,0x77,0x77,0x76,0x66,0x77,0x77,0x77,0x65,0x55,0x55,0x66, + 0x67,0x76,0x55,0x67,0x77,0x76,0x66,0x77,0x65,0x55,0x66,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x65,0x55,0x57,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x45,0x44,0x45,0x56,0x79,0x98,0x88,0x98,0x9A,0xBA,0xBB,0xBA,0xBB,0xBA,0xBA, + 0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xBB,0xAA,0xBA,0xAA,0xAA,0x9A,0xAA, + 0xA9,0xA9,0x99,0x99,0x99,0x99,0x9A,0x9A,0xBA,0xBB,0xCB,0xBC,0xBB,0xCC,0xCD,0xBD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBD,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCC,0x88,0xDE,0xEF,0xEE,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xCC, + 0xCC,0xCB,0xDB,0xDB,0xDC,0xDC,0xDC,0xCB,0xDB,0xDC,0xBC,0xBC,0xBB,0xCB,0xCC,0xCB, + 0xBC,0xCB,0xDE,0xEC,0xBB,0x87,0x55,0x54,0x54,0x54,0x45,0x44,0x44,0x67,0x77,0x77, + 0x77,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x87,0x77,0x87,0x77,0x77, + 0x77,0x77,0x87,0x77,0x77,0x66,0x77,0x77,0x77,0x76,0x76,0x67,0x77,0x66,0x67,0x66, + 0x65,0x65,0x65,0x77,0x66,0x66,0x77,0x76,0x66,0x77,0x77,0x66,0x55,0x55,0x55,0x56, + 0x77,0x76,0x55,0x56,0x77,0x77,0x65,0x65,0x45,0x55,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x66,0x56,0x76,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x45,0x44, + 0x44,0x44,0x44,0x55,0x56,0x89,0x98,0x88,0x8A,0xAA,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB, + 0xAB,0xBB,0xBA,0xBA,0xAB,0xBA,0xBA,0xBA,0xBB,0xBA,0xBB,0xAA,0xAA,0x9A,0xAA,0x9A, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCD, + 0xCD,0xCD,0xCD,0xDD,0xDC,0xDC,0xBB,0xBB,0xBC,0xDE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x88,0xDE,0xEE,0xEE,0xED,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xDB, + 0xDB,0xCD,0xBD,0xDC,0xDC,0xCC,0xCC,0xDB,0xCB,0xCC,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB, + 0xBB,0xBC,0xDE,0xDB,0xAA,0x86,0x55,0x45,0x45,0x44,0x54,0x45,0x44,0x56,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x66,0x67,0x76,0x77,0x76, + 0x66,0x66,0x67,0x77,0x66,0x66,0x76,0x65,0x66,0x77,0x66,0x55,0x65,0x56,0x66,0x55, + 0x67,0x66,0x66,0x55,0x66,0x77,0x75,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x65,0x55,0x67,0x65,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x54,0x44,0x44,0x44,0x45,0x45,0x44,0x45, + 0x44,0x45,0x45,0x45,0x67,0x9A,0x98,0x99,0xAA,0xBA,0xBA,0xBB,0xAB,0xBB,0xBA,0xBB, + 0xBB,0xAB,0xAB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xA9,0xA9,0xA9, + 0x99,0x99,0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBC,0xCC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x88,0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xBD,0xCC,0xDB,0xDC,0xBD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xCB, + 0xBB,0xBB,0xBB,0xAA,0xAA,0x87,0x54,0x54,0x44,0x54,0x44,0x44,0x45,0x45,0x77,0x77, + 0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x78,0x77,0x87,0x77,0x77,0x77, + 0x77,0x87,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x66,0x67,0x76,0x66,0x77,0x77,0x77, + 0x67,0x67,0x77,0x77,0x66,0x56,0x56,0x56,0x67,0x77,0x66,0x55,0x55,0x56,0x66,0x65, + 0x65,0x66,0x76,0x65,0x56,0x76,0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x56,0x65,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x75,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x55,0x67,0x99,0x99,0x9A,0xAA,0xAB,0xAB,0xBA,0xBB,0xBA,0xBA,0xBB, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0x9A,0xA9,0x99, + 0x99,0x99,0xA9,0xA9,0x99,0x99,0x99,0x9A,0x99,0x99,0x9A,0xAA,0xBA,0xBB,0xBB,0xBC, + 0xCC,0xCD,0xCD,0xDD,0xDD,0xCD,0xDB,0xBB,0xBB,0xBC,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x88,0xDE,0xEE,0xFE,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDB,0xCC, + 0xCC,0xCC,0xCD,0xCC,0xDC,0xCD,0xCC,0xDB,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xBA,0xAA,0xAA,0x86,0x55,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x57,0x77, + 0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x67,0x77,0x78,0x77,0x77,0x76,0x66,0x77,0x66,0x66,0x77,0x77, + 0x77,0x77,0x77,0x76,0x66,0x55,0x55,0x66,0x77,0x76,0x65,0x55,0x56,0x77,0x77,0x65, + 0x55,0x67,0x77,0x66,0x55,0x65,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x66,0x76, + 0x77,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54, + 0x45,0x45,0x45,0x55,0x68,0xA9,0x89,0xAA,0xBA,0xAA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBA, + 0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xBB,0xBA,0xAA,0xA9,0xA9,0x99,0x99, + 0x9A,0x99,0x99,0x99,0xA9,0xA9,0xA9,0x99,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBB, + 0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xBB,0xBA,0xBB,0xCE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x88,0xCD,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xCB,0xCB, + 0xCB,0xCB,0xCC,0xCD,0xBD,0xCD,0xBD,0xCD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAA,0x86,0x55,0x54,0x44,0x45,0x44,0x44,0x54,0x45,0x45,0x77, + 0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x87, + 0x77,0x78,0x77,0x76,0x67,0x77,0x77,0x78,0x77,0x77,0x76,0x66,0x66,0x76,0x66,0x77, + 0x77,0x77,0x77,0x66,0x66,0x66,0x65,0x77,0x77,0x77,0x65,0x56,0x67,0x77,0x77,0x76, + 0x65,0x57,0x77,0x76,0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x76,0x65,0x65, + 0x66,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x75,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x44,0x56,0x78,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xAB,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xBA,0xAA,0x9A,0x9A,0x99,0x99, + 0x99,0x9A,0x9A,0x9A,0x99,0x99,0x9A,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xBB, + 0xBB,0xCC,0xBD,0xCD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEA,0x88,0xBE,0xEE,0xFE,0xEE,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDC,0xCC,0xDB,0xBB, + 0xBC,0xCC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB, + 0xBA,0xBA,0xBB,0xBB,0xBB,0x85,0x54,0x54,0x54,0x44,0x45,0x44,0x44,0x44,0x45,0x67, + 0x77,0x78,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x77,0x77, + 0x87,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x77,0x66,0x76, + 0x67,0x77,0x76,0x56,0x67,0x76,0x77,0x77,0x77,0x76,0x55,0x66,0x77,0x77,0x77,0x77, + 0x55,0x56,0x77,0x66,0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55, + 0x76,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x67,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x46,0x88,0x44,0x45,0x45, + 0x44,0x54,0x45,0x56,0x89,0xAA,0xAB,0xAB,0xAA,0xAB,0xAA,0xAB,0xAB,0xAB,0xBA,0xBB, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xCC,0xCC,0xCC,0xBB,0xBB,0xAA,0xAA,0x9A,0x99,0x99,0x99, + 0x9A,0x99,0x99,0x99,0xA9,0xA9,0x99,0x99,0x99,0xA9,0x99,0x99,0x9A,0xAA,0xAA,0xBB, + 0xBB,0xBC,0xCD,0xCD,0xDD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEA,0x88,0xBD,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDC,0xBC,0xBC, + 0xBC,0xCC,0xBD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xAB,0xBB,0x86,0x55,0x44,0x45,0x45,0x44,0x54,0x45,0x44,0x44,0x56, + 0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x78,0x78,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x76,0x66,0x56, + 0x65,0x66,0x65,0x56,0x67,0x77,0x77,0x77,0x76,0x55,0x55,0x67,0x77,0x76,0x67,0x77, + 0x76,0x55,0x56,0x65,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55, + 0x67,0x65,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x65,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x47,0xBA,0x74,0x44,0x44, + 0x44,0x44,0x55,0x57,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xAA,0xAB,0xBA,0xBB,0xBA, + 0xBA,0xBB,0xBB,0xBB,0xCB,0xBC,0xCC,0xCC,0xBB,0xBA,0xAA,0xA9,0xAA,0x99,0x99,0x9A, + 0x99,0xA9,0xA9,0xA9,0xA9,0x99,0x99,0x99,0xA9,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAA, + 0xBB,0xBB,0xCB,0xDC,0xCD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x88,0xAD,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC,0xDD,0xCC,0xBC,0xBC,0xBC, + 0xBC,0xBC,0xDC,0xDD,0xDD,0xDC,0xDC,0xDB,0xDB,0xDB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB, + 0xAB,0xAB,0xAB,0xBB,0xBA,0x76,0x54,0x54,0x54,0x44,0x45,0x44,0x44,0x45,0x44,0x45, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x78,0x78,0x77,0x77,0x77,0x78, + 0x77,0x87,0x77,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55, + 0x55,0x65,0x56,0x67,0x77,0x77,0x77,0x77,0x65,0x56,0x67,0x77,0x77,0x77,0x66,0x77, + 0x76,0x65,0x55,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x55, + 0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x77,0x56,0x44,0x44, + 0x54,0x45,0x45,0x68,0x9A,0xBA,0xAB,0xAA,0xAA,0xBB,0xAA,0xAB,0xBB,0xAB,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xDC,0xCC,0xCB,0xBB,0xBA,0xAA,0x9A,0x9A,0x99,0x99,0xA9, + 0xA9,0xA9,0xA9,0xA9,0x99,0xA9,0xA9,0xA9,0x99,0x99,0xA9,0x99,0x99,0x9A,0xAA,0xAA, + 0xBB,0xBB,0xBC,0xCD,0xDC,0xDD,0xDC,0xDC,0xCC,0xBB,0xAB,0xBC,0xEE,0xEF,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x87,0x9D,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xDD,0xDD,0xCD,0xCB,0xCB,0xBB, + 0xBB,0xCB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xCA,0x76,0x54,0x54,0x45,0x45,0x44,0x44,0x54,0x44,0x45,0x44, + 0x57,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77, + 0x77,0x77,0x76,0x65,0x66,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x65, + 0x55,0x56,0x57,0x77,0x77,0x77,0x77,0x66,0x55,0x66,0x77,0x77,0x77,0x77,0x76,0x67, + 0x77,0x65,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x76,0x55, + 0x66,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x47,0x88,0x44,0x44,0x9A,0x85,0x44, + 0x44,0x54,0x56,0x79,0xAA,0xAA,0xAA,0xBB,0xAA,0xAB,0xBB,0xAB,0xBA,0xBB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xCC,0xBB,0xBB,0xAA,0xAA,0xAA,0xA9,0x99,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0x9A,0x9A,0x99,0x99,0x99,0x99,0x99,0xA9,0xAA, + 0xAB,0xBB,0xBB,0xCC,0xBD,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xDD,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x87,0x9D,0xDE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBB, + 0xBC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDB,0xCC,0xBB,0xBB,0xBB,0xAB,0xAA, + 0xAB,0xAB,0xBB,0xBB,0xCA,0x76,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x54,0x44,0x45, + 0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x77, + 0x78,0x77,0x76,0x66,0x56,0x56,0x67,0x76,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x65, + 0x66,0x67,0x67,0x77,0x77,0x77,0x77,0x66,0x55,0x67,0x77,0x77,0x66,0x77,0x76,0x66, + 0x77,0x65,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x57,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x65,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x8A,0x9A,0x84,0x45,0x99,0x98,0x54, + 0x45,0x45,0x56,0x7A,0xBA,0xBA,0xBB,0xAA,0xBB,0xBB,0xAA,0xBB,0xAB,0xBA,0xBB,0xBB, + 0xBB,0xCB,0xCB,0xBB,0xCC,0xCB,0xBB,0xBA,0xBA,0xAA,0xA9,0xA9,0xA9,0x99,0x9A,0x9A, + 0x9A,0x9A,0xAA,0xA9,0xA9,0xA9,0xA9,0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA, + 0xAA,0xBB,0xBB,0xBC,0xCD,0xDC,0xDD,0xDC,0xDC,0xDB,0xBB,0xBB,0xBD,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x87,0x9C,0xDE,0xEE,0xEF,0xEE,0xED,0xDD,0xDC,0xDD,0xDC,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xCC,0xBD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDC,0xCC,0xBB,0xBB,0xAB,0xBA,0xAA, + 0xAA,0xBB,0xBB,0xBB,0xCA,0x76,0x55,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x45,0x44, + 0x44,0x57,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x78, + 0x77,0x77,0x77,0x66,0x65,0x65,0x66,0x66,0x56,0x66,0x77,0x77,0x77,0x77,0x77,0x75, + 0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x56,0x77,0x77,0x66,0x77,0x77,0x66, + 0x65,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x66,0x55,0x56,0x77, + 0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x69,0x99,0x89,0x98,0x44,0x59,0x99,0x84, + 0x44,0x55,0x67,0x8B,0xAB,0xAB,0xAB,0xBA,0xAA,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0x99,0x99,0xA9,0xA9, + 0xA9,0xAA,0xCC,0xAA,0x9A,0x9A,0x99,0xA9,0x9A,0x99,0x99,0xA9,0x99,0x99,0x9A,0x9A, + 0xAA,0xAA,0xBB,0xBB,0xCC,0xBD,0xDC,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x87,0x8C,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xDD,0xBC,0xCB,0xBB,0xBB, + 0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBA,0x9A, + 0xAB,0xBA,0xBB,0xBC,0xDA,0x76,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x45, + 0x44,0x56,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x77, + 0x78,0x77,0x77,0x67,0x66,0x65,0x65,0x55,0x55,0x56,0x65,0x67,0x77,0x77,0x77,0x77, + 0x77,0x56,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x67,0x77,0x75,0x67,0x77,0x76, + 0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x55,0x67,0x65,0x66,0x77, + 0x77,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77, + 0x64,0x45,0x45,0x44,0x54,0x45,0x44,0x47,0x99,0x89,0x89,0x99,0x74,0x46,0x9A,0x84, + 0x45,0x55,0x67,0x9B,0xBB,0xBB,0xBA,0xAA,0xAA,0xBB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xDB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0x9A,0x99,0x99,0xA9,0xA9, + 0xA9,0xAA,0xCB,0xBA,0xAA,0x99,0xA9,0x99,0xA9,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA, + 0x9A,0xAB,0xBA,0xBB,0xBC,0xDC,0xDD,0xDC,0xDC,0xDB,0xBB,0xBB,0xAB,0xCD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x87,0x8B,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xBD,0xCB,0xBB,0xBB,0xCB,0xAA, + 0xAA,0xAB,0xBB,0xBC,0xDA,0x75,0x54,0x54,0x54,0x54,0x54,0x54,0x44,0x54,0x45,0x44, + 0x45,0x45,0x67,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x78, + 0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x56,0x66,0x77,0x77,0x77,0x77, + 0x77,0x65,0x77,0x78,0x77,0x76,0x65,0x65,0x55,0x55,0x56,0x77,0x76,0x56,0x77,0x65, + 0x55,0x55,0x65,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x75,0x55,0x57,0x76,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x6A,0x98,0x87,0x47,0x99,0x96,0x44,0x46,0x45, + 0x45,0x56,0x78,0xAB,0xBB,0xBB,0xBA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBC,0xBC, + 0xCC,0xCC,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xA9,0x99,0x99,0xA9,0xA9, + 0x99,0x99,0xAC,0xBB,0xBA,0xAA,0x9A,0x9A,0x9A,0x99,0xA9,0x99,0x99,0x99,0xA9,0xAA, + 0xA9,0xAA,0xAB,0xBB,0xBB,0xCB,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBC,0xDE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCC,0x87,0x79,0xDD,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xDC,0xDD,0xCD,0xCB,0xBB,0xBA, + 0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xAA, + 0xAA,0xBA,0xBA,0xBB,0xD9,0x76,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x56,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x78,0x77, + 0x78,0x77,0x87,0x77,0x77,0x77,0x76,0x67,0x76,0x66,0x65,0x55,0x67,0x67,0x77,0x77, + 0x77,0x66,0x67,0x77,0x77,0x77,0x55,0x55,0x55,0x55,0x55,0x67,0x77,0x65,0x65,0x55, + 0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x55,0x77,0x76,0x55,0x56,0x67,0x77,0x78, + 0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54, + 0x44,0x44,0x54,0x45,0x44,0x45,0x45,0x6A,0x98,0x84,0x44,0x7A,0x99,0x54,0x44,0x44, + 0x45,0x66,0x7A,0xBB,0xCC,0xCC,0xBA,0xAA,0xAA,0xBA,0xAB,0xBB,0xBB,0xBC,0xCC,0xCD, + 0xBD,0xCC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xA9,0x99,0x9A,0x9A,0x9A, + 0x99,0x9A,0xAA,0xAB,0xCC,0xAA,0xA9,0x99,0x99,0xA9,0x99,0xA9,0x99,0x99,0x9A,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xCC,0xDD,0xCD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xCE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0x87,0x79,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDC,0xCC,0xBB,0xAB,0xBB,0xBA, + 0xAA,0xAB,0xBB,0xBB,0xC9,0x75,0x55,0x44,0x54,0x44,0x45,0x45,0x45,0x44,0x44,0x54, + 0x44,0x45,0x45,0x77,0x77,0x77,0x77,0x77,0x87,0x87,0x77,0x78,0x77,0x78,0x77,0x78, + 0x77,0x77,0x77,0x78,0x77,0x77,0x76,0x77,0x77,0x77,0x66,0x66,0x55,0x66,0x76,0x77, + 0x76,0x56,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x56,0x77,0x76,0x55,0x55, + 0x56,0x57,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x67,0x65,0x67,0x77,0x77,0x77, + 0x77,0x77,0x78,0x77,0x77,0x78,0x77,0x87,0x78,0x77,0x78,0x77,0x77,0x77,0x65,0x44, + 0x44,0x54,0x44,0x44,0x45,0x45,0x54,0x47,0x99,0x88,0x44,0x57,0x9A,0x64,0x44,0x45, + 0x55,0x67,0x9A,0xBB,0xCC,0xDD,0xBB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBC,0xBC,0xCC,0xDC, + 0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0x99,0x99,0xA9,0xAA,0x9A, + 0x99,0x99,0x9A,0xAA,0xBE,0xEB,0xAA,0xA9,0xA9,0x9A,0x9A,0x99,0x99,0x99,0x99,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xBC,0xCC,0xDC,0xDC,0xDD,0xDD,0xDB,0xBB,0xBB,0xBD,0xEE, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0x98,0x78,0xBD,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDC,0xCB,0xBA, + 0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xCD,0xDB,0xDD,0xCD,0xBD,0xBC,0xCB,0xBB,0xBB,0xCB, + 0xAA,0xBA,0xBA,0xBB,0xB8,0x75,0x54,0x54,0x44,0x54,0x54,0x44,0x44,0x44,0x54,0x44, + 0x45,0x44,0x44,0x57,0x77,0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x78,0x77,0x87,0x77, + 0x78,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x78,0x77,0x77,0x76,0x65,0x66,0x56,0x67, + 0x76,0x65,0x77,0x77,0x77,0x75,0x55,0x55,0x55,0x55,0x55,0x55,0x77,0x65,0x55,0x56, + 0x56,0x77,0x77,0x87,0x77,0x77,0x65,0x67,0x77,0x65,0x56,0x77,0x67,0x77,0x87,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x54,0x45, + 0x44,0x44,0x45,0x44,0x44,0x7A,0x96,0x44,0x6A,0x99,0x84,0x44,0x56,0x54,0x54,0x54, + 0x56,0x68,0x9B,0xBB,0xBB,0xCD,0xBA,0xBB,0xBB,0xAB,0xBB,0xBC,0xCB,0xDC,0xDC,0xDC, + 0xDC,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0x99,0x99,0x9A,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0xAC,0xDD,0xDA,0x9A,0x99,0xA9,0x99,0x9A,0x99,0xA9,0x99,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xBA,0xBB,0xDE, + 0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xA8,0x78,0xAD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xAB,0xBB,0xCC,0xCD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBC,0xBB, + 0xBA,0xAB,0xBB,0xBB,0xC9,0x76,0x55,0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x76,0x77,0x65,0x66,0x56, + 0x66,0x67,0x77,0x78,0x77,0x66,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x67,0x77, + 0x67,0x77,0x77,0x77,0x77,0x77,0x66,0x55,0x67,0x65,0x56,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x54,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x7A,0xA7,0x44,0x47,0xA9,0x88,0x44,0x44,0x44,0x45,0x45, + 0x67,0x79,0xAA,0xBB,0xBB,0xBB,0xAA,0xBC,0xBB,0xBB,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD, + 0xDD,0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xAA,0x99,0x99,0x9A,0x9A,0xA9, + 0xA9,0x99,0xA9,0xA9,0xAA,0xBB,0xEE,0xB9,0xAA,0x99,0xA9,0x99,0xA9,0x99,0x99,0x9A, + 0xAA,0xAA,0xAA,0xAB,0xBA,0xBB,0xBC,0xCC,0xDC,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBD, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xA8,0x78,0xAD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xCB,0xBA, + 0xAB,0xAB,0xBB,0xCC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBC,0xDB, + 0xAA,0xBA,0xBA,0xBB,0xB9,0x76,0x55,0x45,0x44,0x44,0x45,0x45,0x45,0x44,0x54,0x45, + 0x44,0x44,0x44,0x45,0x67,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x78,0x78,0x77,0x77, + 0x87,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x77,0x78,0x77,0x87,0x77,0x67,0x65,0x66, + 0x56,0x67,0x77,0x87,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x77,0x77, + 0x78,0x77,0x87,0x77,0x77,0x77,0x76,0x55,0x57,0x76,0x56,0x77,0x77,0x77,0x77,0x87, + 0x77,0x87,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x75,0x45,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x46,0x75,0x75,0x44,0x7A,0x9A,0x54,0x45,0x44,0x54,0x55, + 0x67,0x8A,0xAB,0xBA,0xBB,0xAB,0xAB,0xDD,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xCB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xAA,0xBA,0x99,0x99,0x9A,0xA9,0xAA, + 0x9A,0x99,0x9A,0xA9,0xA9,0xAA,0xBC,0xCB,0xAA,0x9A,0x99,0xA9,0x99,0x99,0x99,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xCD,0xCD,0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xBC, + 0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBC,0xB8,0x78,0x9B,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xAA,0xAB,0xBB,0xCB,0xDB,0xDC,0xDC,0xDD,0xCD,0xCD,0xBD,0xCD,0xCB,0xBB,0xBD,0xBA, + 0xAA,0xAB,0xBB,0xBB,0xC9,0x76,0x54,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x56,0x77,0x77,0x77,0x87,0x87,0x77,0x78,0x77,0x77,0x77,0x87, + 0x78,0x78,0x77,0x78,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x87,0x77,0x76,0x77, + 0x66,0x67,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x76,0x77,0x55,0x56,0x77,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x76,0x54,0x44,0x44,0x44, + 0x54,0x54,0x44,0x79,0x95,0x44,0x48,0xA9,0x64,0x47,0x87,0x45,0x44,0x45,0x44,0x55, + 0x67,0x9B,0xBB,0xBB,0xAB,0xAA,0xAB,0xCB,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xAB,0x99,0x89,0xA9,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0xAA,0x9A,0xAA,0xBC,0xAA,0x9A,0x9A,0x99,0x9A,0x99,0x99,0x9A, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xCC,0xBD,0xCD,0xCD,0xDD,0xDC,0xBB,0xBA,0xBB, + 0xCD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xD8,0x78,0xAB,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDC,0xCB, + 0xAA,0xAA,0xAB,0xBB,0xBC,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xBC,0xBC,0xBB,0xBB,0xBB, + 0xAA,0xBA,0xBA,0xBB,0xC9,0x76,0x55,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44, + 0x45,0x44,0x45,0x44,0x45,0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x78,0x78,0x78,0x77, + 0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77, + 0x66,0x77,0x87,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x56,0x57,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x65,0x55,0x66,0x55,0x55,0x67,0x77,0x87,0x78,0x77,0x77,0x77, + 0x87,0x87,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x44,0x44,0x54, + 0x44,0x44,0x58,0xA9,0x99,0x54,0x48,0xA9,0x95,0x44,0x44,0x44,0x45,0x44,0x55,0x56, + 0x78,0xCC,0xBB,0xCB,0xBA,0xAA,0xAB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDE,0xDD,0xED, + 0xDD,0xCB,0xCB,0xBB,0xBA,0xBA,0xAB,0xBA,0xBB,0xBA,0xBA,0x99,0x99,0x9A,0xAA,0xAA, + 0xAA,0x99,0x9A,0xAA,0xA9,0xAA,0xAA,0xAA,0xBA,0xAA,0x99,0xA9,0x99,0x9A,0x99,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xDC,0xDD,0xDD,0xDC,0xDC,0xDB,0xBB,0xBB, + 0xBD,0xEE,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xD9,0x87,0xAB,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCB, + 0xAA,0xAA,0xAA,0xBB,0xBC,0xBC,0xDC,0xDD,0xDC,0xDD,0xCD,0xBD,0xCB,0xBB,0xAB,0xCB, + 0xAA,0xAB,0xBB,0xAB,0xB9,0x76,0x54,0x54,0x45,0x45,0x44,0x54,0x45,0x44,0x54,0x54, + 0x44,0x44,0x44,0x45,0x44,0x57,0x77,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77, + 0x87,0x87,0x77,0x87,0x87,0x77,0x77,0x77,0x87,0x87,0x77,0x78,0x78,0x78,0x78,0x77, + 0x77,0x77,0x77,0x78,0x77,0x77,0x56,0x66,0x55,0x55,0x66,0x77,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x76,0x55,0x56,0x76,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x87,0x87, + 0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x76,0x54,0x45,0x44,0x54,0x44, + 0x45,0x47,0x99,0x98,0x89,0x84,0x45,0x89,0x98,0x44,0x45,0x44,0x54,0x45,0x45,0x66, + 0x79,0xBA,0xBB,0xCC,0xBB,0xAA,0xAC,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD,0xED,0xEE,0xDD, + 0xDD,0xDD,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xBB,0xBA,0xA9,0x89,0x99,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x99,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0x9A, + 0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBC,0xBD,0xCD,0xCD,0xDD,0xDD,0xCD,0xBB,0xBB, + 0xBB,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xAA,0xDA,0x87,0x9B,0xCD,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xCB, + 0xBA,0xAA,0xAA,0xBA,0xBB,0xCD,0xCD,0xDD,0xDD,0xDC,0xDB,0xDB,0xCC,0xBB,0xAB,0xAA, + 0xAB,0xBB,0xAB,0xBB,0xB9,0x76,0x55,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x45,0x44,0x44,0x44,0x45,0x77,0x77,0x87,0x77,0x78,0x77,0x78,0x78,0x78,0x77, + 0x77,0x78,0x77,0x77,0x77,0x87,0x87,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x78, + 0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x76,0x57,0x75,0x77,0x77,0x87,0x77,0x77,0x76, + 0x56,0x66,0x76,0x76,0x55,0x55,0x67,0x67,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77, + 0x87,0x87,0x78,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x54,0x44,0x44,0x44,0x45,0x45, + 0x44,0x7A,0x98,0x98,0x89,0x98,0x44,0x58,0xA7,0x44,0x44,0x45,0x44,0x54,0x55,0x67, + 0x99,0xAA,0xAA,0xBC,0xCA,0xA9,0xBC,0xBB,0xBC,0xDC,0xDD,0xDD,0xED,0xED,0xED,0xED, + 0xDD,0xDB,0xCB,0xBB,0xBA,0xBA,0xAB,0xAB,0xBB,0xAB,0xBA,0xA9,0x89,0x9A,0xA9,0xAA, + 0xA9,0xA9,0x99,0xAA,0xAA,0xA9,0xA9,0x99,0xAA,0xAA,0x99,0xA9,0x99,0x99,0x99,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xAB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xBB,0x87,0x9D,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xBB,0xAA,0xAA,0xAB,0xBB,0xCB,0xDC,0xDD,0xDC,0xDD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xAB,0xBA,0xBB,0xCA,0x76,0x54,0x54,0x45,0x45,0x45,0x45,0x45,0x44,0x44,0x54, + 0x44,0x44,0x45,0x44,0x45,0x44,0x57,0x77,0x77,0x78,0x77,0x77,0x87,0x77,0x77,0x78, + 0x78,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x87,0x78,0x78,0x77, + 0x77,0x78,0x77,0x77,0x87,0x77,0x78,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x65, + 0x77,0x77,0x75,0x57,0x75,0x55,0x56,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x87, + 0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x65,0x44,0x45,0x44,0x45,0x44,0x44, + 0x58,0x99,0x98,0x64,0x58,0x99,0x85,0x44,0x54,0x45,0x44,0x44,0x45,0x45,0x56,0x78, + 0x9A,0xAA,0xAA,0xAB,0xAA,0xAA,0xBA,0xBB,0xBC,0xBD,0xDD,0xDD,0xDE,0xEE,0xDE,0xDD, + 0xDD,0xCD,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xAB,0xBA,0xBA,0xA9,0x89,0x99,0x9A,0xAA, + 0xAA,0xAA,0x9A,0x9A,0xAA,0xA9,0xA9,0xA9,0x9A,0x99,0xA9,0x9A,0x9A,0x99,0x99,0x9A, + 0xAB,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDC,0xDD,0xDD,0xDC,0xDB,0xBB, + 0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xAD,0x97,0x8D,0xBD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDC,0xDC, + 0xCB,0xAA,0x9A,0xAB,0xBC,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDB,0xBB,0xBB,0xCB, + 0xBA,0xBA,0xBB,0xBB,0xA9,0x86,0x55,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x77,0x78,0x77,0x78,0x78,0x77,0x87,0x87,0x77, + 0x77,0x87,0x77,0x78,0x77,0x87,0x77,0x87,0x87,0x77,0x87,0x77,0x77,0x87,0x77,0x78, + 0x78,0x77,0x78,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x57, + 0x77,0x77,0x76,0x56,0x77,0x55,0x67,0x77,0x87,0x77,0x78,0x77,0x87,0x77,0x87,0x77, + 0x87,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x76,0x54,0x44,0x44,0x44,0x44,0x45,0x47, + 0x99,0x98,0x99,0x64,0x45,0x99,0xA7,0x44,0x44,0x44,0x45,0x45,0x44,0x55,0x67,0x88, + 0xAA,0xAA,0xAA,0xA9,0xAA,0xBE,0xCB,0xAB,0xCC,0xDC,0xDD,0xDD,0xED,0xED,0xED,0xDD, + 0xDC,0xDC,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xA9,0x98,0x99,0xAA,0xAA, + 0xAA,0xA9,0xA9,0x9A,0xAB,0xAA,0x9A,0x9A,0x99,0xA9,0xA9,0xA9,0x99,0x99,0x99,0x9A, + 0xAA,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xCB,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xBB, + 0xBB,0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xAD,0xA8,0x8E,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD, + 0xCB,0xBA,0xAA,0xAB,0xBC,0xCC,0xBD,0xCD,0xCD,0xCD,0xCD,0xCC,0xCC,0xBB,0xBB,0xDC, + 0xBB,0xAB,0xBB,0xAB,0xBA,0x86,0x55,0x54,0x45,0x45,0x45,0x45,0x44,0x54,0x44,0x45, + 0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x57,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x78, + 0x78,0x77,0x78,0x77,0x87,0x77,0x87,0x77,0x77,0x78,0x77,0x78,0x78,0x77,0x78,0x77, + 0x77,0x78,0x77,0x78,0x78,0x77,0x77,0x78,0x78,0x78,0x77,0x87,0x77,0x77,0x66,0x77, + 0x65,0x66,0x67,0x75,0x67,0x76,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x87, + 0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x54,0x44,0x45,0x44,0x45,0x44,0x55,0x7A, + 0x99,0x88,0x99,0x96,0x44,0x69,0xA7,0x44,0x45,0x45,0x44,0x44,0x45,0x56,0x77,0x89, + 0xAA,0xAA,0xAA,0x9A,0x9A,0xAC,0xBA,0xBB,0xBC,0xCD,0xCD,0xDD,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDC,0xBB,0xBB,0xBA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBB,0xAA,0x88,0x99,0x9A,0xAA, + 0xBA,0xAA,0xA9,0xA9,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0xA9,0xA9,0x99,0x9A, + 0xAB,0xAB,0xAA,0xAB,0xAB,0xBB,0xBB,0xCB,0xCC,0xCC,0xCC,0xDD,0xDD,0xDD,0xDC,0xDB, + 0xBB,0xBB,0xBD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAC,0xB8,0x7D,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD, + 0xDB,0xBB,0xAB,0xBB,0xCC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDB,0xDB,0xCB,0xBB,0xBB,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0x87,0x55,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x56,0x77,0x77,0x78,0x78,0x78,0x78,0x77,0x87, + 0x77,0x87,0x87,0x77,0x77,0x87,0x77,0x87,0x87,0x77,0x78,0x77,0x77,0x87,0x87,0x78, + 0x78,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x76, + 0x56,0x76,0x77,0x76,0x57,0x77,0x78,0x78,0x78,0x77,0x78,0x78,0x77,0x77,0x87,0x77, + 0x77,0x77,0x87,0x77,0x77,0x67,0x77,0x65,0x45,0x44,0x44,0x44,0x44,0x44,0x48,0xA9, + 0x88,0x65,0x89,0x99,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x45,0x56,0x78,0x9B, + 0xBB,0xBA,0xAA,0x9A,0x9A,0xAA,0xAB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0x98,0x99,0x9A,0xAA, + 0xBB,0xAA,0xA9,0x99,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0x99,0xAA, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xCD,0xCD,0xDC,0xDD,0xDD,0xBC, + 0xBB,0xBB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAB,0xD9,0x7B,0xFD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDC, + 0xDD,0xCB,0xBB,0xCB,0xDC,0xBC,0xCC,0xCC,0xDB,0xDC,0xDC,0xCC,0xCB,0xBB,0xBD,0xCD, + 0xCB,0xCB,0xBB,0xBB,0xBB,0x87,0x65,0x54,0x45,0x45,0x44,0x54,0x54,0x44,0x44,0x44, + 0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x67,0x78,0x77,0x77,0x77,0x77,0x87,0x77, + 0x87,0x77,0x77,0x87,0x87,0x77,0x87,0x77,0x78,0x78,0x77,0x87,0x87,0x77,0x77,0x87, + 0x77,0x77,0x87,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x77,0x77,0x56,0x65, + 0x67,0x76,0x77,0x67,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x87, + 0x87,0x87,0x77,0x77,0x87,0x77,0x75,0x44,0x44,0x44,0x54,0x45,0x45,0x44,0x47,0xA9, + 0x97,0x44,0x59,0x99,0x95,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x55,0x66,0x79,0xEE, + 0xCC,0xBB,0xAA,0x9A,0x99,0xAA,0xAA,0xBB,0xBC,0xCB,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0x99,0x89,0x99,0xAB, + 0xCD,0xCA,0xBA,0xAA,0x99,0x9A,0x9A,0x9A,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0xAA, + 0xAB,0xAB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBC,0xCB,0xCB,0xCC,0xCB,0xDD,0xDD,0xCD,0xDD, + 0xCB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0xDA,0x8A,0xFE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xDB,0xBC,0xBC,0xCC,0xDB,0xDB,0xDC,0xCC,0xDC,0xDC,0xDB,0xCC,0xCC,0xDC,0xDD, + 0xDD,0xBC,0xBB,0xBB,0xBB,0x97,0x65,0x45,0x44,0x54,0x45,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x78,0x77,0x87,0x87,0x77,0x87, + 0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x78,0x77,0x78,0x77,0x87,0x77, + 0x87,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x76,0x75, + 0x67,0x65,0x76,0x57,0x77,0x77,0x78,0x78,0x78,0x77,0x78,0x78,0x77,0x77,0x87,0x77, + 0x77,0x77,0x87,0x87,0x77,0x77,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x89, + 0x99,0x64,0x45,0x9A,0xA6,0x44,0x44,0x44,0x54,0x44,0x54,0x45,0x55,0x67,0x9A,0xEE, + 0xFE,0xDC,0xBB,0xA9,0xAA,0xAA,0xAB,0xBB,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xCB,0xBB,0xBA,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xA9,0x98,0x99,0xAB, + 0xDE,0xFE,0xBA,0xA9,0x99,0x99,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0x99,0xAA, + 0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xCC,0xCB,0xBC,0xBC,0xCD,0xCD,0xDD,0xDD,0xCD, + 0xCB,0xBB,0xBB,0xBC,0xDE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xAA,0xBC,0x8A,0xEE,0xDC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC, + 0xDD,0xCD,0xDB,0xDB,0xDC,0xCC,0xCB,0xCC,0xCD,0xCC,0xCC,0xCC,0xCC,0xBD,0xCC,0xDD, + 0xDC,0xDC,0xCB,0xBB,0xBC,0x97,0x65,0x54,0x54,0x54,0x54,0x45,0x44,0x44,0x44,0x44, + 0x44,0x45,0x44,0x54,0x45,0x45,0x44,0x54,0x45,0x77,0x77,0x87,0x77,0x77,0x78,0x77, + 0x87,0x78,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x77,0x87, + 0x78,0x77,0x87,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x77,0x76,0x56,0x77, + 0x55,0x57,0x77,0x77,0x77,0x87,0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x87, + 0x78,0x78,0x77,0x77,0x77,0x75,0x54,0x44,0x44,0x44,0x45,0x45,0x55,0x54,0x44,0x48, + 0x99,0x95,0x44,0x58,0x75,0x44,0x44,0x44,0x44,0x54,0x45,0x45,0x67,0x78,0x9A,0xBC, + 0xEF,0xFE,0xEB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xBD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCC, + 0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0x89,0x99,0x9A, + 0xBF,0xFF,0xDB,0xAA,0xAA,0x9A,0xA9,0xA9,0xAA,0xA9,0xA9,0xA9,0x99,0x99,0x99,0xAA, + 0xAB,0xBA,0xBB,0xAB,0xAA,0xBA,0xBB,0xBB,0xCB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xDD, + 0xCD,0xCB,0xBB,0xBC,0xCE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xAA,0xAD,0x99,0xEE,0xEC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xDC,0xDB,0xCC,0xCC,0xCC,0xDB,0xCD,0xBC,0xCC,0xDC,0xDB,0xDB,0xDB,0xDC,0xDC,0xDC, + 0xDD,0xCD,0xCC,0xBB,0xBB,0x97,0x75,0x54,0x54,0x44,0x54,0x54,0x45,0x44,0x44,0x54, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x57,0x77,0x77,0x87,0x87,0x87,0x78, + 0x77,0x87,0x77,0x78,0x77,0x87,0x78,0x77,0x78,0x77,0x78,0x77,0x87,0x78,0x78,0x77, + 0x87,0x87,0x78,0x78,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x87,0x75,0x67, + 0x65,0x67,0x87,0x77,0x77,0x77,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x77,0x87,0x78, + 0x77,0x77,0x78,0x77,0x76,0x54,0x44,0x54,0x54,0x54,0x55,0x55,0x55,0x55,0x44,0x45, + 0x89,0x98,0x54,0x44,0x44,0x44,0x45,0x45,0x45,0x44,0x54,0x55,0x67,0x89,0xAB,0xBB, + 0xBB,0xCD,0xEB,0xAA,0xAA,0xAA,0xBA,0xBB,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xBC, + 0xBC,0xBB,0xBB,0xAB,0xBA,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xA9,0x89,0x9A, + 0xAB,0xCD,0xDB,0xAA,0xA9,0xAA,0x9A,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0x89,0x9A,0xAB, + 0xBB,0xAB,0xBA,0xBA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xCD,0xDD,0xDC, + 0xDB,0xCB,0xBB,0xBB,0xBD,0xDE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBA,0xAB,0xB8,0xDE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xCD,0xBD,0xBD,0xCC,0xBD,0xCC,0xCC,0xBC,0xCC,0xCC,0xBD,0xCD,0xDC,0xDC,0xDD, + 0xCD,0xCD,0xCB,0xBB,0xBA,0x98,0x75,0x55,0x44,0x54,0x44,0x44,0x44,0x54,0x54,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x77,0x78,0x77,0x77,0x77,0x87, + 0x78,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x77,0x87,0x77,0x78, + 0x77,0x77,0x87,0x77,0x78,0x77,0x78,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x56, + 0x76,0x67,0x77,0x77,0x77,0x87,0x87,0x77,0x87,0x78,0x78,0x77,0x77,0x87,0x77,0x87, + 0x87,0x78,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x45,0x56,0x8C,0xD8,0x65,0x55,0x44, + 0x48,0x9A,0x84,0x45,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x56,0x68,0x89,0xAA,0xBB, + 0xBB,0xAA,0xAA,0xCB,0xAA,0xAB,0xBB,0xBB,0xBC,0xBD,0xCD,0xCD,0xDD,0xCD,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBC,0xBB,0xA9,0x98,0x99, + 0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0x9A,0x9A,0x99,0x99,0x99,0x9A,0xAA, + 0xBB,0xBB,0xAB,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xDD, + 0xDD,0xDC,0xBB,0xBB,0xBB,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBA,0xA9,0xD8,0xBE,0xEE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD, + 0xDC,0xDB,0xDB,0xCC,0xCC,0xDB,0xDB,0xCB,0xCB,0xCC,0xBC,0xDB,0xDC,0xDC,0xDC,0xCC, + 0xCB,0xCB,0xBB,0xBB,0xBA,0xA8,0x76,0x55,0x45,0x44,0x54,0x45,0x44,0x44,0x44,0x45, + 0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x87,0x87,0x87,0x78, + 0x77,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x78,0x77, + 0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x77,0x78,0x77,0x76,0x77,0x77,0x77,0x77,0x65, + 0x67,0x77,0x77,0x78,0x78,0x77,0x78,0x78,0x77,0x87,0x77,0x78,0x78,0x77,0x87,0x77, + 0x77,0x87,0x77,0x75,0x45,0x45,0x45,0x44,0x54,0x55,0x6A,0xEE,0xEE,0xB6,0x55,0x45, + 0x44,0x89,0x64,0x44,0x45,0x44,0x45,0x44,0x54,0x54,0x55,0x56,0x78,0x99,0xA9,0xAA, + 0xBA,0xAA,0xAB,0xEB,0xAB,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDC,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBC,0xCC,0xCB,0xCB,0xBA,0x89,0x89, + 0x99,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0x9A,0x9A,0x99,0x99,0x99,0x89,0x9A,0xAB, + 0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xCD,0xDC,0xDD, + 0xDD,0xCD,0xBB,0xBB,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBA,0xA9,0xC9,0x9E,0xEE,0xEB,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDC,0xDC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xBB,0xCB,0xDC,0xDC,0xDC,0xDC,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xB9,0x76,0x64,0x54,0x54,0x45,0x44,0x45,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x44,0x55,0x77,0x77,0x77,0x78,0x77, + 0x87,0x87,0x78,0x77,0x87,0x87,0x78,0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x78, + 0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x87,0x87,0x77,0x77,0x65,0x77,0x76,0x57,0x76, + 0x77,0x77,0x77,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x87,0x87,0x77,0x78,0x77,0x87, + 0x87,0x77,0x76,0x45,0x44,0x44,0x44,0x45,0x45,0x55,0x8D,0xDE,0xED,0xEA,0x65,0x54, + 0x45,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x55,0x66,0x88,0x99,0x9A,0x99, + 0xAA,0xAA,0xAA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xA8,0x89, + 0x99,0x99,0x9A,0x9A,0xA9,0xAA,0xAA,0xA9,0xA9,0xA9,0x99,0x99,0x98,0x99,0xAB,0xAB, + 0xBB,0xAB,0xAB,0xAA,0xAA,0xAB,0xAA,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBC,0xCD,0xDC, + 0xDD,0xDD,0xCB,0xBB,0xBB,0xBC,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0xBB,0xAA,0xAB,0x8D,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDC,0xCC,0xDC,0xDD,0xCC,0xBC,0xBC,0xBB,0xBC,0xBC,0xCD,0xCD,0xCD,0xCD,0xCB,0xBB, + 0xBA,0xBA,0xBB,0xBB,0xAB,0xB9,0x77,0x55,0x54,0x45,0x44,0x54,0x44,0x44,0x44,0x54, + 0x45,0x44,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x67,0x78,0x78,0x77,0x87, + 0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x87,0x77,0x87,0x77,0x87,0x78,0x77, + 0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x77,0x78,0x77,0x76,0x76,0x77,0x77,0x77,0x78, + 0x78,0x77,0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x77,0x87,0x77, + 0x78,0x77,0x54,0x54,0x45,0x45,0x44,0x44,0x55,0x8B,0xAD,0xD8,0x9E,0xEE,0x95,0x55, + 0x44,0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x55,0x55,0x56,0x68,0x89,0x99,0x99,0x99, + 0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xCB,0xBC,0xBC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xCB,0xBB,0xBA,0x89, + 0x89,0x99,0x99,0x99,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0x99,0x98,0x88,0x99,0xBB,0xBB, + 0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xBB,0xAB,0xAB,0xAB,0xAA,0xAB,0xBB,0xBC,0xCC,0xDD, + 0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xAA,0x9C,0x8A,0xEE,0xEE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xDC,0xCC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBD,0xCD,0xBD,0xCD,0xCC,0xBB,0xBA, + 0xBA,0xAB,0xAB,0xBB,0xBB,0xA9,0x87,0x55,0x45,0x54,0x54,0x44,0x54,0x54,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x57,0x77,0x77,0x87,0x87, + 0x87,0x77,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87, + 0x78,0x77,0x87,0x87,0x78,0x78,0x78,0x78,0x77,0x77,0x57,0x66,0x65,0x66,0x77,0x77, + 0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x78, + 0x77,0x75,0x54,0x45,0x44,0x44,0x45,0x45,0x56,0xDE,0xEE,0xC5,0x58,0xEE,0xE9,0x55, + 0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x56,0x66,0x78,0x99,0x99,0x99,0x99, + 0x99,0xAA,0xAA,0xAB,0xBB,0xDC,0xCB,0xBC,0xBB,0xCB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xAB,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xA9, + 0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x98,0x98,0x88,0x89,0xBD,0xBB, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xBB,0xAA,0xAA,0xAB,0xAB,0xBB,0xBD,0xCD, + 0xCD,0xDD,0xDC,0xDB,0xBB,0xBB,0xCD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xAA,0x9D,0xA9,0xEE,0xEE,0xED,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xCC,0xDC,0xDD,0xDC,0xBB,0xBB,0xBB,0xCC,0xDC,0xCC,0xDC,0xCC,0xBB,0xBB,0xBB, + 0xAB,0xAA,0xBB,0xAB,0xBA,0xB9,0x87,0x65,0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x54, + 0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x77,0x78,0x77,0x77, + 0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x78, + 0x77,0x87,0x78,0x78,0x78,0x77,0x77,0x87,0x77,0x67,0x77,0x77,0x77,0x76,0x77,0x77, + 0x87,0x77,0x78,0x77,0x87,0x87,0x78,0x77,0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x77, + 0x76,0x54,0x45,0x44,0x45,0x45,0x55,0x55,0x55,0x8E,0xED,0xA6,0x55,0x8E,0xDE,0x85, + 0x44,0x44,0x44,0x54,0x45,0x45,0x44,0x54,0x55,0x56,0x67,0x99,0x99,0x9A,0x99,0x99, + 0x9A,0xAA,0xAA,0xAB,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0x89,0x89,0x89,0x98,0x99,0x99,0x99,0x99,0x99,0x89,0x88,0x88,0x88,0x89,0xAA,0xBB, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBC,0xCD, + 0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xCB,0xBA,0x9B,0xB8,0xCE,0xFE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xCB,0xBB,0xBC,0xBC,0xCC,0xCD,0xCC,0xCB,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xAB,0xBA,0xBB,0xBB,0x97,0x65,0x54,0x54,0x54,0x45,0x44,0x54,0x44,0x44, + 0x44,0x44,0x44,0x54,0x44,0x55,0x44,0x44,0x44,0x44,0x45,0x44,0x57,0x77,0x87,0x87, + 0x87,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x87,0x78,0x78,0x78,0x77,0x87,0x87,0x87, + 0x87,0x78,0x77,0x77,0x87,0x78,0x78,0x77,0x66,0x56,0x77,0x65,0x77,0x77,0x78,0x78, + 0x77,0x87,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x77,0x87,0x78,0x77,0x77,0x87,0x77, + 0x64,0x45,0x44,0x45,0x44,0x45,0x56,0x77,0x76,0x59,0xED,0xD8,0x65,0x59,0xDC,0x75, + 0x54,0x54,0x44,0x44,0x44,0x44,0x45,0x45,0x55,0x67,0x78,0x99,0xAA,0xAA,0xAA,0x99, + 0x99,0xAB,0xAA,0xAB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB, + 0xAB,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAB,0xAB,0xAA,0xBB,0xBC,0xBC,0xBC,0xBB,0xBB, + 0xB9,0x99,0x88,0x89,0x88,0x88,0x98,0x98,0x98,0x98,0x88,0x88,0x88,0x8A,0xBB,0xCB, + 0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xBA,0xBB,0xBB,0xBD, + 0xCD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xCC,0xBA,0xA9,0xD9,0x9E,0xEE,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDD,0xBD,0xBD,0xCD,0xDD,0xCB,0xBB,0xCC,0xCD,0xBD,0xBC,0xCB,0xBB,0xBB,0xAB,0xBB, + 0xAA,0xAA,0xBA,0xBB,0xBB,0xBA,0x98,0x76,0x54,0x54,0x44,0x54,0x44,0x44,0x54,0x54, + 0x45,0x44,0x44,0x44,0x45,0x45,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x78,0x78, + 0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x77, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x75,0x55,0x67,0x75,0x67,0x77,0x87,0x78, + 0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x77,0x65, + 0x44,0x54,0x45,0x44,0x45,0x55,0x7C,0xDE,0xED,0xC7,0x9E,0xDD,0x96,0x55,0x75,0x44, + 0x44,0x44,0x54,0x45,0x45,0x45,0x45,0x45,0x56,0x67,0x89,0x9A,0xAB,0xAA,0xAA,0x99, + 0xA9,0xAA,0xAA,0xBB,0xCC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xAB, + 0xBB,0xAB,0xAB,0xAA,0xBA,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xCC, + 0xCB,0xA9,0x89,0x88,0x98,0x98,0x88,0x88,0x89,0x88,0x88,0x88,0x98,0x9B,0xBC,0xBC, + 0xBC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xA9,0xAA,0xAA,0xAB,0xAB,0xBB,0xBC, + 0xCD,0xDD,0xDD,0xCD,0xBB,0xBB,0xAB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDC,0xBA,0xA9,0xCA,0x8C,0xEE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xCC,0xCC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xAB,0xBB,0xBB,0xBB,0x98,0x76,0x55,0x45,0x45,0x44,0x54,0x55,0x44,0x44, + 0x44,0x44,0x54,0x45,0x44,0x54,0x45,0x44,0x54,0x44,0x54,0x45,0x44,0x57,0x77,0x77, + 0x87,0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x87,0x78,0x78, + 0x77,0x87,0x78,0x77,0x78,0x77,0x77,0x77,0x65,0x55,0x56,0x77,0x78,0x77,0x77,0x87, + 0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x76,0x45, + 0x44,0x45,0x44,0x45,0x45,0x57,0xDE,0xEE,0xED,0xFB,0x6A,0xED,0xEB,0x65,0x44,0x54, + 0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x55,0x66,0x78,0x99,0xAA,0xAA,0xBB,0xAA,0xA9, + 0x9A,0x9A,0xAA,0xBB,0xBB,0xBB,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA, + 0xBA,0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC, + 0xCB,0xCB,0x99,0x89,0x99,0x89,0x89,0x89,0x88,0x88,0x88,0x98,0x9A,0xBB,0xBB,0xCC, + 0xCC,0xBC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xBB,0xBB, + 0xBD,0xCD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xDD,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDB,0xBB,0xAA,0xAD,0x89,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xCC,0xDB,0xDB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0xBA,0xAA,0xAB,0xBC,0xDB,0xBB,0xA9,0x77,0x55,0x54,0x54,0x45,0x44,0x44,0x45,0x44, + 0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x45,0x77,0x78, + 0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x87, + 0x87,0x78,0x77,0x87,0x87,0x77,0x77,0x77,0x67,0x66,0x55,0x67,0x87,0x78,0x78,0x78, + 0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x78,0x77,0x64,0x44, + 0x45,0x44,0x45,0x44,0x45,0x59,0xED,0x87,0x9D,0xEE,0x95,0xAE,0xED,0x65,0x44,0x44, + 0x44,0x54,0x44,0x54,0x44,0x54,0x55,0x56,0x77,0x89,0x9A,0xAA,0xBB,0xBA,0xAA,0x99, + 0xA9,0xAA,0xAB,0xBB,0xBB,0xBB,0xCC,0xBC,0xCB,0xBB,0xBB,0xAB,0xAB,0xAA,0xBA,0xBA, + 0xBB,0xAB,0xAB,0xAB,0xAA,0xBA,0xBA,0xAB,0xAB,0xBB,0xBC,0xBB,0xBB,0xBC,0xCC,0xCC, + 0xCD,0xBC,0xBB,0xBA,0x99,0x99,0x98,0x88,0x88,0x98,0x88,0x9A,0xBB,0xBB,0xBC,0xBC, + 0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA,0xAB,0xAB,0xBB, + 0xBC,0xDC,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xBB,0xAA,0x9D,0xA8,0xDE,0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xED, + 0xED,0xED,0xDD,0xDD,0xCD,0xDC,0xDC,0xBC,0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xAB,0xAB,0xBC,0xCC,0xBB,0xB9,0x87,0x65,0x45,0x45,0x45,0x45,0x45,0x44,0x44, + 0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x44,0x44,0x57,0x77, + 0x78,0x78,0x77,0x87,0x87,0x78,0x78,0x78,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x77, + 0x78,0x78,0x78,0x78,0x77,0x76,0x66,0x67,0x77,0x76,0x56,0x77,0x77,0x87,0x87,0x78, + 0x77,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x75,0x45,0x45, + 0x44,0x44,0x54,0x55,0x55,0x6D,0xEB,0x65,0x58,0xED,0xD6,0x59,0xA5,0x54,0x45,0x44, + 0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x66,0x78,0x89,0x9A,0xAA,0xBB,0xAA,0xA9,0xA9, + 0xA9,0xAA,0xAA,0xAB,0xAB,0xBB,0xCB,0xDC,0xCC,0xBB,0xBA,0xBB,0xAB,0xAB,0xAB,0xAA, + 0xBA,0xBB,0xBB,0xBA,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBC, + 0xCC,0xCC,0xCC,0xCD,0xCB,0xAA,0x99,0x88,0x88,0x99,0xAB,0xBB,0xBB,0xBB,0xBC,0xCB, + 0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xA9,0xA9,0x9A,0xA9,0xAA,0xAA,0xAB,0xAB, + 0xBB,0xCD,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xBB,0xAA,0x9A,0xC8,0x9E,0xEE,0xEE,0xCD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xCC,0xDB,0xDB,0xCB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB, + 0xAB,0xBA,0xBB,0xCD,0xDC,0xBB,0xAA,0x87,0x75,0x54,0x54,0x44,0x54,0x44,0x44,0x44, + 0x44,0x45,0x44,0x54,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x55,0x77, + 0x87,0x78,0x78,0x77,0x87,0x87,0x78,0x77,0x78,0x77,0x77,0x87,0x87,0x77,0x78,0x78, + 0x77,0x87,0x78,0x77,0x77,0x55,0x55,0x67,0x57,0x77,0x67,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x78,0x78,0x77,0x76,0x54,0x44,0x44, + 0x54,0x54,0x55,0x55,0x55,0x7E,0xED,0x75,0x56,0xCE,0xC7,0x54,0x45,0x45,0x44,0x44, + 0x44,0x44,0x54,0x54,0x45,0x45,0x55,0x66,0x88,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xCD,0xCD,0xCC,0xBB,0xAB,0xAA,0xAA,0xAA,0xBA,0xBB, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDC, + 0xDB,0xDB,0xCC,0xCD,0xDD,0xDD,0xDB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA,0xBB, + 0xBB,0xBC,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xDB,0xBA,0xA9,0xDA,0x8D,0xEE,0xEE,0xDC,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xCC,0xBD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBC,0xDC,0xBB,0xAA,0x88,0x75,0x55,0x45,0x45,0x45,0x44,0x45,0x45, + 0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x67, + 0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87, + 0x78,0x77,0x87,0x77,0x77,0x76,0x55,0x68,0x77,0x78,0x77,0x77,0x87,0x78,0x78,0x78, + 0x78,0x78,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x77,0x55,0x44,0x54,0x54, + 0x44,0x45,0x56,0x78,0x76,0x6D,0xEE,0xA7,0x67,0xDE,0xD7,0x54,0x54,0x44,0x44,0x54, + 0x54,0x44,0x44,0x45,0x44,0x45,0x56,0x67,0x89,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xCC,0xCD,0xDC,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA, + 0xBA,0xBA,0xBA,0xBB,0xAB,0xBA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBC,0xCC, + 0xCC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBB,0xBA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAB,0xAA, + 0xBB,0xBB,0xCD,0xCD,0xDD,0xCD,0xCB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDB,0xBA,0xAA,0xAC,0x89,0xEE,0xEE,0xEC,0xDD,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xCD,0xBC,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCB, + 0xBB,0xBB,0xAB,0xBB,0xDC,0xBA,0xAA,0x98,0x76,0x55,0x45,0x44,0x44,0x45,0x44,0x44, + 0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x56, + 0x77,0x87,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x87,0x87,0x87,0x78,0x78,0x78, + 0x78,0x78,0x77,0x76,0x67,0x76,0x65,0x56,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x77,0x75,0x44,0x45,0x44,0x44, + 0x54,0x55,0x69,0xDE,0xDA,0x68,0xFE,0xEC,0x9A,0xDE,0x96,0x54,0x45,0x45,0x44,0x44, + 0x44,0x54,0x54,0x45,0x45,0x55,0x56,0x78,0x9A,0xAA,0xAA,0xAA,0x9A,0x9A,0xAA,0xAB, + 0xAA,0xAB,0xAB,0xAB,0xAB,0xBB,0xCD,0xDD,0xCC,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xBA,0xBA,0xBA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xCC, + 0xDC,0xDC,0xDD,0xDD,0xDE,0xEE,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBA,0xAA,0xAA,0xA9,0xA9,0xAA,0x9A,0xAA,0xAA,0xBB, + 0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xCB,0xBB,0xBA,0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDC,0xBB,0xA9,0x9C,0xA8,0xBE,0xEE,0xEE,0xCD,0xDD,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDC,0xDB,0xDC,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xBB,0xAB,0xBB,0xBB,0xCB,0xBB,0xAA,0x98,0x76,0x55,0x54,0x45,0x45,0x44,0x54,0x54, + 0x44,0x45,0x44,0x44,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45, + 0x67,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x77,0x87,0x87,0x78,0x77, + 0x87,0x77,0x76,0x66,0x77,0x77,0x65,0x55,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x76,0x54,0x44,0x54,0x44,0x54, + 0x55,0x55,0x7E,0xEE,0xEE,0xB7,0xAE,0xEE,0xDE,0xEA,0x55,0x45,0x44,0x44,0x44,0x54, + 0x54,0x44,0x45,0x45,0x45,0x56,0x78,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAB,0xAA, + 0xAB,0xAB,0xAA,0xBA,0xBA,0xBB,0xBB,0xDC,0xCB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xCC,0xCB,0xDD,0xDE,0xEE,0xEE,0xEE,0xDD,0xDB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAA,0xAA,0xBA,0xAB,0xAB,0xAB,0xBA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xBA, + 0xBA,0xBB,0xBB,0xDC,0xDD,0xDD,0xCD,0xBB,0xBB,0xBC,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xED,0xDD,0xBB,0xAA,0x99,0xD9,0x8E,0xEE,0xFE,0xDB,0xDD,0xDD,0xED,0xEE,0xDE, + 0xEE,0xEE,0xED,0xDD,0xCD,0xBD,0xCD,0xDC,0xBB,0xCB,0xCC,0xBB,0xBB,0xAB,0xBC,0xCC, + 0xBB,0xBB,0xBA,0xAA,0xAC,0xBA,0x99,0x99,0x87,0x65,0x45,0x54,0x54,0x44,0x44,0x44, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x45,0x44, + 0x56,0x77,0x78,0x77,0x87,0x87,0x78,0x78,0x78,0x77,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x77,0x55,0x67,0x78,0x77,0x76,0x67,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x54,0x44,0x54,0x44,0x54,0x45, + 0x56,0x88,0x9E,0xED,0xEE,0xEB,0x67,0xAD,0xDB,0x85,0x44,0x44,0x54,0x54,0x54,0x44, + 0x44,0x54,0x54,0x54,0x56,0x67,0x88,0xA9,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA, + 0xBA,0xBA,0xBA,0xAA,0xAB,0xAB,0xBB,0xBC,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xAA,0xBA, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC, + 0xDC,0xDC,0xDD,0xDE,0xEE,0xEE,0xEE,0xDD,0xCC,0xBB,0xBB,0xAB,0xBB,0xBB,0xAB,0xBB, + 0xBA,0xBB,0xAB,0xAA,0xBA,0xBB,0xBA,0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBD,0xEE,0xEF,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xDD,0xCB,0xBA,0x99,0xBB,0x8A,0xEE,0xEE,0xEC,0xDD,0xED,0xED,0xED,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x87,0x65,0x55,0x45,0x45,0x45,0x45,0x45, + 0x44,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x54, + 0x45,0x67,0x87,0x78,0x77,0x87,0x87,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78, + 0x77,0x66,0x55,0x56,0x77,0x87,0x87,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x77,0x75,0x45,0x45,0x44,0x54,0x45,0x55, + 0x69,0xEF,0xEE,0x95,0x8E,0xEF,0xA5,0x54,0x55,0x45,0x45,0x45,0x44,0x44,0x44,0x45, + 0x44,0x44,0x44,0x55,0x66,0x78,0x99,0x9A,0x9A,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB, + 0xBB,0xAB,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA, + 0xBA,0xAA,0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xBD,0xDD,0xED,0xEE,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB, + 0xAB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xDE,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xCC,0xBA,0xA9,0x9D,0x98,0xEE,0xEE,0xEE,0xCD,0xDD,0xDE,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xBA,0xAA,0xA9,0x99,0x99,0x89,0x89,0x87,0x76,0x55,0x54,0x54,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x57,0x77,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77, + 0x76,0x57,0x66,0x55,0x67,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x75,0x45,0x45,0x55,0x55,0x45,0x45,0x55, + 0x8E,0xEE,0xED,0xA6,0x57,0xEE,0xE8,0x55,0x44,0x44,0x44,0x44,0x54,0x54,0x54,0x54, + 0x45,0x45,0x55,0x55,0x66,0x88,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB, + 0xAB,0xBB,0xAB,0xAA,0xAB,0xAA,0xBB,0xBA,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xAB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xDC,0xDC,0xDC,0xDD,0xDE,0xDD,0xDD,0xCD,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xAB,0xAB, + 0xBB,0xAB,0xBB,0xAB,0xBA,0xBB,0xAB,0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xBB,0xCD, + 0xCB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xED,0xDC,0xBA,0xA9,0x9A,0xB8,0xAE,0xEE,0xEE,0xCC,0xDD,0xED,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xDD,0xDC,0xDC,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB, + 0xBB,0xAB,0xAA,0x9A,0x99,0x99,0x99,0x99,0x98,0x76,0x55,0x45,0x45,0x45,0x45,0x45, + 0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x54,0x54,0x44,0x44,0x54,0x45,0x44, + 0x54,0x45,0x77,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x78, + 0x75,0x77,0x76,0x55,0x57,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x55,0x45,0x45,0x78,0x65,0x54,0x55,0x89, + 0xBF,0xEE,0xEE,0xE8,0x65,0x9F,0xEB,0x65,0x54,0x54,0x54,0x54,0x44,0x44,0x44,0x44, + 0x54,0x45,0x55,0x66,0x68,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xAB, + 0xBB,0xBA,0xBA,0xAB,0xAA,0xBA,0xBA,0xBB,0xAB,0xBA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAA,0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB, + 0xCC,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xBB, + 0xAB,0xBB,0xAB,0xBB,0xAB,0xBA,0xBA,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xBB,0xBD, + 0xCD,0xCB,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xED,0xDC,0xBB,0xAA,0x98,0xC9,0x8D,0xEE,0xEE,0xEB,0xDD,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xBB,0xBB,0xAB,0xBB,0xAB,0xAA,0xBA, + 0xBA,0xAA,0xAA,0xA9,0x99,0x99,0x98,0x99,0x88,0x77,0x65,0x54,0x54,0x54,0x54,0x44, + 0x45,0x44,0x54,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x57,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x78,0x78,0x77,0x66,0x57,0x77,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x77,0x65,0x44,0x44,0x55,0xAE,0xC6,0x55,0x48,0xEE, + 0xDE,0x96,0xAE,0xFE,0x85,0x58,0xA7,0x54,0x45,0x44,0x44,0x44,0x54,0x45,0x45,0x45, + 0x44,0x54,0x56,0x77,0x89,0x9A,0x9A,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAB,0xAB,0xBB, + 0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAB,0xAB,0xBA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xCC, + 0xCC,0xCD,0xDD,0xDD,0xEE,0xDE,0xDD,0xDC,0xCB,0xBB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBA, + 0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xA9,0xA9,0xAA,0x9A,0xAA,0xAA,0xBB,0xDD, + 0xDD,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDB,0xBB,0xBA,0xBB,0xDE,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDD,0xCB,0xAA,0x99,0xAB,0x8A,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x89,0x99,0x87,0x65,0x55,0x45,0x44,0x44,0x54, + 0x44,0x44,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x45, + 0x45,0x44,0x45,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x77,0x87,0x76,0x67,0x78,0x78,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x77,0x75,0x54,0x54,0x54,0x56,0xDF,0xA6,0x55,0x57,0xCD, + 0xEE,0x95,0x6C,0xEE,0xE8,0x55,0x44,0x45,0x44,0x44,0x54,0x54,0x45,0x44,0x44,0x44, + 0x54,0x55,0x66,0x78,0x99,0xAA,0xAA,0xAA,0xBB,0xAA,0x9A,0xAA,0xAB,0xAA,0xBB,0xAB, + 0xBB,0xBB,0xBA,0xBA,0xAA,0xAB,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBA,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBC,0xCB, + 0xCC,0xBC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xBB, + 0xAB,0xBB,0xAB,0xBA,0xBA,0xBA,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xBB,0xDD, + 0xDD,0xDD,0xCB,0xBB,0xBB,0xCC,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBD,0xEE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x9D,0xA8,0xCE,0xEE,0xEE,0xCD,0xDD,0xED,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xBB,0xAA,0xAA,0xAA,0xAA,0xA9, + 0xAA,0x9A,0xAA,0xA9,0xA9,0x99,0x99,0x98,0x99,0x88,0x66,0x55,0x54,0x54,0x54,0x45, + 0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44, + 0x44,0x45,0x45,0x57,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x88,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x88,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x54,0x44,0x44,0x45,0x57,0xED,0x75,0x67,0x75,0x7D, + 0xED,0xC7,0x56,0xDF,0xEE,0x75,0x45,0x44,0x54,0x54,0x44,0x45,0x44,0x54,0x45,0x45, + 0x45,0x56,0x68,0x89,0x9A,0xAA,0xBB,0xBB,0xAA,0xA9,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB, + 0xAB,0xAB,0xAB,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCB,0xBB,0xCB,0xCB, + 0xBB,0xBB,0xBB,0xCC,0xCC,0xDC,0xDD,0xBC,0xBB,0xBA,0xBB,0xAB,0xAA,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCD, + 0xDD,0xDD,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xEE,0xED,0xDC,0xBA,0xA9,0x99,0xD9,0x8D,0xEE,0xEE,0xDC,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBA,0x9A,0x9A,0xA9,0xA9, + 0xA9,0x99,0x9A,0xAA,0xA9,0x99,0x99,0x99,0x98,0x98,0x77,0x65,0x54,0x54,0x44,0x54, + 0x45,0x44,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x54,0x44,0x45, + 0x45,0x44,0x44,0x45,0x77,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x65,0x44,0x54,0x45,0x44,0x5A,0xE9,0x7A,0xDE,0xD9,0x67, + 0xCE,0xEC,0x75,0x6A,0xA7,0x54,0x54,0x45,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x45, + 0x55,0x67,0x88,0x9A,0xAA,0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBA,0xBB, + 0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBC,0xBB,0xCB,0xCC,0xBC, + 0xBB,0xBA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA, + 0xAB,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB, + 0xBD,0xCD,0xDD,0xCB,0xBB,0xBB,0xDB,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xCE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xFE,0xED,0xDC,0xBB,0xAA,0x98,0xBB,0x8A,0xEE,0xEF,0xED,0xDD,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xAA,0xA9,0xAA,0x9A,0x99, + 0x99,0x99,0x99,0xAA,0x9A,0x99,0x99,0x99,0x99,0x99,0x87,0x65,0x54,0x54,0x54,0x45, + 0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x55, + 0x44,0x45,0x45,0x45,0x57,0x78,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x87,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x88,0x75,0x45,0x44,0x44,0x54,0x45,0x47,0x97,0xCF,0xFE,0xEE,0xC7, + 0x7E,0xEE,0xB6,0x55,0x44,0x45,0x45,0x44,0x44,0x54,0x44,0x54,0x44,0x54,0x45,0x45, + 0x56,0x78,0x8A,0xAA,0xAA,0xBB,0xCC,0xBA,0xAA,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xCB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xCB, + 0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xAB,0xAB,0xAA,0xBA,0xBA,0xBA,0xAA, + 0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBD,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xAA,0x99,0x8D,0x98,0xCE,0xEE,0xEE,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xCB,0xBA,0xA9,0x99,0x99,0x99, + 0x99,0x99,0x99,0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0x88,0x66,0x55,0x54,0x54,0x54, + 0x54,0x54,0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x45,0x77,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x88,0x87,0x88,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x86,0x55,0x44,0x54,0x55,0x44,0x54,0x55,0x59,0xEE,0x98,0xBE,0xEC, + 0x67,0xEE,0xEA,0x54,0x54,0x54,0x45,0x44,0x54,0x45,0x45,0x44,0x54,0x45,0x45,0x56, + 0x67,0x89,0xAA,0xAA,0xBA,0xBD,0xCB,0xA9,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xCC,0xBC,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB, + 0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xAB,0xAA,0xBA,0xAB,0xAB, + 0xAA,0xBA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA, + 0xBB,0xBC,0xDD,0xDC,0xCB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xDE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xCB,0xBA,0xA9,0x9A,0xC8,0xAE,0xEE,0xEE,0xED,0xDD,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0xA9,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAA,0x9A,0x99,0x99,0x99,0x99,0x98,0x77,0x65,0x54,0x45,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x54,0x45,0x44,0x54,0x54,0x45,0x44,0x44,0x44, + 0x54,0x54,0x54,0x44,0x44,0x57,0x77,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78, + 0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x87,0x78,0x87,0x88,0x78,0x87, + 0x87,0x87,0x77,0x55,0x45,0x45,0x55,0x55,0x55,0x55,0x55,0x6D,0xEE,0x78,0xEE,0xD8, + 0x65,0x7D,0xC7,0x55,0x45,0x45,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x55,0x56, + 0x78,0x8A,0xAB,0xBB,0xBD,0xDC,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAA,0xBA,0xAA,0xBA,0xBA,0xAB,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xCC,0xBC,0xCD,0xBC,0xBB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA, + 0xAB,0xBB,0xCD,0xDD,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xCD,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBA,0xA9,0x98,0xCA,0x8B,0xEE,0xEE,0xEC,0xDD,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xBB,0xA9,0x99,0x99,0x99, + 0x89,0x98,0x89,0x9A,0xAA,0xA9,0xA9,0x99,0x99,0xAA,0xA9,0x87,0x75,0x55,0x54,0x54, + 0x54,0x54,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x54,0x45,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x88,0x78,0x78,0x78,0x78, + 0x78,0x77,0x75,0x44,0x44,0x55,0x57,0x76,0x65,0x56,0x87,0x6D,0xDD,0xBD,0xEB,0x78, + 0xC7,0x56,0x64,0x54,0x54,0x44,0x54,0x44,0x54,0x44,0x45,0x45,0x45,0x45,0x66,0x67, + 0x89,0xAA,0xBB,0xBD,0xDD,0xCB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBC,0xCB,0xDC,0xCC,0xCC,0xBB,0xBB,0xAB,0xBB,0xAB,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xBA,0xBB,0xAB,0xBA,0xBA,0xAA,0xAA,0xBA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBA,0xAA,0xAA,0x9A, + 0xAA,0xBB,0xCC,0xCD,0xCD,0xCB,0xCB,0xCC,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBD,0xDE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x9D,0x88,0xEE,0xEE,0xEE,0xCD,0xDE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDD,0xBB,0xAA,0x99,0x98,0x99, + 0x99,0x89,0x98,0x99,0xAA,0xAA,0x99,0x9A,0xAB,0xBA,0xAA,0x98,0x77,0x65,0x54,0x45, + 0x44,0x45,0x44,0x45,0x44,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x54, + 0x44,0x44,0x44,0x54,0x44,0x54,0x57,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x88,0x78, + 0x87,0x88,0x78,0x87,0x88,0x78,0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x88,0x76,0x54,0x54,0x54,0x56,0x8D,0xE7,0x55,0x7B,0xE9,0x6A,0xEE,0xEE,0xA7,0x8D, + 0xEA,0x55,0x44,0x54,0x45,0x45,0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x56,0x67,0x88, + 0xAB,0xBB,0xCD,0xDD,0xDD,0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xDB,0xDC,0xCC,0xDC,0xDC,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBA,0xBB, + 0xBA,0xBA,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xAA,0xA9,0xA9,0xAA, + 0xAA,0xAA,0xBC,0xDD,0xCD,0xCB,0xBB,0xCC,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xDE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0x99,0x8B,0xA8,0xBE,0xEE,0xEE,0xDD,0xDD, + 0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDB,0xBA,0x99,0x99,0x99, + 0x98,0x98,0x99,0x99,0xAA,0xAA,0xA9,0xAA,0xBB,0xAB,0xAB,0xA9,0x87,0x75,0x55,0x54, + 0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x45,0x44,0x44,0x44,0x44, + 0x45,0x45,0x44,0x44,0x54,0x44,0x56,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x87,0x87,0x87,0x87, + 0x87,0x55,0x44,0x44,0x44,0x57,0xEE,0xEC,0x76,0x8E,0xEB,0x67,0xDE,0xED,0x9A,0xEF, + 0xD7,0x55,0x45,0x44,0x54,0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x55,0x66,0x78,0x9B, + 0xDD,0xCC,0xDD,0xDD,0xCB,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC,0xBB,0xBB,0xBA,0xBA, + 0xBB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xCC,0xBD,0xCC,0xCC,0xCC,0xCC,0xDC,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBB,0xBA, + 0xBB,0xBB,0xBA,0xBA,0xBB,0xBA,0xBB,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAB,0xAB,0xBA,0xAA,0xAA,0x9A,0x9A, + 0x9A,0xAA,0xAB,0xCB,0xDD,0xCD,0xCC,0xCC,0xCC,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBD, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xD9,0x8D,0xEE,0xEE,0xEC,0xDE, + 0xDE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xA9,0x99,0x98, + 0x99,0x99,0x89,0x89,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xA8,0x77,0x65,0x55, + 0x45,0x45,0x44,0x45,0x44,0x54,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x45,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x57,0x77,0x87,0x87,0x87,0x78,0x78,0x78,0x87, + 0x88,0x78,0x87,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x87,0x87, + 0x55,0x44,0x54,0x54,0x54,0x45,0x6B,0xEE,0xD8,0x8D,0xED,0x65,0x7B,0xEE,0xEE,0xEC, + 0x75,0x44,0x54,0x45,0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x55,0x66,0x67,0x8A,0xDE, + 0xEE,0xEE,0xED,0xDB,0xBA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xCC,0xDC,0xCB,0xBB,0xBC,0xDC,0xCC,0xBB,0xBA,0xBA,0xBB,0xBA,0xBA,0xBA,0xBB, + 0xBA,0xBA,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAB,0xBB,0xBA,0xAA,0x9A,0x9A,0xAA,0xA9, + 0xA9,0xAA,0xAA,0xBC,0xDD,0xDD,0xCB,0xCB,0xCD,0xCD,0xDD,0xDD,0xBC,0xBB,0xBB,0xBC, + 0xDE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0xAC,0x8A,0xEE,0xEE,0xEE,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCB,0xAA,0x99,0x99, + 0x99,0x89,0x89,0x99,0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xB9,0x87,0x77,0x55, + 0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x44, + 0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x46,0x78,0x78,0x78,0x78,0x87,0x88,0x78,0x78, + 0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x88,0x78,0x75, + 0x54,0x45,0x44,0x44,0x45,0x45,0x46,0xDE,0xEE,0x8C,0xED,0x87,0x66,0x8A,0xCA,0x85, + 0x54,0x55,0x44,0x54,0x54,0x54,0x54,0x54,0x45,0x44,0x55,0x56,0x77,0x89,0xAC,0xEE, + 0xEE,0xEE,0xDD,0xBB,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xAA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB, + 0xCC,0xCD,0xCC,0xBB,0xBB,0xBC,0xBD,0xCD,0xCB,0xBB,0xAB,0xBA,0xBA,0xBA,0xBB,0xAB, + 0xAB,0xBA,0xBA,0xBA,0xBB,0xBA,0xBA,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xA9,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBA,0xAA,0xA9,0xAA,0xAA,0xAA, + 0x99,0xA9,0xAA,0xAB,0xBD,0xDD,0xDD,0xBD,0xCC,0xDC,0xDD,0xDD,0xDC,0xCB,0xBA,0xBB, + 0xDD,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDC,0xCB,0xAA,0x99,0x8C,0xA8,0xCE,0xEE,0xFE,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCB,0xBA,0x99,0x98, + 0x99,0x99,0x99,0x99,0x9A,0xAA,0xBA,0xAA,0xBB,0xBB,0xBC,0xBB,0xBB,0x87,0x77,0x65, + 0x55,0x44,0x44,0x54,0x44,0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x45, + 0x45,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x57,0x78,0x78,0x87,0x88,0x78,0x88,0x78, + 0x78,0x87,0x88,0x88,0x78,0x78,0x87,0x88,0x78,0x87,0x87,0x87,0x88,0x78,0x86,0x54, + 0x45,0x44,0x54,0x54,0x54,0x55,0x55,0x7E,0xEF,0xDE,0xEE,0xED,0xA8,0x65,0x55,0x44, + 0x54,0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x44,0x55,0x55,0x66,0x78,0x99,0xAA,0xBE, + 0xEE,0xEE,0xDC,0xBA,0xAA,0xAA,0xAB,0xBB,0xBC,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xAA,0xBA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC, + 0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB, + 0xBA,0xAB,0xAA,0xBA,0xBA,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAA,0x9A, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA, + 0xA9,0xA9,0xAA,0xAB,0xBC,0xDD,0xED,0xDB,0xCC,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB, + 0xBD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xC8,0x9E,0xEE,0xEE,0xED, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDC,0xBA,0xA9,0x99, + 0x89,0x99,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xCC,0xCB,0xCC,0xCB,0xA8,0x77,0x76, + 0x55,0x45,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x45,0x44,0x45,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x54,0x46,0x78,0x78,0x78,0x78,0x78,0x87,0x87, + 0x88,0x78,0x87,0x87,0x88,0x87,0x87,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x54,0x44, + 0x54,0x45,0x44,0x44,0x55,0x55,0x66,0x58,0xEE,0xEE,0xEF,0xEE,0xEE,0xC7,0x54,0x54, + 0x54,0x45,0x44,0x54,0x54,0x45,0x45,0x44,0x55,0x55,0x66,0x78,0x99,0x9A,0xAA,0xAC, + 0xFE,0xED,0xCB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCB,0xDC,0xCC,0xBB,0xBA,0xBB,0xAB,0xBA, + 0xBA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xCB, + 0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB,0xAA,0xAA,0xBA,0xAA,0xBA,0xBA, + 0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBA,0xBA,0xBB,0xAA,0xAA,0xA9,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xBB,0xBC,0xCB,0xBB,0xAA,0x9A,0x9A,0xAB,0xAB,0xAA, + 0x9A,0x9A,0x9A,0xAB,0xBD,0xDD,0xDD,0xDD,0xBD,0xCC,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB, + 0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9,0x98,0xCA,0x8B,0xEE,0xEE,0xED, + 0xDD,0xDE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xBB,0xA9,0x99, + 0x99,0x99,0xA9,0xAA,0xAA,0xAB,0xBB,0xBC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBA,0x98,0x77, + 0x55,0x54,0x45,0x44,0x45,0x45,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x45, + 0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x45,0x58,0x78,0x87,0x87,0x88,0x78,0x88, + 0x87,0x87,0x88,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x65,0x45,0x45, + 0x45,0x44,0x54,0x55,0x55,0x78,0xAA,0x86,0x9E,0xEE,0xC9,0xDE,0xEE,0xA6,0x54,0x54, + 0x45,0x44,0x54,0x54,0x45,0x45,0x45,0x55,0x55,0x66,0x77,0x8A,0xAA,0xAA,0xAA,0xA9, + 0xBE,0xED,0xBA,0xAA,0xAA,0xAA,0xBB,0xBC,0xCD,0xBC,0xBB,0xBA,0xBA,0xAB,0xBB,0xAB, + 0xAB,0xAA,0xAB,0xAA,0xBA,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC, + 0xCC,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBC,0xCB,0xBB,0xBA,0xAA,0xAA,0xBA,0xAB,0xAB, + 0xAA,0xAA,0xAA,0xBA,0xAB,0xAB,0xAB,0xBA,0xBA,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xDC,0xCB,0xBA,0xAA,0x9A,0xAA,0xAB,0xAB,0xAA, + 0xA9,0x9A,0xAA,0xAB,0xBC,0xDE,0xEE,0xDD,0xDB,0xCC,0xDC,0xDD,0xDD,0xCC,0xBB,0xBB, + 0xAB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x9D,0x98,0xDE,0xEE,0xEE, + 0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDB,0xBA,0x99, + 0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBD,0xCB,0xDB,0xDC,0xCB,0xCC,0xCB,0xBB,0xA8,0x77, + 0x75,0x55,0x54,0x54,0x54,0x44,0x44,0x54,0x54,0x44,0x45,0x44,0x54,0x45,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x46,0x88,0x78,0x78,0x87,0x88,0x78, + 0x78,0x88,0x78,0x87,0x88,0x87,0x88,0x78,0x78,0x87,0x87,0x88,0x75,0x54,0x44,0x44, + 0x54,0x55,0x45,0x55,0x68,0xDE,0xEE,0xEA,0x79,0xEE,0xEA,0x78,0x98,0x55,0x45,0x45, + 0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x55,0x56,0x67,0x78,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xDB,0xAA,0xAA,0xAA,0xBB,0xBC,0xBD,0xCD,0xCC,0xBB,0xBA,0xAA,0xBB,0xAB,0xBA, + 0xBA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xCB,0xDC, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xCC,0xCC,0xDC,0xBB,0xAA,0xA9,0xAA,0xAB,0xAB,0xAA, + 0xAA,0x9A,0xAA,0xBB,0xBD,0xDE,0xEE,0xED,0xDD,0xCC,0xCC,0xDC,0xDD,0xDD,0xCB,0xBB, + 0xBB,0xBD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB,0xBA,0x99,0x8B,0xB8,0xAE,0xEE,0xEE, + 0xED,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA, + 0x99,0xAA,0xAA,0xBB,0xBB,0xBC,0xCC,0xCD,0xBD,0xCC,0xCC,0xDB,0xBB,0xBB,0xCA,0x87, + 0x77,0x55,0x55,0x45,0x44,0x54,0x54,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x45,0x44, + 0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x54,0x44,0x55,0x78,0x78,0x88,0x78,0x87,0x88, + 0x78,0x78,0x87,0x88,0x78,0x78,0x78,0x88,0x78,0x78,0x88,0x87,0x54,0x54,0x54,0x54, + 0x55,0x55,0x55,0x56,0x9E,0xEE,0xEE,0xEE,0xA6,0xAE,0xEE,0x95,0x54,0x54,0x54,0x54, + 0x54,0x54,0x45,0x45,0x45,0x45,0x55,0x56,0x66,0x78,0xAC,0xDD,0xDD,0xBA,0xAA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCD,0xBD,0xCC,0xCB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB, + 0xAB,0xAA,0xBA,0xBA,0xBA,0xAB,0xAA,0xBA,0xAA,0xAB,0xAA,0xAA,0xAA,0xBB,0xCC,0xCC, + 0xCB,0xBB,0xBA,0xBA,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBA,0xBA,0xBB,0xAB,0xBB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xBA,0xBB,0xBC,0xCC,0xCD,0xDD,0xCC,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xDD,0xEE,0xEE,0xEE,0xED,0xCB,0xBC,0xCD,0xDD,0xDC,0xCC,0xBB, + 0xBB,0xBB,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xDB,0xBA,0xA9,0x98,0xDA,0x8C,0xEE,0xEE, + 0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCB,0xA9, + 0xA9,0xAA,0xAB,0xBB,0xBB,0xDC,0xDC,0xDB,0xDC,0xCB,0xDD,0xDD,0xDC,0xBB,0xBB,0xB8, + 0x77,0x75,0x55,0x45,0x45,0x45,0x45,0x45,0x45,0x44,0x54,0x44,0x45,0x45,0x44,0x54, + 0x54,0x54,0x44,0x45,0x44,0x54,0x44,0x44,0x54,0x44,0x57,0x88,0x87,0x87,0x88,0x78, + 0x87,0x88,0x78,0x87,0x87,0x88,0x87,0x87,0x87,0x87,0x87,0x65,0x44,0x44,0x44,0x55, + 0x56,0x76,0x65,0x58,0xDE,0xD8,0x7B,0xEE,0xE8,0x6A,0xEE,0x95,0x55,0x45,0x45,0x45, + 0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x77,0x78,0x8A,0xCD,0xDD,0xDD,0xDA,0xBB,0xAA, + 0xA9,0xAA,0xAA,0xAB,0xBB,0xCC,0xDC,0xDD,0xCC,0xBB,0xAB,0xAB,0xBB,0xBA,0xAA,0xBA, + 0xBA,0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xBC,0xCC, + 0xCC,0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBA,0xAA,0x9A,0x9A,0x99,0x99, + 0x9A,0x9A,0xAA,0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xDC,0xDC,0xDD,0xCB,0xBB,0xAA,0xAA,0xBA,0xBA,0xBA, + 0xAA,0xAA,0xBB,0xCD,0xDE,0xEE,0xEF,0xEE,0xEE,0xDD,0xCB,0xCC,0xCD,0xDD,0xDC,0xBB, + 0xBB,0xBB,0xCE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x9D,0x98,0xDE,0xEE, + 0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xCB,0xBA, + 0xA9,0xAA,0xAB,0xBC,0xCD,0xCD,0xCD,0xCD,0xBC,0xBB,0xCD,0xED,0xDD,0xBB,0xBB,0xBB, + 0x97,0x77,0x65,0x55,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x54,0x54,0x44,0x44,0x44, + 0x44,0x44,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x67,0x78,0x88,0x78,0x87, + 0x88,0x87,0x88,0x78,0x88,0x78,0x78,0x87,0x88,0x87,0x65,0x44,0x54,0x54,0x55,0x56, + 0x8B,0xEE,0xA7,0x69,0xEE,0xA6,0x54,0x9E,0xEC,0x75,0x87,0x55,0x45,0x45,0x45,0x45, + 0x54,0x54,0x54,0x54,0x55,0x55,0x77,0x77,0x89,0xCD,0xDE,0xEE,0xED,0xDD,0xBA,0xAA, + 0x9A,0xAA,0xAA,0xBB,0xBC,0xDC,0xDD,0xCD,0xCB,0xBA,0xAB,0xBB,0xBA,0xAB,0xBA,0xAB, + 0xAB,0xAB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAB,0xAA,0xBB,0xBC,0xCD, + 0xBC,0xCB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA,0xAA,0x9A,0x99,0x99,0x9A,0x99, + 0x99,0x99,0x9A,0xAA,0xAB,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBA,0xBA,0xAA,0xAA, + 0xBA,0xBB,0xBB,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDB,0xBB,0xAA,0xAA,0xAB,0xAB,0xAB, + 0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xCB,0xBB,0xCD,0xDD,0xDD,0xBC, + 0xBB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD,0xCB,0xAA,0x99,0x8B,0xB8,0xAE,0xEE, + 0xEE,0xEC,0xDD,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xBB, + 0xAA,0xAA,0xBB,0xBC,0xBD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBD,0xDE,0xDD,0xCC,0xCB,0xBC, + 0xDA,0x87,0x76,0x55,0x55,0x45,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x54, + 0x54,0x54,0x44,0x44,0x54,0x54,0x44,0x44,0x54,0x54,0x45,0x46,0x87,0x87,0x87,0x88, + 0x78,0x78,0x87,0x88,0x78,0x78,0x87,0x88,0x78,0x75,0x44,0x54,0x44,0x44,0x55,0x69, + 0xEF,0xEE,0xED,0x79,0xEE,0xD7,0x65,0x8E,0xEC,0x75,0x54,0x55,0x54,0x54,0x54,0x54, + 0x54,0x54,0x54,0x55,0x56,0x67,0x77,0x8A,0xAB,0xCD,0xDD,0xEE,0xEE,0xDC,0xBA,0xAA, + 0xAA,0xAA,0xBB,0xBB,0xDC,0xCD,0xDC,0xDC,0xBB,0xAA,0xBA,0xAA,0xBA,0xBA,0xCB,0xAA, + 0xBA,0xAA,0xBA,0xBA,0xAB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB,0xCC, + 0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xBB,0xAB,0xBB,0xAA,0xA9,0x99,0x9A,0x9A,0x99,0x9A, + 0x99,0x99,0x99,0x9A,0xAA,0xAB,0xAB,0xBB,0xAB,0xAB,0xAA,0xBA,0xBB,0xBA,0xAA,0xAA, + 0xAB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCB,0xBA,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xBC,0xDD,0xDC,0xDC, + 0xCB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xD9,0x8C,0xEE, + 0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xDD,0xBB, + 0xBA,0xAB,0xBB,0xDB,0xDC,0xCD,0xBD,0xBD,0xBB,0xBB,0xBB,0xEE,0xDD,0xCC,0xCC,0xBB, + 0xBC,0xA8,0x77,0x75,0x55,0x54,0x54,0x44,0x44,0x45,0x44,0x54,0x54,0x44,0x45,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x45,0x67,0x78,0x88,0x78, + 0x88,0x88,0x78,0x87,0x88,0x78,0x78,0x78,0x86,0x54,0x54,0x54,0x54,0x55,0x57,0xAE, + 0xEE,0xEE,0xEF,0xC8,0xEE,0xEC,0x77,0x9E,0xEB,0x65,0x55,0x55,0x54,0x54,0x55,0x55, + 0x45,0x45,0x55,0x56,0x66,0x77,0x8A,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xDD,0xBA,0xAA, + 0xAA,0xAB,0xBB,0xCD,0xCD,0xDC,0xDC,0xCB,0xBA,0xBB,0xAB,0xAA,0xBB,0xBA,0xBC,0xCB, + 0xAB,0xAB,0xAB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xBA,0xBA,0xBB,0xCC, + 0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAA,0xA9,0xA9,0xA9,0x99,0x9A,0x9A,0x99, + 0x9A,0x99,0x99,0xA9,0xAA,0xAA,0xBA,0xAB,0xAB,0xAA,0xBA,0xBB,0xBB,0xAB,0xAA,0xAB, + 0xBB,0xBC,0xDD,0xCD,0xCD,0xCC,0xCC,0xCD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xBC,0xBB, + 0xBC,0xCD,0xDD,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xDC,0xBB,0xBB,0xCD,0xDD,0xDB, + 0xCB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBA,0xA9,0x99,0xAC,0x8A,0xEE, + 0xEE,0xEE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDB, + 0xBA,0xBB,0xBC,0xBD,0xCD,0xDB,0xDC,0xBC,0xBB,0xBB,0xAB,0xBD,0xCD,0xCD,0xCB,0xDB, + 0xBB,0xBA,0x77,0x77,0x65,0x54,0x54,0x54,0x54,0x54,0x45,0x44,0x44,0x54,0x54,0x44, + 0x54,0x54,0x54,0x45,0x45,0x45,0x44,0x45,0x44,0x44,0x44,0x54,0x55,0x77,0x87,0x88, + 0x78,0x78,0x88,0x78,0x87,0x88,0x78,0x87,0x55,0x44,0x45,0x45,0x44,0x55,0x7C,0xEE, + 0xD8,0x8C,0xEE,0xE8,0xAE,0xEE,0xDC,0xEE,0xD7,0x55,0x45,0x55,0x54,0x54,0x54,0x54, + 0x55,0x55,0x55,0x66,0x66,0x78,0xBB,0xDC,0xDD,0xDE,0xDE,0xEE,0xDE,0xDB,0xBA,0xAA, + 0xAA,0xBB,0xBC,0xCD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB, + 0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBC, + 0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xA9,0xA9,0x9A,0x9A,0x9A,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xA9,0x99,0x99,0xAA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAB,0xAB,0xBB,0xBA,0xAB, + 0xBB,0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xCB,0xCC,0xBB,0xCC, + 0xCC,0xDD,0xDE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xCB,0xBB,0xCC,0xDC,0xDD, + 0xCB,0xBB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xED,0xDC,0xBB,0xAA,0x99,0x8D,0xA8,0xDE, + 0xEE,0xFE,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xBB,0xBB,0xCD,0xCD,0xCC,0xCC,0xBC,0xCD,0xBC,0xBB,0xBA,0xBB,0xBD,0xDD,0xDD,0xCB, + 0xBA,0xBB,0xA8,0x77,0x77,0x56,0x55,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x58,0x78,0x87, + 0x88,0x88,0x78,0x87,0x88,0x78,0x78,0x75,0x44,0x54,0x54,0x44,0x45,0x45,0xAE,0xEE, + 0xA7,0x68,0xEE,0xE7,0x6A,0xEE,0xEF,0xEC,0x86,0x54,0x54,0x54,0x54,0x54,0x55,0x45, + 0x55,0x55,0x57,0x77,0x78,0xBB,0xCD,0xCD,0xDE,0xEE,0xEE,0xED,0xDC,0xBA,0xBA,0xBA, + 0xBB,0xBB,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBA,0xBB,0xAA,0xBA,0xBB,0xBA,0xBB, + 0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xAB,0xAA,0xBA,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB, + 0xCC,0xDB,0xDB,0xBB,0xBB,0xBB,0xAA,0xA9,0xA9,0x99,0xA9,0xA9,0xA9,0x9A,0x9A,0x9A, + 0x99,0x9A,0x9A,0x99,0x99,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAB,0xBB,0xAB,0xAB,0xBB, + 0xBD,0xDD,0xDE,0xDD,0xCC,0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDD,0xDD,0xDC,0xDD,0xCD, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEE,0xED,0xCB,0xBB,0xBB,0xDD,0xDC, + 0xDB,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0xD9,0x9E, + 0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xBB,0xDC,0xDB,0xDC,0xCB,0xCC,0xCC,0xCC,0xBB,0xBB,0xAB,0xBC,0xCE,0xEE,0xCB, + 0xAB,0xAB,0xBA,0x87,0x77,0x76,0x55,0x54,0x54,0x54,0x54,0x54,0x44,0x54,0x54,0x44, + 0x45,0x45,0x45,0x45,0x44,0x54,0x44,0x54,0x54,0x44,0x44,0x54,0x54,0x56,0x87,0x88, + 0x87,0x87,0x87,0x88,0x78,0x88,0x76,0x54,0x54,0x44,0x44,0x54,0x54,0x45,0x7D,0xEE, + 0xEB,0x7B,0xEE,0xE7,0x55,0x8D,0xDC,0xA6,0x54,0x54,0x54,0x54,0x54,0x45,0x45,0x55, + 0x56,0x66,0x77,0x78,0x9B,0xCC,0xCC,0xDD,0xDE,0xEE,0xED,0xED,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xDC,0xCB,0xBB,0xAB,0xBA,0xBB,0xBB,0xAA,0xAA,0xAA,0xBB,0xAB, + 0xAB,0xAB,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xCC,0xBB,0xBB,0xBA,0xAA,0xAA,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xA9,0x99,0xA9,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB, + 0xCD,0xDD,0xED,0xDD,0xDB,0xBB,0xBA,0xBB,0xBB,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xFE,0xFE,0xEE,0xED,0xCB,0xBA,0xBB,0xCC,0xDD, + 0xCD,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x98,0xBB,0x8B, + 0xEE,0xEE,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD, + 0xDC,0xCD,0xCC,0xCD,0xBC,0xCB,0xCB,0xCD,0xBD,0xBB,0xCB,0xBB,0xAC,0xEF,0xEC,0xBB, + 0xBB,0xBA,0xAB,0xB9,0x77,0x77,0x65,0x55,0x54,0x54,0x44,0x45,0x45,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x54,0x54,0x44,0x44,0x45,0x68,0x78, + 0x78,0x88,0x88,0x87,0x88,0x87,0x54,0x45,0x44,0x54,0x44,0x44,0x54,0x54,0x47,0xEF, + 0xEE,0xDE,0xEE,0x85,0x54,0x45,0x55,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x55,0x55, + 0x67,0x77,0x78,0xAB,0xCD,0xCD,0xDD,0xDE,0xEE,0xED,0xED,0xCB,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xCC,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xCA,0xAA,0xAB,0xAB,0xAB, + 0xAA,0xAA,0xBA,0xAB,0xAB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCD,0xBC,0xBB,0xBB,0xAA,0xA9,0x99,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A, + 0x9A,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC, + 0xDD,0xDE,0xED,0xED,0xBB,0xBB,0xBA,0xBA,0xBB,0xBC,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xED,0xCB,0xAB,0xBB,0xBC,0xDD, + 0xDB,0xDB,0xBB,0xBB,0xBC,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDC,0xBB,0xAA,0x99,0x8C,0x98, + 0xDE,0xEE,0xFE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDC, + 0xDC,0xDC,0xCD,0xCB,0xCB,0xBC,0xBD,0xCB,0xDB,0xDC,0xBC,0xBB,0xBB,0xDD,0xCD,0xDD, + 0xDC,0xBB,0xBA,0xAA,0x98,0x78,0x77,0x65,0x55,0x55,0x45,0x45,0x44,0x45,0x45,0x44, + 0x45,0x44,0x54,0x45,0x44,0x44,0x45,0x45,0x45,0x44,0x44,0x54,0x54,0x54,0x46,0x88, + 0x87,0x88,0x78,0x78,0x87,0x55,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x7D, + 0xEE,0xEE,0xD8,0x65,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x55,0x55,0x77, + 0x77,0x88,0xAB,0xCC,0xCD,0xDD,0xDE,0xDE,0xEE,0xED,0xBB,0xAA,0xBB,0xBB,0xBB,0xCC, + 0xCB,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA,0xBB,0xDB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCC,0xBB,0xBB,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB, + 0xCD,0xED,0xEE,0xDD,0xDB,0xBA,0xBB,0xAA,0xAA,0xBB,0xCD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xED,0xBB,0xAA,0xAA,0xBB,0xCC, + 0xDD,0xCD,0xBB,0xBA,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0x99,0x9A,0xC8, + 0x9E,0xEE,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD, + 0xCD,0xBD,0xBC,0xCB,0xBC,0xCC,0xCC,0xCD,0xBD,0xBC,0xDB,0xBB,0xBB,0xAB,0xDE,0xEE, + 0xDD,0xDB,0xBA,0xA9,0xAA,0x98,0x77,0x76,0x66,0x55,0x54,0x54,0x54,0x54,0x44,0x45, + 0x44,0x45,0x44,0x54,0x45,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x57, + 0x88,0x87,0x88,0x88,0x75,0x44,0x54,0x45,0x45,0x44,0x54,0x44,0x54,0x54,0x54,0x47, + 0xEE,0xEE,0xA6,0x55,0x54,0x45,0x45,0x44,0x54,0x54,0x55,0x55,0x66,0x66,0x77,0x87, + 0x89,0xAB,0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xDE,0xDB,0xAB,0xBB,0xBB,0xBB,0xCD,0xCD, + 0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xCC,0xAA,0xAB,0xBB,0xCC,0xBB,0xBB,0xCB, + 0xBB,0xBA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xDB,0xCB,0xBA,0xAA,0xA9,0x99,0xA9,0xA9,0xA9,0xAA,0x9A,0xA9,0xA9,0xA9, + 0xA9,0xA9,0x9A,0x9A,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC, + 0xDD,0xDE,0xED,0xDD,0xCC,0xBB,0xBA,0xAA,0xAA,0xAB,0xBD,0xDE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xBA,0xAA,0xAA,0xBB,0xBC, + 0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xDD,0xDB,0xBA,0xA9,0x98,0xDA, + 0x8B,0xEE,0xEE,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDC, + 0xDB,0xDB,0xDC,0xBB,0xBB,0xBC,0xBC,0xCC,0xCC,0xCD,0xBD,0xCB,0xBB,0xBB,0xBE,0xFF, + 0xEE,0xED,0xBA,0xAA,0xA9,0xA9,0x87,0x77,0x76,0x66,0x55,0x55,0x45,0x44,0x54,0x54, + 0x45,0x45,0x45,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x54,0x54,0x44,0x45, + 0x78,0x88,0x88,0x75,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x45,0x44, + 0x9E,0xEE,0xE9,0x75,0x55,0x45,0x45,0x45,0x45,0x45,0x55,0x56,0x67,0x88,0x77,0x89, + 0xBD,0xDC,0xCC,0xDD,0xDD,0xED,0xEE,0xEE,0xDC,0xBA,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD, + 0xCD,0xCB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBA,0xBC,0xEB,0xAB,0xBC,0xCC,0xCD,0xCC,0xBB, + 0xBB,0xAA,0xAA,0xAA,0xAA,0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCC,0xCB,0xBB,0xBA,0xAA,0x9A,0x9A,0xA9,0xA9,0xA9,0xAA,0x9A,0xA9,0xA9, + 0xA9,0xA9,0xA9,0x9A,0x9A,0x9A,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB, + 0xCD,0xDD,0xEE,0xDD,0xDC,0xBB,0xBA,0xAA,0x9A,0x9A,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDC,0xBA,0xA9,0xAA,0xAA,0xBB, + 0xCC,0xDD,0xCB,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x9D, + 0x98,0xDE,0xEF,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD, + 0xBD,0xBD,0xCC,0xCB,0xBB,0xBB,0xCB,0xCC,0xDB,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xEE, + 0xEF,0xED,0xBA,0xAA,0xA9,0x9A,0xA9,0x87,0x67,0x77,0x55,0x55,0x54,0x54,0x45,0x44, + 0x54,0x44,0x44,0x54,0x45,0x44,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x54, + 0x55,0x67,0x65,0x45,0x44,0x54,0x45,0x45,0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x45, + 0x59,0xEE,0xEE,0x96,0x54,0x54,0x54,0x54,0x55,0x55,0x56,0x78,0x88,0x89,0x9B,0xBB, + 0xCC,0xCC,0xDC,0xDD,0xED,0xEE,0xEE,0xDB,0xBA,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD, + 0xCD,0xBB,0xBA,0xBB,0xBB,0xBB,0xBA,0xAA,0xBB,0xDE,0xDC,0xCD,0xCD,0xCC,0xCB,0xBB, + 0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xCB,0xDD,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBC,0xDC,0xCB,0xBB,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0x99,0xA9, + 0xA9,0xA9,0x9A,0xA9,0x9A,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xDD,0xED,0xED,0xDC,0xBB,0xAA,0xA9,0x99,0xAA,0xAB,0xCD,0xEE,0xEE,0xFE,0xEE, + 0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xAA,0xA9,0x9A,0xAA,0xBB, + 0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xDE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xAA,0x99,0x8B, + 0xB8,0xAE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDC, + 0xDB,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xCC,0xBD,0xCD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBE, + 0xFF,0xFD,0xAB,0xCB,0xA9,0x9A,0x9A,0x98,0x77,0x77,0x77,0x55,0x55,0x55,0x54,0x54, + 0x45,0x45,0x45,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x54,0x54,0x45,0x45,0x44,0x44, + 0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x45,0x45,0x45, + 0x45,0xAE,0xEF,0xC6,0x55,0x44,0x54,0x55,0x55,0x56,0x77,0x77,0x77,0x8B,0xAB,0xCB, + 0xCB,0xDD,0xDD,0xDD,0xEE,0xED,0xEC,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xBB,0xBA,0xBC,0xCC,0xBB,0xCD,0xBA,0xAB,0xBD,0xCD,0xDC,0xDC,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xAA,0xBA,0xAA,0xAB,0xBF,0xFD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCC,0xBB,0xBA,0xB9,0xA9,0x9A,0xA9,0xAA,0x9A,0xAA,0xAA,0xBA,0xAA,0xA9, + 0xA9,0xA9,0xA9,0x9A,0xA9,0x9A,0x9A,0x99,0x9A,0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xCD,0xDE,0xDE,0xDD,0xCB,0xBA,0xA9,0xA9,0x9A,0xAB,0xBD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDB,0xAA,0x9A,0x99,0xAA,0xBB, + 0xCD,0xDD,0xCC,0xBB,0xBB,0xBB,0xCD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xDD,0xCB,0xBA,0xA9,0x98, + 0xDA,0x8C,0xEE,0xEE,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCC, + 0xCD,0xCD,0xDD,0xCB,0xBB,0xBB,0xBC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB, + 0xEF,0xDA,0xDE,0xCA,0x99,0x99,0xAA,0xAA,0xB9,0x77,0x77,0x77,0x65,0x65,0x55,0x55, + 0x45,0x45,0x45,0x45,0x45,0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x54,0x54, + 0x45,0x44,0x54,0x45,0x44,0x45,0x45,0x44,0x44,0x45,0x44,0x54,0x44,0x54,0x44,0x54, + 0x54,0x5D,0xFB,0x65,0x54,0x55,0x55,0x55,0x67,0x77,0x76,0x88,0x89,0xBB,0xCC,0xCD, + 0xCD,0xDD,0xEE,0xEE,0xDE,0xED,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDE,0xDD,0xDC, + 0xDB,0xBB,0xAB,0xBB,0xCD,0xBB,0xBE,0xDC,0xBB,0xCD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAB,0xEF,0xEC,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xDC,0xCB,0xAA,0xA9,0x99,0xA9,0xAA,0x9A,0xA9,0xAA,0xBB,0xCA,0xA9,0xAA, + 0x9A,0x9A,0x9A,0x99,0x99,0xA9,0x99,0x99,0x9A,0xAA,0xAB,0xBA,0xBB,0xBA,0xBB,0xBA, + 0xBB,0xBD,0xDD,0xEE,0xDD,0xDB,0xBB,0xA9,0x99,0x99,0xAA,0xBC,0xDD,0xEE,0xEF,0xEF, + 0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBA,0x99,0x9A,0xAA,0xBB, + 0xBC,0xCC,0xCC,0xBB,0xBB,0xBC,0xCD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBB,0xA9,0x99, + 0xAC,0x89,0xEE,0xEF,0xEE,0xDD,0xDE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDC, + 0xDB,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBC,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB, + 0xAB,0xAD,0xED,0xA9,0x99,0xA9,0xAA,0xBB,0xCB,0xA8,0x87,0x77,0x87,0x65,0x66,0x55, + 0x55,0x45,0x45,0x45,0x44,0x45,0x45,0x44,0x45,0x44,0x45,0x45,0x44,0x54,0x44,0x45, + 0x44,0x54,0x44,0x54,0x44,0x54,0x44,0x45,0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x44, + 0x54,0x55,0x75,0x55,0x55,0x55,0x56,0x67,0x78,0x77,0x77,0x9B,0xCD,0xDD,0xCD,0xCD, + 0xDD,0xDD,0xEE,0xEE,0xED,0xDB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xED,0xDD,0xDD, + 0xCB,0xBB,0xAB,0xBB,0xBC,0xBA,0xBB,0xCC,0xDB,0xCD,0xCD,0xCC,0xBC,0xBC,0xBC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAC,0xFF,0xDB,0xBB,0xAB,0xBB,0xBA,0xBB, + 0xBB,0xCC,0xCC,0xBB,0x99,0x89,0x99,0x9A,0x9A,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A, + 0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0xAA,0xBA,0xBB,0xBA,0xBB,0xBA,0xBB, + 0xAB,0xBC,0xDD,0xDE,0xDE,0xDD,0xBB,0xAA,0x99,0xA9,0xAA,0xAB,0xCD,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCC,0xCD,0xBB,0xAA,0x99,0xAA,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xDC,0xCB,0xCB,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99, + 0x8B,0xB8,0xAE,0xEE,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xCD, + 0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xBA,0xBD,0xCA,0x9A,0xAA,0x9A,0x9A,0xBB,0xAA,0xAB,0xCB,0x98,0x88,0x77,0x76,0x65, + 0x55,0x55,0x45,0x44,0x54,0x54,0x44,0x54,0x54,0x45,0x44,0x44,0x54,0x45,0x45,0x44, + 0x54,0x45,0x45,0x44,0x54,0x44,0x54,0x54,0x44,0x45,0x44,0x54,0x45,0x45,0x44,0x54, + 0x45,0x45,0x55,0x55,0x55,0x66,0x77,0x88,0x77,0x88,0x9B,0xCD,0xDD,0xED,0xDD,0xDD, + 0xDE,0xDD,0xED,0xED,0xCB,0xBB,0xBB,0xCB,0xBB,0xCD,0xDD,0xED,0xED,0xDD,0xDC,0xCB, + 0xBB,0xAB,0xBB,0xBB,0xAB,0xAB,0xAB,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBC,0xBC,0xBC,0xCD,0xBC,0xBB,0xBA,0xBB,0xCE,0xED,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCB,0xCC,0xBA,0x88,0x88,0x9A,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0xA9,0xA9,0x9A, + 0x9A,0x9A,0x99,0xA9,0x9A,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBA,0xBB,0xBA,0xBB,0xAB, + 0xAB,0xBB,0xCD,0xEE,0xEE,0xDD,0xDB,0xBA,0xA9,0x99,0xAA,0xAB,0xBD,0xDE,0xEE,0xFE, + 0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xCB,0xCB,0xBB,0xCD,0xCC,0xBA,0xAA,0xAB,0xAB, + 0xBB,0xAB,0xBC,0xDC,0xCC,0xBC,0xBD,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9, + 0x98,0xDA,0x8D,0xEE,0xEE,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xCC,0xCC,0xDC,0xDD,0xDD,0xED,0xDE,0xDD,0xDC, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xA9,0x9A,0xAA,0xAA,0xAB,0xBC,0xEF,0xEB,0x98,0x87,0x76, + 0x65,0x55,0x55,0x55,0x45,0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x44,0x54,0x44,0x54, + 0x45,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x54,0x45,0x44,0x54,0x54,0x45,0x45, + 0x55,0x55,0x55,0x67,0x77,0x87,0x8C,0xD9,0x9A,0xCC,0xCC,0xDD,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xED,0xDD,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDE,0xEE,0xDD,0xDB,0xBB, + 0xAB,0xBB,0xAB,0xAB,0xBA,0xBA,0xBB,0xBD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xCB,0xDC,0xBD,0xBD,0xBD,0xCD,0xDC,0xDB,0xBB,0xBC,0xCD,0xCB,0xBA,0xBB,0xBB,0xBB, + 0xBC,0xBD,0xCB,0xB9,0x88,0x89,0x99,0x9A,0xAA,0x9A,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA, + 0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xBA,0xBB,0xBA,0xBB,0xBA,0xAA, + 0xAA,0xBB,0xBD,0xDD,0xED,0xED,0xDD,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xDD,0xDC,0xBB,0xAA,0xA9,0xAB,0xCD,0xBB,0xBA,0xAA,0xAA, + 0xAA,0xBB,0xCC,0xBD,0xCD,0xCC,0xCC,0xBD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBA,0xA9, + 0x99,0x9D,0x8A,0xEE,0xEF,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDD,0xDD,0xED,0xDB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDE,0xED,0xDD,0xDC, + 0xBB,0xBA,0xAA,0xAB,0xA9,0x9A,0x9A,0x9A,0xAA,0xBB,0xDD,0xFF,0xFF,0xFD,0xA8,0x88, + 0x77,0x65,0x56,0x55,0x55,0x55,0x45,0x44,0x45,0x45,0x45,0x44,0x54,0x45,0x54,0x54, + 0x54,0x54,0x54,0x44,0x54,0x54,0x54,0x54,0x45,0x45,0x44,0x54,0x54,0x55,0x55,0x55, + 0x55,0x56,0x67,0x88,0x87,0x88,0x8A,0xCB,0xBB,0xCD,0xCC,0xDD,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDC,0xCB,0xBB,0xBB,0xBC,0xBC,0xDD,0xDD,0xDE,0xEE,0xED,0xED,0xDD,0xDB,0xBA, + 0xBA,0xBA,0xBB,0xAA,0xAA,0xAB,0xBC,0xDC,0xDB,0xDB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB, + 0xCC,0xCC,0xDC,0xDD,0xDD,0xDC,0xDC,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB, + 0xBC,0xCC,0xCC,0xBA,0x87,0x88,0x9A,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA, + 0xAA,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0x99,0xAB,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA, + 0xAB,0xAB,0xBC,0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xAA,0xAB,0xBB,0xBC,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xBC,0xBB,0xBA,0xA9,0x9A,0xAB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xCD,0xDD,0xDC,0xDB,0xCB,0xCC,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA, + 0x99,0x8B,0xA8,0xCE,0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xAB,0xBB,0xBD,0xBD,0xDD,0xDD,0xEE,0xED,0xDD, + 0xDC,0xBB,0xAB,0xAA,0xA9,0xA9,0x9A,0xAA,0xBB,0xCD,0xDE,0xFF,0xFF,0xFF,0xFE,0xB8, + 0x87,0x77,0x76,0x66,0x55,0x55,0x55,0x55,0x54,0x54,0x44,0x45,0x45,0x55,0x55,0x55, + 0x55,0x44,0x45,0x45,0x45,0x44,0x44,0x45,0x45,0x45,0x55,0x55,0x55,0x55,0x55,0x56, + 0x66,0x77,0x89,0x88,0x89,0xAB,0xBB,0xAB,0xAB,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xED, + 0xDC,0xCB,0xBB,0xBC,0xBB,0xCB,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xDD,0xDD,0xCD,0xBB, + 0xBA,0xAB,0xBC,0xBA,0xBA,0xBB,0xBC,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xCB,0xBA,0x98,0x89,0x99,0xAA,0x9A,0xA9,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x9A,0xAA,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA, + 0xAA,0xAA,0xBC,0xCD,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xCB,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xFF,0xEE,0xDD,0xCB,0xBB,0xBB,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xCD,0xCD,0xCD,0xCD,0xCC,0xCB,0xCD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB,0xBA, + 0x99,0x98,0xD8,0x9E,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xCB,0xBB,0xBB,0xBB,0xBC,0xDD,0xCD,0xDD,0xDE,0xDE,0xDC, + 0xCB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBC,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xCA,0x88,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x66,0x65, + 0x55,0x55,0x54,0x54,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x77,0x88, + 0x88,0x88,0xAB,0xAB,0xBC,0xCB,0xBA,0xBA,0xAB,0xBD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEC, + 0xCB,0xBB,0xBB,0xCB,0xCC,0xCD,0xDD,0xED,0xED,0xEE,0xEE,0xDD,0xDD,0xDD,0xCC,0xCB, + 0xBA,0xAB,0xBC,0xCD,0xCB,0xBC,0xCD,0xCD,0xBC,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBB, + 0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB,0xBB, + 0xBC,0xCD,0xBB,0xBA,0x98,0x89,0x99,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBA,0xAA,0x9A,0x9A,0x99,0xA9,0xA9,0xA9,0xA9,0xAB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xBC,0xCB,0xCC,0xDD,0xDC,0xCB,0xBB,0xCC,0xDC,0xDC,0xDD,0xEE,0xEE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xDC,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA, + 0xAB,0xAB,0xBC,0xCD,0xDD,0xCC,0xCC,0xCB,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCC,0xBA, + 0xA9,0x98,0xAB,0x8A,0xEE,0xEF,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDB,0xBB,0xAB,0xAB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB,0xBD,0xEE,0xFE,0xEE,0xFE,0xFF,0xFF,0xEE, + 0xEE,0xEE,0xB9,0x88,0x87,0x77,0x77,0x66,0x65,0x55,0x55,0x55,0x65,0x78,0x88,0x77, + 0x65,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x66,0x67,0x78,0x87,0x78,0xAA,0x99, + 0x99,0x9A,0xAB,0xBB,0xBB,0xCB,0xBB,0xBB,0xAA,0xBE,0xEE,0xDD,0xDE,0xEE,0xEE,0xCB, + 0xBB,0xBB,0xCB,0xBC,0xCD,0xDD,0xDE,0xDE,0xEE,0xED,0xED,0xDD,0xDD,0xDC,0xDC,0xCC, + 0xCB,0xBB,0xBB,0xBC,0xBC,0xCC,0xDC,0xDC,0xCC,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xAB,0xBA,0xBB,0xBA,0xBB, + 0xBC,0xCC,0xCB,0xAA,0x99,0x88,0x99,0x9A,0xAA,0x9A,0x9A,0xAA,0xAA,0xA9,0xAA,0xAB, + 0xCB,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0xAA,0xBB,0xBB,0xAB,0xAA,0xBA,0xAA, + 0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBC,0xDC,0xDC,0xCB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE, + 0xED,0xDD,0xEE,0xEE,0xED,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDC,0xCB,0xCB,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xED,0xDB,0xBB, + 0xAA,0x99,0x8D,0x98,0xDE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xED,0xDD,0xED,0xDD,0xED,0xDB,0xBA,0xBA,0xBB,0xBB,0xCC,0xDC,0xDC,0xDD,0xDD,0xCD, + 0xBB,0xBB,0xBB,0xAB,0xBA,0xAA,0xBA,0xBB,0xCE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xED, + 0xDD,0xDE,0xEE,0xDE,0xCA,0xA8,0x88,0x77,0x77,0x77,0x66,0x66,0x67,0x9F,0xFC,0xBA, + 0x87,0x66,0x65,0x55,0x55,0x56,0x67,0x88,0x8A,0x99,0x88,0x88,0x87,0x8A,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xBB,0xBA,0xAA,0xAC,0xED,0xDD,0xDE,0xEE,0xDB,0xBC, + 0xBB,0xBB,0xBC,0xDD,0xDD,0xEE,0xDE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDB,0xCC,0xCC, + 0xDB,0xBA,0xBA,0xBA,0xBB,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB, + 0xBC,0xDD,0xDD,0xEE,0xFE,0xED,0xDD,0xDD,0xDC,0xCB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB, + 0xBC,0xCB,0xCB,0xBA,0x98,0x88,0x99,0xAA,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0x9A,0x9A, + 0xBA,0xAA,0x9A,0x99,0xA9,0xA9,0xA9,0xA9,0x9A,0xAB,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA, + 0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xCD,0xDD,0xBD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xDD,0xED,0xED,0xED,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xBA, + 0xAA,0xAA,0xBB,0xBC,0xCD,0xCD,0xCD,0xBB,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB, + 0xAA,0x99,0x9A,0xC8,0x9E,0xEE,0xEF,0xED,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xDD,0xED,0xDD,0xDD,0xBB,0xAA,0xBA,0xBB,0xBD,0xCD,0xDD,0xCD,0xCD,0xDC, + 0xDC,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBC,0xEF,0xEF,0xEE,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xDE,0xDD,0xCB,0xCB,0xCD,0xEC,0xBA,0x98,0x88,0x87,0x77,0x88,0x89,0xEF,0xFF,0xFF, + 0xCA,0x88,0x88,0x88,0x78,0x77,0x88,0x99,0x99,0x88,0x88,0x98,0x89,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDB,0xBA,0xAA,0xBA,0xDE,0xDC,0xCC,0xDC,0xCC,0xCB, + 0xBB,0xCB,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xBC,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xDD,0xEF,0xFF,0xFE,0xED,0xDD,0xCD,0xCB,0xBA,0xBA,0xBB,0xAB,0xBA,0xBB, + 0xBB,0xCC,0xBB,0xBA,0x98,0x88,0x99,0x99,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA, + 0x9A,0x9A,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xAA,0xAB,0xBB,0xBA,0xAB,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAB,0xBD,0xCC,0xDB,0xCC,0xDD,0xEE,0xEE,0xEF,0xEE, + 0xED,0xDE,0xDD,0xDD,0xDC,0xCB,0xBB,0xCB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBB,0xCD,0xBB, + 0xAA,0xAA,0xAA,0xBB,0xBD,0xCC,0xDB,0xDB,0xCB,0xBC,0xDE,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xDD,0xCB, + 0xBA,0xA9,0x98,0xBB,0x8A,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDE,0xDD,0xBB,0xAB,0xAB,0xBB,0xCC,0xDC,0xCD,0xDC,0xDC,0xDB, + 0xCC,0xBB,0xBA,0xAA,0xBB,0xBB,0xBC,0xCD,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xEE,0xED,0xDB,0xBB,0xBB,0xBC,0xBB,0xBB,0xCB,0xCB,0xA9,0x99,0x88,0x8A,0xAA,0xA9, + 0x98,0x88,0x88,0x88,0x87,0x77,0x78,0x8A,0xA9,0xAA,0xAA,0xBA,0xBB,0xAB,0xBB,0xBC, + 0xBB,0xCB,0xBB,0xAC,0xDD,0xCD,0xED,0xAA,0xBB,0xCB,0xBC,0xBB,0xBB,0xBC,0xCC,0xBB, + 0xCD,0xCD,0xDD,0xDE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xCC,0xBB,0xBB,0xBD,0xCD,0xBC,0xCC,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xAA,0xBA, + 0xBB,0xBB,0xCD,0xEF,0xFF,0xFE,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB, + 0xBB,0xCB,0xBB,0xBA,0x98,0x88,0x89,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBA,0xA9, + 0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0x9A,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xBA, + 0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xED,0xDD,0xBC,0xCC,0xBC,0xDB,0xCD,0xBB,0xBB,0xAA,0xAA,0xAA,0xBB,0xDC,0xCB, + 0xA9,0xAA,0xAA,0xBB,0xBB,0xDD,0xCD,0xCC,0xBB,0xBB,0xDD,0xEE,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC, + 0xBB,0xAA,0x99,0x8D,0xA8,0xCE,0xEE,0xFE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0xBB,0xDC,0xDB,0xDC,0xBD,0xCD,0xDD, + 0xCC,0xBB,0xBA,0xAB,0xAB,0xBB,0xDB,0xDD,0xDE,0xDE,0xEE,0xFF,0xEF,0xFF,0xEE,0xDE, + 0xEE,0xEE,0xDC,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBA,0xBC,0xDD,0xCB,0xA9,0xAA,0xAB, + 0xBB,0xBB,0xBA,0xAB,0xBB,0xAB,0xAA,0xBB,0xAA,0x9A,0xAA,0xBA,0xAA,0xBB,0xBC,0xBC, + 0xCD,0xCB,0xAA,0xBD,0xDE,0xDB,0xDE,0xDA,0xAB,0xBA,0xBB,0xBB,0xBB,0xCB,0xBB,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB, + 0xBB,0xDD,0xBA,0xBB,0xCC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAA,0x9A, + 0x9A,0xAB,0xBC,0xDE,0xFF,0xEE,0xDD,0xDC,0xDC,0xCB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBA, + 0xBB,0xBC,0xBB,0xBA,0x98,0x88,0x89,0x99,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xAA, + 0x9A,0x9A,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xDD,0xCC,0xBB,0xBC,0xBD,0xDC,0xDC,0xBB,0xBA,0xAA,0xAA,0xAB,0xCD,0xBB, + 0xAA,0xA9,0xAA,0xAA,0xBB,0xCB,0xDC,0xDC,0xCC,0xBB,0xBD,0xEE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDC, + 0xCB,0xAA,0x99,0x99,0xD9,0x9E,0xEE,0xEE,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xED,0xDE,0xDD,0xDC,0xBB,0xAB,0xBC,0xCD,0xCD,0xBD,0xCD,0xCC,0xCC, + 0xCB,0xBB,0xAA,0xAA,0xAB,0xBB,0xCD,0xDD,0xDD,0xED,0xEE,0xEE,0xEF,0xEE,0xDD,0xDE, + 0xEE,0xFE,0xEC,0xBB,0xBC,0xDB,0xBB,0xBA,0xBB,0xAA,0xAA,0xAA,0x99,0x98,0x99,0xBB, + 0xCD,0xCD,0xBA,0xBB,0xBA,0xBA,0xAA,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xDB,0xDC, + 0xDB,0xBA,0xAA,0xAD,0xDD,0xED,0xBD,0xDB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBC,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9,0xA9,0xA9, + 0x99,0x99,0xAA,0xDD,0xDD,0xDD,0xDD,0xDB,0xCC,0xBC,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xA8,0x88,0x88,0x9A,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xA9, + 0xA9,0xA9,0xA9,0xA9,0xAA,0x9A,0x9A,0x99,0x9A,0xAB,0xAB,0xBB,0xAA,0xAA,0xAB,0xAB, + 0xAA,0xBA,0xAA,0xAA,0xAA,0xA9,0xAA,0x9A,0xAB,0xBD,0xDE,0xEF,0xEF,0xEF,0xEF,0xEE, + 0xEE,0xED,0xDB,0xBB,0xBB,0xBC,0xDD,0xCD,0xBC,0xBB,0xAA,0xAA,0xAA,0xAB,0xBC,0xCB, + 0xA9,0x9A,0x9A,0xAA,0xBB,0xBC,0xDD,0xCD,0xBB,0xCB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD, + 0xCB,0xBA,0xA9,0x98,0xBB,0x8A,0xEE,0xEF,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xBB,0xAB,0xBB,0xCD,0xCC,0xCC,0xCC,0xCC,0xCB, + 0xCC,0xBA,0xBA,0xBA,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xED,0xDC,0xCC,0xCC,0xBB,0xAB,0xBB,0xBB,0xBA,0xBB,0xAA,0x99,0x99,0xAB, + 0xCD,0xCB,0xAA,0xAB,0xBB,0xAA,0xA9,0xA9,0x99,0x9A,0xAA,0xBA,0xBB,0xBC,0xCC,0xDC, + 0xDC,0xBA,0xAA,0xAC,0xDC,0xDD,0xBB,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDB,0xDC,0xCB,0xBB,0xBA,0xBB, + 0xAB,0xBB,0xAB,0xBB,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0x99,0x99,0x99, + 0xAA,0x9A,0x9A,0xBD,0xBD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBA,0xAB,0xAB,0xAB,0xAB, + 0xBB,0xBB,0xCB,0xCB,0xA9,0x88,0x88,0x99,0xAA,0xAB,0xBB,0xBA,0xAA,0xAA,0xBB,0xAA, + 0xA9,0xA9,0xA9,0xAA,0xA9,0xA9,0xA9,0x9A,0x9A,0xAB,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA, + 0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAB,0xBD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF, + 0xEE,0xED,0xDD,0xBB,0xBB,0xBC,0xCD,0xDD,0xDC,0xBB,0xBB,0xAA,0xAA,0xAA,0xBC,0xBB, + 0xA9,0x99,0x99,0xAA,0xAB,0xBC,0xCC,0xDC,0xDC,0xBC,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED, + 0xDB,0xBB,0xA9,0x99,0x8D,0xA8,0xDE,0xEE,0xEF,0xED,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xDB,0xBB,0xBB,0xBC,0xBC,0xBC,0xCB,0xBB,0xBB, + 0xCB,0xBA,0xBA,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDD,0xDE,0xDE,0xEE,0xED,0xEE,0xEF, + 0xEF,0xFE,0xED,0xDC,0xDC,0xDB,0xBB,0xAA,0xBB,0xBA,0xAB,0xBB,0xAA,0x99,0x99,0xAC, + 0xDD,0xDC,0xA9,0xAD,0xCC,0xBA,0xAA,0x99,0x99,0xAA,0xAB,0xAB,0xAB,0xBD,0xDD,0xCC, + 0xBB,0xBB,0xAA,0xAA,0xCB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xBD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xBD,0xBC,0xBB,0xBB,0xAB,0xBA, + 0xBB,0xBA,0xBB,0xBC,0xDC,0xCC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA,0xA9,0xA9,0xAA,0xAA, + 0xA9,0xAA,0x99,0xAB,0xBB,0xCD,0xDD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA, + 0xBB,0xBB,0xBC,0xCC,0xB9,0x88,0x88,0x99,0xAA,0xBD,0xDC,0xBB,0xAA,0x9A,0xAA,0xAA, + 0xA9,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xAA,0xAB,0xAB,0xBB,0xAA,0xAA,0xAB,0xAA, + 0xAB,0xAB,0xBA,0xBA,0xAA,0xA9,0x9A,0x9A,0xAA,0xBC,0xDE,0xEE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xDB,0xBB,0xBB,0xCD,0xDD,0xCC,0xCC,0xBB,0xBA,0xAA,0xAA,0xAA,0xBB,0xCB, + 0xAA,0x99,0x99,0x9A,0xAA,0xBB,0xBD,0xCD,0xCC,0xCB,0xBB,0xCD,0xEE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED, + 0xDD,0xBB,0xAA,0x99,0x9A,0xD9,0xAE,0xEF,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE, + 0xEE,0xFE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB, + 0xBA,0xBA,0xAB,0xAB,0xBB,0xDD,0xDE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xEF, + 0xFF,0xFE,0xED,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB,0xBB,0xBA,0xAB,0xBA,0xA9,0xAA,0xAC, + 0xDD,0xCA,0x99,0x9A,0xDB,0xBA,0xAA,0x99,0x9A,0xAA,0xBB,0xBA,0xBB,0xCC,0xDD,0xCB, + 0xBB,0xBB,0xBA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xAB, + 0xBA,0xBB,0xBB,0xBC,0xCD,0xCC,0xBB,0xAB,0xBB,0xAB,0xBB,0xAA,0x99,0x9A,0xAA,0xAA, + 0xAA,0xA9,0xAA,0x9A,0xAB,0xBC,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB, + 0xBB,0xBB,0xBB,0xCB,0xBA,0x88,0x88,0x89,0x9A,0xBD,0xFF,0xEB,0xAA,0xAA,0x9A,0x9A, + 0x9A,0xAA,0xA9,0xA9,0xAA,0x9A,0x9A,0x99,0x9A,0xAB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAB, + 0xAA,0xBA,0xBB,0xBB,0xAA,0xA9,0xA9,0xA9,0xAA,0xBB,0xDD,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xEE,0xED,0xDD,0xBB,0xBB,0xCC,0xCD,0xDD,0xDC,0xDB,0xBA,0xBA,0xAA,0xAA,0xBC,0xBB, + 0xA9,0x99,0x99,0xA9,0xAA,0xAB,0xBC,0xCC,0xCD,0xCC,0xCB,0xBC,0xDE,0xEF,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE, + 0xDD,0xBB,0xBA,0xA9,0x98,0xDA,0x8C,0xEE,0xEF,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xED,0xCB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBA, + 0xBB,0xBA,0xBA,0xBB,0xBD,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xFE,0xED,0xCD,0xDD,0xCC,0xCB,0xBA,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA,0xBB,0xDC, + 0xCA,0xA9,0x99,0x99,0xAB,0xBA,0xAA,0xA9,0xAB,0xBB,0xBA,0xBB,0xBB,0xCD,0xED,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBC,0xCC,0xBC,0xCD,0xCD,0xDD,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xBD,0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xBA,0xA9,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xA9,0x99,0xAA,0xBB,0xCC,0xDB,0xCB,0xBB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBB, + 0xAB,0xBC,0xBC,0xCC,0xCB,0x88,0x88,0x89,0x9A,0xAD,0xFF,0xFE,0xAA,0xA9,0xA9,0xAA, + 0xA9,0xA9,0xAA,0xAA,0xA9,0xA9,0x99,0x9A,0x9A,0xAB,0xAB,0xBA,0xBA,0xAA,0xBA,0xAA, + 0xBA,0xBB,0xBB,0xBB,0xBA,0xAA,0x99,0x9A,0xAA,0xBB,0xDD,0xEE,0xEF,0xEF,0xEE,0xFE, + 0xFE,0xEE,0xDC,0xBB,0xBB,0xCD,0xDD,0xDD,0xCC,0xCB,0xBB,0xAA,0xAA,0x9A,0xAB,0xBB, + 0xA9,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xCD,0xCD,0xBC,0xCB,0xBC,0xDE,0xEE,0xFF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xED,0xDC,0xBA,0xA9,0x99,0x9D,0x99,0xDE,0xEE,0xFE,0xED,0xDD,0xDE,0xDE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAB, + 0xBB,0xAB,0xAB,0xBB,0xDD,0xDE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xED,0xED,0xDD,0xDE, + 0xEE,0xED,0xDC,0xDB,0xDC,0xDC,0xCB,0xBB,0xAB,0xBB,0xBA,0xAB,0xAB,0xAB,0xCD,0xDD, + 0xDC,0xAA,0x99,0x9A,0xAB,0xAB,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBD,0xCD,0xCD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xCC,0xDC,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0x9A,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xA9,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xBC,0xBC,0xCB,0xA8,0x88,0x88,0x99,0xAA,0xDE,0xFE,0xCA,0xAA,0xAA,0xA9, + 0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xAA,0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB, + 0xAA,0xBB,0xBB,0xCC,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBD,0xEE,0xEF,0xEF,0xEF,0xEE, + 0xFE,0xED,0xDC,0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xCC,0xBA,0xBA,0xAA,0x9A,0xAB,0xBA, + 0xA9,0x99,0x99,0x99,0x9A,0xAA,0xAB,0xBC,0xDC,0xDC,0xCB,0xBC,0xBD,0xEE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE, + 0xED,0xDC,0xBB,0xAA,0x99,0x89,0xB8,0xAE,0xEE,0xEE,0xEE,0xCD,0xDE,0xEE,0xEE,0xEE, + 0xFE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xDE,0xDC,0xBB,0xAB,0xBB,0xBB,0xBB,0xAB,0xBA, + 0xBA,0xBB,0xBB,0xBD,0xDD,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xED,0xDB,0xBC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBC,0xBB,0xAA,0xAB,0xCE,0xEE,0xEE, + 0xDD,0xBA,0x9A,0xAA,0xAB,0xBA,0xAB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC,0xDB,0xCC,0xDC,0xDC,0xDB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xCD,0xCC,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0x99,0xAA,0xAA,0xBA,0xAA, + 0xAA,0xAA,0xAA,0xA9,0xAA,0xAB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCC,0xCB,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xCC,0xBC,0xCC,0xB9,0x88,0x89,0x89,0x99,0xAA,0xAB,0xBA,0xAA,0xA9,0xAA, + 0xAA,0x9A,0xA9,0xA9,0xA9,0x99,0x99,0x99,0xAA,0xBA,0xBA,0xBA,0xBA,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xDC,0xCB,0xBB,0xAA,0xAA,0xAA,0xBB,0xCD,0xDE,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xDB,0xBB,0xBB,0xDD,0xDE,0xDD,0xDD,0xDC,0xBB,0xAA,0xA9,0xAA,0xAB,0xBB, + 0xA9,0x98,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xCD,0xCD,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xCA,0x8B,0xEE,0xFE,0xEE,0xDD,0xDD,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xCB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xBD, + 0xDD,0xBB,0xAB,0xAA,0xAA,0xAB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xCC, + 0xCB,0xBB,0xBB,0xCB,0xCC,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xCB,0xDC,0xCD,0xCC,0xCC,0xCB,0xBB, + 0xBA,0xBB,0xBB,0xCC,0xCB,0xBB,0xBB,0xAB,0xAA,0xBA,0xAA,0x99,0xAA,0xAB,0xAA,0xBA, + 0xAA,0xAA,0xAA,0xA9,0x9A,0xAB,0xAB,0xAB,0xBA,0xBB,0xBC,0xBB,0xCB,0xBB,0xBA,0xBB, + 0xAB,0xBB,0xCB,0xCB,0xCC,0xBB,0x99,0x88,0x98,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xA9, + 0xA9,0xAA,0x9A,0xA9,0xAA,0x9A,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xAB,0xAA,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xCD,0xCC,0xCB,0xBA,0xAA,0xAB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFE,0xFE, + 0xEF,0xED,0xDB,0xBB,0xBB,0xCD,0xDD,0xED,0xED,0xDC,0xBB,0xAA,0xAA,0x9A,0xAB,0xBA, + 0xA9,0x99,0x89,0x89,0x99,0x9A,0xAA,0xBB,0xCC,0xDC,0xDC,0xBB,0xCB,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xDD,0xDB,0xBA,0xA9,0x99,0x9D,0x98,0xDE,0xEE,0xFE,0xEC,0xDD,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDB,0xBA,0xBB,0xAA,0xAA,0xAA,0xBA, + 0xBB,0xBB,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB, + 0xAB,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xCB,0xCC,0xCC,0xCC,0xCD,0xBC,0xBB,0xCB,0xCC, + 0xBC,0xCC,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xDB,0xCC,0xCB,0xBC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xCD,0xBC,0xBB,0xBA,0xAA,0xAA,0xBA,0xBA,0x99,0x9A,0xBA,0xBB,0xAA, + 0xAA,0xAA,0xAA,0xA9,0x9A,0xAA,0xBB,0xBA,0xBB,0xBB,0xBB,0xCD,0xCD,0xBB,0xBB,0xAB, + 0xBB,0xBB,0xCC,0xDB,0xCB,0xCB,0xB8,0x89,0x89,0x99,0x99,0x9A,0xAA,0xAA,0x9A,0xAA, + 0xAA,0xA9,0xAA,0x9A,0x99,0x99,0x99,0xAA,0xAB,0xBA,0xBA,0xBA,0xAA,0xAB,0xBB,0xBB, + 0xBB,0xCB,0xCD,0xCD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE, + 0xFE,0xEE,0xCB,0xBB,0xBB,0xCD,0xDE,0xEE,0xED,0xDC,0xBA,0xAA,0xAA,0x9A,0xAB,0xAA, + 0xA9,0x89,0x89,0x99,0x99,0x99,0xAA,0xAB,0xBC,0xDC,0xCB,0xBB,0xBC,0xDD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x8B,0xB8,0xAE,0xEE,0xEE,0xEE,0xCD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDD,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xCD,0xDE,0xDE,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEF,0xEE,0xED,0xDD,0xDC,0xDC,0xDC,0xCB,0xDB,0xDC,0xBC,0xCB,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xCD,0xCD,0xCD,0xCD,0xCC,0xCC,0xCC,0xBC,0xCB, + 0xDB,0xDC,0xDB,0xDC,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBA,0xBB,0xBB,0xCC,0xCB,0xBB,0xBA,0xAA,0xAA,0xAA,0xA9,0x99,0xAA,0xBB,0xBB,0xBB, + 0xBA,0xBA,0xAA,0xA9,0x99,0xAA,0xAB,0xAB,0xAB,0xBB,0xBC,0xCC,0xCC,0xCB,0xBA,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xBD,0xBD,0xBA,0x88,0x89,0x89,0x99,0x99,0x9A,0x9A,0x9A,0x9A, + 0xA9,0xAA,0x9A,0x9A,0x99,0x99,0x99,0xAA,0xBA,0xBB,0xBB,0xBB,0xAA,0xAB,0xBB,0xBD, + 0xDD,0xCD,0xCC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBC,0xBD,0xCC,0xDE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xED,0xDC,0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBA, + 0x99,0x89,0x88,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCD,0xCD,0xCB,0xBB,0xCD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0xDA,0x8B,0xEE,0xFE,0xFE,0xDD,0xDD,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB, + 0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xED,0xEE,0xEE,0xEF,0xEE, + 0xFE,0xEE,0xED,0xDD,0xDD,0xDB,0xCC,0xDC,0xCC,0xCD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xDD,0xCD,0xCC,0xCC,0xCC,0xCD,0xBC,0xCC,0xDC,0xCD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xCC,0xCB,0xBB,0xAB,0xA9,0xAA,0xAB,0xA9,0x98,0x9A,0xAA,0xBD,0xDB, + 0xBB,0xBA,0xAA,0x99,0x99,0xAA,0xAB,0xBA,0xBA,0xBB,0xBC,0xCC,0xDB,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xCC,0xCD,0xCC,0xCC,0xCC,0x98,0x98,0x98,0x99,0x99,0x99,0x9A,0x9A,0xA9, + 0xA9,0xA9,0xA9,0x99,0x99,0x99,0x99,0xAB,0xAB,0xBA,0xBB,0xAB,0xAB,0xAB,0xBB,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xDD,0xDB,0xBC,0xDC,0xDD,0xDE,0xEF,0xEF,0xEE,0xFE, + 0xEE,0xEE,0xDC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA, + 0x98,0x98,0x89,0x89,0x89,0x89,0x9A,0xAA,0xBB,0xCD,0xCC,0xBC,0xBB,0xCD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xDC,0xBA,0xA9,0x99,0xAD,0x99,0xDE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDB,0xAA,0xA9,0xA9,0xAA,0xAB, + 0xCD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xBC,0xCC,0xDC,0xDB,0xDB,0xDC,0xDB,0xDC,0xDB,0xDC,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xBD,0xBC,0xBB,0xBB,0xAB, + 0xBB,0xBB,0xBB,0xCC,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xA9,0x98,0x99,0xAA,0xAB,0xDE, + 0xDC,0xBA,0xA9,0x99,0x99,0xAA,0xAA,0xAA,0xBA,0xBB,0xBC,0xBD,0xCD,0xCB,0xAB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xBD,0xBD,0xCC,0xBA,0x89,0x89,0x98,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xAB,0xBB,0xAA,0xBB,0xBD,0xDD, + 0xDE,0xDD,0xDD,0xDD,0xEE,0xEE,0xED,0xDD,0xDC,0xCD,0xDD,0xEE,0xEE,0xFE,0xFF,0xEE, + 0xEE,0xEE,0xDC,0xDD,0xDE,0xEE,0xED,0xDD,0xCD,0xBB,0xBA,0xAB,0xAB,0xAB,0xAA,0xA9, + 0x99,0x89,0x88,0x88,0x98,0x99,0x99,0xAA,0xAB,0xBC,0xBD,0xCB,0xBB,0xBD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x8B,0xB8,0xAE,0xEE,0xFE,0xEE,0xCD,0xDE,0xEE, + 0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xBA,0xAA,0x9A,0x9A,0xAB, + 0xCD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xEE,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xCD,0xBD,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xCC,0xBC,0xDC,0xDD,0xCD,0xBD,0xBD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCC,0xCC,0xCC,0xBB,0xBB, + 0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA,0xA9,0xAA,0xAA,0xAA,0x98,0x99,0x9A,0xAA,0xAB, + 0xCC,0xAA,0xA9,0x99,0x9A,0xAA,0xAB,0xAB,0xAB,0xBB,0xBC,0xDC,0xDC,0xCB,0xBB,0xAB, + 0xBB,0xBB,0xCC,0xCD,0xCC,0xDB,0xDB,0xDB,0xA9,0x99,0x89,0x89,0x89,0x99,0x99,0x99, + 0x99,0x99,0x99,0x98,0x99,0x99,0xAA,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xCD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xED,0xDD,0xDC,0xDB,0xBB,0xAB,0xAB,0xBA,0xBA,0x99, + 0x98,0x88,0x89,0x88,0x98,0x98,0x99,0x9A,0xAB,0xBC,0xDC,0xCB,0xBB,0xBC,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0x99,0x98,0xDA,0x8B,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDB,0xA9,0xA9,0xAA,0xBB, + 0xCD,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xED,0xED,0xDE,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xBB,0xBB, + 0xBB,0xBB,0xBD,0xCD,0xCD,0xCD,0xDC,0xDC,0xCC,0xCC,0xBD,0xCD,0xCD,0xDC,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xDB,0xDD,0xCD,0xCD,0xCC,0xDD,0xCD,0xCD,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xAB,0xBA,0xAA,0x9A,0xAA,0xAA,0x99,0x89,0x99,0xA9,0xAA, + 0x9A,0xA9,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xBB,0xCB,0xCD,0xCD,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xBD,0xCD,0xCD,0xCD,0xCC,0xA9,0x99,0x98,0x98,0x98,0x98,0x98, + 0x99,0x98,0x98,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xBB,0xCD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xED,0xDD,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xDD,0xDD,0xCC,0xBA,0xBA,0xBB,0xBB,0xAA,0x99, + 0x88,0x88,0x88,0x88,0x88,0x98,0x99,0x99,0xAA,0xBB,0xCC,0xCB,0xBB,0xBB,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x9D,0x99,0xEE,0xEF,0xEF,0xED,0xDD,0xEE, + 0xDE,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xDB,0xBA,0xA9,0xAA,0xAB, + 0xCD,0xEE,0xFE,0xFE,0xFE,0xEE,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xFE,0xFE,0xEF, + 0xEF,0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xED,0xED,0xDB,0xBB, + 0xBB,0xBC,0xCC,0xDD,0xDC,0xDC,0xDC,0xDB,0xDB,0xDB,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xCD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xCD,0xCC,0xDB,0xDC,0xDD,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xBD,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0x9A,0xAA,0xBA,0xA8,0x88,0x99,0x9A,0xA9, + 0xA9,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xBA,0xBB,0xCD,0xCD,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCD,0xCD,0xCD,0xBD,0xCC,0xDC,0xCB,0x99,0x99,0x99,0x99,0x99,0x99, + 0x89,0x89,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBC,0xDD,0xEE, + 0xEF,0xEF,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xFF,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xED,0xCD,0xBC,0xCB,0xBB,0xBA,0xBB,0xBB,0xAA,0x98, + 0x98,0x89,0x88,0x98,0x88,0x88,0x98,0x99,0xAA,0xAB,0xBD,0xBC,0xBB,0xBB,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xFE,0xED,0xDC,0xBB,0xAA,0x99,0x8A,0xB8,0xAE,0xEE,0xEE,0xEE,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xBA,0xA9,0xAA,0xAB, + 0xBD,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDB,0xDC,0xDE,0xDE,0xDE,0xDD,0xCB, + 0xBC,0xBC,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCC,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCC,0xBD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCB,0xDC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0x9A,0xAA,0xAB,0xA9,0x98,0x89,0x99,0x99, + 0x99,0x99,0x98,0x99,0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xCC,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xBC,0xBB,0xCB,0xDC,0xDC,0xDD,0xCD,0xBD,0xCD,0xCA,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xBB,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xFE,0xEE,0xED,0xEE,0xFF,0xEE,0xED,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0x98, + 0x88,0x88,0x88,0x88,0x98,0x89,0x89,0x99,0x9A,0xAB,0xBC,0xCC,0xBB,0xBB,0xDD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xAA,0xA9,0x98,0xDA,0x8C,0xEE,0xEF,0xEE,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDD,0xCB,0xAA,0x9A,0xAB, + 0xBD,0xEE,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE, + 0xFE,0xEE,0xDD,0xDD,0xED,0xEE,0xDE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDE,0xED,0xDD,0xCB, + 0xBC,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xDC,0xDB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xDD,0xCD,0xDC,0xDC,0xDB,0xCC,0xDB,0xCC,0xCC,0xCC,0xCD,0xCD,0xCC,0xDB,0xCC,0xDB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xAA,0xA9,0xAA,0xAB,0xAA,0x99,0x88,0x98,0x99, + 0x99,0x99,0x98,0x99,0xAA,0xBA,0xAA,0xAA,0xAB,0xBB,0xCC,0xDC,0xCD,0xBB,0xBB,0xBB, + 0xCB,0xBB,0xBC,0xBC,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xBA,0xAA,0x99,0x9A,0xAA, + 0xAA,0x99,0x99,0xAB,0xBC,0xBC,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB,0xBB,0xBD,0xDD,0xEE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xFF,0xEF, + 0xEE,0xEE,0xEE,0xDD,0xEE,0xEE,0xDD,0xCB,0xBB,0xBB,0xBC,0xBB,0xAB,0xAB,0xBA,0xA9, + 0x88,0x88,0x89,0x89,0x88,0x98,0x98,0x99,0x9A,0xAB,0xBC,0xCC,0xBB,0xBB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x98,0x9D,0x89,0xEE,0xEE,0xFE,0xED,0xDD, + 0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xDD,0xDB,0xAA,0xA9,0xAB, + 0xCD,0xDE,0xEE,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDE,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xCD,0xCD,0xDD,0xED,0xED,0xDD, + 0xCD,0xCD,0xDD,0xDC,0xDD,0xDC,0xDB,0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD, + 0xCD,0xDC,0xDC,0xDB,0xDB,0xDC,0xCC,0xBC,0xCC,0xCC,0xCB,0xCC,0xCD,0xCB,0xDC,0xCC, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0x9A,0xAA,0xBA,0xBA,0xA9,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCC,0xDC,0xCB,0xBB,0xBC, + 0xBC,0xCC,0xBC,0xBC,0xCB,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xAA, + 0xAA,0xAB,0xBB,0xBD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xBB,0xBD,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xDD,0xDC,0xDD,0xEE,0xEF,0xEF,0xEF, + 0xFE,0xFE,0xEE,0xDD,0xDC,0xDE,0xDC,0xCB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBA,0xA9, + 0x89,0x89,0x88,0x88,0x89,0x88,0x98,0x99,0x9A,0xAB,0xBB,0xCC,0xCB,0xBB,0xBD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8B,0xA8,0xAE,0xEE,0xEE,0xEE,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xBB,0xAA,0xAA, + 0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD, + 0xCD,0xCD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xDC,0xDD,0xCD,0xBD,0xBC,0xBC,0xBC,0xCC,0xBB,0xBB,0xBC,0xCB,0xCC,0xDC,0xDC,0xDC, + 0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xA9,0x99,0x99, + 0x99,0x9A,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xBC,0xCD,0xBC,0xBB,0xBC,0xBC, + 0xCC,0xBC,0xCB,0xCC,0xBD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB,0xCD,0xDE,0xEE, + 0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xEE,0xDD,0xCC,0xDD,0xDE,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEE,0xED,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAB,0xBB,0xAA, + 0x98,0x88,0x98,0x98,0x98,0x99,0x89,0x89,0x99,0xAA,0xBB,0xCC,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xAA,0x99,0x98,0xD9,0x8C,0xEE,0xFE,0xEE,0xED, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCB,0xAA,0xAA, + 0xBB,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDE,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xDE,0xDE,0xED,0xDD,0xCD,0xDD,0xDD, + 0xCD,0xDC,0xDC,0xDC,0xBD,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBD,0xCD,0xCC,0xCC,0xCC, + 0xBD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA,0x99,0x99, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCB,0xDB,0xDC,0xCB,0xBB,0xCC, + 0xBD,0xCC,0xCC,0xCC,0xCC,0xBD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xED, + 0xDD,0xED,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xDD,0xDE,0xEE, + 0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xED,0xDC,0xBB,0xBB,0xDD,0xEE,0xEE,0xFF, + 0xEF,0xEF,0xFE,0xEE,0xDD,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xAB,0xBA,0xAB,0xAA, + 0x99,0x98,0x88,0x98,0x89,0x88,0x99,0x99,0x99,0xAA,0xBB,0xCC,0xBB,0xBB,0xBD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x9C,0x98,0xDE,0xEE,0xFE,0xED, + 0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDE,0xDB,0xBA,0xAB, + 0xBB,0xBD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xDC, + 0xDC,0xDB,0xDC,0xDC,0xCB,0xBB,0xAB,0xAB,0xBA,0xBB,0xDE,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xDC,0xDD,0xCD,0xBD,0xBC,0xCB,0xDB,0xBC,0xBB,0xBB,0xBB,0xCC,0xCC,0xCD,0xCD,0xBD, + 0xBC,0xCC,0xCB,0xCB,0xBB,0xCC,0xBB,0xBA,0xBA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xBB,0xBB,0xCC,0xCD,0xBC,0xBB,0xCC,0xCC, + 0xDC,0xCD,0xBD,0xBC,0xDB,0xCC,0xDB,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEE,0xEE,0xDC,0xBB,0xBC,0xDD,0xEE,0xFF,0xEF, + 0xFF,0xFF,0xEF,0xEE,0xED,0xCB,0xBB,0xBA,0xBA,0xBA,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA, + 0xA9,0x99,0x89,0x89,0x99,0x99,0x89,0x98,0x99,0xAA,0xBB,0xBC,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8A,0xB8,0xAE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xBB,0xAA, + 0xAB,0xBC,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDB,0xDB,0xDB,0xDC,0xDC,0xDD,0xDD,0xED,0xDD,0xDD,0xCD,0xDC,0xDC, + 0xDC,0xDD,0xDD,0xCB,0xBB,0xAA,0xAA,0xAA,0xAB,0xAB,0xBD,0xEE,0xDE,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xDC,0xDC,0xDB,0xDC,0xCC,0xCB,0xBB,0xCB,0xCC,0xCC,0xCC,0xCC,0xCB,0xDC, + 0xDC,0xDC,0xCD,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xAB,0xBA,0xAB,0xAB,0xBB,0xBC,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xDC,0xDC,0xBB,0xAB,0xBB,0xCB,0xDB,0xDC,0xCB,0xBB,0xCB,0xCC, + 0xCB,0xDC,0xDC,0xDC,0xCC,0xCB,0xCC,0xCC,0xDC,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xCC,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB,0xBB,0xCC,0xDD,0xEE,0xEF, + 0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xDD,0xCB,0xBB,0xDD,0xEE,0xEE,0xFE, + 0xFE,0xFE,0xFF,0xFE,0xED,0xDC,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0x99,0x99,0x99,0x99,0x99,0x98,0x99,0x99,0x9A,0xBB,0xBB,0xBB,0xBB,0xBC,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0x88,0xDA,0x8A,0xEE,0xEF,0xEE, + 0xEC,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDB,0xBA, + 0xAB,0xBB,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCD,0xBD, + 0xCD,0xCD,0xCC,0xBB,0xAA,0xAA,0x9A,0x9A,0xAB,0xBB,0xBC,0xDE,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xBB,0xCB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDC, + 0xCC,0xCD,0xBD,0xBD,0xBD,0xCD,0xDC,0xCB,0xBA,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xBB,0xBB,0xBB,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xDC,0xDC,0xDB,0xDB,0xCB,0xBB,0xCC,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xBD,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBC,0xCD,0xDE,0xEE,0xEE, + 0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEE,0xED,0xDB,0xCC,0xDD,0xEE,0xEE,0xEF, + 0xEF,0xFF,0xFE,0xFF,0xEE,0xDD,0xBB,0xBA,0xAB,0xAA,0xAA,0xAB,0xAB,0xAA,0xA9,0xAA, + 0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x89,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x99,0x9D,0x98,0xDE,0xEE,0xEE, + 0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xBB, + 0xAA,0xBB,0xCC,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD, + 0xDD,0xDE,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xBD,0xCC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC, + 0xDD,0xDC,0xBB,0xAA,0xAA,0xA9,0x99,0x99,0xAA,0xAB,0xBB,0xBD,0xEE,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDB,0xDC,0xBD,0xCD,0xDD,0xDC,0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCB,0xDC,0xDC,0xDB,0xCC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBD,0xCD,0xCD,0xCD,0xCC,0xCC,0xCC,0xCB,0xDC,0xDD,0xDD,0xCD,0xCB,0xDC,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xCD,0xDE,0xEE,0xFE, + 0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEE,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEF,0xEF,0xFE,0xFE,0xED,0xCB,0xBB,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0x9A, + 0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAB,0xBC,0xBB,0xBB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8B,0xB8,0x9E,0xEE,0xEF, + 0xEE,0xDD,0xDE,0xED,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xED,0xDB, + 0xBB,0xBB,0xCD,0xDD,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xDD, + 0xDD,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD, + 0xDC,0xBB,0xBA,0xBA,0x99,0x99,0x99,0xA9,0xAA,0xAB,0xBB,0xBC,0xDD,0xED,0xDD,0xDC, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xBC,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xED, + 0xDD,0xCD,0xCD,0xCC,0xDC,0xDD,0xDD,0xED,0xBB,0xBB,0xBA,0xAA,0xAA,0xBA,0xBB,0xAB, + 0xAB,0xAB,0xBB,0xBC,0xCC,0xDC,0xDC,0xCC,0xCB,0xCD,0xBD,0xBB,0xBB,0xBB,0xBB,0xCB, + 0xBB,0xCC,0xDC,0xDC,0xDC,0xCC,0xBC,0xBB,0xCB,0xCD,0xDD,0xCD,0xCC,0xBC,0xCD,0xDD, + 0xDD,0xCD,0xCD,0xBC,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF, + 0xEF,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xFF,0xEF,0xEE,0xDB,0xBA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0x9A, + 0x9A,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xAA,0x99,0x98,0xDA,0x8C,0xEE,0xEE, + 0xEE,0xEC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDC, + 0xBB,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDD,0xDD, + 0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD, + 0xCB,0xBB,0xAA,0x9A,0x99,0x9A,0xAA,0xAA,0xA9,0xAA,0xBA,0xBB,0xBD,0xDE,0xDD,0xDD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCC,0xCB,0xCB,0xBB,0xBA,0xBA,0xBA,0xBB,0xDE, + 0xDD,0xDD,0xCD,0xBD,0xBD,0xCD,0xDC,0xDD,0xDC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xBB,0xBC,0xCC,0xBD,0xCD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBD, + 0xCB,0xBD,0xBD,0xCD,0xCD,0xCD,0xCC,0xCC,0xBC,0xBD,0xCD,0xDD,0xCD,0xCC,0xCD,0xCD, + 0xCD,0xDC,0xDC,0xCC,0xBB,0xBB,0xAB,0xBA,0xBB,0xAB,0xBB,0xCC,0xDD,0xEE,0xEE,0xFE, + 0xFE,0xFE,0xFF,0xEF,0xFF,0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xEE,0xDE,0xDE,0xDE,0xED, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xDC,0xBB,0xAA,0xAA,0xA9,0xA9,0xAA,0xAB,0xAA,0xA9, + 0xA9,0xAA,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x9D,0x99,0xEE,0xEE, + 0xFE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xDD, + 0xBB,0xBA,0xBB,0xBD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xED, + 0xED,0xDD,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDB, + 0xBB,0xAA,0xA9,0xA9,0x9A,0xAA,0xBB,0xAA,0xA9,0xAA,0xAB,0xBB,0xBB,0xDD,0xED,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xDC,0xDB,0xCC,0xCB,0xCC,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xBB, + 0xDE,0xDD,0xDC,0xDC,0xDB,0xDD,0xCD,0xBC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xBA,0xBB,0xBC,0xDB,0xDC,0xDC,0xDB,0xCD,0xBC,0xBB,0xBB,0xBB,0xBD,0xDB, + 0xCC,0xCC,0xCC,0xDC,0xDC,0xDB,0xDB,0xCB,0xCC,0xCC,0xDD,0xCD,0xCC,0xBB,0xCD,0xDD, + 0xDD,0xCD,0xCB,0xCB,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBC,0xCD,0xDE,0xEE,0xFE,0xFE, + 0xFF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDE,0xDE,0xEE,0xFE,0xFE,0xFE,0xED,0xBB,0xAA,0xA9,0x99,0xA9,0xA9,0xAA,0xAB,0xAA, + 0x9A,0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x8A,0xB8,0xAE,0xEE, + 0xEE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD, + 0xDB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xEE, + 0xDD,0xDC,0xBD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xCB, + 0xBA,0xAA,0xA9,0x99,0xAA,0xBB,0xBB,0xBB,0xBA,0xA9,0xAA,0xAB,0xBB,0xCD,0xDD,0xDD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xCC,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB,0xBA, + 0xBD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDB,0xDC,0xCB,0xCC,0xCC,0xCC,0xCB,0xCB,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD, + 0xCC,0xCB,0xCC,0xCC,0xCD,0xCD,0xCD,0xCD,0xCC,0xBD,0xBD,0xCD,0xCB,0xBB,0xBB,0xBD, + 0xCC,0xCB,0xBB,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDE,0xED,0xED, + 0xED,0xED,0xEE,0xEE,0xFE,0xFE,0xEE,0xDB,0xBA,0xAA,0x9A,0x99,0x99,0xAA,0xAA,0xAA, + 0xA9,0x9A,0xAA,0xAA,0x99,0xA9,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0x99,0x98,0xCA,0x8A,0xEE, + 0xEF,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xDE,0xDD,0xED,0xDE, + 0xDD,0xBB,0xBA,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xCD,0xDE,0xEE, + 0xDB,0xCC,0xDC,0xDD,0xDD,0xCD,0xCD,0xCD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB, + 0xAA,0x99,0x99,0xAA,0xBB,0xBC,0xDB,0xDB,0xBB,0xA9,0xAA,0xAA,0xBA,0xBB,0xDD,0xDD, + 0xDC,0xDC,0xDB,0xDC,0xDC,0xDB,0xCC,0xCC,0xBB,0xBA,0xBA,0xA9,0xA9,0x9A,0xAB,0xAB, + 0xBB,0xBE,0xDD,0xDD,0xDC,0xDC,0xCD,0xCD,0xBC,0xCB,0xCC,0xCC,0xCD,0xBD,0xBC,0xCB, + 0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xCC,0xDC,0xDB,0xCC,0xBB,0xBC,0xCB,0xCC,0xBC,0xCD, + 0xDC,0xDB,0xBC,0xBD,0xBD,0xCD,0xCD,0xCC,0xDB,0xDB,0xDB,0xDC,0xCB,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xAB,0xBA,0xBB,0xBC,0xDC,0xDD,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xFF,0xFE,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xBA,0xA9,0xA9,0x9A,0x99,0x9A,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8D,0x98,0xDE, + 0xEE,0xEE,0xED,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD, + 0xDD,0xCB,0xBB,0xAB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xDE,0xDD, + 0xDB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCB,0xAA, + 0xAA,0x99,0x9A,0xAB,0xCB,0xCC,0xCD,0xCD,0xCB,0xAA,0x99,0xAA,0xAB,0xBB,0xBD,0xDD, + 0xDD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xAA,0xAA,0x99,0x99,0x99,0x99,0xAA, + 0xAB,0xBC,0xED,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD,0xBD,0xCB,0xDB,0xDC,0xDC,0xCC,0xCB, + 0xBB,0xBB,0xCC,0xBC,0xDC,0xCD,0xBD,0xCC,0xCC,0xBB,0xBB,0xBC,0xCD,0xCB,0xDC,0xDC, + 0xDD,0xCD,0xCC,0xCC,0xBD,0xCB,0xDC,0xDD,0xCD,0xBD,0xBD,0xCD,0xCB,0xBA,0xAB,0xAB, + 0xAB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xAB,0xBB,0xCB,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF, + 0xFF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xED,0xDE,0xEE,0xFE,0xFE,0xFE,0xED,0xDB,0xAA,0x99,0x99,0x9A,0x9A,0x9A,0xAB, + 0xAA,0xA9,0xAA,0xAA,0xA9,0x9A,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8B,0xB8,0xAE, + 0xEE,0xEF,0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDE, + 0xDD,0xDB,0xBB,0xBA,0xBB,0xBC,0xCC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xCD,0xDE,0xDB, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xCC,0xBB,0xAA, + 0xA9,0x99,0xAA,0xBB,0xCC,0xBB,0xCC,0xCD,0xCC,0xBA,0xA9,0x9A,0xAA,0xBB,0xBC,0xDD, + 0xDD,0xDC,0xCD,0xBD,0xBC,0xCC,0xCB,0xBB,0xAA,0xAA,0x99,0x99,0xAA,0xA9,0xA9,0xAA, + 0xAA,0xBB,0xCE,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCC,0xDB,0xBC, + 0xCB,0xDB,0xCD,0xDD,0xCD,0xDC,0xDB,0xCD,0xBB,0xCB,0xBB,0xCC,0xDD,0xDD,0xCC,0xDD, + 0xDD,0xDD,0xCD,0xCC,0xDB,0xCD,0xBD,0xBD,0xDC,0xDC,0xDC,0xDB,0xCB,0xAA,0xAA,0xBB, + 0xBA,0xBA,0xBB,0xBC,0xDB,0xCB,0xBB,0xBB,0xBB,0xCD,0xDD,0xEE,0xEF,0xEF,0xEF,0xFE, + 0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEE,0xEC,0xBA,0xA9,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xA9,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xAA,0x99,0x88,0xDA,0x8B, + 0xEE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDE,0xDD,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xCD,0xDD,0xDD, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xDD,0xED,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xCB,0xBA,0xAA, + 0x99,0x9A,0xBB,0xCC,0xCC,0xBB,0xBB,0xBD,0xCB,0xBA,0xAA,0x99,0xAA,0xBA,0xBB,0xDD, + 0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xBB,0xBA,0xAA,0xA9,0x99,0x9A,0xAA,0xBA,0xA9,0x99, + 0xAA,0xBA,0xBC,0xED,0xDD,0xCD,0xCD,0xCC,0xBD,0xCC,0xCC,0xDB,0xDC,0xDD,0xCD,0xDC, + 0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD,0xCD, + 0xCD,0xDD,0xDC,0xDD,0xCD,0xCB,0xDC,0xDC,0xDC,0xDC,0xCB,0xDC,0xCB,0xBA,0xAA,0xAB, + 0xAB,0xAB,0xBB,0xBC,0xBD,0xBB,0xBA,0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xFE,0xFE, + 0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFE,0xED,0xCB,0xAA,0x9A,0x99,0xA9,0x99,0xAA, + 0xAB,0xAA,0xA9,0xAA,0xAA,0xA9,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xCD,0xEC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x9D,0x98, + 0xDE,0xEE,0xFE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xED, + 0xDD,0xDD,0xCB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDC, + 0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xED,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xBD,0xCD,0xCD,0xCD,0xCC,0xBB,0xAA,0xA9, + 0x9A,0xAB,0xBD,0xCC,0xBC,0xBC,0xCC,0xCC,0xCB,0xBB,0xAA,0x99,0xAA,0xAA,0xBB,0xBD, + 0xDD,0xDD,0xCD,0xCD,0xCC,0xCB,0xBA,0xAA,0xAA,0x99,0x99,0xAA,0xBB,0xBB,0xBA,0xA9, + 0x9A,0xAB,0xBB,0xCE,0xDD,0xDD,0xCD,0xCD,0xCC,0xDB,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD, + 0xCD,0xCD,0xCD,0xDD,0xDC,0xDB,0xDB,0xDB,0xCB,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xBC,0xCD,0xBD,0xBD,0xCD,0xCD,0xBB,0xBA,0xAA,0xAA, + 0xAA,0xBA,0xBB,0xBC,0xCC,0xCB,0xBB,0xBB,0xBC,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFF, + 0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDE,0xEE,0xEE,0xEF,0xFE,0xFE,0xFE,0xFE,0xDB,0xAA,0x99,0x99,0x99,0xA9,0x9A, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xCD,0xEB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8B,0xB8, + 0x9E,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDD,0xED,0xDC,0xBB,0xAB,0xAB,0xBB,0xBA,0xBA,0xBB,0xAB,0xAB,0xBB,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xCB,0xBA,0xAA,0x99, + 0x9A,0xBB,0xDC,0xDD,0xCB,0xBB,0xCC,0xCB,0xBB,0xBB,0xBA,0x9A,0x99,0xAA,0xBA,0xBC, + 0xDD,0xDC,0xDC,0xDC,0xDC,0xBB,0xBA,0xAA,0x99,0x99,0x9A,0xBB,0xBB,0xCC,0xBB,0xAA, + 0x9A,0xAA,0xAB,0xBD,0xED,0xDD,0xCD,0xCD,0xBD,0xBD,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xBC,0xCB,0xBC,0xCD,0xDC,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xDC,0xCB,0xBB,0xBC,0xBD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xEF, + 0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDD,0xDE,0xDE,0xEF,0xEF,0xEF,0xFF,0xEF,0xEE,0xED,0xBA,0xA9,0xA9,0xA9,0x99,0xA9, + 0xAA,0xBA,0xAA,0x9A,0xAA,0xAA,0xA9,0x9A,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xAA,0x99,0x88,0xDA, + 0x8A,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDD,0xDD,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDE, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xBB,0xAA,0xA9,0x99, + 0x9B,0xCD,0xDD,0xCC,0xCB,0xBC,0xCC,0xBB,0xCC,0xBB,0xBA,0xA9,0x99,0xAA,0xAB,0xBB, + 0xBD,0xDD,0xCD,0xCC,0xBC,0xBA,0xAA,0x99,0x99,0x9A,0xAA,0xBC,0xDC,0xDC,0xDB,0xBA, + 0xA9,0x9A,0xBA,0xBB,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDB,0xBC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDE,0xDD, + 0xCD,0xDD,0xCD,0xDC,0xDD,0xCD,0xBC,0xCC,0xCC,0xCB,0xCC,0xDB,0xDB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xBB,0xCC,0xCB,0xBB,0xBC,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFF, + 0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED, + 0xDD,0xED,0xEE,0xEE,0xEF,0xFE,0xFE,0xFF,0xEF,0xED,0xCB,0xAA,0x9A,0x99,0xA9,0xA9, + 0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0x99,0xAA,0xAB,0xBB,0xCB,0xCB,0xCC,0xDE,0xCB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x99,0x9D, + 0xA8,0xDE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xED,0xED,0xDD,0xDB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xBB,0xAA,0x99,0x99, + 0xAA,0xDD,0xDD,0xDC,0xCB,0xBB,0xCC,0xDC,0xCC,0xCB,0xBB,0xAA,0x99,0x99,0xAA,0xBA, + 0xBB,0xCD,0xDC,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0xAA,0xBC,0xCC,0xDC,0xDD,0xCC,0xBA, + 0xAA,0xA9,0xAA,0xBB,0xCD,0xDD,0xDC,0xDC,0xDC,0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD, + 0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDB,0xDC,0xCB,0xCB,0xCC,0xBD,0xCD,0xCD,0xCD, + 0xCD,0xCD,0xBD,0xBD,0xCC,0xCB,0xBB,0xCB,0xDD,0xDE,0xEE,0xEF,0xEF,0xFE,0xFF,0xEF, + 0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEE,0xDB,0xAA,0x9A,0x9A,0x99,0x99, + 0x9A,0xAA,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBC,0xDE,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x89, + 0xD8,0xAE,0xEE,0xEF,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE, + 0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xDE, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCB,0xBB,0xAA,0x99,0x99, + 0x9A,0xBE,0xED,0xDC,0xCB,0xBC,0xDC,0xCB,0xBC,0xBB,0xBB,0xAA,0xA9,0x99,0xAA,0xAB, + 0xBB,0xBC,0xCC,0xBB,0xAA,0xAA,0x99,0x99,0x9A,0xAC,0xBC,0xDD,0xCD,0xBC,0xDB,0xBB, + 0xBA,0x9A,0xAA,0xAA,0xBC,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDC, + 0xDC,0xDD,0xDD,0xCD,0xDC,0xCC,0xCC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCC,0xCD,0xBD, + 0xBD,0xCD,0xDD,0xCD,0xDD,0xCD,0xCD,0xCD,0xBB,0xBB,0xBC,0xCD,0xCC,0xDC,0xDC,0xDD, + 0xCD,0xCD,0xCC,0xCC,0xCC,0xCB,0xBB,0xBC,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xFE,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE, + 0xDE,0xDE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xEE,0xDB,0xAA,0x9A,0x9A,0x9A,0x9A, + 0x99,0xAA,0xAB,0xAA,0xAA,0xAB,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDE,0xAB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xBA,0x99,0x98, + 0xBB,0x8A,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED, + 0xDE,0xDE,0xDE,0xDD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBC,0xDD,0xDD,0xED, + 0xED,0xED,0xED,0xEE,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xBB,0xA9,0x99,0x88, + 0x9A,0xBD,0xEE,0xDD,0xCB,0xBC,0xBD,0xDC,0xCB,0xBB,0xBB,0xBA,0xAA,0x99,0x99,0xAA, + 0xBA,0xBB,0xBB,0xBA,0xAA,0xA9,0x99,0x99,0xAB,0xBC,0xDD,0xDC,0xDC,0xDC,0xCC,0xCC, + 0xBA,0xA9,0x9A,0xAB,0xAB,0xDE,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD, + 0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xCB,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xDB,0xDC, + 0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xCC,0xBC,0xCC,0xBD,0xCD,0xCD,0xDC, + 0xDD,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFE, + 0xFE,0xFE,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xED,0xDB,0xAA,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xAA,0xAB,0xAA,0xAA,0xAB,0xBA,0xAB,0xBB,0xCB,0xBB,0xBB,0xBD,0xDD,0xAB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98, + 0x8D,0xA8,0xDE,0xEE,0xEF,0xEE,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xDC,0xDC,0xDD,0xDD,0xDD,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDD,0xCD,0xCC,0xBB,0xAA,0x98,0x99, + 0x99,0xAB,0xEE,0xED,0xDB,0xBB,0xCD,0xCD,0xBB,0xBB,0xBA,0xBB,0xAA,0xA9,0x9A,0xAA, + 0xAB,0xBB,0xDB,0xAA,0xA9,0x99,0x99,0x9A,0xBB,0xCD,0xBD,0xCD,0xDC,0xCC,0xCC,0xCC, + 0xBB,0xAA,0x9A,0xAA,0xBB,0xBD,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xDC,0xDD,0xCD,0xCC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xBC, + 0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xBC,0xCB,0xCC,0xCC,0xDB,0xDC,0xDD,0xCD, + 0xCD,0xCD,0xCD,0xBC,0xBC,0xBB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEF,0xFE,0xFE,0xFF, + 0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xDD,0xBA,0xAA,0xAA,0x9A,0x9A,0x9A, + 0x9A,0x9A,0xAA,0xAB,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCB,0xCD,0xEC,0xBA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x98, + 0x99,0xC8,0x9E,0xEE,0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xCB,0xBB,0xCB,0xCC,0xBD,0xCD,0xCC,0xBD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDE,0xDE,0xEE,0xDD,0xCD,0xDD,0xDE,0xDD,0xEE,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xAA,0x99,0x88, + 0x99,0x9A,0xCE,0xED,0xDD,0xCB,0xCC,0xDC,0xBB,0xBB,0xAB,0xBB,0xBB,0xAA,0xA9,0x9A, + 0xAA,0xAB,0xBB,0xAA,0x99,0x99,0x9A,0xAB,0xBD,0xCD,0xDC,0xDD,0xCD,0xDD,0xCC,0xBC, + 0xCB,0xBA,0x99,0xAA,0xBB,0xBC,0xDE,0xDD,0xCD,0xDD,0xCD,0xBD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB, + 0xCB,0xCD,0xDE,0xED,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xBD,0xCD,0xBD,0xCC,0xDB,0xDC, + 0xCD,0xBD,0xCC,0xCC,0xBB,0xBA,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFE, + 0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xAA,0x9A,0x9A,0xA9,0xA9, + 0x9A,0x9A,0x9A,0xAA,0xBA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xDD,0xEA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xAA,0xA9, + 0x98,0xCA,0x8A,0xEE,0xEE,0xFE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xED,0xBC,0xBC,0xCD,0xCD,0xDC,0xDC,0xDB,0xCD,0xDD,0xDD,0xCD, + 0xDE,0xDD,0xDD,0xDE,0xEE,0xDD,0xDB,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0x98,0x88, + 0x98,0x9A,0xAC,0xEE,0xDD,0xBC,0xCD,0xCB,0xBB,0xAB,0xBB,0xBB,0xCB,0xBA,0x99,0x9A, + 0xAA,0xBB,0xAA,0xA9,0x99,0x99,0xAB,0xBB,0xDD,0xDD,0xDC,0xCC,0xDC,0xDC,0xDB,0xDD, + 0xDC,0xBB,0xA9,0xAA,0xAB,0xBB,0xDE,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDC, + 0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xBD,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBC, + 0xBC,0xCC,0xDE,0xFE,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCC,0xCC,0xBB,0xCC,0xCB, + 0xBB,0xCB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xED,0xED,0xDE,0xEE,0xEE,0xFE,0xFF, + 0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xDD,0xBB,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xA9,0xAA,0xBA,0xBA,0xAA,0xBB,0xBC,0xBC,0xCB,0xBB,0xCC,0xDE,0xDA,0xAB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9, + 0x98,0x9D,0x98,0xCE,0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xED,0xDD,0xDB,0xBB,0xBC,0xDC,0xDD,0xDD,0xBD,0xCB,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xBD,0xDE,0xDE,0xED,0xDD,0xDD,0xED,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xBA,0x99,0x88, + 0x89,0x99,0x9B,0xEE,0xED,0xCC,0xBD,0xBB,0xBB,0xBB,0xBC,0xBC,0xCB,0xBB,0xAA,0x99, + 0x9A,0xAB,0xAA,0x99,0x99,0xAA,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xBD,0xCD, + 0xCD,0xCB,0xAA,0x9A,0xAB,0xBB,0xCE,0xED,0xDD,0xCD,0xDC,0xDB,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDC,0xDC,0xDD,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xBC,0xCD,0xEF,0xED,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCC,0xBC,0xBB,0xBC, + 0xCB,0xCB,0xCC,0xCB,0xBB,0xBA,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE, + 0xFF,0xFE,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xED,0xDB,0xBA,0xAA,0xAA,0xAA,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xA9,0xAA,0xAB,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDE,0xAA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA, + 0x99,0x8A,0xC9,0x9D,0xEE,0xEF,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xDE,0xDE,0xDD,0xBB,0xBB,0xCD,0xDD,0xDC,0xCC,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDB,0xDC,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xED, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBA,0x99,0x98, + 0x88,0x99,0x9A,0xBE,0xED,0xDB,0xCB,0xBB,0xAB,0xBB,0xCB,0xCC,0xDC,0xDB,0xBA,0xA9, + 0xAA,0xAA,0xAA,0x99,0x9A,0xAB,0xBD,0xBC,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xDC,0xDD, + 0xDD,0xCC,0xBA,0x9A,0xAA,0xBB,0xBD,0xED,0xDD,0xDC,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xDB,0xCB, + 0xBB,0xCC,0xDC,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xBC,0xDB,0xCB,0xBC,0xBC,0xBB, + 0xBB,0xBC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xCC,0xCC,0xDD,0xEE,0xFE,0xFF, + 0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xDC,0xCB,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xAA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xBA, + 0x99,0x98,0xBB,0x8A,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDB,0xBB,0xBB,0xBD,0xCD,0xDC,0xBC,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCC,0xDD,0xCD,0xDD,0xCB,0xDD,0xED,0xED,0xDD,0xED,0xED,0xED,0xED, + 0xED,0xED,0xED,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0x99,0x99, + 0x89,0x89,0x99,0xAB,0xEE,0xDC,0xBB,0xBB,0xBB,0xBC,0xBD,0xBD,0xCC,0xCC,0xBB,0xAA, + 0x9A,0x9A,0x99,0x9A,0xAB,0xBB,0xDC,0xDD,0xCD,0xDE,0xEE,0xDD,0xDD,0xDC,0xCC,0xDC, + 0xDD,0xDC,0xBA,0xA9,0xAB,0xBB,0xBC,0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB, + 0xBB,0xBC,0xCC,0xDD,0xDE,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xBD,0xCC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xBB,0xBA,0xBA,0xBB,0xBB,0xDD,0xDC,0xCB,0xBB,0xBD,0xEE,0xEE,0xFE, + 0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xBA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A, + 0x9A,0x99,0xA9,0xAA,0xAB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBC,0xCD,0xEA,0xAB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xCC,0xBA, + 0xA9,0x98,0x8D,0xA8,0xAE,0xEE,0xFE,0xEE,0xED,0xDE,0xED,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDB,0xBA,0xBB,0xBB,0xDC,0xCB,0xBC,0xCD,0xDD,0xED, + 0xDD,0xDD,0xDC,0xCD,0xBD,0xDD,0xDC,0xDD,0xDD,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xBB,0xA9,0x99, + 0x88,0x88,0x99,0x9A,0xBD,0xCD,0xBB,0xBB,0xBB,0xCC,0xDC,0xDB,0xDB,0xDB,0xCB,0xBA, + 0xAA,0x9A,0x9A,0xAA,0xBC,0xDD,0xDD,0xDC,0xDB,0xDD,0xDE,0xED,0xED,0xCC,0xCD,0xDD, + 0xDD,0xCD,0xBA,0x9A,0xAA,0xBB,0xBB,0xDE,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC, + 0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDE,0xDE,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xBC,0xBB, + 0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDB,0xDC,0xCC,0xCC,0xCC,0xCC,0xCC, + 0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xFF,0xEF,0xFE,0xFF,0xFF,0xEF,0xEE,0xFE,0xEE,0xEE, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xBB,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A, + 0x9A,0xAA,0x9A,0xAB,0xBB,0xBB,0xBB,0xCC,0xBC,0xBB,0xBB,0xBC,0xDD,0xD9,0xAA,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB, + 0xAA,0x99,0x89,0xD9,0x8D,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xBB,0xCC,0xDB,0xBB,0xCD,0xDD,0xDE, + 0xDD,0xDD,0xDC,0xDC,0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDB,0xAA,0x99, + 0x99,0x89,0x89,0x99,0xAB,0xDD,0xDD,0xBB,0xBC,0xCC,0xCB,0xDC,0xDD,0xBD,0xCC,0xBB, + 0xBA,0xAA,0xAA,0xBB,0xBC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xEE,0xDD,0xDB,0xDC,0xDC, + 0xDC,0xBB,0xAA,0x99,0xAA,0xBB,0xBB,0xDC,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBB,0xCB,0xDC,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDB,0xDC,0xDC,0xCB,0xDB, + 0xDC,0xCC,0xBB,0xBB,0xBA,0xBB,0xBB,0xCD,0xEE,0xED,0xDB,0xBB,0xBC,0xDE,0xEE,0xEF, + 0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xEE,0xED,0xED,0xCC,0xBA,0xAA,0x9A,0x99,0x99,0x99,0x9A,0xAA,0xAA, + 0xAA,0xAA,0xBB,0xBB,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBD,0xDE,0xAA,0xAB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB, + 0xBA,0xA9,0x98,0xBC,0x8A,0xEE,0xEF,0xEF,0xEE,0xCD,0xDE,0xEE,0xDE,0xEE,0xFE,0xEE, + 0xFE,0xEE,0xED,0xED,0xDD,0xDE,0xDD,0xDB,0xAA,0xAB,0xBC,0xCD,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xBB,0xA9, + 0x98,0x88,0x98,0x99,0xAA,0xCE,0xED,0xDB,0xDB,0xCC,0xCC,0xDC,0xCC,0xDC,0xDD,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xDD,0xCD,0xDD,0xDC,0xDC,0xCC,0xDE,0xED,0xDC,0xCB,0xCC,0xDD, + 0xCC,0xBA,0x99,0x99,0xAB,0xBB,0xBB,0xCD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDE,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xCD,0xBC,0xCC,0xDB,0xCC, + 0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xED,0xBB,0xBD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFE,0xFF,0xFF,0xEF,0xFE,0xFE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBA,0xAA,0x9A,0x99,0x99,0xA9,0xAA,0xAA,0xAB,0xAB, + 0xBA,0xBB,0xBC,0xCD,0xCD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBC,0xCD,0xED,0x9A,0xAB,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC, + 0xBA,0xA9,0x98,0x8D,0xA8,0xCE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0xBB,0xDD,0xDD,0xDE,0xDE,0xED, + 0xDD,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xED,0xED,0xDB,0xAA, + 0x99,0x98,0x98,0x99,0x9A,0xBE,0xED,0xDC,0xCC,0xCB,0xBD,0xCD,0xCD,0xCC,0xDC,0xDD, + 0xCD,0xBD,0xCB,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xBC,0xCD,0xDD,0xCB,0xBD,0xCD, + 0xCC,0xB9,0x99,0x88,0xAD,0xDC,0xCB,0xBD,0xCD,0xDC,0xDC,0xCD,0xDB,0xDC,0xDD,0xDC, + 0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCC,0xCB,0xCB,0xCB,0xBB, + 0xCB,0xBB,0xBB,0xDB,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xBC,0xCC,0xCC,0xCC, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEE,0xED,0xCD,0xDD,0xDD,0xED,0xEE, + 0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xDC, + 0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xBB,0xBB,0xBC,0xDD,0xE9,0xAA,0xAB,0xBD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB, + 0xBB,0xAA,0x99,0x88,0xD9,0x9E,0xEE,0xEF,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xED,0xDD,0xBB,0xAA,0xAB,0xDD,0xEE,0xED,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xDE,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xBA, + 0x99,0x98,0x88,0x89,0x99,0xAB,0xDD,0xDD,0xBC,0xBC,0xDC,0xDB,0xCC,0xCD,0xCD,0xCC, + 0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xCD,0xBB,0xCD,0xED,0xBC,0xDD,0xDD, + 0xCA,0x99,0x98,0x99,0xAC,0xCC,0xBB,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xDD,0xBD,0xCD, + 0xBD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xDB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xCD,0xBD,0xCD,0xCD,0xBD,0xBD,0xDC,0xDC,0xDB,0xBB,0xBC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDE,0xEE,0xFE,0xFE,0xFE,0xED,0xED,0xDE,0xEE,0xEE, + 0xDE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFF,0xFE,0xFF,0xFF,0xEF,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA,0xBA,0xAB,0xBC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xCC,0xDE,0xA9,0x9A,0xBB,0xCD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD, + 0xCB,0xBA,0xA9,0x98,0xAC,0x8A,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xED,0xEE,0xEF,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCB,0xAA,0xAB,0xDD,0xED,0xEE,0xED,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xCB, + 0x99,0x99,0x98,0x98,0x99,0xAA,0xDE,0xDD,0xDB,0xDC,0xCC,0xDC,0xDB,0xDC,0xDC,0xCD, + 0xCD,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xBB,0xBC,0xDB,0xDC,0xDC,0xDB, + 0xA9,0x99,0x88,0x89,0xAB,0xCD,0xDC,0xBC,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xBD, + 0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xCC,0xDC,0xBC,0xBB,0xBB,0xBB,0xCB, + 0xCB,0xBB,0xBC,0xCC,0xCC,0xCB,0xDC,0xDB,0xDC,0xCD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xED,0xED, + 0xED,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBC,0xCB,0xDD,0xDE,0x99,0xAA,0xBB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED, + 0xCC,0xBA,0xA9,0x99,0x8B,0xA8,0xAE,0xEE,0xEF,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEF,0xEE,0xED,0xDD,0xDD,0xDD,0xED,0xDB,0xBA,0xBC,0xDE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xDE,0xDE,0xED,0xDC, + 0xBA,0x99,0x98,0x88,0x99,0x9A,0xAD,0xED,0xDD,0xCC,0xDC,0xCD,0xBD,0xCC,0xBB,0xBB, + 0xCB,0xCB,0xCD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDB,0xCD,0xBC,0xBB,0xBB,0xCC,0xCB,0xB9, + 0x99,0x98,0x98,0x89,0xAB,0xCD,0xCC,0xDB,0xDB,0xDB,0xDB,0xDC,0xDD,0xCD,0xCD,0xDC, + 0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDC,0xDB,0xDB,0xCC,0xDB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCC,0xBD,0xCC,0xCC,0xCC,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xED,0xED, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xFE,0xFF,0xEE,0xEE,0xDE,0xDC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xBC,0xCB,0xCB,0xCD,0xDD,0xEA,0x9A,0xAB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED, + 0xDC,0xBB,0xAA,0x99,0x88,0xD9,0x8D,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xED,0xDB,0xBC,0xDD,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xFE,0xEE,0xFE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xDE,0xED, + 0xBA,0xA9,0x99,0x98,0x88,0x99,0xAA,0xCD,0xDD,0xCD,0xCC,0xDC,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xAB,0xBC,0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xDC,0xCB,0xCB,0xCB,0xCC,0xCA,0x99, + 0x98,0x88,0x88,0x99,0xAB,0xBC,0xDC,0xCB,0xDC,0xDD,0xBD,0xCD,0xDC,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xCC,0xCC,0xCC,0xDC,0xBB,0xBC,0xBC, + 0xBB,0xBB,0xBB,0xBC,0xBB,0xCC,0xCC,0xCB,0xDB,0xDC,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBD,0xDE,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xDE,0xDD,0xEE, + 0xED,0xED,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xED,0xED, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDB,0xDB,0xDB,0xBD,0xCD,0xDE,0xA9,0x9A,0xAB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE, + 0xDD,0xBB,0xBA,0xA9,0x98,0xAC,0x99,0xEE,0xEE,0xFE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xCD,0xDD,0xDE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xDE,0xED,0xDD, + 0xDB,0xAA,0x99,0x89,0x89,0x99,0x9A,0xBC,0xDD,0xDB,0xDC,0xCC,0xCB,0xBB,0xBA,0xBB, + 0xAB,0xBB,0xBC,0xDD,0xCD,0xCD,0xBD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xBA,0xA9,0x99, + 0x89,0x89,0x89,0x9A,0xAB,0xBC,0xCD,0xBD,0xCD,0xCC,0xDB,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDB,0xCC,0xDC,0xCC,0xBB,0xCB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xBC,0xBC,0xBC,0xCC,0xCC,0xDC,0xDC,0xDB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xBC,0xCC,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xFE,0xFE,0xEE,0xED,0xEE,0xED, + 0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xEE,0xEE,0xEE,0xDC,0xBB,0xBB,0xBB,0xBC, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCC,0xCC,0xDC,0xDD,0xEB,0x89,0x9A,0xAB,0xDD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xDD,0xDC,0xBB,0xA9,0x99,0x8B,0xB8,0xAE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xDE,0xED, + 0xDC,0xBA,0x99,0x99,0x88,0x89,0x9A,0xAD,0xDD,0xDD,0xCC,0xDC,0xCB,0xBA,0xBA,0xBA, + 0xBB,0xBB,0xBB,0xCB,0xDC,0xDD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xAA,0x99,0x98, + 0x88,0x88,0x89,0x99,0xAA,0xBB,0xBC,0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xDC,0xDC,0xCD, + 0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCC,0xBC,0xBD,0xDC,0xDC,0xBD,0xCD, + 0xCC,0xBC,0xCC,0xBC,0xBB,0xCB,0xCB,0xBC,0xBC,0xBC,0xCD,0xCB,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xCC,0xCD,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xED,0xED,0xEE, + 0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xDC,0xDB,0xBB,0xBC,0xBD,0xDD, + 0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCD,0xDE,0xD8,0x99,0xAA,0xBB,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xED,0xDC,0xBB,0xAA,0x99,0x88,0xDA,0x8C,0xEE,0xEF,0xEE,0xFE,0xDD,0xEE,0xDE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEF,0xEF,0xEF,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDD,0xBB,0xA9,0x98,0x89,0x89,0x99,0xAB,0xDD,0xDC,0xDB,0xCC,0xBB,0xAB,0xAB,0xAB, + 0xBB,0xBC,0xDB,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDC,0xBB,0xA9,0x98,0x98, + 0x98,0x99,0x99,0x9A,0xAB,0xBC,0xDC,0xDC,0xDB,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xBD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xCC,0xCB,0xCB,0xCB,0xCB,0xCC,0xCC,0xDC,0xDB,0xCB,0xBA,0xBB,0xBB,0xBB, + 0xBC,0xCD,0xDE,0xEE,0xFE,0xEF,0xEF,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xCC,0xDC,0xDD,0xDD,0xED, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xDE,0xEE,0xED,0xEE, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xBC,0xCD,0xCD,0xDE,0xA9,0x99,0xAB,0xBC,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xDD,0xCB,0xBA,0x99,0x98,0x9D,0x99,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xED,0xED,0xEE, + 0xED,0xDB,0xB9,0x99,0x98,0x88,0x99,0x9A,0xDE,0xDD,0xCD,0xCB,0xBA,0xBA,0xBA,0xBB, + 0xBB,0xCD,0xCD,0xDC,0xDB,0xDC,0xDC,0xDB,0xDB,0xDC,0xDD,0xDD,0xA9,0x99,0x89,0x88, + 0x88,0x99,0x9A,0x9A,0xAB,0xCC,0xDC,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xDC,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xDB,0xDD,0xBD,0xCD,0xDC,0xDC,0xDC,0xCC,0xDD,0xDD,0xDC,0xDD,0xDE, + 0xDE,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xCC,0xBC,0xBD,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xFE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xCC,0xCC,0xCD,0xDD,0xDD,0xED,0xED,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED,0xEE,0xED, + 0xEE,0xDD,0xDD,0xDD,0xCD,0xCC,0xBD,0xCD,0xDD,0xEA,0x89,0x9A,0xAB,0xBC,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8B,0xB8,0xAE,0xEE,0xFE,0xEF,0xEE,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xDE,0xDE, + 0xDD,0xDD,0xBA,0xA9,0x98,0x98,0x89,0x9A,0xBD,0xDD,0xCC,0xCB,0xBA,0xAA,0xAB,0xBB, + 0xCC,0xDD,0xDD,0xCD,0xCD,0xBD,0xCD,0xCD,0xDD,0xDD,0xDC,0xCB,0xA9,0x98,0x98,0x98, + 0x99,0x99,0x99,0xAA,0xBD,0xDD,0xDD,0xDD,0xDC,0xCC,0xCC,0xDC,0xDC,0xDD,0xCD,0xCD, + 0xBD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xEE,0xDD,0xDD,0xDB,0xDC,0xBC,0xBB,0xBB,0xCC,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xCB, + 0xCD,0xDE,0xEF,0xEF,0xEE,0xFE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE, + 0xDD,0xDD,0xDC,0xDC,0xDB,0xCB,0xDC,0xDD,0xDE,0xC8,0x99,0x9A,0xBB,0xCD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xED,0xDC,0xCB,0xAA,0x99,0x88,0xCA,0x8D,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xDD,0xDB,0xA9,0x99,0x89,0x88,0x99,0xAB,0xCC,0xDC,0xCB,0xBA,0xAA,0xBA,0xBB, + 0xBD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCD,0xCC,0xDC,0xDC,0xDC,0xA9,0x98,0x98,0x88,0x89, + 0x99,0x99,0xAA,0xBB,0xCD,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xDB,0xDC,0xCB,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEF,0xEF,0xEE,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xCD,0xCC,0xCD,0xCD,0xCB,0xDD,0xDE,0x88,0x99,0xAA,0xBB,0xCD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x8D,0xA9,0xDE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE, + 0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xCD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xDB,0xBA,0x99,0x88,0x89,0x99,0xAB,0xBC,0xCB,0xBB,0xAA,0xAA,0xAB,0xBB, + 0xCD,0xDD,0xDD,0xCC,0xBB,0xBC,0xDC,0xDD,0xCD,0xCB,0xBA,0x99,0x89,0x88,0x99,0x99, + 0x99,0xAA,0xAB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xBC, + 0xCD,0xBC,0xDB,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE, + 0xED,0xDE,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xCB,0xCD,0xBC,0xBB,0xBB,0xBB,0xCC,0xDD, + 0xEE,0xEE,0xFE,0xFE,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDD,0xDD, + 0xDC,0xDC,0xCC,0xCD,0xBC,0xCC,0xCD,0xDE,0xED,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x89,0xD8,0xAE,0xEE,0xEF,0xEF,0xEE,0xDD,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDE,0xEE,0xDE,0xEE,0xDE,0xDE,0xED, + 0xEE,0xDD,0xDD,0xCA,0x99,0x99,0x88,0x89,0xAA,0xBB,0xCB,0xBA,0xBA,0xAA,0xBA,0xBB, + 0xBD,0xDD,0xDC,0xCD,0xCB,0xBB,0xCC,0xDC,0xDC,0xDB,0x99,0x99,0x98,0x88,0x99,0x99, + 0x99,0xAA,0xBB,0xDD,0xDE,0xDD,0xED,0xDD,0xDD,0xDC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDB,0xDC,0xCC,0xCC,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xED,0xDD,0xDC,0xDD,0xCD,0xCB,0xBB,0xBD,0xCC,0xCB,0xBB,0xBB,0xBC,0xBD,0xDE, + 0xEE,0xFE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xDD,0xED,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD, + 0xCD,0xCC,0xDC,0xCB,0xBB,0xBB,0xDD,0xDE,0xEC,0x89,0x9A,0xAB,0xBD,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x98,0xAB,0x8A,0xEE,0xEE,0xEE,0xEE,0xED,0xDE, + 0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDC,0xDC,0xDD,0xDD,0xEE,0xEF,0xEF,0xEF, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDD,0xED,0xDC,0xBB,0xA9,0x88,0x89,0x99,0xAB,0xBB,0xCB,0xBA,0xAA,0xAA,0xAA,0xBB, + 0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xCC,0xDC,0xCB,0xBA,0x99,0x88,0x88,0x99,0x99,0x9A, + 0x9A,0xAB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xCD,0xDC,0xDC,0xDB, + 0xBC,0xCC,0xBC,0xCC,0xDC,0xDD,0xDC,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xEE,0xDD,0xDD,0xDD,0xCD,0xDC,0xCB,0xCC,0xCC,0xCD,0xBB,0xBB,0xBB,0xCD,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDC,0xDC, + 0xCC,0xCB,0xBB,0xBB,0xBB,0xDC,0xDD,0xDD,0xE9,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEF,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8D,0xA8,0xDE,0xEE,0xFE,0xEE,0xEE,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD, + 0xEE,0xED,0xEE,0xED,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED,0xED,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xDD,0xDD,0xDC,0xA9,0x98,0x88,0x9A,0xAB,0xBC,0xBB,0xBA,0xAA,0xAA,0xAA,0xBB, + 0xBD,0xED,0xCB,0xBB,0xBA,0xBB,0xBD,0xCC,0xBB,0xA9,0x98,0x98,0x98,0x89,0x99,0x99, + 0xAA,0xBC,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDB,0xDC,0xDB,0xDB,0xDB,0xDC,0xDD,0xCD, + 0xDC,0xCC,0xCB,0xCC,0xBD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xBC,0xCC,0xCC,0xCB,0xBB,0xBB,0xCD,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xCD,0xDD,0xCC,0xBB, + 0xBC,0xBB,0xBB,0xBB,0xDC,0xDD,0xDD,0xDD,0xC8,0x99,0xAB,0xBB,0xDD,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8A,0xD9,0x9E,0xEE,0xEE,0xEF,0xEE,0xDD, + 0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xEE,0xEE,0xDE,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xED,0xED,0xEE,0xDE, + 0xED,0xDD,0xDC,0xCB,0xA9,0x98,0x99,0x9A,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xBC,0xBB,0xBB,0xAB,0xBB,0xBC,0xDB,0xBA,0x99,0x98,0x88,0x89,0x99,0x99,0xAA, + 0xAB,0xDD,0xDE,0xDD,0xDE,0xDD,0xDD,0xDC,0xDD,0xDC,0xCC,0xCD,0xCD,0xCD,0xCD,0xDC, + 0xDC,0xCB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xDD,0xCD,0xCC,0xCD,0xCC,0xDB,0xDB,0xCC,0xBB,0xBB,0xBD,0xDE,0xEE,0xEF, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDE,0xEE,0xEE,0xDD, + 0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCD,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xDD,0xCD,0xDD,0xCC,0xBE,0xA9,0x9A,0xAB,0xBD,0xDD,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0x99,0x98,0xBB,0x8A,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDD,0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xED,0xDD,0xED,0xDC,0xDD, + 0xDD,0xDE,0xDE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xCD,0xCB,0xA9,0x88,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBD,0xCB,0xBA,0x99,0x88,0x89,0x89,0x99,0x9A,0xAA, + 0xBD,0xDE,0xDD,0xDE,0xDE,0xDD,0xDC,0xDD,0xDD,0xCD,0xCD,0xCC,0xBD,0xCC,0xDC,0xDD, + 0xCD,0xCC,0xBC,0xBC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xCC,0xBC,0xBD,0xCD,0xCC,0xCB,0xBB,0xBB,0xDD,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFF,0xFE,0xFE,0xFE,0xEE,0xDE,0xDE,0xDE,0xDE,0xED, + 0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBD,0xCD,0xCD,0xDD,0xCB,0xBB,0xDB,0x89,0xAA,0xBB,0xBD,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xEF,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8D,0xA8,0xCE,0xEE,0xEF,0xEE,0xEE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDE,0xDE,0xED,0xDD,0xBD, + 0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xED,0xDE,0xDD,0xDD,0xDD,0xED,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDD,0xCC,0xCB,0xA9,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBA,0xBA,0xBB,0xBC,0xCB,0xAA,0x99,0x89,0x88,0x99,0x99,0xAA,0xBD, + 0xDD,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDB,0xCC,0xDC,0xDD,0xCD,0xDC, + 0xDB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xBD,0xCD,0xCD,0xBC,0xDC,0xDB,0xDB,0xCC,0xCC,0xDD,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xED,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xCD,0xCB,0xCB,0xCB,0xCB,0xBC,0xCC, + 0xDC,0xDC,0xDD,0xDD,0xDB,0xBB,0xBD,0xD8,0x99,0xAA,0xBC,0xDD,0xEE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xDA,0x8D,0xEE,0xEE,0xEF,0xEE, + 0xED,0xDE,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDC, + 0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDC,0xCC,0xBB,0xA9,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0x9A, + 0xAA,0xAA,0xBA,0xAA,0xAB,0xBB,0xDB,0xCB,0xAA,0x99,0x88,0x89,0x99,0x9A,0xBB,0xDD, + 0xDD,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xBD,0xBD,0xBD,0xCC,0xDD,0xCD, + 0xDC,0xDC,0xCB,0xCB,0xCB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCC,0xCC,0xCB,0xDC,0xDC,0xBD,0xCD,0xCC,0xBB,0xCD,0xDE,0xEE,0xFE,0xFE,0xEE, + 0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xED,0xEE,0xDE,0xDE,0xDD,0xED,0xDD,0xED,0xDE,0xDD,0xED,0xED,0xEE, + 0xEE,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xCC,0xCC,0xCD,0xDC,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xCB,0xBB,0xDD,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xFE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0xAD,0x99,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDD,0xCC, + 0xBC,0xCD,0xCD,0xDD,0xDD,0xED,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xDD,0xDD,0xED,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDC,0xCC,0xBB,0xAA,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xAB,0xBC,0xCD,0xBB,0xBA,0x99,0x98,0x98,0x99,0xAB,0xCD,0xDD, + 0xED,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD, + 0xCD,0xBB,0xCB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDB,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDE,0xDD,0xCD,0xDD,0xDE,0xDD,0xED,0xEE,0xDE, + 0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED, + 0xED,0xED,0xDD,0xDD,0xDC,0xDC,0xCC,0xCB,0xCC,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xDC,0xDD,0xDD,0xDC,0xBB,0xBD,0xE8,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xDB,0xBA,0xA9,0x98,0x8B,0xC8,0xBE,0xEE,0xEF,0xEF, + 0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xDE,0xDD,0xDC, + 0xCB,0xBD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xEE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xED,0xDD,0xDE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDB,0xBB,0xBB,0xA9,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBB,0xCC,0xCC,0xCB,0xBA,0xA9,0x99,0x99,0x99,0xBB,0xDD,0xDE, + 0xDD,0xED,0xEE,0xDE,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD, + 0xCD,0xDD,0xBD,0xCC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCC,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE, + 0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD,0xCB,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xEE, + 0xDE,0xDE,0xED,0xEE,0xED,0xEE,0xDE,0xDE,0xDD,0xED,0xDD,0xED,0xEE,0xDE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBC,0xBD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDC,0xCB,0xCD,0x99,0x99,0xAA,0xBB,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xDA,0x9D,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xDD, + 0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEC, + 0xBB,0xBB,0xA9,0x99,0x9A,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCC,0xBC,0xBB,0xA9,0x99,0x99,0x9A,0xBD,0xDE,0xEE, + 0xDE,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDB,0xCC,0xCD,0xDD,0xDE,0xDE,0xDE,0xDE,0xED,0xED, + 0xEE,0xDE,0xDE,0xED,0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xDD, + 0xDD,0xDD,0xDB,0xCC,0xBC,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xCD,0xDD, + 0xCD,0xDD,0xDD,0xDC,0xBC,0xD8,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x9D,0x9A,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD, + 0xDC,0xBC,0xBD,0xDD,0xED,0xED,0xDE,0xDE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xEE,0xFE, + 0xEE,0xED,0xED,0xED,0xDE,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xCB, + 0xBA,0xA9,0x99,0x99,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xBC,0xCB,0xDB,0xDC,0xBB,0xAA,0x99,0x99,0x9B,0xBC,0xDD,0xED, + 0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDB,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xEE,0xED,0xED,0xDC,0xCC,0xCD,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xDE,0xEE, + 0xED,0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0x98,0x99,0xAA,0xBB,0xBD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xDD,0xDB,0xBA,0xAA,0x99,0x8A,0xC8,0xBE,0xEE,0xEE, + 0xEF,0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD, + 0xDC,0xCB,0xDD,0xDE,0xEE,0xDD,0xDD,0xEE,0xEE,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xDC,0xBB, + 0xAA,0x99,0x99,0x9A,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBC,0xCB,0xCC,0xCC,0xCC,0xCB,0xBA,0x99,0x99,0xAA,0xCC,0xDD,0xDE, + 0xED,0xED,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEE,0xED,0xDD,0xDB,0xCC,0xCD,0xDD,0xDD,0xED,0xDD,0xED,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xDE,0xED,0xED,0xDD,0xDD,0xDD,0xCD, + 0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xD8,0x89,0x99,0xAA,0xBC,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDD,0xCB,0xAA,0x99,0x88,0xBA,0x8D,0xEE,0xEF, + 0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE, + 0xDD,0xCD,0xCD,0xDD,0xDE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xCB,0xBB, + 0xA9,0x99,0x9A,0xAA,0xAA,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xCB,0xBC,0xBC,0xCC,0xCC,0xBA,0xA9,0x99,0xAB,0xBD,0xCD,0xDD, + 0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xDD,0xCD,0xDC,0xDC,0xDB,0xDC,0xCD,0xCD,0xDD, + 0xED,0xDD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xEE,0xDD,0xDC,0xCB,0xBD,0xDD,0xDD,0xED,0xDE,0xDE,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xED,0xEE,0xDE,0xDE,0xEE,0xDE,0xED,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD, + 0xDD,0xDE,0xEE,0xED,0x88,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x8D,0xA9,0xDE,0xEE, + 0xEF,0xEE,0xEE,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xCB,0xBA,0xAA, + 0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xBC,0xDB,0xCB,0xBC,0xBC,0xCB,0xCC,0xCB,0xCB,0xBB,0xAA,0x99,0xAA,0xCC,0xCD,0xDE, + 0xEE,0xDD,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xBD,0xCD,0xBD,0xBD,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xDD,0xCD,0xBC,0xCD,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD, + 0xDE,0xDE,0xDE,0xB8,0x88,0x99,0xAA,0xBB,0xBD,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x99,0xD9,0x9E,0xEE, + 0xEE,0xEF,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xED,0xDD,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xED,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xDC,0xBB,0xAA,0x99, + 0x99,0xAA,0xAB,0xAA,0xAB,0xAB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xBC,0xBB,0xCB,0xCC,0xCC,0xBC,0xBB,0xBB,0xAA,0xA9,0x9A,0xCC,0xCC,0xBD, + 0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xCC,0xBD,0xDD,0xDD,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xED,0xEE,0xE9,0x88,0x89,0x9A,0xAB,0xBB,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDC,0xCB,0xAA,0x99,0x88,0xAC,0x9B,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED, + 0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xCB,0xBA,0xA9,0x9A, + 0xAA,0xAB,0xAB,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBC,0xBB,0xBB,0xCC,0xCB, + 0xCC,0xCB,0xCB,0xCB,0xBB,0xCB,0xBB,0xCB,0xBB,0xBA,0xBA,0xAA,0x99,0xAC,0xBB,0xCC, + 0xDE,0xEE,0xDE,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDC,0xCC,0xCD,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDB,0xCC,0xCD,0xDD,0xDD,0xED,0xED,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xEE,0xEB,0x88,0x88,0x99,0xAA,0xBB,0xCD,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8C,0xA9,0xCE, + 0xEE,0xEF,0xEF,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE, + 0xDE,0xDD,0xDC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xFE,0xEE,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEC,0xBA,0xAA,0xA9,0x9A, + 0xAB,0xBB,0xBB,0xAA,0xAA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xCC, + 0xCC,0xBD,0xBC,0xCC,0xCB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xAA,0xA9,0xAB,0xBB,0xBB, + 0xCD,0xDE,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDC,0xDB,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDD,0xCD, + 0xCB,0xBB,0xDD,0xED,0xDE,0xDD,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDE,0xDD,0xDE,0xDD,0xDD, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xED,0x98,0x88,0x89,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88,0xDA,0x9D, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xED,0xED,0xDD,0xCD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xDD,0xCB,0xAA,0xA9,0x99,0xAA, + 0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD, + 0xCD,0xCC,0xDB,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0x99,0xAB,0xBB, + 0xBC,0xDE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD,0xBC,0xCD,0xBD,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xDE, + 0xDD,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xDD,0xDB,0xCC, + 0xBD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xB8,0x88,0x89,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD,0xCB,0xAA,0xA9,0x89,0x9D,0x9A, + 0xEE,0xEE,0xFE,0xFE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xEE,0xDD,0xDC,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDC,0xBB,0xAA,0x99,0xAA,0xBB, + 0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDC, + 0xCD,0xDD,0xCD,0xCC,0xCC,0xCB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBA,0xAA,0x9A,0x9A,0xBB, + 0xBB,0xDE,0xEE,0xED,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCB,0xDC,0xDC,0xDC,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xDD,0xDD,0xCB,0xBB, + 0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xED,0xED,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xA8, + 0x88,0x88,0x89,0x9A,0xAA,0xBB,0xCD,0xDE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCC,0xBA,0xA9,0x98,0x8B,0xC9, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xDE,0xDD,0xCD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xCB,0xBA,0xA9,0x9A,0xAB,0xBC, + 0xBC,0xCB,0xBB,0xBA,0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBA,0xAA,0xBB, + 0xCC,0xDD,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xA9,0x99,0xAB, + 0xBB,0xCD,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xCD,0xCD,0xBD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xEE,0xDE,0xDD,0xDC,0xCC,0xCC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB,0xCB,0x98,0x78, + 0x88,0x89,0x99,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xCA, + 0x9E,0xEE,0xEF,0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xED, + 0xEE,0xDE,0xDE,0xDD,0xDC,0xDD,0xEE,0xEF,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEF,0xEE,0xDD,0xDB,0xBA,0xA9,0x9A,0xAB,0xBC, + 0xCC,0xCB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBA,0xBB,0xBB,0xBA,0xBA,0xA9,0x99, + 0xAA,0xCE,0xDD,0xCC,0xCC,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xAB,0xAA,0xA9,0x9A, + 0xBB,0xCC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC,0xDB,0xDC,0xDC,0xDB,0xDD, + 0xCD,0xCD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDC,0xCB,0xBC,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xED,0xDE,0xDE,0xDD,0xDE,0xDD, + 0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB,0xCC,0xB9,0x88,0x78,0x88, + 0x88,0x99,0x9A,0xAA,0xBB,0xBD,0xDE,0xEE,0xFE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x8C, + 0xA9,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xED,0xED,0xED,0xED,0xDD,0xCD,0xDE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEC,0xCB,0xBA,0x99,0x9A,0xAB,0xBC, + 0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBA,0xAA,0x99,0x99,0x99, + 0x99,0xAA,0xDC,0xDB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0x9A, + 0xAB,0xBB,0xCE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xBD,0xCD,0xCD,0xDD,0xDC, + 0xDD,0xDD,0xCD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xBC,0xBC,0xCD,0xDD,0xDD, + 0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xDE,0xDD,0xED,0xED,0xDD,0xDE,0xDD,0xDE, + 0xDD,0xDE,0xDE,0xDD,0xDD,0xDC,0xCC,0xBB,0xCC,0xBA,0x98,0x78,0x78,0x78,0x88,0x88, + 0x99,0x99,0xAA,0xBB,0xBD,0xDD,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB,0xA9,0x99,0x89, + 0xD9,0xBE,0xEE,0xEF,0xEE,0xFE,0xED,0xDE,0xEE,0xED,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xED,0xED,0xDD,0xDE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xDD,0xDC,0xBB,0x99,0x99,0xAB,0xCC, + 0xCC,0xBC,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xAA,0xBA,0xBB,0xAA,0xA9,0x99,0x89,0x89, + 0x99,0x9A,0xAD,0xCD,0xCB,0xBB,0xBA,0xBB,0xAB,0xBA,0xBB,0xBB,0xAB,0xAB,0xAA,0xA9, + 0xAA,0xBB,0xCC,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC, + 0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC, + 0xDC,0xDD,0xDD,0xED,0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xDE,0xDD,0xED,0xED,0xDE,0xDE, + 0xDE,0xDD,0xDE,0xDD,0xCB,0xBC,0xDC,0xA9,0x87,0x87,0x87,0x87,0x88,0x88,0x88,0x99, + 0x99,0xAA,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88, + 0xBC,0x9C,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xEE,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xCB,0xBA,0x89,0x99,0xAA,0xBC, + 0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xBB,0xAA,0xA9,0x99,0x98,0x89,0x89, + 0x89,0x99,0x9B,0xDC,0xCB,0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xBA,0xBA,0xBB,0xAA,0xA9, + 0xAA,0xAB,0xBC,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD, + 0xDC,0xDD,0xCD,0xDC,0xDC,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD, + 0xDE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDB,0xCB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCD, + 0xDD,0xDD,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xDE,0xDD,0xED,0xDD, + 0xDE,0xDD,0xCB,0xCD,0xCB,0xA8,0x78,0x78,0x78,0x78,0x78,0x88,0x88,0x88,0x99,0x99, + 0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98, + 0x8C,0xA9,0xDE,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xA9,0x98,0x99,0x9A,0xBD, + 0xDC,0xCB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0x99,0x98,0x98,0x98,0x88, + 0x89,0x89,0x9A,0xAC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xAA, + 0x99,0xAB,0xBB,0xCD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC, + 0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xDC,0xDB,0xDC,0xCD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xCB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDE,0xDD, + 0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC, + 0xDE,0xDE,0xDE,0xEE,0xDE,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xDE,0xDD, + 0xCC,0xCD,0xCB,0x98,0x87,0x78,0x78,0x77,0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x9A, + 0xAA,0xBB,0xCB,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99, + 0x88,0xD9,0xAE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xCB,0xA9,0x98,0x99,0x9A,0xAC, + 0xCD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xA9,0x99,0x89,0x89,0x89,0x89, + 0x88,0x89,0x99,0xAA,0xBC,0xCB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xAA, + 0xA9,0xAA,0xBB,0xCC,0xDE,0xEE,0xEE,0xEE,0xDE,0xDC,0xDB,0xDC,0xDD,0xCD,0xDC,0xDD, + 0xCD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xCD,0xCD,0xDD,0xEE, + 0xEF,0xEE,0xEE,0xED,0xDD,0xCD,0xCB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDE,0xDD,0xDD,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xEE,0xDD,0xDD,0xDC,0xDD, + 0xDB,0x98,0x77,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA, + 0xBB,0xBB,0xCD,0xDD,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0x99, + 0x89,0x9D,0x9B,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDC,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xA9,0x98,0x88,0x99,0xAA, + 0xDD,0xDB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xA9,0x98,0x98,0x98,0x88,0x89,0x99, + 0x89,0x89,0x99,0x9A,0xBC,0xCB,0xBB,0xBB,0xCC,0xCB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB, + 0xAA,0xAA,0xBB,0xCB,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD, + 0xDD,0xCD,0xCD,0xDC,0xDC,0xDB,0xDC,0xDC,0xDC,0xDB,0xDB,0xDB,0xDC,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBC,0xDD,0xED,0xDD,0xDE,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xEE,0xEE,0xDD,0xDD,0xDD,0xDC,0xA8, + 0x78,0x78,0x78,0x78,0x78,0x88,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA,0xAA,0xBB, + 0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9, + 0x98,0x8B,0xB9,0xCE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xDD,0xDC,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDB,0xAA,0x99,0x89,0x99,0x9A, + 0xBD,0xCD,0xBC,0xCB,0xBB,0xBB,0xBB,0xBA,0xAA,0x99,0x99,0x89,0x89,0x99,0x99,0x89, + 0x88,0x88,0x99,0x99,0xAB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xAA,0xBB,0xBB,0xBB, + 0xAA,0x9A,0xAB,0xCC,0xCD,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDC, + 0xDC,0xDD,0xDC,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD,0xBD,0xDC,0xDC,0xDC,0xDD,0xEE,0xEF, + 0xEE,0xEE,0xED,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xED,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xB9,0x87,0x87, + 0x87,0x87,0x88,0x88,0x88,0x88,0x88,0x89,0x89,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xBC, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBB,0xAA, + 0x99,0x88,0xBA,0x9D,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xFE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDC,0xBA,0x99,0x88,0x89,0x99, + 0xAB,0xBC,0xDC,0xCC,0xCC,0xBB,0xBB,0xAA,0xA9,0x99,0x98,0x98,0x99,0x99,0x99,0x99, + 0x99,0x89,0x88,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xA9,0xBC,0xCC,0xBD,0xDE,0xEE,0xEE,0xED,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDB,0xDC,0xCD,0xCC,0xCB,0xDC,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xCD,0xCB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xED,0xDD,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDE, + 0xED,0xED,0xED,0xEE,0xDE,0xED,0xEE,0xEE,0xDD,0xDD,0xDC,0xA9,0x87,0x87,0x87,0x78, + 0x78,0x88,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE,0xDD,0xBB,0xBA, + 0xA9,0x98,0x8D,0xAA,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xED,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xBB,0xA9,0x98,0x89,0x99, + 0xAA,0xBD,0xDD,0xCD,0xCC,0xBB,0xBA,0xA9,0x99,0x89,0x88,0x99,0x99,0x99,0x9A,0xAA, + 0x99,0x98,0x89,0x89,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB, + 0xBA,0xAA,0xAC,0xCD,0xCC,0xDE,0xEE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDC, + 0xDD,0xDD,0xDC,0xDD,0xCD,0xBD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xED,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xDD,0xDD,0xDB,0x87,0x87,0x87,0x87,0x88,0x88, + 0x88,0x88,0x88,0x89,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xAB,0xBB,0xBB,0xCB,0xCD,0xDD, + 0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xDB,0xBB, + 0xA9,0x99,0x89,0xD9,0xBE,0xEE,0xEF,0xEE,0xFE,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xFE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDB,0xA9,0x98,0x98,0x89, + 0x9A,0xBB,0xCD,0xDD,0xCB,0xBB,0xAA,0x99,0x99,0x89,0x89,0x99,0x99,0x99,0xAA,0xBA, + 0xA9,0x99,0x98,0x98,0x99,0x9A,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB, + 0xAA,0xA9,0x9B,0xDC,0xDC,0xDD,0xDE,0xEE,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xDD,0xEE,0xEE,0xFE,0xEE, + 0xED,0xDD,0xDD,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xEE,0xDE,0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xA8,0x87,0x87,0x87,0x87,0x88,0x88,0x88, + 0x88,0x89,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB, + 0xAA,0x99,0x89,0x9C,0x9D,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xDE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDC,0xBA,0x99,0x88,0x99, + 0x99,0xAA,0xCD,0xDD,0xDB,0xBA,0xA9,0x99,0x89,0x98,0x99,0x99,0xA9,0x99,0xAD,0xDD, + 0xBA,0x99,0x98,0x89,0x99,0x9A,0xAB,0xBC,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xCB,0xBA, + 0xAA,0x99,0xAA,0xCD,0xCD,0xDD,0xEE,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xDC,0xDB,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDC,0xCB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDB,0x88,0x78,0x78,0x78,0x88,0x88,0x88,0x88,0x89, + 0x99,0x99,0x99,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCB, + 0xBA,0xA9,0x98,0x8C,0xA9,0xDE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xDD,0xBA,0xA9,0x89,0x88, + 0x99,0x9A,0xAD,0xED,0xCB,0xAA,0x99,0x99,0x88,0x89,0x99,0x99,0x9A,0xAA,0xDD,0xEE, + 0xDA,0x9A,0x99,0x98,0x99,0x99,0xAB,0xBB,0xCB,0xBB,0xCB,0xBB,0xBC,0xCC,0xCB,0xBA, + 0xA9,0x99,0x9A,0xBB,0xDC,0xDD,0xED,0xED,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDC,0xBB,0xBB,0xBB,0xCD,0xDD,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xDE,0xED,0xB8,0x87,0x87,0x78,0x78,0x88,0x88,0x88,0x88,0x99,0x99, + 0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB, + 0xBB,0xAA,0x99,0x88,0xDA,0xAE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xEE,0xED,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xCB,0xA9,0x99,0x89, + 0x89,0x99,0xAA,0xED,0xBA,0xA9,0x99,0x89,0x89,0x99,0x99,0xAA,0xAA,0xBD,0xEE,0xEE, + 0xED,0xAA,0x99,0x99,0x89,0x89,0x9A,0xBB,0xCC,0xBC,0xBB,0xBB,0xCC,0xCC,0xBB,0xAA, + 0x99,0x99,0x9A,0xBB,0xCD,0xDD,0xDE,0xDD,0xDC,0xDB,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDB,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xCC,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDC,0x98,0x78,0x78,0x78,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC, + 0xCB,0xAA,0x99,0x89,0x9D,0x9B,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDC,0xBA,0x99,0x98, + 0x89,0x99,0x9A,0xAB,0xBA,0x99,0x98,0x98,0x89,0x99,0x9A,0xAA,0xBB,0xDD,0xEE,0xEE, + 0xED,0xCA,0xA9,0x98,0x98,0x98,0x9A,0xAB,0xCC,0xCB,0xBC,0xBC,0xBC,0xBB,0xBB,0xA9, + 0x99,0x89,0xAA,0xBB,0xCC,0xDD,0xDE,0xDD,0xDD,0xCD,0xCC,0xDD,0xCD,0xDD,0xCD,0xCD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDA,0x88,0x78,0x78,0x78,0x88,0x88,0x88,0x89,0x99,0x99,0x9A,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD, + 0xBB,0xBA,0xA9,0x98,0x8A,0xC9,0xCE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDE,0xED,0xEE,0xDE, + 0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xBB,0xA9,0x99, + 0x99,0x89,0x99,0xA9,0xA9,0x99,0x99,0x89,0x99,0x9A,0x9A,0xAB,0xCD,0xDE,0xEE,0xED, + 0xED,0xDB,0xB9,0x99,0x89,0x89,0x99,0xAB,0xCD,0xCC,0xBB,0xCC,0xCB,0xBA,0xAA,0x99, + 0x88,0x99,0xAA,0xBB,0xBC,0xDD,0xED,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xB9,0x87,0x87,0x87,0x88,0x88,0x88,0x89,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBB, + 0xBB,0xCB,0xCC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED, + 0xDC,0xBB,0xAA,0x99,0x88,0xBC,0x9D,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xED, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xED,0xDB,0xAA,0x99, + 0x98,0x99,0x99,0x99,0x99,0x99,0x88,0x89,0x99,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE, + 0xED,0xDD,0xBA,0xA9,0x98,0x88,0x99,0x9A,0xBD,0xDC,0xDC,0xDC,0xCB,0xBA,0x99,0x99, + 0x89,0x89,0xAA,0xBB,0xCC,0xDD,0xEE,0xDD,0xDB,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD, + 0xDC,0xDD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBB, + 0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB, + 0x88,0x78,0x78,0x78,0x88,0x88,0x89,0x89,0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xCC,0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xEE, + 0xDD,0xBB,0xBA,0xA9,0x98,0x8C,0xA9,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xDE,0xEE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xDE,0xDD,0xDD,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xBB,0xA9, + 0x99,0x98,0x99,0x99,0x99,0x98,0x99,0x99,0x9A,0xAA,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE, + 0xED,0xED,0xCB,0xA9,0x99,0x88,0x89,0x99,0xAD,0xDD,0xCC,0xCB,0xBB,0xA9,0x99,0x89, + 0x88,0x99,0xAA,0xBB,0xBD,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDC, + 0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCD,0xBB,0xBB, + 0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xCA,0x87, + 0x87,0x87,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC,0xDC, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xDD,0xDC,0xBA,0xAA,0x99,0x88,0xDA,0xAE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xED,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDE,0xEF,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xEE,0xEE,0xED,0xDB,0xAA, + 0xA9,0x99,0x89,0x99,0x99,0x89,0x99,0x99,0xAA,0xAB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDB,0xBA,0x99,0x89,0x88,0x99,0xAA,0xCC,0xDD,0xCB,0xAA,0x99,0x99,0x98, + 0x89,0x9A,0xAB,0xBB,0xDD,0xDE,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD, + 0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xDB,0xBB,0xBB, + 0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xB8,0x78,0x78, + 0x78,0x88,0x88,0x89,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xCB,0xDC,0xDD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE, + 0xED,0xDC,0xBB,0xAA,0x99,0x88,0x9D,0xAD,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xEE,0xEE, + 0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xED,0xED,0xED,0xDD,0xCD,0xDD,0xFF,0xEF, + 0xEE,0xFE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xBA, + 0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xBA,0xA9,0x98,0x89,0x89,0x99,0xAC,0xED,0xBA,0xA9,0x98,0x98,0x88, + 0x99,0x9A,0xBB,0xBD,0xDD,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xED,0xCC,0xBB,0xBB,0xBB, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xB8,0x78,0x78,0x78, + 0x88,0x88,0x89,0x89,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xCB,0xCD,0xCD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8A,0xC9,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xDE,0xDE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xED,0xED,0xDD,0xDD,0xEE,0xFE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDB, + 0xAA,0xA9,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDB,0xA9,0x99,0x98,0x89,0x99,0x9A,0xCB,0xAA,0x99,0x99,0x88,0x89, + 0x99,0xAB,0xBB,0xDD,0xDD,0xED,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xEE,0xFE,0xFE,0xFE,0xED,0xDB,0xBB,0xBB,0xBC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xA8,0x87,0x87,0x88,0x88, + 0x88,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88,0xCA,0xAE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xDD,0xDC,0xDC,0xDE,0xEE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEC, + 0xBA,0xAA,0x9A,0x99,0x9A,0x99,0xAA,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDC,0xBA,0x99,0x88,0x98,0x99,0x99,0xA9,0x99,0x99,0x89,0x89,0x99, + 0x9A,0xAB,0xBD,0xDD,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEF,0xEF,0xEE,0xEC,0xBB,0xBB,0xBD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xEE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEC,0x98,0x78,0x78,0x88,0x88,0x88, + 0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xED,0xDD,0xCB,0xAA,0xA9,0x98,0x8D,0x9B,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xDE, + 0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xDD,0xCD,0xDE,0xEF, + 0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEE,0xFE,0xEE,0xEE, + 0xDB,0xBA,0xAA,0xAA,0xA9,0xAA,0xAB,0xBC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xED,0xDD,0xCB,0xA9,0x99,0x89,0x89,0x99,0x99,0x99,0x89,0x88,0x99,0x99, + 0xAA,0xBB,0xDD,0xDD,0xEE,0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xCD,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xED,0xDB,0xBC,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEB,0x98,0x78,0x78,0x88,0x88,0x88,0x99, + 0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x89,0xDA,0xCE,0xEE,0xFE,0xEE,0xEF,0xEE,0xED, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDD,0xDC,0xDD,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEE,0xFE,0xEE, + 0xED,0xBB,0xBA,0xAA,0xAA,0xAA,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xDD,0xDC,0xBA,0x99,0x88,0x99,0x99,0x99,0x98,0x98,0x99,0x99,0xAA, + 0xBB,0xCD,0xDD,0xEE,0xDE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xCC,0xCD,0xDD,0xDD, + 0xDD,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEA,0x87,0x87,0x88,0x88,0x88,0x89,0x99,0x99, + 0xAA,0xAA,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0x9D,0x9D,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xED,0xED,0xED,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xDD,0xDD,0xEE, + 0xEF,0xFE,0xFE,0xEF,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xED,0xBB,0xBB,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xFE,0xEE,0xEE,0xDD,0xBA,0xA9,0x99,0x88,0x89,0x89,0x89,0x89,0x99,0xAA,0xAB, + 0xBC,0xDD,0xDE,0xDE,0xED,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xDA,0x88,0x78,0x78,0x88,0x88,0x89,0x99,0x99,0xAA, + 0xAA,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xFE,0xEE,0xDD,0xBB,0xBA,0x99,0x98,0x8B,0xB9,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE, + 0xED,0xEE,0xDE,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xEE, + 0xEF,0xEF,0xEF,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xDC,0xCB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDB,0xA9,0x99,0x99,0x98,0x99,0x99,0x99,0x9A,0xAB,0xBB, + 0xDD,0xDE,0xDE,0xED,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEA,0x87,0x87,0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xAB, + 0xBB,0xBB,0xCC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x88,0xDB,0xAE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDE, + 0xEE,0xFE,0xFF,0xEF,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF, + 0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF, + 0xEF,0xEE,0xEE,0xED,0xED,0xDB,0xBA,0xA9,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBD, + 0xDD,0xDE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFE,0xEE,0xED,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD, + 0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEA,0x88,0x87,0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xAB,0xBB, + 0xBB,0xBD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0x8D,0xAC,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xDD,0xED,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xDE, + 0xEE,0xFF,0xFE,0xFE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE, + 0xEE,0xFE,0xFE,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE, + 0xFE,0xFE,0xEE,0xEE,0xED,0xDD,0xBB,0xA9,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBD,0xDD, + 0xDE,0xEE,0xDE,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xEE,0xEE,0xFE,0xFF,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEA,0x87,0x87,0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x89,0xD9,0xDE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD, + 0xEE,0xFE,0xFF,0xEF,0xFE,0xFE,0xEF,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xEE,0xEF,0xFF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xDB,0xAA,0xAA,0x9A,0x99,0xAA,0xAB,0xBB,0xDD,0xDE, + 0xDE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xEE,0xEF,0xEF,0xFE,0xFE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEB,0x87,0x87,0x88,0x88,0x88,0x99,0x9A,0x9A,0xAA,0xBB,0xBB,0xCB,0xDD, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88,0xAC,0xAE,0xEE,0xEF,0xEE,0xFE, + 0xEE,0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xDD, + 0xDE,0xEF,0xFF,0xFF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFF,0xFE,0xFF, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xBB,0xAA,0xAA,0xAA,0xAA,0xBB,0xDD,0xDE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDE,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xEA,0x88,0x78,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xAA,0xA9,0x98,0x8B,0xAA,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xDD,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD, + 0xDD,0xEE,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xEE,0xFE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xBC,0xAA,0xAA,0xBB,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDC,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEB,0x87,0x87,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99,0x88,0xDA,0xBE,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED, + 0xDD,0xDE,0xEF,0xFF,0xFF,0xFE,0xFE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xCC,0xCC,0xDD,0xDE,0xDE,0xEE,0xEE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xDD,0xBC,0xBC,0xDD,0xDE,0xDE,0xDE,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xEB, + 0x88,0x78,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x98,0x8D,0xAC,0xEE,0xFE,0xEE, + 0xEE,0xFE,0xEE,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDD,0xDE,0xEE,0xEF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE, + 0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xDD,0xDC,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE,0xDE,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEF,0xEE,0xEE,0xEC,0x88, + 0x77,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBC,0xBA,0xA9,0x98,0x89,0xDA,0xDE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xEE, + 0xDD,0xDD,0xDE,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xEE,0xFE,0xEF,0xEE,0xFF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xED,0xED,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xED,0xDC,0xBB,0xBB,0xCD,0xDE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEB,0x88,0x78, + 0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xED,0xDC,0xBA,0xAA,0x99,0x88,0xBC,0xAE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED, + 0xEE,0xDD,0xDE,0xEE,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xFF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEE, + 0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDE,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF, + 0xEE,0xED,0xDD,0xCB,0xBB,0xBD,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xA7,0x78,0x88, + 0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x8C,0xBA,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xED,0xEE,0xED,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED, + 0xED,0xDD,0xDD,0xEE,0xFE,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFE,0xFF, + 0xEF,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xFE,0xEE, + 0xED,0xDC,0xCB,0xBB,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE,0xEE,0xB8,0x78,0x78,0x88, + 0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBA,0xA9,0x99,0x88,0xDA,0xCE,0xEF, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xED,0xED,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xEF,0xEF, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xED,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xCB,0xBB,0xBC,0xDD,0xED,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xC8,0x87,0x88,0x88,0x88, + 0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88,0x9D,0xAC,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xDE,0xDD,0xDD,0xEE,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xFE,0xFF, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xED, + 0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xDD, + 0xDB,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF,0xEE,0xFE,0xEE,0xE8,0x87,0x88,0x88,0x89,0x99, + 0x9A,0xAA,0xAB,0xBB,0xBC,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x89,0xDA,0xDE, + 0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xED,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFF,0xFE,0xFF,0xEF, + 0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xED, + 0xED,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDC, + 0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xE9,0x88,0x78,0x88,0x88,0x99,0x99, + 0xAA,0xAB,0xBB,0xBB,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88,0x9C,0xAE, + 0xEE,0xFE,0xEE,0xEE,0xFE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED, + 0xED,0xED,0xED,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xFE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xEE,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xDD,0xDB,0xBB, + 0xCB,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEB,0x88,0x78,0x88,0x88,0x99,0x99,0xAA, + 0xAB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xAA,0xA9,0x98,0x8B,0xBB, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFE,0xFF, + 0xEF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEF,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xED, + 0xEE,0xED,0xEE,0xDD,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDC,0xBB,0xBB, + 0xBD,0xDD,0xDD,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0x97,0x78,0x88,0x88,0x99,0x99,0xAA,0xAB, + 0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xDB, + 0xCE,0xEE,0xEE,0xFE,0xFE,0xEF,0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xED,0xED,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFF,0xFE, + 0xFF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xDE,0xDD,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBD, + 0xDD,0xED,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xB8,0x87,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB, + 0xCC,0xDD,0xDD,0xEE,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0x8D, + 0xAC,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xED,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xDE,0xED,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFE,0xFF, + 0xFF,0xEF,0xFF,0xFE,0xFF,0xFE,0xFF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xED,0xDD,0xDD,0xCD,0xDD,0xDC,0xDB,0xBB,0xBB,0xDD, + 0xDE,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xC8,0x87,0x88,0x88,0x89,0x99,0xAA,0xAA,0xBB,0xBB, + 0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x89, + 0xDA,0xDE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xDD,0xEE,0xED,0xED,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xEF, + 0xEF,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE, + 0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED, + 0xEE,0xED,0xED,0xED,0xED,0xED,0xDD,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xDD,0xDD, + 0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xFE,0xEE,0xEC,0x88,0x78,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xBC,0xDD, + 0xDD,0xEE,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88, + 0xAC,0xAE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xEE,0xED,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xFF,0xFF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xDE,0xED,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xED, + 0xED,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0x98,0x78,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xBB,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x98, + 0x8B,0xCA,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xDD,0xED,0xEE,0xDE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF, + 0xFF,0xFE,0xFF,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xEE,0xED,0xED,0xED,0xED,0xDD,0xDC,0xDC,0xCB,0xBA,0xBB,0xBB,0xBD,0xDD,0xED,0xEE, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xFE,0xFE,0xFE,0xED,0x97,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE, + 0xEE,0xFE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xCC,0xBA,0xA9,0x99, + 0x88,0xBB,0xBE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xED,0xEE,0xDE,0xEE,0xDE,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xD8,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xCC,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99, + 0x98,0x8D,0xBC,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xED,0xDD,0xDE,0xDE,0xDE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xDD,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xEF,0xFE,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xED,0xED,0xED, + 0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE, + 0xEF,0xEE,0xE8,0x88,0x78,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xDE,0xEE,0xEF, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD,0xCB,0xBA,0xA9, + 0x98,0x88,0xDA,0xCE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xEF,0xFE,0xFF,0xFF,0xFE,0xFF,0xEF,0xFF,0xEF, + 0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xEE, + 0xDE,0xDE,0xDE,0xED,0xDD,0xDD,0xBB,0xBA,0xBB,0xBB,0xDD,0xDD,0xED,0xED,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xED,0x88,0x78,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xED,0xDB,0xBB,0xAA, + 0x99,0x88,0x9D,0xAE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xDD,0xDD,0xEE,0xDE,0xED,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED, + 0xED,0xED,0xED,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xB8,0x88,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCC,0xDD,0xDD,0xEE,0xEF,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xED,0xDD,0xCB,0xAA, + 0x99,0x98,0x8B,0xCA,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFF,0xFF,0xFE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xED, + 0xED,0xED,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xEE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xE8,0x87,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xEE,0xDD,0xCB,0xBB, + 0xAA,0x99,0x88,0xCB,0xBE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xDD,0xED,0xEE,0xDE,0xDE,0xED,0xED,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEB, + 0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xCB, + 0xAA,0x99,0x98,0x8D,0xBC,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED, + 0xED,0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xB8, + 0x78,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB, + 0xBA,0xA9,0x98,0x88,0xDB,0xCE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xDE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xEE, + 0xEE,0xFE,0xFE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDC,0xCB,0xBB,0xBC,0xCD,0xDD,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEF,0xEE,0xD8,0x88, + 0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xED,0xDC, + 0xBA,0xAA,0x99,0x88,0x8D,0xAD,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED, + 0xDD,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xED,0xEE,0xEE,0xDE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0x88,0x88, + 0x88,0x99,0x9A,0xAA,0xBB,0xCB,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDD, + 0xBB,0xBA,0x99,0x98,0x89,0xDA,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDB,0xBB,0xBB,0xBD,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE,0xED,0x98,0x78,0x88, + 0x89,0x99,0xAA,0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD, + 0xDC,0xBB,0xAA,0x99,0x88,0x9D,0xBE,0xEF,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF, + 0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC, + 0xBB,0xBB,0xBC,0xDD,0xDD,0xDE,0xDE,0xDE,0xED,0xEE,0xED,0xED,0xEE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xD8,0x78,0x88,0x89, + 0x99,0xAA,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED, + 0xDC,0xBB,0xAA,0x99,0x98,0x8A,0xBC,0xEE,0xEF,0xEF,0xEE,0xEE,0xFE,0xED,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE, + 0xEF,0xEE,0xEF,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCB, + 0xBB,0xBC,0xDD,0xDD,0xED,0xED,0xED,0xED,0xEE,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xFE,0xEE,0xEA,0x88,0x88,0x88,0x99, + 0x9A,0xAA,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE, + 0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xCB,0xCE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFE, + 0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCB,0xBB, + 0xBB,0xCD,0xDD,0xED,0xED,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0x87,0x88,0x88,0x99,0x9A, + 0xAA,0xBB,0xBB,0xCD,0xDE,0xEE,0xEE,0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xED,0xDB,0xBB,0xAA,0x99,0x88,0x8D,0xAD,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xED,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE, + 0xFE,0xEE,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDB,0xBB,0xBB, + 0xCD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xD8,0x88,0x88,0x89,0x99,0xAA, + 0xAB,0xBC,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE, + 0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x89,0xDB,0xDE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDB,0xBB,0xCD, + 0xDD,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEF,0xEE,0xEE,0xEA,0x88,0x88,0x88,0x99,0x9A,0xAB, + 0xBB,0xCC,0xDD,0xEE,0xEE,0xEF,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE, + 0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x88,0x8D,0xAD,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xED, + 0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xED, + 0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD, + 0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEB,0x88,0x88,0x88,0x99,0x9A,0xAA,0xBB, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x98,0x8A,0xDA,0xEE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xFE,0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xED,0xED,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0x88,0x78,0x88,0x89,0x99,0xAA,0xBB,0xBB, + 0xCD,0xDD,0xEE,0xEE,0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xAD,0xBE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xEE, + 0xED,0xED,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xED,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xEE,0xD8,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD, + 0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0x8B,0xBD,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE, + 0xEE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF, + 0xFF,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xED,0xED,0xDD,0xED,0xED,0xED,0xED,0xED,0xED, + 0xDE,0xDD,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEA,0x87,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xDD, + 0xDE,0xEE,0xEF,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x88,0xCB,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xDE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xDE,0xDE, + 0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEF,0xEE,0xED,0x98,0x88,0x88,0x99,0x99,0xAA,0xBB,0xBC,0xDD,0xDE, + 0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0x8D,0xAE,0xEE,0xFE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFE,0xEF,0xFE,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xDE,0xED,0xED,0xED,0xED,0xED, + 0xDE,0xDD,0xED,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xA8,0x78,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xBD,0xDD,0xEE, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x89,0xDB,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEF,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xED,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDE, + 0xED,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEF,0xEE,0xFE,0xEE,0xD8,0x88,0x88,0x89,0x99,0x9A,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEE,0xEE,0xDD,0xDC,0xBA,0xA9,0x99,0x88,0x9D,0xBE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xDE,0xED,0xEE,0xDE,0xED,0xED,0xED,0xED, + 0xDE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xEE,0xD8,0x87,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBB,0xDD,0xDE,0xEE,0xEE, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xCB,0xBA,0xA9,0x98,0x89,0xDB,0xEE,0xEE,0xEE,0xFE, + 0xEF,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xEF,0xEE,0xEB,0x87,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xDD,0xDE,0xEE,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xAC,0xBE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xCD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xED,0xED,0xED,0xED,0xEE, + 0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0x98,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0x8B,0xBD,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDE,0xED,0xED,0xEE,0xDE,0xDE,0xEE,0xDE,0xEE,0xDE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xB8,0x87,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xCB,0xAA,0xA9,0x98,0x88,0xCC,0xCE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xD8,0x87,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF +}; + +const uint32_t PokeMini_BG5_PalRGB32[] = { + 0x00101010,0x00606058,0x00787878,0x00808080, + 0x00989880,0x00A0A090,0x00A8A898,0x00B0B0A0, + 0x00C0C0B8,0x00C8C8C0,0x00D0D0C8,0x00D8D8D0, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint32_t PokeMini_BG5_PalBGR32[] = { + 0x00101010,0x00586060,0x00787878,0x00808080, + 0x00809898,0x0090A0A0,0x0098A8A8,0x00A0B0B0, + 0x00B8C0C0,0x00C0C8C8,0x00C8D0D0,0x00D0D8D8, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint16_t PokeMini_BG5_PalRGB16[] = { + 0x1082,0x630B,0x7BCF,0x8410,0x9CD0,0xA512,0xAD53,0xB594, + 0xC617,0xCE58,0xD699,0xDEDA,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG5_PalBGR16[] = { + 0x1082,0x5B0C,0x7BCF,0x8410,0x84D3,0x9514,0x9D55,0xA596, + 0xBE18,0xC659,0xCE9A,0xD6DB,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG5_PalRGB15[] = { + 0x8842,0xB18B,0xBDEF,0xC210,0xCE70,0xD292,0xD6B3,0xDAD4, + 0xE317,0xE738,0xEB59,0xEF7A,0xEF7B,0xF39C,0xF7BD,0xFFFF +}; + diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG5.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG5.h new file mode 100644 index 0000000000..7bab5f4c9f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG5.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_BG_X5 +#define POKEMINI_BG_X5 + +#include + +// PokeMini Background Image +// 480 x 320 (5x5) - 4bpp (LSn Left pixel) +extern const uint8_t PokeMini_BG5[]; + +// PokeMini Background Palette (RGBX8888) +extern const uint32_t PokeMini_BG5_PalRGB32[]; + +// PokeMini Background Palette (BGRX8888) +extern const uint32_t PokeMini_BG5_PalBGR32[]; + +// PokeMini Background Palette (RGB565) +extern const uint16_t PokeMini_BG5_PalRGB16[]; + +// PokeMini Background Palette (BGR565) +extern const uint16_t PokeMini_BG5_PalBGR16[]; + +// PokeMini Background Palette (RGB555) +extern const uint16_t PokeMini_BG5_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG6.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG6.c new file mode 100644 index 0000000000..f6c8ecaf96 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG6.c @@ -0,0 +1,6964 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_BG6[] = { + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x85,0x21,0x37, + 0x88,0x88,0x88,0x88,0x10,0x01,0x88,0x88,0x88,0x88,0x84,0x11,0x14,0x62,0x11,0x43, + 0x12,0x68,0x88,0x88,0x86,0x21,0x38,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00, + 0x01,0x33,0x33,0x30,0x00,0x00,0x03,0x33,0x33,0x33,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x02,0x33,0x33,0x20,0x00,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x00,0x12,0x10, + 0x00,0x31,0x11,0x30,0x08,0x80,0x01,0x13,0x11,0x13,0x00,0x22,0x30,0x01,0x22,0x00, + 0x41,0x00,0x13,0x12,0x00,0x14,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x09,0xFF,0xFF, + 0x10,0x00,0x00,0x00,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x0F,0xFF,0x11, + 0xF9,0x00,0x00,0x00,0x00,0xEE,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x30,0x0F,0xF5,0xEF, + 0x90,0x00,0x11,0x00,0x1F,0xF0,0x11,0x00,0x01,0x10,0x02,0xFF,0xF1,0x2F,0xFF,0x00, + 0x41,0x01,0x00,0x10,0x00,0x22,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x1F,0xF0,0x9F, + 0xF0,0x9F,0xFF,0x70,0x2F,0x84,0xFF,0x15,0xFF,0xF8,0x05,0xFF,0xF1,0xEF,0xFF,0x08, + 0xF2,0x2F,0xCC,0xFE,0x02,0xF9,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x2F,0xFC,0xFF, + 0x78,0xFF,0xEF,0xF1,0x8F,0xCF,0xF1,0x2F,0xF7,0xFF,0x0C,0xF7,0xF5,0xF9,0xF9,0x0F, + 0xF1,0x5F,0xF9,0xFF,0x18,0xF5,0x00,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x5F,0xFF,0xF8, + 0x0F,0xF9,0x1F,0xF1,0xEF,0xFF,0x40,0x8F,0xFF,0xFE,0x0F,0xF2,0xFF,0xE4,0xF8,0x0F, + 0xF0,0x8F,0x51,0xFF,0x0C,0xF2,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x8F,0x51,0x00, + 0x1F,0xF2,0xCF,0xF1,0xFF,0xFF,0xC0,0xCF,0xC8,0x40,0x1F,0x82,0xFF,0x27,0xF2,0x1F, + 0xF0,0xFF,0x12,0xFE,0x0F,0xF1,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0xFF,0x10,0x00, + 0x0E,0xFF,0xFF,0x81,0xFF,0x1F,0xF1,0x7F,0xFC,0xF1,0x5F,0x22,0xFF,0x08,0xF2,0x2F, + 0x80,0xFF,0x05,0xF8,0x1F,0xF0,0x02,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x21,0x00,0xFF,0x00,0x20, + 0x01,0xEF,0xF5,0x02,0xF9,0x0C,0xF7,0x0C,0xFF,0x80,0xCF,0x11,0x82,0x0F,0xF1,0x8F, + 0x41,0xFF,0x08,0xF2,0x2F,0xC0,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x32, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x10,0x00,0x01,0x33, + 0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x87,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x43,0x33,0x33,0x33,0x23,0x22,0x22,0x22,0x23,0x33,0x33,0x33,0x32,0x22,0x22,0x22, + 0x23,0x32,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x32,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x21, + 0x22,0x22,0x21,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x23,0x22,0x11,0x11, + 0x11,0x21,0x11,0x12,0x21,0x21,0x12,0x11,0x11,0x11,0x12,0x33,0x21,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x33,0x32,0x22,0x32,0x32,0x33,0x32, + 0x22,0x22,0x33,0x33,0x33,0x33,0x33,0x33,0x22,0x22,0x22,0x22,0x33,0x33,0x43,0x33, + 0x34,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x78, + 0x98,0x76,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x54,0x54,0x43,0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x43,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x32,0x33,0x22,0x22,0x23,0x32,0x33, + 0x33,0x33,0x22,0x22,0x22,0x22,0x33,0x33,0x22,0x22,0x22,0x33,0x33,0x22,0x22,0x22, + 0x22,0x22,0x22,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x24,0x43,0x22,0x11,0x11, + 0x13,0x44,0x31,0x24,0x43,0x21,0x34,0x21,0x11,0x12,0x34,0x33,0x21,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x22,0x11,0x11, + 0x12,0x11,0x11,0x21,0x11,0x21,0x21,0x11,0x21,0x11,0x11,0x11,0x11,0x11,0x11,0x21, + 0x11,0x21,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x23,0x33,0x33,0x33,0x33,0x22,0x33,0x34,0x43,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x34,0x44,0x44,0x44,0x44,0x44,0x43,0x33,0x33,0x33,0x33,0x34,0x54,0x45, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x67,0x89, + 0xB9,0x88,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x65,0x55,0x54,0x44,0x45,0x55,0x66,0x66,0x65,0x55,0x44,0x44,0x44,0x44, + 0x55,0x55,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x33,0x33,0x33,0x33,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x33,0x33, + 0x44,0x44,0x33,0x22,0x11,0x11,0x11,0x11,0x11,0x11,0x24,0x55,0x53,0x21,0x11,0x11, + 0x35,0x55,0x42,0x36,0x55,0x32,0x34,0x22,0x12,0x46,0x55,0x32,0x11,0x11,0x21,0x11, + 0x11,0x11,0x11,0x12,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x21,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, + 0x11,0x12,0x24,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x44,0x44,0x44,0x44,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x44,0x44,0x44,0x45,0x56,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x88,0x9B, + 0xEC,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x98, + 0x88,0x88,0x77,0x77,0x77,0x77,0x77,0x88,0x88,0x88,0x88,0x77,0x76,0x66,0x66,0x67, + 0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,0x66,0x65,0x55,0x56, + 0x66,0x55,0x43,0x33,0x23,0x23,0x22,0x23,0x22,0x36,0x78,0x86,0x43,0x33,0x32,0x22, + 0x67,0x78,0x75,0x36,0x87,0x77,0x53,0x22,0x46,0x77,0x74,0x33,0x32,0x32,0x32,0x32, + 0x32,0x22,0x23,0x33,0x34,0x33,0x44,0x44,0x44,0x44,0x43,0x43,0x33,0x33,0x43,0x44, + 0x34,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x33,0x33,0x33,0x43,0x34, + 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x34,0x33,0x34,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x33,0x32,0x23,0x23,0x22,0x23,0x22,0x22,0x22,0x23, + 0x23,0x23,0x22,0x22,0x22,0x23,0x23,0x23,0x22,0x22,0x32,0x32,0x32,0x32,0x33,0x33, + 0x23,0x22,0x35,0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x88,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x88, + 0x88,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xCE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCC,0xCC,0xCC,0xBB, + 0xBB,0xA9,0x98,0x88,0x88,0x88,0x99,0xAA,0xAA,0xAA,0x99,0x98,0x88,0x87,0x78,0x88, + 0x98,0x88,0x88,0x88,0x87,0x87,0x77,0x77,0x77,0x77,0x78,0x87,0x77,0x87,0x87,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x88,0x88,0x88,0x88,0x77,0x77,0x88, + 0x87,0x75,0x44,0x43,0x43,0x43,0x43,0x43,0x35,0x89,0x98,0x64,0x43,0x43,0x43,0x33, + 0x44,0x68,0x88,0x63,0x56,0x55,0x43,0x47,0x89,0x98,0x54,0x34,0x33,0x33,0x33,0x33, + 0x33,0x33,0x44,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x54,0x55,0x45,0x45,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x45,0x45, + 0x44,0x55,0x45,0x45,0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x44,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x33,0x33,0x43,0x33,0x33,0x33,0x33,0x34,0x33,0x33,0x33,0x33,0x33,0x33,0x33, + 0x33,0x43,0x45,0x78,0x87,0x77,0x77,0x87,0x88,0x88,0x89,0x88,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x99,0x99,0x99,0x99,0x99,0x99,0x98,0x88,0x88,0x88,0x88,0x9A, + 0xBB,0xBC,0xCC,0xCC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE, + 0xFF,0xFF,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xCB,0xBA,0xAA,0x99,0x9A,0xAA,0xBC,0xCD,0xCD,0xCD,0xCB,0xBB,0x99,0x98,0x98,0x99, + 0xAA,0xAA,0xAA,0x99,0x99,0x98,0x89,0x89,0x88,0x89,0x99,0x98,0x88,0x88,0x88,0x88, + 0x88,0x88,0x88,0x88,0x88,0x77,0x78,0x88,0x99,0x9A,0x99,0x99,0x99,0x88,0x89,0xA9, + 0x87,0x65,0x44,0x44,0x44,0x44,0x44,0x44,0x8A,0xAA,0x97,0x54,0x44,0x44,0x44,0x78, + 0x76,0x47,0xAA,0xA7,0x44,0x44,0x46,0x9B,0xAA,0x85,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x56,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x56, + 0x66,0x65,0x66,0x66,0x66,0x56,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66, + 0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x55,0x64,0x44,0x44,0x44,0x44,0x44,0x44,0x43, + 0x44,0x43,0x44,0x34,0x44,0x43,0x44,0x44,0x43,0x44,0x43,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x78,0x99,0x99,0x98,0x88,0x88,0x89,0x9A,0xA9,0x9A,0x99,0xA9,0xA9, + 0xAA,0xAA,0xAA,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xAB,0x99,0x99,0x9A,0x9A,0xAB, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEE,0xEE, + 0xDB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xCB,0xBA,0xAA,0xAA,0xAA, + 0xAB,0xBA,0xAA,0xAA,0x99,0x99,0x99,0x99,0xAA,0xAA,0x99,0x99,0x99,0x98,0x98,0x88, + 0x89,0x99,0x99,0x99,0x98,0x89,0x9A,0xBB,0xBB,0xAA,0x9A,0x99,0x99,0x99,0xBB,0xBA, + 0x87,0x65,0x54,0x44,0x45,0x45,0x65,0x69,0xCC,0xB9,0x65,0x54,0x54,0x54,0x48,0xCD, + 0xCD,0x84,0x8D,0xDC,0x64,0x45,0x7A,0xCD,0xA7,0x55,0x44,0x44,0x44,0x44,0x44,0x44, + 0x55,0x56,0x77,0x77,0x77,0x77,0x76,0x77,0x76,0x77,0x67,0x76,0x76,0x76,0x76,0x67, + 0x67,0x67,0x76,0x76,0x66,0x76,0x67,0x66,0x76,0x76,0x66,0x67,0x67,0x66,0x67,0x66, + 0x66,0x67,0x66,0x67,0x67,0x66,0x67,0x66,0x67,0x67,0x66,0x67,0x67,0x67,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x56,0x79,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA, + 0xBA,0xBA,0xBB,0xCC,0xCD,0xCC,0xDD,0xCD,0xDD,0xDD,0xCD,0xBB,0xBA,0xAA,0xAB,0xBB, + 0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED, + 0xDC,0xCB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDD,0xDD,0xDB,0xAB,0xAA,0xBA, + 0xBA,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0x9A,0xAB,0xAA,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xCC,0xBB,0xBA,0xAA,0xAA,0x9A,0x9A,0xAB,0xDD,0xC8, + 0x76,0x55,0x54,0x54,0x54,0x55,0x68,0xBD,0xDA,0x87,0x55,0x55,0x55,0x57,0x8B,0x79, + 0xDC,0xD8,0x58,0x97,0x65,0x68,0xBD,0xD8,0x65,0x45,0x45,0x44,0x44,0x54,0x44,0x55, + 0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x67,0x67,0x77,0x67,0x76,0x77,0x67,0x76,0x77,0x76,0x76,0x77,0x76,0x77, + 0x77,0x67,0x67,0x76,0x76,0x77,0x67,0x67,0x77,0x67,0x67,0x76,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x75,0x44,0x44,0x44,0x45,0x44,0x45, + 0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54, + 0x44,0x54,0x45,0x79,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0xAA,0xAB,0xBB,0xAB,0xAA,0xAB, + 0xAB,0xBB,0xBB,0xCC,0xCC,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB,0xAB, + 0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDC, + 0xCC,0xBC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xED,0xED,0xDD,0xCC,0xBA,0xAB,0xAB, + 0xAB,0xAB,0xAA,0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0x99,0x89,0x89,0x99,0x99,0x99, + 0x99,0xA9,0xAA,0xAB,0xBB,0xCC,0xDC,0xCB,0xAA,0xA9,0xA9,0xA9,0xA9,0xCD,0xDC,0x98, + 0x65,0x56,0x54,0x45,0x45,0x56,0xAB,0xDE,0xA7,0x65,0x69,0xA6,0x55,0x8B,0xD8,0x55, + 0x8C,0xDD,0x75,0x55,0x57,0xBC,0xBB,0x96,0x54,0x54,0x44,0x54,0x54,0x44,0x55,0x56, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77, + 0x67,0x67,0x77,0x76,0x77,0x76,0x77,0x67,0x77,0x67,0x67,0x67,0x67,0x67,0x67,0x67, + 0x67,0x76,0x76,0x77,0x67,0x67,0x67,0x76,0x76,0x77,0x76,0x77,0x76,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x55,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44, + 0x54,0x45,0x55,0x68,0xAA,0xAA,0xA9,0xA9,0xA9,0x9A,0xAA,0xBB,0xAA,0xAA,0xAB,0xAA, + 0xBA,0xBB,0xBB,0xBC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD, + 0xCB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xED,0xDC,0xDC,0xCB,0xBB,0xBB, + 0xAB,0xBA,0xBA,0xAA,0xA9,0xA9,0x99,0xAA,0xAA,0xA9,0x99,0x99,0x98,0x99,0x99,0x99, + 0xA9,0x9A,0xAA,0xBB,0xCC,0xDD,0xCC,0xAA,0xAA,0xA9,0x9A,0x9A,0xAB,0xCD,0xC9,0x86, + 0x55,0x54,0x54,0x54,0x45,0x8B,0xCD,0xC9,0x75,0x55,0x7B,0xC8,0x55,0x9D,0xCB,0x75, + 0x58,0xDC,0x75,0x56,0x8D,0xCE,0xB7,0x54,0x54,0x44,0x54,0x44,0x44,0x45,0x56,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x67, + 0x77,0x77,0x76,0x77,0x76,0x77,0x76,0x76,0x76,0x77,0x76,0x77,0x67,0x76,0x77,0x67, + 0x76,0x77,0x67,0x67,0x76,0x76,0x77,0x67,0x67,0x67,0x67,0x76,0x77,0x77,0x77,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x74,0x54,0x54,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x54, + 0x45,0x44,0x45,0x57,0x99,0xA9,0xA9,0xA9,0x9A,0x99,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA, + 0xBA,0xAB,0xAB,0xBB,0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDB,0xBA,0xBB,0xAB,0xAB, + 0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xBC, + 0xBC,0xCC,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x89,0x89,0x99,0x99,0x9A, + 0x9A,0xAA,0xAB,0xAB,0xCD,0xDD,0xBA,0xA9,0xA9,0xA9,0xA9,0x9A,0xBC,0xDC,0xA8,0x65, + 0x54,0x54,0x54,0x55,0x58,0xDC,0xCA,0x86,0x56,0x86,0x57,0x77,0x86,0x6C,0xDD,0xB7, + 0x55,0x77,0x55,0x7A,0xDD,0xB8,0x75,0x54,0x54,0x44,0x44,0x54,0x54,0x55,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x76,0x77,0x77,0x77, + 0x67,0x67,0x77,0x67,0x67,0x76,0x77,0x76,0x77,0x67,0x77,0x76,0x77,0x67,0x76,0x76, + 0x77,0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x76,0x77,0x76,0x77,0x77,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x44,0x44,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44, + 0x44,0x45,0x45,0x56,0x8A,0xAA,0xAA,0x9A,0x99,0x9A,0x9A,0xAA,0xBB,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD,0xCC, + 0xBC,0xCD,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDC,0xDC,0xDB,0xBB, + 0xBB,0xBA,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0x9A,0x99, + 0xAA,0xAA,0xAA,0xBB,0xCC,0xBA,0xAA,0xAA,0xA9,0x99,0x99,0xAA,0xBD,0xC9,0x86,0x55, + 0x54,0x54,0x45,0x55,0x8B,0xDD,0xA7,0x55,0x7A,0xDC,0x74,0x7C,0xDB,0x67,0xDD,0xCB, + 0x65,0x55,0x57,0xAD,0xEC,0x85,0x55,0x45,0x44,0x54,0x44,0x44,0x45,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x76, + 0x77,0x77,0x67,0x77,0x77,0x67,0x76,0x77,0x76,0x76,0x76,0x76,0x76,0x77,0x67,0x77, + 0x67,0x76,0x76,0x77,0x67,0x67,0x67,0x77,0x67,0x76,0x77,0x67,0x77,0x67,0x77,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x64,0x54,0x45,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x54,0x45, + 0x45,0x44,0x54,0x56,0x79,0x9A,0x9A,0xA9,0x9A,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xCB,0xDC,0xDD,0xDC,0xDB,0xBB,0xBB,0xAB,0xBB,0xBA, + 0xBA,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xCC,0xCC, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xDC,0xCB,0xCB, + 0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0xA9,0xAA, + 0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x99,0x9B,0xCC,0x98,0x65,0x55, + 0x45,0x45,0x45,0x58,0xDC,0xB8,0x66,0x54,0x7D,0xDE,0xA6,0x6B,0xED,0xB6,0x6B,0xCA, + 0x75,0x56,0x8B,0xBD,0xA7,0x54,0x54,0x44,0x44,0x44,0x45,0x45,0x56,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77, + 0x67,0x67,0x77,0x67,0x76,0x77,0x67,0x77,0x67,0x76,0x77,0x77,0x77,0x76,0x77,0x67, + 0x76,0x76,0x76,0x76,0x77,0x67,0x66,0x76,0x76,0x77,0x76,0x77,0x67,0x77,0x76,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x44,0x44,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x44, + 0x44,0x45,0x45,0x55,0x79,0x9A,0xAA,0x9A,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xBB,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCC,0xBB, + 0xBD,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDC,0xDB,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0x9A,0x99,0x9A,0x99,0xA9,0xA9,0xAA, + 0xAA,0xAB,0xBB,0xBA,0xBA,0xAA,0xA9,0xA9,0x99,0x99,0x99,0xBB,0xC9,0x76,0x55,0x54, + 0x54,0x54,0x55,0x8C,0xDC,0x76,0x56,0x75,0x47,0xBC,0xDA,0x67,0xDD,0xCA,0x56,0x86, + 0x55,0x7A,0xDD,0xB8,0x65,0x55,0x44,0x54,0x54,0x44,0x44,0x55,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x76, + 0x77,0x77,0x67,0x76,0x76,0x76,0x77,0x67,0x76,0x77,0x67,0x67,0x77,0x77,0x76,0x77, + 0x67,0x76,0x76,0x77,0x67,0x67,0x67,0x67,0x76,0x76,0x77,0x67,0x76,0x77,0x77,0x77, + 0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x64,0x44,0x54,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x54, + 0x45,0x44,0x44,0x45,0x68,0xA9,0xAA,0x9A,0x9A,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xBA,0xBB,0xBC,0xBC,0xBC,0xCC,0xCB,0xBB,0xBB,0xBC,0xCB, + 0xBA,0xBA,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xED,0xBC,0xBC,0xCC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBC,0xBB,0xCD,0xCD,0xDC,0xCD,0xBB,0xCB, + 0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xA9,0xA9,0xA9,0x9A,0x9A,0x9A,0xAA, + 0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x9B,0xBC,0xA8,0x65,0x55,0x45, + 0x44,0x54,0x46,0xAD,0xB8,0x65,0x78,0x87,0x55,0x7C,0xBD,0xA6,0x7D,0xCE,0x85,0x55, + 0x58,0xCC,0xDB,0x75,0x54,0x44,0x44,0x44,0x44,0x54,0x55,0x56,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x67,0x77, + 0x76,0x76,0x77,0x67,0x76,0x76,0x67,0x76,0x76,0x76,0x76,0x77,0x67,0x76,0x77,0x67, + 0x77,0x67,0x67,0x67,0x67,0x67,0x77,0x67,0x67,0x67,0x67,0x77,0x67,0x77,0x67,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x75,0x44,0x44,0x44, + 0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x45,0x45,0x45,0x68,0xAA,0xA9,0xA9,0xA9,0x9A,0x99,0xAA,0xAA,0xAA,0xA9,0xA9, + 0xAA,0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB,0xBD,0xCD,0xBC, + 0xBB,0xAB,0xAB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDC,0xCB,0xBD, + 0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xCC,0xCC,0xDB,0xDC,0xCB, + 0xCB,0xBC,0xBB,0xBB,0xBB,0xCB,0xBB,0xBA,0xBA,0xAA,0xA9,0xA9,0xA9,0xA9,0xAA,0xAA, + 0xAA,0xBB,0xBA,0xBB,0xBA,0xAA,0xA9,0x99,0x98,0x99,0xAC,0xDB,0x87,0x65,0x54,0x45, + 0x45,0x44,0x48,0xCD,0x96,0x68,0xBE,0xDC,0xA7,0x57,0xCC,0xEA,0x56,0xBA,0x76,0x56, + 0x8C,0xDC,0x97,0x54,0x54,0x54,0x54,0x54,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x67,0x77,0x67, + 0x77,0x77,0x67,0x77,0x67,0x77,0x77,0x67,0x77,0x76,0x76,0x66,0x76,0x77,0x67,0x67, + 0x76,0x77,0x76,0x77,0x67,0x67,0x67,0x76,0x77,0x76,0x77,0x76,0x77,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x64,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44, + 0x45,0x44,0x54,0x45,0x57,0x99,0xAA,0x9A,0x99,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA, + 0x9A,0xAA,0x9A,0xA9,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xCC,0xCC,0xBC,0xCC,0xDD,0xDC, + 0xBB,0xBA,0xBA,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xED,0xDC,0xCC,0xCD,0xCD, + 0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBC,0xDC,0xCD,0xBC,0xCD, + 0xCD,0xCC,0xDB,0xCC,0xDB,0xCC,0xCB,0xBB,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA, + 0xBB,0xAB,0xBB,0xBA,0xAA,0xAA,0x99,0x99,0x99,0x9A,0xCD,0xB8,0x76,0x55,0x45,0x44, + 0x44,0x54,0x58,0xED,0x85,0x59,0xBC,0xDB,0xDD,0xC8,0xAD,0xDE,0x95,0x55,0x55,0x8A, + 0xBD,0xB8,0x65,0x45,0x44,0x44,0x44,0x44,0x54,0x56,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x67,0x77, + 0x67,0x67,0x77,0x67,0x76,0x77,0x67,0x76,0x76,0x77,0x67,0x77,0x77,0x67,0x77,0x77, + 0x67,0x76,0x76,0x76,0x76,0x76,0x76,0x77,0x67,0x67,0x67,0x67,0x67,0x76,0x77,0x76, + 0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x44,0x45, + 0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54, + 0x54,0x44,0x44,0x54,0x57,0x89,0xA9,0x9A,0x99,0x99,0x99,0xAA,0xAA,0xA9,0xA9,0xA9, + 0xA9,0x99,0xA9,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xCD,0xCD,0xDC, + 0xBB,0xAB,0xAB,0xAB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xCD,0xCB,0xBB,0xDD, + 0xDE,0xDD,0xED,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xCB,0xDB,0xDB,0xDB,0xDC, + 0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCB,0xBB,0xBA,0xAA,0xA9,0xAA,0xAA,0xAA,0x9A,0xAA, + 0xAB,0xBB,0xBA,0xAA,0xAA,0xAA,0x99,0x98,0x99,0x9B,0xCC,0x97,0x65,0x54,0x54,0x45, + 0x45,0x44,0x5A,0xBA,0x75,0x55,0xAC,0xCA,0x87,0x8B,0xCC,0xCD,0xA7,0x54,0x68,0xBD, + 0xBB,0x86,0x45,0x44,0x45,0x44,0x44,0x54,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x67, + 0x77,0x77,0x67,0x76,0x77,0x67,0x76,0x76,0x77,0x67,0x76,0x76,0x76,0x77,0x66,0x66, + 0x76,0x77,0x67,0x76,0x77,0x67,0x67,0x66,0x77,0x67,0x77,0x77,0x76,0x77,0x76,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x64,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x57,0x8A,0x9A,0xA9,0x99,0x99,0x99,0x99,0xAA,0xAA,0x99,0x99, + 0x99,0x99,0x99,0x99,0xAA,0xAB,0xAB,0xBB,0xAB,0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xCB, + 0xBB,0xBA,0xBA,0xBA,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDC,0xCC,0xCC,0xDD,0xDD, + 0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD, + 0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xCB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xAA,0xAB,0xAA,0xAA,0x99,0x99,0x99,0x99,0xBD,0xDA,0x76,0x55,0x45,0x44,0x54, + 0x44,0x55,0x5A,0xEB,0x76,0x54,0x6A,0xCC,0xB7,0x55,0x68,0x98,0x76,0x56,0xAD,0xDC, + 0x86,0x54,0x54,0x45,0x44,0x45,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x77,0x77,0x67,0x77,0x77,0x76,0x76, + 0x67,0x67,0x76,0x77,0x76,0x77,0x67,0x77,0x76,0x77,0x67,0x76,0x77,0x67,0x77,0x77, + 0x77,0x76,0x76,0x77,0x67,0x76,0x77,0x77,0x67,0x77,0x67,0x76,0x77,0x67,0x77,0x76, + 0x76,0x77,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x44, + 0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x54,0x55,0x79,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBC,0xCC,0xCC,0xCC,0xCC,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xCB,0xCD,0xDD, + 0xDD,0xDE,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xCD,0xBD,0xBD,0xCD,0xCD,0xCC,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x9B,0xCD,0xB8,0x75,0x55,0x44,0x54,0x44, + 0x54,0x44,0x59,0xDD,0x75,0x55,0x46,0xCD,0xCB,0x75,0x54,0x55,0x55,0x8B,0xBD,0xB8, + 0x55,0x54,0x45,0x44,0x44,0x44,0x45,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x76,0x77,0x77, + 0x76,0x77,0x67,0x76,0x77,0x67,0x67,0x76,0x77,0x67,0x66,0x77,0x76,0x76,0x76,0x76, + 0x76,0x76,0x77,0x67,0x76,0x77,0x76,0x76,0x77,0x67,0x76,0x77,0x67,0x76,0x76,0x77, + 0x77,0x67,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x54, + 0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45, + 0x44,0x44,0x54,0x44,0x56,0x79,0x9A,0x99,0x98,0x89,0x99,0x89,0x89,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xCC,0xCB,0xBB, + 0xBB,0xAB,0xAB,0xBA,0xBA,0xBB,0xBD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xDD,0xBC,0xCC,0xCD,0xDD,0xDE, + 0xDD,0xED,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xCD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC, + 0xDC,0xCC,0xCC,0xCD,0xCC,0xBB,0xBB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xAA,0xA9,0x99,0x99,0x99,0xAC,0xDC,0x87,0x65,0x54,0x54,0x44,0x54, + 0x44,0x54,0x48,0xDD,0x86,0x55,0x44,0x6B,0xCC,0xC7,0x55,0x55,0x68,0xBD,0xD9,0x75, + 0x54,0x45,0x44,0x54,0x54,0x54,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x76,0x77,0x67,0x76,0x76, + 0x77,0x67,0x77,0x67,0x67,0x67,0x76,0x77,0x67,0x76,0x77,0x67,0x77,0x77,0x77,0x77, + 0x76,0x76,0x76,0x76,0x77,0x76,0x77,0x76,0x76,0x77,0x67,0x67,0x77,0x67,0x77,0x67, + 0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x75, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x44, + 0x45,0x44,0x44,0x54,0x55,0x78,0x99,0x99,0x89,0x99,0x99,0x88,0x89,0x89,0x89,0x89, + 0x89,0x89,0x89,0x9A,0xAB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCB,0xCB,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD,0xDC,0xBC,0xCD,0xDD,0xED, + 0xED,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBD,0xCD,0xDD,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAA,0xBA,0xAB,0xAB,0xAA,0xAA,0xAB,0xAB, + 0xAB,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x9A,0xAC,0xC9,0x76,0x55,0x45,0x45,0x45,0x44, + 0x54,0x44,0x47,0xDC,0xC7,0x55,0x54,0x46,0xCC,0xC8,0x55,0x57,0xBE,0xDB,0x86,0x55, + 0x45,0x44,0x44,0x44,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x67,0x76,0x77,0x76,0x77,0x66,0x67,0x66,0x67, + 0x67,0x76,0x76,0x77,0x77,0x67,0x67,0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x67,0x77, + 0x77,0x67,0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67, + 0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x45, + 0x44,0x54,0x54,0x44,0x45,0x68,0xA9,0x99,0x98,0x99,0x99,0x98,0x88,0x89,0x88,0x89, + 0x89,0x99,0x99,0x9A,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xBB,0xAB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xEE,0xED,0xDB,0xCC,0xCD,0xCD,0xDE,0xDD, + 0xDD,0xED,0xDD,0xCC,0xDB,0xCB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xCD, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBA,0xBA,0xAA,0xAB,0xAA, + 0xAA,0xBA,0x9A,0x9A,0x99,0x99,0x99,0x9A,0xAB,0xA7,0x65,0x55,0x45,0x44,0x54,0x54, + 0x44,0x54,0x55,0xAD,0xD9,0x65,0x55,0x54,0x7A,0x76,0x56,0x8D,0xCD,0xB7,0x55,0x44, + 0x44,0x45,0x44,0x45,0x45,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x67, + 0x67,0x67,0x67,0x76,0x76,0x67,0x67,0x76,0x77,0x67,0x67,0x66,0x66,0x56,0x56,0x66, + 0x76,0x77,0x77,0x76,0x77,0x77,0x76,0x76,0x76,0x76,0x76,0x76,0x77,0x77,0x77,0x67, + 0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x75,0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x54,0x55,0x67,0xA9,0x99,0x99,0x99,0x99,0x98,0x88,0x98,0x98,0x98, + 0x98,0x98,0x99,0x9A,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB, + 0xBB,0xBC,0xCD,0xCC,0xBB,0xBA,0xBA,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xDC,0xCB,0xBC,0xDD,0xDE,0xDD, + 0xED,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xCB,0xDD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAA,0xBA,0xBA, + 0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0x86,0x55,0x45,0x45,0x45,0x44,0x44, + 0x54,0x44,0x44,0x6D,0xDC,0x86,0x55,0x55,0x44,0x55,0x7A,0xCD,0xD9,0x65,0x54,0x45, + 0x45,0x44,0x45,0x44,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77, + 0x77,0x77,0x77,0x67,0x67,0x76,0x77,0x67,0x67,0x77,0x76,0x66,0x66,0x66,0x66,0x66, + 0x77,0x76,0x76,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77, + 0x76,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x67,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x54,0x44,0x54,0x67,0x99,0x99,0x99,0x99,0x99,0x99,0x88,0x88,0x88,0x88, + 0x89,0x89,0x99,0xAA,0xAB,0xBA,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC, + 0xBB,0xCC,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xBC,0xCC,0xCD,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDC,0xCC,0xCB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD,0xBD,0xDC,0xCC, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xAA,0xAA, + 0xA9,0x99,0x99,0xA9,0x99,0x99,0x99,0xA9,0xA8,0x75,0x54,0x45,0x44,0x54,0x54,0x54, + 0x44,0x54,0x44,0x47,0xBD,0xDB,0x86,0x55,0x56,0x79,0xCD,0xEC,0x86,0x55,0x45,0x44, + 0x44,0x45,0x44,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x67,0x77,0x76,0x77,0x77,0x77, + 0x67,0x67,0x67,0x76,0x76,0x77,0x76,0x76,0x76,0x76,0x66,0x66,0x66,0x67,0x66,0x67, + 0x67,0x67,0x67,0x76,0x76,0x76,0x77,0x67,0x67,0x67,0x67,0x67,0x67,0x77,0x77,0x67, + 0x77,0x67,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x66,0x74,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x45,0x57,0x99,0x99,0x99,0x99,0xA9,0x99,0x88,0x88,0x98,0x98, + 0x98,0x98,0x99,0xAA,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCC, + 0xDD,0xCD,0xDD,0xDE,0xDC,0xBB,0xBB,0xBA,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xDC,0xBB,0xCD,0xDD,0xED,0xED, + 0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD,0xDC,0xDD,0xCC,0xDC,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xA9, + 0x98,0x99,0xA9,0x99,0x99,0x99,0x99,0xAA,0x87,0x55,0x54,0x54,0x54,0x44,0x44,0x44, + 0x54,0x45,0x45,0x44,0x6C,0xEC,0xDC,0xA9,0x9C,0xDD,0xDB,0x97,0x55,0x54,0x44,0x44, + 0x54,0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x76,0x77, + 0x77,0x77,0x76,0x77,0x77,0x77,0x66,0x66,0x76,0x66,0x66,0x56,0x67,0x67,0x76,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x76, + 0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x54, + 0x45,0x45,0x44,0x44,0x54,0x57,0x99,0x99,0x99,0x99,0x99,0x98,0x88,0x88,0x88,0x89, + 0x89,0x99,0x99,0xAA,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xBC,0xBD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xED,0xDB,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCC,0xDB,0xCB,0xBB,0xCC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDB,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9, + 0x88,0x99,0xA9,0x99,0x99,0x99,0x9A,0xA9,0x76,0x55,0x45,0x44,0x45,0x45,0x45,0x44, + 0x44,0x44,0x44,0x44,0x55,0x8B,0xCD,0xED,0xBD,0xDE,0xC8,0x55,0x44,0x44,0x54,0x44, + 0x44,0x54,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x76,0x77,0x76, + 0x77,0x67,0x67,0x76,0x76,0x76,0x66,0x66,0x56,0x56,0x65,0x66,0x67,0x76,0x66,0x66, + 0x67,0x67,0x76,0x77,0x67,0x67,0x67,0x67,0x76,0x76,0x76,0x76,0x77,0x77,0x77,0x77, + 0x76,0x77,0x67,0x67,0x67,0x76,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x67,0x64,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x45,0x56,0x89,0x99,0x99,0x99,0x99,0x99,0x88,0x88,0x89,0x98, + 0x99,0x99,0xA9,0xAA,0xBB,0xBB,0xBB,0xAB,0xAA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBC,0xCD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xDD,0xBB,0xBA,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCD,0xCC,0xBC,0xDD,0xED,0xED,0xDD, + 0xDD,0xDD,0xCC,0xCB,0xBC,0xBD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9, + 0x99,0xA9,0xA9,0x99,0x99,0x99,0xA9,0x98,0x65,0x54,0x54,0x54,0x54,0x44,0x44,0x45, + 0x44,0x44,0x45,0x45,0x44,0x45,0x78,0xAA,0xAA,0x87,0x65,0x54,0x54,0x54,0x44,0x44, + 0x44,0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x65,0x56,0x56,0x67,0x67,0x76,0x66, + 0x67,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x76,0x76,0x76,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x76,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x56,0x79,0x99,0x9A,0x9A,0x9A,0x99,0x98,0x88,0x88,0x89, + 0x89,0x99,0x99,0xAA,0xAA,0xBB,0xBA,0xBA,0xAB,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBC, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xED,0xDB,0xBB,0xBA,0xBB,0xCD,0xEE,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xCC,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xCB,0xCB,0xBC,0xCC,0xDC,0xDC,0xDC,0xDC,0xDD,0xBD,0xCB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDB,0xBA,0x99, + 0x99,0x99,0x99,0x9A,0x99,0xA9,0x9A,0x86,0x65,0x45,0x45,0x44,0x44,0x54,0x44,0x44, + 0x44,0x54,0x44,0x44,0x45,0x45,0x44,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x54, + 0x45,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x67, + 0x77,0x67,0x67,0x67,0x66,0x66,0x66,0x76,0x66,0x66,0x55,0x66,0x67,0x76,0x76,0x66, + 0x66,0x77,0x77,0x77,0x67,0x76,0x76,0x77,0x76,0x76,0x76,0x76,0x77,0x77,0x77,0x77, + 0x76,0x76,0x76,0x76,0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x67,0x64,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x44,0x45,0x45,0x45,0x56,0x8A,0xA9,0xAA,0xAA,0xA9,0x99,0x98,0x88,0x89,0x99, + 0x99,0x99,0x9A,0xAA,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB, + 0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xDD,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDD,0xCC,0xBB,0xBD,0xDD,0xED,0xED,0xDD, + 0xDC,0xDC,0xBC,0xCC,0xCD,0xBD,0xBD,0xCD,0xDD,0xCD,0xDC,0xCB,0xBB,0xBB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xAA,0x99, + 0x99,0xAA,0x99,0x99,0xA9,0x9A,0xA9,0x76,0x55,0x54,0x54,0x54,0x54,0x45,0x44,0x44, + 0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x54,0x54,0x54,0x44,0x54,0x45,0x44,0x44, + 0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x67,0x77, + 0x77,0x77,0x77,0x76,0x66,0x66,0x67,0x67,0x76,0x66,0x65,0x56,0x66,0x76,0x76,0x76, + 0x66,0x67,0x67,0x67,0x76,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x76, + 0x77,0x77,0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x75,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x54,0x55,0x8A,0x9A,0xAB,0xBB,0xAA,0xA9,0x98,0x98,0x99,0x99, + 0x99,0x99,0xA9,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCD,0xDE,0xEE,0xEE,0xED,0xDB,0xBB,0xAB,0xBB,0xCD,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xEE,0xDD,0xDC,0xCC,0xCD,0xDD,0xDE,0xDD,0xDD,0xDC, + 0xDB,0xCC,0xBC,0xCD,0xBC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDC,0xBA,0x99, + 0xA9,0xA9,0xAA,0xAA,0x9A,0xA9,0x97,0x65,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x45, + 0x44,0x44,0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x55, + 0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x76,0x77,0x67, + 0x77,0x67,0x67,0x67,0x65,0x66,0x67,0x76,0x76,0x76,0x66,0x66,0x66,0x77,0x67,0x66, + 0x66,0x77,0x77,0x77,0x67,0x67,0x67,0x77,0x76,0x76,0x76,0x76,0x76,0x77,0x77,0x77, + 0x76,0x77,0x76,0x77,0x77,0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87, + 0x77,0x77,0x76,0x67,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x54,0x45,0x44,0x54,0x55,0x79,0xAA,0xBB,0xCC,0xBA,0x9A,0xAB,0x89,0x99,0x99, + 0x9A,0x9A,0x9A,0xAA,0xAB,0xAB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA, + 0xBA,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xDD,0xBB,0xBA,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xDC,0xCB,0xCB,0xDD,0xDD,0xED,0xDD,0xDD, + 0xCD,0xCB,0xDB,0xDB,0xDC,0xCC,0xCD,0xCD,0xDC,0xDC,0xCB,0xBB,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xED,0xAA,0x99, + 0xAA,0xAA,0xAA,0xAA,0xA9,0xAB,0x87,0x65,0x54,0x54,0x54,0x54,0x45,0x45,0x45,0x44, + 0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x44,0x44,0x44,0x45,0x56, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x77,0x67,0x77, + 0x67,0x77,0x77,0x76,0x66,0x66,0x66,0x67,0x77,0x67,0x67,0x66,0x66,0x66,0x76,0x76, + 0x66,0x67,0x77,0x67,0x77,0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76, + 0x77,0x77,0x67,0x77,0x67,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45, + 0x44,0x44,0x44,0x45,0x44,0x56,0x79,0xAA,0xBB,0xBB,0xAA,0xAA,0xBE,0xB8,0x99,0x9A, + 0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xDD,0xCB,0xBB,0xBA,0xBB,0xCE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDC,0xCB,0xCB,0xCD,0xDD,0xED,0xDD,0xDD,0xDB, + 0xCC,0xCC,0xCC,0xCC,0xCB,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC,0xEC,0xAA,0x9A, + 0xA9,0xAA,0xAA,0xAA,0xAA,0xA9,0x76,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x55,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x76,0x77,0x67, + 0x77,0x67,0x67,0x66,0x66,0x56,0x56,0x66,0x77,0x76,0x76,0x66,0x66,0x67,0x77,0x66, + 0x66,0x66,0x77,0x77,0x67,0x67,0x67,0x77,0x77,0x77,0x76,0x76,0x76,0x77,0x67,0x67, + 0x76,0x77,0x77,0x67,0x77,0x67,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x67,0x55,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x45,0x44,0x54,0x44,0x54,0x55,0x7A,0xAA,0xAA,0xAA,0xAA,0x9A,0xAE,0xD8,0x9A,0xAA, + 0x9A,0x9A,0xAA,0xAA,0xAB,0xAA,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xED,0xDB,0xBA,0xBA,0xBB,0xBC,0xEE,0xEF,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xEE,0xED,0xDD,0xDD,0xDC,0xBC,0xCD,0xDD,0xDE,0xDD,0xDD,0xCD, + 0xCB,0xDB,0xDC,0xCC,0xBD,0xBD,0xCD,0xCD,0xCC,0xCB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xBB,0xA9,0x9A, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xA8,0x65,0x55,0x45,0x44,0x44,0x54,0x54,0x45,0x44,0x54, + 0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x54,0x54,0x44,0x45,0x57,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x77,0x76, + 0x76,0x77,0x77,0x76,0x66,0x56,0x56,0x66,0x67,0x67,0x67,0x77,0x67,0x76,0x76,0x77, + 0x66,0x66,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x76, + 0x77,0x76,0x76,0x77,0x67,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x67,0x74,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x54,0x44,0x56,0x7A,0xAA,0xA9,0xA9,0xA9,0xA9,0x9A,0xB9,0xAA,0xAA, + 0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xBB,0xCD,0xDD,0xEE,0xED,0xDC,0xBB,0xBB,0xBA,0xBB,0xDE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFF,0xEE,0xEE,0xDD,0xDD,0xDC,0xCB,0xCC,0xCD,0xDD,0xED,0xDD,0xDD,0xCC, + 0xCD,0xBC,0xCC,0xDB,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBA,0xBA,0xBA,0xA9,0x9A,0x9A,0xAA, + 0xAA,0xAB,0xAA,0xAA,0xAA,0x87,0x65,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x55,0x56,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x76,0x66, + 0x66,0x76,0x76,0x76,0x66,0x65,0x65,0x66,0x66,0x66,0x66,0x67,0x76,0x77,0x77,0x67, + 0x66,0x66,0x67,0x76,0x76,0x66,0x66,0x66,0x66,0x66,0x67,0x77,0x67,0x67,0x67,0x77, + 0x76,0x77,0x77,0x76,0x77,0x67,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x66,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x45,0x45,0x45,0x45,0x7A,0xAA,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xDE,0xED,0xCB,0xBB,0xAB,0xAB,0xBB,0xBC,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDD,0xDC,0xDC,0xBB,0xDD,0xDE,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xBD,0xBC,0xCC,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB, + 0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0x99,0xAA,0xAA, + 0xBA,0xAA,0xBA,0xAA,0xA9,0x76,0x55,0x45,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x54, + 0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x67,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x77,0x66,0x66, + 0x66,0x67,0x77,0x77,0x66,0x66,0x56,0x66,0x66,0x56,0x66,0x67,0x67,0x77,0x67,0x77, + 0x77,0x66,0x77,0x77,0x66,0x66,0x67,0x67,0x66,0x66,0x67,0x67,0x77,0x77,0x77,0x76, + 0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x67,0x64,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x45,0x44,0x44,0x44,0x55,0x69,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAA,0xBA,0xAB,0xAA,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xAB,0xBB,0xCC,0xCC,0xCB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xDE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xDD,0xDB,0xCB,0xCD,0xCD,0xDD,0xED,0xDD,0xDC,0xDB, + 0xCD,0xBC,0xCD,0xBD,0xCD,0xCD,0xBC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xBB,0xBB, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0x99,0x9A,0xAA,0xBA, + 0xAB,0xBB,0xAA,0xAA,0xA8,0x75,0x54,0x54,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x44, + 0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x57,0x77,0x77,0x78, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66, + 0x66,0x66,0x67,0x67,0x76,0x66,0x56,0x67,0x76,0x76,0x66,0x66,0x77,0x67,0x77,0x67, + 0x66,0x66,0x67,0x77,0x65,0x66,0x76,0x66,0x76,0x66,0x66,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x76,0x76,0x76,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x45,0x45,0x69,0xAA,0x99,0x99,0x89,0x99,0x99,0x9A,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xBB,0xCD,0xEE, + 0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xEB,0xCD,0xDD,0xCD,0xCC,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xBD, + 0xCC,0xCC,0xCC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xCB,0xBB,0xAA,0xAA,0xAA,0xAB, + 0xAA,0xAB,0xAB,0xAA,0x97,0x65,0x55,0x45,0x44,0x54,0x44,0x54,0x44,0x44,0x45,0x44, + 0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x56,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x66,0x66,0x76, + 0x76,0x66,0x66,0x66,0x66,0x66,0x67,0x67,0x67,0x76,0x76,0x66,0x66,0x77,0x67,0x77, + 0x76,0x66,0x66,0x76,0x76,0x66,0x66,0x66,0x66,0x66,0x56,0x76,0x76,0x77,0x76,0x77, + 0x76,0x76,0x76,0x77,0x76,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x45,0x44,0x44,0x44,0x55,0x69,0xA9,0x99,0x98,0x98,0x99,0x99,0x9A,0xBA,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0x9A,0xAA,0xBA,0xBB, + 0xBB,0xBA,0xAB,0xAB,0xAA,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xDE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xCA,0xCD,0xDC,0xCC,0xCB,0xCD,0xCD,0xDD,0xDD,0xDD,0xCC,0xCC, + 0xBC,0xBC,0xDC,0xDC,0xDC,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCB,0xBB,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0x87,0x55,0x45,0x44,0x54,0x44,0x54,0x44,0x54,0x54,0x44,0x44, + 0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x55,0x67,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x77, + 0x77,0x67,0x66,0x66,0x66,0x66,0x76,0x66,0x76,0x66,0x66,0x65,0x66,0x76,0x77,0x67, + 0x77,0x66,0x66,0x67,0x66,0x66,0x65,0x66,0x56,0x76,0x66,0x77,0x77,0x77,0x77,0x76, + 0x77,0x77,0x77,0x67,0x77,0x76,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x54,0x55,0x69,0xAA,0x99,0x89,0x99,0x99,0x98,0x9B,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xBB, + 0xBB,0xBB,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD, + 0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xAB,0xCD,0xDD,0xDC,0xCC,0xBC,0xCD,0xCD,0xDD,0xDC,0xDD,0xCB, + 0xCB,0xCC,0xCC,0xDC,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBB,0xBB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDC,0xCB,0xCD,0xAA,0xAA,0xAA, + 0xAB,0xAA,0xAA,0xB9,0x76,0x55,0x54,0x45,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x54, + 0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x57,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x66,0x67, + 0x67,0x77,0x76,0x66,0x66,0x67,0x66,0x66,0x77,0x65,0x66,0x66,0x56,0x77,0x76,0x77, + 0x67,0x66,0x66,0x67,0x66,0x66,0x56,0x66,0x66,0x66,0x66,0x76,0x77,0x67,0x77,0x77, + 0x76,0x77,0x67,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x78,0x77,0x77,0x76,0x77,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x69,0xAA,0x99,0x98,0x89,0x99,0x99,0x9B,0xBA,0x9A, + 0x9A,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xA9,0xA9,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBC, + 0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0x9B,0xDD,0xCD,0xCC,0xCC,0xCC,0xCC,0xDC,0xDC,0xDD,0xCD,0xBC, + 0xBB,0xBC,0xCD,0xCD,0xDC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC,0xCC,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xA8,0x65,0x54,0x54,0x54,0x44,0x54,0x54,0x44,0x54,0x45,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x46,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x67,0x66,0x76,0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66, + 0x77,0x76,0x76,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x66,0x76,0x67,0x66,0x66,0x67, + 0x77,0x76,0x66,0x76,0x66,0x67,0x66,0x56,0x66,0x55,0x66,0x77,0x77,0x77,0x77,0x67, + 0x77,0x76,0x77,0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x75,0x44,0x44,0x44,0x54,0x44,0x44,0x54, + 0x45,0x44,0x44,0x54,0x54,0x55,0x69,0xBA,0xA9,0x99,0x88,0x99,0x99,0x9A,0xAA,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0xAA, + 0xBB,0xBB,0xBA,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCC,0xCD,0xDD,0xDB,0xBB,0xBB,0xBC, + 0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xEB,0x9B,0xDD,0xDC,0xDC,0xBC,0xCB,0xDB,0xDB,0xDC,0xDC,0xDC,0xDC, + 0xCB,0xBC,0xBC,0xCC,0xCC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0x97,0x65,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x55,0x77,0x77,0x77,0x77,0x87,0x78,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x77,0x77,0x76,0x66,0x66,0x65,0x66, + 0x67,0x77,0x77,0x76,0x66,0x67,0x66,0x66,0x66,0x56,0x67,0x66,0x66,0x66,0x66,0x67, + 0x67,0x76,0x66,0x66,0x66,0x66,0x66,0x65,0x66,0x66,0x66,0x67,0x67,0x77,0x67,0x77, + 0x67,0x77,0x77,0x77,0x67,0x77,0x67,0x67,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x45,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x54,0x44,0x44,0x55,0x69,0xBA,0xAA,0x99,0x99,0x99,0x99,0x9A,0xBA,0xA9, + 0xA9,0xAA,0xAA,0xAB,0xAA,0xA9,0xA9,0x9A,0x9A,0xAA,0xA9,0xA9,0xA9,0x99,0x9A,0x9A, + 0xAB,0xBB,0xBB,0xAA,0xBA,0xBA,0xBB,0xBB,0xCD,0xCD,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB, + 0xBD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xD9,0x9D,0xDD,0xDD,0xBC,0xDB,0xCD,0xBD,0xBD,0xBD,0xCD,0xDD,0xCD, + 0xBC,0xBC,0xBC,0xBC,0xCC,0xCB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCB,0xBC,0xBA,0xAA,0xAA,0xBB, + 0xAA,0xAA,0xBA,0x76,0x55,0x45,0x45,0x44,0x54,0x45,0x44,0x54,0x54,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x54,0x54,0x44,0x44,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x67,0x76,0x66,0x66,0x77,0x66,0x66, + 0x66,0x77,0x76,0x66,0x66,0x76,0x66,0x66,0x66,0x56,0x66,0x76,0x66,0x67,0x66,0x66, + 0x77,0x76,0x66,0x67,0x66,0x66,0x66,0x65,0x67,0x65,0x66,0x77,0x77,0x67,0x77,0x77, + 0x77,0x67,0x67,0x67,0x76,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x68,0x74,0x44,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x45,0x45,0x45,0x69,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x9A,0xBA,0x99, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0x9A,0x9A,0x99,0xA9,0xA9,0xA9, + 0xAB,0xBB,0xAA,0xAB,0xAB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB, + 0xBC,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEE,0xC8,0xAD,0xDD,0xDC,0xDC,0xBC,0xCB,0xDB,0xDB,0xDC,0xCC,0xDB,0xDC, + 0xDC,0xCB,0xBB,0xCB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBA,0xAB,0xAA,0xA9,0xAB,0xDB, + 0xBA,0xAA,0xB8,0x76,0x54,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x46,0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x66,0x76,0x77,0x66,0x67,0x66,0x66,0x67,0x67,0x66,0x66, + 0x66,0x67,0x77,0x76,0x66,0x67,0x65,0x65,0x55,0x56,0x67,0x76,0x56,0x66,0x76,0x66, + 0x66,0x77,0x66,0x66,0x66,0x66,0x67,0x65,0x56,0x55,0x66,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x67,0x77,0x77,0x76,0x77,0x76,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x76,0x87,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x44,0x44,0x54,0x44,0x55,0x69,0xAA,0xAA,0xAA,0xA9,0x99,0xA9,0x99,0xAA,0x9A, + 0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0x9A,0x99,0xAA,0xAA,0xAA,0x99,0x99,0x99,0xAA,0x9A, + 0xAA,0xBB,0xAA,0xAA,0xBA,0xAB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDC,0xBB, + 0xBC,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xA8,0xAD,0xDD,0xCD,0xBC,0xDB,0xCD,0xBD,0xCD,0xBD,0xBD,0xCD,0xDD, + 0xCD,0xBC,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xDC,0xBA,0x9A,0xAA,0xAA,0xAA,0xAB, + 0xBA,0xBB,0xA7,0x65,0x45,0x44,0x45,0x44,0x45,0x45,0x44,0x44,0x44,0x54,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x45,0x45,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x77,0x76,0x66,0x66,0x66,0x66,0x77,0x77,0x76,0x66, + 0x66,0x67,0x77,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x67,0x66,0x66,0x67,0x76,0x66, + 0x67,0x77,0x66,0x66,0x67,0x65,0x66,0x56,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x67, + 0x77,0x76,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x68,0x74,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x54,0x55,0x69,0xBA,0xAA,0xAA,0xAA,0x9A,0xAB,0xAA,0x99,0x99, + 0xA9,0xAA,0x9A,0xAA,0xAA,0xAA,0x99,0x9A,0xAA,0xAA,0x9A,0xA9,0xA9,0xA9,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xCD,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xED,0x98,0xBC,0xDD,0xDB,0xDC,0xBC,0xCC,0xCC,0xCC,0xCD,0xCD,0xBD,0xCC, + 0xDC,0xCC,0xBB,0xBB,0xBC,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xBA,0xA9,0xAA,0x9A,0xAA,0xAA, + 0xAA,0xAA,0x87,0x65,0x54,0x44,0x54,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x54, + 0x44,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x66,0x67,0x76,0x66,0x67,0x66,0x66,0x77,0x77,0x76,0x76, + 0x66,0x76,0x77,0x77,0x66,0x77,0x77,0x66,0x66,0x77,0x77,0x66,0x66,0x67,0x76,0x66, + 0x56,0x66,0x66,0x56,0x67,0x67,0x76,0x77,0x66,0x67,0x77,0x77,0x77,0x76,0x77,0x77, + 0x76,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x77,0x76,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x67,0x86,0x44,0x54,0x45,0x44,0x54, + 0x44,0x45,0x44,0x45,0x44,0x55,0x69,0xBA,0xAA,0xAA,0xBA,0xAB,0xAB,0xAA,0xA9,0x99, + 0x9A,0x9A,0xA9,0xA9,0xAA,0xAA,0x9A,0x99,0x9A,0x9A,0xAA,0x9A,0x9A,0x9A,0x9A,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xBC,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDC, + 0xCB,0xCB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xEC,0x88,0xCD,0xDD,0xCD,0xBC,0xDB,0xDD,0xDD,0xCD,0xCC,0xCC,0xDB,0xDB, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xAA,0xA9,0xA9,0xAA,0xAA, + 0xAA,0xA9,0x76,0x54,0x45,0x45,0x45,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x45,0x45,0x45,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x77,0x66,0x66,0x77,0x66,0x56,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x66,0x66,0x67,0x76,0x77,0x67,0x67,0x77,0x66,0x56,0x67,0x66,0x56, + 0x55,0x66,0x65,0x56,0x67,0x77,0x67,0x76,0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x76,0x78,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x45,0x55,0x7A,0xBA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xAA,0xAA, + 0x99,0x9A,0x9A,0xAA,0xAA,0xA9,0x99,0x9A,0x9A,0xA9,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAA,0xAA,0xAB,0xBB,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDB, + 0xBB,0xBB,0xCC,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xEA,0x88,0xDD,0xDD,0xDC,0xDC,0xCB,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xA8,0x76,0x55,0x54,0x54,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x67,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x66,0x77,0x66,0x66,0x66,0x66,0x66,0x66,0x77,0x77,0x77, + 0x77,0x67,0x77,0x76,0x66,0x66,0x77,0x77,0x77,0x77,0x66,0x56,0x56,0x77,0x65,0x65, + 0x55,0x65,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x76,0x77,0x67,0x76,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x67,0x85,0x44,0x44,0x54,0x44, + 0x44,0x54,0x44,0x44,0x54,0x46,0x79,0xBA,0x9A,0xAA,0xBB,0xBA,0xBA,0xBB,0xBB,0xAA, + 0xA9,0xA9,0xA9,0x9A,0xAA,0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xA9,0xAA,0xA9,0xAA,0x9A, + 0x9A,0xAA,0xAA,0xAA,0xAB,0xBC,0xBB,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xED,0xDD, + 0xDC,0xBB,0xBC,0xCD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xD9,0x89,0xDD,0xDD,0xBD,0xBD,0xCD,0xCD,0xDE,0xDD,0xDB,0xCC,0xCC,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA, + 0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xA8,0x65,0x54,0x54,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x54, + 0x44,0x44,0x54,0x55,0x57,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x76,0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x77,0x77, + 0x76,0x77,0x77,0x76,0x66,0x66,0x66,0x76,0x77,0x67,0x65,0x65,0x56,0x65,0x65,0x55, + 0x65,0x55,0x56,0x66,0x76,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x67,0x77,0x76,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x88,0x55,0x44,0x44,0x44, + 0x54,0x44,0x54,0x45,0x45,0x56,0x79,0xAA,0x9A,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA, + 0xA9,0x99,0xA9,0xAA,0x9A,0xAA,0xA9,0xA9,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xA9,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xAB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED, + 0xCB,0xBB,0xBB,0xCC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xC9,0x7A,0xDD,0xDD,0xDC,0xCC,0xCB,0xDD,0xDD,0xED,0xDD,0xDB,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0xBA,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0x97,0x65,0x54,0x45,0x44,0x54,0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x45,0x77,0x77,0x77,0x77,0x87,0x87,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x66,0x76,0x76,0x66,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x66,0x65,0x66,0x66,0x76,0x56,0x55,0x65,0x55,0x55,0x66, + 0x66,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x68,0x74,0x54,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x55,0x8A,0xAA,0x99,0x9A,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xA9,0x9A,0x9A,0xAA,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99, + 0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDB,0xBB,0xBC,0xCD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xA8,0x7A,0xDD,0xDD,0xCD,0xBC,0xBD,0xDD,0xED,0xDD,0xDC,0xCC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA, + 0xAB,0xAA,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xDC,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA, + 0xAA,0x86,0x55,0x45,0x44,0x54,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x54,0x45, + 0x44,0x44,0x54,0x67,0x77,0x87,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x66,0x56,0x66,0x77,0x77,0x77,0x66,0x66,0x67,0x77, + 0x77,0x77,0x77,0x76,0x67,0x66,0x66,0x66,0x65,0x65,0x55,0x66,0x55,0x55,0x55,0x67, + 0x66,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x67,0x77,0x77,0x77,0x67,0x76,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x87,0x44,0x45,0x44, + 0x44,0x54,0x45,0x45,0x45,0x56,0x7A,0xA9,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAA,0x9A,0x9A,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xA9,0x99, + 0xA9,0xAA,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xDD,0xCB,0xBB,0xBB,0xCD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDE,0xA8,0x7B,0xCD,0xDD,0xDC,0xDB,0xDB,0xDD,0xDE,0xDD,0xDD,0xCC,0xCB,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBA,0xBB,0xDC,0xBB,0xAA,0xAB,0xCB,0xA9,0xAA, + 0xB9,0x76,0x55,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44, + 0x44,0x45,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x56,0x66,0x67,0x76,0x66,0x77,0x76,0x66,0x66,0x77, + 0x77,0x77,0x67,0x76,0x66,0x66,0x76,0x66,0x65,0x66,0x65,0x66,0x66,0x56,0x67,0x67, + 0x67,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x77,0x77,0x77,0x77,0x67,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x78,0x74,0x44,0x44, + 0x44,0x44,0x44,0x44,0x45,0x56,0x8A,0xAA,0x99,0x99,0xA9,0xAB,0xBA,0xAB,0xBB,0xBB, + 0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xA9, + 0xAA,0xAB,0xBB,0xCB,0xBB,0xBC,0xCD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xCB,0xBB,0xBC,0xCD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xED,0x98,0x7B,0xDD,0xDD,0xCD,0xCD,0xBD,0xDD,0xDD,0xDD,0xCD,0xBC,0xBC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBC,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xAB,0xDD,0xBA,0xAA,0xAD,0xDB,0xAA,0xAA, + 0xA8,0x75,0x54,0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x54,0x44,0x45,0x44,0x44, + 0x54,0x55,0x77,0x78,0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x67,0x76,0x66,0x56,0x67,0x66,0x65,0x66,0x76, + 0x67,0x66,0x66,0x66,0x66,0x67,0x66,0x77,0x76,0x76,0x66,0x67,0x66,0x56,0x77,0x77, + 0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x78,0x77,0x77,0x77,0x67,0x85,0x54,0x44, + 0x45,0x44,0x45,0x44,0x54,0x56,0x8B,0xA9,0x99,0x9A,0x9A,0xAA,0x9A,0xAB,0xBB,0xBA, + 0xBB,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0x9A,0xAA,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBC,0xCC,0xCC,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xED, + 0xED,0xDD,0xCC,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xED,0x98,0x8C,0xDD,0xDD,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB, + 0xCC,0xCD,0xCD,0xCB,0xBB,0xBB,0xCB,0xCB,0xCB,0xBB,0xBB,0xBB,0xAA,0xAB,0xAA,0xAA, + 0xAA,0xA9,0xAA,0xAB,0xAB,0xBB,0xBD,0xDB,0xAB,0xBC,0xBA,0xA9,0x99,0x99,0x99,0xAB, + 0x97,0x65,0x45,0x45,0x45,0x45,0x44,0x44,0x45,0x45,0x44,0x44,0x45,0x44,0x45,0x44, + 0x44,0x57,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x76,0x66,0x65,0x66,0x77,0x66,0x66,0x66,0x67,0x76,0x66,0x66,0x66, + 0x67,0x76,0x66,0x76,0x56,0x55,0x66,0x67,0x77,0x76,0x56,0x56,0x76,0x77,0x67,0x76, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x78,0x77,0x76,0x76,0x44,0x45, + 0x44,0x44,0x44,0x54,0x45,0x56,0x8B,0xA9,0x99,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xBB, + 0xBA,0xBB,0xAA,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA, + 0xBA,0xBB,0xBC,0xBC,0xCD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xED,0xED,0xDC,0xCB,0xBB,0xBC,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xEB,0x87,0x8C,0xDD,0xDD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDC,0xCB,0xCB,0xBC,0xBC, + 0xCD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB,0xBA,0xAA,0xAA,0xAB,0xAA, + 0xA9,0xAA,0xAA,0xAA,0xBA,0xBB,0xCD,0xED,0xCB,0xAA,0xAA,0x99,0x98,0x98,0x99,0xAA, + 0x86,0x65,0x45,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x45, + 0x46,0x77,0x78,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x66,0x66,0x66,0x66,0x66,0x67,0x66,0x66,0x66,0x77,0x66,0x66,0x66,0x65, + 0x66,0x77,0x66,0x65,0x65,0x65,0x56,0x66,0x76,0x65,0x65,0x56,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x65,0x44,0x44, + 0x44,0x45,0x44,0x45,0x45,0x56,0x8B,0xA9,0x99,0x9A,0x9A,0xAA,0x9A,0x9A,0xAA,0xAB, + 0xBB,0xBA,0xBA,0xAA,0x9A,0x9A,0xAA,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA, + 0xAB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xEA,0x88,0x8C,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xCC,0xBB,0xBB,0xBB, + 0xDD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBC,0xBC,0xCC,0xBB,0xBA,0xAA,0xAA,0xBA,0xAA, + 0xAA,0x9A,0x9A,0xAA,0xBA,0xBB,0xCC,0xDE,0xDD,0xED,0xAA,0x99,0x89,0x89,0x99,0xAA, + 0x87,0x54,0x54,0x44,0x54,0x54,0x44,0x44,0x45,0x45,0x44,0x44,0x44,0x54,0x44,0x55, + 0x77,0x77,0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x77,0x67,0x66,0x66,0x67,0x76,0x66,0x76,0x66, + 0x66,0x76,0x76,0x65,0x55,0x55,0x65,0x56,0x76,0x56,0x55,0x66,0x76,0x77,0x77,0x77, + 0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x65,0x45,0x44, + 0x54,0x44,0x45,0x44,0x45,0x57,0x8A,0x99,0x99,0x99,0x9A,0xA9,0xA9,0xA9,0xAA,0xAA, + 0xAB,0xAB,0xBB,0xAA,0xAA,0x9A,0xA9,0xAA,0xAA,0xAB,0xBB,0xBC,0xBC,0xBC,0xBB,0xBA, + 0xBA,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDE, + 0xDE,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xEA,0x87,0x8D,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBB,0xDD, + 0xDD,0xDD,0xCC,0xDB,0xBB,0xBB,0xCB,0xCB,0xCD,0xBC,0xCB,0xBB,0xAA,0xAA,0xAB,0xAA, + 0xA9,0xA9,0xAA,0xAA,0xAB,0xBB,0xDD,0xCD,0xDD,0xDE,0xCB,0x99,0x89,0x89,0x9A,0xB9, + 0x76,0x55,0x45,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x45,0x44,0x54,0x44,0x54,0x57, + 0x77,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x67,0x66,0x66,0x67,0x67,0x66,0x67,0x76,0x66,0x76,0x66,0x77,0x66,0x66,0x67,0x66, + 0x66,0x77,0x77,0x66,0x56,0x55,0x55,0x65,0x65,0x55,0x66,0x77,0x77,0x77,0x77,0x66, + 0x77,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x65,0x44,0x44, + 0x44,0x44,0x44,0x45,0x55,0x67,0xAB,0x99,0x99,0x99,0xAA,0x9A,0x9A,0x9A,0x9A,0xAA, + 0xAB,0xBB,0xAB,0xAA,0xA9,0xA9,0x9A,0xA9,0xAA,0xAB,0xBB,0xBC,0xCC,0xCC,0xBB,0xBA, + 0xAA,0xAB,0xBB,0xCD,0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xED,0xDD,0xDD,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xD9,0x87,0x8D,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBD, + 0xDD,0xDD,0xDD,0xCC,0xCC,0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xBA,0xA9,0xAA,0xBB,0xBA, + 0xAA,0xAA,0x9A,0xAA,0xBA,0xBB,0xCC,0xDD,0xED,0xDE,0xCA,0x99,0x98,0x99,0x9A,0xA8, + 0x75,0x55,0x45,0x44,0x54,0x54,0x44,0x44,0x45,0x45,0x44,0x44,0x44,0x44,0x45,0x77, + 0x78,0x77,0x87,0x87,0x87,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x66,0x66,0x66,0x67,0x77,0x66,0x66,0x77,0x66,0x66,0x66,0x67,0x66,0x67,0x67,0x66, + 0x66,0x77,0x66,0x66,0x55,0x55,0x56,0x66,0x66,0x66,0x67,0x77,0x77,0x77,0x76,0x66, + 0x66,0x55,0x56,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x54,0x44, + 0x44,0x54,0x45,0x44,0x45,0x67,0xAA,0x98,0x89,0x9A,0xA9,0xA9,0xA9,0xAA,0x9A,0x9A, + 0xAB,0xAB,0xBA,0xBA,0xAA,0x9A,0xA9,0xA9,0xAA,0xAB,0xAB,0xBB,0xCB,0xCB,0xBB,0xBA, + 0xBA,0xBA,0xBB,0xCC,0xDD,0xDD,0xDC,0xDC,0xBD,0xBD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xD9,0x87,0x8D,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xBB,0xBB,0xBB,0xBC,0xDD, + 0xDE,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xCB,0xCC,0xDB,0xDB,0xCB,0xAA,0xAA,0xBC,0xBB, + 0xAA,0x99,0xAA,0x9A,0xAB,0xAB,0xBB,0xDC,0xCD,0xBC,0xDA,0x99,0x89,0x89,0xAB,0xA7, + 0x75,0x55,0x45,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x55,0x67,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x65,0x65,0x66,0x67,0x76,0x66,0x66,0x77,0x76,0x66,0x66,0x77,0x76,0x77,0x76,0x66, + 0x66,0x76,0x66,0x66,0x56,0x55,0x66,0x67,0x66,0x66,0x77,0x67,0x66,0x67,0x66,0x55, + 0x55,0x55,0x55,0x65,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x67,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x55,0x44,0x54, + 0x44,0x44,0x44,0x54,0x55,0x67,0xAA,0x99,0x99,0x99,0x9A,0x9A,0x9A,0x99,0x99,0x9A, + 0xAA,0xAB,0xAB,0xAB,0xAA,0xA9,0x9A,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xAA,0xAB,0xBB,0xCD,0xDD,0xDC,0xDC,0xCC,0xDB,0xDC,0xDB,0xDC,0xDD,0xDC,0xDD,0xDD, + 0xDD,0xED,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xDE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xC9,0x77,0x9D,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xBB,0xBB,0xBC,0xBD, + 0xDD,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xCC,0xCB,0xCB,0xCB,0xBB,0xAB,0xBB,0xDC, + 0xBA,0xAA,0x99,0xAA,0xAA,0xBA,0xBA,0xBC,0xBC,0xB9,0xAB,0x99,0x88,0x89,0x9A,0x87, + 0x66,0x55,0x55,0x45,0x45,0x44,0x44,0x45,0x45,0x45,0x44,0x44,0x45,0x57,0x77,0x78, + 0x78,0x77,0x77,0x87,0x78,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x78, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x66,0x66,0x66,0x67,0x77,0x76,0x66,0x77,0x77,0x66,0x67,0x77,0x77,0x77,0x77,0x65, + 0x66,0x66,0x65,0x65,0x55,0x66,0x66,0x67,0x77,0x77,0x77,0x77,0x66,0x66,0x55,0x55, + 0x55,0x55,0x55,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x76,0x57,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x54,0x44,0x45, + 0x44,0x44,0x54,0x44,0x55,0x68,0xAA,0x99,0x99,0x99,0x99,0x9A,0x9A,0x9A,0x99,0xA9, + 0x9A,0xAA,0xBB,0xBB,0xBA,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xBA,0xBB,0xBC,0xCD,0xCC,0xCB,0xDC,0xCC,0xCC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD, + 0xDE,0xDD,0xED,0xDD,0xDD,0xCC,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xB8,0x87,0xAE,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xCC,0xBC,0xBB,0xBB,0xCD, + 0xDD,0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xCC,0xCD,0xBD,0xBC,0xBB,0xBC,0xDD,0xDC, + 0xCB,0xAA,0x9A,0xAA,0xAA,0xBB,0xAA,0xAA,0xAB,0xCB,0xA9,0xA9,0x98,0x99,0xAA,0x86, + 0x66,0x55,0x45,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x45,0x77,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66, + 0x67,0x66,0x66,0x67,0x77,0x76,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65, + 0x65,0x55,0x56,0x55,0x56,0x67,0x67,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x44, + 0x45,0x44,0x44,0x54,0x56,0x78,0xBA,0xA9,0x98,0x99,0x99,0x9A,0xA9,0x99,0x99,0x9A, + 0x9A,0xAA,0xAB,0xAB,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xBB,0xBB,0xBC,0xDB,0xDB,0xDB,0xDC,0xDB,0xDB,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDE,0xDD,0xDD,0xDD,0xDB,0xCB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xB9,0x77,0xCD,0xEE,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xCC,0xBB,0xBC,0xBC, + 0xCD,0xDD,0xDC,0xDC,0xCB,0xCB,0xBB,0xBB,0xCC,0xCC,0xCC,0xCC,0xBC,0xDC,0xDD,0xDD, + 0xCB,0xAA,0xA9,0x9A,0xAA,0xAA,0xAB,0xAA,0x9B,0xEC,0xA9,0x9A,0x99,0x9A,0xAA,0x86, + 0x55,0x55,0x54,0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x57,0x78,0x77,0x87, + 0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67, + 0x77,0x66,0x66,0x77,0x77,0x76,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x65, + 0x56,0x56,0x66,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x55, + 0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x65,0x56,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x45,0x44, + 0x44,0x44,0x54,0x44,0x56,0x78,0xBC,0x99,0x99,0x98,0x99,0xA9,0xAA,0xA9,0xA9,0xA9, + 0x9A,0x9A,0xAA,0xBB,0xAB,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xBA,0xBB,0xCC,0xBD,0xCD,0xCD,0xBD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDC,0xDD, + 0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xCB,0xBB,0xBB,0xCC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xB8,0x77,0xDE,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xBC,0xCB,0xCB,0xCB,0xCD, + 0xCD,0xCD,0xBC,0xDB,0xCB,0xBB,0xBB,0xCC,0xCC,0xBC,0xDB,0xDC,0xDC,0xDD,0xDD,0xDD, + 0xDB,0xBA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xED,0xA9,0x9A,0x99,0x9A,0xB9,0x76, + 0x54,0x54,0x45,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x45,0x46,0x78,0x77,0x78,0x77, + 0x87,0x78,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77, + 0x77,0x76,0x66,0x77,0x77,0x76,0x66,0x56,0x77,0x77,0x77,0x77,0x77,0x66,0x56,0x56, + 0x65,0x66,0x67,0x67,0x77,0x76,0x77,0x77,0x67,0x67,0x65,0x65,0x55,0x55,0x55,0x55, + 0x55,0x45,0x54,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x67,0x67,0x76,0x65,0x57,0x66,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x54,0x44,0x44, + 0x54,0x45,0x44,0x54,0x56,0x79,0xA9,0x99,0x99,0x98,0x99,0x9A,0xAA,0x9A,0x99,0x99, + 0xA9,0xAA,0xAB,0xAB,0xBA,0xAA,0x99,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xAA, + 0xBA,0xBA,0xBB,0xBB,0xBC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCC,0xDC,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x78,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDC,0xDC,0xCC,0xBB,0xCB,0xCB, + 0xDB,0xDB,0xDC,0xBC,0xBC,0xBB,0xBC,0xBC,0xCB,0xDC,0xCC,0xBD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xCB,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xA9,0x98,0x99,0xAB,0xA8,0x75, + 0x55,0x54,0x54,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x55,0x67,0x77,0x78,0x77,0x78, + 0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67,0x77, + 0x77,0x77,0x66,0x77,0x77,0x76,0x66,0x65,0x67,0x66,0x76,0x77,0x66,0x65,0x65,0x66, + 0x65,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x55,0x55,0x66,0x65,0x55,0x55, + 0x55,0x55,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x66,0x77,0x76,0x55,0x55,0x76,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x44,0x44,0x54, + 0x44,0x44,0x45,0x44,0x56,0x8A,0xA9,0x99,0x98,0x99,0x99,0x99,0xA9,0xA9,0x99,0xA9, + 0xA9,0xAA,0xAA,0xBB,0xAB,0xAA,0xAA,0xA9,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xAA,0xBA, + 0xAA,0xAB,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xBD,0xCD,0xCD,0xDC, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xDE,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x78,0xEE,0xEE,0xDD,0xDC,0xDC,0xDD,0xCC,0xDB,0xCC,0xBC,0xCB,0xBC,0xDB, + 0xCC,0xCC,0xCC,0xCC,0xCB,0xCB,0xCB,0xCC,0xCD,0xBC,0xCD,0xCD,0xCD,0xDD,0xDD,0xCD, + 0xCD,0xCB,0xBA,0xA9,0x9A,0x9A,0x99,0x9A,0xA9,0xAB,0xA9,0x89,0x99,0xBC,0xB8,0x75, + 0x54,0x45,0x44,0x45,0x45,0x44,0x54,0x44,0x54,0x44,0x56,0x78,0x77,0x77,0x87,0x77, + 0x78,0x77,0x77,0x87,0x77,0x78,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x56,0x67,0x66,0x66,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x65,0x55,0x55,0x66,0x76,0x65,0x55,0x55, + 0x55,0x55,0x55,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x66,0x55,0x57,0x76,0x55,0x55,0x67,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x54,0x54,0x45,0x45, + 0x54,0x45,0x44,0x55,0x56,0x8A,0x99,0x99,0x99,0x98,0x99,0x99,0x99,0x9A,0x9A,0x99, + 0xAA,0xAA,0xBB,0xBA,0xBA,0xBA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAB,0xAA, + 0xBA,0xAB,0xAB,0xAB,0xCD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDC,0xDC,0xCD,0xBD,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x7A,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xBC,0xBC,0xBB,0xBD,0xCC,0xBD, + 0xBD,0xCC,0xCC,0xCB,0xCB,0xBC,0xBB,0xBB,0xCC,0xCC,0xCB,0xCC,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xCD,0xBA,0xAA,0xA9,0x99,0x99,0x99,0xA9,0x99,0x98,0x98,0x99,0xAC,0xA7,0x65, + 0x55,0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x78,0x77,0x77,0x87,0x78,0x78, + 0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x67,0x77,0x66,0x55,0x55, + 0x54,0x55,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x65,0x55,0x55,0x76,0x65,0x55,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x54,0x54,0x44,0x44,0x44,0x55, + 0x45,0x44,0x54,0x45,0x67,0x8A,0x99,0x89,0x99,0x99,0x99,0xA9,0x9A,0x99,0x99,0x9A, + 0xAA,0xAB,0xAB,0xAB,0xBA,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA, + 0xAB,0xAA,0xAB,0xBB,0xBC,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBD,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x7A,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xBC,0xDB,0xCB,0xCD,0xCC,0xCD,0xCC, + 0xCC,0xCB,0xCC,0xCD,0xBD,0xBB,0xCB,0xCC,0xBD,0xBC,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD, + 0xDC,0xDC,0xCB,0xBA,0xA9,0xA9,0x99,0x99,0x9A,0xA9,0x98,0x88,0x99,0xBC,0x87,0x65, + 0x45,0x45,0x44,0x45,0x44,0x54,0x54,0x54,0x55,0x67,0x77,0x78,0x78,0x77,0x77,0x77, + 0x77,0x77,0x78,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x67,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x66,0x66,0x67,0x76,0x66,0x77, + 0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x66,0x77,0x76,0x55,0x55, + 0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x55,0x55,0x57,0x65,0x56,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x44,0x45, + 0x44,0x45,0x45,0x55,0x67,0x9A,0x98,0x88,0x89,0x98,0x99,0x99,0x99,0x99,0xA9,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xAB,0xAA,0xBB,0xBC,0xDD,0xDD,0xDE,0xED,0xED,0xDD,0xDC,0xDB,0xDC,0xDC,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBC,0xDD,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xA8,0x7B,0xEF,0xEE,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xBC,0xBB,0xCD,0xDD,0xCD, + 0xCD,0xBD,0xCC,0xCC,0xCC,0xCC,0xCC,0xBC,0xCC,0xCC,0xCC,0xCC,0xDD,0xDC,0xDD,0xCD, + 0xCD,0xDC,0xDC,0xBA,0xAA,0x9A,0x98,0x99,0xA9,0xA9,0x98,0x98,0x9A,0xBB,0x87,0x55, + 0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x78,0x77,0x77,0x78,0x77,0x77, + 0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x66, + 0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x67, + 0x77,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x56,0x55,0x56,0x77,0x65,0x65,0x55, + 0x55,0x55,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x55,0x55,0x55,0x56,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x54,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x55,0x67,0x99,0x88,0x88,0x89,0x9A,0x9A,0x99,0x99,0x99,0x9A,0xAA, + 0xAB,0xAB,0xAB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAA,0xBA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xBB,0xDC,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xA8,0x7D,0xEE,0xEE,0xED,0xDD,0xCD,0xCC,0xCB,0xCB,0xDB,0xDD,0xDC,0xDD,0xDD, + 0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xCB,0xCC,0xCC,0xCD,0xBD,0xCD,0xCD,0xCD,0xBD,0xBD, + 0xDC,0xDC,0xDC,0xCB,0xBA,0xAA,0x99,0x89,0x9A,0x99,0x99,0x88,0x9A,0xB9,0x76,0x55, + 0x45,0x44,0x54,0x45,0x44,0x54,0x54,0x45,0x67,0x77,0x77,0x78,0x77,0x77,0x78,0x77, + 0x77,0x87,0x78,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x66, + 0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x56, + 0x77,0x77,0x77,0x76,0x65,0x65,0x55,0x55,0x56,0x66,0x65,0x55,0x56,0x56,0x66,0x65, + 0x55,0x54,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x56,0x66,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x44,0x44,0x54,0x54,0x44,0x45,0x44,0x54, + 0x45,0x44,0x54,0x56,0x68,0xB9,0x98,0x88,0x99,0x9B,0xAA,0xA9,0x99,0x99,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xBB,0xBC,0xCD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDC,0xDC,0xCC,0xDB, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x8D,0xEF,0xEE,0xED,0xDD,0xDC,0xDC,0xDB,0xDC,0xCC,0xCC,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDB,0xDC,0xDC,0xBD,0xCC,0xBD,0xCC,0xDB,0xDC,0xDC,0xDD,0xDC,0xDC, + 0xBD,0xCD,0xDB,0xDC,0xBA,0xBA,0xA9,0x99,0x99,0x99,0x99,0x99,0x9A,0xA8,0x76,0x55, + 0x45,0x45,0x44,0x54,0x54,0x44,0x44,0x57,0x78,0x77,0x78,0x77,0x87,0x78,0x77,0x77, + 0x87,0x77,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x66, + 0x56,0x67,0x76,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x76,0x65,0x66, + 0x77,0x77,0x77,0x76,0x66,0x55,0x55,0x56,0x67,0x77,0x66,0x55,0x55,0x67,0x77,0x66, + 0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x55,0x76,0x65,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x55,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44, + 0x44,0x45,0x45,0x56,0x79,0xA9,0x88,0x88,0x88,0x99,0xBB,0xAA,0xA9,0xAA,0xAA,0xBB, + 0xBA,0xBB,0xAB,0xBB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xAB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDC,0xDC,0xCC, + 0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xCD,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xA8,0x8E,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xCB,0xCC,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDB,0xCC,0xDC,0xDB,0xCC,0xDC,0xDD,0xCD,0xCC,0xCC, + 0xDC,0xDD,0xCD,0xDB,0xCC,0xBB,0xA9,0x99,0x99,0x99,0x99,0x99,0x9A,0xA8,0x66,0x54, + 0x54,0x44,0x45,0x44,0x44,0x54,0x46,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x78,0x77, + 0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x66, + 0x66,0x66,0x67,0x66,0x67,0x77,0x77,0x76,0x76,0x76,0x67,0x65,0x65,0x66,0x56,0x66, + 0x77,0x77,0x77,0x65,0x55,0x55,0x56,0x66,0x77,0x77,0x76,0x65,0x55,0x67,0x77,0x66, + 0x65,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x66, + 0x55,0x57,0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x67,0x77,0x75,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x44,0x44, + 0x54,0x54,0x55,0x57,0x79,0xAA,0x98,0x98,0x98,0x99,0x9A,0xBB,0xAB,0xAB,0xAB,0xAB, + 0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDC,0xCD,0xBC, + 0xCC,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDB,0xCB,0xBB,0xBB,0xBC,0xDE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xA8,0x8E,0xEE,0xFE,0xED,0xDD,0xDC,0xDB,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xCD, + 0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCD,0xCC, + 0xCC,0xCC,0xDD,0xCD,0xDC,0xDC,0xB9,0x99,0x99,0x98,0x99,0x99,0xAA,0x98,0x75,0x55, + 0x55,0x45,0x44,0x44,0x54,0x44,0x67,0x77,0x78,0x77,0x87,0x87,0x87,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,0x66,0x66,0x77,0x77,0x77,0x77,0x66, + 0x67,0x77,0x76,0x76,0x67,0x77,0x77,0x76,0x66,0x65,0x66,0x65,0x55,0x55,0x66,0x77, + 0x77,0x77,0x66,0x56,0x55,0x55,0x56,0x67,0x77,0x77,0x77,0x66,0x55,0x56,0x67,0x77, + 0x65,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67,0x77,0x65, + 0x55,0x56,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x55,0x44,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x56,0x89,0xBA,0x9A,0x98,0x88,0x99,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDB,0xDC, + 0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBC,0xCD,0xEE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x9E,0xEF,0xEE,0xEE,0xDD,0xCD,0xBD,0xCC,0xDC,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xBD,0xBC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xBC,0xCC, + 0xBC,0xDC,0xDC,0xDC,0xDC,0xDC,0xBA,0x99,0x99,0x99,0x98,0x99,0x9A,0x97,0x65,0x45, + 0x44,0x44,0x54,0x54,0x44,0x55,0x67,0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x77, + 0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x78,0x77,0x77,0x77,0x66,0x66,0x66,0x66,0x66,0x66,0x67,0x77,0x66,0x67, + 0x77,0x77,0x77,0x76,0x66,0x77,0x77,0x76,0x66,0x56,0x56,0x56,0x66,0x66,0x67,0x77, + 0x77,0x66,0x65,0x55,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x66,0x65,0x55,0x66,0x77, + 0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x66,0x76, + 0x55,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x64,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44, + 0x54,0x54,0x55,0x66,0x89,0x99,0x99,0xBA,0x99,0x99,0xBB,0xAB,0xBB,0xBB,0xAB,0xBB, + 0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC, + 0xCC,0xCC,0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xAB,0xBD,0xDE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0x9E,0xEE,0xEE,0xED,0xDD,0xDB,0xDC,0xCD,0xBD,0xCD,0xCD,0xCD,0xCD,0xCC, + 0xCC,0xCC,0xCB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xDC,0xDB,0xDB,0xDC,0xCB, + 0xCB,0xCB,0xDC,0xDD,0xCD,0xDC,0xDB,0xAA,0xA9,0x99,0x99,0x99,0xAA,0x87,0x65,0x54, + 0x45,0x45,0x44,0x44,0x54,0x46,0x77,0x77,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x87, + 0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x87,0x77,0x77,0x77,0x77,0x66,0x77,0x67,0x77,0x66,0x66,0x66,0x76,0x66,0x67, + 0x77,0x77,0x77,0x77,0x66,0x66,0x77,0x77,0x66,0x56,0x66,0x66,0x77,0x67,0x77,0x77, + 0x76,0x66,0x55,0x55,0x55,0x56,0x67,0x77,0x76,0x66,0x67,0x77,0x66,0x55,0x56,0x55, + 0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x55,0x55,0x55,0x77, + 0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x55,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44, + 0x44,0x44,0x55,0x67,0x9A,0x99,0x99,0xAA,0xA8,0x9A,0xAA,0xBB,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xAB,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0x9A, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC, + 0xDC,0xDC,0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xDE, + 0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0xAE,0xEE,0xFE,0xED,0xDD,0xCD,0xCD,0xBD,0xDD,0xDC,0xDB,0xDC,0xDB,0xDB, + 0xDB,0xCB,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xBC,0xDB,0xDC,0xCD,0xCD,0xBC,0xBC, + 0xBB,0xCC,0xCD,0xCD,0xDC,0xDD,0xCC,0xBA,0x99,0x9A,0x99,0x99,0x9A,0x86,0x65,0x45, + 0x44,0x44,0x45,0x44,0x44,0x55,0x77,0x78,0x78,0x77,0x87,0x77,0x77,0x78,0x77,0x77, + 0x77,0x78,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x66,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x66,0x67,0x76, + 0x66,0x77,0x66,0x67,0x76,0x66,0x77,0x77,0x76,0x66,0x67,0x67,0x77,0x77,0x77,0x77, + 0x66,0x55,0x55,0x55,0x55,0x55,0x66,0x77,0x76,0x56,0x67,0x77,0x76,0x65,0x55,0x55, + 0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x56,0x55,0x55,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x55,0x68,0xA9,0x98,0x89,0x8A,0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xAB,0xAB, + 0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xCC,0xCC,0xDC,0xDD,0xDD,0xDC,0xDB, + 0xCB,0xCC,0xCD,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBA,0xBB,0xCD, + 0xDE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0xAE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD, + 0xBD,0xBD,0xBD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDC,0xDC,0xCC,0xCC,0xDC,0xCB,0xDC,0xCC, + 0xBC,0xBB,0xCC,0xCD,0xCD,0xDC,0xDC,0xCA,0x99,0x9B,0xA9,0x9A,0xAA,0x87,0x55,0x54, + 0x54,0x54,0x54,0x44,0x54,0x56,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x77,0x78,0x77, + 0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x66,0x66,0x67,0x76, + 0x66,0x77,0x66,0x66,0x77,0x67,0x77,0x77,0x77,0x66,0x67,0x77,0x77,0x77,0x77,0x76, + 0x56,0x56,0x55,0x56,0x66,0x55,0x56,0x77,0x77,0x66,0x66,0x67,0x76,0x65,0x55,0x55, + 0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x57,0x65,0x55,0x56, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x55,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x45, + 0x44,0x45,0x56,0x78,0xB9,0x98,0x88,0x89,0x9A,0xBA,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBA,0xBA,0xBA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xA9, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAB,0xCC,0xCB,0xDC,0xDC,0xDC, + 0xDC,0xCB,0xCB,0xCD,0xBD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBC, + 0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDE,0xA8,0xAE,0xEF,0xEF,0xEE,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDB,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCC,0xDB,0xDC,0xCD,0xCD,0xBC,0xCB, + 0xBB,0xBB,0xCC,0xCD,0xCD,0xCC,0xDC,0xBB,0xA9,0x99,0xAA,0x9A,0xB9,0x76,0x55,0x45, + 0x44,0x44,0x44,0x54,0x44,0x55,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x77, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77,0x66, + 0x66,0x77,0x66,0x66,0x77,0x66,0x77,0x77,0x77,0x66,0x66,0x77,0x77,0x77,0x76,0x65, + 0x65,0x55,0x56,0x66,0x76,0x65,0x56,0x77,0x77,0x76,0x66,0x67,0x77,0x65,0x55,0x55, + 0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x56,0x76,0x56,0x67, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44, + 0x45,0x45,0x56,0x89,0x99,0x88,0x88,0x89,0x9A,0xAB,0xAB,0xBB,0xBB,0xBB,0xAB,0xAB, + 0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xCB,0xCC,0xCC, + 0xCC,0xCB,0xCC,0xBC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBA,0xBB, + 0xCD,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0x98,0xAE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD, + 0xCD,0xCC,0xDB,0xDC,0xCD,0xBD,0xCD,0xCD,0xCB,0xDC,0xCC,0xCB,0xDC,0xCC,0xCC,0xCB, + 0xCB,0xBC,0xBC,0xCC,0xCC,0xCC,0xCC,0xCB,0xA9,0xAB,0xDE,0xCB,0xB9,0x76,0x55,0x54, + 0x54,0x54,0x54,0x44,0x54,0x45,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x78,0x78,0x77, + 0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x77,0x76, + 0x66,0x66,0x65,0x67,0x76,0x56,0x77,0x77,0x77,0x66,0x67,0x77,0x77,0x76,0x66,0x65, + 0x55,0x56,0x56,0x67,0x77,0x66,0x55,0x56,0x77,0x77,0x66,0x67,0x75,0x55,0x55,0x66, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x65,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54, + 0x54,0x45,0x56,0x88,0x99,0x88,0x88,0x9A,0xAA,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBA,0xBB,0xAA,0xAA,0xAA, + 0xA9,0xAA,0xAA,0x9A,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAB,0xBB, + 0xBC,0xBB,0xBB,0xCB,0xCC,0xCC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB, + 0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xAE,0xEE,0xFE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC, + 0xDC,0xDB,0xCD,0xBC,0xCC,0xCD,0xBD,0xCD,0xCD,0xBD,0xBD,0xBD,0xBC,0xDB,0xDB,0xCB, + 0xBB,0xBC,0xBB,0xCB,0xCC,0xCB,0xCB,0xCC,0xBB,0xDE,0xEC,0xBB,0xA8,0x66,0x55,0x45, + 0x45,0x44,0x45,0x44,0x44,0x54,0x57,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x87,0x77,0x78,0x77,0x78,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x66,0x77,0x76,0x67,0x77,0x66, + 0x65,0x56,0x56,0x57,0x77,0x66,0x67,0x77,0x67,0x66,0x66,0x77,0x77,0x66,0x55,0x55, + 0x55,0x55,0x56,0x67,0x76,0x65,0x55,0x56,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x56, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x56,0x76,0x55,0x55,0x66,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x76,0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x45,0x44, + 0x45,0x55,0x67,0x89,0x98,0x88,0x98,0xAA,0xAB,0xAB,0xAB,0xBB,0xBA,0xBB,0xAB,0xBA, + 0xBA,0xBB,0xBA,0xBB,0xAB,0xAB,0xBA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA, + 0x9A,0xA9,0xA9,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xAB, + 0xBB,0xCE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0xAE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC, + 0xDC,0xDC,0xDC,0xBD,0xBD,0xCB,0xDB,0xDC,0xDB,0xDB,0xDC,0xCC,0xDC,0xCC,0xCB,0xCB, + 0xBC,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xCC,0xEE,0xDB,0xBA,0xA8,0x75,0x54,0x54, + 0x54,0x45,0x44,0x44,0x54,0x44,0x56,0x77,0x77,0x77,0x77,0x78,0x78,0x78,0x77,0x87, + 0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x78,0x77, + 0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x66,0x66,0x76,0x67,0x76,0x66,0x77,0x66, + 0x66,0x65,0x66,0x77,0x76,0x66,0x56,0x77,0x66,0x55,0x67,0x77,0x77,0x66,0x56,0x55, + 0x55,0x65,0x55,0x67,0x76,0x66,0x66,0x55,0x56,0x77,0x77,0x55,0x54,0x55,0x55,0x57, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x55,0x67,0x65,0x56,0x67,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x65,0x44,0x44,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x54,0x55,0x77,0x9A,0x98,0x89,0x9A,0xAA,0xAB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB, + 0xBB,0xAB,0xAB,0xAA,0xAB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xAA,0xA9, + 0xAA,0x9A,0xA9,0x99,0x99,0x99,0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0x99,0x99,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB, + 0xBB,0xCC,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0x88,0xAE,0xEE,0xEF,0xEE,0xED,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB, + 0xDC,0xCC,0xCC,0xCC,0xCC,0xCD,0xCD,0xBD,0xBD,0xBD,0xBC,0xDB,0xCC,0xDB,0xCC,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xA8,0x65,0x54,0x54, + 0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x66,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x76,0x66,0x67,0x76,0x66,0x77,0x77,0x77,0x77, + 0x66,0x66,0x77,0x77,0x77,0x65,0x56,0x56,0x55,0x66,0x67,0x77,0x65,0x55,0x55,0x55, + 0x66,0x66,0x65,0x56,0x56,0x56,0x66,0x55,0x56,0x67,0x65,0x55,0x55,0x55,0x55,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x56,0x65,0x57,0x76,0x76,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x75,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x45, + 0x54,0x56,0x68,0x9A,0x98,0x99,0xAA,0xBA,0xBA,0xBB,0xAB,0xAB,0xBA,0xBA,0xBB,0xAB, + 0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xA9, + 0xA9,0xA9,0x99,0x99,0x99,0x9A,0x99,0x9A,0x99,0x99,0x99,0xA9,0x99,0x99,0x99,0x99, + 0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xBA,0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x88,0x9D,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCB,0xDC,0xBD,0xCC,0xCC,0xCC,0xCB,0xDC,0xDB,0xDB,0xDC,0xCC,0xDC,0xBD,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBA,0xAA,0xA8,0x75,0x55,0x44, + 0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x57,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x78, + 0x77,0x78,0x77,0x77,0x87,0x87,0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x77, + 0x77,0x77,0x66,0x77,0x77,0x77,0x77,0x76,0x66,0x66,0x77,0x66,0x66,0x66,0x77,0x77, + 0x77,0x76,0x77,0x77,0x76,0x65,0x65,0x65,0x56,0x67,0x77,0x76,0x56,0x55,0x55,0x55, + 0x67,0x76,0x65,0x65,0x56,0x77,0x77,0x66,0x55,0x56,0x55,0x45,0x55,0x56,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x67,0x67,0x66,0x56,0x76,0x76,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x67, + 0x55,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44, + 0x45,0x56,0x78,0xA9,0x89,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xAA,0xA9,0xAA, + 0xAA,0x99,0x99,0x99,0xA9,0x99,0x9A,0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0x99,0x99, + 0x9A,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0x87,0x9D,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB, + 0xDB,0xCC,0xCB,0xCC,0xCC,0xCB,0xCD,0xBD,0xCD,0xBD,0xBD,0xBD,0xBD,0xBC,0xCB,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBA,0xBB,0xBB,0xBA,0xAA,0xAA,0x98,0x66,0x54,0x54, + 0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x55,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87, + 0x77,0x66,0x77,0x77,0x77,0x78,0x77,0x77,0x66,0x66,0x67,0x66,0x67,0x56,0x67,0x77, + 0x77,0x77,0x77,0x77,0x66,0x66,0x65,0x56,0x66,0x77,0x77,0x77,0x65,0x55,0x56,0x67, + 0x77,0x77,0x76,0x55,0x56,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x55,0x56,0x77,0x77, + 0x77,0x77,0x77,0x77,0x65,0x66,0x67,0x75,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75, + 0x44,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x45,0x45,0x45, + 0x45,0x56,0x79,0x99,0x9A,0xAA,0xAA,0xBA,0xAA,0xBA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBB, + 0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xBB,0xBB,0xBB,0xAA,0xAA,0x99, + 0xA9,0x99,0x99,0x99,0x99,0xA9,0x99,0x9A,0x9A,0x99,0x9A,0x9A,0x9A,0x99,0x99,0x99, + 0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xDD,0xCD,0xDD,0xDD,0xDC,0xDC,0xBB, + 0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x87,0x9D,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xCB,0xCB,0xCB,0xCB,0xBD,0xCC,0xDB,0xDC,0xDB,0xDC,0xDC,0xDC,0xDC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xA7,0x65,0x55,0x44, + 0x54,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x57,0x77,0x77,0x77,0x77,0x87,0x78,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x77,0x78,0x77,0x77, + 0x77,0x66,0x77,0x78,0x77,0x77,0x77,0x77,0x67,0x77,0x66,0x66,0x67,0x76,0x66,0x77, + 0x77,0x77,0x77,0x76,0x66,0x67,0x66,0x66,0x67,0x77,0x77,0x76,0x65,0x55,0x57,0x77, + 0x77,0x77,0x76,0x65,0x55,0x67,0x77,0x76,0x55,0x55,0x55,0x55,0x55,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x55,0x55,0x56,0x65,0x55,0x55,0x66,0x77,0x77,0x77,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54, + 0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x55,0x45,0x44,0x44,0x45,0x44,0x44,0x44, + 0x45,0x66,0x89,0xAA,0xAA,0xAA,0xBA,0xAA,0xBA,0xBB,0xAA,0xBA,0xBB,0xAB,0xBA,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xCC,0xCB,0xBB,0xBA,0xAA,0xA9,0xAA, + 0xA9,0x99,0x99,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0xA9,0xA9,0x99,0x99,0x99,0xA9,0x99, + 0x99,0x99,0xAA,0xAA,0xAB,0xAB,0xBB,0xBC,0xBD,0xCC,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC, + 0xBB,0xAB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEA,0x97,0x9D,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xCC,0xDB, + 0xDB,0xCB,0xBB,0xCB,0xCC,0xDB,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDB,0xCC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xBC,0xA8,0x65,0x54,0x54, + 0x45,0x45,0x44,0x54,0x44,0x54,0x44,0x44,0x56,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x77,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x78,0x77, + 0x77,0x66,0x67,0x77,0x78,0x77,0x77,0x87,0x77,0x77,0x66,0x66,0x77,0x76,0x66,0x76, + 0x67,0x67,0x77,0x66,0x56,0x67,0x76,0x67,0x77,0x77,0x77,0x65,0x55,0x65,0x77,0x77, + 0x77,0x77,0x77,0x66,0x55,0x56,0x77,0x76,0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x55,0x55,0x57,0x65,0x55,0x66,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44, + 0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x47,0xA9,0x74,0x44,0x44,0x44,0x44,0x45,0x45, + 0x55,0x67,0x99,0xAA,0xAA,0xBA,0xAA,0xAA,0xAB,0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB, + 0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xCB,0xCB,0xCC,0xCC,0xBB,0xBB,0xAA,0xAA,0x9A,0x99, + 0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0xA9,0xA9,0x99,0x99,0xA9,0x99,0x99,0x99,0x99, + 0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCB, + 0xBB,0xBB,0xAB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEB,0x87,0x9C,0xDE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xBD, + 0xCC,0xCC,0xBC,0xBC,0xBC,0xCB,0xDC,0xBD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xBC,0x97,0x65,0x54,0x54, + 0x54,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x57,0x77,0x77,0x77,0x87,0x77,0x87, + 0x78,0x77,0x77,0x77,0x77,0x87,0x88,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77, + 0x76,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x56, + 0x55,0x66,0x56,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x67,0x77,0x77, + 0x76,0x67,0x77,0x76,0x65,0x55,0x67,0x65,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x55,0x55,0x56,0x76,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44, + 0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x48,0xA9,0xA5,0x44,0x45,0x44,0x54,0x44,0x44, + 0x56,0x68,0x9A,0xAA,0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xAA,0xAB,0xBA,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xBD,0xCC,0xCB,0xBB,0xBB,0xAA,0xA9,0xA9,0xAA, + 0x99,0x99,0x99,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0xA9,0xA9,0x99,0xA9, + 0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCB,0xDC,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDB,0xBB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x87,0x8C,0xDE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xCC,0xDB, + 0xCB,0xBC,0xBB,0xCB,0xCC,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDB,0xCB,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0x87,0x65,0x45,0x44, + 0x45,0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x45,0x56,0x77,0x77,0x77,0x77,0x87,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x87,0x77, + 0x66,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x76,0x55,0x65, + 0x56,0x55,0x56,0x56,0x67,0x77,0x77,0x77,0x77,0x76,0x55,0x56,0x67,0x77,0x77,0x77, + 0x76,0x66,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x65,0x56,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x45,0x44, + 0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x45,0x89,0x74,0x44,0x44,0x44,0x44,0x45,0x55, + 0x56,0x79,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAB,0xAA,0xAA,0xBA,0xBB,0xAB,0xAB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xDB,0xCC,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0x99, + 0x99,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xDC,0xDC,0xDD,0xDC,0xDC, + 0xCB,0xBB,0xBA,0xBB,0xCD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x87,0x8B,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xCC, + 0xCB,0xCB,0xCB,0xBB,0xCC,0xCC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xCC, + 0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBA,0x97,0x65,0x45,0x45, + 0x44,0x54,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x77,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x77, + 0x66,0x56,0x67,0x77,0x77,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x55, + 0x55,0x55,0x65,0x67,0x77,0x77,0x77,0x77,0x76,0x66,0x55,0x56,0x77,0x77,0x77,0x77, + 0x77,0x66,0x77,0x77,0x76,0x55,0x55,0x55,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x76,0x67,0x55,0x55,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x54,0x44,0x44, + 0x45,0x44,0x44,0x54,0x44,0x46,0x64,0x44,0x45,0x58,0x87,0x44,0x45,0x44,0x54,0x45, + 0x66,0x8A,0xAA,0xBA,0xAA,0xBA,0xBA,0xAA,0xBB,0xBA,0xAB,0xAB,0xBA,0xBB,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xDC,0xCC,0xCB,0xBB,0xBA,0xBA,0xAA,0xA9,0xA9,0xA9, + 0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0xA9,0x9A,0x99,0x99, + 0x9A,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC,0xCC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xCB,0xBB,0xBB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x97,0x8B,0xDE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xCC,0xCC, + 0xBB,0xBB,0xBB,0xCB,0xCC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xCC,0xCC, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBA,0xBB,0xBC,0x97,0x65,0x54,0x44, + 0x54,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x44,0x45,0x57,0x77,0x77,0x77,0x77,0x77, + 0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77, + 0x66,0x55,0x66,0x76,0x77,0x76,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x76,0x66,0x56, + 0x55,0x66,0x65,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x56,0x66,0x77,0x77,0x76,0x77, + 0x77,0x76,0x66,0x77,0x77,0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x56,0x65,0x67,0x65,0x66,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x44,0x45,0x44, + 0x44,0x44,0x44,0x44,0x46,0x8A,0xA8,0x44,0x44,0x7A,0x9A,0x84,0x44,0x45,0x45,0x55, + 0x67,0x9A,0xBA,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB,0xAA,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0x99, + 0x99,0x9A,0x9A,0x9A,0x9A,0x9A,0xA9,0xA9,0xA9,0x99,0xA9,0xA9,0x99,0xA9,0x9A,0x99, + 0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xCD,0xDD,0xCD,0xDC, + 0xDC,0xCB,0xBB,0xBA,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDA,0x97,0x89,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xDC,0xDC,0xDD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xCB,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xBC, + 0xCB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0x97,0x65,0x45,0x45, + 0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x45,0x45,0x44,0x45,0x77,0x77,0x78,0x77,0x87, + 0x77,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x87,0x87,0x77, + 0x66,0x65,0x65,0x65,0x67,0x76,0x66,0x66,0x67,0x77,0x77,0x77,0x87,0x77,0x77,0x65, + 0x56,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x55,0x67,0x77,0x77,0x66,0x67, + 0x77,0x76,0x66,0x77,0x75,0x55,0x55,0x55,0x55,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x66,0x55,0x55,0x56,0x77,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x55,0x44,0x44,0x44,0x44, + 0x44,0x45,0x44,0x54,0x79,0x99,0x99,0x84,0x44,0x6A,0x98,0x97,0x44,0x54,0x54,0x56, + 0x68,0xAA,0xBA,0xAB,0xAB,0xBB,0xAA,0xAB,0xBB,0xAB,0xAA,0xBA,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xCB,0xCC,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0xAA,0xAA,0x9A,0xA9,0x99, + 0x99,0xA9,0xA9,0xA9,0xA9,0xAA,0xAA,0xA9,0xAA,0x9A,0x99,0x9A,0x9A,0x99,0x99,0xA9, + 0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAB,0xAB,0xAB,0xBB,0xCC,0xCD,0xCD,0xDD,0xDD, + 0xCD,0xDC,0xBB,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0x87,0x79,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xCC,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDC,0xDB,0xDB, + 0xBB,0xBB,0xBA,0xBB,0xBA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xCC,0x97,0x65,0x45,0x45, + 0x44,0x54,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x45,0x45,0x67,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77, + 0x76,0x66,0x65,0x65,0x66,0x66,0x65,0x65,0x66,0x76,0x77,0x77,0x77,0x77,0x77,0x75, + 0x76,0x66,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x56,0x67,0x77,0x76,0x67, + 0x77,0x77,0x65,0x56,0x55,0x55,0x55,0x56,0x67,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x75,0x56,0x66,0x55,0x55,0x67,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x54,0x45,0x44, + 0x45,0x44,0x44,0x57,0xA9,0x89,0x89,0x98,0x44,0x46,0x99,0x99,0x54,0x45,0x45,0x56, + 0x79,0xAB,0xAB,0xBB,0xAB,0xAA,0xAA,0xBB,0xBA,0xBA,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAA,0xAA,0xA9,0xAA,0x9A,0x99, + 0x9A,0x9A,0x9A,0x9A,0x9A,0xAB,0xDB,0xAA,0x99,0x9A,0x9A,0x99,0x99,0x9A,0x99,0x99, + 0x9A,0x99,0x99,0x99,0x9A,0xA9,0xAA,0xAA,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xCD,0xCD, + 0xDC,0xDC,0xDB,0xBB,0xBA,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCC,0x88,0x79,0xCD,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDC,0xDD,0xCD,0xDD,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCB, + 0xDB,0xBB,0xBB,0xBB,0xBB,0x9A,0xAA,0xAB,0xAB,0xBB,0xBB,0xCC,0x87,0x55,0x54,0x54, + 0x45,0x44,0x45,0x44,0x44,0x44,0x54,0x45,0x45,0x44,0x44,0x56,0x77,0x77,0x78,0x77, + 0x77,0x77,0x78,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x78,0x77,0x77,0x87,0x78,0x77, + 0x76,0x77,0x66,0x56,0x56,0x55,0x56,0x56,0x56,0x56,0x66,0x77,0x77,0x77,0x78,0x77, + 0x77,0x66,0x67,0x77,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x67,0x77,0x76,0x56, + 0x77,0x77,0x76,0x55,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x76, + 0x55,0x55,0x77,0x55,0x66,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x45, + 0x44,0x44,0x45,0x8A,0x99,0x98,0x89,0x99,0x84,0x45,0x7A,0xA9,0x54,0x54,0x55,0x67, + 0x89,0xBB,0xBB,0xBA,0xBB,0xBA,0xAA,0xAA,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xCB,0xCC,0xCB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0x99,0x99, + 0x99,0xA9,0xA9,0xAA,0x99,0xAA,0xCB,0xBA,0xAA,0xA9,0xA9,0xA9,0x9A,0x99,0xA9,0xA9, + 0x99,0x99,0x99,0x99,0x99,0xAA,0xA9,0xAA,0xAA,0xBB,0xBB,0xBC,0xBD,0xCC,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0x88,0x78,0xBD,0xDE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xCD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDB, + 0xCC,0xCB,0xBB,0xAB,0xCC,0xAA,0xAA,0xAB,0xBB,0xAB,0xBC,0xCC,0x87,0x65,0x45,0x45, + 0x44,0x54,0x44,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x78,0x77,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x76,0x66,0x65,0x66,0x65,0x65,0x66,0x65,0x66,0x67,0x77,0x77,0x77,0x77, + 0x77,0x76,0x67,0x77,0x77,0x77,0x77,0x66,0x55,0x55,0x55,0x55,0x56,0x77,0x77,0x75, + 0x67,0x77,0x65,0x55,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x67,0x76, + 0x55,0x55,0x67,0x76,0x67,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x45,0x45,0x45,0x44,0x44, + 0x45,0x45,0x59,0xA9,0x89,0x85,0x59,0x99,0xA8,0x44,0x45,0x65,0x45,0x45,0x56,0x77, + 0x9A,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xBC, + 0xCC,0xDB,0xBB,0xBA,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xBA,0xAA,0x9A,0x99,0x99, + 0x9A,0x99,0xA9,0x99,0x99,0xAA,0xBC,0xBB,0xBA,0xAA,0x9A,0x99,0xA9,0x9A,0x99,0x9A, + 0x99,0x99,0x99,0x99,0x9A,0xAA,0xAA,0x9A,0xAA,0xBA,0xBB,0xBB,0xCC,0xDD,0xCD,0xDD, + 0xDD,0xDC,0xDB,0xBB,0xBB,0xBA,0xBC,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0x88,0x78,0xAD,0xDE,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xCD, + 0xCB,0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDC, + 0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAB,0xAB,0xBB,0xBC,0xDB,0x87,0x65,0x54,0x54, + 0x45,0x45,0x45,0x44,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x57,0x77,0x77,0x78, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77, + 0x87,0x77,0x76,0x77,0x66,0x66,0x67,0x66,0x65,0x65,0x65,0x67,0x77,0x77,0x77,0x77, + 0x77,0x66,0x57,0x77,0x78,0x77,0x77,0x65,0x65,0x55,0x55,0x55,0x55,0x67,0x77,0x76, + 0x56,0x76,0x55,0x55,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x65,0x67,0x77, + 0x65,0x55,0x56,0x77,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x77, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x54,0x45,0x44,0x44,0x44,0x44,0x45, + 0x44,0x44,0x5A,0x98,0x88,0x44,0x46,0x99,0x9A,0x74,0x44,0x44,0x44,0x45,0x56,0x78, + 0xAB,0xCB,0xCB,0xCB,0xBB,0xAA,0xAA,0xAA,0xBA,0xAA,0xBB,0xBB,0xBB,0xBC,0xBB,0xDB, + 0xDC,0xCD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0x99,0x99, + 0xA9,0xAA,0x9A,0x99,0x99,0x99,0xAB,0xBB,0xBC,0xAA,0xA9,0xA9,0x9A,0x99,0x9A,0x99, + 0x99,0xA9,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAB,0xBA,0xBB,0xBC,0xCC,0xDC,0xDC, + 0xDC,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0x98,0x78,0x9D,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC, + 0xCB,0xBB,0xAB,0xBB,0xBC,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDB,0xDB, + 0xCC,0xCB,0xBB,0xBA,0xBB,0xBA,0xAA,0xAA,0xBA,0xBA,0xBB,0xCB,0x87,0x55,0x45,0x44, + 0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x55,0x77,0x77,0x87, + 0x78,0x77,0x77,0x87,0x87,0x87,0x78,0x77,0x77,0x78,0x78,0x78,0x78,0x77,0x87,0x87, + 0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x77,0x76,0x65,0x65,0x56,0x66,0x67,0x77,0x77, + 0x76,0x66,0x67,0x77,0x77,0x77,0x77,0x65,0x55,0x55,0x55,0x55,0x55,0x56,0x77,0x77, + 0x66,0x55,0x55,0x55,0x56,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x57,0x77,0x67, + 0x76,0x55,0x66,0x77,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x54,0x44,0x44,0x45,0x44,0x44,0x45,0x44, + 0x44,0x44,0x57,0xA9,0x99,0x74,0x44,0x69,0x99,0x95,0x44,0x54,0x45,0x55,0x57,0x79, + 0xAB,0xBC,0xCD,0xDC,0xBB,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCD,0xBD, + 0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xA9,0x99,0x99, + 0x9A,0x9A,0x9A,0x99,0x99,0x9A,0x9A,0xAA,0xBD,0xDD,0xAA,0xA9,0xA9,0x9A,0x99,0xA9, + 0xA9,0x99,0x99,0xA9,0x99,0xAA,0xAA,0xA9,0xAA,0xAB,0xAB,0xBB,0xBB,0xCD,0xCD,0xDD, + 0xDD,0xDC,0xDC,0xDC,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBE,0xA8,0x78,0x9C,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xDD,0xCD, + 0xDC,0xBB,0xBB,0xBB,0xBB,0xBD,0xCD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDC,0xDC,0xDD,0xCD, + 0xCC,0xBB,0xBB,0xBB,0xBC,0xBB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBA,0x87,0x55,0x54,0x54, + 0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x57,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x78,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x76,0x77,0x66,0x65,0x56,0x67,0x76,0x77, + 0x76,0x65,0x67,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x77,0x77, + 0x65,0x55,0x55,0x55,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x77,0x77,0x76,0x56, + 0x76,0x56,0x67,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x87, + 0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44, + 0x67,0x64,0x44,0x7A,0x99,0x97,0x44,0x45,0x8A,0x84,0x54,0x44,0x54,0x55,0x67,0x8A, + 0xBB,0xBB,0xCC,0xDD,0xCB,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBC,0xCB,0xDC,0xDC, + 0xDD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xAB,0xAA,0xA9,0x99,0x99, + 0xA9,0xAA,0xA9,0xA9,0xA9,0x99,0xA9,0xAA,0xBC,0xEE,0xDA,0xA9,0xA9,0xA9,0x9A,0x99, + 0x9A,0x99,0xA9,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBC,0xCC,0xDC, + 0xDD,0xDD,0xDD,0xDC,0xDB,0xBB,0xAB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xA8,0x87,0x8B,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD, + 0xCB,0xBB,0xBA,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xCC,0xDB, + 0xDB,0xDB,0xBB,0xBA,0xBB,0xCB,0xAA,0xAB,0xAB,0xAB,0xAB,0xBA,0x86,0x65,0x45,0x44, + 0x54,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x56,0x77,0x77, + 0x78,0x77,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x78,0x78,0x77,0x77,0x78,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x76,0x66,0x65,0x65,0x66,0x67, + 0x66,0x65,0x57,0x77,0x87,0x77,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x57,0x76, + 0x55,0x55,0x56,0x55,0x77,0x78,0x77,0x77,0x87,0x77,0x76,0x55,0x67,0x76,0x65,0x55, + 0x67,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x77, + 0x77,0x87,0x77,0x87,0x77,0x77,0x76,0x54,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x55, + 0xAA,0xA6,0x44,0x47,0xA9,0x99,0x64,0x44,0x55,0x44,0x44,0x54,0x45,0x56,0x68,0x8B, + 0xBB,0xBB,0xBB,0xCD,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDB,0xDC,0xDC,0xDD, + 0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xAA,0xAA,0xA9,0x98,0x9A, + 0x9A,0x99,0xA9,0xA9,0x99,0x9A,0xAA,0x9A,0xAB,0xDD,0xED,0xBA,0xA9,0x9A,0x99,0x9A, + 0x99,0x9A,0x99,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xCD, + 0xDC,0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xA8,0x77,0x8A,0xCD,0xDE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xCB,0xBB,0xBA,0xBB,0xBC,0xCC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDC,0xDD,0xBD, + 0xCC,0xCC,0xBB,0xBB,0xBC,0xCB,0xBA,0xAA,0xBB,0xBB,0xBB,0xCB,0x87,0x65,0x54,0x54, + 0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x67,0x77, + 0x77,0x77,0x87,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x77,0x78,0x78,0x77,0x77,0x87, + 0x78,0x77,0x87,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x67,0x66,0x65,0x65,0x56, + 0x76,0x67,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x55,0x66,0x77,0x57,0x77,0x77,0x77,0x77,0x77,0x77,0x75,0x55,0x56,0x77,0x65,0x55, + 0x67,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x65,0x44,0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x45, + 0x9A,0xA7,0x44,0x44,0x8A,0x99,0x96,0x44,0x44,0x45,0x45,0x44,0x55,0x66,0x78,0xAA, + 0xBB,0xBA,0xBB,0xBB,0xAA,0xAC,0xCB,0xBA,0xBB,0xBB,0xCC,0xBC,0xBD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xA9,0x99,0x99, + 0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0xAA,0xAB,0xCE,0xEC,0xAA,0xA9,0xA9,0xA9, + 0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBB,0xCC,0xDC, + 0xDD,0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xAB,0xBB,0xDE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xB8,0x87,0x89,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD, + 0xDC,0xCB,0xBA,0xAB,0xAB,0xBB,0xBC,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC, + 0xDB,0xDB,0xBB,0xBA,0xBC,0xCB,0xBA,0xAB,0xAB,0xBA,0xBB,0xBA,0x87,0x65,0x45,0x45, + 0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x45,0x56,0x77, + 0x78,0x77,0x77,0x77,0x77,0x87,0x87,0x78,0x77,0x77,0x78,0x77,0x77,0x77,0x87,0x77, + 0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x66,0x66,0x66, + 0x56,0x56,0x77,0x78,0x77,0x87,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x65,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x55,0x55,0x57,0x76,0x56, + 0x67,0x77,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77, + 0x87,0x77,0x77,0x77,0x77,0x75,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44, + 0x58,0x75,0x54,0x44,0x58,0xA9,0x98,0x44,0x45,0x44,0x45,0x45,0x45,0x67,0x79,0xAB, + 0xAB,0xBB,0xBB,0xAB,0xAA,0xCE,0xDB,0xBB,0xBB,0xCC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xBC,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xAB,0xAA,0xAA,0xA9,0x98,0x99, + 0xAA,0x9A,0xA9,0xAA,0x99,0x99,0xAA,0xA9,0x9A,0xAA,0xAB,0xBD,0xBA,0xA9,0x9A,0x99, + 0xA9,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBC,0xCD, + 0xCD,0xDD,0xDD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBC,0xD9,0x87,0x89,0xBD,0xDE,0xEE,0xEE,0xFE,0xEF,0xEE,0xED,0xED,0xDD,0xDD,0xDD, + 0xDD,0xCC,0xBB,0xAA,0xAA,0xAB,0xBB,0xCC,0xCD,0xCC,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC, + 0xDC,0xCC,0xBB,0xBB,0xBD,0xCB,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0x87,0x65,0x55,0x45, + 0x45,0x44,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x77, + 0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x87,0x87,0x77,0x78, + 0x77,0x87,0x78,0x77,0x77,0x87,0x87,0x78,0x77,0x77,0x77,0x77,0x77,0x67,0x76,0x76, + 0x65,0x67,0x77,0x77,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x57,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x76,0x76,0x77,0x65,0x55,0x56,0x77,0x77, + 0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x78,0x77,0x87, + 0x77,0x77,0x87,0x77,0x77,0x54,0x45,0x44,0x44,0x44,0x45,0x45,0x44,0x47,0x87,0x44, + 0x44,0x47,0xA9,0x64,0x45,0x8A,0xA7,0x44,0x54,0x44,0x54,0x45,0x56,0x67,0x8A,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xAB,0xCD,0xBA,0xBB,0xBB,0xCB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCC,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xAB,0xAB,0xBB,0xAB,0xA9,0x89,0x99, + 0xA9,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0xA9,0xA9,0xAA,0xBB,0xBB,0xAA,0xA9,0xA9, + 0x9A,0x99,0xA9,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBB,0xCC, + 0xBD,0xCD,0xCD,0xDD,0xDD,0xCD,0xBB,0xBA,0xBB,0xBC,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xD9,0x87,0x89,0xBC,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xDB,0xBB,0xBA,0xAA,0xBB,0xBB,0xBB,0xCC,0xDD,0xCD,0xCD,0xDC,0xDB,0xDC,0xDB, + 0xDB,0xDB,0xCB,0xBA,0xBC,0xBB,0xAA,0xAA,0xBB,0xAB,0xAB,0xBB,0x87,0x65,0x54,0x44, + 0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x57, + 0x77,0x78,0x77,0x77,0x78,0x77,0x78,0x78,0x78,0x77,0x87,0x77,0x77,0x77,0x87,0x87, + 0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x77,0x77, + 0x75,0x77,0x77,0x87,0x77,0x77,0x76,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x66, + 0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x65,0x66,0x67,0x65,0x55,0x55,0x67,0x77, + 0x77,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x65,0x44,0x44,0x44,0x45,0x45,0x44,0x44,0x45,0x8A,0x9A,0x84, + 0x44,0x59,0xA9,0x96,0x44,0x45,0x54,0x44,0x44,0x54,0x54,0x55,0x56,0x68,0xAB,0xBB, + 0xBB,0xBA,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDB,0xCC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBA,0xBA,0xBA,0xA9,0x99,0x99, + 0x9A,0x9A,0x9A,0xAA,0x99,0x99,0x9A,0xAA,0xAA,0x9A,0xAA,0xAA,0xBB,0xBA,0xA9,0xA9, + 0xA9,0x99,0x99,0xA9,0x99,0x9A,0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBC, + 0xDD,0xCD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBA,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xEA,0x87,0x7A,0xBC,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD, + 0xDD,0xDD,0xCB,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xCB,0xDC,0xDD,0xCD,0xDD,0xDC,0xDC, + 0xDC,0xCC,0xBB,0xBB,0xAB,0xBB,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0x97,0x65,0x55,0x45, + 0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x45, + 0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x78,0x77,0x78,0x78,0x77,0x77, + 0x87,0x78,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x78,0x77,0x87, + 0x76,0x77,0x77,0x78,0x77,0x87,0x77,0x65,0x65,0x55,0x55,0x55,0x55,0x57,0x75,0x77, + 0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x55,0x55,0x66,0x55,0x55,0x56,0x77,0x77, + 0x77,0x78,0x77,0x87,0x77,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x78,0x77,0x77,0x77, + 0x77,0x77,0x77,0x76,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x69,0x99,0x99,0x98, + 0x44,0x47,0xA9,0x99,0x64,0x44,0x44,0x54,0x54,0x45,0x44,0x55,0x66,0x79,0xBC,0xBB, + 0xCC,0xBB,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDD,0xED,0xDE,0xDD, + 0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xBA,0xBB,0xBB,0xBB,0xA9,0x98,0x99, + 0xA9,0xAA,0xA9,0xA9,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0x9A, + 0x99,0xA9,0xA9,0x99,0x99,0x9A,0xAA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBC, + 0xCB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBD,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xAA,0xDB,0x88,0x7A,0xBC,0xDD,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xCB,0xBA,0xAA,0x9A,0xAB,0xBB,0xBB,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xBD,0xBC,0xCB,0xBB,0xAB,0xBC,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0x87,0x65,0x54,0x54, + 0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x45,0x45, + 0x67,0x77,0x87,0x77,0x77,0x77,0x87,0x87,0x87,0x78,0x77,0x78,0x77,0x77,0x78,0x77, + 0x77,0x77,0x78,0x77,0x77,0x87,0x87,0x77,0x87,0x77,0x78,0x77,0x87,0x77,0x77,0x77, + 0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x65,0x66,0x65,0x56,0x56,0x66,0x77,0x77,0x77, + 0x77,0x77,0x77,0x66,0x77,0x67,0x77,0x76,0x55,0x55,0x67,0x75,0x55,0x67,0x77,0x77, + 0x87,0x77,0x77,0x77,0x87,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x77,0x78,0x77,0x87, + 0x87,0x77,0x77,0x54,0x44,0x45,0x45,0x44,0x45,0x45,0x44,0x47,0xA9,0x98,0x98,0x99, + 0x84,0x44,0x7A,0x9A,0x84,0x44,0x44,0x44,0x45,0x45,0x45,0x55,0x66,0x79,0xAA,0xBB, + 0xBC,0xCC,0xBA,0xAA,0xAC,0xBB,0xAB,0xBC,0xDC,0xDD,0xDD,0xDE,0xDE,0xDE,0xED,0xED, + 0xDD,0xDD,0xBC,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xBB,0xBA,0xBB,0xAB,0xA9,0x98,0x99, + 0x9A,0x9A,0x9A,0xAA,0x9A,0x99,0x99,0xAA,0xA9,0xAA,0xBA,0x99,0xAA,0xAA,0xBA,0xA9, + 0xA9,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xAB,0xBB,0xDE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xCC,0x88,0x79,0xCB,0xCD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDC,0xDD,0xDC,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xDC,0xCB,0xBB,0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0x97,0x65,0x45,0x45, + 0x44,0x54,0x44,0x54,0x54,0x54,0x54,0x54,0x44,0x54,0x44,0x44,0x54,0x45,0x44,0x44, + 0x56,0x77,0x77,0x77,0x87,0x87,0x77,0x77,0x78,0x77,0x78,0x77,0x78,0x78,0x77,0x78, + 0x78,0x78,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x78,0x77,0x87,0x77,0x78,0x77,0x77, + 0x87,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x65,0x57,0x75,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x65,0x66,0x57,0x66,0x77,0x65,0x55,0x56,0x77,0x67,0x77,0x77,0x77, + 0x77,0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x78,0x78,0x78,0x78,0x77,0x77,0x77,0x77, + 0x77,0x77,0x75,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x45,0x8A,0x99,0x99,0x79,0x99, + 0xA8,0x44,0x47,0x99,0x64,0x44,0x44,0x54,0x54,0x44,0x55,0x56,0x68,0x9A,0xAA,0xAA, + 0xAB,0xCC,0xBA,0xAA,0xAC,0xBB,0xBB,0xBC,0xBD,0xCD,0xDD,0xDD,0xED,0xEE,0xDE,0xDD, + 0xDD,0xDC,0xDB,0xBB,0xBA,0xBB,0xAB,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xAA,0x89,0x89, + 0x99,0xA9,0xAA,0x9A,0xA9,0xA9,0xA9,0x9A,0xAA,0xA9,0xA9,0x9A,0x9A,0x9A,0xAA,0x9A, + 0x9A,0x9A,0x9A,0x99,0x99,0x9A,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAB,0xBB, + 0xBC,0xCC,0xCC,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xAD,0xA8,0x78,0xDB,0xCD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xDD,0xDD,0xCC,0xBB,0xAA,0xAA,0xAA,0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC, + 0xDB,0xCB,0xCB,0xBA,0xBB,0xBB,0xAA,0xAB,0xBA,0xBA,0xBB,0xBC,0x97,0x75,0x55,0x44, + 0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x44, + 0x45,0x77,0x77,0x87,0x77,0x77,0x87,0x87,0x77,0x87,0x87,0x78,0x77,0x77,0x78,0x77, + 0x77,0x77,0x78,0x78,0x77,0x87,0x87,0x77,0x78,0x77,0x77,0x77,0x87,0x87,0x78,0x77, + 0x77,0x87,0x78,0x77,0x77,0x87,0x78,0x77,0x77,0x76,0x77,0x77,0x77,0x77,0x87,0x77, + 0x87,0x77,0x65,0x57,0x76,0x67,0x55,0x67,0x75,0x55,0x55,0x67,0x78,0x77,0x87,0x78, + 0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x87, + 0x77,0x76,0x54,0x45,0x44,0x44,0x44,0x45,0x44,0x54,0x69,0x99,0x89,0x85,0x45,0x99, + 0x9A,0x74,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x45,0x45,0x67,0x78,0x9A,0xAA,0xAA, + 0xAA,0xAB,0xAA,0xAA,0xBB,0xAA,0xBB,0xCC,0xDD,0xDD,0xDD,0xDE,0xEE,0xDE,0xED,0xED, + 0xDD,0xCD,0xBC,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBA,0xBA,0xBA,0xAA,0x98,0x99, + 0x9A,0xAA,0xAA,0xAA,0x9A,0xA9,0x99,0xAA,0xAA,0xAA,0x9A,0x99,0x99,0x99,0x9A,0x9A, + 0x99,0xA9,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xAB,0xBB,0xBB, + 0xBC,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDB,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBA,0xAD,0xA8,0x78,0xDD,0xBD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDD,0xCD,0xDD,0xBB,0xAA,0x9A,0xAA,0xAB,0xBB,0xBB,0xDC,0xDD,0xCD,0xCD,0xCD,0xDC, + 0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xAB,0xAA,0xBB,0xBB,0xBA,0xBB,0x97,0x65,0x54,0x54, + 0x44,0x54,0x44,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45, + 0x44,0x56,0x77,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x78,0x78,0x77,0x87, + 0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x87,0x87,0x77,0x78,0x77,0x87, + 0x87,0x78,0x77,0x77,0x87,0x77,0x77,0x87,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77, + 0x77,0x76,0x56,0x77,0x77,0x77,0x76,0x56,0x77,0x65,0x56,0x77,0x77,0x77,0x77,0x77, + 0x78,0x77,0x77,0x77,0x87,0x87,0x87,0x77,0x87,0x78,0x77,0x78,0x77,0x77,0x87,0x77, + 0x77,0x55,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x47,0x99,0x99,0x99,0x74,0x44,0x69, + 0x99,0xA6,0x44,0x44,0x45,0x44,0x45,0x44,0x54,0x45,0x56,0x67,0x89,0xAA,0xAA,0xAA, + 0xAA,0xA9,0xAA,0xCD,0xCB,0xAB,0xBB,0xCB,0xDC,0xDD,0xDD,0xDE,0xDE,0xED,0xED,0xDD, + 0xDD,0xDD,0xCB,0xBB,0xBB,0xAB,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBA,0x98,0x89, + 0x99,0x9A,0xAA,0xAA,0xAA,0x9A,0xA9,0x9A,0xAB,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0x9A,0x99,0x9A,0x99,0x99,0x9A,0xAA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xCC,0xDC,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xAB,0xBB,0xCD,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAB,0xC8,0x88,0xDE,0xBC,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDB,0xBA,0xA9,0xAA,0xAB,0xBC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDC,0xDC, + 0xCC,0xCC,0xCC,0xBB,0xBB,0xDC,0xBA,0xAB,0xAB,0xAB,0xBB,0xBA,0x97,0x65,0x54,0x54, + 0x54,0x45,0x44,0x54,0x44,0x44,0x54,0x54,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44, + 0x45,0x45,0x77,0x77,0x87,0x77,0x87,0x87,0x77,0x78,0x78,0x78,0x77,0x77,0x87,0x77, + 0x87,0x77,0x77,0x87,0x78,0x78,0x77,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x87,0x77, + 0x77,0x77,0x78,0x78,0x77,0x87,0x87,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77,0x77, + 0x77,0x65,0x67,0x77,0x67,0x76,0x77,0x65,0x67,0x75,0x66,0x77,0x77,0x87,0x77,0x87, + 0x77,0x78,0x77,0x87,0x77,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x77,0x78,0x77,0x77, + 0x75,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x8A,0x99,0x89,0x99,0x96,0x44,0x46, + 0xA9,0xA8,0x44,0x45,0x44,0x45,0x44,0x44,0x45,0x45,0x56,0x78,0x89,0xAA,0xAA,0xA9, + 0xA9,0xA9,0xAA,0xDE,0xCB,0xAB,0xBB,0xCD,0xCD,0xDD,0xDD,0xED,0xED,0xDE,0xDD,0xDD, + 0xDD,0xDC,0xCC,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0x99,0x89, + 0x99,0xAA,0xAA,0xAA,0xAA,0xA9,0x9A,0x99,0xAA,0xAA,0xA9,0xA9,0x9A,0x99,0xA9,0xA9, + 0xA9,0x9A,0x99,0x99,0x99,0x99,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAB,0xBB,0xBB, + 0xCB,0xCC,0xDC,0xDD,0xDC,0xDD,0xDC,0xDD,0xCC,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0xD9,0x87,0xCE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xBB,0xAA,0xAA,0xBB,0xCB,0xCC,0xCB,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDB,0xDC,0xCB,0xBB,0xBB,0xBC,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB,0x98,0x75,0x55,0x45, + 0x45,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44, + 0x44,0x44,0x57,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x78,0x78,0x77,0x87, + 0x77,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x87,0x87,0x87,0x87,0x77,0x87, + 0x78,0x78,0x77,0x77,0x78,0x77,0x77,0x78,0x77,0x78,0x78,0x78,0x78,0x77,0x78,0x77, + 0x77,0x67,0x77,0x75,0x56,0x65,0x77,0x76,0x66,0x77,0x77,0x77,0x87,0x77,0x87,0x77, + 0x78,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x78,0x78,0x77,0x77,0x77,0x77,0x77,0x76, + 0x54,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x68,0xA9,0x99,0x88,0x99,0x99,0x64,0x44, + 0x69,0x95,0x44,0x44,0x45,0x44,0x54,0x54,0x54,0x55,0x67,0x78,0x9A,0xBA,0xAA,0xAA, + 0xAA,0x9A,0x9A,0xAA,0xAA,0xAB,0xBC,0xBD,0xCD,0xCD,0xDD,0xDD,0xED,0xED,0xDD,0xDD, + 0xDD,0xCD,0xCB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xA8,0x98, + 0x99,0x9A,0xAA,0xAB,0xAA,0xAA,0xA9,0xA9,0x9A,0xAA,0x9A,0xAA,0xA9,0xAA,0x9A,0x9A, + 0x99,0xA9,0x9A,0x99,0x99,0x9A,0xAA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBC, + 0xBC,0xCC,0xBD,0xBD,0xCD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0xDA,0x87,0xAF,0xEB,0xCD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xBB,0xBA,0xAB,0xBC,0xCD,0xBD,0xBD,0xBD,0xCD,0xCD,0xCD,0xBD, + 0xBD,0xBC,0xBB,0xBB,0xBB,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0x98,0x76,0x55,0x44, + 0x44,0x54,0x44,0x54,0x54,0x45,0x44,0x44,0x45,0x45,0x44,0x44,0x44,0x44,0x45,0x44, + 0x54,0x44,0x55,0x77,0x78,0x77,0x87,0x78,0x77,0x78,0x78,0x77,0x87,0x77,0x78,0x77, + 0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x87,0x77, + 0x87,0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x78,0x77,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x67,0x76,0x55,0x77,0x76,0x77,0x77,0x57,0x77,0x78,0x77,0x77,0x87,0x77,0x87, + 0x77,0x78,0x77,0x87,0x87,0x77,0x77,0x87,0x77,0x77,0x78,0x77,0x76,0x77,0x77,0x65, + 0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x45,0x8A,0x99,0x98,0x54,0x89,0x99,0x95,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x54,0x56,0x67,0x89,0xAB,0xBB,0xBA,0xAA, + 0x99,0xA9,0xA9,0xAA,0xAB,0xBB,0xBC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA9,0x88, + 0x99,0x9A,0xAA,0xBB,0xBA,0xAA,0xAA,0x99,0xA9,0xAA,0xAA,0x9A,0x9A,0x99,0xA9,0xA9, + 0xA9,0x99,0xA9,0x99,0x99,0x9A,0xAB,0xAB,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xCC, + 0xCC,0xBC,0xCC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCC,0xBB,0xBA,0xBB,0xCD,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0xDC,0x87,0x9E,0xED,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xCD,0xDD,0xDC,0xBB,0xBB,0xBC,0xBC,0xCC,0xCB,0xDC,0xDB,0xDB,0xDC,0xDC, + 0xCC,0xCC,0xBB,0xBB,0xCC,0xCD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xA8,0x76,0x55,0x45, + 0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x57,0x77,0x77,0x77,0x77,0x87,0x87,0x77,0x78,0x77,0x78,0x77,0x78, + 0x77,0x78,0x77,0x77,0x77,0x77,0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x77,0x78, + 0x77,0x78,0x77,0x87,0x78,0x77,0x78,0x78,0x77,0x77,0x87,0x87,0x78,0x77,0x77,0x87, + 0x76,0x56,0x65,0x66,0x77,0x66,0x76,0x77,0x77,0x77,0x77,0x77,0x87,0x77,0x87,0x77, + 0x87,0x87,0x77,0x77,0x77,0x87,0x87,0x77,0x77,0x78,0x77,0x77,0x77,0x78,0x75,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x8A,0x99,0x85,0x44,0x48,0xA8,0x99,0x44, + 0x44,0x44,0x44,0x54,0x44,0x54,0x44,0x54,0x55,0x56,0x68,0x8C,0xED,0xCC,0xBB,0xBA, + 0xAA,0x9A,0x9A,0xAA,0xAA,0xBB,0xBB,0xCB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xAA,0x98, + 0x99,0x99,0xAA,0xBD,0xDC,0xBB,0xAA,0x9A,0x99,0x9A,0x9A,0xA9,0xA9,0xAA,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x99,0x99,0x9A,0xAA,0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBC, + 0xCC,0xBB,0xCB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBC,0xDE,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xAA,0xAD,0x98,0x8E,0xEE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDB,0xCB,0xCC,0xCC,0xDB,0xDB,0xCC,0xCC,0xCC,0xDC,0xDB,0xDC, + 0xDB,0xCC,0xCC,0xCD,0xBD,0xCD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xB8,0x76,0x55,0x44, + 0x54,0x54,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54, + 0x44,0x54,0x45,0x46,0x77,0x78,0x78,0x77,0x77,0x78,0x77,0x87,0x78,0x77,0x78,0x77, + 0x87,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x77,0x77,0x77,0x87,0x87, + 0x78,0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x78,0x78,0x77,0x77,0x77,0x78,0x77,0x77, + 0x77,0x76,0x75,0x67,0x76,0x56,0x75,0x67,0x77,0x87,0x87,0x78,0x77,0x87,0x77,0x87, + 0x77,0x77,0x87,0x87,0x87,0x77,0x77,0x87,0x87,0x87,0x78,0x78,0x77,0x77,0x54,0x44, + 0x44,0x54,0x54,0x54,0x54,0x54,0x44,0x44,0x59,0x99,0x98,0x44,0x44,0x8A,0x9A,0x64, + 0x44,0x45,0x44,0x44,0x45,0x45,0x45,0x45,0x55,0x67,0x79,0xAD,0xEF,0xEF,0xDC,0xBB, + 0xAA,0x9A,0x9A,0xAA,0xAB,0xBB,0xBC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC, + 0xCD,0xBC,0xCB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0x99, + 0x89,0x99,0xAA,0xBE,0xEF,0xEB,0xBA,0xA9,0x99,0x99,0x9A,0x9A,0xAA,0x9A,0x9A,0xA9, + 0xA9,0xA9,0x99,0x99,0x99,0xAA,0xAB,0xBA,0xBB,0xAB,0xBA,0xBA,0xBA,0xBB,0xBB,0xCC, + 0xCB,0xCB,0xBC,0xBC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBA,0xBB,0xDD,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBA,0x9D,0xA8,0x8E,0xEE,0xDC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xCD,0xDD,0xDD,0xCD,0xCC,0xCC,0xCC,0xBD,0xBD,0xBD,0xBD,0xCC,0xCD,0xCD, + 0xCC,0xCC,0xCB,0xCB,0xDC,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB,0xB9,0x86,0x55,0x54, + 0x54,0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x67,0x77,0x77,0x78,0x78,0x77,0x87,0x77,0x87,0x78,0x77,0x87, + 0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x87,0x77,0x87,0x77,0x87,0x78,0x78,0x77,0x78, + 0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x87,0x87,0x77,0x78,0x78,0x78,0x77,0x77,0x77, + 0x76,0x67,0x77,0x55,0x55,0x77,0x76,0x77,0x77,0x77,0x78,0x77,0x87,0x77,0x87,0x77, + 0x78,0x78,0x77,0x77,0x77,0x78,0x78,0x77,0x77,0x78,0x77,0x77,0x77,0x65,0x45,0x45, + 0x44,0x44,0x44,0x44,0x45,0x45,0x45,0x45,0x45,0x99,0x9A,0x84,0x54,0x58,0xA8,0x54, + 0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x56,0x67,0x89,0xAB,0xBD,0xEF,0xFE,0xDC, + 0xAA,0xA9,0xAA,0xAA,0xAA,0xBB,0xBC,0xCB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xA8, + 0x89,0x99,0x9A,0xBE,0xFF,0xFE,0xBA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0x9A, + 0x9A,0x9A,0x99,0x99,0x99,0x9A,0xBA,0xBB,0xBA,0xBB,0xAB,0xBA,0xBA,0xBA,0xBB,0xBC, + 0xBC,0xBC,0xBB,0xBB,0xCB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBD,0xDE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCB,0xBA,0xAB,0xD9,0x8C,0xFE,0xEB,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xDB,0xDB,0xDB,0xCD,0xBC,0xCC,0xCC,0xCC,0xCD,0xBD,0xBC, + 0xCD,0xBC,0xCD,0xCD,0xCD,0xCD,0xDD,0xDB,0xDB,0xCC,0xBB,0xBB,0xC9,0x77,0x55,0x45, + 0x45,0x44,0x54,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x45, + 0x44,0x44,0x45,0x45,0x57,0x77,0x78,0x77,0x77,0x78,0x77,0x87,0x78,0x77,0x87,0x78, + 0x78,0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x78,0x77, + 0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x77,0x77,0x87,0x77,0x77,0x77,0x78,0x78,0x77, + 0x77,0x56,0x77,0x75,0x56,0x77,0x77,0x77,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x78, + 0x77,0x77,0x78,0x78,0x77,0x87,0x77,0x78,0x78,0x77,0x78,0x77,0x75,0x54,0x44,0x44, + 0x45,0x45,0x44,0x55,0x55,0x55,0x54,0x44,0x44,0x59,0x99,0xA8,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x45,0x45,0x45,0x55,0x67,0x78,0x9A,0xBB,0xBB,0xDD,0xDE,0xFE, + 0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCC,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xBC,0xCC, + 0xCC,0xCC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBC,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xA9, + 0x98,0x99,0x9A,0xAC,0xEE,0xEE,0xCB,0xAA,0xA9,0xAA,0xAA,0x9A,0x9A,0x9A,0xA9,0x9A, + 0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xAB,0xBA,0xBA,0xAA,0xAB,0xAB,0xBB,0xBB, + 0xCB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDC,0xDD,0xCD,0xBC,0xCB,0xBB,0xBB,0xBC,0xDE, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBA,0xAA,0xEA,0x8A,0xEE,0xED,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xBD,0xCC,0xBD,0xCC,0xCC,0xCC,0xCC,0xCD,0xBD, + 0xCC,0xBD,0xCD,0xBD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCC,0xBB,0xBB,0xB9,0x87,0x55,0x54, + 0x54,0x54,0x45,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x44,0x45,0x67,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x77,0x87, + 0x87,0x77,0x78,0x77,0x78,0x77,0x77,0x87,0x78,0x77,0x77,0x87,0x78,0x78,0x77,0x87, + 0x77,0x78,0x77,0x87,0x78,0x77,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x77,0x77,0x78, + 0x77,0x75,0x67,0x77,0x56,0x77,0x87,0x77,0x77,0x77,0x77,0x87,0x78,0x78,0x77,0x87, + 0x87,0x87,0x87,0x77,0x78,0x77,0x87,0x87,0x77,0x78,0x77,0x77,0x54,0x44,0x44,0x45, + 0x44,0x44,0x55,0x55,0x66,0x65,0x55,0x54,0x54,0x46,0x98,0x8A,0x74,0x45,0x44,0x44, + 0x44,0x45,0x45,0x45,0x44,0x44,0x44,0x55,0x67,0x78,0x9B,0xCB,0xBB,0xBA,0xBB,0xBB, + 0xAB,0xBA,0xAA,0xAA,0xBA,0xBB,0xBB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xCB,0xBB,0xBB,0xBA, + 0x99,0x89,0x99,0x9A,0xAA,0xAC,0xCB,0xAA,0xAA,0x9A,0xA9,0xAA,0xAA,0xAA,0x9A,0xA9, + 0xAA,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBA,0xAB,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xCD, + 0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCC,0xBA,0xA9,0xCB,0x89,0xEE,0xEE,0xCD,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xBC,0xBC,0xDB,0xCD,0xBC,0xCB,0xCC,0xCC,0xCC, + 0xCC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xCB,0xBB,0xBB,0xA9,0x87,0x65,0x54, + 0x54,0x44,0x54,0x44,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x57,0x77,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x77, + 0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x77,0x87,0x78, + 0x78,0x77,0x87,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x77,0x77,0x77,0x77,0x77,0x87, + 0x77,0x77,0x56,0x77,0x66,0x77,0x77,0x77,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x77, + 0x77,0x77,0x78,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x77,0x65,0x45,0x44,0x54,0x44, + 0x54,0x54,0x55,0x68,0xAD,0xD8,0x65,0x55,0x44,0x44,0x6A,0x99,0x94,0x44,0x44,0x54, + 0x45,0x44,0x44,0x44,0x54,0x54,0x55,0x56,0x77,0x89,0x9A,0xAB,0xCB,0xBB,0xAA,0xAA, + 0xAC,0xBB,0xAA,0xBA,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDB,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBC,0xBC,0xBC,0xBC,0xBB,0xBB, + 0xA8,0x98,0x99,0x9A,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0xA9,0xA9, + 0x99,0x99,0x99,0x89,0x9A,0xAB,0xAB,0xBB,0xAB,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xDD,0xCD,0xDB,0xBB,0xBB,0xBB,0xBD, + 0xDE,0xEF,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xBB,0xAA,0xAD,0x98,0xDE,0xFE,0xDC,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xDD,0xDC,0xDB,0xDC,0xCB,0xBD,0xCC,0xCB,0xDC,0xDC,0xCC,0xBB,0xCC,0xBD, + 0xBD,0xBD,0xCD,0xCD,0xBD,0xCD,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBA,0x87,0x65,0x54, + 0x54,0x45,0x44,0x54,0x54,0x44,0x45,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x77,0x78,0x77,0x77,0x87,0x78,0x77,0x78,0x77,0x87, + 0x87,0x87,0x78,0x77,0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x87,0x78,0x78,0x77,0x87, + 0x77,0x87,0x77,0x87,0x77,0x77,0x78,0x77,0x87,0x77,0x87,0x87,0x76,0x77,0x67,0x77, + 0x77,0x77,0x66,0x67,0x77,0x77,0x77,0x77,0x78,0x77,0x77,0x87,0x77,0x78,0x77,0x78, + 0x78,0x78,0x77,0x87,0x77,0x87,0x77,0x87,0x77,0x77,0x76,0x44,0x44,0x44,0x44,0x54, + 0x44,0x45,0x56,0x9E,0xEE,0xEE,0xC7,0x55,0x55,0x44,0x46,0x9A,0x74,0x44,0x54,0x44, + 0x44,0x44,0x54,0x54,0x45,0x45,0x55,0x66,0x78,0x89,0x9A,0x9A,0xAB,0xBB,0xAA,0xAA, + 0xDE,0xCA,0xAA,0xBB,0xBB,0xBB,0xBC,0xBD,0xCC,0xDC,0xDD,0xCD,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xBC,0xBB, + 0xBA,0x88,0x99,0x99,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xA9,0xAA,0xA9,0xAA,0x9A,0x9A, + 0x99,0x99,0x99,0x89,0x9A,0xAA,0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAB,0xAB,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDB,0xBB,0xBB,0xBB, + 0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDB,0xBB,0xAA,0x9D,0xA8,0xBE,0xEE,0xEC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xCD,0xBC,0xCD,0xBC,0xCB,0xCC,0xCC,0xCC,0xCB,0xCB,0xCB,0xCC, + 0xDC,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0x87,0x66,0x54, + 0x54,0x54,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x44,0x44,0x45,0x44,0x54,0x57,0x77,0x78,0x78,0x78,0x78,0x78,0x77,0x78,0x77, + 0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x78, + 0x77,0x87,0x87,0x78,0x78,0x78,0x77,0x87,0x77,0x87,0x77,0x77,0x66,0x66,0x57,0x77, + 0x75,0x67,0x75,0x57,0x77,0x77,0x77,0x87,0x77,0x87,0x87,0x78,0x78,0x77,0x87,0x87, + 0x77,0x77,0x78,0x77,0x87,0x77,0x87,0x77,0x87,0x77,0x54,0x54,0x44,0x54,0x44,0x44, + 0x55,0x55,0x57,0xCD,0xDE,0xDE,0xDB,0x75,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x54, + 0x44,0x44,0x44,0x44,0x55,0x45,0x55,0x67,0x78,0x99,0x99,0xA9,0x9A,0x9A,0xBA,0xAA, + 0xCD,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xAB,0xBA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xCC,0xCB,0xCB,0xBC, + 0xBB,0x99,0x89,0x99,0x99,0xA9,0xAA,0x9A,0xAA,0xAA,0x9A,0x99,0xA9,0xA9,0xA9,0x99, + 0x99,0x99,0x98,0x99,0xAA,0xAA,0xBB,0xAB,0xAB,0xBA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA, + 0xBA,0xBB,0xAB,0xBA,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB,0xBA,0xBB, + 0xBD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xCB,0xAA,0xAA,0xC8,0x9E,0xEE,0xED,0xBC,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xDC,0xDC,0xBD,0xCC,0xDC,0xDC,0xCC,0xBC,0xCC,0xCB,0xBB,0xBD,0xBD, + 0xCD,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB,0xAB,0xAA,0xBB,0xBB,0xBB,0xBA,0x98,0x76,0x55, + 0x45,0x45,0x45,0x45,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x44,0x45,0x44, + 0x44,0x54,0x45,0x44,0x44,0x44,0x45,0x77,0x87,0x77,0x77,0x77,0x87,0x87,0x87,0x78, + 0x77,0x87,0x78,0x77,0x78,0x77,0x87,0x78,0x78,0x77,0x78,0x77,0x87,0x77,0x87,0x87, + 0x87,0x78,0x77,0x87,0x87,0x77,0x87,0x78,0x78,0x77,0x78,0x77,0x77,0x76,0x77,0x77, + 0x76,0x77,0x77,0x87,0x78,0x77,0x77,0x78,0x78,0x78,0x77,0x87,0x87,0x78,0x78,0x77, + 0x88,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x64,0x54,0x44,0x54,0x44,0x44,0x54, + 0x45,0x57,0x88,0xDC,0xCB,0xDE,0xEE,0xB7,0x55,0x54,0x54,0x54,0x54,0x54,0x44,0x44, + 0x45,0x44,0x54,0x45,0x44,0x55,0x56,0x67,0x89,0x99,0x9A,0x99,0x99,0x99,0xA9,0xAA, + 0xAA,0xAA,0xBB,0xCB,0xBB,0xBB,0xBC,0xBC,0xBD,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xAB,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBA,0xBB,0xBB,0xCC,0xCC,0xBC, + 0xBB,0xA9,0x88,0x99,0x99,0x99,0x99,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xA9,0x99,0x99, + 0x99,0x89,0x88,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB, + 0xBB,0xBA,0xBA,0xAB,0xAB,0xBB,0xBC,0xCC,0xDC,0xDC,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB, + 0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xBB,0xBA,0x99,0xD9,0x8D,0xEE,0xFE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xCC,0xDB,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCD, + 0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xAB,0xAA,0xBB,0xBB,0xBA,0xBB,0xAB,0x98,0x76,0x55, + 0x44,0x54,0x44,0x44,0x44,0x54,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x45,0x45,0x67,0x77,0x87,0x87,0x87,0x77,0x78,0x77,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x77,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x77, + 0x78,0x77,0x87,0x87,0x78,0x78,0x78,0x77,0x77,0x87,0x87,0x77,0x55,0x76,0x67,0x66, + 0x77,0x77,0x77,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x87,0x78,0x78,0x78,0x77,0x87, + 0x77,0x77,0x87,0x78,0x77,0x77,0x87,0x77,0x75,0x54,0x45,0x45,0x45,0x44,0x54,0x44, + 0x55,0x8E,0xED,0xDE,0x85,0x7E,0xEE,0xEA,0x65,0x54,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x45,0x44,0x54,0x55,0x55,0x66,0x78,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA, + 0xAA,0xAB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xDC,0xDB,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB, + 0xBB,0xBB,0x99,0x98,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x98,0x98,0x88,0x89,0xBD,0xDB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB, + 0xAB,0xAB,0xAA,0xAA,0xBA,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB, + 0xBB,0xCD,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xCB,0xBA,0xA9,0xCA,0x8A,0xEE,0xEE,0xEB,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xDC,0xBD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xCB,0xBD,0xCD, + 0xCD,0xBD,0xCC,0xCC,0xBB,0xBB,0xBB,0xAA,0xAA,0xBA,0xBB,0xBB,0xBA,0x98,0x76,0x55, + 0x55,0x45,0x44,0x54,0x54,0x44,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x54, + 0x44,0x54,0x44,0x54,0x45,0x44,0x44,0x46,0x77,0x78,0x78,0x77,0x87,0x87,0x78,0x78, + 0x78,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x78,0x77,0x77,0x87, + 0x87,0x78,0x77,0x77,0x87,0x77,0x87,0x78,0x78,0x77,0x77,0x77,0x67,0x76,0x77,0x57, + 0x65,0x77,0x77,0x87,0x87,0x87,0x77,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x78,0x78, + 0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x77,0x54,0x45,0x44,0x44,0x44,0x45,0x45,0x55, + 0x55,0x9E,0xDE,0xDE,0x75,0x57,0xCE,0xDE,0xB6,0x55,0x45,0x45,0x44,0x44,0x44,0x44, + 0x44,0x44,0x45,0x45,0x45,0x66,0x67,0x89,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAA, + 0xAA,0xBB,0xBD,0xCB,0xCB,0xBC,0xBC,0xBB,0xBB,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBA,0xBA,0xBB,0xBB,0xCB,0xBC, + 0xBB,0xBB,0xB9,0x99,0x89,0x89,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99, + 0x88,0x88,0x88,0x89,0xAA,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB, + 0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xBB,0xBB, + 0xBB,0xBD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xDB,0xBA,0xA9,0xAD,0x99,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDC,0xDB,0xDB,0xDC,0xDD,0xCD,0xBB,0xBB,0xBB,0xBB,0xCC,0xDB,0xCC, + 0xCC,0xDC,0xCB,0xCB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBB,0xBA,0xBB,0xAB,0xA8,0x77,0x55, + 0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x67,0x77,0x77,0x78,0x77,0x78,0x77,0x87, + 0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x77,0x78,0x77,0x87,0x87,0x77, + 0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x77,0x87,0x87,0x76,0x67,0x77,0x76,0x77,0x77, + 0x76,0x77,0x77,0x78,0x77,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x87,0x77, + 0x77,0x87,0x78,0x77,0x87,0x77,0x77,0x65,0x45,0x44,0x45,0x45,0x45,0x45,0x55,0x55, + 0x55,0x6A,0xED,0xDD,0x86,0x55,0x7C,0xDD,0xE9,0x55,0x44,0x44,0x45,0x45,0x44,0x54, + 0x54,0x54,0x45,0x45,0x55,0x66,0x78,0x89,0xA9,0x99,0xA9,0xA9,0x99,0x9A,0xAA,0xAA, + 0xAA,0xBB,0xDB,0xCD,0xBB,0xCB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBC,0xBB, + 0xBB,0xBB,0xBB,0x98,0x98,0x98,0x89,0x89,0x98,0x99,0x99,0x99,0x99,0x98,0x98,0x88, + 0x98,0x88,0x88,0x89,0xAA,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBC,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xDC,0xBB,0xAA,0x9D,0xA8,0xCE,0xFE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xCC,0xBD,0xCD, + 0xBD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xBA,0xBB,0xAB,0xBB,0xB9,0x87,0x65, + 0x45,0x45,0x45,0x45,0x44,0x45,0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45, + 0x45,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x56,0x77,0x87,0x87,0x87,0x87,0x87,0x78, + 0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78, + 0x77,0x87,0x78,0x77,0x87,0x87,0x78,0x78,0x77,0x76,0x65,0x56,0x77,0x75,0x67,0x77, + 0x77,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x78,0x78, + 0x78,0x78,0x77,0x87,0x78,0x77,0x75,0x54,0x44,0x45,0x44,0x44,0x44,0x55,0x66,0x77, + 0x77,0x66,0xAE,0xDD,0xC7,0x55,0x47,0xCE,0xB6,0x54,0x45,0x45,0x44,0x44,0x44,0x44, + 0x44,0x45,0x45,0x55,0x66,0x67,0x89,0x99,0x9A,0xAA,0xAA,0x99,0x9A,0x99,0xAB,0xAA, + 0xAA,0xBC,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB, + 0xAB,0xBA,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xBA,0xBA,0xBA,0xBB,0xBB,0xCB,0xCB, + 0xCB,0xBB,0xBB,0xB9,0x99,0x88,0x98,0x98,0x89,0x89,0x89,0x98,0x89,0x89,0x88,0x98, + 0x88,0x88,0x88,0x8A,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBA,0xAB, + 0xAA,0xAA,0xAA,0x9A,0xAA,0xBA,0xBA,0xBB,0xCB,0xDC,0xBD,0xDD,0xDD,0xDC,0xDC,0xBB, + 0xAB,0xBB,0xBD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDB,0xBB,0xAA,0x9B,0xB8,0xAE,0xEE,0xEE,0xEC,0xDD,0xDE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xBC,0xBB,0xBB,0xBC,0xCD,0xBC,0xCC, + 0xCC,0xCB,0xBB,0xBA,0xBB,0xAB,0xAA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xA9,0x87,0x66, + 0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x44,0x55, + 0x65,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x45,0x77,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x77,0x87,0x87,0x87,0x78,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x77,0x87, + 0x87,0x78,0x77,0x87,0x78,0x78,0x78,0x77,0x87,0x77,0x65,0x55,0x67,0x76,0x56,0x77, + 0x77,0x78,0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x87,0x78,0x77,0x87, + 0x87,0x77,0x87,0x78,0x77,0x77,0x54,0x44,0x54,0x44,0x54,0x54,0x55,0x55,0x7A,0xDD, + 0xED,0xA7,0x6B,0xED,0xDB,0x75,0x55,0x78,0x55,0x45,0x44,0x44,0x44,0x44,0x44,0x54, + 0x54,0x54,0x54,0x55,0x66,0x68,0x89,0x9A,0xAA,0xAB,0xAA,0xA9,0x99,0x9A,0x9A,0x9A, + 0xBB,0xBC,0xCC,0xCB,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA, + 0xBB,0xAB,0xBB,0xAB,0xAB,0xAA,0xBA,0xAA,0xBA,0xBA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xBC,0xBB,0xB9,0x89,0x88,0x88,0x98,0x88,0x88,0x88,0x98,0x88,0x98,0x88, + 0x88,0x88,0x88,0x9A,0xBC,0xCC,0xBC,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAA,0xBA, + 0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xBB,0xBA,0xBB,0xCD,0xDD,0xCD,0xDD,0xDC,0xDC,0xBB, + 0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xED,0xDD,0xCB,0xAA,0x99,0xD9,0x8D,0xEE,0xFE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xDC,0xBC,0xBD,0xCC, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAA,0xAA,0xBB,0xBB,0xBB,0xAA,0x87,0x65, + 0x55,0x45,0x45,0x54,0x44,0x54,0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x44, + 0x45,0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x57,0x77,0x77,0x78,0x77,0x78,0x77, + 0x87,0x78,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x78,0x78,0x78,0x77, + 0x87,0x87,0x87,0x77,0x87,0x78,0x77,0x78,0x78,0x77,0x65,0x55,0x56,0x77,0x66,0x77, + 0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x77, + 0x77,0x87,0x87,0x87,0x77,0x65,0x54,0x45,0x44,0x54,0x44,0x44,0x55,0x68,0xEE,0xEE, + 0xEE,0xFE,0x86,0xCE,0xDD,0xC7,0x55,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x44, + 0x44,0x54,0x45,0x56,0x66,0x78,0x99,0xAA,0xAA,0xBA,0xBA,0xAA,0x99,0xA9,0x9A,0xAA, + 0xAA,0xBB,0xBB,0xCB,0xCC,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xAB, + 0xBA,0xBB,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xBB, + 0xCB,0xCB,0xCB,0xCC,0xCB,0xA9,0x89,0x99,0x89,0x89,0x88,0x98,0x88,0x89,0x88,0x88, + 0x88,0x88,0x99,0xBB,0xBC,0xBB,0xCC,0xBC,0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAA, + 0xAA,0xAA,0xAA,0x9A,0xAA,0xBA,0xBA,0xBB,0xBB,0xBC,0xCC,0xDC,0xDD,0xDD,0xDC,0xDB, + 0xBB,0xAB,0xBB,0xDD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xBB,0xBA,0xA9,0xDA,0x8A,0xEE,0xEE,0xED,0xCD,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xBD,0xBC,0xDB,0xCC,0xCC, + 0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xBB,0xBB,0xCC,0xBB,0xBA,0x98,0x76, + 0x55,0x54,0x54,0x44,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x45, + 0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x54,0x54,0x45,0x77,0x78,0x77,0x87,0x87,0x87, + 0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x87,0x78,0x77,0x78,0x77,0x87,0x87, + 0x77,0x87,0x78,0x78,0x78,0x77,0x87,0x77,0x77,0x76,0x56,0x55,0x55,0x67,0x78,0x78, + 0x77,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x87, + 0x87,0x78,0x78,0x77,0x76,0x44,0x44,0x44,0x45,0x44,0x54,0x55,0x55,0x7D,0xEE,0xDC, + 0xED,0xDE,0xD7,0x7C,0xEE,0xEE,0x65,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x54, + 0x45,0x45,0x55,0x66,0x68,0x89,0x9A,0xAA,0xBB,0xAB,0xBA,0xA9,0xA9,0x9A,0x9A,0xAA, + 0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xAB,0xBA,0xBA,0xBA, + 0xBB,0xBA,0xBB,0xBA,0xBB,0xAB,0xAA,0xAA,0xAB,0xAA,0xBA,0xBB,0xBB,0xCB,0xBB,0xBC, + 0xBC,0xBC,0xCC,0xDB,0xCD,0xBB,0xB9,0x99,0x99,0x99,0x89,0x88,0x89,0x88,0x88,0x88, + 0x98,0x99,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xCB,0xBC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xCD,0xBC, + 0xBB,0xBB,0xBB,0xBD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xDD,0xCB,0xBA,0xA9,0xAD,0x98,0xDE,0xEE,0xFE,0xDD,0xDD,0xED,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCC,0xCC,0xBC,0xCC,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBA,0xAB,0xBB,0xCC,0xBB,0xBA,0xA8,0x76, + 0x55,0x45,0x45,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44, + 0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x57,0x77,0x78,0x77,0x87,0x78, + 0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x78,0x77,0x77, + 0x87,0x77,0x87,0x87,0x77,0x87,0x76,0x77,0x77,0x77,0x77,0x66,0x55,0x67,0x77,0x77, + 0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78, + 0x77,0x87,0x77,0x77,0x55,0x45,0x45,0x45,0x44,0x54,0x44,0x44,0x56,0xAD,0xEA,0x75, + 0x7C,0xED,0xEB,0x66,0xCE,0xEA,0x65,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x54,0x45, + 0x44,0x45,0x56,0x76,0x78,0x99,0x9A,0xAA,0xAB,0xBB,0xAA,0xA9,0x9A,0x9A,0x9A,0xAB, + 0xAB,0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xCB,0xBB,0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB, + 0xAB,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB, + 0xBC,0xBC,0xBC,0xBC,0xCB,0xCC,0xBC,0xBA,0xA9,0x99,0x99,0x99,0x88,0x88,0x89,0x88, + 0x9A,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA, + 0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDC, + 0xBB,0xBB,0xAB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDB,0xBA,0xAA,0x9D,0xA8,0xAE,0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDB,0xDB,0xBC,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xBA,0xAB,0xAB,0xCD,0xDC,0xCB,0xBB,0xA9,0x87, + 0x65,0x54,0x45,0x44,0x54,0x44,0x54,0x44,0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x44, + 0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x54,0x54,0x54,0x55,0x77,0x77,0x87,0x78,0x78, + 0x77,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87, + 0x78,0x78,0x78,0x78,0x78,0x77,0x76,0x56,0x65,0x76,0x67,0x76,0x56,0x67,0x78,0x78, + 0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x77,0x87, + 0x87,0x78,0x77,0x65,0x44,0x44,0x44,0x44,0x45,0x45,0x55,0x55,0x57,0xDE,0xE9,0x55, + 0x57,0xDD,0xDD,0x75,0x6A,0x85,0x44,0x54,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x44, + 0x45,0x55,0x66,0x67,0x88,0x99,0xAA,0xAB,0xBB,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA, + 0xAB,0xAB,0xBB,0xBB,0xCD,0xCC,0xDB,0xCC,0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xBA, + 0xBA,0xBB,0xAB,0xBB,0xBA,0xBA,0xBA,0xAB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xDB,0xDB,0xCD,0xBC,0xCC,0xDC,0xDC,0xBB,0xA9,0x99,0x88,0x88,0x99,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA, + 0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBC,0xCC,0xDD,0xDD,0xDC,0xDB, + 0xDB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDC,0xBB,0xA9,0xAA,0xC8,0x8D,0xEE,0xEE,0xED,0xCD,0xED,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCB,0xCC,0xCB,0xBB, + 0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBC,0xDC,0xCB,0xBB,0xA9,0x77, + 0x65,0x55,0x54,0x54,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x45, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x67,0x78,0x78,0x78,0x77, + 0x78,0x77,0x87,0x78,0x78,0x78,0x77,0x78,0x77,0x87,0x77,0x87,0x87,0x77,0x78,0x77, + 0x87,0x87,0x77,0x87,0x87,0x77,0x55,0x55,0x66,0x75,0x67,0x87,0x67,0x78,0x77,0x87, + 0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x77,0x87,0x87,0x87, + 0x78,0x78,0x75,0x45,0x45,0x45,0x45,0x44,0x54,0x55,0x55,0x56,0x57,0xEE,0xEB,0x66, + 0x65,0x9E,0xED,0x85,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x45,0x45, + 0x44,0x55,0x67,0x78,0x89,0x9A,0xAA,0xAA,0xBA,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA, + 0xBA,0xBA,0xBB,0xBB,0xCC,0xCD,0xCD,0xCB,0xBB,0xAB,0xAB,0xAA,0xBA,0xAA,0xBA,0xBA, + 0xBA,0xBA,0xBB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xCC,0xCC,0xCD,0xCC,0xCB,0xCB,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBA, + 0xAA,0x9A,0x99,0xAA,0x9A,0x9A,0xAA,0xAB,0xAB,0xAB,0xBB,0xBD,0xCD,0xCD,0xDD,0xDD, + 0xCD,0xBB,0xBB,0xBB,0xBD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xED,0xDD,0xBB,0xAA,0xA9,0xDA,0x8A,0xEE,0xEF,0xEE,0xCD,0xDD,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xBD,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xCD,0xDD,0xDB,0xBA,0xB9,0x87, + 0x76,0x54,0x45,0x45,0x44,0x44,0x54,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x55,0x77,0x77,0x87,0x87, + 0x87,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x77,0x87, + 0x78,0x78,0x78,0x77,0x77,0x77,0x66,0x55,0x57,0x87,0x77,0x77,0x77,0x87,0x78,0x77, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x77,0x87,0x78, + 0x77,0x77,0x54,0x44,0x44,0x44,0x44,0x45,0x45,0x55,0x68,0x76,0x57,0xDE,0xDE,0x86, + 0x66,0x9E,0xEE,0x75,0x45,0x45,0x44,0x54,0x44,0x45,0x44,0x54,0x45,0x44,0x54,0x44, + 0x55,0x55,0x67,0x88,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xBA, + 0xBA,0xBB,0xAB,0xBB,0xCD,0xCD,0xCD,0xCB,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAB,0xAA, + 0xBA,0xBA,0xBA,0xBB,0xAB,0xBA,0xBA,0xBA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xBC,0xCD,0xBD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAB,0xAB,0xBB,0xBA,0xBA,0xAA, + 0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xAB,0xBC,0xCD,0xDD,0xDD,0xDD, + 0xCC,0xBB,0xBB,0xBB,0xBB,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xDD,0xCB,0xBA,0x9A,0xAC,0x88,0xDE,0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDC,0xDB,0xDC,0xCC,0xCC,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBC,0xDD,0xCB,0xAA,0xA9,0x88, + 0x76,0x55,0x54,0x54,0x54,0x54,0x44,0x44,0x44,0x54,0x45,0x44,0x45,0x45,0x44,0x54, + 0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x45,0x67,0x78,0x77,0x78, + 0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x77,0x78,0x77,0x87,0x87,0x87,0x87,0x87, + 0x87,0x77,0x87,0x77,0x76,0x77,0x76,0x55,0x55,0x77,0x87,0x87,0x87,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x78,0x77,0x87, + 0x77,0x65,0x44,0x54,0x54,0x54,0x45,0x44,0x55,0x57,0xBE,0xEA,0x76,0x9F,0xEE,0xDA, + 0x78,0xCE,0xED,0x75,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x54, + 0x55,0x66,0x78,0x99,0x9A,0xAA,0xBA,0xA9,0xAA,0xA9,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xBA,0xBA,0xBB,0xBB,0xCC,0xCD,0xDD,0xCB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xAB,0xBC,0xCC,0xCD,0xCB,0xDC,0xDD,0xDD,0xDE,0xEE,0xED,0xDD,0xDD,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xBA,0xAA,0xBB,0xAB,0xBA, + 0xAA,0xA9,0xA9,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xBD,0xCD,0xDD,0xDD, + 0xDC,0xDC,0xBB,0xAB,0xBB,0xCD,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x9D,0xA8,0xAE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xBD,0xBD,0xBC,0xDC,0xDB,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xBC,0xCC,0xBB,0xBA,0xBB,0xBA,0xBB,0xBC,0xBB,0xBA,0xA9,0x98, + 0x77,0x55,0x45,0x44,0x54,0x45,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44, + 0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x56,0x77,0x87,0x87, + 0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x78,0x78, + 0x78,0x78,0x77,0x76,0x55,0x77,0x87,0x75,0x55,0x57,0x78,0x77,0x87,0x87,0x87,0x87, + 0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x88, + 0x75,0x54,0x45,0x44,0x44,0x44,0x54,0x55,0x55,0x7E,0xEE,0xEE,0xD8,0x6B,0xFE,0xEE, + 0xEE,0xDE,0xE7,0x54,0x54,0x54,0x44,0x54,0x44,0x45,0x44,0x54,0x54,0x54,0x45,0x45, + 0x56,0x67,0x88,0x9A,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xBA,0xAA,0xAB,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xBB,0xCD,0xDD,0xCD,0xBB,0xBB,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA, + 0xAB,0xAA,0xBA,0xAB,0xAB,0xBA,0xAB,0xAA,0xAB,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBC,0xCC,0xCD,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xBA,0xBA,0xAB,0xAB,0xAB,0xBA,0xBA, + 0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD, + 0xDD,0xCC,0xBB,0xBB,0xBB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xDD,0xDC,0xBA,0xAA,0x9A,0xD9,0x8D,0xEE,0xEE,0xED,0xBC,0xDD,0xED,0xDE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCC,0xCD,0xCD,0xCD,0xBC,0xBB,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xBB,0xBC,0xBB,0xBB,0xBC,0xCB,0xBA,0xAA,0x98, + 0x76,0x65,0x55,0x45,0x44,0x54,0x45,0x44,0x54,0x45,0x45,0x44,0x44,0x45,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x67,0x77,0x87, + 0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77, + 0x87,0x87,0x77,0x66,0x67,0x87,0x77,0x76,0x56,0x67,0x77,0x87,0x87,0x87,0x87,0x88, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x78,0x77,0x87,0x87, + 0x54,0x45,0x44,0x45,0x45,0x45,0x45,0x55,0x66,0x8E,0xEE,0xEE,0xED,0x76,0xBE,0xEE, + 0xDE,0xEE,0x85,0x45,0x44,0x44,0x54,0x44,0x45,0x44,0x54,0x44,0x54,0x54,0x54,0x55, + 0x66,0x79,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xAB,0xAB,0xBC,0xCC,0xDC,0xBB,0xBA,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xAA,0xBA,0xBA,0xBA,0xBA,0xAB,0xBA,0xBA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBA,0xBB, + 0xAB,0xBB,0xBB,0xBD,0xCC,0xDC,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xAA, + 0xAA,0x9A,0x99,0xA9,0xA9,0xAA,0xAA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBB,0xCD,0xCD,0xDD, + 0xDD,0xCD,0xBB,0xBB,0xAB,0xBB,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0xCA,0x89,0xEE,0xEE,0xFE,0xDB,0xCD,0xDE,0xDD, + 0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xBD,0xCD,0xCB,0xCB,0xCB,0xCC, + 0xCB,0xBB,0xBA,0xBB,0xBB,0xCC,0xCB,0xBA,0xBB,0xBA,0xAA,0xAB,0xCB,0xA9,0x99,0x99, + 0x87,0x65,0x55,0x45,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x45,0x44,0x45,0x44, + 0x44,0x54,0x45,0x44,0x54,0x54,0x44,0x44,0x54,0x44,0x54,0x45,0x44,0x56,0x77,0x78, + 0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x77,0x75,0x56,0x77,0x77,0x87,0x77,0x56,0x77,0x78,0x78,0x78,0x78,0x78,0x77, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x65, + 0x44,0x54,0x45,0x44,0x44,0x54,0x55,0x68,0x88,0xAE,0xED,0xEE,0xEE,0xC7,0x68,0xBD, + 0xDD,0x96,0x54,0x45,0x45,0x45,0x44,0x54,0x54,0x44,0x44,0x54,0x45,0x45,0x55,0x66, + 0x67,0x88,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAB,0xBA,0xBA,0xAA, + 0xAA,0xAB,0xAA,0xBB,0xBB,0xBC,0xBB,0xBB,0xAB,0xAA,0xAA,0xAB,0xAA,0xBA,0xAB,0xAA, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xAB,0xAA,0xBA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xAB,0xBB,0xDC,0xCD,0xBD,0xDD,0xDE,0xDE,0xEE,0xEE,0xED,0xDD,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBA, + 0xA9,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBC,0xDD,0xDD, + 0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xED,0xDD,0xCB,0xAA,0x99,0xAD,0x98,0xAE,0xEE,0xEE,0xEC,0xDD,0xDD,0xED, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDB,0xDC,0xDD,0xDD,0xCC,0xBC,0xBC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xAB,0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x99, + 0x87,0x76,0x55,0x55,0x54,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x77,0x78, + 0x78,0x77,0x87,0x87,0x78,0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x78,0x78, + 0x77,0x76,0x55,0x55,0x67,0x78,0x77,0x87,0x77,0x78,0x77,0x87,0x87,0x87,0x87,0x88, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x75,0x54, + 0x45,0x45,0x44,0x54,0x45,0x45,0x66,0x8E,0xFE,0xEE,0xB6,0x7B,0xEE,0xFD,0x75,0x55, + 0x54,0x45,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x54,0x45,0x55,0x67, + 0x78,0x99,0xA9,0xA9,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBA, + 0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBA,0xAB,0xAA,0xBA,0xBA,0xAA,0xBA,0xAB,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xDC,0xCC,0xCD,0xDD,0xED,0xEE,0xED,0xDD,0xDD,0xCB,0xBB,0xBB, + 0xAB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBB,0xAB,0xAA, + 0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCD, + 0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x9C,0xA8,0x8D,0xEE,0xEF,0xEE,0xBC,0xDD,0xDD, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xA9,0x99,0x99,0x98,0x98,0x99, + 0x87,0x76,0x55,0x45,0x45,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x44,0x54,0x45,0x44, + 0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x57,0x77, + 0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x77, + 0x77,0x65,0x76,0x55,0x56,0x77,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x76,0x54,0x45, + 0x55,0x55,0x54,0x45,0x45,0x55,0x68,0xDE,0xEE,0xED,0xA6,0x56,0xAE,0xDD,0xC6,0x55, + 0x45,0x44,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x44,0x45,0x45,0x45,0x55,0x56,0x67, + 0x89,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xAA,0xAB,0xAB,0xAB,0xBB,0xAB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xCD,0xCD,0xCD,0xDD,0xDE,0xDE,0xDD,0xDD,0xCD,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xBB,0xBA,0xBA,0xBB,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xAB,0xBA,0xAA, + 0xAA,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD, + 0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0xD9,0x8A,0xEE,0xEE,0xEE,0xDD,0xDD,0xED, + 0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDB,0xDD,0xCD,0xDD,0xDC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBA,0xBB,0xAB,0xAA,0xAA,0x99,0x99,0x99,0x99,0x99, + 0xA8,0x76,0x65,0x55,0x45,0x45,0x45,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x45,0x44,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x77, + 0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x75,0x57,0x77,0x55,0x55,0x67,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x77,0x55,0x45,0x44, + 0x56,0x75,0x55,0x54,0x55,0x57,0x7C,0xFE,0xEE,0xEE,0xE8,0x65,0x6E,0xED,0xE9,0x55, + 0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x54,0x44,0x55,0x55,0x66,0x78, + 0x89,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xAB, + 0xAA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xAB,0xAB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBD,0xCC,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xAB,0xAA, + 0xA9,0xAA,0x9A,0xA9,0xA9,0xAA,0xAA,0xBB,0xBC,0xCD,0xCD,0xCB,0xBB,0xBB,0xBC,0xCD, + 0xCD,0xDD,0xDC,0xDC,0xCB,0xBA,0xBB,0xBD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEF,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0xBB,0x88,0xDE,0xEE,0xEE,0xEB,0xCD,0xDD, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xCD,0xDC,0xDD,0xDD,0xDC,0xBB,0xBB, + 0xBA,0xBA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBA,0xBA,0xAA,0x9A,0x99,0x99,0x99,0x89,0x89, + 0x98,0x86,0x65,0x55,0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x45, + 0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x45,0x57, + 0x77,0x78,0x78,0x77,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87, + 0x76,0x77,0x77,0x75,0x55,0x57,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x75,0x45,0x44,0x55, + 0x58,0xDA,0x75,0x54,0x55,0x8D,0xDB,0xEE,0x9A,0xDE,0xEE,0x86,0x57,0xDE,0xC7,0x54, + 0x54,0x44,0x45,0x45,0x45,0x44,0x54,0x45,0x45,0x44,0x45,0x45,0x55,0x66,0x68,0x89, + 0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBA,0xBB,0xAB, + 0xAB,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA, + 0xAA,0xBA,0xBA,0xBA,0xAA,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCB,0xCB,0xBB,0xBB, + 0xBB,0xCB,0xBC,0xCC,0xCC,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDC,0xCC,0xBB,0xBB,0xBA, + 0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xBA,0xBB,0xAB,0xAB,0xBB,0xAB,0xAB,0xAA,0xAA, + 0x9A,0x9A,0x9A,0x9A,0xAA,0xAA,0xAB,0xAB,0xBC,0xDD,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD, + 0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xED,0xDD,0xBB,0xAA,0x99,0x8D,0xA8,0xAE,0xEE,0xFE,0xED,0xBD,0xDD, + 0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0x98,0x99, + 0x99,0x87,0x76,0x55,0x45,0x45,0x45,0x45,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x44, + 0x45,0x45,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x45, + 0x77,0x87,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x78,0x78,0x77,0x56,0x67,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x76,0x45,0x44,0x45,0x45, + 0x6A,0xEE,0x85,0x55,0x55,0xCE,0xDE,0xE9,0x56,0xAE,0xEE,0xD8,0x65,0x57,0x65,0x45, + 0x45,0x45,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x45,0x44,0x45,0x56,0x67,0x88,0x89, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xA9,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBA,0xBB,0xAB,0xAB, + 0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB, + 0xBB,0xBC,0xCB,0xCB,0xCC,0xCC,0xDD,0xDD,0xED,0xED,0xED,0xDD,0xDC,0xCB,0xBB,0xBB, + 0xBB,0xAB,0xAA,0xAB,0xBA,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xAB,0xBA,0xBA,0xAA,0xAA, + 0xAA,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xBD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xCC, + 0xCD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBA,0xBB,0xCD,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x9A,0xD9,0x8C,0xEE,0xEE,0xEE,0xCD,0xCD, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDB,0xBB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xA9,0x99,0x99,0x99,0x89, + 0x89,0x88,0x76,0x55,0x55,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x44,0x54,0x45,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x45, + 0x57,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x77,0x66,0x77,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x88,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x77,0x54,0x44,0x54,0x54,0x55, + 0x8D,0xED,0x76,0x55,0x65,0x7D,0xEE,0xDB,0x75,0x5A,0xEE,0xFE,0x85,0x54,0x45,0x44, + 0x44,0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x54,0x45,0x45,0x55,0x67,0x78,0x89,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xBB,0xAB,0xAB,0xBB,0xBB,0xBA, + 0xAA,0xAA,0xAB,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCB,0xCB,0xCB,0xBB, + 0xBB,0xCB,0xCC,0xBC,0xBC,0xBC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB, + 0xAB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xAB,0xAB,0xBA,0xAB,0xAA,0xAA,0xA9, + 0xA9,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA,0xBB,0xCC,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBC, + 0xDC,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xDA,0x89,0xEE,0xEE,0xEE,0xEC,0xDD, + 0xDE,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xBB, + 0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0x9A,0xAA,0xAA,0x99,0x99,0x99,0x89, + 0x98,0x98,0x77,0x65,0x54,0x55,0x45,0x45,0x44,0x54,0x44,0x44,0x54,0x44,0x44,0x44, + 0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x44,0x54,0x44, + 0x45,0x77,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x77,0x78,0x78,0x87,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x88, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x65,0x44,0x54,0x44,0x44,0x55, + 0x9E,0xE8,0x66,0x77,0x76,0x58,0xED,0xEE,0x86,0x56,0xBE,0xEE,0xD6,0x55,0x44,0x45, + 0x45,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x45,0x45,0x45,0x56,0x67,0x89,0x99,0xAA, + 0xAA,0xAA,0xBB,0xAB,0xA9,0xA9,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBA,0xBB,0xAB, + 0xBB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xBB, + 0xBB,0xBC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xCC,0xCB,0xCB,0xBB,0xBB,0xAB, + 0xBA,0xBA,0xAB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xBB,0xBD,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB, + 0xBD,0xCD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x9D,0x98,0xBE,0xEE,0xFE,0xED,0xDD, + 0xDE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB, + 0xBA,0xAA,0x9A,0xAA,0xA9,0xA9,0xA9,0xA9,0x9A,0xAA,0xAA,0x99,0x99,0x99,0x99,0x98, + 0x99,0x98,0x87,0x66,0x55,0x44,0x54,0x45,0x45,0x44,0x54,0x44,0x44,0x54,0x45,0x44, + 0x44,0x54,0x54,0x54,0x44,0x45,0x45,0x44,0x44,0x44,0x54,0x54,0x45,0x44,0x44,0x54, + 0x45,0x57,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x76,0x45,0x45,0x44,0x54,0x54,0x56, + 0xBE,0xB7,0x7A,0xBC,0xB8,0x75,0x8E,0xDE,0xD8,0x65,0x6B,0xDB,0x65,0x45,0x45,0x44, + 0x44,0x44,0x45,0x44,0x45,0x44,0x54,0x45,0x44,0x54,0x55,0x66,0x78,0x89,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAB,0xBA,0xBB,0xBA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBC, + 0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB, + 0xAB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xA9, + 0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB, + 0xBC,0xDC,0xDD,0xDD,0xDC,0xCC,0xBB,0xBB,0xBB,0xBD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x8B,0xB8,0x8E,0xEE,0xEE,0xEE,0xCD, + 0xDD,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB, + 0xBA,0xAA,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAA,0x99,0x99,0x99,0x99, + 0x98,0x99,0x88,0x76,0x55,0x55,0x45,0x44,0x54,0x54,0x45,0x45,0x45,0x44,0x44,0x54, + 0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x55,0x44,0x54,0x45, + 0x44,0x45,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x88,0x78,0x78,0x87, + 0x88,0x78,0x78,0x78,0x77,0x87,0x87,0x87,0x77,0x55,0x44,0x44,0x54,0x44,0x44,0x56, + 0xBE,0x87,0xDF,0xFF,0xEE,0xC7,0x58,0xEE,0xEE,0x85,0x55,0x76,0x55,0x45,0x44,0x54, + 0x54,0x45,0x44,0x45,0x44,0x54,0x45,0x44,0x54,0x55,0x56,0x68,0x88,0xAA,0xAA,0xAA, + 0xBB,0xCC,0xBB,0xAA,0xA9,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB, + 0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBA,0xAB,0xBA,0xBB,0xBB,0xBB,0xCB,0xCB, + 0xCB,0xCB,0xCC,0xBB,0xBB,0xAB,0xAA,0xAA,0xBA,0xBB,0xAB,0xAA,0xBB,0xAB,0xBB,0xBA, + 0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDC,0xDC,0xBB,0xBB, + 0xBC,0xBD,0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xAB,0xBC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0xDA,0x8A,0xEE,0xEE,0xFE,0xDC, + 0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB, + 0xBA,0xA9,0xA9,0x9A,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA,0x9A,0x9A,0x99,0x99,0x99, + 0x99,0x99,0x98,0x77,0x65,0x54,0x54,0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44, + 0x45,0x45,0x44,0x54,0x45,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, + 0x44,0x54,0x57,0x78,0x78,0x78,0x77,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x87,0x88,0x78,0x78,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x65,0x44,0x54,0x54,0x45,0x44,0x54,0x54, + 0x56,0x7B,0xFF,0xED,0xDE,0xED,0x86,0x9E,0xEE,0xE7,0x55,0x45,0x44,0x54,0x54,0x44, + 0x44,0x44,0x45,0x44,0x54,0x45,0x44,0x54,0x54,0x56,0x67,0x88,0x8A,0xAA,0xAA,0xAB, + 0xBC,0xCC,0xBA,0xAA,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xBC,0xBC,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB, + 0xAB,0xAB,0xAA,0xBA,0xBA,0xAA,0xBA,0xAB,0xAB,0xAA,0xAA,0xAA,0xA9,0xAA,0x9A,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDC,0xCC,0xBB, + 0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xAC,0x98,0xCE,0xEE,0xEE,0xED, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDB, + 0xBB,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xA9,0x99,0x99,0x99, + 0x99,0x99,0x99,0x87,0x66,0x55,0x54,0x54,0x54,0x54,0x44,0x45,0x45,0x44,0x45,0x44, + 0x54,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x54, + 0x54,0x44,0x46,0x77,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x87,0x87,0x87,0x88,0x78,0x75,0x45,0x45,0x45,0x45,0x54,0x54,0x45,0x55, + 0x55,0x8E,0xDB,0x76,0xAE,0xEE,0xA6,0x5A,0xED,0xFB,0x65,0x45,0x45,0x44,0x54,0x54, + 0x45,0x45,0x44,0x54,0x45,0x44,0x45,0x44,0x55,0x66,0x78,0x99,0xAA,0xAB,0xAB,0xBC, + 0xDD,0xBB,0xAA,0x9A,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xCB,0xCC,0xCC,0xBB,0xAB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBC, + 0xBC,0xCC,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBA, + 0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBA,0xAA,0xAA,0xBB,0xCC,0xDD,0xDD,0xCC,0xBB, + 0xBB,0xBC,0xBD,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBD,0xDE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8D,0xA8,0xAE,0xEE,0xEF,0xEE, + 0xDD,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xBB,0xAA,0x99,0x99,0x99,0x99,0x98,0x99,0x98,0x99,0x9A,0xAA,0x9A,0x99,0x99,0x99, + 0x99,0x99,0x99,0x88,0x76,0x65,0x54,0x45,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x45, + 0x44,0x54,0x44,0x54,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x44,0x44, + 0x44,0x54,0x45,0x67,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x88, + 0x78,0x78,0x78,0x78,0x78,0x77,0x76,0x54,0x54,0x54,0x55,0x55,0x65,0x55,0x55,0x55, + 0x56,0xBE,0xEB,0x79,0xEE,0xEA,0x77,0x55,0x9E,0x96,0x54,0x54,0x45,0x45,0x44,0x54, + 0x54,0x44,0x54,0x44,0x54,0x54,0x54,0x55,0x55,0x67,0x88,0x9A,0xAA,0xBB,0xBB,0xDD, + 0xCC,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xBA, + 0xAB,0xAA,0xAB,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9, + 0xAA,0xAA,0xBB,0xBC,0xCD,0xBD,0xBD,0xBC,0xCB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xAB,0xAB, + 0xAB,0xAA,0xBA,0xAA,0xBA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCD,0xDC,0xDC,0xBB, + 0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDB,0xCB,0xBB,0xAB,0xBC,0xDE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x9A,0xD9,0x8B,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD, + 0xCB,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x89,0x89,0x9A,0xAA,0xAA,0xA9,0xA9,0x99, + 0x99,0x9A,0xAA,0x98,0x77,0x66,0x55,0x54,0x54,0x54,0x45,0x45,0x45,0x44,0x45,0x44, + 0x44,0x45,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54,0x44, + 0x44,0x44,0x54,0x46,0x77,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x87,0x87, + 0x87,0x87,0x87,0x87,0x87,0x77,0x55,0x44,0x44,0x45,0x55,0x78,0x65,0x55,0x55,0x78, + 0x66,0xCD,0xDD,0xBE,0xED,0x86,0x9D,0x75,0x56,0x54,0x54,0x54,0x54,0x44,0x54,0x44, + 0x44,0x54,0x45,0x45,0x45,0x45,0x45,0x56,0x66,0x78,0x8A,0xAA,0xBB,0xBB,0xDD,0xDD, + 0xBB,0xAA,0x9A,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xCC,0xCC,0xBC,0xCB,0xDC,0xCB,0xBB,0xBA,0xBB,0xAB,0xAB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB, + 0xBA,0xBA,0xAA,0xBA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xAA,0xAA,0xAA,0xAB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBC,0xDD,0xDC,0xDC, + 0xCB,0xBB,0xCC,0xCC,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xBB,0x88,0xDE,0xEE,0xEE, + 0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDB,0xBA,0xA9,0x99,0x98,0x99,0x99,0x98,0x98,0x99,0x99,0xAA,0xAA,0xA9,0x99,0x9A, + 0xAB,0xBA,0xAA,0xA9,0x87,0x76,0x65,0x54,0x54,0x54,0x54,0x44,0x44,0x54,0x44,0x45, + 0x45,0x44,0x44,0x44,0x44,0x45,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x44,0x44,0x54, + 0x45,0x44,0x44,0x54,0x67,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x88,0x78,0x88,0x78,0x87,0x87,0x87, + 0x87,0x87,0x87,0x88,0x77,0x75,0x44,0x45,0x45,0x45,0x68,0xBE,0xA6,0x56,0x68,0xDE, + 0x86,0x9E,0xEE,0xEF,0xD8,0x68,0xEE,0xB6,0x54,0x45,0x45,0x44,0x45,0x45,0x45,0x45, + 0x45,0x44,0x44,0x45,0x45,0x45,0x55,0x67,0x78,0x89,0xBB,0xBB,0xBB,0xDD,0xDD,0xDB, + 0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA, + 0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA, + 0xAA,0xBB,0xBC,0xCD,0xBD,0xCD,0xCD,0xCC,0xDB,0xCB,0xAB,0xBA,0xBB,0xBB,0xAB,0xBB, + 0xAB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB, + 0xAB,0xAB,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xA9,0xA9,0xA9,0xAA,0xAA,0xAB,0xBB,0xCC,0xDD,0xCC, + 0xCB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCC,0xBA,0xAA,0x99,0x8D,0x98,0xAE,0xEE,0xEE, + 0xED,0xCD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD, + 0xDD,0xBB,0xAA,0x99,0x99,0x99,0x99,0x89,0x99,0x89,0x99,0xAA,0xAA,0xAA,0x99,0xAA, + 0xBC,0xBA,0xAB,0xAA,0x98,0x77,0x75,0x55,0x54,0x54,0x54,0x54,0x54,0x45,0x44,0x54, + 0x44,0x54,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44, + 0x44,0x45,0x45,0x44,0x46,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x87,0x88,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78, + 0x87,0x88,0x78,0x78,0x75,0x44,0x54,0x54,0x44,0x45,0x8F,0xEE,0xE9,0x66,0x7E,0xEE, + 0x96,0x6D,0xEE,0xDD,0x88,0xAE,0xEE,0x96,0x55,0x45,0x44,0x54,0x54,0x54,0x54,0x54, + 0x54,0x54,0x54,0x54,0x54,0x55,0x56,0x67,0x88,0xAC,0xDD,0xCB,0xDD,0xDD,0xDD,0xBB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xAB, + 0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xBC,0xBD,0xCC,0xDC,0xCC,0xCC,0xCD,0xCC,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xAB, + 0xBA,0xBB,0xAB,0xAB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xBA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xAB,0xAB,0xBB,0xBA,0xA9,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA,0xAB,0xBD,0xCD,0xDD, + 0xCD,0xCB,0xCC,0xCB,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xAB,0xBB,0xDD,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x8A,0xC9,0x8B,0xEE,0xEE, + 0xEE,0xCD,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xBB,0xAA,0x99,0x99,0x99,0x89,0x89,0x89,0x98,0x99,0x9A,0xAA,0xAA,0xA9,0xAA, + 0xBA,0xAB,0xBB,0xAB,0xA9,0x87,0x77,0x65,0x54,0x54,0x45,0x44,0x45,0x44,0x44,0x44, + 0x54,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x54,0x54,0x44,0x44,0x44,0x45,0x44, + 0x44,0x44,0x44,0x45,0x45,0x67,0x78,0x78,0x78,0x78,0x87,0x87,0x88,0x78,0x87,0x88, + 0x78,0x87,0x87,0x88,0x77,0x87,0x87,0x88,0x78,0x87,0x88,0x78,0x78,0x78,0x78,0x78, + 0x78,0x78,0x78,0x87,0x54,0x54,0x44,0x44,0x54,0x55,0x6A,0xED,0xEE,0x96,0x7E,0xEE, + 0xA6,0x57,0xEE,0xEE,0xEE,0xEF,0xEA,0x65,0x45,0x44,0x54,0x45,0x44,0x54,0x45,0x45, + 0x44,0x45,0x44,0x54,0x55,0x56,0x66,0x78,0x9B,0xDD,0xDD,0xDD,0xDE,0xDD,0xDB,0xBA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAA, + 0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBC,0xDB,0xDC,0xCC,0xCB,0xCC,0xCD,0xCD,0xBB,0xBB,0xAB,0xBB,0xBB,0xAB,0xBA, + 0xBB,0xAB,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xAB,0xBA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA, + 0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0xAA,0xBB,0xCD,0xDD, + 0xDC,0xBC,0xCB,0xCD,0xCD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xAA,0xA9,0x98,0xDA,0x8A,0xEE,0xEE, + 0xEE,0xEC,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD, + 0xDD,0xCB,0xBA,0xA9,0x99,0x89,0x99,0x99,0x99,0x89,0x99,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBB,0xBB,0xBB,0xA8,0x77,0x75,0x55,0x54,0x54,0x54,0x54,0x44,0x54,0x45, + 0x44,0x44,0x45,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44, + 0x44,0x44,0x45,0x44,0x44,0x56,0x77,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x78,0x87, + 0x88,0x78,0x87,0x87,0x88,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x87,0x88,0x78,0x87, + 0x87,0x87,0x87,0x65,0x44,0x45,0x44,0x54,0x45,0x44,0x45,0xAE,0xEE,0xE8,0x7B,0xEE, + 0xA6,0x65,0x8C,0xEE,0xEE,0xEE,0x96,0x55,0x44,0x54,0x44,0x54,0x45,0x45,0x45,0x44, + 0x54,0x54,0x45,0x45,0x56,0x66,0x77,0x88,0xCE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xAA, + 0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA, + 0xAB,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB, + 0xBC,0xBD,0xBD,0xCC,0xCB,0xBB,0xBB,0xDC,0xDC,0xDC,0xBB,0xBB,0xAB,0xAB,0xBB,0xAB, + 0xAA,0xBB,0xAB,0xAB,0xBB,0xBA,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBA,0xBA,0xBA,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xAB,0xAA,0xAB,0xAB, + 0xAB,0xBB,0xBB,0xBA,0xAA,0x9A,0x99,0xAA,0xAA,0xA9,0xA9,0xA9,0xAA,0xAB,0xCC,0xDD, + 0xDD,0xDC,0xCC,0xCC,0xCC,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xAB,0xBC,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0xAD,0x98,0xBE,0xEE, + 0xEF,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDB,0xBB,0xA9,0x99,0x99,0x89,0x98,0x98,0x98,0x99,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xCB,0xB9,0x87,0x87,0x65,0x54,0x54,0x54,0x45,0x45,0x44,0x44, + 0x45,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x45,0x44,0x44,0x45,0x45,0x44,0x45,0x44, + 0x44,0x44,0x44,0x44,0x54,0x45,0x67,0x78,0x78,0x78,0x78,0x87,0x88,0x78,0x78,0x78, + 0x87,0x87,0x88,0x78,0x77,0x88,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x87,0x87, + 0x87,0x88,0x75,0x45,0x45,0x44,0x45,0x44,0x54,0x54,0x55,0x5B,0xEE,0xEE,0x8A,0xEE, + 0xD8,0x76,0x56,0x8A,0xCA,0x87,0x55,0x45,0x45,0x44,0x54,0x54,0x54,0x54,0x54,0x54, + 0x44,0x45,0x54,0x55,0x66,0x77,0x88,0xAA,0xCE,0xEE,0xEE,0xEE,0xDD,0xCB,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB, + 0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB, + 0xCC,0xCC,0xDC,0xCB,0xBB,0xAB,0xBB,0xCC,0xCC,0xCC,0xBB,0xBA,0xBA,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xBB,0xBA,0xBA,0xAB,0xAA,0xBA,0xBB,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xA9,0xAA,0xAA,0xAB,0xAA,0xBA,0xBA,0xBB, + 0xBB,0xBB,0xAB,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xA9,0x9A,0x9A,0xAA,0xAA,0xBC,0xDD, + 0xDD,0xDD,0xBC,0xCC,0xCD,0xCD,0xDD,0xDD,0xDB,0xCB,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x8D,0xA8,0x9D,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDD,0xDD,0xCB,0xAA,0x99,0x98,0x98,0x99,0x99,0x99,0x99,0x99,0xAA,0xBA,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0x87,0x77,0x66,0x55,0x45,0x44,0x54,0x44,0x54,0x54, + 0x44,0x44,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x44,0x45,0x44,0x45, + 0x45,0x44,0x44,0x54,0x44,0x44,0x56,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x87,0x87, + 0x87,0x88,0x78,0x78,0x88,0x87,0x87,0x88,0x78,0x87,0x88,0x78,0x87,0x87,0x88,0x78, + 0x88,0x86,0x54,0x54,0x44,0x54,0x54,0x45,0x44,0x55,0x55,0x56,0xBE,0xEF,0xED,0xEE, + 0xEF,0xDA,0x87,0x55,0x54,0x45,0x45,0x45,0x44,0x45,0x45,0x45,0x45,0x45,0x45,0x45, + 0x45,0x54,0x55,0x56,0x66,0x78,0x99,0x9A,0xAC,0xEE,0xEE,0xEE,0xDD,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xBB,0xBB,0xBD,0xCC,0xCC,0xCB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAA,0xBA,0xBA, + 0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB, + 0xCB,0xDC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xCB,0xBA,0xBA,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xBA,0xBB,0xAB,0xBA,0xAB,0xAB,0xAA,0xBB,0xAB,0xBB,0xBB,0xBA,0xBB,0xAB, + 0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB, + 0xCB,0xBB,0xBA,0xAA,0xAA,0x9A,0xAA,0xAA,0xBA,0xAA,0xA9,0x9A,0x9A,0xAA,0xBB,0xDD, + 0xDD,0xDD,0xDC,0xDB,0xDB,0xDC,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xAB,0xBD,0xDE,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x99,0xD9,0x8A,0xEE, + 0xEE,0xFE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xBB,0xBA,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xAB, + 0xBB,0xBC,0xBC,0xBC,0xBB,0xCB,0xB8,0x77,0x76,0x65,0x54,0x54,0x45,0x45,0x44,0x44, + 0x54,0x45,0x44,0x44,0x54,0x44,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44, + 0x44,0x44,0x54,0x44,0x45,0x44,0x45,0x77,0x78,0x78,0x87,0x88,0x78,0x88,0x78,0x87, + 0x88,0x78,0x87,0x87,0x87,0x88,0x78,0x87,0x87,0x88,0x78,0x87,0x78,0x87,0x87,0x87, + 0x87,0x54,0x45,0x45,0x45,0x44,0x44,0x54,0x55,0x56,0x66,0x65,0x6B,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xED,0x96,0x55,0x45,0x44,0x44,0x45,0x44,0x54,0x54,0x54,0x54,0x54,0x54, + 0x54,0x55,0x56,0x66,0x78,0x99,0x9A,0x9A,0xAA,0xDF,0xEE,0xED,0xDB,0xBA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBC,0xCC,0xCC,0xCB,0xBB,0xAB,0xAB,0xBB,0xBA,0xBA,0xBA,0xAA,0xAA, + 0xBA,0xAB,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC, + 0xCC,0xCC,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCB,0xBB,0xAA,0xAA,0xBA,0xBA, + 0xAB,0xAB,0xBB,0xBA,0xBA,0xAA,0xBA,0xAA,0xBA,0xAA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB, + 0xBA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xBB,0xBC, + 0xBB,0xBB,0xBA,0xAA,0x9A,0x9A,0xAB,0xAB,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xBB,0xCD, + 0xDE,0xDD,0xDD,0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0xBC,0x88,0xDE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDD,0xDD,0xDC,0xBA,0xA9,0x99,0x89,0x99,0x99,0x99,0xA9,0xAA,0xAA,0xAB,0xBB,0xBB, + 0xBB,0xCC,0xCC,0xBC,0xCC,0xBB,0xBA,0x88,0x87,0x66,0x55,0x54,0x54,0x54,0x45,0x45, + 0x44,0x44,0x54,0x54,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x54, + 0x45,0x44,0x44,0x45,0x44,0x45,0x44,0x57,0x87,0x88,0x78,0x77,0x88,0x78,0x88,0x78, + 0x87,0x87,0x88,0x78,0x78,0x87,0x88,0x78,0x78,0x78,0x78,0x78,0x88,0x78,0x78,0x88, + 0x64,0x54,0x54,0x44,0x54,0x55,0x45,0x45,0x55,0x66,0x78,0x77,0x67,0xEE,0xEE,0xDB, + 0xDE,0xEE,0xEF,0xB6,0x55,0x54,0x45,0x45,0x44,0x45,0x44,0x54,0x45,0x45,0x45,0x54, + 0x55,0x55,0x66,0x77,0x99,0xAA,0xAA,0xAA,0xAA,0x9C,0xEE,0xED,0xDA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBC,0xBC,0xDC,0xCC,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xAA,0xBA,0xBA, + 0xAB,0xAA,0xAB,0xAA,0xAB,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBC,0xBC, + 0xCC,0xCB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xCB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xBA,0xAA,0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCB, + 0xDC,0xBB,0xAA,0xA9,0xA9,0xAA,0xAA,0xAB,0xBA,0xAA,0xA9,0xA9,0xAA,0xAA,0xBB,0xBD, + 0xDD,0xEE,0xDD,0xDD,0xCC,0xCB,0xDC,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xCD,0xEE, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x8D,0xA8,0xAE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xBB,0xAA,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC, + 0xDC,0xDB,0xCC,0xCC,0xCC,0xBB,0xBB,0xAA,0x87,0x77,0x55,0x55,0x45,0x45,0x44,0x44, + 0x54,0x44,0x44,0x44,0x54,0x44,0x54,0x54,0x45,0x44,0x54,0x54,0x44,0x44,0x44,0x44, + 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x68,0x78,0x78,0x88,0x78,0x87,0x87,0x88, + 0x78,0x88,0x78,0x88,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x87,0x88,0x75, + 0x54,0x44,0x44,0x54,0x44,0x44,0x45,0x45,0x56,0x8A,0xDE,0xDB,0x87,0x7D,0xEE,0xEB, + 0x78,0xBD,0xE9,0x65,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x55, + 0x55,0x66,0x67,0x78,0xAB,0xBA,0xAA,0xAA,0xAA,0xA9,0xBE,0xED,0xBA,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xBC,0xDC,0xCD,0xBC,0xBB,0xBA,0xAA,0xAB,0xAB,0xBA,0xBA,0xBA,0xAA,0xAA, + 0xBA,0xBA,0xAA,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xCC,0xCC, + 0xCB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB,0xBA,0xBA,0xAA,0xAB, + 0xAA,0xBA,0xAA,0xBA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB, + 0xBB,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xCD,0xCD, + 0xCC,0xBB,0xAA,0xAA,0x9A,0xAA,0xAB,0xBA,0xBA,0xAA,0x99,0xA9,0xAA,0xAB,0xBB,0xDD, + 0xDE,0xEE,0xED,0xDD,0xBC,0xCC,0xCD,0xDD,0xDD,0xDC,0xCC,0xBB,0xBA,0xBB,0xBD,0xEE, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x9A,0xD9,0x8B, + 0xEE,0xEE,0xFE,0xEC,0xDD,0xED,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xDD,0xDD,0xDD,0xDB,0xBA,0xA9,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBD,0xBD,0xBD, + 0xCD,0xCC,0xCB,0xCC,0xCC,0xBB,0xBB,0xBA,0x87,0x77,0x75,0x54,0x54,0x54,0x54,0x54, + 0x44,0x54,0x54,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x45,0x44, + 0x54,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x56,0x87,0x88,0x77,0x87,0x88,0x88,0x78, + 0x87,0x87,0x88,0x78,0x78,0x87,0x87,0x88,0x78,0x87,0x88,0x78,0x78,0x87,0x87,0x54, + 0x45,0x44,0x45,0x45,0x55,0x55,0x55,0x55,0x7A,0xEF,0xEE,0xEE,0xEC,0x78,0xEE,0xEE, + 0xC7,0x66,0x75,0x45,0x45,0x45,0x44,0x54,0x54,0x45,0x44,0x45,0x44,0x54,0x55,0x55, + 0x66,0x77,0x78,0x9B,0xCC,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xDA,0xAA,0xAA,0xAA,0xAB, + 0xBB,0xBB,0xDC,0xDC,0xDC,0xCB,0xBA,0xBA,0xAB,0xBA,0xBB,0xAB,0xBA,0xBA,0xAA,0xAA, + 0xBA,0xBA,0xBA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xCC,0xCC, + 0xCB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xBB,0xAB,0xBA,0xBA, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xAA,0xBB,0xBB,0xCB,0xCC,0xCD, + 0xCD,0xCB,0xBA,0xA9,0xA9,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA,0x9A,0xAA,0xAB,0xBB,0xDD, + 0xEE,0xEE,0xEE,0xED,0xDC,0xCB,0xCC,0xCD,0xCD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xDD, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDC,0xBB,0xBA,0xA9,0x98,0xCA,0x88, + 0xDE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xBB,0xAA,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xCC,0xDC,0xCC,0xCC, + 0xDB,0xCD,0xBD,0xCD,0xCC,0xBB,0xBB,0xBC,0xA8,0x77,0x77,0x65,0x55,0x45,0x44,0x45, + 0x45,0x44,0x44,0x45,0x44,0x44,0x54,0x45,0x44,0x44,0x54,0x45,0x45,0x45,0x44,0x44, + 0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x45,0x45,0x78,0x78,0x88,0x88,0x78,0x78,0x87, + 0x88,0x78,0x87,0x88,0x78,0x78,0x78,0x87,0x87,0x88,0x78,0x87,0x87,0x87,0x64,0x44, + 0x54,0x45,0x54,0x55,0x56,0x55,0x55,0x56,0x9E,0xEE,0xEE,0xEE,0xEE,0xA6,0x8E,0xEE, + 0xEB,0x65,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x55,0x45,0x55,0x57, + 0x76,0x78,0x9A,0xCD,0xDD,0xDD,0xBB,0xAA,0xBB,0xAA,0xA9,0xAA,0xAA,0xAA,0xAB,0xAB, + 0xBD,0xBD,0xCD,0xCD,0xCB,0xBB,0xAB,0xBA,0xBA,0xBB,0xAA,0xBA,0xBA,0xBA,0xBA,0xAA, + 0xAB,0xBA,0xAB,0xAB,0xAA,0xBA,0xBA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCD,0xBC, + 0xCB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBA,0xBB,0xBB, + 0xBA,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBD,0xCD,0xCD,0xDC, + 0xDC,0xCB,0xBB,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAB,0xBB,0xBD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xBC,0xCC,0xCC,0xDD,0xDD,0xCD,0xBB,0xBB,0xBA,0xBB,0xCD, + 0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDB,0xBA,0xA9,0x99,0x9D,0xA8, + 0xAE,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCB,0xAA,0xA9,0xA9,0xAA,0xBA,0xBB,0xBC,0xBD,0xBD,0xCD,0xCD, + 0xCD,0xCC,0xCC,0xDD,0xDD,0xDC,0xBB,0xBB,0xBA,0x87,0x77,0x75,0x55,0x54,0x54,0x54, + 0x45,0x45,0x45,0x44,0x54,0x54,0x45,0x44,0x44,0x54,0x44,0x44,0x44,0x44,0x44,0x44, + 0x54,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x57,0x77,0x87,0x87,0x88,0x87,0x88, + 0x78,0x87,0x88,0x78,0x87,0x88,0x88,0x78,0x88,0x78,0x87,0x87,0x88,0x74,0x54,0x45, + 0x45,0x44,0x45,0x65,0x66,0x66,0x66,0x58,0xDE,0xEB,0x77,0xAF,0xEE,0xE8,0x68,0xEE, + 0xE9,0x65,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x57,0x77, + 0x78,0x89,0xAD,0xDD,0xDE,0xDD,0xDA,0xBA,0xBA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAB,0xBB, + 0xCB,0xDC,0xDC,0xDC,0xCC,0xAB,0xAB,0xAB,0xBB,0xAA,0xAB,0xAB,0xBA,0xBA,0xBA,0xAA, + 0xBA,0xBA,0xBA,0xBA,0xBB,0xAA,0xAB,0xAB,0xAA,0xBA,0xAA,0xAA,0xBA,0xBB,0xCC,0xBC, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAA,0xAA,0xA9, + 0x9A,0x99,0x9A,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBA,0xBB,0xAB,0xBA, + 0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBC,0xCC,0xBD,0xCD,0xCD, + 0xDC,0xDC,0xBB,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xDD,0xDB,0xCB,0xCB,0xDC,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBD, + 0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x8B,0xC9, + 0x8C,0xEE,0xEE,0xFE,0xDC,0xDD,0xDE,0xEE,0xDE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xCB,0xBA,0xA9,0x9A,0xAA,0xAB,0xBB,0xCC,0xDC,0xDC,0xDC,0xDB, + 0xCC,0xBC,0xCD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBC,0xB9,0x87,0x77,0x55,0x55,0x45,0x45, + 0x45,0x44,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x54,0x45,0x44,0x45,0x44, + 0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x45,0x68,0x88,0x78,0x78,0x78,0x87, + 0x88,0x78,0x87,0x87,0x88,0x78,0x78,0x87,0x87,0x87,0x87,0x87,0x75,0x45,0x44,0x54, + 0x44,0x55,0x55,0x67,0x9A,0xA8,0x76,0x68,0xEE,0xE8,0x65,0x59,0xEE,0xEC,0x75,0x8C, + 0x85,0x54,0x55,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x55,0x77,0x77, + 0x88,0xAB,0xDD,0xDD,0xED,0xED,0xDD,0xAB,0xAA,0xAA,0x9A,0xAA,0xAA,0xAB,0xBB,0xBD, + 0xCD,0xDD,0xCD,0xCB,0xBA,0xBA,0xBA,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xAA,0xBA, + 0xBA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBA,0xBB,0xCC,0xDC, + 0xDB,0xCB,0xBB,0xAB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB,0xAA,0xAA,0x99,0x99, + 0x99,0x9A,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAB,0xAB,0xBB,0xAB,0xAB,0xBA,0xBA,0xAB, + 0xBA,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xCD,0xBC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xCB,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xAB,0xAB,0xBC,0xCD,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xBB,0xBC,0xCD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBC, + 0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98,0xDA, + 0x8A,0xEE,0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xBD,0xCD,0xCD,0xCD,0xCC, + 0xDC,0xBB,0xBC,0xDE,0xED,0xDD,0xDB,0xBB,0xBB,0xCB,0x98,0x77,0x76,0x55,0x54,0x54, + 0x54,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x45,0x44,0x45,0x44,0x44, + 0x54,0x44,0x54,0x44,0x44,0x44,0x45,0x44,0x44,0x54,0x56,0x87,0x88,0x78,0x88,0x78, + 0x87,0x88,0x78,0x78,0x87,0x87,0x88,0x78,0x78,0x87,0x88,0x87,0x55,0x44,0x54,0x44, + 0x54,0x55,0x56,0x8E,0xEF,0xEF,0xD7,0x69,0xEE,0xE8,0x66,0x57,0xEE,0xEC,0x75,0x55, + 0x55,0x55,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x55,0x55,0x77,0x77,0x78, + 0x9B,0xBD,0xDD,0xDE,0xEE,0xEE,0xED,0xBB,0xAA,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xDB, + 0xDC,0xDC,0xDD,0xCB,0xBB,0xAA,0xAB,0xBB,0xBB,0xBA,0xBB,0xAA,0xAA,0xBA,0xBA,0xAB, + 0xAB,0xBA,0xAA,0xBA,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAA,0xBB,0xBC,0xCC, + 0xCC,0xCB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xAA,0x99,0x9A,0x99, + 0x9A,0x99,0x9A,0x99,0x99,0x99,0x99,0x9A,0xAA,0xBA,0xBA,0xBB,0xBA,0xBB,0xAB,0xBA, + 0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xCB,0xDD,0xCD,0xCD,0xCD,0xCD, + 0xDD,0xDD,0xCC,0xBB,0xAA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xCC,0xCB,0xBC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBA,0xBB, + 0xCD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0xAD, + 0x98,0xBE,0xEE,0xEE,0xEE,0xCD,0xDE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED, + 0xED,0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xAA,0xAB,0xBB,0xCC,0xDC,0xDC,0xDC,0xDB,0xDC, + 0xCB,0xBB,0xAB,0xCE,0xEE,0xDC,0xCB,0xCC,0xBB,0xBC,0xDA,0x87,0x77,0x65,0x55,0x54, + 0x45,0x44,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x45,0x44, + 0x44,0x54,0x44,0x54,0x45,0x44,0x44,0x45,0x45,0x44,0x45,0x78,0x78,0x87,0x87,0x88, + 0x78,0x78,0x88,0x88,0x78,0x88,0x87,0x88,0x87,0x87,0x87,0x64,0x54,0x45,0x44,0x54, + 0x45,0x56,0x7A,0xEE,0xEE,0xEE,0xED,0x88,0xEE,0xEC,0x76,0x66,0xBE,0xED,0x75,0x54, + 0x55,0x55,0x45,0x45,0x45,0x55,0x45,0x45,0x45,0x45,0x55,0x56,0x67,0x77,0x78,0xAB, + 0xCC,0xDC,0xDD,0xEE,0xEE,0xEE,0xDD,0xCB,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCD,0xCD, + 0xDD,0xCD,0xCC,0xBB,0xBA,0xBA,0xBA,0xAA,0xBA,0xBA,0xAC,0xDC,0xBB,0xAA,0xAB,0xAB, + 0xAB,0xAB,0xBA,0xBB,0xAB,0xAB,0xAA,0xBA,0xBA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBB,0xCC, + 0xDB,0xDB,0xCB,0xBB,0xBA,0xBB,0xBB,0xAB,0xAB,0xBB,0xBA,0xAA,0x9A,0x99,0x99,0x9A, + 0x99,0xA9,0x99,0x99,0xA9,0x99,0x9A,0x9A,0xAA,0xAB,0xBA,0xBA,0xBB,0xAB,0xAA,0xAA, + 0xBA,0xBB,0xBB,0xBA,0xAA,0xAA,0xBB,0xBB,0xBC,0xCC,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE, + 0xEF,0xEE,0xEF,0xEE,0xEE,0xED,0xDB,0xBB,0xBC,0xCD,0xDD,0xDC,0xCC,0xBB,0xBB,0xBB, + 0xBC,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x8C, + 0xA8,0x8D,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0xAB,0xBC,0xBD,0xBD,0xCC,0xDC,0xDC,0xCB, + 0xCB,0xBB,0xBB,0xBD,0xED,0xDD,0xCD,0xCC,0xBC,0xBB,0xBB,0xA8,0x77,0x77,0x55,0x55, + 0x54,0x54,0x45,0x44,0x54,0x54,0x45,0x44,0x45,0x44,0x54,0x54,0x45,0x45,0x44,0x54, + 0x44,0x44,0x54,0x44,0x44,0x45,0x45,0x44,0x44,0x45,0x44,0x56,0x78,0x78,0x88,0x78, + 0x88,0x88,0x87,0x87,0x88,0x78,0x78,0x78,0x78,0x88,0x75,0x45,0x44,0x54,0x54,0x44, + 0x55,0x68,0xDE,0xEE,0xEE,0xFE,0xEF,0xB7,0xED,0xEE,0xD8,0x89,0xEF,0xEA,0x65,0x54, + 0x55,0x65,0x54,0x45,0x45,0x54,0x55,0x54,0x54,0x55,0x56,0x66,0x77,0x78,0xAB,0xCB, + 0xDC,0xDD,0xDE,0xEE,0xEE,0xED,0xDD,0xCB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xDC,0xDC, + 0xDC,0xDC,0xCC,0xBB,0xAB,0xBB,0xAA,0xAA,0xBB,0xBB,0xAA,0xBD,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xAB,0xAB,0xBB,0xBC, + 0xCC,0xCB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0x9A,0x99,0xA9,0xA9,0xA9, + 0xA9,0xA9,0x9A,0x9A,0x99,0xA9,0x99,0x99,0x99,0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xAA, + 0xBA,0xBA,0xBA,0xBB,0xAA,0xAB,0xAB,0xBB,0xCB,0xDD,0xDD,0xCD,0xDD,0xCC,0xBC,0xBD, + 0xCD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCB,0xBD,0xDD,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBB,0xCC,0xCD,0xDD,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xDD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98, + 0xDA,0x8A,0xEE,0xEE,0xFE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xAB,0xAB,0xBC,0xDC,0xDC,0xDC,0xDB,0xCC,0xCD, + 0xBC,0xBB,0xAB,0xAB,0xCC,0xDC,0xDC,0xDC,0xDC,0xBB,0xBA,0xBA,0x87,0x77,0x76,0x55, + 0x55,0x45,0x44,0x45,0x44,0x45,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x44, + 0x45,0x44,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x44,0x45,0x67,0x78,0x78,0x87, + 0x87,0x87,0x88,0x88,0x78,0x78,0x87,0x87,0x88,0x75,0x54,0x44,0x54,0x54,0x54,0x54, + 0x56,0x8D,0xEE,0xEA,0x77,0xAE,0xEE,0xD7,0x8E,0xEE,0xEE,0xDE,0xEE,0xB7,0x55,0x55, + 0x55,0x55,0x45,0x45,0x45,0x45,0x54,0x55,0x55,0x55,0x66,0x76,0x77,0x8B,0xBD,0xCD, + 0xCD,0xED,0xED,0xEE,0xED,0xED,0xDB,0xAA,0xAB,0xAB,0xAA,0xBB,0xBC,0xCD,0xCD,0xDC, + 0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xAB,0xAB,0xBB,0xBA,0xAB,0xBB,0xAB,0xAB,0xAB, + 0xAB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xCD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xA9,0xA9,0x9A,0x99,0xA9,0xA9, + 0xA9,0xA9,0xA9,0x99,0xA9,0x9A,0x99,0x9A,0x99,0xAA,0xAA,0xBA,0xBA,0xBA,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBC,0xDD,0xDD,0xDD,0xDB,0xCC,0xBB,0xBB,0xBB, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xCB,0xBC,0xCB,0xCC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xEF,0xEF,0xEE,0xDD,0xBB,0xBB,0xBC,0xDD,0xDD,0xCC,0xBC,0xBB,0xBB, + 0xBB,0xCD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98, + 0xAC,0x98,0xDE,0xEE,0xEE,0xED,0xCC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xDB,0xDC,0xDC,0xDC,0xCB,0xCB,0xBC, + 0xBB,0xBB,0xBB,0xBA,0xBB,0xCD,0xDD,0xDD,0xDC,0xBB,0xAB,0xAB,0xB9,0x77,0x77,0x75, + 0x55,0x54,0x54,0x54,0x44,0x54,0x54,0x44,0x45,0x44,0x45,0x44,0x44,0x54,0x44,0x45, + 0x44,0x54,0x54,0x44,0x44,0x54,0x45,0x44,0x54,0x44,0x54,0x54,0x57,0x87,0x88,0x78, + 0x88,0x88,0x87,0x87,0x88,0x88,0x78,0x87,0x87,0x54,0x44,0x54,0x44,0x44,0x44,0x45, + 0x57,0xDE,0xEE,0xE8,0x66,0x8E,0xEE,0xD7,0x58,0xEE,0xEE,0xEF,0xEB,0x85,0x54,0x54, + 0x54,0x54,0x54,0x54,0x54,0x54,0x55,0x55,0x55,0x57,0x77,0x77,0x8B,0xBC,0xCC,0xBD, + 0xDD,0xDE,0xEE,0xEE,0xED,0xDB,0xBA,0xBA,0xBA,0xAA,0xBB,0xBB,0xBD,0xCD,0xCD,0xCD, + 0xCC,0xBA,0xBB,0xBB,0xAB,0xAB,0xBB,0xAA,0xBA,0xAB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xBB,0xAB,0xBA,0xBA,0xAA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB, + 0xBD,0xCC,0xCD,0xCB,0xBB,0xBB,0xBA,0xBA,0xAA,0xA9,0xA9,0x99,0xA9,0xAA,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0x9A,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA, + 0xAA,0xAA,0xBA,0xBB,0xAB,0xAB,0xBB,0xBD,0xDD,0xED,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xCB,0xAB,0xBB,0xBC,0xDC,0xDD,0xDC,0xBB,0xBB, + 0xBB,0xBC,0xDE,0xEF,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xCC,0xBA,0xAA,0x99, + 0x8D,0xA8,0xAE,0xEE,0xEE,0xFE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xCD,0xBD,0xCC,0xCD,0xBC,0xBC,0xCC,0xDB, + 0xDB,0xCB,0xBB,0xAB,0xAB,0xCD,0xCD,0xEE,0xDB,0xBA,0xBA,0xBB,0xAA,0x87,0x77,0x78, + 0x65,0x55,0x54,0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x54,0x44,0x44,0x44,0x54,0x44, + 0x54,0x44,0x45,0x45,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x55,0x68,0x78,0x87, + 0x87,0x88,0x78,0x87,0x87,0x88,0x87,0x87,0x55,0x45,0x45,0x44,0x54,0x54,0x54,0x54, + 0x45,0x8E,0xEE,0xEE,0x97,0x9F,0xEF,0xC6,0x55,0x7D,0xEE,0xDD,0x96,0x55,0x45,0x45, + 0x45,0x45,0x45,0x45,0x45,0x55,0x55,0x55,0x67,0x77,0x77,0x8A,0xBC,0xCC,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xED,0xDD,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xCC, + 0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xBB,0xAB,0xBA,0xBA,0xBA,0xAB, + 0xAA,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCD,0xBC,0xBC,0xBB,0xBB,0xAB,0xAA,0xAA,0x99,0x99,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x9A,0xAA,0xAA,0xBA,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDE,0xDD,0xED,0xDC,0xCB,0xBB,0xAB,0xBB, + 0xBB,0xCD,0xDD,0xEE,0xDE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEF,0xEE,0xFE,0xEF,0xEE,0xED,0xCB,0xBB,0xBB,0xBC,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xBA,0xBB,0xDD,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99, + 0x8A,0xD9,0x8B,0xEE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xCB,0xDC,0xDC,0xDC,0xCB,0xCB,0xCB,0xCC, + 0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xDE,0xEE,0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0x87,0x77, + 0x76,0x55,0x55,0x54,0x54,0x54,0x54,0x45,0x44,0x54,0x44,0x54,0x54,0x54,0x44,0x54, + 0x44,0x45,0x44,0x44,0x54,0x54,0x44,0x45,0x45,0x44,0x44,0x54,0x44,0x46,0x87,0x87, + 0x88,0x78,0x87,0x88,0x88,0x78,0x88,0x75,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x44, + 0x54,0x59,0xFF,0xEE,0xEA,0xDE,0xED,0x75,0x55,0x45,0x67,0x65,0x55,0x45,0x45,0x45, + 0x45,0x45,0x44,0x54,0x55,0x55,0x55,0x67,0x77,0x78,0x89,0xBB,0xDC,0xCC,0xDD,0xDD, + 0xDE,0xEE,0xED,0xDD,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBC,0xCC,0xBC, + 0xBB,0xBB,0xAA,0xBA,0xBA,0xBB,0xBC,0xBA,0xAA,0xAB,0xAB,0xBA,0xBA,0xBA,0xAB,0xAA, + 0xBA,0xBA,0xBA,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB,0xBB,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xCC,0xCD,0xCB,0xBB,0xBB,0xBA,0xAA,0xA9,0xA9,0x9A,0x9A,0x9A,0x9A,0xA9,0xA9, + 0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0x99,0x99,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBA,0xBB,0xBB,0xBC,0xDD,0xED,0xEE,0xDD,0xDC,0xBB,0xBA,0xBB,0xAB, + 0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xFE,0xEF,0xEE,0xFE,0xEE,0xED,0xBB,0xBB,0xAB,0xBB,0xBD,0xCD,0xDC,0xDC,0xBB, + 0xBB,0xBB,0xBD,0xEE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xCB,0xBA,0xA9, + 0x98,0xCA,0x88,0xDE,0xEE,0xFE,0xEE,0xDD,0xDE,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xCC,0xCC,0xCB,0xBC,0xBC,0xCD,0xBD, + 0xBD,0xBD,0xBC,0xBB,0xBA,0xBB,0xEE,0xDB,0xBB,0xCC,0xCB,0xBA,0xAA,0xAA,0xA8,0x77, + 0x78,0x77,0x65,0x55,0x45,0x45,0x45,0x45,0x45,0x45,0x44,0x44,0x44,0x44,0x54,0x44, + 0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x45,0x45,0x45,0x68,0x88, + 0x78,0x88,0x78,0x87,0x87,0x88,0x76,0x54,0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x45, + 0x45,0x45,0xAF,0xEE,0xEE,0xEE,0xE8,0x65,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54, + 0x54,0x54,0x55,0x55,0x55,0x66,0x67,0x78,0x78,0x8A,0xBC,0xCD,0xCD,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xDD,0xDB,0xAB,0xAB,0xBB,0xBB,0xBB,0xCC,0xBC,0xBB,0xBC,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBC,0xCA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xAA,0xBA, + 0xBA,0xAB,0xAB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xBC,0xCB,0xBB,0xBA,0xBA,0xAA,0xA9,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A,0x9A,0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xCD,0xDD,0xEE,0xED,0xDD,0xDB,0xBB,0xAB,0xBA,0xBA, + 0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xFE,0xEF,0xEE,0xFE,0xEF,0xEE,0xED,0xBB,0xAA,0xBA,0xBB,0xBC,0xDD,0xDD,0xCC,0xBB, + 0xBB,0xAB,0xBC,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9, + 0x99,0x9D,0xA8,0xAE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDB,0xDC,0xCD,0xCC,0xBB,0xCB,0xCC,0xCC,0xCB, + 0xDC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBD,0xDD,0xEE,0xED,0xCC,0xBB,0xBA,0xAA,0xAA,0x88, + 0x77,0x77,0x65,0x55,0x55,0x45,0x45,0x44,0x54,0x45,0x45,0x45,0x45,0x44,0x44,0x54, + 0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x45,0x45,0x44,0x45,0x45,0x44,0x54,0x56,0x87, + 0x87,0x87,0x88,0x78,0x88,0x87,0x55,0x44,0x54,0x44,0x45,0x44,0x44,0x44,0x45,0x44, + 0x54,0x54,0x59,0xEE,0xEE,0xFE,0x86,0x55,0x45,0x44,0x54,0x54,0x54,0x54,0x45,0x45, + 0x45,0x55,0x55,0x55,0x56,0x67,0x78,0x78,0x9A,0xBC,0xCD,0xCD,0xDD,0xDD,0xED,0xEE, + 0xEE,0xDE,0xDB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCC,0xBC,0xBB,0xBB,0xBB,0xAB, + 0xAB,0xBB,0xAB,0xBB,0xBB,0xAA,0xBB,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA, + 0xBB,0xBA,0xAB,0xAB,0xBB,0xBA,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xBC,0xBB,0xBB,0xAA,0xAA,0x99,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A, + 0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0x99,0x99,0x99,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xBD,0xDD,0xED,0xEE,0xED,0xDC,0xBB,0xBB,0xAB,0xAA, + 0xAA,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDD,0xBB,0xAA,0xAB,0xAB,0xBB,0xCC,0xDC,0xDC,0xDB, + 0xBB,0xBB,0xBB,0xCD,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDB,0xBB,0xAA, + 0x99,0x8A,0xD9,0x8C,0xEE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xBC,0xBB,0xBC,0xBC,0xCC,0xCD,0xBD, + 0xBD,0xCD,0xBD,0xBB,0xBB,0xBA,0xBA,0xCE,0xEF,0xEE,0xDD,0xCC,0xBA,0xA9,0xAA,0x9A, + 0x87,0x77,0x77,0x66,0x65,0x55,0x45,0x54,0x54,0x54,0x44,0x44,0x44,0x45,0x45,0x44, + 0x54,0x44,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x45,0x67, + 0x78,0x88,0x78,0x87,0x87,0x64,0x44,0x54,0x45,0x44,0x54,0x45,0x44,0x45,0x44,0x45, + 0x45,0x45,0x45,0xCE,0xEE,0xEB,0x76,0x65,0x54,0x54,0x45,0x45,0x45,0x45,0x45,0x45, + 0x55,0x55,0x66,0x66,0x77,0x77,0x78,0x9A,0xBB,0xDC,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xDD,0xDC,0xBA,0xBA,0xBB,0xBB,0xBB,0xCC,0xDC,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBC,0xCA,0xBA,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCC,0xDB,0xBB,0xBA,0xBA,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0x9A,0x9A,0x99,0xA9,0x99,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xCD,0xCD,0xDE,0xED,0xDD,0xDB,0xBB,0xBA,0xBA,0xAA, + 0xAA,0xAA,0xBB,0xCD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xFE,0xFE,0xEF,0xEE,0xFE,0xEE,0xDD,0xBA,0xAA,0xAA,0xAB,0xBB,0xBD,0xCD,0xDB,0xCB, + 0xBB,0xBB,0xAB,0xCD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xAA, + 0xA9,0x98,0xDA,0x89,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xDC,0xDB,0xDB,0xDC,0xDC,0xCB,0xBB,0xBB,0xBC,0xCC,0xCC, + 0xCC,0xCB,0xDC,0xDC,0xCB,0xBB,0xBB,0xBD,0xEE,0xEE,0xEE,0xDD,0xBA,0xAA,0xA9,0xA9, + 0xA9,0x77,0x77,0x76,0x66,0x55,0x55,0x45,0x45,0x45,0x54,0x54,0x54,0x54,0x44,0x54, + 0x44,0x54,0x54,0x44,0x54,0x54,0x44,0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x54,0x46, + 0x78,0x87,0x87,0x88,0x75,0x54,0x54,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x54,0x54, + 0x45,0x45,0x45,0x7D,0xEE,0xEF,0xB7,0x65,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x55, + 0x56,0x55,0x67,0x88,0x77,0x78,0x9B,0xBD,0xBC,0xCB,0xDD,0xDD,0xDD,0xED,0xEE,0xED, + 0xDD,0xBA,0xBA,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBA,0xBB,0xBC, + 0xBB,0xBA,0xBA,0xBB,0xDE,0xBA,0xBB,0xBB,0xCC,0xCB,0xDC,0xCC,0xBB,0xBB,0xBA,0xAA, + 0xAA,0xAA,0xAB,0xBC,0xCC,0xCC,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xCC,0xCB,0xAB,0xAA,0xAA,0xA9,0x9A,0x9A,0xA9,0xAA,0x9A,0xAA,0x9A, + 0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0xA9,0xA9,0x99,0x99,0x99,0x9A,0xAA,0xAA, + 0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xDD,0xED,0xEE,0xED,0xDD,0xCB,0xBB,0xBA,0xAA, + 0x9A,0x9A,0xAB,0xBD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDC,0xBA,0x9A,0x9A,0xAA,0xAB,0xBB,0xDC,0xDD,0xDC, + 0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA, + 0xA9,0x99,0x9D,0x98,0xAE,0xEE,0xEF,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xBD,0xBC,0xCB,0xCB,0xBB,0xBB,0xBC,0xBC,0xCC, + 0xDB,0xDC,0xDC,0xCD,0xCC,0xBB,0xBB,0xAB,0xCE,0xEF,0xEE,0xED,0xBA,0xAA,0xAA,0x99, + 0xAA,0x98,0x87,0x67,0x77,0x76,0x55,0x55,0x45,0x44,0x45,0x45,0x44,0x45,0x45,0x44, + 0x54,0x44,0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x45,0x45,0x44,0x44,0x54,0x44,0x54, + 0x46,0x77,0x77,0x75,0x45,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x44,0x44,0x45, + 0x44,0x54,0x54,0x47,0xCE,0xEE,0xFB,0x75,0x55,0x45,0x45,0x45,0x45,0x45,0x55,0x55, + 0x56,0x78,0x88,0x89,0x89,0xBB,0xBB,0xCC,0xDC,0xCD,0xDD,0xDE,0xDE,0xEE,0xED,0xED, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xCD,0xBC,0xBA,0xBA,0xBB,0xBB, + 0xBC,0xBA,0xAA,0xBB,0xBD,0xED,0xBB,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBA,0xAA,0xAA, + 0xA9,0xA9,0xAA,0xAB,0xDD,0xCD,0xCB,0xCB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xBC,0xCC,0xDB,0xCB,0xBB,0xBB,0xA9,0x99,0xA9,0xA9,0xAA,0x99,0xA9,0xAA,0xAA, + 0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0x99,0xAA,0xAA,0xAA, + 0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xED,0xED,0xDD,0xBB,0xBB,0xAA,0xA9, + 0x9A,0x9A,0xAA,0xBC,0xDD,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xAA,0x9A,0x9A,0x9A,0xAB,0xBB,0xCD,0xCD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB, + 0xAA,0x99,0x8B,0xB9,0x8D,0xEE,0xEE,0xEE,0xEC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xDC,0xDB,0xDB,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xCC, + 0xBD,0xCD,0xCD,0xDD,0xCD,0xCC,0xBB,0xBB,0xBC,0xEE,0xFF,0xFC,0xBA,0xBB,0xAA,0xA9, + 0x99,0xA9,0x98,0x77,0x77,0x77,0x65,0x55,0x55,0x55,0x54,0x44,0x54,0x54,0x44,0x54, + 0x45,0x45,0x44,0x44,0x44,0x54,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x44,0x54,0x44, + 0x54,0x44,0x54,0x44,0x44,0x54,0x54,0x54,0x54,0x54,0x44,0x44,0x45,0x44,0x45,0x44, + 0x45,0x45,0x45,0x44,0x7D,0xEE,0xEF,0xA6,0x54,0x54,0x54,0x54,0x55,0x55,0x55,0x67, + 0x78,0x88,0x87,0x8A,0xAD,0xBD,0xBC,0xBD,0xCD,0xDD,0xCD,0xDE,0xEE,0xED,0xDD,0xBB, + 0xAB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB,0xAB,0xBC,0xCB, + 0xBB,0xCC,0xAA,0xAB,0xBD,0xCD,0xDD,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xAA,0xAA,0xAA,0xAA,0xBA,0xBE,0xFE,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCB,0xCC,0xCC,0xCB,0xBB,0xAA,0x99,0x9A,0x9A,0x9A,0xA9,0xAA,0xAA,0xAA,0xAB, + 0xAA,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0xA9,0x99,0x99,0x9A,0xAA,0xAA, + 0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDE,0xDE,0xDD,0xDC,0xBB,0xAA,0x9A, + 0x99,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDD,0xDE,0xDD,0xED,0xDD,0xCB,0xAA,0xA9,0x9A,0x9A,0xAA,0xBB,0xCD,0xDC,0xDC, + 0xCC,0xBB,0xBB,0xBB,0xBD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB, + 0xAA,0x99,0x98,0xDA,0x89,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE, + 0xFE,0xEE,0xEE,0xED,0xDD,0xDC,0xCD,0xCD,0xDD,0xDD,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC, + 0xDD,0xCD,0xDD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xCE,0xFF,0xEB,0xAD,0xDC,0xA9,0x99, + 0x9A,0xAA,0xAA,0x98,0x77,0x77,0x77,0x65,0x65,0x55,0x55,0x55,0x45,0x45,0x45,0x45, + 0x44,0x44,0x45,0x45,0x44,0x44,0x54,0x54,0x44,0x54,0x45,0x44,0x45,0x44,0x54,0x54, + 0x44,0x45,0x44,0x54,0x54,0x44,0x44,0x44,0x44,0x44,0x45,0x44,0x44,0x45,0x44,0x54, + 0x54,0x44,0x54,0x54,0x47,0xEF,0xFD,0x75,0x54,0x54,0x54,0x55,0x55,0x55,0x67,0x77, + 0x77,0x77,0x78,0xAB,0xBB,0xCC,0xCC,0xCD,0xDD,0xDE,0xDE,0xDE,0xED,0xED,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xED,0xDD,0xCD,0xCC,0xBB,0xAB,0xAB,0xCD,0xDB, + 0xBB,0xCE,0xDB,0xAB,0xBC,0xDD,0xCD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAB,0xAA,0xBB,0xDF,0xFE,0xCC,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xDC,0xDB,0xCB,0xAB,0xBA,0x99,0xA9,0xAA,0xAA,0x9A,0x9A,0x9A,0xAB,0xBD, + 0xCA,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A,0x9A,0x99,0x99,0xA9,0x99,0x9A,0xAA,0xAB, + 0xAB,0xAB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xDD,0xDE,0xEE,0xDD,0xDD,0xBB,0xBA,0xA9, + 0x99,0xA9,0xAA,0xAB,0xBD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xFE,0xEF,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xAA,0x9A,0x99,0xA9,0xAA,0xBC,0xCD,0xCD,0xCC, + 0xCB,0xBB,0xBB,0xBB,0xCD,0xDE,0xEE,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB, + 0xBA,0xA9,0x98,0xAD,0x98,0xBE,0xEE,0xEE,0xEE,0xCD,0xEE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xCC,0xCC,0xDD,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xCC, + 0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBC,0xEE,0xBB,0xDE,0xCA,0xA9,0x99, + 0x99,0xAA,0xAB,0xBB,0xA8,0x77,0x77,0x77,0x76,0x56,0x55,0x55,0x54,0x54,0x54,0x54, + 0x54,0x54,0x54,0x54,0x45,0x45,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x54,0x44,0x44, + 0x45,0x44,0x54,0x44,0x54,0x54,0x54,0x54,0x54,0x45,0x44,0x45,0x44,0x44,0x54,0x44, + 0x44,0x45,0x45,0x45,0x44,0x8E,0xB6,0x55,0x54,0x55,0x55,0x55,0x56,0x78,0x88,0x76, + 0x78,0x98,0xAC,0xCB,0xDC,0xCC,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD,0xCC,0xBA,0xBB,0xBB,0xBC,0xCB, + 0xAB,0xBD,0xDD,0xCB,0xCB,0xDC,0xDC,0xDC,0xCC,0xBC,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAB,0xFF,0xEC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xBB,0xCC,0xCC,0xBA,0xA9,0x99,0x99,0x99,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA,0xBA, + 0xBA,0xAA,0x9A,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0xAA,0xAA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBD,0xDD,0xDE,0xDE,0xDD,0xDC,0xBA,0xA9, + 0xA9,0x99,0x9A,0xAA,0xBB,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDB,0xBA,0xA9,0x99,0x9A,0xAA,0xBB,0xBB,0xCB,0xCB, + 0xCB,0xCB,0xCB,0xBB,0xCC,0xCE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB, + 0xBB,0xA9,0x99,0x8C,0xA8,0x8D,0xEE,0xEF,0xEE,0xEC,0xDD,0xEE,0xED,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB,0xBA,0xAA,0xCE,0xEC,0xA9,0x99,0x9A, + 0x9A,0xAA,0xBB,0xBB,0xAA,0x99,0x87,0x77,0x78,0x76,0x66,0x65,0x55,0x55,0x45,0x45, + 0x45,0x44,0x54,0x45,0x44,0x44,0x54,0x54,0x44,0x54,0x45,0x44,0x54,0x45,0x45,0x45, + 0x44,0x54,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0x54,0x45,0x44,0x45,0x44,0x45,0x44, + 0x54,0x44,0x44,0x54,0x54,0x54,0x55,0x55,0x55,0x55,0x55,0x67,0x77,0x87,0x76,0x77, + 0x8A,0xBD,0xDD,0xDD,0xCC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xCC,0xBB,0xAB,0xAB,0xBB,0xBB,0xBC, + 0xBA,0xAB,0xCD,0xCD,0xCD,0xBD,0xCD,0xBC,0xCB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCB,0xBB,0xBB,0xBA,0xAB,0xBD,0xFF,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xDB,0xDB,0xBA,0x99,0x89,0x99,0xA9,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA, + 0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0x99,0xA9,0x9A,0x99,0x99,0x9A,0xAA,0xBA, + 0xBA,0xBB,0xAB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBC,0xDD,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA, + 0x99,0x99,0xA9,0xAA,0xBB,0xCD,0xDE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDD,0xDD,0xDD,0xCC,0xCD,0xCD,0xBB,0xAA,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xCC,0xCC,0xCB,0xBC,0xDD,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xED,0xDC, + 0xBB,0xAA,0x99,0x98,0xDA,0x8A,0xEE,0xEE,0xEE,0xED,0xCE,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xED,0xDD,0xDB,0xDB,0xDC,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xCC, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xAA,0xBD,0xBA,0xA9,0x9A,0xAA, + 0xA9,0xAA,0xCB,0xBA,0xAA,0xBD,0xCA,0x88,0x88,0x88,0x77,0x66,0x65,0x55,0x55,0x54, + 0x45,0x45,0x44,0x54,0x45,0x45,0x44,0x44,0x54,0x45,0x44,0x54,0x45,0x44,0x44,0x44, + 0x54,0x45,0x44,0x54,0x45,0x45,0x44,0x54,0x54,0x45,0x44,0x45,0x44,0x45,0x44,0x54, + 0x45,0x45,0x45,0x45,0x45,0x45,0x55,0x55,0x55,0x56,0x67,0x78,0x77,0x77,0x88,0x9B, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCB,0xDD,0xDD,0xED,0xDE,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBA, + 0xBA,0xBB,0xBC,0xDD,0xCD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBC,0xBC,0xBB, + 0xCC,0xCC,0xBD,0xCC,0xBB,0xBB,0xAA,0xAB,0xDE,0xEB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xBC,0xCB,0xBA,0x88,0x88,0x99,0x9A,0x9A,0x9A,0xA9,0xAA,0xAA,0xAA,0xAA, + 0xAA,0x9A,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0x9A,0x99,0x99,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xBB,0xDD,0xDE,0xED,0xEE,0xDD,0xDB,0xAA, + 0xA9,0xA9,0x9A,0xAA,0xAB,0xBC,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDC,0xCB,0xBB,0xBC,0xDC,0xDC,0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB, + 0xCC,0xCD,0xCC,0xCC,0xBD,0xCC,0xDE,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDD, + 0xBB,0xBA,0xA9,0x98,0xBD,0x98,0xCE,0xEE,0xEF,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xBB,0xBB,0xBB,0xCC,0xCC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA, + 0x9A,0x9A,0xBA,0xAA,0xAA,0xAB,0xBD,0xEE,0xB9,0x88,0x88,0x76,0x66,0x55,0x55,0x55, + 0x54,0x54,0x54,0x54,0x54,0x44,0x54,0x54,0x45,0x44,0x54,0x54,0x54,0x45,0x45,0x44, + 0x45,0x44,0x54,0x44,0x54,0x44,0x45,0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x54,0x54, + 0x54,0x44,0x54,0x54,0x55,0x55,0x55,0x66,0x67,0x77,0x87,0xAB,0x98,0x88,0xBC,0xCC, + 0xDC,0xDD,0xEE,0xEE,0xED,0xDD,0xDE,0xED,0xED,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xDE,0xDE,0xED,0xDD,0xDC,0xCB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBA,0xBB, + 0xAB,0xAB,0xDC,0xDC,0xDC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCD, + 0xCC,0xCD,0xCD,0xCD,0xCD,0xBB,0xBB,0xBB,0xBD,0xED,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xCC,0xDB,0xCB,0xA9,0x88,0x88,0x99,0x9A,0xAA,0xA9,0xAA,0x9A,0xA9,0xA9,0xA9, + 0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0x9A,0xAA,0xBA, + 0xBB,0xBB,0xAB,0xBA,0xBA,0xAB,0xAA,0xBB,0xBB,0xCD,0xDE,0xEE,0xED,0xDD,0xCB,0xBB, + 0xAA,0x9A,0x9A,0xAA,0xBB,0xBC,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xDD,0xDC,0xCB,0xBA,0xA9,0x9A,0xBC,0xDC,0xBB,0xAA,0xAA,0xAB,0xAA,0xAB,0xAB,0xBC, + 0xCD,0xDC,0xDB,0xCB,0xCB,0xCD,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD, + 0xCB,0xBA,0xA9,0x99,0x8D,0xA8,0x9E,0xEE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xCC,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDC,0xBB,0xAB,0xAA,0xAA,0xAB,0xAA, + 0x99,0x9A,0x9A,0xAA,0xAB,0xBB,0xDD,0xFF,0xFF,0xDA,0x88,0x87,0x87,0x66,0x66,0x55, + 0x55,0x55,0x54,0x54,0x54,0x54,0x54,0x44,0x54,0x45,0x44,0x44,0x44,0x54,0x44,0x54, + 0x54,0x54,0x44,0x54,0x44,0x54,0x54,0x45,0x44,0x45,0x44,0x54,0x54,0x45,0x44,0x54, + 0x54,0x55,0x55,0x55,0x55,0x65,0x67,0x78,0x87,0x88,0x88,0xDE,0xBA,0xBB,0xCC,0xCC, + 0xCD,0xDE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xDD,0xDD,0xBB,0xAB,0xBB,0xBA,0xBB,0xAA,0xBA,0xBA, + 0xAB,0xBC,0xBD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCD,0xCC, + 0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xBB,0xBB,0xCB,0xBC,0xCB,0xBA,0xBA,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xBC,0xCB,0xB9,0x87,0x88,0x99,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0xAA,0xAA, + 0xA9,0xAA,0xAA,0x9A,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0xAA,0xBB, + 0xBB,0xAB,0xBB,0xAB,0xAB,0xBA,0xAA,0xAA,0xBB,0xCC,0xDD,0xDD,0xED,0xDD,0xDD,0xBB, + 0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xDD,0xDC,0xCB,0xBA,0xAA,0x99,0x9A,0xAB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB, + 0xDC,0xDC,0xDD,0xBD,0xCC,0xCC,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD, + 0xDB,0xBB,0xAA,0x99,0x99,0xD9,0x8A,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xED,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xCB,0xBB,0xBB, + 0xBC,0xCD,0xCD,0xDD,0xDD,0xEE,0xED,0xED,0xDD,0xCC,0xBB,0xBB,0xAA,0xAA,0xAA,0x99, + 0x9A,0x9A,0xAA,0xAA,0xBB,0xCD,0xEE,0xFF,0xFF,0xFF,0xED,0xA8,0x88,0x87,0x76,0x66, + 0x66,0x55,0x55,0x55,0x54,0x54,0x45,0x45,0x45,0x44,0x54,0x54,0x54,0x55,0x55,0x54, + 0x54,0x45,0x54,0x45,0x45,0x44,0x45,0x44,0x54,0x54,0x54,0x44,0x54,0x54,0x55,0x45, + 0x55,0x55,0x55,0x55,0x66,0x67,0x88,0x88,0x88,0x89,0x9A,0xAA,0xBA,0xBB,0xCD,0xCD, + 0xBD,0xDE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD, + 0xDD,0xED,0xDE,0xDE,0xED,0xED,0xDD,0xCC,0xBB,0xBA,0xAB,0xAB,0xBB,0xBA,0xAA,0xAB, + 0xAB,0xBC,0xDC,0xCD,0xBC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCC,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xCD,0xDC,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB, + 0xBC,0xBC,0xDB,0xCB,0xAA,0x88,0x88,0x99,0x9A,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xA9, + 0xAA,0xAA,0xAA,0xAA,0x9A,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0xA9,0x99,0xAA,0xBB, + 0xAB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAB,0xBA,0xBC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB, + 0xBB,0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xDC,0xCC,0xBC,0xBB,0xBA,0xA9,0xAA,0xAB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC, + 0xDD,0xDC,0xDC,0xDB,0xCC,0xCB,0xCD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED, + 0xDD,0xCB,0xAA,0xA9,0x98,0xBB,0x98,0xDE,0xEE,0xEE,0xEE,0xCD,0xDD,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDC,0xBB,0xBA,0xBA, + 0xBB,0xCB,0xDC,0xCD,0xDD,0xDD,0xEE,0xEE,0xDD,0xDD,0xCB,0xBB,0xAB,0xAA,0xAA,0x9A, + 0x9A,0x9A,0xAA,0xAB,0xBD,0xDD,0xDE,0xFF,0xFF,0xFF,0xFF,0xFE,0xB8,0x87,0x77,0x77, + 0x77,0x67,0x56,0x55,0x55,0x55,0x55,0x54,0x54,0x45,0x45,0x45,0x55,0x55,0x55,0x55, + 0x55,0x54,0x44,0x54,0x44,0x54,0x54,0x54,0x45,0x45,0x45,0x55,0x55,0x55,0x55,0x55, + 0x55,0x56,0x66,0x67,0x78,0x89,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xAB,0xAB,0xCD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDB,0xBB,0xBB,0xBC,0xBC,0xBB,0xCC,0xDD,0xDD, + 0xED,0xDE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCB,0xBB,0xAA,0xAA,0xBC,0xCB,0xAA,0xAA, + 0xBB,0xBD,0xCD,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCC,0xBD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xDC,0xCC,0xBB,0xB9,0x98,0x88,0x99,0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xBA,0xBA,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0xA9,0xA9,0x99,0x99,0xAA,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAB,0xBB,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD, + 0xCB,0xBB,0xBB,0xBB,0xBC,0xCC,0xCD,0xDE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEF,0xFE,0xED, + 0xDD,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xCC, + 0xCD,0xCD,0xDD,0xCD,0xCC,0xCC,0xBC,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE, + 0xDD,0xBB,0xBA,0xA9,0x99,0x8D,0xA8,0xAE,0xEE,0xEF,0xEE,0xEB,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDC,0xBB,0xBB,0xBB, + 0xBA,0xBB,0xCD,0xDC,0xDD,0xDD,0xDE,0xDE,0xDD,0xDC,0xCB,0xBB,0xBA,0xBA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xDE,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xDA,0x98,0x88, + 0x77,0x87,0x76,0x66,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x66,0x66,0x66, + 0x65,0x55,0x55,0x45,0x54,0x54,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55, + 0x67,0x78,0x88,0x88,0x88,0x8A,0xBA,0xBB,0xBC,0xCC,0xBB,0xAB,0xBA,0xAA,0xBD,0xED, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xBB,0xBB,0xBB,0xCB,0xCB,0xCB,0xCD,0xDD,0xDD,0xED, + 0xEE,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBA,0xAB,0xBB,0xCD,0xDC,0xBB, + 0xBC,0xDC,0xDB,0xCB,0xCB,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDD, + 0xDE,0xDD,0xDD,0xED,0xED,0xDC,0xDC,0xCC,0xBB,0xAB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB, + 0xBC,0xCC,0xDB,0xCB,0xBA,0x98,0x89,0x89,0x9A,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA, + 0x9A,0xAA,0xAB,0xBB,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xBA, + 0xBB,0xAB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBB,0xCB,0xCB,0xCC,0xDD,0xDC, + 0xCB,0xBB,0xBB,0xCD,0xCD,0xCD,0xDD,0xDE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xED, + 0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB, + 0xCC,0xDD,0xCD,0xCD,0xCC,0xBB,0xCB,0xCD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xDD,0xDC,0xBB,0xAA,0x99,0x8A,0xD9,0x8B,0xEE,0xEE,0xEE,0xED,0xCD,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDE,0xDD,0xDC,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xBB,0xBB,0xAB,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xBC,0xDE,0xEE,0xFE,0xEE,0xFE,0xFF,0xFF,0xFE,0xEE,0xEF,0xFE,0xDA, + 0x98,0x88,0x77,0x78,0x77,0x76,0x66,0x55,0x55,0x55,0x55,0x56,0x67,0x88,0x87,0x77, + 0x66,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x66,0x66,0x66,0x66,0x77,0x78,0x77, + 0x89,0xBA,0x99,0x99,0xA9,0xAA,0xCB,0xBB,0xBB,0xCB,0xBB,0xAB,0xBA,0xAA,0xBD,0xDE, + 0xED,0xDD,0xEE,0xEE,0xEE,0xDC,0xBB,0xBB,0xBB,0xBC,0xCB,0xBD,0xDD,0xDE,0xDE,0xDE, + 0xED,0xEE,0xDE,0xED,0xDD,0xDD,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xCC,0xBC, + 0xCD,0xCD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xCB,0xDC,0xDD, + 0xDE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xBB,0xBB,0xAB,0xBB,0xBA,0xBB,0xAB,0xBB, + 0xBB,0xDC,0xCC,0xBB,0xA9,0x99,0x88,0x99,0xA9,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAB,0xBB,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x99,0x99,0xAA,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDD, + 0xDD,0xCC,0xCC,0xCB,0xDC,0xDD,0xDE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xDD, + 0xDC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB, + 0xBC,0xCC,0xDC,0xDC,0xDC,0xDC,0xCB,0xBC,0xDE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xED,0xDC,0xCB,0xAA,0x99,0x98,0xCA,0x88,0xEE,0xEE,0xFE,0xEE,0xCD,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDD,0xDE,0xDD,0xBB,0xBA,0xBA, + 0xBA,0xBB,0xBD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xAB,0xAA, + 0xBA,0xAA,0xBB,0xBD,0xDE,0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDE,0xEE, + 0xDD,0xEC,0x99,0x88,0x78,0x77,0x87,0x77,0x76,0x66,0x66,0x66,0x79,0xEF,0xCA,0xA9, + 0x77,0x66,0x65,0x55,0x55,0x55,0x55,0x66,0x77,0x78,0x99,0x89,0x88,0x9A,0x98,0x78, + 0x9B,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xCB,0xBB,0xAA,0xAA,0xAB,0xEE, + 0xDD,0xDD,0xDD,0xEE,0xDB,0xCB,0xBC,0xBB,0xBB,0xCB,0xCD,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xCD,0xCC,0xDB,0xCC,0xCD,0xBB,0xBA,0xBB,0xAB,0xAB,0xCD, + 0xCD,0xCD,0xBC,0xCB,0xBB,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xCC,0xDC,0xDD, + 0xDE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB,0xBA,0xBA,0xBB,0xAB,0xAB,0xBB,0xAB, + 0xBB,0xCC,0xCB,0xBB,0xBA,0x98,0x88,0x89,0x9A,0xAA,0xA9,0xAA,0x9A,0x9A,0xAA,0xAA, + 0xA9,0x9A,0x9A,0xBA,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0xAA,0xBB, + 0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAB,0xAB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xDC, + 0xDC,0xDB,0xCB,0xCD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xED,0xED,0xDC, + 0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAA,0xAA,0xAA,0xBB,0xBB,0xAA,0xAB,0xAB,0xBB, + 0xBB,0xCC,0xDD,0xDD,0xCC,0xCC,0xBB,0xBC,0xCD,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x8D,0xA8,0xAE,0xEE,0xEE,0xEE,0xDB,0xDD,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xED,0xDD,0xCB,0xAB,0xAA, + 0xBA,0xBB,0xBC,0xCC,0xDC,0xDD,0xCD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xAB,0xBA,0xBB, + 0xAB,0xBB,0xBB,0xDE,0xFE,0xFE,0xEE,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xDD,0xDC, + 0xDB,0xCC,0xDE,0xEB,0x99,0x88,0x87,0x77,0x87,0x87,0x88,0x88,0xAF,0xFF,0xFF,0xFE, + 0xA8,0x87,0x77,0x77,0x77,0x77,0x77,0x78,0xAB,0xA9,0xA9,0x88,0x77,0x88,0x88,0x89, + 0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBC,0xDD,0xBB,0xBA,0xAA,0xAA,0xCE, + 0xDD,0xDD,0xCD,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xED,0xEE,0xEE,0xDE, + 0xED,0xEE,0xDD,0xDD,0xDD,0xDC,0xDC,0xBC,0xBC,0xBC,0xCB,0xBB,0xAB,0xBA,0xBB,0xCB, + 0xDC,0xDC,0xDC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDD, + 0xEE,0xFF,0xFF,0xFE,0xED,0xDC,0xDD,0xDC,0xCB,0xBA,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB, + 0xBB,0xCC,0xCB,0xBB,0xA9,0x98,0x88,0x89,0x99,0xAA,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA, + 0xAA,0xAA,0xA9,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x99,0xAA,0xAB, + 0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xBA,0xAB,0xAB,0xBB,0xBD, + 0xCD,0xCD,0xCD,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDD,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xDB,0xBB,0xAA,0xAA,0xAA, + 0xBB,0xBC,0xCC,0xDC,0xDD,0xCC,0xCB,0xBB,0xBD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x8A,0xD9,0x8C,0xEE,0xEF,0xEF,0xEC,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDD,0xED,0xDB,0xBA,0xBA, + 0xAB,0xBB,0xBC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDB,0xDB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xCD,0xDE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xDE,0xEE,0xDD,0xCB, + 0xBB,0xBB,0xBC,0xCC,0xBC,0xCC,0xBA,0x99,0x88,0x87,0x88,0x88,0x8D,0xFF,0xFF,0xFF, + 0xDC,0xA9,0x89,0xA9,0x98,0x87,0x87,0x77,0x77,0x88,0x77,0x89,0x9A,0xAB,0xAB,0xAB, + 0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDE,0xBA,0xAA,0xBB,0xBB,0xAD, + 0xEC,0xBB,0xBC,0xCD,0xCC,0xCC,0xBC,0xBB,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDC,0xDD,0xCD,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xCD, + 0xDC,0xCC,0xCC,0xBB,0xBB,0xCB,0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xAB,0xBB,0xBC,0xDD, + 0xDE,0xFF,0xFF,0xFE,0xED,0xDD,0xCC,0xCD,0xBB,0xBB,0xAB,0xAB,0xBA,0xBA,0xBB,0xAB, + 0xBB,0xCC,0xBB,0xBB,0xBA,0x98,0x88,0x88,0x9A,0x9A,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA, + 0xAA,0xAA,0xA9,0xA9,0xAA,0x9A,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0xBB, + 0xAB,0xBA,0xBA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAB,0xAB,0xAA,0xBA,0xBB, + 0xBC,0xDC,0xCC,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDE,0xDD,0xDC,0xDC,0xCC, + 0xBC,0xBB,0xCB,0xBB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xBD,0xCC,0xBB,0xAA,0x9A,0x9A, + 0xAB,0xBB,0xBD,0xCD,0xCC,0xDB,0xBC,0xBB,0xBC,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0xDB,0x89,0xEE,0xEE,0xEE,0xEE,0xCD,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDE,0xDD,0xDC,0xBB,0xAA, + 0xBA,0xBB,0xCC,0xCD,0xDC,0xCD,0xCD,0xCD,0xDD,0xCD,0xCC,0xBB,0xBA,0xAA,0xBA,0xBB, + 0xBC,0xCC,0xBC,0xDE,0xEE,0xEE,0xEE,0xFF,0xFE,0xFF,0xFF,0xED,0xEE,0xEE,0xEE,0xDB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBD,0xBB,0xBB,0xBA,0x99,0x88,0x88,0x88,0x88, + 0x88,0x77,0x77,0x77,0x88,0x78,0x87,0x88,0x89,0xAC,0xAA,0xBA,0xAA,0xBA,0xBA,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xCC,0xBB,0xBA,0xBB,0xDD,0xDC,0xDE,0xEB,0xAB,0xAB,0xDB,0xBB, + 0xCB,0xBB,0xBC,0xBC,0xBC,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xED,0xEE, + 0xDE,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xCC,0xBB,0xBA,0xBB,0xCD, + 0xCD,0xBD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xBB,0xBC, + 0xDE,0xFF,0xFF,0xEE,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xAB,0xBA, + 0xBB,0xBC,0xBC,0xBB,0xBA,0x98,0x88,0x89,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAB, + 0xAB,0xBB,0xA9,0xA9,0xA9,0xAA,0x9A,0xA9,0xA9,0xA9,0xA9,0xA9,0x99,0x99,0xAB,0xAB, + 0xBB,0xBB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0xAB, + 0xBB,0xBC,0xBD,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xCD,0xCC,0xCB, + 0xBB,0xBD,0xCD,0xDC,0xCB,0xBB,0xAA,0xAA,0x9A,0xAB,0xBC,0xDD,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xBB,0xBC,0xCC,0xDD,0xCD,0xCB,0xCB,0xBB,0xCD,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x9E,0xA8,0xAE,0xEE,0xFE,0xEE,0xEC,0xDD,0xED, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDE,0xDD,0xBB,0xAB, + 0xAA,0xBB,0xBC,0xDC,0xCD,0xBD,0xCD,0xCD,0xCD,0xCC,0xCB,0xBB,0xAB,0xAA,0xAB,0xBB, + 0xBC,0xDC,0xDD,0xDD,0xED,0xEE,0xFF,0xFF,0xFF,0xFF,0xEE,0xDE,0xDE,0xEE,0xEE,0xDD, + 0xBB,0xBB,0xBB,0xCD,0xBB,0xAB,0xBB,0xBA,0xAB,0xAB,0xDD,0xDB,0xBA,0xAB,0xBA,0xBB, + 0xCC,0xBC,0xCB,0xBB,0xCD,0xBC,0xCB,0xBB,0xBB,0xBA,0x9A,0x9A,0xAA,0xAA,0xAB,0xBB, + 0xBB,0xBC,0xCD,0xBD,0xCC,0xBA,0xAA,0xBD,0xDE,0xED,0xBE,0xFD,0xBA,0xAB,0xAB,0xBA, + 0xBB,0xBB,0xBB,0xBC,0xBB,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xED,0xDD,0xDC,0xDC,0xDB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xDC,0xBB,0xAB,0xBB,0xDB, + 0xDC,0xCC,0xBC,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xAA,0xAA,0x9A,0x99,0xA9,0xAA,0xBB, + 0xCD,0xEF,0xFF,0xEE,0xDD,0xDD,0xBD,0xBC,0xBB,0xBB,0xBA,0xAB,0xAB,0xAB,0xBA,0xBB, + 0xBB,0xBC,0xBB,0xBB,0xBA,0x98,0x88,0x88,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xAB,0xAB,0xAA,0x9A,0xAA,0x9A,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0x9A,0xAA,0xBB, + 0xBB,0xAB,0xBA,0xAB,0xAA,0xAB,0xAB,0xAB,0xAA,0xAA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBC,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xED,0xDC,0xDB,0xBB,0xBB, + 0xCC,0xDD,0xCC,0xDB,0xCB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBC,0xDC,0xBB,0xA9,0x99,0xAA, + 0xAA,0xAB,0xBB,0xCD,0xCD,0xCC,0xDB,0xCB,0xBB,0xCC,0xDE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xCC,0xBA,0xAA,0x99,0x8A,0xD9,0x8D,0xEE,0xEE,0xFE,0xED,0xDD,0xDE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xDD,0xDD,0xDB,0xBA, + 0xBA,0xBB,0xDC,0xDC,0xDB,0xDB,0xDC,0xDC,0xDC,0xCC,0xCB,0xBB,0xAA,0xAA,0xAA,0xBB, + 0xBC,0xCD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xFE,0xED, + 0xCC,0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xA9,0x89,0x88,0x9A,0xBB, + 0xDC,0xDC,0xDB,0xAA,0xBB,0xBA,0xAA,0xAA,0xAA,0x99,0x99,0x99,0xAA,0xBA,0xBA,0xBB, + 0xCB,0xDC,0xCC,0xDD,0xCB,0xBA,0xAA,0xBE,0xDD,0xDE,0xBB,0xDE,0xBB,0xAA,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBD,0xCD, + 0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBA,0xAA,0x99,0x99,0xA9,0x99,0x99,0x9A, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xCC,0xBB,0xAB,0xBA,0xBA,0xBA,0xBA,0xBA, + 0xBB,0xBB,0xBB,0xCB,0xBA,0x98,0x88,0x88,0x99,0xA9,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA, + 0xBA,0xBB,0xAA,0x9A,0x99,0xA9,0xA9,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0xAA,0xBA, + 0xBB,0xBB,0xAB,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x9A,0xAA, + 0xAB,0xBB,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xCC,0xBB,0xBB, + 0xBC,0xBD,0xDD,0xBD,0xCC,0xBB,0xBA,0xAA,0xAA,0xAA,0xBC,0xCC,0xCA,0xAA,0x9A,0x9A, + 0x9A,0xAB,0xAB,0xBB,0xDC,0xDD,0xCC,0xCC,0xBB,0xCB,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x88,0xDB,0x89,0xEE,0xEE,0xEE,0xFE,0xDD,0xDD, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xDC,0xBB, + 0xAB,0xBB,0xCC,0xDC,0xCC,0xCD,0xBC,0xCC,0xCC,0xBC,0xBB,0xBB,0xAB,0xAA,0xBA,0xBB, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xEE,0xEE, + 0xDC,0xBC,0xCB,0xDB,0xBB,0xAB,0xAB,0xBB,0xBA,0xAB,0xAB,0xAA,0x99,0x89,0x99,0xBB, + 0xCC,0xCC,0xBA,0xAA,0xBB,0xBB,0xAA,0xAA,0x99,0x99,0x99,0x9A,0xAB,0xAB,0xBB,0xBB, + 0xCD,0xCC,0xDC,0xDC,0xCB,0xAA,0xA9,0xAD,0xDD,0xDE,0xDB,0xBA,0xBA,0xAA,0xBB,0xBB, + 0xBB,0xBC,0xBC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCC,0xCB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xAB,0xBB,0xCC,0xCC, + 0xDB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBA,0xA9,0x9A,0x9A,0x9A,0xA9,0xA9,0x99, + 0xAC,0xDC,0xDD,0xDD,0xDD,0xDC,0xCC,0xCB,0xBB,0xBB,0xBA,0xAA,0xBA,0xAB,0xAB,0xAB, + 0xBB,0xBB,0xBB,0xCC,0xCB,0xA8,0x88,0x78,0x89,0x9A,0xAA,0xBB,0xBB,0xAA,0xAA,0xA9, + 0xAA,0xBA,0xAA,0x9A,0xA9,0xAA,0x9A,0x9A,0xA9,0xA9,0xA9,0xA9,0x99,0xA9,0xAB,0xBB, + 0xBB,0xBA,0xBA,0xAB,0xAA,0xBA,0xBA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA, + 0xAA,0xBB,0xDD,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xBB,0xBB,0xBB, + 0xCD,0xDD,0xCD,0xDB,0xCC,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBD,0xBB,0xA9,0x99,0x99, + 0xAA,0xAA,0xBB,0xBB,0xCD,0xCD,0xCD,0xBB,0xBB,0xBB,0xCD,0xEE,0xEF,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xFE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x9D,0xA8,0xAE,0xEE,0xFE,0xEE,0xEC,0xDD, + 0xED,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDE,0xDD,0xDD,0xBB, + 0xBA,0xBB,0xBC,0xCC,0xBC,0xCC,0xCC,0xBC,0xBB,0xBC,0xCB,0xBA,0xBA,0xBB,0xAB,0xBB, + 0xBD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xED, + 0xDC,0xDC,0xCD,0xCC,0xBA,0xBA,0xBB,0xBB,0xBB,0xAB,0xBB,0xBA,0xA9,0x99,0x99,0xAC, + 0xDD,0xDC,0xCA,0x9A,0xCC,0xCB,0xBA,0xAA,0x9A,0x99,0x99,0x9A,0xAA,0xBA,0xBA,0xBB, + 0xCC,0xCD,0xCD,0xCC,0xBB,0xBA,0xAA,0xAB,0xDD,0xCB,0xBA,0xBA,0xBA,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xBD,0xCC,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBA,0xBC,0xBD,0xCD, + 0xCC,0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBA,0xAA,0x99,0x99,0xA9,0xA9,0xAA,0xAA,0xA9, + 0x9A,0xBC,0xBC,0xDC,0xDD,0xCD,0xDC,0xCB,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB, + 0xAB,0xBB,0xCB,0xBC,0xCB,0xA9,0x88,0x88,0x89,0x9A,0xAA,0xBC,0xDB,0xBB,0xAA,0xAA, + 0xA9,0xAB,0xAA,0xAA,0x9A,0xA9,0xAA,0xA9,0xA9,0xA9,0xAA,0x99,0xA9,0x9A,0xAB,0xAB, + 0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAB,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9, + 0xAA,0xBB,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xCB,0xBB,0xBB, + 0xCC,0xCD,0xDD,0xCD,0xCB,0xBB,0xBA,0xBA,0xAA,0xAA,0xAB,0xBC,0xBB,0xA9,0x99,0x99, + 0xA9,0xAA,0xAA,0xBB,0xBC,0xDC,0xDB,0xDC,0xCC,0xBB,0xBD,0xDE,0xEE,0xEF,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEE,0xDD,0xCC,0xBA,0xA9,0x99,0x8B,0xC9,0x8C,0xEE,0xEE,0xFE,0xED,0xDD, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xDD,0xDB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBA,0xAB,0xAB,0xBB,0xBC, + 0xDD,0xDE,0xDE,0xDD,0xDE,0xDD,0xDD,0xDE,0xED,0xED,0xDE,0xDE,0xEF,0xFF,0xFE,0xEE, + 0xDD,0xDD,0xDC,0xDB,0xBB,0xBA,0xBA,0xBB,0xBA,0xBA,0xBB,0xBA,0xA9,0x99,0xAA,0xAB, + 0xEE,0xEC,0xA9,0x99,0xAD,0xDB,0xBA,0xAA,0xA9,0x99,0x9A,0xAA,0xBB,0xAB,0xAB,0xBB, + 0xCD,0xDD,0xCB,0xBB,0xBB,0xBA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD, + 0xCD,0xDD,0xCC,0xDB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBA,0xBB,0xBB,0xAB,0xBC,0xCD,0xCD, + 0xBC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA, + 0x99,0xAB,0xBB,0xCD,0xCD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xCC,0xB9,0x88,0x88,0x88,0x99,0xAA,0xBD,0xEE,0xDB,0xBA,0xAA, + 0x9A,0xAA,0xAA,0x9A,0x9A,0x9A,0xA9,0xA9,0xA9,0x9A,0x99,0xA9,0x99,0xAA,0xAB,0xBB, + 0xAB,0xAB,0xAA,0xAA,0xAB,0xAB,0xAA,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0x9A,0x9A,0x9A, + 0xAA,0xAB,0xCD,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xED,0xDD,0xBB,0xBB,0xBB, + 0xCD,0xDD,0xDC,0xCC,0xCB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAB,0xBC,0xBB,0xA9,0x99,0x99, + 0x99,0xAA,0xAA,0xBB,0xBB,0xCD,0xCD,0xBC,0xCB,0xBB,0xCC,0xDD,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x88,0xDB,0x89,0xEE,0xFE,0xEE,0xEE,0xCD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xED,0xDD,0xDD, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xAA,0xBA,0xAB,0xBB,0xBD, + 0xDE,0xDE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xFF,0xEF,0xED, + 0xDC,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xBD, + 0xCD,0xBA,0x99,0x99,0x9B,0xDB,0xBB,0xAA,0xA9,0x99,0xAA,0xAB,0xBA,0xBB,0xAB,0xBB, + 0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xCB,0xBB,0xCC,0xCB, + 0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xAB,0xBB,0xBB,0xDC,0xDC, + 0xCC,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xA9,0xA9,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xA9, + 0xA9,0x9A,0xAB,0xBB,0xDC,0xDC,0xDC,0xCB,0xCB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xAB, + 0xAB,0xBB,0xBB,0xCB,0xCC,0xBA,0x88,0x88,0x88,0x99,0x9A,0xBD,0xFF,0xFE,0xBB,0xAA, + 0x9A,0x9A,0x9A,0xAA,0xA9,0xAA,0x9A,0xAA,0xAA,0xAA,0x9A,0x9A,0x99,0x9A,0xAB,0xAB, + 0xBB,0xBB,0xBA,0xAB,0xAA,0xAA,0xAA,0xBA,0xAB,0xBB,0xBB,0xBA,0xA9,0xA9,0xA9,0x99, + 0xAA,0xAB,0xBD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBB,0xBB, + 0xDC,0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xAB,0xAA,0xA9,0xAA,0xBB,0xBB,0xA9,0x99,0x99, + 0x99,0xA9,0xAA,0xAB,0xBB,0xCC,0xDC,0xDB,0xDC,0xCB,0xBC,0xCD,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDC,0xCB,0xBA,0xA9,0x99,0xAD,0x98,0xAE,0xEE,0xFE,0xFE,0xEC, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDE,0xDD, + 0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBA,0xBB,0xBA,0xBA,0xAB,0xBB,0xBC,0xDD, + 0xDE,0xEE,0xED,0xED,0xED,0xED,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xED, + 0xCD,0xCD,0xDC,0xCB,0xCB,0xBB,0xAB,0xAB,0xBA,0xAA,0xAA,0xBA,0xBA,0xAB,0xBD,0xDC, + 0xBB,0xA9,0x99,0x99,0x9A,0xAB,0xBA,0xAA,0xAA,0xAA,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB, + 0xCD,0xDD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xBC,0xCC,0xCC,0xDD, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xDC,0xDB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB,0xAB,0xBC,0xDC,0xCC, + 0xCB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBA,0xAA,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xA9,0x99,0xAA,0xBB,0xCC,0xDC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB, + 0xBB,0xBB,0xBC,0xBC,0xCC,0xCB,0x98,0x88,0x88,0x99,0x99,0xAD,0xFF,0xFF,0xDA,0xAA, + 0xA9,0xA9,0xA9,0xA9,0xAA,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x99,0x9A,0x9A,0xAB,0xBA, + 0xBB,0xAB,0xAA,0xAA,0xAB,0xAA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA,0xA9,0x99,0xA9, + 0xAA,0xAB,0xBC,0xDD,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xCB,0xBB,0xBC, + 0xDC,0xDD,0xDD,0xDD,0xCC,0xBB,0xBA,0xAA,0xAA,0x9A,0xAA,0xBB,0xBB,0xA9,0x99,0x99, + 0x99,0x9A,0x9A,0xAA,0xBB,0xBC,0xDC,0xDC,0xCB,0xCB,0xBB,0xCD,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xAA,0x98,0x8C,0xA9,0x8D,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xEE,0xED,0xEE,0xDD,0xED,0xDD,0xDD, + 0xDB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBA,0xBA,0xBA,0xBB,0xBA,0xBA,0xBB,0xBC,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xED,0xEE,0xEE,0xDD, + 0xDC,0xDC,0xDC,0xDC,0xCC,0xBB,0xAB,0xAB,0xBB,0xBA,0xAA,0xBA,0xAB,0xBB,0xDD,0xDD, + 0xDB,0xBA,0x99,0x99,0x9A,0xAB,0xBB,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xCD,0xDC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCD, + 0xCD,0xCD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDC, + 0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xAA,0xA9,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0x9A,0xA9,0x9A,0xAB,0xBB,0xCB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB, + 0xAB,0xBB,0xBB,0xCB,0xBC,0xCC,0xA8,0x88,0x88,0x89,0x9A,0xAA,0xCE,0xFF,0xEC,0xAA, + 0xAA,0xAA,0xAA,0xAA,0x9A,0x9A,0xA9,0xAA,0xA9,0xA9,0x99,0x9A,0x99,0x9A,0xBA,0xBB, + 0xBA,0xBB,0xBA,0xAB,0xAA,0xBA,0xAA,0xAB,0xAB,0xBB,0xCC,0xBB,0xBA,0xAA,0xAA,0x9A, + 0xAA,0xAB,0xBB,0xDD,0xEE,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xDD,0xCB,0xAB,0xBC, + 0xCD,0xDD,0xDD,0xCD,0xBD,0xCB,0xBA,0xBA,0xAA,0xA9,0xAA,0xAB,0xBB,0xA9,0x99,0x99, + 0x99,0x99,0xA9,0xAA,0xAB,0xBB,0xCD,0xCD,0xCD,0xCB,0xBB,0xCB,0xDE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x99,0xDA,0x8A,0xEE,0xEF,0xEF,0xEE, + 0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xDE, + 0xDC,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBA,0xBB,0xBB,0xBB,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xED,0xDC, + 0xCB,0xCC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBC,0xBA,0xAA,0xBB,0xBC,0xDE,0xED,0xEE, + 0xDD,0xCB,0xA9,0xA9,0xAA,0xAB,0xBA,0xAA,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDB,0xDC,0xDD,0xCD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xBD,0xBD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBC,0xDB,0xCC, + 0xBB,0xBB,0xAB,0xAB,0xAA,0xBA,0xAA,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xA9,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCB,0xBB,0xBB,0xBA,0xBB, + 0xBB,0xBB,0xCC,0xCB,0xCB,0xCC,0xBA,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xDC,0xBA, + 0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xAA,0x99,0xA9,0xA9,0xA9,0x99,0x9A,0xAA,0xAB,0xBA, + 0xBB,0xBA,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xDC,0xCC,0xBB,0xAA,0xAA,0xAA, + 0xAA,0xAB,0xBC,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xDC,0xBB,0xBB,0xBC, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xAA,0xAA,0x9A,0x9A,0xBB,0xBA,0xA9,0x98,0x98, + 0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xCD,0xCD,0xCC,0xBC,0xBB,0xBC,0xDD,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xAA,0xA9,0x98,0xAD,0x98,0xBE,0xEE,0xEE,0xEE, + 0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xBB,0xAB,0xAB,0xBB,0xBD,0xDD,0xDE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xDE,0xDD, + 0xCD,0xBD,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBC,0xBB,0xBA,0xAB,0xCC,0xEE,0xED,0xEE, + 0xED,0xCB,0xAA,0xAA,0xAA,0xAB,0xBB,0xAB,0xBB,0xBC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xDC,0xBD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xED,0xEE,0xED,0xEE,0xDE,0xED,0xEE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB, + 0xDC,0xDC,0xBD,0xCD,0xCD,0xCC,0xCB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xDC,0xCB, + 0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xAA,0x99,0xAA,0xAA,0xAB,0xAB,0xAA,0xAA,0xAA,0xAA, + 0xAA,0xA9,0x9A,0xAA,0xBB,0xBA,0xBB,0xAB,0xBB,0xCB,0xCB,0xCC,0xCB,0xBA,0xBB,0xAB, + 0xAB,0xBB,0xBC,0xCC,0xBC,0xCC,0xBB,0x98,0x88,0x98,0x99,0x99,0x9A,0x9A,0xAA,0xAA, + 0xAA,0x9A,0xAA,0x9A,0xAA,0x9A,0x9A,0xAA,0xA9,0xA9,0x99,0x99,0x99,0xAA,0xBA,0xBB, + 0xBB,0xBA,0xBA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xDC,0xCB,0xBB,0xAA,0xAA, + 0xAA,0xBB,0xBC,0xCD,0xDE,0xEE,0xFE,0xFE,0xEF,0xEE,0xFE,0xED,0xDC,0xBB,0xBB,0xBB, + 0xDD,0xDE,0xED,0xED,0xDD,0xDC,0xBB,0xAA,0xAA,0x99,0xAA,0xBB,0xBA,0xA9,0x99,0x99, + 0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xDC,0xDD,0xCC,0xCB,0xBC,0xCD,0xEE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x8D,0xA8,0x8D,0xEE,0xEF,0xEE, + 0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDE,0xDD, + 0xDD,0xDB,0xBA,0xBA,0xBB,0xBA,0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xBC,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xDD, + 0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBB,0xBA,0xBA,0xBA,0xAA,0xAA,0xBA,0xBB,0xBB,0xCB,0xBB,0xCB,0xCB,0xCB,0xBB,0xCB, + 0xBB,0xBB,0xCC,0xCC,0xCB,0xCC,0xBC,0xBC,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCD, + 0xBC,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCC,0xDB,0xCB, + 0xBB,0xBB,0xAA,0xAA,0xBA,0xBA,0xAA,0x99,0x9A,0xBA,0xBA,0xAA,0xAA,0xAA,0xAB,0xAA, + 0xA9,0x99,0xAA,0xAB,0xBA,0xBB,0xBA,0xBB,0xBB,0xBC,0xBC,0xBC,0xCB,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xDB,0xCC,0xCB,0xB9,0x98,0x89,0x89,0x99,0x99,0xAA,0xAA,0xAA, + 0xAA,0xAA,0x9A,0xAA,0x9A,0xAA,0xA9,0xA9,0xA9,0x9A,0x99,0xA9,0xAA,0xAB,0xAB,0xBA, + 0xBA,0xBA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xCD,0xCB,0xBB,0xBA,0xAA, + 0xAB,0xBB,0xBC,0xCD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEF,0xEF,0xED,0xDB,0xBB,0xBB,0xBB, + 0xDD,0xDE,0xEE,0xDE,0xDD,0xDB,0xBA,0xAA,0xAA,0x9A,0xAA,0xBB,0xAA,0xA9,0x98,0x98, + 0x98,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xCD,0xCD,0xBB,0xBB,0xBB,0xBD,0xDE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x88,0xDA,0x8A,0xEE,0xEE,0xEF, + 0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xDD,0xDD,0xDE,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xED, + 0xDD,0xDD,0xCD,0xBD,0xCC,0xCB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xBC,0xBD,0xBD,0xBD,0xBD,0xCC,0xDB,0xCB, + 0xBB,0xBB,0xCB,0xCC,0xBC,0xCB,0xDB,0xDC,0xDC,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD,0xCC, + 0xDC,0xCB,0xCC,0xBB,0xBB,0xCB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB,0xBD,0xCC,0xCB, + 0xBB,0xBA,0xAA,0xAA,0xAA,0xBA,0xA9,0x99,0xAA,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA, + 0xAA,0xA9,0x99,0xAA,0xAB,0xBA,0xBA,0xBB,0xBB,0xBB,0xCB,0xDC,0xDB,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xBC,0xCC,0xCC,0xCC,0xCC,0xBB,0x89,0x88,0x98,0x99,0x99,0x99,0xA9,0xA9, + 0xAA,0x9A,0xA9,0xA9,0xAA,0xA9,0xAA,0x9A,0x9A,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xBB,0xBB,0xBC,0xBB,0xBD,0xBD,0xCC,0xDD,0xDD,0xDC,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xDD,0xDD,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xDC,0xBB,0xBB,0xBB, + 0xBD,0xDD,0xEE,0xEE,0xDD,0xCB,0xBB,0xAA,0xAA,0xA9,0xAA,0xAB,0xBA,0x99,0x89,0x89, + 0x89,0x89,0x99,0x99,0x9A,0xAA,0xBB,0xBD,0xCB,0xDC,0xCB,0xBB,0xBC,0xDE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x99,0xAD,0x98,0xBE,0xEE,0xFE, + 0xEE,0xEC,0xCD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD, + 0xDE,0xDD,0xCB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xEE,0xDE, + 0xED,0xEE,0xEE,0xDE,0xDE,0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xED, + 0xDD,0xDD,0xDC,0xDC,0xCB,0xCC,0xCD,0xBD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xDC,0xDB,0xDC,0xCC,0xDB,0xDB,0xCD,0xBC, + 0xDB,0xDB,0xCD,0xBC,0xDC,0xDC,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD, + 0xCD,0xCD,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBC,0xCC,0xBB, + 0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x9A,0xAB,0xBB,0xCB,0xBB,0xAB,0xAA,0xAA, + 0xA9,0x99,0x9A,0xAA,0xAB,0xAB,0xBB,0xAB,0xBB,0xBC,0xCB,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xCD,0xBD,0xBC,0xCD,0xBB,0xA8,0x89,0x89,0x89,0x99,0x99,0x9A,0x9A, + 0xA9,0xA9,0xAA,0xAA,0xA9,0xAA,0x9A,0x9A,0x99,0x99,0x99,0x99,0xAA,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xAA,0xAB,0xBB,0xCD,0xDD,0xDD,0xCC,0xCC,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xBB,0xCD,0xBD,0xCD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xCC,0xBB,0xBB,0xBC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xBA,0xAB,0xAA,0xAA,0xAA,0xBB,0xAA,0x99,0x89,0x88, + 0x98,0x98,0x98,0x99,0x9A,0xAA,0xBB,0xBC,0xDD,0xCC,0xCB,0xBB,0xBC,0xDE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8D,0xA8,0x8D,0xEE,0xEF, + 0xEE,0xED,0xDD,0xDD,0xED,0xEE,0xEF,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDD,0xED, + 0xDD,0xDD,0xDC,0xBA,0xAA,0xA9,0xA9,0xAA,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCC,0xCC,0xCD,0xCD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xDC,0xDD,0xCB,0xDC,0xCC,0xBD,0xCC,0xBC, + 0xCC,0xBD,0xCC,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD, + 0xCD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDD,0xBD,0xCD,0xBD,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB,0xCB,0xCC,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xAA,0xBA,0xA9,0x98,0x9A,0xAA,0xAB,0xDD,0xBB,0xBB,0xBB,0xAA, + 0xAA,0x99,0x99,0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xCB,0xBD,0xBD,0xCB,0xBB,0xAB,0xAB, + 0xAB,0xBB,0xBC,0xCC,0xCC,0xBD,0xCB,0xDC,0xBA,0x88,0x98,0x98,0x98,0x99,0x99,0x99, + 0x99,0xAA,0x9A,0x9A,0x9A,0xA9,0xA9,0x99,0x99,0x99,0x99,0x9A,0xAB,0xAB,0xBB,0xBB, + 0xBB,0xBA,0xAB,0xAB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xDC, + 0xBD,0xCC,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDD,0xCC,0xCC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0x99,0x88,0x98, + 0x88,0x89,0x89,0x89,0x99,0xAA,0xAB,0xBC,0xCC,0xCD,0xBB,0xBB,0xBB,0xCD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x99,0xDA,0x8A,0xEE,0xEE, + 0xEF,0xEE,0xCD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xBB,0xAA,0xA9,0xAA,0xA9,0xAA,0xBC,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xBB,0xBB,0xCB,0xCB,0xDC,0xDC,0xDC,0xDB,0xCD,0xDC,0xDB,0xDC,0xDC, + 0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD, + 0xCD,0xDD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBC,0xCB,0xBB, + 0xBA,0xBA,0xAA,0x9A,0xAA,0xAA,0xA9,0x89,0x99,0xAA,0xAA,0xBD,0xED,0xDC,0xBA,0xAA, + 0x99,0x99,0x9A,0x9A,0xAB,0xAA,0xBA,0xBB,0xBB,0xBC,0xDB,0xDC,0xDB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCC,0xDC,0xDB,0xDB,0xCD,0xCB,0xA8,0x98,0x98,0x99,0x99,0x99,0x99, + 0x99,0x99,0x9A,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xAB,0xBC,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xDD, + 0xCC,0xCD,0xCD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDC,0xDD,0xEE, + 0xEE,0xDD,0xDD,0xDC,0xDB,0xBB,0xAA,0xBA,0xBA,0xBA,0xBA,0xBA,0xA9,0x98,0x98,0x89, + 0x89,0x88,0x98,0x99,0x99,0x9A,0xAA,0xBB,0xBD,0xCC,0xDB,0xBB,0xBB,0xDD,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xAA,0xA9,0x89,0xAC,0x98,0xBE,0xEF, + 0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xDE, + 0xDD,0xDD,0xDD,0xCB,0xAA,0xAA,0x99,0x9A,0xAA,0xBB,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xED, + 0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB, + 0xAB,0xAB,0xBB,0xBC,0xCC,0xBB,0xBD,0xCD,0xCD,0xCD,0xBD,0xCC,0xCC,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xDC,0xDC,0xDC, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDD,0xCD,0xCD,0xCD,0xCB,0xDC,0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB, + 0xBB,0xBA,0xAA,0xA9,0xAA,0xBA,0xA9,0x98,0x89,0x9A,0xAA,0xAA,0xDD,0xDD,0xBA,0xAA, + 0x99,0x99,0x99,0xAA,0xAA,0xBA,0xAA,0xBA,0xBB,0xCC,0xCC,0xDC,0xDC,0xBB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xCC,0xBD,0xBD,0xCC,0xCD,0xBA,0x99,0x98,0x98,0x98,0x98,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x98,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBA,0xAB,0xBB,0xCC,0xDD,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xCD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xCD,0xBB,0xBB,0xAB,0xAB,0xBA,0xBA,0xAA,0x99,0x98,0x88,0x88, + 0x88,0x98,0x89,0x89,0x99,0x9A,0xAA,0xAB,0xCB,0xDC,0xCB,0xBB,0xBB,0xBD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x99,0x8D,0xA8,0x8D,0xEE, + 0xEF,0xEE,0xED,0xCD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDB,0xBA,0xA9,0xA9,0xAA,0xAA,0xBC,0xDD,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xED,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE, + 0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCC,0xCD,0xCD,0xCD,0xDC,0xDB,0xCB,0xCD,0xBD,0xBD,0xCD,0xCD, + 0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCD, + 0xDC,0xDD,0xDC,0xDC,0xDD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD, + 0xCD,0xDC,0xDC,0xDC,0xDB,0xCC,0xCB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xAA,0xA9,0x9A,0xAA,0xAA,0xA9,0x98,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0x9A,0x99, + 0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xAB,0xAB,0xBB,0xCC,0xDC,0xDD,0xBC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBC,0xDB,0xDC,0xDB,0xDB,0xDB,0xDC,0xB9,0x99,0x99,0x89,0x89,0x89, + 0x98,0x99,0x99,0x99,0x99,0x98,0x99,0x98,0x99,0x99,0x9A,0xAB,0xBB,0xBA,0xBA,0xBA, + 0xBA,0xBA,0xBA,0xBB,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xCC,0xCB,0xBA,0xBA,0xBA,0xBB,0xAB,0xAA,0x99,0x88,0x88,0x88, + 0x88,0x88,0x98,0x98,0x99,0x99,0xAA,0xAB,0xBC,0xCD,0xBC,0xBB,0xBB,0xBD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x89,0xDA,0x8A,0xEE, + 0xEE,0xFE,0xFE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xBA,0xAA,0x9A,0x9A,0xAA,0xBB,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEE,0xEE, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xDD,0xDD,0xDE,0xDD,0xDD,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xBD,0xBD,0xCC,0xCB,0xDC,0xDC,0xDD, + 0xCD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xCD,0xCC, + 0xCD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBB, + 0xBA,0xBA,0xAA,0xA9,0xAA,0xAA,0xAA,0x98,0x88,0x99,0xA9,0xA9,0xAA,0xAA,0xA9,0x99, + 0x99,0x99,0x9A,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCB,0xDC,0xDC,0xDC,0xBB,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCC,0xCB,0xDC,0xCD,0xCD,0xCD,0xCB,0xA9,0x99,0x98,0x98,0x98, + 0x89,0x89,0x89,0x89,0x89,0x89,0x98,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xAB,0xBC,0xBD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xFE,0xFF,0xEF, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xAB,0xBB,0xBB,0xBB,0xA9,0x99,0x88,0x98,0x89, + 0x88,0x89,0x88,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCD,0xCC,0xBB,0xBB,0xBC,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0xAC,0x98,0xBE, + 0xEE,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xCB,0xAA,0xA9,0xAA,0xAB,0xBB,0xDD,0xEE,0xFE,0xFE,0xEF,0xEE, + 0xED,0xDD,0xDD,0xED,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFF,0xEE,0xEE,0xED, + 0xDD,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xDD,0xEE,0xDE,0xDD,0xCB,0xCB, + 0xBB,0xBB,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDB,0xDB,0xCC,0xCD,0xBD,0xCD,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xDB,0xDB, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xBD,0xCD,0xCD,0xBC,0xCB,0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBA,0xAA,0x9A,0xAA,0xAA,0xBA,0xA9,0x88,0x89,0x99,0xA9,0xA9,0xA9,0x99,0x99, + 0x98,0x99,0x9A,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB,0xCD,0xCD,0xCD,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCD,0xDC,0xDC,0xDB,0xDB,0xDB,0xDD,0xCB,0xA9,0x99,0x99,0x99, + 0x99,0x99,0x99,0x98,0x98,0x98,0x99,0x99,0x9A,0xAB,0xBB,0xBB,0xBA,0xBB,0xAB,0xAB, + 0xBA,0xBA,0xBA,0xBB,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xFE,0xFE,0xEF,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xED,0xCC,0xDB,0xCC,0xCB,0xBB,0xBA,0xBB,0xBB,0xBA,0xA9,0x98,0x88,0x88,0x88, + 0x88,0x88,0x89,0x89,0x89,0x89,0x9A,0xAA,0xBB,0xCC,0xCB,0xCB,0xBB,0xBC,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x98,0x8D,0xA8,0x8D, + 0xEE,0xEF,0xEE,0xEE,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0x9A,0xAA,0xBB,0xDD,0xEE,0xEF,0xEF,0xFE,0xEE, + 0xEE,0xED,0xED,0xED,0xEE,0xED,0xED,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xED, + 0xED,0xDD,0xDE,0xDD,0xED,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xED,0xED,0xDC,0xBB, + 0xBB,0xCC,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCC,0xCD,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xDB,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xBD,0xBD, + 0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xBA,0xBA,0xA9,0xA9,0xAA,0xAB,0xAA,0xA9,0x98,0x89,0x89,0x99,0xA9,0x99,0x99,0x99, + 0x98,0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBC,0xCC,0xBD,0xBD,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCB,0xCC,0xBD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCA,0x99,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAB,0xAA,0xBB,0xBB,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBB,0xA9,0x89,0x88,0x98,0x88, + 0x88,0x89,0x88,0x88,0x98,0x99,0x99,0xAA,0xAB,0xBB,0xDC,0xBB,0xBB,0xBB,0xDE,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x99,0xDA,0x8A, + 0xEE,0xEE,0xEF,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xDE,0xDD,0xDE,0xDD,0xBA,0xA9,0xAA,0xAA,0xBB,0xDD,0xEE,0xEF,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD, + 0xDD,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xEE,0xEE,0xDD,0xDD,0xBB, + 0xBC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xCC,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xCD,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xCC,0xCD,0xBC,0xCC, + 0xCC,0xCC,0xCD,0xCD,0xCD,0xCD,0xBC,0xCC,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAB, + 0xAB,0xBA,0xAA,0x9A,0x9A,0xAA,0xBB,0xAA,0x99,0x88,0x99,0x99,0x99,0x99,0x99,0x98, + 0x89,0x99,0xAA,0xBA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC,0xDB,0xDC,0xDB,0xBB,0xBB,0xBB, + 0xCB,0xBB,0xCB,0xBB,0xCC,0xDC,0xDD,0xCD,0xDC,0xDC,0xCC,0xDC,0xDC,0xCA,0xA9,0x99, + 0xA9,0xA9,0xA9,0xA9,0x9A,0x9A,0xAA,0xAA,0xBB,0xBC,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB, + 0xAB,0xAB,0xAB,0xCD,0xDD,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE, + 0xEE,0xED,0xCB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xAA,0x98,0x88,0x88,0x98, + 0x98,0x98,0x89,0x89,0x89,0x89,0x99,0xAA,0xAB,0xBC,0xCC,0xCB,0xBB,0xBB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x89,0xAC,0x98, + 0xBE,0xEF,0xEE,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xED,0xDD,0xDD,0xDD,0xDD,0xCB,0xAA,0xA9,0xAA,0xBB,0xCD,0xEE,0xEF,0xEF,0xEF,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEE,0xED,0xED, + 0xDD,0xDD,0xEE,0xEE,0xED,0xED,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xED,0xEE,0xDD,0xDC, + 0xBD,0xCD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xBD,0xCB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xCD,0xBD,0xCC,0xCB,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCB,0xDB,0xDB,0xDC,0xCB,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xAB,0xAA,0xA9,0xAA,0xAA,0xAA,0xBA,0xA9,0x98,0x98,0x98,0x99,0x99,0x99,0x99, + 0x99,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xBD,0xCD,0xCB,0xBB,0xBB,0xBB, + 0xBC,0xCB,0xBC,0xBC,0xBC,0xCB,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDB,0xBB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBD,0xBD,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xBA,0xBB,0xBC,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF, + 0xEE,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xED,0xCD,0xDE, + 0xEE,0xDD,0xDC,0xBB,0xBB,0xBB,0xBC,0xBB,0xBA,0xBA,0xBB,0xBA,0x99,0x88,0x88,0x88, + 0x88,0x89,0x88,0x88,0x98,0x99,0x99,0x9A,0xAB,0xBB,0xDC,0xBC,0xBB,0xBB,0xDD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x8D,0xA8, + 0x8D,0xEE,0xEF,0xEF,0xEE,0xCD,0xDE,0xED,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0x9A,0xAB,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDE,0xED,0xED,0xED,0xED,0xED,0xDD,0xDD,0xCD,0xDC,0xDD,0xDE,0xDE,0xDD,0xDD, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCC,0xDB,0xCC,0xCC,0xCC, + 0xBC,0xBC,0xBC,0xBC,0xCD,0xCD,0xBD,0xCC,0xDB,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBA,0xBA,0xAA,0xA9,0xAA,0xAA,0xBB,0xAA,0xAA,0xA9,0x99,0x99,0x99,0x99,0x99,0x99, + 0xAA,0xAA,0xAB,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xDB,0xDB,0xCC,0xBB,0xBB,0xCB, + 0xCB,0xCC,0xCB,0xBC,0xBC,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xCD,0xCC,0xDD,0xDD,0xCC,0xDB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBA,0xBB,0xBB,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xDC,0xDC,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xED,0xDC,0xCC, + 0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBA,0xBB,0xBB,0xAB,0xA9,0x98,0x89,0x88, + 0x98,0x98,0x99,0x98,0x98,0x98,0x99,0x9A,0xAB,0xBB,0xCC,0xCB,0xBB,0xBB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x89,0xDA, + 0x8A,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xDE,0xDE,0xDE,0xDD,0xDE,0xDD,0xBB,0xAA,0xAA,0xAB,0xBD,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xED,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xED,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xCC,0xDC,0xCC,0xCB,0xCB,0xCB, + 0xBB,0xCB,0xBB,0xBB,0xCC,0xCB,0xDB,0xDC,0xCD,0xCD,0xBD,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAA,0xAA,0xAB,0xAB,0xBA,0xBA,0xAA,0xAA,0x9A,0x99,0x99,0x99,0x9A,0xAA, + 0xAA,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBC,0xBD,0xCD,0xCB,0xBB,0xBB,0xBC, + 0xCC,0xCC,0xBB,0xCB,0xCC,0xCC,0xCC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD, + 0xDD,0xDE,0xDE,0xED,0xED,0xDD,0xDD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB, + 0xAA,0xAB,0xBB,0xCD,0xDE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xEE,0xDD,0xDC,0xBC,0xBD,0xDE,0xEE,0xFE,0xFE,0xFF,0xEF,0xEE,0xFE,0xEE,0xDD,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAA,0xBB,0xBA,0xA9,0x99,0x88,0x89, + 0x88,0x89,0x88,0x89,0x89,0x99,0x99,0x9A,0xAA,0xBB,0xBC,0xCB,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0xAD, + 0x98,0xBE,0xEE,0xFE,0xFE,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xBA,0xAA,0xAB,0xBC,0xDD,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE,0xED,0xED,0xDD, + 0xDE,0xDE,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xDC,0xDD,0xDD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xDB,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xBD,0xDC,0xDC,0xDB,0xDC,0xCD,0xCD,0xDD,0xCC,0xBB,0xBA,0xBB,0xBB,0xCE,0xEE, + 0xED,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDB,0xDB,0xCC,0xCB,0xBB,0xBB,0xBC, + 0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xBD,0xBD,0xBC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAB,0xAA,0x99,0x9A,0xAA,0xAA,0xAB, + 0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCD,0xBD,0xBC,0xCC,0xBC,0xBC,0xCB, + 0xCD,0xBD,0xCD,0xBC,0xBC,0xCC,0xCD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDD, + 0xDD,0xED,0xDD,0xDE,0xDD,0xDD,0xDC,0xDB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE, + 0xEE,0xDD,0xBB,0xBB,0xBC,0xDD,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEE,0xED,0xCB, + 0xBB,0xBB,0xAB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBA,0xBA,0xAA,0xBA,0xBA,0x99,0x89,0x88, + 0x98,0x98,0x99,0x89,0x98,0x98,0x99,0x99,0xAA,0xBB,0xCC,0xBB,0xBB,0xBB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x98,0x8D, + 0xA8,0x8D,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xDE,0xED,0xED,0xDD,0xDD,0xDC,0xBB,0xAA,0xBA,0xBB,0xCD,0xDE,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDE,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xCD,0xDC,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCC,0xCB,0xBA,0xBB,0xBA,0xBA,0xBB,0xCE, + 0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xBD,0xCC,0xBD,0xBD,0xCB,0xCB, + 0xBB,0xBB,0xCB,0xBC,0xBC,0xCC,0xCC,0xCC,0xDB,0xDB,0xDC,0xCC,0xBC,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xCB,0xDC,0xDC,0xCB,0xCC,0xBC,0xBD, + 0xCC,0xCC,0xCC,0xDB,0xDC,0xCC,0xBC,0xCC,0xDB,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD, + 0xDD,0xDD,0xED,0xED,0xDE,0xDD,0xDD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB, + 0xAB,0xBB,0xBC,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF, + 0xEE,0xDD,0xBB,0xBB,0xBB,0xDD,0xEE,0xEF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEE,0xDD, + 0xCB,0xBB,0xBB,0xAB,0xBA,0xBA,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xA9,0x98,0x98, + 0x99,0x89,0x98,0x99,0x89,0x99,0x99,0x99,0xAA,0xBB,0xCB,0xCB,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x88, + 0xDA,0x8A,0xEE,0xEE,0xFE,0xFE,0xED,0xDD,0xEE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xAA,0xAB,0xAB,0xBD,0xDD,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xCD,0xDD,0xCD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCC,0xBB,0xBA,0xBA,0xAA,0xAB,0xAB,0xBB,0xBC, + 0xDD,0xED,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDB,0xDB,0xCC,0xBC,0xBC, + 0xBB,0xBB,0xCB,0xCB,0xCD,0xBC,0xCC,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xCC,0xCC, + 0xCC,0xBB,0xBB,0xAB,0xBA,0xBA,0xBA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xDC,0xCB,0xBB,0xAA,0xBB,0xBB,0xCC,0xCD,0xCC,0xCC,0xBB,0xBC,0xCC,0xCC, + 0xCD,0xCD,0xCD,0xBD,0xCC,0xDB,0xDB,0xBC,0xCD,0xDD,0xDC,0xDD,0xDD,0xCD,0xCD,0xDD, + 0xDD,0xDD,0xDE,0xDD,0xED,0xDD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xAB,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xDD,0xEE,0xEF,0xEE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xDD,0xDB,0xBB,0xBC,0xDD,0xDE,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xFE,0xEE,0xED, + 0xCB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xA9,0x99,0x98, + 0x98,0x99,0x99,0x99,0x98,0x98,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98, + 0xAD,0x98,0xBE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDB,0xBB,0xAA,0xAB,0xBC,0xDD,0xDE,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDD,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xCC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xBD,0xCD,0xCD,0xCD,0xDC,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xBB, + 0xCD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCC,0xBC, + 0xBC,0xBC,0xBC,0xBC,0xCB,0xDC,0xCD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCD,0xCD,0xCB,0xCB, + 0xDC,0xDC,0xBB,0xBA,0xBB,0xBA,0xBA,0xBA,0xBA,0xBB,0xBB,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xCD,0xDC,0xCD,0xCC,0xBB,0xBB,0xBC,0xBB, + 0xCC,0xCC,0xDC,0xDD,0xBD,0xCC,0xCB,0xCB,0xBC,0xCB,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xBA, + 0xBB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE, + 0xFE,0xED,0xDC,0xCB,0xCB,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xED, + 0xDC,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xAA,0xAA,0xA9,0xAA,0xAA,0xA9,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x89,0x99,0xAA,0xAB,0xBB,0xCB,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98, + 0x8D,0xB9,0x8D,0xEE,0xEF,0xEE,0xEE,0xCD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xBB,0xAB,0xAB,0xBB,0xDD,0xDD,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDB,0xCC,0xDC,0xDC,0xCD,0xCD,0xCD,0xDD,0xDD,0xED,0xDD,0xCD,0xDD, + 0xCD,0xBC,0xDC,0xDD,0xCD,0xDD,0xCB,0xAA,0xAA,0xAA,0x99,0x99,0xAA,0xAB,0xBB,0xBB, + 0xBD,0xDE,0xED,0xED,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCC,0xCC,0xCB, + 0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCC,0xCD,0xCD, + 0xCD,0xDD,0xCB,0xBB,0xAB,0xAB,0xAB,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xCD,0xDD,0xBC,0xBB,0xBB,0xBC,0xBC,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xCB,0xDC,0xDC,0xDB,0xDB,0xDB,0xCB,0xBC,0xBC,0xCD,0xCD,0xDD,0xDD,0xCD,0xCD,0xBC, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBC,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBD,0xCD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xDD,0xCD,0xBD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFF,0xFE,0xFE,0xEE, + 0xDC,0xCB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAB,0xBB,0xAB,0xAA,0x9A,0xAA,0xAA,0x99,0x99, + 0x99,0x99,0x99,0x99,0x99,0x98,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99, + 0x89,0xDA,0x8A,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xED,0xED,0xED,0xDD,0xED,0xDD,0xDB,0xBA,0xBA,0xBB,0xCC,0xDD,0xDE,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDB,0xDB, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xCB,0xBB,0xBA,0xAA,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB, + 0xBB,0xCD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xCD,0xCB,0xBC, + 0xCC,0xBB,0xBB,0xBB,0xCC,0xCD,0xDE,0xED,0xDD,0xDD,0xDC,0xDC,0xDB,0xDC,0xDC,0xCD, + 0xCD,0xDD,0xDD,0xBB,0xBB,0xBB,0xAB,0xAA,0xBA,0xAB,0xAB,0xBB,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBC,0xCC,0xCC,0xDC,0xDC,0xBB,0xCB,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCB,0xDC,0xDD,0xCD,0xCD,0xCC,0xCB,0xCC,0xBC,0xBD,0xCD,0xCD,0xDD,0xDD,0xDC, + 0xCC,0xCC,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB, + 0xBB,0xCC,0xDD,0xDE,0xEE,0xFE,0xEF,0xEF,0xEE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF, + 0xEF,0xEE,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE, + 0xED,0xCB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAA,0xAA,0x9A,0xAA,0xAA,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBC,0xBB,0xBB,0xBB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99, + 0x98,0xAD,0x98,0xAE,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xDD,0xED,0xDC,0xBB,0xBA,0xBB,0xCD,0xDD,0xDD,0xEE, + 0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xCC,0xBB,0xAA,0xAA,0xA9,0x9A,0x99,0xA9,0xA9,0xAA,0xAB,0xAB, + 0xBB,0xBD,0xED,0xED,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDB,0xCD,0xBC,0xCD,0xBC, + 0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xEE,0xDD,0xDD,0xCD,0xCD,0xCC,0xCD,0xCD, + 0xDD,0xDD,0xED,0xDB,0xBB,0xBB,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xAB,0xBB,0xAB, + 0xBC,0xCC,0xCC,0xDD,0xCD,0xCD,0xBD,0xBC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xBB, + 0xBB,0xCD,0xCD,0xCD,0xCD,0xCD,0xCC,0xCC,0xBB,0xCB,0xBC,0xCD,0xDD,0xCD,0xCC,0xCC, + 0xBC,0xCD,0xDC,0xDD,0xDD,0xCD,0xBD,0xBC,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xBB,0xBB, + 0xBC,0xDC,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xFF,0xEF,0xEF,0xFE, + 0xFE,0xEF,0xEE,0xEE,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFE,0xFF,0xEE, + 0xEE,0xDB,0xBB,0xAA,0xAA,0xAA,0x9A,0x9A,0xAA,0xAB,0xBA,0xAA,0x99,0xAA,0xAA,0xA9, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9, + 0x98,0x8D,0xA8,0x8D,0xEE,0xEE,0xEE,0xEE,0xCD,0xDD,0xED,0xED,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xDD,0xDC,0xDD,0xDE,0xDE,0xED,0xDD, + 0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD, + 0xCD,0xDD,0xDD,0xDC,0xBB,0xAB,0xAA,0xA9,0x99,0x99,0xAA,0xAA,0xA9,0xA9,0xAA,0xBB, + 0xAB,0xBB,0xCD,0xED,0xED,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDB,0xDC,0xCB,0xDC, + 0xCB,0xCC,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xBD,0xED,0xDD,0xDD,0xCD,0xBD,0xCB,0xDC, + 0xDC,0xDD,0xCD,0xDD,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xAB,0xAB,0xAB,0xAB,0xAA,0xBB, + 0xBB,0xCB,0xCB,0xCB,0xDD,0xCD,0xDC,0xCD,0xBD,0xCC,0xBB,0xBB,0xAB,0xBB,0xCC,0xBD, + 0xCC,0xBC,0xCB,0xDB,0xDC,0xDC,0xDB,0xDB,0xDC,0xCB,0xCC,0xBD,0xCD,0xDD,0xDD,0xDC, + 0xCB,0xDC,0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xCB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB, + 0xBB,0xBD,0xDD,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xFE,0xFE, + 0xFE,0xFE,0xEF,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF, + 0xEE,0xDD,0xBB,0xAA,0xAA,0xA9,0xA9,0xA9,0xAA,0xAA,0xAB,0xAA,0xAA,0x9A,0xAA,0xAA, + 0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x9A,0xAB,0xBB,0xCB,0xBB,0xBB,0xBD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA, + 0x99,0x89,0xDA,0x8A,0xEE,0xEE,0xFE,0xEE,0xEC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xED,0xDD,0xED,0xDE,0xDE,0xDE,0xDB,0xBB,0xBA,0xBB,0xCC,0xDD,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xEE,0xED,0xDD,0xBD, + 0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xDC,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xBB,0xBA,0xAA,0xAA,0x99,0x99,0xAA,0xAB,0xAB,0xAA,0xA9,0xAA,0xAB, + 0xBB,0xBB,0xBD,0xDE,0xDD,0xDD,0xCD,0xDD,0xCD,0xDB,0xDC,0xDC,0xDC,0xCC,0xDC,0xCC, + 0xBC,0xCB,0xBB,0xAB,0xAB,0xAB,0xBA,0xBA,0xBB,0xBC,0xED,0xDD,0xDC,0xDC,0xDC,0xDC, + 0xDD,0xDC,0xDB,0xCC,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xAB, + 0xAB,0xBB,0xCC,0xDC,0xDC,0xDD,0xBD,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xBD,0xDC, + 0xCC,0xCC,0xCC,0xCD,0xCD,0xCD,0xCD,0xCC,0xCB,0xCC,0xBC,0xCC,0xDC,0xDC,0xDC,0xCC, + 0xBC,0xCD,0xDD,0xDC,0xDC,0xDC,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB, + 0xCD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xED,0xDE,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xCB,0xBA,0xAA,0x9A,0x9A,0x9A,0x99,0xAA,0xAA,0xAA,0xA9,0xA9,0xAA,0xAA, + 0xA9,0x9A,0x99,0x99,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA, + 0x99,0x98,0xAD,0x98,0xBE,0xEE,0xEE,0xFE,0xED,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xBB,0xBB,0xAB,0xBB,0xCD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDE,0xEE,0xDD,0xDD,0xCB, + 0xDC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD, + 0xDC,0xDD,0xDC,0xBB,0xAA,0xAA,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xAA,0x9A,0xAA, + 0xAB,0xAB,0xBB,0xCE,0xED,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDB,0xDC,0xCC,0xCB, + 0xCB,0xBB,0xBB,0xBB,0xAA,0xAA,0xAA,0xBB,0xAB,0xBB,0xDE,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xCD,0xCD,0xCC,0xBB,0xCC,0xBC,0xCC,0xBC,0xBB,0xCB,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBB,0xBC,0xCC,0xDC,0xDC,0xDC,0xDB,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xCC,0xCD, + 0xCC,0xCC,0xCC,0xCC,0xCD,0xCD,0xCD,0xCD,0xCD,0xCB,0xDB,0xDC,0xDC,0xDD,0xCD,0xBB, + 0xBB,0xBC,0xCD,0xDD,0xCD,0xCC,0xBC,0xBC,0xBC,0xBB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB, + 0xCC,0xDD,0xEE,0xEE,0xEE,0xEF,0xFE,0xFE,0xFF,0xEF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xED,0xDB,0xBA,0xAA,0xA9,0xA9,0x99,0xA9,0xA9,0xAA,0xBA,0xAA,0x9A,0x9A,0xAA, + 0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBC,0xBB,0xBB,0xBB,0xCD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xBA, + 0xA9,0x98,0x8D,0xA8,0x8D,0xEE,0xEE,0xEE,0xEE,0xCD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xED,0xDE,0xDD,0xCB,0xBB,0xAB,0xBB,0xBC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xEE,0xEE,0xDD,0xBC,0xCD, + 0xDC,0xDC,0xDC,0xDD,0xDC,0xDC,0xDD,0xDD,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD, + 0xCD,0xCC,0xCB,0xBA,0xAA,0x99,0x99,0x9A,0xAA,0xBB,0xBC,0xBB,0xCB,0xBA,0x99,0xAA, + 0xAA,0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xBD,0xCD,0xBD,0xBD,0xCD,0xBC, + 0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBB,0xBC,0xED,0xDD,0xDD,0xDC,0xDC, + 0xDC,0xCD,0xCD,0xBB,0xCB,0xCB,0xCB,0xCC,0xDB,0xCC,0xCD,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCC,0xDC,0xDB,0xDC,0xDC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xDC, + 0xDB,0xBB,0xCB,0xBC,0xCC,0xDC,0xDC,0xDB,0xCD,0xBD,0xBC,0xCC,0xCD,0xBD,0xCC,0xBB, + 0xAB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB,0xCC, + 0xDD,0xDD,0xEE,0xEF,0xEF,0xEE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xED,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xEE,0xDD,0xBB,0xAA,0xA9,0x9A,0x99,0x99,0x9A,0xAA,0xAA,0xBA,0xA9,0x9A,0xAA, + 0xAA,0xA9,0x99,0xA9,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBA, + 0xAA,0x99,0x89,0xDA,0x8A,0xEE,0xEE,0xEF,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xED,0xDC,0xBB,0xBB,0xAB,0xBB,0xBD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBB,0xBC,0xDE,0xDE,0xDD,0xDC,0xBB,0xCC, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xEE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDD, + 0xDD,0xDB,0xBB,0xAA,0xAA,0x99,0x99,0xAA,0xBB,0xCB,0xCB,0xDC,0xCC,0xBB,0xAA,0x99, + 0xAA,0xAA,0xBA,0xBB,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xCC,0xCC,0xCB, + 0xBB,0xBB,0xAA,0xAA,0xA9,0xA9,0x9A,0x9A,0xAB,0xAB,0xAB,0xCD,0xDD,0xDD,0xCD,0xDC, + 0xDC,0xDC,0xDC,0xDC,0xCC,0xBD,0xBD,0xCC,0xCD,0xBD,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCD,0xCD,0xCD,0xCD,0xCC,0xDC,0xBB,0xBB,0xBB,0xCC,0xCC,0xCC,0xCB,0xDC, + 0xDC,0xDC,0xCC,0xCC,0xBD,0xBD,0xBD,0xCD,0xDC,0xDC,0xDB,0xDB,0xDB,0xDC,0xDC,0xBB, + 0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE, + 0xFF,0xFF,0xEF,0xEF,0xEE,0xEE,0xED,0xEE,0xED,0xED,0xDE,0xDD,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xED,0xDB,0xAA,0x9A,0x99,0x99,0x9A,0x9A,0x9A,0xAA,0xAA,0xAA,0xA9,0xAA, + 0xAA,0xA9,0xA9,0x99,0x99,0x99,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB, + 0xAA,0x99,0x98,0xAD,0x98,0xBE,0xEE,0xFE,0xEE,0xED,0xCD,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDE,0xDD,0xDD,0xBB,0xBB,0xAA,0xBB,0xBB, + 0xCD,0xDD,0xCD,0xDD,0xDD,0xCC,0xCB,0xBB,0xBB,0xBC,0xDD,0xEE,0xDD,0xBC,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC, + 0xDC,0xCB,0xAA,0xAA,0x99,0x99,0xAA,0xAB,0xBB,0xCC,0xDC,0xDC,0xDC,0xCB,0xBA,0x9A, + 0x9A,0xAA,0xBB,0xBB,0xBD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCD,0xBD,0xCD,0xBD,0xCC,0xCB, + 0xBB,0xAB,0xAA,0xA9,0x99,0x99,0x99,0x9A,0x9A,0xAA,0xBB,0xBB,0xED,0xDD,0xDC,0xDD, + 0xCD,0xBC,0xDB,0xDB,0xDC,0xCC,0xCC,0xCD,0xBD,0xCD,0xBD,0xBB,0xBB,0xBB,0xBC,0xCC, + 0xCC,0xDB,0xDC,0xCC,0xCB,0xDB,0xDB,0xCB,0xCB,0xBB,0xBC,0xDC,0xDB,0xCC,0xCD,0xCD, + 0xDD,0xDC,0xCC,0xBC,0xBC,0xCC,0xDC,0xDC,0xDD,0xCD,0xCD,0xBD,0xBD,0xBD,0xBC,0xBA, + 0xAA,0xAA,0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBB,0xBA,0xBA,0xBB,0xBC,0xDC, + 0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xFE,0xFF, + 0xEF,0xEE,0xEE,0xDC,0xBA,0xA9,0xA9,0x9A,0x99,0x99,0xAA,0xAA,0xAB,0xAA,0xA9,0xA9, + 0xAA,0xAA,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB, + 0xBA,0xA9,0x98,0x8D,0xA9,0x8D,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xED,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDC,0xBB,0xBB,0xAB,0xBB, + 0xCC,0xCC,0xDC,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xDD,0xED,0xDC,0xBC,0xCD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD, + 0xDB,0xBB,0xAA,0xA9,0x99,0x9A,0xAB,0xBC,0xCC,0xCB,0xBC,0xCC,0xCC,0xDB,0xBA,0xA9, + 0x99,0xAA,0xAB,0xAB,0xBC,0xDD,0xDD,0xDD,0xCD,0xCD,0xDB,0xDC,0xCC,0xCC,0xBB,0xBB, + 0xBA,0xAA,0x9A,0x99,0x99,0x99,0xAA,0x99,0x99,0xAA,0xBA,0xBB,0xCD,0xED,0xDD,0xDB, + 0xDC,0xDD,0xCD,0xCD,0xCC,0xDB,0xDC,0xDC,0xDC,0xCD,0xCC,0xCC,0xBC,0xBC,0xBC,0xCC, + 0xDC,0xDD,0xCD,0xDD,0xDD,0xBD,0xCC,0xCC,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xCC,0xCB, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xCC,0xCD,0xBD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xBB, + 0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xBB,0xBC,0xBD,0xCC,0xBA,0xBB,0xBB,0xBB,0xCB,0xBD, + 0xDD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF, + 0xFE,0xFF,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE, + 0xFF,0xEF,0xEE,0xED,0xCB,0xAA,0x99,0x99,0x99,0x9A,0x99,0x9A,0xAA,0xAA,0xAA,0x9A, + 0xAA,0xAA,0xAA,0x9A,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xED, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB, + 0xBA,0xAA,0x99,0x88,0xDA,0x89,0xEE,0xEE,0xEF,0xEE,0xEC,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDE,0xDD,0xDC,0xBB,0xBA,0xBA,0xBB, + 0xBB,0xCC,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBD,0xDE,0xDD,0xDB,0xCC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD, + 0xBB,0xBA,0xAA,0x99,0xA9,0xAA,0xBB,0xBC,0xCC,0xBB,0xBB,0xBC,0xCD,0xBC,0xBA,0xAA, + 0x99,0xAA,0xAA,0xBB,0xAB,0xCE,0xDD,0xDD,0xDC,0xDB,0xCD,0xBD,0xBD,0xCC,0xBB,0xBA, + 0xAA,0xA9,0xA9,0x99,0x9A,0xAA,0xAA,0xAA,0x99,0xAA,0xAA,0xBB,0xBC,0xED,0xDD,0xDD, + 0xDC,0xCC,0xDB,0xCC,0xDB,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDD,0xCD, + 0xCD,0xDC,0xDC,0xDC,0xCC,0xCC,0xCC,0xBC,0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDC,0xDB,0xCC,0xCC,0xCD,0xCD,0xCD,0xBC,0xCD,0xBD,0xCC,0xBB, + 0xAA,0xAA,0xAB,0xBA,0xBA,0xBB,0xBB,0xBC,0xCC,0xCB,0xBB,0xBA,0xBB,0xBC,0xCD,0xDD, + 0xDE,0xEE,0xEE,0xFE,0xFF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xFE, + 0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xEE,0xDB,0xBA,0xA9,0x99,0x9A,0x99,0x9A,0x9A,0xAA,0xBA,0xBA,0xA9, + 0xAA,0xAA,0xAA,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xEC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC, + 0xBB,0xAA,0x99,0x98,0xAD,0x98,0xBE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDD,0xED,0xDD,0xBB,0xBA,0xBA,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBA,0xBB,0xBD,0xDD,0xDD,0xCB,0xDD,0xDD,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDB, + 0xBB,0xAA,0xAA,0x99,0x9A,0xBB,0xBC,0xDB,0xCB,0xBB,0xBB,0xCB,0xDC,0xCB,0xBB,0xAA, + 0xA9,0x99,0xAA,0xAB,0xBB,0xBC,0xED,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xCB,0xBB,0xAA, + 0xAA,0xA9,0x99,0x99,0xAA,0xBB,0xBB,0xBA,0xA9,0xA9,0xAA,0xAB,0xAB,0xCE,0xED,0xDD, + 0xCD,0xDD,0xCD,0xBD,0xBD,0xCC,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDD, + 0xDC,0xDD,0xDD,0xCD,0xDD,0xBD,0xCC,0xCB,0xBB,0xCC,0xCB,0xDC,0xDD,0xDD,0xDC,0xDC, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xCD,0xBD,0xCD,0xCD,0xCC,0xDC,0xCC,0xBB, + 0xBA,0xAA,0xBA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBD,0xCC,0xBB,0xAB,0xBB,0xBB,0xBD,0xDD, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xFF,0xFE,0xFF, + 0xEF,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xED,0xBA,0xAA,0x99,0x99,0x9A,0x99,0x9A,0x9A,0xAA,0xAA,0xAA, + 0xAA,0xAA,0xAA,0xA9,0x99,0x99,0x9A,0x9A,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xEB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD, + 0xBB,0xBA,0xA9,0x98,0x8C,0xA9,0x8D,0xEE,0xEF,0xEE,0xFE,0xDD,0xDD,0xED,0xED,0xEE, + 0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xED,0xDB,0xBB,0xAA,0xAB, + 0xAB,0xBA,0xBA,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xDD,0xDD,0xDC,0xDD,0xDD,0xDE,0xDD, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xDD,0xED,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xCD,0xBB, + 0xBA,0xAA,0x99,0x99,0xAA,0xBC,0xDD,0xBD,0xBC,0xBB,0xCC,0xCC,0xCB,0xBB,0xBB,0xAA, + 0xA9,0x99,0xAA,0xAA,0xAB,0xBB,0xDD,0xDD,0xDD,0xCC,0xCD,0xCD,0xCC,0xBB,0xAA,0xAA, + 0xA9,0x99,0x99,0x9A,0xBB,0xBB,0xCC,0xBB,0xAA,0x99,0xAA,0xAA,0xBB,0xBC,0xED,0xDD, + 0xDC,0xDC,0xCD,0xCD,0xCC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC, + 0xDD,0xDC,0xDC,0xDB,0xCC,0xDB,0xCB,0xBB,0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xCC,0xCC,0xCD,0xCD,0xBC,0xDB,0xCD,0xBC,0xBB, + 0xAA,0xAA,0xAB,0xAA,0xBA,0xBB,0xBB,0xCC,0xDC,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD, + 0xEE,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF, + 0xFE,0xFF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDB,0xAA,0xA9,0x99,0x99,0x9A,0x99,0xAA,0xAA,0xBA,0xAA, + 0x9A,0xAA,0xAA,0xAA,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDD,0xEC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDD, + 0xDB,0xBB,0xAA,0x99,0x88,0xDA,0x89,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xDD,0xDD,0xBB,0xAB,0xAB, + 0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xED, + 0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xBB, + 0xAA,0xA9,0x99,0x99,0xBB,0xCD,0xCD,0xDD,0xCB,0xBB,0xCC,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xAA,0xA9,0x9A,0x9A,0xBA,0xBB,0xBD,0xDD,0xDC,0xDD,0xDC,0xDC,0xBB,0xBB,0xAA,0xAA, + 0x99,0x99,0x99,0xAB,0xBC,0xBC,0xBC,0xCB,0xBA,0xA9,0xA9,0xAA,0xBA,0xBB,0xDE,0xDD, + 0xDD,0xCD,0xDB,0xDC,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCB,0xCC,0xCC,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDB,0xDC,0xCB,0xDB,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDC,0xBB,0xBB,0xBB,0xDC,0xDD,0xDE, + 0xEF,0xEE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE, + 0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xEE,0xDC,0xBA,0x9A,0x9A,0x9A,0x99,0x9A,0x99,0xAA,0xAA,0xBA, + 0xAA,0x9A,0xAA,0xAA,0xAA,0x99,0xA9,0xAA,0xAB,0xBB,0xCB,0xBB,0xBB,0xBB,0xDE,0xCB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED, + 0xDC,0xBB,0xAA,0x99,0x99,0xAD,0x98,0xAE,0xEE,0xEF,0xEE,0xEE,0xCD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xBB,0xBA,0xBA, + 0xBB,0xBB,0xAB,0xBB,0xAB,0xAB,0xBA,0xBA,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xED,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xDD,0xED,0xED,0xDE,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xBC,0xBA, + 0xAA,0xA9,0x99,0x9A,0xAC,0xDD,0xDC,0xBC,0xBB,0xBB,0xBC,0xDB,0xBC,0xCB,0xBB,0xBA, + 0xAA,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCD,0xDD,0xCC,0xCD,0xBC,0xBB,0xAA,0xAA,0xA9, + 0x99,0x99,0xAA,0xBB,0xBC,0xDC,0xDD,0xDC,0xCB,0xAA,0x99,0xAA,0xAB,0xBB,0xBD,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xDC,0xDC,0xDC,0xDB,0xCB,0xCC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xEE,0xDD, + 0xCD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xCD,0xCC,0xCB,0xCC,0xCB,0xCC,0xCD,0xCC,0xCB, + 0xBC,0xCB,0xCC,0xBB,0xCB,0xBB,0xBB,0xCB,0xCC,0xCC,0xBB,0xBB,0xBC,0xCD,0xDD,0xEE, + 0xEE,0xEF,0xEF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF, + 0xFE,0xFF,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xFF,0xFE,0xFF,0xEF,0xEE,0xED,0xCB,0xAA,0x9A,0x99,0xA9,0xA9,0x9A,0x9A,0xAA,0xBA, + 0xAA,0xAA,0xAA,0xBA,0xAA,0x9A,0x9A,0xAA,0xBB,0xBB,0xBB,0xBC,0xBB,0xCD,0xDE,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEE,0xED, + 0xDD,0xCB,0xBA,0xA9,0x98,0x8C,0xB9,0x8C,0xEE,0xEE,0xEE,0xFE,0xED,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDB,0xBB,0xBB, + 0xAB,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xED,0xED,0xED,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED,0xDD,0xDE,0xDD,0xDD,0xED, + 0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xCB,0xBB, + 0xAA,0x99,0x99,0x9A,0xBD,0xED,0xDD,0xDC,0xCB,0xBB,0xBC,0xCD,0xCC,0xBD,0xCB,0xBB, + 0xAA,0xA9,0x99,0x99,0xAA,0xAB,0xAB,0xBD,0xCD,0xCD,0xCB,0xBA,0xBA,0xAA,0xA9,0x99, + 0x99,0x9A,0xAB,0xBB,0xDC,0xDC,0xDC,0xDC,0xCB,0xBA,0xA9,0x9A,0xAA,0xAB,0xBC,0xDD, + 0xED,0xDC,0xDC,0xDC,0xDB,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xBD,0xBD,0xBD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDC,0xDB,0xDC,0xDB,0xCC,0xBB,0xCC,0xCC,0xBD, + 0xCC,0xCC,0xDC,0xCD,0xCD,0xCD,0xCD,0xBD,0xBD,0xCC,0xBA,0xBB,0xCB,0xDD,0xDE,0xEE, + 0xEE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEE,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE, + 0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xFE,0xFE,0xFE,0xED,0xCB,0xAA,0x9A,0x9A,0x9A,0x99,0xA9,0xA9,0xAA,0xAB, + 0xAA,0xAA,0xAA,0xAA,0xAA,0xA9,0xAA,0xAA,0xBB,0xBB,0xBC,0xBB,0xBC,0xBD,0xDE,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE, + 0xDD,0xCB,0xBA,0xAA,0x99,0x88,0xDA,0x89,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDE,0xED, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xDE,0xDD,0xDD,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDE,0xDE,0xDE,0xED, + 0xED,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xBB,0xBA, + 0xAA,0x99,0x99,0x99,0xAC,0xED,0xED,0xDC,0xBB,0xCB,0xCD,0xCC,0xBB,0xCC,0xCB,0xBB, + 0xBA,0xAA,0x99,0x9A,0xAA,0xAB,0xBB,0xBB,0xDD,0xCB,0xBB,0xAB,0xAA,0xAA,0x99,0x99, + 0x99,0xAB,0xBB,0xCD,0xCD,0xCD,0xCD,0xBD,0xBB,0xBB,0xAA,0x99,0xAA,0xAA,0xBB,0xCE, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC, + 0xDC,0xDC,0xDC,0xDB,0xDB,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xCD,0xBD,0xCD,0xCC, + 0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCD,0xCC,0xBC,0xBB,0xBC,0xCC,0xDB,0xDC, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xBC,0xBC,0xCC,0xCB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF, + 0xFE,0xFF,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xFE,0xEF, + 0xFF,0xFE,0xFF,0xEF,0xEE,0xEE,0xDB,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0x9A,0x9A,0xAA, + 0xAB,0xAA,0xAA,0xAB,0xAB,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDE,0xAA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xED,0xDC,0xBB,0xAA,0x99,0x99,0x9D,0x98,0xAE,0xEE,0xEE,0xEE,0xEE,0xCD,0xDD,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDE,0xDD,0xCB,0xBB, + 0xBB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCB,0xBB,0xBB,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xED,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xCB,0xBA, + 0xA9,0x99,0x89,0x99,0xAB,0xDE,0xED,0xDC,0xDC,0xBB,0xCB,0xDD,0xDC,0xBC,0xBB,0xBB, + 0xBB,0xAA,0xA9,0x99,0x99,0xAA,0xBA,0xBB,0xBC,0xCB,0xBB,0xBA,0xAA,0x99,0x99,0x99, + 0x9A,0xBB,0xBD,0xDC,0xDC,0xDC,0xDB,0xDC,0xCC,0xCB,0xAA,0xA9,0x9A,0xAB,0xAB,0xBD, + 0xEE,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD, + 0xDD,0xCD,0xDB,0xDC,0xCC,0xCC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xDC,0xCD,0xBD, + 0xCD,0xCD,0xDC,0xDB,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xCC,0xCB,0xCB,0xCB,0xCC,0xDC, + 0xDB,0xDB,0xDD,0xCD,0xDD,0xCD,0xDD,0xCC,0xCC,0xCB,0xBB,0xBB,0xBD,0xDD,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE, + 0xFF,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xFE,0xFE,0xFE,0xED,0xCB,0xAA,0xA9,0xA9,0xA9,0x9A,0x99,0xA9,0xA9,0xAA, + 0xBA,0xBA,0xAA,0xAA,0xBA,0xBA,0xAA,0xAB,0xBB,0xCB,0xCB,0xBB,0xBB,0xCD,0xED,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xED,0xDD,0xBB,0xBA,0xA9,0x98,0x8B,0xC9,0x8C,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDE,0xDD,0xED,0xDB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCD,0xDD,0xDD,0xDD,0xEE,0xDE,0xDE,0xDE, + 0xDE,0xED,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDC,0xDC,0xCB,0xBA, + 0xA9,0x98,0x89,0x99,0xAA,0xDE,0xEE,0xDD,0xCC,0xBB,0xBD,0xDC,0xCB,0xBB,0xBB,0xBB, + 0xAB,0xAA,0xAA,0x99,0x9A,0xAA,0xAB,0xBA,0xBC,0xCB,0xAA,0xAA,0xA9,0x99,0x99,0x9A, + 0xAB,0xBC,0xDC,0xDD,0xDD,0xDB,0xCC,0xBC,0xCC,0xBB,0xBA,0xAA,0x99,0xAA,0xAB,0xBB, + 0xDD,0xDD,0xDD,0xCD,0xDC,0xCD,0xBD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDB,0xDD,0xCD,0xDB, + 0xDC,0xDD,0xBD,0xBC,0xCC,0xCD,0xCD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xCC,0xCD, + 0xCD,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDB,0xBC,0xBB,0xCD,0xBC,0xCD, + 0xCD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF, + 0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xBB,0xAA,0x9A,0x9A,0x9A,0xA9,0xA9,0x9A,0x9A,0x9A, + 0xAA,0xBA,0xAA,0xAA,0xAB,0xBA,0xAB,0xBB,0xBB,0xCB,0xCB,0xBC,0xBC,0xCD,0xEC,0xBA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x88,0xDA,0x89,0xDE,0xEE,0xEE,0xEE,0xED,0xDD,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xCB,0xCC,0xCC,0xCB,0xBD,0xDD,0xED,0xDD,0xDD,0xED,0xED,0xED, + 0xED,0xEE,0xDD,0xDC,0xDC,0xDD,0xDD,0xDE,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xDD,0xCB,0xBA, + 0xA9,0x99,0x88,0x99,0x9A,0xBC,0xEE,0xDD,0xDC,0xCB,0xBC,0xCD,0xDD,0xCB,0xBB,0xBA, + 0xBB,0xBB,0xBA,0xA9,0x99,0xA9,0xAA,0xAB,0xBC,0xCB,0xBA,0xA9,0x99,0x99,0x99,0xAA, + 0xBB,0xCC,0xDD,0xCD,0xCD,0xCD,0xDC,0xDC,0xBB,0xDC,0xBB,0xA9,0xA9,0xAA,0xBA,0xBB, + 0xCD,0xED,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD, + 0xDD,0xCD,0xDD,0xCD,0xBD,0xCD,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCC, + 0xCC,0xCD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD,0xCD,0xCC,0xBD,0xCB,0xDB,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xDB,0xDC,0xCB,0xCB,0xBB,0xBB,0xBB,0xCD,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xFE,0xFF,0xFE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xFF,0xEF,0xEE,0xED,0xDB,0xBA,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A, + 0xAA,0xAB,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xDD,0xEA,0xAB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x98,0xAD,0xA8,0xAE,0xEE,0xEE,0xEF,0xEE,0xDD,0xDD, + 0xED,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDE,0xDD,0xDB, + 0xBB,0xBC,0xCC,0xDC,0xCD,0xCD,0xCC,0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED, + 0xDE,0xEE,0xED,0xDD,0xCD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xBB,0xBB, + 0xAA,0x98,0x89,0x89,0x99,0xAB,0xEE,0xED,0xDD,0xCB,0xBC,0xDC,0xCC,0xBB,0xBB,0xAB, + 0xAB,0xBB,0xBB,0xAA,0x99,0x9A,0xAA,0xAB,0xAB,0xBA,0xAA,0x99,0x99,0x99,0x9A,0xAB, + 0xBC,0xDD,0xCC,0xCC,0xDC,0xDC,0xDC,0xCC,0xDC,0xCC,0xCB,0xBA,0x99,0xAA,0xAB,0xBB, + 0xBD,0xDE,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD, + 0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xBC, + 0xBC,0xCD,0xDD,0xEE,0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xDC,0xDB,0xCC,0xCD,0xBC,0xCC, + 0xCD,0xBD,0xCD,0xBC,0xDC,0xCD,0xBC,0xCB,0xCB,0xBB,0xAB,0xBB,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE, + 0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xEE,0xDD,0xBB,0xAA,0xA9,0xA9,0xA9,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A, + 0x9A,0xAB,0xBA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xCD,0xDE,0xDA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xED,0xDD,0xDB,0xBA,0xA9,0x98,0x8B,0xC9,0x8B,0xEE,0xEF,0xEE,0xEE,0xED,0xDD, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xED,0xDD, + 0xBC,0xBC,0xCC,0xCB,0xDC,0xDC,0xDD,0xCC,0xCC,0xDD,0xDD,0xDD,0xCD,0xED,0xED,0xDD, + 0xDD,0xDE,0xEE,0xDD,0xDD,0xCD,0xDD,0xED,0xEE,0xED,0xDB,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB, + 0xBA,0x98,0x88,0x89,0x99,0x9A,0xBE,0xEE,0xED,0xCC,0xBD,0xCD,0xCB,0xBB,0xBA,0xBB, + 0xBB,0xBC,0xBB,0xAA,0xA9,0x99,0x9A,0xAA,0xBB,0xAA,0xA9,0x99,0x99,0x9A,0xAB,0xBB, + 0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDC,0xCC,0xDD,0xDD,0xBA,0xAA,0x9A,0xAB,0xAB, + 0xBC,0xDD,0xED,0xDD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDD, + 0xCD,0xDD,0xDD,0xED,0xDC,0xDC,0xDC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDB,0xCB, + 0xBB,0xCB,0xCD,0xDE,0xFE,0xDD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDB,0xDC,0xDC,0xDC,0xCC, + 0xBC,0xBC,0xBC,0xCB,0xCB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDE,0xDE,0xDE, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xEF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xFE,0xFE,0xFE,0xEF,0xEE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xEE,0xED,0xDB,0xBA,0xAA,0xAA,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xAA,0xAA,0xBB,0xAA,0xAA,0xAB,0xBB,0xBB,0xCC,0xCB,0xBB,0xBC,0xCD,0xDE,0xBA,0xAB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0xDB,0x98,0xDE,0xEE,0xEF,0xEE,0xEE,0xDD, + 0xDE,0xEE,0xED,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDD, + 0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xCC,0xDB,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xEE,0xED,0xDC,0xCD,0xDD,0xDE,0xDE,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCB, + 0xB9,0x98,0x98,0x88,0x99,0x9A,0xAD,0xEE,0xED,0xDB,0xBC,0xCC,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCC,0xCB,0xBB,0xAA,0x99,0xAA,0xAB,0xBA,0xBA,0xA9,0x99,0x99,0xAB,0xBB,0xCD, + 0xDD,0xDD,0xDD,0xDC,0xCC,0xCD,0xCD,0xCC,0xDC,0xDC,0xDB,0xCB,0xAA,0x9A,0xAA,0xBA, + 0xBB,0xDE,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDC, + 0xDD,0xCD,0xDD,0xED,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB, + 0xCB,0xCC,0xDC,0xDD,0xEF,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xBC,0xCC,0xDB,0xCB, + 0xCB,0xCB,0xCB,0xBB,0xBB,0xCC,0xCC,0xBB,0xBB,0xBA,0xBB,0xBB,0xCD,0xDD,0xED,0xDD, + 0xDD,0xDD,0xEE,0xEF,0xEF,0xEF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF, + 0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xEF, + 0xEF,0xEE,0xEE,0xDD,0xBB,0xAA,0xAA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A, + 0x9A,0xAA,0xBB,0xAA,0xAA,0xAB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBC,0xCD,0xED,0xAA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x99,0x9D,0xA8,0xAE,0xEE,0xEE,0xEE,0xEE,0xDD, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xED,0xED, + 0xDB,0xBB,0xBC,0xCC,0xDD,0xDD,0xDD,0xCC,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xED,0xDD,0xDE,0xDE, + 0xDD,0xED,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC, + 0xA9,0x99,0x88,0x98,0x89,0x99,0x9B,0xEF,0xED,0xDC,0xCB,0xBB,0xBB,0xAB,0xBB,0xBC, + 0xBC,0xCC,0xCD,0xCB,0xAA,0x99,0x99,0xAA,0xAA,0xAA,0x99,0x99,0x9A,0xBB,0xCC,0xCC, + 0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xBD,0xDD,0xDD,0xDB,0xBA,0xA9,0xAA,0xAB, + 0xBB,0xCD,0xDE,0xDD,0xCD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD, + 0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB, + 0xBB,0xBC,0xCC,0xCD,0xDE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCC,0xCC, + 0xBC,0xBB,0xBB,0xCB,0xCB,0xCB,0xCC,0xCB,0xBB,0xBB,0xAB,0xBB,0xCC,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xFF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEE,0xED,0xCB,0xBB,0xAA,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9,0xA9, + 0xA9,0xAA,0xAA,0xBA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xDD,0xEB,0xAA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x98,0x8A,0xD9,0x8B,0xEE,0xEE,0xFE,0xFE,0xED, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDD, + 0xDD,0xBB,0xBB,0xBC,0xCD,0xDD,0xDB,0xCC,0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDC,0xCD,0xCD,0xDE,0xEE,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED, + 0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB, + 0xA9,0x99,0x98,0x88,0x99,0x99,0x9A,0xAC,0xEE,0xDB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xCC,0xCD,0xBC,0xCB,0xBB,0xAA,0x9A,0xAA,0xAA,0xAA,0x99,0xAA,0xAB,0xBB,0xCC,0xDB, + 0xDC,0xDD,0xEE,0xDD,0xDD,0xDC,0xBB,0xCD,0xDD,0xCD,0xDD,0xCD,0xBA,0xA9,0xAA,0xBB, + 0xBB,0xBD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD, + 0xDC,0xDD,0xDC,0xDD,0xDE,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xBB, + 0xBB,0xBB,0xCC,0xDC,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDB,0xDB,0xBB, + 0xCB,0xCC,0xCC,0xBC,0xBB,0xCC,0xBC,0xBB,0xBB,0xBA,0xBB,0xBB,0xCD,0xDD,0xDC,0xCC, + 0xCB,0xCC,0xDD,0xEE,0xEF,0xEF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE, + 0xFF,0xEF,0xFE,0xFF,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xEE,0xDD,0xBB,0xBA,0xAA,0x9A,0xAA,0xA9,0xA9,0x9A,0x9A,0x99,0xA9,0xA9,0xAA, + 0x9A,0x9A,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xCC,0xDD,0xD9,0xAA,0xBB, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x88,0xCA,0x88,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDE,0xDD,0xED, + 0xDD,0xCB,0xBB,0xBB,0xBC,0xCC,0xDD,0xCC,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xCD,0xDD,0xDC,0xDC,0xCD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xED,0xEE,0xDE,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCB, + 0xB9,0xA9,0x99,0x89,0x88,0x89,0x99,0xAB,0xDE,0xDD,0xCC,0xBB,0xBA,0xBB,0xCB,0xDC, + 0xDB,0xDB,0xDB,0xDC,0xBB,0xAA,0x9A,0x9A,0x9A,0x99,0x99,0xAA,0xBB,0xCD,0xDD,0xCD, + 0xCD,0xDD,0xEE,0xDE,0xDE,0xDD,0xDC,0xCC,0xBD,0xDD,0xDD,0xDC,0xCA,0xA9,0xAA,0xBA, + 0xBB,0xBB,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB, + 0xBB,0xBC,0xCB,0xDC,0xDD,0xDE,0xED,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDC, + 0xBC,0xCC,0xBC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCC,0xDD,0xDD,0xDB, + 0xBB,0xBB,0xCD,0xDE,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xFE,0xFF,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDB,0xBB,0xAA,0xAA,0xA9,0xA9,0x9A,0x99,0xA9,0xA9,0xAA,0x9A,0x99,0x99, + 0x9A,0xAA,0xAB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBB,0xBB,0xBC,0xBD,0xDE,0xBA,0xAB,0xBC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0xA9,0x98,0x8D,0xA8,0xAE,0xEE,0xEF,0xEE,0xFE, + 0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xDD, + 0xED,0xDB,0xBB,0xAB,0xBB,0xCD,0xCC,0xDB,0xBB,0xCC,0xDD,0xDE,0xDE,0xDD,0xDD,0xCD, + 0xBC,0xCC,0xCD,0xCD,0xDD,0xCD,0xDD,0xDE,0xED,0xED,0xDE,0xDE,0xDE,0xED,0xED,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDC, + 0xBB,0x99,0x99,0x98,0x89,0x89,0x99,0x9A,0xBD,0xDD,0xCC,0xBB,0xBB,0xBB,0xCC,0xCC, + 0xDC,0xCD,0xCD,0xBC,0xCB,0xBB,0xAA,0x9A,0x99,0x9A,0xAA,0xBB,0xCD,0xCD,0xDD,0xDD, + 0xCD,0xCD,0xDD,0xED,0xED,0xED,0xCB,0xCD,0xDD,0xCD,0xCD,0xCC,0xCA,0xA9,0xAA,0xAB, + 0xBB,0xBB,0xDE,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD, + 0xDD,0xDC,0xDD,0xDD,0xDE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xCC,0xCB,0xBB, + 0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xED,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xCC,0xCC, + 0xDB,0xCC,0xDB,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xCB, + 0xBB,0xBB,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xFE,0xFF,0xFE,0xFF,0xEF,0xEF,0xEE,0xEF,0xEE,0xEE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xBB,0xBA,0xAA,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x9A,0x99,0xA9,0xAA,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xBC,0xBB,0xBB,0xBB,0xBC,0xCD,0xDE,0x9A,0xAB,0xBD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xDD,0xDB,0xBA,0xA9,0x99,0x8A,0xD9,0x8A,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDE,0xDD,0xED,0xDE, + 0xDD,0xDC,0xBB,0xBA,0xBB,0xBC,0xDD,0xCC,0xBC,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xCB,0xDC,0xDC,0xDC,0xDD,0xED,0xED,0xEE,0xEE,0xDD,0xED,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDD, + 0xCB,0xAA,0x99,0x98,0x98,0x89,0x89,0x9A,0xAB,0xCC,0xDD,0xCB,0xBB,0xBC,0xCC,0xBD, + 0xBD,0xCD,0xCD,0xBD,0xCD,0xCB,0xBB,0xAA,0xAA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDD,0xDC, + 0xDC,0xDC,0xDD,0xEE,0xDE,0xDD,0xDC,0xBD,0xCC,0xDD,0xDC,0xBB,0xAA,0xA9,0x9A,0xAB, + 0xBB,0xBC,0xBD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xCB,0xBB, + 0xBB,0xBB,0xBB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC, + 0xCC,0xCC,0xCB,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB,0xCD,0xEE,0xEE,0xDC, + 0xBB,0xBB,0xBD,0xDE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xFE,0xFE, + 0xFF,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDC,0xBB,0xAA,0xAA,0x9A,0x99,0x99,0x99,0x9A,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xCB,0xDB,0xDC,0xBC,0xBC,0xBB,0xBB,0xBB,0xBB,0xDD,0xEB,0xAA,0xAB,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0xCC,0x98,0xDE,0xEE,0xFE,0xFE, + 0xEE,0xCD,0xDE,0xDE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD, + 0xDE,0xDD,0xCB,0xAB,0xAA,0xBB,0xCC,0xDB,0xDC,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xED,0xED,0xED,0xDD,0xDD, + 0xDC,0xBA,0xA9,0x99,0x88,0x88,0x99,0x99,0xAA,0xBD,0xEE,0xDD,0xBB,0xCC,0xCC,0xCC, + 0xCD,0xCD,0xCC,0xDC,0xDC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xCD,0xCD,0xDD, + 0xDD,0xCC,0xCD,0xEE,0xED,0xDC,0xBB,0xCC,0xDD,0xCC,0xCC,0xBA,0xA9,0x99,0x9A,0xBB, + 0xBB,0xBB,0xCD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD, + 0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDB,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xBC,0xCC,0xCC, + 0xDB,0xDB,0xDB,0xCC,0xCB,0xCB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBD,0xDE,0xEE,0xEE,0xED, + 0xCB,0xBB,0xCD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF, + 0xFE,0xFF,0xFE,0xFF,0xFE,0xFE,0xFE,0xEF,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xCB,0xBB,0xAA,0xAA,0x9A,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB, + 0xBC,0xCD,0xCD,0xCD,0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xCD,0xDD,0xE9,0x9A,0xAB,0xCC, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xCB,0xAA,0xA9,0x98,0x8D,0xA8,0x9E,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xED,0xDB,0xBA,0xAA,0xAB,0xBD,0xCD,0xDD,0xDD,0xED,0xED,0xED,0xDD,0xDD,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED, + 0xDD,0xBB,0xA9,0x99,0x98,0x98,0x98,0x99,0x9A,0xBC,0xEE,0xDD,0xDB,0xDC,0xCB,0xBB, + 0xDC,0xDC,0xBD,0xBD,0xCD,0xDC,0xCC,0xCC,0xBB,0xBB,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD, + 0xDC,0xDD,0xCC,0xCE,0xDD,0xDD,0xCB,0xBC,0xCD,0xDD,0xCC,0xAA,0x99,0x98,0x9A,0xCC, + 0xBB,0xBB,0xCB,0xDD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDC, + 0xDB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xDC,0xCC,0xCC,0xBB,0xBB, + 0xBB,0xCB,0xBB,0xCC,0xCC,0xDC,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xCC,0xCC, + 0xCC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xEE,0xEE,0xEF,0xEE, + 0xDD,0xCC,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF, + 0xEF,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB, + 0xBB,0xBA,0xAA,0xA9,0xA9,0xAA,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBC,0xCC,0xCD, + 0xCD,0xCD,0xDC,0xDC,0xDB,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDE,0xB9,0xAA,0xBB,0xBD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x8A,0xDA,0x8A,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xDD,0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xDD,0xED,0xDD,0xBA,0xAA,0xAA,0xBB,0xDE,0xDE,0xDE,0xDE,0xEE,0xDD,0xDE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xDE,0xDE, + 0xDD,0xDB,0xBA,0x99,0x99,0x88,0x88,0x98,0x99,0xAB,0xCD,0xDD,0xDB,0xCC,0xBC,0xDB, + 0xDC,0xDC,0xDB,0xDD,0xCD,0xCD,0xCD,0xCC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC, + 0xDD,0xBC,0xCB,0xBC,0xDE,0xDC,0xBB,0xCD,0xDC,0xDC,0xBB,0xA9,0x98,0x89,0x9A,0xDD, + 0xCC,0xBC,0xBD,0xCD,0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD, + 0xDD,0xDD,0xCD,0xDD,0xDD,0xED,0xDD,0xDC,0xDC,0xDC,0xDB,0xCB,0xBB,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBC,0xDB,0xDB,0xDC,0xDC,0xDC,0xCD,0xBD,0xDD,0xCD,0xBD,0xBC,0xBB, + 0xCC,0xCC,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xDD,0xDD,0xDE,0xEE,0xED,0xEE,0xDE,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEF,0xFE, + 0xFF,0xEF,0xFE,0xFF,0xEF,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xCD,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xCD,0xDC,0xDB,0xCB,0xCB,0xBB,0xBB,0xCC,0xDD,0xEC,0x99,0xAA,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x88,0xBC,0x98,0xDE,0xEE,0xEE, + 0xEE,0xFE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xED,0xDD,0xDD,0xCB,0xAA,0xAA,0xBD,0xDD,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xED,0xDE, + 0xDE,0xDD,0xBA,0xA9,0x99,0x98,0x98,0x89,0x99,0xAA,0xBD,0xDD,0xDD,0xCB,0xCC,0xCB, + 0xDC,0xDC,0xCC,0xCC,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD, + 0xCD,0xDD,0xCC,0xBB,0xBD,0xDD,0xCB,0xDC,0xDD,0xDB,0xA9,0x99,0x99,0x88,0x9A,0xBC, + 0xDC,0xCB,0xDC,0xBD,0xCD,0xCC,0xCD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xBD,0xDC, + 0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xCB, + 0xCB,0xBB,0xBB,0xCC,0xBD,0xBD,0xBD,0xDC,0xDB,0xDC,0xDC,0xDC,0xDD,0xDC,0xCB,0xBB, + 0xCB,0xCC,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,0xDE,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xED,0xED,0xED,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE, + 0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xED,0xED,0xDD,0xCC,0xBB,0xBB,0xBA,0xBA,0xAB, + 0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xBD,0xCC,0xCB,0xBB,0xBB,0xBD,0xDD,0xD9,0x9A,0xAB,0xBB,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xEE,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98,0x8D,0xB8,0x9E,0xEE,0xEF, + 0xEE,0xEE,0xED,0xDD,0xEE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD, + 0xDD,0xDE,0xDE,0xDB,0xBA,0xAA,0xBC,0xDD,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDB,0xAA,0x99,0x99,0x88,0x88,0x99,0x9A,0xAC,0xEE,0xDD,0xCD,0xBC,0xCD, + 0xBD,0xBD,0xBD,0xCD,0xCC,0xCC,0xDC,0xDC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xDC,0xDC,0xCB,0xBB,0xBD,0xDC,0xCD,0xCD,0xBD,0xBA,0x99,0x98,0x88,0x98,0x9A,0xBC, + 0xDC,0xDB,0xCC,0xDD,0xDB,0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDB,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBC,0xCC,0xCC,0xCC,0xCC,0xDB,0xCB,0xCD,0xCD,0xCD,0xBC,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xDD,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xEE,0xED,0xED,0xEE,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF, + 0xFF,0xEF,0xFE,0xFE,0xFE,0xEE,0xED,0xED,0xDC,0xCB,0xBB,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDB,0xCB,0xBB,0xCC,0xCD,0xDD,0xDE,0xA9,0x9A,0xAB,0xBC,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x99,0xDA,0x8A,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD, + 0xDD,0xDD,0xDE,0xDD,0xBB,0xAB,0xBC,0xDE,0xDE,0xEE,0xEE,0xDE,0xEE,0xEF,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xDE, + 0xED,0xED,0xDD,0xBA,0xA9,0x99,0x99,0x89,0x89,0x99,0xAB,0xDE,0xDD,0xDC,0xDB,0xDB, + 0xDC,0xDC,0xDC,0xDC,0xCC,0xBC,0xCC,0xCC,0xBC,0xCC,0xCD,0xDD,0xDD,0xCD,0xCD,0xDC, + 0xDC,0xDC,0xDB,0xBB,0xBB,0xBB,0xCC,0xDC,0xBA,0xA9,0x99,0x98,0x98,0x88,0x9A,0xBD, + 0xCD,0xBD,0xCC,0xCC,0xCD,0xCC,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xCD,0xCD,0xCC,0xCB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xCB,0xBB,0xBB,0xBB,0xCB,0xCC,0xBD,0xCD,0xCC,0xBD,0xBD,0xCD,0xDD,0xDC,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFE, + 0xFE,0xEE,0xEE,0xED,0xED,0xDE,0xED,0xDE,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xCC,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC, + 0xCC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xED,0xDE,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCB,0xDB,0xBC,0xBC,0xDD,0xEC,0x89,0xAA,0xAB,0xBD,0xDD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x88,0xAD,0x98,0xCE,0xEE, + 0xEF,0xEF,0xEE,0xED,0xDE,0xED,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xED,0xDB,0xBB,0xCD,0xDD,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xFE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xDD,0xCB,0xA9,0x99,0x88,0x88,0x89,0x99,0x9A,0xBC,0xED,0xDD,0xCD,0xBD, + 0xCC,0xDC,0xDB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xCD,0xDC,0xDD,0xDD,0xCD, + 0xCD,0xBD,0xCD,0xBB,0xBB,0xBB,0xDB,0xCC,0xAA,0x99,0x89,0x88,0x88,0x99,0x9A,0xBB, + 0xCD,0xDB,0xCD,0xBD,0xBC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD, + 0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xCD,0xBC,0xCD,0xCD,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCC,0xCC,0xCC,0xCC,0xCC,0xDB,0xDC,0xCC,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xBB,0xBB,0xBB,0xBC,0xCD,0xCD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xEE,0xED,0xDE,0xED,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED,0xDD,0xDD, + 0xDD,0xDC,0xDB,0xDC,0xCC,0xCB,0xCC,0xDB,0xDD,0xDE,0xD9,0x99,0xAA,0xBB,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x98,0x8C,0xA8,0x8E,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xED,0xDE, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xBB,0xDD,0xDD,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xDE, + 0xEE,0xDE,0xDD,0xDC,0xAA,0x99,0x99,0x98,0x98,0x99,0x9A,0xAB,0xCD,0xDD,0xDC,0xDB, + 0xDC,0xCC,0xCC,0xBB,0xBA,0xBA,0xBB,0xAB,0xAB,0xBC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD, + 0xDD,0xDC,0xDC,0xBD,0xCC,0xDC,0xCB,0xAA,0x99,0x98,0x98,0x89,0x88,0x99,0x9A,0xAB, + 0xCC,0xBD,0xCB,0xDC,0xDD,0xCD,0xBD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCC,0xBC,0xCB,0xDC,0xCB,0xBB,0xCC,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xCB,0xCC,0xBD,0xCD,0xCD,0xDC,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCC,0xCD,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xFE, + 0xFE,0xFE,0xEE,0xDE,0xDD,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xED,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDB,0xDC,0xCC,0xBC,0xDD,0xDE,0x99,0x99,0xAA,0xBC,0xCD,0xDE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0xDA,0x8A,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDC,0xDD,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xDE,0xED,0xED,0xDD,0xBB,0xA9,0x99,0x88,0x88,0x89,0x99,0xAA,0xCD,0xDD,0xDC,0xCD, + 0xBC,0xDB,0xCB,0xBB,0xAB,0xAB,0xBA,0xBB,0xBB,0xBB,0xCD,0xDC,0xDD,0xCD,0xBD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xBA,0xA9,0x99,0x89,0x88,0x98,0x89,0x99,0xAA,0xBB, + 0xBC,0xDB,0xCD,0xCD,0xCD,0xCC,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDB, + 0xDC,0xDC,0xCD,0xCD,0xDD,0xDD,0xDC,0xDB,0xCB,0xCD,0xCD,0xCD,0xCB,0xCC,0xBC,0xBB, + 0xBC,0xBB,0xCB,0xBB,0xBB,0xBB,0xCB,0xCB,0xBC,0xCB,0xDB,0xCD,0xCD,0xCC,0xBB,0xBB, + 0xBB,0xBA,0xBB,0xBB,0xBB,0xBC,0xCD,0xDE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xFE,0xEF, + 0xEF,0xEE,0xEE,0xED,0xEE,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD, + 0xDE,0xEE,0xED,0xDD,0xBC,0xBB,0xBB,0xBB,0xBC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xCD,0xCC,0xBC,0xDD,0xDD,0xEA,0x99,0x9A,0xAB,0xBC,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xAA,0x99,0x89,0x9D,0x98,0xBE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED,0xEE,0xEE, + 0xEE,0xDE,0xED,0xDD,0xCB,0xAA,0x99,0x99,0x88,0x98,0x99,0x9A,0xBC,0xDD,0xDD,0xDC, + 0xCD,0xCC,0xBB,0xBA,0xAB,0xAA,0xBB,0xBB,0xBB,0xCC,0xCB,0xCD,0xDC,0xDC,0xDC,0xDD, + 0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xAA,0x99,0x98,0x98,0x98,0x88,0x99,0x99,0xAA,0xAB, + 0xBB,0xCB,0xDC,0xDD,0xCD,0xBD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xDB,0xDC, + 0xDD,0xCD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC,0xCC,0xCD,0xCD,0xCD,0xCB,0xDC,0xDD, + 0xCC,0xCC,0xBD,0xCC,0xCB,0xCC,0xBC,0xBC,0xBC,0xBC,0xCB,0xDB,0xDC,0xDC,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xDC,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xFE,0xEF,0xEF, + 0xEE,0xFE,0xFE,0xED,0xED,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xCC,0xCB,0xDC,0xDD,0xDE,0xD8,0x99,0xAA,0xAB,0xBD,0xDD,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xCB,0xBA,0xA9,0x98,0x8B,0xC9,0x8D, + 0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xED,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xDE, + 0xDE,0xEE,0xDE,0xDD,0xDB,0xBA,0x99,0x98,0x89,0x88,0x99,0x9A,0xAB,0xDD,0xDC,0xCD, + 0xBC,0xCB,0xBB,0xBB,0xBA,0xBB,0xAB,0xBB,0xBD,0xBC,0xCD,0xBD,0xCD,0xDD,0xCD,0xCD, + 0xCD,0xCD,0xDD,0xDD,0xDC,0xBA,0xA9,0x99,0x89,0x88,0x88,0x98,0x99,0x9A,0x9A,0xBB, + 0xBD,0xBD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDC,0xCD,0xBD,0xCD,0xCD,0xDC, + 0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC,0xCC,0xBC,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD, + 0xED,0xDD,0xDC,0xCC,0xBC,0xBB,0xCC,0xBB,0xBB,0xCC,0xCC,0xCC,0xDC,0xCC,0xBB,0xBB, + 0xBA,0xBB,0xBB,0xBB,0xCD,0xCD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xDC,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xBD,0xBD,0xCD,0xDD,0xED,0x88,0x99,0xAA,0xBB,0xCD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x88,0xDA,0x8A, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xDD,0xED,0xDD,0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xDE,0xDE,0xEE,0xEE, + 0xED,0xED,0xEE,0xED,0xDD,0xBB,0xA9,0x99,0x98,0x89,0x88,0x99,0xAB,0xDE,0xDD,0xDC, + 0xDC,0xBB,0xBA,0xAA,0xAB,0xAB,0xBB,0xBB,0xDC,0xDD,0xDC,0xDC,0xCB,0xDC,0xDC,0xDC, + 0xDC,0xDD,0xCD,0xDD,0xDB,0xA9,0x99,0x98,0x98,0x89,0x89,0x99,0xA9,0x99,0xAB,0xBB, + 0xCB,0xDC,0xDC,0xDD,0xDC,0xDC,0xDB,0xDC,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC, + 0xDB,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDB,0xDB,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xDE,0xED,0xDD,0xDC,0xDC,0xDD,0xCC,0xBB,0xBB,0xBB,0xCB,0xDC,0xBD,0xCC,0xBB,0xBA, + 0xBB,0xBB,0xBB,0xBB,0xBC,0xDE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xCD,0xBC,0xCC,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xED,0xED,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD, + 0xDD,0xDC,0xDC,0xCC,0xCC,0xCD,0xCD,0xDD,0xE9,0x89,0x9A,0xAA,0xBC,0xCD,0xDE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0x99,0x98,0x9D,0xA8, + 0xAE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE, + 0xEE,0xDE,0xED,0xED,0xDD,0xCB,0xBA,0x99,0x98,0x98,0x89,0x99,0x9A,0xCD,0xDD,0xCD, + 0xBC,0xBB,0xAA,0xAB,0xAB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCC,0xDC,0xDC, + 0xDD,0xCD,0xDC,0xDB,0xCB,0x99,0x99,0x89,0x89,0x89,0x89,0x99,0x99,0xAA,0xAB,0xBD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xBC,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDB,0xDC,0xCD, + 0xBD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDE, + 0xEE,0xDD,0xDD,0xDD,0xCD,0xCC,0xCC,0xBB,0xBB,0xBC,0xCB,0xCC,0xDB,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEF,0xEE,0xFE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD, + 0xCD,0xBD,0xBD,0xBC,0xCD,0xCD,0xDD,0xDE,0xA9,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x98,0x8B,0xD9, + 0x8D,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xFE,0xFE, + 0xEE,0xED,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED,0xEE, + 0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xBA,0xA9,0x99,0x89,0x88,0x89,0x9A,0xBB,0xCD,0xCD, + 0xCC,0xBB,0xBA,0xAA,0xAB,0xAB,0xBB,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCD,0xCC,0xDB, + 0xDC,0xDC,0xDD,0xCB,0xA9,0x99,0x98,0x89,0x88,0x89,0x99,0x99,0x9A,0xAA,0xBB,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDB,0xDB,0xDB,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCC,0xDB, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xED,0xDD,0xDD,0xDC,0xDD,0xCB,0xBB,0xBB,0xBC,0xBD,0xCD,0xBD,0xCB,0xBB,0xBB, + 0xBB,0xBB,0xCC,0xBD,0xDE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDD,0xDD,0xDC, + 0xDC,0xDC,0xCC,0xCC,0xDC,0xCD,0xDD,0xED,0x88,0x99,0xAA,0xBB,0xBD,0xDE,0xEE,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x88,0xDB, + 0x99,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xDD,0xED,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xEE, + 0xDE,0xEE,0xED,0xED,0xDD,0xDD,0xBB,0xA9,0x99,0x88,0x89,0x89,0x99,0xAB,0xBC,0xCC, + 0xCC,0xBA,0xAA,0xAA,0xAB,0xBB,0xBC,0xDD,0xDD,0xDD,0xCD,0xCC,0xCC,0xDC,0xDD,0xCD, + 0xCD,0xCD,0xCD,0xBA,0x99,0x98,0x98,0x98,0x99,0x99,0x99,0x99,0xAA,0xAB,0xDD,0xDD, + 0xED,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDD,0xCC,0xDB,0xDC,0xDB,0xCC, + 0xDB,0xCD,0xCD,0xCD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDC,0xDB,0xDB,0xBB,0xBB,0xBB,0xCC,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xCC,0xDD,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE, + 0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDD,0xDD,0xED,0xDE,0xDD,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDE,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDD,0xDD,0xDC,0xDC, + 0xCC,0xCC,0xDC,0xDC,0xCD,0xCD,0xDE,0xEA,0x88,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0x8D, + 0xA8,0xAE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xEE,0xEF,0xEF,0xEF,0xFE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xED,0xEE, + 0xEE,0xED,0xEE,0xED,0xED,0xDD,0xDC,0xBA,0x99,0x99,0x88,0x88,0x99,0xAB,0xBC,0xCC, + 0xBB,0xAB,0xAA,0xAA,0xBA,0xAB,0xCC,0xCD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBC,0xCC,0xDC, + 0xDD,0xDC,0xBA,0xA9,0x99,0x98,0x88,0x88,0x99,0x99,0x9A,0x9A,0xAB,0xBC,0xDD,0xDD, + 0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCC,0xCB,0xDB, + 0xDC,0xDB,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xBB,0xBB,0xBC,0xBD,0xBD,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xCB,0xDD,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xDD,0xED,0xDE,0xDD,0xED,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDB,0xDB, + 0xDC,0xDC,0xCC,0xCB,0xBC,0xDD,0xEE,0xE9,0x99,0x9A,0xAB,0xBB,0xDD,0xEE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x98,0x99, + 0xD9,0x8C,0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xED,0xEE,0xDE,0xDE,0xEE,0xED, + 0xEE,0xEE,0xED,0xEE,0xDE,0xDD,0xDB,0xBA,0xA9,0x98,0x98,0x98,0x99,0xAA,0xBC,0xCB, + 0xBB,0xBA,0xAB,0xAA,0xAB,0xBB,0xBC,0xDD,0xDD,0xCD,0xCD,0xCB,0xBB,0xBC,0xDD,0xCD, + 0xCC,0xCC,0xAA,0x99,0x89,0x88,0x98,0x99,0x99,0x99,0x99,0xAA,0xBB,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDD,0xDD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xDC,0xDB,0xCC,0xCD,0xBC,0xCB, + 0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDC,0xDC,0xDC,0xCB,0xBB,0xBC,0xCC,0xCC,0xBC,0xBB,0xBB,0xBB, + 0xBC,0xCD,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD, + 0xED,0xDE,0xDD,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xED,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xCC, + 0xCC,0xBB,0xBB,0xBC,0xDD,0xDE,0xEE,0xE9,0x99,0xAA,0xAB,0xBD,0xDD,0xEE,0xEE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x88, + 0xBB,0x99,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEF, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xED,0xEE,0xDE,0xDE,0xDD,0xDD,0xBB,0xA9,0x98,0x88,0x89,0x99,0xAB,0xBC,0xBC, + 0xBB,0xAA,0xAA,0xAA,0xAA,0xAB,0xBD,0xDD,0xDD,0xDC,0xCD,0xCB,0xBB,0xBC,0xCC,0xDC, + 0xCB,0xBB,0x99,0x99,0x98,0x88,0x89,0x99,0x99,0x99,0xAA,0xAB,0xBD,0xDD,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDB,0xDC,0xDC,0xBD,0xCD,0xCD,0xCB,0xDC,0xCC, + 0xBC,0xCB,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xED,0xDD,0xDD,0xEE, + 0xEE,0xED,0xDD,0xDC,0xDD,0xCD,0xDC,0xDC,0xCB,0xCB,0xBD,0xBD,0xCC,0xBB,0xBB,0xBB, + 0xBD,0xDE,0xEE,0xEE,0xFE,0xFE,0xEF,0xEF,0xEE,0xFE,0xFF,0xFF,0xFE,0xFE,0xFF,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED, + 0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xCC,0xBC, + 0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDE,0xB8,0x99,0xAA,0xBB,0xBD,0xDE,0xEE,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0xA9,0x98, + 0x8D,0xB8,0xAE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xED,0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xDE,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xED,0xDD,0xDD,0xDC,0xCB,0xA9,0x98,0x88,0x89,0x9A,0xAB,0xBB,0xCB, + 0xBB,0xAA,0xAB,0xAA,0xAA,0xBB,0xBC,0xDE,0xDC,0xCC,0xBB,0xBB,0xBB,0xBB,0xCD,0xBD, + 0xBB,0xAA,0x99,0x88,0x88,0x98,0x98,0x99,0x99,0x9A,0xAA,0xBD,0xDD,0xDD,0xED,0xDD, + 0xDE,0xDD,0xDD,0xDC,0xDC,0xDB,0xDB,0xCC,0xDC,0xDD,0xDC,0xDD,0xCC,0xCC,0xBC,0xCC, + 0xBC,0xCD,0xCD,0xDC,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCC,0xCB,0xCC,0xDB,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xDC,0xDD,0xDD,0xDD,0xDD,0x99,0x9A,0xAB,0xBC,0xDD,0xDE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xED,0xDD,0xCB,0xBA,0xA9,0x98, + 0x99,0xDA,0x8B,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xED,0xDE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xED, + 0xEE,0xDE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xED,0xEE,0xEE, + 0xED,0xEE,0xED,0xEE,0xED,0xDD,0xDC,0xDB,0xB9,0x99,0x88,0x99,0x9A,0xAB,0xBC,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xBB,0xCC,0xCC,0xBB,0xBB,0xBA,0xBA,0xBB,0xDB,0xDC, + 0xBB,0xA9,0x99,0x98,0x98,0x88,0x99,0x99,0xA9,0xAA,0xBB,0xCD,0xDD,0xED,0xDD,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDB,0xDC,0xDB,0xDC,0xCD,0xCD,0xDD,0xBD,0xCC,0xCB, + 0xCC,0xCB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xCC,0xCD,0xBD,0xCC,0xCB,0xCC,0xCB,0xBB,0xBB,0xBD, + 0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xED,0xDE,0xDE,0xED,0xED,0xED,0xED, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCB,0xBB,0xBA,0xBA,0xBB,0xBB, + 0xBC,0xCD,0xCD,0xDD,0xDD,0xCB,0xEA,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99, + 0x88,0xBC,0x98,0xDE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xED, + 0xEE,0xED,0xEE,0xED,0xDD,0xDD,0xCC,0xCB,0xB9,0x98,0x89,0x99,0xAA,0xBB,0xBB,0xBB, + 0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCB,0xBB,0xBB,0xAB,0xAB,0xBB,0xCD,0xCC, + 0xBA,0xA9,0x98,0x88,0x88,0x99,0x99,0x99,0x9A,0xAB,0xCD,0xDD,0xDD,0xDD,0xED,0xDE, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xBC,0xCC,0xCD,0xCD,0xDC,0xDD,0xCD,0xDB,0xCB,0xBB, + 0xBB,0xCC,0xDC,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xDD,0xDC,0xCB,0xCD,0xCC,0xDB,0xCD,0xBD,0xBC,0xCB,0xBB,0xCC,0xDD, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xEE, + 0xEE,0xDE,0xDE,0xDE,0xEE,0xDE,0xDD,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xEE,0xDE,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xED,0xEE,0xED, + 0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xCD,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, + 0xDC,0xDD,0xDD,0xDC,0xCB,0xBC,0xD9,0x99,0xAA,0xBB,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xED,0xDC,0xCB,0xAA,0xA9, + 0x98,0x8C,0xA9,0x9E,0xEE,0xEE,0xFE,0xFE,0xEE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDE,0xDD,0xDE,0xDE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDE, + 0xED,0xED,0xED,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xCB,0xB9,0x98,0x99,0x9A,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xAB,0xAB,0xAB,0xAB,0xBB,0xCC,0xCB, + 0xAA,0x99,0x89,0x88,0x98,0x89,0x99,0x9A,0xAA,0xBC,0xDD,0xDE,0xDE,0xDE,0xDD,0xED, + 0xDD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDC,0xCB,0xDB,0xDC,0xBD,0xCD,0xDD,0xCD,0xCC,0xBB, + 0xBC,0xBC,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xCB,0xBD,0xCD,0xDC,0xCB,0xCB,0xBB,0xBB,0xCD,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xEE, + 0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xED, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xEE,0xED,0xEE,0xED,0xEE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xBD,0xCC,0xCD, + 0xDD,0xDD,0xDC,0xCB,0xBB,0xDE,0x99,0x9A,0xAB,0xBC,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xED,0xDD,0xBB,0xBA,0xA9, + 0x99,0x88,0xDB,0x8A,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xFE,0xEF,0xEE,0xEE,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xDD,0xDC,0xDB,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xED,0xDE,0xDD,0xDD,0xDE,0xDE,0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xCC,0xCB,0xA9,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBA,0xAB,0xBC,0xCD,0xBB, + 0xBA,0x99,0x98,0x88,0x89,0x99,0x99,0x9A,0xAB,0xDD,0xDD,0xED,0xED,0xED,0xED,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBC,0xDB,0xDC,0xDD,0xDD,0xDC,0xDD,0xBD,0xBB,0xCB, + 0xBB,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDB,0xCC,0xCC,0xDC,0xDB,0xCD,0xBD,0xCD,0xCD,0xBD,0xBC,0xBB,0xCD,0xDE,0xEE, + 0xFE,0xFE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDE,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDE, + 0xDD,0xED,0xDD,0xDE,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xEE,0xDE,0xEE,0xEE,0xDE,0xDD, + 0xDD,0xDC,0xDD,0xDC,0xDC,0xCC,0xBB,0xBB,0xBB,0xCB,0xCC,0xCC,0xDC,0xDB,0xDD,0xDC, + 0xDD,0xDC,0xDB,0xBB,0xBD,0xEA,0x89,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA, + 0x99,0x89,0x9D,0xA8,0xCE,0xEE,0xEE,0xEF,0xEF,0xEE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xDC,0xBD,0xCC,0xBD,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xED,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xCC,0xBB,0xA9,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBA,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xAB,0xAB,0xBC,0xCC,0xCB, + 0xAA,0x99,0x98,0x89,0x89,0x89,0x9A,0xAB,0xBD,0xDD,0xDE,0xDD,0xED,0xED,0xDE,0xDD, + 0xDD,0xDD,0xCD,0xBD,0xCD,0xDC,0xDC,0xCC,0xBD,0xCC,0xCD,0xCD,0xCD,0xDC,0xDC,0xBC, + 0xBC,0xCC,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCC,0xCC,0xCD,0xCD,0xCB,0xCB,0xDC,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD, + 0xDD,0xED,0xDD,0xED,0xEE,0xED,0xED,0xED,0xDE,0xDE,0xED,0xEE,0xDD,0xEE,0xDE,0xDD, + 0xED,0xDD,0xED,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE,0xEE,0xED,0xED,0xDD,0xDC, + 0xDD,0xDD,0xDC,0xDC,0xCB,0xBB,0xBB,0xBC,0xBC,0xBD,0xCD,0xDC,0xDC,0xDD,0xDC,0xDD, + 0xDD,0xDD,0xCB,0xBA,0xDE,0xB8,0x99,0xAA,0xBB,0xBD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xED,0xDC,0xBB,0xBA, + 0xA9,0x98,0x8B,0xC9,0x9D,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDE,0xDD,0xDD,0xBC,0xCC,0xDC,0xDD, + 0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xED,0xED,0xDD,0xDE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDC,0xCC,0xBB,0xBA,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBA,0xBA,0xBA,0xBB,0xCD,0xCD,0xBB, + 0xBA,0x99,0x98,0x98,0x89,0x99,0x9A,0xBB,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDB,0xDD,0xDC,0xDD,0xCD,0xCD,0xBC,0xCB, + 0xBB,0xBC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xDD,0xDC,0xCC,0xCC,0xCD,0xDC,0xDC,0xDC,0xDC,0xCD,0xBD,0xCD,0xCD,0xDE,0xEE,0xEF, + 0xEF,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD, + 0xDE,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xDD,0xED,0xED, + 0xDD,0xED,0xDD,0xDD,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDB,0xCB,0xCB,0xBC,0xBC,0xDC,0xDC,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xDD, + 0xDD,0xCC,0xBB,0xAD,0xEC,0x89,0x9A,0xAA,0xBC,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA, + 0xA9,0x99,0x88,0xDB,0x8A,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xEE,0xED,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xCB,0xCB,0xCC,0xCD, + 0xDD,0xDD,0xED,0xED,0xED,0xDD,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xCC,0xBB,0xBA,0xA9,0x99,0x9A,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xAA,0xAA,0xA9,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xBB,0xCC,0xBC,0xBB, + 0xBA,0xA9,0x99,0x89,0x99,0x99,0xAB,0xBD,0xDD,0xED,0xED,0xDE,0xDE,0xED,0xED,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDB, + 0xDC,0xCB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xDE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCC,0xDD, + 0xDD,0xED,0xED,0xDD,0xDE,0xDD,0xEE,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xEE,0xED,0xED, + 0xED,0xDD,0xED,0xDE,0xDD,0xDE,0xDE,0xED,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xCB,0xBC,0xBC,0xDC,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xBC,0xCD,0xD8,0x99,0x9A,0xAB,0xBB,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDB,0xBB, + 0xAA,0x99,0x89,0x9D,0xA8,0xBE,0xEE,0xFE,0xEE,0xEF,0xEE,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDE,0xDD,0xDB,0xBB,0xCC,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xED,0xED,0xEE,0xED,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xED,0xED,0xDE,0xDD,0xED,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xCB,0xBB,0xBA,0xA9,0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xCB,0xCB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAB,0xAB,0xAB,0xBC,0xCC,0xDB,0xCB, + 0xBB,0xA9,0x99,0x98,0x99,0x9A,0xBC,0xDD,0xEE,0xDE,0xDD,0xEE,0xED,0xED,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xCD, + 0xCC,0xCC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDC,0xDB,0xCC,0xDD,0xDD, + 0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xDD,0xEE,0xDE,0xDE,0xEE,0xED,0xED,0xDD,0xDD,0xDC,0xDD,0xCD,0xBC, + 0xBB,0xCC,0xDB,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD, + 0xDD,0xCB,0xBD,0xDD,0x88,0x99,0xAA,0xBB,0xCD,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xCB, + 0xBA,0xA9,0x98,0x8A,0xD9,0x8D,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xED,0xED, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xCB,0xBB,0xCC, + 0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDC,0xBB,0xBB,0xB9,0x99,0x99,0x9A,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBC,0xBB,0xBB,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xCB,0xCC,0xBC,0xCC, + 0xBB,0xAA,0x99,0x99,0x99,0x9A,0xBB,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDC,0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD, + 0xDD,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDD,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDC,0xDC,0xBC,0xCD,0xDD,0xDE, + 0xDE,0xDE,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xED,0xEE,0xDE,0xDE, + 0xDD,0xED,0xDD,0xDE,0xED,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCC,0xCC, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCB,0xDD,0xD8,0x89,0x9A,0xAA,0xBB,0xCD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xBB, + 0xBA,0xAA,0x99,0x88,0xCB,0x99,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xDD,0xED,0xED,0xEE, + 0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDE,0xDD,0xBB,0xBC,0xDD, + 0xDD,0xDE,0xDD,0xDD,0xDE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEF, + 0xEE,0xED,0xBB,0xBB,0xAA,0x99,0x99,0x99,0xAA,0xAB,0xBA,0xBB,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBC,0xBC,0xCC,0xDC,0xDB, + 0xCB,0xBA,0xA9,0x99,0x9A,0xAA,0xBC,0xDD,0xDE,0xED,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDB,0xDB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xED,0xDD,0xDC,0xCC,0xCC,0xDD,0xDD,0xDD,0xED, + 0xED,0xDD,0xDE,0xDE,0xDE,0xEE,0xDE,0xDE,0xED,0xED,0xEE,0xEE,0xEE,0xDE,0xED,0xED, + 0xEE,0xDE,0xEE,0xEE,0xDE,0xED,0xED,0xDD,0xDD,0xDD,0xDC,0xDB,0xCC,0xDC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEC,0x98,0x99,0x9A,0xAB,0xBC,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD, + 0xBB,0xAA,0x99,0x98,0x8D,0xB8,0xAE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xED, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDC,0xBC,0xCC, + 0xDD,0xED,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xED,0xED,0xED,0xDE,0xDD,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xED,0xDC,0xBB,0xBA,0xA9,0x99,0x99,0x99,0xAA,0xAB,0xAB,0xAB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xBB,0xBB,0xBC,0xCC,0xBC,0xCC,0xCC,0xCC, + 0xCC,0xBA,0xAA,0x99,0x99,0xAB,0xBD,0xCD,0xED,0xED,0xED,0xED,0xED,0xED,0xDD,0xED, + 0xDD,0xED,0xDD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDC, + 0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xDC,0xCB,0xBC,0xCD,0xDD,0xDD,0xED,0xED, + 0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xDE, + 0xED,0xED,0xEE,0xDE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xCB,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDE, + 0xDD,0xDE,0xB8,0x89,0x99,0xAA,0xBB,0xBD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC, + 0xBB,0xBA,0xA9,0x98,0x99,0xDA,0x8C,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xDD,0xED,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xED,0xDD,0xBC,0xDD, + 0xDD,0xDE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xED,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xDD,0xBB,0xBA,0xA9,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBA,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xCB,0xCC,0xBC,0xBC,0xBC,0xCC, + 0xCC,0xBB,0xAA,0x99,0x99,0xAB,0xCC,0xCC,0xDD,0xEE,0xED,0xED,0xED,0xED,0xED,0xDE, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC,0xDC,0xCD,0xBD,0xCD,0xCD,0xDD,0xED,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xED,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDC,0xCC,0xBC,0xDD,0xDD,0xED,0xDE,0xDD,0xDE, + 0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xED,0xEE,0xDE, + 0xDE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDC,0xDD,0xDD,0xED,0xED, + 0xEE,0xEA,0x88,0x89,0x9A,0xAB,0xBB,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD, + 0xDB,0xBB,0xAA,0x99,0x88,0xBD,0x99,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDE,0xDD, + 0xED,0xEE,0xEE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDC,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDE,0xDE,0xDD,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED, + 0xDB,0xBB,0xAA,0xA9,0x99,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xAB,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xCB,0xCB,0xBB,0xBC,0xBB,0xBC,0xCC,0xCC, + 0xCB,0xBB,0xAA,0xA9,0x99,0xAB,0xBD,0xCD,0xCD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED, + 0xED,0xED,0xDD,0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDC,0xCB,0xBB,0xCD,0xDD,0xDD,0xDE,0xDD,0xED,0xED, + 0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xDE,0xED,0xDD,0xDD,0xCC,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xEE, + 0xEE,0x98,0x88,0x99,0xAA,0xAB,0xBB,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED, + 0xDB,0xBB,0xAA,0xA9,0x98,0x8D,0xB9,0xAE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xED,0xED,0xED,0xDD,0xBD, + 0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xDC, + 0xBB,0xBA,0xA9,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB,0xBA,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCD,0xBC,0xBB,0xCB,0xCC,0xCB,0xCB,0xCC,0xCC, + 0xBC,0xBB,0xBA,0xA9,0x99,0xAB,0xCC,0xCC,0xDC,0xEE,0xEE,0xDD,0xED,0xED,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xBD,0xCC,0xDB,0xDD,0xDD,0xDD,0xED,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDB,0xDB,0xDD,0xDD,0xDE,0xDE,0xDD,0xED,0xDE,0xDE, + 0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xED,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE, + 0xE9,0x88,0x89,0x99,0xAA,0xBB,0xCD,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE, + 0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xDB,0x8A,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD,0xDD, + 0xEE,0xED,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDD,0xED,0xDD,0xDD, + 0xCD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xED,0xCB, + 0xBB,0xAA,0x99,0x99,0xAA,0xAB,0xAB,0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBB,0xCC,0xBB,0xBB,0xCB,0xCC,0xCB,0xCB,0xCB, + 0xBB,0xBB,0xBB,0xAA,0x9A,0x9A,0xBB,0xCC,0xCC,0xCE,0xDE,0xDE,0xDD,0xED,0xED,0xED, + 0xED,0xED,0xED,0xDD,0xDC,0xDD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xBD,0xDC,0xDB,0xDD,0xBD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDC,0xDC,0xBB,0xCD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDD,0xED,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDE,0xED,0xEC, + 0x88,0x88,0x99,0x9A,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE, + 0xDD,0xDB,0xBB,0xAA,0x99,0x89,0x9D,0xA9,0xDE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDD,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDC, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDC,0xBB, + 0xBA,0x99,0x99,0xAA,0xAA,0xBA,0xBA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBA,0xBA,0xBB,0xBB, + 0xBB,0xCC,0xBB,0xBB,0xCC,0xCC,0xCC,0xCD,0xBB,0xCC,0xBC,0xBB,0xBB,0xBC,0xBC,0xBC, + 0xBB,0xBB,0xBA,0xAA,0xA9,0x99,0xAB,0xBB,0xBC,0xCD,0xEE,0xEE,0xEE,0xDE,0xED,0xED, + 0xED,0xED,0xDD,0xDD,0xDD,0xCD,0xDC,0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDC,0xCC,0xCC,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xED,0xEE,0xA8, + 0x88,0x89,0x99,0xAA,0xBB,0xBD,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xED,0xDC,0xCB,0xAA,0xA9,0x98,0x8B,0xC9,0x9E,0xEE,0xEE,0xEF,0xEF,0xEE,0xED,0xDD, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE, + 0xEF,0xEE,0xED,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xCB,0xBA, + 0xAA,0xA9,0x9A,0xAA,0xBB,0xBB,0xBB,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xCB,0xCC,0xCC,0xCB,0xCB,0xCC,0xBD,0xCB,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB, + 0xBB,0xAB,0xBB,0xBA,0xAA,0x9A,0x9A,0xBB,0xBB,0xBB,0xDD,0xEE,0xDE,0xED,0xEE,0xDE, + 0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xCD,0xBD,0xCB,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xDE,0xDD, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDC,0xDC,0xBB,0xBC,0xDD,0xED,0xDE,0xDD,0xED,0xED,0xED,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xEE,0xB8,0x88, + 0x88,0x99,0x9A,0xAB,0xBB,0xCD,0xDE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0xDA,0x9A,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xDD, + 0xDB,0xDD,0xDD,0xDD,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDB,0xBB,0xAA, + 0x99,0x99,0xAA,0xAB,0xBB,0xBB,0xBA,0xAA,0xAA,0xBA,0xBA,0xBB,0xBB,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xBD,0xCD,0xCC,0xCD,0xBC,0xBB,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xAB,0xAB,0xAA,0xA9,0x99,0xAA,0xBB,0xBB,0xCD,0xDE,0xEE,0xDE,0xED,0xEE, + 0xED,0xED,0xED,0xDD,0xDD,0xCD,0xCC,0xCC,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xEE,0xDE,0xED,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDC,0xCC,0xCC,0xCD,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xBD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xC9,0x88,0x88, + 0x89,0x99,0xAA,0xAB,0xCC,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98,0x8D,0xB8,0xCE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED, + 0xDD,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xBB,0xBA,0xAA, + 0x99,0xAA,0xAB,0xBB,0xBB,0xBB,0xAB,0xAA,0xAA,0xAB,0xAB,0xBA,0xBB,0xBA,0xBA,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xCD,0xCD,0xDC,0xDD,0xCC,0xCB,0xDC,0xCC,0xCB,0xBB,0xBB, + 0xBB,0xAB,0xAB,0xBA,0xBA,0xAA,0x99,0x9A,0xAB,0xBB,0xBC,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xED,0xED,0xED,0xDD,0xDD,0xDC,0xDB,0xDB,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xED, + 0xED,0xED,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDD, + 0xDC,0xDB,0xBB,0xBC,0xDD,0xDD,0xDD,0xED,0xDE,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xDE,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xC9,0x88,0x88,0x88, + 0x99,0x9A,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x8A,0xDA,0x9D,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0xA9, + 0x9A,0xAA,0xBB,0xBB,0xCB,0xBB,0xBA,0xBA,0xBA,0xAB,0xAB,0xAB,0xBA,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xCD,0xBB,0xCC,0xCC,0xBB,0xBB,0xBB, + 0xAB,0xAB,0xAB,0xAB,0xAB,0xAA,0xA9,0x9A,0xAA,0xBB,0xBC,0xDE,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDC,0xDB,0xCC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED, + 0xED,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xED,0xDD,0xDC, + 0xCC,0xCC,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDC,0xDD,0xDD, + 0xED,0xDE,0xDE,0xDD,0xED,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xCC,0xCB,0xCD,0xB8,0x87,0x88,0x88,0x99, + 0x99,0xAA,0xBB,0xBC,0xDD,0xDE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xDD,0xDB,0xBA,0xAA,0x99,0x88,0xBD,0x99,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDD, + 0xED,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xBB,0xAA,0x9A, + 0x9A,0xAB,0xBB,0xCB,0xCC,0xBB,0xBB,0xBB,0xAB,0xAA,0xBA,0xBB,0xAB,0xBA,0xBB,0xAB, + 0xBB,0xBB,0xBB,0xBA,0xAA,0xAA,0xAA,0xBD,0xED,0xDC,0xDC,0xCC,0xCC,0xBB,0xBB,0xBA, + 0xBA,0xAB,0xAB,0xBB,0xAB,0xAB,0xAA,0x99,0x9A,0xBB,0xCB,0xCC,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDC,0xDD,0xCD,0xDB,0xDB,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xDC, + 0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDC,0xCC, + 0xCB,0xBC,0xCD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xED,0xED,0xDE,0xDE,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xCB,0xBC,0xCB,0x98,0x87,0x88,0x88,0x89,0x99, + 0xAA,0xAB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x98,0x8D,0xB9,0xBE,0xEE,0xFE,0xEF,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE, + 0xDD,0xDD,0xCD,0xDD,0xEE,0xEF,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEF,0xEF,0xEE,0xDD,0xBC,0xBA,0xA9,0x99, + 0xAA,0xAB,0xCC,0xDB,0xCC,0xBB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBB,0xAB,0xBB, + 0xBB,0xBB,0xBA,0xBA,0x99,0x99,0x9A,0xAB,0xDE,0xDD,0xBC,0xCB,0xCB,0xBB,0xBA,0xBB, + 0xAB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xA9,0x99,0xAB,0xBC,0xBC,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDD,0xDD,0xDC,0xDC,0xCC,0xDB,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xCD,0xDD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDC,0xDB,0xBB, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDE, + 0xDE,0xDD,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xDE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xED, + 0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xAC,0xDB,0xA8,0x87,0x87,0x88,0x88,0x89,0x99,0x9A, + 0xAA,0xBB,0xBD,0xDD,0xDE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xDA,0x8C,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xED, + 0xEE,0xDD,0xDC,0xDD,0xDE,0xEE,0xFE,0xFE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDB,0xBB,0xA9,0x99, + 0x9A,0xAB,0xBC,0xCC,0xCC,0xCB,0xBB,0xCB,0xBB,0xAB,0xAB,0xAB,0xAB,0xAB,0xBA,0xBA, + 0xBB,0xBA,0xAA,0x99,0x99,0x99,0x99,0x9A,0xAC,0xCC,0xDC,0xCC,0xBB,0xBB,0xBB,0xBA, + 0xBA,0xBB,0xAB,0xBB,0xBB,0xAB,0xBA,0xAA,0xA9,0xAA,0xBB,0xCB,0xCD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xBD,0xBD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xBD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDC, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xDC,0xBB,0xBB, + 0xBD,0xDD,0xDD,0xED,0xDE,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED, + 0xED,0xED,0xED,0xDE,0xDE,0xDD,0xED,0xDE,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDD, + 0xDD,0xCC,0xCB,0xBA,0xCC,0xCC,0xA8,0x78,0x77,0x87,0x88,0x88,0x88,0x99,0x99,0xAA, + 0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEE,0xFE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99,0x88,0xAD,0xA9,0xEE,0xEE,0xFE,0xEE,0xEF, + 0xEE,0xDD,0xEE,0xEE,0xDE,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDE,0xDE,0xDD,0xCD,0xDE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xCC,0xBB,0xA9,0x99, + 0x9A,0xAB,0xBC,0xCB,0xCC,0xCB,0xBB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAB,0xBB,0xBB, + 0xBB,0xAA,0xA9,0x99,0x98,0x99,0x99,0x99,0x9A,0xBC,0xDC,0xCB,0xBB,0xBB,0xBA,0xBB, + 0xBB,0xBA,0xBA,0xBA,0xBA,0xBA,0xBA,0xAA,0xA9,0x9A,0xAB,0xBB,0xCC,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xCD,0xBD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDD, + 0xCD,0xCD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xCD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDC,0xCC,0xBB,0xCC,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xDD,0xED,0xDE,0xDE,0xDE,0xDD,0xDD,0xDE,0xED,0xCC, + 0xCB,0xBC,0xDC,0xB9,0x88,0x78,0x78,0x87,0x88,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB, + 0xBB,0xCD,0xCD,0xDE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0x8B,0xD9,0xAE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xDE,0xDD,0xCD,0xDD,0xEE,0xFE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xDD,0xCC,0xBA,0x99,0x89, + 0x99,0xAB,0xBC,0xCC,0xCB,0xBB,0xBB,0xBB,0xBB,0xAB,0xAB,0xAB,0xAA,0xAA,0xAB,0xAB, + 0xAB,0xA9,0x99,0x99,0x89,0x89,0x89,0x99,0x9A,0xAB,0xCD,0xCC,0xBB,0xBB,0xAB,0xAB, + 0xBA,0xBB,0xBA,0xBB,0xBA,0xAB,0xBB,0xBA,0xAA,0x9A,0xAA,0xBB,0xBC,0xCD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xDC,0xDD, + 0xDD,0xDD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD, + 0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDB,0xDD,0xDD,0xDD,0xEE,0xED,0xED,0xED,0xED,0xED, + 0xED,0xED,0xED,0xED,0xED,0xDD,0xDE,0xDD,0xED,0xDD,0xED,0xDE,0xDD,0xDC,0xCB,0xCD, + 0xCB,0xA9,0x78,0x77,0x87,0x87,0x78,0x78,0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xBB, + 0xBC,0xCD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0xDB,0x9B,0xEE,0xEE,0xFE,0xEF, + 0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xED,0xED,0xDD,0xDD,0xEE,0xEF,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCD,0xBA,0x99,0x89, + 0x99,0xAA,0xBD,0xDB,0xBB,0xCB,0xBB,0xBA,0xBA,0xBA,0xBA,0xAA,0xAA,0xAA,0xBA,0xBA, + 0xA9,0x99,0x98,0x98,0x88,0x98,0x98,0x98,0x99,0x9A,0xCC,0xCC,0xBB,0xBB,0xBB,0xBA, + 0xBB,0xBA,0xBB,0xBB,0xBA,0xBA,0xBB,0xAB,0xAA,0xA9,0x9A,0xAB,0xBB,0xCD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xED,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC, + 0xDC,0xDC,0xDC,0xDB,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xDC,0xDB,0xDC,0xDD,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDD,0xCC,0xCB,0xBB,0xBB,0xCC,0xDD,0xDD, + 0xDD,0xDE,0xDD,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xED,0xEE,0xDE,0xED,0xEE,0xDE,0xDE,0xDE, + 0xDE,0xDE,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xDC,0xCC,0xDD,0xCB,0x88, + 0x77,0x87,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBC, + 0xCD,0xDD,0xEE,0xEE,0xEF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98,0x8D,0xB9,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xED,0xEE,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xDC,0xAA,0x98,0x98, + 0x99,0xAA,0xAD,0xDD,0xCC,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xAB,0xAB,0xBA,0xAA, + 0x99,0x99,0x99,0x98,0x98,0x88,0x89,0x89,0x89,0x99,0xAB,0xCC,0xCB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBA,0xBB,0xBB,0xAB,0xAB,0xBB,0xBA,0xA9,0xA9,0xAB,0xBB,0xCB,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDB,0xDC,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xCD, + 0xDC,0xDD,0xDC,0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCC,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD, + 0xED,0xDD,0xDE,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xED,0xEE,0xDE,0xDE,0xDD,0xEE, + 0xDE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xDD,0xED,0xDD,0xCC,0xDD,0xBA,0x88,0x78,0x78, + 0x78,0x78,0x78,0x78,0x88,0x88,0x88,0x88,0x89,0x99,0x99,0x9A,0xAA,0xBB,0xBB,0xCC, + 0xDD,0xDE,0xEE,0xEE,0xFE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x99,0xD9,0x9D,0xEE,0xEE,0xFE, + 0xEF,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xDE,0xDD,0xDC,0xDE,0xEE,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xBA,0x98,0x88, + 0x99,0x9A,0xAB,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBB,0xBA,0xBA,0xAA,0xA9, + 0x99,0x99,0x88,0x88,0x98,0x99,0x88,0x88,0x99,0x99,0xAA,0xBC,0xCB,0xBB,0xBB,0xBB, + 0xCB,0xBB,0xBB,0xBB,0xCB,0xAB,0xBB,0xBB,0xBA,0xAA,0x99,0xAA,0xBB,0xBC,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDC,0xDD,0xDD,0xCD,0xDC,0xDD,0xDC,0xDD,0xDC, + 0xDD,0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xBD,0xCD,0xCC,0xDC,0xDD,0xDD,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xED, + 0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xED,0xEE,0xDE,0xDE,0xEE,0xDE,0xEE,0xDE, + 0xDE,0xDE,0xDD,0xDD,0xEE,0xDD,0xDD,0xDD,0xCC,0xDD,0xC9,0x87,0x87,0x87,0x87,0x87, + 0x87,0x88,0x88,0x88,0x88,0x88,0x89,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBC,0xDD, + 0xDD,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xBC,0x9A,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE, + 0xED,0xEE,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDB,0xAA,0x99,0x89, + 0x89,0x99,0xAA,0xBC,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBA,0xBB,0xBA,0xAA,0x99, + 0x98,0x98,0x98,0x89,0x89,0x98,0x99,0x89,0x89,0x99,0x9A,0xAB,0xCC,0xCB,0xBB,0xBB, + 0xBD,0xCB,0xBB,0xBB,0xBA,0xBA,0xAB,0xBB,0xBB,0xBA,0xAA,0x9A,0xBB,0xCC,0xBD,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDD,0xCD,0xDD,0xCD,0xCD,0xCD, + 0xCD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xDC,0xCD,0xBD,0xDC,0xDD,0xDE,0xEE, + 0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xCB,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xED,0xDD, + 0xDE,0xDD,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xDE,0xDE,0xED,0xEE,0xDE,0xDE,0xED,0xED,0xED, + 0xED,0xED,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD,0xCA,0x87,0x87,0x87,0x87,0x78,0x78,0x78, + 0x88,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCB,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x88,0x8D,0xA9,0xBE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xED,0xDD,0xCD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xCB,0xBA,0x99,0x88, + 0x89,0x99,0xAA,0xAB,0xDD,0xCC,0xCB,0xCB,0xBB,0xBB,0xBB,0xBB,0xBA,0xAA,0xA9,0x99, + 0x89,0x89,0x88,0x98,0x98,0x99,0x88,0x88,0x98,0x99,0x99,0xAA,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xCC,0xBB,0xBB,0xAB,0xAB,0xBB,0xBB,0xCB,0xBA,0xAA,0x9A,0xAB,0xBC,0xCC,0xDE, + 0xEE,0xEE,0xED,0xED,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xDC,0xDC,0xDC,0xDD,0xDC,0xDD, + 0xDC,0xDC,0xDD,0xCC,0xCD,0xBD,0xCD,0xCD,0xBD,0xCD,0xCC,0xDC,0xDD,0xDD,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xCB,0xBB,0xBA,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xDD,0xDD,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xDE,0xDE,0xDE,0xED,0xEE,0xDE,0xDE, + 0xDD,0xED,0xED,0xDD,0xDC,0xDD,0xDB,0x98,0x77,0x78,0x78,0x78,0x78,0x88,0x88,0x88, + 0x88,0x88,0x88,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xCD,0xCD,0xDD,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xDA,0x9D,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xDE,0xDE,0xDD,0xDC,0xDD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDC,0xBA,0xA9,0x98, + 0x98,0x89,0x99,0xAA,0xBC,0xCC,0xCC,0xCC,0xCB,0xBB,0xBB,0xBB,0xAA,0xA9,0x99,0x98, + 0x98,0x98,0x99,0x99,0x99,0x99,0x99,0x89,0x88,0x98,0x99,0x9A,0xAB,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xCB,0xBB,0xAA,0xBB,0xBB,0xBB,0xBB,0xAA,0x9A,0xAB,0xCC,0xCC,0xCD, + 0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xCD,0xCD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDB,0xDC,0xCD,0xDC,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDD,0xCC,0xBB,0xAB,0xBB,0xBB,0xCD,0xDD,0xED,0xDD,0xDD,0xDD, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xEE,0xDE,0xED,0xED,0xED,0xEE,0xED,0xEE,0xDE,0xEE,0xDE,0xDE, + 0xEE,0xED,0xDD,0xCD,0xDC,0xA8,0x78,0x78,0x78,0x87,0x87,0x88,0x88,0x88,0x88,0x88, + 0x89,0x89,0x99,0x99,0x9A,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE, + 0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x88,0xAD,0x99,0xDE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xDE,0xED,0xDD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDD,0xBB,0xA9,0x99, + 0x88,0x99,0x99,0xAA,0xBB,0xDD,0xCD,0xBC,0xCC,0xCB,0xBB,0xBA,0xAA,0x99,0x99,0x89, + 0x89,0x89,0x99,0x99,0x99,0x99,0x99,0x98,0x88,0x88,0x99,0x99,0xAA,0xBB,0xBB,0xBB, + 0xBB,0xBB,0xBC,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xAA,0x9A,0xAC,0xCC,0xBC,0xCD, + 0xEE,0xEE,0xED,0xDD,0xDD,0xDC,0xDD,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xDD,0xDC,0xDC, + 0xDD,0xDC,0xDC,0xDC,0xDB,0xDB,0xDB,0xCD,0xBD,0xCD,0xDC,0xDD,0xDE,0xEE,0xEF,0xEE, + 0xEE,0xED,0xDD,0xDC,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xEE,0xED, + 0xDD,0xDC,0xDD,0xB9,0x87,0x87,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x88,0x98,0x99, + 0x99,0x99,0x9A,0x9A,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98,0x8B,0xC9,0xAE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xDE,0xDE,0xED,0xEE,0xDE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xCB,0xAA,0x99, + 0x89,0x88,0x99,0x9A,0xAB,0xCC,0xDC,0xDC,0xDC,0xBB,0xBB,0xAA,0xA9,0x99,0x98,0x98, + 0x89,0x99,0x99,0xA9,0x99,0xAA,0xA9,0x99,0x98,0x98,0x89,0x99,0x9A,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCB,0xBB,0xBB,0xAA,0xA9,0xAB,0xDD,0xDC,0xBD, + 0xDE,0xEE,0xEE,0xEE,0xDD,0xDC,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xCD,0xCD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD, + 0xED,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xED,0xED,0xEE,0xEE,0xDE,0xED,0xEE,0xED,0xDD, + 0xDD,0xDB,0x98,0x77,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x88,0x89,0x99,0x99,0x99, + 0x9A,0x9A,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0xDB,0x9B,0xEE, + 0xEE,0xFE,0xEE,0xFE,0xEE,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE, + 0xEE,0xED,0xED,0xED,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED,0xDB,0xBA,0x99, + 0x98,0x89,0x89,0x99,0xAA,0xBC,0xDD,0xDC,0xCC,0xBB,0xAA,0xAA,0x99,0x89,0x89,0x89, + 0x89,0x99,0x99,0x99,0xAA,0xBB,0xAA,0xA9,0x99,0x89,0x89,0x99,0x99,0xAB,0xBB,0xBB, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCC,0xBB,0xBA,0xBA,0x99,0xAA,0xBC,0xDD,0xCD, + 0xDD,0xEE,0xED,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDC, + 0xDD,0xDC,0xDD,0xCD,0xCD,0xBD,0xCD,0xBD,0xDC,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE, + 0xED,0xDD,0xDC,0xCC,0xBB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xDD,0xDD, + 0xB9,0x87,0x87,0x88,0x78,0x78,0x88,0x88,0x88,0x88,0x89,0x99,0x99,0x99,0x9A,0xAA, + 0xAA,0xAA,0xBA,0xBB,0xBB,0xBB,0xCB,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98,0x8D,0xB9,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xDE,0xED,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xFF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xCA,0xA9, + 0x89,0x88,0x98,0x99,0x9A,0xBB,0xDD,0xED,0xDB,0xBB,0xAA,0x99,0x99,0x98,0x98,0x89, + 0x99,0xA9,0x99,0x9A,0xAB,0xDE,0xDB,0xA9,0x99,0x98,0x89,0x89,0x99,0xAA,0xBB,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xCB,0xCC,0xBB,0xBA,0xAA,0x99,0x9A,0xBC,0xCD,0xCD, + 0xDD,0xED,0xEE,0xDD,0xDC,0xDC,0xCD,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD, + 0xCD,0xCD,0xCD,0xCD,0xCD,0xCD,0xBD,0xCD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDE,0xDD,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xDB,0x97, + 0x87,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x98,0x99,0x99,0x99,0x99,0xAA,0xAA,0xAA, + 0xAB,0xBB,0xBB,0xBB,0xCB,0xCC,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98,0x89,0xDA,0x9E, + 0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xFE,0xEE,0xFE, + 0xEE,0xEE,0xDE,0xDE,0xDD,0xDD,0xCD,0xDD,0xDD,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xCB,0xAA, + 0x99,0x89,0x89,0x99,0x99,0xAA,0xCE,0xED,0xDB,0xBA,0xA9,0x99,0x88,0x89,0x89,0x99, + 0x99,0x99,0xAA,0x9B,0xCD,0xEE,0xED,0xAA,0x99,0x99,0x88,0x99,0x89,0x9A,0xAB,0xCC, + 0xBB,0xBB,0xBB,0xBB,0xBB,0xBC,0xBC,0xCC,0xBB,0xAA,0x99,0x99,0x9A,0xBB,0xDC,0xDC, + 0xDD,0xEE,0xDD,0xDD,0xDD,0xBD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC,0xDC, + 0xDD,0xCD,0xDB,0xDC,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xA8,0x87,0x87, + 0x87,0x87,0x88,0x88,0x88,0x88,0x89,0x89,0x99,0x99,0xAA,0xAA,0xAA,0xAA,0xBB,0xBB, + 0xBB,0xBB,0xCB,0xCC,0xCD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xBD,0x9A, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xEF,0xEE,0xED,0xDB,0xBA, + 0xA9,0x98,0x89,0x89,0x99,0x9A,0xBE,0xFE,0xBB,0xAA,0x99,0x99,0x98,0x98,0x89,0x99, + 0x99,0x9A,0xAA,0xAC,0xDE,0xEE,0xED,0xDB,0xAA,0x99,0x99,0x89,0x99,0x99,0xAA,0xBC, + 0xCB,0xBC,0xBC,0xBB,0xBB,0xCB,0xDC,0xCC,0xBA,0xAA,0x99,0x99,0x9A,0xBB,0xBD,0xCD, + 0xDD,0xDE,0xED,0xDD,0xDC,0xDC,0xCD,0xDC,0xDD,0xCD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD, + 0xCD,0xCC,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xED,0xEE,0xEC,0x98,0x78,0x78,0x78, + 0x78,0x88,0x88,0x88,0x89,0x89,0x99,0x99,0xA9,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xBB, + 0xBC,0xBD,0xCD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x98,0x8D,0xB9, + 0xBE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xEE,0xEE,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB, + 0xA9,0x99,0x88,0x89,0x99,0x99,0xAA,0xDC,0xBA,0xA9,0x99,0x98,0x89,0x89,0x99,0x9A, + 0x9A,0xAA,0xAB,0xDD,0xEE,0xEE,0xED,0xDC,0xBA,0x99,0x99,0x88,0x98,0x99,0x9A,0xBB, + 0xCD,0xBB,0xBC,0xBB,0xBB,0xBC,0xCC,0xBB,0xBA,0xA9,0x99,0x89,0x9A,0xAB,0xBC,0xDC, + 0xDD,0xED,0xDD,0xDD,0xDB,0xDC,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDC, + 0xDC,0xDB,0xDC,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDC, + 0xDB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xB9,0x87,0x87,0x87,0x87,0x88, + 0x88,0x88,0x88,0x89,0x99,0x99,0x9A,0xAA,0xAA,0xAB,0xAB,0xBB,0xBB,0xCC,0xBC,0xCD, + 0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xDB, + 0x9D,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xED,0xED,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xEE,0xEE,0xED,0xDB, + 0xAA,0x99,0x99,0x89,0x89,0x99,0x9A,0xAA,0xAA,0x99,0x99,0x98,0x98,0x89,0x99,0x99, + 0xAA,0xAB,0xBD,0xDD,0xEE,0xEE,0xEE,0xDD,0xBA,0xA9,0x99,0x89,0x89,0x89,0x9A,0xAB, + 0xCB,0xDB,0xCB,0xCB,0xDB,0xCB,0xBB,0xBA,0xBA,0x99,0x99,0x89,0xAA,0xBB,0xBC,0xBD, + 0xDD,0xDE,0xED,0xDD,0xCD,0xBD,0xCD,0xDD,0xCD,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xA8,0x78,0x78,0x78,0x78,0x88,0x88, + 0x88,0x88,0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99,0x88,0x9D, + 0xA9,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE,0xDC, + 0xBA,0xA9,0x99,0x98,0x99,0x99,0xA9,0xA9,0xA9,0x99,0x98,0x89,0x89,0x99,0x99,0xAA, + 0xAA,0xBB,0xDD,0xEE,0xEE,0xEE,0xDE,0xDD,0xDB,0xA9,0x99,0x98,0x88,0x99,0x99,0xAB, + 0xCD,0xCC,0xBB,0xCC,0xCC,0xCB,0xBB,0xAA,0xA9,0x98,0x98,0x99,0x9A,0xBB,0xBB,0xCD, + 0xDD,0xED,0xDD,0xDC,0xDC,0xDC,0xDC,0xDC,0xDB,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xCD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDC,0xCB, + 0xBB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xEE,0xDE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDB,0x98,0x78,0x78,0x78,0x88,0x88,0x88,0x88, + 0x99,0x99,0x99,0xAA,0xAA,0xAA,0xAB,0xBB,0xBB,0xCB,0xCC,0xCD,0xDD,0xDD,0xDD,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0x99,0x98,0x8A, + 0xD9,0xAE,0xEF,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFF,0xEF,0xEE,0xEE,0xEE,0xDD, + 0xCB,0xAA,0x99,0x98,0x98,0x99,0x99,0x9A,0x99,0x99,0x98,0x98,0x99,0x99,0x9A,0xAA, + 0xAB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE,0xED,0xDB,0xBA,0x99,0x99,0x89,0x88,0x99,0x9A, + 0xBC,0xDD,0xDC,0xCB,0xDC,0xCC,0xBA,0xA9,0x99,0x99,0x88,0x89,0xAA,0xAB,0xBB,0xCD, + 0xDD,0xEE,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDC,0xDD,0xCD,0xDC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xBB, + 0xAB,0xBB,0xBB,0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xCA,0x88,0x78,0x78,0x78,0x88,0x88,0x88,0x89,0x99, + 0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC,0xCC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x99,0x88, + 0xCC,0x9B,0xEE,0xEF,0xEE,0xEE,0xEE,0xFE,0xED,0xDE,0xED,0xED,0xED,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xDD,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE,0xFE,0xFE,0xFE,0xEE,0xED, + 0xDB,0xBA,0xA9,0x99,0x98,0x98,0x99,0x99,0x99,0x99,0x89,0x89,0x99,0x9A,0xAA,0xAB, + 0xBC,0xDD,0xDE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xBB,0xA9,0x99,0x88,0x89,0x89,0x9A, + 0xAD,0xDD,0xCD,0xCC,0xCC,0xBC,0xAA,0x99,0x99,0x89,0x88,0x99,0xAA,0xBB,0xBC,0xDD, + 0xDE,0xDD,0xDD,0xCD,0xDC,0xDD,0xCD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xCD, + 0xCD,0xCD,0xCD,0xDC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBB,0xBB, + 0xBB,0xBB,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xB8,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x99, + 0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC,0xCD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98, + 0x8D,0xB9,0xDE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xED,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDD,0xDE,0xEE,0xFF,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xFE,0xEF,0xEE,0xEE, + 0xDD,0xBB,0xAA,0x99,0x99,0x99,0x89,0x99,0x98,0x98,0x89,0x99,0x99,0x9A,0xAA,0xBB, + 0xCD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDB,0xAA,0x99,0x98,0x98,0x89,0x99, + 0xAA,0xDD,0xDD,0xCD,0xBB,0xAA,0xA9,0x99,0x99,0x88,0x89,0x99,0xAA,0xBB,0xBC,0xDD, + 0xDE,0xDD,0xDD,0xCD,0xCD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDC,0xDC,0xDC,0xDD,0xDD,0xDD, + 0xDC,0xDD,0xCD,0xCD,0xDD,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xDD,0xDD,0xCB,0xBB,0xAB, + 0xBB,0xBC,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEC,0x98,0x78,0x77,0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA, + 0xAA,0xAB,0xBB,0xBB,0xBB,0xBD,0xCD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98, + 0x89,0xDA,0x9E,0xEE,0xFE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xEE,0xDE,0xDE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xDD,0xCD,0xDD,0xEE,0xFE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFF,0xEE,0xEE,0xEE, + 0xED,0xDB,0xBA,0xA9,0x99,0x99,0x99,0x99,0x89,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBD, + 0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xBA,0x99,0x98,0x88,0x98,0x99, + 0x9A,0xAC,0xCD,0xDC,0xBB,0xA9,0x99,0x99,0x88,0x89,0x99,0x9A,0xAB,0xBB,0xCD,0xDD, + 0xED,0xED,0xCD,0xCD,0xCD,0xDD,0xCD,0xDD,0xDC,0xDD,0xCD,0xDD,0xDD,0xCD,0xCD,0xDC, + 0xDD,0xCD,0xDD,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xED,0xDD,0xCC,0xBB,0xBB,0xBB, + 0xBC,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEB,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA,0xAA,0xAA, + 0xBB,0xBB,0xBC,0xBC,0xDD,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEF, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xED,0xDD,0xDC,0xBA,0xAA,0x99, + 0x88,0x9D,0xAA,0xEE,0xEE,0xFE,0xFE,0xEF,0xEE,0xEE,0xDE,0xDE,0xEE,0xDE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xDD,0xDD,0xDD,0xDE,0xFF,0xFE, + 0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE, + 0xEE,0xDD,0xBB,0xAA,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xBB,0xDD, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCB,0xA9,0x99,0x98,0x89,0x89, + 0x99,0xAA,0xCE,0xEB,0xAA,0xA9,0x99,0x98,0x89,0x88,0x99,0x9A,0xBB,0xBB,0xDD,0xDD, + 0xED,0xDD,0xDD,0xDC,0xDD,0xDC,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDC,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xED,0xCD,0xCB,0xBB,0xBB,0xBB, + 0xBD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDA,0x87,0x87,0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x99,0xAA,0xAA,0xAB,0xBB, + 0xBB,0xBB,0xCC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xCB,0xBB,0xAA,0x99, + 0x98,0x8B,0xC9,0xBE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xED,0xED,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xDE,0xED,0xED,0xDC,0xDD,0xDD,0xEE,0xEF, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xED,0xDB,0xBA,0xA9,0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDB,0xBA,0x99,0x98,0x88,0x98, + 0x99,0x9A,0xAB,0xBA,0xA9,0x99,0x89,0x89,0x88,0x99,0x9A,0xAB,0xBB,0xDD,0xDD,0xED, + 0xED,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDD,0xCD,0xBD,0xCD,0xDD,0xDD,0xDD,0xDD,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0xDB,0xBB,0xBB,0xBC,0xCD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xC9,0x87,0x87,0x87,0x88,0x88,0x88,0x89,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xCC, + 0xCC,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9, + 0x99,0x88,0xDB,0x9C,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDE,0xEE,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xED,0xDD,0xCD,0xCD,0xEE,0xFE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xDD,0xBB,0xAA,0xAA,0x99,0x9A,0x99,0xA9,0x9A,0xAA,0xAB,0xBC,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xBA,0xA9,0x99,0x98,0x89, + 0x89,0x99,0x9A,0x99,0x99,0x99,0x99,0x88,0x89,0x99,0x9A,0xAB,0xBC,0xDD,0xDE,0xDE, + 0xDD,0xDD,0xDC,0xDC,0xDD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD, + 0xDD,0xDD,0xED,0xDD,0xDE,0xEE,0xEE,0xFE,0xEF,0xEE,0xED,0xDB,0xBB,0xBB,0xBB,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB8, + 0x78,0x78,0x78,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xAA,0xBB,0xBB,0xBB,0xCC, + 0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFF,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xCB,0xBB,0xAA, + 0x99,0x88,0x8D,0xB9,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xEE,0xEE,0xDE,0xDE, + 0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xCC,0xDD,0xDE,0xEF, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE, + 0xFE,0xEE,0xEE,0xDB,0xBA,0xAA,0xAA,0xA9,0xA9,0x9A,0x9A,0xAB,0xBB,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xCB,0xAA,0x99,0x88,0x98, + 0x99,0x99,0x99,0x99,0x99,0x89,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCD,0xDD,0xEE,0xDE, + 0xDD,0xDD,0xCD,0xDD,0xCD,0xCD,0xDC,0xDD,0xDC,0xDC,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFE,0xED,0xCB,0xBC,0xCC,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xB8,0x87, + 0x87,0x88,0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBC,0xCC,0xDD,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA, + 0xA9,0x98,0x89,0xDA,0xAE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED, + 0xDE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xDD,0xCD,0xDE,0xEE, + 0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEF,0xEE,0xEE,0xED,0xBB,0xBA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBB,0xCD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xED,0xDD,0xBA,0x99,0x99,0x98, + 0x98,0x99,0x99,0x99,0x98,0x98,0x89,0x99,0x99,0x9A,0xBB,0xCC,0xDD,0xDE,0xDE,0xED, + 0xDD,0xCD,0xDD,0xCD,0xDD,0xDC,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEE,0xED,0xDC,0xBB,0xBD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xA8,0x87,0x78, + 0x78,0x88,0x88,0x88,0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBC,0xBC,0xCC,0xDD,0xDD,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA, + 0xA9,0x99,0x88,0x9D,0x9B,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xEE,0xEE,0xDE, + 0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xCD,0xDD,0xEE, + 0xFE,0xFE,0xFE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE, + 0xFE,0xEF,0xEE,0xEE,0xDD,0xBB,0xBA,0xAA,0xAA,0xAA,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xBB,0xA9,0x99,0x88, + 0x98,0x99,0x99,0x99,0x98,0x98,0x99,0x99,0xAA,0xAB,0xBB,0xCD,0xDE,0xDE,0xEE,0xDD, + 0xDD,0xDD,0xCD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDC,0xCD,0xDD,0xDD,0xDD, + 0xDD,0xDE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xA8,0x78,0x78,0x88, + 0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB, + 0xAA,0x99,0x98,0x8C,0xC9,0xCE,0xEE,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE,0xDE,0xED,0xED, + 0xED,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDC,0xDE,0xEE, + 0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE, + 0xFE,0xFE,0xEE,0xFE,0xEE,0xDB,0xCB,0xBB,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xEF,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xDB,0xAA,0x99,0x99, + 0x89,0x89,0x89,0x98,0x89,0x89,0x99,0x9A,0xAB,0xBB,0xCD,0xDD,0xDD,0xEE,0xED,0xDD, + 0xDB,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDB,0xDD,0xCD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0x97,0x87,0x87,0x88,0x88, + 0x88,0x89,0x99,0x99,0xAA,0xAA,0xAB,0xBB,0xBB,0xBC,0xDD,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDC,0xCB, + 0xBA,0xA9,0x99,0x88,0xDB,0x9D,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED, + 0xDE,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xDD,0xDD,0xEE, + 0xFE,0xFF,0xEF,0xEE,0xEE,0xEF,0xEF,0xEE,0xEF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDC,0xCB,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xFE,0xFE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xBA,0xA9,0x99, + 0x98,0x98,0x98,0x99,0x99,0x99,0x99,0xAA,0xBB,0xBC,0xDD,0xED,0xEE,0xDE,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xED,0xA7,0x78,0x87,0x88,0x88,0x88, + 0x99,0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xCB,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xDD,0xCC, + 0xBA,0xAA,0x99,0x88,0x9D,0xAA,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xEE,0xED,0xED,0xED, + 0xED,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xEE,0xDD,0xDD,0xEE, + 0xEE,0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, + 0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xDE,0xDD,0xCB,0xAA,0x99, + 0x99,0x99,0x99,0x99,0x99,0x99,0xAA,0xAB,0xCB,0xDD,0xDD,0xDE,0xEE,0xED,0xDD,0xDD, + 0xCD,0xDD,0xDD,0xDD,0xDD,0xCD,0xCD,0xDC,0xDD,0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD,0xEE,0xDE,0xDD,0xDD,0xDD,0xDE,0xDD, + 0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0x98,0x87,0x87,0x88,0x88,0x88,0x99, + 0x99,0x9A,0xAA,0xAA,0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDB, + 0xBB,0xAA,0x99,0x98,0x8A,0xDA,0xAE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xDE,0xEE, + 0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDE, + 0xEE,0xFF,0xFF,0xEF,0xEE,0xEF,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xDB,0xBA,0xA9, + 0x99,0x99,0x99,0x99,0x99,0xAA,0xAA,0xBB,0xCD,0xDD,0xDE,0xEE,0xED,0xDD,0xDD,0xBD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE, + 0xEE,0xFE,0xFF,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEC,0x88,0x78,0x78,0x88,0x88,0x88,0x99,0x99, + 0x9A,0xAA,0xAB,0xBB,0xBC,0xBC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD, + 0xCB,0xBA,0xA9,0x99,0x88,0xBD,0x9B,0xEE,0xFE,0xEE,0xEE,0xFE,0xEE,0xEE,0xDD,0xDD, + 0xED,0xED,0xED,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDD,0xDD, + 0xEE,0xEF,0xEF,0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xBB,0xAA, + 0x9A,0x99,0x99,0x99,0x9A,0xAA,0xBB,0xBD,0xDD,0xDD,0xEE,0xDE,0xEE,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xEE,0xEE, + 0xEF,0xFE,0xFE,0xFE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0x97,0x87,0x78,0x88,0x88,0x88,0x99,0x99,0x9A, + 0xAA,0xAB,0xBB,0xBB,0xCC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD, + 0xCB,0xBB,0xAA,0x99,0x88,0x8C,0xB9,0xDE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xED,0xEE, + 0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xDD,0xDD, + 0xEE,0xEF,0xFF,0xFF,0xEF,0xEF,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xEE,0xEE,0xEF,0xEF,0xFF,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xFF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xDE,0xDD,0xCB,0xBA, + 0xAA,0xA9,0xA9,0xAA,0xAA,0xBB,0xBC,0xDD,0xED,0xEE,0xEE,0xEE,0xDD,0xDD,0xDC,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xFE, + 0xFE,0xEF,0xEF,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xED,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xDE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0x98,0x87,0x88,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA, + 0xBB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED, + 0xDD,0xBB,0xBA,0xA9,0x98,0x88,0xDB,0xAD,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xDD, + 0xDE,0xDE,0xED,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD, + 0xDD,0xEF,0xEF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE, + 0xFE,0xFE,0xFF,0xFF,0xEF,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xFF,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xBB, + 0xBB,0xAA,0xAA,0xAA,0xAB,0xBB,0xDD,0xDD,0xDE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDC,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xEE,0xEE,0xEF, + 0xEF,0xFF,0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xED,0x97,0x87,0x78,0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB, + 0xBB,0xBB,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED, + 0xDD,0xBB,0xBA,0xAA,0x99,0x88,0x8D,0xAA,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xED, + 0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xDD, + 0xDD,0xEE,0xEF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xED,0xED,0xDD, + 0xBC,0xBB,0xBB,0xBB,0xBC,0xDD,0xDE,0xDE,0xEE,0xDE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xEE,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xED,0xDD,0xCD,0xCD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDE,0xDD,0xDD,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE, + 0xEF,0xEE,0xEE,0xEE,0x97,0x87,0x88,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAA,0xBB,0xBB, + 0xCC,0xDD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE, + 0xDD,0xDD,0xBB,0xAA,0x99,0x98,0x89,0xD9,0xBE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xDE,0xEE,0xDE,0xED,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xED,0xED,0xED, + 0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xDD,0xCB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEF,0xEF,0xEF, + 0xEE,0xEE,0xDD,0xCC,0xBC,0xBD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF, + 0xEE,0xEE,0xEE,0xA8,0x78,0x78,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBC, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE, + 0xED,0xDC,0xBB,0xBA,0xA9,0x99,0x88,0xBC,0x9B,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE, + 0xDD,0xDD,0xEE,0xEF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xFF,0xEF,0xEF,0xEE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xED,0xED, + 0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEF,0xEE, + 0xEE,0xDD,0xCC,0xBB,0xBC,0xDD,0xDE,0xDE,0xED,0xED,0xED,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xA8,0x87,0x87,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD, + 0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xDD,0xDC,0xBA,0xAA,0x99,0x98,0x8D,0xB9,0xDE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xDD,0xDD,0xDE,0xEF,0xEF,0xFF,0xFE,0xFE,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xEF,0xEF,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xED,0xDD,0xDD,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xED,0xEE,0xEE,0xEE,0xEF,0xFE,0xEE, + 0xDD,0xDD,0xCB,0xBB,0xBC,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE,0xEF,0xEE, + 0xEE,0xB8,0x78,0x78,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xBC,0xDD,0xDD, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x88,0xDB,0xAE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED, + 0xED,0xDD,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDE,0xDD,0xED,0xED,0xDD, + 0xDD,0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED, + 0xDD,0xBC,0xBB,0xBC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xB8,0x78,0x87,0x88,0x88,0x89,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0x9E,0xAA,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE, + 0xDE,0xDD,0xDD,0xDE,0xFE,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF, + 0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEE,0xFE,0xEE,0xFE,0xFF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xFE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDD,0xED,0xED,0xDE,0xDD,0xED, + 0xDD,0xDD,0xCD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xED,0xDD, + 0xCB,0xBB,0xBB,0xDD,0xDD,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xE9, + 0x77,0x87,0x88,0x88,0x89,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x98,0x8A,0xDA,0xCE,0xEE,0xEE,0xFE,0xEE,0xEF, + 0xEE,0xEE,0xDD,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE, + 0xED,0xED,0xDD,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xEE,0xDE,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xDE,0xDE,0xEE,0xFE,0xEE,0xED,0xDD,0xBB, + 0xBB,0xBB,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEA,0x88, + 0x78,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB,0xBB,0xBC,0xCD,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0xBD,0xAD,0xEE,0xFE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xDE,0xEE, + 0xDE,0xDE,0xDD,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFF,0xFE,0xFF,0xEF,0xEF, + 0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xED,0xED,0xED,0xDE,0xDD,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDD,0xDD,0xDE,0xEE,0xFE,0xEE,0xEE,0xDD,0xCB,0xBB, + 0xBB,0xBD,0xDD,0xDE,0xDE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xFE,0xEE,0xEB,0x87,0x87, + 0x88,0x88,0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99,0x88,0x8D,0xBA,0xDE,0xEE,0xFE,0xEE,0xEF, + 0xEE,0xEE,0xED,0xDE,0xEE,0xEE,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xED, + 0xED,0xED,0xED,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xFE,0xFF,0xFE, + 0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xDD, + 0xDD,0xDD,0xDD,0xED,0xED,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDB,0xBB,0xBB, + 0xBC,0xDD,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xFE,0xEE,0xED,0x98,0x78,0x88, + 0x88,0x89,0x99,0x9A,0xAA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xEF,0xEF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEF,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98,0x88,0xDB,0xAE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xFE,0xEE,0xED,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xED,0xED,0xED,0xDD,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xEF,0xFE,0xFE, + 0xFE,0xFF,0xEF,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xED,0xED,0xED,0xED,0xED,0xED,0xDE,0xDD, + 0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDD,0xED,0xEE,0xEE,0xEE,0xED,0xDC,0xCB,0xBB,0xBB, + 0xDD,0xDE,0xDD,0xEE,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEF,0xEE,0xEE,0x97,0x78,0x78,0x88, + 0x88,0x99,0x99,0xAA,0xAA,0xBB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0x9E,0xAB,0xEE,0xEF,0xEE,0xEF, + 0xEE,0xEE,0xFE,0xED,0xDE,0xDE,0xED,0xEE,0xDE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xED, + 0xED,0xEE,0xDE,0xDD,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEF,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xDE,0xDE,0xDE,0xDD,0xED,0xED, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xEE,0xED,0xEE,0xDD,0xDC,0xCC,0xBB,0xCC,0xDD, + 0xDE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE,0xB8,0x87,0x88,0x88,0x88, + 0x99,0x99,0xAA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFE,0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x99,0x89,0xDA,0xCE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xED,0xEE,0xDE,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF, + 0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xEF,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xED,0xED,0xDD,0xDD, + 0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xEE,0xEE,0xED,0xDC,0xBB,0xBB,0xBB,0xCD,0xDD, + 0xDD,0xED,0xED,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xD9,0x78,0x78,0x88,0x88,0x99, + 0x99,0x9A,0xAA,0xBB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEE,0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x88,0xAD,0xAC,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xFE,0xEE,0xED,0xDE,0xED,0xEE,0xDE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xED,0xED,0xDD,0xDD,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFE, + 0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xED,0xEE,0xDE,0xDD,0xDE,0xDD, + 0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDE,0xDE,0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xDD,0xED, + 0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEF,0xEE,0xEB,0x87,0x88,0x88,0x88,0x99,0x99, + 0x9A,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98,0x8C,0xCA,0xDE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDD,0xEE,0xED,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE, + 0xED,0xEE,0xDE,0xDE,0xED,0xDD,0xDE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF, + 0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xEE,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xDE,0xDE,0xED,0xED,0xED,0xDD,0xED, + 0xDD,0xED,0xDD,0xDC,0xDC,0xDD,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE, + 0xDE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xED,0xEE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEF,0xEE,0xED,0x88,0x78,0x88,0x88,0x89,0x99,0x9A, + 0xAA,0xBB,0xBC,0xBC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDB,0xBB,0xAA,0xA9,0x98,0x88,0xDB,0xAE,0xEE,0xEF, + 0xEE,0xFE,0xEF,0xEE,0xFE,0xED,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xED,0xED,0xEE,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xED,0xED,0xDE,0xDE,0xDE, + 0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xCC,0xBB,0xBB,0xBD,0xCD,0xDE,0xED,0xED, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEF,0xEF,0xEF,0xEE,0xED,0x98,0x87,0x88,0x88,0x89,0x99,0x9A,0xAA, + 0xBB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0x8D,0xBB,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xED,0xEE,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xED,0xEE,0xDE,0xDE,0xED,0xED,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF, + 0xFF,0xFE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xED,0xED,0xED, + 0xEE,0xDD,0xDD,0xDC,0xDC,0xDC,0xDC,0xCB,0xBB,0xBB,0xBC,0xCD,0xDE,0xDE,0xDE,0xEE, + 0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xC8,0x87,0x88,0x88,0x89,0x99,0x9A,0xAA,0xAB, + 0xBB,0xBB,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEE,0xFE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x98,0x89,0xDA,0xCE,0xEE, + 0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xDD,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEF,0xEF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xDE,0xDE,0xEE,0xDE,0xDE,0xED,0xED,0xED, + 0xED,0xDD,0xDC,0xDC,0xDB,0xCC,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xED,0xED,0xED,0xED, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFE,0xEF,0xEF,0xEE,0xEA,0x87,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB, + 0xCC,0xDD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0x9D,0xAC,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xDE,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xED,0xED, + 0xDD,0xDD,0xDD,0xDC,0xCB,0xBB,0xBA,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDE,0xEE,0xEE, + 0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xEF,0xEE,0xEE,0xEA,0x88,0x78,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBC, + 0xCD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99,0x88,0x8B,0xCA,0xDE, + 0xEE,0xEF,0xEF,0xEF,0xEE,0xEF,0xEE,0xDD,0xED,0xEE,0xEE,0xDE,0xEE,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xDD,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFE,0xFF,0xEF,0xFF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xED,0xED,0xEE,0xDE,0xDE,0xDE, + 0xDD,0xDD,0xCD,0xCB,0xBB,0xBA,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDE,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xEE,0xFE,0xFE,0xFE,0xEB,0x88,0x78,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xCD, + 0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xAA,0xA9,0x98,0x88,0xDB,0xAE, + 0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xFF,0xEF,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFF,0xFF,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xDE, + 0xDD,0xDC,0xDC,0xBB,0xBA,0xBB,0xBB,0xBB,0xDD,0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xB7,0x87,0x88,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xBC,0xBD,0xDD, + 0xDE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xAA,0x99,0x88,0x8D,0xBA, + 0xEE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xEE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xED,0xDD,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xEF,0xFE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xED,0xED,0xDE,0xDD,0xDD, + 0xDD,0xDC,0xCB,0xBB,0xBB,0xBB,0xBB,0xDD,0xDD,0xED,0xED,0xED,0xED,0xED,0xED,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEF, + 0xEE,0xEF,0xEE,0xD9,0x87,0x88,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE, + 0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98,0x89,0xEA, + 0xBE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xED,0xDD,0xDE,0xDE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xED,0xED,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE, + 0xFF,0xFF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xDE,0xDE,0xED,0xED,0xDD, + 0xDD,0xCB,0xBB,0xBA,0xBB,0xBB,0xDD,0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEE, + 0xEF,0xEE,0xEA,0x78,0x88,0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBB,0xCC,0xDD,0xDE,0xEE, + 0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x88,0x9D, + 0xAC,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xED,0xEE,0xDE,0xDE,0xEE,0xEE, + 0xFE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xED,0xDD,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xEF,0xFF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xDD,0xDD, + 0xCC,0xBB,0xAB,0xBB,0xBB,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xED,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF, + 0xEE,0xEE,0x98,0x87,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xBC,0xDD,0xDD,0xEE,0xEE, + 0xFE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDC,0xBA,0xAA,0x99,0x98,0x8A, + 0xDA,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE,0xDD,0xDD,0xDD,0xED,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xED,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE, + 0xFF,0xFF,0xEF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xDD,0xDC, + 0xBB,0xBB,0xBB,0xBB,0xBD,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEF,0xEE, + 0xEE,0xC8,0x87,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCB,0xDD,0xDD,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDC,0xBB,0xBA,0xA9,0x98,0x88, + 0xBC,0xAD,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xEE,0xDE,0xEE,0xEE, + 0xEF,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF, + 0xEF,0xEF,0xFE,0xFF,0xFF,0xEF,0xFE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDE,0xDD,0xDD,0xDC,0xDB, + 0xBB,0xBB,0xBB,0xBD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xDE,0xEE,0xDE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xFE,0xEE, + 0xEA,0x87,0x88,0x88,0x89,0x99,0xAA,0xAA,0xBB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE, + 0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEE,0xEE,0xDD,0xCB,0xBA,0xAA,0x99,0x88, + 0x8D,0xBA,0xEE,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xDD,0xDD,0xDD,0xEE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEE,0xED,0xEE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xDE,0xDD,0xDD,0xDD,0xCD,0xBB, + 0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xDE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEF,0xEF,0xEE,0xEE,0xEC, + 0x88,0x88,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBB,0xBD,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xEE,0xDD,0xDB,0xBB,0xAA,0x99,0x98, + 0x88,0xDB,0xBE,0xEE,0xFE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xED,0xDE,0xEE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xFE,0xFF, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xEE,0xEE,0xEE,0xED,0xED,0xDD,0xDC,0xDC,0xCB,0xBB, + 0xBB,0xBC,0xDD,0xDD,0xED,0xED,0xED,0xEE,0xDE,0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xEE,0xFE,0xEE,0xD8, + 0x87,0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBB,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99, + 0x88,0x9D,0xAC,0xEE,0xEF,0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xDD,0xDD,0xDE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xEF,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE,0xEE,0xEE,0xFE,0xEE,0xFE,0xEE,0xFE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xCB,0xBB,0xBB, + 0xBB,0xDD,0xDD,0xED,0xEE,0xDE,0xDE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xFE,0xEE,0xEA,0x87, + 0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xBB,0xDD,0xDD,0xEE,0xEE,0xFE,0xEF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xEE,0xEE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99, + 0x98,0x89,0xDA,0xCE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xED,0xDE,0xDE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF, + 0xEF,0xEF,0xFF,0xEF,0xFF,0xEE,0xEE,0xEF,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xCC,0xBB,0xBB,0xBB,0xCD, + 0xDD,0xDD,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xED,0xEE,0xDE,0xED,0xEE,0xEE,0xDE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEF,0xEE,0xEE,0xED,0x87,0x88, + 0x88,0x89,0x99,0xAA,0xAA,0xBB,0xBC,0xDD,0xDD,0xEE,0xEE,0xFE,0xEF,0xEF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xED,0xDD,0xBB,0xBA,0xA9, + 0x98,0x88,0xBD,0xAD,0xEE,0xFE,0xEE,0xEF,0xEF,0xEE,0xEE,0xED,0xDD,0xED,0xEE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEF,0xEF,0xFE,0xFE,0xFE,0xFF, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEF,0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xBB,0xBB,0xBB,0xBB,0xCD, + 0xDD,0xDE,0xDE,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xD8,0x88,0x88, + 0x88,0x99,0x9A,0xAA,0xBB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xDD,0xBB,0xBA,0xAA, + 0x99,0x88,0x8C,0xCA,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xDD,0xDE,0xED,0xEE, + 0xDE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFE,0xFE,0xFE,0xFF,0xEF, + 0xEF,0xEF,0xEF,0xFF,0xFF,0xEE,0xFE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xDE,0xED,0xDC,0xCB,0xBB,0xBB,0xBB,0xDD,0xDD, + 0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xFE,0xEE,0xC8,0x87,0x88,0x88, + 0x99,0x99,0xAA,0xAB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD,0xDD,0xBB,0xAA, + 0xA9,0x98,0x88,0xDB,0xAE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xFE,0xED,0xDD,0xEE,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xFF,0xFF,0xFE,0xFE, + 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEE,0xFE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xDC,0xBB,0xBB,0xBB,0xCD,0xDD,0xED, + 0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xEE,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0x87,0x88,0x88,0x89, + 0x99,0xAA,0xAB,0xBB,0xBB,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDC,0xBB,0xBA, + 0xA9,0x99,0x88,0x8D,0xBB,0xEE,0xEE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xDD,0xDE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFF,0xFE, + 0xFF,0xEF,0xEF,0xEF,0xFE,0xFE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFF,0xEF,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xCB,0xBB,0xBB,0xCD,0xDD,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xA8,0x88,0x88,0x89,0x99, + 0x9A,0xAA,0xBB,0xBC,0xDD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xFE,0xEE,0xDD,0xDC,0xBB, + 0xAA,0x99,0x98,0x89,0xDA,0xCE,0xEF,0xEE,0xEF,0xEE,0xEE,0xEE,0xFE,0xED,0xDE,0xDE, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xFE,0xFE,0xFF,0xFF,0xEF,0xEF,0xEF,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCD,0xCB,0xBB,0xBB,0xBD,0xDD,0xDE,0xDE,0xDD, + 0xED,0xED,0xEE,0xDE,0xDE,0xED,0xEE,0xEE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xD8,0x87,0x88,0x88,0x99,0x9A, + 0xAA,0xBB,0xBB,0xBD,0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEE,0xEE,0xED,0xDC,0xBB, + 0xBA,0xA9,0x98,0x88,0x9D,0xAC,0xEE,0xEF,0xEE,0xEF,0xEE,0xFE,0xEE,0xEE,0xDD,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xEF,0xEF,0xFF,0xFE,0xEE,0xEE,0xFE,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xDB,0xCB,0xBB,0xBB,0xBD,0xDD,0xDD,0xED,0xED,0xEE, + 0xDE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEF,0xEF,0xEF,0xEE,0xEE,0xFE,0xEF,0xEE,0xEC,0x88,0x88,0x88,0x89,0x99,0xAA, + 0xAB,0xBC,0xCD,0xDD,0xDE,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xEE,0xDD,0xDB, + 0xBB,0xAA,0x99,0x98,0x8A,0xDA,0xDE,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE, + 0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xED,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xBB,0xBB,0xBB,0xDD,0xDD,0xED,0xED,0xEE,0xDE, + 0xDE,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xEE,0x88,0x88,0x88,0x89,0x99,0x9A,0xAA, + 0xBB,0xCB,0xDD,0xDE,0xEE,0xEE,0xEF,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xED,0xDB, + 0xBB,0xAA,0xA9,0x98,0x88,0xBD,0xAD,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE,0xDD, + 0xED,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDE,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xEE,0xFE,0xEF,0xEE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDD,0xDD,0xBB,0xBB,0xBC,0xDD,0xDD,0xED,0xED,0xED,0xED,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xB8,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB, + 0xBB,0xCD,0xDD,0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED,0xDD, + 0xCB,0xBA,0xAA,0x99,0x88,0x8C,0xBA,0xEE,0xEF,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xED, + 0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xED,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xDC,0xDC,0xDC,0xCB,0xDD,0xDD,0xDD,0xDE,0xDE,0xDE,0xDE,0xED, + 0xEE,0xDE,0xDE,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEA,0x88,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB, + 0xBD,0xDD,0xEE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE,0xDD, + 0xDB,0xBB,0xAA,0x99,0x98,0x88,0xDB,0xBE,0xEE,0xFE,0xFE,0xEF,0xEE,0xEE,0xEE,0xEE, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDD,0xDE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xEF,0xEF,0xEF,0xEF,0xEE,0xFE,0xEE,0xEE, + 0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xED,0xED,0xED,0xED,0xED,0xED, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xFE,0xEF,0xEF,0xEE,0xEC,0x88,0x78,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCD, + 0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE,0xED, + 0xDD,0xCB,0xBA,0xA9,0x99,0x88,0x8D,0xCC,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE, + 0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xFE,0xFF,0xEE,0xEE,0xEE, + 0xDE,0xED,0xDD,0xDD,0xDD,0xDD,0xDD,0xDD,0xED,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xEE,0xED,0xEE,0xDE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE, + 0xEE,0xFE,0xEE,0xEE,0xEE,0xEE,0x98,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xCD, + 0xDD,0xEE,0xEE,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE, + 0xDD,0xCB,0xBA,0xAA,0x99,0x88,0x89,0xDA,0xDE,0xEF,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE, + 0xED,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xDE,0xDE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xEE,0xED, + 0xED,0xDD,0xDD,0xED,0xED,0xED,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xDE,0xEE,0xEE, + 0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE, + 0xFE,0xEE,0xFE,0xFE,0xEE,0xC8,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xDD, + 0xEE,0xEE,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE,0xEE, + 0xED,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0x9D,0xAD,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xDD,0xDE,0xED,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xEE, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0xFE,0xFE,0xEE,0xEE,0xEE,0xDD, + 0xED,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE, + 0xED,0xED,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF, + 0xEE,0xFE,0xEE,0xEE,0xE9,0x88,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xBC,0xDD,0xDE, + 0xEE,0xEE,0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE,0xEE, + 0xEE,0xDD,0xBB,0xBA,0xAA,0x99,0x88,0x8A,0xDA,0xEE,0xEE,0xEF,0xEF,0xEE,0xFE,0xFE, + 0xFE,0xED,0xDD,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED, + 0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xEE,0xEF,0xEF,0xFF,0xEF,0xEE,0xEE,0xEE,0xEE,0xDD,0xDE,0xDE, + 0xDE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xED,0xDE,0xDE,0xDD,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE, + 0xFE,0xEF,0xEE,0xED,0x88,0x78,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xCC,0xDD,0xDD,0xEE, + 0xEF,0xEE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFE, + 0xEE,0xDD,0xDC,0xBB,0xAA,0xA9,0x98,0x88,0xBC,0xBE,0xEF,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDD,0xDE,0xDD,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xEF,0xFE,0xEE,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE,0xEE,0xDD,0xDD,0xDD,0xED, + 0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xED, + 0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEF,0xEE,0xEE,0xA8,0x78,0x88,0x88,0x99,0x9A,0xAA,0xBB,0xBB,0xBD,0xDD,0xEE,0xEE, + 0xEE,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xEE, + 0xEE,0xED,0xDD,0xBB,0xBA,0xA9,0x99,0x88,0x8D,0xBB,0xEE,0xEF,0xEE,0xFE,0xFE,0xEE, + 0xEE,0xEE,0xED,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xFE,0xFE,0xFE,0xFE,0xFE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEF,0xEE,0xEE,0xEE,0xED,0xDD,0xCD,0xDD,0xED, + 0xED,0xEE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEF, + 0xEE,0xEE,0xD8,0x87,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xCD,0xDD,0xEE,0xEE,0xEE, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xEE,0xDD,0xDC,0xBB,0xAA,0x99,0x98,0x88,0xDB,0xBE,0xEE,0xFE,0xEE,0xEE,0xFE, + 0xFE,0xEE,0xEE,0xDD,0xDD,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xED,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDD,0xCD,0xDD,0xDD,0xDE, + 0xEE,0xDE,0xDE,0xDE,0xDE,0xDE,0xED,0xED,0xED,0xED,0xEE,0xDE,0xEE,0xED,0xED,0xED, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE, + 0xEE,0xEA,0x87,0x88,0x88,0x89,0x99,0xAA,0xAB,0xBB,0xCC,0xDD,0xDD,0xEE,0xEE,0xFE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF, + 0xEE,0xEE,0xED,0xDC,0xCB,0xBA,0xA9,0x99,0x88,0x8D,0xBD,0xEE,0xEF,0xEF,0xEE,0xEE, + 0xEE,0xEE,0xFE,0xED,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEE,0xEE,0xEE, + 0xED,0xDD,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xCD,0xDD,0xED, + 0xED,0xEE,0xDE,0xED,0xED,0xED,0xED,0xEE,0xDE,0xDE,0xDE,0xED,0xED,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xEF,0xEE,0xFE,0xFE,0xFE,0xEF,0xEE, + 0xEA,0x88,0x78,0x88,0x89,0x99,0x9A,0xAA,0xBB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEF,0xEE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xFE,0xFE,0xEE,0xDD,0xCB,0xBB,0xAA,0x99,0x98,0x89,0xDA,0xDE,0xEE,0xEE,0xEE,0xEE, + 0xEF,0xEE,0xEE,0xEE,0xCD,0xDD,0xED,0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEE, + 0xEE,0xED,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDC,0xDD,0xDD,0xDE, + 0xEE,0xED,0xEE,0xDE,0xDE,0xDE,0xDE,0xDD,0xED,0xED,0xED,0xEE,0xEE,0xED,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEE,0xEE, + 0x88,0x78,0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBC,0xBD,0xDD,0xDE,0xEF,0xEE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xEF,0xEE,0xEE,0xDD,0xDC,0xBB,0xAA,0xA9,0x98,0x88,0x9D,0xBD,0xEE,0xFE,0xFE,0xFE, + 0xFE,0xEF,0xEE,0xEE,0xEC,0xDD,0xDE,0xDE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xDE,0xDD,0xDD,0xDD,0xDD,0xED, + 0xED,0xED,0xED,0xED,0xEE,0xDE,0xED,0xEE,0xDE,0xED,0xEE,0xDE,0xDE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEE,0xEE,0xC8, + 0x87,0x88,0x88,0x99,0x99,0xAA,0xAB,0xBB,0xCC,0xDD,0xDE,0xEE,0xEE,0xEF,0xEF,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFE,0xEE,0xED,0xDD,0xCB,0xBA,0xA9,0x99,0x88,0x8A,0xDA,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDE,0xDD,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xED,0xDD,0xDD,0xDD,0xDE,0xDE, + 0xEE,0xEE,0xEE,0xEE,0xED,0xED,0xED,0xED,0xED,0xEE,0xED,0xEE,0xEE,0xEE,0xEE,0xEE, + 0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xEE,0xFE,0xE9,0x87, + 0x88,0x88,0x88,0x99,0x9A,0xAA,0xAB,0xBC,0xCD,0xDD,0xEE,0xEE,0xEE,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF +}; + +const uint32_t PokeMini_BG6_PalRGB32[] = { + 0x00101010,0x00606058,0x00787878,0x00808080, + 0x00989880,0x00A0A090,0x00A8A898,0x00B0B0A0, + 0x00C0C0B8,0x00C8C8C0,0x00D0D0C8,0x00D8D8D0, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint32_t PokeMini_BG6_PalBGR32[] = { + 0x00101010,0x00586060,0x00787878,0x00808080, + 0x00809898,0x0090A0A0,0x0098A8A8,0x00A0B0B0, + 0x00B8C0C0,0x00C0C8C8,0x00C8D0D0,0x00D0D8D8, + 0x00D8D8D8,0x00E0E0E0,0x00E8E8E8,0x00F8F8F8 +}; + +const uint16_t PokeMini_BG6_PalRGB16[] = { + 0x1082,0x630B,0x7BCF,0x8410,0x9CD0,0xA512,0xAD53,0xB594, + 0xC617,0xCE58,0xD699,0xDEDA,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG6_PalBGR16[] = { + 0x1082,0x5B0C,0x7BCF,0x8410,0x84D3,0x9514,0x9D55,0xA596, + 0xBE18,0xC659,0xCE9A,0xD6DB,0xDEDB,0xE71C,0xEF5D,0xFFDF +}; + +const uint16_t PokeMini_BG6_PalRGB15[] = { + 0x8842,0xB18B,0xBDEF,0xC210,0xCE70,0xD292,0xD6B3,0xDAD4, + 0xE317,0xE738,0xEB59,0xEF7A,0xEF7B,0xF39C,0xF7BD,0xFFFF +}; + diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG6.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG6.h new file mode 100644 index 0000000000..0c84dc2dc6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_BG6.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_BG_X6 +#define POKEMINI_BG_X6 + +#include + +// PokeMini Background Image +// 576 x 384 (6x6) - 4bpp (LSn Left pixel) +extern const uint8_t PokeMini_BG6[]; + +// PokeMini Background Palette (RGBX8888) +extern const uint32_t PokeMini_BG6_PalRGB32[]; + +// PokeMini Background Palette (BGRX8888) +extern const uint32_t PokeMini_BG6_PalBGR32[]; + +// PokeMini Background Palette (RGB565) +extern const uint16_t PokeMini_BG6_PalRGB16[]; + +// PokeMini Background Palette (BGR565) +extern const uint16_t PokeMini_BG6_PalBGR16[]; + +// PokeMini Background Palette (RGB555) +extern const uint16_t PokeMini_BG6_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_ColorPal.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_ColorPal.c new file mode 100644 index 0000000000..8a1745a40f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_ColorPal.c @@ -0,0 +1,194 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint32_t PokeMini_ColorPalRGB32[] = { + 0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF, + 0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF, + 0x00FCFCFC,0x00F9F9FF,0x00F9FCFF,0x00F9FDFF,0x00F9FFFF,0x00F9FFFD,0x00F9FFF9,0x00FDFFF9, + 0x00FFFFF9,0x00FFFDF9,0x00FFFCF9,0x00FFF9F9,0x00FFF9FD,0x00FFF9FF,0x00FDF9FF,0x00FCF9FF, + 0x00F4F4F4,0x00EAEAFF,0x00EAF4FF,0x00EAF9FF,0x00EAFFFF,0x00EAFFF7,0x00EAFFEA,0x00F9FFEA, + 0x00FFFFEA,0x00FFF9EA,0x00FFF4EA,0x00FFEAEA,0x00FFEAF9,0x00FFEAFF,0x00F9EAFF,0x00F4EAFF, + 0x00E7E7E7,0x00D0D0FF,0x00D0E7FF,0x00D0F3FF,0x00D0FFFF,0x00D0FFED,0x00D0FFD0,0x00F3FFD0, + 0x00FFFFD0,0x00FFF3D0,0x00FFE7D0,0x00FFD0D0,0x00FFD0F3,0x00FFD0FF,0x00F3D0FF,0x00E7D0FF, + 0x00D5D5D5,0x00ACACFF,0x00ACD5FF,0x00ACEAFF,0x00ACFFFF,0x00ACFFDF,0x00ACFFAC,0x00EAFFAC, + 0x00FFFFAC,0x00FFEAAC,0x00FFD5AC,0x00FFACAC,0x00FFACEA,0x00FFACFF,0x00EAACFF,0x00D5ACFF, + 0x00BEBEBE,0x007D7DFF,0x007DBEFF,0x007DDEFF,0x007DFFFF,0x007DFFCE,0x007DFF7D,0x00DEFF7D, + 0x00FFFF7D,0x00FFDE7D,0x00FFBE7D,0x00FF7D7D,0x00FF7DDE,0x00FF7DFF,0x00DE7DFF,0x00BE7DFF, + 0x00A1A1A1,0x004444FF,0x0044A1FF,0x0044D0FF,0x0044FFFF,0x0044FFB8,0x0044FF44,0x00D0FF44, + 0x00FFFF44,0x00FFD044,0x00FFA144,0x00FF4444,0x00FF44D0,0x00FF44FF,0x00D044FF,0x00A144FF, + 0x00808080,0x000000FF,0x000080FF,0x0000C0FF,0x0000FFFF,0x0000FFA0,0x0000FF00,0x00C0FF00, + 0x00FFFF00,0x00FFC000,0x00FF8000,0x00FF0000,0x00FF00C0,0x00FF00FF,0x00C000FF,0x008000FF, + 0x006F6F6F,0x000000DF,0x00006FDF,0x0000A7DF,0x0000DFDF,0x0000DF8B,0x0000DF00,0x00A7DF00, + 0x00DFDF00,0x00DFA700,0x00DF6F00,0x00DF0000,0x00DF00A7,0x00DF00DF,0x00A700DF,0x006F00DF, + 0x005F5F5F,0x000000BF,0x00005FBF,0x00008FBF,0x0000BFBF,0x0000BF77,0x0000BF00,0x008FBF00, + 0x00BFBF00,0x00BF8F00,0x00BF5F00,0x00BF0000,0x00BF008F,0x00BF00BF,0x008F00BF,0x005F00BF, + 0x004F4F4F,0x0000009F,0x00004F9F,0x0000779F,0x00009F9F,0x00009F63,0x00009F00,0x00779F00, + 0x009F9F00,0x009F7700,0x009F4F00,0x009F0000,0x009F0077,0x009F009F,0x0077009F,0x004F009F, + 0x003F3F3F,0x0000007F,0x00003F7F,0x00005F7F,0x00007F7F,0x00007F4F,0x00007F00,0x005F7F00, + 0x007F7F00,0x007F5F00,0x007F3F00,0x007F0000,0x007F005F,0x007F007F,0x005F007F,0x003F007F, + 0x002F2F2F,0x0000005F,0x00002F5F,0x0000475F,0x00005F5F,0x00005F3B,0x00005F00,0x00475F00, + 0x005F5F00,0x005F4700,0x005F2F00,0x005F0000,0x005F0047,0x005F005F,0x0047005F,0x002F005F, + 0x001F1F1F,0x0000003F,0x00001F3F,0x00002F3F,0x00003F3F,0x00003F27,0x00003F00,0x002F3F00, + 0x003F3F00,0x003F2F00,0x003F1F00,0x003F0000,0x003F002F,0x003F003F,0x002F003F,0x001F003F, + 0x000F0F0F,0x0000001F,0x00000F1F,0x0000171F,0x00001F1F,0x00001F13,0x00001F00,0x00171F00, + 0x001F1F00,0x001F1700,0x001F0F00,0x001F0000,0x001F0017,0x001F001F,0x0017001F,0x000F001F, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000 +}; + +const uint32_t PokeMini_ColorPalBGR32[] = { + 0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF, + 0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF,0x00FFFFFF, + 0x00FCFCFC,0x00FFF9F9,0x00FFFCF9,0x00FFFDF9,0x00FFFFF9,0x00FDFFF9,0x00F9FFF9,0x00F9FFFD, + 0x00F9FFFF,0x00F9FDFF,0x00F9FCFF,0x00F9F9FF,0x00FDF9FF,0x00FFF9FF,0x00FFF9FD,0x00FFF9FC, + 0x00F4F4F4,0x00FFEAEA,0x00FFF4EA,0x00FFF9EA,0x00FFFFEA,0x00F7FFEA,0x00EAFFEA,0x00EAFFF9, + 0x00EAFFFF,0x00EAF9FF,0x00EAF4FF,0x00EAEAFF,0x00F9EAFF,0x00FFEAFF,0x00FFEAF9,0x00FFEAF4, + 0x00E7E7E7,0x00FFD0D0,0x00FFE7D0,0x00FFF3D0,0x00FFFFD0,0x00EDFFD0,0x00D0FFD0,0x00D0FFF3, + 0x00D0FFFF,0x00D0F3FF,0x00D0E7FF,0x00D0D0FF,0x00F3D0FF,0x00FFD0FF,0x00FFD0F3,0x00FFD0E7, + 0x00D5D5D5,0x00FFACAC,0x00FFD5AC,0x00FFEAAC,0x00FFFFAC,0x00DFFFAC,0x00ACFFAC,0x00ACFFEA, + 0x00ACFFFF,0x00ACEAFF,0x00ACD5FF,0x00ACACFF,0x00EAACFF,0x00FFACFF,0x00FFACEA,0x00FFACD5, + 0x00BEBEBE,0x00FF7D7D,0x00FFBE7D,0x00FFDE7D,0x00FFFF7D,0x00CEFF7D,0x007DFF7D,0x007DFFDE, + 0x007DFFFF,0x007DDEFF,0x007DBEFF,0x007D7DFF,0x00DE7DFF,0x00FF7DFF,0x00FF7DDE,0x00FF7DBE, + 0x00A1A1A1,0x00FF4444,0x00FFA144,0x00FFD044,0x00FFFF44,0x00B8FF44,0x0044FF44,0x0044FFD0, + 0x0044FFFF,0x0044D0FF,0x0044A1FF,0x004444FF,0x00D044FF,0x00FF44FF,0x00FF44D0,0x00FF44A1, + 0x00808080,0x00FF0000,0x00FF8000,0x00FFC000,0x00FFFF00,0x00A0FF00,0x0000FF00,0x0000FFC0, + 0x0000FFFF,0x0000C0FF,0x000080FF,0x000000FF,0x00C000FF,0x00FF00FF,0x00FF00C0,0x00FF0080, + 0x006F6F6F,0x00DF0000,0x00DF6F00,0x00DFA700,0x00DFDF00,0x008BDF00,0x0000DF00,0x0000DFA7, + 0x0000DFDF,0x0000A7DF,0x00006FDF,0x000000DF,0x00A700DF,0x00DF00DF,0x00DF00A7,0x00DF006F, + 0x005F5F5F,0x00BF0000,0x00BF5F00,0x00BF8F00,0x00BFBF00,0x0077BF00,0x0000BF00,0x0000BF8F, + 0x0000BFBF,0x00008FBF,0x00005FBF,0x000000BF,0x008F00BF,0x00BF00BF,0x00BF008F,0x00BF005F, + 0x004F4F4F,0x009F0000,0x009F4F00,0x009F7700,0x009F9F00,0x00639F00,0x00009F00,0x00009F77, + 0x00009F9F,0x0000779F,0x00004F9F,0x0000009F,0x0077009F,0x009F009F,0x009F0077,0x009F004F, + 0x003F3F3F,0x007F0000,0x007F3F00,0x007F5F00,0x007F7F00,0x004F7F00,0x00007F00,0x00007F5F, + 0x00007F7F,0x00005F7F,0x00003F7F,0x0000007F,0x005F007F,0x007F007F,0x007F005F,0x007F003F, + 0x002F2F2F,0x005F0000,0x005F2F00,0x005F4700,0x005F5F00,0x003B5F00,0x00005F00,0x00005F47, + 0x00005F5F,0x0000475F,0x00002F5F,0x0000005F,0x0047005F,0x005F005F,0x005F0047,0x005F002F, + 0x001F1F1F,0x003F0000,0x003F1F00,0x003F2F00,0x003F3F00,0x00273F00,0x00003F00,0x00003F2F, + 0x00003F3F,0x00002F3F,0x00001F3F,0x0000003F,0x002F003F,0x003F003F,0x003F002F,0x003F001F, + 0x000F0F0F,0x001F0000,0x001F0F00,0x001F1700,0x001F1F00,0x00131F00,0x00001F00,0x00001F17, + 0x00001F1F,0x0000171F,0x00000F1F,0x0000001F,0x0017001F,0x001F001F,0x001F0017,0x001F000F, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, + 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000 +}; + +const uint16_t PokeMini_ColorPalRGB16[] = { + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xFFDF, + 0xF7BE,0xEF5F,0xEFBF,0xEFDF,0xEFFF,0xEFFE,0xEFFD,0xFFFD, + 0xFFFD,0xFFDD,0xFFBD,0xFF5D,0xFF5F,0xFF5F,0xFF5F,0xF75F, + 0xE73C,0xD69F,0xD73F,0xD79F,0xD7FF,0xD7FD,0xD7FA,0xF7FA, + 0xFFFA,0xFF9A,0xFF3A,0xFE9A,0xFE9E,0xFE9F,0xF69F,0xE69F, + 0xD6BA,0xAD7F,0xAEBF,0xAF5F,0xAFFF,0xAFFB,0xAFF5,0xEFF5, + 0xFFF5,0xFF55,0xFEB5,0xFD75,0xFD7D,0xFD7F,0xED7F,0xD57F, + 0xBDF7,0x7BFF,0x7DFF,0x7EFF,0x7FFF,0x7FF9,0x7FEF,0xDFEF, + 0xFFEF,0xFEEF,0xFDEF,0xFBEF,0xFBFB,0xFBFF,0xDBFF,0xBBFF, + 0xA514,0x423F,0x451F,0x469F,0x47FF,0x47F7,0x47E8,0xD7E8, + 0xFFE8,0xFE88,0xFD08,0xFA28,0xFA3A,0xFA3F,0xD23F,0xA23F, + 0x8410,0x001F,0x041F,0x061F,0x07FF,0x07F4,0x07E0,0xC7E0, + 0xFFE0,0xFE00,0xFC00,0xF800,0xF818,0xF81F,0xC01F,0x801F, + 0x6B6D,0x001B,0x037B,0x053B,0x06FB,0x06F1,0x06E0,0xA6E0, + 0xDEE0,0xDD20,0xDB60,0xD800,0xD814,0xD81B,0xA01B,0x681B, + 0x5AEB,0x0017,0x02F7,0x0477,0x05F7,0x05EE,0x05E0,0x8DE0, + 0xBDE0,0xBC60,0xBAE0,0xB800,0xB811,0xB817,0x8817,0x5817, + 0x4A69,0x0013,0x0273,0x03B3,0x04F3,0x04EC,0x04E0,0x74E0, + 0x9CE0,0x9BA0,0x9A60,0x9800,0x980E,0x9813,0x7013,0x4813, + 0x39E7,0x000F,0x01EF,0x02EF,0x03EF,0x03E9,0x03E0,0x5BE0, + 0x7BE0,0x7AE0,0x79E0,0x7800,0x780B,0x780F,0x580F,0x380F, + 0x2965,0x000B,0x016B,0x022B,0x02EB,0x02E7,0x02E0,0x42E0, + 0x5AE0,0x5A20,0x5960,0x5800,0x5808,0x580B,0x400B,0x280B, + 0x18E3,0x0007,0x00E7,0x0167,0x01E7,0x01E4,0x01E0,0x29E0, + 0x39E0,0x3960,0x38E0,0x3800,0x3805,0x3807,0x2807,0x1807, + 0x0861,0x0003,0x0063,0x00A3,0x00E3,0x00E2,0x00E0,0x10E0, + 0x18E0,0x18A0,0x1860,0x1800,0x1802,0x1803,0x1003,0x0803, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +}; + +const uint16_t PokeMini_ColorPalBGR16[] = { + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xFFDF, + 0xF7BE,0xFF5D,0xFFBD,0xFFDD,0xFFFD,0xF7FD,0xEFFD,0xEFFF, + 0xEFFF,0xEFDF,0xEFBF,0xEF5F,0xFF5F,0xFF5F,0xFF5F,0xFF5E, + 0xE73C,0xFE9A,0xFF3A,0xFF9A,0xFFFA,0xEFFA,0xD7FA,0xD7FE, + 0xD7FF,0xD79F,0xD73F,0xD69F,0xF69F,0xFE9F,0xFE9E,0xFE9C, + 0xD6BA,0xFD75,0xFEB5,0xFF55,0xFFF5,0xDFF5,0xAFF5,0xAFFD, + 0xAFFF,0xAF5F,0xAEBF,0xAD7F,0xED7F,0xFD7F,0xFD7D,0xFD7A, + 0xBDF7,0xFBEF,0xFDEF,0xFEEF,0xFFEF,0xCFEF,0x7FEF,0x7FFB, + 0x7FFF,0x7EFF,0x7DFF,0x7BFF,0xDBFF,0xFBFF,0xFBFB,0xFBF7, + 0xA514,0xFA28,0xFD08,0xFE88,0xFFE8,0xBFE8,0x47E8,0x47FA, + 0x47FF,0x469F,0x451F,0x423F,0xD23F,0xFA3F,0xFA3A,0xFA34, + 0x8410,0xF800,0xFC00,0xFE00,0xFFE0,0xA7E0,0x07E0,0x07F8, + 0x07FF,0x061F,0x041F,0x001F,0xC01F,0xF81F,0xF818,0xF810, + 0x6B6D,0xD800,0xDB60,0xDD20,0xDEE0,0x8EE0,0x06E0,0x06F4, + 0x06FB,0x053B,0x037B,0x001B,0xA01B,0xD81B,0xD814,0xD80D, + 0x5AEB,0xB800,0xBAE0,0xBC60,0xBDE0,0x75E0,0x05E0,0x05F1, + 0x05F7,0x0477,0x02F7,0x0017,0x8817,0xB817,0xB811,0xB80B, + 0x4A69,0x9800,0x9A60,0x9BA0,0x9CE0,0x64E0,0x04E0,0x04EE, + 0x04F3,0x03B3,0x0273,0x0013,0x7013,0x9813,0x980E,0x9809, + 0x39E7,0x7800,0x79E0,0x7AE0,0x7BE0,0x4BE0,0x03E0,0x03EB, + 0x03EF,0x02EF,0x01EF,0x000F,0x580F,0x780F,0x780B,0x7807, + 0x2965,0x5800,0x5960,0x5A20,0x5AE0,0x3AE0,0x02E0,0x02E8, + 0x02EB,0x022B,0x016B,0x000B,0x400B,0x580B,0x5808,0x5805, + 0x18E3,0x3800,0x38E0,0x3960,0x39E0,0x21E0,0x01E0,0x01E5, + 0x01E7,0x0167,0x00E7,0x0007,0x2807,0x3807,0x3805,0x3803, + 0x0861,0x1800,0x1860,0x18A0,0x18E0,0x10E0,0x00E0,0x00E2, + 0x00E3,0x00A3,0x0063,0x0003,0x1003,0x1803,0x1802,0x1801, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 +}; + +const uint16_t PokeMini_ColorPalRGB15[] = { + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF, + 0xFBDE,0xF7BF,0xF7DF,0xF7FF,0xF7FF,0xF7FE,0xF7FD,0xFFFD, + 0xFFFD,0xFFFD,0xFFDD,0xFFBD,0xFFBF,0xFFBF,0xFFBF,0xFBBF, + 0xF39C,0xEB5F,0xEB9F,0xEBDF,0xEBFF,0xEBFD,0xEBFA,0xFBFA, + 0xFFFA,0xFFDA,0xFF9A,0xFF5A,0xFF5E,0xFF5F,0xFB5F,0xF35F, + 0xEB5A,0xD6BF,0xD75F,0xD7BF,0xD7FF,0xD7FB,0xD7F5,0xF7F5, + 0xFFF5,0xFFB5,0xFF55,0xFEB5,0xFEBD,0xFEBF,0xF6BF,0xEABF, + 0xDEF7,0xBDFF,0xBEFF,0xBF7F,0xBFFF,0xBFF9,0xBFEF,0xEFEF, + 0xFFEF,0xFF6F,0xFEEF,0xFDEF,0xFDFB,0xFDFF,0xEDFF,0xDDFF, + 0xD294,0xA11F,0xA29F,0xA35F,0xA3FF,0xA3F7,0xA3E8,0xEBE8, + 0xFFE8,0xFF48,0xFE88,0xFD08,0xFD1A,0xFD1F,0xE91F,0xD11F, + 0xC210,0x801F,0x821F,0x831F,0x83FF,0x83F4,0x83E0,0xE3E0, + 0xFFE0,0xFF00,0xFE00,0xFC00,0xFC18,0xFC1F,0xE01F,0xC01F, + 0xB5AD,0x801B,0x81BB,0x829B,0x837B,0x8371,0x8360,0xD360, + 0xEF60,0xEE80,0xEDA0,0xEC00,0xEC14,0xEC1B,0xD01B,0xB41B, + 0xAD6B,0x8017,0x8177,0x8237,0x82F7,0x82EE,0x82E0,0xC6E0, + 0xDEE0,0xDE20,0xDD60,0xDC00,0xDC11,0xDC17,0xC417,0xAC17, + 0xA529,0x8013,0x8133,0x81D3,0x8273,0x826C,0x8260,0xBA60, + 0xCE60,0xCDC0,0xCD20,0xCC00,0xCC0E,0xCC13,0xB813,0xA413, + 0x9CE7,0x800F,0x80EF,0x816F,0x81EF,0x81E9,0x81E0,0xADE0, + 0xBDE0,0xBD60,0xBCE0,0xBC00,0xBC0B,0xBC0F,0xAC0F,0x9C0F, + 0x94A5,0x800B,0x80AB,0x810B,0x816B,0x8167,0x8160,0xA160, + 0xAD60,0xAD00,0xACA0,0xAC00,0xAC08,0xAC0B,0xA00B,0x940B, + 0x8C63,0x8007,0x8067,0x80A7,0x80E7,0x80E4,0x80E0,0x94E0, + 0x9CE0,0x9CA0,0x9C60,0x9C00,0x9C05,0x9C07,0x9407,0x8C07, + 0x8421,0x8003,0x8023,0x8043,0x8063,0x8062,0x8060,0x8860, + 0x8C60,0x8C40,0x8C20,0x8C00,0x8C02,0x8C03,0x8803,0x8403, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000, + 0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000 +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_ColorPal.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_ColorPal.h new file mode 100644 index 0000000000..17cbeadce1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_ColorPal.h @@ -0,0 +1,39 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_COLORPAL +#define POKEMINI_COLORPAL + +#include + +// PokeMini Unofficial Color Palette (RGBX8888) +extern const uint32_t PokeMini_ColorPalRGB32[]; + +// PokeMini Unofficial Color Palette (BGRX8888) +extern const uint32_t PokeMini_ColorPalBGR32[]; + +// PokeMini Unofficial Color Palette (RGB565) +extern const uint16_t PokeMini_ColorPalRGB16[]; + +// PokeMini Unofficial Color Palette (BGR565) +extern const uint16_t PokeMini_ColorPalBGR16[]; + +// PokeMini Unofficial Color Palette (RGB555) +extern const uint16_t PokeMini_ColorPalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Font12.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Font12.c new file mode 100644 index 0000000000..645c0ce555 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Font12.c @@ -0,0 +1,512 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_Font12[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x11,0x11, + 0x11,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x55,0x11,0x00,0x00,0x11, + 0x11,0x01,0x11,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x10,0x00, + 0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x11, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xDD,0x10,0x00,0x00,0x01,0x5E,0x9B, + 0xF5,0x00,0x00,0x00,0x19,0x77,0x91,0x00,0x00,0x00,0x15,0xBF,0x51,0x10,0x01,0x59, + 0x95,0x11,0x97,0x10,0x00,0x01,0x1B,0xDD,0x71,0x00,0x00,0x00,0x11,0xDE,0x10,0x00, + 0x00,0x00,0x17,0xFB,0x10,0x00,0x00,0x00,0x1D,0xF5,0x10,0x00,0x00,0x15,0xD5,0xB5, + 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x9D,0x50,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xFD,0x10,0x00,0x00,0x11,0xEF,0x7F, + 0xB1,0x00,0x00,0x01,0x5F,0x9E,0xD1,0x00,0x00,0x01,0x7F,0xFF,0xFB,0x10,0x15,0xFF, + 0xFD,0x19,0xF5,0x10,0x00,0x01,0xEF,0xFF,0xF1,0x00,0x00,0x00,0x1B,0xF7,0x10,0x00, + 0x00,0x01,0x5F,0xE1,0x10,0x00,0x00,0x00,0x19,0xF7,0x10,0x00,0x00,0x17,0xFE,0xE1, + 0x10,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0xFD,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1D,0xF9,0x10,0x00,0x00,0x19,0xFB,0xEF, + 0x51,0x00,0x00,0x17,0xDF,0xDF,0xD5,0x10,0x00,0x11,0xFF,0xEB,0xE5,0x10,0x1D,0xFD, + 0xFF,0x5F,0x91,0x10,0x00,0x01,0xFF,0xBF,0xF5,0x11,0x00,0x01,0x5F,0xF1,0x00,0x00, + 0x00,0x01,0xBF,0x71,0x00,0x00,0x00,0x00,0x17,0xF9,0x10,0x00,0x01,0x7F,0xFF,0xEE, + 0x10,0x00,0x00,0x00,0x1D,0xD1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xF5,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF5,0x10,0x00,0x00,0x1D,0xD9,0xDD, + 0x10,0x00,0x00,0x1D,0xFF,0xFF,0xF1,0x10,0x00,0x15,0xFF,0xF7,0x11,0x00,0x1D,0xFB, + 0xFE,0xED,0x55,0x11,0x00,0x11,0xEF,0xFF,0xD9,0x91,0x00,0x01,0x9D,0x91,0x00,0x00, + 0x00,0x01,0xFF,0x11,0x00,0x00,0x00,0x00,0x15,0xF9,0x10,0x00,0x01,0x5D,0xFF,0xB7, + 0x10,0x00,0x00,0x11,0x1D,0xD1,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0xE1,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x1F,0xF1,0x00,0x00,0x00,0x11,0x11,0x11, + 0x10,0x00,0x01,0x11,0xF9,0xED,0x11,0x00,0x00,0x01,0xBF,0xFF,0x51,0x00,0x1B,0xFF, + 0xFE,0xFE,0xFF,0xE1,0x00,0x1B,0xFF,0xFB,0xBF,0xD1,0x00,0x01,0x11,0x11,0x00,0x00, + 0x00,0x15,0xFD,0x10,0x00,0x00,0x00,0x00,0x19,0xF9,0x10,0x00,0x00,0x1E,0xDE,0xE1, + 0x00,0x00,0x01,0x59,0x9E,0xE9,0x95,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17, + 0x99,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7F,0x71,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x5D,0xB1,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x9F,0xFF,0xFF,0x91,0x00,0x00,0x11,0x17,0xFF,0xE1,0x10,0x11,0x99, + 0x9F,0xDF,0xFE,0xF5,0x01,0x7F,0xFD,0xFF,0xFF,0x51,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x15,0xFB,0x10,0x00,0x00,0x00,0x00,0x1B,0xF7,0x10,0x00,0x00,0x15,0x55,0x11, + 0x00,0x00,0x01,0x5F,0xFF,0xFF,0xF5,0x10,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x1E, + 0xFF,0xB1,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x01,0xEF,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x5E,0x51,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x7E,0xED,0xF9,0x51,0x00,0x00,0x1B,0xD9,0xEF,0xF5,0x10,0x01,0x11, + 0xFB,0x9F,0xBF,0xF5,0x01,0x9F,0xF9,0xFF,0xFB,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x15,0xF9,0x10,0x00,0x00,0x00,0x00,0x1E,0xF5,0x10,0x00,0x00,0x01,0x11,0x10, + 0x00,0x00,0x00,0x11,0x1D,0xD1,0x11,0x00,0x00,0x00,0x1E,0xF9,0x10,0x00,0x00,0x15, + 0x55,0x51,0x00,0x00,0x00,0x01,0x5F,0x51,0x00,0x00,0x00,0x15,0xF9,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xEF,0xB1,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x1F,0xBE,0xD1,0x10,0x00,0x00,0x1F,0xFF,0xFF,0xB1,0x00,0x00,0x1D, + 0xE1,0x9F,0xFF,0xD1,0x01,0x7F,0xFF,0xFF,0xFB,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x15,0xF9,0x10,0x00,0x00,0x00,0x01,0x5F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1D,0xD1,0x00,0x00,0x00,0x01,0x7F,0xF1,0x10,0x00,0x00,0x01, + 0x11,0x10,0x00,0x00,0x00,0x01,0xEF,0xB1,0x00,0x00,0x00,0x1D,0xF1,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x5B,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x59,0x59,0x51,0x00,0x00,0x00,0x11,0x9F,0xD7,0x11,0x00,0x01,0x5D, + 0x51,0x1B,0xDB,0x11,0x00,0x17,0xDD,0xB7,0x99,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x15,0xFB,0x10,0x00,0x00,0x00,0x01,0xDF,0x71,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x17,0x71,0x00,0x00,0x00,0x01,0xDF,0x71,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x5B,0x11,0x00,0x00,0x00,0x5F,0xB1,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x5D,0x51,0x00,0x00,0x00,0x11, + 0x10,0x11,0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0xFE,0x10,0x00,0x00,0x00,0x07,0xFB,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x05,0xFD,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x11,0x11, + 0x00,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00, + 0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x11,0x00, + 0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x10,0x00, + 0x00,0x01,0x59,0x95,0x10,0x00,0x00,0x01,0x11,0x79,0x51,0x00,0x00,0x11,0x57,0x97, + 0x11,0x00,0x00,0x01,0x17,0x99,0x51,0x00,0x00,0x00,0x01,0x79,0x95,0x10,0x00,0x01, + 0x79,0x99,0x95,0x10,0x00,0x01,0x15,0x99,0x51,0x00,0x00,0x01,0x99,0x99,0x97,0x10, + 0x00,0x01,0x59,0x99,0x11,0x00,0x00,0x11,0x59,0x95,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xBD,0xDB,0x11,0x00, + 0x00,0x15,0xFF,0xFF,0x71,0x00,0x00,0x01,0x9F,0xFF,0x71,0x00,0x00,0x19,0xFF,0xFF, + 0xB1,0x00,0x00,0x01,0xDF,0xFF,0xF5,0x10,0x00,0x00,0x15,0xFF,0xF5,0x10,0x00,0x01, + 0xEF,0xFF,0xF1,0x00,0x00,0x11,0xBF,0xFF,0x71,0x00,0x00,0x15,0xFF,0xFF,0xFD,0x10, + 0x00,0x15,0xFF,0xFF,0xE1,0x00,0x00,0x1B,0xFF,0xFF,0x71,0x00,0x00,0x00,0x01,0x10, + 0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x91,0x00, + 0x00,0x1E,0xFB,0xFF,0xD1,0x00,0x00,0x01,0xDF,0xFF,0x51,0x00,0x00,0x15,0xDB,0xFF, + 0xF1,0x00,0x00,0x01,0x7B,0xDF,0xF9,0x10,0x00,0x01,0x1F,0xFF,0xF1,0x00,0x00,0x15, + 0xFF,0x99,0x71,0x00,0x00,0x1D,0xFF,0xB9,0x51,0x00,0x00,0x15,0x99,0xDF,0xF7,0x10, + 0x00,0x1D,0xFF,0xDF,0xF1,0x00,0x01,0x5F,0xFE,0xFF,0xD1,0x00,0x00,0x00,0x17,0x71, + 0x00,0x00,0x00,0x00,0x11,0x91,0x10,0x00,0x00,0x00,0x11,0x19,0xE1,0x00,0x00,0x11, + 0x11,0x11,0x11,0x00,0x01,0xDB,0x51,0x10,0x00,0x00,0x00,0x01,0x57,0xFF,0x51,0x00, + 0x01,0x7F,0xF5,0xBF,0xD1,0x00,0x00,0x01,0x57,0xFF,0x10,0x00,0x00,0x01,0x11,0xBF, + 0xE1,0x00,0x00,0x00,0x19,0xFF,0xB1,0x10,0x00,0x11,0xDF,0xDF,0xD1,0x00,0x00,0x17, + 0xFF,0xD7,0x10,0x00,0x01,0x5F,0xFE,0xEB,0x10,0x00,0x00,0x01,0x11,0xEF,0xD1,0x00, + 0x00,0x19,0xFF,0xEF,0x91,0x00,0x01,0x9F,0xF5,0xBF,0xD1,0x00,0x00,0x01,0x7F,0xF5, + 0x10,0x00,0x00,0x00,0x1E,0xF9,0x10,0x00,0x00,0x11,0x5B,0xFF,0xE1,0x00,0x01,0x5D, + 0xDD,0xDD,0xD5,0x10,0x01,0xBF,0xFD,0x51,0x10,0x00,0x00,0x00,0x1E,0xFB,0x10,0x00, + 0x01,0x9F,0xE1,0xDF,0xD1,0x00,0x00,0x00,0x19,0xFD,0x10,0x00,0x00,0x01,0x17,0xFF, + 0x91,0x00,0x00,0x00,0x1F,0xFF,0x11,0x00,0x00,0x19,0xFD,0xBF,0xB1,0x00,0x00,0x1B, + 0xFF,0xFF,0x51,0x00,0x01,0xBF,0xFF,0xFF,0x71,0x00,0x00,0x00,0x19,0xFF,0x11,0x00, + 0x00,0x17,0xFF,0xFF,0x11,0x00,0x01,0x7F,0xFF,0xFF,0xD1,0x00,0x00,0x01,0x1E,0x71, + 0x00,0x00,0x00,0x00,0x17,0xE1,0x10,0x00,0x01,0x5D,0xFF,0xD7,0x11,0x00,0x01,0x5D, + 0xDD,0xDD,0xD5,0x10,0x01,0x15,0xBF,0xFE,0x51,0x00,0x00,0x01,0x7F,0xF5,0x10,0x00, + 0x01,0xDF,0xD1,0xEF,0x91,0x00,0x00,0x00,0x1D,0xFB,0x10,0x00,0x00,0x11,0x9F,0xFB, + 0x11,0x00,0x00,0x01,0x15,0xDF,0xE1,0x00,0x01,0x1F,0xFF,0xFF,0xF5,0x10,0x00,0x11, + 0x15,0xFF,0x91,0x00,0x01,0xDF,0xD5,0xFF,0x91,0x00,0x00,0x01,0x5F,0xF7,0x10,0x00, + 0x01,0x7F,0xFD,0xFF,0x91,0x00,0x00,0x1B,0xFF,0xFF,0x91,0x00,0x00,0x00,0x11,0x10, + 0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x01,0x5F,0xFB,0x11,0x10,0x00,0x01,0x15, + 0x55,0x55,0x51,0x10,0x00,0x11,0x19,0xFF,0x91,0x00,0x00,0x01,0xBD,0x91,0x00,0x00, + 0x01,0xBF,0xF9,0xFF,0x51,0x00,0x00,0x00,0x1E,0xF7,0x10,0x00,0x01,0x1D,0xFF,0xB5, + 0x11,0x00,0x00,0x17,0x97,0xEF,0xF5,0x10,0x01,0x5D,0xDD,0xFF,0xE1,0x10,0x01,0x59, + 0x7D,0xFF,0x91,0x00,0x01,0xDF,0xFB,0xFF,0x71,0x00,0x00,0x11,0xEF,0xD1,0x00,0x00, + 0x01,0x9F,0xF7,0xFF,0xD1,0x00,0x01,0x15,0x9F,0xFF,0x11,0x00,0x00,0x01,0x7E,0x11, + 0x00,0x00,0x00,0x01,0x7F,0xF1,0x00,0x00,0x00,0x17,0xDF,0xFB,0x51,0x00,0x01,0x7F, + 0xFF,0xFF,0xF7,0x10,0x01,0x5B,0xFF,0xE9,0x11,0x00,0x00,0x01,0xBB,0x11,0x00,0x00, + 0x01,0x7F,0xFF,0xF9,0x10,0x00,0x00,0x01,0x1F,0xF5,0x10,0x00,0x01,0xBF,0xFF,0xFF, + 0x51,0x00,0x00,0x1E,0xFF,0xFF,0xB1,0x00,0x00,0x11,0x15,0xFF,0x11,0x00,0x01,0x9F, + 0xFF,0xFE,0x11,0x00,0x01,0x7F,0xFF,0xFE,0x11,0x00,0x00,0x1B,0xFF,0x51,0x00,0x00, + 0x01,0x7F,0xFF,0xFF,0x71,0x00,0x01,0x7F,0xFF,0xF5,0x10,0x00,0x00,0x15,0xFF,0x71, + 0x00,0x00,0x00,0x01,0xEF,0x91,0x00,0x00,0x00,0x01,0x15,0xBF,0xF1,0x00,0x01,0x15, + 0x55,0x55,0x51,0x10,0x01,0xDF,0xD7,0x11,0x10,0x00,0x00,0x05,0xFF,0x51,0x00,0x00, + 0x00,0x19,0xDD,0x71,0x10,0x00,0x00,0x01,0x59,0x91,0x00,0x00,0x01,0x79,0x99,0x99, + 0x11,0x00,0x00,0x19,0xDD,0xD7,0x11,0x00,0x00,0x00,0x15,0x99,0x10,0x00,0x01,0x5D, + 0xDD,0x91,0x10,0x00,0x00,0x17,0xDD,0x91,0x10,0x00,0x01,0x19,0x97,0x10,0x00,0x00, + 0x00,0x17,0xDD,0xB5,0x10,0x00,0x01,0x7D,0xD9,0x11,0x00,0x00,0x00,0x01,0x77,0x10, + 0x00,0x00,0x00,0x15,0xFE,0x11,0x00,0x00,0x00,0x00,0x01,0x15,0x91,0x00,0x00,0x11, + 0x11,0x11,0x11,0x00,0x01,0x75,0x11,0x00,0x00,0x00,0x00,0x01,0xB5,0x10,0x00,0x00, + 0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x11,0x11,0x11, + 0x10,0x00,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x11, + 0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00, + 0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x00,0x00,0x11,0x00, + 0x00,0x00,0x00,0x1B,0xF5,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x01,0x11,0x11, + 0x11,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x01, + 0x11,0x11,0x11,0x00,0x00,0x01,0x11,0x11,0x11,0x00,0x00,0x00,0x11,0x11,0x11,0x00, + 0x00,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x11, + 0x11,0x00,0x00,0x11,0x11,0x11,0x11,0x10,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x11, + 0x11,0x11,0x11,0x11,0x00,0x01,0x11,0x11,0x11,0x10,0x00,0x01,0x11,0x11,0x10,0x00, + 0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x00,0x01,0x9D,0xD7,0x10,0x00,0x01,0x9D,0xDB, + 0x91,0x10,0x00,0x01,0x5B,0xDD,0xD5,0x10,0x00,0x15,0xDD,0xDB,0x51,0x10,0x00,0x15, + 0xDD,0xDD,0xD1,0x00,0x00,0x01,0xDD,0xDD,0xD7,0x10,0x00,0x01,0x19,0xDD,0xDB,0x50, + 0x01,0x7D,0xD1,0x1B,0xD7,0x10,0x00,0x00,0x15,0xDD,0x10,0x00,0x00,0x00,0x01,0x5D, + 0xD1,0x00,0x00,0x1D,0xD7,0x1D,0xDD,0x10,0x00,0x01,0x7D,0xB1,0x00,0x00,0x01,0x5D, + 0xDD,0x11,0xDD,0xD5,0x00,0x17,0xDD,0x51,0xBD,0x71,0x00,0x15,0xBD,0xDB,0x51,0x00, + 0x00,0x15,0x9D,0xD9,0x11,0x00,0x00,0x00,0x15,0xFF,0xF9,0x10,0x00,0x01,0xFF,0xFF, + 0xF9,0x10,0x00,0x15,0xFF,0xFF,0xF5,0x10,0x00,0x1D,0xFF,0xFF,0xF9,0x10,0x00,0x19, + 0xFF,0xFF,0xE1,0x00,0x00,0x11,0xFF,0xFF,0xF7,0x10,0x00,0x15,0xFF,0xFF,0xFF,0x10, + 0x01,0xBF,0xD1,0x1F,0xF9,0x10,0x00,0x00,0x19,0xFE,0x10,0x00,0x00,0x00,0x01,0x9F, + 0xF1,0x00,0x00,0x1F,0xF5,0xDF,0xF5,0x10,0x00,0x01,0xBF,0xD1,0x00,0x00,0x01,0x9F, + 0xFF,0x17,0xFF,0xF1,0x00,0x1D,0xFF,0xB1,0xFF,0x51,0x01,0x5F,0xFF,0xFF,0xF1,0x10, + 0x01,0x5F,0xD7,0x9E,0xF5,0x10,0x00,0x00,0x1B,0xFF,0xFB,0x10,0x00,0x15,0xFF,0x5F, + 0xFE,0x10,0x01,0x1F,0xFF,0x95,0x71,0x00,0x00,0x1F,0xFB,0x5E,0xFF,0x11,0x00,0x1D, + 0xFD,0x55,0x51,0x00,0x00,0x15,0xFF,0x55,0x51,0x10,0x01,0x1F,0xFF,0xB7,0x77,0x10, + 0x01,0xDF,0xB1,0x5F,0xF5,0x10,0x00,0x00,0x1B,0xFD,0x10,0x00,0x00,0x00,0x01,0xBF, + 0xD1,0x00,0x01,0x5F,0xF9,0xFF,0x51,0x00,0x00,0x01,0xEF,0x91,0x00,0x00,0x01,0xDF, + 0xFF,0x1E,0xFF,0xE1,0x00,0x1E,0xFF,0xE5,0xFF,0x11,0x01,0xEF,0xE7,0x9F,0xF9,0x10, + 0x11,0xF9,0x7D,0xD7,0xEB,0x10,0x00,0x01,0x5F,0xFB,0xFD,0x10,0x00,0x17,0xFF,0xEF, + 0xFB,0x10,0x01,0x9F,0xF5,0x11,0x10,0x00,0x01,0x1F,0xF5,0x17,0xFF,0x51,0x00,0x1E, + 0xFE,0xDD,0x51,0x00,0x00,0x19,0xFF,0x99,0x71,0x00,0x01,0x9F,0xF5,0x59,0x99,0x10, + 0x01,0xFF,0xED,0xEF,0xF1,0x00,0x00,0x00,0x1E,0xF9,0x10,0x00,0x00,0x00,0x01,0xEF, + 0x91,0x00,0x01,0x9F,0xFF,0xF7,0x10,0x00,0x00,0x01,0xFF,0x71,0x00,0x00,0x01,0xFF, + 0xEF,0x7F,0xFF,0xD1,0x01,0x1F,0xFE,0xF9,0xFF,0x10,0x17,0xFF,0x91,0x1F,0xF9,0x10, + 0x19,0xE5,0xFF,0xFD,0x9D,0x10,0x00,0x01,0x9F,0xD7,0xFD,0x10,0x00,0x1B,0xFF,0xFF, + 0xD1,0x10,0x01,0xDF,0xE1,0x00,0x00,0x00,0x01,0x5F,0xF1,0x1B,0xFF,0x51,0x00,0x1F, + 0xFF,0xFF,0x51,0x00,0x00,0x1B,0xFF,0xFF,0x91,0x00,0x01,0xDF,0xE1,0x9F,0xFE,0x10, + 0x15,0xFF,0xFF,0xFF,0xE1,0x00,0x00,0x00,0x1F,0xF7,0x10,0x00,0x00,0x00,0x01,0xFF, + 0x71,0x00,0x01,0xBF,0xFF,0xF5,0x10,0x00,0x00,0x15,0xFF,0x51,0x00,0x00,0x15,0xFF, + 0xDF,0xDF,0xDF,0xB1,0x01,0x5F,0xFD,0xFE,0xFD,0x10,0x19,0xFF,0x51,0x5F,0xF9,0x10, + 0x19,0xDD,0xF9,0xFB,0x9D,0x10,0x00,0x11,0xFF,0xFF,0xFF,0x10,0x00,0x1D,0xFB,0xBF, + 0xF7,0x10,0x01,0xDF,0xE1,0x11,0x10,0x00,0x01,0x9F,0xE1,0x1E,0xFF,0x10,0x01,0x5F, + 0xF7,0x55,0x10,0x00,0x00,0x1E,0xFD,0x99,0x51,0x00,0x01,0xDF,0xE1,0x7E,0xFD,0x10, + 0x17,0xFF,0x99,0xEF,0xD1,0x00,0x00,0x01,0x5F,0xF5,0x10,0x00,0x00,0x01,0x15,0xFF, + 0x51,0x00,0x01,0xDF,0xFF,0xF9,0x10,0x00,0x00,0x17,0xFF,0x11,0x10,0x00,0x19,0xFD, + 0xDF,0xFB,0xDF,0x91,0x01,0x9F,0xD9,0xFF,0xF9,0x10,0x19,0xFF,0x11,0x9F,0xF7,0x10, + 0x19,0xD9,0xFF,0xFE,0xE9,0x10,0x00,0x19,0xFF,0xDE,0xFF,0x10,0x00,0x1F,0xF9,0xDF, + 0xF7,0x10,0x01,0x9F,0xFD,0x59,0x51,0x00,0x01,0xDF,0xE9,0xEF,0xF9,0x10,0x01,0x9F, + 0xF5,0x55,0x10,0x00,0x00,0x1F,0xF7,0x11,0x10,0x00,0x01,0x9F,0xFD,0x5E,0xF9,0x10, + 0x19,0xFE,0x11,0xEF,0x91,0x00,0x00,0x01,0x9F,0xF1,0x00,0x00,0x00,0x15,0x7D,0xFF, + 0x10,0x00,0x01,0xFF,0x7B,0xFE,0x10,0x00,0x00,0x1B,0xFE,0x99,0x71,0x00,0x1D,0xF9, + 0xDF,0xF5,0xFF,0x71,0x01,0xBF,0x95,0xFF,0xF7,0x10,0x17,0xFF,0x97,0xFF,0xF1,0x10, + 0x17,0xF5,0xB9,0x7D,0xB1,0x10,0x01,0x1F,0xF9,0x15,0xFF,0x51,0x01,0x5F,0xFF,0xFF, + 0xD1,0x00,0x01,0x1E,0xFF,0xFF,0x71,0x00,0x01,0xEF,0xFF,0xFF,0xB1,0x10,0x01,0xBF, + 0xFF,0xFF,0x10,0x00,0x01,0x5F,0xF5,0x10,0x00,0x00,0x01,0x1E,0xFF,0xFF,0xF5,0x10, + 0x1D,0xFB,0x11,0xFF,0x51,0x00,0x00,0x01,0xBF,0xD1,0x00,0x00,0x00,0x1D,0xFF,0xF9, + 0x10,0x00,0x15,0xFF,0x55,0xFF,0x71,0x00,0x00,0x1D,0xFF,0xFF,0xB1,0x00,0x1F,0xF5, + 0xBF,0xD1,0xFF,0x51,0x01,0xEF,0x71,0xEF,0xF5,0x10,0x01,0xEF,0xFF,0xFF,0x51,0x00, + 0x01,0xEF,0x75,0x97,0x11,0x00,0x01,0x59,0x95,0x15,0x99,0x51,0x01,0x5B,0xDD,0xB9, + 0x11,0x00,0x00,0x11,0x9D,0xD9,0x51,0x00,0x01,0x9D,0xDD,0x95,0x11,0x00,0x01,0x79, + 0x99,0x97,0x10,0x00,0x01,0x59,0x91,0x00,0x00,0x00,0x00,0x11,0x9D,0xDB,0x91,0x10, + 0x17,0x95,0x15,0x99,0x11,0x00,0x00,0x01,0x79,0x51,0x00,0x00,0x00,0x19,0xDD,0x71, + 0x10,0x00,0x15,0x99,0x11,0x99,0x71,0x00,0x00,0x19,0x99,0x99,0x51,0x00,0x19,0x91, + 0x59,0x55,0x99,0x10,0x01,0x99,0x51,0x59,0x91,0x00,0x01,0x19,0xDD,0xB5,0x10,0x00, + 0x01,0x19,0xDD,0xD7,0x10,0x00,0x00,0x11,0x11,0x01,0x11,0x10,0x00,0x11,0x11,0x11, + 0x10,0x00,0x00,0x01,0x11,0x11,0x10,0x00,0x01,0x11,0x11,0x11,0x00,0x00,0x00,0x11, + 0x11,0x11,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x00, + 0x01,0x11,0x01,0x11,0x10,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x10, + 0x00,0x00,0x01,0x11,0x11,0x11,0x10,0x00,0x00,0x11,0x11,0x11,0x10,0x00,0x11,0x11, + 0x11,0x11,0x11,0x10,0x01,0x11,0x10,0x11,0x11,0x00,0x00,0x11,0x11,0x11,0x00,0x00, + 0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x01,0x11,0x11, + 0x11,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x11,0x11,0x11,0x11,0x00,0x00,0x11, + 0x11,0x01,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11, + 0x00,0x11,0x11,0x11,0x11,0x10,0x01,0x11,0x11,0x11,0x11,0x00,0x00,0x01,0x11,0x11, + 0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00, + 0x11,0x11,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x15,0xDD,0xD9,0x11,0x00,0x00,0x15,0xBD,0xDB,0x11,0x00,0x00,0x01,0xBD,0xDB, + 0x91,0x00,0x00,0x01,0x5B,0xDD,0xD5,0x00,0x00,0x1D,0xDD,0xDD,0xD7,0x10,0x00,0x1D, + 0xD5,0x17,0xDD,0x10,0x01,0xBD,0x91,0x19,0xDD,0x10,0x1D,0xD5,0x1D,0xD7,0x1D,0xD7, + 0x00,0x19,0xDD,0x17,0xDD,0x50,0x01,0xBD,0x91,0x5D,0xD7,0x00,0x00,0x15,0xDD,0xDD, + 0xDD,0x10,0x00,0x00,0x15,0xDD,0x91,0x00,0x00,0x01,0x5D,0x51,0x00,0x00,0x00,0x01, + 0x5D,0xD7,0x10,0x00,0x00,0x01,0x59,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x1B,0xFF,0xFF,0xD1,0x00,0x01,0x7F,0xFF,0xFF,0xE1,0x00,0x00,0x15,0xFF,0xFF, + 0xF7,0x10,0x00,0x15,0xFF,0xFF,0xE1,0x00,0x01,0x7F,0xFF,0xFF,0xF5,0x10,0x01,0x5F, + 0xF5,0x1B,0xFD,0x10,0x01,0xBF,0xD1,0x1F,0xF9,0x10,0x1F,0xF5,0x7F,0xF9,0x7F,0xF5, + 0x00,0x17,0xFF,0x5E,0xFD,0x10,0x01,0xBF,0xE1,0xEF,0xE1,0x00,0x00,0x17,0xFF,0xFF, + 0xFD,0x10,0x00,0x00,0x17,0xFD,0x51,0x00,0x00,0x01,0x5F,0xB1,0x00,0x00,0x00,0x01, + 0x5D,0xF7,0x10,0x00,0x00,0x01,0xBF,0xD1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x1E,0xFB,0xBF,0xF5,0x10,0x11,0xFF,0xE7,0x9F,0xF7,0x10,0x00,0x17,0xFF,0x5F, + 0xFD,0x10,0x00,0x19,0xFF,0xB7,0x71,0x00,0x01,0x15,0xBF,0xF5,0x51,0x00,0x01,0x9F, + 0xF1,0x1E,0xF9,0x10,0x01,0x9F,0xD1,0x9F,0xF1,0x10,0x1F,0xF5,0xDF,0xF9,0xDF,0xB1, + 0x00,0x01,0xFF,0xDF,0xF1,0x10,0x01,0x5F,0xF7,0xFF,0x51,0x00,0x00,0x15,0x55,0xEF, + 0xF5,0x10,0x00,0x00,0x1B,0xF5,0x10,0x00,0x00,0x00,0x1F,0xD1,0x00,0x00,0x00,0x00, + 0x1D,0xF5,0x10,0x00,0x00,0x11,0xFF,0xF5,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x1F,0xF7,0xEF,0xF5,0x10,0x19,0xFF,0x71,0x1F,0xF9,0x10,0x00,0x19,0xFE,0xBF, + 0xFB,0x10,0x00,0x19,0xFF,0xE1,0x10,0x00,0x00,0x11,0xBF,0xD1,0x10,0x00,0x01,0xBF, + 0xD1,0x1F,0xF7,0x10,0x01,0x7F,0xE1,0xEF,0x91,0x00,0x1F,0xF7,0xFF,0xFB,0xFF,0x51, + 0x00,0x01,0xBF,0xFF,0x51,0x00,0x00,0x1E,0xFF,0xF7,0x10,0x00,0x00,0x01,0x1B,0xFF, + 0x71,0x00,0x00,0x00,0x1D,0xF1,0x00,0x00,0x00,0x00,0x1D,0xF1,0x00,0x00,0x00,0x00, + 0x1E,0xF1,0x00,0x00,0x00,0x19,0xF7,0xFB,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x5F,0xFF,0xFF,0xD1,0x00,0x1D,0xFF,0x11,0x7F,0xF9,0x10,0x00,0x1D,0xFF,0xFF, + 0xD1,0x10,0x00,0x11,0xEF,0xFE,0x11,0x00,0x00,0x01,0xDF,0xB1,0x00,0x00,0x01,0xDF, + 0xB1,0x5F,0xF5,0x10,0x01,0x5F,0xF7,0xFF,0x11,0x00,0x1F,0xFD,0xFE,0xFE,0xFE,0x10, + 0x00,0x01,0x9F,0xFD,0x10,0x00,0x00,0x1B,0xFF,0xB1,0x00,0x00,0x00,0x01,0x7F,0xF7, + 0x10,0x00,0x00,0x00,0x1F,0xE1,0x00,0x00,0x00,0x00,0x19,0xF5,0x10,0x00,0x00,0x01, + 0x1F,0xD1,0x00,0x00,0x00,0x1E,0xE1,0xDF,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x7F,0xFF,0xD9,0x11,0x00,0x1D,0xFE,0x11,0xBF,0xF5,0x10,0x00,0x1F,0xFE,0xFF, + 0x91,0x00,0x00,0x11,0x1B,0xFF,0xB1,0x00,0x00,0x01,0xFF,0x71,0x00,0x00,0x01,0xFF, + 0x91,0x9F,0xF1,0x00,0x01,0x5F,0xFD,0xF9,0x10,0x00,0x1D,0xFF,0xF9,0xFF,0xF7,0x10, + 0x00,0x15,0xFF,0xFF,0x11,0x00,0x00,0x19,0xFF,0x11,0x00,0x00,0x00,0x17,0xFF,0xB1, + 0x10,0x00,0x00,0x01,0x5F,0xB1,0x00,0x00,0x00,0x00,0x15,0xF7,0x10,0x00,0x00,0x01, + 0x5F,0x91,0x00,0x00,0x01,0x7F,0x91,0x7F,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0xBF,0xD1,0x11,0x10,0x00,0x19,0xFF,0x97,0xFF,0xD1,0x00,0x01,0x5F,0xF5,0xDF, + 0xE1,0x00,0x00,0x1D,0x99,0xFF,0xB1,0x00,0x00,0x15,0xFF,0x51,0x00,0x00,0x01,0xFF, + 0xF7,0xEF,0xB1,0x00,0x00,0x1F,0xFF,0xF1,0x10,0x00,0x1D,0xFF,0xB9,0xFF,0xF1,0x00, + 0x01,0x1E,0xFD,0xFF,0x71,0x00,0x00,0x1B,0xFD,0x10,0x00,0x00,0x01,0x5F,0xFF,0x99, + 0x71,0x00,0x00,0x01,0x7F,0x91,0x00,0x00,0x00,0x00,0x11,0xFB,0x10,0x00,0x00,0x01, + 0x9F,0x71,0x00,0x00,0x01,0x79,0x11,0x19,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0xDF,0x91,0x00,0x00,0x00,0x11,0xFF,0xFF,0xFE,0x51,0x00,0x01,0x7F,0xF1,0x9F, + 0xF1,0x00,0x01,0x7F,0xFF,0xFF,0x51,0x00,0x00,0x17,0xFF,0x10,0x00,0x00,0x01,0xBF, + 0xFF,0xFF,0x51,0x00,0x00,0x1E,0xFF,0x91,0x00,0x00,0x1D,0xFF,0x59,0xFF,0x91,0x00, + 0x01,0xBF,0xF5,0xDF,0xD1,0x00,0x00,0x1D,0xFB,0x10,0x00,0x00,0x01,0xDF,0xFF,0xFF, + 0xD1,0x00,0x00,0x01,0x9F,0x51,0x00,0x00,0x00,0x00,0x01,0xEE,0x10,0x00,0x00,0x11, + 0xBF,0x51,0x00,0x00,0x00,0x11,0x10,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x99,0x51,0x00,0x00,0x00,0x01,0x5B,0xEF,0xFF,0xB1,0x00,0x01,0x59,0x91,0x59, + 0x91,0x00,0x01,0x5B,0xDD,0xB5,0x10,0x00,0x00,0x15,0x99,0x10,0x00,0x00,0x01,0x19, + 0xDD,0xB5,0x10,0x00,0x00,0x17,0x99,0x11,0x00,0x00,0x17,0x99,0x15,0x99,0x51,0x00, + 0x01,0x99,0x71,0x59,0x91,0x00,0x00,0x19,0x95,0x10,0x00,0x00,0x01,0x99,0x99,0x99, + 0x51,0x00,0x00,0x01,0xDF,0xB1,0x00,0x00,0x00,0x00,0x01,0xDF,0x10,0x00,0x00,0x19, + 0xEF,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x00, + 0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x11,0x17,0xDF,0x91,0x00,0x00,0x11,0x11,0x11, + 0x11,0x00,0x00,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x11, + 0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x11,0x10,0x00, + 0x01,0x11,0x10,0x11,0x11,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x11,0x11, + 0x10,0x00,0x00,0x01,0xFF,0xF1,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x1F, + 0xFD,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x9D,0xDD,0xDD,0x91,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x15,0x11,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x00,0x11, + 0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x11,0x00, + 0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x55,0x51,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x01,0x77, + 0x71,0x00,0x00,0x11,0x55,0x11,0x00,0x00,0x00,0x00,0x15,0x55,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0xBF,0xB1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x55,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xFE,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x15,0x51,0x00,0x00,0x00,0x11,0x11,0x11,0x00, + 0x00,0x01,0xFF,0x71,0x00,0x00,0x00,0x00,0x11,0xEE,0x10,0x00,0x00,0x00,0x01,0x7F, + 0x51,0x00,0x00,0x15,0xFF,0x11,0x00,0x00,0x00,0x00,0x19,0xFE,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x1E,0xF5,0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x00,0x11,0xFF,0x50, + 0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x11,0x1B,0xFD,0x10,0x00,0x00, + 0x11,0x11,0x00,0x00,0x00,0x00,0x15,0xEF,0xE1,0x00,0x00,0x01,0x19,0xBB,0x95,0x10, + 0x00,0x15,0xFF,0x51,0x10,0x00,0x00,0x00,0x11,0xEB,0x10,0x00,0x00,0x00,0x01,0x99, + 0x51,0x00,0x00,0x19,0xFE,0x11,0x11,0x00,0x00,0x00,0x1D,0xFB,0x10,0x00,0x00,0x11, + 0x11,0x11,0x11,0x10,0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x00,0x00, + 0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x01,0x17,0xBD,0x95,0x10,0x00,0x15,0xFF,0x11, + 0x10,0x00,0x00,0x00,0x15,0x9D,0x91,0x00,0x00,0x01,0x59,0xDE,0xF9,0x10,0x00,0x11, + 0x5B,0xD7,0x10,0x00,0x00,0x01,0x1D,0xFF,0xB1,0x00,0x00,0x11,0xEF,0xFF,0xF9,0x10, + 0x00,0x17,0xFF,0x5D,0x71,0x00,0x00,0x00,0x15,0x97,0x10,0x00,0x00,0x00,0x11,0xFF, + 0x51,0x00,0x00,0x1B,0xFD,0x59,0x95,0x00,0x00,0x00,0x1F,0xF9,0x10,0x00,0x01,0x79, + 0x57,0x91,0x5D,0x71,0x00,0x17,0x95,0x7D,0x51,0x00,0x00,0x11,0x7B,0xD7,0x11,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0xEF,0xFF,0xF9,0x10,0x00,0x19,0xFF,0x7D, + 0x71,0x00,0x00,0x01,0x7F,0xFF,0xD1,0x00,0x00,0x15,0xFF,0xFF,0xF7,0x10,0x00,0x1B, + 0xFF,0xFF,0x71,0x00,0x00,0x01,0x9F,0xFB,0x51,0x00,0x00,0x1B,0xFF,0xBF,0xF5,0x10, + 0x00,0x1B,0xFF,0xFF,0xF1,0x00,0x00,0x00,0x1D,0xFB,0x10,0x00,0x00,0x00,0x15,0xFF, + 0x10,0x00,0x00,0x1E,0xFB,0xFF,0xB1,0x00,0x00,0x01,0x5F,0xF5,0x10,0x00,0x01,0xEF, + 0xFF,0xFE,0xFF,0xF1,0x00,0x1E,0xFF,0xFF,0xD1,0x00,0x00,0x1B,0xFF,0xFF,0x91,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0xFF,0xDF,0xF5,0x10,0x00,0x1D,0xFF,0xFF, + 0xF1,0x10,0x00,0x15,0xFF,0xD5,0x51,0x00,0x00,0x1E,0xFF,0xBF,0xF5,0x10,0x01,0x5F, + 0xFE,0xFF,0x91,0x00,0x00,0x01,0xFF,0xFF,0x51,0x00,0x00,0x1F,0xFE,0x7F,0xF1,0x10, + 0x00,0x1D,0xFE,0xBF,0xF1,0x00,0x00,0x00,0x1E,0xF9,0x10,0x00,0x00,0x00,0x19,0xFE, + 0x10,0x00,0x00,0x1F,0xFF,0xFB,0x11,0x00,0x00,0x01,0x5F,0xF1,0x00,0x00,0x01,0xFF, + 0xBE,0xFF,0xBF,0xF1,0x00,0x1F,0xFD,0xEF,0xD1,0x00,0x01,0x7F,0xFD,0xFF,0xD1,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFE,0x7F,0xF1,0x00,0x00,0x1E,0xFF,0xDF, + 0xF5,0x10,0x00,0x19,0xFF,0x11,0x10,0x00,0x01,0x5F,0xFB,0x7F,0xF1,0x00,0x01,0x9F, + 0xFF,0xFF,0x51,0x00,0x00,0x01,0xBF,0xE5,0x10,0x00,0x00,0x1F,0xFE,0xFF,0xF1,0x00, + 0x00,0x1F,0xF9,0x9F,0xF1,0x00,0x00,0x01,0x1F,0xF5,0x10,0x00,0x00,0x00,0x1D,0xFD, + 0x10,0x00,0x01,0x5F,0xFF,0xF7,0x10,0x00,0x00,0x01,0x9F,0xE1,0x00,0x00,0x15,0xFF, + 0x5D,0xFB,0x9F,0xE1,0x01,0x5F,0xF5,0xDF,0xD1,0x00,0x01,0xBF,0xF5,0xFF,0xD1,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFD,0xEF,0xE1,0x00,0x01,0x1F,0xF9,0xBF, + 0xF5,0x10,0x00,0x19,0xFF,0xB5,0x10,0x00,0x01,0x5F,0xFB,0xEF,0xD1,0x00,0x01,0x9F, + 0xFD,0xB9,0x10,0x00,0x00,0x01,0xDF,0xD1,0x00,0x00,0x00,0x1D,0xFF,0xFF,0xD1,0x00, + 0x01,0x5F,0xF5,0xBF,0xD1,0x00,0x00,0x01,0x5F,0xF1,0x10,0x00,0x00,0x00,0x1E,0xF9, + 0x10,0x00,0x01,0x7F,0xFE,0xFD,0x10,0x00,0x00,0x01,0xDF,0xD1,0x00,0x00,0x17,0xFE, + 0x1F,0xF5,0xBF,0xD1,0x01,0x9F,0xF1,0xEF,0x91,0x00,0x01,0xDF,0xFB,0xFF,0xB1,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xD1,0x00,0x01,0x5F,0xFB,0xFF, + 0xE1,0x00,0x00,0x15,0xFF,0xFF,0x10,0x00,0x01,0x5F,0xFF,0xFF,0xD1,0x00,0x01,0x5F, + 0xFF,0xFD,0x10,0x00,0x00,0x01,0xEF,0x91,0x00,0x00,0x00,0x11,0x97,0xEF,0x91,0x00, + 0x01,0x7F,0xF1,0xDF,0xB1,0x00,0x00,0x01,0x9F,0xE1,0x00,0x00,0x00,0x01,0x5F,0xF5, + 0x10,0x00,0x01,0xBF,0xD7,0xFF,0x51,0x00,0x00,0x01,0xEF,0x91,0x00,0x00,0x1B,0xFD, + 0x5F,0xF1,0xDF,0x91,0x01,0xBF,0xD1,0xFF,0x51,0x00,0x01,0x7F,0xFF,0xFF,0x11,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xD9,0x59,0x71,0x00,0x01,0x5F,0xFF,0xFF, + 0x51,0x00,0x00,0x01,0x5D,0xD9,0x10,0x00,0x00,0x17,0xD7,0x59,0x51,0x00,0x00,0x15, + 0xDD,0x95,0x10,0x00,0x00,0x01,0xFF,0x51,0x00,0x00,0x00,0x1F,0xEE,0xFF,0x51,0x00, + 0x01,0x59,0x91,0x99,0x51,0x00,0x00,0x01,0x79,0x71,0x00,0x00,0x00,0x15,0xFF,0xF1, + 0x10,0x00,0x01,0x79,0x71,0x99,0x71,0x00,0x00,0x01,0x99,0x51,0x00,0x00,0x17,0x95, + 0x59,0x91,0x99,0x51,0x01,0x79,0x75,0x99,0x11,0x00,0x00,0x17,0xDD,0xB1,0x10,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x17,0xDD,0xB5, + 0x10,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x10,0x00,0x00,0x01, + 0x11,0x11,0x00,0x00,0x00,0x05,0x99,0x51,0x00,0x00,0x00,0x5F,0xFF,0xD7,0x10,0x00, + 0x00,0x11,0x11,0x11,0x10,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x17,0xFE,0x71, + 0x00,0x00,0x00,0x11,0x11,0x11,0x10,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x01,0x11, + 0x11,0x11,0x11,0x10,0x00,0x11,0x11,0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x05,0x75,0x51,0x00,0x00,0x00,0x55,0x95,0x50,0x00,0x00,0x00, + 0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x11,0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x15,0x10,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x17,0xBD,0x75,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x00, + 0x5D,0xD5,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x55,0x55,0x55,0x55,0x90, + 0x00,0x01,0x99,0x5B,0x91,0x10,0x00,0x01,0x17,0xBB,0x95,0x10,0x00,0x00,0x11,0x11, + 0x11,0x00,0x00,0x00,0x11,0x11,0x10,0x00,0x00,0x01,0x1D,0xF7,0x10,0x00,0x00,0x11, + 0x11,0x11,0x10,0x00,0x00,0x11,0x11,0x11,0x11,0x00,0x01,0x11,0x11,0x11,0x11,0x10, + 0x00,0x01,0x11,0x11,0x11,0x10,0x00,0x15,0x99,0x17,0x97,0x10,0x00,0x01,0x11,0x11, + 0x11,0x00,0x00,0x00,0x57,0xFF,0x55,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x00, + 0x5E,0xF9,0x70,0x00,0x00,0x05,0x51,0x15,0x50,0x00,0x05,0xEF,0xFF,0xFF,0xFE,0x50, + 0x00,0x15,0xFF,0xFF,0xF9,0x10,0x00,0x11,0xEF,0xFF,0xFB,0x10,0x00,0x01,0x59,0x55, + 0x91,0x00,0x00,0x01,0x19,0xD9,0x51,0x00,0x00,0x01,0xBF,0xFB,0x51,0x00,0x01,0x19, + 0x95,0x79,0x71,0x00,0x00,0x19,0x95,0x19,0x97,0x10,0x15,0x97,0x19,0x91,0x99,0x51, + 0x00,0x17,0x99,0x19,0x99,0x10,0x00,0x17,0xFF,0x1E,0xF9,0x10,0x00,0x01,0x99,0x99, + 0x95,0x10,0x00,0x00,0x79,0xF7,0x70,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x00, + 0x79,0xF5,0x50,0x00,0x05,0x75,0x55,0x15,0x55,0x00,0x05,0xF7,0x55,0x55,0x7F,0x50, + 0x00,0x17,0xFF,0xEF,0xFD,0x10,0x00,0x1B,0xFF,0xBF,0xF9,0x10,0x00,0x01,0x9F,0xEF, + 0xB1,0x00,0x00,0x01,0xEF,0xFF,0x71,0x00,0x00,0x11,0xFF,0xFF,0x51,0x00,0x01,0x5F, + 0xF1,0xDF,0xB1,0x00,0x00,0x1D,0xF9,0x5F,0xF5,0x10,0x19,0xFD,0x7F,0xF5,0xFF,0x51, + 0x00,0x17,0xFF,0x9F,0xF5,0x10,0x00,0x15,0xFF,0x9F,0xF1,0x10,0x00,0x01,0xFF,0xFF, + 0xF1,0x10,0x00,0x05,0x5D,0xF1,0x10,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x00, + 0x5D,0xF1,0x10,0x00,0x07,0xBF,0xFD,0xBF,0x97,0x00,0x05,0xF5,0x00,0x00,0x5F,0x50, + 0x00,0x19,0xFF,0x5F,0xFD,0x10,0x00,0x1F,0xFE,0x5F,0xF5,0x10,0x00,0x01,0xBF,0xFD, + 0x51,0x00,0x00,0x15,0xFF,0xD5,0x10,0x00,0x00,0x11,0xDF,0xE5,0x10,0x00,0x01,0x9F, + 0xE1,0xFF,0x91,0x00,0x00,0x1B,0xFB,0xDF,0xD1,0x00,0x17,0xFD,0xDF,0xF9,0xFD,0x10, + 0x00,0x01,0xEF,0xFF,0x71,0x00,0x00,0x01,0xEF,0xEF,0x91,0x00,0x00,0x05,0x9D,0xFF, + 0x91,0x00,0x00,0x05,0xBF,0x77,0x00,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x00, + 0x7B,0xF9,0x70,0x00,0x01,0xFF,0xDF,0xFF,0x55,0x00,0x05,0xF5,0x00,0x00,0x5F,0x50, + 0x00,0x1D,0xFE,0xDF,0xF7,0x10,0x00,0x1F,0xFD,0xBF,0xF1,0x00,0x00,0x01,0xDF,0xD1, + 0x10,0x00,0x00,0x01,0x9F,0xF9,0x10,0x00,0x00,0x01,0xDF,0x91,0x00,0x00,0x01,0xDF, + 0xD5,0xFF,0x51,0x00,0x00,0x19,0xFE,0xFF,0x51,0x00,0x15,0xFE,0xFF,0xFE,0xF5,0x10, + 0x00,0x01,0xBF,0xFB,0x10,0x00,0x00,0x01,0xDF,0xFF,0x11,0x00,0x00,0x01,0x7F,0xFB, + 0x11,0x00,0x00,0x05,0x5F,0x97,0x00,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x05, + 0x5F,0xB7,0x10,0x00,0x07,0x97,0x55,0x97,0x70,0x00,0x05,0xF5,0x00,0x00,0x5F,0x50, + 0x00,0x1E,0xFF,0xFF,0xE1,0x00,0x00,0x1E,0xFF,0xFF,0xE1,0x00,0x00,0x01,0xFF,0x71, + 0x00,0x00,0x00,0x15,0x5D,0xFF,0x51,0x00,0x00,0x01,0xFF,0xD1,0x10,0x00,0x01,0xDF, + 0xDD,0xFF,0x10,0x00,0x00,0x15,0xFF,0xFB,0x10,0x00,0x15,0xFF,0xFB,0xFF,0xD1,0x00, + 0x00,0x17,0xFF,0xFE,0x10,0x00,0x00,0x01,0x9F,0xF9,0x10,0x00,0x00,0x17,0xFF,0xB5, + 0x51,0x00,0x00,0x07,0x9F,0x75,0x00,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x07, + 0x9F,0x55,0x00,0x00,0x01,0x75,0x15,0x75,0x00,0x00,0x05,0xF5,0x00,0x00,0x5F,0x50, + 0x01,0x1F,0xFD,0xD9,0x11,0x00,0x00,0x15,0xD9,0xBF,0xD1,0x00,0x00,0x15,0xFF,0x51, + 0x00,0x00,0x00,0x1D,0xFF,0xFF,0x11,0x00,0x00,0x01,0xFF,0xF5,0x10,0x00,0x01,0xDF, + 0xFF,0xFE,0x10,0x00,0x00,0x11,0xFF,0xF1,0x10,0x00,0x01,0xFF,0xD9,0xFF,0x51,0x00, + 0x01,0x5F,0xFB,0xFF,0x71,0x00,0x00,0x11,0xEF,0xE1,0x10,0x00,0x00,0x1F,0xFF,0xFF, + 0x91,0x00,0x00,0x05,0xDF,0xB5,0x00,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x55, + 0xFF,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xF7,0x55,0x55,0x7F,0x50, + 0x01,0x5F,0xF1,0x11,0x10,0x00,0x00,0x01,0x11,0xEF,0x91,0x00,0x00,0x15,0x99,0x10, + 0x00,0x00,0x00,0x15,0xBD,0xB5,0x10,0x00,0x00,0x01,0x7D,0xD1,0x10,0x00,0x01,0x5D, + 0x95,0x97,0x10,0x00,0x00,0x01,0x99,0x71,0x00,0x00,0x01,0x99,0x55,0x99,0x10,0x00, + 0x01,0x79,0x91,0x99,0x71,0x00,0x00,0x5F,0xFF,0x51,0x00,0x00,0x00,0x19,0x99,0x99, + 0x51,0x00,0x00,0x05,0x7F,0xD5,0x00,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x5D, + 0xFB,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xEF,0xFF,0xFF,0xFE,0x50, + 0x01,0x9F,0xE1,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0x51,0x00,0x00,0x01,0x11,0x10, + 0x00,0x00,0x00,0x01,0x11,0x11,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00,0x00,0x11, + 0x11,0x11,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x01,0x11,0x11,0x11,0x10,0x00, + 0x00,0x11,0x11,0x11,0x10,0x00,0x00,0x1F,0xE7,0x10,0x00,0x00,0x00,0x11,0x11,0x11, + 0x10,0x00,0x00,0x00,0x71,0x55,0x00,0x00,0x00,0x00,0x55,0xF5,0x50,0x00,0x00,0x55, + 0x17,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x55,0x55,0x55,0x55,0x90, + 0x01,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x10,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x55,0x95,0x50,0x00,0x00,0x01, + 0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + +const uint32_t PokeMini_Font12_PalRGB32[] = { + 0x00F800F8,0x00000000,0x00000038,0x00203800, + 0x00000080,0x00003028,0x000000D0,0x00005050, + 0x00487800,0x00007070,0x0070B800,0x00009088, + 0x0090E800,0x0000B0A8,0x0008C8C0,0x0000F0E0 +}; + +const uint32_t PokeMini_Font12_PalBGR32[] = { + 0x00F800F8,0x00000000,0x00380000,0x00003820, + 0x00800000,0x00283000,0x00D00000,0x00505000, + 0x00007848,0x00707000,0x0000B870,0x00889000, + 0x0000E890,0x00A8B000,0x00C0C808,0x00E0F000 +}; + +const uint16_t PokeMini_Font12_PalRGB15[] = { + 0xFC1F,0x8000,0x8007,0x90E0,0x8010,0x80C5,0x801A,0x814A, + 0xA5E0,0x81CE,0xBAE0,0x8251,0xCBA0,0x82D5,0x8738,0x83DC +}; + +const uint16_t PokeMini_Font12_PalBGR16[] = { + 0xF81F,0x0000,0x3800,0x01C4,0x8000,0x2980,0xD000,0x5280, + 0x03C9,0x7380,0x05CE,0x8C80,0x0752,0xAD80,0xC641,0xE780 +}; + +const uint16_t PokeMini_Font12_PalRGB16[] = { + 0xF81F,0x0000,0x0007,0x21C0,0x0010,0x0185,0x001A,0x028A, + 0x4BC0,0x038E,0x75C0,0x0491,0x9740,0x0595,0x0E58,0x079C +}; + +const uint32_t PokeMini_TFont12_PalRGB32[] = { + 0x00FF00F8,0x00000000,0x00003809,0x00380016, + 0x00008015,0x00302F00,0x0000D022,0x00425000, + 0x00780033,0x005D7000,0x00B80051,0x007F9000, + 0x00E80069,0x009AB000,0x00B0C808,0x00D8F000 +}; + +const uint32_t PokeMini_TFont12_PalBGR32[] = { + 0x00F800FF,0x00000000,0x00093800,0x00160038, + 0x00158000,0x00002F30,0x0022D000,0x00005042, + 0x00330078,0x0000705D,0x005100B8,0x0000907F, + 0x006900E8,0x0000B09A,0x0008C8B0,0x0000F0D8 +}; + +const uint16_t PokeMini_TFont12_PalRGB16[] = { + 0xF81F,0x0000,0x01C1,0x3802,0x0402,0x3160,0x0684,0x4280, + 0x7806,0x5B80,0xB80A,0x7C80,0xE80D,0x9D80,0xB641,0xDF80 +}; + +const uint16_t PokeMini_TFont12_PalBGR16[] = { + 0xF81F,0x0000,0x09C0,0x1007,0x1400,0x0166,0x2680,0x0288, + 0x300F,0x038B,0x5017,0x048F,0x681D,0x0593,0x0E56,0x079B +}; + +const uint16_t PokeMini_TFont12_PalRGB15[] = { + 0xFC1F,0x8000,0x80E1,0x9C02,0x8202,0x98A0,0x8344,0xA140, + 0xBC06,0xADC0,0xDC0A,0xBE40,0xF40D,0xCEC0,0xDB21,0xEFC0 +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Font12.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Font12.h new file mode 100644 index 0000000000..9c6c7654de --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Font12.h @@ -0,0 +1,58 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_FONT12 +#define POKEMINI_FONT12 + +#include + +// PokeMini Font Data +// 128 Chars, 192 x 96 - 4bpp +extern const uint8_t PokeMini_Font12[]; + +// PokeMini Font Palette (RGBX8888) +extern const uint32_t PokeMini_Font12_PalRGB32[]; + +// PokeMini Font Palette (BGRX8888) +extern const uint32_t PokeMini_Font12_PalBGR32[]; + +// PokeMini Font Palette (RGB565) +extern const uint16_t PokeMini_Font12_PalRGB16[]; + +// PokeMini Font Palette (BGR565) +extern const uint16_t PokeMini_Font12_PalBGR16[]; + +// PokeMini Font Palette (RGB555) +extern const uint16_t PokeMini_Font12_PalRGB15[]; + +// PokeMini Title Font Palette (RGBX8888) +extern const uint32_t PokeMini_TFont12_PalRGB32[]; + +// PokeMini Title Font Palette (BGRX8888) +extern const uint32_t PokeMini_TFont12_PalBGR32[]; + +// PokeMini Title Font Palette (RGB565) +extern const uint16_t PokeMini_TFont12_PalRGB16[]; + +// PokeMini Title Font Palette (BGR565) +extern const uint16_t PokeMini_TFont12_PalBGR16[]; + +// PokeMini Title Font Palette (RGB555) +extern const uint16_t PokeMini_TFont12_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Icons12.c b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Icons12.c new file mode 100644 index 0000000000..a59e9d3927 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Icons12.c @@ -0,0 +1,123 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include + +const uint8_t PokeMini_Icons12[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x80, + 0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x00,0x08,0x80,0x00,0x00,0x00,0x08,0x43,0x33, + 0x40,0x00,0x00,0x04,0x33,0x34,0x80,0x00,0x00,0x00,0x44,0x44,0x00,0x00,0x06,0xCD, + 0x99,0x00,0x00,0x00,0x0D,0xDD,0xDD,0xDD,0xDD,0xD0,0x0A,0x77,0x77,0x77,0x77,0xD0, + 0x0D,0xDD,0xDD,0xDD,0xDD,0xD0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x43,0x33,0x40,0x00,0x00,0x06,0x23,0x33,0x40,0x00,0x00,0x83,0x33,0x33, + 0x34,0x00,0x00,0x43,0x33,0x32,0x11,0x00,0x00,0x04,0x43,0x33,0x40,0x00,0x9C,0xEE, + 0xE9,0x99,0x99,0x60,0xDD,0x99,0x99,0x99,0x99,0xDD,0x75,0x55,0x55,0x55,0x55,0x5A, + 0xDD,0x99,0x99,0x99,0x99,0xDD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x83,0x33,0x33,0x34,0x00,0x00,0x81,0x23,0x33,0x34,0x00,0x00,0x43,0x33,0x23, + 0x32,0x00,0x00,0x33,0x32,0x41,0x99,0x00,0x00,0x43,0x33,0x33,0x34,0x00,0x9C,0xEE, + 0xEE,0xEE,0xEE,0x99,0xDA,0xA6,0x66,0x66,0xAA,0xAD,0xA5,0x57,0x77,0x77,0x75,0x5A, + 0xDA,0xA6,0x66,0x66,0xAA,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x43,0x33,0x23,0x32,0x00,0x00,0x81,0x12,0x23,0x33,0x00,0x02,0x22,0x21,0x96, + 0x22,0x40,0x04,0x33,0x29,0x91,0x99,0x90,0x04,0x43,0x33,0x33,0x32,0x40,0x9C,0xCC, + 0xCC,0xCC,0xCC,0x69,0xDD,0x96,0x56,0x56,0x79,0x9D,0x77,0x77,0x77,0x77,0x77,0x7A, + 0xDD,0x96,0x56,0x56,0x79,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x02,0x22,0x21,0x96,0x22,0x10,0x0F,0xF8,0x19,0x91,0x33,0x40,0x01,0x11,0x1D,0xF6, + 0x11,0x10,0x04,0x33,0x6D,0xDA,0xDD,0x90,0x04,0x33,0x33,0x33,0x33,0x40,0x9C,0xEE, + 0xEE,0xEE,0xEE,0x99,0xDA,0x96,0x66,0x66,0x9A,0xAD,0x75,0x55,0x55,0x55,0x55,0x5A, + 0xD9,0x99,0x99,0x99,0xDF,0xAF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x11,0x1D,0xF6,0x11,0x10,0x0F,0xFF,0x1D,0xD6,0x23,0x40,0x00,0xFF,0xF6,0x66, + 0x9D,0x00,0x00,0x22,0x16,0x9D,0xDD,0x00,0x04,0x33,0x33,0x33,0x32,0x40,0x9C,0xFF, + 0xEE,0xEE,0xEE,0x99,0xDA,0xCE,0xBB,0xBC,0x66,0xAD,0x76,0xCE,0xBB,0xBC,0x66,0x5A, + 0xD6,0x99,0x99,0x69,0xDD,0x9F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xD6,0x61,0x99,0x00,0x00,0xFF,0xD6,0x61,0x22,0x00,0x00,0xFF,0xFF,0x9D, + 0xD9,0x00,0x00,0x11,0x16,0xDD,0xD9,0x00,0x04,0x43,0x33,0x33,0x32,0x40,0x9C,0xFE, + 0xEE,0xEE,0xEE,0x99,0xD9,0xBB,0xE8,0x88,0x16,0xAD,0x76,0xBB,0xE8,0x88,0x16,0x5A, + 0xD9,0xBB,0xE8,0x88,0x1D,0xDF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x9D,0xD9,0x00,0x00,0xFF,0xD9,0x41,0x11,0x00,0x00,0x0F,0xFD,0x9A, + 0x90,0x00,0x00,0x01,0x9D,0xDF,0xD0,0x00,0x00,0x82,0x33,0x33,0x32,0x00,0x9C,0xEE, + 0xEE,0xEE,0xEE,0x69,0xDA,0x9B,0xBB,0xBB,0xBA,0xAD,0x75,0x9B,0xBB,0xBB,0xCA,0x5A, + 0xDA,0x9B,0xBB,0xBB,0x9F,0xDD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x0F,0xFD,0xDD,0xD0,0x00,0x00,0x0F,0xDD,0x96,0x10,0x00,0x00,0x00,0x0D,0xD0, + 0x00,0x00,0x00,0x00,0x09,0x90,0x00,0x00,0x00,0x04,0x22,0x32,0x40,0x00,0x9C,0xEE, + 0xEE,0xEE,0xEE,0xC9,0x0D,0xA9,0xDC,0xD9,0xAA,0xD0,0x05,0x57,0x79,0x77,0x55,0x50, + 0x0D,0xA9,0xDC,0xD9,0x9F,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0D,0xD0,0x00,0x00,0x00,0x00,0x09,0x90,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x48,0x00,0x00,0x9C,0xCC, + 0xCC,0xCC,0xC8,0x99,0x00,0xDD,0xDD,0xDD,0xDD,0x00,0x00,0xA7,0x77,0x77,0x7A,0x00, + 0x00,0xDD,0xDD,0xDD,0x9D,0xDD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x99, + 0x99,0x99,0x99,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x09,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + +const uint32_t PokeMini_Icons12_PalRGB32[] = { + 0x00F800F8,0x00182040,0x00080880,0x000008B0, + 0x003030A0,0x00986040,0x00606868,0x00A87860, + 0x007070B8,0x00788890,0x00989878,0x0008A0B0, + 0x0048A0B8,0x00A8A8A8,0x0080D8E0,0x00D8D8D8 +}; + +const uint32_t PokeMini_Icons12_PalBGR32[] = { + 0x00F800F8,0x00402018,0x00800808,0x00B00800, + 0x00A03030,0x00406098,0x00686860,0x006078A8, + 0x00B87070,0x00908878,0x00789898,0x00B0A008, + 0x00B8A048,0x00A8A8A8,0x00E0D880,0x00D8D8D8 +}; + +const uint16_t PokeMini_Icons12_PalRGB16[] = { + 0xF81F,0x1908,0x0850,0x0056,0x3194,0x9B08,0x634D,0xABCC, + 0x7397,0x7C52,0x9CCF,0x0D16,0x4D17,0xAD55,0x86DC,0xDEDB +}; + +const uint16_t PokeMini_Icons12_PalBGR16[] = { + 0xF81F,0x4103,0x8041,0xB040,0xA186,0x4313,0x6B4C,0x63D5, + 0xBB8E,0x944F,0x7CD3,0xB501,0xBD09,0xAD55,0xE6D0,0xDEDB +}; + +const uint16_t PokeMini_Icons12_PalRGB15[] = { + 0xFC1F,0x8C88,0x8430,0x8036,0x98D4,0xCD88,0xB1AD,0xD5EC, + 0xB9D7,0xBE32,0xCE6F,0x8696,0xA697,0xD6B5,0xC37C,0xEF7B +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Icons12.h b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Icons12.h new file mode 100644 index 0000000000..9adf3cb72f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/resource/PokeMini_Icons12.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_ICONS12 +#define POKEMINI_ICONS12 + +#include + +// PokeMini Icons Data +// 16 Chars, 192 x 12 - 4bpp +extern const uint8_t PokeMini_Icons12[]; + +// PokeMini Icons Palette (RGBX8888) +extern const uint32_t PokeMini_Icons12_PalRGB32[]; + +// PokeMini Icons Palette (BGRX8888) +extern const uint32_t PokeMini_Icons12_PalBGR32[]; + +// PokeMini Icons Palette (RGB565) +extern const uint16_t PokeMini_Icons12_PalRGB16[]; + +// PokeMini Icons Palette (BGR565) +extern const uint16_t PokeMini_Icons12_PalBGR16[]; + +// PokeMini Icons Palette (RGB555) +extern const uint16_t PokeMini_Icons12_PalRGB15[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/CommandLine.c b/PVPokeMini/PokeMini/pokemini-code/source/CommandLine.c new file mode 100644 index 0000000000..72804d3c60 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/CommandLine.c @@ -0,0 +1,655 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Keyboard.h" + +TCommandLine CommandLine; + +int (*PokeMini_PreConfigLoad)(const char *filename, const char *platcfgfile) = NULL; +int (*PokeMini_PostConfigSave)(int success, const char *filename, const char *platcfgfile) = NULL; + +void CommandLineInit(void) +{ + // Clear structure + memset((void *)&CommandLine, 0, sizeof(TCommandLine)); + + // Default strings + CommandLine.min_file[0] = 0; + strcpy(CommandLine.bios_file, "bios.min"); + strcpy(CommandLine.eeprom_file, "PokeMini.eep"); + CommandLine.state_file[0] = 0; + CommandLine.confcustom = NULL; + strcpy(CommandLine.joyplatform, "default"); + CommandLine.rom_dir[0] = 0; + + // Default booleans / integers + CommandLine.forcefreebios = 0; // Force FreeBIOS + CommandLine.updatertc = 2; // Update RTC (0=Off, 1=State, 2=Host) + CommandLine.eeprom_share = 0; // EEPROM Share +#ifdef PERFORMANCE + CommandLine.sound = MINX_AUDIO_GENERATED; + CommandLine.piezofilter = 0; // Piezo Filter +#else + CommandLine.sound = MINX_AUDIO_DIRECTPWM; + CommandLine.piezofilter = 1; // Piezo Filter +#endif + CommandLine.lcdfilter = 1; // LCD Filter + CommandLine.lcdmode = 0; // LCD Mode + CommandLine.low_battery = 0; // Low Battery + CommandLine.palette = 0; // Palette Index + CommandLine.rumblelvl = 3; // Rumble level + CommandLine.joyenabled = 0; // Joystick Enabled + CommandLine.joyid = 0; // Joystick ID + CommandLine.joyaxis_dpad = 1; // Joystick Axis as DPad + CommandLine.joyhats_dpad = 1; // Joystick Hats as DPad + // Joystick mapping + CommandLine.joybutton[0] = 8; // Menu: Button 8 + CommandLine.joybutton[1] = 1; // A: Button 1 + CommandLine.joybutton[2] = 2; // B: Button 2 + CommandLine.joybutton[3] = 7; // C: Button 7 + CommandLine.joybutton[4] = 10; // Up: Button 10 + CommandLine.joybutton[5] = 11; // Down: Button 11 + CommandLine.joybutton[6] = 4; // Left: Button 4 + CommandLine.joybutton[7] = 5; // Right: Button 5 + CommandLine.joybutton[8] = 9; // Power: Button 9 + CommandLine.joybutton[9] = 6; // Shake: Button 6 + // Keyboard mapping (Magic numbers!) + CommandLine.keyb_a[0] = PMKEYB_ESCAPE; // Menu: ESCAPE + CommandLine.keyb_a[1] = PMKEYB_X; // A: X + CommandLine.keyb_a[2] = PMKEYB_Z; // B: Z + CommandLine.keyb_a[3] = PMKEYB_C; // C: C + CommandLine.keyb_a[4] = PMKEYB_UP; // Up: UP + CommandLine.keyb_a[5] = PMKEYB_DOWN; // Down: DOWN + CommandLine.keyb_a[6] = PMKEYB_LEFT; // Left: LEFT + CommandLine.keyb_a[7] = PMKEYB_RIGHT; // Right: RIGHT + CommandLine.keyb_a[8] = PMKEYB_E; // Power: E + CommandLine.keyb_a[9] = PMKEYB_A; // Shake: A + // Keyboard alternative mapping (Magic numbers!) + CommandLine.keyb_b[0] = PMKEYB_Q; // Menu: Q + CommandLine.keyb_b[1] = PMKEYB_NONE; // A: NONE + CommandLine.keyb_b[2] = PMKEYB_NONE; // B: NONE + CommandLine.keyb_b[3] = PMKEYB_D; // C: D + CommandLine.keyb_b[4] = PMKEYB_KP_8; // Up: KP_8 + CommandLine.keyb_b[5] = PMKEYB_KP_2; // Down: KP_2 + CommandLine.keyb_b[6] = PMKEYB_KP_4; // Left: KP_4 + CommandLine.keyb_b[7] = PMKEYB_KP_6; // Right: KP_6 + CommandLine.keyb_b[8] = PMKEYB_P; // Power: P + CommandLine.keyb_b[9] = PMKEYB_S; // Shake: S + CommandLine.custompal[0] = 0xFFFFFF; // Custom Palette 1 Light + CommandLine.custompal[1] = 0x000000; // Custom Palette 1 Dark + CommandLine.custompal[2] = 0xFFFFFF; // Custom Palette 2 Light + CommandLine.custompal[3] = 0x000000; // Custom Palette 2 Dark + CommandLine.lcdcontrast = 64; // LCD contrast + CommandLine.lcdbright = 0; // LCD bright offset + CommandLine.multicart = 0; // Multicart support +#ifdef PERFORMANCE + CommandLine.synccycles = 64; // Sync cycles to 64 (Performance) +#else + CommandLine.synccycles = 8; // Sync cycles to 8 (Accurant) +#endif +} + +int CommandLineCustomArgs(int argc, char **argv, int *extra, const TCommandLineCustom *custom) +{ + int i; + if ((!custom) || (!extra)) return 0; + *extra = 0; + for (i = 0; custom[i].type != COMMANDLINE_EOL; i++) { + if ((argc > 0) && custom[i].name) { + if (!strcasecmp(*argv, custom[i].name)) { + if (custom[i].type == COMMANDLINE_BOOL) { + if (--argc && custom[i].ref) *custom[i].ref = Str2Bool(*++argv); + *extra = 1; + } else if (custom[i].type == COMMANDLINE_INT) { + if (--argc && custom[i].ref) *custom[i].ref = BetweenNum(atoi_Ex(*++argv, 0), custom[i].numa, custom[i].numb); + *extra = 1; + } else if (custom[i].type == COMMANDLINE_INTSET) { + if (custom[i].ref) *custom[i].ref = custom[i].numa; + } else if (custom[i].type == COMMANDLINE_STR) { + if (--argc && custom[i].ref) strncpy((char *)custom[i].ref, *++argv, custom[i].numa); + *extra = 1; + } + return 1; + } + } + } + return 0; +} + +int CommandLineArgs(int argc, char **argv, const TCommandLineCustom *custom) +{ + int extra; + + // No arguments, return true + if (argc <= 1) return 1; + + // Process each argument + argv++; + while (--argc > 0) { + if (*argv[0] == '-') { + // Assuming option + if (!strcasecmp(*argv, "-nofreebios")) CommandLine.forcefreebios = 0; + else if (!strcasecmp(*argv, "-freebios")) CommandLine.forcefreebios = 1; + else if (!strcasecmp(*argv, "-nobios")) CommandLine.bios_file[0] = 0; + else if (!strcasecmp(*argv, "-bios")) { if (--argc) strncpy(CommandLine.bios_file, *++argv, PMTMPV-1); } + else if (!strcasecmp(*argv, "-noeeprom")) CommandLine.eeprom_file[0] = 0; + else if (!strcasecmp(*argv, "-eeprom")) { if (--argc) strncpy(CommandLine.eeprom_file, *++argv, PMTMPV-1); } + else if (!strcasecmp(*argv, "-nostate")) CommandLine.state_file[0] = 0; + else if (!strcasecmp(*argv, "-state")) { if (--argc) strncpy(CommandLine.state_file, *++argv, PMTMPV-1); } + else if (!strcasecmp(*argv, "-nortc")) CommandLine.updatertc = 0; + else if (!strcasecmp(*argv, "-statertc")) CommandLine.updatertc = 1; + else if (!strcasecmp(*argv, "-hostrtc")) CommandLine.updatertc = 2; + else if (!strcasecmp(*argv, "-eepromshare")) CommandLine.eeprom_share = 1; + else if (!strcasecmp(*argv, "-noeepromshare")) CommandLine.eeprom_share = 0; + else if (!strcasecmp(*argv, "-nosound")) CommandLine.sound = 0; + else if (!strcasecmp(*argv, "-sound")) CommandLine.sound = 4; + else if (!strcasecmp(*argv, "-soundgenerate")) CommandLine.sound = 1; + else if (!strcasecmp(*argv, "-sounddirect")) CommandLine.sound = 2; + else if (!strcasecmp(*argv, "-soundemulate")) CommandLine.sound = 3; + else if (!strcasecmp(*argv, "-sounddirectpwm")) CommandLine.sound = 4; + else if (!strcasecmp(*argv, "-soundpwm")) CommandLine.sound = 4; + else if (!strcasecmp(*argv, "-nopiezo")) CommandLine.piezofilter = 0; + else if (!strcasecmp(*argv, "-piezo")) CommandLine.piezofilter = 1; + else if (!strcasecmp(*argv, "-nofilter")) CommandLine.lcdfilter = 0; + else if (!strcasecmp(*argv, "-filter")) CommandLine.lcdfilter = 1; + else if (!strcasecmp(*argv, "-dotmatrix")) CommandLine.lcdfilter = 1; + else if (!strcasecmp(*argv, "-scanline")) CommandLine.lcdfilter = 2; + else if (!strcasecmp(*argv, "-2shades")) CommandLine.lcdmode = 2; + else if (!strcasecmp(*argv, "-3shades")) CommandLine.lcdmode = 1; + else if (!strcasecmp(*argv, "-analog")) CommandLine.lcdmode = 0; + else if (!strcasecmp(*argv, "-fullbattery")) CommandLine.low_battery = 0; + else if (!strcasecmp(*argv, "-lowbattery")) CommandLine.low_battery = 1; + else if (!strcasecmp(*argv, "-autobattery")) CommandLine.low_battery = 2; + else if (!strcasecmp(*argv, "-palette")) { if (--argc) CommandLine.palette = BetweenNum(atoi_Ex(*++argv, 0), 0, 15); } + else if (!strcasecmp(*argv, "-rumblelvl")) { if (--argc) CommandLine.rumblelvl = BetweenNum(atoi_Ex(*++argv, 0), 0, 3); } + else if (!strcasecmp(*argv, "-nojoystick")) CommandLine.joyenabled = 0; + else if (!strcasecmp(*argv, "-joystick")) CommandLine.joyenabled = 1; + else if (!strcasecmp(*argv, "-joyid")) { if (--argc) CommandLine.joyid = BetweenNum(atoi_Ex(*++argv, 0), 0, 15); } + else if (!strcasecmp(*argv, "-custom1light")) { if (--argc) CommandLine.custompal[0] = BetweenNum(atoi_Ex(*++argv, 0xFFFFFF), 0x000000, 0xFFFFFF); } + else if (!strcasecmp(*argv, "-custom1dark")) { if (--argc) CommandLine.custompal[1] = BetweenNum(atoi_Ex(*++argv, 0x000000), 0x000000, 0xFFFFFF); } + else if (!strcasecmp(*argv, "-custom2light")) { if (--argc) CommandLine.custompal[2] = BetweenNum(atoi_Ex(*++argv, 0xFFFFFF), 0x000000, 0xFFFFFF); } + else if (!strcasecmp(*argv, "-custom2dark")) { if (--argc) CommandLine.custompal[3] = BetweenNum(atoi_Ex(*++argv, 0x000000), 0x000000, 0xFFFFFF); } + else if (!strcasecmp(*argv, "-synccycles")) { if (--argc) CommandLine.synccycles = BetweenNum(atoi_Ex(*++argv, 8), 8, 512); } + else if (!strcasecmp(*argv, "-multicart")) { if (--argc) CommandLine.multicart = BetweenNum(atoi_Ex(*++argv, 0), 0, 2); } + else if (!strcasecmp(*argv, "-lcdcontrast")) { if (--argc) CommandLine.lcdcontrast = BetweenNum(atoi_Ex(*++argv, 64), 0, 100); } + else if (!strcasecmp(*argv, "-lcdbright")) { if (--argc) CommandLine.lcdbright = BetweenNum(atoi_Ex(*++argv, 0), -100, 100); } + else if (CommandLineCustomArgs(argc, argv, &extra, custom)) { argc -= extra; argv += extra; } + else return 0; + } else { + // Assuming rom + if (strlen(CommandLine.min_file) == 0) strcpy(CommandLine.min_file, *argv); + } + if (argc) argv++; + } + + return 1; +} + +int CommandLineCustomConfFile(char *key, char *value, const TCommandLineCustom *custom) +{ + int i; + if (!custom) return 0; + for (i = 0; custom[i].type != COMMANDLINE_EOL; i++) { + if (custom[i].name) { + if (!strcasecmp(key, custom[i].name)) { + if (custom[i].type == COMMANDLINE_BOOL) { + if (custom[i].ref) *custom[i].ref = Str2Bool(value); + } else if (custom[i].type == COMMANDLINE_INT) { + if (custom[i].ref) *custom[i].ref = BetweenNum(atoi_Ex(value, 0), custom[i].numa, custom[i].numb); + } else if (custom[i].type == COMMANDLINE_STR) { + if (custom[i].ref) strcpy((char *)custom[i].ref, value); + } + return 1; + } + } + } + return 0; +} + +int CommandLineConfFile(const char *filename, const char *platcfgfile, const TCommandLineCustom *custom) +{ + FILE *fi = NULL; + char tmp[PMTMPV], *txt, *key, *value; + + CommandLine.pokefile = filename; + CommandLine.conffile = platcfgfile; + CommandLine.confcustom = custom; + + // Pre-load config callback + if (PokeMini_PreConfigLoad) { + if (!PokeMini_PreConfigLoad(filename, platcfgfile)) return 0; + } + + // Pokemini config file + PokeMini_GetCustomDir(tmp, PMTMPV); + PokeMini_GotoExecDir(); + fi = fopen(filename, "r"); + PokeMini_GotoCustomDir(tmp); + + if (fi) { + while ((txt = fgets(tmp, PMTMPV, fi)) != NULL) { + // Remove comments + RemoveComments(txt); + + // Break up key and value + if (!SeparateAtChar(txt, '=', &key, &value)) continue; + + // Trim them + key = TrimStr(key); + value = TrimStr(value); + + // Decode key and set CommandLine + if (!strcasecmp(key, "freebios")) CommandLine.forcefreebios = Str2Bool(value); + else if (!strcasecmp(key, "biosfile")) strncpy(CommandLine.bios_file, value, PMTMPV-1); + else if (!strcasecmp(key, "eepromfile")) strncpy(CommandLine.eeprom_file, value, PMTMPV-1); + else if (!strcasecmp(key, "statefile")) strncpy(CommandLine.state_file, value, PMTMPV-1); + else if (!strcasecmp(key, "romdir")) strncpy(CommandLine.rom_dir, value, PMTMPV-1); + else if (!strcasecmp(key, "rtc")) CommandLine.updatertc = BetweenNum(atoi_Ex(value, 2), 0, 2); + else if (!strcasecmp(key, "eepromshare")) CommandLine.eeprom_share = Str2Bool(value); + else if (!strcasecmp(key, "soundengine")) { + if (Str2Bool(value)) CommandLine.sound = 4; + else if (!strcasecmp(value, "generated")) CommandLine.sound = 1; + else if (!strcasecmp(value, "generate")) CommandLine.sound = 1; + else if (!strcasecmp(value, "gen")) CommandLine.sound = 1; + else if (!strcasecmp(value, "1")) CommandLine.sound = 1; + else if (!strcasecmp(value, "direct")) CommandLine.sound = 2; + else if (!strcasecmp(value, "2")) CommandLine.sound = 2; + else if (!strcasecmp(value, "emulated")) CommandLine.sound = 3; + else if (!strcasecmp(value, "emulate")) CommandLine.sound = 3; + else if (!strcasecmp(value, "emu")) CommandLine.sound = 3; + else if (!strcasecmp(value, "3")) CommandLine.sound = 3; + else if (!strcasecmp(value, "directpwm")) CommandLine.sound = 4; + else if (!strcasecmp(value, "pwm")) CommandLine.sound = 4; + else if (!strcasecmp(value, "4")) CommandLine.sound = 4; + else CommandLine.sound = 0; + } + else if (!strcasecmp(key, "piezo")) CommandLine.piezofilter = Str2Bool(value); + else if (!strcasecmp(key, "dotmatrix")) CommandLine.lcdfilter = Str2Bool(value) ? 1 : 0; // For compability + else if (!strcasecmp(key, "lcdfilter")) { + if (!strcasecmp(value, "scanline")) CommandLine.lcdfilter = 2; + else if (!strcasecmp(value, "matrix")) CommandLine.lcdfilter = 1; + else if (!strcasecmp(value, "none")) CommandLine.lcdfilter = 0; + else PokeDPrint(POKEMSG_ERR, "Conf Error: Invalid 'lcdfilter' value\n"); + } + else if (!strcasecmp(key, "lcdmode")) { + if (!strcasecmp(value, "2shades")) CommandLine.lcdmode = 2; + else if (!strcasecmp(value, "3shades")) CommandLine.lcdmode = 1; + else if (!strcasecmp(value, "analog")) CommandLine.lcdmode = 0; + else PokeDPrint(POKEMSG_ERR, "Conf Error: Invalid 'lcdmode' value\n"); + } + else if (!strcasecmp(key, "lowbattery")) CommandLine.low_battery = BetweenNum(atoi_Ex(value, 0), 0, 2); + else if (!strcasecmp(key, "palette")) CommandLine.palette = BetweenNum(atoi_Ex(value, 0), 0, 15); + else if (!strcasecmp(key, "rumblelvl")) CommandLine.rumblelvl = BetweenNum(atoi_Ex(value, 0), 0, 3); + else if (!strcasecmp(key, "joyenabled")) CommandLine.joyenabled = Str2Bool(value); + else if (!strcasecmp(key, "joyid")) CommandLine.joyid = BetweenNum(atoi_Ex(value, 0), 0, 15); + else if (!strcasecmp(key, "joyaxis_dpad")) CommandLine.joyaxis_dpad = Str2Bool(value); + else if (!strcasecmp(key, "joyhats_dpad")) CommandLine.joyhats_dpad = Str2Bool(value); + else if (!strcasecmp(key, "joyplatform")) strncpy(CommandLine.joyplatform, value, 31); + else if (!strcasecmp(key, "joybutton_menu")) CommandLine.joybutton[0] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_a")) CommandLine.joybutton[1] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_b")) CommandLine.joybutton[2] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_c")) CommandLine.joybutton[3] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_up")) CommandLine.joybutton[4] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_down")) CommandLine.joybutton[5] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_left")) CommandLine.joybutton[6] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_right")) CommandLine.joybutton[7] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_power")) CommandLine.joybutton[8] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "joybutton_shock")) CommandLine.joybutton[9] = BetweenNum(atoi_Ex(value, -1), -1, 32); + else if (!strcasecmp(key, "keyb_menu")) CommandLine.keyb_a[0] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_a")) CommandLine.keyb_a[1] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_b")) CommandLine.keyb_a[2] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_c")) CommandLine.keyb_a[3] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_up")) CommandLine.keyb_a[4] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_down")) CommandLine.keyb_a[5] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_left")) CommandLine.keyb_a[6] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_right")) CommandLine.keyb_a[7] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_power")) CommandLine.keyb_a[8] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_shock")) CommandLine.keyb_a[9] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_menu")) CommandLine.keyb_b[0] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_a")) CommandLine.keyb_b[1] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_b")) CommandLine.keyb_b[2] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_c")) CommandLine.keyb_b[3] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_up")) CommandLine.keyb_b[4] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_down")) CommandLine.keyb_b[5] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_left")) CommandLine.keyb_b[6] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_right")) CommandLine.keyb_b[7] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_power")) CommandLine.keyb_b[8] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "keyb_alt_shock")) CommandLine.keyb_b[9] = BetweenNum(atoi_Ex(value, 0), 0, PMKEYB_EOL-1); + else if (!strcasecmp(key, "custom1light")) CommandLine.custompal[0] = BetweenNum(atoi_Ex(value, 0xFFFFFF), 0x000000, 0xFFFFFF); + else if (!strcasecmp(key, "custom1dark")) CommandLine.custompal[1] = BetweenNum(atoi_Ex(value, 0x000000), 0x000000, 0xFFFFFF); + else if (!strcasecmp(key, "custom2light")) CommandLine.custompal[2] = BetweenNum(atoi_Ex(value, 0xFFFFFF), 0x000000, 0xFFFFFF); + else if (!strcasecmp(key, "custom2dark")) CommandLine.custompal[3] = BetweenNum(atoi_Ex(value, 0x000000), 0x000000, 0xFFFFFF); + else if (!strcasecmp(key, "multicart")) CommandLine.multicart = BetweenNum(atoi_Ex(value, 0), 0, 2); + else if (!strcasecmp(key, "synccycles")) CommandLine.synccycles = BetweenNum(atoi_Ex(value, 8), 8, 512); + else if (!strcasecmp(key, "lcdcontrast")) CommandLine.lcdcontrast = BetweenNum(atoi_Ex(value, 64), 0, 100); + else if (!strcasecmp(key, "lcdbright")) CommandLine.lcdbright = BetweenNum(atoi_Ex(value, 0), -100, 100); + else PokeDPrint(POKEMSG_ERR, "Conf warning: Unknown '%s' key\n", key); + } + fclose(fi); + } + + // Platform config file + if (platcfgfile && custom) { + PokeMini_GetCustomDir(tmp, PMTMPV); + PokeMini_GotoExecDir(); + fi = fopen(platcfgfile, "r"); + PokeMini_GotoCustomDir(tmp); + + if (fi) { + while ((txt = fgets(tmp, PMTMPV, fi)) != NULL) { + // Remove comments + RemoveComments(txt); + + // Break up key and value + if (!SeparateAtChar(txt, '=', &key, &value)) continue; + + // Trim them + key = TrimStr(key); + value = TrimStr(value); + + // Decode key and set CommandLine + if (!CommandLineCustomConfFile(key, value, custom)) { + PokeDPrint(POKEMSG_ERR, "Platform conf warning: Unknown '%s' key\n", key); + } + } + fclose(fi); + } + } + + return (fi != NULL); +} + +int CommandLineConfSave(void) +{ + const TCommandLineCustom *custom; + char tmp[PMTMPV]; + FILE *fo = NULL; + int i; + + // Pokemini config file + if (CommandLine.pokefile) { + PokeMini_GetCustomDir(tmp, PMTMPV); + PokeMini_GotoExecDir(); + fo = fopen(CommandLine.pokefile, "w"); + PokeMini_GotoCustomDir(tmp); + + if (fo) { + fprintf(fo, "# Config file generated by PokeMini %s\n", PokeMini_Version); + fprintf(fo, "# Read the documentation for full description of each item\n"); + fprintf(fo, "# Note that command-line will take priority\n\n"); + fprintf(fo, "# Default options\n"); + fprintf(fo, "freebios=%s\n", Bool2StrAf(CommandLine.forcefreebios)); + fprintf(fo, "biosfile=%s\n", CommandLine.bios_file); + fprintf(fo, "eepromfile=%s\n", CommandLine.eeprom_file); + fprintf(fo, "statefile=%s\n", CommandLine.state_file); + fprintf(fo, "romdir=%s\n", CommandLine.rom_dir); + fprintf(fo, "rtc=%d\n", CommandLine.updatertc); + fprintf(fo, "eepromshare=%s\n", Bool2StrAf(CommandLine.eeprom_share)); + if (CommandLine.sound == 4) fprintf(fo, "soundengine=directpwm\n"); + else if (CommandLine.sound == 3) fprintf(fo, "soundengine=emulated\n"); + else if (CommandLine.sound == 2) fprintf(fo, "soundengine=direct\n"); + else if (CommandLine.sound == 1) fprintf(fo, "soundengine=generated\n"); + else fprintf(fo, "soundengine=off\n"); + fprintf(fo, "piezo=%s\n", Bool2StrAf(CommandLine.piezofilter)); + if (CommandLine.lcdfilter == 2) fprintf(fo, "lcdfilter=scanline\n"); + else if (CommandLine.lcdfilter == 1) fprintf(fo, "lcdfilter=matrix\n"); + else fprintf(fo, "lcdfilter=none\n"); + if (CommandLine.lcdmode == 2) fprintf(fo, "lcdmode=2shades\n"); + else if (CommandLine.lcdmode == 1) fprintf(fo, "lcdmode=3shades\n"); + else fprintf(fo, "lcdmode=analog\n"); + fprintf(fo, "lowbattery=%d\n", CommandLine.low_battery); + fprintf(fo, "palette=%d\n", CommandLine.palette); + fprintf(fo, "rumblelvl=%d\n", CommandLine.rumblelvl); + fprintf(fo, "joyenabled=%s\n", Bool2StrAf(CommandLine.joyenabled)); + fprintf(fo, "joyid=%d\n", CommandLine.joyid); + fprintf(fo, "joyaxis_dpad=%s\n", Bool2StrAf(CommandLine.joyaxis_dpad)); + fprintf(fo, "joyhats_dpad=%s\n", Bool2StrAf(CommandLine.joyhats_dpad)); + fprintf(fo, "joyplatform=%s\n", CommandLine.joyplatform); + fprintf(fo, "joybutton_menu=%d\n", CommandLine.joybutton[0]); + fprintf(fo, "joybutton_a=%d\n", CommandLine.joybutton[1]); + fprintf(fo, "joybutton_b=%d\n", CommandLine.joybutton[2]); + fprintf(fo, "joybutton_c=%d\n", CommandLine.joybutton[3]); + fprintf(fo, "joybutton_up=%d\n", CommandLine.joybutton[4]); + fprintf(fo, "joybutton_down=%d\n", CommandLine.joybutton[5]); + fprintf(fo, "joybutton_left=%d\n", CommandLine.joybutton[6]); + fprintf(fo, "joybutton_right=%d\n", CommandLine.joybutton[7]); + fprintf(fo, "joybutton_power=%d\n", CommandLine.joybutton[8]); + fprintf(fo, "joybutton_shock=%d\n", CommandLine.joybutton[9]); + fprintf(fo, "keyb_menu=%d\n", CommandLine.keyb_a[0]); + fprintf(fo, "keyb_a=%d\n", CommandLine.keyb_a[1]); + fprintf(fo, "keyb_b=%d\n", CommandLine.keyb_a[2]); + fprintf(fo, "keyb_c=%d\n", CommandLine.keyb_a[3]); + fprintf(fo, "keyb_up=%d\n", CommandLine.keyb_a[4]); + fprintf(fo, "keyb_down=%d\n", CommandLine.keyb_a[5]); + fprintf(fo, "keyb_left=%d\n", CommandLine.keyb_a[6]); + fprintf(fo, "keyb_right=%d\n", CommandLine.keyb_a[7]); + fprintf(fo, "keyb_power=%d\n", CommandLine.keyb_a[8]); + fprintf(fo, "keyb_shock=%d\n", CommandLine.keyb_a[9]); + fprintf(fo, "keyb_alt_menu=%d\n", CommandLine.keyb_b[0]); + fprintf(fo, "keyb_alt_a=%d\n", CommandLine.keyb_b[1]); + fprintf(fo, "keyb_alt_b=%d\n", CommandLine.keyb_b[2]); + fprintf(fo, "keyb_alt_c=%d\n", CommandLine.keyb_b[3]); + fprintf(fo, "keyb_alt_up=%d\n", CommandLine.keyb_b[4]); + fprintf(fo, "keyb_alt_down=%d\n", CommandLine.keyb_b[5]); + fprintf(fo, "keyb_alt_left=%d\n", CommandLine.keyb_b[6]); + fprintf(fo, "keyb_alt_right=%d\n", CommandLine.keyb_b[7]); + fprintf(fo, "keyb_alt_power=%d\n", CommandLine.keyb_b[8]); + fprintf(fo, "keyb_alt_shock=%d\n", CommandLine.keyb_b[9]); + fprintf(fo, "custom1light=0x%06X\n", (unsigned int)CommandLine.custompal[0]); + fprintf(fo, "custom1dark=0x%06X\n", (unsigned int)CommandLine.custompal[1]); + fprintf(fo, "custom2light=0x%06X\n", (unsigned int)CommandLine.custompal[2]); + fprintf(fo, "custom2dark=0x%06X\n", (unsigned int)CommandLine.custompal[3]); + fprintf(fo, "multicart=%d\n", CommandLine.multicart); + fprintf(fo, "synccycles=%d\n", CommandLine.synccycles); + fprintf(fo, "lcdcontrast=%d\n", CommandLine.lcdcontrast); + fprintf(fo, "lcdbright=%d\n", CommandLine.lcdbright); + fclose(fo); + } + } + + // Platform config file + if (CommandLine.conffile && CommandLine.confcustom) { + PokeMini_GetCustomDir(tmp, PMTMPV); + PokeMini_GotoExecDir(); + fo = fopen(CommandLine.conffile, "w"); + PokeMini_GotoCustomDir(tmp); + + if (fo) { + fprintf(fo, "# Config file generated by PokeMini %s\n", PokeMini_Version); + fprintf(fo, "# Read the documentation for full description of each item\n"); + fprintf(fo, "# Note that command-line will take priority\n\n"); + fprintf(fo, "# Platform options\n"); + custom = CommandLine.confcustom; + for (i = 0; custom[i].type != COMMANDLINE_EOL; i++) { + if (custom[i].name) { + if (custom[i].type == COMMANDLINE_BOOL) { + fprintf(fo, "%s=%s\n", custom[i].name, *custom[i].ref ? "yes" : "no"); + } else if (custom[i].type == COMMANDLINE_INT) { + fprintf(fo, "%s=%d\n", custom[i].name, *custom[i].ref); + } else if (custom[i].type == COMMANDLINE_STR) { + fprintf(fo, "%s=%s\n", custom[i].name, (char *)custom[i].ref); + } + } + } + fclose(fo); + } + } + + // Post-save config callback + if (PokeMini_PostConfigSave) { + return PokeMini_PostConfigSave(fo != NULL, CommandLine.pokefile, CommandLine.conffile); + } + + return (fo != NULL); +} + +int CustomConfFile(const char *filename, const TCommandLineCustom *custom, TCustomConfCallback unknown) +{ + FILE *fi; + char tmp[PMTMPV], *txt, *key, *value; + + fi = fopen(filename, "r"); + if (!fi) return 0; + + while ((txt = fgets(tmp, PMTMPV, fi)) != NULL) { + // Remove comments + RemoveComments(txt); + + // Break up key and value + if (!SeparateAtChar(txt, '=', &key, &value)) continue; + + // Trim them + key = TrimStr(key); + value = TrimStr(value); + + // Decode key and set CommandLine + if (!CommandLineCustomConfFile(key, value, custom)) { + if (unknown) { + if (!unknown(key, value, custom)) { + fclose(fi); + return 0; + } + } + } + } + fclose(fi); + + return 1; +} + +int CustomConfSave(const char *filename, const TCommandLineCustom *custom, const char *description) +{ + FILE *fo; + int i; + + fo = fopen(filename, "w"); + if (!fo) return 0; + + fprintf(fo, "# Generated by PokeMini %s\n", PokeMini_Version); + fprintf(fo, "# %s\n", description); + for (i = 0; custom[i].type != COMMANDLINE_EOL; i++) { + if (custom[i].name) { + if (custom[i].type == COMMANDLINE_BOOL) { + fprintf(fo, "%s=%s\n", custom[i].name, *custom[i].ref ? "yes" : "no"); + } else if (custom[i].type == COMMANDLINE_INT) { + fprintf(fo, "%s=%d\n", custom[i].name, *custom[i].ref); + } else if (custom[i].type == COMMANDLINE_STR) { + fprintf(fo, "%s=%s\n", custom[i].name, (char *)custom[i].ref); + } + } + } + fclose(fo); + + return 1; +} + +void PrintHelpUsage(FILE *fout) +{ + fprintf(fout, "Usage:\n"); + fprintf(fout, "PokeMini [Options] rom.min\n\n"); + fprintf(fout, "Options:\n"); + fprintf(fout, " -freebios Force FreeBIOS\n"); + fprintf(fout, " -bios otherbios.min Load BIOS file\n"); + fprintf(fout, " -noeeprom Discard EEPROM data\n"); + fprintf(fout, " -eeprom pokemini.eep Load/Save EEPROM file\n"); + fprintf(fout, " -eepromshare Share EEPROM to all ROMs\n"); + fprintf(fout, " -noeepromshare Individual EEPROM for each ROM (def)\n"); + fprintf(fout, " -nostate Discard auto-state save (def)\n"); + fprintf(fout, " -state pokemini.sta Load/Save auto-state file\n"); + fprintf(fout, " -nortc No RTC\n"); + fprintf(fout, " -statertc RTC time difference in savestates\n"); + fprintf(fout, " -hostrtc RTC match the Host clock (def)\n"); + fprintf(fout, " -nosound Disable sound\n"); + fprintf(fout, " -sound Same as -sounddirectpwm (def)\n"); + fprintf(fout, " -sounddirect Use timer 3 directly for sound (def)\n"); + fprintf(fout, " -soundemulate Emulate sound circuit\n"); + fprintf(fout, " -sounddirectpwm Same as direct, can play PWM samples\n"); + fprintf(fout, " -nopiezo Disable piezo speaker filter\n"); + fprintf(fout, " -piezo Enable piezo speaker filter (def)\n"); + fprintf(fout, " -scanline 50%% Scanline LCD filter\n"); + fprintf(fout, " -dotmatrix LCD dot-matrix filter (def)\n"); + fprintf(fout, " -nofilter No LCD filter\n"); + fprintf(fout, " -2shades LCD Mode: No mixing\n"); + fprintf(fout, " -3shades LCD Mode: Grey emulation\n"); + fprintf(fout, " -analog LCD Mode: Pretend real LCD (def)\n"); + fprintf(fout, " -fullbattery Emulate with a full battery (def)\n"); + fprintf(fout, " -lowbattery Emulate with a weak battery\n"); + fprintf(fout, " -palette 0 Select palette for colors (0 to 15)\n"); + fprintf(fout, " -rumblelvl 3 Rumble level (0 to 3)\n"); + fprintf(fout, " -nojoystick Disable joystick (def)\n"); + fprintf(fout, " -joystick Enable joystick\n"); + fprintf(fout, " -joyid 0 Set joystick ID\n"); + fprintf(fout, " -custom1light 0xFFFFFF Palette Custom 1 Light\n"); + fprintf(fout, " -custom1dark 0x000000 Palette Custom 1 Dark\n"); + fprintf(fout, " -custom2light 0xFFFFFF Palette Custom 2 Light\n"); + fprintf(fout, " -custom2dark 0x000000 Palette Custom 2 Dark\n"); + fprintf(fout, " -synccycles 8 Number of cycles per hardware sync.\n"); + fprintf(fout, " -multicart 0 Multicart type (0 to 2)\n"); + fprintf(fout, " -lcdcontrast 64 LCD contrast boost in percent\n"); + fprintf(fout, " -lcdbright 0 LCD brightness offset in percent\n"); +} + +int PrintHelpUsageStr(char *out) +{ + if (out) { + strcpy(out, "Usage:\n"); + strcat(out, "PokeMini [Options] rom.min\n\n"); + strcat(out, "Options:\n"); + strcat(out, " -freebios Force FreeBIOS\n"); + strcat(out, " -bios otherbios.min Load BIOS file\n"); + strcat(out, " -noeeprom Discard EEPROM data\n"); + strcat(out, " -eeprom pokemini.eep Load/Save EEPROM file\n"); + strcat(out, " -eepromshare Share EEPROM to all ROMs (def)\n"); + strcat(out, " -noeepromshare Individual EEPROM for each ROM (def)\n"); + strcat(out, " -nostate Discard auto-state save (def)\n"); + strcat(out, " -state pokemini.sta Load/Save auto-state file\n"); + strcat(out, " -nortc No RTC\n"); + strcat(out, " -statertc RTC time difference in savestates\n"); + strcat(out, " -hostrtc RTC match the Host clock (def)\n"); + strcat(out, " -nosound Disable sound\n"); + strcat(out, " -sound Same as -sounddirectpwm (def)\n"); + strcat(out, " -sounddirect Use timer 3 directly for sound (def)\n"); + strcat(out, " -soundemulate Emulate sound circuit\n"); + strcat(out, " -sounddirectpwm Same as direct, can play PWM samples\n"); + strcat(out, " -nopiezo Disable piezo speaker filter\n"); + strcat(out, " -piezo Enable piezo speaker filter (def)\n"); + strcat(out, " -scanline 50%% Scanline LCD filter\n"); + strcat(out, " -dotmatrix LCD dot-matrix filter (def)\n"); + strcat(out, " -nofilter No LCD filter\n"); + strcat(out, " -2shades LCD Mode: No mixing\n"); + strcat(out, " -3shades LCD Mode: Grey emulation\n"); + strcat(out, " -analog LCD Mode: Pretend real LCD (def)\n"); + strcat(out, " -fullbattery Emulate with a full battery (def)\n"); + strcat(out, " -lowbattery Emulate with a weak battery\n"); + strcat(out, " -palette 0 Select palette for colors (0 to 15)\n"); + strcat(out, " -rumblelvl 3 Rumble level (0 to 3)\n"); + strcat(out, " -nojoystick Disable joystick (def)\n"); + strcat(out, " -joystick Enable joystick\n"); + strcat(out, " -joyid 0 Set joystick ID\n"); + strcat(out, " -custom1light 0xFFFFFF Palette Custom 1 Light\n"); + strcat(out, " -custom1dark 0x000000 Palette Custom 1 Dark\n"); + strcat(out, " -custom2light 0xFFFFFF Palette Custom 2 Light\n"); + strcat(out, " -custom2dark 0x000000 Palette Custom 2 Dark\n"); + strcat(out, " -synccycles 8 Number of cycles per hardware sync.\n"); + strcat(out, " -multicart 0 Multicart type (0 to 2)\n"); + strcat(out, " -lcdcontrast 64 LCD contrast boost in percent\n"); + strcat(out, " -lcdbright 0 LCD brightness offset in percent\n"); + } + return 4096; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/CommandLine.h b/PVPokeMini/PokeMini/pokemini-code/source/CommandLine.h new file mode 100644 index 0000000000..7bc3ae31f7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/CommandLine.h @@ -0,0 +1,100 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef COMMAND_LINE +#define COMMAND_LINE + +#include +#include + +typedef struct { + char name[32]; // Flag name + int *ref; // Reference pointer of the variable + int type; // Type (Bool or Integer) + int numa; // Minimum value for integer / Value to set + int numb; // Maximum value for integer +} TCommandLineCustom; + +enum { + COMMANDLINE_EOL, // End-Of-List + COMMANDLINE_BOOL, // Boolean + COMMANDLINE_INT, // Integer, NumA = Minimum, NumB = Maximum + COMMANDLINE_INTSET, // Set value (custom only), NumA = Value + COMMANDLINE_STR, // String, NumA = String size minus NULL +}; + +typedef struct { + int forcefreebios; + char min_file[PMTMPV]; + char bios_file[PMTMPV]; + char eeprom_file[PMTMPV]; + char state_file[PMTMPV]; + char rom_dir[PMTMPV]; + int updatertc; + int eeprom_share; + int sound; + int piezofilter; + int lcdfilter; + int lcdmode; + int low_battery; + int palette; + int rumblelvl; + int joyenabled; + int joyid; + int joyaxis_dpad; + int joyhats_dpad; + char joyplatform[32]; + int joybutton[10]; + int multicart; + int synccycles; + int keyb_a[10]; + int keyb_b[10]; + uint32_t custompal[4]; + int lcdcontrast; + int lcdbright; + const char *pokefile; + const char *conffile; + const TCommandLineCustom *confcustom; +} TCommandLine; + +// Extern command line structure +extern TCommandLine CommandLine; + +// Callbacks +extern int (*PokeMini_PreConfigLoad)(const char *filename, const char *platcfgfile); +extern int (*PokeMini_PostConfigSave)(int success, const char *filename, const char *platcfgfile); + +// Unknown key callback, return false to abort loading +typedef int (*TCustomConfCallback)(char *key, char *value, const TCommandLineCustom *custom); + +// Process arguments parsing into the command line structure +void CommandLineInit(void); +int CommandLineArgs(int argc, char **argv, const TCommandLineCustom *custom); +int CommandLineConfFile(const char *filename, const char *platcfgfile, const TCommandLineCustom *custom); +int CommandLineConfSave(void); + +// Process custom config file +int CustomConfFile(const char *filename, const TCommandLineCustom *custom, TCustomConfCallback unknown); +int CustomConfSave(const char *filename, const TCommandLineCustom *custom, const char *description); + +// Write into a stream/string the command line help usage +// PrintHelpUsageStr return number of bytes required for the output, "out" can be NULL +void PrintHelpUsage(FILE *fout); +int PrintHelpUsageStr(char *out); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Endianess.h b/PVPokeMini/PokeMini/pokemini-code/source/Endianess.h new file mode 100644 index 0000000000..bca9f32ab2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Endianess.h @@ -0,0 +1,52 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef ENDIANESS +#define ENDIANESS + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _BIG_ENDIAN +static __inline uint32_t Endian32(uint32_t val) +{ + return (val >> 24) | (val >> 8 & 0x0000FF00) | (val << 8 & 0x00FF0000) | (val << 24); +} +static __inline uint16_t Endian16(uint16_t val) +{ + return (val >> 8) | (val << 8); +} +#else +static __inline uint32_t Endian32(uint32_t val) +{ + return val; +} +static __inline uint16_t Endian16(uint16_t val) +{ + return val; +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Hardware.c b/PVPokeMini/PokeMini/pokemini-code/source/Hardware.c new file mode 100644 index 0000000000..6d0491b5a8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Hardware.c @@ -0,0 +1,337 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +// Emulate X cycles, return remaining +int PokeMini_EmulateCycles(int lcylc) +{ + if (RequireSoundSync) { + while (lcylc > 0) { + if (StallCPU) PokeHWCycles = StallCycles; + else PokeHWCycles = MinxCPU_Exec(); + MinxTimers_Sync(); + MinxPRC_Sync(); + MinxAudio_Sync(); + lcylc -= PokeHWCycles; + } + } else { + while (lcylc > 0) { + if (StallCPU) PokeHWCycles = StallCycles; + else PokeHWCycles = MinxCPU_Exec(); + MinxTimers_Sync(); + MinxPRC_Sync(); + lcylc -= PokeHWCycles; + } + } + + return lcylc; +} + +// Emulate 1 frame, return cycles ran +static int PokeMini_EmulateFrameRun; +int PokeMini_EmulateFrame(void) +{ + int lcylc = 0; + int synccylc = CommandLine.synccycles; + + PokeMini_EmulateFrameRun = 1; + + if (RequireSoundSync) { + while (PokeMini_EmulateFrameRun) { + PokeHWCycles = 0; + while (PokeHWCycles < synccylc) { + if (StallCPU) PokeHWCycles += StallCycles; + else PokeHWCycles += MinxCPU_Exec(); + } + MinxTimers_Sync(); + MinxPRC_Sync(); + MinxAudio_Sync(); + lcylc += PokeHWCycles; + } + } else { + while (PokeMini_EmulateFrameRun) { + PokeHWCycles = 0; + while (PokeHWCycles < synccylc) { + if (StallCPU) PokeHWCycles += StallCycles; + else PokeHWCycles += MinxCPU_Exec(); + } + MinxTimers_Sync(); + MinxPRC_Sync(); + lcylc += PokeHWCycles; + } + } + + return lcylc; +} + +// ------------------- +// Internal Processing +// ------------------- + +uint8_t MinxCPU_OnRead(int cpu, uint32_t addr) +{ +#ifdef PERFORMANCE + if (addr >= 0x2100) { + // ROM Read (ROM Cartridge) + if (PM_ROM) return PM_ROM[addr & PM_ROM_Mask]; +#else + if (addr >= 0x200000) { + // Open bus + return MinxCPU.IR; + } else if (addr >= 0x2100) { + // ROM Read (Multicard) + return MulticartRead(addr); +#endif + } else if (addr >= 0x2000) { + // I/O Read + uint8_t reg = (uint8_t)addr; + switch(reg) { + // Misc interface + case 0x00: // System Control 1 + return PMR_SYS_CTRL1; + case 0x01: // System Control 2 + return PMR_SYS_CTRL2; + case 0x02: // System Control 3 + return PMR_SYS_CTRL3; + + // IRQ interface + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2A: + return MinxIRQ_ReadReg(cpu, reg); + + // Timers interface + case 0x08: case 0x09: case 0x0A: case 0x0B: + case 0x18: case 0x19: case 0x1A: case 0x1B: + case 0x1C: case 0x1D: case 0x1E: case 0x1F: + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3A: case 0x3B: + case 0x3C: case 0x3D: case 0x3E: case 0x3F: + case 0x40: case 0x41: + case 0x48: case 0x49: case 0x4A: case 0x4B: + case 0x4C: case 0x4D: case 0x4E: case 0x4F: + return MinxTimers_ReadReg(reg); + + // Parallel I/O interface & Power + case 0x10: + case 0x44: case 0x45: case 0x46: case 0x47: + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: + case 0x60: case 0x61: case 0x62: + return MinxIO_ReadReg(cpu, reg); + + // Program Rendering Chip interface + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: case 0x8B: + case 0x8C: case 0x8D: case 0x8E: case 0x8F: + return MinxPRC_ReadReg(reg); + + // Color PRC interface + case 0xF0: case 0xF1: case 0xF2: case 0xF3: + case 0xF4: case 0xF5: case 0xF6: case 0xF7: + return MinxColorPRC_ReadReg(cpu, reg); + + // LCD interface + case 0xFE: case 0xFF: + return MinxLCD_ReadReg(cpu, reg); + + // Audio interface + case 0x70: case 0x71: + return MinxAudio_ReadReg(reg); + + // Open bus + default: + return MinxCPU.IR; + } + } else if (addr >= 0x1000) { + // RAM Read + return PM_RAM[addr-0x1000]; + } else { + // BIOS Read + return PM_BIOS[addr]; + } + return 0xFF; +} + +void MinxCPU_OnWrite(int cpu, uint32_t addr, uint8_t data) +{ +#ifdef PERFORMANCE + if (addr >= 0x2100) { + // Do nothing... +#else + if (addr >= 0x200000) { + // Open bus + } else if (addr >= 0x2100) { + // ROM Write + MulticartWrite(addr, data); +#endif + return; + } else if (addr >= 0x2000) { + // I/O Write + uint8_t reg = (uint8_t)addr; + switch(reg) { + // Misc interface + case 0x00: // System Control 1 + PMR_SYS_CTRL1 = data; + return; + case 0x01: // System Control 2 + PMR_SYS_CTRL2 = data; + return; + case 0x02: // System Control 3 + PMR_SYS_CTRL3 = data; + return; + + // IRQ interface + case 0x20: case 0x21: case 0x22: case 0x23: + case 0x24: case 0x25: case 0x26: case 0x27: + case 0x28: case 0x29: case 0x2A: + MinxIRQ_WriteReg(cpu, reg, data); + return; + + // Timers interface + case 0x08: case 0x09: case 0x0A: case 0x0B: + case 0x18: case 0x19: case 0x1A: case 0x1B: + case 0x1C: case 0x1D: case 0x1E: case 0x1F: + case 0x30: case 0x31: case 0x32: case 0x33: + case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3A: case 0x3B: + case 0x3C: case 0x3D: case 0x3E: case 0x3F: + case 0x40: case 0x41: + case 0x48: case 0x49: case 0x4A: case 0x4B: + case 0x4C: case 0x4D: case 0x4E: case 0x4F: + MinxTimers_WriteReg(reg, data); + return; + + // Parallel I/O interface & Power + case 0x10: + case 0x44: case 0x45: case 0x46: case 0x47: + case 0x50: case 0x51: case 0x52: case 0x53: + case 0x54: case 0x55: + case 0x60: case 0x61: case 0x62: + MinxIO_WriteReg(cpu, reg, data); + return; + + // Program Rendering Chip interface + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: + MinxPRC_WriteReg(reg, data); + return; + + // Color PRC interface + case 0xF0: case 0xF1: case 0xF2: case 0xF3: + case 0xF4: case 0xF5: case 0xF6: case 0xF7: + MinxColorPRC_WriteReg(reg, data); + return; + + // LCD interface + case 0xFE: case 0xFF: + MinxLCD_WriteReg(cpu, reg, data); + return; + + // Audio interface + case 0x70: case 0x71: + MinxAudio_WriteReg(reg, data); + return; + } + } else if (addr >= 0x1300) { + // RAM Write + PM_RAM[addr-0x1000] = data; + return; + } else if (addr >= 0x1000) { + // RAM Write / FrameBuffer + PM_RAM[addr-0x1000] = data; + if (PRCColorMap) MinxColorPRC_WriteFramebuffer(addr-0x1000, data); + return; + } else { + // BIOS Write (Ignored) + return; + } +} + +void MinxCPU_OnException(int type, uint32_t ir) +{ + switch (type) { + case EXCEPTION_UNKNOWN_INSTRUCTION: + PokeDPrint(POKEMSG_ERR, "Unknown instruction %08X before V=%02X,PC=%04X\n", (unsigned int)ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + return; + case EXCEPTION_CRASH_INSTRUCTION: + PokeDPrint(POKEMSG_ERR, "Crash instruction %08X before V=%02X,PC=%04X\n", (unsigned int)ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + return; + case EXCEPTION_UNSTABLE_INSTRUCTION: + PokeDPrint(POKEMSG_ERR, "Unstable instruction %08X before V=%02X,PC=%04X\n", (unsigned int)ir, (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + return; + case EXCEPTION_DIVISION_BY_ZERO: + PokeDPrint(POKEMSG_ERR, "Division by zero before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + return; + default: + return; + } +} + +void MinxCPU_OnSleep(int type) +{ + switch (type) { + case MINX_SLEEP_HALT: + //PokeDPrint(POKEMSG_ERR, "Halt called before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); // TOO NOISY! + return; + case MINX_SLEEP_STOP: + PokeDPrint(POKEMSG_ERR, "Sleep called before V=%02X,PC=%04X\n", (int)MinxCPU.PC.B.I, (int)MinxCPU.PC.W.L); + return; + default: + return; + } +} + +void MinxCPU_OnIRQHandle(uint8_t cpuflag, uint8_t shift_u) +{ + // Disable or enable master interrupt and check for interrupts + if (shift_u) { + MinxIRQ_MasterIRQ = 0; + } else { + if ((cpuflag & 0xC0) == 0xC0) MinxIRQ_MasterIRQ = 0; + else { + MinxIRQ_MasterIRQ = 1; + MinxIRQ_Process(); + } + } +} + +void MinxCPU_OnIRQAct(uint8_t intr) +{ + // Set and process interrupt + MinxIRQ_SetIRQ(intr); +} + +void MinxIRQ_OnIRQ(uint8_t intr) +{ + // From IRQ module, call the CPU interrupt + MinxCPU_CallIRQ(intr << 1); +} + +void MinxPRC_On72HzRefresh(int prcrender) +{ + // Frame rendered + if ((PokeMini_LCDMode == LCDMODE_3SHADES) && (prcrender)) memcpy(LCDPixelsA, LCDPixelsD, 96*64); + if (LCDDirty) MinxLCD_Render(); + if (PokeMini_LCDMode == LCDMODE_ANALOG) MinxLCD_DecayRefresh(); + PokeMini_EmulateFrameRun = 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Hardware.h b/PVPokeMini/PokeMini/pokemini-code/source/Hardware.h new file mode 100644 index 0000000000..d0668223cf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Hardware.h @@ -0,0 +1,28 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef HARDWARE_EMU +#define HARDWARE_EMU + +// Emulate X cycles, return remaining +int PokeMini_EmulateCycles(int lcylc); + +// Emulate 1 frame, return cycles ran +int PokeMini_EmulateFrame(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/IOMap.h b/PVPokeMini/PokeMini/pokemini-code/source/IOMap.h new file mode 100644 index 0000000000..9cc87180a0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/IOMap.h @@ -0,0 +1,122 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef IO_MAP_H +#define IO_MAP_H + +#include "PokeMini.h" + +// Pokemon-Mini I/O Registers +#define PM_IO (&PM_RAM[0x1000]) + +#define PMR_SYS_CTRL1 (PM_RAM[0x1000]) +#define PMR_SYS_CTRL2 (PM_RAM[0x1001]) +#define PMR_SYS_CTRL3 (PM_RAM[0x1002]) + +#define PMR_SEC_CTRL (PM_RAM[0x1008]) +#define PMR_SEC_CNT_LO (PM_RAM[0x1009]) +#define PMR_SEC_CNT_MID (PM_RAM[0x100A]) +#define PMR_SEC_CNT_HI (PM_RAM[0x100B]) + +#define PMR_SYS_BATT (PM_RAM[0x1010]) + +#define PMR_TMR1_SCALE (PM_RAM[0x1018]) +#define PMR_TMR1_ENA_OSC (PM_RAM[0x1019]) +#define PMR_TMR1_OSC (PM_RAM[0x1019]) +#define PMR_TMR2_SCALE (PM_RAM[0x101A]) +#define PMR_TMR2_OSC (PM_RAM[0x101B]) +#define PMR_TMR3_SCALE (PM_RAM[0x101C]) +#define PMR_TMR3_OSC (PM_RAM[0x101D]) + +#define PMR_IRQ_PRI1 (PM_RAM[0x1020]) +#define PMR_IRQ_PRI2 (PM_RAM[0x1021]) +#define PMR_IRQ_PRI3 (PM_RAM[0x1022]) +#define PMR_IRQ_ENA1 (PM_RAM[0x1023]) +#define PMR_IRQ_ENA2 (PM_RAM[0x1024]) +#define PMR_IRQ_ENA3 (PM_RAM[0x1025]) +#define PMR_IRQ_ENA4 (PM_RAM[0x1026]) +#define PMR_IRQ_ACT1 (PM_RAM[0x1027]) +#define PMR_IRQ_ACT2 (PM_RAM[0x1028]) +#define PMR_IRQ_ACT3 (PM_RAM[0x1029]) +#define PMR_IRQ_ACT4 (PM_RAM[0x102A]) + +#define PMR_TMR1_CTRL_L (PM_RAM[0x1030]) +#define PMR_TMR1_CTRL_H (PM_RAM[0x1031]) +#define PMR_TMR1_PRE_L (PM_RAM[0x1032]) +#define PMR_TMR1_PRE_H (PM_RAM[0x1033]) +#define PMR_TMR1_PVT_L (PM_RAM[0x1034]) +#define PMR_TMR1_PVT_H (PM_RAM[0x1035]) +#define PMR_TMR1_CNT_L (PM_RAM[0x1036]) +#define PMR_TMR1_CNT_H (PM_RAM[0x1037]) + +#define PMR_TMR2_CTRL_L (PM_RAM[0x1038]) +#define PMR_TMR2_CTRL_H (PM_RAM[0x1039]) +#define PMR_TMR2_PRE_L (PM_RAM[0x103A]) +#define PMR_TMR2_PRE_H (PM_RAM[0x103B]) +#define PMR_TMR2_PVT_L (PM_RAM[0x103C]) +#define PMR_TMR2_PVT_H (PM_RAM[0x103D]) +#define PMR_TMR2_CNT_L (PM_RAM[0x103E]) +#define PMR_TMR2_CNT_H (PM_RAM[0x103F]) + +#define PMR_TMR256_CTRL (PM_RAM[0x1040]) +#define PMR_TMR256_CNT (PM_RAM[0x1041]) + +#define PMR_REG_44 (PM_RAM[0x1044]) +#define PMR_REG_45 (PM_RAM[0x1045]) +#define PMR_REG_46 (PM_RAM[0x1046]) +#define PMR_REG_47 (PM_RAM[0x1047]) + +#define PMR_TMR3_CTRL_L (PM_RAM[0x1048]) +#define PMR_TMR3_CTRL_H (PM_RAM[0x1049]) +#define PMR_TMR3_PRE_L (PM_RAM[0x104A]) +#define PMR_TMR3_PRE_H (PM_RAM[0x104B]) +#define PMR_TMR3_PVT_L (PM_RAM[0x104C]) +#define PMR_TMR3_PVT_H (PM_RAM[0x104D]) +#define PMR_TMR3_CNT_L (PM_RAM[0x104E]) +#define PMR_TMR3_CNT_H (PM_RAM[0x104F]) + +#define PMR_REG_50 (PM_RAM[0x1050]) +#define PMR_REG_51 (PM_RAM[0x1051]) +#define PMR_KEY_PAD (PM_RAM[0x1052]) +#define PMR_REG_53 (PM_RAM[0x1053]) +#define PMR_REG_54 (PM_RAM[0x1054]) +#define PMR_REG_55 (PM_RAM[0x1055]) + +#define PMR_IO_DIR (PM_RAM[0x1060]) +#define PMR_IO_DATA (PM_RAM[0x1061]) +#define PMR_REG_62 (PM_RAM[0x1062]) + +#define PMR_AUD_CTRL (PM_RAM[0x1070]) +#define PMR_AUD_VOL (PM_RAM[0x1071]) + +#define PMR_PRC_MODE (PM_RAM[0x1080]) +#define PMR_PRC_RATE (PM_RAM[0x1081]) +#define PMR_PRC_MAP_LO (PM_RAM[0x1082]) +#define PMR_PRC_MAP_MID (PM_RAM[0x1083]) +#define PMR_PRC_MAP_HI (PM_RAM[0x1084]) +#define PMR_PRC_SCROLL_Y (PM_RAM[0x1085]) +#define PMR_PRC_SCROLL_X (PM_RAM[0x1086]) +#define PMR_PRC_SPR_LO (PM_RAM[0x1087]) +#define PMR_PRC_SPR_MID (PM_RAM[0x1088]) +#define PMR_PRC_SPR_HI (PM_RAM[0x1089]) +#define PMR_PRC_CNT (PM_RAM[0x108A]) + +#define PMR_LCD_CTRL (PM_RAM[0x10FE]) +#define PMR_LCD_DATA (PM_RAM[0x10FF]) + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Joystick.c b/PVPokeMini/PokeMini/pokemini-code/source/Joystick.c new file mode 100644 index 0000000000..63ca7000e3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Joystick.c @@ -0,0 +1,387 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "CommandLine.h" + +#include "Joystick.h" + +// Temp joystick map +static int TMP_enable; +static int TMP_deviceid; +static int TMP_axis_dpad; +static int TMP_hats_dpad; +static int TMP_joy[10]; +static int JoyTestMode = 0; +static int JoyLastButton = -1; +static int JoyLastXAxis = 0; +static int JoyLastYAxis = 0; +static int JoyLastHat = 0; +static int JoyDeadZone = 30000; +static int JoyAllowDisable = 1; +static char **Joybuttons_names = NULL; +static int Joybuttons_num = JOY_BUTTONS; +static TJoystickUpdateCB JoystickUpdateCB = NULL; +static const char *JoyLastIndexStr[] = { + "None", + "Left", + "Right", + "Up", + "Down" +}; + +// Joystick menu +int UIItems_JoystickC(int index, int reason); +TUIMenu_Item UIItems_Joystick[] = { + { 0, 0, "Go back...", UIItems_JoystickC }, + { 0, 1, "Apply changes...", UIItems_JoystickC }, + { 0, 21, "Check inputs...", UIItems_JoystickC }, + { 0, 2, "Enable Joystick: %s", UIItems_JoystickC }, + { 0, 20, "Device Index: %i", UIItems_JoystickC }, + { 0, 3, "Axis as D-Pad: %s", UIItems_JoystickC }, + { 0, 4, "Hats as D-Pad: %s", UIItems_JoystickC }, + { 0, 8, "Menu", UIItems_JoystickC }, + { 0, 9, "A", UIItems_JoystickC }, + { 0, 10, "B", UIItems_JoystickC }, + { 0, 11, "C", UIItems_JoystickC }, + { 0, 12, "Up", UIItems_JoystickC }, + { 0, 13, "Down", UIItems_JoystickC }, + { 0, 14, "Left", UIItems_JoystickC }, + { 0, 15, "Right", UIItems_JoystickC }, + { 0, 16, "Power", UIItems_JoystickC }, + { 0, 17, "Shake", UIItems_JoystickC }, + { 9, 0, "Joystick", UIItems_JoystickC } +}; + +static const char *PM_Keys[] = { + "Menu", + "A", + "B", + "C", + "Up", + "Down", + "Left", + "Right", + "Power", + "Shake" +}; + +int JoyTestButtons(int line, char *outtext) +{ + if (outtext == NULL) { + JoyTestMode = line; + return 0; + } + if (line == 0) { + if (JoyLastButton == -1) { + sprintf(outtext, "Last button: None"); + } else if (Joybuttons_names && (JoyLastButton < Joybuttons_num)) { + sprintf(outtext, "Last button: %s", Joybuttons_names[JoyLastButton+1]); + } else { + sprintf(outtext, "Last button: %i", JoyLastButton); + } + } + if (line == 1) sprintf(outtext, "Last hat: %s", JoyLastIndexStr[JoyLastHat]); + if (line == 2) sprintf(outtext, "X-Axis: %i", JoyLastXAxis); + if (line == 3) sprintf(outtext, "Y-Axis: %i", JoyLastYAxis); + return line < 4; +} + +int UIItems_JoystickC(int index, int reason) +{ + int i; + if (reason == UIMENU_OK) { + reason = UIMENU_RIGHT; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + return 1; + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 2: + TMP_enable = !TMP_enable; + break; + case 3: + TMP_axis_dpad = !TMP_axis_dpad; + break; + case 4: + TMP_hats_dpad = !TMP_hats_dpad; + break; + case 8: case 9: case 10: case 11: + case 12: case 13: case 14: case 15: + case 16: case 17: + if (Joybuttons_names) { + do { + TMP_joy[index-8]--; + if (TMP_joy[index-8] < -1) TMP_joy[index-8] = Joybuttons_num-1; + } while (!Joybuttons_names[TMP_joy[index-8]+1]); + } else { + TMP_joy[index-8]--; + if (TMP_joy[index-8] < -1) TMP_joy[index-8] = Joybuttons_num-1; + } + break; + case 20: + TMP_deviceid--; + if (TMP_deviceid < 0) TMP_deviceid = 0; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 0: UIMenu_PrevMenu(); + break; + case 1: CommandLine.joyenabled = TMP_enable; + CommandLine.joyaxis_dpad = TMP_axis_dpad; + CommandLine.joyhats_dpad = TMP_hats_dpad; + CommandLine.joyid = TMP_deviceid; + for (i=0; i<10; i++) { + CommandLine.joybutton[i] = TMP_joy[i]; + } + UIMenu_BeginMessage(); + UIMenu_SetMessage("Joystick definition..", 1); + UIMenu_SetMessage("", 1); + UIMenu_SetMessage("Changes applied!", 0); + UIMenu_EndMessage(60); + if (JoystickUpdateCB) JoystickUpdateCB(CommandLine.joyenabled, CommandLine.joyid); + break; + case 2: + TMP_enable = !TMP_enable; + break; + case 3: + TMP_axis_dpad = !TMP_axis_dpad; + break; + case 4: + TMP_hats_dpad = !TMP_hats_dpad; + break; + case 8: case 9: case 10: case 11: + case 12: case 13: case 14: case 15: + case 16: case 17: + if (Joybuttons_names) { + do { + TMP_joy[index-8]++; + if (TMP_joy[index-8] >= Joybuttons_num) TMP_joy[index-8] = -1; + } while (!Joybuttons_names[TMP_joy[index-8]+1]); + } else { + TMP_joy[index-8]++; + if (TMP_joy[index-8] >= Joybuttons_num) TMP_joy[index-8] = -1; + } + break; + case 20: + TMP_deviceid++; + if (TMP_deviceid >= 32) TMP_deviceid = 31; + break; + case 21: + JoyLastButton = -1; + JoyLastXAxis = 0; + JoyLastYAxis = 0; + JoyLastHat = 0; + UIMenu_RealTimeMessage(JoyTestButtons); + break; + } + } + if (JoyAllowDisable) UIMenu_ChangeItem(UIItems_Joystick, 2, "Enable Joystick: %s", TMP_enable ? "Yes" : "No"); + else UIMenu_ChangeItem(UIItems_Joystick, 2, "Enable Joystick: Yes"); + UIMenu_ChangeItem(UIItems_Joystick, 3, "Axis as D-Pad: %s", TMP_axis_dpad ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Joystick, 4, "Hats as D-Pad: %s", TMP_hats_dpad ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Joystick, 20, "Device Index: %i", TMP_deviceid); + if (Joybuttons_names) { + for (i=0; i<10; i++) { + if (Joybuttons_names[TMP_joy[i]+1]) UIMenu_ChangeItem(UIItems_Joystick, i+8, "%s Key: %s", PM_Keys[i], Joybuttons_names[TMP_joy[i]+1]); + else UIMenu_ChangeItem(UIItems_Joystick, i+8, "%s Key: Invalid", PM_Keys[i]); + } + } else { + for (i=0; i<10; i++) { + if (TMP_joy[i] == -1) UIMenu_ChangeItem(UIItems_Joystick, i+8, "%s Key: Off", PM_Keys[i]); + else UIMenu_ChangeItem(UIItems_Joystick, i+8, "%s Key: Button %d", PM_Keys[i], TMP_joy[i]); + } + } + return 1; +} + +// Setup joystick +void JoystickSetup(char *platform, int allowdisable, int deadzone, char **bnames, int numbuttons, int *mapping) +{ + int i; + if (strcmp(platform, CommandLine.joyplatform)) { + // If platform doesn't match, load default buttons + if (mapping) { + for (i=0; i<10; i++) CommandLine.joybutton[i] = mapping[i]; + } + } + JoyAllowDisable = allowdisable; + JoyDeadZone = deadzone; + Joybuttons_names = bnames; + Joybuttons_num = numbuttons; + if (Joybuttons_num <= 0) Joybuttons_num = JOY_BUTTONS; +} + +// Enter into the joystick menu +void JoystickEnterMenu(void) +{ + int i; + TMP_enable = CommandLine.joyenabled; + TMP_axis_dpad = CommandLine.joyaxis_dpad; + TMP_hats_dpad = CommandLine.joyhats_dpad; + for (i=0; i<10; i++) { + if (CommandLine.joybutton[i] >= Joybuttons_num) TMP_joy[i] = -1; + else TMP_joy[i] = CommandLine.joybutton[i]; + } + UIMenu_LoadItems(UIItems_Joystick, 0); +} + +// Register callback of when the joystick configs get updated +void JoystickUpdateCallback(TJoystickUpdateCB cb) +{ + JoystickUpdateCB = cb; + if (JoystickUpdateCB) JoystickUpdateCB(CommandLine.joyenabled, CommandLine.joyid); +} + +// Process joystick buttons packed in bits +void JoystickBitsEvent(uint32_t pressbits) +{ + static uint32_t lastpressbits; + uint32_t maskbit, togglebits = pressbits ^ lastpressbits; + int index, joybutton, pressed; + + if (!CommandLine.joyenabled && JoyAllowDisable) { + lastpressbits = pressbits; + return; + } + + if (JoyTestMode) { + pressed = pressbits & togglebits; + for (index=0; index<32; index++) { + if (pressed & (1 << index)) JoyLastButton = index; + } + } + + for (index=0; index<10; index++) { + joybutton = CommandLine.joybutton[index]; + if (joybutton >= 0) { + maskbit = (1 << joybutton); + if (togglebits & maskbit) { + if (index) { + UIMenu_KeyEvent(index, (pressbits & maskbit) ? 1 : 0); + } else { + if (pressbits & maskbit) UI_Status = !UI_Status; + } + } + } + } + + lastpressbits = pressbits; +} + +// Process joystick buttons +void JoystickButtonsEvent(int button, int pressed) +{ + int index; + + if (!CommandLine.joyenabled && JoyAllowDisable) return; + + if (pressed) JoyLastButton = button; + + for (index=0; index<10; index++) { + if (CommandLine.joybutton[index] == button) { + if (index) { + UIMenu_KeyEvent(index, pressed); + } else { + if (pressed) UI_Status = !UI_Status; + } + } + } +} + +// Process joystick axis +void JoystickAxisEvent(int axis, int value) +{ + static int lastaxis0value = 0; + static int lastaxis1value = 0; + + if (!CommandLine.joyenabled && JoyAllowDisable) { + lastaxis1value = 0; + lastaxis0value = 0; + return; + } + + if (axis) JoyLastYAxis = value; + else JoyLastXAxis = value; + + if (CommandLine.joyaxis_dpad) { + if (axis) { + // Up and down + if ((value < -JoyDeadZone) && (lastaxis1value >= -JoyDeadZone)) { + UIMenu_KeyEvent(MINX_KEY_UP, 1); + } else if ((value > JoyDeadZone) && (lastaxis1value <= JoyDeadZone)) { + UIMenu_KeyEvent(MINX_KEY_DOWN, 1); + } else if ((value > -JoyDeadZone) && (value <= JoyDeadZone) && + ((lastaxis1value <= -JoyDeadZone) || (lastaxis1value >= JoyDeadZone))) { + UIMenu_KeyEvent(MINX_KEY_UP, 0); + UIMenu_KeyEvent(MINX_KEY_DOWN, 0); + } + lastaxis1value = value; + } else { + // Left and right + if ((value < -JoyDeadZone) && (lastaxis0value >= -JoyDeadZone)) { + UIMenu_KeyEvent(MINX_KEY_LEFT, 1); + } else if ((value > JoyDeadZone) && (lastaxis0value <= JoyDeadZone)) { + UIMenu_KeyEvent(MINX_KEY_RIGHT, 1); + } else if ((value > -JoyDeadZone) && (value <= JoyDeadZone) && + ((lastaxis0value <= -JoyDeadZone) || (lastaxis0value >= JoyDeadZone))) { + UIMenu_KeyEvent(MINX_KEY_LEFT, 0); + UIMenu_KeyEvent(MINX_KEY_RIGHT, 0); + } + lastaxis0value = value; + } + } +} + +// Process joystick hats +#define HAT_ONPRESS(a) ((hatsbitfield & (a)) && !(lasthatvalue & (a))) +#define HAT_ONRELEASE(a) (!(hatsbitfield & (a)) && (lasthatvalue & (a))) +#define HAT_ONCHANGE(a) ((hatsbitfield & (a)) ^ (lasthatvalue & (a))) +void JoystickHatsEvent(int hatsbitfield) +{ + static int lasthatvalue = 0; + + if (!CommandLine.joyenabled && JoyAllowDisable) { + lasthatvalue = hatsbitfield; + return; + } + + if (CommandLine.joyhats_dpad) { + if (HAT_ONCHANGE(JHAT_LEFT)) { + if (HAT_ONPRESS(JHAT_LEFT)) { UIMenu_KeyEvent(MINX_KEY_LEFT, 1); JoyLastHat = 0; } + if (HAT_ONRELEASE(JHAT_LEFT)) UIMenu_KeyEvent(MINX_KEY_LEFT, 0); + } + if (HAT_ONCHANGE(JHAT_RIGHT)) { + if (HAT_ONPRESS(JHAT_RIGHT)) { UIMenu_KeyEvent(MINX_KEY_RIGHT, 1); JoyLastHat = 1; } + if (HAT_ONRELEASE(JHAT_RIGHT)) UIMenu_KeyEvent(MINX_KEY_RIGHT, 0); + } + if (HAT_ONCHANGE(JHAT_UP)) { + if (HAT_ONPRESS(JHAT_UP)) { UIMenu_KeyEvent(MINX_KEY_UP, 1); JoyLastHat = 2; } + if (HAT_ONRELEASE(JHAT_UP)) UIMenu_KeyEvent(MINX_KEY_UP, 0); + } + if (HAT_ONCHANGE(JHAT_DOWN)) { + if (HAT_ONPRESS(JHAT_DOWN)) { UIMenu_KeyEvent(MINX_KEY_DOWN, 1); JoyLastHat = 3; } + if (HAT_ONRELEASE(JHAT_DOWN)) UIMenu_KeyEvent(MINX_KEY_DOWN, 0); + } + } + lasthatvalue = hatsbitfield; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Joystick.h b/PVPokeMini/PokeMini/pokemini-code/source/Joystick.h new file mode 100644 index 0000000000..aa18b1a064 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Joystick.h @@ -0,0 +1,57 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_JOYSTICK +#define POKEMINI_JOYSTICK + +#include "UI.h" + +#define JOY_BUTTONS (32) + +#define JHAT_UP (0x01) +#define JHAT_RIGHT (0x02) +#define JHAT_DOWN (0x04) +#define JHAT_LEFT (0x08) + +typedef void (*TJoystickUpdateCB)(int enable, int deviceid); + +// Joystick menu items +extern TUIMenu_Item UIItems_Joystick[]; + +// Setup joystick +void JoystickSetup(char *platform, int allowdisable, int deadzone, char **bnames, int numbuttons, int *mapping); + +// Enter into the joystick menu +void JoystickEnterMenu(void); + +// Register callback of when the joystick configs get updated +void JoystickUpdateCallback(TJoystickUpdateCB cb); + +// Process joystick buttons packed in bits +void JoystickBitsEvent(uint32_t pressbits); + +// Process joystick buttons +void JoystickButtonsEvent(int button, int pressed); + +// Process joystick axis +void JoystickAxisEvent(int axis, int value); + +// Process joystick hats +void JoystickHatsEvent(int hatsbitfield); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Keyboard.c b/PVPokeMini/PokeMini/pokemini-code/source/Keyboard.c new file mode 100644 index 0000000000..eea741d7cf --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Keyboard.c @@ -0,0 +1,284 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "CommandLine.h" + +#include "Keyboard.h" + +// Keyboard re-mapping +TKeyboardRemap *KeyboardHostRemap = NULL; + +// Keyboard mapping with host keysym +int KeyboardMapHostKeysym_A[10]; +int KeyboardMapHostKeysym_B[10]; + +// Temp keyboard map +static int TMP_keyb_a[10]; +static int TMP_keyb_b[10]; +static int KeyLastKey = -1; + +// Keyboard character names +const char *KeyboardMapStr[PMKEYB_EOL] = { + "NONE", "ESCAPE", "RETURN", + "BACKSPACE", "TAB", "BACKQUOTE", + + "RSHIFT", "LSHIFT", + "RCTRL", "LCTRL", + "RALT", "LALT", + + "INSERT", "DELETE", + "HOME", "END", + "PAGEUP", "PAGEDOWN", + + "NUMLOCK", "CAPSLOCK", "SCROLLLOCK", + "KP_PERIOD", "KP_DIVIDE", + "KP_MULTIPLY", "KP_MINUS", + "KP_PLUS", "KP_ENTER", + "KP_EQUALS", + + "UP", "DOWN", "RIGHT", "LEFT", + + "SPACE", "EXCLAIM", "QUOTEDBL", "HASH", + "DOLLAR", "PERCENT", "AMPERSAND", "QUOTE", + "LEFTPAREN", "RIGHTPAREN", "ASTERISK", "PLUS", + "COMMA", "MINUS", "PERIOD", "SLASH", + + "0", "1", "2", "3", "4", + "5", "6", "7", "8", "9", + + "COLON", "SEMICOLON", "LESS", + "EQUALS", "GREATER", "QUESTION", "AT", + + "A", "B", "C", "D", "E", "F", + "G", "H", "I", "J", "K", "L", + "M", "N", "O", "P", "Q", "R", + "S", "T", "U", "V", "W", "X", + "Y", "Z", + + "LEFTBRACK", "BACKSLASH", + "RIGHTBRACK", "CARET", + "UNDERSCORE", + + "KP_0", "KP_1", "KP_2", "KP_3", "KP_4", + "KP_5", "KP_6", "KP_7", "KP_8", "KP_9" +}; + +static const char *GetKeyboardMapStr(int index) +{ + if ((index < 0) || (index >= PMKEYB_EOL)) index = 0; + return KeyboardMapStr[index]; +} + +void KeyboardRemap(TKeyboardRemap *keymap) +{ + int i, k; + if (keymap) KeyboardHostRemap = keymap; + if (!KeyboardHostRemap) return; + for (i=0; i<10; i++) { + k = CommandLine.keyb_a[i]; + if ((k < 0) || (k >= PMKEYB_EOL)) k = 0; + KeyboardMapHostKeysym_A[i] = (*KeyboardHostRemap)[k]; + k = CommandLine.keyb_b[i]; + if ((k < 0) || (k >= PMKEYB_EOL)) k = 0; + KeyboardMapHostKeysym_B[i] = (*KeyboardHostRemap)[k]; + } +} + +// Joystick menu +int UIItems_KeyboardC(int index, int reason); +TUIMenu_Item UIItems_Keyboard[] = { + { 0, 0, "Go back...", UIItems_KeyboardC }, + { 0, 1, "Apply changes...", UIItems_KeyboardC }, + { 0, 40, "Check inputs...", UIItems_KeyboardC }, + { 0, 4, "Menu Key: %s", UIItems_KeyboardC }, + { 0, 5, "A Key: %s", UIItems_KeyboardC }, + { 0, 6, "B Key: %s", UIItems_KeyboardC }, + { 0, 7, "C Key: %s", UIItems_KeyboardC }, + { 0, 8, "Up Key: %s", UIItems_KeyboardC }, + { 0, 9, "Down Key: %s", UIItems_KeyboardC }, + { 0, 10, "Left Key: %s", UIItems_KeyboardC }, + { 0, 11, "Right Key: %s", UIItems_KeyboardC }, + { 0, 12, "Power Key: %s", UIItems_KeyboardC }, + { 0, 13, "Shake Key: %s", UIItems_KeyboardC }, + { 0, 24, "Menu Alt: %s", UIItems_KeyboardC }, + { 0, 25, "A Alt: %s", UIItems_KeyboardC }, + { 0, 26, "B Alt: %s", UIItems_KeyboardC }, + { 0, 27, "C Alt: %s", UIItems_KeyboardC }, + { 0, 28, "Up Alt: %s", UIItems_KeyboardC }, + { 0, 29, "Down Alt: %s", UIItems_KeyboardC }, + { 0, 30, "Left Alt: %s", UIItems_KeyboardC }, + { 0, 31, "Right Alt: %s", UIItems_KeyboardC }, + { 0, 32, "Power Alt: %s", UIItems_KeyboardC }, + { 0, 33, "Shake Alt: %s", UIItems_KeyboardC }, + { 9, 0, "Keyboard", UIItems_KeyboardC } +}; + +int KeyboardTestButtons(int line, char *outtext) +{ + int i, key = 0; + if (line == 0) { + if (KeyLastKey == -1) sprintf(outtext, "Last key: None"); + else { + for (i=0; i= PMKEYB_EOL) TMP_keyb_a[index-4] = 0; + break; + case 24: case 25: case 26: case 27: + case 28: case 29: case 30: case 31: + case 32: case 33: + TMP_keyb_b[index-24]++; + if (TMP_keyb_b[index-24] >= PMKEYB_EOL) TMP_keyb_b[index-24] = 0; + break; + case 40: + KeyLastKey = -1; + UIMenu_RealTimeMessage(KeyboardTestButtons); + break; + } + } + UIMenu_ChangeItem(UIItems_Keyboard, 4, "Menu Key: %s", GetKeyboardMapStr(TMP_keyb_a[0])); + UIMenu_ChangeItem(UIItems_Keyboard, 5, "A Key: %s", GetKeyboardMapStr(TMP_keyb_a[1])); + UIMenu_ChangeItem(UIItems_Keyboard, 6, "B Key: %s", GetKeyboardMapStr(TMP_keyb_a[2])); + UIMenu_ChangeItem(UIItems_Keyboard, 7, "C Key: %s", GetKeyboardMapStr(TMP_keyb_a[3])); + UIMenu_ChangeItem(UIItems_Keyboard, 8, "Up Key: %s", GetKeyboardMapStr(TMP_keyb_a[4])); + UIMenu_ChangeItem(UIItems_Keyboard, 9, "Down Key: %s", GetKeyboardMapStr(TMP_keyb_a[5])); + UIMenu_ChangeItem(UIItems_Keyboard, 10, "Left Key: %s", GetKeyboardMapStr(TMP_keyb_a[6])); + UIMenu_ChangeItem(UIItems_Keyboard, 11, "Right Key: %s", GetKeyboardMapStr(TMP_keyb_a[7])); + UIMenu_ChangeItem(UIItems_Keyboard, 12, "Power Key: %s", GetKeyboardMapStr(TMP_keyb_a[8])); + UIMenu_ChangeItem(UIItems_Keyboard, 13, "Shake Key: %s", GetKeyboardMapStr(TMP_keyb_a[9])); + UIMenu_ChangeItem(UIItems_Keyboard, 24, "Menu Alt: %s", GetKeyboardMapStr(TMP_keyb_b[0])); + UIMenu_ChangeItem(UIItems_Keyboard, 25, "A Alt: %s", GetKeyboardMapStr(TMP_keyb_b[1])); + UIMenu_ChangeItem(UIItems_Keyboard, 26, "B Alt: %s", GetKeyboardMapStr(TMP_keyb_b[2])); + UIMenu_ChangeItem(UIItems_Keyboard, 27, "C Alt: %s", GetKeyboardMapStr(TMP_keyb_b[3])); + UIMenu_ChangeItem(UIItems_Keyboard, 28, "Up Alt: %s", GetKeyboardMapStr(TMP_keyb_b[4])); + UIMenu_ChangeItem(UIItems_Keyboard, 29, "Down Alt: %s", GetKeyboardMapStr(TMP_keyb_b[5])); + UIMenu_ChangeItem(UIItems_Keyboard, 30, "Left Alt: %s", GetKeyboardMapStr(TMP_keyb_b[6])); + UIMenu_ChangeItem(UIItems_Keyboard, 31, "Right Alt: %s", GetKeyboardMapStr(TMP_keyb_b[7])); + UIMenu_ChangeItem(UIItems_Keyboard, 32, "Power Alt: %s", GetKeyboardMapStr(TMP_keyb_b[8])); + UIMenu_ChangeItem(UIItems_Keyboard, 33, "Shake Alt: %s", GetKeyboardMapStr(TMP_keyb_b[9])); + return 1; +} + +// Enter into the keyboard menu +void KeyboardEnterMenu(void) +{ + int i; + for (i=0; i<10; i++) { + TMP_keyb_a[i] = CommandLine.keyb_a[i]; + TMP_keyb_b[i] = CommandLine.keyb_b[i]; + } + UIMenu_LoadItems(UIItems_Keyboard, 0); +} + +// Process keyboard press event +int KeyboardPressEvent(int keysym) +{ + int index, took = 0; + + KeyLastKey = keysym; + + for (index=0; index<10; index++) { + if (KeyboardMapHostKeysym_A[index] == keysym) { + took = 1; + if (index) { + UIMenu_KeyEvent(index, 1); + } else { + UI_Status = !UI_Status; + } + } else if (KeyboardMapHostKeysym_B[index] == keysym) { + took = 1; + if (index) { + UIMenu_KeyEvent(index, 1); + } else { + UI_Status = !UI_Status; + } + } + } + return took; +} + +// Process keyboard release event +int KeyboardReleaseEvent(int keysym) +{ + int index, took = 0; + for (index=1; index<10; index++) { + if (KeyboardMapHostKeysym_A[index] == keysym) { + took = 1; + UIMenu_KeyEvent(index, 0); + } else if (KeyboardMapHostKeysym_B[index] == keysym) { + took = 1; + UIMenu_KeyEvent(index, 0); + } + } + return took; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Keyboard.h b/PVPokeMini/PokeMini/pokemini-code/source/Keyboard.h new file mode 100644 index 0000000000..190a8c1b97 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Keyboard.h @@ -0,0 +1,164 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_KEYBOARD +#define POKEMINI_KEYBOARD + +#include "UI.h" + +enum { + PMKEYB_NONE = 0, + PMKEYB_ESCAPE = 1, + PMKEYB_RETURN = 2, + PMKEYB_BACKSPACE = 3, + PMKEYB_TAB = 4, + PMKEYB_BACKQUOTE = 5, + + PMKEYB_RSHIFT = 6, + PMKEYB_LSHIFT = 7, + PMKEYB_RCTRL = 8, + PMKEYB_LCTRL = 9, + PMKEYB_RALT = 10, + PMKEYB_LALT = 11, + + PMKEYB_INSERT = 12, + PMKEYB_DELETE = 13, + PMKEYB_HOME = 14, + PMKEYB_END = 15, + PMKEYB_PAGEUP = 16, + PMKEYB_PAGEDOWN = 17, + + PMKEYB_NUMLOCK = 18, + PMKEYB_CAPSLOCK = 19, + PMKEYB_SCROLLLOCK = 20, + PMKEYB_KP_PERIOD = 21, + PMKEYB_KP_DIVIDE = 22, + PMKEYB_KP_MULTIPLY = 23, + PMKEYB_KP_MINUS = 24, + PMKEYB_KP_PLUS = 25, + PMKEYB_KP_ENTER = 26, + PMKEYB_KP_EQUALS = 27, + + PMKEYB_UP = 28, + PMKEYB_DOWN = 29, + PMKEYB_RIGHT = 30, + PMKEYB_LEFT = 31, + + PMKEYB_SPACE = 32, + PMKEYB_EXCLAIM = 33, + PMKEYB_QUOTEDBL = 34, + PMKEYB_HASH = 35, + PMKEYB_DOLLAR = 36, + PMKEYB_PERCENT = 37, + PMKEYB_AMPERSAND = 38, + PMKEYB_QUOTE = 39, + PMKEYB_LEFTPAREN = 40, + PMKEYB_RIGHTPAREN = 41, + PMKEYB_ASTERISK = 42, + PMKEYB_PLUS = 43, + PMKEYB_COMMA = 44, + PMKEYB_MINUS = 45, + PMKEYB_PERIOD = 46, + PMKEYB_SLASH = 47, + + PMKEYB_0 = 48, + PMKEYB_1 = 49, + PMKEYB_2 = 50, + PMKEYB_3 = 51, + PMKEYB_4 = 52, + PMKEYB_5 = 53, + PMKEYB_6 = 54, + PMKEYB_7 = 55, + PMKEYB_8 = 56, + PMKEYB_9 = 57, + + PMKEYB_COLON = 58, + PMKEYB_SEMICOLON = 59, + PMKEYB_LESS = 60, + PMKEYB_EQUALS = 61, + PMKEYB_GREATER = 62, + PMKEYB_QUESTION = 63, + PMKEYB_AT = 64, + + PMKEYB_A = 65, + PMKEYB_B = 66, + PMKEYB_C = 67, + PMKEYB_D = 68, + PMKEYB_E = 69, + PMKEYB_F = 70, + PMKEYB_G = 71, + PMKEYB_H = 72, + PMKEYB_I = 73, + PMKEYB_J = 74, + PMKEYB_K = 75, + PMKEYB_L = 76, + PMKEYB_M = 77, + PMKEYB_N = 78, + PMKEYB_O = 79, + PMKEYB_P = 80, + PMKEYB_Q = 81, + PMKEYB_R = 82, + PMKEYB_S = 83, + PMKEYB_T = 84, + PMKEYB_U = 85, + PMKEYB_V = 86, + PMKEYB_W = 87, + PMKEYB_X = 88, + PMKEYB_Y = 89, + PMKEYB_Z = 90, + + PMKEYB_LEFTBRACK = 91, + PMKEYB_BACKSLASH = 92, + PMKEYB_RIGHTBRACK = 93, + PMKEYB_CARET = 94, + PMKEYB_UNDERSCORE = 95, + + PMKEYB_KP_0 = 96, + PMKEYB_KP_1 = 97, + PMKEYB_KP_2 = 98, + PMKEYB_KP_3 = 99, + PMKEYB_KP_4 = 100, + PMKEYB_KP_5 = 101, + PMKEYB_KP_6 = 102, + PMKEYB_KP_7 = 103, + PMKEYB_KP_8 = 104, + PMKEYB_KP_9 = 105, + + PMKEYB_EOL = 106, +}; + +// Keyboard map string +extern const char *KeyboardMapStr[PMKEYB_EOL]; + +// Keyboard remapper +typedef int TKeyboardRemap[PMKEYB_EOL]; +void KeyboardRemap(TKeyboardRemap *keymap); + +// Keyboard menu items +extern TUIMenu_Item UIItems_Keyboard[]; + +// Enter into the keyboard menu +void KeyboardEnterMenu(void); + +// Process keyboard press +int KeyboardPressEvent(int keysym); + +// Process keyboard press +int KeyboardReleaseEvent(int keysym); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxAudio.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxAudio.c new file mode 100644 index 0000000000..dee0a45356 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxAudio.c @@ -0,0 +1,544 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +TMinxAudio MinxAudio; +int AudioEnabled = 0; +int SoundEngine = MINX_AUDIO_DISABLED; +int PiezoFilter = 0; +int RequireSoundSync = 0; +int16_t *MinxAudio_FIFO = NULL; +volatile int MinxAudio_ReadPtr = 0; +volatile int MinxAudio_WritePtr = 0; +int MinxAudio_FIFOSize = 0; +int MinxAudio_FIFOMask = 0; +int MinxAudio_FIFOThreshold = 0; +int16_t (*MinxAudio_AudioProcess)(void) = NULL; + +// Timers counting frequency table +const uint32_t MinxAudio_CountFreq[32] = { + // Osci1 disabled + 1, 0, 0, 0, 0, 0, 0, 0, + // Osci1 Enabled + (4000000/2), (4000000/8), (4000000/32), (4000000/64), + (4000000/128), (4000000/256), (4000000/1024), (4000000/4096), + // Osci2 disabled + 0, 0, 0, 0, 0, 0, 0, 0, + // Osci2 Enabled + (32768/1), (32768/2), (32768/4), (32768/8), + (32768/16), (32768/32), (32768/64), (32768/128) +}; + +// +// FIFO I/O +// + +static inline int MinxAudio_iSamplesInBuffer(void) +{ + if (MinxAudio_WritePtr > MinxAudio_ReadPtr) return MinxAudio_WritePtr - MinxAudio_ReadPtr; + else return (MinxAudio_FIFOSize - MinxAudio_ReadPtr) + MinxAudio_WritePtr; +} + +int MinxAudio_TotalSamples(void) +{ + return MinxAudio_FIFOSize; +} + +int MinxAudio_SamplesInBuffer(void) +{ + return MinxAudio_iSamplesInBuffer(); +} + +static inline void MinxAudio_FIFOWrite(int16_t data) +{ + if (MinxAudio_iSamplesInBuffer() < MinxAudio_FIFOSize) { + MinxAudio_FIFO[MinxAudio_WritePtr] = data; + MinxAudio_WritePtr = (MinxAudio_WritePtr + 1) & MinxAudio_FIFOMask; + } +} + +static inline int16_t MinxAudio_FIFORead(void) +{ + int16_t data = 0; + if (MinxAudio_iSamplesInBuffer() > 0) { + data = MinxAudio_FIFO[MinxAudio_ReadPtr]; + MinxAudio_ReadPtr = (MinxAudio_ReadPtr + 1) & MinxAudio_FIFOMask; + } + return data; +} + +// +// Functions +// + +int MinxAudio_Create(int audioenable, int fifosize) +{ + // Init variables + AudioEnabled = audioenable; + SoundEngine = MINX_AUDIO_DISABLED; + RequireSoundSync = 0; + + // Reset + MinxAudio_Reset(1); + + // Init FIFO if audio enabled + MinxAudio_ReadPtr = 0; + MinxAudio_WritePtr = 0; + if (fifosize) { + MinxAudio_FIFOMask = GetMultiple2Mask(fifosize); + MinxAudio_FIFOSize = MinxAudio_FIFOMask + 1; + MinxAudio_FIFOThreshold = (fifosize * 3) >> 2; // ... at 3 / 4 + } else { + MinxAudio_FIFOMask = 0; + MinxAudio_FIFOSize = 0; + MinxAudio_FIFOThreshold = 0; + } + if ((audioenable) && (fifosize)) { + MinxAudio_FIFO = (int16_t *)malloc(MinxAudio_FIFOSize*2); + if (!MinxAudio_FIFO) return 0; + memset(MinxAudio_FIFO, 0, MinxAudio_FIFOSize*2); + } + + return 1; +} + +void MinxAudio_Destroy(void) +{ + if (MinxAudio_FIFO) { + free(MinxAudio_FIFO); + MinxAudio_FIFO = NULL; + } +} + +void MinxAudio_Reset(int hardreset) +{ + // Initialize State + memset((void *)&MinxAudio, 0, sizeof(TMinxAudio)); +} + +int MinxAudio_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(32); + POKELOADSS_32(MinxAudio.AudioCCnt); + POKELOADSS_32(MinxAudio.AudioSCnt); + POKELOADSS_16(MinxAudio.Volume); + POKELOADSS_16(MinxAudio.PWMMul); + POKELOADSS_X(20); + POKELOADSS_END(32); +} + +int MinxAudio_SaveState(FILE *fi) +{ + POKESAVESS_START(32); + POKESAVESS_32(MinxAudio.AudioCCnt); + POKESAVESS_32(MinxAudio.AudioSCnt); + POKESAVESS_16(MinxAudio.Volume); + POKESAVESS_16(MinxAudio.PWMMul); + POKESAVESS_X(20); + POKESAVESS_END(32); +} + +void MinxAudio_ChangeEngine(int engine) +{ + if (PokeMini_Flags & POKEMINI_GENSOUND) { + engine = engine ? 1 : 0; + } + SoundEngine = engine; + switch (engine) { + case MINX_AUDIO_GENERATED: + RequireSoundSync = 0; + MinxAudio_AudioProcess = NULL; + break; + case MINX_AUDIO_DIRECT: + RequireSoundSync = 1; + MinxAudio_AudioProcess = MinxAudio_AudioProcessDirect; + break; + case MINX_AUDIO_EMULATED: + RequireSoundSync = 1; + MinxAudio_AudioProcess = MinxAudio_AudioProcessEmulated; + break; + case MINX_AUDIO_DIRECTPWM: + RequireSoundSync = 1; + MinxAudio_AudioProcess = MinxAudio_AudioProcessDirectPWM; + break; + default: + RequireSoundSync = 0; + MinxAudio_AudioProcess = NULL; + break; + } +} + +void MinxAudio_ChangeFilter(int piezo) +{ + PiezoFilter = piezo; +} + +void MinxAudio_Sync(void) +{ + // Process single audio sample + MinxAudio.AudioCCnt += MINX_AUDIOINC * PokeHWCycles; + if (MinxAudio.AudioCCnt >= 0x01000000) { + MinxAudio.AudioCCnt -= 0x01000000; + if (MinxAudio_AudioProcess) { + if (PiezoFilter) { + MinxAudio_FIFOWrite(MinxAudio_PiezoFilter(MinxAudio_AudioProcess())); + } else { + MinxAudio_FIFOWrite(MinxAudio_AudioProcess()); + } + } + } +} + +uint8_t MinxAudio_ReadReg(uint8_t reg) +{ + // 0x70 to 0x71 + switch(reg) { + case 0x70: // Unknown Audio Control + return PMR_AUD_CTRL & 0x07; + case 0x71: // Audio Volume Control + return PMR_AUD_VOL & 0x07; + default: + return 0; + } +} + +void MinxAudio_WriteReg(uint8_t reg, uint8_t val) +{ + // 0x70 to 0x71 + switch(reg) { + case 0x70: // Unknown Audio Control + PMR_AUD_CTRL = val & 0x07; + break; + case 0x71: // Audio Volume Control + PMR_AUD_VOL = val & 0x07; + break; + } + + // Calculate volume + if (PMR_AUD_CTRL & 0x03) { + // Mute audio + MinxAudio.Volume = 0; + } else { + switch (PMR_AUD_VOL & 3) { + case 0: + // 0% Sound + MinxAudio.Volume = MINX_AUDIO_SILENCE; + MinxAudio.PWMMul = 0; + break; + case 1: + case 2: + // 50% Sound + MinxAudio.Volume = MINX_AUDIO_MED_VOL; + MinxAudio.PWMMul = 1; + break; + case 3: + // 100% Sound + MinxAudio.Volume = MINX_AUDIO_MAX_VOL; + MinxAudio.PWMMul = 2; + break; + } + } +} + +// Get emulated frequency and pulsewidth +// Sound_Frequency is in Hz +// Pulse_Width is between 0 to 4095 (0% to ~99.99%) +void MinxAudio_GetEmulated(int *Sound_Frequency, int *Pulse_Width) +{ + int Timer3_Frequency; + int Preset_Value, Sound_Pivot; + + // Calculate timer 3 frequency + Timer3_Frequency = MinxAudio_CountFreq[(PMR_TMR3_SCALE & 0xF) | ((PMR_TMR3_OSC & 0x01) << 4)]; + if (!(PMR_TMR3_CTRL_L & 0x04)) Timer3_Frequency = 0; + if (PMR_TMR3_OSC & 0x01) { + // Osci2 + if (!MinxTimers.TmrXEna2) Timer3_Frequency = 0; + } else { + // Osci1 + if (!MinxTimers.TmrXEna1) Timer3_Frequency = 0; + } + + if (Timer3_Frequency) { + // Calculate preset value + Preset_Value = (MinxTimers.Tmr3PreA >> 24) + ((MinxTimers.Tmr3PreB >> 24) << 8); + + // Calculate sound frequency + *Sound_Frequency = Timer3_Frequency / (Preset_Value + 1); + + // ... and pulse width + if (Preset_Value) { + Sound_Pivot = (int)MinxTimers.Timer3Piv; + *Pulse_Width = 4095 - (Sound_Pivot * 4096 / Preset_Value); + if (*Pulse_Width < 0) *Pulse_Width = 0; + } else *Pulse_Width = 0; + } else { + *Sound_Frequency = 0; + *Pulse_Width = 0; + } +} + +int16_t MinxAudio_AudioProcessDirect(void) +{ + uint16_t TmrCnt; + TmrCnt = (MinxTimers.Tmr3CntA >> 24) | ((MinxTimers.Tmr3CntB >> 24) << 8); + + if (TmrCnt <= MinxTimers.Timer3Piv) { + return MinxAudio.Volume; + } + return MINX_AUDIO_SILENCE; +} + +int16_t MinxAudio_AudioProcessEmulated(void) +{ + int Sound_Frequency, Pulse_Width; + MinxAudio_GetEmulated(&Sound_Frequency, &Pulse_Width); + if (Sound_Frequency < 50) { + // Silence + return MINX_AUDIO_SILENCE; + } else if (Sound_Frequency < 20000) { + // Normal + MinxAudio.AudioSCnt -= Sound_Frequency * MINX_AUDIOCONV; + if ((MinxAudio.AudioSCnt & 0xFFF00000) >= (Pulse_Width << 20)) { + return MinxAudio.Volume; + } + return MINX_AUDIO_SILENCE; + } + // PWM + if (Pulse_Width > 4095) Pulse_Width = 4095; + return MINX_AUDIO_SILENCE + (Pulse_Width << 2) * MinxAudio.PWMMul; +} + +int16_t MinxAudio_AudioProcessDirectPWM(void) +{ + uint16_t TmrCnt, TmrPre; + uint32_t Pwm; + TmrCnt = (MinxTimers.Tmr3CntA >> 24) | ((MinxTimers.Tmr3CntB >> 24) << 8); + TmrPre = (MinxTimers.Tmr3PreA >> 24) | ((MinxTimers.Tmr3PreB >> 24) << 8); + + // Affect sound based of PWM + if (TmrPre) Pwm = MinxTimers.Timer3Piv * MINX_AUDIO_PWM_RAG / TmrPre; else Pwm = 0; + if (Pwm > MINX_AUDIO_PWM_RAG) Pwm = MINX_AUDIO_PWM_RAG-1; // Avoid clipping + if (TmrPre < 128) TmrCnt = 0; // Avoid high hizz + + // Output + if (TmrCnt <= MinxTimers.Timer3Piv) { + return MinxAudio.Volume + Pwm * MinxAudio.PWMMul; + } + return MINX_AUDIO_SILENCE + Pwm * MinxAudio.PWMMul; +} + +int16_t MinxAudio_PiezoFilter(int32_t Sample) +{ + int32_t HP_pCoeff = 40960; + int32_t LP_pCoeff = 4096; + int32_t LP_nCoeff = (65535 - LP_pCoeff); + static int32_t HPSamples[4], LPSamples[4]; + int32_t TmpSamples[4]; + + // High pass to simulate a piezo crystal speaker + TmpSamples[0] = Sample; + TmpSamples[1] = (HP_pCoeff * (TmpSamples[0] + HPSamples[1] - HPSamples[0])) >> 16; + TmpSamples[2] = (HP_pCoeff * (TmpSamples[1] + HPSamples[2] - HPSamples[1])) >> 16; + TmpSamples[3] = (HP_pCoeff * (TmpSamples[2] + HPSamples[3] - HPSamples[2])) >> 16; + memcpy(HPSamples, TmpSamples, sizeof(HPSamples)); + + // Amplify by 4 + Sample = TmpSamples[3] << 2; + if (Sample < -32768) Sample = -32768; + if (Sample > 32767) Sample = 32767; + + // Low pass to kill the spikes in sound + LPSamples[0] = Sample; + LPSamples[1] = (LPSamples[1] * LP_pCoeff + LPSamples[0] * LP_nCoeff) >> 16; + LPSamples[2] = (LPSamples[2] * LP_pCoeff + LPSamples[1] * LP_nCoeff) >> 16; + LPSamples[3] = (LPSamples[3] * LP_pCoeff + LPSamples[2] * LP_nCoeff) >> 16; + + // Amplify by 2, clamp and output + Sample = LPSamples[3] << 1; + if (Sample < -32768) Sample = -32768; + if (Sample > 32767) Sample = 32767; + + return Sample; +} + +void MinxAudio_GetSamplesU8(uint8_t *soundout, int numsamples) +{ + if (SoundEngine == MINX_AUDIO_GENERATED) { + MinxAudio_GenerateEmulatedU8(soundout, numsamples, 1); + return; + } + if (AudioEnabled && SoundEngine) { + while (numsamples--) { + *soundout++ = 0x80 + (MinxAudio_FIFORead() >> 8); + } + } else { + while (numsamples--) *soundout++ = 0x80; + } +} + +void MinxAudio_GetSamplesS16(int16_t *soundout, int numsamples) +{ + if (SoundEngine == MINX_AUDIO_GENERATED) { + MinxAudio_GenerateEmulatedS16(soundout, numsamples, 1); + return; + } + if (AudioEnabled && SoundEngine) { + while (numsamples--) { + *soundout++ = MinxAudio_FIFORead(); + } + } else { + while (numsamples--) *soundout++ = 0x0000; + } +} + +void MinxAudio_GetSamplesU8Ch(uint8_t *soundout, int numsamples, int channels) +{ + int j; + if (SoundEngine == MINX_AUDIO_GENERATED) { + MinxAudio_GenerateEmulatedU8(soundout, numsamples, channels); + return; + } + if (AudioEnabled && SoundEngine) { + while (numsamples--) { + uint8_t sample = 0x80 + (MinxAudio_FIFORead() >> 8); + for (j=0; j= MinxAudio_FIFOThreshold; +} + +// This doesn't require audio to be created: + +void MinxAudio_GenerateEmulatedU8(uint8_t *soundout, int numsamples, int channels) +{ + int i, j, Sound_Frequency, Pulse_Width; + if (numsamples <= 0) return; + MinxAudio_GetEmulated(&Sound_Frequency, &Pulse_Width); + for (i=0; i= 50) && (Sound_Frequency < 20000)) { + MinxAudio.AudioSCnt += Sound_Frequency * MINX_AUDIOCONV; + if ((MinxAudio.AudioSCnt & 0xFFF00000) >= (Pulse_Width << 20)) { + if (PiezoFilter) { + for (j=0; j> 8); + } else { + for (j=0; j> 8); + } + } else { + if (PiezoFilter) { + for (j=0; j> 8); + } else { + for (j=0; j> 8); + } else { + for (j=0; j= 50) && (Sound_Frequency < 20000)) { + MinxAudio.AudioSCnt += Sound_Frequency * MINX_AUDIOCONV; + if ((MinxAudio.AudioSCnt & 0xFFF00000) >= (Pulse_Width << 20)) { + if (PiezoFilter) { + for (j=0; j> 8); + } else { + for (j=0; j> 8); + } + } else { + if (PiezoFilter) { + for (j=0; j> 8); + } else { + for (j=0; j> 8); + } else { + for (j=0; j= 50) && (Sound_Frequency < 20000)) { + MinxAudio.AudioSCnt += Sound_Frequency * MINX_AUDIOCONV; + if ((MinxAudio.AudioSCnt & 0xFFF00000) >= (Pulse_Width << 20)) { + if (PiezoFilter) { + for (j=0; j. +*/ + +#ifndef MINXHW_AUDIO +#define MINXHW_AUDIO + +#include "MinxTimers.h" + +#include +#include + +typedef struct { + // Internal processing + int32_t AudioCCnt; // Audio cycle counter 8.24 (Needs signed) + uint32_t AudioSCnt; // Audio sample counter 8.24 (Needs unsigned) + int16_t Volume; // Volume (S16 sample) + int16_t PWMMul; // PWM Multiplication +} TMinxAudio; + +// Export Audio state +extern TMinxAudio MinxAudio; + +// Audio enabled +extern int AudioEnabled; + +// Sound engine +extern int SoundEngine; + +// Piezo Filter +extern int PiezoFilter; + +// Require sound sync +extern int RequireSoundSync; + + +enum { + MINX_AUDIO_DISABLED = 0, // Disabled + MINX_AUDIO_GENERATED, // Generated (Doesn't require sync) + MINX_AUDIO_DIRECT, // Direct from Timer 3 + MINX_AUDIO_EMULATED, // Emulated + MINX_AUDIO_DIRECTPWM // Direct from Timer 3 with PWM support +}; + +enum { + MINX_AUDIO_SILENCE = 0x0000, + MINX_AUDIO_MED_VOL = 0x2000, + MINX_AUDIO_MAX_VOL = 0x4000, + MINX_AUDIO_PWM_RAG = 0x1FFF // Max + Pwm*2 must not be over 0x7FFF +}; + +#ifndef MINX_AUDIOFREQ +#define MINX_AUDIOFREQ (44100) +#endif + +// Aproximate value of 1 sample per cycle at 44100Hz (16M / ( 4M / 44K )) +#ifndef MINX_AUDIOINC +#define MINX_AUDIOINC (184969) +#endif + +// Conversion for the generator counter +#define MINX_AUDIOCONV (2147483647/(MINX_AUDIOFREQ)*2) + + +int MinxAudio_Create(int audioenable, int fifosize); + +void MinxAudio_Destroy(void); + +void MinxAudio_Reset(int hardreset); + +int MinxAudio_LoadState(FILE *fi, uint32_t bsize); + +int MinxAudio_SaveState(FILE *fi); + +void MinxAudio_ChangeEngine(int engine); + +void MinxAudio_ChangeFilter(int piezo); + +void MinxAudio_Sync(void); + +uint8_t MinxAudio_ReadReg(uint8_t reg); + +void MinxAudio_WriteReg(uint8_t reg, uint8_t val); + +int MinxAudio_TotalSamples(void); + +int MinxAudio_SamplesInBuffer(void); + +void MinxAudio_GetEmulated(int *Sound_Frequency, int *Pulse_Width); + +int16_t MinxAudio_AudioProcessDirect(void); + +int16_t MinxAudio_AudioProcessEmulated(void); + +int16_t MinxAudio_AudioProcessDirectPWM(void); + +int16_t MinxAudio_PiezoFilter(int32_t Sample); + +void MinxAudio_GetSamplesU8(uint8_t *soundout, int numsamples); + +void MinxAudio_GetSamplesS16(int16_t *soundout, int numsamples); + +void MinxAudio_GetSamplesU8Ch(uint8_t *soundout, int numsamples, int channels); + +void MinxAudio_GetSamplesS16Ch(int16_t *soundout, int numsamples, int channels); + +int MinxAudio_SyncWithAudio(void); + +void MinxAudio_GenerateEmulatedU8(uint8_t *soundout, int numsamples, int channels); + +void MinxAudio_GenerateEmulatedS8(int8_t *soundout, int numsamples, int channels); + +void MinxAudio_GenerateEmulatedS16(int16_t *soundout, int numsamples, int channels); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU.c new file mode 100644 index 0000000000..a4d3d8f6e4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU.c @@ -0,0 +1,113 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +TMinxCPU MinxCPU; + +// +// Functions +// + +int MinxCPU_Create(void) +{ + // Init variables + MinxCPU.BA.D = 0; + MinxCPU.HL.D = 0; + MinxCPU.X.D = 0; + MinxCPU.Y.D = 0; + MinxCPU.SP.D = 0; + MinxCPU.PC.D = 0; + MinxCPU.N.D = 0; + MinxCPU.E = 0; + MinxCPU.F = 0xC0; + Set_U(0); + MinxCPU.Status = MINX_STATUS_NORMAL; + return 1; +} + +void MinxCPU_Destroy(void) +{ + // Nothing... +} + +// Reset core, call it after OnRead/OnWrite point to the right BIOS +void MinxCPU_Reset(int hardreset) +{ + MinxCPU.Status = MINX_STATUS_NORMAL; + MinxCPU.PC.W.L = ReadMem16(hardreset ? 0 : 2); + MinxCPU.E = 0x1F; + MinxCPU.F = 0xC0; + Set_U(0); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +// Load State +int MinxCPU_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(64); + POKELOADSS_32(MinxCPU.BA.D); + POKELOADSS_32(MinxCPU.HL.D); + POKELOADSS_32(MinxCPU.X.D); + POKELOADSS_32(MinxCPU.Y.D); + POKELOADSS_32(MinxCPU.SP.D); + POKELOADSS_32(MinxCPU.PC.D); + POKELOADSS_32(MinxCPU.N.D); + POKELOADSS_8(MinxCPU.U1); + POKELOADSS_8(MinxCPU.U2); + POKELOADSS_8(MinxCPU.F); + POKELOADSS_8(MinxCPU.E); + POKELOADSS_8(MinxCPU.IR); + POKELOADSS_8(MinxCPU.Shift_U); + POKELOADSS_8(MinxCPU.Status); + POKELOADSS_8(MinxCPU.IRQ_Vector); + POKELOADSS_A(MinxCPU.Reserved, 28); + POKELOADSS_END(64); +} + +// Save State +int MinxCPU_SaveState(FILE *fi) +{ + POKESAVESS_START(64); + POKESAVESS_32(MinxCPU.BA.D); + POKESAVESS_32(MinxCPU.HL.D); + POKESAVESS_32(MinxCPU.X.D); + POKESAVESS_32(MinxCPU.Y.D); + POKESAVESS_32(MinxCPU.SP.D); + POKESAVESS_32(MinxCPU.PC.D); + POKESAVESS_32(MinxCPU.N.D); + POKESAVESS_8(MinxCPU.U1); + POKESAVESS_8(MinxCPU.U2); + POKESAVESS_8(MinxCPU.F); + POKESAVESS_8(MinxCPU.E); + POKESAVESS_8(MinxCPU.IR); + POKESAVESS_8(MinxCPU.Shift_U); + POKESAVESS_8(MinxCPU.Status); + POKESAVESS_8(MinxCPU.IRQ_Vector); + POKESAVESS_A(MinxCPU.Reserved, 28); + POKESAVESS_END(64); +} + +// Force call Interrupt by the address +int MinxCPU_CallIRQ(uint8_t addr) +{ + if (MinxCPU.Status == MINX_STATUS_IRQ) return 0; + MinxCPU.Status = MINX_STATUS_IRQ; + MinxCPU.IRQ_Vector = addr; + return 1; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU.h new file mode 100644 index 0000000000..1cc90fec66 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU.h @@ -0,0 +1,723 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXCPU_CORE +#define MINXCPU_CORE + +#include +#include + +#ifdef _BIG_ENDIAN + +typedef union { + struct { + uint8_t X; + uint8_t I; + uint8_t H; + uint8_t L; + } B; + struct { + uint16_t H; + uint16_t L; + } W; + uint32_t D; +} MinxRegx; + +#else + +typedef union { + struct { + uint8_t L; + uint8_t H; + uint8_t I; + uint8_t X; + } B; + struct { + uint16_t L; + uint16_t H; + } W; + uint32_t D; +} MinxRegx; + +#endif + +#define MINX_FLAG_ZERO 0x01 +#define MINX_FLAG_CARRY 0x02 +#define MINX_FLAG_OVERFLOW 0x04 +#define MINX_FLAG_SIGN 0x08 +#define MINX_FLAG_BCD 0x10 +#define MINX_FLAG_NIBBLE 0x20 +#define MINX_FLAG_INTFLG 0x40 +#define MINX_FLAG_INTOFF 0x80 + +#define MINX_FLAG_SAVE_NUL 0xF0 +#define MINX_FLAG_SAVE_O 0xF4 +#define MINX_FLAG_SAVE_CO 0xF6 +#define MINX_FLAG_SAVE_COS 0xFE + +// OnException() reasons +enum { + EXCEPTION_UNKNOWN_INSTRUCTION, + EXCEPTION_CRASH_INSTRUCTION, + EXCEPTION_UNSTABLE_INSTRUCTION, + EXCEPTION_DIVISION_BY_ZERO +}; + +// OnSleep() reasons +enum { + MINX_SLEEP_HALT, + MINX_SLEEP_STOP +}; + +// Status reasons +enum { + MINX_STATUS_NORMAL = 0, // Normal operation + MINX_STATUS_HALT = 1, // CPU during HALT + MINX_STATUS_STOP = 2, // CPU during STOP + MINX_STATUS_IRQ = 3, // Delay caused by hardware IRQ +}; + +// DebugHalt reasons +enum { + MINX_DEBUGHALT_RECEIVE, + MINX_DEBUGHALT_SUSPEND, + MINX_DEBUGHALT_RESUME, +}; + +#ifndef inline +#define inline __inline +#endif + +// Signed 8-Bits to 16-Bits converter +static inline uint16_t S8_TO_16(int8_t a) +{ + return (a & 0x80) ? (0xFF00 | a) : a; +} + +typedef struct { + // Registers + MinxRegx BA; // Registers A, B + MinxRegx HL; // Registers L, H, I + MinxRegx X; // Registers X, XI + MinxRegx Y; // Registers Y, YI + MinxRegx SP; // Register SP + MinxRegx PC; // Registers PC, V + MinxRegx N; // for [N+#nn], I is written here too + uint8_t U1; // V Shadow 1 + uint8_t U2; // V Shadow 2 + uint8_t F; // Flags + uint8_t E; // Exception + uint8_t IR; // Last Instruction Register (for open-bus) + uint8_t Shift_U; // Shift U, set to 2 when: U modify, branch, return + uint8_t Status; // CPU Status (0 = Normal, 1 = Halt, 2 = Stoped, 3 = IRQ) + uint8_t IRQ_Vector; // IRQ Vector when Status is IRQ + uint8_t Reserved[28]; // Reserved bytes +} TMinxCPU; + +// CPU registers +extern TMinxCPU MinxCPU; + +// Callbacks (Must be coded by the user) +uint8_t MinxCPU_OnRead(int cpu, uint32_t addr); +void MinxCPU_OnWrite(int cpu, uint32_t addr, uint8_t data); +void MinxCPU_OnException(int type, uint32_t opc); +void MinxCPU_OnSleep(int type); +void MinxCPU_OnIRQHandle(uint8_t flag, uint8_t shift_u); +void MinxCPU_OnIRQAct(uint8_t intr); + +// Functions +int MinxCPU_Create(void); // Create MinxCPU +void MinxCPU_Destroy(void); // Destroy MinxCPU +void MinxCPU_Reset(int hardreset); // Reset CPU +int MinxCPU_LoadState(FILE *fi, uint32_t bsize); // Load State +int MinxCPU_SaveState(FILE *fi); // Save State +int MinxCPU_Exec(void); // Execute 1 CPU instruction +int MinxCPU_CallIRQ(uint8_t IRQ); // Call an IRQ + +// Helpers +static inline uint16_t ReadMem16(uint32_t addr) +{ + return MinxCPU_OnRead(1, addr) + (MinxCPU_OnRead(1, addr+1) << 8); +} + +static inline void WriteMem16(uint32_t addr, uint16_t data) +{ + MinxCPU_OnWrite(1, addr, (uint8_t)data); + MinxCPU_OnWrite(1, addr+1, data >> 8); +} + +static inline uint8_t Fetch8(void) +{ + if (MinxCPU.PC.W.L & 0x8000) { + // Banked area + MinxCPU.IR = MinxCPU_OnRead(1, (MinxCPU.PC.W.L++ & 0x7FFF) | (MinxCPU.PC.B.I << 15)); + } else { + // Unbanked area + MinxCPU.IR = MinxCPU_OnRead(1, MinxCPU.PC.W.L++); + } + return MinxCPU.IR; +} + +static inline uint16_t Fetch16(void) +{ + uint8_t LB = Fetch8(); + return (Fetch8() << 8) | LB; +} + +static inline void Set_U(uint8_t val) +{ + if (val != MinxCPU.U2) MinxCPU.Shift_U = 2; + MinxCPU.U1 = val; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +// Instruction exec. prototypes + +int MinxCPU_ExecCE(void); +int MinxCPU_ExecCF(void); +int MinxCPU_ExecSPCE(void); +int MinxCPU_ExecSPCF(void); + +// Instructions Macros + +static inline uint8_t ADD8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A + B; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES < A) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x80) != 0) && (((A ^ B) & 0x80) == 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) + (B & 15)) >= 10) { + RES = A + B + 6; + } else { + RES = A + B; + } + if (RES >= 0xA0) RES += 0x60; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES < A) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) + (B & 15); + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8) != 0) && (((A ^ B) & 0x8) == 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 8) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) + (B & 15)) >= 10) { + RES = (A & 15) + (B & 15) + 6; + } else { + RES = (A & 15) + (B & 15); + } + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0x0F; + } +} + +static inline uint16_t ADD16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A + B; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES < A) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8000) != 0) && (((A ^ B) & 0x8000) == 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 0x8000) MinxCPU.F |= MINX_FLAG_SIGN; + return (uint16_t)RES; +} + +static inline uint8_t ADC8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A + B + CARRY; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES < A) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x80) != 0) && (((A ^ B) & 0x80) == 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) + (B & 15) + CARRY) >= 10) { + RES = A + B + CARRY + 6; + } else { + RES = A + B + CARRY; + } + if (RES >= 0xA0) RES += 0x60; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES < A) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) + (B & 15) + CARRY; + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8) != 0) && (((A ^ B) & 0x8) == 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 8) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) + (B & 15) + CARRY) >= 10) { + RES = (A & 15) + (B & 15) + CARRY + 6; + } else { + RES = (A & 15) + (B & 15) + CARRY; + } + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0x0F; + } +} + +static inline uint16_t ADC16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A + B + ((MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0); + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES < A) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8000) != 0) && (((A ^ B) & 0x8000) == 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 0x8000) MinxCPU.F |= MINX_FLAG_SIGN; + return (uint16_t)RES; +} + +static inline uint8_t SUB8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A - B; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A < B) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x80) != 0) && (((A ^ B) & 0x80) != 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) - (B & 15)) >= 10) { + RES = A - B - 6; + } else { + RES = A - B; + } + if (RES >= 0xA0) RES -= 0x60; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A < B) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) - (B & 15); + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8) != 0) && (((A ^ B) & 0x8) != 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 8) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) - (B & 15)) >= 10) { + RES = (A & 15) - (B & 15) - 6; + } else { + RES = (A & 15) - (B & 15); + } + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0x0F; + } +} + +static inline uint16_t SUB16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A - B; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A < B) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8000) != 0) && (((A ^ B) & 0x8000) != 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 0x8000) MinxCPU.F |= MINX_FLAG_SIGN; + return (uint16_t)RES; +} + +static inline uint8_t SBC8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A - B - CARRY; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A < B) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x80) != 0) && (((A ^ B) & 0x80) != 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) - (B & 15) - CARRY) >= 10) { + RES = A - B - CARRY - 6; + } else { + RES = A - B - CARRY; + } + if (RES >= 0xA0) RES -= 0x60; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A < B) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) - (B & 15) - CARRY; + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8) != 0) && (((A ^ B) & 0x8) != 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 8) MinxCPU.F |= MINX_FLAG_SIGN; + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) - (B & 15) - CARRY) >= 10) { + RES = (A & 15) - (B & 15) - CARRY - 6; + } else { + RES = (A & 15) - (B & 15) - CARRY; + } + if ((RES & 15) == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (RES >= 16) MinxCPU.F |= MINX_FLAG_CARRY; + return RES & 0x0F; + } +} + +static inline uint16_t SBC16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A - B - ((MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0); + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (RES == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A < B) MinxCPU.F |= MINX_FLAG_CARRY; + if ((((A ^ RES) & 0x8000) != 0) && (((A ^ B) & 0x8000) != 0)) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (RES & 0x8000) MinxCPU.F |= MINX_FLAG_SIGN; + return (uint16_t)RES; +} + +static inline uint8_t AND8(uint8_t A, uint8_t B) +{ + A &= B; + MinxCPU.F &= MINX_FLAG_SAVE_CO; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t OR8(uint8_t A, uint8_t B) +{ + A |= B; + MinxCPU.F &= MINX_FLAG_SAVE_CO; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t XOR8(uint8_t A, uint8_t B) +{ + A ^= B; + MinxCPU.F &= MINX_FLAG_SAVE_CO; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 128) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t INC8(uint8_t A) +{ + A++; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline uint16_t INC16(uint16_t A) +{ + A++; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline uint8_t DEC8(uint8_t A) +{ + A--; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline uint16_t DEC16(uint16_t A) +{ + A--; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline void PUSH(uint8_t A) +{ + MinxCPU.SP.W.L--; + MinxCPU_OnWrite(1, MinxCPU.SP.D, A); +} + +static inline uint8_t POP(void) +{ + register uint8_t data; + data = MinxCPU_OnRead(1, MinxCPU.SP.D); + MinxCPU.SP.W.L++; + return data; +} + +static inline void CALLS(uint16_t OFFSET) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = MinxCPU.PC.W.L + OFFSET - 1; +} + +static inline void JMPS(uint16_t OFFSET) +{ + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = MinxCPU.PC.W.L + OFFSET - 1; +} + +static inline void CALLU(uint16_t ADDR) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ADDR; +} + +static inline void JMPU(uint16_t ADDR) +{ + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ADDR; +} + +static inline void JDBNZ(uint16_t OFFSET) +{ + MinxCPU.BA.B.H = DEC8(MinxCPU.BA.B.H); + if (MinxCPU.BA.B.H != 0) { + JMPS(OFFSET); + } +} + +static inline uint8_t SWAP(uint8_t A) +{ + return (A << 4) | (A >> 4); +} + +static inline void RET(void) +{ + MinxCPU.PC.B.L = POP(); + MinxCPU.PC.B.H = POP(); + MinxCPU.PC.B.I = POP(); + Set_U(MinxCPU.PC.B.I); +} + +static inline void RETI(void) +{ + MinxCPU.F = POP(); + MinxCPU.PC.B.L = POP(); + MinxCPU.PC.B.H = POP(); + MinxCPU.PC.B.I = POP(); + Set_U(MinxCPU.PC.B.I); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +static inline void CALLX(uint16_t ADDR) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ReadMem16((MinxCPU.HL.B.I << 16) + ADDR); +} + +static inline void CALLI(uint16_t ADDR) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + PUSH(MinxCPU.F); + MinxCPU.F |= 0xC0; + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ReadMem16(ADDR); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +static inline void JMPI(uint16_t ADDR) +{ + PUSH(MinxCPU.F); + MinxCPU.F |= 0xC0; + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ReadMem16(ADDR); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +static inline uint8_t SAL(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + if ((!(A & 0x40)) != (!(A & 0x80))) MinxCPU.F |= MINX_FLAG_OVERFLOW; + A = A << 1; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t SHL(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + A = A << 1; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t SAR(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A & 0x80) | (A >> 1); + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t SHR(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = A >> 1; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t ROLC(uint8_t A) +{ + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0; + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A << 1) | CARRY; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t ROL(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A << 1) | (A >> 7); + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t RORC(uint8_t A) +{ + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 0x80 : 0x00; + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A >> 1) | CARRY; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t ROR(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A >> 1) | (A << 7); + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t NOT(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_CO; + A = A ^ 0xFF; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline uint8_t NEG(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + A = -A; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; else MinxCPU.F |= MINX_FLAG_CARRY; + if (A == 0x80) MinxCPU.F |= MINX_FLAG_OVERFLOW; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + return A; +} + +static inline void HALT(void) +{ + MinxCPU.Status = MINX_STATUS_HALT; + MinxCPU_OnSleep(MINX_SLEEP_HALT); +} + +static inline void STOP(void) +{ + MinxCPU.Status = MINX_STATUS_STOP; + MinxCPU_OnSleep(MINX_SLEEP_STOP); +} + +static inline void MUL(void) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + MinxCPU.HL.W.L = (uint16_t)MinxCPU.HL.B.L * (uint16_t)MinxCPU.BA.B.L; + if (MinxCPU.HL.W.L == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (MinxCPU.HL.W.L & 0x8000) MinxCPU.F |= MINX_FLAG_SIGN; +} + +static inline void DIV(void) +{ + uint16_t RES; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (MinxCPU.BA.B.L == 0) { + MinxCPU_OnException(EXCEPTION_DIVISION_BY_ZERO, 0); + return; + } + RES = MinxCPU.HL.W.L / MinxCPU.BA.B.L; + if (RES < 256) { + MinxCPU.HL.B.H = MinxCPU.HL.W.L % MinxCPU.BA.B.L; + MinxCPU.HL.B.L = (uint8_t)RES; + if (MinxCPU.HL.B.L == 0) MinxCPU.F |= MINX_FLAG_ZERO; + if (MinxCPU.HL.B.L & 0x80) MinxCPU.F |= MINX_FLAG_SIGN; + } else MinxCPU.F |= (MINX_FLAG_OVERFLOW | MINX_FLAG_SIGN); +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_CE.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_CE.c new file mode 100644 index 0000000000..cac1248de3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_CE.c @@ -0,0 +1,1132 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Note: Any write to MinxCPU.HL.B.I needs to be reflected into N.B.I + +#include "MinxCPU.h" + +int MinxCPU_ExecCE(void) +{ + uint8_t I8A; + uint16_t I16; + + // Read IR + MinxCPU.IR = Fetch8(); + + // Process instruction + switch(MinxCPU.IR) { + + case 0x00: // ADD A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x01: // ADD A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x02: // ADD A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x03: // ADD A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x04: // ADD [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADD8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x05: // ADD [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADD8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x06: // ADD [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADD8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x07: // ADD [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADD8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x08: // ADC A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x09: // ADC A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x0A: // ADC A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x0B: // ADC A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x0C: // ADC [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADC8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x0D: // ADC [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADC8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x0E: // ADC [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADC8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x0F: // ADC [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ADC8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x10: // SUB A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x11: // SUB A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x12: // SUB A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x13: // SUB A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x14: // SUB [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x15: // SUB [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x16: // SUB [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x17: // SUB [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x18: // SBC A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x19: // SBC A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x1A: // SBC A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x1B: // SBC A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x1C: // SBC [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, SBC8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x1D: // SBC [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, SBC8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x1E: // SBC [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SBC8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x1F: // SBC [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SBC8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x20: // AND A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x21: // AND A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x22: // AND A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x23: // AND A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x24: // AND [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, AND8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x25: // AND [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, AND8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x26: // AND [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, AND8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x27: // AND [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, AND8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x28: // OR A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x29: // OR A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x2A: // OR A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x2B: // OR A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x2C: // OR [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, OR8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x2D: // OR [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, OR8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x2E: // OR [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, OR8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x2F: // OR [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, OR8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x30: // CMP A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x31: // CMP A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x32: // CMP A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x33: // CMP A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x34: // CMP [HL], A + SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L); + return 16; + case 0x35: // CMP [HL], #nn + I8A = Fetch8(); + SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A); + return 20; + case 0x36: // CMP [HL], [X] + SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D)); + return 20; + case 0x37: // CMP [HL], [Y] + SUB8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 20; + + case 0x38: // XOR A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x39: // XOR A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + case 0x3A: // XOR A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 16; + case 0x3B: // XOR A, [Y+L] + I16 = MinxCPU.Y.W.L+ S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 16; + + case 0x3C: // XOR [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, XOR8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU.BA.B.L)); + return 16; + case 0x3D: // XOR [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, XOR8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A)); + return 20; + case 0x3E: // XOR [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, XOR8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.X.D))); + return 20; + case 0x3F: // XOR [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, XOR8(MinxCPU_OnRead(1, MinxCPU.HL.D), MinxCPU_OnRead(1, MinxCPU.Y.D))); + return 20; + + case 0x40: // MOV A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x41: // MOV A, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + case 0x42: // MOV A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x43: // MOV A, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + + case 0x44: // MOV [X+#ss], A + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.BA.B.L); + return 16; + case 0x45: // MOV [Y+#ss], A + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.BA.B.L); + return 16; + case 0x46: // MOV [X+L], A + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.BA.B.L); + return 16; + case 0x47: // MOV [Y+L], A + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.BA.B.L); + return 16; + + case 0x48: // MOV B, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x49: // MOV B, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + case 0x4A: // MOV B, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x4B: // MOV B, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + + case 0x4C: // MOV [X+#ss], B + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.BA.B.H); + return 16; + case 0x4D: // MOV [Y+#ss], B + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.BA.B.H); + return 16; + case 0x4E: // MOV [X+L], B + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.BA.B.H); + return 16; + case 0x4F: // MOV [Y+L], B + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.BA.B.H); + return 16; + + case 0x50: // MOV L, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x51: // MOV L, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + case 0x52: // MOV L, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x53: // MOV L, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + + case 0x54: // MOV [X+#ss], L + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.HL.B.L); + return 16; + case 0x55: // MOV [Y+#ss], L + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.HL.B.L); + return 16; + case 0x56: // MOV [X+L], L + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.HL.B.L); + return 16; + case 0x57: // MOV [Y+L], L + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.HL.B.L); + return 16; + + case 0x58: // MOV H, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x59: // MOV H, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + case 0x5A: // MOV H, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 16; + case 0x5B: // MOV H, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 16; + + case 0x5C: // MOV [X+#ss], H + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.HL.B.H); + return 16; + case 0x5D: // MOV [Y+#ss], H + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.HL.B.H); + return 16; + case 0x5E: // MOV [X+L], H + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.HL.B.H); + return 16; + case 0x5F: // MOV [Y+L], H + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.HL.B.H); + return 16; + + case 0x60: // MOV [HL], [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 20; + case 0x61: // MOV [HL], [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 20; + case 0x62: // MOV [HL], [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 20; + case 0x63: // MOV [HL], [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 20; + + case 0x64: // *ADC BA, #nnnn + I16 = Fetch16(); + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, I16); + return 16; + case 0x65: // *ADC HL, #nnnn + I16 = Fetch16(); + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, I16); + return 16; + + case 0x66: // ??? BA, #nn00+L + I8A = Fetch8(); + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, (I8A << 8) | MinxCPU.HL.B.L); + return 24; + case 0x67: // ??? HL, #nn00+L + I8A = Fetch8(); + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, (I8A << 8) | MinxCPU.HL.B.L); + return 24; + + case 0x68: // MOV [X], [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 20; + case 0x69: // MOV [X], [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 20; + case 0x6A: // MOV [X], [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 20; + case 0x6B: // MOV [X], [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 20; + + case 0x6C: // *ADD SP, #nnnn + I16 = Fetch8(); + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, I16); + + case 0x6D: // ??? HL, #nn + I8A = Fetch8(); + MinxCPU.HL.W.L = ADD16(MinxCPU.X.W.L, ((I8A << 4) * 3) + ((I8A & 0x08) >> 3)); + MinxCPU.F &= ~MINX_FLAG_CARRY; // It seems that carry gets clear? + return 40; + case 0x6E: // ??? SP, #nn00+L + I8A = Fetch8(); + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, (I8A << 8) | MinxCPU.HL.B.L); + return 16; + case 0x6F: // ??? HL, L + MinxCPU.HL.W.L = ADD16(MinxCPU.X.W.L, ((MinxCPU.HL.B.L << 4) * 3) + ((MinxCPU.HL.B.L & 0x08) >> 3)); + MinxCPU.F &= ~MINX_FLAG_CARRY; // It seems that carry gets clear? + return 40; + + case 0x70: // NOTHING + MinxCPU.PC.W.L++; + return 64; + case 0x71: // NOTHING + MinxCPU.PC.W.L++; + return 64; + case 0x72: // NOTHING + return 64; + case 0x73: // NOTHING + return 64; + + case 0x74: // *MOV A, [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 64; + case 0x75: // *MOV L, [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 64; + case 0x76: // *MOV A, [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 64; + case 0x77: // *MOV L, [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 64; + + case 0x78: // MOV [Y], [X+#ss] + I8A = Fetch8(); + I16 = MinxCPU.X.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 20; + case 0x79: // MOV [Y], [Y+#ss] + I8A = Fetch8(); + I16 = MinxCPU.Y.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 20; + case 0x7A: // MOV [Y], [X+L] + I16 = MinxCPU.X.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16)); + return 20; + case 0x7B: // MOV [Y], [Y+L] + I16 = MinxCPU.Y.W.L + S8_TO_16(MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16)); + return 20; + + case 0x7C: // NOTHING #nn + MinxCPU.PC.W.L++; + return 20; + case 0x7D: // NOTHING #nn + MinxCPU.PC.W.L++; + return 16; + case 0x7E: // NOTHING + return 20; + case 0x7F: // NOTHING + return 16; + + case 0x80: // SAL A + MinxCPU.BA.B.L = SAL(MinxCPU.BA.B.L); + return 12; + case 0x81: // SAL B + MinxCPU.BA.B.H = SAL(MinxCPU.BA.B.H); + return 12; + case 0x82: // SAL [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, SAL(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x83: // SAL [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SAL(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x84: // SHL A + MinxCPU.BA.B.L = SHL(MinxCPU.BA.B.L); + return 12; + case 0x85: // SHL B + MinxCPU.BA.B.H = SHL(MinxCPU.BA.B.H); + return 12; + case 0x86: // SHL [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, SHL(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x87: // SHL [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SHL(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x88: // SAR A + MinxCPU.BA.B.L = SAR(MinxCPU.BA.B.L); + return 12; + case 0x89: // SAR B + MinxCPU.BA.B.H = SAR(MinxCPU.BA.B.H); + return 12; + case 0x8A: // SAR [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, SAR(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x8B: // SAR [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SAR(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x8C: // SHR A + MinxCPU.BA.B.L = SHR(MinxCPU.BA.B.L); + return 12; + case 0x8D: // SHR B + MinxCPU.BA.B.H = SHR(MinxCPU.BA.B.H); + return 12; + case 0x8E: // SHR [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, SHR(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x8F: // SHR [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SHR(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x90: // ROLC A + MinxCPU.BA.B.L = ROLC(MinxCPU.BA.B.L); + return 12; + case 0x91: // ROLC B + MinxCPU.BA.B.H = ROLC(MinxCPU.BA.B.H); + return 12; + case 0x92: // ROLC [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, ROLC(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x93: // ROLC [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ROLC(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x94: // ROL A + MinxCPU.BA.B.L = ROL(MinxCPU.BA.B.L); + return 12; + case 0x95: // ROL B + MinxCPU.BA.B.H = ROL(MinxCPU.BA.B.H); + return 12; + case 0x96: // ROL [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, ROL(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x97: // ROL [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ROL(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x98: // RORC A + MinxCPU.BA.B.L = RORC(MinxCPU.BA.B.L); + return 12; + case 0x99: // RORC B + MinxCPU.BA.B.H = RORC(MinxCPU.BA.B.H); + return 12; + case 0x9A: // RORC [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, RORC(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x9B: // RORC [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, RORC(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0x9C: // ROR A + MinxCPU.BA.B.L = ROR(MinxCPU.BA.B.L); + return 12; + case 0x9D: // ROR B + MinxCPU.BA.B.H = ROR(MinxCPU.BA.B.H); + return 12; + case 0x9E: // ROR [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, ROR(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0x9F: // ROR [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, ROR(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0xA0: // NOT A + MinxCPU.BA.B.L = NOT(MinxCPU.BA.B.L); + return 12; + case 0xA1: // NOT B + MinxCPU.BA.B.H = NOT(MinxCPU.BA.B.H); + return 12; + case 0xA2: // NOT [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, NOT(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0xA3: // NOT [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, NOT(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0xA4: // NEG A + MinxCPU.BA.B.L = NEG(MinxCPU.BA.B.L); + return 12; + case 0xA5: // NEG B + MinxCPU.BA.B.H = NEG(MinxCPU.BA.B.H); + return 12; + case 0xA6: // NEG [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D | I8A, NEG(MinxCPU_OnRead(1, MinxCPU.N.D | I8A))); + return 20; + case 0xA7: // NEG [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, NEG(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 16; + + case 0xA8: // EX BA, A + MinxCPU.BA.W.L = S8_TO_16(MinxCPU.BA.B.L); + return 12; + + case 0xA9: // NOTHING + return 8; + case 0xAA: // NOTHING + return 12; + + case 0xAB: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0xABCE); + return 64; + case 0xAC: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0xACCE); + return 64; + case 0xAD: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0xACCE); + return 64; + + case 0xAE: // HALT + HALT(); + return 8; + case 0xAF: // STOP + STOP(); + return 8; + + case 0xB0: // AND B, #nn + I8A = Fetch8(); + MinxCPU.BA.B.H = AND8(MinxCPU.BA.B.H, I8A); + return 12; + case 0xB1: // AND L, #nn + I8A = Fetch8(); + MinxCPU.HL.B.L = AND8(MinxCPU.HL.B.L, I8A); + return 12; + case 0xB2: // AND H, #nn + I8A = Fetch8(); + MinxCPU.HL.B.H = AND8(MinxCPU.HL.B.H, I8A); + return 12; + case 0xB3: // MOV H, V + MinxCPU.HL.B.H = MinxCPU.PC.B.I; + return 12; + + case 0xB4: // OR B, #nn + I8A = Fetch8(); + MinxCPU.BA.B.H = OR8(MinxCPU.BA.B.H, I8A); + return 12; + case 0xB5: // OR L, #nn + I8A = Fetch8(); + MinxCPU.HL.B.L = OR8(MinxCPU.HL.B.L, I8A); + return 12; + case 0xB6: // OR H, #nn + I8A = Fetch8(); + MinxCPU.HL.B.H = OR8(MinxCPU.HL.B.H, I8A); + return 12; + case 0xB7: // ??? X + MinxCPU.X.B.H = MinxCPU.PC.B.I; + return 12; + + case 0xB8: // XOR B, #nn + I8A = Fetch8(); + MinxCPU.BA.B.H = XOR8(MinxCPU.BA.B.H, I8A); + return 12; + case 0xB9: // XOR L, #nn + I8A = Fetch8(); + MinxCPU.HL.B.L = XOR8(MinxCPU.HL.B.L, I8A); + return 12; + case 0xBA: // XOR H, #nn + I8A = Fetch8(); + MinxCPU.HL.B.H = XOR8(MinxCPU.HL.B.H, I8A); + return 12; + case 0xBB: // ??? Y + MinxCPU.Y.B.H = MinxCPU.PC.B.I; + return 12; + + case 0xBC: // CMP B, #nn + I8A = Fetch8(); + SUB8(MinxCPU.BA.B.H, I8A); + return 12; + case 0xBD: // CMP L, #nn + I8A = Fetch8(); + SUB8(MinxCPU.HL.B.L, I8A); + return 12; + case 0xBE: // CMP H, #nn + I8A = Fetch8(); + SUB8(MinxCPU.HL.B.H, I8A); + return 12; + case 0xBF: // CMP N, #nn + I8A = Fetch8(); + SUB8(MinxCPU.N.B.H, I8A); + return 12; + + case 0xC0: // MOV A, N + MinxCPU.BA.B.L = MinxCPU.N.B.H; + return 8; + case 0xC1: // MOV A, F + MinxCPU.BA.B.L = MinxCPU.F; + return 8; + case 0xC2: // MOV N, A + MinxCPU.N.B.H = MinxCPU.BA.B.L; + return 8; + case 0xC3: // MOV F, A + MinxCPU.F = MinxCPU.BA.B.L; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + return 8; + + case 0xC4: // MOV U, #nn + I8A = Fetch8(); + Set_U(I8A); + return 16; + case 0xC5: // MOV I, #nn + I8A = Fetch8(); + MinxCPU.HL.B.I = I8A; + MinxCPU.N.B.I = MinxCPU.HL.B.I; + return 12; + case 0xC6: // MOV XI, #nn + I8A = Fetch8(); + MinxCPU.X.B.I = I8A; + return 12; + case 0xC7: // MOV YI, #nn + I8A = Fetch8(); + MinxCPU.Y.B.I = I8A; + return 12; + + case 0xC8: // MOV A, V + MinxCPU.BA.B.L = MinxCPU.PC.B.I; + return 8; + case 0xC9: // MOV A, I + MinxCPU.BA.B.L = MinxCPU.HL.B.I; + return 8; + case 0xCA: // MOV A, XI + MinxCPU.BA.B.L = MinxCPU.X.B.I; + return 8; + case 0xCB: // MOV A, YI + MinxCPU.BA.B.L = MinxCPU.Y.B.I; + return 8; + + case 0xCC: // MOV U, A + Set_U(MinxCPU.BA.B.L); + return 8; + case 0xCD: // MOV I, A + MinxCPU.HL.B.I = MinxCPU.BA.B.L; + MinxCPU.N.B.I = MinxCPU.HL.B.I; + return 8; + case 0xCE: // MOV XI, A + MinxCPU.X.B.I = MinxCPU.BA.B.L; + return 8; + case 0xCF: // MOV YI, A + MinxCPU.Y.B.I = MinxCPU.BA.B.L; + return 8; + + case 0xD0: // MOV A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, I16); + return 20; + case 0xD1: // MOV B, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, I16); + return 20; + case 0xD2: // MOV L, [#nnnn] + I16 = Fetch16(); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, I16); + return 20; + case 0xD3: // MOV H, [#nnnn] + I16 = Fetch16(); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, I16); + return 20; + + case 0xD4: // MOV [#nnnn], A + I16 = Fetch16(); + MinxCPU_OnWrite(1, I16, MinxCPU.BA.B.L); + return 20; + case 0xD5: // MOV [#nnnn], B + I16 = Fetch16(); + MinxCPU_OnWrite(1, I16, MinxCPU.BA.B.H); + return 20; + case 0xD6: // MOV [#nnnn], L + I16 = Fetch16(); + MinxCPU_OnWrite(1, I16, MinxCPU.HL.B.L); + return 20; + case 0xD7: // MOV [#nnnn], H + I16 = Fetch16(); + MinxCPU_OnWrite(1, I16, MinxCPU.HL.B.H); + return 20; + + case 0xD8: // MUL L, A + MUL(); + return 48; + + case 0xD9: // DIV HL, A + DIV(); + return 52; + + case 0xDA: // ??? #nn + case 0xDB: // ??? #nn + return MinxCPU_ExecSPCE(); + case 0xDC: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0xDCCE); + return 64; + case 0xDD: // NOTHING + return 16; + case 0xDE: // ??? #nn + case 0xDF: // ??? #nn + return MinxCPU_ExecSPCE(); + + case 0xE0: // JL #ss + I8A = Fetch8(); + if ( ((MinxCPU.F & MINX_FLAG_OVERFLOW)!=0) != ((MinxCPU.F & MINX_FLAG_SIGN)!=0) ) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE1: // JLE #ss + I8A = Fetch8(); + if ( (((MinxCPU.F & MINX_FLAG_OVERFLOW)==0) != ((MinxCPU.F & MINX_FLAG_SIGN)==0)) || ((MinxCPU.F & MINX_FLAG_ZERO)!=0) ) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE2: // JG #ss + I8A = Fetch8(); + if ( (((MinxCPU.F & MINX_FLAG_OVERFLOW)!=0) == ((MinxCPU.F & MINX_FLAG_SIGN)!=0)) && ((MinxCPU.F & MINX_FLAG_ZERO)==0) ) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE3: // JGE #ss + I8A = Fetch8(); + if ( ((MinxCPU.F & MINX_FLAG_OVERFLOW)==0) == ((MinxCPU.F & MINX_FLAG_SIGN)==0) ) { + JMPS(S8_TO_16(I8A)); + } + return 12; + + case 0xE4: // JO #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_OVERFLOW) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE5: // JNO #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_OVERFLOW)) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE6: // JP #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_SIGN)) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE7: // JNP #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_SIGN) { + JMPS(S8_TO_16(I8A)); + } + return 12; + + case 0xE8: // JNX0 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x01)) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xE9: // JNX1 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x02)) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xEA: // JNX2 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x04)) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xEB: // JNX3 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x08)) { + JMPS(S8_TO_16(I8A)); + } + return 12; + + case 0xEC: // JX0 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x01) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xED: // JX1 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x02) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xEE: // JX2 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x04) { + JMPS(S8_TO_16(I8A)); + } + return 12; + case 0xEF: // JX3 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x08) { + JMPS(S8_TO_16(I8A)); + } + return 12; + + case 0xF0: // CALLL #ss + I8A = Fetch8(); + if ( ((MinxCPU.F & MINX_FLAG_OVERFLOW)!=0) != ((MinxCPU.F & MINX_FLAG_SIGN)!=0) ) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF1: // CALLLE #ss + I8A = Fetch8(); + if ( (((MinxCPU.F & MINX_FLAG_OVERFLOW)==0) != ((MinxCPU.F & MINX_FLAG_SIGN)==0)) || ((MinxCPU.F & MINX_FLAG_ZERO)!=0) ) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF2: // CALLG #ss + I8A = Fetch8(); + if ( (((MinxCPU.F & MINX_FLAG_OVERFLOW)!=0) == ((MinxCPU.F & MINX_FLAG_SIGN)!=0)) && ((MinxCPU.F & MINX_FLAG_ZERO)==0) ) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF3: // CALLGE #ss + I8A = Fetch8(); + if ( ((MinxCPU.F & MINX_FLAG_OVERFLOW)==0) == ((MinxCPU.F & MINX_FLAG_SIGN)==0) ) { + CALLS(S8_TO_16(I8A)); + } + return 12; + + case 0xF4: // CALLO #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_OVERFLOW) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF5: // CALLNO #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_OVERFLOW)) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF6: // CALLNS #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_SIGN)) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF7: // CALLS #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_SIGN) { + CALLS(S8_TO_16(I8A)); + } + return 12; + + case 0xF8: // CALLNX0 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x01)) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xF9: // CALLNX1 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x02)) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xFA: // CALLNX2 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x04)) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xFB: // CALLNX3 #ss + I8A = Fetch8(); + if (!(MinxCPU.E & 0x08)) { + CALLS(S8_TO_16(I8A)); + } + return 12; + + case 0xFC: // CALLX0 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x01) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xFD: // CALLX1 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x02) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xFE: // CALLX2 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x04) { + CALLS(S8_TO_16(I8A)); + } + return 12; + case 0xFF: // CALLX3 #ss + I8A = Fetch8(); + if (MinxCPU.E & 0x08) { + CALLS(S8_TO_16(I8A)); + } + return 12; + + default: + MinxCPU_OnException(EXCEPTION_UNKNOWN_INSTRUCTION, (MinxCPU.IR << 8) + 0xCE); + return 4; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_CF.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_CF.c new file mode 100644 index 0000000000..fd139335a7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_CF.c @@ -0,0 +1,804 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Note: Any write to MinxCPU.HL.B.I needs to be reflected into MinxCPU.N.B.I + +#include "MinxCPU.h" + +int MinxCPU_ExecCF(void) +{ + uint8_t I8A; + uint16_t I16; + + // Read IR + MinxCPU.IR = Fetch8(); + + // Process instruction + switch(MinxCPU.IR) { + case 0x00: // ADD BA, BA + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x01: // ADD BA, HL + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x02: // ADD BA, X + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x03: // ADD BA, Y + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x04: // ADC BA, BA + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x05: // ADC BA, HL + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x06: // ADC BA, X + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x07: // ADC BA, Y + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x08: // SUB BA, BA + MinxCPU.BA.W.L = SUB16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x09: // SUB BA, HL + MinxCPU.BA.W.L = SUB16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x0A: // SUB BA, X + MinxCPU.BA.W.L = SUB16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x0B: // SUB BA, Y + MinxCPU.BA.W.L = SUB16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x0C: // SBC BA, BA + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x0D: // SBC BA, HL + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x0E: // SBC BA, X + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x0F: // SBC BA, Y + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x10: // *ADD BA, BA + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x11: // *ADD BA, HL + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x12: // *ADD BA, X + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x13: // *ADD BA, Y + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x14: // *ADC BA, BA + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x15: // *ADC BA, HL + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x16: // *ADC BA, X + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x17: // *ADC BA, Y + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x18: // CMP BA, BA + SUB16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x19: // CMP BA, HL + SUB16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x1A: // CMP BA, X + SUB16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x1B: // CMP BA, Y + SUB16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x1C: // *SBC BA, BA + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x1D: // *SBC BA, HL + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x1E: // *SBC BA, X + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x1F: // *SBC BA, Y + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x20: // ADD HL, BA + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x21: // ADD HL, HL + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x22: // ADD HL, X + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x23: // ADD HL, Y + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x24: // ADC HL, BA + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x25: // ADC HL, HL + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x26: // ADC HL, X + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x27: // ADC HL, Y + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x28: // SUB HL, BA + MinxCPU.HL.W.L = SUB16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x29: // SUB HL, HL + MinxCPU.HL.W.L = SUB16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x2A: // SUB HL, X + MinxCPU.HL.W.L = SUB16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x2B: // SUB HL, Y + MinxCPU.HL.W.L = SUB16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x2C: // SBC HL, BA + MinxCPU.HL.W.L = SBC16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x2D: // SBC HL, HL + MinxCPU.HL.W.L = SBC16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x2E: // SBC HL, X + MinxCPU.HL.W.L = SBC16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x2F: // SBC HL, Y + MinxCPU.HL.W.L = SBC16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x30: // *ADD HL, BA + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x31: // *ADD BA, HL + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x32: // *ADD BA, X + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x33: // *ADD BA, Y + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x34: // *ADC HL, BA + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x35: // *ADC HL, HL + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x36: // *ADC HL, X + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x37: // *ADC HL, Y + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x38: // CMP HL, BA + SUB16(MinxCPU.HL.W.L, MinxCPU.BA.W.L); + return 16; + case 0x39: // CMP HL, HL + SUB16(MinxCPU.HL.W.L, MinxCPU.HL.W.L); + return 16; + case 0x3A: // CMP HL, X + SUB16(MinxCPU.HL.W.L, MinxCPU.X.W.L); + return 16; + case 0x3B: // CMP HL, Y + SUB16(MinxCPU.HL.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x3C: // *SBC BA, BA + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.BA.W.L); + return 16; + case 0x3D: // *SBC BA, HL + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.HL.W.L); + return 16; + case 0x3E: // *SBC BA, X + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.X.W.L); + return 16; + case 0x3F: // *SBC BA, Y + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, MinxCPU.Y.W.L); + return 16; + + case 0x40: // ADD X, BA + MinxCPU.X.W.L = ADD16(MinxCPU.X.W.L, MinxCPU.BA.W.L); + return 16; + case 0x41: // ADD X, HL + MinxCPU.X.W.L = ADD16(MinxCPU.X.W.L, MinxCPU.HL.W.L); + return 16; + case 0x42: // ADD Y, BA + MinxCPU.Y.W.L = ADD16(MinxCPU.Y.W.L, MinxCPU.BA.W.L); + return 16; + case 0x43: // ADD Y, HL + MinxCPU.Y.W.L = ADD16(MinxCPU.Y.W.L, MinxCPU.HL.W.L); + return 16; + case 0x44: // ADD SP, BA + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, MinxCPU.BA.W.L); + return 16; + case 0x45: // ADD SP, HL + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, MinxCPU.HL.W.L); + return 16; + case 0x46: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x46CF); + return 16; + case 0x47: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x47CF); + return 16; + + case 0x48: // SUB X, BA + MinxCPU.X.W.L = SUB16(MinxCPU.X.W.L, MinxCPU.BA.W.L); + return 16; + case 0x49: // SUB X, HL + MinxCPU.X.W.L = SUB16(MinxCPU.X.W.L, MinxCPU.HL.W.L); + return 16; + case 0x4A: // SUB Y, BA + MinxCPU.Y.W.L = SUB16(MinxCPU.Y.W.L, MinxCPU.BA.W.L); + return 16; + case 0x4B: // SUB Y, HL + MinxCPU.Y.W.L = SUB16(MinxCPU.Y.W.L, MinxCPU.HL.W.L); + return 16; + case 0x4C: // SUB SP, BA + MinxCPU.SP.W.L = SUB16(MinxCPU.SP.W.L, MinxCPU.BA.W.L); + return 16; + case 0x4D: // SUB SP, HL + MinxCPU.SP.W.L = SUB16(MinxCPU.SP.W.L, MinxCPU.HL.W.L); + return 16; + case 0x4E: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x4ECF); + return 16; + case 0x4F: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x4FCF); + return 16; + + case 0x50: // *ADD X, BA + MinxCPU.X.W.L = ADD16(MinxCPU.X.W.L, MinxCPU.BA.W.L); + return 16; + case 0x51: // *ADD X, HL + MinxCPU.X.W.L = ADD16(MinxCPU.X.W.L, MinxCPU.HL.W.L); + return 16; + case 0x52: // *ADD Y, BA + MinxCPU.Y.W.L = ADD16(MinxCPU.Y.W.L, MinxCPU.BA.W.L); + return 16; + case 0x53: // *ADD Y, HL + MinxCPU.Y.W.L = ADD16(MinxCPU.Y.W.L, MinxCPU.HL.W.L); + return 16; + case 0x54: // *ADD SP, BA + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, MinxCPU.BA.W.L); + return 16; + case 0x55: // *ADD SP, HL + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, MinxCPU.HL.W.L); + return 16; + case 0x56: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x56CF); + return 16; + case 0x57: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x57CF); + return 16; + + case 0x58: // *SUB X, BA + MinxCPU.X.W.L = SUB16(MinxCPU.X.W.L, MinxCPU.BA.W.L); + return 16; + case 0x59: // *SUB X, HL + MinxCPU.X.W.L = SUB16(MinxCPU.X.W.L, MinxCPU.HL.W.L); + return 16; + case 0x5A: // *SUB Y, BA + MinxCPU.Y.W.L = SUB16(MinxCPU.Y.W.L, MinxCPU.BA.W.L); + return 16; + case 0x5B: // *SUB Y, HL + MinxCPU.Y.W.L = SUB16(MinxCPU.Y.W.L, MinxCPU.HL.W.L); + return 16; + case 0x5C: // CMP SP, BA + SUB16(MinxCPU.SP.W.L, MinxCPU.BA.W.L); + return 16; + case 0x5D: // CMP SP, HL + SUB16(MinxCPU.SP.W.L, MinxCPU.HL.W.L); + return 16; + case 0x5E: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x5ECF); + return 16; + case 0x5F: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0x5FCF); + return 16; + + case 0x60: // ADC BA, #nnnn + I16 = Fetch16(); + MinxCPU.BA.W.L = ADC16(MinxCPU.BA.W.L, I16); + return 16; + case 0x61: // ADC HL, #nnnn + I16 = Fetch16(); + MinxCPU.HL.W.L = ADC16(MinxCPU.HL.W.L, I16); + return 16; + case 0x62: // SBC BA, #nnnn + I16 = Fetch16(); + MinxCPU.BA.W.L = SBC16(MinxCPU.BA.W.L, I16); + return 16; + case 0x63: // SBC HL, #nnnn + I16 = Fetch16(); + MinxCPU.HL.W.L = SBC16(MinxCPU.HL.W.L, I16); + return 16; + + case 0x64: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x64CF); + return 16; + case 0x65: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x65CF); + return 16; + case 0x66: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x66CF); + return 16; + case 0x67: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x67CF); + return 16; + + case 0x68: // ADD SP, #nnnn + I16 = Fetch16(); + MinxCPU.SP.W.L = ADD16(MinxCPU.SP.W.L, I16); + return 16; + case 0x69: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x69CF); + return 16; + + case 0x6A: // SUB SP, #nnnn + I16 = Fetch16(); + MinxCPU.SP.W.L = SUB16(MinxCPU.SP.W.L, I16); + return 16; + case 0x6B: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x6BCF); + return 16; + + case 0x6C: // CMP SP, #nnnn + I16 = Fetch16(); + SUB16(MinxCPU.SP.W.L, I16); + return 16; + case 0x6D: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x6DCF); + return 16; + + case 0x6E: // MOV SP, #nnnn + I16 = Fetch16(); + MinxCPU.SP.W.L = I16; + return 16; + case 0x6F: // UNSTABLE + MinxCPU_OnException(EXCEPTION_UNSTABLE_INSTRUCTION, 0x6FCF); + return 16; + + case 0x70: // MOV BA, [SP+#ss] + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, I16++); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, I16); + return 24; + case 0x71: // MOV HL, [SP+#ss] + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, I16++); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, I16); + return 24; + case 0x72: // MOV X, [SP+#ss] + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU.X.B.L = MinxCPU_OnRead(1, I16++); + MinxCPU.X.B.H = MinxCPU_OnRead(1, I16); + return 24; + case 0x73: // MOV Y, [SP+#ss] + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU.Y.B.L = MinxCPU_OnRead(1, I16++); + MinxCPU.Y.B.H = MinxCPU_OnRead(1, I16); + return 24; + + case 0x74: // MOV [SP+#ss], BA + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, I16++, MinxCPU.BA.B.L); + MinxCPU_OnWrite(1, I16, MinxCPU.BA.B.H); + return 24; + case 0x75: // MOV [SP+#ss], HL + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, I16++, MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, I16, MinxCPU.HL.B.H); + return 24; + case 0x76: // MOV [SP+#ss], X + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, I16++, MinxCPU.X.B.L); + MinxCPU_OnWrite(1, I16, MinxCPU.X.B.H); + return 24; + case 0x77: // MOV [SP+#ss], Y + I8A = Fetch8(); + I16 = MinxCPU.SP.W.L + S8_TO_16(I8A); + MinxCPU_OnWrite(1, I16++, MinxCPU.Y.B.L); + MinxCPU_OnWrite(1, I16, MinxCPU.Y.B.H); + return 24; + + case 0x78: // MOV SP, [#nnnn] + I16 = Fetch16(); + MinxCPU.SP.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.SP.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 24; + + case 0x79: // ??? #nn + case 0x7A: // ??? #nn + case 0x7B: // ??? #nn + return MinxCPU_ExecSPCF(); + + case 0x7C: // MOV [#nnnn], SP + I16 = Fetch16(); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.SP.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.SP.B.H); + return 24; + + case 0x7D: case 0x7E: case 0x7F: // ??? #nn + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: case 0x8B: + case 0x8C: case 0x8D: case 0x8E: case 0x8F: + case 0x90: case 0x91: case 0x92: case 0x93: + case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9A: case 0x9B: + case 0x9C: case 0x9D: case 0x9E: case 0x9F: + case 0xA0: case 0xA1: case 0xA2: case 0xA3: + case 0xA4: case 0xA5: case 0xA6: case 0xA7: + case 0xA8: case 0xA9: case 0xAA: case 0xAB: + case 0xAC: case 0xAD: case 0xAE: case 0xAF: + return MinxCPU_ExecSPCF(); + + case 0xB0: // PUSH A + PUSH(MinxCPU.BA.B.L); + return 12; + case 0xB1: // PUSH B + PUSH(MinxCPU.BA.B.H); + return 12; + case 0xB2: // PUSH L + PUSH(MinxCPU.HL.B.L); + return 12; + case 0xB3: // PUSH H + PUSH(MinxCPU.HL.B.H); + return 12; + + case 0xB4: // POP A + MinxCPU.BA.B.L = POP(); + return 12; + case 0xB5: // POP B + MinxCPU.BA.B.H = POP(); + return 12; + case 0xB6: // POP L + MinxCPU.HL.B.L = POP(); + return 12; + case 0xB7: // POP H + MinxCPU.HL.B.H = POP(); + return 12; + case 0xB8: // PUSHA + PUSH(MinxCPU.BA.B.H); + PUSH(MinxCPU.BA.B.L); + PUSH(MinxCPU.HL.B.H); + PUSH(MinxCPU.HL.B.L); + PUSH(MinxCPU.X.B.H); + PUSH(MinxCPU.X.B.L); + PUSH(MinxCPU.Y.B.H); + PUSH(MinxCPU.Y.B.L); + PUSH(MinxCPU.N.B.H); + return 48; + case 0xB9: // PUSHAX + PUSH(MinxCPU.BA.B.H); + PUSH(MinxCPU.BA.B.L); + PUSH(MinxCPU.HL.B.H); + PUSH(MinxCPU.HL.B.L); + PUSH(MinxCPU.X.B.H); + PUSH(MinxCPU.X.B.L); + PUSH(MinxCPU.Y.B.H); + PUSH(MinxCPU.Y.B.L); + PUSH(MinxCPU.N.B.H); + PUSH(MinxCPU.HL.B.I); + PUSH(MinxCPU.X.B.I); + PUSH(MinxCPU.Y.B.I); + return 60; + + case 0xBA: case 0xBB: // ??? #n + return MinxCPU_ExecSPCF(); + + case 0xBC: // POPA + MinxCPU.N.B.H = POP(); + MinxCPU.Y.B.L = POP(); + MinxCPU.Y.B.H = POP(); + MinxCPU.X.B.L = POP(); + MinxCPU.X.B.H = POP(); + MinxCPU.HL.B.L = POP(); + MinxCPU.HL.B.H = POP(); + MinxCPU.BA.B.L = POP(); + MinxCPU.BA.B.H = POP(); + return 44; + + case 0xBD: // POPAX + MinxCPU.Y.B.I = POP(); + MinxCPU.X.B.I = POP(); + MinxCPU.HL.B.I = POP(); + MinxCPU.N.B.I = MinxCPU.HL.B.I; + MinxCPU.N.B.H = POP(); + MinxCPU.Y.B.L = POP(); + MinxCPU.Y.B.H = POP(); + MinxCPU.X.B.L = POP(); + MinxCPU.X.B.H = POP(); + MinxCPU.HL.B.L = POP(); + MinxCPU.HL.B.H = POP(); + MinxCPU.BA.B.L = POP(); + MinxCPU.BA.B.H = POP(); + return 56; + + case 0xBE: case 0xBF: // ??? #n + return MinxCPU_ExecSPCF(); + + case 0xC0: // MOV BA, [HL] + I16 = MinxCPU.HL.W.L; + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + case 0xC1: // MOV HL, [HL] + I16 = MinxCPU.HL.W.L; + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + case 0xC2: // MOV X, [HL] + I16 = MinxCPU.HL.W.L; + MinxCPU.X.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.X.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + case 0xC3: // MOV Y, [HL] + I16 = MinxCPU.HL.W.L; + MinxCPU.Y.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.Y.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + + case 0xC4: // MOV [HL], BA + I16 = MinxCPU.HL.W.L; + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.BA.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.BA.B.H); + return 20; + case 0xC5: // MOV [HL], HL + I16 = MinxCPU.HL.W.L; + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.HL.B.H); + return 20; + case 0xC6: // MOV [HL], X + I16 = MinxCPU.HL.W.L; + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.X.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.X.B.H); + return 20; + case 0xC7: // MOV [HL], Y + I16 = MinxCPU.HL.W.L; + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.Y.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.Y.B.H); + return 20; + + case 0xC8: case 0xC9: case 0xCA: case 0xCB: // MOV B, V + case 0xCC: case 0xCD: case 0xCE: case 0xCF: + MinxCPU.BA.B.H = MinxCPU.PC.B.I; + return 12; + + case 0xD0: // MOV BA, [X] + I16 = MinxCPU.X.W.L; + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16++); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 20; + case 0xD1: // MOV HL, [X] + I16 = MinxCPU.X.W.L; + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16++); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 20; + case 0xD2: // MOV X, [X] + I16 = MinxCPU.X.W.L; + MinxCPU.X.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16++); + MinxCPU.X.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 20; + case 0xD3: // MOV Y, [X] + I16 = MinxCPU.X.W.L; + MinxCPU.Y.B.L = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16++); + MinxCPU.Y.B.H = MinxCPU_OnRead(1, (MinxCPU.X.B.I << 16) | I16); + return 20; + + case 0xD4: // MOV [X], BA + I16 = MinxCPU.X.W.L; + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16++, MinxCPU.BA.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.BA.B.H); + return 20; + case 0xD5: // MOV [X], HL + I16 = MinxCPU.X.W.L; + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16++, MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.HL.B.H); + return 20; + case 0xD6: // MOV [X], X + I16 = MinxCPU.X.W.L; + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16++, MinxCPU.X.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.X.B.H); + return 20; + case 0xD7: // MOV [X], Y + I16 = MinxCPU.X.W.L; + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16++, MinxCPU.Y.B.L); + MinxCPU_OnWrite(1, (MinxCPU.X.B.I << 16) | I16, MinxCPU.Y.B.H); + return 20; + + case 0xD8: // MOV BA, [Y] + I16 = MinxCPU.Y.W.L; + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16++); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 20; + case 0xD9: // MOV HL, [Y] + I16 = MinxCPU.Y.W.L; + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16++); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 20; + case 0xDA: // MOV X, [Y] + I16 = MinxCPU.Y.W.L; + MinxCPU.X.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16++); + MinxCPU.X.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 20; + case 0xDB: // MOV Y, [Y] + I16 = MinxCPU.Y.W.L; + MinxCPU.Y.B.L = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16++); + MinxCPU.Y.B.H = MinxCPU_OnRead(1, (MinxCPU.Y.B.I << 16) | I16); + return 20; + + case 0xDC: // MOV [Y], BA + I16 = MinxCPU.Y.W.L; + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16++, MinxCPU.BA.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.BA.B.H); + return 20; + case 0xDD: // MOV [Y], HL + I16 = MinxCPU.Y.W.L; + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16++, MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.HL.B.H); + return 20; + case 0xDE: // MOV [Y], X + I16 = MinxCPU.Y.W.L; + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16++, MinxCPU.X.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.X.B.H); + return 20; + case 0xDF: // MOV [Y], Y + I16 = MinxCPU.Y.W.L; + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16++, MinxCPU.Y.B.L); + MinxCPU_OnWrite(1, (MinxCPU.Y.B.I << 16) | I16, MinxCPU.Y.B.H); + return 20; + + case 0xE0: // MOV BA, BA + return 8; + case 0xE1: // MOV BA, HL + MinxCPU.BA.W.L = MinxCPU.HL.W.L; + return 8; + case 0xE2: // MOV BA, X + MinxCPU.BA.W.L = MinxCPU.X.W.L; + return 8; + case 0xE3: // MOV BA, Y + MinxCPU.BA.W.L = MinxCPU.Y.W.L; + return 8; + + case 0xE4: // MOV HL, BA + MinxCPU.HL.W.L = MinxCPU.BA.W.L; + return 8; + case 0xE5: // MOV HL, HL + return 8; + case 0xE6: // MOV HL, X + MinxCPU.HL.W.L = MinxCPU.X.W.L; + return 8; + case 0xE7: // MOV HL, Y + MinxCPU.HL.W.L = MinxCPU.Y.W.L; + return 8; + + case 0xE8: // MOV X, BA + MinxCPU.X.W.L = MinxCPU.BA.W.L; + return 8; + case 0xE9: // MOV X, HL + MinxCPU.X.W.L = MinxCPU.HL.W.L; + return 8; + case 0xEA: // MOV X, X + return 8; + case 0xEB: // MOV X, Y + MinxCPU.X.W.L = MinxCPU.Y.W.L; + return 8; + + case 0xEC: // MOV Y, BA + MinxCPU.Y.W.L = MinxCPU.BA.W.L; + return 8; + case 0xED: // MOV Y, HL + MinxCPU.Y.W.L = MinxCPU.HL.W.L; + return 8; + case 0xEE: // MOV Y, X + MinxCPU.Y.W.L = MinxCPU.X.W.L; + return 8; + case 0xEF: // MOV Y, Y + return 8; + + case 0xF0: // MOV SP, BA + MinxCPU.SP.W.L = MinxCPU.BA.W.L; + return 8; + case 0xF1: // MOV SP, HL + MinxCPU.SP.W.L = MinxCPU.HL.W.L; + return 8; + case 0xF2: // MOV SP, X + MinxCPU.SP.W.L = MinxCPU.X.W.L; + return 8; + case 0xF3: // MOV SP, Y + MinxCPU.SP.W.L = MinxCPU.Y.W.L; + return 8; + + case 0xF4: // MOV HL, SP + MinxCPU.HL.W.L = MinxCPU.SP.W.L; + return 8; + case 0xF5: // MOV HL, PC + MinxCPU.HL.W.L = MinxCPU.PC.W.L; + return 8; + case 0xF6: // ??? X + MinxCPU.X.B.H = MinxCPU.PC.B.I; + return 12; + case 0xF7: // ??? Y + MinxCPU.Y.B.H = MinxCPU.PC.B.I; + return 12; + + case 0xF8: // MOV BA, SP + MinxCPU.BA.W.L = MinxCPU.SP.W.L; + return 8; + case 0xF9: // MOV BA, PC + MinxCPU.BA.W.L = MinxCPU.PC.W.L; + return 8; + + case 0xFA: // MOV X, SP + MinxCPU.X.W.L = MinxCPU.SP.W.L; + return 8; + + case 0xFB: // NOTHING + case 0xFC: // NOTHING + return 12; + case 0xFD: // MOV A, E + MinxCPU.BA.B.L = MinxCPU.E; + return 12; + + case 0xFE: // MOV Y, SP + MinxCPU.Y.W.L = MinxCPU.SP.W.L; + return 8; + + case 0xFF: // NOTHING + return 64; + + default: + MinxCPU_OnException(EXCEPTION_UNKNOWN_INSTRUCTION, (MinxCPU.IR << 8) + 0xCF); + return 4; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_SP.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_SP.c new file mode 100644 index 0000000000..cfc80a21a4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_SP.c @@ -0,0 +1,261 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "MinxCPU.h" + +int MinxCPU_ExecSPCE(void) +{ + // Read IR + MinxCPU.IR = Fetch8(); + + // Process instruction + switch(MinxCPU.IR) { + // TODO! + default: + MinxCPU_OnException(EXCEPTION_UNKNOWN_INSTRUCTION, (MinxCPU.IR << 16) + 0xCEFF); + return 64; + } +} + +int MinxCPU_ExecSPCF(void) +{ + // Read IR + MinxCPU.IR = Fetch8(); + + // Process instruction + switch(MinxCPU.IR) { + case 0x00: case 0x01: case 0x02: case 0x03: // Decrement BA + MinxCPU.BA.W.L = DEC16(MinxCPU.BA.W.L); + return 16; + case 0x04: case 0x05: case 0x06: case 0x07: // Decrement BA if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.BA.W.L = DEC16(MinxCPU.BA.W.L); + return 16; + case 0x08: case 0x09: case 0x0A: case 0x0B: // Increment BA + MinxCPU.BA.W.L = INC16(MinxCPU.BA.W.L); + return 16; + case 0x0C: case 0x0D: case 0x0E: case 0x0F: // Increment BA if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.BA.W.L = INC16(MinxCPU.BA.W.L); + return 16; + case 0x10: case 0x11: case 0x12: case 0x13: // Decrement BA + MinxCPU.BA.W.L = DEC16(MinxCPU.BA.W.L); + return 16; + case 0x14: case 0x15: case 0x16: case 0x17: // Decrement BA if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.BA.W.L = DEC16(MinxCPU.BA.W.L); + return 16; + case 0x18: case 0x19: case 0x1A: case 0x1B: // Increment BA (Doesn't save result!!) + INC16(MinxCPU.BA.W.L); + return 16; + case 0x1C: case 0x1D: case 0x1E: case 0x1F: // Increment BA if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.BA.W.L = INC16(MinxCPU.BA.W.L); + return 16; + + case 0x20: case 0x21: case 0x22: case 0x23: // Decrement HL + MinxCPU.HL.W.L = DEC16(MinxCPU.HL.W.L); + return 16; + case 0x24: case 0x25: case 0x26: case 0x27: // Decrement HL if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.HL.W.L = DEC16(MinxCPU.HL.W.L); + return 16; + case 0x28: case 0x29: case 0x2A: case 0x2B: // Increment HL + MinxCPU.HL.W.L = INC16(MinxCPU.HL.W.L); + return 16; + case 0x2C: case 0x2D: case 0x2E: case 0x2F: // Increment HL if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.HL.W.L = INC16(MinxCPU.HL.W.L); + return 16; + case 0x30: case 0x31: case 0x32: case 0x33: // Decrement HL + MinxCPU.HL.W.L = DEC16(MinxCPU.HL.W.L); + return 16; + case 0x34: case 0x35: case 0x36: case 0x37: // Decrement HL if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.HL.W.L = DEC16(MinxCPU.HL.W.L); + return 16; + case 0x38: case 0x39: case 0x3A: case 0x3B: // Increment HL (Doesn't save result!!) + INC16(MinxCPU.HL.W.L); + return 16; + case 0x3C: case 0x3D: case 0x3E: case 0x3F: // Increment HL if Carry = 0 + if (!(MinxCPU.F & MINX_FLAG_CARRY)) MinxCPU.HL.W.L = INC16(MinxCPU.HL.W.L); + return 16; + + case 0x40: case 0x41: // Decrement X + MinxCPU.X.W.L = DEC16(MinxCPU.X.W.L); + return 16; + case 0x42: case 0x43: // Decrement Y + MinxCPU.X.W.L = DEC16(MinxCPU.X.W.L); + return 16; + case 0x44: case 0x45: // Decrement SP + MinxCPU.SP.W.L = DEC16(MinxCPU.SP.W.L); + return 16; + case 0x46: case 0x47: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 16; + + case 0x48: case 0x49: // Increment X + MinxCPU.X.W.L = INC16(MinxCPU.X.W.L); + return 16; + case 0x4A: case 0x4B: // Increment Y + MinxCPU.X.W.L = INC16(MinxCPU.X.W.L); + return 16; + case 0x4C: case 0x4D: // Increment SP + MinxCPU.SP.W.L = INC16(MinxCPU.SP.W.L); + return 16; + case 0x4E: case 0x4F: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 16; + + case 0x50: case 0x51: // Decrement X + MinxCPU.X.W.L = DEC16(MinxCPU.X.W.L); + return 16; + case 0x52: case 0x53: // Decrement Y + MinxCPU.X.W.L = DEC16(MinxCPU.X.W.L); + return 16; + case 0x54: case 0x55: // Decrement SP + MinxCPU.SP.W.L = DEC16(MinxCPU.SP.W.L); + return 16; + case 0x56: case 0x57: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 16; + + case 0x58: case 0x59: // Increment X + MinxCPU.X.W.L = INC16(MinxCPU.X.W.L); + return 16; + case 0x5A: case 0x5B: // Increment Y + MinxCPU.X.W.L = INC16(MinxCPU.X.W.L); + return 16; + case 0x5C: case 0x5D: // Increment SP + MinxCPU.SP.W.L = INC16(MinxCPU.SP.W.L); + return 16; + case 0x5E: case 0x5F: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 16; + + case 0x60: case 0x61: case 0x62: case 0x63: // CRASH + case 0x64: case 0x65: case 0x66: case 0x67: + case 0x68: case 0x69: case 0x6A: case 0x6B: + case 0x6C: case 0x6D: case 0x6E: case 0x6F: + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 16; + + case 0x70: // BA = (0x4D << 8) | V + MinxCPU.BA.W.L = 0x4D00 | MinxCPU.PC.B.I; + return 24; + case 0x71: // HL = (0x4D << 8) | V + MinxCPU.HL.W.L = 0x4D00 | MinxCPU.PC.B.I; + return 24; + case 0x72: // X = (0x4D << 8) | V + MinxCPU.X.W.L = 0x4D00 | MinxCPU.PC.B.I; + return 24; + case 0x73: // Y = (0x4D << 8) | V + MinxCPU.Y.W.L = 0x4D00 | MinxCPU.PC.B.I; + return 24; + + case 0x74: case 0x75: case 0x76: case 0x77: // NOTHING + return 24; + + case 0x78: case 0x79: case 0x7A: case 0x7B: // CRASH + case 0x7C: case 0x7D: case 0x7E: case 0x7F: + case 0x80: case 0x81: case 0x82: case 0x83: + case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: case 0x8B: + case 0x8C: case 0x8D: case 0x8E: case 0x8F: + case 0x90: case 0x91: case 0x92: case 0x93: + case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9A: case 0x9B: + case 0x9C: case 0x9D: case 0x9E: case 0x9F: + case 0xA0: case 0xA1: case 0xA2: case 0xA3: + case 0xA4: case 0xA5: case 0xA6: case 0xA7: + case 0xA8: case 0xA9: case 0xAA: case 0xAB: + case 0xAC: case 0xAD: case 0xAE: case 0xAF: + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 24; + + case 0xB0: case 0xB1: case 0xB2: case 0xB3: // NOTHING + return 12; + + case 0xB4: case 0xB5: case 0xB6: case 0xB7: // CRASH + case 0xB8: case 0xB9: case 0xBA: case 0xBB: + case 0xBC: case 0xBD: case 0xBE: case 0xBF: + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 12; + + case 0xC0: // BA = (0x20 << 8) | V + MinxCPU.BA.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xC1: // HL = (0x20 << 8) | V + MinxCPU.HL.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xC2: // X = (0x20 << 8) | V + MinxCPU.X.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xC3: // Y = (0x20 << 8) | V + MinxCPU.Y.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + + case 0xC4: case 0xC5: case 0xC6: case 0xC7: // NOTHING + return 20; + + case 0xC8: case 0xC9: case 0xCA: case 0xCB: // CRASH + case 0xCC: case 0xCD: case 0xCE: case 0xCF: + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 20; + + case 0xD0: // BA = (0x20 << 8) | V + MinxCPU.BA.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xD1: // HL = (0x20 << 8) | V + MinxCPU.HL.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xD2: // X = (0x20 << 8) | V + MinxCPU.X.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xD3: // Y = (0x00 << 8) | V ? (EH!?) + MinxCPU.Y.W.L = 0x0000 | MinxCPU.PC.B.I; + return 20; + + case 0xD4: case 0xD5: case 0xD6: case 0xD7: // NOTHING + return 20; + + case 0xD8: // BA = (0x20 << 8) | V + MinxCPU.BA.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xD9: // HL = (0x20 << 8) | V + MinxCPU.HL.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xDA: // X = (0x20 << 8) | V + MinxCPU.X.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + case 0xDB: // Y = (0x20 << 8) | V + MinxCPU.Y.W.L = 0x2000 | MinxCPU.PC.B.I; + return 20; + + case 0xDC: case 0xDD: case 0xDE: case 0xDF: // NOTHING + return 20; + + case 0xE0: case 0xE1: case 0xE2: case 0xE3: // CRASH + case 0xE4: case 0xE5: case 0xE6: case 0xE7: + case 0xE8: case 0xE9: case 0xEA: case 0xEB: + case 0xEC: case 0xED: case 0xEE: case 0xEF: + case 0xF0: case 0xF1: case 0xF2: case 0xF3: + case 0xF4: case 0xF5: case 0xF6: case 0xF7: + case 0xF8: case 0xF9: case 0xFA: case 0xFB: + case 0xFC: case 0xFD: case 0xFE: case 0xFF: + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, (MinxCPU.IR << 16) | 0xBFCF); + return 24; + + default: + MinxCPU_OnException(EXCEPTION_UNKNOWN_INSTRUCTION, (MinxCPU.IR << 16) + 0xBFCF); + return 64; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_XX.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_XX.c new file mode 100644 index 0000000000..1b23685dbe --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_XX.c @@ -0,0 +1,1061 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// Note: Any write to MinxCPU.HL.B.I needs to be reflected into MinxCPU.N.B.I + +#include "MinxCPU.h" + +int MinxCPU_Exec(void) +{ + uint8_t I8A, I8B; + uint16_t I16; + + // Shift U + if (MinxCPU.Shift_U) { + MinxCPU.U1 = MinxCPU.U2; + MinxCPU.U2 = MinxCPU.PC.B.I; + MinxCPU.Shift_U--; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + } + + // Check HALT or STOP status + if (MinxCPU.Status != MINX_STATUS_NORMAL) { + if (MinxCPU.Status == MINX_STATUS_IRQ) { + MinxCPU.Status = MINX_STATUS_NORMAL; // Return to normal + CALLI(MinxCPU.IRQ_Vector); // Jump to IRQ vector + return 20; + } else { + return 8; // Cause short NOPs + } + } + + // Read IR + MinxCPU.IR = Fetch8(); + + // Process instruction + switch(MinxCPU.IR) { + + case 0x00: // ADD A, A + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x01: // ADD A, B + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x02: // ADD A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x03: // ADD A, [HL] + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x04: // ADD A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x05: // ADD A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x06: // ADD A, [X] + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x07: // ADD A, [Y] + MinxCPU.BA.B.L = ADD8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x08: // ADC A, A + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x09: // ADC A, B + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x0A: // ADC A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x0B: // ADC A, [HL] + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x0C: // ADC A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x0D: // ADC A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x0E: // ADC A, [X] + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x0F: // ADC A, [Y] + MinxCPU.BA.B.L = ADC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x10: // SUB A, A + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x11: // SUB A, B + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x12: // SUB A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x13: // SUB A, [HL] + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x14: // SUB A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x15: // SUB A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x16: // SUB A, [X] + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x17: // SUB A, [Y] + MinxCPU.BA.B.L = SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x18: // SBC A, A + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x19: // SBC A, B + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x1A: // SBC A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x1B: // SBC A, [HL] + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x1C: // SBC A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x1D: // SBC A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x1E: // SBC A, [X] + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x1F: // SBC A, [Y] + MinxCPU.BA.B.L = SBC8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x20: // AND A, A + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x21: // AND A, B + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x22: // AND A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x23: // AND A, [HL] + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x24: // AND A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x25: // AND A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x26: // AND A, [X] + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x27: // AND A, [Y] + MinxCPU.BA.B.L = AND8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x28: // OR A, A + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x29: // OR A, B + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x2A: // OR A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x2B: // OR A, [HL] + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x2C: // OR A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x2D: // OR A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x2E: // OR A, [X] + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x2F: // OR A, [Y] + MinxCPU.BA.B.L = OR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x30: // CMP A, A + SUB8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x31: // CMP A, B + SUB8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x32: // CMP A, #nn + I8A = Fetch8(); + SUB8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x33: // CMP A, [HL] + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x34: // CMP A, [N+#nn] + I8A = Fetch8(); + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x35: // CMP A, [#nnnn] + I16 = Fetch16(); + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x36: // CMP A, [X] + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x37: // CMP A, [Y] + SUB8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x38: // XOR A, A + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU.BA.B.L); + return 8; + case 0x39: // XOR A, B + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x3A: // XOR A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x3B: // XOR A, [HL] + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 8; + case 0x3C: // XOR A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 12; + case 0x3D: // XOR A, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16)); + return 16; + case 0x3E: // XOR A, [X] + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 8; + case 0x3F: // XOR A, [Y] + MinxCPU.BA.B.L = XOR8(MinxCPU.BA.B.L, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 8; + + case 0x40: // MOV A, A + return 4; + case 0x41: // MOV A, B + MinxCPU.BA.B.L = MinxCPU.BA.B.H; + return 4; + case 0x42: // MOV A, L + MinxCPU.BA.B.L = MinxCPU.HL.B.L; + return 4; + case 0x43: // MOV A, H + MinxCPU.BA.B.L = MinxCPU.HL.B.H; + return 4; + case 0x44: // MOV A, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, MinxCPU.N.D + I8A); + return 12; + case 0x45: // MOV A, [HL] + MinxCPU.BA.B.L = MinxCPU_OnRead(1, MinxCPU.HL.D); + return 8; + case 0x46: // MOV A, [X] + MinxCPU.BA.B.L = MinxCPU_OnRead(1, MinxCPU.X.D); + return 8; + case 0x47: // MOV A, [Y] + MinxCPU.BA.B.L = MinxCPU_OnRead(1, MinxCPU.Y.D); + return 8; + + case 0x48: // MOV B, A + MinxCPU.BA.B.H = MinxCPU.BA.B.L; + return 4; + case 0x49: // MOV B, B + return 4; + case 0x4A: // MOV B, L + MinxCPU.BA.B.H = MinxCPU.HL.B.L; + return 4; + case 0x4B: // MOV B, H + MinxCPU.BA.B.H = MinxCPU.HL.B.H; + return 4; + case 0x4C: // MOV B, [N+#nn] + I8A = Fetch8(); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, MinxCPU.N.D + I8A); + return 12; + case 0x4D: // MOV B, [HL] + MinxCPU.BA.B.H = MinxCPU_OnRead(1, MinxCPU.HL.D); + return 8; + case 0x4E: // MOV B, [X] + MinxCPU.BA.B.H = MinxCPU_OnRead(1, MinxCPU.X.D); + return 8; + case 0x4F: // MOV B, [Y] + MinxCPU.BA.B.H = MinxCPU_OnRead(1, MinxCPU.Y.D); + return 8; + + case 0x50: // MOV L, A + MinxCPU.HL.B.L = MinxCPU.BA.B.L; + return 4; + case 0x51: // MOV L, B + MinxCPU.HL.B.L = MinxCPU.BA.B.H; + return 4; + case 0x52: // MOV L, L + return 4; + case 0x53: // MOV L, H + MinxCPU.HL.B.L = MinxCPU.HL.B.H; + return 4; + case 0x54: // MOV L, [N+#nn] + I8A = Fetch8(); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, MinxCPU.N.D + I8A); + return 12; + case 0x55: // MOV L, [HL] + MinxCPU.HL.B.L = MinxCPU_OnRead(1, MinxCPU.HL.D); + return 8; + case 0x56: // MOV L, [X] + MinxCPU.HL.B.L = MinxCPU_OnRead(1, MinxCPU.X.D); + return 8; + case 0x57: // MOV L, [Y] + MinxCPU.HL.B.L = MinxCPU_OnRead(1, MinxCPU.Y.D); + return 8; + + case 0x58: // MOV H, A + MinxCPU.HL.B.H = MinxCPU.BA.B.L; + return 4; + case 0x59: // MOV H, B + MinxCPU.HL.B.H = MinxCPU.BA.B.H; + return 4; + case 0x5A: // MOV H, L + MinxCPU.HL.B.H = MinxCPU.HL.B.L; + return 4; + case 0x5B: // MOV H, H + return 4; + case 0x5C: // MOV H, [N+#nn] + I8A = Fetch8(); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, MinxCPU.N.D + I8A); + return 12; + case 0x5D: // MOV H, [HL] + MinxCPU.HL.B.H = MinxCPU_OnRead(1, MinxCPU.HL.D); + return 8; + case 0x5E: // MOV H, [X] + MinxCPU.HL.B.H = MinxCPU_OnRead(1, MinxCPU.X.D); + return 8; + case 0x5F: // MOV H, [Y] + MinxCPU.HL.B.H = MinxCPU_OnRead(1, MinxCPU.Y.D); + return 8; + + case 0x60: // MOV [X], A + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU.BA.B.L); + return 8; + case 0x61: // MOV [X], B + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU.BA.B.H); + return 8; + case 0x62: // MOV [X], L + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU.HL.B.L); + return 8; + case 0x63: // MOV [X], H + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU.HL.B.H); + return 8; + case 0x64: // MOV [X], [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 16; + case 0x65: // MOV [X], [HL] + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 12; + case 0x66: // MOV [X], [X] + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 12; + case 0x67: // MOV [X], [Y] + MinxCPU_OnWrite(1, MinxCPU.X.D, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 12; + + case 0x68: // MOV [HL], A + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU.BA.B.L); + return 8; + case 0x69: // MOV [HL], B + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU.BA.B.H); + return 8; + case 0x6A: // MOV [HL], L + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU.HL.B.L); + return 8; + case 0x6B: // MOV [HL], H + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU.HL.B.H); + return 8; + case 0x6C: // MOV [HL], [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 16; + case 0x6D: // MOV [HL], [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 12; + case 0x6E: // MOV [HL], [X] + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 12; + case 0x6F: // MOV [HL], [Y] + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 12; + + case 0x70: // MOV [Y], A + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU.BA.B.L); + return 8; + case 0x71: // MOV [Y], B + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU.BA.B.H); + return 8; + case 0x72: // MOV [Y], L + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU.HL.B.L); + return 8; + case 0x73: // MOV [Y], H + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU.HL.B.H); + return 8; + case 0x74: // MOV [Y], [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, MinxCPU.N.D + I8A)); + return 16; + case 0x75: // MOV [Y], [HL] + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 12; + case 0x76: // MOV [Y], [X] + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 12; + case 0x77: // MOV [Y], [Y] + MinxCPU_OnWrite(1, MinxCPU.Y.D, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 12; + + case 0x78: // MOV [N+#nn], A + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU.BA.B.L); + return 8; + case 0x79: // MOV [N+#nn], B + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU.BA.B.H); + return 8; + case 0x7A: // MOV [N+#nn], L + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU.HL.B.L); + return 8; + case 0x7B: // MOV [N+#nn], H + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU.HL.B.H); + return 8; + case 0x7C: // NOTHING #nn + I8A = Fetch8(); + return 64; + case 0x7D: // MOV [N+#nn], [HL] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU_OnRead(1, MinxCPU.HL.D)); + return 16; + case 0x7E: // MOV [N+#nn], [X] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU_OnRead(1, MinxCPU.X.D)); + return 16; + case 0x7F: // MOV [N+#nn], [Y] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, MinxCPU_OnRead(1, MinxCPU.Y.D)); + return 16; + + case 0x80: // INC A + MinxCPU.BA.B.L = INC8(MinxCPU.BA.B.L); + return 8; + case 0x81: // INC B + MinxCPU.BA.B.H = INC8(MinxCPU.BA.B.H); + return 8; + case 0x82: // INC L + MinxCPU.HL.B.L = INC8(MinxCPU.HL.B.L); + return 8; + case 0x83: // INC H + MinxCPU.HL.B.H = INC8(MinxCPU.HL.B.H); + return 8; + case 0x84: // INC N + MinxCPU.N.B.H = INC8(MinxCPU.N.B.H); + return 8; + case 0x85: // INC [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, INC8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A))); + return 16; + case 0x86: // INC [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, INC8(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 12; + case 0x87: // INC SP + MinxCPU.SP.W.L = INC16(MinxCPU.SP.W.L); + return 8; + + case 0x88: // DEC A + MinxCPU.BA.B.L = DEC8(MinxCPU.BA.B.L); + return 8; + case 0x89: // DEC B + MinxCPU.BA.B.H = DEC8(MinxCPU.BA.B.H); + return 8; + case 0x8A: // DEC L + MinxCPU.HL.B.L = DEC8(MinxCPU.HL.B.L); + return 8; + case 0x8B: // DEC H + MinxCPU.HL.B.H = DEC8(MinxCPU.HL.B.H); + return 8; + case 0x8C: // DEC N + MinxCPU.N.B.H = DEC8(MinxCPU.N.B.H); + return 8; + case 0x8D: // DEC [N+#nn] + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, DEC8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A))); + return 16; + case 0x8E: // DEC [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, DEC8(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 12; + case 0x8F: // DEC SP + MinxCPU.SP.W.L = DEC16(MinxCPU.SP.W.L); + return 8; + + case 0x90: // INC BA + MinxCPU.BA.W.L = INC16(MinxCPU.BA.W.L); + return 8; + case 0x91: // INC HL + MinxCPU.HL.W.L = INC16(MinxCPU.HL.W.L); + return 8; + case 0x92: // INC X + MinxCPU.X.W.L = INC16(MinxCPU.X.W.L); + return 8; + case 0x93: // INC Y + MinxCPU.Y.W.L = INC16(MinxCPU.Y.W.L); + return 8; + + case 0x94: // TST A, B + AND8(MinxCPU.BA.B.L, MinxCPU.BA.B.H); + return 8; + case 0x95: // TST [HL], #nn + I8A = Fetch8(); + AND8(MinxCPU_OnRead(1, MinxCPU.HL.D), I8A); + return 12; + case 0x96: // TST A, #nn + I8A = Fetch8(); + AND8(MinxCPU.BA.B.L, I8A); + return 8; + case 0x97: // TST B, #nn + I8A = Fetch8(); + AND8(MinxCPU.BA.B.H, I8A); + return 8; + + case 0x98: // DEC BA + MinxCPU.BA.W.L = DEC16(MinxCPU.BA.W.L); + return 8; + case 0x99: // DEC HL + MinxCPU.HL.W.L = DEC16(MinxCPU.HL.W.L); + return 8; + case 0x9A: // DEC X + MinxCPU.X.W.L = DEC16(MinxCPU.X.W.L); + return 8; + case 0x9B: // DEC Y + MinxCPU.Y.W.L = DEC16(MinxCPU.Y.W.L); + return 8; + + case 0x9C: // AND F, #nn + I8A = Fetch8(); + MinxCPU.F = MinxCPU.F & I8A; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + return 12; + case 0x9D: // OR F, #nn + I8A = Fetch8(); + MinxCPU.F = MinxCPU.F | I8A; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + return 12; + case 0x9E: // XOR F, #nn + I8A = Fetch8(); + MinxCPU.F = MinxCPU.F ^ I8A; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + return 12; + case 0x9F: // MOV F, #nn + I8A = Fetch8(); + MinxCPU.F = I8A; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + return 12; + + case 0xA0: // PUSH BA + PUSH(MinxCPU.BA.B.H); + PUSH(MinxCPU.BA.B.L); + return 16; + case 0xA1: // PUSH HL + PUSH(MinxCPU.HL.B.H); + PUSH(MinxCPU.HL.B.L); + return 16; + case 0xA2: // PUSH X + PUSH(MinxCPU.X.B.H); + PUSH(MinxCPU.X.B.L); + return 16; + case 0xA3: // PUSH Y + PUSH(MinxCPU.Y.B.H); + PUSH(MinxCPU.Y.B.L); + return 16; + case 0xA4: // PUSH N + PUSH(MinxCPU.N.B.H); + return 12; + case 0xA5: // PUSH I + PUSH(MinxCPU.HL.B.I); + return 12; + case 0xA6: // PUSHX + PUSH(MinxCPU.X.B.I); + PUSH(MinxCPU.Y.B.I); + return 16; + case 0xA7: // PUSH F + PUSH(MinxCPU.F); + return 12; + + case 0xA8: // POP BA + MinxCPU.BA.B.L = POP(); + MinxCPU.BA.B.H = POP(); + return 12; + case 0xA9: // POP HL + MinxCPU.HL.B.L = POP(); + MinxCPU.HL.B.H = POP(); + return 12; + case 0xAA: // POP X + MinxCPU.X.B.L = POP(); + MinxCPU.X.B.H = POP(); + return 12; + case 0xAB: // POP Y + MinxCPU.Y.B.L = POP(); + MinxCPU.Y.B.H = POP(); + return 12; + case 0xAC: // POP N + MinxCPU.N.B.H = POP(); + return 8; + case 0xAD: // POP I + MinxCPU.HL.B.I = POP(); + MinxCPU.N.B.I = MinxCPU.HL.B.I; + return 8; + case 0xAE: // POPX + MinxCPU.Y.B.I = POP(); + MinxCPU.X.B.I = POP(); + return 12; + case 0xAF: // POP F + MinxCPU.F = POP(); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); + return 8; + + case 0xB0: // MOV A, #nn + I8A = Fetch8(); + MinxCPU.BA.B.L = I8A; + return 8; + case 0xB1: // MOV B, #nn + I8A = Fetch8(); + MinxCPU.BA.B.H = I8A; + return 8; + case 0xB2: // MOV L, #nn + I8A = Fetch8(); + MinxCPU.HL.B.L = I8A; + return 8; + case 0xB3: // MOV H, #nn + I8A = Fetch8(); + MinxCPU.HL.B.H = I8A; + return 8; + case 0xB4: // MOV N, #nn + I8A = Fetch8(); + MinxCPU.N.B.H = I8A; + return 8; + case 0xB5: // MOV [HL], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.HL.D, I8A); + return 12; + case 0xB6: // MOV [X], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.X.D, I8A); + return 12; + case 0xB7: // MOV [Y], #nn + I8A = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.Y.D, I8A); + return 12; + + case 0xB8: // MOV BA, [#nnnn] + I16 = Fetch16(); + MinxCPU.BA.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.BA.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + case 0xB9: // MOV HL, [#nnnn] + I16 = Fetch16(); + MinxCPU.HL.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.HL.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + case 0xBA: // MOV X, [#nnnn] + I16 = Fetch16(); + MinxCPU.X.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.X.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + case 0xBB: // MOV Y, [#nnnn] + I16 = Fetch16(); + MinxCPU.Y.B.L = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16++); + MinxCPU.Y.B.H = MinxCPU_OnRead(1, (MinxCPU.HL.B.I << 16) | I16); + return 20; + + case 0xBC: // MOV [#nnnn], BA + I16 = Fetch16(); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.BA.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.BA.B.H); + return 20; + case 0xBD: // MOV [#nnnn], HL + I16 = Fetch16(); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.HL.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.HL.B.H); + return 20; + case 0xBE: // MOV [#nnnn], X + I16 = Fetch16(); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.X.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.X.B.H); + return 20; + case 0xBF: // MOV [#nnnn], Y + I16 = Fetch16(); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16++, MinxCPU.Y.B.L); + MinxCPU_OnWrite(1, (MinxCPU.HL.B.I << 16) | I16, MinxCPU.Y.B.H); + return 20; + + case 0xC0: // ADD BA, #nnnn + I16 = Fetch16(); + MinxCPU.BA.W.L = ADD16(MinxCPU.BA.W.L, I16); + return 12; + case 0xC1: // ADD HL, #nnnn + I16 = Fetch16(); + MinxCPU.HL.W.L = ADD16(MinxCPU.HL.W.L, I16); + return 12; + case 0xC2: // ADD X, #nnnn + I16 = Fetch16(); + MinxCPU.X.W.L = ADD16(MinxCPU.X.W.L, I16); + return 12; + case 0xC3: // ADD Y, #nnnn + I16 = Fetch16(); + MinxCPU.Y.W.L = ADD16(MinxCPU.Y.W.L, I16); + return 12; + + case 0xC4: // MOV BA, #nnnn + I16 = Fetch16(); + MinxCPU.BA.W.L = I16; + return 12; + case 0xC5: // MOV HL, #nnnn + I16 = Fetch16(); + MinxCPU.HL.W.L = I16; + return 12; + case 0xC6: // MOV X, #nnnn + I16 = Fetch16(); + MinxCPU.X.W.L = I16; + return 12; + case 0xC7: // MOV Y, #nnnn + I16 = Fetch16(); + MinxCPU.Y.W.L = I16; + return 12; + + case 0xC8: // XCHG BA, HL + I16 = MinxCPU.HL.W.L; + MinxCPU.HL.W.L = MinxCPU.BA.W.L; + MinxCPU.BA.W.L = I16; + return 12; + case 0xC9: // XCHG BA, X + I16 = MinxCPU.X.W.L; + MinxCPU.X.W.L = MinxCPU.BA.W.L; + MinxCPU.BA.W.L = I16; + return 12; + case 0xCA: // XCHG BA, Y + I16 = MinxCPU.Y.W.L; + MinxCPU.Y.W.L = MinxCPU.BA.W.L; + MinxCPU.BA.W.L = I16; + return 12; + case 0xCB: // XCHG BA, SP + I16 = MinxCPU.SP.W.L; + MinxCPU.SP.W.L = MinxCPU.BA.W.L; + MinxCPU.BA.W.L = I16; + return 12; + + case 0xCC: // XCHG A, B + I8A = MinxCPU.BA.B.H; + MinxCPU.BA.B.H = MinxCPU.BA.B.L; + MinxCPU.BA.B.L = I8A; + return 8; + case 0xCD: // XCHG A, [HL] + I8A = MinxCPU_OnRead(1, MinxCPU.HL.D); + MinxCPU_OnWrite(1, MinxCPU.HL.D, MinxCPU.BA.B.L); + MinxCPU.BA.B.L = I8A; + return 12; + + case 0xCE: // Expand 0 + return MinxCPU_ExecCE(); + + case 0xCF: // Expand 1 + return MinxCPU_ExecCF(); + + case 0xD0: // SUB BA, #nnnn + I16 = Fetch16(); + MinxCPU.BA.W.L = SUB16(MinxCPU.BA.W.L, I16); + return 12; + case 0xD1: // SUB HL, #nnnn + I16 = Fetch16(); + MinxCPU.HL.W.L = SUB16(MinxCPU.HL.W.L, I16); + return 12; + case 0xD2: // SUB X, #nnnn + I16 = Fetch16(); + MinxCPU.X.W.L = SUB16(MinxCPU.X.W.L, I16); + return 12; + case 0xD3: // SUB Y, #nnnn + I16 = Fetch16(); + MinxCPU.Y.W.L = SUB16(MinxCPU.Y.W.L, I16); + return 12; + + case 0xD4: // CMP BA, #nnnn + I16 = Fetch16(); + SUB16(MinxCPU.BA.W.L, I16); + return 12; + case 0xD5: // CMP HL, #nnnn + I16 = Fetch16(); + SUB16(MinxCPU.HL.W.L, I16); + return 12; + case 0xD6: // CMP X, #nnnn + I16 = Fetch16(); + SUB16(MinxCPU.X.W.L, I16); + return 12; + case 0xD7: // CMP Y, #nnnn + I16 = Fetch16(); + SUB16(MinxCPU.Y.W.L, I16); + return 12; + + case 0xD8: // AND [N+#nn], #nn + I8A = Fetch8(); + I8B = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, AND8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A), I8B)); + return 20; + case 0xD9: // OR [N+#nn], #nn + I8A = Fetch8(); + I8B = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, OR8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A), I8B)); + return 20; + case 0xDA: // XOR [N+#nn], #nn + I8A = Fetch8(); + I8B = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, XOR8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A), I8B)); + return 20; + case 0xDB: // CMP [N+#nn], #nn + I8A = Fetch8(); + I8B = Fetch8(); + SUB8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A), I8B); + return 16; + case 0xDC: // TST [N+#nn], #nn + I8A = Fetch8(); + I8B = Fetch8(); + AND8(MinxCPU_OnRead(1, MinxCPU.N.D + I8A), I8B); + return 16; + case 0xDD: // MOV [N+#nn], #nn + I8A = Fetch8(); + I8B = Fetch8(); + MinxCPU_OnWrite(1, MinxCPU.N.D + I8A, I8B); + return 16; + + case 0xDE: // PACK + MinxCPU.BA.B.L = (MinxCPU.BA.B.L & 0x0F) | (MinxCPU.BA.B.H << 4); + return 8; + + case 0xDF: // UNPACK + MinxCPU.BA.B.H = (MinxCPU.BA.B.L >> 4); + MinxCPU.BA.B.L = MinxCPU.BA.B.L & 0x0F; + return 8; + + case 0xE0: // CALLC #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_CARRY) { + CALLS(S8_TO_16(I8A)); + return 20; + } + return 8; + case 0xE1: // CALLNC #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_CARRY)) { + CALLS(S8_TO_16(I8A)); + return 20; + } + return 8; + case 0xE2: // CALLZ #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_ZERO) { + CALLS(S8_TO_16(I8A)); + return 20; + } + return 8; + case 0xE3: // CALLNZ #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_ZERO)) { + CALLS(S8_TO_16(I8A)); + return 20; + } + return 8; + + case 0xE4: // JC #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_CARRY) { + JMPS(S8_TO_16(I8A)); + } + return 8; + case 0xE5: // JNC #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_CARRY)) { + JMPS(S8_TO_16(I8A)); + } + return 8; + case 0xE6: // JZ #ss + I8A = Fetch8(); + if (MinxCPU.F & MINX_FLAG_ZERO) { + JMPS(S8_TO_16(I8A)); + } + return 8; + case 0xE7: // JNZ #ss + I8A = Fetch8(); + if (!(MinxCPU.F & MINX_FLAG_ZERO)) { + JMPS(S8_TO_16(I8A)); + } + return 8; + + case 0xE8: // CALLC #ssss + I16 = Fetch16(); + if (MinxCPU.F & MINX_FLAG_CARRY) { + CALLS(I16); + return 24; + } + return 12; + case 0xE9: // CALLNC #ssss + I16 = Fetch16(); + if (!(MinxCPU.F & MINX_FLAG_CARRY)) { + CALLS(I16); + return 24; + } + return 12; + case 0xEA: // CALLZ #ssss + I16 = Fetch16(); + if (MinxCPU.F & MINX_FLAG_ZERO) { + CALLS(I16); + return 24; + } + return 12; + case 0xEB: // CALLNZ #ssss + I16 = Fetch16(); + if (!(MinxCPU.F & MINX_FLAG_ZERO)) { + CALLS(I16); + return 24; + } + return 12; + + case 0xEC: // JC #ssss + I16 = Fetch16(); + if (MinxCPU.F & MINX_FLAG_CARRY) { + JMPS(I16); + } + return 12; + case 0xED: // JNC #ssss + I16 = Fetch16(); + if (!(MinxCPU.F & MINX_FLAG_CARRY)) { + JMPS(I16); + } + return 12; + case 0xEE: // JZ #ssss + I16 = Fetch16(); + if (MinxCPU.F & MINX_FLAG_ZERO) { + JMPS(I16); + } + return 12; + case 0xEF: // JNZ #ssss + I16 = Fetch16(); + if (!(MinxCPU.F & MINX_FLAG_ZERO)) { + JMPS(I16); + } + return 12; + + case 0xF0: // CALL #ss + I8A = Fetch8(); + CALLS(S8_TO_16(I8A)); + return 20; + case 0xF1: // JMP #ss + I8A = Fetch8(); + JMPS(S8_TO_16(I8A)); + return 8; + case 0xF2: // CALL #ssss + I16 = Fetch16(); + CALLS(I16); + return 24; + case 0xF3: // JMP #ssss + I16 = Fetch16(); + JMPS(I16); + return 12; + + case 0xF4: // JMP HL + JMPU(MinxCPU.HL.W.L); + return 8; + + case 0xF5: // JDBNZ #ss + I8A = Fetch8(); + JDBNZ(S8_TO_16(I8A)); + return 16; + + case 0xF6: // SWAP A + MinxCPU.BA.B.L = SWAP(MinxCPU.BA.B.L); + return 8; + case 0xF7: // SWAP [HL] + MinxCPU_OnWrite(1, MinxCPU.HL.D, SWAP(MinxCPU_OnRead(1, MinxCPU.HL.D))); + return 12; + + case 0xF8: // RET + RET(); + return 16; + case 0xF9: // RETI + RETI(); + return 16; + case 0xFA: // RETSKIP + RET(); + MinxCPU.PC.W.L = MinxCPU.PC.W.L + 2; + return 16; + + case 0xFB: // CALL [#nnnn] + I16 = Fetch16(); + CALLX(I16); + return 20; + case 0xFC: // CINT #nn + I16 = Fetch8(); + CALLI(I16); + return 20; + case 0xFD: // JINT #nn + I16 = Fetch8(); + JMPI(I16); + return 8; + + case 0xFE: // CRASH + MinxCPU_OnException(EXCEPTION_CRASH_INSTRUCTION, 0xFE); + return 4; + + case 0xFF: // NOP + return 8; + + default: + MinxCPU_OnException(EXCEPTION_UNKNOWN_INSTRUCTION, MinxCPU.IR); + return 4; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_noBranch.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_noBranch.h new file mode 100644 index 0000000000..fcbbce4349 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxCPU_noBranch.h @@ -0,0 +1,765 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXCPU_CORE +#define MINXCPU_CORE + +#include +#include + +#ifdef _BIG_ENDIAN + +typedef union { + struct { + uint8_t X; + uint8_t I; + uint8_t H; + uint8_t L; + } B; + struct { + uint16_t H; + uint16_t L; + } W; + uint32_t D; +} MinxRegx; + +#else + +typedef union { + struct { + uint8_t L; + uint8_t H; + uint8_t I; + uint8_t X; + } B; + struct { + uint16_t L; + uint16_t H; + } W; + uint32_t D; +} MinxRegx; + +#endif + +#define MINX_FLAG_ZERO 0x01 +#define MINX_FLAG_CARRY 0x02 +#define MINX_FLAG_OVERFLOW 0x04 +#define MINX_FLAG_SIGN 0x08 +#define MINX_FLAG_BCD 0x10 +#define MINX_FLAG_NIBBLE 0x20 +#define MINX_FLAG_INTFLG 0x40 +#define MINX_FLAG_INTOFF 0x80 + +#define MINX_FLAG_SIGN_S4 0 +#define MINX_FLAG_OVER_S4 1 +#define MINX_FLAG_SIGN_S8 4 +#define MINX_FLAG_OVER_S8 5 +#define MINX_FLAG_SIGN_S16 12 +#define MINX_FLAG_OVER_S16 13 + +#define MINX_FLAG_SAVE_NUL 0xF0 +#define MINX_FLAG_SAVE_O 0xF4 +#define MINX_FLAG_SAVE_CO 0xF6 +#define MINX_FLAG_SAVE_COS 0xFE + +// OnException() reasons +enum { + EXCEPTION_UNKNOWN_INSTRUCTION, + EXCEPTION_CRASH_INSTRUCTION, + EXCEPTION_UNSTABLE_INSTRUCTION, + EXCEPTION_DIVISION_BY_ZERO +}; + +// OnSleep() reasons +enum { + MINX_SLEEP_HALT, + MINX_SLEEP_STOP +}; + +// Status reasons +enum { + MINX_STATUS_NORMAL = 0, // Normal operation + MINX_STATUS_HALT = 1, // CPU during HALT + MINX_STATUS_STOP = 2, // CPU during STOP + MINX_STATUS_IRQ = 3, // Delay caused by hardware IRQ +}; + +// DebugHalt reasons +enum { + MINX_DEBUGHALT_RECEIVE, + MINX_DEBUGHALT_SUSPEND, + MINX_DEBUGHALT_RESUME, +}; + +#ifndef inline +#define inline __inline +#endif + +// Signed 8-Bits to 16-Bits converter +static inline uint16_t S8_TO_16(int8_t a) +{ + return (a & 0x80) ? (0xFF00 | a) : a; +} + +typedef struct { + // Registers + MinxRegx BA; // Registers A, B + MinxRegx HL; // Registers L, H, I + MinxRegx X; // Registers X, XI + MinxRegx Y; // Registers Y, YI + MinxRegx SP; // Register SP + MinxRegx PC; // Registers PC, V + MinxRegx N; // for [N+#nn], I is written here too + uint8_t U1; // V Shadow 1 + uint8_t U2; // V Shadow 2 + uint8_t F; // Flags + uint8_t E; // Exception + uint8_t IR; // Last Instruction Register (for open-bus) + uint8_t Shift_U; // Shift U, set to 2 when: U modify, branch, return + uint8_t Status; // CPU Status (0 = Normal, 1 = Halt, 2 = Stoped, 3 = IRQ) + uint8_t IRQ_Vector; // IRQ Vector when Status is IRQ + uint8_t Reserved[28]; // Reserved bytes +} TMinxCPU; + +// CPU registers +extern TMinxCPU MinxCPU; + +// Callbacks (Must be coded by the user) +uint8_t MinxCPU_OnRead(int cpu, uint32_t addr); +void MinxCPU_OnWrite(int cpu, uint32_t addr, uint8_t data); +void MinxCPU_OnException(int type, uint32_t opc); +void MinxCPU_OnSleep(int type); +void MinxCPU_OnIRQHandle(uint8_t flag, uint8_t shift_u); +void MinxCPU_OnIRQAct(uint8_t intr); + +// Functions +int MinxCPU_Create(void); // Create MinxCPU +void MinxCPU_Destroy(void); // Destroy MinxCPU +void MinxCPU_Reset(int hardreset); // Reset CPU +int MinxCPU_LoadState(FILE *fi, uint32_t bsize); // Load State +int MinxCPU_SaveState(FILE *fi); // Save State +int MinxCPU_Exec(void); // Execute 1 CPU instruction +int MinxCPU_CallIRQ(uint8_t IRQ); // Call an IRQ + +// Helpers +static inline uint16_t ReadMem16(uint32_t addr) +{ + return MinxCPU_OnRead(1, addr) + (MinxCPU_OnRead(1, addr+1) << 8); +} + +static inline void WriteMem16(uint32_t addr, uint16_t data) +{ + MinxCPU_OnWrite(1, addr, (uint8_t)data); + MinxCPU_OnWrite(1, addr+1, data >> 8); +} + +static inline uint8_t Fetch8(void) +{ + if (MinxCPU.PC.W.L & 0x8000) { + // Banked area + MinxCPU.IR = MinxCPU_OnRead(1, (MinxCPU.PC.W.L++ & 0x7FFF) | (MinxCPU.PC.B.I << 15)); + } else { + // Unbanked area + MinxCPU.IR = MinxCPU_OnRead(1, MinxCPU.PC.W.L++); + } + return MinxCPU.IR; +} + +static inline uint16_t Fetch16(void) +{ + uint8_t LB = Fetch8(); + return (Fetch8() << 8) | LB; +} + +static inline void Set_U(uint8_t val) +{ + if (val != MinxCPU.U2) MinxCPU.Shift_U = 2; + MinxCPU.U1 = val; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +// Instruction exec. prototypes + +int MinxCPU_ExecCE(void); +int MinxCPU_ExecCF(void); +int MinxCPU_ExecSPCE(void); +int MinxCPU_ExecSPCF(void); + +// Instructions Macros + +static inline uint8_t ADD8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A + B; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES < A) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B ^ 0x80) & 0x80) >> MINX_FLAG_OVER_S8) | // Overflow + ((RES & 0x80) >> MINX_FLAG_SIGN_S8); // Sign + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) + (B & 15)) >= 10) { + RES = A + B + 6; + } else { + RES = A + B; + } + if (RES >= 0xA0) RES += 0x60; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES < A) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) + (B & 15); + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B ^ 0x08) & 0x08) >> MINX_FLAG_OVER_S4) | // Overflow + ((RES & 0x08) >> MINX_FLAG_SIGN_S4); // Sign + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) + (B & 15)) >= 10) { + RES = (A & 15) + (B & 15) + 6; + } else { + RES = (A & 15) + (B & 15); + } + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0x0F; + } +} + +static inline uint16_t ADD16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A + B; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES < A) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B ^ 0x8000) & 0x8000) >> MINX_FLAG_OVER_S16) | // Overflow + ((RES & 0x8000) >> MINX_FLAG_SIGN_S16); // Sign + return (uint16_t)RES; +} + +static inline uint8_t ADC8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A + B + CARRY; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES < A) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B ^ 0x80) & 0x80) >> MINX_FLAG_OVER_S8) | // Overflow + ((RES & 0x80) >> MINX_FLAG_SIGN_S8); // Sign + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) + (B & 15) + CARRY) >= 10) { + RES = A + B + CARRY + 6; + } else { + RES = A + B + CARRY; + } + if (RES >= 0xA0) RES += 0x60; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES < A) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) + (B & 15) + CARRY; + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B ^ 0x08) & 0x08) >> MINX_FLAG_OVER_S4) | // Overflow + ((RES & 0x08) >> MINX_FLAG_SIGN_S4); // Sign + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) + (B & 15) + CARRY) >= 10) { + RES = (A & 15) + (B & 15) + CARRY + 6; + } else { + RES = (A & 15) + (B & 15) + CARRY; + } + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0x0F; + } +} + +static inline uint16_t ADC16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A + B + ((MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0); + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES < A) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B ^ 0x8000) & 0x8000) >> MINX_FLAG_OVER_S16) | // Overflow + ((RES & 0x8000) >> MINX_FLAG_SIGN_S16); // Sign + return (uint16_t)RES; +} + +static inline uint8_t SUB8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A - B; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((A < B) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B) & 0x80) >> MINX_FLAG_OVER_S8) | // Overflow + ((RES & 0x80) >> MINX_FLAG_SIGN_S8); // Sign + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) - (B & 15)) >= 10) { + RES = A - B - 6; + } else { + RES = A - B; + } + if (RES >= 0xA0) RES -= 0x60; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((A < B) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) - (B & 15); + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B) & 0x08) >> MINX_FLAG_OVER_S4) | // Overflow + ((RES & 0x08) >> MINX_FLAG_SIGN_S4); // Sign + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) - (B & 15)) >= 10) { + RES = (A & 15) - (B & 15) - 6; + } else { + RES = (A & 15) - (B & 15); + } + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0x0F; + } +} + +static inline uint16_t SUB16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A - B; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((A < B) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B) & 0x8000) >> MINX_FLAG_OVER_S16) | // Overflow + ((RES & 0x8000) >> MINX_FLAG_SIGN_S16); // Sign + return (uint16_t)RES; +} + +static inline uint8_t SBC8(uint8_t A, uint8_t B) +{ + register uint8_t RES; + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + switch (MinxCPU.F & 0x30) { + case 0x00: // Normal + RES = A - B - CARRY; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((A < B) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B) & 0x80) >> MINX_FLAG_OVER_S8) | // Overflow + ((RES & 0x80) >> MINX_FLAG_SIGN_S8); // Sign + return RES & 0xFF; + case 0x10: // BCD + if ((uint8_t)((A & 15) - (B & 15) - CARRY) >= 10) { + RES = A - B - CARRY - 6; + } else { + RES = A - B - CARRY; + } + if (RES >= 0xA0) RES -= 0x60; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((A < B) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0xFF; + case 0x20: // Nibble + RES = (A & 15) - (B & 15) - CARRY; + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B) & 0x08) >> MINX_FLAG_OVER_S4) | // Overflow + ((RES & 0x08) >> MINX_FLAG_SIGN_S4); // Sign + return RES & 0x0F; + default: // BCD and Nibble + if ((uint8_t)((A & 15) - (B & 15) - CARRY) >= 10) { + RES = (A & 15) - (B & 15) - CARRY - 6; + } else { + RES = (A & 15) - (B & 15) - CARRY; + } + MinxCPU.F |= + (((RES & 15) == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((RES >= 16) ? MINX_FLAG_CARRY : 0); // Carry + return RES & 0x0F; + } +} + +static inline uint16_t SBC16(uint16_t A, uint16_t B) +{ + register uint16_t RES; + RES = A - B - ((MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0); + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + MinxCPU.F |= + ((RES == 0) ? MINX_FLAG_ZERO : 0) | // Zero + ((A < B) ? MINX_FLAG_CARRY : 0) | // Carry + (((A ^ RES) & (A ^ B) & 0x8000) >> MINX_FLAG_OVER_S16) | // Overflow + ((RES & 0x8000) >> MINX_FLAG_SIGN_S16); // Sign + return (uint16_t)RES; +} + +static inline uint8_t AND8(uint8_t A, uint8_t B) +{ + A &= B; + MinxCPU.F &= MINX_FLAG_SAVE_CO; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t OR8(uint8_t A, uint8_t B) +{ + A |= B; + MinxCPU.F &= MINX_FLAG_SAVE_CO; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t XOR8(uint8_t A, uint8_t B) +{ + A ^= B; + MinxCPU.F &= MINX_FLAG_SAVE_CO; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t INC8(uint8_t A) +{ + A++; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline uint16_t INC16(uint16_t A) +{ + A++; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline uint8_t DEC8(uint8_t A) +{ + A--; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline uint16_t DEC16(uint16_t A) +{ + A--; + MinxCPU.F &= MINX_FLAG_SAVE_COS; + if (A == 0) MinxCPU.F |= MINX_FLAG_ZERO; + return A; +} + +static inline void PUSH(uint8_t A) +{ + MinxCPU.SP.W.L--; + MinxCPU_OnWrite(1, MinxCPU.SP.D, A); +} + +static inline uint8_t POP(void) +{ + register uint8_t data; + data = MinxCPU_OnRead(1, MinxCPU.SP.D); + MinxCPU.SP.W.L++; + return data; +} + +static inline void CALLS(uint16_t OFFSET) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = MinxCPU.PC.W.L + OFFSET - 1; +} + +static inline void JMPS(uint16_t OFFSET) +{ + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = MinxCPU.PC.W.L + OFFSET - 1; +} + +static inline void CALLU(uint16_t ADDR) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ADDR; +} + +static inline void JMPU(uint16_t ADDR) +{ + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ADDR; +} + +static inline void JDBNZ(uint16_t OFFSET) +{ + MinxCPU.BA.B.H = DEC8(MinxCPU.BA.B.H); + if (MinxCPU.BA.B.H != 0) { + JMPS(OFFSET); + } +} + +static inline uint8_t SWAP(uint8_t A) +{ + return (A << 4) | (A >> 4); +} + +static inline void RET(void) +{ + MinxCPU.PC.B.L = POP(); + MinxCPU.PC.B.H = POP(); + MinxCPU.PC.B.I = POP(); + Set_U(MinxCPU.PC.B.I); +} + +static inline void RETI(void) +{ + MinxCPU.F = POP(); + MinxCPU.PC.B.L = POP(); + MinxCPU.PC.B.H = POP(); + MinxCPU.PC.B.I = POP(); + Set_U(MinxCPU.PC.B.I); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +static inline void CALLX(uint16_t ADDR) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ReadMem16((MinxCPU.HL.B.I << 16) + ADDR); +} + +static inline void CALLI(uint16_t ADDR) +{ + PUSH(MinxCPU.PC.B.I); + PUSH(MinxCPU.PC.B.H); + PUSH(MinxCPU.PC.B.L); + PUSH(MinxCPU.F); + MinxCPU.F |= 0xC0; + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ReadMem16(ADDR); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +static inline void JMPI(uint16_t ADDR) +{ + PUSH(MinxCPU.F); + MinxCPU.F |= 0xC0; + MinxCPU.PC.B.I = MinxCPU.U1; + MinxCPU.U2 = MinxCPU.U1; + MinxCPU.PC.W.L = ReadMem16(ADDR); + MinxCPU_OnIRQHandle(MinxCPU.F, MinxCPU.Shift_U); +} + +static inline uint8_t SAL(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + if ((!(A & 0x40)) != (!(A & 0x80))) MinxCPU.F |= MINX_FLAG_OVERFLOW; + A = A << 1; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t SHL(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + A = A << 1; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t SAR(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A & 0x80) | (A >> 1); + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t SHR(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = A >> 1; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t ROLC(uint8_t A) +{ + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 1 : 0; + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A << 1) | CARRY; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t ROL(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x80) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A << 1) | (A >> 7); + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t RORC(uint8_t A) +{ + register uint8_t CARRY = (MinxCPU.F & MINX_FLAG_CARRY) ? 0x80 : 0x00; + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A >> 1) | CARRY; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t ROR(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_O; + if (A & 0x01) MinxCPU.F |= MINX_FLAG_CARRY; + A = (A >> 1) | (A << 7); + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t NOT(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_CO; + A = A ^ 0xFF; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline uint8_t NEG(uint8_t A) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + A = -A; + MinxCPU.F |= + ((A == 0) ? MINX_FLAG_ZERO : MINX_FLAG_CARRY) | + ((A == 0x80) ? MINX_FLAG_OVERFLOW : 0) | + ((A & 0x80) >> MINX_FLAG_SIGN_S8); + return A; +} + +static inline void HALT(void) +{ + MinxCPU.Status = MINX_STATUS_HALT; + MinxCPU_OnSleep(MINX_SLEEP_HALT); +} + +static inline void STOP(void) +{ + MinxCPU.Status = MINX_STATUS_STOP; + MinxCPU_OnSleep(MINX_SLEEP_STOP); +} + +static inline void MUL(void) +{ + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + MinxCPU.HL.W.L = (uint16_t)MinxCPU.HL.B.L * (uint16_t)MinxCPU.BA.B.L; + MinxCPU.F |= + ((MinxCPU.HL.W.L == 0) ? MINX_FLAG_ZERO : 0) | + ((MinxCPU.HL.W.L & 0x8000) ? MINX_FLAG_SIGN : 0); +} + +static inline void DIV(void) +{ + uint16_t RES; + MinxCPU.F &= MINX_FLAG_SAVE_NUL; + if (MinxCPU.BA.B.L == 0) { + MinxCPU_OnException(EXCEPTION_DIVISION_BY_ZERO, 0); + return; + } + RES = MinxCPU.HL.W.L / MinxCPU.BA.B.L; + if (RES < 256) { + MinxCPU.HL.B.H = MinxCPU.HL.W.L % MinxCPU.BA.B.L; + MinxCPU.HL.B.L = (uint8_t)RES; + MinxCPU.F |= + ((MinxCPU.HL.B.L == 0) ? MINX_FLAG_ZERO : 0) | + ((MinxCPU.HL.B.L & 0x80) ? MINX_FLAG_SIGN : 0); + } else MinxCPU.F |= MINX_FLAG_OVERFLOW | MINX_FLAG_SIGN; +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxColorPRC.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxColorPRC.c new file mode 100644 index 0000000000..bcbdb75dcc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxColorPRC.c @@ -0,0 +1,522 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +TMinxColorPRC MinxColorPRC; +uint8_t *PRCColorVMem = NULL; // Complete CVRAM (16KB) +uint8_t *PRCColorPixels = NULL; // Active page (8KB) +uint8_t *PRCColorPixelsOld = NULL; +uint8_t *PRCColorMap = NULL; +unsigned int PRCColorOffset = 0; +uint8_t *PRCColorTop = 0x00000000; + +// Color Flags +// Bit 0 - New Color Palette +// Bit 1 - Render to RAM +// Bit 2 to 7 - Reserved +uint8_t PRCColorFlags; + +// +// Functions +// + +int MinxColorPRC_Create(void) +{ + // Create color pixels array + PRCColorVMem = (uint8_t *)malloc(8192*2); + if (!PRCColorVMem) return 0; + memset(PRCColorVMem, 0, 8192*2); + PRCColorPixels = PRCColorVMem; + PRCColorPixelsOld = (uint8_t *)malloc(96*64); + if (!PRCColorPixelsOld) return 0; + memset(PRCColorPixelsOld, 0, 96*64); + + // Reset + MinxColorPRC_Reset(1); + + return 1; +} + +void MinxColorPRC_Destroy(void) +{ + if (PRCColorVMem) { + free(PRCColorVMem); + PRCColorVMem = NULL; + } + if (PRCColorPixelsOld) { + free(PRCColorPixelsOld); + PRCColorPixelsOld = NULL; + } +} + +void MinxColorPRC_Reset(int hardreset) +{ + // Initialize State + memset((void *)&MinxColorPRC, 0, sizeof(TMinxColorPRC)); + MinxColorPRC.LNColor1 = 0xF0; + MinxColorPRC.HNColor1 = 0xF0; +} + +int MinxColorPRC_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(16384+32); + POKELOADSS_A(PRCColorVMem, 16384); + POKELOADSS_16(MinxColorPRC.UnlockCode); + POKELOADSS_8(MinxColorPRC.Unlocked); + POKELOADSS_8(MinxColorPRC.Access); + POKELOADSS_8(MinxColorPRC.Modes); + POKELOADSS_8(MinxColorPRC.ActivePage); + POKELOADSS_16(MinxColorPRC.Address); + POKELOADSS_8(MinxColorPRC.LNColor0); + POKELOADSS_8(MinxColorPRC.HNColor0); + POKELOADSS_8(MinxColorPRC.LNColor1); + POKELOADSS_8(MinxColorPRC.HNColor1); + POKELOADSS_X(20); + POKELOADSS_END(16384+32); + MinxColorPRC.Address &= 0x3FFF; + PRCColorPixels = PRCColorVMem + (MinxColorPRC.ActivePage ? 0x2000 : 0); +} + +int MinxColorPRC_SaveState(FILE *fi) +{ + POKESAVESS_START(16384+32); + POKESAVESS_A(PRCColorVMem, 16384); + POKESAVESS_16(MinxColorPRC.UnlockCode); + POKESAVESS_8(MinxColorPRC.Unlocked); + POKESAVESS_8(MinxColorPRC.Access); + POKESAVESS_8(MinxColorPRC.Modes); + POKESAVESS_8(MinxColorPRC.ActivePage); + POKESAVESS_16(MinxColorPRC.Address); + POKESAVESS_8(MinxColorPRC.LNColor0); + POKESAVESS_8(MinxColorPRC.HNColor0); + POKESAVESS_8(MinxColorPRC.LNColor1); + POKESAVESS_8(MinxColorPRC.HNColor1); + POKESAVESS_X(20); + POKESAVESS_END(16384+32); +} + +uint8_t MinxColorPRC_ReadReg(int cpu, uint8_t reg) +{ + uint8_t ret; + if (!MinxColorPRC.Unlocked) return 0x00; + + // 0xF0 to 0xFD + switch(reg) { + case 0xF0: // Color Command + return 0xCE; + case 0xF1: // CVRAM Address Low + return MinxColorPRC.Address & 0xFF; + case 0xF2: // CVRAM Address High + return (MinxColorPRC.Address >> 8) & 0x3F; + case 0xF3: // CVRAM Read + if (cpu && (MinxColorPRC.Access == 3)) MinxColorPRC.Address = (MinxColorPRC.Address + 1) & 0x3FFF; + ret = PRCColorVMem[MinxColorPRC.Address ^ (MinxColorPRC.ActivePage ? 0x2000 : 0)]; + if (cpu && (MinxColorPRC.Access == 2)) MinxColorPRC.Address = (MinxColorPRC.Address - 1) & 0x3FFF; + if (cpu && (MinxColorPRC.Access == 1)) MinxColorPRC.Address = (MinxColorPRC.Address + 1) & 0x3FFF; + return ret; + case 0xF4: // Low Nibble Pixel 0 + return MinxColorPRC.LNColor0; + case 0xF5: // High Nibble Pixel 0 + return MinxColorPRC.HNColor0; + case 0xF6: // Low Nibble Pixel 1 + return MinxColorPRC.LNColor1; + case 0xF7: // High Nibble Pixel 1 + return MinxColorPRC.HNColor1; + default: // Unused + return 0x00; + } +} + +void MinxColorPRC_WriteReg(uint8_t reg, uint8_t val) +{ + if (!MinxColorPRC.Unlocked) { + if (reg != 0xF0) return; + // Unlock sequence: ($5A, $CE) + MinxColorPRC.UnlockCode = (MinxColorPRC.UnlockCode << 8) | val; + if (MinxColorPRC.UnlockCode == 0x5ACE) { + MinxColorPRC.Unlocked = 1; + } + return; + } + + // 0xF0 to 0xFD + switch(reg) { + case 0xF0: // Color Command + MinxColorPRC_WriteCtrl(val); + return; + case 0xF1: // CROM Address Low + MinxColorPRC.Address = (MinxColorPRC.Address & 0x3F00) | val; + return; + case 0xF2: // CROM Address High + MinxColorPRC.Address = (MinxColorPRC.Address & 0x00FF) | ((val & 0x3F) << 8); + return; + case 0xF3: // CVRAM Write + if (MinxColorPRC.Access == 3) MinxColorPRC.Address = (MinxColorPRC.Address + 1) & 0x7FFF; + PRCColorVMem[MinxColorPRC.Address ^ (MinxColorPRC.ActivePage ? 0x2000 : 0)] = val; + if (MinxColorPRC.Access == 2) MinxColorPRC.Address = (MinxColorPRC.Address - 1) & 0x7FFF; + if (MinxColorPRC.Access == 1) MinxColorPRC.Address = (MinxColorPRC.Address + 1) & 0x7FFF; + return; + case 0xF4: // Low Nibble Pixel 0 + MinxColorPRC.LNColor0 = val; + return; + case 0xF5: // High Nibble Pixel 0 + MinxColorPRC.HNColor0 = val; + return; + case 0xF6: // Low Nibble Pixel 1 + MinxColorPRC.LNColor1 = val; + return; + case 0xF7: // High Nibble Pixel 1 + MinxColorPRC.HNColor1 = val; + return; + } +} + +// +// Unofficial Color Support +// + +void MinxColorPRC_WriteCtrl(uint8_t val) +{ + switch (val) { + case 0xA0: // CVRAM Access: Fixed + MinxColorPRC.Access = 0; + break; + case 0xA1: // CVRAM Access: Post-increment + MinxColorPRC.Access = 1; + break; + case 0xA2: // CVRAM Access: Post-decrement + MinxColorPRC.Access = 2; + break; + case 0xA3: // CVRAM Access: Pre-increment + MinxColorPRC.Access = 3; + break; + + case 0xD0: // Enable framebuffer update + MinxColorPRC.Modes &= ~0x01; + break; + case 0xD1: // Enable LCD update + MinxColorPRC.Modes &= ~0x02; + break; + case 0xD2: // Enable PRC update + MinxColorPRC.Modes &= ~0x04; + break; + + case 0xD8: // Disable framebuffer update + MinxColorPRC.Modes |= 0x01; + break; + case 0xD9: // Disable LCD update + MinxColorPRC.Modes |= 0x02; + break; + case 0xDA: // Disable PRC update + MinxColorPRC.Modes |= 0x04; + break; + + case 0xCF: // Lock + MinxColorPRC.Unlocked = 0; + MinxColorPRC.UnlockCode = 0; + break; + + case 0xF0: // Flip page + MinxColorPRC.ActivePage = !MinxColorPRC.ActivePage; + break; + + case 0x5A: // UnLock sequence + case 0xCE: + break; + } +} + +void MinxColorPRC_WriteFramebuffer(uint16_t addr, uint8_t data) +{ + int i; + if (MinxColorPRC.Modes & 1) return; + addr = (addr / 96) * 8*96 + (addr % 96); + for (i=0; i<4; i++) { + PRCColorPixels[addr] = (data & 1) ? MinxColorPRC.LNColor1 : MinxColorPRC.LNColor0; + data >>= 1; addr += 96; + } + for (i=4; i<8; i++) { + PRCColorPixels[addr] = (data & 1) ? MinxColorPRC.HNColor1 : MinxColorPRC.HNColor0; + data >>= 1; addr += 96; + } +} + +void MinxColorPRC_WriteLCD(uint16_t addr, uint8_t data) +{ + int i, vaddr = addr & 0xFF; + if (MinxColorPRC.Modes & 2) return; + if (addr >= 2048) return; + if (vaddr >= 96) return; + vaddr = ((addr & 0x700) >> 8) * 8*96 + vaddr; + for (i=0; i<4; i++) { + PRCColorPixels[vaddr] = (data & 1) ? MinxColorPRC.LNColor1 : MinxColorPRC.LNColor0; + data >>= 1; vaddr += 96; + } + for (i=4; i<8; i++) { + PRCColorPixels[vaddr] = (data & 1) ? MinxColorPRC.HNColor1 : MinxColorPRC.HNColor0; + data >>= 1; vaddr += 96; + } +} + +const uint8_t PRCStaticColorMap[8] = {0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0}; + +static inline void MinxPRC_DrawSprite8x8_Color8(uint8_t cfg, int X, int Y, int DrawT, int MaskT) +{ + uint8_t *ColorMap; + int yC, xC, xP, level, out; + uint8_t sdata, smask; + + // No point to proceed if it's offscreen + if (X >= 96) return; + if (Y >= 64) return; + + // Pre calculate + level = (((MinxLCD.Contrast + 2) & 0x3C) << 2) - 0x80; + ColorMap = (uint8_t *)PRCColorMap + (MinxPRC.PRCSprBase >> 2) + (DrawT << 1) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Draw sprite + for (yC=0; yC<8; yC++) { + if ((Y >= 0) && (Y < 64)) { + for (xC=0; xC<8; xC++) { + if ((X >= 0) && (X < 96)) { + xP = (cfg & 0x01) ? (7 - xC) : xC; + + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + if (cfg & 0x02) smask = PRCInvertBit[smask]; + smask = smask & (1 << (yC & 7)); + + // Write result + if (!smask) { + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + if (cfg & 0x02) sdata = PRCInvertBit[sdata]; + if (cfg & 0x04) sdata = ~sdata; + sdata = sdata & (1 << (yC & 7)); + + out = level + (int)(sdata ? ColorMap[1] : *ColorMap); + if (out > 255) out = 255; + if (out < 0) out = 0; + PRCColorPixels[Y * 96 + X] = (uint8_t)out; + } + } + X++; + } + X -= 8; + } + Y++; + } +} + +void MinxPRC_Render_Color8(void) +{ + int xC, yC, tx, ty, tileidxaddr, ltileidxaddr, outaddr, level, out; + int tiledataddr = 0; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + uint8_t tileidx = 0, tdata, data; + + int SprTB, SprAddr; + int SprX, SprY, SprC; + + if (!PRCColorMap) return; + if (VidEnableHighcolor) memcpy(PRCColorPixelsOld, PRCColorPixels, 96*64); + if (PRCColorFlags & 2) MinxPRC_Render_Mono(); + PRCColorPixels = PRCColorVMem + (MinxColorPRC.ActivePage ? 0x2000 : 0); + if (MinxColorPRC.Modes & 4) return; + + // Color contrast level + level = (((MinxLCD.Contrast + 2) & 0x3C) << 2) - 0x80; + + if (PRCRenderBD) { + for (xC=0; xC<96*64; xC++) PRCColorPixels[xC] = 0x00; + } + + if ((PRCRenderBG) && (PMR_PRC_MODE & 0x02)) { + outaddr = 0; + ltileidxaddr = -1; + for (yC=0; yC<64; yC++) { + ty = yC + MinxPRC.PRCMapPY; + for (xC=0; xC<96; xC++) { + tx = xC + MinxPRC.PRCMapPX; + tileidxaddr = 0x1360 + (ty >> 3) * MinxPRC.PRCMapTW + (tx >> 3); + + // Read tile index + if (ltileidxaddr != tileidxaddr) { + ltileidxaddr = tileidxaddr; + tileidx = MinxPRC_OnRead(0, tileidxaddr); + tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); + ColorMap = (uint8_t *)PRCColorMap + (MinxPRC.PRCBGBase >> 2) + (tileidx << 1) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + } + + // Read tile data + tdata = MinxPRC_OnRead(0, tiledataddr + (tx & 7)); + if (PMR_PRC_MODE & 0x01) tdata = ~tdata; + data = (tdata & (1 << (ty & 7))) ? ColorMap[1] : *ColorMap; + + // Write result + out = level + (int)data; + if (out > 255) out = 255; + if (out < 0) out = 0; + PRCColorPixels[outaddr++] = (uint8_t)out; + } + } + } + + if ((PRCRenderSpr) && (PMR_PRC_MODE & 0x04)) { + SprAddr = 0x1300 + (24 * 4); + do { + SprC = MinxPRC_OnRead(0, --SprAddr); + SprTB = MinxPRC_OnRead(0, --SprAddr) << 3; + SprY = (MinxPRC_OnRead(0, --SprAddr) & 0x7F) - 16; + SprX = (MinxPRC_OnRead(0, --SprAddr) & 0x7F) - 16; + if (SprC & 0x08) { + MinxPRC_DrawSprite8x8_Color8(SprC, SprX + (SprC & 0x01 ? 8 : 0), SprY + (SprC & 0x02 ? 8 : 0), SprTB+2, SprTB); + MinxPRC_DrawSprite8x8_Color8(SprC, SprX + (SprC & 0x01 ? 8 : 0), SprY + (SprC & 0x02 ? 0 : 8), SprTB+3, SprTB+1); + MinxPRC_DrawSprite8x8_Color8(SprC, SprX + (SprC & 0x01 ? 0 : 8), SprY + (SprC & 0x02 ? 8 : 0), SprTB+6, SprTB+4); + MinxPRC_DrawSprite8x8_Color8(SprC, SprX + (SprC & 0x01 ? 0 : 8), SprY + (SprC & 0x02 ? 0 : 8), SprTB+7, SprTB+5); + } + } while (SprAddr > 0x1300); + } +} + +static inline void MinxPRC_DrawSprite8x8_Color4(uint8_t cfg, int X, int Y, int DrawT, int MaskT) +{ + uint8_t *ColorMap; + int yC, xC, xP, level, quad, out; + uint8_t sdata, smask; + + // No point to proceed if it's offscreen + if (X >= 96) return; + if (Y >= 64) return; + + // Pre calculate + level = (((MinxLCD.Contrast + 2) & 0x3C) << 2) - 0x80; + ColorMap = (uint8_t *)PRCColorMap + MinxPRC.PRCSprBase + (DrawT << 3) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Draw sprite + for (yC=0; yC<8; yC++) { + if ((Y >= 0) && (Y < 64)) { + for (xC=0; xC<8; xC++) { + if ((X >= 0) && (X < 96)) { + quad = (yC & 4) + ((xC & 4) >> 1); + xP = (cfg & 0x01) ? (7 - xC) : xC; + + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + if (cfg & 0x02) smask = PRCInvertBit[smask]; + smask = smask & (1 << (yC & 7)); + + // Write result + if (!smask) { + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + if (cfg & 0x02) sdata = PRCInvertBit[sdata]; + if (cfg & 0x04) sdata = ~sdata; + sdata = sdata & (1 << (yC & 7)); + + out = level + (int)(sdata ? ColorMap[quad+1] : ColorMap[quad]); + if (out > 255) out = 255; + if (out < 0) out = 0; + PRCColorPixels[Y * 96 + X] = (uint8_t)out; + } + } + X++; + } + X -= 8; + } + Y++; + } +} + +void MinxPRC_Render_Color4(void) +{ + int xC, yC, tx, ty, tileidxaddr, ltileidxaddr, outaddr, level, quad, out; + int tiledataddr = 0; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + uint8_t tileidx = 0, tdata, data; + + int SprTB, SprAddr; + int SprX, SprY, SprC; + + if (!PRCColorMap) return; + if (VidEnableHighcolor) memcpy(PRCColorPixelsOld, PRCColorPixels, 96*64); + if (PRCColorFlags & 2) MinxPRC_Render_Mono(); + PRCColorPixels = PRCColorVMem + (MinxColorPRC.ActivePage ? 0x2000 : 0); + if (MinxColorPRC.Modes & 4) return; + + // Color contrast level + level = (((MinxLCD.Contrast + 2) & 0x3C) << 2) - 0x80; + + if (PRCRenderBD) { + for (xC=0; xC<96*64; xC++) PRCColorPixels[xC] = 0x00; + } + + if ((PRCRenderBG) && (PMR_PRC_MODE & 0x02)) { + outaddr = 0; + ltileidxaddr = -1; + for (yC=0; yC<64; yC++) { + ty = yC + MinxPRC.PRCMapPY; + for (xC=0; xC<96; xC++) { + tx = xC + MinxPRC.PRCMapPX; + quad = (ty & 4) + ((tx & 4) >> 1); + tileidxaddr = 0x1360 + (ty >> 3) * MinxPRC.PRCMapTW + (tx >> 3); + + // Read tile index + if (ltileidxaddr != tileidxaddr) { + ltileidxaddr = tileidxaddr; + tileidx = MinxPRC_OnRead(0, tileidxaddr); + tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); + ColorMap = (uint8_t *)PRCColorMap + MinxPRC.PRCBGBase + (tileidx << 3) - PRCColorOffset; + if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; + } + + // Read tile data + tdata = MinxPRC_OnRead(0, tiledataddr + (tx & 7)); + if (PMR_PRC_MODE & 0x01) tdata = ~tdata; + data = (tdata & (1 << (ty & 7))) ? ColorMap[quad+1] : ColorMap[quad]; + + // Write result + out = level + (int)data; + if (out > 255) out = 255; + if (out < 0) out = 0; + PRCColorPixels[outaddr++] = (uint8_t)out; + } + } + } + if (PRCRenderSpr && (PMR_PRC_MODE & 0x04)) { + SprAddr = 0x1300 + (24 * 4); + do { + SprC = MinxPRC_OnRead(0, --SprAddr); + SprTB = MinxPRC_OnRead(0, --SprAddr) << 3; + SprY = (MinxPRC_OnRead(0, --SprAddr) & 0x7F) - 16; + SprX = (MinxPRC_OnRead(0, --SprAddr) & 0x7F) - 16; + if (SprC & 0x08) { + MinxPRC_DrawSprite8x8_Color4(SprC, SprX + (SprC & 0x01 ? 8 : 0), SprY + (SprC & 0x02 ? 8 : 0), SprTB+2, SprTB); + MinxPRC_DrawSprite8x8_Color4(SprC, SprX + (SprC & 0x01 ? 8 : 0), SprY + (SprC & 0x02 ? 0 : 8), SprTB+3, SprTB+1); + MinxPRC_DrawSprite8x8_Color4(SprC, SprX + (SprC & 0x01 ? 0 : 8), SprY + (SprC & 0x02 ? 8 : 0), SprTB+6, SprTB+4); + MinxPRC_DrawSprite8x8_Color4(SprC, SprX + (SprC & 0x01 ? 0 : 8), SprY + (SprC & 0x02 ? 0 : 8), SprTB+7, SprTB+5); + } + } while (SprAddr > 0x1300); + } +} + +void MinxPRC_NoRender_Color(void) +{ + if (VidEnableHighcolor) memcpy(PRCColorPixelsOld, PRCColorPixels, 96*64); + PRCColorPixels = PRCColorVMem + (MinxColorPRC.ActivePage ? 0x2000 : 0); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxColorPRC.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxColorPRC.h new file mode 100644 index 0000000000..af36411ff6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxColorPRC.h @@ -0,0 +1,84 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXHW_COLORPRC +#define MINXHW_COLORPRC + +#include + +typedef struct { + uint16_t UnlockCode; + uint8_t Unlocked; + uint8_t Access; + uint8_t Modes; + uint8_t ActivePage; + uint16_t Address; + uint8_t LNColor0; + uint8_t HNColor0; + uint8_t LNColor1; + uint8_t HNColor1; +} TMinxColorPRC; + +// Export PRC state +extern TMinxColorPRC MinxColorPRC; + +// For Unofficial Color Pokemon-Mini +extern int PRCColorEnable; +extern uint8_t *PRCColorPixels; +extern uint8_t *PRCColorPixelsOld; +extern uint8_t *PRCColorMap; +extern unsigned int PRCColorOffset; +extern uint8_t *PRCColorTop; +extern uint8_t PRCColorFlags; +extern const uint8_t PRCStaticColorMap[8]; + +// +// Functions +// + +int MinxColorPRC_Create(void); + +void MinxColorPRC_Destroy(void); + +void MinxColorPRC_Reset(int hardreset); + +int MinxColorPRC_LoadState(FILE *fi, uint32_t bsize); + +int MinxColorPRC_SaveState(FILE *fi); + +uint8_t MinxColorPRC_ReadReg(int cpu, uint8_t reg); + +void MinxColorPRC_WriteReg(uint8_t reg, uint8_t val); + +void MinxColorPRC_WriteFramebuffer(uint16_t addr, uint8_t data); + +void MinxColorPRC_WriteLCD(uint16_t addr, uint8_t data); + +// +// Internals +// + +void MinxColorPRC_WriteCtrl(uint8_t val); + +void MinxPRC_Render_Color8(void); + +void MinxPRC_Render_Color4(void); + +void MinxPRC_NoRender_Color(void); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxIO.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxIO.c new file mode 100644 index 0000000000..3325ffc7d5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxIO.c @@ -0,0 +1,400 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +TMinxIO MinxIO; +uint8_t *EEPROM = NULL; +int PokeMini_Rumbling = 0; +int PokeMini_RumblingLatch = 0; +int PokeMini_EEPROMWritten = 0; +int PokeMini_BatteryStatus = 0; // 0 = Full, 1 = Low +int PokeMini_ShockKey = 0; + +uint8_t MinxIO_IODataRead(void); +void MinxIO_IODataWrite(void); +void MinxIO_EEPROM_WEvent(uint8_t bits); +int MinxIO_EEPROM_REvent(void); +void MinxIO_EEPROM_Write(uint8_t data); + +// +// Functions +// + +int MinxIO_Create(void) +{ + // Create EEPROM memory & format it + EEPROM = (uint8_t *)malloc(8192); + if (!EEPROM) return 0; + MinxIO_FormatEEPROM(); + + // Reset + MinxIO_Reset(1); + + return 1; +} + +void MinxIO_Destroy(void) +{ + if (EEPROM) { + free(EEPROM); + EEPROM = NULL; + } +} + +void MinxIO_Reset(int hardreset) +{ + // Initialize State + memset(&MinxIO, 0, sizeof(TMinxIO)); + PokeMini_Rumbling = 0; + PokeMini_RumblingLatch = 0; + PokeMini_ShockKey = 0; + + // Init variables + PMR_KEY_PAD = 0xFF; + MinxIO.ListenState = MINX_EEPROM_IDLE; + MinxIO.OperState = MINX_EEPROM_DEVICE; + + // Restore battery status + MinxIO_BatteryLow(PokeMini_BatteryStatus); +} + +int MinxIO_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(32+8192); + PokeMini_Rumbling = 0; + PokeMini_RumblingLatch = 0; + PokeMini_EEPROMWritten = 1; + POKELOADSS_8(MinxIO.EEPLastPins); + POKELOADSS_8(MinxIO.ListenState); + POKELOADSS_8(MinxIO.OperState); + POKELOADSS_8(MinxIO.EEPData); + POKELOADSS_32(MinxIO.EEPBit); + POKELOADSS_16(MinxIO.EEPAddress); + POKELOADSS_X(22); + POKELOADSS_A(EEPROM, 8192); + POKELOADSS_END(32+8192); +} + +int MinxIO_SaveState(FILE *fi) +{ + POKESAVESS_START(32+8192); + POKESAVESS_8(MinxIO.EEPLastPins); + POKESAVESS_8(MinxIO.ListenState); + POKESAVESS_8(MinxIO.OperState); + POKESAVESS_8(MinxIO.EEPData); + POKESAVESS_32(MinxIO.EEPBit); + POKESAVESS_16(MinxIO.EEPAddress); + POKESAVESS_X(22); + POKESAVESS_A(EEPROM, 8192); + POKESAVESS_END(32+8192); +} + +int MinxIO_FormatEEPROM(void) +{ + if (!EEPROM) return 0; + memset(EEPROM, 0xFF, 8192); + return 1; +} + +void MinxIO_Keypad(uint8_t key, int pressed) +{ + if (!EEPROM) return; + switch (key) { + case MINX_KEY_A: // Key A + if (pressed) { + if (!(PMR_KEY_PAD & 0x01)) return; + MinxCPU_OnIRQAct(MINX_INTR_1C); + PMR_KEY_PAD &= ~0x01; + } else PMR_KEY_PAD |= 0x01; + break; + case MINX_KEY_B: // Key B + if (pressed) { + if (!(PMR_KEY_PAD & 0x02)) return; + MinxCPU_OnIRQAct(MINX_INTR_1B); + PMR_KEY_PAD &= ~0x02; + } else PMR_KEY_PAD |= 0x02; + break; + case MINX_KEY_C: // Key C + if (pressed) { + if (!(PMR_KEY_PAD & 0x04)) return; + MinxCPU_OnIRQAct(MINX_INTR_1A); + PMR_KEY_PAD &= ~0x04; + } else PMR_KEY_PAD |= 0x04; + break; + case MINX_KEY_UP: // Dpad Up + if (pressed) { + if (!(PMR_KEY_PAD & 0x08)) return; + MinxCPU_OnIRQAct(MINX_INTR_19); + PMR_KEY_PAD &= ~0x08; + } else PMR_KEY_PAD |= 0x08; + break; + case MINX_KEY_DOWN: // Dpad Down + if (pressed) { + if (!(PMR_KEY_PAD & 0x10)) return; + MinxCPU_OnIRQAct(MINX_INTR_18); + PMR_KEY_PAD &= ~0x10; + } else PMR_KEY_PAD |= 0x10; + break; + case MINX_KEY_LEFT: // Dpad Left + if (pressed) { + if (!(PMR_KEY_PAD & 0x20)) return; + MinxCPU_OnIRQAct(MINX_INTR_17); + PMR_KEY_PAD &= ~0x20; + } else PMR_KEY_PAD |= 0x20; + break; + case MINX_KEY_RIGHT: // Dpad Right + if (pressed) { + if (!(PMR_KEY_PAD & 0x40)) return; + MinxCPU_OnIRQAct(MINX_INTR_16); + PMR_KEY_PAD &= ~0x40; + } else PMR_KEY_PAD |= 0x40; + break; + case MINX_KEY_POWER: // Power key + if (pressed) { + if (!(PMR_KEY_PAD & 0x80)) return; + MinxCPU_OnIRQAct(MINX_INTR_15); + PMR_KEY_PAD &= ~0x80; + } else PMR_KEY_PAD |= 0x80; + break; + case MINX_KEY_SHOCK: // Shock key + if (!PokeMini_ShockKey && pressed) { + MinxCPU_OnIRQAct(MINX_INTR_10); + } + PokeMini_ShockKey = pressed; + break; + } +} + +void MinxIO_BatteryLow(int low) +{ + PokeMini_BatteryStatus = low; + if (low) PMR_SYS_BATT |= 0x20; + else PMR_SYS_BATT &= 0x1F; +} + +void MinxIO_SetTimeStamp(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) +{ + uint8_t checksum; + if (!EEPROM) return; + checksum = year + month + day + hour + min + sec; + PMR_SYS_CTRL3 |= 0x02; + EEPROM[0x1FF6] = 0x00; + EEPROM[0x1FF7] = 0x00; + EEPROM[0x1FF8] = 0x00; + EEPROM[0x1FF9] = year; + EEPROM[0x1FFA] = month; + EEPROM[0x1FFB] = day; + EEPROM[0x1FFC] = hour; + EEPROM[0x1FFD] = min; + EEPROM[0x1FFE] = sec; + EEPROM[0x1FFF] = checksum; +} + +uint8_t MinxIO_ReadReg(int cpu, uint8_t reg) +{ + // 0x10, 0x52, 0x60 to 0x62 + switch(reg) { + case 0x10: // Low Battery + return PMR_SYS_BATT; + case 0x44: // Unknown + return PMR_REG_44; + case 0x45: // Unknown + return PMR_REG_45; + case 0x46: // Unknown + return PMR_REG_46; + case 0x47: // Unknown + return PMR_REG_47; + case 0x50: // Unknown (related to power management?) + return PMR_REG_50; + case 0x51: // Unknown (related to power management?) + return PMR_REG_51; + case 0x52: // Keypad + return PMR_KEY_PAD; + case 0x53: // Unknown + return PMR_REG_53; + case 0x54: // Unknown + return PMR_REG_54; + case 0x55: // Unknown + return PMR_REG_55; + case 0x60: // I/O Direction Select ( 0 = Input, 1 = Output ) + return PMR_IO_DIR; + case 0x61: // I/O Data Register + return MinxIO_IODataRead(); + case 0x62: // Unknown + return PMR_REG_62; + default: // Unused + return 0; + } +} + +void MinxIO_WriteReg(int cpu, uint8_t reg, uint8_t val) +{ + // 0x10, 0x52, 0x60 to 0x62 + switch(reg) { + case 0x10: // Low Battery + PMR_SYS_BATT = (PMR_SYS_BATT & 0x20) | (val & 0x1F); + return; + case 0x44: // Unknown + PMR_REG_44 = val & 0xF7; + return; + case 0x45: // Unknown + PMR_REG_45 = val & 0x0F; + return; + case 0x46: // Unknown + PMR_REG_46 = val; + return; + case 0x47: // Unknown + PMR_REG_47 = val & 0x0F; + return; + case 0x50: // Unknown (related to power management?) + PMR_REG_50 = val; + return; + case 0x51: // Unknown (related to power management?) + PMR_REG_51 = val & 0x03; + return; + case 0x52: // Keypad + return; + case 0x53: // Unknown + PMR_REG_53 = 0x00; + case 0x54: // Unknown + PMR_REG_54 = val & 0x77; + case 0x55: // Unknown + PMR_REG_55 = val & 0x07; + case 0x60: // I/O Direction Select ( 0 = Input, 1 = Output ) + PMR_IO_DIR = val; + MinxIO_IODataWrite(); + return; + case 0x61: // I/O Data Register + PMR_IO_DATA = val; + MinxIO_IODataWrite(); + return; + case 0x62: // Unknown + PMR_REG_62 = val & 0xF0; + return; + } +} + +// +// Internal +// + +uint8_t MinxIO_IODataRead(void) +{ + uint8_t Input = MINX_IO_PULL_UPS; + + // Update all I/Os + Input = MinxIO_EEPROM_REvent() ? MINX_EEPROM_DAT : 0; + + return (PMR_IO_DATA & PMR_IO_DIR) | (Input & ~PMR_IO_DIR); +} + +void MinxIO_IODataWrite(void) +{ + uint8_t Output; + Output = (MINX_IO_PULL_UPS & ~PMR_IO_DIR) | (PMR_IO_DATA & PMR_IO_DIR); + + // Update all I/Os + PokeMini_Rumbling = Output & 0x10; + if (PokeMini_Rumbling) PokeMini_RumblingLatch = 1; + MinxIO_EEPROM_WEvent(Output); +} + +void MinxIO_EEPROM_WEvent(uint8_t bits) +{ + uint8_t rise = bits & ~MinxIO.EEPLastPins; + uint8_t fall = ~bits & MinxIO.EEPLastPins; + MinxIO.EEPLastPins = bits; + + // "Start" Command + if ((fall & MINX_EEPROM_DAT) && (bits & MINX_EEPROM_CLK)) { + MinxIO.ListenState = MINX_EEPROM_LISTEN; + MinxIO.OperState = MINX_EEPROM_DEVICE; + MinxIO.EEPBit = 8; + MinxIO.EEPData = 0x00; + return; + } + + // "Stop" Command + if ((rise & MINX_EEPROM_DAT) && (bits & MINX_EEPROM_CLK)) { + MinxIO.ListenState = MINX_EEPROM_IDLE; + return; + } + + // If it's Idle, there's nothing to do... + if (MinxIO.ListenState == MINX_EEPROM_IDLE) return; + + // Process each bit on clock rise + if (rise & MINX_EEPROM_CLK) { + int dat = (bits & MINX_EEPROM_DAT) ? 1 : 0; + if (MinxIO.EEPBit < 0) { + MinxIO_EEPROM_Write(MinxIO.EEPData); + MinxIO.EEPBit = 8; + MinxIO.EEPData = 0x00; + } else MinxIO.EEPData = (MinxIO.EEPData << 1) | dat; + } else if (fall & MINX_EEPROM_CLK) { + MinxIO.EEPBit = MinxIO.EEPBit - 1; + } +} + +int MinxIO_EEPROM_REvent(void) +{ + int valid = (MinxIO.EEPBit >= 0) && (MinxIO.EEPBit < 8); + + // If it's Idle, return high... + if (MinxIO.ListenState == MINX_EEPROM_IDLE) return 1; + + // Process read + if (MinxIO.OperState == MINX_EEPROM_RBYTE) { + if (valid) return (EEPROM[MinxIO.EEPAddress & 0x1FFF] >> MinxIO.EEPBit) & 1; + else return 0; + } + + return valid; +} + +void MinxIO_EEPROM_Write(uint8_t data) +{ + switch (MinxIO.OperState) { + case MINX_EEPROM_DEVICE: + if ((data & 0xF0) == 0xA0) { + // EEPROM Device + MinxIO.OperState = data & 0x01 ? MINX_EEPROM_RBYTE : MINX_EEPROM_ADDRHI; + } else { + // Unknown Devide + PokeDPrint(POKEMSG_ERR, "Error: Accessing unknown I2C device: 0x%02X\n", (int)data); + } + break; + case MINX_EEPROM_ADDRHI: + MinxIO.EEPAddress = (MinxIO.EEPAddress & 0x00FF) | (data << 8); + MinxIO.OperState = MINX_EEPROM_ADDRLO; + break; + case MINX_EEPROM_ADDRLO: + MinxIO.EEPAddress = (MinxIO.EEPAddress & 0xFF00) | data; + MinxIO.OperState = MINX_EEPROM_WBYTE; + break; + case MINX_EEPROM_WBYTE: + PokeMini_EEPROMWritten = 1; + EEPROM[MinxIO.EEPAddress & 0x1FFF] = data; + MinxIO.EEPAddress++; + break; + case MINX_EEPROM_RBYTE: + MinxIO.EEPAddress++; + break; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxIO.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxIO.h new file mode 100644 index 0000000000..96d14c114d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxIO.h @@ -0,0 +1,114 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXHW_IO +#define MINXHW_IO + +#include +#include + +typedef struct { + // Internal processing + uint8_t EEPLastPins; + uint8_t ListenState; + uint8_t OperState; + uint8_t EEPData; + int32_t EEPBit; + uint16_t EEPAddress; +} TMinxIO; + +// Export IO state +extern TMinxIO MinxIO; + +// EEPROM Data +extern uint8_t *EEPROM; + +// Rumbling & EEPROM written state +extern int PokeMini_Rumbling; +extern int PokeMini_RumblingLatch; +extern int PokeMini_EEPROMWritten; +extern int PokeMini_BatteryStatus; // 0 = Full, 1 = Low + +enum { + // EEPROM Listen State + MINX_EEPROM_IDLE = 0, // Idle + MINX_EEPROM_LISTEN = 1, // Listening + + // EEPROM Data State + MINX_EEPROM_DEVICE = 0, // Device ID + MINX_EEPROM_ADDRHI = 1, // High Address Byte + MINX_EEPROM_ADDRLO = 2, // Low Address Byte + MINX_EEPROM_WBYTE = 3, // Write Byte + MINX_EEPROM_RBYTE = 4, // Read Byte + + // Keypad + MINX_KEY_NONE = 0, + MINX_KEY_A = 1, + MINX_KEY_B = 2, + MINX_KEY_C = 3, + MINX_KEY_UP = 4, + MINX_KEY_DOWN = 5, + MINX_KEY_LEFT = 6, + MINX_KEY_RIGHT = 7, + MINX_KEY_POWER = 8, + MINX_KEY_SHOCK = 9 // Not real key, reserved for handling key event +}; + +// Interrupt table +enum { + MINX_INTR_0F = 0x0F, // IR Receiver + MINX_INTR_10 = 0x10, // Shock Sensor + MINX_INTR_15 = 0x15, // A key + MINX_INTR_16 = 0x16, // B key + MINX_INTR_17 = 0x17, // C key + MINX_INTR_18 = 0x18, // Up key + MINX_INTR_19 = 0x19, // Down key + MINX_INTR_1A = 0x1A, // Left key + MINX_INTR_1B = 0x1B, // Right key + MINX_INTR_1C = 0x1C, // Power key +}; + +#define MINX_IO_PULL_UPS 0x40 // Pull-up when direction create a Z + +#define MINX_EEPROM_DAT 0x04 +#define MINX_EEPROM_CLK 0x08 + + +int MinxIO_Create(void); + +void MinxIO_Destroy(void); + +void MinxIO_Reset(int hardreset); + +int MinxIO_LoadState(FILE *fi, uint32_t bsize); + +int MinxIO_SaveState(FILE *fi); + +int MinxIO_FormatEEPROM(void); + +void MinxIO_Keypad(uint8_t key, int pressed); + +void MinxIO_BatteryLow(int low); + +void MinxIO_SetTimeStamp(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec); + +uint8_t MinxIO_ReadReg(int cpu, uint8_t reg); + +void MinxIO_WriteReg(int cpu, uint8_t reg, uint8_t val); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxIRQ.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxIRQ.c new file mode 100644 index 0000000000..fd585e1d0a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxIRQ.c @@ -0,0 +1,278 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +int MinxIRQ_MasterIRQ = 0; + +void MinxIRQ_Process(void); + +// +// Functions +// + +int MinxIRQ_Create(void) +{ + // Reset + MinxIRQ_Reset(1); + + return 1; +} + +void MinxIRQ_Destroy(void) +{ +} + +void MinxIRQ_Reset(int hardreset) +{ + // Master IRQ enable + MinxIRQ_MasterIRQ = 1; + PMR_IRQ_ACT1 = 0x00; + PMR_IRQ_ACT2 = 0x00; + PMR_IRQ_ACT3 = 0x00; + PMR_IRQ_ACT4 = 0x00; +} + +int MinxIRQ_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(1); + POKELOADSS_8(MinxIRQ_MasterIRQ); + POKELOADSS_END(1); +} + +int MinxIRQ_SaveState(FILE *fi) +{ + POKESAVESS_START(1); + POKESAVESS_8(MinxIRQ_MasterIRQ); + POKESAVESS_END(1); +} + +void MinxIRQ_SetIRQ(uint8_t intr) +{ + switch(intr) { + case 0x03: // PRC Copy Complete + PMR_IRQ_ACT1 |= 0x80; + break; + case 0x04: // PRC Frame Divider Overflow + PMR_IRQ_ACT1 |= 0x40; + break; + case 0x05: // Timer 2-B Underflow + PMR_IRQ_ACT1 |= 0x20; + break; + case 0x06: // Timer 2-A Underflow (8-Bits only) + PMR_IRQ_ACT1 |= 0x10; + break; + case 0x07: // Timer 1-B Underflow + PMR_IRQ_ACT1 |= 0x08; + break; + case 0x08: // Timer 1-A Underflow (8-Bits only) + PMR_IRQ_ACT1 |= 0x04; + break; + case 0x09: // Timer 3 Underflow + PMR_IRQ_ACT1 |= 0x02; + break; + case 0x0A: // Timer 3 Pivot + PMR_IRQ_ACT1 |= 0x01; + break; + case 0x0B: // 32 Hz + PMR_IRQ_ACT2 |= 0x20; + break; + case 0x0C: // 8 Hz + PMR_IRQ_ACT2 |= 0x10; + break; + case 0x0D: // 2 Hz + PMR_IRQ_ACT2 |= 0x08; + break; + case 0x0E: // 1 Hz + PMR_IRQ_ACT2 |= 0x04; + break; + case 0x0F: // IR Receiver + PMR_IRQ_ACT4 |= 0x80; + break; + case 0x10: // Shock Sensor + PMR_IRQ_ACT4 |= 0x40; + break; + case 0x13: // Cartridge Ejected + PMR_IRQ_ACT2 |= 0x02; + break; + case 0x14: // Cartridge IRQ + PMR_IRQ_ACT2 |= 0x01; + break; + case 0x15: // Power Key + PMR_IRQ_ACT3 |= 0x80; + break; + case 0x16: // Right Key + PMR_IRQ_ACT3 |= 0x40; + break; + case 0x17: // Left Key + PMR_IRQ_ACT3 |= 0x20; + break; + case 0x18: // Down Key + PMR_IRQ_ACT3 |= 0x10; + break; + case 0x19: // Up Key + PMR_IRQ_ACT3 |= 0x08; + break; + case 0x1A: // C Key + PMR_IRQ_ACT3 |= 0x04; + break; + case 0x1B: // B Key + PMR_IRQ_ACT3 |= 0x02; + break; + case 0x1C: // A Key + PMR_IRQ_ACT3 |= 0x01; + break; + } + MinxIRQ_Process(); +} + +uint8_t MinxIRQ_ReadReg(int cpu, uint8_t reg) +{ + // 0x20 to 0x2A + switch(reg) { + case 0x20: // IRQ Priority 1 + return PMR_IRQ_PRI1; + case 0x21: // IRQ Priority 2 + return PMR_IRQ_PRI2; + case 0x22: // IRQ Priority 3 + return PMR_IRQ_PRI3 & 0x03; + case 0x23: // IRQ Enable 1 + return PMR_IRQ_ENA1; + case 0x24: // IRQ Enable 2 + return PMR_IRQ_ENA2 & 0x3F; + case 0x25: // IRQ Enable 3 + return PMR_IRQ_ENA3; + case 0x26: // IRQ Enable 4 + return PMR_IRQ_ENA4 & 0xF7; + case 0x27: // IRQ Active 1 + return PMR_IRQ_ACT1; + case 0x28: // IRQ Active 2 + return PMR_IRQ_ACT2 & 0x3F; + case 0x29: // IRQ Active 3 + return PMR_IRQ_ACT3; + case 0x2A: // IRQ Active 4 + return PMR_IRQ_ACT4 & 0xF7; + default: // Unused + return 0; + } +} + +void MinxIRQ_WriteReg(int cpu, uint8_t reg, uint8_t val) +{ + // 0x20 to 0x2A + switch(reg) { + case 0x20: // IRQ Priority 1 + PMR_IRQ_PRI1 = val; + MinxIRQ_Process(); + return; + case 0x21: // IRQ Priority 2 + PMR_IRQ_PRI2 = val; + MinxIRQ_Process(); + return; + case 0x22: // IRQ Priority 3 + PMR_IRQ_PRI3 = val; + MinxIRQ_Process(); + return; + case 0x23: // IRQ Enable 1 + PMR_IRQ_ENA1 = val; + MinxIRQ_Process(); + return; + case 0x24: // IRQ Enable 2 + PMR_IRQ_ENA2 = val & 0x3F; + MinxIRQ_Process(); + return; + case 0x25: // IRQ Enable 3 + PMR_IRQ_ENA3 = val; + MinxIRQ_Process(); + return; + case 0x26: // IRQ Enable 4 + PMR_IRQ_ENA4 = val & 0xF7; + MinxIRQ_Process(); + return; + case 0x27: // IRQ Active 1 + if (cpu) PMR_IRQ_ACT1 &= ~val; + else PMR_IRQ_ACT1 = val; + return; + case 0x28: // IRQ Active 2 + if (cpu) PMR_IRQ_ACT2 &= ~val; + else PMR_IRQ_ACT2 = val & 0x3F; + return; + case 0x29: // IRQ Active 3 + if (cpu) PMR_IRQ_ACT3 &= ~val; + else PMR_IRQ_ACT3 = val; + return; + case 0x2A: // IRQ Active 4 + if (cpu) PMR_IRQ_ACT4 &= ~val; + else PMR_IRQ_ACT4 = val & 0xF7; + return; + default: // Unused + return; + } +} + +void MinxIRQ_Process(void) +{ + // TODO! Need to emulate the priority system... bah... + if (!MinxIRQ_MasterIRQ) return; + + if (PMR_IRQ_PRI1 & 0xC0) { + if ((PMR_IRQ_ENA1 & 0x80) && (PMR_IRQ_ACT1 & 0x80)) { MinxIRQ_OnIRQ(0x03); return; } + if ((PMR_IRQ_ENA1 & 0x40) && (PMR_IRQ_ACT1 & 0x40)) { MinxIRQ_OnIRQ(0x04); return; } + } + if (PMR_IRQ_PRI1 & 0x30) { + if ((PMR_IRQ_ENA1 & 0x20) && (PMR_IRQ_ACT1 & 0x20)) { MinxIRQ_OnIRQ(0x05); return; } + if ((PMR_IRQ_ENA1 & 0x10) && (PMR_IRQ_ACT1 & 0x10)) { MinxIRQ_OnIRQ(0x06); return; } + } + if (PMR_IRQ_PRI1 & 0x0C) { + if ((PMR_IRQ_ENA1 & 0x08) && (PMR_IRQ_ACT1 & 0x08)) { MinxIRQ_OnIRQ(0x07); return; } + if ((PMR_IRQ_ENA1 & 0x04) && (PMR_IRQ_ACT1 & 0x04)) { MinxIRQ_OnIRQ(0x08); return; } + } + if (PMR_IRQ_PRI1 & 0x03) { + if ((PMR_IRQ_ENA1 & 0x02) && (PMR_IRQ_ACT1 & 0x02)) { MinxIRQ_OnIRQ(0x09); return; } + if ((PMR_IRQ_ENA1 & 0x01) && (PMR_IRQ_ACT1 & 0x01)) { MinxIRQ_OnIRQ(0x0A); return; } + } + if (PMR_IRQ_PRI2 & 0xC0) { + if ((PMR_IRQ_ENA2 & 0x20) && (PMR_IRQ_ACT2 & 0x20)) { MinxIRQ_OnIRQ(0x0B); return; } + if ((PMR_IRQ_ENA2 & 0x10) && (PMR_IRQ_ACT2 & 0x10)) { MinxIRQ_OnIRQ(0x0C); return; } + if ((PMR_IRQ_ENA2 & 0x08) && (PMR_IRQ_ACT2 & 0x08)) { MinxIRQ_OnIRQ(0x0D); return; } + if ((PMR_IRQ_ENA2 & 0x04) && (PMR_IRQ_ACT2 & 0x04)) { MinxIRQ_OnIRQ(0x0E); return; } + } + if (PMR_IRQ_PRI3 & 0x03) { + if ((PMR_IRQ_ENA4 & 0x80) && (PMR_IRQ_ACT4 & 0x80)) { MinxIRQ_OnIRQ(0x0F); return; } + if ((PMR_IRQ_ENA4 & 0x40) && (PMR_IRQ_ACT4 & 0x40)) { MinxIRQ_OnIRQ(0x10); return; } + } + if (PMR_IRQ_PRI2 & 0x30) { + if ((PMR_IRQ_ENA2 & 0x02) && (PMR_IRQ_ACT2 & 0x02)) { MinxIRQ_OnIRQ(0x13); return; } + if ((PMR_IRQ_ENA2 & 0x01) && (PMR_IRQ_ACT2 & 0x01)) { MinxIRQ_OnIRQ(0x14); return; } + } + if (PMR_IRQ_PRI2 & 0x0C) { + if ((PMR_IRQ_ENA3 & 0x80) && (PMR_IRQ_ACT3 & 0x80)) { MinxIRQ_OnIRQ(0x15); return; } + if ((PMR_IRQ_ENA3 & 0x40) && (PMR_IRQ_ACT3 & 0x40)) { MinxIRQ_OnIRQ(0x16); return; } + if ((PMR_IRQ_ENA3 & 0x20) && (PMR_IRQ_ACT3 & 0x20)) { MinxIRQ_OnIRQ(0x17); return; } + if ((PMR_IRQ_ENA3 & 0x10) && (PMR_IRQ_ACT3 & 0x10)) { MinxIRQ_OnIRQ(0x18); return; } + if ((PMR_IRQ_ENA3 & 0x08) && (PMR_IRQ_ACT3 & 0x08)) { MinxIRQ_OnIRQ(0x19); return; } + if ((PMR_IRQ_ENA3 & 0x04) && (PMR_IRQ_ACT3 & 0x04)) { MinxIRQ_OnIRQ(0x1A); return; } + if ((PMR_IRQ_ENA3 & 0x02) && (PMR_IRQ_ACT3 & 0x02)) { MinxIRQ_OnIRQ(0x1B); return; } + if ((PMR_IRQ_ENA3 & 0x01) && (PMR_IRQ_ACT3 & 0x01)) { MinxIRQ_OnIRQ(0x1C); return; } + } + if (PMR_IRQ_PRI2 & 0x03) { + if ((PMR_IRQ_ENA4 & 0x04) && (PMR_IRQ_ACT4 & 0x04)) { MinxIRQ_OnIRQ(0x1D); return; } + if ((PMR_IRQ_ENA4 & 0x02) && (PMR_IRQ_ACT4 & 0x02)) { MinxIRQ_OnIRQ(0x1E); return; } + if ((PMR_IRQ_ENA4 & 0x01) && (PMR_IRQ_ACT4 & 0x01)) { MinxIRQ_OnIRQ(0x1F); return; } + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxIRQ.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxIRQ.h new file mode 100644 index 0000000000..dbcc69d2a2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxIRQ.h @@ -0,0 +1,52 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXHW_IRQ +#define MINXHW_IRQ + +#include + +// Master IRQ enable +extern int MinxIRQ_MasterIRQ; + + +int MinxIRQ_Create(void); + +void MinxIRQ_Destroy(void); + +void MinxIRQ_Reset(int hardreset); + +int MinxIRQ_LoadState(FILE *fi, uint32_t bsize); + +int MinxIRQ_SaveState(FILE *fi); + +void MinxIRQ_SetIRQ(uint8_t intr); + +uint8_t MinxIRQ_ReadReg(int cpu, uint8_t reg); + +void MinxIRQ_WriteReg(int cpu, uint8_t reg, uint8_t val); + +void MinxIRQ_Process(void); + +// +// Callbacks (Written by the user) +// + +void MinxIRQ_OnIRQ(uint8_t intr); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxLCD.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxLCD.c new file mode 100644 index 0000000000..3eadfa59af --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxLCD.c @@ -0,0 +1,609 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video.h" + +TMinxLCD MinxLCD; +int LCDDirty = 0; +uint8_t *LCDData = NULL; +uint8_t *LCDPixelsD = NULL; +uint8_t *LCDPixelsA = NULL; +uint8_t *LCDPixelsAS = NULL; + +const int LCDDirtyPixels[4] = { + 4, // LCDMODE_ANALOG + 2, // LCDMODE_3SHADES + 1, // LCDMODE_2SHADES + 2 // LCDMODE_COLORS +}; + +// +// Functions +// + +int MinxLCD_Create(void) +{ + // Create LCD memory + LCDData = (uint8_t *)malloc(256*9); + if (!LCDData) return 0; + LCDPixelsD = (uint8_t *)malloc(96*64); + if (!LCDPixelsD) return 0; + LCDPixelsA = (uint8_t *)malloc(96*64*2); + if (!LCDPixelsA) return 0; + LCDPixelsAS = (uint8_t *)LCDPixelsA + 96*64; + + // Reset + MinxLCD_Reset(1); + + return 1; +} + +void MinxLCD_Destroy(void) +{ + if (LCDData) { + free(LCDData); + LCDData = NULL; + } + if (LCDPixelsD) { + free(LCDPixelsD); + LCDPixelsD = NULL; + } + if (LCDPixelsA) { + free(LCDPixelsA); + LCDPixelsA = NULL; + } +} + +void MinxLCD_Reset(int hardreset) +{ + // Clean up memory + memset(LCDData, 0x00, 256*9); + memset(LCDPixelsD, 0x00, 96*64); + memset(LCDPixelsA, 0x00, 96*64*2); + + // Initialize State + memset((void *)&MinxLCD, 0, sizeof(TMinxLCD)); + + // Initialize variables + MinxLCD_SetContrast(0x1F); +} + +int MinxLCD_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(256*9 + 96*64 + 96*64 + 64); + POKELOADSS_A(LCDData, 256*9); + POKELOADSS_A(LCDPixelsD, 96*64); + POKELOADSS_A(LCDPixelsA, 96*64); + POKELOADSS_32(MinxLCD.Pixel0Intensity); + POKELOADSS_32(MinxLCD.Pixel1Intensity); + POKELOADSS_8(MinxLCD.Column); + POKELOADSS_8(MinxLCD.StartLine); + POKELOADSS_8(MinxLCD.SetContrast); + POKELOADSS_8(MinxLCD.Contrast); + POKELOADSS_8(MinxLCD.SegmentDir); + POKELOADSS_8(MinxLCD.MaxContrast); + POKELOADSS_8(MinxLCD.SetAllPix); + POKELOADSS_8(MinxLCD.InvAllPix); + POKELOADSS_8(MinxLCD.DisplayOn); + POKELOADSS_8(MinxLCD.Page); + POKELOADSS_8(MinxLCD.RowOrder); + POKELOADSS_8(MinxLCD.ReadModifyMode); + POKELOADSS_8(MinxLCD.RequireDummyR); + POKELOADSS_8(MinxLCD.RMWColumn); + POKELOADSS_X(42); + POKELOADSS_END(256*9 + 96*64 + 96*64 + 64); + return 1; +} + +int MinxLCD_SaveState(FILE *fi) +{ + POKESAVESS_START(256*9 + 96*64 + 96*64 + 64); + POKESAVESS_A(LCDData, 256*9); + POKESAVESS_A(LCDPixelsD, 96*64); + POKESAVESS_A(LCDPixelsA, 96*64); + POKESAVESS_32(MinxLCD.Pixel0Intensity); + POKESAVESS_32(MinxLCD.Pixel1Intensity); + POKESAVESS_8(MinxLCD.Column); + POKESAVESS_8(MinxLCD.StartLine); + POKESAVESS_8(MinxLCD.SetContrast); + POKESAVESS_8(MinxLCD.Contrast); + POKESAVESS_8(MinxLCD.SegmentDir); + POKESAVESS_8(MinxLCD.MaxContrast); + POKESAVESS_8(MinxLCD.SetAllPix); + POKESAVESS_8(MinxLCD.InvAllPix); + POKESAVESS_8(MinxLCD.DisplayOn); + POKESAVESS_8(MinxLCD.Page); + POKESAVESS_8(MinxLCD.RowOrder); + POKESAVESS_8(MinxLCD.ReadModifyMode); + POKESAVESS_8(MinxLCD.RequireDummyR); + POKESAVESS_8(MinxLCD.RMWColumn); + POKESAVESS_X(42); + POKESAVESS_END(256*9 + 96*64 + 96*64 + 64); +} + +uint8_t MinxLCD_ReadReg(int cpu, uint8_t reg) +{ + // 0xFE to 0xFF + switch(reg) { + case 0xFE: // Read from LCD with Control Activated + return MinxLCD_LCDReadCtrl(cpu); + case 0xFF: // Read from LCD with Control Desactivated + return MinxLCD_LCDRead(cpu); + default: // Unused + return 0x00; + } +} + +void MinxLCD_WriteReg(int cpu, uint8_t reg, uint8_t val) +{ + // 0xFE to 0xFF + switch(reg) { + case 0xFE: // Write to LCD with Control Activated + MinxLCD_LCDWriteCtrl(val); + return; + case 0xFF: // Write to LCD with Control Desactivated + MinxLCD_LCDWrite(val); + return; + } +} + +#define DECAY_A_OFF 64 +#define DECAY_ARISE 50 +#define DECAY_AFALL 30 +#define DECAY_L_OFF 16 +#define DECAY_LRISE 4 +#define DECAY_LFALL 2 + +void MinxLCD_DecayRefreshOld(void) +{ + int i, amt; + if (MinxLCD.DisplayOn) { + for (i=0; i<96*64; i++) { + if (LCDPixelsD[i]) { + amt = Interpolate8(LCDPixelsA[i], MinxLCD.Pixel1Intensity, DECAY_ARISE) + DECAY_LRISE; + if (amt > MinxLCD.Pixel1Intensity) amt = MinxLCD.Pixel1Intensity; + } else { + amt = Interpolate8(LCDPixelsA[i], MinxLCD.Pixel0Intensity, DECAY_AFALL) - DECAY_LFALL; + if (amt < MinxLCD.Pixel0Intensity) amt = MinxLCD.Pixel0Intensity; + } + LCDPixelsA[i] = amt; + } + } else { + for (i=0; i<96*64; i++) { + amt = Interpolate8(LCDPixelsA[i], 0, DECAY_A_OFF) - DECAY_L_OFF; + if (amt < MinxLCD.Pixel0Intensity) amt = MinxLCD.Pixel0Intensity; + LCDPixelsA[i] = amt; + } + } +} + +static const uint8_t BitsActives[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 +}; + +void MinxLCD_DecayRefresh(void) +{ + int i, level; + uint8_t sh; + // This is tuned for 5 shades + if (MinxLCD.DisplayOn) { + for (i=0; i<96*64; i++) { + sh = (LCDPixelsD[i] ? 0x08 : 0x00) | (LCDPixelsAS[i] >> 1); + LCDPixelsAS[i] = sh; + level = BitsActives[sh]; + LCDPixelsA[i] = (MinxLCD.Pixel0Intensity * (4 - level) + MinxLCD.Pixel1Intensity * level) >> 2; + } + } else { + for (i=0; i<96*64; i++) { + sh = (LCDPixelsAS[i] >> 1); + LCDPixelsAS[i] = sh; + level = BitsActives[sh]; + LCDPixelsA[i] = (MinxLCD.Pixel0Intensity * (4 - level) + MinxLCD.Pixel1Intensity * level) >> 2; + } + } +} + +void MinxLCD_Render(void) +{ + uint8_t pixel; + int xC, yC, yP; + + if (MinxLCD.DisplayOn) { + for (yC=0; yC<64; yC++) { + yP = (yC + MinxLCD.StartLine) & 63; + if (MinxLCD.RowOrder) yP = 63 - yP; + for (xC=0; xC<96; xC++) { + pixel = (LCDData[((yP >> 3) * 256) + xC] >> (yP & 7)) & 1; + LCDPixelsD[(yC * 96) + xC] = (pixel ^ MinxLCD.InvAllPix) | MinxLCD.SetAllPix; + } + } + } else for (yC=0; yC<96*64; yC++) LCDPixelsD[yC] = 0; +} + +uint8_t MinxLCD_LCDReadCtrl(int cpu) +{ + uint8_t data; + if (MinxLCD.SetContrast) { + MinxLCD.SetContrast = 0; + // Contrast query, cause incorrect value? + MinxLCD_SetContrast(0x3F); + data = 0; + } else { + // Get status + data = 0x40 | (MinxLCD.DisplayOn ? 0x20 : 0x00); + } + return data; +} + +uint8_t MinxLCD_LCDRead(int cpu) +{ + static uint8_t data = 0x40; + if (MinxLCD.SetContrast) { + MinxLCD.SetContrast = 0; + // Contrast query, cause incorrect value? + MinxLCD_SetContrast(0x3F); + data = 0; + } else { + // Get pixel + if (!MinxLCD.RequireDummyR && cpu) { + if (MinxLCD.SegmentDir) { + data = LCDData[131 - MinxLCD.Column + (MinxLCD.Page << 8)]; + } else { + data = LCDData[MinxLCD.Column + (MinxLCD.Page << 8)]; + } + if (MinxLCD.Page >= 8) data &= 0x01; + if (!MinxLCD.ReadModifyMode) { + MinxLCD.Column++; + if (MinxLCD.Column > 131) MinxLCD.Column = 131; + MinxLCD.RequireDummyR = 1; + } + } else MinxLCD.RequireDummyR = 0; + } + return data; +} + +void MinxLCD_LCDWriteCtrl(uint8_t data) +{ + if (MinxLCD.SetContrast) { + MinxLCD.SetContrast = 0; + MinxLCD_SetContrast(data & 0x3F); + return; + } + switch(data) { + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: + if (!MinxLCD.ReadModifyMode) { + MinxLCD.Column = (MinxLCD.Column & 0xF0) | (data & 0x0F); + MinxLCD.RequireDummyR = 1; + } + return; + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: + if (!MinxLCD.ReadModifyMode) { + MinxLCD.Column = (MinxLCD.Column & 0x0F) | ((data & 0x0F) << 4); + MinxLCD.RequireDummyR = 1; + } + return; + case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + // Do nothing? + return; + case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F: + // Modify LCD voltage? (2F Default) + // 0x28 = Blank + // 0x29 = Blank + // 0x2A = Blue screen then blank + // 0x2B = Blank + // 0x2C = Blank + // 0x2D = Blank + // 0x2E = Blue screen (overpower?) + // 0x2F = Normal + // User shouldn't mess with this ones as may damage the LCD + return; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: + case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3E: case 0x3F: + // Do nothing? + return; + case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: + case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F: + case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: + case 0x58: case 0x59: case 0x5A: case 0x5B: case 0x5C: case 0x5D: case 0x5E: case 0x5F: + case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: + case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: + case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: + case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D: case 0x7E: case 0x7F: + // Set starting LCD scanline (cause warp around) + MinxLCD.StartLine = data - 0x40; + LCDDirty = MINX_DIRTYSCR; + return; + case 0x80: + // Do nothing? + return; + case 0x81: + // Set contrast at the next write + MinxLCD.SetContrast = 1; + return; + case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: + case 0x88: case 0x89: case 0x8A: case 0x8B: case 0x8C: case 0x8D: case 0x8E: case 0x8F: + case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: + case 0x98: case 0x99: case 0x9A: case 0x9B: case 0x9C: case 0x9D: case 0x9E: case 0x9F: + // Do nothing? + return; + case 0xA0: + // Segment Driver Direction Select: Normal + MinxLCD.SegmentDir = 0; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xA1: + // Segment Driver Direction Select: Reverse + MinxLCD.SegmentDir = 1; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xA2: + // Max Contrast: Disable + MinxLCD.MaxContrast = 0; + MinxLCD_SetContrast(MinxLCD.Contrast); + return; + case 0xA3: + // Max Contrast: Enable + MinxLCD.MaxContrast = 1; + MinxLCD_SetContrast(MinxLCD.Contrast); + return; + case 0xA4: + // Set All Pixels: Disable + MinxLCD.SetAllPix = 0; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xA5: + // Set All Pixels: Enable + MinxLCD.SetAllPix = 1; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xA6: + // Invert All Pixels: Disable + MinxLCD.InvAllPix = 0; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xA7: + // Invert All Pixels: Enable + MinxLCD.InvAllPix = 1; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xA8: case 0xA9: case 0xAA: case 0xAB: + // Do nothing!? + return; + case 0xAC: case 0xAD: + // User shouldn't mess with this ones as may damage the LCD + return; + case 0xAE: + // Display Off + MinxLCD.DisplayOn = 0; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xAF: + // Display On + MinxLCD.DisplayOn = 1; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: + case 0xB8: + // Set page (0-8, each page is 8px high) + MinxLCD.Page = data & 15; + return; + case 0xB9: case 0xBA: case 0xBB: case 0xBC: case 0xBD: case 0xBE: case 0xBF: + // uh... do nothing? + return; + case 0xC0: case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5: case 0xC6: case 0xC7: + // Display rows from top to bottom as 0 to 63 + MinxLCD.RowOrder = 0; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xC8: case 0xC9: case 0xCA: case 0xCB: case 0xCC: case 0xCD: case 0xCE: case 0xCF: + // Display rows from top to bottom as 63 to 0 + MinxLCD.RowOrder = 1; + LCDDirty = MINX_DIRTYSCR; + return; + case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7: + case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF: + // Do nothing? + return; + case 0xE0: + // Start "Read Modify Write" + MinxLCD.ReadModifyMode = 1; + MinxLCD.RMWColumn = MinxLCD.Column; + return; + case 0xE2: + // Reset + MinxLCD.SetContrast = 0; + MinxLCD_SetContrast(0x20); + MinxLCD.Column = 0; + MinxLCD.StartLine = 0; + MinxLCD.SegmentDir = 0; + MinxLCD.MaxContrast = 0; + MinxLCD.SetAllPix = 0; + MinxLCD.InvAllPix = 0; + MinxLCD.DisplayOn = 0; + MinxLCD.Page = 0; + MinxLCD.RowOrder = 0; + MinxLCD.ReadModifyMode = 0; + MinxLCD.RequireDummyR = 1; + MinxLCD.RMWColumn = 0; + return; + case 0xE3: + // No operation + return; + case 0xEE: + // End "Read Modify Write" + MinxLCD.ReadModifyMode = 0; + MinxLCD.Column = MinxLCD.RMWColumn; + return; + case 0xE1: case 0xE4: case 0xE5: case 0xE6: case 0xE7: + case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEF: + // User shouldn't mess with this ones as may damage the LCD + return; + case 0xF0: case 0xF1: case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7: + // 0xF1 and 0xF5 freeze LCD and cause malfunction (need to power off the device to restore) + // User shouldn't mess with this ones as may damage the LCD + return; + case 0xF8: case 0xF9: case 0xFA: case 0xFB: case 0xFC: case 0xFD: case 0xFE: case 0xFF: + // Contrast voltage control, FC = Default + // User shouldn't mess with this ones as may damage the LCD + return; + } +} + +void MinxLCD_LCDWrite(uint8_t data) +{ + int addr; + if (MinxLCD.SetContrast) { + MinxLCD.SetContrast = 0; + // Set contrast + MinxLCD_SetContrast(data & 0x3F); + } else { + // Set pixel + if (MinxLCD.SegmentDir) { + addr = 131 - MinxLCD.Column + (MinxLCD.Page << 8); + } else { + addr = MinxLCD.Column + (MinxLCD.Page << 8); + } + LCDData[addr] = data; + if (PRCColorMap) MinxColorPRC_WriteLCD(addr, data); + MinxLCD.Column++; + if (MinxLCD.Column > 131) MinxLCD.Column = 131; + MinxLCD.RequireDummyR = 1; + LCDDirty = LCDDirtyPixels[CommandLine.lcdmode]; + } +} + +void MinxLCD_LCDWritefb(uint8_t *fb) +{ + int i; + uint8_t *dst = (uint8_t *)LCDData, pages = 8; + if (MinxLCD.SegmentDir) { + while (pages--) { + for (i=0; i<96; i++) dst[131-i] = fb[i]; + dst += 256; fb += 96; + } + } else { + while (pages--) { + memcpy(dst, fb, 96); + dst += 256; fb += 96; + } + } + MinxLCD.Page = 7; + MinxLCD.Column = 96; + MinxLCD.RequireDummyR = 1; + MinxLCD.ReadModifyMode = 0; + LCDDirty = LCDDirtyPixels[CommandLine.lcdmode]; +} + +// Contrast level on light and dark pixel +const uint8_t MinxLCD_ContrastLvl[64][2] = { + { 0, 4}, // 0 (0x00) + { 0, 4}, // 1 (0x01) + { 0, 4}, // 2 (0x02) + { 0, 4}, // 3 (0x03) + { 0, 6}, // 4 (0x04) + { 0, 11}, // 5 (0x05) + { 0, 17}, // 6 (0x06) + { 0, 24}, // 7 (0x07) + { 0, 31}, // 8 (0x08) + { 0, 40}, // 9 (0x09) + { 0, 48}, // 10 (0x0A) + { 0, 57}, // 11 (0x0B) + { 0, 67}, // 12 (0x0C) + { 0, 77}, // 13 (0x0D) + { 0, 88}, // 14 (0x0E) + { 0, 99}, // 15 (0x0F) + { 0, 110}, // 16 (0x10) + { 0, 122}, // 17 (0x11) + { 0, 133}, // 18 (0x12) + { 0, 146}, // 19 (0x13) + { 0, 158}, // 20 (0x14) + { 0, 171}, // 21 (0x15) + { 0, 184}, // 22 (0x16) + { 0, 198}, // 23 (0x17) + { 0, 212}, // 24 (0x18) + { 0, 226}, // 25 (0x19) + { 0, 240}, // 26 (0x1A) + { 0, 255}, // 27 (0x1B) + { 2, 255}, // 28 (0x1C) + { 5, 255}, // 29 (0x1D) + { 10, 255}, // 30 (0x1E) + { 15, 255}, // 31 (0x1F) + { 21, 255}, // 32 (0x20) + { 27, 255}, // 33 (0x21) + { 34, 255}, // 34 (0x22) + { 41, 255}, // 35 (0x23) + { 48, 255}, // 36 (0x24) + { 56, 255}, // 37 (0x25) + { 64, 255}, // 38 (0x26) + { 73, 255}, // 39 (0x27) + { 81, 255}, // 40 (0x28) + { 90, 255}, // 41 (0x29) + {100, 255}, // 42 (0x2A) + {109, 255}, // 43 (0x2B) + {119, 255}, // 44 (0x2C) + {129, 255}, // 45 (0x2D) + {139, 255}, // 46 (0x2E) + {149, 255}, // 47 (0x2F) + {160, 255}, // 48 (0x30) + {171, 255}, // 49 (0x31) + {182, 255}, // 50 (0x32) + {193, 255}, // 51 (0x33) + {204, 255}, // 52 (0x34) + {216, 255}, // 53 (0x35) + {228, 255}, // 54 (0x36) + {240, 255}, // 55 (0x37) + {240, 255}, // 56 (0x38) + {240, 255}, // 57 (0x39) + {240, 255}, // 58 (0x3A) + {240, 255}, // 59 (0x3B) + {240, 255}, // 60 (0x3C) + {240, 255}, // 61 (0x3D) + {240, 255}, // 62 (0x3E) + {240, 255}, // 63 (0x3F) +}; + +void MinxLCD_SetContrast(uint8_t value) +{ + MinxLCD.Contrast = value & 0x3F; + if (MinxLCD.MaxContrast) { + MinxLCD.Pixel0Intensity = 240; + MinxLCD.Pixel1Intensity = 255; + } else { + MinxLCD.Pixel0Intensity = MinxLCD_ContrastLvl[MinxLCD.Contrast][0]; + MinxLCD.Pixel1Intensity = MinxLCD_ContrastLvl[MinxLCD.Contrast][1]; + } + LCDDirty = MINX_DIRTYSCR; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxLCD.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxLCD.h new file mode 100644 index 0000000000..f8fb8e1018 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxLCD.h @@ -0,0 +1,98 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXHW_LCD +#define MINXHW_LCD + +#include + +typedef struct { + // Internal processing + int32_t Pixel0Intensity; // Pixel 0 Intensity + int32_t Pixel1Intensity; // Pixel 1 Intensity + uint8_t Column; // Column + uint8_t StartLine; // Start line + uint8_t SetContrast; // Set contrast + uint8_t Contrast; // Contrast level + uint8_t SegmentDir; // Segment Driver Direction Select + uint8_t MaxContrast; // Max Contrast + uint8_t SetAllPix; // Set All Pixels + uint8_t InvAllPix; // Invert All Pixels + uint8_t DisplayOn; // Display On + uint8_t Page; // Page + uint8_t RowOrder; // 0 = Top to bottom, 1 = Bottom to top + uint8_t ReadModifyMode; // Read Modify Write mode + uint8_t RequireDummyR; // Require Dummy Read + uint8_t RMWColumn; // Column when Read Modify Write started +} TMinxLCD; + +#ifndef MINX_DIRTYPIX +#define MINX_DIRTYPIX 4 +#endif + +#ifndef MINX_DIRTYSCR +#define MINX_DIRTYSCR 4 +#endif + +// Export LCD state +extern TMinxLCD MinxLCD; + +// LCD dirty status (1+ = graphics changed) +extern int LCDDirty; + +// LCD Data (132 x 65 x 1bpp), Pitch of 256 bytes +extern uint8_t *LCDData; + +// LCD Pixels Digital (96 x 64, 0 or 1) +extern uint8_t *LCDPixelsD; + +// LCD Pixels Analog (96 x 64, 0 to 255) +extern uint8_t *LCDPixelsA; + + +int MinxLCD_Create(void); + +void MinxLCD_Destroy(void); + +void MinxLCD_Reset(int hardreset); + +int MinxLCD_LoadState(FILE *fi, uint32_t bsize); + +int MinxLCD_SaveState(FILE *fi); + +uint8_t MinxLCD_ReadReg(int cpu, uint8_t reg); + +void MinxLCD_WriteReg(int cpu, uint8_t reg, uint8_t val); + +void MinxLCD_DecayRefresh(void); + +void MinxLCD_Render(void); + +uint8_t MinxLCD_LCDReadCtrl(int cpu); + +uint8_t MinxLCD_LCDRead(int cpu); + +void MinxLCD_LCDWriteCtrl(uint8_t data); + +void MinxLCD_LCDWrite(uint8_t data); + +void MinxLCD_LCDWritefb(uint8_t *fb); + +void MinxLCD_SetContrast(uint8_t value); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxPRC.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxPRC.c new file mode 100644 index 0000000000..8588da1246 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxPRC.c @@ -0,0 +1,407 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +TMinxPRC MinxPRC; +int PRCAllowStall = 1; // Allow stall CPU? +int StallCPU = 0; // Stall CPU output flag +int PRCRenderBD = 0; // Render backdrop? (Background overrides backdrop) +int PRCRenderBG = 1; // Render background? +int PRCRenderSpr = 1; // Render sprites? + +const uint8_t PRCInvertBit[256] = { // Invert Bit table + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF +}; + +#ifdef PERFORMANCE +int StallCycles = 64; // Stall CPU cycles +#else +int StallCycles = 32; // Stall CPU cycles +#endif + +TMinxPRC_Render MinxPRC_Render = MinxPRC_Render_Mono; + +// +// Functions +// + +int MinxPRC_Create(void) +{ + // Reset + MinxPRC_Reset(1); + + return 1; +} + +void MinxPRC_Destroy(void) +{ +} + +void MinxPRC_Reset(int hardreset) +{ + // Initialize State + memset((void *)&MinxPRC, 0, sizeof(TMinxPRC)); + + // Initialize variables + StallCPU = 0; + MinxPRC.PRCRateMatch = 0x10; +} + +int MinxPRC_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(1+32); + POKELOADSS_8(StallCPU); + POKELOADSS_32(MinxPRC.PRCCnt); + POKELOADSS_32(MinxPRC.PRCBGBase); + POKELOADSS_32(MinxPRC.PRCSprBase); + POKELOADSS_8(MinxPRC.PRCMode); + POKELOADSS_8(MinxPRC.PRCRateMatch); + POKELOADSS_8(MinxPRC.PRCMapPX); + POKELOADSS_8(MinxPRC.PRCMapPY); + POKELOADSS_8(MinxPRC.PRCMapTW); + POKELOADSS_8(MinxPRC.PRCMapTH); + POKELOADSS_8(MinxPRC.PRCState); + POKELOADSS_X(13); + POKELOADSS_END(1+32); + +} + +int MinxPRC_SaveState(FILE *fi) +{ + POKESAVESS_START(1+32); + POKESAVESS_8(StallCPU); + POKESAVESS_32(MinxPRC.PRCCnt); + POKESAVESS_32(MinxPRC.PRCBGBase); + POKESAVESS_32(MinxPRC.PRCSprBase); + POKESAVESS_8(MinxPRC.PRCMode); + POKESAVESS_8(MinxPRC.PRCRateMatch); + POKESAVESS_8(MinxPRC.PRCMapPX); + POKESAVESS_8(MinxPRC.PRCMapPY); + POKESAVESS_8(MinxPRC.PRCMapTW); + POKESAVESS_8(MinxPRC.PRCMapTH); + POKESAVESS_8(MinxPRC.PRCState); + POKESAVESS_X(13); + POKESAVESS_END(1+32); +} + +void MinxPRC_Sync(void) +{ + // Process PRC Counter + MinxPRC.PRCCnt += MINX_PRCTIMERINC * PokeHWCycles; + if ((PMR_PRC_RATE & 0xF0) >= MinxPRC.PRCRateMatch) { + // Active frame + if (MinxPRC.PRCCnt < 0x18000000) { + // CPU Time + MinxPRC.PRCState = 0; + } else if ((MinxPRC.PRCCnt & 0xFF000000) == 0x18000000) { + // PRC BG&SPR Trigger + if (MinxPRC.PRCState == 1) return; + if (MinxPRC.PRCMode == 2) { + if (PRCAllowStall) StallCPU = 1; + MinxPRC_Render(); + MinxPRC.PRCState = 1; + } else if (PRCColorMap) MinxPRC_NoRender_Color(); + } else if ((MinxPRC.PRCCnt & 0xFF000000) == 0x39000000) { + // PRC Copy Trigger + if (MinxPRC.PRCState == 2) return; + if (MinxPRC.PRCMode) { + if (PRCAllowStall) StallCPU = 1; + MinxPRC_CopyToLCD(); + MinxCPU_OnIRQAct(MINX_INTR_03); + MinxPRC.PRCState = 2; + } + } else if (MinxPRC.PRCCnt >= 0x42000000) { + // End-of-frame + StallCPU = 0; + PMR_PRC_RATE &= 0x0F; + MinxPRC.PRCCnt = 0x01000000; + MinxCPU_OnIRQAct(MINX_INTR_04); + MinxPRC_On72HzRefresh(1); + } + } else { + // Non-active frame + if (MinxPRC.PRCCnt >= 0x42000000) { + PMR_PRC_RATE += 0x10; + MinxPRC.PRCCnt = 0x01000000; + MinxPRC_On72HzRefresh(0); + } + } +} + +uint8_t MinxPRC_ReadReg(uint8_t reg) +{ + // 0x80 to 0x8F + switch(reg) { + case 0x80: // PRC Stage Control + return PMR_PRC_MODE & 0x3F; + case 0x81: // PRC Rate Control + return PMR_PRC_RATE; + case 0x82: // PRC Map Tile Base (Lo) + return PMR_PRC_MAP_LO & 0xF8; + case 0x83: // PRC Map Tile Base (Med) + return PMR_PRC_MAP_MID; + case 0x84: // PRC Map Tile Base (Hi) + return PMR_PRC_MAP_HI & 0x1F; + case 0x85: // PRC Map Vertical Scroll + return PMR_PRC_SCROLL_Y & 0x7F; + case 0x86: // PRC Map Horizontal Scroll + return PMR_PRC_SCROLL_X & 0x7F; + case 0x87: // PRC Map Sprite Base (Lo) + return PMR_PRC_SPR_LO & 0xC0; + case 0x88: // PRC Map Sprite Base (Med) + return PMR_PRC_SPR_MID; + case 0x89: // PRC Map Sprite Base (Hi) + return PMR_PRC_SPR_HI & 0x1F; + case 0x8A: // PRC Counter + return MinxPRC.PRCCnt >> 24; + default: // Unused + return 0; + } +} + +void MinxPRC_WriteReg(uint8_t reg, uint8_t val) +{ + // 0x80 to 0x8F + switch(reg) { + case 0x80: // PRC Stage Control + PMR_PRC_MODE = val & 0x3F; + if (val & 0x08) { + MinxPRC.PRCMode = (val & 0x06) ? 2 : 1; + } else MinxPRC.PRCMode = 0; + switch (val & 0x30) { + case 0x00: MinxPRC.PRCMapTW = 12; MinxPRC.PRCMapTH = 16; break; + case 0x10: MinxPRC.PRCMapTW = 16; MinxPRC.PRCMapTH = 12; break; + case 0x20: MinxPRC.PRCMapTW = 24; MinxPRC.PRCMapTH = 8; break; + case 0x30: MinxPRC.PRCMapTW = 24; MinxPRC.PRCMapTH = 16; break; + } + return; + case 0x81: // PRC Rate Control + if ((PMR_PRC_RATE & 0x0E) != (val & 0x0E)) PMR_PRC_RATE = (val & 0x0F); + else PMR_PRC_RATE = (PMR_PRC_RATE & 0xF0) | (val & 0x0F); + switch (val & 0x0E) { + case 0x00: MinxPRC.PRCRateMatch = 0x20; break; // Rate /3 + case 0x02: MinxPRC.PRCRateMatch = 0x50; break; // Rate /6 + case 0x04: MinxPRC.PRCRateMatch = 0x80; break; // Rate /9 + case 0x06: MinxPRC.PRCRateMatch = 0xB0; break; // Rate /12 + case 0x08: MinxPRC.PRCRateMatch = 0x10; break; // Rate /2 + case 0x0A: MinxPRC.PRCRateMatch = 0x30; break; // Rate /4 + case 0x0C: MinxPRC.PRCRateMatch = 0x50; break; // Rate /6 + case 0x0E: MinxPRC.PRCRateMatch = 0x70; break; // Rate /8 + } + return; + case 0x82: // PRC Map Tile Base Low + PMR_PRC_MAP_LO = val & 0xF8; + MinxPRC.PRCBGBase = (MinxPRC.PRCBGBase & 0x1FFF00) | PMR_PRC_MAP_LO; + return; + case 0x83: // PRC Map Tile Base Middle + PMR_PRC_MAP_MID = val; + MinxPRC.PRCBGBase = (MinxPRC.PRCBGBase & 0x1F00F8) | (PMR_PRC_MAP_MID << 8); + return; + case 0x84: // PRC Map Tile Base High + PMR_PRC_MAP_HI = val & 0x1F; + MinxPRC.PRCBGBase = (MinxPRC.PRCBGBase & 0x00FFF8) | (PMR_PRC_MAP_HI << 16); + return; + case 0x85: // PRC Map Vertical Scroll + PMR_PRC_SCROLL_Y = val & 0x7F; + if (PMR_PRC_SCROLL_Y <= (MinxPRC.PRCMapTH*8-64)) MinxPRC.PRCMapPY = PMR_PRC_SCROLL_Y; + return; + case 0x86: // PRC Map Horizontal Scroll + PMR_PRC_SCROLL_X = val & 0x7F; + if (PMR_PRC_SCROLL_X <= (MinxPRC.PRCMapTW*8-96)) MinxPRC.PRCMapPX = PMR_PRC_SCROLL_X; + return; + case 0x87: // PRC Sprite Tile Base Low + PMR_PRC_SPR_LO = val & 0xC0; + MinxPRC.PRCSprBase = (MinxPRC.PRCSprBase & 0x1FFF00) | PMR_PRC_SPR_LO; + return; + case 0x88: // PRC Sprite Tile Base Middle + PMR_PRC_SPR_MID = val; + MinxPRC.PRCSprBase = (MinxPRC.PRCSprBase & 0x1F00C0) | (PMR_PRC_SPR_MID << 8); + return; + case 0x89: // PRC Sprite Tile Base High + PMR_PRC_SPR_HI = val & 0x1F; + MinxPRC.PRCSprBase = (MinxPRC.PRCSprBase & 0x00FFC0) | (PMR_PRC_SPR_HI << 16); + return; + case 0x8A: // PRC Counter + return; + } +} + +// +// Default PRC Rendering +// + +static inline void MinxPRC_DrawSprite8x8_Mono(uint8_t cfg, int X, int Y, int DrawT, int MaskT) +{ + int xC, xP, vaddr; + uint8_t vdata, sdata, smask; + uint8_t data; + + // No point to proceed if it's offscreen + if ((X < -7) || (X >= 96)) return; + if ((Y < -7) || (Y >= 64)) return; + + // Pre calculate + vaddr = 0x1000 + ((Y >> 3) * 96) + X; + + // Process top columns + if (Y >= 0) { + for (xC=0; xC<8; xC++) { + if ((X >= 0) && (X < 96)) { + xP = (cfg & 0x01) ? (7 - xC) : xC; + + vdata = MinxPRC_OnRead(0, vaddr + xC); + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + + if (cfg & 0x02) { + sdata = PRCInvertBit[sdata]; + smask = PRCInvertBit[smask]; + } + if (cfg & 0x04) sdata = ~sdata; + + data = vdata & ((smask << (Y & 7)) | (0xFF >> (8 - (Y & 7)))); + data |= (sdata & ~smask) << (Y & 7); + + MinxPRC_OnWrite(0, vaddr + xC, data); + } + X++; + } + X -= 8; + } + + // Calculate new vaddr; + vaddr += 96; + + // Process bottom columns + if ((Y < 56) && (Y & 7)) { + for (xC=0; xC<8; xC++) { + if ((X >= 0) && (X < 96)) { + xP = (cfg & 0x01) ? (7 - xC) : xC; + + vdata = MinxPRC_OnRead(0, vaddr + xC); + sdata = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (DrawT * 8) + xP); + smask = MinxPRC_OnRead(0, MinxPRC.PRCSprBase + (MaskT * 8) + xP); + + if (cfg & 0x02) { + sdata = PRCInvertBit[sdata]; + smask = PRCInvertBit[smask]; + } + if (cfg & 0x04) sdata = ~sdata; + + data = vdata & ((smask >> (8-(Y & 7))) | (0xFF << (Y & 7))); + data |= (sdata & ~smask) >> (8-(Y & 7)); + + MinxPRC_OnWrite(0, vaddr + xC, data); + } + X++; + } + } +} + +void MinxPRC_Render_Mono(void) +{ + int xC, yC, tx, ty, ltileidxaddr, tileidxaddr, outaddr; + int tiletopaddr = 0, tilebotaddr = 0; + uint8_t data; + + int SprTB, SprAddr; + int SprX, SprY, SprC; + int SprFX, SprFY; + + if (PRCRenderBD) { + for (xC=0x1000; xC<0x1300; xC++) MinxPRC_OnWrite(0, xC, 0x00); + } + + if ((PRCRenderBG) && (PMR_PRC_MODE & 0x02)) { + outaddr = 0x1000; + ltileidxaddr = -1; + for (yC=0; yC<8; yC++) { + ty = (yC << 3) + MinxPRC.PRCMapPY; + for (xC=0; xC<96; xC++) { + tx = xC + MinxPRC.PRCMapPX; + tileidxaddr = 0x1360 + (ty >> 3) * MinxPRC.PRCMapTW + (tx >> 3); + + // Read tile index + if (ltileidxaddr != tileidxaddr) { + tiletopaddr = MinxPRC.PRCBGBase + (MinxPRC_OnRead(0, tileidxaddr) * 8); + tilebotaddr = MinxPRC.PRCBGBase + (MinxPRC_OnRead(0, tileidxaddr + MinxPRC.PRCMapTW) * 8); + ltileidxaddr = tileidxaddr; + } + + // Read tile data + data = (MinxPRC_OnRead(0, tiletopaddr + (tx & 7)) >> (ty & 7)) + | (MinxPRC_OnRead(0, tilebotaddr + (tx & 7)) << (8 - (ty & 7))); + + // Write to VRAM + MinxPRC_OnWrite(0, outaddr++, (PMR_PRC_MODE & 0x01) ? ~data : data); + } + } + } + + if ((PRCRenderSpr) && (PMR_PRC_MODE & 0x04)) { + SprAddr = 0x1300 + (24 * 4); + do { + SprC = MinxPRC_OnRead(0, --SprAddr); + SprTB = MinxPRC_OnRead(0, --SprAddr) * 8; + SprY = (MinxPRC_OnRead(0, --SprAddr) & 0x7F) - 16; + SprX = (MinxPRC_OnRead(0, --SprAddr) & 0x7F) - 16; + if (SprC & 0x08) { + SprFX = SprC & 0x01 ? 8 : 0; + SprFY = SprC & 0x02 ? 8 : 0; + MinxPRC_DrawSprite8x8_Mono(SprC, SprX + SprFX, SprY + SprFY, SprTB+2, SprTB); + MinxPRC_DrawSprite8x8_Mono(SprC, SprX + SprFX, SprY + 8 - SprFY, SprTB+3, SprTB+1); + MinxPRC_DrawSprite8x8_Mono(SprC, SprX + 8 - SprFX, SprY + SprFY, SprTB+6, SprTB+4); + MinxPRC_DrawSprite8x8_Mono(SprC, SprX + 8 - SprFX, SprY + 8 - SprFY, SprTB+7, SprTB+5); + } + } while (SprAddr > 0x1300); + } +} + +void MinxPRC_CopyToLCD(void) +{ + MinxLCD_LCDWritefb(MinxPRC_LCDfb); +/* + // Can't be used with the new color mode support for LCD + int i, j; + MinxLCD_LCDWriteCtrl(0xEE); + for (i=0; i<8; i++) { + MinxLCD_LCDWriteCtrl(0xB0 + i); + MinxLCD_LCDWriteCtrl(0x00); + MinxLCD_LCDWriteCtrl(0x10); + for (j=0; j<96; j++) { + MinxLCD_LCDWrite(MinxPRC_OnRead(0, 0x1000 + (i * 96) + j)); + } + } +*/ +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxPRC.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxPRC.h new file mode 100644 index 0000000000..7a22c9cb45 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxPRC.h @@ -0,0 +1,100 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXHW_PRC +#define MINXHW_PRC + +#include + +typedef struct { + // Internal processing + int32_t PRCCnt; // PRC Counter 8.24 (Need signed) + uint32_t PRCBGBase; // PRC Map Tile Base + uint32_t PRCSprBase; // PRC Sprite Base + uint8_t PRCMode; // PRC Mode (0 = Off, 1 = Copy, 3 = BG+Spr+Copy) + uint8_t PRCRateMatch; // PRC Rate Match + uint8_t PRCMapPX; // PRC Map X (Pixels) + uint8_t PRCMapPY; // PRC Map Y (Pixels) + uint8_t PRCMapTW; // PRC Map Width (Tiles) + uint8_t PRCMapTH; // PRC Map Height (Tiles) + uint8_t PRCState; // PRC State +} TMinxPRC; + +typedef void (*TMinxPRC_Render)(void); + +// Export PRC state +extern TMinxPRC MinxPRC; + +// Invert bit table +extern const uint8_t PRCInvertBit[256]; + +// Stall CPU +extern int PRCAllowStall; +extern int StallCPU; +extern int StallCycles; + +// Render backdrop? (Background overrides backdrop) +extern int PRCRenderBD; +// Render background? +extern int PRCRenderBG; +// Render sprites? +extern int PRCRenderSpr; + +// Render callback +extern TMinxPRC_Render MinxPRC_Render; + +enum { + MINX_INTR_03 = 0x03, // PRC Copy Complete + MINX_INTR_04 = 0x04 // PRC Frame Divider Overflow +}; + +// Aproximate value of PRC Timer (~4678 Hz) (16M / ( 4M / 855 )) +#define MINX_PRCTIMERINC (16777216/855) + + +int MinxPRC_Create(void); + +void MinxPRC_Destroy(void); + +void MinxPRC_Reset(int hardreset); + +int MinxPRC_LoadState(FILE *fi, uint32_t bsize); + +int MinxPRC_SaveState(FILE *fi); + +void MinxPRC_Sync(void); + +uint8_t MinxPRC_ReadReg(uint8_t reg); + +void MinxPRC_WriteReg(uint8_t reg, uint8_t val); + +// +// Internals +// + +void MinxPRC_Render_Mono(void); + +void MinxPRC_CopyToLCD(void); + +// +// Callbacks (Written by the user) +// + +void MinxPRC_On72HzRefresh(int render); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxTimers.c b/PVPokeMini/PokeMini/pokemini-code/source/MinxTimers.c new file mode 100644 index 0000000000..f5916a231e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxTimers.c @@ -0,0 +1,691 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" + +TMinxTimers MinxTimers; + +// Calculate decrease on oscillator 1 +const uint32_t MinxTimers_CalculateDecOsc1[16] = { + // Osci1 disabled + 0, 0, 0, 0, 0, 0, 0, 0, + // Osci1 Enabled + (16777216/2), // 2000000 Hz + (16777216/8), // 500000 Hz + (16777216/32), // 125000 Hz + (16777216/64), // 62500 Hz + (16777216/128), // 31250 Hz + (16777216/256), // 15625 Hz + (16777216/1024), // 3906.25 Hz + (16777216/4096), // 976.5625 Hz +}; + +// Calculate decrease on oscillator 2 +const uint32_t MinxTimers_CalculateDecOsc2[16] = { + // Osci2 disabled + 0, 0, 0, 0, 0, 0, 0, 0, + // Osci2 Enabled (Aproximate values) + (16777216/122), // 32768 Hz + (16777216/244), // 16384 Hz + (16777216/488), // 8192 Hz + (16777216/977), // 4096 Hz + (16777216/1953), // 2048 Hz + (16777216/3906), // 1024 Hz + (16777216/7812), // 512 Hz + (16777216/15625) // 256 Hz +}; + +// Timers counting frequency table +const uint32_t MinxTimers_CountFreq[32] = { + // Osci1 disabled + 0, 0, 0, 0, 0, 0, 0, 0, + // Osci1 Enabled + (4000000/2), (4000000/8), (4000000/32), (4000000/64), + (4000000/128), (4000000/256), (4000000/1024), (4000000/4096), + // Osci2 disabled + 0, 0, 0, 0, 0, 0, 0, 0, + // Osci2 Enabled + (32768/1), (32768/2), (32768/4), (32768/8), + (32768/16), (32768/32), (32768/64), (32768/128) +}; + +// +// Functions +// + +int MinxTimers_Create(void) +{ + // Reset + memset((void *)&MinxTimers, 0, sizeof(TMinxTimers)); + MinxTimers_Reset(1); + + return 1; +} + +void MinxTimers_Destroy(void) +{ +} + +void MinxTimers_Reset(int hardreset) +{ + if (hardreset) { + // Init state + memset((void *)&MinxTimers, 0, sizeof(TMinxTimers)); + } + + // Init variables + MinxTimers.Tmr1PreA = 0xFFFFFFFF; + MinxTimers.Tmr1PreB = 0xFFFFFFFF; + MinxTimers.Tmr2PreA = 0xFFFFFFFF; + MinxTimers.Tmr2PreB = 0xFFFFFFFF; + MinxTimers.Tmr3PreA = 0xFFFFFFFF; + MinxTimers.Tmr3PreB = 0xFFFFFFFF; +} + +int MinxTimers_LoadState(FILE *fi, uint32_t bsize) +{ + POKELOADSS_START(128); + POKELOADSS_32(MinxTimers.SecTimerCnt); + POKELOADSS_32(MinxTimers.TmrSecs); + POKELOADSS_32(MinxTimers.Tmr1DecA); + POKELOADSS_32(MinxTimers.Tmr1DecB); + POKELOADSS_32(MinxTimers.Tmr1CntA); + POKELOADSS_32(MinxTimers.Tmr1CntB); + POKELOADSS_32(MinxTimers.Tmr1PreA); + POKELOADSS_32(MinxTimers.Tmr1PreB); + POKELOADSS_32(MinxTimers.Tmr2DecA); + POKELOADSS_32(MinxTimers.Tmr2DecB); + POKELOADSS_32(MinxTimers.Tmr2CntA); + POKELOADSS_32(MinxTimers.Tmr2CntB); + POKELOADSS_32(MinxTimers.Tmr2PreA); + POKELOADSS_32(MinxTimers.Tmr2PreB); + POKELOADSS_32(MinxTimers.Tmr3DecA); + POKELOADSS_32(MinxTimers.Tmr3DecB); + POKELOADSS_32(MinxTimers.Tmr3CntA); + POKELOADSS_32(MinxTimers.Tmr3CntB); + POKELOADSS_32(MinxTimers.Tmr3PreA); + POKELOADSS_32(MinxTimers.Tmr3PreB); + POKELOADSS_32(MinxTimers.Tmr8Cnt); + POKELOADSS_32(MinxTimers.PRCCnt); + POKELOADSS_16(MinxTimers.Tmr3Cnt16.W); + POKELOADSS_16(MinxTimers.Timer3Piv); + POKELOADSS_8(MinxTimers.TmrXEna2); + POKELOADSS_8(MinxTimers.TmrXEna1); + POKELOADSS_X(34); + POKELOADSS_END(128); + MinxTimers.Tmr1WMode = PMR_TMR1_CTRL_L & 0x80; + MinxTimers.Tmr1LEna = PMR_TMR1_CTRL_L & 0x04; + MinxTimers.Tmr1HEna = PMR_TMR1_CTRL_H & 0x04; + MinxTimers.Tmr2WMode = PMR_TMR2_CTRL_L & 0x80; + MinxTimers.Tmr2LEna = PMR_TMR2_CTRL_L & 0x04; + MinxTimers.Tmr2HEna = PMR_TMR2_CTRL_H & 0x04; + MinxTimers.Tmr3WMode = PMR_TMR3_CTRL_L & 0x80; + MinxTimers.Tmr3LEna = PMR_TMR3_CTRL_L & 0x04; + MinxTimers.Tmr3HEna = PMR_TMR3_CTRL_H & 0x04; +} + +int MinxTimers_SaveState(FILE *fi) +{ + POKESAVESS_START(128); + POKESAVESS_32(MinxTimers.SecTimerCnt); + POKESAVESS_32(MinxTimers.TmrSecs); + POKESAVESS_32(MinxTimers.Tmr1DecA); + POKESAVESS_32(MinxTimers.Tmr1DecB); + POKESAVESS_32(MinxTimers.Tmr1CntA); + POKESAVESS_32(MinxTimers.Tmr1CntB); + POKESAVESS_32(MinxTimers.Tmr1PreA); + POKESAVESS_32(MinxTimers.Tmr1PreB); + POKESAVESS_32(MinxTimers.Tmr2DecA); + POKESAVESS_32(MinxTimers.Tmr2DecB); + POKESAVESS_32(MinxTimers.Tmr2CntA); + POKESAVESS_32(MinxTimers.Tmr2CntB); + POKESAVESS_32(MinxTimers.Tmr2PreA); + POKESAVESS_32(MinxTimers.Tmr2PreB); + POKESAVESS_32(MinxTimers.Tmr3DecA); + POKESAVESS_32(MinxTimers.Tmr3DecB); + POKESAVESS_32(MinxTimers.Tmr3CntA); + POKESAVESS_32(MinxTimers.Tmr3CntB); + POKESAVESS_32(MinxTimers.Tmr3PreA); + POKESAVESS_32(MinxTimers.Tmr3PreB); + POKESAVESS_32(MinxTimers.Tmr8Cnt); + POKESAVESS_32(MinxTimers.PRCCnt); + POKESAVESS_16(MinxTimers.Tmr3Cnt16.W); + POKESAVESS_16(MinxTimers.Timer3Piv); + POKESAVESS_8(MinxTimers.TmrXEna2); + POKESAVESS_8(MinxTimers.TmrXEna1); + POKESAVESS_X(34); + POKESAVESS_END(128); +} + +void MinxTimers_Sync(void) +{ + register uint32_t PreCount; + + // Process 256Hz Timer (Increment) + if (PMR_TMR256_CTRL) { + PreCount = MinxTimers.Tmr8Cnt; + MinxTimers.Tmr8Cnt += MINX_TIMER256INC * PokeHWCycles; + if ((PreCount & 0x08000000) ^ (MinxTimers.Tmr8Cnt & 0x08000000)) { + // 32Hz + MinxCPU_OnIRQAct(MINX_INTR_0B); + } + if ((PreCount & 0x20000000) ^ (MinxTimers.Tmr8Cnt & 0x20000000)) { + // 8Hz + MinxCPU_OnIRQAct(MINX_INTR_0C); + } + if ((PreCount & 0x80000000) ^ (MinxTimers.Tmr8Cnt & 0x80000000)) { + // 2Hz + MinxCPU_OnIRQAct(MINX_INTR_0D); + } + if (PreCount > MinxTimers.Tmr8Cnt) { + // 1Hz + MinxCPU_OnIRQAct(MINX_INTR_0E); + } + } + + // Process Second Timer (Increment) + if (PMR_SEC_CTRL) { + MinxTimers.TmrSecs += PokeHWCycles; + if (MinxTimers.TmrSecs >= 4000000) { + MinxTimers.SecTimerCnt++; + MinxTimers.TmrSecs -= 4000000; + } + } + + // Process Timer 1 (Decrement) + if (MinxTimers.Tmr1WMode) { + // 1x 16-Bits Timer + if (MinxTimers.Tmr1LEna) { + PreCount = MinxTimers.Tmr1CntA; + MinxTimers.Tmr1CntA -= MinxTimers.Tmr1DecA * PokeHWCycles; + if (PreCount < MinxTimers.Tmr1CntA) { + PreCount = MinxTimers.Tmr1CntB; + MinxTimers.Tmr1CntB -= 0x01000000; + if (PreCount < MinxTimers.Tmr1CntB) { + MinxTimers.Tmr1CntA = MinxTimers.Tmr1PreA; + MinxTimers.Tmr1CntB = MinxTimers.Tmr1PreB; + // IRQ Timer 1-Hi underflow + MinxCPU_OnIRQAct(MINX_INTR_07); + } + } + } + } else { + // 2x 8-Bits Timers + if (MinxTimers.Tmr1LEna) { + // Timer Lo + PreCount = MinxTimers.Tmr1CntA; + MinxTimers.Tmr1CntA -= MinxTimers.Tmr1DecA * PokeHWCycles; + if (PreCount < MinxTimers.Tmr1CntA) { + MinxTimers.Tmr1CntA = MinxTimers.Tmr1PreA; + // IRQ Timer 1-Lo underflow + MinxCPU_OnIRQAct(MINX_INTR_08); + } + } + if (MinxTimers.Tmr1HEna) { + // Timer Hi + PreCount = MinxTimers.Tmr1CntB; + MinxTimers.Tmr1CntB -= MinxTimers.Tmr1DecB * PokeHWCycles; + if (PreCount < MinxTimers.Tmr1CntB) { + MinxTimers.Tmr1CntB = MinxTimers.Tmr1PreB; + // IRQ Timer 1-Hi underflow + MinxCPU_OnIRQAct(MINX_INTR_07); + } + } + } + + // Process Timer 2 (Decrement) + if (MinxTimers.Tmr2WMode) { + // 1x 16-Bits Timer + if (MinxTimers.Tmr2LEna) { + PreCount = MinxTimers.Tmr2CntA; + MinxTimers.Tmr2CntA -= MinxTimers.Tmr2DecA * PokeHWCycles; + if (PreCount < MinxTimers.Tmr2CntA) { + PreCount = MinxTimers.Tmr2CntB; + MinxTimers.Tmr2CntB -= 0x01000000; + if (PreCount < MinxTimers.Tmr2CntB) { + MinxTimers.Tmr2CntA = MinxTimers.Tmr2PreA; + MinxTimers.Tmr2CntB = MinxTimers.Tmr2PreB; + // IRQ Timer 2-Hi underflow + MinxCPU_OnIRQAct(MINX_INTR_05); + } + } + } + } else { + // 2x 8-Bits Timers + if (MinxTimers.Tmr2LEna) { + // Timer Lo + PreCount = MinxTimers.Tmr2CntA; + MinxTimers.Tmr2CntA -= MinxTimers.Tmr2DecA * PokeHWCycles; + if (PreCount < MinxTimers.Tmr2CntA) { + MinxTimers.Tmr2CntA = MinxTimers.Tmr2PreA; + // IRQ Timer 2-Lo underflow + MinxCPU_OnIRQAct(MINX_INTR_06); + } + } + if (MinxTimers.Tmr2HEna) { + // Timer Hi + PreCount = MinxTimers.Tmr2CntB; + MinxTimers.Tmr2CntB -= MinxTimers.Tmr2DecB * PokeHWCycles; + if (PreCount < MinxTimers.Tmr2CntB) { + MinxTimers.Tmr2CntB = MinxTimers.Tmr2PreB; + // IRQ Timer 2-Hi underflow + MinxCPU_OnIRQAct(MINX_INTR_05); + } + } + } + + // Process Timer 3 (Decrement) + if (MinxTimers.Tmr3WMode) { + // 1x 16-Bits Timer + if (MinxTimers.Tmr3LEna) { + PreCount = MinxTimers.Tmr3CntA; + MinxTimers.Tmr3CntA -= MinxTimers.Tmr3DecA * PokeHWCycles; + if (PreCount < MinxTimers.Tmr3CntA) { + PreCount = MinxTimers.Tmr3CntB; + MinxTimers.Tmr3CntB -= 0x01000000; + if (PreCount < MinxTimers.Tmr3CntB) { + MinxTimers.Tmr3CntA = MinxTimers.Tmr3PreA; + MinxTimers.Tmr3CntB = MinxTimers.Tmr3PreB; + // IRQ Timer 3 underflow + MinxCPU_OnIRQAct(MINX_INTR_09); + } + MinxTimers.Tmr3Cnt16.B.H = MinxTimers.Tmr3CntB >> 24; + } + // Check pivot + PreCount = MinxTimers.Tmr3Cnt16.W; + MinxTimers.Tmr3Cnt16.B.L = MinxTimers.Tmr3CntA >> 24; + if ((PreCount > MinxTimers.Timer3Piv) && (MinxTimers.Tmr3Cnt16.W <= MinxTimers.Timer3Piv)) { + // IRQ Timer 3 Pivot + MinxCPU_OnIRQAct(MINX_INTR_0A); + } + } + } else { + // 2x 8-Bits Timers + if (MinxTimers.Tmr3LEna) { + // Timer Lo + PreCount = MinxTimers.Tmr3CntA; + MinxTimers.Tmr3CntA -= MinxTimers.Tmr3DecA * PokeHWCycles; // Osci2 + if (PreCount < MinxTimers.Tmr3CntA) { + MinxTimers.Tmr3CntA = MinxTimers.Tmr3PreA; + } + MinxTimers.Tmr3Cnt16.B.L = MinxTimers.Tmr3CntA >> 24; + } + if (MinxTimers.Tmr3HEna) { + // Timer Hi + PreCount = MinxTimers.Tmr3CntB; + MinxTimers.Tmr3CntB -= MinxTimers.Tmr3DecB * PokeHWCycles; // Osci2 + if (PreCount < MinxTimers.Tmr3CntB) { + MinxTimers.Tmr3CntB = MinxTimers.Tmr3PreB; + // IRQ Timer 3 underflow + MinxCPU_OnIRQAct(MINX_INTR_09); + } + // Check pivot + PreCount = MinxTimers.Tmr3Cnt16.W; + MinxTimers.Tmr3Cnt16.B.H = MinxTimers.Tmr3CntB >> 24; + if ((PreCount > MinxTimers.Timer3Piv) && (MinxTimers.Tmr3Cnt16.W <= MinxTimers.Timer3Piv)) { + // IRQ Timer 3 Pivot + MinxCPU_OnIRQAct(MINX_INTR_0A); + } + } + } +} + +uint8_t MinxTimers_ReadReg(uint8_t reg) +{ + // 0x08 to 0x0F, 0x18 to 0x1F, 0x30 to 0x41, 0x48 to 0x4F + switch(reg) { + case 0x08: // Second Counter Control + return PMR_SEC_CTRL & 0x01; + case 0x09: // Second Counter Low + return (uint8_t)MinxTimers.SecTimerCnt; + case 0x0A: // Second Counter Med + return (uint8_t)(MinxTimers.SecTimerCnt >> 8); + case 0x0B: // Second Counter High + return (uint8_t)(MinxTimers.SecTimerCnt >> 16); + case 0x18: // Timer 1 Prescaler + return PMR_TMR1_SCALE; + case 0x19: // Timer 1 Osc. Select + Osc. Enable + return PMR_TMR1_ENA_OSC & 0x33; + case 0x1A: // Timer 2 Prescaler + return PMR_TMR2_SCALE; + case 0x1B: // Timer 2 Osc. Select + return PMR_TMR2_OSC & 0x03; + case 0x1C: // Timer 3 Prescaler + return PMR_TMR3_SCALE; + case 0x1D: // Timer 3 Osc. Select + return PMR_TMR3_OSC & 0x03; + case 0x30: // Timer 1 Control A + if (PMR_TMR1_CTRL_L & 0x80) { + return PMR_TMR1_CTRL_L & 0x85; // 16-Bits + } else { + return PMR_TMR1_CTRL_L & 0x0D; // 8-Bits Mode + } + case 0x31: // Timer 1 Control B + if (PMR_TMR1_CTRL_L & 0x80) { + return PMR_TMR1_CTRL_H & 0x08; // 16-Bits Mode + } else { + return PMR_TMR1_CTRL_H & 0x0D; // 8-Bits Mode + } + case 0x32: // Timer 1 Preset A + return (uint8_t)(MinxTimers.Tmr1PreA >> 24); + case 0x33: // Timer 1 Preset B + return (uint8_t)(MinxTimers.Tmr1PreB >> 24); + case 0x34: // Timer 1 Pivot A + return PMR_TMR1_PVT_L; + case 0x35: // Timer 1 Pivot B + return PMR_TMR1_PVT_H; + case 0x36: // Timer 1 Count A + return (uint8_t)(MinxTimers.Tmr1CntA >> 24); + case 0x37: // Timer 1 Count B + return (uint8_t)(MinxTimers.Tmr1CntB >> 24); + case 0x38: // Timer 2 Control A + if (PMR_TMR2_CTRL_L & 0x80) { + return PMR_TMR2_CTRL_L & 0x85; // 16-Bits + } else { + return PMR_TMR2_CTRL_L & 0x0D; // 8-Bits Mode + } + case 0x39: // Timer 2 Control B + if (PMR_TMR2_CTRL_L & 0x80) { + return PMR_TMR2_CTRL_H & 0x08; // 16-Bits Mode + } else { + return PMR_TMR2_CTRL_H & 0x0D; // 8-Bits Mode + } + case 0x3A: // Timer 2 Preset A + return (uint8_t)(MinxTimers.Tmr2PreA >> 24); + case 0x3B: // Timer 2 Preset B + return (uint8_t)(MinxTimers.Tmr2PreB >> 24); + case 0x3C: // Timer 2 Pivot A + return PMR_TMR2_PVT_L; + case 0x3D: // Timer 2 Pivot B + return PMR_TMR2_PVT_H; + case 0x3E: // Timer 2 Count A + return (uint8_t)(MinxTimers.Tmr2CntA >> 24); + case 0x3F: // Timer 2 Count B + return (uint8_t)(MinxTimers.Tmr2CntB >> 24); + case 0x40: // 256 Hz Timer Control + return PMR_TMR256_CTRL; + case 0x41: // 256 Hz Timer Counter + return MinxTimers.Tmr8Cnt >> 24; + case 0x48: // Timer 3 Control A + if (PMR_TMR3_CTRL_L & 0x80) { + return PMR_TMR3_CTRL_L & 0x85; // 16-Bits + } else { + return PMR_TMR3_CTRL_L & 0x0D; // 8-Bits Mode + } + case 0x49: // Timer 3 Control B + if (PMR_TMR3_CTRL_L & 0x80) { + return PMR_TMR3_CTRL_H & 0x08; // 16-Bits Mode + } else { + return PMR_TMR3_CTRL_H & 0x0D; // 8-Bits Mode + } + case 0x4A: // Timer 3 Preset A + return (uint8_t)(MinxTimers.Tmr3PreA >> 24); + case 0x4B: // Timer 3 Preset B + return (uint8_t)(MinxTimers.Tmr3PreB >> 24); + case 0x4C: // Timer 3 Pivot A + return (uint8_t)MinxTimers.Timer3Piv; + case 0x4D: // Timer 3 Pivot B + return (uint8_t)(MinxTimers.Timer3Piv >> 8); + case 0x4E: // Timer 3 Count A + return (uint8_t)(MinxTimers.Tmr3CntA >> 24); + case 0x4F: // Timer 3 Count B + return (uint8_t)(MinxTimers.Tmr3CntB >> 24); + default: // Unused + return reg; + } +} + +#define MinxTimers_UpdateScalarTimer1() { \ + if (PMR_TMR1_ENA_OSC & 0x01) { \ + if (MinxTimers.TmrXEna2) MinxTimers.Tmr1DecA = MinxTimers_CalculateDecOsc2[(PMR_TMR1_SCALE & 0xF)]; \ + else MinxTimers.Tmr1DecA = 0; \ + } else { \ + if (MinxTimers.TmrXEna1) MinxTimers.Tmr1DecA = MinxTimers_CalculateDecOsc1[(PMR_TMR1_SCALE & 0xF)]; \ + else MinxTimers.Tmr1DecA = 0; \ + } \ + if (PMR_TMR1_ENA_OSC & 0x02) { \ + if (MinxTimers.TmrXEna2) MinxTimers.Tmr1DecB = MinxTimers_CalculateDecOsc2[((PMR_TMR1_SCALE >> 4) & 0xF)]; \ + else MinxTimers.Tmr1DecB = 0; \ + } else { \ + if (MinxTimers.TmrXEna1) MinxTimers.Tmr1DecB = MinxTimers_CalculateDecOsc1[((PMR_TMR1_SCALE >> 4) & 0xF)]; \ + else MinxTimers.Tmr1DecB = 0; \ + } \ +} + +#define MinxTimers_UpdateScalarTimer2() { \ + if (PMR_TMR2_OSC & 0x01) { \ + if (MinxTimers.TmrXEna2) MinxTimers.Tmr2DecA = MinxTimers_CalculateDecOsc2[(PMR_TMR2_SCALE & 0xF)]; \ + else MinxTimers.Tmr2DecA = 0; \ + } else { \ + if (MinxTimers.TmrXEna1) MinxTimers.Tmr2DecA = MinxTimers_CalculateDecOsc1[(PMR_TMR2_SCALE & 0xF)]; \ + else MinxTimers.Tmr2DecA = 0; \ + } \ + if (PMR_TMR2_OSC & 0x02) { \ + if (MinxTimers.TmrXEna2) MinxTimers.Tmr2DecB = MinxTimers_CalculateDecOsc2[((PMR_TMR2_SCALE >> 4) & 0xF)]; \ + else MinxTimers.Tmr2DecB = 0; \ + } else { \ + if (MinxTimers.TmrXEna1) MinxTimers.Tmr2DecB = MinxTimers_CalculateDecOsc1[((PMR_TMR2_SCALE >> 4) & 0xF)]; \ + else MinxTimers.Tmr2DecB = 0; \ + } \ +} + +#define MinxTimers_UpdateScalarTimer3() { \ + if (PMR_TMR3_OSC & 0x01) { \ + if (MinxTimers.TmrXEna2) MinxTimers.Tmr3DecA = MinxTimers_CalculateDecOsc2[(PMR_TMR3_SCALE & 0xF)]; \ + else MinxTimers.Tmr3DecA = 0; \ + } else { \ + if (MinxTimers.TmrXEna1) MinxTimers.Tmr3DecA = MinxTimers_CalculateDecOsc1[(PMR_TMR3_SCALE & 0xF)]; \ + else MinxTimers.Tmr3DecA = 0; \ + } \ + if (PMR_TMR3_OSC & 0x02) { \ + if (MinxTimers.TmrXEna2) MinxTimers.Tmr3DecB = MinxTimers_CalculateDecOsc2[((PMR_TMR3_SCALE >> 4) & 0xF)]; \ + else MinxTimers.Tmr3DecB = 0; \ + } else { \ + if (MinxTimers.TmrXEna1) MinxTimers.Tmr3DecB = MinxTimers_CalculateDecOsc1[((PMR_TMR3_SCALE >> 4) & 0xF)]; \ + else MinxTimers.Tmr3DecB = 0; \ + } \ +} + +void MinxTimers_WriteReg(unsigned char reg, unsigned char val) +{ + // 0x08 to 0x0F, 0x18 to 0x1F, 0x30 to 0x41, 0x48 to 0x4F + switch(reg) { + case 0x08: // Second Counter Control + if (val & 0x02) MinxTimers.SecTimerCnt = 0x000000; + PMR_SEC_CTRL = val & 0x01; + return; + case 0x09: // Second Counter Low + case 0x0A: // Second Counter Med + case 0x0B: // Second Counter High + return; + case 0x18: // Timer 1 Prescaler + PMR_TMR1_SCALE = val; + MinxTimers_UpdateScalarTimer1(); + return; + case 0x19: // Timer 1 Osc. Select + Osc. Enable + PMR_TMR1_ENA_OSC = val & 0x33; + MinxTimers.TmrXEna2 = val & 0x10; + MinxTimers.TmrXEna1 = val & 0x20; + MinxTimers_UpdateScalarTimer1(); + MinxTimers_UpdateScalarTimer2(); // Because of the TmrXEna# + MinxTimers_UpdateScalarTimer3(); // Because of the TmrXEna# + return; + case 0x1A: // Timer 2 Prescaler + PMR_TMR2_SCALE = val; + MinxTimers_UpdateScalarTimer2(); + return; + case 0x1B: // Timer 2 Osc. Select + PMR_TMR2_OSC = val & 0x03; + MinxTimers_UpdateScalarTimer2(); + return; + case 0x1C: // Timer 3 Prescaler + PMR_TMR3_SCALE = val; + MinxTimers_UpdateScalarTimer3(); + return; + case 0x1D: // Timer 3 Osc. Select + PMR_TMR3_OSC = val & 0x03; + MinxTimers_UpdateScalarTimer3(); + return; + case 0x30: // Timer 1 Control A + PMR_TMR1_CTRL_L = val & 0x8D; + MinxTimers.Tmr1LEna = val & 0x04; + if (PMR_TMR1_CTRL_L & 0x80) { + // 16-Bits + MinxTimers.Tmr1WMode = 1; + if (val & 0x02) { + MinxTimers.Tmr1CntA = MinxTimers.Tmr1PreA; + MinxTimers.Tmr1CntB = MinxTimers.Tmr1PreB; + } + } else { + // 8-Bits + MinxTimers.Tmr1WMode = 0; + if (val & 0x02) { + MinxTimers.Tmr1CntA = MinxTimers.Tmr1PreA; + } + } + return; + case 0x31: // Timer 1 Control B + PMR_TMR1_CTRL_H = val & 0x0D; + MinxTimers.Tmr1HEna = val & 0x04; + if (PMR_TMR1_CTRL_L & 0x80) { + // 16-Bits, unused + } else { + // 8-Bits + if (val & 0x02) { + MinxTimers.Tmr1CntB = MinxTimers.Tmr1PreB; + } + } + return; + case 0x32: // Timer 1 Preset A + MinxTimers.Tmr1PreA = val << 24; + return; + case 0x33: // Timer 1 Preset B + MinxTimers.Tmr1PreB = val << 24; + return; + case 0x34: // Timer 1 Pivot A + PMR_TMR1_PVT_L = val; + return; + case 0x35: // Timer 1 Pivot B + PMR_TMR1_PVT_H = val; + return; + case 0x36: // Timer 1 Count A + return; + case 0x37: // Timer 1 Count B + return; + case 0x38: // Timer 2 Control A + PMR_TMR2_CTRL_L = val & 0x8D; + MinxTimers.Tmr2LEna = val & 0x04; + if (PMR_TMR2_CTRL_L & 0x80) { + // 16-Bits + MinxTimers.Tmr2WMode = 1; + if (val & 0x02) { + MinxTimers.Tmr2CntA = MinxTimers.Tmr2PreA; + MinxTimers.Tmr2CntB = MinxTimers.Tmr2PreB; + } + } else { + // 8-Bits + MinxTimers.Tmr2WMode = 0; + if (val & 0x02) { + MinxTimers.Tmr2CntA = MinxTimers.Tmr2PreA; + } + } + return; + case 0x39: // Timer 2 Control B + PMR_TMR2_CTRL_H = val & 0x0D; + MinxTimers.Tmr2HEna = val & 0x04; + if (PMR_TMR2_CTRL_L & 0x80) { + // 16-Bits, unused + } else { + // 8-Bits + if (val & 0x02) { + MinxTimers.Tmr2CntB = MinxTimers.Tmr2PreB; + } + } + return; + case 0x3A: // Timer 2 Preset A + MinxTimers.Tmr2PreA = val << 24; + return; + case 0x3B: // Timer 2 Preset B + MinxTimers.Tmr2PreB = val << 24; + return; + case 0x3C: // Timer 2 Pivot A + PMR_TMR2_PVT_L = val; + return; + case 0x3D: // Timer 2 Pivot B + PMR_TMR2_PVT_H = val; + return; + case 0x3E: // Timer 2 Count A + return; + case 0x3F: // Timer 2 Count B + return; + case 0x40: // 256 Hz Timer Control + PMR_TMR256_CTRL = val & 0x01; + if (val & 0x02) { + MinxTimers.Tmr8Cnt = 0; + } + return; + case 0x41: // 256 Hz Timer Counter + return; + case 0x48: // Timer 3 Control A + PMR_TMR3_CTRL_L = val & 0x8D; + MinxTimers.Tmr3LEna = val & 0x04; + if (PMR_TMR3_CTRL_L & 0x80) { + // 16-Bits + MinxTimers.Tmr3WMode = 1; + if (val & 0x02) { + MinxTimers.Tmr3CntA = MinxTimers.Tmr3PreA; + MinxTimers.Tmr3CntB = MinxTimers.Tmr3PreB; + } + } else { + // 8-Bits + MinxTimers.Tmr3WMode = 0; + if (val & 0x02) { + MinxTimers.Tmr3CntA = MinxTimers.Tmr3PreA; + } + } + return; + case 0x49: // Timer 3 Control B + PMR_TMR3_CTRL_H = val & 0x0D; + MinxTimers.Tmr3HEna = val & 0x04; + if (PMR_TMR3_CTRL_L & 0x80) { + // 16-Bits, unused + } else { + // 8-Bits + if (val & 0x02) { + MinxTimers.Tmr3CntB = MinxTimers.Tmr3PreB; + } + } + return; + case 0x4A: // Timer 3 Preset A + MinxTimers.Tmr3PreA = val << 24; + return; + case 0x4B: // Timer 3 Preset B + MinxTimers.Tmr3PreB = val << 24; + return; + case 0x4C: // Timer 3 Pivot A + MinxTimers.Timer3Piv = (MinxTimers.Timer3Piv & 0xFF00) | val; + return; + case 0x4D: // Timer 3 Pivot B + MinxTimers.Timer3Piv = (MinxTimers.Timer3Piv & 0x00FF) | (val << 8); + return; + case 0x4E: // Timer 3 Count A + return; + case 0x4F: // Timer 3 Count B + return; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/MinxTimers.h b/PVPokeMini/PokeMini/pokemini-code/source/MinxTimers.h new file mode 100644 index 0000000000..06d4aec456 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/MinxTimers.h @@ -0,0 +1,124 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MINXHW_TIMERS +#define MINXHW_TIMERS + +#include + +#ifdef _BIG_ENDIAN + +typedef union { + struct { + uint8_t H; + uint8_t L; + } B; + uint16_t W; +} MinxWord; + +#else + +typedef union { + struct { + uint8_t L; + uint8_t H; + } B; + uint16_t W; +} MinxWord; + +#endif + +typedef struct { + // Internal processing + uint32_t SecTimerCnt; // Second Timer Counter + int32_t TmrSecs; // Second Timer Fraction (Cycles, needs signed) + uint32_t Tmr1DecA; // Timer 1-Lo Decrement 8.24 + uint32_t Tmr1DecB; // Timer 1-Hi Decrement 8.24 + uint32_t Tmr1CntA; // Timer 1-Lo Counter 8.24 + uint32_t Tmr1CntB; // Timer 1-Hi Counter 8.24 + uint32_t Tmr1PreA; // Timer 1-Lo Preset 8.24 + uint32_t Tmr1PreB; // Timer 1-Hi Preset 8.24 + uint32_t Tmr2DecA; // Timer 2-Lo Decrement 8.24 + uint32_t Tmr2DecB; // Timer 2-Hi Decrement 8.24 + uint32_t Tmr2CntA; // Timer 2-Lo Counter 8.24 + uint32_t Tmr2CntB; // Timer 2-Hi Counter 8.24 + uint32_t Tmr2PreA; // Timer 2-Lo Preset 8.24 + uint32_t Tmr2PreB; // Timer 2-Hi Preset 8.24 + uint32_t Tmr3DecA; // Timer 3-Lo Decrement 8.24 + uint32_t Tmr3DecB; // Timer 3-Hi Decrement 8.24 + uint32_t Tmr3CntA; // Timer 3-Lo Counter 8.24 + uint32_t Tmr3CntB; // Timer 3-Hi Counter 8.24 + uint32_t Tmr3PreA; // Timer 3-Lo Preset 8.24 + uint32_t Tmr3PreB; // Timer 3-Hi Preset 8.24 + uint32_t Tmr8Cnt; // 256Hz Timer Counter 8.24 + uint32_t PRCCnt; // PRC Counter 8.24 + MinxWord Tmr3Cnt16; // Timer 3 16-Bits count + uint16_t Timer3Piv; // Timer 3 Pivot + uint8_t TmrXEna2; // Oscillator 2 Enabled + uint8_t TmrXEna1; // Oscillator 1 Enabled + // Performance cache + int Tmr1WMode; // Timer 1 16-bits mode + int Tmr1LEna; // Timer 1 low enable + int Tmr1HEna; // Timer 1 high enable + int Tmr2WMode; // Timer 2 16-bits mode + int Tmr2LEna; // Timer 2 low enable + int Tmr2HEna; // Timer 2 high enable + int Tmr3WMode; // Timer 3 16-bits mode + int Tmr3LEna; // Timer 3 low enable + int Tmr3HEna; // Timer 3 high enable +} TMinxTimers; + +// Export Timers state +extern TMinxTimers MinxTimers; + +// Interrupt table +enum { + MINX_INTR_05 = 0x05, // Timer 2-B Underflow + MINX_INTR_06 = 0x06, // Timer 2-A Underflow (8-Bits only) + MINX_INTR_07 = 0x07, // Timer 1-B Underflow + MINX_INTR_08 = 0x08, // Timer 1-A Underflow (8-Bits only) + MINX_INTR_09 = 0x09, // Timer 3 Underflow + MINX_INTR_0A = 0x0A, // Timer 3 Pivot + MINX_INTR_0B = 0x0B, // 32 Hz + MINX_INTR_0C = 0x0C, // 8 Hz + MINX_INTR_0D = 0x0D, // 2 Hz + MINX_INTR_0E = 0x0E // 1 Hz +}; + +#define MINX_TIMER256INC (16777216/15625) // Aproximate value of 256Hz Timer (256 Hz) + +// Timers counting frequency table +extern const uint32_t MinxTimers_CountFreq[32]; + +int MinxTimers_Create(void); + +void MinxTimers_Destroy(void); + +void MinxTimers_Reset(int hardreset); + +int MinxTimers_LoadState(FILE *fi, uint32_t bsize); + +int MinxTimers_SaveState(FILE *fi); + +void MinxTimers_Sync(void); + +uint8_t MinxTimers_ReadReg(uint8_t reg); + +void MinxTimers_WriteReg(unsigned char reg, unsigned char val); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Multicart.c b/PVPokeMini/PokeMini/pokemini-code/source/Multicart.c new file mode 100644 index 0000000000..ad0224f80b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Multicart.c @@ -0,0 +1,298 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Multicart.h" + +// Multicart Read/Write +TMulticartRead MulticartRead = NULL; +TMulticartWrite MulticartWrite = NULL; + +// Multicart state +int PM_MM_Type = 0; // Multicart Type +int PM_MM_Dirty = 0; // ROM Dirty? +int PM_MM_BusCycle = 0; // Flash cart state +int PM_MM_GetID = 0; // Get ID on next read +int PM_MM_Bypass = 0; // Flash Bypass +int PM_MM_Command = 0; // 0 = None, 1 = Write, 2 = Erase +uint32_t PM_MM_Offset = 0; // ROM Offset in bytes + +// For misc information +uint32_t PM_MM_LastErase_Start = 0; // Last erased start +uint32_t PM_MM_LastErase_End = 0; // Last erased end +uint32_t PM_MM_LastProg = 0; // Last programmed offset + +static int Multicart_AM29LV040B_Sectors[8][2] = { + {0x00000, 0x00000}, + {0x10000, 0x1FFFF}, + {0x20000, 0x2FFFF}, + {0x30000, 0x3FFFF}, + {0x40000, 0x4FFFF}, + {0x50000, 0x5FFFF}, + {0x60000, 0x6FFFF}, + {0x70000, 0x7FFFF} +}; + +// Normal cartridge (Commercial / Prototype Flash Cart) +uint8_t Multicart_T0R(uint32_t addr) +{ + return PM_ROM[addr & PM_ROM_Mask]; +} + +void Multicart_T0W(uint32_t addr, uint8_t data) +{ + // Ignored +} + +// Normal Flash 512KB +uint8_t Multicart_T1R(uint32_t addr) +{ + if (!PM_MM_GetID) return PM_ROM[(addr + PM_MM_Offset) & PM_ROM_Mask]; + PM_MM_GetID = 0; + switch (addr & 3) { + case 0: return 0x01; // Manufacturer ID + case 1: return 0x4F; // Device ID + case 2: return 0x00; // Sector protect + } + return 0xFF; +} + +void Multicart_T1W(uint32_t addr, uint8_t data) +{ + uint32_t faddr = addr & 0x7FF; + int i, secstart, secend; + + // Cartridge + if (faddr == 0x555) { + if (data == 0x90) PM_MM_Offset = 0; + } else if (addr == 0x7FFFF) { + if (CommandLine.multicart) { + PM_MM_Offset = (((data ^ 0x04) & 0x07) << 16) | ((data & 0x38) << 10); + } + } + + // Flash I/O + if (PM_MM_BusCycle == 5) { + PM_MM_BusCycle = 0; + if ((faddr == 0x555) && (data == 0x10)) { + // Chip erase (destroy everything!) + PM_MM_LastErase_Start = 0; + PM_MM_LastErase_End = PM_ROM_Size; + for (i=0; i> 16) & 7][0]; + secend = Multicart_AM29LV040B_Sectors[(addr >> 16) & 7][1]; + PM_MM_LastErase_Start = secstart; + PM_MM_LastErase_End = secend; + for (i=secstart; i<=secend; i++) PM_ROM[i] = 0xFF; + PM_MM_Dirty = 1; + } + } + if (PM_MM_BusCycle == 4) { + if ((faddr == 0x2AA) && (data == 0x55)) PM_MM_BusCycle = 5; + else PM_MM_BusCycle = 0; + } + if (PM_MM_BusCycle == 3) { + PM_MM_BusCycle = 0; + if (PM_MM_Command == 1) { + // Program (Clear bits) + PM_MM_LastProg = (addr + PM_MM_Offset) & PM_ROM_Mask; + PM_ROM[PM_MM_LastProg] &= data; + PM_MM_Dirty = 1; + } + if (PM_MM_Command == 2) { + // Erase + if ((faddr == 0x555) && (data == 0xAA)) PM_MM_BusCycle = 4; + } + } + if (PM_MM_BusCycle == 2) { + PM_MM_BusCycle = 0; + if (faddr == 0x555) { + if (data == 0x90) { + PM_MM_GetID = 1; + } else if (data == 0xA0) { + PM_MM_Command = 1; + PM_MM_BusCycle = 3; + } else if (data == 0x80) { + PM_MM_Command = 2; + PM_MM_BusCycle = 3; + } else if (data == 0x20) { + PM_MM_Bypass = 1; + } + } + } + if (PM_MM_BusCycle == 1) { + if ((faddr == 0x2AA) && (data == 0x55)) PM_MM_BusCycle = 2; + else PM_MM_BusCycle = 0; + } + if (PM_MM_BusCycle == 0) { + if (data == 0xF0) { + PM_MM_GetID = 0; + PM_MM_Bypass = 0; + } else if (PM_MM_Bypass) { + if (data == 0xA0) { + PM_MM_Command = 1; + PM_MM_BusCycle = 3; + } else if (data == 0x20) { + PM_MM_Bypass = 0; + } + } else if ((faddr == 0x555) && (data == 0xAA)) PM_MM_BusCycle = 1; + PM_MM_Command = 0; + } +} + + +// Lupin's Flash 512KB (Scrambled data) +// Data 0 -> Flash Data 7 +// Data 1 -> Flash Data 5 +// Data 2 -> Flash Data 3 +// Data 3 -> Flash Data 1 +// Data 4 -> Flash Data 0 +// Data 5 -> Flash Data 2 +// Data 6 -> Flash Data 4 +// Data 7 -> Flash Data 6 +uint8_t Multicart_T2R(uint32_t addr) +{ + if (!PM_MM_GetID) return PM_ROM[(addr + PM_MM_Offset) & PM_ROM_Mask]; +// Add_InfoMessage("[DEBUG] Getting ID $%06X\n", addr); + switch (addr & 0xFF) { + case 0x00: return 0x80; // Manufacturer ID + case 0x01: return 0xBA; // Device ID + case 0x02: return 0x00; // Sector protect + } + return 0xFF; +} + +void Multicart_T2W(uint32_t addr, uint8_t data) +{ + uint32_t faddr = addr & 0x7FF; + int i, secstart, secend; + + // Cartridge + if (faddr == 0x555) { + if (data == 0x90) PM_MM_Offset = 0; + } else if (addr == 0x7FFFF) { + if (CommandLine.multicart) { + PM_MM_Offset = (((data ^ 0x04) & 0x07) << 16) | ((data & 0x38) << 10); + } + } + +// Add_InfoMessage("[DEBUG] Write $%06X, $%02X\n", addr, data); + + // Flash I/O + if (PM_MM_BusCycle == 5) { + PM_MM_BusCycle = 0; + if ((faddr == 0x555) && (data == 0x01)) { + // Chip erase (destroy everything!) + PM_MM_LastErase_Start = 0; + PM_MM_LastErase_End = PM_ROM_Size; + for (i=0; i> 16) & 7][0]; + secend = Multicart_AM29LV040B_Sectors[(addr >> 16) & 7][1]; + PM_MM_LastErase_Start = secstart; + PM_MM_LastErase_End = secend; + for (i=secstart; i<=secend; i++) PM_ROM[i] = 0xFF; + PM_MM_Dirty = 1; + } + } + if (PM_MM_BusCycle == 4) { + if ((faddr == 0x2AA) && (data == 0x99)) PM_MM_BusCycle = 5; + else PM_MM_BusCycle = 0; + } + if (PM_MM_BusCycle == 3) { + PM_MM_BusCycle = 0; + if (PM_MM_Command == 1) { + // Program (Clear bits) + PM_MM_LastProg = (addr + PM_MM_Offset) & PM_ROM_Mask; + PM_ROM[PM_MM_LastProg] &= data; + PM_MM_Dirty = 1; + } + if (PM_MM_Command == 2) { + // Erase + if ((faddr == 0x555) && (data == 0x66)) PM_MM_BusCycle = 4; + } + } + if (PM_MM_BusCycle == 2) { + PM_MM_BusCycle = 0; + if (faddr == 0x555) { + if (data == 0x41) { + PM_MM_GetID = 1; + } else if (data == 0x44) { + PM_MM_Command = 1; + PM_MM_BusCycle = 3; + } else if (data == 0x40) { + PM_MM_Command = 2; + PM_MM_BusCycle = 3; + } else if (data == 0x04) { + PM_MM_Bypass = 1; + } + } + } + if (PM_MM_BusCycle == 1) { + if ((faddr == 0x2AA) && (data == 0x99)) PM_MM_BusCycle = 2; + else PM_MM_BusCycle = 0; + } + if (PM_MM_BusCycle == 0) { + if (data == 0x55) { + PM_MM_GetID = 0; + PM_MM_Bypass = 0; + } else if (PM_MM_Bypass) { + if (data == 0x44) { + PM_MM_Command = 1; + PM_MM_BusCycle = 3; + } else if (data == 0x04) { + PM_MM_Bypass = 0; + } + } else if ((faddr == 0x555) && (data == 0x66)) PM_MM_BusCycle = 1; + PM_MM_Command = 0; + } + +// Add_InfoMessage("[DEBUG] Bus Cycle %i, Command %i, Offset $%06X\n", PM_MM_BusCycle, PM_MM_Command, PM_MM_Offset); +} + +void NewMulticart(void) +{ + PM_MM_Dirty = 0; +} + +void SetMulticart(int type) +{ + PM_MM_BusCycle = 0; + PM_MM_GetID = 0; + PM_MM_Bypass = 0; + PM_MM_Command = 0; + PM_MM_Offset = 0; + if (type == 2) { + PM_MM_Type = 2; + MulticartRead = Multicart_T2R; + MulticartWrite = Multicart_T2W; + } else if (type == 1) { + PM_MM_Type = 1; + MulticartRead = Multicart_T1R; + MulticartWrite = Multicart_T1W; + } else { + PM_MM_Type = 0; + MulticartRead = Multicart_T0R; + MulticartWrite = Multicart_T0W; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Multicart.h b/PVPokeMini/PokeMini/pokemini-code/source/Multicart.h new file mode 100644 index 0000000000..16d7d94a64 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Multicart.h @@ -0,0 +1,49 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_MULTICART +#define POKEMINI_MULTICART + +#include + +typedef uint8_t (*TMulticartRead)(uint32_t addr); +typedef void (*TMulticartWrite)(uint32_t addr, uint8_t data); + +// Multicart read/write +extern TMulticartRead MulticartRead; +extern TMulticartWrite MulticartWrite; + +// Multicart state +extern int PM_MM_Type; +extern int PM_MM_Dirty; +extern int PM_MM_BusCycle; +extern int PM_MM_GetID; +extern int PM_MM_Bypass; +extern int PM_MM_Command; +extern uint32_t PM_MM_Offset; + +// For misc information +extern uint32_t PM_MM_LastErase_Start; +extern uint32_t PM_MM_LastErase_End; +extern uint32_t PM_MM_LastProg; + +// Set multicart +void NewMulticart(void); +void SetMulticart(int type); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/PMCommon.c b/PVPokeMini/PokeMini/pokemini-code/source/PMCommon.c new file mode 100644 index 0000000000..46cc3be4a0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/PMCommon.c @@ -0,0 +1,517 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PMCommon.h" +#include + +// Return true if the string is valid and non-empty +int StringIsSet(char *str) +{ + if (!str) return 0; + if (strlen(str) == 0) return 0; + return 1; +} + +// Get multiple of 2 +int GetMultiple2(int input) +{ + if (!input) return 0; + input--; + input |= (input >> 1); + input |= (input >> 2); + input |= (input >> 4); + input |= (input >> 8); + input |= (input >> 16); + return input+1; +} + +// Get multiple of 2 (Mask) +int GetMultiple2Mask(int input) +{ + if (input) input--; + input |= (input >> 1); + input |= (input >> 2); + input |= (input >> 4); + input |= (input >> 8); + input |= (input >> 16); + return input; +} + +// Check if file exist +int FileExist(const char *filename) +{ + FILE *fi; + + // Test open file + fi = fopen(filename, "rb"); + if (fi == NULL) return 0; + fclose(fi); + + return 1; +} + +// Get filename +char *GetFilename(const char *filename) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if ((filename[i] == '/') || (filename[i] == '\\')) { + return (char *)&filename[i+1]; + } + } + return (char *)filename; +} + +// Get extension +char *GetExtension(const char *filename) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if (filename[i] == '.') { + return (char *)&filename[i]; + } + if ((filename[i] == '/') || (filename[i] == '\\')) break; + } + return (char *)&filename[strlen(filename)-1]; +} + +// Extract path +char *ExtractPath(char *filename, int slash) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if ((filename[i] == '/') || (filename[i] == '\\')) { + if (slash) filename[i+1] = 0; + else filename[i] = 0; + return filename; + } + } + if (slash && !strlen(filename)) { + filename[0] = '.'; + filename[1] = '/'; + filename[2] = 0; + } + return filename; +} + +// Remove extension +char *RemoveExtension(char *filename) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if (filename[i] == '.') { + filename[i] = 0; + return filename; + } + if ((filename[i] == '/') || (filename[i] == '\\')) { + return filename; + } + } + return filename; +} + +// Check if filename has certain extension +int ExtensionCheck(const char *filename, const char *ext) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if (filename[i] == '.') { + if (strcasecmp(&filename[i], ext) == 0) { + return 1; + } + } + if ((filename[i] == '/') || (filename[i] == '\\')) { + return 0; + } + } + return 0; +} + +// true if the path ends with a slash +int HasLastSlash(char *path) +{ + int len = strlen(path); + if (!len) return 0; + return (path[len-1] == '/') || (path[len-1] == '\\'); +} + +// Convert slashes to windows type +void ConvertSlashes(char *filename, int slashtype) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if ((filename[i] == '/') || (filename[i] == '\\')) { + if (slashtype == 0) filename[i] = PATH_SLASH_CHR; + else if (slashtype == 1) filename[i] = '/'; + else if (slashtype == 2) filename[i] = '\\'; + } + } +} + +// Trim string +char *TrimStr(char *s) +{ + int siz = strlen(s); + char *ptr = s + siz - 1; + if (!siz) return s; + while ((ptr >= s) && (isspace((int)*ptr) || (*ptr == '\n') || (*ptr == '\r'))) --ptr; + ptr[1] = '\0'; + while ((*s != 0) && (isspace((int)*s) || (*s == '\n') || (*s == '\r'))) s++; + return s; +} + +// Remove comments +void RemoveComments(char *s) +{ + while ((*s != 0) && (*s != ';') && (*s != '#')) s++; + *s = 0; +} + +// Up to token... +char *UpToToken(char *out, const char *in, char *tokens, char *tokenfound) +{ + char ch, *ltokens, lch; + if (out) *out = 0; + if (in) { + while ((ch = *in++) != 0) { + ltokens = tokens; + while ((lch = *ltokens++) != 0) { + if (ch == lch) { + if (tokenfound) *tokenfound = lch; + return (char *)in; + } + } + if (out) { + *out++ = ch; + *out = 0; + } + } + } + if (tokenfound) *tokenfound = 0; + return (char *)in; +} + +// Remove characters +void RemoveChars(char *out, const char *in, char *chs) +{ + char ch, *lchs, lch; + if (in) { + while ((ch = *in++) != 0) { + lchs = chs; + while ((lch = *lchs++) != 0) { + if (ch == lch) break; + } + if ((!lch) && (out)) { + *out++ = ch; + } + } + } + if (out) *out = 0; +} + +// Convert string to boolean +int Str2Bool(char *s) +{ + if (!strcasecmp(s, "1")) return 1; + else if (!strcasecmp(s, "y")) return 1; + else if (!strcasecmp(s, "yes")) return 1; + else if (!strcasecmp(s, "t")) return 1; + else if (!strcasecmp(s, "true")) return 1; + else if (!strcasecmp(s, "on")) return 1; + return 0; +} + +// Convert boolean to string +const char *Bool2Str(int i) +{ + return (i ? "true" : "false"); +} + +// Convert boolean to string with an affirmative result +const char *Bool2StrAf(int i) +{ + return (i ? "yes" : "no"); +} + +// Fix symbol identification +void FixSymbolID(char *filename) +{ + int i; + for (i = strlen(filename)-1; i >= 0; i--) { + if (((filename[i] < '0') || (filename[i] > '9')) && + ((filename[i] < 'a') || (filename[i] > 'z')) && + ((filename[i] < 'A') || (filename[i] > 'Z')) && + (filename[i] != '_')) { + filename[i] = '_'; + } + } +} + +// Clear control characters +void ClearCtrlChars(char *s, int len) +{ + if (!len) return; + while (len--) { + if (*s < 32) *s = '.'; + s++; + } +} + +// atoi() that support hex numbers and default on failure +int atoi_Ex(const char *str, int defnum) +{ + int num = defnum; + int res = 0; + int sign = 0; + if (strlen(str) >= 2 && str[0] == '-') { + sign = 1; + str++; + } + if (strlen(str) >= 2 && str[0] == '#') res = sscanf(&str[1], "%x", &num); + else if (strlen(str) >= 2 && str[0] == '$') res = sscanf(&str[1], "%x", &num); + else res = sscanf(str, "%i", &num); + if (res != 1) return defnum; + if (sign) num = -num; + return num; +} + +// atoi() that support hex numbers, return false on failure +int atoi_Ex2(const char *str, int *outnum) +{ + int res = 0; + int sign = 0; + if (strlen(str) >= 2 && str[0] == '-') { + sign = 1; + str++; + } + if (strlen(str) >= 2 && str[0] == '#') res = sscanf(&str[1], "%x", outnum); + else if (strlen(str) >= 2 && str[0] == '$') res = sscanf(&str[1], "%x", outnum); + else res = sscanf(str, "%i", outnum); + if (res == 1 && sign) *outnum = -*outnum; + return res; +} + +// atof() that return float and support default on failure +float atof_Ex(const char *str, float defnum) +{ + float num = defnum; + sscanf(str, "%f", &num); + return num; +} + +// Separate string at character +int SeparateAtChar(char *s, char ch, char **key, char **value) +{ + char *ptr = s; + while ((*ptr != 0) && (*ptr != ch)) ptr++; + if (*ptr == 0) return 0; + *ptr = 0; + *key = s; + *value = ptr+1; + return 1; +} + +// Separate string at any character +static int SeparateAtChars_i(char s, char *chs) +{ + if (s == 0) return 0; + while (*chs != 0) { + if (s == *chs++) return 1; + } + return 0; +} +int SeparateAtChars(char *s, char *chs, char **key, char **value) +{ + char *ptr = s; + while (*ptr != 0) { + if (SeparateAtChars_i(*ptr, chs)) break; + ptr++; + } + if (*ptr == 0) return 0; + *ptr = 0; + if (key) *key = s; + if (value) *value = ptr+1; + return 1; +} + +// Get an argument from executable parameters +int GetArgument(const char *runcmd, int args, char *out, int len, char **runcmd_found) +{ + char lch = ' ', ch; + int argc = 0; + + while ((ch = *runcmd++) != 0) { + if ((ch == ' ') || (ch == '\t') || (ch == '\n') || (ch == '\r')) { + // Ignore spaces / new-lines + if ((lch != ' ') && (lch != '\t') && (lch != '\n') && (lch != '\r')) { + argc++; + if (runcmd_found && (argc == args)) *runcmd_found = (char *)runcmd - 1; + } + } else if (ch == '"') { + // " String + while ((ch = *runcmd++) != 0) { + if (ch == '"') { + break; + } else if (out && (argc == args) && (len > 0)) { + *out++ = ch; + len--; + } + lch = ch; + } + } else if (ch == '\'') { + // ' String + while ((ch = *runcmd++) != 0) { + if (ch == '\'') { + break; + } else if (out && (argc == args) && (len > 0)) { + *out++ = ch; + len--; + } + lch = ch; + } + } else { + // Any other character + if (out && (argc == args) && (len > 0)) { + *out++ = ch; + len--; + } + } + lch = ch; + } + + if ((lch != ' ') && (lch != '\t') && (lch != '\n') && (lch != '\r')) { + argc++; + if (runcmd_found && (argc == args)) *runcmd_found = (char *)runcmd - 1; + } + return argc; +} + +FILE *PokeDebugFOut = NULL; +FILE *PokeDebugFErr = NULL; + +void PokeDPrint(int pokemsg, char *format, ...) +{ + char buffer[PMTMPV]; + va_list args; + va_start(args, format); + vsprintf(buffer, format, args); + switch (pokemsg) { + case POKEMSG_OUT: + if (PokeDebugFOut) fwrite(buffer, 1, strlen(buffer), PokeDebugFOut); + printf("%s", buffer); + break; + case POKEMSG_ERR: + if (PokeDebugFErr) fwrite(buffer, 1, strlen(buffer), PokeDebugFErr); + fprintf(stderr, "%s", buffer); + break; + } + va_end(args); +} + +#ifndef NO_DIRS + +#ifdef _MSC_VER +#include +#else +#include +#endif + +char PokeMini_ExecDir[PMTMPV]; // Executable directory +char PokeMini_CurrDir[PMTMPV]; // Current directory + +// Initialize directories +void PokeMini_InitDirs(char *argv0, char *exec) +{ + // Get current directory + PokeMini_GetCurrentDir(); + + // Get executable directory + if (argv0) { + if ((argv0[0] == '/') || (strchr(argv0, ':') != NULL)) { + // Absolute path + strcpy(PokeMini_ExecDir, argv0); + if (exec) strcpy(exec, PokeMini_ExecDir); + ExtractPath(PokeMini_ExecDir, 1); + } else { + // Not an absolute path + if (HasLastSlash(PokeMini_CurrDir)) sprintf(PokeMini_ExecDir, "%s%s", PokeMini_CurrDir, argv0); + else sprintf(PokeMini_ExecDir, "%s/%s", PokeMini_CurrDir, argv0); + if (exec) strcpy(exec, PokeMini_ExecDir); + ExtractPath(PokeMini_ExecDir, 1); + } + } else { + strcpy(PokeMini_ExecDir, PokeMini_CurrDir); + } + +} + +// Get current directory and save on parameter +void PokeMini_GetCustomDir(char *dir, int max) +{ + if (!getcwd(dir, max)) { + strcpy(dir, "/"); + PokeDPrint(POKEMSG_ERR, "getcwd() error\n"); + } + if (!strlen(dir)) strcpy(dir, "/"); + else ConvertSlashes(dir, PATH_SLASH_UNIX); +} + +// Go to custom directory +void PokeMini_GotoCustomDir(const char *dir) +{ + char buffer[PMTMPV]; + strcpy(buffer, dir); + ConvertSlashes(buffer, PATH_SLASH_OS); + if (chdir(buffer)) { + PokeDPrint(POKEMSG_ERR, "abs chdir('%s') error\n", buffer); + } +} + +// Get current directory +void PokeMini_GetCurrentDir(void) +{ + PokeMini_GetCustomDir(PokeMini_CurrDir, PMTMPV); +} + +// Set current directory +void PokeMini_SetCurrentDir(const char *dir) +{ + PokeMini_GotoCustomDir(dir); + PokeMini_GetCurrentDir(); +} + +// Go to current directory +void PokeMini_GotoCurrentDir(void) +{ + PokeMini_GotoCustomDir(PokeMini_CurrDir); +} + +// Go to launch directory +void PokeMini_GotoExecDir(void) +{ + PokeMini_GotoCustomDir(PokeMini_ExecDir); +} + +#else + +void PokeMini_InitDirs(char *execdir) {} +void PokeMini_GetCurrentDir(void) {} +void PokeMini_GotoCurrentDir(void) {} +void PokeMini_GotoExecDir(void) {} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/PMCommon.h b/PVPokeMini/PokeMini/pokemini-code/source/PMCommon.h new file mode 100644 index 0000000000..024ecae714 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/PMCommon.h @@ -0,0 +1,158 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PMCOMMON_H +#define PMCOMMON_H + +#include +#include +#include +#include +#include + +#ifndef inline +#define inline __inline +#endif + +// Temporary variable length +// Minimum is 128 +// Recommended is 256 +#ifndef PMTMPV +#define PMTMPV 512 +#endif + +#ifdef _WIN32 +#define PATH_SLASH_CHR '\\' +#define PATH_SLASH_STR "\\" +#else +#define PATH_SLASH_CHR '/' +#define PATH_SLASH_STR "/" +#endif + +#define PATH_SLASH_OS 0 +#define PATH_SLASH_UNIX 1 +#define PATH_SLASH_WIN 2 + +// Return a number between min and max +static inline int BetweenNum(int num, int min, int max) +{ + return (num < min) ? min : (num > max) ? max : num; +} + +// Return true if the string is valid and non-empty +int StringIsSet(char *str); + +// Get multiple of 2 +int GetMultiple2(int input); + +// Get multiple of 2 (Mask) +int GetMultiple2Mask(int input); + +// Check if file exist +int FileExist(const char *filename); + +// Get filename +char *GetFilename(const char *filename); + +// Get extension +char *GetExtension(const char *filename); + +// Extract path +char *ExtractPath(char *filename, int slash); + +// Remove extension +char *RemoveExtension(char *filename); + +// Check if filename has certain extension +int ExtensionCheck(const char *filename, const char *ext); + +// true if the path ends with a slash +int HasLastSlash(char *path); + +// Convert slashes to windows type +void ConvertSlashes(char *filename, int slashtype); + +// Trim string +char *TrimStr(char *s); + +// Remove comments +void RemoveComments(char *s); + +// Up to token... +char *UpToToken(char *out, const char *in, char *tokens, char *tokenfound); + +// Remove characters +void RemoveChars(char *out, const char *in, char *chs); + +// Convert string to boolean +int Str2Bool(char *s); + +// Convert boolean to string +const char *Bool2Str(int i); + +// Convert boolean to string with an affirmative result +const char *Bool2StrAf(int i); + +// Fix symbol identification +void FixSymbolID(char *filename); + +// Clear control characters +void ClearCtrlChars(char *s, int len); + +// atoi() that support hex numbers and default on failure +int atoi_Ex(const char *str, int defnum); + +// atoi() that support hex numbers, return false on failure +int atoi_Ex2(const char *str, int *outnum); + +// atof() that return float and support default on failure +float atof_Ex(const char *str, float defnum); + +// Separate string at character +int SeparateAtChar(char *s, char ch, char **key, char **value); + +// Separate string at any character +int SeparateAtChars(char *s, char *chs, char **key, char **value); + +// Get an argument from executable parameters +int GetArgument(const char *runcmd, int args, char *out, int len, char **runcmd_found); + +// Directories +void PokeMini_InitDirs(char *argv0, char *exec); +void PokeMini_GetCustomDir(char *dir, int max); +void PokeMini_SetCurrentDir(const char *dir); +void PokeMini_GotoCustomDir(const char *dir); +void PokeMini_GetCurrentDir(); +void PokeMini_GotoCurrentDir(); +void PokeMini_GotoExecDir(); + +#ifndef NO_DIRS +extern char PokeMini_ExecDir[PMTMPV]; // Launch directory +extern char PokeMini_CurrDir[PMTMPV]; // Current directory +#endif + +// For debugging +enum { + POKEMSG_OUT, + POKEMSG_ERR +}; +extern FILE *PokeDebugFOut; +extern FILE *PokeDebugFErr; +void PokeDPrint(int pokemsg, char *format, ...); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/PokeMini.c b/PVPokeMini/PokeMini/pokemini-code/source/PokeMini.c new file mode 100644 index 0000000000..11810cfd9d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/PokeMini.c @@ -0,0 +1,1195 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Endianess.h" +#include + +// Dependencies +#ifndef NO_ZIP +#include "unzip.h" +#endif + +// Include Free BIOS +#include "freebios.h" +int PokeMini_FreeBIOS = 0; // Using freebios? + +int PokeMini_Flags = 0; // Configuration flags +uint8_t PM_BIOS[4096]; // Pokemon-Mini BIOS ($000000 to $000FFF, 4096) +uint8_t PM_RAM[8192]; // Pokemon-Mini RAM ($001000 to $002100, 4096 + 256) +uint8_t *PM_ROM = NULL; // Pokemon-Mini ROM ($002100 to $1FFFFF, Up to 2MB) +int PM_ROM_Alloc = 0; // Pokemon-Mini ROM Allocated on memory? +int PM_ROM_Size = 0; // Pokemon-Mini ROM Size +int PM_ROM_Mask = 0; // Pokemon-Mini ROM Mask +int PokeMini_LCDMode = 0; // LCD Mode +int PokeMini_ColorFormat = 0; // Color Format (0 = 8x8, 1 = 4x4) +int PokeMini_HostBattStatus = 0;// Host battery status +int PokeMini_RumbleAnim = 0; // Rumble animation + + +int PokeMini_RumbleAmount[4] = { -2, 1, -1, 2 }; +const int PokeMini_RumbleAmountTable[16] = { + 0, 0, 0, 0, + -1, 0, 1, 0, + -1, 1, -1, 1, + -2, 1, -1, 2, +}; + +const uint8_t PM_IO_INIT[256] = { + 0x7F, 0x20, 0x5C, 0xff, 0xff, 0xff, 0xff, 0xff, // $00~$07 System Control + 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, // $08~$0F Second Counter + 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $10~$17 Battery Sensor + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, // $18~$1F Timers Controls + 0x00, 0x30, 0x02, 0x00, 0x02, 0x00, 0x00, 0x40, // $20~$27 IRQ + 0x00, 0xC0, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, // $28~$2F IRQ + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, // $30~$37 Timer 1 + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, // $38~$3F Timer 2 + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // $40~$47 256Hz Counter + ??? + 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, // $48~$4F Timer 3 + 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x01, 0xff, 0xff, // $50~$57 Keypad + ??? + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $58~$5F Unused + 0x32, 0x64, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, // $60~$67 I/O + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $68~$6F Unused + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $70~$77 Audio + ??? + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $78~$7F Unused + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // $80~$87 PRC + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // $88~$8F PRC + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $90~$97 Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $98~$9F Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $A0~$A7 Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $A8~$AF Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $B0~$B7 Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $B8~$BF Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $C0~$C7 Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $C8~$CF Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $D0~$D7 Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $D8~$DF Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $E0~$E7 Unused + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // $E8~$EF Unused + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // $F0~$F7 ??? + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xFF // $F8~$FF LCD I/O +}; + +// Callbacks +void (*PokeMini_OnAllocMIN)(int newsize, int success) = NULL; +void (*PokeMini_OnUnzipError)(const char *zipfile, const char *reason) = NULL; +void (*PokeMini_OnLoadBIOSFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnLoadMINFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnLoadColorFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnLoadEEPROMFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnSaveEEPROMFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnLoadStateFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnSaveStateFile)(const char *filename, int success) = NULL; +void (*PokeMini_OnReset)(int hardreset) = NULL; + +int (*PokeMini_CustomLoadEEPROM)(const char *filename) = NULL; +int (*PokeMini_CustomSaveEEPROM)(const char *filename) = NULL; + +// Number of cycles to process on hardware +int PokeHWCycles = 0; + +// Create emulator and all interfaces +int PokeMini_Create(int flags, int soundfifo) +{ + // Clear BIOS & RAM + memset(PM_BIOS, 0xFF, 4096); + memset(PM_RAM, 0xFF, 8192); // RAM + IO + + // Dummy ROM (In case LoadROM fail) + PM_ROM_Alloc = 0; + PM_ROM_Mask = 0x1FFF; + PM_ROM_Size = 0x2000; + PM_ROM = (unsigned char *)PM_RAM; + + // Clear & Init State + memcpy(PM_IO, PM_IO_INIT, 256); + if (!MinxCPU_Create()) return 0; + if (!MinxTimers_Create()) return 0; + if (!MinxIO_Create()) return 0; + if (!MinxIRQ_Create()) return 0; + if (!MinxPRC_Create()) return 0; + if (!MinxColorPRC_Create()) return 0; + if (!MinxLCD_Create()) return 0; + if (!MinxAudio_Create(soundfifo, soundfifo)) return 0; + + // Initialize variables + PokeMini_Flags = flags; + + // Load FreeBIOS + PokeMini_LoadFreeBIOS(); + +#ifndef PERFORMANCE + // Initialize multicart + NewMulticart(); + SetMulticart(CommandLine.multicart); +#endif + + return 1; +} + +// Destroy emulator and all interfaces +void PokeMini_Destroy() +{ + // Destroy all interfaces + MinxAudio_Destroy(); + MinxLCD_Destroy(); + MinxPRC_Destroy(); + MinxColorPRC_Destroy(); + MinxIRQ_Destroy(); + MinxIO_Destroy(); + MinxTimers_Destroy(); + MinxCPU_Destroy(); + + // Free ROM if was allocated + if (PM_ROM_Alloc) { + free(PM_ROM); + PM_ROM = NULL; + PM_ROM_Alloc = 0; + } + + // Free color info + PokeMini_FreeColorInfo(); +} + +// Apply changes from command lines +void PokeMini_ApplyChanges() +{ + int i; + if (CommandLine.low_battery != 2) MinxIO_BatteryLow(CommandLine.low_battery); + PokeMini_SetLCDMode(CommandLine.lcdmode); + PokeMini_SetVideo(PokeMini_VideoCurrent, PokeMini_VideoDepth, CommandLine.lcdfilter, CommandLine.lcdmode); + MinxAudio_ChangeFilter(CommandLine.piezofilter); + for (i=0; i<4; i++) PokeMini_RumbleAmount[i] = PokeMini_RumbleAmountTable[((CommandLine.rumblelvl & 3) << 2) | i]; +} + +// User press or release a Pokemon-Mini key +void PokeMini_KeypadEvent(uint8_t key, int pressed) +{ + MinxIO_Keypad(key, pressed); +} + +// Low power battery emulation +void PokeMini_LowPower(int enable) +{ + if (CommandLine.low_battery == 2) { + PokeMini_HostBattStatus = enable; + if (PokeMini_BatteryStatus != enable) MinxIO_BatteryLow(enable); + } +} + +// Set LCD mode +void PokeMini_SetLCDMode(int mode) +{ + PokeMini_LCDMode = mode; + MinxPRC_Render = MinxPRC_Render_Mono; + if (mode == LCDMODE_COLORS) { + if (PokeMini_ColorFormat == 1) MinxPRC_Render = MinxPRC_Render_Color4; + else MinxPRC_Render = MinxPRC_Render_Color8; + } +} + +// Generate rumble offset +int PokeMini_GenRumbleOffset(int pitch) +{ + return PokeMini_RumbleAmount[PokeMini_RumbleAnim++ & 3] * pitch; +} + +// Load BIOS from file +int PokeMini_LoadBIOSFile(const char *filename) +{ + FILE *fbios; + int readbytes; + + // Open file + fbios = fopen(filename, "rb"); + if (fbios == NULL) { + if (PokeMini_OnLoadBIOSFile) PokeMini_OnLoadBIOSFile(filename, -1); + return 0; + } + + // Read content + readbytes = fread(PM_BIOS, 1, 4096, fbios); + PokeMini_FreeBIOS = 0; + + // Close file + fclose(fbios); + + // Callback + if (PokeMini_OnLoadBIOSFile) PokeMini_OnLoadBIOSFile(filename, (readbytes == 4096) ? 1 : 0); + + return (readbytes == 4096); +} + +// Save BIOS from file +int PokeMini_SaveBIOSFile(const char *filename) +{ + FILE *fbios; + int writebytes; + + // Open file + fbios = fopen(filename, "wb"); + if (fbios == NULL) { + return 0; + } + + // Read content + writebytes = fwrite(PM_BIOS, 1, 4096, fbios); + + // Close file + fclose(fbios); + + return (writebytes == 4096); +} + +// Load FreeBIOS +int PokeMini_LoadFreeBIOS() +{ + PokeMini_FreeBIOS = 1; + memcpy(PM_BIOS, FreeBIOS, 4096); + return 1; +} + +// New MIN ROM +int PokeMini_NewMIN(uint32_t size) +{ + // Allocate ROM and set cartridge size + if (PM_ROM_Alloc) { + free(PM_ROM); + PM_ROM = NULL; + PM_ROM_Alloc = 0; + } + PM_ROM_Mask = GetMultiple2Mask(size); + PM_ROM_Size = PM_ROM_Mask + 1; + PM_ROM = (uint8_t *)malloc(PM_ROM_Size); + if (!PM_ROM) { + if (PokeMini_OnAllocMIN) PokeMini_OnAllocMIN(PM_ROM_Size, 0); + return 0; + } + memset(PM_ROM, 0xFF, PM_ROM_Size); + PM_ROM_Alloc = 1; + + if (PokeMini_OnAllocMIN) PokeMini_OnAllocMIN(PM_ROM_Size, 1); + return 1; +} + +// Load MIN ROM +int PokeMini_LoadMINFile(const char *filename) +{ + FILE *fi; + int size, readbytes; + + // Open file + fi = fopen(filename, "rb"); + if (fi == NULL) { + if (PokeMini_OnLoadMINFile) PokeMini_OnLoadMINFile(filename, -1); + return 0; + } + + // Check filesize + fseek(fi, 0, SEEK_END); + size = ftell(fi); + + // Check if size is valid + if ((size <= 0x2100) || (size > 0x200000)) { + fclose(fi); + if (PokeMini_OnLoadMINFile) PokeMini_OnLoadMINFile(filename, -2); + return 0; + } + + // Free existing color information + PokeMini_FreeColorInfo(); + + // Allocate ROM and set cartridge size + if (!PokeMini_NewMIN(size)) { + fclose(fi); + return 0; + } + + // Read content + fseek(fi, 0, SEEK_SET); + readbytes = fread(PM_ROM, 1, size, fi); + fclose(fi); + + // Callback + if (PokeMini_OnLoadMINFile) PokeMini_OnLoadMINFile(filename, (readbytes == size) ? 1 : 0); + NewMulticart(); + + return (readbytes == size); +} + +// Save MIN ROM +int PokeMini_SaveMINFile(const char *filename) +{ + FILE *fi; + int writebytes; + + // Open file + fi = fopen(filename, "wb"); + if (fi == NULL) { + return 0; + } + + // Write content + writebytes = fwrite(PM_ROM, 1, PM_ROM_Size, fi); + fclose(fi); + + return (writebytes == PM_ROM_Size); +} + +// Set MIN from memory +int PokeMini_SetMINMem(uint8_t *mem, int size) +{ + if (PM_ROM_Alloc) { free(PM_ROM); PM_ROM = NULL; PM_ROM_Alloc = 0; } + PM_ROM_Mask = GetMultiple2Mask(size); + PM_ROM_Size = PM_ROM_Mask + 1; + PM_ROM = mem; + PM_ROM_Alloc = 0; + NewMulticart(); + return 1; +} + +// Free color information +void PokeMini_FreeColorInfo() +{ + if (PRCColorMap) { + free(PRCColorMap); + PRCColorMap = NULL; + } +} + +// Syncronize host time +int PokeMini_SyncHostTime() +{ +#ifndef NO_RTC + // Modify EEPROM for host time + if (CommandLine.updatertc == 2) { + time_t tim = time(NULL); + struct tm *now = localtime(&tim); + MinxIO_SetTimeStamp(now->tm_year % 100, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); + PMR_SEC_CTRL = 0x01; + MinxTimers.SecTimerCnt = 0; + return 1; + } +#endif + return 0; +} + +#define DATAREADFROMFILE(var, size) {\ + if (stream(var, size, stream_ptr) != size) {\ + return 0;\ + }\ +} + +const uint8_t RemapMINC10_11[16] = { + 0, 1, 2, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 +}; + +// Load color information from stream, note that PokeMini_OnLoadColorFile callback isn't called! +int PokeMini_LoadColorStream(TPokeMini_StreamIO stream, void *stream_ptr) +{ + uint8_t hdr[4], vcod[4], reserved[16]; + uint32_t maptiles, mapoffset, bytespertile; + int i, readbytes; + + // Check header + DATAREADFROMFILE(hdr, 4); // ID + if ((hdr[0] != 'M') || (hdr[1] != 'I') || (hdr[2] != 'N') || (hdr[3] != 'c')) return 0; + DATAREADFROMFILE(vcod, 4); // VCode + if (vcod[0] != 0x01) return 0; // Only version 1 supported + if (vcod[1] > 0x01) return 0; // Only color type 0 and 1 are valid + PRCColorFlags = vcod[2]; + PokeMini_ColorFormat = vcod[1]; + DATAREADFROMFILE(&maptiles, 4); // Number of map tiles + maptiles = Endian32(maptiles); + DATAREADFROMFILE(&mapoffset, 4); // Map offset in tiles + mapoffset = Endian32(mapoffset); + DATAREADFROMFILE(reserved, 16); // Reserved area + + // PM ROM Max is 2MB, that's 256K Map Tiles + if (maptiles > 262144) return 0; + if (mapoffset > 262144) return 0; + + if (PokeMini_ColorFormat == 1) bytespertile = 8; + else bytespertile = 2; + + // Free existing color information + PokeMini_FreeColorInfo(); + PRCColorOffset = 0; + PRCColorTop = (uint8_t *)0; + + // Create and load map + PRCColorMap = (uint8_t *)malloc(maptiles * bytespertile); + for (i=0; i 0); +} + +// Internal: Stream from file +int PokeMini_StreamFromFile(void *data, int size, void *ptr) +{ + return fread(data, 1, size, (FILE *)ptr); +} + +// Load color information from file, MIN must be loaded first +int PokeMini_LoadColorFile(const char *filename) +{ + FILE *fi; + int res; + + // Open file + fi = fopen(filename, "rb"); + if (fi == NULL) return 0; // Silently exit + + // Read color information + res = PokeMini_LoadColorStream(PokeMini_StreamFromFile, (void *)fi); + + // Done + fclose(fi); + + // Callback + if (PokeMini_OnLoadColorFile) PokeMini_OnLoadColorFile(filename, res); + + return res; +} + +// Load EEPROM +int PokeMini_LoadEEPROMFile(const char *filename) +{ + FILE *fi; + int readbytes, success; + + // Custom EEPROM load + if (PokeMini_CustomLoadEEPROM) { + success = PokeMini_CustomLoadEEPROM(filename); + PokeMini_OnLoadEEPROMFile(filename, success); + return success; + } + + // Open file + fi = fopen(filename, "rb"); + if (fi == NULL) { + if (PokeMini_OnLoadEEPROMFile) PokeMini_OnLoadEEPROMFile(filename, -1); + return 0; + } + + // Read content + readbytes = fread(EEPROM, 1, 8192, fi); + fclose(fi); + + // Callback + if (PokeMini_OnLoadEEPROMFile) PokeMini_OnLoadEEPROMFile(filename, (readbytes == 8192) ? 1 : 0); + + return (readbytes == 8192); +} + +// Save EEPROM +int PokeMini_SaveEEPROMFile(const char *filename) +{ + FILE *fo; + int writebytes, success; + + // Custom EEPROM save + if (PokeMini_CustomSaveEEPROM) { + success = PokeMini_CustomSaveEEPROM(filename); + PokeMini_OnSaveEEPROMFile(filename, success); + return success; + } + + // Open file + fo = fopen(filename, "wb"); + if (fo == NULL) { + if (PokeMini_OnSaveEEPROMFile) PokeMini_OnSaveEEPROMFile(filename, -1); + return 0; + } + + // Read content + writebytes = fwrite(EEPROM, 1, 8192, fo); + fclose(fo); + + // Callback + if (PokeMini_OnSaveEEPROMFile) PokeMini_OnSaveEEPROMFile(filename, (writebytes == 8192) ? 1 : 0); + + return (writebytes == 8192); +} + +// Check emulator state +int PokeMini_CheckSSFile(const char *statefile, char *romfile) +{ + FILE *fi; + int readbytes; + char PMiniStr[128]; + uint32_t PMiniID; + + // Open file + fi = fopen(statefile, "rb"); + if (fi == NULL) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -1); + return 0; + } + + // Read content + PMiniStr[12] = 0; + readbytes = fread(PMiniStr, 1, 12, fi); // Read File ID + if ((readbytes != 12) || strcmp(PMiniStr, "PokeMiniStat")) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -2); + return 0; + } + readbytes = fread(&PMiniID, 1, 4, fi); // Read State ID + if ((readbytes != 4) || (PMiniID != PokeMini_ID)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -3); + return 0; + } + readbytes = fread(PMiniStr, 1, 128, fi); // Read ROM related to state + if (readbytes != 128) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -4); + return 0; + } + PMiniStr[127] = 0; + if (romfile) strcpy(romfile, PMiniStr); + fclose(fi); + + return 1; +} + +// Load emulator state +int PokeMini_LoadSSFile(const char *statefile) +{ + FILE *fi; + int readbytes; + char PMiniStr[128]; + uint32_t PMiniID, StatTime, BSize; + + // Open file + fi = fopen(statefile, "rb"); + if (fi == NULL) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -1); + return 0; + } + + // Read content + PMiniStr[12] = 0; + readbytes = fread(PMiniStr, 1, 12, fi); // Read File ID + if ((readbytes != 12) || strcmp(PMiniStr, "PokeMiniStat")) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -2); + return 0; + } + readbytes = fread(&PMiniID, 1, 4, fi); // Read State ID + PMiniID = Endian32(PMiniID); + if ((readbytes != 4) || (PMiniID != PokeMini_ID)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -3); + return 0; + } + readbytes = fread(PMiniStr, 1, 128, fi); // Read ROM related to state (discarded) + if (readbytes != 128) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -4); + return 0; + } + readbytes = fread(&StatTime, 1, 4, fi); // Read Time + StatTime = Endian32(StatTime); + if (readbytes != 4) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -4); + return 0; + } + + // Read State Structure + PMiniStr[4] = 0; + while (!feof(fi)) { + readbytes = fread(PMiniStr, 1, 4, fi); + if (readbytes != 4) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + readbytes = fread(&BSize, 1, 4, fi); + BSize = Endian32(BSize); + if (readbytes != 4) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + if (!strcmp(PMiniStr, "RAM-")) { // RAM + readbytes = fread(PM_RAM, 1, 0x1000, fi); + if ((BSize != 0x1000) || (readbytes != 0x1000)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "REG-")) { // Register I/O + readbytes = fread(PM_IO, 1, 256, fi); + if ((BSize != 256) || (readbytes != 256)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "CPU-")) { // CPU + if (!MinxCPU_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "IRQ-")) { // IRQ + if (!MinxIRQ_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "TMR-")) { // Timers + if (!MinxTimers_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "PIO-")) { // Parallel IO + if (!MinxIO_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "PRC-")) { // PRC + if (!MinxPRC_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "CPM-")) { // Color PRC + if (!MinxColorPRC_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "LCD-")) { // LCD + if (!MinxLCD_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "LCD-")) { // Audio + if (!MinxAudio_LoadState(fi, BSize)) { + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, -5); + return 0; + } + } else if (!strcmp(PMiniStr, "END-")) { + break; + } + } + fclose(fi); + + // Update RTC if requested + if (CommandLine.updatertc == 1) { + MinxTimers.SecTimerCnt += (uint32_t)time(NULL) - StatTime; + } + + // Syncronize with host time + PokeMini_SyncHostTime(); + + // Callback + if (PokeMini_OnLoadStateFile) PokeMini_OnLoadStateFile(statefile, 1); + return 1; +} + +// Save emulator state +int PokeMini_SaveSSFile(const char *statefile, const char *romfile) +{ + FILE *fo; + char PMiniStr[256]; + uint32_t PMiniID, StatTime, BSize; + + // Open file + fo = fopen(statefile, "wb"); + if (fo == NULL) { + if (PokeMini_OnSaveStateFile) PokeMini_OnSaveStateFile(statefile, -1); + return 0; + } + + // Write content + fwrite((void *)"PokeMiniStat", 1, 12, fo); // Write File ID + PMiniID = PokeMini_ID; + fwrite(&PMiniID, 1, 4, fo); // Write State ID + memset(PMiniStr, 0, 128); + strcpy(PMiniStr, romfile); + fwrite(PMiniStr, 1, 128, fo); // Write ROM related to state + StatTime = Endian32((uint32_t)time(NULL)); + fwrite(&StatTime, 1, 4, fo); // Write Time + + // Read State Structure + // - RAM + fwrite((void *)"RAM-", 1, 4, fo); + BSize = Endian32(0x1000); + fwrite(&BSize, 1, 4, fo); + fwrite(PM_RAM, 1, 0x1000, fo); + // - Registers I/O + fwrite((void *)"REG-", 1, 4, fo); + BSize = Endian32(256); + fwrite(&BSize, 1, 4, fo); + fwrite(PM_IO, 1, 256, fo); + // - CPU Interface + fwrite((void *)"CPU-", 1, 4, fo); + MinxCPU_SaveState(fo); + // - IRQ Interface + fwrite((void *)"IRQ-", 1, 4, fo); + MinxIRQ_SaveState(fo); + // - Timers Interface + fwrite((void *)"TMR-", 1, 4, fo); + MinxTimers_SaveState(fo); + // - Parallel IO Interface + fwrite((void *)"PIO-", 1, 4, fo); + MinxIO_SaveState(fo); + // - PRC Interface + fwrite((void *)"PRC-", 1, 4, fo); + MinxPRC_SaveState(fo); + // - Color PRC Interface + fwrite((void *)"CPM-", 1, 4, fo); + MinxColorPRC_SaveState(fo); + // - LCD Interface + fwrite((void *)"LCD-", 1, 4, fo); + MinxLCD_SaveState(fo); + // - Audio Interface + fwrite((void *)"AUD-", 1, 4, fo); + MinxAudio_SaveState(fo); + // - EOF + fwrite((void *)"END-", 1, 4, fo); + BSize = Endian32(0); + fwrite(&BSize, 1, 4, fo); + fclose(fo); + + // Callback + if (PokeMini_OnSaveStateFile) PokeMini_OnSaveStateFile(statefile, 1); + + return 1; +} + +#ifndef NO_ZIP +// Internal: Stream from ZIP +static int PokeMini_StreamFromZIP(void *data, int size, void *ptr) +{ + return unzReadCurrentFile((unzFile)ptr, data, size); +} + +// Load compressed MIN ROM +static int PokeMini_iLoadROMZip(const char *zipfile, int *colorloaded) +{ + unzFile uf = NULL; + unz_global_info64 gi; + unz_file_info64 file_inf; + char filein[PMTMPV]; + void *new_data; + int i, size, loaded = 0, cloaded = 0; + + if (colorloaded) *colorloaded = 0; + + // Open ZIP + uf = unzOpen(zipfile); + if (!uf) { + if (PokeMini_OnUnzipError) PokeMini_OnUnzipError(zipfile, "Opening ZIP error"); + return 0; + } + if (unzGetGlobalInfo64(uf, &gi) != UNZ_OK) { + if (PokeMini_OnUnzipError) PokeMini_OnUnzipError(zipfile, "Getting global info"); + unzClose(uf); + return 0; + } + + // Find and load MIN + for (i=0; i. +*/ + +#ifndef POKEMINI_EMU +#define POKEMINI_EMU + +#include +#include + +// Common functions +#include "PMCommon.h" +#include "Endianess.h" + +// Version control +#include "PokeMini_Version.h" + +// Configuration Flags +// No sound support +#define POKEMINI_NOSOUND 0x01 +// Generated sound only +#define POKEMINI_GENSOUND 0x02 +// Auto battery support +#define POKEMINI_AUTOBATT 0x04 + +// Default cycles per frame +#define POKEMINI_FRAME_CYC 55634 + +extern int PokeMini_FreeBIOS; // Using freebios? +extern int PokeMini_Flags; // Configuration flags +extern int PokeMini_Rumbling; // Pokemon-Mini is rumbling +extern uint8_t PM_BIOS[]; // Pokemon-Mini BIOS ($000000 to $000FFF, 4096) +extern uint8_t PM_RAM[]; // Pokemon-Mini RAM ($001000 to $002100, 4096 + 256) +extern uint8_t *PM_ROM; // Pokemon-Mini ROM ($002100 to $1FFFFF, Up to 2MB) +extern int PM_ROM_Alloc; // Pokemon-Mini ROM Allocated on memory? +extern int PM_ROM_Size; // Pokemon-Mini ROM Size +extern int PM_ROM_Mask; // Pokemon-Mini ROM Mask +extern int PokeMini_LCDMode; // LCD Mode +extern int PokeMini_ColorFormat; // Color Format (0 = 8x8, 1 = 4x4) +extern int PokeMini_HostBattStatus; // Host battery status + +// Number of cycles to process on hardware +extern int PokeHWCycles; + +enum { + LCDMODE_ANALOG = 0, + LCDMODE_3SHADES, + LCDMODE_2SHADES, + LCDMODE_COLORS +}; + +// Include Interfaces +#include "IOMap.h" +#include "Video.h" +#include "MinxCPU.h" +#include "MinxTimers.h" +#include "MinxIO.h" +#include "MinxIRQ.h" +#include "MinxPRC.h" +#include "MinxColorPRC.h" +#include "MinxLCD.h" +#include "MinxAudio.h" +#include "CommandLine.h" +#include "Multicart.h" +#include "UI.h" + +// Callbacks +extern void (*PokeMini_OnAllocMIN)(int newsize, int success); +extern void (*PokeMini_OnUnzipError)(const char *zipfile, const char *reason); +extern void (*PokeMini_OnLoadBIOSFile)(const char *filename, int success); +extern void (*PokeMini_OnLoadMINFile)(const char *filename, int success); +extern void (*PokeMini_OnLoadColorFile)(const char *filename, int success); +extern void (*PokeMini_OnLoadEEPROMFile)(const char *filename, int success); +extern void (*PokeMini_OnSaveEEPROMFile)(const char *filename, int success); +extern void (*PokeMini_OnLoadStateFile)(const char *filename, int success); +extern void (*PokeMini_OnSaveStateFile)(const char *filename, int success); +extern void (*PokeMini_OnReset)(int hardreset); + +extern int (*PokeMini_CustomLoadEEPROM)(const char *filename); +extern int (*PokeMini_CustomSaveEEPROM)(const char *filename); + +// PRC Read/Write +#ifdef PERFORMANCE + +static inline uint8_t MinxPRC_OnRead(int cpu, uint32_t addr) +{ + if (addr >= 0x2100) { + // ROM Read + if (PM_ROM) return PM_ROM[addr & PM_ROM_Mask]; + } else if (addr >= 0x2000) { + // I/O Read (Unused) + return 0xFF; + } else if (addr >= 0x1000) { + // RAM Read + return PM_RAM[addr-0x1000]; + } else { + // BIOS Read + return PM_BIOS[addr]; + } + return 0xFF; +} + +static inline void MinxPRC_OnWrite(int cpu, uint32_t addr, uint8_t data) +{ + if ((addr >= 0x1000) && (addr < 0x2000)) { + // RAM Write + PM_RAM[addr-0x1000] = data; + } +} + +#else + +#include "Multicart.h" + +#define MinxPRC_OnRead MinxCPU_OnRead +#define MinxPRC_OnWrite MinxCPU_OnWrite + +#endif + +// LCD Framebuffer +#define MinxPRC_LCDfb PM_RAM + +// Load state safe variables +#define POKELOADSS_START(size)\ + uint32_t rsize = 0;\ + uint32_t tmp32;\ + uint16_t tmp16;\ + if (size != bsize) return 0;\ + { tmp32 = 0; tmp16 = 0; } + +#define POKELOADSS_32(var) {\ + rsize += (uint32_t)fread((void *)&tmp32, 1, 4, fi);\ + var = Endian32(tmp32);\ +} + +#define POKELOADSS_16(var) {\ + rsize += (uint32_t)fread((void *)&tmp16, 1, 2, fi);\ + var = Endian16(tmp16);\ +} + +#define POKELOADSS_8(var) {\ + rsize += (uint32_t)fread((void *)&var, 1, 1, fi);\ +} + +#define POKELOADSS_A(array, size) {\ + rsize += (uint32_t)fread((void *)array, 1, size, fi);\ +} + +#define POKELOADSS_X(size) {\ + rsize += fseek(fi, size, SEEK_CUR) ? 0 : size;\ +} + +#define POKELOADSS_END(size) {\ + tmp32 = 0; tmp16 = 0;\ + return (rsize == size) + tmp32 + (uint32_t)tmp16;\ +} + +// Save state safe variables +#define POKESAVESS_START(size)\ + uint32_t wsize = 0;\ + uint32_t tmp32 = Endian32(size);\ + uint16_t tmp16;\ + if (fwrite((void *)&tmp32, 1, 4, fi) != 4) return 0;\ + { tmp32 = 0; tmp16 = 0; } + +#define POKESAVESS_32(var) {\ + tmp32 = Endian32((uint32_t)var);\ + wsize += (uint32_t)fwrite((void *)&tmp32, 1, 4, fi);\ +} + +#define POKESAVESS_16(var) {\ + tmp16 = Endian16((uint16_t)var);\ + wsize += (uint32_t)fwrite((void *)&tmp16, 1, 2, fi);\ +} + +#define POKESAVESS_8(var) {\ + wsize += (uint32_t)fwrite((void *)&var, 1, 1, fi);\ +} + +#define POKESAVESS_A(array, size) {\ + wsize += (uint32_t)fwrite((void *)array, 1, size, fi);\ +} + +#define POKESAVESS_X(size) {\ + tmp16 = 0;\ + for (tmp32=0; tmp32<(uint32_t)size; tmp32++) {\ + wsize += (uint32_t)fwrite((void *)&tmp16, 1, 1, fi);\ + }\ +} + +#define POKESAVESS_END(size) {\ + tmp32 = 0; tmp16 = 0;\ + return (wsize == size) + tmp32 + (uint32_t)tmp16;\ +} + +// Stream I/O +typedef int TPokeMini_StreamIO(void *data, int size, void *ptr); + +// Create emulator and all interfaces +int PokeMini_Create(int flags, int soundfifo); + +// Destroy emulator and all interfaces +void PokeMini_Destroy(); + +// Apply changes from command lines +void PokeMini_ApplyChanges(); + +// User press or release a Pokemon-Mini key +void PokeMini_KeypadEvent(uint8_t key, int pressed); + +// Low power battery emulation +void PokeMini_LowPower(int enable); + +// Set LCD mode +void PokeMini_SetLCDMode(int mode); + +// Generate rumble offset +int PokeMini_GenRumbleOffset(int pitch); + +// Load BIOS file +int PokeMini_LoadBIOSFile(const char *filename); + +// Save BIOS file +int PokeMini_SaveBIOSFile(const char *filename); + +// Load FreeBIOS +int PokeMini_LoadFreeBIOS(); + +// Check if file exist +int PokeMini_FileExist(const char *filename); + +// New MIN ROM +int PokeMini_NewMIN(uint32_t size); + +// Load MIN ROM +int PokeMini_LoadMINFile(const char *filename); + +// Save MIN ROM +int PokeMini_SaveMINFile(const char *filename); + +// Load color information from file, MIN must be loaded first +int PokeMini_LoadColorFile(const char *filename); + +// Set MIN from memory +int PokeMini_SetMINMem(uint8_t *mem, int size); + +// Syncronize host time +int PokeMini_SyncHostTime(); + +// Load EEPROM data +int PokeMini_LoadEEPROMFile(const char *filename); + +// Save EEPROM data +int PokeMini_SaveEEPROMFile(const char *filename); + +// Check emulator state, output romfile from assigned ROM in state +int PokeMini_CheckSSFile(const char *statefile, char *romfile); + +// Load emulator state +int PokeMini_LoadSSFile(const char *statefile); + +// Save emulator state +int PokeMini_SaveSSFile(const char *statefile, const char *romfile); + +// Load MIN ROM (and others) +int PokeMini_LoadROM(const char *filename); + +// Load all files from command-line, return false if require menu +int PokeMini_LoadFromCommandLines(const char *nobios, const char *noeeprom); + +// Save all files from command-line +void PokeMini_SaveFromCommandLines(int exitemulator); + +// Use default callbacks messages +void PokeMini_UseDefaultCallbacks(); + +// Reset CPU +void PokeMini_Reset(int hardreset); + +// Internals, do not call directly! +void PokeMini_FreeColorInfo(); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/PokeMini_Version.h b/PVPokeMini/PokeMini/pokemini-code/source/PokeMini_Version.h new file mode 100644 index 0000000000..097fde8365 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/PokeMini_Version.h @@ -0,0 +1,36 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PokeMini_Version + +// Version in normal format +#define PokeMini_Version "0.60" + +// Version in short format (5 chars max!) +#define PokeMini_VerShort "0.60" + +// Savestate file ID +// Change only if savestate structure file changes! +#define PokeMini_ID 0x006B4D50 + +// For windows resource file +#define RES_VERSION 0,6,0,0 +#define RES_VERSION_STR "0.60" +#define RES_COPYRIGHT "Copyright by JustBurn 2003-2015" + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/UI.c b/PVPokeMini/PokeMini/pokemini-code/source/UI.c new file mode 100644 index 0000000000..669f5d02cb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/UI.c @@ -0,0 +1,1502 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include + +#ifndef NO_SCANDIRS +#include +#include +#include +#endif + +#include "PokeMini.h" +#include "Video.h" +#include "UI.h" +#include "CommandLine.h" +#include "PokeMini_Font12.h" +#include "PokeMini_Icons12.h" + +int UI_FirstLoad = 1; +int UI_Enabled = 0; +int UI_Status = UI_STATUS_GAME; +int UI_PreviewDist = 12; +uint32_t *UI_Font1_Pal32 = NULL; +uint16_t *UI_Font1_Pal16 = NULL; +uint32_t *UI_Font2_Pal32 = NULL; +uint16_t *UI_Font2_Pal16 = NULL; +uint32_t *UI_Icons_Pal32 = NULL; +uint16_t *UI_Icons_Pal16 = NULL; + +#define UIMenu_FilesLines (UIMenu_Lines-1) + +void UIDraw_BG_32(uint32_t *screen, int pitchW, const uint8_t *image, const uint32_t *palette, int width, int height) +{ + int x, y; + for (y=0; y> 4]; + screen[x+1] = palette[*image++ & 15]; + } + screen += pitchW; + } +} + +void UIDraw_BG_16(uint16_t *screen, int pitchW, const uint8_t *image, const uint16_t *palette, int width, int height) +{ + int x, y; + for (y=0; y> 4]; + screen[x+1] = palette[*image++ & 15]; + } + screen += pitchW; + } +} + +void UIDraw_Char_32(uint32_t *screen, int pitchW, int x, int y, uint8_t ch, const uint32_t *palette) +{ + int xc, yc; + uint8_t *chr; + ch -= 0x20; + if (ch >= 0x80) return; + chr = (uint8_t *)&PokeMini_Font12[(ch >> 4) * 96*12 + (ch & 15) * 6]; + screen += (y * pitchW) + x; + for (yc=0; yc<12; yc++) { + for (xc=0; xc<12; xc+=2) { + if (*chr >> 4) screen[xc] = palette[*chr >> 4]; + if (*chr & 15) screen[xc+1] = palette[*chr & 15]; + chr++; + } + chr += 96-6; + screen += pitchW; + } +} + +void UIDraw_Char_16(uint16_t *screen, int pitchW, int x, int y, uint8_t ch, const uint16_t *palette) +{ + int xc, yc; + uint8_t *chr; + ch -= 0x20; + if (ch >= 0x80) return; + chr = (uint8_t *)&PokeMini_Font12[(ch >> 4) * 96*12 + (ch & 15) * 6]; + screen += (y * pitchW) + x; + for (yc=0; yc<12; yc++) { + for (xc=0; xc<12; xc+=2) { + if (*chr >> 4) screen[xc] = palette[*chr >> 4]; + if (*chr & 15) screen[xc+1] = palette[*chr & 15]; + chr++; + } + chr += 96-6; + screen += pitchW; + } +} + +void UIDraw_String_32(uint32_t *screen, int pitchW, int x, int y, int padd, char *str, const uint32_t *palette) +{ + int len = strlen(str); + for (;len;len--) { + UIDraw_Char_32(screen, pitchW, x, y, *str++, palette); + x += padd; + } +} + +void UIDraw_String_16(uint16_t *screen, int pitchW, int x, int y, int padd, char *str, const uint16_t *palette) +{ + int len = strlen(str); + for (;len;len--) { + UIDraw_Char_16(screen, pitchW, x, y, *str++, palette); + x += padd; + } +} + +void UIDraw_Icon_32(uint32_t *screen, int pitchW, int x, int y, uint8_t ch) +{ + int xc, yc; + uint8_t *chr; + if (ch >= 0x10) return; + chr = (uint8_t *)&PokeMini_Icons12[(ch >> 4) * 96*12 + (ch & 15) * 6]; + screen += (y * pitchW) + x; + for (yc=0; yc<12; yc++) { + for (xc=0; xc<12; xc+=2) { + if (*chr >> 4) screen[xc] = UI_Icons_Pal32[*chr >> 4]; + if (*chr & 15) screen[xc+1] = UI_Icons_Pal32[*chr & 15]; + chr++; + } + chr += 96-6; + screen += pitchW; + } +} + +void UIDraw_Icon_16(uint16_t *screen, int pitchW, int x, int y, uint8_t ch) +{ + int xc, yc; + uint8_t *chr; + if (ch >= 0x10) return; + chr = (uint8_t *)&PokeMini_Icons12[(ch >> 4) * 96*12 + (ch & 15) * 6]; + screen += (y * pitchW) + x; + for (yc=0; yc<12; yc++) { + for (xc=0; xc<12; xc+=2) { + if (*chr >> 4) screen[xc] = UI_Icons_Pal16[*chr >> 4]; + if (*chr & 15) screen[xc+1] = UI_Icons_Pal16[*chr & 15]; + chr++; + } + chr += 96-6; + screen += pitchW; + } +} + +void UIText_Scroll(char *txtout, char *txtin, int maxchars, int anim) +{ + int outsidechars = strlen(txtin) - maxchars; + if (outsidechars <= 0) { + // Fit + strcpy(txtout, txtin); + } else { + // Doesn't fit, scroll it + anim %= outsidechars + 16; + if (anim < 8) anim = 8; + if (anim > (outsidechars+8)) anim = outsidechars+8; + strncpy(txtout, txtin + anim - 8, maxchars); + txtout[maxchars] = 0; + } +} + +int UIMenu_Width = 0; // Menu width +int UIMenu_Height = 0; // Menu height +int UIMenu_PixelLayout = 0; // Menu pixel layout +int UIMenu_Lines = 0; // Menu visible lines + +uint8_t *UIMenu_BGImage = NULL; +uint32_t *UIMenu_BGPal32 = NULL; +uint16_t *UIMenu_BGPal16 = NULL; + +int UIMenu_Page = 0; // Mode +int UIMenu_MMax = 0; // Menu max lines +int UIMenu_MOff = 0; // Menu offset +int UIMenu_Cur = 0; // Cursor offset +int UIMenu_Ani = 0; // For animation effect +int UIMenu_InKey = 0; // Key input +int UIMenu_CKeyMod = 0; // C Key modifier +int UIMenu_HardReset = 0; // Hard reset +int UIMenu_Savestate = 0; // Savestate offset + +int UIMenu_CurrentItemsNum = 0; // Number of current items +TUIMenu_Item *UIMenu_CurrentItems = NULL; // Current items list +TUIMenu_FileListCache *UIMenu_FileListCache = NULL; // Files list cache +int UIMenu_ListOffs = 0; // Offset on list cache +int UIMenu_ListFiles = 0; // Number of files in files list cache + +#define UIMenu_MsgCountReset1 200 +#define UIMenu_MsgCountReset2 80 +int UIMenu_MsgOffset = 0; // Message line offset (if lines exceed the screen) +int UIMenu_MsgCountDw = 0; // Message count down (to move the offset) +int UIMenu_MsgTimer = 0; // Message timer (to close the message) +int UIMenu_MsgLines = 0; // Message lines (total number of lines) + +static TUIRealtimeCB UIRealtimeCB = NULL; + +enum { + UIPAGE_MENUITEMS, + UIPAGE_LOADROM, + UIPAGE_MESSAGE, + UIPAGE_REALTIMETEXT +}; + +int UIItems_MainMenuC(int index, int reason); +TUIMenu_Item UIItems_MainMenu[] = { + { 0, 0, "Resume...", UIItems_MainMenuC }, +#ifndef NO_SCANDIRS + { 0, 1, "Load ROM...", UIItems_MainMenuC }, +#endif + { 0, 2, "Load State <0>", UIItems_MainMenuC }, + { 0, 3, "Save State <0>", UIItems_MainMenuC }, + { 0, 4, "Reset ", UIItems_MainMenuC }, + { 0, 5, "Options...", UIItems_MainMenuC }, + { 0, 6, "Platform...", UIItems_MainMenuC }, + { 0, 7, "About...", UIItems_MainMenuC }, + { 0, 8, "Exit", UIItems_MainMenuC }, + { 9, 0, "Main Menu", UIItems_MainMenuC } +}; + +int UIItems_OptionsC(int index, int reason); +TUIMenu_Item UIItems_Options[] = { + { 0, 0, "Go Back...", UIItems_OptionsC }, + { 0, 1, "Palette: %s", UIItems_OptionsC }, + { 0, 2, "LCD Mode: %s", UIItems_OptionsC }, + { 0, 3, "LCD Filter: %s", UIItems_OptionsC }, + { 0, 10, "Contrast: %i%%", UIItems_OptionsC }, + { 0, 11, "Bright: %i%%", UIItems_OptionsC }, + { 0, 4, "Sound: %s", UIItems_OptionsC }, + { 0, 5, "Piezo Filter: %s", UIItems_OptionsC }, + { 0, 6, "PM Battery: %s", UIItems_OptionsC }, + { 0, 7, "RTC: %s", UIItems_OptionsC }, + { 0, 8, "Shared EEP.: %s", UIItems_OptionsC }, + { 0, 9, "Force FreeBIOS: %s", UIItems_OptionsC }, +#ifndef PERFORMANCE + { 0, 20, "Multicart: %s", UIItems_OptionsC }, +#endif + { 0, 50, "Sync Cycles: %d", UIItems_OptionsC }, + { 0, 60, "Reload Color Info...", UIItems_OptionsC }, + { 0, 99, "Save Configs...", UIItems_OptionsC }, + { 9, 0, "Options", UIItems_OptionsC } +}; + +int UIItems_PalEditC(int index, int reason); +TUIMenu_Item UIItems_PalEdit[] = { + { 0, 0, "Go Back...", UIItems_PalEditC }, + { 0, 1, "1-Light Red: %d", UIItems_PalEditC }, + { 0, 2, "1-Light Green: %d", UIItems_PalEditC }, + { 0, 3, "1-Light Blue: %d", UIItems_PalEditC }, + { 0, 4, "1-Dark Red: %d", UIItems_PalEditC }, + { 0, 5, "1-Dark Green: %d", UIItems_PalEditC }, + { 0, 6, "1-Dark Blue: %d", UIItems_PalEditC }, + { 0, 7, "1-Light Red: %d", UIItems_PalEditC }, + { 0, 8, "1-Light Green: %d", UIItems_PalEditC }, + { 0, 9, "1-Light Blue: %d", UIItems_PalEditC }, + { 0, 10, "1-Dark Red: %d", UIItems_PalEditC }, + { 0, 11, "1-Dark Green: %d", UIItems_PalEditC }, + { 0, 12, "1-Dark Blue: %d", UIItems_PalEditC }, + { 9, 0, "Palette Edit", UIItems_PalEditC } +}; + +int UIMenu_SetDisplay(int width, int height, int pixellayout, uint8_t *bg_image, uint16_t *bg_pal16, uint32_t *bg_pal32) +{ + // Calculate maximum number of lines + UIMenu_Width = width; + UIMenu_Height = height; + UIMenu_PixelLayout = pixellayout; + UIMenu_Lines = (height - 20) / 12; + if (UIMenu_Lines < 8) return 0; + UIMenu_MMax = UIMenu_Lines - 2; + + // Setup pixel layout + pixellayout &= 15; + UI_Font1_Pal32 = (uint32_t *)PokeMini_Font12_PalBGR32; + UI_Font2_Pal32 = (uint32_t *)PokeMini_TFont12_PalBGR32; + UI_Icons_Pal32 = (uint32_t *)PokeMini_Icons12_PalBGR32; + if (pixellayout == PokeMini_RGB15) { + UI_Font1_Pal16 = (uint16_t *)PokeMini_Font12_PalRGB15; + UI_Font2_Pal16 = (uint16_t *)PokeMini_TFont12_PalRGB15; + UI_Icons_Pal16 = (uint16_t *)PokeMini_Icons12_PalRGB15; + } else if (pixellayout == PokeMini_RGB16) { + UI_Font1_Pal16 = (uint16_t *)PokeMini_Font12_PalRGB16; + UI_Font2_Pal16 = (uint16_t *)PokeMini_TFont12_PalRGB16; + UI_Icons_Pal16 = (uint16_t *)PokeMini_Icons12_PalRGB16; + } else { + UI_Font1_Pal16 = (uint16_t *)PokeMini_Font12_PalBGR16; + UI_Font2_Pal16 = (uint16_t *)PokeMini_TFont12_PalBGR16; + UI_Icons_Pal16 = (uint16_t *)PokeMini_Icons12_PalBGR16; + } + + // Set/Update BG + if (bg_image) UIMenu_BGImage = bg_image; + if (bg_pal16) UIMenu_BGPal16 = bg_pal16; + if (bg_pal32) UIMenu_BGPal32 = bg_pal32; + + return 1; +} + +int UIMenu_Init(void) +{ + // Clear menu + UIMenu_LoadItems(UIItems_MainMenu, 0); + UIMenu_Page = UIPAGE_MENUITEMS; + UIMenu_Ani = 0; + UIMenu_InKey = 0; + UIMenu_Savestate = 0; + UI_Enabled = 1; + UI_FirstLoad = 1; + + // Allocate files list cache + UIMenu_FileListCache = (TUIMenu_FileListCache *)malloc(UI_MAXCACHE * sizeof(TUIMenu_FileListCache)); + if (!UIMenu_FileListCache) return 0; + + return 1; +} + +void UIMenu_Destroy(void) +{ + UI_Enabled = 0; + + // Free files list cache + if (UIMenu_FileListCache) { + free(UIMenu_FileListCache); + UIMenu_FileListCache = NULL; + } +} + +void UIMenu_SwapEntries(int a, int b) +{ + TUIMenu_FileListCache tmp; + memcpy(&tmp, &UIMenu_FileListCache[a], sizeof(TUIMenu_FileListCache)); + memcpy(&UIMenu_FileListCache[a], &UIMenu_FileListCache[b], sizeof(TUIMenu_FileListCache)); + memcpy(&UIMenu_FileListCache[b], &tmp, sizeof(TUIMenu_FileListCache)); +} + +#ifndef NO_SCANDIRS + +int UIMenu_ReadDir(char *dirname) +{ + int i, j, cmp, hasslash, isdir, items = 0; + char file[PMTMPV]; + + // Clear all cache + for (i=0; i 1) { + strcpy(UIMenu_FileListCache[0].name, ".."); + UIMenu_FileListCache[0].stats = 1; + items = 1; + } + while ( (de = fs_readdir(d)) ) { + if (de->name[0] == 0) break; + if (de->name[0] == '.') continue; + UIMenu_FileListCache[items].stats = 1; + strcpy(UIMenu_FileListCache[items].name, de->name); + if (hasslash) sprintf(file, "%s%s", dirname, de->name); + else sprintf(file, "%s/%s", dirname, de->name); + isdir = (de->size < 0); + if (isdir) { + // Directory + UIMenu_FileListCache[items++].stats = 1; + if (items >= UI_MAXCACHE) break; + } else { + // File + if (ExtensionCheck(de->name, ".min")) { + UIMenu_FileListCache[items].stats = 2; + sprintf(file, "%sc", de->name); + if (FileExist(file)) UIMenu_FileListCache[items].color = 1; + items++; +#ifndef NO_ZIP + } else if (ExtensionCheck(de->name, ".zip")) { + UIMenu_FileListCache[items].stats = 2; + UIMenu_FileListCache[items].color = 2; + items++; +#endif + } + if (items >= UI_MAXCACHE) break; + } + } + fs_close(d); +#else + struct dirent *dirEntry; + struct stat Stat; + DIR *dir = opendir(dirname); + if (dir == NULL) { + PokeDPrint(POKEMSG_ERR, "opendir('%s') error\n", dirname); + return 0; + } + while((dirEntry = readdir(dir)) != NULL) { + if (dirEntry->d_name[0] == 0) break; + UIMenu_FileListCache[items].stats = 0; + strcpy(UIMenu_FileListCache[items].name, dirEntry->d_name); + if (strcmp(dirEntry->d_name, ".") == 0) { + // Current directory + continue; + } else { + // Current directory, file or directory + if (hasslash) sprintf(file, "%s%s", dirname, dirEntry->d_name); + else sprintf(file, "%s/%s", dirname, dirEntry->d_name); + if (stat(file, &Stat) == -1) { + PokeDPrint(POKEMSG_ERR, "stat('%s') error\n", file); + continue; + } else { + isdir = S_ISDIR(Stat.st_mode); + } + + } + if (isdir) { + // Directory + UIMenu_FileListCache[items++].stats = 1; + if (items >= UI_MAXCACHE) break; + } else { + // File + if (ExtensionCheck(dirEntry->d_name, ".min")) { + UIMenu_FileListCache[items].stats = 2; + sprintf(file, "%sc", dirEntry->d_name); + if (FileExist(file)) UIMenu_FileListCache[items].color = 1; + items++; +#ifndef NO_ZIP + } else if (ExtensionCheck(dirEntry->d_name, ".zip")) { + UIMenu_FileListCache[items].stats = 2; + UIMenu_FileListCache[items].color = 2; + items++; +#endif + } + } + } + closedir(dir); +#endif + + // Sort the list + for (i=0; i= UIMenu_MMax) UIMenu_MOff = UIMenu_Cur - UIMenu_MMax + 1; + else UIMenu_MOff = 0; + items[i].callback(i, UIMENU_LOAD); +} + +void UIMenu_PrevMenu(void) +{ + int i = 0; + if (!UIMenu_CurrentItems) return; + UIMenu_Cur = UIMenu_CurrentItems[UIMenu_CurrentItemsNum].index; + UIMenu_CurrentItems = UIMenu_CurrentItems[UIMenu_CurrentItemsNum].prev; + while (UIMenu_CurrentItems[i].code < 2) i++; + UIMenu_CurrentItemsNum = i; + if (UIMenu_Cur >= UIMenu_MMax) UIMenu_MOff = UIMenu_Cur - UIMenu_MMax + 1; + else UIMenu_MOff = 0; + UIMenu_CurrentItems[i].callback(i, UIMENU_LOAD); +} + +int UIMenu_ChangeItem(TUIMenu_Item *items, int index, const char *format, ...) +{ + va_list args; + char buffer[PMTMPV]; + int i = 0; + if (!items) return 0; + while (items[i].code < 2) { + if (items[i].index == index) { + va_start(args, format); + vsprintf(buffer, format, args); + va_end(args); + buffer[31] = 0; // Menu only have 32 characters + strcpy(items[i].caption, buffer); + return 1; + } + i++; + } + return 0; +} + +void UIMenu_BeginMessage(void) +{ + UIMenu_MsgLines = 0; +} + +void UIMenu_SetMessage(char *message, int color) +{ + strcpy(UIMenu_FileListCache[UIMenu_MsgLines].name, message); + UIMenu_FileListCache[UIMenu_MsgLines].color = color; + UIMenu_MsgLines++; +} + +void UIMenu_EndMessage(int timeout) +{ + UIMenu_Page = UIPAGE_MESSAGE; + UIMenu_MsgOffset = 0; + UIMenu_MsgCountDw = UIMenu_MsgCountReset1; + UIMenu_MsgTimer = timeout; +} + +void UIMenu_RealTimeMessage(TUIRealtimeCB cb) +{ + if (cb == NULL) return; + UIMenu_Page = UIPAGE_REALTIMETEXT; + UIRealtimeCB = cb; + UIRealtimeCB(1, NULL); +} + +int UIItems_MainMenuC(int index, int reason) +{ + char tmp[PMTMPV]; + + // Main Menu + if (reason == UIMENU_OK) { + switch (index) { + case 0: // Resume... + reason = UIMENU_CANCEL; + break; + case 1: // Load ROM... + if (UI_FirstLoad) { + if (strlen(CommandLine.rom_dir)) PokeMini_SetCurrentDir(CommandLine.rom_dir); + UI_FirstLoad = 0; + } else UIMenu_GotoRelativeDir(NULL); + UIMenu_Page = UIPAGE_LOADROM; + UIMenu_Cur = 0; + UIMenu_ListFiles = UIMenu_ReadDir(PokeMini_CurrDir); + UIMenu_ListOffs = 0; + break; + case 2: // Load state + UIMenu_BeginMessage(); + UIMenu_SetMessage("Load state...", 1); + UIMenu_SetMessage("", 1); + sprintf(tmp, "%s.st%d", CommandLine.min_file, UIMenu_Savestate); + if (PokeMini_LoadSSFile(tmp)) { + UIMenu_SetMessage("State loaded!", 0); + UIMenu_EndMessage(60); + } else { + UIMenu_SetMessage("Loading failed", 0); + UIMenu_EndMessage(240); + } + break; + case 3: // Save state + UIMenu_BeginMessage(); + UIMenu_SetMessage("Save state...", 1); + UIMenu_SetMessage("", 1); + sprintf(tmp, "%s.st%d", CommandLine.min_file, UIMenu_Savestate); + if (PokeMini_SaveSSFile(tmp, CommandLine.min_file)) { + UIMenu_SetMessage("State saved!", 0); + UIMenu_EndMessage(60); + } else { + UIMenu_SetMessage("Saving failed", 0); + UIMenu_EndMessage(240); + } + break; + case 4: // Reset + PokeMini_Reset(UIMenu_HardReset); + UI_Status = UI_STATUS_GAME; + break; + case 5: // Options... + UIMenu_LoadItems(UIItems_Options, 0); + break; + case 6: // Platform... + UIMenu_LoadItems(UIItems_Platform, 0); + break; + case 7: // About... + UIMenu_BeginMessage(); + UIMenu_SetMessage("PokeMini " PokeMini_Version, 1); + UIMenu_SetMessage("", 0); + // Zoom >= 2, up to 23 chars + UIMenu_SetMessage("Thanks to p0p, Dave|X,", 0); + UIMenu_SetMessage("Onori, goldmomo, Agilo,", 0); + UIMenu_SetMessage("DarkFader, asterick,", 0); + UIMenu_SetMessage("MrBlinky, Wa, Lupin and", 0); + UIMenu_SetMessage("everyone in #pmdev on", 0); + UIMenu_SetMessage("IRC EFNET!", 0); + UIMenu_SetMessage("", 0); + UIMenu_SetMessage("Please check readme.txt", 1); + if (UIMenu_Width >= 350) { + // Zoom >= 4, up to 34 chars + UIMenu_SetMessage("", 0); + UIMenu_SetMessage("For latest version visit:", 1); + UIMenu_SetMessage("http://code.google.com/p/pokemini/", 0); + UIMenu_SetMessage("", 0); + // 0000000001111111111222222222233333 + // 1234567890123456789012345678901234 + UIMenu_SetMessage("Google Play fee donated by MEGA", 1); + UIMenu_SetMessage("Museum of Electronic Games & Art", 0); + UIMenu_SetMessage(" http://m-e-g-a.org", 0); + UIMenu_SetMessage("MEGA supports preservation", 0); + UIMenu_SetMessage("projects of digital art & culture", 0); + } + UIMenu_EndMessage(72*3600); + break; + case 8: // Exit + UI_Status = UI_STATUS_EXIT; + break; + } + } + if (reason == UIMENU_CANCEL) { + UI_Status = UI_STATUS_GAME; + return 0; + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 2: case 3: // Load/Save State + UIMenu_Savestate--; + if (UIMenu_Savestate < 0) UIMenu_Savestate = 9; + break; + case 4: // Reset + UIMenu_HardReset = !UIMenu_HardReset; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 2: case 3: // Load/Save State + UIMenu_Savestate++; + if (UIMenu_Savestate > 9) UIMenu_Savestate = 0; + break; + case 4: // Reset + UIMenu_HardReset = !UIMenu_HardReset; + break; + } + } + + // Update items + UIMenu_ChangeItem(UIItems_MainMenu, 2, "Load State <%d>", UIMenu_Savestate); + UIMenu_ChangeItem(UIItems_MainMenu, 3, "Save State <%d>", UIMenu_Savestate); + UIMenu_ChangeItem(UIItems_MainMenu, 4, "Reset <%s>", UIMenu_HardReset ? "Hard" : "Soft"); + + return 1; +} + +char *UIMenuTxt_Palette[16] = { + "Default", "Old", "Black & White", "Green Palette", + "Green Vector", "Red Palette", "Red Vector", "Blue LCD", + "LEDBacklight", "Girl Power", "Blue Palette", "Blue Vector", + "Sepia", "Inv. B&W", "Custom 1...", "Custom 2..." +}; + +char *UIMenuTxt_LCDMode[4] = { + "Analog", "3-Shades", "2-Shades", "Colors" +}; + +char *UIMenuTxt_LCDFilter[3] = { + "None", "Matrix/Hi", "Scanline" +}; + +char *UIMenuTxt_Sound[6] = { + "Disabled", "Generated", "Direct", "Emulated", "Direct PWM" +}; + +char *UIMenuTxt_Battery[3] = { + "Full", "Low", "Auto" +}; + +char *UIMenuTxt_RTC[3] = { + "Off", "State time diff.", "From Host" +}; + +char *UIMenuTxt_Multicart[3] = { + "Disabled", "Flash 512K", "Lupin 512K" +}; + +char *UIMenuTxt_Enabled[2] = { + "Disabled", "Enabled" +}; + +int UIItems_OptionsC(int index, int reason) +{ + char tmp[PMTMPV]; + + // Options + if (reason == UIMENU_OK) { + switch (index) { + case 0: // Go back... + reason = UIMENU_CANCEL; + break; + case 1: // Palette + UIMenu_LoadItems(UIItems_PalEdit, 0); + break; + case 2: case 3: case 4: case 5: + case 6: case 7: case 8: case 9: + reason = UIMENU_RIGHT; + break; + case 20: // Multicart + reason = UIMENU_RIGHT; + break; + case 60: // Reload Color Info... + UIMenu_BeginMessage(); + UIMenu_SetMessage("Reload Color Info...", 1); + UIMenu_SetMessage("", 1); + sprintf(tmp, "%sc", CommandLine.min_file); + if (!FileExist(tmp) || !PokeMini_LoadColorFile(tmp)) { + if (CommandLine.lcdmode == 3) CommandLine.lcdmode = 0; + UIMenu_SetMessage("Reload failed!", 0); + UIMenu_EndMessage(240); + } else { + CommandLine.lcdmode = 3; + UIMenu_SetMessage("Reload complete!", 0); + UIMenu_EndMessage(60); + } + break; + case 99: // Save configs... + UIMenu_BeginMessage(); + UIMenu_SetMessage("Save Configs...", 1); + UIMenu_SetMessage("", 1); + PokeMini_GotoExecDir(); + if (CommandLineConfSave()) { + UIMenu_SetMessage("Configurations saved", 0); + } else { + UIMenu_SetMessage("Saving failed!", 0); + } + UIMenu_EndMessage(240); + break; + } + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + return 1; + } + if (reason == UIMENU_LEFT) { + switch (index) { + case 1: CommandLine.palette = (CommandLine.palette - 1) & 15; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + break; + case 2: CommandLine.lcdmode--; + if (CommandLine.lcdmode < 0) CommandLine.lcdmode = PRCColorMap ? 3 : 2; + break; + case 3: CommandLine.lcdfilter--; + if (CommandLine.lcdfilter < 0) CommandLine.lcdfilter = 2; + break; + case 10: CommandLine.lcdcontrast -= 2; + if (CommandLine.lcdcontrast < 0) CommandLine.lcdcontrast = 100; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + break; + case 11: CommandLine.lcdbright -= 2; + if (CommandLine.lcdbright < -100) CommandLine.lcdbright = 100; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + break; + case 4: if (PokeMini_Flags & POKEMINI_GENSOUND) { + CommandLine.sound = !CommandLine.sound; + } else { + CommandLine.sound--; + if (CommandLine.sound < 0) CommandLine.sound = 4; + } + break; + case 5: CommandLine.piezofilter = !CommandLine.piezofilter; + break; + case 6: if (PokeMini_Flags & POKEMINI_AUTOBATT) + CommandLine.low_battery--; + else + CommandLine.low_battery = !CommandLine.low_battery; + if (CommandLine.low_battery < 0) CommandLine.low_battery = 2; + break; + case 7: CommandLine.updatertc--; + if (CommandLine.updatertc < 0) CommandLine.updatertc = 2; + break; + case 8: CommandLine.eeprom_share = !CommandLine.eeprom_share; + break; + case 9: CommandLine.forcefreebios = !CommandLine.forcefreebios; + break; + case 20: CommandLine.multicart--; + if (CommandLine.multicart < 0) CommandLine.multicart = 2; + break; + case 50: CommandLine.synccycles >>= 1; + if (CommandLine.synccycles < 8) CommandLine.synccycles = 8; + break; + } + } + if (reason == UIMENU_RIGHT) { + switch (index) { + case 1: CommandLine.palette = (CommandLine.palette + 1) & 15; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + break; + case 2: CommandLine.lcdmode++; + if (CommandLine.lcdmode > (PRCColorMap ? 3 : 2)) CommandLine.lcdmode = 0; + break; + case 3: CommandLine.lcdfilter++; + if (CommandLine.lcdfilter > 2) CommandLine.lcdfilter = 0; + break; + case 10: CommandLine.lcdcontrast += 2; + if (CommandLine.lcdcontrast > 100) CommandLine.lcdcontrast = 0; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + break; + case 11: CommandLine.lcdbright += 2; + if (CommandLine.lcdbright > 100) CommandLine.lcdbright = -100; + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + break; + case 4: if (PokeMini_Flags & POKEMINI_GENSOUND) { + CommandLine.sound = !CommandLine.sound; + } else { + CommandLine.sound++; + if (CommandLine.sound > 4) CommandLine.sound = 0; + } + break; + case 5: CommandLine.piezofilter = !CommandLine.piezofilter; + break; + case 6: if (PokeMini_Flags & POKEMINI_AUTOBATT) + CommandLine.low_battery++; + else + CommandLine.low_battery = !CommandLine.low_battery; + if (CommandLine.low_battery > 2) CommandLine.low_battery = 0; + break; + case 7: CommandLine.updatertc++; + if (CommandLine.updatertc > 2) CommandLine.updatertc = 0; + break; + case 8: CommandLine.eeprom_share = !CommandLine.eeprom_share; + break; + case 9: CommandLine.forcefreebios = !CommandLine.forcefreebios; + break; + case 20: CommandLine.multicart++; + if (CommandLine.multicart > 2) CommandLine.multicart = 0; + break; + case 50: CommandLine.synccycles <<= 1; +#ifdef PERFORMANCE + if (CommandLine.synccycles > 512) CommandLine.synccycles = 512; +#else + if (CommandLine.synccycles > 64) CommandLine.synccycles = 64; +#endif + break; + } + } + + // Update items + UIMenu_ChangeItem(UIItems_Options, 1, "Palette: %s", UIMenuTxt_Palette[CommandLine.palette]); + UIMenu_ChangeItem(UIItems_Options, 2, "LCD Mode: %s", UIMenuTxt_LCDMode[CommandLine.lcdmode]); + UIMenu_ChangeItem(UIItems_Options, 3, "LCD Filter: %s", UIMenuTxt_LCDFilter[CommandLine.lcdfilter]); + UIMenu_ChangeItem(UIItems_Options, 10, "Contrast: %i%%", CommandLine.lcdcontrast); + UIMenu_ChangeItem(UIItems_Options, 11, "Bright: %i%%", CommandLine.lcdbright); + if (PokeMini_Flags & POKEMINI_NOSOUND) { + CommandLine.sound = 0; + UIMenu_ChangeItem(UIItems_Options, 4, "Sound: Disabled"); + } else if (PokeMini_Flags & POKEMINI_GENSOUND) { + CommandLine.sound = CommandLine.sound ? 1 : 0; + UIMenu_ChangeItem(UIItems_Options, 4, "Sound: %s", UIMenuTxt_Enabled[CommandLine.sound]); + } else { + UIMenu_ChangeItem(UIItems_Options, 4, "Sound: %s", UIMenuTxt_Sound[CommandLine.sound]); + } + UIMenu_ChangeItem(UIItems_Options, 5, "Piezo Filter: %s", CommandLine.piezofilter ? "Yes" : "No"); + if (PokeMini_Flags & POKEMINI_AUTOBATT) { + UIMenu_ChangeItem(UIItems_Options, 6, "PM Batt.: %s (%s)", UIMenuTxt_Battery[CommandLine.low_battery], UIMenuTxt_Battery[PokeMini_HostBattStatus]); + } else { + UIMenu_ChangeItem(UIItems_Options, 6, "PM Battery: %s", UIMenuTxt_Battery[CommandLine.low_battery]); + } + UIMenu_ChangeItem(UIItems_Options, 7, "RTC: %s", UIMenuTxt_RTC[CommandLine.updatertc]); + UIMenu_ChangeItem(UIItems_Options, 8, "Shared EEP.: %s", CommandLine.eeprom_share ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Options, 9, "Force FreeBIOS: %s", CommandLine.forcefreebios ? "Yes" : "No"); + UIMenu_ChangeItem(UIItems_Options, 20, "Multicart: %s", UIMenuTxt_Multicart[CommandLine.multicart]); + UIMenu_ChangeItem(UIItems_Options, 50, "Sync Cycles: %d", CommandLine.synccycles); + + return 1; +} + +int UIItems_PalEditC(int index, int reason) +{ + uint8_t r, g, b, ic, ix; + const int deco[] = {0, 0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14}; + + // Palette Editor + if (reason == UIMENU_OK) { + switch (index) { + case 0: // Go back... + reason = UIMENU_CANCEL; + break; + } + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + return 1; + } + if (reason == UIMENU_LEFT) { + if (index > 0) { + ic = deco[index] & 3; + ix = (deco[index] & 12) >> 2; + r = GetValH24(CommandLine.custompal[ix]); + g = GetValM24(CommandLine.custompal[ix]); + b = GetValL24(CommandLine.custompal[ix]); + if (UIMenu_CKeyMod) { + if (ic == 0) r-=16; + if (ic == 1) g-=16; + if (ic == 2) b-=16; + } else { + if (ic == 0) r--; + if (ic == 1) g--; + if (ic == 2) b--; + } + CommandLine.custompal[ix] = RGB24(b, g, r); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + } + } + if (reason == UIMENU_RIGHT) { + if (index > 0) { + ic = deco[index] & 3; + ix = (deco[index] & 12) >> 2; + r = GetValH24(CommandLine.custompal[ix]); + g = GetValM24(CommandLine.custompal[ix]); + b = GetValL24(CommandLine.custompal[ix]); + if (UIMenu_CKeyMod) { + if (ic == 0) r+=16; + if (ic == 1) g+=16; + if (ic == 2) b+=16; + } else { + if (ic == 0) r++; + if (ic == 1) g++; + if (ic == 2) b++; + } + CommandLine.custompal[ix] = RGB24(b, g, r); + PokeMini_VideoPalette_Index(CommandLine.palette, CommandLine.custompal, CommandLine.lcdcontrast, CommandLine.lcdbright); + } + } + + // Update items + UIMenu_ChangeItem(UIItems_PalEdit, 1, "1-Light Red: %d", GetValH24(CommandLine.custompal[0])); + UIMenu_ChangeItem(UIItems_PalEdit, 2, "1-Light Green: %d", GetValM24(CommandLine.custompal[0])); + UIMenu_ChangeItem(UIItems_PalEdit, 3, "1-Light Blue: %d", GetValL24(CommandLine.custompal[0])); + UIMenu_ChangeItem(UIItems_PalEdit, 4, "1-Dark Red: %d", GetValH24(CommandLine.custompal[1])); + UIMenu_ChangeItem(UIItems_PalEdit, 5, "1-Dark Green: %d", GetValM24(CommandLine.custompal[1])); + UIMenu_ChangeItem(UIItems_PalEdit, 6, "1-Dark Blue: %d", GetValL24(CommandLine.custompal[1])); + UIMenu_ChangeItem(UIItems_PalEdit, 7, "2-Light Red: %d", GetValH24(CommandLine.custompal[2])); + UIMenu_ChangeItem(UIItems_PalEdit, 8, "2-Light Green: %d", GetValM24(CommandLine.custompal[2])); + UIMenu_ChangeItem(UIItems_PalEdit, 9, "2-Light Blue: %d", GetValL24(CommandLine.custompal[2])); + UIMenu_ChangeItem(UIItems_PalEdit, 10, "2-Dark Red: %d", GetValH24(CommandLine.custompal[3])); + UIMenu_ChangeItem(UIItems_PalEdit, 11, "2-Dark Green: %d", GetValM24(CommandLine.custompal[3])); + UIMenu_ChangeItem(UIItems_PalEdit, 12, "2-Dark Blue: %d", GetValL24(CommandLine.custompal[3])); + + return 1; +} + +int UIItems_PlatformDefC(int index, int reason) +{ + if (reason == UIMENU_OK) { + if (index == 99) { // Save configs... + UIMenu_BeginMessage(); + UIMenu_SetMessage("Save Configs...", 1); + UIMenu_SetMessage("", 1); + PokeMini_GotoExecDir(); + if (CommandLineConfSave()) { + UIMenu_SetMessage("Configurations saved", 0); + } else { + UIMenu_SetMessage("Saving failed!", 0); + } + UIMenu_EndMessage(240); + } else reason = UIMENU_CANCEL; + } + if (reason == UIMENU_CANCEL) { + UIMenu_PrevMenu(); + return 1; + } + return 1; +} + +int UIMenu_DoStuff(int key) +{ + int i; + + // Menu items + if (UIMenu_Page == UIPAGE_MENUITEMS) { + if (key == MINX_KEY_DOWN) { + UIMenu_Cur++; + if (UIMenu_Cur >= UIMenu_CurrentItemsNum) UIMenu_Cur = 0; + if (UIMenu_Cur >= UIMenu_MMax) UIMenu_MOff = UIMenu_Cur - UIMenu_MMax + 1; + else UIMenu_MOff = 0; + } + if (key == MINX_KEY_UP) { + UIMenu_Cur--; + if (UIMenu_Cur < 0) UIMenu_Cur = UIMenu_CurrentItemsNum-1; + if (UIMenu_Cur >= UIMenu_MMax) UIMenu_MOff = UIMenu_Cur - UIMenu_MMax + 1; + else UIMenu_MOff = 0; + } + if (key == MINX_KEY_A) { + return UIMenu_CurrentItems[UIMenu_Cur].callback(UIMenu_CurrentItems[UIMenu_Cur].index, UIMENU_OK); + } + if (key == MINX_KEY_B) { + return UIMenu_CurrentItems[UIMenu_Cur].callback(UIMenu_CurrentItems[UIMenu_Cur].index, UIMENU_CANCEL); + } + if (key == MINX_KEY_LEFT) { + return UIMenu_CurrentItems[UIMenu_Cur].callback(UIMenu_CurrentItems[UIMenu_Cur].index, UIMENU_LEFT); + } + if (key == MINX_KEY_RIGHT) { + return UIMenu_CurrentItems[UIMenu_Cur].callback(UIMenu_CurrentItems[UIMenu_Cur].index, UIMENU_RIGHT); + } + } + + // Load ROM + if (UIMenu_Page == UIPAGE_LOADROM) { + if (UIMenu_CKeyMod) { + // Key C Modifier (On) + // C + Down = Last item + // C + Up = First item + // C + Left = Left drive (Windows) + // C + Right = Right drive (Windows) + + if (key == MINX_KEY_DOWN) { + UIMenu_Cur = (UIMenu_ListFiles-1) % UIMenu_FilesLines; + UIMenu_ListOffs = (UIMenu_ListFiles-1) / UIMenu_FilesLines * UIMenu_FilesLines; + } + if (key == MINX_KEY_UP) { + UIMenu_Cur = 0; + UIMenu_ListOffs = 0; + } + if (key == MINX_KEY_LEFT) { + // Hack to support windows drives + if (strlen(PokeMini_CurrDir) >= 3) { + if (PokeMini_CurrDir[1] == ':') { + for (i=toupper((int)PokeMini_CurrDir[0]); i>'A';) { + PokeMini_CurrDir[0] = --i; + PokeMini_CurrDir[2] = '\\'; + PokeMini_CurrDir[3] = 0; + UIMenu_GotoRelativeDir(NULL); + if (toupper((int)PokeMini_CurrDir[0]) == i) { + UIMenu_Cur = 0; + UIMenu_ListFiles = UIMenu_ReadDir(PokeMini_CurrDir); + UIMenu_ListOffs = 0; + break; + } + } + } + } + } + if (key == MINX_KEY_RIGHT) { + // Hack to support windows drives + if (strlen(PokeMini_CurrDir) >= 3) { + if (PokeMini_CurrDir[1] == ':') { + for (i=toupper((int)PokeMini_CurrDir[0]); i<'Z';) { + PokeMini_CurrDir[0] = ++i; + PokeMini_CurrDir[2] = '\\'; + PokeMini_CurrDir[3] = 0; + UIMenu_GotoRelativeDir(NULL); + if (toupper((int)PokeMini_CurrDir[0]) == i) { + UIMenu_Cur = 0; + UIMenu_ListFiles = UIMenu_ReadDir(PokeMini_CurrDir); + UIMenu_ListOffs = 0; + break; + } + } + } + } + } + } else { + // Key C Modifier (Off) + // Down = Previous item + // Up = Next item + // Left = Previous page + // Right = Next page + + if (key == MINX_KEY_DOWN) { + UIMenu_Cur++; + if ((UIMenu_ListOffs + UIMenu_Cur) >= UIMenu_ListFiles) { + // Over last item + UIMenu_Cur = 0; + UIMenu_ListOffs = 0; + } else if (UIMenu_Cur >= UIMenu_FilesLines) { + // Over last line + UIMenu_Cur = 0; + UIMenu_ListOffs += UIMenu_FilesLines; + if (UIMenu_ListOffs >= UIMenu_ListFiles) UIMenu_ListOffs -= UIMenu_FilesLines; + } + } + if (key == MINX_KEY_UP) { + UIMenu_Cur--; + if (UIMenu_Cur < 0) { + // Under last line + UIMenu_Cur = UIMenu_Lines-2; + UIMenu_ListOffs -= UIMenu_FilesLines; + if (UIMenu_ListOffs < 0) { + // Under last item + UIMenu_Cur = (UIMenu_ListFiles-1) % UIMenu_FilesLines; + UIMenu_ListOffs = (UIMenu_ListFiles-1) / UIMenu_FilesLines * UIMenu_FilesLines; + } + } + } + if (key == MINX_KEY_LEFT) { + UIMenu_Cur -= UIMenu_FilesLines; + if (UIMenu_Cur < 0) { + // Under first line + UIMenu_Cur = UIMenu_Lines-2; + UIMenu_ListOffs -= UIMenu_FilesLines; + if (UIMenu_ListOffs < 0) { + // Under first item + UIMenu_Cur = (UIMenu_ListFiles-1) % UIMenu_FilesLines; + UIMenu_ListOffs = (UIMenu_ListFiles-1) / UIMenu_FilesLines * UIMenu_FilesLines; + } + } + } + if (key == MINX_KEY_RIGHT) { + UIMenu_Cur += UIMenu_FilesLines; + if ((UIMenu_ListOffs + UIMenu_Cur) >= UIMenu_ListFiles) { + // Over last item + UIMenu_Cur = 0; + UIMenu_ListOffs += UIMenu_FilesLines; + if (UIMenu_ListOffs >= UIMenu_ListFiles) { + UIMenu_ListOffs = 0; + } + } else if (UIMenu_Cur >= UIMenu_FilesLines) { + // Over last line + UIMenu_Cur = 0; + UIMenu_ListOffs += UIMenu_FilesLines; + if (UIMenu_ListOffs >= UIMenu_ListFiles) UIMenu_ListOffs -= UIMenu_FilesLines; + } + } + } + if (key == MINX_KEY_B) { + PokeMini_GotoExecDir(); + UIMenu_Page = UIPAGE_MENUITEMS; + UIMenu_Cur = 1; + return 1; + } + if (key == MINX_KEY_A) { + if ((UIMenu_ListOffs + UIMenu_Cur) < UIMenu_ListFiles) { + if (UIMenu_FileListCache[UIMenu_ListOffs + UIMenu_Cur].stats == 2) { + // Load ROM + PokeMini_GotoCurrentDir(); + strcpy(CommandLine.rom_dir, PokeMini_CurrDir); + PokeMini_LoadROM(UIMenu_FileListCache[UIMenu_ListOffs + UIMenu_Cur].name); + PokeMini_GotoExecDir(); + UIMenu_Page = UIPAGE_MENUITEMS; + UIMenu_Cur = 1; + UI_Status = UI_STATUS_GAME; + return 1; + } else { + // Jump to directory + UIMenu_GotoRelativeDir(UIMenu_FileListCache[UIMenu_ListOffs + UIMenu_Cur].name); + UIMenu_Cur = 0; + UIMenu_ListFiles = UIMenu_ReadDir(PokeMini_CurrDir); + UIMenu_ListOffs = 0; + } + } + } + } + + // User Message + if (UIMenu_Page == UIPAGE_MESSAGE) { + if ((key == MINX_KEY_A) || (key == MINX_KEY_B)) { + UIMenu_Page = UIPAGE_MENUITEMS; + return 1; + } + } + + // Real-time text + if (UIMenu_Page == UIPAGE_REALTIMETEXT) { + if (UIMenu_CKeyMod && (key == MINX_KEY_A)) { + UIMenu_Page = UIPAGE_MENUITEMS; + UIRealtimeCB(0, NULL); + return 1; + } + } + + return 1; +} + +int UIMenu_Process(void) +{ + int res; + if (UIMenu_InKey) { + res = UIMenu_DoStuff(UIMenu_InKey); + UIMenu_InKey = 0; + return res; + } + return 1; +} + +void UIMenu_Display_32(uint32_t *screen, int pitchW) +{ + int padd, i, j; + char text[PMTMPV]; + + if (UIMenu_Width >= 288) padd = 10; + else padd = 8; // Padding need to be small for small resolutions + + // Draw background + UIDraw_BG_32(screen, pitchW, UIMenu_BGImage, UIMenu_BGPal32, UIMenu_Width, UIMenu_Height); + + // Draw version + UIDraw_String_32(screen, pitchW, UIMenu_Width - 48, 2, 8, PokeMini_VerShort, UI_Font1_Pal32); + + // Animate and do stuff + UIMenu_Ani++; + + // Menu items + if (UIMenu_Page == UIPAGE_MENUITEMS) { + // Preview + if (UI_PreviewDist) { + PokeMini_VideoRect_32(screen, pitchW, UIMenu_Width - 100 - UI_PreviewDist, 16 + UI_PreviewDist, 100, 68, 0x00000000); + PokeMini_VideoPreview_32(screen + ((18 + UI_PreviewDist) * pitchW) + (UIMenu_Width - 98 - UI_PreviewDist), pitchW, PokeMini_LCDMode); + } + + // More... + if ((UIMenu_CurrentItemsNum > UIMenu_MMax) && (UIMenu_Cur != (UIMenu_CurrentItemsNum-1))) { + UIDraw_String_32(screen, pitchW, 16, 18 + UIMenu_MMax*12, 8, "...", UI_Font2_Pal32); + } + + // List + UIDraw_String_32(screen, pitchW, 4, 2, padd, UIMenu_CurrentItems[UIMenu_CurrentItemsNum].caption, UI_Font2_Pal32); + for (i=0; i= UIMenu_CurrentItemsNum) break; + UIDraw_String_32(screen, pitchW, 16, 20 + (12 * i), padd, UIMenu_CurrentItems[j].caption, UIMenu_CurrentItems[j].code ? UI_Font2_Pal32 : UI_Font1_Pal32); + } + + // Cursor + UIDraw_Icon_32(screen, pitchW, 2, 20 + (UIMenu_Cur-UIMenu_MOff)*12, ((UIMenu_Ani>>2) & 3)); + + // Loaded ROM + sprintf(text, "ROM: %s", CommandLine.min_file); + text[(UIMenu_Width/padd)-1] = 0; // Avoid string going out of the screen + UIDraw_String_32(screen, pitchW, 2, 20 + (UIMenu_MMax+1)*12, padd, text, UI_Font1_Pal32); + } + + // Load ROM + if (UIMenu_Page == UIPAGE_LOADROM) { + // Menu + UIDraw_String_32(screen, pitchW, 4, 2, padd, "Load Rom", UI_Font2_Pal32); + + // Display current dir and parent + UIText_Scroll(text, PokeMini_CurrDir, (UIMenu_Width/padd)-2, UIMenu_Ani>>4); + UIDraw_String_32(screen, pitchW, 4, 20, padd, text, UI_Font2_Pal32); + + // Display files list + for (i=0; i<(UIMenu_Lines-1); i++) { + j = UIMenu_ListOffs + i; + if (j < UIMenu_ListFiles) { + UIDraw_Icon_32(screen, pitchW, 13, 32+(i*12), 4 + UIMenu_FileListCache[j].stats + UIMenu_FileListCache[j].color); + UIText_Scroll(text, UIMenu_FileListCache[j].name, (UIMenu_Width/padd)-4, UIMenu_Ani>>4); + UIDraw_String_32(screen, pitchW, 26, 32+(i*12), padd, text, UI_Font1_Pal32); + } + } + + // Cursor + UIDraw_Icon_32(screen, pitchW, 2, 32 + UIMenu_Cur*12, ((UIMenu_Ani>>2) & 3)); + } + + // User Message + if (UIMenu_Page == UIPAGE_MESSAGE) { + // Menu + UIDraw_String_32(screen, pitchW, 4, 2, padd, "Message", UI_Font2_Pal32); + + // Display all messages + for (i=0; i UIMenu_MsgLines) { + UIMenu_MsgOffset = 0; + UIMenu_MsgCountDw = UIMenu_MsgCountReset1; + } else if (j == UIMenu_MsgLines) { + UIMenu_MsgOffset++; + UIMenu_MsgCountDw = UIMenu_MsgCountReset1; + } else { + UIMenu_MsgOffset++; + UIMenu_MsgCountDw = UIMenu_MsgCountReset2; + } + } + if (UIMenu_MsgTimer-- <= 0) { + UIMenu_Page = UIPAGE_MENUITEMS; + } + } + + // Real-time text + if (UIMenu_Page == UIPAGE_REALTIMETEXT) { + // Menu + UIDraw_String_32(screen, pitchW, 4, 2, padd, "Real-Time", UI_Font2_Pal32); + + // Refresh text + i = 0; + if (UIRealtimeCB) { + for (i=0; i= 288) padd = 10; + else padd = 8; // Padding need to be small for small resolutions + + // Draw background + UIDraw_BG_16(screen, pitchW, UIMenu_BGImage, UIMenu_BGPal16, UIMenu_Width, UIMenu_Height); + + // Draw version + UIDraw_String_16(screen, pitchW, UIMenu_Width - 48, 2, 8, PokeMini_VerShort, UI_Font1_Pal16); + + // Animate and do stuff + UIMenu_Ani++; + + // Menu items + if (UIMenu_Page == UIPAGE_MENUITEMS) { + // Preview + if (UI_PreviewDist) { + PokeMini_VideoRect_16(screen, pitchW, UIMenu_Width - 100 - UI_PreviewDist, 16 + UI_PreviewDist, 100, 68, 0x00000000); + PokeMini_VideoPreview_16(screen + ((18 + UI_PreviewDist) * pitchW) + (UIMenu_Width - 98 - UI_PreviewDist), pitchW, PokeMini_LCDMode); + } + + // More... + if ((UIMenu_CurrentItemsNum > UIMenu_MMax) && (UIMenu_Cur != (UIMenu_CurrentItemsNum-1))) { + UIDraw_String_16(screen, pitchW, 16, 18 + UIMenu_MMax*12, 8, "...", UI_Font2_Pal16); + } + + // List + UIDraw_String_16(screen, pitchW, 4, 2, padd, UIMenu_CurrentItems[UIMenu_CurrentItemsNum].caption, UI_Font2_Pal16); + for (i=0; i= UIMenu_CurrentItemsNum) break; + UIDraw_String_16(screen, pitchW, 16, 20 + (12 * i), padd, UIMenu_CurrentItems[j].caption, UIMenu_CurrentItems[j].code ? UI_Font2_Pal16 : UI_Font1_Pal16); + } + + // Cursor + UIDraw_Icon_16(screen, pitchW, 2, 20 + (UIMenu_Cur-UIMenu_MOff)*12, ((UIMenu_Ani>>2) & 3)); + + // Loaded ROM + sprintf(text, "ROM: %s", CommandLine.min_file); + text[(UIMenu_Width/padd)-1] = 0; // Avoid string going out of the screen + UIDraw_String_16(screen, pitchW, 2, 20 + (UIMenu_MMax+1)*12, padd, text, UI_Font1_Pal16); + } + + // Load ROM + if (UIMenu_Page == UIPAGE_LOADROM) { + // Menu + UIDraw_String_16(screen, pitchW, 4, 2, padd, "Load ROM", UI_Font2_Pal16); + + // Display current dir and parent + UIText_Scroll(text, PokeMini_CurrDir, (UIMenu_Width/padd)-2, UIMenu_Ani>>4); + UIDraw_String_16(screen, pitchW, 4, 20, padd, text, UI_Font2_Pal16); + + // Display files list + for (i=0; i<(UIMenu_Lines-1); i++) { + j = UIMenu_ListOffs + i; + if (j < UIMenu_ListFiles) { + UIDraw_Icon_16(screen, pitchW, 13, 32+(i*12), 4 + UIMenu_FileListCache[j].stats + UIMenu_FileListCache[j].color); + UIText_Scroll(text, UIMenu_FileListCache[j].name, (UIMenu_Width/padd)-4, UIMenu_Ani>>4); + UIDraw_String_16(screen, pitchW, 26, 32+(i*12), padd, text, UI_Font1_Pal16); + } + } + // Cursor + UIDraw_Icon_16(screen, pitchW, 2, 32 + UIMenu_Cur*12, ((UIMenu_Ani>>2) & 3)); + } + + // User Message + if (UIMenu_Page == UIPAGE_MESSAGE) { + // Menu + UIDraw_String_16(screen, pitchW, 4, 2, padd, "Message", UI_Font2_Pal16); + + // Display all messages + for (i=0; i UIMenu_MsgLines) { + UIMenu_MsgOffset = 0; + UIMenu_MsgCountDw = UIMenu_MsgCountReset1; + } else if (j == UIMenu_MsgLines) { + UIMenu_MsgOffset++; + UIMenu_MsgCountDw = UIMenu_MsgCountReset1; + } else { + UIMenu_MsgOffset++; + UIMenu_MsgCountDw = UIMenu_MsgCountReset2; + } + } + if (UIMenu_MsgTimer-- <= 0) { + UIMenu_Page = UIPAGE_MENUITEMS; + } + } + + // Real-time text + if (UIMenu_Page == UIPAGE_REALTIMETEXT) { + // Menu + UIDraw_String_16(screen, pitchW, 4, 2, padd, "Real-Time", UI_Font2_Pal16); + + // Refresh text + i = 0; + if (UIRealtimeCB) { + for (i=0; i. +*/ + +#ifndef POKEMINI_INUI +#define POKEMINI_INUI + +#include + +#define UI_STATUS_MENU 1 +#define UI_STATUS_GAME 0 +#define UI_STATUS_EXIT -1 + +// File list cache +typedef struct { + char name[128]; // Filename | Message + char stats; // 0 = Invalid, 1 = Directory, 2 = File | Unused + char color; // 0 = Normal, 1 = Color available, 2 = Package | 0 = Yellow, 1 = Aqua +} TUIMenu_FileListCache; + +// Maximum files/directories per directory +#ifndef UI_MAXCACHE +#define UI_MAXCACHE 512 +#endif + +// Menu callback reason +enum { + UIMENU_LOAD, // Menu was loaded (called from UIMenu_LoadItems) + UIMENU_CANCEL, // User pressed B + UIMENU_OK, // User pressed A + UIMENU_LEFT, // User pressed Left + UIMENU_RIGHT // User pressed Right +}; + +// Menu callback type +typedef int (*TUIMenu_Callback)(int index, int reason); + +// Menu item +typedef struct TUIMenu_Item { + int code; // Code: 0 = Yellow, 1 = Aqua, 9 = End-of-list + int index; // Index of item + char caption[32]; // Text to display, last entry will be the title + TUIMenu_Callback callback; // Callback, last entry will receive UIMENU_LOAD + struct TUIMenu_Item *prev; // Must be NULL +} TUIMenu_Item; + +// External font and icons palette +extern uint32_t *UI_Font1_Pal32; +extern uint16_t *UI_Font1_Pal16; +extern uint32_t *UI_Font2_Pal32; +extern uint16_t *UI_Font2_Pal16; +extern uint32_t *UI_Icons_Pal32; +extern uint16_t *UI_Icons_Pal16; + +// UI Items +extern TUIMenu_Item UIItems_MainMenu[]; // Main Menu items list +extern TUIMenu_Item UIItems_Options[]; // Options items list +int UIItems_PlatformDefC(int index, int reason); // Platform default callback +extern TUIMenu_Item UIItems_Platform[]; // Platform items list (USER DEFINED) + +#define PLATFORMDEF_GOBACK { 0, 0, "Go back...", UIItems_PlatformDefC } +#define PLATFORMDEF_SAVEOPTIONS { 0, 99, "Save Configs...", UIItems_PlatformDefC } +#define PLATFORMDEF_END(cb) { 9, 0, "Platform", cb } + +// UI return status +// 1 = In Menu +// 0 = Game +// -1 = Exit +extern int UI_Status; + +// UI PM screen preview distance from top-right, 0 to disable +extern int UI_PreviewDist; + +// Load items list +void UIMenu_LoadItems(TUIMenu_Item *items, int cursorindex); + +// Return to previous menu +void UIMenu_PrevMenu(void); + +// Change item on current menu +int UIMenu_ChangeItem(TUIMenu_Item *items, int index, const char *format, ...); + +// Message output +void UIMenu_BeginMessage(void); +void UIMenu_SetMessage(char *message, int color); +void UIMenu_EndMessage(int timeout); + +// Real-time text output +typedef int (*TUIRealtimeCB)(int line, char *outtext); +void UIMenu_RealTimeMessage(TUIRealtimeCB cb); + +// Resize display +int UIMenu_SetDisplay(int width, int height, int pixellayout, uint8_t *bg_image, uint16_t *bg_pal16, uint32_t *bg_pal32); + +// Initialize +int UIMenu_Init(void); + +// Destroy +void UIMenu_Destroy(void); + +// Handle key events +void UIMenu_KeyEvent(int key, int press); + +// Display Character +void UIDraw_Char_32(uint32_t *screen, int pitchW, int x, int y, uint8_t ch, const uint32_t *palette); +void UIDraw_Char_16(uint16_t *screen, int pitchW, int x, int y, uint8_t ch, const uint16_t *palette); + +// Display String +void UIDraw_String_32(uint32_t *screen, int pitchW, int x, int y, int padd, char *str, const uint32_t *palette); +void UIDraw_String_16(uint16_t *screen, int pitchW, int x, int y, int padd, char *str, const uint16_t *palette); + +// Display Icons +void UIDraw_Icon_32(uint32_t *screen, int pitchW, int x, int y, uint8_t ch); +void UIDraw_Icon_16(uint16_t *screen, int pitchW, int x, int y, uint8_t ch); + +// Process UI +int UIMenu_Process(void); + +// Display UI +void UIMenu_Display_32(uint32_t *screen, int pitchW); +void UIMenu_Display_16(uint16_t *screen, int pitchW); + +// Display Saving EEPROM +void UIMenu_SaveEEPDisplay_32(uint32_t *screen, int pitchW); +void UIMenu_SaveEEPDisplay_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video.c b/PVPokeMini/PokeMini/pokemini-code/source/Video.c new file mode 100644 index 0000000000..251b3971da --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video.c @@ -0,0 +1,424 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "PokeMini_ColorPal.h" + +int VidPixelLayout = 0; +int VidEnableHighcolor = 0; +uint32_t *VidPalette32 = NULL; +uint16_t *VidPalette16 = NULL; +uint32_t *VidPalColor32 = NULL; +uint16_t *VidPalColor16 = NULL; +uint32_t *VidPalColorH32 = NULL; +uint16_t *VidPalColorH16 = NULL; +TPokeMini_VideoSpec *PokeMini_VideoCurrent = NULL; +int PokeMini_VideoDepth = 0; +TPokeMini_DrawVideo16 PokeMini_VideoBlit16 = NULL; +TPokeMini_DrawVideo32 PokeMini_VideoBlit32 = NULL; +TPokeMini_DrawVideoPtr PokeMini_VideoBlit = NULL; + +int PokeMini_SetVideo(TPokeMini_VideoSpec *videospec, int bpp, int dotmatrix, int lcdmode) +{ + if (!videospec) return 0; + PokeMini_VideoCurrent = (TPokeMini_VideoSpec *)videospec; + PokeMini_VideoBlit16 = PokeMini_VideoCurrent->Get16(dotmatrix, lcdmode); + PokeMini_VideoBlit32 = PokeMini_VideoCurrent->Get32(dotmatrix, lcdmode); + if (bpp == 32) { + PokeMini_VideoBlit = (TPokeMini_DrawVideoPtr)PokeMini_VideoBlit32; + PokeMini_VideoDepth = 32; + } else { + PokeMini_VideoBlit = (TPokeMini_DrawVideoPtr)PokeMini_VideoBlit16; + PokeMini_VideoDepth = 16; + } + return PokeMini_VideoDepth; +} + +void PokeMini_VideoRect_32(uint32_t *screen, int pitchW, int x, int y, int width, int height, uint32_t color) +{ + int xc, yc; + screen += (y * pitchW) + x; + for (yc=0; yc 255) value = 255; + curve = 255 - value; + curve = 255 - (curve * curve * curve / 65536); + return Interpolate8(value, curve, strength); +} + +void PokeMini_VideoPalette_32(uint32_t P0Color, uint32_t P1Color, int contrastboost, int brightoffset) +{ + int i; + contrastboost = contrastboost * 255 / 100; + brightoffset = brightoffset * 255 / 100; + if (!VidPalette32) VidPalette32 = (uint32_t *)malloc(256*4); + for (i=0; i<256; i++) VidPalette32[i] = InterpolateRGB24(P0Color, P1Color, ExpCurve(i - brightoffset, contrastboost)); + if (VidPixelLayout) { + VidPalColor32 = (uint32_t *)PokeMini_ColorPalRGB32; + } else { + VidPalColor32 = (uint32_t *)PokeMini_ColorPalBGR32; + } + if (VidEnableHighcolor) { + if (!VidPalColorH32) VidPalColorH32 = (uint32_t *)malloc(256*256*4); + if (VidPixelLayout) { + for (i=0; i<256*256; i++) VidPalColorH32[i] = InterpolateRGB24(VidPalColor32[i & 255], VidPalColor32[i >> 8], 128); + } else { + for (i=0; i<256*256; i++) VidPalColorH32[i] = InterpolateRGB24(VidPalColor32[i & 255], VidPalColor32[i >> 8], 128); + } + } +} + +void PokeMini_VideoPalette_16(uint16_t P0Color, uint16_t P1Color, int contrastboost, int brightoffset) +{ + int i; + contrastboost = contrastboost * 255 / 100; + brightoffset = brightoffset * 255 / 100; + if (!VidPalette16) VidPalette16 = (uint16_t *)malloc(256*2); + if (VidPixelLayout == PokeMini_RGB15) { + // RGB 15-Bits + for (i=0; i<256; i++) VidPalette16[i] = InterpolateRGB15(P0Color, P1Color, ExpCurve(i - brightoffset, contrastboost)); + } else { + // *** 16-Bits + for (i=0; i<256; i++) VidPalette16[i] = InterpolateRGB16(P0Color, P1Color, ExpCurve(i - brightoffset, contrastboost)); + } + if (VidPixelLayout == PokeMini_RGB15) { + // RGB 15-Bits + VidPalColor16 = (uint16_t *)PokeMini_ColorPalRGB15; + } else if (VidPixelLayout == PokeMini_RGB16) { + // RGB 16-Bits + VidPalColor16 = (uint16_t *)PokeMini_ColorPalRGB16; + } else { + // BGR 16-Bits + VidPalColor16 = (uint16_t *)PokeMini_ColorPalBGR16; + } + if (VidEnableHighcolor) { + if (!VidPalColorH16) VidPalColorH16 = (uint16_t *)malloc(256*256*2); + if (VidPixelLayout == PokeMini_RGB15) { + // RGB 15-Bits + for (i=0; i<256*256; i++) VidPalColorH16[i] = InterpolateRGB15(VidPalColor16[i & 255], VidPalColor16[i >> 8], 128); + } else if (VidPixelLayout == PokeMini_RGB16) { + // RGB 16-Bits + for (i=0; i<256*256; i++) VidPalColorH16[i] = InterpolateRGB16(VidPalColor16[i & 255], VidPalColor16[i >> 8], 128); + } else { + // BGR 16-Bits + for (i=0; i<256*256; i++) VidPalColorH16[i] = InterpolateRGB16(VidPalColor16[i & 255], VidPalColor16[i >> 8], 128); + } + } +} + +void PokeMini_VideoPalette_Free(void) +{ + if (VidPalette32) { free(VidPalette32); VidPalette32 = NULL; } + if (VidPalette16) { free(VidPalette16); VidPalette16 = NULL; } + if (VidPalColorH32) { free(VidPalColorH32); VidPalColorH32 = NULL; } + if (VidPalColorH16) { free(VidPalColorH16); VidPalColorH16 = NULL; } +} + +void PokeMini_VideoPalette_Convert(uint32_t bgr32, int pixellayout, uint32_t *out32, uint16_t *out16) +{ + int r = GetValH24(bgr32); + int g = GetValM24(bgr32); + int b = GetValL24(bgr32); + switch (pixellayout & 15) { + case PokeMini_BGR16: // BGR32 / BGR16 + if (out32) *out32 = (r << 16) | (g << 8) | b; + if (out16) *out16 = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); + return; + case PokeMini_RGB16: // RGB32 / RGB16 + if (out32) *out32 = (b << 16) | (g << 8) | r; + if (out16) *out16 = ((b >> 3) << 11) | ((g >> 2) << 5) | (r >> 3); + return; + case PokeMini_RGB15: // RGB15 + if (out32) *out32 = (b << 16) | (g << 8) | r; + if (out16) *out16 = ((b >> 3) << 10) | ((g >> 3) << 5) | (r >> 3) | 0x8000; + return; + } +} + +void PokeMini_VideoPalette_Index(int index, uint32_t *CustomMonoPal, int contrastboost, int brightoffset) +{ + uint32_t p0_32 = 0xFFFFFF, p1_32 = 0x000000; + uint16_t p0_16 = 0xFFFF, p1_16 = 0x0000; + + switch (index) { + default:// Default + PokeMini_VideoPalette_Convert(0xB4C8B4, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x122412, VidPixelLayout, &p1_32, &p1_16); + break; + case 1: // Old PokeMini + PokeMini_VideoPalette_Convert(0x8EAD92, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x4A5542, VidPixelLayout, &p1_32, &p1_16); + break; + case 2: // Black & White + PokeMini_VideoPalette_Convert(0xFFFFFF, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p1_32, &p1_16); + break; + case 3: // Green Palette + PokeMini_VideoPalette_Convert(0x00FF00, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p1_32, &p1_16); + break; + case 4: // Green Vector + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x00FF00, VidPixelLayout, &p1_32, &p1_16); + break; + case 5: // Red Palette + PokeMini_VideoPalette_Convert(0xFF0000, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p1_32, &p1_16); + break; + case 6: // Red Vector + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0xFF0000, VidPixelLayout, &p1_32, &p1_16); + break; + case 7: // Blue LCD + PokeMini_VideoPalette_Convert(0xC0C0FF, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x4040FF, VidPixelLayout, &p1_32, &p1_16); + break; + case 8: // LED Backlight + PokeMini_VideoPalette_Convert(0xD4D4CF, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x2A2A17, VidPixelLayout, &p1_32, &p1_16); + break; + case 9: // Girlish + PokeMini_VideoPalette_Convert(0xFF80E0, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0xA01880, VidPixelLayout, &p1_32, &p1_16); + break; + case 10: // Blue Palette + PokeMini_VideoPalette_Convert(0x0000FF, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p1_32, &p1_16); + break; + case 11: // Blue Vector + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x0000FF, VidPixelLayout, &p1_32, &p1_16); + break; + case 12: // Sepia + PokeMini_VideoPalette_Convert(0xD4BC8C, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0x704214, VidPixelLayout, &p1_32, &p1_16); + break; + case 13: // Inv. B&W + PokeMini_VideoPalette_Convert(0x000000, VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(0xFFFFFF, VidPixelLayout, &p1_32, &p1_16); + break; + case 14: // Custom 1 + if (CustomMonoPal) { + PokeMini_VideoPalette_Convert(CustomMonoPal[0], VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(CustomMonoPal[1], VidPixelLayout, &p1_32, &p1_16); + } + break; + case 15: // Custom 2 + if (CustomMonoPal) { + PokeMini_VideoPalette_Convert(CustomMonoPal[2], VidPixelLayout, &p0_32, &p0_16); + PokeMini_VideoPalette_Convert(CustomMonoPal[3], VidPixelLayout, &p1_32, &p1_16); + } + break; + } + PokeMini_VideoPalette_32(p0_32, p1_32, contrastboost, brightoffset); + PokeMini_VideoPalette_16(p0_16, p1_16, contrastboost, brightoffset); +} + +void PokeMini_VideoPreview_32(uint32_t *screen, int pitchW, int lcdmode) +{ + switch (lcdmode) { + case LCDMODE_3SHADES: PokeMini_VideoPreview3_32(screen, pitchW); break; + case LCDMODE_2SHADES: PokeMini_VideoPreview2_32(screen, pitchW); break; + case LCDMODE_COLORS: + if (VidEnableHighcolor) PokeMini_VideoPreviewCH_32(screen, pitchW); + else PokeMini_VideoPreviewC_32(screen, pitchW); + break; + default: PokeMini_VideoPreviewA_32(screen, pitchW); break; + } +} + +void PokeMini_VideoPreview_16(uint16_t *screen, int pitchW, int lcdmode) +{ + switch (lcdmode) { + case LCDMODE_3SHADES: PokeMini_VideoPreview3_16(screen, pitchW); break; + case LCDMODE_2SHADES: PokeMini_VideoPreview2_16(screen, pitchW); break; + case LCDMODE_COLORS: + if (VidEnableHighcolor) PokeMini_VideoPreviewCH_16(screen, pitchW); + else PokeMini_VideoPreviewC_16(screen, pitchW); + break; + default: PokeMini_VideoPreviewA_16(screen, pitchW); break; + } +} + +void PokeMini_VideoPreview2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + uint32_t pix0, pix1; + + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDP++]) screen[xk] = pix1; + else screen[xk] = pix0; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreview2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + uint32_t pix0, pix1; + + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDP++]) screen[xk] = pix1; + else screen[xk] = pix0; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreviewA_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + screen[xk] = VidPalette32[LCDPixelsA[LCDP++]]; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreviewA_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + screen[xk] = VidPalette16[LCDPixelsA[LCDP++]]; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreview3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDP] + LCDPixelsA[LCDP]) { + case 2: screen[xk] = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: screen[xk] = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: screen[xk] = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + LCDP++; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreview3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDP] + LCDPixelsA[LCDP]) { + case 2: screen[xk] = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: screen[xk] = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: screen[xk] = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + LCDP++; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreviewC_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + screen[xk] = VidPalColor32[PRCColorPixels[LCDP++]]; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreviewC_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + screen[xk] = VidPalColor16[PRCColorPixels[LCDP++]]; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreviewCH_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + screen[xk] = VidPalColorH32[PRCColorPixels[LCDP] * 256 + PRCColorPixelsOld[LCDP]]; + LCDP++; + } + screen += pitchW; + } +} + +void PokeMini_VideoPreviewCH_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDP = 0; + + for (yk=0; yk<64; yk++) { + for (xk=0; xk<96; xk++) { + screen[xk] = VidPalColorH16[PRCColorPixels[LCDP] * 256 + PRCColorPixelsOld[LCDP]]; + LCDP++; + } + screen += pitchW; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video.h b/PVPokeMini/PokeMini/pokemini-code/source/Video.h new file mode 100644 index 0000000000..0c1d3ee330 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video.h @@ -0,0 +1,155 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO +#define POKEMINI_VIDEO + +#include + +#define GetValL24(a) ((a) & 255) +#define GetValM24(a) (((a) >> 8) & 255) +#define GetValH24(a) (((a) >> 16) & 255) +#ifndef RGB24 +#define RGB24(r, g, b) ((r) | ((g) << 8) | ((b) << 16)) +#endif + +#define GetValL16(a) ((a) & 31) +#define GetValM16(a) (((a) >> 5) & 63) +#define GetValH16(a) (((a) >> 11) & 31) +#ifndef RGB16 +#define RGB16(r, g, b) ((r) | ((g) << 5) | ((b) << 11)) +#endif + +#define GetValL15(a) ((a) & 31) +#define GetValM15(a) (((a) >> 5) & 31) +#define GetValH15(a) (((a) >> 10) & 31) +#ifndef RGB15 +#define RGB15(r, g, b) ((r) | ((g) << 5) | ((b) << 10)) +#endif + +typedef void (*TPokeMini_DrawVideo16)(uint16_t *, int); +typedef void (*TPokeMini_DrawVideo32)(uint32_t *, int); +typedef void (*TPokeMini_DrawVideoPtr)(void *, int); + +typedef TPokeMini_DrawVideo16 (*TPokeMini_GetVideo16)(int, int); +typedef TPokeMini_DrawVideo32 (*TPokeMini_GetVideo32)(int, int); + +typedef struct { + int WScale; + int HScale; + TPokeMini_GetVideo16 Get16; + TPokeMini_GetVideo32 Get32; +} TPokeMini_VideoSpec; + +#ifndef inline +#define inline __inline +#endif + +static inline int Interpolate8(int a, int b, int pos) +{ + return ((255-pos) * a + pos * b) >> 8; +} + +static inline int Interpolate16(int a, int b, int pos) +{ + return ((255-pos) * a + pos * b) >> 16; +} + +static inline uint32_t InterpolateRGB24(uint32_t src, uint32_t des, int dir) +{ + int r = Interpolate8((int)GetValL24(src), (int)GetValL24(des), dir); + int g = Interpolate8((int)GetValM24(src), (int)GetValM24(des), dir); + int b = Interpolate8((int)GetValH24(src), (int)GetValH24(des), dir); + return RGB24(r, g, b); +} + +static inline uint16_t InterpolateRGB16(uint16_t src, uint16_t des, int dir) +{ + int r = Interpolate8((int)GetValL16(src), (int)GetValL16(des), dir); + int g = Interpolate8((int)GetValM16(src), (int)GetValM16(des), dir); + int b = Interpolate8((int)GetValH16(src), (int)GetValH16(des), dir); + return RGB16(r, g, b); +} + +static inline uint16_t InterpolateRGB15(uint16_t src, uint16_t des, int dir) +{ + int r = Interpolate8((int)GetValL15(src), (int)GetValL15(des), dir); + int g = Interpolate8((int)GetValM15(src), (int)GetValM15(des), dir); + int b = Interpolate8((int)GetValH15(src), (int)GetValH15(des), dir); + return RGB15(r, g, b) | 0x8000; +} + +// For Graphics Filtering +enum { + PokeMini_NoFilter = 0, + PokeMini_Matrix, + PokeMini_Scanline +}; + +// For Pixel Layout +enum { + PokeMini_BGR16 = 0, + PokeMini_RGB16, + PokeMini_RGB15, + PokeMini_BGR32 = 16, + PokeMini_RGB32 +}; + +extern int VidPixelLayout; +extern int VidEnableHighcolor; +extern uint32_t *VidPalette32; +extern uint16_t *VidPalette16; +extern uint32_t *VidPalColor32; +extern uint16_t *VidPalColor16; +extern uint32_t *VidPalColorH32; +extern uint16_t *VidPalColorH16; +extern TPokeMini_VideoSpec *PokeMini_VideoCurrent; +extern int PokeMini_VideoDepth; +extern TPokeMini_DrawVideo16 PokeMini_VideoBlit16; +extern TPokeMini_DrawVideo32 PokeMini_VideoBlit32; +extern TPokeMini_DrawVideoPtr PokeMini_VideoBlit; + +// Set video, return bpp +int PokeMini_SetVideo(TPokeMini_VideoSpec *videospec, int bpp, int filter, int lcdmode); + +// Drawing rectangle +void PokeMini_VideoRect_32(uint32_t *screen, int pitchW, int x, int y, int width, int height, uint32_t color); +void PokeMini_VideoRect_16(uint16_t *screen, int pitchW, int x, int y, int width, int height, uint16_t color); + +// Video palette handling +void PokeMini_VideoPalette_Init(int pixellayout, int enablehighcolor); +void PokeMini_VideoPalette_32(uint32_t P0Color, uint32_t P1Color, int contrastboost, int brightoffset); +void PokeMini_VideoPalette_16(uint16_t P0Color, uint16_t P1Color, int contrastboost, int brightoffset); +void PokeMini_VideoPalette_Index(int index, uint32_t *CustomMonoPal, int contrastboost, int brightoffset); +void PokeMini_VideoPalette_Free(void); + +// Render to a preview 96x64 buffer +void PokeMini_VideoPreview_32(uint32_t *screen, int pitchW, int lcdmode); +void PokeMini_VideoPreview_16(uint16_t *screen, int pitchW, int lcdmode); +void PokeMini_VideoPreviewA_32(uint32_t *screen, int pitchW); +void PokeMini_VideoPreviewA_16(uint16_t *screen, int pitchW); +void PokeMini_VideoPreview2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoPreview2_16(uint16_t *screen, int pitchW); +void PokeMini_VideoPreview3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoPreview3_16(uint16_t *screen, int pitchW); +void PokeMini_VideoPreviewC_32(uint32_t *screen, int pitchW); +void PokeMini_VideoPreviewC_16(uint16_t *screen, int pitchW); +void PokeMini_VideoPreviewCH_32(uint32_t *screen, int pitchW); +void PokeMini_VideoPreviewCH_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x1.c b/PVPokeMini/PokeMini/pokemini-code/source/Video_x1.c new file mode 100644 index 0000000000..70dabc1392 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x1.c @@ -0,0 +1,233 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video.h" +#include "Video_x1.h" + +const TPokeMini_VideoSpec PokeMini_Video1x1 = { + 1, 1, + PokeMini_GetVideo1x1_16, + PokeMini_GetVideo1x1_32 +}; + +TPokeMini_DrawVideo32 PokeMini_GetVideo1x1_32(int filter, int lcdmode) +{ + switch (lcdmode) { + case 3: if (filter == PokeMini_Matrix) return (VidEnableHighcolor) ? PokeMini_VideoColorH1x1_32 : PokeMini_VideoColor1x1_32; + else return PokeMini_VideoColor1x1_32; + case 2: return PokeMini_Video2None1x1_32; + case 1: return PokeMini_Video3None1x1_32; + default: return PokeMini_VideoANone1x1_32; + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo1x1_16(int filter, int lcdmode) +{ + switch (lcdmode) { + case 3: if (filter == PokeMini_Matrix) return (VidEnableHighcolor) ? PokeMini_VideoColorH1x1_16 : PokeMini_VideoColor1x1_16; + else return PokeMini_VideoColor1x1_16; + case 2: return PokeMini_Video2None1x1_16; + case 1: return PokeMini_Video3None1x1_16; + default: return PokeMini_VideoANone1x1_16; + } +} + +void PokeMini_VideoANone1x1_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone1x1_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None1x1_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None1x1_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None1x1_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None1x1_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor1x1_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor1x1_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH1x1_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH1x1_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x1.h b/PVPokeMini/PokeMini/pokemini-code/source/Video_x1.h new file mode 100644 index 0000000000..02c2447493 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x1.h @@ -0,0 +1,49 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO_X1 +#define POKEMINI_VIDEO_X1 + +#include + +// Video specs +extern const TPokeMini_VideoSpec PokeMini_Video1x1; + +// Return the best blitter +TPokeMini_DrawVideo32 PokeMini_GetVideo1x1_32(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo1x1_16(int filter, int lcdmode); + +// Render to 96x64, analog +void PokeMini_VideoANone1x1_32(uint32_t *screen, int pitchW); +void PokeMini_VideoANone1x1_16(uint16_t *screen, int pitchW); + +// Render to 96x64, 3-colors +void PokeMini_Video3None1x1_32(uint32_t *screen, int pitchW); +void PokeMini_Video3None1x1_16(uint16_t *screen, int pitchW); + +// Render to 96x64, 2-colors +void PokeMini_Video2None1x1_32(uint32_t *screen, int pitchW); +void PokeMini_Video2None1x1_16(uint16_t *screen, int pitchW); + +// Render to 96x64, unofficial colors +void PokeMini_VideoColor1x1_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColor1x1_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorH1x1_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorH1x1_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x2.c b/PVPokeMini/PokeMini/pokemini-code/source/Video_x2.c new file mode 100644 index 0000000000..e1bd302034 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x2.c @@ -0,0 +1,967 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video_x2.h" + +const TPokeMini_VideoSpec PokeMini_Video2x2 = { + 2, 2, + PokeMini_GetVideo2x2_16, + PokeMini_GetVideo2x2_32 +}; + +const TPokeMini_VideoSpec PokeMini_Video2x2_NDS = { // For NDS + 2, 2, + PokeMini_GetVideo2x2_8P, + PokeMini_GetVideo2x2_32 +}; + +const int LCDMask2x2[2*2] = { + 256, 192, + 192, 160, +}; + +TPokeMini_DrawVideo32 PokeMini_GetVideo2x2_32(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL2x2_32; + case 2: return PokeMini_Video2ScanLine2x2_32; + case 1: return PokeMini_Video3ScanLine2x2_32; + default: return PokeMini_VideoAScanLine2x2_32; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH2x2_32 : PokeMini_VideoColor2x2_32; + case 2: return PokeMini_Video2Matrix2x2_32; + case 1: return PokeMini_Video3Matrix2x2_32; + default: return PokeMini_VideoAMatrix2x2_32; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor2x2_32; + case 2: return PokeMini_Video2None2x2_32; + case 1: return PokeMini_Video3None2x2_32; + default: return PokeMini_VideoANone2x2_32; + } + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo2x2_16(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL2x2_16; + case 2: return PokeMini_Video2ScanLine2x2_16; + case 1: return PokeMini_Video3ScanLine2x2_16; + default: return PokeMini_VideoAScanLine2x2_16; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH2x2_16 : PokeMini_VideoColor2x2_16; + case 2: return PokeMini_Video2Matrix2x2_16; + case 1: return PokeMini_Video3Matrix2x2_16; + default: return PokeMini_VideoAMatrix2x2_16; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor2x2_16; + case 2: return PokeMini_Video2None2x2_16; + case 1: return PokeMini_Video3None2x2_16; + default: return PokeMini_VideoANone2x2_16; + } + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo2x2_8P(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL2x2_8P; + case 2: return PokeMini_Video2ScanLine2x2_8P; + case 1: return PokeMini_Video3ScanLine2x2_8P; + default: return PokeMini_VideoAScanLine2x2_8P; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return PokeMini_VideoColor2x2_8P; + case 2: return PokeMini_Video2Matrix2x2_8P; + case 1: return PokeMini_Video3Matrix2x2_8P; + default: return PokeMini_VideoAMatrix2x2_8P; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor2x2_8P; + case 2: return PokeMini_Video2None2x2_8P; + case 1: return PokeMini_Video3None2x2_8P; + default: return PokeMini_VideoANone2x2_8P; + } + } +} + +void PokeMini_VideoAScanLine2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 192*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAScanLine2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 192*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAScanLine2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = LCDPixelsA[LCDY + xk]; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<(96>>2); xk++) { + *ptr++ = 0; *ptr++ = 0; + *ptr++ = 0; *ptr++ = 0; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + memset(screen, 0, 192*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + memset(screen, 0, 192*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = MinxLCD.Pixel1Intensity; break; + case 1: pix = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: pix = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<(96>>2); xk++) { + *ptr++ = 0; *ptr++ = 0; + *ptr++ = 0; *ptr++ = 0; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + memset(screen, 0, 192*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + memset(screen, 0, 192*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = MinxLCD.Pixel1Intensity; + else pix = MinxLCD.Pixel0Intensity; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<(96>>2); xk++) { + *ptr++ = 0; *ptr++ = 0; + *ptr++ = 0; *ptr++ = 0; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAMatrix2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette32[level * LCDMask2x2[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask2x2[maskH+1] >> 8]; + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoAMatrix2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette16[level * LCDMask2x2[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask2x2[maskH+1] >> 8]; + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoAMatrix2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = (level * LCDMask2x2[maskH] >> 8) | ((level * LCDMask2x2[maskH+1]) & 0xFF00); + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette32[level * LCDMask2x2[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask2x2[maskH+1] >> 8]; + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette16[level * LCDMask2x2[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask2x2[maskH+1] >> 8]; + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = (level * LCDMask2x2[maskH] >> 8) | ((level * LCDMask2x2[maskH+1]) & 0xFF00); + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette32[level * LCDMask2x2[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask2x2[maskH+1] >> 8]; + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette16[level * LCDMask2x2[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask2x2[maskH+1] >> 8]; + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*2; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = (level * LCDMask2x2[maskH] >> 8) | ((level * LCDMask2x2[maskH+1]) & 0xFF00); + } + screen += pitchW; + maskH += 2; + if (maskH >= 4) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoANone2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = LCDPixelsA[LCDY + xk]; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = LCDPixelsA[LCDY + xk]; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = MinxLCD.Pixel1Intensity; break; + case 1: pix = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: pix = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = MinxLCD.Pixel1Intensity; break; + case 1: pix = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: pix = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = MinxLCD.Pixel1Intensity; + else pix = MinxLCD.Pixel0Intensity; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = MinxLCD.Pixel1Intensity; + else pix = MinxLCD.Pixel0Intensity; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +// WARNING! Color palette should be in CRAM! +void PokeMini_VideoColor2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = PRCColorPixels[LCDY + xk]; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = PRCColorPixels[LCDY + xk]; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<(96>>2); xk++) { + *ptr++ = 0; *ptr++ = 0; + *ptr++ = 0; *ptr++ = 0; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<(96>>2); xk++) { + *ptr++ = 0; *ptr++ = 0; + *ptr++ = 0; *ptr++ = 0; + } + screen += pitchW; + LCDY += 96; + } +} + +// WARNING! Color palette should be in CRAM! +void PokeMini_VideoColorL2x2_8P(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = PRCColorPixels[LCDY + xk]; + *ptr++ = pix | (pix << 8); + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<(96>>2); xk++) { + *ptr++ = 0; *ptr++ = 0; + *ptr++ = 0; *ptr++ = 0; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH2x2_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH2x2_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x2.h b/PVPokeMini/PokeMini/pokemini-code/source/Video_x2.h new file mode 100644 index 0000000000..9a682eb2f1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x2.h @@ -0,0 +1,88 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO_X2 +#define POKEMINI_VIDEO_X2 + +#include + +// Video specs +extern const TPokeMini_VideoSpec PokeMini_Video2x2; +extern const TPokeMini_VideoSpec PokeMini_Video2x2_NDS; // For NDS + +// Return the best blitter +TPokeMini_DrawVideo32 PokeMini_GetVideo2x2_32(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo2x2_16(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo2x2_8P(int filter, int lcdmode); + +// Render to 192x128, analog + scanline +void PokeMini_VideoAScanLine2x2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAScanLine2x2_16(uint16_t *screen, int pitchW); +void PokeMini_VideoAScanLine2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, 3-colors + scanline +void PokeMini_Video3ScanLine2x2_32(uint32_t *screen, int pitchW); +void PokeMini_Video3ScanLine2x2_16(uint16_t *screen, int pitchW); +void PokeMini_Video3ScanLine2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, 2-colors + scanline +void PokeMini_Video2ScanLine2x2_32(uint32_t *screen, int pitchW); +void PokeMini_Video2ScanLine2x2_16(uint16_t *screen, int pitchW); +void PokeMini_Video2ScanLine2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, analog + dot matrix +void PokeMini_VideoAMatrix2x2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAMatrix2x2_16(uint16_t *screen, int pitchW); +void PokeMini_VideoAMatrix2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, 3-colors + dot matrix +void PokeMini_Video3Matrix2x2_32(uint32_t *screen, int pitchW); +void PokeMini_Video3Matrix2x2_16(uint16_t *screen, int pitchW); +void PokeMini_Video3Matrix2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, 2-colors + dot matrix +void PokeMini_Video2Matrix2x2_32(uint32_t *screen, int pitchW); +void PokeMini_Video2Matrix2x2_16(uint16_t *screen, int pitchW); +void PokeMini_Video2Matrix2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, analog +void PokeMini_VideoANone2x2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoANone2x2_16(uint16_t *screen, int pitchW); +void PokeMini_VideoANone2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, 3-colors +void PokeMini_Video3None2x2_32(uint32_t *screen, int pitchW); +void PokeMini_Video3None2x2_16(uint16_t *screen, int pitchW); +void PokeMini_Video3None2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, 2-colors +void PokeMini_Video2None2x2_32(uint32_t *screen, int pitchW); +void PokeMini_Video2None2x2_16(uint16_t *screen, int pitchW); +void PokeMini_Video2None2x2_8P(uint16_t *screen, int pitchW); + +// Render to 192x128, unofficial colors +void PokeMini_VideoColor2x2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColor2x2_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColor2x2_8P(uint16_t *screen, int pitchW); +void PokeMini_VideoColorL2x2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorL2x2_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorL2x2_8P(uint16_t *screen, int pitchW); +void PokeMini_VideoColorH2x2_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorH2x2_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x3.c b/PVPokeMini/PokeMini/pokemini-code/source/Video_x3.c new file mode 100644 index 0000000000..01d1f5cf2b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x3.c @@ -0,0 +1,884 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video_x3.h" + +const TPokeMini_VideoSpec PokeMini_Video3x3 = { + 3, 3, + PokeMini_GetVideo3x3_16, + PokeMini_GetVideo3x3_32 +}; + +const int LCDMask3x3[3*3] = { + 240, 256, 128, + 256, 256, 160, + 128, 160, 160 +}; + +TPokeMini_DrawVideo32 PokeMini_GetVideo3x3_32(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL3x3_32; + case 2: return PokeMini_Video2ScanLine3x3_32; + case 1: return PokeMini_Video3ScanLine3x3_32; + default: return PokeMini_VideoAScanLine3x3_32; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH3x3_32 : PokeMini_VideoColor3x3_32; + case 2: return PokeMini_Video2Matrix3x3_32; + case 1: return PokeMini_Video3Matrix3x3_32; + default: return PokeMini_VideoAMatrix3x3_32; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor3x3_32; + case 2: return PokeMini_Video2None3x3_32; + case 1: return PokeMini_Video3None3x3_32; + default: return PokeMini_VideoANone3x3_32; + } + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo3x3_16(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL3x3_16; + case 2: return PokeMini_Video2ScanLine3x3_16; + case 1: return PokeMini_Video3ScanLine3x3_16; + default: return PokeMini_VideoAScanLine3x3_16; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH3x3_16 : PokeMini_VideoColor3x3_16; + case 2: return PokeMini_Video2Matrix3x3_16; + case 1: return PokeMini_Video3Matrix3x3_16; + default: return PokeMini_VideoAMatrix3x3_16; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor3x3_16; + case 2: return PokeMini_Video2None3x3_16; + case 1: return PokeMini_Video3None3x3_16; + default: return PokeMini_VideoANone3x3_16; + } + } +} + +void PokeMini_VideoAScanLine3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAScanLine3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAMatrix3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*3; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH+2] >> 8]; + } + screen += pitchW; + maskH += 3; + if (maskH >= 9) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoAMatrix3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*3; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH+2] >> 8]; + } + screen += pitchW; + maskH += 3; + if (maskH >= 9) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*3; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette32[level * LCDMask3x3[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH+2] >> 8]; + } + screen += pitchW; + maskH += 3; + if (maskH >= 9) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*3; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette16[level * LCDMask3x3[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH+2] >> 8]; + } + screen += pitchW; + maskH += 3; + if (maskH >= 9) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*3; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask3x3[maskH+2] >> 8]; + } + screen += pitchW; + maskH += 3; + if (maskH >= 9) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*3; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask3x3[maskH+2] >> 8]; + } + screen += pitchW; + maskH += 3; + if (maskH >= 9) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoANone3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 288*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 288*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH3x3_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH3x3_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x3.h b/PVPokeMini/PokeMini/pokemini-code/source/Video_x3.h new file mode 100644 index 0000000000..1ea396db7a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x3.h @@ -0,0 +1,75 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO_X3 +#define POKEMINI_VIDEO_X3 + +#include + +// Video specs +extern const TPokeMini_VideoSpec PokeMini_Video3x3; + +// Return the best blitter +TPokeMini_DrawVideo32 PokeMini_GetVideo3x3_32(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo3x3_16(int filter, int lcdmode); + +// Render to 288x192, analog + scanline +void PokeMini_VideoAScanLine3x3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAScanLine3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, 3-colors + scanline +void PokeMini_Video3ScanLine3x3_32(uint32_t *screen, int pitchW); +void PokeMini_Video3ScanLine3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, 2-colors + scanline +void PokeMini_Video2ScanLine3x3_32(uint32_t *screen, int pitchW); +void PokeMini_Video2ScanLine3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, analog + dot matrix +void PokeMini_VideoAMatrix3x3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAMatrix3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, 3-colors + dot matrix +void PokeMini_Video3Matrix3x3_32(uint32_t *screen, int pitchW); +void PokeMini_Video3Matrix3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, 2-colors + dot matrix +void PokeMini_Video2Matrix3x3_32(uint32_t *screen, int pitchW); +void PokeMini_Video2Matrix3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, analog +void PokeMini_VideoANone3x3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoANone3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, 3-colors +void PokeMini_Video3None3x3_32(uint32_t *screen, int pitchW); +void PokeMini_Video3None3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, 2-colors +void PokeMini_Video2None3x3_32(uint32_t *screen, int pitchW); +void PokeMini_Video2None3x3_16(uint16_t *screen, int pitchW); + +// Render to 288x192, unofficial colors +void PokeMini_VideoColor3x3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColor3x3_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorL3x3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorL3x3_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorH3x3_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorH3x3_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x4.c b/PVPokeMini/PokeMini/pokemini-code/source/Video_x4.c new file mode 100644 index 0000000000..e505bc16c2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x4.c @@ -0,0 +1,879 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video_x4.h" + +const TPokeMini_VideoSpec PokeMini_Video4x4 = { + 4, 4, + PokeMini_GetVideo4x4_16, + PokeMini_GetVideo4x4_32 +}; + +const int LCDMask4x4[4*4] = { + 240, 256, 240, 128, + 256, 256, 256, 160, + 240, 256, 240, 192, + 128, 160, 192, 160 +}; + +TPokeMini_DrawVideo32 PokeMini_GetVideo4x4_32(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL4x4_32; + case 2: return PokeMini_Video2ScanLine4x4_32; + case 1: return PokeMini_Video3ScanLine4x4_32; + default: return PokeMini_VideoAScanLine4x4_32; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH4x4_32 : PokeMini_VideoColor4x4_32; + case 2: return PokeMini_Video2Matrix4x4_32; + case 1: return PokeMini_Video3Matrix4x4_32; + default: return PokeMini_VideoAMatrix4x4_32; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor4x4_32; + case 2: return PokeMini_Video2None4x4_32; + case 1: return PokeMini_Video3None4x4_32; + default: return PokeMini_VideoANone4x4_32; + } + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo4x4_16(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL4x4_16; + case 2: return PokeMini_Video2ScanLine4x4_16; + case 1: return PokeMini_Video3ScanLine4x4_16; + default: return PokeMini_VideoAScanLine4x4_16; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH4x4_16 : PokeMini_VideoColor4x4_16; + case 2: return PokeMini_Video2Matrix4x4_16; + case 1: return PokeMini_Video3Matrix4x4_16; + default: return PokeMini_VideoAMatrix4x4_16; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor4x4_16; + case 2: return PokeMini_Video2None4x4_16; + case 1: return PokeMini_Video3None4x4_16; + default: return PokeMini_VideoANone4x4_16; + } + } +} + +void PokeMini_VideoAScanLine4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAScanLine4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAMatrix4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*4; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+3] >> 8]; + } + screen += pitchW; + maskH += 4; + if (maskH >= 16) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoAMatrix4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*4; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+3] >> 8]; + } + screen += pitchW; + maskH += 4; + if (maskH >= 16) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*4; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette32[level * LCDMask4x4[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+3] >> 8]; + } + screen += pitchW; + maskH += 4; + if (maskH >= 16) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*4; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette16[level * LCDMask4x4[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+3] >> 8]; + } + screen += pitchW; + maskH += 4; + if (maskH >= 16) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*4; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask4x4[maskH+3] >> 8]; + } + screen += pitchW; + maskH += 4; + if (maskH >= 16) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*4; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask4x4[maskH+3] >> 8]; + } + screen += pitchW; + maskH += 4; + if (maskH >= 16) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoANone4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 384*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH4x4_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH4x4_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x4.h b/PVPokeMini/PokeMini/pokemini-code/source/Video_x4.h new file mode 100644 index 0000000000..2d8ca6dd85 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x4.h @@ -0,0 +1,75 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO_X4 +#define POKEMINI_VIDEO_X4 + +#include + +// Video specs +extern const TPokeMini_VideoSpec PokeMini_Video4x4; + +// Return the best blitter +TPokeMini_DrawVideo32 PokeMini_GetVideo4x4_32(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo4x4_16(int filter, int lcdmode); + +// Render to 384x256, analog + scanline +void PokeMini_VideoAScanLine4x4_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAScanLine4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, 3-colors + scanline +void PokeMini_Video3ScanLine4x4_32(uint32_t *screen, int pitchW); +void PokeMini_Video3ScanLine4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, 2-colors + scanline +void PokeMini_Video2ScanLine4x4_32(uint32_t *screen, int pitchW); +void PokeMini_Video2ScanLine4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, analog + dot matrix +void PokeMini_VideoAMatrix4x4_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAMatrix4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, 3-colors + dot matrix +void PokeMini_Video3Matrix4x4_32(uint32_t *screen, int pitchW); +void PokeMini_Video3Matrix4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, 2-colors + dot matrix +void PokeMini_Video2Matrix4x4_32(uint32_t *screen, int pitchW); +void PokeMini_Video2Matrix4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, analog +void PokeMini_VideoANone4x4_32(uint32_t *screen, int pitchW); +void PokeMini_VideoANone4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, 3-colors +void PokeMini_Video3None4x4_32(uint32_t *screen, int pitchW); +void PokeMini_Video3None4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, 2-colors +void PokeMini_Video2None4x4_32(uint32_t *screen, int pitchW); +void PokeMini_Video2None4x4_16(uint16_t *screen, int pitchW); + +// Render to 384x256, unofficial colors +void PokeMini_VideoColor4x4_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColor4x4_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorL4x4_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorL4x4_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorH4x4_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorH4x4_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x5.c b/PVPokeMini/PokeMini/pokemini-code/source/Video_x5.c new file mode 100644 index 0000000000..fe281f3568 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x5.c @@ -0,0 +1,1186 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video_x5.h" + +const TPokeMini_VideoSpec PokeMini_Video5x5 = { + 5, 5, + PokeMini_GetVideo5x5_16, + PokeMini_GetVideo5x5_32 +}; + +const int LCDMask5x5[5*5] = { + 240, 256, 256, 240, 128, + 256, 256, 256, 256, 160, + 256, 256, 256, 256, 160, + 240, 256, 256, 240, 192, + 128, 160, 160, 192, 160 +}; + +TPokeMini_DrawVideo32 PokeMini_GetVideo5x5_32(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL5x5_32; + case 2: return PokeMini_Video2ScanLine5x5_32; + case 1: return PokeMini_Video3ScanLine5x5_32; + default: return PokeMini_VideoAScanLine5x5_32; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH5x5_32 : PokeMini_VideoColor5x5_32; + case 2: return PokeMini_Video2Matrix5x5_32; + case 1: return PokeMini_Video3Matrix5x5_32; + default: return PokeMini_VideoAMatrix5x5_32; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor5x5_32; + case 2: return PokeMini_Video2None5x5_32; + case 1: return PokeMini_Video3None5x5_32; + default: return PokeMini_VideoANone5x5_32; + } + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo5x5_16(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL5x5_16; + case 2: return PokeMini_Video2ScanLine5x5_16; + case 1: return PokeMini_Video3ScanLine5x5_16; + default: return PokeMini_VideoAScanLine5x5_16; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH5x5_16 : PokeMini_VideoColor5x5_16; + case 2: return PokeMini_Video2Matrix5x5_16; + case 1: return PokeMini_Video3Matrix5x5_16; + default: return PokeMini_VideoAMatrix5x5_16; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor5x5_16; + case 2: return PokeMini_Video2None5x5_16; + case 1: return PokeMini_Video3None5x5_16; + default: return PokeMini_VideoANone5x5_16; + } + } +} + +void PokeMini_VideoAScanLine5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAScanLine5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAMatrix5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*5; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+3] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+4] >> 8]; + } + screen += pitchW; + maskH += 5; + if (maskH >= 25) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoAMatrix5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*5; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+3] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+4] >> 8]; + } + screen += pitchW; + maskH += 5; + if (maskH >= 25) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*5; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette32[level * LCDMask5x5[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+3] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+4] >> 8]; + } + screen += pitchW; + maskH += 5; + if (maskH >= 25) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*5; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette16[level * LCDMask5x5[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+3] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+4] >> 8]; + } + screen += pitchW; + maskH += 5; + if (maskH >= 25) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*5; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+3] >> 8]; + *ptr++ = VidPalette32[level * LCDMask5x5[maskH+4] >> 8]; + } + screen += pitchW; + maskH += 5; + if (maskH >= 25) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*5; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+3] >> 8]; + *ptr++ = VidPalette16[level * LCDMask5x5[maskH+4] >> 8]; + } + screen += pitchW; + maskH += 5; + if (maskH >= 25) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoANone5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<32; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 480*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH5x5_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH5x5_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x5.h b/PVPokeMini/PokeMini/pokemini-code/source/Video_x5.h new file mode 100644 index 0000000000..4e5dacef08 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x5.h @@ -0,0 +1,75 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO_X5 +#define POKEMINI_VIDEO_X5 + +#include + +// Video specs +extern const TPokeMini_VideoSpec PokeMini_Video5x5; + +// Return the best blitter +TPokeMini_DrawVideo32 PokeMini_GetVideo5x5_32(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo5x5_16(int filter, int lcdmode); + +// Render to 480x320, analog + scanline +void PokeMini_VideoAScanLine5x5_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAScanLine5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, 3-colors + scanline +void PokeMini_Video3ScanLine5x5_32(uint32_t *screen, int pitchW); +void PokeMini_Video3ScanLine5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, 2-colors + scanline +void PokeMini_Video2ScanLine5x5_32(uint32_t *screen, int pitchW); +void PokeMini_Video2ScanLine5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, analog + dot matrix +void PokeMini_VideoAMatrix5x5_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAMatrix5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, 3-colors + dot matrix +void PokeMini_Video3Matrix5x5_32(uint32_t *screen, int pitchW); +void PokeMini_Video3Matrix5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, 2-colors + dot matrix +void PokeMini_Video2Matrix5x5_32(uint32_t *screen, int pitchW); +void PokeMini_Video2Matrix5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, analog +void PokeMini_VideoANone5x5_32(uint32_t *screen, int pitchW); +void PokeMini_VideoANone5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, 3-colors +void PokeMini_Video3None5x5_32(uint32_t *screen, int pitchW); +void PokeMini_Video3None5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, 2-colors +void PokeMini_Video2None5x5_32(uint32_t *screen, int pitchW); +void PokeMini_Video2None5x5_16(uint16_t *screen, int pitchW); + +// Render to 480x320, unofficial colors +void PokeMini_VideoColor5x5_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColor5x5_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorL5x5_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorL5x5_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorH5x5_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorH5x5_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x6.c b/PVPokeMini/PokeMini/pokemini-code/source/Video_x6.c new file mode 100644 index 0000000000..a3324c8b41 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x6.c @@ -0,0 +1,1107 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "Video_x6.h" + +const TPokeMini_VideoSpec PokeMini_Video6x6 = { + 6, 6, + PokeMini_GetVideo6x6_16, + PokeMini_GetVideo6x6_32 +}; + +const int LCDMask6x6[6*6] = { + 240, 256, 256, 256, 240, 128, + 256, 256, 256, 256, 256, 160, + 256, 256, 256, 256, 256, 160, + 256, 256, 256, 256, 256, 160, + 240, 256, 256, 256, 240, 192, + 128, 160, 160, 160, 192, 160 +}; + +TPokeMini_DrawVideo32 PokeMini_GetVideo6x6_32(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL6x6_32; + case 2: return PokeMini_Video2ScanLine6x6_32; + case 1: return PokeMini_Video3ScanLine6x6_32; + default: return PokeMini_VideoAScanLine6x6_32; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH6x6_32 : PokeMini_VideoColor6x6_32; + case 2: return PokeMini_Video2Matrix6x6_32; + case 1: return PokeMini_Video3Matrix6x6_32; + default: return PokeMini_VideoAMatrix6x6_32; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor6x6_32; + case 2: return PokeMini_Video2None6x6_32; + case 1: return PokeMini_Video3None6x6_32; + default: return PokeMini_VideoANone6x6_32; + } + } +} + +TPokeMini_DrawVideo16 PokeMini_GetVideo6x6_16(int filter, int lcdmode) +{ + if (filter == PokeMini_Scanline) { + switch (lcdmode) { + case 3: return PokeMini_VideoColorL6x6_16; + case 2: return PokeMini_Video2ScanLine6x6_16; + case 1: return PokeMini_Video3ScanLine6x6_16; + default: return PokeMini_VideoAScanLine6x6_16; + } + } else if (filter == PokeMini_Matrix) { + switch (lcdmode) { + case 3: return (VidEnableHighcolor) ? PokeMini_VideoColorH6x6_16 : PokeMini_VideoColor6x6_16; + case 2: return PokeMini_Video2Matrix6x6_16; + case 1: return PokeMini_Video3Matrix6x6_16; + default: return PokeMini_VideoAMatrix6x6_16; + } + } else { + switch (lcdmode) { + case 3: return PokeMini_VideoColor6x6_16; + case 2: return PokeMini_Video2None6x6_16; + case 1: return PokeMini_Video3None6x6_16; + default: return PokeMini_VideoANone6x6_16; + } + } +} + +void PokeMini_VideoAScanLine6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAScanLine6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3ScanLine6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2ScanLine6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoAMatrix6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*6; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+3] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+4] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+5] >> 8]; + } + screen += pitchW; + maskH += 6; + if (maskH >= 36) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoAMatrix6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*6; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + level = LCDPixelsA[LCDY + xk]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+3] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+4] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+5] >> 8]; + } + screen += pitchW; + maskH += 6; + if (maskH >= 36) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*6; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette32[level * LCDMask6x6[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+3] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+4] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+5] >> 8]; + } + screen += pitchW; + maskH += 6; + if (maskH >= 36) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video3Matrix6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*6; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: level = MinxLCD.Pixel1Intensity; break; + case 1: level = (MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1; break; + default: level = MinxLCD.Pixel0Intensity; break; + } + *ptr++ = VidPalette16[level * LCDMask6x6[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+3] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+4] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+5] >> 8]; + } + screen += pitchW; + maskH += 6; + if (maskH >= 36) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint32_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*6; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+1] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+2] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+3] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+4] >> 8]; + *ptr++ = VidPalette32[level * LCDMask6x6[maskH+5] >> 8]; + } + screen += pitchW; + maskH += 6; + if (maskH >= 36) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_Video2Matrix6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, level, LCDY, maskH; + uint16_t *ptr; + + LCDY = 0; + maskH = 0; + for (yk=0; yk<64*6; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) level = MinxLCD.Pixel1Intensity; + else level = MinxLCD.Pixel0Intensity; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+1] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+2] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+3] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+4] >> 8]; + *ptr++ = VidPalette16[level * LCDMask6x6[maskH+5] >> 8]; + } + screen += pitchW; + maskH += 6; + if (maskH >= 36) { + maskH = 0; + LCDY += 96; + } + } +} + +void PokeMini_VideoANone6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette32[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoANone6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalette16[LCDPixelsA[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette32[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette32[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette32[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video3None6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + switch (LCDPixelsD[LCDY + xk] + LCDPixelsA[LCDY + xk]) { + case 2: pix = VidPalette16[MinxLCD.Pixel1Intensity]; break; + case 1: pix = VidPalette16[(MinxLCD.Pixel0Intensity + MinxLCD.Pixel1Intensity) >> 1]; break; + default: pix = VidPalette16[MinxLCD.Pixel0Intensity]; break; + } + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette32[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette32[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_Video2None6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix, pix1, pix0; + + LCDY = 0; + pix1 = VidPalette16[MinxLCD.Pixel1Intensity]; + pix0 = VidPalette16[MinxLCD.Pixel0Intensity]; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + if (LCDPixelsD[LCDY + xk]) pix = pix1; + else pix = pix0; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColor6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor32[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*4); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorL6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColor16[PRCColorPixels[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + memset(screen, 0, 576*2); + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH6x6_32(uint32_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint32_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH32[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} + +void PokeMini_VideoColorH6x6_16(uint16_t *screen, int pitchW) +{ + int xk, yk, LCDY; + uint16_t *ptr, pix; + + LCDY = 0; + for (yk=0; yk<64; yk++) { + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + ptr = screen; + for (xk=0; xk<96; xk++) { + pix = VidPalColorH16[PRCColorPixels[LCDY + xk] * 256 + PRCColorPixelsOld[LCDY + xk]]; + *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; *ptr++ = pix; + } + screen += pitchW; + LCDY += 96; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/source/Video_x6.h b/PVPokeMini/PokeMini/pokemini-code/source/Video_x6.h new file mode 100644 index 0000000000..a0d44c31a6 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/source/Video_x6.h @@ -0,0 +1,75 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINI_VIDEO_X6 +#define POKEMINI_VIDEO_X6 + +#include + +// Video specs +extern const TPokeMini_VideoSpec PokeMini_Video6x6; + +// Return the best blitter +TPokeMini_DrawVideo32 PokeMini_GetVideo6x6_32(int filter, int lcdmode); +TPokeMini_DrawVideo16 PokeMini_GetVideo6x6_16(int filter, int lcdmode); + +// Render to 576x384, analog + scanline +void PokeMini_VideoAScanLine6x6_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAScanLine6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, 3-colors + scanline +void PokeMini_Video3ScanLine6x6_32(uint32_t *screen, int pitchW); +void PokeMini_Video3ScanLine6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, 2-colors + scanline +void PokeMini_Video2ScanLine6x6_32(uint32_t *screen, int pitchW); +void PokeMini_Video2ScanLine6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, analog + dot matrix +void PokeMini_VideoAMatrix6x6_32(uint32_t *screen, int pitchW); +void PokeMini_VideoAMatrix6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, 3-colors + dot matrix +void PokeMini_Video3Matrix6x6_32(uint32_t *screen, int pitchW); +void PokeMini_Video3Matrix6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, 2-colors + dot matrix +void PokeMini_Video2Matrix6x6_32(uint32_t *screen, int pitchW); +void PokeMini_Video2Matrix6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, analog +void PokeMini_VideoANone6x6_32(uint32_t *screen, int pitchW); +void PokeMini_VideoANone6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, 3-colors +void PokeMini_Video3None6x6_32(uint32_t *screen, int pitchW); +void PokeMini_Video3None6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, 2-colors +void PokeMini_Video2None6x6_32(uint32_t *screen, int pitchW); +void PokeMini_Video2None6x6_16(uint16_t *screen, int pitchW); + +// Render to 576x384, unofficial colors +void PokeMini_VideoColor6x6_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColor6x6_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorL6x6_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorL6x6_16(uint16_t *screen, int pitchW); +void PokeMini_VideoColorH6x6_32(uint32_t *screen, int pitchW); +void PokeMini_VideoColorH6x6_16(uint16_t *screen, int pitchW); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportASM.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportASM.c new file mode 100644 index 0000000000..83b3d42e83 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportASM.c @@ -0,0 +1,157 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "ExportASM.h" + +// Open file +FILE_EASM *Open_ExportASM(const char *filename, const char *header) +{ + FILE_EASM *fec; + FILE *fo; + + // Open file + fo = fopen(filename, "wb"); + if (fo == NULL) return NULL; + fec = (FILE_EASM *)malloc(sizeof(FILE_EASM)); + fec->fo = fo; + fec->type = FILE_EASM_NONE; + fec->offset = 0; + fec->perline = 16; + fec->next = 0; + + // Write file header + if (header) fprintf(fo, "%s\n", header); + + return fec; +} + +// Begin new variable +int Begin_ExportASM(FILE_EASM *fec, int type, const char *name, int perline) +{ + if (!fec) return 0; + if ((type < 0) || (type >= FILE_EASM_EOE)) return 0; + if (perline <= 0) perline = 8; + + if (name && strlen(name)) fprintf(fec->fo, "\n%s:\n", name); + else fprintf(fec->fo, "\n"); + fec->type = type; + fec->offset = 0; + fec->perline = perline; + fec->next = 0; + + return 1; +} + +// End current variable +void End_ExportASM(FILE_EASM *fec) +{ + if (!fec) return; + + fprintf(fec->fo, "\n"); + fec->type = FILE_EASM_NONE; + fec->offset = 0; + fec->next = 0; +} + +// Write 8-bits into the file +int Write8B_ExportASM(FILE_EASM *fec, uint8_t val) +{ + if (!fec) return 0; + if (fec->type != FILE_EASM_8BITS) return 0; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, "\n"); + fprintf(fec->fo, "\t.db $%02X", (int)val); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + fprintf(fec->fo, ",$%02X", (int)val); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + fprintf(fec->fo, ",$%02X", (int)val); + fec->offset++; + } + + return 1; +} + +// Write 16-bits into the file +int Write16B_ExportASM(FILE_EASM *fec, uint16_t val) +{ + if (!fec) return 0; + if (fec->type != FILE_EASM_16BITS) return 0; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, "\n"); + fprintf(fec->fo, "\t.dw $%04X", (int)val); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + fprintf(fec->fo, ",$%04X", (int)val); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + fprintf(fec->fo, ",$%04X", (int)val); + fec->offset++; + } + + return 1; +} + +// Write 32-bits into the file +int Write32B_ExportASM(FILE_EASM *fec, uint32_t val) +{ + if (!fec) return 0; + if (fec->type != FILE_EASM_32BITS) return 0; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, ",\n"); + fprintf(fec->fo, "\t.dd $%08X", (int)val); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + fprintf(fec->fo, ",$%08X", (int)val); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + fprintf(fec->fo, ",$%08X", (int)val); + fec->offset++; + } + + return 1; +} + +// Close file +void Close_ExportASM(FILE_EASM *fec) +{ + if (fec) { + fclose(fec->fo); + free(fec); + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportASM.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportASM.h new file mode 100644 index 0000000000..2949cc7dd7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportASM.h @@ -0,0 +1,59 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef EXPORTASM_H +#define EXPORTASM_H + +#include +#include +#include +#include "Endianess.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + FILE *fo; + int type; + int offset; + int perline; + int next; +} FILE_EASM; + +enum { + FILE_EASM_NONE, + FILE_EASM_8BITS, + FILE_EASM_16BITS, + FILE_EASM_32BITS, + FILE_EASM_EOE +}; + +FILE_EASM *Open_ExportASM(const char *filename, const char *header); +int Begin_ExportASM(FILE_EASM *fec, int type, const char *name, int perline); +void End_ExportASM(FILE_EASM *fec); +int Write8B_ExportASM(FILE_EASM *fec, uint8_t val); +int Write16B_ExportASM(FILE_EASM *fec, uint16_t val); +int Write32B_ExportASM(FILE_EASM *fec, uint32_t val); +void Close_ExportASM(FILE_EASM *fec); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportBMP.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportBMP.c new file mode 100644 index 0000000000..9129eec4cd --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportBMP.c @@ -0,0 +1,113 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "ExportBMP.h" + +// Open a unique files +FILE *OpenUnique_ExportBMP(int *choosennumber, int width, int height) +{ + int i; + char file[32]; + FILE *ft; + for (i=0; i<16777216; i++) { + sprintf(file, "snap_%03d.bmp", i); + ft = fopen(file, "r"); + if (!ft) break; + fclose(ft); + } + if (choosennumber) *choosennumber = i; + return Open_ExportBMP(file, width, height); +} + +// Open file +FILE *Open_ExportBMP(const char *filename, int width, int height) +{ + uint32_t tl; + uint16_t tw; + FILE *fo; + fo = fopen(filename, "wb"); + if (fo == NULL) return NULL; + + // Write file header + tw = Endian16(('M' << 8) | 'B'); + fwrite(&tw, 2, 1, fo); + tl = Endian32(14 + 40 + (width * height * 3)); + fwrite(&tl, 4, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + tl = Endian32(14 + 40); + fwrite(&tl, 4, 1, fo); + + // Write info header + tl = Endian32(40); + fwrite(&tl, 4, 1, fo); + tl = Endian32(width); + fwrite(&tl, 4, 1, fo); + tl = Endian32(height); + fwrite(&tl, 4, 1, fo); + tw = Endian16(1); + fwrite(&tw, 2, 1, fo); + tw = Endian16(24); + fwrite(&tw, 2, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + tl = Endian32(92); + fwrite(&tl, 4, 1, fo); + tl = Endian32(92); + fwrite(&tl, 4, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + + return fo; +} + +// Write pixel into the file +void WritePixel_ExportBMP(FILE *fo, uint32_t BGR) +{ + BGR = Endian32(BGR); + fwrite(&BGR, 1, 1, fo); + BGR >>= 8; + fwrite(&BGR, 1, 1, fo); + BGR >>= 8; + fwrite(&BGR, 1, 1, fo); +} + +// Write pixel into the file +void WriteArray_ExportBMP(FILE *fo, uint32_t *BGR, int pixels) +{ + int i; + uint32_t pixel; + for (i=0; i>= 8; + fwrite(&pixel, 1, 1, fo); + pixel >>= 8; + fwrite(&pixel, 1, 1, fo); + } +} + +// Close file +void Close_ExportBMP(FILE *fo) +{ + fclose(fo); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportBMP.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportBMP.h new file mode 100644 index 0000000000..dafffba350 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportBMP.h @@ -0,0 +1,41 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef EXPORTBMP_H +#define EXPORTBMP_H + +#include +#include +#include +#include "Endianess.h" + +#ifdef __cplusplus +extern "C" { +#endif + +FILE *OpenUnique_ExportBMP(int *choosennumber, int width, int height); +FILE *Open_ExportBMP(const char *filename, int width, int height); +void WritePixel_ExportBMP(FILE *fo, uint32_t BGR); +void WriteArray_ExportBMP(FILE *fo, uint32_t *BGR, int pixels); +void Close_ExportBMP(FILE *fo); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportC.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportC.c new file mode 100644 index 0000000000..ae6229b9c5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportC.c @@ -0,0 +1,166 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "ExportC.h" + +// Open file +FILE_EC *Open_ExportC(const char *filename, const char *header) +{ + FILE_EC *fec; + FILE *fo; + + // Open file + fo = fopen(filename, "wb"); + if (fo == NULL) return NULL; + fec = (FILE_EC *)malloc(sizeof(FILE_EC)); + fec->fo = fo; + fec->offset = 0; + fec->perline = 16; + fec->next = 0; + + // Write file header + if (header) fprintf(fo, "%s\n", header); + + return fec; +} + +// Begin new variable +void Begin_ExportC(FILE_EC *fec, const char *type, const char *name, int perline) +{ + if (!fec) return; + if (perline <= 0) perline = 8; + + fprintf(fec->fo, "\n%s %s[] = {\n", type, name); + fec->offset = 0; + fec->perline = perline; + fec->next = 0; +} + +// End current variable +void End_ExportC(FILE_EC *fec) +{ + if (!fec) return; + + fprintf(fec->fo, "\n};\n"); + fec->offset = 0; + fec->next = 0; +} + +// Write 8-bits into the file +void Write8B_ExportC(FILE_EC *fec, uint8_t val) +{ + if (!fec) return; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, ",\n"); + fprintf(fec->fo, "\t0x%02X", (int)val); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + fprintf(fec->fo, ",0x%02X", (int)val); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + fprintf(fec->fo, ",0x%02X", (int)val); + fec->offset++; + } +} + +// Write 16-bits into the file +void Write16B_ExportC(FILE_EC *fec, uint16_t val) +{ + if (!fec) return; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, ",\n"); + fprintf(fec->fo, "\t0x%04X", (int)val); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + fprintf(fec->fo, ",0x%04X", (int)val); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + fprintf(fec->fo, ",0x%04X", (int)val); + fec->offset++; + } +} + +// Write 32-bits into the file +void Write32B_ExportC(FILE_EC *fec, uint32_t val) +{ + if (!fec) return; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, ",\n"); + fprintf(fec->fo, "\t0x%08X", (int)val); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + fprintf(fec->fo, ",0x%08X", (int)val); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + fprintf(fec->fo, ",0x%08X", (int)val); + fec->offset++; + } +} + +// Write variable into the file +void WriteStr_ExportC(FILE_EC *fec, const char *s, const char *cast) +{ + if (!fec) return; + + if (fec->offset == 0) { + // First item + if (fec->next) fprintf(fec->fo, ",\n"); + if (cast) fprintf(fec->fo, "\t(%s)%s", cast, s); + else fprintf(fec->fo, "\t%s", s); + fec->offset++; + } else if (fec->offset >= (fec->perline-1)) { + // Last item + if (cast) fprintf(fec->fo, ",(%s)%s", cast, s); + else fprintf(fec->fo, ",%s", s); + fec->offset = 0; + fec->next = 1; + } else { + // Middle item + if (cast) fprintf(fec->fo, ",(%s)%s", cast, s); + else fprintf(fec->fo, ",%s", s); + fec->offset++; + } +} + +// Close file +void Close_ExportC(FILE_EC *fec) +{ + if (fec) { + fclose(fec->fo); + free(fec); + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportC.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportC.h new file mode 100644 index 0000000000..0abaa077a3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportC.h @@ -0,0 +1,51 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef EXPORTC_H +#define EXPORTC_H + +#include +#include +#include +#include "Endianess.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + FILE *fo; + int offset; + int perline; + int next; +} FILE_EC; + +FILE_EC *Open_ExportC(const char *filename, const char *header); +void Begin_ExportC(FILE_EC *fec, const char *type, const char *name, int perline); +void End_ExportC(FILE_EC *fec); +void Write8B_ExportC(FILE_EC *fec, uint8_t val); +void Write16B_ExportC(FILE_EC *fec, uint16_t val); +void Write32B_ExportC(FILE_EC *fec, uint32_t val); +void WriteStr_ExportC(FILE_EC *fec, const char *s, const char *cast); +void Close_ExportC(FILE_EC *fec); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportCode.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportCode.c new file mode 100644 index 0000000000..f5a15dae03 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportCode.c @@ -0,0 +1,257 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include "ExportCode.h" +#include "ExportASM.h" +#include "ExportC.h" + +FILE_ECODE *Open_ExportCode(int format, const char *filename) +{ + FILE_ECODE *fec; + + fec = (FILE_ECODE *)malloc(sizeof(FILE_ECODE)); + if (!fec) return NULL; + fec->format = format; + + if (format == FILE_ECODE_RAW) { + fec->foptr = (void *)fopen(filename, "wb"); + } else if (format == FILE_ECODE_ASM) { + fec->foptr = (void *)Open_ExportASM(filename, NULL); + } else if (format == FILE_ECODE_C) { + fec->foptr = (void *)Open_ExportC(filename, NULL); + } + + if (!fec->foptr) { + free(fec); + return NULL; + } + + return fec; +} + +void Comment_ExportCode(FILE_ECODE *fec, const char *fmt, ...) +{ + va_list args; + FILE *fo = NULL; + if (!fec) return; + + va_start(args, fmt); + if (fec->format == FILE_ECODE_RAW) { + return; + } else if (fec->format == FILE_ECODE_ASM) { + fo = ((FILE_EASM *)fec->foptr)->fo; + fprintf(fo, "; "); + } else if (fec->format == FILE_ECODE_C) { + fo = ((FILE_EC *)fec->foptr)->fo; + fprintf(fo, "// "); + } + vfprintf(fo, fmt, args); + fprintf(fo, "\n"); + va_end(args); +} + +void PrintASM_ExportCode(FILE_ECODE *fec, const char *fmt, ...) +{ + va_list args; + FILE *fo = NULL; + if (!fec) return; + + va_start(args, fmt); + if (fec->format == FILE_ECODE_RAW) { + return; + } else if (fec->format == FILE_ECODE_ASM) { + fo = ((FILE_EASM *)fec->foptr)->fo; + } else if (fec->format == FILE_ECODE_C) { + return; + } + vfprintf(fo, fmt, args); + fprintf(fo, "\n"); + va_end(args); +} + +void PrintC_ExportCode(FILE_ECODE *fec, const char *fmt, ...) +{ + va_list args; + FILE *fo = NULL; + if (!fec) return; + + va_start(args, fmt); + if (fec->format == FILE_ECODE_RAW) { + return; + } else if (fec->format == FILE_ECODE_ASM) { + return; + } else if (fec->format == FILE_ECODE_C) { + fo = ((FILE_EC *)fec->foptr)->fo; + } + vfprintf(fo, fmt, args); + fprintf(fo, "\n"); + va_end(args); +} + +int BlockOpen_ExportCode(FILE_ECODE *fec, int bits, const char *varname) +{ + if (!fec) return 0; + + fec->blockbits = bits; + if (fec->format == FILE_ECODE_RAW) { + return 1; + } else if (fec->format == FILE_ECODE_ASM) { + if (fec->blockbits == FILE_ECODE_8BITS) Begin_ExportASM((FILE_EASM *)fec->foptr, FILE_EASM_8BITS, varname, 16); + if (fec->blockbits == FILE_ECODE_16BITS) Begin_ExportASM((FILE_EASM *)fec->foptr, FILE_EASM_16BITS, varname, 8); + if (fec->blockbits == FILE_ECODE_32BITS) Begin_ExportASM((FILE_EASM *)fec->foptr, FILE_EASM_32BITS, varname, 4); + return 1; + } else if (fec->format == FILE_ECODE_C) { + if (fec->blockbits == FILE_ECODE_8BITS) Begin_ExportC((FILE_EC *)fec->foptr, "const unsigned char", varname, 16); + if (fec->blockbits == FILE_ECODE_16BITS) Begin_ExportC((FILE_EC *)fec->foptr, "const unsigned short", varname, 8); + if (fec->blockbits == FILE_ECODE_32BITS) Begin_ExportC((FILE_EC *)fec->foptr, "const unsigned long", varname, 4); + return 1; + } + + return 0; +} + +int BlockWrite_ExportCode(FILE_ECODE *fec, int data) +{ + if (!fec) return 0; + + data = Endian32(data); + if (fec->format == FILE_ECODE_RAW) { + if (fec->blockbits == FILE_ECODE_8BITS) fwrite(&data, 1, 1, (FILE *)fec->foptr); + if (fec->blockbits == FILE_ECODE_16BITS) fwrite(&data, 1, 2, (FILE *)fec->foptr); + if (fec->blockbits == FILE_ECODE_32BITS) fwrite(&data, 1, 4, (FILE *)fec->foptr); + return 1; + } else if (fec->format == FILE_ECODE_ASM) { + if (fec->blockbits == FILE_ECODE_8BITS) Write8B_ExportASM((FILE_EASM *)fec->foptr, data); + if (fec->blockbits == FILE_ECODE_16BITS) Write16B_ExportASM((FILE_EASM *)fec->foptr, data); + if (fec->blockbits == FILE_ECODE_32BITS) Write32B_ExportASM((FILE_EASM *)fec->foptr, data); + return 1; + } else if (fec->format == FILE_ECODE_C) { + if (fec->blockbits == FILE_ECODE_8BITS) Write8B_ExportC((FILE_EC *)fec->foptr, data); + if (fec->blockbits == FILE_ECODE_16BITS) Write16B_ExportC((FILE_EC *)fec->foptr, data); + if (fec->blockbits == FILE_ECODE_32BITS) Write32B_ExportC((FILE_EC *)fec->foptr, data); + return 1; + } + + return 0; +} + +int BlockVarWrite_ExportCode(FILE_ECODE *fec, const char *varname) +{ + FILE *fo = NULL; + if (!fec) return 0; + + if (fec->format == FILE_ECODE_RAW) { + return 0; + } else if (fec->format == FILE_ECODE_ASM) { + fo = ((FILE_EASM *)fec->foptr)->fo; + if (fec->blockbits == FILE_ECODE_8BITS) fprintf(fo, "\t.db %s\n", varname); + if (fec->blockbits == FILE_ECODE_16BITS) fprintf(fo, "\t.dw %s\n", varname); + if (fec->blockbits == FILE_ECODE_32BITS) fprintf(fo, "\t.dd %s\n", varname); + return 1; + } else if (fec->format == FILE_ECODE_C) { + if (fec->blockbits == FILE_ECODE_8BITS) WriteStr_ExportC((FILE_EC *)fec->foptr, varname, "unsigned char"); + if (fec->blockbits == FILE_ECODE_16BITS) WriteStr_ExportC((FILE_EC *)fec->foptr, varname, "unsigned short"); + if (fec->blockbits == FILE_ECODE_32BITS) WriteStr_ExportC((FILE_EC *)fec->foptr, varname, "unsigned long"); + return 1; + } + + return 0; +} + +int BlockClose_ExportCode(FILE_ECODE *fec) +{ + if (!fec) return 0; + + if (fec->format == FILE_ECODE_RAW) { + return 1; + } else if (fec->format == FILE_ECODE_ASM) { + End_ExportASM((FILE_EASM *)fec->foptr); + return 1; + } else if (fec->format == FILE_ECODE_C) { + End_ExportC((FILE_EC *)fec->foptr); + return 1; + } + + return 0; +} + +int WriteArray_ExportCode(FILE_ECODE *fec, int bits, const char *varname, void *data, int bytes) +{ + uint8_t *data8 = (uint8_t *)data; + uint16_t *data16 = (uint16_t *)data; + uint32_t *data32 = (uint32_t *)data; + int i; + + if (!fec) return 0; + + if (fec->format == FILE_ECODE_RAW) { + fwrite(data, 1, bytes, (FILE *)fec->foptr); + return 1; + } else if (fec->format == FILE_ECODE_ASM) { + if (bits == FILE_ECODE_8BITS) { + Begin_ExportASM((FILE_EASM *)fec->foptr, FILE_EASM_8BITS, varname, 16); + for (i=0; ifoptr, data8[i]); + } + if (bits == FILE_ECODE_16BITS) { + Begin_ExportASM((FILE_EASM *)fec->foptr, FILE_EASM_16BITS, varname, 8); + for (i=0; i<(bytes>>1); i++) Write16B_ExportASM((FILE_EASM *)fec->foptr, data16[i]); + } + if (bits == FILE_ECODE_32BITS) { + Begin_ExportASM((FILE_EASM *)fec->foptr, FILE_EASM_32BITS, varname, 4); + for (i=0; i<(bytes>>2); i++) Write32B_ExportASM((FILE_EASM *)fec->foptr, data32[i]); + } + End_ExportASM((FILE_EASM *)fec->foptr); + return 1; + } else if (fec->format == FILE_ECODE_C) { + if (bits == FILE_ECODE_8BITS) { + Begin_ExportC((FILE_EC *)fec->foptr, "const unsigned char", varname, 16); + for (i=0; ifoptr, data8[i]); + } + if (bits == FILE_ECODE_16BITS) { + Begin_ExportC((FILE_EC *)fec->foptr, "const unsigned short", varname, 8); + for (i=0; i<(bytes>>1); i++) Write16B_ExportC((FILE_EC *)fec->foptr, data16[i]); + } + if (bits == FILE_ECODE_32BITS) { + Begin_ExportC((FILE_EC *)fec->foptr, "const unsigned long", varname, 4); + for (i=0; i<(bytes>>2); i++) Write32B_ExportC((FILE_EC *)fec->foptr, data32[i]); + } + End_ExportC((FILE_EC *)fec->foptr); + return 1; + } + + return 0; +} + +void Close_ExportCode(FILE_ECODE *fec) +{ + if (fec) { + if (fec->format == FILE_ECODE_RAW) { + if (fec->foptr) fclose((FILE *)fec->foptr); + } else if (fec->format == FILE_ECODE_ASM) { + if (fec->foptr) Close_ExportASM((FILE_EASM *)fec->foptr); + } else if (fec->format == FILE_ECODE_C) { + if (fec->foptr) Close_ExportC((FILE_EC *)fec->foptr); + } + fec->foptr = NULL; + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportCode.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportCode.h new file mode 100644 index 0000000000..af63e6a1f5 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportCode.h @@ -0,0 +1,65 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef EXPORTCODE_H +#define EXPORTCODE_H + +#include +#include +#include +#include +#include "Endianess.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + FILE_ECODE_RAW, + FILE_ECODE_ASM, + FILE_ECODE_C +}; + +enum { + FILE_ECODE_8BITS, + FILE_ECODE_16BITS, + FILE_ECODE_32BITS +}; + +typedef struct { + void *foptr; + int format; + int blockbits; +} FILE_ECODE; + +FILE_ECODE *Open_ExportCode(int format, const char *filename); +void Comment_ExportCode(FILE_ECODE *fec, const char *fmt, ...); +void PrintASM_ExportCode(FILE_ECODE *fec, const char *fmt, ...); +void PrintC_ExportCode(FILE_ECODE *fec, const char *fmt, ...); +int WriteArray_ExportCode(FILE_ECODE *fec, int bits, const char *varname, void *data, int bytes); +int BlockOpen_ExportCode(FILE_ECODE *fec, int bits, const char *varname); +int BlockWrite_ExportCode(FILE_ECODE *fec, int data); +int BlockVarWrite_ExportCode(FILE_ECODE *fec, const char *varname); +int BlockClose_ExportCode(FILE_ECODE *fec); +void Close_ExportCode(FILE_ECODE *fec); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportWAV.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportWAV.c new file mode 100644 index 0000000000..c3ff95dd9d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/ExportWAV.c @@ -0,0 +1,136 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include "ExportWAV.h" + +// Open a unique files for saving the capture +FILE *OpenUnique_ExportWAV(uint8_t format) +{ + int i; + char file[32]; + FILE *ft; + for (i=0; i<16777216; i++) { + sprintf(file, "dump_%03d.wav", i); + ft = fopen(file, "r"); + if (!ft) break; + fclose(ft); + } + return Open_ExportWAV(file, format); +} + +// Open file for saving the capture +FILE *Open_ExportWAV(const char *filename, uint8_t format) +{ + const char *text_RIFF = "RIFF"; + const char *text_WAVE = "WAVE"; + const char *text_fmt_ = "fmt "; + const char *text_data = "data"; + uint32_t tl; + uint16_t tw; + int frequency, channels, bits; + FILE *fo; + + switch (format & EXPORTWAV_MASK) { + case EXPORTWAV_11KHZ: frequency = 11025; break; + case EXPORTWAV_22KHZ: frequency = 22050; break; + case EXPORTWAV_44KHZ: frequency = 44100; break; + default: frequency = 0; break; + } + channels = (format & EXPORTWAV_STEREO) ? 2 : 1; + bits = (format & EXPORTWAV_16BITS) ? 16 : 8; + + fo = fopen(filename, "wb"); + if (fo == NULL) return NULL; + + // Write file header + fwrite(text_RIFF, 4, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + fwrite(text_WAVE, 4, 1, fo); + fwrite(text_fmt_, 4, 1, fo); + tl = Endian32(16); + fwrite(&tl, 4, 1, fo); + tw = Endian16(1); + fwrite(&tw, 2, 1, fo); + tw = Endian16(channels); + fwrite(&tw, 2, 1, fo); + tl = Endian32(frequency); + fwrite(&tl, 4, 1, fo); + tl = Endian32(frequency * channels * bits / 8); + fwrite(&tl, 4, 1, fo); + tw = Endian16(channels * bits / 8); + fwrite(&tw, 2, 1, fo); + tw = Endian16(bits); + fwrite(&tw, 2, 1, fo); + fwrite(text_data, 4, 1, fo); + tl = 0; + fwrite(&tl, 4, 1, fo); + + return fo; +} + +// Write unsigned 8-bits sample +void WriteU8_ExportWAV(FILE *fo, uint8_t sample) +{ + fwrite(&sample, 1, 1, fo); +} + +// Write signed 16-bits sample +void WriteS16_ExportWAV(FILE *fo, int16_t sample) +{ + uint16_t tsamp = Endian16(sample); + fwrite(&tsamp, 2, 1, fo); +} + +// Write unsigned 8-bits array +void WriteU8A_ExportWAV(FILE *fo, uint8_t *samples, int len) +{ + if (len <= 0) return; + fwrite(samples, 1, len, fo); +} + +// Write signed 16-bits array +void WriteS16A_ExportWAV(FILE *fo, int16_t *samples, int len) +{ + uint16_t tsamp; + int i; + if (len <= 0) return; + for (i=0; i. +*/ + +#ifndef EXPORTWAV_H +#define EXPORTWAV_H + +#include +#include +#include +#include "Endianess.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + // Frequency + EXPORTWAV_11KHZ = (0<<0), + EXPORTWAV_22KHZ = (1<<0), + EXPORTWAV_44KHZ = (2<<0), + EXPORTWAV_MASK = (3<<0), + // Channels + EXPORTWAV_MONO = (0<<2), + EXPORTWAV_STEREO = (1<<2), + // Bit format + EXPORTWAV_8BITS = (0<<3), + EXPORTWAV_16BITS = (1<<3), +}; + +FILE *OpenUnique_ExportWAV(uint8_t format); +FILE *Open_ExportWAV(const char *filename, uint8_t format); +void WriteU8_ExportWAV(FILE *fo, uint8_t sample); +void WriteS16_ExportWAV(FILE *fo, int16_t sample); +void WriteU8A_ExportWAV(FILE *fo, uint8_t *samples, int len); +void WriteS16A_ExportWAV(FILE *fo, int16_t *samples, int len); +void Close_ExportWAV(FILE *fo); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/Font8x12.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/Font8x12.c new file mode 100644 index 0000000000..d9dcee8a05 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/Font8x12.c @@ -0,0 +1,1556 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +const unsigned char Font8x12[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0xFF, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF, + 0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0xFF,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0xFF,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00, + 0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, + 0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/Font8x12.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/Font8x12.h new file mode 100644 index 0000000000..24e6cda1e7 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/Font8x12.h @@ -0,0 +1,24 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef FONT8X12_H +#define FONT8X12_H + +extern const unsigned char Font8x12[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/GtkXDialogs.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/GtkXDialogs.c new file mode 100644 index 0000000000..cfbfe7136b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/GtkXDialogs.c @@ -0,0 +1,459 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "GtkXDialogs.h" +#include "PMCommon.h" + +#ifdef _WIN32 +#include +#include +#endif + +#include + +void MessageDialog(GtkWindow *parentwindow, const char *caption, const char *title, int messagetype, const char **xpm_img) +{ + GtkDialog *dialog; + GtkWidget *image; + GdkPixbuf *pixbuf; + + dialog = GTK_DIALOG(gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, messagetype, GTK_BUTTONS_OK, "%s", caption)); + if (xpm_img) { + pixbuf = gdk_pixbuf_new_from_xpm_data(xpm_img); + image = gtk_image_new_from_pixbuf(pixbuf); + gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(dialog), image); + gtk_widget_show(image); + } + gtk_window_set_title(GTK_WINDOW(dialog), title); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + gtk_dialog_run(dialog); + gtk_window_present(parentwindow); + if (xpm_img) { + gtk_widget_destroy(GTK_WIDGET(image)); + } + gtk_widget_destroy(GTK_WIDGET(dialog)); +} + +int YesNoDialog(GtkWindow *parentwindow, const char *caption, const char *title, int messagetype, const char **xpm_img) +{ + GtkDialog *dialog; + GtkWidget *image; + GdkPixbuf *pixbuf; + GtkResponseType response; + + dialog = GTK_DIALOG(gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, messagetype, GTK_BUTTONS_YES_NO, "%s", caption)); + if (xpm_img) { + pixbuf = gdk_pixbuf_new_from_xpm_data(xpm_img); + image = gtk_image_new_from_pixbuf(pixbuf); + gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(dialog), image); + gtk_widget_show(image); + } + gtk_window_set_title(GTK_WINDOW(dialog), title); + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + response = gtk_dialog_run(dialog); + gtk_window_present(parentwindow); + if (xpm_img) { + gtk_widget_destroy(GTK_WIDGET(image)); + } + gtk_widget_destroy(GTK_WIDGET(dialog)); + + return (response == GTK_RESPONSE_YES); +} + +int OpenFileDialog(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein) +{ + GtkDialog *dialog; + GtkResponseType response; + char *filename, tmp[256]; + + dialog = GTK_DIALOG(gtk_file_chooser_dialog_new(title, GTK_WINDOW(parentwindow), GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL)); + if (FileExist(filein)) { + strcpy(tmp, filein); + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), GetFilename(filein)); + ExtractPath(tmp, 0); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), tmp); + } + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + response = gtk_dialog_run(dialog); + if (response == GTK_RESPONSE_ACCEPT) { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (fileout) strcpy(fileout, filename); + g_free(filename); + } + gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_window_present(parentwindow); + + return (response == GTK_RESPONSE_ACCEPT); +} + +int SaveFileDialog(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein) +{ + GtkDialog *dialog; + GtkResponseType response; + char *filename, tmp[256]; + + dialog = GTK_DIALOG(gtk_file_chooser_dialog_new(title, GTK_WINDOW(parentwindow), GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL)); + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); + + strcpy(tmp, filein); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), GetFilename(filein)); + ExtractPath(tmp, 0); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), tmp); + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + response = gtk_dialog_run(dialog); + if (response == GTK_RESPONSE_ACCEPT) { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (fileout) strcpy(fileout, filename); + g_free(filename); + } + gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_window_present(parentwindow); + + return (response == GTK_RESPONSE_ACCEPT); +} + +int PickColorFormatDialog(GtkWindow *parentwindow, unsigned char colorformat, unsigned char colorflags) +{ + GtkDialog *dialog; + GtkLabel *label1; + GtkComboBox *combobox; + GtkLabel *label2; + GtkToggleButton *checkbox; + + dialog = GTK_DIALOG(gtk_dialog_new_with_buttons("Color Format", parentwindow, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL)); + gtk_container_set_border_width(GTK_CONTAINER(dialog->vbox), 4); + + label1 = GTK_LABEL(gtk_label_new("Select Color Format:")); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(label1), FALSE, TRUE, 4); + + combobox = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_append_text(combobox, "8x8 Attributes"); + gtk_combo_box_append_text(combobox, "4x4 Attributes"); + gtk_combo_box_set_active(combobox, colorformat); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(combobox), FALSE, TRUE, 4); + + checkbox = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label("Require rendering video to RAM")); + gtk_toggle_button_set_mode(checkbox, TRUE); + gtk_toggle_button_set_active(checkbox, colorflags & 2); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(checkbox), FALSE, TRUE, 4); + + label2 = GTK_LABEL(gtk_label_new("8x8 will use 1/4 of memory and storage\n4x4 will avoid attribute clash better")); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(label2), FALSE, TRUE, 4); + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + gtk_widget_show_all(GTK_WIDGET(dialog->vbox)); + + gtk_dialog_run(dialog); + + colorformat = gtk_combo_box_get_active(combobox); + colorflags &= ~2; + colorflags |= gtk_toggle_button_get_active(checkbox) ? 2 : 0; + gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_window_present(parentwindow); + + return (colorformat & 0xFF) | ((colorflags & 0xFF) << 8); +} + +#ifndef GDK_KEY_Return +#define GDK_KEY_Return GDK_Return +#define GDK_KEY_KP_Enter GDK_KP_Enter +#define GDK_KEY_Escape GDK_Escape +#endif + +static gboolean WidgetReturnAsOkayClose(GtkWidget *widget, GdkEventKey *event, gpointer user_data) +{ + GtkDialog *dialog = (GtkDialog *)user_data; + if (event->type == GDK_KEY_PRESS) { + if ((event->keyval == GDK_KEY_Return) || (event->keyval == GDK_KEY_KP_Enter)) { + gtk_dialog_response(dialog, GTK_RESPONSE_OK); + return TRUE; + } else if ((event->keyval == GDK_KEY_Escape)) { + gtk_dialog_response(dialog, GTK_RESPONSE_CANCEL); + return TRUE; + } + } + return FALSE; +} + +int EnterNumberDialog(GtkWindow *parentwindow, const char *title, const char *caption, + int *numberout, int numberin, int digits, int hexnum, int min, int max) +{ + GtkDialog *dialog; + GtkResponseType response; + GtkLabel *label1; + GtkEntry *entry; + GtkLabel *label2; + char tmp[256]; + int result = 0; + + if (hexnum) { + if (numberin < 0) sprintf(tmp, "-$%0*X", digits, numberin); + else sprintf(tmp, "$%0*X", digits, numberin); + } else { + sprintf(tmp, "%i", numberin); + } + + dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title, GTK_WINDOW(parentwindow), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL)); + gtk_container_set_border_width(GTK_CONTAINER(dialog->vbox), 4); + + label1 = GTK_LABEL(gtk_label_new(caption)); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(label1), FALSE, TRUE, 4); + + entry = GTK_ENTRY(gtk_entry_new()); + gtk_entry_set_text(GTK_ENTRY(entry), tmp); + g_signal_connect(entry, "key-press-event", G_CALLBACK(WidgetReturnAsOkayClose), dialog); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(entry), FALSE, TRUE, 4); + + label2 = GTK_LABEL(gtk_label_new("Prefix \"$\" for hexadecimal numbers")); + gtk_box_pack_start(GTK_BOX(dialog->vbox), GTK_WIDGET(label2), FALSE, TRUE, 4); + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + gtk_widget_show_all(GTK_WIDGET(dialog->vbox)); + do { + gtk_widget_grab_focus(GTK_WIDGET(entry)); + response = gtk_dialog_run(dialog); + if (response == GTK_RESPONSE_OK) { + result = atoi_Ex2(gtk_entry_get_text(GTK_ENTRY(entry)), numberout); + if (result != 1) { + result = -1; + MessageDialog(parentwindow, "Invalid number", title, GTK_MESSAGE_ERROR, NULL); + } + if ((*numberout < min) || (*numberout > max)) { + result = -1; + sprintf(tmp, "Value must be between %i and %i", min, max); + MessageDialog(parentwindow, tmp, title, GTK_MESSAGE_ERROR, NULL); + } + } else result = 0; + } while (result < 0); + + gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_window_present(parentwindow); + + return result; +} + +int CustomDialog(GtkWindow *parentwindow, const char *title, GtkXCustomDialog *items) +{ + GtkXCustomDialog *cwidg; + GtkDialog *dialog; + GtkResponseType response; + GtkRadioButton *radiomaster = NULL; + GtkRadioButton *radiomaster2 = NULL; + GtkRadioButton *radiomaster3 = NULL; + GtkWidget *firstwidget = NULL; + char tmp[256]; + int i, result = 1; + + dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title, GTK_WINDOW(parentwindow), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_OK, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + NULL)); + gtk_container_set_border_width(GTK_CONTAINER(dialog->vbox), 4); + + cwidg = items; + while (cwidg->wtype) { + if (cwidg->wtype == GTKXCD_LABEL) { + cwidg->widget = gtk_label_new(cwidg->text); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_CHECK) { + cwidg->widget = gtk_check_button_new_with_label(cwidg->text); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(cwidg->widget), TRUE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cwidg->widget), cwidg->number); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_RADIO) { + if (radiomaster) { + cwidg->widget = gtk_radio_button_new_with_label_from_widget(radiomaster, cwidg->text); + } else { + cwidg->widget = gtk_radio_button_new_with_label(NULL, cwidg->text); + radiomaster = GTK_RADIO_BUTTON(cwidg->widget); + } + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cwidg->widget), cwidg->number); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_RADIO2) { + if (radiomaster2) { + cwidg->widget = gtk_radio_button_new_with_label_from_widget(radiomaster2, cwidg->text); + } else { + cwidg->widget = gtk_radio_button_new_with_label(NULL, cwidg->text); + radiomaster2 = GTK_RADIO_BUTTON(cwidg->widget); + } + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cwidg->widget), cwidg->number); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_RADIO3) { + if (radiomaster3) { + cwidg->widget = gtk_radio_button_new_with_label_from_widget(radiomaster3, cwidg->text); + } else { + cwidg->widget = gtk_radio_button_new_with_label(NULL, cwidg->text); + radiomaster3 = GTK_RADIO_BUTTON(cwidg->widget); + } + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cwidg->widget), cwidg->number); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_COMBO) { + cwidg->widget = gtk_combo_box_new_text(); + for (i=0; idigits; i++) { + gtk_combo_box_append_text(GTK_COMBO_BOX(cwidg->widget), cwidg->combolist[i]); + } + gtk_combo_box_set_active(GTK_COMBO_BOX(cwidg->widget), cwidg->number); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_HSEP) { + cwidg->widget = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + } else if (cwidg->wtype == GTKXCD_NUMIN) { + if (cwidg->hexformat) { + if (cwidg->number < 0) sprintf(tmp, "-$%0*X", cwidg->digits, cwidg->number); + else sprintf(tmp, "$%0*X", cwidg->digits, cwidg->number); + } else { + sprintf(tmp, "%i", cwidg->number); + } + cwidg->widget = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(cwidg->widget), tmp); + g_signal_connect(cwidg->widget, "key-press-event", G_CALLBACK(WidgetReturnAsOkayClose), dialog); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + if (!firstwidget) firstwidget = cwidg->widget; + } else if (cwidg->wtype == GTKXCD_ENTRY) { + cwidg->widget = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(cwidg->widget), cwidg->text); + g_signal_connect(cwidg->widget, "key-press-event", G_CALLBACK(WidgetReturnAsOkayClose), dialog); + gtk_box_pack_start(GTK_BOX(dialog->vbox), cwidg->widget, FALSE, TRUE, 4); + if (!firstwidget) firstwidget = cwidg->widget; + } + cwidg++; + } + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); + gtk_window_present(GTK_WINDOW(dialog)); + gtk_widget_show_all(GTK_WIDGET(dialog->vbox)); + do { + if (firstwidget) gtk_widget_grab_focus(GTK_WIDGET(firstwidget)); + response = gtk_dialog_run(dialog); + cwidg = items; + if (response == GTK_RESPONSE_OK) { + result = 1; + while (cwidg->wtype) { + if ((cwidg->wtype == GTKXCD_CHECK) || (cwidg->wtype == GTKXCD_RADIO) || + (cwidg->wtype == GTKXCD_RADIO2) || (cwidg->wtype == GTKXCD_RADIO3)) { + cwidg->number = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cwidg->widget)) ? 1 : 0; + } else if (cwidg->wtype == GTKXCD_COMBO) { + cwidg->number = gtk_combo_box_get_active(GTK_COMBO_BOX(cwidg->widget)); + } else if (cwidg->wtype == GTKXCD_NUMIN) { + if (atoi_Ex2(gtk_entry_get_text(GTK_ENTRY(cwidg->widget)), &cwidg->number) != 1) { + result = -1; + MessageDialog(parentwindow, "Invalid number", title, GTK_MESSAGE_ERROR, NULL); + } + if ((cwidg->number < cwidg->min) || (cwidg->number > cwidg->max)) { + result = -1; + sprintf(tmp, "Value must be between %i and %i", cwidg->min, cwidg->max); + MessageDialog(parentwindow, tmp, title, GTK_MESSAGE_ERROR, NULL); + } + } else if (cwidg->wtype == GTKXCD_ENTRY) { + strncpy(cwidg->text, gtk_entry_get_text(GTK_ENTRY(cwidg->widget)), 128); + cwidg->text[127] = 0; + } + cwidg++; + } + } else result = 0; + } while (result < 0); + + gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_window_present(parentwindow); + + if (response == GTK_RESPONSE_CANCEL) return 0; + return result; +} + +int OpenFileDialogEx(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx) +{ +#ifdef _WIN32 + OPENFILENAME ofn; + char szFile[256]; + + strcpy(szFile, filein); + ZeroMemory(&ofn, sizeof(OPENFILENAME)); + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = GDK_WINDOW_HWND(GTK_WIDGET(parentwindow)->window); + ofn.lpstrFile = szFile; + ofn.nMaxFile = sizeof(szFile); + ofn.lpstrFilter = exts; + ofn.nFilterIndex = extidx + 1; + ofn.lpstrFileTitle = (char *)title; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; + + if (GetOpenFileName(&ofn)) { + strcpy(fileout, ofn.lpstrFile); + return 1; + } + return 0; +#else + return OpenFileDialog(parentwindow, title, fileout, filein); +#endif +} + +int SaveFileDialogEx(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx) +{ +#ifdef _WIN32 + OPENFILENAME ofn; + char szFile[256]; + + strcpy(szFile, filein); + ZeroMemory(&ofn, sizeof(OPENFILENAME)); + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = GDK_WINDOW_HWND(GTK_WIDGET(parentwindow)->window); + ofn.lpstrFile = szFile; + ofn.nMaxFile = sizeof(szFile); + ofn.lpstrFilter = exts; + ofn.nFilterIndex = extidx + 1; + ofn.lpstrFileTitle = (char *)title; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.Flags = OFN_PATHMUSTEXIST; + + if (GetSaveFileName(&ofn)) { + strcpy(fileout, ofn.lpstrFile); + return 1; + } + return 0; +#else + return SaveFileDialog(parentwindow, title, fileout, filein); +#endif +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/GtkXDialogs.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/GtkXDialogs.h new file mode 100644 index 0000000000..4ef2ebf754 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/GtkXDialogs.h @@ -0,0 +1,75 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef GTKXDIALOGS_H +#define GTKXDIALOGS_H + +#include + +enum { + GTKXCD_EOL = 0, // End-of-list + GTKXCD_LABEL, // Label widget + GTKXCD_CHECK, // Check item widget + GTKXCD_RADIO, // Radio item widget + GTKXCD_RADIO2, // Radio item widget (group 2) + GTKXCD_RADIO3, // Radio item widget (group 3) + GTKXCD_COMBO, // Combo item widget + GTKXCD_HSEP, // Horizontal separator + GTKXCD_NUMIN, // Number input + GTKXCD_ENTRY // Text input +}; + +typedef struct { + int wtype; // Widget type + char text[128]; // Text + int number; // Checked for check/radio, In/out for number input + int digits; // Number of digits, number of strings + int hexformat; // Hex decimal format for number input, strings pointer + int min; // Minimum value for number input + int max; // Maximum value for number input + const char **combolist; // Combo list content + GtkWidget *widget; // Allocated widget +} GtkXCustomDialog; + +// messagetype: +// GTK_MESSAGE_INFO: Informational message +// GTK_MESSAGE_WARNING: Nonfatal warning message +// GTK_MESSAGE_QUESTION: Question requiring a choice +// GTK_MESSAGE_ERROR: Fatal error message +// GTK_MESSAGE_OTHER: None of the above, doesn't get an icon + +void MessageDialog(GtkWindow *parentwindow, const char *caption, const char *title, int messagetype, const char **xpm_img); + +int YesNoDialog(GtkWindow *parentwindow, const char *caption, const char *title, int messagetype, const char **xpm_img); + +int OpenFileDialog(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein); + +int SaveFileDialog(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein); + +int PickColorFormatDialog(GtkWindow *parentwindow, unsigned char colorformat, unsigned char colorflags); + +int EnterNumberDialog(GtkWindow *parentwindow, const char *title, const char *caption, + int *numberout, int numberin, int digits, int hexnum, int min, int max); + +int CustomDialog(GtkWindow *parentwindow, const char *title, GtkXCustomDialog *items); + +int OpenFileDialogEx(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx); + +int SaveFileDialogEx(GtkWindow *parentwindow, const char *title, char *fileout, const char *filein, const char *exts, int extidx); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/HelpSupport.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/HelpSupport.c new file mode 100644 index 0000000000..7d22787e44 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/HelpSupport.c @@ -0,0 +1,51 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "PokeMini.h" + +void HelpLaunchURL(const char *url) +{ +#ifdef _WIN32 + ShellExecuteA(NULL, "open", url, "", NULL, SW_SHOWNORMAL); +#else + gtk_show_uri(NULL, url, GDK_CURRENT_TIME, NULL); +#endif +} + +void HelpLaunchDoc(const char *sid) +{ + char tmp[PMTMPV]; +#ifdef _WIN32 + sprintf(tmp, "%s\\doc\\%s.html", PokeMini_ExecDir, sid); + ShellExecuteA(NULL, "open", tmp, "", NULL, SW_SHOWNORMAL); +#else + sprintf(tmp, "file://%s/doc/%s.html", PokeMini_ExecDir, sid); + gtk_show_uri(NULL, tmp, GDK_CURRENT_TIME, NULL); +#endif +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/HelpSupport.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/HelpSupport.h new file mode 100644 index 0000000000..c5a7397f49 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/HelpSupport.h @@ -0,0 +1,25 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef HELPSUPPORT_H +#define HELPSUPPORT_H + +void HelpLaunchURL(const char *url); +void HelpLaunchDoc(const char *sid); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionInfo.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionInfo.c new file mode 100644 index 0000000000..64fae10ad8 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionInfo.c @@ -0,0 +1,953 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include "InstructionInfo.h" + +char *DebugCPUInstructions_Opcode[] = { + ".DB", // 0 (No instruction) + "NOP", // 1 + "MOV", // 2 + "EXPAND", // 3 + "ADD", // 4 + "ADC", // 5 + "SUB", // 6 + "SBC", // 7 + "AND", // 8 + "OR", // 9 + "CMP", // 10 + "XOR", // 11 + "INC", // 12 + "DEC", // 13 + "TST", // 14 + "EX", // 15 + "PUSH", // 16 + "POP", // 17 + "PUSHX", // 18 + "POPX", // 19 + "XCHG", // 20 + "PACK", // 21 + "UNPACK", // 22 + "SWAP", // 23 + "CALLC", // 24 + "CALLNC", // 25 + "CALLZ", // 26 + "CALLNZ", // 27 + "JC", // 28 + "JNC", // 29 + "JZ", // 30 + "JNZ", // 31 + "CALL", // 32 + "JMP", // 33 + "JDBNZ", // 34 + "RET", // 35 + "RETI", // 36 + "RETSKIP", // 37 + "CINT", // 38 + "JINT", // 39 + "SAL", // 40 + "SHL", // 41 + "SAR", // 42 + "SHR", // 43 + "ROLC", // 44 + "ROL", // 45 + "RORC", // 46 + "ROR", // 47 + "NOT", // 48 + "NEG", // 49 + "MUL", // 50 + "DIV", // 51 + "PUSHA", // 52 + "PUSHAX", // 53 + "POPA", // 54 + "POPAX", // 55 + "JL", // 56 + "JLE", // 57 + "JG", // 58 + "JGE", // 59 + "JO", // 60 + "JNO", // 61 + "JNS", // 62 + "JS", // 63 + "JNX0", // 64 + "JNX1", // 65 + "JNX2", // 66 + "JNX3", // 67 + "JX0", // 68 + "JX1", // 69 + "JX2", // 70 + "JX3", // 71 + "CALLL", // 72 + "CALLLE", // 73 + "CALLG", // 74 + "CALLGE", // 75 + "CALLO", // 76 + "CALLNO", // 77 + "CALLNS", // 78 + "CALLS", // 79 + "CALLNX0", // 80 + "CALLNX1", // 81 + "CALLNX2", // 82 + "CALLNX3", // 83 + "CALLX0", // 84 + "CALLX1", // 85 + "CALLX2", // 86 + "CALLX3", // 87 + "STOP", // 88 + "HALT", // 89 + NULL +}; + +char *DebugCPUInstructions_Operand[] = { + "", // 0 (No operand) + "%j", // 1 + "%J", // 2 + "%i", // 3 + "%u", // 4 + "%U", // 5 + "%s", // 6 + "%S", // 7 + "A", // 8 + "B", // 9 + "%u", // 10 + "[HL]", // 11 + "[N+%u]", // 12 + "[%U]", // 13 + "[X]", // 14 + "[Y]", // 15 + "L", // 16 + "H", // 17 + "N", // 18 + "SP", // 19 + "BA", // 20 + "HL", // 21 + "X", // 22 + "Y", // 23 + "F", // 24 + "I", // 25 + "XI", // 26 + "YI", // 27 + "[X+%s]", // 28 + "[Y+%s]", // 29 + "[X+L]", // 30 + "[Y+L]", // 31 + "U", // 32 + "V", // 33 + "XI", // 34 + "YI", // 35 + "[SP+%s]", // 36 + "PC", // 37 + "%h", // 38 + NULL +}; + +// %u = Unsigned 8-Bits +// %U = Unsigned 16-Bits +// %s = Signed 8-Bits +// %S = Signed 16-Bits +// %j = Relative jump (8-Bits) +// %J = Relative jump (16-Bits) +// %i = Interrupt + +InstructionInfo DebugCPUInstructions_DX[8] = { + {0x00, 1, 0, 0, 4, 0, 0, 0}, // ".DB %u" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u..." + {0x00, 4, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u..." + {0x00, 5, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u..." + {0x00, 6, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u..." + {0x00, 7, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u..." + {0x00, 8, 0, 0, 4, 0, 4, 0}, // ".DB %u,%u..." +}; + +InstructionInfo DebugCPUInstructions_XX[256] = { + {0x00, 1, 4, 0, 8, 0, 8, 0}, // 00 __ "ADD A, A" + {0x00, 1, 4, 0, 8, 0, 9, 0}, // 01 __ "ADD A, B" + {0x00, 2, 4, 0, 8, 0,10, 1}, // 02 __ "ADD A, %u" + {0x00, 1, 4, 0, 8, 0,11, 0}, // 03 __ "ADD A, [HL]" + {0x00, 2, 4, 0, 8, 0,12, 1}, // 04 __ "ADD A, [N+%u]" + {0x00, 3, 4, 0, 8, 0,13, 1}, // 05 __ "ADD A, [%U]" + {0x00, 1, 4, 0, 8, 0,14, 0}, // 06 __ "ADD A, [X]" + {0x00, 1, 4, 0, 8, 0,15, 0}, // 07 __ "ADD A, [Y]" + {0x00, 1, 5, 0, 8, 0, 8, 0}, // 08 __ "ADC A, A" + {0x00, 1, 5, 0, 8, 0, 9, 0}, // 09 __ "ADC A, B" + {0x00, 2, 5, 0, 8, 0,10, 1}, // 0A __ "ADC A, %u" + {0x00, 1, 5, 0, 8, 0,11, 0}, // 0B __ "ADC A, [HL]" + {0x00, 2, 5, 0, 8, 0,12, 1}, // 0C __ "ADC A, [N+%u]" + {0x00, 3, 5, 0, 8, 0,13, 1}, // 0D __ "ADC A, [%U]" + {0x00, 1, 5, 0, 8, 0,14, 0}, // 0E __ "ADC A, [X]" + {0x00, 1, 5, 0, 8, 0,15, 0}, // 0F __ "ADC A, [Y]" + {0x00, 1, 6, 0, 8, 0, 8, 0}, // 10 __ "SUB A, A" + {0x00, 1, 6, 0, 8, 0, 9, 0}, // 11 __ "SUB A, B" + {0x00, 2, 6, 0, 8, 0,10, 1}, // 12 __ "SUB A, %u" + {0x00, 1, 6, 0, 8, 0,11, 0}, // 13 __ "SUB A, [HL]" + {0x00, 2, 6, 0, 8, 0,12, 1}, // 14 __ "SUB A, [N+%u]" + {0x00, 3, 6, 0, 8, 0,13, 1}, // 15 __ "SUB A, [%U]" + {0x00, 1, 6, 0, 8, 0,14, 0}, // 16 __ "SUB A, [X]" + {0x00, 1, 6, 0, 8, 0,15, 0}, // 17 __ "SUB A, [Y]" + {0x00, 1, 7, 0, 8, 0, 8, 0}, // 18 __ "SBC A, A" + {0x00, 1, 7, 0, 8, 0, 9, 0}, // 19 __ "SBC A, B" + {0x00, 2, 7, 0, 8, 0,10, 1}, // 1A __ "SBC A, %u" + {0x00, 1, 7, 0, 8, 0,11, 0}, // 1B __ "SBC A, [HL]" + {0x00, 2, 7, 0, 8, 0,12, 1}, // 1C __ "SBC A, [N+%u]" + {0x00, 3, 7, 0, 8, 0,13, 1}, // 1D __ "SBC A, [%U]" + {0x00, 1, 7, 0, 8, 0,14, 0}, // 1E __ "SBC A, [X]" + {0x00, 1, 7, 0, 8, 0,15, 0}, // 1F __ "SBC A, [Y]" + {0x00, 1, 8, 0, 8, 0, 8, 0}, // 20 __ "AND A, A" + {0x00, 1, 8, 0, 8, 0, 9, 0}, // 21 __ "AND A, B" + {0x00, 2, 8, 0, 8, 0,10, 1}, // 22 __ "AND A, %u" + {0x00, 1, 8, 0, 8, 0,11, 0}, // 23 __ "AND A, [HL]" + {0x00, 2, 8, 0, 8, 0,12, 1}, // 24 __ "AND A, [N+%u]" + {0x00, 3, 8, 0, 8, 0,13, 1}, // 25 __ "AND A, [%U]" + {0x00, 1, 8, 0, 8, 0,14, 0}, // 26 __ "AND A, [X]" + {0x00, 1, 8, 0, 8, 0,15, 0}, // 27 __ "AND A, [Y]" + {0x00, 1, 9, 0, 8, 0, 8, 0}, // 28 __ "OR A, A" + {0x00, 1, 9, 0, 8, 0, 9, 0}, // 29 __ "OR A, B" + {0x00, 2, 9, 0, 8, 0,10, 1}, // 2A __ "OR A, %u" + {0x00, 1, 9, 0, 8, 0,11, 0}, // 2B __ "OR A, [HL]" + {0x00, 2, 9, 0, 8, 0,12, 1}, // 2C __ "OR A, [N+%u]" + {0x00, 3, 9, 0, 8, 0,13, 1}, // 2D __ "OR A, [%U]" + {0x00, 1, 9, 0, 8, 0,14, 0}, // 2E __ "OR A, [X]" + {0x00, 1, 9, 0, 8, 0,15, 0}, // 2F __ "OR A, [Y]" + {0x00, 1,10, 0, 8, 0, 8, 0}, // 30 __ "CMP A, A" + {0x00, 1,10, 0, 8, 0, 9, 0}, // 31 __ "CMP A, B" + {0x00, 2,10, 0, 8, 0,10, 1}, // 32 __ "CMP A, %u" + {0x00, 1,10, 0, 8, 0,11, 0}, // 33 __ "CMP A, [HL]" + {0x00, 2,10, 0, 8, 0,12, 1}, // 34 __ "CMP A, [N+%u]" + {0x00, 3,10, 0, 8, 0,13, 1}, // 35 __ "CMP A, [%U]" + {0x00, 1,10, 0, 8, 0,14, 0}, // 36 __ "CMP A, [X]" + {0x00, 1,10, 0, 8, 0,15, 0}, // 37 __ "CMP A, [Y]" + {0x00, 1,11, 0, 8, 0, 8, 0}, // 38 __ "XOR A, A" + {0x00, 1,11, 0, 8, 0, 9, 0}, // 39 __ "XOR A, B" + {0x00, 2,11, 0, 8, 0,10, 1}, // 3A __ "XOR A, %u" + {0x00, 1,11, 0, 8, 0,11, 0}, // 3B __ "XOR A, [HL]" + {0x00, 2,11, 0, 8, 0,12, 1}, // 3C __ "XOR A, [N+%u]" + {0x00, 3,11, 0, 8, 0,13, 1}, // 3D __ "XOR A, [%U]" + {0x00, 1,11, 0, 8, 0,14, 0}, // 3E __ "XOR A, [X]" + {0x00, 1,11, 0, 8, 0,15, 0}, // 3F __ "XOR A, [Y]" + {0x00, 1, 2, 0, 8, 0, 8, 0}, // 40 __ "MOV A, A" + {0x00, 1, 2, 0, 8, 0, 9, 0}, // 41 __ "MOV A, B" + {0x00, 1, 2, 0, 8, 0,16, 0}, // 42 __ "MOV A, L" + {0x00, 1, 2, 0, 8, 0,17, 0}, // 43 __ "MOV A, H" + {0x00, 2, 2, 0, 8, 0,12, 1}, // 44 __ "MOV A, [N+%u]" + {0x00, 1, 2, 0, 8, 0,11, 0}, // 45 __ "MOV A, [HL]" + {0x00, 1, 2, 0, 8, 0,14, 0}, // 46 __ "MOV A, [X]" + {0x00, 1, 2, 0, 8, 0,15, 0}, // 47 __ "MOV A, [Y]" + {0x00, 1, 2, 0, 9, 0, 8, 0}, // 48 __ "MOV B, A" + {0x00, 1, 2, 0, 9, 0, 9, 0}, // 49 __ "MOV B, B" + {0x00, 1, 2, 0, 9, 0,16, 0}, // 4A __ "MOV B, L" + {0x00, 1, 2, 0, 9, 0,17, 0}, // 4B __ "MOV B, H" + {0x00, 2, 2, 0, 9, 0,12, 1}, // 4C __ "MOV B, [N+%u]" + {0x00, 1, 2, 0, 9, 0,11, 0}, // 4D __ "MOV B, [HL]" + {0x00, 1, 2, 0, 9, 0,14, 0}, // 4E __ "MOV B, [X]" + {0x00, 1, 2, 0, 9, 0,15, 0}, // 4F __ "MOV B, [Y]" + {0x00, 1, 2, 0,16, 0, 8, 0}, // 50 __ "MOV L, A" + {0x00, 1, 2, 0,16, 0, 9, 0}, // 51 __ "MOV L, B" + {0x00, 1, 2, 0,16, 0,16, 0}, // 52 __ "MOV L, L" + {0x00, 1, 2, 0,16, 0,17, 0}, // 53 __ "MOV L, H" + {0x00, 2, 2, 0,16, 0,12, 1}, // 54 __ "MOV L, [N+%u]" + {0x00, 1, 2, 0,16, 0,11, 0}, // 55 __ "MOV L, [HL]" + {0x00, 1, 2, 0,16, 0,14, 0}, // 56 __ "MOV L, [X]" + {0x00, 1, 2, 0,16, 0,15, 0}, // 57 __ "MOV L, [Y]" + {0x00, 1, 2, 0,17, 0, 8, 0}, // 58 __ "MOV H, A" + {0x00, 1, 2, 0,17, 0, 9, 0}, // 59 __ "MOV H, B" + {0x00, 1, 2, 0,17, 0,16, 0}, // 5A __ "MOV H, L" + {0x00, 1, 2, 0,17, 0,17, 0}, // 5B __ "MOV H, H" + {0x00, 2, 2, 0,17, 0,12, 1}, // 5C __ "MOV H, [N+%u]" + {0x00, 1, 2, 0,17, 0,11, 0}, // 5D __ "MOV H, [HL]" + {0x00, 1, 2, 0,17, 0,14, 0}, // 5E __ "MOV H, [X]" + {0x00, 1, 2, 0,17, 0,15, 0}, // 5F __ "MOV H, [Y]" + {0x00, 1, 2, 0,14, 0, 8, 0}, // 60 __ "MOV [X], A" + {0x00, 1, 2, 0,14, 0, 9, 0}, // 61 __ "MOV [X], B" + {0x00, 1, 2, 0,14, 0,16, 0}, // 62 __ "MOV [X], L" + {0x00, 1, 2, 0,14, 0,17, 0}, // 63 __ "MOV [X], H" + {0x00, 2, 2, 0,14, 0,12, 1}, // 64 __ "MOV [X], [N+%u]" + {0x00, 1, 2, 0,14, 0,11, 0}, // 65 __ "MOV [X], [HL]" + {0x00, 1, 2, 0,14, 0,14, 0}, // 66 __ "MOV [X], [X]" + {0x00, 1, 2, 0,14, 0,15, 0}, // 67 __ "MOV [X], [Y]" + {0x00, 1, 2, 0,11, 0, 8, 0}, // 68 __ "MOV [HL], A" + {0x00, 1, 2, 0,11, 0, 9, 0}, // 69 __ "MOV [HL], B" + {0x00, 1, 2, 0,11, 0,16, 0}, // 6A __ "MOV [HL], L" + {0x00, 1, 2, 0,11, 0,17, 0}, // 6B __ "MOV [HL], H" + {0x00, 2, 2, 0,11, 0,12, 1}, // 6C __ "MOV [HL], [N+%u]" + {0x00, 1, 2, 0,11, 0,11, 0}, // 6D __ "MOV [HL], [HL]" + {0x00, 1, 2, 0,11, 0,14, 0}, // 6E __ "MOV [HL], [X]" + {0x00, 1, 2, 0,11, 0,15, 0}, // 6F __ "MOV [HL], [Y]" + {0x00, 1, 2, 0,15, 0, 8, 0}, // 70 __ "MOV [Y], A" + {0x00, 1, 2, 0,15, 0, 9, 0}, // 71 __ "MOV [Y], B" + {0x00, 1, 2, 0,15, 0,16, 0}, // 72 __ "MOV [Y], L" + {0x00, 1, 2, 0,15, 0,17, 0}, // 73 __ "MOV [Y], H" + {0x00, 2, 2, 0,15, 0,12, 1}, // 74 __ "MOV [Y], [N+%u]" + {0x00, 1, 2, 0,15, 0,11, 0}, // 75 __ "MOV [Y], [HL]" + {0x00, 1, 2, 0,15, 0,14, 0}, // 76 __ "MOV [Y], [X]" + {0x00, 1, 2, 0,15, 0,15, 0}, // 77 __ "MOV [Y], [Y]" + {0x00, 2, 2, 0,12, 1, 8, 0}, // 78 __ "MOV [N+%u], A" + {0x00, 2, 2, 0,12, 1, 9, 0}, // 79 __ "MOV [N+%u], B" + {0x00, 2, 2, 0,12, 1,16, 0}, // 7A __ "MOV [N+%u], L" + {0x00, 2, 2, 0,12, 1,17, 0}, // 7B __ "MOV [N+%u], H" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // 7C __ ".DB $7C,%u" + {0x00, 2, 2, 0,12, 1,11, 0}, // 7D __ "MOV [N+%u], [HL]" + {0x00, 2, 2, 0,12, 1,14, 0}, // 7E __ "MOV [N+%u], [X]" + {0x00, 2, 2, 0,12, 1,15, 0}, // 7F __ "MOV [N+%u], [Y]" + {0x00, 1,12, 0, 8, 0, 0, 0}, // 80 __ "INC A" + {0x00, 1,12, 0, 9, 0, 0, 0}, // 81 __ "INC B" + {0x00, 1,12, 0,16, 0, 0, 0}, // 82 __ "INC L" + {0x00, 1,12, 0,17, 0, 0, 0}, // 83 __ "INC H" + {0x00, 1,12, 0,18, 0, 0, 0}, // 84 __ "INC N" + {0x00, 2,12, 0,12, 1, 0, 0}, // 85 __ "INC [N+%u]" + {0x00, 1,12, 0,11, 0, 0, 0}, // 86 __ "INC [HL]" + {0x00, 1,12, 0,19, 0, 0, 0}, // 87 __ "INC SP" + {0x00, 1,13, 0, 8, 0, 0, 0}, // 88 __ "DEC A" + {0x00, 1,13, 0, 9, 0, 0, 0}, // 89 __ "DEC B" + {0x00, 1,13, 0,16, 0, 0, 0}, // 8A __ "DEC L" + {0x00, 1,13, 0,17, 0, 0, 0}, // 8B __ "DEC H" + {0x00, 1,13, 0,18, 0, 0, 0}, // 8C __ "DEC N" + {0x00, 2,13, 0,12, 1, 0, 0}, // 8D __ "DEC [N+%u]" + {0x00, 1,13, 0,11, 0, 0, 0}, // 8E __ "DEC [HL]" + {0x00, 1,13, 0,19, 0, 0, 0}, // 8F __ "DEC SP" + {0x00, 1,12, 0,20, 0, 0, 0}, // 90 __ "INC BA" + {0x00, 1,12, 0,21, 0, 0, 0}, // 91 __ "INC HL" + {0x00, 1,12, 0,22, 0, 0, 0}, // 92 __ "INC X" + {0x00, 1,12, 0,23, 0, 0, 0}, // 93 __ "INC Y" + {0x00, 1,14, 0, 8, 0, 9, 0}, // 94 __ "TST A, B" + {0x00, 2,14, 0,11, 0, 4, 1}, // 95 __ "TST [HL], %u" + {0x00, 2,14, 0, 8, 0, 4, 1}, // 96 __ "TST A, %u" + {0x00, 2,14, 0, 9, 0, 4, 1}, // 97 __ "TST B, %u" + {0x00, 1,13, 0,20, 0, 0, 0}, // 98 __ "DEC BA" + {0x00, 1,13, 0,21, 0, 0, 0}, // 99 __ "DEC HL" + {0x00, 1,13, 0,22, 0, 0, 0}, // 9A __ "DEC X" + {0x00, 1,13, 0,23, 0, 0, 0}, // 9B __ "DEC Y" + {0x00, 2, 8, 0,24, 0, 4, 1}, // 9C __ "AND F, %u" + {0x00, 2, 9, 0,24, 0, 4, 1}, // 9D __ "OR F, %u" + {0x00, 2,11, 0,24, 0, 4, 1}, // 9E __ "XOR F, %u" + {0x00, 2, 2, 0,24, 0, 4, 1}, // 9F __ "MOV F, %u" + {0x00, 1,16, 0,20, 0, 0, 0}, // A0 __ "PUSH BA" + {0x00, 1,16, 0,21, 0, 0, 0}, // A1 __ "PUSH HL" + {0x00, 1,16, 0,22, 0, 0, 0}, // A2 __ "PUSH X" + {0x00, 1,16, 0,23, 0, 0, 0}, // A3 __ "PUSH Y" + {0x00, 1,16, 0,18, 0, 0, 0}, // A4 __ "PUSH N" + {0x00, 1,16, 0,25, 0, 0, 0}, // A5 __ "PUSH I" + {0x00, 1,18, 0, 0, 0, 0, 0}, // A6 __ "PUSHX" + {0x00, 1,16, 0,24, 0, 0, 0}, // A7 __ "PUSH F" + {0x00, 1,17, 0,20, 0, 0, 0}, // A8 __ "POP BA" + {0x00, 1,17, 0,21, 0, 0, 0}, // A9 __ "POP HL" + {0x00, 1,17, 0,22, 0, 0, 0}, // AA __ "POP X" + {0x00, 1,17, 0,23, 0, 0, 0}, // AB __ "POP Y" + {0x00, 1,17, 0,18, 0, 0, 0}, // AC __ "POP N" + {0x00, 1,17, 0,25, 0, 0, 0}, // AD __ "POP I" + {0x00, 1,19, 0, 0, 0, 0, 0}, // AE __ "POPX" + {0x00, 1,17, 0,24, 0, 0, 0}, // AF __ "POP F" + {0x00, 2, 2, 0, 8, 0, 4, 1}, // B0 __ "MOV A, %u" + {0x00, 2, 2, 0, 9, 0, 4, 1}, // B1 __ "MOV B, %u" + {0x00, 2, 2, 0,16, 0, 4, 1}, // B2 __ "MOV L, %u" + {0x00, 2, 2, 0,17, 0, 4, 1}, // B3 __ "MOV H, %u" + {0x00, 2, 2, 0,18, 0, 4, 1}, // B4 __ "MOV N, %u" + {0x00, 2, 2, 0,11, 0, 4, 1}, // B5 __ "MOV [HL], %u" + {0x00, 2, 2, 0,14, 0, 4, 1}, // B6 __ "MOV [X], %u" + {0x00, 2, 2, 0,15, 0, 4, 1}, // B7 __ "MOV [Y], %u" + {0x00, 3, 2, 0,20, 0,13, 1}, // B8 __ "MOV BA, [%U]" + {0x00, 3, 2, 0,21, 0,13, 1}, // B9 __ "MOV HL, [%U]" + {0x00, 3, 2, 0,22, 0,13, 1}, // BA __ "MOV X, [%U]" + {0x00, 3, 2, 0,23, 0,13, 1}, // BB __ "MOV Y, [%U]" + {0x00, 3, 2, 0,13, 1,20, 0}, // BC __ "MOV [%U], BA" + {0x00, 3, 2, 0,13, 1,21, 0}, // BD __ "MOV [%U], HL" + {0x00, 3, 2, 0,13, 1,22, 0}, // BE __ "MOV [%U], X" + {0x00, 3, 2, 0,13, 1,23, 0}, // BF __ "MOV [%U], Y" + {0x00, 3, 4, 0,20, 0, 5, 1}, // C0 __ "ADD BA, %U" + {0x00, 3, 4, 0,21, 0, 5, 1}, // C1 __ "ADD HL, %U" + {0x00, 3, 4, 0,22, 0, 5, 1}, // C2 __ "ADD X, %U" + {0x00, 3, 4, 0,23, 0, 5, 1}, // C3 __ "ADD Y, %U" + {0x00, 3, 2, 0,20, 0, 5, 1}, // C4 __ "MOV BA, %U" + {0x00, 3, 2, 0,21, 0, 5, 1}, // C5 __ "MOV HL, %U" + {0x00, 3, 2, 0,22, 0, 5, 1}, // C6 __ "MOV X, %U" + {0x00, 3, 2, 0,23, 0, 5, 1}, // C7 __ "MOV Y, %U" + {0x00, 1,20, 0,20, 0,21, 0}, // C8 __ "XCHG BA, HL" + {0x00, 1,20, 0,20, 0,22, 0}, // C9 __ "XCHG BA, X" + {0x00, 1,20, 0,20, 0,23, 0}, // CA __ "XCHG BA, Y" + {0x00, 1,20, 0,20, 0,19, 0}, // CB __ "XCHG BA, SP" + {0x00, 1,20, 0, 8, 0, 9, 0}, // CC __ "XCHG A, B" + {0x00, 1,20, 0, 8, 0,11, 0}, // CD __ "XCHG A, [HL]" + {0x00, 2, 3, 0, 8, 0, 4, 1}, // CE __ EXPAND CE + {0x00, 2, 3, 0, 9, 0, 4, 1}, // CF __ EXPAND CF + {0x00, 3, 6, 0,20, 0, 5, 1}, // D0 __ "SUB BA, %U" + {0x00, 3, 6, 0,21, 0, 5, 1}, // D1 __ "SUB HL, %U" + {0x00, 3, 6, 0,22, 0, 5, 1}, // D2 __ "SUB X, %U" + {0x00, 3, 6, 0,23, 0, 5, 1}, // D3 __ "SUB Y, %U" + {0x00, 3,10, 0,20, 0, 5, 1}, // D4 __ "CMP BA, %U" + {0x00, 3,10, 0,21, 0, 5, 1}, // D5 __ "CMP HL, %U" + {0x00, 3,10, 0,22, 0, 5, 1}, // D6 __ "CMP X, %U" + {0x00, 3,10, 0,23, 0, 5, 1}, // D7 __ "CMP Y, %U" + {0x00, 3, 8, 0,12, 1, 4, 2}, // D8 __ "AND [N+%u], %u" + {0x00, 3, 9, 0,12, 1, 4, 2}, // D9 __ "OR [N+%u], %u" + {0x00, 3,11, 0,12, 1, 4, 2}, // DA __ "XOR [N+%u], %u" + {0x00, 3,10, 0,12, 1, 4, 2}, // DB __ "CMP [N+%u], %u" + {0x00, 3,14, 0,12, 1, 4, 2}, // DC __ "TST [N+%u], %u" + {0x00, 3, 2, 0,12, 1, 4, 2}, // DD __ "MOV [N+%u], %u" + {0x00, 1,21, 0, 0, 0, 0, 0}, // DE __ "PACK" + {0x00, 1,22, 0, 0, 0, 0, 0}, // DF __ "UNPACK" + {0x00, 2,24, 1, 1, 1, 0, 0}, // E0 __ "CALLCb %j" + {0x00, 2,25, 1, 1, 1, 0, 0}, // E1 __ "CALLNCb %j" + {0x00, 2,26, 1, 1, 1, 0, 0}, // E2 __ "CALLZb %j" + {0x00, 2,27, 1, 1, 1, 0, 0}, // E3 __ "CALLNZb %j" + {0x00, 2,28, 1, 1, 1, 0, 0}, // E4 __ "JCb %j" + {0x00, 2,29, 1, 1, 1, 0, 0}, // E5 __ "JNCb %j" + {0x00, 2,30, 1, 1, 1, 0, 0}, // E6 __ "JZb %j" + {0x00, 2,31, 1, 1, 1, 0, 0}, // E7 __ "JNZb %j" + {0x00, 3,24, 2, 2, 1, 0, 0}, // E8 __ "CALLCw %J" + {0x00, 3,25, 2, 2, 1, 0, 0}, // E9 __ "CALLNCw %J" + {0x00, 3,26, 2, 2, 1, 0, 0}, // EA __ "CALLZw %J" + {0x00, 3,27, 2, 2, 1, 0, 0}, // EB __ "CALLNZw %J" + {0x00, 3,28, 2, 2, 1, 0, 0}, // EC __ "JCw %J" + {0x00, 3,29, 2, 2, 1, 0, 0}, // ED __ "JNCw %J" + {0x00, 3,30, 2, 2, 1, 0, 0}, // EE __ "JZw %J" + {0x00, 3,31, 2, 2, 1, 0, 0}, // EF __ "JNZw %J" + {0x00, 2,32, 1, 1, 1, 0, 0}, // F0 __ "CALLb %j" + {0x00, 2,33, 1, 1, 1, 0, 0}, // F1 __ "JMPb %j" + {0x00, 3,32, 2, 2, 1, 0, 0}, // F2 __ "CALLw %J" + {0x00, 3,33, 2, 2, 1, 0, 0}, // F3 __ "JMPw %J" + {0x00, 1,33, 0,21, 0, 0, 0}, // F4 __ "JMP HL" + {0x00, 2,34, 0, 1, 1, 0, 0}, // F5 __ "JDBNZ %j" + {0x00, 1,23, 0, 8, 0, 0, 0}, // F6 __ "SWAP A" + {0x00, 1,23, 0,11, 0, 0, 0}, // F7 __ "SWAP [HL]" + {0x00, 1,35, 0, 0, 0, 0, 0}, // F8 __ "RET" + {0x00, 1,36, 0, 0, 0, 0, 0}, // F9 __ "RETI" + {0x00, 1,37, 0, 0, 0, 0, 0}, // FA __ "RETSKIP" + {0x00, 3,32, 0, 5, 1, 0, 0}, // FB __ "CALL [%U]" + {0x00, 2,38, 0, 3, 1, 0, 0}, // FC __ "CINT %i" + {0x00, 2,39, 0, 3, 1, 0, 0}, // FD __ "JINT %i" + {0x00, 1, 0, 0, 4, 0, 0, 0}, // FE __ ".DB $FE" + {0x00, 1, 1, 0, 0, 0, 0, 0}, // FF __ "NOP" +}; + +InstructionInfo DebugCPUInstructions_CE[256] = { + {0x00, 3, 4, 0, 8, 0,28, 2}, // CE 00 "ADD A, [X+%s]" + {0x00, 3, 4, 0, 8, 0,29, 2}, // CE 01 "ADD A, [Y+%s]" + {0x00, 2, 4, 0, 8, 0,30, 0}, // CE 02 "ADD A, [X+L]" + {0x00, 2, 4, 0, 8, 0,31, 0}, // CE 03 "ADD A, [Y+L]" + {0x00, 2, 4, 0,11, 0, 8, 0}, // CE 04 "ADD [HL], A" + {0x00, 3, 4, 0,11, 0, 4, 2}, // CE 05 "ADD [HL], %u" + {0x00, 2, 4, 0,11, 0,14, 0}, // CE 06 "ADD [HL], [X]" + {0x00, 2, 4, 0,11, 0,15, 0}, // CE 07 "ADD [HL], [Y]" + {0x00, 3, 5, 0, 8, 0,28, 2}, // CE 08 "ADC A, [X+%s]" + {0x00, 3, 5, 0, 8, 0,29, 2}, // CE 09 "ADC A, [Y+%s]" + {0x00, 2, 5, 0, 8, 0,30, 0}, // CE 0A "ADC A, [X+L]" + {0x00, 2, 5, 0, 8, 0,31, 0}, // CE 0B "ADC A, [Y+L]" + {0x00, 2, 5, 0,11, 0, 8, 0}, // CE 0C "ADC [HL], A" + {0x00, 3, 5, 0,11, 0, 4, 2}, // CE 0D "ADC [HL], %u" + {0x00, 2, 5, 0,11, 0,14, 0}, // CE 0E "ADC [HL], [X]" + {0x00, 2, 5, 0,11, 0,15, 0}, // CE 0F "ADC [HL], [Y]" + {0x00, 3, 6, 0, 8, 0,28, 2}, // CE 10 "SUB A, [X+%s]" + {0x00, 3, 6, 0, 8, 0,29, 2}, // CE 11 "SUB A, [Y+%s]" + {0x00, 2, 6, 0, 8, 0,30, 0}, // CE 12 "SUB A, [X+L]" + {0x00, 2, 6, 0, 8, 0,31, 0}, // CE 13 "SUB A, [Y+L]" + {0x00, 2, 6, 0,11, 0, 8, 0}, // CE 14 "SUB [HL], A" + {0x00, 3, 6, 0,11, 0, 4, 2}, // CE 15 "SUB [HL], %u" + {0x00, 2, 6, 0,11, 0,14, 0}, // CE 16 "SUB [HL], [X]" + {0x00, 2, 6, 0,11, 0,15, 0}, // CE 17 "SUB [HL], [Y]" + {0x00, 3, 7, 0, 8, 0,28, 2}, // CE 18 "SBC A, [X+%s]" + {0x00, 3, 7, 0, 8, 0,29, 2}, // CE 19 "SBC A, [Y+%s]" + {0x00, 2, 7, 0, 8, 0,30, 0}, // CE 1A "SBC A, [X+L]" + {0x00, 2, 7, 0, 8, 0,31, 0}, // CE 1B "SBC A, [Y+L]" + {0x00, 2, 7, 0,11, 0, 8, 0}, // CE 1C "SBC [HL], A" + {0x00, 3, 7, 0,11, 0, 4, 2}, // CE 1D "SBC [HL], %u" + {0x00, 2, 7, 0,11, 0,14, 0}, // CE 1E "SBC [HL], [X]" + {0x00, 2, 7, 0,11, 0,15, 0}, // CE 1F "SBC [HL], [Y]" + {0x00, 3, 8, 0, 8, 0,28, 2}, // CE 20 "AND A, [X+%s]" + {0x00, 3, 8, 0, 8, 0,29, 2}, // CE 21 "AND A, [Y+%s]" + {0x00, 2, 8, 0, 8, 0,30, 0}, // CE 22 "AND A, [X+L]" + {0x00, 2, 8, 0, 8, 0,31, 0}, // CE 23 "AND A, [Y+L]" + {0x00, 2, 8, 0,11, 0, 8, 0}, // CE 24 "AND [HL], A" + {0x00, 3, 8, 0,11, 0, 4, 2}, // CE 25 "AND [HL], %u" + {0x00, 2, 8, 0,11, 0,14, 0}, // CE 26 "AND [HL], [X]" + {0x00, 2, 8, 0,11, 0,15, 0}, // CE 27 "AND [HL], [Y]" + {0x00, 3, 9, 0, 8, 0,28, 2}, // CE 28 "OR A, [X+%s]" + {0x00, 3, 9, 0, 8, 0,29, 2}, // CE 29 "OR A, [Y+%s]" + {0x00, 2, 9, 0, 8, 0,30, 0}, // CE 2A "OR A, [X+L]" + {0x00, 2, 9, 0, 8, 0,31, 0}, // CE 2B "OR A, [Y+L]" + {0x00, 2, 9, 0,11, 0, 8, 0}, // CE 2C "OR [HL], A" + {0x00, 3, 9, 0,11, 0, 4, 2}, // CE 2D "OR [HL], %u" + {0x00, 2, 9, 0,11, 0,14, 0}, // CE 2E "OR [HL], [X]" + {0x00, 2, 9, 0,11, 0,15, 0}, // CE 2F "OR [HL], [Y]" + {0x00, 3,10, 0, 8, 0,28, 2}, // CE 30 "CMP A, [X+%s]" + {0x00, 3,10, 0, 8, 0,29, 2}, // CE 31 "CMP A, [Y+%s]" + {0x00, 2,10, 0, 8, 0,30, 0}, // CE 32 "CMP A, [X+L]" + {0x00, 2,10, 0, 8, 0,31, 0}, // CE 33 "CMP A, [Y+L]" + {0x00, 2,10, 0,11, 0, 8, 0}, // CE 34 "CMP [HL], A" + {0x00, 3,10, 0,11, 0, 4, 2}, // CE 35 "CMP [HL], %u" + {0x00, 2,10, 0,11, 0,14, 0}, // CE 36 "CMP [HL], [X]" + {0x00, 2,10, 0,11, 0,15, 0}, // CE 37 "CMP [HL], [Y]" + {0x00, 3,10, 0, 8, 0,28, 2}, // CE 38 "XOR A, [X+%s]" + {0x00, 3,10, 0, 8, 0,29, 2}, // CE 39 "XOR A, [Y+%s]" + {0x00, 2,10, 0, 8, 0,30, 0}, // CE 3A "XOR A, [X+L]" + {0x00, 2,10, 0, 8, 0,31, 0}, // CE 3B "XOR A, [Y+L]" + {0x00, 2,10, 0,11, 0, 8, 0}, // CE 3C "XOR [HL], A" + {0x00, 3,10, 0,11, 0, 4, 2}, // CE 3D "XOR [HL], %u" + {0x00, 2,10, 0,11, 0,14, 0}, // CE 3E "XOR [HL], [X]" + {0x00, 2,10, 0,11, 0,15, 0}, // CE 3F "XOR [HL], [Y]" + {0x00, 3, 2, 0, 8, 0,28, 2}, // CE 40 "MOV A, [X+%s]" + {0x00, 3, 2, 0, 8, 0,29, 2}, // CE 41 "MOV A, [Y+%s]" + {0x00, 2, 2, 0, 8, 0,30, 0}, // CE 42 "MOV A, [X+L]" + {0x00, 2, 2, 0, 8, 0,31, 0}, // CE 43 "MOV A, [Y+L]" + {0x00, 3, 2, 0,28, 2, 8, 0}, // CE 44 "MOV [X+%s], A" + {0x00, 3, 2, 0,29, 2, 8, 0}, // CE 45 "MOV [Y+%s], A" + {0x00, 2, 2, 0,30, 0, 8, 0}, // CE 46 "MOV [X+L], A" + {0x00, 2, 2, 0,31, 0, 8, 0}, // CE 47 "MOV [Y+L], A" + {0x00, 3, 2, 0, 9, 0,28, 2}, // CE 48 "MOV B, [X+%s]" + {0x00, 3, 2, 0, 9, 0,29, 2}, // CE 49 "MOV B, [Y+%s]" + {0x00, 2, 2, 0, 9, 0,30, 0}, // CE 4A "MOV B, [X+L]" + {0x00, 2, 2, 0, 9, 0,31, 0}, // CE 4B "MOV B, [Y+L]" + {0x00, 3, 2, 0,28, 2, 9, 0}, // CE 4C "MOV [X+%s], B" + {0x00, 3, 2, 0,29, 2, 9, 0}, // CE 4D "MOV [Y+%s], B" + {0x00, 2, 2, 0,30, 0, 9, 0}, // CE 4E "MOV [X+L], B" + {0x00, 2, 2, 0,31, 0, 9, 0}, // CE 4F "MOV [Y+L], B" + {0x00, 3, 2, 0,16, 0,28, 2}, // CE 50 "MOV L, [X+%s]" + {0x00, 3, 2, 0,16, 0,29, 2}, // CE 51 "MOV L, [Y+%s]" + {0x00, 2, 2, 0,16, 0,30, 0}, // CE 52 "MOV L, [X+L]" + {0x00, 2, 2, 0,16, 0,31, 0}, // CE 53 "MOV L, [Y+L]" + {0x00, 3, 2, 0,28, 2,16, 0}, // CE 54 "MOV [X+%s], L" + {0x00, 3, 2, 0,29, 2,16, 0}, // CE 55 "MOV [Y+%s], L" + {0x00, 2, 2, 0,30, 0,16, 0}, // CE 56 "MOV [X+L], L" + {0x00, 2, 2, 0,31, 0,16, 0}, // CE 57 "MOV [Y+L], L" + {0x00, 3, 2, 0,17, 0,28, 2}, // CE 58 "MOV H, [X+%s]" + {0x00, 3, 2, 0,17, 0,29, 2}, // CE 59 "MOV H, [Y+%s]" + {0x00, 2, 2, 0,17, 0,30, 0}, // CE 5A "MOV H, [X+L]" + {0x00, 2, 2, 0,17, 0,31, 0}, // CE 5B "MOV H, [Y+L]" + {0x00, 3, 2, 0,28, 2,17, 0}, // CE 5C "MOV [X+%s], H" + {0x00, 3, 2, 0,29, 2,17, 0}, // CE 5D "MOV [Y+%s], H" + {0x00, 2, 2, 0,30, 0,17, 0}, // CE 5E "MOV [X+L], H" + {0x00, 2, 2, 0,31, 0,17, 0}, // CE 5F "MOV [Y+L], H" + {0x00, 3, 2, 0,11, 0,28, 2}, // CE 60 "MOV [HL], [X+%s]" + {0x00, 3, 2, 0,11, 0,29, 2}, // CE 61 "MOV [HL], [Y+%s]" + {0x00, 2, 2, 0,11, 0,30, 0}, // CE 62 "MOV [HL], [X+L]" + {0x00, 2, 2, 0,11, 0,31, 0}, // CE 63 "MOV [HL], [Y+L]" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 64 ".DB $CE,$65,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 65 ".DB $CE,$66,%u,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 66 ".DB $CE,$67,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 67 ".DB $CE,$68,%u" + {0x00, 3, 2, 0,14, 0,28, 2}, // CE 68 "MOV [X], [X+%s]" + {0x00, 3, 2, 0,14, 0,29, 2}, // CE 69 "MOV [X], [Y+%s]" + {0x00, 2, 2, 0,14, 0,30, 0}, // CE 6A "MOV [X], [X+L]" + {0x00, 2, 2, 0,14, 0,31, 0}, // CE 6B "MOV [X], [Y+L]" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 6C ".DB $CE,$6C,%u,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 6D ".DB $CE,$6D,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 6E ".DB $CE,$6E,%u" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 6F ".DB $CE,$6F" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 70 ".DB $CE,$70,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 71 ".DB $CE,$71,%u" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 72 ".DB $CE,$72" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 73 ".DB $CE,$73" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 74 ".DB $CE,$74,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 75 ".DB $CE,$75,%u" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 76 ".DB $CE,$76" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 77 ".DB $CE,$77" + {0x00, 3, 2, 0,15, 0,28, 2}, // CE 78 "MOV [Y], [X+%s]" + {0x00, 3, 2, 0,15, 0,29, 2}, // CE 79 "MOV [Y], [Y+%s]" + {0x00, 2, 2, 0,15, 0,30, 0}, // CE 7A "MOV [Y], [X+L]" + {0x00, 2, 2, 0,15, 0,31, 0}, // CE 7B "MOV [Y], [Y+L]" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 7C ".DB $CE,$7C,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE 7D ".DB $CE,$7D,%u" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 7E ".DB $CE,$7E" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 7F ".DB $CE,$7F" + {0x00, 2,40, 0, 8, 0, 0, 0}, // CE 80 "SAL A" + {0x00, 2,40, 0, 9, 0, 0, 0}, // CE 81 "SAL B" + {0x00, 3,40, 0,12, 2, 0, 0}, // CE 82 "SAL [N+%u]" + {0x00, 2,40, 0,11, 0, 0, 0}, // CE 83 "SAL [HL]" + {0x00, 2,41, 0, 8, 0, 0, 0}, // CE 84 "SHL A" + {0x00, 2,41, 0, 9, 0, 0, 0}, // CE 85 "SHL B" + {0x00, 3,41, 0,12, 2, 0, 0}, // CE 86 "SHL [N+%u]" + {0x00, 2,41, 0,11, 0, 0, 0}, // CE 87 "SHL [HL]" + {0x00, 2,42, 0, 8, 0, 0, 0}, // CE 88 "SAR A" + {0x00, 2,42, 0, 9, 0, 0, 0}, // CE 89 "SAR B" + {0x00, 3,42, 0,12, 2, 0, 0}, // CE 8A "SAR [N+%u]" + {0x00, 2,42, 0,11, 0, 0, 0}, // CE 8B "SAR [HL]" + {0x00, 2,43, 0, 8, 0, 0, 0}, // CE 8C "SHR A" + {0x00, 2,43, 0, 9, 0, 0, 0}, // CE 8D "SHR B" + {0x00, 3,43, 0,12, 2, 0, 0}, // CE 8E "SHR [N+%u]" + {0x00, 2,43, 0,11, 0, 0, 0}, // CE 8F "SHR [HL]" + {0x00, 2,44, 0, 8, 0, 0, 0}, // CE 90 "ROLC A" + {0x00, 2,44, 0, 9, 0, 0, 0}, // CE 91 "ROLC B" + {0x00, 3,44, 0,12, 2, 0, 0}, // CE 92 "ROLC [N+%u]" + {0x00, 2,44, 0,11, 0, 0, 0}, // CE 93 "ROLC [HL]" + {0x00, 2,45, 0, 8, 0, 0, 0}, // CE 94 "ROL A" + {0x00, 2,45, 0, 9, 0, 0, 0}, // CE 95 "ROL B" + {0x00, 3,45, 0,12, 2, 0, 0}, // CE 96 "ROL [N+%u]" + {0x00, 2,45, 0,11, 0, 0, 0}, // CE 97 "ROL [HL]" + {0x00, 2,46, 0, 8, 0, 0, 0}, // CE 98 "RORC A" + {0x00, 2,46, 0, 9, 0, 0, 0}, // CE 99 "RORC B" + {0x00, 3,46, 0,12, 2, 0, 0}, // CE 9A "RORC [N+%u]" + {0x00, 2,46, 0,11, 0, 0, 0}, // CE 9B "RORC [HL]" + {0x00, 2,47, 0, 8, 0, 0, 0}, // CE 9C "ROR A" + {0x00, 2,47, 0, 9, 0, 0, 0}, // CE 9D "ROR B" + {0x00, 3,47, 0,12, 2, 0, 0}, // CE 9E "ROR [N+%u]" + {0x00, 2,47, 0,11, 0, 0, 0}, // CE 9F "ROR [HL]" + {0x00, 2,48, 0, 8, 0, 0, 0}, // CE A0 "NOT A" + {0x00, 2,48, 0, 9, 0, 0, 0}, // CE A1 "NOT B" + {0x00, 3,48, 0,12, 2, 0, 0}, // CE A2 "NOT [N+%u]" + {0x00, 2,48, 0,11, 0, 0, 0}, // CE A3 "NOT [HL]" + {0x00, 2,49, 0, 8, 0, 0, 0}, // CE A4 "NEG A" + {0x00, 2,49, 0, 9, 0, 0, 0}, // CE A5 "NEG B" + {0x00, 3,49, 0,12, 2, 0, 0}, // CE A6 "NEG [N+%u]" + {0x00, 2,49, 0,11, 0, 0, 0}, // CE A7 "NEG [HL]" + {0x00, 2,15, 0,20, 0, 8, 0}, // CE A8 "EX BA, A" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE A9 ".DB $CE,$A9" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE AA ".DB $CE,$AA" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE AB ".DB $CE,$AB" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE AC ".DB $CE,$AC" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE AD ".DB $CE,$AD" + {0x00, 2,89, 0, 0, 0, 0, 0}, // CE AE "HALT" + {0x00, 2,88, 0, 0, 0, 0, 0}, // CE AF "STOP" + {0x00, 3, 8, 0, 9, 0,10, 2}, // CE B0 "AND B, %u" + {0x00, 3, 8, 0,16, 0,10, 2}, // CE B1 "AND L, %u" + {0x00, 3, 8, 0,17, 0,10, 2}, // CE B2 "AND H, %u" + {0x00, 2, 0, 0, 0, 0, 0, 0}, // CE B3 ".DB $CE,$B3" + {0x00, 3, 9, 0, 9, 0,10, 2}, // CE B4 "OR B, %u" + {0x00, 3, 9, 0,16, 0,10, 2}, // CE B5 "OR L, %u" + {0x00, 3, 9, 0,17, 0,10, 2}, // CE B6 "OR H, %u" + {0x00, 2, 0, 0, 0, 0, 0, 0}, // CE B7 ".DB $CE,$B7" + {0x00, 3,11, 0, 9, 0,10, 2}, // CE B8 "XOR B, %u" + {0x00, 3,11, 0,16, 0,10, 2}, // CE B9 "XOR L, %u" + {0x00, 3,11, 0,17, 0,10, 2}, // CE BA "XOR H, %u" + {0x00, 2, 0, 0, 0, 0, 0, 0}, // CE BB ".DB $CE,$B3" + {0x00, 3,10, 0, 9, 0,10, 2}, // CE BC "CMP B, %u" + {0x00, 3,10, 0,16, 0,10, 2}, // CE BD "CMP L, %u" + {0x00, 3,10, 0,17, 0,10, 2}, // CE BE "CMP H, %u" + {0x00, 3,10, 0,18, 0,10, 2}, // CE BF "CMP N, %u" + {0x00, 2, 2, 0, 8, 0,18, 0}, // CE C0 "MOV A, N" + {0x00, 2, 2, 0, 8, 0,24, 0}, // CE C1 "MOV A, F" + {0x00, 2, 2, 0,18, 0, 8, 0}, // CE C2 "MOV N, A" + {0x00, 2, 2, 0,24, 0, 8, 0}, // CE C3 "MOV F, A" + {0x00, 3, 2, 0,32, 0, 4, 2}, // CE C4 "MOV U, %u" + {0x00, 3, 2, 0,25, 0, 4, 2}, // CE C5 "MOV I, %u" + {0x00, 3, 2, 0,34, 0, 4, 2}, // CE C6 "MOV XI, %u" + {0x00, 3, 2, 0,35, 0, 4, 2}, // CE C7 "MOV YI, %u" + {0x00, 2, 2, 0, 8, 0,33, 0}, // CE C8 "MOV A, V" + {0x00, 2, 2, 0, 8, 0,25, 0}, // CE C9 "MOV A, I" + {0x00, 2, 2, 0, 8, 0,34, 0}, // CE CA "MOV A, XI" + {0x00, 2, 2, 0, 8, 0,35, 0}, // CE CB "MOV A, YI" + {0x00, 2, 2, 0,32, 0, 8, 0}, // CE CC "MOV U, A" + {0x00, 2, 2, 0,25, 0, 8, 0}, // CE CD "MOV I, A" + {0x00, 2, 2, 0,34, 0, 8, 0}, // CE CE "MOV XI, A" + {0x00, 2, 2, 0,35, 0, 8, 0}, // CE CF "MOV YI, A" + {0x00, 4, 2, 0, 8, 0,13, 2}, // CE D0 "MOV A, [%U]" + {0x00, 4, 2, 0, 9, 0,13, 2}, // CE D1 "MOV B, [%U]" + {0x00, 4, 2, 0,16, 0,13, 2}, // CE D2 "MOV L, [%U]" + {0x00, 4, 2, 0,17, 0,13, 2}, // CE D3 "MOV H, [%U]" + {0x00, 4, 2, 0,13, 2, 8, 0}, // CE D4 "MOV [%U], A" + {0x00, 4, 2, 0,13, 2, 9, 0}, // CE D5 "MOV [%U], B" + {0x00, 4, 2, 0,13, 2,16, 0}, // CE D6 "MOV [%U], L" + {0x00, 4, 2, 0,13, 2,17, 0}, // CE D7 "MOV [%U], H" + {0x00, 2,50, 0,16, 0, 8, 0}, // CE D8 "MUL L, A" + {0x00, 2,51, 0,21, 0, 8, 0}, // CE D9 "DIV HL, A" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE DA ".DB $CE,$DA,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE DB ".DB $CE,$DB,%u" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE DC ".DB $CE,$DC" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE DD ".DB $CE,$DD" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE DE ".DB $CE,$DE,%u" + {0x00, 3, 0, 0, 4, 0, 4, 0}, // CE DF ".DB $CE,$DF,%u" + {0x00, 3,56, 0,38, 2, 0, 0}, // CE E0 "JL %h" + {0x00, 3,57, 0,38, 2, 0, 0}, // CE E1 "JLE %h" + {0x00, 3,58, 0,38, 2, 0, 0}, // CE E2 "JG %h" + {0x00, 3,59, 0,38, 2, 0, 0}, // CE E3 "JGE %h" + {0x00, 3,60, 0,38, 2, 0, 0}, // CE E4 "JO %h" + {0x00, 3,61, 0,38, 2, 0, 0}, // CE E5 "JNO %h" + {0x00, 3,62, 0,38, 2, 0, 0}, // CE E6 "JNS %h" + {0x00, 3,63, 0,38, 2, 0, 0}, // CE E7 "JS %h" + {0x00, 3,64, 0,38, 2, 0, 0}, // CE E8 "JNX0 %h" + {0x00, 3,65, 0,38, 2, 0, 0}, // CE E9 "JNX1 %h" + {0x00, 3,66, 0,38, 2, 0, 0}, // CE EA "JNX2 %h" + {0x00, 3,67, 0,38, 2, 0, 0}, // CE EB "JNX3 %h" + {0x00, 3,68, 0,38, 2, 0, 0}, // CE EC "JX0 %h" + {0x00, 2,69, 0,38, 2, 0, 0}, // CE ED "JX1 %h" + {0x00, 3,70, 0,38, 2, 0, 0}, // CE EE "JX2 %h" + {0x00, 3,71, 0,38, 2, 0, 0}, // CE EF "JX3 %h" + {0x00, 3,72, 0,38, 2, 0, 0}, // CE F0 "CALLL %h" + {0x00, 3,73, 0,38, 2, 0, 0}, // CE F1 "CALLLE %h" + {0x00, 3,74, 0,38, 2, 0, 0}, // CE F2 "CALLG %h" + {0x00, 3,75, 0,38, 2, 0, 0}, // CE F3 "CALLGE %h" + {0x00, 3,76, 0,38, 2, 0, 0}, // CE F4 "CALLO %h" + {0x00, 3,77, 0,38, 2, 0, 0}, // CE F5 "CALLNO %h" + {0x00, 3,78, 0,38, 2, 0, 0}, // CE F6 "CALLNS %h" + {0x00, 3,79, 0,38, 2, 0, 0}, // CE F7 "CALLS %h" + {0x00, 3,80, 0,38, 2, 0, 0}, // CE F8 "CALLNX0 %h" + {0x00, 3,81, 0,38, 2, 0, 0}, // CE F9 "CALLNX1 %h" + {0x00, 3,82, 0,38, 2, 0, 0}, // CE FA "CALLNX2 %h" + {0x00, 3,83, 0,38, 2, 0, 0}, // CE FB "CALLNX3 %h" + {0x00, 3,84, 0,38, 2, 0, 0}, // CE FC "CALLX0 %h" + {0x00, 3,85, 0,38, 2, 0, 0}, // CE FD "CALLX1 %h" + {0x00, 3,86, 0,38, 2, 0, 0}, // CE FE "CALLX2 %h" + {0x00, 3,87, 0,38, 2, 0, 0} // CE FF "CALLX3 %h" +}; + +InstructionInfo DebugCPUInstructions_CF[256] = { + {0x00, 2, 4, 0,20, 0,20, 0}, // CE 00 "ADD BA, BA" + {0x00, 2, 4, 0,20, 0,21, 0}, // CE 01 "ADD BA, HL" + {0x00, 2, 4, 0,20, 0,22, 0}, // CE 02 "ADD BA, X" + {0x00, 2, 4, 0,20, 0,23, 0}, // CE 03 "ADD BA, Y" + {0x00, 2, 5, 0,20, 0,20, 0}, // CE 04 "ADC BA, BA" + {0x00, 2, 5, 0,20, 0,21, 0}, // CE 05 "ADC BA, HL" + {0x00, 2, 5, 0,20, 0,22, 0}, // CE 06 "ADC BA, X" + {0x00, 2, 5, 0,20, 0,23, 0}, // CE 07 "ADC BA, Y" + {0x00, 2, 6, 0,20, 0,20, 0}, // CE 08 "SUB BA, BA" + {0x00, 2, 6, 0,20, 0,21, 0}, // CE 09 "SUB BA, HL" + {0x00, 2, 6, 0,20, 0,22, 0}, // CE 0A "SUB BA, X" + {0x00, 2, 6, 0,20, 0,23, 0}, // CE 0B "SUB BA, Y" + {0x00, 2, 7, 0,20, 0,20, 0}, // CE 0C "SBC BA, BA" + {0x00, 2, 7, 0,20, 0,21, 0}, // CE 0D "SBC BA, HL" + {0x00, 2, 7, 0,20, 0,22, 0}, // CE 0E "SBC BA, X" + {0x00, 2, 7, 0,20, 0,23, 0}, // CE 0F "SBC BA, Y" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 10 ".DB $CF,$10" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 11 ".DB $CF,$11" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 12 ".DB $CF,$12" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 13 ".DB $CF,$13" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 14 ".DB $CF,$14" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 15 ".DB $CF,$15" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 16 ".DB $CF,$16" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 17 ".DB $CF,$17" + {0x00, 2,10, 0,20, 0,20, 0}, // CE 18 "CMP BA, BA" + {0x00, 2,10, 0,20, 0,21, 0}, // CE 19 "CMP BA, HL" + {0x00, 2,10, 0,20, 0,22, 0}, // CE 1A "CMP BA, X" + {0x00, 2,10, 0,20, 0,23, 0}, // CE 1B "CMP BA, Y" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 1C ".DB $CF,$1C" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 1D ".DB $CF,$1D" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 1E ".DB $CF,$1E" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 1F ".DB $CF,$1F" + {0x00, 2, 4, 0,21, 0,20, 0}, // CE 20 "ADD HL, BA" + {0x00, 2, 4, 0,21, 0,21, 0}, // CE 21 "ADD HL, HL" + {0x00, 2, 4, 0,21, 0,22, 0}, // CE 22 "ADD HL, X" + {0x00, 2, 4, 0,21, 0,23, 0}, // CE 23 "ADD HL, Y" + {0x00, 2, 5, 0,21, 0,20, 0}, // CE 24 "ADC HL, BA" + {0x00, 2, 5, 0,21, 0,21, 0}, // CE 25 "ADC HL, HL" + {0x00, 2, 5, 0,21, 0,22, 0}, // CE 26 "ADC HL, X" + {0x00, 2, 5, 0,21, 0,23, 0}, // CE 27 "ADC HL, Y" + {0x00, 2, 6, 0,21, 0,20, 0}, // CE 28 "SUB HL, BA" + {0x00, 2, 6, 0,21, 0,21, 0}, // CE 29 "SUB HL, HL" + {0x00, 2, 6, 0,21, 0,22, 0}, // CE 2A "SUB HL, X" + {0x00, 2, 6, 0,21, 0,23, 0}, // CE 2B "SUB HL, Y" + {0x00, 2, 7, 0,21, 0,20, 0}, // CE 2C "SBC HL, BA" + {0x00, 2, 7, 0,21, 0,21, 0}, // CE 2D "SBC HL, HL" + {0x00, 2, 7, 0,21, 0,22, 0}, // CE 2E "SBC HL, X" + {0x00, 2, 7, 0,21, 0,23, 0}, // CE 2F "SBC HL, Y" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 30 ".DB $CF,$30" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 31 ".DB $CF,$31" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 32 ".DB $CF,$32" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 33 ".DB $CF,$33" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 34 ".DB $CF,$34" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 35 ".DB $CF,$35" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 36 ".DB $CF,$36" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 37 ".DB $CF,$37" + {0x00, 2,10, 0,21, 0,20, 0}, // CE 38 "CMP HL, BA" + {0x00, 2,10, 0,21, 0,21, 0}, // CE 39 "CMP HL, HL" + {0x00, 2,10, 0,21, 0,22, 0}, // CE 3A "CMP HL, X" + {0x00, 2,10, 0,21, 0,23, 0}, // CE 3B "CMP HL, Y" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 3C ".DB $CF,$3C" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 3D ".DB $CF,$3D" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 3E ".DB $CF,$3E" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 3F ".DB $CF,$3F" + {0x00, 2, 4, 0,22, 0,20, 0}, // CE 40 "ADD X, BA" + {0x00, 2, 4, 0,22, 0,21, 0}, // CE 41 "ADD X, HL" + {0x00, 2, 4, 0,23, 0,20, 0}, // CE 42 "ADD Y, BA" + {0x00, 2, 4, 0,23, 0,21, 0}, // CE 43 "ADD Y, HL" + {0x00, 2, 4, 0,19, 0,20, 0}, // CE 44 "ADD SP, BA" + {0x00, 2, 4, 0,19, 0,21, 0}, // CE 45 "ADD SP, HL" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 46 ".DB $CF,$46" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 47 ".DB $CF,$47" + {0x00, 2, 6, 0,22, 0,20, 0}, // CE 48 "SUB X, BA" + {0x00, 2, 6, 0,22, 0,21, 0}, // CE 49 "SUB X, HL" + {0x00, 2, 6, 0,23, 0,20, 0}, // CE 4A "SUB Y, BA" + {0x00, 2, 6, 0,23, 0,21, 0}, // CE 4B "SUB Y, HL" + {0x00, 2, 6, 0,19, 0,20, 0}, // CE 4C "SUB SP, BA" + {0x00, 2, 6, 0,19, 0,21, 0}, // CE 4D "SUB SP, HL" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 4E ".DB $CF,$4E" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 4F ".DB $CF,$4F" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 50 ".DB $CF,$50" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 51 ".DB $CF,$51" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 52 ".DB $CF,$52" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 53 ".DB $CF,$53" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 54 ".DB $CF,$54" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 55 ".DB $CF,$55" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 56 ".DB $CF,$56" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 57 ".DB $CF,$57" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 58 ".DB $CF,$58" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 59 ".DB $CF,$59" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 5A ".DB $CF,$5A" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 5B ".DB $CF,$5B" + {0x00, 2,10, 0,19, 0,20, 0}, // CE 5C "CMP SP, BA" + {0x00, 2,10, 0,19, 0,21, 0}, // CE 5D "CMP SP, HL" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 5E ".DB $CF,$5E" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 5F ".DB $CF,$5F" + {0x00, 4, 5, 0,20, 0, 5, 2}, // CE 60 "ADC BA, %U" + {0x00, 4, 5, 0,21, 0, 5, 2}, // CE 61 "ADC HL, %U" + {0x00, 4, 7, 0,20, 0, 5, 2}, // CE 62 "SBC BA, %U" + {0x00, 4, 7, 0,21, 0, 5, 2}, // CE 63 "SBC HL, %U" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 64 ".DB $CF,$64" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 65 ".DB $CF,$65" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 66 ".DB $CF,$66" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 67 ".DB $CF,$67" + {0x00, 4, 4, 0,19, 0, 5, 2}, // CE 68 "ADD SP, %U" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 69 ".DB $CF,$69" + {0x00, 4, 6, 0,19, 0, 5, 2}, // CE 6A "SUB SP, %U" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 6B ".DB $CF,$6B" + {0x00, 4,10, 0,19, 0, 5, 2}, // CE 6C "CMP SP, %U" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 6D ".DB $CF,$6D" + {0x00, 4, 2, 0,19, 0, 5, 2}, // CE 6E "MOV SP, %U" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE 6F ".DB $CF,$6F" + {0x00, 3, 2, 0,20, 0,36, 2}, // CE 70 "MOV BA, [SP+%s]" + {0x00, 3, 2, 0,21, 0,36, 2}, // CE 71 "MOV HL, [SP+%s]" + {0x00, 3, 2, 0,22, 0,36, 2}, // CE 72 "MOV X, [SP+%s]" + {0x00, 3, 2, 0,23, 0,36, 2}, // CE 73 "MOV Y, [SP+%s]" + {0x00, 3, 2, 0,36, 2,20, 0}, // CE 74 "MOV [SP+%s], BA" + {0x00, 3, 2, 0,36, 2,21, 0}, // CE 75 "MOV [SP+%s], HL" + {0x00, 3, 2, 0,36, 2,22, 0}, // CE 76 "MOV [SP+%s], X" + {0x00, 3, 2, 0,36, 2,23, 0}, // CE 77 "MOV [SP+%s], Y" + {0x00, 4, 2, 0,19, 0,13, 2}, // CE 78 "MOV SP, [%U]" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 79 ".DB $CF,$79,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 7A ".DB $CF,$7A,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 7B ".DB $CF,$7B,%u,%u" + {0x00, 4, 2, 0,13, 2,19, 0}, // CE 7C "MOV [%U], SP" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 7D ".DB $CF,$7D,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 7E ".DB $CF,$7E,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 7F ".DB $CF,$7F,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 80 ".DB $CF,$80,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 81 ".DB $CF,$81,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 82 ".DB $CF,$82,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 83 ".DB $CF,$83,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 84 ".DB $CF,$84,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 85 ".DB $CF,$85,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 86 ".DB $CF,$86,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 87 ".DB $CF,$87,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 88 ".DB $CF,$88,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 89 ".DB $CF,$89,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 8A ".DB $CF,$8A,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 8B ".DB $CF,$8B,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 8C ".DB $CF,$8C,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 8D ".DB $CF,$8D,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 8E ".DB $CF,$8E,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 8F ".DB $CF,$8F,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 90 ".DB $CF,$90,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 91 ".DB $CF,$91,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 92 ".DB $CF,$92,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 93 ".DB $CF,$93,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 94 ".DB $CF,$94,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 95 ".DB $CF,$95,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 96 ".DB $CF,$96,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 97 ".DB $CF,$97,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 98 ".DB $CF,$98,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 99 ".DB $CF,$99,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 9A ".DB $CF,$9A,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 9B ".DB $CF,$9B,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 9C ".DB $CF,$9C,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 9D ".DB $CF,$9D,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 9E ".DB $CF,$9E,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE 9F ".DB $CF,$9F,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A0 ".DB $CF,$A0,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A1 ".DB $CF,$A1,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A2 ".DB $CF,$A2,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A3 ".DB $CF,$A3,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A4 ".DB $CF,$A4,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A5 ".DB $CF,$A5,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A6 ".DB $CF,$A6,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A7 ".DB $CF,$A7,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A8 ".DB $CF,$A8,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE A9 ".DB $CF,$A9,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE AA ".DB $CF,$AA,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE AB ".DB $CF,$AB,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE AC ".DB $CF,$AC,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE AD ".DB $CF,$AD,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE AE ".DB $CF,$AE,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE AF ".DB $CF,$AF,%u,%u" + {0x00, 2,16, 0, 8, 0, 0, 0}, // CE B0 "PUSH A" + {0x00, 2,16, 0, 9, 0, 0, 0}, // CE B1 "PUSH B" + {0x00, 2,16, 0,16, 0, 0, 0}, // CE B2 "PUSH L" + {0x00, 2,16, 0,17, 0, 0, 0}, // CE B3 "PUSH H" + {0x00, 2,17, 0, 8, 0, 0, 0}, // CE B4 "POP A" + {0x00, 2,17, 0, 9, 0, 0, 0}, // CE B5 "POP B" + {0x00, 2,17, 0,16, 0, 0, 0}, // CE B6 "POP L" + {0x00, 2,17, 0,17, 0, 0, 0}, // CE B7 "POP H" + {0x00, 2,52, 0, 0, 0, 0, 0}, // CE B8 "PUSHA" + {0x00, 2,53, 0, 0, 0, 0, 0}, // CE B9 "PUSHAX" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE BA ".DB $CF,$BA,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE BB ".DB $CF,$BB,%u,%u" + {0x00, 2,54, 0, 0, 0, 0, 0}, // CE BC "POPA" + {0x00, 2,55, 0, 0, 0, 0, 0}, // CE BD "POPAX" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE BE ".DB $CF,$BE,%u,%u" + {0x00, 4, 0, 0, 4, 0, 4, 0}, // CE BF ".DB $CF,$BF,%u,%u" + {0x00, 2, 2, 0,20, 0,11, 0}, // CE C0 "MOV BA, [HL]" + {0x00, 2, 2, 0,21, 0,11, 0}, // CE C1 "MOV HL, [HL]" + {0x00, 2, 2, 0,22, 0,11, 0}, // CE C2 "MOV X, [HL]" + {0x00, 2, 2, 0,23, 0,11, 0}, // CE C3 "MOV Y, [HL]" + {0x00, 2, 2, 0,11, 0,20, 0}, // CE C4 "MOV [HL], BA" + {0x00, 2, 2, 0,11, 0,21, 0}, // CE C5 "MOV [HL], HL" + {0x00, 2, 2, 0,11, 0,22, 0}, // CE C6 "MOV [HL], X" + {0x00, 2, 2, 0,11, 0,23, 0}, // CE C7 "MOV [HL], Y" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE C8 ".DB $CF,$C8" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE C9 ".DB $CF,$C9" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE CA ".DB $CF,$CA" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE CB ".DB $CF,$CB" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE CC ".DB $CF,$CC" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE CD ".DB $CF,$CD" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE CE ".DB $CF,$CE" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE CF ".DB $CF,$CF" + {0x00, 2, 2, 0,20, 0,14, 0}, // CE D0 "MOV BA, [X]" + {0x00, 2, 2, 0,21, 0,14, 0}, // CE D1 "MOV HL, [X]" + {0x00, 2, 2, 0,22, 0,14, 0}, // CE D2 "MOV X, [X]" + {0x00, 2, 2, 0,23, 0,14, 0}, // CE D3 "MOV Y, [X]" + {0x00, 2, 2, 0,14, 0,20, 0}, // CE D4 "MOV [X], BA" + {0x00, 2, 2, 0,14, 0,21, 0}, // CE D5 "MOV [X], HL" + {0x00, 2, 2, 0,14, 0,22, 0}, // CE D6 "MOV [X], X" + {0x00, 2, 2, 0,14, 0,23, 0}, // CE D7 "MOV [X], Y" + {0x00, 2, 2, 0,20, 0,15, 0}, // CE D8 "MOV BA, [Y]" + {0x00, 2, 2, 0,21, 0,15, 0}, // CE D9 "MOV HL, [Y]" + {0x00, 2, 2, 0,22, 0,15, 0}, // CE DA "MOV X, [Y]" + {0x00, 2, 2, 0,23, 0,15, 0}, // CE DB "MOV Y, [Y]" + {0x00, 2, 2, 0,15, 0,20, 0}, // CE DC "MOV [Y], BA" + {0x00, 2, 2, 0,15, 0,21, 0}, // CE DD "MOV [Y], HL" + {0x00, 2, 2, 0,15, 0,22, 0}, // CE DE "MOV [Y], X" + {0x00, 2, 2, 0,15, 0,23, 0}, // CE DF "MOV [Y], Y" + {0x00, 2, 2, 0,20, 0,20, 0}, // CE E0 "MOV BA, BA" + {0x00, 2, 2, 0,20, 0,21, 0}, // CE E1 "MOV BA, HL" + {0x00, 2, 2, 0,20, 0,22, 0}, // CE E2 "MOV BA, X" + {0x00, 2, 2, 0,20, 0,23, 0}, // CE E3 "MOV BA, Y" + {0x00, 2, 2, 0,21, 0,20, 0}, // CE E4 "MOV HL, BA" + {0x00, 2, 2, 0,21, 0,21, 0}, // CE E5 "MOV HL, HL" + {0x00, 2, 2, 0,21, 0,22, 0}, // CE E6 "MOV HL, X" + {0x00, 2, 2, 0,21, 0,23, 0}, // CE E7 "MOV HL, Y" + {0x00, 2, 2, 0,22, 0,20, 0}, // CE E8 "MOV X, BA" + {0x00, 2, 2, 0,22, 0,21, 0}, // CE E9 "MOV X, HL" + {0x00, 2, 2, 0,22, 0,22, 0}, // CE EA "MOV X, X" + {0x00, 2, 2, 0,20, 0,23, 0}, // CE EB "MOV X, Y" + {0x00, 2, 2, 0,23, 0,20, 0}, // CE EC "MOV Y, BA" + {0x00, 2, 2, 0,23, 0,21, 0}, // CE ED "MOV Y, HL" + {0x00, 2, 2, 0,23, 0,22, 0}, // CE EE "MOV Y, X" + {0x00, 2, 2, 0,23, 0,23, 0}, // CE EF "MOV Y, Y" + {0x00, 2, 2, 0,19, 0,20, 0}, // CE F0 "MOV SP, BA" + {0x00, 2, 2, 0,19, 0,21, 0}, // CE F1 "MOV SP, HL" + {0x00, 2, 2, 0,19, 0,22, 0}, // CE F2 "MOV SP, X" + {0x00, 2, 2, 0,19, 0,23, 0}, // CE F3 "MOV SP, Y" + {0x00, 2, 2, 0,21, 0,19, 0}, // CE F4 "MOV HL, SP" + {0x00, 2, 2, 0,21, 0,37, 0}, // CE F5 "MOV HL, PC" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE F6 ".DB $CF,$F6" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE F7 ".DB $CF,$F7" + {0x00, 2, 2, 0,20, 0,19, 0}, // CE F8 "MOV BA, SP" + {0x00, 2, 2, 0,20, 0,37, 0}, // CE F9 "MOV BA, PC" + {0x00, 2, 2, 0,22, 0,19, 0}, // CE FA "MOV X, SP" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE FB ".DB $CF,$FB" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE FC ".DB $CF,$FC" + {0x00, 2, 0, 0, 4, 0, 4, 0}, // CE FD ".DB $CF,$FD" + {0x00, 2, 2, 0,23, 0,19, 0}, // CE FE "MOV Y, SP" + {0x00, 2, 0, 0, 4, 0, 4, 0} // CE FF ".DB $CF,$FF" +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionInfo.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionInfo.h new file mode 100644 index 0000000000..ef0f28757e --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionInfo.h @@ -0,0 +1,43 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef INSTRUCTIONINFO_H +#define INSTRUCTIONINFO_H + +#include + +typedef struct { + uint8_t flags; // Flags, &1 = Unofficial + uint8_t size; // Opcode size + uint8_t opc; // Opcode name + uint8_t opclen; // Opcode len, 0 = None, 1 = Byte, 2 = Word + uint8_t p1; // Operand 1 + uint8_t p1off; // Operand 1 Offset + uint8_t p2; // Operand 2 + uint8_t p2off; // Operand 2 Offset +} InstructionInfo; + +extern char *DebugCPUInstructions_Opcode[]; +extern char *DebugCPUInstructions_Operand[]; + +extern InstructionInfo DebugCPUInstructions_DX[8]; +extern InstructionInfo DebugCPUInstructions_XX[256]; +extern InstructionInfo DebugCPUInstructions_CE[256]; +extern InstructionInfo DebugCPUInstructions_CF[256]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionProc.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionProc.c new file mode 100644 index 0000000000..0eec99d189 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionProc.c @@ -0,0 +1,509 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include + +#include "InstructionProc.h" +#include "InstructionInfo.h" +#include "PMCommon.h" + +// Get instruction data and size, return InstructionInfo +InstructionInfo *GetInstructionInfo(InstructionProcReadCB readcb, int cpu, uint32_t addr, uint8_t *data, int *size) +{ + InstructionInfo *II; + uint8_t IR, IR2; + if (!readcb) return 0; + IR = readcb(cpu, addr); + if (IR == 0xCE) { + // Expand 1 + IR2 = readcb(cpu, addr+1); + II = &DebugCPUInstructions_CE[IR2]; + if (data) { + data[0] = IR; + data[1] = IR2; + if (II->size >= 3) data[2] = readcb(cpu, addr+2); + if (II->size >= 4) data[3] = readcb(cpu, addr+3); + } + if (size) *size = II->size; + return II; + } else if (IR == 0xCF) { + // Expand 2 + IR2 = readcb(cpu, addr+1); + II = &DebugCPUInstructions_CF[IR2]; + if (data) { + data[0] = IR; + data[1] = IR2; + if (II->size >= 3) data[2] = readcb(cpu, addr+2); + if (II->size >= 4) data[3] = readcb(cpu, addr+3); + } + if (size) *size = II->size; + return II; + } else { + // No expand + II = &DebugCPUInstructions_XX[IR]; + if (data) { + data[0] = IR; + if (II->size >= 2) data[1] = readcb(cpu, addr+1); + if (II->size >= 3) data[2] = readcb(cpu, addr+2); + if (II->size >= 4) data[3] = readcb(cpu, addr+3); + } + if (size) *size = II->size; + return II; + } +} + +// %u = Unsigned 8-Bits +// %U = Unsigned 16-Bits +// %s = Signed 8-Bits +// %S = Signed 16-Bits +// %j = Relative jump (8-Bits) +// %J = Relative jump (16-Bits) +// %h = Relative expanded jump (8-Bits) +// %i = Interrupt + +// Default operand number decode +int DefaultOperandNumberDec(char *sout, char type, uint32_t addr, int value) +{ + switch (type) { + case 'u': // %u = Unsigned 8-Bits + case 'i': // %i = Interrupt + sprintf(sout, "$%02X", value); + break; + case 'U': // %U = Unsigned 16-Bits + sprintf(sout, "$%04X", value); + break; + case 's': // %s = Unsigned 8-Bits + if (value < 0) { + sprintf(sout, "-$%02X", -value); + } else { + sprintf(sout, "$%02X", value); + } + break; + case 'S': // %S = Unsigned 16-Bits + if (value < 0) { + sprintf(sout, "-$%04X", -value); + } else { + sprintf(sout, "$%04X", value); + } + break; + case 'j': // %j = Relative jump (8-Bits) + case 'J': // %J = Relative jump (16-Bits) + case 'h': // %h = Relative expanded jump (8-Bits) + if (value >= 0x8000) value = 0x8000 | (value & 0x7FFF); + else value &= 0xFFFF; + sprintf(sout, "@%04X", value); + break; + default: + return 0; + } + return 1; +} + +// Default operand number encode +int DefaultOperandNumberEnc(char *sin, char type, uint32_t addr, InstructionInfo *opcode, uint8_t *data, char *err) +{ + char ch, lastch = 0, negnum = 0; + int val = 0, base = 10, absjmp = 0; + while ((ch = *sin++) != 0) { + switch (ch) { + case '#': case '+': // Ignored + break; + case '@': // Absolute jump + absjmp = 1; + base = 16; + break; + case '-': // Negative + negnum = !negnum; + break; + case '$': // Hexadecimal + base = 16; + break; + case 'x': case 'X': + if (lastch != '0') return 0; + base = 16; + break; + case '0': case '1': case '2': case '3': // Number + case '4': case '5': case '6': case '7': + case '8': case '9': + val = (val * base) + (ch - '0'); + break; + case 'a': case 'b': case 'c': case 'd': // Hex number + case 'e': case 'f': + if (base != 16) { + sprintf(err, "Error: Invalid character: '%c'\n", ch); + return 0; + } + val = (val * base) + (ch - 'a') + 10; + break; + case 'A': case 'B': case 'C': case 'D': // Hex number + case 'E': case 'F': + if (base != 16) { + sprintf(err, "Error: Invalid character: '%c'\n", ch); + return 0; + } + val = (val * base) + (ch - 'A') + 10; + break; + default: // Invalid + sprintf(err, "Error: Invalid character: '%c'\n", ch); + return 0; + } + lastch = ch; + } + if (negnum) val = -val; + switch (type) { + case 'u': // %u = Unsigned 8-Bits + if (val >= 256) { + sprintf(err, "Error: Value out of range %i\nMust be between 0 and 255\n", val); + return 0; + } + data[0] = val; + break; + case 'U': // %U = Unsigned 16-Bits + if (val >= 65536) { + sprintf(err, "Error: Value out of range: %i\nMust be between 0 and 65535\n", val); + return 0; + } + data[0] = val; + data[1] = val >> 8; + break; + case 's': // %s = Signed 8-Bits + if ((val < -128) || (val >= 256)) { + sprintf(err, "Error: Value out of range: %i\nMust be between -128 and 127\n", val); + return 0; + } + data[0] = val; + break; + case 'S': // %S = Signed 16-Bits + if ((val < -32768) || (val >= 65536)) { + sprintf(err, "Error: Value out of range: %i\nMust be between -32768 and 32767\n", val); + return 0; + } + data[0] = val; + data[1] = val >> 8; + break; + case 'j': // %j = Relative jump (8-Bits) + if (absjmp) { + val = val - addr - 1; + } + if ((val < -128) || (val >= 128)) { + sprintf(err, "Error: Value out of range: %i\nJump out of reach\n", val); + return 0; + } + data[0] = val; + break; + case 'J': // %J = Relative jump (16-Bits) + if (absjmp) { + val = val - addr - 2; + } + data[0] = val; + data[1] = val >> 8; + break; + case 'h': // %h = Relative expanded jump (8-Bits) + if (absjmp) { + val = val - addr - 2; + } + if ((val < -128) || (val >= 128)) { + sprintf(err, "Error: Value out of range: %i\nJump out of reach\n", val); + return 0; + } + data[0] = val; + break; + case 'i': // %i = Interrupt + if (val >= 128) { + sprintf(err, "Error: Value out of range: %i\nMust be between 0 and 127\n", val); + return 0; + } + data[0] = val << 1; + break; + default: + return 0; + } + return 1; +} + +// Default single opcode decoder +TSOpcDec DefaultSOpcDec = { + DefaultOperandNumberDec, // Operand number decode + DefaultOperandNumberEnc, // Operand number encode + DebugCPUInstructions_Opcode, // Opcode dictionary + DebugCPUInstructions_Operand, // Operand dictionary + "", // Opcode pre-text + " ", // Opcode post-text + ", " // Operand separator +}; + +// Parse operand string (decoder) +// operand - full operand string +// addr - address +// data - input data +// pout - output string +// spcdec - decoder +static int ParseOperandStringDec(char *operand, uint32_t addr, uint8_t *data, char *pout, TSOpcDec *sopcdec) +{ + char ch, cod; + char tmp[256]; + int val; + + *pout = 0; + while ((ch = *operand) != 0) { + if (ch == '%') { + cod = operand[1]; + tmp[0] = 0; + switch (cod) { + case 'u': // %u = Unsigned 8-Bits + val = data[0]; + break; + case 'U': // %U = Unsigned 16-Bits + val = data[1] * 256 + data[0]; + break; + case 's': // %s = Signed 8-Bits + val = data[0]; + val = (val >= 0x80) ? val - 256 : val; + break; + case 'S': // %S = Signed 16-Bits + val = data[1] * 256 + data[0]; + val = (val >= 0x8000) ? val - 65536 : val; + break; + case 'j': // %j = Relative jump (8-Bits) + val = data[0]; + val = (val >= 0x80) ? val - 256 : val; + val = addr + 1 + val; + break; + case 'J': // %J = Relative jump (16-Bits) + val = data[1] * 256 + data[0]; + val = (val >= 0x8000) ? val - 65536 : val; + val = addr + 2 + val; + break; + case 'h': // %h = Relative expanded jump (8-Bits) + val = data[0]; + val = (val >= 0x80) ? val - 256 : val; + val = addr + 2 + val; + break; + case 'i': // %i = Interrupt + val = data[0] >> 1; + break; + default: // Invalid + val = 0; + break; + } + if (!sopcdec->on_opndec(tmp, cod, addr, val)) return 0; + strcat(pout, tmp); + pout += strlen(tmp); + operand += 2; + continue; + } + *pout++ = ch; + *pout = 0; + operand++; + } + return 1; +} + +// Disassemble single opcode +int DisasmSingleOpcode(InstructionInfo *opcode, uint32_t addr, uint8_t *data, char *sout, TSOpcDec *sopcdec) +{ + char tmp[256]; + if ((!sout) || (!opcode)) return 0; + if (!opcode->opc) { + // Raw data + strcpy(sout, ".DB "); + if (opcode->size >= 1) { sprintf(tmp, "$%02X", data[0]); strcat(sout, tmp); } + if (opcode->size >= 2) { sprintf(tmp, ",$%02X", data[1]); strcat(sout, tmp); } + if (opcode->size >= 3) { sprintf(tmp, ",$%02X", data[2]); strcat(sout, tmp); } + if (opcode->size >= 4) { sprintf(tmp, ",$%02X", data[3]); strcat(sout, tmp); } + return 1; + } else { + // Instruction + strcpy(sout, sopcdec->opcode_pre); + strcpy(sout, sopcdec->opcode_dict[opcode->opc]); + if (opcode->opclen == 1) strcat(sout, "b"); + if (opcode->opclen == 2) strcat(sout, "w"); + if (opcode->p1) { + strcat(sout, sopcdec->opcode_post); + if (!ParseOperandStringDec(sopcdec->operand_dict[opcode->p1], addr, (uint8_t *)data + opcode->p1off, tmp, sopcdec)) return 0; + strcat(sout, tmp); + } + if (opcode->p2) { + strcat(sout, sopcdec->operand_sep); + if (!ParseOperandStringDec(sopcdec->operand_dict[opcode->p2], addr, (uint8_t *)data + opcode->p2off, tmp, sopcdec)) return 0; + strcat(sout, tmp); + } + return 1; + } +} + +// Parse operand string (encoder) +// operand - expected operand string +// addr - address +// data - output data +// pin - operand input from assembly +// opcode - expected opcode +// spcdec - decoder +static int ParseOperandStringEnc(char *operand, uint32_t addr, uint8_t *data, char *pin, InstructionInfo *opcode, TSOpcDec *sopcdec, char *err) +{ + char ch, cod; + char tok[2] = {0, 0}, tokfound; + char tmp[256]; + + while ((ch = *operand) != 0) { + if (ch == '%') { + cod = operand[1]; // code + tok[0] = operand[2]; // next character + pin = (char *)UpToToken(tmp, pin, tok, &tokfound) - 1; + if (!sopcdec->on_opnenc(tmp, cod, addr, opcode, data, err)) return 0; + operand += 2; + continue; + } + + // Check for differences + if (toupper(ch) != toupper(*pin)) return 0; + pin++; + operand++; + } + if ((ch == 0) && (*pin == 0)) return 1; + return 0; +} + +// Assemble single opcode +InstructionInfo *AsmSingleOpcode(char *sin, uint32_t addr, uint8_t *data, TSOpcDec *sopcdec, char *err) +{ + char tmp[256], *ctmp = tmp; + char opcname[256]; + char operand1[256], operand2[256]; + char operand3[256], operand4[256]; + InstructionInfo *opcode; + int i; + + // Empty strings + opcname[0] = 0; + operand1[0] = 0; + operand2[0] = 0; + operand3[0] = 0; + operand4[0] = 0; + sprintf(err, "Error: Syntax error"); + + // Remove comments and trim + strcpy(ctmp, sin); + RemoveComments(ctmp); + ctmp = TrimStr(tmp); + ctmp = UpToToken(opcname, ctmp, " \t", NULL); + ctmp = UpToToken(operand1, ctmp, ",", NULL); + RemoveChars(operand1, operand1, " \t"); + ctmp = UpToToken(operand2, ctmp, ",\n", NULL); + RemoveChars(operand2, operand2, " \t"); + ctmp = UpToToken(operand3, ctmp, ",\n", NULL); + RemoveChars(operand3, operand3, " \t"); + ctmp = UpToToken(operand4, ctmp, "\n", NULL); + RemoveChars(operand4, operand4, " \t"); + + // Data (Byte) + if (!strcasecmp(opcname, ".DB")) { + i = 0; + if (!ParseOperandStringEnc("%u", 0, (uint8_t *)data+0, operand1, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + if (strlen(operand2)) { + i = 1; + if (!ParseOperandStringEnc("%u", 0, (uint8_t *)data+1, operand2, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + } + if (strlen(operand3)) { + i = 2; + if (!ParseOperandStringEnc("%u", 0, (uint8_t *)data+2, operand3, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + } + if (strlen(operand4)) { + i = 3; + if (!ParseOperandStringEnc("%u", 0, (uint8_t *)data+3, operand4, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + } + return &DebugCPUInstructions_DX[i]; + } + + // Data (Word) + if (!strcasecmp(opcname, ".DW")) { + i = 4; + if (!ParseOperandStringEnc("%U", 0, (uint8_t *)data+0, operand1, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + if (strlen(operand2)) { + i = 5; + if (!ParseOperandStringEnc("%U", 0, (uint8_t *)data+2, operand2, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + } + if (strlen(operand3)) { + i = 6; + if (!ParseOperandStringEnc("%U", 0, (uint8_t *)data+4, operand3, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + } + if (strlen(operand4)) { + i = 7; + if (!ParseOperandStringEnc("%U", 0, (uint8_t *)data+6, operand4, DebugCPUInstructions_DX, sopcdec, err)) return NULL; + } + return &DebugCPUInstructions_DX[i]; + } + + // Find opcode from the list + for (i=0; i<256; i++) { + // XX Opcode + opcode = (InstructionInfo *)&DebugCPUInstructions_XX[i]; + strcpy(tmp, sopcdec->opcode_dict[opcode->opc]); + if (opcode->opclen == 1) strcat(tmp, "b"); + if (opcode->opclen == 2) strcat(tmp, "w"); + if ((!strcasecmp(opcname, tmp)) || (!strcasecmp(opcname, sopcdec->opcode_dict[opcode->opc]))) { + data[0] = i; + if (opcode->p1 == 0) return opcode; + if (ParseOperandStringEnc(sopcdec->operand_dict[opcode->p1], addr, (uint8_t *)data + opcode->p1off, operand1, opcode, sopcdec, err)) { + if (opcode->p2 == 0) return opcode; + if (ParseOperandStringEnc(sopcdec->operand_dict[opcode->p2], addr, (uint8_t *)data + opcode->p2off, operand2, opcode, sopcdec, err)) { + return opcode; + } + } + } + + // CE Opcode + opcode = (InstructionInfo *)&DebugCPUInstructions_CE[i]; + strcpy(tmp, sopcdec->opcode_dict[opcode->opc]); + if (opcode->opclen == 1) strcat(tmp, "b"); + if (opcode->opclen == 2) strcat(tmp, "w"); + if ((!strcasecmp(opcname, tmp)) || (!strcasecmp(opcname, sopcdec->opcode_dict[opcode->opc]))) { + data[0] = 0xCE; + data[1] = i; + if (opcode->p1 == 0) return opcode; + if (ParseOperandStringEnc(sopcdec->operand_dict[opcode->p1], addr, (uint8_t *)data + opcode->p1off, operand1, opcode, sopcdec, err)) { + if (opcode->p2 == 0) return opcode; + if (ParseOperandStringEnc(sopcdec->operand_dict[opcode->p2], addr, (uint8_t *)data + opcode->p2off, operand2, opcode, sopcdec, err)) { + return opcode; + } + } + } + + // CF Opcode + opcode = (InstructionInfo *)&DebugCPUInstructions_CF[i]; + strcpy(tmp, sopcdec->opcode_dict[opcode->opc]); + if (opcode->opclen == 1) strcat(tmp, "b"); + if (opcode->opclen == 2) strcat(tmp, "w"); + if ((!strcasecmp(opcname, tmp)) || (!strcasecmp(opcname, sopcdec->opcode_dict[opcode->opc]))) { + data[0] = 0xCF; + data[1] = i; + if (opcode->p1 == 0) return opcode; + if (ParseOperandStringEnc(sopcdec->operand_dict[opcode->p1], addr, (uint8_t *)data + opcode->p1off, operand1, opcode, sopcdec, err)) { + if (opcode->p2 == 0) return opcode; + if (ParseOperandStringEnc(sopcdec->operand_dict[opcode->p2], addr, (uint8_t *)data + opcode->p2off, operand2, opcode, sopcdec, err)) { + return opcode; + } + } + } + } + + return NULL; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionProc.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionProc.h new file mode 100644 index 0000000000..6e156bf5ad --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/InstructionProc.h @@ -0,0 +1,68 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef INSTRUCTIONPROC_H +#define INSTRUCTIONPROC_H + +#include +#include "InstructionInfo.h" + +// Read byte callback +typedef uint8_t (*InstructionProcReadCB)(int cpu, uint32_t addr); + +// Operand number decode callback +// sout - output to this string +// type - character type from the dictionary +// value - input value +// result: 1 = continue, 0 = abort & error +typedef int (*InstructionProcOpNDecCB)(char *sout, char type, uint32_t addr, int value); + +// Operand number encode callback +// sin - input that contain the number/symbol +// type - character type from the dictionary +// opcode - opcode information for the match +// data - output data if match +// result: 1 = operand match, 0 = operand mismatch, continue +typedef int (*InstructionProcOpNEncCB)(char *sin, char type, uint32_t addr, InstructionInfo *opcode, uint8_t *data, char *err); + +// Single opcode decoder +typedef struct { + InstructionProcOpNDecCB on_opndec; // Operand number decode callback + InstructionProcOpNEncCB on_opnenc; // Operand number encode callback + char **opcode_dict; // Opcode dictionary + char **operand_dict; // Operand dictionary + char *opcode_pre; // Opcode pre-text (Usually empty) + char *opcode_post; // Opcode post-text (Usually a space) + char *operand_sep; // Operand separator (Usually a comma) +} TSOpcDec; + +// Default single opcode decoder +int DefaultOperandNumberDec(char *sout, char type, uint32_t addr, int value); +int DefaultOperandNumberEnc(char *sin, char type, uint32_t addr, InstructionInfo *opcode, uint8_t *data, char *err); +extern TSOpcDec DefaultSOpcDec; + +// Get instruction data and size, return InstructionInfo +InstructionInfo *GetInstructionInfo(InstructionProcReadCB readcb, int cpu, uint32_t addr, uint8_t *data, int *size); + +// Disassemble single opcode +int DisasmSingleOpcode(InstructionInfo *opcode, uint32_t addr, uint8_t *data, char *sout, TSOpcDec *sopcdec); + +// Assemble single opcode +InstructionInfo *AsmSingleOpcode(char *sin, uint32_t addr, uint8_t *data, TSOpcDec *sopcdec, char *err); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL.c new file mode 100644 index 0000000000..c7c0f09375 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL.c @@ -0,0 +1,139 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "SDL.h" +#include "Keyboard.h" + +TKeyboardRemap KeybMapSDL = { + SDLK_UNKNOWN, + SDLK_ESCAPE, + SDLK_RETURN, + SDLK_BACKSPACE, + SDLK_TAB, + SDLK_BACKQUOTE, + + SDLK_RSHIFT, + SDLK_LSHIFT, + SDLK_RCTRL, + SDLK_LCTRL, + SDLK_RALT, + SDLK_LALT, + + SDLK_INSERT, + SDLK_DELETE, + SDLK_HOME, + SDLK_END, + SDLK_PAGEUP, + SDLK_PAGEDOWN, + + SDLK_NUMLOCK, + SDLK_CAPSLOCK, + SDLK_SCROLLOCK, + SDLK_KP_PERIOD, + SDLK_KP_DIVIDE, + SDLK_KP_MULTIPLY, + SDLK_KP_MINUS, + SDLK_KP_PLUS, + SDLK_KP_ENTER, + SDLK_KP_EQUALS, + + SDLK_UP, + SDLK_DOWN, + SDLK_RIGHT, + SDLK_LEFT, + + SDLK_SPACE, + SDLK_EXCLAIM, + SDLK_QUOTEDBL, + SDLK_HASH, + SDLK_DOLLAR, + SDLK_UNKNOWN, + SDLK_AMPERSAND, + SDLK_QUOTE, + SDLK_LEFTPAREN, + SDLK_RIGHTPAREN, + SDLK_ASTERISK, + SDLK_PLUS, + SDLK_COMMA, + SDLK_MINUS, + SDLK_PERIOD, + SDLK_SLASH, + + SDLK_0, + SDLK_1, + SDLK_2, + SDLK_3, + SDLK_4, + SDLK_5, + SDLK_6, + SDLK_7, + SDLK_8, + SDLK_9, + + SDLK_COLON, + SDLK_SEMICOLON, + SDLK_LESS, + SDLK_EQUALS, + SDLK_GREATER, + SDLK_QUESTION, + SDLK_AT, + + SDLK_a, + SDLK_b, + SDLK_c, + SDLK_d, + SDLK_e, + SDLK_f, + SDLK_g, + SDLK_h, + SDLK_i, + SDLK_j, + SDLK_k, + SDLK_l, + SDLK_m, + SDLK_n, + SDLK_o, + SDLK_p, + SDLK_q, + SDLK_r, + SDLK_s, + SDLK_t, + SDLK_u, + SDLK_v, + SDLK_w, + SDLK_x, + SDLK_y, + SDLK_z, + + SDLK_LEFTBRACKET, + SDLK_BACKSLASH, + SDLK_RIGHTBRACKET, + SDLK_CARET, + SDLK_UNDERSCORE, + + SDLK_KP0, + SDLK_KP1, + SDLK_KP2, + SDLK_KP3, + SDLK_KP4, + SDLK_KP5, + SDLK_KP6, + SDLK_KP7, + SDLK_KP8, + SDLK_KP9 +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL.h new file mode 100644 index 0000000000..2b06aa8cf0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL.h @@ -0,0 +1,26 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef KEYBMAPSDL_H +#define KEYBMAPSDL_H + +#include "Keyboard.h" + +extern TKeyboardRemap KeybMapSDL; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL2.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL2.c new file mode 100644 index 0000000000..2657c537c2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL2.c @@ -0,0 +1,139 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "SDL.h" +#include "Keyboard.h" + +TKeyboardRemap KeybMapSDL2 = { + SDLK_UNKNOWN, + SDLK_ESCAPE, + SDLK_RETURN, + SDLK_BACKSPACE, + SDLK_TAB, + SDLK_BACKQUOTE, + + SDLK_RSHIFT, + SDLK_LSHIFT, + SDLK_RCTRL, + SDLK_LCTRL, + SDLK_RALT, + SDLK_LALT, + + SDLK_INSERT, + SDLK_DELETE, + SDLK_HOME, + SDLK_END, + SDLK_PAGEUP, + SDLK_PAGEDOWN, + + SDLK_NUMLOCKCLEAR, + SDLK_CAPSLOCK, + SDLK_SCROLLLOCK, + SDLK_KP_PERIOD, + SDLK_KP_DIVIDE, + SDLK_KP_MULTIPLY, + SDLK_KP_MINUS, + SDLK_KP_PLUS, + SDLK_KP_ENTER, + SDLK_KP_EQUALS, + + SDLK_UP, + SDLK_DOWN, + SDLK_RIGHT, + SDLK_LEFT, + + SDLK_SPACE, + SDLK_EXCLAIM, + SDLK_QUOTEDBL, + SDLK_HASH, + SDLK_DOLLAR, + SDLK_UNKNOWN, + SDLK_AMPERSAND, + SDLK_QUOTE, + SDLK_LEFTPAREN, + SDLK_RIGHTPAREN, + SDLK_ASTERISK, + SDLK_PLUS, + SDLK_COMMA, + SDLK_MINUS, + SDLK_PERIOD, + SDLK_SLASH, + + SDLK_0, + SDLK_1, + SDLK_2, + SDLK_3, + SDLK_4, + SDLK_5, + SDLK_6, + SDLK_7, + SDLK_8, + SDLK_9, + + SDLK_COLON, + SDLK_SEMICOLON, + SDLK_LESS, + SDLK_EQUALS, + SDLK_GREATER, + SDLK_QUESTION, + SDLK_AT, + + SDLK_a, + SDLK_b, + SDLK_c, + SDLK_d, + SDLK_e, + SDLK_f, + SDLK_g, + SDLK_h, + SDLK_i, + SDLK_j, + SDLK_k, + SDLK_l, + SDLK_m, + SDLK_n, + SDLK_o, + SDLK_p, + SDLK_q, + SDLK_r, + SDLK_s, + SDLK_t, + SDLK_u, + SDLK_v, + SDLK_w, + SDLK_x, + SDLK_y, + SDLK_z, + + SDLK_LEFTBRACKET, + SDLK_BACKSLASH, + SDLK_RIGHTBRACKET, + SDLK_CARET, + SDLK_UNDERSCORE, + + SDLK_KP_0, + SDLK_KP_1, + SDLK_KP_2, + SDLK_KP_3, + SDLK_KP_4, + SDLK_KP_5, + SDLK_KP_6, + SDLK_KP_7, + SDLK_KP_8, + SDLK_KP_9 +}; diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL2.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL2.h new file mode 100644 index 0000000000..c63314cee9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/KeybMapSDL2.h @@ -0,0 +1,26 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2014 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef KEYBMAPSDL2_H +#define KEYBMAPSDL2_H + +#include "Keyboard.h" + +extern TKeyboardRemap KeybMapSDL2; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/NoUI.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/NoUI.c new file mode 100644 index 0000000000..76f425eb29 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/NoUI.c @@ -0,0 +1,47 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PokeMini.h" +#include "UI.h" + +int UI_Enabled = 0; +int UI_Status = UI_STATUS_GAME; + +void UIMenu_PrevMenu(void) {} +void UIMenu_LoadItems(TUIMenu_Item *items, int cursorindex) {} +int UIMenu_ChangeItem(TUIMenu_Item *items, int index, const char *format, ...) +{ + return 0; +} +void UIMenu_BeginMessage(void) {} +void UIMenu_SetMessage(char *message, int color) {} +void UIMenu_EndMessage(int timeout) {} +void UIMenu_RealTimeMessage(TUIRealtimeCB cb) {} + +void UIMenu_KeyEvent(int key, int press) { + if (press) { + PokeMini_KeypadEvent(key, 1); + } else { + PokeMini_KeypadEvent(key, 0); + } +} + +int UIItems_PlatformDefC(int index, int reason) +{ + return 1; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/PokeMiniIcon_96x128.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/PokeMiniIcon_96x128.c new file mode 100644 index 0000000000..565b51a816 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/PokeMiniIcon_96x128.c @@ -0,0 +1,181 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* XPM */ +const char *PokeMiniIcon_96x128[] = { +"96 128 32 1", +" c None", +". c #010101", +"+ c #222A25", +"@ c #3D443B", +"# c #535A52", +"$ c #0E83C1", +"% c #626B62", +"& c #2F89C4", +"* c #747B74", +"= c #508BC1", +"- c #828C79", +"; c #5E96C9", +"> c #828FAE", +", c #A99C63", +"' c #94A091", +") c #7BA1CE", +"! c #909CBB", +"~ c #9CA7C5", +"{ c #A8B2A4", +"] c #A4AFCD", +"^ c #ABB7D5", +"/ c #B9BDA4", +"( c #B3C0DA", +"_ c #E1C481", +": c #BCC8DE", +"< c #C8D2E6", +"[ c #E3D690", +"} c #EADFA7", +"| c #D6DDEB", +"1 c #F3E7C6", +"2 c #E5E9F3", +"3 c #F9F4F1", +" ", +" ", +" ", +" ", +" ^^:::::: ", +" (^^^(::((::];))~ ", +" ((|22222223|<^!!!)>>;;);;)) ", +" (:|2||||22||2|~'{{]/^^/{]{~!);;==;) ", +" :<<<:<<<|||<<<<:<;;;=)^(( ", +" (((((::<<:::<<<:^(<|22|>=>>>)!~^(:<|23333333322|<<(:::<|||||2233|23];=&&& ", +" ~:<<::<<<::^]<^]]!~>!>>=>=>>!)~~](:|2222222<<<(^:::<<<|2|||<<23)@$$&$ ", +" )(|:<^:(<<|<:^:^]]](]^^]~~>!>>!!>>>>>!~^:<223332||<<<<<<||<<|22|;$=;))& ", +" (]<::<:<<<<||2<]]^^(:^]:^/]!!!~]^~!!>>>*>=>>]:<23333322<<<(^<32::&$;)];&$ ", +" ):<(:<:<|:(((::(^(<:<:(<<<:^]^]~^^!!!>!~~]~=!!~!]<|233332:](|23<^(;;&&&&$) ", +" )(^<|((:<:(^(^^]]^(((:((|<<<<<:^::^^~~~^]^(^^]^~:^(^(::|32::|||2<]::<;$&=$ ", +" ~~::::(:|||<:::((^^]~~~!~]/^^(:<((<<<<::(^:::::]^:^^(((~^(:<::|||2()));$&&$; ", +" )^:<:(::||||||||<:::((^~!!~!>>!!!~]^^:::<<<<<<<^]]](:::(^(^:|::|||2])&$&&&&$ ", +" ):((<<<(^:(:::<<<<|<<:]~~~~~~~~!!~!>>>>!](((((<:^]~(||<<<::::::<<<||~)$$&=&$ ", +" ~<(]:<:(((]]~!!~~^^:<(]~~~^~!!!!~~~!~!>>>>!!~~]~~~!]^^:<<<:^:|<::<<2:~;$$&=$= ", +" ]<(^^(^:::]!!!!~~~~]]]((^:|<]^^^(^~~!~~~~!>>!^:(~~]~!~~]^](^(::(::<<|~)$&&==$ ", +" ]^:((^]((:(!~!!~~!]^:<<<^]~/~'!{]^:<<:^~~!~!!^<<:::(^^(^^]]:(!!]^(:<:2()&$&&=$ ", +" ~(<((^]^(^^!~]~!~(<|:~*%@+......+@#%>{<||:(]~^<|<:::<<<<<<::]!~]]^:::22>;$$&=$ ", +" ~::(^^]^(^^!~]~^<:!%+......+..........@*{<22<~~^(^^^:::<|||<]!((]~^(:||)=$$&=&~ ", +" )<:((^]((^(]>]<:>@.......+-****%##+......@-:22(!!~!!!]^:::<<]!]^~)~^((:)=&$&=&; ", +" )<:(^^~::^^~^:~@.........**%%*##%**-**%#+..+*(3|(~~~~~^^]~]~~~~!!]]^^((]=&$&=== ", +" ]<(((^^(:((:(%...........*@>!>#@#@++@#*%>#....*|3|]!~]]{!~~~]~~~!]^]^(:^;=$&;=& ", +" (]<((^](((:|^@............#>##***!!>*#@%.#>@....+~32:~~]~!~!~]]~~]]]~](::;=$$=;& ", +" ^(<(::(:^(2]+..............%-*******%*>>~##%......#(2|]~~^]!~]]]~~~~~^((:)=$$;;& ", +" ]:<:::<(^|^.....+++..........+##%%**%****#>@........]33(!]^!~]~]~!!!]^((:)=$$;;$ ", +" ~]:<:<<(<<+....@-****%##@@@+.......+@##%*-%..........'32^~~!]]~~!!!~~~((:)=$$==& ", +" ~^(::|||2#.....%*%''>'>%#*--%####@@+..................*|<^~~(^~!!~'!!!((:~=&$=;=) ", +" )<:(::^2~......#*+-/{{{{'{'>''-*-%##%%%@@..............%^<^!^]~~!!!~!~^(:^=&$=;;; ", +" ~<(^:~!^+......#*@#/{{/'*-*@%/-'/''-''{'-*%%@+..........#~]!!~]]]~{{]~^(:^;=$=;=; ", +" ]<((:!(-.......%*+@-^{{'@@++@@+@-%-%%{(/{{{'''-*#@+......%>]]~~~]]^^]]^(::)=$=;;; ", +" (]<^:^!(+.......%*+@@'/-#%+@@+@+@@#'*@**%'*++@-/{%+++@@+++@'(/{-*'{{'-'''''~'''{#...#(:^]:::(((((||);$&))= ", +" ~(<::~(@........*-*+@+%/*++#*@+@@+%{{{/>-%###*''{{-%'#'{#....-({!]]]^^]^(((~>$$))= ", +" ~:::(]^.........%-*@++@/'@*-%*@%@+#'/{/>-%++.*-++#'#'@{{#....+~~~!!>!!!~(((]!&$;)= ", +" ~(<<::]........+*'#-'%#'{'#**{'>%+@'({'-%'''%-'+@''@~@{{%.....%~!!!!>>!!^(:])=$;~= ", +" )](:<2{........+*'/{/^*+#/*%*-/>@+@'--%-}-@##--+#'-@{@{{%.....+~!!!!>!!!((:]);$=~=) ", +" ~:::(<>.........*'{{{/-+#%%/{'{#++#*--({~{'@+-*++@###@'{%......*~!!!!>>!^((]~)$=~=) ", +" )<:<]]*........+*{/{{'*%@#*#'({#++%'*{{*%'{'---%{'*#@-*/%......+~!!!!!>>^((^)]&$~=; ", +" ~<(:^^>........+*{'{{'#*##**/<'%@++@%#*%#-/%*''-.@/*@'%/%.......-~!!!!!>^((^~^;$;== ", +" ~<(:^^>........+%{%/{>+@#-|*#%*-#%-@#%*('{%@#**#-'%'+%#{%.......#~!!!!>;^((^)(]$&== ", +" ]<(:(]~........+*-**/'@@'%'{''{/%+-'@*{''@#-'@**@{-'@*%*%.......@!!!!!!)]:((](:!&=& ", +" ]<(:(~]+.......+**-@-'{%%%+##@*''{#-##{-%#+@##%{#+@-@--%%........~~!~!!)]((((~~~&=& ", +" ]<((:~(@.......+*-*@%%#%**/%@@#-#-:#*-{'###++%--{'@@@*'-#........!(~]~!)](^^]~~)=;& ", +" ]<((:]^%.......+*'@//^{''(*%#@%@##':**-{-@@#%#-%+@#@%%#%#........*]~]!!!](^]]]!)&;$ ", +" ^<((:]!>.......+*'+{{{{%*{{'#@@@*-#-'-*{'%{-@@+%@##@'@#-#........%~~~~~^^(^^]^~)=;& ", +" ^<((:(~(@......+*{%({{'@%//~'##%@'~**'''{{(:*#*#@@%**%*-#........%^!~]](:((|^]~)=;& ", +" ^:(:::^<*......+*{%:{'-{{{---@@*+#-'#-('%+.#'%%-@#{'%##-@........*^!!~^(:<22]^~)=;& ", +" ^<(::(^:(......+*#'-^{-({*@@*%+#@+#/%*(/%+%#''.#{/{<'%#'@........%!))~]^(:(^~^~)=;&! ", +" ^<(((((^<%.....+*-%*/'*%+%##--#+@+*{-'/'#@+@@#@-{('+#%{/@........%!>!;;;)]^]]^~~=;=) ", +" ^<(((((^:(.....+%*@%-*>'{%+%--*++@{*#'(#@@@+++@@.%'+@@:/@........*~!);==;^^^]^]~;==; ", +" ^<((^(:(^|>....+%#**@{//*++#-@.*{{-{''/@@%+@@++@@@@#-%({+.......+>)>!===)^(^]^~~===; ", +" ^<:(^(:::(<@....*@**-^%%-%-##-*@@%@'''{*@#@@@+@@+@@@#%'{+.......@>=>)==;)^^^]^]~;==; ", +" ^<((^(<<<^]]....%#%#/{##'@%>@#++#%@'%*>!>==;;](^]^]~;=== ", +" (<(((:<<<<~:-...+{*@:{-#*-*@++-'#%%'~*@*@@#%%#@@@@@@@##'........*>>!>=;;;](^]^]~;=;= ", +" ^<:<|<<<::^^<%....@*'{-*%+####+#@+*--'/#%'{-''**|/{*+**'.......@!>!!>=>!)](^]^^];=== ", +" ]<||::::(^^^(<%.....@%*''''~'**--@##%/**/-*{/'-{{{{'@#/>.......>~>!>>>>))]((^^^];==& ", +" ~(<<::(]^^^^^<<#.....++@###%*''{{'-{{-@@%%-''{'{->{{'@{-......@]!!~>>>>))]:(]^^])=;& ", +" ~(:<<:]]](^^^((:#...+-*+..@...+@#*''{{{'*-'%-{^'*/{{{-'*......!]!~~!!!~!)^:(^^^^)=;& ", +" ^:(::]~(]^^/^^^:|*..+>~**#-+#*.......+@#%*-'{~/''{{{{/**.....-^!~~~!!~~]](:^^:(^)=;& ", +" ]<(^(((:^]^:::::<<-..!@>'>-***@%@+..........+@#%*''~{{-@....%(]!~!~]]]^](<::(:^])&;& ", +" ]<(^^:<(~^^^^(^((^<~++.@>*!->>>~'*%*@#@............++##....#!]]~~~]]]~~]^<<|<(^])=;& ", +" ]::(^^^)~^^]]~]](^^|<#....+@#%%>**!-~>>.,_,*.+............%>>^^~~~]^~~~](<<<(:(];=;& ", +" ~<((^^]]]~~]~]]]]((^|3]@.......++@#**%-._[}[-%-_#@+.....+*!>~:]!~]]^]](^(<::::^~)=;& ", +" ~::(^(^]~~~]]^]]]](<:|32!+...........+@.*-,,_-_}/*#....#~!>!^:]~~]^(^~~^(<||:^]~;=;& ", +" ~:((^^^^]]]]~]]]]~~^|2|33|'@...............+#%*,,,#..#>^]~]~~:^~]]^^^^^](:<:^]^~)=;& ", +" ~:(<:^^^~]~)))]^]]]!~:333332^*+..................#@%!]]!~^~!!<^~]]^]^(~~^]^(^]]^)&;& ", +" ):<<:((]]~)=))))^(^]~!~<333333|~*#+...........+@#*~^]~~~]~~~]<^]]^^]]]]^]]((^(<^)&;& ", +" >(|:(:(~])=;()&$&)^])~!>!<3333332|:^!-******>!~^((^^^^~!!~~^(:]^]^(]~^(((::(:<:];=;& ", +" )::(^^]]);=)(&$$$$=)))!~;=):233332222|||<<<<<:::(((^~!!!>>!!~~~]]]^(^^]]^((:::(])=;& ", +" !(((^~~~;;=;);))&$$=;;=)]>>=;~:|2222222||<<<<<::^]!!>>>>>>!]~!~~]]](^^^^]^((:::];=;& ", +" )(:(^~]~)););$=)=$%=;>=&!~;>>>>>!](:<<<<<::(^]]!!>>>>>>>>!~]~~~]]^])]]^(::<((:(])=;& ", +" )(:(]~~)(:(()$$$$$$=;;=$&~!;>>!!!>>>!!~!~!~!!>>>>>>>!>>!~]]!!~]]]^^]^^^(::<((:(];=;& ", +" !(:(]]]]~(:|^$$$$$%=;;=&&;~))>!!!!~!~~~!!!>!>>>!>>>!>>>~]]~~!~~~~~]^^]]^^:<(:<:])=;& ", +" ~^<(]](^$&;))$&&$$&=;))~))!~))~~~~]~]^]~~~~!!!!>!>!!!!~]~~]]]^^]]~)]]^]]]<<(:<:];==& ", +" ]]:(]^^;&$$$$$&&$$#=)~^((((]~)!!]]]]]^]]~~~~!!!!!!!!!!^]~~)~^(::(^~!~]^]~:|(::(])=;& ", +" (~<(]^)=)));&$$$$$&&&;~^(((]~)!]^]]]]]]]~~~~~!!!!~!~!~]]]^^);;))^:(~)~]]~(<::::^;=;& ", +" )::~-&@$=;;&$$$$&&$$$$&==+...+>]]~]^~~]~~~~~~~~>*-*-!~]^!*$&=$$#+.+>!~]]](:::(^)&+.+. ", +" )%+......++$$$$$&));&&$$......+~~{]/^~~~~~~~~~+......+]+......+.....>~~]]^:::(^=...... ", +" @...@@@@...+$$$$$$;;;);+.*333@.-]^^~{]~]]]~~~%.+@@@@+.@.+@@@@...-3#..>~~~^:(:(]+.#|'.. ", +" +./333333/+.+$$$$$$$$&;+.,333..!^::~-~]]]^]~!#.,3333*...|3333@.@133#.%~~~(:::(]..133-. ", +" ..133333331+.#&$++.+$$$..:331..####-%%#@+#*~~..<3333*..#33333+.+|33#.###**@+%!]+.'33{. ", +" ..+113}{1313'.++......+$..131/.......+......+>.+13131*../31313...+/*...........*...-{+. ", +" ..@131#..331/...@*/{%+...@313*.@****..+*{{*+...#31313*.@31313[..%**#.+***.#'/%...@***+. ", +" ..*331+..131{../31313}@..%313@+3311#.-313131@..'31/13-.{31|13{..313{.#313{3131-..'312.. ", +" ..'111..'111'./3111111}..-111+}111#.-1111111[..[11'11{+11/[11-.@111*.*11111111}../11[.. ", +" ..[111111111+-111{%1111@.{111{111#.+111,+/111.+111%11{-11#111*.#111#.{111/'111}..111{.. ", +" ...1}1111111#.}11}..-111*.1111111@..-111-{}11}.#}11@}1{}1_@111@.-111+._111+.111{.@111*.. ", +" ..@1}1}}}[-+.+11},..*1}1%+11}1}1}+..{1}1}1}1}%.-11{+}1}1}*#1}1+.{1}}..11}/..11},.%}1}@. ", +" ..#}}}@@.....@}}}*../}}}+@}}}}}}}-..}}}}}}},@.._}}%.}}}}[.*}}}..}}}{.@}}}%.@}}}%.*}}}+. ", +" ..-}}[....@%.@}}}}@#}}}_.*}}}#{}}}+.,}}}*..@+.+}}}@.}}}[%.,}}_.+[}}-.%}}}+.%}}}@.{[}}.. ", +" ..{[[_..!)]~..[[[[}[[[[@.,[[[.#[[[-.-[[[}[}[,.#[[[..[[[[..{[[,.@[[[#.-[[[+.,[[[..[[[,.. ", +" ..[[[,.. !~+.#[[[[[[_#..[[[/..[[[[.+_[[[[[[,.-[[{..[[[%..[[[-.%[[[+.{[[[.._[[_.+[[[*.. ", +" .+,,,#.. ]*..@,[[/-+...,,,%..*,,,@.+*/[[,-+.*,,%..#%%+.+,,,#.*,,,..,,,*..,,,*.+,,,@.. ", +" ........ *........+#................................+.............................. ", +" ...... %++...#*((#+++#>*#+++#(*@...+@**@++@%>%#@%!#+++#*@+++##+@+#*%@++%*@+++.. ", +" !)](::(((^:(((:(((:<<::]~](^<<{]{~~'~]^:<<<(~~:(]<2<|/{<|<|:(;=;; ", +" !)!]((:^^<||<<<:<<<<:!+...+>~~]~](::<<|||<~]|2|232|<:|<<|:^;==; ", +" ........... !!~^](:<||222|2|<(+......>(({]<|<|||222(~|332332|<12<|:];;& ", +" ..+@@@@@@@@.. !)!~]^(:<<|||2{.@333*.%<<((||||22{%+..@32<|332|2|<<(^;;& ", +" ../33333333+. !>~~~^^(::*.%333@.>|<:<|2222{....+.*<2<:<:::(<<^^=;& ", +" ..133333331................ ..++@%=%###@.'333+.]<>#@+@*':+.*/3'.@]2!#++@%^|:>#@@$+... ", +" ..+33331131/..............................:331..#+.........@333%..@+......+*@.......... ", +" ..@111%......#**@+-{'+.@'{%...#***..#***..111{.+..+*'/'*@.#'111'*+..+*'/-@...+***.@{-.. ", +" ..*111@....../11/1111<-1111-..}11<..111{.@111*..+/1111111./111112..-111111-..@111-11-.. ", +" ..'1111111_..11111111111111{..111,.+111-.#111@.+}1111111/.111111_.-11111111@.#111111#.. ", +" .._11}1}1},.+11}1*1}1}[*1}1{.@1}1%.@1}1%.*1}1+.}1}1%#11}-+*}1}_%#@1}1[#[1}1,.%1}1}}}+.. ", +" ...}}}}}}}}%.@}}}*.,}}}@.}}},.%}}}@.%}}}@.{}}}.%}}},.@}}}%.+}}}%..,}}}#.@}}}{.-}}}/+... ", +" ..@}}}-@+@++.*}}}+.,}}/..}}}*.,}}}..{}}}..}}},.{[}}+.*}}}@.#[}}@..[}}}..+}}},.{}}}+... ", +" ..%[[[@......,[[_..[}[,.@[[[#.,[[[..}[[{.+[[[*._[[[../[[[..*[[[...[[[_..#[[[*.[[[{.. ", +" ..-[[[-%%%%+._[[,.+[[[%.#[[[+.[[[[@,_[[,.@_[[#.[[[[*%[[[/..,_[[#+.[[[[-+_[[[+@_[[%.. ", +" ..,________@.___%.@___+.*___.._________%.%___+.,________,..,____%.-________*.@___@.. ", +" .._________.@___@.%___..,__/..,____,___+.,___..@________,..,____@.+{______,..*___+.. ", +" .+,,,,,,,,,.#,,,+.%,,-..,,,%..+,_/*+,,,+.-,,*...%/_,+%,,%...-__,+..+*/_/-@...%,,,.. ", +" ..................................................................+........+....... ", +" .................................................................<@+...++. ...... ", +" ", +" ", +" ", +" "}; diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/PokeMiniIcon_96x128.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/PokeMiniIcon_96x128.h new file mode 100644 index 0000000000..38267d89d4 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/PokeMiniIcon_96x128.h @@ -0,0 +1,24 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef POKEMINIICON_96X128_H +#define POKEMINIICON_96X128_H + +extern const char *PokeMiniIcon_96x128[]; + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/SGtkXDrawingView.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/SGtkXDrawingView.c new file mode 100644 index 0000000000..ea530554c1 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/SGtkXDrawingView.c @@ -0,0 +1,338 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include "SGtkXDrawingView.h" + +#include "Font8x12.h" + +uint8_t *sgtkx_drawing_view_font = (uint8_t *)Font8x12; + +void sgtkx_drawing_view_setfont(uint8_t *font) +{ + if (font) sgtkx_drawing_view_font = font; + else sgtkx_drawing_view_font = (uint8_t *)Font8x12; +} + +void sgtkx_drawing_view_drawhline(SGtkXDrawingView *widg, int y, int start, int end, uint32_t color) +{ + if ((y < 0) || (y >= widg->height)) return; + if (start < 0) start = 0; + else if (start >= widg->width) return; + if (end < 0) return; + else if (end > widg->width) end = widg->width; + uint32_t *imgptr = (uint32_t *)widg->imgptr + y * widg->pitch + start; + while (start != end) { + *imgptr = color; + imgptr++; + start++; + } +} + +void sgtkx_drawing_view_drawvline(SGtkXDrawingView *widg, int x, int start, int end, uint32_t color) +{ + if ((x < 0) || (x >= widg->width)) return; + if (start < 0) start = 0; + else if (start >= widg->height) return; + if (end < 0) return; + else if (end > widg->height) end = widg->height; + uint32_t *imgptr = (uint32_t *)widg->imgptr + start * widg->pitch + x; + while (start != end) { + *imgptr = color; + imgptr += widg->pitch; + start++; + } +} + +void sgtkx_drawing_view_drawsrect(SGtkXDrawingView *widg, int x, int y, int width, int height, uint32_t color) +{ + sgtkx_drawing_view_drawhline(widg, y, x, x + width, color); + sgtkx_drawing_view_drawhline(widg, y + height - 1, x, x + width, color); + sgtkx_drawing_view_drawvline(widg, x, y, y + height, color); + sgtkx_drawing_view_drawvline(widg, x + width - 1, y, y + height, color); +} + +void sgtkx_drawing_view_drawfrect(SGtkXDrawingView *widg, int x, int y, int width, int height, uint32_t color) +{ + int z; + if ((x > widg->width) || (y > widg->height)) return; + if (x < 0) { width += x; x = 0; } + if (y < 0) { height += y; y = 0; } + if ((x + width) > widg->width) width = widg->width - x; + if ((y + height) > widg->height) height = widg->height - y; + if ((width <= 0) || (height <= 0)) return; + uint32_t *imgptr = (uint32_t *)widg->imgptr + y * widg->pitch + x; + while (height--) { + for (z=0; zpitch; + } +} + +void sgtkx_drawing_view_drawchar(SGtkXDrawingView *widg, int x, int y, uint32_t color, unsigned char ch) +{ + unsigned char *chptr = (unsigned char *)sgtkx_drawing_view_font + (ch >> 4) * 1536 + (ch & 15) * 8; + int z, width = 8, height = 12; + if ((x > widg->width) || (y > widg->height)) return; + if (x < 0) { width += x; chptr += x; x = 0; } + if (y < 0) { height += y; chptr += y * 128; y = 0; } + if ((x + width) > widg->width) width = widg->width - x; + if ((y + height) > widg->height) height = widg->height - y; + if ((width <= 0) || (height <= 0)) return; + uint32_t *imgptr = (uint32_t *)widg->imgptr + y * widg->pitch + x; + while (height--) { + for (z=0; zpitch; + chptr += 128; + } +} + +void sgtkx_drawing_view_drawtext(SGtkXDrawingView *widg, int x, int y, uint32_t color, char *format, ...) +{ + char buffer[2048], ch; + int r, g, b; + char *sbuf; + + va_list args; + va_start(args, format); + vsprintf(buffer, format, args); + sbuf = buffer; + while ((ch = *sbuf++) != 0) { + if (ch == '\e') { + r = ((*sbuf++ - '0') * 28) & 255; + g = ((*sbuf++ - '0') * 28) & 255; + b = ((*sbuf++ - '0') * 28) & 255; + color = (r << 16) | (g << 8) | b; + continue; + } + sgtkx_drawing_view_drawchar(widg, x, y, color, ch); + x += 8.0; + } + va_end(args); +} + +void sgtkx_drawing_view_refresh(SGtkXDrawingView *widg) +{ + gtk_widget_queue_draw(GTK_WIDGET(widg->da)); +} + +static void sgtkx_drawing_view_sbachanged(GtkAdjustment *adj, SGtkXDrawingView *widg) +{ + int refresh = 1; + widg->sboffset = (int)adj->value; + if (widg->on_scroll) refresh = widg->on_scroll((void *)widg, (int)adj->value, (int)adj->lower, (int)adj->upper); + if (refresh) sgtkx_drawing_view_refresh(widg); +} + +static void sgtkx_drawing_view_size_request(GtkWidget *widget, GdkRectangle *allocation, SGtkXDrawingView *widg) +{ + if (widg->on_resize) widg->on_resize((void *)widg, (int)allocation->width, (int)allocation->height, 0); +} + +static gboolean sgtkx_drawing_view_exposure(GtkWidget *widget, GdkEventExpose *event, SGtkXDrawingView *widg) +{ + cairo_t *cr; + + // Initialize cairo + cr = gdk_cairo_create(widget->window); + gdk_cairo_rectangle(cr, &event->area); + cairo_clip(cr); + + // Recreate image cache on resize + if ((widget->allocation.width != widg->width) || (widget->allocation.height != widg->height)) { + cairo_surface_destroy(widg->surface); + widg->width = widget->allocation.width; + widg->height = widget->allocation.height; + if (widg->width < 0) widg->width = 8; + if (widg->height < 0) widg->height = 8; + widg->pitch = (widget->allocation.width + 7) & ~7; + widg->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, widg->pitch, widg->height); + widg->imgptr = (uint32_t *)cairo_image_surface_get_data(widg->surface); + if (widg->on_imgresize) widg->on_imgresize((void *)widg, widg->width, widg->height, widg->pitch); + } + + // Callback exposure + if (widg->on_exposure) widg->on_exposure((void *)widg, widg->width, widg->height, widg->pitch); + + // Paint image + cairo_set_source_surface(cr, widg->surface, 0, 0); + cairo_paint(cr); + + // Destroy cairo + cairo_destroy (cr); + + return TRUE; +} + +static gboolean sgtkx_drawing_view_scroll_event(GtkWidget *widget, GdkEventScroll *event, SGtkXDrawingView *widg) +{ + if (event->direction == GDK_SCROLL_UP) { + sgtkx_drawing_view_sbvalue(widg, (int)widg->sba->value - (int)widg->sba->page_size); + } else if (event->direction == GDK_SCROLL_DOWN) { + sgtkx_drawing_view_sbvalue(widg, (int)widg->sba->value + (int)widg->sba->page_size); + } + + return TRUE; +} + +static gboolean sgtkx_drawing_view_button_event(GtkWidget *widget, GdkEventButton *event, SGtkXDrawingView *widg) +{ + int refresh = 0; + if (event->type == GDK_BUTTON_PRESS) { + widg->buttons |= (1 << event->button); + if (widg->on_buttonpress) refresh = widg->on_buttonpress((void *)widg, event->button, 1, 0); + } else if (event->type == GDK_BUTTON_RELEASE) { + widg->buttons &= ~(1 << event->button); + if (widg->on_buttonrelease) refresh = widg->on_buttonrelease((void *)widg, event->button, 0, 0); + } + if (refresh) sgtkx_drawing_view_refresh(widg); + + return TRUE; +} + +static gboolean sgtkx_drawing_view_motion_notify(GtkWidget *widget, GdkEventMotion *event, SGtkXDrawingView *widg) +{ + int refresh = 0; + widg->mousex = (int)event->x; + widg->mousey = (int)event->y; + if (widg->on_motion) refresh = widg->on_motion((void *)widg, widg->mousex, widg->mousey, 0); + if (refresh) sgtkx_drawing_view_refresh(widg); + + return TRUE; +} + +static gboolean sgtkx_drawing_view_enterleave_notify(GtkWidget *widget, GdkEvent *event, SGtkXDrawingView *widg) +{ + int refresh = 0; + if (event->type == GDK_ENTER_NOTIFY) { + widg->mouseinside = 1; + if (widg->on_enterleave) refresh = widg->on_enterleave((void *)widg, 1, 0, 0); + } else if (event->type == GDK_LEAVE_NOTIFY) { + widg->mouseinside = 0; + if (widg->on_enterleave) refresh = widg->on_enterleave((void *)widg, 0, 0, 0); + } + if (refresh) sgtkx_drawing_view_refresh(widg); + + return TRUE; +} + +int sgtkx_drawing_view_new(SGtkXDrawingView *widg, int scrollbar) +{ + // Horizontal Box + widg->box = GTK_BOX(gtk_hbox_new(FALSE, 0)); + if (!widg->box) return 0; + + // Drawing area + widg->da = GTK_DRAWING_AREA(gtk_drawing_area_new()); + if (!widg->da) return 0; + gtk_widget_set_double_buffered(GTK_WIDGET(widg->da), FALSE); + gtk_widget_add_events(GTK_WIDGET(widg->da), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); + gtk_widget_add_events(GTK_WIDGET(widg->da), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + g_signal_connect(GTK_WIDGET(widg->da), "size-allocate", G_CALLBACK(sgtkx_drawing_view_size_request), widg); + g_signal_connect(GTK_WIDGET(widg->da), "expose_event", G_CALLBACK(sgtkx_drawing_view_exposure), widg); + g_signal_connect(GTK_WIDGET(widg->da), "motion_notify_event", G_CALLBACK(sgtkx_drawing_view_motion_notify), widg); + g_signal_connect(GTK_WIDGET(widg->da), "button_press_event", G_CALLBACK(sgtkx_drawing_view_button_event), widg); + g_signal_connect(GTK_WIDGET(widg->da), "button_release_event", G_CALLBACK(sgtkx_drawing_view_button_event), widg); + g_signal_connect(GTK_WIDGET(widg->da), "scroll_event", G_CALLBACK(sgtkx_drawing_view_scroll_event), widg); + g_signal_connect(GTK_WIDGET(widg->da), "enter_notify_event", G_CALLBACK(sgtkx_drawing_view_enterleave_notify), widg); + g_signal_connect(GTK_WIDGET(widg->da), "leave_notify_event", G_CALLBACK(sgtkx_drawing_view_enterleave_notify), widg); + gtk_box_pack_start(widg->box, GTK_WIDGET(widg->da), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(widg->da)); + + // Scroll bar adjustment + widg->sba = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 16.0, 0.0)); + g_signal_connect(widg->sba, "value_changed", G_CALLBACK(sgtkx_drawing_view_sbachanged), (gpointer)widg); + if (!widg->sba) return 0; + widg->sboffset = 0; + + // Scroll bar + widg->sb = GTK_SCROLLBAR(gtk_vscrollbar_new(widg->sba)); + if (!widg->sb) return 0; + gtk_box_pack_start(widg->box, GTK_WIDGET(widg->sb), FALSE, TRUE, 0); + if (scrollbar) gtk_widget_show(GTK_WIDGET(widg->sb)); + + // Surface + widg->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 8, 8); + widg->width = 8; + widg->height = 8; + widg->pitch = 8; + widg->imgptr = (uint32_t *)cairo_image_surface_get_data(widg->surface); + + return 1; +} + + +void sgtkx_drawing_view_sbvalue(SGtkXDrawingView *widg, int value) +{ + double fullmax, fvalue; + fvalue = (double)value; + fullmax = widg->sba->upper - widg->sba->page_size; + if (fvalue < widg->sba->lower) { + widg->sboffset = widg->sba->lower; + gtk_adjustment_set_value(widg->sba, widg->sboffset); + } else if (fvalue > fullmax) { + widg->sboffset = fullmax; + gtk_adjustment_set_value(widg->sba, widg->sboffset); + } else { + widg->sboffset = fvalue; + gtk_adjustment_set_value(widg->sba, widg->sboffset); + } +} + +void sgtkx_drawing_view_sbminmax(SGtkXDrawingView *widg, int min, int max) +{ + double fullmax, fvalue; + gtk_adjustment_set_lower(widg->sba, (double)min); + gtk_adjustment_set_upper(widg->sba, (double)max); + fvalue = floor(widg->sba->value); + fullmax = widg->sba->upper - widg->sba->page_size; + if (fvalue < widg->sba->lower) { + gtk_adjustment_set_value(widg->sba, widg->sba->lower); + } else if (fvalue > fullmax) { + gtk_adjustment_set_value(widg->sba, fullmax); + } +} + +void sgtkx_drawing_view_sbpage(SGtkXDrawingView *widg, int page_inc, int page_size) +{ + double fullmax, fvalue; + gtk_adjustment_set_page_increment(widg->sba, (double)page_inc); + gtk_adjustment_set_page_size(widg->sba, (double)page_size); + fvalue = floor(widg->sba->value); + fullmax = widg->sba->upper - widg->sba->page_size; + if (fvalue < widg->sba->lower) { + gtk_adjustment_set_value(widg->sba, widg->sba->lower); + } else if (fvalue > fullmax) { + gtk_adjustment_set_value(widg->sba, fullmax); + } +} + +static gboolean sgtkx_drawing_view_repaint_NOW(gpointer user_data) +{ + sgtkx_drawing_view_refresh((SGtkXDrawingView *)user_data); + return FALSE; +} + +void sgtkx_drawing_view_repaint_after(SGtkXDrawingView *widg, int milisec) +{ + g_timeout_add(milisec, sgtkx_drawing_view_repaint_NOW, (gpointer)widg); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/SGtkXDrawingView.h b/PVPokeMini/PokeMini/pokemini-code/sourcex/SGtkXDrawingView.h new file mode 100644 index 0000000000..7efbea2736 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/SGtkXDrawingView.h @@ -0,0 +1,92 @@ +/* + PokeMini - Pokmon-Mini Emulator + Copyright (C) 2009-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef SGTKXDRAWINGVIEW_H +#define SGTKXDRAWINGVIEW_H + +#include +#include + +typedef int (*TSGtkXDVCB)(void *obj, int a, int b, int c); + +#define SGtkXDVCB(a) ((TSGtkXDVCB)(a)) + +enum { + SGTKXDV_BLEFT = 1, + SGTKXDV_BMIDDLE = 2, + SGTKXDV_BRIGHT = 3 +}; + +typedef struct { + GtkBox *box; // Box widget + GtkAdjustment *sba; // Scrollbar's adjusment + GtkScrollbar *sb; // Scrollbar widget + GtkDrawingArea *da; // Drawing area widget + cairo_surface_t *surface; // Surface + uint32_t *imgptr; // Image buffer + int width; // Image width + int height; // Image height + int pitch; // Image pitch in pixels + TSGtkXDVCB on_scroll; // Callback: Scrollbar moved ret = refresh a = value + TSGtkXDVCB on_resize; // Callback: Window resized a = width b = height + TSGtkXDVCB on_imgresize; // Callback: Image resize a = width b = height c = pitch + TSGtkXDVCB on_exposure; // Callback: Drawing area repaint a = width b = height c = pitch + TSGtkXDVCB on_motion; // Callback: Mouse moving ret = refresh a = x b = y + TSGtkXDVCB on_buttonpress; // Callback: Mouse button pressing ret = refresh a = button b = press + TSGtkXDVCB on_buttonrelease; // Callback: Mouse button release ret = refresh a = button b = press + TSGtkXDVCB on_enterleave; // Callback: Enter / Leave widget ret = refresh a = inside + int buttons; // Mouse buttons down (bitmask) + int mousex; // Mouse x position + int mousey; // Mouse y position + int mouseinside; // Mouse inside widget + int sboffset; // Scrollbar offset + // User extra + int total_lines; // Total lines + int first_addr; // First address + int last_addr; // Last address + int highlight_addr; // Highlight address + int highlight_rem; // Highlight remaining timer +} SGtkXDrawingView; + +void sgtkx_drawing_view_setfont(uint8_t *font); + +void sgtkx_drawing_view_drawhline(SGtkXDrawingView *widg, int y, int start, int end, uint32_t color); + +void sgtkx_drawing_view_drawvline(SGtkXDrawingView *widg, int x, int start, int end, uint32_t color); + +void sgtkx_drawing_view_drawsrect(SGtkXDrawingView *widg, int x, int y, int width, int height, uint32_t color); + +void sgtkx_drawing_view_drawfrect(SGtkXDrawingView *widg, int x, int y, int width, int height, uint32_t color); + +void sgtkx_drawing_view_drawtext(SGtkXDrawingView *widg, int x, int y, uint32_t color, char *format, ...); + +void sgtkx_drawing_view_drawchar(SGtkXDrawingView *widg, int x, int y, uint32_t color, unsigned char ch); + +void sgtkx_drawing_view_refresh(SGtkXDrawingView *widg); + +int sgtkx_drawing_view_new(SGtkXDrawingView *widg, int scrollbar); + +void sgtkx_drawing_view_sbvalue(SGtkXDrawingView *widg, int value); + +void sgtkx_drawing_view_sbminmax(SGtkXDrawingView *widg, int min, int max); + +void sgtkx_drawing_view_sbpage(SGtkXDrawingView *widg, int page_inc, int page_size); + +void sgtkx_drawing_view_repaint_after(SGtkXDrawingView *widg, int milisec); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/sourcex/Zip64comp.c b/PVPokeMini/PokeMini/pokemini-code/sourcex/Zip64comp.c new file mode 100644 index 0000000000..1909619473 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/sourcex/Zip64comp.c @@ -0,0 +1,18 @@ +#include +#include +#include + +FILE *fopen64(const char *filename, const char *type) +{ + return fopen(filename, type); +} + +int fseeko64(FILE *stream, int64_t offset, int whence) +{ + return fseek(stream, (long)offset, whence); +} + +int64_t ftello64(FILE *stream) +{ + return (int64_t)ftell(stream); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/bin2c/bin2c.c b/PVPokeMini/PokeMini/pokemini-code/tools/bin2c/bin2c.c new file mode 100644 index 0000000000..b3277d7a60 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/bin2c/bin2c.c @@ -0,0 +1,67 @@ +#include +#include +#include + +#define ENTRIES_PER_LINE 16 + +char *remove_directory(char *s) +{ + char *p; + p = strrchr(s, '\\'); + if (!p) p = strrchr(s, '/'); // remove directory + if (p) return ++p; + else return s; +} + +int main(int argc, char **argv) +{ + int i; + char *p, ident[256]; + + // print usage if required + if (argc < 3) { + printf("Syntax: %s []\n", remove_directory(argv[0])); + return -1; + } + + // open source bin file + FILE *fi = fopen(argv[1], "rb"); + if (!fi) { + printf("Error opening input file!\n"); + return -1; + } + + // open destination C file + FILE *fo = fopen(argv[2], "w"); + if (!fo) { + printf("Error opening output file!\n"); + return -1; + } + + // copy/generate identifier + if (argc >= 4) { + strcpy(ident, argv[3]); + } else { + strcpy(ident, remove_directory(argv[1])); + p = strrchr(ident, '.'); // remove extension too + if (p) *p = 0; + } + + // convert data + fprintf(fo, "const unsigned char %s[] =\n{\n", ident); + while (!feof(fi)) { + for (i=0; i. +*/ + +#include + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +#include "color_info.h" +#include "PokeMini_ColorPal.h" +#include "Video.h" + +static const unsigned int drawline_coloridx[] = {0xFFFFFF, 0x000000, 0x808080}; + +static void colordisplay_drawhline(unsigned int *imgptr, int width, int height, int pitch, + int y, int start, int end, int coloridx) +{ + if ((y < 0) || (y >= height)) return; + if (start < 0) start = 0; + else if (start >= width) return; + if (end < 0) return; + else if (end >= width) end = width-1; + imgptr = (unsigned int *)imgptr + y * pitch + start; + while (start != end) { + *imgptr = drawline_coloridx[coloridx]; + imgptr++; + start++; + } +} + +static void colordisplay_drawvline(unsigned int *imgptr, int width, int height, int pitch, + int x, int start, int end, int coloridx) +{ + if ((x < 0) || (x >= width)) return; + if (start < 0) start = 0; + else if (start >= height) return; + if (end < 0) return; + else if (end >= height) end = height-1; + imgptr = (unsigned int *)imgptr + start * pitch + x; + while (start != end) { + *imgptr = drawline_coloridx[coloridx]; + imgptr += pitch; + start++; + } +} + +void colordisplay_decodespriteidx(int spriteidx, int x, int y, int *dataidx, int *maskidx) +{ + switch ((y & 8) + ((x & 8) >> 1)) { + case 0: // Top-Left + if (dataidx) *dataidx = (spriteidx << 3) + 2; + if (maskidx) *maskidx = (spriteidx << 3) + 0; + break; + case 4: // Top-Right + if (dataidx) *dataidx = (spriteidx << 3) + 6; + if (maskidx) *maskidx = (spriteidx << 3) + 4; + break; + case 8: // Bottom-Left + if (dataidx) *dataidx = (spriteidx << 3) + 3; + if (maskidx) *maskidx = (spriteidx << 3) + 1; + break; + case 12: // Bottom-Right + if (dataidx) *dataidx = (spriteidx << 3) + 7; + if (maskidx) *maskidx = (spriteidx << 3) + 5; + break; + } +} + +void colordisplay_8x8Attr(unsigned int *imgptr, int width, int height, int pitch, + int spritemode, int zoom, unsigned int offset, int select_a, int select_b, + int negative, unsigned int transparency, int grid, int monorender, int contrast) +{ + unsigned int *scanptr, mapoff; + int x, y, odata; + int xp, yp, pitchp; + int tileidx, tileidxD = 0, tileidxM = 0, tiledataaddr, tilemaskaddr; + + negative &= 1; + uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; + uint8_t ddata = 0, mdata = 0; + + int selectStart = min(select_a, select_b) << 3; + int selectEnd = max(select_a, select_b) << 3; + + if (spritemode) { + // Draw sprites + offset = offset & ~7; + pitchp = pitch / zoom; + for (y=0; y> 4) * (pitchp >> 4) + (xp >> 4); + colordisplay_decodespriteidx(tileidx, xp, yp, &tileidxD, &tileidxM); + tiledataaddr = (offset << 3) + (tileidxD << 3); + tilemaskaddr = (offset << 3) + (tileidxM << 3); + mapoff = (offset << 1) + (tileidxD << 1); + + // Draw sprite + if (tiledataaddr < PM_ROM_FSize) { + // Get map offset + ColorMap = (uint8_t *)PRCColorUMap + mapoff; + if ((mapoff < 0) || (mapoff >= PRCColorUBytes) || (monorender)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw sprite + mdata = PM_ROM[tilemaskaddr + (xp & 7)] & (1 << (yp & 7)); + if (!mdata) { + ddata = PM_ROM[tiledataaddr + (xp & 7)] & (1 << (yp & 7)); + odata = ddata ? ColorMap[1 ^ negative] : ColorMap[0 ^ negative]; + odata += contrast << 4; + if (odata < 0x00) odata = 0x00; + if (odata > 0xFF) odata = 0xFF; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + scanptr[x] = transparency; + } + } else { + // Outside ROM range + if (monorender) scanptr[x] = PokeMini_ColorPalBGR32[ColorMap[0]]; + else scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + + // Draw mask + if ((selectStart >= 0) && (tiledataaddr >= selectStart) && (tiledataaddr < selectEnd)) { + if (((x ^ y) & 3) == 3) scanptr[x] = ~scanptr[x]; + } + } + } + } else { + // Draw tiles + pitchp = pitch / zoom; + for (y=0; y> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = (offset << 3) + (tileidx << 3); + mapoff = (offset << 1) + (tileidx << 1); + + // Draw tile + if (tiledataaddr < PM_ROM_FSize) { + // Get map offset + ColorMap = (uint8_t *)PRCColorUMap + mapoff; + if ((mapoff < 0) || (mapoff >= PRCColorUBytes) || (monorender)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw tile + ddata = PM_ROM[tiledataaddr + (xp & 7)] & (1 << (yp & 7)); + odata = ddata ? ColorMap[1 ^ negative] : ColorMap[0 ^ negative]; + odata += contrast << 4; + if (odata < 0x00) odata = 0x00; + if (odata > 0xFF) odata = 0xFF; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + // Outside ROM range + if (monorender) scanptr[x] = PokeMini_ColorPalBGR32[ColorMap[0]]; + else scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + + // Draw mask + if ((selectStart >= 0) && (tiledataaddr >= selectStart) && (tiledataaddr < selectEnd)) { + if (((x ^ y) & 3) == 3) scanptr[x] = ~scanptr[x]; + } + } + } + } + + // Draw grid + if (grid) { + for (x=0; x> 4) * (pitchp >> 4) + (xp >> 4); + colordisplay_decodespriteidx(tileidx, xp, yp, &tileidxD, &tileidxM); + tiledataaddr = (offset << 3) + (tileidxD << 3); + tilemaskaddr = (offset << 3) + (tileidxM << 3); + mapoff = (offset << 3) + (tileidxD << 3); + subtile2 = (yp & 4) + ((xp & 4) >> 1); + + // Draw sprite + if (tiledataaddr < PM_ROM_FSize) { + // Get map offset + ColorMap = (uint8_t *)PRCColorUMap + mapoff; + if ((mapoff < 0) || (mapoff >= PRCColorUBytes) || (monorender)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw + mdata = PM_ROM[tilemaskaddr + (xp & 7)] & (1 << (yp & 7)); + if (!mdata) { + ddata = PM_ROM[tiledataaddr + (xp & 7)] & (1 << (yp & 7)); + odata = ddata ? ColorMap[(subtile2 + 1) ^ negative] : ColorMap[subtile2 ^ negative]; + odata += contrast << 4; + if (odata < 0x00) odata = 0x00; + if (odata > 0xFF) odata = 0xFF; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + scanptr[x] = transparency; + } + } else { + // Outside ROM range + if (monorender) scanptr[x] = PokeMini_ColorPalBGR32[ColorMap[0]]; + else scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + + // Draw mask + if ((selectStart >= 0) && (tiledataaddr >= selectStart) && (tiledataaddr < selectEnd)) { + if (((x ^ y) & 3) == 3) scanptr[x] = ~scanptr[x]; + } + } + } + } else { + // Draw tiles + pitchp = pitch / zoom; + for (y=0; y> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = (offset << 3) + (tileidx << 3); + mapoff = (offset << 3) + (tileidx << 3); + subtile2 = (yp & 4) + ((xp & 4) >> 1); + + // Draw tile + if (tiledataaddr < PM_ROM_FSize) { + // Get map offset + ColorMap = (uint8_t *)PRCColorUMap + mapoff; + if ((mapoff < 0) || (mapoff >= PRCColorUBytes)) ColorMap = (uint8_t *)PRCStaticColorMap; + + // Decode and draw tile + ddata = PM_ROM[tiledataaddr + (xp & 7)] & (1 << (yp & 7)); + odata = ddata ? ColorMap[(subtile2 + 1) ^ negative] : ColorMap[subtile2 ^ negative]; + odata += contrast << 4; + if (odata < 0x00) odata = 0x00; + if (odata > 0xFF) odata = 0xFF; + scanptr[x] = PokeMini_ColorPalBGR32[odata]; + } else { + // Outside ROM range + if (monorender) scanptr[x] = PokeMini_ColorPalBGR32[ColorMap[0]]; + else scanptr[x] = (yp ^ xp) & 1 ? 0x808080 : 0x404040; + } + + // Draw mask + if ((selectStart >= 0) && (tiledataaddr >= selectStart) && (tiledataaddr < selectEnd)) { + if (((x ^ y) & 3) == 3) scanptr[x] = ~scanptr[x]; + } + } + } + } + + // Draw grid + if (grid) { + for (x=0; x. +*/ + +#ifndef COLOR_DISPLAY_H +#define COLOR_DISPLAY_H + +void colordisplay_drawhline(unsigned int *imgptr, int width, int height, int pitch, + int y, int start, int end, int coloridx); + +void colordisplay_drawvline(unsigned int *imgptr, int width, int height, int pitch, + int x, int start, int end, int coloridx); + +void colordisplay_decodespriteidx(int spriteidx, int x, int y, int *dataidx, int *maskidx); + +void colordisplay_8x8Attr(unsigned int *imgptr, int width, int height, int pitch, + int spritemode, int zoom, unsigned int offset, int select_a, int select_b, + int negative, unsigned int transparency, int grid, int monorender, int contrast); + +void colordisplay_4x4Attr(unsigned int *imgptr, int width, int height, int pitch, + int spritemode, int zoom, unsigned int offset, int select_a, int select_b, + int negative, unsigned int transparency, int grid, int monorender, int contrast); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_info.c b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_info.c new file mode 100644 index 0000000000..90bb93ba43 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_info.c @@ -0,0 +1,545 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include + +#include "Endianess.h" + +#include "color_mapper.h" +#include "color_info.h" +#include "PMCommon.h" +#include "GtkXDialogs.h" + +unsigned char *PM_ROM = NULL; +int PM_ROM_FSize = 0; +int PM_ROM_SSize = 0; + +unsigned char *PRCColorUMap = NULL; // Uncompressed map +uint32_t PRCColorUBytes = 0; // Size of uncompressed map in bytes +uint32_t PRCColorUTiles = 0; // Number of maximum tiles +uint32_t PRCColorBytesPerTile = 0; // Number of bytes per tile +int PRCColorFormat = 0; // Color format +int PRCColorFlags = 0x01; // Color flags +uint32_t PRCColorCOffset = 0; // Compress: Offset +uint32_t PRCColorCTiles = 0; // Compress: Number of tiles + +const uint8_t PRCStaticColorMap[8] = {0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0xF0}; + +void FreeColorInfo() +{ + if (PRCColorUMap) { + free(PRCColorUMap); + PRCColorUMap = NULL; + PRCColorUTiles = 0; + PRCColorUBytes = 0; + PRCColorCOffset = 0; + PRCColorCTiles = 0; + } +} + +int LoadMIN(char *filename) +{ + FILE *fmin; + int size, readbytes; + + // Open file + fmin = fopen(filename, "rb"); + if (fmin == NULL) { + MessageDialog(MainWindow, "Failed to open MIN file", "Error", GTK_MESSAGE_ERROR, NULL); + return 0; + } + + // Check filesize + fseek(fmin, 0, SEEK_END); + size = ftell(fmin); + + // Check if size is valid + if ((size <= 0x2100) || (size > 0x200000)) { + fclose(fmin); + MessageDialog(MainWindow, "MIN file size is invalid", "Error", GTK_MESSAGE_ERROR, NULL); + return 0; + } + + // Free existing color information + FreeColorInfo(); + + // Allocate ROM and set cartridge size + if (PM_ROM) { free(PM_ROM); PM_ROM = NULL; } + PM_ROM_FSize = size; + PM_ROM_SSize = (size + 63) & ~63; + PM_ROM = (uint8_t *)malloc(PM_ROM_SSize); + if (!PM_ROM) { + fclose(fmin); + MessageDialog(MainWindow, "Not enough memory", "Error", GTK_MESSAGE_ERROR, NULL); + return 0; + } + memset(PM_ROM, 0xFF, PM_ROM_SSize); + + // Read content + fseek(fmin, 0x2100, SEEK_SET); + readbytes = fread(&PM_ROM[0x2100], 1, size - 0x2100, fmin); + fclose(fmin); + + // Check read size + if (readbytes != (size - 0x2100)) { + MessageDialog(MainWindow, "Read error @ MIN File", "Error", GTK_MESSAGE_ERROR, NULL); + return 0; + } + + return 1; +} + +void ResetColorInfo() +{ + int i; + if (PRCColorUMap) { + // So far both color formats are compatible + for (i=0; i> 8) & 0xFF; + + // Calculate stuff + if (PRCColorFormat == 1) PRCColorBytesPerTile = 8; + else PRCColorBytesPerTile = 2; + PRCColorUTiles = PM_ROM_SSize >> 3; + PRCColorUBytes = PRCColorUTiles * PRCColorBytesPerTile; + PRCColorCOffset = 0; + PRCColorCTiles = 0; + + // Allocate + if (PRCColorUMap) { + free(PRCColorUMap); + PRCColorUMap = NULL; + } + PRCColorUMap = (uint8_t *)malloc(PRCColorUBytes); + ResetColorInfo(); + + return (PRCColorUMap != NULL); +} + +int CompressColorInfo_8x8Attr(uint32_t *offset, uint32_t *tiles) +{ + int bot, top; + + // Check bottom + for (bot=0; bot= 0; top-=2) { + if ((PRCColorUMap[top] != 0x00) || (PRCColorUMap[top+1] != 0xF0)) { + top += 2; + break; + } + } + + // Toward the end + if (offset) *offset = (bot) >> 1; + if (tiles) *tiles = (top - bot) >> 1; + return 1; +} + +int CompressColorInfo_4x4Attr(uint32_t *offset, uint32_t *tiles) +{ + int bot, top; + + // Check bottom + for (bot=0; bot= 0; top-=8) { + if ((PRCColorUMap[top+0] != 0x00) || (PRCColorUMap[top+1] != 0xF0) + || (PRCColorUMap[top+2] != 0x00) || (PRCColorUMap[top+3] != 0xF0) + || (PRCColorUMap[top+4] != 0x00) || (PRCColorUMap[top+5] != 0xF0) + || (PRCColorUMap[top+6] != 0x00) || (PRCColorUMap[top+7] != 0xF0)) { + top += 8; + break; + } + } + + // Toward the end + if (offset) *offset = (bot) >> 3; + if (tiles) *tiles = (top - bot) >> 3; + return 1; +} + +int CompressColorInfo(uint32_t *offset, uint32_t *tiles) +{ + if (!PRCColorUMap) return 0; + + if (PRCColorFormat == 1) { + return CompressColorInfo_4x4Attr(offset, tiles); + } else { + return CompressColorInfo_8x8Attr(offset, tiles); + } +} + +int Convert8x8to4x4() +{ + uint8_t *NewPRCColorUMap; + int i; + + NewPRCColorUMap = (uint8_t *)malloc(PRCColorUTiles * 8); + if (!NewPRCColorUMap) return 0; + for (i=0; i 262144) { + MessageDialog(MainWindow, "Map tiles exceed the limit", "Error", GTK_MESSAGE_ERROR, NULL); + fclose(fi); + return 0; + } + + // Free existing color information + FreeColorInfo(); + + // Calculate stuff + PRCColorBytesPerTile = 2; + PRCColorUTiles = PM_ROM_SSize >> 3; + PRCColorUBytes = PRCColorUTiles * PRCColorBytesPerTile; + PRCColorCOffset = 0; + PRCColorCTiles = maptiles; + + // Create and load map + PRCColorUMap = (uint8_t *)malloc(PRCColorUBytes); + ResetColorInfo(); + for (i=0; i 0x01) { // Only color type 0 and 1 are valid + MessageDialog(MainWindow, "Invalid color type", "Error", GTK_MESSAGE_ERROR, NULL); + fclose(fi); + return 0; + } + PRCColorFormat = vcod[1]; + PRCColorFlags = vcod[2]; + DATAREADFROMFILE(&maptiles, 4); // Number of map tiles + maptiles = Endian32(maptiles); + DATAREADFROMFILE(&mapoffset, 4); // Map offset in tiles + mapoffset = Endian32(mapoffset); + DATAREADFROMFILE(reserved, 16); // Reserved area + + // PM ROM Max is 2MB, that's 256K Map Tiles + if (maptiles > 262144) { + MessageDialog(MainWindow, "Map tiles exceed the limit", "Error", GTK_MESSAGE_ERROR, NULL); + fclose(fi); + return 0; + } + if (mapoffset > 262144) { + MessageDialog(MainWindow, "Map offset exceed the limit", "Error", GTK_MESSAGE_ERROR, NULL); + fclose(fi); + return 0; + } + + // Free existing color information + FreeColorInfo(); + + // Calculate stuff + if (PRCColorFormat == 1) PRCColorBytesPerTile = 8; + else PRCColorBytesPerTile = 2; + PRCColorUTiles = PM_ROM_SSize >> 3; + PRCColorUBytes = PRCColorUTiles * PRCColorBytesPerTile; + PRCColorCOffset = mapoffset; + PRCColorCTiles = maptiles; + + // Create and load map + PRCColorUMap = (uint8_t *)malloc(PRCColorUBytes); + ResetColorInfo(); + for (i=0; i= PRCColorUTiles) return 0; + if ((tileoff + tiles) > PRCColorUTiles) return 0; + + if (tiles > 0) memcpy(dst, PRCColorUMap + tileoff * PRCColorBytesPerTile, tiles * PRCColorBytesPerTile); + return 1; +} + +int SetColorData(uint8_t *src, int tileoff, int tiles) +{ + if (src == NULL) return tiles * PRCColorBytesPerTile; + + if (tileoff >= PRCColorUTiles) return 0; + if ((tileoff + tiles) > PRCColorUTiles) { + tiles = PRCColorUTiles - tileoff; + } + + if (tiles > 0) memcpy(PRCColorUMap + tileoff * PRCColorBytesPerTile, src, tiles * PRCColorBytesPerTile); + return 1; +} + +int FillColorData(int tileoff, int tiles, int color_off, int color_on) +{ + int i; + uint8_t *ptr; + + if (tileoff >= PRCColorUTiles) return 0; + if ((tileoff + tiles) > PRCColorUTiles) { + tiles = PRCColorUTiles - tileoff; + } + + // So far both color formats are compatible + if (tiles > 0) { + ptr = PRCColorUMap + tileoff * PRCColorBytesPerTile; + for (i=0; i<(tiles * PRCColorBytesPerTile); i+=2) { + if (color_off >= 0) ptr[i] = (uint8_t)color_off; + if (color_on >= 0) ptr[i+1] = (uint8_t)color_on; + } + } + return 1; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_info.h b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_info.h new file mode 100644 index 0000000000..0d5e9c1f50 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_info.h @@ -0,0 +1,64 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef COLORINFO_H +#define COLORINFO_H + +#include + +extern unsigned char *PM_ROM; // Pokemon-Mini ROM +extern int PM_ROM_FSize; // Pokemon-Mini ROM File Size +extern int PM_ROM_SSize; // Pokemon-Mini ROM Safe Size + +extern unsigned char *PRCColorUMap; // Uncompressed map +extern uint32_t PRCColorUBytes; // Size of uncompressed map in bytes +extern uint32_t PRCColorUTiles; // Number of maximum tiles +extern uint32_t PRCColorBytesPerTile; // Number of bytes per tile +extern int PRCColorFormat; // Color format +extern int PRCColorFlags; // Color flags + +extern uint32_t PRCColorCOffset; // Compress: Offset +extern uint32_t PRCColorCTiles; // Compress: Number of tiles + +extern const uint8_t PRCStaticColorMap[8]; // Static Color Map + +void FreeColorInfo(); + +int LoadMIN(char *filename); + +void ResetColorInfo(); + +int NewColorInfo(int type); + +int CompressColorInfo(uint32_t *offset, uint32_t *tiles); + +int Convert8x8to4x4(); + +int Convert4x4to8x8(); + +int LoadColorInfo(char *filename); + +int SaveColorInfo(char *filename); + +int GetColorData(uint8_t *dst, int tileoff, int tiles); + +int SetColorData(uint8_t *src, int tileoff, int tiles); + +int FillColorData(int tileoff, int tiles, int color_off, int color_on); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.c b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.c new file mode 100644 index 0000000000..ce3e40d5bc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.c @@ -0,0 +1,1193 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include + +#include "color_mapper.h" +#include "color_info.h" +#include "color_display.h" +#include "gtkx_colormapper.h" +#include "gtkx_pickedcolor.h" +#include "gtkx_palettepicker.h" +#include "GtkXDialogs.h" + +#include "PMCommon.h" +#include "CommandLine.h" +#include "PokeMini_ColorPal.h" +#include "PokeMiniIcon_96x128.h" +#include "ExportBMP.h" +#include "HelpSupport.h" + +#define APPTITLE "PokeMini Color Mapper v1.3" + +const char *AboutTxt = APPTITLE + "\n\n" + "Coded by JustBurn\n" + "Thanks to p0p, Dave|X,\n" + "Onori, goldmono, Agilo,\n" + "DarkFader, asterick,\n" + "MrBlinky, Wa, Lupin and\n" + "everyone in #pmdev on\n" + "IRC EFNET!\n\n" + "Please check readme.txt\n\n" + "For latest version visit:\n" + "http://code.google.com/p/pokemini/\n"; + +GtkItemFactory *ItemFactory; +GtkAccelGroup *AccelGroup; +GtkWindow *MainWindow; +GtkBox *VBox1; +GtkSeparator *HSep1; +GtkMenuBar *MenuBar; +GtkBox *HBox1; +GtkSeparator *VSep2[3]; +GtkLabel *LabelInfo; +GtkXcolormapper *ColorMapper; +GtkScrollbar *VScroll1; +GtkAdjustment *VScroll1_Adj; +GtkBox *HBox2; +GtkButtonBox *VButtonBox1; +GtkButtonBox *VButtonBox2; +GtkToggleButton *CheckBox_SpriteMode; +GtkToggleButton *CheckBox_Grid; +GtkToggleButton *CheckBox_Negative; +GtkToggleButton *CheckBox_DisplayBlend; +GtkButton *Button_SwapBlend; +GtkComboBox *ComboZoom; +GtkXpickedcolor *PickedColor; +GtkXpalettepicker *PalettePicker; +GtkFrame *StatusFrame; +GtkLabel *StatusLabel; +GtkAdjustment *Contrast_Adj; +GtkScale *Contrast; + +int WidInConfigs; + +char MINFile[256]; +char ColorFile[256]; + +int SpriteMode = 0; +int Grid = 1; +int DispNegative = 0; +int DispBlend = 0; +int ChangesMade = 0; +int Zoom = 5; +int TransparencySelColor = 0xFF00FF; +int ContrastLevel = 0; +int WinX = -16; +int WinY = -16; +int WinW = -1; +int WinH = -1; + +uint32_t CurrAddr = 0; +uint32_t MarkAddr[10] = {0}; + +unsigned char *MaskData = NULL; +int MaskSize = 0; + +const TCommandLineCustom CustomConf[] = { + { "main_winx", &WinX, COMMANDLINE_INT, -16, 4095 }, + { "main_winy", &WinY, COMMANDLINE_INT, -16, 4095 }, + { "main_winw", &WinW, COMMANDLINE_INT, -1, 4095 }, + { "main_winh", &WinH, COMMANDLINE_INT, -1, 4095 }, + { "spritemode", &SpriteMode, COMMANDLINE_BOOL }, + { "grid", &Grid, COMMANDLINE_BOOL }, + { "disp_negative", &DispNegative, COMMANDLINE_BOOL }, + { "disp_blend", &DispBlend, COMMANDLINE_BOOL }, + { "zoom", &Zoom, COMMANDLINE_INT, 1, 8 }, + { "transparency", &TransparencySelColor, COMMANDLINE_INT, 0x000000, 0xFFFFFF } +}; + +void SetChangesMade(int changesmade) +{ + PangoAttrList *attrs; + PangoAttribute *pa; + if (ChangesMade != changesmade) { + ChangesMade = changesmade; + if (ChangesMade) { + attrs = pango_attr_list_new(); + pa = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE); + pango_attr_list_insert(attrs, pa); + gtk_label_set_attributes(LabelInfo, attrs); + pango_attr_list_unref(attrs); + } else { + attrs = pango_attr_list_new(); + gtk_label_set_attributes(LabelInfo, attrs); + pango_attr_list_unref(attrs); + } + } +} + +const char *ColorFormatStr[] = { + "8x8 Attributes", + "4x4 Attributes" +}; + +void LoadMINFromFile(char *filename) +{ + char tmp[256]; + strcpy(tmp, filename); + if (ExtensionCheck(filename, ".minc")) { + tmp[strlen(filename)-1] = 0; + } + if (!LoadMIN(tmp)) return; + strcpy(MINFile, tmp); + sprintf(ColorFile, "%sc", MINFile); + if (FileExist(ColorFile)) LoadColorInfo(ColorFile); + if (!PRCColorUMap) { + NewColorInfo(PickColorFormatDialog(MainWindow, 0, 0x01)); + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + sprintf(tmp, "MIN Loaded!\n\nColor Format: %s\nROM size: %i Bytes\nTiles: %i (Maximum)", ColorFormatStr[PRCColorFormat], PM_ROM_FSize, PRCColorUTiles); + } else { + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + sprintf(tmp, "MIN and Color Info Loaded!\n\nColor Format: %s\nROM size: %i Bytes\nTiles: %i (Maximum)\nTiles: %i (Compressed, Offset %i)", ColorFormatStr[PRCColorFormat], PM_ROM_FSize, PRCColorUTiles, PRCColorCTiles, PRCColorCOffset); + } + SetChangesMade(0); + gtk_adjustment_set_value(VScroll1_Adj, 0.0); + gtk_adjustment_set_upper(VScroll1_Adj, (double)PRCColorUTiles); + MessageDialog(MainWindow, tmp, "MIN Loaded!", GTK_MESSAGE_INFO, PokeMiniIcon_96x128); +} + +gboolean MainWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + // Get position & size before closing + gtk_window_deiconify(MainWindow); + gtk_window_get_position(MainWindow, &WinX, &WinY); + gtk_window_get_size(MainWindow, &WinW, &WinH); + + // Ask if file was modified + if (ChangesMade) { + if (YesNoDialog(MainWindow, "File has been changed, save before quitting?", "Save?", GTK_MESSAGE_QUESTION, NULL)) { + if (SaveFileDialogEx(MainWindow, "Save Color Info", ColorFile, ColorFile, "Color Info (*.minc)\0*.minc\0All (*.*)\0*.*\0", 0)) { + if (!SaveColorInfo(ColorFile)) return TRUE; + } else return TRUE; + } + } + return FALSE; +} + +void MainWindow_destroy(GtkWidget *widget, gpointer data) +{ + gtk_main_quit(); +} + +void Menu_File_OpenMIN(GtkWidget *widget, gpointer data) +{ + char tmp[256]; + if (OpenFileDialogEx(MainWindow, "Open MIN", tmp, MINFile, "MIN Rom (*.min)\0*.min\0All (*.*)\0*.*\0", 0)) { + if (!ExtensionCheck(tmp, ".min")) { + if (!YesNoDialog(MainWindow, "File extension should be .min, continue?", "File Extension", GTK_MESSAGE_QUESTION, NULL)) { + return; + } + } + LoadMINFromFile(tmp); + } +} + +void Menu_File_ResetColor(GtkWidget *widget, gpointer data) +{ + if (!PM_ROM) { + MessageDialog(MainWindow, "ROM not loaded yet!", "Reset color", GTK_MESSAGE_ERROR, NULL); + return; + } + if (YesNoDialog(MainWindow, "Erase everything?", "Reset?", GTK_MESSAGE_QUESTION, NULL)) { + SetChangesMade(0); + NewColorInfo(PickColorFormatDialog(MainWindow, 0, 0x01)); + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + } +} + +void Menu_File_LoadColor(GtkWidget *widget, gpointer data) +{ + char tmp[256]; + strcpy(tmp, ColorFile); + if (!PM_ROM) { + MessageDialog(MainWindow, "ROM not loaded yet!", "Load color", GTK_MESSAGE_ERROR, NULL); + return; + } + if (OpenFileDialogEx(MainWindow, "Load Color Info", tmp, ColorFile, "Color Info (*.minc)\0*.minc\0All (*.*)\0*.*\0", 0)) { + if (!ExtensionCheck(tmp, ".minc")) { + if (!YesNoDialog(MainWindow, "File extension should be .minc, continue?", "File Extension", GTK_MESSAGE_QUESTION, NULL)) { + return; + } + } + if (LoadColorInfo(tmp)) { + strcpy(ColorFile, tmp); + SetChangesMade(0); + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + } + } +} + +void Menu_File_SaveColorAs(GtkWidget *widget, gpointer data) +{ + if (!PM_ROM) { + MessageDialog(MainWindow, "ROM not loaded yet!", "Save color as...", GTK_MESSAGE_ERROR, NULL); + return; + } + if (SaveFileDialogEx(MainWindow, "Save Color Info", ColorFile, ColorFile, "Color Info (*.minc)\0*.minc\0All (*.*)\0*.*\0", 0)) { + if (SaveColorInfo(ColorFile)) { + SetChangesMade(0); + } + } +} + +void Menu_File_SaveColor(GtkWidget *widget, gpointer data) +{ + if (FileExist(ColorFile)) { + if (SaveColorInfo(ColorFile)) { + SetChangesMade(0); + } + } else Menu_File_SaveColorAs(widget, data); +} + +void Menu_File_Export(GtkWidget *widget, gpointer data) +{ + int x, y, z, htiles, vtiles, vsingle; + int monorender = (int)data; + cairo_surface_t *tmpimg; + uint32_t *ptr; + char tmp[256]; + FILE *capf; + + if (!PRCColorUTiles) { + MessageDialog(MainWindow, "Nothing to export", "Export image...", GTK_MESSAGE_ERROR, NULL); + return; + } + if (EnterNumberDialog(MainWindow, "Export image...", "Number of horizontal tiles:", &htiles, 16, 2, 0, 1, 8192)) { + if (SpriteMode && (htiles & 1)) { + MessageDialog(MainWindow, "Number of horizontal tiles must be an even number for sprites", "Export image...", GTK_MESSAGE_ERROR, NULL); + return; + } + vtiles = (int)ceil((double)PRCColorUTiles / htiles); + vtiles = SpriteMode ? ((vtiles / 2 + 1) & ~3) : vtiles; + vsingle = SpriteMode ? 2 : 1; + + // Select filename to export + if (!SaveFileDialogEx(MainWindow, "Save Color Info", tmp, "export.bmp", "Bitmap (*.bmp)\0*.bmp\0All (*.*)\0*.*\0", 0)) return; + + // Create image to hold the tiles to be extracted + tmpimg = cairo_image_surface_create(CAIRO_FORMAT_RGB24, htiles * 8, vsingle * 8); + if (!tmpimg) { + MessageDialog(MainWindow, "Failed to allocate image\nTry to use a higher number of horizontal tiles", "Export image...", GTK_MESSAGE_ERROR, NULL); + return; + } + ptr = (uint32_t *)cairo_image_surface_get_data(tmpimg); + if (!ptr) { + cairo_surface_destroy(tmpimg); + MessageDialog(MainWindow, "Failed to allocate image\nTry to use a higher number of horizontal tiles", "Export image...", GTK_MESSAGE_ERROR, NULL); + return; + } + + // Open BMP for exportation + capf = Open_ExportBMP(tmp, htiles * 8, vtiles * 8); + if (!capf) { + cairo_surface_destroy(tmpimg); + MessageDialog(MainWindow, "Failed to save export", "Error", GTK_MESSAGE_ERROR, NULL); + return; + } + + // Export each single row + z = SpriteMode ? (vtiles-2) : (vtiles-1); + for (; z >= 0; z -= vsingle) { + sprintf(tmp, "Exporting image... %i%%", 100 - (z * 100 / vtiles)); + gtk_label_set_text(StatusLabel, tmp); + while (gtk_events_pending()) gtk_main_iteration(); + + if (PRCColorFormat == 1) { + colordisplay_4x4Attr(ptr, htiles * 8, vsingle * 8, htiles * 8, + SpriteMode, 1, z * htiles * vsingle, 0, -8, + DispNegative, TransparencySelColor, 0, monorender, 0); + } else { + colordisplay_8x8Attr(ptr, htiles * 8, vsingle * 8, htiles * 8, + SpriteMode, 1, z * htiles * vsingle, 0, -8, + DispNegative, TransparencySelColor, 0, monorender, 0); + } + for (y=0; y> 8) & 0xFF; + PRCColorFlags = newcolorflags; + if ((PRCColorFormat == 0) && (newcolorformat == 1)) { + // Convert 8x8 to 4x4 + if (YesNoDialog(MainWindow, "Convert from 8x8 Attributes to 4x4 Attributes?", "Convert?", GTK_MESSAGE_QUESTION, NULL)) { + if (Convert8x8to4x4()) { + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + MessageDialog(MainWindow, "Format change completed!\nFormat is now 4x4 Attributes", "Change format", GTK_MESSAGE_INFO, PokeMiniIcon_96x128); + } else { + MessageDialog(MainWindow, "Failed to convert!\nNot enough memory", "Change format", GTK_MESSAGE_ERROR, NULL); + } + } + } else if ((PRCColorFormat == 1) && (newcolorformat == 0)) { + // Convert 4x4 to 8x8 + if (YesNoDialog(MainWindow, "Convert from 4x4 Attributes to 8x8 Attributes?\n\nWARNING: Some information will be lost", "Convert?", GTK_MESSAGE_QUESTION, NULL)) { + if (Convert4x4to8x8()) { + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + MessageDialog(MainWindow, "Format change completed!\nFormat is now 8x8 Attributes", "Change format", GTK_MESSAGE_INFO, PokeMiniIcon_96x128); + } else { + MessageDialog(MainWindow, "Failed to convert!\nNot enough memory", "Change format", GTK_MESSAGE_ERROR, NULL); + } + } + } +} + +void Menu_File_Quit(GtkWidget *widget, gpointer data) +{ + if (MainWindow_delete_event(widget, NULL, data) == FALSE) gtk_main_quit(); +} + +void Menu_Edit_Deselect(GtkWidget *widget, gpointer data) +{ + ColorMapper->select_a = 0; + ColorMapper->select_b = -8; + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); +} + +void Menu_Edit_Copy(GtkWidget *widget, gpointer data) +{ + int selectStart = min(ColorMapper->select_a, ColorMapper->select_b); + int selectEnd = max(ColorMapper->select_a, ColorMapper->select_b); + + if (selectStart < 0) { + MessageDialog(MainWindow, "Select copy area with the middle-button", "Copy", GTK_MESSAGE_WARNING, NULL); + return; + } + if ((selectEnd - selectStart) <= 0) { + MessageDialog(MainWindow, "Select area is empty", "Copy", GTK_MESSAGE_WARNING, NULL); + return; + } + + // Realloc mask data and copy it + int datasize = GetColorData(NULL, selectStart, selectEnd - selectStart); + if (MaskData) { + free(MaskData); + MaskData = NULL; + MaskSize = 0; + } + MaskData = (uint8_t *)malloc(datasize); + MaskSize = selectEnd - selectStart; + GetColorData(MaskData, selectStart, MaskSize); +} + +void Menu_Edit_Paste(GtkWidget *widget, gpointer data) +{ + int selectStart = min(ColorMapper->select_a, ColorMapper->select_b); + + if (selectStart < 0) { + MessageDialog(MainWindow, "Select the paste start position with the middle-button", "Paste",GTK_MESSAGE_WARNING, NULL); + return; + } + if (!MaskSize) { + MessageDialog(MainWindow, "Nothing in memory to paste", "Paste", GTK_MESSAGE_WARNING, NULL); + return; + } + + // Realloc mask data and copy it + SetColorData(MaskData, selectStart, MaskSize); + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + SetChangesMade(1); +} + +void Menu_Edit_Fill(GtkWidget *widget, gpointer data) +{ + int selectStart = min(ColorMapper->select_a, ColorMapper->select_b); + int selectEnd = max(ColorMapper->select_a, ColorMapper->select_b); + + if (selectStart < 0) { + MessageDialog(MainWindow, "Select fill area with the middle-button", "Fill", GTK_MESSAGE_WARNING, NULL); + return; + } + if ((selectEnd - selectStart) <= 0) { + MessageDialog(MainWindow, "Fill area is empty", "Clear", GTK_MESSAGE_WARNING, NULL); + return; + } + + // Fill area + FillColorData(selectStart, selectEnd - selectStart, + PickedColor->color_off_enabled ? PickedColor->color_off : -1, + PickedColor->color_on_enabled ? PickedColor->color_on : -1); + gtk_widget_queue_draw(GTK_WIDGET(ColorMapper)); + SetChangesMade(1); +} + +void Menu_Edit_Swap(GtkWidget *widget, gpointer data) +{ + gtkx_palettepicker_swapcolors(PalettePicker); +} + +void Menu_About_Documentation(GtkWidget *widget, gpointer data) +{ + HelpLaunchDoc("TOOLS_colormapper"); +} + +void Menu_About_VisitWebsite(GtkWidget *widget, gpointer data) +{ + HelpLaunchURL("http://code.google.com/p/pokemini/"); +} + +void Menu_About_About(GtkWidget *widget, gpointer data) +{ + MessageDialog(MainWindow, AboutTxt, "About...", GTK_MESSAGE_INFO, PokeMiniIcon_96x128); +} + +gboolean Widgets_leave(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, ""); + return FALSE; +} + +void PalettePicker_on_color(GtkWidget *widg, int type, int index) +{ + gtkx_pickedcolor_setcolorindex(PickedColor, type, index); +} + +void VScroll1_Adj_changed(GtkAdjustment *adj, gpointer data) +{ + int value = (int)(adj->value); + CurrAddr = value; + gtkx_colormapper_settileoff(ColorMapper, value); +} + +void CheckBox_SpriteMode_toggled(GtkWidget *widget, gpointer user_data) +{ + SpriteMode = (gtk_toggle_button_get_active(CheckBox_SpriteMode) == TRUE); + gtkx_colormapper_setspritemode(ColorMapper, SpriteMode); + // Update other components + gtk_adjustment_set_step_increment(VScroll1_Adj, SpriteMode ? 8.0 : 1.0); + gtk_adjustment_set_page_increment(VScroll1_Adj, SpriteMode ? 128.0 : 16.0); + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Sprite Mode"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), SpriteMode); +} + +gboolean CheckBox_SpriteMode_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Display the mapper as sprites, allowing to draw sprites more easily."); + return FALSE; +} + +void Menu_Edit_SpriteMode(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Sprite Mode"); + SpriteMode = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + gtkx_colormapper_setspritemode(ColorMapper, SpriteMode); + // Update other components + gtk_adjustment_set_step_increment(VScroll1_Adj, SpriteMode ? 8.0 : 1.0); + gtk_adjustment_set_page_increment(VScroll1_Adj, SpriteMode ? 128.0 : 16.0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CheckBox_SpriteMode), SpriteMode); +} + +void CheckBox_Grid_toggled(GtkWidget *widget, gpointer user_data) +{ + Grid = (gtk_toggle_button_get_active(CheckBox_Grid) == TRUE); + gtkx_colormapper_setgrid(ColorMapper, Grid); + // Update other components + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Show Grid"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), Grid); +} + +gboolean CheckBox_Grid_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Display grid."); + return FALSE; +} + +void Menu_Edit_ShowGrid(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Show Grid"); + Grid = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + gtkx_colormapper_setgrid(ColorMapper, Grid); + // Update other components + gtk_toggle_button_set_active(CheckBox_Grid, Grid); +} + +void CheckBox_Negative_toggled(GtkWidget *widget, gpointer user_data) +{ + DispNegative = (gtk_toggle_button_get_active(CheckBox_Negative) == TRUE); + gtkx_colormapper_setnegative(ColorMapper, DispNegative); + // Update other components + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Display Negative"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), DispNegative); +} + +gboolean CheckBox_Negative_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Display negated color attributes."); + return FALSE; +} + +void Menu_Edit_DispNegative(GtkWidget *widget, gpointer data) +{ + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Display Negative"); + DispNegative = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); + gtkx_colormapper_setnegative(ColorMapper, DispNegative); + // Update other components + gtk_toggle_button_set_active(CheckBox_Negative, DispNegative); +} + +void CheckBox_DisplayBlend_toggled(GtkWidget *widget, gpointer user_data) +{ + DispBlend = (gtk_toggle_button_get_active(CheckBox_DisplayBlend) == TRUE); + gtkx_colormapper_setdispblend(ColorMapper, DispBlend); + // Update other components + GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/Mark/Display Blend"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), DispBlend); +} + +gboolean CheckBox_DisplayBlend_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Display blending, you must set blend mark (Ctrl + 0) on 2nd tile data"); + return FALSE; +} + +void Menu_Mark_DispBlend(GtkWidget *widget, gpointer data) +{ + GtkCheckMenuItem *widg = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Mark/Display Blend")); + DispBlend = (gtk_check_menu_item_get_active(widg) == TRUE); + gtkx_colormapper_setdispblend(ColorMapper, DispBlend); + // Update other components + gtk_toggle_button_set_active(CheckBox_DisplayBlend, DispBlend); +} + +gboolean Button_SwapBlend_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Swap current location with blend mark"); + return FALSE; +} + +void Menu_Mark_SwapBlend(GtkWidget *widget, gpointer data) +{ + int tmp; + tmp = MarkAddr[0]; + MarkAddr[0] = CurrAddr; + CurrAddr = tmp; + gtk_adjustment_set_value(VScroll1_Adj, (double)CurrAddr); + gtkx_colormapper_settileoff(ColorMapper, CurrAddr); + gtkx_colormapper_settileblendoff(ColorMapper, MarkAddr[0]); +} + +void ComboZoom_changed(GtkWidget *widget, gpointer user_data) +{ + GtkWidget *widg; + int tmpzoom; + char tmp[256]; + tmpzoom = gtk_combo_box_get_active(ComboZoom) + 1; + if (tmpzoom != Zoom) { + Zoom = tmpzoom; + gtkx_colormapper_setzoom(ColorMapper, Zoom); + // Update other components + sprintf(tmp, "/Edit/Zoom/%i00%%", Zoom); + widg = gtk_item_factory_get_item(ItemFactory, tmp); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), TRUE); + } +} + +gboolean ComboZoom_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Change the zoom scale."); + return FALSE; +} + +void Menu_Edit_Zoom(GtkWidget *widget, gpointer data) +{ + if ((int)data != Zoom) { + Zoom = (int)data; + gtkx_colormapper_setzoom(ColorMapper, Zoom); + // Update other components + gtk_combo_box_set_active(ComboZoom, Zoom - 1); + } +} + +void Menu_Mark_GetMark(GtkWidget *widget, gpointer data) +{ + int index = (int)data; + CurrAddr = MarkAddr[index]; + gtk_adjustment_set_value(VScroll1_Adj, (double)CurrAddr); + gtkx_colormapper_settileoff(ColorMapper, CurrAddr); +} + +void Menu_Mark_SetMark(GtkWidget *widget, gpointer data) +{ + int index = (int)data; + MarkAddr[index] = CurrAddr; + if (index == 0) gtkx_colormapper_settileblendoff(ColorMapper, MarkAddr[0]); +} + +void Menu_Mark_JumpTopSelect(GtkWidget *widget, gpointer data) +{ + int selectStart = min(ColorMapper->select_a, ColorMapper->select_b); + if (selectStart < 0) { + MessageDialog(MainWindow, "Select cell to jump with the middle-button", "Top as selection", GTK_MESSAGE_WARNING, NULL); + return; + } + CurrAddr = selectStart; + gtk_adjustment_set_value(VScroll1_Adj, (double)CurrAddr); + gtkx_colormapper_settileoff(ColorMapper, CurrAddr); +} + +void Menu_Mark_JumpToTile(GtkWidget *widget, gpointer data) +{ + int number; + if (EnterNumberDialog(MainWindow, "Jump to tile...", "Jump to tile index:", &number, (int)CurrAddr, 6, 1, 0, PRCColorUTiles-1)) { + CurrAddr = number; + gtk_adjustment_set_value(VScroll1_Adj, (double)CurrAddr); + gtkx_colormapper_settileoff(ColorMapper, CurrAddr); + } +} + +void Menu_Mark_JumpToAddress(GtkWidget *widget, gpointer data) +{ + int number; + if (EnterNumberDialog(MainWindow, "Jump to address...", "Jump to address:", &number, (int)(CurrAddr * 8), 6, 1, 0, PM_ROM_FSize-1)) { + CurrAddr = (number >> 3); + gtk_adjustment_set_value(VScroll1_Adj, (double)CurrAddr); + gtkx_colormapper_settileoff(ColorMapper, CurrAddr); + } +} + +static const char *TransparencyColorMenu[16] = { + "/Edit/Transparency/Pink", + "/Edit/Transparency/Red", + "/Edit/Transparency/Green", + "/Edit/Transparency/Blue", + "/Edit/Transparency/Yellow", + "/Edit/Transparency/Orange", + "/Edit/Transparency/Purple", + "/Edit/Transparency/Bright Red", + "/Edit/Transparency/Bright Green", + "/Edit/Transparency/Bright Blue", + "/Edit/Transparency/Bright Yellow", + "/Edit/Transparency/Cyan", + "/Edit/Transparency/Black", + "/Edit/Transparency/Grey", + "/Edit/Transparency/Silver", + "/Edit/Transparency/White" +}; +static const uint32_t TransparencyColor[16] = { + 0xFF00FF, // Pink + 0xC00000, // Red + 0x00C000, // Green + 0x0000C0, // Blue + 0xC0C000, // Yellow + 0xFF8000, // Orange + 0x800080, // Purple + 0xFF0000, // Bright Red + 0x00FF00, // Bright Green + 0x0000FF, // Bright Blue + 0xFFFF00, // Bright Yellow + 0x00FFFF, // Cyan + 0x000000, // Black + 0x808080, // Grey + 0xC0C0C0, // Silver + 0xFFFFFF // White +}; + +void Menu_Transparency(GtkWidget *widget, gpointer data) +{ + int number, index = (int)data; + static int lasttransindex = -2; + + if (lasttransindex == index) return; + lasttransindex = index; + if (WidInConfigs) return; + + if (index >= 0) { + TransparencySelColor = TransparencyColor[index]; + gtkx_colormapper_settransparency(ColorMapper, TransparencySelColor); + } else { + if (EnterNumberDialog(MainWindow, "Custom tranparent color", "Transparency value:", &number, TransparencySelColor, 6, 1, 0x000000, 0xFFFFFF)) { + TransparencySelColor = number; + gtkx_colormapper_settransparency(ColorMapper, TransparencySelColor); + } + } +} + +void ColorMapper_on_motion(GtkWidget *widget, int valid, uint32_t tileaddr, uint32_t subtileidx) +{ + char txt[256]; + if (valid) { + if (PRCColorFormat == 1) { + sprintf(txt, "Tile=($%04X, %i), Quad=%i -:- Addr=($%06X, %i)", tileaddr, tileaddr, subtileidx, tileaddr * 8, tileaddr * 8); + } else { + sprintf(txt, "Tile=($%04X, %i) -:- Addr=($%06X, %i)", tileaddr, tileaddr, tileaddr * 8, tileaddr * 8); + } + } else strcpy(txt, "-:-"); + gtk_label_set_text(LabelInfo, txt); +} + +int ColorMapper_on_lbutton(GtkWidget *widget, uint32_t tileidx, uint32_t subtileidx, int keystatus) +{ + uint32_t mapoff = tileidx * PRCColorBytesPerTile; + uint8_t *ColorMap = (uint8_t *)PRCColorUMap + mapoff; + + if (keystatus == 2) return 0; // Ignore release + + GTKX_COLORMAPPER(ColorMapper)->select_b = -16; + if ((ColorMap[subtileidx<<1] != PickedColor->color_off) || (ColorMap[(subtileidx<<1)+1] != PickedColor->color_on)) { + if (PickedColor->color_off_enabled) ColorMap[subtileidx<<1] = PickedColor->color_off; + if (PickedColor->color_on_enabled)ColorMap[(subtileidx<<1)+1] = PickedColor->color_on; + SetChangesMade(1); + return 1; + } + + return 0; +} + +int ColorMapper_on_mbutton(GtkWidget *widget, uint32_t tileidx, uint32_t subtileidx, int keystatus) +{ + if (keystatus == 1) { + // Press + ColorMapper->select_a = tileidx; + ColorMapper->select_b = -8; + } if (keystatus == 0) { + // Moving + if (ColorMapper->select_b < ColorMapper->select_a) { + ColorMapper->select_b = tileidx; + } else { + ColorMapper->select_b = tileidx+1; + } + } + return 1; +} + +int ColorMapper_on_rbutton(GtkWidget *widget, uint32_t tileidx, uint32_t subtileidx, int keystatus) +{ + uint32_t mapoff = tileidx * PRCColorBytesPerTile; + uint8_t *ColorMap = (uint8_t *)PRCColorUMap + mapoff; + + if (keystatus == 2) return 0; // Ignore release + + if (PickedColor->color_off_enabled) gtkx_palettepicker_setcolorindex(PalettePicker, 0, ColorMap[subtileidx<<1]); + if (PickedColor->color_on_enabled) gtkx_palettepicker_setcolorindex(PalettePicker, 1, ColorMap[(subtileidx<<1)+1]); + + return 0; +} + +gboolean ColorMapper_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Left-Button = Paint Middle-Button = Selection Right-Button = Absorv"); + return FALSE; +} + +gboolean PickedColor_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Colors: Left-Button = Enable/Disable -///- Mini Pal. Left-Button = Get palette Right-Button = Set palette"); + return FALSE; +} + +gboolean PalettePicker_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Left-Button = Set Dark Color Right-Button = Set Light Color"); + return FALSE; +} + +gboolean Contrast_enter(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + gtk_label_set_text(StatusLabel, "Change contrast preview"); + return FALSE; +} + +static gchar *Constrast_formatvalue(GtkScale *scale, gdouble value, gpointer user_data) +{ + int constrast = (int)value; + return g_strdup_printf("Contrast: %i", constrast); +} + +void Contrast_Adj_changed(GtkAdjustment *adj, gpointer user_data) +{ + int value = (int)(adj->value); + ContrastLevel = value; + gtkx_colormapper_setcontrast(ColorMapper, value); +} + +GtkItemFactoryEntry Menu_items[] = { + { "/_File", NULL, NULL, 0, "" }, + { "/File/_Open Min...", "O", Menu_File_OpenMIN, 0, "" }, + { "/File/sep1", NULL, NULL, 0, "" }, + { "/File/_Reset Color File", "R", Menu_File_ResetColor, 0, "" }, + { "/File/_Load Color File", "L", Menu_File_LoadColor, 0, "" }, + { "/File/_Save Color File", "S", Menu_File_SaveColor, 0, "" }, + { "/File/_Save Color File as...", "S", Menu_File_SaveColorAs, 0, "" }, + { "/File/sep2", NULL, NULL, 0, "" }, + { "/File/_Export image... (Color)", "E", Menu_File_Export, 0, "" }, + { "/File/_Export image... (Mono)", "E", Menu_File_Export, 1, "" }, + { "/File/sep3", NULL, NULL, 0, "" }, + { "/File/_Information...", "I", Menu_File_Information, 0, "" }, + { "/File/Change _format...", "F", Menu_File_ChangeFormat, 0, "" }, + { "/File/sep4", NULL, NULL, 0, "" }, + { "/File/_Quit", "Q", Menu_File_Quit, 0, "" }, + + { "/_Edit", NULL, NULL, 0, "" }, + { "/Edit/_Deselect", "D", Menu_Edit_Deselect, 0, "" }, + { "/Edit/_Copy", "C", Menu_Edit_Copy, 0, "" }, + { "/Edit/Paste", "V", Menu_Edit_Paste, 0, "" }, + { "/Edit/_Fill", "F", Menu_Edit_Fill, 0, "" }, + { "/Edit/sep1", NULL, NULL, 0, "" }, + { "/Edit/S_wap Dark & Light", "W", Menu_Edit_Swap, 0, "" }, + { "/Edit/sep2", NULL, NULL, 0, "" }, + { "/Edit/Sprite _Mode", "M", Menu_Edit_SpriteMode, 0, "" }, + { "/Edit/Show _Grid", "G", Menu_Edit_ShowGrid, 0, "" }, + { "/Edit/Display _Negative", "N", Menu_Edit_DispNegative, 0, "" }, + { "/Edit/sep3", NULL, NULL, 0, "" }, + { "/Edit/Transparency", NULL, NULL, 0, "" }, + { "/Edit/Transparency/Pink", NULL, Menu_Transparency, 0, "" }, + { "/Edit/Transparency/Red", NULL, Menu_Transparency, 1, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Green", NULL, Menu_Transparency, 2, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Blue", NULL, Menu_Transparency, 3, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Yellow", NULL, Menu_Transparency, 4, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Orange", NULL, Menu_Transparency, 5, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Purple", NULL, Menu_Transparency, 6, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Bright Red", NULL, Menu_Transparency, 7, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Bright Green", NULL, Menu_Transparency, 8, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Bright Blue", NULL, Menu_Transparency, 9, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Bright Yellow", NULL, Menu_Transparency, 10, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Cyan", NULL, Menu_Transparency, 11, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Black", NULL, Menu_Transparency, 12, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Grey", NULL, Menu_Transparency, 13, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Silver", NULL, Menu_Transparency, 14, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/White", NULL, Menu_Transparency, 15, "/Edit/Transparency/Pink" }, + { "/Edit/Transparency/Custom", NULL, Menu_Transparency, -1, "/Edit/Transparency/Pink" }, + { "/Edit/Zoom", NULL, NULL, 0, "" }, + { "/Edit/Zoom/100%", NULL, Menu_Edit_Zoom, 1, "" }, + { "/Edit/Zoom/200%", NULL, Menu_Edit_Zoom, 2, "/Edit/Zoom/100%" }, + { "/Edit/Zoom/300%", NULL, Menu_Edit_Zoom, 3, "/Edit/Zoom/100%" }, + { "/Edit/Zoom/400%", NULL, Menu_Edit_Zoom, 4, "/Edit/Zoom/100%" }, + { "/Edit/Zoom/500%", NULL, Menu_Edit_Zoom, 5, "/Edit/Zoom/100%" }, + { "/Edit/Zoom/600%", NULL, Menu_Edit_Zoom, 6, "/Edit/Zoom/100%" }, + { "/Edit/Zoom/700%", NULL, Menu_Edit_Zoom, 7, "/Edit/Zoom/100%" }, + { "/Edit/Zoom/800%", NULL, Menu_Edit_Zoom, 8, "/Edit/Zoom/100%" }, + + { "/_Mark", NULL, NULL, 0, "" }, + { "/Mark/Display _Blend", "B", Menu_Mark_DispBlend, 0, "" }, + { "/Mark/Swap with _Blend", "B", Menu_Mark_SwapBlend, 0, "" }, + { "/Mark/sep1", NULL, NULL, 0, "" }, + { "/Mark/_Top as selection", "T", Menu_Mark_JumpTopSelect, 0, "" }, + { "/Mark/_Jump to tile...", "J", Menu_Mark_JumpToTile, 0, "" }, + { "/Mark/_Jump to address...", "J", Menu_Mark_JumpToAddress, 0, "" }, + { "/Mark/sep2", NULL, NULL, 0, "" }, + { "/Mark/Get Mark", NULL, NULL, 0, "" }, + { "/Mark/Get Mark/Blend", "0", Menu_Mark_GetMark, 0, "" }, + { "/Mark/Get Mark/Custom _1", "1", Menu_Mark_GetMark, 1, "" }, + { "/Mark/Get Mark/Custom _2", "2", Menu_Mark_GetMark, 2, "" }, + { "/Mark/Get Mark/Custom _3", "3", Menu_Mark_GetMark, 3, "" }, + { "/Mark/Get Mark/Custom _4", "4", Menu_Mark_GetMark, 4, "" }, + { "/Mark/Get Mark/Custom _5", "5", Menu_Mark_GetMark, 5, "" }, + { "/Mark/Get Mark/Custom _6", "6", Menu_Mark_GetMark, 6, "" }, + { "/Mark/Get Mark/Custom _7", "7", Menu_Mark_GetMark, 7, "" }, + { "/Mark/Get Mark/Custom _8", "8", Menu_Mark_GetMark, 8, "" }, + { "/Mark/Get Mark/Custom _9", "9", Menu_Mark_GetMark, 9, "" }, + { "/Mark/Set Mark", NULL, NULL, 0, "" }, + { "/Mark/Set Mark/Blend", "0", Menu_Mark_SetMark, 0, "" }, + { "/Mark/Set Mark/Custom _1", "1", Menu_Mark_SetMark, 1, "" }, + { "/Mark/Set Mark/Custom _2", "2", Menu_Mark_SetMark, 2, "" }, + { "/Mark/Set Mark/Custom _3", "3", Menu_Mark_SetMark, 3, "" }, + { "/Mark/Set Mark/Custom _4", "4", Menu_Mark_SetMark, 4, "" }, + { "/Mark/Set Mark/Custom _5", "5", Menu_Mark_SetMark, 5, "" }, + { "/Mark/Set Mark/Custom _6", "6", Menu_Mark_SetMark, 6, "" }, + { "/Mark/Set Mark/Custom _7", "7", Menu_Mark_SetMark, 7, "" }, + { "/Mark/Set Mark/Custom _8", "8", Menu_Mark_SetMark, 8, "" }, + { "/Mark/Set Mark/Custom _9", "9", Menu_Mark_SetMark, 9, "" }, + + { "/_Help", NULL, NULL, 0, "" }, + { "/Help/_Documentation", "F1", Menu_About_Documentation, 0, "" }, + { "/Help/_Visit website", NULL, Menu_About_VisitWebsite, 0, "" }, + { "/Help/sep1", NULL, NULL, 0, "" }, + { "/Help/_About...", NULL, Menu_About_About, 0, "" }, +}; +gint Menu_items_num = sizeof (Menu_items) / sizeof(*Menu_items); + +int main(int argc, char **argv) +{ + GtkWidget *widg; + char tmp[256]; + int i; + + gtk_init (&argc, &argv); + PokeMini_InitDirs(argv[0], NULL); + PokeMini_GetCurrentDir(); + PokeMini_GotoExecDir(); + CustomConfFile("colormapper.cfg", CustomConf, NULL); + PokeMini_GotoCurrentDir(); + + // Create our main window + MainWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); + gtk_window_set_title(GTK_WINDOW(MainWindow), APPTITLE); + gtk_widget_set_size_request(GTK_WIDGET(MainWindow), 224, 240); + gtk_window_set_default_size(MainWindow, 500, 450); + g_signal_connect(MainWindow, "delete-event", G_CALLBACK(MainWindow_delete_event), NULL); + g_signal_connect(MainWindow, "destroy", G_CALLBACK(MainWindow_destroy), NULL); + + // Create a vertical box for all components + VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); + gtk_container_add(GTK_CONTAINER(MainWindow), GTK_WIDGET(VBox1)); + gtk_widget_show(GTK_WIDGET(VBox1)); + + // Create the menu bar at the top + AccelGroup = gtk_accel_group_new(); + ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); + gtk_item_factory_create_items(ItemFactory, Menu_items_num, Menu_items, NULL); + gtk_window_add_accel_group(MainWindow, AccelGroup); + MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); + gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(MenuBar)); + + // Create a label above the color mapper + LabelInfo = GTK_LABEL(gtk_label_new("-:-")); + gtk_box_pack_start(VBox1, GTK_WIDGET(LabelInfo), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(LabelInfo)); + + // Create horizontal box in the middle + HBox1 = GTK_BOX(gtk_hbox_new(FALSE, 0)); + gtk_box_pack_start(VBox1, GTK_WIDGET(HBox1), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(HBox1)); + + // Create mapper and scroll bar + ColorMapper = GTKX_COLORMAPPER(gtkx_colormapper_new()); + ColorMapper->on_motion = ColorMapper_on_motion; + ColorMapper->on_lbutton = ColorMapper_on_lbutton; + ColorMapper->on_mbutton = ColorMapper_on_mbutton; + ColorMapper->on_rbutton = ColorMapper_on_rbutton; + g_signal_connect(ColorMapper, "enter-notify-event", G_CALLBACK(ColorMapper_enter), NULL); + g_signal_connect(ColorMapper, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_box_pack_start(HBox1, GTK_WIDGET(ColorMapper), TRUE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(ColorMapper)); + VScroll1_Adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 1.0, 16.0, 0.0)); + g_signal_connect(VScroll1_Adj, "value_changed", G_CALLBACK (VScroll1_Adj_changed), NULL); + VScroll1 = GTK_SCROLLBAR(gtk_vscrollbar_new(VScroll1_Adj)); + gtk_box_pack_start(HBox1, GTK_WIDGET(VScroll1), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(VScroll1)); + + // Create separator + HSep1 = GTK_SEPARATOR(gtk_hseparator_new()); + gtk_box_pack_start(VBox1, GTK_WIDGET(HSep1), FALSE, TRUE, 0); + gtk_widget_show(GTK_WIDGET(HSep1)); + + // Create horizontal box in the bottom + HBox2 = GTK_BOX(gtk_hbox_new(FALSE, 0)); + gtk_box_pack_start(VBox1, GTK_WIDGET(HBox2), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(HBox2)); + + // Create current selected color + PickedColor = GTKX_PICKEDCOLOR(gtkx_pickedcolor_new()); + g_signal_connect(PickedColor, "enter-notify-event", G_CALLBACK(PickedColor_enter), NULL); + g_signal_connect(PickedColor, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_box_pack_start(HBox2, GTK_WIDGET(PickedColor), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(PickedColor)); + VSep2[0] = GTK_SEPARATOR(gtk_vseparator_new()); + gtk_box_pack_start(HBox2, GTK_WIDGET(VSep2[0]), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(VSep2[0])); + + // Create palette picker + PalettePicker = GTKX_PALETTEPICKER(gtkx_palettepicker_new()); + PalettePicker->on_color = PalettePicker_on_color; + g_signal_connect(PalettePicker, "enter-notify-event", G_CALLBACK(PalettePicker_enter), NULL); + g_signal_connect(PalettePicker, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_box_pack_start(HBox2, GTK_WIDGET(PalettePicker), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(PalettePicker)); + VSep2[1] = GTK_SEPARATOR(gtk_vseparator_new()); + gtk_box_pack_start(HBox2, GTK_WIDGET(VSep2[1]), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(VSep2[1])); + + // Create quick access buttons/checkboxes + VButtonBox1 = GTK_BUTTON_BOX(gtk_vbutton_box_new()); + gtk_button_box_set_layout(GTK_BUTTON_BOX(VButtonBox1), GTK_BUTTONBOX_START); + gtk_box_set_spacing(GTK_BOX(VButtonBox1), 0); + gtk_box_pack_start(HBox2, GTK_WIDGET(VButtonBox1), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(VButtonBox1)); + CheckBox_SpriteMode = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label("Sprite Mode")); + g_signal_connect(CheckBox_SpriteMode, "toggled", G_CALLBACK(CheckBox_SpriteMode_toggled), NULL); + g_signal_connect(CheckBox_SpriteMode, "enter-notify-event", G_CALLBACK(CheckBox_SpriteMode_enter), NULL); + g_signal_connect(CheckBox_SpriteMode, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(CheckBox_SpriteMode), TRUE); + gtk_container_add(GTK_CONTAINER(VButtonBox1), GTK_WIDGET(CheckBox_SpriteMode)); + gtk_widget_show(GTK_WIDGET(CheckBox_SpriteMode)); + CheckBox_Grid = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label("Show Grid")); + g_signal_connect(CheckBox_Grid, "toggled", G_CALLBACK(CheckBox_Grid_toggled), NULL); + g_signal_connect(CheckBox_Grid, "enter-notify-event", G_CALLBACK(CheckBox_Grid_enter), NULL); + g_signal_connect(CheckBox_Grid, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(CheckBox_Grid), TRUE); + gtk_container_add(GTK_CONTAINER(VButtonBox1), GTK_WIDGET(CheckBox_Grid)); + gtk_widget_show(GTK_WIDGET(CheckBox_Grid)); + CheckBox_Negative = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label("Display Negative")); + g_signal_connect(CheckBox_Negative, "toggled", G_CALLBACK(CheckBox_Negative_toggled), NULL); + g_signal_connect(CheckBox_Negative, "enter-notify-event", G_CALLBACK(CheckBox_Negative_enter), NULL); + g_signal_connect(CheckBox_Negative, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(CheckBox_Negative), TRUE); + gtk_container_add(GTK_CONTAINER(VButtonBox1), GTK_WIDGET(CheckBox_Negative)); + gtk_widget_show(GTK_WIDGET(CheckBox_Negative)); + CheckBox_DisplayBlend = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_label("Display Blend")); + g_signal_connect(CheckBox_DisplayBlend, "toggled", G_CALLBACK(CheckBox_DisplayBlend_toggled), NULL); + g_signal_connect(CheckBox_DisplayBlend, "enter-notify-event", G_CALLBACK(CheckBox_DisplayBlend_enter), NULL); + g_signal_connect(CheckBox_DisplayBlend, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(CheckBox_DisplayBlend), TRUE); + gtk_container_add(GTK_CONTAINER(VButtonBox1), GTK_WIDGET(CheckBox_DisplayBlend)); + gtk_widget_show(GTK_WIDGET(CheckBox_DisplayBlend)); + Button_SwapBlend = GTK_BUTTON(gtk_button_new_with_label("Swap with Blend")); + g_signal_connect(Button_SwapBlend, "clicked", G_CALLBACK(Menu_Mark_SwapBlend), NULL); + g_signal_connect(Button_SwapBlend, "enter-notify-event", G_CALLBACK(Button_SwapBlend_enter), NULL); + g_signal_connect(Button_SwapBlend, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_container_add(GTK_CONTAINER(VButtonBox1), GTK_WIDGET(Button_SwapBlend)); + gtk_widget_show(GTK_WIDGET(Button_SwapBlend)); + VSep2[2] = GTK_SEPARATOR(gtk_vseparator_new()); + gtk_box_pack_start(HBox2, GTK_WIDGET(VSep2[2]), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(VSep2[2])); + + // Create quick access buttons/checkboxes + VButtonBox2 = GTK_BUTTON_BOX(gtk_vbutton_box_new()); + gtk_button_box_set_layout(GTK_BUTTON_BOX(VButtonBox2), GTK_BUTTONBOX_START); + gtk_box_set_spacing(GTK_BOX(VButtonBox2), 4); + gtk_box_pack_start(HBox2, GTK_WIDGET(VButtonBox2), FALSE, TRUE, 4); + gtk_widget_show(GTK_WIDGET(VButtonBox2)); + Contrast_Adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, -15.0, 15.0, 1.0, 1.0, 0.0)); + g_signal_connect(Contrast_Adj, "value_changed", G_CALLBACK(Contrast_Adj_changed), NULL); + Contrast = GTK_SCALE(gtk_hscale_new(Contrast_Adj)); + g_signal_connect(Contrast, "format-value", G_CALLBACK(Constrast_formatvalue), NULL); + g_signal_connect(Contrast, "enter-notify-event", G_CALLBACK(Contrast_enter), NULL); + g_signal_connect(Contrast, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_container_add(GTK_CONTAINER(VButtonBox2), GTK_WIDGET(Contrast)); + gtk_widget_show(GTK_WIDGET(Contrast)); + ComboZoom = GTK_COMBO_BOX(gtk_combo_box_new_text()); + g_signal_connect(ComboZoom, "changed", G_CALLBACK(ComboZoom_changed), NULL); + g_signal_connect(ComboZoom, "enter-notify-event", G_CALLBACK(ComboZoom_enter), NULL); + g_signal_connect(ComboZoom, "leave-notify-event", G_CALLBACK(Widgets_leave), NULL); + gtk_combo_box_append_text(ComboZoom, "Zoom 100%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 200%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 300%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 400%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 500%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 600%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 700%"); + gtk_combo_box_append_text(ComboZoom, "Zoom 800%"); + gtk_combo_box_set_active(ComboZoom, Zoom - 1); + gtk_container_add(GTK_CONTAINER(VButtonBox2), GTK_WIDGET(ComboZoom)); + gtk_widget_show(GTK_WIDGET(ComboZoom)); + + // Create a status bar at the bottom + StatusFrame = GTK_FRAME(gtk_frame_new(NULL)); + gtk_box_pack_start(VBox1, GTK_WIDGET(StatusFrame), FALSE, FALSE, 0); + gtk_widget_show(GTK_WIDGET(StatusFrame)); + StatusLabel = GTK_LABEL(gtk_label_new("")); + gtk_label_set_justify(StatusLabel, GTK_JUSTIFY_LEFT); + gtk_label_set_ellipsize(StatusLabel, PANGO_ELLIPSIZE_END); + gtk_container_add(GTK_CONTAINER(StatusFrame), GTK_WIDGET(StatusLabel)); + gtk_widget_show(GTK_WIDGET(StatusLabel)); + + // Initialize some items in the menu bar + WidInConfigs = 1; + + widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Sprite Mode"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), SpriteMode); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CheckBox_SpriteMode), SpriteMode); + gtkx_colormapper_setspritemode(ColorMapper, SpriteMode); + gtk_adjustment_set_step_increment(VScroll1_Adj, SpriteMode ? 8.0 : 1.0); + gtk_adjustment_set_page_increment(VScroll1_Adj, SpriteMode ? 128.0 : 16.0); + + widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Show Grid"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), Grid); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CheckBox_Grid), Grid); + gtkx_colormapper_setgrid(ColorMapper, Grid); + + widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Display Negative"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), DispNegative); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CheckBox_Negative), DispNegative); + gtkx_colormapper_setnegative(ColorMapper, DispNegative); + + widg = gtk_item_factory_get_item(ItemFactory, "/Mark/Display Blend"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), DispBlend); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CheckBox_DisplayBlend), DispBlend); + gtkx_colormapper_setdispblend(ColorMapper, DispBlend); + + sprintf(tmp, "/Edit/Zoom/%i00%%", Zoom); + widg = gtk_item_factory_get_item(ItemFactory, tmp); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), TRUE); + + widg = gtk_item_factory_get_item(ItemFactory, "/Edit/Transparency/Custom"); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + for (i=0; i<16; i++) { + widg = gtk_item_factory_get_item(ItemFactory, TransparencyColorMenu[i]); + if (TransparencySelColor == TransparencyColor[i]) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); + } + + WidInConfigs = 0; + + // Show main window and update position & size + gtk_widget_realize(GTK_WIDGET(MainWindow)); + if ((WinX > -15) && (WinY > -16)) { + gtk_window_move(MainWindow, WinX, WinY); + } + if ((WinW > 0) && (WinH > 0)) { + gtk_window_resize(MainWindow, WinW, WinH); + } + gtk_widget_show(GTK_WIDGET(MainWindow)); + + // Load filename in command-line + if (argc > 1) { + LoadMINFromFile(argv[1]); + } + + // Main GTK+ loop + gtk_main(); + + // Free data + FreeColorInfo(); + + // Save settings + PokeMini_GetCurrentDir(); + PokeMini_GotoExecDir(); + CustomConfSave("colormapper.cfg", CustomConf, "Color Mapper Settings"); + PokeMini_GotoCurrentDir(); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.h b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.h new file mode 100644 index 0000000000..c2adcee5dd --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.h @@ -0,0 +1,29 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef COLOR_MAPPER_H +#define COLOR_MAPPER_H + +#include + +extern GtkWindow *MainWindow; + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.ico b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.ico new file mode 100644 index 0000000000..386d0510ac Binary files /dev/null and b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.ico differ diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.rc b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.rc new file mode 100644 index 0000000000..4903428900 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/color_mapper.rc @@ -0,0 +1,34 @@ +IDI_POKEKAMINI ICON "color_mapper.ico" + +#include +#include "PokeMini_version.h" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,3,0,0 +PRODUCTVERSION 1,3,0,0 +FILEFLAGSMASK 0x3FL +FILEFLAGS 0x0L +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "PokeMini Color Mapper\r\nhttp://code.google.com/p/pokemini/\r\nhttp://www.pokemon-mini.net/" + VALUE "CompanyName", "JustBurn, Team Pokeme" + VALUE "FileDescription", "PokeMini Color Mapper" + VALUE "FileVersion", "1.3" + VALUE "InternalName", "color_mapper" + VALUE "LegalCopyright", RES_COPYRIGHT + VALUE "OriginalFilename", "color_mapper.exe" + VALUE "ProductName", "PokeMini Color Mapper" + VALUE "ProductVersion", "1.3" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_colormapper.c b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_colormapper.c new file mode 100644 index 0000000000..a2aea291a9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_colormapper.c @@ -0,0 +1,361 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "gtkx_colormapper.h" + +#include "color_info.h" +#include "color_display.h" +#include "PokeMini_ColorPal.h" +#include "Video.h" + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +G_DEFINE_TYPE (GtkXcolormapper, gtkx_colormapper, GTK_TYPE_DRAWING_AREA) + +static void gtkx_colormapper_input8x8Attr(GtkXcolormapper *widg, int xp, int yp, int pitchp) +{ + int tileidx, tiledataaddr, tileidxD; + + int status = 0; + uint32_t press = widg->buttonbits & ~widg->buttonbits_old; + uint32_t release = ~widg->buttonbits & widg->buttonbits_old; + uint32_t hold = widg->buttonbits; + widg->buttonbits_old = widg->buttonbits; + + // Calculate + if (widg->spritemode) { + tileidx = (yp >> 4) * (pitchp >> 4) + (xp >> 4); + colordisplay_decodespriteidx(tileidx, xp, yp, &tileidxD, NULL); + tiledataaddr = (((widg->tileoff & ~7) << 3) + (tileidxD << 3)); + } else { + tileidx = (yp >> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = ((widg->tileoff << 3) + (tileidx << 3)); + } + + // Motion and paint + if (tiledataaddr < PM_ROM_FSize) { + + if ((press | release | hold) & 2) { // Left-Button down + if (widg->on_lbutton) { + if (press & 2) status = 1; + else if (release & 2) status = 2; + if (widg->on_lbutton(GTK_WIDGET(widg), tiledataaddr >> 3, 0, status)) gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } + if ((press | release | hold) & 4) { // Middle-Button down + if (widg->on_mbutton) { + if (press & 4) status = 1; + else if (release & 4) status = 2; + if (widg->on_mbutton(GTK_WIDGET(widg), tiledataaddr >> 3, 0, status)) gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } + if ((press | release | hold) & 8) { // Right-Button down + if (widg->on_rbutton) { + if (press & 8) status = 1; + else if (release & 8) status = 2; + if (widg->on_rbutton(GTK_WIDGET(widg), tiledataaddr >> 3, 0, status)) gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } + + // Inside ROM range + if (widg->on_motion) widg->on_motion(GTK_WIDGET(widg), 1, tiledataaddr >> 3, 0); + } else { + // Outside ROM range + if (widg->on_motion) widg->on_motion(GTK_WIDGET(widg), 0, tiledataaddr >> 3, 0); + } +} + +static void gtkx_colormapper_input4x4Attr(GtkXcolormapper *widg, int xp, int yp, int pitchp) +{ + int tileidx, tiledataaddr, tileidxD, subtile; + + int status = 0; + uint32_t press = widg->buttonbits & ~widg->buttonbits_old; + uint32_t release = ~widg->buttonbits & widg->buttonbits_old; + uint32_t hold = widg->buttonbits; + widg->buttonbits_old = widg->buttonbits; + + // Calculate + if (widg->spritemode) { + tileidx = (yp >> 4) * (pitchp >> 4) + (xp >> 4); + colordisplay_decodespriteidx(tileidx, xp, yp, &tileidxD, NULL); + tiledataaddr = (((widg->tileoff & ~7) << 3) + (tileidxD << 3)); + } else { + tileidx = (yp >> 3) * (pitchp >> 3) + (xp >> 3); + tiledataaddr = ((widg->tileoff << 3) + (tileidx << 3)); + } + subtile = ((yp & 4) >> 1) + ((xp & 4) >> 2); + + // Motion and paint + if (tiledataaddr < PM_ROM_FSize) { + + if ((press | release | hold) & 2) { // Left-Button down + if (widg->on_lbutton) { + if (press & 2) status = 1; + else if (release & 2) status = 2; + if (widg->on_lbutton(GTK_WIDGET(widg), tiledataaddr >> 3, subtile, status)) gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } + if ((press | release | hold) & 4) { // Middle-Button down + if (widg->on_mbutton) { + if (press & 4) status = 1; + else if (release & 4) status = 2; + if (widg->on_mbutton(GTK_WIDGET(widg), tiledataaddr >> 3, subtile, status)) gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } + if ((press | release | hold) & 8) { // Right-Button down + if (widg->on_rbutton) { + if (press & 8) status = 1; + else if (release & 8) status = 2; + if (widg->on_rbutton(GTK_WIDGET(widg), tiledataaddr >> 3, subtile, status)) gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } + + // Inside ROM range + if (widg->on_motion) widg->on_motion(GTK_WIDGET(widg), 1, tiledataaddr >> 3, subtile); + } else { + // Outside ROM range + if (widg->on_motion) widg->on_motion(GTK_WIDGET(widg), 0, tiledataaddr >> 3, subtile); + } +} + +static gboolean gtkx_colormapper_button_event(GtkWidget *widget, GdkEventButton *event) +{ + GtkXcolormapper *widg = GTKX_COLORMAPPER(widget); + + int xp = (int)(event->x) / widg->zoom; + int yp = (int)(event->y) / widg->zoom; + int pitchp = widg->imgcache_p / widg->zoom; + + if ((xp < 0) || (yp < 0)) return TRUE; + + if (event->type == GDK_BUTTON_PRESS) { + widg->buttonbits |= (1 << event->button); + } else if (event->type == GDK_BUTTON_RELEASE) { + widg->buttonbits &= ~(1 << event->button); + } + + if (PRCColorFormat == 1) { + gtkx_colormapper_input4x4Attr(widg, xp, yp, pitchp); + } else { + gtkx_colormapper_input8x8Attr(widg, xp, yp, pitchp); + } + + return TRUE; +} + +static gboolean gtkx_colormapper_motion_notify(GtkWidget *widget, GdkEventMotion *event) +{ + GtkXcolormapper *widg = GTKX_COLORMAPPER(widget); + + int xp = (int)(event->x) / widg->zoom; + int yp = (int)(event->y) / widg->zoom; + int pitchp = widg->imgcache_p / widg->zoom; + + if ((xp < 0) || (yp < 0)) return TRUE; + + if (PRCColorFormat == 1) { + gtkx_colormapper_input4x4Attr(widg, xp, yp, pitchp); + } else { + gtkx_colormapper_input8x8Attr(widg, xp, yp, pitchp); + } + + return TRUE; +} + +static void gtkx_colormapper_blend(GtkXcolormapper *widg, uint32_t *dst, uint32_t *src) +{ + uint32_t *srcptr, *dstptr; + int x, y, pitch = widg->imgcache_p; + + for (y=0; yimgcache_h; y++) { + srcptr = &src[y * pitch]; + dstptr = &dst[y * pitch]; + for (x=0; ximgcache_w; x++) { + dstptr[x] = InterpolateRGB24(srcptr[x], dstptr[x], 128); + } + } +} + +static gboolean gtkx_colormapper_expose(GtkWidget *widget, GdkEventExpose *event) +{ + GtkXcolormapper *widg = GTKX_COLORMAPPER(widget); + + cairo_t *cr; + uint32_t *ptr, *blendptr; + + // Recreate image cache on resize + if ((widget->allocation.width != widg->imgcache_w) || (widget->allocation.height != widg->imgcache_h)) { + cairo_surface_destroy(widg->imgcache); + cairo_surface_destroy(widg->imgblendcache); + widg->imgcache_w = widget->allocation.width; + widg->imgcache_h = widget->allocation.height; + widg->imgcache_p = (widget->allocation.width + 3) & ~3; + widg->imgcache = cairo_image_surface_create(CAIRO_FORMAT_RGB24, widg->imgcache_p, widg->imgcache_h); + widg->imgblendcache = cairo_image_surface_create(CAIRO_FORMAT_RGB24, widg->imgcache_p, widg->imgcache_h); + } + ptr = (uint32_t *)cairo_image_surface_get_data(widg->imgcache); + blendptr = (uint32_t *)cairo_image_surface_get_data(widg->imgblendcache); + + // Create cairo + cr = gdk_cairo_create(widget->window); + gdk_cairo_rectangle(cr, &event->area); + cairo_clip(cr); + cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 12); + + // Render + if (PRCColorFormat == 1) { + if (widg->dispblend) { + colordisplay_4x4Attr(ptr, widg->imgcache_w, widg->imgcache_h, widg->imgcache_p, + widg->spritemode, widg->zoom, widg->tileoff, widg->select_a, widg->select_b, + widg->negative, widg->transparency, widg->grid, 0, widg->contrast); + colordisplay_4x4Attr(blendptr, widg->imgcache_w, widg->imgcache_h, widg->imgcache_p, + widg->spritemode, widg->zoom, widg->tileblendoff, widg->select_a, widg->select_b, + widg->negative, widg->transparency, widg->grid, 0, widg->contrast); + gtkx_colormapper_blend(widg, ptr, blendptr); + } else { + colordisplay_4x4Attr(ptr, widg->imgcache_w, widg->imgcache_h, widg->imgcache_p, + widg->spritemode, widg->zoom, widg->tileoff, widg->select_a, widg->select_b, + widg->negative, widg->transparency, widg->grid, 0, widg->contrast); + } + } else { + if (widg->dispblend) { + colordisplay_8x8Attr(ptr, widg->imgcache_w, widg->imgcache_h, widg->imgcache_p, + widg->spritemode, widg->zoom, widg->tileoff, widg->select_a, widg->select_b, + widg->negative, widg->transparency, widg->grid, 0, widg->contrast); + colordisplay_8x8Attr(blendptr, widg->imgcache_w, widg->imgcache_h, widg->imgcache_p, + widg->spritemode, widg->zoom, widg->tileblendoff, widg->select_a, widg->select_b, + widg->negative, widg->transparency, widg->grid, 0, widg->contrast); + gtkx_colormapper_blend(widg, ptr, blendptr); + } else { + colordisplay_8x8Attr(ptr, widg->imgcache_w, widg->imgcache_h, widg->imgcache_p, + widg->spritemode, widg->zoom, widg->tileoff, widg->select_a, widg->select_b, + widg->negative, widg->transparency, widg->grid, 0, widg->contrast); + } + } + + // Paint result to the widget + cairo_set_source_surface(cr, widg->imgcache, 0, 0); + cairo_paint(cr); + + // Destroy cairo + cairo_destroy(cr); + + return TRUE; +} + +static void gtkx_colormapper_class_init(GtkXcolormapperClass *class) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); + + widget_class->expose_event = gtkx_colormapper_expose; + widget_class->motion_notify_event = gtkx_colormapper_motion_notify; + widget_class->button_press_event = gtkx_colormapper_button_event; + widget_class->button_release_event = gtkx_colormapper_button_event; +} + +static void gtkx_colormapper_init(GtkXcolormapper *widg) +{ + gtk_widget_set_double_buffered(GTK_WIDGET(widg), FALSE); + gtk_widget_add_events(GTK_WIDGET(widg), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); + gtk_widget_add_events(GTK_WIDGET(widg), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + + widg->imgcache = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 8, 8); + widg->imgcache_w = 8; + widg->imgcache_h = 8; + widg->imgcache_p = 8; + widg->tileoff = 0; + widg->tileblendoff = 0; + widg->zoom = 4; + widg->grid = 1; + widg->negative = 0; + widg->dispblend = 0; + widg->spritemode = 0; + widg->buttonbits = 0; + widg->buttonbits_old = 0; + widg->transparency = 0xFF00FF; + widg->select_a = 0; + widg->select_b = -8; +} + +GtkWidget *gtkx_colormapper_new(void) +{ + return g_object_new(GTKX_TYPE_COLORMAPPER, NULL); +} + +void gtkx_colormapper_settileoff(GtkXcolormapper *widg, uint32_t offset) +{ + widg->tileoff = offset; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_settileblendoff(GtkXcolormapper *widg, uint32_t offset) +{ + widg->tileblendoff = offset; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_setdispblend(GtkXcolormapper *widg, int enabled) +{ + widg->dispblend = enabled; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_setgrid(GtkXcolormapper *widg, int enabled) +{ + widg->grid = enabled; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_setzoom(GtkXcolormapper *widg, int zoomscale) +{ + if (zoomscale >= 1) { + widg->zoom = zoomscale; + gtk_widget_queue_draw(GTK_WIDGET(widg)); + } +} + +void gtkx_colormapper_setnegative(GtkXcolormapper *widg, int negative) +{ + widg->negative = negative & 1; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_setspritemode(GtkXcolormapper *widg, int spritemode) +{ + widg->spritemode = spritemode; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_settransparency(GtkXcolormapper *widg, uint32_t color) +{ + widg->transparency = color; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_colormapper_setcontrast(GtkXcolormapper *widg, int contrast) +{ + widg->contrast = contrast; + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_colormapper.h b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_colormapper.h new file mode 100644 index 0000000000..1c11166bf9 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_colormapper.h @@ -0,0 +1,82 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef GTKX_COLORMAPPER_H +#define GTKX_COLORMAPPER_H + +#include +#include + +G_BEGIN_DECLS + +#define GTKX_TYPE_COLORMAPPER (gtkx_colormapper_get_type ()) +#define GTKX_COLORMAPPER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTKX_TYPE_COLORMAPPER, GtkXcolormapper)) +#define GTKX_COLORMAPPER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTKX_TYPE_COLORMAPPER, GtkXcolormapperClass)) +#define GTKX_IS_COLORMAPPER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTKX_TYPE_COLORMAPPER)) +#define GTKX_IS_COLORMAPPER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTKX_TYPE_COLORMAPPER)) +#define GTKX_COLORMAPPER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTKX_TYPE_COLORMAPPER, GtkXcolormapperClass)) + +typedef struct _GtkXcolormapper GtkXcolormapper; +typedef struct _GtkXcolormapperClass GtkXcolormapperClass; + +struct _GtkXcolormapper +{ + GtkDrawingArea drawarea; + cairo_surface_t *imgcache; + cairo_surface_t *imgblendcache; + uint32_t imgcache_w; + uint32_t imgcache_h; + uint32_t imgcache_p; + uint32_t tileoff; + uint32_t tileblendoff; + int zoom; + int grid; + int negative; + int dispblend; + int spritemode; + void (*on_motion)(GtkWidget *widg, int valid, uint32_t tileaddr, uint32_t subtileidx); + int (*on_lbutton)(GtkWidget *widg, uint32_t tileidx, uint32_t subtileidx, int keystatus); + int (*on_mbutton)(GtkWidget *widg, uint32_t tileidx, uint32_t subtileidx, int keystatus); + int (*on_rbutton)(GtkWidget *widg, uint32_t tileidx, uint32_t subtileidx, int keystatus); + uint32_t buttonbits; + uint32_t buttonbits_old; + uint32_t transparency; + int select_a, select_b; + int contrast; +}; + +struct _GtkXcolormapperClass +{ + GtkDrawingAreaClass parent_class; +}; + +GType gtkx_colormapper_get_type (void) G_GNUC_CONST; +GtkWidget *gtkx_colormapper_new(); +void gtkx_colormapper_settileoff(GtkXcolormapper *widg, uint32_t offset); +void gtkx_colormapper_settileblendoff(GtkXcolormapper *widg, uint32_t offset); +void gtkx_colormapper_setdispblend(GtkXcolormapper *widg, int enabled); +void gtkx_colormapper_setgrid(GtkXcolormapper *widg, int enabled); +void gtkx_colormapper_setzoom(GtkXcolormapper *widg, int zoomscale); +void gtkx_colormapper_setnegative(GtkXcolormapper *widg, int negative); +void gtkx_colormapper_setspritemode(GtkXcolormapper *widg, int spritemode); +void gtkx_colormapper_settransparency(GtkXcolormapper *widg, uint32_t color); +void gtkx_colormapper_setcontrast(GtkXcolormapper *widg, int contrast); + +G_END_DECLS + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_palettepicker.c b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_palettepicker.c new file mode 100644 index 0000000000..633c8c770f --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_palettepicker.c @@ -0,0 +1,237 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "gtkx_palettepicker.h" + +#include "PokeMini_ColorPal.h" + +G_DEFINE_TYPE (GtkXpalettepicker, gtkx_palettepicker, GTK_TYPE_DRAWING_AREA) + +static gboolean gtkx_palettepicker_button_press(GtkWidget *widget, GdkEventButton *event) +{ + GtkXpalettepicker *widg = GTKX_PALETTEPICKER(widget); + int x = (int)(event->x); + int y = (int)(event->y); + int cx = x, cy = y - 16; + + if ((cx < 0) || (cx >= 128) || (cy < 0) || (cy >= 128)) return TRUE; + + if (event->type == GDK_BUTTON_PRESS) { + if (event->button == 1) { + widg->color_on = (cy >> 3) * 16 + (cx >> 3); + if (widg->on_color) widg->on_color(widget, 1, widg->color_on); + gtk_widget_queue_draw(widget); + } + if (event->button == 3) { + widg->color_off = (cy >> 3) * 16 + (cx >> 3); + if (widg->on_color) widg->on_color(widget, 0, widg->color_off); + gtk_widget_queue_draw(widget); + } + } + + return TRUE; +} + +static gboolean gtkx_palettepicker_button_release(GtkWidget *widget, GdkEventButton *event) +{ + return TRUE; +} + +static gboolean gtkx_palettepicker_motion_notify(GtkWidget *widget, GdkEventMotion *event) +{ + GtkXpalettepicker *widg = GTKX_PALETTEPICKER(widget); + int x = (int)(event->x); + int y = (int)(event->y); + int cx = x, cy = y - 16; + + if ((cx < 0) || (cx >= 128) || (cy < 0) || (cy >= 128)) return TRUE; + + widg->inside = 1; + widg->color_under = (cy >> 3) * 16 + (cx >> 3); + gtk_widget_queue_draw(widget); + + return TRUE; +} + +static void gtkx_palettepicker_expose_setstroke(cairo_t *cr, int index) +{ + if ((index & 0xF0) == 0x70) cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); + else if (index & 0x80) cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + else cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); +} + +static void gtkx_palettepicker_expose_setcolorindex(cairo_t *cr, int index) +{ + double b = ((PokeMini_ColorPalBGR32[index]) & 0xFF) / 255.0; + double g = ((PokeMini_ColorPalBGR32[index] >> 8) & 0xFF) / 255.0; + double r = ((PokeMini_ColorPalBGR32[index] >> 16) & 0xFF) / 255.0; + cairo_set_source_rgb(cr, r, g, b); +} + +static gboolean gtkx_palettepicker_expose(GtkWidget *widget, GdkEventExpose *event) +{ + GtkXpalettepicker *widg = GTKX_PALETTEPICKER(widget); + + cairo_t *cr; + int x, y; + char txt[256]; + + // Create cairo + cr = gdk_cairo_create(widget->window); + gdk_cairo_rectangle(cr, &event->area); + cairo_clip(cr); + cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 12.0); + cairo_set_line_width(cr, 2.0); + + // Paint palette image + cairo_set_source_surface(cr, widg->paletteimg, 0, 16); + cairo_paint(cr); + + // Highlight off color + x = (widg->color_off & 15) << 3; + y = ((widg->color_off >> 4) << 3) + 16; + cairo_rectangle(cr, x, y, 8.0, 8.0); + cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); + cairo_stroke_preserve(cr); + gtkx_palettepicker_expose_setcolorindex(cr, widg->color_off); + cairo_fill(cr); + + // Highlight on color + x = (widg->color_on & 15) << 3; + y = ((widg->color_on >> 4) << 3) + 16; + cairo_rectangle(cr, x, y, 8.0, 8.0); + cairo_set_source_rgb(cr, 0.0, 1.0, 0.0); + cairo_stroke_preserve(cr); + gtkx_palettepicker_expose_setcolorindex(cr, widg->color_on); + cairo_fill(cr); + + if (widg->inside) { + // Display text + sprintf(txt, "Pal. ($%02X, %i)", widg->color_under, widg->color_under); + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 19.0, 13.0); + cairo_show_text(cr, txt); + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + cairo_move_to(cr, 20.0, 14.0); + cairo_show_text(cr, txt); + + // Display under color + cairo_rectangle(cr, 1.0, 1.0, 12.0, 12.0); + gtkx_palettepicker_expose_setstroke(cr, widg->color_under); + cairo_stroke_preserve(cr); + gtkx_palettepicker_expose_setcolorindex(cr, widg->color_under); + cairo_fill(cr); + + // Highlight under color + x = (widg->color_under & 15) << 3; + y = ((widg->color_under >> 4) << 3) + 16; + cairo_rectangle(cr, x, y, 8.0, 8.0); + gtkx_palettepicker_expose_setstroke(cr, widg->color_under); + cairo_stroke_preserve(cr); + gtkx_palettepicker_expose_setcolorindex(cr, widg->color_under); + cairo_fill(cr); + } + + // Destroy cairo + cairo_destroy(cr); + + return TRUE; +} + +static gboolean gtk_palettepicker_enter_notify(GtkWidget *widget, GdkEventCrossing *event) +{ + GtkXpalettepicker *widg = GTKX_PALETTEPICKER(widget); + widg->inside = 1; + gtk_widget_queue_draw(widget); + return TRUE; +} + +static gboolean gtk_palettepicker_leave_notify(GtkWidget *widget, GdkEventCrossing *event) +{ + GtkXpalettepicker *widg = GTKX_PALETTEPICKER(widget); + widg->inside = 0; + gtk_widget_queue_draw(widget); + return TRUE; +} + +static void gtkx_palettepicker_init(GtkXpalettepicker *widg) +{ + int *ptr, x, y; + + gtk_widget_add_events(GTK_WIDGET(widg), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); + gtk_widget_add_events(GTK_WIDGET(widg), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + gtk_widget_set_size_request(GTK_WIDGET(widg), 128, 144); + + widg->paletteimg = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 128, 128); + ptr = (int *)cairo_image_surface_get_data(widg->paletteimg); + for (y=0; y<128; y++) { + for (x=0; x<128; x++) { + ptr[y * 128 + x] = PokeMini_ColorPalBGR32[(y >> 3) * 16 + (x >> 3)]; + } + } + + widg->inside = 0; + widg->color_off = 0x00; + widg->color_on = 0xF0; + widg->on_color = NULL; +} + +static void gtkx_palettepicker_class_init(GtkXpalettepickerClass *class) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); + + widget_class->expose_event = gtkx_palettepicker_expose; + widget_class->button_press_event = gtkx_palettepicker_button_press; + widget_class->button_release_event = gtkx_palettepicker_button_release; + widget_class->motion_notify_event = gtkx_palettepicker_motion_notify; + widget_class->enter_notify_event = gtk_palettepicker_enter_notify; + widget_class->leave_notify_event = gtk_palettepicker_leave_notify; +} + +GtkWidget *gtkx_palettepicker_new(void) +{ + return g_object_new(GTKX_TYPE_PALETTEPICKER, NULL); +} + +void gtkx_palettepicker_swapcolors(GtkXpalettepicker *widg) +{ + int tmp; + tmp = widg->color_off; + widg->color_off = widg->color_on; + widg->color_on = tmp; + if (widg->on_color) { + widg->on_color(GTK_WIDGET(widg), 0, widg->color_off); + widg->on_color(GTK_WIDGET(widg), 1, widg->color_on); + } + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} + +void gtkx_palettepicker_setcolorindex(GtkXpalettepicker *widg, int type, int index) +{ + if (type) { + widg->color_on = index; + } else { + widg->color_off = index; + } + widg->on_color(GTK_WIDGET(widg), type, index); + gtk_widget_queue_draw(GTK_WIDGET(widg)); +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_palettepicker.h b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_palettepicker.h new file mode 100644 index 0000000000..79fd60976a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_palettepicker.h @@ -0,0 +1,59 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PALETTEPICKER_H +#define PALETTEPICKER_H + +#include + +G_BEGIN_DECLS + +#define GTKX_TYPE_PALETTEPICKER (gtkx_palettepicker_get_type ()) +#define GTKX_PALETTEPICKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTKX_TYPE_PALETTEPICKER, GtkXpalettepicker)) +#define GTKX_PALETTEPICKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTKX_TYPE_PALETTEPICKER, GtkXpalettepickerClass)) +#define GTKX_IS_PALETTEPICKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTKX_TYPE_PALETTEPICKER)) +#define GTKX_IS_PALETTEPICKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTKX_TYPE_PALETTEPICKER)) +#define GTKX_PALETTEPICKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTKX_TYPE_PALETTEPICKER, GtkXpalettepickerClass)) + +typedef struct _GtkXpalettepicker GtkXpalettepicker; +typedef struct _GtkXpalettepickerClass GtkXpalettepickerClass; + +struct _GtkXpalettepicker +{ + GtkDrawingArea drawarea; + cairo_surface_t *paletteimg; + int inside; + unsigned char color_off; + unsigned char color_on; + unsigned char color_under; + void (*on_color)(GtkWidget *widg, int type, int index); +}; + +struct _GtkXpalettepickerClass +{ + GtkDrawingAreaClass parent_class; +}; + +GType gtkx_palettepicker_get_type (void) G_GNUC_CONST; +GtkWidget *gtkx_palettepicker_new(); +void gtkx_palettepicker_swapcolors(GtkXpalettepicker *widg); +void gtkx_palettepicker_setcolorindex(GtkXpalettepicker *widg, int type, int index); + +G_END_DECLS + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_pickedcolor.c b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_pickedcolor.c new file mode 100644 index 0000000000..d244ed670c --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_pickedcolor.c @@ -0,0 +1,236 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "gtkx_pickedcolor.h" + +#include "PokeMini_ColorPal.h" + +G_DEFINE_TYPE (GtkXpickedcolor, gtkx_pickedcolor, GTK_TYPE_DRAWING_AREA) + +static gboolean gtkx_pickedcolor_button_press(GtkWidget *widget, GdkEventButton *event) +{ + GtkXpickedcolor *widg = GTKX_PICKEDCOLOR(widget); + int x = (int)(event->x); + int y = (int)(event->y); + int pi = x * GtkXpickedcolor_palsize / widget->allocation.width; + + if (event->type == GDK_BUTTON_PRESS) { + if (event->button == 1) { + if ((y >= 28) && (y < 48)) { + widg->color_on_enabled = !widg->color_on_enabled; + } + if ((y >= 78) && (y < 98)) { + widg->color_off_enabled = !widg->color_off_enabled; + } + if ((y >= 120) && (y < 144)) { + widg->color_off = widg->color_off_pal[pi]; + widg->color_on = widg->color_on_pal[pi]; + } + gtk_widget_queue_draw(widget); + } + if (event->button == 3) { + if ((y >= 0) && (y < 100)) { + widg->color_on_enabled = 1; + widg->color_off_enabled = 1; + } + if ((y >= 120) && (y < 144)) { + widg->color_off_pal[pi] = widg->color_off; + widg->color_on_pal[pi] = widg->color_on; + } + gtk_widget_queue_draw(widget); + } + } + + return TRUE; +} + +static void gtkx_pickedcolor_expose_setstroke(cairo_t *cr, int index) +{ + if ((index & 0xF0) == 0x70) cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); + else if (index & 0x80) cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + else cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); +} + +static void gtkx_pickedcolor_expose_setcolorindex(cairo_t *cr, int index) +{ + double b = ((PokeMini_ColorPalBGR32[index]) & 0xFF) / 255.0; + double g = ((PokeMini_ColorPalBGR32[index] >> 8) & 0xFF) / 255.0; + double r = ((PokeMini_ColorPalBGR32[index] >> 16) & 0xFF) / 255.0; + cairo_set_source_rgb(cr, r, g, b); +} + +static gboolean gtkx_pickedcolor_expose(GtkWidget *widget, GdkEventExpose *event) +{ + GtkXpickedcolor *widg = GTKX_PICKEDCOLOR(widget); + + cairo_t *cr; + char txt[256]; + int w = widget->allocation.width; + int i, wc; + + // Create cairo + cr = gdk_cairo_create(widget->window); + gdk_cairo_rectangle(cr, &event->area); + cairo_clip(cr); + cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 10.0); + cairo_set_line_width(cr, 3.0); + + // Display on color + cairo_rectangle(cr, 2.0, 30.0, w - 4.0, 16.0); + gtkx_pickedcolor_expose_setstroke(cr, widg->color_on); + cairo_stroke_preserve(cr); + gtkx_pickedcolor_expose_setcolorindex(cr, widg->color_on); + cairo_fill(cr); + + // Display disabled if it is... + if (!widg->color_on_enabled) { + cairo_select_font_face(cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size(cr, 10.0); + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 41.0); + cairo_show_text(cr, "Paint Disabled"); + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 42.0); + cairo_show_text(cr, "Paint Disabled"); + } + + // Display on text + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 13.0); + cairo_show_text(cr, "Dark Pixel"); + if (widg->color_on_enabled) cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); else cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 14.0); + cairo_show_text(cr, "Dark Pixel"); + sprintf(txt, "($%02X, %i)", widg->color_on, widg->color_on); + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 23.0); + cairo_show_text(cr, txt); + if (widg->color_on_enabled) cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); else cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 24.0); + cairo_show_text(cr, txt); + + // Display off color + cairo_rectangle(cr, 2.0, 80.0, w - 4.0, 16.0); + gtkx_pickedcolor_expose_setstroke(cr, widg->color_off); + cairo_stroke_preserve(cr); + gtkx_pickedcolor_expose_setcolorindex(cr, widg->color_off); + cairo_fill(cr); + + // Display disabled if it is... + if (!widg->color_off_enabled) { + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 91.0); + cairo_show_text(cr, "Paint Disabled"); + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 92.0); + cairo_show_text(cr, "Paint Disabled"); + } + + // Display off text + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 63.0); + cairo_show_text(cr, "Light Pixel"); + if (widg->color_off_enabled) cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); else cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 64.0); + cairo_show_text(cr, "Light Pixel"); + sprintf(txt, "($%02X, %i)", widg->color_off, widg->color_off); + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 73.0); + cairo_show_text(cr, txt); + if (widg->color_off_enabled) cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); else cairo_set_source_rgb(cr, 1.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 74.0); + cairo_show_text(cr, txt); + + // Display mini palette + cairo_set_line_width(cr, 1.0); + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_move_to(cr, 4.0, 113.0); + cairo_show_text(cr, "Mini palette"); + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + cairo_move_to(cr, 5.0, 114.0); + cairo_show_text(cr, "Mini palette"); + wc = w / GtkXpickedcolor_palsize; + for (i=0; icolor_off_pal[i]); + cairo_stroke_preserve(cr); + gtkx_pickedcolor_expose_setcolorindex(cr, widg->color_off_pal[i]); + cairo_fill(cr); + cairo_rectangle(cr, 2.0 + (i*wc), 132.0, wc - 4.0, 10.0); + gtkx_pickedcolor_expose_setstroke(cr, widg->color_on_pal[i]); + cairo_stroke_preserve(cr); + gtkx_pickedcolor_expose_setcolorindex(cr, widg->color_on_pal[i]); + cairo_fill(cr); + } + + // Destroy cairo + cairo_destroy(cr); + + return TRUE; +} + +static void gtkx_pickedcolor_class_init(GtkXpickedcolorClass *class) +{ + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class); + + widget_class->expose_event = gtkx_pickedcolor_expose; + widget_class->button_press_event = gtkx_pickedcolor_button_press; +} + +static void gtkx_pickedcolor_init(GtkXpickedcolor *widg) +{ + int i; + + gtk_widget_add_events(GTK_WIDGET(widg), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); + gtk_widget_add_events(GTK_WIDGET(widg), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); + gtk_widget_set_size_request(GTK_WIDGET(widg), 80, 144); + + widg->color_off = 0x00; + widg->color_on = 0xF0; + widg->color_off_enabled = 1; + widg->color_on_enabled = 1; + + for (i=0; icolor_off_pal[i] = 0x00; + widg->color_on_pal[i] = 0xF0; + } +} + +GtkWidget *gtkx_pickedcolor_new(void) +{ + return g_object_new(GTKX_TYPE_PICKEDCOLOR, NULL); +} + +void gtkx_pickedcolor_setcolorindex(GtkXpickedcolor *widg, int type, int index) +{ + if (type) { + if (widg->color_on != index) { + widg->color_on = index; + gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } else { + if (widg->color_off != index) { + widg->color_off = index; + gtk_widget_queue_draw(GTK_WIDGET(widg)); + } + } +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_pickedcolor.h b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_pickedcolor.h new file mode 100644 index 0000000000..52686158fb --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/gtkx_pickedcolor.h @@ -0,0 +1,61 @@ +/* + PokeMini Color Mapper + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef GTKX_PICKEDCOLOR_H +#define GTKX_PICKEDCOLOR_H + +#include + +G_BEGIN_DECLS + +#define GTKX_TYPE_PICKEDCOLOR (gtkx_pickedcolor_get_type ()) +#define GTKX_PICKEDCOLOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTKX_TYPE_PICKEDCOLOR, GtkXpickedcolor)) +#define GTKX_PICKEDCOLOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTKX_TYPE_PICKEDCOLOR, GtkXpickedcolorClass)) +#define GTKX_IS_PICKEDCOLOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTKX_TYPE_PICKEDCOLOR)) +#define GTKX_IS_PICKEDCOLOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTKX_TYPE_PICKEDCOLOR)) +#define GTKX_PICKEDCOLOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTKX_TYPE_PICKEDCOLOR, GtkXpickedcolorClass)) + +typedef struct _GtkXpickedcolor GtkXpickedcolor; +typedef struct _GtkXpickedcolorClass GtkXpickedcolorClass; + +#define GtkXpickedcolor_palsize 4 + +struct _GtkXpickedcolor +{ + GtkDrawingArea drawarea; + unsigned char color_off; + unsigned char color_on; + int color_off_enabled; + int color_on_enabled; + int color_off_pal[GtkXpickedcolor_palsize]; + int color_on_pal[GtkXpickedcolor_palsize]; +}; + +struct _GtkXpickedcolorClass +{ + GtkDrawingAreaClass parent_class; +}; + +GType gtkx_pickedcolor_get_type (void) G_GNUC_CONST; +GtkWidget *gtkx_pickedcolor_new(); +void gtkx_pickedcolor_setcolorindex(GtkXpickedcolor *widg, int type, int index); + + +G_END_DECLS + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/makefile b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/makefile new file mode 100644 index 0000000000..bcfb1176b0 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/color_mapper/makefile @@ -0,0 +1,83 @@ +# Color Mapper Makefile for GTK + +CC = gcc +LD = gcc +STRIP = strip +POKEROOT = ../../ +BUILD = Build +TARGET = color_mapper + +RELEASE_DIR = ../../release + +WINTARGET = color_mapper.exe +WINRES_TRG = $(BUILD)/color_mapper_rc.o +WINRES_SRC = color_mapper.rc + +CFLAGS = -march=i686 -O -Wall `pkg-config --cflags gtk+-2.0` $(INCLUDE) +SLFLAGS = -march=i686 -O `pkg-config --libs gtk+-2.0` -lm -mwindows + +INCDIRS = source sourcex resource + +OBJS = \ + color_mapper.o \ + color_info.o \ + color_display.o \ + gtkx_colormapper.o \ + gtkx_pickedcolor.o \ + gtkx_palettepicker.o \ + sourcex/GtkXDialogs.o \ + sourcex/PokeMiniIcon_96x128.o \ + sourcex/ExportBMP.o \ + sourcex/HelpSupport.o \ + source/PMCommon.o \ + source/CommandLine.o \ + resource/PokeMini_ColorPal.o + +DEPENDS_LOCAL = \ + color_mapper.h \ + color_info.h \ + color_display.h \ + gtkx_colormapper.h \ + gtkx_pickedcolor.h \ + gtkx_palettepicker.h + +DEPENDS = \ + sourcex/GtkXDialogs.h \ + sourcex/PokeMiniIcon_96x128.h \ + sourcex/ExportBMP.h \ + sourcex/HelpSupport.h \ + source/PMCommon.h \ + source/CommandLine.h \ + resource/PokeMini_ColorPal.h \ + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) $(DEPENDS_LOCAL) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + if [ -d $(RELEASE_DIR) ]; then cp $(TARGET) $(RELEASE_DIR); fi + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + windres $(INCLUDE) $(WINRES_SRC) $(WINRES_TRG) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + if [ -d $(RELEASE_DIR) ]; then cp $(TARGET) $(RELEASE_DIR); fi + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) $(WINRES_TRG) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/imgconv/makefile b/PVPokeMini/PokeMini/pokemini-code/tools/imgconv/makefile new file mode 100644 index 0000000000..ff02212a51 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/imgconv/makefile @@ -0,0 +1,60 @@ +CC = gcc +LD = gcc +STRIP = strip +BUILD = Build +TARGET = pokemini_imgconv +POKEROOT = ../../ + +WINTARGET = pokemini_imgconv.exe + +CFLAGS = -O -Wall $(INCLUDE) +SLFLAGS = -O -lm -lfreeimage + +INCDIRS = source sourcex resource + +OBJS = \ + pokemini_imgconv.o \ + sourcex/ExportCode.o \ + sourcex/ExportC.o \ + sourcex/ExportASM.o \ + source/PMCommon.o + +DEPENDS_LOCAL = \ + pokemini_imgconv.h + +DEPENDS = \ + sourcex/ExportCode.h \ + sourcex/ExportC.h \ + sourcex/ExportASM.h \ + source/PMCommon.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) $(DEPENDS_LOCAL) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) + $(STRIP) $(TARGET) + if [ -d release ]; then cp $(TARGET) release; fi + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) + $(STRIP) $(WINTARGET) + if [ -d release ]; then cp $(WINTARGET) release; fi + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/imgconv/pokemini_imgconv.c b/PVPokeMini/PokeMini/pokemini-code/tools/imgconv/pokemini_imgconv.c new file mode 100644 index 0000000000..4cf2c24548 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/imgconv/pokemini_imgconv.c @@ -0,0 +1,940 @@ +/* + PokeMini Image Converter + Copyright (C) 2011-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include + +#include "PMCommon.h" +#include "ExportCode.h" +#include "pokemini_imgconv.h" + +#define VERSION_STR "v1.4" +#define EXPORT_STR "Image exported with PokeMini Image Converter " VERSION_STR + +#define STR_GRAY "%s_gray" +#define STR_MAP "%s_map" +#define STR_TILES "%s_tiles" +#define STR_MTILES "%s_mtiles" +#define STR_SPRITES "%s_sprites" +#define STR_MAPW "%s_mapw" +#define STR_MAPH "%s_maph" +#define STR_MAPSIZE "%s_mapsize" + +// ---------- Header ---------- + +int ImgW, ImgH; // Width and height in pixels +int ImgMapWidth, ImgMapHeight; // Width and height in map dim. +unsigned char *ImgSrc = NULL; // Source, 0 = Dark(1), 1 = Gray(1/0), 2 = Light(0) +unsigned char *ImgAlp = NULL; // Alpha, 0 = Transparent, 1 = Solid +unsigned char *ImgOut1 = NULL; // Output 1 (output) +unsigned char *ImgOut2 = NULL; // Output 2 (extra for gray output) +unsigned char *ImgTilesetOut1 = NULL; // Output tileset (output) +unsigned char *ImgTilesetOut2 = NULL; // Output tileset (extra gray) +unsigned char *ImgMap = NULL; // Output map +int ImgMetaSize; // Meta-tiles size +int ImgMaxMapID; // Maximum number of map indexes +int ImgMaxTiles; // Maximum number of tiles +int ImgMaxMetaT; // Maximum number of meta-tiles +int ImgNumTiles; // Number of tiles to export +int ImgNumMetaT; // Number of meta-tiles to export +unsigned char *ImgTileset = NULL; // External tileset, 0 = Dark(1), 1 = Gray(1/0), 2 = Light(0) +int ImgTilesetW, ImgTilesetH; // Width and height in pixels of tileset +int ImgNumTilesetTiles; // Number of tileset tiles +int ImgNumTilesetMetaT; // Number of tileset meta-tiles +int ImgMaxTilesetTiles; // Maximum number of tiles in tileset +struct { + int quiet; // Quiet + int verbose; // Verbose + int gfx; // 0 = Tiles, 1 = Sprites, 2 = Map + int dither; // Dither for 3rd color + int colorkey; // Transparent color key + int meta_w; // Metatile width (Tiles & Map) + int meta_h; // Metatile height (Tiles & Map) + int meta_shift; // Shift map index on meta-tiles + char img_f[128]; // Image file + char tileset_f[128]; // Tileset filename for external mapping + char conf_f[128]; // Conf file (Optional) + int format; // Output format: Raw, Asm or C + int hformat; // Header format: Asm or C + int joined; // Join all data into a single file + int out1_e; // Output file (enable) + char out1_f[128]; // Output file (filename) + char out1_v[128]; // Output file (var name) + int out2_e; // Output file for gray (enable) + char out2_f[128]; // Output file for gray (filename) + char out2_v[128]; // Output file for gray (var name) + int outts1_e; // Output tileset file (enable) + char outts1_f[128]; // Output tileset file (filename) + char outts1_v[128]; // Output tileset file (var name) + int outts2_e; // Output tileset file for gray (enable) + char outts2_f[128]; // Output tileset file for gray (filename) + char outts2_v[128]; // Output tileset file for gray (var name) + int outm_e; // Output map file (enable) + int outm_de; // Output map file (def. enable) + char outm_f[128]; // Output map file (filename) + char outm_v[128]; // Output map file (var name) + int outh_e; // Output header file (enable) + char outh_f[128]; // Output header file (filename) + int mapidofs; // Map Index Offset + int mapidsiz; // Map Index Size (0 = Unlimited) + int maxtiles; // Maximum number of tiles + int threhold1; // Dark threhold + int threhold2; // Light threhold +} confs; + +// ---------- Conf ---------- + +// Initialize confs +void init_confs() +{ + memset((void *)&confs, 0, sizeof(confs)); + confs.format = FILE_ECODE_RAW; + confs.hformat = FILE_ECODE_RAW; // <- RAW = automatic + confs.dither = 1; + confs.meta_w = 1; + confs.meta_h = 1; + confs.colorkey = 0xFF00FF; + confs.out1_e = 1; + confs.out2_e = 1; + confs.outts1_e = 1; + confs.outts2_e = 1; + confs.outm_e = 1; + confs.outh_e = 1; + confs.mapidofs = 0; + confs.mapidsiz = 0; + confs.maxtiles = 65536; + confs.threhold1 = 64; + confs.threhold2 = 192; +} + +// Load confs from arguments +int load_confs_args(int argc, char **argv) +{ + argv++; + while (*argv) { + if (*argv[0] == '-') { + if (!strcasecmp(*argv, "-tiles")) confs.gfx = GFX_TILES; + else if (!strcasecmp(*argv, "-oam")) confs.gfx = GFX_SPRITES; + else if (!strcasecmp(*argv, "-spr")) confs.gfx = GFX_SPRITES; + else if (!strcasecmp(*argv, "-sprites")) confs.gfx = GFX_SPRITES; + else if (!strcasecmp(*argv, "-map")) confs.gfx = GFX_MAP; + else if (!strcasecmp(*argv, "-exmap")) confs.gfx = GFX_EXMAP; + else if (!strcasecmp(*argv, "-external")) confs.gfx = GFX_EXMAP; + else if (!strcasecmp(*argv, "-externalmap")) confs.gfx = GFX_EXMAP; + else if (!strcasecmp(*argv, "-nodither")) confs.dither = 0; + else if (!strcasecmp(*argv, "-dither")) confs.dither = 1; + else if (!strcasecmp(*argv, "-nocolorkey")) confs.colorkey = -1; + else if (!strcasecmp(*argv, "-colorkey")) { if (*++argv) confs.colorkey = BetweenNum(atoi_Ex(*argv, 0xFF00FF), 0x000000, 0xFFFFFF); } + else if (!strcasecmp(*argv, "-metaw")) { if (*++argv) confs.meta_w = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-metah")) { if (*++argv) confs.meta_h = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-meta_w")) { if (*++argv) confs.meta_w = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-meta_h")) { if (*++argv) confs.meta_h = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-metax")) { if (*++argv) confs.meta_w = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-metay")) { if (*++argv) confs.meta_h = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-meta_x")) { if (*++argv) confs.meta_w = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-meta_y")) { if (*++argv) confs.meta_h = BetweenNum(atoi_Ex(*argv, 1), 1, 256); } + else if (!strcasecmp(*argv, "-nometashl")) confs.meta_shift = 0; + else if (!strcasecmp(*argv, "-metashl")) confs.meta_shift = 1; + else if (!strcasecmp(*argv, "-nometa_shl")) confs.meta_shift = 0; + else if (!strcasecmp(*argv, "-meta_shl")) confs.meta_shift = 1; + else if (!strcasecmp(*argv, "-rawf")) confs.format = FILE_ECODE_RAW; + else if (!strcasecmp(*argv, "-asmf")) confs.format = FILE_ECODE_ASM; + else if (!strcasecmp(*argv, "-cf")) confs.format = FILE_ECODE_C; + else if (!strcasecmp(*argv, "-autohf")) confs.hformat = FILE_ECODE_RAW; + else if (!strcasecmp(*argv, "-asmhf")) confs.hformat = FILE_ECODE_ASM; + else if (!strcasecmp(*argv, "-chf")) confs.hformat = FILE_ECODE_C; + else if (!strcasecmp(*argv, "-separated")) confs.joined = 0; + else if (!strcasecmp(*argv, "-joined")) confs.joined = 1; + else if (!strcasecmp(*argv, "-i")) { if (*++argv) strncpy(confs.img_f, *argv, 127); } + else if (!strcasecmp(*argv, "-in")) { if (*++argv) strncpy(confs.img_f, *argv, 127); } + else if (!strcasecmp(*argv, "-img")) { if (*++argv) strncpy(confs.img_f, *argv, 127); } + else if (!strcasecmp(*argv, "-tset")) { if (*++argv) strncpy(confs.tileset_f, *argv, 127); } + else if (!strcasecmp(*argv, "-tileset")) { if (*++argv) strncpy(confs.tileset_f, *argv, 127); } + else if (!strcasecmp(*argv, "-c")) { if (*++argv) strncpy(confs.conf_f, *argv, 127); } + else if (!strcasecmp(*argv, "-cfg")) { if (*++argv) strncpy(confs.conf_f, *argv, 127); } + else if (!strcasecmp(*argv, "-conf")) { if (*++argv) strncpy(confs.conf_f, *argv, 127); } + else if (!strcasecmp(*argv, "-o")) { if (*++argv) strncpy(confs.out1_f, *argv, 127); } + else if (!strcasecmp(*argv, "-og")) { if (*++argv) strncpy(confs.out2_f, *argv, 127); } + else if (!strcasecmp(*argv, "-ots")) { if (*++argv) strncpy(confs.outts1_f, *argv, 127); } + else if (!strcasecmp(*argv, "-otsg")) { if (*++argv) strncpy(confs.outts2_f, *argv, 127); } + else if (!strcasecmp(*argv, "-om")) { if (*++argv) strncpy(confs.outm_f, *argv, 127); } + else if (!strcasecmp(*argv, "-oh")) { if (*++argv) strncpy(confs.outh_f, *argv, 127); } + else if (!strcasecmp(*argv, "-out")) { if (*++argv) strncpy(confs.out1_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outgray")) { if (*++argv) strncpy(confs.out2_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outgrey")) { if (*++argv) strncpy(confs.out2_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outtileset")) { if (*++argv) strncpy(confs.out1_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outtilesetgray")) { if (*++argv) strncpy(confs.out2_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outtilesetgrey")) { if (*++argv) strncpy(confs.out2_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outmap")) { if (*++argv) strncpy(confs.outm_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outheader")) { if (*++argv) strncpy(confs.outh_f, *argv, 127); } + else if (!strcasecmp(*argv, "-vo")) { if (*++argv) strncpy(confs.out1_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vog")) { if (*++argv) strncpy(confs.out2_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vots")) { if (*++argv) strncpy(confs.outts1_v, *argv, 127); } + else if (!strcasecmp(*argv, "-votsg")) { if (*++argv) strncpy(confs.outts2_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vom")) { if (*++argv) strncpy(confs.outm_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vout")) { if (*++argv) strncpy(confs.out1_v, *argv, 127); } + else if (!strcasecmp(*argv, "-voutgray")) { if (*++argv) strncpy(confs.out2_v, *argv, 127); } + else if (!strcasecmp(*argv, "-voutgrey")) { if (*++argv) strncpy(confs.out2_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vouttileset")) { if (*++argv) strncpy(confs.outts1_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vouttilesetgray")) { if (*++argv) strncpy(confs.outts2_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vouttilesetgrey")) { if (*++argv) strncpy(confs.outts2_v, *argv, 127); } + else if (!strcasecmp(*argv, "-voutmap")) { if (*++argv) strncpy(confs.outm_v, *argv, 127); } + else if (!strcasecmp(*argv, "-idofs")) { if (*++argv); confs.mapidofs = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-idoffset")) { if (*++argv) confs.mapidofs = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-idsize")) { if (*++argv) confs.mapidsiz = BetweenNum(atoi_Ex(*argv, 0), 0, 65536); } + else if (!strcasecmp(*argv, "-id_ofs")) { if (*++argv) confs.mapidofs = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-id_offset")) { if (*++argv) confs.mapidofs = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-id_size")) { if (*++argv) confs.mapidsiz = BetweenNum(atoi_Ex(*argv, 0), 0, 65536); } + else if (!strcasecmp(*argv, "-maxtiles")) { if (*++argv) confs.maxtiles = BetweenNum(atoi_Ex(*argv, 0), 0, 65536); } + else if (!strcasecmp(*argv, "-darkthrehold")) { if (*++argv) confs.threhold1 = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-lightthrehold")) { if (*++argv) confs.threhold2 = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-dt")) { if (*++argv) confs.threhold1 = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-lt")) { if (*++argv) confs.threhold2 = BetweenNum(atoi_Ex(*argv, 0), 0, 255); } + else if (!strcasecmp(*argv, "-q")) confs.quiet = 1; + else if (!strcasecmp(*argv, "-v")) confs.verbose = 1; + else return 0; + } else return 0; + if (*argv) argv++; + } + + // Image filename or config filename cannot be empty + if (!strlen(confs.img_f) && !strlen(confs.conf_f)) return 0; + + return 1; +} + +// Load confs from file +int load_confs_file(const char *filename) +{ + FILE *fi; + char tmp[1024], *txt, *key, *value; + + fi = fopen(filename, "r"); + if (!fi) return 0; + + if (fi) { + while ((txt = fgets(tmp, 1024, fi)) != NULL) { + // Remove comments + RemoveComments(txt); + + // Break up key and value + if (!SeparateAtChar(txt, '=', &key, &value)) continue; + + // Trim them + key = TrimStr(key); + value = TrimStr(value); + + // Decode key and set CommandLine + if (!strcasecmp(key, "gfx")) { + if (!strcasecmp(value, "tiles")) confs.gfx = GFX_TILES; + else if (!strcasecmp(value, "oam")) confs.gfx = GFX_SPRITES; + else if (!strcasecmp(value, "spr")) confs.gfx = GFX_SPRITES; + else if (!strcasecmp(value, "sprites")) confs.gfx = GFX_SPRITES; + else if (!strcasecmp(value, "map")) confs.gfx = GFX_MAP; + else if (!strcasecmp(value, "exmap")) confs.gfx = GFX_EXMAP; + else if (!strcasecmp(value, "external")) confs.gfx = GFX_EXMAP; + else if (!strcasecmp(value, "externalmap")) confs.gfx = GFX_EXMAP; + else printf("Conf warning: Unknown '%s' value in 'gfx' key\n", value); + } + else if (!strcasecmp(key, "dither")) confs.dither = Str2Bool(value); + else if (!strcasecmp(key, "colorkey")) confs.colorkey = BetweenNum(atoi_Ex(value, 0xFF00FF), -1, 0xFFFFFF); + else if (!strcasecmp(key, "metaw")) confs.meta_w = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "metah")) confs.meta_h = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "meta_w")) confs.meta_w = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "meta_h")) confs.meta_h = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "metax")) confs.meta_w = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "metay")) confs.meta_h = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "meta_x")) confs.meta_w = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "meta_y")) confs.meta_h = BetweenNum(atoi_Ex(value, 1), 1, 256); + else if (!strcasecmp(key, "metashl")) confs.meta_shift = Str2Bool(value); + else if (!strcasecmp(key, "meta_shl")) confs.meta_shift = Str2Bool(value); + else if (!strcasecmp(key, "format")) { + if (!strcasecmp(value, "raw")) confs.format = FILE_ECODE_RAW; + else if (!strcasecmp(value, "bin")) confs.format = FILE_ECODE_RAW; + else if (!strcasecmp(value, "asm")) confs.format = FILE_ECODE_ASM; + else if (!strcasecmp(value, "c")) confs.format = FILE_ECODE_C; + else printf("Conf warning: Unknown '%s' value in 'format' key\n", value); + } + else if (!strcasecmp(key, "headerformat")) { + if (!strcasecmp(value, "auto")) confs.hformat = FILE_ECODE_RAW; + else if (!strcasecmp(value, "asm")) confs.hformat = FILE_ECODE_ASM; + else if (!strcasecmp(value, "c")) confs.hformat = FILE_ECODE_C; + else printf("Conf warning: Unknown '%s' value in 'headerformat' key\n", value); + } + else if (!strcasecmp(key, "joined")) confs.joined = Str2Bool(value); + else if (!strcasecmp(key, "img")) strncpy(confs.img_f, value, 127); + else if (!strcasecmp(key, "tileset")) strncpy(confs.tileset_f, value, 127); + else if (!strcasecmp(key, "out")) strncpy(confs.out1_f, value, 127); + else if (!strcasecmp(key, "outgray")) strncpy(confs.out2_f, value, 127); + else if (!strcasecmp(key, "outgrey")) strncpy(confs.out2_f, value, 127); + else if (!strcasecmp(key, "outtileset")) strncpy(confs.outts1_f, value, 127); + else if (!strcasecmp(key, "outtilesetgray")) strncpy(confs.outts2_f, value, 127); + else if (!strcasecmp(key, "outtilesetgrey")) strncpy(confs.outts2_f, value, 127); + else if (!strcasecmp(key, "outmap")) strncpy(confs.outm_f, value, 127); + else if (!strcasecmp(key, "outheader")) strncpy(confs.outh_f, value, 127); + else if (!strcasecmp(key, "voutgray")) strncpy(confs.out2_v, value, 127); + else if (!strcasecmp(key, "voutgrey")) strncpy(confs.out2_v, value, 127); + else if (!strcasecmp(key, "vouttileset")) strncpy(confs.out1_v, value, 127); + else if (!strcasecmp(key, "vouttilesetgray")) strncpy(confs.out2_v, value, 127); + else if (!strcasecmp(key, "vouttilesetgrey")) strncpy(confs.out2_v, value, 127); + else if (!strcasecmp(key, "voutmap")) strncpy(confs.outm_v, value, 127); + else if (!strcasecmp(key, "wout")) confs.out1_e = Str2Bool(value); + else if (!strcasecmp(key, "woutgray")) confs.out2_e = Str2Bool(value); + else if (!strcasecmp(key, "woutgrey")) confs.out2_e = Str2Bool(value); + else if (!strcasecmp(key, "wouttileset")) confs.outts1_e = Str2Bool(value); + else if (!strcasecmp(key, "wouttilesetgray")) confs.outts2_e = Str2Bool(value); + else if (!strcasecmp(key, "wouttilesetgrey")) confs.outts2_e = Str2Bool(value); + else if (!strcasecmp(key, "woutmap")) confs.outm_e = Str2Bool(value); + else if (!strcasecmp(key, "woutheader")) confs.outh_e = Str2Bool(value); + else if (!strcasecmp(key, "idofs")) confs.mapidofs = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "idoffset")) confs.mapidofs = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "idsize")) confs.mapidsiz = BetweenNum(atoi_Ex(value, 0), 0, 65536); + else if (!strcasecmp(key, "id_ofs")) confs.mapidofs = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "id_offset")) confs.mapidofs = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "id_size")) confs.mapidsiz = BetweenNum(atoi_Ex(value, 0), 0, 65536); + else if (!strcasecmp(key, "maxtiles")) confs.maxtiles = BetweenNum(atoi_Ex(value, 0), 0, 65536); + else if (!strcasecmp(key, "darkthrehold")) confs.threhold1 = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "lightthrehold")) confs.threhold2 = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "dt")) confs.threhold1 = BetweenNum(atoi_Ex(value, 0), 0, 255); + else if (!strcasecmp(key, "lt")) confs.threhold2 = BetweenNum(atoi_Ex(value, 0), 0, 255); + else printf("Conf warning: Unknown '%s' key\n", key); + } + fclose(fi); + } + + return 1; +} + +// ---------- Converter ---------- + +int checkduplicate_tiles(unsigned char *tilebase1, unsigned char *tilebase2, int tilesize, int numtiles, unsigned char *tile2check1, unsigned char *tile2check2) +{ + int x, y; + for (y=0; y= 0) { + // Duplicated + if (confs.meta_shift) ImgMap[mapoff++] = schid * ImgMetaSize; + else ImgMap[mapoff++] = schid; + continue; + } else { + // Not duplicated + ImgMap[mapoff++] = mapid; + if (confs.meta_shift) mapid += ImgMetaSize; + else mapid++; + } + if (mapid == 0x100) { + // Map ID going over 8-bits range + fprintf(stderr, "Error: Map ID out of range\n"); + noerror = 0; + } + if (confs.mapidsiz) { + // Check for map ID size limit + if (mapid >= (confs.mapidofs + confs.mapidsiz)) { + px = ImgW; py = ImgH; + } + } + } else if (confs.gfx == GFX_EXMAP) { + // Check for the tile in the tileset + schid = checkduplicate_tiles(ImgTilesetOut1, ImgTilesetOut2, ImgMetaSize*8, ImgNumTilesetMetaT, dout1, dout2); + if (confs.meta_shift) ImgMap[mapoff++] = schid * ImgMetaSize; + else ImgMap[mapoff++] = schid; + if (schid < 0) { + fprintf(stderr, "Error: No matching tile in (%i, %i)\n", px, py); + noerror = 0; + } + } else { + // Just copy data + ImgMap[mapoff++] = mapid++; + } + + // Add tile to output + if (gfx == GFX_SPRITES) { + memcpy(&ImgOut1[ImgNumTiles*8], &doutA[0], 8); + memcpy(&ImgOut1[ImgNumTiles*8+8], &doutA[16], 8); + memcpy(&ImgOut1[ImgNumTiles*8+16], &dout1[0], 8); + memcpy(&ImgOut1[ImgNumTiles*8+24], &dout1[16], 8); + memcpy(&ImgOut1[ImgNumTiles*8+32], &doutA[8], 8); + memcpy(&ImgOut1[ImgNumTiles*8+40], &doutA[24], 8); + memcpy(&ImgOut1[ImgNumTiles*8+48], &dout1[8], 8); + memcpy(&ImgOut1[ImgNumTiles*8+56], &dout1[24], 8); + memcpy(&ImgOut2[ImgNumTiles*8], &doutA[0], 8); + memcpy(&ImgOut2[ImgNumTiles*8+8], &doutA[16], 8); + memcpy(&ImgOut2[ImgNumTiles*8+16], &dout2[0], 8); + memcpy(&ImgOut2[ImgNumTiles*8+24], &dout2[16], 8); + memcpy(&ImgOut2[ImgNumTiles*8+32], &doutA[8], 8); + memcpy(&ImgOut2[ImgNumTiles*8+40], &doutA[24], 8); + memcpy(&ImgOut2[ImgNumTiles*8+48], &dout2[8], 8); + memcpy(&ImgOut2[ImgNumTiles*8+56], &dout2[24], 8); + ImgNumTiles += ImgMetaSize*2; + } else { + memcpy(&ImgOut1[ImgNumTiles*8], dout1, ImgMetaSize*8); + memcpy(&ImgOut2[ImgNumTiles*8], dout2, ImgMetaSize*8); + ImgNumTiles += ImgMetaSize; + } + ImgNumMetaT++; + + // Check for tiles limit + if (mapid >= (confs.mapidofs + confs.maxtiles)) { + px = ImgW; py = ImgH; + } + } + } + + // Free memory + if (dout1) free(dout1); + if (dout2) free(dout2); + if (doutA) free(doutA); + if (confs.mapidsiz) { + if (confs.mapidsiz < ImgMaxMapID) ImgMaxMapID = confs.mapidsiz; + } + + return noerror; +} + +int convert_imgdata(const char *imgfile, int *ImgW, int *ImgH, unsigned char **ImgDst, unsigned char **ImgAlp) +{ + FIBITMAP *dib, *dib2; + FREE_IMAGE_FORMAT ftyp; + unsigned char *dst, *alp; + int x, y, color, dist, w, h; + char *ext; + + // Try to guess image type + ext = GetExtension(imgfile); + if (!strcasecmp(ext, ".bmp")) ftyp = FIF_BMP; + else if (!strcasecmp(ext, ".ico")) ftyp = FIF_ICO; + else if (!strcasecmp(ext, ".jpg")) ftyp = FIF_JPEG; + else if (!strcasecmp(ext, ".jpeg")) ftyp = FIF_JPEG; + else if (!strcasecmp(ext, ".pcx")) ftyp = FIF_PCX; + else if (!strcasecmp(ext, ".png")) ftyp = FIF_PNG; + else if (!strcasecmp(ext, ".tga")) ftyp = FIF_TARGA; + else if (!strcasecmp(ext, ".tif")) ftyp = FIF_TIFF; + else if (!strcasecmp(ext, ".tiff")) ftyp = FIF_TIFF; + else if (!strcasecmp(ext, ".gif")) ftyp = FIF_GIF; + else if (!strcasecmp(ext, ".psd")) ftyp = FIF_PSD; + else if (!strcasecmp(ext, ".dds")) { + ftyp = FIF_DDS; + if (!confs.quiet) printf("Warning: DDS image isn't fully supported\n"); + } else { + fprintf(stderr, "Error: Unsupported image extension '%s'\n", ext); + return 0; + } + + // Open image + dib = FreeImage_Load(ftyp, imgfile, 0); + if (dib == NULL) { + fprintf(stderr, "Error: Failed to open image '%s'\n", imgfile); + return 0; + } + FreeImage_FlipVertical(dib); + w = FreeImage_GetWidth(dib); + h = FreeImage_GetHeight(dib); + if ((w & 7) || (h & 7)) { + fprintf(stderr, "Error: Width and height must be multiple of 8 in '%s'\n", imgfile); + FreeImage_Unload(dib); + return 0; + } + dib2 = FreeImage_ConvertTo32Bits(dib); + if (dib2 == NULL) { + fprintf(stderr, "Error: Failed to convert image\n"); + FreeImage_Unload(dib); + return 0; + } + + // Normalize pixels values + dst = (unsigned char *)malloc(w * h); + alp = (unsigned char *)malloc(w * h); + for (y=0; y> 8) * 38470 + ((color & 0xFF0000) >> 16) * 7471) >> 16; + if (dist >= confs.threhold2) { + ptrS[x] = 2; + } else if (dist <= confs.threhold1) { + ptrS[x] = 0; + } else { + ptrS[x] = 1; + } + if (color == confs.colorkey) ptrA[x] = 0; + else ptrA[x] = (ptr[x] & 0x80000000) ? 1 : 0; + } + } + + // Close image + FreeImage_Unload(dib2); + FreeImage_Unload(dib); + + // Set outputs + if (ImgW) *ImgW = w; + if (ImgH) *ImgH = h; + if (ImgDst) { + *ImgDst = dst; + } else { + free(dst); + } + if (ImgAlp) { + *ImgAlp = alp; + } else { + free(alp); + } + return 1; +} + +// ---------- Main ---------- + +int main(int argc, char **argv) +{ + FILE_ECODE *foptr; + FILE *fo; + int x, y; + int exported = 0; + + // Read from command line + init_confs(); + if (!load_confs_args(argc, argv)) { + printf("PokeMini Image Converter " VERSION_STR "\n\n"); + printf("Usage: pokemini_imgconv [options]\n\n"); + printf(" -tiles Convert to tiles (def)\n"); + printf(" -sprites Convert to sprites\n"); + printf(" -map Convert to map\n"); + printf(" -exmap Convert to map from external tileset\n"); + printf(" -nodither Disable dither\n"); + printf(" -dither Enable dither (def)\n"); + printf(" -nocolorkey No color key\n"); + printf(" -colorkey #FF00FF Color key (def)\n"); + printf(" -metaw 1 Meta-tile width in tiles\n"); + printf(" -metah 1 Meta-tile height in tiles\n"); + printf(" -nometashl Don't shift map index for meta (def)\n"); + printf(" -metashl Shift map index left for meta-tiles\n"); + printf(" -rawf Output in raw format (def)\n"); + printf(" -asmf Output in asm format\n"); + printf(" -cf Output in C format\n"); + printf(" -autohf Autodetect correct header format (def)\n"); + printf(" -asmhf Output header in asm format\n"); + printf(" -chf Output header in C format\n"); + printf(" -separated Separate data to each file (def)\n"); + printf(" -joined Join all data into a single file\n"); + printf(" -i img.png Image input\n"); + printf(" -tileset img.dat External tileset\n"); + printf(" -c img.txt Conf. file input\n"); + printf(" -o img.raw Output file\n"); + printf(" -og imgg.raw Output file (gray)\n"); + printf(" -ots imgts.raw Output tileset file\n"); + printf(" -otsg imgtsg.raw Output tileset file (gray)\n"); + printf(" -om map.raw Output map indexes file\n"); + printf(" -oh img.inc Output header file\n"); + printf(" -vo img Variable name for output\n"); + printf(" -vog imgg Variable name for gray output\n"); + printf(" -vtso imgts Variable name for tileset output\n"); + printf(" -vtsog imgtsg Variable name for tileset gray output\n"); + printf(" -vom map Variable name for map indexes\n"); + printf(" -idofs 0 Map index offset\n"); + printf(" -idsize 0 Map index size (0=Unlimited)\n"); + printf(" -maxtiles 65536 Maximum number of tiles\n"); + printf(" -dt 64 Dark threhold, lower lum. will be full dark\n"); + printf(" -lt 192 Light threhold, higher lum. will be full light\n"); + printf(" -q Quiet\n"); + printf(" -v Verbose\n"); + printf("\nSupported images are:\n.bmp, .ico, .jpg, .jpeg, .pcx, .png, .tga, .tif, .tiff, .gif, .psd and .dds\n"); + return 0; + } + if (!confs.quiet) printf("PokeMini Image Converter " VERSION_STR "\n\n"); + if (strlen(confs.conf_f)) { + // Load configurations + if (!load_confs_file(confs.conf_f)) { + fprintf(stderr, "Error: Failed to load '%s' conf file\n", confs.conf_f); + return 1; + } + // Make sure command-line takes priority + load_confs_args(argc, argv); + } + + // Image filename cannot be empty + if (!strlen(confs.img_f)) { + fprintf(stderr, "Error: Missing input image\n"); + return 1; + } + + // Convert image to a normalized format + if (!convert_imgdata(confs.img_f, &ImgW, &ImgH, &ImgSrc, &ImgAlp)) return 1; + ImgMaxTiles = (ImgW * ImgH) >> 6; + ImgMaxMapID = ImgMaxTiles; + ImgOut1 = (unsigned char *)malloc(ImgMaxTiles * 8 * 2); + ImgOut2 = (unsigned char *)malloc(ImgMaxTiles * 8 * 2); + ImgMap = (unsigned char *)malloc(ImgMaxMapID); + if (confs.gfx == GFX_EXMAP) { + if (!convert_imgdata(confs.tileset_f, &ImgTilesetW, &ImgTilesetH, &ImgTileset, NULL)) return 1; + ImgMaxTilesetTiles = (ImgTilesetW * ImgTilesetH) >> 6; + ImgTilesetOut1 = (unsigned char *)malloc(ImgMaxTilesetTiles * 8 * 2); + ImgTilesetOut2 = (unsigned char *)malloc(ImgMaxTilesetTiles * 8 * 2); + } + + // Clear output data + for (y=0; y. +*/ + +#ifndef IMG_CONV_H +#define IMG_CONV_H + +enum { + GFX_TILES, + GFX_SPRITES, + GFX_MAP, + GFX_EXMAP +}; + +void init_confs(); +int load_confs_args(int argc, char **argv); +int load_confs_file(const char *filename); + +int checkduplicate_tiles(unsigned char *tilebase1, unsigned char *tilebase2, int tilesize, int numtiles, unsigned char *tile2check1, unsigned char *tile2check2); +void convert_tile_alpha(unsigned char *apixels, int pitch, unsigned char *dout); +void convert_tile(int field, unsigned char *pixels, int pitch, unsigned char *dout); +int convert_image(int format); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/makefile b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/makefile new file mode 100644 index 0000000000..df7793e8a3 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/makefile @@ -0,0 +1,75 @@ +CC = gcc +LD = gcc +STRIP = strip +BUILD = Build +TARGET = pokemini_musicconv +POKEROOT = ../../ +LIBS = -lopenal + +WINTARGET = pokemini_musicconv.exe +WINLIBS = -lOpenAL32 + +CFLAGS = -O -Wall $(INCLUDE) -DNO_ZIP +SLFLAGS = -O -lm -lz + +INCDIRS = source sourcex resource + +OBJS = \ + pokemini_musicconv.o \ + pm_music.o \ + saudio_al.o \ + raw_input.o \ + sourcex/ExportCode.o \ + sourcex/ExportC.o \ + sourcex/ExportASM.o \ + sourcex/ExportWAV.o \ + source/MinxTimers.o \ + source/MinxAudio.o \ + source/PMCommon.o + +DEPENDS_LOCAL = \ + saudio_al.h \ + raw_input.h \ + pokemini_musicconv.h \ + pm_music.h + +DEPENDS = \ + sourcex/ExportCode.h \ + sourcex/ExportC.h \ + sourcex/ExportASM.h \ + sourcex/ExportWAV.h \ + source/PokeMini.h \ + source/MinxTimers.h \ + source/MinxAudio.h \ + source/PMCommon.h + +BUILDOBJS = $(addprefix $(BUILD)/, $(notdir $(OBJS))) +DEPENDSHDR = $(addprefix $(POKEROOT), $(DEPENDS)) +INCLUDE = $(foreach inc, $(INCDIRS), -I$(POKEROOT)$(inc)) +VPATH = $(addprefix $(POKEROOT),$(INCDIRS)) + +.PHONY: all win clean + +all: $(BUILD) $(TARGET) + +$(BUILD): + @[ -d @ ] || mkdir -p $@ + +$(BUILD)/%.o: %.c $(DEPENDSHDR) $(DEPENDS_LOCAL) + $(CC) $(CFLAGS) -o $@ -c $< + +$(TARGET): $(BUILDOBJS) + $(LD) -o $(TARGET) $(BUILDOBJS) $(SLFLAGS) $(LIBS) + $(STRIP) $(TARGET) + if [ -d release ]; then cp $(TARGET) release; fi + +win: $(BUILD) $(WINTARGET) + +$(WINTARGET): $(BUILDOBJS) $(WINRES_SRC) + $(LD) -o $(WINTARGET) $(BUILDOBJS) $(WINRES_TRG) $(SLFLAGS) $(WINLIBS) + $(STRIP) $(WINTARGET) + if [ -d release ]; then cp $(WINTARGET) release; fi + +clean: + -rm -f $(BUILDOBJS) $(TARGET) $(WINTARGET) + -rmdir --ignore-fail-on-non-empty $(BUILD) diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pm_music.c b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pm_music.c new file mode 100644 index 0000000000..a5fb705a5d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pm_music.c @@ -0,0 +1,772 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "pm_music.h" + +#include "PokeMini.h" + +int PokeMini_Flags = 0; +uint8_t PM_RAM[8192]; +pmmusram pmmusic; + +const uint8_t pmmusic_voltable[] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x06, + 0x00, 0x06, 0x06, 0x07, + 0x00, 0x06, 0x02, 0x02, + 0x00, 0x06, 0x02, 0x03 +}; + +static void WriteReg(uint8_t reg, uint8_t data) +{ + if ((reg & 0x70) == 0x70) MinxAudio_WriteReg(reg, data); + else MinxTimers_WriteReg(reg, data); +} + +int pmmusic_initialize(int soundfifo, int sndengine, int sndfilter) +{ + int i; + for (i=0; i<8192; i++) PM_RAM[i] = 0x00; + if (!MinxTimers_Create()) return 0; + if (!MinxAudio_Create(soundfifo, soundfifo)) return 0; + MinxAudio_ChangeEngine(sndengine); + MinxAudio_ChangeFilter(sndfilter); + return 1; +} + +void pmmusic_terminate(void) +{ + MinxTimers_Destroy(); + MinxAudio_Destroy(); +} + +void pmmusic_init(uint16_t mastertime, uint8_t *ramptr) +{ + // Set master time + pmmusic.err = 0; + pmmusic.mtime = mastertime; + WriteReg(0x3A, mastertime); // Tmr2 Preset + WriteReg(0x3B, mastertime >> 8); + + // Set RAM pointer + pmmusic.ram_ptr = ramptr; + + // Registers to zero + pmmusic.aud_ena = 0; + pmmusic.bgm_frq = 0; + pmmusic.bgm_pvt = 0; + pmmusic.sfx_frq = 0; + pmmusic.sfx_pvt = 0; + pmmusic.hwvol = 0; + WriteReg(0x71, 0); // Audio Volume + WriteReg(0x38, 0); // Tmr2 Ctrl + WriteReg(0x39, 0); + pmmusic.hwpreset = 0; + WriteReg(0x4A, 0); // Tmr3 Preset + WriteReg(0x4B, 0); + pmmusic.hwpivot = 0; + WriteReg(0x4C, 0); // Tmr3 Pivot + WriteReg(0x4D, 0); + WriteReg(0x1B, 0); // Tmr2 Osc + WriteReg(0x1D, 0); // Tmr3 Osc + WriteReg(0x1A, PMMUSTMR_DIV_256); // Tmr2 Scale + WriteReg(0x1C, PMMUSTMR_DIV_2); // Tmr3 Scale + + // Registers to non-zero + pmmusic_setvolbgm(4); + pmmusic_setvolsfx(4); + WriteReg(0x48, 0x86); // Tmr3 Ctrl + WriteReg(0x49, 0); + WriteReg(0x19, 0x20); // Tmr1 Osc + Enable +} + +void pmmusic_setvolbgm(uint8_t volume) +{ + int i; + if (volume < 5) { + pmmusic.bgm_mvol = volume; + for (i=0; i<4; i++) pmmusic.bgm_tvol[i] = pmmusic_voltable[volume * 4 + i]; + } +} + +uint8_t pmmusic_getvolbgm(void) +{ + return pmmusic.bgm_mvol; +} + +void pmmusic_setvolsfx(uint8_t volume) +{ + int i; + if (volume < 5) { + pmmusic.sfx_mvol = volume; + for (i=0; i<4; i++) pmmusic.sfx_tvol[i] = pmmusic_voltable[volume * 4 + i]; + } +} + +uint8_t pmmusic_getvolsfx(void) +{ + return pmmusic.sfx_mvol; +} + +void pmtracker_setmastertime(uint16_t mtime) +{ + pmmusic.mtime = mtime; + WriteReg(0x3A, mtime); // Tmr2 Preset + WriteReg(0x3B, mtime >> 8); +} + +uint16_t pmtracker_getmastertime(void) +{ + return pmmusic.mtime; +} + +void pmmusic_playbgm(pmmusic_bgm *bgm) +{ + if (bgm->numpattern <= 0) return; + pmmusic.aud_ena &= 0x02; + pmmusic.bgm_ptb = bgm; + pmmusic.bgm_ptb_offset = 0; + pmmusic.bgm_ppr = bgm->pattern[0]; + pmmusic.bgm_ppr_offset = 0; + pmmusic.aud_ena |= 0x01; + pmmusic.bgm_wait = 1; + if (!(pmmusic.aud_ena & 2)) { + WriteReg(0x38, 0x86); // Tmr2 Ctrl + WriteReg(0x39, 0); + pmmusic.hwpreset = 0; + WriteReg(0x4A, 0); // Tmr3 Preset + WriteReg(0x4B, 0); + WriteReg(0x48, 0x86); // Tmr3 Ctrl + } +} + +void pmmusic_stopbgm(void) +{ + pmmusic.aud_ena &= 0x02; + if (pmmusic.aud_ena == 0) { + WriteReg(0x38, 0); + WriteReg(0x48, 0); + } +} + +void pmmusic_playsfx(pmmusic_sfx *sfx) +{ + pmmusic.aud_ena &= 0x01; + pmmusic.sfx_ppr = sfx; + pmmusic.sfx_ppr_offset = 0; + pmmusic.aud_ena |= 0x02; + pmmusic.sfx_wait = 1; + WriteReg(0x38, 0x86); // Tmr2 Ctrl + WriteReg(0x39, 0); + pmmusic.hwpreset = 0; + WriteReg(0x4A, 0); // Tmr3 Preset + WriteReg(0x4B, 0); + WriteReg(0x48, 0x86); // Tmr3 Ctrl +} + +void pmmusic_stopsfx(void) +{ + pmmusic.aud_ena &= 0x01; + if (pmmusic.aud_ena == 0) { + WriteReg(0x38, 0); + WriteReg(0x48, 0); + } +} + +void pmmusic_irq(void) +{ + pmmusic_cmd *cmd; + int recursivelimit = 65536; + uint16_t val16; + + // Process BGM + if (pmmusic.aud_ena & 0x01) { + // Decrease BGM wait + if (pmmusic.bgm_wait) pmmusic.bgm_wait--; + if (!pmmusic.bgm_wait) while (recursivelimit >= 0) { + recursivelimit--; + + // Read data from BGM pointer + cmd = &pmmusic.bgm_ppr->cmd[pmmusic.bgm_ppr_offset]; + // Set wait and volume + pmmusic.bgm_wait = cmd->wait; + if (cmd->flags & PMMUSIC_FLAG_VOL) { + pmmusic.bgm_pvol = pmmusic.bgm_tvol[cmd->volume & 3]; + } + // Increment BGM pointer to next command + pmmusic.bgm_ppr_offset++; + if (pmmusic.bgm_ppr_offset > pmmusic.bgm_ppr->numcmd) { + pmmusic.aud_ena = 0; + pmmusic.err = 1; + return; + } + // Write RAM + if (cmd->flags & PMMUSIC_FLAG_WRITERAM) { + if (pmmusic.ram_ptr) pmmusic.ram_ptr[cmd->ram_addr] = cmd->ram_data; + } + // Set Frequency + if (cmd->flags & PMMUSIC_FLAG_PRESET) { + pmmusic.bgm_frq = cmd->preset; + } + // Set Frequency + if (cmd->flags & PMMUSIC_FLAG_PIVOT) { + pmmusic.bgm_pvt = cmd->pivot; + } + // Jump pattern / End Sound + if (cmd->flags & PMMUSIC_FLAG_END) { + pmmusic_stopbgm(); + return; + } else if (cmd->flags & PMMUSIC_FLAG_PATTERN) { + val16 = cmd->pattern; + pmmusic.bgm_ptb_offset += (val16 >= 0x8000) ? (val16 - 65536) : val16; + if ((pmmusic.bgm_ptb_offset < 0) || (pmmusic.bgm_ptb_offset >= pmmusic.bgm_ptb->numpattern)) { + pmmusic.aud_ena = 0; + pmmusic.err = 2; + return; + } + pmmusic.bgm_ppr = pmmusic.bgm_ptb->pattern[pmmusic.bgm_ptb_offset]; + pmmusic.bgm_ppr_offset = 0; + } + // Loop + if (cmd->flags & PMMUSIC_FLAG_MARK) { + pmmusic.bgm_loop[cmd->loop_id & 3].ptb_offset = pmmusic.bgm_ptb_offset; + pmmusic.bgm_loop[cmd->loop_id & 3].ppr_offset = pmmusic.bgm_ppr_offset; + pmmusic.bgm_loop[cmd->loop_id & 3].loop_num = 0; + } else if (cmd->flags & PMMUSIC_FLAG_LOOP) { + if (pmmusic.bgm_loop[cmd->loop_id & 3].loop_num != cmd->loop_num) { + pmmusic.bgm_loop[cmd->loop_id & 3].loop_num++; + pmmusic.bgm_ptb_offset = pmmusic.bgm_loop[cmd->loop_id & 3].ptb_offset; + pmmusic.bgm_ppr = pmmusic.bgm_ptb->pattern[pmmusic.bgm_ptb_offset]; + pmmusic.bgm_ppr_offset = pmmusic.bgm_loop[cmd->loop_id & 3].ppr_offset; + } + } + // All done! + if (!pmmusic.bgm_wait) continue; + // Check SFX first as it have higher priority + if (!pmmusic.sfx_mvol || !(pmmusic.aud_ena & 2)) { + val16 = pmmusic.bgm_frq; + WriteReg(0x4A, val16); // Tmr3 Preset + WriteReg(0x4B, val16 >> 8); + val16 = pmmusic.bgm_pvt; + if (pmmusic.bgm_pvol & 4) { + val16 >>= 4; + } + WriteReg(0x4C, val16); // Tmr3 Pivot + WriteReg(0x4D, val16 >> 8); + WriteReg(0x71, pmmusic.bgm_pvol & 3); // Audio Volume + } + break; + } + } + + // Process SFX + if (pmmusic.aud_ena & 0x02) { + // Decrease SFX wait + if (pmmusic.sfx_wait) pmmusic.sfx_wait--; + if (!pmmusic.sfx_wait) while (recursivelimit >= 0) { + recursivelimit--; + + // Read data from SFX pointer + cmd = &pmmusic.sfx_ppr->cmd[pmmusic.sfx_ppr_offset]; + // Set wait and volume + pmmusic.sfx_wait = cmd->wait; + if (cmd->flags & PMMUSIC_FLAG_VOL) { + pmmusic.sfx_pvol = pmmusic.sfx_tvol[cmd->volume & 3]; + } + // Increment SFX pointer to next command + pmmusic.sfx_ppr_offset++; + if (pmmusic.sfx_ppr_offset > pmmusic.sfx_ppr->numcmd) { + pmmusic.aud_ena = 0; + pmmusic.err = 3; + return; + } + // Write RAM + if (cmd->flags & PMMUSIC_FLAG_WRITERAM) { + if (pmmusic.ram_ptr) pmmusic.ram_ptr[cmd->ram_addr] = cmd->ram_data; + } + // Set Frequency + if (cmd->flags & PMMUSIC_FLAG_PRESET) { + pmmusic.sfx_frq = cmd->preset; + } + // Set Frequency + if (cmd->flags & PMMUSIC_FLAG_PIVOT) { + pmmusic.sfx_pvt = cmd->pivot; + } + // Jump pattern / End Sound + if (cmd->flags & PMMUSIC_FLAG_END) { + pmmusic_stopsfx(); + return; + } else if (cmd->flags & PMMUSIC_FLAG_PATTERN) { + pmmusic_stopsfx(); + return; + } + // Loop + if (cmd->flags & PMMUSIC_FLAG_MARK) { + pmmusic.sfx_loop[cmd->loop_id & 3].ppr_offset = pmmusic.sfx_ppr_offset; + pmmusic.sfx_loop[cmd->loop_id & 3].loop_num = 0; + } else if (cmd->flags & PMMUSIC_FLAG_LOOP) { + if (pmmusic.sfx_loop[cmd->loop_id & 3].loop_num != cmd->loop_num) { + pmmusic.sfx_loop[cmd->loop_id & 3].loop_num++; + pmmusic.sfx_ppr_offset = pmmusic.sfx_loop[cmd->loop_id & 3].ppr_offset; + } + } + // All done! + if (!pmmusic.sfx_wait) continue; + // Check SFX first as it have higher priority + val16 = pmmusic.sfx_frq; + WriteReg(0x4A, val16); // Tmr3 Preset + WriteReg(0x4B, val16 >> 8); + val16 = pmmusic.sfx_pvt; + if (pmmusic.sfx_pvol & 4) { + val16 >>= 4; + } + WriteReg(0x4C, val16); // Tmr3 Pivot + WriteReg(0x4D, val16 >> 8); + WriteReg(0x71, pmmusic.sfx_pvol & 3); // Audio Volume + break; + } + } + + if (recursivelimit <= 0) { + pmmusic.aud_ena = 0; + pmmusic.err = 4; + return; + } +} + +void MinxCPU_OnIRQAct(uint8_t intr) +{ + if (intr == MINX_INTR_05) { + pmmusic_irq(); + } +} + +int PokeHWCycles = 0; +void pmmusic_emulate(int lcylc) +{ + PokeHWCycles = 16; + if (RequireSoundSync) { + while (lcylc > 0) { + MinxTimers_Sync(); + MinxAudio_Sync(); + lcylc -= PokeHWCycles; + } + } else { + while (lcylc > 0) { + MinxTimers_Sync(); + lcylc -= PokeHWCycles; + } + } +} + +// ------- +// Command + +int pmmusic_cmd2raw(pmmusic_cmd *cmd, uint16_t *data) +{ + int idx = 1; + int flags; + + if (!cmd) return 0; + flags = cmd->flags; + + data[0] = cmd->wait; + if (flags & PMMUSIC_FLAG_VOL) { + data[0] |= 0x0400 + ((cmd->volume & 3) << 8); + } else { + data[0] |= 0x0300; + } + if (flags & PMMUSIC_FLAG_WRITERAM) { + data[0] |= 0x0800; + data[idx++] = (cmd->ram_addr << 8) | cmd->ram_data; + } + if (flags & PMMUSIC_FLAG_PRESET) { + data[0] |= 0x1000; + data[idx++] = cmd->preset; + } + if (flags & PMMUSIC_FLAG_PIVOT) { + data[0] |= 0x2000; + data[idx++] = cmd->pivot; + } + if (flags & PMMUSIC_FLAG_END) { + data[0] &= 0xFC00; + data[0] |= 0x4401; + data[idx++] = 0x0000; + } else if (flags & PMMUSIC_FLAG_PATTERN) { + data[0] |= 0x4000; + data[idx++] = cmd->pattern * 4; + } + if (flags & PMMUSIC_FLAG_MARK) { + data[0] |= 0x8000; + data[idx++] = (cmd->loop_id << 10); + } else if (flags & PMMUSIC_FLAG_LOOP) { + if (cmd->loop_num) { + data[0] |= 0x8000; + data[idx++] = (cmd->loop_id << 10) | (cmd->loop_num & 255); + } + } + return idx; +} + +// ------- +// Pattern + +pmmusic_pattern *pmmusic_newpattern(const char *varname, int param) +{ + pmmusic_pattern *pattern; + pattern = (pmmusic_pattern *)malloc(sizeof(pmmusic_pattern)); + if (!pattern) return NULL; + memset(pattern->varname, 0, 256); + strncpy(pattern->varname, varname, 255); + pattern->param = param; + pattern->alloccmd = 1; + pattern->numcmd = 0; + pattern->cmd = (pmmusic_cmd *)malloc(pattern->alloccmd * sizeof(pmmusic_cmd)); + if (!pattern->cmd) return NULL; + pattern->allocraw = 1; + pattern->numraw = 0; + pattern->raw = (uint16_t *)malloc(pattern->allocraw * sizeof(uint16_t)); + if (!pattern->raw) return NULL; + return pattern; +} + +void pmmusic_deletepattern(pmmusic_pattern *pattern) +{ + if (pattern) { + if (pattern->cmd) free((void *)pattern->cmd); + if (pattern->raw) free((void *)pattern->raw); + free((void *)pattern); + } +} + +void pmmusic_expandpattern(pmmusic_pattern *pattern) +{ + if (pattern->numcmd >= pattern->alloccmd) { + pattern->alloccmd += pattern->alloccmd; + pattern->cmd = (pmmusic_cmd *)realloc(pattern->cmd, pattern->alloccmd * sizeof(pmmusic_cmd)); + } + if (pattern->numraw >= pattern->allocraw) { + pattern->allocraw += pattern->allocraw; + pattern->raw = (uint16_t *)realloc(pattern->raw, pattern->allocraw * sizeof(uint16_t)); + } +} + +// --- +// BGM + +pmmusic_bgm *pmmusic_newbgm(const char *varname, int param) +{ + pmmusic_bgm *bgm; + bgm = (pmmusic_bgm *)malloc(sizeof(pmmusic_bgm)); + if (!bgm) return NULL; + memset(bgm->varname, 0, 256); + strncpy(bgm->varname, varname, 255); + bgm->param = param; + bgm->allocpattern = 1; + bgm->numpattern = 0; + bgm->pattern = (pmmusic_pattern **)malloc(bgm->allocpattern * sizeof(pmmusic_pattern *)); + if (!bgm->pattern) return NULL; + return bgm; +} + +void pmmusic_deletebgm(pmmusic_bgm *bgm) +{ + if (bgm) { + if (bgm->pattern) free((void *)bgm->pattern); + free((void *)bgm); + } +} + +void pmmusic_expandbgm(pmmusic_bgm *bgm) +{ + if (bgm->numpattern >= bgm->allocpattern) { + bgm->allocpattern += bgm->allocpattern; + bgm->pattern = (pmmusic_pattern **)realloc(bgm->pattern, bgm->allocpattern * sizeof(pmmusic_pattern *)); + } +} + +// ---- +// List + +pmmusic_list *pmmusic_newlist(void) +{ + pmmusic_list *list; + list = (pmmusic_list *)malloc(sizeof(pmmusic_list)); + if (!list) return NULL; + list->pattern = NULL; + list->bgm = NULL; + list->sfx = NULL; + + list->allocpattern = 1; + list->numpattern = 0; + list->pattern = (pmmusic_pattern **)malloc(list->allocpattern * sizeof(pmmusic_pattern *)); + if (!list->pattern) { + pmmusic_deletelist(list); + return NULL; + } + + list->allocbgm = 1; + list->numbgm = 0; + list->bgm = (pmmusic_bgm **)malloc(list->allocbgm * sizeof(pmmusic_bgm *)); + if (!list->bgm) { + pmmusic_deletelist(list); + return NULL; + } + + list->allocsfx = 1; + list->numsfx = 0; + list->sfx = (pmmusic_sfx **)malloc(list->allocsfx * sizeof(pmmusic_sfx *)); + if (!list->sfx) { + pmmusic_deletelist(list); + return NULL; + } + return list; +} + +void pmmusic_deletelist(pmmusic_list *list) +{ + int i; + if (list) { + if (list->pattern) { + for (i=0; inumpattern; i++) pmmusic_deletepattern(list->pattern[i]); + free((void *)list->pattern); + } + if (list->bgm) { + for (i=0; inumbgm; i++) pmmusic_deletebgm(list->bgm[i]); + free((void *)list->bgm); + } + if (list->sfx) { + for (i=0; inumsfx; i++) pmmusic_deletepattern(list->sfx[i]); + free((void *)list->sfx); + } + free((void *)list); + } +} + +pmmusic_pattern *pmmusic_newPAT(pmmusic_list *list, const char *varname, int param) +{ + if (list->numpattern >= list->allocpattern) { + list->allocpattern += list->allocpattern; + list->pattern = (pmmusic_pattern **)realloc(list->pattern, list->allocpattern * sizeof(pmmusic_pattern *)); + } + list->pattern[list->numpattern] = pmmusic_newpattern(varname, param); + return list->pattern[list->numpattern++]; +} + +pmmusic_bgm *pmmusic_newBGM(pmmusic_list *list, const char *varname, int param) +{ + if (list->numbgm >= list->allocbgm) { + list->allocbgm += list->allocbgm; + list->bgm = (pmmusic_bgm **)realloc(list->bgm, list->allocbgm * sizeof(pmmusic_bgm *)); + } + list->bgm[list->numbgm] = pmmusic_newbgm(varname, param); + return list->bgm[list->numbgm++]; +} + +pmmusic_sfx *pmmusic_newSFX(pmmusic_list *list, const char *varname, int param) +{ + if (list->numsfx >= list->allocsfx) { + list->allocsfx += list->allocsfx; + list->sfx = (pmmusic_sfx **)realloc(list->sfx, list->allocsfx * sizeof(pmmusic_sfx *)); + } + list->sfx[list->numsfx] = pmmusic_newpattern(varname, param); + return list->sfx[list->numsfx++]; +} + +int pmmusic_delPAT(pmmusic_list *list, pmmusic_pattern *pattern) +{ + int i, j; + for (i=0; inumpattern; i++) { + if (pattern == list->pattern[i]) { + pmmusic_deletepattern(pattern); + for (j=i; jnumpattern-1; j++) { + list->pattern[j] = list->pattern[j+1]; + } + list->numpattern--; + return 1; + } + } + return 0; +} + +int pmmusic_delBGM(pmmusic_list *list, pmmusic_bgm *bgm) +{ + int i, j; + for (i=0; inumbgm; i++) { + if (bgm == list->bgm[i]) { + pmmusic_deletebgm(bgm); + for (j=i; jnumbgm-1; j++) { + list->bgm[j] = list->bgm[j+1]; + } + list->numbgm--; + return 1; + } + } + return 0; +} + +int pmmusic_delSFX(pmmusic_list *list, pmmusic_sfx *sfx) +{ + int i, j; + for (i=0; inumsfx; i++) { + if (sfx == list->sfx[i]) { + pmmusic_deletepattern(sfx); + for (j=i; jnumsfx-1; j++) { + list->sfx[j] = list->sfx[j+1]; + } + list->numsfx--; + return 1; + } + } + return 0; +} + +int pmmusic_existVAR(pmmusic_list *list, const char *varname, int *type, int *index) +{ + int i; + for (i=0; inumpattern; i++) { + if (!strcasecmp(varname, list->pattern[i]->varname)) { + if (type) *type = 0; + if (index) *index = i; + return 1; + } + } + for (i=0; inumbgm; i++) { + if (!strcasecmp(varname, list->bgm[i]->varname)) { + if (type) *type = 1; + if (index) *index = i; + return 1; + } + } + for (i=0; inumsfx; i++) { + if (!strcasecmp(varname, list->sfx[i]->varname)) { + if (type) *type = 2; + if (index) *index = i; + return 1; + } + } + return 0; +} + +pmmusic_pattern *pmmusic_getPAT(pmmusic_list *list, const char *varname, int *index) +{ + int i; + for (i=0; inumpattern; i++) { + if (!strcasecmp(varname, list->pattern[i]->varname)) { + if (index) *index = i; + return list->pattern[i]; + } + } + return NULL; +} + +pmmusic_bgm *pmmusic_getBGM(pmmusic_list *list, const char *varname, int *index) +{ + int i; + for (i=0; inumbgm; i++) { + if (!strcasecmp(varname, list->bgm[i]->varname)) { + if (index) *index = i; + return list->bgm[i]; + } + } + return NULL; +} + +pmmusic_pattern *pmmusic_getSFX(pmmusic_list *list, const char *varname, int *index) +{ + int i; + for (i=0; inumsfx; i++) { + if (!strcasecmp(varname, list->sfx[i]->varname)) { + if (index) *index = i; + return list->sfx[i]; + } + } + return NULL; +} + +int pmmusic_addSEQ(pmmusic_bgm *bgm, pmmusic_pattern *pattern, int index) +{ + int j; + if ((index < -1) || (index > bgm->numpattern)) return 0; + if (index == -1) index = bgm->numpattern; + pmmusic_expandbgm(bgm); + if (index != bgm->numpattern) { + for (j=bgm->numpattern-1; j>=index; j++) { + bgm->pattern[j+1] = bgm->pattern[j]; + } + } + bgm->pattern[index] = pattern; + bgm->numpattern++; + return 1; +} + +int pmmusic_delSEQ(pmmusic_bgm *bgm, int index) +{ + int j; + if ((index < 0) || (index >= bgm->numpattern)) return 0; + for (j=index; jnumpattern-1; j++) { + bgm->pattern[j] = bgm->pattern[j+1]; + } + bgm->numpattern--; + return 1; +} + +int pmmusic_addCMD(pmmusic_pattern *pattern, pmmusic_cmd *cmd, int index) +{ + int j; + if ((index < -1) || (index > pattern->numcmd)) return 0; + if (index == -1) index = pattern->numcmd; + pmmusic_expandpattern(pattern); + if (index != pattern->numcmd) { + for (j=pattern->numcmd-1; j>=index; j++) { + memcpy(&pattern->cmd[j+1], &pattern->cmd[j], sizeof(pmmusic_cmd)); + } + } + memcpy(&pattern->cmd[index], cmd, sizeof(pmmusic_cmd)); + pattern->numcmd++; + return 1; +} + +int pmmusic_delCMD(pmmusic_pattern *pattern, int index) +{ + int j; + if ((index < 0) || (index >= pattern->numcmd)) return 0; + for (j=index; jnumcmd-1; j++) { + memcpy(&pattern->cmd[j], &pattern->cmd[j+1], sizeof(pmmusic_cmd)); + } + pattern->numcmd--; + return 1; +} + +int pmmusic_asmPAT(pmmusic_pattern *pattern) +{ + uint16_t data[8]; + int i, j, siz; + pattern->numraw = 0; + for (i=0; inumcmd; i++) { + siz = pmmusic_cmd2raw(&pattern->cmd[i], data); + for (j=0; jraw[pattern->numraw++] = data[j]; + } + } + return 1; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pm_music.h b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pm_music.h new file mode 100644 index 0000000000..9a79fb2137 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pm_music.h @@ -0,0 +1,210 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PM_MUSIC_H +#define PM_MUSIC_H + +#include + +enum { + PMMUSTMR_DIV_OFF = 0, + PMMUSTMR_DIV_2 = 8, + PMMUSTMR_DIV_8 = 9, + PMMUSTMR_DIV_32 = 10, + PMMUSTMR_DIV_64 = 11, + PMMUSTMR_DIV_128 = 12, + PMMUSTMR_DIV_256 = 13, + PMMUSTMR_DIV_1024 = 14, + PMMUSTMR_DIV_4096 = 15 +}; + +enum { + PMMUSIC_FLAG_VOL = 1, + PMMUSIC_FLAG_WRITERAM = 2, + PMMUSIC_FLAG_PRESET = 4, + PMMUSIC_FLAG_PIVOT = 8, + PMMUSIC_FLAG_END = 16, + PMMUSIC_FLAG_PATTERN = 32, + PMMUSIC_FLAG_MARK = 64, + PMMUSIC_FLAG_LOOP = 128, +}; + +typedef struct { + int flags; // Flags + int wait; // Wait (0 = immediate) + uint8_t volume; // Volume (0 to 3) + uint8_t ram_addr; // RAM address (0 to 255) + uint8_t ram_data; // RAM data (0 to 255) + uint16_t preset; // Preset + uint16_t pivot; // Pivot + int pattern; // Pattern offset + uint8_t loop_id; // Loop ID (0 to 3) + uint8_t loop_num; // Number of loops (0 to 255) +} pmmusic_cmd; + +typedef struct { + void *metadata; // Meta data + char varname[256]; // Variable name + int param; // Parameter + + // Commands list + int alloccmd; // Num. allocated commands + int numcmd; // Number of commands + pmmusic_cmd *cmd; // Commands structures + + // Assembled commands list + int allocraw; // Num. allocated RAW commands + int numraw; // Number of RAW commands + uint16_t *raw; // RAW commands structures +} pmmusic_pattern, pmmusic_sfx; + +typedef struct { + void *metadata; // Meta data + char varname[256]; // Variable name + int param; // Parameter + + // Patterns list + int allocpattern; // Num. allocated patterns + int numpattern; // Number of patterns + pmmusic_pattern **pattern; // Patterns pointers +} pmmusic_bgm; + +typedef struct { + // Hardware + int err; + uint16_t mtime; + uint16_t hwpreset; + uint16_t hwpivot; + uint8_t hwvol; + + // Main Data + uint8_t aud_ena; + uint8_t *ram_ptr; + pmmusic_bgm *bgm_ptb; + int bgm_ptb_offset; + + // BGM Data + uint8_t bgm_wait; + uint8_t bgm_mvol; + uint8_t bgm_pvol; + pmmusic_pattern *bgm_ppr; + int bgm_ppr_offset; + uint16_t bgm_frq; + uint16_t bgm_pvt; + uint8_t bgm_tvol[4]; + struct { + int ptb_offset; + int ppr_offset; + uint8_t loop_num; + } bgm_loop[4]; + + // SFX Data + uint8_t sfx_wait; + uint8_t sfx_mvol; + uint8_t sfx_pvol; + pmmusic_sfx *sfx_ppr; + int sfx_ppr_offset; + uint16_t sfx_frq; + uint16_t sfx_pvt; + uint8_t sfx_tvol[4]; + struct { + int ppr_offset; + uint8_t loop_num; + } sfx_loop[4]; +} pmmusram; + +typedef struct { + void *metadata; // Meta data + + // Patterns list + int allocpattern; // Num. allocated BGM Patterns + int numpattern; // Number of BGM Patterns + pmmusic_pattern **pattern; // BGM Patterns pointers + void *metadata_pattern; // Meta data (Patterns) + + // BGM list + int allocbgm; // Num. allocated SFXs + int numbgm; // Number of BGMs + pmmusic_bgm **bgm; // BGMs pointers + void *metadata_bgm; // Meta data (BGM) + + // SFX list + int allocsfx; // Num. allocated SFXs + int numsfx; // Number of SFXs + pmmusic_sfx **sfx; // SFXs pointers + void *metadata_sfx; // Meta data (SFX) +} pmmusic_list; + +extern pmmusram pmmusic; + +// Initialize / Terminate +int pmmusic_initialize(int soundfifo, int sndengine, int sndfilter); +void pmmusic_terminate(void); + +// Playback +void pmmusic_init(uint16_t mastertempo, uint8_t *ramptr); +uint8_t pmmusic_getvolbgm(void); +void pmmusic_setvolbgm(uint8_t volume); +uint8_t pmmusic_getvolsfx(void); +void pmmusic_setvolsfx(uint8_t volume); +void pmmusic_playbgm(pmmusic_bgm *bgm); +void pmmusic_stopbgm(void); +void pmmusic_playsfx(pmmusic_sfx *sfx); +void pmmusic_stopsfx(void); +void pmmusic_emulate(int lcylc); + +// Command +int pmmusic_cmd2raw(pmmusic_cmd *cmd, uint16_t *data); + +// Pattern +pmmusic_pattern *pmmusic_newpattern(const char *varname, int param); +void pmmusic_deletepattern(pmmusic_pattern *pattern); +void pmmusic_expandpattern(pmmusic_pattern *pattern); + +// BGM +pmmusic_bgm *pmmusic_newbgm(const char *varname, int param); +void pmmusic_deletebgm(pmmusic_bgm *bgm); +void pmmusic_expandbgm(pmmusic_bgm *bgm); + +// List +pmmusic_list *pmmusic_newlist(); +void pmmusic_deletelist(pmmusic_list *list); + +pmmusic_pattern *pmmusic_newPAT(pmmusic_list *list, const char *varname, int param); +pmmusic_bgm *pmmusic_newBGM(pmmusic_list *list, const char *varname, int param); +pmmusic_sfx *pmmusic_newSFX(pmmusic_list *list, const char *varname, int param); + +int pmmusic_delPAT(pmmusic_list *list, pmmusic_pattern *pattern); +int pmmusic_delBGM(pmmusic_list *list, pmmusic_bgm *bgm); +int pmmusic_delSFX(pmmusic_list *list, pmmusic_sfx *sfx); + +int pmmusic_existVAR(pmmusic_list *list, const char *varname, int *type, int *index); + +pmmusic_pattern *pmmusic_getPAT(pmmusic_list *list, const char *varname, int *index); +pmmusic_bgm *pmmusic_getBGM(pmmusic_list *list, const char *varname, int *index); +pmmusic_sfx *pmmusic_getSFX(pmmusic_list *list, const char *varname, int *index); + +int pmmusic_addSEQ(pmmusic_bgm *bgm, pmmusic_pattern *pattern, int index); +int pmmusic_delSEQ(pmmusic_bgm *bgm, int index); + +int pmmusic_addCMD(pmmusic_pattern *pattern, pmmusic_cmd *cmd, int index); +int pmmusic_delCMD(pmmusic_pattern *pattern, int index); + +int pmmusic_asmPAT(pmmusic_pattern *pattern); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pokemini_musicconv.c b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pokemini_musicconv.c new file mode 100644 index 0000000000..8dfc20fcfc --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pokemini_musicconv.c @@ -0,0 +1,2051 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#include "saudio_al.h" +#include "raw_input.h" + +#include "PMCommon.h" +#include "PokeMini.h" +#include "ExportCode.h" +#include "ExportWAV.h" +#include "pokemini_musicconv.h" +#include "pm_music.h" + +#define VERSION_STR "v1.4" +#define EXPORT_STR "Music exported with PokeMini Music Converter " VERSION_STR + +#define STR_MTIME "%s_mastertime" +#define STR_TITLE "%s_title" +#define STR_COMPOSER "%s_composer" +#define STR_PROGRAMMER "%s_programmer" +#define STR_DESCRIPTION "%s_description" +#define STR_NUMPAT "%s_numpat" +#define STR_NUMBGM "%s_numbgm" +#define STR_NUMSFX "%s_numsfx" + +#define STR_APPEND_SFX "_sfxlist" +#define STR_APPEND_BGM "_bgmlist" + +// Sound buffer size +#define SOUNDBUFFER 2048 +#define PMSNDBUFFER (SOUNDBUFFER*4) +FILE *sdump = NULL; + +// ---------- Header ---------- + +char p_file[128]; +int p_line; +int p_recursive = 0; +int p_comment = 0; +int p_brace = 0; +int p_dloop = 0; +int p_bpat = 0, p_bpatloop = -1; +int notbreak = 1; + +pmmusic_list *musiclist; +pmmusic_pattern *macro_pat[26] = {NULL}; + +struct { + int quiet; // Quiet + int verbose; // Verbose + int sndengine; // Sound engine + int sndfilter; // Piezo filter + char mus_f[128]; // Music file + char mus_v[128]; // Music variable name + int format; // 1 = Asm, 2 = C + char out_f[128]; // Output file + char outh_f[128]; // Output header file + char outl_f[128]; // Output sound list file + char sfx_v[128]; // SFX variable name + char bgm_v[128]; // BGM variable name + char rec_f[128]; // Record music file + char play_v[128]; // Playback variable name +} confs; + +struct { + char title[256]; // Title + char composer[256]; // Composer name + char programmer[256]; // Programmer name + char description[256]; // Description + uint8_t ram[256]; // RAM content for modules + int vollevel; // Volume level: 0 = MML (0 to 15), 1 = System (0 to 3) + int octrev; // Reverse octave characters? + int shortq; // Shorter quantize range? + int mastertime_set; // Master time has been set? + int mastertime_val; // Master time value + struct { + int wait; // Wait + int note; // Note + int note2; // Note 2 for effects + int note3; // Note 3 for effects + int ramaddr; // RAM address + int ramdata; // RAM data + int length; // Length + int octave; // Octave + int volume; // Volume + int pulse; // Pulse-width + int quantize; // Quantize + int arpptr; // Arpeggio pointer + int efftype; // Effect type + int efftick; // Effect ticks + int sustain; // Sustain + } cur; + struct { + int wait; // Wait + int note; // Note + int note2; // Note 2 for effects + int note3; // Note 3 for effects + int ramaddr; // RAM address + int ramdata; // RAM data + int length; // Length + int octave; // Octave + int volume; // Volume + int pulse; // Pulse-width + int quantize; // Quantize + int arpptr; // Arpeggio pointer + int efftype; // Effect type + int efftick; // Effect ticks + int sustain; // Sustain + } def; +} musicsh; + +enum { + EFFECT_DISABLED, + EFFECT_ARPEGGIO, + EFFECT_PORTAMENTO, + EFFECT_RANDOM +} EffectsTypes; + +// ---------- Conf ---------- + +// Initialize confs +void init_confs() +{ + memset((void *)&confs, 0, sizeof(confs)); + confs.format = FILE_ECODE_ASM; + confs.sndengine = MINX_AUDIO_DIRECT; + confs.sndfilter = 1; +} + +// Load confs from arguments +int load_confs_args(int argc, char **argv) +{ + argv++; + while (*argv) { + if (*argv[0] == '-') { + if (!strcasecmp(*argv, "-asmf")) confs.format = FILE_ECODE_ASM; + else if (!strcasecmp(*argv, "-cf")) confs.format = FILE_ECODE_C; + else if (!strcasecmp(*argv, "-i")) { if (*++argv) strncpy(confs.mus_f, *argv, 127); } + else if (!strcasecmp(*argv, "-in")) { if (*++argv) strncpy(confs.mus_f, *argv, 127); } + else if (!strcasecmp(*argv, "-input")) { if (*++argv) strncpy(confs.mus_f, *argv, 127); } + else if (!strcasecmp(*argv, "-o")) { if (*++argv) strncpy(confs.out_f, *argv, 127); } + else if (!strcasecmp(*argv, "-out")) { if (*++argv) strncpy(confs.out_f, *argv, 127); } + else if (!strcasecmp(*argv, "-output")) { if (*++argv) strncpy(confs.out_f, *argv, 127); } + else if (!strcasecmp(*argv, "-oh")) { if (*++argv) strncpy(confs.outh_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outheader")) { if (*++argv) strncpy(confs.outh_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outputheader")) { if (*++argv) strncpy(confs.outh_f, *argv, 127); } + else if (!strcasecmp(*argv, "-ol")) { if (*++argv) strncpy(confs.outl_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outlist")) { if (*++argv) strncpy(confs.outl_f, *argv, 127); } + else if (!strcasecmp(*argv, "-outputlist")) { if (*++argv) strncpy(confs.outl_f, *argv, 127); } + else if (!strcasecmp(*argv, "-vh")) { if (*++argv) strncpy(confs.mus_v, *argv, 127); } + else if (!strcasecmp(*argv, "-varheader")) { if (*++argv) strncpy(confs.mus_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vsfx")) { if (*++argv) strncpy(confs.sfx_v, *argv, 127); } + else if (!strcasecmp(*argv, "-varsfx")) { if (*++argv) strncpy(confs.sfx_v, *argv, 127); } + else if (!strcasecmp(*argv, "-vbgm")) { if (*++argv) strncpy(confs.bgm_v, *argv, 127); } + else if (!strcasecmp(*argv, "-varbgm")) { if (*++argv) strncpy(confs.bgm_v, *argv, 127); } + else if (!strcasecmp(*argv, "-snddirect")) confs.sndengine = MINX_AUDIO_DIRECT; + else if (!strcasecmp(*argv, "-sndemulated")) confs.sndengine = MINX_AUDIO_EMULATED; + else if (!strcasecmp(*argv, "-piezo")) confs.sndfilter = 1; + else if (!strcasecmp(*argv, "-nopiezo")) confs.sndfilter = 0; + else if (!strcasecmp(*argv, "-q")) confs.quiet = 1; + else if (!strcasecmp(*argv, "-v")) confs.verbose = 1; + else if (!strcasecmp(*argv, "-sv")) confs.verbose = 2; + else if (!strcasecmp(*argv, "-play")) { + if (*++argv) strncpy(confs.play_v, *argv, 127); + } + else if (!strcasecmp(*argv, "-towav")) { + if (*++argv) strncpy(confs.rec_f, *argv, 127); + } + else return 0; + } else return 0; + if (*argv) argv++; + } + + // Music filename cannot be empty + if (!strlen(confs.mus_f)) return 0; + + return 1; +} + +// ---------- Converter ---------- + +// Notes table (Octave 1 to 7) +int N_Note[7*12] = { + 0xEEE3, 0xE17A, 0xD4D2, 0xC8E0, 0xBD9A, 0xB2F6, 0xA8EA, 0x9F6F, 0x967C, 0x8E0A, 0x8611, 0x7E8B, + 0x7771, 0x70BC, 0x6A68, 0x646F, 0x5ECC, 0x597A, 0x5474, 0x4FB7, 0x4B3D, 0x4704, 0x4308, 0x3F45, + 0x3BB8, 0x385D, 0x3533, 0x3237, 0x2F65, 0x2CBC, 0x2A39, 0x27DB, 0x259E, 0x2381, 0x2183, 0x1FA2, + 0x1DDB, 0x1C2E, 0x1A99, 0x191B, 0x17B2, 0x165D, 0x151C, 0x13ED, 0x12CE, 0x11C0, 0x10C1, 0x0FD0, + 0x0EED, 0x0E16, 0x0D4C, 0x0C8D, 0x0BD8, 0x0B2E, 0x0A8D, 0x09F6, 0x0966, 0x08DF, 0x0860, 0x07E7, + 0x0776, 0x070A, 0x06A5, 0x0646, 0x05EB, 0x0596, 0x0546, 0x04FA, 0x04B2, 0x046F, 0x042F, 0x03F3, + 0x03BA, 0x0384, 0x0352, 0x0322, 0x02F5, 0x02CA, 0x02A2, 0x027C, 0x0258, 0x0237, 0x0217, 0x01F9 +}; + +// Get note frequency from offsets +uint16_t getnotefreq(int noteoff, int octoff) +{ + octoff--; + int num = (octoff * 12) + (noteoff - 12); + if ((num < 0) || (num >= (7*12))) return 0xFFFF; + if (num < 0) num = 0; + if (num >= (7*12)) num = 7*12-1; + return N_Note[num]; +} + +// Level: -1 = Error, 0 = Warning, 1 = Default, 2 = Verbose, 3 = Super-verbose +void Pprintf(int level, const char *fmt, ...) +{ + va_list args; + + // Permission + if (level > 0) { + if (confs.quiet) return; + if ((level == 2) && (confs.verbose < 1)) return; + if ((level == 3) && (confs.verbose < 2)) return; + } + + // Output + va_start(args, fmt); + if (level >= 0) printf("%s[%i] ", p_file, p_line); + else fprintf(stderr, "%s[%i] ", p_file, p_line); + vprintf(fmt, args); + va_end(args); +} + +// Remove comments (C style) +void RemoveCommentsC(char *so) +{ + char *s = so; + while (*s) { + if ((s[0] == '/') && (s[1] == '*')) { + p_comment = 1; + strcpy(s, s+2); + } else if ((s[0] == '*') && (s[1] == '/')) { + p_comment = 0; + strcpy(s, s+2); + } + if (p_comment) { + strcpy(s, s+1); + } else { + if ((s[0] == '/') && (s[1] == '/')) { + if (!p_comment) *s = 0; + break; + } else s++; + } + } +} + +// Read number +const char *readmus_num(const char *s, int *nout, int maxhdigits) +{ + int hexmode = 0, digits = 0, num = 0, negsign = 0; + do { s++; } while ((*s == ' ') || (*s == '\t')); // Skipping 1 is intentional + if ((s[0] == '0') && (tolower(s[1]) == 'x')) { hexmode = 1; s += 2; } + else if (s[0] == '$') { hexmode = 1; s++; } + if (s[0] == '-') { negsign = 1; s++; } + while (*s != 0) { + if (hexmode) { + if (digits == maxhdigits) break; + if ((*s >= '0') && (*s <= '9')) num = (num * 16) + (*s - '0'); + else if ((*s >= 'A') && (*s <= 'F')) num = (num * 16) + (*s - 'A'); + else if ((*s >= 'a') && (*s <= 'f')) num = (num * 16) + (*s - 'a'); + else break; + digits++; + } else { + if ((*s >= '0') && (*s <= '9')) num = (num * 10) + (*s - '0'); + else break; + digits++; + } + s++; + } + if (nout && digits) *nout = negsign ? -num : num; + return s-1; +} + +// Read line +char *readmus_line(FILE *fi, char *s, int len) +{ + if (!fgets(s, len, fi)) return 0; + p_line++; + RemoveCommentsC(s); + return TrimStr(s); +} + +// Add note from specs +void pattern_addnote(pmmusic_pattern *pattern, int wait, int portoff, int porttot, int preset, int preset2, int preset3, int volume) +{ + pmmusic_cmd cmd; + int posfx; + if (wait <= 0) wait = 1; + do { + // Wait + cmd.wait = (wait > 255) ? 255 : wait; + if (volume && musicsh.cur.efftype) cmd.wait = musicsh.cur.efftick; + // Flags + cmd.flags = PMMUSIC_FLAG_VOL; + if (preset >= 0) cmd.flags |= PMMUSIC_FLAG_PRESET | PMMUSIC_FLAG_PIVOT; + if (musicsh.cur.ramaddr >= 0) cmd.flags |= PMMUSIC_FLAG_WRITERAM; + // Effects + if (musicsh.cur.efftype == EFFECT_ARPEGGIO) { + if (musicsh.def.arpptr == 0) cmd.preset = preset; + else if (musicsh.def.arpptr == 1) cmd.preset = preset2; + else if (musicsh.def.arpptr == 2) cmd.preset = preset3; + } else if (musicsh.cur.efftype == EFFECT_PORTAMENTO) { + posfx = portoff * 32768 / porttot; + cmd.preset = ((32768-posfx) * preset + posfx * preset2) >> 15; + } else if (musicsh.cur.efftype == EFFECT_RANDOM) { + posfx = rand() & 32767; + cmd.preset = ((32768-posfx) * preset + posfx * preset2) >> 15; + } else cmd.preset = preset; + // Setup and send command + cmd.pivot = cmd.preset * musicsh.cur.pulse / 256; + cmd.volume = volume; + cmd.ram_addr = musicsh.cur.ramaddr; + cmd.ram_data = musicsh.cur.ramdata; + if (cmd.volume < 0) cmd.volume = 0; + if (cmd.volume > 3) cmd.volume = 3; + pmmusic_addCMD(pattern, &cmd, -1); + wait -= cmd.wait; + portoff += cmd.wait; + musicsh.cur.ramaddr = -1; + musicsh.cur.ramdata = -1; + musicsh.def.arpptr = (musicsh.def.arpptr + 1) % 3; + } while (wait > 0); +} + +// Parse note by applying effects +void parse_pattern_note(pmmusic_pattern *pattern, int noteid, double len, int mode) +{ + int wait, waiton, waitoff, waitsus, waitrel; + int note, note2, note3; + pmmusic_cmd cmd; + memset((void *)&cmd, 0, sizeof(pmmusic_cmd)); + + if (len <= 0.0) return; + if (mode == 1) { + Pprintf(3, "Info: Note %i (len=%.2f)\n", noteid, len); + wait = (int)((double)musicsh.cur.wait / len); + note = getnotefreq(noteid, musicsh.cur.octave); + note2 = getnotefreq(noteid + musicsh.cur.note2, musicsh.cur.octave); + note3 = getnotefreq(noteid + musicsh.cur.note3, musicsh.cur.octave); + } else if (mode == 0) { + Pprintf(3, "Info: Note %i (wait=%i)\n", noteid, (int)len); + wait = (int)len; + note = getnotefreq(noteid, musicsh.cur.octave); + note2 = getnotefreq(noteid + musicsh.cur.note2, musicsh.cur.octave); + note3 = getnotefreq(noteid + musicsh.cur.note3, musicsh.cur.octave); + } else { + Pprintf(3, "Info: Wait (wait=%i)\n", (int)len); + wait = (int)len; + note = -1; + note2 = -1; + note3 = -1; + } + if (wait <= 0) wait = 1; + waiton = (wait * musicsh.cur.quantize) / 64; + waitoff = wait - waiton; + if (waiton) { + waitsus = (waiton * musicsh.cur.sustain) / 64; + waitrel = waiton - waitsus; + if (waitsus) pattern_addnote(pattern, waitsus, 0, waiton, note, note2, note3, musicsh.cur.volume); + if (waitrel) pattern_addnote(pattern, waitrel, waitsus, waiton, note, note2, note3, musicsh.cur.volume-1); + } + if (waitoff) pattern_addnote(pattern, waitoff, 0, waitoff, note, note2, note3, 0); +} + +// Parse pattern (MML) +int parse_pattern(const char *s, int sfx, pmmusic_pattern *pattern) +{ + pmmusic_cmd cmd, *cmdptr; + int num, num2, noteid; + double dnum; + + memset((void *)&cmd, 0, sizeof(pmmusic_cmd)); + while (*s != 0) { + switch (*s) { + case ' ': case '\t': case '\n': // Ignore + break; + case '{': if (p_brace) { + Pprintf(-1, "Error: Open brace already declared\n"); + exit(1); + } + p_brace++; + break; + case '}': if (!p_brace) { + Pprintf(-1, "Error: Closing brace without open\n"); + exit(1); + } + p_brace--; + if (!p_brace) return 0; + break; + case '[': // Loop start + Pprintf(3, "Info: Starting loop %i\n", p_dloop); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_MARK; + cmd.loop_id = p_dloop; + pmmusic_addCMD(pattern, &cmd, -1); + p_dloop++; + if (p_dloop == 3) { + Pprintf(-1, "Error: Number of loops exceeded\n"); + exit(1); + } + break; + case ']': // Loop end + if (sfx) { + Pprintf(-1, "Error: Looping isn't supported in SFX\n"); + exit(1); + } + if (p_dloop) { + p_dloop--; + num = 2; + s = readmus_num(s, &num, 2); + if (num <= 0) { + Pprintf(-1, "Error: Number of loops need to be >= 1\n"); + exit(1); + } + Pprintf(3, "Info: Ending loop %i (num=%i)\n", p_dloop, num); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_LOOP; + cmd.loop_id = p_dloop; + cmd.loop_num = num - 1; + pmmusic_addCMD(pattern, &cmd, -1); + } else { + Pprintf(-1, "Error: Closing loop without open\n"); + exit(1); + } + break; + case 'c': // C note + noteid = 0; + if (s[1] == '-') { noteid = -1; s++; } + else if (s[1] == '+') { noteid = 1; s++; } + else if (s[1] == '#') { noteid = 1; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'd': // D note + noteid = 2; + if (s[1] == '-') { noteid = 1; s++; } + else if (s[1] == '+') { noteid = 3; s++; } + else if (s[1] == '#') { noteid = 3; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'e': // E note + noteid = 4; + if (s[1] == '-') { noteid = 3; s++; } + else if (s[1] == '+') { noteid = 5; s++; } + else if (s[1] == '#') { noteid = 5; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'f': // F note + noteid = 5; + if (s[1] == '-') { noteid = 4; s++; } + else if (s[1] == '+') { noteid = 6; s++; } + else if (s[1] == '#') { noteid = 6; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'g': // G note + noteid = 7; + if (s[1] == '-') { noteid = 6; s++; } + else if (s[1] == '+') { noteid = 8; s++; } + else if (s[1] == '#') { noteid = 8; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'a': // A note + noteid = 9; + if (s[1] == '-') { noteid = 8; s++; } + else if (s[1] == '+') { noteid = 10; s++; } + else if (s[1] == '#') { noteid = 10; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'b': // B note + noteid = 11; + if (s[1] == '-') { noteid = 10; s++; } + else if (s[1] == '+') { noteid = 12; s++; } + else if (s[1] == '#') { noteid = 12; s++; } + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + parse_pattern_note(pattern, noteid, dnum, 1); + break; + case 'r': // Rest + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.') && (s[4] == '.')) { dnum = (double)num / 1.9375; s += 4; } + if ((s[1] == '.') && (s[2] == '.') && (s[3] == '.')) { dnum = (double)num / 1.875; s += 3; } + if ((s[1] == '.') && (s[2] == '.')) { dnum = (double)num / 1.75; s += 2; } + if (s[1] == '.') { dnum = (double)num / 1.5; s++; } + else dnum = (double)num; + if (dnum <= 0.0) break; + Pprintf(3, "Info: Rest (len=%.2f)\n", dnum); + cmd.wait = (int)((double)musicsh.cur.wait / dnum); + if (cmd.wait == 0) cmd.wait = 1; + cmd.flags = PMMUSIC_FLAG_VOL; + cmd.volume = 0; + pmmusic_addCMD(pattern, &cmd, -1); + break; + case '%': // Pulse-width + num = musicsh.cur.pulse; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 255) num = 255; + Pprintf(3, "Info: Pulse-width %i (%i%%)\n", num, num * 100 / 255); + musicsh.cur.pulse = num; + break; + case '\\': // Pulse-width in percentage + case '/': + num = musicsh.cur.pulse; + s = readmus_num(s, &num, 2); + num = num * 255 / 100; + if (num < 0) num = 0; + if (num > 255) num = 255; + Pprintf(3, "Info: Pulse-width %i (%i%%)\n", num, num * 100 / 255); + musicsh.cur.pulse = num; + break; + case 'v': // Volume + num = musicsh.cur.volume; + if (musicsh.vollevel) { + if (musicsh.cur.volume == 1) num = 4; + else if (musicsh.cur.volume == 2) num = 8; + else if (musicsh.cur.volume == 3) num = 15; + } + s = readmus_num(s, &num, 1); + if (num < 0) num = 0; + if (musicsh.vollevel) { + if (num > 15) num = 15; + if (num > 8) num2 = 3; + else if (num > 4) num2 = 2; + else if (num > 2) num2 = 1; + else num2 = 0; + Pprintf(3, "Info: Volume %i (%i)\n", num, num2); + musicsh.cur.volume = num2; + } else { + if (num > 3) num = 3; + Pprintf(3, "Info: Volume %i\n", num); + musicsh.cur.volume = num; + } + break; + case 'w': // Wait + num = musicsh.cur.wait; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 255) num = 255; + Pprintf(3, "Info: Wait %i\n", num); + musicsh.cur.wait = num; + break; + case '!': // Write to RAM + num = 0; + s = readmus_num(s, &num, 2); + if (s[1] != ':') { + Pprintf(-1, "Error: Missing ':' in write to RAM\n"); + exit(1); + } + s++; + num2 = 0; + s = readmus_num(s, &num2, 2); + if ((num < 0) || (num > 255)) { + Pprintf(-1, "Error: Write to RAM address out of range\n"); + exit(1); + } + if ((num2 < 0) || (num2 > 255)) { + Pprintf(-1, "Error: Write to RAM address out of range\n"); + exit(1); + } + Pprintf(3, "Info: Write RAM[$%02X]=$%02X\n", num & 255, num2 & 255); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_WRITERAM; + cmd.ram_addr = num; + cmd.ram_data = num2; + pmmusic_addCMD(pattern, &cmd, -1); + break; + case 'l': // Length + num = musicsh.cur.length; + s = readmus_num(s, &num, 2); + if (num < 1) num = 1; + if (num > 64) num = 64; + Pprintf(3, "Info: Length %i\n", num); + musicsh.cur.length = num; + break; + case '>': // Increase octave + if (!musicsh.octrev) { + musicsh.cur.octave++; + if (musicsh.cur.octave > 9) musicsh.cur.octave = 9; + } else { + musicsh.cur.octave--; + if (musicsh.cur.octave < 1) musicsh.cur.octave = 1; + } + break; + case '<': // Decrease octave + if (!musicsh.octrev) { + musicsh.cur.octave--; + if (musicsh.cur.octave < 1) musicsh.cur.octave = 1; + } else { + musicsh.cur.octave++; + if (musicsh.cur.octave > 9) musicsh.cur.octave = 9; + } + break; + case 'o': // Octave + num = musicsh.cur.octave; + s = readmus_num(s, &num, 1); + if (num < 1) num = 1; + if (num > 9) num = 9; + Pprintf(3, "Info: Octave %i\n", num); + musicsh.cur.octave = num; + break; + case 'q': // Quantize + if (!musicsh.shortq) { + num = musicsh.cur.quantize; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 64) num = 64; + Pprintf(3, "Info: Quantize %i (%i%%)\n", num, num * 100 / 64); + musicsh.cur.quantize = num; + } else { + num = (musicsh.cur.quantize / 7) - 1; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 8) num = 8; + musicsh.cur.quantize = (num + 1) * 7; + Pprintf(3, "Info: Quantize %i (%i%%)\n", num, musicsh.cur.quantize * 100 / 64); + } + break; + case 's': // Sustain + num = musicsh.cur.sustain; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 64) num = 64; + Pprintf(3, "Info: Sustain %i (%i%%)\n", num, num * 100 / 64); + musicsh.cur.sustain = num; + break; + case 'x': // Effect + s++; + switch (*s) { + case 't': // Ticks + num = 1; + s = readmus_num(s, &num, 2); + if (num < 1) num = 1; + if (num > 128) num = 128; + Pprintf(3, "Info: Effect ticks = %i\n", musicsh.cur.efftick); + musicsh.cur.efftick = num; + break; + case 'd': // Disable + Pprintf(3, "Info: Effect type = Disabled\n"); + musicsh.cur.efftype = EFFECT_DISABLED; + break; + case 'a': // Arpeggio + num = 0; + s = readmus_num(s, &num, 2); + musicsh.cur.note2 = num; + if (s[1] != ':') { + Pprintf(-1, "Error: Missing ':' in write to RAM\n"); + exit(1); + } + s++; + num2 = 0; + s = readmus_num(s, &num2, 2); + musicsh.cur.note3 = num2; + musicsh.cur.efftype = EFFECT_ARPEGGIO; + Pprintf(3, "Info: Effect type = Arpeggio (Notes=%i,%i)\n", musicsh.cur.note2, musicsh.cur.note3); + break; + case 'p': // Portamento + num = 0; + s = readmus_num(s, &num, 2); + musicsh.cur.note2 = num; + musicsh.cur.efftype = EFFECT_PORTAMENTO; + Pprintf(3, "Info: Effect type = Portamento (Note=%i)\n", musicsh.cur.note2); + break; + case 'r': // Random between + num = 0; + s = readmus_num(s, &num, 2); + musicsh.cur.note2 = num; + musicsh.cur.efftype = EFFECT_RANDOM; + Pprintf(3, "Info: Effect type = Random Between (Note=%i)\n", musicsh.cur.note2); + break; + case 's': // Random seed + num = 1; + s = readmus_num(s, &num, 8); + srand (num); + Pprintf(3, "Info: Effect type = Random Seed (Seed=%i)\n", musicsh.cur.note2); + break; + default: // Invalid + Pprintf(0, "Warning: Unknown character '%c' in effect\n", *s); + break; + } + break; + case ';': // End music + Pprintf(3, "Info: End music\n", num & 255, num2 & 255); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_VOL | PMMUSIC_FLAG_END; + cmd.volume = 0; + pmmusic_addCMD(pattern, &cmd, -1); + break; + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': + case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': // Macro + num = *s - 'A'; + if (!macro_pat[num]) { + Pprintf(-1, "Error: Macro %c not defined\n", *s); + exit(1); + } + for (num2=0; num2numcmd; num2++) { + cmdptr = ¯o_pat[num]->cmd[num2]; + pmmusic_addCMD(pattern, cmdptr, -1); + } + break; + default: + Pprintf(0, "Warning: Unknown character '%c'\n", *s); + break; + } + s++; + } + return p_brace; +} + + + +// Parse pattern (Track sub-command) +int parse_pattern_trksub(const char *s, pmmusic_pattern *pattern) +{ + pmmusic_cmd cmd; + int num, num2, noteid; + + if (!strlen(s)) return 0; + memset((void *)&cmd, 0, sizeof(pmmusic_cmd)); + + switch (tolower(*s)) { + case ' ': case '\t': case '\n': // Ignore + break; + case '-': case '_': // No note + musicsh.cur.note = -1; + break; + case 'c': // C note + noteid = 0; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 1; s++; } + else if (s[1] == '#') { noteid = 1; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case 'd': // D note + noteid = 2; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 3; s++; } + else if (s[1] == '#') { noteid = 3; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case 'e': // E note + noteid = 4; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 5; s++; } + else if (s[1] == '#') { noteid = 5; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case 'f': // F note + noteid = 5; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 6; s++; } + else if (s[1] == '#') { noteid = 6; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case 'g': // G note + noteid = 7; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 8; s++; } + else if (s[1] == '#') { noteid = 8; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case 'a': // A note + noteid = 9; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 10; s++; } + else if (s[1] == '#') { noteid = 10; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case 'b': // B note + noteid = 11; + if (s[1] == ' ') s++; + else if (s[1] == '_') s++; + else if (s[1] == '-') s++; + else if (s[1] == '+') { noteid = 12; s++; } + else if (s[1] == '#') { noteid = 12; s++; } + num = musicsh.cur.octave; + s = readmus_num(s, &num, 2); + musicsh.cur.octave = num; + musicsh.cur.note = noteid; + break; + case '%': // Pulse-width + num = musicsh.cur.pulse; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 255) num = 255; + Pprintf(3, "Info: Pulse-width %i (%i%%)\n", num, num * 100 / 255); + musicsh.cur.pulse = num; + break; + case '\\': // Pulse-width in percentage + num = musicsh.cur.pulse; + s = readmus_num(s, &num, 2); + num = num * 255 / 100; + if (num < 0) num = 0; + if (num > 255) num = 255; + Pprintf(3, "Info: Pulse-width %i (%i%%)\n", num, num * 100 / 255); + musicsh.cur.pulse = num; + break; + case 'v': // Volume + num = musicsh.cur.volume; + if (musicsh.vollevel) { + if (musicsh.cur.volume == 1) num = 4; + else if (musicsh.cur.volume == 2) num = 8; + else if (musicsh.cur.volume == 3) num = 15; + } + s = readmus_num(s, &num, 1); + if (num < 0) num = 0; + if (musicsh.vollevel) { + if (num > 15) num = 15; + if (num > 8) num2 = 3; + else if (num > 4) num2 = 2; + else if (num > 2) num2 = 1; + else num2 = 0; + Pprintf(3, "Info: Volume %i (%i)\n", num, num2); + musicsh.cur.volume = num2; + } else { + if (num > 3) num = 3; + Pprintf(3, "Info: Volume %i\n", num); + musicsh.cur.volume = num; + } + break; + case 'w': // Wait + num = musicsh.cur.wait; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 255) num = 255; + Pprintf(3, "Info: Wait %i\n", num); + musicsh.cur.wait = num; + break; + case '!': // Write to RAM + num = 0; + s = readmus_num(s, &num, 2); + if (s[1] != ':') { + Pprintf(-1, "Error: Missing ':' in write to RAM\n"); + exit(1); + } + s++; + num2 = 0; + s = readmus_num(s, &num2, 2); + if ((num < 0) || (num > 255)) { + Pprintf(-1, "Error: Write to RAM address out of range\n"); + exit(1); + } + if ((num2 < 0) || (num2 > 255)) { + Pprintf(-1, "Error: Write to RAM address out of range\n"); + exit(1); + } + if (musicsh.cur.ramaddr != -1) { + Pprintf(-1, "Error: Can only define one RAM write per row\n"); + exit(1); + } + Pprintf(3, "Info: Write RAM[$%02X]=$%02X\n", num & 255, num2 & 255); + musicsh.cur.ramaddr = num; + musicsh.cur.ramdata = num2; + break; + case 'q': // Quantize + if (!musicsh.shortq) { + num = musicsh.cur.quantize; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 64) num = 64; + Pprintf(3, "Info: Quantize %i (%i%%)\n", num, num * 100 / 64); + musicsh.cur.quantize = num; + } else { + num = (musicsh.cur.quantize / 7) - 1; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 8) num = 8; + musicsh.cur.quantize = (num + 1) * 7; + Pprintf(3, "Info: Quantize %i (%i%%)\n", num, musicsh.cur.quantize * 100 / 64); + } + break; + case 's': // Sustain + num = musicsh.cur.sustain; + s = readmus_num(s, &num, 2); + if (num < 0) num = 0; + if (num > 64) num = 64; + Pprintf(3, "Info: Sustain %i (%i%%)\n", num, num * 100 / 64); + musicsh.cur.sustain = num; + break; + case 'x': // Effect + s++; + switch (*s) { + case 't': // Ticks + num = 1; + s = readmus_num(s, &num, 2); + if (num < 1) num = 1; + if (num > 128) num = 128; + Pprintf(3, "Info: Effect ticks = %i\n", musicsh.cur.efftick); + musicsh.cur.efftick = num; + break; + case 'd': // Disable + Pprintf(3, "Info: Effect type = Disabled\n"); + musicsh.cur.efftype = EFFECT_DISABLED; + break; + case 'a': // Arpeggio + num = 0; + s = readmus_num(s, &num, 2); + musicsh.cur.note2 = num; + if (s[1] != ':') { + Pprintf(-1, "Error: Missing ':' in write to RAM\n"); + exit(1); + } + s++; + num2 = 0; + s = readmus_num(s, &num2, 2); + musicsh.cur.note3 = num2; + musicsh.cur.efftype = EFFECT_ARPEGGIO; + Pprintf(3, "Info: Effect type = Arpeggio (Notes=%i,%i)\n", musicsh.cur.note2, musicsh.cur.note3); + break; + case 'p': // Portamento + num = 0; + s = readmus_num(s, &num, 2); + musicsh.cur.note2 = num; + musicsh.cur.efftype = EFFECT_PORTAMENTO; + Pprintf(3, "Info: Effect type = Portamento (Note=%i)\n", musicsh.cur.note2); + break; + case 'r': // Random between + num = 0; + s = readmus_num(s, &num, 2); + musicsh.cur.note2 = num; + musicsh.cur.efftype = EFFECT_RANDOM; + Pprintf(3, "Info: Effect type = Random Between (Note=%i)\n", musicsh.cur.note2); + break; + case 's': // Random seed + num = 1; + s = readmus_num(s, &num, 8); + srand (num); + Pprintf(3, "Info: Effect type = Random Seed (Seed=%i)\n", musicsh.cur.note2); + break; + default: // Invalid + Pprintf(0, "Warning: Unknown character '%c' in effect\n", *s); + break; + } + break; + case ';': // End music + Pprintf(3, "Info: End music\n", num & 255, num2 & 255); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_VOL | PMMUSIC_FLAG_END; + cmd.volume = 0; + pmmusic_addCMD(pattern, &cmd, -1); + break; + default: + Pprintf(0, "Warning: Unknown command '%s'\n", s); + break; + } + return p_brace; +} + +// Parse pattern (Track) +int parse_pattern_trk(const char *s, int sfx, pmmusic_pattern *pattern) +{ + char tmp[1024], *txt, *stxt; + char *directive, *parameter; + int directivenum, parnum, num, num2; + pmmusic_cmd cmd, *cmdptr; + + strcpy(tmp, s); + memset((void *)&cmd, 0, sizeof(pmmusic_cmd)); + + // Handle braces + txt = tmp; + while (*txt != 0) { + if (*txt == '{') { + if (p_brace) { + Pprintf(-1, "Error: Open brace already declared\n"); + exit(1); + } + p_brace++; + *txt = ' '; + } else if (*txt == '}') { + if (!p_brace) { + Pprintf(-1, "Error: Closing brace without open\n"); + exit(1); + } + p_brace--; + *txt = ' '; + break; + } + txt++; + } + *txt++ = ';'; *txt = 0; + + txt = TrimStr(tmp); + if ((txt[0] == 0) || (txt[0] == ';')) return p_brace; + if (!SeparateAtChars(txt, " \t", &directive, ¶meter)) { + Pprintf(-1, "Error: Malformed track directive\n"); + exit(1); + } + if (!strcasecmp(directive, "ROW")) { + directivenum = 0; + } else if (!strcasecmp(directive, "LOOP") || !strcasecmp(directive, "MARK") || !strcasecmp(directive, "DO")) { + Pprintf(3, "Info: Starting loop %i\n", p_dloop); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_MARK; + cmd.loop_id = p_dloop; + pmmusic_addCMD(pattern, &cmd, -1); + p_dloop++; + if (p_dloop == 3) { + Pprintf(-1, "Error: Number of loops exceeded\n"); + exit(1); + } + return p_brace; + } else if (!strcasecmp(directive, "ENDL") || !strcasecmp(directive, "ENDLOOP") || !strcasecmp(directive, "REPEAT")) { + directivenum = 1; + } else if (!strcasecmp(directive, "MACRO")) { + directivenum = 2; + } else { + Pprintf(-1, "Error: Invalid track directive '%s'\n", directive); + exit(1); + } + + // Set no note + musicsh.cur.note = -1; + musicsh.cur.ramaddr = -1; + musicsh.cur.ramdata = -1; + + // Row directive + parnum = 0; + stxt = txt = TrimStr(parameter); + while (*txt != 0) { + if ((*txt == ',') || (*txt == ';')) { + *txt = 0; + if (strlen(stxt)) { + if (directivenum == 0) { + // ROW + parse_pattern_trksub(TrimStr(stxt), pattern); + } else if (directivenum == 1) { + // ENDL + if (parnum == 0) { + num = atoi_Ex(stxt, 2); + if (p_dloop) { + p_dloop--; + if (num <= 0) { + Pprintf(-1, "Error: Number of loops need to be >= 1\n"); + exit(1); + } + Pprintf(3, "Info: Ending loop %i (num=%i)\n", p_dloop, num); + cmd.wait = 0; + cmd.flags = PMMUSIC_FLAG_LOOP; + cmd.loop_id = p_dloop; + cmd.loop_num = num - 1; + pmmusic_addCMD(pattern, &cmd, -1); + } else { + Pprintf(-1, "Error: Closing bracket without open\n"); + exit(1); + } + } + } else if (directivenum == 2) { + // MACRO + if (parnum == 0) { + stxt = TrimStr(stxt); + num = *stxt - 'A'; + if ((num < 0) || (num > 25)) break; + if (!macro_pat[num]) { + Pprintf(-1, "Error: Macro %c not defined\n", *stxt); + exit(1); + } + for (num2=0; num2numcmd; num2++) { + cmdptr = ¯o_pat[num]->cmd[num2]; + pmmusic_addCMD(pattern, cmdptr, -1); + } + } + } + parnum++; + } + stxt = txt = TrimStr(&txt[1]); + continue; + } + txt++; + } + + // Apply ROW + if (directivenum == 0) { + if (musicsh.cur.note == -1) { + parse_pattern_note(pattern, -1, (double)musicsh.cur.wait, -1); + } else { + parse_pattern_note(pattern, musicsh.cur.note, (double)musicsh.cur.wait, 0); + } + } + + return p_brace; +} + +// Parse BGM +int parse_bgm(const char *cmd, pmmusic_bgm *bgm) +{ + char tmp[1024], *txt, *stxt; + pmmusic_pattern *pat; + strcpy(tmp, cmd); + + // Handle braces + txt = tmp; + while (*txt != 0) { + if (*txt == '{') { + if (p_brace) { + Pprintf(-1, "Error: Open brace already declared\n"); + exit(1); + } + p_brace++; + *txt = ' '; + } else if (*txt == '}') { + if (!p_brace) { + Pprintf(-1, "Error: Closing brace without open\n"); + exit(1); + } + p_brace--; + *txt = ' '; + break; + } + txt++; + } + *txt++ = ';'; *txt = 0; + + // if bgm is NULL then we are at 1st pass + if (!bgm) return p_brace; + + stxt = txt = TrimStr(tmp); + while (*txt != 0) { + if ((*txt == ' ') || (*txt == '\t') || (*txt == ';')) { + *txt = 0; + if (strlen(stxt)) { + if (!strcmp(stxt, "|")) { + if (p_bpatloop != -1) { + Pprintf(-1, "Error: Loop mark already defined\n"); + exit(1); + } + p_bpatloop = p_bpat; + Pprintf(3, "Loop mark\n", txt); + } else { + Pprintf(3, "Pattern %s\n", stxt); + pat = pmmusic_getPAT(musiclist, stxt, NULL); + if (!pat) { + Pprintf(-1, "Error: Pattern '%s' doesn't exist\n", stxt); + exit(1); + } + pmmusic_addSEQ(bgm, pat, -1); + } + p_bpat++; + } + stxt = txt = TrimStr(&txt[1]); + continue; + } + txt++; + } + return p_brace; +} + +// Convert music file +int convertmus_file(const char *musfile) +{ + char tmp[1024], *txt; + char *directive, *parameter, *varname; + int i, value; + double fvalue; + FILE *fi; + char tp_file[128]; + pmmusic_pattern *pat; + pmmusic_bgm *bgm; + pmmusic_cmd endcmd, nextpatcmd; + + // End command + endcmd.wait = 1; + endcmd.flags = PMMUSIC_FLAG_VOL | PMMUSIC_FLAG_END; + endcmd.volume = 0; + + // Next pattern command + nextpatcmd.wait = 0; + nextpatcmd.flags = PMMUSIC_FLAG_PATTERN; + nextpatcmd.pattern = 1; + + if (p_recursive++ >= 2) { + Pprintf(-1, "Error: Recursive include overflow\n"); + exit(1); + } + + fi = fopen(musfile, "r"); + if (!fi) { + Pprintf(-1, "Error: Couldn't open file\n"); + exit(1); + } + strcpy(p_file, musfile); + + // 1st Pass + p_line = 0; + p_comment = 0; + fseek(fi, 0, SEEK_SET); + while ((txt = readmus_line(fi, tmp, 1024)) != NULL) { + // Separate directive from parameter + RemoveComments(txt); + if (!SeparateAtChars(txt, " \t", &directive, ¶meter)) continue; + directive = TrimStr(directive); + parameter = TrimStr(parameter); + + // Process directive + if (!strcasecmp(directive, "TITLE")) { + strncpy(musicsh.title, parameter, 255); + } else if (!strcasecmp(directive, "COMPOSER")) { + strncpy(musicsh.composer, parameter, 255); + } else if (!strcasecmp(directive, "PROGRAMMER")) { + strncpy(musicsh.programmer, parameter, 255); + } else if (!strcasecmp(directive, "DESCRIPTION")) { + strncpy(musicsh.description, parameter, 255); + } else if (!strcasecmp(directive, "OUTFORMAT")) { + if (!strcasecmp(parameter, "ASM")) confs.format = FILE_ECODE_ASM; + else if (!strcasecmp(parameter, "C")) confs.format = FILE_ECODE_C; + else { + Pprintf(-1, "Error: Invalid output format '%s'\n", parameter); + exit(1); + } + } else if (!strcasecmp(directive, "OUTFILE")) { + parameter = TrimStr(parameter); + strcpy(confs.out_f, parameter); + } else if (!strcasecmp(directive, "VARHEADER")) { + parameter = TrimStr(parameter); + strcpy(confs.mus_v, parameter); + } else if (!strcasecmp(directive, "OUTHEADER")) { + parameter = TrimStr(parameter); + strcpy(confs.outh_f, parameter); + } else if (!strcasecmp(directive, "OUTLIST")) { + parameter = TrimStr(parameter); + strcpy(confs.outl_f, parameter); + } else if (!strcasecmp(directive, "VARSFX")) { + parameter = TrimStr(parameter); + strcpy(confs.sfx_v, parameter); + } else if (!strcasecmp(directive, "VARBGM")) { + parameter = TrimStr(parameter); + strcpy(confs.bgm_v, parameter); + } else if (!strcasecmp(directive, "INCLUDE")) { + // Include file + strcpy(tp_file, p_file); + if (!convertmus_file(parameter)) { + Pprintf(-1, "Error: Invalid file '%s'\n", parameter); + exit(1); + } + } else if (!strcasecmp(directive, "MTIME") || !strcasecmp(directive, "MASTERTIME")) { + // Change master time + value = atoi_Ex(parameter, -1); + if ((value <= 0) || (value > 65535)) { + Pprintf(-1, "Error: Invalid master time value\n", parameter); + exit(1); + } + if (musicsh.mastertime_set && (value != musicsh.mastertime_val)) { + Pprintf(0, "Warning: Master time has been set with different value\n"); + } + musicsh.mastertime_val = value; + musicsh.mastertime_set = 1; + Pprintf(2, "Info: Master time set to $%04X (%i)\n", value, value); + } else if (!strcasecmp(directive, "MBPM") || !strcasecmp(directive, "MASTERBPM")) { + // Change master time based of BPM + fvalue = atof_Ex(parameter, -1.0f); + if (fvalue <= 0.0f) { + Pprintf(-1, "Error: Invalid BPM value\n"); + exit(1); + } + if (!SeparateAtChars(parameter, ",", NULL, ¶meter)) { + Pprintf(-1, "Error: Missing wait value\n", parameter); + exit(1); + } + value = atoi_Ex(parameter, -1); + if ((value < 0) || (value > 255)) { + Pprintf(-1, "Error: Invalid wait value\n"); + exit(1); + } + value = (int)(3905.25f / (fvalue / 960.0f * (float)value)) - 1; + if (value > 65535) { + Pprintf(-1, "Error: Master time value too high\n"); + exit(1); + } + if (musicsh.mastertime_set && (value != musicsh.mastertime_val)) { + Pprintf(0, "Warning: Master time has been set with different value\n"); + } + musicsh.mastertime_val = value; + musicsh.mastertime_set = 1; + Pprintf(2, "Info: Master time set to $%04X (%i)\n", value, value); + } else if (!strcasecmp(directive, "VOLLVL") || !strcasecmp(directive, "VOLLEVEL")) { + // Setup volume level + if (!strcasecmp(parameter, "system")) { + musicsh.vollevel = 0; + } else if (!strcasecmp(parameter, "4")) { + musicsh.vollevel = 0; + } else if (!strcasecmp(parameter, "mml")) { + musicsh.vollevel = 1; + } else if (!strcasecmp(parameter, "16")) { + musicsh.vollevel = 1; + } else { + Pprintf(-1, "Error: Invalid VOLLVL value\n"); + exit(1); + } + } else if (!strcasecmp(directive, "OCTREV") || !strcasecmp(directive, "OCTAVEREV")) { + // Setup octave reverse + if (!strcasecmp(parameter, "no")) { + musicsh.octrev = 0; + } else if (!strcasecmp(parameter, "yes")) { + musicsh.octrev = 1; + } else if (!strcasecmp(parameter, "false")) { + musicsh.octrev = 0; + } else if (!strcasecmp(parameter, "true")) { + musicsh.octrev = 1; + } else if (!strcasecmp(parameter, "0")) { + musicsh.octrev = 0; + } else if (!strcasecmp(parameter, "1")) { + musicsh.octrev = 1; + } else { + Pprintf(-1, "Error: Invalid OCTREV value\n"); + exit(1); + } + } else if (!strcasecmp(directive, "SHORTQ") || !strcasecmp(directive, "SHORTQUANTIZE")) { + // Setup octave reverse + if (!strcasecmp(parameter, "no")) { + musicsh.shortq = 0; + } else if (!strcasecmp(parameter, "yes")) { + musicsh.shortq = 1; + } else if (!strcasecmp(parameter, "false")) { + musicsh.shortq = 0; + } else if (!strcasecmp(parameter, "true")) { + musicsh.shortq = 1; + } else if (!strcasecmp(parameter, "0")) { + musicsh.shortq = 0; + } else if (!strcasecmp(parameter, "1")) { + musicsh.shortq = 1; + } else { + Pprintf(-1, "Error: Invalid SHORTQ value\n"); + exit(1); + } + } else if (!strcasecmp(directive, "MACRO")) { + // Add or change macro + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (strlen(varname) != 1) { + Pprintf(-1, "Error: Macro must be 1 character\n"); + exit(1); + } + if ((varname[0] < 'A') && (varname[0] > 'Z')) { + Pprintf(-1, "Error: Macro must be a uppercase character\n"); + exit(1); + } + pat = pmmusic_newpattern(varname, 1); + Pprintf(2, "Info: Macro '%s' defined/changed\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_pattern(txt, 0, pat)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + value = pat->varname[0] - 'A'; + if (!macro_pat[value]) macro_pat[value] = pmmusic_newpattern("Macro", 1); + macro_pat[value]->numcmd = 0; + for (i=0; inumcmd; i++) pmmusic_addCMD(macro_pat[value], &pat->cmd[i], -1); + pmmusic_deletepattern(pat); + Pprintf(3, "Info: Macro '%s' end\n", pat->varname); + } else if (!strcasecmp(directive, "MACRO_T") || !strcasecmp(directive, "MACRO_TRACK")) { + // Add or change macro + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (strlen(varname) != 1) { + Pprintf(-1, "Error: Macro must be 1 character\n"); + exit(1); + } + if ((varname[0] < 'A') && (varname[0] > 'Z')) { + Pprintf(-1, "Error: Macro must be a uppercase character\n"); + exit(1); + } + pat = pmmusic_newpattern(varname, 1); + Pprintf(2, "Info: Macro '%s' defined/changed\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_pattern_trk(txt, 0, pat)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + value = pat->varname[0] - 'A'; + if (!macro_pat[value]) macro_pat[value] = pmmusic_newpattern("Macro", 1); + macro_pat[value]->numcmd = 0; + for (i=0; inumcmd; i++) pmmusic_addCMD(macro_pat[value], &pat->cmd[i], -1); + pmmusic_deletepattern(pat); + Pprintf(3, "Info: Macro '%s' end\n", pat->varname); + } else if (!strcasecmp(directive, "PAT") || !strcasecmp(directive, "PATTERN")) { + // Define pattern + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (!strlen(varname)) { + Pprintf(-1, "Error: Pattern varname cannot be empty\n"); + exit(1); + } + if (pmmusic_existVAR(musiclist, varname, NULL, NULL)) { + Pprintf(-1, "Error: Variable '%s' already defined\n", varname); + exit(1); + } + pat = pmmusic_newPAT(musiclist, varname, 1); + Pprintf(2, "Info: Pattern '%s' defined\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_pattern(txt, 0, pat)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + pmmusic_addCMD(pat, &nextpatcmd, -1); + Pprintf(3, "Info: Pattern '%s' end\n", pat->varname); + } else if (!strcasecmp(directive, "PAT_T") || !strcasecmp(directive, "PATTERN_T") || + !strcasecmp(directive, "PAT_TRACK") || !strcasecmp(directive, "PATTERN_TRACK")) { + // Define pattern + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (!strlen(varname)) { + Pprintf(-1, "Error: Pattern varname cannot be empty\n"); + exit(1); + } + if (pmmusic_existVAR(musiclist, varname, NULL, NULL)) { + Pprintf(-1, "Error: Variable '%s' already defined\n", varname); + exit(1); + } + pat = pmmusic_newPAT(musiclist, varname, 1); + Pprintf(2, "Info: Pattern '%s' defined\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_pattern_trk(txt, 0, pat)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + pmmusic_addCMD(pat, &nextpatcmd, -1); + Pprintf(3, "Info: Pattern '%s' end\n", pat->varname); + } else if (!strcasecmp(directive, "SFX")) { + // Define SFX + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (!strlen(varname)) { + Pprintf(-1, "Error: SFX varname cannot be empty\n"); + exit(1); + } + if (pmmusic_existVAR(musiclist, varname, NULL, NULL)) { + Pprintf(-1, "Error: Variable '%s' already defined\n", varname); + exit(1); + } + pat = pmmusic_newSFX(musiclist, varname, 1); + Pprintf(2, "Info: SFX '%s' defined\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_pattern(txt, 1, pat)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + pmmusic_addCMD(pat, &endcmd, -1); + Pprintf(3, "Info: SFX '%s' end\n", pat->varname); + } else if (!strcasecmp(directive, "SFX_T") || !strcasecmp(directive, "SFX_TRACK")) { + // Define SFX + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (!strlen(varname)) { + Pprintf(-1, "Error: SFX varname cannot be empty\n"); + exit(1); + } + if (pmmusic_existVAR(musiclist, varname, NULL, NULL)) { + Pprintf(-1, "Error: Variable '%s' already defined\n", varname); + exit(1); + } + pat = pmmusic_newSFX(musiclist, varname, 1); + Pprintf(2, "Info: SFX '%s' defined\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_pattern_trk(txt, 1, pat)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + pmmusic_addCMD(pat, &endcmd, -1); + Pprintf(3, "Info: SFX '%s' end\n", pat->varname); + } else if (!strcasecmp(directive, "BGM")) { + // Define BGM + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (!strlen(varname)) { + Pprintf(-1, "Error: BGM varname cannot be empty\n"); + exit(1); + } + if (pmmusic_existVAR(musiclist, varname, NULL, NULL)) { + Pprintf(-1, "Error: Variable '%s' already defined\n", varname); + exit(1); + } + txt = parameter; + do { + if (!parse_bgm(txt, NULL)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + } else { + // Empty of unknown directive + if (strlen(directive)) { + Pprintf(-1, "Error: Unknown directive '%s'\n", directive); + exit(1); + } + } + + // Cannot have open brace + if (p_brace) { + Pprintf(-1, "Error: Opening brace without close\n"); + exit(1); + } + } + + // 2nd Pass + p_line = 0; + p_comment = 0; + fseek(fi, 0, SEEK_SET); + while ((txt = readmus_line(fi, tmp, 1024)) != NULL) { + // Separate directive from parameter + if (!SeparateAtChars(txt, " \t", &directive, ¶meter)) continue; + + // Process directive + if (!strcasecmp(directive, "BGM")) { + // Define BGM + p_bpat = 0; + p_bpatloop = -1; + if (!SeparateAtChars(parameter, " \t", &varname, ¶meter)) { + Pprintf(-1, "Error: Malformed directive\n"); + exit(1); + } + if (pmmusic_existVAR(musiclist, varname, NULL, NULL)) { + Pprintf(-1, "Error: Variable '%s' already defined\n", varname); + exit(1); + } + bgm = pmmusic_newBGM(musiclist, varname, 1); + Pprintf(2, "Info: BGM '%s' defined\n", varname); + txt = parameter; + memcpy(&musicsh.cur, &musicsh.def, sizeof(musicsh.def)); + do { + if (!parse_bgm(txt, bgm)) break; + } while ((txt = readmus_line(fi, tmp, 1024)) != NULL); + Pprintf(3, "Info: BGM '%s' end\n", bgm->varname); + // Create loop / end pattern + sprintf(txt, "%s_ENDBGM", bgm->varname); + pat = pmmusic_newPAT(musiclist, txt, 0); + if (p_bpatloop == -1) { + // End pattern + pmmusic_addCMD(pat, &endcmd, -1); + } else { + // Loop pattern + nextpatcmd.pattern = -(p_bpat - p_bpatloop - 1); + pmmusic_addCMD(pat, &nextpatcmd, -1); + nextpatcmd.pattern = 1; + } + pmmusic_addSEQ(bgm, pat, -1); + } + + // Cannot have open brace + if (p_brace) { + Pprintf(-1, "Error: Opening brace without close\n"); + exit(1); + } + } + fclose(fi); + + p_recursive--; + + return 1; +} + +// ---------- Main ---------- + +void audio_fill(int16_t *stream, int len) +{ + MinxAudio_GetSamplesS16(stream, len>>1); + if (sdump) WriteS16A_ExportWAV(sdump, (int16_t *)stream, len>>1); +} + +void sdump_close(void) +{ + if (sdump) Close_ExportWAV(sdump); + sdump = NULL; +} + +int main(int argc, char **argv) +{ + pmmusic_bgm *tbgm; + pmmusic_sfx *tsfx; + int i, j, playdec, totalsiz; + char tmp[256]; + FILE_ECODE *foptr; + FILE *fo; + + // Read from command line + init_confs(); + if (!load_confs_args(argc, argv)) { + printf("PokeMini Music Converter " VERSION_STR "\n\n"); + printf("Usage: pokemini_musicconv [options]\n\n"); + printf(" -asmf Output in asm format (def)\n"); + printf(" -cf Output in C format\n"); + printf(" -i music.txt Music input (required)\n"); + printf(" -o music.asm Output file\n"); + printf(" -oh music.inc Output file (header)\n"); + printf(" -ol music_list.asm Output file (sound list)\n"); + printf(" -q Quiet\n"); + printf(" -v Verbose\n"); + printf(" -sv Super-verbose\n"); + printf(" -play varname Play specific BGM/SFX\n"); + printf("\nPlay flags:\n"); + printf(" -snddirect Sound Engine: Direct (def)\n"); + printf(" -sndemulated Sound Engine: Emulated\n"); + printf(" -piezo Use piezo filtering (def)\n"); + printf(" -nopiezo Don't use piezo filtering\n"); + printf(" -towav music.wav Save to WAV while playing\n"); + return 1; + } + if (!confs.quiet) printf("PokeMini Music Converter " VERSION_STR "\n\n"); + + // Initialize + musiclist = pmmusic_newlist(); + if (!musiclist) { + printf("Error: Not enough memory!\n"); + return 1; + } + musicsh.mastertime_val = 260; // Default master time, aprox 60fps + musicsh.vollevel = 1; // Volume level of MML + musicsh.def.wait = 24; // Wait + musicsh.def.note = -1; // Note + musicsh.def.note2 = -1; // Note 2 for effects + musicsh.def.note3 = -1; // Note 3 for effects + musicsh.def.ramaddr = -1; // RAM address + musicsh.def.ramdata = -1; // RAM data + musicsh.def.length = 4; // Length + musicsh.def.octave = 4; // Octave + musicsh.def.volume = 3; // Volume + musicsh.def.pulse = 128; // Pulse-Width + musicsh.def.quantize = 64; // Quantize + musicsh.def.sustain = 64; // Sustain + musicsh.def.arpptr = 0; // Arpeggio pointer + musicsh.def.efftype = 0; // Effect type + musicsh.def.efftick = 1; // Effect tick + + // Convert file + strcpy(p_file, ""); + p_line = 1; + convertmus_file(confs.mus_f); + + // Generate var name out of source filename + if (!strlen(confs.mus_v)) { + strcpy(confs.mus_v, GetFilename(confs.mus_f)); + RemoveExtension(confs.mus_v); + FixSymbolID(confs.mus_v); + } + if (!strlen(confs.sfx_v)) { + strcpy(confs.sfx_v, GetFilename(confs.mus_f)); + RemoveExtension(confs.sfx_v); + strcat(confs.sfx_v, STR_APPEND_SFX); + FixSymbolID(confs.sfx_v); + } + if (!strlen(confs.bgm_v)) { + strcpy(confs.bgm_v, GetFilename(confs.mus_f)); + RemoveExtension(confs.bgm_v); + strcat(confs.bgm_v, STR_APPEND_BGM); + FixSymbolID(confs.bgm_v); + } + + // Assemble raw commands + totalsiz = 0; + for (i=0; inumpattern; i++) { + pmmusic_asmPAT(musiclist->pattern[i]); + totalsiz += musiclist->pattern[i]->numraw * 2; + } + for (i=0; inumsfx; i++) { + pmmusic_asmPAT(musiclist->sfx[i]); + totalsiz += musiclist->sfx[i]->numraw * 2; + } + + // Display resources + if (!confs.quiet) { + printf("Mastertime: $%04X, (%i)\n", musicsh.mastertime_val, musicsh.mastertime_val); + printf("Resources, %i Bytes:\n", totalsiz); + printf("%3i Pattern(s)\n", musiclist->numpattern); + if (confs.verbose) { + for (i=0; inumpattern; i++) { + printf("\t'%s' - %i Bytes\n", musiclist->pattern[i]->varname, musiclist->pattern[i]->numraw * 2); + } + } + printf("%3i SFX\n", musiclist->numsfx); + if (confs.verbose) { + for (i=0; inumsfx; i++) { + printf("\t'%s' - %i Bytes\n", musiclist->sfx[i]->varname, musiclist->sfx[i]->numraw * 2); + } + } + printf("%3i BGM\n", musiclist->numbgm); + if (confs.verbose) { + for (i=0; inumbgm; i++) { + printf("\t'%s' - %i Bytes\n", musiclist->bgm[i]->varname, musiclist->bgm[i]->numpattern * 4); + } + } + } + + // Output file + if (strlen(confs.out_f)) { + foptr = Open_ExportCode(confs.format, confs.out_f); + if (foptr) { + Comment_ExportCode(foptr, "%s", EXPORT_STR); + Comment_ExportCode(foptr, "Data file"); + Comment_ExportCode(foptr, ""); + if (strlen(musicsh.title)) Comment_ExportCode(foptr, "Title: %s", musicsh.title); + if (strlen(musicsh.composer)) Comment_ExportCode(foptr, "Composer: %s", musicsh.composer); + if (strlen(musicsh.programmer)) Comment_ExportCode(foptr, "Programmer: %s", musicsh.programmer); + if (strlen(musicsh.description)) Comment_ExportCode(foptr, "Description: %s", musicsh.description); + Comment_ExportCode(foptr, "Mastertime: $%04X, (%i)", musicsh.mastertime_val, musicsh.mastertime_val); + PrintASM_ExportCode(foptr, "\n\t.align 2\n"); + // Export patterns + Comment_ExportCode(foptr, ""); + Comment_ExportCode(foptr, "%3i Pattern(s)", musiclist->numpattern); + Comment_ExportCode(foptr, ""); + for (i=0; inumpattern; i++) { + WriteArray_ExportCode(foptr, FILE_ECODE_16BITS, musiclist->pattern[i]->varname, (void *)musiclist->pattern[i]->raw, musiclist->pattern[i]->numraw * 2); + } + // Export SFXs + Comment_ExportCode(foptr, ""); + Comment_ExportCode(foptr, "%3i SFX", musiclist->numsfx); + Comment_ExportCode(foptr, ""); + for (i=0; inumsfx; i++) { + WriteArray_ExportCode(foptr, FILE_ECODE_16BITS, musiclist->sfx[i]->varname, (void *)musiclist->sfx[i]->raw, musiclist->sfx[i]->numraw * 2); + } + // Export BGMs + Comment_ExportCode(foptr, ""); + Comment_ExportCode(foptr, "%3i BGM", musiclist->numbgm); + Comment_ExportCode(foptr, ""); + for (i=0; inumbgm; i++) { + BlockOpen_ExportCode(foptr, FILE_ECODE_32BITS, musiclist->bgm[i]->varname); + for (j=0; jbgm[i]->numpattern; j++) BlockVarWrite_ExportCode(foptr, musiclist->bgm[i]->pattern[j]->varname); + BlockClose_ExportCode(foptr); + } + + if (!confs.quiet) printf("Exported data '%s'\n", confs.out_f); + } else printf("Error: Couldn't write output to '%s'\n", confs.out_f); + Close_ExportCode(foptr); + } + + // Output header file + if (strlen(confs.outh_f)) { + fo = fopen(confs.outh_f, "w"); + if (fo) { + if (confs.format == FILE_ECODE_ASM) { + fprintf(fo, "; %s\n; Header file\n\n", EXPORT_STR); + if (strlen(musicsh.title)) fprintf(fo, "; Title: %s\n", musicsh.title); + if (strlen(musicsh.composer)) fprintf(fo, "; Composer: %s\n", musicsh.composer); + if (strlen(musicsh.programmer)) fprintf(fo, "; Programmer: %s\n", musicsh.programmer); + if (strlen(musicsh.description)) fprintf(fo, "; Description: %s\n", musicsh.description); + if (strlen(musicsh.title)) fprintf(fo, ".set " STR_TITLE " \"%s\"\n", confs.mus_v, musicsh.title); + if (strlen(musicsh.composer)) fprintf(fo, ".set " STR_COMPOSER " \"%s\"\n", confs.mus_v, musicsh.composer); + if (strlen(musicsh.programmer)) fprintf(fo, ".set " STR_PROGRAMMER " \"%s\"\n", confs.mus_v, musicsh.programmer); + if (strlen(musicsh.description)) fprintf(fo, ".set " STR_DESCRIPTION " \"%s\"\n", confs.mus_v, musicsh.description); + fprintf(fo, "\n; Mastertime: $%04X, (%i)\n", musicsh.mastertime_val, musicsh.mastertime_val); + fprintf(fo, ".set " STR_MTIME " %i\n", confs.mus_v, musicsh.mastertime_val); + fprintf(fo, "\n; %3i Pattern(s)\n", musiclist->numpattern); + fprintf(fo, ".set " STR_NUMPAT " %i\n", confs.mus_v, musiclist->numpattern); + for (i=0; inumpattern; i++) { + fprintf(fo, "; '%s'\n", musiclist->pattern[i]->varname); + } + fprintf(fo, "\n; %3i SFX\n", musiclist->numsfx); + fprintf(fo, ".set " STR_NUMSFX " %i\n", confs.mus_v, musiclist->numsfx); + for (i=0; inumsfx; i++) { + fprintf(fo, "; '%s'\n", musiclist->sfx[i]->varname); + for (j=strlen(musiclist->sfx[i]->varname); j>=0; j--) tmp[j] = toupper(musiclist->sfx[i]->varname[j]); + fprintf(fo, "\t.set %s %i\n", tmp, i); + } + fprintf(fo, "\n; %3i BGM\n", musiclist->numbgm); + fprintf(fo, ".set " STR_NUMBGM " %i\n", confs.mus_v, musiclist->numbgm); + for (i=0; inumbgm; i++) { + fprintf(fo, "; '%s'\n", musiclist->bgm[i]->varname); + for (j=strlen(musiclist->bgm[i]->varname); j>=0; j--) tmp[j] = toupper(musiclist->bgm[i]->varname[j]); + fprintf(fo, "\t.set %s %i\n", tmp, i); + } + fprintf(fo, "\n"); + } else if (confs.format == FILE_ECODE_C) { + fprintf(fo, "// %s\n// Header file\n\n", EXPORT_STR); + if (strlen(musicsh.title)) fprintf(fo, "// Title: %s\n", musicsh.title); + if (strlen(musicsh.composer)) fprintf(fo, "// Composer: %s\n", musicsh.composer); + if (strlen(musicsh.programmer)) fprintf(fo, "// Programmer: %s\n", musicsh.programmer); + if (strlen(musicsh.description)) fprintf(fo, "// Description: %s\n", musicsh.description); + if (strlen(musicsh.title)) fprintf(fo, "#define " STR_TITLE " \"%s\"\n", confs.mus_v, musicsh.title); + if (strlen(musicsh.composer)) fprintf(fo, "#define " STR_COMPOSER " \"%s\"\n", confs.mus_v, musicsh.composer); + if (strlen(musicsh.programmer)) fprintf(fo, "#define " STR_PROGRAMMER " \"%s\"\n", confs.mus_v, musicsh.programmer); + if (strlen(musicsh.description)) fprintf(fo, "#define " STR_DESCRIPTION " \"%s\"\n", confs.mus_v, musicsh.description); + fprintf(fo, "\n// Mastertime: $%04X, (%i)\n", musicsh.mastertime_val, musicsh.mastertime_val); + fprintf(fo, "#define " STR_MTIME " (%i)\n", confs.mus_v, musicsh.mastertime_val); + fprintf(fo, "\n// %3i Pattern(s)\n", musiclist->numpattern); + fprintf(fo, "#define " STR_NUMPAT " %i\n", confs.mus_v, musiclist->numpattern); + for (i=0; inumpattern; i++) { + fprintf(fo, "extern unsigned short %s[];\n", musiclist->pattern[i]->varname); + } + fprintf(fo, "\n// %3i SFX\n", musiclist->numsfx); + fprintf(fo, "#define " STR_NUMSFX " %i\n", confs.mus_v, musiclist->numsfx); + for (i=0; inumsfx; i++) { + for (j=strlen(musiclist->sfx[i]->varname); j>=0; j--) tmp[j] = toupper(musiclist->sfx[i]->varname[j]); + fprintf(fo, "#define %s %i\n", tmp, i); + fprintf(fo, "extern unsigned short %s[];\n", musiclist->sfx[i]->varname); + } + fprintf(fo, "\n// %3i BGM\n", musiclist->numbgm); + fprintf(fo, "#define " STR_NUMBGM " %i\n", confs.mus_v, musiclist->numbgm); + for (i=0; inumbgm; i++) { + for (j=strlen(musiclist->bgm[i]->varname); j>=0; j--) tmp[j] = toupper(musiclist->bgm[i]->varname[j]); + fprintf(fo, "#define %s %i\n", tmp, i); + fprintf(fo, "extern unsigned long %s[];\n", musiclist->bgm[i]->varname); + } + fprintf(fo, "\n"); + } + if (!confs.quiet) printf("Exported header '%s'\n", confs.outh_f); + } else printf("Error: Couldn't write output to '%s'\n", confs.outh_f); + fclose(fo); + } + + // Output sound list + if (strlen(confs.outl_f)) { + fo = fopen(confs.outl_f, "w"); + if (fo) { + if (confs.format == FILE_ECODE_ASM) { + fprintf(fo, "; %s\n; Sound list file\n\n", EXPORT_STR); + if (strlen(musicsh.title)) fprintf(fo, "; Title: %s\n", musicsh.title); + if (strlen(musicsh.composer)) fprintf(fo, "; Composer: %s\n", musicsh.composer); + if (strlen(musicsh.programmer)) fprintf(fo, "; Programmer: %s\n", musicsh.programmer); + if (strlen(musicsh.description)) fprintf(fo, "; Description: %s\n", musicsh.description); + fprintf(fo, "\n; Mastertime: $%04X, (%i)\n", musicsh.mastertime_val, musicsh.mastertime_val); + fprintf(fo, "\n; %3i Pattern(s)\n", musiclist->numpattern); + // Export SFXs + fprintf(fo, "\n; %3i SFX\n", musiclist->numsfx); + fprintf(fo, "%s:\n", confs.sfx_v); + for (i=0; inumsfx; i++) { + fprintf(fo, "\t.dd %s\n", musiclist->sfx[i]->varname); + } + // Export BGMs + fprintf(fo, "\n; %3i BGM\n", musiclist->numbgm); + fprintf(fo, "%s:\n", confs.bgm_v); + for (i=0; inumbgm; i++) { + fprintf(fo, "\t.dd %s\n", musiclist->bgm[i]->varname); + } + fprintf(fo, "\n"); + } else if (confs.format == FILE_ECODE_C) { + fprintf(fo, "// %s\n// Sound list file\n\n", EXPORT_STR); + if (strlen(musicsh.title)) fprintf(fo, "// Title: %s\n", musicsh.title); + if (strlen(musicsh.composer)) fprintf(fo, "// Composer: %s\n", musicsh.composer); + if (strlen(musicsh.programmer)) fprintf(fo, "// Programmer: %s\n", musicsh.programmer); + if (strlen(musicsh.description)) fprintf(fo, "// Description: %s\n", musicsh.description); + fprintf(fo, "\n// Mastertime: $%04X, (%i)\n", musicsh.mastertime_val, musicsh.mastertime_val); + fprintf(fo, "\n// %3i Pattern(s)\n", musiclist->numpattern); + // Export SFXs + fprintf(fo, "\n// %3i SFX\n", musiclist->numsfx); + fprintf(fo, "unsigned long %s[] = {\n", confs.sfx_v); + for (i=0; inumsfx; i++) { + fprintf(fo, "\t%s,\n", musiclist->sfx[i]->varname); + } + fprintf(fo, "};\n"); + // Export BGMs + fprintf(fo, "\n// %3i BGM\n", musiclist->numbgm); + fprintf(fo, "unsigned long %s[] = {\n", confs.bgm_v); + for (i=0; inumbgm; i++) { + fprintf(fo, "\t%s,\n", musiclist->bgm[i]->varname); + } + fprintf(fo, "};\n"); + fprintf(fo, "\n"); + } + if (!confs.quiet) printf("Exported sound list '%s'\n", confs.outl_f); + } else printf("Error: Couldn't write output to '%s'\n", confs.outl_f); + fclose(fo); + } + + // Playback converted music + if (confs.play_v[0]) { + + // Initialize PMMusic engine + if (!pmmusic_initialize(PMSNDBUFFER, confs.sndengine, confs.sndfilter)) { + printf("Error: Couldn't initialize pmmusic engine\n"); + return 1; + } + pmmusic_init(musicsh.mastertime_val, musicsh.ram); + + // Check if varname exist + tbgm = pmmusic_getBGM(musiclist, confs.play_v, NULL); + if (!tbgm) { + tsfx = pmmusic_getSFX(musiclist, confs.play_v, NULL); + if (!tsfx) { + tsfx = pmmusic_getPAT(musiclist, confs.play_v, NULL); + if (!tsfx) { + printf("Error: Couldn't find '%s' to play\n", confs.play_v); + return 1; + } else { + pmmusic_playsfx(tsfx); + if (!confs.quiet) printf("Playing Pattern '%s'\n", confs.play_v); + } + } else { + pmmusic_playsfx(tsfx); + if (!confs.quiet) printf("Playing SFX '%s'\n", confs.play_v); + } + } else { + pmmusic_playbgm(tbgm); + if (!confs.quiet) printf("Playing BGM '%s'\nPress any key to stop...\n", confs.play_v); + } + + // Open WAV capture if was requested + if (confs.rec_f[0]) { + sdump = Open_ExportWAV(confs.rec_f, EXPORTWAV_44KHZ | EXPORTWAV_MONO | EXPORTWAV_16BITS); + if (!sdump) { + printf("Error: Opening sound export file\n"); + return 1; + } + raw_handle_ctrlc(sdump_close); + } + + // Initialize audio & play + init_saudio(audio_fill, SOUNDBUFFER); + play_saudio(); + + // Play + playdec = 36; + while ((!raw_input_check()) && playdec && notbreak) { + if (pmmusic.aud_ena) playdec = 36; + else playdec--; + + pmmusic_emulate(4000000/72); + if (pmmusic.err) { + if (pmmusic.err == 1) { + printf("Player error: BGM out of range\n"); + } else if (pmmusic.err == 2) { + printf("Player error: BGM invalid pattern\n"); + } else if (pmmusic.err == 3) { + printf("Player error: SFX out of range\n"); + } else if (pmmusic.err == 4) { + printf("Player error: Recursive overflow\n"); + } else { + printf("Player error: Unknown\n"); + } + break; + } + + while (MinxAudio_SyncWithAudio()) { + sync_saudio(); + sleep_saudio(1); + } + } + + // Terminate audio + term_saudio(); + + // Close WAV capture if there's one + if (sdump) Close_ExportWAV(sdump); + + pmmusic_terminate(); + } + + // Destroy + pmmusic_deletelist(musiclist); + + return 0; +} diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pokemini_musicconv.h b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pokemini_musicconv.h new file mode 100644 index 0000000000..4d0d2ecc00 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/pokemini_musicconv.h @@ -0,0 +1,45 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2015 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MUS_CONV_H +#define MUS_CONV_H + +#include + +enum { + FORMAT_RAW, + FORMAT_ASM, + FORMAT_C +}; + +void init_confs(); +int load_confs_args(int argc, char **argv); + +const char *readmus_num(const char *s, int *nout, int maxhdigits); +char *readmus_line(FILE *fi, char *s, int len); +int convertmml_file(const char *mmlfile); + +void *open_output(int format, const char *filename); +void comment_output(void *foptr, int format, const char *fmt, ...); +int write_output(void *foptr, int format, const char *varname, unsigned char *data, int bytes); +int wropen_output(void *foptr, int format, int bits, const char *varname); +int wrdata_output(void *foptr, int format, int bits, int data); +int wrclose_output(void *foptr, int format); +void close_output(void *foptr, int format); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/raw_input.c b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/raw_input.c new file mode 100644 index 0000000000..0b38d30286 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/raw_input.c @@ -0,0 +1,100 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +void (*raw_handle_callback)(void) = 0; + +#ifdef _WIN32 + +#include +#include + +int raw_input_check(void) +{ + return kbhit(); +} + +BOOL CtrlHandler(DWORD fdwCtrlType) +{ + switch (fdwCtrlType) { + case CTRL_C_EVENT: + if (raw_handle_callback) raw_handle_callback(); + return TRUE; + default: + return FALSE; + } +} + +void raw_handle_ctrlc(void (*func)(void)) +{ + raw_handle_callback = func; + SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); + /* + DWORD ConMode; + HANDLE StdIn = GetStdHandle(STD_INPUT_HANDLE); + GetConsoleMode(StdIn, &ConMode); + SetConsoleMode(StdIn, ConMode & ~ENABLE_PROCESSED_INPUT); + */ +} + +#else + +#include +#include +#include +#include + +int raw_input_check(void) +{ + fd_set set; + struct termios oldterm, newterm; + struct timeval tv; + int res; + + // Backup terminal + tcgetattr(STDIN_FILENO, &oldterm ); + newterm = oldterm; + + // Set "raw" terminal mode + newterm.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newterm); + + // Select for checking the input + FD_ZERO(&set); + FD_SET(STDIN_FILENO, &set); + tv.tv_sec = 0; + tv.tv_usec = 0; + res = select(STDIN_FILENO+1, &set, NULL, NULL, &tv); + + // Restore terminal + tcsetattr(STDIN_FILENO, TCSANOW, &oldterm); + + return res; +} + +void raw_handle_signal(int signo) +{ + if (raw_handle_callback) raw_handle_callback(); +} + +void raw_handle_ctrlc(void (*func)(void)) +{ + raw_handle_callback = func; + signal(SIGINT, raw_handle_signal); +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/raw_input.h b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/raw_input.h new file mode 100644 index 0000000000..27221a5a9d --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/raw_input.h @@ -0,0 +1,27 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef RAW_INPUT_H +#define RAW_INPUT_H + +extern int raw_notbreak; + +int raw_input_check(void); +void raw_handle_ctrlc(void (*func)(void)); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/saudio_al.c b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/saudio_al.c new file mode 100644 index 0000000000..898617399b --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/saudio_al.c @@ -0,0 +1,175 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include + +#include +#include + +#include "saudio_al.h" + +static ALCdevice *saudio_dev; +static ALCcontext *saudio_ctx; +static int saudio_buffsize; +static ALuint saudio_buffer[NUMSNDBUFFERS]; +static ALuint saudio_source; +static int16_t *saudio_bdata; +static saudio_fillcb saudio_fill; + +int init_saudio(saudio_fillcb cb, int bufsize) +{ + int i; + + saudio_dev = alcOpenDevice(NULL); + if (!saudio_dev) { + printf("Error opening audio device\n"); + return 0; + } + + saudio_ctx = alcCreateContext(saudio_dev, NULL); + alcMakeContextCurrent(saudio_ctx); + if (!saudio_ctx) + { + printf("Error creating audio context\n"); + return 0; + } + + // Clear errors + alGetError(); + + // Generate buffers + alGenBuffers(4, saudio_buffer); + if (alGetError() != AL_NO_ERROR) { + printf("Error creating audio buffers\n"); + return 0; + } + + // Generate sources + alGenSources(1, &saudio_source); + if (alGetError() != AL_NO_ERROR) { + printf("Error creating audio sources\n"); + return 0; + } + + // Setup + saudio_fill = cb; + saudio_buffsize = bufsize; + saudio_bdata = (int16_t *)malloc(saudio_buffsize); + if (!saudio_bdata) { + printf("Error allocating buffer data\n"); + return 0; + } + + // Initialize buffer content + for (i=0; i<(saudio_buffsize>>1); i++) saudio_bdata[i] = 0; + alBufferData(saudio_buffer[0], AL_FORMAT_MONO16, saudio_bdata, saudio_buffsize, 44100.0); + alBufferData(saudio_buffer[1], AL_FORMAT_MONO16, saudio_bdata, saudio_buffsize, 44100.0); + alBufferData(saudio_buffer[2], AL_FORMAT_MONO16, saudio_bdata, saudio_buffsize, 44100.0); + alBufferData(saudio_buffer[3], AL_FORMAT_MONO16, saudio_bdata, saudio_buffsize, 44100.0); + if (alGetError() != AL_NO_ERROR) { + printf("Error setting buffer data\n"); + return 0; + } + alSourceQueueBuffers(saudio_source, NUMSNDBUFFERS, saudio_buffer); + + return 1; +} + +void term_saudio() +{ + int val; + + do { + alGetSourcei(saudio_source, AL_SOURCE_STATE, &val); + } while (val == AL_PLAYING); + if (saudio_bdata) free((void *)saudio_bdata); + + alDeleteSources(1, &saudio_source); + alDeleteBuffers(NUMSNDBUFFERS, saudio_buffer); + + alcMakeContextCurrent(NULL); + alcDestroyContext(saudio_ctx); + alcCloseDevice(saudio_dev); +} + +int play_saudio() +{ + alSourcePlay(saudio_source); + if (alGetError() != AL_NO_ERROR) return 0; + + return 1; +} + +int stop_saudio() +{ + alSourceStop(saudio_source); + if (alGetError() != AL_NO_ERROR) return 0; + + return 1; +} + +int sync_saudio() +{ + ALuint buffer; + int val; + + alGetSourcei(saudio_source, AL_BUFFERS_PROCESSED, &val); + if (val <= 0) return 1; + while (val--) { + alSourceUnqueueBuffers(saudio_source, 1, &buffer); + if (saudio_fill) { + memset(saudio_bdata, 0, saudio_buffsize); + saudio_fill(saudio_bdata, saudio_buffsize); + } + alBufferData(buffer, AL_FORMAT_MONO16, saudio_bdata, saudio_buffsize, 44100.0); + alSourceQueueBuffers(saudio_source, 1, &buffer); + if (alGetError() != AL_NO_ERROR) { + printf("Error while buffering\n"); + return 0; + } + } + alGetSourcei(saudio_source, AL_SOURCE_STATE, &val); + if (val != AL_PLAYING) alSourcePlay(saudio_source); + return 0; +} + +#ifdef _WIN32 + +#include + +void sleep_saudio(int ms) +{ + Sleep(ms); +} + +#else + +#include + +void sleep_saudio(int ms) +{ + struct timespec req={0}; + req.tv_sec = (time_t)(ms/1000); + req.tv_nsec = ms * 1000000L; + while (nanosleep(&req, &req) == -1); +} + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/saudio_al.h b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/saudio_al.h new file mode 100644 index 0000000000..b852d243ab --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/musicconv/saudio_al.h @@ -0,0 +1,38 @@ +/* + PokeMini Music Converter + Copyright (C) 2011-2012 JustBurn + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef SAUDIO_AL_H +#define SAUDIO_AL_H + +#include + +#define NUMSNDBUFFERS 4 + +typedef void (*saudio_fillcb)(int16_t *stream, int len); + +int init_saudio(saudio_fillcb cb, int bufsize); +void term_saudio(void); + +int play_saudio(void); +int stop_saudio(void); + +int sync_saudio(void); + +void sleep_saudio(int ms); + +#endif diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/readme_colormapper.txt b/PVPokeMini/PokeMini/pokemini-code/tools/readme_colormapper.txt new file mode 100644 index 0000000000..18c685fce2 --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/readme_colormapper.txt @@ -0,0 +1,33 @@ +PokeMini Color Mapper 1.3 +------------------------- + +Dependencies: GTK+ + +This was an experiment of how to add colors information into roms while remaining 100% compability, +the real system doesn't support colors, only the emulator can display the extra information. + +Latest version can be found in: +http://pokemini.sourceforge.net/ + + +Changes from 1.2 to 1.3: +------------------------ +Opening .minc files now opens the linked .min files + +Changes from 1.1 to 1.2: +------------------------ +MIN can be loaded from command-line +Settings are loaded and saved now +Cosmetic changes + +Changes from 1.0 to 1.1: +------------------------ +Some fixes +Fill now respect "paint disabled" in colors +Swap with blend now update the scroll bar +Added contrast preview +Added "display blend" & "swap with blend" on main window +Changed color palette to reflect new PokeMini 0.5.0 +Color format can now be converted +New color flag: "Require rendering video to RAM" +Windows only: Native windows open/save dialogs diff --git a/PVPokeMini/PokeMini/pokemini-code/tools/readme_converters.txt b/PVPokeMini/PokeMini/pokemini-code/tools/readme_converters.txt new file mode 100644 index 0000000000..b6662a5d7a --- /dev/null +++ b/PVPokeMini/PokeMini/pokemini-code/tools/readme_converters.txt @@ -0,0 +1,65 @@ +---------------------------- +PokeMini Image Converter 1.4 +---------------------------- + +Dependencies: FreeImage + +Latest version can be found in: +http://pokemini.sourceforge.net/ + + +Changes from 1.3 to 1.4: +------------------------ +Dark threhold is now lower + +Changes from 1.2 to 1.3: +------------------------ +Added "Dark threhold" and "Light threhold" switches +Check correct width and height with metatiles (prevents crash for sprites with invalid image) +Error messages now output to stderr + +Changes from 1.1 to 1.2: +------------------------ +Filename is now parsed as a valid symbol + +Changes from 1.0 to 1.1: +------------------------ +Added new gfx format that allow to build a map from a tileset +Better header generation +Minor fixes + + +---------------------------- +PokeMini Music Converter 1.4 +---------------------------- + +Dependencies: OpenAL + +Latest version can be found in: +http://pokemini.sourceforge.net/ + + +Changes from 1.3 to 1.4: +------------------------ +Added new directives +Fixed crash on exit with BGM using multiple copies of the same pattern +Using 2nd loop mark on BGM list now throw error as it should + +Changes from 1.2 to 1.3: +------------------------ +If is saving WAV while playing, pressing Ctrl+C will no longer generate an invalid WAV file +Added new effect to play random frequencies between 2 notes +Added pulse-width by percentage +Sound now play with the correct octave +Sound stop will now works properly +Error messages now output to stderr + +Changes from 1.1 to 1.2: +------------------------ +Filename is now parsed as a valid symbol + +Changes from 1.0 to 1.1: +------------------------ +Added new directives: MBPM, OUTFILE, VARHEADER and OUTHEADER +Better header generation +Minor fixes diff --git a/PVPokeMini/README.md b/PVPokeMini/README.md new file mode 100644 index 0000000000..0308ba08cf --- /dev/null +++ b/PVPokeMini/README.md @@ -0,0 +1,2 @@ +# PokeMini-Core +OpenEmu Core plugin with PokeMini to support Pokemon mini emulation diff --git a/PVStella/PVStella/Stella/OE2600SystemResponderClient.h b/PVStella/PVStella/Stella/OE2600SystemResponderClient.h index 905928a9dd..c53c4568a4 100644 --- a/PVStella/PVStella/Stella/OE2600SystemResponderClient.h +++ b/PVStella/PVStella/Stella/OE2600SystemResponderClient.h @@ -43,7 +43,7 @@ typedef NS_ENUM(NSUInteger, OE2600Button) { OE2600ButtonCount }; -@protocol OE2600SystemResponderClient +@protocol OE2600SystemResponderClient - (oneway void)didPush2600Button:(OE2600Button)button forPlayer:(NSUInteger)player; - (oneway void)didRelease2600Button:(OE2600Button)button forPlayer:(NSUInteger)player; diff --git a/PVStella/PVStella/Stella/PVStellaGameCore.mm b/PVStella/PVStella/Stella/PVStellaGameCore.mm index f6288c69c1..247b768a02 100644 --- a/PVStella/PVStella/Stella/PVStellaGameCore.mm +++ b/PVStella/PVStella/Stella/PVStellaGameCore.mm @@ -67,7 +67,7 @@ @interface PVStellaGameCore () { @end -__weak PVStellaGameCore *_current; +static __weak PVStellaGameCore *_current; @implementation PVStellaGameCore diff --git a/PVSupport/PVSupport.xcodeproj/project.pbxproj b/PVSupport/PVSupport.xcodeproj/project.pbxproj index c982134460..9e039eb5a9 100644 --- a/PVSupport/PVSupport.xcodeproj/project.pbxproj +++ b/PVSupport/PVSupport.xcodeproj/project.pbxproj @@ -33,6 +33,10 @@ B3C96ECC1D62C5E7003F1E93 /* NSObject+PVAbstractAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ACEA6A017F74A5A0031B1C9 /* NSObject+PVAbstractAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; B3C96ECD1D62C5E7003F1E93 /* (null) in Headers */ = {isa = PBXBuildFile; settings = {ATTRIBUTES = (Public, ); }; }; B3C96ED01D62C5E7003F1E93 /* TPCircularBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ACEA69617F748F80031B1C9 /* TPCircularBuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D3D1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B3D73D3B1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D3E1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B3D73D3B1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3D73D3F1EA15BB20023925B /* NSFileManager+OEHashingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B3D73D3C1EA15BB20023925B /* NSFileManager+OEHashingAdditions.m */; }; + B3D73D401EA15BB20023925B /* NSFileManager+OEHashingAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B3D73D3C1EA15BB20023925B /* NSFileManager+OEHashingAdditions.m */; }; B3FA5D441D6B858A00060D71 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1ACEA64717F7467D0031B1C9 /* Foundation.framework */; }; B3FA5D471D6B859100060D71 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1ACEA67E17F7473C0031B1C9 /* AudioToolbox.framework */; }; B3FA5D491D6B859800060D71 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3FA5D481D6B859800060D71 /* Foundation.framework */; }; @@ -75,6 +79,8 @@ B3C96EBA1D62C54D003F1E93 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B3C96EBB1D62C54D003F1E93 /* PVSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVSupport.h; sourceTree = ""; }; B3C96ED81D62C5E7003F1E93 /* PVSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PVSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3D73D3B1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+OEHashingAdditions.h"; sourceTree = ""; }; + B3D73D3C1EA15BB20023925B /* NSFileManager+OEHashingAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+OEHashingAdditions.m"; sourceTree = ""; }; B3FA5D451D6B858E00060D71 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; B3FA5D481D6B859800060D71 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B3FA5D4A1D6B859C00060D71 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.2.sdk/System/Library/Frameworks/AudioUnit.framework; sourceTree = DEVELOPER_DIR; }; @@ -169,6 +175,8 @@ B3C96EBB1D62C54D003F1E93 /* PVSupport.h */, 1ACEA6A017F74A5A0031B1C9 /* NSObject+PVAbstractAdditions.h */, 1ACEA6A117F74A5A0031B1C9 /* NSObject+PVAbstractAdditions.m */, + B3D73D3B1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h */, + B3D73D3C1EA15BB20023925B /* NSFileManager+OEHashingAdditions.m */, 0592894D1DC194FD0012644D /* RealTimeThread.h */, 0592894E1DC194FD0012644D /* RealTimeThread.m */, B3FA5D5F1D6B90BD00060D71 /* PVEmulatorCore.h */, @@ -216,6 +224,7 @@ B3C96EAE1D62C3C7003F1E93 /* NSObject+PVAbstractAdditions.h in Headers */, B3A9F42C1DE86DAD008450F5 /* PVGameControllerUtilities.h in Headers */, B3C96EB01D62C3C7003F1E93 /* (null) in Headers */, + B3D73D3E1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h in Headers */, B3C96EBD1D62C54D003F1E93 /* PVSupport.h in Headers */, B3FA5D641D6B90BD00060D71 /* PVEmulatorCore.h in Headers */, B3C96EAD1D62C3C3003F1E93 /* TPCircularBuffer.h in Headers */, @@ -232,6 +241,7 @@ B3FA5D5B1D6B908300060D71 /* OERingBuffer.h in Headers */, B3A9F42D1DE86DAE008450F5 /* PVGameControllerUtilities.h in Headers */, B3C96ECC1D62C5E7003F1E93 /* NSObject+PVAbstractAdditions.h in Headers */, + B3D73D3D1EA15BB20023925B /* NSFileManager+OEHashingAdditions.h in Headers */, B3C96ECD1D62C5E7003F1E93 /* (null) in Headers */, B3FA5D631D6B90BD00060D71 /* PVEmulatorCore.h in Headers */, B3C96ED01D62C5E7003F1E93 /* TPCircularBuffer.h in Headers */, @@ -340,6 +350,7 @@ B3C96EAC1D62C3C3003F1E93 /* TPCircularBuffer.c in Sources */, B3C96EAF1D62C3C7003F1E93 /* NSObject+PVAbstractAdditions.m in Sources */, B3FA5D661D6B90BD00060D71 /* PVEmulatorCore.m in Sources */, + B3D73D401EA15BB20023925B /* NSFileManager+OEHashingAdditions.m in Sources */, B3C96EA91D62C3C3003F1E93 /* OEGameAudio.m in Sources */, 0592894F1DC194FD0012644D /* RealTimeThread.m in Sources */, ); @@ -354,6 +365,7 @@ B3C96EC01D62C5E7003F1E93 /* TPCircularBuffer.c in Sources */, B3C96EC21D62C5E7003F1E93 /* NSObject+PVAbstractAdditions.m in Sources */, B3FA5D651D6B90BD00060D71 /* PVEmulatorCore.m in Sources */, + B3D73D3F1EA15BB20023925B /* NSFileManager+OEHashingAdditions.m in Sources */, B3C96EC31D62C5E7003F1E93 /* OEGameAudio.m in Sources */, 059289501DC194FD0012644D /* RealTimeThread.m in Sources */, ); diff --git a/PVSupport/PVSupport/NSFileManager+OEHashingAdditions.h b/PVSupport/PVSupport/NSFileManager+OEHashingAdditions.h new file mode 100644 index 0000000000..34293a1942 --- /dev/null +++ b/PVSupport/PVSupport/NSFileManager+OEHashingAdditions.h @@ -0,0 +1,33 @@ +/* + Copyright (c) 2012, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +@import Foundation; + +@interface NSFileManager (OEHashingAdditions) +- (BOOL)hashFileAtURL:(NSURL*)url md5:(NSString**)outMD5 crc32:(NSString**)outCRC32 error:(NSError**)error; +- (BOOL)hashFileAtURL:(NSURL*)url headerSize:(int)headerSize md5:(NSString**)outMD5 crc32:(NSString**)outCRC32 error:(NSError**)error; + +@end diff --git a/PVSupport/PVSupport/NSFileManager+OEHashingAdditions.m b/PVSupport/PVSupport/NSFileManager+OEHashingAdditions.m new file mode 100644 index 0000000000..5ef90e4be3 --- /dev/null +++ b/PVSupport/PVSupport/NSFileManager+OEHashingAdditions.m @@ -0,0 +1,130 @@ +/* + Copyright (c) 2012, OpenEmu Team + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "NSFileManager+OEHashingAdditions.h" +#import + +#define HASH_READ_CHUNK_SIZE (1024 * 32) + +@implementation NSFileManager (OEHashingAdditions) + +#pragma mark - +#pragma mark MD5 +- (BOOL)hashFileAtURL:(NSURL*)url md5:(NSString**)outMD5 crc32:(NSString**)outCRC32 error:(NSError**)error +{ + return [self hashFileAtURL:url headerSize:0 md5:outMD5 crc32:outCRC32 error:error]; +} + +- (BOOL)hashFileAtURL:(NSURL*)url headerSize:(int)headerSize md5:(NSString**)outMD5 crc32:(NSString**)outCRC32 error:(NSError**)error +{ + NSFileHandle *handle = [NSFileHandle fileHandleForReadingFromURL:url error:error]; + if(handle == nil || (!outMD5 && !outCRC32)) + return NO; + + [handle seekToFileOffset:headerSize]; + + CC_MD5_CTX md5Context; + CC_MD5_Init(&md5Context); + + unsigned crcval = 0xffffffff; + do { + @autoreleasepool + { + NSData *data = [handle readDataOfLength:HASH_READ_CHUNK_SIZE]; + const unsigned char *bytes = [data bytes]; + NSUInteger length = [data length]; + CC_MD5_Update(&md5Context, bytes, (CC_LONG)length); + + for(unsigned x = 0; x < length; x++) + crcval = ((crcval >> 8) & 0x00ffffff) ^ crc32table[(crcval ^ (*(bytes + x))) & 0xff]; + + if(data == nil || length < HASH_READ_CHUNK_SIZE) break; + } + } while(YES); + + [handle closeFile]; + + // Finalize MD5 + unsigned char md5Digest[CC_MD5_DIGEST_LENGTH]; + CC_MD5_Final(md5Digest, &md5Context); + + if(outMD5 != NULL) + *outMD5 = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + md5Digest[0], md5Digest[1], + md5Digest[2], md5Digest[3], + md5Digest[4], md5Digest[5], + md5Digest[6], md5Digest[7], + md5Digest[8], md5Digest[9], + md5Digest[10], md5Digest[11], + md5Digest[12], md5Digest[13], + md5Digest[14], md5Digest[15]]; + + // Finalize CRC32 + unsigned crc32 = crcval ^ 0xffffffff; + if(outCRC32 != nil) + *outCRC32 = [NSString stringWithFormat:@"%08x", crc32]; + + return YES; +} +#pragma mark - +#pragma mark crc32 +static const unsigned int crc32table[] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +@end diff --git a/PVSupport/PVSupport/OEGeometry.h b/PVSupport/PVSupport/OEGeometry.h new file mode 100644 index 0000000000..c785c57a67 --- /dev/null +++ b/PVSupport/PVSupport/OEGeometry.h @@ -0,0 +1,121 @@ +/* + Copyright (c) 2014, OpenEmu Team + + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the OpenEmu Team nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY OpenEmu Team ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL OpenEmu Team BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +typedef struct OEIntPoint { + int x; + int y; +} OEIntPoint; + +typedef struct OEIntSize { + int width; + int height; +} OEIntSize; + +typedef struct OEIntRect { + OEIntPoint origin; + OEIntSize size; +} OEIntRect; + +static inline OEIntPoint OEIntPointMake(int x, int y) +{ + return (OEIntPoint){ x, y }; +} + +static inline OEIntSize OEIntSizeMake(int width, int height) +{ + return (OEIntSize){ width, height }; +} + +static inline OEIntRect OEIntRectMake(int x, int y, int width, int height) +{ + return (OEIntRect){ (OEIntPoint){ x, y }, (OEIntSize){ width, height } }; +} + +static inline BOOL OEIntPointEqualToPoint(OEIntPoint point1, OEIntPoint point2) +{ + return point1.x == point2.x && point1.y == point2.y; +} + +static inline BOOL OEIntSizeEqualToSize(OEIntSize size1, OEIntSize size2) +{ + return size1.width == size2.width && size1.height == size2.height; +} + +static inline BOOL OEIntRectEqualToRect(OEIntRect rect1, OEIntRect rect2) +{ + return OEIntPointEqualToPoint(rect1.origin, rect2.origin) && OEIntSizeEqualToSize(rect1.size, rect2.size); +} + +static inline BOOL OEIntSizeIsEmpty(OEIntSize size) +{ + return size.width == 0 || size.height == 0; +} + +static inline BOOL OEIntRectIsEmpty(OEIntRect rect) +{ + return OEIntSizeIsEmpty(rect.size); +} + +static inline CGSize CGSizeFromOEIntSize(OEIntSize size) +{ + return CGSizeMake(size.width, size.height); +} + +static inline NSString *NSStringFromOEIntPoint(OEIntPoint p) +{ + return [NSString stringWithFormat:@"{ %d, %d }", p.x, p.y]; +} + +static inline NSString *NSStringFromOEIntSize(OEIntSize s) +{ + return [NSString stringWithFormat:@"{ %d, %d }", s.width, s.height]; +} + +static inline NSString *NSStringFromOEIntRect(OEIntRect r) +{ + return [NSString stringWithFormat:@"{ %@, %@ }", NSStringFromOEIntPoint(r.origin), NSStringFromOEIntSize(r.size)]; +} + +static inline CGSize OEScaleSize(CGSize size, CGFloat factor) +{ + return (CGSize){size.width*factor, size.height*factor}; +} + +static inline CGSize OERoundSize(CGSize size) +{ + return (CGSize){roundf(size.width), roundf(size.height)}; +} + +static inline BOOL CGPointInTriangle(CGPoint p, CGPoint A, CGPoint B, CGPoint C) +{ + CGFloat d = (B.y-C.y) * (A.x-C.x) + (C.x - B.x) * (A.y - C.y); + CGFloat a = ((B.y - C.y)*(p.x - C.x) + (C.x - B.x)*(p.y - C.y)) / d; + CGFloat b = ((C.y - A.y)*(p.x - C.x) + (A.x - C.x)*(p.y - C.y)) / d; + CGFloat c = 1 - a - b; + + return 0 <= a && a <= 1 && 0 <= b && b <= 1 && 0 <= c && c <= 1; +} diff --git a/PVSupport/PVSupport/PVEmulatorCore.h b/PVSupport/PVSupport/PVEmulatorCore.h index 135e854b22..6ec6654f11 100644 --- a/PVSupport/PVSupport/PVEmulatorCore.h +++ b/PVSupport/PVSupport/PVEmulatorCore.h @@ -51,6 +51,9 @@ typedef NS_ENUM(NSInteger, PVEmulatorCoreErrorCode) { @property (nonatomic, copy) NSString *saveStatesPath; @property (nonatomic, copy) NSString *batterySavesPath; @property (nonatomic, copy) NSString *BIOSPath; +@property (nonatomic, copy) NSString *systemIdentifier; +@property (nonatomic, strong) NSString* romMD5; + @property (atomic, assign) BOOL shouldResyncTime; typedef NS_ENUM(NSInteger, GameSpeed) { @@ -73,7 +76,7 @@ typedef NS_ENUM(NSInteger, GameSpeed) { - (void)stopEmulation; - (void)frameRefreshThread:(id)anArgument; - (void)executeFrame; -- (BOOL)loadFileAtPath:(NSString*)path; +- (BOOL)loadFileAtPath:(NSString *)path error:(NSError **)error; - (void)updateControllers; - (BOOL)supportsDiskSwapping; @@ -83,6 +86,7 @@ typedef NS_ENUM(NSInteger, GameSpeed) { - (CGRect)screenRect; - (CGSize)aspectSize; - (CGSize)bufferSize; +- (BOOL)wideScreen; - (GLenum)pixelFormat; - (GLenum)pixelType; - (GLenum)internalPixelFormat; diff --git a/PVSupport/PVSupport/PVEmulatorCore.m b/PVSupport/PVSupport/PVEmulatorCore.m index 6cc2d34378..61259c9170 100644 --- a/PVSupport/PVSupport/PVEmulatorCore.m +++ b/PVSupport/PVSupport/PVEmulatorCore.m @@ -37,6 +37,7 @@ - (id)init NSUInteger count = [self audioBufferCount]; ringBuffers = (__strong OERingBuffer **)calloc(count, sizeof(OERingBuffer *)); self.emulationLoopThreadLock = [NSLock new]; + _gameSpeed = GameSpeedNormal; } return self; @@ -195,10 +196,15 @@ - (void)executeFrame [self doesNotImplementOptionalSelector:_cmd]; } -- (BOOL)loadFileAtPath:(NSString*)path +- (BOOL)loadFileAtPath:(NSString *)path { - [self doesNotImplementSelector:_cmd]; - return NO; + [self doesNotImplementSelector:_cmd]; + return NO; +} + +- (BOOL)loadFileAtPath:(NSString *)path error:(NSError **)error +{ + return [self loadFileAtPath:path]; } - (BOOL)supportsDiskSwapping @@ -260,6 +266,10 @@ - (NSTimeInterval)frameInterval return defaultFrameInterval; } +- (BOOL)wideScreen { + return NO; +} + #pragma mark - Audio - (double)audioSampleRate diff --git a/PVSupport/PVSupport/PVSupport.h b/PVSupport/PVSupport/PVSupport.h index 87bbce24ce..d10e7a8954 100644 --- a/PVSupport/PVSupport/PVSupport.h +++ b/PVSupport/PVSupport/PVSupport.h @@ -27,3 +27,4 @@ FOUNDATION_EXPORT const unsigned char PVSupport_FrameworkVersionString[]; #import #import #import +#import diff --git a/Provenance Tests/PVEmulatorConfigurationTests.m b/Provenance Tests/PVEmulatorConfigurationTests.m new file mode 100644 index 0000000000..d61b29f527 --- /dev/null +++ b/Provenance Tests/PVEmulatorConfigurationTests.m @@ -0,0 +1,67 @@ +// +// PVEmulatorConfigurationTests.m +// Provenance +// +// Created by Joseph Mattiello on 4/19/17. +// Copyright © 2017 James Addyman. All rights reserved. +// + +#import +#import "PVEmulatorConfiguration.h" + +@interface PVEmulatorConfigurationTests : XCTestCase + +@end + +@implementation PVEmulatorConfigurationTests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +-(void)testBIOSArrays { + PVEmulatorConfiguration *config = [PVEmulatorConfiguration sharedInstance]; + XCTAssertNotNil(config); + + NSArray*biosEntries = [config biosEntries]; + XCTAssertEqual(biosEntries.count, 12); + + NSArray*psxBiosEntries = [config biosEntriesForSystemIdentifier:@"com.provenance.psx"]; + XCTAssertEqual(psxBiosEntries.count, 3); + + NSArray*bioses5200 = [config biosEntriesForSystemIdentifier:@"com.provenance.5200"]; + XCTAssertEqual(bioses5200.count, 1); + + BIOSEntry*bios5200 = bioses5200.firstObject; + XCTAssertEqualObjects(bios5200.filename, @"5200.rom"); + XCTAssertEqualObjects(bios5200.desc, @"Atari 5200 BIOS"); + XCTAssertEqualObjects(bios5200.expectedMD5, @"281f20ea4320404ec820fb7ec0693b38"); + XCTAssertEqual(bios5200.expectedFileSize.integerValue, 2048); + XCTAssertEqualObjects(bios5200.filename, @"5200.rom"); + +} + +-(void)testBIOSByMD5 { + PVEmulatorConfiguration *config = [PVEmulatorConfiguration sharedInstance]; + XCTAssertNotNil(config); + + BIOSEntry*bios5200 = [config biosEntryForMD5:@"281f20ea4320404ec820fb7ec0693b38"]; + XCTAssertNotNil(bios5200); + XCTAssertEqualObjects(bios5200.filename, @"5200.rom"); +} + +-(void)testBIOSExtension { + PVEmulatorConfiguration *config = [PVEmulatorConfiguration sharedInstance]; + XCTAssertNotNil(config); + + NSArray*extensions = [config supportedBIOSFileExtensions]; + XCTAssertGreaterThan(extensions.count, 0, @"Expected at least 1 extension."); + XCTAssertTrue([extensions containsObject:@"rom"], @"I know at least rom should be in there, it's used multiple times."); +} +@end diff --git a/Provenance Tests/PVGameImporterTests.m b/Provenance Tests/PVGameImporterTests.m index bb0367991c..e9587ce07b 100644 --- a/Provenance Tests/PVGameImporterTests.m +++ b/Provenance Tests/PVGameImporterTests.m @@ -22,6 +22,7 @@ - (NSString *)pathForSystemID:(NSString *)systemID; - (NSArray *)systemIDsForRomAtPath:(NSString *)path; - (BOOL)isCDROM:(NSString *)filePath; +- (NSArray *)searchDatabaseUsingKey:(NSString *)key value:(NSString *)value systemID:(NSString *)systemID error:(NSError **)error; @end @interface PVGameImporterTests : XCTestCase @@ -41,13 +42,14 @@ - (void)tearDown { - (void)testIsCDROM { PVGameImporter *importer = [[PVGameImporter alloc] init]; BOOL isCDROM = [importer isCDROM:@"game.cue"]; - XCTAssertTrue(isCDROM == YES, @".cue should be a CDROM"); - - isCDROM = [importer isCDROM:@"game.iso"]; - XCTAssertTrue(isCDROM == YES, @".iso should be a CDROM"); + XCTAssertTrue(isCDROM, @".cue should be a CDROM"); + + // No cores use .iso without .cue nativaly as far as I know. +// isCDROM = [importer isCDROM:@"game.iso"]; +// XCTAssertTrue(isCDROM == YES, @".iso should be a CDROM"); isCDROM = [importer isCDROM:@"game.bin"]; - XCTAssertTrue(isCDROM == NO, @".bin should not be a CDROM"); + XCTAssertFalse(isCDROM, @".bin should not be a CDROM"); } - (void)testRomToSystemMap { @@ -59,7 +61,8 @@ - (void)testRomToSystemMap { - (void)testSystemToPathMap { PVGameImporter *importer = [[PVGameImporter alloc] init]; NSString *path = [importer pathForSystemID:@"com.provenance.gbc"]; - XCTAssertTrue(([path isEqualToString:[NSString stringWithFormat:@"%@/com.provenance.gbc", [importer romsPath]]]), @"Path should be documents/com.provenance.gbc, but it is not."); + NSString *expected = [NSString stringWithFormat:@"%@/com.provenance.gbc", [importer documentsPath]]; + XCTAssertEqualObjects(path, expected, @"Path should be documents/com.provenance.gbc, but it is not."); } - (void)testPerformanceUpdateSystemToPathMap { @@ -83,4 +86,17 @@ - (void)testSha1 { XCTAssertTrue([sha1 isEqualToString:@"AAF4C61DDCC5E8A2DABEDE0F3B482CD9AEA9434D"]); } +- (void)testMD5toRomMap { + NSString *fileMD5; + NSString *systemID = @""; + PVGameImporter *importer = [[PVGameImporter alloc] init]; + NSError *error; + + [importer searchDatabaseUsingKey:@"romHashMD5" + value:fileMD5 + systemID:@"" + error:&error]; + +} + @end diff --git a/Provenance Tests/Provenance_Tests-Prefix.pch b/Provenance Tests/Provenance_Tests-Prefix.pch index 30ad784f8c..4f4f07e72a 100644 --- a/Provenance Tests/Provenance_Tests-Prefix.pch +++ b/Provenance Tests/Provenance_Tests-Prefix.pch @@ -7,5 +7,4 @@ #ifdef __OBJC__ #import #import - #import #endif diff --git a/Provenance.xcodeproj/project.pbxproj b/Provenance.xcodeproj/project.pbxproj index a0a0dfa18c..5d909d4267 100644 --- a/Provenance.xcodeproj/project.pbxproj +++ b/Provenance.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 1A26EE361AD9FFBF004EA30B /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 1A26EE2F1AD9FFBF004EA30B /* zip.c */; }; 1A26EE371AD9FFBF004EA30B /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A26EE321AD9FFBF004EA30B /* SSZipArchive.m */; }; 1A2A95AA17F7682400F1CB0D /* libstdc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2A95A917F7682400F1CB0D /* libstdc++.dylib */; }; - 1A2B0E881AD1842A005FB77C /* NSData+Hashing.m in Sources */ = {isa = PBXBuildFile; fileRef = 423BB97E17DD46BC0048F457 /* NSData+Hashing.m */; }; 1A2B0E8B1AD187F4005FB77C /* testdata.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1A2B0E8A1AD187F4005FB77C /* testdata.txt */; }; 1A2B0E8C1AD187F4005FB77C /* testdata.txt in Resources */ = {isa = PBXBuildFile; fileRef = 1A2B0E8A1AD187F4005FB77C /* testdata.txt */; }; 1A2B0E8E1AD18961005FB77C /* libc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A2B0E8D1AD18961005FB77C /* libc++.dylib */; }; @@ -86,7 +85,6 @@ 1AD481CA1BA353F300FDA50A /* OESQLiteDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AECF4AB1966D7A600F8704E /* OESQLiteDatabase.m */; }; 1AD481CB1BA353F600FDA50A /* PVMediaCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A48697317C8C0DE0019F6D2 /* PVMediaCache.m */; }; 1AD481CC1BA353F900FDA50A /* PVDirectoryWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A48696B17C8C0DE0019F6D2 /* PVDirectoryWatcher.m */; }; - 1AD481CD1BA353FC00FDA50A /* PVGameImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA2F1ACC871F00EC87A0 /* PVGameImporter.m */; }; 1AD481CE1BA353FE00FDA50A /* PVGameLibraryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A48696D17C8C0DE0019F6D2 /* PVGameLibraryViewController.m */; }; 1AD481CF1BA3540000FDA50A /* PVGameLibraryCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A48696F17C8C0DE0019F6D2 /* PVGameLibraryCollectionViewCell.m */; }; 1AD481D01BA3540300FDA50A /* PVGameLibrarySectionHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 42BC83A817E6775E00E9A607 /* PVGameLibrarySectionHeaderView.m */; }; @@ -167,18 +165,9 @@ 1AD482391BA35A3800FDA50A /* vba-over.ini in Resources */ = {isa = PBXBuildFile; fileRef = 1A9FBE1A1ABD23DD004E778B /* vba-over.ini */; }; 1AD4BC6D1BFD3896007D6C7C /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AD4BC6C1BFD3896007D6C7C /* AVFoundation.framework */; }; 1AD4BC6F1BFD38D6007D6C7C /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AD4BC6E1BFD38D6007D6C7C /* AVFoundation.framework */; }; - 1AD9AA301ACC871F00EC87A0 /* PVGameImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA2F1ACC871F00EC87A0 /* PVGameImporter.m */; }; 1AD9AA3A1ACC988F00EC87A0 /* Provenance_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA391ACC988F00EC87A0 /* Provenance_Tests.m */; }; 1AD9AA411ACC98A200EC87A0 /* systems.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1A34C58517D517760058E7D1 /* systems.plist */; }; 1AD9AA431ACC98F500EC87A0 /* PVGameImporterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA421ACC98F500EC87A0 /* PVGameImporterTests.m */; }; - 1AD9AA441ACC999000EC87A0 /* PVGameImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA2F1ACC871F00EC87A0 /* PVGameImporter.m */; }; - 1AD9AA451ACC999700EC87A0 /* PVEmulatorConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A34C58917D53C9B0058E7D1 /* PVEmulatorConfiguration.m */; }; - 1AD9AA461ACC99B900EC87A0 /* PVControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9647B017D6864300A55612 /* PVControllerViewController.m */; }; - 1AD9AA471ACC99BD00EC87A0 /* PVGenesisControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ADB316417D9341600DB6043 /* PVGenesisControllerViewController.m */; }; - 1AD9AA481ACC99C900EC87A0 /* PVSNESControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E63AE817E12ECE00FE7098 /* PVSNESControllerViewController.m */; }; - 1AD9AA491ACC99C900EC87A0 /* PVGBAControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9FBE221ABD28DA004E778B /* PVGBAControllerViewController.m */; }; - 1AD9AA4A1ACC99C900EC87A0 /* PVGBControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AABE0CF1ABE3E5900FF6AEF /* PVGBControllerViewController.m */; }; - 1AD9AA4B1ACC99C900EC87A0 /* PVNESControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A74171C1ABF231500F3CD3C /* PVNESControllerViewController.m */; }; 1ADB316517D9341600DB6043 /* PVGenesisControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ADB316417D9341600DB6043 /* PVGenesisControllerViewController.m */; }; 1ADDA5B417B30CD7008A7ADD /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1ADDA5B317B30CD7008A7ADD /* GLKit.framework */; }; 1AECF4A91966D76100F8704E /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AECF4A81966D76100F8704E /* libsqlite3.dylib */; }; @@ -214,12 +203,337 @@ 42E63AE917E12ECE00FE7098 /* PVSNESControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E63AE817E12ECE00FE7098 /* PVSNESControllerViewController.m */; }; 42E63F0617DE78AB005802B0 /* UIImage+Scaling.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E63F0517DE78AB005802B0 /* UIImage+Scaling.m */; }; 7556CF7A19DC15C1007F8F97 /* Default.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7556CF7919DC15C1007F8F97 /* Default.xib */; }; + AA9B6EDE1D70981000422E5F /* PVPSXControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AA9B6EDD1D70981000422E5F /* PVPSXControllerViewController.m */; }; + AA9B6EDF1D70981000422E5F /* PVPSXControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AA9B6EDD1D70981000422E5F /* PVPSXControllerViewController.m */; }; B311698D1D70A3A200D7AECA /* ProSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD68A21D6EA7070021B949 /* ProSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B32893731E0B250B0090B97A /* PVWonderSwanControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B32893721E0B250B0090B97A /* PVWonderSwanControllerViewController.m */; }; + B32893741E0B250B0090B97A /* PVWonderSwanControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B32893721E0B250B0090B97A /* PVWonderSwanControllerViewController.m */; }; + B32893781E0B4EA30090B97A /* PVLynxControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B32893771E0B4EA30090B97A /* PVLynxControllerViewController.m */; }; + B32893791E0B4EA30090B97A /* PVLynxControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B32893771E0B4EA30090B97A /* PVLynxControllerViewController.m */; }; + B328937D1E0B87960090B97A /* PVVBControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B328937C1E0B87960090B97A /* PVVBControllerViewController.m */; }; + B328937E1E0B87960090B97A /* PVVBControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B328937C1E0B87960090B97A /* PVVBControllerViewController.m */; }; + B32D8F7D1EA7F79900175FBF /* PVEmulatorConfigurationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B32D8F7C1EA7F79900175FBF /* PVEmulatorConfigurationTests.m */; }; + B32D8F7F1EA7FD6300175FBF /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B32D8F7E1EA7FD6300175FBF /* PVSupport.framework */; }; + B32D8F801EA7FDB900175FBF /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A3D409717B2DCE4004DFFFC /* UIKit.framework */; }; + B32D8F821EA7FDBE00175FBF /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B32D8F811EA7FDBE00175FBF /* GameController.framework */; }; B32F46341D6A8BD70085BA9F /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B32F46331D6A8BD70085BA9F /* PVSupport.framework */; }; B32F46351D6A8BD70085BA9F /* PVSupport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B32F46331D6A8BD70085BA9F /* PVSupport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B340E60A1E088CF900AD0E8B /* PVMednafen.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E6091E088CF900AD0E8B /* PVMednafen.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + B340E60B1E088CF900AD0E8B /* PVMednafen.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B340E6091E088CF900AD0E8B /* PVMednafen.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B349AE371E9ABCF900ACD416 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = B349ACED1E9ABCF800ACD416 /* .gitignore */; }; + B349AE381E9ABCF900ACD416 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = B349ACED1E9ABCF800ACD416 /* .gitignore */; }; + B349AE391E9ABCF900ACD416 /* .travis.yml in Resources */ = {isa = PBXBuildFile; fileRef = B349ACEE1E9ABCF800ACD416 /* .travis.yml */; }; + B349AE3A1E9ABCF900ACD416 /* .travis.yml in Resources */ = {isa = PBXBuildFile; fileRef = B349ACEE1E9ABCF800ACD416 /* .travis.yml */; }; + B349AE3B1E9ABCF900ACD416 /* CHANGELOG in Resources */ = {isa = PBXBuildFile; fileRef = B349ACEF1E9ABCF800ACD416 /* CHANGELOG */; }; + B349AE3C1E9ABCF900ACD416 /* CHANGELOG in Resources */ = {isa = PBXBuildFile; fileRef = B349ACEF1E9ABCF800ACD416 /* CHANGELOG */; }; + B349AE3D1E9ABCF900ACD416 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B349ACF01E9ABCF800ACD416 /* LICENSE */; }; + B349AE3E1E9ABCF900ACD416 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B349ACF01E9ABCF800ACD416 /* LICENSE */; }; + B349AE3F1E9ABCF900ACD416 /* 7zAlloc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF41E9ABCF800ACD416 /* 7zAlloc.c */; }; + B349AE401E9ABCF900ACD416 /* 7zAlloc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF41E9ABCF800ACD416 /* 7zAlloc.c */; }; + B349AE411E9ABCF900ACD416 /* 7zArcIn.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF61E9ABCF800ACD416 /* 7zArcIn.c */; }; + B349AE421E9ABCF900ACD416 /* 7zArcIn.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF61E9ABCF800ACD416 /* 7zArcIn.c */; }; + B349AE431E9ABCF900ACD416 /* 7zBuf.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF71E9ABCF800ACD416 /* 7zBuf.c */; }; + B349AE441E9ABCF900ACD416 /* 7zBuf.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF71E9ABCF800ACD416 /* 7zBuf.c */; }; + B349AE451E9ABCF900ACD416 /* 7zBuf2.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF91E9ABCF800ACD416 /* 7zBuf2.c */; }; + B349AE461E9ABCF900ACD416 /* 7zBuf2.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACF91E9ABCF800ACD416 /* 7zBuf2.c */; }; + B349AE471E9ABCF900ACD416 /* 7zCrc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFA1E9ABCF800ACD416 /* 7zCrc.c */; }; + B349AE481E9ABCF900ACD416 /* 7zCrc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFA1E9ABCF800ACD416 /* 7zCrc.c */; }; + B349AE491E9ABCF900ACD416 /* 7zCrcOpt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFC1E9ABCF800ACD416 /* 7zCrcOpt.c */; }; + B349AE4A1E9ABCF900ACD416 /* 7zCrcOpt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFC1E9ABCF800ACD416 /* 7zCrcOpt.c */; }; + B349AE4B1E9ABCF900ACD416 /* 7zDec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFD1E9ABCF800ACD416 /* 7zDec.c */; }; + B349AE4C1E9ABCF900ACD416 /* 7zDec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFD1E9ABCF800ACD416 /* 7zDec.c */; }; + B349AE4D1E9ABCF900ACD416 /* 7zFile.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFE1E9ABCF800ACD416 /* 7zFile.c */; }; + B349AE4E1E9ABCF900ACD416 /* 7zFile.c in Sources */ = {isa = PBXBuildFile; fileRef = B349ACFE1E9ABCF800ACD416 /* 7zFile.c */; }; + B349AE4F1E9ABCF900ACD416 /* 7zStream.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD001E9ABCF800ACD416 /* 7zStream.c */; }; + B349AE501E9ABCF900ACD416 /* 7zStream.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD001E9ABCF800ACD416 /* 7zStream.c */; }; + B349AE511E9ABCF900ACD416 /* Aes.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD031E9ABCF800ACD416 /* Aes.c */; }; + B349AE521E9ABCF900ACD416 /* Aes.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD031E9ABCF800ACD416 /* Aes.c */; }; + B349AE531E9ABCF900ACD416 /* AesOpt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD051E9ABCF800ACD416 /* AesOpt.c */; }; + B349AE541E9ABCF900ACD416 /* AesOpt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD051E9ABCF800ACD416 /* AesOpt.c */; }; + B349AE551E9ABCF900ACD416 /* Alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD061E9ABCF800ACD416 /* Alloc.c */; }; + B349AE561E9ABCF900ACD416 /* Alloc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD061E9ABCF800ACD416 /* Alloc.c */; }; + B349AE571E9ABCF900ACD416 /* Bcj2.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD081E9ABCF800ACD416 /* Bcj2.c */; }; + B349AE581E9ABCF900ACD416 /* Bcj2.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD081E9ABCF800ACD416 /* Bcj2.c */; }; + B349AE591E9ABCF900ACD416 /* Bcj2Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0A1E9ABCF800ACD416 /* Bcj2Enc.c */; }; + B349AE5A1E9ABCF900ACD416 /* Bcj2Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0A1E9ABCF800ACD416 /* Bcj2Enc.c */; }; + B349AE5B1E9ABCF900ACD416 /* Bra.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0B1E9ABCF800ACD416 /* Bra.c */; }; + B349AE5C1E9ABCF900ACD416 /* Bra.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0B1E9ABCF800ACD416 /* Bra.c */; }; + B349AE5D1E9ABCF900ACD416 /* Bra86.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0D1E9ABCF800ACD416 /* Bra86.c */; }; + B349AE5E1E9ABCF900ACD416 /* Bra86.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0D1E9ABCF800ACD416 /* Bra86.c */; }; + B349AE5F1E9ABCF900ACD416 /* BraIA64.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0E1E9ABCF800ACD416 /* BraIA64.c */; }; + B349AE601E9ABCF900ACD416 /* BraIA64.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD0E1E9ABCF800ACD416 /* BraIA64.c */; }; + B349AE611E9ABCF900ACD416 /* CpuArch.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD101E9ABCF800ACD416 /* CpuArch.c */; }; + B349AE621E9ABCF900ACD416 /* CpuArch.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD101E9ABCF800ACD416 /* CpuArch.c */; }; + B349AE631E9ABCF900ACD416 /* Delta.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD121E9ABCF800ACD416 /* Delta.c */; }; + B349AE641E9ABCF900ACD416 /* Delta.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD121E9ABCF800ACD416 /* Delta.c */; }; + B349AE651E9ABCF900ACD416 /* LzFind.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD141E9ABCF800ACD416 /* LzFind.c */; }; + B349AE661E9ABCF900ACD416 /* LzFind.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD141E9ABCF800ACD416 /* LzFind.c */; }; + B349AE671E9ABCF900ACD416 /* LzFindMt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD161E9ABCF800ACD416 /* LzFindMt.c */; }; + B349AE681E9ABCF900ACD416 /* LzFindMt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD161E9ABCF800ACD416 /* LzFindMt.c */; }; + B349AE691E9ABCF900ACD416 /* Lzma2Dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD191E9ABCF800ACD416 /* Lzma2Dec.c */; }; + B349AE6A1E9ABCF900ACD416 /* Lzma2Dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD191E9ABCF800ACD416 /* Lzma2Dec.c */; }; + B349AE6B1E9ABCF900ACD416 /* Lzma2Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD1B1E9ABCF800ACD416 /* Lzma2Enc.c */; }; + B349AE6C1E9ABCF900ACD416 /* Lzma2Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD1B1E9ABCF800ACD416 /* Lzma2Enc.c */; }; + B349AE6D1E9ABCF900ACD416 /* Lzma86Dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD1E1E9ABCF800ACD416 /* Lzma86Dec.c */; }; + B349AE6E1E9ABCF900ACD416 /* Lzma86Dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD1E1E9ABCF800ACD416 /* Lzma86Dec.c */; }; + B349AE6F1E9ABCF900ACD416 /* Lzma86Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD1F1E9ABCF800ACD416 /* Lzma86Enc.c */; }; + B349AE701E9ABCF900ACD416 /* Lzma86Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD1F1E9ABCF800ACD416 /* Lzma86Enc.c */; }; + B349AE711E9ABCF900ACD416 /* LzmaDec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD201E9ABCF800ACD416 /* LzmaDec.c */; }; + B349AE721E9ABCF900ACD416 /* LzmaDec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD201E9ABCF800ACD416 /* LzmaDec.c */; }; + B349AE731E9ABCF900ACD416 /* LzmaEnc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD221E9ABCF800ACD416 /* LzmaEnc.c */; }; + B349AE741E9ABCF900ACD416 /* LzmaEnc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD221E9ABCF800ACD416 /* LzmaEnc.c */; }; + B349AE751E9ABCF900ACD416 /* LzmaLib.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD241E9ABCF800ACD416 /* LzmaLib.c */; }; + B349AE761E9ABCF900ACD416 /* LzmaLib.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD241E9ABCF800ACD416 /* LzmaLib.c */; }; + B349AE771E9ABCF900ACD416 /* MtCoder.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD261E9ABCF800ACD416 /* MtCoder.c */; }; + B349AE781E9ABCF900ACD416 /* MtCoder.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD261E9ABCF800ACD416 /* MtCoder.c */; }; + B349AE791E9ABCF900ACD416 /* Ppmd7.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD291E9ABCF800ACD416 /* Ppmd7.c */; }; + B349AE7A1E9ABCF900ACD416 /* Ppmd7.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD291E9ABCF800ACD416 /* Ppmd7.c */; }; + B349AE7B1E9ABCF900ACD416 /* Ppmd7Dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD2B1E9ABCF800ACD416 /* Ppmd7Dec.c */; }; + B349AE7C1E9ABCF900ACD416 /* Ppmd7Dec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD2B1E9ABCF800ACD416 /* Ppmd7Dec.c */; }; + B349AE7D1E9ABCF900ACD416 /* Ppmd7Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD2C1E9ABCF800ACD416 /* Ppmd7Enc.c */; }; + B349AE7E1E9ABCF900ACD416 /* Ppmd7Enc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD2C1E9ABCF800ACD416 /* Ppmd7Enc.c */; }; + B349AE7F1E9ABCF900ACD416 /* Sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD2F1E9ABCF800ACD416 /* Sha256.c */; }; + B349AE801E9ABCF900ACD416 /* Sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD2F1E9ABCF800ACD416 /* Sha256.c */; }; + B349AE811E9ABCF900ACD416 /* Sort.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD311E9ABCF800ACD416 /* Sort.c */; }; + B349AE821E9ABCF900ACD416 /* Sort.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD311E9ABCF800ACD416 /* Sort.c */; }; + B349AE831E9ABCF900ACD416 /* Threads.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD331E9ABCF800ACD416 /* Threads.c */; }; + B349AE841E9ABCF900ACD416 /* Threads.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD331E9ABCF800ACD416 /* Threads.c */; }; + B349AE851E9ABCF900ACD416 /* Xz.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD351E9ABCF800ACD416 /* Xz.c */; }; + B349AE861E9ABCF900ACD416 /* Xz.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD351E9ABCF800ACD416 /* Xz.c */; }; + B349AE871E9ABCF900ACD416 /* XzCrc64.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD371E9ABCF800ACD416 /* XzCrc64.c */; }; + B349AE881E9ABCF900ACD416 /* XzCrc64.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD371E9ABCF800ACD416 /* XzCrc64.c */; }; + B349AE891E9ABCF900ACD416 /* XzCrc64Opt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD391E9ABCF800ACD416 /* XzCrc64Opt.c */; }; + B349AE8A1E9ABCF900ACD416 /* XzCrc64Opt.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD391E9ABCF800ACD416 /* XzCrc64Opt.c */; }; + B349AE8B1E9ABCF900ACD416 /* XzDec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD3A1E9ABCF800ACD416 /* XzDec.c */; }; + B349AE8C1E9ABCF900ACD416 /* XzDec.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD3A1E9ABCF800ACD416 /* XzDec.c */; }; + B349AE8D1E9ABCF900ACD416 /* XzEnc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD3B1E9ABCF800ACD416 /* XzEnc.c */; }; + B349AE8E1E9ABCF900ACD416 /* XzEnc.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD3B1E9ABCF800ACD416 /* XzEnc.c */; }; + B349AE8F1E9ABCF900ACD416 /* XzIn.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD3D1E9ABCF800ACD416 /* XzIn.c */; }; + B349AE901E9ABCF900ACD416 /* XzIn.c in Sources */ = {isa = PBXBuildFile; fileRef = B349AD3D1E9ABCF800ACD416 /* XzIn.c */; }; + B349AE911E9ABCF900ACD416 /* 7zCompressionMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD421E9ABCF800ACD416 /* 7zCompressionMode.cpp */; }; + B349AE921E9ABCF900ACD416 /* 7zCompressionMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD421E9ABCF800ACD416 /* 7zCompressionMode.cpp */; }; + B349AE931E9ABCF900ACD416 /* 7zDecode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD441E9ABCF800ACD416 /* 7zDecode.cpp */; }; + B349AE941E9ABCF900ACD416 /* 7zDecode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD441E9ABCF800ACD416 /* 7zDecode.cpp */; }; + B349AE951E9ABCF900ACD416 /* 7zEncode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD461E9ABCF800ACD416 /* 7zEncode.cpp */; }; + B349AE961E9ABCF900ACD416 /* 7zEncode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD461E9ABCF800ACD416 /* 7zEncode.cpp */; }; + B349AE971E9ABCF900ACD416 /* 7zExtract.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD481E9ABCF800ACD416 /* 7zExtract.cpp */; }; + B349AE981E9ABCF900ACD416 /* 7zExtract.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD481E9ABCF800ACD416 /* 7zExtract.cpp */; }; + B349AE991E9ABCF900ACD416 /* 7zFolderInStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD491E9ABCF800ACD416 /* 7zFolderInStream.cpp */; }; + B349AE9A1E9ABCF900ACD416 /* 7zFolderInStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD491E9ABCF800ACD416 /* 7zFolderInStream.cpp */; }; + B349AE9B1E9ABCF900ACD416 /* 7zHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD4B1E9ABCF800ACD416 /* 7zHandler.cpp */; }; + B349AE9C1E9ABCF900ACD416 /* 7zHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD4B1E9ABCF800ACD416 /* 7zHandler.cpp */; }; + B349AE9D1E9ABCF900ACD416 /* 7zHandlerOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD4D1E9ABCF800ACD416 /* 7zHandlerOut.cpp */; }; + B349AE9E1E9ABCF900ACD416 /* 7zHandlerOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD4D1E9ABCF800ACD416 /* 7zHandlerOut.cpp */; }; + B349AE9F1E9ABCF900ACD416 /* 7zHeader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD4E1E9ABCF800ACD416 /* 7zHeader.cpp */; }; + B349AEA01E9ABCF900ACD416 /* 7zHeader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD4E1E9ABCF800ACD416 /* 7zHeader.cpp */; }; + B349AEA11E9ABCF900ACD416 /* 7zIn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD501E9ABCF800ACD416 /* 7zIn.cpp */; }; + B349AEA21E9ABCF900ACD416 /* 7zIn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD501E9ABCF800ACD416 /* 7zIn.cpp */; }; + B349AEA31E9ABCF900ACD416 /* 7zOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD531E9ABCF800ACD416 /* 7zOut.cpp */; }; + B349AEA41E9ABCF900ACD416 /* 7zOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD531E9ABCF800ACD416 /* 7zOut.cpp */; }; + B349AEA51E9ABCF900ACD416 /* 7zProperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD551E9ABCF800ACD416 /* 7zProperties.cpp */; }; + B349AEA61E9ABCF900ACD416 /* 7zProperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD551E9ABCF800ACD416 /* 7zProperties.cpp */; }; + B349AEA71E9ABCF900ACD416 /* 7zRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD571E9ABCF800ACD416 /* 7zRegister.cpp */; }; + B349AEA81E9ABCF900ACD416 /* 7zRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD571E9ABCF800ACD416 /* 7zRegister.cpp */; }; + B349AEA91E9ABCF900ACD416 /* 7zSpecStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD581E9ABCF800ACD416 /* 7zSpecStream.cpp */; }; + B349AEAA1E9ABCF900ACD416 /* 7zSpecStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD581E9ABCF800ACD416 /* 7zSpecStream.cpp */; }; + B349AEAB1E9ABCF900ACD416 /* 7zUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD5A1E9ABCF800ACD416 /* 7zUpdate.cpp */; }; + B349AEAC1E9ABCF900ACD416 /* 7zUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD5A1E9ABCF800ACD416 /* 7zUpdate.cpp */; }; + B349AEAD1E9ABCF900ACD416 /* ArchiveExports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD5D1E9ABCF800ACD416 /* ArchiveExports.cpp */; }; + B349AEAE1E9ABCF900ACD416 /* ArchiveExports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD5D1E9ABCF800ACD416 /* ArchiveExports.cpp */; }; + B349AEAF1E9ABCF900ACD416 /* CoderMixer2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD5F1E9ABCF800ACD416 /* CoderMixer2.cpp */; }; + B349AEB01E9ABCF900ACD416 /* CoderMixer2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD5F1E9ABCF800ACD416 /* CoderMixer2.cpp */; }; + B349AEB11E9ABCF900ACD416 /* DummyOutStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD611E9ABCF800ACD416 /* DummyOutStream.cpp */; }; + B349AEB21E9ABCF900ACD416 /* DummyOutStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD611E9ABCF800ACD416 /* DummyOutStream.cpp */; }; + B349AEB31E9ABCF900ACD416 /* HandlerOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD631E9ABCF800ACD416 /* HandlerOut.cpp */; }; + B349AEB41E9ABCF900ACD416 /* HandlerOut.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD631E9ABCF800ACD416 /* HandlerOut.cpp */; }; + B349AEB51E9ABCF900ACD416 /* InStreamWithCRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD651E9ABCF800ACD416 /* InStreamWithCRC.cpp */; }; + B349AEB61E9ABCF900ACD416 /* InStreamWithCRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD651E9ABCF800ACD416 /* InStreamWithCRC.cpp */; }; + B349AEB71E9ABCF900ACD416 /* ItemNameUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD671E9ABCF800ACD416 /* ItemNameUtils.cpp */; }; + B349AEB81E9ABCF900ACD416 /* ItemNameUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD671E9ABCF800ACD416 /* ItemNameUtils.cpp */; }; + B349AEB91E9ABCF900ACD416 /* MultiStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD691E9ABCF800ACD416 /* MultiStream.cpp */; }; + B349AEBA1E9ABCF900ACD416 /* MultiStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD691E9ABCF800ACD416 /* MultiStream.cpp */; }; + B349AEBB1E9ABCF900ACD416 /* OutStreamWithCRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD6B1E9ABCF800ACD416 /* OutStreamWithCRC.cpp */; }; + B349AEBC1E9ABCF900ACD416 /* OutStreamWithCRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD6B1E9ABCF800ACD416 /* OutStreamWithCRC.cpp */; }; + B349AEBD1E9ABCF900ACD416 /* ParseProperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD6D1E9ABCF800ACD416 /* ParseProperties.cpp */; }; + B349AEBE1E9ABCF900ACD416 /* ParseProperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD6D1E9ABCF800ACD416 /* ParseProperties.cpp */; }; + B349AEBF1E9ABCF900ACD416 /* DllExports2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD701E9ABCF800ACD416 /* DllExports2.cpp */; }; + B349AEC01E9ABCF900ACD416 /* DllExports2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD701E9ABCF800ACD416 /* DllExports2.cpp */; }; + B349AEC11E9ABCF900ACD416 /* LzmaHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD731E9ABCF800ACD416 /* LzmaHandler.cpp */; }; + B349AEC21E9ABCF900ACD416 /* LzmaHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD731E9ABCF800ACD416 /* LzmaHandler.cpp */; }; + B349AEC31E9ABCF900ACD416 /* SplitHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD741E9ABCF800ACD416 /* SplitHandler.cpp */; }; + B349AEC41E9ABCF900ACD416 /* SplitHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD741E9ABCF800ACD416 /* SplitHandler.cpp */; }; + B349AEC51E9ABCF900ACD416 /* CreateCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD771E9ABCF800ACD416 /* CreateCoder.cpp */; }; + B349AEC61E9ABCF900ACD416 /* CreateCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD771E9ABCF800ACD416 /* CreateCoder.cpp */; }; + B349AEC71E9ABCF900ACD416 /* CWrappers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD791E9ABCF800ACD416 /* CWrappers.cpp */; }; + B349AEC81E9ABCF900ACD416 /* CWrappers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD791E9ABCF800ACD416 /* CWrappers.cpp */; }; + B349AECB1E9ABCF900ACD416 /* FileStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD7D1E9ABCF800ACD416 /* FileStreams.cpp */; }; + B349AECC1E9ABCF900ACD416 /* FileStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD7D1E9ABCF800ACD416 /* FileStreams.cpp */; }; + B349AECD1E9ABCF900ACD416 /* FilterCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD7F1E9ABCF800ACD416 /* FilterCoder.cpp */; }; + B349AECE1E9ABCF900ACD416 /* FilterCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD7F1E9ABCF800ACD416 /* FilterCoder.cpp */; }; + B349AECF1E9ABCF900ACD416 /* InBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD811E9ABCF800ACD416 /* InBuffer.cpp */; }; + B349AED01E9ABCF900ACD416 /* InBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD811E9ABCF800ACD416 /* InBuffer.cpp */; }; + B349AED11E9ABCF900ACD416 /* InOutTempBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD831E9ABCF800ACD416 /* InOutTempBuffer.cpp */; }; + B349AED21E9ABCF900ACD416 /* InOutTempBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD831E9ABCF800ACD416 /* InOutTempBuffer.cpp */; }; + B349AED31E9ABCF900ACD416 /* LimitedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD851E9ABCF800ACD416 /* LimitedStreams.cpp */; }; + B349AED41E9ABCF900ACD416 /* LimitedStreams.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD851E9ABCF800ACD416 /* LimitedStreams.cpp */; }; + B349AED51E9ABCF900ACD416 /* LockedStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD871E9ABCF800ACD416 /* LockedStream.cpp */; }; + B349AED61E9ABCF900ACD416 /* LockedStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD871E9ABCF800ACD416 /* LockedStream.cpp */; }; + B349AED71E9ABCF900ACD416 /* MethodId.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD891E9ABCF800ACD416 /* MethodId.cpp */; }; + B349AED81E9ABCF900ACD416 /* MethodId.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD891E9ABCF800ACD416 /* MethodId.cpp */; }; + B349AED91E9ABCF900ACD416 /* MethodProps.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD8B1E9ABCF800ACD416 /* MethodProps.cpp */; }; + B349AEDA1E9ABCF900ACD416 /* MethodProps.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD8B1E9ABCF800ACD416 /* MethodProps.cpp */; }; + B349AEDB1E9ABCF900ACD416 /* OffsetStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD8D1E9ABCF800ACD416 /* OffsetStream.cpp */; }; + B349AEDC1E9ABCF900ACD416 /* OffsetStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD8D1E9ABCF800ACD416 /* OffsetStream.cpp */; }; + B349AEDD1E9ABCF900ACD416 /* OutBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD8F1E9ABCF800ACD416 /* OutBuffer.cpp */; }; + B349AEDE1E9ABCF900ACD416 /* OutBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD8F1E9ABCF800ACD416 /* OutBuffer.cpp */; }; + B349AEDF1E9ABCF900ACD416 /* ProgressUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD911E9ABCF800ACD416 /* ProgressUtils.cpp */; }; + B349AEE01E9ABCF900ACD416 /* ProgressUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD911E9ABCF800ACD416 /* ProgressUtils.cpp */; }; + B349AEE11E9ABCF900ACD416 /* PropId.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD931E9ABCF800ACD416 /* PropId.cpp */; }; + B349AEE21E9ABCF900ACD416 /* PropId.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD931E9ABCF800ACD416 /* PropId.cpp */; }; + B349AEE31E9ABCF900ACD416 /* StreamBinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD971E9ABCF800ACD416 /* StreamBinder.cpp */; }; + B349AEE41E9ABCF900ACD416 /* StreamBinder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD971E9ABCF800ACD416 /* StreamBinder.cpp */; }; + B349AEE51E9ABCF900ACD416 /* StreamObjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD991E9ABCF800ACD416 /* StreamObjects.cpp */; }; + B349AEE61E9ABCF900ACD416 /* StreamObjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD991E9ABCF800ACD416 /* StreamObjects.cpp */; }; + B349AEE71E9ABCF900ACD416 /* StreamUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD9B1E9ABCF800ACD416 /* StreamUtils.cpp */; }; + B349AEE81E9ABCF900ACD416 /* StreamUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD9B1E9ABCF800ACD416 /* StreamUtils.cpp */; }; + B349AEE91E9ABCF900ACD416 /* UniqBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD9D1E9ABCF800ACD416 /* UniqBlocks.cpp */; }; + B349AEEA1E9ABCF900ACD416 /* UniqBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD9D1E9ABCF800ACD416 /* UniqBlocks.cpp */; }; + B349AEEB1E9ABCF900ACD416 /* VirtThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD9F1E9ABCF800ACD416 /* VirtThread.cpp */; }; + B349AEEC1E9ABCF900ACD416 /* VirtThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AD9F1E9ABCF800ACD416 /* VirtThread.cpp */; }; + B349AEED1E9ABCF900ACD416 /* Bcj2Coder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA21E9ABCF800ACD416 /* Bcj2Coder.cpp */; }; + B349AEEE1E9ABCF900ACD416 /* Bcj2Coder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA21E9ABCF800ACD416 /* Bcj2Coder.cpp */; }; + B349AEEF1E9ABCF900ACD416 /* Bcj2Register.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA41E9ABCF800ACD416 /* Bcj2Register.cpp */; }; + B349AEF01E9ABCF900ACD416 /* Bcj2Register.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA41E9ABCF800ACD416 /* Bcj2Register.cpp */; }; + B349AEF11E9ABCF900ACD416 /* BcjCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA51E9ABCF800ACD416 /* BcjCoder.cpp */; }; + B349AEF21E9ABCF900ACD416 /* BcjCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA51E9ABCF800ACD416 /* BcjCoder.cpp */; }; + B349AEF31E9ABCF900ACD416 /* BcjRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA71E9ABCF800ACD416 /* BcjRegister.cpp */; }; + B349AEF41E9ABCF900ACD416 /* BcjRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA71E9ABCF800ACD416 /* BcjRegister.cpp */; }; + B349AEF51E9ABCF900ACD416 /* BranchMisc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA81E9ABCF800ACD416 /* BranchMisc.cpp */; }; + B349AEF61E9ABCF900ACD416 /* BranchMisc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADA81E9ABCF800ACD416 /* BranchMisc.cpp */; }; + B349AEF71E9ABCF900ACD416 /* BranchRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAA1E9ABCF800ACD416 /* BranchRegister.cpp */; }; + B349AEF81E9ABCF900ACD416 /* BranchRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAA1E9ABCF800ACD416 /* BranchRegister.cpp */; }; + B349AEF91E9ABCF900ACD416 /* ByteSwap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAB1E9ABCF800ACD416 /* ByteSwap.cpp */; }; + B349AEFA1E9ABCF900ACD416 /* ByteSwap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAB1E9ABCF800ACD416 /* ByteSwap.cpp */; }; + B349AEFB1E9ABCF900ACD416 /* CodecExports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAC1E9ABCF800ACD416 /* CodecExports.cpp */; }; + B349AEFC1E9ABCF900ACD416 /* CodecExports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAC1E9ABCF800ACD416 /* CodecExports.cpp */; }; + B349AEFD1E9ABCF900ACD416 /* CopyCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAD1E9ABCF800ACD416 /* CopyCoder.cpp */; }; + B349AEFE1E9ABCF900ACD416 /* CopyCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAD1E9ABCF800ACD416 /* CopyCoder.cpp */; }; + B349AEFF1E9ABCF900ACD416 /* CopyRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAF1E9ABCF800ACD416 /* CopyRegister.cpp */; }; + B349AF001E9ABCF900ACD416 /* CopyRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADAF1E9ABCF800ACD416 /* CopyRegister.cpp */; }; + B349AF011E9ABCF900ACD416 /* DeltaFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB01E9ABCF800ACD416 /* DeltaFilter.cpp */; }; + B349AF021E9ABCF900ACD416 /* DeltaFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB01E9ABCF800ACD416 /* DeltaFilter.cpp */; }; + B349AF031E9ABCF900ACD416 /* Lzma2Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB11E9ABCF800ACD416 /* Lzma2Decoder.cpp */; }; + B349AF041E9ABCF900ACD416 /* Lzma2Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB11E9ABCF800ACD416 /* Lzma2Decoder.cpp */; }; + B349AF051E9ABCF900ACD416 /* Lzma2Encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB31E9ABCF800ACD416 /* Lzma2Encoder.cpp */; }; + B349AF061E9ABCF900ACD416 /* Lzma2Encoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB31E9ABCF800ACD416 /* Lzma2Encoder.cpp */; }; + B349AF071E9ABCF900ACD416 /* Lzma2Register.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB51E9ABCF800ACD416 /* Lzma2Register.cpp */; }; + B349AF081E9ABCF900ACD416 /* Lzma2Register.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB51E9ABCF800ACD416 /* Lzma2Register.cpp */; }; + B349AF091E9ABCF900ACD416 /* LzmaDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB61E9ABCF800ACD416 /* LzmaDecoder.cpp */; }; + B349AF0A1E9ABCF900ACD416 /* LzmaDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB61E9ABCF800ACD416 /* LzmaDecoder.cpp */; }; + B349AF0B1E9ABCF900ACD416 /* LzmaEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB81E9ABCF800ACD416 /* LzmaEncoder.cpp */; }; + B349AF0C1E9ABCF900ACD416 /* LzmaEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADB81E9ABCF800ACD416 /* LzmaEncoder.cpp */; }; + B349AF0D1E9ABCF900ACD416 /* LzmaRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBA1E9ABCF800ACD416 /* LzmaRegister.cpp */; }; + B349AF0E1E9ABCF900ACD416 /* LzmaRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBA1E9ABCF800ACD416 /* LzmaRegister.cpp */; }; + B349AF0F1E9ABCF900ACD416 /* PpmdDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBB1E9ABCF800ACD416 /* PpmdDecoder.cpp */; }; + B349AF101E9ABCF900ACD416 /* PpmdDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBB1E9ABCF800ACD416 /* PpmdDecoder.cpp */; }; + B349AF111E9ABCF900ACD416 /* PpmdEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBD1E9ABCF800ACD416 /* PpmdEncoder.cpp */; }; + B349AF121E9ABCF900ACD416 /* PpmdEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBD1E9ABCF800ACD416 /* PpmdEncoder.cpp */; }; + B349AF131E9ABCF900ACD416 /* PpmdRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBF1E9ABCF800ACD416 /* PpmdRegister.cpp */; }; + B349AF141E9ABCF900ACD416 /* PpmdRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADBF1E9ABCF800ACD416 /* PpmdRegister.cpp */; }; + B349AF151E9ABCF900ACD416 /* 7zAes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC21E9ABCF800ACD416 /* 7zAes.cpp */; }; + B349AF161E9ABCF900ACD416 /* 7zAes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC21E9ABCF800ACD416 /* 7zAes.cpp */; }; + B349AF171E9ABCF900ACD416 /* 7zAesRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC41E9ABCF800ACD416 /* 7zAesRegister.cpp */; }; + B349AF181E9ABCF900ACD416 /* 7zAesRegister.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC41E9ABCF800ACD416 /* 7zAesRegister.cpp */; }; + B349AF191E9ABCF900ACD416 /* MyAes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC51E9ABCF800ACD416 /* MyAes.cpp */; }; + B349AF1A1E9ABCF900ACD416 /* MyAes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC51E9ABCF800ACD416 /* MyAes.cpp */; }; + B349AF1B1E9ABCF900ACD416 /* MyAesReg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC71E9ABCF800ACD416 /* MyAesReg.cpp */; }; + B349AF1C1E9ABCF900ACD416 /* MyAesReg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC71E9ABCF800ACD416 /* MyAesReg.cpp */; }; + B349AF1D1E9ABCF900ACD416 /* RandGen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC81E9ABCF800ACD416 /* RandGen.cpp */; }; + B349AF1E1E9ABCF900ACD416 /* RandGen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADC81E9ABCF800ACD416 /* RandGen.cpp */; }; + B349AF1F1E9ABCF900ACD416 /* C_FileIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADD41E9ABCF900ACD416 /* C_FileIO.cpp */; }; + B349AF201E9ABCF900ACD416 /* C_FileIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADD41E9ABCF900ACD416 /* C_FileIO.cpp */; }; + B349AF211E9ABCF900ACD416 /* CommandLineParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADD61E9ABCF900ACD416 /* CommandLineParser.cpp */; }; + B349AF221E9ABCF900ACD416 /* CommandLineParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADD61E9ABCF900ACD416 /* CommandLineParser.cpp */; }; + B349AF231E9ABCF900ACD416 /* CRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADDA1E9ABCF900ACD416 /* CRC.cpp */; }; + B349AF241E9ABCF900ACD416 /* CRC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADDA1E9ABCF900ACD416 /* CRC.cpp */; }; + B349AF251E9ABCF900ACD416 /* CrcReg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADDB1E9ABCF900ACD416 /* CrcReg.cpp */; }; + B349AF261E9ABCF900ACD416 /* CrcReg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADDB1E9ABCF900ACD416 /* CrcReg.cpp */; }; + B349AF271E9ABCF900ACD416 /* IntToString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADDE1E9ABCF900ACD416 /* IntToString.cpp */; }; + B349AF281E9ABCF900ACD416 /* IntToString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADDE1E9ABCF900ACD416 /* IntToString.cpp */; }; + B349AF2B1E9ABCF900ACD416 /* MyString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADE81E9ABCF900ACD416 /* MyString.cpp */; }; + B349AF2C1E9ABCF900ACD416 /* MyString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADE81E9ABCF900ACD416 /* MyString.cpp */; }; + B349AF2D1E9ABCF900ACD416 /* MyVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADEC1E9ABCF900ACD416 /* MyVector.cpp */; }; + B349AF2E1E9ABCF900ACD416 /* MyVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADEC1E9ABCF900ACD416 /* MyVector.cpp */; }; + B349AF2F1E9ABCF900ACD416 /* MyWindows.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADEE1E9ABCF900ACD416 /* MyWindows.cpp */; }; + B349AF301E9ABCF900ACD416 /* MyWindows.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADEE1E9ABCF900ACD416 /* MyWindows.cpp */; }; + B349AF311E9ABCF900ACD416 /* NewHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADF01E9ABCF900ACD416 /* NewHandler.cpp */; }; + B349AF321E9ABCF900ACD416 /* NewHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADF01E9ABCF900ACD416 /* NewHandler.cpp */; }; + B349AF331E9ABCF900ACD416 /* Sha256Reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADF21E9ABCF900ACD416 /* Sha256Reg.cpp */; }; + B349AF341E9ABCF900ACD416 /* Sha256Reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADF21E9ABCF900ACD416 /* Sha256Reg.cpp */; }; + B349AF391E9ABCF900ACD416 /* StringConvert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADF81E9ABCF900ACD416 /* StringConvert.cpp */; }; + B349AF3A1E9ABCF900ACD416 /* StringConvert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADF81E9ABCF900ACD416 /* StringConvert.cpp */; }; + B349AF3B1E9ABCF900ACD416 /* StringToInt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADFA1E9ABCF900ACD416 /* StringToInt.cpp */; }; + B349AF3C1E9ABCF900ACD416 /* StringToInt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADFA1E9ABCF900ACD416 /* StringToInt.cpp */; }; + B349AF3D1E9ABCF900ACD416 /* TextConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADFC1E9ABCF900ACD416 /* TextConfig.cpp */; }; + B349AF3E1E9ABCF900ACD416 /* TextConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADFC1E9ABCF900ACD416 /* TextConfig.cpp */; }; + B349AF3F1E9ABCF900ACD416 /* UTFConvert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADFE1E9ABCF900ACD416 /* UTFConvert.cpp */; }; + B349AF401E9ABCF900ACD416 /* UTFConvert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349ADFE1E9ABCF900ACD416 /* UTFConvert.cpp */; }; + B349AF411E9ABCF900ACD416 /* Wildcard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE001E9ABCF900ACD416 /* Wildcard.cpp */; }; + B349AF421E9ABCF900ACD416 /* Wildcard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE001E9ABCF900ACD416 /* Wildcard.cpp */; }; + B349AF431E9ABCF900ACD416 /* XzCrc64Reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE021E9ABCF900ACD416 /* XzCrc64Reg.cpp */; }; + B349AF441E9ABCF900ACD416 /* XzCrc64Reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE021E9ABCF900ACD416 /* XzCrc64Reg.cpp */; }; + B349AF471E9ABCF900ACD416 /* PropVariant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE061E9ABCF900ACD416 /* PropVariant.cpp */; }; + B349AF481E9ABCF900ACD416 /* PropVariant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE061E9ABCF900ACD416 /* PropVariant.cpp */; }; + B349AF491E9ABCF900ACD416 /* PropVariantConv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE081E9ABCF900ACD416 /* PropVariantConv.cpp */; }; + B349AF4A1E9ABCF900ACD416 /* PropVariantConv.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE081E9ABCF900ACD416 /* PropVariantConv.cpp */; }; + B349AF4B1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec in Resources */ = {isa = PBXBuildFile; fileRef = B349AE0D1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec */; }; + B349AF4C1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec in Resources */ = {isa = PBXBuildFile; fileRef = B349AE0D1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec */; }; + B349AF4D1E9ABCF900ACD416 /* LzmaSDKObjC.podspec in Resources */ = {isa = PBXBuildFile; fileRef = B349AE0E1E9ABCF900ACD416 /* LzmaSDKObjC.podspec */; }; + B349AF4E1E9ABCF900ACD416 /* LzmaSDKObjC.podspec in Resources */ = {isa = PBXBuildFile; fileRef = B349AE0E1E9ABCF900ACD416 /* LzmaSDKObjC.podspec */; }; + B349AF511E9ABCF900ACD416 /* LzmaSDKObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE131E9ABCF900ACD416 /* LzmaSDKObjC.mm */; }; + B349AF521E9ABCF900ACD416 /* LzmaSDKObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE131E9ABCF900ACD416 /* LzmaSDKObjC.mm */; }; + B349AF531E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE141E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp */; }; + B349AF541E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE141E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp */; }; + B349AF551E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE171E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm */; }; + B349AF561E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE171E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm */; }; + B349AF571E9ABCF900ACD416 /* LzmaSDKObjCCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE181E9ABCF900ACD416 /* LzmaSDKObjCCommon.cpp */; }; + B349AF581E9ABCFA00ACD416 /* LzmaSDKObjCCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE181E9ABCF900ACD416 /* LzmaSDKObjCCommon.cpp */; }; + B349AF591E9ABCFA00ACD416 /* LzmaSDKObjCError.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE1B1E9ABCF900ACD416 /* LzmaSDKObjCError.mm */; }; + B349AF5A1E9ABCFA00ACD416 /* LzmaSDKObjCError.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE1B1E9ABCF900ACD416 /* LzmaSDKObjCError.mm */; }; + B349AF5B1E9ABCFA00ACD416 /* LzmaSDKObjCExtern.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE1D1E9ABCF900ACD416 /* LzmaSDKObjCExtern.mm */; }; + B349AF5C1E9ABCFA00ACD416 /* LzmaSDKObjCExtern.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE1D1E9ABCF900ACD416 /* LzmaSDKObjCExtern.mm */; }; + B349AF5D1E9ABCFA00ACD416 /* LzmaSDKObjCExtractCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE1F1E9ABCF900ACD416 /* LzmaSDKObjCExtractCallback.mm */; }; + B349AF5E1E9ABCFA00ACD416 /* LzmaSDKObjCExtractCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE1F1E9ABCF900ACD416 /* LzmaSDKObjCExtractCallback.mm */; }; + B349AF5F1E9ABCFA00ACD416 /* LzmaSDKObjCFileDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE201E9ABCF900ACD416 /* LzmaSDKObjCFileDecoder.cpp */; }; + B349AF601E9ABCFA00ACD416 /* LzmaSDKObjCFileDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE201E9ABCF900ACD416 /* LzmaSDKObjCFileDecoder.cpp */; }; + B349AF611E9ABCFA00ACD416 /* LzmaSDKObjCFileEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE221E9ABCF900ACD416 /* LzmaSDKObjCFileEncoder.cpp */; }; + B349AF621E9ABCFA00ACD416 /* LzmaSDKObjCFileEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE221E9ABCF900ACD416 /* LzmaSDKObjCFileEncoder.cpp */; }; + B349AF631E9ABCFA00ACD416 /* LzmaSDKObjCInFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE241E9ABCF900ACD416 /* LzmaSDKObjCInFile.cpp */; }; + B349AF641E9ABCFA00ACD416 /* LzmaSDKObjCInFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE241E9ABCF900ACD416 /* LzmaSDKObjCInFile.cpp */; }; + B349AF651E9ABCFA00ACD416 /* LzmaSDKObjCItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE281E9ABCF900ACD416 /* LzmaSDKObjCItem.mm */; }; + B349AF661E9ABCFA00ACD416 /* LzmaSDKObjCItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE281E9ABCF900ACD416 /* LzmaSDKObjCItem.mm */; }; + B349AF671E9ABCFA00ACD416 /* LzmaSDKObjCMutableItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE2B1E9ABCF900ACD416 /* LzmaSDKObjCMutableItem.mm */; }; + B349AF681E9ABCFA00ACD416 /* LzmaSDKObjCMutableItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE2B1E9ABCF900ACD416 /* LzmaSDKObjCMutableItem.mm */; }; + B349AF691E9ABCFA00ACD416 /* LzmaSDKObjCOpenCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE2C1E9ABCF900ACD416 /* LzmaSDKObjCOpenCallback.cpp */; }; + B349AF6A1E9ABCFA00ACD416 /* LzmaSDKObjCOpenCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE2C1E9ABCF900ACD416 /* LzmaSDKObjCOpenCallback.cpp */; }; + B349AF6B1E9ABCFA00ACD416 /* LzmaSDKObjCOutFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE2E1E9ABCF900ACD416 /* LzmaSDKObjCOutFile.cpp */; }; + B349AF6C1E9ABCFA00ACD416 /* LzmaSDKObjCOutFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B349AE2E1E9ABCF900ACD416 /* LzmaSDKObjCOutFile.cpp */; }; + B349AF6D1E9ABCFA00ACD416 /* LzmaSDKObjCReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE311E9ABCF900ACD416 /* LzmaSDKObjCReader.mm */; }; + B349AF6E1E9ABCFA00ACD416 /* LzmaSDKObjCReader.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE311E9ABCF900ACD416 /* LzmaSDKObjCReader.mm */; }; + B349AF6F1E9ABCFA00ACD416 /* LzmaSDKObjCUpdateCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE341E9ABCF900ACD416 /* LzmaSDKObjCUpdateCallback.mm */; }; + B349AF701E9ABCFA00ACD416 /* LzmaSDKObjCUpdateCallback.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE341E9ABCF900ACD416 /* LzmaSDKObjCUpdateCallback.mm */; }; + B349AF711E9ABCFA00ACD416 /* LzmaSDKObjCWriter.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE361E9ABCF900ACD416 /* LzmaSDKObjCWriter.mm */; }; + B349AF721E9ABCFA00ACD416 /* LzmaSDKObjCWriter.mm in Sources */ = {isa = PBXBuildFile; fileRef = B349AE361E9ABCF900ACD416 /* LzmaSDKObjCWriter.mm */; }; + B35469381DECD8570018B6F3 /* PVAtari5200ControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B35469371DECD8570018B6F3 /* PVAtari5200ControllerViewController.m */; }; + B35469391DECD8570018B6F3 /* PVAtari5200ControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B35469371DECD8570018B6F3 /* PVAtari5200ControllerViewController.m */; }; + B354693C1DECDA710018B6F3 /* PVAtari800.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B354693B1DECDA710018B6F3 /* PVAtari800.framework */; }; + B354693D1DECDA710018B6F3 /* PVAtari800.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B354693B1DECDA710018B6F3 /* PVAtari800.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B36DE7CA1D6B80CA002EE3ED /* PVAtari7800ControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B36DE7C91D6B80CA002EE3ED /* PVAtari7800ControllerViewController.m */; }; B36DE7CB1D6B80D3002EE3ED /* PVAtari7800ControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B36DE7C91D6B80CA002EE3ED /* PVAtari7800ControllerViewController.m */; }; - B36DE7CC1D6B80D4002EE3ED /* PVAtari7800ControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B36DE7C91D6B80CA002EE3ED /* PVAtari7800ControllerViewController.m */; }; + B39578C21E6D2D8B00854D7A /* PVPCEControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B39578C11E6D2D8B00854D7A /* PVPCEControllerViewController.m */; }; + B39578C31E6D2D8B00854D7A /* PVPCEControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B39578C11E6D2D8B00854D7A /* PVPCEControllerViewController.m */; }; + B39578C71E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B39578C61E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m */; }; + B39578C81E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B39578C61E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m */; }; B3A9F4251DE86389008450F5 /* ProSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD68A21D6EA7070021B949 /* ProSystem.framework */; }; B3AD689B1D6EA6180021B949 /* PicoDrive.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD689A1D6EA6180021B949 /* PicoDrive.framework */; }; B3AD689C1D6EA6180021B949 /* PicoDrive.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD689A1D6EA6180021B949 /* PicoDrive.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -227,9 +541,10 @@ B3AD689E1D6EA6450021B949 /* PicoDrive.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD689A1D6EA6180021B949 /* PicoDrive.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B3AD68A31D6EA7070021B949 /* ProSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD68A21D6EA7070021B949 /* ProSystem.framework */; }; B3AD68A41D6EA7070021B949 /* ProSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD68A21D6EA7070021B949 /* ProSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - B3AD68A71D6EA7220021B949 /* ProSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD68A21D6EA7070021B949 /* ProSystem.framework */; }; - B3AD68A91D6EA7220021B949 /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B32F46331D6A8BD70085BA9F /* PVSupport.framework */; }; - B3AD68AA1D6EA7220021B949 /* PicoDrive.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AD689A1D6EA6180021B949 /* PicoDrive.framework */; }; + B3B0860A1E71316A007F39E1 /* PVMednafen.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B340E6091E088CF900AD0E8B /* PVMednafen.framework */; }; + B3B0860B1E71316A007F39E1 /* PVMednafen.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B340E6091E088CF900AD0E8B /* PVMednafen.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B3C0EE4A1EA853A600C6414C /* PVGameImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA2F1ACC871F00EC87A0 /* PVGameImporter.m */; }; + B3C0EE4B1EA853A700C6414C /* PVGameImporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AD9AA2F1ACC871F00EC87A0 /* PVGameImporter.m */; }; B3C9D4301DEA1B260068D057 /* PVNES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C9D42F1DEA1B260068D057 /* PVNES.framework */; }; B3C9D4311DEA1B260068D057 /* PVNES.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3C9D42F1DEA1B260068D057 /* PVNES.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B3C9D4331DEA1B340068D057 /* PVGenesis.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C9D4321DEA1B340068D057 /* PVGenesis.framework */; }; @@ -254,17 +569,22 @@ B3C9D5E51DEA8AED0068D057 /* PVStella.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3C9D5E31DEA8AED0068D057 /* PVStella.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B3C9D5E71DEAA7E80068D057 /* PVStella.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3C9D5E61DEAA7E80068D057 /* PVStella.framework */; }; B3C9D5E81DEAA7E80068D057 /* PVStella.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3C9D5E61DEAA7E80068D057 /* PVStella.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B3CB85BF1E9BFB07009155A6 /* PVPokeMini.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3CB85BE1E9BFB07009155A6 /* PVPokeMini.framework */; }; + B3CB85C01E9BFB07009155A6 /* PVPokeMini.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3CB85BE1E9BFB07009155A6 /* PVPokeMini.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B3CB85C21E9BFB16009155A6 /* PVPokeMini.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3CB85C11E9BFB16009155A6 /* PVPokeMini.framework */; }; + B3CB85C31E9BFB16009155A6 /* PVPokeMini.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3CB85C11E9BFB16009155A6 /* PVPokeMini.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B3CB85C71E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3CB85C61E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m */; }; + B3CB85C81E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3CB85C61E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m */; }; B3D2E3911D6E8B3C0058544D /* PV32XControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3D2E3901D6E8B3C0058544D /* PV32XControllerViewController.m */; }; B3D2E3921D6E8B3C0058544D /* PV32XControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3D2E3901D6E8B3C0058544D /* PV32XControllerViewController.m */; }; - B3D2E3931D6E8B3C0058544D /* PV32XControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3D2E3901D6E8B3C0058544D /* PV32XControllerViewController.m */; }; B3D2E39B1D6E8BCD0058544D /* PVSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B32F46331D6A8BD70085BA9F /* PVSupport.framework */; }; B3D2E39C1D6E8BCD0058544D /* PVSupport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B32F46331D6A8BD70085BA9F /* PVSupport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + B3DEE8E91E9E9C880004D25E /* PVAtari800.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3DEE8E81E9E9C880004D25E /* PVAtari800.framework */; }; + B3DEE8EA1E9E9C880004D25E /* PVAtari800.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3DEE8E81E9E9C880004D25E /* PVAtari800.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B3DF87651D6A5A5300D216D4 /* PVStellaControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF87641D6A5A5300D216D4 /* PVStellaControllerViewController.m */; }; B3DF87661D6A5A5300D216D4 /* PVStellaControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF87641D6A5A5300D216D4 /* PVStellaControllerViewController.m */; }; - B3DF87671D6A5A5C00D216D4 /* PVStellaControllerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DF87641D6A5A5300D216D4 /* PVStellaControllerViewController.m */; }; BE1E26671C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1E26661C2252CA00499BA0 /* PVEmulatorConstants.m */; }; BE1E26681C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1E26661C2252CA00499BA0 /* PVEmulatorConstants.m */; }; - BE1E26691C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1E26661C2252CA00499BA0 /* PVEmulatorConstants.m */; }; BE1E266A1C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1E26661C2252CA00499BA0 /* PVEmulatorConstants.m */; }; BE1E266D1C22552800499BA0 /* PVAppConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1E266C1C22552800499BA0 /* PVAppConstants.m */; }; BE1E266E1C22552800499BA0 /* PVAppConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1E266C1C22552800499BA0 /* PVAppConstants.m */; }; @@ -317,11 +637,14 @@ dstSubfolderSpec = 10; files = ( B3AD689C1D6EA6180021B949 /* PicoDrive.framework in Embed Frameworks */, + B3CB85C31E9BFB16009155A6 /* PVPokeMini.framework in Embed Frameworks */, B3C9D5E21DEA8A290068D057 /* PVGenesis.framework in Embed Frameworks */, + B340E60B1E088CF900AD0E8B /* PVMednafen.framework in Embed Frameworks */, B3C9D4B21DEA74500068D057 /* PVGB.framework in Embed Frameworks */, B3C9D5DF1DEA8A250068D057 /* PVNES.framework in Embed Frameworks */, B3C9D5DC1DEA8A200068D057 /* PVGBA.framework in Embed Frameworks */, B3C9D5E51DEA8AED0068D057 /* PVStella.framework in Embed Frameworks */, + B3DEE8EA1E9E9C880004D25E /* PVAtari800.framework in Embed Frameworks */, B3C9D5611DEA85D10068D057 /* PVSNES.framework in Embed Frameworks */, B32F46351D6A8BD70085BA9F /* PVSupport.framework in Embed Frameworks */, B3AD68A41D6EA7070021B949 /* ProSystem.framework in Embed Frameworks */, @@ -337,11 +660,14 @@ dstSubfolderSpec = 10; files = ( B3D2E39C1D6E8BCD0058544D /* PVSupport.framework in Embed Frameworks */, + B3CB85C01E9BFB07009155A6 /* PVPokeMini.framework in Embed Frameworks */, B3C9D4AF1DEA74390068D057 /* PVGB.framework in Embed Frameworks */, + B3B0860B1E71316A007F39E1 /* PVMednafen.framework in Embed Frameworks */, B311698D1D70A3A200D7AECA /* ProSystem.framework in Embed Frameworks */, B3AD689E1D6EA6450021B949 /* PicoDrive.framework in Embed Frameworks */, B3C9D55E1DEA85C60068D057 /* PVSNES.framework in Embed Frameworks */, B3C9D5E81DEAA7E80068D057 /* PVStella.framework in Embed Frameworks */, + B354693D1DECDA710018B6F3 /* PVAtari800.framework in Embed Frameworks */, B3C9D5221DEA787D0068D057 /* PVGBA.framework in Embed Frameworks */, B3C9D4341DEA1B340068D057 /* PVGenesis.framework in Embed Frameworks */, 1AAE7D431BC870A8003066C0 /* Realm.framework in Embed Frameworks */, @@ -562,11 +888,352 @@ 42E63F0417DE78AB005802B0 /* UIImage+Scaling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Scaling.h"; sourceTree = ""; }; 42E63F0517DE78AB005802B0 /* UIImage+Scaling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Scaling.m"; sourceTree = ""; }; 7556CF7919DC15C1007F8F97 /* Default.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Default.xib; sourceTree = ""; }; + AA9B6EDC1D70981000422E5F /* PVPSXControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVPSXControllerViewController.h; sourceTree = ""; }; + AA9B6EDD1D70981000422E5F /* PVPSXControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVPSXControllerViewController.m; sourceTree = ""; }; + B32893711E0B250B0090B97A /* PVWonderSwanControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVWonderSwanControllerViewController.h; sourceTree = ""; }; + B32893721E0B250B0090B97A /* PVWonderSwanControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVWonderSwanControllerViewController.m; sourceTree = ""; }; + B32893761E0B4EA30090B97A /* PVLynxControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVLynxControllerViewController.h; sourceTree = ""; }; + B32893771E0B4EA30090B97A /* PVLynxControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVLynxControllerViewController.m; sourceTree = ""; }; + B328937B1E0B87960090B97A /* PVVBControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVVBControllerViewController.h; sourceTree = ""; }; + B328937C1E0B87960090B97A /* PVVBControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVVBControllerViewController.m; sourceTree = ""; }; + B32D8F7C1EA7F79900175FBF /* PVEmulatorConfigurationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVEmulatorConfigurationTests.m; sourceTree = ""; }; + B32D8F7E1EA7FD6300175FBF /* PVSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVSupport.framework; path = "../../Library/Developer/Xcode/DerivedData/Provenance-cqyrqlnsqskspscgaptpbmkqmvze/Build/Products/Debug-iphonesimulator/PVSupport.framework"; sourceTree = ""; }; + B32D8F811EA7FDBE00175FBF /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; B32F46331D6A8BD70085BA9F /* PVSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B340E5FE1E088CA700AD0E8B /* PVMednafen.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVMednafen.framework; path = "../../Library/Developer/Xcode/DerivedData/Provenance-epgbyuhwmldnwnabzgpptirwwuer/Build/Products/Debug-iphoneos/PVMednafen.framework"; sourceTree = ""; }; + B340E6091E088CF900AD0E8B /* PVMednafen.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVMednafen.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B349ACED1E9ABCF800ACD416 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; + B349ACEE1E9ABCF800ACD416 /* .travis.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; }; + B349ACEF1E9ABCF800ACD416 /* CHANGELOG */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CHANGELOG; sourceTree = ""; }; + B349ACF01E9ABCF800ACD416 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + B349ACF31E9ABCF800ACD416 /* 7z.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7z.h; sourceTree = ""; }; + B349ACF41E9ABCF800ACD416 /* 7zAlloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zAlloc.c; sourceTree = ""; }; + B349ACF51E9ABCF800ACD416 /* 7zAlloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zAlloc.h; sourceTree = ""; }; + B349ACF61E9ABCF800ACD416 /* 7zArcIn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zArcIn.c; sourceTree = ""; }; + B349ACF71E9ABCF800ACD416 /* 7zBuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zBuf.c; sourceTree = ""; }; + B349ACF81E9ABCF800ACD416 /* 7zBuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zBuf.h; sourceTree = ""; }; + B349ACF91E9ABCF800ACD416 /* 7zBuf2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zBuf2.c; sourceTree = ""; }; + B349ACFA1E9ABCF800ACD416 /* 7zCrc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zCrc.c; sourceTree = ""; }; + B349ACFB1E9ABCF800ACD416 /* 7zCrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zCrc.h; sourceTree = ""; }; + B349ACFC1E9ABCF800ACD416 /* 7zCrcOpt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zCrcOpt.c; sourceTree = ""; }; + B349ACFD1E9ABCF800ACD416 /* 7zDec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zDec.c; sourceTree = ""; }; + B349ACFE1E9ABCF800ACD416 /* 7zFile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zFile.c; sourceTree = ""; }; + B349ACFF1E9ABCF800ACD416 /* 7zFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zFile.h; sourceTree = ""; }; + B349AD001E9ABCF800ACD416 /* 7zStream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = 7zStream.c; sourceTree = ""; }; + B349AD011E9ABCF800ACD416 /* 7zTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zTypes.h; sourceTree = ""; }; + B349AD021E9ABCF800ACD416 /* 7zVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zVersion.h; sourceTree = ""; }; + B349AD031E9ABCF800ACD416 /* Aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Aes.c; sourceTree = ""; }; + B349AD041E9ABCF800ACD416 /* Aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Aes.h; sourceTree = ""; }; + B349AD051E9ABCF800ACD416 /* AesOpt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = AesOpt.c; sourceTree = ""; }; + B349AD061E9ABCF800ACD416 /* Alloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Alloc.c; sourceTree = ""; }; + B349AD071E9ABCF800ACD416 /* Alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Alloc.h; sourceTree = ""; }; + B349AD081E9ABCF800ACD416 /* Bcj2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Bcj2.c; sourceTree = ""; }; + B349AD091E9ABCF800ACD416 /* Bcj2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bcj2.h; sourceTree = ""; }; + B349AD0A1E9ABCF800ACD416 /* Bcj2Enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Bcj2Enc.c; sourceTree = ""; }; + B349AD0B1E9ABCF800ACD416 /* Bra.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Bra.c; sourceTree = ""; }; + B349AD0C1E9ABCF800ACD416 /* Bra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bra.h; sourceTree = ""; }; + B349AD0D1E9ABCF800ACD416 /* Bra86.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Bra86.c; sourceTree = ""; }; + B349AD0E1E9ABCF800ACD416 /* BraIA64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BraIA64.c; sourceTree = ""; }; + B349AD0F1E9ABCF800ACD416 /* Compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Compiler.h; sourceTree = ""; }; + B349AD101E9ABCF800ACD416 /* CpuArch.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = CpuArch.c; sourceTree = ""; }; + B349AD111E9ABCF800ACD416 /* CpuArch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CpuArch.h; sourceTree = ""; }; + B349AD121E9ABCF800ACD416 /* Delta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Delta.c; sourceTree = ""; }; + B349AD131E9ABCF800ACD416 /* Delta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Delta.h; sourceTree = ""; }; + B349AD141E9ABCF800ACD416 /* LzFind.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LzFind.c; sourceTree = ""; }; + B349AD151E9ABCF800ACD416 /* LzFind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzFind.h; sourceTree = ""; }; + B349AD161E9ABCF800ACD416 /* LzFindMt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LzFindMt.c; sourceTree = ""; }; + B349AD171E9ABCF800ACD416 /* LzFindMt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzFindMt.h; sourceTree = ""; }; + B349AD181E9ABCF800ACD416 /* LzHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzHash.h; sourceTree = ""; }; + B349AD191E9ABCF800ACD416 /* Lzma2Dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Lzma2Dec.c; sourceTree = ""; }; + B349AD1A1E9ABCF800ACD416 /* Lzma2Dec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lzma2Dec.h; sourceTree = ""; }; + B349AD1B1E9ABCF800ACD416 /* Lzma2Enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Lzma2Enc.c; sourceTree = ""; }; + B349AD1C1E9ABCF800ACD416 /* Lzma2Enc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lzma2Enc.h; sourceTree = ""; }; + B349AD1D1E9ABCF800ACD416 /* Lzma86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lzma86.h; sourceTree = ""; }; + B349AD1E1E9ABCF800ACD416 /* Lzma86Dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Lzma86Dec.c; sourceTree = ""; }; + B349AD1F1E9ABCF800ACD416 /* Lzma86Enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Lzma86Enc.c; sourceTree = ""; }; + B349AD201E9ABCF800ACD416 /* LzmaDec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LzmaDec.c; sourceTree = ""; }; + B349AD211E9ABCF800ACD416 /* LzmaDec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaDec.h; sourceTree = ""; }; + B349AD221E9ABCF800ACD416 /* LzmaEnc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LzmaEnc.c; sourceTree = ""; }; + B349AD231E9ABCF800ACD416 /* LzmaEnc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaEnc.h; sourceTree = ""; }; + B349AD241E9ABCF800ACD416 /* LzmaLib.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = LzmaLib.c; sourceTree = ""; }; + B349AD251E9ABCF800ACD416 /* LzmaLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaLib.h; sourceTree = ""; }; + B349AD261E9ABCF800ACD416 /* MtCoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MtCoder.c; sourceTree = ""; }; + B349AD271E9ABCF800ACD416 /* MtCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MtCoder.h; sourceTree = ""; }; + B349AD281E9ABCF800ACD416 /* Ppmd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Ppmd.h; sourceTree = ""; }; + B349AD291E9ABCF800ACD416 /* Ppmd7.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Ppmd7.c; sourceTree = ""; }; + B349AD2A1E9ABCF800ACD416 /* Ppmd7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Ppmd7.h; sourceTree = ""; }; + B349AD2B1E9ABCF800ACD416 /* Ppmd7Dec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Ppmd7Dec.c; sourceTree = ""; }; + B349AD2C1E9ABCF800ACD416 /* Ppmd7Enc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Ppmd7Enc.c; sourceTree = ""; }; + B349AD2D1E9ABCF800ACD416 /* Precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Precomp.h; sourceTree = ""; }; + B349AD2E1E9ABCF800ACD416 /* RotateDefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RotateDefs.h; sourceTree = ""; }; + B349AD2F1E9ABCF800ACD416 /* Sha256.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Sha256.c; sourceTree = ""; }; + B349AD301E9ABCF800ACD416 /* Sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sha256.h; sourceTree = ""; }; + B349AD311E9ABCF800ACD416 /* Sort.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Sort.c; sourceTree = ""; }; + B349AD321E9ABCF800ACD416 /* Sort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sort.h; sourceTree = ""; }; + B349AD331E9ABCF800ACD416 /* Threads.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Threads.c; sourceTree = ""; }; + B349AD341E9ABCF800ACD416 /* Threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Threads.h; sourceTree = ""; }; + B349AD351E9ABCF800ACD416 /* Xz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = Xz.c; sourceTree = ""; }; + B349AD361E9ABCF800ACD416 /* Xz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Xz.h; sourceTree = ""; }; + B349AD371E9ABCF800ACD416 /* XzCrc64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = XzCrc64.c; sourceTree = ""; }; + B349AD381E9ABCF800ACD416 /* XzCrc64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XzCrc64.h; sourceTree = ""; }; + B349AD391E9ABCF800ACD416 /* XzCrc64Opt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = XzCrc64Opt.c; sourceTree = ""; }; + B349AD3A1E9ABCF800ACD416 /* XzDec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = XzDec.c; sourceTree = ""; }; + B349AD3B1E9ABCF800ACD416 /* XzEnc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = XzEnc.c; sourceTree = ""; }; + B349AD3C1E9ABCF800ACD416 /* XzEnc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XzEnc.h; sourceTree = ""; }; + B349AD3D1E9ABCF800ACD416 /* XzIn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = XzIn.c; sourceTree = ""; }; + B349AD421E9ABCF800ACD416 /* 7zCompressionMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zCompressionMode.cpp; sourceTree = ""; }; + B349AD431E9ABCF800ACD416 /* 7zCompressionMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zCompressionMode.h; sourceTree = ""; }; + B349AD441E9ABCF800ACD416 /* 7zDecode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zDecode.cpp; sourceTree = ""; }; + B349AD451E9ABCF800ACD416 /* 7zDecode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zDecode.h; sourceTree = ""; }; + B349AD461E9ABCF800ACD416 /* 7zEncode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zEncode.cpp; sourceTree = ""; }; + B349AD471E9ABCF800ACD416 /* 7zEncode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zEncode.h; sourceTree = ""; }; + B349AD481E9ABCF800ACD416 /* 7zExtract.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zExtract.cpp; sourceTree = ""; }; + B349AD491E9ABCF800ACD416 /* 7zFolderInStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zFolderInStream.cpp; sourceTree = ""; }; + B349AD4A1E9ABCF800ACD416 /* 7zFolderInStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zFolderInStream.h; sourceTree = ""; }; + B349AD4B1E9ABCF800ACD416 /* 7zHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zHandler.cpp; sourceTree = ""; }; + B349AD4C1E9ABCF800ACD416 /* 7zHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zHandler.h; sourceTree = ""; }; + B349AD4D1E9ABCF800ACD416 /* 7zHandlerOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zHandlerOut.cpp; sourceTree = ""; }; + B349AD4E1E9ABCF800ACD416 /* 7zHeader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zHeader.cpp; sourceTree = ""; }; + B349AD4F1E9ABCF800ACD416 /* 7zHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zHeader.h; sourceTree = ""; }; + B349AD501E9ABCF800ACD416 /* 7zIn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zIn.cpp; sourceTree = ""; }; + B349AD511E9ABCF800ACD416 /* 7zIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zIn.h; sourceTree = ""; }; + B349AD521E9ABCF800ACD416 /* 7zItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zItem.h; sourceTree = ""; }; + B349AD531E9ABCF800ACD416 /* 7zOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zOut.cpp; sourceTree = ""; }; + B349AD541E9ABCF800ACD416 /* 7zOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zOut.h; sourceTree = ""; }; + B349AD551E9ABCF800ACD416 /* 7zProperties.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zProperties.cpp; sourceTree = ""; }; + B349AD561E9ABCF800ACD416 /* 7zProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zProperties.h; sourceTree = ""; }; + B349AD571E9ABCF800ACD416 /* 7zRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zRegister.cpp; sourceTree = ""; }; + B349AD581E9ABCF800ACD416 /* 7zSpecStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zSpecStream.cpp; sourceTree = ""; }; + B349AD591E9ABCF800ACD416 /* 7zSpecStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zSpecStream.h; sourceTree = ""; }; + B349AD5A1E9ABCF800ACD416 /* 7zUpdate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zUpdate.cpp; sourceTree = ""; }; + B349AD5B1E9ABCF800ACD416 /* 7zUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zUpdate.h; sourceTree = ""; }; + B349AD5C1E9ABCF800ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349AD5D1E9ABCF800ACD416 /* ArchiveExports.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArchiveExports.cpp; sourceTree = ""; }; + B349AD5F1E9ABCF800ACD416 /* CoderMixer2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CoderMixer2.cpp; sourceTree = ""; }; + B349AD601E9ABCF800ACD416 /* CoderMixer2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoderMixer2.h; sourceTree = ""; }; + B349AD611E9ABCF800ACD416 /* DummyOutStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DummyOutStream.cpp; sourceTree = ""; }; + B349AD621E9ABCF800ACD416 /* DummyOutStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DummyOutStream.h; sourceTree = ""; }; + B349AD631E9ABCF800ACD416 /* HandlerOut.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HandlerOut.cpp; sourceTree = ""; }; + B349AD641E9ABCF800ACD416 /* HandlerOut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HandlerOut.h; sourceTree = ""; }; + B349AD651E9ABCF800ACD416 /* InStreamWithCRC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InStreamWithCRC.cpp; sourceTree = ""; }; + B349AD661E9ABCF800ACD416 /* InStreamWithCRC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InStreamWithCRC.h; sourceTree = ""; }; + B349AD671E9ABCF800ACD416 /* ItemNameUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemNameUtils.cpp; sourceTree = ""; }; + B349AD681E9ABCF800ACD416 /* ItemNameUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemNameUtils.h; sourceTree = ""; }; + B349AD691E9ABCF800ACD416 /* MultiStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MultiStream.cpp; sourceTree = ""; }; + B349AD6A1E9ABCF800ACD416 /* MultiStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiStream.h; sourceTree = ""; }; + B349AD6B1E9ABCF800ACD416 /* OutStreamWithCRC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OutStreamWithCRC.cpp; sourceTree = ""; }; + B349AD6C1E9ABCF800ACD416 /* OutStreamWithCRC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutStreamWithCRC.h; sourceTree = ""; }; + B349AD6D1E9ABCF800ACD416 /* ParseProperties.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParseProperties.cpp; sourceTree = ""; }; + B349AD6E1E9ABCF800ACD416 /* ParseProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseProperties.h; sourceTree = ""; }; + B349AD6F1E9ABCF800ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349AD701E9ABCF800ACD416 /* DllExports2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DllExports2.cpp; sourceTree = ""; }; + B349AD711E9ABCF800ACD416 /* DllExports2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DllExports2.h; sourceTree = ""; }; + B349AD721E9ABCF800ACD416 /* IArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IArchive.h; sourceTree = ""; }; + B349AD731E9ABCF800ACD416 /* LzmaHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaHandler.cpp; sourceTree = ""; }; + B349AD741E9ABCF800ACD416 /* SplitHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SplitHandler.cpp; sourceTree = ""; }; + B349AD751E9ABCF800ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349AD771E9ABCF800ACD416 /* CreateCoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CreateCoder.cpp; sourceTree = ""; }; + B349AD781E9ABCF800ACD416 /* CreateCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CreateCoder.h; sourceTree = ""; }; + B349AD791E9ABCF800ACD416 /* CWrappers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CWrappers.cpp; sourceTree = ""; }; + B349AD7A1E9ABCF800ACD416 /* CWrappers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CWrappers.h; sourceTree = ""; }; + B349AD7B1E9ABCF800ACD416 /* FilePathAutoRename.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FilePathAutoRename.cpp; sourceTree = ""; }; + B349AD7C1E9ABCF800ACD416 /* FilePathAutoRename.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilePathAutoRename.h; sourceTree = ""; }; + B349AD7D1E9ABCF800ACD416 /* FileStreams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileStreams.cpp; sourceTree = ""; }; + B349AD7E1E9ABCF800ACD416 /* FileStreams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileStreams.h; sourceTree = ""; }; + B349AD7F1E9ABCF800ACD416 /* FilterCoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FilterCoder.cpp; sourceTree = ""; }; + B349AD801E9ABCF800ACD416 /* FilterCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterCoder.h; sourceTree = ""; }; + B349AD811E9ABCF800ACD416 /* InBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InBuffer.cpp; sourceTree = ""; }; + B349AD821E9ABCF800ACD416 /* InBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InBuffer.h; sourceTree = ""; }; + B349AD831E9ABCF800ACD416 /* InOutTempBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InOutTempBuffer.cpp; sourceTree = ""; }; + B349AD841E9ABCF800ACD416 /* InOutTempBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InOutTempBuffer.h; sourceTree = ""; }; + B349AD851E9ABCF800ACD416 /* LimitedStreams.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LimitedStreams.cpp; sourceTree = ""; }; + B349AD861E9ABCF800ACD416 /* LimitedStreams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LimitedStreams.h; sourceTree = ""; }; + B349AD871E9ABCF800ACD416 /* LockedStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LockedStream.cpp; sourceTree = ""; }; + B349AD881E9ABCF800ACD416 /* LockedStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LockedStream.h; sourceTree = ""; }; + B349AD891E9ABCF800ACD416 /* MethodId.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MethodId.cpp; sourceTree = ""; }; + B349AD8A1E9ABCF800ACD416 /* MethodId.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MethodId.h; sourceTree = ""; }; + B349AD8B1E9ABCF800ACD416 /* MethodProps.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MethodProps.cpp; sourceTree = ""; }; + B349AD8C1E9ABCF800ACD416 /* MethodProps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MethodProps.h; sourceTree = ""; }; + B349AD8D1E9ABCF800ACD416 /* OffsetStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OffsetStream.cpp; sourceTree = ""; }; + B349AD8E1E9ABCF800ACD416 /* OffsetStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OffsetStream.h; sourceTree = ""; }; + B349AD8F1E9ABCF800ACD416 /* OutBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OutBuffer.cpp; sourceTree = ""; }; + B349AD901E9ABCF800ACD416 /* OutBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OutBuffer.h; sourceTree = ""; }; + B349AD911E9ABCF800ACD416 /* ProgressUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProgressUtils.cpp; sourceTree = ""; }; + B349AD921E9ABCF800ACD416 /* ProgressUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProgressUtils.h; sourceTree = ""; }; + B349AD931E9ABCF800ACD416 /* PropId.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PropId.cpp; sourceTree = ""; }; + B349AD941E9ABCF800ACD416 /* RegisterArc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterArc.h; sourceTree = ""; }; + B349AD951E9ABCF800ACD416 /* RegisterCodec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterCodec.h; sourceTree = ""; }; + B349AD961E9ABCF800ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349AD971E9ABCF800ACD416 /* StreamBinder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamBinder.cpp; sourceTree = ""; }; + B349AD981E9ABCF800ACD416 /* StreamBinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamBinder.h; sourceTree = ""; }; + B349AD991E9ABCF800ACD416 /* StreamObjects.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamObjects.cpp; sourceTree = ""; }; + B349AD9A1E9ABCF800ACD416 /* StreamObjects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamObjects.h; sourceTree = ""; }; + B349AD9B1E9ABCF800ACD416 /* StreamUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamUtils.cpp; sourceTree = ""; }; + B349AD9C1E9ABCF800ACD416 /* StreamUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamUtils.h; sourceTree = ""; }; + B349AD9D1E9ABCF800ACD416 /* UniqBlocks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UniqBlocks.cpp; sourceTree = ""; }; + B349AD9E1E9ABCF800ACD416 /* UniqBlocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqBlocks.h; sourceTree = ""; }; + B349AD9F1E9ABCF800ACD416 /* VirtThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VirtThread.cpp; sourceTree = ""; }; + B349ADA01E9ABCF800ACD416 /* VirtThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VirtThread.h; sourceTree = ""; }; + B349ADA21E9ABCF800ACD416 /* Bcj2Coder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Bcj2Coder.cpp; sourceTree = ""; }; + B349ADA31E9ABCF800ACD416 /* Bcj2Coder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bcj2Coder.h; sourceTree = ""; }; + B349ADA41E9ABCF800ACD416 /* Bcj2Register.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Bcj2Register.cpp; sourceTree = ""; }; + B349ADA51E9ABCF800ACD416 /* BcjCoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BcjCoder.cpp; sourceTree = ""; }; + B349ADA61E9ABCF800ACD416 /* BcjCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BcjCoder.h; sourceTree = ""; }; + B349ADA71E9ABCF800ACD416 /* BcjRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BcjRegister.cpp; sourceTree = ""; }; + B349ADA81E9ABCF800ACD416 /* BranchMisc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BranchMisc.cpp; sourceTree = ""; }; + B349ADA91E9ABCF800ACD416 /* BranchMisc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BranchMisc.h; sourceTree = ""; }; + B349ADAA1E9ABCF800ACD416 /* BranchRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BranchRegister.cpp; sourceTree = ""; }; + B349ADAB1E9ABCF800ACD416 /* ByteSwap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ByteSwap.cpp; sourceTree = ""; }; + B349ADAC1E9ABCF800ACD416 /* CodecExports.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodecExports.cpp; sourceTree = ""; }; + B349ADAD1E9ABCF800ACD416 /* CopyCoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CopyCoder.cpp; sourceTree = ""; }; + B349ADAE1E9ABCF800ACD416 /* CopyCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CopyCoder.h; sourceTree = ""; }; + B349ADAF1E9ABCF800ACD416 /* CopyRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CopyRegister.cpp; sourceTree = ""; }; + B349ADB01E9ABCF800ACD416 /* DeltaFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeltaFilter.cpp; sourceTree = ""; }; + B349ADB11E9ABCF800ACD416 /* Lzma2Decoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Lzma2Decoder.cpp; sourceTree = ""; }; + B349ADB21E9ABCF800ACD416 /* Lzma2Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lzma2Decoder.h; sourceTree = ""; }; + B349ADB31E9ABCF800ACD416 /* Lzma2Encoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Lzma2Encoder.cpp; sourceTree = ""; }; + B349ADB41E9ABCF800ACD416 /* Lzma2Encoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Lzma2Encoder.h; sourceTree = ""; }; + B349ADB51E9ABCF800ACD416 /* Lzma2Register.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Lzma2Register.cpp; sourceTree = ""; }; + B349ADB61E9ABCF800ACD416 /* LzmaDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaDecoder.cpp; sourceTree = ""; }; + B349ADB71E9ABCF800ACD416 /* LzmaDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaDecoder.h; sourceTree = ""; }; + B349ADB81E9ABCF800ACD416 /* LzmaEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaEncoder.cpp; sourceTree = ""; }; + B349ADB91E9ABCF800ACD416 /* LzmaEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaEncoder.h; sourceTree = ""; }; + B349ADBA1E9ABCF800ACD416 /* LzmaRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaRegister.cpp; sourceTree = ""; }; + B349ADBB1E9ABCF800ACD416 /* PpmdDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpmdDecoder.cpp; sourceTree = ""; }; + B349ADBC1E9ABCF800ACD416 /* PpmdDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PpmdDecoder.h; sourceTree = ""; }; + B349ADBD1E9ABCF800ACD416 /* PpmdEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpmdEncoder.cpp; sourceTree = ""; }; + B349ADBE1E9ABCF800ACD416 /* PpmdEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PpmdEncoder.h; sourceTree = ""; }; + B349ADBF1E9ABCF800ACD416 /* PpmdRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PpmdRegister.cpp; sourceTree = ""; }; + B349ADC01E9ABCF800ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349ADC21E9ABCF800ACD416 /* 7zAes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zAes.cpp; sourceTree = ""; }; + B349ADC31E9ABCF800ACD416 /* 7zAes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 7zAes.h; sourceTree = ""; }; + B349ADC41E9ABCF800ACD416 /* 7zAesRegister.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = 7zAesRegister.cpp; sourceTree = ""; }; + B349ADC51E9ABCF800ACD416 /* MyAes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MyAes.cpp; sourceTree = ""; }; + B349ADC61E9ABCF800ACD416 /* MyAes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyAes.h; sourceTree = ""; }; + B349ADC71E9ABCF800ACD416 /* MyAesReg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MyAesReg.cpp; sourceTree = ""; }; + B349ADC81E9ABCF800ACD416 /* RandGen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RandGen.cpp; sourceTree = ""; }; + B349ADC91E9ABCF800ACD416 /* RandGen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RandGen.h; sourceTree = ""; }; + B349ADCA1E9ABCF800ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349ADCB1E9ABCF800ACD416 /* ICoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ICoder.h; sourceTree = ""; }; + B349ADCC1E9ABCF800ACD416 /* IDecl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDecl.h; sourceTree = ""; }; + B349ADCD1E9ABCF800ACD416 /* IPassword.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IPassword.h; sourceTree = ""; }; + B349ADCE1E9ABCF800ACD416 /* IProgress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IProgress.h; sourceTree = ""; }; + B349ADCF1E9ABCF800ACD416 /* IStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IStream.h; sourceTree = ""; }; + B349ADD01E9ABCF800ACD416 /* MyVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyVersion.h; sourceTree = ""; }; + B349ADD11E9ABCF800ACD416 /* PropID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PropID.h; sourceTree = ""; }; + B349ADD31E9ABCF800ACD416 /* AutoPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoPtr.h; sourceTree = ""; }; + B349ADD41E9ABCF900ACD416 /* C_FileIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = C_FileIO.cpp; sourceTree = ""; }; + B349ADD51E9ABCF900ACD416 /* C_FileIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = C_FileIO.h; sourceTree = ""; }; + B349ADD61E9ABCF900ACD416 /* CommandLineParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CommandLineParser.cpp; sourceTree = ""; }; + B349ADD71E9ABCF900ACD416 /* CommandLineParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandLineParser.h; sourceTree = ""; }; + B349ADD81E9ABCF900ACD416 /* Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Common.h; sourceTree = ""; }; + B349ADD91E9ABCF900ACD416 /* ComTry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComTry.h; sourceTree = ""; }; + B349ADDA1E9ABCF900ACD416 /* CRC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CRC.cpp; sourceTree = ""; }; + B349ADDB1E9ABCF900ACD416 /* CrcReg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CrcReg.cpp; sourceTree = ""; }; + B349ADDC1E9ABCF900ACD416 /* Defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Defs.h; sourceTree = ""; }; + B349ADDD1E9ABCF900ACD416 /* DynamicBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicBuffer.h; sourceTree = ""; }; + B349ADDE1E9ABCF900ACD416 /* IntToString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IntToString.cpp; sourceTree = ""; }; + B349ADDF1E9ABCF900ACD416 /* IntToString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntToString.h; sourceTree = ""; }; + B349ADE01E9ABCF900ACD416 /* ListFileUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ListFileUtils.cpp; sourceTree = ""; }; + B349ADE11E9ABCF900ACD416 /* ListFileUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListFileUtils.h; sourceTree = ""; }; + B349ADE21E9ABCF900ACD416 /* MyBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyBuffer.h; sourceTree = ""; }; + B349ADE31E9ABCF900ACD416 /* MyCom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyCom.h; sourceTree = ""; }; + B349ADE41E9ABCF900ACD416 /* MyException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyException.h; sourceTree = ""; }; + B349ADE51E9ABCF900ACD416 /* MyGuidDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyGuidDef.h; sourceTree = ""; }; + B349ADE61E9ABCF900ACD416 /* MyInitGuid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyInitGuid.h; sourceTree = ""; }; + B349ADE71E9ABCF900ACD416 /* MyLinux.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyLinux.h; sourceTree = ""; }; + B349ADE81E9ABCF900ACD416 /* MyString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MyString.cpp; sourceTree = ""; }; + B349ADE91E9ABCF900ACD416 /* MyString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyString.h; sourceTree = ""; }; + B349ADEA1E9ABCF900ACD416 /* MyTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyTypes.h; sourceTree = ""; }; + B349ADEB1E9ABCF900ACD416 /* MyUnknown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyUnknown.h; sourceTree = ""; }; + B349ADEC1E9ABCF900ACD416 /* MyVector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MyVector.cpp; sourceTree = ""; }; + B349ADED1E9ABCF900ACD416 /* MyVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyVector.h; sourceTree = ""; }; + B349ADEE1E9ABCF900ACD416 /* MyWindows.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MyWindows.cpp; sourceTree = ""; }; + B349ADEF1E9ABCF900ACD416 /* MyWindows.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyWindows.h; sourceTree = ""; }; + B349ADF01E9ABCF900ACD416 /* NewHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NewHandler.cpp; sourceTree = ""; }; + B349ADF11E9ABCF900ACD416 /* NewHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewHandler.h; sourceTree = ""; }; + B349ADF21E9ABCF900ACD416 /* Sha256Reg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sha256Reg.cpp; sourceTree = ""; }; + B349ADF31E9ABCF900ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349ADF41E9ABCF900ACD416 /* StdInStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StdInStream.cpp; sourceTree = ""; }; + B349ADF51E9ABCF900ACD416 /* StdInStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdInStream.h; sourceTree = ""; }; + B349ADF61E9ABCF900ACD416 /* StdOutStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StdOutStream.cpp; sourceTree = ""; }; + B349ADF71E9ABCF900ACD416 /* StdOutStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdOutStream.h; sourceTree = ""; }; + B349ADF81E9ABCF900ACD416 /* StringConvert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringConvert.cpp; sourceTree = ""; }; + B349ADF91E9ABCF900ACD416 /* StringConvert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringConvert.h; sourceTree = ""; }; + B349ADFA1E9ABCF900ACD416 /* StringToInt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringToInt.cpp; sourceTree = ""; }; + B349ADFB1E9ABCF900ACD416 /* StringToInt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringToInt.h; sourceTree = ""; }; + B349ADFC1E9ABCF900ACD416 /* TextConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextConfig.cpp; sourceTree = ""; }; + B349ADFD1E9ABCF900ACD416 /* TextConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextConfig.h; sourceTree = ""; }; + B349ADFE1E9ABCF900ACD416 /* UTFConvert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UTFConvert.cpp; sourceTree = ""; }; + B349ADFF1E9ABCF900ACD416 /* UTFConvert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UTFConvert.h; sourceTree = ""; }; + B349AE001E9ABCF900ACD416 /* Wildcard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Wildcard.cpp; sourceTree = ""; }; + B349AE011E9ABCF900ACD416 /* Wildcard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Wildcard.h; sourceTree = ""; }; + B349AE021E9ABCF900ACD416 /* XzCrc64Reg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = XzCrc64Reg.cpp; sourceTree = ""; }; + B349AE041E9ABCF900ACD416 /* Defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Defs.h; sourceTree = ""; }; + B349AE051E9ABCF900ACD416 /* FileIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileIO.cpp; sourceTree = ""; }; + B349AE061E9ABCF900ACD416 /* PropVariant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PropVariant.cpp; sourceTree = ""; }; + B349AE071E9ABCF900ACD416 /* PropVariant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PropVariant.h; sourceTree = ""; }; + B349AE081E9ABCF900ACD416 /* PropVariantConv.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PropVariantConv.cpp; sourceTree = ""; }; + B349AE091E9ABCF900ACD416 /* PropVariantConv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PropVariantConv.h; sourceTree = ""; }; + B349AE0A1E9ABCF900ACD416 /* StdAfx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdAfx.h; sourceTree = ""; }; + B349AE0B1E9ABCF900ACD416 /* Synchronization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Synchronization.h; sourceTree = ""; }; + B349AE0C1E9ABCF900ACD416 /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; + B349AE0D1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "LzmaSDK-ObjC.podspec"; sourceTree = ""; }; + B349AE0E1E9ABCF900ACD416 /* LzmaSDKObjC.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LzmaSDKObjC.podspec; sourceTree = ""; }; + B349AE0F1E9ABCF900ACD416 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + B349AE111E9ABCF900ACD416 /* LzmaAppleCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaAppleCommon.h; sourceTree = ""; }; + B349AE121E9ABCF900ACD416 /* LzmaSDKObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjC.h; sourceTree = ""; }; + B349AE131E9ABCF900ACD416 /* LzmaSDKObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjC.mm; sourceTree = ""; }; + B349AE141E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCBaseCoder.cpp; sourceTree = ""; }; + B349AE151E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCBaseCoder.h; sourceTree = ""; }; + B349AE161E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCBufferProcessor.h; sourceTree = ""; }; + B349AE171E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCBufferProcessor.mm; sourceTree = ""; }; + B349AE181E9ABCF900ACD416 /* LzmaSDKObjCCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCCommon.cpp; sourceTree = ""; }; + B349AE191E9ABCF900ACD416 /* LzmaSDKObjCCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCCommon.h; sourceTree = ""; }; + B349AE1A1E9ABCF900ACD416 /* LzmaSDKObjCError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCError.h; sourceTree = ""; }; + B349AE1B1E9ABCF900ACD416 /* LzmaSDKObjCError.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCError.mm; sourceTree = ""; }; + B349AE1C1E9ABCF900ACD416 /* LzmaSDKObjCExtern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCExtern.h; sourceTree = ""; }; + B349AE1D1E9ABCF900ACD416 /* LzmaSDKObjCExtern.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCExtern.mm; sourceTree = ""; }; + B349AE1E1E9ABCF900ACD416 /* LzmaSDKObjCExtractCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCExtractCallback.h; sourceTree = ""; }; + B349AE1F1E9ABCF900ACD416 /* LzmaSDKObjCExtractCallback.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCExtractCallback.mm; sourceTree = ""; }; + B349AE201E9ABCF900ACD416 /* LzmaSDKObjCFileDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCFileDecoder.cpp; sourceTree = ""; }; + B349AE211E9ABCF900ACD416 /* LzmaSDKObjCFileDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCFileDecoder.h; sourceTree = ""; }; + B349AE221E9ABCF900ACD416 /* LzmaSDKObjCFileEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCFileEncoder.cpp; sourceTree = ""; }; + B349AE231E9ABCF900ACD416 /* LzmaSDKObjCFileEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCFileEncoder.h; sourceTree = ""; }; + B349AE241E9ABCF900ACD416 /* LzmaSDKObjCInFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCInFile.cpp; sourceTree = ""; }; + B349AE251E9ABCF900ACD416 /* LzmaSDKObjCInFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCInFile.h; sourceTree = ""; }; + B349AE261E9ABCF900ACD416 /* LzmaSDKObjCItem+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LzmaSDKObjCItem+Private.h"; sourceTree = ""; }; + B349AE271E9ABCF900ACD416 /* LzmaSDKObjCItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCItem.h; sourceTree = ""; }; + B349AE281E9ABCF900ACD416 /* LzmaSDKObjCItem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCItem.mm; sourceTree = ""; }; + B349AE291E9ABCF900ACD416 /* LzmaSDKObjCMutableItem+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LzmaSDKObjCMutableItem+Private.h"; sourceTree = ""; }; + B349AE2A1E9ABCF900ACD416 /* LzmaSDKObjCMutableItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCMutableItem.h; sourceTree = ""; }; + B349AE2B1E9ABCF900ACD416 /* LzmaSDKObjCMutableItem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCMutableItem.mm; sourceTree = ""; }; + B349AE2C1E9ABCF900ACD416 /* LzmaSDKObjCOpenCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCOpenCallback.cpp; sourceTree = ""; }; + B349AE2D1E9ABCF900ACD416 /* LzmaSDKObjCOpenCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCOpenCallback.h; sourceTree = ""; }; + B349AE2E1E9ABCF900ACD416 /* LzmaSDKObjCOutFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LzmaSDKObjCOutFile.cpp; sourceTree = ""; }; + B349AE2F1E9ABCF900ACD416 /* LzmaSDKObjCOutFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCOutFile.h; sourceTree = ""; }; + B349AE301E9ABCF900ACD416 /* LzmaSDKObjCReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCReader.h; sourceTree = ""; }; + B349AE311E9ABCF900ACD416 /* LzmaSDKObjCReader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCReader.mm; sourceTree = ""; }; + B349AE321E9ABCF900ACD416 /* LzmaSDKObjCTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCTypes.h; sourceTree = ""; }; + B349AE331E9ABCF900ACD416 /* LzmaSDKObjCUpdateCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCUpdateCallback.h; sourceTree = ""; }; + B349AE341E9ABCF900ACD416 /* LzmaSDKObjCUpdateCallback.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCUpdateCallback.mm; sourceTree = ""; }; + B349AE351E9ABCF900ACD416 /* LzmaSDKObjCWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LzmaSDKObjCWriter.h; sourceTree = ""; }; + B349AE361E9ABCF900ACD416 /* LzmaSDKObjCWriter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LzmaSDKObjCWriter.mm; sourceTree = ""; }; + B349AF731E9AC31700ACD416 /* NSArray+Inlineobjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Inlineobjc.h"; sourceTree = ""; }; + B349AF741E9AC31700ACD416 /* NSString+Inlineobjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Inlineobjc.h"; sourceTree = ""; }; + B35469311DECCD4A0018B6F3 /* PVAtari800.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVAtari800.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B35469361DECD8570018B6F3 /* PVAtari5200ControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVAtari5200ControllerViewController.h; sourceTree = ""; }; + B35469371DECD8570018B6F3 /* PVAtari5200ControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVAtari5200ControllerViewController.m; sourceTree = ""; }; + B354693B1DECDA710018B6F3 /* PVAtari800.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVAtari800.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B36DE7C81D6B80CA002EE3ED /* PVAtari7800ControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVAtari7800ControllerViewController.h; sourceTree = ""; }; B36DE7C91D6B80CA002EE3ED /* PVAtari7800ControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVAtari7800ControllerViewController.m; sourceTree = ""; }; + B39578C01E6D2D8B00854D7A /* PVPCEControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PVPCEControllerViewController.h; path = Provenance/Controller/PVPCEControllerViewController.h; sourceTree = ""; }; + B39578C11E6D2D8B00854D7A /* PVPCEControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PVPCEControllerViewController.m; path = Provenance/Controller/PVPCEControllerViewController.m; sourceTree = ""; }; + B39578C51E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVNeoGeoPocketControllerViewController.h; sourceTree = ""; }; + B39578C61E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVNeoGeoPocketControllerViewController.m; sourceTree = ""; }; B3AD689A1D6EA6180021B949 /* PicoDrive.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PicoDrive.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3AD68A21D6EA7070021B949 /* ProSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ProSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3C653071E6F73450096053B /* PVMednafen.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PVMednafen.framework; path = "../../Library/Developer/Xcode/DerivedData/Provenance-cqyrqlnsqskspscgaptpbmkqmvze/Build/Products/Debug-iphonesimulator/PVMednafen.framework"; sourceTree = ""; }; B3C9D42F1DEA1B260068D057 /* PVNES.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVNES.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3C9D4321DEA1B340068D057 /* PVGenesis.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVGenesis.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3C9D4AD1DEA74390068D057 /* PVGB.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVGB.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -579,8 +1246,13 @@ B3C9D5E01DEA8A290068D057 /* PVGenesis.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVGenesis.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3C9D5E31DEA8AED0068D057 /* PVStella.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVStella.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3C9D5E61DEAA7E80068D057 /* PVStella.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVStella.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3CB85BE1E9BFB07009155A6 /* PVPokeMini.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVPokeMini.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3CB85C11E9BFB16009155A6 /* PVPokeMini.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVPokeMini.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B3CB85C51E9BFBA1009155A6 /* PVPokeMiniControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVPokeMiniControllerViewController.h; sourceTree = ""; }; + B3CB85C61E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVPokeMiniControllerViewController.m; sourceTree = ""; }; B3D2E38F1D6E8B3C0058544D /* PV32XControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PV32XControllerViewController.h; sourceTree = ""; }; B3D2E3901D6E8B3C0058544D /* PV32XControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PV32XControllerViewController.m; sourceTree = ""; }; + B3DEE8E81E9E9C880004D25E /* PVAtari800.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PVAtari800.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B3DF87631D6A5A5300D216D4 /* PVStellaControllerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVStellaControllerViewController.h; sourceTree = ""; }; B3DF87641D6A5A5300D216D4 /* PVStellaControllerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVStellaControllerViewController.m; sourceTree = ""; }; BE1E26651C2252CA00499BA0 /* PVEmulatorConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVEmulatorConstants.h; sourceTree = ""; }; @@ -641,7 +1313,9 @@ 1AECF4A91966D76100F8704E /* libsqlite3.dylib in Frameworks */, B3C9D4331DEA1B340068D057 /* PVGenesis.framework in Frameworks */, B3C9D4301DEA1B260068D057 /* PVNES.framework in Frameworks */, + B354693C1DECDA710018B6F3 /* PVAtari800.framework in Frameworks */, 1AD4BC6F1BFD38D6007D6C7C /* AVFoundation.framework in Frameworks */, + B3CB85BF1E9BFB07009155A6 /* PVPokeMini.framework in Frameworks */, 423BB97B17DD35B10048F457 /* AssetsLibrary.framework in Frameworks */, 1A4869DD17C8D60C0019F6D2 /* CFNetwork.framework in Frameworks */, 1A4869DE17C8D60C0019F6D2 /* MobileCoreServices.framework in Frameworks */, @@ -657,6 +1331,7 @@ 1A3D409A17B2DCE4004DFFFC /* Foundation.framework in Frameworks */, B3C9D5E71DEAA7E80068D057 /* PVStella.framework in Frameworks */, 1A3D409C17B2DCE4004DFFFC /* CoreGraphics.framework in Frameworks */, + B3B0860A1E71316A007F39E1 /* PVMednafen.framework in Frameworks */, 1AAE7D421BC870A2003066C0 /* Realm.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -667,6 +1342,7 @@ files = ( B3C9D4B11DEA74500068D057 /* PVGB.framework in Frameworks */, B3AD68A31D6EA7070021B949 /* ProSystem.framework in Frameworks */, + B3CB85C21E9BFB16009155A6 /* PVPokeMini.framework in Frameworks */, 1AD4821B1BA3594300FDA50A /* libstdc++.tbd in Frameworks */, 1AD482191BA3593900FDA50A /* libc++.tbd in Frameworks */, 1AD482171BA3592D00FDA50A /* libsqlite3.tbd in Frameworks */, @@ -681,6 +1357,7 @@ 1AD482311BA359FF00FDA50A /* UIKit.framework in Frameworks */, 1AD4822F1BA359DA00FDA50A /* OpenGLES.framework in Frameworks */, 1AACCAE31BB60D8E00DC21AE /* Realm.framework in Frameworks */, + B340E60A1E088CF900AD0E8B /* PVMednafen.framework in Frameworks */, B3C9D5E41DEA8AED0068D057 /* PVStella.framework in Frameworks */, 1AD4822B1BA359C800FDA50A /* GLKit.framework in Frameworks */, 1AD482291BA359BA00FDA50A /* AudioToolbox.framework in Frameworks */, @@ -690,6 +1367,7 @@ B3C9D5DE1DEA8A250068D057 /* PVNES.framework in Frameworks */, 1AD482231BA3598100FDA50A /* SystemConfiguration.framework in Frameworks */, 1AD482211BA3597500FDA50A /* Security.framework in Frameworks */, + B3DEE8E91E9E9C880004D25E /* PVAtari800.framework in Frameworks */, 1AD4821F1BA3596D00FDA50A /* MobileCoreServices.framework in Frameworks */, 1AD4821D1BA3596200FDA50A /* CFNetwork.framework in Frameworks */, ); @@ -699,9 +1377,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B3AD68AA1D6EA7220021B949 /* PicoDrive.framework in Frameworks */, - B3AD68A91D6EA7220021B949 /* PVSupport.framework in Frameworks */, - B3AD68A71D6EA7220021B949 /* ProSystem.framework in Frameworks */, + B32D8F821EA7FDBE00175FBF /* GameController.framework in Frameworks */, + B32D8F801EA7FDB900175FBF /* UIKit.framework in Frameworks */, + B32D8F7F1EA7FD6300175FBF /* PVSupport.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -810,11 +1488,21 @@ 1A3D409617B2DCE4004DFFFC /* Frameworks */ = { isa = PBXGroup; children = ( + B3DEE8E81E9E9C880004D25E /* PVAtari800.framework */, + B32D8F811EA7FDBE00175FBF /* GameController.framework */, + B32D8F7E1EA7FD6300175FBF /* PVSupport.framework */, + B3CB85C11E9BFB16009155A6 /* PVPokeMini.framework */, + B3CB85BE1E9BFB07009155A6 /* PVPokeMini.framework */, + B3C653071E6F73450096053B /* PVMednafen.framework */, + B340E5FE1E088CA700AD0E8B /* PVMednafen.framework */, + B340E6091E088CF900AD0E8B /* PVMednafen.framework */, 1A4DF9F91C0E411500DDBC20 /* iOS */, 1A4DF9F81C0E40FE00DDBC20 /* tvOS */, B3AD689A1D6EA6180021B949 /* PicoDrive.framework */, B3AD68A21D6EA7070021B949 /* ProSystem.framework */, B3C9D4B01DEA74500068D057 /* PVGB.framework */, + B35469311DECCD4A0018B6F3 /* PVAtari800.framework */, + B354693B1DECDA710018B6F3 /* PVAtari800.framework */, B3C9D4AD1DEA74390068D057 /* PVGB.framework */, B3C9D5DA1DEA8A200068D057 /* PVGBA.framework */, B3C9D5201DEA787D0068D057 /* PVGBA.framework */, @@ -843,6 +1531,7 @@ 1A1237F417CA27B700CEC788 /* Emulator */, 1A1237F317CA27AD00CEC788 /* Settings */, 1A1237F217CA279900CEC788 /* User Interface */, + B349ACEC1E9ABCF800ACD416 /* LzmaSDKObjC */, 1A26EE261AD9FFBF004EA30B /* SSZipArchive */, 1AADCDB117BD997500F53CFE /* Categories */, 1A47C94A17BC310700C27644 /* Controller */, @@ -870,17 +1559,23 @@ children = ( B3D2E3941D6E8B460058544D /* 32X */, B3DF87681D6A5A6200D216D4 /* Atari2600 */, + B35469351DECD8250018B6F3 /* Atari5200 */, B36DE7CD1D6B80DA002EE3ED /* Atari7800 */, + B32893751E0B4E540090B97A /* Atari Lynx */, 1AABE0CD1ABE3E4000FF6AEF /* GB */, 1A9FBE201ABD28B6004E778B /* GBA */, 1A9FBE1E1ABD28A1004E778B /* Genesis */, + B39578C41E6D4D6700854D7A /* Neo Geo */, + B39578BF1E6D2D5700854D7A /* PCE */, + AA9B6EDB1D7097C400422E5F /* PSX */, E41448871B3125D90056D80A /* iCade */, 1A74171A1ABF22FD00F3CD3C /* NES */, + B3CB85C41E9BFB4B009155A6 /* PokeMini */, 1A9FBE1F1ABD28A9004E778B /* SNES */, + B32893701E0B24D80090B97A /* WonderSwan */, + B328937A1E0B87630090B97A /* VirtualBoy */, 1A47C96117BC310700C27644 /* JSButton.h */, 1A47C96217BC310700C27644 /* JSButton.m */, - B3D2E38F1D6E8B3C0058544D /* PV32XControllerViewController.h */, - B3D2E3901D6E8B3C0058544D /* PV32XControllerViewController.m */, 1A47C96317BC310700C27644 /* JSDPad.h */, 1A47C96417BC310700C27644 /* JSDPad.m */, 1ACD487517BEEABC0053407A /* PVButtonGroupOverlayView.h */, @@ -1114,6 +1809,7 @@ children = ( 1AD9AA391ACC988F00EC87A0 /* Provenance_Tests.m */, 1AD9AA421ACC98F500EC87A0 /* PVGameImporterTests.m */, + B32D8F7C1EA7F79900175FBF /* PVEmulatorConfigurationTests.m */, 1AD9AA371ACC988F00EC87A0 /* Supporting Files */, ); path = "Provenance Tests"; @@ -1218,6 +1914,481 @@ path = Reachability; sourceTree = ""; }; + AA9B6EDB1D7097C400422E5F /* PSX */ = { + isa = PBXGroup; + children = ( + AA9B6EDC1D70981000422E5F /* PVPSXControllerViewController.h */, + AA9B6EDD1D70981000422E5F /* PVPSXControllerViewController.m */, + ); + name = PSX; + sourceTree = ""; + }; + B32893701E0B24D80090B97A /* WonderSwan */ = { + isa = PBXGroup; + children = ( + B32893711E0B250B0090B97A /* PVWonderSwanControllerViewController.h */, + B32893721E0B250B0090B97A /* PVWonderSwanControllerViewController.m */, + ); + name = WonderSwan; + sourceTree = ""; + }; + B32893751E0B4E540090B97A /* Atari Lynx */ = { + isa = PBXGroup; + children = ( + B32893761E0B4EA30090B97A /* PVLynxControllerViewController.h */, + B32893771E0B4EA30090B97A /* PVLynxControllerViewController.m */, + ); + name = "Atari Lynx"; + sourceTree = ""; + }; + B328937A1E0B87630090B97A /* VirtualBoy */ = { + isa = PBXGroup; + children = ( + B328937B1E0B87960090B97A /* PVVBControllerViewController.h */, + B328937C1E0B87960090B97A /* PVVBControllerViewController.m */, + ); + name = VirtualBoy; + sourceTree = ""; + }; + B349ACEC1E9ABCF800ACD416 /* LzmaSDKObjC */ = { + isa = PBXGroup; + children = ( + B349AF731E9AC31700ACD416 /* NSArray+Inlineobjc.h */, + B349AF741E9AC31700ACD416 /* NSString+Inlineobjc.h */, + B349ACED1E9ABCF800ACD416 /* .gitignore */, + B349ACEE1E9ABCF800ACD416 /* .travis.yml */, + B349ACEF1E9ABCF800ACD416 /* CHANGELOG */, + B349ACF01E9ABCF800ACD416 /* LICENSE */, + B349ACF11E9ABCF800ACD416 /* lzma */, + B349AE0D1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec */, + B349AE0E1E9ABCF900ACD416 /* LzmaSDKObjC.podspec */, + B349AE0F1E9ABCF900ACD416 /* README.md */, + B349AE101E9ABCF900ACD416 /* src */, + ); + path = LzmaSDKObjC; + sourceTree = ""; + }; + B349ACF11E9ABCF800ACD416 /* lzma */ = { + isa = PBXGroup; + children = ( + B349ACF21E9ABCF800ACD416 /* C */, + B349AD3E1E9ABCF800ACD416 /* CPP */, + ); + path = lzma; + sourceTree = ""; + }; + B349ACF21E9ABCF800ACD416 /* C */ = { + isa = PBXGroup; + children = ( + B349ACF31E9ABCF800ACD416 /* 7z.h */, + B349ACF41E9ABCF800ACD416 /* 7zAlloc.c */, + B349ACF51E9ABCF800ACD416 /* 7zAlloc.h */, + B349ACF61E9ABCF800ACD416 /* 7zArcIn.c */, + B349ACF71E9ABCF800ACD416 /* 7zBuf.c */, + B349ACF81E9ABCF800ACD416 /* 7zBuf.h */, + B349ACF91E9ABCF800ACD416 /* 7zBuf2.c */, + B349ACFA1E9ABCF800ACD416 /* 7zCrc.c */, + B349ACFB1E9ABCF800ACD416 /* 7zCrc.h */, + B349ACFC1E9ABCF800ACD416 /* 7zCrcOpt.c */, + B349ACFD1E9ABCF800ACD416 /* 7zDec.c */, + B349ACFE1E9ABCF800ACD416 /* 7zFile.c */, + B349ACFF1E9ABCF800ACD416 /* 7zFile.h */, + B349AD001E9ABCF800ACD416 /* 7zStream.c */, + B349AD011E9ABCF800ACD416 /* 7zTypes.h */, + B349AD021E9ABCF800ACD416 /* 7zVersion.h */, + B349AD031E9ABCF800ACD416 /* Aes.c */, + B349AD041E9ABCF800ACD416 /* Aes.h */, + B349AD051E9ABCF800ACD416 /* AesOpt.c */, + B349AD061E9ABCF800ACD416 /* Alloc.c */, + B349AD071E9ABCF800ACD416 /* Alloc.h */, + B349AD081E9ABCF800ACD416 /* Bcj2.c */, + B349AD091E9ABCF800ACD416 /* Bcj2.h */, + B349AD0A1E9ABCF800ACD416 /* Bcj2Enc.c */, + B349AD0B1E9ABCF800ACD416 /* Bra.c */, + B349AD0C1E9ABCF800ACD416 /* Bra.h */, + B349AD0D1E9ABCF800ACD416 /* Bra86.c */, + B349AD0E1E9ABCF800ACD416 /* BraIA64.c */, + B349AD0F1E9ABCF800ACD416 /* Compiler.h */, + B349AD101E9ABCF800ACD416 /* CpuArch.c */, + B349AD111E9ABCF800ACD416 /* CpuArch.h */, + B349AD121E9ABCF800ACD416 /* Delta.c */, + B349AD131E9ABCF800ACD416 /* Delta.h */, + B349AD141E9ABCF800ACD416 /* LzFind.c */, + B349AD151E9ABCF800ACD416 /* LzFind.h */, + B349AD161E9ABCF800ACD416 /* LzFindMt.c */, + B349AD171E9ABCF800ACD416 /* LzFindMt.h */, + B349AD181E9ABCF800ACD416 /* LzHash.h */, + B349AD191E9ABCF800ACD416 /* Lzma2Dec.c */, + B349AD1A1E9ABCF800ACD416 /* Lzma2Dec.h */, + B349AD1B1E9ABCF800ACD416 /* Lzma2Enc.c */, + B349AD1C1E9ABCF800ACD416 /* Lzma2Enc.h */, + B349AD1D1E9ABCF800ACD416 /* Lzma86.h */, + B349AD1E1E9ABCF800ACD416 /* Lzma86Dec.c */, + B349AD1F1E9ABCF800ACD416 /* Lzma86Enc.c */, + B349AD201E9ABCF800ACD416 /* LzmaDec.c */, + B349AD211E9ABCF800ACD416 /* LzmaDec.h */, + B349AD221E9ABCF800ACD416 /* LzmaEnc.c */, + B349AD231E9ABCF800ACD416 /* LzmaEnc.h */, + B349AD241E9ABCF800ACD416 /* LzmaLib.c */, + B349AD251E9ABCF800ACD416 /* LzmaLib.h */, + B349AD261E9ABCF800ACD416 /* MtCoder.c */, + B349AD271E9ABCF800ACD416 /* MtCoder.h */, + B349AD281E9ABCF800ACD416 /* Ppmd.h */, + B349AD291E9ABCF800ACD416 /* Ppmd7.c */, + B349AD2A1E9ABCF800ACD416 /* Ppmd7.h */, + B349AD2B1E9ABCF800ACD416 /* Ppmd7Dec.c */, + B349AD2C1E9ABCF800ACD416 /* Ppmd7Enc.c */, + B349AD2D1E9ABCF800ACD416 /* Precomp.h */, + B349AD2E1E9ABCF800ACD416 /* RotateDefs.h */, + B349AD2F1E9ABCF800ACD416 /* Sha256.c */, + B349AD301E9ABCF800ACD416 /* Sha256.h */, + B349AD311E9ABCF800ACD416 /* Sort.c */, + B349AD321E9ABCF800ACD416 /* Sort.h */, + B349AD331E9ABCF800ACD416 /* Threads.c */, + B349AD341E9ABCF800ACD416 /* Threads.h */, + B349AD351E9ABCF800ACD416 /* Xz.c */, + B349AD361E9ABCF800ACD416 /* Xz.h */, + B349AD371E9ABCF800ACD416 /* XzCrc64.c */, + B349AD381E9ABCF800ACD416 /* XzCrc64.h */, + B349AD391E9ABCF800ACD416 /* XzCrc64Opt.c */, + B349AD3A1E9ABCF800ACD416 /* XzDec.c */, + B349AD3B1E9ABCF800ACD416 /* XzEnc.c */, + B349AD3C1E9ABCF800ACD416 /* XzEnc.h */, + B349AD3D1E9ABCF800ACD416 /* XzIn.c */, + ); + path = C; + sourceTree = ""; + }; + B349AD3E1E9ABCF800ACD416 /* CPP */ = { + isa = PBXGroup; + children = ( + B349AD3F1E9ABCF800ACD416 /* 7zip */, + B349ADD21E9ABCF800ACD416 /* Common */, + B349AE031E9ABCF900ACD416 /* Windows */, + ); + path = CPP; + sourceTree = ""; + }; + B349AD3F1E9ABCF800ACD416 /* 7zip */ = { + isa = PBXGroup; + children = ( + B349AD401E9ABCF800ACD416 /* Archive */, + B349AD761E9ABCF800ACD416 /* Common */, + B349ADA11E9ABCF800ACD416 /* Compress */, + B349ADC11E9ABCF800ACD416 /* Crypto */, + B349ADCB1E9ABCF800ACD416 /* ICoder.h */, + B349ADCC1E9ABCF800ACD416 /* IDecl.h */, + B349ADCD1E9ABCF800ACD416 /* IPassword.h */, + B349ADCE1E9ABCF800ACD416 /* IProgress.h */, + B349ADCF1E9ABCF800ACD416 /* IStream.h */, + B349ADD01E9ABCF800ACD416 /* MyVersion.h */, + B349ADD11E9ABCF800ACD416 /* PropID.h */, + ); + path = 7zip; + sourceTree = ""; + }; + B349AD401E9ABCF800ACD416 /* Archive */ = { + isa = PBXGroup; + children = ( + B349AD411E9ABCF800ACD416 /* 7z */, + B349AD5D1E9ABCF800ACD416 /* ArchiveExports.cpp */, + B349AD5E1E9ABCF800ACD416 /* Common */, + B349AD701E9ABCF800ACD416 /* DllExports2.cpp */, + B349AD711E9ABCF800ACD416 /* DllExports2.h */, + B349AD721E9ABCF800ACD416 /* IArchive.h */, + B349AD731E9ABCF800ACD416 /* LzmaHandler.cpp */, + B349AD741E9ABCF800ACD416 /* SplitHandler.cpp */, + B349AD751E9ABCF800ACD416 /* StdAfx.h */, + ); + path = Archive; + sourceTree = ""; + }; + B349AD411E9ABCF800ACD416 /* 7z */ = { + isa = PBXGroup; + children = ( + B349AD421E9ABCF800ACD416 /* 7zCompressionMode.cpp */, + B349AD431E9ABCF800ACD416 /* 7zCompressionMode.h */, + B349AD441E9ABCF800ACD416 /* 7zDecode.cpp */, + B349AD451E9ABCF800ACD416 /* 7zDecode.h */, + B349AD461E9ABCF800ACD416 /* 7zEncode.cpp */, + B349AD471E9ABCF800ACD416 /* 7zEncode.h */, + B349AD481E9ABCF800ACD416 /* 7zExtract.cpp */, + B349AD491E9ABCF800ACD416 /* 7zFolderInStream.cpp */, + B349AD4A1E9ABCF800ACD416 /* 7zFolderInStream.h */, + B349AD4B1E9ABCF800ACD416 /* 7zHandler.cpp */, + B349AD4C1E9ABCF800ACD416 /* 7zHandler.h */, + B349AD4D1E9ABCF800ACD416 /* 7zHandlerOut.cpp */, + B349AD4E1E9ABCF800ACD416 /* 7zHeader.cpp */, + B349AD4F1E9ABCF800ACD416 /* 7zHeader.h */, + B349AD501E9ABCF800ACD416 /* 7zIn.cpp */, + B349AD511E9ABCF800ACD416 /* 7zIn.h */, + B349AD521E9ABCF800ACD416 /* 7zItem.h */, + B349AD531E9ABCF800ACD416 /* 7zOut.cpp */, + B349AD541E9ABCF800ACD416 /* 7zOut.h */, + B349AD551E9ABCF800ACD416 /* 7zProperties.cpp */, + B349AD561E9ABCF800ACD416 /* 7zProperties.h */, + B349AD571E9ABCF800ACD416 /* 7zRegister.cpp */, + B349AD581E9ABCF800ACD416 /* 7zSpecStream.cpp */, + B349AD591E9ABCF800ACD416 /* 7zSpecStream.h */, + B349AD5A1E9ABCF800ACD416 /* 7zUpdate.cpp */, + B349AD5B1E9ABCF800ACD416 /* 7zUpdate.h */, + B349AD5C1E9ABCF800ACD416 /* StdAfx.h */, + ); + path = 7z; + sourceTree = ""; + }; + B349AD5E1E9ABCF800ACD416 /* Common */ = { + isa = PBXGroup; + children = ( + B349AD5F1E9ABCF800ACD416 /* CoderMixer2.cpp */, + B349AD601E9ABCF800ACD416 /* CoderMixer2.h */, + B349AD611E9ABCF800ACD416 /* DummyOutStream.cpp */, + B349AD621E9ABCF800ACD416 /* DummyOutStream.h */, + B349AD631E9ABCF800ACD416 /* HandlerOut.cpp */, + B349AD641E9ABCF800ACD416 /* HandlerOut.h */, + B349AD651E9ABCF800ACD416 /* InStreamWithCRC.cpp */, + B349AD661E9ABCF800ACD416 /* InStreamWithCRC.h */, + B349AD671E9ABCF800ACD416 /* ItemNameUtils.cpp */, + B349AD681E9ABCF800ACD416 /* ItemNameUtils.h */, + B349AD691E9ABCF800ACD416 /* MultiStream.cpp */, + B349AD6A1E9ABCF800ACD416 /* MultiStream.h */, + B349AD6B1E9ABCF800ACD416 /* OutStreamWithCRC.cpp */, + B349AD6C1E9ABCF800ACD416 /* OutStreamWithCRC.h */, + B349AD6D1E9ABCF800ACD416 /* ParseProperties.cpp */, + B349AD6E1E9ABCF800ACD416 /* ParseProperties.h */, + B349AD6F1E9ABCF800ACD416 /* StdAfx.h */, + ); + path = Common; + sourceTree = ""; + }; + B349AD761E9ABCF800ACD416 /* Common */ = { + isa = PBXGroup; + children = ( + B349AD771E9ABCF800ACD416 /* CreateCoder.cpp */, + B349AD781E9ABCF800ACD416 /* CreateCoder.h */, + B349AD791E9ABCF800ACD416 /* CWrappers.cpp */, + B349AD7A1E9ABCF800ACD416 /* CWrappers.h */, + B349AD7B1E9ABCF800ACD416 /* FilePathAutoRename.cpp */, + B349AD7C1E9ABCF800ACD416 /* FilePathAutoRename.h */, + B349AD7D1E9ABCF800ACD416 /* FileStreams.cpp */, + B349AD7E1E9ABCF800ACD416 /* FileStreams.h */, + B349AD7F1E9ABCF800ACD416 /* FilterCoder.cpp */, + B349AD801E9ABCF800ACD416 /* FilterCoder.h */, + B349AD811E9ABCF800ACD416 /* InBuffer.cpp */, + B349AD821E9ABCF800ACD416 /* InBuffer.h */, + B349AD831E9ABCF800ACD416 /* InOutTempBuffer.cpp */, + B349AD841E9ABCF800ACD416 /* InOutTempBuffer.h */, + B349AD851E9ABCF800ACD416 /* LimitedStreams.cpp */, + B349AD861E9ABCF800ACD416 /* LimitedStreams.h */, + B349AD871E9ABCF800ACD416 /* LockedStream.cpp */, + B349AD881E9ABCF800ACD416 /* LockedStream.h */, + B349AD891E9ABCF800ACD416 /* MethodId.cpp */, + B349AD8A1E9ABCF800ACD416 /* MethodId.h */, + B349AD8B1E9ABCF800ACD416 /* MethodProps.cpp */, + B349AD8C1E9ABCF800ACD416 /* MethodProps.h */, + B349AD8D1E9ABCF800ACD416 /* OffsetStream.cpp */, + B349AD8E1E9ABCF800ACD416 /* OffsetStream.h */, + B349AD8F1E9ABCF800ACD416 /* OutBuffer.cpp */, + B349AD901E9ABCF800ACD416 /* OutBuffer.h */, + B349AD911E9ABCF800ACD416 /* ProgressUtils.cpp */, + B349AD921E9ABCF800ACD416 /* ProgressUtils.h */, + B349AD931E9ABCF800ACD416 /* PropId.cpp */, + B349AD941E9ABCF800ACD416 /* RegisterArc.h */, + B349AD951E9ABCF800ACD416 /* RegisterCodec.h */, + B349AD961E9ABCF800ACD416 /* StdAfx.h */, + B349AD971E9ABCF800ACD416 /* StreamBinder.cpp */, + B349AD981E9ABCF800ACD416 /* StreamBinder.h */, + B349AD991E9ABCF800ACD416 /* StreamObjects.cpp */, + B349AD9A1E9ABCF800ACD416 /* StreamObjects.h */, + B349AD9B1E9ABCF800ACD416 /* StreamUtils.cpp */, + B349AD9C1E9ABCF800ACD416 /* StreamUtils.h */, + B349AD9D1E9ABCF800ACD416 /* UniqBlocks.cpp */, + B349AD9E1E9ABCF800ACD416 /* UniqBlocks.h */, + B349AD9F1E9ABCF800ACD416 /* VirtThread.cpp */, + B349ADA01E9ABCF800ACD416 /* VirtThread.h */, + ); + path = Common; + sourceTree = ""; + }; + B349ADA11E9ABCF800ACD416 /* Compress */ = { + isa = PBXGroup; + children = ( + B349ADA21E9ABCF800ACD416 /* Bcj2Coder.cpp */, + B349ADA31E9ABCF800ACD416 /* Bcj2Coder.h */, + B349ADA41E9ABCF800ACD416 /* Bcj2Register.cpp */, + B349ADA51E9ABCF800ACD416 /* BcjCoder.cpp */, + B349ADA61E9ABCF800ACD416 /* BcjCoder.h */, + B349ADA71E9ABCF800ACD416 /* BcjRegister.cpp */, + B349ADA81E9ABCF800ACD416 /* BranchMisc.cpp */, + B349ADA91E9ABCF800ACD416 /* BranchMisc.h */, + B349ADAA1E9ABCF800ACD416 /* BranchRegister.cpp */, + B349ADAB1E9ABCF800ACD416 /* ByteSwap.cpp */, + B349ADAC1E9ABCF800ACD416 /* CodecExports.cpp */, + B349ADAD1E9ABCF800ACD416 /* CopyCoder.cpp */, + B349ADAE1E9ABCF800ACD416 /* CopyCoder.h */, + B349ADAF1E9ABCF800ACD416 /* CopyRegister.cpp */, + B349ADB01E9ABCF800ACD416 /* DeltaFilter.cpp */, + B349ADB11E9ABCF800ACD416 /* Lzma2Decoder.cpp */, + B349ADB21E9ABCF800ACD416 /* Lzma2Decoder.h */, + B349ADB31E9ABCF800ACD416 /* Lzma2Encoder.cpp */, + B349ADB41E9ABCF800ACD416 /* Lzma2Encoder.h */, + B349ADB51E9ABCF800ACD416 /* Lzma2Register.cpp */, + B349ADB61E9ABCF800ACD416 /* LzmaDecoder.cpp */, + B349ADB71E9ABCF800ACD416 /* LzmaDecoder.h */, + B349ADB81E9ABCF800ACD416 /* LzmaEncoder.cpp */, + B349ADB91E9ABCF800ACD416 /* LzmaEncoder.h */, + B349ADBA1E9ABCF800ACD416 /* LzmaRegister.cpp */, + B349ADBB1E9ABCF800ACD416 /* PpmdDecoder.cpp */, + B349ADBC1E9ABCF800ACD416 /* PpmdDecoder.h */, + B349ADBD1E9ABCF800ACD416 /* PpmdEncoder.cpp */, + B349ADBE1E9ABCF800ACD416 /* PpmdEncoder.h */, + B349ADBF1E9ABCF800ACD416 /* PpmdRegister.cpp */, + B349ADC01E9ABCF800ACD416 /* StdAfx.h */, + ); + path = Compress; + sourceTree = ""; + }; + B349ADC11E9ABCF800ACD416 /* Crypto */ = { + isa = PBXGroup; + children = ( + B349ADC21E9ABCF800ACD416 /* 7zAes.cpp */, + B349ADC31E9ABCF800ACD416 /* 7zAes.h */, + B349ADC41E9ABCF800ACD416 /* 7zAesRegister.cpp */, + B349ADC51E9ABCF800ACD416 /* MyAes.cpp */, + B349ADC61E9ABCF800ACD416 /* MyAes.h */, + B349ADC71E9ABCF800ACD416 /* MyAesReg.cpp */, + B349ADC81E9ABCF800ACD416 /* RandGen.cpp */, + B349ADC91E9ABCF800ACD416 /* RandGen.h */, + B349ADCA1E9ABCF800ACD416 /* StdAfx.h */, + ); + path = Crypto; + sourceTree = ""; + }; + B349ADD21E9ABCF800ACD416 /* Common */ = { + isa = PBXGroup; + children = ( + B349ADD31E9ABCF800ACD416 /* AutoPtr.h */, + B349ADD41E9ABCF900ACD416 /* C_FileIO.cpp */, + B349ADD51E9ABCF900ACD416 /* C_FileIO.h */, + B349ADD61E9ABCF900ACD416 /* CommandLineParser.cpp */, + B349ADD71E9ABCF900ACD416 /* CommandLineParser.h */, + B349ADD81E9ABCF900ACD416 /* Common.h */, + B349ADD91E9ABCF900ACD416 /* ComTry.h */, + B349ADDA1E9ABCF900ACD416 /* CRC.cpp */, + B349ADDB1E9ABCF900ACD416 /* CrcReg.cpp */, + B349ADDC1E9ABCF900ACD416 /* Defs.h */, + B349ADDD1E9ABCF900ACD416 /* DynamicBuffer.h */, + B349ADDE1E9ABCF900ACD416 /* IntToString.cpp */, + B349ADDF1E9ABCF900ACD416 /* IntToString.h */, + B349ADE01E9ABCF900ACD416 /* ListFileUtils.cpp */, + B349ADE11E9ABCF900ACD416 /* ListFileUtils.h */, + B349ADE21E9ABCF900ACD416 /* MyBuffer.h */, + B349ADE31E9ABCF900ACD416 /* MyCom.h */, + B349ADE41E9ABCF900ACD416 /* MyException.h */, + B349ADE51E9ABCF900ACD416 /* MyGuidDef.h */, + B349ADE61E9ABCF900ACD416 /* MyInitGuid.h */, + B349ADE71E9ABCF900ACD416 /* MyLinux.h */, + B349ADE81E9ABCF900ACD416 /* MyString.cpp */, + B349ADE91E9ABCF900ACD416 /* MyString.h */, + B349ADEA1E9ABCF900ACD416 /* MyTypes.h */, + B349ADEB1E9ABCF900ACD416 /* MyUnknown.h */, + B349ADEC1E9ABCF900ACD416 /* MyVector.cpp */, + B349ADED1E9ABCF900ACD416 /* MyVector.h */, + B349ADEE1E9ABCF900ACD416 /* MyWindows.cpp */, + B349ADEF1E9ABCF900ACD416 /* MyWindows.h */, + B349ADF01E9ABCF900ACD416 /* NewHandler.cpp */, + B349ADF11E9ABCF900ACD416 /* NewHandler.h */, + B349ADF21E9ABCF900ACD416 /* Sha256Reg.cpp */, + B349ADF31E9ABCF900ACD416 /* StdAfx.h */, + B349ADF41E9ABCF900ACD416 /* StdInStream.cpp */, + B349ADF51E9ABCF900ACD416 /* StdInStream.h */, + B349ADF61E9ABCF900ACD416 /* StdOutStream.cpp */, + B349ADF71E9ABCF900ACD416 /* StdOutStream.h */, + B349ADF81E9ABCF900ACD416 /* StringConvert.cpp */, + B349ADF91E9ABCF900ACD416 /* StringConvert.h */, + B349ADFA1E9ABCF900ACD416 /* StringToInt.cpp */, + B349ADFB1E9ABCF900ACD416 /* StringToInt.h */, + B349ADFC1E9ABCF900ACD416 /* TextConfig.cpp */, + B349ADFD1E9ABCF900ACD416 /* TextConfig.h */, + B349ADFE1E9ABCF900ACD416 /* UTFConvert.cpp */, + B349ADFF1E9ABCF900ACD416 /* UTFConvert.h */, + B349AE001E9ABCF900ACD416 /* Wildcard.cpp */, + B349AE011E9ABCF900ACD416 /* Wildcard.h */, + B349AE021E9ABCF900ACD416 /* XzCrc64Reg.cpp */, + ); + path = Common; + sourceTree = ""; + }; + B349AE031E9ABCF900ACD416 /* Windows */ = { + isa = PBXGroup; + children = ( + B349AE041E9ABCF900ACD416 /* Defs.h */, + B349AE051E9ABCF900ACD416 /* FileIO.cpp */, + B349AE061E9ABCF900ACD416 /* PropVariant.cpp */, + B349AE071E9ABCF900ACD416 /* PropVariant.h */, + B349AE081E9ABCF900ACD416 /* PropVariantConv.cpp */, + B349AE091E9ABCF900ACD416 /* PropVariantConv.h */, + B349AE0A1E9ABCF900ACD416 /* StdAfx.h */, + B349AE0B1E9ABCF900ACD416 /* Synchronization.h */, + B349AE0C1E9ABCF900ACD416 /* Thread.h */, + ); + path = Windows; + sourceTree = ""; + }; + B349AE101E9ABCF900ACD416 /* src */ = { + isa = PBXGroup; + children = ( + B349AE111E9ABCF900ACD416 /* LzmaAppleCommon.h */, + B349AE121E9ABCF900ACD416 /* LzmaSDKObjC.h */, + B349AE131E9ABCF900ACD416 /* LzmaSDKObjC.mm */, + B349AE141E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp */, + B349AE151E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.h */, + B349AE161E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.h */, + B349AE171E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm */, + B349AE181E9ABCF900ACD416 /* LzmaSDKObjCCommon.cpp */, + B349AE191E9ABCF900ACD416 /* LzmaSDKObjCCommon.h */, + B349AE1A1E9ABCF900ACD416 /* LzmaSDKObjCError.h */, + B349AE1B1E9ABCF900ACD416 /* LzmaSDKObjCError.mm */, + B349AE1C1E9ABCF900ACD416 /* LzmaSDKObjCExtern.h */, + B349AE1D1E9ABCF900ACD416 /* LzmaSDKObjCExtern.mm */, + B349AE1E1E9ABCF900ACD416 /* LzmaSDKObjCExtractCallback.h */, + B349AE1F1E9ABCF900ACD416 /* LzmaSDKObjCExtractCallback.mm */, + B349AE201E9ABCF900ACD416 /* LzmaSDKObjCFileDecoder.cpp */, + B349AE211E9ABCF900ACD416 /* LzmaSDKObjCFileDecoder.h */, + B349AE221E9ABCF900ACD416 /* LzmaSDKObjCFileEncoder.cpp */, + B349AE231E9ABCF900ACD416 /* LzmaSDKObjCFileEncoder.h */, + B349AE241E9ABCF900ACD416 /* LzmaSDKObjCInFile.cpp */, + B349AE251E9ABCF900ACD416 /* LzmaSDKObjCInFile.h */, + B349AE261E9ABCF900ACD416 /* LzmaSDKObjCItem+Private.h */, + B349AE271E9ABCF900ACD416 /* LzmaSDKObjCItem.h */, + B349AE281E9ABCF900ACD416 /* LzmaSDKObjCItem.mm */, + B349AE291E9ABCF900ACD416 /* LzmaSDKObjCMutableItem+Private.h */, + B349AE2A1E9ABCF900ACD416 /* LzmaSDKObjCMutableItem.h */, + B349AE2B1E9ABCF900ACD416 /* LzmaSDKObjCMutableItem.mm */, + B349AE2C1E9ABCF900ACD416 /* LzmaSDKObjCOpenCallback.cpp */, + B349AE2D1E9ABCF900ACD416 /* LzmaSDKObjCOpenCallback.h */, + B349AE2E1E9ABCF900ACD416 /* LzmaSDKObjCOutFile.cpp */, + B349AE2F1E9ABCF900ACD416 /* LzmaSDKObjCOutFile.h */, + B349AE301E9ABCF900ACD416 /* LzmaSDKObjCReader.h */, + B349AE311E9ABCF900ACD416 /* LzmaSDKObjCReader.mm */, + B349AE321E9ABCF900ACD416 /* LzmaSDKObjCTypes.h */, + B349AE331E9ABCF900ACD416 /* LzmaSDKObjCUpdateCallback.h */, + B349AE341E9ABCF900ACD416 /* LzmaSDKObjCUpdateCallback.mm */, + B349AE351E9ABCF900ACD416 /* LzmaSDKObjCWriter.h */, + B349AE361E9ABCF900ACD416 /* LzmaSDKObjCWriter.mm */, + ); + path = src; + sourceTree = ""; + }; + B35469351DECD8250018B6F3 /* Atari5200 */ = { + isa = PBXGroup; + children = ( + B35469361DECD8570018B6F3 /* PVAtari5200ControllerViewController.h */, + B35469371DECD8570018B6F3 /* PVAtari5200ControllerViewController.m */, + ); + name = Atari5200; + sourceTree = ""; + }; B36DE7CD1D6B80DA002EE3ED /* Atari7800 */ = { isa = PBXGroup; children = ( @@ -1227,9 +2398,39 @@ name = Atari7800; sourceTree = ""; }; + B39578BF1E6D2D5700854D7A /* PCE */ = { + isa = PBXGroup; + children = ( + B39578C01E6D2D8B00854D7A /* PVPCEControllerViewController.h */, + B39578C11E6D2D8B00854D7A /* PVPCEControllerViewController.m */, + ); + name = PCE; + path = ../..; + sourceTree = ""; + }; + B39578C41E6D4D6700854D7A /* Neo Geo */ = { + isa = PBXGroup; + children = ( + B39578C51E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.h */, + B39578C61E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m */, + ); + name = "Neo Geo"; + sourceTree = ""; + }; + B3CB85C41E9BFB4B009155A6 /* PokeMini */ = { + isa = PBXGroup; + children = ( + B3CB85C51E9BFBA1009155A6 /* PVPokeMiniControllerViewController.h */, + B3CB85C61E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m */, + ); + name = PokeMini; + sourceTree = ""; + }; B3D2E3941D6E8B460058544D /* 32X */ = { isa = PBXGroup; children = ( + B3D2E38F1D6E8B3C0058544D /* PV32XControllerViewController.h */, + B3D2E3901D6E8B3C0058544D /* PV32XControllerViewController.m */, ); name = 32X; sourceTree = ""; @@ -1377,11 +2578,13 @@ ORGANIZATIONNAME = "James Addyman"; TargetAttributes = { 1A3D409317B2DCE4004DFFFC = { - DevelopmentTeam = 63497P68S6; + DevelopmentTeam = V78REPMQFZ; + LastSwiftMigration = 0830; }; 1AD481B31BA350A400FDA50A = { CreatedOnToolsVersion = 7.1; DevelopmentTeam = 63497P68S6; + LastSwiftMigration = 0830; ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { @@ -1431,15 +2634,21 @@ buildActionMask = 2147483647; files = ( 1A3D40A217B2DCE4004DFFFC /* InfoPlist.strings in Resources */, + B349AF4B1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec in Resources */, 1A1F0B6819CC4EB000764BE6 /* Assets.xcassets in Resources */, + B349AF4D1E9ABCF900ACD416 /* LzmaSDKObjC.podspec in Resources */, 1A2B0E8B1AD187F4005FB77C /* testdata.txt in Resources */, 378F4A0D1B63D7CD0065FA39 /* GCDWebUploader.bundle in Resources */, + B349AE371E9ABCF900ACD416 /* .gitignore in Resources */, 7556CF7A19DC15C1007F8F97 /* Default.xib in Resources */, + B349AE391E9ABCF900ACD416 /* .travis.yml in Resources */, 1A9FBE1B1ABD23DD004E778B /* vba-over.ini in Resources */, 1F8D52481D91993000C29F90 /* licenses.html in Resources */, 1AB9600017C5640A00D3E392 /* Provenance.storyboard in Resources */, + B349AE3D1E9ABCF900ACD416 /* LICENSE in Resources */, 377152D61B61D77300BAE15B /* openvgdb.sqlite in Resources */, 1A34C58617D517760058E7D1 /* systems.plist in Resources */, + B349AE3B1E9ABCF900ACD416 /* CHANGELOG in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1447,13 +2656,19 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B349AE381E9ABCF900ACD416 /* .gitignore in Resources */, + B349AF4C1E9ABCF900ACD416 /* LzmaSDK-ObjC.podspec in Resources */, 1AD481D61BA3542D00FDA50A /* GCDWebUploader.bundle in Resources */, 1AD482371BA35A3300FDA50A /* systems.plist in Resources */, + B349AE3A1E9ABCF900ACD416 /* .travis.yml in Resources */, + B349AF4E1E9ABCF900ACD416 /* LzmaSDKObjC.podspec in Resources */, 1AD482381BA35A3500FDA50A /* openvgdb.sqlite in Resources */, + B349AE3E1E9ABCF900ACD416 /* LICENSE in Resources */, 1AD482391BA35A3800FDA50A /* vba-over.ini in Resources */, 1AD481C31BA350A400FDA50A /* TVAssets.xcassets in Resources */, 1AD482361BA35A2D00FDA50A /* Assets.xcassets in Resources */, 1AD481C11BA350A400FDA50A /* Main.storyboard in Resources */, + B349AE3C1E9ABCF900ACD416 /* CHANGELOG in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1542,84 +2757,238 @@ 1A3D40A417B2DCE4004DFFFC /* main.m in Sources */, 1A9FBE231ABD28DA004E778B /* PVGBAControllerViewController.m in Sources */, 1A26EE371AD9FFBF004EA30B /* SSZipArchive.m in Sources */, + B349AEA31E9ABCF900ACD416 /* 7zOut.cpp in Sources */, + B349AEF51E9ABCF900ACD416 /* BranchMisc.cpp in Sources */, + B349AEFF1E9ABCF900ACD416 /* CopyRegister.cpp in Sources */, E41448971B34C4080056D80A /* PViCadeGamepadButtonInput.m in Sources */, + B3CB85C71E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m in Sources */, 1A26EE341AD9FFBF004EA30B /* mztools.c in Sources */, 378F4A001B63D7CD0065FA39 /* GCDWebServer.m in Sources */, + B349AEFB1E9ABCF900ACD416 /* CodecExports.cpp in Sources */, 1A3D40A817B2DCE4004DFFFC /* PVAppDelegate.m in Sources */, + B349AF5D1E9ABCFA00ACD416 /* LzmaSDKObjCExtractCallback.mm in Sources */, + B349AED11E9ABCF900ACD416 /* InOutTempBuffer.cpp in Sources */, + B349AE9F1E9ABCF900ACD416 /* 7zHeader.cpp in Sources */, + B349AE891E9ABCF900ACD416 /* XzCrc64Opt.c in Sources */, + B349AEDD1E9ABCF900ACD416 /* OutBuffer.cpp in Sources */, 1AABE0D01ABE3E5900FF6AEF /* PVGBControllerViewController.m in Sources */, 1A3FD78E1AC7744100F8C23C /* MBProgressHUD.m in Sources */, F432119A1BFB6AB300387909 /* PViCadeSteelSeriesController.m in Sources */, 378F4A071B63D7CD0065FA39 /* GCDWebServerMultiPartFormRequest.m in Sources */, 423BB97F17DD46BC0048F457 /* NSData+Hashing.m in Sources */, + B349AE811E9ABCF900ACD416 /* Sort.c in Sources */, + B349AF3D1E9ABCF900ACD416 /* TextConfig.cpp in Sources */, + B349AF571E9ABCF900ACD416 /* LzmaSDKObjCCommon.cpp in Sources */, + B349AE5D1E9ABCF900ACD416 /* Bra86.c in Sources */, 378F4A031B63D7CD0065FA39 /* GCDWebServerRequest.m in Sources */, E414488E1B3126190056D80A /* PViCadeGamepad.m in Sources */, + B349AF051E9ABCF900ACD416 /* Lzma2Encoder.cpp in Sources */, + B349AEE51E9ABCF900ACD416 /* StreamObjects.cpp in Sources */, + B349AEE91E9ABCF900ACD416 /* UniqBlocks.cpp in Sources */, 42E63AE917E12ECE00FE7098 /* PVSNESControllerViewController.m in Sources */, E41448911B34B9600056D80A /* PViCadeController.m in Sources */, + B35469381DECD8570018B6F3 /* PVAtari5200ControllerViewController.m in Sources */, + B349AF0D1E9ABCF900ACD416 /* LzmaRegister.cpp in Sources */, 378F4A081B63D7CD0065FA39 /* GCDWebServerURLEncodedFormRequest.m in Sources */, + B349AE611E9ABCF900ACD416 /* CpuArch.c in Sources */, + B349AF231E9ABCF900ACD416 /* CRC.cpp in Sources */, + B349AEA91E9ABCF900ACD416 /* 7zSpecStream.cpp in Sources */, + B349AEE11E9ABCF900ACD416 /* PropId.cpp in Sources */, + B349AEDF1E9ABCF900ACD416 /* ProgressUtils.cpp in Sources */, + B349AE551E9ABCF900ACD416 /* Alloc.c in Sources */, 378F4A0A1B63D7CD0065FA39 /* GCDWebServerErrorResponse.m in Sources */, + B349AF1D1E9ABCF900ACD416 /* RandGen.cpp in Sources */, + B349AE651E9ABCF900ACD416 /* LzFind.c in Sources */, 1A3D433B17B30BA3004DFFFC /* PVGLViewController.m in Sources */, + B349AE3F1E9ABCF900ACD416 /* 7zAlloc.c in Sources */, 1A164EB317BC03E800FAC391 /* PVEmulatorViewController.m in Sources */, 1AACCAE91BB615FE00DC21AE /* PVSynchronousURLSession.m in Sources */, + B349AEF11E9ABCF900ACD416 /* BcjCoder.cpp in Sources */, + B349AEB71E9ABCF900ACD416 /* ItemNameUtils.cpp in Sources */, 378F4A0E1B63D7CD0065FA39 /* GCDWebUploader.m in Sources */, + B349AE491E9ABCF900ACD416 /* 7zCrcOpt.c in Sources */, E4F9369D1B50BF3B009403C5 /* PViCadeControllerViewController.m in Sources */, + B349AE431E9ABCF900ACD416 /* 7zBuf.c in Sources */, + B349AF311E9ABCF900ACD416 /* NewHandler.cpp in Sources */, E414488B1B3125D90056D80A /* iCadeReaderView.m in Sources */, + B349AEB11E9ABCF900ACD416 /* DummyOutStream.cpp in Sources */, 42BC83A917E6775E00E9A607 /* PVGameLibrarySectionHeaderView.m in Sources */, + B349AF0F1E9ABCF900ACD416 /* PpmdDecoder.cpp in Sources */, 1A52098C1BADD4F900DAE6E3 /* PVControllerSelectionViewController.m in Sources */, BEB3BDD51E1F3EAD0063E9A9 /* RLMRealmConfiguration+Config.m in Sources */, + B349AF591E9ABCFA00ACD416 /* LzmaSDKObjCError.mm in Sources */, 1A74171D1ABF231500F3CD3C /* PVNESControllerViewController.m in Sources */, + B349AF331E9ABCF900ACD416 /* Sha256Reg.cpp in Sources */, + B349AEFD1E9ABCF900ACD416 /* CopyCoder.cpp in Sources */, + B349AEA71E9ABCF900ACD416 /* 7zRegister.cpp in Sources */, + B349AF131E9ABCF900ACD416 /* PpmdRegister.cpp in Sources */, 1AFA7C9F1D10B06D0058C637 /* PVAppConstants.m in Sources */, + B349AF491E9ABCF900ACD416 /* PropVariantConv.cpp in Sources */, + B349AEAF1E9ABCF900ACD416 /* CoderMixer2.cpp in Sources */, + B349AEDB1E9ABCF900ACD416 /* OffsetStream.cpp in Sources */, 1A47C97B17BC310700C27644 /* JSButton.m in Sources */, + B349AF611E9ABCFA00ACD416 /* LzmaSDKObjCFileEncoder.cpp in Sources */, E41448941B34BBAB0056D80A /* PViCadeReader.m in Sources */, + B349AEE71E9ABCF900ACD416 /* StreamUtils.cpp in Sources */, + B349AF011E9ABCF900ACD416 /* DeltaFilter.cpp in Sources */, + B349AEF91E9ABCF900ACD416 /* ByteSwap.cpp in Sources */, + B349AF171E9ABCF900ACD416 /* 7zAesRegister.cpp in Sources */, + B349AF411E9ABCF900ACD416 /* Wildcard.cpp in Sources */, + B349AEB31E9ABCF900ACD416 /* HandlerOut.cpp in Sources */, + B349AE6D1E9ABCF900ACD416 /* Lzma86Dec.c in Sources */, + B349AF071E9ABCF900ACD416 /* Lzma2Register.cpp in Sources */, 1AECF4AC1966D7A600F8704E /* OESQLiteDatabase.m in Sources */, + B349AEC51E9ABCF900ACD416 /* CreateCoder.cpp in Sources */, + B349AE851E9ABCF900ACD416 /* Xz.c in Sources */, 1A5665091D96A18A006EAE01 /* UIDevice+Hardware.m in Sources */, + B349AF111E9ABCF900ACD416 /* PpmdEncoder.cpp in Sources */, + B349AE671E9ABCF900ACD416 /* LzFindMt.c in Sources */, 378F4A021B63D7CD0065FA39 /* GCDWebServerFunctions.m in Sources */, 1A47C97C17BC310700C27644 /* JSDPad.m in Sources */, + B349AE9D1E9ABCF900ACD416 /* 7zHandlerOut.cpp in Sources */, + B349AF2B1E9ABCF900ACD416 /* MyString.cpp in Sources */, + B349AE971E9ABCF900ACD416 /* 7zExtract.cpp in Sources */, + B349AECF1E9ABCF900ACD416 /* InBuffer.cpp in Sources */, + B349AE531E9ABCF900ACD416 /* AesOpt.c in Sources */, + B349AF6F1E9ABCFA00ACD416 /* LzmaSDKObjCUpdateCallback.mm in Sources */, + B349AEF71E9ABCF900ACD416 /* BranchRegister.cpp in Sources */, 1AB183621AD9BF8000E094F6 /* NSFileManager+Hashing.m in Sources */, + B349AE471E9ABCF900ACD416 /* 7zCrc.c in Sources */, 1AADCDB817BD998A00F53CFE /* UIActionSheet+BlockAdditions.m in Sources */, + B349AECD1E9ABCF900ACD416 /* FilterCoder.cpp in Sources */, + B349AEC71E9ABCF900ACD416 /* CWrappers.cpp in Sources */, 1AADCDB917BD998A00F53CFE /* UIView+FrameAdditions.m in Sources */, + B349AE5B1E9ABCF900ACD416 /* Bra.c in Sources */, + B349AF691E9ABCFA00ACD416 /* LzmaSDKObjCOpenCallback.cpp in Sources */, + B349AE691E9ABCF900ACD416 /* Lzma2Dec.c in Sources */, + B349AEA51E9ABCF900ACD416 /* 7zProperties.cpp in Sources */, + B349AEA11E9ABCF900ACD416 /* 7zIn.cpp in Sources */, + B349AF6B1E9ABCFA00ACD416 /* LzmaSDKObjCOutFile.cpp in Sources */, + B349AE991E9ABCF900ACD416 /* 7zFolderInStream.cpp in Sources */, + B349AE6F1E9ABCF900ACD416 /* Lzma86Enc.c in Sources */, + B349AED51E9ABCF900ACD416 /* LockedStream.cpp in Sources */, + AA9B6EDE1D70981000422E5F /* PVPSXControllerViewController.m in Sources */, + B349AF151E9ABCF900ACD416 /* 7zAes.cpp in Sources */, 378F4A011B63D7CD0065FA39 /* GCDWebServerConnection.m in Sources */, + B349AEB51E9ABCF900ACD416 /* InStreamWithCRC.cpp in Sources */, 378F4A111B63DCF00065FA39 /* PVWebServer.m in Sources */, + B349AF511E9ABCF900ACD416 /* LzmaSDKObjC.mm in Sources */, 378F4A061B63D7CD0065FA39 /* GCDWebServerFileRequest.m in Sources */, + B349AE9B1E9ABCF900ACD416 /* 7zHandler.cpp in Sources */, 378F4A0B1B63D7CD0065FA39 /* GCDWebServerFileResponse.m in Sources */, 1AADCDBA17BD998A00F53CFE /* UIAlertView+BlockAdditions.m in Sources */, 1A26EE351AD9FFBF004EA30B /* unzip.c in Sources */, 1ACD487717BEEABC0053407A /* PVButtonGroupOverlayView.m in Sources */, + B349AEEF1E9ABCF900ACD416 /* Bcj2Register.cpp in Sources */, 1A65D1C619917D55004E1777 /* UIImage+ImageEffects.m in Sources */, + B349AF271E9ABCF900ACD416 /* IntToString.cpp in Sources */, 1A9938A21BBB02590050A2B7 /* PVRecentGame.m in Sources */, + B39578C71E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m in Sources */, 1AB95FFD17C563C200D3E392 /* PVSettingsViewController.m in Sources */, 1AB9600317C572B400D3E392 /* PVSettingsModel.m in Sources */, + B349AECB1E9ABCF900ACD416 /* FileStreams.cpp in Sources */, 25A64E171CB1C41100EDD19D /* UIImage+Color.m in Sources */, + B349AF031E9ABCF900ACD416 /* Lzma2Decoder.cpp in Sources */, + B349AF631E9ABCFA00ACD416 /* LzmaSDKObjCInFile.cpp in Sources */, + B349AEAD1E9ABCF900ACD416 /* ArchiveExports.cpp in Sources */, 1A48697417C8C0DE0019F6D2 /* PVDirectoryWatcher.m in Sources */, 1A26EE361AD9FFBF004EA30B /* zip.c in Sources */, + B349AF5B1E9ABCFA00ACD416 /* LzmaSDKObjCExtern.mm in Sources */, + B349AE871E9ABCF900ACD416 /* XzCrc64.c in Sources */, + B349AF531E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp in Sources */, 378F4A041B63D7CD0065FA39 /* GCDWebServerResponse.m in Sources */, + B349AF2D1E9ABCF900ACD416 /* MyVector.cpp in Sources */, + B349AE8F1E9ABCF900ACD416 /* XzIn.c in Sources */, + B349AF471E9ABCF900ACD416 /* PropVariant.cpp in Sources */, E414489A1B34C48D0056D80A /* PViCadeGamepadDirectionPad.m in Sources */, + B328937D1E0B87960090B97A /* PVVBControllerViewController.m in Sources */, + B349AEED1E9ABCF900ACD416 /* Bcj2Coder.cpp in Sources */, + B349AED91E9ABCF900ACD416 /* MethodProps.cpp in Sources */, 1A48697517C8C0DE0019F6D2 /* PVGameLibraryViewController.m in Sources */, + B349AE711E9ABCF900ACD416 /* LzmaDec.c in Sources */, B36DE7CA1D6B80CA002EE3ED /* PVAtari7800ControllerViewController.m in Sources */, 1A48697617C8C0DE0019F6D2 /* PVGameLibraryCollectionViewCell.m in Sources */, + B349AEE31E9ABCF900ACD416 /* StreamBinder.cpp in Sources */, + B349AE7D1E9ABCF900ACD416 /* Ppmd7Enc.c in Sources */, 1A48697717C8C0DE0019F6D2 /* PVGame.m in Sources */, 378F4A051B63D7CD0065FA39 /* GCDWebServerDataRequest.m in Sources */, + B349AE751E9ABCF900ACD416 /* LzmaLib.c in Sources */, E4F936A01B50C95E009403C5 /* kICadeControllerSetting.m in Sources */, 1A9442571AD9A7AA008B32D4 /* NSDate+NSDate_SignificantDates.m in Sources */, + B349AE631E9ABCF900ACD416 /* Delta.c in Sources */, 42E63F0617DE78AB005802B0 /* UIImage+Scaling.m in Sources */, + B349AF1F1E9ABCF900ACD416 /* C_FileIO.cpp in Sources */, + B349AF0B1E9ABCF900ACD416 /* LzmaEncoder.cpp in Sources */, + B349AF3B1E9ABCF900ACD416 /* StringToInt.cpp in Sources */, + B349AF711E9ABCFA00ACD416 /* LzmaSDKObjCWriter.mm in Sources */, + B349AF391E9ABCF900ACD416 /* StringConvert.cpp in Sources */, 1F8D52461D9198E000C29F90 /* PVLicensesViewController.m in Sources */, + B349AF2F1E9ABCF900ACD416 /* MyWindows.cpp in Sources */, + B349AEBD1E9ABCF900ACD416 /* ParseProperties.cpp in Sources */, + B349AEAB1E9ABCF900ACD416 /* 7zUpdate.cpp in Sources */, + B349AEBF1E9ABCF900ACD416 /* DllExports2.cpp in Sources */, + B349AE8B1E9ABCF900ACD416 /* XzDec.c in Sources */, + B349AE411E9ABCF900ACD416 /* 7zArcIn.c in Sources */, + B349AE4B1E9ABCF900ACD416 /* 7zDec.c in Sources */, + B349AEB91E9ABCF900ACD416 /* MultiStream.cpp in Sources */, + B349AED71E9ABCF900ACD416 /* MethodId.cpp in Sources */, + B349AED31E9ABCF900ACD416 /* LimitedStreams.cpp in Sources */, + B349AE911E9ABCF900ACD416 /* 7zCompressionMode.cpp in Sources */, 1A48697817C8C0DE0019F6D2 /* PVMediaCache.m in Sources */, + B349AF6D1E9ABCFA00ACD416 /* LzmaSDKObjCReader.mm in Sources */, + B349AE571E9ABCF900ACD416 /* Bcj2.c in Sources */, + B349AE5F1E9ABCF900ACD416 /* BraIA64.c in Sources */, 1A48698317C8C1170019F6D2 /* NSString+Hashing.m in Sources */, + B349AE731E9ABCF900ACD416 /* LzmaEnc.c in Sources */, 1A34C58A17D53C9B0058E7D1 /* PVEmulatorConfiguration.m in Sources */, + B349AEC31E9ABCF900ACD416 /* SplitHandler.cpp in Sources */, + B349AEBB1E9ABCF900ACD416 /* OutStreamWithCRC.cpp in Sources */, + B32893731E0B250B0090B97A /* PVWonderSwanControllerViewController.m in Sources */, + B349AEC11E9ABCF900ACD416 /* LzmaHandler.cpp in Sources */, + B349AE511E9ABCF900ACD416 /* Aes.c in Sources */, BE1E26671C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */, - 1AD9AA301ACC871F00EC87A0 /* PVGameImporter.m in Sources */, + B32893781E0B4EA30090B97A /* PVLynxControllerViewController.m in Sources */, + B349AE791E9ABCF900ACD416 /* Ppmd7.c in Sources */, + B349AE4F1E9ABCF900ACD416 /* 7zStream.c in Sources */, 1A4850BB1AE1A6C500F7EF2E /* PVConflictViewController.m in Sources */, + B349AF091E9ABCF900ACD416 /* LzmaDecoder.cpp in Sources */, + B349AF1B1E9ABCF900ACD416 /* MyAesReg.cpp in Sources */, + B349AF5F1E9ABCFA00ACD416 /* LzmaSDKObjCFileDecoder.cpp in Sources */, 378F4A151B63F2240065FA39 /* Reachability.m in Sources */, 1A5209881BADCBB500DAE6E3 /* PVControllerManager.m in Sources */, + B349AE591E9ABCF900ACD416 /* Bcj2Enc.c in Sources */, 1FB125961D93E57F00D045D0 /* PVAppearanceViewController.m in Sources */, + B349AE4D1E9ABCF900ACD416 /* 7zFile.c in Sources */, 1A9647B117D6864300A55612 /* PVControllerViewController.m in Sources */, + B349AE7F1E9ABCF900ACD416 /* Sha256.c in Sources */, + B349AE931E9ABCF900ACD416 /* 7zDecode.cpp in Sources */, + B349AEF31E9ABCF900ACD416 /* BcjRegister.cpp in Sources */, E414489D1B34C4E50056D80A /* PViCadeInputAxis.m in Sources */, + B349AF671E9ABCFA00ACD416 /* LzmaSDKObjCMutableItem.mm in Sources */, + B349AE831E9ABCF900ACD416 /* Threads.c in Sources */, + B349AF551E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm in Sources */, 1ADB316517D9341600DB6043 /* PVGenesisControllerViewController.m in Sources */, B3DF87651D6A5A5300D216D4 /* PVStellaControllerViewController.m in Sources */, + B349AF3F1E9ABCF900ACD416 /* UTFConvert.cpp in Sources */, 378F4A091B63D7CD0065FA39 /* GCDWebServerDataResponse.m in Sources */, + B349AE6B1E9ABCF900ACD416 /* Lzma2Enc.c in Sources */, + B349AF251E9ABCF900ACD416 /* CrcReg.cpp in Sources */, + B349AF211E9ABCF900ACD416 /* CommandLineParser.cpp in Sources */, 378F4A0C1B63D7CD0065FA39 /* GCDWebServerStreamedResponse.m in Sources */, + B349AE771E9ABCF900ACD416 /* MtCoder.c in Sources */, E4F9369A1B50829F009403C5 /* PViCade8BitdoController.m in Sources */, + B349AE8D1E9ABCF900ACD416 /* XzEnc.c in Sources */, 1A26EE331AD9FFBF004EA30B /* ioapi.c in Sources */, B3D2E3911D6E8B3C0058544D /* PV32XControllerViewController.m in Sources */, + B349AE951E9ABCF900ACD416 /* 7zEncode.cpp in Sources */, + B349AF431E9ABCF900ACD416 /* XzCrc64Reg.cpp in Sources */, + B3C0EE4A1EA853A600C6414C /* PVGameImporter.m in Sources */, + B39578C21E6D2D8B00854D7A /* PVPCEControllerViewController.m in Sources */, + B349AEEB1E9ABCF900ACD416 /* VirtThread.cpp in Sources */, + B349AF651E9ABCFA00ACD416 /* LzmaSDKObjCItem.mm in Sources */, + B349AE451E9ABCF900ACD416 /* 7zBuf2.c in Sources */, + B349AF191E9ABCF900ACD416 /* MyAes.cpp in Sources */, + B349AE7B1E9ABCF900ACD416 /* Ppmd7Dec.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1629,84 +2998,238 @@ files = ( 1FE10F291D94ECC600A20D1A /* PVAppearanceViewController.m in Sources */, 1AD481FF1BA354B100FDA50A /* PViCadeGamepadDirectionPad.m in Sources */, + B349AEFA1E9ABCF900ACD416 /* ByteSwap.cpp in Sources */, 1AD481CF1BA3540000FDA50A /* PVGameLibraryCollectionViewCell.m in Sources */, + B349AF241E9ABCF900ACD416 /* CRC.cpp in Sources */, + B349AF681E9ABCFA00ACD416 /* LzmaSDKObjCMutableItem.mm in Sources */, 1AD481F81BA354B100FDA50A /* PViCadeControllerViewController.m in Sources */, 1AD482061BA354C400FDA50A /* PVGBControllerViewController.m in Sources */, 1AD481E61BA3546A00FDA50A /* PVEmulatorConfiguration.m in Sources */, 1AD482021BA354B100FDA50A /* PVControllerViewController.m in Sources */, 1AD481F31BA3549700FDA50A /* NSFileManager+Hashing.m in Sources */, + B3CB85C81E9BFBA1009155A6 /* PVPokeMiniControllerViewController.m in Sources */, + B349AF5C1E9ABCFA00ACD416 /* LzmaSDKObjCExtern.mm in Sources */, + B349AE721E9ABCF900ACD416 /* LzmaDec.c in Sources */, + B349AF161E9ABCF900ACD416 /* 7zAes.cpp in Sources */, + B349AF581E9ABCFA00ACD416 /* LzmaSDKObjCCommon.cpp in Sources */, + B349AE4E1E9ABCF900ACD416 /* 7zFile.c in Sources */, 1AD481E51BA3546600FDA50A /* PVGLViewController.m in Sources */, + B349AF641E9ABCFA00ACD416 /* LzmaSDKObjCInFile.cpp in Sources */, + B349AE8C1E9ABCF900ACD416 /* XzDec.c in Sources */, + B349AEAC1E9ABCF900ACD416 /* 7zUpdate.cpp in Sources */, 1AD481CA1BA353F300FDA50A /* OESQLiteDatabase.m in Sources */, + B349AE681E9ABCF900ACD416 /* LzFindMt.c in Sources */, + B349AEA41E9ABCF900ACD416 /* 7zOut.cpp in Sources */, + B349AE481E9ABCF900ACD416 /* 7zCrc.c in Sources */, + B349AECE1E9ABCF900ACD416 /* FilterCoder.cpp in Sources */, 1A2B13CD1D0DFF5100D0B863 /* PVSearchViewController.m in Sources */, 1AD481EB1BA3547E00FDA50A /* mztools.c in Sources */, + B349AF061E9ABCF900ACD416 /* Lzma2Encoder.cpp in Sources */, + B349AE541E9ABCF900ACD416 /* AesOpt.c in Sources */, 1AD481DC1BA3544500FDA50A /* GCDWebServerDataRequest.m in Sources */, 1AD481FB1BA354B100FDA50A /* PViCadeController.m in Sources */, + B349AF301E9ABCF900ACD416 /* MyWindows.cpp in Sources */, + B349AEBC1E9ABCF900ACD416 /* OutStreamWithCRC.cpp in Sources */, + B349AF201E9ABCF900ACD416 /* C_FileIO.cpp in Sources */, + B349AEC81E9ABCF900ACD416 /* CWrappers.cpp in Sources */, 1AD481E41BA3546400FDA50A /* PVEmulatorViewController.m in Sources */, + B349AEAE1E9ABCF900ACD416 /* ArchiveExports.cpp in Sources */, B36DE7CB1D6B80D3002EE3ED /* PVAtari7800ControllerViewController.m in Sources */, + B35469391DECD8570018B6F3 /* PVAtari5200ControllerViewController.m in Sources */, + B349AF481E9ABCF900ACD416 /* PropVariant.cpp in Sources */, + B349AE601E9ABCF900ACD416 /* BraIA64.c in Sources */, + B349AEEC1E9ABCF900ACD416 /* VirtThread.cpp in Sources */, 1AD481EE1BA3548800FDA50A /* MBProgressHUD.m in Sources */, + B349AE661E9ABCF900ACD416 /* LzFind.c in Sources */, + B349AF3C1E9ABCF900ACD416 /* StringToInt.cpp in Sources */, + B349AE5C1E9ABCF900ACD416 /* Bra.c in Sources */, + B349AF661E9ABCFA00ACD416 /* LzmaSDKObjCItem.mm in Sources */, 1AD481F01BA3548E00FDA50A /* UIView+FrameAdditions.m in Sources */, + B349AECC1E9ABCF900ACD416 /* FileStreams.cpp in Sources */, + B349AF6C1E9ABCFA00ACD416 /* LzmaSDKObjCOutFile.cpp in Sources */, + B349AF701E9ABCFA00ACD416 /* LzmaSDKObjCUpdateCallback.mm in Sources */, + B349AF3A1E9ABCF900ACD416 /* StringConvert.cpp in Sources */, + B349AEC21E9ABCF900ACD416 /* LzmaHandler.cpp in Sources */, + B349AF2C1E9ABCF900ACD416 /* MyString.cpp in Sources */, 1A1A83D01C0A1675008ED0EC /* PViCadeSteelSeriesController.m in Sources */, - 1AD481CD1BA353FC00FDA50A /* PVGameImporter.m in Sources */, + B349AF0C1E9ABCF900ACD416 /* LzmaEncoder.cpp in Sources */, + B349AE461E9ABCF900ACD416 /* 7zBuf2.c in Sources */, BEB41B3B1CAB01D6009E0B7E /* PVGame+Sizing.m in Sources */, + B349AEDC1E9ABCF900ACD416 /* OffsetStream.cpp in Sources */, + B349AE981E9ABCF900ACD416 /* 7zExtract.cpp in Sources */, + AA9B6EDF1D70981000422E5F /* PVPSXControllerViewController.m in Sources */, + B349AF281E9ABCF900ACD416 /* IntToString.cpp in Sources */, + B349AE401E9ABCF900ACD416 /* 7zAlloc.c in Sources */, + B349AE701E9ABCF900ACD416 /* Lzma86Enc.c in Sources */, 1AD481FE1BA354B100FDA50A /* PViCadeGamepadButtonInput.m in Sources */, 1AD481C91BA3530B00FDA50A /* PVAppDelegate.m in Sources */, 1AD481CE1BA353FE00FDA50A /* PVGameLibraryViewController.m in Sources */, B3D2E3921D6E8B3C0058544D /* PV32XControllerViewController.m in Sources */, + B349AEA81E9ABCF900ACD416 /* 7zRegister.cpp in Sources */, 1AACCAEA1BB615FE00DC21AE /* PVSynchronousURLSession.m in Sources */, + B349AE9A1E9ABCF900ACD416 /* 7zFolderInStream.cpp in Sources */, 1AD481FD1BA354B100FDA50A /* PViCadeReader.m in Sources */, + B349AE901E9ABCF900ACD416 /* XzIn.c in Sources */, + B349AEEA1E9ABCF900ACD416 /* UniqBlocks.cpp in Sources */, + B349AE6E1E9ABCF900ACD416 /* Lzma86Dec.c in Sources */, + B349AF541E9ABCF900ACD416 /* LzmaSDKObjCBaseCoder.cpp in Sources */, + B349AE421E9ABCF900ACD416 /* 7zArcIn.c in Sources */, 1AD482011BA354B100FDA50A /* kICadeControllerSetting.m in Sources */, + B349AF1E1E9ABCF900ACD416 /* RandGen.cpp in Sources */, + B349AEE81E9ABCF900ACD416 /* StreamUtils.cpp in Sources */, + B39578C81E6D4DC200854D7A /* PVNeoGeoPocketControllerViewController.m in Sources */, + B349AE4A1E9ABCF900ACD416 /* 7zCrcOpt.c in Sources */, + B349AE9C1E9ABCF900ACD416 /* 7zHandler.cpp in Sources */, + B349AF601E9ABCFA00ACD416 /* LzmaSDKObjCFileDecoder.cpp in Sources */, 1AD481E31BA3545D00FDA50A /* GCDWebServerStreamedResponse.m in Sources */, 1AD482071BA354C400FDA50A /* PVNESControllerViewController.m in Sources */, 1ACE9A0A1BACBC9E00C72AA5 /* PVTVSettingsViewController.m in Sources */, 1AD481CC1BA353F900FDA50A /* PVDirectoryWatcher.m in Sources */, 1AD481ED1BA3548400FDA50A /* zip.c in Sources */, + B349AE6C1E9ABCF900ACD416 /* Lzma2Enc.c in Sources */, + B349AF6A1E9ABCFA00ACD416 /* LzmaSDKObjCOpenCallback.cpp in Sources */, 1AD481D81BA3543700FDA50A /* GCDWebServerConnection.m in Sources */, + B349AE801E9ABCF900ACD416 /* Sha256.c in Sources */, + B349AE441E9ABCF900ACD416 /* 7zBuf.c in Sources */, + B349AE5E1E9ABCF900ACD416 /* Bra86.c in Sources */, + B349AF261E9ABCF900ACD416 /* CrcReg.cpp in Sources */, + B349AEA01E9ABCF900ACD416 /* 7zHeader.cpp in Sources */, + B349AEF21E9ABCF900ACD416 /* BcjCoder.cpp in Sources */, 1A5209891BADCBB500DAE6E3 /* PVControllerManager.m in Sources */, 1AD482001BA354B100FDA50A /* PViCadeInputAxis.m in Sources */, + B349AF441E9ABCF900ACD416 /* XzCrc64Reg.cpp in Sources */, + B349AF721E9ABCFA00ACD416 /* LzmaSDKObjCWriter.mm in Sources */, 1AD481D11BA3540600FDA50A /* PVConflictViewController.m in Sources */, 1AD482031BA354C400FDA50A /* PVGenesisControllerViewController.m in Sources */, + B349AE7E1E9ABCF900ACD416 /* Ppmd7Enc.c in Sources */, + B349AF5E1E9ABCFA00ACD416 /* LzmaSDKObjCExtractCallback.mm in Sources */, + B349AEB01E9ABCF900ACD416 /* CoderMixer2.cpp in Sources */, + B349AEA21E9ABCF900ACD416 /* 7zIn.cpp in Sources */, 1AD481E21BA3545B00FDA50A /* GCDWebServerFileResponse.m in Sources */, + B349AEE21E9ABCF900ACD416 /* PropId.cpp in Sources */, + B349AE521E9ABCF900ACD416 /* Aes.c in Sources */, + B349AF021E9ABCF900ACD416 /* DeltaFilter.cpp in Sources */, 1AD481F91BA354B100FDA50A /* iCadeReaderView.m in Sources */, 1AD481F21BA3549400FDA50A /* NSString+Hashing.m in Sources */, + B349AE921E9ABCF900ACD416 /* 7zCompressionMode.cpp in Sources */, 1AD481E01BA3545400FDA50A /* GCDWebServerDataResponse.m in Sources */, + B349AF121E9ABCF900ACD416 /* PpmdEncoder.cpp in Sources */, 1AD482081BA354C400FDA50A /* PVButtonGroupOverlayView.m in Sources */, + B349AE8A1E9ABCF900ACD416 /* XzCrc64Opt.c in Sources */, 1AD481D41BA3542200FDA50A /* PVWebServer.m in Sources */, + B349AEBA1E9ABCF900ACD416 /* MultiStream.cpp in Sources */, 1AD4820A1BA354C400FDA50A /* JSDPad.m in Sources */, + B349AF521E9ABCF900ACD416 /* LzmaSDKObjC.mm in Sources */, + B349AF0E1E9ABCF900ACD416 /* LzmaRegister.cpp in Sources */, 1AD481E11BA3545800FDA50A /* GCDWebServerErrorResponse.m in Sources */, 1AD481F71BA354A200FDA50A /* NSDate+NSDate_SignificantDates.m in Sources */, 1AD482091BA354C400FDA50A /* JSButton.m in Sources */, + B349AF001E9ABCF900ACD416 /* CopyRegister.cpp in Sources */, + B349AE761E9ABCF900ACD416 /* LzmaLib.c in Sources */, + B349AF221E9ABCF900ACD416 /* CommandLineParser.cpp in Sources */, + B349AEE41E9ABCF900ACD416 /* StreamBinder.cpp in Sources */, + B349AF1C1E9ABCF900ACD416 /* MyAesReg.cpp in Sources */, + B349AEDA1E9ABCF900ACD416 /* MethodProps.cpp in Sources */, + B349AF3E1E9ABCF900ACD416 /* TextConfig.cpp in Sources */, + B349AEEE1E9ABCF900ACD416 /* Bcj2Coder.cpp in Sources */, + B349AEF41E9ABCF900ACD416 /* BcjRegister.cpp in Sources */, + B349AEB61E9ABCF900ACD416 /* InStreamWithCRC.cpp in Sources */, + B349AE941E9ABCF900ACD416 /* 7zDecode.cpp in Sources */, 1AD482051BA354C400FDA50A /* PVGBAControllerViewController.m in Sources */, + B349AF321E9ABCF900ACD416 /* NewHandler.cpp in Sources */, 1AD481EC1BA3548200FDA50A /* unzip.c in Sources */, + B349AE841E9ABCF900ACD416 /* Threads.c in Sources */, + B349AE741E9ABCF900ACD416 /* LzmaEnc.c in Sources */, + B349AEC61E9ABCF900ACD416 /* CreateCoder.cpp in Sources */, 1AD481D71BA3543500FDA50A /* GCDWebServer.m in Sources */, + B349AEAA1E9ABCF900ACD416 /* 7zSpecStream.cpp in Sources */, + B349AF561E9ABCF900ACD416 /* LzmaSDKObjCBufferProcessor.mm in Sources */, B3DF87661D6A5A5300D216D4 /* PVStellaControllerViewController.m in Sources */, + B349AEE61E9ABCF900ACD416 /* StreamObjects.cpp in Sources */, 1AD481FC1BA354B100FDA50A /* PViCade8BitdoController.m in Sources */, + B328937E1E0B87960090B97A /* PVVBControllerViewController.m in Sources */, 1AD481F51BA3549C00FDA50A /* UIImage+Scaling.m in Sources */, + B349AF401E9ABCF900ACD416 /* UTFConvert.cpp in Sources */, + B349AE861E9ABCF900ACD416 /* Xz.c in Sources */, + B349AEA61E9ABCF900ACD416 /* 7zProperties.cpp in Sources */, + B349AE7C1E9ABCF900ACD416 /* Ppmd7Dec.c in Sources */, + B349AE501E9ABCF900ACD416 /* 7zStream.c in Sources */, + B349AEC01E9ABCF900ACD416 /* DllExports2.cpp in Sources */, + B349AE8E1E9ABCF900ACD416 /* XzEnc.c in Sources */, + B349AED81E9ABCF900ACD416 /* MethodId.cpp in Sources */, + B349AF1A1E9ABCF900ACD416 /* MyAes.cpp in Sources */, + B349AF181E9ABCF900ACD416 /* 7zAesRegister.cpp in Sources */, + B349AE581E9ABCF900ACD416 /* Bcj2.c in Sources */, + B349AF0A1E9ABCF900ACD416 /* LzmaDecoder.cpp in Sources */, + B349AEB21E9ABCF900ACD416 /* DummyOutStream.cpp in Sources */, + B349AED61E9ABCF900ACD416 /* LockedStream.cpp in Sources */, 1AD481DE1BA3544A00FDA50A /* GCDWebServerMultiPartFormRequest.m in Sources */, 1AD481DA1BA3543E00FDA50A /* GCDWebServerRequest.m in Sources */, + B349AEFC1E9ABCF900ACD416 /* CodecExports.cpp in Sources */, + B39578C31E6D2D8B00854D7A /* PVPCEControllerViewController.m in Sources */, + B349AEF61E9ABCF900ACD416 /* BranchMisc.cpp in Sources */, + B349AE5A1E9ABCF900ACD416 /* Bcj2Enc.c in Sources */, + B349AE6A1E9ABCF900ACD416 /* Lzma2Dec.c in Sources */, + B349AEB41E9ABCF900ACD416 /* HandlerOut.cpp in Sources */, + B349AEDE1E9ABCF900ACD416 /* OutBuffer.cpp in Sources */, + B349AEE01E9ABCF900ACD416 /* ProgressUtils.cpp in Sources */, 1AD481E81BA3547200FDA50A /* PVSettingsModel.m in Sources */, + B349AF421E9ABCF900ACD416 /* Wildcard.cpp in Sources */, + B349AEF81E9ABCF900ACD416 /* BranchRegister.cpp in Sources */, 1AD481DF1BA3544D00FDA50A /* GCDWebServerURLEncodedFormRequest.m in Sources */, + B349AE961E9ABCF900ACD416 /* 7zEncode.cpp in Sources */, 1AD481D21BA3540900FDA50A /* PVGame.m in Sources */, + B349AE4C1E9ABCF900ACD416 /* 7zDec.c in Sources */, 1AD481DB1BA3544100FDA50A /* GCDWebServerResponse.m in Sources */, + B349AEFE1E9ABCF900ACD416 /* CopyCoder.cpp in Sources */, 1AD482041BA354C400FDA50A /* PVSNESControllerViewController.m in Sources */, + B349AE641E9ABCF900ACD416 /* Delta.c in Sources */, + B349AF6E1E9ABCFA00ACD416 /* LzmaSDKObjCReader.mm in Sources */, + B349AE781E9ABCF900ACD416 /* MtCoder.c in Sources */, 1AD481B81BA350A400FDA50A /* main.m in Sources */, 1AD481CB1BA353F600FDA50A /* PVMediaCache.m in Sources */, + B349AF101E9ABCF900ACD416 /* PpmdDecoder.cpp in Sources */, 1A52098D1BADD4F900DAE6E3 /* PVControllerSelectionViewController.m in Sources */, + B349AEF01E9ABCF900ACD416 /* Bcj2Register.cpp in Sources */, + B349AEBE1E9ABCF900ACD416 /* ParseProperties.cpp in Sources */, BEC075CD1C221F3A00305027 /* RLMRealmConfiguration+Config.m in Sources */, + B32893741E0B250B0090B97A /* PVWonderSwanControllerViewController.m in Sources */, 1AD481D51BA3542A00FDA50A /* GCDWebUploader.m in Sources */, + B3C0EE4B1EA853A700C6414C /* PVGameImporter.m in Sources */, + B32893791E0B4EA30090B97A /* PVLynxControllerViewController.m in Sources */, BE1E26681C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */, + B349AED01E9ABCF900ACD416 /* InBuffer.cpp in Sources */, + B349AE821E9ABCF900ACD416 /* Sort.c in Sources */, 25A64E181CB1C57900EDD19D /* UIImage+Color.m in Sources */, 1AD481F61BA3549F00FDA50A /* UIImage+ImageEffects.m in Sources */, + B349AE7A1E9ABCF900ACD416 /* Ppmd7.c in Sources */, + B349AF081E9ABCF900ACD416 /* Lzma2Register.cpp in Sources */, 1AD481FA1BA354B100FDA50A /* PViCadeGamepad.m in Sources */, + B349AF621E9ABCFA00ACD416 /* LzmaSDKObjCFileEncoder.cpp in Sources */, + B349AED41E9ABCF900ACD416 /* LimitedStreams.cpp in Sources */, + B349AF4A1E9ABCF900ACD416 /* PropVariantConv.cpp in Sources */, + B349AED21E9ABCF900ACD416 /* InOutTempBuffer.cpp in Sources */, + B349AE621E9ABCF900ACD416 /* CpuArch.c in Sources */, 1AD481DD1BA3544800FDA50A /* GCDWebServerFileRequest.m in Sources */, + B349AEC41E9ABCF900ACD416 /* SplitHandler.cpp in Sources */, 1AD481D31BA3541E00FDA50A /* Reachability.m in Sources */, 1A9938A31BBB02590050A2B7 /* PVRecentGame.m in Sources */, BE1E266D1C22552800499BA0 /* PVAppConstants.m in Sources */, 1AD481F41BA3549A00FDA50A /* NSData+Hashing.m in Sources */, + B349AE9E1E9ABCF900ACD416 /* 7zHandlerOut.cpp in Sources */, 1AACCAED1BB61D5600DC21AE /* PVTVSplitViewController.m in Sources */, + B349AF2E1E9ABCF900ACD416 /* MyVector.cpp in Sources */, + B349AF5A1E9ABCFA00ACD416 /* LzmaSDKObjCError.mm in Sources */, + B349AE881E9ABCF900ACD416 /* XzCrc64.c in Sources */, 1AD481D91BA3543B00FDA50A /* GCDWebServerFunctions.m in Sources */, + B349AF141E9ABCF900ACD416 /* PpmdRegister.cpp in Sources */, 1AD481D01BA3540300FDA50A /* PVGameLibrarySectionHeaderView.m in Sources */, + B349AF341E9ABCF900ACD416 /* Sha256Reg.cpp in Sources */, + B349AEB81E9ABCF900ACD416 /* ItemNameUtils.cpp in Sources */, 1AD481EA1BA3547B00FDA50A /* ioapi.c in Sources */, 1AD481E91BA3547800FDA50A /* SSZipArchive.m in Sources */, + B349AE561E9ABCF900ACD416 /* Alloc.c in Sources */, + B349AF041E9ABCF900ACD416 /* Lzma2Decoder.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1714,21 +3237,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BE1E26691C2252CA00499BA0 /* PVEmulatorConstants.m in Sources */, 1AD9AA3A1ACC988F00EC87A0 /* Provenance_Tests.m in Sources */, - 1AD9AA481ACC99C900EC87A0 /* PVSNESControllerViewController.m in Sources */, - 1AD9AA441ACC999000EC87A0 /* PVGameImporter.m in Sources */, - B3DF87671D6A5A5C00D216D4 /* PVStellaControllerViewController.m in Sources */, 1AD9AA431ACC98F500EC87A0 /* PVGameImporterTests.m in Sources */, - 1AD9AA471ACC99BD00EC87A0 /* PVGenesisControllerViewController.m in Sources */, - B3D2E3931D6E8B3C0058544D /* PV32XControllerViewController.m in Sources */, - B36DE7CC1D6B80D4002EE3ED /* PVAtari7800ControllerViewController.m in Sources */, - 1AD9AA491ACC99C900EC87A0 /* PVGBAControllerViewController.m in Sources */, - 1A2B0E881AD1842A005FB77C /* NSData+Hashing.m in Sources */, - 1AD9AA461ACC99B900EC87A0 /* PVControllerViewController.m in Sources */, - 1AD9AA451ACC999700EC87A0 /* PVEmulatorConfiguration.m in Sources */, - 1AD9AA4A1ACC99C900EC87A0 /* PVGBControllerViewController.m in Sources */, - 1AD9AA4B1ACC99C900EC87A0 /* PVNESControllerViewController.m in Sources */, + B32D8F7D1EA7F79900175FBF /* PVEmulatorConfigurationTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1876,7 +3387,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 63497P68S6; + DEVELOPMENT_TEAM = V78REPMQFZ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", @@ -1900,6 +3411,8 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.provenance-emu.provenance"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = NO; WARNING_LDFLAGS = ""; @@ -1915,7 +3428,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 63497P68S6; + DEVELOPMENT_TEAM = V78REPMQFZ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", @@ -1940,6 +3453,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.provenance-emu.provenance"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = NO; WARNING_LDFLAGS = ""; @@ -1992,6 +3506,8 @@ PRODUCT_NAME = Provenance; PROVISIONING_PROFILE = ""; SDKROOT = appletvos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; }; @@ -2044,6 +3560,7 @@ PRODUCT_NAME = Provenance; PROVISIONING_PROFILE = ""; SDKROOT = appletvos; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; }; @@ -2096,6 +3613,7 @@ PRODUCT_NAME = Provenance; PROVISIONING_PROFILE = ""; SDKROOT = appletvos; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; }; @@ -2307,7 +3825,7 @@ CLANG_ENABLE_OBJC_ARC = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 63497P68S6; + DEVELOPMENT_TEAM = V78REPMQFZ; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", @@ -2332,6 +3850,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.provenance-emu.provenance"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = NO; WARNING_LDFLAGS = ""; diff --git a/Provenance.xcodeproj/xcshareddata/xcschemes/Provenance.xcscheme b/Provenance.xcodeproj/xcshareddata/xcschemes/Provenance.xcscheme index 5037327aa1..6bb0ae0fe6 100644 --- a/Provenance.xcodeproj/xcshareddata/xcschemes/Provenance.xcscheme +++ b/Provenance.xcodeproj/xcshareddata/xcschemes/Provenance.xcscheme @@ -90,6 +90,20 @@ ReferencedContainer = "container:PVNES/PVNES.xcodeproj"> + + + + + + + + + + + + @@ -25,6 +31,9 @@ + + diff --git a/Provenance.xcworkspace/xcshareddata/Provenance.xcscmblueprint b/Provenance.xcworkspace/xcshareddata/Provenance.xcscmblueprint new file mode 100644 index 0000000000..a766c921b0 --- /dev/null +++ b/Provenance.xcworkspace/xcshareddata/Provenance.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "9BFB396087D0BDD1A8684EEE49B51DFD3A478D5C", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "9BFB396087D0BDD1A8684EEE49B51DFD3A478D5C" : 0, + "B3DAFA4E8DC41169A7FC9D30D8420929A5ED0B16" : 9223372036854775807 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "03DB5459-2398-4B60-A32B-86D2E12A6302", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "9BFB396087D0BDD1A8684EEE49B51DFD3A478D5C" : "Provenance-jmattiello\/", + "B3DAFA4E8DC41169A7FC9D30D8420929A5ED0B16" : "OpenEmu\/" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "Provenance", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Provenance.xcworkspace", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "ssh:\/\/github.com\/jasarien\/Provenance.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "9BFB396087D0BDD1A8684EEE49B51DFD3A478D5C" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/OpenEmu\/OpenEmu.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "B3DAFA4E8DC41169A7FC9D30D8420929A5ED0B16" + } + ] +} \ No newline at end of file diff --git a/Provenance/Categories/PVGame+Sizing.m b/Provenance/Categories/PVGame+Sizing.m index bd3369da10..eda0bbe7da 100644 --- a/Provenance/Categories/PVGame+Sizing.m +++ b/Provenance/Categories/PVGame+Sizing.m @@ -23,7 +23,13 @@ - (CGFloat)boxartAspectRatio imageAspectRatio = PVGameBoxArtAspectRatioWide; } else if ([self.systemIdentifier isEqualToString:PVNESSystemIdentifier] || - [self.systemIdentifier isEqualToString:PVGenesisSystemIdentifier]) { + [self.systemIdentifier isEqualToString:PVGenesisSystemIdentifier] || + [self.systemIdentifier isEqualToString:PV32XSystemIdentifier] || + [self.systemIdentifier isEqualToString:PV2600SystemIdentifier] || + [self.systemIdentifier isEqualToString:PV5200SystemIdentifier] || + [self.systemIdentifier isEqualToString:PV7800SystemIdentifier] || + [self.systemIdentifier isEqualToString:PVWonderSwanSystemIdentifier]) + { imageAspectRatio = PVGameBoxArtAspectRatioTall; } diff --git a/Provenance/Controller/PVAtari5200ControllerViewController.h b/Provenance/Controller/PVAtari5200ControllerViewController.h new file mode 100644 index 0000000000..9def93a037 --- /dev/null +++ b/Provenance/Controller/PVAtari5200ControllerViewController.h @@ -0,0 +1,12 @@ +// +// PVAtari7800ControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 08/22/2016. +// Copyright (c) 2016 Joe Mattiello. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVAtari5200ControllerViewController : PVControllerViewController +@end diff --git a/Provenance/Controller/PVAtari5200ControllerViewController.m b/Provenance/Controller/PVAtari5200ControllerViewController.m new file mode 100644 index 0000000000..7133dae4b0 --- /dev/null +++ b/Provenance/Controller/PVAtari5200ControllerViewController.m @@ -0,0 +1,138 @@ +// +// PVAtari5200ControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 11/28/2016. +// Copyright (c) 2013 James Addyman. All rights reserved. +// + +#import "PVAtari5200ControllerViewController.h" +#import + +@interface PVAtari5200ControllerViewController () + +@end + +@implementation PVAtari5200ControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"Fire 1"]) { + [button setTag:PV5200ButtonFire1]; + } else if ([[[button titleLabel] text] isEqualToString:@"Fire 2"]) { + [button setTag:PV5200ButtonFire2]; + } + } + + self.leftShoulderButton.tag = PV5200ButtonReset; + + self.startButton.tag = PV5200ButtonStart; + self.selectButton.tag = PV5200ButtonPause; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + + [a800SystemCore didRelease5200Button:PV5200ButtonUp forPlayer:0]; + [a800SystemCore didRelease5200Button:PV5200ButtonDown forPlayer:0]; + [a800SystemCore didRelease5200Button:PV5200ButtonLeft forPlayer:0]; + [a800SystemCore didRelease5200Button:PV5200ButtonRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [a800SystemCore didPush5200Button:PV5200ButtonUp forPlayer:0]; + [a800SystemCore didPush5200Button:PV5200ButtonLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [a800SystemCore didPush5200Button:PV5200ButtonUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [a800SystemCore didPush5200Button:PV5200ButtonUp forPlayer:0]; + [a800SystemCore didPush5200Button:PV5200ButtonRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [a800SystemCore didPush5200Button:PV5200ButtonLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [a800SystemCore didPush5200Button:PV5200ButtonRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [a800SystemCore didPush5200Button:PV5200ButtonDown forPlayer:0]; + [a800SystemCore didPush5200Button:PV5200ButtonLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [a800SystemCore didPush5200Button:PV5200ButtonDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [a800SystemCore didPush5200Button:PV5200ButtonDown forPlayer:0]; + [a800SystemCore didPush5200Button:PV5200ButtonRight forPlayer:0]; + break; + default: + break; + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + + [a800SystemCore didRelease5200Button:PV5200ButtonUp forPlayer:0]; + [a800SystemCore didRelease5200Button:PV5200ButtonDown forPlayer:0]; + [a800SystemCore didRelease5200Button:PV5200ButtonLeft forPlayer:0]; + [a800SystemCore didRelease5200Button:PV5200ButtonRight forPlayer:0]; +} + +- (void)buttonPressed:(JSButton *)button +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + PV5200Button tag = button.tag; + [a800SystemCore didPush5200Button:tag forPlayer:0]; + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + PV5200Button tag = button.tag; + [a800SystemCore didRelease5200Button:tag forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + [a800SystemCore didPush5200Button:PV5200ButtonReset forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + [a800SystemCore didRelease5200Button:PV5200ButtonReset forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + [a800SystemCore didPush5200Button:PV5200ButtonPause forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + ATR800GameCore *a800SystemCore = (ATR800GameCore *)self.emulatorCore; + [a800SystemCore didRelease5200Button:PV5200ButtonPause forPlayer:player]; +} + +@end + diff --git a/Provenance/Controller/PVControllerViewController.h b/Provenance/Controller/PVControllerViewController.h index 0005962ff0..5813dcc751 100644 --- a/Provenance/Controller/PVControllerViewController.h +++ b/Provenance/Controller/PVControllerViewController.h @@ -38,6 +38,7 @@ typedef NS_ENUM(NSInteger, PVControllerButton) { @property (nonatomic, strong) PVEmulatorCore *emulatorCore; @property (nonatomic, copy) NSString *systemIdentifier; @property (nonatomic, strong) JSDPad *dPad; +@property (nonatomic, strong) JSDPad *dPad2; @property (nonatomic, strong) UIView *buttonGroup; @property (nonatomic, strong) JSButton *leftShoulderButton; @property (nonatomic, strong) JSButton *rightShoulderButton; diff --git a/Provenance/Controller/PVControllerViewController.m b/Provenance/Controller/PVControllerViewController.m index fde333b6d5..d71385f281 100644 --- a/Provenance/Controller/PVControllerViewController.m +++ b/Provenance/Controller/PVControllerViewController.m @@ -137,18 +137,32 @@ - (void)setupTouchControls CGFloat dPadOriginY = MIN(controlOriginY - bottomPadding, CGRectGetHeight(self.view.frame) - controlSize.height - bottomPadding); CGRect dPadFrame = CGRectMake(xPadding, dPadOriginY, controlSize.width, controlSize.height); - if (!self.dPad) +#if 1 // Wonderswan dual D-Pad hack. + if (!self.dPad2 && [[control objectForKey:PVControlTitleKey] isEqualToString:@"Y"]) + { + dPadFrame.origin.y = dPadOriginY - size.height - bottomPadding; + self.dPad2 = [[JSDPad alloc] initWithFrame:dPadFrame]; + [self.dPad2 setDelegate:self]; + [self.dPad2 setAlpha:alpha]; + [self.dPad2 setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin]; + [self.view addSubview:self.dPad2]; + } + else +#endif + if (!self.dPad) { self.dPad = [[JSDPad alloc] initWithFrame:dPadFrame]; [self.dPad setDelegate:self]; [self.dPad setAlpha:alpha]; [self.dPad setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin]; [self.view addSubview:self.dPad]; - } + } else { [self.dPad setFrame:dPadFrame]; } + + self.dPad2.hidden = compactVertical; } else if ([controlType isEqualToString:PVButtonGroup]) { @@ -293,6 +307,7 @@ - (void)controllerDidConnect:(NSNotification *)note else { [self.dPad setHidden:NO]; + [self.dPad2 setHidden:self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact]; [self.buttonGroup setHidden:NO]; [self.leftShoulderButton setHidden:NO]; [self.rightShoulderButton setHidden:NO]; @@ -311,6 +326,7 @@ - (void)controllerDidDisconnect:(NSNotification *)note else { [self.dPad setHidden:NO]; + [self.dPad2 setHidden:self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact]; [self.buttonGroup setHidden:NO]; [self.leftShoulderButton setHidden:NO]; [self.rightShoulderButton setHidden:NO]; diff --git a/Provenance/Controller/PVLynxControllerViewController.h b/Provenance/Controller/PVLynxControllerViewController.h new file mode 100644 index 0000000000..0b6c2e65f4 --- /dev/null +++ b/Provenance/Controller/PVLynxControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVLynxControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 12/21/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVLynxControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVLynxControllerViewController.m b/Provenance/Controller/PVLynxControllerViewController.m new file mode 100644 index 0000000000..2349f01867 --- /dev/null +++ b/Provenance/Controller/PVLynxControllerViewController.m @@ -0,0 +1,139 @@ +// +// PVLynxControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 12/21/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVLynxControllerViewController.h" +#import + +@interface PVLynxControllerViewController () + +@end + +@implementation PVLynxControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"A"]) + { + [button setTag:OELynxButtonA]; + } + else if ([[[button titleLabel] text] isEqualToString:@"B"]) + { + [button setTag:OELynxButtonB]; + } + } + + [self.leftShoulderButton setTag:OELynxButtonOption1]; + [self.rightShoulderButton setTag:OELynxButtonOption2]; + [self.selectButton setTag:OELynxButtonOption2]; + [self.startButton setTag:OELynxButtonOption1]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + + [lynxCore didReleaseLynxButton:OELynxButtonUp forPlayer:0]; + [lynxCore didReleaseLynxButton:OELynxButtonDown forPlayer:0]; + [lynxCore didReleaseLynxButton:OELynxButtonLeft forPlayer:0]; + [lynxCore didReleaseLynxButton:OELynxButtonRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [lynxCore didPushLynxButton:OELynxButtonUp forPlayer:0]; + [lynxCore didPushLynxButton:OELynxButtonLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [lynxCore didPushLynxButton:OELynxButtonUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [lynxCore didPushLynxButton:OELynxButtonUp forPlayer:0]; + [lynxCore didPushLynxButton:OELynxButtonRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [lynxCore didPushLynxButton:OELynxButtonLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [lynxCore didPushLynxButton:OELynxButtonRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [lynxCore didPushLynxButton:OELynxButtonDown forPlayer:0]; + [lynxCore didPushLynxButton:OELynxButtonLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [lynxCore didPushLynxButton:OELynxButtonDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [lynxCore didPushLynxButton:OELynxButtonDown forPlayer:0]; + [lynxCore didPushLynxButton:OELynxButtonRight forPlayer:0]; + break; + default: + break; + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + + [lynxCore didReleaseLynxButton:OELynxButtonUp forPlayer:0]; + [lynxCore didReleaseLynxButton:OELynxButtonDown forPlayer:0]; + [lynxCore didReleaseLynxButton:OELynxButtonLeft forPlayer:0]; + [lynxCore didReleaseLynxButton:OELynxButtonRight forPlayer:0]; +} + +- (void)buttonPressed:(JSButton *)button +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + [lynxCore didPushLynxButton:[button tag] forPlayer:0]; + + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + [lynxCore didReleaseLynxButton:[button tag] forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + [lynxCore didPushLynxButton:OELynxButtonOption1 forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + [lynxCore didReleaseLynxButton:OELynxButtonOption1 forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + [lynxCore didPushLynxButton:OELynxButtonOption2 forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *lynxCore = (MednafenGameCore *)self.emulatorCore; + [lynxCore didReleaseLynxButton:OELynxButtonOption2 forPlayer:player]; +} + +@end diff --git a/Provenance/Controller/PVNeoGeoPocketControllerViewController.h b/Provenance/Controller/PVNeoGeoPocketControllerViewController.h new file mode 100644 index 0000000000..e501851f6c --- /dev/null +++ b/Provenance/Controller/PVNeoGeoPocketControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVNeoGeoPocketControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 03/06/17. +// Copyright © 2017 James Addyman. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVNeoGeoPocketControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVNeoGeoPocketControllerViewController.m b/Provenance/Controller/PVNeoGeoPocketControllerViewController.m new file mode 100644 index 0000000000..e586307a82 --- /dev/null +++ b/Provenance/Controller/PVNeoGeoPocketControllerViewController.m @@ -0,0 +1,140 @@ +// +// PVNeoGeoPocketControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 03/06/17. +// Copyright © 2017 James Addyman. All rights reserved. +// + +#import "PVNeoGeoPocketControllerViewController.h" +#import + +@interface PVNeoGeoPocketControllerViewController () + +@end + +@implementation PVNeoGeoPocketControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"A"]) + { + [button setTag:OENGPButtonA]; + } + else if ([[[button titleLabel] text] isEqualToString:@"B"]) + { + [button setTag:OENGPButtonB]; + } + } + +// [self.leftShoulderButton setTag:PVPSXButtonL1]; +// [self.rightShoulderButton setTag:PVPSXButtonR1]; + + [self.selectButton setTag:OENGPButtonOption]; + [self.startButton setTag:OENGPButtonOption]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + + [ngCore didReleaseNGPButton:OENGPButtonUp forPlayer:0]; + [ngCore didReleaseNGPButton:OENGPButtonDown forPlayer:0]; + [ngCore didReleaseNGPButton:OENGPButtonLeft forPlayer:0]; + [ngCore didReleaseNGPButton:OENGPButtonRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [ngCore didPushNGPButton:OENGPButtonUp forPlayer:0]; + [ngCore didPushNGPButton:OENGPButtonLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [ngCore didPushNGPButton:OENGPButtonUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [ngCore didPushNGPButton:OENGPButtonUp forPlayer:0]; + [ngCore didPushNGPButton:OENGPButtonRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [ngCore didPushNGPButton:OENGPButtonLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [ngCore didPushNGPButton:OENGPButtonRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [ngCore didPushNGPButton:OENGPButtonDown forPlayer:0]; + [ngCore didPushNGPButton:OENGPButtonLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [ngCore didPushNGPButton:OENGPButtonDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [ngCore didPushNGPButton:OENGPButtonDown forPlayer:0]; + [ngCore didPushNGPButton:OENGPButtonRight forPlayer:0]; + break; + default: + break; + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + + [ngCore didReleaseNGPButton:OENGPButtonUp forPlayer:0]; + [ngCore didReleaseNGPButton:OENGPButtonDown forPlayer:0]; + [ngCore didReleaseNGPButton:OENGPButtonLeft forPlayer:0]; + [ngCore didReleaseNGPButton:OENGPButtonRight forPlayer:0]; +} + +- (void)buttonPressed:(JSButton *)button +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + [ngCore didPushNGPButton:[button tag] forPlayer:0]; + + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + [ngCore didReleaseNGPButton:[button tag] forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + [ngCore didPushNGPButton:OENGPButtonOption forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + [ngCore didReleaseNGPButton:OENGPButtonOption forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + [ngCore didPushNGPButton:OENGPButtonOption forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *ngCore = (MednafenGameCore *)self.emulatorCore; + [ngCore didReleaseNGPButton:OENGPButtonOption forPlayer:player]; +} + +@end diff --git a/Provenance/Controller/PVPCEControllerViewController.h b/Provenance/Controller/PVPCEControllerViewController.h new file mode 100644 index 0000000000..e50545323f --- /dev/null +++ b/Provenance/Controller/PVPCEControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVPCEControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 03/206/17. +// Copyright © 2017 James Addyman. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVPCEControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVPCEControllerViewController.m b/Provenance/Controller/PVPCEControllerViewController.m new file mode 100644 index 0000000000..11eb749c5a --- /dev/null +++ b/Provenance/Controller/PVPCEControllerViewController.m @@ -0,0 +1,157 @@ +// +// PVPCEControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 03/206/17. +// Copyright © 2017 James Addyman. All rights reserved. +// + +#import "PVPCEControllerViewController.h" +#import + +@interface PVPCEControllerViewController () + +@end + +@implementation PVPCEControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"I"]) + { + [button setTag:OEPCEButton1]; + } + else if ([[[button titleLabel] text] isEqualToString:@"II"]) + { + [button setTag:OEPCEButton2]; + } + else if ([[[button titleLabel] text] isEqualToString:@"III"]) + { + [button setTag:OEPCEButton3]; + } + else if ([[[button titleLabel] text] isEqualToString:@"IV"]) + { + [button setTag:OEPCEButton4]; + } + else if ([[[button titleLabel] text] isEqualToString:@"V"]) + { + [button setTag:OEPCEButton5]; + } + else if ([[[button titleLabel] text] isEqualToString:@"VI"]) + { + [button setTag:OEPCEButton6]; + } + + } + +// [self.leftShoulderButton setTag:PVPSXButtonL1]; +// [self.rightShoulderButton setTag:PVPSXButtonR1]; + + [self.selectButton setTag:OEPCEButtonSelect]; + [self.startButton setTag:OEPCEButtonMode]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + + [pceCore didReleasePCEButton:OEPCEButtonUp forPlayer:0]; + [pceCore didReleasePCEButton:OEPCEButtonDown forPlayer:0]; + [pceCore didReleasePCEButton:OEPCEButtonLeft forPlayer:0]; + [pceCore didReleasePCEButton:OEPCEButtonRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [pceCore didPushPCEButton:OEPCEButtonUp forPlayer:0]; + [pceCore didPushPCEButton:OEPCEButtonLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [pceCore didPushPCEButton:OEPCEButtonUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [pceCore didPushPCEButton:OEPCEButtonUp forPlayer:0]; + [pceCore didPushPCEButton:OEPCEButtonRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [pceCore didPushPCEButton:OEPCEButtonLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [pceCore didPushPCEButton:OEPCEButtonRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [pceCore didPushPCEButton:OEPCEButtonDown forPlayer:0]; + [pceCore didPushPCEButton:OEPCEButtonLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [pceCore didPushPCEButton:OEPCEButtonDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [pceCore didPushPCEButton:OEPCEButtonDown forPlayer:0]; + [pceCore didPushPCEButton:OEPCEButtonRight forPlayer:0]; + break; + default: + break; + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + + [pceCore didReleasePCEButton:OEPCEButtonUp forPlayer:0]; + [pceCore didReleasePCEButton:OEPCEButtonDown forPlayer:0]; + [pceCore didReleasePCEButton:OEPCEButtonLeft forPlayer:0]; + [pceCore didReleasePCEButton:OEPCEButtonRight forPlayer:0]; +} + +- (void)buttonPressed:(JSButton *)button +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + [pceCore didPushPCEButton:[button tag] forPlayer:0]; + + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + [pceCore didReleasePCEButton:[button tag] forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + [pceCore didPushPCEButton:OEPCEButtonMode forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + [pceCore didReleasePCEButton:OEPCEButtonMode forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + [pceCore didPushPCEButton:OEPCEButtonSelect forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *pceCore = (MednafenGameCore *)self.emulatorCore; + [pceCore didReleasePCEButton:OEPCEButtonSelect forPlayer:player]; +} + +@end diff --git a/Provenance/Controller/PVPSXControllerViewController.h b/Provenance/Controller/PVPSXControllerViewController.h new file mode 100644 index 0000000000..b16a02a94d --- /dev/null +++ b/Provenance/Controller/PVPSXControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVPSXControllerViewController.h +// Provenance +// +// Created by shruglins on 26/8/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVPSXControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVPSXControllerViewController.m b/Provenance/Controller/PVPSXControllerViewController.m new file mode 100644 index 0000000000..6df7fc251a --- /dev/null +++ b/Provenance/Controller/PVPSXControllerViewController.m @@ -0,0 +1,148 @@ +// +// PVPSXControllerViewController.m +// Provenance +// +// Created by shruglins on 26/8/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVPSXControllerViewController.h" +#import + +@interface PVPSXControllerViewController () + +@end + +@implementation PVPSXControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"✖"]) + { + [button setTag:PVPSXButtonCross]; + } + else if ([[[button titleLabel] text] isEqualToString:@"●"]) + { + [button setTag:PVPSXButtonCircle]; + } + else if ([[[button titleLabel] text] isEqualToString:@"◼"]) + { + [button setTag:PVPSXButtonSquare]; + } + else if ([[[button titleLabel] text] isEqualToString:@"▲"]) + { + [button setTag:PVPSXButtonTriangle]; + } + } + + [self.leftShoulderButton setTag:PVPSXButtonL1]; + [self.rightShoulderButton setTag:PVPSXButtonR1]; + + [self.selectButton setTag:PVPSXButtonSelect]; + [self.startButton setTag:PVPSXButtonStart]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + + [psxCore didReleasePSXButton:PVPSXButtonUp forPlayer:0]; + [psxCore didReleasePSXButton:PVPSXButtonDown forPlayer:0]; + [psxCore didReleasePSXButton:PVPSXButtonLeft forPlayer:0]; + [psxCore didReleasePSXButton:PVPSXButtonRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [psxCore didPushPSXButton:PVPSXButtonUp forPlayer:0]; + [psxCore didPushPSXButton:PVPSXButtonLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [psxCore didPushPSXButton:PVPSXButtonUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [psxCore didPushPSXButton:PVPSXButtonUp forPlayer:0]; + [psxCore didPushPSXButton:PVPSXButtonRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [psxCore didPushPSXButton:PVPSXButtonLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [psxCore didPushPSXButton:PVPSXButtonRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [psxCore didPushPSXButton:PVPSXButtonDown forPlayer:0]; + [psxCore didPushPSXButton:PVPSXButtonLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [psxCore didPushPSXButton:PVPSXButtonDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [psxCore didPushPSXButton:PVPSXButtonDown forPlayer:0]; + [psxCore didPushPSXButton:PVPSXButtonRight forPlayer:0]; + break; + default: + break; + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + + [psxCore didReleasePSXButton:PVPSXButtonUp forPlayer:0]; + [psxCore didReleasePSXButton:PVPSXButtonDown forPlayer:0]; + [psxCore didReleasePSXButton:PVPSXButtonLeft forPlayer:0]; + [psxCore didReleasePSXButton:PVPSXButtonRight forPlayer:0]; +} + +- (void)buttonPressed:(JSButton *)button +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + [psxCore didPushPSXButton:[button tag] forPlayer:0]; + + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + [psxCore didReleasePSXButton:[button tag] forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + [psxCore didPushPSXButton:PVPSXButtonStart forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + [psxCore didReleasePSXButton:PVPSXButtonStart forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + [psxCore didPushPSXButton:PVPSXButtonSelect forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *psxCore = (MednafenGameCore *)self.emulatorCore; + [psxCore didReleasePSXButton:PVPSXButtonSelect forPlayer:player]; +} + +@end diff --git a/Provenance/Controller/PVPokeMiniControllerViewController.h b/Provenance/Controller/PVPokeMiniControllerViewController.h new file mode 100644 index 0000000000..d2e0dc3edc --- /dev/null +++ b/Provenance/Controller/PVPokeMiniControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVPokeMiniControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 10/04/2017. +// Copyright (c) 2017 Joe Mattiello. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVPokeMiniControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVPokeMiniControllerViewController.m b/Provenance/Controller/PVPokeMiniControllerViewController.m new file mode 100644 index 0000000000..3ae2540794 --- /dev/null +++ b/Provenance/Controller/PVPokeMiniControllerViewController.m @@ -0,0 +1,149 @@ +// +// PVPokeMiniControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 10/04/2017. +// Copyright (c) 2017 Joe Mattiello. All rights reserved. +// + +#import "PVPokeMiniControllerViewController.h" +#import + +@interface PVPokeMiniControllerViewController () + +@end + +@implementation PVPokeMiniControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; + } + + if ([[[button titleLabel] text] isEqualToString:@"A"]) + { + [button setTag:PVPMButtonA]; + } + else if ([[[button titleLabel] text] isEqualToString:@"B"]) + { + [button setTag:PVPMButtonB]; + } + else if ([[[button titleLabel] text] isEqualToString:@"C"]) + { + [button setTag:PVPMButtonC]; + } + } + + [self.leftShoulderButton setTag:PVPMButtonMenu]; + + [self.startButton setTag:PVPMButtonPower]; + [self.selectButton setTag:PVPMButtonShake]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + + [pokeCore didReleasePMButton:PVPMButtonUp forPlayer:0]; + [pokeCore didReleasePMButton:PVPMButtonDown forPlayer:0]; + [pokeCore didReleasePMButton:PVPMButtonLeft forPlayer:0]; + [pokeCore didReleasePMButton:PVPMButtonRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [pokeCore didPushPMButton:PVPMButtonUp forPlayer:0]; + [pokeCore didPushPMButton:PVPMButtonLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [pokeCore didPushPMButton:PVPMButtonUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [pokeCore didPushPMButton:PVPMButtonUp forPlayer:0]; + [pokeCore didPushPMButton:PVPMButtonRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [pokeCore didPushPMButton:PVPMButtonLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [pokeCore didPushPMButton:PVPMButtonRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [pokeCore didPushPMButton:PVPMButtonDown forPlayer:0]; + [pokeCore didPushPMButton:PVPMButtonLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [pokeCore didPushPMButton:PVPMButtonDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [pokeCore didPushPMButton:PVPMButtonDown forPlayer:0]; + [pokeCore didPushPMButton:PVPMButtonRight forPlayer:0]; + break; + default: + break; + } + + [super dPad:dPad didPressDirection:direction]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + + [pokeCore didReleasePMButton:PVPMButtonUp forPlayer:0]; + [pokeCore didReleasePMButton:PVPMButtonDown forPlayer:0]; + [pokeCore didReleasePMButton:PVPMButtonLeft forPlayer:0]; + [pokeCore didReleasePMButton:PVPMButtonRight forPlayer:0]; + [super dPadDidReleaseDirection:dPad]; +} + +- (void)buttonPressed:(JSButton *)button +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + [pokeCore didPushPMButton:[button tag] forPlayer:0]; + + [super buttonPressed:button]; +} + +- (void)buttonReleased:(JSButton *)button +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + [pokeCore didReleasePMButton:[button tag] forPlayer:0]; + [super buttonReleased:button]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + [pokeCore didPushPMButton:PVPMButtonPower forPlayer:player]; + [super pressStartForPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + [pokeCore didReleasePMButton:PVPMButtonPower forPlayer:player]; + [super releaseStartForPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + [pokeCore didPushPMButton:PVPMButtonShake forPlayer:player]; + [super pressSelectForPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + PVPokeMiniEmulatorCore *pokeCore = (PVPokeMiniEmulatorCore *)self.emulatorCore; + [pokeCore didReleasePMButton:PVPMButtonShake forPlayer:player]; + [super releaseSelectForPlayer:player]; +} + +@end diff --git a/Provenance/Controller/PVVBControllerViewController.h b/Provenance/Controller/PVVBControllerViewController.h new file mode 100644 index 0000000000..a9aa7c282b --- /dev/null +++ b/Provenance/Controller/PVVBControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVVBControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 12/21/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVVBControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVVBControllerViewController.m b/Provenance/Controller/PVVBControllerViewController.m new file mode 100644 index 0000000000..786d394545 --- /dev/null +++ b/Provenance/Controller/PVVBControllerViewController.m @@ -0,0 +1,140 @@ +// +// PVVBControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 12/21/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVVBControllerViewController.h" +#import + +@interface PVVBControllerViewController () + +@end + +@implementation PVVBControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"A"]) + { + [button setTag:OEVBButtonA]; + } + else if ([[[button titleLabel] text] isEqualToString:@"B"]) + { + [button setTag:OEVBButtonB]; + } + } + + [self.leftShoulderButton setTag:OEVBButtonL]; + [self.rightShoulderButton setTag:OEVBButtonR]; + + [self.selectButton setTag:OEVBButtonSelect]; + [self.startButton setTag:OEVBButtonStart]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + + [vbCore didReleaseVBButton:OEVBButtonLeftUp forPlayer:0]; + [vbCore didReleaseVBButton:OEVBButtonLeftDown forPlayer:0]; + [vbCore didReleaseVBButton:OEVBButtonLeftLeft forPlayer:0]; + [vbCore didReleaseVBButton:OEVBButtonLeftRight forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [vbCore didPushVBButton:OEVBButtonLeftUp forPlayer:0]; + [vbCore didPushVBButton:OEVBButtonLeftLeft forPlayer:0]; + break; + case JSDPadDirectionUp: + [vbCore didPushVBButton:OEVBButtonLeftUp forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [vbCore didPushVBButton:OEVBButtonLeftUp forPlayer:0]; + [vbCore didPushVBButton:OEVBButtonLeftRight forPlayer:0]; + break; + case JSDPadDirectionLeft: + [vbCore didPushVBButton:OEVBButtonLeftLeft forPlayer:0]; + break; + case JSDPadDirectionRight: + [vbCore didPushVBButton:OEVBButtonLeftRight forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [vbCore didPushVBButton:OEVBButtonLeftDown forPlayer:0]; + [vbCore didPushVBButton:OEVBButtonLeftLeft forPlayer:0]; + break; + case JSDPadDirectionDown: + [vbCore didPushVBButton:OEVBButtonLeftDown forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [vbCore didPushVBButton:OEVBButtonLeftDown forPlayer:0]; + [vbCore didPushVBButton:OEVBButtonLeftRight forPlayer:0]; + break; + default: + break; + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + + [vbCore didReleaseVBButton:OEVBButtonLeftUp forPlayer:0]; + [vbCore didReleaseVBButton:OEVBButtonLeftDown forPlayer:0]; + [vbCore didReleaseVBButton:OEVBButtonLeftLeft forPlayer:0]; + [vbCore didReleaseVBButton:OEVBButtonLeftRight forPlayer:0]; +} + +- (void)buttonPressed:(JSButton *)button +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + [vbCore didPushVBButton:[button tag] forPlayer:0]; + + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + [vbCore didReleaseVBButton:[button tag] forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + [vbCore didPushVBButton:OEVBButtonStart forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + [vbCore didReleaseVBButton:OEVBButtonStart forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + [vbCore didPushVBButton:OEVBButtonSelect forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *vbCore = (MednafenGameCore *)self.emulatorCore; + [vbCore didReleaseVBButton:OEVBButtonSelect forPlayer:player]; +} + +@end diff --git a/Provenance/Controller/PVWonderSwanControllerViewController.h b/Provenance/Controller/PVWonderSwanControllerViewController.h new file mode 100644 index 0000000000..50de1f7571 --- /dev/null +++ b/Provenance/Controller/PVWonderSwanControllerViewController.h @@ -0,0 +1,13 @@ +// +// PVWonderSwanControllerViewController.h +// Provenance +// +// Created by Joe Mattiello on 12/21/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVControllerViewController.h" + +@interface PVWonderSwanControllerViewController : PVControllerViewController + +@end diff --git a/Provenance/Controller/PVWonderSwanControllerViewController.m b/Provenance/Controller/PVWonderSwanControllerViewController.m new file mode 100644 index 0000000000..99ab2d1804 --- /dev/null +++ b/Provenance/Controller/PVWonderSwanControllerViewController.m @@ -0,0 +1,193 @@ +// +// PVWonderSwanControllerViewController.m +// Provenance +// +// Created by Joe Mattiello on 12/21/16. +// Copyright © 2016 James Addyman. All rights reserved. +// + +#import "PVWonderSwanControllerViewController.h" +#import + +@interface PVWonderSwanControllerViewController () + +@end + +@implementation PVWonderSwanControllerViewController + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + for (JSButton *button in [self.buttonGroup subviews]) + { + if (![button isMemberOfClass:[JSButton class]]) + { + continue; // skip over the PVButtonGroupOverlayView + } + + if ([[[button titleLabel] text] isEqualToString:@"A"]) + { + [button setTag:OEWSButtonA]; + } + else if ([[[button titleLabel] text] isEqualToString:@"B"]) + { + [button setTag:OEWSButtonB]; + } + } + +// [self.leftShoulderButton setTag:PVPSXButtonL1]; +// [self.rightShoulderButton setTag:PVPSXButtonR1]; + + [self.selectButton setTag:OEWSButtonSound]; + [self.startButton setTag:OEWSButtonStart]; +} + +- (void)dPad:(JSDPad *)dPad didPressDirection:(JSDPadDirection)direction +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + + /* + OEWSButtonX1 == Up + OEWSButtonX2 == Right + OEWSButtonX3 == Down + OEWSButtonX4 == Left + */ + if (dPad == self.dPad) { + [wsCore didReleaseWSButton:OEWSButtonX1 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonX2 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonX3 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonX4 forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [wsCore didPushWSButton:OEWSButtonX1 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonX4 forPlayer:0]; + break; + case JSDPadDirectionUp: + [wsCore didPushWSButton:OEWSButtonX1 forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [wsCore didPushWSButton:OEWSButtonX1 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonX2 forPlayer:0]; + break; + case JSDPadDirectionLeft: + [wsCore didPushWSButton:OEWSButtonX4 forPlayer:0]; + break; + case JSDPadDirectionRight: + [wsCore didPushWSButton:OEWSButtonX2 forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [wsCore didPushWSButton:OEWSButtonX3 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonX4 forPlayer:0]; + break; + case JSDPadDirectionDown: + [wsCore didPushWSButton:OEWSButtonX3 forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [wsCore didPushWSButton:OEWSButtonX3 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonX2 forPlayer:0]; + break; + default: + break; + } + } else { + [wsCore didReleaseWSButton:OEWSButtonY1 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonY2 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonY3 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonY4 forPlayer:0]; + + switch (direction) + { + case JSDPadDirectionUpLeft: + [wsCore didPushWSButton:OEWSButtonY1 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonY4 forPlayer:0]; + break; + case JSDPadDirectionUp: + [wsCore didPushWSButton:OEWSButtonY1 forPlayer:0]; + break; + case JSDPadDirectionUpRight: + [wsCore didPushWSButton:OEWSButtonY1 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonY2 forPlayer:0]; + break; + case JSDPadDirectionLeft: + [wsCore didPushWSButton:OEWSButtonY4 forPlayer:0]; + break; + case JSDPadDirectionRight: + [wsCore didPushWSButton:OEWSButtonY2 forPlayer:0]; + break; + case JSDPadDirectionDownLeft: + [wsCore didPushWSButton:OEWSButtonY3 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonY4 forPlayer:0]; + break; + case JSDPadDirectionDown: + [wsCore didPushWSButton:OEWSButtonY3 forPlayer:0]; + break; + case JSDPadDirectionDownRight: + [wsCore didPushWSButton:OEWSButtonY3 forPlayer:0]; + [wsCore didPushWSButton:OEWSButtonY2 forPlayer:0]; + break; + default: + break; + } + } + + [self vibrate]; +} + +- (void)dPadDidReleaseDirection:(JSDPad *)dPad +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + if (dPad == self.dPad) { + [wsCore didReleaseWSButton:OEWSButtonX1 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonX2 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonX3 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonX4 forPlayer:0]; + } else { + [wsCore didReleaseWSButton:OEWSButtonY1 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonY2 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonY3 forPlayer:0]; + [wsCore didReleaseWSButton:OEWSButtonY4 forPlayer:0]; + } +} + +- (void)buttonPressed:(JSButton *)button +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + [wsCore didPushWSButton:[button tag] forPlayer:0]; + + [self vibrate]; +} + +- (void)buttonReleased:(JSButton *)button +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + [wsCore didReleaseWSButton:[button tag] forPlayer:0]; +} + +- (void)pressStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + [wsCore didPushWSButton:OEWSButtonStart forPlayer:player]; +} + +- (void)releaseStartForPlayer:(NSUInteger)player +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + [wsCore didReleaseWSButton:OEWSButtonStart forPlayer:player]; +} + +- (void)pressSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + [wsCore didPushWSButton:OEWSButtonSound forPlayer:player]; +} + +- (void)releaseSelectForPlayer:(NSUInteger)player +{ + MednafenGameCore *wsCore = (MednafenGameCore *)self.emulatorCore; + [wsCore didReleaseWSButton:OEWSButtonSound forPlayer:player]; +} + +@end diff --git a/Provenance/Controller/iCade/PViCadeGamepadButtonInput.h b/Provenance/Controller/iCade/PViCadeGamepadButtonInput.h index 383380c589..83ddc982dd 100644 --- a/Provenance/Controller/iCade/PViCadeGamepadButtonInput.h +++ b/Provenance/Controller/iCade/PViCadeGamepadButtonInput.h @@ -12,6 +12,7 @@ GCControllerButtonValueChangedHandler _handler; BOOL _pressed; + float _value; } -(void) buttonPressed; diff --git a/Provenance/Controller/iCade/PViCadeGamepadButtonInput.m b/Provenance/Controller/iCade/PViCadeGamepadButtonInput.m index 54ee2225de..017c116db4 100644 --- a/Provenance/Controller/iCade/PViCadeGamepadButtonInput.m +++ b/Provenance/Controller/iCade/PViCadeGamepadButtonInput.m @@ -22,22 +22,27 @@ -(void) buttonPressed { if (_handler) { _handler(self, 1.0, YES); } - _pressed = YES; + [self setPressed:YES]; } -(void) buttonReleased { if (_handler) { _handler(self, 0.0, NO); } - _pressed = NO; + [self setPressed:NO]; } -(void) setPressed:(BOOL)pressed { _pressed = pressed; + _value = pressed ? 1.0f : 0.0f; } -(BOOL) isPressed { return _pressed; } +- (float)value { + return _value; +} + @end diff --git a/Provenance/Emulator/PVEmulatorConfiguration.h b/Provenance/Emulator/PVEmulatorConfiguration.h index 37b071f82b..42f4367e06 100644 --- a/Provenance/Emulator/PVEmulatorConfiguration.h +++ b/Provenance/Emulator/PVEmulatorConfiguration.h @@ -10,24 +10,54 @@ @class PVEmulatorCore, PVControllerViewController; +@interface BIOSEntry : NSObject + +@property (nonatomic, strong, nonnull, readonly) NSString* systemID; +@property (nonatomic, strong, nonnull, readonly) NSString* desc; +@property (nonatomic, strong, nonnull, readonly) NSString* filename; +@property (nonatomic, strong, nonnull, readonly) NSNumber* expectedFileSize; +@property (nonatomic, strong, nonnull, readonly) NSString* expectedMD5; + +-(instancetype _Nonnull)initWithFilename:(NSString * _Nonnull )filename systemID:(NSString* _Nonnull)systemID description:(NSString * _Nonnull )desctription md5:(NSString * _Nonnull )md5 size:(NSNumber * _Nonnull )size; +@end + @interface PVEmulatorConfiguration : NSObject -+ (PVEmulatorConfiguration *)sharedInstance; ++ (instancetype _Nonnull)sharedInstance; + +- (PVEmulatorCore * _Nullable)emulatorCoreForSystemIdentifier:(NSString * _Nonnull)systemID; +- (PVControllerViewController * _Nullable)controllerViewControllerForSystemIdentifier:(NSString * _Nonnull)systemID; + +#pragma mark System +- (NSDictionary * _Nullable)systemForIdentifier:(NSString * _Nonnull)systemID; +- (NSArray * _Nonnull)availableSystemIdentifiers; +- (NSString * _Nullable)nameForSystemIdentifier:(NSString* _Nonnull)systemID; +- (NSString * _Nullable)shortNameForSystemIdentifier:(NSString * _Nonnull)systemID; +- (NSArray * _Nullable)controllerLayoutForSystem:(NSString * _Nonnull)systemID; +- (NSString * _Nullable)databaseIDForSystemID:(NSString * _Nonnull)systemID; +- (NSString *)systemIDForDatabaseID:(NSString *)databaseID; + +#pragma mark ROM IOS etc +- (NSArray * _Nonnull)supportedROMFileExtensions; +- (NSArray * _Nonnull)supportedCDFileExtensions; +- (NSArray * _Nonnull)cdBasedSystemIDs; +- (NSArray * _Nullable)fileExtensionsForSystemIdentifier:(NSString * _Nonnull)systemID; +- (NSString * _Nullable)systemIdentifierForFileExtension:(NSString * _Nonnull)fileExtension; +- (NSArray * _Nonnull)systemIdentifiersForFileExtension:(NSString * _Nonnull)fileExtension; -- (PVEmulatorCore *)emulatorCoreForSystemIdentifier:(NSString *)systemID; -- (PVControllerViewController *)controllerViewControllerForSystemIdentifier:(NSString *)systemID; +#pragma mark BIOS +- (NSArray * _Nonnull)supportedBIOSFileExtensions; -- (NSDictionary *)systemForIdentifier:(NSString *)systemID; -- (NSArray *)availableSystemIdentifiers; -- (NSString *)nameForSystemIdentifier:(NSString *)systemID; -- (NSString *)shortNameForSystemIdentifier:(NSString *)systemID; -- (NSArray *)supportedFileExtensions; -- (NSArray *)supportedCDFileExtensions; -- (NSArray *)cdBasedSystemIDs; -- (NSArray *)fileExtensionsForSystemIdentifier:(NSString *)systemID; -- (NSString *)systemIdentifierForFileExtension:(NSString *)fileExtension; -- (NSArray *)systemIdentifiersForFileExtension:(NSString *)fileExtension; -- (NSArray *)controllerLayoutForSystem:(NSString *)systemID; -- (NSString *)databaseIDForSystemID:(NSString *)systemID; +- (NSArray* _Nonnull)biosEntries; +- (NSArray* _Nonnull)biosEntriesForSystemIdentifier:(NSString* _Nonnull)systemID; +- (BIOSEntry* _Nullable)biosEntryForMD5:(NSString* _Nonnull)md5; +- (BIOSEntry* _Nullable)biosEntryForFilename:(NSString* _Nonnull)filename; +- (NSString * _Nonnull)BIOSPathForSystemID:(NSString * _Nonnull)systemID; +#pragma mark Filesystem Helpers +- (NSString * _Nonnull)documentsPath; +- (NSString * _Nonnull)romsPath; +- (NSString * _Nonnull)coverArtPath; +- (NSString * _Nonnull)batterySavesPathForROM:(NSString * _Nonnull)romPath; +- (NSString * _Nonnull)saveStatePathForROM:(NSString * _Nonnull)romPath; @end diff --git a/Provenance/Emulator/PVEmulatorConfiguration.m b/Provenance/Emulator/PVEmulatorConfiguration.m index 4078d158f0..628691d238 100644 --- a/Provenance/Emulator/PVEmulatorConfiguration.m +++ b/Provenance/Emulator/PVEmulatorConfiguration.m @@ -33,6 +33,36 @@ #import #import "PV32XControllerViewController.h" +#import +#import "PVAtari5200ControllerViewController.h" + +#import +#import "PVPokeMiniControllerViewController.h" + +#import +#import "PVPSXControllerViewController.h" +#import "PVLynxControllerViewController.h" +#import "PVPCEControllerViewController.h" +#import "PVVBControllerViewController.h" +#import "PVWonderSwanControllerViewController.h" +#import "PVNeoGeoPocketControllerViewController.h" + +@implementation BIOSEntry + +-(instancetype)initWithFilename:(NSString * _Nonnull )filename systemID:(NSString* _Nonnull)systemID description:(NSString * _Nonnull )desctription md5:(NSString * _Nonnull )md5 size:(NSNumber * _Nonnull )size; +{ + self = [super init]; + if (self) { + _filename = filename; + _desc = desctription; + _expectedMD5 = md5.uppercaseString; + _expectedFileSize = size; + _systemID = systemID; + } + return self; +} +@end + @interface PVEmulatorConfiguration () @property (nonatomic, strong) NSArray *systems; @@ -113,6 +143,28 @@ - (PVEmulatorCore *)emulatorCoreForSystemIdentifier:(NSString *)systemID { core = [[PicodriveGameCore alloc] init]; } + else if ([systemID isEqualToString:PV5200SystemIdentifier]) + { + core = [[ATR800GameCore alloc] init]; + } + else if ([systemID isEqualToString:PVPokemonMiniSystemIdentifier]) + { + core = [[PVPokeMiniEmulatorCore alloc] init]; + } + else if ([systemID isEqualToString:PVPSXSystemIdentifier] || + [systemID isEqualToString:PVLynxSystemIdentifier] || + [systemID isEqualToString:PVPCESystemIdentifier] || + [systemID isEqualToString:PVPCECDSystemIdentifier] || + [systemID isEqualToString:PVNGPSystemIdentifier] || + [systemID isEqualToString:PVNGPCSystemIdentifier] || + [systemID isEqualToString:PVPCFXSystemIdentifier] || + [systemID isEqualToString:PVVirtualBoySystemIdentifier] || + [systemID isEqualToString:PVWonderSwanSystemIdentifier]) + { + core = [[MednafenGameCore alloc] init]; + } + + core.systemIdentifier = systemID; return core; } @@ -159,6 +211,43 @@ - (PVControllerViewController *)controllerViewControllerForSystemIdentifier:(NSS { controller = [[PV32XControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; } + else if ([systemID isEqualToString:PV5200SystemIdentifier]) + { + controller = [[PVAtari5200ControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ([systemID isEqualToString:PVPokemonMiniSystemIdentifier]) + { + controller = [[PVPokeMiniControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ([systemID isEqualToString:PVPSXSystemIdentifier]) + { + controller = [[PVPSXControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ([systemID isEqualToString:PVWonderSwanSystemIdentifier]) + { + controller = [[PVWonderSwanControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ([systemID isEqualToString:PVLynxSystemIdentifier]) + { + controller = [[PVLynxControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ([systemID isEqualToString:PVVirtualBoySystemIdentifier]) + { + controller = [[PVVBControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ([systemID isEqualToString:PVPCESystemIdentifier] || + [systemID isEqualToString:PVPCECDSystemIdentifier] || + [systemID isEqualToString:PVPCFXSystemIdentifier]) + { + controller = [[PVPCEControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else if ( [systemID isEqualToString:PVNGPSystemIdentifier] || + [systemID isEqualToString:PVNGPCSystemIdentifier]) { + controller = [[PVNeoGeoPocketControllerViewController alloc] initWithControlLayout:[self controllerLayoutForSystem:systemID] systemIdentifier:systemID]; + } + else { + @throw [NSString stringWithFormat:@"No controller for system with identifier %@", systemID]; + } return controller; } @@ -176,6 +265,20 @@ - (NSDictionary *)systemForIdentifier:(NSString *)systemID return nil; } +- (NSString *)systemIDForDatabaseID:(NSString *)databaseID; +{ + for (NSDictionary *system in self.systems) + { + NSString *dbID = [system objectForKey:PVDatabaseIDKey]; + if ([dbID isEqualToString:databaseID]) + { + return system[PVSystemIdentifierKey]; + } + } + + return nil; +} + - (NSArray *)availableSystemIdentifiers { NSMutableArray *systemIDs = [NSMutableArray array]; @@ -231,7 +334,7 @@ - (NSArray *)cdBasedSystemIDs return [systems allObjects]; } -- (NSArray *)supportedFileExtensions +- (NSArray *)supportedROMFileExtensions { NSMutableSet *extentions = [NSMutableSet set]; @@ -244,6 +347,19 @@ - (NSArray *)supportedFileExtensions return [extentions allObjects]; } +- (NSArray *)supportedBIOSFileExtensions +{ + NSMutableSet *extentions = [NSMutableSet set]; + + for (BIOSEntry *bios in [self biosEntries] ) { + NSString *ext = bios.filename.pathExtension; + [extentions addObject:ext]; + } + + return [extentions allObjects]; +} + + - (NSArray *)fileExtensionsForSystemIdentifier:(NSString *)systemID { NSDictionary *system = [self systemForIdentifier:systemID]; @@ -254,8 +370,8 @@ - (NSString *)systemIdentifierForFileExtension:(NSString *)fileExtension { for (NSDictionary *system in self.systems) { - NSArray *supportedFileExtensions = [system objectForKey:PVSupportedExtensionsKey]; - if ([supportedFileExtensions containsObject:[fileExtension lowercaseString]]) + NSArray *supportedROMFileExtensions = [system objectForKey:PVSupportedExtensionsKey]; + if ([supportedROMFileExtensions containsObject:[fileExtension lowercaseString]]) { return [system objectForKey:PVSystemIdentifierKey]; } @@ -269,8 +385,8 @@ - (NSArray *)systemIdentifiersForFileExtension:(NSString *)fileExtension NSMutableArray *systems = [NSMutableArray array]; for (NSDictionary *system in self.systems) { - NSArray *supportedFileExtensions = [system objectForKey:PVSupportedExtensionsKey]; - if ([supportedFileExtensions containsObject:[fileExtension lowercaseString]]) + NSArray *supportedROMFileExtensions = [system objectForKey:PVSupportedExtensionsKey]; + if ([supportedROMFileExtensions containsObject:[fileExtension lowercaseString]]) { [systems addObject:[system objectForKey:PVSystemIdentifierKey]]; } @@ -291,4 +407,157 @@ - (NSString *)databaseIDForSystemID:(NSString *)systemID return system[PVDatabaseIDKey]; } +-(NSArray*)biosEntries { + + static NSArray* biosEntries; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableArray* newEntries = [NSMutableArray new]; + for (NSDictionary *system in self.systems) { + NSArray*biosDicts = system[PVBIOSNamesKey]; + NSString*systemID = system[PVSystemIdentifierKey]; + if (biosDicts) { + for (NSDictionary*biosDict in biosDicts) { + + NSString* desc = biosDict[@"Description"]; + NSString* md5 = biosDict[@"MD5"]; + NSString* name = biosDict[@"Name"]; + NSNumber* size = biosDict[@"Size"]; + + if (desc && md5 && name && size) { + BIOSEntry* newEntry = [[BIOSEntry alloc] initWithFilename:name + systemID:systemID + description:desc + md5:md5 + size:size]; + [newEntries addObject:newEntry]; + } else { + DLog(@"System BIOS dictionary was missing a key"); + } + } + } + } + biosEntries = [NSArray arrayWithArray:newEntries]; + }); + + return biosEntries; +} + +-(NSArray*)biosEntriesForSystemIdentifier:(NSString*)systemID { + NSPredicate*predicate = [NSPredicate predicateWithFormat:@"systemID == %@", systemID]; + + return [[self biosEntries] filteredArrayUsingPredicate:predicate]; +} + +- (BIOSEntry* _Nullable)biosEntryForMD5:(NSString* _Nonnull)md5 { + NSPredicate*predicate = [NSPredicate predicateWithFormat:@"expectedMD5 == %@", md5]; + + return [[self biosEntries] filteredArrayUsingPredicate:predicate].firstObject; +} + +- (BIOSEntry* _Nullable)biosEntryForFilename:(NSString* _Nonnull)filename { + NSPredicate*predicate = [NSPredicate predicateWithFormat:@"filename == %@", filename]; + + return [[self biosEntries] filteredArrayUsingPredicate:predicate].firstObject; +} + +- (NSString *)BIOSPathForSystemID:(NSString *)systemID +{ + return [[[self documentsPath] stringByAppendingPathComponent:@"BIOS"] stringByAppendingPathComponent:systemID]; +} + +#pragma mark - Filesystem Helpers +- (NSString *)documentsPath +{ +#if TARGET_OS_TV + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +#else + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#endif + NSString *documentsDirectoryPath = [paths objectAtIndex:0]; + + return documentsDirectoryPath; +} + +- (NSString *)romsPath +{ +#if TARGET_OS_TV + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +#else + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#endif + NSString *documentsDirectoryPath = [paths objectAtIndex:0]; + + return [documentsDirectoryPath stringByAppendingPathComponent:@"roms"]; +} + +- (NSString *)coverArtPath +{ +#if TARGET_OS_TV + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +#else + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#endif + + return [paths.firstObject stringByAppendingPathComponent:@"Cover Art"]; +} + +- (NSString *)batterySavesPathForROM:(NSString *)romPath +{ +#if TARGET_OS_TV + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +#else + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#endif + NSString *documentsDirectoryPath = [paths objectAtIndex:0]; + NSString *batterySavesDirectory = [documentsDirectoryPath stringByAppendingPathComponent:@"Battery States"]; + + NSString *romName = [[[romPath lastPathComponent] componentsSeparatedByString:@"."] objectAtIndex:0]; + batterySavesDirectory = [batterySavesDirectory stringByAppendingPathComponent:romName]; + + NSError *error = nil; + + [[NSFileManager defaultManager] createDirectoryAtPath:batterySavesDirectory + withIntermediateDirectories:YES + attributes:nil + error:&error]; + if (error) + { + DLog(@"Error creating save state directory: %@", [error localizedDescription]); + } + + return batterySavesDirectory; +} + +- (NSString *)saveStatePathForROM:(NSString *)romPath +{ +#if TARGET_OS_TV + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +#else + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); +#endif + NSString *documentsDirectoryPath = [paths objectAtIndex:0]; + NSString *saveStateDirectory = [documentsDirectoryPath stringByAppendingPathComponent:@"Save States"]; + + NSMutableArray *filenameComponents = [[[romPath lastPathComponent] componentsSeparatedByString:@"."] mutableCopy]; + // remove extension + [filenameComponents removeLastObject]; + + NSString *romName = [filenameComponents componentsJoinedByString:@"."]; + saveStateDirectory = [saveStateDirectory stringByAppendingPathComponent:romName]; + + NSError *error = nil; + + [[NSFileManager defaultManager] createDirectoryAtPath:saveStateDirectory + withIntermediateDirectories:YES + attributes:nil + error:&error]; + if (error) + { + DLog(@"Error creating save state directory: %@", [error localizedDescription]); + } + + return saveStateDirectory; +} + @end diff --git a/Provenance/Emulator/PVEmulatorConstants.h b/Provenance/Emulator/PVEmulatorConstants.h index 2d040da40c..24bca96d58 100644 --- a/Provenance/Emulator/PVEmulatorConstants.h +++ b/Provenance/Emulator/PVEmulatorConstants.h @@ -45,3 +45,14 @@ extern NSString * const PVSG1000SystemIdentifier; extern NSString * const PV2600SystemIdentifier; extern NSString * const PV7800SystemIdentifier; extern NSString * const PV32XSystemIdentifier; +extern NSString * const PV5200SystemIdentifier; +extern NSString * const PVPokemonMiniSystemIdentifier; +extern NSString * const PVPSXSystemIdentifier; +extern NSString * const PVLynxSystemIdentifier; +extern NSString * const PVNGPSystemIdentifier; +extern NSString * const PVNGPCSystemIdentifier; +extern NSString * const PVPCESystemIdentifier; +extern NSString * const PVPCECDSystemIdentifier; +extern NSString * const PVPCFXSystemIdentifier; +extern NSString * const PVVirtualBoySystemIdentifier; +extern NSString * const PVWonderSwanSystemIdentifier; diff --git a/Provenance/Emulator/PVEmulatorConstants.m b/Provenance/Emulator/PVEmulatorConstants.m index edfc412437..69c87d4a41 100644 --- a/Provenance/Emulator/PVEmulatorConstants.m +++ b/Provenance/Emulator/PVEmulatorConstants.m @@ -45,4 +45,17 @@ NSString * const PV2600SystemIdentifier = @"com.provenance.2600"; NSString * const PV7800SystemIdentifier = @"com.provenance.7800"; NSString * const PV32XSystemIdentifier = @"com.provenance.32X"; +NSString * const PV5200SystemIdentifier = @"com.provenance.5200"; +NSString * const PVPokemonMiniSystemIdentifier = @"com.provenance.pokemonmini"; +NSString * const PVPSXSystemIdentifier = @"com.provenance.psx"; +NSString * const PVLynxSystemIdentifier = @"com.provenance.lynx"; +NSString * const PVPCESystemIdentifier = @"com.provenance.pce"; +NSString * const PVNGPSystemIdentifier = @"com.provenance.ngp"; +NSString * const PVNGPCSystemIdentifier = @"com.provenance.ngpc"; +NSString * const PVSGFXSystemIdentifier = @"com.provenance.sgfx"; +NSString * const PVPCECDSystemIdentifier = @"com.provenance.pcecd"; +NSString * const PVPCFXSystemIdentifier = @"com.provenance.pcfx"; +NSString * const PVVirtualBoySystemIdentifier = @"com.provenance.vb"; +NSString * const PVWonderSwanSystemIdentifier = @"com.provenance.ws"; +NSString * const PVWonderSwanColorSystemIdentifier = @"com.provenance.wsc"; diff --git a/Provenance/Emulator/PVEmulatorViewController.m b/Provenance/Emulator/PVEmulatorViewController.m index 26990d5466..f81d4a04a9 100644 --- a/Provenance/Emulator/PVEmulatorViewController.m +++ b/Provenance/Emulator/PVEmulatorViewController.m @@ -8,9 +8,8 @@ #import "PVEmulatorViewController.h" #import "PVGLViewController.h" -#import +#import #import "PVGame.h" -#import #import "JSButton.h" #import "JSDPad.h" #import "UIActionSheet+BlockAdditions.h" @@ -41,7 +40,6 @@ @interface PVEmulatorViewController () @property (nonatomic, strong) UIWindow *secondaryWindow; @property (nonatomic, strong) UITapGestureRecognizer *menuGestureRecognizer; - @end static __unsafe_unretained PVEmulatorViewController *_staticEmulatorViewController; @@ -157,8 +155,24 @@ - (void)viewDidLoad [self.emulatorCore setController1:[[PVControllerManager sharedManager] player1]]; [self.emulatorCore setController2:[[PVControllerManager sharedManager] player2]]; + NSString *romPath = [[self documentsPath] stringByAppendingPathComponent:[self.game romPath]]; + + NSError *error = nil; + NSString *md5Hash, *crc32Hash; + if(![[NSFileManager defaultManager] hashFileAtURL:[NSURL fileURLWithPath:romPath] md5:&md5Hash crc32:&crc32Hash error:&error]) + { + DLog(@"%@", error); + return; + } + + self.emulatorCore.romMD5 = md5Hash; + self.glViewController = [[PVGLViewController alloc] initWithEmulatorCore:self.emulatorCore]; + // Load now. Moved here becauase Mednafen needed to know what kind of game it's working with in order + // to provide the correct data for creating views. + BOOL loaded = [self.emulatorCore loadFileAtPath:romPath error:&error]; + if ([[UIScreen screens] count] > 1) { self.secondaryScreen = [[UIScreen screens] objectAtIndex:1]; @@ -197,7 +211,6 @@ - (void)viewDidLoad [self.menuButton addTarget:self action:@selector(showMenu:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.menuButton]; - if ([[PVSettingsModel sharedInstance] showFPSCount]) { _fpsLabel = [UILabel new]; _fpsLabel.textColor = [UIColor yellowColor]; @@ -236,10 +249,10 @@ - (void)viewDidLoad [self.menuButton setHidden:YES]; } - if (![self.emulatorCore loadFileAtPath:[[self documentsPath] stringByAppendingPathComponent:[self.game romPath]]]) + if (!loaded) { __weak typeof(self) weakSelf = self; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ DLog(@"Unable to load ROM at %@", [self.game romPath]); #if !TARGET_OS_TV [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; @@ -318,7 +331,6 @@ - (void)viewDidLoad // But of course, this isn't the case on iOS 9.3. YAY FRAGMENTATION. ¬_¬ // Conditionally handle the pause menu differently dependning on tvOS or iOS. FFS. - #if TARGET_OS_TV // Adding a tap gesture recognizer for the menu type will override the default 'back' functionality of tvOS if (!_menuGestureRecognizer) { diff --git a/Provenance/Emulator/PVGLViewController.m b/Provenance/Emulator/PVGLViewController.m index d52e0329c3..d62edd8af0 100644 --- a/Provenance/Emulator/PVGLViewController.m +++ b/Provenance/Emulator/PVGLViewController.m @@ -128,8 +128,11 @@ - (void)viewWillLayoutSubviews - (void)setupTexture { + //GLenum error; glGenTextures(1, &texture); + //error = glGetError(); glBindTexture(GL_TEXTURE_2D, texture); + //error = glGetError(); glTexImage2D(GL_TEXTURE_2D, 0, [self.emulatorCore internalPixelFormat], self.emulatorCore.bufferSize.width, self.emulatorCore.bufferSize.height, 0, [self.emulatorCore pixelFormat], [self.emulatorCore pixelType], self.emulatorCore.videoBuffer); if ([[PVSettingsModel sharedInstance] imageSmoothing]) { @@ -142,7 +145,9 @@ - (void)setupTexture glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + //error = glGetError(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + //error = glGetError(); } - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect @@ -157,15 +162,30 @@ - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect CGFloat texWidth = (screenSize.width / bufferSize.width); CGFloat texHeight = (screenSize.height / bufferSize.height); - vertices[0] = GLKVector3Make(-1.0, -1.0, 1.0); // Left bottom - vertices[1] = GLKVector3Make( 1.0, -1.0, 1.0); // Right bottom - vertices[2] = GLKVector3Make( 1.0, 1.0, 1.0); // Right top - vertices[3] = GLKVector3Make(-1.0, 1.0, 1.0); // Left top - - textureCoordinates[0] = GLKVector2Make(0.0f, texHeight); // Left bottom - textureCoordinates[1] = GLKVector2Make(texWidth, texHeight); // Right bottom - textureCoordinates[2] = GLKVector2Make(texWidth, 0.0f); // Right top - textureCoordinates[3] = GLKVector2Make(0.0f, 0.0f); // Left top + // Determine if core wants special sizing + BOOL widescreen = [self.emulatorCore wideScreen]; + + if(widescreen) { + vertices[0] = GLKVector3Make(-1.2, -1.0, 1.0); // Left bottom + vertices[1] = GLKVector3Make( 1.0, -1.0, 1.0); // Right bottom + vertices[2] = GLKVector3Make( 1.0, 1.0, 1.0); // Right top + vertices[3] = GLKVector3Make(-1.2, 1.0, 1.0); // Left top + + textureCoordinates[0] = GLKVector2Make(0.0f, texHeight); // Left bottom + textureCoordinates[1] = GLKVector2Make(texWidth*1.1f, texHeight); // Right bottom + textureCoordinates[2] = GLKVector2Make(texWidth*1.1f, 0.0f); // Right top + textureCoordinates[3] = GLKVector2Make(0.0f, 0.0f); // Left top + } else { + vertices[0] = GLKVector3Make(-1.0, -1.0, 1.0); // Left bottom + vertices[1] = GLKVector3Make( 1.0, -1.0, 1.0); // Right bottom + vertices[2] = GLKVector3Make( 1.0, 1.0, 1.0); // Right top + vertices[3] = GLKVector3Make(-1.0, 1.0, 1.0); // Left top + + textureCoordinates[0] = GLKVector2Make(0.0f, texHeight); // Left bottom + textureCoordinates[1] = GLKVector2Make(texWidth, texHeight); // Right bottom + textureCoordinates[2] = GLKVector2Make(texWidth, 0.0f); // Right top + textureCoordinates[3] = GLKVector2Make(0.0f, 0.0f); // + } int vertexIndices[6] = { // Front @@ -177,10 +197,11 @@ - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect triangleVertices[i] = vertices[vertexIndices[i]]; triangleTexCoords[i] = textureCoordinates[vertexIndices[i]]; } - +//GLenum error; glBindTexture(GL_TEXTURE_2D, texture); + // error = glGetError(); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, self.emulatorCore.bufferSize.width, self.emulatorCore.bufferSize.height, [self.emulatorCore pixelFormat], [self.emulatorCore pixelType], self.emulatorCore.videoBuffer); - +//error = glGetError(); if (texture) { self.effect.texture2d0.envMode = GLKTextureEnvModeReplace; @@ -191,7 +212,7 @@ - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect } [self.effect prepareToDraw]; - +//error = glGetError(); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); diff --git a/Provenance/Game Library/PVConflictViewController.h b/Provenance/Game Library/PVConflictViewController.h index 3880307ab7..d210b44aa8 100644 --- a/Provenance/Game Library/PVConflictViewController.h +++ b/Provenance/Game Library/PVConflictViewController.h @@ -12,6 +12,6 @@ @interface PVConflictViewController : UITableViewController -- (instancetype)initWithGameImporter:(PVGameImporter *)gameImporter; +- (instancetype __nonnull)initWithGameImporter:(PVGameImporter * __nonnull)gameImporter; @end diff --git a/Provenance/Game Library/PVConflictViewController.m b/Provenance/Game Library/PVConflictViewController.m index 5cbbef4352..020a45a96a 100644 --- a/Provenance/Game Library/PVConflictViewController.m +++ b/Provenance/Game Library/PVConflictViewController.m @@ -12,14 +12,14 @@ @interface PVConflictViewController () -@property (nonatomic, strong) PVGameImporter *gameImporter; -@property (nonatomic, strong) NSArray *conflictedFiles; +@property (nonatomic, strong, nonnull) PVGameImporter *gameImporter; +@property (nonatomic, strong, nullable) NSArray *conflictedFiles; @end @implementation PVConflictViewController -- (instancetype)initWithGameImporter:(PVGameImporter *)gameImporter +- (instancetype)initWithGameImporter:(PVGameImporter * __nonnull)gameImporter { if ((self = [super initWithStyle:UITableViewStylePlain])) { @@ -45,10 +45,27 @@ - (void)viewDidLoad [self updateConflictedFiles]; } +- (void)viewWillAppear:(BOOL)animated; +{ + [super viewWillAppear:animated]; + + if (!self.navigationController || self.navigationController.viewControllers.count<=1) { + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(dismiss)]; + } +} + +- (void)dismiss; +{ + [self dismissViewControllerAnimated:YES completion:nil]; +} + - (void)updateConflictedFiles { NSMutableArray *tempConflictedFiles = [NSMutableArray array]; - for (NSString *file in [self.gameImporter conflictedFiles]) + NSArray *filesInConflictsFolder = [self.gameImporter conflictedFiles]; + for (NSString *file in filesInConflictsFolder) { NSString *extension = [file pathExtension]; if ([[[PVEmulatorConfiguration sharedInstance] systemIdentifiersForFileExtension:[extension lowercaseString]] count] > 1) @@ -180,10 +197,12 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath NSString *name = [[PVEmulatorConfiguration sharedInstance] shortNameForSystemIdentifier:systemID]; [alertController addAction:[UIAlertAction actionWithTitle:name style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self.gameImporter resolveConflictsWithSolutions:@{path: systemID}]; - [self.tableView beginUpdates]; - [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop]; + // This update crashes since we remove for me on aTV. +// [self.tableView beginUpdates]; +// [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop]; [self updateConflictedFiles]; - [self.tableView endUpdates]; + [self.tableView reloadData]; +// [self.tableView endUpdates]; }]]; } } diff --git a/Provenance/Game Library/PVDirectoryWatcher.h b/Provenance/Game Library/PVDirectoryWatcher.h index a7b579f949..36b3f65f94 100644 --- a/Provenance/Game Library/PVDirectoryWatcher.h +++ b/Provenance/Game Library/PVDirectoryWatcher.h @@ -11,7 +11,7 @@ extern NSString *PVArchiveInflationFailedNotification; typedef void(^PVExtractionStartedHandler)(NSString *path); -typedef void(^PVExtractionUpdatedHandler)(NSString *path, NSInteger entryNumber, NSInteger total, unsigned long long fileSize, unsigned long long bytesRead); +typedef void(^PVExtractionUpdatedHandler)(NSString *path, NSInteger entryNumber, NSInteger total, float progress); typedef void(^PVExtractionCompleteHandler)(NSArray *paths); @interface PVDirectoryWatcher : NSObject diff --git a/Provenance/Game Library/PVDirectoryWatcher.m b/Provenance/Game Library/PVDirectoryWatcher.m index b0b3d016dd..8e8ed3bb46 100644 --- a/Provenance/Game Library/PVDirectoryWatcher.m +++ b/Provenance/Game Library/PVDirectoryWatcher.m @@ -8,12 +8,16 @@ #import "PVDirectoryWatcher.h" #import "SSZipArchive.h" +#import "LzmaSDKObjC.h" #import "PVEmulatorConfiguration.h" #import "NSDate+NSDate_SignificantDates.h" NSString *PVArchiveInflationFailedNotification = @"PVArchiveInflationFailedNotification"; -@interface PVDirectoryWatcher () +@interface PVDirectoryWatcher () { + LzmaSDKObjCReader* _reader; + NSMutableArray *_unzippedFiles; +} @property (nonatomic, readwrite, copy) NSString *path; @property (nonatomic, readwrite, copy) PVExtractionStartedHandler extractionStartedHandler; @@ -24,6 +28,12 @@ @interface PVDirectoryWatcher () @property (nonatomic, strong) NSArray *previousContents; +@end + +@interface PVDirectoryWatcher (LzmaSDKObjCReaderDelegate) +- (void) onLzmaSDKObjCReader:(nonnull LzmaSDKObjCReader *) reader + extractProgress:(float) progress; + @end @implementation PVDirectoryWatcher @@ -50,6 +60,8 @@ - (id)initWithPath:(NSString *)path extractionStartedHandler:(PVExtractionStarte } } + _unzippedFiles = [NSMutableArray array]; + self.extractionStartedHandler = startedHandler; self.extractionUpdatedHandler = updatedHandler; self.extractionCompleteHandler = completeHandler; @@ -63,7 +75,7 @@ - (id)initWithPath:(NSString *)path extractionStartedHandler:(PVExtractionStarte { for (NSString *file in contents) { - if ([[file pathExtension] isEqualToString:@"zip"]) + if ([[file pathExtension].lowercaseString isEqualToString:@"zip"] || [[file pathExtension] isEqualToString:@"7z"]) { [self extractArchiveAtPath:file]; } @@ -148,8 +160,6 @@ - (void)stopMonitoring { if (self.dispatch_source) { - self.extractionCompleteHandler = NULL; - self.path = nil; dispatch_source_cancel(self.dispatch_source); self.dispatch_source = NULL; } @@ -184,7 +194,7 @@ - (void)checkFileProgress:(NSTimer *)timer unsigned long long currentFilesize = [attributes fileSize]; if (previousFilesize == currentFilesize) { - if ([[path pathExtension] isEqualToString:@"zip"]) + if ([[path pathExtension].lowercaseString isEqualToString:@"zip"] || [[path pathExtension].lowercaseString isEqualToString:@"7z"]) { dispatch_async(self.serialQueue, ^{ [self extractArchiveAtPath:path]; @@ -207,6 +217,7 @@ - (void)checkFileProgress:(NSTimer *)timer - (void)extractArchiveAtPath:(NSString *)filePath { + if (self.extractionStartedHandler) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -219,50 +230,121 @@ - (void)extractArchiveAtPath:(NSString *)filePath return; } - NSMutableArray *unzippedFiles = [NSMutableArray array]; - [SSZipArchive unzipFileAtPath:filePath - toDestination:self.path - overwrite:YES - password:nil - progressHandler:^(NSString *entry, unz_file_info zipInfo, long entryNumber, long total, unsigned long long fileSize, unsigned long long bytesRead) { - if ([entry length]) - { - [unzippedFiles addObject:entry]; - } - if (self.extractionUpdatedHandler) - { - dispatch_async(dispatch_get_main_queue(), ^{ - self.extractionUpdatedHandler(filePath, entryNumber, total, fileSize, bytesRead); - }); + NSString *path = self.path; + // self.path will be nil when we call stop + [self stopMonitoring]; + + if ([[filePath pathExtension].lowercaseString isEqualToString:@"zip"]) { + [SSZipArchive unzipFileAtPath:filePath + toDestination:path + overwrite:YES + password:nil + progressHandler:^(NSString *entry, unz_file_info zipInfo, long entryNumber, long total, unsigned long long fileSize, unsigned long long bytesRead) { + if ([entry length]) + { + [_unzippedFiles addObject:entry]; + } + if (self.extractionUpdatedHandler) + { + dispatch_async(dispatch_get_main_queue(), ^{ + self.extractionUpdatedHandler(filePath, entryNumber, total, bytesRead/fileSize); + }); + } } - } - completionHandler:^(NSString *path, BOOL succeeded, NSError *error) { - if (succeeded) - { - if (self.extractionCompleteHandler) + completionHandler:^(NSString *path, BOOL succeeded, NSError *error) { + if (succeeded) + { + if (self.extractionCompleteHandler) + { + NSArray *unzippedItems = [_unzippedFiles copy]; + dispatch_async(dispatch_get_main_queue(), ^{ + self.extractionCompleteHandler(unzippedItems); + }); + } + + NSError *deleteError = nil; + BOOL deleted = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&deleteError]; + + if (!deleted) + { + DLog(@"Unable to delete file at path %@, because %@", filePath, [deleteError localizedDescription]); + } + } + else { + DLog(@"Unable to unzip file: %@ because: %@", filePath, [error localizedDescription]); dispatch_async(dispatch_get_main_queue(), ^{ - self.extractionCompleteHandler([unzippedFiles copy]); + [[NSNotificationCenter defaultCenter] postNotificationName:PVArchiveInflationFailedNotification + object:self]; }); } - NSError *deleteError = nil; - BOOL deleted = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&deleteError]; - - if (!deleted) - { - DLog(@"Unable to delete file at path %@, because %@", filePath, [error localizedDescription]); - } - } - else - { - DLog(@"Unable to unzip file: %@ because: %@", filePath, [error localizedDescription]); - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:PVArchiveInflationFailedNotification - object:self]; - }); - } - }]; + [_unzippedFiles removeAllObjects]; + [self startMonitoring]; + }]; + + } else if([[filePath pathExtension].lowercaseString isEqualToString:@"7z"]) { + _reader = [[LzmaSDKObjCReader alloc] initWithFileURL:[NSURL fileURLWithPath:filePath] + andType:LzmaSDKObjCFileType7z]; + + _reader.delegate = self; + NSError * error = nil; + if (![_reader open:&error]) { + NSLog(@"Open error: %@", error); + } + + NSMutableArray * items = [NSMutableArray array]; // Array with selected items. + // Iterate all archive items, track what items do you need & hold them in array. + [_reader iterateWithHandler:^BOOL(LzmaSDKObjCItem * item, NSError * error){ + if (item) { + [items addObject:item]; // if needs this item - store to array. + if (!item.isDirectory && item.fileName != nil) { + NSString*fullPath = [path stringByAppendingPathComponent:item.fileName]; + [_unzippedFiles addObject:fullPath]; + } + } + return YES; // YES - continue iterate, NO - stop iteration + }]; + [self stopMonitoring]; + + [_reader extract:items + toPath:path + withFullPaths:NO]; + } +} + +@end + +@implementation PVDirectoryWatcher (LzmaSDKObjCReaderDelegate) +- (void) onLzmaSDKObjCReader:(nonnull LzmaSDKObjCReader *) reader + extractProgress:(float) progress { + if (progress >= 1) { + if (self.extractionCompleteHandler) + { + NSArray *unzippedItems = [_unzippedFiles copy]; + dispatch_async(dispatch_get_main_queue(), ^{ + self.extractionCompleteHandler(unzippedItems); + }); + } + + NSError *deleteError = nil; + BOOL deleted = [[NSFileManager defaultManager] removeItemAtURL:reader.fileURL error:&deleteError]; + + if (!deleted) + { + DLog(@"Unable to delete file at path %@, because %@", reader.fileURL.absoluteString , [deleteError localizedDescription]); + } + + [_unzippedFiles removeAllObjects]; + [self startMonitoring]; + } else { + if (self.extractionUpdatedHandler) + { + dispatch_async(dispatch_get_main_queue(), ^{ + self.extractionUpdatedHandler(reader.fileURL.path, floor(reader.itemsCount * progress), reader.itemsCount, progress); + }); + } + } } @end diff --git a/Provenance/Game Library/PVGameImporter.h b/Provenance/Game Library/PVGameImporter.h index ec29ffc30b..c26bf0a5fb 100644 --- a/Provenance/Game Library/PVGameImporter.h +++ b/Provenance/Game Library/PVGameImporter.h @@ -46,3 +46,7 @@ typedef void (^PVGameImporterFinishedGettingArtworkHandler)(NSString *artworkURL + (PVGame *)importArtworkFromPath:(NSString *)imageFullPath; @end + +@interface PVGameImporter (Private) +- (NSString *)documentsPath; +@end diff --git a/Provenance/Game Library/PVGameImporter.m b/Provenance/Game Library/PVGameImporter.m index 8d308dafb3..97a6d69063 100644 --- a/Provenance/Game Library/PVGameImporter.m +++ b/Provenance/Game Library/PVGameImporter.m @@ -19,6 +19,61 @@ #import "UIImage+Scaling.h" #import "NSData+Hashing.h" + +@interface NSArray (Map) + +- (NSArray *)mapObjectsUsingBlock:(id (^)(id obj, NSUInteger idx))block; + +@end + +@implementation NSArray (Map) + +- (NSArray *)mapObjectsUsingBlock:(id (^)(id obj, NSUInteger idx))block { + NSMutableArray *result = [NSMutableArray arrayWithCapacity:[self count]]; + [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [result addObject:block(obj, idx)]; + }]; + return result; +} + +@end + +@interface ImportCanidateFile : NSObject +@property (nonatomic, strong, nonnull) NSString *filePath; +@property (nonatomic, strong, nonnull) NSString *md5; + +- (instancetype)initWithFilePath:(NSString* _Nonnull)filePath; +@end + + +@implementation ImportCanidateFile { + NSString * _hastStore; + dispatch_once_t _hashToken; + +} + +- (instancetype)initWithFilePath:(NSString* _Nonnull)filePath +{ + self = [super init]; + if (self) { + _filePath = filePath; + } + return self; +} + +-(NSString* _Nonnull)md5 { + dispatch_once(&_hashToken, ^{ + if (_hastStore == nil) { + NSFileManager *fm = [NSFileManager defaultManager]; + _hastStore = [fm MD5ForFileAtPath:_filePath fromOffset:0]; + } + }); + + return _hastStore; +} + +@end + @interface PVGameImporter () @property (nonatomic, readwrite, strong) dispatch_queue_t serialImportQueue; @@ -32,28 +87,26 @@ @implementation PVGameImporter - (instancetype)initWithCompletionHandler:(PVGameImporterCompletionHandler)completionHandler { - if ((self = [super init])) + if ((self = [self init])) { - self.serialImportQueue = dispatch_queue_create("com.jamsoftonline.provenance.serialImportQueue", DISPATCH_QUEUE_SERIAL); - self.systemToPathMap = [self updateSystemToPathMap]; - self.romToSystemMap = [self updateRomToSystemMap]; - self.completionHandler = completionHandler; + _completionHandler = completionHandler; } return self; } -- (void)dealloc +- (instancetype)init { - self.openVGDB = nil; - self.serialImportQueue = nil; - self.importStartedHandler = nil; - self.completionHandler = nil; - self.finishedImportHandler = nil; - self.finishedArtworkHandler = nil; + self = [super init]; + if (self) { + _serialImportQueue = dispatch_queue_create("com.jamsoftonline.provenance.serialImportQueue", DISPATCH_QUEUE_SERIAL); + _systemToPathMap = [self updateSystemToPathMap]; + _romToSystemMap = [self updateRomToSystemMap]; + } + return self; } -- (void)startImportForPaths:(NSArray *)paths +- (void)startImportForPaths:(NSArray *)paths { dispatch_async(self.serialImportQueue, ^{ NSArray *newPaths = [self importFilesAtPaths:paths]; @@ -67,27 +120,43 @@ - (void)startImportForPaths:(NSArray *)paths }); } -- (NSArray *)importFilesAtPaths:(NSArray *)paths +- (NSArray *)importFilesAtPaths:(NSArray *)paths { - NSMutableArray *newPaths = [NSMutableArray array]; + NSMutableArray *newPaths = [NSMutableArray array]; + + // Reorder .cue's first.this is so we find cue's before their bins. + paths = [paths sortedArrayUsingComparator:^NSComparisonResult(NSString* _Nonnull obj1, NSString* _Nonnull obj2) { + if ([obj1.pathExtension isEqualToString:@"cue"]) { + return NSOrderedAscending; + } else if ([obj2.pathExtension isEqualToString:@"cue"]) { + return NSOrderedDescending; + } else { + return [obj1 compare:obj2]; + } + }]; - // do CDs first to avoid the case where an item related to CDs is mistaken as another rom and moved before processing its CD cue sheet or something - for (NSString *path in paths) + NSArray *canidateFiles = [paths mapObjectsUsingBlock:^ImportCanidateFile*(NSString* path, NSUInteger idx) { + return [[ImportCanidateFile alloc] initWithFilePath:[[self romsPath] stringByAppendingPathComponent:path]]; + }]; + + // do CDs first to avoid the case where an item related to CDs is mistaken as another rom and moved + // before processing its CD cue sheet or something + for (ImportCanidateFile *canidate in canidateFiles) { - if ([[NSFileManager defaultManager] fileExistsAtPath:[[self romsPath] stringByAppendingPathComponent:path]]) + if ([[NSFileManager defaultManager] fileExistsAtPath:canidate.filePath]) { - if ([self isCDROM:path]) + if ([self isCDROM:canidate]) { - [newPaths addObjectsFromArray:[self moveCDROMToAppropriateSubfolder:path]]; + [newPaths addObjectsFromArray:[self moveCDROMToAppropriateSubfolder:canidate]]; } } } - for (NSString *path in paths) + for (ImportCanidateFile *canidate in canidateFiles) { - if ([[NSFileManager defaultManager] fileExistsAtPath:[[self romsPath] stringByAppendingPathComponent:path]]) + if ([[NSFileManager defaultManager] fileExistsAtPath:canidate.filePath]) { - NSString *newPath = [self moveROMToAppropriateSubfolder:path]; + NSString *newPath = [self moveROMToAppropriateSubfolder:canidate]; if ([newPath length]) { [newPaths addObject:newPath]; @@ -98,19 +167,70 @@ - (NSArray *)importFilesAtPaths:(NSArray *)paths return newPaths; } -- (NSArray *)moveCDROMToAppropriateSubfolder:(NSString *)filePath +-(OESQLiteDatabase*)openVGDB { + if (_openVGDB == nil) { + NSError *error; + _openVGDB = [[OESQLiteDatabase alloc] initWithURL:[[NSBundle mainBundle] URLForResource:@"openvgdb" withExtension:@"sqlite"] + error:&error]; + + if (_openVGDB == nil) { + DLog(@"Unable to open game database: %@", [error localizedDescription]); + return nil; + } + } + + return _openVGDB; +} + +-(NSString*)systemIdForROMCanidate:(ImportCanidateFile*)rom { + + NSString*md5 = rom.md5; + NSString*fileName = rom.filePath.lastPathComponent; + + NSError*error; + NSArray*> *results = nil; + NSString *queryString = [NSString stringWithFormat:@"SELECT DISTINCT systemID FROM ROMs WHERE romHashMD5 = '%@' OR romFileName = '%@'", md5, fileName]; + + results = [self.openVGDB executeQuery:queryString + error:&error]; + + if (!results) { + DLog(@"Unable to find rom by MD5: %@", error.localizedDescription); + } + + if (results.count) { + NSString *databaseID = results[0][@"systemID"].description; + PVEmulatorConfiguration *config = [PVEmulatorConfiguration sharedInstance]; + NSString *systemID = [config systemIDForDatabaseID:databaseID]; + + return systemID; + } else { + return nil; + } +} + +- (NSArray *)moveCDROMToAppropriateSubfolder:(ImportCanidateFile *)canidateFile { NSMutableArray *newPaths = [NSMutableArray array]; - NSArray *systemsForExtension = [self systemIDsForRomAtPath:filePath]; + NSArray *systemsForExtension = [self systemIDsForRomAtPath:canidateFile.filePath]; NSString *systemID = nil; NSString *subfolderPath = nil; if ([systemsForExtension count] > 1) { - subfolderPath = [self conflictPath]; - self.encounteredConflicts = YES; + // Try to match by MD5 or filename + NSString*systemID = [self systemIdForROMCanidate:canidateFile]; + + if (systemID != nil) { + subfolderPath = self.systemToPathMap[systemID]; + } + else { + // No MD5 match, so move to conflict dir + subfolderPath = [self conflictPath]; + self.encounteredConflicts = YES; + } } else { @@ -133,68 +253,105 @@ - (NSArray *)moveCDROMToAppropriateSubfolder:(NSString *)filePath return nil; } - if (![[NSFileManager defaultManager] moveItemAtPath:[[self romsPath] stringByAppendingPathComponent:filePath] toPath:[subfolderPath stringByAppendingPathComponent:filePath] error:&error]) + if (![[NSFileManager defaultManager] moveItemAtPath:[[self romsPath] stringByAppendingPathComponent:canidateFile.filePath.lastPathComponent] + toPath:[subfolderPath stringByAppendingPathComponent:canidateFile.filePath.lastPathComponent] + error:&error]) { - DLog(@"Unable to move file from %@ to %@ - %@", filePath, subfolderPath, [error localizedDescription]); + DLog(@"Unable to move file from %@ to %@ - %@", canidateFile, subfolderPath, [error localizedDescription]); return nil; } - NSString *cueSheetPath = [subfolderPath stringByAppendingPathComponent:filePath]; + NSString *cueSheetPath = [subfolderPath stringByAppendingPathComponent:canidateFile.filePath]; if (!self.encounteredConflicts) { [newPaths addObject:cueSheetPath]; } // moved the .cue, now move .bins .imgs etc + [self moveFilesSimiliarToFilename:canidateFile.filePath.lastPathComponent + fromDirectory:[self romsPath] + toDirectory:subfolderPath + cuesheet:cueSheetPath]; - NSString *relatedFileName = [filePath stringByReplacingOccurrencesOfString:[filePath pathExtension] withString:@""]; + return [newPaths copy]; +} + +-(void)moveFilesSimiliarToFilename:(NSString* _Nonnull)filename fromDirectory:(NSString* _Nonnull)from toDirectory:(NSString* _Nonnull)to cuesheet:(NSString*)cueSheetPath{ + NSError*error; + NSString *relatedFileName = [filename stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@".%@",[filename pathExtension]] withString:@""]; NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self romsPath] error:&error]; if (!contents) { DLog(@"Error scanning %@, %@", [self romsPath], [error localizedDescription]); - return [newPaths copy]; + return; } for (NSString *file in contents) { - NSString *fileWithoutExtension = [file stringByReplacingOccurrencesOfString:[file pathExtension] withString:@""]; + NSString *fileWithoutExtension = [file stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@".%@",[file pathExtension]] withString:@""]; + + // Some cue's have multiple bins, like, Game.cue Game (Track 1).bin, Game (Track 2).bin .... + // Clip down the file name to the length of the .cue to see if they start to match + if (fileWithoutExtension.length > relatedFileName.length) { + fileWithoutExtension = [fileWithoutExtension substringWithRange:NSMakeRange(0, relatedFileName.length)]; + } if ([fileWithoutExtension isEqual:relatedFileName]) { // Before moving the file, make sure the cue sheet's reference uses the same case. - NSMutableString *cuesheet = [NSMutableString stringWithContentsOfFile:cueSheetPath encoding:NSUTF8StringEncoding error:&error]; - if (cuesheet) - { - NSRange range = [cuesheet rangeOfString:file options:NSCaseInsensitiveSearch]; - [cuesheet replaceCharactersInRange:range withString:file]; - if (![cuesheet writeToFile:cueSheetPath - atomically:NO - encoding:NSUTF8StringEncoding - error:&error]) + if (cueSheetPath) { + NSMutableString *cuesheet = [NSMutableString stringWithContentsOfFile:cueSheetPath encoding:NSUTF8StringEncoding error:&error]; + if (cuesheet) + { + NSRange range = [cuesheet rangeOfString:file options:NSCaseInsensitiveSearch]; + [cuesheet replaceCharactersInRange:range withString:file]; + if (![cuesheet writeToFile:cueSheetPath + atomically:NO + encoding:NSUTF8StringEncoding + error:&error]) + { + DLog(@"Unable to rewrite cuesheet %@ because %@", cueSheetPath, [error localizedDescription]); + } + } + else { - DLog(@"Unable to rewrite cuesheet %@ because %@", cueSheetPath, [error localizedDescription]); + DLog(@"Unable to read cue sheet %@ because %@", cueSheetPath, [error localizedDescription]); } } - else - { - DLog(@"Unable to read cue sheet %@ because %@", cueSheetPath, [error localizedDescription]); - } - - - if (![[NSFileManager defaultManager] moveItemAtPath:[[self romsPath] stringByAppendingPathComponent:file] toPath:[subfolderPath stringByAppendingPathComponent:file] error:&error]) + if (![[NSFileManager defaultManager] moveItemAtPath:[[self romsPath] stringByAppendingPathComponent:file] toPath:[to stringByAppendingPathComponent:file] error:&error]) { - DLog(@"Unable to move file from %@ to %@ - %@", filePath, subfolderPath, [error localizedDescription]); + DLog(@"Unable to move file from %@ to %@ - %@", filename, to, [error localizedDescription]); + } else { + DLog(@"Moved file from %@ to %@", filename, to); } } } +} + +- (BIOSEntry*)moveIfBIOS:(ImportCanidateFile*)canidateFile { + PVEmulatorConfiguration *config = [PVEmulatorConfiguration sharedInstance]; + + BIOSEntry *bios; + + // Check if BIOS by filename - should possibly just only check MD5? + if ((bios = [config biosEntryForFilename:canidateFile.filePath.lastPathComponent])) { + return bios; + } else { + // Now check by MD5 + NSString *fileMD5 = canidateFile.md5; + if ((bios = [config biosEntryForMD5:fileMD5])) { + return bios; + } + } - return [newPaths copy]; + return nil; } -- (NSString *)moveROMToAppropriateSubfolder:(NSString *)filePath +- (NSString *)moveROMToAppropriateSubfolder:(ImportCanidateFile*)canidateFile { + NSString *filePath = canidateFile.filePath; NSString *newPath = nil; NSArray *systemsForExtension = [self systemIDsForRomAtPath:filePath]; @@ -202,8 +359,76 @@ - (NSString *)moveROMToAppropriateSubfolder:(NSString *)filePath NSString *systemID = nil; NSString *subfolderPath = nil; + NSFileManager*fm = [NSFileManager defaultManager]; + + // Check first if known BIOS + BIOSEntry *biosEntry = [self moveIfBIOS:canidateFile]; + if (biosEntry) { + + PVEmulatorConfiguration*config = [PVEmulatorConfiguration sharedInstance]; + NSString *biosDirectory = [config BIOSPathForSystemID:biosEntry.systemID]; + NSString *destiaionPath = [biosDirectory stringByAppendingPathComponent:biosEntry.filename]; + + NSError *error = nil; + + if (![fm fileExistsAtPath:biosDirectory]) { + [fm createDirectoryAtPath:biosDirectory + withIntermediateDirectories:YES + attributes:nil + error:&error]; + + if (error) { + DLog(@"Unable to create BIOS directory %@, %@", biosDirectory, error.localizedDescription); + } + } + + if (![fm moveItemAtPath:filePath + toPath:destiaionPath + error:&error]) + { + if ([error code] == NSFileWriteFileExistsError) + { + DLog(@"Unable to delete %@ (after trying to move and getting 'file exists error', because %@", filePath, [error localizedDescription]); + } + } + return nil; + } + if ([systemsForExtension count] > 1) { + + // Check by MD5 + NSString *fileMD5 = canidateFile.md5.uppercaseString; + NSArray *results; + for (NSString *system in systemsForExtension) { + NSError* error; + // TODO: Would be better performance to search EVERY system MD5 in a single query? + results = [self searchDatabaseUsingKey:@"romHashMD5" + value:fileMD5 + systemID:system + error:&error]; + break; + } + + if (results.count) { + NSDictionary *chosenResult = nil; + for (NSDictionary *result in results) + { + if ([result[@"region"] isEqualToString:@"USA"]) + { + chosenResult = result; + break; + } + } + + if (!chosenResult) + { + chosenResult = [results firstObject]; + } + + + } + subfolderPath = [self conflictPath]; self.encounteredConflicts = YES; } @@ -219,21 +444,21 @@ - (NSString *)moveROMToAppropriateSubfolder:(NSString *)filePath } NSError *error = nil; - if (![[NSFileManager defaultManager] createDirectoryAtPath:subfolderPath - withIntermediateDirectories:YES - attributes:nil - error:&error]) + if (![fm createDirectoryAtPath:subfolderPath + withIntermediateDirectories:YES + attributes:nil + error:&error]) { DLog(@"Unable to create %@ - %@", subfolderPath, [error localizedDescription]); return nil; } - if (![[NSFileManager defaultManager] moveItemAtPath:[[self romsPath] stringByAppendingPathComponent:filePath] toPath:[subfolderPath stringByAppendingPathComponent:filePath] error:&error]) + if (![fm moveItemAtPath:filePath toPath:[subfolderPath stringByAppendingPathComponent:filePath.lastPathComponent] error:&error]) { if ([error code] == NSFileWriteFileExistsError) { - if (![[NSFileManager defaultManager] removeItemAtPath:[[self romsPath] stringByAppendingPathComponent:filePath] error:&error]) + if (![fm removeItemAtPath:filePath error:&error]) { DLog(@"Unable to delete %@ (after trying to move and getting 'file exists error', because %@", filePath, [error localizedDescription]); } @@ -245,7 +470,7 @@ - (NSString *)moveROMToAppropriateSubfolder:(NSString *)filePath if (!self.encounteredConflicts) { - newPath = [subfolderPath stringByAppendingPathComponent:filePath]; + newPath = [subfolderPath stringByAppendingPathComponent:filePath.lastPathComponent]; } return newPath; @@ -282,12 +507,16 @@ - (void)resolveConflictsWithSolutions:(NSDictionary *)solutions // moved the .cue, now move .bins .imgs etc NSString *cueSheetPath = [subfolder stringByAppendingPathComponent:filePath]; - NSString *relatedFileName = [filePath stringByReplacingOccurrencesOfString:[filePath pathExtension] withString:@""]; + NSString *relatedFileName = filePath.stringByDeletingPathExtension; NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self conflictPath] error:&error]; for (NSString *file in contents) { - NSString *fileWithoutExtension = [file stringByReplacingOccurrencesOfString:[file pathExtension] withString:@""]; + // Crop out any extra info in the .bin files, like Game.cue and Game (Track 1).bin, we want to match up to just 'Game' + NSString *fileWithoutExtension = [file stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@".%@", [file pathExtension]] withString:@""]; + if (fileWithoutExtension.length > relatedFileName.length) { + fileWithoutExtension = [fileWithoutExtension substringWithRange:NSMakeRange(0, relatedFileName.length)]; + } if ([fileWithoutExtension isEqual:relatedFileName]) { @@ -296,13 +525,17 @@ - (void)resolveConflictsWithSolutions:(NSDictionary *)solutions if (cuesheet) { NSRange range = [cuesheet rangeOfString:file options:NSCaseInsensitiveSearch]; - [cuesheet replaceCharactersInRange:range withString:file]; - if (![cuesheet writeToFile:cueSheetPath - atomically:NO - encoding:NSUTF8StringEncoding - error:&error]) - { - DLog(@"Unable to rewrite cuesheet %@ because %@", cueSheetPath, [error localizedDescription]); + if (range.location != NSNotFound) { + [cuesheet replaceCharactersInRange:range withString:file]; + if (![cuesheet writeToFile:cueSheetPath + atomically:NO + encoding:NSUTF8StringEncoding + error:&error]) + { + DLog(@"Unable to rewrite cuesheet %@ because %@", cueSheetPath, [error localizedDescription]); + } + } else { + DLog(@"Range of string <%@> not found in file <%@>", file, cueSheetPath); } } else @@ -459,7 +692,7 @@ - (void)lookupInfoForGame:(PVGame *)game NSRange nonCharRange = [fileName rangeOfCharacterFromSet:charSet]; NSUInteger gameTitleLen; - if (nonCharRange.length > 0) { + if (nonCharRange.length > 0 && nonCharRange.location > 1) { gameTitleLen = nonCharRange.location - 1; } else { gameTitleLen = [fileName length]; @@ -660,13 +893,13 @@ - (NSArray *)systemIDsForRomAtPath:(NSString *)path return self.romToSystemMap[fileExtension]; } -- (BOOL)isCDROM:(NSString *)filePath +- (BOOL)isCDROM:(ImportCanidateFile *)romFile { BOOL isCDROM = NO; PVEmulatorConfiguration *emuConfig = [PVEmulatorConfiguration sharedInstance]; NSArray *cdExtensions = [emuConfig supportedCDFileExtensions]; - NSString *extension = [filePath pathExtension]; + NSString *extension = [romFile.filePath pathExtension]; if ([cdExtensions containsObject:extension]) { isCDROM = YES; diff --git a/Provenance/Game Library/PVGameLibraryViewController.m b/Provenance/Game Library/PVGameLibraryViewController.m index 3f485119af..e5131dc379 100644 --- a/Provenance/Game Library/PVGameLibraryViewController.m +++ b/Provenance/Game Library/PVGameLibraryViewController.m @@ -259,98 +259,6 @@ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender #pragma mark - Filesystem Helpers -- (NSString *)documentsPath -{ -#if TARGET_OS_TV - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); -#else - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -#endif - NSString *documentsDirectoryPath = [paths objectAtIndex:0]; - - return documentsDirectoryPath; -} - -- (NSString *)romsPath -{ -#if TARGET_OS_TV - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); -#else - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -#endif - NSString *documentsDirectoryPath = [paths objectAtIndex:0]; - - return [documentsDirectoryPath stringByAppendingPathComponent:@"roms"]; -} - -- (NSString *)coverArtPath -{ -#if TARGET_OS_TV - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); -#else - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -#endif - - return [paths.firstObject stringByAppendingPathComponent:@"Cover Art"]; -} - -- (NSString *)batterySavesPathForROM:(NSString *)romPath -{ -#if TARGET_OS_TV - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); -#else - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -#endif - NSString *documentsDirectoryPath = [paths objectAtIndex:0]; - NSString *batterySavesDirectory = [documentsDirectoryPath stringByAppendingPathComponent:@"Battery States"]; - - NSString *romName = [[[romPath lastPathComponent] componentsSeparatedByString:@"."] objectAtIndex:0]; - batterySavesDirectory = [batterySavesDirectory stringByAppendingPathComponent:romName]; - - NSError *error = nil; - - [[NSFileManager defaultManager] createDirectoryAtPath:batterySavesDirectory - withIntermediateDirectories:YES - attributes:nil - error:&error]; - if (error) - { - DLog(@"Error creating save state directory: %@", [error localizedDescription]); - } - - return batterySavesDirectory; -} - -- (NSString *)saveStatePathForROM:(NSString *)romPath -{ -#if TARGET_OS_TV - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); -#else - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); -#endif - NSString *documentsDirectoryPath = [paths objectAtIndex:0]; - NSString *saveStateDirectory = [documentsDirectoryPath stringByAppendingPathComponent:@"Save States"]; - - NSMutableArray *filenameComponents = [[[romPath lastPathComponent] componentsSeparatedByString:@"."] mutableCopy]; - // remove extension - [filenameComponents removeLastObject]; - - NSString *romName = [filenameComponents componentsJoinedByString:@"."]; - saveStateDirectory = [saveStateDirectory stringByAppendingPathComponent:romName]; - - NSError *error = nil; - - [[NSFileManager defaultManager] createDirectoryAtPath:saveStateDirectory - withIntermediateDirectories:YES - attributes:nil - error:&error]; - if (error) - { - DLog(@"Error creating save state directory: %@", [error localizedDescription]); - } - - return saveStateDirectory; -} - (IBAction)getMoreROMs { @@ -391,11 +299,6 @@ - (IBAction)getMoreROMs } } -- (NSString *)BIOSPathForSystemID:(NSString *)systemID -{ - return [[[self documentsPath] stringByAppendingPathComponent:@"BIOS"] stringByAppendingPathComponent:systemID]; -} - #pragma mark - Game Library Management - (void)migrateLibrary @@ -421,7 +324,9 @@ - (void)migrateLibrary DLog(@"Unable to delete PVGame.sqlite-wal because %@", [error localizedDescription]); } - if (![[NSFileManager defaultManager] createDirectoryAtPath:[self romsPath] + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + + if (![[NSFileManager defaultManager] createDirectoryAtPath:[config romsPath] withIntermediateDirectories:YES attributes:nil error:&error]) @@ -430,7 +335,7 @@ - (void)migrateLibrary return; // dunno what else can be done if this fails } - NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self documentsPath] error:&error]; + NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[config documentsPath] error:&error]; if (!contents) { DLog(@"Unable to get contents of documents because %@", [error localizedDescription]); @@ -438,16 +343,16 @@ - (void)migrateLibrary for (NSString *path in contents) { - NSString *fullPath = [[self documentsPath] stringByAppendingPathComponent:path]; + NSString *fullPath = [[config documentsPath] stringByAppendingPathComponent:path]; BOOL isDir = NO; BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir]; if (exists && !isDir && ![[path lowercaseString] containsString:@"realm"]) { if (![[NSFileManager defaultManager] moveItemAtPath:fullPath - toPath:[[self romsPath] stringByAppendingPathComponent:path] + toPath:[[config romsPath] stringByAppendingPathComponent:path] error:&error]) { - DLog(@"Unable to move %@ to %@ because %@", fullPath, [[self romsPath] stringByAppendingPathComponent:path], [error localizedDescription]); + DLog(@"Unable to move %@ to %@ because %@", fullPath, [[config romsPath] stringByAppendingPathComponent:path], [error localizedDescription]); } } } @@ -457,7 +362,7 @@ - (void)migrateLibrary [[NSUserDefaults standardUserDefaults] setBool:NO forKey:PVRequiresMigrationKey]; [self setUpGameLibrary]; - [self.gameImporter startImportForPaths:[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self romsPath] error:&error]]; + [self.gameImporter startImportForPaths:[[NSFileManager defaultManager] contentsOfDirectoryAtPath:[config romsPath] error:&error]]; } - (void)setUpGameLibrary @@ -466,6 +371,8 @@ - (void)setUpGameLibrary __weak typeof(self) weakSelf = self; + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + self.gameImporter = [[PVGameImporter alloc] initWithCompletionHandler:^(BOOL encounteredConflicts) { if (encounteredConflicts) { @@ -498,7 +405,11 @@ - (void)setUpGameLibrary [weakSelf finishedDownloadingArtworkForURL:url]; }]; - self.watcher = [[PVDirectoryWatcher alloc] initWithPath:[self romsPath] + NSArray *existingFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[config romsPath] + error:nil]; + [self.gameImporter startImportForPaths:existingFiles]; + + self.watcher = [[PVDirectoryWatcher alloc] initWithPath:[config romsPath] extractionStartedHandler:^(NSString *path) { MBProgressHUD *hud = [MBProgressHUD HUDForView:weakSelf.view]; if (!hud) @@ -508,14 +419,24 @@ - (void)setUpGameLibrary [hud setUserInteractionEnabled:NO]; [hud setMode:MBProgressHUDModeAnnularDeterminate]; [hud setProgress:0]; - [hud setLabelText:@"Extracting Archive..."]; +#if TARGET_OS_TV + NSString *label = [NSString stringWithFormat:@"Extracting Archive: %@", path.lastPathComponent]; +#else + NSString *label = @"Extracting Archive..."; +#endif + [hud setLabelText:label]; } - extractionUpdatedHandler:^(NSString *path, NSInteger entryNumber, NSInteger total, unsigned long long fileSize, unsigned long long bytesRead) { + extractionUpdatedHandler:^(NSString *path, NSInteger entryNumber, NSInteger total, float progress) { MBProgressHUD *hud = [MBProgressHUD HUDForView:weakSelf.view]; [hud setUserInteractionEnabled:NO]; [hud setMode:MBProgressHUDModeAnnularDeterminate]; - [hud setProgress:(float)bytesRead / (float)fileSize]; - [hud setLabelText:@"Extracting Archive..."]; + [hud setProgress:progress]; +#if TARGET_OS_TV + NSString *label = [NSString stringWithFormat:@"Extracting Archive: %@", path.lastPathComponent]; +#else + NSString *label = @"Extracting Archive..."; +#endif + [hud setLabelText:label]; } extractionCompleteHandler:^(NSArray *paths) { MBProgressHUD *hud = [MBProgressHUD HUDForView:weakSelf.view]; @@ -528,7 +449,7 @@ - (void)setUpGameLibrary }]; [self.watcher startMonitoring]; - self.coverArtWatcher = [[PVDirectoryWatcher alloc] initWithPath:self.coverArtPath extractionStartedHandler:^(NSString *path) { + self.coverArtWatcher = [[PVDirectoryWatcher alloc] initWithPath:config.coverArtPath extractionStartedHandler:^(NSString *path) { MBProgressHUD *hud = [MBProgressHUD HUDForView:weakSelf.view]; if (!hud) { @@ -539,9 +460,9 @@ - (void)setUpGameLibrary [hud setMode:MBProgressHUDModeAnnularDeterminate]; [hud setProgress:0]; [hud setLabelText:@"Extracting Archive…"]; - } extractionUpdatedHandler:^(NSString *path, NSInteger entryNumber, NSInteger total, unsigned long long fileSize, unsigned long long bytesRead) { + } extractionUpdatedHandler:^(NSString *path, NSInteger entryNumber, NSInteger total, float progress) { MBProgressHUD *hud = [MBProgressHUD HUDForView:weakSelf.view]; - [hud setProgress:(float)bytesRead / (float)fileSize]; + [hud setProgress:progress]; } extractionCompleteHandler:^(NSArray *paths) { MBProgressHUD *hud = [MBProgressHUD HUDForView:weakSelf.view]; [hud setProgress:1]; @@ -549,7 +470,7 @@ - (void)setUpGameLibrary [hud hide:YES afterDelay:0.5]; for (NSString *imageFilepath in paths) { - NSString *imageFullPath = [weakSelf.coverArtPath stringByAppendingPathComponent:imageFilepath]; + NSString *imageFullPath = [config.coverArtPath stringByAppendingPathComponent:imageFilepath]; PVGame *game = [PVGameImporter importArtworkFromPath:imageFullPath]; NSArray *indexPaths = [weakSelf indexPathsForGameWithMD5Hash:game.md5Hash]; [weakSelf.collectionView reloadItemsAtIndexPaths:indexPaths]; @@ -561,7 +482,7 @@ - (void)setUpGameLibrary NSArray *systems = [[PVEmulatorConfiguration sharedInstance] availableSystemIdentifiers]; for (NSString *systemID in systems) { - NSString *systemDir = [[self documentsPath] stringByAppendingPathComponent:systemID]; + NSString *systemDir = [[config documentsPath] stringByAppendingPathComponent:systemID]; if ([[NSFileManager defaultManager] fileExistsAtPath:systemDir]) { NSError *error = nil; @@ -786,7 +707,9 @@ - (void)handleArchiveInflationFailed:(NSNotification *)note - (void)handleRefreshLibrary:(NSNotification *)note { - NSString *documentsPath = [self documentsPath]; + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + + NSString *documentsPath = [config documentsPath]; NSMutableArray *romPaths = [NSMutableArray array]; for (PVGame *game in [PVGame allObjectsInRealm:self.realm]) @@ -812,16 +735,33 @@ - (void)handleRefreshLibrary:(NSNotification *)note // }); } +-(void)createBiosDirectoryAtPath:(NSString*)biosPath { + NSFileManager *fm = [NSFileManager defaultManager]; + if (![fm fileExistsAtPath:biosPath]) { + NSError *error; + BOOL success = [fm createDirectoryAtPath:biosPath + withIntermediateDirectories:YES + attributes:nil + error:&error]; + if (!success) { + NSLog(@"Error creating BIOS dir: %@", error.localizedDescription); + } + } +} + +typedef NSDictionary BiosDictionary; + - (BOOL)canLoadGame:(PVGame *)game { BOOL canLoad = YES; - + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + NSDictionary *system = [[PVEmulatorConfiguration sharedInstance] systemForIdentifier:[game systemIdentifier]]; BOOL requiresBIOS = [system[PVRequiresBIOSKey] boolValue]; if (requiresBIOS) { - NSArray *biosNames = system[PVBIOSNamesKey]; - NSString *biosPath = [self BIOSPathForSystemID:[game systemIdentifier]]; + NSArray *biosNames = system[PVBIOSNamesKey]; + NSString *biosPath = [config BIOSPathForSystemID:[game systemIdentifier]]; NSError *error = nil; NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:biosPath error:&error]; if (!contents) @@ -830,22 +770,26 @@ - (BOOL)canLoadGame:(PVGame *)game canLoad = NO; } - for (NSString *name in biosNames) + for (BiosDictionary* bios in biosNames) { - if (![contents containsObject:name]) + if (![contents containsObject:bios[@"Name"]]) { canLoad = NO; break; } } - + if (canLoad == NO) { + // Create missing BIOS directory to help user out + [self createBiosDirectoryAtPath:biosPath]; + NSMutableString *biosString = [NSMutableString string]; - for (NSString *name in biosNames) + for (BiosDictionary* bios in biosNames) { + NSString *name = bios[@"Name"]; [biosString appendString:[NSString stringWithFormat:@"%@", name]]; - if ([biosNames lastObject] != name) + if (biosNames.lastObject != bios) { [biosString appendString:@",\n"]; } @@ -871,12 +815,14 @@ - (BOOL)canLoadGame:(PVGame *)game - (void)loadGame:(PVGame *)game { void (^loadGame)(void) = ^void(void) { + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + if ([self canLoadGame:game]) { PVEmulatorViewController *emulatorViewController = [[PVEmulatorViewController alloc] initWithGame:game]; - [emulatorViewController setBatterySavesPath:[self batterySavesPathForROM:[[self romsPath] stringByAppendingPathComponent:[game romPath]]]]; - [emulatorViewController setSaveStatePath:[self saveStatePathForROM:[[self romsPath] stringByAppendingPathComponent:[game romPath]]]]; - [emulatorViewController setBIOSPath:[self BIOSPathForSystemID:[game systemIdentifier]]]; + [emulatorViewController setBatterySavesPath:[config batterySavesPathForROM:[[config romsPath] stringByAppendingPathComponent:[game romPath]]]]; + [emulatorViewController setSaveStatePath:[config saveStatePathForROM:[[config romsPath] stringByAppendingPathComponent:[game romPath]]]]; + [emulatorViewController setBIOSPath:[config BIOSPathForSystemID:[game systemIdentifier]]]; [emulatorViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; [self presentViewController:emulatorViewController animated:YES completion:NULL]; @@ -1195,7 +1141,9 @@ - (void)renameGame:(PVGame *)game toTitle:(NSString *)title; - (void)deleteGame:(PVGame *)game { - NSString *romPath = [[self documentsPath] stringByAppendingPathComponent:[game romPath]]; + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + + NSString *romPath = [[config documentsPath] stringByAppendingPathComponent:[game romPath]]; NSArray *indexPaths = [self indexPathsForGameWithMD5Hash:[game md5Hash]]; [PVMediaCache deleteImageForKey:[game originalArtworkURL]]; @@ -1203,16 +1151,16 @@ - (void)deleteGame:(PVGame *)game NSError *error = nil; - BOOL success = [[NSFileManager defaultManager] removeItemAtPath:[self saveStatePathForROM:romPath] error:&error]; + BOOL success = [[NSFileManager defaultManager] removeItemAtPath:[config saveStatePathForROM:romPath] error:&error]; if (!success) { - DLog(@"Unable to delete save states at path: %@ because: %@", [self saveStatePathForROM:romPath], [error localizedDescription]); + DLog(@"Unable to delete save states at path: %@ because: %@", [config saveStatePathForROM:romPath], [error localizedDescription]); } - success = [[NSFileManager defaultManager] removeItemAtPath:[self batterySavesPathForROM:romPath] error:&error]; + success = [[NSFileManager defaultManager] removeItemAtPath:[config batterySavesPathForROM:romPath] error:&error]; if (!success) { - DLog(@"Unable to delete battery saves at path: %@ because: %@", [self batterySavesPathForROM:romPath], [error localizedDescription]); + DLog(@"Unable to delete battery saves at path: %@ because: %@", [config batterySavesPathForROM:romPath], [error localizedDescription]); } success = [[NSFileManager defaultManager] removeItemAtPath:romPath error:&error]; @@ -1249,8 +1197,10 @@ - (void)deleteGame:(PVGame *)game - (void)deleteRelatedFilesGame:(PVGame *)game { + PVEmulatorConfiguration* config = [PVEmulatorConfiguration sharedInstance]; + NSString *romPath = [game romPath]; - NSString *romDirectory = [[self documentsPath] stringByAppendingPathComponent:[game systemIdentifier]]; + NSString *romDirectory = [[config documentsPath] stringByAppendingPathComponent:[game systemIdentifier]]; NSString *relatedFileName = [[romPath lastPathComponent] stringByReplacingOccurrencesOfString:[romPath pathExtension] withString:@""]; NSError *error = nil; NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:romDirectory error:&error]; diff --git a/Provenance/LZMASDK/7z.h b/Provenance/LZMASDK/7z.h new file mode 100755 index 0000000000..1c71f49eb1 --- /dev/null +++ b/Provenance/LZMASDK/7z.h @@ -0,0 +1,246 @@ +/* 7z.h -- 7z interface +2010-03-11 : Igor Pavlov : Public domain */ + +#ifndef __7Z_H +#define __7Z_H + +#include "7zBuf.h" + +#include "stdio.h" + +EXTERN_C_BEGIN + +//#define _7ZIP_CRC_SUPPORT + +#define k7zStartHeaderSize 0x20 +#define k7zSignatureSize 6 +extern Byte k7zSignature[k7zSignatureSize]; +#define k7zMajorVersion 0 + +// 1024K = 1 Meg +#define k7zUnpackMapDictionaryInMemoryMaxNumBytes 1024*1024 + +enum EIdEnum +{ + k7zIdEnd, + k7zIdHeader, + k7zIdArchiveProperties, + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + k7zIdPackInfo, + k7zIdUnpackInfo, + k7zIdSubStreamsInfo, + k7zIdSize, + k7zIdCRC, + k7zIdFolder, + k7zIdCodersUnpackSize, + k7zIdNumUnpackStream, + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + k7zIdName, + k7zIdCTime, + k7zIdATime, + k7zIdMTime, + k7zIdWinAttributes, + k7zIdComment, + k7zIdEncodedHeader, + k7zIdStartPos, + k7zIdDummy +}; + +typedef struct +{ + UInt32 NumInStreams; + UInt32 NumOutStreams; + UInt64 MethodID; + CBuf Props; +} CSzCoderInfo; + +void SzCoderInfo_Init(CSzCoderInfo *p); +void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc); + +typedef struct +{ + UInt32 InIndex; + UInt32 OutIndex; +} CSzBindPair; + +typedef struct +{ + CSzCoderInfo *Coders; + CSzBindPair *BindPairs; + UInt32 *PackStreams; + UInt64 *UnpackSizes; + UInt32 NumCoders; + UInt32 NumBindPairs; + UInt32 NumPackStreams; + int UnpackCRCDefined; + UInt32 UnpackCRC; + + UInt32 NumUnpackStreams; +} CSzFolder; + +void SzFolder_Init(CSzFolder *p); +UInt64 SzFolder_GetUnpackSize(CSzFolder *p); +int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex); +UInt32 SzFolder_GetNumOutStreams(CSzFolder *p); +UInt64 SzFolder_GetUnpackSize(CSzFolder *p); + +SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, + ILookInStream *stream, UInt64 startPos, + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain); + +typedef struct +{ + UInt32 Low; + UInt32 High; +} CNtfsFileTime; + +typedef struct +{ + CNtfsFileTime MTime; + UInt64 Size; + UInt32 Crc; + UInt32 Attrib; + Byte HasStream; + Byte IsDir; + Byte IsAnti; + Byte CrcDefined; + Byte MTimeDefined; + Byte AttribDefined; +} CSzFileItem; + +void SzFile_Init(CSzFileItem *p); + +typedef struct +{ + UInt64 *PackSizes; + Byte *PackCRCsDefined; + UInt32 *PackCRCs; + CSzFolder *Folders; + CSzFileItem *Files; + UInt32 NumPackStreams; + UInt32 NumFolders; + UInt32 NumFiles; +} CSzAr; + +void SzAr_Init(CSzAr *p); +void SzAr_Free(CSzAr *p, ISzAlloc *alloc); + + +/* + SzExtract extracts file from archive + + Pass an initialized pointer to a SzArEx_DictCache object, this record will + contain the allocated/mapped buffer that holds decompressed data. + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + To flush the cache, invoke SzArEx_DictCache_free(). +*/ + +typedef struct +{ + /* Ref to malloc implementation */ + ISzAlloc *allocMain; + /* Default to 0xFFFFFFFF, can have any value before first call (if outBuffer = 0) */ + UInt32 blockIndex; + /* must be 0 (NULL) before first call for each new archive */ + Byte *outBuffer; + /* init to 0, can have any value before first call */ + size_t outBufferSize; + /* byte offset in outBuffer where decoded entry begins */ + size_t entryOffset; + /* The size in bytes of a specific entry extracted from an archive */ + size_t outSizeProcessed; + + /* If dictionary memory is being paged to disk via a writable mmap region, then + * the mapFilename is non-NULL. */ + char *mapFilename; + + /* If dictionary memory is being paged to disk and the file is currently open, + * then this file pointer if non-NULL. */ + FILE *mapFile; + size_t mapSize; +} SzArEx_DictCache; + +void +SzArEx_DictCache_init(SzArEx_DictCache *dictCache, ISzAlloc *allocMain); + +void +SzArEx_DictCache_free(SzArEx_DictCache *dictCache); + +int +SzArEx_DictCache_mmap(SzArEx_DictCache *dictCache); + +void +SzArEx_DictCache_munmap(SzArEx_DictCache *dictCache); + +typedef struct +{ + CSzAr db; + + UInt64 startPosAfterHeader; + UInt64 dataPos; + + UInt32 *FolderStartPackStreamIndex; + UInt64 *PackStreamStartPositions; + UInt32 *FolderStartFileIndex; + UInt32 *FileIndexToFolderIndexMap; + + size_t *FileNameOffsets; /* in 2-byte steps */ + CBuf FileNames; /* UTF-16-LE */ +} CSzArEx; + +void SzArEx_Init(CSzArEx *p); +void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); +UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); +int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); + +/* +if dest == NULL, the return value specifies the required size of the buffer, + in 16-bit characters, including the null-terminating character. +if dest != NULL, the return value specifies the number of 16-bit characters that + are written to the dest, including the null-terminating character. */ + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); + +SRes SzArEx_Extract( + const CSzArEx *db, + ILookInStream *inStream, + UInt32 fileIndex, /* index of file */ + SzArEx_DictCache *dictCache, + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + + +/* +SzArEx_Open Errors: +SZ_ERROR_NO_ARCHIVE +SZ_ERROR_ARCHIVE +SZ_ERROR_UNSUPPORTED +SZ_ERROR_MEM +SZ_ERROR_CRC +SZ_ERROR_INPUT_EOF +SZ_ERROR_FAIL +*/ + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp); + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/7zBuf.c b/Provenance/LZMASDK/7zBuf.c new file mode 100755 index 0000000000..a35fa2f988 --- /dev/null +++ b/Provenance/LZMASDK/7zBuf.c @@ -0,0 +1,36 @@ +/* 7zBuf.c -- Byte Buffer +2008-03-28 +Igor Pavlov +Public domain */ + +#include "7zBuf.h" + +void Buf_Init(CBuf *p) +{ + p->data = 0; + p->size = 0; +} + +int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc) +{ + p->size = 0; + if (size == 0) + { + p->data = 0; + return 1; + } + p->data = (Byte *)alloc->Alloc(alloc, size); + if (p->data != 0) + { + p->size = size; + return 1; + } + return 0; +} + +void Buf_Free(CBuf *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->data); + p->data = 0; + p->size = 0; +} diff --git a/Provenance/LZMASDK/7zBuf.h b/Provenance/LZMASDK/7zBuf.h new file mode 100755 index 0000000000..88ff0c2f2d --- /dev/null +++ b/Provenance/LZMASDK/7zBuf.h @@ -0,0 +1,39 @@ +/* 7zBuf.h -- Byte Buffer +2009-02-07 : Igor Pavlov : Public domain */ + +#ifndef __7Z_BUF_H +#define __7Z_BUF_H + +#include "Types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + Byte *data; + size_t size; +} CBuf; + +void Buf_Init(CBuf *p); +int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc); +void Buf_Free(CBuf *p, ISzAlloc *alloc); + +typedef struct +{ + Byte *data; + size_t size; + size_t pos; +} CDynBuf; + +void DynBuf_Construct(CDynBuf *p); +void DynBuf_SeekToBeg(CDynBuf *p); +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc); +void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Provenance/LZMASDK/7zBuf2.c b/Provenance/LZMASDK/7zBuf2.c new file mode 100755 index 0000000000..1c8b931a12 --- /dev/null +++ b/Provenance/LZMASDK/7zBuf2.c @@ -0,0 +1,45 @@ +/* 7zBuf2.c -- Byte Buffer +2008-10-04 : Igor Pavlov : Public domain */ + +#include +#include "7zBuf.h" + +void DynBuf_Construct(CDynBuf *p) +{ + p->data = 0; + p->size = 0; + p->pos = 0; +} + +void DynBuf_SeekToBeg(CDynBuf *p) +{ + p->pos = 0; +} + +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc) +{ + if (size > p->size - p->pos) + { + size_t newSize = p->pos + size; + Byte *data; + newSize += newSize / 4; + data = (Byte *)alloc->Alloc(alloc, newSize); + if (data == 0) + return 0; + p->size = newSize; + memcpy(data, p->data, p->pos); + alloc->Free(alloc, p->data); + p->data = data; + } + memcpy(p->data + p->pos, buf, size); + p->pos += size; + return 1; +} + +void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->data); + p->data = 0; + p->size = 0; + p->pos = 0; +} diff --git a/Provenance/LZMASDK/7zDec.c b/Provenance/LZMASDK/7zDec.c new file mode 100755 index 0000000000..0bda511c36 --- /dev/null +++ b/Provenance/LZMASDK/7zDec.c @@ -0,0 +1,486 @@ +/* 7zDec.c -- Decoding from 7z folder +2010-11-02 : Igor Pavlov : Public domain */ + +#include + +/* #define _7ZIP_PPMD_SUPPPORT */ + +#include "7z.h" + +#ifdef _7ZIP_BRANCH_SUPPORT +#include "Bcj2.h" +#include "Bra.h" +#endif +#ifdef _7ZIP_CRC_SUPPORT +#include "CpuArch.h" +#endif +#include "LzmaDec.h" +#include "Lzma2Dec.h" +#ifdef _7ZIP_PPMD_SUPPPORT +#include "Ppmd7.h" +#endif + +#define k_Copy 0 +#define k_LZMA2 0x21 +#define k_LZMA 0x30101 +#define k_BCJ 0x03030103 +#define k_PPC 0x03030205 +#define k_ARM 0x03030501 +#define k_ARMT 0x03030701 +#define k_SPARC 0x03030805 +#define k_BCJ2 0x0303011B + +#ifdef _7ZIP_PPMD_SUPPPORT + +#define k_PPMD 0x30401 + +typedef struct +{ + IByteIn p; + const Byte *cur; + const Byte *end; + const Byte *begin; + UInt64 processed; + Bool extra; + SRes res; + ILookInStream *inStream; +} CByteInToLook; + +static Byte ReadByte(void *pp) +{ + CByteInToLook *p = (CByteInToLook *)pp; + if (p->cur != p->end) + return *p->cur++; + if (p->res == SZ_OK) + { + size_t size = p->cur - p->begin; + p->processed += size; + p->res = p->inStream->Skip(p->inStream, size); + size = (1 << 25); + p->res = p->inStream->Look(p->inStream, (const void **)&p->begin, &size); + p->cur = p->begin; + p->end = p->begin + size; + if (size != 0) + return *p->cur++;; + } + p->extra = True; + return 0; +} + +static SRes SzDecodePpmd(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +{ + CPpmd7 ppmd; + CByteInToLook s; + SRes res = SZ_OK; + + s.p.Read = ReadByte; + s.inStream = inStream; + s.begin = s.end = s.cur = NULL; + s.extra = False; + s.res = SZ_OK; + s.processed = 0; + + if (coder->Props.size != 5) + return SZ_ERROR_UNSUPPORTED; + + { + unsigned order = coder->Props.data[0]; + UInt32 memSize = GetUi32(coder->Props.data + 1); + if (order < PPMD7_MIN_ORDER || + order > PPMD7_MAX_ORDER || + memSize < PPMD7_MIN_MEM_SIZE || + memSize > PPMD7_MAX_MEM_SIZE) + return SZ_ERROR_UNSUPPORTED; + Ppmd7_Construct(&ppmd); + if (!Ppmd7_Alloc(&ppmd, memSize, allocMain)) + return SZ_ERROR_MEM; + Ppmd7_Init(&ppmd, order); + } + { + CPpmd7z_RangeDec rc; + Ppmd7z_RangeDec_CreateVTable(&rc); + rc.Stream = &s.p; + if (!Ppmd7z_RangeDec_Init(&rc)) + res = SZ_ERROR_DATA; + else if (s.extra) + res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA); + else + { + SizeT i; + for (i = 0; i < outSize; i++) + { + int sym = Ppmd7_DecodeSymbol(&ppmd, &rc.p); + if (s.extra || sym < 0) + break; + outBuffer[i] = (Byte)sym; + } + if (i != outSize) + res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA); + else if (s.processed + (s.cur - s.begin) != inSize || !Ppmd7z_RangeDec_IsFinishedOK(&rc)) + res = SZ_ERROR_DATA; + } + } + Ppmd7_Free(&ppmd, allocMain); + return res; +} + +#endif + + +static SRes SzDecodeLzma(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +{ + CLzmaDec state; + SRes res = SZ_OK; + + LzmaDec_Construct(&state); + RINOK(LzmaDec_AllocateProbs(&state, coder->Props.data, (unsigned)coder->Props.size, allocMain)); + state.dic = outBuffer; + state.dicBufSize = outSize; + LzmaDec_Init(&state); + + for (;;) + { + Byte *inBuf = NULL; + size_t lookahead = (1 << 18); + if (lookahead > inSize) + lookahead = (size_t)inSize; + res = inStream->Look((void *)inStream, (const void **)&inBuf, &lookahead); + if (res != SZ_OK) + break; + + { + SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; + ELzmaStatus status; + res = LzmaDec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + if (state.dicPos == state.dicBufSize || (inProcessed == 0 && dicPos == state.dicPos)) + { + if (state.dicBufSize != outSize || lookahead != 0 || + (status != LZMA_STATUS_FINISHED_WITH_MARK && + status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)) + res = SZ_ERROR_DATA; + break; + } + res = inStream->Skip((void *)inStream, inProcessed); + if (res != SZ_OK) + break; + } + } + + LzmaDec_FreeProbs(&state, allocMain); + return res; +} + +static SRes SzDecodeLzma2(CSzCoderInfo *coder, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +{ + CLzma2Dec state; + SRes res = SZ_OK; + + Lzma2Dec_Construct(&state); + if (coder->Props.size != 1) + return SZ_ERROR_DATA; + RINOK(Lzma2Dec_AllocateProbs(&state, coder->Props.data[0], allocMain)); + state.decoder.dic = outBuffer; + state.decoder.dicBufSize = outSize; + Lzma2Dec_Init(&state); + + for (;;) + { + Byte *inBuf = NULL; + size_t lookahead = (1 << 18); + if (lookahead > inSize) + lookahead = (size_t)inSize; + res = inStream->Look((void *)inStream, (const void **)&inBuf, &lookahead); + if (res != SZ_OK) + break; + + { + SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; + ELzmaStatus status; + res = Lzma2Dec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + if (state.decoder.dicPos == state.decoder.dicBufSize || (inProcessed == 0 && dicPos == state.decoder.dicPos)) + { + if (state.decoder.dicBufSize != outSize || lookahead != 0 || + (status != LZMA_STATUS_FINISHED_WITH_MARK)) + res = SZ_ERROR_DATA; + break; + } + res = inStream->Skip((void *)inStream, inProcessed); + if (res != SZ_OK) + break; + } + } + + Lzma2Dec_FreeProbs(&state, allocMain); + return res; +} + +static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) +{ + while (inSize > 0) + { + void *inBuf; + size_t curSize = (1 << 18); + if (curSize > inSize) + curSize = (size_t)inSize; + RINOK(inStream->Look((void *)inStream, (const void **)&inBuf, &curSize)); + if (curSize == 0) + return SZ_ERROR_INPUT_EOF; + memcpy(outBuffer, inBuf, curSize); + outBuffer += curSize; + inSize -= curSize; + RINOK(inStream->Skip((void *)inStream, curSize)); + } + return SZ_OK; +} + +static Bool IS_MAIN_METHOD(UInt32 m) +{ + switch(m) + { + case k_Copy: + case k_LZMA: + case k_LZMA2: + #ifdef _7ZIP_PPMD_SUPPPORT + case k_PPMD: + #endif + return True; + } + return False; +} + +static Bool IS_SUPPORTED_CODER(const CSzCoderInfo *c) +{ + return + c->NumInStreams == 1 && + c->NumOutStreams == 1 && + c->MethodID <= (UInt32)0xFFFFFFFF && + IS_MAIN_METHOD((UInt32)c->MethodID); +} + +#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumInStreams == 4 && (c)->NumOutStreams == 1) + +static SRes CheckSupportedFolder(const CSzFolder *f) +{ + if (f->NumCoders < 1 || f->NumCoders > 4) + return SZ_ERROR_UNSUPPORTED; + if (!IS_SUPPORTED_CODER(&f->Coders[0])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumCoders == 1) + { + if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBindPairs != 0) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + if (f->NumCoders == 2) + { + CSzCoderInfo *c = &f->Coders[1]; + if (c->MethodID > (UInt32)0xFFFFFFFF || + c->NumInStreams != 1 || + c->NumOutStreams != 1 || + f->NumPackStreams != 1 || + f->PackStreams[0] != 0 || + f->NumBindPairs != 1 || + f->BindPairs[0].InIndex != 1 || + f->BindPairs[0].OutIndex != 0) + return SZ_ERROR_UNSUPPORTED; + switch ((UInt32)c->MethodID) + { + case k_BCJ: + case k_ARM: + break; + default: + return SZ_ERROR_UNSUPPORTED; + } + return SZ_OK; + } + if (f->NumCoders == 4) + { + if (!IS_SUPPORTED_CODER(&f->Coders[1]) || + !IS_SUPPORTED_CODER(&f->Coders[2]) || + !IS_BCJ2(&f->Coders[3])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumPackStreams != 4 || + f->PackStreams[0] != 2 || + f->PackStreams[1] != 6 || + f->PackStreams[2] != 1 || + f->PackStreams[3] != 0 || + f->NumBindPairs != 3 || + f->BindPairs[0].InIndex != 5 || f->BindPairs[0].OutIndex != 0 || + f->BindPairs[1].InIndex != 4 || f->BindPairs[1].OutIndex != 1 || + f->BindPairs[2].InIndex != 3 || f->BindPairs[2].OutIndex != 2) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + return SZ_ERROR_UNSUPPORTED; +} + +static UInt64 GetSum(const UInt64 *values, UInt32 index) +{ + UInt64 sum = 0; + UInt32 i; + for (i = 0; i < index; i++) + sum += values[i]; + return sum; +} + +#define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break; + +static SRes SzFolder_Decode2(const CSzFolder *folder, const UInt64 *packSizes, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain, + Byte *tempBuf[]) +{ + UInt32 ci; + SizeT tempSizes[3] = { 0, 0, 0}; +#ifdef _7ZIP_BRANCH_SUPPORT + SizeT tempSize3 = 0; + Byte *tempBuf3 = 0; +#endif + + RINOK(CheckSupportedFolder(folder)); + + for (ci = 0; ci < folder->NumCoders; ci++) + { + CSzCoderInfo *coder = &folder->Coders[ci]; + + if (IS_MAIN_METHOD((UInt32)coder->MethodID)) + { + UInt32 si = 0; + UInt64 offset; + UInt64 inSize; + Byte *outBufCur = outBuffer; + SizeT outSizeCur = outSize; + if (folder->NumCoders == 4) + { + UInt32 indices[] = { 3, 2, 0 }; + UInt64 unpackSize = folder->UnpackSizes[ci]; + si = indices[ci]; + if (ci < 2) + { + Byte *temp; + outSizeCur = (SizeT)unpackSize; + if (outSizeCur != unpackSize) + return SZ_ERROR_MEM; + temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur); + if (temp == 0 && outSizeCur != 0) + return SZ_ERROR_MEM; + outBufCur = tempBuf[1 - ci] = temp; + tempSizes[1 - ci] = outSizeCur; + } + else if (ci == 2) + { + if (unpackSize > outSize) /* check it */ + return SZ_ERROR_PARAM; +#ifdef _7ZIP_BRANCH_SUPPORT + tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); + tempSize3 = outSizeCur = (SizeT)unpackSize; +#endif + } + else + return SZ_ERROR_UNSUPPORTED; + } + offset = GetSum(packSizes, si); + inSize = packSizes[si]; + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + + if (coder->MethodID == k_Copy) + { + if (inSize != outSizeCur) /* check it */ + return SZ_ERROR_DATA; + RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); + } + else if (coder->MethodID == k_LZMA) + { + RINOK(SzDecodeLzma(coder, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + else if (coder->MethodID == k_LZMA2) + { + RINOK(SzDecodeLzma2(coder, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + else + { + #ifdef _7ZIP_PPMD_SUPPPORT + RINOK(SzDecodePpmd(coder, inSize, inStream, outBufCur, outSizeCur, allocMain)); + #else + return SZ_ERROR_UNSUPPORTED; + #endif + } + } + else if (coder->MethodID == k_BCJ2) + { +#ifdef _7ZIP_BRANCH_SUPPORT + UInt64 offset = GetSum(packSizes, 1); + UInt64 s3Size = packSizes[1]; + SRes res; + if (ci != 3) + return SZ_ERROR_UNSUPPORTED; + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + tempSizes[2] = (SizeT)s3Size; + if (tempSizes[2] != s3Size) + return SZ_ERROR_MEM; + tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]); + if (tempBuf[2] == 0 && tempSizes[2] != 0) + return SZ_ERROR_MEM; + res = SzDecodeCopy(s3Size, inStream, tempBuf[2]); + RINOK(res) + + res = Bcj2_Decode( + tempBuf3, tempSize3, + tempBuf[0], tempSizes[0], + tempBuf[1], tempSizes[1], + tempBuf[2], tempSizes[2], + outBuffer, outSize); + RINOK(res) +#else + return SZ_ERROR_UNSUPPORTED; +#endif + } + else + { +#ifdef _7ZIP_BRANCH_SUPPORT + if (ci != 1) + return SZ_ERROR_UNSUPPORTED; + switch(coder->MethodID) + { + case k_BCJ: + { + UInt32 state; + x86_Convert_Init(state); + x86_Convert(outBuffer, outSize, 0, &state, 0); + break; + } + CASE_BRA_CONV(ARM) + default: + return SZ_ERROR_UNSUPPORTED; + } +#else + return SZ_ERROR_UNSUPPORTED; +#endif + } + } + return SZ_OK; +} + +SRes SzFolder_Decode(const CSzFolder *folder, const UInt64 *packSizes, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, size_t outSize, ISzAlloc *allocMain) +{ + Byte *tempBuf[3] = { 0, 0, 0}; + int i; + SRes res = SzFolder_Decode2(folder, packSizes, inStream, startPos, + outBuffer, (SizeT)outSize, allocMain, tempBuf); + for (i = 0; i < 3; i++) + IAlloc_Free(allocMain, tempBuf[i]); + return res; +} diff --git a/Provenance/LZMASDK/7zFile.c b/Provenance/LZMASDK/7zFile.c new file mode 100755 index 0000000000..21b2debfdf --- /dev/null +++ b/Provenance/LZMASDK/7zFile.c @@ -0,0 +1,299 @@ +/* 7zFile.c -- File IO +2009-11-24 : Igor Pavlov : Public domain */ + +#include "7zFile.h" + +#include +#include + +#ifndef USE_WINDOWS_FILE + +#ifndef UNDER_CE +#include +#endif + +#else + +/* + ReadFile and WriteFile functions in Windows have BUG: + If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) + from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES + (Insufficient system resources exist to complete the requested service). + Probably in some version of Windows there are problems with other sizes: + for 32 MB (maybe also for 16 MB). + And message can be "Network connection was lost" +*/ + +#define kChunkSizeMax (1 << 22) + +#endif + +void File_Construct(CSzFile *p) +{ + #ifdef USE_WINDOWS_FILE + p->handle = INVALID_HANDLE_VALUE; + #else + p->file = NULL; + #endif +} + +#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) +static WRes File_Open(CSzFile *p, const char *name, int writeMode, const char* threadCwd) +{ + char *qualName = (char*) name; + if (threadCwd != NULL) { + qualName = (char *) malloc(strlen(threadCwd) + strlen(name) + 1); + strcpy(qualName, threadCwd); + strcat(qualName, (char*)name); + } + #ifdef USE_WINDOWS_FILE + p->handle = CreateFileA(qualName, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + if (qualName != name) { + free(qualName); + } + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); + #else + p->file = fopen(qualName, writeMode ? "wb+" : "rb"); + if (qualName != name) { + free(qualName); + } + return (p->file != 0) ? 0 : + #ifdef UNDER_CE + 2; /* ENOENT */ + #else + errno; + #endif + #endif +} + +WRes InFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 0, NULL); } +WRes OutFile_Open(CSzFile *p, const char *name, const char *threadCwd) { return File_Open(p, name, 1, threadCwd); } +#endif + +#ifdef USE_WINDOWS_FILE +static WRes File_OpenW(CSzFile *p, const WCHAR *name, int writeMode) +{ + p->handle = CreateFileW(name, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); +} +WRes InFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 0); } +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name, const WCHAR *threadCwd) { return File_OpenW(p, name, 1, threadCwd); } +#endif + +WRes File_Close(CSzFile *p) +{ + #ifdef USE_WINDOWS_FILE + if (p->handle != INVALID_HANDLE_VALUE) + { + if (!CloseHandle(p->handle)) + return GetLastError(); + p->handle = INVALID_HANDLE_VALUE; + } + #else + if (p->file != NULL) + { + int res = fclose(p->file); + if (res != 0) + return res; + p->file = NULL; + } + #endif + return 0; +} + +WRes File_Read(CSzFile *p, void *data, size_t *size) +{ + size_t originalSize = *size; + if (originalSize == 0) + return 0; + + #ifdef USE_WINDOWS_FILE + + *size = 0; + do + { + DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; + DWORD processed = 0; + BOOL res = ReadFile(p->handle, data, curSize, &processed, NULL); + data = (void *)((Byte *)data + processed); + originalSize -= processed; + *size += processed; + if (!res) + return GetLastError(); + if (processed == 0) + break; + } + while (originalSize > 0); + return 0; + + #else + + *size = fread(data, 1, originalSize, p->file); + if (*size == originalSize) + return 0; + return ferror(p->file); + + #endif +} + +WRes File_Write(CSzFile *p, const void *data, size_t *size) +{ + size_t originalSize = *size; + if (originalSize == 0) + return 0; + + #ifdef USE_WINDOWS_FILE + + *size = 0; + do + { + DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; + DWORD processed = 0; + BOOL res = WriteFile(p->handle, data, curSize, &processed, NULL); + data = (void *)((Byte *)data + processed); + originalSize -= processed; + *size += processed; + if (!res) + return GetLastError(); + if (processed == 0) + break; + } + while (originalSize > 0); + return 0; + + #else + + *size = fwrite(data, 1, originalSize, p->file); + if (*size == originalSize) + return 0; + return ferror(p->file); + + #endif +} + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin) +{ + #ifdef USE_WINDOWS_FILE + + LARGE_INTEGER value; + DWORD moveMethod; + value.LowPart = (DWORD)*pos; + value.HighPart = (LONG)((UInt64)*pos >> 16 >> 16); /* for case when UInt64 is 32-bit only */ + switch (origin) + { + case SZ_SEEK_SET: moveMethod = FILE_BEGIN; break; + case SZ_SEEK_CUR: moveMethod = FILE_CURRENT; break; + case SZ_SEEK_END: moveMethod = FILE_END; break; + default: return ERROR_INVALID_PARAMETER; + } + value.LowPart = SetFilePointer(p->handle, value.LowPart, &value.HighPart, moveMethod); + if (value.LowPart == 0xFFFFFFFF) + { + WRes res = GetLastError(); + if (res != NO_ERROR) + return res; + } + *pos = ((Int64)value.HighPart << 32) | value.LowPart; + return 0; + + #else + + int moveMethod; + int res; + switch (origin) + { + case SZ_SEEK_SET: moveMethod = SEEK_SET; break; + case SZ_SEEK_CUR: moveMethod = SEEK_CUR; break; + case SZ_SEEK_END: moveMethod = SEEK_END; break; + default: return 1; + } + res = fseek(p->file, (long)*pos, moveMethod); + *pos = ftell(p->file); + return res; + + #endif +} + +WRes File_GetLength(CSzFile *p, UInt64 *length) +{ + #ifdef USE_WINDOWS_FILE + + DWORD sizeHigh; + DWORD sizeLow = GetFileSize(p->handle, &sizeHigh); + if (sizeLow == 0xFFFFFFFF) + { + DWORD res = GetLastError(); + if (res != NO_ERROR) + return res; + } + *length = (((UInt64)sizeHigh) << 32) + sizeLow; + return 0; + + #else + + long pos = ftell(p->file); + int res = fseek(p->file, 0, SEEK_END); + *length = ftell(p->file); + fseek(p->file, pos, SEEK_SET); + return res; + + #endif +} + + +/* ---------- FileSeqInStream ---------- */ + +static SRes FileSeqInStream_Read(void *pp, void *buf, size_t *size) +{ + CFileSeqInStream *p = (CFileSeqInStream *)pp; + return File_Read(&p->file, buf, size) == 0 ? SZ_OK : SZ_ERROR_READ; +} + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p) +{ + p->s.Read = FileSeqInStream_Read; +} + + +/* ---------- FileInStream ---------- */ + +static SRes FileInStream_Read(void *pp, void *buf, size_t *size) +{ + CFileInStream *p = (CFileInStream *)pp; + return (File_Read(&p->file, buf, size) == 0) ? SZ_OK : SZ_ERROR_READ; +} + +static SRes FileInStream_Seek(void *pp, Int64 *pos, ESzSeek origin) +{ + CFileInStream *p = (CFileInStream *)pp; + return File_Seek(&p->file, pos, origin); +} + +void FileInStream_CreateVTable(CFileInStream *p) +{ + p->s.Read = FileInStream_Read; + p->s.Seek = FileInStream_Seek; +} + + +/* ---------- FileOutStream ---------- */ + +static size_t FileOutStream_Write(void *pp, const void *data, size_t size) +{ + CFileOutStream *p = (CFileOutStream *)pp; + File_Write(&p->file, data, &size); + return size; +} + +void FileOutStream_CreateVTable(CFileOutStream *p) +{ + p->s.Write = FileOutStream_Write; +} diff --git a/Provenance/LZMASDK/7zFile.h b/Provenance/LZMASDK/7zFile.h new file mode 100755 index 0000000000..415fddd422 --- /dev/null +++ b/Provenance/LZMASDK/7zFile.h @@ -0,0 +1,83 @@ +/* 7zFile.h -- File IO +2009-11-24 : Igor Pavlov : Public domain */ + +#ifndef __7Z_FILE_H +#define __7Z_FILE_H + +#ifdef _WIN32 +#define USE_WINDOWS_FILE +#endif + +#ifdef USE_WINDOWS_FILE +#include +#else +#include +#endif + +#include "Types.h" + +EXTERN_C_BEGIN + +/* ---------- File ---------- */ + +typedef struct +{ + #ifdef USE_WINDOWS_FILE + HANDLE handle; + #else + FILE *file; + #endif +} CSzFile; + +void File_Construct(CSzFile *p); +#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) +WRes InFile_Open(CSzFile *p, const char *name); +WRes OutFile_Open(CSzFile *p, const char *name, const char *threadCwd); +#endif +#ifdef USE_WINDOWS_FILE +WRes InFile_OpenW(CSzFile *p, const WCHAR *name); +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name, const WCHAR *threadCwd); +#endif +WRes File_Close(CSzFile *p); + +/* reads max(*size, remain file's size) bytes */ +WRes File_Read(CSzFile *p, void *data, size_t *size); + +/* writes *size bytes */ +WRes File_Write(CSzFile *p, const void *data, size_t *size); + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin); +WRes File_GetLength(CSzFile *p, UInt64 *length); + + +/* ---------- FileInStream ---------- */ + +typedef struct +{ + ISeqInStream s; + CSzFile file; +} CFileSeqInStream; + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p); + + +typedef struct +{ + ISeekInStream s; + CSzFile file; +} CFileInStream; + +void FileInStream_CreateVTable(CFileInStream *p); + + +typedef struct +{ + ISeqOutStream s; + CSzFile file; +} CFileOutStream; + +void FileOutStream_CreateVTable(CFileOutStream *p); + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/7zIn.c b/Provenance/LZMASDK/7zIn.c new file mode 100755 index 0000000000..e5731a2f41 --- /dev/null +++ b/Provenance/LZMASDK/7zIn.c @@ -0,0 +1,1614 @@ +/* 7zIn.c -- 7z Input functions +2010-10-29 : Igor Pavlov : Public domain */ + +#include + +#include "7z.h" +#ifdef _7ZIP_CRC_SUPPORT +#include "7zCrc.h" +#endif +#include "CpuArch.h" + +#include +#include +#include + +#pragma clang diagnostic ignored "-Wmissing-prototypes" + +Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; + +#define RINOM(x) { if ((x) == 0) return SZ_ERROR_MEM; } + +#define NUM_FOLDER_CODERS_MAX 32 +#define NUM_CODER_STREAMS_MAX 32 + +void SzCoderInfo_Init(CSzCoderInfo *p) +{ + Buf_Init(&p->Props); +} + +void SzCoderInfo_Free(CSzCoderInfo *p, ISzAlloc *alloc) +{ + Buf_Free(&p->Props, alloc); + SzCoderInfo_Init(p); +} + +void SzFolder_Init(CSzFolder *p) +{ + p->Coders = 0; + p->BindPairs = 0; + p->PackStreams = 0; + p->UnpackSizes = 0; + p->NumCoders = 0; + p->NumBindPairs = 0; + p->NumPackStreams = 0; + p->UnpackCRCDefined = 0; + p->UnpackCRC = 0; + p->NumUnpackStreams = 0; +} + +void SzFolder_Free(CSzFolder *p, ISzAlloc *alloc) +{ + UInt32 i; + if (p->Coders) + for (i = 0; i < p->NumCoders; i++) + SzCoderInfo_Free(&p->Coders[i], alloc); + IAlloc_Free(alloc, p->Coders); + IAlloc_Free(alloc, p->BindPairs); + IAlloc_Free(alloc, p->PackStreams); + IAlloc_Free(alloc, p->UnpackSizes); + SzFolder_Init(p); +} + +UInt32 SzFolder_GetNumOutStreams(CSzFolder *p) +{ + UInt32 result = 0; + UInt32 i; + for (i = 0; i < p->NumCoders; i++) + result += p->Coders[i].NumOutStreams; + return result; +} + +int SzFolder_FindBindPairForInStream(CSzFolder *p, UInt32 inStreamIndex) +{ + UInt32 i; + for (i = 0; i < p->NumBindPairs; i++) + if (p->BindPairs[i].InIndex == inStreamIndex) + return i; + return -1; +} + + +int SzFolder_FindBindPairForOutStream(CSzFolder *p, UInt32 outStreamIndex) +{ + UInt32 i; + for (i = 0; i < p->NumBindPairs; i++) + if (p->BindPairs[i].OutIndex == outStreamIndex) + return i; + return -1; +} + +UInt64 SzFolder_GetUnpackSize(CSzFolder *p) +{ + int i = (int)SzFolder_GetNumOutStreams(p); + if (i == 0) + return 0; + for (i--; i >= 0; i--) + if (SzFolder_FindBindPairForOutStream(p, i) < 0) + return p->UnpackSizes[i]; + /* throw 1; */ + return 0; +} + +void SzFile_Init(CSzFileItem *p) +{ + p->HasStream = 1; + p->IsDir = 0; + p->IsAnti = 0; + p->CrcDefined = 0; + p->MTimeDefined = 0; +} + +void SzAr_Init(CSzAr *p) +{ + p->PackSizes = 0; + p->PackCRCsDefined = 0; + p->PackCRCs = 0; + p->Folders = 0; + p->Files = 0; + p->NumPackStreams = 0; + p->NumFolders = 0; + p->NumFiles = 0; +} + +void SzAr_Free(CSzAr *p, ISzAlloc *alloc) +{ + UInt32 i; + if (p->Folders) + for (i = 0; i < p->NumFolders; i++) + SzFolder_Free(&p->Folders[i], alloc); + + IAlloc_Free(alloc, p->PackSizes); + IAlloc_Free(alloc, p->PackCRCsDefined); + IAlloc_Free(alloc, p->PackCRCs); + IAlloc_Free(alloc, p->Folders); + IAlloc_Free(alloc, p->Files); + SzAr_Init(p); +} + + +void SzArEx_Init(CSzArEx *p) +{ + SzAr_Init(&p->db); + p->FolderStartPackStreamIndex = 0; + p->PackStreamStartPositions = 0; + p->FolderStartFileIndex = 0; + p->FileIndexToFolderIndexMap = 0; + p->FileNameOffsets = 0; + Buf_Init(&p->FileNames); +} + +void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc) +{ + IAlloc_Free(alloc, p->FolderStartPackStreamIndex); + IAlloc_Free(alloc, p->PackStreamStartPositions); + IAlloc_Free(alloc, p->FolderStartFileIndex); + IAlloc_Free(alloc, p->FileIndexToFolderIndexMap); + + IAlloc_Free(alloc, p->FileNameOffsets); + Buf_Free(&p->FileNames, alloc); + + SzAr_Free(&p->db, alloc); + SzArEx_Init(p); +} + +/* +UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const +{ + return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex]; +} + +UInt64 GetFilePackSize(int fileIndex) const +{ + int folderIndex = FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex >= 0) + { + const CSzFolder &folderInfo = Folders[folderIndex]; + if (FolderStartFileIndex[folderIndex] == fileIndex) + return GetFolderFullPackSize(folderIndex); + } + return 0; +} +*/ + +#define MY_ALLOC(T, p, size, alloc) { if ((size) == 0) p = 0; else \ + if ((p = (T *)IAlloc_Alloc(alloc, (size) * sizeof(T))) == 0) return SZ_ERROR_MEM; } + +static SRes SzArEx_Fill(CSzArEx *p, ISzAlloc *alloc) +{ + UInt32 startPos = 0; + UInt64 startPosSize = 0; + UInt32 i; + UInt32 folderIndex = 0; + UInt32 indexInFolder = 0; + MY_ALLOC(UInt32, p->FolderStartPackStreamIndex, p->db.NumFolders, alloc); + for (i = 0; i < p->db.NumFolders; i++) + { + p->FolderStartPackStreamIndex[i] = startPos; + startPos += p->db.Folders[i].NumPackStreams; + } + + MY_ALLOC(UInt64, p->PackStreamStartPositions, p->db.NumPackStreams, alloc); + + for (i = 0; i < p->db.NumPackStreams; i++) + { + p->PackStreamStartPositions[i] = startPosSize; + startPosSize += p->db.PackSizes[i]; + } + + MY_ALLOC(UInt32, p->FolderStartFileIndex, p->db.NumFolders, alloc); + MY_ALLOC(UInt32, p->FileIndexToFolderIndexMap, p->db.NumFiles, alloc); + + for (i = 0; i < p->db.NumFiles; i++) + { + CSzFileItem *file = p->db.Files + i; + int emptyStream = !file->HasStream; + if (emptyStream && indexInFolder == 0) + { + p->FileIndexToFolderIndexMap[i] = (UInt32)-1; + continue; + } + if (indexInFolder == 0) + { + /* + v3.13 incorrectly worked with empty folders + v4.07: Loop for skipping empty folders + */ + for (;;) + { + if (folderIndex >= p->db.NumFolders) + return SZ_ERROR_ARCHIVE; + p->FolderStartFileIndex[folderIndex] = i; + if (p->db.Folders[folderIndex].NumUnpackStreams != 0) + break; + folderIndex++; + } + } + p->FileIndexToFolderIndexMap[i] = folderIndex; + if (emptyStream) + continue; + indexInFolder++; + if (indexInFolder >= p->db.Folders[folderIndex].NumUnpackStreams) + { + folderIndex++; + indexInFolder = 0; + } + } + return SZ_OK; +} + + +UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder) +{ + return p->dataPos + + p->PackStreamStartPositions[p->FolderStartPackStreamIndex[folderIndex] + indexInFolder]; +} + +int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize) +{ + UInt32 packStreamIndex = p->FolderStartPackStreamIndex[folderIndex]; + CSzFolder *folder = p->db.Folders + folderIndex; + UInt64 size = 0; + UInt32 i; + for (i = 0; i < folder->NumPackStreams; i++) + { + UInt64 t = size + p->db.PackSizes[packStreamIndex + i]; + if (t < size) /* check it */ + return SZ_ERROR_FAIL; + size = t; + } + *resSize = size; + return SZ_OK; +} + + +/* +SRes SzReadTime(const CObjectVector &dataVector, + CObjectVector &files, UInt64 type) +{ + CBoolVector boolVector; + RINOK(ReadBoolVector2(files.Size(), boolVector)) + + CStreamSwitch streamSwitch; + RINOK(streamSwitch.Set(this, &dataVector)); + + for (int i = 0; i < files.Size(); i++) + { + CSzFileItem &file = files[i]; + CArchiveFileTime fileTime; + bool defined = boolVector[i]; + if (defined) + { + UInt32 low, high; + RINOK(SzReadUInt32(low)); + RINOK(SzReadUInt32(high)); + fileTime.dwLowDateTime = low; + fileTime.dwHighDateTime = high; + } + switch(type) + { + case k7zIdCTime: file.IsCTimeDefined = defined; if (defined) file.CTime = fileTime; break; + case k7zIdATime: file.IsATimeDefined = defined; if (defined) file.ATime = fileTime; break; + case k7zIdMTime: file.IsMTimeDefined = defined; if (defined) file.MTime = fileTime; break; + } + } + return SZ_OK; +} +*/ + +static int TestSignatureCandidate(Byte *testBytes) +{ + size_t i; + for (i = 0; i < k7zSignatureSize; i++) + if (testBytes[i] != k7zSignature[i]) + return 0; + return 1; +} + +typedef struct _CSzState +{ + Byte *Data; + size_t Size; +}CSzData; + +static SRes SzReadByte(CSzData *sd, Byte *b) +{ + if (sd->Size == 0) + return SZ_ERROR_ARCHIVE; + sd->Size--; + *b = *sd->Data++; + return SZ_OK; +} + +static SRes SzReadBytes(CSzData *sd, Byte *data, size_t size) +{ + size_t i; + for (i = 0; i < size; i++) + { + RINOK(SzReadByte(sd, data + i)); + } + return SZ_OK; +} + +static SRes SzReadUInt32(CSzData *sd, UInt32 *value) +{ + int i; + *value = 0; + for (i = 0; i < 4; i++) + { + Byte b; + RINOK(SzReadByte(sd, &b)); + *value |= ((UInt32)(b) << (8 * i)); + } + return SZ_OK; +} + +static SRes SzReadNumber(CSzData *sd, UInt64 *value) +{ + Byte firstByte; + Byte mask = 0x80; + int i; + RINOK(SzReadByte(sd, &firstByte)); + *value = 0; + for (i = 0; i < 8; i++) + { + Byte b; + if ((firstByte & mask) == 0) + { + UInt64 highPart = firstByte & (mask - 1); + *value += (highPart << (8 * i)); + return SZ_OK; + } + RINOK(SzReadByte(sd, &b)); + *value |= ((UInt64)b << (8 * i)); + mask >>= 1; + } + return SZ_OK; +} + +static SRes SzReadNumber32(CSzData *sd, UInt32 *value) +{ + UInt64 value64; + RINOK(SzReadNumber(sd, &value64)); + if (value64 >= 0x80000000) + return SZ_ERROR_UNSUPPORTED; + if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 2))) + return SZ_ERROR_UNSUPPORTED; + *value = (UInt32)value64; + return SZ_OK; +} + +static SRes SzReadID(CSzData *sd, UInt64 *value) +{ + return SzReadNumber(sd, value); +} + +static SRes SzSkeepDataSize(CSzData *sd, UInt64 size) +{ + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; + sd->Size -= (size_t)size; + sd->Data += (size_t)size; + return SZ_OK; +} + +static SRes SzSkeepData(CSzData *sd) +{ + UInt64 size; + RINOK(SzReadNumber(sd, &size)); + return SzSkeepDataSize(sd, size); +} + +static SRes SzReadArchiveProperties(CSzData *sd) +{ + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + SzSkeepData(sd); + } + return SZ_OK; +} + +static SRes SzWaitAttribute(CSzData *sd, UInt64 attribute) +{ + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == attribute) + return SZ_OK; + if (type == k7zIdEnd) + return SZ_ERROR_ARCHIVE; + RINOK(SzSkeepData(sd)); + } +} + +static SRes SzReadBoolVector(CSzData *sd, size_t numItems, Byte **v, ISzAlloc *alloc) +{ + Byte b = 0; + Byte mask = 0; + size_t i; + MY_ALLOC(Byte, *v, numItems, alloc); + for (i = 0; i < numItems; i++) + { + if (mask == 0) + { + RINOK(SzReadByte(sd, &b)); + mask = 0x80; + } + (*v)[i] = (Byte)(((b & mask) != 0) ? 1 : 0); + mask >>= 1; + } + return SZ_OK; +} + +static SRes SzReadBoolVector2(CSzData *sd, size_t numItems, Byte **v, ISzAlloc *alloc) +{ + Byte allAreDefined; + size_t i; + RINOK(SzReadByte(sd, &allAreDefined)); + if (allAreDefined == 0) + return SzReadBoolVector(sd, numItems, v, alloc); + MY_ALLOC(Byte, *v, numItems, alloc); + for (i = 0; i < numItems; i++) + (*v)[i] = 1; + return SZ_OK; +} + +static SRes SzReadHashDigests( + CSzData *sd, + size_t numItems, + Byte **digestsDefined, + UInt32 **digests, + ISzAlloc *alloc) +{ + size_t i; + RINOK(SzReadBoolVector2(sd, numItems, digestsDefined, alloc)); + MY_ALLOC(UInt32, *digests, numItems, alloc); + for (i = 0; i < numItems; i++) + if ((*digestsDefined)[i]) + { + RINOK(SzReadUInt32(sd, (*digests) + i)); + } + return SZ_OK; +} + +static SRes SzReadPackInfo( + CSzData *sd, + UInt64 *dataOffset, + UInt32 *numPackStreams, + UInt64 **packSizes, + Byte **packCRCsDefined, + UInt32 **packCRCs, + ISzAlloc *alloc) +{ + UInt32 i; + RINOK(SzReadNumber(sd, dataOffset)); + RINOK(SzReadNumber32(sd, numPackStreams)); + + RINOK(SzWaitAttribute(sd, k7zIdSize)); + + MY_ALLOC(UInt64, *packSizes, (size_t)*numPackStreams, alloc); + + for (i = 0; i < *numPackStreams; i++) + { + RINOK(SzReadNumber(sd, (*packSizes) + i)); + } + + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + if (type == k7zIdCRC) + { + RINOK(SzReadHashDigests(sd, (size_t)*numPackStreams, packCRCsDefined, packCRCs, alloc)); + continue; + } + RINOK(SzSkeepData(sd)); + } + if (*packCRCsDefined == 0) + { + MY_ALLOC(Byte, *packCRCsDefined, (size_t)*numPackStreams, alloc); + MY_ALLOC(UInt32, *packCRCs, (size_t)*numPackStreams, alloc); + for (i = 0; i < *numPackStreams; i++) + { + (*packCRCsDefined)[i] = 0; + (*packCRCs)[i] = 0; + } + } + return SZ_OK; +} + +static SRes SzReadSwitch(CSzData *sd) +{ + Byte external; + RINOK(SzReadByte(sd, &external)); + return (external == 0) ? SZ_OK: SZ_ERROR_UNSUPPORTED; +} + +static SRes SzGetNextFolderItem(CSzData *sd, CSzFolder *folder, ISzAlloc *alloc) +{ + UInt32 numCoders, numBindPairs, numPackStreams, i; + UInt32 numInStreams = 0, numOutStreams = 0; + + RINOK(SzReadNumber32(sd, &numCoders)); + if (numCoders > NUM_FOLDER_CODERS_MAX) + return SZ_ERROR_UNSUPPORTED; + folder->NumCoders = numCoders; + + MY_ALLOC(CSzCoderInfo, folder->Coders, (size_t)numCoders, alloc); + + for (i = 0; i < numCoders; i++) + SzCoderInfo_Init(folder->Coders + i); + + for (i = 0; i < numCoders; i++) + { + Byte mainByte; + CSzCoderInfo *coder = folder->Coders + i; + { + unsigned idSize, j; + Byte longID[15]; + RINOK(SzReadByte(sd, &mainByte)); + idSize = (unsigned)(mainByte & 0xF); + RINOK(SzReadBytes(sd, longID, idSize)); + if (idSize > sizeof(coder->MethodID)) + return SZ_ERROR_UNSUPPORTED; + coder->MethodID = 0; + for (j = 0; j < idSize; j++) + coder->MethodID |= (UInt64)longID[idSize - 1 - j] << (8 * j); + + if ((mainByte & 0x10) != 0) + { + RINOK(SzReadNumber32(sd, &coder->NumInStreams)); + RINOK(SzReadNumber32(sd, &coder->NumOutStreams)); + if (coder->NumInStreams > NUM_CODER_STREAMS_MAX || + coder->NumOutStreams > NUM_CODER_STREAMS_MAX) + return SZ_ERROR_UNSUPPORTED; + } + else + { + coder->NumInStreams = 1; + coder->NumOutStreams = 1; + } + if ((mainByte & 0x20) != 0) + { + UInt64 propertiesSize = 0; + RINOK(SzReadNumber(sd, &propertiesSize)); + if (!Buf_Create(&coder->Props, (size_t)propertiesSize, alloc)) + return SZ_ERROR_MEM; + RINOK(SzReadBytes(sd, coder->Props.data, (size_t)propertiesSize)); + } + } + while ((mainByte & 0x80) != 0) + { + RINOK(SzReadByte(sd, &mainByte)); + RINOK(SzSkeepDataSize(sd, (mainByte & 0xF))); + if ((mainByte & 0x10) != 0) + { + UInt32 n; + RINOK(SzReadNumber32(sd, &n)); + RINOK(SzReadNumber32(sd, &n)); + } + if ((mainByte & 0x20) != 0) + { + UInt64 propertiesSize = 0; + RINOK(SzReadNumber(sd, &propertiesSize)); + RINOK(SzSkeepDataSize(sd, propertiesSize)); + } + } + numInStreams += coder->NumInStreams; + numOutStreams += coder->NumOutStreams; + } + + if (numOutStreams == 0) + return SZ_ERROR_UNSUPPORTED; + + folder->NumBindPairs = numBindPairs = numOutStreams - 1; + MY_ALLOC(CSzBindPair, folder->BindPairs, (size_t)numBindPairs, alloc); + + for (i = 0; i < numBindPairs; i++) + { + CSzBindPair *bp = folder->BindPairs + i; + RINOK(SzReadNumber32(sd, &bp->InIndex)); + RINOK(SzReadNumber32(sd, &bp->OutIndex)); + } + + if (numInStreams < numBindPairs) + return SZ_ERROR_UNSUPPORTED; + + folder->NumPackStreams = numPackStreams = numInStreams - numBindPairs; + MY_ALLOC(UInt32, folder->PackStreams, (size_t)numPackStreams, alloc); + + if (numPackStreams == 1) + { + for (i = 0; i < numInStreams ; i++) + if (SzFolder_FindBindPairForInStream(folder, i) < 0) + break; + if (i == numInStreams) + return SZ_ERROR_UNSUPPORTED; + folder->PackStreams[0] = i; + } + else + for (i = 0; i < numPackStreams; i++) + { + RINOK(SzReadNumber32(sd, folder->PackStreams + i)); + } + return SZ_OK; +} + +static SRes SzReadUnpackInfo( + CSzData *sd, + UInt32 *numFolders, + CSzFolder **folders, /* for alloc */ + ISzAlloc *alloc, + ISzAlloc *allocTemp) +{ + UInt32 i; + RINOK(SzWaitAttribute(sd, k7zIdFolder)); + RINOK(SzReadNumber32(sd, numFolders)); + { + RINOK(SzReadSwitch(sd)); + + MY_ALLOC(CSzFolder, *folders, (size_t)*numFolders, alloc); + + for (i = 0; i < *numFolders; i++) + SzFolder_Init((*folders) + i); + + for (i = 0; i < *numFolders; i++) + { + RINOK(SzGetNextFolderItem(sd, (*folders) + i, alloc)); + } + } + + RINOK(SzWaitAttribute(sd, k7zIdCodersUnpackSize)); + + for (i = 0; i < *numFolders; i++) + { + UInt32 j; + CSzFolder *folder = (*folders) + i; + UInt32 numOutStreams = SzFolder_GetNumOutStreams(folder); + + MY_ALLOC(UInt64, folder->UnpackSizes, (size_t)numOutStreams, alloc); + + for (j = 0; j < numOutStreams; j++) + { + RINOK(SzReadNumber(sd, folder->UnpackSizes + j)); + } + } + + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + SRes res; + Byte *crcsDefined = 0; + UInt32 *crcs = 0; + res = SzReadHashDigests(sd, *numFolders, &crcsDefined, &crcs, allocTemp); + if (res == SZ_OK) + { + for (i = 0; i < *numFolders; i++) + { + CSzFolder *folder = (*folders) + i; + folder->UnpackCRCDefined = crcsDefined[i]; + folder->UnpackCRC = crcs[i]; + } + } + IAlloc_Free(allocTemp, crcs); + IAlloc_Free(allocTemp, crcsDefined); + RINOK(res); + continue; + } + RINOK(SzSkeepData(sd)); + } +} + +static SRes SzReadSubStreamsInfo( + CSzData *sd, + UInt32 numFolders, + CSzFolder *folders, + UInt32 *numUnpackStreams, + UInt64 **unpackSizes, + Byte **digestsDefined, + UInt32 **digests, + ISzAlloc *allocTemp) +{ + UInt64 type = 0; + UInt32 i; + UInt32 si = 0; + UInt32 numDigests = 0; + + for (i = 0; i < numFolders; i++) + folders[i].NumUnpackStreams = 1; + *numUnpackStreams = numFolders; + + for (;;) + { + RINOK(SzReadID(sd, &type)); + if (type == k7zIdNumUnpackStream) + { + *numUnpackStreams = 0; + for (i = 0; i < numFolders; i++) + { + UInt32 numStreams; + RINOK(SzReadNumber32(sd, &numStreams)); + folders[i].NumUnpackStreams = numStreams; + *numUnpackStreams += numStreams; + } + continue; + } + if (type == k7zIdCRC || type == k7zIdSize) + break; + if (type == k7zIdEnd) + break; + RINOK(SzSkeepData(sd)); + } + + if (*numUnpackStreams == 0) + { + *unpackSizes = 0; + *digestsDefined = 0; + *digests = 0; + } + else + { + *unpackSizes = (UInt64 *)IAlloc_Alloc(allocTemp, (size_t)*numUnpackStreams * sizeof(UInt64)); + RINOM(*unpackSizes); + *digestsDefined = (Byte *)IAlloc_Alloc(allocTemp, (size_t)*numUnpackStreams * sizeof(Byte)); + RINOM(*digestsDefined); + *digests = (UInt32 *)IAlloc_Alloc(allocTemp, (size_t)*numUnpackStreams * sizeof(UInt32)); + RINOM(*digests); + } + + for (i = 0; i < numFolders; i++) + { + /* + v3.13 incorrectly worked with empty folders + v4.07: we check that folder is empty + */ + UInt64 sum = 0; + UInt32 j; + UInt32 numSubstreams = folders[i].NumUnpackStreams; + if (numSubstreams == 0) + continue; + if (type == k7zIdSize) + for (j = 1; j < numSubstreams; j++) + { + UInt64 size; + RINOK(SzReadNumber(sd, &size)); + (*unpackSizes)[si++] = size; + sum += size; + } + (*unpackSizes)[si++] = SzFolder_GetUnpackSize(folders + i) - sum; + } + if (type == k7zIdSize) + { + RINOK(SzReadID(sd, &type)); + } + + for (i = 0; i < *numUnpackStreams; i++) + { + (*digestsDefined)[i] = 0; + (*digests)[i] = 0; + } + + + for (i = 0; i < numFolders; i++) + { + UInt32 numSubstreams = folders[i].NumUnpackStreams; + if (numSubstreams != 1 || !folders[i].UnpackCRCDefined) + numDigests += numSubstreams; + } + + + si = 0; + for (;;) + { + if (type == k7zIdCRC) + { + int digestIndex = 0; + Byte *digestsDefined2 = 0; + UInt32 *digests2 = 0; + SRes res = SzReadHashDigests(sd, numDigests, &digestsDefined2, &digests2, allocTemp); + if (res == SZ_OK) + { + for (i = 0; i < numFolders; i++) + { + CSzFolder *folder = folders + i; + UInt32 numSubstreams = folder->NumUnpackStreams; + if (numSubstreams == 1 && folder->UnpackCRCDefined) + { + (*digestsDefined)[si] = 1; + (*digests)[si] = folder->UnpackCRC; + si++; + } + else + { + UInt32 j; + for (j = 0; j < numSubstreams; j++, digestIndex++) + { + (*digestsDefined)[si] = digestsDefined2[digestIndex]; + (*digests)[si] = digests2[digestIndex]; + si++; + } + } + } + } + IAlloc_Free(allocTemp, digestsDefined2); + IAlloc_Free(allocTemp, digests2); + RINOK(res); + } + else if (type == k7zIdEnd) + return SZ_OK; + else + { + RINOK(SzSkeepData(sd)); + } + RINOK(SzReadID(sd, &type)); + } +} + + +static SRes SzReadStreamsInfo( + CSzData *sd, + UInt64 *dataOffset, + CSzAr *p, + UInt32 *numUnpackStreams, + UInt64 **unpackSizes, /* allocTemp */ + Byte **digestsDefined, /* allocTemp */ + UInt32 **digests, /* allocTemp */ + ISzAlloc *alloc, + ISzAlloc *allocTemp) +{ + for (;;) + { + UInt64 type; + RINOK(SzReadID(sd, &type)); + if ((UInt64)(int)type != type) + return SZ_ERROR_UNSUPPORTED; + switch((int)type) + { + case k7zIdEnd: + return SZ_OK; + case k7zIdPackInfo: + { + RINOK(SzReadPackInfo(sd, dataOffset, &p->NumPackStreams, + &p->PackSizes, &p->PackCRCsDefined, &p->PackCRCs, alloc)); + break; + } + case k7zIdUnpackInfo: + { + RINOK(SzReadUnpackInfo(sd, &p->NumFolders, &p->Folders, alloc, allocTemp)); + break; + } + case k7zIdSubStreamsInfo: + { + RINOK(SzReadSubStreamsInfo(sd, p->NumFolders, p->Folders, + numUnpackStreams, unpackSizes, digestsDefined, digests, allocTemp)); + break; + } + default: + return SZ_ERROR_UNSUPPORTED; + } + } +} + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest) +{ + size_t len = p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; + if (dest != 0) + { + size_t i; + const Byte *src = p->FileNames.data + (p->FileNameOffsets[fileIndex] * 2); + for (i = 0; i < len; i++) + dest[i] = GetUi16(src + i * 2); + } + return len; +} + +static SRes SzReadFileNames(const Byte *p, size_t size, UInt32 numFiles, size_t *sizes) +{ + UInt32 i; + size_t pos = 0; + for (i = 0; i < numFiles; i++) + { + sizes[i] = pos; + for (;;) + { + if (pos >= size) + return SZ_ERROR_ARCHIVE; + if (p[pos * 2] == 0 && p[pos * 2 + 1] == 0) + break; + pos++; + } + pos++; + } + sizes[i] = pos; + return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; +} + +static SRes SzReadHeader2( + CSzArEx *p, /* allocMain */ + CSzData *sd, + UInt64 **unpackSizes, /* allocTemp */ + Byte **digestsDefined, /* allocTemp */ + UInt32 **digests, /* allocTemp */ + Byte **emptyStreamVector, /* allocTemp */ + Byte **emptyFileVector, /* allocTemp */ + Byte **lwtVector, /* allocTemp */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt64 type; + UInt32 numUnpackStreams = 0; + UInt32 numFiles = 0; + CSzFileItem *files = 0; + UInt32 numEmptyStreams = 0; + UInt32 i; + + RINOK(SzReadID(sd, &type)); + + if (type == k7zIdArchiveProperties) + { + RINOK(SzReadArchiveProperties(sd)); + RINOK(SzReadID(sd, &type)); + } + + + if (type == k7zIdMainStreamsInfo) + { + RINOK(SzReadStreamsInfo(sd, + &p->dataPos, + &p->db, + &numUnpackStreams, + unpackSizes, + digestsDefined, + digests, allocMain, allocTemp)); + p->dataPos += p->startPosAfterHeader; + RINOK(SzReadID(sd, &type)); + } + + if (type == k7zIdEnd) + return SZ_OK; + if (type != k7zIdFilesInfo) + return SZ_ERROR_ARCHIVE; + + RINOK(SzReadNumber32(sd, &numFiles)); + p->db.NumFiles = numFiles; + + MY_ALLOC(CSzFileItem, files, (size_t)numFiles, allocMain); + + p->db.Files = files; + for (i = 0; i < numFiles; i++) + SzFile_Init(files + i); + + for (;;) + { + UInt64 type; + UInt64 size; + RINOK(SzReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(SzReadNumber(sd, &size)); + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; + if ((UInt64)(int)type != type) + { + RINOK(SzSkeepDataSize(sd, size)); + } + else + switch((int)type) + { + case k7zIdName: + { + size_t namesSize; + RINOK(SzReadSwitch(sd)); + namesSize = (size_t)size - 1; + if ((namesSize & 1) != 0) + return SZ_ERROR_ARCHIVE; + if (!Buf_Create(&p->FileNames, namesSize, allocMain)) + return SZ_ERROR_MEM; + MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain); + memcpy(p->FileNames.data, sd->Data, namesSize); + RINOK(SzReadFileNames(sd->Data, namesSize >> 1, numFiles, p->FileNameOffsets)) + RINOK(SzSkeepDataSize(sd, namesSize)); + break; + } + case k7zIdEmptyStream: + { + RINOK(SzReadBoolVector(sd, numFiles, emptyStreamVector, allocTemp)); + numEmptyStreams = 0; + for (i = 0; i < numFiles; i++) + if ((*emptyStreamVector)[i]) + numEmptyStreams++; + break; + } + case k7zIdEmptyFile: + { + RINOK(SzReadBoolVector(sd, numEmptyStreams, emptyFileVector, allocTemp)); + break; + } + case k7zIdWinAttributes: + { + RINOK(SzReadBoolVector2(sd, numFiles, lwtVector, allocTemp)); + RINOK(SzReadSwitch(sd)); + for (i = 0; i < numFiles; i++) + { + CSzFileItem *f = &files[i]; + Byte defined = (*lwtVector)[i]; + f->AttribDefined = defined; + f->Attrib = 0; + if (defined) + { + RINOK(SzReadUInt32(sd, &f->Attrib)); + } + } + IAlloc_Free(allocTemp, *lwtVector); + *lwtVector = NULL; + break; + } + case k7zIdMTime: + { + RINOK(SzReadBoolVector2(sd, numFiles, lwtVector, allocTemp)); + RINOK(SzReadSwitch(sd)); + for (i = 0; i < numFiles; i++) + { + CSzFileItem *f = &files[i]; + Byte defined = (*lwtVector)[i]; + f->MTimeDefined = defined; + f->MTime.Low = f->MTime.High = 0; + if (defined) + { + RINOK(SzReadUInt32(sd, &f->MTime.Low)); + RINOK(SzReadUInt32(sd, &f->MTime.High)); + } + } + IAlloc_Free(allocTemp, *lwtVector); + *lwtVector = NULL; + break; + } + default: + { + RINOK(SzSkeepDataSize(sd, size)); + } + } + } + + { + UInt32 emptyFileIndex = 0; + UInt32 sizeIndex = 0; + for (i = 0; i < numFiles; i++) + { + CSzFileItem *file = files + i; + file->IsAnti = 0; + if (*emptyStreamVector == 0) + file->HasStream = 1; + else + file->HasStream = (Byte)((*emptyStreamVector)[i] ? 0 : 1); + if (file->HasStream) + { + file->IsDir = 0; + file->Size = (*unpackSizes)[sizeIndex]; + file->Crc = (*digests)[sizeIndex]; + file->CrcDefined = (Byte)(*digestsDefined)[sizeIndex]; + sizeIndex++; + } + else + { + if (*emptyFileVector == 0) + file->IsDir = 1; + else + file->IsDir = (Byte)((*emptyFileVector)[emptyFileIndex] ? 0 : 1); + emptyFileIndex++; + file->Size = 0; + file->Crc = 0; + file->CrcDefined = 0; + } + } + } + return SzArEx_Fill(p, allocMain); +} + +static SRes SzReadHeader( + CSzArEx *p, + CSzData *sd, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt64 *unpackSizes = 0; + Byte *digestsDefined = 0; + UInt32 *digests = 0; + Byte *emptyStreamVector = 0; + Byte *emptyFileVector = 0; + Byte *lwtVector = 0; + SRes res = SzReadHeader2(p, sd, + &unpackSizes, &digestsDefined, &digests, + &emptyStreamVector, &emptyFileVector, &lwtVector, + allocMain, allocTemp); + IAlloc_Free(allocTemp, unpackSizes); + IAlloc_Free(allocTemp, digestsDefined); + IAlloc_Free(allocTemp, digests); + IAlloc_Free(allocTemp, emptyStreamVector); + IAlloc_Free(allocTemp, emptyFileVector); + IAlloc_Free(allocTemp, lwtVector); + return res; +} + +static SRes SzReadAndDecodePackedStreams2( + ILookInStream *inStream, + CSzData *sd, + CBuf *outBuffer, + UInt64 baseOffset, + CSzAr *p, + UInt64 **unpackSizes, + Byte **digestsDefined, + UInt32 **digests, + ISzAlloc *allocTemp) +{ + + UInt32 numUnpackStreams = 0; + UInt64 dataStartPos; + CSzFolder *folder; + UInt64 unpackSize; + SRes res; + + RINOK(SzReadStreamsInfo(sd, &dataStartPos, p, + &numUnpackStreams, unpackSizes, digestsDefined, digests, + allocTemp, allocTemp)); + + dataStartPos += baseOffset; + if (p->NumFolders != 1) + return SZ_ERROR_ARCHIVE; + + folder = p->Folders; + unpackSize = SzFolder_GetUnpackSize(folder); + + RINOK(LookInStream_SeekTo(inStream, dataStartPos)); + + if (!Buf_Create(outBuffer, (size_t)unpackSize, allocTemp)) + return SZ_ERROR_MEM; + + res = SzFolder_Decode(folder, p->PackSizes, + inStream, dataStartPos, + outBuffer->data, (size_t)unpackSize, allocTemp); + RINOK(res); +#ifdef _7ZIP_CRC_SUPPORT + if (folder->UnpackCRCDefined) + if (CrcCalc(outBuffer->data, (size_t)unpackSize) != folder->UnpackCRC) + return SZ_ERROR_CRC; +#endif + return SZ_OK; +} + +static SRes SzReadAndDecodePackedStreams( + ILookInStream *inStream, + CSzData *sd, + CBuf *outBuffer, + UInt64 baseOffset, + ISzAlloc *allocTemp) +{ + CSzAr p; + UInt64 *unpackSizes = 0; + Byte *digestsDefined = 0; + UInt32 *digests = 0; + SRes res; + SzAr_Init(&p); + res = SzReadAndDecodePackedStreams2(inStream, sd, outBuffer, baseOffset, + &p, &unpackSizes, &digestsDefined, &digests, + allocTemp); + SzAr_Free(&p, allocTemp); + IAlloc_Free(allocTemp, unpackSizes); + IAlloc_Free(allocTemp, digestsDefined); + IAlloc_Free(allocTemp, digests); + return res; +} + +static SRes SzArEx_Open2( + CSzArEx *p, + ILookInStream *inStream, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + Byte header[k7zStartHeaderSize]; + Int64 startArcPos; + UInt64 nextHeaderOffset, nextHeaderSize; + size_t nextHeaderSizeT; +#ifdef _7ZIP_CRC_SUPPORT + UInt32 nextHeaderCRC; +#endif + CBuf buffer; + SRes res; + + startArcPos = 0; + RINOK(inStream->Seek(inStream, &startArcPos, SZ_SEEK_CUR)); + + RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); + + if (!TestSignatureCandidate(header)) + return SZ_ERROR_NO_ARCHIVE; + if (header[6] != k7zMajorVersion) + return SZ_ERROR_UNSUPPORTED; + + nextHeaderOffset = GetUi64(header + 12); + nextHeaderSize = GetUi64(header + 20); +#ifdef _7ZIP_CRC_SUPPORT + nextHeaderCRC = GetUi32(header + 28); +#endif + + p->startPosAfterHeader = startArcPos + k7zStartHeaderSize; + +#ifdef _7ZIP_CRC_SUPPORT + if (CrcCalc(header + 12, 20) != GetUi32(header + 8)) + return SZ_ERROR_CRC; +#endif + + nextHeaderSizeT = (size_t)nextHeaderSize; + if (nextHeaderSizeT != nextHeaderSize) + return SZ_ERROR_MEM; + if (nextHeaderSizeT == 0) + return SZ_OK; + if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize || + nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize) + return SZ_ERROR_NO_ARCHIVE; + + { + Int64 pos = 0; + RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_END)); + if ((UInt64)pos < startArcPos + nextHeaderOffset || + (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset || + (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) + return SZ_ERROR_INPUT_EOF; + } + + RINOK(LookInStream_SeekTo(inStream, startArcPos + k7zStartHeaderSize + nextHeaderOffset)); + + if (!Buf_Create(&buffer, nextHeaderSizeT, allocTemp)) + return SZ_ERROR_MEM; + + res = LookInStream_Read(inStream, buffer.data, nextHeaderSizeT); + if (res == SZ_OK) + { +#ifdef _7ZIP_CRC_SUPPORT + res = SZ_ERROR_ARCHIVE; + if (CrcCalc(buffer.data, nextHeaderSizeT) == nextHeaderCRC) +#else + if (1) +#endif + { + CSzData sd; + UInt64 type; + sd.Data = buffer.data; + sd.Size = buffer.size; + res = SzReadID(&sd, &type); + if (res == SZ_OK) + { + if (type == k7zIdEncodedHeader) + { + CBuf outBuffer; + Buf_Init(&outBuffer); + res = SzReadAndDecodePackedStreams(inStream, &sd, &outBuffer, p->startPosAfterHeader, allocTemp); + if (res != SZ_OK) + Buf_Free(&outBuffer, allocTemp); + else + { + Buf_Free(&buffer, allocTemp); + buffer.data = outBuffer.data; + buffer.size = outBuffer.size; + sd.Data = buffer.data; + sd.Size = buffer.size; + res = SzReadID(&sd, &type); + } + } + } + if (res == SZ_OK) + { + if (type == k7zIdHeader) + res = SzReadHeader(p, &sd, allocMain, allocTemp); + else + res = SZ_ERROR_UNSUPPORTED; + } + } + } + Buf_Free(&buffer, allocTemp); + return res; +} + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, ISzAlloc *allocMain, ISzAlloc *allocTemp) +{ + SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); + if (res != SZ_OK) + SzArEx_Free(p, allocMain); + return res; +} + +SRes SzArEx_Extract( + const CSzArEx *p, + ILookInStream *inStream, + UInt32 fileIndex, + SzArEx_DictCache *dictCache, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 folderIndex = p->FileIndexToFolderIndexMap[fileIndex]; + SRes res = SZ_OK; + dictCache->entryOffset = 0; + dictCache->outSizeProcessed = 0; + if (folderIndex == (UInt32)-1) + { + SzArEx_DictCache_free(dictCache); + dictCache->blockIndex = folderIndex; + return SZ_OK; + } + + if (dictCache->outBuffer == 0 || dictCache->blockIndex != folderIndex) + { + CSzFolder *folder = p->db.Folders + folderIndex; + UInt64 unpackSizeSpec = SzFolder_GetUnpackSize(folder); + size_t unpackSize = (size_t)unpackSizeSpec; + UInt64 startOffset = SzArEx_GetFolderStreamPos(p, folderIndex, 0); + + if (unpackSize != unpackSizeSpec) + return SZ_ERROR_MEM; + + SzArEx_DictCache_free(dictCache); + dictCache->blockIndex = folderIndex; + + RINOK(LookInStream_SeekTo(inStream, startOffset)); + + if (res == SZ_OK) + { + dictCache->outBufferSize = unpackSize; + if (unpackSize != 0) + { + if (dictCache->mapFilename && (unpackSize >= k7zUnpackMapDictionaryInMemoryMaxNumBytes)) { + // map to disk is enabled and file is larger than 1 megabyte. + // note that an error condition is checked by seeing if + // dictCache->outBuffer after a map attempt + SzArEx_DictCache_mmap(dictCache); + } else { + dictCache->outBuffer = (Byte *)IAlloc_Alloc(allocMain, unpackSize); + } + if (dictCache->outBuffer == 0) + res = SZ_ERROR_MEM; + } + if (res == SZ_OK) + { + res = SzFolder_Decode(folder, + p->db.PackSizes + p->FolderStartPackStreamIndex[folderIndex], + inStream, startOffset, + dictCache->outBuffer, unpackSize, allocTemp); + if (res == SZ_OK) + { + if (folder->UnpackCRCDefined) + { +#ifdef _7ZIP_CRC_SUPPORT + if (CrcCalc(dictCache->outBuffer, unpackSize) != folder->UnpackCRC) + res = SZ_ERROR_CRC; +#endif + } + } + } + } + } + if (res == SZ_OK) + { + UInt32 i; + CSzFileItem *fileItem = p->db.Files + fileIndex; + dictCache->entryOffset = 0; + for (i = p->FolderStartFileIndex[folderIndex]; i < fileIndex; i++) + dictCache->entryOffset += (UInt32)p->db.Files[i].Size; + dictCache->outSizeProcessed = (size_t)fileItem->Size; + if (dictCache->entryOffset + dictCache->outSizeProcessed > dictCache->outBufferSize) + return SZ_ERROR_FAIL; +#ifdef _7ZIP_CRC_SUPPORT + if (fileItem->CrcDefined && CrcCalc(dictCache->outBuffer + dictCache->entryOffset, dictCache->outSizeProcessed) != fileItem->Crc) + res = SZ_ERROR_CRC; +#endif + } + return res; +} + +void +SzArEx_DictCache_init(SzArEx_DictCache *dictCache, ISzAlloc *allocMain) +{ + dictCache->allocMain = allocMain; + dictCache->blockIndex = 0xFFFFFFFF; + dictCache->outBuffer = 0; + dictCache->outBufferSize = 0; + dictCache->entryOffset = 0; + dictCache->outSizeProcessed = 0; + // Note that the mapFilename is not reset to NULL here + dictCache->mapFile = NULL; + dictCache->mapSize = 0; +} + +void +SzArEx_DictCache_free(SzArEx_DictCache *dictCache) +{ + if (dictCache->mapFile) { + // unmap memory + SzArEx_DictCache_munmap(dictCache); + // close file handle (it will be set to NULL in init method) + // FIXME: can we close the FILE* and just hold on to the mmap pointer? I think + // that will keep the fd open until the mapping is closed. + fclose(dictCache->mapFile); + } else if (dictCache->outBuffer != 0) { + // free memory that was allocated on the heap + IAlloc_Free(dictCache->allocMain, dictCache->outBuffer); + } + SzArEx_DictCache_init(dictCache, dictCache->allocMain); +} + +#if __LP64__ +#define SM_PAGESIZE 16384 +#else +#define SM_PAGESIZE 4096 +#endif // __LP64__ + +int +SzArEx_DictCache_mmap(SzArEx_DictCache *dictCache) +{ + assert(dictCache->mapFilename); + assert(dictCache->mapFile == NULL); + + FILE *mapfile = fopen(dictCache->mapFilename, "wb+"); + + if (mapfile == NULL) { + return 1; + } + + // Extend the file size so that it is a known length before mapping. + size_t mapSize = dictCache->outBufferSize; + assert(mapSize > 0); + + // Make sure mapSize is in terms of whole pages + { + int numPages = (int) mapSize / SM_PAGESIZE; + if ((mapSize % SM_PAGESIZE) > 0) { + numPages += 1; + } + mapSize = (numPages * SM_PAGESIZE); + } + + assert(mapSize >= SM_PAGESIZE); + assert((mapSize % SM_PAGESIZE) == 0); + dictCache->mapSize = mapSize; + + if ((1)) { + // Seek to the end of the file should create holes in file, but this + // does not seem to create a writable mapping as the access at the + // end of this function crashes. + + int seekResult = fseek(mapfile, mapSize - 1, SEEK_SET); + assert(seekResult == 0); + + off_t fileOffsetBeforeWrite = ftell(mapfile); + assert(fileOffsetBeforeWrite == (mapSize - 1)); + + // Need to actually write a byte in order for the file + // to be extended to this length. + char oneByte = 0; + int writeResult = (int) fwrite(&oneByte, 1, 1, mapfile); + assert(writeResult == 1); + + fflush(mapfile); + + // If writing a byte did not actually work, then it seems + // that the device is out of space. This condition is + // not indicated by any of the calls above, but the + // ftell will not report that the end of file advanced. + + off_t fileOffsetAfterWrite = ftell(mapfile); + + if (fileOffsetAfterWrite == fileOffsetBeforeWrite) { + fclose(mapfile); + return 3; + } + } else { + // Instead of using seek to write a whole in the file, write + // empty zero pages until the file is the proper length + // but with nothing but zeros in it. + char page[SM_PAGESIZE]; + bzero(page, SM_PAGESIZE); + for (int pageIndex = 0; pageIndex < (mapSize / SM_PAGESIZE); pageIndex++) { + int writeNum = (int)fwrite(page, 1, SM_PAGESIZE, mapfile); + assert(writeNum == SM_PAGESIZE); + } + } + + off_t fileOffset = ftell(mapfile); + assert(fileOffset == mapSize); + + int fd = fileno(mapfile); + off_t offset = 0; + + int protection; + int flags; + + int readWriteMapping = 1; + + if (!readWriteMapping) { + // Normal read only shared mapping + protection = PROT_READ; + flags = MAP_FILE | MAP_SHARED; + } else { + // read + write mapping, pages are flushed to disk as needed + protection = PROT_READ | PROT_WRITE; + flags = MAP_FILE | MAP_SHARED; + } + + char *mappedData = mmap(NULL, mapSize, protection, flags, fd, offset); + + if (mappedData == MAP_FAILED) { + int errnoVal = errno; + int retval = 0; + // Check for known fatal errors + + if (errnoVal == EACCES) { + // mmap result EACCES : file not opened for reading or writing + retval = 1; + } else if (errnoVal == EBADF) { + // mmap result EBADF : bad file descriptor + retval = 1; + } else if (errnoVal == EINVAL) { + // mmap result EINVAL + retval = 1; + } else if (errnoVal == ENODEV) { + // mmap result ENODEV : page does not support mapping + retval = 1; + } else if (errnoVal == ENXIO) { + // mmap result ENXIO : invalid addresses + retval = 1; + } else if (errnoVal == EOVERFLOW) { + // mmap result EOVERFLOW : addresses exceed the maximum offset + retval = 1; + } else if (errnoVal == ENOMEM) { + // Note that ENOMEM is checked here since it is actually likely to happen + // due to running out of memory that could be mapped. Return a special code. + retval = 2; + } + + fclose(mapfile); + return retval; + } + + // We always map at least 1 page of memory, so test basic writing of bytes by + // writing zero to the first and second bytes in the mapped memory. + + mappedData[0] = 0; + mappedData[1] = 0; + + dictCache->mapFile = mapfile; + dictCache->outBuffer = (void*)mappedData; + + return 0; +} + +void +SzArEx_DictCache_munmap(SzArEx_DictCache *dictCache) +{ + if (dictCache->mapFilename != NULL) { + int result = munmap(dictCache->outBuffer, dictCache->mapSize); + assert(result == 0); + dictCache->outBuffer = NULL; + dictCache->mapSize = 0; + } +} diff --git a/Provenance/LZMASDK/7zStream.c b/Provenance/LZMASDK/7zStream.c new file mode 100755 index 0000000000..f0959fb078 --- /dev/null +++ b/Provenance/LZMASDK/7zStream.c @@ -0,0 +1,169 @@ +/* 7zStream.c -- 7z Stream functions +2010-03-11 : Igor Pavlov : Public domain */ + +#include + +#include "Types.h" + +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType) +{ + while (size != 0) + { + size_t processed = size; + RINOK(stream->Read(stream, buf, &processed)); + if (processed == 0) + return errorType; + buf = (void *)((Byte *)buf + processed); + size -= processed; + } + return SZ_OK; +} + +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size) +{ + return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); +} + +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf) +{ + size_t processed = 1; + RINOK(stream->Read(stream, buf, &processed)); + return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; +} + +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset) +{ + Int64 t = offset; + return stream->Seek(stream, &t, SZ_SEEK_SET); +} + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size) +{ + const void *lookBuf; + if (*size == 0) + return SZ_OK; + RINOK(stream->Look(stream, &lookBuf, size)); + memcpy(buf, lookBuf, *size); + return stream->Skip(stream, *size); +} + +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType) +{ + while (size != 0) + { + size_t processed = size; + RINOK(stream->Read(stream, buf, &processed)); + if (processed == 0) + return errorType; + buf = (void *)((Byte *)buf + processed); + size -= processed; + } + return SZ_OK; +} + +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size) +{ + return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); +} + +static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size) +{ + SRes res = SZ_OK; + CLookToRead *p = (CLookToRead *)pp; + size_t size2 = p->size - p->pos; + if (size2 == 0 && *size > 0) + { + p->pos = 0; + size2 = LookToRead_BUF_SIZE; + res = p->realStream->Read(p->realStream, p->buf, &size2); + p->size = size2; + } + if (size2 < *size) + *size = size2; + *buf = p->buf + p->pos; + return res; +} + +static SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size) +{ + SRes res = SZ_OK; + CLookToRead *p = (CLookToRead *)pp; + size_t size2 = p->size - p->pos; + if (size2 == 0 && *size > 0) + { + p->pos = 0; + if (*size > LookToRead_BUF_SIZE) + *size = LookToRead_BUF_SIZE; + res = p->realStream->Read(p->realStream, p->buf, size); + size2 = p->size = *size; + } + if (size2 < *size) + *size = size2; + *buf = p->buf + p->pos; + return res; +} + +static SRes LookToRead_Skip(void *pp, size_t offset) +{ + CLookToRead *p = (CLookToRead *)pp; + p->pos += offset; + return SZ_OK; +} + +static SRes LookToRead_Read(void *pp, void *buf, size_t *size) +{ + CLookToRead *p = (CLookToRead *)pp; + size_t rem = p->size - p->pos; + if (rem == 0) + return p->realStream->Read(p->realStream, buf, size); + if (rem > *size) + rem = *size; + memcpy(buf, p->buf + p->pos, rem); + p->pos += rem; + *size = rem; + return SZ_OK; +} + +static SRes LookToRead_Seek(void *pp, Int64 *pos, ESzSeek origin) +{ + CLookToRead *p = (CLookToRead *)pp; + p->pos = p->size = 0; + return p->realStream->Seek(p->realStream, pos, origin); +} + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead) +{ + p->s.Look = lookahead ? + LookToRead_Look_Lookahead : + LookToRead_Look_Exact; + p->s.Skip = LookToRead_Skip; + p->s.Read = LookToRead_Read; + p->s.Seek = LookToRead_Seek; +} + +void LookToRead_Init(CLookToRead *p) +{ + p->pos = p->size = 0; +} + +static SRes SecToLook_Read(void *pp, void *buf, size_t *size) +{ + CSecToLook *p = (CSecToLook *)pp; + return LookInStream_LookRead(p->realStream, buf, size); +} + +void SecToLook_CreateVTable(CSecToLook *p) +{ + p->s.Read = SecToLook_Read; +} + +static SRes SecToRead_Read(void *pp, void *buf, size_t *size) +{ + CSecToRead *p = (CSecToRead *)pp; + return p->realStream->Read(p->realStream, buf, size); +} + +void SecToRead_CreateVTable(CSecToRead *p) +{ + p->s.Read = SecToRead_Read; +} diff --git a/Provenance/LZMASDK/7zVersion.h b/Provenance/LZMASDK/7zVersion.h new file mode 100755 index 0000000000..43f0fef6ff --- /dev/null +++ b/Provenance/LZMASDK/7zVersion.h @@ -0,0 +1,8 @@ +#define MY_VER_MAJOR 9 +#define MY_VER_MINOR 22 +#define MY_VER_BUILD 00 +#define MY_VERSION "9.22 beta" +#define MY_7ZIP_VERSION "9.22 beta" +#define MY_DATE "2011-04-18" +#define MY_COPYRIGHT ": Igor Pavlov : Public domain" +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION " " MY_COPYRIGHT " : " MY_DATE diff --git a/Provenance/LZMASDK/Alloc.c b/Provenance/LZMASDK/Alloc.c new file mode 100755 index 0000000000..bb24a772b3 --- /dev/null +++ b/Provenance/LZMASDK/Alloc.c @@ -0,0 +1,127 @@ +/* Alloc.c -- Memory allocation functions +2008-09-24 +Igor Pavlov +Public domain */ + +#ifdef _WIN32 +#include +#endif +#include + +#include "Alloc.h" + +/* #define _SZ_ALLOC_DEBUG */ + +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef _SZ_ALLOC_DEBUG +#include +int g_allocCount = 0; +int g_allocCountMid = 0; +int g_allocCountBig = 0; +#endif + +void *MyAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + { + void *p = malloc(size); + fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); + return p; + } + #else + return malloc(size); + #endif +} + +void MyFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); + #endif + free(address); +} + +#ifdef _WIN32 + +void *MidAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void MidFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); + #endif + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#ifndef MEM_LARGE_PAGES +#undef _7ZIP_LARGE_PAGES +#endif + +#ifdef _7ZIP_LARGE_PAGES +SIZE_T g_LargePageSize = 0; +typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); +#endif + +void SetLargePageSize() +{ + #ifdef _7ZIP_LARGE_PAGES + SIZE_T size = 0; + GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); + if (largePageMinimum == 0) + return; + size = largePageMinimum(); + if (size == 0 || (size & (size - 1)) != 0) + return; + g_LargePageSize = size; + #endif +} + + +void *BigAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); + #endif + + #ifdef _7ZIP_LARGE_PAGES + if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) + { + void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), + MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); + if (res != 0) + return res; + } + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void BigFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); + #endif + + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#endif diff --git a/Provenance/LZMASDK/Alloc.h b/Provenance/LZMASDK/Alloc.h new file mode 100755 index 0000000000..6b3f03474e --- /dev/null +++ b/Provenance/LZMASDK/Alloc.h @@ -0,0 +1,38 @@ +/* Alloc.h -- Memory allocation functions +2009-02-07 : Igor Pavlov : Public domain */ + +#ifndef __COMMON_ALLOC_H +#define __COMMON_ALLOC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void *MyAlloc(size_t size); +void MyFree(void *address); + +#ifdef _WIN32 + +void SetLargePageSize(); + +void *MidAlloc(size_t size); +void MidFree(void *address); +void *BigAlloc(size_t size); +void BigFree(void *address); + +#else + +#define MidAlloc(size) MyAlloc(size) +#define MidFree(address) MyFree(address) +#define BigAlloc(size) MyAlloc(size) +#define BigFree(address) MyFree(address) + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Provenance/LZMASDK/CpuArch.c b/Provenance/LZMASDK/CpuArch.c new file mode 100755 index 0000000000..9b5e76a2e2 --- /dev/null +++ b/Provenance/LZMASDK/CpuArch.c @@ -0,0 +1,7 @@ +/* CpuArch.c -- CPU specific code +2009-12-12: Igor Pavlov : Public domain */ + +#pragma clang diagnostic ignored "-Wmissing-prototypes" + +#include "CpuArch.h" + diff --git a/Provenance/LZMASDK/CpuArch.h b/Provenance/LZMASDK/CpuArch.h new file mode 100755 index 0000000000..af2cf661cf --- /dev/null +++ b/Provenance/LZMASDK/CpuArch.h @@ -0,0 +1,123 @@ +/* CpuArch.h -- CPU specific code +2010-12-01: Igor Pavlov : Public domain */ + +#ifndef __CPU_ARCH_H +#define __CPU_ARCH_H + +#include "Types.h" + +EXTERN_C_BEGIN + +/* +MY_CPU_LE means that CPU is LITTLE ENDIAN. +If MY_CPU_LE is not defined, we don't know about that property of platform (it can be LITTLE ENDIAN). + +MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. +If MY_CPU_LE_UNALIGN is not defined, we don't know about these properties of platform. +*/ + +#if defined(_M_X64) || defined(_M_AMD64) || defined(__x86_64__) +#define MY_CPU_AMD64 +#endif + +#if defined(MY_CPU_AMD64) || defined(_M_IA64) +#define MY_CPU_64BIT +#endif + +#if defined(_M_IX86) || defined(__i386__) +#define MY_CPU_X86 +#endif + +#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) +#define MY_CPU_X86_OR_AMD64 +#endif + +#if defined(MY_CPU_X86) || defined(_M_ARM) +#define MY_CPU_32BIT +#endif + +#if defined(_WIN32) && defined(_M_ARM) +#define MY_CPU_ARM_LE +#endif + +#if defined(_WIN32) && defined(_M_IA64) +#define MY_CPU_IA64_LE +#endif + +#if defined(MY_CPU_X86_OR_AMD64) +#define MY_CPU_LE_UNALIGN +#endif + +#if defined(MY_CPU_X86_OR_AMD64) || defined(MY_CPU_ARM_LE) || defined(MY_CPU_IA64_LE) || defined(__ARMEL__) || defined(__MIPSEL__) || defined(__LITTLE_ENDIAN__) +#define MY_CPU_LE +#endif + +#if defined(__BIG_ENDIAN__) || defined(__m68k__) || defined(__ARMEB__) || defined(__MIPSEB__) +#define MY_CPU_BE +#endif + +#if defined(MY_CPU_LE) && defined(MY_CPU_BE) +Stop_Compiling_Bad_Endian +#endif + +#ifdef MY_CPU_LE_UNALIGN + +#define GetUi16(p) (*(const UInt16 *)(p)) +#define GetUi32(p) (*(const UInt32 *)(p)) +#define GetUi64(p) (*(const UInt64 *)(p)) +#define SetUi16(p, d) *(UInt16 *)(p) = (d); +#define SetUi32(p, d) *(UInt32 *)(p) = (d); +#define SetUi64(p, d) *(UInt64 *)(p) = (d); + +#else + +#define GetUi16(p) (((const Byte *)(p))[0] | ((UInt16)((const Byte *)(p))[1] << 8)) + +#define GetUi32(p) ( \ + ((const Byte *)(p))[0] | \ + ((UInt32)((const Byte *)(p))[1] << 8) | \ + ((UInt32)((const Byte *)(p))[2] << 16) | \ + ((UInt32)((const Byte *)(p))[3] << 24)) + +#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) + +#define SetUi16(p, d) { UInt32 _x_ = (d); \ + ((Byte *)(p))[0] = (Byte)_x_; \ + ((Byte *)(p))[1] = (Byte)(_x_ >> 8); } + +#define SetUi32(p, d) { UInt32 _x_ = (d); \ + ((Byte *)(p))[0] = (Byte)_x_; \ + ((Byte *)(p))[1] = (Byte)(_x_ >> 8); \ + ((Byte *)(p))[2] = (Byte)(_x_ >> 16); \ + ((Byte *)(p))[3] = (Byte)(_x_ >> 24); } + +#define SetUi64(p, d) { UInt64 _x64_ = (d); \ + SetUi32(p, (UInt32)_x64_); \ + SetUi32(((Byte *)(p)) + 4, (UInt32)(_x64_ >> 32)); } + +#endif + +#if defined(MY_CPU_LE_UNALIGN) && defined(_WIN64) && (_MSC_VER >= 1300) + +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) +#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p)) +#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p)) + +#else + +#define GetBe32(p) ( \ + ((UInt32)((const Byte *)(p))[0] << 24) | \ + ((UInt32)((const Byte *)(p))[1] << 16) | \ + ((UInt32)((const Byte *)(p))[2] << 8) | \ + ((const Byte *)(p))[3] ) + +#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) + +#endif + +#define GetBe16(p) (((UInt16)((const Byte *)(p))[0] << 8) | ((const Byte *)(p))[1]) + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/Delta.c b/Provenance/LZMASDK/Delta.c new file mode 100755 index 0000000000..93c93a1484 --- /dev/null +++ b/Provenance/LZMASDK/Delta.c @@ -0,0 +1,62 @@ +/* Delta.c -- Delta converter +2009-05-26 : Igor Pavlov : Public domain */ + +#include "Delta.h" + +void Delta_Init(Byte *state) +{ + unsigned i; + for (i = 0; i < DELTA_STATE_SIZE; i++) + state[i] = 0; +} + +static void MyMemCpy(Byte *dest, const Byte *src, unsigned size) +{ + unsigned i; + for (i = 0; i < size; i++) + dest[i] = src[i]; +} + +void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size) +{ + Byte buf[DELTA_STATE_SIZE]; + unsigned j = 0; + MyMemCpy(buf, state, delta); + { + SizeT i; + for (i = 0; i < size;) + { + for (j = 0; j < delta && i < size; i++, j++) + { + Byte b = data[i]; + data[i] = (Byte)(b - buf[j]); + buf[j] = b; + } + } + } + if (j == delta) + j = 0; + MyMemCpy(state, buf + j, delta - j); + MyMemCpy(state + delta - j, buf, j); +} + +void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size) +{ + Byte buf[DELTA_STATE_SIZE]; + unsigned j = 0; + MyMemCpy(buf, state, delta); + { + SizeT i; + for (i = 0; i < size;) + { + for (j = 0; j < delta && i < size; i++, j++) + { + buf[j] = data[i] = (Byte)(buf[j] + data[i]); + } + } + } + if (j == delta) + j = 0; + MyMemCpy(state, buf + j, delta - j); + MyMemCpy(state + delta - j, buf, j); +} diff --git a/Provenance/LZMASDK/Delta.h b/Provenance/LZMASDK/Delta.h new file mode 100755 index 0000000000..776cd45519 --- /dev/null +++ b/Provenance/LZMASDK/Delta.h @@ -0,0 +1,23 @@ +/* Delta.h -- Delta converter +2009-04-15 : Igor Pavlov : Public domain */ + +#ifndef __DELTA_H +#define __DELTA_H + +#include "Types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DELTA_STATE_SIZE 256 + +void Delta_Init(Byte *state); +void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size); +void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Provenance/LZMASDK/LZMAExtractor.h b/Provenance/LZMASDK/LZMAExtractor.h new file mode 100644 index 0000000000..a7545006ff --- /dev/null +++ b/Provenance/LZMASDK/LZMAExtractor.h @@ -0,0 +1,39 @@ +// +// LZMAExtractor.h +// lzmaSDK +// +// Created by Brian Chaikelson on 11/19/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import + +@interface LZMAExtractor : NSObject { +} + +// Extract all the contents of a .7z archive directly into the indicated dir. +// Directory structure is ignored if preserveDir is false. + ++ (NSArray*) extract7zArchive:(NSString*)archivePath + dirName:(NSString*)dirName + preserveDir:(BOOL)preserveDir; + +// Extract all the contents of a .7z archive into the indicated temp dir +// and return an array of the fully qualified filenames. This API +// implicitly passes preserveDir as FALSE, so directory elements in the +// entry name are always ignored as files are extracted. If multiple +// entries have duplicated filenames in different directories, then +// this API would would overwrite the duplicate entry file. + ++ (NSArray*) extract7zArchive:(NSString*)archivePath + tmpDirName:(NSString*)tmpDirName; + +// Extract just one entry from an archive and save it at the +// path indicated by outPath. + ++ (BOOL) extractArchiveEntry:(NSString*)archivePath + archiveEntry:(NSString*)archiveEntry + outPath:(NSString*)outPath; + +@end + diff --git a/Provenance/LZMASDK/LZMAExtractor.m b/Provenance/LZMASDK/LZMAExtractor.m new file mode 100644 index 0000000000..c7f5cb791c --- /dev/null +++ b/Provenance/LZMASDK/LZMAExtractor.m @@ -0,0 +1,194 @@ +// +// LZMAExtractor.m +// lzmaSDK +// +// Created by Mo DeJong on 11/19/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import "LZMAExtractor.h" + +int do7z_extract_entry(char *archivePath, char *archiveCachePath, char *threadCwd, char *entryName, char *entryPath, int fullPaths); + +@implementation LZMAExtractor + +// Return a fully qualified random filename in the tmp dir. The filename is based on the +// exact time offset since 1970 so it should be unique. + ++ (NSString*) generateUniqueTmpCachePath +{ + NSString *tmpDir = NSTemporaryDirectory(); + + NSDate *nowDate = [NSDate date]; + NSTimeInterval ti = [nowDate timeIntervalSinceReferenceDate]; + + // Format number of seconds as a string with a decimal separator + NSString *doubleString = [NSString stringWithFormat:@"%f", ti]; + + // Remove the decimal point so that the file name consists of + // numeric characters only. + + NSRange range; + range = NSMakeRange(0, [doubleString length]); + NSString *noDecimalString = [doubleString stringByReplacingOccurrencesOfString:@"." + withString:@"" + options:0 + range:range]; + + range = NSMakeRange(0, [noDecimalString length]); + NSString *noMinusString = [noDecimalString stringByReplacingOccurrencesOfString:@"-" + withString:@"" + options:0 + range:range]; + + NSString *filename = [NSString stringWithFormat:@"%@%@", noMinusString, @".cache"]; + + NSString *tmpPath = [tmpDir stringByAppendingPathComponent:filename]; + + return tmpPath; +} + +// Recurse into directories to determine the full paths of elements extracted +// from a archive. + ++ (void) recurseIntoDirectories:(NSMutableArray*)fullPathContents + dirName:(NSString*)dirName + entryPrefix:(NSString*)entryPrefix +{ + NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirName error:nil]; + NSAssert(contents, @"contentsOfDirectoryAtPath failed"); + + for (NSString *path in contents) { + //NSLog(@"found dir path: %@", path); + NSString *fullPath = [dirName stringByAppendingPathComponent:path]; + //NSLog(@"found full path: %@", fullPath); + + BOOL isDirectory = FALSE; + BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory]; + assert(exists); + + NSString *combinedEntryPrefix; + if ([entryPrefix length] == 0) { + combinedEntryPrefix = path; + } else { + combinedEntryPrefix = [NSString stringWithFormat:@"%@/%@", entryPrefix, path]; + } + + //NSLog(@"found entry path: %@", combinedEntryPrefix); + + if (isDirectory) { + // Recurse into this directory and add the files in the directory + + [self recurseIntoDirectories:fullPathContents dirName:fullPath entryPrefix:combinedEntryPrefix]; + } else { + // A plain file path, append the entry name portion of the path. + + [fullPathContents addObject:fullPath]; + } + } + + return; +} + +// Extract all the contents of a .7z archive directly into the indicated dir + ++ (NSArray*) extract7zArchive:(NSString*)archivePath + dirName:(NSString*)dirName + preserveDir:(BOOL)preserveDir +{ + NSAssert(archivePath, @"archivePath"); + NSAssert(dirName, @"dirName"); + + BOOL worked, isDir, existsAlready; + + NSString *myTmpDir = dirName; + existsAlready = [[NSFileManager defaultManager] fileExistsAtPath:myTmpDir isDirectory:&isDir]; + + if (existsAlready && !isDir) { + worked = [[NSFileManager defaultManager] removeItemAtPath:myTmpDir error:nil]; + NSAssert(worked, @"could not remove existing file with same name as tmp dir"); + // create the directory below + } + + if (existsAlready && isDir) { +// // Remove all the files in the named tmp dir +// NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:myTmpDir error:nil]; +// NSAssert(contents, @"contentsOfDirectoryAtPath failed"); +// for (NSString *path in contents) { +// NSLog(@"found existing dir path: %@", path); +// NSString *myTmpDirPath = [myTmpDir stringByAppendingPathComponent:path]; +// worked = [[NSFileManager defaultManager] removeItemAtPath:myTmpDirPath error:nil]; +// NSAssert(worked, @"could not remove existing file"); +// } + } else { + worked = [[NSFileManager defaultManager] createDirectoryAtPath:myTmpDir withIntermediateDirectories:YES attributes:nil error:nil]; + NSAssert(worked, @"could not create tmp dir"); + } + + // Create dir str that has a '/' character at the end so that strcat() can be used to + // create a path string without using Cocoa path join logic. + + NSMutableString *dirQualMStr = [NSMutableString stringWithString:dirName]; + if ([dirQualMStr hasSuffix:@"/"] == FALSE) { + [dirQualMStr appendString:@"/"]; + } + + char *archivePathPtr = (char*) [archivePath UTF8String]; + NSString *archiveCachePath = [self generateUniqueTmpCachePath]; + char *archiveCachePathPtr = (char*) [archiveCachePath UTF8String]; + char *threadCwd = (char*) [dirQualMStr UTF8String]; + char *entryNamePtr = NULL; // Extract all entries by passing NULL + char *entryPathPtr = NULL; + + [[NSFileManager defaultManager] createDirectoryAtPath:archiveCachePath + withIntermediateDirectories:YES + attributes:nil + error:nil]; + + int result = do7z_extract_entry(archivePathPtr, archiveCachePathPtr, threadCwd, entryNamePtr, entryPathPtr, preserveDir ? 1 : 0); + NSAssert(result == 0, @"could not extract files from 7z archive"); + + // Examine the contents of the current directory to see what was extracted + + NSMutableArray *fullPathContents = [NSMutableArray array]; + + [self recurseIntoDirectories:fullPathContents dirName:myTmpDir entryPrefix:@""]; + + return [NSArray arrayWithArray:fullPathContents]; +} + +// Extract all the contents of a .7z archive into the indicated temp dir +// and return an array of the fully qualified filenames. + ++ (NSArray*) extract7zArchive:(NSString*)archivePath + tmpDirName:(NSString*)tmpDirName +{ + NSAssert(archivePath, @"archivePath"); + NSAssert(tmpDirName, @"tmpDirName"); + NSString *tmpDir = NSTemporaryDirectory(); + NSString *fullTmpDir = [tmpDir stringByAppendingPathComponent:tmpDirName]; + return [self extract7zArchive:archivePath dirName:fullTmpDir preserveDir:FALSE]; +} + +// Extract just one entry from an archive and save it at the +// path indicated by outPath. + ++ (BOOL) extractArchiveEntry:(NSString*)archivePath + archiveEntry:(NSString*)archiveEntry + outPath:(NSString*)outPath +{ + NSAssert(archivePath, @"archivePath"); + NSAssert(archiveEntry, @"archiveEntry"); + NSAssert(outPath, @"outPath"); + + char *archivePathPtr = (char*) [archivePath UTF8String]; + NSString *archiveCachePath = [self generateUniqueTmpCachePath]; + char *archiveCachePathPtr = (char*) [archiveCachePath UTF8String]; + char *archiveEntryPtr = (char*) [archiveEntry UTF8String]; + char *outPathPtr = (char*) [outPath UTF8String]; + + int result = do7z_extract_entry(archivePathPtr, archiveCachePathPtr, NULL, archiveEntryPtr, outPathPtr, 0); + return (result == 0); +} + +@end diff --git a/Provenance/LZMASDK/LzHash.h b/Provenance/LZMASDK/LzHash.h new file mode 100755 index 0000000000..b2f0e3c245 --- /dev/null +++ b/Provenance/LZMASDK/LzHash.h @@ -0,0 +1,54 @@ +/* LzHash.h -- HASH functions for LZ algorithms +2009-02-07 : Igor Pavlov : Public domain */ + +#ifndef __LZ_HASH_H +#define __LZ_HASH_H + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +#define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); + +#define HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ + hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ + hash4Value &= (kHash4Size - 1); } + +/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + + +#define MT_HASH2_CALC \ + hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + hash2Value = temp & (kHash2Size - 1); \ + hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ + hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } + +#endif diff --git a/Provenance/LZMASDK/Lzma2Dec.c b/Provenance/LZMASDK/Lzma2Dec.c new file mode 100755 index 0000000000..7c4eb4449e --- /dev/null +++ b/Provenance/LZMASDK/Lzma2Dec.c @@ -0,0 +1,350 @@ +/* Lzma2Dec.c -- LZMA2 Decoder +2010-12-15 : Igor Pavlov : Public domain */ + +/* #define SHOW_DEBUG_INFO */ + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#include + +#include "Lzma2Dec.h" + +/* +00000000 - EOS +00000001 U U - Uncompressed Reset Dic +00000010 U U - Uncompressed No Reset +100uuuuu U U P P - LZMA no reset +101uuuuu U U P P - LZMA reset state +110uuuuu U U P P S - LZMA reset state + new prop +111uuuuu U U P P S - LZMA reset state + new prop + reset dic + + u, U - Unpack Size + P - Pack Size + S - Props +*/ + +#define LZMA2_CONTROL_LZMA (1 << 7) +#define LZMA2_CONTROL_COPY_NO_RESET 2 +#define LZMA2_CONTROL_COPY_RESET_DIC 1 +#define LZMA2_CONTROL_EOF 0 + +#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0) + +#define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3) +#define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2) + +#define LZMA2_LCLP_MAX 4 +#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) + +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif + +typedef enum +{ + LZMA2_STATE_CONTROL, + LZMA2_STATE_UNPACK0, + LZMA2_STATE_UNPACK1, + LZMA2_STATE_PACK0, + LZMA2_STATE_PACK1, + LZMA2_STATE_PROP, + LZMA2_STATE_DATA, + LZMA2_STATE_DATA_CONT, + LZMA2_STATE_FINISHED, + LZMA2_STATE_ERROR +} ELzma2State; + +static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) +{ + UInt32 dicSize; + if (prop > 40) + return SZ_ERROR_UNSUPPORTED; + dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); + props[0] = (Byte)LZMA2_LCLP_MAX; + props[1] = (Byte)(dicSize); + props[2] = (Byte)(dicSize >> 8); + props[3] = (Byte)(dicSize >> 16); + props[4] = (Byte)(dicSize >> 24); + return SZ_OK; +} + +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) +{ + Byte props[LZMA_PROPS_SIZE]; + RINOK(Lzma2Dec_GetOldProps(prop, props)); + return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); +} + +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) +{ + Byte props[LZMA_PROPS_SIZE]; + RINOK(Lzma2Dec_GetOldProps(prop, props)); + return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); +} + +void Lzma2Dec_Init(CLzma2Dec *p) +{ + p->state = LZMA2_STATE_CONTROL; + p->needInitDic = True; + p->needInitState = True; + p->needInitProp = True; + LzmaDec_Init(&p->decoder); +} + +static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) +{ + switch(p->state) + { + case LZMA2_STATE_CONTROL: + p->control = b; + PRF(printf("\n %4X ", p->decoder.dicPos)); + PRF(printf(" %2X", b)); + if (p->control == 0) + return LZMA2_STATE_FINISHED; + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if ((p->control & 0x7F) > 2) + return LZMA2_STATE_ERROR; + p->unpackSize = 0; + } + else + p->unpackSize = (UInt32)(p->control & 0x1F) << 16; + return LZMA2_STATE_UNPACK0; + + case LZMA2_STATE_UNPACK0: + p->unpackSize |= (UInt32)b << 8; + return LZMA2_STATE_UNPACK1; + + case LZMA2_STATE_UNPACK1: + p->unpackSize |= (UInt32)b; + p->unpackSize++; + PRF(printf(" %8d", p->unpackSize)); + return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; + + case LZMA2_STATE_PACK0: + p->packSize = (UInt32)b << 8; + return LZMA2_STATE_PACK1; + + case LZMA2_STATE_PACK1: + p->packSize |= (UInt32)b; + p->packSize++; + PRF(printf(" %8d", p->packSize)); + return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP: + (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA); + + case LZMA2_STATE_PROP: + { + int lc, lp; + if (b >= (9 * 5 * 5)) + return LZMA2_STATE_ERROR; + lc = b % 9; + b /= 9; + p->decoder.prop.pb = b / 5; + lp = b % 5; + if (lc + lp > LZMA2_LCLP_MAX) + return LZMA2_STATE_ERROR; + p->decoder.prop.lc = lc; + p->decoder.prop.lp = lp; + p->needInitProp = False; + return LZMA2_STATE_DATA; + } + } + return LZMA2_STATE_ERROR; +} + +static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) +{ + memcpy(p->dic + p->dicPos, src, size); + p->dicPos += size; + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size) + p->checkDicSize = p->prop.dicSize; + p->processedPos += (UInt32)size; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState); + +SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->state != LZMA2_STATE_FINISHED) + { + SizeT dicPos = p->decoder.dicPos; + if (p->state == LZMA2_STATE_ERROR) + return SZ_ERROR_DATA; + if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) + { + if (*srcLen == inSize) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + (*srcLen)++; + p->state = Lzma2Dec_UpdateState(p, *src++); + continue; + } + { + SizeT destSizeCur = dicLimit - dicPos; + SizeT srcSizeCur = inSize - *srcLen; + ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; + + if (p->unpackSize <= destSizeCur) + { + destSizeCur = (SizeT)p->unpackSize; + curFinishMode = LZMA_FINISH_END; + } + + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if (*srcLen == inSize) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + if (p->state == LZMA2_STATE_DATA) + { + Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); + if (initDic) + p->needInitProp = p->needInitState = True; + else if (p->needInitDic) + return SZ_ERROR_DATA; + p->needInitDic = False; + LzmaDec_InitDicAndState(&p->decoder, initDic, False); + } + + if (srcSizeCur > destSizeCur) + srcSizeCur = destSizeCur; + + if (srcSizeCur == 0) + return SZ_ERROR_DATA; + + LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur); + + src += srcSizeCur; + *srcLen += srcSizeCur; + p->unpackSize -= (UInt32)srcSizeCur; + p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; + } + else + { + SizeT outSizeProcessed; + SRes res; + + if (p->state == LZMA2_STATE_DATA) + { + int mode = LZMA2_GET_LZMA_MODE(p); + Bool initDic = (mode == 3); + Bool initState = (mode > 0); + if ((!initDic && p->needInitDic) || (!initState && p->needInitState)) + return SZ_ERROR_DATA; + + LzmaDec_InitDicAndState(&p->decoder, initDic, initState); + p->needInitDic = False; + p->needInitState = False; + p->state = LZMA2_STATE_DATA_CONT; + } + if (srcSizeCur > p->packSize) + srcSizeCur = (SizeT)p->packSize; + + res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status); + + src += srcSizeCur; + *srcLen += srcSizeCur; + p->packSize -= (UInt32)srcSizeCur; + + outSizeProcessed = p->decoder.dicPos - dicPos; + p->unpackSize -= (UInt32)outSizeProcessed; + + RINOK(res); + if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) + return res; + + if (srcSizeCur == 0 && outSizeProcessed == 0) + { + if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK || + p->unpackSize != 0 || p->packSize != 0) + return SZ_ERROR_DATA; + p->state = LZMA2_STATE_CONTROL; + } + if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) + *status = LZMA_STATUS_NOT_FINISHED; + } + } + } + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; +} + +SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen, inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT srcSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->decoder.dicPos == p->decoder.dicBufSize) + p->decoder.dicPos = 0; + dicPos = p->decoder.dicPos; + if (outSize > p->decoder.dicBufSize - dicPos) + { + outSizeCur = p->decoder.dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = Lzma2Dec_DecodeToDic(p, outSizeCur, src, &srcSizeCur, curFinishMode, status); + src += srcSizeCur; + inSize -= srcSizeCur; + *srcLen += srcSizeCur; + outSizeCur = p->decoder.dicPos - dicPos; + memcpy(dest, p->decoder.dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) +{ + CLzma2Dec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + Lzma2Dec_Construct(&p); + RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); + p.decoder.dic = dest; + p.decoder.dicBufSize = outSize; + Lzma2Dec_Init(&p); + *srcLen = inSize; + res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.decoder.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + Lzma2Dec_FreeProbs(&p, alloc); + return res; +} diff --git a/Provenance/LZMASDK/Lzma2Dec.h b/Provenance/LZMASDK/Lzma2Dec.h new file mode 100755 index 0000000000..827698deeb --- /dev/null +++ b/Provenance/LZMASDK/Lzma2Dec.h @@ -0,0 +1,84 @@ +/* Lzma2Dec.h -- LZMA2 Decoder +2009-05-03 : Igor Pavlov : Public domain */ + +#ifndef __LZMA2_DEC_H +#define __LZMA2_DEC_H + +#include "LzmaDec.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------- State Interface ---------- */ + +typedef struct +{ + CLzmaDec decoder; + UInt32 packSize; + UInt32 unpackSize; + int state; + Byte control; + Bool needInitDic; + Bool needInitState; + Bool needInitProp; +} CLzma2Dec; + +#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) +#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc); +#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc); + +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); +void Lzma2Dec_Init(CLzma2Dec *p); + + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen or dicLimit). + LZMA_FINISH_ANY - use smallest number of input bytes + LZMA_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + SZ_ERROR_DATA - Data error +*/ + +SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + +SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - use smallest number of input bytes + LZMA_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Provenance/LZMASDK/LzmaDec.c b/Provenance/LZMASDK/LzmaDec.c new file mode 100755 index 0000000000..0a65fafb3d --- /dev/null +++ b/Provenance/LZMASDK/LzmaDec.c @@ -0,0 +1,995 @@ +/* LzmaDec.c -- LZMA Decoder +2010-12-15 : Igor Pavlov : Public domain */ + +#include "LzmaDec.h" + +#include + +#pragma clang diagnostic ignored "-Wmissing-prototypes" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_INIT_SIZE 5 + +#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); +#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } +#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) + +#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } +#define TREE_DECODE(probs, limit, i) \ + { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } + +/* #define _LZMA_SIZE_OPT */ + +#ifdef _LZMA_SIZE_OPT +#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) +#else +#define TREE_6_DECODE(probs, i) \ + { i = 1; \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + i -= 0x40; } +#endif + +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0_CHECK range = bound; +#define UPDATE_1_CHECK range -= bound; code -= bound; +#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } +#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) +#define TREE_DECODE_CHECK(probs, limit, i) \ + { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 768 + +#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +#define LZMA_DIC_MIN (1 << 12) + +/* First LZMA-symbol is always decoded. +And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization +Out: + Result: + SZ_OK - OK + SZ_ERROR_DATA - Error + p->remainLen: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : Flush marker + = kMatchSpecLenStart + 2 : State Init Marker +*/ + +static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + CLzmaProb *probs = p->probs; + + unsigned state = p->state; + UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; + unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; + unsigned lc = p->prop.lc; + + Byte *dic = p->dic; + SizeT dicBufSize = p->dicBufSize; + SizeT dicPos = p->dicPos; + + UInt32 processedPos = p->processedPos; + UInt32 checkDicSize = p->checkDicSize; + unsigned len = 0; + + const Byte *buf = p->buf; + UInt32 range = p->range; + UInt32 code = p->code; + + do + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = processedPos & pbMask; + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + unsigned symbol; + UPDATE_0(prob); + prob = probs + Literal; + if (checkDicSize != 0 || processedPos != 0) + prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + + (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); + + if (state < kNumLitStates) + { + state -= (state < 4) ? state : 3; + symbol = 1; + do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; + unsigned offs = 0x100; + state -= (state < 10) ? 3 : 6; + symbol = 1; + do + { + unsigned bit; + CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) + } + while (symbol < 0x100); + } + dic[dicPos++] = (Byte)symbol; + processedPos++; + continue; + } + else + { + UPDATE_1(prob); + prob = probs + IsRep + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + state += kNumStates; + prob = probs + LenCoder; + } + else + { + UPDATE_1(prob); + if (checkDicSize == 0 && processedPos == 0) + return SZ_ERROR_DATA; + prob = probs + IsRepG0 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + UPDATE_0(prob); + dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; + dicPos++; + processedPos++; + state = state < kNumLitStates ? 9 : 11; + continue; + } + UPDATE_1(prob); + } + else + { + UInt32 distance; + UPDATE_1(prob); + prob = probs + IsRepG1 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep1; + } + else + { + UPDATE_1(prob); + prob = probs + IsRepG2 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep2; + } + else + { + UPDATE_1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + limit = (1 << kLenNumLowBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + limit = (1 << kLenNumMidBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = (1 << kLenNumHighBits); + } + } + TREE_DECODE(probLen, limit, len); + len += offset; + } + + if (state >= kNumStates) + { + UInt32 distance; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); + TREE_6_DECODE(prob, distance); + if (distance >= kStartPosModelIndex) + { + unsigned posSlot = (unsigned)distance; + int numDirectBits = (int)(((distance >> 1) - 1)); + distance = (2 | (distance & 1)); + if (posSlot < kEndPosModelIndex) + { + distance <<= numDirectBits; + prob = probs + SpecPos + distance - posSlot - 1; + { + UInt32 mask = 1; + unsigned i = 1; + do + { + GET_BIT2(prob + i, i, ; , distance |= mask); + mask <<= 1; + } + while (--numDirectBits != 0); + } + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE + range >>= 1; + + { + UInt32 t; + code -= range; + t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ + distance = (distance << 1) + (t + 1); + code += range & t; + } + /* + distance <<= 1; + if (code >= range) + { + code -= range; + distance |= 1; + } + */ + } + while (--numDirectBits != 0); + prob = probs + Align; + distance <<= kNumAlignBits; + { + unsigned i = 1; + GET_BIT2(prob + i, i, ; , distance |= 1); + GET_BIT2(prob + i, i, ; , distance |= 2); + GET_BIT2(prob + i, i, ; , distance |= 4); + GET_BIT2(prob + i, i, ; , distance |= 8); + } + if (distance == (UInt32)0xFFFFFFFF) + { + len += kMatchSpecLenStart; + state -= kNumStates; + break; + } + } + } + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = distance + 1; + if (checkDicSize == 0) + { + if (distance >= processedPos) + return SZ_ERROR_DATA; + } + else if (distance >= checkDicSize) + return SZ_ERROR_DATA; + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + } + + len += kMatchMinLen; + + if (limit == dicPos) + return SZ_ERROR_DATA; + { + SizeT rem = limit - dicPos; + unsigned curLen = ((rem < len) ? (unsigned)rem : len); + SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); + + processedPos += curLen; + + len -= curLen; + if (pos + curLen <= dicBufSize) + { + Byte *dest = dic + dicPos; + ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; + const Byte *lim = dest + curLen; + dicPos += curLen; + do + *(dest) = (Byte)*(dest + src); + while (++dest != lim); + } + else + { + do + { + dic[dicPos++] = dic[pos]; + if (++pos == dicBufSize) + pos = 0; + } + while (--curLen != 0); + } + } + } + } + while (dicPos < limit && buf < bufLimit); + NORMALIZE; + p->buf = buf; + p->range = range; + p->code = code; + p->remainLen = len; + p->dicPos = dicPos; + p->processedPos = processedPos; + p->reps[0] = rep0; + p->reps[1] = rep1; + p->reps[2] = rep2; + p->reps[3] = rep3; + p->state = state; + + return SZ_OK; +} + +static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +{ + if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) + { + Byte *dic = p->dic; + SizeT dicPos = p->dicPos; + SizeT dicBufSize = p->dicBufSize; + unsigned len = p->remainLen; + UInt32 rep0 = p->reps[0]; + if (limit - dicPos < len) + len = (unsigned)(limit - dicPos); + + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) + p->checkDicSize = p->prop.dicSize; + + p->processedPos += len; + p->remainLen -= len; + while (len != 0) + { + len--; + dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; + dicPos++; + } + p->dicPos = dicPos; + } +} + +static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + do + { + SizeT limit2 = limit; + if (p->checkDicSize == 0) + { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) + limit2 = p->dicPos + rem; + } + RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); + if (p->processedPos >= p->prop.dicSize) + p->checkDicSize = p->prop.dicSize; + LzmaDec_WriteRem(p, limit); + } + while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); + + if (p->remainLen > kMatchSpecLenStart) + { + p->remainLen = kMatchSpecLenStart; + } + return 0; +} + +typedef enum +{ + DUMMY_ERROR, /* unexpected end of input stream */ + DUMMY_LIT, + DUMMY_MATCH, + DUMMY_REP +} ELzmaDummy; + +static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) +{ + UInt32 range = p->range; + UInt32 code = p->code; + const Byte *bufLimit = buf + inSize; + CLzmaProb *probs = p->probs; + unsigned state = p->state; + ELzmaDummy res; + + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK + + /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ + + prob = probs + Literal; + if (p->checkDicSize != 0 || p->processedPos != 0) + prob += (LZMA_LIT_SIZE * + ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + + if (state < kNumLitStates) + { + unsigned symbol = 1; + do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[p->dicPos - p->reps[0] + + ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; + unsigned offs = 0x100; + unsigned symbol = 1; + do + { + unsigned bit; + CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) + } + while (symbol < 0x100); + } + res = DUMMY_LIT; + } + else + { + unsigned len; + UPDATE_1_CHECK; + + prob = probs + IsRep + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + state = 0; + prob = probs + LenCoder; + res = DUMMY_MATCH; + } + else + { + UPDATE_1_CHECK; + res = DUMMY_REP; + prob = probs + IsRepG0 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + NORMALIZE_CHECK; + return DUMMY_REP; + } + else + { + UPDATE_1_CHECK; + } + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG1 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG2 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + } + } + } + state = kNumStates; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + limit = 1 << kLenNumLowBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenChoice2; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + limit = 1 << kLenNumMidBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = 1 << kLenNumHighBits; + } + } + TREE_DECODE_CHECK(probLen, limit, len); + len += offset; + } + + if (state < 4) + { + unsigned posSlot; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + int numDirectBits = ((posSlot >> 1) - 1); + + /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ + + if (posSlot < kEndPosModelIndex) + { + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE_CHECK + range >>= 1; + code -= range & (((code - range) >> 31) - 1); + /* if (code >= range) code -= range; */ + } + while (--numDirectBits != 0); + prob = probs + Align; + numDirectBits = kNumAlignBits; + } + { + unsigned i = 1; + do + { + GET_BIT_CHECK(prob + i, i); + } + while (--numDirectBits != 0); + } + } + } + } + } + NORMALIZE_CHECK; + return res; +} + + +static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) +{ + p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); + p->range = 0xFFFFFFFF; + p->needFlush = 0; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) +{ + p->needFlush = 1; + p->remainLen = 0; + p->tempBufSize = 0; + + if (initDic) + { + p->processedPos = 0; + p->checkDicSize = 0; + p->needInitState = 1; + } + if (initState) + p->needInitState = 1; +} + +void LzmaDec_Init(CLzmaDec *p) +{ + p->dicPos = 0; + LzmaDec_InitDicAndState(p, True, True); +} + +static void LzmaDec_InitStateReal(CLzmaDec *p) +{ + UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); + UInt32 i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + p->needInitState = 0; +} + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, + ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + (*srcLen) = 0; + LzmaDec_WriteRem(p, dicLimit); + + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->remainLen != kMatchSpecLenStart) + { + int checkEndMarkNow; + + if (p->needFlush != 0) + { + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (p->tempBuf[0] != 0) + return SZ_ERROR_DATA; + + LzmaDec_InitRc(p, p->tempBuf); + p->tempBufSize = 0; + } + + checkEndMarkNow = 0; + if (p->dicPos >= dicLimit) + { + if (p->remainLen == 0 && p->code == 0) + { + *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; + return SZ_OK; + } + if (finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + if (p->remainLen != 0) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + checkEndMarkNow = 1; + } + + if (p->needInitState) + LzmaDec_InitStateReal(p); + + if (p->tempBufSize == 0) + { + SizeT processed; + const Byte *bufLimit; + if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, src, inSize); + if (dummyRes == DUMMY_ERROR) + { + memcpy(p->tempBuf, src, inSize); + p->tempBufSize = (unsigned)inSize; + (*srcLen) += inSize; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + bufLimit = src; + } + else + bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; + p->buf = src; + if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) + return SZ_ERROR_DATA; + processed = (SizeT)(p->buf - src); + (*srcLen) += processed; + src += processed; + inSize -= processed; + } + else + { + unsigned rem = p->tempBufSize, lookAhead = 0; + while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) + p->tempBuf[rem++] = src[lookAhead++]; + p->tempBufSize = rem; + if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); + if (dummyRes == DUMMY_ERROR) + { + (*srcLen) += lookAhead; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + } + p->buf = p->tempBuf; + if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) + return SZ_ERROR_DATA; + lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); + (*srcLen) += lookAhead; + src += lookAhead; + inSize -= lookAhead; + p->tempBufSize = 0; + } + } + if (p->code == 0) + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; +} + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen; + SizeT inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT inSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->dicPos == p->dicBufSize) + p->dicPos = 0; + dicPos = p->dicPos; + if (outSize > p->dicBufSize - dicPos) + { + outSizeCur = p->dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); + src += inSizeCur; + inSize -= inSizeCur; + *srcLen += inSizeCur; + outSizeCur = p->dicPos - dicPos; + memcpy(dest, p->dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->probs); + p->probs = 0; +} + +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->dic); + p->dic = 0; +} + +void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) +{ + LzmaDec_FreeProbs(p, alloc); + LzmaDec_FreeDict(p, alloc); +} + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) +{ + UInt32 dicSize; + Byte d; + + if (size < LZMA_PROPS_SIZE) + return SZ_ERROR_UNSUPPORTED; + else + dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); + + if (dicSize < LZMA_DIC_MIN) + dicSize = LZMA_DIC_MIN; + p->dicSize = dicSize; + + d = data[0]; + if (d >= (9 * 5 * 5)) + return SZ_ERROR_UNSUPPORTED; + + p->lc = d % 9; + d /= 9; + p->pb = d / 5; + p->lp = d % 5; + + return SZ_OK; +} + +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) +{ + UInt32 numProbs = LzmaProps_GetNumProbs(propNew); + if (p->probs == 0 || numProbs != p->numProbs) + { + LzmaDec_FreeProbs(p, alloc); + p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); + p->numProbs = numProbs; + if (p->probs == 0) + return SZ_ERROR_MEM; + } + return SZ_OK; +} + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + SizeT dicBufSize; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + dicBufSize = propNew.dicSize; + if (p->dic == 0 || dicBufSize != p->dicBufSize) + { + LzmaDec_FreeDict(p, alloc); + p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); + if (p->dic == 0) + { + LzmaDec_FreeProbs(p, alloc); + return SZ_ERROR_MEM; + } + } + p->dicBufSize = dicBufSize; + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc) +{ + CLzmaDec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + if (inSize < RC_INIT_SIZE) + return SZ_ERROR_INPUT_EOF; + LzmaDec_Construct(&p); + RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); + p.dic = dest; + p.dicBufSize = outSize; + LzmaDec_Init(&p); + *srcLen = inSize; + res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + LzmaDec_FreeProbs(&p, alloc); + return res; +} diff --git a/Provenance/LZMASDK/LzmaDec.h b/Provenance/LZMASDK/LzmaDec.h new file mode 100755 index 0000000000..6741a644b6 --- /dev/null +++ b/Provenance/LZMASDK/LzmaDec.h @@ -0,0 +1,231 @@ +/* LzmaDec.h -- LZMA Decoder +2009-02-07 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_DEC_H +#define __LZMA_DEC_H + +#include "Types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps +{ + unsigned lc, lp, pb; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); + + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct +{ + CLzmaProps prop; + CLzmaProb *probs; + Byte *dic; + const Byte *buf; + UInt32 range, code; + SizeT dicPos; + SizeT dicBufSize; + UInt32 processedPos; + UInt32 checkDicSize; + unsigned state; + UInt32 reps[4]; + unsigned remainLen; + int needFlush; + int needInitState; + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } + +void LzmaDec_Init(CLzmaDec *p); + +/* There are two types of LZMA streams: + 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. + 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum +{ + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + +typedef enum +{ + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); + +SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Constr() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error +*/ + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). +*/ + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Provenance/LZMASDK/Ppmd.h b/Provenance/LZMASDK/Ppmd.h new file mode 100755 index 0000000000..d62df4d361 --- /dev/null +++ b/Provenance/LZMASDK/Ppmd.h @@ -0,0 +1,86 @@ +/* Ppmd.h -- PPMD codec common code +2011-01-27 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#ifndef __PPMD_H +#define __PPMD_H + +#include "Types.h" +#include "CpuArch.h" + +EXTERN_C_BEGIN + +#ifdef MY_CPU_32BIT + #define PPMD_32BIT +#endif + +#define PPMD_INT_BITS 7 +#define PPMD_PERIOD_BITS 7 +#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS)) + +#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift)) +#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2) +#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob)) +#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob)) + +#define PPMD_N1 4 +#define PPMD_N2 4 +#define PPMD_N3 4 +#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4) +#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4) + +#pragma pack(push, 1) +/* Most compilers works OK here even without #pragma pack(push, 1), but some GCC compilers need it. */ + +/* SEE-contexts for PPM-contexts with masked symbols */ +typedef struct +{ + UInt16 Summ; /* Freq */ + Byte Shift; /* Speed of Freq change; low Shift is for fast change */ + Byte Count; /* Count to next change of Shift */ +} CPpmd_See; + +#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \ + { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); } + +typedef struct +{ + Byte Symbol; + Byte Freq; + UInt16 SuccessorLow; + UInt16 SuccessorHigh; +} CPpmd_State; + +#pragma pack(pop) + +typedef + #ifdef PPMD_32BIT + CPpmd_State * + #else + UInt32 + #endif + CPpmd_State_Ref; + +typedef + #ifdef PPMD_32BIT + void * + #else + UInt32 + #endif + CPpmd_Void_Ref; + +typedef + #ifdef PPMD_32BIT + Byte * + #else + UInt32 + #endif + CPpmd_Byte_Ref; + +#define PPMD_SetAllBitsIn256Bytes(p) \ + { unsigned i; for (i = 0; i < 256 / sizeof(p[0]); i += 8) { \ + p[i+7] = p[i+6] = p[i+5] = p[i+4] = p[i+3] = p[i+2] = p[i+1] = p[i+0] = ~(size_t)0; }} + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/Ppmd7.c b/Provenance/LZMASDK/Ppmd7.c new file mode 100755 index 0000000000..4b160cf033 --- /dev/null +++ b/Provenance/LZMASDK/Ppmd7.c @@ -0,0 +1,708 @@ +/* Ppmd7.c -- PPMdH codec +2010-03-12 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#include + +#include "Ppmd7.h" + +const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; +static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051}; + +#define MAX_FREQ 124 +#define UNIT_SIZE 12 + +#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE) +#define U2I(nu) (p->Units2Indx[(nu) - 1]) +#define I2U(indx) (p->Indx2Units[indx]) + +#ifdef PPMD_32BIT + #define REF(ptr) (ptr) +#else + #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base)) +#endif + +#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr)) + +#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) +#define STATS(ctx) Ppmd7_GetStats(p, ctx) +#define ONE_STATE(ctx) Ppmd7Context_OneState(ctx) +#define SUFFIX(ctx) CTX((ctx)->Suffix) + +typedef CPpmd7_Context * CTX_PTR; + +struct CPpmd7_Node_; + +typedef + #ifdef PPMD_32BIT + struct CPpmd7_Node_ * + #else + UInt32 + #endif + CPpmd7_Node_Ref; + +typedef struct CPpmd7_Node_ +{ + UInt16 Stamp; /* must be at offset 0 as CPpmd7_Context::NumStats. Stamp=0 means free */ + UInt16 NU; + CPpmd7_Node_Ref Next; /* must be at offset >= 4 */ + CPpmd7_Node_Ref Prev; +} CPpmd7_Node; + +#ifdef PPMD_32BIT + #define NODE(ptr) (ptr) +#else + #define NODE(offs) ((CPpmd7_Node *)(p->Base + (offs))) +#endif + +void Ppmd7_Construct(CPpmd7 *p) +{ + unsigned i, k, m; + + p->Base = 0; + + for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++) + { + unsigned step = (i >= 12 ? 4 : (i >> 2) + 1); + do { p->Units2Indx[k++] = (Byte)i; } while(--step); + p->Indx2Units[i] = (Byte)k; + } + + p->NS2BSIndx[0] = (0 << 1); + p->NS2BSIndx[1] = (1 << 1); + memset(p->NS2BSIndx + 2, (2 << 1), 9); + memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11); + + for (i = 0; i < 3; i++) + p->NS2Indx[i] = (Byte)i; + for (m = i, k = 1; i < 256; i++) + { + p->NS2Indx[i] = (Byte)m; + if (--k == 0) + k = (++m) - 2; + } + + memset(p->HB2Flag, 0, 0x40); + memset(p->HB2Flag + 0x40, 8, 0x100 - 0x40); +} + +void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->Base); + p->Size = 0; + p->Base = 0; +} + +Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc) +{ + if (p->Base == 0 || p->Size != size) + { + Ppmd7_Free(p, alloc); + p->AlignOffset = + #ifdef PPMD_32BIT + (4 - size) & 3; + #else + 4 - (size & 3); + #endif + if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size + #ifndef PPMD_32BIT + + UNIT_SIZE + #endif + )) == 0) + return False; + p->Size = size; + } + return True; +} + +static void InsertNode(CPpmd7 *p, void *node, unsigned indx) +{ + *((CPpmd_Void_Ref *)node) = p->FreeList[indx]; + p->FreeList[indx] = REF(node); +} + +static void *RemoveNode(CPpmd7 *p, unsigned indx) +{ + CPpmd_Void_Ref *node = (CPpmd_Void_Ref *)Ppmd7_GetPtr(p, p->FreeList[indx]); + p->FreeList[indx] = *node; + return node; +} + +static void SplitBlock(CPpmd7 *p, void *ptr, unsigned oldIndx, unsigned newIndx) +{ + unsigned i, nu = I2U(oldIndx) - I2U(newIndx); + ptr = (Byte *)ptr + U2B(I2U(newIndx)); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1); + } + InsertNode(p, ptr, i); +} + +static void GlueFreeBlocks(CPpmd7 *p) +{ + #ifdef PPMD_32BIT + CPpmd7_Node headItem; + CPpmd7_Node_Ref head = &headItem; + #else + CPpmd7_Node_Ref head = p->AlignOffset + p->Size; + #endif + + CPpmd7_Node_Ref n = head; + unsigned i; + + p->GlueCount = 255; + + /* create doubly-linked list of free blocks */ + for (i = 0; i < PPMD_NUM_INDEXES; i++) + { + UInt16 nu = I2U(i); + CPpmd7_Node_Ref next = (CPpmd7_Node_Ref)p->FreeList[i]; + p->FreeList[i] = 0; + while (next != 0) + { + CPpmd7_Node *node = NODE(next); + node->Next = n; + n = NODE(n)->Prev = next; + next = *(const CPpmd7_Node_Ref *)node; + node->Stamp = 0; + node->NU = (UInt16)nu; + } + } + NODE(head)->Stamp = 1; + NODE(head)->Next = n; + NODE(n)->Prev = head; + if (p->LoUnit != p->HiUnit) + ((CPpmd7_Node *)p->LoUnit)->Stamp = 1; + + /* Glue free blocks */ + while (n != head) + { + CPpmd7_Node *node = NODE(n); + UInt32 nu = (UInt32)node->NU; + for (;;) + { + CPpmd7_Node *node2 = NODE(n) + nu; + nu += node2->NU; + if (node2->Stamp != 0 || nu >= 0x10000) + break; + NODE(node2->Prev)->Next = node2->Next; + NODE(node2->Next)->Prev = node2->Prev; + node->NU = (UInt16)nu; + } + n = node->Next; + } + + /* Fill lists of free blocks */ + for (n = NODE(head)->Next; n != head;) + { + CPpmd7_Node *node = NODE(n); + unsigned nu; + CPpmd7_Node_Ref next = node->Next; + for (nu = node->NU; nu > 128; nu -= 128, node += 128) + InsertNode(p, node, PPMD_NUM_INDEXES - 1); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, node + k, nu - k - 1); + } + InsertNode(p, node, i); + n = next; + } +} + +static void *AllocUnitsRare(CPpmd7 *p, unsigned indx) +{ + unsigned i; + void *retVal; + if (p->GlueCount == 0) + { + GlueFreeBlocks(p); + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + } + i = indx; + do + { + if (++i == PPMD_NUM_INDEXES) + { + UInt32 numBytes = U2B(I2U(indx)); + p->GlueCount--; + return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL); + } + } + while (p->FreeList[i] == 0); + retVal = RemoveNode(p, i); + SplitBlock(p, retVal, i, indx); + return retVal; +} + +static void *AllocUnits(CPpmd7 *p, unsigned indx) +{ + UInt32 numBytes; + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + numBytes = U2B(I2U(indx)); + if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit)) + { + void *retVal = p->LoUnit; + p->LoUnit += numBytes; + return retVal; + } + return AllocUnitsRare(p, indx); +} + +#define MyMem12Cpy(dest, src, num) \ + { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \ + do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); } + +static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU) +{ + unsigned i0 = U2I(oldNU); + unsigned i1 = U2I(newNU); + if (i0 == i1) + return oldPtr; + if (p->FreeList[i1] != 0) + { + void *ptr = RemoveNode(p, i1); + MyMem12Cpy(ptr, oldPtr, newNU); + InsertNode(p, oldPtr, i0); + return ptr; + } + SplitBlock(p, oldPtr, i0, i1); + return oldPtr; +} + +#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16))) + +static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v) +{ + (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF); + (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF); +} + +static void RestartModel(CPpmd7 *p) +{ + unsigned i, k, m; + + memset(p->FreeList, 0, sizeof(p->FreeList)); + p->Text = p->Base + p->AlignOffset; + p->HiUnit = p->Text + p->Size; + p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE; + p->GlueCount = 0; + + p->OrderFall = p->MaxOrder; + p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1; + p->PrevSuccess = 0; + + p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */ + p->MinContext->Suffix = 0; + p->MinContext->NumStats = 256; + p->MinContext->SummFreq = 256 + 1; + p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */ + p->LoUnit += U2B(256 / 2); + p->MinContext->Stats = REF(p->FoundState); + for (i = 0; i < 256; i++) + { + CPpmd_State *s = &p->FoundState[i]; + s->Symbol = (Byte)i; + s->Freq = 1; + SetSuccessor(s, 0); + } + + for (i = 0; i < 128; i++) + for (k = 0; k < 8; k++) + { + UInt16 *dest = p->BinSumm[i] + k; + UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 2)); + for (m = 0; m < 64; m += 8) + dest[m] = val; + } + + for (i = 0; i < 25; i++) + for (k = 0; k < 16; k++) + { + CPpmd_See *s = &p->See[i][k]; + s->Summ = (UInt16)((5 * i + 10) << (s->Shift = PPMD_PERIOD_BITS - 4)); + s->Count = 4; + } +} + +void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder) +{ + p->MaxOrder = maxOrder; + RestartModel(p); + p->DummySee.Shift = PPMD_PERIOD_BITS; + p->DummySee.Summ = 0; /* unused */ + p->DummySee.Count = 64; /* unused */ +} + +static CTX_PTR CreateSuccessors(CPpmd7 *p, Bool skip) +{ + CPpmd_State upState; + CTX_PTR c = p->MinContext; + CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState); + CPpmd_State *ps[PPMD7_MAX_ORDER]; + unsigned numPs = 0; + + if (!skip) + ps[numPs++] = p->FoundState; + + while (c->Suffix) + { + CPpmd_Void_Ref successor; + CPpmd_State *s; + c = SUFFIX(c); + if (c->NumStats != 1) + { + for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++); + } + else + s = ONE_STATE(c); + successor = SUCCESSOR(s); + if (successor != upBranch) + { + c = CTX(successor); + if (numPs == 0) + return c; + break; + } + ps[numPs++] = s; + } + + upState.Symbol = *(const Byte *)Ppmd7_GetPtr(p, upBranch); + SetSuccessor(&upState, upBranch + 1); + + if (c->NumStats == 1) + upState.Freq = ONE_STATE(c)->Freq; + else + { + UInt32 cf, s0; + CPpmd_State *s; + for (s = STATS(c); s->Symbol != upState.Symbol; s++); + cf = s->Freq - 1; + s0 = c->SummFreq - c->NumStats - cf; + upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((2 * cf + 3 * s0 - 1) / (2 * s0)))); + } + + do + { + /* Create Child */ + CTX_PTR c1; /* = AllocContext(p); */ + if (p->HiUnit != p->LoUnit) + c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); + else if (p->FreeList[0] != 0) + c1 = (CTX_PTR)RemoveNode(p, 0); + else + { + c1 = (CTX_PTR)AllocUnitsRare(p, 0); + if (!c1) + return NULL; + } + c1->NumStats = 1; + *ONE_STATE(c1) = upState; + c1->Suffix = REF(c); + SetSuccessor(ps[--numPs], REF(c1)); + c = c1; + } + while (numPs != 0); + + return c; +} + +static void SwapStates(CPpmd_State *t1, CPpmd_State *t2) +{ + CPpmd_State tmp = *t1; + *t1 = *t2; + *t2 = tmp; +} + +static void UpdateModel(CPpmd7 *p) +{ + CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState); + CTX_PTR c; + unsigned s0, ns; + + if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0) + { + c = SUFFIX(p->MinContext); + + if (c->NumStats == 1) + { + CPpmd_State *s = ONE_STATE(c); + if (s->Freq < 32) + s->Freq++; + } + else + { + CPpmd_State *s = STATS(c); + if (s->Symbol != p->FoundState->Symbol) + { + do { s++; } while (s->Symbol != p->FoundState->Symbol); + if (s[0].Freq >= s[-1].Freq) + { + SwapStates(&s[0], &s[-1]); + s--; + } + } + if (s->Freq < MAX_FREQ - 9) + { + s->Freq += 2; + c->SummFreq += 2; + } + } + } + + if (p->OrderFall == 0) + { + p->MinContext = p->MaxContext = CreateSuccessors(p, True); + if (p->MinContext == 0) + { + RestartModel(p); + return; + } + SetSuccessor(p->FoundState, REF(p->MinContext)); + return; + } + + *p->Text++ = p->FoundState->Symbol; + successor = REF(p->Text); + if (p->Text >= p->UnitsStart) + { + RestartModel(p); + return; + } + + if (fSuccessor) + { + if (fSuccessor <= successor) + { + CTX_PTR cs = CreateSuccessors(p, False); + if (cs == NULL) + { + RestartModel(p); + return; + } + fSuccessor = REF(cs); + } + if (--p->OrderFall == 0) + { + successor = fSuccessor; + p->Text -= (p->MaxContext != p->MinContext); + } + } + else + { + SetSuccessor(p->FoundState, successor); + fSuccessor = REF(p->MinContext); + } + + s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - (p->FoundState->Freq - 1); + + for (c = p->MaxContext; c != p->MinContext; c = SUFFIX(c)) + { + unsigned ns1; + UInt32 cf, sf; + if ((ns1 = c->NumStats) != 1) + { + if ((ns1 & 1) == 0) + { + /* Expand for one UNIT */ + unsigned oldNU = ns1 >> 1; + unsigned i = U2I(oldNU); + if (i != U2I(oldNU + 1)) + { + void *ptr = AllocUnits(p, i + 1); + void *oldPtr; + if (!ptr) + { + RestartModel(p); + return; + } + oldPtr = STATS(c); + MyMem12Cpy(ptr, oldPtr, oldNU); + InsertNode(p, oldPtr, i); + c->Stats = STATS_REF(ptr); + } + } + c->SummFreq = (UInt16)(c->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) & (c->SummFreq <= 8 * ns1))); + } + else + { + CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0); + if (!s) + { + RestartModel(p); + return; + } + *s = *ONE_STATE(c); + c->Stats = REF(s); + if (s->Freq < MAX_FREQ / 4 - 1) + s->Freq <<= 1; + else + s->Freq = MAX_FREQ - 4; + c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 3)); + } + cf = 2 * (UInt32)p->FoundState->Freq * (c->SummFreq + 6); + sf = (UInt32)s0 + c->SummFreq; + if (cf < 6 * sf) + { + cf = 1 + (cf > sf) + (cf >= 4 * sf); + c->SummFreq += 3; + } + else + { + cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf); + c->SummFreq = (UInt16)(c->SummFreq + cf); + } + { + CPpmd_State *s = STATS(c) + ns1; + SetSuccessor(s, successor); + s->Symbol = p->FoundState->Symbol; + s->Freq = (Byte)cf; + c->NumStats = (UInt16)(ns1 + 1); + } + } + p->MaxContext = p->MinContext = CTX(fSuccessor); +} + +static void Rescale(CPpmd7 *p) +{ + unsigned i, adder, sumFreq, escFreq; + CPpmd_State *stats = STATS(p->MinContext); + CPpmd_State *s = p->FoundState; + { + CPpmd_State tmp = *s; + for (; s != stats; s--) + s[0] = s[-1]; + *s = tmp; + } + escFreq = p->MinContext->SummFreq - s->Freq; + s->Freq += 4; + adder = (p->OrderFall != 0); + s->Freq = (Byte)((s->Freq + adder) >> 1); + sumFreq = s->Freq; + + i = p->MinContext->NumStats - 1; + do + { + escFreq -= (++s)->Freq; + s->Freq = (Byte)((s->Freq + adder) >> 1); + sumFreq += s->Freq; + if (s[0].Freq > s[-1].Freq) + { + CPpmd_State *s1 = s; + CPpmd_State tmp = *s1; + do + s1[0] = s1[-1]; + while (--s1 != stats && tmp.Freq > s1[-1].Freq); + *s1 = tmp; + } + } + while (--i); + + if (s->Freq == 0) + { + unsigned numStats = p->MinContext->NumStats; + unsigned n0, n1; + do { i++; } while ((--s)->Freq == 0); + escFreq += i; + p->MinContext->NumStats = (UInt16)(p->MinContext->NumStats - i); + if (p->MinContext->NumStats == 1) + { + CPpmd_State tmp = *stats; + do + { + tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1)); + escFreq >>= 1; + } + while (escFreq > 1); + InsertNode(p, stats, U2I(((numStats + 1) >> 1))); + *(p->FoundState = ONE_STATE(p->MinContext)) = tmp; + return; + } + n0 = (numStats + 1) >> 1; + n1 = (p->MinContext->NumStats + 1) >> 1; + if (n0 != n1) + p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1)); + } + p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1)); + p->FoundState = STATS(p->MinContext); +} + +CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq) +{ + CPpmd_See *see; + unsigned nonMasked = p->MinContext->NumStats - numMasked; + if (p->MinContext->NumStats != 256) + { + see = p->See[p->NS2Indx[nonMasked - 1]] + + (nonMasked < (unsigned)SUFFIX(p->MinContext)->NumStats - p->MinContext->NumStats) + + 2 * (p->MinContext->SummFreq < 11 * p->MinContext->NumStats) + + 4 * (numMasked > nonMasked) + + p->HiBitsFlag; + { + unsigned r = (see->Summ >> see->Shift); + see->Summ = (UInt16)(see->Summ - r); + *escFreq = r + (r == 0); + } + } + else + { + see = &p->DummySee; + *escFreq = 1; + } + return see; +} + +static void NextContext(CPpmd7 *p) +{ + CTX_PTR c = CTX(SUCCESSOR(p->FoundState)); + if (p->OrderFall == 0 && (Byte *)c > p->Text) + p->MinContext = p->MaxContext = c; + else + UpdateModel(p); +} + +void Ppmd7_Update1(CPpmd7 *p) +{ + CPpmd_State *s = p->FoundState; + s->Freq += 4; + p->MinContext->SummFreq += 4; + if (s[0].Freq > s[-1].Freq) + { + SwapStates(&s[0], &s[-1]); + p->FoundState = --s; + if (s->Freq > MAX_FREQ) + Rescale(p); + } + NextContext(p); +} + +void Ppmd7_Update1_0(CPpmd7 *p) +{ + p->PrevSuccess = (2 * p->FoundState->Freq > p->MinContext->SummFreq); + p->RunLength += p->PrevSuccess; + p->MinContext->SummFreq += 4; + if ((p->FoundState->Freq += 4) > MAX_FREQ) + Rescale(p); + NextContext(p); +} + +void Ppmd7_UpdateBin(CPpmd7 *p) +{ + p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 128 ? 1: 0)); + p->PrevSuccess = 1; + p->RunLength++; + NextContext(p); +} + +void Ppmd7_Update2(CPpmd7 *p) +{ + p->MinContext->SummFreq += 4; + if ((p->FoundState->Freq += 4) > MAX_FREQ) + Rescale(p); + p->RunLength = p->InitRL; + UpdateModel(p); +} diff --git a/Provenance/LZMASDK/Ppmd7.h b/Provenance/LZMASDK/Ppmd7.h new file mode 100755 index 0000000000..56e81eb123 --- /dev/null +++ b/Provenance/LZMASDK/Ppmd7.h @@ -0,0 +1,140 @@ +/* Ppmd7.h -- PPMdH compression codec +2010-03-12 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +/* This code supports virtual RangeDecoder and includes the implementation +of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H. +If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */ + +#ifndef __PPMD7_H +#define __PPMD7_H + +#include "Ppmd.h" + +EXTERN_C_BEGIN + +#define PPMD7_MIN_ORDER 2 +#define PPMD7_MAX_ORDER 64 + +#define PPMD7_MIN_MEM_SIZE (1 << 11) +#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3) + +struct CPpmd7_Context_; + +typedef + #ifdef PPMD_32BIT + struct CPpmd7_Context_ * + #else + UInt32 + #endif + CPpmd7_Context_Ref; + +typedef struct CPpmd7_Context_ +{ + UInt16 NumStats; + UInt16 SummFreq; + CPpmd_State_Ref Stats; + CPpmd7_Context_Ref Suffix; +} CPpmd7_Context; + +#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq) + +typedef struct +{ + CPpmd7_Context *MinContext, *MaxContext; + CPpmd_State *FoundState; + unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag; + Int32 RunLength, InitRL; /* must be 32-bit at least */ + + UInt32 Size; + UInt32 GlueCount; + Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; + UInt32 AlignOffset; + + Byte Indx2Units[PPMD_NUM_INDEXES]; + Byte Units2Indx[128]; + CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; + Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; + CPpmd_See DummySee, See[25][16]; + UInt16 BinSumm[128][64]; +} CPpmd7; + +void Ppmd7_Construct(CPpmd7 *p); +Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc); +void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc); +void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); +#define Ppmd7_WasAllocated(p) ((p)->Base != NULL) + + +/* ---------- Internal Functions ---------- */ + +extern const Byte PPMD7_kExpEscape[16]; + +#ifdef PPMD_32BIT + #define Ppmd7_GetPtr(p, ptr) (ptr) + #define Ppmd7_GetContext(p, ptr) (ptr) + #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats) +#else + #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs))) + #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs))) + #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats))) +#endif + +void Ppmd7_Update1(CPpmd7 *p); +void Ppmd7_Update1_0(CPpmd7 *p); +void Ppmd7_Update2(CPpmd7 *p); +void Ppmd7_UpdateBin(CPpmd7 *p); + +#define Ppmd7_GetBinSumm(p) \ + &p->BinSumm[Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \ + p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \ + (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \ + 2 * p->HB2Flag[Ppmd7Context_OneState(p->MinContext)->Symbol] + \ + ((p->RunLength >> 26) & 0x20)] + +CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale); + + +/* ---------- Decode ---------- */ + +typedef struct +{ + UInt32 (*GetThreshold)(void *p, UInt32 total); + void (*Decode)(void *p, UInt32 start, UInt32 size); + UInt32 (*DecodeBit)(void *p, UInt32 size0); +} IPpmd7_RangeDec; + +typedef struct +{ + IPpmd7_RangeDec p; + UInt32 Range; + UInt32 Code; + IByteIn *Stream; +} CPpmd7z_RangeDec; + +void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p); +Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p); +#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) + +int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc); + + +/* ---------- Encode ---------- */ + +typedef struct +{ + UInt64 Low; + UInt32 Range; + Byte Cache; + UInt64 CacheSize; + IByteOut *Stream; +} CPpmd7z_RangeEnc; + +void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p); +void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p); + +void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol); + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/Ppmd7Dec.c b/Provenance/LZMASDK/Ppmd7Dec.c new file mode 100755 index 0000000000..d6608e8b39 --- /dev/null +++ b/Provenance/LZMASDK/Ppmd7Dec.c @@ -0,0 +1,187 @@ +/* Ppmd7Dec.c -- PPMdH Decoder +2010-03-12 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#include "Ppmd7.h" + +#define kTopValue (1 << 24) + +Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p) +{ + unsigned i; + p->Code = 0; + p->Range = 0xFFFFFFFF; + if (p->Stream->Read((void *)p->Stream) != 0) + return False; + for (i = 0; i < 4; i++) + p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + return (p->Code < 0xFFFFFFFF); +} + +static UInt32 Range_GetThreshold(void *pp, UInt32 total) +{ + CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + return (p->Code) / (p->Range /= total); +} + +static void Range_Normalize(CPpmd7z_RangeDec *p) +{ + if (p->Range < kTopValue) + { + p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Range <<= 8; + if (p->Range < kTopValue) + { + p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Range <<= 8; + } + } +} + +static void Range_Decode(void *pp, UInt32 start, UInt32 size) +{ + CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + p->Code -= start * p->Range; + p->Range *= size; + Range_Normalize(p); +} + +static UInt32 Range_DecodeBit(void *pp, UInt32 size0) +{ + CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + UInt32 newBound = (p->Range >> 14) * size0; + UInt32 symbol; + if (p->Code < newBound) + { + symbol = 0; + p->Range = newBound; + } + else + { + symbol = 1; + p->Code -= newBound; + p->Range -= newBound; + } + Range_Normalize(p); + return symbol; +} + +void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p) +{ + p->p.GetThreshold = Range_GetThreshold; + p->p.Decode = Range_Decode; + p->p.DecodeBit = Range_DecodeBit; +} + + +#define MASK(sym) ((signed char *)charMask)[sym] + +int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc) +{ + size_t charMask[256 / sizeof(size_t)]; + if (p->MinContext->NumStats != 1) + { + CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); + unsigned i; + UInt32 count, hiCnt; + if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq)) + { + Byte symbol; + rc->Decode(rc, 0, s->Freq); + p->FoundState = s; + symbol = s->Symbol; + Ppmd7_Update1_0(p); + return symbol; + } + p->PrevSuccess = 0; + i = p->MinContext->NumStats - 1; + do + { + if ((hiCnt += (++s)->Freq) > count) + { + Byte symbol; + rc->Decode(rc, hiCnt - s->Freq, s->Freq); + p->FoundState = s; + symbol = s->Symbol; + Ppmd7_Update1(p); + return symbol; + } + } + while (--i); + if (count >= p->MinContext->SummFreq) + return -2; + p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]; + rc->Decode(rc, hiCnt, p->MinContext->SummFreq - hiCnt); + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(s->Symbol) = 0; + i = p->MinContext->NumStats - 1; + do { MASK((--s)->Symbol) = 0; } while (--i); + } + else + { + UInt16 *prob = Ppmd7_GetBinSumm(p); + if (rc->DecodeBit(rc, *prob) == 0) + { + Byte symbol; + *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob); + symbol = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol; + Ppmd7_UpdateBin(p); + return symbol; + } + *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob); + p->InitEsc = PPMD7_kExpEscape[*prob >> 10]; + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0; + p->PrevSuccess = 0; + } + for (;;) + { + CPpmd_State *ps[256], *s; + UInt32 freqSum, count, hiCnt; + CPpmd_See *see; + unsigned i, num, numMasked = p->MinContext->NumStats; + do + { + p->OrderFall++; + if (!p->MinContext->Suffix) + return -1; + p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix); + } + while (p->MinContext->NumStats == numMasked); + hiCnt = 0; + s = Ppmd7_GetStats(p, p->MinContext); + i = 0; + num = p->MinContext->NumStats - numMasked; + do + { + int k = (int)(MASK(s->Symbol)); + hiCnt += (s->Freq & k); + ps[i] = s++; + i -= k; + } + while (i != num); + + see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum); + freqSum += hiCnt; + count = rc->GetThreshold(rc, freqSum); + + if (count < hiCnt) + { + Byte symbol; + CPpmd_State **pps = ps; + for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++); + s = *pps; + rc->Decode(rc, hiCnt - s->Freq, s->Freq); + Ppmd_See_Update(see); + p->FoundState = s; + symbol = s->Symbol; + Ppmd7_Update2(p); + return symbol; + } + if (count >= freqSum) + return -2; + rc->Decode(rc, hiCnt, freqSum - hiCnt); + see->Summ = (UInt16)(see->Summ + freqSum); + do { MASK(ps[--i]->Symbol) = 0; } while (i != 0); + } +} diff --git a/Provenance/LZMASDK/Ppmd8.c b/Provenance/LZMASDK/Ppmd8.c new file mode 100755 index 0000000000..4fe723fe2e --- /dev/null +++ b/Provenance/LZMASDK/Ppmd8.c @@ -0,0 +1,1120 @@ +/* Ppmd8.c -- PPMdI codec +2010-03-24 : Igor Pavlov : Public domain +This code is based on PPMd var.I (2002): Dmitry Shkarin : Public domain */ + +#include + +#include "Ppmd8.h" + +const Byte PPMD8_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; +static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051}; + +#define MAX_FREQ 124 +#define UNIT_SIZE 12 + +#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE) +#define U2I(nu) (p->Units2Indx[(nu) - 1]) +#define I2U(indx) (p->Indx2Units[indx]) + +#ifdef PPMD_32BIT + #define REF(ptr) (ptr) +#else + #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base)) +#endif + +#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr)) + +#define CTX(ref) ((CPpmd8_Context *)Ppmd8_GetContext(p, ref)) +#define STATS(ctx) Ppmd8_GetStats(p, ctx) +#define ONE_STATE(ctx) Ppmd8Context_OneState(ctx) +#define SUFFIX(ctx) CTX((ctx)->Suffix) + +typedef CPpmd8_Context * CTX_PTR; + +struct CPpmd8_Node_; + +typedef + #ifdef PPMD_32BIT + struct CPpmd8_Node_ * + #else + UInt32 + #endif + CPpmd8_Node_Ref; + +typedef struct CPpmd8_Node_ +{ + UInt32 Stamp; + CPpmd8_Node_Ref Next; + UInt32 NU; +} CPpmd8_Node; + +#ifdef PPMD_32BIT + #define NODE(ptr) (ptr) +#else + #define NODE(offs) ((CPpmd8_Node *)(p->Base + (offs))) +#endif + +#define EMPTY_NODE 0xFFFFFFFF + +void Ppmd8_Construct(CPpmd8 *p) +{ + unsigned i, k, m; + + p->Base = 0; + + for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++) + { + unsigned step = (i >= 12 ? 4 : (i >> 2) + 1); + do { p->Units2Indx[k++] = (Byte)i; } while(--step); + p->Indx2Units[i] = (Byte)k; + } + + p->NS2BSIndx[0] = (0 << 1); + p->NS2BSIndx[1] = (1 << 1); + memset(p->NS2BSIndx + 2, (2 << 1), 9); + memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11); + + for (i = 0; i < 5; i++) + p->NS2Indx[i] = (Byte)i; + for (m = i, k = 1; i < 260; i++) + { + p->NS2Indx[i] = (Byte)m; + if (--k == 0) + k = (++m) - 4; + } +} + +void Ppmd8_Free(CPpmd8 *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->Base); + p->Size = 0; + p->Base = 0; +} + +Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size, ISzAlloc *alloc) +{ + if (p->Base == 0 || p->Size != size) + { + Ppmd8_Free(p, alloc); + p->AlignOffset = + #ifdef PPMD_32BIT + (4 - size) & 3; + #else + 4 - (size & 3); + #endif + if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size)) == 0) + return False; + p->Size = size; + } + return True; +} + +static void InsertNode(CPpmd8 *p, void *node, unsigned indx) +{ + ((CPpmd8_Node *)node)->Stamp = EMPTY_NODE; + ((CPpmd8_Node *)node)->Next = (CPpmd8_Node_Ref)p->FreeList[indx]; + ((CPpmd8_Node *)node)->NU = I2U(indx); + p->FreeList[indx] = REF(node); + p->Stamps[indx]++; +} + +static void *RemoveNode(CPpmd8 *p, unsigned indx) +{ + CPpmd8_Node *node = NODE((CPpmd8_Node_Ref)p->FreeList[indx]); + p->FreeList[indx] = node->Next; + p->Stamps[indx]--; + return node; +} + +static void SplitBlock(CPpmd8 *p, void *ptr, unsigned oldIndx, unsigned newIndx) +{ + unsigned i, nu = I2U(oldIndx) - I2U(newIndx); + ptr = (Byte *)ptr + U2B(I2U(newIndx)); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1); + } + InsertNode(p, ptr, i); +} + +static void GlueFreeBlocks(CPpmd8 *p) +{ + CPpmd8_Node_Ref head = 0; + CPpmd8_Node_Ref *prev = &head; + unsigned i; + + p->GlueCount = 1 << 13; + memset(p->Stamps, 0, sizeof(p->Stamps)); + + /* Order-0 context is always at top UNIT, so we don't need guard NODE at the end. + All blocks up to p->LoUnit can be free, so we need guard NODE at LoUnit. */ + if (p->LoUnit != p->HiUnit) + ((CPpmd8_Node *)p->LoUnit)->Stamp = 0; + + /* Glue free blocks */ + for (i = 0; i < PPMD_NUM_INDEXES; i++) + { + CPpmd8_Node_Ref next = (CPpmd8_Node_Ref)p->FreeList[i]; + p->FreeList[i] = 0; + while (next != 0) + { + CPpmd8_Node *node = NODE(next); + if (node->NU != 0) + { + CPpmd8_Node *node2; + *prev = next; + prev = &(node->Next); + while ((node2 = node + node->NU)->Stamp == EMPTY_NODE) + { + node->NU += node2->NU; + node2->NU = 0; + } + } + next = node->Next; + } + } + *prev = 0; + + /* Fill lists of free blocks */ + while (head != 0) + { + CPpmd8_Node *node = NODE(head); + unsigned nu; + head = node->Next; + nu = node->NU; + if (nu == 0) + continue; + for (; nu > 128; nu -= 128, node += 128) + InsertNode(p, node, PPMD_NUM_INDEXES - 1); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, node + k, nu - k - 1); + } + InsertNode(p, node, i); + } +} + +static void *AllocUnitsRare(CPpmd8 *p, unsigned indx) +{ + unsigned i; + void *retVal; + if (p->GlueCount == 0) + { + GlueFreeBlocks(p); + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + } + i = indx; + do + { + if (++i == PPMD_NUM_INDEXES) + { + UInt32 numBytes = U2B(I2U(indx)); + p->GlueCount--; + return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL); + } + } + while (p->FreeList[i] == 0); + retVal = RemoveNode(p, i); + SplitBlock(p, retVal, i, indx); + return retVal; +} + +static void *AllocUnits(CPpmd8 *p, unsigned indx) +{ + UInt32 numBytes; + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + numBytes = U2B(I2U(indx)); + if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit)) + { + void *retVal = p->LoUnit; + p->LoUnit += numBytes; + return retVal; + } + return AllocUnitsRare(p, indx); +} + +#define MyMem12Cpy(dest, src, num) \ + { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \ + do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while(--n); } + +static void *ShrinkUnits(CPpmd8 *p, void *oldPtr, unsigned oldNU, unsigned newNU) +{ + unsigned i0 = U2I(oldNU); + unsigned i1 = U2I(newNU); + if (i0 == i1) + return oldPtr; + if (p->FreeList[i1] != 0) + { + void *ptr = RemoveNode(p, i1); + MyMem12Cpy(ptr, oldPtr, newNU); + InsertNode(p, oldPtr, i0); + return ptr; + } + SplitBlock(p, oldPtr, i0, i1); + return oldPtr; +} + +static void FreeUnits(CPpmd8 *p, void *ptr, unsigned nu) +{ + InsertNode(p, ptr, U2I(nu)); +} + +static void SpecialFreeUnit(CPpmd8 *p, void *ptr) +{ + if ((Byte *)ptr != p->UnitsStart) + InsertNode(p, ptr, 0); + else + { + #ifdef PPMD8_FREEZE_SUPPORT + *(UInt32 *)ptr = EMPTY_NODE; /* it's used for (Flags == 0xFF) check in RemoveBinContexts */ + #endif + p->UnitsStart += UNIT_SIZE; + } +} + +static void *MoveUnitsUp(CPpmd8 *p, void *oldPtr, unsigned nu) +{ + unsigned indx = U2I(nu); + void *ptr; + if ((Byte *)oldPtr > p->UnitsStart + 16 * 1024 || REF(oldPtr) > p->FreeList[indx]) + return oldPtr; + ptr = RemoveNode(p, indx); + MyMem12Cpy(ptr, oldPtr, nu); + if ((Byte*)oldPtr != p->UnitsStart) + InsertNode(p, oldPtr, indx); + else + p->UnitsStart += U2B(I2U(indx)); + return ptr; +} + +static void ExpandTextArea(CPpmd8 *p) +{ + UInt32 count[PPMD_NUM_INDEXES]; + unsigned i; + memset(count, 0, sizeof(count)); + if (p->LoUnit != p->HiUnit) + ((CPpmd8_Node *)p->LoUnit)->Stamp = 0; + + { + CPpmd8_Node *node = (CPpmd8_Node *)p->UnitsStart; + for (; node->Stamp == EMPTY_NODE; node += node->NU) + { + node->Stamp = 0; + count[U2I(node->NU)]++; + } + p->UnitsStart = (Byte *)node; + } + + for (i = 0; i < PPMD_NUM_INDEXES; i++) + { + CPpmd8_Node_Ref *next = (CPpmd8_Node_Ref *)&p->FreeList[i]; + while (count[i] != 0) + { + CPpmd8_Node *node = NODE(*next); + while (node->Stamp == 0) + { + *next = node->Next; + node = NODE(*next); + p->Stamps[i]--; + if (--count[i] == 0) + break; + } + next = &node->Next; + } + } +} + +#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16))) + +static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v) +{ + (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF); + (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF); +} + +#define RESET_TEXT(offs) { p->Text = p->Base + p->AlignOffset + (offs); } + +static void RestartModel(CPpmd8 *p) +{ + unsigned i, k, m, r; + + memset(p->FreeList, 0, sizeof(p->FreeList)); + memset(p->Stamps, 0, sizeof(p->Stamps)); + RESET_TEXT(0); + p->HiUnit = p->Text + p->Size; + p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE; + p->GlueCount = 0; + + p->OrderFall = p->MaxOrder; + p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1; + p->PrevSuccess = 0; + + p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */ + p->MinContext->Suffix = 0; + p->MinContext->NumStats = 255; + p->MinContext->Flags = 0; + p->MinContext->SummFreq = 256 + 1; + p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */ + p->LoUnit += U2B(256 / 2); + p->MinContext->Stats = REF(p->FoundState); + for (i = 0; i < 256; i++) + { + CPpmd_State *s = &p->FoundState[i]; + s->Symbol = (Byte)i; + s->Freq = 1; + SetSuccessor(s, 0); + } + + for (i = m = 0; m < 25; m++) + { + while (p->NS2Indx[i] == m) + i++; + for (k = 0; k < 8; k++) + { + UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 1)); + UInt16 *dest = p->BinSumm[m] + k; + for (r = 0; r < 64; r += 8) + dest[r] = val; + } + } + + for (i = m = 0; m < 24; m++) + { + while (p->NS2Indx[i + 3] == m + 3) + i++; + for (k = 0; k < 32; k++) + { + CPpmd_See *s = &p->See[m][k]; + s->Summ = (UInt16)((2 * i + 5) << (s->Shift = PPMD_PERIOD_BITS - 4)); + s->Count = 7; + } + } +} + +void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod) +{ + p->MaxOrder = maxOrder; + p->RestoreMethod = restoreMethod; + RestartModel(p); + p->DummySee.Shift = PPMD_PERIOD_BITS; + p->DummySee.Summ = 0; /* unused */ + p->DummySee.Count = 64; /* unused */ +} + +static void Refresh(CPpmd8 *p, CTX_PTR ctx, unsigned oldNU, unsigned scale) +{ + unsigned i = ctx->NumStats, escFreq, sumFreq, flags; + CPpmd_State *s = (CPpmd_State *)ShrinkUnits(p, STATS(ctx), oldNU, (i + 2) >> 1); + ctx->Stats = REF(s); + #ifdef PPMD8_FREEZE_SUPPORT + /* fixed over Shkarin's code. Fixed code is not compatible with original code for some files in FREEZE mode. */ + scale |= (ctx->SummFreq >= ((UInt32)1 << 15)); + #endif + flags = (ctx->Flags & (0x10 + 0x04 * scale)) + 0x08 * (s->Symbol >= 0x40); + escFreq = ctx->SummFreq - s->Freq; + sumFreq = (s->Freq = (Byte)((s->Freq + scale) >> scale)); + do + { + escFreq -= (++s)->Freq; + sumFreq += (s->Freq = (Byte)((s->Freq + scale) >> scale)); + flags |= 0x08 * (s->Symbol >= 0x40); + } + while (--i); + ctx->SummFreq = (UInt16)(sumFreq + ((escFreq + scale) >> scale)); + ctx->Flags = (Byte)flags; +} + +static void SwapStates(CPpmd_State *t1, CPpmd_State *t2) +{ + CPpmd_State tmp = *t1; + *t1 = *t2; + *t2 = tmp; +} + +static CPpmd_Void_Ref CutOff(CPpmd8 *p, CTX_PTR ctx, unsigned order) +{ + int i; + unsigned tmp; + CPpmd_State *s; + + if (!ctx->NumStats) + { + s = ONE_STATE(ctx); + if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart) + { + if (order < p->MaxOrder) + SetSuccessor(s, CutOff(p, CTX(SUCCESSOR(s)), order + 1)); + else + SetSuccessor(s, 0); + if (SUCCESSOR(s) || order <= 9) /* O_BOUND */ + return REF(ctx); + } + SpecialFreeUnit(p, ctx); + return 0; + } + + ctx->Stats = STATS_REF(MoveUnitsUp(p, STATS(ctx), tmp = ((unsigned)ctx->NumStats + 2) >> 1)); + + for (s = STATS(ctx) + (i = ctx->NumStats); s >= STATS(ctx); s--) + if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) < p->UnitsStart) + { + CPpmd_State *s2 = STATS(ctx) + (i--); + SetSuccessor(s, 0); + SwapStates(s, s2); + } + else if (order < p->MaxOrder) + SetSuccessor(s, CutOff(p, CTX(SUCCESSOR(s)), order + 1)); + else + SetSuccessor(s, 0); + + if (i != ctx->NumStats && order) + { + ctx->NumStats = (Byte)i; + s = STATS(ctx); + if (i < 0) + { + FreeUnits(p, s, tmp); + SpecialFreeUnit(p, ctx); + return 0; + } + if (i == 0) + { + ctx->Flags = (ctx->Flags & 0x10) + 0x08 * (s->Symbol >= 0x40); + *ONE_STATE(ctx) = *s; + FreeUnits(p, s, tmp); + ONE_STATE(ctx)->Freq = (Byte)((unsigned)ONE_STATE(ctx)->Freq + 11) >> 3; + } + else + Refresh(p, ctx, tmp, ctx->SummFreq > 16 * i); + } + return REF(ctx); +} + +#ifdef PPMD8_FREEZE_SUPPORT +static CPpmd_Void_Ref RemoveBinContexts(CPpmd8 *p, CTX_PTR ctx, unsigned order) +{ + CPpmd_State *s; + if (!ctx->NumStats) + { + s = ONE_STATE(ctx); + if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart && order < p->MaxOrder) + SetSuccessor(s, RemoveBinContexts(p, CTX(SUCCESSOR(s)), order + 1)); + else + SetSuccessor(s, 0); + /* Suffix context can be removed already, since different (high-order) + Successors may refer to same context. So we check Flags == 0xFF (Stamp == EMPTY_NODE) */ + if (!SUCCESSOR(s) && (!SUFFIX(ctx)->NumStats || SUFFIX(ctx)->Flags == 0xFF)) + { + FreeUnits(p, ctx, 1); + return 0; + } + else + return REF(ctx); + } + + for (s = STATS(ctx) + ctx->NumStats; s >= STATS(ctx); s--) + if ((Byte *)Ppmd8_GetPtr(p, SUCCESSOR(s)) >= p->UnitsStart && order < p->MaxOrder) + SetSuccessor(s, RemoveBinContexts(p, CTX(SUCCESSOR(s)), order + 1)); + else + SetSuccessor(s, 0); + + return REF(ctx); +} +#endif + +static UInt32 GetUsedMemory(const CPpmd8 *p) +{ + UInt32 v = 0; + unsigned i; + for (i = 0; i < PPMD_NUM_INDEXES; i++) + v += p->Stamps[i] * I2U(i); + return p->Size - (UInt32)(p->HiUnit - p->LoUnit) - (UInt32)(p->UnitsStart - p->Text) - U2B(v); +} + +#ifdef PPMD8_FREEZE_SUPPORT + #define RESTORE_MODEL(c1, fSuccessor) RestoreModel(p, c1, fSuccessor) +#else + #define RESTORE_MODEL(c1, fSuccessor) RestoreModel(p, c1) +#endif + +static void RestoreModel(CPpmd8 *p, CTX_PTR c1 + #ifdef PPMD8_FREEZE_SUPPORT + , CTX_PTR fSuccessor + #endif + ) +{ + CTX_PTR c; + CPpmd_State *s; + RESET_TEXT(0); + for (c = p->MaxContext; c != c1; c = SUFFIX(c)) + if (--(c->NumStats) == 0) + { + s = STATS(c); + c->Flags = (c->Flags & 0x10) + 0x08 * (s->Symbol >= 0x40); + *ONE_STATE(c) = *s; + SpecialFreeUnit(p, s); + ONE_STATE(c)->Freq = (ONE_STATE(c)->Freq + 11) >> 3; + } + else + Refresh(p, c, (c->NumStats+3) >> 1, 0); + + for (; c != p->MinContext; c = SUFFIX(c)) + if (!c->NumStats) + ONE_STATE(c)->Freq -= ONE_STATE(c)->Freq >> 1; + else if ((c->SummFreq += 4) > 128 + 4 * c->NumStats) + Refresh(p, c, (c->NumStats + 2) >> 1, 1); + + #ifdef PPMD8_FREEZE_SUPPORT + if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE) + { + p->MaxContext = fSuccessor; + p->GlueCount += !(p->Stamps[1] & 1); + } + else if (p->RestoreMethod == PPMD8_RESTORE_METHOD_FREEZE) + { + while (p->MaxContext->Suffix) + p->MaxContext = SUFFIX(p->MaxContext); + RemoveBinContexts(p, p->MaxContext, 0); + p->RestoreMethod++; + p->GlueCount = 0; + p->OrderFall = p->MaxOrder; + } + else + #endif + if (p->RestoreMethod == PPMD8_RESTORE_METHOD_RESTART || GetUsedMemory(p) < (p->Size >> 1)) + RestartModel(p); + else + { + while (p->MaxContext->Suffix) + p->MaxContext = SUFFIX(p->MaxContext); + do + { + CutOff(p, p->MaxContext, 0); + ExpandTextArea(p); + } + while (GetUsedMemory(p) > 3 * (p->Size >> 2)); + p->GlueCount = 0; + p->OrderFall = p->MaxOrder; + } +} + +static CTX_PTR CreateSuccessors(CPpmd8 *p, Bool skip, CPpmd_State *s1, CTX_PTR c) +{ + CPpmd_State upState; + Byte flags; + CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState); + /* fixed over Shkarin's code. Maybe it could work without + 1 too. */ + CPpmd_State *ps[PPMD8_MAX_ORDER + 1]; + unsigned numPs = 0; + + if (!skip) + ps[numPs++] = p->FoundState; + + while (c->Suffix) + { + CPpmd_Void_Ref successor; + CPpmd_State *s; + c = SUFFIX(c); + if (s1) + { + s = s1; + s1 = NULL; + } + else if (c->NumStats != 0) + { + for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++); + if (s->Freq < MAX_FREQ - 9) + { + s->Freq++; + c->SummFreq++; + } + } + else + { + s = ONE_STATE(c); + s->Freq += (!SUFFIX(c)->NumStats & (s->Freq < 24)); + } + successor = SUCCESSOR(s); + if (successor != upBranch) + { + c = CTX(successor); + if (numPs == 0) + return c; + break; + } + ps[numPs++] = s; + } + + upState.Symbol = *(const Byte *)Ppmd8_GetPtr(p, upBranch); + SetSuccessor(&upState, upBranch + 1); + flags = 0x10 * (p->FoundState->Symbol >= 0x40) + 0x08 * (upState.Symbol >= 0x40); + + if (c->NumStats == 0) + upState.Freq = ONE_STATE(c)->Freq; + else + { + UInt32 cf, s0; + CPpmd_State *s; + for (s = STATS(c); s->Symbol != upState.Symbol; s++); + cf = s->Freq - 1; + s0 = c->SummFreq - c->NumStats - cf; + upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((cf + 2 * s0 - 3) / s0))); + } + + do + { + /* Create Child */ + CTX_PTR c1; /* = AllocContext(p); */ + if (p->HiUnit != p->LoUnit) + c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); + else if (p->FreeList[0] != 0) + c1 = (CTX_PTR)RemoveNode(p, 0); + else + { + c1 = (CTX_PTR)AllocUnitsRare(p, 0); + if (!c1) + return NULL; + } + c1->NumStats = 0; + c1->Flags = flags; + *ONE_STATE(c1) = upState; + c1->Suffix = REF(c); + SetSuccessor(ps[--numPs], REF(c1)); + c = c1; + } + while (numPs != 0); + + return c; +} + +static CTX_PTR ReduceOrder(CPpmd8 *p, CPpmd_State *s1, CTX_PTR c) +{ + CPpmd_State *s = NULL; + CTX_PTR c1 = c; + CPpmd_Void_Ref upBranch = REF(p->Text); + + #ifdef PPMD8_FREEZE_SUPPORT + /* The BUG in Shkarin's code was fixed: ps could overflow in CUT_OFF mode. */ + CPpmd_State *ps[PPMD8_MAX_ORDER + 1]; + unsigned numPs = 0; + ps[numPs++] = p->FoundState; + #endif + + SetSuccessor(p->FoundState, upBranch); + p->OrderFall++; + + for (;;) + { + if (s1) + { + c = SUFFIX(c); + s = s1; + s1 = NULL; + } + else + { + if (!c->Suffix) + { + #ifdef PPMD8_FREEZE_SUPPORT + if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE) + { + do { SetSuccessor(ps[--numPs], REF(c)); } while (numPs); + RESET_TEXT(1); + p->OrderFall = 1; + } + #endif + return c; + } + c = SUFFIX(c); + if (c->NumStats) + { + if ((s = STATS(c))->Symbol != p->FoundState->Symbol) + do { s++; } while (s->Symbol != p->FoundState->Symbol); + if (s->Freq < MAX_FREQ - 9) + { + s->Freq += 2; + c->SummFreq += 2; + } + } + else + { + s = ONE_STATE(c); + s->Freq += (s->Freq < 32); + } + } + if (SUCCESSOR(s)) + break; + #ifdef PPMD8_FREEZE_SUPPORT + ps[numPs++] = s; + #endif + SetSuccessor(s, upBranch); + p->OrderFall++; + } + + #ifdef PPMD8_FREEZE_SUPPORT + if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE) + { + c = CTX(SUCCESSOR(s)); + do { SetSuccessor(ps[--numPs], REF(c)); } while (numPs); + RESET_TEXT(1); + p->OrderFall = 1; + return c; + } + else + #endif + if (SUCCESSOR(s) <= upBranch) + { + CTX_PTR successor; + CPpmd_State *s1 = p->FoundState; + p->FoundState = s; + + successor = CreateSuccessors(p, False, NULL, c); + if (successor == NULL) + SetSuccessor(s, 0); + else + SetSuccessor(s, REF(successor)); + p->FoundState = s1; + } + + if (p->OrderFall == 1 && c1 == p->MaxContext) + { + SetSuccessor(p->FoundState, SUCCESSOR(s)); + p->Text--; + } + if (SUCCESSOR(s) == 0) + return NULL; + return CTX(SUCCESSOR(s)); +} + +static void UpdateModel(CPpmd8 *p) +{ + CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState); + CTX_PTR c; + unsigned s0, ns, fFreq = p->FoundState->Freq; + Byte flag, fSymbol = p->FoundState->Symbol; + CPpmd_State *s = NULL; + + if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0) + { + c = SUFFIX(p->MinContext); + + if (c->NumStats == 0) + { + s = ONE_STATE(c); + if (s->Freq < 32) + s->Freq++; + } + else + { + s = STATS(c); + if (s->Symbol != p->FoundState->Symbol) + { + do { s++; } while (s->Symbol != p->FoundState->Symbol); + if (s[0].Freq >= s[-1].Freq) + { + SwapStates(&s[0], &s[-1]); + s--; + } + } + if (s->Freq < MAX_FREQ - 9) + { + s->Freq += 2; + c->SummFreq += 2; + } + } + } + + c = p->MaxContext; + if (p->OrderFall == 0 && fSuccessor) + { + CTX_PTR cs = CreateSuccessors(p, True, s, p->MinContext); + if (cs == 0) + { + SetSuccessor(p->FoundState, 0); + RESTORE_MODEL(c, CTX(fSuccessor)); + } + else + { + SetSuccessor(p->FoundState, REF(cs)); + p->MaxContext = cs; + } + return; + } + + *p->Text++ = p->FoundState->Symbol; + successor = REF(p->Text); + if (p->Text >= p->UnitsStart) + { + RESTORE_MODEL(c, CTX(fSuccessor)); /* check it */ + return; + } + + if (!fSuccessor) + { + CTX_PTR cs = ReduceOrder(p, s, p->MinContext); + if (cs == NULL) + { + RESTORE_MODEL(c, 0); + return; + } + fSuccessor = REF(cs); + } + else if ((Byte *)Ppmd8_GetPtr(p, fSuccessor) < p->UnitsStart) + { + CTX_PTR cs = CreateSuccessors(p, False, s, p->MinContext); + if (cs == NULL) + { + RESTORE_MODEL(c, 0); + return; + } + fSuccessor = REF(cs); + } + + if (--p->OrderFall == 0) + { + successor = fSuccessor; + p->Text -= (p->MaxContext != p->MinContext); + } + #ifdef PPMD8_FREEZE_SUPPORT + else if (p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE) + { + successor = fSuccessor; + RESET_TEXT(0); + p->OrderFall = 0; + } + #endif + + s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - fFreq; + flag = 0x08 * (fSymbol >= 0x40); + + for (; c != p->MinContext; c = SUFFIX(c)) + { + unsigned ns1; + UInt32 cf, sf; + if ((ns1 = c->NumStats) != 0) + { + if ((ns1 & 1) != 0) + { + /* Expand for one UNIT */ + unsigned oldNU = (ns1 + 1) >> 1; + unsigned i = U2I(oldNU); + if (i != U2I(oldNU + 1)) + { + void *ptr = AllocUnits(p, i + 1); + void *oldPtr; + if (!ptr) + { + RESTORE_MODEL(c, CTX(fSuccessor)); + return; + } + oldPtr = STATS(c); + MyMem12Cpy(ptr, oldPtr, oldNU); + InsertNode(p, oldPtr, i); + c->Stats = STATS_REF(ptr); + } + } + c->SummFreq = (UInt16)(c->SummFreq + (3 * ns1 + 1 < ns)); + } + else + { + CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0); + if (!s) + { + RESTORE_MODEL(c, CTX(fSuccessor)); + return; + } + *s = *ONE_STATE(c); + c->Stats = REF(s); + if (s->Freq < MAX_FREQ / 4 - 1) + s->Freq <<= 1; + else + s->Freq = MAX_FREQ - 4; + c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 2)); + } + cf = 2 * fFreq * (c->SummFreq + 6); + sf = (UInt32)s0 + c->SummFreq; + if (cf < 6 * sf) + { + cf = 1 + (cf > sf) + (cf >= 4 * sf); + c->SummFreq += 4; + } + else + { + cf = 4 + (cf > 9 * sf) + (cf > 12 * sf) + (cf > 15 * sf); + c->SummFreq = (UInt16)(c->SummFreq + cf); + } + { + CPpmd_State *s = STATS(c) + ns1 + 1; + SetSuccessor(s, successor); + s->Symbol = fSymbol; + s->Freq = (Byte)cf; + c->Flags |= flag; + c->NumStats = (Byte)(ns1 + 1); + } + } + p->MaxContext = p->MinContext = CTX(fSuccessor); +} + +static void Rescale(CPpmd8 *p) +{ + unsigned i, adder, sumFreq, escFreq; + CPpmd_State *stats = STATS(p->MinContext); + CPpmd_State *s = p->FoundState; + { + CPpmd_State tmp = *s; + for (; s != stats; s--) + s[0] = s[-1]; + *s = tmp; + } + escFreq = p->MinContext->SummFreq - s->Freq; + s->Freq += 4; + adder = (p->OrderFall != 0 + #ifdef PPMD8_FREEZE_SUPPORT + || p->RestoreMethod > PPMD8_RESTORE_METHOD_FREEZE + #endif + ); + s->Freq = (Byte)((s->Freq + adder) >> 1); + sumFreq = s->Freq; + + i = p->MinContext->NumStats; + do + { + escFreq -= (++s)->Freq; + s->Freq = (Byte)((s->Freq + adder) >> 1); + sumFreq += s->Freq; + if (s[0].Freq > s[-1].Freq) + { + CPpmd_State *s1 = s; + CPpmd_State tmp = *s1; + do + s1[0] = s1[-1]; + while (--s1 != stats && tmp.Freq > s1[-1].Freq); + *s1 = tmp; + } + } + while (--i); + + if (s->Freq == 0) + { + unsigned numStats = p->MinContext->NumStats; + unsigned n0, n1; + do { i++; } while ((--s)->Freq == 0); + escFreq += i; + p->MinContext->NumStats = (Byte)(p->MinContext->NumStats - i); + if (p->MinContext->NumStats == 0) + { + CPpmd_State tmp = *stats; + tmp.Freq = (Byte)((2 * tmp.Freq + escFreq - 1) / escFreq); + if (tmp.Freq > MAX_FREQ / 3) + tmp.Freq = MAX_FREQ / 3; + InsertNode(p, stats, U2I((numStats + 2) >> 1)); + p->MinContext->Flags = (p->MinContext->Flags & 0x10) + 0x08 * (tmp.Symbol >= 0x40); + *(p->FoundState = ONE_STATE(p->MinContext)) = tmp; + return; + } + n0 = (numStats + 2) >> 1; + n1 = (p->MinContext->NumStats + 2) >> 1; + if (n0 != n1) + p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1)); + p->MinContext->Flags &= ~0x08; + p->MinContext->Flags |= 0x08 * ((s = STATS(p->MinContext))->Symbol >= 0x40); + i = p->MinContext->NumStats; + do { p->MinContext->Flags |= 0x08*((++s)->Symbol >= 0x40); } while (--i); + } + p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1)); + p->MinContext->Flags |= 0x4; + p->FoundState = STATS(p->MinContext); +} + +CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked1, UInt32 *escFreq) +{ + CPpmd_See *see; + if (p->MinContext->NumStats != 0xFF) + { + see = p->See[p->NS2Indx[p->MinContext->NumStats + 2] - 3] + + (p->MinContext->SummFreq > 11 * ((unsigned)p->MinContext->NumStats + 1)) + + 2 * (2 * (unsigned)p->MinContext->NumStats < + ((unsigned)SUFFIX(p->MinContext)->NumStats + numMasked1)) + + p->MinContext->Flags; + { + unsigned r = (see->Summ >> see->Shift); + see->Summ = (UInt16)(see->Summ - r); + *escFreq = r + (r == 0); + } + } + else + { + see = &p->DummySee; + *escFreq = 1; + } + return see; +} + +static void NextContext(CPpmd8 *p) +{ + CTX_PTR c = CTX(SUCCESSOR(p->FoundState)); + if (p->OrderFall == 0 && (Byte *)c >= p->UnitsStart) + p->MinContext = p->MaxContext = c; + else + { + UpdateModel(p); + p->MinContext = p->MaxContext; + } +} + +void Ppmd8_Update1(CPpmd8 *p) +{ + CPpmd_State *s = p->FoundState; + s->Freq += 4; + p->MinContext->SummFreq += 4; + if (s[0].Freq > s[-1].Freq) + { + SwapStates(&s[0], &s[-1]); + p->FoundState = --s; + if (s->Freq > MAX_FREQ) + Rescale(p); + } + NextContext(p); +} + +void Ppmd8_Update1_0(CPpmd8 *p) +{ + p->PrevSuccess = (2 * p->FoundState->Freq >= p->MinContext->SummFreq); + p->RunLength += p->PrevSuccess; + p->MinContext->SummFreq += 4; + if ((p->FoundState->Freq += 4) > MAX_FREQ) + Rescale(p); + NextContext(p); +} + +void Ppmd8_UpdateBin(CPpmd8 *p) +{ + p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 196)); + p->PrevSuccess = 1; + p->RunLength++; + NextContext(p); +} + +void Ppmd8_Update2(CPpmd8 *p) +{ + p->MinContext->SummFreq += 4; + if ((p->FoundState->Freq += 4) > MAX_FREQ) + Rescale(p); + p->RunLength = p->InitRL; + UpdateModel(p); + p->MinContext = p->MaxContext; +} + +/* H->I changes: + NS2Indx + GlewCount, and Glue method + BinSum + See / EscFreq + CreateSuccessors updates more suffix contexts + UpdateModel consts. + PrevSuccess Update +*/ diff --git a/Provenance/LZMASDK/Ppmd8.h b/Provenance/LZMASDK/Ppmd8.h new file mode 100755 index 0000000000..6efd4eaf32 --- /dev/null +++ b/Provenance/LZMASDK/Ppmd8.h @@ -0,0 +1,133 @@ +/* Ppmd8.h -- PPMdI codec +2010-03-24 : Igor Pavlov : Public domain +This code is based on: + PPMd var.I (2002): Dmitry Shkarin : Public domain + Carryless rangecoder (1999): Dmitry Subbotin : Public domain */ + +#ifndef __PPMD8_H +#define __PPMD8_H + +#include "Ppmd.h" + +EXTERN_C_BEGIN + +#define PPMD8_MIN_ORDER 2 +#define PPMD8_MAX_ORDER 16 + +struct CPpmd8_Context_; + +typedef + #ifdef PPMD_32BIT + struct CPpmd8_Context_ * + #else + UInt32 + #endif + CPpmd8_Context_Ref; + +typedef struct CPpmd8_Context_ +{ + Byte NumStats; + Byte Flags; + UInt16 SummFreq; + CPpmd_State_Ref Stats; + CPpmd8_Context_Ref Suffix; +} CPpmd8_Context; + +#define Ppmd8Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq) + +/* The BUG in Shkarin's code for FREEZE mode was fixed, but that fixed + code is not compatible with original code for some files compressed + in FREEZE mode. So we disable FREEZE mode support. */ + +enum +{ + PPMD8_RESTORE_METHOD_RESTART, + PPMD8_RESTORE_METHOD_CUT_OFF + #ifdef PPMD8_FREEZE_SUPPORT + , PPMD8_RESTORE_METHOD_FREEZE + #endif +}; + +typedef struct +{ + CPpmd8_Context *MinContext, *MaxContext; + CPpmd_State *FoundState; + unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder; + Int32 RunLength, InitRL; /* must be 32-bit at least */ + + UInt32 Size; + UInt32 GlueCount; + Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; + UInt32 AlignOffset; + unsigned RestoreMethod; + + /* Range Coder */ + UInt32 Range; + UInt32 Code; + UInt32 Low; + union + { + IByteIn *In; + IByteOut *Out; + } Stream; + + Byte Indx2Units[PPMD_NUM_INDEXES]; + Byte Units2Indx[128]; + CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; + UInt32 Stamps[PPMD_NUM_INDEXES]; + + Byte NS2BSIndx[256], NS2Indx[260]; + CPpmd_See DummySee, See[24][32]; + UInt16 BinSumm[25][64]; +} CPpmd8; + +void Ppmd8_Construct(CPpmd8 *p); +Bool Ppmd8_Alloc(CPpmd8 *p, UInt32 size, ISzAlloc *alloc); +void Ppmd8_Free(CPpmd8 *p, ISzAlloc *alloc); +void Ppmd8_Init(CPpmd8 *p, unsigned maxOrder, unsigned restoreMethod); +#define Ppmd8_WasAllocated(p) ((p)->Base != NULL) + + +/* ---------- Internal Functions ---------- */ + +extern const Byte PPMD8_kExpEscape[16]; + +#ifdef PPMD_32BIT + #define Ppmd8_GetPtr(p, ptr) (ptr) + #define Ppmd8_GetContext(p, ptr) (ptr) + #define Ppmd8_GetStats(p, ctx) ((ctx)->Stats) +#else + #define Ppmd8_GetPtr(p, offs) ((void *)((p)->Base + (offs))) + #define Ppmd8_GetContext(p, offs) ((CPpmd8_Context *)Ppmd8_GetPtr((p), (offs))) + #define Ppmd8_GetStats(p, ctx) ((CPpmd_State *)Ppmd8_GetPtr((p), ((ctx)->Stats))) +#endif + +void Ppmd8_Update1(CPpmd8 *p); +void Ppmd8_Update1_0(CPpmd8 *p); +void Ppmd8_Update2(CPpmd8 *p); +void Ppmd8_UpdateBin(CPpmd8 *p); + +#define Ppmd8_GetBinSumm(p) \ + &p->BinSumm[p->NS2Indx[Ppmd8Context_OneState(p->MinContext)->Freq - 1]][ \ + p->NS2BSIndx[Ppmd8_GetContext(p, p->MinContext->Suffix)->NumStats] + \ + p->PrevSuccess + p->MinContext->Flags + ((p->RunLength >> 26) & 0x20)] + +CPpmd_See *Ppmd8_MakeEscFreq(CPpmd8 *p, unsigned numMasked, UInt32 *scale); + + +/* ---------- Decode ---------- */ + +Bool Ppmd8_RangeDec_Init(CPpmd8 *p); +#define Ppmd8_RangeDec_IsFinishedOK(p) ((p)->Code == 0) +int Ppmd8_DecodeSymbol(CPpmd8 *p); /* returns: -1 as EndMarker, -2 as DataError */ + + +/* ---------- Encode ---------- */ + +#define Ppmd8_RangeEnc_Init(p) { (p)->Low = 0; (p)->Range = 0xFFFFFFFF; } +void Ppmd8_RangeEnc_FlushData(CPpmd8 *p); +void Ppmd8_EncodeSymbol(CPpmd8 *p, int symbol); /* symbol = -1 means EndMarker */ + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/Ppmd8Dec.c b/Provenance/LZMASDK/Ppmd8Dec.c new file mode 100755 index 0000000000..934eae7001 --- /dev/null +++ b/Provenance/LZMASDK/Ppmd8Dec.c @@ -0,0 +1,155 @@ +/* Ppmd8Dec.c -- PPMdI Decoder +2010-04-16 : Igor Pavlov : Public domain +This code is based on: + PPMd var.I (2002): Dmitry Shkarin : Public domain + Carryless rangecoder (1999): Dmitry Subbotin : Public domain */ + +#include "Ppmd8.h" + +#define kTop (1 << 24) +#define kBot (1 << 15) + +Bool Ppmd8_RangeDec_Init(CPpmd8 *p) +{ + unsigned i; + p->Low = 0; + p->Range = 0xFFFFFFFF; + p->Code = 0; + for (i = 0; i < 4; i++) + p->Code = (p->Code << 8) | p->Stream.In->Read(p->Stream.In); + return (p->Code < 0xFFFFFFFF); +} + +static UInt32 RangeDec_GetThreshold(CPpmd8 *p, UInt32 total) +{ + return p->Code / (p->Range /= total); +} + +static void RangeDec_Decode(CPpmd8 *p, UInt32 start, UInt32 size) +{ + start *= p->Range; + p->Low += start; + p->Code -= start; + p->Range *= size; + + while ((p->Low ^ (p->Low + p->Range)) < kTop || + (p->Range < kBot && ((p->Range = (0 - p->Low) & (kBot - 1)), 1))) + { + p->Code = (p->Code << 8) | p->Stream.In->Read(p->Stream.In); + p->Range <<= 8; + p->Low <<= 8; + } +} + +#define MASK(sym) ((signed char *)charMask)[sym] + +int Ppmd8_DecodeSymbol(CPpmd8 *p) +{ + size_t charMask[256 / sizeof(size_t)]; + if (p->MinContext->NumStats != 0) + { + CPpmd_State *s = Ppmd8_GetStats(p, p->MinContext); + unsigned i; + UInt32 count, hiCnt; + if ((count = RangeDec_GetThreshold(p, p->MinContext->SummFreq)) < (hiCnt = s->Freq)) + { + Byte symbol; + RangeDec_Decode(p, 0, s->Freq); + p->FoundState = s; + symbol = s->Symbol; + Ppmd8_Update1_0(p); + return symbol; + } + p->PrevSuccess = 0; + i = p->MinContext->NumStats; + do + { + if ((hiCnt += (++s)->Freq) > count) + { + Byte symbol; + RangeDec_Decode(p, hiCnt - s->Freq, s->Freq); + p->FoundState = s; + symbol = s->Symbol; + Ppmd8_Update1(p); + return symbol; + } + } + while (--i); + if (count >= p->MinContext->SummFreq) + return -2; + RangeDec_Decode(p, hiCnt, p->MinContext->SummFreq - hiCnt); + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(s->Symbol) = 0; + i = p->MinContext->NumStats; + do { MASK((--s)->Symbol) = 0; } while (--i); + } + else + { + UInt16 *prob = Ppmd8_GetBinSumm(p); + if (((p->Code / (p->Range >>= 14)) < *prob)) + { + Byte symbol; + RangeDec_Decode(p, 0, *prob); + *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob); + symbol = (p->FoundState = Ppmd8Context_OneState(p->MinContext))->Symbol; + Ppmd8_UpdateBin(p); + return symbol; + } + RangeDec_Decode(p, *prob, (1 << 14) - *prob); + *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob); + p->InitEsc = PPMD8_kExpEscape[*prob >> 10]; + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(Ppmd8Context_OneState(p->MinContext)->Symbol) = 0; + p->PrevSuccess = 0; + } + for (;;) + { + CPpmd_State *ps[256], *s; + UInt32 freqSum, count, hiCnt; + CPpmd_See *see; + unsigned i, num, numMasked = p->MinContext->NumStats; + do + { + p->OrderFall++; + if (!p->MinContext->Suffix) + return -1; + p->MinContext = Ppmd8_GetContext(p, p->MinContext->Suffix); + } + while (p->MinContext->NumStats == numMasked); + hiCnt = 0; + s = Ppmd8_GetStats(p, p->MinContext); + i = 0; + num = p->MinContext->NumStats - numMasked; + do + { + int k = (int)(MASK(s->Symbol)); + hiCnt += (s->Freq & k); + ps[i] = s++; + i -= k; + } + while (i != num); + + see = Ppmd8_MakeEscFreq(p, numMasked, &freqSum); + freqSum += hiCnt; + count = RangeDec_GetThreshold(p, freqSum); + + if (count < hiCnt) + { + Byte symbol; + CPpmd_State **pps = ps; + for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++); + s = *pps; + RangeDec_Decode(p, hiCnt - s->Freq, s->Freq); + Ppmd_See_Update(see); + p->FoundState = s; + symbol = s->Symbol; + Ppmd8_Update2(p); + return symbol; + } + if (count >= freqSum) + return -2; + RangeDec_Decode(p, hiCnt, freqSum - hiCnt); + see->Summ = (UInt16)(see->Summ + freqSum); + do { MASK(ps[--i]->Symbol) = 0; } while (i != 0); + } +} diff --git a/Provenance/LZMASDK/RotateDefs.h b/Provenance/LZMASDK/RotateDefs.h new file mode 100755 index 0000000000..ff9b722902 --- /dev/null +++ b/Provenance/LZMASDK/RotateDefs.h @@ -0,0 +1,20 @@ +/* RotateDefs.h -- Rotate functions +2009-02-07 : Igor Pavlov : Public domain */ + +#ifndef __ROTATE_DEFS_H +#define __ROTATE_DEFS_H + +#ifdef _MSC_VER + +#include +#define rotlFixed(x, n) _rotl((x), (n)) +#define rotrFixed(x, n) _rotr((x), (n)) + +#else + +#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) +#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) + +#endif + +#endif diff --git a/Provenance/LZMASDK/Types.h b/Provenance/LZMASDK/Types.h new file mode 100755 index 0000000000..f193ce2f53 --- /dev/null +++ b/Provenance/LZMASDK/Types.h @@ -0,0 +1,254 @@ +/* Types.h -- Basic types +2010-10-09 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#include + +#ifdef _WIN32 +#include +#endif + +#ifndef EXTERN_C_BEGIN +#ifdef __cplusplus +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_BEGIN +#define EXTERN_C_END +#endif +#endif + +EXTERN_C_BEGIN + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 +typedef DWORD WRes; +#else +typedef int WRes; +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#define UINT64_CONST(n) n +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#define UINT64_CONST(n) n ## ULL +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int Bool; +#define True 1 +#define False 0 + + +#ifdef _WIN32 +#define MY_STD_CALL __stdcall +#else +#define MY_STD_CALL +#endif + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_CDECL __cdecl +#define MY_FAST_CALL __fastcall + +#else + +#define MY_CDECL +#define MY_FAST_CALL + +#endif + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct +{ + Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ +} IByteIn; + +typedef struct +{ + void (*Write)(void *p, Byte b); +} IByteOut; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +} ISeqInStream; + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); + +typedef struct +{ + size_t (*Write)(void *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +} ISeqOutStream; + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ISeekInStream; + +typedef struct +{ + SRes (*Look)(void *p, const void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(void *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(void *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ILookInStream; + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); + +#define LookToRead_BUF_SIZE (1 << 14) + +typedef struct +{ + ILookInStream s; + ISeekInStream *realStream; + size_t pos; + size_t size; + Byte buf[LookToRead_BUF_SIZE]; +} CLookToRead; + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead); +void LookToRead_Init(CLookToRead *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + +typedef struct +{ + SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +} ICompressProgress; + +typedef struct +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ +} ISzAlloc; + +#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) +#define IAlloc_Free(p, a) (p)->Free((p), a) + +#ifdef _WIN32 + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#endif + +EXTERN_C_END + +#endif diff --git a/Provenance/LZMASDK/Util/7z/7zAlloc.c b/Provenance/LZMASDK/Util/7z/7zAlloc.c new file mode 100755 index 0000000000..8874496d41 --- /dev/null +++ b/Provenance/LZMASDK/Util/7z/7zAlloc.c @@ -0,0 +1,76 @@ +/* 7zAlloc.c -- Allocation functions +2010-10-29 : Igor Pavlov : Public domain */ + +#include "7zAlloc.h" + +/* #define _SZ_ALLOC_DEBUG */ +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ + +#ifdef _SZ_ALLOC_DEBUG + +#ifdef _WIN32 +#include +#endif + +#include +int g_allocCount = 0; +int g_allocCountTemp = 0; + +#endif + +void *SzAlloc(void *p, size_t size) +{ + p = p; + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount); + g_allocCount++; + #endif + return malloc(size); +} + +void SzFree(void *p, void *address) +{ + p = p; + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCount--; + fprintf(stderr, "\nFree; count = %10d", g_allocCount); + } + #endif + free(address); +} + +void *SzAllocTemp(void *p, size_t size) +{ + p = p; + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_temp %10d bytes; count = %10d", size, g_allocCountTemp); + g_allocCountTemp++; + #ifdef _WIN32 + return HeapAlloc(GetProcessHeap(), 0, size); + #endif + #endif + return malloc(size); +} + +void SzFreeTemp(void *p, void *address) +{ + p = p; + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCountTemp--; + fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); + } + #ifdef _WIN32 + HeapFree(GetProcessHeap(), 0, address); + return; + #endif + #endif + free(address); +} diff --git a/Provenance/LZMASDK/Util/7z/7zAlloc.h b/Provenance/LZMASDK/Util/7z/7zAlloc.h new file mode 100755 index 0000000000..860f116ace --- /dev/null +++ b/Provenance/LZMASDK/Util/7z/7zAlloc.h @@ -0,0 +1,15 @@ +/* 7zAlloc.h -- Allocation functions +2010-10-29 : Igor Pavlov : Public domain */ + +#ifndef __7Z_ALLOC_H +#define __7Z_ALLOC_H + +#include + +void *SzAlloc(void *p, size_t size); +void SzFree(void *p, void *address); + +void *SzAllocTemp(void *p, size_t size); +void SzFreeTemp(void *p, void *address); + +#endif diff --git a/Provenance/LZMASDK/Util/7z/7zMain.c b/Provenance/LZMASDK/Util/7z/7zMain.c new file mode 100755 index 0000000000..b6ebf12e31 --- /dev/null +++ b/Provenance/LZMASDK/Util/7z/7zMain.c @@ -0,0 +1,794 @@ +/* 7zMain.c - Test application for 7z Decoder +2010-03-12 : Igor Pavlov : Public domain */ + +#pragma clang diagnostic ignored "-Wmissing-prototypes" + +#include +#include + +#include "../../7z.h" +#ifdef _7ZIP_CRC_SUPPORT +#include "../../7zCrc.h" +#endif +#include "../../7zFile.h" +#include "../../7zVersion.h" + +#include "7zAlloc.h" + +#ifndef USE_WINDOWS_FILE +/* for mkdir */ +#ifdef _WIN32 +#include +#else +#include +#include +#endif +#endif + +#ifdef _WIN32 +#define CHAR_PATH_SEPARATOR '\\' +#else +#define CHAR_PATH_SEPARATOR '/' +#endif + +#include +#include + +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +static int Buf_EnsureSize(CBuf *dest, size_t size) +{ + if (dest->size >= size) + return 1; + Buf_Free(dest, &g_Alloc); + return Buf_Create(dest, size, &g_Alloc); +} + +#ifndef _WIN32 + +static Byte kUtf8Limits[5] = { 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + +static Bool Utf16_To_Utf8(Byte *dest, size_t *destLen, const UInt16 *src, size_t srcLen) +{ + size_t destPos = 0, srcPos = 0; + for (;;) + { + unsigned numAdds; + UInt32 value; + if (srcPos == srcLen) + { + *destLen = destPos; + return True; + } + value = src[srcPos++]; + if (value < 0x80) + { + if (dest) + dest[destPos] = (char)value; + destPos++; + continue; + } + if (value >= 0xD800 && value < 0xE000) + { + UInt32 c2; + if (value >= 0xDC00 || srcPos == srcLen) + break; + c2 = src[srcPos++]; + if (c2 < 0xDC00 || c2 >= 0xE000) + break; + value = (((value - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000; + } + for (numAdds = 1; numAdds < 5; numAdds++) + if (value < (((UInt32)1) << (numAdds * 5 + 6))) + break; + if (dest) + dest[destPos] = (char)(kUtf8Limits[numAdds - 1] + (value >> (6 * numAdds))); + destPos++; + do + { + numAdds--; + if (dest) + dest[destPos] = (char)(0x80 + ((value >> (6 * numAdds)) & 0x3F)); + destPos++; + } + while (numAdds != 0); + } + *destLen = destPos; + return False; +} + +static SRes Utf16_To_Utf8Buf(CBuf *dest, const UInt16 *src, size_t srcLen) +{ + size_t destLen = 0; + Bool res; + Utf16_To_Utf8(NULL, &destLen, src, srcLen); + destLen += 1; + if (!Buf_EnsureSize(dest, destLen)) + return SZ_ERROR_MEM; + res = Utf16_To_Utf8(dest->data, &destLen, src, srcLen); + dest->data[destLen] = 0; + return res ? SZ_OK : SZ_ERROR_FAIL; +} +#endif + +static WRes Utf16_To_Char(CBuf *buf, const UInt16 *s, int fileMode) +{ + int len = 0; + for (len = 0; s[len] != '\0'; len++); + + #ifdef _WIN32 + { + int size = len * 3 + 100; + if (!Buf_EnsureSize(buf, size)) + return SZ_ERROR_MEM; + { + char defaultChar = '_'; + BOOL defUsed; + int numChars = WideCharToMultiByte(fileMode ? (AreFileApisANSI() ? CP_ACP : CP_OEMCP) : CP_OEMCP, + 0, s, len, (char *)buf->data, size, &defaultChar, &defUsed); + if (numChars == 0 || numChars >= size) + return SZ_ERROR_FAIL; + buf->data[numChars] = 0; + return SZ_OK; + } + } + #else + fileMode = fileMode; + return Utf16_To_Utf8Buf(buf, s, len); + #endif +} + +static WRes MyCreateDir(const UInt16 *name, const char *threadCwd) +{ + #ifdef USE_WINDOWS_FILE + /* FIXME: windows lacks threadCwd support */ + + return CreateDirectoryW(name, NULL) ? 0 : GetLastError(); + + #else + + CBuf buf; + WRes res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name, 1)); + + char *qualName = (char*) buf.data; + if (threadCwd != NULL) { + qualName = (char *) malloc(strlen(threadCwd) + strlen(qualName) + 1); + strcpy(qualName, threadCwd); + strcat(qualName, (char*) buf.data); + } + + res = + #ifdef _WIN32 + _mkdir((const char *)qualName) + #else + mkdir((const char *)qualName, 0777) + #endif + == 0 ? 0 : errno; + Buf_Free(&buf, &g_Alloc); + if (qualName != (char*)buf.data) { + free(qualName); + } + return res; + + #endif +} + +static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name, const char *threadCwd) +{ + #ifdef USE_WINDOWS_FILE + return OutFile_OpenW(p, name); + #else + CBuf buf; + WRes res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name, 1)); + res = OutFile_Open(p, (const char *)buf.data, threadCwd); + Buf_Free(&buf, &g_Alloc); + return res; + #endif +} + +//static void PrintString(const UInt16 *s) +//{ +// CBuf buf; +// Buf_Init(&buf); +// if (Utf16_To_Char(&buf, s, 0) == 0) +// { +// printf("%s", buf.data); +// } +// Buf_Free(&buf, &g_Alloc); +//} + +//static void UInt64ToStr(UInt64 value, char *s) +//{ +// char temp[32]; +// int pos = 0; +// do +// { +// temp[pos++] = (char)('0' + (unsigned)(value % 10)); +// value /= 10; +// } +// while (value != 0); +// do +// *s++ = temp[--pos]; +// while (pos); +// *s = '\0'; +//} + +//static char *UIntToStr(char *s, unsigned value, int numDigits) +//{ +// char temp[16]; +// int pos = 0; +// do +// temp[pos++] = (char)('0' + (value % 10)); +// while (value /= 10); +// for (numDigits -= pos; numDigits > 0; numDigits--) +// *s++ = '0'; +// do +// *s++ = temp[--pos]; +// while (pos); +// *s = '\0'; +// return s; +//} + +#define PERIOD_4 (4 * 365 + 1) +#define PERIOD_100 (PERIOD_4 * 25 - 1) +#define PERIOD_400 (PERIOD_100 * 4 + 1) + +//static void ConvertFileTimeToString(const CNtfsFileTime *ft, char *s) +//{ +// unsigned year, mon, day, hour, min, sec; +// UInt64 v64 = (ft->Low | ((UInt64)ft->High << 32)) / 10000000; +// Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; +// unsigned t; +// UInt32 v; +// sec = (unsigned)(v64 % 60); v64 /= 60; +// min = (unsigned)(v64 % 60); v64 /= 60; +// hour = (unsigned)(v64 % 24); v64 /= 24; +// +// v = (UInt32)v64; +// +// year = (unsigned)(1601 + v / PERIOD_400 * 400); +// v %= PERIOD_400; +// +// t = v / PERIOD_100; if (t == 4) t = 3; year += t * 100; v -= t * PERIOD_100; +// t = v / PERIOD_4; if (t == 25) t = 24; year += t * 4; v -= t * PERIOD_4; +// t = v / 365; if (t == 4) t = 3; year += t; v -= t * 365; +// +// if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) +// ms[1] = 29; +// for (mon = 1; mon <= 12; mon++) +// { +// unsigned s = ms[mon - 1]; +// if (v < s) +// break; +// v -= s; +// } +// day = (unsigned)v + 1; +// s = UIntToStr(s, year, 4); *s++ = '-'; +// s = UIntToStr(s, mon, 2); *s++ = '-'; +// s = UIntToStr(s, day, 2); *s++ = ' '; +// s = UIntToStr(s, hour, 2); *s++ = ':'; +// s = UIntToStr(s, min, 2); *s++ = ':'; +// s = UIntToStr(s, sec, 2); +// s = s; // Avoids clang analyzer error about s value not being read +//} + +void PrintError(char *sz) +{ + printf("\nERROR: %s\n", sz); +} + +//#ifdef USE_WINDOWS_FILE +//#define kEmptyAttribChar '.' +//static void GetAttribString(UInt32 wa, Bool isDir, char *s) +//{ +// s[0] = (char)(((wa & FILE_ATTRIBUTE_DIRECTORY) != 0 || isDir) ? 'D' : kEmptyAttribChar); +// s[1] = (char)(((wa & FILE_ATTRIBUTE_READONLY) != 0) ? 'R': kEmptyAttribChar); +// s[2] = (char)(((wa & FILE_ATTRIBUTE_HIDDEN) != 0) ? 'H': kEmptyAttribChar); +// s[3] = (char)(((wa & FILE_ATTRIBUTE_SYSTEM) != 0) ? 'S': kEmptyAttribChar); +// s[4] = (char)(((wa & FILE_ATTRIBUTE_ARCHIVE) != 0) ? 'A': kEmptyAttribChar); +// s[5] = '\0'; +//} +//#else +//static void GetAttribString(UInt32 wa, Bool isDir, char *s) +//{ +// s[0] = '\0'; +//} +//#endif + +//int MY_CDECL unused_main(int numargs, char *args[]) +//{ +// CFileInStream archiveStream; +// CLookToRead lookStream; +// CSzArEx db; +// SRes res; +// ISzAlloc allocImp; +// ISzAlloc allocTempImp; +// UInt16 *temp = NULL; +// size_t tempSize = 0; +// +// printf("\n7z ANSI-C Decoder " MY_VERSION_COPYRIGHT_DATE "\n\n"); +// if (numargs == 1) +// { +// printf( +// "Usage: 7zDec \n\n" +// "\n" +// " e: Extract files from archive (without using directory names)\n" +// " l: List contents of archive\n" +// " t: Test integrity of archive\n" +// " x: eXtract files with full paths\n"); +// return 0; +// } +// if (numargs < 3) +// { +// PrintError("incorrect command"); +// return 1; +// } +// +// allocImp.Alloc = SzAlloc; +// allocImp.Free = SzFree; +// +// allocTempImp.Alloc = SzAllocTemp; +// allocTempImp.Free = SzFreeTemp; +// +// if (InFile_Open(&archiveStream.file, args[2])) +// { +// PrintError("can not open input file"); +// return 1; +// } +// +// FileInStream_CreateVTable(&archiveStream); +// LookToRead_CreateVTable(&lookStream, False); +// +// lookStream.realStream = &archiveStream.s; +// LookToRead_Init(&lookStream); +// +//#ifdef _7ZIP_CRC_SUPPORT +// CrcGenerateTable(); +//#endif +// +// SzArEx_Init(&db); +// res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); +// if (res == SZ_OK) +// { +// char *command = args[1]; +// int listCommand = 0, testCommand = 0, /*extractCommand = 0,*/ fullPaths = 0; +// if (strcmp(command, "l") == 0) listCommand = 1; +// else if (strcmp(command, "t") == 0) testCommand = 1; +// else if (strcmp(command, "e") == 0) { /*extractCommand = 1;*/ } +// else if (strcmp(command, "x") == 0) { /*extractCommand = 1;*/ fullPaths = 1; } +// else +// { +// PrintError("incorrect command"); +// res = SZ_ERROR_FAIL; +// } +// +// if (res == SZ_OK) +// { +// UInt32 i; +// +// /* +// if you need cache, use these 3 variables. +// if you use external function, you can make these variable as static. +// */ +// UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ +// Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ +// size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ +// +// for (i = 0; i < db.db.NumFiles; i++) +// { +// size_t offset = 0; +// size_t outSizeProcessed = 0; +// const CSzFileItem *f = db.db.Files + i; +// size_t len; +// if (listCommand == 0 && f->IsDir && !fullPaths) +// continue; +// len = SzArEx_GetFileNameUtf16(&db, i, NULL); +// +// if (len > tempSize) +// { +// SzFree(NULL, temp); +// tempSize = len; +// temp = (UInt16 *)SzAlloc(NULL, tempSize * sizeof(temp[0])); +// if (temp == 0) +// { +// res = SZ_ERROR_MEM; +// break; +// } +// } +// +// SzArEx_GetFileNameUtf16(&db, i, temp); +// if (listCommand) +// { +// char attr[8], s[32], t[32]; +// +// GetAttribString(f->AttribDefined ? f->Attrib : 0, f->IsDir, attr); +// +// UInt64ToStr(f->Size, s); +// if (f->MTimeDefined) +// ConvertFileTimeToString(&f->MTime, t); +// else +// { +// size_t j; +// for (j = 0; j < 19; j++) +// t[j] = ' '; +// t[j] = '\0'; +// } +// +// printf("%s %s %10s ", t, attr, s); +// PrintString(temp); +// if (f->IsDir) +// printf("/"); +// printf("\n"); +// continue; +// } +// printf(testCommand ? +// "Testing ": +// "Extracting "); +// PrintString(temp); +// if (f->IsDir) +// printf("/"); +// else +// { +// res = SzArEx_Extract(&db, &lookStream.s, i, +// &blockIndex, &outBuffer, &outBufferSize, +// &offset, &outSizeProcessed, +// &allocImp, &allocTempImp); +// if (res != SZ_OK) +// break; +// } +// if (!testCommand) +// { +// CSzFile outFile; +// size_t processedSize; +// size_t j; +// UInt16 *name = (UInt16 *)temp; +// const UInt16 *destPath = (const UInt16 *)name; +// for (j = 0; (name != NULL) && (name[j] != 0); j++) +// if (name[j] == '/') +// { +// if (fullPaths) +// { +// name[j] = 0; +// MyCreateDir(name); +// name[j] = CHAR_PATH_SEPARATOR; +// } +// else +// destPath = name + j + 1; +// } +// +// if (f->IsDir) +// { +// MyCreateDir(destPath); +// printf("\n"); +// continue; +// } +// else if (OutFile_OpenUtf16(&outFile, destPath)) +// { +// PrintError("can not open output file"); +// res = SZ_ERROR_FAIL; +// break; +// } +// processedSize = outSizeProcessed; +// if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || processedSize != outSizeProcessed) +// { +// PrintError("can not write output file"); +// res = SZ_ERROR_FAIL; +// break; +// } +// if (File_Close(&outFile)) +// { +// PrintError("can not close output file"); +// res = SZ_ERROR_FAIL; +// break; +// } +// #ifdef USE_WINDOWS_FILE +// if (f->AttribDefined) +// SetFileAttributesW(destPath, f->Attrib); +// #endif +// } +// printf("\n"); +// } +// IAlloc_Free(&allocImp, outBuffer); +// } +// } +// SzArEx_Free(&db, &allocImp); +// SzFree(NULL, temp); +// +// File_Close(&archiveStream.file); +// if (res == SZ_OK) +// { +// printf("\nEverything is Ok\n"); +// return 0; +// } +// if (res == SZ_ERROR_UNSUPPORTED) +// PrintError("decoder doesn't support this archive"); +// else if (res == SZ_ERROR_MEM) +// PrintError("can not allocate memory"); +// else if (res == SZ_ERROR_CRC) +// PrintError("CRC error"); +// else +// printf("\nERROR #%d\n", res); +// return 1; +//} + +// This entry point will extract all the contents of a .7z file +// into the current directory when entryName is NULL. If +// entryName is not NULL, then this method will extract a single +// entry that has the name indicated in entryName. When extracting +// all files, the files are created in the current directory. If +// a single file is extracted by passing a non-NULL entryName, +// then the file data is written to the path indicated by entryPath. + +//#define DEBUG_OUTPUT + +int do7z_extract_entry(char *archivePath, char *archiveCachePath, char *threadCwd, char *entryName, char *entryPath, int fullPaths) +{ + CFileInStream archiveStream; + CLookToRead lookStream; + CSzArEx db; + SRes res; + ISzAlloc allocImp; + ISzAlloc allocTempImp; + UInt16 *temp = NULL; + size_t tempSize = 0; + int foundMatchingEntryName = 0; + int extractAllFiles = 0; + +/* + printf("\n7z ANSI-C Decoder " MY_VERSION_COPYRIGHT_DATE "\n\n"); + if (numargs == 1) + { + printf( + "Usage: 7zDec \n\n" + "\n" + " e: Extract files from archive (without using directory names)\n" + " l: List contents of archive\n" + " t: Test integrity of archive\n" + " x: eXtract files with full paths\n"); + return 0; + } + if (numargs < 3) + { + PrintError("incorrect command"); + return 1; + } +*/ + + allocImp.Alloc = SzAlloc; + allocImp.Free = SzFree; + + allocTempImp.Alloc = SzAllocTemp; + allocTempImp.Free = SzFreeTemp; + + if (InFile_Open(&archiveStream.file, archivePath)) + { + PrintError("can not open input file"); + return 1; + } + + FileInStream_CreateVTable(&archiveStream); + LookToRead_CreateVTable(&lookStream, False); + + lookStream.realStream = &archiveStream.s; + LookToRead_Init(&lookStream); + +#ifdef _7ZIP_CRC_SUPPORT + CrcGenerateTable(); +#else + //CPU_Is_InOrder(); // Not needed currently +#endif + + SzArEx_Init(&db); + res = SzArEx_Open(&db, &lookStream.s, &allocImp, &allocTempImp); + if (res == SZ_OK) + { + const int extractCommand = 1; + + assert(archiveCachePath); + + if (entryName == NULL) { + extractAllFiles = 1; + } else { + assert(strlen(entryName) > 0); + assert(entryPath != NULL); + assert(strlen(entryPath) > 0); + } + + if (extractCommand) + { + UInt32 i; + + // The dictionary cache contains data decompressed from the archive. It is managed by + // the library and must be freed when done with processing of a specific archive. + // Note that the cache cannot be saved from one execution to the next, it must + // not exist after this function is done executing. + + SzArEx_DictCache dictCache; + SzArEx_DictCache_init(&dictCache, &allocImp); + + // Enable mmap to file if the archive would be larger than 1/2 meg + dictCache.mapFilename = archiveCachePath; + + for (i = 0; i < db.db.NumFiles; i++) + { + const CSzFileItem *f = db.db.Files + i; + size_t len; + if (f->IsDir && !fullPaths) + continue; + len = SzArEx_GetFileNameUtf16(&db, i, NULL); + + if (len > tempSize) + { + SzFree(NULL, temp); + tempSize = len; + temp = (UInt16 *)SzAlloc(NULL, tempSize * sizeof(temp[0])); + if (temp == 0) + { + res = SZ_ERROR_MEM; + break; + } + } + + SzArEx_GetFileNameUtf16(&db, i, temp); + +#ifdef DEBUG_OUTPUT + printf(testCommand ? + "Testing ": + "Extracting "); + PrintString(temp); +#endif + if (f->IsDir) { +#ifdef DEBUG_OUTPUT + printf("/"); +#endif + } + else + { + // When extracting a specific entry, skip extraction if the + // entry name does not match exatly. + + if (!extractAllFiles) { + CBuf buf; + Buf_Init(&buf); + if (temp && (Utf16_To_Char(&buf, temp, 0) == 0)) + { + if (strcmp((char*)buf.data, entryName) != 0) { + // This is not the entry we are interested in extracting + Buf_Free(&buf, &g_Alloc); + continue; + } + } + Buf_Free(&buf, &g_Alloc); + } + +// if (0) { +// printf("Extracting "); +// PrintString(temp); +// printf("\n"); +// } + + foundMatchingEntryName = 1; + + res = SzArEx_Extract(&db, + &lookStream.s, + i, // archive entry offset + &dictCache, + &allocImp, &allocTempImp); + if (res != SZ_OK) + break; + } + + { + CSzFile outFile; + size_t processedSize; + size_t j; + UInt16 *name = (UInt16 *)temp; + const UInt16 *destPath; + + if (extractAllFiles) { + // Extract to current dir, path is based on the entry path + + destPath = (const UInt16 *)name; + + for (j = 0; name[j] != 0; j++) + { + if (name[j] == '/') + { + if (fullPaths) + { + name[j] = 0; + MyCreateDir(name, threadCwd); + name[j] = CHAR_PATH_SEPARATOR; + } + else { + destPath = name + j + 1; + } + } + } + } else { + // Extract to specific fully qualified path + + SzFree(NULL, temp); + temp = (UInt16 *)SzAlloc(NULL, (strlen(entryPath) + 1) * sizeof(UInt16)); + int i = 0; + for (i = 0; i < strlen(entryPath); i++) { + temp[i] = entryPath[i]; + } + temp[i] = '\0'; + destPath = (const UInt16 *) temp; + } + + if (f->IsDir) + { + MyCreateDir(destPath, threadCwd); +#ifdef DEBUG_OUTPUT + printf("\n"); +#endif + continue; + } + else if (OutFile_OpenUtf16(&outFile, destPath, threadCwd)) + { + PrintError("can not open output file"); + res = SZ_ERROR_FAIL; + break; + } + processedSize = dictCache.outSizeProcessed; + void *entryPtr = dictCache.outBuffer + dictCache.entryOffset; + if (File_Write(&outFile, entryPtr, &processedSize) != 0 || processedSize != dictCache.outSizeProcessed) + { + PrintError("can not write output file"); + res = SZ_ERROR_FAIL; + break; + } + if (File_Close(&outFile)) + { + PrintError("can not close output file"); + res = SZ_ERROR_FAIL; + break; + } + } +#ifdef DEBUG_OUTPUT + printf("\n"); +#endif + } + SzArEx_DictCache_free(&dictCache); + } + } + SzArEx_Free(&db, &allocImp); + SzFree(NULL, temp); + + File_Close(&archiveStream.file); + if (!extractAllFiles && (foundMatchingEntryName == 0)) { + // Did not find a matching entry in the archive +#ifdef DEBUG_OUTPUT + printf("\nCould not find matching entry in archive\n"); +#endif + return 1; + } + + if (archiveCachePath) { + // remove cache file if it exists + unlink(archiveCachePath); + } + + if (res == SZ_OK) + { +#ifdef DEBUG_OUTPUT + printf("\nEverything is Ok\n"); +#endif + return 0; + } + if (res == SZ_ERROR_UNSUPPORTED) + PrintError("decoder doesn't support this archive"); + else if (res == SZ_ERROR_MEM) + PrintError("can not allocate memory"); + else if (res == SZ_ERROR_CRC) + PrintError("CRC error"); + else + printf("\nERROR #%d\n", res); + return 1; +} diff --git a/Provenance/LzmaSDKObjC/.gitignore b/Provenance/LzmaSDKObjC/.gitignore new file mode 100644 index 0000000000..3d98538b59 --- /dev/null +++ b/Provenance/LzmaSDKObjC/.gitignore @@ -0,0 +1,39 @@ +# OS X +.DS_Store + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xcuserdata +*.xccheckout +profile +*.moved-aside +DerivedData +*.hmap +*.ipa + +# Bundler +.bundle + +Carthage +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Note: if you ignore the Pods directory, make sure to uncomment +# `pod install` in .travis.yml +# +# Pods/ + +# Dev pod specific +tests/ios/LzmaSDK-ObjC.xcworkspace +tests/ios/Podfile.lock +tests/ios/Pods diff --git a/Provenance/LzmaSDKObjC/.travis.yml b/Provenance/LzmaSDKObjC/.travis.yml new file mode 100644 index 0000000000..896780b40c --- /dev/null +++ b/Provenance/LzmaSDKObjC/.travis.yml @@ -0,0 +1,14 @@ +language: objective-c +osx_image: xcode8.3 +xcode_sdk: iphonesimulator9.3 +podfile: tests/ios/Podfile + +before_install: + - gem install xcpretty --no-rdoc --no-ri --no-document + +script: +- open -b com.apple.iphonesimulator +- set -o pipefail && xcodebuild test -workspace tests/ios/LzmaSDK-ObjC.xcworkspace -scheme LzmaSDK-ObjC -destination 'platform=iOS Simulator,name=iPhone 4s,OS=8.4' | xcpretty -c +- set -o pipefail && xcodebuild test -workspace tests/ios/LzmaSDK-ObjC.xcworkspace -scheme LzmaSDK-ObjC -destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0' | xcpretty -c +- set -o pipefail && xcodebuild test -workspace tests/ios/LzmaSDK-ObjC.xcworkspace -scheme LzmaSDK-ObjC -destination 'platform=iOS Simulator,name=iPhone 6 Plus,OS=9.3' | xcpretty -c +- set -o pipefail && xcodebuild test -workspace tests/ios/LzmaSDK-ObjC.xcworkspace -scheme LzmaSDK-ObjC-OSX -destination 'platform=OS X,arch=x86_64' | xcpretty -c diff --git a/Provenance/LzmaSDKObjC/CHANGELOG b/Provenance/LzmaSDKObjC/CHANGELOG new file mode 100644 index 0000000000..cfb483159b --- /dev/null +++ b/Provenance/LzmaSDKObjC/CHANGELOG @@ -0,0 +1,114 @@ +Lzma SDK for Objective-C based on extended functionality of the C++ LZMA code + +Changes on version 2.0.13 (current): +- Added all default (de)coders. + +Changes on version 2.0.12: +- Add BCJ2 and PPMdH (de)coders. + +Changes on version 2.0.10: +- Update C++ source to version 16.04 (1604 - latest for now). + +Changes on version 2.0.9: +- Update C++ source to version 16.03 (1603 - latest for now). + +Changes on version 2.0.8: +- Fix Cocoapod script. + +Changes on version 2.0.5: +- Remove unused code. +- Disable Unicode, used UTF8 instead. + +Changes on version 2.0.3: +- Remove redurant string conversion code. + +Changes on version 2.0.2: +- Fix encode settings count. + +Changes on version 2.0.1: +- Remove xz support. +- Customize all writer settings. + +Changes on version 2.0.0: +- Reduce ammount of static variables. +- Error domain, e.g. `kLzmaSDKObjCErrorDomain` was changed to `LzmaSDKObjC`. +- Deprecated xz decoding, will be removed in next release. +- 7z archive writer. + +Changes on version 1.1.5: +- Added error possible failure reason description. + Use `NSLocalizedFailureReasonErrorKey` to get possible failure string. + +Changes on version 1.1.4: +- Update C++ source to version 16.02 (1602 - latest for now). + +Changes on version 1.1.3: +- Update C++ source to version 16.00. + +Changes on version 1.1.2: +- Added functionality for compress/decompress single `NSData` buffer object with LZMA2. + +Changes on version 1.0.7: +- Fix Undefined value access. + +Changes on version 1.0.4: +- Add nullability delegate flag to Objective-C reader. + +Changes on version 1.0.3: +- Ignore debug log messages via `LZMASDKOBJC_NO_DEBUG_LOG`. + +Changes on version 1.0.2: +- Move additional includes to private part of the code. + +Changes on version 1.0.1: +- Lzma & lzma2 test reader. + +Changes on version 1.0.0: +- Stable reader. + +Changes on version 0.1.2: +- Update C++ source to version 15.14. + +Changes on version 0.1.1: +- Update C++ source to version 15.12. + +Changes on version 0.1.0: +- iOS min version 8.0. +- Cocoapods framework. + +Changes on version 0.0.10: +- Added iOS framework target. + +Changes on version 0.0.9: +- Extract empty archive folders. + +Changes on version 0.0.8: +- Update LZMA SDK to version 15.12. + Note: If you use XZ code from LZMA SDK, it's recommended to upgrade to new XZ code from 7-Zip 15.12. + That new code fixes some bugs. + +Changes on version 0.0.7: +- Enabled test functionality. + +Changes on version 0.0.6: +- Add missed folder creation functionality during extract. +- Add initial error processing. + +Changes on version 0.0.5: +- LzmaSDKObjCItem strong field references. + +Changes on version 0.0.4: +- LzmaSDKObjCReader strong field references. + +Changes on version 0.0.3: +- Less static consts & variables. +- Exclude some unused code with preprocessor define. +- Test archive items CRC. + +Changes on version 0.0.2: +- Define memory size allocation for list and extract functionality. +- Fix closing last extracted file before deallocating reader. +- Code description. + +Version 0.0.1: +- Implemented list and extract of the Lzma & Lzma2 7z files. \ No newline at end of file diff --git a/Provenance/LzmaSDKObjC/LICENSE b/Provenance/LzmaSDKObjC/LICENSE new file mode 100644 index 0000000000..d3a9e4a8cc --- /dev/null +++ b/Provenance/LzmaSDKObjC/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 - 2017 Kulykov Oleh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Provenance/LzmaSDKObjC/LzmaSDK-ObjC.podspec b/Provenance/LzmaSDKObjC/LzmaSDK-ObjC.podspec new file mode 100644 index 0000000000..abaa1f51fe --- /dev/null +++ b/Provenance/LzmaSDKObjC/LzmaSDK-ObjC.podspec @@ -0,0 +1,172 @@ +# +# Be sure to run `pod lib lint LzmaSDK-ObjC.podspec' to ensure this is a +# valid spec before submitting. +# +# Any lines starting with a # are optional, but their use is encouraged +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = "LzmaSDK-ObjC" + s.version = "2.0.13" + s.summary = "Lzma SDK for Objective-C based on extended functionality of the C++ LZMA code" + s.description = <<-DESC +It's not yet another wrapper around C part of the LZMA SDK with all it's limitations. +Based on C++ LZMA SDK version 16.04 (1604 - latest for now) and patched for iOS & MacOS platforms. +Can be used with Swift and Objective-C. +The main advantages is: +- List, extract 7z files (Lzma & Lzma2 compression method). +- List, extract encrypted (password protected) 7z files (Lzma & Lzma2 compression method). +- List, extract encrypted (password protected) + encrypted header (no visible content, files list, without password) 7z files (Lzma & Lzma2 compression method). +- Create 7z archives (Lzma & Lzma2 compression method). +- Create encrypted (password protected) 7z archives (Lzma & Lzma2 compression method). +- Create encrypted (password protected) + encrypted header (no visible content, files list, without password) 7z archives (Lzma & Lzma2 compression method). +- Manage memory allocations during listing/extracting. +- Tuned up for using less than 500Kb for listing/extracting, can be easly changed runtime (no hardcoded definitions). +- Manage IO read/write operations, aslo can be easly changed runtime (no hardcoded definitions). +- Track smoothed progress, which becomes possible with prev. +- Support reading and extracting archive files with size more than 4GB. HugeFiles=on +- UTF8 support. +- Extra compression/decompression functionality of single NSData object with Lzma2. + DESC + + s.homepage = "https://github.com/OlehKulykov/LzmaSDKObjC" + s.license = 'MIT' + s.author = { "OlehKulykov" => "info@resident.name" } + s.source = { :git => "https://github.com/OlehKulykov/LzmaSDKObjC.git", :tag => s.version.to_s } + +# Platforms + s.ios.deployment_target = "8.0" + s.osx.deployment_target = "10.7" + + s.requires_arc = true + + s.public_header_files = 'src/LzmaSDKObjCTypes.h', + 'src/LzmaSDKObjCExtern.h', + 'src/LzmaSDKObjCReader.h', + 'src/LzmaSDKObjCWriter.h', + 'src/LzmaSDKObjCItem.h', + 'src/LzmaSDKObjCMutableItem.h', + 'src/LzmaSDKObjCBufferProcessor.h', + 'src/LzmaSDKObjC.h' + + s.source_files = 'src/*.{h,cpp,mm}', + 'lzma/C/*.{h}', + 'lzma/C/7zCrc.c', + 'lzma/C/7zCrcOpt.c', + 'lzma/C/7zStream.c', + 'lzma/C/Aes.c', + 'lzma/C/AesOpt.c', + 'lzma/C/Alloc.c', + 'lzma/C/Bcj2.c', + 'lzma/C/Bcj2Enc.c', + 'lzma/C/Bra.c', + 'lzma/C/Bra86.c', + 'lzma/C/BraIA64.c', + 'lzma/C/CpuArch.c', + 'lzma/C/Delta.c', + 'lzma/C/LzFind.c', + 'lzma/C/LzFindMt.c', + 'lzma/C/Lzma2Dec.c', + 'lzma/C/Lzma2Enc.c', + 'lzma/C/LzmaDec.c', + 'lzma/C/LzmaEnc.c', + 'lzma/C/MtCoder.c', + 'lzma/C/Ppmd7.c', + 'lzma/C/Ppmd7Dec.c', + 'lzma/C/Ppmd7Enc.c', + 'lzma/C/Sha256.c', + 'lzma/C/Threads.c', + 'lzma/C/Xz.c', + 'lzma/C/XzCrc64.c', + 'lzma/C/XzCrc64Opt.c', + 'lzma/C/XzDec.c', + 'lzma/C/XzEnc.c', + 'lzma/C/XzIn.c', + 'lzma/CPP/7zip/*.{h}', + 'lzma/CPP/7zip/Archive/*.{h}', + 'lzma/CPP/7zip/Archive/7z/*.{h}', + 'lzma/CPP/7zip/Archive/7z/7zDecode.cpp', + 'lzma/CPP/7zip/Archive/7z/7zEncode.cpp', + 'lzma/CPP/7zip/Archive/7z/7zExtract.cpp', + 'lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp', + 'lzma/CPP/7zip/Archive/7z/7zHandler.cpp', + 'lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp', + 'lzma/CPP/7zip/Archive/7z/7zHeader.cpp', + 'lzma/CPP/7zip/Archive/7z/7zIn.cpp', + 'lzma/CPP/7zip/Archive/7z/7zOut.cpp', + 'lzma/CPP/7zip/Archive/7z/7zProperties.cpp', + 'lzma/CPP/7zip/Archive/7z/7zRegister.cpp', + 'lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp', + 'lzma/CPP/7zip/Archive/7z/7zUpdate.cpp', + 'lzma/CPP/7zip/Archive/ArchiveExports.cpp', + 'lzma/CPP/7zip/Archive/Common/*.{h}', + 'lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp', + 'lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp', + 'lzma/CPP/7zip/Archive/Common/HandlerOut.cpp', + 'lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp', + 'lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp', + 'lzma/CPP/7zip/Archive/DllExports2.cpp', + 'lzma/CPP/7zip/Archive/LzmaHandler.cpp', + 'lzma/CPP/7zip/Common/*.{h}', + 'lzma/CPP/7zip/Common/CreateCoder.cpp', + 'lzma/CPP/7zip/Common/CWrappers.cpp', + 'lzma/CPP/7zip/Common/FileStreams.cpp', + 'lzma/CPP/7zip/Common/FilterCoder.cpp', + 'lzma/CPP/7zip/Common/InOutTempBuffer.cpp', + 'lzma/CPP/7zip/Common/LimitedStreams.cpp', + 'lzma/CPP/7zip/Common/LockedStream.cpp', + 'lzma/CPP/7zip/Common/MethodProps.cpp', + 'lzma/CPP/7zip/Common/OutBuffer.cpp', + 'lzma/CPP/7zip/Common/ProgressUtils.cpp', + 'lzma/CPP/7zip/Common/PropId.cpp', + 'lzma/CPP/7zip/Common/StreamBinder.cpp', + 'lzma/CPP/7zip/Common/StreamObjects.cpp', + 'lzma/CPP/7zip/Common/StreamUtils.cpp', + 'lzma/CPP/7zip/Common/VirtThread.cpp', + 'lzma/CPP/7zip/Compress/*.{h}', + 'lzma/CPP/7zip/Compress/Bcj2Coder.cpp', + 'lzma/CPP/7zip/Compress/Bcj2Register.cpp', + 'lzma/CPP/7zip/Compress/BcjCoder.cpp', + 'lzma/CPP/7zip/Compress/BcjRegister.cpp', + 'lzma/CPP/7zip/Compress/BranchMisc.cpp', + 'lzma/CPP/7zip/Compress/BranchRegister.cpp', + 'lzma/CPP/7zip/Compress/ByteSwap.cpp', + 'lzma/CPP/7zip/Compress/CodecExports.cpp', + 'lzma/CPP/7zip/Compress/CopyCoder.cpp', + 'lzma/CPP/7zip/Compress/CopyRegister.cpp', + 'lzma/CPP/7zip/Compress/Lzma2Decoder.cpp', + 'lzma/CPP/7zip/Compress/Lzma2Encoder.cpp', + 'lzma/CPP/7zip/Compress/Lzma2Register.cpp', + 'lzma/CPP/7zip/Compress/LzmaDecoder.cpp', + 'lzma/CPP/7zip/Compress/LzmaEncoder.cpp', + 'lzma/CPP/7zip/Compress/LzmaRegister.cpp', + 'lzma/CPP/7zip/Compress/PpmdDecoder.cpp', + 'lzma/CPP/7zip/Compress/PpmdEncoder.cpp', + 'lzma/CPP/7zip/Compress/PpmdRegister.cpp', + 'lzma/CPP/7zip/Crypto/*.{h}', + 'lzma/CPP/7zip/Crypto/7zAes.cpp', + 'lzma/CPP/7zip/Crypto/7zAesRegister.cpp', + 'lzma/CPP/7zip/Crypto/MyAes.cpp', + 'lzma/CPP/7zip/Crypto/MyAesReg.cpp', + 'lzma/CPP/7zip/Crypto/RandGen.cpp', + 'lzma/CPP/Common/*.{h}', + 'lzma/CPP/Common/C_FileIO.cpp', + 'lzma/CPP/Common/CrcReg.cpp', + 'lzma/CPP/Common/IntToString.cpp', + 'lzma/CPP/Common/MyString.cpp', + 'lzma/CPP/Common/MyWindows.cpp', + 'lzma/CPP/Common/Sha256Reg.cpp', + 'lzma/CPP/Common/StringConvert.cpp', + 'lzma/CPP/Common/StringToInt.cpp', + 'lzma/CPP/Common/Wildcard.cpp', + 'lzma/CPP/Common/XzCrc64Reg.cpp', + 'lzma/CPP/Windows/*.{h}', + 'lzma/CPP/Windows/PropVariant.cpp', + 'lzma/CPP/Windows/PropVariantConv.cpp' + + s.compiler_flags = '-DLZMASDKOBJC=1', '-DLZMASDKOBJC_OMIT_UNUSED_CODE=1' + s.libraries = 'stdc++' + # s.frameworks = 'UIKit' + s.dependency 'Inlineobjc' +end diff --git a/Provenance/LzmaSDKObjC/LzmaSDKObjC.podspec b/Provenance/LzmaSDKObjC/LzmaSDKObjC.podspec new file mode 100644 index 0000000000..d9b443e523 --- /dev/null +++ b/Provenance/LzmaSDKObjC/LzmaSDKObjC.podspec @@ -0,0 +1,157 @@ +# +# Be sure to run `pod lib lint LzmaSDKObjC.podspec' to ensure this is a +# valid spec before submitting. +# +# Any lines starting with a # are optional, but their use is encouraged +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = "LzmaSDKObjC" + s.version = "1.0.5" + s.summary = "Lzma SDK for Objective-C based on extended functionality of the C++ LZMA code" + s.description = <<-DESC +It's not yet another wrapper around C part of the LZMA SDK with all it's limitations. +Based on C++ LZMA SDK version 15.14 (1514 - latest for now) and patched for iOS & MacOS platforms. +The main advantages is: +- List, extract 7z files (Lzma & Lzma2 compression method). +- List, extract encrypted (password protected) 7z files (Lzma & Lzma2 compression method). +- List, extract encrypted (password protected) + encrypted header (no visible content, files list, without password) 7z files (Lzma & Lzma2 compression method). +- Manage memory allocations during listing/extracting. +- Tuned up for using less than 500Kb for listing/extracting, can be easly changed runtime (no hardcoded definitions). +- Manage IO read/write operations, aslo can be easly changed runtime (no hardcoded definitions). +- Track smoothed progress, which becomes possible with prev. +- Support reading archive files with size more than 4GB and extracting files with size more than 4GB eg. HugeFiles=on + DESC + + s.homepage = "https://github.com/OlehKulykov/LzmaSDKObjC" + s.license = 'MIT' + s.author = { "OlehKulykov" => "info@resident.name" } + s.source = { :git => "https://github.com/OlehKulykov/LzmaSDKObjC.git", :tag => s.version.to_s } + s.deprecated = true + s.deprecated_in_favor_of = 'LzmaSDK-ObjC' + +# Platforms + s.ios.deployment_target = "8.0" + s.osx.deployment_target = "10.7" + + s.requires_arc = true + + s.public_header_files = 'Pod/Classes/src/LzmaSDKObjCTypes.h', + 'Pod/Classes/src/LzmaSDKObjCReader.h', + 'Pod/Classes/src/LzmaSDKObjCItem.h', + 'Pod/Classes/src/LzmaSDKObjC.h' + + s.source_files = 'Pod/Classes/src/*.{h,cpp,mm}', + 'Pod/Classes/lzma/CPP/7zip/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Crypto/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Crypto/7zAes.cpp', + 'Pod/Classes/lzma/CPP/7zip/Crypto/7zAesRegister.cpp', + 'Pod/Classes/lzma/CPP/7zip/Crypto/MyAes.cpp', + 'Pod/Classes/lzma/CPP/7zip/Crypto/MyAesReg.cpp', + 'Pod/Classes/lzma/CPP/7zip/Crypto/RandGen.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zRegister.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zExtract.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zProperties.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zDecode.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zEncode.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zHeader.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zOut.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zIn.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/7zHandler.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/7z/StdAfx.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Archive/XzHandler.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/LzmaHandler.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/ArchiveExports.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/DllExports2.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/Common/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp', + 'Pod/Classes/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Compress/BcjCoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/BcjRegister.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/CopyCoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/CodecExports.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/LzmaDecoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/LzmaEncoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/LzmaRegister.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/Lzma2Decoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Compress/Lzma2Register.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/*.{h}', + 'Pod/Classes/lzma/CPP/7zip/Common/LimitedStreams.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/StreamObjects.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/InOutTempBuffer.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/StreamBinder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/VirtThread.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/OutBuffer.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/MethodProps.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/PropId.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/ProgressUtils.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/FilterCoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/CWrappers.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/StreamUtils.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/CreateCoder.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/FileStreams.cpp', + 'Pod/Classes/lzma/CPP/7zip/Common/LockedStream.cpp', + 'Pod/Classes/lzma/CPP/Windows/*.{h}', + 'Pod/Classes/lzma/CPP/Windows/PropVariantConv.cpp', + 'Pod/Classes/lzma/CPP/Windows/System.cpp', + 'Pod/Classes/lzma/CPP/Windows/PropVariant.cpp', + 'Pod/Classes/lzma/CPP/Windows/FileName.cpp', + 'Pod/Classes/lzma/CPP/Windows/FileFind.cpp', + 'Pod/Classes/lzma/CPP/Windows/FileDir.cpp', + 'Pod/Classes/lzma/CPP/Windows/DLL.cpp', + 'Pod/Classes/lzma/CPP/Common/*.{h}', + 'Pod/Classes/lzma/CPP/Common/Sha256Reg.cpp', + 'Pod/Classes/lzma/CPP/Common/XzCrc64Reg.cpp', + 'Pod/Classes/lzma/CPP/Common/CrcReg.cpp', + 'Pod/Classes/lzma/CPP/Common/Wildcard.cpp', + 'Pod/Classes/lzma/CPP/Common/StringToInt.cpp', + 'Pod/Classes/lzma/CPP/Common/C_FileIO.cpp', + 'Pod/Classes/lzma/CPP/Common/MyString.cpp', + 'Pod/Classes/lzma/CPP/Common/StringConvert.cpp', + 'Pod/Classes/lzma/CPP/Common/IntToString.cpp', + 'Pod/Classes/lzma/CPP/Common/MyWindows.cpp', + 'Pod/Classes/lzma/C/*.{h}', + 'Pod/Classes/lzma/C/AesOpt.c', + 'Pod/Classes/lzma/C/Aes.c', + 'Pod/Classes/lzma/C/XzCrc64Opt.c', + 'Pod/Classes/lzma/C/Sha256.c', + 'Pod/Classes/lzma/C/Delta.c', + 'Pod/Classes/lzma/C/7zCrcOpt.c', + 'Pod/Classes/lzma/C/CpuArch.c', + 'Pod/Classes/lzma/C/7zCrc.c', + 'Pod/Classes/lzma/C/XzCrc64.c', + 'Pod/Classes/lzma/C/Bra86.c', + 'Pod/Classes/lzma/C/BraIA64.c', + 'Pod/Classes/lzma/C/Bra.c', + 'Pod/Classes/lzma/C/XzEnc.c', + 'Pod/Classes/lzma/C/XzIn.c', + 'Pod/Classes/lzma/C/Xz.c', + 'Pod/Classes/lzma/C/XzDec.c', + 'Pod/Classes/lzma/C/7zStream.c', + 'Pod/Classes/lzma/C/Alloc.c', + 'Pod/Classes/lzma/C/MtCoder.c', + 'Pod/Classes/lzma/C/LzFind.c', + 'Pod/Classes/lzma/C/LzFindMt.c', + 'Pod/Classes/lzma/C/Lzma2Dec.c', + 'Pod/Classes/lzma/C/Lzma2Enc.c', + 'Pod/Classes/lzma/C/LzmaDec.c', + 'Pod/Classes/lzma/C/LzmaEnc.c', + 'Pod/Classes/lzma/C/Threads.c' + + s.compiler_flags = '-DLZMASDKOBJC=1', '-DLZMASDKOBJC_OMIT_UNUSED_CODE=1' + s.libraries = 'stdc++' + # s.frameworks = 'UIKit' + s.dependency 'Inlineobjc' +end diff --git a/Provenance/LzmaSDKObjC/NSArray+Inlineobjc.h b/Provenance/LzmaSDKObjC/NSArray+Inlineobjc.h new file mode 100644 index 0000000000..647814900e --- /dev/null +++ b/Provenance/LzmaSDKObjC/NSArray+Inlineobjc.h @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2015 - 2016 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import + +#ifndef __NSARRAY_INLINEOBJC_H__ +#define __NSARRAY_INLINEOBJC_H__ 1 + +#if defined(DEBUG) || defined(_DEBUG) +#ifndef DEBUG +#define DEBUG 1 +#endif +#endif + + +/** + @brief Return number of objects. + @param array An array for test. + @return Number of objects or 0 on nil array. + */ +NS_INLINE NSUInteger NSArrayCount(NSArray * array) +{ +#if defined(DEBUG) + if (array) + { + assert([array isKindOfClass:[NSArray class]]); + } +#endif + return (array) ? [array count] : 0; +} + + +/** + @brief Check is array has no objects or nil. + @param array An array for test. + @return YES if no objects or nil, othervice NO. + */ +NS_INLINE BOOL NSArrayIsEmpty(NSArray * array) +{ +#if defined(DEBUG) + if (array) + { + assert([array isKindOfClass:[NSArray class]]); + } +#endif + return (array) ? ([array count] == 0) : YES; +} + + +/** + @brief Check is array has objects and not nil. + @param array An array for test. + @return YES if not nil and have objects, othervice NO. + */ +NS_INLINE BOOL NSArrayIsNotEmpty(NSArray * array) +{ +#if defined(DEBUG) + if (array) + { + assert([array isKindOfClass:[NSArray class]]); + } +#endif + return (array) ? ([array count] > 0) : NO; +} + + +/** + @brief Get array object at index. + @param array The target array. + @param index Index of required object. + @return Object or nil if array empty or index dosn't exists. + */ +NS_INLINE id NSArrayObjectAtIndex(NSArray * array, const NSUInteger index) +{ +#if defined(DEBUG) + if (array) + { + assert([array isKindOfClass:[NSArray class]]); + } +#endif + const NSUInteger count = array ? [array count] : 0; + return (index < count) ? [array objectAtIndex:index] : nil; +} + + +/** + @brief Get index of object in array. + @param array The target array. + @param object The target object. + @return Index or 'NSNotFound' if array empty or object dosn't exists. + */ +NS_INLINE NSUInteger NSArrayIndexOfObject(NSArray * array, id object) +{ +#if defined(DEBUG) + if (array) + { + assert([array isKindOfClass:[NSArray class]]); + } +#endif + return (array && object) ? [array indexOfObject:object] : NSNotFound; +} + + +/** + @brief Get serialized binary data from array. + @param array The array for serialization. + @return NSData with binary content. + */ +NS_INLINE NSData * NSArraySerializeToBinaryData(NSArray * array) +{ + if (array) + { +#if defined(DEBUG) + assert([array isKindOfClass:[NSArray class]]); +#endif + if ([array count]) + { + NSDictionary * dictionary = [NSDictionary dictionaryWithObject:array forKey:@"NSArray_BinarySerialized_Array"]; + if (dictionary) + { + NSError * error = nil; + NSData * res = [NSPropertyListSerialization dataWithPropertyList:dictionary format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error]; + if (!error) return res; + } + } + } + return nil; +} + + +/** + @brief Get deserialized array from binary data. + @param binaryData The binary data for deserialization. + @return NSData with binary content. + */ +NS_INLINE NSArray * NSArrayDeserializeFromBinaryData(NSData * binaryData) +{ + if (binaryData) + { +#if defined(DEBUG) + assert([binaryData isKindOfClass:[NSData class]]); +#endif + NSError * error = nil; + NSPropertyListFormat format = (NSPropertyListFormat)0; + id res = [NSPropertyListSerialization propertyListWithData:binaryData options:0 format:&format error:&error]; + if (!error && res && [res isKindOfClass:[NSDictionary class]]) + { + return [(NSDictionary *)res objectForKey:@"NSArray_BinarySerialized_Array"]; + } + } + return nil; +} + + +/** + @brief Get array next index from started index. + @param array The target array. + @param index Started index. + @return Next array index from started or NSNotFound on error. + */ +NS_INLINE NSUInteger NSArrayNextIndexFrom(NSArray * array, const NSUInteger index) +{ + if (array) + { +#if defined(DEBUG) + assert([array isKindOfClass:[NSArray class]]); +#endif + const NSUInteger nextIndex = index + 1; + if (nextIndex < [array count]) + { + return nextIndex; + } + } + return NSNotFound; +} + + +/** + @brief Get array previous index from started index. + @param array The target array. + @param index Started index. + @return Previous array index from started or NSNotFound on error. + */ +NS_INLINE NSUInteger NSArrayPreviousIndexFrom(NSArray * array, const NSUInteger index) +{ + if (array) + { +#if defined(DEBUG) + assert([array isKindOfClass:[NSArray class]]); +#endif + if (index > 0 && index < NSNotFound) + { + const NSUInteger prevIndex = index - 1; + if (prevIndex < [array count]) + { + return prevIndex; + } + } + } + return NSNotFound; +} + +#endif + diff --git a/Provenance/LzmaSDKObjC/NSString+Inlineobjc.h b/Provenance/LzmaSDKObjC/NSString+Inlineobjc.h new file mode 100644 index 0000000000..344627d973 --- /dev/null +++ b/Provenance/LzmaSDKObjC/NSString+Inlineobjc.h @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2015 - 2016 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import + + +#ifndef __NSSTRING_INLINEOBJC_H__ +#define __NSSTRING_INLINEOBJC_H__ 1 + +#if defined(DEBUG) || defined(_DEBUG) +#ifndef DEBUG +#define DEBUG 1 +#endif +#endif + + +/** + @brief Check string is empty. + @param stringToTest The test string object. + @return YES if nil or length is 0, othervice NO. + */ +NS_INLINE BOOL NSStringIsEmpty(NSString * stringToTest) +{ +#if defined(DEBUG) + if (stringToTest) + { + assert([stringToTest isKindOfClass:[NSString class]]); + } +#endif + return (stringToTest) ? ([stringToTest length] == 0) : YES; +} + + +/** + @brief Check string is not empty. + @param stringToTest The test string object. + @return YES string has character and not nil, othervice NO. + */ +NS_INLINE BOOL NSStringIsNotEmpty(NSString * stringToTest) +{ +#if defined(DEBUG) + if (stringToTest) + { + assert([stringToTest isKindOfClass:[NSString class]]); + } +#endif + return (stringToTest) ? ([stringToTest length] > 0) : NO; +} + + +/** + @brief Check file path exists. + @param pathForTest The test path string object. + @return YES path exists and not directory, othervice NO. + */ +NS_INLINE BOOL NSStringIsFilePathExists(NSString * pathForTest) +{ + if (NSStringIsNotEmpty(pathForTest)) + { + BOOL isDir = YES; + if ([[NSFileManager defaultManager] fileExistsAtPath:pathForTest isDirectory:&isDir]) + { + return ( !isDir ); + } + } + return NO; +} + + +/** + @brief Check directory path exists. + @param pathForTest The test path string object. + @return YES path exists and is directory, othervice NO. + */ +NS_INLINE BOOL NSStringIsDirPathExists(NSString * pathForTest) +{ + if (NSStringIsNotEmpty(pathForTest)) + { + BOOL isDir = NO; + if ([[NSFileManager defaultManager] fileExistsAtPath:pathForTest isDirectory:&isDir]) + { + return isDir; + } + } + return NO; +} + + +/** + @brief Check string containes not empty substring using case insensitive search. + @param subString The string object for searching. + @return YES substring conteines, othervice NO. + */ +NS_INLINE BOOL NSStringIsContainesSubstring(NSString * sourceString, NSString * subString) +{ + if (sourceString && subString) + { +#if defined(DEBUG) + assert([sourceString isKindOfClass:[NSString class]]); + assert([subString isKindOfClass:[NSString class]]); +#endif + const NSRange r = [sourceString rangeOfString:subString options:NSCaseInsensitiveSearch]; + return (r.location != NSNotFound && r.length != 0); + } + return NO; +} + + +/** + @brief Check strings are not empty and equal. + @param string1 The test string object. + @param string2 The test string object. + @return YES strings are not nil and equal. + */ +NS_INLINE BOOL NSStringsAreEqual(NSString * string1, NSString * string2) +{ +#if defined(DEBUG) + if (string1 && string2) + { + assert([string1 isKindOfClass:[NSString class]]); + assert([string2 isKindOfClass:[NSString class]]); + } +#endif + return (string1 && string2) ? [string1 isEqualToString:string2] : NO; +} + + +#include + + +/** + @brief Check string has all uppercase charactes. + @param string The test string object. + @return YES string not nil and all charactes is uppercase. + */ +NS_INLINE BOOL NSStringIsUppercase(NSString * string) +{ + if (string) + { +#if defined(DEBUG) + assert([string isKindOfClass:[NSString class]]); +#endif + // terrible check, but works with non ascii characters + if ([string length]) return [string isEqualToString:[string uppercaseStringWithLocale:[NSLocale currentLocale]]]; + } + return NO; + +// assert(sizeof(wchar_t) == 4); +// const wchar_t * wstr = (const wchar_t *)[string cStringUsingEncoding:NSUTF32LittleEndianStringEncoding]; +// if (wstr) +// { +// while (*wstr) if (iswlower(*wstr)) return NO; +// return YES; +// } +} + + +/** + @brief Check string has all lowercase charactes. + @param string The test string object. + @return YES string not nil and all charactes is lowercase. + */ +NS_INLINE BOOL NSStringIsLowercase(NSString * string) +{ + if (string) + { +#if defined(DEBUG) + assert([string isKindOfClass:[NSString class]]); +#endif + // terrible check, but works with non ascii characters + if ([string length]) return [string isEqualToString:[string lowercaseStringWithLocale:[NSLocale currentLocale]]]; + } + return NO; +} + + +/** + @brief Returns current user documents path. + @return String with documents path. + */ +NS_INLINE NSString * NSStringGetUserDocumentPath(void) +{ + NSArray * pathsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return (pathsArray && [pathsArray count] > 0) ? [pathsArray firstObject] : nil; +} + +/** + @brief Check path existed, readable and writable, and if not create new one. + @return YES - path exists and readable/writable or created, otherwice NO. + */ +NS_INLINE BOOL NSStringCreateFullPathIfNeeded(NSString * path) +{ + if (path) + { +#if defined(DEBUG) + assert([path isKindOfClass:[NSString class]]); +#endif + NSFileManager * manager = [NSFileManager defaultManager]; + BOOL isDir = NO; + if ([manager fileExistsAtPath:path isDirectory:&isDir]) + { + if (isDir && [manager isReadableFileAtPath:path] && [manager isWritableFileAtPath:path]) return YES; + [manager removeItemAtPath:path error:nil]; + } + return [manager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil]; + } + return NO; +} + + +/** + @brief Existed path based on user document path with read/write permissions. + @detailed Class directory will be created. + @return String with existed path based on user document path with read/write permissions or nil on error. + */ +NS_INLINE NSString * NSStringGetStorageDirFullPathForClass(Class targetClass) +{ + NSString * path = targetClass ? NSStringGetUserDocumentPath() : nil; + if (path) + { + path = [path stringByAppendingPathComponent:NSStringFromClass(targetClass)]; + return NSStringCreateFullPathIfNeeded(path) ? path : nil; + } + return nil; +} + +#endif + diff --git a/Provenance/LzmaSDKObjC/README.md b/Provenance/LzmaSDKObjC/README.md new file mode 100644 index 0000000000..def064ae21 --- /dev/null +++ b/Provenance/LzmaSDKObjC/README.md @@ -0,0 +1,384 @@ +[![Platform](https://img.shields.io/cocoapods/p/LzmaSDK-ObjC.svg?style=flat)](http://cocoapods.org/pods/LzmaSDK-ObjC) +[![Version](https://img.shields.io/cocoapods/v/LzmaSDK-ObjC.svg?style=flat)](http://cocoapods.org/pods/LzmaSDK-ObjC) +[![License](https://img.shields.io/cocoapods/l/LzmaSDK-ObjC.svg?style=flat)](http://cocoapods.org/pods/LzmaSDK-ObjC) +[![Build Status](https://travis-ci.org/OlehKulykov/LzmaSDKObjC.svg?branch=master)](https://travis-ci.org/OlehKulykov/LzmaSDKObjC) +[![OnlineDocumentation Status](https://img.shields.io/badge/online%20documentation-generated-brightgreen.svg)](http://cocoadocs.org/docsets/LzmaSDK-ObjC) + + +It's not yet another wrapper around C part of the [LZMA SDK] with all it's limitations. +Based on C++ [LZMA SDK] version 16.04 (1604 - latest for now) and patched for iOS & Mac OS platforms. +Can be used with Swift and Objective-C. + + +### Description +---------------- +It's not yet another wrapper around C part of the [LZMA SDK] with all it's limitations. +Based on C++ [LZMA SDK] version 16.04 (1604 - latest for now) and patched for iOS & Mac OS platforms. + +The main advantages is: +- List, extract **7z** files (**Lzma** & **Lzma2** *compression method*). +- List, extract **encrypted** (*password protected*) **7z** files (**Lzma** & **Lzma2** *compression method*). +- List, extract **encrypted** (*password protected*) + **encrypted header** (*no visible content, files list, without password*) **7z** files (**Lzma** & **Lzma2** *compression method*). +- Create **7z** archives (**Lzma** & **Lzma2** *compression method*). +- Create **encrypted** (*password protected*) **7z** archives (**Lzma** & **Lzma2** *compression method*). +- Create **encrypted** (*password protected*) + **encrypted header** (*no visible content, files list, without password*) **7z** archives (**Lzma** & **Lzma2** *compression method*). +- Manage memory allocations during listing/extracting. See below section: **Tune up speed, performance and disk IO operations**. +- Tuned up for using less than 500Kb for listing/extracting, can be easly changed runtime (*no hardcoded definitions*). See below section: **Tune up speed, performance and disk IO operations**. +- Manage IO read/write operations, aslo can be easly changed runtime (*no hardcoded definitions*). See below section: **Tune up speed, performance and disk IO operations**. +- Track smoothed progress, which becomes possible with prev. +- Support reading and extracting archive files with size more than 4GB. +- UTF8 support. +- Extra compression/decompression functionality of single **NSData** object with **Lzma2**. + + +### Installation with [CocoaPods] +#### Podfile +```ruby +use_frameworks! +platform :ios, '8.0' + +target '' do + pod 'LzmaSDK-ObjC', :inhibit_warnings => true +end +``` + +> Use frameworks (dynamic linking) to include Lzma codecs code in your application. + + +### Example Swift and Objective-C +----------- +#### List and extract + +##### Create and setup reader with archive path and/or archive type, optionaly delegate and optionaly password getter block, in case of encrypted archive +##### Swift +```swift +import LzmaSDK_ObjC +... + +// select full path to archive file with 7z extension +let archivePath = "path to archive" + +// 1.1 Create reader object. +let reader = LzmaSDKObjCReader(fileURL: NSURL(fileURLWithPath: archivePath) +// 1.2 Or create with predefined archive type if path doesn't containes suitable extension +let reader = LzmaSDKObjCReader(fileURL: NSURL(fileURLWithPath: archivePath), andType: LzmaSDKObjCFileType7z) + +// Optionaly: assign delegate for tracking extract progress. +reader.delegate = self + +// If achive encrypted - define password getter handler. +// NOTES: +// - Encrypted file needs password for extract process. +// - Encrypted file with encrypted header needs password for list(iterate) and extract archive items. +reader.passwordGetter = { + return "password to my achive" +} +... + +// Delegate extension +extension ReaderDelegateObject: LzmaSDKObjCReaderDelegate { + func onLzmaSDKObjCReader(reader: LzmaSDKObjCReader, extractProgress progress: Float) { + print("Reader progress: \(progress) %") + } +} +``` +##### Objective-C +```objc +// select full path to archive file with 7z extension +NSString * archivePath = ; + +// 1.1 Create and hold strongly reader object. +self.reader = [[LzmaSDKObjCReader alloc] initWithFileURL:[NSURL fileURLWithPath:archivePath]]; +// 1.2 Or create with predefined archive type if path doesn't containes suitable extension +self.reader = [[LzmaSDKObjCReader alloc] initWithFileURL:[NSURL fileURLWithPath:archivePath] + andType:LzmaSDKObjCFileType7z]; + +// Optionaly: assign weak delegate for tracking extract progress. +_reader.delegate = self; + +// If achive encrypted - define password getter handler. +// NOTES: +// - Encrypted file needs password for extract process. +// - Encrypted file with encrypted header needs password for list(iterate) and extract archive items. +_reader.passwordGetter = ^NSString*(void){ + return @"password to my achive"; +}; +``` + + +##### Open archive, e.g. find out type of achive, locate decoder and read archive header +##### Swift +```swift +// Try open archive. +do { + try reader.open() +} +catch let error as NSError { + print("Can't open archive: \(error.localizedDescription) ") +} +``` +##### Objective-C +```objc +// Open archive, with or without error. Error can be nil. +NSError * error = nil; +if (![_reader open:&error]) { + NSLog(@"Open error: %@", error); +} +NSLog(@"Open error: %@", _reader.lastError); +``` + + +##### Iterate archive items, select and store required items for future processing +##### Swift +```swift +var items = [LzmaSDKObjCItem]() // Array with selected items. +// Iterate all archive items, track what items do you need & hold them in array. +reader.iterateWithHandler({(item: LzmaSDKObjCItem, error: NSError?) -> Bool in + items.append(item) // if needs this item - store to array. + return true // true - continue iterate, false - stop iteration +}) +``` +##### Objective-C +```objc +NSMutableArray * items = [NSMutableArray array]; // Array with selected items. +// Iterate all archive items, track what items do you need & hold them in array. +[_reader iterateWithHandler:^BOOL(LzmaSDKObjCItem * item, NSError * error){ + NSLog(@"\n%@", item); + if (item) [items addObject:item]; // if needs this item - store to array. + return YES; // YES - continue iterate, NO - stop iteration +}]; +NSLog(@"Iteration error: %@", _reader.lastError); +``` + + +##### Extract or test archive items +##### Swift +```swift +// Extract selected items from prev. step. +// true - create subfolders structure for the items. +// false - place item file to the root of path(in this case items with the same names will be overwrited automaticaly). +if reader.extract(items, toPath: "/Volumes/Data/1/", withFullPaths: true) { + print("Extract failed: \(reader.lastError?.localizedDescription)") +} + +// Test selected items from prev. step. +if reader.test(items) { + print("Test failed: \(reader.lastError?.localizedDescription)") +} +```` +##### Objective-C +```objc +// Extract selected items from prev. step. +// YES - create subfolders structure for the items. +// NO - place item file to the root of path(in this case items with the same names will be overwrited automaticaly). +[_reader extract:items + toPath:@"/extract/path" + withFullPaths:YES]; +NSLog(@"Extract error: %@", _reader.lastError); + +// Test selected items from prev. step. +[_reader test:items]; +NSLog(@"test error: %@", _reader.lastError); +``` + +##### Create 7z archive +##### Swift +```swift +// Create writer +let writer = LzmaSDKObjCWriter(fileURL: NSURL(fileURLWithPath: "/Path/MyArchive.7z")) + +// Add file data's or paths +writer.addData(NSData(...), forPath: "MyArchiveFileName.txt") // Add file data +writer.addPath("/Path/somefile.txt", forPath: "archiveDir/somefile.txt") // Add file at path +writer.addPath("/Path/SomeDirectory", forPath: "SomeDirectory") // Recursively add directory with all contents + +// Setup writer +writer.delegate = self // Track progress +writer.passwordGetter = { // Password getter + return "1234" +} + +// Optional settings +writer.method = LzmaSDKObjCMethodLZMA2 // or LzmaSDKObjCMethodLZMA +writer.solid = true +writer.compressionLevel = 9 +writer.encodeContent = true +writer.encodeHeader = true +writer.compressHeader = true +writer.compressHeaderFull = true +writer.writeModificationTime = false +writer.writeCreationTime = false +writer.writeAccessTime = false + +// Open archive file +do { + try writer.open() +} catch let error as NSError { + print(error.localizedDescription) +} + +// Write archive within current thread +writer.write() + +// or +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { + writer.write() +} +``` +##### Objective-C +```objc +// Create writer +LzmaSDKObjCWriter * writer = [[LzmaSDKObjCWriter alloc] initWithFileURL:[NSURL fileURLWithPath:@"/Path/MyArchive.7z"]]; + +// Add file data's or paths +[writer addData:[NSData ...] forPath:@"MyArchiveFileName.txt"]; // Add file data +[writer addPath:@"/Path/somefile.txt" forPath:@"archiveDir/somefile.txt"]; // Add file at path +[writer addPath:@"/Path/SomeDirectory" forPath:@"SomeDirectory"]; // Recursively add directory with all contents + +// Setup writer +writer.delegate = self; // Track progress +writer.passwordGetter = ^NSString*(void) { // Password getter + return @"1234"; +}; + +// Optional settings +writer.method = LzmaSDKObjCMethodLZMA2; // or LzmaSDKObjCMethodLZMA +writer.solid = YES; +writer.compressionLevel = 9; +writer.encodeContent = YES; +writer.encodeHeader = YES; +writer.compressHeader = YES; +writer.compressHeaderFull = YES; +writer.writeModificationTime = NO; +writer.writeCreationTime = NO; +writer.writeAccessTime = NO; + +// Open archive file +NSError * error = nil; +[writer open:&error]; + +// Write archive within current thread +[writer write]; + +// or +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + [writer write]; +}); +``` + + +##### Compress/decompress single data buffer +##### Swift +```swift +// Compress data with compression maximum compression ratio. +let compressedData = LzmaSDKObjCBufferCompressLZMA2(sourceData, 1) +// Decompress previvously compressed data. +let decompressedData = LzmaSDKObjCBufferDecompressLZMA2(compressedData) +``` +##### Objective-C +```objc +// Compress data with compression maximum compression ratio. +NSData * compressedData = LzmaSDKObjCBufferCompressLZMA2(sourceData, 1); +// Decompress previvously compressed data. +NSData * decompressedData = LzmaSDKObjCBufferDecompressLZMA2(compressedData); +``` + + +### Tune up speed, performance and disk IO operations +----------------------------------------------------- +Original C++ part of the [LZMA SDK] was patched to have a possibility to tune up default(*hardcoded*) settings. +For list and extract functionality was defined next global variables: ```kLzmaSDKObjCStreamReadSize```, ```kLzmaSDKObjCStreamWriteSize```, ```kLzmaSDKObjCDecoderReadSize``` and ```kLzmaSDKObjCDecoderWriteSize```. +This variables holds size values in bytes, so, for the single reader object summary of this 4's values will be allocated. + +Keep in mind: operations with **memory much more faster** than **disk IO operations**, so read below situations: +```c +switch () { + case : + //TODO: Increase stream and decoder size of buffers + Result: + 1. more allocated memory + 2. less IO read/write operations and less delays + 3. less smoothed progress + 4. more CPU load (do a job, not distracted to read/write data) + break; + + case : + //TODO: Decrease stream and decoder size of buffers + Result: + 1. less allocated memory + 2. more IO read/write operations and more delays + 3. more smoothed progress + 4. less CPU load (wait for read/write data) + break; + + default: + //TODO: use current settings + break; + }; +``` +> NOTE: Modify global variables **before** creating & using reader object. + +> NOTE: This allocation sizes doesn't affet to memory allocated for the archive dictionary. + + +### Features list (TODO/DONE) +----------------------------- +- [x] **Lzma/*.7z** + - [x] **List** + - [x] Regular archive. ```tests/files/lzma.7z``` + - [x] Encrypted archive with AES256. ```tests/files/lzma_aes256.7z``` + - [x] Encrypted archive + encrypted header(*no visible content, files list, without password*) with AES256. ```tests/files/lzma_aes256_encfn.7z``` + - [x] **Extract** + - [x] Regular archive. ```tests/files/lzma.7z``` + - [x] Encrypted archive with AES256. ```tests/files/lzma_aes256.7z``` + - [x] Encrypted archive + encrypted header(*no visible content, files list, without password*) with AES256. ```tests/files/lzma_aes256_encfn.7z``` + - [x] **Create** + - [x] Regular archive. + - [x] Encrypted archive with AES256. + - [x] Encrypted archive + encrypted header(*no visible content, files list, without password*) with AES256. +- [x] **Lzma2/*.7z** + - [x] **List** + - [x] Regular archive. ```tests/files/lzma2.7z``` + - [x] Encrypted archive with AES256. ```tests/files/lzma2_aes256.7z``` + - [x] Encrypted archive + encrypted header(*no visible content, files list, without password*) with AES256. ```tests/files/lzma2_aes256_encfn.7z``` + - [x] **Extract** + - [x] Regular archive. ```tests/files/lzma2.7z``` + - [x] Encrypted archive with AES256. ```tests/files/lzma2_aes256.7z``` + - [x] Encrypted archive + encrypted header(*no visible content, files list, without password*) with AES256. ```tests/files/lzma2_aes256_encfn.7z``` + - [x] **Create** + - [x] Regular archive. + - [x] Encrypted archive with AES256. + - [x] Encrypted archive + encrypted header(*no visible content, files list, without password*) with AES256. +- [ ] **Omit unused code**, reduce buildable, original code size. + + +### License +----------- +By using this all you are accepting original [LZMA SDK] and MIT license (*see below*): + +The MIT License (MIT) + +Copyright (c) 2015 - 2017 Kulykov Oleh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +[LZMA SDK]:http://www.7-zip.org/sdk.html +[CocoaPods]:http://cocoapods.org/pods/LzmaSDK-ObjC + diff --git a/Provenance/LzmaSDKObjC/lzma/C/7z.h b/Provenance/LzmaSDKObjC/lzma/C/7z.h new file mode 100644 index 0000000000..216f381cad --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7z.h @@ -0,0 +1,202 @@ +/* 7z.h -- 7z interface +2015-11-18 : Igor Pavlov : Public domain */ + +#ifndef __7Z_H +#define __7Z_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define k7zStartHeaderSize 0x20 +#define k7zSignatureSize 6 + +extern const Byte k7zSignature[k7zSignatureSize]; + +typedef struct +{ + const Byte *Data; + size_t Size; +} CSzData; + +/* CSzCoderInfo & CSzFolder support only default methods */ + +typedef struct +{ + size_t PropsOffset; + UInt32 MethodID; + Byte NumStreams; + Byte PropsSize; +} CSzCoderInfo; + +typedef struct +{ + UInt32 InIndex; + UInt32 OutIndex; +} CSzBond; + +#define SZ_NUM_CODERS_IN_FOLDER_MAX 4 +#define SZ_NUM_BONDS_IN_FOLDER_MAX 3 +#define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4 + +typedef struct +{ + UInt32 NumCoders; + UInt32 NumBonds; + UInt32 NumPackStreams; + UInt32 UnpackStream; + UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX]; + CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX]; + CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX]; +} CSzFolder; + + +SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd); + +typedef struct +{ + UInt32 Low; + UInt32 High; +} CNtfsFileTime; + +typedef struct +{ + Byte *Defs; /* MSB 0 bit numbering */ + UInt32 *Vals; +} CSzBitUi32s; + +typedef struct +{ + Byte *Defs; /* MSB 0 bit numbering */ + // UInt64 *Vals; + CNtfsFileTime *Vals; +} CSzBitUi64s; + +#define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) + +#define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) + +typedef struct +{ + UInt32 NumPackStreams; + UInt32 NumFolders; + + UInt64 *PackPositions; // NumPackStreams + 1 + CSzBitUi32s FolderCRCs; // NumFolders + + size_t *FoCodersOffsets; // NumFolders + 1 + UInt32 *FoStartPackStreamIndex; // NumFolders + 1 + UInt32 *FoToCoderUnpackSizes; // NumFolders + 1 + Byte *FoToMainUnpackSizeIndex; // NumFolders + UInt64 *CoderUnpackSizes; // for all coders in all folders + + Byte *CodersData; +} CSzAr; + +UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); + +SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, + ILookInStream *stream, UInt64 startPos, + Byte *outBuffer, size_t outSize, + ISzAlloc *allocMain); + +typedef struct +{ + CSzAr db; + + UInt64 startPosAfterHeader; + UInt64 dataPos; + + UInt32 NumFiles; + + UInt64 *UnpackPositions; // NumFiles + 1 + // Byte *IsEmptyFiles; + Byte *IsDirs; + CSzBitUi32s CRCs; + + CSzBitUi32s Attribs; + // CSzBitUi32s Parents; + CSzBitUi64s MTime; + CSzBitUi64s CTime; + + UInt32 *FolderToFile; // NumFolders + 1 + UInt32 *FileToFolder; // NumFiles + + size_t *FileNameOffsets; /* in 2-byte steps */ + Byte *FileNames; /* UTF-16-LE */ +} CSzArEx; + +#define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i)) + +#define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i]) + +void SzArEx_Init(CSzArEx *p); +void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc); +UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); +int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); + +/* +if dest == NULL, the return value specifies the required size of the buffer, + in 16-bit characters, including the null-terminating character. +if dest != NULL, the return value specifies the number of 16-bit characters that + are written to the dest, including the null-terminating character. */ + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); + +/* +size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex); +UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest); +*/ + + + +/* + SzArEx_Extract extracts file from archive + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + Free *outBuffer and set *outBuffer to 0, if you want to flush cache. +*/ + +SRes SzArEx_Extract( + const CSzArEx *db, + ILookInStream *inStream, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + + +/* +SzArEx_Open Errors: +SZ_ERROR_NO_ARCHIVE +SZ_ERROR_ARCHIVE +SZ_ERROR_UNSUPPORTED +SZ_ERROR_MEM +SZ_ERROR_CRC +SZ_ERROR_INPUT_EOF +SZ_ERROR_FAIL +*/ + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, + ISzAlloc *allocMain, ISzAlloc *allocTemp); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zAlloc.c b/Provenance/LzmaSDKObjC/lzma/C/7zAlloc.c new file mode 100644 index 0000000000..360da0516a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zAlloc.c @@ -0,0 +1,78 @@ +/* 7zAlloc.c -- Allocation functions +2015-11-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zAlloc.h" + +/* #define _SZ_ALLOC_DEBUG */ +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ + +#ifdef _SZ_ALLOC_DEBUG + +#ifdef _WIN32 +#include +#endif + +#include +int g_allocCount = 0; +int g_allocCountTemp = 0; + +#endif + +void *SzAlloc(void *p, size_t size) +{ + UNUSED_VAR(p); + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc %10u bytes; count = %10d", (unsigned)size, g_allocCount); + g_allocCount++; + #endif + return malloc(size); +} + +void SzFree(void *p, void *address) +{ + UNUSED_VAR(p); + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCount--; + fprintf(stderr, "\nFree; count = %10d", g_allocCount); + } + #endif + free(address); +} + +void *SzAllocTemp(void *p, size_t size) +{ + UNUSED_VAR(p); + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_temp %10u bytes; count = %10d", (unsigned)size, g_allocCountTemp); + g_allocCountTemp++; + #ifdef _WIN32 + return HeapAlloc(GetProcessHeap(), 0, size); + #endif + #endif + return malloc(size); +} + +void SzFreeTemp(void *p, void *address) +{ + UNUSED_VAR(p); + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCountTemp--; + fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); + } + #ifdef _WIN32 + HeapFree(GetProcessHeap(), 0, address); + return; + #endif + #endif + free(address); +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zAlloc.h b/Provenance/LzmaSDKObjC/lzma/C/7zAlloc.h new file mode 100644 index 0000000000..4d7502ffb1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zAlloc.h @@ -0,0 +1,23 @@ +/* 7zAlloc.h -- Allocation functions +2013-03-25 : Igor Pavlov : Public domain */ + +#ifndef __7Z_ALLOC_H +#define __7Z_ALLOC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void *SzAlloc(void *p, size_t size); +void SzFree(void *p, void *address); + +void *SzAllocTemp(void *p, size_t size); +void SzFreeTemp(void *p, void *address); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zArcIn.c b/Provenance/LzmaSDKObjC/lzma/C/7zArcIn.c new file mode 100644 index 0000000000..c324c37bad --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zArcIn.c @@ -0,0 +1,1771 @@ +/* 7zArcIn.c -- 7z Input functions +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7z.h" +#include "7zBuf.h" +#include "7zCrc.h" +#include "CpuArch.h" + +#define MY_ALLOC(T, p, size, alloc) { \ + if ((p = (T *)IAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } + +#define MY_ALLOC_ZE(T, p, size, alloc) { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) } + +#define MY_ALLOC_AND_CPY(to, size, from, alloc) \ + { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); } + +#define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \ + { if ((size) == 0) p = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } } + +#define k7zMajorVersion 0 + +enum EIdEnum +{ + k7zIdEnd, + k7zIdHeader, + k7zIdArchiveProperties, + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + k7zIdPackInfo, + k7zIdUnpackInfo, + k7zIdSubStreamsInfo, + k7zIdSize, + k7zIdCRC, + k7zIdFolder, + k7zIdCodersUnpackSize, + k7zIdNumUnpackStream, + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + k7zIdName, + k7zIdCTime, + k7zIdATime, + k7zIdMTime, + k7zIdWinAttrib, + k7zIdComment, + k7zIdEncodedHeader, + k7zIdStartPos, + k7zIdDummy + // k7zNtSecure, + // k7zParent, + // k7zIsReal +}; + +const Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; + +#define SzBitUi32s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } + +static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAlloc *alloc) +{ + if (num == 0) + { + p->Defs = NULL; + p->Vals = NULL; + } + else + { + MY_ALLOC(Byte, p->Defs, (num + 7) >> 3, alloc); + MY_ALLOC(UInt32, p->Vals, num, alloc); + } + return SZ_OK; +} + +void SzBitUi32s_Free(CSzBitUi32s *p, ISzAlloc *alloc) +{ + IAlloc_Free(alloc, p->Defs); p->Defs = NULL; + IAlloc_Free(alloc, p->Vals); p->Vals = NULL; +} + +#define SzBitUi64s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } + +void SzBitUi64s_Free(CSzBitUi64s *p, ISzAlloc *alloc) +{ + IAlloc_Free(alloc, p->Defs); p->Defs = NULL; + IAlloc_Free(alloc, p->Vals); p->Vals = NULL; +} + + +static void SzAr_Init(CSzAr *p) +{ + p->NumPackStreams = 0; + p->NumFolders = 0; + + p->PackPositions = NULL; + SzBitUi32s_Init(&p->FolderCRCs); + + p->FoCodersOffsets = NULL; + p->FoStartPackStreamIndex = NULL; + p->FoToCoderUnpackSizes = NULL; + p->FoToMainUnpackSizeIndex = NULL; + p->CoderUnpackSizes = NULL; + + p->CodersData = NULL; +} + +static void SzAr_Free(CSzAr *p, ISzAlloc *alloc) +{ + IAlloc_Free(alloc, p->PackPositions); + SzBitUi32s_Free(&p->FolderCRCs, alloc); + + IAlloc_Free(alloc, p->FoCodersOffsets); + IAlloc_Free(alloc, p->FoStartPackStreamIndex); + IAlloc_Free(alloc, p->FoToCoderUnpackSizes); + IAlloc_Free(alloc, p->FoToMainUnpackSizeIndex); + IAlloc_Free(alloc, p->CoderUnpackSizes); + + IAlloc_Free(alloc, p->CodersData); + + SzAr_Init(p); +} + + +void SzArEx_Init(CSzArEx *p) +{ + SzAr_Init(&p->db); + + p->NumFiles = 0; + p->dataPos = 0; + + p->UnpackPositions = NULL; + p->IsDirs = NULL; + + p->FolderToFile = NULL; + p->FileToFolder = NULL; + + p->FileNameOffsets = NULL; + p->FileNames = NULL; + + SzBitUi32s_Init(&p->CRCs); + SzBitUi32s_Init(&p->Attribs); + // SzBitUi32s_Init(&p->Parents); + SzBitUi64s_Init(&p->MTime); + SzBitUi64s_Init(&p->CTime); +} + +void SzArEx_Free(CSzArEx *p, ISzAlloc *alloc) +{ + IAlloc_Free(alloc, p->UnpackPositions); + IAlloc_Free(alloc, p->IsDirs); + + IAlloc_Free(alloc, p->FolderToFile); + IAlloc_Free(alloc, p->FileToFolder); + + IAlloc_Free(alloc, p->FileNameOffsets); + IAlloc_Free(alloc, p->FileNames); + + SzBitUi32s_Free(&p->CRCs, alloc); + SzBitUi32s_Free(&p->Attribs, alloc); + // SzBitUi32s_Free(&p->Parents, alloc); + SzBitUi64s_Free(&p->MTime, alloc); + SzBitUi64s_Free(&p->CTime, alloc); + + SzAr_Free(&p->db, alloc); + SzArEx_Init(p); +} + + +static int TestSignatureCandidate(const Byte *testBytes) +{ + unsigned i; + for (i = 0; i < k7zSignatureSize; i++) + if (testBytes[i] != k7zSignature[i]) + return 0; + return 1; +} + +#define SzData_Clear(p) { (p)->Data = NULL; (p)->Size = 0; } + +#define SZ_READ_BYTE_SD(_sd_, dest) if ((_sd_)->Size == 0) return SZ_ERROR_ARCHIVE; (_sd_)->Size--; dest = *(_sd_)->Data++; +#define SZ_READ_BYTE(dest) SZ_READ_BYTE_SD(sd, dest) +#define SZ_READ_BYTE_2(dest) if (sd.Size == 0) return SZ_ERROR_ARCHIVE; sd.Size--; dest = *sd.Data++; + +#define SKIP_DATA(sd, size) { sd->Size -= (size_t)(size); sd->Data += (size_t)(size); } +#define SKIP_DATA2(sd, size) { sd.Size -= (size_t)(size); sd.Data += (size_t)(size); } + +#define SZ_READ_32(dest) if (sd.Size < 4) return SZ_ERROR_ARCHIVE; \ + dest = GetUi32(sd.Data); SKIP_DATA2(sd, 4); + +static MY_NO_INLINE SRes ReadNumber(CSzData *sd, UInt64 *value) +{ + Byte firstByte, mask; + unsigned i; + UInt32 v; + + SZ_READ_BYTE(firstByte); + if ((firstByte & 0x80) == 0) + { + *value = firstByte; + return SZ_OK; + } + SZ_READ_BYTE(v); + if ((firstByte & 0x40) == 0) + { + *value = (((UInt32)firstByte & 0x3F) << 8) | v; + return SZ_OK; + } + SZ_READ_BYTE(mask); + *value = v | ((UInt32)mask << 8); + mask = 0x20; + for (i = 2; i < 8; i++) + { + Byte b; + if ((firstByte & mask) == 0) + { + UInt64 highPart = (unsigned)firstByte & (unsigned)(mask - 1); + *value |= (highPart << (8 * i)); + return SZ_OK; + } + SZ_READ_BYTE(b); + *value |= ((UInt64)b << (8 * i)); + mask >>= 1; + } + return SZ_OK; +} + + +static MY_NO_INLINE SRes SzReadNumber32(CSzData *sd, UInt32 *value) +{ + Byte firstByte; + UInt64 value64; + if (sd->Size == 0) + return SZ_ERROR_ARCHIVE; + firstByte = *sd->Data; + if ((firstByte & 0x80) == 0) + { + *value = firstByte; + sd->Data++; + sd->Size--; + return SZ_OK; + } + RINOK(ReadNumber(sd, &value64)); + if (value64 >= (UInt32)0x80000000 - 1) + return SZ_ERROR_UNSUPPORTED; + if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 4))) + return SZ_ERROR_UNSUPPORTED; + *value = (UInt32)value64; + return SZ_OK; +} + +#define ReadID(sd, value) ReadNumber(sd, value) + +static SRes SkipData(CSzData *sd) +{ + UInt64 size; + RINOK(ReadNumber(sd, &size)); + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA(sd, size); + return SZ_OK; +} + +static SRes WaitId(CSzData *sd, UInt32 id) +{ + for (;;) + { + UInt64 type; + RINOK(ReadID(sd, &type)); + if (type == id) + return SZ_OK; + if (type == k7zIdEnd) + return SZ_ERROR_ARCHIVE; + RINOK(SkipData(sd)); + } +} + +static SRes RememberBitVector(CSzData *sd, UInt32 numItems, const Byte **v) +{ + UInt32 numBytes = (numItems + 7) >> 3; + if (numBytes > sd->Size) + return SZ_ERROR_ARCHIVE; + *v = sd->Data; + SKIP_DATA(sd, numBytes); + return SZ_OK; +} + +static UInt32 CountDefinedBits(const Byte *bits, UInt32 numItems) +{ + Byte b = 0; + unsigned m = 0; + UInt32 sum = 0; + for (; numItems != 0; numItems--) + { + if (m == 0) + { + b = *bits++; + m = 8; + } + m--; + sum += ((b >> m) & 1); + } + return sum; +} + +static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAlloc *alloc) +{ + Byte allAreDefined; + Byte *v2; + UInt32 numBytes = (numItems + 7) >> 3; + *v = NULL; + SZ_READ_BYTE(allAreDefined); + if (numBytes == 0) + return SZ_OK; + if (allAreDefined == 0) + { + if (numBytes > sd->Size) + return SZ_ERROR_ARCHIVE; + MY_ALLOC_AND_CPY(*v, numBytes, sd->Data, alloc); + SKIP_DATA(sd, numBytes); + return SZ_OK; + } + MY_ALLOC(Byte, *v, numBytes, alloc); + v2 = *v; + memset(v2, 0xFF, (size_t)numBytes); + { + unsigned numBits = (unsigned)numItems & 7; + if (numBits != 0) + v2[numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits)); + } + return SZ_OK; +} + +static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAlloc *alloc) +{ + UInt32 i; + CSzData sd; + UInt32 *vals; + const Byte *defs; + MY_ALLOC_ZE(UInt32, crcs->Vals, numItems, alloc); + sd = *sd2; + defs = crcs->Defs; + vals = crcs->Vals; + for (i = 0; i < numItems; i++) + if (SzBitArray_Check(defs, i)) + { + SZ_READ_32(vals[i]); + } + else + vals[i] = 0; + *sd2 = sd; + return SZ_OK; +} + +static SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAlloc *alloc) +{ + SzBitUi32s_Free(crcs, alloc); + RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc)); + return ReadUi32s(sd, numItems, crcs, alloc); +} + +static SRes SkipBitUi32s(CSzData *sd, UInt32 numItems) +{ + Byte allAreDefined; + UInt32 numDefined = numItems; + SZ_READ_BYTE(allAreDefined); + if (!allAreDefined) + { + size_t numBytes = (numItems + 7) >> 3; + if (numBytes > sd->Size) + return SZ_ERROR_ARCHIVE; + numDefined = CountDefinedBits(sd->Data, numItems); + SKIP_DATA(sd, numBytes); + } + if (numDefined > (sd->Size >> 2)) + return SZ_ERROR_ARCHIVE; + SKIP_DATA(sd, (size_t)numDefined * 4); + return SZ_OK; +} + +static SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAlloc *alloc) +{ + RINOK(SzReadNumber32(sd, &p->NumPackStreams)); + + RINOK(WaitId(sd, k7zIdSize)); + MY_ALLOC(UInt64, p->PackPositions, (size_t)p->NumPackStreams + 1, alloc); + { + UInt64 sum = 0; + UInt32 i; + UInt32 numPackStreams = p->NumPackStreams; + for (i = 0; i < numPackStreams; i++) + { + UInt64 packSize; + p->PackPositions[i] = sum; + RINOK(ReadNumber(sd, &packSize)); + sum += packSize; + if (sum < packSize) + return SZ_ERROR_ARCHIVE; + } + p->PackPositions[i] = sum; + } + + for (;;) + { + UInt64 type; + RINOK(ReadID(sd, &type)); + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + /* CRC of packed streams is unused now */ + RINOK(SkipBitUi32s(sd, p->NumPackStreams)); + continue; + } + RINOK(SkipData(sd)); + } +} + +/* +static SRes SzReadSwitch(CSzData *sd) +{ + Byte external; + RINOK(SzReadByte(sd, &external)); + return (external == 0) ? SZ_OK: SZ_ERROR_UNSUPPORTED; +} +*/ + +#define k_NumCodersStreams_in_Folder_MAX (SZ_NUM_BONDS_IN_FOLDER_MAX + SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX) + +SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd) +{ + UInt32 numCoders, i; + UInt32 numInStreams = 0; + const Byte *dataStart = sd->Data; + + f->NumCoders = 0; + f->NumBonds = 0; + f->NumPackStreams = 0; + f->UnpackStream = 0; + + RINOK(SzReadNumber32(sd, &numCoders)); + if (numCoders == 0 || numCoders > SZ_NUM_CODERS_IN_FOLDER_MAX) + return SZ_ERROR_UNSUPPORTED; + + for (i = 0; i < numCoders; i++) + { + Byte mainByte; + CSzCoderInfo *coder = f->Coders + i; + unsigned idSize, j; + UInt64 id; + + SZ_READ_BYTE(mainByte); + if ((mainByte & 0xC0) != 0) + return SZ_ERROR_UNSUPPORTED; + + idSize = (unsigned)(mainByte & 0xF); + if (idSize > sizeof(id)) + return SZ_ERROR_UNSUPPORTED; + if (idSize > sd->Size) + return SZ_ERROR_ARCHIVE; + id = 0; + for (j = 0; j < idSize; j++) + { + id = ((id << 8) | *sd->Data); + sd->Data++; + sd->Size--; + } + if (id > (UInt32)0xFFFFFFFF) + return SZ_ERROR_UNSUPPORTED; + coder->MethodID = (UInt32)id; + + coder->NumStreams = 1; + coder->PropsOffset = 0; + coder->PropsSize = 0; + + if ((mainByte & 0x10) != 0) + { + UInt32 numStreams; + + RINOK(SzReadNumber32(sd, &numStreams)); + if (numStreams > k_NumCodersStreams_in_Folder_MAX) + return SZ_ERROR_UNSUPPORTED; + coder->NumStreams = (Byte)numStreams; + + RINOK(SzReadNumber32(sd, &numStreams)); + if (numStreams != 1) + return SZ_ERROR_UNSUPPORTED; + } + + numInStreams += coder->NumStreams; + + if (numInStreams > k_NumCodersStreams_in_Folder_MAX) + return SZ_ERROR_UNSUPPORTED; + + if ((mainByte & 0x20) != 0) + { + UInt32 propsSize = 0; + RINOK(SzReadNumber32(sd, &propsSize)); + if (propsSize > sd->Size) + return SZ_ERROR_ARCHIVE; + if (propsSize >= 0x80) + return SZ_ERROR_UNSUPPORTED; + coder->PropsOffset = sd->Data - dataStart; + coder->PropsSize = (Byte)propsSize; + sd->Data += (size_t)propsSize; + sd->Size -= (size_t)propsSize; + } + } + + /* + if (numInStreams == 1 && numCoders == 1) + { + f->NumPackStreams = 1; + f->PackStreams[0] = 0; + } + else + */ + { + Byte streamUsed[k_NumCodersStreams_in_Folder_MAX]; + UInt32 numBonds, numPackStreams; + + numBonds = numCoders - 1; + if (numInStreams < numBonds) + return SZ_ERROR_ARCHIVE; + if (numBonds > SZ_NUM_BONDS_IN_FOLDER_MAX) + return SZ_ERROR_UNSUPPORTED; + f->NumBonds = numBonds; + + numPackStreams = numInStreams - numBonds; + if (numPackStreams > SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX) + return SZ_ERROR_UNSUPPORTED; + f->NumPackStreams = numPackStreams; + + for (i = 0; i < numInStreams; i++) + streamUsed[i] = False; + + if (numBonds != 0) + { + Byte coderUsed[SZ_NUM_CODERS_IN_FOLDER_MAX]; + + for (i = 0; i < numCoders; i++) + coderUsed[i] = False; + + for (i = 0; i < numBonds; i++) + { + CSzBond *bp = f->Bonds + i; + + RINOK(SzReadNumber32(sd, &bp->InIndex)); + if (bp->InIndex >= numInStreams || streamUsed[bp->InIndex]) + return SZ_ERROR_ARCHIVE; + streamUsed[bp->InIndex] = True; + + RINOK(SzReadNumber32(sd, &bp->OutIndex)); + if (bp->OutIndex >= numCoders || coderUsed[bp->OutIndex]) + return SZ_ERROR_ARCHIVE; + coderUsed[bp->OutIndex] = True; + } + + for (i = 0; i < numCoders; i++) + if (!coderUsed[i]) + { + f->UnpackStream = i; + break; + } + + if (i == numCoders) + return SZ_ERROR_ARCHIVE; + } + + if (numPackStreams == 1) + { + for (i = 0; i < numInStreams; i++) + if (!streamUsed[i]) + break; + if (i == numInStreams) + return SZ_ERROR_ARCHIVE; + f->PackStreams[0] = i; + } + else + for (i = 0; i < numPackStreams; i++) + { + UInt32 index; + RINOK(SzReadNumber32(sd, &index)); + if (index >= numInStreams || streamUsed[index]) + return SZ_ERROR_ARCHIVE; + streamUsed[index] = True; + f->PackStreams[i] = index; + } + } + + f->NumCoders = numCoders; + + return SZ_OK; +} + + +static MY_NO_INLINE SRes SkipNumbers(CSzData *sd2, UInt32 num) +{ + CSzData sd; + sd = *sd2; + for (; num != 0; num--) + { + Byte firstByte, mask; + unsigned i; + SZ_READ_BYTE_2(firstByte); + if ((firstByte & 0x80) == 0) + continue; + if ((firstByte & 0x40) == 0) + { + if (sd.Size == 0) + return SZ_ERROR_ARCHIVE; + sd.Size--; + sd.Data++; + continue; + } + mask = 0x20; + for (i = 2; i < 8 && (firstByte & mask) != 0; i++) + mask >>= 1; + if (i > sd.Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA2(sd, i); + } + *sd2 = sd; + return SZ_OK; +} + + +#define k_Scan_NumCoders_MAX 64 +#define k_Scan_NumCodersStreams_in_Folder_MAX 64 + + +static SRes ReadUnpackInfo(CSzAr *p, + CSzData *sd2, + UInt32 numFoldersMax, + const CBuf *tempBufs, UInt32 numTempBufs, + ISzAlloc *alloc) +{ + CSzData sd; + + UInt32 fo, numFolders, numCodersOutStreams, packStreamIndex; + const Byte *startBufPtr; + Byte external; + + RINOK(WaitId(sd2, k7zIdFolder)); + + RINOK(SzReadNumber32(sd2, &numFolders)); + if (numFolders > numFoldersMax) + return SZ_ERROR_UNSUPPORTED; + p->NumFolders = numFolders; + + SZ_READ_BYTE_SD(sd2, external); + if (external == 0) + sd = *sd2; + else + { + UInt32 index; + RINOK(SzReadNumber32(sd2, &index)); + if (index >= numTempBufs) + return SZ_ERROR_ARCHIVE; + sd.Data = tempBufs[index].data; + sd.Size = tempBufs[index].size; + } + + MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc); + MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc); + MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc); + MY_ALLOC(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); + + startBufPtr = sd.Data; + + packStreamIndex = 0; + numCodersOutStreams = 0; + + for (fo = 0; fo < numFolders; fo++) + { + UInt32 numCoders, ci, numInStreams = 0; + + p->FoCodersOffsets[fo] = sd.Data - startBufPtr; + + RINOK(SzReadNumber32(&sd, &numCoders)); + if (numCoders == 0 || numCoders > k_Scan_NumCoders_MAX) + return SZ_ERROR_UNSUPPORTED; + + for (ci = 0; ci < numCoders; ci++) + { + Byte mainByte; + unsigned idSize; + UInt32 coderInStreams; + + SZ_READ_BYTE_2(mainByte); + if ((mainByte & 0xC0) != 0) + return SZ_ERROR_UNSUPPORTED; + idSize = (mainByte & 0xF); + if (idSize > 8) + return SZ_ERROR_UNSUPPORTED; + if (idSize > sd.Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA2(sd, idSize); + + coderInStreams = 1; + + if ((mainByte & 0x10) != 0) + { + UInt32 coderOutStreams; + RINOK(SzReadNumber32(&sd, &coderInStreams)); + RINOK(SzReadNumber32(&sd, &coderOutStreams)); + if (coderInStreams > k_Scan_NumCodersStreams_in_Folder_MAX || coderOutStreams != 1) + return SZ_ERROR_UNSUPPORTED; + } + + numInStreams += coderInStreams; + + if ((mainByte & 0x20) != 0) + { + UInt32 propsSize; + RINOK(SzReadNumber32(&sd, &propsSize)); + if (propsSize > sd.Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA2(sd, propsSize); + } + } + + { + UInt32 indexOfMainStream = 0; + UInt32 numPackStreams = 1; + + if (numCoders != 1 || numInStreams != 1) + { + Byte streamUsed[k_Scan_NumCodersStreams_in_Folder_MAX]; + Byte coderUsed[k_Scan_NumCoders_MAX]; + + UInt32 i; + UInt32 numBonds = numCoders - 1; + if (numInStreams < numBonds) + return SZ_ERROR_ARCHIVE; + + if (numInStreams > k_Scan_NumCodersStreams_in_Folder_MAX) + return SZ_ERROR_UNSUPPORTED; + + for (i = 0; i < numInStreams; i++) + streamUsed[i] = False; + for (i = 0; i < numCoders; i++) + coderUsed[i] = False; + + for (i = 0; i < numBonds; i++) + { + UInt32 index; + + RINOK(SzReadNumber32(&sd, &index)); + if (index >= numInStreams || streamUsed[index]) + return SZ_ERROR_ARCHIVE; + streamUsed[index] = True; + + RINOK(SzReadNumber32(&sd, &index)); + if (index >= numCoders || coderUsed[index]) + return SZ_ERROR_ARCHIVE; + coderUsed[index] = True; + } + + numPackStreams = numInStreams - numBonds; + + if (numPackStreams != 1) + for (i = 0; i < numPackStreams; i++) + { + UInt32 index; + RINOK(SzReadNumber32(&sd, &index)); + if (index >= numInStreams || streamUsed[index]) + return SZ_ERROR_ARCHIVE; + streamUsed[index] = True; + } + + for (i = 0; i < numCoders; i++) + if (!coderUsed[i]) + { + indexOfMainStream = i; + break; + } + + if (i == numCoders) + return SZ_ERROR_ARCHIVE; + } + + p->FoStartPackStreamIndex[fo] = packStreamIndex; + p->FoToCoderUnpackSizes[fo] = numCodersOutStreams; + p->FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream; + numCodersOutStreams += numCoders; + if (numCodersOutStreams < numCoders) + return SZ_ERROR_UNSUPPORTED; + if (numPackStreams > p->NumPackStreams - packStreamIndex) + return SZ_ERROR_ARCHIVE; + packStreamIndex += numPackStreams; + } + } + + p->FoToCoderUnpackSizes[fo] = numCodersOutStreams; + + { + size_t dataSize = sd.Data - startBufPtr; + p->FoStartPackStreamIndex[fo] = packStreamIndex; + p->FoCodersOffsets[fo] = dataSize; + MY_ALLOC_ZE_AND_CPY(p->CodersData, dataSize, startBufPtr, alloc); + } + + if (external != 0) + { + if (sd.Size != 0) + return SZ_ERROR_ARCHIVE; + sd = *sd2; + } + + RINOK(WaitId(&sd, k7zIdCodersUnpackSize)); + + MY_ALLOC_ZE(UInt64, p->CoderUnpackSizes, (size_t)numCodersOutStreams, alloc); + { + UInt32 i; + for (i = 0; i < numCodersOutStreams; i++) + { + RINOK(ReadNumber(&sd, p->CoderUnpackSizes + i)); + } + } + + for (;;) + { + UInt64 type; + RINOK(ReadID(&sd, &type)); + if (type == k7zIdEnd) + { + *sd2 = sd; + return SZ_OK; + } + if (type == k7zIdCRC) + { + RINOK(ReadBitUi32s(&sd, numFolders, &p->FolderCRCs, alloc)); + continue; + } + RINOK(SkipData(&sd)); + } +} + + +UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex) +{ + return p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex] + p->FoToMainUnpackSizeIndex[folderIndex]]; +} + + +typedef struct +{ + UInt32 NumTotalSubStreams; + UInt32 NumSubDigests; + CSzData sdNumSubStreams; + CSzData sdSizes; + CSzData sdCRCs; +} CSubStreamInfo; + + +static SRes ReadSubStreamsInfo(CSzAr *p, CSzData *sd, CSubStreamInfo *ssi) +{ + UInt64 type = 0; + UInt32 numSubDigests = 0; + UInt32 numFolders = p->NumFolders; + UInt32 numUnpackStreams = numFolders; + UInt32 numUnpackSizesInData = 0; + + for (;;) + { + RINOK(ReadID(sd, &type)); + if (type == k7zIdNumUnpackStream) + { + UInt32 i; + ssi->sdNumSubStreams.Data = sd->Data; + numUnpackStreams = 0; + numSubDigests = 0; + for (i = 0; i < numFolders; i++) + { + UInt32 numStreams; + RINOK(SzReadNumber32(sd, &numStreams)); + if (numUnpackStreams > numUnpackStreams + numStreams) + return SZ_ERROR_UNSUPPORTED; + numUnpackStreams += numStreams; + if (numStreams != 0) + numUnpackSizesInData += (numStreams - 1); + if (numStreams != 1 || !SzBitWithVals_Check(&p->FolderCRCs, i)) + numSubDigests += numStreams; + } + ssi->sdNumSubStreams.Size = sd->Data - ssi->sdNumSubStreams.Data; + continue; + } + if (type == k7zIdCRC || type == k7zIdSize || type == k7zIdEnd) + break; + RINOK(SkipData(sd)); + } + + if (!ssi->sdNumSubStreams.Data) + { + numSubDigests = numFolders; + if (p->FolderCRCs.Defs) + numSubDigests = numFolders - CountDefinedBits(p->FolderCRCs.Defs, numFolders); + } + + ssi->NumTotalSubStreams = numUnpackStreams; + ssi->NumSubDigests = numSubDigests; + + if (type == k7zIdSize) + { + ssi->sdSizes.Data = sd->Data; + RINOK(SkipNumbers(sd, numUnpackSizesInData)); + ssi->sdSizes.Size = sd->Data - ssi->sdSizes.Data; + RINOK(ReadID(sd, &type)); + } + + for (;;) + { + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + ssi->sdCRCs.Data = sd->Data; + RINOK(SkipBitUi32s(sd, numSubDigests)); + ssi->sdCRCs.Size = sd->Data - ssi->sdCRCs.Data; + } + else + { + RINOK(SkipData(sd)); + } + RINOK(ReadID(sd, &type)); + } +} + +static SRes SzReadStreamsInfo(CSzAr *p, + CSzData *sd, + UInt32 numFoldersMax, const CBuf *tempBufs, UInt32 numTempBufs, + UInt64 *dataOffset, + CSubStreamInfo *ssi, + ISzAlloc *alloc) +{ + UInt64 type; + + SzData_Clear(&ssi->sdSizes); + SzData_Clear(&ssi->sdCRCs); + SzData_Clear(&ssi->sdNumSubStreams); + + *dataOffset = 0; + RINOK(ReadID(sd, &type)); + if (type == k7zIdPackInfo) + { + RINOK(ReadNumber(sd, dataOffset)); + RINOK(ReadPackInfo(p, sd, alloc)); + RINOK(ReadID(sd, &type)); + } + if (type == k7zIdUnpackInfo) + { + RINOK(ReadUnpackInfo(p, sd, numFoldersMax, tempBufs, numTempBufs, alloc)); + RINOK(ReadID(sd, &type)); + } + if (type == k7zIdSubStreamsInfo) + { + RINOK(ReadSubStreamsInfo(p, sd, ssi)); + RINOK(ReadID(sd, &type)); + } + else + { + ssi->NumTotalSubStreams = p->NumFolders; + // ssi->NumSubDigests = 0; + } + + return (type == k7zIdEnd ? SZ_OK : SZ_ERROR_UNSUPPORTED); +} + +static SRes SzReadAndDecodePackedStreams( + ILookInStream *inStream, + CSzData *sd, + CBuf *tempBufs, + UInt32 numFoldersMax, + UInt64 baseOffset, + CSzAr *p, + ISzAlloc *allocTemp) +{ + UInt64 dataStartPos; + UInt32 fo; + CSubStreamInfo ssi; + + RINOK(SzReadStreamsInfo(p, sd, numFoldersMax, NULL, 0, &dataStartPos, &ssi, allocTemp)); + + dataStartPos += baseOffset; + if (p->NumFolders == 0) + return SZ_ERROR_ARCHIVE; + + for (fo = 0; fo < p->NumFolders; fo++) + Buf_Init(tempBufs + fo); + + for (fo = 0; fo < p->NumFolders; fo++) + { + CBuf *tempBuf = tempBufs + fo; + UInt64 unpackSize = SzAr_GetFolderUnpackSize(p, fo); + if ((size_t)unpackSize != unpackSize) + return SZ_ERROR_MEM; + if (!Buf_Create(tempBuf, (size_t)unpackSize, allocTemp)) + return SZ_ERROR_MEM; + } + + for (fo = 0; fo < p->NumFolders; fo++) + { + const CBuf *tempBuf = tempBufs + fo; + RINOK(LookInStream_SeekTo(inStream, dataStartPos)); + RINOK(SzAr_DecodeFolder(p, fo, inStream, dataStartPos, tempBuf->data, tempBuf->size, allocTemp)); + } + + return SZ_OK; +} + +static SRes SzReadFileNames(const Byte *data, size_t size, UInt32 numFiles, size_t *offsets) +{ + size_t pos = 0; + *offsets++ = 0; + if (numFiles == 0) + return (size == 0) ? SZ_OK : SZ_ERROR_ARCHIVE; + if (size < 2) + return SZ_ERROR_ARCHIVE; + if (data[size - 2] != 0 || data[size - 1] != 0) + return SZ_ERROR_ARCHIVE; + do + { + const Byte *p; + if (pos == size) + return SZ_ERROR_ARCHIVE; + for (p = data + pos; + #ifdef _WIN32 + *(const UInt16 *)p != 0 + #else + p[0] != 0 || p[1] != 0 + #endif + ; p += 2); + pos = p - data + 2; + *offsets++ = (pos >> 1); + } + while (--numFiles); + return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; +} + +static MY_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num, + CSzData *sd2, + const CBuf *tempBufs, UInt32 numTempBufs, + ISzAlloc *alloc) +{ + CSzData sd; + UInt32 i; + CNtfsFileTime *vals; + Byte *defs; + Byte external; + + RINOK(ReadBitVector(sd2, num, &p->Defs, alloc)); + + SZ_READ_BYTE_SD(sd2, external); + if (external == 0) + sd = *sd2; + else + { + UInt32 index; + RINOK(SzReadNumber32(sd2, &index)); + if (index >= numTempBufs) + return SZ_ERROR_ARCHIVE; + sd.Data = tempBufs[index].data; + sd.Size = tempBufs[index].size; + } + + MY_ALLOC_ZE(CNtfsFileTime, p->Vals, num, alloc); + vals = p->Vals; + defs = p->Defs; + for (i = 0; i < num; i++) + if (SzBitArray_Check(defs, i)) + { + if (sd.Size < 8) + return SZ_ERROR_ARCHIVE; + vals[i].Low = GetUi32(sd.Data); + vals[i].High = GetUi32(sd.Data + 4); + SKIP_DATA2(sd, 8); + } + else + vals[i].High = vals[i].Low = 0; + + if (external == 0) + *sd2 = sd; + + return SZ_OK; +} + + +#define NUM_ADDITIONAL_STREAMS_MAX 8 + + +static SRes SzReadHeader2( + CSzArEx *p, /* allocMain */ + CSzData *sd, + ILookInStream *inStream, + CBuf *tempBufs, UInt32 *numTempBufs, + ISzAlloc *allocMain, + ISzAlloc *allocTemp + ) +{ + CSubStreamInfo ssi; + +{ + UInt64 type; + + SzData_Clear(&ssi.sdSizes); + SzData_Clear(&ssi.sdCRCs); + SzData_Clear(&ssi.sdNumSubStreams); + + ssi.NumSubDigests = 0; + ssi.NumTotalSubStreams = 0; + + RINOK(ReadID(sd, &type)); + + if (type == k7zIdArchiveProperties) + { + for (;;) + { + UInt64 type2; + RINOK(ReadID(sd, &type2)); + if (type2 == k7zIdEnd) + break; + RINOK(SkipData(sd)); + } + RINOK(ReadID(sd, &type)); + } + + if (type == k7zIdAdditionalStreamsInfo) + { + CSzAr tempAr; + SRes res; + + SzAr_Init(&tempAr); + res = SzReadAndDecodePackedStreams(inStream, sd, tempBufs, NUM_ADDITIONAL_STREAMS_MAX, + p->startPosAfterHeader, &tempAr, allocTemp); + *numTempBufs = tempAr.NumFolders; + SzAr_Free(&tempAr, allocTemp); + + if (res != SZ_OK) + return res; + RINOK(ReadID(sd, &type)); + } + + if (type == k7zIdMainStreamsInfo) + { + RINOK(SzReadStreamsInfo(&p->db, sd, (UInt32)1 << 30, tempBufs, *numTempBufs, + &p->dataPos, &ssi, allocMain)); + p->dataPos += p->startPosAfterHeader; + RINOK(ReadID(sd, &type)); + } + + if (type == k7zIdEnd) + { + return SZ_OK; + } + + if (type != k7zIdFilesInfo) + return SZ_ERROR_ARCHIVE; +} + +{ + UInt32 numFiles = 0; + UInt32 numEmptyStreams = 0; + const Byte *emptyStreams = NULL; + const Byte *emptyFiles = NULL; + + RINOK(SzReadNumber32(sd, &numFiles)); + p->NumFiles = numFiles; + + for (;;) + { + UInt64 type; + UInt64 size; + RINOK(ReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(ReadNumber(sd, &size)); + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; + + if (type >= ((UInt32)1 << 8)) + { + SKIP_DATA(sd, size); + } + else switch ((unsigned)type) + { + case k7zIdName: + { + size_t namesSize; + const Byte *namesData; + Byte external; + + SZ_READ_BYTE(external); + if (external == 0) + { + namesSize = (size_t)size - 1; + namesData = sd->Data; + } + else + { + UInt32 index; + RINOK(SzReadNumber32(sd, &index)); + if (index >= *numTempBufs) + return SZ_ERROR_ARCHIVE; + namesData = (tempBufs)[index].data; + namesSize = (tempBufs)[index].size; + } + + if ((namesSize & 1) != 0) + return SZ_ERROR_ARCHIVE; + MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain); + MY_ALLOC_ZE_AND_CPY(p->FileNames, namesSize, namesData, allocMain); + RINOK(SzReadFileNames(p->FileNames, namesSize, numFiles, p->FileNameOffsets)) + if (external == 0) + { + SKIP_DATA(sd, namesSize); + } + break; + } + case k7zIdEmptyStream: + { + RINOK(RememberBitVector(sd, numFiles, &emptyStreams)); + numEmptyStreams = CountDefinedBits(emptyStreams, numFiles); + emptyFiles = NULL; + break; + } + case k7zIdEmptyFile: + { + RINOK(RememberBitVector(sd, numEmptyStreams, &emptyFiles)); + break; + } + case k7zIdWinAttrib: + { + Byte external; + CSzData sdSwitch; + CSzData *sdPtr; + SzBitUi32s_Free(&p->Attribs, allocMain); + RINOK(ReadBitVector(sd, numFiles, &p->Attribs.Defs, allocMain)); + + SZ_READ_BYTE(external); + if (external == 0) + sdPtr = sd; + else + { + UInt32 index; + RINOK(SzReadNumber32(sd, &index)); + if (index >= *numTempBufs) + return SZ_ERROR_ARCHIVE; + sdSwitch.Data = (tempBufs)[index].data; + sdSwitch.Size = (tempBufs)[index].size; + sdPtr = &sdSwitch; + } + RINOK(ReadUi32s(sdPtr, numFiles, &p->Attribs, allocMain)); + break; + } + /* + case k7zParent: + { + SzBitUi32s_Free(&p->Parents, allocMain); + RINOK(ReadBitVector(sd, numFiles, &p->Parents.Defs, allocMain)); + RINOK(SzReadSwitch(sd)); + RINOK(ReadUi32s(sd, numFiles, &p->Parents, allocMain)); + break; + } + */ + case k7zIdMTime: RINOK(ReadTime(&p->MTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; + case k7zIdCTime: RINOK(ReadTime(&p->CTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; + default: + { + SKIP_DATA(sd, size); + } + } + } + + if (numFiles - numEmptyStreams != ssi.NumTotalSubStreams) + return SZ_ERROR_ARCHIVE; + + for (;;) + { + UInt64 type; + RINOK(ReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(SkipData(sd)); + } + + { + UInt32 i; + UInt32 emptyFileIndex = 0; + UInt32 folderIndex = 0; + UInt32 remSubStreams = 0; + UInt32 numSubStreams = 0; + UInt64 unpackPos = 0; + const Byte *digestsDefs = NULL; + const Byte *digestsVals = NULL; + UInt32 digestsValsIndex = 0; + UInt32 digestIndex; + Byte allDigestsDefined = 0; + Byte isDirMask = 0; + Byte crcMask = 0; + Byte mask = 0x80; + + MY_ALLOC(UInt32, p->FolderToFile, p->db.NumFolders + 1, allocMain); + MY_ALLOC_ZE(UInt32, p->FileToFolder, p->NumFiles, allocMain); + MY_ALLOC(UInt64, p->UnpackPositions, p->NumFiles + 1, allocMain); + MY_ALLOC_ZE(Byte, p->IsDirs, (p->NumFiles + 7) >> 3, allocMain); + + RINOK(SzBitUi32s_Alloc(&p->CRCs, p->NumFiles, allocMain)); + + if (ssi.sdCRCs.Size != 0) + { + SZ_READ_BYTE_SD(&ssi.sdCRCs, allDigestsDefined); + if (allDigestsDefined) + digestsVals = ssi.sdCRCs.Data; + else + { + size_t numBytes = (ssi.NumSubDigests + 7) >> 3; + digestsDefs = ssi.sdCRCs.Data; + digestsVals = digestsDefs + numBytes; + } + } + + digestIndex = 0; + + for (i = 0; i < numFiles; i++, mask >>= 1) + { + if (mask == 0) + { + UInt32 byteIndex = (i - 1) >> 3; + p->IsDirs[byteIndex] = isDirMask; + p->CRCs.Defs[byteIndex] = crcMask; + isDirMask = 0; + crcMask = 0; + mask = 0x80; + } + + p->UnpackPositions[i] = unpackPos; + p->CRCs.Vals[i] = 0; + + if (emptyStreams && SzBitArray_Check(emptyStreams, i)) + { + if (emptyFiles) + { + if (!SzBitArray_Check(emptyFiles, emptyFileIndex)) + isDirMask |= mask; + emptyFileIndex++; + } + else + isDirMask |= mask; + if (remSubStreams == 0) + { + p->FileToFolder[i] = (UInt32)-1; + continue; + } + } + + if (remSubStreams == 0) + { + for (;;) + { + if (folderIndex >= p->db.NumFolders) + return SZ_ERROR_ARCHIVE; + p->FolderToFile[folderIndex] = i; + numSubStreams = 1; + if (ssi.sdNumSubStreams.Data) + { + RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); + } + remSubStreams = numSubStreams; + if (numSubStreams != 0) + break; + { + UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + unpackPos += folderUnpackSize; + if (unpackPos < folderUnpackSize) + return SZ_ERROR_ARCHIVE; + } + + folderIndex++; + } + } + + p->FileToFolder[i] = folderIndex; + + if (emptyStreams && SzBitArray_Check(emptyStreams, i)) + continue; + + if (--remSubStreams == 0) + { + UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + UInt64 startFolderUnpackPos = p->UnpackPositions[p->FolderToFile[folderIndex]]; + if (folderUnpackSize < unpackPos - startFolderUnpackPos) + return SZ_ERROR_ARCHIVE; + unpackPos = startFolderUnpackPos + folderUnpackSize; + if (unpackPos < folderUnpackSize) + return SZ_ERROR_ARCHIVE; + + if (numSubStreams == 1 && SzBitWithVals_Check(&p->db.FolderCRCs, i)) + { + p->CRCs.Vals[i] = p->db.FolderCRCs.Vals[folderIndex]; + crcMask |= mask; + } + else if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) + { + p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); + digestsValsIndex++; + crcMask |= mask; + } + + folderIndex++; + } + else + { + UInt64 v; + RINOK(ReadNumber(&ssi.sdSizes, &v)); + unpackPos += v; + if (unpackPos < v) + return SZ_ERROR_ARCHIVE; + if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) + { + p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); + digestsValsIndex++; + crcMask |= mask; + } + } + } + + if (mask != 0x80) + { + UInt32 byteIndex = (i - 1) >> 3; + p->IsDirs[byteIndex] = isDirMask; + p->CRCs.Defs[byteIndex] = crcMask; + } + + p->UnpackPositions[i] = unpackPos; + + if (remSubStreams != 0) + return SZ_ERROR_ARCHIVE; + + for (;;) + { + p->FolderToFile[folderIndex] = i; + if (folderIndex >= p->db.NumFolders) + break; + if (!ssi.sdNumSubStreams.Data) + return SZ_ERROR_ARCHIVE; + RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); + if (numSubStreams != 0) + return SZ_ERROR_ARCHIVE; + /* + { + UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + unpackPos += folderUnpackSize; + if (unpackPos < folderUnpackSize) + return SZ_ERROR_ARCHIVE; + } + */ + folderIndex++; + } + + if (ssi.sdNumSubStreams.Data && ssi.sdNumSubStreams.Size != 0) + return SZ_ERROR_ARCHIVE; + } +} + return SZ_OK; +} + + +static SRes SzReadHeader( + CSzArEx *p, + CSzData *sd, + ILookInStream *inStream, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 i; + UInt32 numTempBufs = 0; + SRes res; + CBuf tempBufs[NUM_ADDITIONAL_STREAMS_MAX]; + + for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) + Buf_Init(tempBufs + i); + + res = SzReadHeader2(p, sd, inStream, + tempBufs, &numTempBufs, + allocMain, allocTemp); + + for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) + Buf_Free(tempBufs + i, allocTemp); + + RINOK(res); + + if (sd->Size != 0) + return SZ_ERROR_FAIL; + + return res; +} + +static SRes SzArEx_Open2( + CSzArEx *p, + ILookInStream *inStream, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + Byte header[k7zStartHeaderSize]; + Int64 startArcPos; + UInt64 nextHeaderOffset, nextHeaderSize; + size_t nextHeaderSizeT; + UInt32 nextHeaderCRC; + CBuf buf; + SRes res; + + startArcPos = 0; + RINOK(inStream->Seek(inStream, &startArcPos, SZ_SEEK_CUR)); + + RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); + + if (!TestSignatureCandidate(header)) + return SZ_ERROR_NO_ARCHIVE; + if (header[6] != k7zMajorVersion) + return SZ_ERROR_UNSUPPORTED; + + nextHeaderOffset = GetUi64(header + 12); + nextHeaderSize = GetUi64(header + 20); + nextHeaderCRC = GetUi32(header + 28); + + p->startPosAfterHeader = startArcPos + k7zStartHeaderSize; + + if (CrcCalc(header + 12, 20) != GetUi32(header + 8)) + return SZ_ERROR_CRC; + + nextHeaderSizeT = (size_t)nextHeaderSize; + if (nextHeaderSizeT != nextHeaderSize) + return SZ_ERROR_MEM; + if (nextHeaderSizeT == 0) + return SZ_OK; + if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize || + nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize) + return SZ_ERROR_NO_ARCHIVE; + + { + Int64 pos = 0; + RINOK(inStream->Seek(inStream, &pos, SZ_SEEK_END)); + if ((UInt64)pos < startArcPos + nextHeaderOffset || + (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset || + (UInt64)pos < startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) + return SZ_ERROR_INPUT_EOF; + } + + RINOK(LookInStream_SeekTo(inStream, startArcPos + k7zStartHeaderSize + nextHeaderOffset)); + + if (!Buf_Create(&buf, nextHeaderSizeT, allocTemp)) + return SZ_ERROR_MEM; + + res = LookInStream_Read(inStream, buf.data, nextHeaderSizeT); + + if (res == SZ_OK) + { + res = SZ_ERROR_ARCHIVE; + if (CrcCalc(buf.data, nextHeaderSizeT) == nextHeaderCRC) + { + CSzData sd; + UInt64 type; + sd.Data = buf.data; + sd.Size = buf.size; + + res = ReadID(&sd, &type); + + if (res == SZ_OK && type == k7zIdEncodedHeader) + { + CSzAr tempAr; + CBuf tempBuf; + Buf_Init(&tempBuf); + + SzAr_Init(&tempAr); + res = SzReadAndDecodePackedStreams(inStream, &sd, &tempBuf, 1, p->startPosAfterHeader, &tempAr, allocTemp); + SzAr_Free(&tempAr, allocTemp); + + if (res != SZ_OK) + { + Buf_Free(&tempBuf, allocTemp); + } + else + { + Buf_Free(&buf, allocTemp); + buf.data = tempBuf.data; + buf.size = tempBuf.size; + sd.Data = buf.data; + sd.Size = buf.size; + res = ReadID(&sd, &type); + } + } + + if (res == SZ_OK) + { + if (type == k7zIdHeader) + { + /* + CSzData sd2; + unsigned ttt; + for (ttt = 0; ttt < 40000; ttt++) + { + SzArEx_Free(p, allocMain); + sd2 = sd; + res = SzReadHeader(p, &sd2, inStream, allocMain, allocTemp); + if (res != SZ_OK) + break; + } + */ + res = SzReadHeader(p, &sd, inStream, allocMain, allocTemp); + } + else + res = SZ_ERROR_UNSUPPORTED; + } + } + } + + Buf_Free(&buf, allocTemp); + return res; +} + + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, + ISzAlloc *allocMain, ISzAlloc *allocTemp) +{ + SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); + if (res != SZ_OK) + SzArEx_Free(p, allocMain); + return res; +} + + +SRes SzArEx_Extract( + const CSzArEx *p, + ILookInStream *inStream, + UInt32 fileIndex, + UInt32 *blockIndex, + Byte **tempBuf, + size_t *outBufferSize, + size_t *offset, + size_t *outSizeProcessed, + ISzAlloc *allocMain, + ISzAlloc *allocTemp) +{ + UInt32 folderIndex = p->FileToFolder[fileIndex]; + SRes res = SZ_OK; + + *offset = 0; + *outSizeProcessed = 0; + + if (folderIndex == (UInt32)-1) + { + IAlloc_Free(allocMain, *tempBuf); + *blockIndex = folderIndex; + *tempBuf = NULL; + *outBufferSize = 0; + return SZ_OK; + } + + if (*tempBuf == NULL || *blockIndex != folderIndex) + { + UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + /* + UInt64 unpackSizeSpec = + p->UnpackPositions[p->FolderToFile[folderIndex + 1]] - + p->UnpackPositions[p->FolderToFile[folderIndex]]; + */ + size_t unpackSize = (size_t)unpackSizeSpec; + + if (unpackSize != unpackSizeSpec) + return SZ_ERROR_MEM; + *blockIndex = folderIndex; + IAlloc_Free(allocMain, *tempBuf); + *tempBuf = NULL; + + if (res == SZ_OK) + { + *outBufferSize = unpackSize; + if (unpackSize != 0) + { + *tempBuf = (Byte *)IAlloc_Alloc(allocMain, unpackSize); + if (*tempBuf == NULL) + res = SZ_ERROR_MEM; + } + + if (res == SZ_OK) + { + res = SzAr_DecodeFolder(&p->db, folderIndex, + inStream, p->dataPos, *tempBuf, unpackSize, allocTemp); + } + } + } + + if (res == SZ_OK) + { + UInt64 unpackPos = p->UnpackPositions[fileIndex]; + *offset = (size_t)(unpackPos - p->UnpackPositions[p->FolderToFile[folderIndex]]); + *outSizeProcessed = (size_t)(p->UnpackPositions[fileIndex + 1] - unpackPos); + if (*offset + *outSizeProcessed > *outBufferSize) + return SZ_ERROR_FAIL; + if (SzBitWithVals_Check(&p->CRCs, fileIndex)) + if (CrcCalc(*tempBuf + *offset, *outSizeProcessed) != p->CRCs.Vals[fileIndex]) + res = SZ_ERROR_CRC; + } + + return res; +} + + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest) +{ + size_t offs = p->FileNameOffsets[fileIndex]; + size_t len = p->FileNameOffsets[fileIndex + 1] - offs; + if (dest != 0) + { + size_t i; + const Byte *src = p->FileNames + offs * 2; + for (i = 0; i < len; i++) + dest[i] = GetUi16(src + i * 2); + } + return len; +} + +/* +size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex) +{ + size_t len; + if (!p->FileNameOffsets) + return 1; + len = 0; + for (;;) + { + UInt32 parent = (UInt32)(Int32)-1; + len += p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; + if SzBitWithVals_Check(&p->Parents, fileIndex) + parent = p->Parents.Vals[fileIndex]; + if (parent == (UInt32)(Int32)-1) + return len; + fileIndex = parent; + } +} + +UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest) +{ + Bool needSlash; + if (!p->FileNameOffsets) + { + *(--dest) = 0; + return dest; + } + needSlash = False; + for (;;) + { + UInt32 parent = (UInt32)(Int32)-1; + size_t curLen = p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; + SzArEx_GetFileNameUtf16(p, fileIndex, dest - curLen); + if (needSlash) + *(dest - 1) = '/'; + needSlash = True; + dest -= curLen; + + if SzBitWithVals_Check(&p->Parents, fileIndex) + parent = p->Parents.Vals[fileIndex]; + if (parent == (UInt32)(Int32)-1) + return dest; + fileIndex = parent; + } +} +*/ diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zBuf.c b/Provenance/LzmaSDKObjC/lzma/C/7zBuf.c new file mode 100644 index 0000000000..b0ac1104b9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zBuf.c @@ -0,0 +1,36 @@ +/* 7zBuf.c -- Byte Buffer +2013-01-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zBuf.h" + +void Buf_Init(CBuf *p) +{ + p->data = 0; + p->size = 0; +} + +int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc) +{ + p->size = 0; + if (size == 0) + { + p->data = 0; + return 1; + } + p->data = (Byte *)alloc->Alloc(alloc, size); + if (p->data != 0) + { + p->size = size; + return 1; + } + return 0; +} + +void Buf_Free(CBuf *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->data); + p->data = 0; + p->size = 0; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zBuf.h b/Provenance/LzmaSDKObjC/lzma/C/7zBuf.h new file mode 100644 index 0000000000..e5f9218bed --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zBuf.h @@ -0,0 +1,35 @@ +/* 7zBuf.h -- Byte Buffer +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __7Z_BUF_H +#define __7Z_BUF_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef struct +{ + Byte *data; + size_t size; +} CBuf; + +void Buf_Init(CBuf *p); +int Buf_Create(CBuf *p, size_t size, ISzAlloc *alloc); +void Buf_Free(CBuf *p, ISzAlloc *alloc); + +typedef struct +{ + Byte *data; + size_t size; + size_t pos; +} CDynBuf; + +void DynBuf_Construct(CDynBuf *p); +void DynBuf_SeekToBeg(CDynBuf *p); +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc); +void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zBuf2.c b/Provenance/LzmaSDKObjC/lzma/C/7zBuf2.c new file mode 100644 index 0000000000..8e3fe92970 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zBuf2.c @@ -0,0 +1,51 @@ +/* 7zBuf2.c -- Byte Buffer +2014-08-22 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zBuf.h" + +void DynBuf_Construct(CDynBuf *p) +{ + p->data = 0; + p->size = 0; + p->pos = 0; +} + +void DynBuf_SeekToBeg(CDynBuf *p) +{ + p->pos = 0; +} + +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAlloc *alloc) +{ + if (size > p->size - p->pos) + { + size_t newSize = p->pos + size; + Byte *data; + newSize += newSize / 4; + data = (Byte *)alloc->Alloc(alloc, newSize); + if (data == 0) + return 0; + p->size = newSize; + memcpy(data, p->data, p->pos); + alloc->Free(alloc, p->data); + p->data = data; + } + if (size != 0) + { + memcpy(p->data + p->pos, buf, size); + p->pos += size; + } + return 1; +} + +void DynBuf_Free(CDynBuf *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->data); + p->data = 0; + p->size = 0; + p->pos = 0; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zCrc.c b/Provenance/LzmaSDKObjC/lzma/C/7zCrc.c new file mode 100644 index 0000000000..607db34041 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zCrc.c @@ -0,0 +1,128 @@ +/* 7zCrc.c -- CRC32 init +2015-03-10 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zCrc.h" +#include "CpuArch.h" + +#define kCrcPoly 0xEDB88320 + +#ifdef MY_CPU_LE + #define CRC_NUM_TABLES 8 +#else + #define CRC_NUM_TABLES 9 + + #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) + + UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table); + UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +#endif + +#ifndef MY_CPU_BE + UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); + UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +#endif + +typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table); + +CRC_FUNC g_CrcUpdateT4; +CRC_FUNC g_CrcUpdateT8; +CRC_FUNC g_CrcUpdate; + +UInt32 g_CrcTable[256 * CRC_NUM_TABLES]; + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) +{ + return g_CrcUpdate(v, data, size, g_CrcTable); +} + +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) +{ + return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL; +} + +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + const Byte *pEnd = p + size; + for (; p != pEnd; p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + +void MY_FAST_CALL CrcGenerateTable() +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt32 r = i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + g_CrcTable[i] = r; + } + for (; i < 256 * CRC_NUM_TABLES; i++) + { + UInt32 r = g_CrcTable[i - 256]; + g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8); + } + + #if CRC_NUM_TABLES < 4 + + g_CrcUpdate = CrcUpdateT1; + + #else + + #ifdef MY_CPU_LE + + g_CrcUpdateT4 = CrcUpdateT4; + g_CrcUpdate = CrcUpdateT4; + + #if CRC_NUM_TABLES >= 8 + g_CrcUpdateT8 = CrcUpdateT8; + + #ifdef MY_CPU_X86_OR_AMD64 + if (!CPU_Is_InOrder()) + g_CrcUpdate = CrcUpdateT8; + #endif + #endif + + #else + { + #ifndef MY_CPU_BE + UInt32 k = 0x01020304; + const Byte *p = (const Byte *)&k; + if (p[0] == 4 && p[1] == 3) + { + g_CrcUpdateT4 = CrcUpdateT4; + g_CrcUpdate = CrcUpdateT4; + #if CRC_NUM_TABLES >= 8 + g_CrcUpdateT8 = CrcUpdateT8; + // g_CrcUpdate = CrcUpdateT8; + #endif + } + else if (p[0] != 1 || p[1] != 2) + g_CrcUpdate = CrcUpdateT1; + else + #endif + { + for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) + { + UInt32 x = g_CrcTable[i - 256]; + g_CrcTable[i] = CRC_UINT32_SWAP(x); + } + g_CrcUpdateT4 = CrcUpdateT1_BeT4; + g_CrcUpdate = CrcUpdateT1_BeT4; + #if CRC_NUM_TABLES >= 8 + g_CrcUpdateT8 = CrcUpdateT1_BeT8; + // g_CrcUpdate = CrcUpdateT1_BeT8; + #endif + } + } + #endif + + #endif +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zCrc.h b/Provenance/LzmaSDKObjC/lzma/C/7zCrc.h new file mode 100644 index 0000000000..3b0459402b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zCrc.h @@ -0,0 +1,25 @@ +/* 7zCrc.h -- CRC32 calculation +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __7Z_CRC_H +#define __7Z_CRC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +extern UInt32 g_CrcTable[]; + +/* Call CrcGenerateTable one time before other CRC functions */ +void MY_FAST_CALL CrcGenerateTable(void); + +#define CRC_INIT_VAL 0xFFFFFFFF +#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL) +#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zCrcOpt.c b/Provenance/LzmaSDKObjC/lzma/C/7zCrcOpt.c new file mode 100644 index 0000000000..58628efe56 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zCrcOpt.c @@ -0,0 +1,115 @@ +/* 7zCrcOpt.c -- CRC32 calculation +2015-03-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifndef MY_CPU_BE + +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + v ^= *(const UInt32 *)p; + v = + table[0x300 + ((v ) & 0xFF)] + ^ table[0x200 + ((v >> 8) & 0xFF)] + ^ table[0x100 + ((v >> 16) & 0xFF)] + ^ table[0x000 + ((v >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + +UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + for (; size >= 8; size -= 8, p += 8) + { + UInt32 d; + v ^= *(const UInt32 *)p; + v = + table[0x700 + ((v ) & 0xFF)] + ^ table[0x600 + ((v >> 8) & 0xFF)] + ^ table[0x500 + ((v >> 16) & 0xFF)] + ^ table[0x400 + ((v >> 24))]; + d = *((const UInt32 *)p + 1); + v ^= + table[0x300 + ((d ) & 0xFF)] + ^ table[0x200 + ((d >> 8) & 0xFF)] + ^ table[0x100 + ((d >> 16) & 0xFF)] + ^ table[0x000 + ((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + +#endif + + +#ifndef MY_CPU_LE + +#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) + +#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8)) + +UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + table += 0x100; + v = CRC_UINT32_SWAP(v); + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + v ^= *(const UInt32 *)p; + v = + table[0x000 + ((v ) & 0xFF)] + ^ table[0x100 + ((v >> 8) & 0xFF)] + ^ table[0x200 + ((v >> 16) & 0xFF)] + ^ table[0x300 + ((v >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + return CRC_UINT32_SWAP(v); +} + +UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + table += 0x100; + v = CRC_UINT32_SWAP(v); + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + for (; size >= 8; size -= 8, p += 8) + { + UInt32 d; + v ^= *(const UInt32 *)p; + v = + table[0x400 + ((v ) & 0xFF)] + ^ table[0x500 + ((v >> 8) & 0xFF)] + ^ table[0x600 + ((v >> 16) & 0xFF)] + ^ table[0x700 + ((v >> 24))]; + d = *((const UInt32 *)p + 1); + v ^= + table[0x000 + ((d ) & 0xFF)] + ^ table[0x100 + ((d >> 8) & 0xFF)] + ^ table[0x200 + ((d >> 16) & 0xFF)] + ^ table[0x300 + ((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + return CRC_UINT32_SWAP(v); +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zDec.c b/Provenance/LzmaSDKObjC/lzma/C/7zDec.c new file mode 100644 index 0000000000..e39b4ff12a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zDec.c @@ -0,0 +1,591 @@ +/* 7zDec.c -- Decoding from 7z folder +2015-11-18 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #define _7ZIP_PPMD_SUPPPORT */ + +#include "7z.h" +#include "7zCrc.h" + +#include "Bcj2.h" +#include "Bra.h" +#include "CpuArch.h" +#include "Delta.h" +#include "LzmaDec.h" +#include "Lzma2Dec.h" +#ifdef _7ZIP_PPMD_SUPPPORT +#include "Ppmd7.h" +#endif + +#define k_Copy 0 +#define k_Delta 3 +#define k_LZMA2 0x21 +#define k_LZMA 0x30101 +#define k_BCJ 0x3030103 +#define k_BCJ2 0x303011B +#define k_PPC 0x3030205 +#define k_IA64 0x3030401 +#define k_ARM 0x3030501 +#define k_ARMT 0x3030701 +#define k_SPARC 0x3030805 + + +#ifdef _7ZIP_PPMD_SUPPPORT + +#define k_PPMD 0x30401 + +typedef struct +{ + IByteIn p; + const Byte *cur; + const Byte *end; + const Byte *begin; + UInt64 processed; + Bool extra; + SRes res; + ILookInStream *inStream; +} CByteInToLook; + +static Byte ReadByte(void *pp) +{ + CByteInToLook *p = (CByteInToLook *)pp; + if (p->cur != p->end) + return *p->cur++; + if (p->res == SZ_OK) + { + size_t size = p->cur - p->begin; + p->processed += size; + p->res = p->inStream->Skip(p->inStream, size); + size = (1 << 25); + p->res = p->inStream->Look(p->inStream, (const void **)&p->begin, &size); + p->cur = p->begin; + p->end = p->begin + size; + if (size != 0) + return *p->cur++;; + } + p->extra = True; + return 0; +} + +static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +{ + CPpmd7 ppmd; + CByteInToLook s; + SRes res = SZ_OK; + + s.p.Read = ReadByte; + s.inStream = inStream; + s.begin = s.end = s.cur = NULL; + s.extra = False; + s.res = SZ_OK; + s.processed = 0; + + if (propsSize != 5) + return SZ_ERROR_UNSUPPORTED; + + { + unsigned order = props[0]; + UInt32 memSize = GetUi32(props + 1); + if (order < PPMD7_MIN_ORDER || + order > PPMD7_MAX_ORDER || + memSize < PPMD7_MIN_MEM_SIZE || + memSize > PPMD7_MAX_MEM_SIZE) + return SZ_ERROR_UNSUPPORTED; + Ppmd7_Construct(&ppmd); + if (!Ppmd7_Alloc(&ppmd, memSize, allocMain)) + return SZ_ERROR_MEM; + Ppmd7_Init(&ppmd, order); + } + { + CPpmd7z_RangeDec rc; + Ppmd7z_RangeDec_CreateVTable(&rc); + rc.Stream = &s.p; + if (!Ppmd7z_RangeDec_Init(&rc)) + res = SZ_ERROR_DATA; + else if (s.extra) + res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA); + else + { + SizeT i; + for (i = 0; i < outSize; i++) + { + int sym = Ppmd7_DecodeSymbol(&ppmd, &rc.p); + if (s.extra || sym < 0) + break; + outBuffer[i] = (Byte)sym; + } + if (i != outSize) + res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA); + else if (s.processed + (s.cur - s.begin) != inSize || !Ppmd7z_RangeDec_IsFinishedOK(&rc)) + res = SZ_ERROR_DATA; + } + } + Ppmd7_Free(&ppmd, allocMain); + return res; +} + +#endif + + +static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +{ + CLzmaDec state; + SRes res = SZ_OK; + + LzmaDec_Construct(&state); + RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain)); + state.dic = outBuffer; + state.dicBufSize = outSize; + LzmaDec_Init(&state); + + for (;;) + { + const void *inBuf = NULL; + size_t lookahead = (1 << 18); + if (lookahead > inSize) + lookahead = (size_t)inSize; + res = inStream->Look(inStream, &inBuf, &lookahead); + if (res != SZ_OK) + break; + + { + SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; + ELzmaStatus status; + res = LzmaDec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + { + if (outSize != state.dicPos || inSize != 0) + res = SZ_ERROR_DATA; + break; + } + + if (outSize == state.dicPos && inSize == 0 && status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) + break; + + if (inProcessed == 0 && dicPos == state.dicPos) + { + res = SZ_ERROR_DATA; + break; + } + + res = inStream->Skip((void *)inStream, inProcessed); + if (res != SZ_OK) + break; + } + } + + LzmaDec_FreeProbs(&state, allocMain); + return res; +} + + +#ifndef _7Z_NO_METHOD_LZMA2 + +static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain) +{ + CLzma2Dec state; + SRes res = SZ_OK; + + Lzma2Dec_Construct(&state); + if (propsSize != 1) + return SZ_ERROR_DATA; + RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain)); + state.decoder.dic = outBuffer; + state.decoder.dicBufSize = outSize; + Lzma2Dec_Init(&state); + + for (;;) + { + const void *inBuf = NULL; + size_t lookahead = (1 << 18); + if (lookahead > inSize) + lookahead = (size_t)inSize; + res = inStream->Look(inStream, &inBuf, &lookahead); + if (res != SZ_OK) + break; + + { + SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; + ELzmaStatus status; + res = Lzma2Dec_DecodeToDic(&state, outSize, inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + { + if (outSize != state.decoder.dicPos || inSize != 0) + res = SZ_ERROR_DATA; + break; + } + + if (inProcessed == 0 && dicPos == state.decoder.dicPos) + { + res = SZ_ERROR_DATA; + break; + } + + res = inStream->Skip((void *)inStream, inProcessed); + if (res != SZ_OK) + break; + } + } + + Lzma2Dec_FreeProbs(&state, allocMain); + return res; +} + +#endif + + +static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) +{ + while (inSize > 0) + { + const void *inBuf; + size_t curSize = (1 << 18); + if (curSize > inSize) + curSize = (size_t)inSize; + RINOK(inStream->Look(inStream, &inBuf, &curSize)); + if (curSize == 0) + return SZ_ERROR_INPUT_EOF; + memcpy(outBuffer, inBuf, curSize); + outBuffer += curSize; + inSize -= curSize; + RINOK(inStream->Skip((void *)inStream, curSize)); + } + return SZ_OK; +} + +static Bool IS_MAIN_METHOD(UInt32 m) +{ + switch (m) + { + case k_Copy: + case k_LZMA: + #ifndef _7Z_NO_METHOD_LZMA2 + case k_LZMA2: + #endif + #ifdef _7ZIP_PPMD_SUPPPORT + case k_PPMD: + #endif + return True; + } + return False; +} + +static Bool IS_SUPPORTED_CODER(const CSzCoderInfo *c) +{ + return + c->NumStreams == 1 + /* && c->MethodID <= (UInt32)0xFFFFFFFF */ + && IS_MAIN_METHOD((UInt32)c->MethodID); +} + +#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumStreams == 4) + +static SRes CheckSupportedFolder(const CSzFolder *f) +{ + if (f->NumCoders < 1 || f->NumCoders > 4) + return SZ_ERROR_UNSUPPORTED; + if (!IS_SUPPORTED_CODER(&f->Coders[0])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumCoders == 1) + { + if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBonds != 0) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + + + #ifndef _7Z_NO_METHODS_FILTERS + + if (f->NumCoders == 2) + { + const CSzCoderInfo *c = &f->Coders[1]; + if ( + /* c->MethodID > (UInt32)0xFFFFFFFF || */ + c->NumStreams != 1 + || f->NumPackStreams != 1 + || f->PackStreams[0] != 0 + || f->NumBonds != 1 + || f->Bonds[0].InIndex != 1 + || f->Bonds[0].OutIndex != 0) + return SZ_ERROR_UNSUPPORTED; + switch ((UInt32)c->MethodID) + { + case k_Delta: + case k_BCJ: + case k_PPC: + case k_IA64: + case k_SPARC: + case k_ARM: + case k_ARMT: + break; + default: + return SZ_ERROR_UNSUPPORTED; + } + return SZ_OK; + } + + #endif + + + if (f->NumCoders == 4) + { + if (!IS_SUPPORTED_CODER(&f->Coders[1]) + || !IS_SUPPORTED_CODER(&f->Coders[2]) + || !IS_BCJ2(&f->Coders[3])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumPackStreams != 4 + || f->PackStreams[0] != 2 + || f->PackStreams[1] != 6 + || f->PackStreams[2] != 1 + || f->PackStreams[3] != 0 + || f->NumBonds != 3 + || f->Bonds[0].InIndex != 5 || f->Bonds[0].OutIndex != 0 + || f->Bonds[1].InIndex != 4 || f->Bonds[1].OutIndex != 1 + || f->Bonds[2].InIndex != 3 || f->Bonds[2].OutIndex != 2) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + + return SZ_ERROR_UNSUPPORTED; +} + +#define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break; + +static SRes SzFolder_Decode2(const CSzFolder *folder, + const Byte *propsData, + const UInt64 *unpackSizes, + const UInt64 *packPositions, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, SizeT outSize, ISzAlloc *allocMain, + Byte *tempBuf[]) +{ + UInt32 ci; + SizeT tempSizes[3] = { 0, 0, 0}; + SizeT tempSize3 = 0; + Byte *tempBuf3 = 0; + + RINOK(CheckSupportedFolder(folder)); + + for (ci = 0; ci < folder->NumCoders; ci++) + { + const CSzCoderInfo *coder = &folder->Coders[ci]; + + if (IS_MAIN_METHOD((UInt32)coder->MethodID)) + { + UInt32 si = 0; + UInt64 offset; + UInt64 inSize; + Byte *outBufCur = outBuffer; + SizeT outSizeCur = outSize; + if (folder->NumCoders == 4) + { + UInt32 indices[] = { 3, 2, 0 }; + UInt64 unpackSize = unpackSizes[ci]; + si = indices[ci]; + if (ci < 2) + { + Byte *temp; + outSizeCur = (SizeT)unpackSize; + if (outSizeCur != unpackSize) + return SZ_ERROR_MEM; + temp = (Byte *)IAlloc_Alloc(allocMain, outSizeCur); + if (!temp && outSizeCur != 0) + return SZ_ERROR_MEM; + outBufCur = tempBuf[1 - ci] = temp; + tempSizes[1 - ci] = outSizeCur; + } + else if (ci == 2) + { + if (unpackSize > outSize) /* check it */ + return SZ_ERROR_PARAM; + tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); + tempSize3 = outSizeCur = (SizeT)unpackSize; + } + else + return SZ_ERROR_UNSUPPORTED; + } + offset = packPositions[si]; + inSize = packPositions[si + 1] - offset; + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + + if (coder->MethodID == k_Copy) + { + if (inSize != outSizeCur) /* check it */ + return SZ_ERROR_DATA; + RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); + } + else if (coder->MethodID == k_LZMA) + { + RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + #ifndef _7Z_NO_METHOD_LZMA2 + else if (coder->MethodID == k_LZMA2) + { + RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + #endif + #ifdef _7ZIP_PPMD_SUPPPORT + else if (coder->MethodID == k_PPMD) + { + RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + #endif + else + return SZ_ERROR_UNSUPPORTED; + } + else if (coder->MethodID == k_BCJ2) + { + UInt64 offset = packPositions[1]; + UInt64 s3Size = packPositions[2] - offset; + + if (ci != 3) + return SZ_ERROR_UNSUPPORTED; + + tempSizes[2] = (SizeT)s3Size; + if (tempSizes[2] != s3Size) + return SZ_ERROR_MEM; + tempBuf[2] = (Byte *)IAlloc_Alloc(allocMain, tempSizes[2]); + if (!tempBuf[2] && tempSizes[2] != 0) + return SZ_ERROR_MEM; + + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2])); + + if ((tempSizes[0] & 3) != 0 || + (tempSizes[1] & 3) != 0 || + tempSize3 + tempSizes[0] + tempSizes[1] != outSize) + return SZ_ERROR_DATA; + + { + CBcj2Dec p; + + p.bufs[0] = tempBuf3; p.lims[0] = tempBuf3 + tempSize3; + p.bufs[1] = tempBuf[0]; p.lims[1] = tempBuf[0] + tempSizes[0]; + p.bufs[2] = tempBuf[1]; p.lims[2] = tempBuf[1] + tempSizes[1]; + p.bufs[3] = tempBuf[2]; p.lims[3] = tempBuf[2] + tempSizes[2]; + + p.dest = outBuffer; + p.destLim = outBuffer + outSize; + + Bcj2Dec_Init(&p); + RINOK(Bcj2Dec_Decode(&p)); + + { + unsigned i; + for (i = 0; i < 4; i++) + if (p.bufs[i] != p.lims[i]) + return SZ_ERROR_DATA; + + if (!Bcj2Dec_IsFinished(&p)) + return SZ_ERROR_DATA; + + if (p.dest != p.destLim + || p.state != BCJ2_STREAM_MAIN) + return SZ_ERROR_DATA; + } + } + } + #ifndef _7Z_NO_METHODS_FILTERS + else if (ci == 1) + { + if (coder->MethodID == k_Delta) + { + if (coder->PropsSize != 1) + return SZ_ERROR_UNSUPPORTED; + { + Byte state[DELTA_STATE_SIZE]; + Delta_Init(state); + Delta_Decode(state, (unsigned)(propsData[coder->PropsOffset]) + 1, outBuffer, outSize); + } + } + else + { + if (coder->PropsSize != 0) + return SZ_ERROR_UNSUPPORTED; + switch (coder->MethodID) + { + case k_BCJ: + { + UInt32 state; + x86_Convert_Init(state); + x86_Convert(outBuffer, outSize, 0, &state, 0); + break; + } + CASE_BRA_CONV(PPC) + CASE_BRA_CONV(IA64) + CASE_BRA_CONV(SPARC) + CASE_BRA_CONV(ARM) + CASE_BRA_CONV(ARMT) + default: + return SZ_ERROR_UNSUPPORTED; + } + } + } + #endif + else + return SZ_ERROR_UNSUPPORTED; + } + + return SZ_OK; +} + + +SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, size_t outSize, + ISzAlloc *allocMain) +{ + SRes res; + CSzFolder folder; + CSzData sd; + + const Byte *data = p->CodersData + p->FoCodersOffsets[folderIndex]; + sd.Data = data; + sd.Size = p->FoCodersOffsets[folderIndex + 1] - p->FoCodersOffsets[folderIndex]; + + res = SzGetNextFolderItem(&folder, &sd); + + if (res != SZ_OK) + return res; + + if (sd.Size != 0 + || folder.UnpackStream != p->FoToMainUnpackSizeIndex[folderIndex] + || outSize != SzAr_GetFolderUnpackSize(p, folderIndex)) + return SZ_ERROR_FAIL; + { + unsigned i; + Byte *tempBuf[3] = { 0, 0, 0}; + + res = SzFolder_Decode2(&folder, data, + &p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex]], + p->PackPositions + p->FoStartPackStreamIndex[folderIndex], + inStream, startPos, + outBuffer, (SizeT)outSize, allocMain, tempBuf); + + for (i = 0; i < 3; i++) + IAlloc_Free(allocMain, tempBuf[i]); + + if (res == SZ_OK) + if (SzBitWithVals_Check(&p->FolderCRCs, folderIndex)) + if (CrcCalc(outBuffer, outSize) != p->FolderCRCs.Vals[folderIndex]) + res = SZ_ERROR_CRC; + + return res; + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zFile.c b/Provenance/LzmaSDKObjC/lzma/C/7zFile.c new file mode 100644 index 0000000000..98fe7164f5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zFile.c @@ -0,0 +1,286 @@ +/* 7zFile.c -- File IO +2009-11-24 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zFile.h" + +#ifndef USE_WINDOWS_FILE + +#ifndef UNDER_CE +#include +#endif + +#else + +/* + ReadFile and WriteFile functions in Windows have BUG: + If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) + from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES + (Insufficient system resources exist to complete the requested service). + Probably in some version of Windows there are problems with other sizes: + for 32 MB (maybe also for 16 MB). + And message can be "Network connection was lost" +*/ + +#define kChunkSizeMax (1 << 22) + +#endif + +void File_Construct(CSzFile *p) +{ + #ifdef USE_WINDOWS_FILE + p->handle = INVALID_HANDLE_VALUE; + #else + p->file = NULL; + #endif +} + +#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) +static WRes File_Open(CSzFile *p, const char *name, int writeMode) +{ + #ifdef USE_WINDOWS_FILE + p->handle = CreateFileA(name, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); + #else + p->file = fopen(name, writeMode ? "wb+" : "rb"); + return (p->file != 0) ? 0 : + #ifdef UNDER_CE + 2; /* ENOENT */ + #else + errno; + #endif + #endif +} + +WRes InFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 0); } +WRes OutFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 1); } +#endif + +#ifdef USE_WINDOWS_FILE +static WRes File_OpenW(CSzFile *p, const WCHAR *name, int writeMode) +{ + p->handle = CreateFileW(name, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); +} +WRes InFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 0); } +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 1); } +#endif + +WRes File_Close(CSzFile *p) +{ + #ifdef USE_WINDOWS_FILE + if (p->handle != INVALID_HANDLE_VALUE) + { + if (!CloseHandle(p->handle)) + return GetLastError(); + p->handle = INVALID_HANDLE_VALUE; + } + #else + if (p->file != NULL) + { + int res = fclose(p->file); + if (res != 0) + return res; + p->file = NULL; + } + #endif + return 0; +} + +WRes File_Read(CSzFile *p, void *data, size_t *size) +{ + size_t originalSize = *size; + if (originalSize == 0) + return 0; + + #ifdef USE_WINDOWS_FILE + + *size = 0; + do + { + DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; + DWORD processed = 0; + BOOL res = ReadFile(p->handle, data, curSize, &processed, NULL); + data = (void *)((Byte *)data + processed); + originalSize -= processed; + *size += processed; + if (!res) + return GetLastError(); + if (processed == 0) + break; + } + while (originalSize > 0); + return 0; + + #else + + *size = fread(data, 1, originalSize, p->file); + if (*size == originalSize) + return 0; + return ferror(p->file); + + #endif +} + +WRes File_Write(CSzFile *p, const void *data, size_t *size) +{ + size_t originalSize = *size; + if (originalSize == 0) + return 0; + + #ifdef USE_WINDOWS_FILE + + *size = 0; + do + { + DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; + DWORD processed = 0; + BOOL res = WriteFile(p->handle, data, curSize, &processed, NULL); + data = (void *)((Byte *)data + processed); + originalSize -= processed; + *size += processed; + if (!res) + return GetLastError(); + if (processed == 0) + break; + } + while (originalSize > 0); + return 0; + + #else + + *size = fwrite(data, 1, originalSize, p->file); + if (*size == originalSize) + return 0; + return ferror(p->file); + + #endif +} + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin) +{ + #ifdef USE_WINDOWS_FILE + + LARGE_INTEGER value; + DWORD moveMethod; + value.LowPart = (DWORD)*pos; + value.HighPart = (LONG)((UInt64)*pos >> 16 >> 16); /* for case when UInt64 is 32-bit only */ + switch (origin) + { + case SZ_SEEK_SET: moveMethod = FILE_BEGIN; break; + case SZ_SEEK_CUR: moveMethod = FILE_CURRENT; break; + case SZ_SEEK_END: moveMethod = FILE_END; break; + default: return ERROR_INVALID_PARAMETER; + } + value.LowPart = SetFilePointer(p->handle, value.LowPart, &value.HighPart, moveMethod); + if (value.LowPart == 0xFFFFFFFF) + { + WRes res = GetLastError(); + if (res != NO_ERROR) + return res; + } + *pos = ((Int64)value.HighPart << 32) | value.LowPart; + return 0; + + #else + + int moveMethod; + int res; + switch (origin) + { + case SZ_SEEK_SET: moveMethod = SEEK_SET; break; + case SZ_SEEK_CUR: moveMethod = SEEK_CUR; break; + case SZ_SEEK_END: moveMethod = SEEK_END; break; + default: return 1; + } + res = fseek(p->file, (long)*pos, moveMethod); + *pos = ftell(p->file); + return res; + + #endif +} + +WRes File_GetLength(CSzFile *p, UInt64 *length) +{ + #ifdef USE_WINDOWS_FILE + + DWORD sizeHigh; + DWORD sizeLow = GetFileSize(p->handle, &sizeHigh); + if (sizeLow == 0xFFFFFFFF) + { + DWORD res = GetLastError(); + if (res != NO_ERROR) + return res; + } + *length = (((UInt64)sizeHigh) << 32) + sizeLow; + return 0; + + #else + + long pos = ftell(p->file); + int res = fseek(p->file, 0, SEEK_END); + *length = ftell(p->file); + fseek(p->file, pos, SEEK_SET); + return res; + + #endif +} + + +/* ---------- FileSeqInStream ---------- */ + +static SRes FileSeqInStream_Read(void *pp, void *buf, size_t *size) +{ + CFileSeqInStream *p = (CFileSeqInStream *)pp; + return File_Read(&p->file, buf, size) == 0 ? SZ_OK : SZ_ERROR_READ; +} + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p) +{ + p->s.Read = FileSeqInStream_Read; +} + + +/* ---------- FileInStream ---------- */ + +static SRes FileInStream_Read(void *pp, void *buf, size_t *size) +{ + CFileInStream *p = (CFileInStream *)pp; + return (File_Read(&p->file, buf, size) == 0) ? SZ_OK : SZ_ERROR_READ; +} + +static SRes FileInStream_Seek(void *pp, Int64 *pos, ESzSeek origin) +{ + CFileInStream *p = (CFileInStream *)pp; + return File_Seek(&p->file, pos, origin); +} + +void FileInStream_CreateVTable(CFileInStream *p) +{ + p->s.Read = FileInStream_Read; + p->s.Seek = FileInStream_Seek; +} + + +/* ---------- FileOutStream ---------- */ + +static size_t FileOutStream_Write(void *pp, const void *data, size_t size) +{ + CFileOutStream *p = (CFileOutStream *)pp; + File_Write(&p->file, data, &size); + return size; +} + +void FileOutStream_CreateVTable(CFileOutStream *p) +{ + p->s.Write = FileOutStream_Write; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zFile.h b/Provenance/LzmaSDKObjC/lzma/C/7zFile.h new file mode 100644 index 0000000000..d62a192609 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zFile.h @@ -0,0 +1,83 @@ +/* 7zFile.h -- File IO +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __7Z_FILE_H +#define __7Z_FILE_H + +#ifdef _WIN32 +#define USE_WINDOWS_FILE +#endif + +#ifdef USE_WINDOWS_FILE +#include +#else +#include +#endif + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* ---------- File ---------- */ + +typedef struct +{ + #ifdef USE_WINDOWS_FILE + HANDLE handle; + #else + FILE *file; + #endif +} CSzFile; + +void File_Construct(CSzFile *p); +#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) +WRes InFile_Open(CSzFile *p, const char *name); +WRes OutFile_Open(CSzFile *p, const char *name); +#endif +#ifdef USE_WINDOWS_FILE +WRes InFile_OpenW(CSzFile *p, const WCHAR *name); +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name); +#endif +WRes File_Close(CSzFile *p); + +/* reads max(*size, remain file's size) bytes */ +WRes File_Read(CSzFile *p, void *data, size_t *size); + +/* writes *size bytes */ +WRes File_Write(CSzFile *p, const void *data, size_t *size); + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin); +WRes File_GetLength(CSzFile *p, UInt64 *length); + + +/* ---------- FileInStream ---------- */ + +typedef struct +{ + ISeqInStream s; + CSzFile file; +} CFileSeqInStream; + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p); + + +typedef struct +{ + ISeekInStream s; + CSzFile file; +} CFileInStream; + +void FileInStream_CreateVTable(CFileInStream *p); + + +typedef struct +{ + ISeqOutStream s; + CSzFile file; +} CFileOutStream; + +void FileOutStream_CreateVTable(CFileOutStream *p); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zStream.c b/Provenance/LzmaSDKObjC/lzma/C/7zStream.c new file mode 100644 index 0000000000..5a92d532cc --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zStream.c @@ -0,0 +1,171 @@ +/* 7zStream.c -- 7z Stream functions +2013-11-12 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zTypes.h" + +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType) +{ + while (size != 0) + { + size_t processed = size; + RINOK(stream->Read(stream, buf, &processed)); + if (processed == 0) + return errorType; + buf = (void *)((Byte *)buf + processed); + size -= processed; + } + return SZ_OK; +} + +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size) +{ + return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); +} + +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf) +{ + size_t processed = 1; + RINOK(stream->Read(stream, buf, &processed)); + return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; +} + +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset) +{ + Int64 t = offset; + return stream->Seek(stream, &t, SZ_SEEK_SET); +} + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size) +{ + const void *lookBuf; + if (*size == 0) + return SZ_OK; + RINOK(stream->Look(stream, &lookBuf, size)); + memcpy(buf, lookBuf, *size); + return stream->Skip(stream, *size); +} + +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType) +{ + while (size != 0) + { + size_t processed = size; + RINOK(stream->Read(stream, buf, &processed)); + if (processed == 0) + return errorType; + buf = (void *)((Byte *)buf + processed); + size -= processed; + } + return SZ_OK; +} + +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size) +{ + return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); +} + +static SRes LookToRead_Look_Lookahead(void *pp, const void **buf, size_t *size) +{ + SRes res = SZ_OK; + CLookToRead *p = (CLookToRead *)pp; + size_t size2 = p->size - p->pos; + if (size2 == 0 && *size > 0) + { + p->pos = 0; + size2 = LookToRead_BUF_SIZE; + res = p->realStream->Read(p->realStream, p->buf, &size2); + p->size = size2; + } + if (size2 < *size) + *size = size2; + *buf = p->buf + p->pos; + return res; +} + +static SRes LookToRead_Look_Exact(void *pp, const void **buf, size_t *size) +{ + SRes res = SZ_OK; + CLookToRead *p = (CLookToRead *)pp; + size_t size2 = p->size - p->pos; + if (size2 == 0 && *size > 0) + { + p->pos = 0; + if (*size > LookToRead_BUF_SIZE) + *size = LookToRead_BUF_SIZE; + res = p->realStream->Read(p->realStream, p->buf, size); + size2 = p->size = *size; + } + if (size2 < *size) + *size = size2; + *buf = p->buf + p->pos; + return res; +} + +static SRes LookToRead_Skip(void *pp, size_t offset) +{ + CLookToRead *p = (CLookToRead *)pp; + p->pos += offset; + return SZ_OK; +} + +static SRes LookToRead_Read(void *pp, void *buf, size_t *size) +{ + CLookToRead *p = (CLookToRead *)pp; + size_t rem = p->size - p->pos; + if (rem == 0) + return p->realStream->Read(p->realStream, buf, size); + if (rem > *size) + rem = *size; + memcpy(buf, p->buf + p->pos, rem); + p->pos += rem; + *size = rem; + return SZ_OK; +} + +static SRes LookToRead_Seek(void *pp, Int64 *pos, ESzSeek origin) +{ + CLookToRead *p = (CLookToRead *)pp; + p->pos = p->size = 0; + return p->realStream->Seek(p->realStream, pos, origin); +} + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead) +{ + p->s.Look = lookahead ? + LookToRead_Look_Lookahead : + LookToRead_Look_Exact; + p->s.Skip = LookToRead_Skip; + p->s.Read = LookToRead_Read; + p->s.Seek = LookToRead_Seek; +} + +void LookToRead_Init(CLookToRead *p) +{ + p->pos = p->size = 0; +} + +static SRes SecToLook_Read(void *pp, void *buf, size_t *size) +{ + CSecToLook *p = (CSecToLook *)pp; + return LookInStream_LookRead(p->realStream, buf, size); +} + +void SecToLook_CreateVTable(CSecToLook *p) +{ + p->s.Read = SecToLook_Read; +} + +static SRes SecToRead_Read(void *pp, void *buf, size_t *size) +{ + CSecToRead *p = (CSecToRead *)pp; + return p->realStream->Read(p->realStream, buf, size); +} + +void SecToRead_CreateVTable(CSecToRead *p) +{ + p->s.Read = SecToRead_Read; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zTypes.h b/Provenance/LzmaSDKObjC/lzma/C/7zTypes.h new file mode 100644 index 0000000000..f5652d9cab --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zTypes.h @@ -0,0 +1,262 @@ +/* 7zTypes.h -- Basic types +2013-11-12 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#ifdef _WIN32 +/* #include */ +#endif + +#include "../../src/LzmaAppleCommon.h" + +#include + +#ifndef EXTERN_C_BEGIN +#ifdef __cplusplus +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_BEGIN +#define EXTERN_C_END +#endif +#endif + +EXTERN_C_BEGIN + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + +#ifdef _WIN32 +/* typedef DWORD WRes; */ +typedef unsigned WRes; +#else +typedef int WRes; +#endif + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +#if !defined(__MACTYPES__) && !defined(__COREFOUNDATION_COREFOUNDATION__) +typedef unsigned long UInt32; +#endif +#else +typedef int Int32; +#if !defined(__MACTYPES__) && !defined(__COREFOUNDATION_COREFOUNDATION__) +typedef unsigned int UInt32; +#endif +#endif + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#define UINT64_CONST(n) n +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#define UINT64_CONST(n) n ## ULL +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int Bool; +#define True 1 +#define False 0 + + +#ifdef _WIN32 +#define MY_STD_CALL __stdcall +#else +#define MY_STD_CALL +#endif + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_CDECL __cdecl +#define MY_FAST_CALL __fastcall + +#else + +#define MY_NO_INLINE +#define MY_CDECL +#define MY_FAST_CALL + +#endif + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct +{ + Byte (*Read)(void *p); /* reads one byte, returns 0 in case of EOF or error */ +} IByteIn; + +typedef struct +{ + void (*Write)(void *p, Byte b); +} IByteOut; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +} ISeqInStream; + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); + +typedef struct +{ + size_t (*Write)(void *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +} ISeqOutStream; + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + +typedef struct +{ + SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ISeekInStream; + +typedef struct +{ + SRes (*Look)(void *p, const void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(void *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(void *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); +} ILookInStream; + +SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); + +#define LookToRead_BUF_SIZE (1 << 14) + +typedef struct +{ + ILookInStream s; + ISeekInStream *realStream; + size_t pos; + size_t size; + Byte buf[LookToRead_BUF_SIZE]; +} CLookToRead; + +void LookToRead_CreateVTable(CLookToRead *p, int lookahead); +void LookToRead_Init(CLookToRead *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + +typedef struct +{ + ISeqInStream s; + ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + +typedef struct +{ + SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +} ICompressProgress; + +typedef struct +{ + void *(*Alloc)(void *p, size_t size); + void (*Free)(void *p, void *address); /* address can be 0 */ +} ISzAlloc; + +#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) +#define IAlloc_Free(p, a) (p)->Free((p), a) + +#ifdef _WIN32 + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#endif + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/7zVersion.h b/Provenance/LzmaSDKObjC/lzma/C/7zVersion.h new file mode 100644 index 0000000000..acb67a94e5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/7zVersion.h @@ -0,0 +1,19 @@ +#define MY_VER_MAJOR 16 +#define MY_VER_MINOR 04 +#define MY_VER_BUILD 0 +#define MY_VERSION_NUMBERS "16.04" +#define MY_VERSION "16.04" +#define MY_DATE "2016-10-04" +#undef MY_COPYRIGHT +#undef MY_VERSION_COPYRIGHT_DATE +#define MY_AUTHOR_NAME "Igor Pavlov" +#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain" +#define MY_COPYRIGHT_CR "Copyright (c) 1999-2016 Igor Pavlov" + +#ifdef USE_COPYRIGHT_CR + #define MY_COPYRIGHT MY_COPYRIGHT_CR +#else + #define MY_COPYRIGHT MY_COPYRIGHT_PD +#endif + +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION " : " MY_COPYRIGHT " : " MY_DATE diff --git a/Provenance/LzmaSDKObjC/lzma/C/Aes.c b/Provenance/LzmaSDKObjC/lzma/C/Aes.c new file mode 100644 index 0000000000..8e658e7517 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Aes.c @@ -0,0 +1,295 @@ +/* Aes.c -- AES encryption / decryption +2016-05-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Aes.h" +#include "CpuArch.h" + +static UInt32 T[256 * 4]; +static const Byte Sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; + +void MY_FAST_CALL AesCbc_Encode(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCbc_Decode(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCtr_Code(UInt32 *ivAes, Byte *data, size_t numBlocks); + +void MY_FAST_CALL AesCbc_Encode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCbc_Decode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCtr_Code_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks); + +AES_CODE_FUNC g_AesCbc_Encode; +AES_CODE_FUNC g_AesCbc_Decode; +AES_CODE_FUNC g_AesCtr_Code; + +static UInt32 D[256 * 4]; +static Byte InvS[256]; + +static const Byte Rcon[11] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 }; + +#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF) + +#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24)) + +#define gb0(x) ( (x) & 0xFF) +#define gb1(x) (((x) >> ( 8)) & 0xFF) +#define gb2(x) (((x) >> (16)) & 0xFF) +#define gb3(x) (((x) >> (24)) & 0xFF) + +void AesGenTables(void) +{ + unsigned i; + for (i = 0; i < 256; i++) + InvS[Sbox[i]] = (Byte)i; + + for (i = 0; i < 256; i++) + { + { + UInt32 a1 = Sbox[i]; + UInt32 a2 = xtime(a1); + UInt32 a3 = a2 ^ a1; + T[ i] = Ui32(a2, a1, a1, a3); + T[0x100 + i] = Ui32(a3, a2, a1, a1); + T[0x200 + i] = Ui32(a1, a3, a2, a1); + T[0x300 + i] = Ui32(a1, a1, a3, a2); + } + { + UInt32 a1 = InvS[i]; + UInt32 a2 = xtime(a1); + UInt32 a4 = xtime(a2); + UInt32 a8 = xtime(a4); + UInt32 a9 = a8 ^ a1; + UInt32 aB = a8 ^ a2 ^ a1; + UInt32 aD = a8 ^ a4 ^ a1; + UInt32 aE = a8 ^ a4 ^ a2; + D[ i] = Ui32(aE, a9, aD, aB); + D[0x100 + i] = Ui32(aB, aE, a9, aD); + D[0x200 + i] = Ui32(aD, aB, aE, a9); + D[0x300 + i] = Ui32(a9, aD, aB, aE); + } + } + + g_AesCbc_Encode = AesCbc_Encode; + g_AesCbc_Decode = AesCbc_Decode; + g_AesCtr_Code = AesCtr_Code; + + #ifdef MY_CPU_X86_OR_AMD64 + if (CPU_Is_Aes_Supported()) + { + g_AesCbc_Encode = AesCbc_Encode_Intel; + g_AesCbc_Decode = AesCbc_Decode_Intel; + g_AesCtr_Code = AesCtr_Code_Intel; + } + #endif +} + + +#define HT(i, x, s) (T + (x << 8))[gb ## x(s[(i + x) & 3])] + +#define HT4(m, i, s, p) m[i] = \ + HT(i, 0, s) ^ \ + HT(i, 1, s) ^ \ + HT(i, 2, s) ^ \ + HT(i, 3, s) ^ w[p + i] + +#define HT16(m, s, p) \ + HT4(m, 0, s, p); \ + HT4(m, 1, s, p); \ + HT4(m, 2, s, p); \ + HT4(m, 3, s, p); \ + +#define FT(i, x) Sbox[gb ## x(m[(i + x) & 3])] +#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i]; + + +#define HD(i, x, s) (D + (x << 8))[gb ## x(s[(i - x) & 3])] + +#define HD4(m, i, s, p) m[i] = \ + HD(i, 0, s) ^ \ + HD(i, 1, s) ^ \ + HD(i, 2, s) ^ \ + HD(i, 3, s) ^ w[p + i]; + +#define HD16(m, s, p) \ + HD4(m, 0, s, p); \ + HD4(m, 1, s, p); \ + HD4(m, 2, s, p); \ + HD4(m, 3, s, p); \ + +#define FD(i, x) InvS[gb ## x(m[(i - x) & 3])] +#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i]; + +void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize) +{ + unsigned i, wSize; + wSize = keySize + 28; + keySize /= 4; + w[0] = ((UInt32)keySize / 2) + 3; + w += 4; + + for (i = 0; i < keySize; i++, key += 4) + w[i] = GetUi32(key); + + for (; i < wSize; i++) + { + UInt32 t = w[i - 1]; + unsigned rem = i % keySize; + if (rem == 0) + t = Ui32(Sbox[gb1(t)] ^ Rcon[i / keySize], Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]); + else if (keySize > 6 && rem == 4) + t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]); + w[i] = w[i - keySize] ^ t; + } +} + +void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize) +{ + unsigned i, num; + Aes_SetKey_Enc(w, key, keySize); + num = keySize + 20; + w += 8; + for (i = 0; i < num; i++) + { + UInt32 r = w[i]; + w[i] = + D[ (unsigned)Sbox[gb0(r)]] ^ + D[0x100 + (unsigned)Sbox[gb1(r)]] ^ + D[0x200 + (unsigned)Sbox[gb2(r)]] ^ + D[0x300 + (unsigned)Sbox[gb3(r)]]; + } +} + +/* Aes_Encode and Aes_Decode functions work with little-endian words. + src and dest are pointers to 4 UInt32 words. + src and dest can point to same block */ + +static void Aes_Encode(const UInt32 *w, UInt32 *dest, const UInt32 *src) +{ + UInt32 s[4]; + UInt32 m[4]; + UInt32 numRounds2 = w[0]; + w += 4; + s[0] = src[0] ^ w[0]; + s[1] = src[1] ^ w[1]; + s[2] = src[2] ^ w[2]; + s[3] = src[3] ^ w[3]; + w += 4; + for (;;) + { + HT16(m, s, 0); + if (--numRounds2 == 0) + break; + HT16(s, m, 4); + w += 8; + } + w += 4; + FT4(0); FT4(1); FT4(2); FT4(3); +} + +static void Aes_Decode(const UInt32 *w, UInt32 *dest, const UInt32 *src) +{ + UInt32 s[4]; + UInt32 m[4]; + UInt32 numRounds2 = w[0]; + w += 4 + numRounds2 * 8; + s[0] = src[0] ^ w[0]; + s[1] = src[1] ^ w[1]; + s[2] = src[2] ^ w[2]; + s[3] = src[3] ^ w[3]; + for (;;) + { + w -= 8; + HD16(m, s, 4); + if (--numRounds2 == 0) + break; + HD16(s, m, 0); + } + FD4(0); FD4(1); FD4(2); FD4(3); +} + +void AesCbc_Init(UInt32 *p, const Byte *iv) +{ + unsigned i; + for (i = 0; i < 4; i++) + p[i] = GetUi32(iv + i * 4); +} + +void MY_FAST_CALL AesCbc_Encode(UInt32 *p, Byte *data, size_t numBlocks) +{ + for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE) + { + p[0] ^= GetUi32(data); + p[1] ^= GetUi32(data + 4); + p[2] ^= GetUi32(data + 8); + p[3] ^= GetUi32(data + 12); + + Aes_Encode(p + 4, p, p); + + SetUi32(data, p[0]); + SetUi32(data + 4, p[1]); + SetUi32(data + 8, p[2]); + SetUi32(data + 12, p[3]); + } +} + +void MY_FAST_CALL AesCbc_Decode(UInt32 *p, Byte *data, size_t numBlocks) +{ + UInt32 in[4], out[4]; + for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE) + { + in[0] = GetUi32(data); + in[1] = GetUi32(data + 4); + in[2] = GetUi32(data + 8); + in[3] = GetUi32(data + 12); + + Aes_Decode(p + 4, out, in); + + SetUi32(data, p[0] ^ out[0]); + SetUi32(data + 4, p[1] ^ out[1]); + SetUi32(data + 8, p[2] ^ out[2]); + SetUi32(data + 12, p[3] ^ out[3]); + + p[0] = in[0]; + p[1] = in[1]; + p[2] = in[2]; + p[3] = in[3]; + } +} + +void MY_FAST_CALL AesCtr_Code(UInt32 *p, Byte *data, size_t numBlocks) +{ + for (; numBlocks != 0; numBlocks--) + { + UInt32 temp[4]; + Byte buf[16]; + int i; + + if (++p[0] == 0) + p[1]++; + + Aes_Encode(p + 4, temp, p); + + SetUi32(buf, temp[0]); + SetUi32(buf + 4, temp[1]); + SetUi32(buf + 8, temp[2]); + SetUi32(buf + 12, temp[3]); + + for (i = 0; i < 16; i++) + *data++ ^= buf[i]; + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Aes.h b/Provenance/LzmaSDKObjC/lzma/C/Aes.h new file mode 100644 index 0000000000..381e979d1b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Aes.h @@ -0,0 +1,38 @@ +/* Aes.h -- AES encryption / decryption +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __AES_H +#define __AES_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define AES_BLOCK_SIZE 16 + +/* Call AesGenTables one time before other AES functions */ +void AesGenTables(void); + +/* UInt32 pointers must be 16-byte aligned */ + +/* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */ +#define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4) + +/* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */ +/* keySize = 16 or 24 or 32 (bytes) */ +typedef void (MY_FAST_CALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize); +void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize); +void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize); + +/* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */ +void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */ +/* data - 16-byte aligned pointer to data */ +/* numBlocks - the number of 16-byte blocks in data array */ +typedef void (MY_FAST_CALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks); +extern AES_CODE_FUNC g_AesCbc_Encode; +extern AES_CODE_FUNC g_AesCbc_Decode; +extern AES_CODE_FUNC g_AesCtr_Code; + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/AesOpt.c b/Provenance/LzmaSDKObjC/lzma/C/AesOpt.c new file mode 100644 index 0000000000..e5d4d26114 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/AesOpt.c @@ -0,0 +1,184 @@ +/* AesOpt.c -- Intel's AES +2013-11-12 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifdef MY_CPU_X86_OR_AMD64 +#if _MSC_VER >= 1500 +#define USE_INTEL_AES +#endif +#endif + +#ifdef USE_INTEL_AES + +#include + +void MY_FAST_CALL AesCbc_Encode_Intel(__m128i *p, __m128i *data, size_t numBlocks) +{ + __m128i m = *p; + for (; numBlocks != 0; numBlocks--, data++) + { + UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1; + const __m128i *w = p + 3; + m = _mm_xor_si128(m, *data); + m = _mm_xor_si128(m, p[2]); + do + { + m = _mm_aesenc_si128(m, w[0]); + m = _mm_aesenc_si128(m, w[1]); + w += 2; + } + while (--numRounds2 != 0); + m = _mm_aesenc_si128(m, w[0]); + m = _mm_aesenclast_si128(m, w[1]); + *data = m; + } + *p = m; +} + +#define NUM_WAYS 3 + +#define AES_OP_W(op, n) { \ + const __m128i t = w[n]; \ + m0 = op(m0, t); \ + m1 = op(m1, t); \ + m2 = op(m2, t); \ + } + +#define AES_DEC(n) AES_OP_W(_mm_aesdec_si128, n) +#define AES_DEC_LAST(n) AES_OP_W(_mm_aesdeclast_si128, n) +#define AES_ENC(n) AES_OP_W(_mm_aesenc_si128, n) +#define AES_ENC_LAST(n) AES_OP_W(_mm_aesenclast_si128, n) + +void MY_FAST_CALL AesCbc_Decode_Intel(__m128i *p, __m128i *data, size_t numBlocks) +{ + __m128i iv = *p; + for (; numBlocks >= NUM_WAYS; numBlocks -= NUM_WAYS, data += NUM_WAYS) + { + UInt32 numRounds2 = *(const UInt32 *)(p + 1); + const __m128i *w = p + numRounds2 * 2; + __m128i m0, m1, m2; + { + const __m128i t = w[2]; + m0 = _mm_xor_si128(t, data[0]); + m1 = _mm_xor_si128(t, data[1]); + m2 = _mm_xor_si128(t, data[2]); + } + numRounds2--; + do + { + AES_DEC(1) + AES_DEC(0) + w -= 2; + } + while (--numRounds2 != 0); + AES_DEC(1) + AES_DEC_LAST(0) + + { + __m128i t; + t = _mm_xor_si128(m0, iv); iv = data[0]; data[0] = t; + t = _mm_xor_si128(m1, iv); iv = data[1]; data[1] = t; + t = _mm_xor_si128(m2, iv); iv = data[2]; data[2] = t; + } + } + for (; numBlocks != 0; numBlocks--, data++) + { + UInt32 numRounds2 = *(const UInt32 *)(p + 1); + const __m128i *w = p + numRounds2 * 2; + __m128i m = _mm_xor_si128(w[2], *data); + numRounds2--; + do + { + m = _mm_aesdec_si128(m, w[1]); + m = _mm_aesdec_si128(m, w[0]); + w -= 2; + } + while (--numRounds2 != 0); + m = _mm_aesdec_si128(m, w[1]); + m = _mm_aesdeclast_si128(m, w[0]); + + m = _mm_xor_si128(m, iv); + iv = *data; + *data = m; + } + *p = iv; +} + +void MY_FAST_CALL AesCtr_Code_Intel(__m128i *p, __m128i *data, size_t numBlocks) +{ + __m128i ctr = *p; + __m128i one; + one.m128i_u64[0] = 1; + one.m128i_u64[1] = 0; + for (; numBlocks >= NUM_WAYS; numBlocks -= NUM_WAYS, data += NUM_WAYS) + { + UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1; + const __m128i *w = p; + __m128i m0, m1, m2; + { + const __m128i t = w[2]; + ctr = _mm_add_epi64(ctr, one); m0 = _mm_xor_si128(ctr, t); + ctr = _mm_add_epi64(ctr, one); m1 = _mm_xor_si128(ctr, t); + ctr = _mm_add_epi64(ctr, one); m2 = _mm_xor_si128(ctr, t); + } + w += 3; + do + { + AES_ENC(0) + AES_ENC(1) + w += 2; + } + while (--numRounds2 != 0); + AES_ENC(0) + AES_ENC_LAST(1) + data[0] = _mm_xor_si128(data[0], m0); + data[1] = _mm_xor_si128(data[1], m1); + data[2] = _mm_xor_si128(data[2], m2); + } + for (; numBlocks != 0; numBlocks--, data++) + { + UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1; + const __m128i *w = p; + __m128i m; + ctr = _mm_add_epi64(ctr, one); + m = _mm_xor_si128(ctr, p[2]); + w += 3; + do + { + m = _mm_aesenc_si128(m, w[0]); + m = _mm_aesenc_si128(m, w[1]); + w += 2; + } + while (--numRounds2 != 0); + m = _mm_aesenc_si128(m, w[0]); + m = _mm_aesenclast_si128(m, w[1]); + *data = _mm_xor_si128(*data, m); + } + *p = ctr; +} + +#else + +void MY_FAST_CALL AesCbc_Encode(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCbc_Decode(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCtr_Code(UInt32 *ivAes, Byte *data, size_t numBlocks); + +void MY_FAST_CALL AesCbc_Encode_Intel(UInt32 *p, Byte *data, size_t numBlocks) +{ + AesCbc_Encode(p, data, numBlocks); +} + +void MY_FAST_CALL AesCbc_Decode_Intel(UInt32 *p, Byte *data, size_t numBlocks) +{ + AesCbc_Decode(p, data, numBlocks); +} + +void MY_FAST_CALL AesCtr_Code_Intel(UInt32 *p, Byte *data, size_t numBlocks) +{ + AesCtr_Code(p, data, numBlocks); +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Alloc.c b/Provenance/LzmaSDKObjC/lzma/C/Alloc.c new file mode 100644 index 0000000000..9f1d036afe --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Alloc.c @@ -0,0 +1,136 @@ +/* Alloc.c -- Memory allocation functions +2015-02-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#ifdef _WIN32 +#include +#endif +#include + +#include "Alloc.h" + +/* #define _SZ_ALLOC_DEBUG */ + +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef _SZ_ALLOC_DEBUG +#include +int g_allocCount = 0; +int g_allocCountMid = 0; +int g_allocCountBig = 0; +#endif + +void *MyAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + { + void *p = malloc(size); + fprintf(stderr, "\nAlloc %10d bytes, count = %10d, addr = %8X", size, g_allocCount++, (unsigned)p); + return p; + } + #else + return malloc(size); + #endif +} + +void MyFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree; count = %10d, addr = %8X", --g_allocCount, (unsigned)address); + #endif + free(address); +} + +#ifdef _WIN32 + +void *MidAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++); + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void MidFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid); + #endif + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#ifndef MEM_LARGE_PAGES +#undef _7ZIP_LARGE_PAGES +#endif + +#ifdef _7ZIP_LARGE_PAGES +SIZE_T g_LargePageSize = 0; +typedef SIZE_T (WINAPI *GetLargePageMinimumP)(); +#endif + +void SetLargePageSize() +{ + #ifdef _7ZIP_LARGE_PAGES + SIZE_T size = 0; + GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); + if (largePageMinimum == 0) + return; + size = largePageMinimum(); + if (size == 0 || (size & (size - 1)) != 0) + return; + g_LargePageSize = size; + #endif +} + + +void *BigAlloc(size_t size) +{ + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++); + #endif + + #ifdef _7ZIP_LARGE_PAGES + if (g_LargePageSize != 0 && g_LargePageSize <= (1 << 30) && size >= (1 << 18)) + { + void *res = VirtualAlloc(0, (size + g_LargePageSize - 1) & (~(g_LargePageSize - 1)), + MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE); + if (res != 0) + return res; + } + #endif + return VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE); +} + +void BigFree(void *address) +{ + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig); + #endif + + if (address == 0) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#endif + + +static void *SzAlloc(void *p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } +static void SzFree(void *p, void *address) { UNUSED_VAR(p); MyFree(address); } +ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +static void *SzBigAlloc(void *p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } +static void SzBigFree(void *p, void *address) { UNUSED_VAR(p); BigFree(address); } +ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; diff --git a/Provenance/LzmaSDKObjC/lzma/C/Alloc.h b/Provenance/LzmaSDKObjC/lzma/C/Alloc.h new file mode 100644 index 0000000000..73b282a071 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Alloc.h @@ -0,0 +1,37 @@ +/* Alloc.h -- Memory allocation functions +2015-02-21 : Igor Pavlov : Public domain */ + +#ifndef __COMMON_ALLOC_H +#define __COMMON_ALLOC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +void *MyAlloc(size_t size); +void MyFree(void *address); + +#ifdef _WIN32 + +void SetLargePageSize(); + +void *MidAlloc(size_t size); +void MidFree(void *address); +void *BigAlloc(size_t size); +void BigFree(void *address); + +#else + +#define MidAlloc(size) MyAlloc(size) +#define MidFree(address) MyFree(address) +#define BigAlloc(size) MyAlloc(size) +#define BigFree(address) MyFree(address) + +#endif + +extern ISzAlloc g_Alloc; +extern ISzAlloc g_BigAlloc; + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Bcj2.c b/Provenance/LzmaSDKObjC/lzma/C/Bcj2.c new file mode 100644 index 0000000000..707362a615 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Bcj2.c @@ -0,0 +1,256 @@ +/* Bcj2.c -- BCJ2 Decoder (Converter for x86 code) +2015-08-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bcj2.h" +#include "CpuArch.h" + +#define CProb UInt16 + +#define kTopValue ((UInt32)1 << 24) +#define kNumModelBits 11 +#define kBitModelTotal (1 << kNumModelBits) +#define kNumMoveBits 5 + +#define _IF_BIT_0 ttt = *prob; bound = (p->range >> kNumModelBits) * ttt; if (p->code < bound) +#define _UPDATE_0 p->range = bound; *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define _UPDATE_1 p->range -= bound; p->code -= bound; *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); + +void Bcj2Dec_Init(CBcj2Dec *p) +{ + unsigned i; + + p->state = BCJ2_DEC_STATE_OK; + p->ip = 0; + p->temp[3] = 0; + p->range = 0; + p->code = 0; + for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) + p->probs[i] = kBitModelTotal >> 1; +} + +SRes Bcj2Dec_Decode(CBcj2Dec *p) +{ + if (p->range <= 5) + { + p->state = BCJ2_DEC_STATE_OK; + for (; p->range != 5; p->range++) + { + if (p->range == 1 && p->code != 0) + return SZ_ERROR_DATA; + + if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) + { + p->state = BCJ2_STREAM_RC; + return SZ_OK; + } + + p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + } + + if (p->code == 0xFFFFFFFF) + return SZ_ERROR_DATA; + + p->range = 0xFFFFFFFF; + } + else if (p->state >= BCJ2_DEC_STATE_ORIG_0) + { + while (p->state <= BCJ2_DEC_STATE_ORIG_3) + { + Byte *dest = p->dest; + if (dest == p->destLim) + return SZ_OK; + *dest = p->temp[p->state++ - BCJ2_DEC_STATE_ORIG_0]; + p->dest = dest + 1; + } + } + + /* + if (BCJ2_IS_32BIT_STREAM(p->state)) + { + const Byte *cur = p->bufs[p->state]; + if (cur == p->lims[p->state]) + return SZ_OK; + p->bufs[p->state] = cur + 4; + + { + UInt32 val; + Byte *dest; + SizeT rem; + + p->ip += 4; + val = GetBe32(cur) - p->ip; + dest = p->dest; + rem = p->destLim - dest; + if (rem < 4) + { + SizeT i; + SetUi32(p->temp, val); + for (i = 0; i < rem; i++) + dest[i] = p->temp[i]; + p->dest = dest + rem; + p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; + return SZ_OK; + } + SetUi32(dest, val); + p->temp[3] = (Byte)(val >> 24); + p->dest = dest + 4; + p->state = BCJ2_DEC_STATE_OK; + } + } + */ + + for (;;) + { + if (BCJ2_IS_32BIT_STREAM(p->state)) + p->state = BCJ2_DEC_STATE_OK; + else + { + if (p->range < kTopValue) + { + if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) + { + p->state = BCJ2_STREAM_RC; + return SZ_OK; + } + p->range <<= 8; + p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + } + + { + const Byte *src = p->bufs[BCJ2_STREAM_MAIN]; + const Byte *srcLim; + Byte *dest; + SizeT num = p->lims[BCJ2_STREAM_MAIN] - src; + + if (num == 0) + { + p->state = BCJ2_STREAM_MAIN; + return SZ_OK; + } + + dest = p->dest; + if (num > (SizeT)(p->destLim - dest)) + { + num = p->destLim - dest; + if (num == 0) + { + p->state = BCJ2_DEC_STATE_ORIG; + return SZ_OK; + } + } + + srcLim = src + num; + + if (p->temp[3] == 0x0F && (src[0] & 0xF0) == 0x80) + *dest = src[0]; + else for (;;) + { + Byte b = *src; + *dest = b; + if (b != 0x0F) + { + if ((b & 0xFE) == 0xE8) + break; + dest++; + if (++src != srcLim) + continue; + break; + } + dest++; + if (++src == srcLim) + break; + if ((*src & 0xF0) != 0x80) + continue; + *dest = *src; + break; + } + + num = src - p->bufs[BCJ2_STREAM_MAIN]; + + if (src == srcLim) + { + p->temp[3] = src[-1]; + p->bufs[BCJ2_STREAM_MAIN] = src; + p->ip += (UInt32)num; + p->dest += num; + p->state = + p->bufs[BCJ2_STREAM_MAIN] == + p->lims[BCJ2_STREAM_MAIN] ? + (unsigned)BCJ2_STREAM_MAIN : + (unsigned)BCJ2_DEC_STATE_ORIG; + return SZ_OK; + } + + { + UInt32 bound, ttt; + CProb *prob; + Byte b = src[0]; + Byte prev = (Byte)(num == 0 ? p->temp[3] : src[-1]); + + p->temp[3] = b; + p->bufs[BCJ2_STREAM_MAIN] = src + 1; + num++; + p->ip += (UInt32)num; + p->dest += num; + + prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)prev : (b == 0xE9 ? 1 : 0)); + + _IF_BIT_0 + { + _UPDATE_0 + continue; + } + _UPDATE_1 + + } + } + } + + { + UInt32 val; + unsigned cj = (p->temp[3] == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; + const Byte *cur = p->bufs[cj]; + Byte *dest; + SizeT rem; + + if (cur == p->lims[cj]) + { + p->state = cj; + break; + } + + val = GetBe32(cur); + p->bufs[cj] = cur + 4; + + p->ip += 4; + val -= p->ip; + dest = p->dest; + rem = p->destLim - dest; + + if (rem < 4) + { + SizeT i; + SetUi32(p->temp, val); + for (i = 0; i < rem; i++) + dest[i] = p->temp[i]; + p->dest = dest + rem; + p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; + break; + } + + SetUi32(dest, val); + p->temp[3] = (Byte)(val >> 24); + p->dest = dest + 4; + } + } + + if (p->range < kTopValue && p->bufs[BCJ2_STREAM_RC] != p->lims[BCJ2_STREAM_RC]) + { + p->range <<= 8; + p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + } + + return SZ_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Bcj2.h b/Provenance/LzmaSDKObjC/lzma/C/Bcj2.h new file mode 100644 index 0000000000..68893d2d12 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Bcj2.h @@ -0,0 +1,146 @@ +/* Bcj2.h -- BCJ2 Converter for x86 code +2014-11-10 : Igor Pavlov : Public domain */ + +#ifndef __BCJ2_H +#define __BCJ2_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define BCJ2_NUM_STREAMS 4 + +enum +{ + BCJ2_STREAM_MAIN, + BCJ2_STREAM_CALL, + BCJ2_STREAM_JUMP, + BCJ2_STREAM_RC +}; + +enum +{ + BCJ2_DEC_STATE_ORIG_0 = BCJ2_NUM_STREAMS, + BCJ2_DEC_STATE_ORIG_1, + BCJ2_DEC_STATE_ORIG_2, + BCJ2_DEC_STATE_ORIG_3, + + BCJ2_DEC_STATE_ORIG, + BCJ2_DEC_STATE_OK +}; + +enum +{ + BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS, + BCJ2_ENC_STATE_OK +}; + + +#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP) + +/* +CBcj2Dec / CBcj2Enc +bufs sizes: + BUF_SIZE(n) = lims[n] - bufs[n] +bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4: + (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0 + (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0 +*/ + +/* +CBcj2Dec: +dest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions: + bufs[BCJ2_STREAM_MAIN] >= dest && + bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv + + BUF_SIZE(BCJ2_STREAM_CALL) + + BUF_SIZE(BCJ2_STREAM_JUMP) + tempReserv = 0 : for first call of Bcj2Dec_Decode + tempReserv = 4 : for any other calls of Bcj2Dec_Decode + overlap with offset = 1 is not allowed +*/ + +typedef struct +{ + const Byte *bufs[BCJ2_NUM_STREAMS]; + const Byte *lims[BCJ2_NUM_STREAMS]; + Byte *dest; + const Byte *destLim; + + unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */ + + UInt32 ip; + Byte temp[4]; + UInt32 range; + UInt32 code; + UInt16 probs[2 + 256]; +} CBcj2Dec; + +void Bcj2Dec_Init(CBcj2Dec *p); + +/* Returns: SZ_OK or SZ_ERROR_DATA */ +SRes Bcj2Dec_Decode(CBcj2Dec *p); + +#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0) + + + +typedef enum +{ + BCJ2_ENC_FINISH_MODE_CONTINUE, + BCJ2_ENC_FINISH_MODE_END_BLOCK, + BCJ2_ENC_FINISH_MODE_END_STREAM +} EBcj2Enc_FinishMode; + +typedef struct +{ + Byte *bufs[BCJ2_NUM_STREAMS]; + const Byte *lims[BCJ2_NUM_STREAMS]; + const Byte *src; + const Byte *srcLim; + + unsigned state; + EBcj2Enc_FinishMode finishMode; + + Byte prevByte; + + Byte cache; + UInt32 range; + UInt64 low; + UInt64 cacheSize; + + UInt32 ip; + + /* 32-bit ralative offset in JUMP/CALL commands is + - (mod 4 GB) in 32-bit mode + - signed Int32 in 64-bit mode + We use (mod 4 GB) check for fileSize. + Use fileSize up to 2 GB, if you want to support 32-bit and 64-bit code conversion. */ + UInt32 fileIp; + UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */ + UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */ + + UInt32 tempTarget; + unsigned tempPos; + Byte temp[4 * 2]; + + unsigned flushPos; + + UInt16 probs[2 + 256]; +} CBcj2Enc; + +void Bcj2Enc_Init(CBcj2Enc *p); +void Bcj2Enc_Encode(CBcj2Enc *p); + +#define Bcj2Enc_Get_InputData_Size(p) ((SizeT)((p)->srcLim - (p)->src) + (p)->tempPos) +#define Bcj2Enc_IsFinished(p) ((p)->flushPos == 5) + + +#define BCJ2_RELAT_LIMIT_NUM_BITS 26 +#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS) + +/* limit for CBcj2Enc::fileSize variable */ +#define BCJ2_FileSize_MAX ((UInt32)1 << 31) + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Bcj2Enc.c b/Provenance/LzmaSDKObjC/lzma/C/Bcj2Enc.c new file mode 100644 index 0000000000..d437fa0fd8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Bcj2Enc.c @@ -0,0 +1,312 @@ +/* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code) +2014-11-10 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +/* #define SHOW_STAT */ + +#ifdef SHOW_STAT +#include +#define PRF(x) x +#else +#define PRF(x) +#endif + +//#include +#include + +#include "Bcj2.h" +#include "CpuArch.h" + +#define CProb UInt16 + +#define kTopValue ((UInt32)1 << 24) +#define kNumModelBits 11 +#define kBitModelTotal (1 << kNumModelBits) +#define kNumMoveBits 5 + +void Bcj2Enc_Init(CBcj2Enc *p) +{ + unsigned i; + + p->state = BCJ2_ENC_STATE_OK; + p->finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; + + p->prevByte = 0; + + p->cache = 0; + p->range = 0xFFFFFFFF; + p->low = 0; + p->cacheSize = 1; + + p->ip = 0; + + p->fileIp = 0; + p->fileSize = 0; + p->relatLimit = BCJ2_RELAT_LIMIT; + + p->tempPos = 0; + + p->flushPos = 0; + + for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) + p->probs[i] = kBitModelTotal >> 1; +} + +static Bool MY_FAST_CALL RangeEnc_ShiftLow(CBcj2Enc *p) +{ + if ((UInt32)p->low < (UInt32)0xFF000000 || (UInt32)(p->low >> 32) != 0) + { + Byte *buf = p->bufs[BCJ2_STREAM_RC]; + do + { + if (buf == p->lims[BCJ2_STREAM_RC]) + { + p->state = BCJ2_STREAM_RC; + p->bufs[BCJ2_STREAM_RC] = buf; + return True; + } + *buf++ = (Byte)(p->cache + (Byte)(p->low >> 32)); + p->cache = 0xFF; + } + while (--p->cacheSize); + p->bufs[BCJ2_STREAM_RC] = buf; + p->cache = (Byte)((UInt32)p->low >> 24); + } + p->cacheSize++; + p->low = (UInt32)p->low << 8; + return False; +} + +static void Bcj2Enc_Encode_2(CBcj2Enc *p) +{ + if (BCJ2_IS_32BIT_STREAM(p->state)) + { + Byte *cur = p->bufs[p->state]; + if (cur == p->lims[p->state]) + return; + SetBe32(cur, p->tempTarget); + p->bufs[p->state] = cur + 4; + } + + p->state = BCJ2_ENC_STATE_ORIG; + + for (;;) + { + if (p->range < kTopValue) + { + if (RangeEnc_ShiftLow(p)) + return; + p->range <<= 8; + } + + { + { + const Byte *src = p->src; + const Byte *srcLim; + Byte *dest; + SizeT num = p->srcLim - src; + + if (p->finishMode == BCJ2_ENC_FINISH_MODE_CONTINUE) + { + if (num <= 4) + return; + num -= 4; + } + else if (num == 0) + break; + + dest = p->bufs[BCJ2_STREAM_MAIN]; + if (num > (SizeT)(p->lims[BCJ2_STREAM_MAIN] - dest)) + { + num = p->lims[BCJ2_STREAM_MAIN] - dest; + if (num == 0) + { + p->state = BCJ2_STREAM_MAIN; + return; + } + } + + srcLim = src + num; + + if (p->prevByte == 0x0F && (src[0] & 0xF0) == 0x80) + *dest = src[0]; + else for (;;) + { + Byte b = *src; + *dest = b; + if (b != 0x0F) + { + if ((b & 0xFE) == 0xE8) + break; + dest++; + if (++src != srcLim) + continue; + break; + } + dest++; + if (++src == srcLim) + break; + if ((*src & 0xF0) != 0x80) + continue; + *dest = *src; + break; + } + + num = src - p->src; + + if (src == srcLim) + { + p->prevByte = src[-1]; + p->bufs[BCJ2_STREAM_MAIN] = dest; + p->src = src; + p->ip += (UInt32)num; + continue; + } + + { + Byte context = (Byte)(num == 0 ? p->prevByte : src[-1]); + Bool needConvert; + + p->bufs[BCJ2_STREAM_MAIN] = dest + 1; + p->ip += (UInt32)num + 1; + src++; + + needConvert = False; + + if ((SizeT)(p->srcLim - src) >= 4) + { + UInt32 relatVal = GetUi32(src); + if ((p->fileSize == 0 || (UInt32)(p->ip + 4 + relatVal - p->fileIp) < p->fileSize) + && ((relatVal + p->relatLimit) >> 1) < p->relatLimit) + needConvert = True; + } + + { + UInt32 bound; + unsigned ttt; + Byte b = src[-1]; + CProb *prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)context : (b == 0xE9 ? 1 : 0)); + + ttt = *prob; + bound = (p->range >> kNumModelBits) * ttt; + + if (!needConvert) + { + p->range = bound; + *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); + p->src = src; + p->prevByte = b; + continue; + } + + p->low += bound; + p->range -= bound; + *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); + + { + UInt32 relatVal = GetUi32(src); + UInt32 absVal; + p->ip += 4; + absVal = p->ip + relatVal; + p->prevByte = src[3]; + src += 4; + p->src = src; + { + unsigned cj = (b == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; + Byte *cur = p->bufs[cj]; + if (cur == p->lims[cj]) + { + p->state = cj; + p->tempTarget = absVal; + return; + } + SetBe32(cur, absVal); + p->bufs[cj] = cur + 4; + } + } + } + } + } + } + } + + if (p->finishMode != BCJ2_ENC_FINISH_MODE_END_STREAM) + return; + + for (; p->flushPos < 5; p->flushPos++) + if (RangeEnc_ShiftLow(p)) + return; + p->state = BCJ2_ENC_STATE_OK; +} + + +void Bcj2Enc_Encode(CBcj2Enc *p) +{ + PRF(printf("\n")); + PRF(printf("---- ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); + + if (p->tempPos != 0) + { + unsigned extra = 0; + + for (;;) + { + const Byte *src = p->src; + const Byte *srcLim = p->srcLim; + unsigned finishMode = p->finishMode; + + p->src = p->temp; + p->srcLim = p->temp + p->tempPos; + if (src != srcLim) + p->finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; + + PRF(printf(" ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); + + Bcj2Enc_Encode_2(p); + + { + unsigned num = (unsigned)(p->src - p->temp); + unsigned tempPos = p->tempPos - num; + unsigned i; + p->tempPos = tempPos; + for (i = 0; i < tempPos; i++) + p->temp[i] = p->temp[i + num]; + + p->src = src; + p->srcLim = srcLim; + p->finishMode = finishMode; + + if (p->state != BCJ2_ENC_STATE_ORIG || src == srcLim) + return; + + if (extra >= tempPos) + { + p->src = src - tempPos; + p->tempPos = 0; + break; + } + + p->temp[tempPos] = src[0]; + p->tempPos = tempPos + 1; + p->src = src + 1; + extra++; + } + } + } + + PRF(printf("++++ ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); + + Bcj2Enc_Encode_2(p); + + if (p->state == BCJ2_ENC_STATE_ORIG) + { + const Byte *src = p->src; + unsigned rem = (unsigned)(p->srcLim - src); + unsigned i; + for (i = 0; i < rem; i++) + p->temp[i] = src[i]; + p->tempPos = rem; + p->src = src + rem; + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Bra.c b/Provenance/LzmaSDKObjC/lzma/C/Bra.c new file mode 100644 index 0000000000..976810c96e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Bra.c @@ -0,0 +1,135 @@ +/* Bra.c -- Converters for RISC code +2010-04-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bra.h" + +SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + SizeT i; + if (size < 4) + return 0; + size -= 4; + ip += 8; + for (i = 0; i <= size; i += 4) + { + if (data[i + 3] == 0xEB) + { + UInt32 dest; + UInt32 src = ((UInt32)data[i + 2] << 16) | ((UInt32)data[i + 1] << 8) | (data[i + 0]); + src <<= 2; + if (encoding) + dest = ip + (UInt32)i + src; + else + dest = src - (ip + (UInt32)i); + dest >>= 2; + data[i + 2] = (Byte)(dest >> 16); + data[i + 1] = (Byte)(dest >> 8); + data[i + 0] = (Byte)dest; + } + } + return i; +} + +SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + SizeT i; + if (size < 4) + return 0; + size -= 4; + ip += 4; + for (i = 0; i <= size; i += 2) + { + if ((data[i + 1] & 0xF8) == 0xF0 && + (data[i + 3] & 0xF8) == 0xF8) + { + UInt32 dest; + UInt32 src = + (((UInt32)data[i + 1] & 0x7) << 19) | + ((UInt32)data[i + 0] << 11) | + (((UInt32)data[i + 3] & 0x7) << 8) | + (data[i + 2]); + + src <<= 1; + if (encoding) + dest = ip + (UInt32)i + src; + else + dest = src - (ip + (UInt32)i); + dest >>= 1; + + data[i + 1] = (Byte)(0xF0 | ((dest >> 19) & 0x7)); + data[i + 0] = (Byte)(dest >> 11); + data[i + 3] = (Byte)(0xF8 | ((dest >> 8) & 0x7)); + data[i + 2] = (Byte)dest; + i += 2; + } + } + return i; +} + +SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + SizeT i; + if (size < 4) + return 0; + size -= 4; + for (i = 0; i <= size; i += 4) + { + if ((data[i] >> 2) == 0x12 && (data[i + 3] & 3) == 1) + { + UInt32 src = ((UInt32)(data[i + 0] & 3) << 24) | + ((UInt32)data[i + 1] << 16) | + ((UInt32)data[i + 2] << 8) | + ((UInt32)data[i + 3] & (~3)); + + UInt32 dest; + if (encoding) + dest = ip + (UInt32)i + src; + else + dest = src - (ip + (UInt32)i); + data[i + 0] = (Byte)(0x48 | ((dest >> 24) & 0x3)); + data[i + 1] = (Byte)(dest >> 16); + data[i + 2] = (Byte)(dest >> 8); + data[i + 3] &= 0x3; + data[i + 3] |= dest; + } + } + return i; +} + +SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + UInt32 i; + if (size < 4) + return 0; + size -= 4; + for (i = 0; i <= size; i += 4) + { + if ((data[i] == 0x40 && (data[i + 1] & 0xC0) == 0x00) || + (data[i] == 0x7F && (data[i + 1] & 0xC0) == 0xC0)) + { + UInt32 src = + ((UInt32)data[i + 0] << 24) | + ((UInt32)data[i + 1] << 16) | + ((UInt32)data[i + 2] << 8) | + ((UInt32)data[i + 3]); + UInt32 dest; + + src <<= 2; + if (encoding) + dest = ip + i + src; + else + dest = src - (ip + i); + dest >>= 2; + + dest = (((0 - ((dest >> 22) & 1)) << 22) & 0x3FFFFFFF) | (dest & 0x3FFFFF) | 0x40000000; + + data[i + 0] = (Byte)(dest >> 24); + data[i + 1] = (Byte)(dest >> 16); + data[i + 2] = (Byte)(dest >> 8); + data[i + 3] = (Byte)dest; + } + } + return i; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Bra.h b/Provenance/LzmaSDKObjC/lzma/C/Bra.h new file mode 100644 index 0000000000..aba8dce14f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Bra.h @@ -0,0 +1,64 @@ +/* Bra.h -- Branch converters for executables +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __BRA_H +#define __BRA_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* +These functions convert relative addresses to absolute addresses +in CALL instructions to increase the compression ratio. + + In: + data - data buffer + size - size of data + ip - current virtual Instruction Pinter (IP) value + state - state variable for x86 converter + encoding - 0 (for decoding), 1 (for encoding) + + Out: + state - state variable for x86 converter + + Returns: + The number of processed bytes. If you call these functions with multiple calls, + you must start next call with first byte after block of processed bytes. + + Type Endian Alignment LookAhead + + x86 little 1 4 + ARMT little 2 2 + ARM little 4 0 + PPC big 4 0 + SPARC big 4 0 + IA64 little 16 0 + + size must be >= Alignment + LookAhead, if it's not last block. + If (size < Alignment + LookAhead), converter returns 0. + + Example: + + UInt32 ip = 0; + for () + { + ; size must be >= Alignment + LookAhead, if it's not last block + SizeT processed = Convert(data, size, ip, 1); + data += processed; + size -= processed; + ip += processed; + } +*/ + +#define x86_Convert_Init(state) { state = 0; } +SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); +SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Bra86.c b/Provenance/LzmaSDKObjC/lzma/C/Bra86.c new file mode 100644 index 0000000000..8dd3ed48d9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Bra86.c @@ -0,0 +1,82 @@ +/* Bra86.c -- Converter for x86 code (BCJ) +2013-11-12 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bra.h" + +#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) + +SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) +{ + SizeT pos = 0; + UInt32 mask = *state & 7; + if (size < 5) + return 0; + size -= 4; + ip += 5; + + for (;;) + { + Byte *p = data + pos; + const Byte *limit = data + size; + for (; p < limit; p++) + if ((*p & 0xFE) == 0xE8) + break; + + { + SizeT d = (SizeT)(p - data - pos); + pos = (SizeT)(p - data); + if (p >= limit) + { + *state = (d > 2 ? 0 : mask >> (unsigned)d); + return pos; + } + if (d > 2) + mask = 0; + else + { + mask >>= (unsigned)d; + if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(mask >> 1) + 1]))) + { + mask = (mask >> 1) | 4; + pos++; + continue; + } + } + } + + if (Test86MSByte(p[4])) + { + UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); + UInt32 cur = ip + (UInt32)pos; + pos += 5; + if (encoding) + v += cur; + else + v -= cur; + if (mask != 0) + { + unsigned sh = (mask & 6) << 2; + if (Test86MSByte((Byte)(v >> sh))) + { + v ^= (((UInt32)0x100 << sh) - 1); + if (encoding) + v += cur; + else + v -= cur; + } + mask = 0; + } + p[1] = (Byte)v; + p[2] = (Byte)(v >> 8); + p[3] = (Byte)(v >> 16); + p[4] = (Byte)(0 - ((v >> 24) & 1)); + } + else + { + mask = (mask >> 1) | 4; + pos++; + } + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/BraIA64.c b/Provenance/LzmaSDKObjC/lzma/C/BraIA64.c new file mode 100644 index 0000000000..813830c79d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/BraIA64.c @@ -0,0 +1,69 @@ +/* BraIA64.c -- Converter for IA-64 code +2013-11-12 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bra.h" + +static const Byte kBranchTable[32] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 6, 6, 0, 0, 7, 7, + 4, 4, 0, 0, 4, 4, 0, 0 +}; + +SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + SizeT i; + if (size < 16) + return 0; + size -= 16; + for (i = 0; i <= size; i += 16) + { + UInt32 instrTemplate = data[i] & 0x1F; + UInt32 mask = kBranchTable[instrTemplate]; + UInt32 bitPos = 5; + int slot; + for (slot = 0; slot < 3; slot++, bitPos += 41) + { + UInt32 bytePos, bitRes; + UInt64 instruction, instNorm; + int j; + if (((mask >> slot) & 1) == 0) + continue; + bytePos = (bitPos >> 3); + bitRes = bitPos & 0x7; + instruction = 0; + for (j = 0; j < 6; j++) + instruction += (UInt64)data[i + j + bytePos] << (8 * j); + + instNorm = instruction >> bitRes; + if (((instNorm >> 37) & 0xF) == 0x5 && ((instNorm >> 9) & 0x7) == 0) + { + UInt32 src = (UInt32)((instNorm >> 13) & 0xFFFFF); + UInt32 dest; + src |= ((UInt32)(instNorm >> 36) & 1) << 20; + + src <<= 4; + + if (encoding) + dest = ip + (UInt32)i + src; + else + dest = src - (ip + (UInt32)i); + + dest >>= 4; + + instNorm &= ~((UInt64)(0x8FFFFF) << 13); + instNorm |= ((UInt64)(dest & 0xFFFFF) << 13); + instNorm |= ((UInt64)(dest & 0x100000) << (36 - 20)); + + instruction &= (1 << bitRes) - 1; + instruction |= (instNorm << bitRes); + for (j = 0; j < 6; j++) + data[i + j + bytePos] = (Byte)(instruction >> (8 * j)); + } + } + } + return i; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Compiler.h b/Provenance/LzmaSDKObjC/lzma/C/Compiler.h new file mode 100644 index 0000000000..de8fab3749 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Compiler.h @@ -0,0 +1,32 @@ +/* Compiler.h +2015-08-02 : Igor Pavlov : Public domain */ + +#ifndef __7Z_COMPILER_H +#define __7Z_COMPILER_H + +#ifdef _MSC_VER + + #ifdef UNDER_CE + #define RPC_NO_WINDOWS_H + /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ + #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union + #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int + #endif + + #if _MSC_VER >= 1300 + #pragma warning(disable : 4996) // This function or variable may be unsafe + #else + #pragma warning(disable : 4511) // copy constructor could not be generated + #pragma warning(disable : 4512) // assignment operator could not be generated + #pragma warning(disable : 4514) // unreferenced inline function has been removed + #pragma warning(disable : 4702) // unreachable code + #pragma warning(disable : 4710) // not inlined + #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information + #endif + +#endif + +#define UNUSED_VAR(x) (void)x; +/* #define UNUSED_VAR(x) x=x; */ + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/CpuArch.c b/Provenance/LzmaSDKObjC/lzma/C/CpuArch.c new file mode 100644 index 0000000000..f835c2b7bf --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/CpuArch.c @@ -0,0 +1,200 @@ +/* CpuArch.c -- CPU specific code +2016-02-25: Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifdef MY_CPU_X86_OR_AMD64 + +#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__) +#define USE_ASM +#endif + +#if !defined(USE_ASM) && _MSC_VER >= 1500 +#include +#endif + +#if defined(USE_ASM) && !defined(MY_CPU_AMD64) +static UInt32 CheckFlag(UInt32 flag) +{ + #ifdef _MSC_VER + __asm pushfd; + __asm pop EAX; + __asm mov EDX, EAX; + __asm xor EAX, flag; + __asm push EAX; + __asm popfd; + __asm pushfd; + __asm pop EAX; + __asm xor EAX, EDX; + __asm push EDX; + __asm popfd; + __asm and flag, EAX; + #else + __asm__ __volatile__ ( + "pushf\n\t" + "pop %%EAX\n\t" + "movl %%EAX,%%EDX\n\t" + "xorl %0,%%EAX\n\t" + "push %%EAX\n\t" + "popf\n\t" + "pushf\n\t" + "pop %%EAX\n\t" + "xorl %%EDX,%%EAX\n\t" + "push %%EDX\n\t" + "popf\n\t" + "andl %%EAX, %0\n\t": + "=c" (flag) : "c" (flag) : + "%eax", "%edx"); + #endif + return flag; +} +#define CHECK_CPUID_IS_SUPPORTED if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) return False; +#else +#define CHECK_CPUID_IS_SUPPORTED +#endif + +void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) +{ + #ifdef USE_ASM + + #ifdef _MSC_VER + + UInt32 a2, b2, c2, d2; + __asm xor EBX, EBX; + __asm xor ECX, ECX; + __asm xor EDX, EDX; + __asm mov EAX, function; + __asm cpuid; + __asm mov a2, EAX; + __asm mov b2, EBX; + __asm mov c2, ECX; + __asm mov d2, EDX; + + *a = a2; + *b = b2; + *c = c2; + *d = d2; + + #else + + __asm__ __volatile__ ( + #if defined(MY_CPU_AMD64) && defined(__PIC__) + "mov %%rbx, %%rdi;" + "cpuid;" + "xchg %%rbx, %%rdi;" + : "=a" (*a) , + "=D" (*b) , + #elif defined(MY_CPU_X86) && defined(__PIC__) + "mov %%ebx, %%edi;" + "cpuid;" + "xchgl %%ebx, %%edi;" + : "=a" (*a) , + "=D" (*b) , + #else + "cpuid" + : "=a" (*a) , + "=b" (*b) , + #endif + "=c" (*c) , + "=d" (*d) + : "0" (function)) ; + + #endif + + #else + + int CPUInfo[4]; + __cpuid(CPUInfo, function); + *a = CPUInfo[0]; + *b = CPUInfo[1]; + *c = CPUInfo[2]; + *d = CPUInfo[3]; + + #endif +} + +Bool x86cpuid_CheckAndRead(Cx86cpuid *p) +{ + CHECK_CPUID_IS_SUPPORTED + MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]); + MyCPUID(1, &p->ver, &p->b, &p->c, &p->d); + return True; +} + +static const UInt32 kVendors[][3] = +{ + { 0x756E6547, 0x49656E69, 0x6C65746E}, + { 0x68747541, 0x69746E65, 0x444D4163}, + { 0x746E6543, 0x48727561, 0x736C7561} +}; + +int x86cpuid_GetFirm(const Cx86cpuid *p) +{ + unsigned i; + for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++) + { + const UInt32 *v = kVendors[i]; + if (v[0] == p->vendor[0] && + v[1] == p->vendor[1] && + v[2] == p->vendor[2]) + return (int)i; + } + return -1; +} + +Bool CPU_Is_InOrder() +{ + Cx86cpuid p; + int firm; + UInt32 family, model; + if (!x86cpuid_CheckAndRead(&p)) + return True; + + family = x86cpuid_GetFamily(p.ver); + model = x86cpuid_GetModel(p.ver); + + firm = x86cpuid_GetFirm(&p); + + switch (firm) + { + case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && ( + /* In-Order Atom CPU */ + model == 0x1C /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */ + || model == 0x26 /* 45 nm, Z6xx */ + || model == 0x27 /* 32 nm, Z2460 */ + || model == 0x35 /* 32 nm, Z2760 */ + || model == 0x36 /* 32 nm, N2xxx, D2xxx */ + ))); + case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA))); + case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF)); + } + return True; +} + +#if !defined(MY_CPU_AMD64) && defined(_WIN32) +#include +static Bool CPU_Sys_Is_SSE_Supported() +{ + OSVERSIONINFO vi; + vi.dwOSVersionInfoSize = sizeof(vi); + if (!GetVersionEx(&vi)) + return False; + return (vi.dwMajorVersion >= 5); +} +#define CHECK_SYS_SSE_SUPPORT if (!CPU_Sys_Is_SSE_Supported()) return False; +#else +#define CHECK_SYS_SSE_SUPPORT +#endif + +Bool CPU_Is_Aes_Supported() +{ + Cx86cpuid p; + CHECK_SYS_SSE_SUPPORT + if (!x86cpuid_CheckAndRead(&p)) + return False; + return (p.c >> 25) & 1; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/CpuArch.h b/Provenance/LzmaSDKObjC/lzma/C/CpuArch.h new file mode 100644 index 0000000000..ef6083c3b8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/CpuArch.h @@ -0,0 +1,223 @@ +/* CpuArch.h -- CPU specific code +2016-06-09: Igor Pavlov : Public domain */ + +#ifndef __CPU_ARCH_H +#define __CPU_ARCH_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* +MY_CPU_LE means that CPU is LITTLE ENDIAN. +MY_CPU_BE means that CPU is BIG ENDIAN. +If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform. + +MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. +*/ + +#if defined(_M_X64) \ + || defined(_M_AMD64) \ + || defined(__x86_64__) \ + || defined(__AMD64__) \ + || defined(__amd64__) + #define MY_CPU_AMD64 +#endif + +#if defined(MY_CPU_AMD64) \ + || defined(_M_IA64) \ + || defined(__AARCH64EL__) \ + || defined(__AARCH64EB__) + #define MY_CPU_64BIT +#endif + +#if defined(_M_IX86) || defined(__i386__) +#define MY_CPU_X86 +#endif + +#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) +#define MY_CPU_X86_OR_AMD64 +#endif + +#if defined(MY_CPU_X86) \ + || defined(_M_ARM) \ + || defined(__ARMEL__) \ + || defined(__THUMBEL__) \ + || defined(__ARMEB__) \ + || defined(__THUMBEB__) + #define MY_CPU_32BIT +#endif + +#if defined(_WIN32) && defined(_M_ARM) +#define MY_CPU_ARM_LE +#endif + +#if defined(_WIN32) && defined(_M_IA64) +#define MY_CPU_IA64_LE +#endif + +#if defined(MY_CPU_X86_OR_AMD64) \ + || defined(MY_CPU_ARM_LE) \ + || defined(MY_CPU_IA64_LE) \ + || defined(__LITTLE_ENDIAN__) \ + || defined(__ARMEL__) \ + || defined(__THUMBEL__) \ + || defined(__AARCH64EL__) \ + || defined(__MIPSEL__) \ + || defined(__MIPSEL) \ + || defined(_MIPSEL) \ + || defined(__BFIN__) \ + || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) + #define MY_CPU_LE +#endif + +#if defined(__BIG_ENDIAN__) \ + || defined(__ARMEB__) \ + || defined(__THUMBEB__) \ + || defined(__AARCH64EB__) \ + || defined(__MIPSEB__) \ + || defined(__MIPSEB) \ + || defined(_MIPSEB) \ + || defined(__m68k__) \ + || defined(__s390__) \ + || defined(__s390x__) \ + || defined(__zarch__) \ + || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + #define MY_CPU_BE +#endif + +#if defined(MY_CPU_LE) && defined(MY_CPU_BE) +Stop_Compiling_Bad_Endian +#endif + + +#ifdef MY_CPU_LE + #if defined(MY_CPU_X86_OR_AMD64) \ + /* || defined(__AARCH64EL__) */ + #define MY_CPU_LE_UNALIGN + #endif +#endif + + +#ifdef MY_CPU_LE_UNALIGN + +#define GetUi16(p) (*(const UInt16 *)(const void *)(p)) +#define GetUi32(p) (*(const UInt32 *)(const void *)(p)) +#define GetUi64(p) (*(const UInt64 *)(const void *)(p)) + +#define SetUi16(p, v) { *(UInt16 *)(p) = (v); } +#define SetUi32(p, v) { *(UInt32 *)(p) = (v); } +#define SetUi64(p, v) { *(UInt64 *)(p) = (v); } + +#else + +#define GetUi16(p) ( (UInt16) ( \ + ((const Byte *)(p))[0] | \ + ((UInt16)((const Byte *)(p))[1] << 8) )) + +#define GetUi32(p) ( \ + ((const Byte *)(p))[0] | \ + ((UInt32)((const Byte *)(p))[1] << 8) | \ + ((UInt32)((const Byte *)(p))[2] << 16) | \ + ((UInt32)((const Byte *)(p))[3] << 24)) + +#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) + +#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ + _ppp_[0] = (Byte)_vvv_; \ + _ppp_[1] = (Byte)(_vvv_ >> 8); } + +#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ + _ppp_[0] = (Byte)_vvv_; \ + _ppp_[1] = (Byte)(_vvv_ >> 8); \ + _ppp_[2] = (Byte)(_vvv_ >> 16); \ + _ppp_[3] = (Byte)(_vvv_ >> 24); } + +#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \ + SetUi32(_ppp2_ , (UInt32)_vvv2_); \ + SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); } + +#endif + + +#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ (_MSC_VER >= 1300) + +/* Note: we use bswap instruction, that is unsupported in 386 cpu */ + +#include + +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) +#define GetBe32(p) _byteswap_ulong(*(const UInt32 *)(const Byte *)(p)) +#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const Byte *)(p)) + +#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v) + +#elif defined(MY_CPU_LE_UNALIGN) && defined (__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + +#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const Byte *)(p)) +#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const Byte *)(p)) + +#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v) + +#else + +#define GetBe32(p) ( \ + ((UInt32)((const Byte *)(p))[0] << 24) | \ + ((UInt32)((const Byte *)(p))[1] << 16) | \ + ((UInt32)((const Byte *)(p))[2] << 8) | \ + ((const Byte *)(p))[3] ) + +#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) + +#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ + _ppp_[0] = (Byte)(_vvv_ >> 24); \ + _ppp_[1] = (Byte)(_vvv_ >> 16); \ + _ppp_[2] = (Byte)(_vvv_ >> 8); \ + _ppp_[3] = (Byte)_vvv_; } + +#endif + + +#define GetBe16(p) ( (UInt16) ( \ + ((UInt16)((const Byte *)(p))[0] << 8) | \ + ((const Byte *)(p))[1] )) + + + +#ifdef MY_CPU_X86_OR_AMD64 + +typedef struct +{ + UInt32 maxFunc; + UInt32 vendor[3]; + UInt32 ver; + UInt32 b; + UInt32 c; + UInt32 d; +} Cx86cpuid; + +enum +{ + CPU_FIRM_INTEL, + CPU_FIRM_AMD, + CPU_FIRM_VIA +}; + +void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d); + +Bool x86cpuid_CheckAndRead(Cx86cpuid *p); +int x86cpuid_GetFirm(const Cx86cpuid *p); + +#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF)) +#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF)) +#define x86cpuid_GetStepping(ver) (ver & 0xF) + +Bool CPU_Is_InOrder(); +Bool CPU_Is_Aes_Supported(); + +#endif + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Delta.c b/Provenance/LzmaSDKObjC/lzma/C/Delta.c new file mode 100644 index 0000000000..6cbbe46012 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Delta.c @@ -0,0 +1,64 @@ +/* Delta.c -- Delta converter +2009-05-26 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Delta.h" + +void Delta_Init(Byte *state) +{ + unsigned i; + for (i = 0; i < DELTA_STATE_SIZE; i++) + state[i] = 0; +} + +static void MyMemCpy(Byte *dest, const Byte *src, unsigned size) +{ + unsigned i; + for (i = 0; i < size; i++) + dest[i] = src[i]; +} + +void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size) +{ + Byte buf[DELTA_STATE_SIZE]; + unsigned j = 0; + MyMemCpy(buf, state, delta); + { + SizeT i; + for (i = 0; i < size;) + { + for (j = 0; j < delta && i < size; i++, j++) + { + Byte b = data[i]; + data[i] = (Byte)(b - buf[j]); + buf[j] = b; + } + } + } + if (j == delta) + j = 0; + MyMemCpy(state, buf + j, delta - j); + MyMemCpy(state + delta - j, buf, j); +} + +void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size) +{ + Byte buf[DELTA_STATE_SIZE]; + unsigned j = 0; + MyMemCpy(buf, state, delta); + { + SizeT i; + for (i = 0; i < size;) + { + for (j = 0; j < delta && i < size; i++, j++) + { + buf[j] = data[i] = (Byte)(buf[j] + data[i]); + } + } + } + if (j == delta) + j = 0; + MyMemCpy(state, buf + j, delta - j); + MyMemCpy(state + delta - j, buf, j); +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Delta.h b/Provenance/LzmaSDKObjC/lzma/C/Delta.h new file mode 100644 index 0000000000..e59d5a252b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Delta.h @@ -0,0 +1,19 @@ +/* Delta.h -- Delta converter +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __DELTA_H +#define __DELTA_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define DELTA_STATE_SIZE 256 + +void Delta_Init(Byte *state); +void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size); +void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzFind.c b/Provenance/LzmaSDKObjC/lzma/C/LzFind.c new file mode 100644 index 0000000000..c335d363ce --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzFind.c @@ -0,0 +1,1044 @@ +/* LzFind.c -- Match finder for LZ algorithms +2015-10-15 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "LzFind.h" +#include "LzHash.h" + +#define kEmptyHashValue 0 +#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) +#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ +#define kNormalizeMask (~(UInt32)(kNormalizeStepMin - 1)) +#define kMaxHistorySize ((UInt32)7 << 29) + +#define kStartMaxLen 3 + +static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + if (!p->directInput) + { + alloc->Free(alloc, p->bufferBase); + p->bufferBase = NULL; + } +} + +/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ + +static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) +{ + UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; + if (p->directInput) + { + p->blockSize = blockSize; + return 1; + } + if (!p->bufferBase || p->blockSize != blockSize) + { + LzInWindow_Free(p, alloc); + p->blockSize = blockSize; + p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); + } + return (p->bufferBase != NULL); +} + +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } + +UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } + +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) +{ + p->posLimit -= subValue; + p->pos -= subValue; + p->streamPos -= subValue; +} + +static void MatchFinder_ReadBlock(CMatchFinder *p) +{ + if (p->streamEndWasReached || p->result != SZ_OK) + return; + + /* We use (p->streamPos - p->pos) value. (p->streamPos < p->pos) is allowed. */ + + if (p->directInput) + { + UInt32 curSize = 0xFFFFFFFF - (p->streamPos - p->pos); + if (curSize > p->directInputRem) + curSize = (UInt32)p->directInputRem; + p->directInputRem -= curSize; + p->streamPos += curSize; + if (p->directInputRem == 0) + p->streamEndWasReached = 1; + return; + } + + for (;;) + { + Byte *dest = p->buffer + (p->streamPos - p->pos); + size_t size = (p->bufferBase + p->blockSize - dest); + if (size == 0) + return; + + p->result = p->stream->Read(p->stream, dest, &size); + if (p->result != SZ_OK) + return; + if (size == 0) + { + p->streamEndWasReached = 1; + return; + } + p->streamPos += (UInt32)size; + if (p->streamPos - p->pos > p->keepSizeAfter) + return; + } +} + +void MatchFinder_MoveBlock(CMatchFinder *p) +{ + memmove(p->bufferBase, + p->buffer - p->keepSizeBefore, + (size_t)(p->streamPos - p->pos) + p->keepSizeBefore); + p->buffer = p->bufferBase + p->keepSizeBefore; +} + +int MatchFinder_NeedMove(CMatchFinder *p) +{ + if (p->directInput) + return 0; + /* if (p->streamEndWasReached) return 0; */ + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); +} + +void MatchFinder_ReadIfRequired(CMatchFinder *p) +{ + if (p->streamEndWasReached) + return; + if (p->keepSizeAfter >= p->streamPos - p->pos) + MatchFinder_ReadBlock(p); +} + +static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) +{ + if (MatchFinder_NeedMove(p)) + MatchFinder_MoveBlock(p); + MatchFinder_ReadBlock(p); +} + +static void MatchFinder_SetDefaultSettings(CMatchFinder *p) +{ + p->cutValue = 32; + p->btMode = 1; + p->numHashBytes = 4; + p->bigHash = 0; +} + +#define kCrcPoly 0xEDB88320 + +void MatchFinder_Construct(CMatchFinder *p) +{ + UInt32 i; + p->bufferBase = NULL; + p->directInput = 0; + p->hash = NULL; + MatchFinder_SetDefaultSettings(p); + + for (i = 0; i < 256; i++) + { + UInt32 r = i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); + p->crc[i] = r; + } +} + +static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->hash); + p->hash = NULL; +} + +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) +{ + MatchFinder_FreeThisClassMemory(p, alloc); + LzInWindow_Free(p, alloc); +} + +static CLzRef* AllocRefs(size_t num, ISzAlloc *alloc) +{ + size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + if (sizeInBytes / sizeof(CLzRef) != num) + return NULL; + return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); +} + +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc) +{ + UInt32 sizeReserv; + + if (historySize > kMaxHistorySize) + { + MatchFinder_Free(p, alloc); + return 0; + } + + sizeReserv = historySize >> 1; + if (historySize >= ((UInt32)3 << 30)) sizeReserv = historySize >> 3; + else if (historySize >= ((UInt32)2 << 30)) sizeReserv = historySize >> 2; + + sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); + + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; + + /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ + + if (LzInWindow_Create(p, sizeReserv, alloc)) + { + UInt32 newCyclicBufferSize = historySize + 1; + UInt32 hs; + p->matchMaxLen = matchMaxLen; + { + p->fixedHashSize = 0; + if (p->numHashBytes == 2) + hs = (1 << 16) - 1; + else + { + hs = historySize - 1; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + hs >>= 1; + hs |= 0xFFFF; /* don't change it! It's required for Deflate */ + if (hs > (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; + /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ + } + } + p->hashMask = hs; + hs++; + if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; + if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; + if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; + hs += p->fixedHashSize; + } + + { + size_t newSize; + size_t numSons; + p->historySize = historySize; + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; + + numSons = newCyclicBufferSize; + if (p->btMode) + numSons <<= 1; + newSize = hs + numSons; + + if (p->hash && p->numRefs == newSize) + return 1; + + MatchFinder_FreeThisClassMemory(p, alloc); + p->numRefs = newSize; + p->hash = AllocRefs(newSize, alloc); + + if (p->hash) + { + p->son = p->hash + p->hashSizeSum; + return 1; + } + } + } + + MatchFinder_Free(p, alloc); + return 0; +} + +static void MatchFinder_SetLimits(CMatchFinder *p) +{ + UInt32 limit = kMaxValForNormalize - p->pos; + UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; + + if (limit2 < limit) + limit = limit2; + limit2 = p->streamPos - p->pos; + + if (limit2 <= p->keepSizeAfter) + { + if (limit2 > 0) + limit2 = 1; + } + else + limit2 -= p->keepSizeAfter; + + if (limit2 < limit) + limit = limit2; + + { + UInt32 lenLimit = p->streamPos - p->pos; + if (lenLimit > p->matchMaxLen) + lenLimit = p->matchMaxLen; + p->lenLimit = lenLimit; + } + p->posLimit = p->pos + limit; +} + +void MatchFinder_Init_2(CMatchFinder *p, int readData) +{ + UInt32 i; + UInt32 *hash = p->hash; + UInt32 num = p->hashSizeSum; + for (i = 0; i < num; i++) + hash[i] = kEmptyHashValue; + + p->cyclicBufferPos = 0; + p->buffer = p->bufferBase; + p->pos = p->streamPos = p->cyclicBufferSize; + p->result = SZ_OK; + p->streamEndWasReached = 0; + + if (readData) + MatchFinder_ReadBlock(p); + + MatchFinder_SetLimits(p); +} + +void MatchFinder_Init(CMatchFinder *p) +{ + MatchFinder_Init_2(p, True); +} + +static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) +{ + return (p->pos - p->historySize - 1) & kNormalizeMask; +} + +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems) +{ + size_t i; + for (i = 0; i < numItems; i++) + { + UInt32 value = items[i]; + if (value <= subValue) + value = kEmptyHashValue; + else + value -= subValue; + items[i] = value; + } +} + +static void MatchFinder_Normalize(CMatchFinder *p) +{ + UInt32 subValue = MatchFinder_GetSubValue(p); + MatchFinder_Normalize3(subValue, p->hash, p->numRefs); + MatchFinder_ReduceOffsets(p, subValue); +} + +static void MatchFinder_CheckLimits(CMatchFinder *p) +{ + if (p->pos == kMaxValForNormalize) + MatchFinder_Normalize(p); + if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) + MatchFinder_CheckAndMoveAndRead(p); + if (p->cyclicBufferPos == p->cyclicBufferSize) + p->cyclicBufferPos = 0; + MatchFinder_SetLimits(p); +} + +static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + son[_cyclicBufferPos] = curMatch; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + return distances; + { + const Byte *pb = cur - delta; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + if (pb[maxLen] == cur[maxLen] && *pb == *cur) + { + UInt32 len = 0; + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + return distances; + } + } + } + } +} + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *distances, UInt32 maxLen) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return distances; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return distances; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) +{ + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + return; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + { + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } +} + +#define MOVE_POS \ + ++p->cyclicBufferPos; \ + p->buffer++; \ + if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); + +#define MOVE_POS_RET MOVE_POS return offset; + +static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } + +#define GET_MATCHES_HEADER2(minLen, ret_op) \ + UInt32 lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ + lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + cur = p->buffer; + +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) +#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) + +#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue + +#define GET_MATCHES_FOOTER(offset, maxLen) \ + offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ + distances + offset, maxLen) - distances); MOVE_POS_RET; + +#define SKIP_FOOTER \ + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; + +#define UPDATE_maxLen { \ + ptrdiff_t diff = (ptrdiff_t)0 - d2; \ + const Byte *c = cur + maxLen; \ + const Byte *lim = cur + lenLimit; \ + for (; c != lim; c++) if (*(c + diff) != *c) break; \ + maxLen = (UInt32)(c - cur); } + +static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 1) +} + +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = 0; + GET_MATCHES_FOOTER(offset, 2) +} + +static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, d2, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(3) + + HASH3_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[h2]; + + curMatch = hash[kFix3HashSize + hv]; + + hash[h2] = pos; + hash[kFix3HashSize + hv] = pos; + + maxLen = 2; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + UPDATE_maxLen + distances[0] = maxLen; + distances[1] = d2 - 1; + offset = 2; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + GET_MATCHES_FOOTER(offset, maxLen) +} + +static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, d2, d3, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + + curMatch = hash[kFix4HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + } + + if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + maxLen = 3; + distances[offset + 1] = d3 - 1; + offset += 2; + d2 = d3; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + if (maxLen < 3) + maxLen = 3; + + GET_MATCHES_FOOTER(offset, maxLen) +} + +/* +static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + d4 = pos - hash[kFix4HashSize + h4]; + + curMatch = hash[kFix5HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + h4] = pos; + hash[kFix5HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + if (*(cur - d2 + 2) == cur[2]) + distances[0] = maxLen = 3; + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[2] = maxLen = 3; + distances[3] = d3 - 1; + offset = 4; + d2 = d3; + } + } + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[0] = maxLen = 3; + distances[1] = d3 - 1; + offset = 2; + d2 = d3; + } + + if (d2 != d4 && d4 < p->cyclicBufferSize + && *(cur - d4) == *cur + && *(cur - d4 + 3) == *(cur + 3)) + { + maxLen = 4; + distances[offset + 1] = d4 - 1; + offset += 2; + d2 = d4; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + if (maxLen < 4) + maxLen = 4; + + GET_MATCHES_FOOTER(offset, maxLen) +} +*/ + +static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, d2, d3, maxLen, offset, pos; + UInt32 *hash; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + + curMatch = hash[kFix4HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + } + + if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + maxLen = 3; + distances[offset + 1] = d3 - 1; + offset += 2; + d2 = d3; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + + if (maxLen < 3) + maxLen = 3; + + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} + +/* +static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[ h2]; + d3 = pos - hash[kFix3HashSize + h3]; + d4 = pos - hash[kFix4HashSize + h4]; + + curMatch = hash[kFix5HashSize + hv]; + + hash[ h2] = pos; + hash[kFix3HashSize + h3] = pos; + hash[kFix4HashSize + h4] = pos; + hash[kFix5HashSize + hv] = pos; + + maxLen = 0; + offset = 0; + + if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) + { + distances[0] = maxLen = 2; + distances[1] = d2 - 1; + offset = 2; + if (*(cur - d2 + 2) == cur[2]) + distances[0] = maxLen = 3; + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[2] = maxLen = 3; + distances[3] = d3 - 1; + offset = 4; + d2 = d3; + } + } + else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) + { + distances[0] = maxLen = 3; + distances[1] = d3 - 1; + offset = 2; + d2 = d3; + } + + if (d2 != d4 && d4 < p->cyclicBufferSize + && *(cur - d4) == *cur + && *(cur - d4 + 3) == *(cur + 3)) + { + maxLen = 4; + distances[offset + 1] = d4 - 1; + offset += 2; + d2 = d4; + } + + if (offset != 0) + { + UPDATE_maxLen + distances[offset - 2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + } + + if (maxLen < 4) + maxLen = 4; + + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances + offset, maxLen) - (distances)); + MOVE_POS_RET +} +*/ + +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 offset; + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p), + distances, 2) - (distances)); + MOVE_POS_RET +} + +static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2; + UInt32 *hash; + SKIP_HEADER(3) + HASH3_CALC; + hash = p->hash; + curMatch = hash[kFix3HashSize + hv]; + hash[h2] = + hash[kFix3HashSize + hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3; + UInt32 *hash; + SKIP_HEADER(4) + HASH4_CALC; + hash = p->hash; + curMatch = hash[kFix4HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} + +/* +static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3, h4; + UInt32 *hash; + SKIP_HEADER(5) + HASH5_CALC; + hash = p->hash; + curMatch = hash[kFix5HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + h4] = + hash[kFix5HashSize + hv] = p->pos; + SKIP_FOOTER + } + while (--num != 0); +} +*/ + +static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3; + UInt32 *hash; + SKIP_HEADER(4) + HASH4_CALC; + hash = p->hash; + curMatch = hash[kFix4HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +/* +static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + UInt32 h2, h3, h4; + UInt32 *hash; + SKIP_HEADER(5) + HASH5_CALC; + hash = p->hash; + curMatch = p->hash[kFix5HashSize + hv]; + hash[ h2] = + hash[kFix3HashSize + h3] = + hash[kFix4HashSize + h4] = + hash[kFix5HashSize + hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} +*/ + +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + do + { + SKIP_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS + } + while (--num != 0); +} + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + if (!p->btMode) + { + /* if (p->numHashBytes <= 4) */ + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + } + /* + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; + } + */ + } + else if (p->numHashBytes == 2) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + } + else if (p->numHashBytes == 3) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + } + else /* if (p->numHashBytes == 4) */ + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + } + /* + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; + } + */ +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzFind.h b/Provenance/LzmaSDKObjC/lzma/C/LzFind.h new file mode 100644 index 0000000000..2ff6673771 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzFind.h @@ -0,0 +1,117 @@ +/* LzFind.h -- Match finder for LZ algorithms +2015-10-15 : Igor Pavlov : Public domain */ + +#ifndef __LZ_FIND_H +#define __LZ_FIND_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef UInt32 CLzRef; + +typedef struct _CMatchFinder +{ + Byte *buffer; + UInt32 pos; + UInt32 posLimit; + UInt32 streamPos; + UInt32 lenLimit; + + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + + Byte streamEndWasReached; + Byte btMode; + Byte bigHash; + Byte directInput; + + UInt32 matchMaxLen; + CLzRef *hash; + CLzRef *son; + UInt32 hashMask; + UInt32 cutValue; + + Byte *bufferBase; + ISeqInStream *stream; + + UInt32 blockSize; + UInt32 keepSizeBefore; + UInt32 keepSizeAfter; + + UInt32 numHashBytes; + size_t directInputRem; + UInt32 historySize; + UInt32 fixedHashSize; + UInt32 hashSizeSum; + SRes result; + UInt32 crc[256]; + size_t numRefs; +} CMatchFinder; + +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) + +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) + +#define Inline_MatchFinder_IsFinishedOK(p) \ + ((p)->streamEndWasReached \ + && (p)->streamPos == (p)->pos \ + && (!(p)->directInput || (p)->directInputRem == 0)) + +int MatchFinder_NeedMove(CMatchFinder *p); +Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); +void MatchFinder_MoveBlock(CMatchFinder *p); +void MatchFinder_ReadIfRequired(CMatchFinder *p); + +void MatchFinder_Construct(CMatchFinder *p); + +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +*/ +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAlloc *alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); +void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *distances, UInt32 maxLen); + +/* +Conditions: + Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. + Mf_GetPointerToCurrentPos_Func's result must be used only before any other function +*/ + +typedef void (*Mf_Init_Func)(void *object); +typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); +typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); +typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); +typedef void (*Mf_Skip_Func)(void *object, UInt32); + +typedef struct _IMatchFinder +{ + Mf_Init_Func Init; + Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; + Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; + Mf_GetMatches_Func GetMatches; + Mf_Skip_Func Skip; +} IMatchFinder; + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); + +void MatchFinder_Init_2(CMatchFinder *p, int readData); +void MatchFinder_Init(CMatchFinder *p); + +UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzFindMt.c b/Provenance/LzmaSDKObjC/lzma/C/LzFindMt.c new file mode 100644 index 0000000000..cb61e0953a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzFindMt.c @@ -0,0 +1,803 @@ +/* LzFindMt.c -- multithreaded Match finder for LZ algorithms +2015-10-15 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "LzHash.h" + +#include "LzFindMt.h" + +static void MtSync_Construct(CMtSync *p) +{ + p->wasCreated = False; + p->csWasInitialized = False; + p->csWasEntered = False; + Thread_Construct(&p->thread); + Event_Construct(&p->canStart); + Event_Construct(&p->wasStarted); + Event_Construct(&p->wasStopped); + Semaphore_Construct(&p->freeSemaphore); + Semaphore_Construct(&p->filledSemaphore); +} + +static void MtSync_GetNextBlock(CMtSync *p) +{ + if (p->needStart) + { + p->numProcessedBlocks = 1; + p->needStart = False; + p->stopWriting = False; + p->exit = False; + Event_Reset(&p->wasStarted); + Event_Reset(&p->wasStopped); + + Event_Set(&p->canStart); + Event_Wait(&p->wasStarted); + } + else + { + CriticalSection_Leave(&p->cs); + p->csWasEntered = False; + p->numProcessedBlocks++; + Semaphore_Release1(&p->freeSemaphore); + } + Semaphore_Wait(&p->filledSemaphore); + CriticalSection_Enter(&p->cs); + p->csWasEntered = True; +} + +/* MtSync_StopWriting must be called if Writing was started */ + +static void MtSync_StopWriting(CMtSync *p) +{ + UInt32 myNumBlocks = p->numProcessedBlocks; + if (!Thread_WasCreated(&p->thread) || p->needStart) + return; + p->stopWriting = True; + if (p->csWasEntered) + { + CriticalSection_Leave(&p->cs); + p->csWasEntered = False; + } + Semaphore_Release1(&p->freeSemaphore); + + Event_Wait(&p->wasStopped); + + while (myNumBlocks++ != p->numProcessedBlocks) + { + Semaphore_Wait(&p->filledSemaphore); + Semaphore_Release1(&p->freeSemaphore); + } + p->needStart = True; +} + +static void MtSync_Destruct(CMtSync *p) +{ + if (Thread_WasCreated(&p->thread)) + { + MtSync_StopWriting(p); + p->exit = True; + if (p->needStart) + Event_Set(&p->canStart); + Thread_Wait(&p->thread); + Thread_Close(&p->thread); + } + if (p->csWasInitialized) + { + CriticalSection_Delete(&p->cs); + p->csWasInitialized = False; + } + + Event_Close(&p->canStart); + Event_Close(&p->wasStarted); + Event_Close(&p->wasStopped); + Semaphore_Close(&p->freeSemaphore); + Semaphore_Close(&p->filledSemaphore); + + p->wasCreated = False; +} + +#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } + +static SRes MtSync_Create2(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj, UInt32 numBlocks) +{ + if (p->wasCreated) + return SZ_OK; + + RINOK_THREAD(CriticalSection_Init(&p->cs)); + p->csWasInitialized = True; + + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart)); + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStarted)); + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped)); + + RINOK_THREAD(Semaphore_Create(&p->freeSemaphore, numBlocks, numBlocks)); + RINOK_THREAD(Semaphore_Create(&p->filledSemaphore, 0, numBlocks)); + + p->needStart = True; + + RINOK_THREAD(Thread_Create(&p->thread, startAddress, obj)); + p->wasCreated = True; + return SZ_OK; +} + +static SRes MtSync_Create(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj, UInt32 numBlocks) +{ + SRes res = MtSync_Create2(p, startAddress, obj, numBlocks); + if (res != SZ_OK) + MtSync_Destruct(p); + return res; +} + +void MtSync_Init(CMtSync *p) { p->needStart = True; } + +#define kMtMaxValForNormalize 0xFFFFFFFF + +#define DEF_GetHeads2(name, v, action) \ + static void GetHeads ## name(const Byte *p, UInt32 pos, \ + UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) \ + { action; for (; numHeads != 0; numHeads--) { \ + const UInt32 value = (v); p++; *heads++ = pos - hash[value]; hash[value] = pos++; } } + +#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;) + +DEF_GetHeads2(2, (p[0] | ((UInt32)p[1] << 8)), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) +DEF_GetHeads(3, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8)) & hashMask) +DEF_GetHeads(4, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5)) & hashMask) +DEF_GetHeads(4b, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ ((UInt32)p[3] << 16)) & hashMask) +/* DEF_GetHeads(5, (crc[p[0]] ^ p[1] ^ ((UInt32)p[2] << 8) ^ (crc[p[3]] << 5) ^ (crc[p[4]] << 3)) & hashMask) */ + +static void HashThreadFunc(CMatchFinderMt *mt) +{ + CMtSync *p = &mt->hashSync; + for (;;) + { + UInt32 numProcessedBlocks = 0; + Event_Wait(&p->canStart); + Event_Set(&p->wasStarted); + for (;;) + { + if (p->exit) + return; + if (p->stopWriting) + { + p->numProcessedBlocks = numProcessedBlocks; + Event_Set(&p->wasStopped); + break; + } + + { + CMatchFinder *mf = mt->MatchFinder; + if (MatchFinder_NeedMove(mf)) + { + CriticalSection_Enter(&mt->btSync.cs); + CriticalSection_Enter(&mt->hashSync.cs); + { + const Byte *beforePtr = Inline_MatchFinder_GetPointerToCurrentPos(mf); + ptrdiff_t offset; + MatchFinder_MoveBlock(mf); + offset = beforePtr - Inline_MatchFinder_GetPointerToCurrentPos(mf); + mt->pointerToCurPos -= offset; + mt->buffer -= offset; + } + CriticalSection_Leave(&mt->btSync.cs); + CriticalSection_Leave(&mt->hashSync.cs); + continue; + } + + Semaphore_Wait(&p->freeSemaphore); + + MatchFinder_ReadIfRequired(mf); + if (mf->pos > (kMtMaxValForNormalize - kMtHashBlockSize)) + { + UInt32 subValue = (mf->pos - mf->historySize - 1); + MatchFinder_ReduceOffsets(mf, subValue); + MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, (size_t)mf->hashMask + 1); + } + { + UInt32 *heads = mt->hashBuf + ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize; + UInt32 num = mf->streamPos - mf->pos; + heads[0] = 2; + heads[1] = num; + if (num >= mf->numHashBytes) + { + num = num - mf->numHashBytes + 1; + if (num > kMtHashBlockSize - 2) + num = kMtHashBlockSize - 2; + mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc); + heads[0] += num; + } + mf->pos += num; + mf->buffer += num; + } + } + + Semaphore_Release1(&p->filledSemaphore); + } + } +} + +static void MatchFinderMt_GetNextBlock_Hash(CMatchFinderMt *p) +{ + MtSync_GetNextBlock(&p->hashSync); + p->hashBufPosLimit = p->hashBufPos = ((p->hashSync.numProcessedBlocks - 1) & kMtHashNumBlocksMask) * kMtHashBlockSize; + p->hashBufPosLimit += p->hashBuf[p->hashBufPos++]; + p->hashNumAvail = p->hashBuf[p->hashBufPos++]; +} + +#define kEmptyHashValue 0 + +/* #define MFMT_GM_INLINE */ + +#ifdef MFMT_GM_INLINE + +#define NO_INLINE MY_FAST_CALL + +static Int32 NO_INLINE GetMatchesSpecN(UInt32 lenLimit, UInt32 pos, const Byte *cur, CLzRef *son, + UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *_distances, UInt32 _maxLen, const UInt32 *hash, Int32 limit, UInt32 size, UInt32 *posRes) +{ + do + { + UInt32 *distances = _distances + 1; + UInt32 curMatch = pos - *hash++; + + CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + (_cyclicBufferPos << 1); + UInt32 len0 = 0, len1 = 0; + UInt32 cutValue = _cutValue; + UInt32 maxLen = _maxLen; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + { + *ptr0 = *ptr1 = kEmptyHashValue; + break; + } + { + CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + UInt32 len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + *distances++ = maxLen = len; + *distances++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + break; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + ptr1 = pair + 1; + curMatch = *ptr1; + len1 = len; + } + else + { + *ptr0 = curMatch; + ptr0 = pair; + curMatch = *ptr0; + len0 = len; + } + } + } + pos++; + _cyclicBufferPos++; + cur++; + { + UInt32 num = (UInt32)(distances - _distances); + *_distances = num - 1; + _distances += num; + limit -= num; + } + } + while (limit > 0 && --size != 0); + *posRes = pos; + return limit; +} + +#endif + +static void BtGetMatches(CMatchFinderMt *p, UInt32 *distances) +{ + UInt32 numProcessed = 0; + UInt32 curPos = 2; + UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2); + + distances[1] = p->hashNumAvail; + + while (curPos < limit) + { + if (p->hashBufPos == p->hashBufPosLimit) + { + MatchFinderMt_GetNextBlock_Hash(p); + distances[1] = numProcessed + p->hashNumAvail; + if (p->hashNumAvail >= p->numHashBytes) + continue; + distances[0] = curPos + p->hashNumAvail; + distances += curPos; + for (; p->hashNumAvail != 0; p->hashNumAvail--) + *distances++ = 0; + return; + } + { + UInt32 size = p->hashBufPosLimit - p->hashBufPos; + UInt32 lenLimit = p->matchMaxLen; + UInt32 pos = p->pos; + UInt32 cyclicBufferPos = p->cyclicBufferPos; + if (lenLimit >= p->hashNumAvail) + lenLimit = p->hashNumAvail; + { + UInt32 size2 = p->hashNumAvail - lenLimit + 1; + if (size2 < size) + size = size2; + size2 = p->cyclicBufferSize - cyclicBufferPos; + if (size2 < size) + size = size2; + } + + #ifndef MFMT_GM_INLINE + while (curPos < limit && size-- != 0) + { + UInt32 *startDistances = distances + curPos; + UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++], + pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, + startDistances + 1, p->numHashBytes - 1) - startDistances); + *startDistances = num - 1; + curPos += num; + cyclicBufferPos++; + pos++; + p->buffer++; + } + #else + { + UInt32 posRes; + curPos = limit - GetMatchesSpecN(lenLimit, pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, + distances + curPos, p->numHashBytes - 1, p->hashBuf + p->hashBufPos, (Int32)(limit - curPos), size, &posRes); + p->hashBufPos += posRes - pos; + cyclicBufferPos += posRes - pos; + p->buffer += posRes - pos; + pos = posRes; + } + #endif + + numProcessed += pos - p->pos; + p->hashNumAvail -= pos - p->pos; + p->pos = pos; + if (cyclicBufferPos == p->cyclicBufferSize) + cyclicBufferPos = 0; + p->cyclicBufferPos = cyclicBufferPos; + } + } + + distances[0] = curPos; +} + +static void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex) +{ + CMtSync *sync = &p->hashSync; + if (!sync->needStart) + { + CriticalSection_Enter(&sync->cs); + sync->csWasEntered = True; + } + + BtGetMatches(p, p->btBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize); + + if (p->pos > kMtMaxValForNormalize - kMtBtBlockSize) + { + UInt32 subValue = p->pos - p->cyclicBufferSize; + MatchFinder_Normalize3(subValue, p->son, (size_t)p->cyclicBufferSize * 2); + p->pos -= subValue; + } + + if (!sync->needStart) + { + CriticalSection_Leave(&sync->cs); + sync->csWasEntered = False; + } +} + +void BtThreadFunc(CMatchFinderMt *mt) +{ + CMtSync *p = &mt->btSync; + for (;;) + { + UInt32 blockIndex = 0; + Event_Wait(&p->canStart); + Event_Set(&p->wasStarted); + for (;;) + { + if (p->exit) + return; + if (p->stopWriting) + { + p->numProcessedBlocks = blockIndex; + MtSync_StopWriting(&mt->hashSync); + Event_Set(&p->wasStopped); + break; + } + Semaphore_Wait(&p->freeSemaphore); + BtFillBlock(mt, blockIndex++); + Semaphore_Release1(&p->filledSemaphore); + } + } +} + +void MatchFinderMt_Construct(CMatchFinderMt *p) +{ + p->hashBuf = NULL; + MtSync_Construct(&p->hashSync); + MtSync_Construct(&p->btSync); +} + +static void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->hashBuf); + p->hashBuf = NULL; +} + +void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc) +{ + MtSync_Destruct(&p->hashSync); + MtSync_Destruct(&p->btSync); + MatchFinderMt_FreeMem(p, alloc); +} + +#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks) +#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks) + +static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; } +static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE BtThreadFunc2(void *p) +{ + Byte allocaDummy[0x180]; + unsigned i = 0; + for (i = 0; i < 16; i++) + allocaDummy[i] = (Byte)0; + if (allocaDummy[0] == 0) + BtThreadFunc((CMatchFinderMt *)p); + return 0; +} + +SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc) +{ + CMatchFinder *mf = p->MatchFinder; + p->historySize = historySize; + if (kMtBtBlockSize <= matchMaxLen * 4) + return SZ_ERROR_PARAM; + if (!p->hashBuf) + { + p->hashBuf = (UInt32 *)alloc->Alloc(alloc, (kHashBufferSize + kBtBufferSize) * sizeof(UInt32)); + if (!p->hashBuf) + return SZ_ERROR_MEM; + p->btBuf = p->hashBuf + kHashBufferSize; + } + keepAddBufferBefore += (kHashBufferSize + kBtBufferSize); + keepAddBufferAfter += kMtHashBlockSize; + if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc)) + return SZ_ERROR_MEM; + + RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p, kMtHashNumBlocks)); + RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p, kMtBtNumBlocks)); + return SZ_OK; +} + +/* Call it after ReleaseStream / SetStream */ +void MatchFinderMt_Init(CMatchFinderMt *p) +{ + CMatchFinder *mf = p->MatchFinder; + p->btBufPos = p->btBufPosLimit = 0; + p->hashBufPos = p->hashBufPosLimit = 0; + + /* Init without data reading. We don't want to read data in this thread */ + MatchFinder_Init_2(mf, False); + + p->pointerToCurPos = Inline_MatchFinder_GetPointerToCurrentPos(mf); + p->btNumAvailBytes = 0; + p->lzPos = p->historySize + 1; + + p->hash = mf->hash; + p->fixedHashSize = mf->fixedHashSize; + p->crc = mf->crc; + + p->son = mf->son; + p->matchMaxLen = mf->matchMaxLen; + p->numHashBytes = mf->numHashBytes; + p->pos = mf->pos; + p->buffer = mf->buffer; + p->cyclicBufferPos = mf->cyclicBufferPos; + p->cyclicBufferSize = mf->cyclicBufferSize; + p->cutValue = mf->cutValue; +} + +/* ReleaseStream is required to finish multithreading */ +void MatchFinderMt_ReleaseStream(CMatchFinderMt *p) +{ + MtSync_StopWriting(&p->btSync); + /* p->MatchFinder->ReleaseStream(); */ +} + +static void MatchFinderMt_Normalize(CMatchFinderMt *p) +{ + MatchFinder_Normalize3(p->lzPos - p->historySize - 1, p->hash, p->fixedHashSize); + p->lzPos = p->historySize + 1; +} + +static void MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p) +{ + UInt32 blockIndex; + MtSync_GetNextBlock(&p->btSync); + blockIndex = ((p->btSync.numProcessedBlocks - 1) & kMtBtNumBlocksMask); + p->btBufPosLimit = p->btBufPos = blockIndex * kMtBtBlockSize; + p->btBufPosLimit += p->btBuf[p->btBufPos++]; + p->btNumAvailBytes = p->btBuf[p->btBufPos++]; + if (p->lzPos >= kMtMaxValForNormalize - kMtBtBlockSize) + MatchFinderMt_Normalize(p); +} + +static const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p) +{ + return p->pointerToCurPos; +} + +#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p); + +static UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p) +{ + GET_NEXT_BLOCK_IF_REQUIRED; + return p->btNumAvailBytes; +} + +static UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) +{ + UInt32 h2, curMatch2; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 lzPos = p->lzPos; + MT_HASH2_CALC + + curMatch2 = hash[h2]; + hash[h2] = lzPos; + + if (curMatch2 >= matchMinPos) + if (cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) + { + *distances++ = 2; + *distances++ = lzPos - curMatch2 - 1; + } + + return distances; +} + +static UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) +{ + UInt32 h2, h3, curMatch2, curMatch3; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 lzPos = p->lzPos; + MT_HASH3_CALC + + curMatch2 = hash[ h2]; + curMatch3 = hash[kFix3HashSize + h3]; + + hash[ h2] = lzPos; + hash[kFix3HashSize + h3] = lzPos; + + if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) + { + distances[1] = lzPos - curMatch2 - 1; + if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2]) + { + distances[0] = 3; + return distances + 2; + } + distances[0] = 2; + distances += 2; + } + + if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0]) + { + *distances++ = 3; + *distances++ = lzPos - curMatch3 - 1; + } + + return distances; +} + +/* +static UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *distances) +{ + UInt32 h2, h3, h4, curMatch2, curMatch3, curMatch4; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 lzPos = p->lzPos; + MT_HASH4_CALC + + curMatch2 = hash[ h2]; + curMatch3 = hash[kFix3HashSize + h3]; + curMatch4 = hash[kFix4HashSize + h4]; + + hash[ h2] = lzPos; + hash[kFix3HashSize + h3] = lzPos; + hash[kFix4HashSize + h4] = lzPos; + + if (curMatch2 >= matchMinPos && cur[(ptrdiff_t)curMatch2 - lzPos] == cur[0]) + { + distances[1] = lzPos - curMatch2 - 1; + if (cur[(ptrdiff_t)curMatch2 - lzPos + 2] == cur[2]) + { + distances[0] = (cur[(ptrdiff_t)curMatch2 - lzPos + 3] == cur[3]) ? 4 : 3; + return distances + 2; + } + distances[0] = 2; + distances += 2; + } + + if (curMatch3 >= matchMinPos && cur[(ptrdiff_t)curMatch3 - lzPos] == cur[0]) + { + distances[1] = lzPos - curMatch3 - 1; + if (cur[(ptrdiff_t)curMatch3 - lzPos + 3] == cur[3]) + { + distances[0] = 4; + return distances + 2; + } + distances[0] = 3; + distances += 2; + } + + if (curMatch4 >= matchMinPos) + if ( + cur[(ptrdiff_t)curMatch4 - lzPos] == cur[0] && + cur[(ptrdiff_t)curMatch4 - lzPos + 3] == cur[3] + ) + { + *distances++ = 4; + *distances++ = lzPos - curMatch4 - 1; + } + + return distances; +} +*/ + +#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++; + +static UInt32 MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *distances) +{ + const UInt32 *btBuf = p->btBuf + p->btBufPos; + UInt32 len = *btBuf++; + p->btBufPos += 1 + len; + p->btNumAvailBytes--; + { + UInt32 i; + for (i = 0; i < len; i += 2) + { + *distances++ = *btBuf++; + *distances++ = *btBuf++; + } + } + INCREASE_LZ_POS + return len; +} + +static UInt32 MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *distances) +{ + const UInt32 *btBuf = p->btBuf + p->btBufPos; + UInt32 len = *btBuf++; + p->btBufPos += 1 + len; + + if (len == 0) + { + /* change for bt5 ! */ + if (p->btNumAvailBytes-- >= 4) + len = (UInt32)(p->MixMatchesFunc(p, p->lzPos - p->historySize, distances) - (distances)); + } + else + { + /* Condition: there are matches in btBuf with length < p->numHashBytes */ + UInt32 *distances2; + p->btNumAvailBytes--; + distances2 = p->MixMatchesFunc(p, p->lzPos - btBuf[1], distances); + do + { + *distances2++ = *btBuf++; + *distances2++ = *btBuf++; + } + while ((len -= 2) != 0); + len = (UInt32)(distances2 - (distances)); + } + INCREASE_LZ_POS + return len; +} + +#define SKIP_HEADER2_MT do { GET_NEXT_BLOCK_IF_REQUIRED +#define SKIP_HEADER_MT(n) SKIP_HEADER2_MT if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash; +#define SKIP_FOOTER_MT } INCREASE_LZ_POS p->btBufPos += p->btBuf[p->btBufPos] + 1; } while (--num != 0); + +static void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER2_MT { p->btNumAvailBytes--; + SKIP_FOOTER_MT +} + +static void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER_MT(2) + UInt32 h2; + MT_HASH2_CALC + hash[h2] = p->lzPos; + SKIP_FOOTER_MT +} + +static void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER_MT(3) + UInt32 h2, h3; + MT_HASH3_CALC + hash[kFix3HashSize + h3] = + hash[ h2] = + p->lzPos; + SKIP_FOOTER_MT +} + +/* +static void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER_MT(4) + UInt32 h2, h3, h4; + MT_HASH4_CALC + hash[kFix4HashSize + h4] = + hash[kFix3HashSize + h3] = + hash[ h2] = + p->lzPos; + SKIP_FOOTER_MT +} +*/ + +void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinderMt_Init; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos; + vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches; + + switch (p->MatchFinder->numHashBytes) + { + case 2: + p->GetHeadsFunc = GetHeads2; + p->MixMatchesFunc = (Mf_Mix_Matches)0; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip; + vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches; + break; + case 3: + p->GetHeadsFunc = GetHeads3; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip; + break; + default: + /* case 4: */ + p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads4b : GetHeads4; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip; + break; + /* + default: + p->GetHeadsFunc = GetHeads5; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt4_Skip; + break; + */ + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzFindMt.h b/Provenance/LzmaSDKObjC/lzma/C/LzFindMt.h new file mode 100644 index 0000000000..46b6924ad7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzFindMt.h @@ -0,0 +1,101 @@ +/* LzFindMt.h -- multithreaded Match finder for LZ algorithms +2015-05-03 : Igor Pavlov : Public domain */ + +#ifndef __LZ_FIND_MT_H +#define __LZ_FIND_MT_H + +#include "LzFind.h" +#include "Threads.h" + +EXTERN_C_BEGIN + +#define kMtHashBlockSize (1 << 13) +#define kMtHashNumBlocks (1 << 3) +#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1) + +#define kMtBtBlockSize (1 << 14) +#define kMtBtNumBlocks (1 << 6) +#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1) + +typedef struct _CMtSync +{ + Bool wasCreated; + Bool needStart; + Bool exit; + Bool stopWriting; + + CThread thread; + CAutoResetEvent canStart; + CAutoResetEvent wasStarted; + CAutoResetEvent wasStopped; + CSemaphore freeSemaphore; + CSemaphore filledSemaphore; + Bool csWasInitialized; + Bool csWasEntered; + CCriticalSection cs; + UInt32 numProcessedBlocks; +} CMtSync; + +typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); + +/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ +#define kMtCacheLineDummy 128 + +typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, + UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); + +typedef struct _CMatchFinderMt +{ + /* LZ */ + const Byte *pointerToCurPos; + UInt32 *btBuf; + UInt32 btBufPos; + UInt32 btBufPosLimit; + UInt32 lzPos; + UInt32 btNumAvailBytes; + + UInt32 *hash; + UInt32 fixedHashSize; + UInt32 historySize; + const UInt32 *crc; + + Mf_Mix_Matches MixMatchesFunc; + + /* LZ + BT */ + CMtSync btSync; + Byte btDummy[kMtCacheLineDummy]; + + /* BT */ + UInt32 *hashBuf; + UInt32 hashBufPos; + UInt32 hashBufPosLimit; + UInt32 hashNumAvail; + + CLzRef *son; + UInt32 matchMaxLen; + UInt32 numHashBytes; + UInt32 pos; + const Byte *buffer; + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be historySize + 1 */ + UInt32 cutValue; + + /* BT + Hash */ + CMtSync hashSync; + /* Byte hashDummy[kMtCacheLineDummy]; */ + + /* Hash */ + Mf_GetHeads GetHeadsFunc; + CMatchFinder *MatchFinder; +} CMatchFinderMt; + +void MatchFinderMt_Construct(CMatchFinderMt *p); +void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAlloc *alloc); +SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAlloc *alloc); +void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); +void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzHash.h b/Provenance/LzmaSDKObjC/lzma/C/LzHash.h new file mode 100644 index 0000000000..2191444072 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzHash.h @@ -0,0 +1,57 @@ +/* LzHash.h -- HASH functions for LZ algorithms +2015-04-12 : Igor Pavlov : Public domain */ + +#ifndef __LZ_HASH_H +#define __LZ_HASH_H + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +#define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +#define HASH2_CALC hv = cur[0] | ((UInt32)cur[1] << 8); + +#define HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + hv = (temp ^ (p->crc[cur[3]] << 5)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + temp ^= (p->crc[cur[3]] << 5); \ + h4 = temp & (kHash4Size - 1); \ + hv = (temp ^ (p->crc[cur[4]] << 3)) & p->hashMask; } + +/* #define HASH_ZIP_CALC hv = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ +#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + + +#define MT_HASH2_CALC \ + h2 = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define MT_HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + h4 = (temp ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma2Dec.c b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Dec.c new file mode 100644 index 0000000000..b6884571c2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Dec.c @@ -0,0 +1,378 @@ +/* Lzma2Dec.c -- LZMA2 Decoder +2015-11-09 : Igor Pavlov : Public domain */ + +/* #define SHOW_DEBUG_INFO */ + +#include "Precomp.h" + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#include + +#include "Lzma2Dec.h" + +/* +00000000 - EOS +00000001 U U - Uncompressed Reset Dic +00000010 U U - Uncompressed No Reset +100uuuuu U U P P - LZMA no reset +101uuuuu U U P P - LZMA reset state +110uuuuu U U P P S - LZMA reset state + new prop +111uuuuu U U P P S - LZMA reset state + new prop + reset dic + + u, U - Unpack Size + P - Pack Size + S - Props +*/ + +#define LZMA2_CONTROL_LZMA (1 << 7) +#define LZMA2_CONTROL_COPY_NO_RESET 2 +#define LZMA2_CONTROL_COPY_RESET_DIC 1 +#define LZMA2_CONTROL_EOF 0 + +#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0) + +#define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3) +#define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2) + +#define LZMA2_LCLP_MAX 4 +#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) + +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif + +typedef enum +{ + LZMA2_STATE_CONTROL, + LZMA2_STATE_UNPACK0, + LZMA2_STATE_UNPACK1, + LZMA2_STATE_PACK0, + LZMA2_STATE_PACK1, + LZMA2_STATE_PROP, + LZMA2_STATE_DATA, + LZMA2_STATE_DATA_CONT, + LZMA2_STATE_FINISHED, + LZMA2_STATE_ERROR +} ELzma2State; + +static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) +{ + UInt32 dicSize; + if (prop > 40) + return SZ_ERROR_UNSUPPORTED; + dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); + props[0] = (Byte)LZMA2_LCLP_MAX; + props[1] = (Byte)(dicSize); + props[2] = (Byte)(dicSize >> 8); + props[3] = (Byte)(dicSize >> 16); + props[4] = (Byte)(dicSize >> 24); + return SZ_OK; +} + +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) +{ + Byte props[LZMA_PROPS_SIZE]; + RINOK(Lzma2Dec_GetOldProps(prop, props)); + return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); +} + +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc) +{ + Byte props[LZMA_PROPS_SIZE]; + RINOK(Lzma2Dec_GetOldProps(prop, props)); + return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); +} + +void Lzma2Dec_Init(CLzma2Dec *p) +{ + p->state = LZMA2_STATE_CONTROL; + p->needInitDic = True; + p->needInitState = True; + p->needInitProp = True; + LzmaDec_Init(&p->decoder); +} + +static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) +{ + switch (p->state) + { + case LZMA2_STATE_CONTROL: + p->control = b; + PRF(printf("\n %4X ", (unsigned)p->decoder.dicPos)); + PRF(printf(" %2X", (unsigned)b)); + if (p->control == 0) + return LZMA2_STATE_FINISHED; + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if ((p->control & 0x7F) > 2) + return LZMA2_STATE_ERROR; + p->unpackSize = 0; + } + else + p->unpackSize = (UInt32)(p->control & 0x1F) << 16; + return LZMA2_STATE_UNPACK0; + + case LZMA2_STATE_UNPACK0: + p->unpackSize |= (UInt32)b << 8; + return LZMA2_STATE_UNPACK1; + + case LZMA2_STATE_UNPACK1: + p->unpackSize |= (UInt32)b; + p->unpackSize++; + PRF(printf(" %8u", (unsigned)p->unpackSize)); + return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; + + case LZMA2_STATE_PACK0: + p->packSize = (UInt32)b << 8; + return LZMA2_STATE_PACK1; + + case LZMA2_STATE_PACK1: + p->packSize |= (UInt32)b; + p->packSize++; + PRF(printf(" %8u", (unsigned)p->packSize)); + return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP: + (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA); + + case LZMA2_STATE_PROP: + { + unsigned lc, lp; + if (b >= (9 * 5 * 5)) + return LZMA2_STATE_ERROR; + lc = b % 9; + b /= 9; + p->decoder.prop.pb = b / 5; + lp = b % 5; + if (lc + lp > LZMA2_LCLP_MAX) + return LZMA2_STATE_ERROR; + p->decoder.prop.lc = lc; + p->decoder.prop.lp = lp; + p->needInitProp = False; + return LZMA2_STATE_DATA; + } + } + return LZMA2_STATE_ERROR; +} + +static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) +{ + memcpy(p->dic + p->dicPos, src, size); + p->dicPos += size; + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size) + p->checkDicSize = p->prop.dicSize; + p->processedPos += (UInt32)size; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState); + +SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->state != LZMA2_STATE_FINISHED) + { + SizeT dicPos = p->decoder.dicPos; + + if (p->state == LZMA2_STATE_ERROR) + return SZ_ERROR_DATA; + + if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + + if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) + { + if (*srcLen == inSize) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + (*srcLen)++; + p->state = Lzma2Dec_UpdateState(p, *src++); + + if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) + { + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; + } + continue; + } + + { + SizeT destSizeCur = dicLimit - dicPos; + SizeT srcSizeCur = inSize - *srcLen; + ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; + + if (p->unpackSize <= destSizeCur) + { + destSizeCur = (SizeT)p->unpackSize; + curFinishMode = LZMA_FINISH_END; + } + + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if (*srcLen == inSize) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + if (p->state == LZMA2_STATE_DATA) + { + Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); + if (initDic) + p->needInitProp = p->needInitState = True; + else if (p->needInitDic) + { + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; + } + p->needInitDic = False; + LzmaDec_InitDicAndState(&p->decoder, initDic, False); + } + + if (srcSizeCur > destSizeCur) + srcSizeCur = destSizeCur; + + if (srcSizeCur == 0) + { + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; + } + + LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur); + + src += srcSizeCur; + *srcLen += srcSizeCur; + p->unpackSize -= (UInt32)srcSizeCur; + p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; + } + else + { + SizeT outSizeProcessed; + SRes res; + + if (p->state == LZMA2_STATE_DATA) + { + unsigned mode = LZMA2_GET_LZMA_MODE(p); + Bool initDic = (mode == 3); + Bool initState = (mode != 0); + if ((!initDic && p->needInitDic) || (!initState && p->needInitState)) + { + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; + } + + LzmaDec_InitDicAndState(&p->decoder, initDic, initState); + p->needInitDic = False; + p->needInitState = False; + p->state = LZMA2_STATE_DATA_CONT; + } + + if (srcSizeCur > p->packSize) + srcSizeCur = (SizeT)p->packSize; + + res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status); + + src += srcSizeCur; + *srcLen += srcSizeCur; + p->packSize -= (UInt32)srcSizeCur; + + outSizeProcessed = p->decoder.dicPos - dicPos; + p->unpackSize -= (UInt32)outSizeProcessed; + + RINOK(res); + if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) + return res; + + if (srcSizeCur == 0 && outSizeProcessed == 0) + { + if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + || p->unpackSize != 0 + || p->packSize != 0) + { + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; + } + p->state = LZMA2_STATE_CONTROL; + } + + if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) + *status = LZMA_STATUS_NOT_FINISHED; + } + } + } + + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; +} + +SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen, inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT srcSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->decoder.dicPos == p->decoder.dicBufSize) + p->decoder.dicPos = 0; + dicPos = p->decoder.dicPos; + if (outSize > p->decoder.dicBufSize - dicPos) + { + outSizeCur = p->decoder.dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = Lzma2Dec_DecodeToDic(p, outSizeCur, src, &srcSizeCur, curFinishMode, status); + src += srcSizeCur; + inSize -= srcSizeCur; + *srcLen += srcSizeCur; + outSizeCur = p->decoder.dicPos - dicPos; + memcpy(dest, p->decoder.dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) +{ + CLzma2Dec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + Lzma2Dec_Construct(&p); + RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); + p.decoder.dic = dest; + p.decoder.dicBufSize = outSize; + Lzma2Dec_Init(&p); + *srcLen = inSize; + res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.decoder.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + Lzma2Dec_FreeProbs(&p, alloc); + return res; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma2Dec.h b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Dec.h new file mode 100644 index 0000000000..026cdefe99 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Dec.h @@ -0,0 +1,80 @@ +/* Lzma2Dec.h -- LZMA2 Decoder +2015-05-13 : Igor Pavlov : Public domain */ + +#ifndef __LZMA2_DEC_H +#define __LZMA2_DEC_H + +#include "LzmaDec.h" + +EXTERN_C_BEGIN + +/* ---------- State Interface ---------- */ + +typedef struct +{ + CLzmaDec decoder; + UInt32 packSize; + UInt32 unpackSize; + unsigned state; + Byte control; + Bool needInitDic; + Bool needInitState; + Bool needInitProp; +} CLzma2Dec; + +#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) +#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc); +#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc); + +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc); +void Lzma2Dec_Init(CLzma2Dec *p); + + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen or dicLimit). + LZMA_FINISH_ANY - use smallest number of input bytes + LZMA_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + SZ_ERROR_DATA - Data error +*/ + +SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + +SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - use smallest number of input bytes + LZMA_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma2Enc.c b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Enc.c new file mode 100644 index 0000000000..cba013497a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Enc.c @@ -0,0 +1,520 @@ +/* Lzma2Enc.c -- LZMA2 Encoder +2015-10-04 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +/* #include */ +#include + +/* #define _7ZIP_ST */ + +#include "Lzma2Enc.h" + +#ifndef _7ZIP_ST +#include "MtCoder.h" +#else +#define NUM_MT_CODER_THREADS_MAX 1 +#endif + +#define LZMA2_CONTROL_LZMA (1 << 7) +#define LZMA2_CONTROL_COPY_NO_RESET 2 +#define LZMA2_CONTROL_COPY_RESET_DIC 1 +#define LZMA2_CONTROL_EOF 0 + +#define LZMA2_LCLP_MAX 4 + +#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) + +#define LZMA2_PACK_SIZE_MAX (1 << 16) +#define LZMA2_COPY_CHUNK_SIZE LZMA2_PACK_SIZE_MAX +#define LZMA2_UNPACK_SIZE_MAX (1 << 21) +#define LZMA2_KEEP_WINDOW_SIZE LZMA2_UNPACK_SIZE_MAX + +#define LZMA2_CHUNK_SIZE_COMPRESSED_MAX ((1 << 16) + 16) + + +#define PRF(x) /* x */ + +/* ---------- CLzma2EncInt ---------- */ + +typedef struct +{ + CLzmaEncHandle enc; + UInt64 srcPos; + Byte props; + Bool needInitState; + Bool needInitProp; +} CLzma2EncInt; + +static SRes Lzma2EncInt_Init(CLzma2EncInt *p, const CLzma2EncProps *props) +{ + Byte propsEncoded[LZMA_PROPS_SIZE]; + SizeT propsSize = LZMA_PROPS_SIZE; + RINOK(LzmaEnc_SetProps(p->enc, &props->lzmaProps)); + RINOK(LzmaEnc_WriteProperties(p->enc, propsEncoded, &propsSize)); + p->srcPos = 0; + p->props = propsEncoded[0]; + p->needInitState = True; + p->needInitProp = True; + return SZ_OK; +} + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); +void LzmaEnc_Finish(CLzmaEncHandle pp); +void LzmaEnc_SaveState(CLzmaEncHandle pp); +void LzmaEnc_RestoreState(CLzmaEncHandle pp); + + +static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, + size_t *packSizeRes, ISeqOutStream *outStream) +{ + size_t packSizeLimit = *packSizeRes; + size_t packSize = packSizeLimit; + UInt32 unpackSize = LZMA2_UNPACK_SIZE_MAX; + unsigned lzHeaderSize = 5 + (p->needInitProp ? 1 : 0); + Bool useCopyBlock; + SRes res; + + *packSizeRes = 0; + if (packSize < lzHeaderSize) + return SZ_ERROR_OUTPUT_EOF; + packSize -= lzHeaderSize; + + LzmaEnc_SaveState(p->enc); + res = LzmaEnc_CodeOneMemBlock(p->enc, p->needInitState, + outBuf + lzHeaderSize, &packSize, LZMA2_PACK_SIZE_MAX, &unpackSize); + + PRF(printf("\npackSize = %7d unpackSize = %7d ", packSize, unpackSize)); + + if (unpackSize == 0) + return res; + + if (res == SZ_OK) + useCopyBlock = (packSize + 2 >= unpackSize || packSize > (1 << 16)); + else + { + if (res != SZ_ERROR_OUTPUT_EOF) + return res; + res = SZ_OK; + useCopyBlock = True; + } + + if (useCopyBlock) + { + size_t destPos = 0; + PRF(printf("################# COPY ")); + + while (unpackSize > 0) + { + UInt32 u = (unpackSize < LZMA2_COPY_CHUNK_SIZE) ? unpackSize : LZMA2_COPY_CHUNK_SIZE; + if (packSizeLimit - destPos < u + 3) + return SZ_ERROR_OUTPUT_EOF; + outBuf[destPos++] = (Byte)(p->srcPos == 0 ? LZMA2_CONTROL_COPY_RESET_DIC : LZMA2_CONTROL_COPY_NO_RESET); + outBuf[destPos++] = (Byte)((u - 1) >> 8); + outBuf[destPos++] = (Byte)(u - 1); + memcpy(outBuf + destPos, LzmaEnc_GetCurBuf(p->enc) - unpackSize, u); + unpackSize -= u; + destPos += u; + p->srcPos += u; + + if (outStream) + { + *packSizeRes += destPos; + if (outStream->Write(outStream, outBuf, destPos) != destPos) + return SZ_ERROR_WRITE; + destPos = 0; + } + else + *packSizeRes = destPos; + /* needInitState = True; */ + } + + LzmaEnc_RestoreState(p->enc); + return SZ_OK; + } + + { + size_t destPos = 0; + UInt32 u = unpackSize - 1; + UInt32 pm = (UInt32)(packSize - 1); + unsigned mode = (p->srcPos == 0) ? 3 : (p->needInitState ? (p->needInitProp ? 2 : 1) : 0); + + PRF(printf(" ")); + + outBuf[destPos++] = (Byte)(LZMA2_CONTROL_LZMA | (mode << 5) | ((u >> 16) & 0x1F)); + outBuf[destPos++] = (Byte)(u >> 8); + outBuf[destPos++] = (Byte)u; + outBuf[destPos++] = (Byte)(pm >> 8); + outBuf[destPos++] = (Byte)pm; + + if (p->needInitProp) + outBuf[destPos++] = p->props; + + p->needInitProp = False; + p->needInitState = False; + destPos += packSize; + p->srcPos += unpackSize; + + if (outStream) + if (outStream->Write(outStream, outBuf, destPos) != destPos) + return SZ_ERROR_WRITE; + + *packSizeRes = destPos; + return SZ_OK; + } +} + + +/* ---------- Lzma2 Props ---------- */ + +void Lzma2EncProps_Init(CLzma2EncProps *p) +{ + LzmaEncProps_Init(&p->lzmaProps); + p->numTotalThreads = -1; + p->numBlockThreads = -1; + p->blockSize = 0; +} + +void Lzma2EncProps_Normalize(CLzma2EncProps *p) +{ + int t1, t1n, t2, t3; + { + CLzmaEncProps lzmaProps = p->lzmaProps; + LzmaEncProps_Normalize(&lzmaProps); + t1n = lzmaProps.numThreads; + } + + t1 = p->lzmaProps.numThreads; + t2 = p->numBlockThreads; + t3 = p->numTotalThreads; + + if (t2 > NUM_MT_CODER_THREADS_MAX) + t2 = NUM_MT_CODER_THREADS_MAX; + + if (t3 <= 0) + { + if (t2 <= 0) + t2 = 1; + t3 = t1n * t2; + } + else if (t2 <= 0) + { + t2 = t3 / t1n; + if (t2 == 0) + { + t1 = 1; + t2 = t3; + } + if (t2 > NUM_MT_CODER_THREADS_MAX) + t2 = NUM_MT_CODER_THREADS_MAX; + } + else if (t1 <= 0) + { + t1 = t3 / t2; + if (t1 == 0) + t1 = 1; + } + else + t3 = t1n * t2; + + p->lzmaProps.numThreads = t1; + + LzmaEncProps_Normalize(&p->lzmaProps); + + t1 = p->lzmaProps.numThreads; + + if (p->blockSize == 0) + { + UInt32 dictSize = p->lzmaProps.dictSize; + UInt64 blockSize = (UInt64)dictSize << 2; + const UInt32 kMinSize = (UInt32)1 << 20; + const UInt32 kMaxSize = (UInt32)1 << 28; + if (blockSize < kMinSize) blockSize = kMinSize; + if (blockSize > kMaxSize) blockSize = kMaxSize; + if (blockSize < dictSize) blockSize = dictSize; + p->blockSize = (size_t)blockSize; + } + + if (t2 > 1 && p->lzmaProps.reduceSize != (UInt64)(Int64)-1) + { + UInt64 temp = p->lzmaProps.reduceSize + p->blockSize - 1; + if (temp > p->lzmaProps.reduceSize) + { + UInt64 numBlocks = temp / p->blockSize; + if (numBlocks < (unsigned)t2) + { + t2 = (unsigned)numBlocks; + if (t2 == 0) + t2 = 1; + t3 = t1 * t2; + } + } + } + + p->numBlockThreads = t2; + p->numTotalThreads = t3; +} + + +static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize) +{ + return (p && p->Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK; +} + + +/* ---------- Lzma2 ---------- */ + +typedef struct +{ + Byte propEncoded; + CLzma2EncProps props; + + Byte *outBuf; + + ISzAlloc *alloc; + ISzAlloc *allocBig; + + CLzma2EncInt coders[NUM_MT_CODER_THREADS_MAX]; + + #ifndef _7ZIP_ST + CMtCoder mtCoder; + #endif + +} CLzma2Enc; + + +/* ---------- Lzma2EncThread ---------- */ + +static SRes Lzma2Enc_EncodeMt1(CLzma2EncInt *p, CLzma2Enc *mainEncoder, + ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) +{ + UInt64 packTotal = 0; + SRes res = SZ_OK; + + if (!mainEncoder->outBuf) + { + mainEncoder->outBuf = (Byte *)IAlloc_Alloc(mainEncoder->alloc, LZMA2_CHUNK_SIZE_COMPRESSED_MAX); + if (!mainEncoder->outBuf) + return SZ_ERROR_MEM; + } + + RINOK(Lzma2EncInt_Init(p, &mainEncoder->props)); + RINOK(LzmaEnc_PrepareForLzma2(p->enc, inStream, LZMA2_KEEP_WINDOW_SIZE, + mainEncoder->alloc, mainEncoder->allocBig)); + + for (;;) + { + size_t packSize = LZMA2_CHUNK_SIZE_COMPRESSED_MAX; + res = Lzma2EncInt_EncodeSubblock(p, mainEncoder->outBuf, &packSize, outStream); + if (res != SZ_OK) + break; + packTotal += packSize; + res = Progress(progress, p->srcPos, packTotal); + if (res != SZ_OK) + break; + if (packSize == 0) + break; + } + + LzmaEnc_Finish(p->enc); + + if (res == SZ_OK) + { + Byte b = 0; + if (outStream->Write(outStream, &b, 1) != 1) + return SZ_ERROR_WRITE; + } + + return res; +} + + +#ifndef _7ZIP_ST + +typedef struct +{ + IMtCoderCallback funcTable; + CLzma2Enc *lzma2Enc; +} CMtCallbackImp; + +static SRes MtCallbackImp_Code(void *pp, unsigned index, Byte *dest, size_t *destSize, + const Byte *src, size_t srcSize, int finished) +{ + CMtCallbackImp *imp = (CMtCallbackImp *)pp; + CLzma2Enc *mainEncoder = imp->lzma2Enc; + CLzma2EncInt *p = &mainEncoder->coders[index]; + + SRes res = SZ_OK; + { + size_t destLim = *destSize; + *destSize = 0; + + if (srcSize != 0) + { + RINOK(Lzma2EncInt_Init(p, &mainEncoder->props)); + + RINOK(LzmaEnc_MemPrepare(p->enc, src, srcSize, LZMA2_KEEP_WINDOW_SIZE, + mainEncoder->alloc, mainEncoder->allocBig)); + + while (p->srcPos < srcSize) + { + size_t packSize = destLim - *destSize; + res = Lzma2EncInt_EncodeSubblock(p, dest + *destSize, &packSize, NULL); + if (res != SZ_OK) + break; + *destSize += packSize; + + if (packSize == 0) + { + res = SZ_ERROR_FAIL; + break; + } + + if (MtProgress_Set(&mainEncoder->mtCoder.mtProgress, index, p->srcPos, *destSize) != SZ_OK) + { + res = SZ_ERROR_PROGRESS; + break; + } + } + + LzmaEnc_Finish(p->enc); + if (res != SZ_OK) + return res; + } + + if (finished) + { + if (*destSize == destLim) + return SZ_ERROR_OUTPUT_EOF; + dest[(*destSize)++] = 0; + } + } + return res; +} + +#endif + + +/* ---------- Lzma2Enc ---------- */ + +CLzma2EncHandle Lzma2Enc_Create(ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzma2Enc *p = (CLzma2Enc *)alloc->Alloc(alloc, sizeof(CLzma2Enc)); + if (!p) + return NULL; + Lzma2EncProps_Init(&p->props); + Lzma2EncProps_Normalize(&p->props); + p->outBuf = 0; + p->alloc = alloc; + p->allocBig = allocBig; + { + unsigned i; + for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) + p->coders[i].enc = 0; + } + + #ifndef _7ZIP_ST + MtCoder_Construct(&p->mtCoder); + #endif + + return p; +} + +void Lzma2Enc_Destroy(CLzma2EncHandle pp) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + unsigned i; + for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) + { + CLzma2EncInt *t = &p->coders[i]; + if (t->enc) + { + LzmaEnc_Destroy(t->enc, p->alloc, p->allocBig); + t->enc = 0; + } + } + + #ifndef _7ZIP_ST + MtCoder_Destruct(&p->mtCoder); + #endif + + IAlloc_Free(p->alloc, p->outBuf); + IAlloc_Free(p->alloc, pp); +} + +SRes Lzma2Enc_SetProps(CLzma2EncHandle pp, const CLzma2EncProps *props) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + CLzmaEncProps lzmaProps = props->lzmaProps; + LzmaEncProps_Normalize(&lzmaProps); + if (lzmaProps.lc + lzmaProps.lp > LZMA2_LCLP_MAX) + return SZ_ERROR_PARAM; + p->props = *props; + Lzma2EncProps_Normalize(&p->props); + return SZ_OK; +} + +Byte Lzma2Enc_WriteProperties(CLzma2EncHandle pp) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + unsigned i; + UInt32 dicSize = LzmaEncProps_GetDictSize(&p->props.lzmaProps); + for (i = 0; i < 40; i++) + if (dicSize <= LZMA2_DIC_SIZE_FROM_PROP(i)) + break; + return (Byte)i; +} + +SRes Lzma2Enc_Encode(CLzma2EncHandle pp, + ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + int i; + + for (i = 0; i < p->props.numBlockThreads; i++) + { + CLzma2EncInt *t = &p->coders[(unsigned)i]; + if (!t->enc) + { + t->enc = LzmaEnc_Create(p->alloc); + if (!t->enc) + return SZ_ERROR_MEM; + } + } + + #ifndef _7ZIP_ST + if (p->props.numBlockThreads > 1) + { + CMtCallbackImp mtCallback; + + mtCallback.funcTable.Code = MtCallbackImp_Code; + mtCallback.lzma2Enc = p; + + p->mtCoder.progress = progress; + p->mtCoder.inStream = inStream; + p->mtCoder.outStream = outStream; + p->mtCoder.alloc = p->alloc; + p->mtCoder.mtCallback = &mtCallback.funcTable; + + p->mtCoder.blockSize = p->props.blockSize; + p->mtCoder.destBlockSize = p->props.blockSize + (p->props.blockSize >> 10) + 16; + if (p->mtCoder.destBlockSize < p->props.blockSize) + { + p->mtCoder.destBlockSize = (size_t)0 - 1; + if (p->mtCoder.destBlockSize < p->props.blockSize) + return SZ_ERROR_FAIL; + } + p->mtCoder.numThreads = p->props.numBlockThreads; + + return MtCoder_Code(&p->mtCoder); + } + #endif + + return Lzma2Enc_EncodeMt1(&p->coders[0], p, outStream, inStream, progress); +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma2Enc.h b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Enc.h new file mode 100644 index 0000000000..061178aafd --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma2Enc.h @@ -0,0 +1,62 @@ +/* Lzma2Enc.h -- LZMA2 Encoder +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA2_ENC_H +#define __LZMA2_ENC_H + +#include "LzmaEnc.h" + +EXTERN_C_BEGIN + +typedef struct +{ + CLzmaEncProps lzmaProps; + size_t blockSize; + int numBlockThreads; + int numTotalThreads; +} CLzma2EncProps; + +void Lzma2EncProps_Init(CLzma2EncProps *p); +void Lzma2EncProps_Normalize(CLzma2EncProps *p); + +/* ---------- CLzmaEnc2Handle Interface ---------- */ + +/* Lzma2Enc_* functions can return the following exit codes: +Returns: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - Write callback error + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +typedef void * CLzma2EncHandle; + +CLzma2EncHandle Lzma2Enc_Create(ISzAlloc *alloc, ISzAlloc *allocBig); +void Lzma2Enc_Destroy(CLzma2EncHandle p); +SRes Lzma2Enc_SetProps(CLzma2EncHandle p, const CLzma2EncProps *props); +Byte Lzma2Enc_WriteProperties(CLzma2EncHandle p); +SRes Lzma2Enc_Encode(CLzma2EncHandle p, + ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress); + +/* ---------- One Call Interface ---------- */ + +/* Lzma2Encode +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +/* +SRes Lzma2Encode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); +*/ + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma86.h b/Provenance/LzmaSDKObjC/lzma/C/Lzma86.h new file mode 100644 index 0000000000..83057e5983 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma86.h @@ -0,0 +1,111 @@ +/* Lzma86.h -- LZMA + x86 (BCJ) Filter +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA86_H +#define __LZMA86_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define LZMA86_SIZE_OFFSET (1 + 5) +#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8) + +/* +It's an example for LZMA + x86 Filter use. +You can use .lzma86 extension, if you write that stream to file. +.lzma86 header adds one additional byte to standard .lzma header. +.lzma86 header (14 bytes): + Offset Size Description + 0 1 = 0 - no filter, pure LZMA + = 1 - x86 filter + LZMA + 1 1 lc, lp and pb in encoded form + 2 4 dictSize (little endian) + 6 8 uncompressed size (little endian) + + +Lzma86_Encode +------------- +level - compression level: 0 <= level <= 9, the default value for "level" is 5. + +dictSize - The dictionary size in bytes. The maximum value is + 128 MB = (1 << 27) bytes for 32-bit version + 1 GB = (1 << 30) bytes for 64-bit version + The default value is 16 MB = (1 << 24) bytes, for level = 5. + It's recommended to use the dictionary that is larger than 4 KB and + that can be calculated as (1 << N) or (3 << N) sizes. + For better compression ratio dictSize must be >= inSize. + +filterMode: + SZ_FILTER_NO - no Filter + SZ_FILTER_YES - x86 Filter + SZ_FILTER_AUTO - it tries both alternatives to select best. + Encoder will use 2 or 3 passes: + 2 passes when FILTER_NO provides better compression. + 3 passes when FILTER_YES provides better compression. + +Lzma86Encode allocates Data with MyAlloc functions. +RAM Requirements for compressing: + RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize + filterMode FilterBlockSize + SZ_FILTER_NO 0 + SZ_FILTER_YES inSize + SZ_FILTER_AUTO inSize + + +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +enum ESzFilterMode +{ + SZ_FILTER_NO, + SZ_FILTER_YES, + SZ_FILTER_AUTO +}; + +SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, + int level, UInt32 dictSize, int filterMode); + + +/* +Lzma86_GetUnpackSize: + In: + src - input data + srcLen - input data size + Out: + unpackSize - size of uncompressed stream + Return code: + SZ_OK - OK + SZ_ERROR_INPUT_EOF - Error in headers +*/ + +SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize); + +/* +Lzma86_Decode: + In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size + Out: + destLen - processed output size + srcLen - processed input size + Return code: + SZ_OK - OK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - unsupported file + SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer +*/ + +SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma86Dec.c b/Provenance/LzmaSDKObjC/lzma/C/Lzma86Dec.c new file mode 100644 index 0000000000..20ac5e7a97 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma86Dec.c @@ -0,0 +1,54 @@ +/* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Lzma86.h" + +#include "Alloc.h" +#include "Bra.h" +#include "LzmaDec.h" + +SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize) +{ + unsigned i; + if (srcLen < LZMA86_HEADER_SIZE) + return SZ_ERROR_INPUT_EOF; + *unpackSize = 0; + for (i = 0; i < sizeof(UInt64); i++) + *unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i); + return SZ_OK; +} + +SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen) +{ + SRes res; + int useFilter; + SizeT inSizePure; + ELzmaStatus status; + + if (*srcLen < LZMA86_HEADER_SIZE) + return SZ_ERROR_INPUT_EOF; + + useFilter = src[0]; + + if (useFilter > 1) + { + *destLen = 0; + return SZ_ERROR_UNSUPPORTED; + } + + inSizePure = *srcLen - LZMA86_HEADER_SIZE; + res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure, + src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc); + *srcLen = inSizePure + LZMA86_HEADER_SIZE; + if (res != SZ_OK) + return res; + if (useFilter == 1) + { + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(dest, *destLen, 0, &x86State, 0); + } + return SZ_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Lzma86Enc.c b/Provenance/LzmaSDKObjC/lzma/C/Lzma86Enc.c new file mode 100644 index 0000000000..ee59fb7d77 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Lzma86Enc.c @@ -0,0 +1,106 @@ +/* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "Lzma86.h" + +#include "Alloc.h" +#include "Bra.h" +#include "LzmaEnc.h" + +#define SZE_OUT_OVERFLOW SZE_DATA_ERROR + +int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, + int level, UInt32 dictSize, int filterMode) +{ + size_t outSize2 = *destLen; + Byte *filteredStream; + Bool useFilter; + int mainResult = SZ_ERROR_OUTPUT_EOF; + CLzmaEncProps props; + LzmaEncProps_Init(&props); + props.level = level; + props.dictSize = dictSize; + + *destLen = 0; + if (outSize2 < LZMA86_HEADER_SIZE) + return SZ_ERROR_OUTPUT_EOF; + + { + int i; + UInt64 t = srcLen; + for (i = 0; i < 8; i++, t >>= 8) + dest[LZMA86_SIZE_OFFSET + i] = (Byte)t; + } + + filteredStream = 0; + useFilter = (filterMode != SZ_FILTER_NO); + if (useFilter) + { + if (srcLen != 0) + { + filteredStream = (Byte *)MyAlloc(srcLen); + if (filteredStream == 0) + return SZ_ERROR_MEM; + memcpy(filteredStream, src, srcLen); + } + { + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(filteredStream, srcLen, 0, &x86State, 1); + } + } + + { + size_t minSize = 0; + Bool bestIsFiltered = False; + + /* passes for SZ_FILTER_AUTO: + 0 - BCJ + LZMA + 1 - LZMA + 2 - BCJ + LZMA agaian, if pass 0 (BCJ + LZMA) is better. + */ + int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1; + + int i; + for (i = 0; i < numPasses; i++) + { + size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE; + size_t outPropsSize = 5; + SRes curRes; + Bool curModeIsFiltered = (numPasses > 1 && i == numPasses - 1); + if (curModeIsFiltered && !bestIsFiltered) + break; + if (useFilter && i == 0) + curModeIsFiltered = True; + + curRes = LzmaEncode(dest + LZMA86_HEADER_SIZE, &outSizeProcessed, + curModeIsFiltered ? filteredStream : src, srcLen, + &props, dest + 1, &outPropsSize, 0, + NULL, &g_Alloc, &g_Alloc); + + if (curRes != SZ_ERROR_OUTPUT_EOF) + { + if (curRes != SZ_OK) + { + mainResult = curRes; + break; + } + if (outSizeProcessed <= minSize || mainResult != SZ_OK) + { + minSize = outSizeProcessed; + bestIsFiltered = curModeIsFiltered; + mainResult = SZ_OK; + } + } + } + dest[0] = (Byte)(bestIsFiltered ? 1 : 0); + *destLen = LZMA86_HEADER_SIZE + minSize; + } + if (useFilter) + MyFree(filteredStream); + return mainResult; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzmaDec.c b/Provenance/LzmaSDKObjC/lzma/C/LzmaDec.c new file mode 100644 index 0000000000..64f1164f3d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzmaDec.c @@ -0,0 +1,1100 @@ +/* LzmaDec.c -- LZMA Decoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "LzmaDec.h" + +#include + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 + +#define RC_INIT_SIZE 5 + +#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); +#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } +#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) + +#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } +#define TREE_DECODE(probs, limit, i) \ + { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } + +/* #define _LZMA_SIZE_OPT */ + +#ifdef _LZMA_SIZE_OPT +#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) +#else +#define TREE_6_DECODE(probs, i) \ + { i = 1; \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + i -= 0x40; } +#endif + +#define NORMAL_LITER_DEC GET_BIT(prob + symbol, symbol) +#define MATCHED_LITER_DEC \ + matchByte <<= 1; \ + bit = (matchByte & offs); \ + probLit = prob + offs + bit + symbol; \ + GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) + +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) +#define UPDATE_0_CHECK range = bound; +#define UPDATE_1_CHECK range -= bound; code -= bound; +#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } +#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) +#define TREE_DECODE_CHECK(probs, limit, i) \ + { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenChoice 0 +#define LenChoice2 (LenChoice + 1) +#define LenLow (LenChoice2 + 1) +#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) +#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + + +#define kNumStates 12 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define IsMatch 0 +#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define IsRep0Long (IsRepG2 + kNumStates) +#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) +#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) +#define LenCoder (Align + kAlignTableSize) +#define RepLenCoder (LenCoder + kNumLenProbs) +#define Literal (RepLenCoder + kNumLenProbs) + +#define LZMA_BASE_SIZE 1846 +#define LZMA_LIT_SIZE 0x300 + +#if Literal != LZMA_BASE_SIZE +StopCompilingDueBUG +#endif + +#define LzmaProps_GetNumProbs(p) (Literal + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + +#define LZMA_DIC_MIN (1 << 12) + +/* First LZMA-symbol is always decoded. +And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization +Out: + Result: + SZ_OK - OK + SZ_ERROR_DATA - Error + p->remainLen: + < kMatchSpecLenStart : normal remain + = kMatchSpecLenStart : finished + = kMatchSpecLenStart + 1 : Flush marker (unused now) + = kMatchSpecLenStart + 2 : State Init Marker (unused now) +*/ + +static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + CLzmaProb *probs = p->probs; + + unsigned state = p->state; + UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; + unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; + unsigned lc = p->prop.lc; + + Byte *dic = p->dic; + SizeT dicBufSize = p->dicBufSize; + SizeT dicPos = p->dicPos; + + UInt32 processedPos = p->processedPos; + UInt32 checkDicSize = p->checkDicSize; + unsigned len = 0; + + const Byte *buf = p->buf; + UInt32 range = p->range; + UInt32 code = p->code; + + do + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = processedPos & pbMask; + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + unsigned symbol; + UPDATE_0(prob); + prob = probs + Literal; + if (processedPos != 0 || checkDicSize != 0) + prob += ((UInt32)LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + + (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); + processedPos++; + + if (state < kNumLitStates) + { + state -= (state < 4) ? state : 3; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do { NORMAL_LITER_DEC } while (symbol < 0x100); + #else + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + #endif + } + else + { + unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + unsigned offs = 0x100; + state -= (state < 10) ? 3 : 6; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + } + while (symbol < 0x100); + #else + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + } + #endif + } + + dic[dicPos++] = (Byte)symbol; + continue; + } + + { + UPDATE_1(prob); + prob = probs + IsRep + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + state += kNumStates; + prob = probs + LenCoder; + } + else + { + UPDATE_1(prob); + if (checkDicSize == 0 && processedPos == 0) + return SZ_ERROR_DATA; + prob = probs + IsRepG0 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0(prob) + { + UPDATE_0(prob); + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + processedPos++; + state = state < kNumLitStates ? 9 : 11; + continue; + } + UPDATE_1(prob); + } + else + { + UInt32 distance; + UPDATE_1(prob); + prob = probs + IsRepG1 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep1; + } + else + { + UPDATE_1(prob); + prob = probs + IsRepG2 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep2; + } + else + { + UPDATE_1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = probs + RepLenCoder; + } + + #ifdef _LZMA_SIZE_OPT + { + unsigned lim, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + lim = (1 << kLenNumLowBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + lim = (1 << kLenNumMidBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + lim = (1 << kLenNumHighBits); + } + } + TREE_DECODE(probLen, lim, len); + len += offset; + } + #else + { + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + (posState << kLenNumLowBits); + len = 1; + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + len -= 8; + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenMid + (posState << kLenNumMidBits); + len = 1; + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + TREE_DECODE(probLen, (1 << kLenNumHighBits), len); + len += kLenNumLowSymbols + kLenNumMidSymbols; + } + } + } + #endif + + if (state >= kNumStates) + { + UInt32 distance; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); + TREE_6_DECODE(prob, distance); + if (distance >= kStartPosModelIndex) + { + unsigned posSlot = (unsigned)distance; + unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); + distance = (2 | (distance & 1)); + if (posSlot < kEndPosModelIndex) + { + distance <<= numDirectBits; + prob = probs + SpecPos + distance - posSlot - 1; + { + UInt32 mask = 1; + unsigned i = 1; + do + { + GET_BIT2(prob + i, i, ; , distance |= mask); + mask <<= 1; + } + while (--numDirectBits != 0); + } + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE + range >>= 1; + + { + UInt32 t; + code -= range; + t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ + distance = (distance << 1) + (t + 1); + code += range & t; + } + /* + distance <<= 1; + if (code >= range) + { + code -= range; + distance |= 1; + } + */ + } + while (--numDirectBits != 0); + prob = probs + Align; + distance <<= kNumAlignBits; + { + unsigned i = 1; + GET_BIT2(prob + i, i, ; , distance |= 1); + GET_BIT2(prob + i, i, ; , distance |= 2); + GET_BIT2(prob + i, i, ; , distance |= 4); + GET_BIT2(prob + i, i, ; , distance |= 8); + } + if (distance == (UInt32)0xFFFFFFFF) + { + len += kMatchSpecLenStart; + state -= kNumStates; + break; + } + } + } + + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = distance + 1; + if (checkDicSize == 0) + { + if (distance >= processedPos) + { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + } + else if (distance >= checkDicSize) + { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + } + + len += kMatchMinLen; + + { + SizeT rem; + unsigned curLen; + SizeT pos; + + if ((rem = limit - dicPos) == 0) + { + p->dicPos = dicPos; + return SZ_ERROR_DATA; + } + + curLen = ((rem < len) ? (unsigned)rem : len); + pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); + + processedPos += curLen; + + len -= curLen; + if (curLen <= dicBufSize - pos) + { + Byte *dest = dic + dicPos; + ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; + const Byte *lim = dest + curLen; + dicPos += curLen; + do + *(dest) = (Byte)*(dest + src); + while (++dest != lim); + } + else + { + do + { + dic[dicPos++] = dic[pos]; + if (++pos == dicBufSize) + pos = 0; + } + while (--curLen != 0); + } + } + } + } + while (dicPos < limit && buf < bufLimit); + + NORMALIZE; + + p->buf = buf; + p->range = range; + p->code = code; + p->remainLen = len; + p->dicPos = dicPos; + p->processedPos = processedPos; + p->reps[0] = rep0; + p->reps[1] = rep1; + p->reps[2] = rep2; + p->reps[3] = rep3; + p->state = state; + + return SZ_OK; +} + +static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +{ + if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) + { + Byte *dic = p->dic; + SizeT dicPos = p->dicPos; + SizeT dicBufSize = p->dicBufSize; + unsigned len = p->remainLen; + SizeT rep0 = p->reps[0]; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ + SizeT rem = limit - dicPos; + if (rem < len) + len = (unsigned)(rem); + + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) + p->checkDicSize = p->prop.dicSize; + + p->processedPos += len; + p->remainLen -= len; + while (len != 0) + { + len--; + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + } + p->dicPos = dicPos; + } +} + +static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + do + { + SizeT limit2 = limit; + if (p->checkDicSize == 0) + { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) + limit2 = p->dicPos + rem; + } + + RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); + + if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) + p->checkDicSize = p->prop.dicSize; + + LzmaDec_WriteRem(p, limit); + } + while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); + + if (p->remainLen > kMatchSpecLenStart) + p->remainLen = kMatchSpecLenStart; + + return 0; +} + +typedef enum +{ + DUMMY_ERROR, /* unexpected end of input stream */ + DUMMY_LIT, + DUMMY_MATCH, + DUMMY_REP +} ELzmaDummy; + +static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) +{ + UInt32 range = p->range; + UInt32 code = p->code; + const Byte *bufLimit = buf + inSize; + const CLzmaProb *probs = p->probs; + unsigned state = p->state; + ELzmaDummy res; + + { + const CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); + + prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK + + /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ + + prob = probs + Literal; + if (p->checkDicSize != 0 || p->processedPos != 0) + prob += ((UInt32)LZMA_LIT_SIZE * + ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + + (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + + if (state < kNumLitStates) + { + unsigned symbol = 1; + do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[p->dicPos - p->reps[0] + + (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; + unsigned offs = 0x100; + unsigned symbol = 1; + do + { + unsigned bit; + const CLzmaProb *probLit; + matchByte <<= 1; + bit = (matchByte & offs); + probLit = prob + offs + bit + symbol; + GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) + } + while (symbol < 0x100); + } + res = DUMMY_LIT; + } + else + { + unsigned len; + UPDATE_1_CHECK; + + prob = probs + IsRep + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + state = 0; + prob = probs + LenCoder; + res = DUMMY_MATCH; + } + else + { + UPDATE_1_CHECK; + res = DUMMY_REP; + prob = probs + IsRepG0 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + NORMALIZE_CHECK; + return DUMMY_REP; + } + else + { + UPDATE_1_CHECK; + } + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG1 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG2 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + } + } + } + state = kNumStates; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + const CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenLow + (posState << kLenNumLowBits); + offset = 0; + limit = 1 << kLenNumLowBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenChoice2; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenMid + (posState << kLenNumMidBits); + offset = kLenNumLowSymbols; + limit = 1 << kLenNumMidBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenHigh; + offset = kLenNumLowSymbols + kLenNumMidSymbols; + limit = 1 << kLenNumHighBits; + } + } + TREE_DECODE_CHECK(probLen, limit, len); + len += offset; + } + + if (state < 4) + { + unsigned posSlot; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + unsigned numDirectBits = ((posSlot >> 1) - 1); + + /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ + + if (posSlot < kEndPosModelIndex) + { + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE_CHECK + range >>= 1; + code -= range & (((code - range) >> 31) - 1); + /* if (code >= range) code -= range; */ + } + while (--numDirectBits != 0); + prob = probs + Align; + numDirectBits = kNumAlignBits; + } + { + unsigned i = 1; + do + { + GET_BIT_CHECK(prob + i, i); + } + while (--numDirectBits != 0); + } + } + } + } + } + NORMALIZE_CHECK; + return res; +} + + +void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) +{ + p->needFlush = 1; + p->remainLen = 0; + p->tempBufSize = 0; + + if (initDic) + { + p->processedPos = 0; + p->checkDicSize = 0; + p->needInitState = 1; + } + if (initState) + p->needInitState = 1; +} + +void LzmaDec_Init(CLzmaDec *p) +{ + p->dicPos = 0; + LzmaDec_InitDicAndState(p, True, True); +} + +static void LzmaDec_InitStateReal(CLzmaDec *p) +{ + SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); + SizeT i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + p->needInitState = 0; +} + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, + ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + (*srcLen) = 0; + LzmaDec_WriteRem(p, dicLimit); + + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->remainLen != kMatchSpecLenStart) + { + int checkEndMarkNow; + + if (p->needFlush) + { + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (p->tempBuf[0] != 0) + return SZ_ERROR_DATA; + p->code = + ((UInt32)p->tempBuf[1] << 24) + | ((UInt32)p->tempBuf[2] << 16) + | ((UInt32)p->tempBuf[3] << 8) + | ((UInt32)p->tempBuf[4]); + p->range = 0xFFFFFFFF; + p->needFlush = 0; + p->tempBufSize = 0; + } + + checkEndMarkNow = 0; + if (p->dicPos >= dicLimit) + { + if (p->remainLen == 0 && p->code == 0) + { + *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; + return SZ_OK; + } + if (finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + if (p->remainLen != 0) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + checkEndMarkNow = 1; + } + + if (p->needInitState) + LzmaDec_InitStateReal(p); + + if (p->tempBufSize == 0) + { + SizeT processed; + const Byte *bufLimit; + if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, src, inSize); + if (dummyRes == DUMMY_ERROR) + { + memcpy(p->tempBuf, src, inSize); + p->tempBufSize = (unsigned)inSize; + (*srcLen) += inSize; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + bufLimit = src; + } + else + bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; + p->buf = src; + if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) + return SZ_ERROR_DATA; + processed = (SizeT)(p->buf - src); + (*srcLen) += processed; + src += processed; + inSize -= processed; + } + else + { + unsigned rem = p->tempBufSize, lookAhead = 0; + while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) + p->tempBuf[rem++] = src[lookAhead++]; + p->tempBufSize = rem; + if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); + if (dummyRes == DUMMY_ERROR) + { + (*srcLen) += lookAhead; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (checkEndMarkNow && dummyRes != DUMMY_MATCH) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_ERROR_DATA; + } + } + p->buf = p->tempBuf; + if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) + return SZ_ERROR_DATA; + + { + unsigned kkk = (unsigned)(p->buf - p->tempBuf); + if (rem < kkk) + return SZ_ERROR_FAIL; /* some internal error */ + rem -= kkk; + if (lookAhead < rem) + return SZ_ERROR_FAIL; /* some internal error */ + lookAhead -= rem; + } + (*srcLen) += lookAhead; + src += lookAhead; + inSize -= lookAhead; + p->tempBufSize = 0; + } + } + if (p->code == 0) + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; +} + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen; + SizeT inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT inSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->dicPos == p->dicBufSize) + p->dicPos = 0; + dicPos = p->dicPos; + if (outSize > p->dicBufSize - dicPos) + { + outSizeCur = p->dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); + src += inSizeCur; + inSize -= inSizeCur; + *srcLen += inSizeCur; + outSizeCur = p->dicPos - dicPos; + memcpy(dest, p->dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->probs); + p->probs = NULL; +} + +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->dic); + p->dic = NULL; +} + +void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc) +{ + LzmaDec_FreeProbs(p, alloc); + LzmaDec_FreeDict(p, alloc); +} + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) +{ + UInt32 dicSize; + Byte d; + + if (size < LZMA_PROPS_SIZE) + return SZ_ERROR_UNSUPPORTED; + else + dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); + + if (dicSize < LZMA_DIC_MIN) + dicSize = LZMA_DIC_MIN; + p->dicSize = dicSize; + + d = data[0]; + if (d >= (9 * 5 * 5)) + return SZ_ERROR_UNSUPPORTED; + + p->lc = d % 9; + d /= 9; + p->pb = d / 5; + p->lp = d % 5; + + return SZ_OK; +} + +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) +{ + UInt32 numProbs = LzmaProps_GetNumProbs(propNew); + if (!p->probs || numProbs != p->numProbs) + { + LzmaDec_FreeProbs(p, alloc); + p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); + p->numProbs = numProbs; + if (!p->probs) + return SZ_ERROR_MEM; + } + return SZ_OK; +} + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) +{ + CLzmaProps propNew; + SizeT dicBufSize; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + + { + UInt32 dictSize = propNew.dicSize; + SizeT mask = ((UInt32)1 << 12) - 1; + if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; + else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;; + dicBufSize = ((SizeT)dictSize + mask) & ~mask; + if (dicBufSize < dictSize) + dicBufSize = dictSize; + } + + if (!p->dic || dicBufSize != p->dicBufSize) + { + LzmaDec_FreeDict(p, alloc); + p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize); + if (!p->dic) + { + LzmaDec_FreeProbs(p, alloc); + return SZ_ERROR_MEM; + } + } + p->dicBufSize = dicBufSize; + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc) +{ + CLzmaDec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + if (inSize < RC_INIT_SIZE) + return SZ_ERROR_INPUT_EOF; + LzmaDec_Construct(&p); + RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); + p.dic = dest; + p.dicBufSize = outSize; + LzmaDec_Init(&p); + *srcLen = inSize; + res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + LzmaDec_FreeProbs(&p, alloc); + return res; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzmaDec.h b/Provenance/LzmaSDKObjC/lzma/C/LzmaDec.h new file mode 100644 index 0000000000..2633abeac9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzmaDec.h @@ -0,0 +1,227 @@ +/* LzmaDec.h -- LZMA Decoder +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_DEC_H +#define __LZMA_DEC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps +{ + unsigned lc, lp, pb; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); + + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct +{ + CLzmaProps prop; + CLzmaProb *probs; + Byte *dic; + const Byte *buf; + UInt32 range, code; + SizeT dicPos; + SizeT dicBufSize; + UInt32 processedPos; + UInt32 checkDicSize; + unsigned state; + UInt32 reps[4]; + unsigned remainLen; + int needFlush; + int needInitState; + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } + +void LzmaDec_Init(CLzmaDec *p); + +/* There are two types of LZMA streams: + 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. + 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum +{ + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + +typedef enum +{ + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc); + +SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc); +void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Constr() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error +*/ + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). +*/ + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzmaEnc.c b/Provenance/LzmaSDKObjC/lzma/C/LzmaEnc.c new file mode 100644 index 0000000000..462ca67565 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzmaEnc.c @@ -0,0 +1,2351 @@ +/* LzmaEnc.c -- LZMA Encoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #define SHOW_STAT */ +/* #define SHOW_STAT2 */ + +#if defined(SHOW_STAT) || defined(SHOW_STAT2) +#include +#endif + +#include "LzmaEnc.h" + +#include "LzFind.h" +#ifndef _7ZIP_ST +#include "LzFindMt.h" +#endif + +#ifdef SHOW_STAT +static unsigned g_STAT_OFFSET = 0; +#endif + +#define kMaxHistorySize ((UInt32)3 << 29) +/* #define kMaxHistorySize ((UInt32)7 << 29) */ + +#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) + +#define kBlockSize (9 << 10) +#define kUnpackBlockSize (1 << 18) +#define kMatchArraySize (1 << 21) +#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) + +#define kNumMaxDirectBits (31) + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 +#define kProbInitValue (kBitModelTotal >> 1) + +#define kNumMoveReducingBits 4 +#define kNumBitPriceShiftBits 4 +#define kBitPrice (1 << kNumBitPriceShiftBits) + +void LzmaEncProps_Init(CLzmaEncProps *p) +{ + p->level = 5; + p->dictSize = p->mc = 0; + p->reduceSize = (UInt64)(Int64)-1; + p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; + p->writeEndMark = 0; +} + +void LzmaEncProps_Normalize(CLzmaEncProps *p) +{ + int level = p->level; + if (level < 0) level = 5; + p->level = level; + + if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); + if (p->dictSize > p->reduceSize) + { + unsigned i; + for (i = 11; i <= 30; i++) + { + if ((UInt32)p->reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; } + if ((UInt32)p->reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; } + } + } + + if (p->lc < 0) p->lc = 3; + if (p->lp < 0) p->lp = 0; + if (p->pb < 0) p->pb = 2; + + if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); + if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); + if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); + if (p->numHashBytes < 0) p->numHashBytes = 4; + if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); + + if (p->numThreads < 0) + p->numThreads = + #ifndef _7ZIP_ST + ((p->btMode && p->algo) ? 2 : 1); + #else + 1; + #endif +} + +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) +{ + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + return props.dictSize; +} + +#if (_MSC_VER >= 1400) +/* BSR code is fast for some new CPUs */ +/* #define LZMA_LOG_BSR */ +#endif + +#ifdef LZMA_LOG_BSR + +#define kDicLogSizeMaxCompress 32 + +#define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); res = (zz + zz) + ((pos >> (zz - 1)) & 1); } + +static UInt32 GetPosSlot1(UInt32 pos) +{ + UInt32 res; + BSR2_RET(pos, res); + return res; +} +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } + +#else + +#define kNumLogBits (9 + sizeof(size_t) / 2) +/* #define kNumLogBits (11 + sizeof(size_t) / 8 * 3) */ + +#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) + +static void LzmaEnc_FastPosInit(Byte *g_FastPos) +{ + unsigned slot; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + g_FastPos += 2; + + for (slot = 2; slot < kNumLogBits * 2; slot++) + { + size_t k = ((size_t)1 << ((slot >> 1) - 1)); + size_t j; + for (j = 0; j < k; j++) + g_FastPos[j] = (Byte)slot; + g_FastPos += k; + } +} + +/* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */ +/* +#define BSR2_RET(pos, res) { UInt32 zz = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } +*/ + +/* +#define BSR2_RET(pos, res) { UInt32 zz = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } +*/ + +#define BSR2_RET(pos, res) { UInt32 zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } + +/* +#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ + p->g_FastPos[pos >> 6] + 12 : \ + p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } +*/ + +#define GetPosSlot1(pos) p->g_FastPos[pos] +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } + +#endif + + +#define LZMA_NUM_REPS 4 + +typedef unsigned CState; + +typedef struct +{ + UInt32 price; + + CState state; + int prev1IsChar; + int prev2; + + UInt32 posPrev2; + UInt32 backPrev2; + + UInt32 posPrev; + UInt32 backPrev; + UInt32 backs[LZMA_NUM_REPS]; +} COptimal; + +#define kNumOpts (1 << 12) + +#define kNumLenToPosStates 4 +#define kNumPosSlotBits 6 +#define kDicLogSizeMin 0 +#define kDicLogSizeMax 32 +#define kDistTableSizeMax (kDicLogSizeMax * 2) + + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) +#define kAlignMask (kAlignTableSize - 1) + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) + +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#ifdef _LZMA_PROB32 +#define CLzmaProb UInt32 +#else +#define CLzmaProb UInt16 +#endif + +#define LZMA_PB_MAX 4 +#define LZMA_LC_MAX 8 +#define LZMA_LP_MAX 4 + +#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) + + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumMidBits 3 +#define kLenNumMidSymbols (1 << kLenNumMidBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) + +#define LZMA_MATCH_LEN_MIN 2 +#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) + +#define kNumStates 12 + + +typedef struct +{ + CLzmaProb choice; + CLzmaProb choice2; + CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; + CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; + CLzmaProb high[kLenNumHighSymbols]; +} CLenEnc; + + +typedef struct +{ + CLenEnc p; + UInt32 tableSize; + UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; + UInt32 counters[LZMA_NUM_PB_STATES_MAX]; +} CLenPriceEnc; + + +typedef struct +{ + UInt32 range; + Byte cache; + UInt64 low; + UInt64 cacheSize; + Byte *buf; + Byte *bufLim; + Byte *bufBase; + ISeqOutStream *outStream; + UInt64 processed; + SRes res; +} CRangeEnc; + + +typedef struct +{ + CLzmaProb *litProbs; + + UInt32 state; + UInt32 reps[LZMA_NUM_REPS]; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; +} CSaveState; + + +typedef struct +{ + void *matchFinderObj; + IMatchFinder matchFinder; + + UInt32 optimumEndIndex; + UInt32 optimumCurrentIndex; + + UInt32 longestMatchLength; + UInt32 numPairs; + UInt32 numAvail; + + UInt32 numFastBytes; + UInt32 additionalOffset; + UInt32 reps[LZMA_NUM_REPS]; + UInt32 state; + + unsigned lc, lp, pb; + unsigned lpMask, pbMask; + unsigned lclp; + + CLzmaProb *litProbs; + + Bool fastMode; + Bool writeEndMark; + Bool finished; + Bool multiThread; + Bool needInit; + + UInt64 nowPos64; + + UInt32 matchPriceCount; + UInt32 alignPriceCount; + + UInt32 distTableSize; + + UInt32 dictSize; + SRes result; + + CRangeEnc rc; + + #ifndef _7ZIP_ST + Bool mtMode; + CMatchFinderMt matchFinderMt; + #endif + + CMatchFinder matchFinderBase; + + #ifndef _7ZIP_ST + Byte pad[128]; + #endif + + COptimal opt[kNumOpts]; + + #ifndef LZMA_LOG_BSR + Byte g_FastPos[1 << kNumLogBits]; + #endif + + UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; + + UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; + UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; + UInt32 alignPrices[kAlignTableSize]; + + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; + + CSaveState saveState; + + #ifndef _7ZIP_ST + Byte pad2[128]; + #endif +} CLzmaEnc; + + +void LzmaEnc_SaveState(CLzmaEncHandle pp) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CSaveState *dest = &p->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb)); +} + +void LzmaEnc_RestoreState(CLzmaEncHandle pp) +{ + CLzmaEnc *dest = (CLzmaEnc *)pp; + const CSaveState *p = &dest->saveState; + int i; + dest->lenEnc = p->lenEnc; + dest->repLenEnc = p->repLenEnc; + dest->state = p->state; + + for (i = 0; i < kNumStates; i++) + { + memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i])); + memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i])); + } + for (i = 0; i < kNumLenToPosStates; i++) + memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i])); + memcpy(dest->isRep, p->isRep, sizeof(p->isRep)); + memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0)); + memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1)); + memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2)); + memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders)); + memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder)); + memcpy(dest->reps, p->reps, sizeof(p->reps)); + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb)); +} + +SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + + if (props.lc > LZMA_LC_MAX + || props.lp > LZMA_LP_MAX + || props.pb > LZMA_PB_MAX + || props.dictSize > ((UInt64)1 << kDicLogSizeMaxCompress) + || props.dictSize > kMaxHistorySize) + return SZ_ERROR_PARAM; + + p->dictSize = props.dictSize; + { + unsigned fb = props.fb; + if (fb < 5) + fb = 5; + if (fb > LZMA_MATCH_LEN_MAX) + fb = LZMA_MATCH_LEN_MAX; + p->numFastBytes = fb; + } + p->lc = props.lc; + p->lp = props.lp; + p->pb = props.pb; + p->fastMode = (props.algo == 0); + p->matchFinderBase.btMode = (Byte)(props.btMode ? 1 : 0); + { + UInt32 numHashBytes = 4; + if (props.btMode) + { + if (props.numHashBytes < 2) + numHashBytes = 2; + else if (props.numHashBytes < 4) + numHashBytes = props.numHashBytes; + } + p->matchFinderBase.numHashBytes = numHashBytes; + } + + p->matchFinderBase.cutValue = props.mc; + + p->writeEndMark = props.writeEndMark; + + #ifndef _7ZIP_ST + /* + if (newMultiThread != _multiThread) + { + ReleaseMatchFinder(); + _multiThread = newMultiThread; + } + */ + p->multiThread = (props.numThreads > 1); + #endif + + return SZ_OK; +} + +static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +#define IsCharState(s) ((s) < 7) + +#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) + +#define kInfinityPrice (1 << 30) + +static void RangeEnc_Construct(CRangeEnc *p) +{ + p->outStream = NULL; + p->bufBase = NULL; +} + +#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) + +#define RC_BUF_SIZE (1 << 16) +static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) +{ + if (!p->bufBase) + { + p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); + if (!p->bufBase) + return 0; + p->bufLim = p->bufBase + RC_BUF_SIZE; + } + return 1; +} + +static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->bufBase); + p->bufBase = 0; +} + +static void RangeEnc_Init(CRangeEnc *p) +{ + /* Stream.Init(); */ + p->low = 0; + p->range = 0xFFFFFFFF; + p->cacheSize = 1; + p->cache = 0; + + p->buf = p->bufBase; + + p->processed = 0; + p->res = SZ_OK; +} + +static void RangeEnc_FlushStream(CRangeEnc *p) +{ + size_t num; + if (p->res != SZ_OK) + return; + num = p->buf - p->bufBase; + if (num != p->outStream->Write(p->outStream, p->bufBase, num)) + p->res = SZ_ERROR_WRITE; + p->processed += num; + p->buf = p->bufBase; +} + +static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) +{ + if ((UInt32)p->low < (UInt32)0xFF000000 || (unsigned)(p->low >> 32) != 0) + { + Byte temp = p->cache; + do + { + Byte *buf = p->buf; + *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); + p->buf = buf; + if (buf == p->bufLim) + RangeEnc_FlushStream(p); + temp = 0xFF; + } + while (--p->cacheSize != 0); + p->cache = (Byte)((UInt32)p->low >> 24); + } + p->cacheSize++; + p->low = (UInt32)p->low << 8; +} + +static void RangeEnc_FlushData(CRangeEnc *p) +{ + int i; + for (i = 0; i < 5; i++) + RangeEnc_ShiftLow(p); +} + +static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, unsigned numBits) +{ + do + { + p->range >>= 1; + p->low += p->range & (0 - ((value >> --numBits) & 1)); + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } + } + while (numBits != 0); +} + +static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) +{ + UInt32 ttt = *prob; + UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; + if (symbol == 0) + { + p->range = newBound; + ttt += (kBitModelTotal - ttt) >> kNumMoveBits; + } + else + { + p->low += newBound; + p->range -= newBound; + ttt -= ttt >> kNumMoveBits; + } + *prob = (CLzmaProb)ttt; + if (p->range < kTopValue) + { + p->range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) +{ + symbol |= 0x100; + do + { + RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); +} + +static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) +{ + UInt32 offs = 0x100; + symbol |= 0x100; + do + { + matchByte <<= 1; + RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); + } + while (symbol < 0x10000); +} + +static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) +{ + UInt32 i; + for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) + { + const int kCyclesBits = kNumBitPriceShiftBits; + UInt32 w = i; + UInt32 bitCount = 0; + int j; + for (j = 0; j < kCyclesBits; j++) + { + w = w * w; + bitCount <<= 1; + while (w >= ((UInt32)1 << 16)) + { + w >>= 1; + bitCount++; + } + } + ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); + } +} + + +#define GET_PRICE(prob, symbol) \ + p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICEa(prob, symbol) \ + ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= 0x100; + do + { + price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); + symbol <<= 1; + } + while (symbol < 0x10000); + return price; +} + +static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 offs = 0x100; + symbol |= 0x100; + do + { + matchByte <<= 1; + price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); + symbol <<= 1; + offs &= ~(matchByte ^ symbol); + } + while (symbol < 0x10000); + return price; +} + + +static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0;) + { + UInt32 bit; + i--; + bit = (symbol >> i) & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + } +} + +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) +{ + UInt32 m = 1; + int i; + for (i = 0; i < numBitLevels; i++) + { + UInt32 bit = symbol & 1; + RangeEnc_EncodeBit(rc, probs + m, bit); + m = (m << 1) | bit; + symbol >>= 1; + } +} + +static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + symbol |= (1 << numBitLevels); + while (symbol != 1) + { + price += GET_PRICEa(probs[symbol >> 1], symbol & 1); + symbol >>= 1; + } + return price; +} + +static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, const UInt32 *ProbPrices) +{ + UInt32 price = 0; + UInt32 m = 1; + int i; + for (i = numBitLevels; i != 0; i--) + { + UInt32 bit = symbol & 1; + symbol >>= 1; + price += GET_PRICEa(probs[m], bit); + m = (m << 1) | bit; + } + return price; +} + + +static void LenEnc_Init(CLenEnc *p) +{ + unsigned i; + p->choice = p->choice2 = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) + p->low[i] = kProbInitValue; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) + p->mid[i] = kProbInitValue; + for (i = 0; i < kLenNumHighSymbols; i++) + p->high[i] = kProbInitValue; +} + +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) +{ + if (symbol < kLenNumLowSymbols) + { + RangeEnc_EncodeBit(rc, &p->choice, 0); + RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice, 1); + if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) + { + RangeEnc_EncodeBit(rc, &p->choice2, 0); + RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); + } + else + { + RangeEnc_EncodeBit(rc, &p->choice2, 1); + RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); + } + } +} + +static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, const UInt32 *ProbPrices) +{ + UInt32 a0 = GET_PRICE_0a(p->choice); + UInt32 a1 = GET_PRICE_1a(p->choice); + UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); + UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); + UInt32 i = 0; + for (i = 0; i < kLenNumLowSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); + } + for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) + { + if (i >= numSymbols) + return; + prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); + } + for (; i < numSymbols; i++) + prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); +} + +static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, const UInt32 *ProbPrices) +{ + LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); + p->counters[posState] = p->tableSize; +} + +static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, const UInt32 *ProbPrices) +{ + UInt32 posState; + for (posState = 0; posState < numPosStates; posState++) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + +static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, const UInt32 *ProbPrices) +{ + LenEnc_Encode(&p->p, rc, symbol, posState); + if (updatePrice) + if (--p->counters[posState] == 0) + LenPriceEnc_UpdateTable(p, posState, ProbPrices); +} + + + + +static void MovePos(CLzmaEnc *p, UInt32 num) +{ + #ifdef SHOW_STAT + g_STAT_OFFSET += num; + printf("\n MovePos %u", num); + #endif + + if (num != 0) + { + p->additionalOffset += num; + p->matchFinder.Skip(p->matchFinderObj, num); + } +} + +static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) +{ + UInt32 lenRes = 0, numPairs; + p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); + numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); + + #ifdef SHOW_STAT + printf("\n i = %u numPairs = %u ", g_STAT_OFFSET, numPairs / 2); + g_STAT_OFFSET++; + { + UInt32 i; + for (i = 0; i < numPairs; i += 2) + printf("%2u %6u | ", p->matches[i], p->matches[i + 1]); + } + #endif + + if (numPairs > 0) + { + lenRes = p->matches[numPairs - 2]; + if (lenRes == p->numFastBytes) + { + UInt32 numAvail = p->numAvail; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + { + const Byte *pbyCur = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + const Byte *pby = pbyCur + lenRes; + ptrdiff_t dif = (ptrdiff_t)-1 - p->matches[numPairs - 1]; + const Byte *pbyLim = pbyCur + numAvail; + for (; pby != pbyLim && *pby == pby[dif]; pby++); + lenRes = (UInt32)(pby - pbyCur); + } + } + } + p->additionalOffset++; + *numDistancePairsRes = numPairs; + return lenRes; +} + + +#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; +#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; +#define IsShortRep(p) ((p)->backPrev == 0) + +static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) +{ + return + GET_PRICE_0(p->isRepG0[state]) + + GET_PRICE_0(p->isRep0Long[state][posState]); +} + +static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) +{ + UInt32 price; + if (repIndex == 0) + { + price = GET_PRICE_0(p->isRepG0[state]); + price += GET_PRICE_1(p->isRep0Long[state][posState]); + } + else + { + price = GET_PRICE_1(p->isRepG0[state]); + if (repIndex == 1) + price += GET_PRICE_0(p->isRepG1[state]); + else + { + price += GET_PRICE_1(p->isRepG1[state]); + price += GET_PRICE(p->isRepG2[state], repIndex - 2); + } + } + return price; +} + +static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) +{ + return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + + GetPureRepPrice(p, repIndex, state, posState); +} + +static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) +{ + UInt32 posMem = p->opt[cur].posPrev; + UInt32 backMem = p->opt[cur].backPrev; + p->optimumEndIndex = cur; + do + { + if (p->opt[cur].prev1IsChar) + { + MakeAsChar(&p->opt[posMem]) + p->opt[posMem].posPrev = posMem - 1; + if (p->opt[cur].prev2) + { + p->opt[posMem - 1].prev1IsChar = False; + p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; + p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; + } + } + { + UInt32 posPrev = posMem; + UInt32 backCur = backMem; + + backMem = p->opt[posPrev].backPrev; + posMem = p->opt[posPrev].posPrev; + + p->opt[posPrev].backPrev = backCur; + p->opt[posPrev].posPrev = cur; + cur = posPrev; + } + } + while (cur != 0); + *backRes = p->opt[0].backPrev; + p->optimumCurrentIndex = p->opt[0].posPrev; + return p->optimumCurrentIndex; +} + +#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * (UInt32)0x300) + +static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) +{ + UInt32 lenEnd, cur; + UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; + UInt32 *matches; + + { + + UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, len; + UInt32 matchPrice, repMatchPrice, normalMatchPrice; + const Byte *data; + Byte curByte, matchByte; + + if (p->optimumEndIndex != p->optimumCurrentIndex) + { + const COptimal *opt = &p->opt[p->optimumCurrentIndex]; + UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; + *backRes = opt->backPrev; + p->optimumCurrentIndex = opt->posPrev; + return lenRes; + } + p->optimumCurrentIndex = p->optimumEndIndex = 0; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + if (numAvail < 2) + { + *backRes = (UInt32)(-1); + return 1; + } + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repMaxIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 lenTest; + const Byte *data2; + reps[i] = p->reps[i]; + data2 = data - reps[i] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + repLens[i] = lenTest; + if (lenTest > repLens[repMaxIndex]) + repMaxIndex = i; + } + if (repLens[repMaxIndex] >= p->numFastBytes) + { + UInt32 lenRes; + *backRes = repMaxIndex; + lenRes = repLens[repMaxIndex]; + MovePos(p, lenRes - 1); + return lenRes; + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) + { + *backRes = (UInt32)-1; + return 1; + } + + p->opt[0].state = (CState)p->state; + + posState = (position & p->pbMask); + + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + + (!IsCharState(p->state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + MakeAsChar(&p->opt[1]); + + matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); + + if (matchByte == curByte) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); + if (shortRepPrice < p->opt[1].price) + { + p->opt[1].price = shortRepPrice; + MakeAsShortRep(&p->opt[1]); + } + } + lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); + + if (lenEnd < 2) + { + *backRes = p->opt[1].backPrev; + return 1; + } + + p->opt[1].posPrev = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + p->opt[0].backs[i] = reps[i]; + + len = lenEnd; + do + p->opt[len--].price = kInfinityPrice; + while (len >= 2); + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 repLen = repLens[i]; + UInt32 price; + if (repLen < 2) + continue; + price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; + COptimal *opt = &p->opt[repLen]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = i; + opt->prev1IsChar = False; + } + } + while (--repLen >= 2); + } + + normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + + len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); + if (len <= mainLen) + { + UInt32 offs = 0; + while (len > matches[offs]) + offs += 2; + for (; ; len++) + { + COptimal *opt; + UInt32 distance = matches[offs + 1]; + + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; + UInt32 lenToPosState = GetLenToPosState(len); + if (distance < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][distance]; + else + { + UInt32 slot; + GetPosSlot2(distance, slot); + curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; + } + opt = &p->opt[len]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = 0; + opt->backPrev = distance + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + if (len == matches[offs]) + { + offs += 2; + if (offs == numPairs) + break; + } + } + } + + cur = 0; + + #ifdef SHOW_STAT2 + /* if (position >= 0) */ + { + unsigned i; + printf("\n pos = %4X", position); + for (i = cur; i <= lenEnd; i++) + printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price); + } + #endif + + } + + for (;;) + { + UInt32 numAvail; + UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; + UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; + Bool nextIsChar; + Byte curByte, matchByte; + const Byte *data; + COptimal *curOpt; + COptimal *nextOpt; + + cur++; + if (cur == lenEnd) + return Backward(p, backRes, cur); + + newLen = ReadMatchDistances(p, &numPairs); + if (newLen >= p->numFastBytes) + { + p->numPairs = numPairs; + p->longestMatchLength = newLen; + return Backward(p, backRes, cur); + } + position++; + curOpt = &p->opt[cur]; + posPrev = curOpt->posPrev; + if (curOpt->prev1IsChar) + { + posPrev--; + if (curOpt->prev2) + { + state = p->opt[curOpt->posPrev2].state; + if (curOpt->backPrev2 < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + else + state = p->opt[posPrev].state; + state = kLiteralNextStates[state]; + } + else + state = p->opt[posPrev].state; + if (posPrev == cur - 1) + { + if (IsShortRep(curOpt)) + state = kShortRepNextStates[state]; + else + state = kLiteralNextStates[state]; + } + else + { + UInt32 pos; + const COptimal *prevOpt; + if (curOpt->prev1IsChar && curOpt->prev2) + { + posPrev = curOpt->posPrev2; + pos = curOpt->backPrev2; + state = kRepNextStates[state]; + } + else + { + pos = curOpt->backPrev; + if (pos < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + prevOpt = &p->opt[posPrev]; + if (pos < LZMA_NUM_REPS) + { + UInt32 i; + reps[0] = prevOpt->backs[pos]; + for (i = 1; i <= pos; i++) + reps[i] = prevOpt->backs[i - 1]; + for (; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i]; + } + else + { + UInt32 i; + reps[0] = (pos - LZMA_NUM_REPS); + for (i = 1; i < LZMA_NUM_REPS; i++) + reps[i] = prevOpt->backs[i - 1]; + } + } + curOpt->state = (CState)state; + + curOpt->backs[0] = reps[0]; + curOpt->backs[1] = reps[1]; + curOpt->backs[2] = reps[2]; + curOpt->backs[3] = reps[3]; + + curPrice = curOpt->price; + nextIsChar = False; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + curByte = *data; + matchByte = *(data - (reps[0] + 1)); + + posState = (position & p->pbMask); + + curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + curAnd1Price += + (!IsCharState(state) ? + LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + nextOpt = &p->opt[cur + 1]; + + if (curAnd1Price < nextOpt->price) + { + nextOpt->price = curAnd1Price; + nextOpt->posPrev = cur; + MakeAsChar(nextOpt); + nextIsChar = True; + } + + matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); + + if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) + { + UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); + if (shortRepPrice <= nextOpt->price) + { + nextOpt->price = shortRepPrice; + nextOpt->posPrev = cur; + MakeAsShortRep(nextOpt); + nextIsChar = True; + } + } + numAvailFull = p->numAvail; + { + UInt32 temp = kNumOpts - 1 - cur; + if (temp < numAvailFull) + numAvailFull = temp; + } + + if (numAvailFull < 2) + continue; + numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); + + if (!nextIsChar && matchByte != curByte) /* speed optimization */ + { + /* try Literal + rep0 */ + UInt32 temp; + UInt32 lenTest2; + const Byte *data2 = data - reps[0] - 1; + UInt32 limit = p->numFastBytes + 1; + if (limit > numAvailFull) + limit = numAvailFull; + + for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); + lenTest2 = temp - 1; + if (lenTest2 >= 2) + { + UInt32 state2 = kLiteralNextStates[state]; + UInt32 posStateNext = (position + 1) & p->pbMask; + UInt32 nextRepMatchPrice = curAnd1Price + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = False; + } + } + } + } + + startLen = 2; /* speed optimization */ + { + UInt32 repIndex; + for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) + { + UInt32 lenTest; + UInt32 lenTestTemp; + UInt32 price; + const Byte *data2 = data - reps[repIndex] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); + while (lenEnd < cur + lenTest) + p->opt[++lenEnd].price = kInfinityPrice; + lenTestTemp = lenTest; + price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); + do + { + UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; + COptimal *opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = repIndex; + opt->prev1IsChar = False; + } + } + while (--lenTest >= 2); + lenTest = lenTestTemp; + + if (repIndex == 0) + startLen = lenTest + 1; + + /* if (_maxMode) */ + { + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 nextRepMatchPrice; + UInt32 state2 = kRepNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = + price + p->repLenEnc.prices[posState][lenTest - 2] + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (position + lenTest + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 curAndLenPrice; + COptimal *opt; + UInt32 offset = cur + lenTest + 1 + lenTest2; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = repIndex; + } + } + } + } + } + } + /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ + if (newLen > numAvail) + { + newLen = numAvail; + for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); + matches[numPairs] = newLen; + numPairs += 2; + } + if (newLen >= startLen) + { + UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); + UInt32 offs, curBack, posSlot; + UInt32 lenTest; + while (lenEnd < cur + newLen) + p->opt[++lenEnd].price = kInfinityPrice; + + offs = 0; + while (startLen > matches[offs]) + offs += 2; + curBack = matches[offs + 1]; + GetPosSlot2(curBack, posSlot); + for (lenTest = /*2*/ startLen; ; lenTest++) + { + UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; + { + UInt32 lenToPosState = GetLenToPosState(lenTest); + COptimal *opt; + if (curBack < kNumFullDistances) + curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; + else + curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; + + opt = &p->opt[cur + lenTest]; + if (curAndLenPrice < opt->price) + { + opt->price = curAndLenPrice; + opt->posPrev = cur; + opt->backPrev = curBack + LZMA_NUM_REPS; + opt->prev1IsChar = False; + } + } + + if (/*_maxMode && */lenTest == matches[offs]) + { + /* Try Match + Literal + Rep0 */ + const Byte *data2 = data - curBack - 1; + UInt32 lenTest2 = lenTest + 1; + UInt32 limit = lenTest2 + p->numFastBytes; + if (limit > numAvailFull) + limit = numAvailFull; + for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); + lenTest2 -= lenTest + 1; + if (lenTest2 >= 2) + { + UInt32 nextRepMatchPrice; + UInt32 state2 = kMatchNextStates[state]; + UInt32 posStateNext = (position + lenTest) & p->pbMask; + UInt32 curAndLenCharPrice = curAndLenPrice + + GET_PRICE_0(p->isMatch[state2][posStateNext]) + + LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), + data[lenTest], data2[lenTest], p->ProbPrices); + state2 = kLiteralNextStates[state2]; + posStateNext = (posStateNext + 1) & p->pbMask; + nextRepMatchPrice = curAndLenCharPrice + + GET_PRICE_1(p->isMatch[state2][posStateNext]) + + GET_PRICE_1(p->isRep[state2]); + + /* for (; lenTest2 >= 2; lenTest2--) */ + { + UInt32 offset = cur + lenTest + 1 + lenTest2; + UInt32 curAndLenPrice2; + COptimal *opt; + while (lenEnd < offset) + p->opt[++lenEnd].price = kInfinityPrice; + curAndLenPrice2 = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); + opt = &p->opt[offset]; + if (curAndLenPrice2 < opt->price) + { + opt->price = curAndLenPrice2; + opt->posPrev = cur + lenTest + 1; + opt->backPrev = 0; + opt->prev1IsChar = True; + opt->prev2 = True; + opt->posPrev2 = cur; + opt->backPrev2 = curBack + LZMA_NUM_REPS; + } + } + } + offs += 2; + if (offs == numPairs) + break; + curBack = matches[offs + 1]; + if (curBack >= kNumFullDistances) + GetPosSlot2(curBack, posSlot); + } + } + } + } +} + +#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) + +static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) +{ + UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; + const Byte *data; + const UInt32 *matches; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLength; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + *backRes = (UInt32)-1; + if (numAvail < 2) + return 1; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + + repLen = repIndex = 0; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 len; + const Byte *data2 = data - p->reps[i] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (len = 2; len < numAvail && data[len] == data2[len]; len++); + if (len >= p->numFastBytes) + { + *backRes = i; + MovePos(p, len - 1); + return len; + } + if (len > repLen) + { + repIndex = i; + repLen = len; + } + } + + matches = p->matches; + if (mainLen >= p->numFastBytes) + { + *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; + MovePos(p, mainLen - 1); + return mainLen; + } + + mainDist = 0; /* for GCC */ + if (mainLen >= 2) + { + mainDist = matches[numPairs - 1]; + while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) + { + if (!ChangePair(matches[numPairs - 3], mainDist)) + break; + numPairs -= 2; + mainLen = matches[numPairs - 2]; + mainDist = matches[numPairs - 1]; + } + if (mainLen == 2 && mainDist >= 0x80) + mainLen = 1; + } + + if (repLen >= 2 && ( + (repLen + 1 >= mainLen) || + (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || + (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) + { + *backRes = repIndex; + MovePos(p, repLen - 1); + return repLen; + } + + if (mainLen < 2 || numAvail <= 2) + return 1; + + p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); + if (p->longestMatchLength >= 2) + { + UInt32 newDistance = matches[p->numPairs - 1]; + if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || + (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || + (p->longestMatchLength > mainLen + 1) || + (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) + return 1; + } + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + for (i = 0; i < LZMA_NUM_REPS; i++) + { + UInt32 len, limit; + const Byte *data2 = data - p->reps[i] - 1; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + limit = mainLen - 1; + for (len = 2; len < limit && data[len] == data2[len]; len++); + if (len >= limit) + return 1; + } + *backRes = mainDist + LZMA_NUM_REPS; + MovePos(p, mainLen - 2); + return mainLen; +} + +static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) +{ + UInt32 len; + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + p->state = kMatchNextStates[p->state]; + len = LZMA_MATCH_LEN_MIN; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); + RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); +} + +static SRes CheckErrors(CLzmaEnc *p) +{ + if (p->result != SZ_OK) + return p->result; + if (p->rc.res != SZ_OK) + p->result = SZ_ERROR_WRITE; + if (p->matchFinderBase.result != SZ_OK) + p->result = SZ_ERROR_READ; + if (p->result != SZ_OK) + p->finished = True; + return p->result; +} + +static SRes Flush(CLzmaEnc *p, UInt32 nowPos) +{ + /* ReleaseMFStream(); */ + p->finished = True; + if (p->writeEndMark) + WriteEndMarker(p, nowPos & p->pbMask); + RangeEnc_FlushData(&p->rc); + RangeEnc_FlushStream(&p->rc); + return CheckErrors(p); +} + +static void FillAlignPrices(CLzmaEnc *p) +{ + UInt32 i; + for (i = 0; i < kAlignTableSize; i++) + p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + p->alignPriceCount = 0; +} + +static void FillDistancesPrices(CLzmaEnc *p) +{ + UInt32 tempPrices[kNumFullDistances]; + UInt32 i, lenToPosState; + for (i = kStartPosModelIndex; i < kNumFullDistances; i++) + { + UInt32 posSlot = GetPosSlot1(i); + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); + } + + for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) + { + UInt32 posSlot; + const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; + UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; + for (posSlot = 0; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); + for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) + posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + + { + UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; + for (i = 0; i < kStartPosModelIndex; i++) + distancesPrices[i] = posSlotPrices[i]; + for (; i < kNumFullDistances; i++) + distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; + } + } + p->matchPriceCount = 0; +} + +void LzmaEnc_Construct(CLzmaEnc *p) +{ + RangeEnc_Construct(&p->rc); + MatchFinder_Construct(&p->matchFinderBase); + + #ifndef _7ZIP_ST + MatchFinderMt_Construct(&p->matchFinderMt); + p->matchFinderMt.MatchFinder = &p->matchFinderBase; + #endif + + { + CLzmaEncProps props; + LzmaEncProps_Init(&props); + LzmaEnc_SetProps(p, &props); + } + + #ifndef LZMA_LOG_BSR + LzmaEnc_FastPosInit(p->g_FastPos); + #endif + + LzmaEnc_InitPriceTables(p->ProbPrices); + p->litProbs = NULL; + p->saveState.litProbs = NULL; +} + +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) +{ + void *p; + p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); + if (p) + LzmaEnc_Construct((CLzmaEnc *)p); + return p; +} + +void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->litProbs); + alloc->Free(alloc, p->saveState.litProbs); + p->litProbs = NULL; + p->saveState.litProbs = NULL; +} + +void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + #ifndef _7ZIP_ST + MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); + #endif + + MatchFinder_Free(&p->matchFinderBase, allocBig); + LzmaEnc_FreeLits(p, alloc); + RangeEnc_Free(&p->rc, alloc); +} + +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); + alloc->Free(alloc, p); +} + +static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) +{ + UInt32 nowPos32, startPos32; + if (p->needInit) + { + p->matchFinder.Init(p->matchFinderObj); + p->needInit = 0; + } + + if (p->finished) + return p->result; + RINOK(CheckErrors(p)); + + nowPos32 = (UInt32)p->nowPos64; + startPos32 = nowPos32; + + if (p->nowPos64 == 0) + { + UInt32 numPairs; + Byte curByte; + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + return Flush(p, nowPos32); + ReadMatchDistances(p, &numPairs); + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); + p->state = kLiteralNextStates[p->state]; + curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset); + LitEnc_Encode(&p->rc, p->litProbs, curByte); + p->additionalOffset--; + nowPos32++; + } + + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) + for (;;) + { + UInt32 pos, len, posState; + + if (p->fastMode) + len = GetOptimumFast(p, &pos); + else + len = GetOptimum(p, nowPos32, &pos); + + #ifdef SHOW_STAT2 + printf("\n pos = %4X, len = %u pos = %u", nowPos32, len, pos); + #endif + + posState = nowPos32 & p->pbMask; + if (len == 1 && pos == (UInt32)-1) + { + Byte curByte; + CLzmaProb *probs; + const Byte *data; + + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; + curByte = *data; + probs = LIT_PROBS(nowPos32, *(data - 1)); + if (IsCharState(p->state)) + LitEnc_Encode(&p->rc, probs, curByte); + else + LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); + p->state = kLiteralNextStates[p->state]; + } + else + { + RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); + if (pos < LZMA_NUM_REPS) + { + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); + if (pos == 0) + { + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); + RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); + } + else + { + UInt32 distance = p->reps[pos]; + RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); + if (pos == 1) + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); + else + { + RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); + RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); + if (pos == 3) + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + } + p->reps[1] = p->reps[0]; + p->reps[0] = distance; + } + if (len == 1) + p->state = kShortRepNextStates[p->state]; + else + { + LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + p->state = kRepNextStates[p->state]; + } + } + else + { + UInt32 posSlot; + RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); + p->state = kMatchNextStates[p->state]; + LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); + pos -= LZMA_NUM_REPS; + GetPosSlot(pos, posSlot); + RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); + + if (posSlot >= kStartPosModelIndex) + { + UInt32 footerBits = ((posSlot >> 1) - 1); + UInt32 base = ((2 | (posSlot & 1)) << footerBits); + UInt32 posReduced = pos - base; + + if (posSlot < kEndPosModelIndex) + RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); + else + { + RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); + p->alignPriceCount++; + } + } + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + p->reps[1] = p->reps[0]; + p->reps[0] = pos; + p->matchPriceCount++; + } + } + p->additionalOffset -= len; + nowPos32 += len; + if (p->additionalOffset == 0) + { + UInt32 processed; + if (!p->fastMode) + { + if (p->matchPriceCount >= (1 << 7)) + FillDistancesPrices(p); + if (p->alignPriceCount >= kAlignTableSize) + FillAlignPrices(p); + } + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + break; + processed = nowPos32 - startPos32; + if (useLimits) + { + if (processed + kNumOpts + 300 >= maxUnpackSize || + RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) + break; + } + else if (processed >= (1 << 17)) + { + p->nowPos64 += nowPos32 - startPos32; + return CheckErrors(p); + } + } + } + p->nowPos64 += nowPos32 - startPos32; + return Flush(p, nowPos32); +} + +#define kBigHashDicLimit ((UInt32)1 << 24) + +static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + UInt32 beforeSize = kNumOpts; + if (!RangeEnc_Alloc(&p->rc, alloc)) + return SZ_ERROR_MEM; + + #ifndef _7ZIP_ST + p->mtMode = (p->multiThread && !p->fastMode && (p->matchFinderBase.btMode != 0)); + #endif + + { + unsigned lclp = p->lc + p->lp; + if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) + { + LzmaEnc_FreeLits(p, alloc); + p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + if (!p->litProbs || !p->saveState.litProbs) + { + LzmaEnc_FreeLits(p, alloc); + return SZ_ERROR_MEM; + } + p->lclp = lclp; + } + } + + p->matchFinderBase.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0); + + if (beforeSize + p->dictSize < keepWindowSize) + beforeSize = keepWindowSize - p->dictSize; + + #ifndef _7ZIP_ST + if (p->mtMode) + { + RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); + p->matchFinderObj = &p->matchFinderMt; + MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); + } + else + #endif + { + if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) + return SZ_ERROR_MEM; + p->matchFinderObj = &p->matchFinderBase; + MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); + } + + return SZ_OK; +} + +void LzmaEnc_Init(CLzmaEnc *p) +{ + UInt32 i; + p->state = 0; + for (i = 0 ; i < LZMA_NUM_REPS; i++) + p->reps[i] = 0; + + RangeEnc_Init(&p->rc); + + + for (i = 0; i < kNumStates; i++) + { + UInt32 j; + for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) + { + p->isMatch[i][j] = kProbInitValue; + p->isRep0Long[i][j] = kProbInitValue; + } + p->isRep[i] = kProbInitValue; + p->isRepG0[i] = kProbInitValue; + p->isRepG1[i] = kProbInitValue; + p->isRepG2[i] = kProbInitValue; + } + + { + UInt32 num = (UInt32)0x300 << (p->lp + p->lc); + CLzmaProb *probs = p->litProbs; + for (i = 0; i < num; i++) + probs[i] = kProbInitValue; + } + + { + for (i = 0; i < kNumLenToPosStates; i++) + { + CLzmaProb *probs = p->posSlotEncoder[i]; + UInt32 j; + for (j = 0; j < (1 << kNumPosSlotBits); j++) + probs[j] = kProbInitValue; + } + } + { + for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) + p->posEncoders[i] = kProbInitValue; + } + + LenEnc_Init(&p->lenEnc.p); + LenEnc_Init(&p->repLenEnc.p); + + for (i = 0; i < (1 << kNumAlignBits); i++) + p->posAlignEncoder[i] = kProbInitValue; + + p->optimumEndIndex = 0; + p->optimumCurrentIndex = 0; + p->additionalOffset = 0; + + p->pbMask = (1 << p->pb) - 1; + p->lpMask = (1 << p->lp) - 1; +} + +void LzmaEnc_InitPrices(CLzmaEnc *p) +{ + if (!p->fastMode) + { + FillDistancesPrices(p); + FillAlignPrices(p); + } + + p->lenEnc.tableSize = + p->repLenEnc.tableSize = + p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); +} + +static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + UInt32 i; + for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) + if (p->dictSize <= ((UInt32)1 << i)) + break; + p->distTableSize = i * 2; + + p->finished = False; + p->result = SZ_OK; + RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + p->nowPos64 = 0; + return SZ_OK; +} + +static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->matchFinderBase.stream = inStream; + p->needInit = 1; + p->rc.outStream = outStream; + return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); +} + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, + ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + p->matchFinderBase.stream = inStream; + p->needInit = 1; + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) +{ + p->matchFinderBase.directInput = 1; + p->matchFinderBase.bufferBase = (Byte *)src; + p->matchFinderBase.directInputRem = srcLen; +} + +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + LzmaEnc_SetInputBuf(p, src, srcLen); + p->needInit = 1; + + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +void LzmaEnc_Finish(CLzmaEncHandle pp) +{ + #ifndef _7ZIP_ST + CLzmaEnc *p = (CLzmaEnc *)pp; + if (p->mtMode) + MatchFinderMt_ReleaseStream(&p->matchFinderMt); + #else + UNUSED_VAR(pp); + #endif +} + + +typedef struct +{ + ISeqOutStream funcTable; + Byte *data; + SizeT rem; + Bool overflow; +} CSeqOutStreamBuf; + +static size_t MyWrite(void *pp, const void *data, size_t size) +{ + CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; + if (p->rem < size) + { + size = p->rem; + p->overflow = True; + } + memcpy(p->data, data, size); + p->rem -= size; + p->data += size; + return size; +} + + +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); +} + + +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; +} + + +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + UInt64 nowPos64; + SRes res; + CSeqOutStreamBuf outStream; + + outStream.funcTable.Write = MyWrite; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = False; + p->finished = False; + p->result = SZ_OK; + + if (reInit) + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + nowPos64 = p->nowPos64; + RangeEnc_Init(&p->rc); + p->rc.outStream = &outStream.funcTable; + + res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize); + + *unpackSize = (UInt32)(p->nowPos64 - nowPos64); + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + + return res; +} + + +static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) +{ + SRes res = SZ_OK; + + #ifndef _7ZIP_ST + Byte allocaDummy[0x300]; + allocaDummy[0] = 0; + allocaDummy[1] = allocaDummy[0]; + #endif + + for (;;) + { + res = LzmaEnc_CodeOneBlock(p, False, 0, 0); + if (res != SZ_OK || p->finished) + break; + if (progress) + { + res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); + if (res != SZ_OK) + { + res = SZ_ERROR_PROGRESS; + break; + } + } + } + + LzmaEnc_Finish(p); + + /* + if (res == S_OK && !Inline_MatchFinder_IsFinishedOK(&p->matchFinderBase)) + res = SZ_ERROR_FAIL; + } + */ + + return res; +} + + +SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, + ISzAlloc *alloc, ISzAlloc *allocBig) +{ + RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); + return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); +} + + +SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + unsigned i; + UInt32 dictSize = p->dictSize; + if (*size < LZMA_PROPS_SIZE) + return SZ_ERROR_PARAM; + *size = LZMA_PROPS_SIZE; + props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); + + if (dictSize >= ((UInt32)1 << 22)) + { + UInt32 kDictMask = ((UInt32)1 << 20) - 1; + if (dictSize < (UInt32)0xFFFFFFFF - kDictMask) + dictSize = (dictSize + kDictMask) & ~kDictMask; + } + else for (i = 11; i <= 30; i++) + { + if (dictSize <= ((UInt32)2 << i)) { dictSize = (2 << i); break; } + if (dictSize <= ((UInt32)3 << i)) { dictSize = (3 << i); break; } + } + + for (i = 0; i < 4; i++) + props[1 + i] = (Byte)(dictSize >> (8 * i)); + return SZ_OK; +} + + +SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + SRes res; + CLzmaEnc *p = (CLzmaEnc *)pp; + + CSeqOutStreamBuf outStream; + + outStream.funcTable.Write = MyWrite; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = writeEndMark; + p->rc.outStream = &outStream.funcTable; + + res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); + + if (res == SZ_OK) + { + res = LzmaEnc_Encode2(p, progress); + if (res == SZ_OK && p->nowPos64 != srcLen) + res = SZ_ERROR_FAIL; + } + + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + return res; +} + + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); + SRes res; + if (!p) + return SZ_ERROR_MEM; + + res = LzmaEnc_SetProps(p, props); + if (res == SZ_OK) + { + res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); + if (res == SZ_OK) + res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, + writeEndMark, progress, alloc, allocBig); + } + + LzmaEnc_Destroy(p, alloc, allocBig); + return res; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzmaEnc.h b/Provenance/LzmaSDKObjC/lzma/C/LzmaEnc.h new file mode 100644 index 0000000000..c2806b45f4 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzmaEnc.h @@ -0,0 +1,78 @@ +/* LzmaEnc.h -- LZMA Encoder +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_ENC_H +#define __LZMA_ENC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaEncProps +{ + int level; /* 0 <= level <= 9 */ + UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version + (1 << 12) <= dictSize <= (1 << 30) for 64-bit version + default = (1 << 24) */ + UInt64 reduceSize; /* estimated size of data that will be compressed. default = 0xFFFFFFFF. + Encoder uses this value to reduce dictionary size */ + int lc; /* 0 <= lc <= 8, default = 3 */ + int lp; /* 0 <= lp <= 4, default = 0 */ + int pb; /* 0 <= pb <= 4, default = 2 */ + int algo; /* 0 - fast, 1 - normal, default = 1 */ + int fb; /* 5 <= fb <= 273, default = 32 */ + int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ + int numHashBytes; /* 2, 3 or 4, default = 4 */ + UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ + unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ + int numThreads; /* 1 or 2, default = 2 */ +} CLzmaEncProps; + +void LzmaEncProps_Init(CLzmaEncProps *p); +void LzmaEncProps_Normalize(CLzmaEncProps *p); +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); + + +/* ---------- CLzmaEncHandle Interface ---------- */ + +/* LzmaEnc_* functions can return the following exit codes: +Returns: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - Write callback error. + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +typedef void * CLzmaEncHandle; + +CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); +SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); +SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +/* ---------- One Call Interface ---------- */ + +/* LzmaEncode +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzmaLib.c b/Provenance/LzmaSDKObjC/lzma/C/LzmaLib.c new file mode 100644 index 0000000000..c10cf1a0f2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzmaLib.c @@ -0,0 +1,40 @@ +/* LzmaLib.c -- LZMA library wrapper +2015-06-13 : Igor Pavlov : Public domain */ + +#include "Alloc.h" +#include "LzmaDec.h" +#include "LzmaEnc.h" +#include "LzmaLib.h" + +MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, + unsigned char *outProps, size_t *outPropsSize, + int level, /* 0 <= level <= 9, default = 5 */ + unsigned dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */ + int lc, /* 0 <= lc <= 8, default = 3 */ + int lp, /* 0 <= lp <= 4, default = 0 */ + int pb, /* 0 <= pb <= 4, default = 2 */ + int fb, /* 5 <= fb <= 273, default = 32 */ + int numThreads /* 1 or 2, default = 2 */ +) +{ + CLzmaEncProps props; + LzmaEncProps_Init(&props); + props.level = level; + props.dictSize = dictSize; + props.lc = lc; + props.lp = lp; + props.pb = pb; + props.fb = fb; + props.numThreads = numThreads; + + return LzmaEncode(dest, destLen, src, srcLen, &props, outProps, outPropsSize, 0, + NULL, &g_Alloc, &g_Alloc); +} + + +MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, + const unsigned char *props, size_t propsSize) +{ + ELzmaStatus status; + return LzmaDecode(dest, destLen, src, srcLen, props, (unsigned)propsSize, LZMA_FINISH_ANY, &status, &g_Alloc); +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/LzmaLib.h b/Provenance/LzmaSDKObjC/lzma/C/LzmaLib.h new file mode 100644 index 0000000000..5c35e53654 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/LzmaLib.h @@ -0,0 +1,131 @@ +/* LzmaLib.h -- LZMA library interface +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_LIB_H +#define __LZMA_LIB_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define MY_STDAPI int MY_STD_CALL + +#define LZMA_PROPS_SIZE 5 + +/* +RAM requirements for LZMA: + for compression: (dictSize * 11.5 + 6 MB) + state_size + for decompression: dictSize + state_size + state_size = (4 + (1.5 << (lc + lp))) KB + by default (lc=3, lp=0), state_size = 16 KB. + +LZMA properties (5 bytes) format + Offset Size Description + 0 1 lc, lp and pb in encoded form. + 1 4 dictSize (little endian). +*/ + +/* +LzmaCompress +------------ + +outPropsSize - + In: the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. + Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. + + LZMA Encoder will use defult values for any parameter, if it is + -1 for any from: level, loc, lp, pb, fb, numThreads + 0 for dictSize + +level - compression level: 0 <= level <= 9; + + level dictSize algo fb + 0: 16 KB 0 32 + 1: 64 KB 0 32 + 2: 256 KB 0 32 + 3: 1 MB 0 32 + 4: 4 MB 0 32 + 5: 16 MB 1 32 + 6: 32 MB 1 32 + 7+: 64 MB 1 64 + + The default value for "level" is 5. + + algo = 0 means fast method + algo = 1 means normal method + +dictSize - The dictionary size in bytes. The maximum value is + 128 MB = (1 << 27) bytes for 32-bit version + 1 GB = (1 << 30) bytes for 64-bit version + The default value is 16 MB = (1 << 24) bytes. + It's recommended to use the dictionary that is larger than 4 KB and + that can be calculated as (1 << N) or (3 << N) sizes. + +lc - The number of literal context bits (high bits of previous literal). + It can be in the range from 0 to 8. The default value is 3. + Sometimes lc=4 gives the gain for big files. + +lp - The number of literal pos bits (low bits of current position for literals). + It can be in the range from 0 to 4. The default value is 0. + The lp switch is intended for periodical data when the period is equal to 2^lp. + For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's + better to set lc=0, if you change lp switch. + +pb - The number of pos bits (low bits of current position). + It can be in the range from 0 to 4. The default value is 2. + The pb switch is intended for periodical data when the period is equal 2^pb. + +fb - Word size (the number of fast bytes). + It can be in the range from 5 to 273. The default value is 32. + Usually, a big number gives a little bit better compression ratio and + slower compression process. + +numThreads - The number of thereads. 1 or 2. The default value is 2. + Fast mode (algo = 0) can use only 1 thread. + +Out: + destLen - processed output size +Returns: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, + unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */ + int level, /* 0 <= level <= 9, default = 5 */ + unsigned dictSize, /* default = (1 << 24) */ + int lc, /* 0 <= lc <= 8, default = 3 */ + int lp, /* 0 <= lp <= 4, default = 0 */ + int pb, /* 0 <= pb <= 4, default = 2 */ + int fb, /* 5 <= fb <= 273, default = 32 */ + int numThreads /* 1 or 2, default = 2 */ + ); + +/* +LzmaUncompress +-------------- +In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size +Out: + destLen - processed output size + srcLen - processed input size +Returns: + SZ_OK - OK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation arror + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src) +*/ + +MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, + const unsigned char *props, size_t propsSize); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/MtCoder.c b/Provenance/LzmaSDKObjC/lzma/C/MtCoder.c new file mode 100644 index 0000000000..8c0d9b3395 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/MtCoder.c @@ -0,0 +1,327 @@ +/* MtCoder.c -- Multi-thread Coder +2015-10-13 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "MtCoder.h" + +void LoopThread_Construct(CLoopThread *p) +{ + Thread_Construct(&p->thread); + Event_Construct(&p->startEvent); + Event_Construct(&p->finishedEvent); +} + +void LoopThread_Close(CLoopThread *p) +{ + Thread_Close(&p->thread); + Event_Close(&p->startEvent); + Event_Close(&p->finishedEvent); +} + +static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE LoopThreadFunc(void *pp) +{ + CLoopThread *p = (CLoopThread *)pp; + for (;;) + { + if (Event_Wait(&p->startEvent) != 0) + return SZ_ERROR_THREAD; + if (p->stop) + return 0; + p->res = p->func(p->param); + if (Event_Set(&p->finishedEvent) != 0) + return SZ_ERROR_THREAD; + } +} + +WRes LoopThread_Create(CLoopThread *p) +{ + p->stop = 0; + RINOK(AutoResetEvent_CreateNotSignaled(&p->startEvent)); + RINOK(AutoResetEvent_CreateNotSignaled(&p->finishedEvent)); + return Thread_Create(&p->thread, LoopThreadFunc, p); +} + +WRes LoopThread_StopAndWait(CLoopThread *p) +{ + p->stop = 1; + if (Event_Set(&p->startEvent) != 0) + return SZ_ERROR_THREAD; + return Thread_Wait(&p->thread); +} + +WRes LoopThread_StartSubThread(CLoopThread *p) { return Event_Set(&p->startEvent); } +WRes LoopThread_WaitSubThread(CLoopThread *p) { return Event_Wait(&p->finishedEvent); } + +static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize) +{ + return (p && p->Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK; +} + +static void MtProgress_Init(CMtProgress *p, ICompressProgress *progress) +{ + unsigned i; + for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) + p->inSizes[i] = p->outSizes[i] = 0; + p->totalInSize = p->totalOutSize = 0; + p->progress = progress; + p->res = SZ_OK; +} + +static void MtProgress_Reinit(CMtProgress *p, unsigned index) +{ + p->inSizes[index] = 0; + p->outSizes[index] = 0; +} + +#define UPDATE_PROGRESS(size, prev, total) \ + if (size != (UInt64)(Int64)-1) { total += size - prev; prev = size; } + +SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize) +{ + SRes res; + CriticalSection_Enter(&p->cs); + UPDATE_PROGRESS(inSize, p->inSizes[index], p->totalInSize) + UPDATE_PROGRESS(outSize, p->outSizes[index], p->totalOutSize) + if (p->res == SZ_OK) + p->res = Progress(p->progress, p->totalInSize, p->totalOutSize); + res = p->res; + CriticalSection_Leave(&p->cs); + return res; +} + +static void MtProgress_SetError(CMtProgress *p, SRes res) +{ + CriticalSection_Enter(&p->cs); + if (p->res == SZ_OK) + p->res = res; + CriticalSection_Leave(&p->cs); +} + +static void MtCoder_SetError(CMtCoder* p, SRes res) +{ + CriticalSection_Enter(&p->cs); + if (p->res == SZ_OK) + p->res = res; + CriticalSection_Leave(&p->cs); +} + +/* ---------- MtThread ---------- */ + +void CMtThread_Construct(CMtThread *p, CMtCoder *mtCoder) +{ + p->mtCoder = mtCoder; + p->outBuf = 0; + p->inBuf = 0; + Event_Construct(&p->canRead); + Event_Construct(&p->canWrite); + LoopThread_Construct(&p->thread); +} + +#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } + +static void CMtThread_CloseEvents(CMtThread *p) +{ + Event_Close(&p->canRead); + Event_Close(&p->canWrite); +} + +static void CMtThread_Destruct(CMtThread *p) +{ + CMtThread_CloseEvents(p); + + if (Thread_WasCreated(&p->thread.thread)) + { + LoopThread_StopAndWait(&p->thread); + LoopThread_Close(&p->thread); + } + + if (p->mtCoder->alloc) + IAlloc_Free(p->mtCoder->alloc, p->outBuf); + p->outBuf = 0; + + if (p->mtCoder->alloc) + IAlloc_Free(p->mtCoder->alloc, p->inBuf); + p->inBuf = 0; +} + +#define MY_BUF_ALLOC(buf, size, newSize) \ + if (buf == 0 || size != newSize) \ + { IAlloc_Free(p->mtCoder->alloc, buf); \ + size = newSize; buf = (Byte *)IAlloc_Alloc(p->mtCoder->alloc, size); \ + if (buf == 0) return SZ_ERROR_MEM; } + +static SRes CMtThread_Prepare(CMtThread *p) +{ + MY_BUF_ALLOC(p->inBuf, p->inBufSize, p->mtCoder->blockSize) + MY_BUF_ALLOC(p->outBuf, p->outBufSize, p->mtCoder->destBlockSize) + + p->stopReading = False; + p->stopWriting = False; + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canRead)); + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canWrite)); + + return SZ_OK; +} + +static SRes FullRead(ISeqInStream *stream, Byte *data, size_t *processedSize) +{ + size_t size = *processedSize; + *processedSize = 0; + while (size != 0) + { + size_t curSize = size; + SRes res = stream->Read(stream, data, &curSize); + *processedSize += curSize; + data += curSize; + size -= curSize; + RINOK(res); + if (curSize == 0) + return SZ_OK; + } + return SZ_OK; +} + +#define GET_NEXT_THREAD(p) &p->mtCoder->threads[p->index == p->mtCoder->numThreads - 1 ? 0 : p->index + 1] + +static SRes MtThread_Process(CMtThread *p, Bool *stop) +{ + CMtThread *next; + *stop = True; + if (Event_Wait(&p->canRead) != 0) + return SZ_ERROR_THREAD; + + next = GET_NEXT_THREAD(p); + + if (p->stopReading) + { + next->stopReading = True; + return Event_Set(&next->canRead) == 0 ? SZ_OK : SZ_ERROR_THREAD; + } + + { + size_t size = p->mtCoder->blockSize; + size_t destSize = p->outBufSize; + + RINOK(FullRead(p->mtCoder->inStream, p->inBuf, &size)); + next->stopReading = *stop = (size != p->mtCoder->blockSize); + if (Event_Set(&next->canRead) != 0) + return SZ_ERROR_THREAD; + + RINOK(p->mtCoder->mtCallback->Code(p->mtCoder->mtCallback, p->index, + p->outBuf, &destSize, p->inBuf, size, *stop)); + + MtProgress_Reinit(&p->mtCoder->mtProgress, p->index); + + if (Event_Wait(&p->canWrite) != 0) + return SZ_ERROR_THREAD; + if (p->stopWriting) + return SZ_ERROR_FAIL; + if (p->mtCoder->outStream->Write(p->mtCoder->outStream, p->outBuf, destSize) != destSize) + return SZ_ERROR_WRITE; + return Event_Set(&next->canWrite) == 0 ? SZ_OK : SZ_ERROR_THREAD; + } +} + +static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc(void *pp) +{ + CMtThread *p = (CMtThread *)pp; + for (;;) + { + Bool stop; + CMtThread *next = GET_NEXT_THREAD(p); + SRes res = MtThread_Process(p, &stop); + if (res != SZ_OK) + { + MtCoder_SetError(p->mtCoder, res); + MtProgress_SetError(&p->mtCoder->mtProgress, res); + next->stopReading = True; + next->stopWriting = True; + Event_Set(&next->canRead); + Event_Set(&next->canWrite); + return res; + } + if (stop) + return 0; + } +} + +void MtCoder_Construct(CMtCoder* p) +{ + unsigned i; + p->alloc = 0; + for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) + { + CMtThread *t = &p->threads[i]; + t->index = i; + CMtThread_Construct(t, p); + } + CriticalSection_Init(&p->cs); + CriticalSection_Init(&p->mtProgress.cs); +} + +void MtCoder_Destruct(CMtCoder* p) +{ + unsigned i; + for (i = 0; i < NUM_MT_CODER_THREADS_MAX; i++) + CMtThread_Destruct(&p->threads[i]); + CriticalSection_Delete(&p->cs); + CriticalSection_Delete(&p->mtProgress.cs); +} + +SRes MtCoder_Code(CMtCoder *p) +{ + unsigned i, numThreads = p->numThreads; + SRes res = SZ_OK; + p->res = SZ_OK; + + MtProgress_Init(&p->mtProgress, p->progress); + + for (i = 0; i < numThreads; i++) + { + RINOK(CMtThread_Prepare(&p->threads[i])); + } + + for (i = 0; i < numThreads; i++) + { + CMtThread *t = &p->threads[i]; + CLoopThread *lt = &t->thread; + + if (!Thread_WasCreated(<->thread)) + { + lt->func = ThreadFunc; + lt->param = t; + + if (LoopThread_Create(lt) != SZ_OK) + { + res = SZ_ERROR_THREAD; + break; + } + } + } + + if (res == SZ_OK) + { + unsigned j; + for (i = 0; i < numThreads; i++) + { + CMtThread *t = &p->threads[i]; + if (LoopThread_StartSubThread(&t->thread) != SZ_OK) + { + res = SZ_ERROR_THREAD; + p->threads[0].stopReading = True; + break; + } + } + + Event_Set(&p->threads[0].canWrite); + Event_Set(&p->threads[0].canRead); + + for (j = 0; j < i; j++) + LoopThread_WaitSubThread(&p->threads[j].thread); + } + + for (i = 0; i < numThreads; i++) + CMtThread_CloseEvents(&p->threads[i]); + return (res == SZ_OK) ? p->res : res; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/MtCoder.h b/Provenance/LzmaSDKObjC/lzma/C/MtCoder.h new file mode 100644 index 0000000000..705208ed3b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/MtCoder.h @@ -0,0 +1,98 @@ +/* MtCoder.h -- Multi-thread Coder +2009-11-19 : Igor Pavlov : Public domain */ + +#ifndef __MT_CODER_H +#define __MT_CODER_H + +#include "Threads.h" + +EXTERN_C_BEGIN + +typedef struct +{ + CThread thread; + CAutoResetEvent startEvent; + CAutoResetEvent finishedEvent; + int stop; + + THREAD_FUNC_TYPE func; + LPVOID param; + THREAD_FUNC_RET_TYPE res; +} CLoopThread; + +void LoopThread_Construct(CLoopThread *p); +void LoopThread_Close(CLoopThread *p); +WRes LoopThread_Create(CLoopThread *p); +WRes LoopThread_StopAndWait(CLoopThread *p); +WRes LoopThread_StartSubThread(CLoopThread *p); +WRes LoopThread_WaitSubThread(CLoopThread *p); + +#ifndef _7ZIP_ST +#define NUM_MT_CODER_THREADS_MAX 32 +#else +#define NUM_MT_CODER_THREADS_MAX 1 +#endif + +typedef struct +{ + UInt64 totalInSize; + UInt64 totalOutSize; + ICompressProgress *progress; + SRes res; + CCriticalSection cs; + UInt64 inSizes[NUM_MT_CODER_THREADS_MAX]; + UInt64 outSizes[NUM_MT_CODER_THREADS_MAX]; +} CMtProgress; + +SRes MtProgress_Set(CMtProgress *p, unsigned index, UInt64 inSize, UInt64 outSize); + +struct _CMtCoder; + +typedef struct +{ + struct _CMtCoder *mtCoder; + Byte *outBuf; + size_t outBufSize; + Byte *inBuf; + size_t inBufSize; + unsigned index; + CLoopThread thread; + + Bool stopReading; + Bool stopWriting; + CAutoResetEvent canRead; + CAutoResetEvent canWrite; +} CMtThread; + +typedef struct +{ + SRes (*Code)(void *p, unsigned index, Byte *dest, size_t *destSize, + const Byte *src, size_t srcSize, int finished); +} IMtCoderCallback; + +typedef struct _CMtCoder +{ + size_t blockSize; + size_t destBlockSize; + unsigned numThreads; + + ISeqInStream *inStream; + ISeqOutStream *outStream; + ICompressProgress *progress; + ISzAlloc *alloc; + + IMtCoderCallback *mtCallback; + CCriticalSection cs; + SRes res; + + CMtProgress mtProgress; + CMtThread threads[NUM_MT_CODER_THREADS_MAX]; +} CMtCoder; + +void MtCoder_Construct(CMtCoder* p); +void MtCoder_Destruct(CMtCoder* p); +SRes MtCoder_Code(CMtCoder *p); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Ppmd.h b/Provenance/LzmaSDKObjC/lzma/C/Ppmd.h new file mode 100644 index 0000000000..e807ca17d7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Ppmd.h @@ -0,0 +1,85 @@ +/* Ppmd.h -- PPMD codec common code +2016-05-16 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#ifndef __PPMD_H +#define __PPMD_H + +#include "CpuArch.h" + +EXTERN_C_BEGIN + +#ifdef MY_CPU_32BIT + #define PPMD_32BIT +#endif + +#define PPMD_INT_BITS 7 +#define PPMD_PERIOD_BITS 7 +#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS)) + +#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift)) +#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2) +#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob)) +#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob)) + +#define PPMD_N1 4 +#define PPMD_N2 4 +#define PPMD_N3 4 +#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4) +#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4) + +#pragma pack(push, 1) +/* Most compilers works OK here even without #pragma pack(push, 1), but some GCC compilers need it. */ + +/* SEE-contexts for PPM-contexts with masked symbols */ +typedef struct +{ + UInt16 Summ; /* Freq */ + Byte Shift; /* Speed of Freq change; low Shift is for fast change */ + Byte Count; /* Count to next change of Shift */ +} CPpmd_See; + +#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \ + { (p)->Summ <<= 1; (p)->Count = (Byte)(3 << (p)->Shift++); } + +typedef struct +{ + Byte Symbol; + Byte Freq; + UInt16 SuccessorLow; + UInt16 SuccessorHigh; +} CPpmd_State; + +#pragma pack(pop) + +typedef + #ifdef PPMD_32BIT + CPpmd_State * + #else + UInt32 + #endif + CPpmd_State_Ref; + +typedef + #ifdef PPMD_32BIT + void * + #else + UInt32 + #endif + CPpmd_Void_Ref; + +typedef + #ifdef PPMD_32BIT + Byte * + #else + UInt32 + #endif + CPpmd_Byte_Ref; + +#define PPMD_SetAllBitsIn256Bytes(p) \ + { unsigned z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \ + p[z+7] = p[z+6] = p[z+5] = p[z+4] = p[z+3] = p[z+2] = p[z+1] = p[z+0] = ~(size_t)0; }} + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Ppmd7.c b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7.c new file mode 100644 index 0000000000..ba5d329193 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7.c @@ -0,0 +1,710 @@ +/* Ppmd7.c -- PPMdH codec +2016-05-21 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#include "Precomp.h" + +#include + +#include "Ppmd7.h" + +const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; +static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051}; + +#define MAX_FREQ 124 +#define UNIT_SIZE 12 + +#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE) +#define U2I(nu) (p->Units2Indx[(nu) - 1]) +#define I2U(indx) (p->Indx2Units[indx]) + +#ifdef PPMD_32BIT + #define REF(ptr) (ptr) +#else + #define REF(ptr) ((UInt32)((Byte *)(ptr) - (p)->Base)) +#endif + +#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr)) + +#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) +#define STATS(ctx) Ppmd7_GetStats(p, ctx) +#define ONE_STATE(ctx) Ppmd7Context_OneState(ctx) +#define SUFFIX(ctx) CTX((ctx)->Suffix) + +typedef CPpmd7_Context * CTX_PTR; + +struct CPpmd7_Node_; + +typedef + #ifdef PPMD_32BIT + struct CPpmd7_Node_ * + #else + UInt32 + #endif + CPpmd7_Node_Ref; + +typedef struct CPpmd7_Node_ +{ + UInt16 Stamp; /* must be at offset 0 as CPpmd7_Context::NumStats. Stamp=0 means free */ + UInt16 NU; + CPpmd7_Node_Ref Next; /* must be at offset >= 4 */ + CPpmd7_Node_Ref Prev; +} CPpmd7_Node; + +#ifdef PPMD_32BIT + #define NODE(ptr) (ptr) +#else + #define NODE(offs) ((CPpmd7_Node *)(p->Base + (offs))) +#endif + +void Ppmd7_Construct(CPpmd7 *p) +{ + unsigned i, k, m; + + p->Base = 0; + + for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++) + { + unsigned step = (i >= 12 ? 4 : (i >> 2) + 1); + do { p->Units2Indx[k++] = (Byte)i; } while (--step); + p->Indx2Units[i] = (Byte)k; + } + + p->NS2BSIndx[0] = (0 << 1); + p->NS2BSIndx[1] = (1 << 1); + memset(p->NS2BSIndx + 2, (2 << 1), 9); + memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11); + + for (i = 0; i < 3; i++) + p->NS2Indx[i] = (Byte)i; + for (m = i, k = 1; i < 256; i++) + { + p->NS2Indx[i] = (Byte)m; + if (--k == 0) + k = (++m) - 2; + } + + memset(p->HB2Flag, 0, 0x40); + memset(p->HB2Flag + 0x40, 8, 0x100 - 0x40); +} + +void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->Base); + p->Size = 0; + p->Base = 0; +} + +Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc) +{ + if (p->Base == 0 || p->Size != size) + { + Ppmd7_Free(p, alloc); + p->AlignOffset = + #ifdef PPMD_32BIT + (4 - size) & 3; + #else + 4 - (size & 3); + #endif + if ((p->Base = (Byte *)alloc->Alloc(alloc, p->AlignOffset + size + #ifndef PPMD_32BIT + + UNIT_SIZE + #endif + )) == 0) + return False; + p->Size = size; + } + return True; +} + +static void InsertNode(CPpmd7 *p, void *node, unsigned indx) +{ + *((CPpmd_Void_Ref *)node) = p->FreeList[indx]; + p->FreeList[indx] = REF(node); +} + +static void *RemoveNode(CPpmd7 *p, unsigned indx) +{ + CPpmd_Void_Ref *node = (CPpmd_Void_Ref *)Ppmd7_GetPtr(p, p->FreeList[indx]); + p->FreeList[indx] = *node; + return node; +} + +static void SplitBlock(CPpmd7 *p, void *ptr, unsigned oldIndx, unsigned newIndx) +{ + unsigned i, nu = I2U(oldIndx) - I2U(newIndx); + ptr = (Byte *)ptr + U2B(I2U(newIndx)); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1); + } + InsertNode(p, ptr, i); +} + +static void GlueFreeBlocks(CPpmd7 *p) +{ + #ifdef PPMD_32BIT + CPpmd7_Node headItem; + CPpmd7_Node_Ref head = &headItem; + #else + CPpmd7_Node_Ref head = p->AlignOffset + p->Size; + #endif + + CPpmd7_Node_Ref n = head; + unsigned i; + + p->GlueCount = 255; + + /* create doubly-linked list of free blocks */ + for (i = 0; i < PPMD_NUM_INDEXES; i++) + { + UInt16 nu = I2U(i); + CPpmd7_Node_Ref next = (CPpmd7_Node_Ref)p->FreeList[i]; + p->FreeList[i] = 0; + while (next != 0) + { + CPpmd7_Node *node = NODE(next); + node->Next = n; + n = NODE(n)->Prev = next; + next = *(const CPpmd7_Node_Ref *)node; + node->Stamp = 0; + node->NU = (UInt16)nu; + } + } + NODE(head)->Stamp = 1; + NODE(head)->Next = n; + NODE(n)->Prev = head; + if (p->LoUnit != p->HiUnit) + ((CPpmd7_Node *)p->LoUnit)->Stamp = 1; + + /* Glue free blocks */ + while (n != head) + { + CPpmd7_Node *node = NODE(n); + UInt32 nu = (UInt32)node->NU; + for (;;) + { + CPpmd7_Node *node2 = NODE(n) + nu; + nu += node2->NU; + if (node2->Stamp != 0 || nu >= 0x10000) + break; + NODE(node2->Prev)->Next = node2->Next; + NODE(node2->Next)->Prev = node2->Prev; + node->NU = (UInt16)nu; + } + n = node->Next; + } + + /* Fill lists of free blocks */ + for (n = NODE(head)->Next; n != head;) + { + CPpmd7_Node *node = NODE(n); + unsigned nu; + CPpmd7_Node_Ref next = node->Next; + for (nu = node->NU; nu > 128; nu -= 128, node += 128) + InsertNode(p, node, PPMD_NUM_INDEXES - 1); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, node + k, nu - k - 1); + } + InsertNode(p, node, i); + n = next; + } +} + +static void *AllocUnitsRare(CPpmd7 *p, unsigned indx) +{ + unsigned i; + void *retVal; + if (p->GlueCount == 0) + { + GlueFreeBlocks(p); + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + } + i = indx; + do + { + if (++i == PPMD_NUM_INDEXES) + { + UInt32 numBytes = U2B(I2U(indx)); + p->GlueCount--; + return ((UInt32)(p->UnitsStart - p->Text) > numBytes) ? (p->UnitsStart -= numBytes) : (NULL); + } + } + while (p->FreeList[i] == 0); + retVal = RemoveNode(p, i); + SplitBlock(p, retVal, i, indx); + return retVal; +} + +static void *AllocUnits(CPpmd7 *p, unsigned indx) +{ + UInt32 numBytes; + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + numBytes = U2B(I2U(indx)); + if (numBytes <= (UInt32)(p->HiUnit - p->LoUnit)) + { + void *retVal = p->LoUnit; + p->LoUnit += numBytes; + return retVal; + } + return AllocUnitsRare(p, indx); +} + +#define MyMem12Cpy(dest, src, num) \ + { UInt32 *d = (UInt32 *)dest; const UInt32 *s = (const UInt32 *)src; UInt32 n = num; \ + do { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s += 3; d += 3; } while (--n); } + +static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU) +{ + unsigned i0 = U2I(oldNU); + unsigned i1 = U2I(newNU); + if (i0 == i1) + return oldPtr; + if (p->FreeList[i1] != 0) + { + void *ptr = RemoveNode(p, i1); + MyMem12Cpy(ptr, oldPtr, newNU); + InsertNode(p, oldPtr, i0); + return ptr; + } + SplitBlock(p, oldPtr, i0, i1); + return oldPtr; +} + +#define SUCCESSOR(p) ((CPpmd_Void_Ref)((p)->SuccessorLow | ((UInt32)(p)->SuccessorHigh << 16))) + +static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v) +{ + (p)->SuccessorLow = (UInt16)((UInt32)(v) & 0xFFFF); + (p)->SuccessorHigh = (UInt16)(((UInt32)(v) >> 16) & 0xFFFF); +} + +static void RestartModel(CPpmd7 *p) +{ + unsigned i, k, m; + + memset(p->FreeList, 0, sizeof(p->FreeList)); + p->Text = p->Base + p->AlignOffset; + p->HiUnit = p->Text + p->Size; + p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE; + p->GlueCount = 0; + + p->OrderFall = p->MaxOrder; + p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1; + p->PrevSuccess = 0; + + p->MinContext = p->MaxContext = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */ + p->MinContext->Suffix = 0; + p->MinContext->NumStats = 256; + p->MinContext->SummFreq = 256 + 1; + p->FoundState = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */ + p->LoUnit += U2B(256 / 2); + p->MinContext->Stats = REF(p->FoundState); + for (i = 0; i < 256; i++) + { + CPpmd_State *s = &p->FoundState[i]; + s->Symbol = (Byte)i; + s->Freq = 1; + SetSuccessor(s, 0); + } + + for (i = 0; i < 128; i++) + for (k = 0; k < 8; k++) + { + UInt16 *dest = p->BinSumm[i] + k; + UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 2)); + for (m = 0; m < 64; m += 8) + dest[m] = val; + } + + for (i = 0; i < 25; i++) + for (k = 0; k < 16; k++) + { + CPpmd_See *s = &p->See[i][k]; + s->Summ = (UInt16)((5 * i + 10) << (s->Shift = PPMD_PERIOD_BITS - 4)); + s->Count = 4; + } +} + +void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder) +{ + p->MaxOrder = maxOrder; + RestartModel(p); + p->DummySee.Shift = PPMD_PERIOD_BITS; + p->DummySee.Summ = 0; /* unused */ + p->DummySee.Count = 64; /* unused */ +} + +static CTX_PTR CreateSuccessors(CPpmd7 *p, Bool skip) +{ + CPpmd_State upState; + CTX_PTR c = p->MinContext; + CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState); + CPpmd_State *ps[PPMD7_MAX_ORDER]; + unsigned numPs = 0; + + if (!skip) + ps[numPs++] = p->FoundState; + + while (c->Suffix) + { + CPpmd_Void_Ref successor; + CPpmd_State *s; + c = SUFFIX(c); + if (c->NumStats != 1) + { + for (s = STATS(c); s->Symbol != p->FoundState->Symbol; s++); + } + else + s = ONE_STATE(c); + successor = SUCCESSOR(s); + if (successor != upBranch) + { + c = CTX(successor); + if (numPs == 0) + return c; + break; + } + ps[numPs++] = s; + } + + upState.Symbol = *(const Byte *)Ppmd7_GetPtr(p, upBranch); + SetSuccessor(&upState, upBranch + 1); + + if (c->NumStats == 1) + upState.Freq = ONE_STATE(c)->Freq; + else + { + UInt32 cf, s0; + CPpmd_State *s; + for (s = STATS(c); s->Symbol != upState.Symbol; s++); + cf = s->Freq - 1; + s0 = c->SummFreq - c->NumStats - cf; + upState.Freq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : ((2 * cf + 3 * s0 - 1) / (2 * s0)))); + } + + do + { + /* Create Child */ + CTX_PTR c1; /* = AllocContext(p); */ + if (p->HiUnit != p->LoUnit) + c1 = (CTX_PTR)(p->HiUnit -= UNIT_SIZE); + else if (p->FreeList[0] != 0) + c1 = (CTX_PTR)RemoveNode(p, 0); + else + { + c1 = (CTX_PTR)AllocUnitsRare(p, 0); + if (!c1) + return NULL; + } + c1->NumStats = 1; + *ONE_STATE(c1) = upState; + c1->Suffix = REF(c); + SetSuccessor(ps[--numPs], REF(c1)); + c = c1; + } + while (numPs != 0); + + return c; +} + +static void SwapStates(CPpmd_State *t1, CPpmd_State *t2) +{ + CPpmd_State tmp = *t1; + *t1 = *t2; + *t2 = tmp; +} + +static void UpdateModel(CPpmd7 *p) +{ + CPpmd_Void_Ref successor, fSuccessor = SUCCESSOR(p->FoundState); + CTX_PTR c; + unsigned s0, ns; + + if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0) + { + c = SUFFIX(p->MinContext); + + if (c->NumStats == 1) + { + CPpmd_State *s = ONE_STATE(c); + if (s->Freq < 32) + s->Freq++; + } + else + { + CPpmd_State *s = STATS(c); + if (s->Symbol != p->FoundState->Symbol) + { + do { s++; } while (s->Symbol != p->FoundState->Symbol); + if (s[0].Freq >= s[-1].Freq) + { + SwapStates(&s[0], &s[-1]); + s--; + } + } + if (s->Freq < MAX_FREQ - 9) + { + s->Freq += 2; + c->SummFreq += 2; + } + } + } + + if (p->OrderFall == 0) + { + p->MinContext = p->MaxContext = CreateSuccessors(p, True); + if (p->MinContext == 0) + { + RestartModel(p); + return; + } + SetSuccessor(p->FoundState, REF(p->MinContext)); + return; + } + + *p->Text++ = p->FoundState->Symbol; + successor = REF(p->Text); + if (p->Text >= p->UnitsStart) + { + RestartModel(p); + return; + } + + if (fSuccessor) + { + if (fSuccessor <= successor) + { + CTX_PTR cs = CreateSuccessors(p, False); + if (cs == NULL) + { + RestartModel(p); + return; + } + fSuccessor = REF(cs); + } + if (--p->OrderFall == 0) + { + successor = fSuccessor; + p->Text -= (p->MaxContext != p->MinContext); + } + } + else + { + SetSuccessor(p->FoundState, successor); + fSuccessor = REF(p->MinContext); + } + + s0 = p->MinContext->SummFreq - (ns = p->MinContext->NumStats) - (p->FoundState->Freq - 1); + + for (c = p->MaxContext; c != p->MinContext; c = SUFFIX(c)) + { + unsigned ns1; + UInt32 cf, sf; + if ((ns1 = c->NumStats) != 1) + { + if ((ns1 & 1) == 0) + { + /* Expand for one UNIT */ + unsigned oldNU = ns1 >> 1; + unsigned i = U2I(oldNU); + if (i != U2I(oldNU + 1)) + { + void *ptr = AllocUnits(p, i + 1); + void *oldPtr; + if (!ptr) + { + RestartModel(p); + return; + } + oldPtr = STATS(c); + MyMem12Cpy(ptr, oldPtr, oldNU); + InsertNode(p, oldPtr, i); + c->Stats = STATS_REF(ptr); + } + } + c->SummFreq = (UInt16)(c->SummFreq + (2 * ns1 < ns) + 2 * ((4 * ns1 <= ns) & (c->SummFreq <= 8 * ns1))); + } + else + { + CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0); + if (!s) + { + RestartModel(p); + return; + } + *s = *ONE_STATE(c); + c->Stats = REF(s); + if (s->Freq < MAX_FREQ / 4 - 1) + s->Freq <<= 1; + else + s->Freq = MAX_FREQ - 4; + c->SummFreq = (UInt16)(s->Freq + p->InitEsc + (ns > 3)); + } + cf = 2 * (UInt32)p->FoundState->Freq * (c->SummFreq + 6); + sf = (UInt32)s0 + c->SummFreq; + if (cf < 6 * sf) + { + cf = 1 + (cf > sf) + (cf >= 4 * sf); + c->SummFreq += 3; + } + else + { + cf = 4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf); + c->SummFreq = (UInt16)(c->SummFreq + cf); + } + { + CPpmd_State *s = STATS(c) + ns1; + SetSuccessor(s, successor); + s->Symbol = p->FoundState->Symbol; + s->Freq = (Byte)cf; + c->NumStats = (UInt16)(ns1 + 1); + } + } + p->MaxContext = p->MinContext = CTX(fSuccessor); +} + +static void Rescale(CPpmd7 *p) +{ + unsigned i, adder, sumFreq, escFreq; + CPpmd_State *stats = STATS(p->MinContext); + CPpmd_State *s = p->FoundState; + { + CPpmd_State tmp = *s; + for (; s != stats; s--) + s[0] = s[-1]; + *s = tmp; + } + escFreq = p->MinContext->SummFreq - s->Freq; + s->Freq += 4; + adder = (p->OrderFall != 0); + s->Freq = (Byte)((s->Freq + adder) >> 1); + sumFreq = s->Freq; + + i = p->MinContext->NumStats - 1; + do + { + escFreq -= (++s)->Freq; + s->Freq = (Byte)((s->Freq + adder) >> 1); + sumFreq += s->Freq; + if (s[0].Freq > s[-1].Freq) + { + CPpmd_State *s1 = s; + CPpmd_State tmp = *s1; + do + s1[0] = s1[-1]; + while (--s1 != stats && tmp.Freq > s1[-1].Freq); + *s1 = tmp; + } + } + while (--i); + + if (s->Freq == 0) + { + unsigned numStats = p->MinContext->NumStats; + unsigned n0, n1; + do { i++; } while ((--s)->Freq == 0); + escFreq += i; + p->MinContext->NumStats = (UInt16)(p->MinContext->NumStats - i); + if (p->MinContext->NumStats == 1) + { + CPpmd_State tmp = *stats; + do + { + tmp.Freq = (Byte)(tmp.Freq - (tmp.Freq >> 1)); + escFreq >>= 1; + } + while (escFreq > 1); + InsertNode(p, stats, U2I(((numStats + 1) >> 1))); + *(p->FoundState = ONE_STATE(p->MinContext)) = tmp; + return; + } + n0 = (numStats + 1) >> 1; + n1 = (p->MinContext->NumStats + 1) >> 1; + if (n0 != n1) + p->MinContext->Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1)); + } + p->MinContext->SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1)); + p->FoundState = STATS(p->MinContext); +} + +CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq) +{ + CPpmd_See *see; + unsigned nonMasked = p->MinContext->NumStats - numMasked; + if (p->MinContext->NumStats != 256) + { + see = p->See[(unsigned)p->NS2Indx[nonMasked - 1]] + + (nonMasked < (unsigned)SUFFIX(p->MinContext)->NumStats - p->MinContext->NumStats) + + 2 * (unsigned)(p->MinContext->SummFreq < 11 * p->MinContext->NumStats) + + 4 * (unsigned)(numMasked > nonMasked) + + p->HiBitsFlag; + { + unsigned r = (see->Summ >> see->Shift); + see->Summ = (UInt16)(see->Summ - r); + *escFreq = r + (r == 0); + } + } + else + { + see = &p->DummySee; + *escFreq = 1; + } + return see; +} + +static void NextContext(CPpmd7 *p) +{ + CTX_PTR c = CTX(SUCCESSOR(p->FoundState)); + if (p->OrderFall == 0 && (Byte *)c > p->Text) + p->MinContext = p->MaxContext = c; + else + UpdateModel(p); +} + +void Ppmd7_Update1(CPpmd7 *p) +{ + CPpmd_State *s = p->FoundState; + s->Freq += 4; + p->MinContext->SummFreq += 4; + if (s[0].Freq > s[-1].Freq) + { + SwapStates(&s[0], &s[-1]); + p->FoundState = --s; + if (s->Freq > MAX_FREQ) + Rescale(p); + } + NextContext(p); +} + +void Ppmd7_Update1_0(CPpmd7 *p) +{ + p->PrevSuccess = (2 * p->FoundState->Freq > p->MinContext->SummFreq); + p->RunLength += p->PrevSuccess; + p->MinContext->SummFreq += 4; + if ((p->FoundState->Freq += 4) > MAX_FREQ) + Rescale(p); + NextContext(p); +} + +void Ppmd7_UpdateBin(CPpmd7 *p) +{ + p->FoundState->Freq = (Byte)(p->FoundState->Freq + (p->FoundState->Freq < 128 ? 1: 0)); + p->PrevSuccess = 1; + p->RunLength++; + NextContext(p); +} + +void Ppmd7_Update2(CPpmd7 *p) +{ + p->MinContext->SummFreq += 4; + if ((p->FoundState->Freq += 4) > MAX_FREQ) + Rescale(p); + p->RunLength = p->InitRL; + UpdateModel(p); +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Ppmd7.h b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7.h new file mode 100644 index 0000000000..1c7870c456 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7.h @@ -0,0 +1,140 @@ +/* Ppmd7.h -- PPMdH compression codec +2016-05-21 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +/* This code supports virtual RangeDecoder and includes the implementation +of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H. +If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */ + +#ifndef __PPMD7_H +#define __PPMD7_H + +#include "Ppmd.h" + +EXTERN_C_BEGIN + +#define PPMD7_MIN_ORDER 2 +#define PPMD7_MAX_ORDER 64 + +#define PPMD7_MIN_MEM_SIZE (1 << 11) +#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3) + +struct CPpmd7_Context_; + +typedef + #ifdef PPMD_32BIT + struct CPpmd7_Context_ * + #else + UInt32 + #endif + CPpmd7_Context_Ref; + +typedef struct CPpmd7_Context_ +{ + UInt16 NumStats; + UInt16 SummFreq; + CPpmd_State_Ref Stats; + CPpmd7_Context_Ref Suffix; +} CPpmd7_Context; + +#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq) + +typedef struct +{ + CPpmd7_Context *MinContext, *MaxContext; + CPpmd_State *FoundState; + unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag; + Int32 RunLength, InitRL; /* must be 32-bit at least */ + + UInt32 Size; + UInt32 GlueCount; + Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; + UInt32 AlignOffset; + + Byte Indx2Units[PPMD_NUM_INDEXES]; + Byte Units2Indx[128]; + CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; + Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256]; + CPpmd_See DummySee, See[25][16]; + UInt16 BinSumm[128][64]; +} CPpmd7; + +void Ppmd7_Construct(CPpmd7 *p); +Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc); +void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc); +void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); +#define Ppmd7_WasAllocated(p) ((p)->Base != NULL) + + +/* ---------- Internal Functions ---------- */ + +extern const Byte PPMD7_kExpEscape[16]; + +#ifdef PPMD_32BIT + #define Ppmd7_GetPtr(p, ptr) (ptr) + #define Ppmd7_GetContext(p, ptr) (ptr) + #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats) +#else + #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs))) + #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs))) + #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats))) +#endif + +void Ppmd7_Update1(CPpmd7 *p); +void Ppmd7_Update1_0(CPpmd7 *p); +void Ppmd7_Update2(CPpmd7 *p); +void Ppmd7_UpdateBin(CPpmd7 *p); + +#define Ppmd7_GetBinSumm(p) \ + &p->BinSumm[(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \ + p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \ + (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \ + 2 * p->HB2Flag[(unsigned)Ppmd7Context_OneState(p->MinContext)->Symbol] + \ + ((p->RunLength >> 26) & 0x20)] + +CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale); + + +/* ---------- Decode ---------- */ + +typedef struct +{ + UInt32 (*GetThreshold)(void *p, UInt32 total); + void (*Decode)(void *p, UInt32 start, UInt32 size); + UInt32 (*DecodeBit)(void *p, UInt32 size0); +} IPpmd7_RangeDec; + +typedef struct +{ + IPpmd7_RangeDec p; + UInt32 Range; + UInt32 Code; + IByteIn *Stream; +} CPpmd7z_RangeDec; + +void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p); +Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p); +#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) + +int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc); + + +/* ---------- Encode ---------- */ + +typedef struct +{ + UInt64 Low; + UInt32 Range; + Byte Cache; + UInt64 CacheSize; + IByteOut *Stream; +} CPpmd7z_RangeEnc; + +void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p); +void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p); + +void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Ppmd7Dec.c b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7Dec.c new file mode 100644 index 0000000000..3d01d76440 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7Dec.c @@ -0,0 +1,189 @@ +/* Ppmd7Dec.c -- PPMdH Decoder +2010-03-12 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#include "Precomp.h" + +#include "Ppmd7.h" + +#define kTopValue (1 << 24) + +Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p) +{ + unsigned i; + p->Code = 0; + p->Range = 0xFFFFFFFF; + if (p->Stream->Read((void *)p->Stream) != 0) + return False; + for (i = 0; i < 4; i++) + p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + return (p->Code < 0xFFFFFFFF); +} + +static UInt32 Range_GetThreshold(void *pp, UInt32 total) +{ + CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + return (p->Code) / (p->Range /= total); +} + +static void Range_Normalize(CPpmd7z_RangeDec *p) +{ + if (p->Range < kTopValue) + { + p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Range <<= 8; + if (p->Range < kTopValue) + { + p->Code = (p->Code << 8) | p->Stream->Read((void *)p->Stream); + p->Range <<= 8; + } + } +} + +static void Range_Decode(void *pp, UInt32 start, UInt32 size) +{ + CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + p->Code -= start * p->Range; + p->Range *= size; + Range_Normalize(p); +} + +static UInt32 Range_DecodeBit(void *pp, UInt32 size0) +{ + CPpmd7z_RangeDec *p = (CPpmd7z_RangeDec *)pp; + UInt32 newBound = (p->Range >> 14) * size0; + UInt32 symbol; + if (p->Code < newBound) + { + symbol = 0; + p->Range = newBound; + } + else + { + symbol = 1; + p->Code -= newBound; + p->Range -= newBound; + } + Range_Normalize(p); + return symbol; +} + +void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p) +{ + p->p.GetThreshold = Range_GetThreshold; + p->p.Decode = Range_Decode; + p->p.DecodeBit = Range_DecodeBit; +} + + +#define MASK(sym) ((signed char *)charMask)[sym] + +int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc) +{ + size_t charMask[256 / sizeof(size_t)]; + if (p->MinContext->NumStats != 1) + { + CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); + unsigned i; + UInt32 count, hiCnt; + if ((count = rc->GetThreshold(rc, p->MinContext->SummFreq)) < (hiCnt = s->Freq)) + { + Byte symbol; + rc->Decode(rc, 0, s->Freq); + p->FoundState = s; + symbol = s->Symbol; + Ppmd7_Update1_0(p); + return symbol; + } + p->PrevSuccess = 0; + i = p->MinContext->NumStats - 1; + do + { + if ((hiCnt += (++s)->Freq) > count) + { + Byte symbol; + rc->Decode(rc, hiCnt - s->Freq, s->Freq); + p->FoundState = s; + symbol = s->Symbol; + Ppmd7_Update1(p); + return symbol; + } + } + while (--i); + if (count >= p->MinContext->SummFreq) + return -2; + p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]; + rc->Decode(rc, hiCnt, p->MinContext->SummFreq - hiCnt); + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(s->Symbol) = 0; + i = p->MinContext->NumStats - 1; + do { MASK((--s)->Symbol) = 0; } while (--i); + } + else + { + UInt16 *prob = Ppmd7_GetBinSumm(p); + if (rc->DecodeBit(rc, *prob) == 0) + { + Byte symbol; + *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob); + symbol = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol; + Ppmd7_UpdateBin(p); + return symbol; + } + *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob); + p->InitEsc = PPMD7_kExpEscape[*prob >> 10]; + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0; + p->PrevSuccess = 0; + } + for (;;) + { + CPpmd_State *ps[256], *s; + UInt32 freqSum, count, hiCnt; + CPpmd_See *see; + unsigned i, num, numMasked = p->MinContext->NumStats; + do + { + p->OrderFall++; + if (!p->MinContext->Suffix) + return -1; + p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix); + } + while (p->MinContext->NumStats == numMasked); + hiCnt = 0; + s = Ppmd7_GetStats(p, p->MinContext); + i = 0; + num = p->MinContext->NumStats - numMasked; + do + { + int k = (int)(MASK(s->Symbol)); + hiCnt += (s->Freq & k); + ps[i] = s++; + i -= k; + } + while (i != num); + + see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum); + freqSum += hiCnt; + count = rc->GetThreshold(rc, freqSum); + + if (count < hiCnt) + { + Byte symbol; + CPpmd_State **pps = ps; + for (hiCnt = 0; (hiCnt += (*pps)->Freq) <= count; pps++); + s = *pps; + rc->Decode(rc, hiCnt - s->Freq, s->Freq); + Ppmd_See_Update(see); + p->FoundState = s; + symbol = s->Symbol; + Ppmd7_Update2(p); + return symbol; + } + if (count >= freqSum) + return -2; + rc->Decode(rc, hiCnt, freqSum - hiCnt); + see->Summ = (UInt16)(see->Summ + freqSum); + do { MASK(ps[--i]->Symbol) = 0; } while (i != 0); + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Ppmd7Enc.c b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7Enc.c new file mode 100644 index 0000000000..9b49e5d442 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Ppmd7Enc.c @@ -0,0 +1,187 @@ +/* Ppmd7Enc.c -- PPMdH Encoder +2015-09-28 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#include "Precomp.h" + +#include "Ppmd7.h" + +#define kTopValue (1 << 24) + +void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p) +{ + p->Low = 0; + p->Range = 0xFFFFFFFF; + p->Cache = 0; + p->CacheSize = 1; +} + +static void RangeEnc_ShiftLow(CPpmd7z_RangeEnc *p) +{ + if ((UInt32)p->Low < (UInt32)0xFF000000 || (unsigned)(p->Low >> 32) != 0) + { + Byte temp = p->Cache; + do + { + p->Stream->Write(p->Stream, (Byte)(temp + (Byte)(p->Low >> 32))); + temp = 0xFF; + } + while (--p->CacheSize != 0); + p->Cache = (Byte)((UInt32)p->Low >> 24); + } + p->CacheSize++; + p->Low = (UInt32)p->Low << 8; +} + +static void RangeEnc_Encode(CPpmd7z_RangeEnc *p, UInt32 start, UInt32 size, UInt32 total) +{ + p->Low += start * (p->Range /= total); + p->Range *= size; + while (p->Range < kTopValue) + { + p->Range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +static void RangeEnc_EncodeBit_0(CPpmd7z_RangeEnc *p, UInt32 size0) +{ + p->Range = (p->Range >> 14) * size0; + while (p->Range < kTopValue) + { + p->Range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +static void RangeEnc_EncodeBit_1(CPpmd7z_RangeEnc *p, UInt32 size0) +{ + UInt32 newBound = (p->Range >> 14) * size0; + p->Low += newBound; + p->Range -= newBound; + while (p->Range < kTopValue) + { + p->Range <<= 8; + RangeEnc_ShiftLow(p); + } +} + +void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p) +{ + unsigned i; + for (i = 0; i < 5; i++) + RangeEnc_ShiftLow(p); +} + + +#define MASK(sym) ((signed char *)charMask)[sym] + +void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol) +{ + size_t charMask[256 / sizeof(size_t)]; + if (p->MinContext->NumStats != 1) + { + CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); + UInt32 sum; + unsigned i; + if (s->Symbol == symbol) + { + RangeEnc_Encode(rc, 0, s->Freq, p->MinContext->SummFreq); + p->FoundState = s; + Ppmd7_Update1_0(p); + return; + } + p->PrevSuccess = 0; + sum = s->Freq; + i = p->MinContext->NumStats - 1; + do + { + if ((++s)->Symbol == symbol) + { + RangeEnc_Encode(rc, sum, s->Freq, p->MinContext->SummFreq); + p->FoundState = s; + Ppmd7_Update1(p); + return; + } + sum += s->Freq; + } + while (--i); + + p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]; + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(s->Symbol) = 0; + i = p->MinContext->NumStats - 1; + do { MASK((--s)->Symbol) = 0; } while (--i); + RangeEnc_Encode(rc, sum, p->MinContext->SummFreq - sum, p->MinContext->SummFreq); + } + else + { + UInt16 *prob = Ppmd7_GetBinSumm(p); + CPpmd_State *s = Ppmd7Context_OneState(p->MinContext); + if (s->Symbol == symbol) + { + RangeEnc_EncodeBit_0(rc, *prob); + *prob = (UInt16)PPMD_UPDATE_PROB_0(*prob); + p->FoundState = s; + Ppmd7_UpdateBin(p); + return; + } + else + { + RangeEnc_EncodeBit_1(rc, *prob); + *prob = (UInt16)PPMD_UPDATE_PROB_1(*prob); + p->InitEsc = PPMD7_kExpEscape[*prob >> 10]; + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(s->Symbol) = 0; + p->PrevSuccess = 0; + } + } + for (;;) + { + UInt32 escFreq; + CPpmd_See *see; + CPpmd_State *s; + UInt32 sum; + unsigned i, numMasked = p->MinContext->NumStats; + do + { + p->OrderFall++; + if (!p->MinContext->Suffix) + return; /* EndMarker (symbol = -1) */ + p->MinContext = Ppmd7_GetContext(p, p->MinContext->Suffix); + } + while (p->MinContext->NumStats == numMasked); + + see = Ppmd7_MakeEscFreq(p, numMasked, &escFreq); + s = Ppmd7_GetStats(p, p->MinContext); + sum = 0; + i = p->MinContext->NumStats; + do + { + int cur = s->Symbol; + if (cur == symbol) + { + UInt32 low = sum; + CPpmd_State *s1 = s; + do + { + sum += (s->Freq & (int)(MASK(s->Symbol))); + s++; + } + while (--i); + RangeEnc_Encode(rc, low, s1->Freq, sum + escFreq); + Ppmd_See_Update(see); + p->FoundState = s1; + Ppmd7_Update2(p); + return; + } + sum += (s->Freq & (int)(MASK(cur))); + MASK(cur) = 0; + s++; + } + while (--i); + + RangeEnc_Encode(rc, sum, escFreq, sum + escFreq); + see->Summ = (UInt16)(see->Summ + sum + escFreq); + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Precomp.h b/Provenance/LzmaSDKObjC/lzma/C/Precomp.h new file mode 100644 index 0000000000..edb5814439 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Precomp.h @@ -0,0 +1,10 @@ +/* Precomp.h -- StdAfx +2013-11-12 : Igor Pavlov : Public domain */ + +#ifndef __7Z_PRECOMP_H +#define __7Z_PRECOMP_H + +#include "Compiler.h" +/* #include "7zTypes.h" */ + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/RotateDefs.h b/Provenance/LzmaSDKObjC/lzma/C/RotateDefs.h new file mode 100644 index 0000000000..6c790e791e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/RotateDefs.h @@ -0,0 +1,30 @@ +/* RotateDefs.h -- Rotate functions +2015-03-25 : Igor Pavlov : Public domain */ + +#ifndef __ROTATE_DEFS_H +#define __ROTATE_DEFS_H + +#ifdef _MSC_VER + +#include + +/* don't use _rotl with MINGW. It can insert slow call to function. */ + +/* #if (_MSC_VER >= 1200) */ +#pragma intrinsic(_rotl) +#pragma intrinsic(_rotr) +/* #endif */ + +#define rotlFixed(x, n) _rotl((x), (n)) +#define rotrFixed(x, n) _rotr((x), (n)) + +#else + +/* new compilers can translate these macros to fast commands. */ + +#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) +#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) + +#endif + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Sha256.c b/Provenance/LzmaSDKObjC/lzma/C/Sha256.c new file mode 100644 index 0000000000..47e2f42b99 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Sha256.c @@ -0,0 +1,248 @@ +/* Crypto/Sha256.c -- SHA-256 Hash +2015-11-14 : Igor Pavlov : Public domain +This code is based on public domain code from Wei Dai's Crypto++ library. */ + +#include "Precomp.h" + +#include + +#include "CpuArch.h" +#include "RotateDefs.h" +#include "Sha256.h" + +/* define it for speed optimization */ +#ifndef _SFX +#define _SHA256_UNROLL +#define _SHA256_UNROLL2 +#endif + +/* #define _SHA256_UNROLL2 */ + +void Sha256_Init(CSha256 *p) +{ + p->state[0] = 0x6a09e667; + p->state[1] = 0xbb67ae85; + p->state[2] = 0x3c6ef372; + p->state[3] = 0xa54ff53a; + p->state[4] = 0x510e527f; + p->state[5] = 0x9b05688c; + p->state[6] = 0x1f83d9ab; + p->state[7] = 0x5be0cd19; + p->count = 0; +} + +#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22)) +#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25)) +#define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3)) +#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10)) + +#define blk0(i) (W[i]) +#define blk2(i) (W[i] += s1(W[((i)-2)&15]) + W[((i)-7)&15] + s0(W[((i)-15)&15])) + +#define Ch(x,y,z) (z^(x&(y^z))) +#define Maj(x,y,z) ((x&y)|(z&(x|y))) + +#ifdef _SHA256_UNROLL2 + +#define R(a,b,c,d,e,f,g,h, i) \ + h += S1(e) + Ch(e,f,g) + K[(i)+(j)] + (j ? blk2(i) : blk0(i)); \ + d += h; \ + h += S0(a) + Maj(a, b, c) + +#define RX_8(i) \ + R(a,b,c,d,e,f,g,h, i); \ + R(h,a,b,c,d,e,f,g, i+1); \ + R(g,h,a,b,c,d,e,f, i+2); \ + R(f,g,h,a,b,c,d,e, i+3); \ + R(e,f,g,h,a,b,c,d, i+4); \ + R(d,e,f,g,h,a,b,c, i+5); \ + R(c,d,e,f,g,h,a,b, i+6); \ + R(b,c,d,e,f,g,h,a, i+7) + +#define RX_16 RX_8(0); RX_8(8); + +#else + +#define a(i) T[(0-(i))&7] +#define b(i) T[(1-(i))&7] +#define c(i) T[(2-(i))&7] +#define d(i) T[(3-(i))&7] +#define e(i) T[(4-(i))&7] +#define f(i) T[(5-(i))&7] +#define g(i) T[(6-(i))&7] +#define h(i) T[(7-(i))&7] + +#define R(i) \ + h(i) += S1(e(i)) + Ch(e(i),f(i),g(i)) + K[(i)+(j)] + (j ? blk2(i) : blk0(i)); \ + d(i) += h(i); \ + h(i) += S0(a(i)) + Maj(a(i), b(i), c(i)) \ + +#ifdef _SHA256_UNROLL + +#define RX_8(i) R(i+0); R(i+1); R(i+2); R(i+3); R(i+4); R(i+5); R(i+6); R(i+7); +#define RX_16 RX_8(0); RX_8(8); + +#else + +#define RX_16 unsigned i; for (i = 0; i < 16; i++) { R(i); } + +#endif + +#endif + +static const UInt32 K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +static void Sha256_WriteByteBlock(CSha256 *p) +{ + UInt32 W[16]; + unsigned j; + UInt32 *state; + + #ifdef _SHA256_UNROLL2 + UInt32 a,b,c,d,e,f,g,h; + #else + UInt32 T[8]; + #endif + + for (j = 0; j < 16; j += 4) + { + const Byte *ccc = p->buffer + j * 4; + W[j ] = GetBe32(ccc); + W[j + 1] = GetBe32(ccc + 4); + W[j + 2] = GetBe32(ccc + 8); + W[j + 3] = GetBe32(ccc + 12); + } + + state = p->state; + + #ifdef _SHA256_UNROLL2 + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + #else + for (j = 0; j < 8; j++) + T[j] = state[j]; + #endif + + for (j = 0; j < 64; j += 16) + { + RX_16 + } + + #ifdef _SHA256_UNROLL2 + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + #else + for (j = 0; j < 8; j++) + state[j] += T[j]; + #endif + + /* Wipe variables */ + /* memset(W, 0, sizeof(W)); */ + /* memset(T, 0, sizeof(T)); */ +} + +#undef S0 +#undef S1 +#undef s0 +#undef s1 + +void Sha256_Update(CSha256 *p, const Byte *data, size_t size) +{ + if (size == 0) + return; + + { + unsigned pos = (unsigned)p->count & 0x3F; + unsigned num; + + p->count += size; + + num = 64 - pos; + if (num > size) + { + memcpy(p->buffer + pos, data, size); + return; + } + + size -= num; + memcpy(p->buffer + pos, data, num); + data += num; + } + + for (;;) + { + Sha256_WriteByteBlock(p); + if (size < 64) + break; + size -= 64; + memcpy(p->buffer, data, 64); + data += 64; + } + + if (size != 0) + memcpy(p->buffer, data, size); +} + +void Sha256_Final(CSha256 *p, Byte *digest) +{ + unsigned pos = (unsigned)p->count & 0x3F; + unsigned i; + + p->buffer[pos++] = 0x80; + + while (pos != (64 - 8)) + { + pos &= 0x3F; + if (pos == 0) + Sha256_WriteByteBlock(p); + p->buffer[pos++] = 0; + } + + { + UInt64 numBits = (p->count << 3); + SetBe32(p->buffer + 64 - 8, (UInt32)(numBits >> 32)); + SetBe32(p->buffer + 64 - 4, (UInt32)(numBits)); + } + + Sha256_WriteByteBlock(p); + + for (i = 0; i < 8; i += 2) + { + UInt32 v0 = p->state[i]; + UInt32 v1 = p->state[i + 1]; + SetBe32(digest , v0); + SetBe32(digest + 4, v1); + digest += 8; + } + + Sha256_Init(p); +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Sha256.h b/Provenance/LzmaSDKObjC/lzma/C/Sha256.h new file mode 100644 index 0000000000..7f17ccf9c9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Sha256.h @@ -0,0 +1,26 @@ +/* Sha256.h -- SHA-256 Hash +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __CRYPTO_SHA256_H +#define __CRYPTO_SHA256_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define SHA256_DIGEST_SIZE 32 + +typedef struct +{ + UInt32 state[8]; + UInt64 count; + Byte buffer[64]; +} CSha256; + +void Sha256_Init(CSha256 *p); +void Sha256_Update(CSha256 *p, const Byte *data, size_t size); +void Sha256_Final(CSha256 *p, Byte *digest); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Sort.c b/Provenance/LzmaSDKObjC/lzma/C/Sort.c new file mode 100644 index 0000000000..73dcbf0596 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Sort.c @@ -0,0 +1,141 @@ +/* Sort.c -- Sort functions +2014-04-05 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Sort.h" + +#define HeapSortDown(p, k, size, temp) \ + { for (;;) { \ + size_t s = (k << 1); \ + if (s > size) break; \ + if (s < size && p[s + 1] > p[s]) s++; \ + if (temp >= p[s]) break; \ + p[k] = p[s]; k = s; \ + } p[k] = temp; } + +void HeapSort(UInt32 *p, size_t size) +{ + if (size <= 1) + return; + p--; + { + size_t i = size / 2; + do + { + UInt32 temp = p[i]; + size_t k = i; + HeapSortDown(p, k, size, temp) + } + while (--i != 0); + } + /* + do + { + size_t k = 1; + UInt32 temp = p[size]; + p[size--] = p[1]; + HeapSortDown(p, k, size, temp) + } + while (size > 1); + */ + while (size > 3) + { + UInt32 temp = p[size]; + size_t k = (p[3] > p[2]) ? 3 : 2; + p[size--] = p[1]; + p[1] = p[k]; + HeapSortDown(p, k, size, temp) + } + { + UInt32 temp = p[size]; + p[size] = p[1]; + if (size > 2 && p[2] < temp) + { + p[1] = p[2]; + p[2] = temp; + } + else + p[1] = temp; + } +} + +void HeapSort64(UInt64 *p, size_t size) +{ + if (size <= 1) + return; + p--; + { + size_t i = size / 2; + do + { + UInt64 temp = p[i]; + size_t k = i; + HeapSortDown(p, k, size, temp) + } + while (--i != 0); + } + /* + do + { + size_t k = 1; + UInt64 temp = p[size]; + p[size--] = p[1]; + HeapSortDown(p, k, size, temp) + } + while (size > 1); + */ + while (size > 3) + { + UInt64 temp = p[size]; + size_t k = (p[3] > p[2]) ? 3 : 2; + p[size--] = p[1]; + p[1] = p[k]; + HeapSortDown(p, k, size, temp) + } + { + UInt64 temp = p[size]; + p[size] = p[1]; + if (size > 2 && p[2] < temp) + { + p[1] = p[2]; + p[2] = temp; + } + else + p[1] = temp; + } +} + +/* +#define HeapSortRefDown(p, vals, n, size, temp) \ + { size_t k = n; UInt32 val = vals[temp]; for (;;) { \ + size_t s = (k << 1); \ + if (s > size) break; \ + if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \ + if (val >= vals[p[s]]) break; \ + p[k] = p[s]; k = s; \ + } p[k] = temp; } + +void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size) +{ + if (size <= 1) + return; + p--; + { + size_t i = size / 2; + do + { + UInt32 temp = p[i]; + HeapSortRefDown(p, vals, i, size, temp); + } + while (--i != 0); + } + do + { + UInt32 temp = p[size]; + p[size--] = p[1]; + HeapSortRefDown(p, vals, 1, size, temp); + } + while (size > 1); +} +*/ diff --git a/Provenance/LzmaSDKObjC/lzma/C/Sort.h b/Provenance/LzmaSDKObjC/lzma/C/Sort.h new file mode 100644 index 0000000000..7209d7824d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Sort.h @@ -0,0 +1,18 @@ +/* Sort.h -- Sort functions +2014-04-05 : Igor Pavlov : Public domain */ + +#ifndef __7Z_SORT_H +#define __7Z_SORT_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +void HeapSort(UInt32 *p, size_t size); +void HeapSort64(UInt64 *p, size_t size); + +/* void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size); */ + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/Threads.c b/Provenance/LzmaSDKObjC/lzma/C/Threads.c new file mode 100644 index 0000000000..e8d51adf9b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Threads.c @@ -0,0 +1,582 @@ +/* Threads.c */ + +#include "Threads.h" + +#ifdef ENV_BEOS +#include +#else +#include +#include +#endif + +#include + +#if defined(__linux__) +#define PTHREAD_MUTEX_ERRORCHECK PTHREAD_MUTEX_ERRORCHECK_NP +#endif + +#ifdef ENV_BEOS + +/* TODO : optimize the code and verify the returned values */ + +WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) +{ + thread->_tid = spawn_thread((int32 (*)(void *))startAddress, "CThread", B_LOW_PRIORITY, parameter); + if (thread->_tid >= B_OK) { + resume_thread(thread->_tid); + } else { + thread->_tid = B_BAD_THREAD_ID; + } + thread->_created = 1; + return 0; // SZ_OK; +} + +WRes Thread_Wait(CThread *thread) +{ + int ret; + + if (thread->_created == 0) + return EINVAL; + + if (thread->_tid >= B_OK) + { + status_t exit_value; + wait_for_thread(thread->_tid, &exit_value); + thread->_tid = B_BAD_THREAD_ID; + } else { + return EINVAL; + } + + thread->_created = 0; + + return 0; +} + +WRes Thread_Close(CThread *thread) +{ + if (!thread->_created) return SZ_OK; + + thread->_tid = B_BAD_THREAD_ID; + thread->_created = 0; + return SZ_OK; +} + + +WRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled) +{ + p->_index_waiting = 0; + p->_manual_reset = manualReset; + p->_state = (initialSignaled ? TRUE : FALSE); + p->_created = 1; + p->_sem = create_sem(1,"event"); + return 0; +} + +WRes Event_Set(CEvent *p) { + int index; + acquire_sem(p->_sem); + p->_state = TRUE; + for(index = 0 ; index < p->_index_waiting ; index++) + { + send_data(p->_waiting[index], '7zCN', NULL, 0); + } + p->_index_waiting = 0; + release_sem(p->_sem); + return 0; +} + +WRes Event_Reset(CEvent *p) { + acquire_sem(p->_sem); + p->_state = FALSE; + release_sem(p->_sem); + return 0; +} + +WRes Event_Wait(CEvent *p) { + acquire_sem(p->_sem); + while (p->_state == FALSE) + { + thread_id sender; + p->_waiting[p->_index_waiting++] = find_thread(NULL); + release_sem(p->_sem); + /* int msg = */ receive_data(&sender, NULL, 0); + acquire_sem(p->_sem); + } + if (p->_manual_reset == FALSE) + { + p->_state = FALSE; + } + release_sem(p->_sem); + return 0; +} + +WRes Event_Close(CEvent *p) { + if (p->_created) + { + p->_created = 0; + delete_sem(p->_sem); + } + return 0; +} + +WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount) +{ + p->_index_waiting = 0; + p->_count = initiallyCount; + p->_maxCount = maxCount; + p->_created = 1; + p->_sem = create_sem(1,"sem"); + return 0; +} + +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) +{ + UInt32 newCount; + int index; + + if (releaseCount < 1) return EINVAL; + + acquire_sem(p->_sem); + newCount = p->_count + releaseCount; + if (newCount > p->_maxCount) + { + release_sem(p->_sem); + return EINVAL; + } + p->_count = newCount; + for(index = 0 ; index < p->_index_waiting ; index++) + { + send_data(p->_waiting[index], '7zCN', NULL, 0); + } + p->_index_waiting = 0; + release_sem(p->_sem); + return 0; +} + +WRes Semaphore_Wait(CSemaphore *p) { + acquire_sem(p->_sem); + while (p->_count < 1) + { + thread_id sender; + p->_waiting[p->_index_waiting++] = find_thread(NULL); + release_sem(p->_sem); + /* int msg = */ receive_data(&sender, NULL, 0); + acquire_sem(p->_sem); + } + p->_count--; + release_sem(p->_sem); + return 0; +} + +WRes Semaphore_Close(CSemaphore *p) { + if (p->_created) + { + p->_created = 0; + delete_sem(p->_sem); + } + return 0; +} + +WRes CriticalSection_Init(CCriticalSection * lpCriticalSection) +{ + lpCriticalSection->_sem = create_sem(1,"cc"); + return 0; +} + +#else /* !ENV_BEOS */ + +WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) +{ + pthread_attr_t attr; + int ret; + + thread->_created = 0; + + ret = pthread_attr_init(&attr); + if (ret) return ret; + + ret = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); + if (ret) return ret; + + ret = pthread_create(&thread->_tid, &attr, (void * (*)(void *))startAddress, parameter); + + /* ret2 = */ pthread_attr_destroy(&attr); + + if (ret) return ret; + + thread->_created = 1; + + return 0; // SZ_OK; +} + +WRes Thread_Wait(CThread *thread) +{ + void *thread_return; + int ret; + + if (thread->_created == 0) + return EINVAL; + + ret = pthread_join(thread->_tid,&thread_return); + thread->_created = 0; + + return ret; +} + +WRes Thread_Close(CThread *thread) +{ + if (!thread->_created) return SZ_OK; + + pthread_detach(thread->_tid); + thread->_tid = 0; + thread->_created = 0; + return SZ_OK; +} + +#ifdef DEBUG_SYNCHRO + +#include + +static void dump_error(int ligne,int ret,const char *text,void *param) +{ + printf("\n##T%d#ERROR2 (l=%d) %s : param=%p ret = %d (%s)##\n",(int)pthread_self(),ligne,text,param,ret,strerror(ret)); + // abort(); +} + +WRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled) +{ + int ret; + pthread_mutexattr_t mutexattr; + memset(&mutexattr,0,sizeof(mutexattr)); + ret = pthread_mutexattr_init(&mutexattr); + if (ret != 0) dump_error(__LINE__,ret,"Event_Create::pthread_mutexattr_init",&mutexattr); + ret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK); + if (ret != 0) dump_error(__LINE__,ret,"Event_Create::pthread_mutexattr_settype",&mutexattr); + ret = pthread_mutex_init(&p->_mutex,&mutexattr); + if (ret != 0) dump_error(__LINE__,ret,"Event_Create::pthread_mutexattr_init",&p->_mutex); + if (ret == 0) + { + ret = pthread_cond_init(&p->_cond,0); + if (ret != 0) dump_error(__LINE__,ret,"Event_Create::pthread_cond_init",&p->_cond); + p->_manual_reset = manualReset; + p->_state = (initialSignaled ? TRUE : FALSE); + p->_created = 1; + } + return ret; +} + +WRes Event_Set(CEvent *p) { + int ret = pthread_mutex_lock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"ES::pthread_mutex_lock",&p->_mutex); + if (ret == 0) + { + p->_state = TRUE; + ret = pthread_cond_broadcast(&p->_cond); + if (ret != 0) dump_error(__LINE__,ret,"ES::pthread_cond_broadcast",&p->_cond); + if (ret == 0) + { + ret = pthread_mutex_unlock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"ES::pthread_mutex_unlock",&p->_mutex); + } + } + return ret; +} + +WRes Event_Reset(CEvent *p) { + int ret = pthread_mutex_lock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"ER::pthread_mutex_lock",&p->_mutex); + if (ret == 0) + { + p->_state = FALSE; + ret = pthread_mutex_unlock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"ER::pthread_mutex_unlock",&p->_mutex); + } + return ret; +} + +WRes Event_Wait(CEvent *p) { + int ret = pthread_mutex_lock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"EW::pthread_mutex_lock",&p->_mutex); + if (ret == 0) + { + while ((p->_state == FALSE) && (ret == 0)) + { + ret = pthread_cond_wait(&p->_cond, &p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"EW::pthread_cond_wait",&p->_mutex); + } + if (ret == 0) + { + if (p->_manual_reset == FALSE) + { + p->_state = FALSE; + } + ret = pthread_mutex_unlock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"EW::pthread_mutex_unlock",&p->_mutex); + } + } + return ret; +} + +WRes Event_Close(CEvent *p) { + if (p->_created) + { + int ret; + p->_created = 0; + ret = pthread_mutex_destroy(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"EC::pthread_mutex_destroy",&p->_mutex); + ret = pthread_cond_destroy(&p->_cond); + if (ret != 0) dump_error(__LINE__,ret,"EC::pthread_cond_destroy",&p->_cond); + } + return 0; +} + +WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount) +{ + int ret; + pthread_mutexattr_t mutexattr; + memset(&mutexattr,0,sizeof(mutexattr)); + ret = pthread_mutexattr_init(&mutexattr); + if (ret != 0) dump_error(__LINE__,ret,"SemC::pthread_mutexattr_init",&mutexattr); + ret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK); + if (ret != 0) dump_error(__LINE__,ret,"SemC::pthread_mutexattr_settype",&mutexattr); + ret = pthread_mutex_init(&p->_mutex,&mutexattr); + if (ret != 0) dump_error(__LINE__,ret,"SemC::pthread_mutexattr_init",&p->_mutex); + if (ret == 0) + { + ret = pthread_cond_init(&p->_cond,0); + if (ret != 0) dump_error(__LINE__,ret,"SemC::pthread_cond_init",&p->_mutex); + p->_count = initiallyCount; + p->_maxCount = maxCount; + p->_created = 1; + } + return ret; +} + +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) +{ + int ret; + if (releaseCount < 1) return EINVAL; + + ret = pthread_mutex_lock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"SemR::pthread_mutex_lock",&p->_mutex); + if (ret == 0) + { + UInt32 newCount = p->_count + releaseCount; + if (newCount > p->_maxCount) + { + ret = pthread_mutex_unlock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"SemR::pthread_mutex_unlock",&p->_mutex); + return EINVAL; + } + p->_count = newCount; + ret = pthread_cond_broadcast(&p->_cond); + if (ret != 0) dump_error(__LINE__,ret,"SemR::pthread_cond_broadcast",&p->_cond); + if (ret == 0) + { + ret = pthread_mutex_unlock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"SemR::pthread_mutex_unlock",&p->_mutex); + } + } + return ret; +} + +WRes Semaphore_Wait(CSemaphore *p) { + int ret = pthread_mutex_lock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"SemW::pthread_mutex_lock",&p->_mutex); + if (ret == 0) + { + while ((p->_count < 1) && (ret == 0)) + { + ret = pthread_cond_wait(&p->_cond, &p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"SemW::pthread_cond_wait",&p->_mutex); + } + if (ret == 0) + { + p->_count--; + ret = pthread_mutex_unlock(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"SemW::pthread_mutex_unlock",&p->_mutex); + } + } + return ret; +} + +WRes Semaphore_Close(CSemaphore *p) { + if (p->_created) + { + int ret; + p->_created = 0; + ret = pthread_mutex_destroy(&p->_mutex); + if (ret != 0) dump_error(__LINE__,ret,"Semc::pthread_mutex_destroy",&p->_mutex); + ret = pthread_cond_destroy(&p->_cond); + if (ret != 0) dump_error(__LINE__,ret,"Semc::pthread_cond_destroy",&p->_cond); + } + return 0; +} + +WRes CriticalSection_Init(CCriticalSection * lpCriticalSection) +{ + if (lpCriticalSection) + { + int ret; + pthread_mutexattr_t mutexattr; + memset(&mutexattr,0,sizeof(mutexattr)); + ret = pthread_mutexattr_init(&mutexattr); + if (ret != 0) dump_error(__LINE__,ret,"CS I::pthread_mutexattr_init",&mutexattr); + ret = pthread_mutexattr_settype(&mutexattr,PTHREAD_MUTEX_ERRORCHECK); + if (ret != 0) dump_error(__LINE__,ret,"CS I::pthread_mutexattr_settype",&mutexattr); + ret = pthread_mutex_init(&lpCriticalSection->_mutex,&mutexattr); + if (ret != 0) dump_error(__LINE__,ret,"CS I::pthread_mutexattr_init",&lpCriticalSection->_mutex); + return ret; + } + return EINTR; +} + +void CriticalSection_Enter(CCriticalSection * lpCriticalSection) +{ + if (lpCriticalSection) + { + int ret = pthread_mutex_lock(&(lpCriticalSection->_mutex)); + if (ret != 0) dump_error(__LINE__,ret,"CS::pthread_mutex_lock",&(lpCriticalSection->_mutex)); + } +} + +void CriticalSection_Leave(CCriticalSection * lpCriticalSection) +{ + if (lpCriticalSection) + { + int ret = pthread_mutex_unlock(&(lpCriticalSection->_mutex)); + if (ret != 0) dump_error(__LINE__,ret,"CS::pthread_mutex_unlock",&(lpCriticalSection->_mutex)); + } +} + +void CriticalSection_Delete(CCriticalSection * lpCriticalSection) +{ + if (lpCriticalSection) + { + int ret = pthread_mutex_destroy(&(lpCriticalSection->_mutex)); + if (ret != 0) dump_error(__LINE__,ret,"CS::pthread_mutex_destroy",&(lpCriticalSection->_mutex)); + } +} + +#else + +WRes Event_Create(CEvent *p, BOOL manualReset, int initialSignaled) +{ + pthread_mutex_init(&p->_mutex,0); + pthread_cond_init(&p->_cond,0); + p->_manual_reset = manualReset; + p->_state = (initialSignaled ? TRUE : FALSE); + p->_created = 1; + return 0; +} + +WRes Event_Set(CEvent *p) { + pthread_mutex_lock(&p->_mutex); + p->_state = TRUE; + pthread_cond_broadcast(&p->_cond); + pthread_mutex_unlock(&p->_mutex); + return 0; +} + +WRes Event_Reset(CEvent *p) { + pthread_mutex_lock(&p->_mutex); + p->_state = FALSE; + pthread_mutex_unlock(&p->_mutex); + return 0; +} + +WRes Event_Wait(CEvent *p) { + pthread_mutex_lock(&p->_mutex); + while (p->_state == FALSE) + { + pthread_cond_wait(&p->_cond, &p->_mutex); + } + if (p->_manual_reset == FALSE) + { + p->_state = FALSE; + } + pthread_mutex_unlock(&p->_mutex); + return 0; +} + +WRes Event_Close(CEvent *p) { + if (p->_created) + { + p->_created = 0; + pthread_mutex_destroy(&p->_mutex); + pthread_cond_destroy(&p->_cond); + } + return 0; +} + +WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount) +{ + pthread_mutex_init(&p->_mutex,0); + pthread_cond_init(&p->_cond,0); + p->_count = initiallyCount; + p->_maxCount = maxCount; + p->_created = 1; + return 0; +} + +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) +{ + UInt32 newCount; + + if (releaseCount < 1) return EINVAL; + + pthread_mutex_lock(&p->_mutex); + + newCount = p->_count + releaseCount; + if (newCount > p->_maxCount) + { + pthread_mutex_unlock(&p->_mutex); + return EINVAL; + } + p->_count = newCount; + pthread_cond_broadcast(&p->_cond); + pthread_mutex_unlock(&p->_mutex); + return 0; +} + +WRes Semaphore_Wait(CSemaphore *p) { + pthread_mutex_lock(&p->_mutex); + while (p->_count < 1) + { + pthread_cond_wait(&p->_cond, &p->_mutex); + } + p->_count--; + pthread_mutex_unlock(&p->_mutex); + return 0; +} + +WRes Semaphore_Close(CSemaphore *p) { + if (p->_created) + { + p->_created = 0; + pthread_mutex_destroy(&p->_mutex); + pthread_cond_destroy(&p->_cond); + } + return 0; +} + +WRes CriticalSection_Init(CCriticalSection * lpCriticalSection) +{ + return pthread_mutex_init(&(lpCriticalSection->_mutex),0); +} + +#endif /* DEBUG_SYNCHRO */ + +#endif /* ENV_BEOS */ + +WRes ManualResetEvent_Create(CManualResetEvent *p, int initialSignaled) +{ return Event_Create(p, TRUE, initialSignaled); } + +WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) +{ return ManualResetEvent_Create(p, 0); } + +WRes AutoResetEvent_Create(CAutoResetEvent *p, int initialSignaled) +{ return Event_Create(p, FALSE, initialSignaled); } +WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) +{ return AutoResetEvent_Create(p, 0); } + diff --git a/Provenance/LzmaSDKObjC/lzma/C/Threads.h b/Provenance/LzmaSDKObjC/lzma/C/Threads.h new file mode 100644 index 0000000000..532215ca59 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Threads.h @@ -0,0 +1,123 @@ +/* Threads.h -- multithreading library + 2008-11-22 : Igor Pavlov : Public domain */ + +#ifndef __7Z_THRESDS_H +#define __7Z_THRESDS_H + +#ifdef _WIN32 +#include +#endif + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* #define DEBUG_SYNCHRO 1 */ + +typedef struct _CThread +{ +#ifdef ENV_BEOS + thread_id _tid; +#else + pthread_t _tid; +#endif + int _created; + +} CThread; + +#define Thread_Construct(thread) (thread)->_created = 0 +#define Thread_WasCreated(thread) ((thread)->_created != 0) + +typedef unsigned THREAD_FUNC_RET_TYPE; +#define THREAD_FUNC_CALL_TYPE MY_STD_CALL +#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE + +typedef THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE * THREAD_FUNC_TYPE)(void *); + +WRes Thread_Create(CThread *thread, THREAD_FUNC_TYPE startAddress, LPVOID parameter); +WRes Thread_Wait(CThread *thread); +WRes Thread_Close(CThread *thread); + +typedef struct _CEvent +{ + int _created; + int _manual_reset; + int _state; +#ifdef ENV_BEOS + thread_id _waiting[MAX_THREAD]; + int _index_waiting; + sem_id _sem; +#else + pthread_mutex_t _mutex; + pthread_cond_t _cond; +#endif +} CEvent; + +typedef CEvent CAutoResetEvent; +typedef CEvent CManualResetEvent; + +#define Event_Construct(event) (event)->_created = 0 +#define Event_IsCreated(event) ((event)->_created) + +WRes ManualResetEvent_Create(CManualResetEvent *event, int initialSignaled); +WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *event); +WRes AutoResetEvent_Create(CAutoResetEvent *event, int initialSignaled); +WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *event); +WRes Event_Set(CEvent *event); +WRes Event_Reset(CEvent *event); +WRes Event_Wait(CEvent *event); +WRes Event_Close(CEvent *event); + + +typedef struct _CSemaphore +{ + int _created; + UInt32 _count; + UInt32 _maxCount; +#ifdef ENV_BEOS + thread_id _waiting[MAX_THREAD]; + int _index_waiting; + sem_id _sem; +#else + pthread_mutex_t _mutex; + pthread_cond_t _cond; +#endif +} CSemaphore; + +#define Semaphore_Construct(p) (p)->_created = 0 + +WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount); +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); +#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1) +WRes Semaphore_Wait(CSemaphore *p); +WRes Semaphore_Close(CSemaphore *p); + +typedef struct { +#ifdef ENV_BEOS + sem_id _sem; +#else + pthread_mutex_t _mutex; +#endif +} CCriticalSection; + +WRes CriticalSection_Init(CCriticalSection *p); +#ifdef ENV_BEOS +#define CriticalSection_Delete(p) delete_sem((p)->_sem) +#define CriticalSection_Enter(p) acquire_sem((p)->_sem) +#define CriticalSection_Leave(p) release_sem((p)->_sem) +#else +#ifdef DEBUG_SYNCHRO +void CriticalSection_Delete(CCriticalSection *); +void CriticalSection_Enter(CCriticalSection *); +void CriticalSection_Leave(CCriticalSection *); +#else +#define CriticalSection_Delete(p) pthread_mutex_destroy(&((p)->_mutex)) +#define CriticalSection_Enter(p) pthread_mutex_lock(&((p)->_mutex)) +#define CriticalSection_Leave(p) pthread_mutex_unlock(&((p)->_mutex)) +#endif +#endif + +EXTERN_C_END + +#endif + diff --git a/Provenance/LzmaSDKObjC/lzma/C/Xz.c b/Provenance/LzmaSDKObjC/lzma/C/Xz.c new file mode 100644 index 0000000000..92144db18f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Xz.c @@ -0,0 +1,90 @@ +/* Xz.c - Xz +2015-05-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zCrc.h" +#include "CpuArch.h" +#include "Xz.h" +#include "XzCrc64.h" + +const Byte XZ_SIG[XZ_SIG_SIZE] = { 0xFD, '7', 'z', 'X', 'Z', 0 }; +const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' }; + +unsigned Xz_WriteVarInt(Byte *buf, UInt64 v) +{ + unsigned i = 0; + do + { + buf[i++] = (Byte)((v & 0x7F) | 0x80); + v >>= 7; + } + while (v != 0); + buf[i - 1] &= 0x7F; + return i; +} + +void Xz_Construct(CXzStream *p) +{ + p->numBlocks = p->numBlocksAllocated = 0; + p->blocks = 0; + p->flags = 0; +} + +void Xz_Free(CXzStream *p, ISzAlloc *alloc) +{ + alloc->Free(alloc, p->blocks); + p->numBlocks = p->numBlocksAllocated = 0; + p->blocks = 0; +} + +unsigned XzFlags_GetCheckSize(CXzStreamFlags f) +{ + unsigned t = XzFlags_GetCheckType(f); + return (t == 0) ? 0 : (4 << ((t - 1) / 3)); +} + +void XzCheck_Init(CXzCheck *p, unsigned mode) +{ + p->mode = mode; + switch (mode) + { + case XZ_CHECK_CRC32: p->crc = CRC_INIT_VAL; break; + case XZ_CHECK_CRC64: p->crc64 = CRC64_INIT_VAL; break; + case XZ_CHECK_SHA256: Sha256_Init(&p->sha); break; + } +} + +void XzCheck_Update(CXzCheck *p, const void *data, size_t size) +{ + switch (p->mode) + { + case XZ_CHECK_CRC32: p->crc = CrcUpdate(p->crc, data, size); break; + case XZ_CHECK_CRC64: p->crc64 = Crc64Update(p->crc64, data, size); break; + case XZ_CHECK_SHA256: Sha256_Update(&p->sha, (const Byte *)data, size); break; + } +} + +int XzCheck_Final(CXzCheck *p, Byte *digest) +{ + switch (p->mode) + { + case XZ_CHECK_CRC32: + SetUi32(digest, CRC_GET_DIGEST(p->crc)); + break; + case XZ_CHECK_CRC64: + { + int i; + UInt64 v = CRC64_GET_DIGEST(p->crc64); + for (i = 0; i < 8; i++, v >>= 8) + digest[i] = (Byte)(v & 0xFF); + break; + } + case XZ_CHECK_SHA256: + Sha256_Final(&p->sha, digest); + break; + default: + return 0; + } + return 1; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/Xz.h b/Provenance/LzmaSDKObjC/lzma/C/Xz.h new file mode 100644 index 0000000000..6937beaf68 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/Xz.h @@ -0,0 +1,275 @@ +/* Xz.h - Xz interface +2015-05-01 : Igor Pavlov : Public domain */ + +#ifndef __XZ_H +#define __XZ_H + +#include "Sha256.h" + +EXTERN_C_BEGIN + +#define XZ_ID_Subblock 1 +#define XZ_ID_Delta 3 +#define XZ_ID_X86 4 +#define XZ_ID_PPC 5 +#define XZ_ID_IA64 6 +#define XZ_ID_ARM 7 +#define XZ_ID_ARMT 8 +#define XZ_ID_SPARC 9 +#define XZ_ID_LZMA2 0x21 + +unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value); +unsigned Xz_WriteVarInt(Byte *buf, UInt64 v); + +/* ---------- xz block ---------- */ + +#define XZ_BLOCK_HEADER_SIZE_MAX 1024 + +#define XZ_NUM_FILTERS_MAX 4 +#define XZ_BF_NUM_FILTERS_MASK 3 +#define XZ_BF_PACK_SIZE (1 << 6) +#define XZ_BF_UNPACK_SIZE (1 << 7) + +#define XZ_FILTER_PROPS_SIZE_MAX 20 + +typedef struct +{ + UInt64 id; + UInt32 propsSize; + Byte props[XZ_FILTER_PROPS_SIZE_MAX]; +} CXzFilter; + +typedef struct +{ + UInt64 packSize; + UInt64 unpackSize; + Byte flags; + CXzFilter filters[XZ_NUM_FILTERS_MAX]; +} CXzBlock; + +#define XzBlock_GetNumFilters(p) (((p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1) +#define XzBlock_HasPackSize(p) (((p)->flags & XZ_BF_PACK_SIZE) != 0) +#define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0) + +SRes XzBlock_Parse(CXzBlock *p, const Byte *header); +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes); + +/* ---------- xz stream ---------- */ + +#define XZ_SIG_SIZE 6 +#define XZ_FOOTER_SIG_SIZE 2 + +extern const Byte XZ_SIG[XZ_SIG_SIZE]; +extern const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE]; + +#define XZ_STREAM_FLAGS_SIZE 2 +#define XZ_STREAM_CRC_SIZE 4 + +#define XZ_STREAM_HEADER_SIZE (XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE) +#define XZ_STREAM_FOOTER_SIZE (XZ_FOOTER_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE + 4) + +#define XZ_CHECK_MASK 0xF +#define XZ_CHECK_NO 0 +#define XZ_CHECK_CRC32 1 +#define XZ_CHECK_CRC64 4 +#define XZ_CHECK_SHA256 10 + +typedef struct +{ + unsigned mode; + UInt32 crc; + UInt64 crc64; + CSha256 sha; +} CXzCheck; + +void XzCheck_Init(CXzCheck *p, unsigned mode); +void XzCheck_Update(CXzCheck *p, const void *data, size_t size); +int XzCheck_Final(CXzCheck *p, Byte *digest); + +typedef UInt16 CXzStreamFlags; + +#define XzFlags_IsSupported(f) ((f) <= XZ_CHECK_MASK) +#define XzFlags_GetCheckType(f) ((f) & XZ_CHECK_MASK) +#define XzFlags_HasDataCrc32(f) (Xz_GetCheckType(f) == XZ_CHECK_CRC32) +unsigned XzFlags_GetCheckSize(CXzStreamFlags f); + +SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf); +SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream); + +typedef struct +{ + UInt64 unpackSize; + UInt64 totalSize; +} CXzBlockSizes; + +typedef struct +{ + CXzStreamFlags flags; + size_t numBlocks; + size_t numBlocksAllocated; + CXzBlockSizes *blocks; + UInt64 startOffset; +} CXzStream; + +void Xz_Construct(CXzStream *p); +void Xz_Free(CXzStream *p, ISzAlloc *alloc); + +#define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1) + +UInt64 Xz_GetUnpackSize(const CXzStream *p); +UInt64 Xz_GetPackSize(const CXzStream *p); + +typedef struct +{ + size_t num; + size_t numAllocated; + CXzStream *streams; +} CXzs; + +void Xzs_Construct(CXzs *p); +void Xzs_Free(CXzs *p, ISzAlloc *alloc); +SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAlloc *alloc); + +UInt64 Xzs_GetNumBlocks(const CXzs *p); +UInt64 Xzs_GetUnpackSize(const CXzs *p); + +typedef enum +{ + CODER_STATUS_NOT_SPECIFIED, /* use main error code instead */ + CODER_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + CODER_STATUS_NOT_FINISHED, /* stream was not finished */ + CODER_STATUS_NEEDS_MORE_INPUT /* you must provide more input bytes */ +} ECoderStatus; + +typedef enum +{ + CODER_FINISH_ANY, /* finish at any point */ + CODER_FINISH_END /* block must be finished at the end */ +} ECoderFinishMode; + +typedef struct _IStateCoder +{ + void *p; + void (*Free)(void *p, ISzAlloc *alloc); + SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAlloc *alloc); + void (*Init)(void *p); + SRes (*Code)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished); +} IStateCoder; + +#define MIXCODER_NUM_FILTERS_MAX 4 + +typedef struct +{ + ISzAlloc *alloc; + Byte *buf; + unsigned numCoders; + int finished[MIXCODER_NUM_FILTERS_MAX - 1]; + size_t pos[MIXCODER_NUM_FILTERS_MAX - 1]; + size_t size[MIXCODER_NUM_FILTERS_MAX - 1]; + UInt64 ids[MIXCODER_NUM_FILTERS_MAX]; + IStateCoder coders[MIXCODER_NUM_FILTERS_MAX]; +} CMixCoder; + +void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc); +void MixCoder_Free(CMixCoder *p); +void MixCoder_Init(CMixCoder *p); +SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId); +SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, int srcWasFinished, + ECoderFinishMode finishMode, ECoderStatus *status); + +typedef enum +{ + XZ_STATE_STREAM_HEADER, + XZ_STATE_STREAM_INDEX, + XZ_STATE_STREAM_INDEX_CRC, + XZ_STATE_STREAM_FOOTER, + XZ_STATE_STREAM_PADDING, + XZ_STATE_BLOCK_HEADER, + XZ_STATE_BLOCK, + XZ_STATE_BLOCK_FOOTER +} EXzState; + +typedef struct +{ + EXzState state; + UInt32 pos; + unsigned alignPos; + unsigned indexPreSize; + + CXzStreamFlags streamFlags; + + UInt32 blockHeaderSize; + UInt64 packSize; + UInt64 unpackSize; + + UInt64 numBlocks; + UInt64 indexSize; + UInt64 indexPos; + UInt64 padSize; + + UInt64 numStartedStreams; + UInt64 numFinishedStreams; + UInt64 numTotalBlocks; + + UInt32 crc; + CMixCoder decoder; + CXzBlock block; + CXzCheck check; + CSha256 sha; + Byte shaDigest[SHA256_DIGEST_SIZE]; + Byte buf[XZ_BLOCK_HEADER_SIZE_MAX]; +} CXzUnpacker; + +void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc); +void XzUnpacker_Init(CXzUnpacker *p); +void XzUnpacker_Free(CXzUnpacker *p); + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + CODER_FINISH_ANY - use smallest number of input bytes + CODER_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + CODER_STATUS_NOT_FINISHED, + CODER_STATUS_NEEDS_MORE_INPUT - maybe there are more xz streams, + call XzUnpacker_IsStreamWasFinished to check that current stream was finished + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_DATA - Data error + SZ_ERROR_UNSUPPORTED - Unsupported method or method properties + SZ_ERROR_CRC - CRC error + // SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). + + SZ_ERROR_NO_ARCHIVE - the error with xz Stream Header with one of the following reasons: + - xz Stream Signature failure + - CRC32 of xz Stream Header is failed + - The size of Stream padding is not multiple of four bytes. + It's possible to get that error, if xz stream was finished and the stream + contains some another data. In that case you can call XzUnpacker_GetExtraSize() + function to get real size of xz stream. +*/ + + +SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, + ECoderStatus *status); + +Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p); + +/* +Call XzUnpacker_GetExtraSize after XzUnpacker_Code function to detect real size of +xz stream in two cases: +XzUnpacker_Code() returns: + res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT + res == SZ_ERROR_NO_ARCHIVE +*/ + +UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzCrc64.c b/Provenance/LzmaSDKObjC/lzma/C/XzCrc64.c new file mode 100644 index 0000000000..bd0cf5a374 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzCrc64.c @@ -0,0 +1,86 @@ +/* XzCrc64.c -- CRC64 calculation +2015-03-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "XzCrc64.h" +#include "CpuArch.h" + +#define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42) + +#ifdef MY_CPU_LE + #define CRC_NUM_TABLES 4 +#else + #define CRC_NUM_TABLES 5 + #define CRC_UINT64_SWAP(v) \ + ((v >> 56) \ + | ((v >> 40) & ((UInt64)0xFF << 8)) \ + | ((v >> 24) & ((UInt64)0xFF << 16)) \ + | ((v >> 8) & ((UInt64)0xFF << 24)) \ + | ((v << 8) & ((UInt64)0xFF << 32)) \ + | ((v << 24) & ((UInt64)0xFF << 40)) \ + | ((v << 40) & ((UInt64)0xFF << 48)) \ + | ((v << 56))) + + UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +#endif + +#ifndef MY_CPU_BE + UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +#endif + +typedef UInt64 (MY_FAST_CALL *CRC_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table); + +static CRC_FUNC g_Crc64Update; +UInt64 g_Crc64Table[256 * CRC_NUM_TABLES]; + +UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size) +{ + return g_Crc64Update(v, data, size, g_Crc64Table); +} + +UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size) +{ + return g_Crc64Update(CRC64_INIT_VAL, data, size, g_Crc64Table) ^ CRC64_INIT_VAL; +} + +void MY_FAST_CALL Crc64GenerateTable() +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt64 r = i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrc64Poly & ~((r & 1) - 1)); + g_Crc64Table[i] = r; + } + for (; i < 256 * CRC_NUM_TABLES; i++) + { + UInt64 r = g_Crc64Table[i - 256]; + g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8); + } + + #ifdef MY_CPU_LE + + g_Crc64Update = XzCrc64UpdateT4; + + #else + { + #ifndef MY_CPU_BE + UInt32 k = 1; + if (*(const Byte *)&k == 1) + g_Crc64Update = XzCrc64UpdateT4; + else + #endif + { + for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) + { + UInt64 x = g_Crc64Table[i - 256]; + g_Crc64Table[i] = CRC_UINT64_SWAP(x); + } + g_Crc64Update = XzCrc64UpdateT1_BeT4; + } + } + #endif +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzCrc64.h b/Provenance/LzmaSDKObjC/lzma/C/XzCrc64.h new file mode 100644 index 0000000000..71b10d57e5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzCrc64.h @@ -0,0 +1,26 @@ +/* XzCrc64.h -- CRC64 calculation +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __XZ_CRC64_H +#define __XZ_CRC64_H + +#include + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +extern UInt64 g_Crc64Table[]; + +void MY_FAST_CALL Crc64GenerateTable(void); + +#define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF) +#define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL) +#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size); +UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzCrc64Opt.c b/Provenance/LzmaSDKObjC/lzma/C/XzCrc64Opt.c new file mode 100644 index 0000000000..97d086e6a1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzCrc64Opt.c @@ -0,0 +1,69 @@ +/* XzCrc64Opt.c -- CRC64 calculation +2015-03-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifndef MY_CPU_BE + +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + UInt32 d = (UInt32)v ^ *(const UInt32 *)p; + v = (v >> 32) + ^ table[0x300 + ((d ) & 0xFF)] + ^ table[0x200 + ((d >> 8) & 0xFF)] + ^ table[0x100 + ((d >> 16) & 0xFF)] + ^ table[0x000 + ((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + +#endif + + +#ifndef MY_CPU_LE + +#define CRC_UINT64_SWAP(v) \ + ((v >> 56) \ + | ((v >> 40) & ((UInt64)0xFF << 8)) \ + | ((v >> 24) & ((UInt64)0xFF << 16)) \ + | ((v >> 8) & ((UInt64)0xFF << 24)) \ + | ((v << 8) & ((UInt64)0xFF << 32)) \ + | ((v << 24) & ((UInt64)0xFF << 40)) \ + | ((v << 40) & ((UInt64)0xFF << 48)) \ + | ((v << 56))) + +#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) + +UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table) +{ + const Byte *p = (const Byte *)data; + table += 0x100; + v = CRC_UINT64_SWAP(v); + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)p; + v = (v << 32) + ^ table[0x000 + ((d ) & 0xFF)] + ^ table[0x100 + ((d >> 8) & 0xFF)] + ^ table[0x200 + ((d >> 16) & 0xFF)] + ^ table[0x300 + ((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + return CRC_UINT64_SWAP(v); +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzDec.c b/Provenance/LzmaSDKObjC/lzma/C/XzDec.c new file mode 100644 index 0000000000..29831b0ca9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzDec.c @@ -0,0 +1,913 @@ +/* XzDec.c -- Xz Decode +2015-11-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +/* #define XZ_DUMP */ + +#ifdef XZ_DUMP +#include +#endif + +#include +#include + +#include "7zCrc.h" +#include "Alloc.h" +#include "Bra.h" +#include "CpuArch.h" +#include "Delta.h" +#include "Lzma2Dec.h" + +#ifdef USE_SUBBLOCK +#include "Bcj3Dec.c" +#include "SbDec.c" +#endif + +#include "Xz.h" + +#define XZ_CHECK_SIZE_MAX 64 + +#define CODER_BUF_SIZE (1 << 17) + +unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value) +{ + unsigned i, limit; + *value = 0; + limit = (maxSize > 9) ? 9 : (unsigned)maxSize; + + for (i = 0; i < limit;) + { + Byte b = p[i]; + *value |= (UInt64)(b & 0x7F) << (7 * i++); + if ((b & 0x80) == 0) + return (b == 0 && i != 1) ? 0 : i; + } + return 0; +} + +/* ---------- BraState ---------- */ + +#define BRA_BUF_SIZE (1 << 14) + +typedef struct +{ + size_t bufPos; + size_t bufConv; + size_t bufTotal; + + UInt32 methodId; + int encodeMode; + UInt32 delta; + UInt32 ip; + UInt32 x86State; + Byte deltaState[DELTA_STATE_SIZE]; + + Byte buf[BRA_BUF_SIZE]; +} CBraState; + +static void BraState_Free(void *pp, ISzAlloc *alloc) +{ + alloc->Free(alloc, pp); +} + +static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +{ + CBraState *p = ((CBraState *)pp); + UNUSED_VAR(alloc); + p->ip = 0; + if (p->methodId == XZ_ID_Delta) + { + if (propSize != 1) + return SZ_ERROR_UNSUPPORTED; + p->delta = (unsigned)props[0] + 1; + } + else + { + if (propSize == 4) + { + UInt32 v = GetUi32(props); + switch (p->methodId) + { + case XZ_ID_PPC: + case XZ_ID_ARM: + case XZ_ID_SPARC: + if ((v & 3) != 0) + return SZ_ERROR_UNSUPPORTED; + break; + case XZ_ID_ARMT: + if ((v & 1) != 0) + return SZ_ERROR_UNSUPPORTED; + break; + case XZ_ID_IA64: + if ((v & 0xF) != 0) + return SZ_ERROR_UNSUPPORTED; + break; + } + p->ip = v; + } + else if (propSize != 0) + return SZ_ERROR_UNSUPPORTED; + } + return SZ_OK; +} + +static void BraState_Init(void *pp) +{ + CBraState *p = ((CBraState *)pp); + p->bufPos = p->bufConv = p->bufTotal = 0; + x86_Convert_Init(p->x86State); + if (p->methodId == XZ_ID_Delta) + Delta_Init(p->deltaState); +} + +#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: p->bufConv = isa ## _Convert(p->buf, p->bufTotal, p->ip, p->encodeMode); break; + +static SRes BraState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) +{ + CBraState *p = ((CBraState *)pp); + SizeT destLenOrig = *destLen; + SizeT srcLenOrig = *srcLen; + UNUSED_VAR(finishMode); + *destLen = 0; + *srcLen = 0; + *wasFinished = 0; + while (destLenOrig > 0) + { + if (p->bufPos != p->bufConv) + { + size_t curSize = p->bufConv - p->bufPos; + if (curSize > destLenOrig) + curSize = destLenOrig; + memcpy(dest, p->buf + p->bufPos, curSize); + p->bufPos += curSize; + *destLen += curSize; + dest += curSize; + destLenOrig -= curSize; + continue; + } + p->bufTotal -= p->bufPos; + memmove(p->buf, p->buf + p->bufPos, p->bufTotal); + p->bufPos = 0; + p->bufConv = 0; + { + size_t curSize = BRA_BUF_SIZE - p->bufTotal; + if (curSize > srcLenOrig) + curSize = srcLenOrig; + memcpy(p->buf + p->bufTotal, src, curSize); + *srcLen += curSize; + src += curSize; + srcLenOrig -= curSize; + p->bufTotal += curSize; + } + if (p->bufTotal == 0) + break; + switch (p->methodId) + { + case XZ_ID_Delta: + if (p->encodeMode) + Delta_Encode(p->deltaState, p->delta, p->buf, p->bufTotal); + else + Delta_Decode(p->deltaState, p->delta, p->buf, p->bufTotal); + p->bufConv = p->bufTotal; + break; + case XZ_ID_X86: + p->bufConv = x86_Convert(p->buf, p->bufTotal, p->ip, &p->x86State, p->encodeMode); + break; + CASE_BRA_CONV(PPC) + CASE_BRA_CONV(IA64) + CASE_BRA_CONV(ARM) + CASE_BRA_CONV(ARMT) + CASE_BRA_CONV(SPARC) + default: + return SZ_ERROR_UNSUPPORTED; + } + p->ip += (UInt32)p->bufConv; + + if (p->bufConv == 0) + { + if (!srcWasFinished) + break; + p->bufConv = p->bufTotal; + } + } + if (p->bufTotal == p->bufPos && srcLenOrig == 0 && srcWasFinished) + *wasFinished = 1; + return SZ_OK; +} + +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc *alloc) +{ + CBraState *decoder; + if (id != XZ_ID_Delta && + id != XZ_ID_X86 && + id != XZ_ID_PPC && + id != XZ_ID_IA64 && + id != XZ_ID_ARM && + id != XZ_ID_ARMT && + id != XZ_ID_SPARC) + return SZ_ERROR_UNSUPPORTED; + p->p = 0; + decoder = (CBraState *)alloc->Alloc(alloc, sizeof(CBraState)); + if (decoder == 0) + return SZ_ERROR_MEM; + decoder->methodId = (UInt32)id; + decoder->encodeMode = encodeMode; + p->p = decoder; + p->Free = BraState_Free; + p->SetProps = BraState_SetProps; + p->Init = BraState_Init; + p->Code = BraState_Code; + return SZ_OK; +} + +/* ---------- SbState ---------- */ + +#ifdef USE_SUBBLOCK + +static void SbState_Free(void *pp, ISzAlloc *alloc) +{ + CSbDec *p = (CSbDec *)pp; + SbDec_Free(p); + alloc->Free(alloc, pp); +} + +static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +{ + UNUSED_VAR(pp); + UNUSED_VAR(props); + UNUSED_VAR(alloc); + return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED; +} + +static void SbState_Init(void *pp) +{ + SbDec_Init((CSbDec *)pp); +} + +static SRes SbState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) +{ + CSbDec *p = (CSbDec *)pp; + SRes res; + UNUSED_VAR(srcWasFinished); + p->dest = dest; + p->destLen = *destLen; + p->src = src; + p->srcLen = *srcLen; + p->finish = finishMode; /* change it */ + res = SbDec_Decode((CSbDec *)pp); + *destLen -= p->destLen; + *srcLen -= p->srcLen; + *wasFinished = (*destLen == 0 && *srcLen == 0); /* change it */ + return res; +} + +SRes SbState_SetFromMethod(IStateCoder *p, ISzAlloc *alloc) +{ + CSbDec *decoder; + p->p = 0; + decoder = alloc->Alloc(alloc, sizeof(CSbDec)); + if (decoder == 0) + return SZ_ERROR_MEM; + p->p = decoder; + p->Free = SbState_Free; + p->SetProps = SbState_SetProps; + p->Init = SbState_Init; + p->Code = SbState_Code; + SbDec_Construct(decoder); + SbDec_SetAlloc(decoder, alloc); + return SZ_OK; +} +#endif + +/* ---------- Lzma2State ---------- */ + +static void Lzma2State_Free(void *pp, ISzAlloc *alloc) +{ + Lzma2Dec_Free((CLzma2Dec *)pp, alloc); + alloc->Free(alloc, pp); +} + +static SRes Lzma2State_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +{ + if (propSize != 1) + return SZ_ERROR_UNSUPPORTED; + return Lzma2Dec_Allocate((CLzma2Dec *)pp, props[0], alloc); +} + +static void Lzma2State_Init(void *pp) +{ + Lzma2Dec_Init((CLzma2Dec *)pp); +} + +static SRes Lzma2State_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, int *wasFinished) +{ + ELzmaStatus status; + /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ + SRes res = Lzma2Dec_DecodeToBuf((CLzma2Dec *)pp, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status); + UNUSED_VAR(srcWasFinished); + *wasFinished = (status == LZMA_STATUS_FINISHED_WITH_MARK); + return res; +} + +static SRes Lzma2State_SetFromMethod(IStateCoder *p, ISzAlloc *alloc) +{ + CLzma2Dec *decoder = (CLzma2Dec *)alloc->Alloc(alloc, sizeof(CLzma2Dec)); + p->p = decoder; + if (decoder == 0) + return SZ_ERROR_MEM; + p->Free = Lzma2State_Free; + p->SetProps = Lzma2State_SetProps; + p->Init = Lzma2State_Init; + p->Code = Lzma2State_Code; + Lzma2Dec_Construct(decoder); + return SZ_OK; +} + + +void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc) +{ + unsigned i; + p->alloc = alloc; + p->buf = NULL; + p->numCoders = 0; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) + p->coders[i].p = NULL; +} + +void MixCoder_Free(CMixCoder *p) +{ + unsigned i; + for (i = 0; i < p->numCoders; i++) + { + IStateCoder *sc = &p->coders[i]; + if (p->alloc && sc->p) + sc->Free(sc->p, p->alloc); + } + p->numCoders = 0; + if (p->buf) + { + p->alloc->Free(p->alloc, p->buf); + p->buf = NULL; /* 9.31: the BUG was fixed */ + } +} + +void MixCoder_Init(CMixCoder *p) +{ + unsigned i; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX - 1; i++) + { + p->size[i] = 0; + p->pos[i] = 0; + p->finished[i] = 0; + } + for (i = 0; i < p->numCoders; i++) + { + IStateCoder *coder = &p->coders[i]; + coder->Init(coder->p); + } +} + +SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId) +{ + IStateCoder *sc = &p->coders[coderIndex]; + p->ids[coderIndex] = methodId; + switch (methodId) + { + case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, p->alloc); + #ifdef USE_SUBBLOCK + case XZ_ID_Subblock: return SbState_SetFromMethod(sc, p->alloc); + #endif + } + if (coderIndex == 0) + return SZ_ERROR_UNSUPPORTED; + return BraState_SetFromMethod(sc, methodId, 0, p->alloc); +} + +SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, int srcWasFinished, + ECoderFinishMode finishMode, ECoderStatus *status) +{ + SizeT destLenOrig = *destLen; + SizeT srcLenOrig = *srcLen; + Bool allFinished = True; + *destLen = 0; + *srcLen = 0; + *status = CODER_STATUS_NOT_FINISHED; + + if (!p->buf) + { + p->buf = (Byte *)p->alloc->Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); + if (!p->buf) + return SZ_ERROR_MEM; + } + + if (p->numCoders != 1) + finishMode = CODER_FINISH_ANY; + + for (;;) + { + Bool processed = False; + unsigned i; + /* + if (p->numCoders == 1 && *destLen == destLenOrig && finishMode == LZMA_FINISH_ANY) + break; + */ + + for (i = 0; i < p->numCoders; i++) + { + SRes res; + IStateCoder *coder = &p->coders[i]; + Byte *destCur; + SizeT destLenCur, srcLenCur; + const Byte *srcCur; + int srcFinishedCur; + int encodingWasFinished; + + if (i == 0) + { + srcCur = src; + srcLenCur = srcLenOrig - *srcLen; + srcFinishedCur = srcWasFinished; + } + else + { + srcCur = p->buf + (CODER_BUF_SIZE * (i - 1)) + p->pos[i - 1]; + srcLenCur = p->size[i - 1] - p->pos[i - 1]; + srcFinishedCur = p->finished[i - 1]; + } + + if (i == p->numCoders - 1) + { + destCur = dest; + destLenCur = destLenOrig - *destLen; + } + else + { + if (p->pos[i] != p->size[i]) + continue; + destCur = p->buf + (CODER_BUF_SIZE * i); + destLenCur = CODER_BUF_SIZE; + } + + res = coder->Code(coder->p, destCur, &destLenCur, srcCur, &srcLenCur, srcFinishedCur, finishMode, &encodingWasFinished); + + if (!encodingWasFinished) + allFinished = False; + + if (i == 0) + { + *srcLen += srcLenCur; + src += srcLenCur; + } + else + { + p->pos[i - 1] += srcLenCur; + } + + if (i == p->numCoders - 1) + { + *destLen += destLenCur; + dest += destLenCur; + } + else + { + p->size[i] = destLenCur; + p->pos[i] = 0; + p->finished[i] = encodingWasFinished; + } + + if (res != SZ_OK) + return res; + + if (destLenCur != 0 || srcLenCur != 0) + processed = True; + } + if (!processed) + break; + } + if (allFinished) + *status = CODER_STATUS_FINISHED_WITH_MARK; + return SZ_OK; +} + +SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf) +{ + *p = (CXzStreamFlags)GetBe16(buf + XZ_SIG_SIZE); + if (CrcCalc(buf + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE) != + GetUi32(buf + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE)) + return SZ_ERROR_NO_ARCHIVE; + return XzFlags_IsSupported(*p) ? SZ_OK : SZ_ERROR_UNSUPPORTED; +} + +static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) +{ + return + indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) && + (GetUi32(buf) == CrcCalc(buf + 4, 6) && + flags == GetBe16(buf + 8) && + memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0); +} + +#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ + { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ + if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } + + +SRes XzBlock_Parse(CXzBlock *p, const Byte *header) +{ + unsigned pos; + unsigned numFilters, i; + unsigned headerSize = (unsigned)header[0] << 2; + + if (CrcCalc(header, headerSize) != GetUi32(header + headerSize)) + return SZ_ERROR_ARCHIVE; + + pos = 1; + if (pos == headerSize) + return SZ_ERROR_ARCHIVE; + p->flags = header[pos++]; + + if (XzBlock_HasPackSize(p)) + { + READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize); + if (p->packSize == 0 || p->packSize + headerSize >= (UInt64)1 << 63) + return SZ_ERROR_ARCHIVE; + } + + if (XzBlock_HasUnpackSize(p)) + READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize); + + numFilters = XzBlock_GetNumFilters(p); + for (i = 0; i < numFilters; i++) + { + CXzFilter *filter = p->filters + i; + UInt64 size; + READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id); + READ_VARINT_AND_CHECK(header, pos, headerSize, &size); + if (size > headerSize - pos || size > XZ_FILTER_PROPS_SIZE_MAX) + return SZ_ERROR_ARCHIVE; + filter->propsSize = (UInt32)size; + memcpy(filter->props, header + pos, (size_t)size); + pos += (unsigned)size; + + #ifdef XZ_DUMP + printf("\nf[%u] = %2X: ", i, (unsigned)filter->id); + { + unsigned i; + for (i = 0; i < size; i++) + printf(" %2X", filter->props[i]); + } + #endif + } + + while (pos < headerSize) + if (header[pos++] != 0) + return SZ_ERROR_ARCHIVE; + return SZ_OK; +} + +SRes XzDec_Init(CMixCoder *p, const CXzBlock *block) +{ + unsigned i; + Bool needReInit = True; + unsigned numFilters = XzBlock_GetNumFilters(block); + + if (numFilters == p->numCoders) + { + for (i = 0; i < numFilters; i++) + if (p->ids[i] != block->filters[numFilters - 1 - i].id) + break; + needReInit = (i != numFilters); + } + + if (needReInit) + { + MixCoder_Free(p); + p->numCoders = numFilters; + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &block->filters[numFilters - 1 - i]; + RINOK(MixCoder_SetFromMethod(p, i, f->id)); + } + } + + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &block->filters[numFilters - 1 - i]; + IStateCoder *sc = &p->coders[i]; + RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc)); + } + + MixCoder_Init(p); + return SZ_OK; +} + +void XzUnpacker_Init(CXzUnpacker *p) +{ + p->state = XZ_STATE_STREAM_HEADER; + p->pos = 0; + p->numStartedStreams = 0; + p->numFinishedStreams = 0; + p->numTotalBlocks = 0; + p->padSize = 0; +} + +void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc) +{ + MixCoder_Construct(&p->decoder, alloc); + XzUnpacker_Init(p); +} + +void XzUnpacker_Free(CXzUnpacker *p) +{ + MixCoder_Free(&p->decoder); +} + +SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, ECoderStatus *status) +{ + SizeT destLenOrig = *destLen; + SizeT srcLenOrig = *srcLen; + *destLen = 0; + *srcLen = 0; + *status = CODER_STATUS_NOT_SPECIFIED; + for (;;) + { + SizeT srcRem = srcLenOrig - *srcLen; + + if (p->state == XZ_STATE_BLOCK) + { + SizeT destLen2 = destLenOrig - *destLen; + SizeT srcLen2 = srcLenOrig - *srcLen; + SRes res; + if (srcLen2 == 0 && destLen2 == 0) + { + *status = CODER_STATUS_NOT_FINISHED; + return SZ_OK; + } + + res = MixCoder_Code(&p->decoder, dest, &destLen2, src, &srcLen2, False, finishMode, status); + XzCheck_Update(&p->check, dest, destLen2); + + (*srcLen) += srcLen2; + src += srcLen2; + p->packSize += srcLen2; + + (*destLen) += destLen2; + dest += destLen2; + p->unpackSize += destLen2; + + RINOK(res); + + if (*status == CODER_STATUS_FINISHED_WITH_MARK) + { + Byte temp[32]; + unsigned num = Xz_WriteVarInt(temp, p->packSize + p->blockHeaderSize + XzFlags_GetCheckSize(p->streamFlags)); + num += Xz_WriteVarInt(temp + num, p->unpackSize); + Sha256_Update(&p->sha, temp, num); + p->indexSize += num; + p->numBlocks++; + + p->state = XZ_STATE_BLOCK_FOOTER; + p->pos = 0; + p->alignPos = 0; + } + else if (srcLen2 == 0 && destLen2 == 0) + return SZ_OK; + + continue; + } + + if (srcRem == 0) + { + *status = CODER_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + switch (p->state) + { + case XZ_STATE_STREAM_HEADER: + { + if (p->pos < XZ_STREAM_HEADER_SIZE) + { + if (p->pos < XZ_SIG_SIZE && *src != XZ_SIG[p->pos]) + return SZ_ERROR_NO_ARCHIVE; + p->buf[p->pos++] = *src++; + (*srcLen)++; + } + else + { + RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)); + p->numStartedStreams++; + p->state = XZ_STATE_BLOCK_HEADER; + Sha256_Init(&p->sha); + p->indexSize = 0; + p->numBlocks = 0; + p->pos = 0; + } + break; + } + + case XZ_STATE_BLOCK_HEADER: + { + if (p->pos == 0) + { + p->buf[p->pos++] = *src++; + (*srcLen)++; + if (p->buf[0] == 0) + { + p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks); + p->indexPos = p->indexPreSize; + p->indexSize += p->indexPreSize; + Sha256_Final(&p->sha, p->shaDigest); + Sha256_Init(&p->sha); + p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize); + p->state = XZ_STATE_STREAM_INDEX; + } + p->blockHeaderSize = ((UInt32)p->buf[0] << 2) + 4; + } + else if (p->pos != p->blockHeaderSize) + { + UInt32 cur = p->blockHeaderSize - p->pos; + if (cur > srcRem) + cur = (UInt32)srcRem; + memcpy(p->buf + p->pos, src, cur); + p->pos += cur; + (*srcLen) += cur; + src += cur; + } + else + { + RINOK(XzBlock_Parse(&p->block, p->buf)); + p->numTotalBlocks++; + p->state = XZ_STATE_BLOCK; + p->packSize = 0; + p->unpackSize = 0; + XzCheck_Init(&p->check, XzFlags_GetCheckType(p->streamFlags)); + RINOK(XzDec_Init(&p->decoder, &p->block)); + } + break; + } + + case XZ_STATE_BLOCK_FOOTER: + { + if (((p->packSize + p->alignPos) & 3) != 0) + { + (*srcLen)++; + p->alignPos++; + if (*src++ != 0) + return SZ_ERROR_CRC; + } + else + { + UInt32 checkSize = XzFlags_GetCheckSize(p->streamFlags); + UInt32 cur = checkSize - p->pos; + if (cur != 0) + { + if (cur > srcRem) + cur = (UInt32)srcRem; + memcpy(p->buf + p->pos, src, cur); + p->pos += cur; + (*srcLen) += cur; + src += cur; + } + else + { + Byte digest[XZ_CHECK_SIZE_MAX]; + p->state = XZ_STATE_BLOCK_HEADER; + p->pos = 0; + if (XzCheck_Final(&p->check, digest) && memcmp(digest, p->buf, checkSize) != 0) + return SZ_ERROR_CRC; + } + } + break; + } + + case XZ_STATE_STREAM_INDEX: + { + if (p->pos < p->indexPreSize) + { + (*srcLen)++; + if (*src++ != p->buf[p->pos++]) + return SZ_ERROR_CRC; + } + else + { + if (p->indexPos < p->indexSize) + { + UInt64 cur = p->indexSize - p->indexPos; + if (srcRem > cur) + srcRem = (SizeT)cur; + p->crc = CrcUpdate(p->crc, src, srcRem); + Sha256_Update(&p->sha, src, srcRem); + (*srcLen) += srcRem; + src += srcRem; + p->indexPos += srcRem; + } + else if ((p->indexPos & 3) != 0) + { + Byte b = *src++; + p->crc = CRC_UPDATE_BYTE(p->crc, b); + (*srcLen)++; + p->indexPos++; + p->indexSize++; + if (b != 0) + return SZ_ERROR_CRC; + } + else + { + Byte digest[SHA256_DIGEST_SIZE]; + p->state = XZ_STATE_STREAM_INDEX_CRC; + p->indexSize += 4; + p->pos = 0; + Sha256_Final(&p->sha, digest); + if (memcmp(digest, p->shaDigest, SHA256_DIGEST_SIZE) != 0) + return SZ_ERROR_CRC; + } + } + break; + } + + case XZ_STATE_STREAM_INDEX_CRC: + { + if (p->pos < 4) + { + (*srcLen)++; + p->buf[p->pos++] = *src++; + } + else + { + p->state = XZ_STATE_STREAM_FOOTER; + p->pos = 0; + if (CRC_GET_DIGEST(p->crc) != GetUi32(p->buf)) + return SZ_ERROR_CRC; + } + break; + } + + case XZ_STATE_STREAM_FOOTER: + { + UInt32 cur = XZ_STREAM_FOOTER_SIZE - p->pos; + if (cur > srcRem) + cur = (UInt32)srcRem; + memcpy(p->buf + p->pos, src, cur); + p->pos += cur; + (*srcLen) += cur; + src += cur; + if (p->pos == XZ_STREAM_FOOTER_SIZE) + { + p->state = XZ_STATE_STREAM_PADDING; + p->numFinishedStreams++; + p->padSize = 0; + if (!Xz_CheckFooter(p->streamFlags, p->indexSize, p->buf)) + return SZ_ERROR_CRC; + } + break; + } + + case XZ_STATE_STREAM_PADDING: + { + if (*src != 0) + { + if (((UInt32)p->padSize & 3) != 0) + return SZ_ERROR_NO_ARCHIVE; + p->pos = 0; + p->state = XZ_STATE_STREAM_HEADER; + } + else + { + (*srcLen)++; + src++; + p->padSize++; + } + break; + } + + case XZ_STATE_BLOCK: break; /* to disable GCC warning */ + } + } + /* + if (p->state == XZ_STATE_FINISHED) + *status = CODER_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + */ +} + +Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p) +{ + return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0); +} + +UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p) +{ + UInt64 num = 0; + if (p->state == XZ_STATE_STREAM_PADDING) + num += p->padSize; + else if (p->state == XZ_STATE_STREAM_HEADER) + num += p->padSize + p->pos; + return num; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzEnc.c b/Provenance/LzmaSDKObjC/lzma/C/XzEnc.c new file mode 100644 index 0000000000..2e5a003ad2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzEnc.c @@ -0,0 +1,538 @@ +/* XzEnc.c -- Xz Encode +2015-09-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include +#include + +#include "7zCrc.h" +#include "Alloc.h" +#include "Bra.h" +#include "CpuArch.h" + +#ifdef USE_SUBBLOCK +#include "Bcj3Enc.c" +#include "SbFind.c" +#include "SbEnc.c" +#endif + +#include "XzEnc.h" + +#define XzBlock_ClearFlags(p) (p)->flags = 0; +#define XzBlock_SetNumFilters(p, n) (p)->flags |= ((n) - 1); +#define XzBlock_SetHasPackSize(p) (p)->flags |= XZ_BF_PACK_SIZE; +#define XzBlock_SetHasUnpackSize(p) (p)->flags |= XZ_BF_UNPACK_SIZE; + +static SRes WriteBytes(ISeqOutStream *s, const void *buf, UInt32 size) +{ + return (s->Write(s, buf, size) == size) ? SZ_OK : SZ_ERROR_WRITE; +} + +static SRes WriteBytesAndCrc(ISeqOutStream *s, const void *buf, UInt32 size, UInt32 *crc) +{ + *crc = CrcUpdate(*crc, buf, size); + return WriteBytes(s, buf, size); +} + +static SRes Xz_WriteHeader(CXzStreamFlags f, ISeqOutStream *s) +{ + UInt32 crc; + Byte header[XZ_STREAM_HEADER_SIZE]; + memcpy(header, XZ_SIG, XZ_SIG_SIZE); + header[XZ_SIG_SIZE] = (Byte)(f >> 8); + header[XZ_SIG_SIZE + 1] = (Byte)(f & 0xFF); + crc = CrcCalc(header + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE); + SetUi32(header + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE, crc); + return WriteBytes(s, header, XZ_STREAM_HEADER_SIZE); +} + + +static SRes XzBlock_WriteHeader(const CXzBlock *p, ISeqOutStream *s) +{ + Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; + + unsigned pos = 1; + unsigned numFilters, i; + header[pos++] = p->flags; + + if (XzBlock_HasPackSize(p)) pos += Xz_WriteVarInt(header + pos, p->packSize); + if (XzBlock_HasUnpackSize(p)) pos += Xz_WriteVarInt(header + pos, p->unpackSize); + numFilters = XzBlock_GetNumFilters(p); + + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &p->filters[i]; + pos += Xz_WriteVarInt(header + pos, f->id); + pos += Xz_WriteVarInt(header + pos, f->propsSize); + memcpy(header + pos, f->props, f->propsSize); + pos += f->propsSize; + } + + while ((pos & 3) != 0) + header[pos++] = 0; + + header[0] = (Byte)(pos >> 2); + SetUi32(header + pos, CrcCalc(header, pos)); + return WriteBytes(s, header, pos + 4); +} + + +static SRes Xz_WriteFooter(CXzStream *p, ISeqOutStream *s) +{ + Byte buf[32]; + UInt64 globalPos; + { + UInt32 crc = CRC_INIT_VAL; + unsigned pos = 1 + Xz_WriteVarInt(buf + 1, p->numBlocks); + size_t i; + + globalPos = pos; + buf[0] = 0; + RINOK(WriteBytesAndCrc(s, buf, pos, &crc)); + + for (i = 0; i < p->numBlocks; i++) + { + const CXzBlockSizes *block = &p->blocks[i]; + pos = Xz_WriteVarInt(buf, block->totalSize); + pos += Xz_WriteVarInt(buf + pos, block->unpackSize); + globalPos += pos; + RINOK(WriteBytesAndCrc(s, buf, pos, &crc)); + } + + pos = ((unsigned)globalPos & 3); + + if (pos != 0) + { + buf[0] = buf[1] = buf[2] = 0; + RINOK(WriteBytesAndCrc(s, buf, 4 - pos, &crc)); + globalPos += 4 - pos; + } + { + SetUi32(buf, CRC_GET_DIGEST(crc)); + RINOK(WriteBytes(s, buf, 4)); + globalPos += 4; + } + } + + { + UInt32 indexSize = (UInt32)((globalPos >> 2) - 1); + SetUi32(buf + 4, indexSize); + buf[8] = (Byte)(p->flags >> 8); + buf[9] = (Byte)(p->flags & 0xFF); + SetUi32(buf, CrcCalc(buf + 4, 6)); + memcpy(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE); + return WriteBytes(s, buf, 12); + } +} + + +static SRes Xz_AddIndexRecord(CXzStream *p, UInt64 unpackSize, UInt64 totalSize, ISzAlloc *alloc) +{ + if (!p->blocks || p->numBlocksAllocated == p->numBlocks) + { + size_t num = p->numBlocks * 2 + 1; + size_t newSize = sizeof(CXzBlockSizes) * num; + CXzBlockSizes *blocks; + if (newSize / sizeof(CXzBlockSizes) != num) + return SZ_ERROR_MEM; + blocks = (CXzBlockSizes *)alloc->Alloc(alloc, newSize); + if (!blocks) + return SZ_ERROR_MEM; + if (p->numBlocks != 0) + { + memcpy(blocks, p->blocks, p->numBlocks * sizeof(CXzBlockSizes)); + alloc->Free(alloc, p->blocks); + } + p->blocks = blocks; + p->numBlocksAllocated = num; + } + { + CXzBlockSizes *block = &p->blocks[p->numBlocks++]; + block->unpackSize = unpackSize; + block->totalSize = totalSize; + } + return SZ_OK; +} + + +/* ---------- CSeqCheckInStream ---------- */ + +typedef struct +{ + ISeqInStream p; + ISeqInStream *realStream; + UInt64 processed; + CXzCheck check; +} CSeqCheckInStream; + +static void SeqCheckInStream_Init(CSeqCheckInStream *p, unsigned mode) +{ + p->processed = 0; + XzCheck_Init(&p->check, mode); +} + +static void SeqCheckInStream_GetDigest(CSeqCheckInStream *p, Byte *digest) +{ + XzCheck_Final(&p->check, digest); +} + +static SRes SeqCheckInStream_Read(void *pp, void *data, size_t *size) +{ + CSeqCheckInStream *p = (CSeqCheckInStream *)pp; + SRes res = p->realStream->Read(p->realStream, data, size); + XzCheck_Update(&p->check, data, *size); + p->processed += *size; + return res; +} + + +/* ---------- CSeqSizeOutStream ---------- */ + +typedef struct +{ + ISeqOutStream p; + ISeqOutStream *realStream; + UInt64 processed; +} CSeqSizeOutStream; + +static size_t MyWrite(void *pp, const void *data, size_t size) +{ + CSeqSizeOutStream *p = (CSeqSizeOutStream *)pp; + size = p->realStream->Write(p->realStream, data, size); + p->processed += size; + return size; +} + + +/* ---------- CSeqInFilter ---------- */ + +#define FILTER_BUF_SIZE (1 << 20) + +typedef struct +{ + ISeqInStream p; + ISeqInStream *realStream; + IStateCoder StateCoder; + Byte *buf; + size_t curPos; + size_t endPos; + int srcWasFinished; +} CSeqInFilter; + +static SRes SeqInFilter_Read(void *pp, void *data, size_t *size) +{ + CSeqInFilter *p = (CSeqInFilter *)pp; + size_t sizeOriginal = *size; + if (sizeOriginal == 0) + return SZ_OK; + *size = 0; + + for (;;) + { + if (!p->srcWasFinished && p->curPos == p->endPos) + { + p->curPos = 0; + p->endPos = FILTER_BUF_SIZE; + RINOK(p->realStream->Read(p->realStream, p->buf, &p->endPos)); + if (p->endPos == 0) + p->srcWasFinished = 1; + } + { + SizeT srcLen = p->endPos - p->curPos; + int wasFinished; + SRes res; + *size = sizeOriginal; + res = p->StateCoder.Code(p->StateCoder.p, data, size, p->buf + p->curPos, &srcLen, + p->srcWasFinished, CODER_FINISH_ANY, &wasFinished); + p->curPos += srcLen; + if (*size != 0 || srcLen == 0 || res != 0) + return res; + } + } +} + +static void SeqInFilter_Construct(CSeqInFilter *p) +{ + p->buf = NULL; + p->p.Read = SeqInFilter_Read; +} + +static void SeqInFilter_Free(CSeqInFilter *p) +{ + if (p->buf) + { + g_Alloc.Free(&g_Alloc, p->buf); + p->buf = NULL; + } +} + +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc *alloc); + +static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props) +{ + if (!p->buf) + { + p->buf = g_Alloc.Alloc(&g_Alloc, FILTER_BUF_SIZE); + if (!p->buf) + return SZ_ERROR_MEM; + } + p->curPos = p->endPos = 0; + p->srcWasFinished = 0; + RINOK(BraState_SetFromMethod(&p->StateCoder, props->id, 1, &g_Alloc)); + RINOK(p->StateCoder.SetProps(p->StateCoder.p, props->props, props->propsSize, &g_Alloc)); + p->StateCoder.Init(p->StateCoder.p); + return SZ_OK; +} + + +/* ---------- CSbEncInStream ---------- */ + +#ifdef USE_SUBBLOCK + +typedef struct +{ + ISeqInStream p; + ISeqInStream *inStream; + CSbEnc enc; +} CSbEncInStream; + +static SRes SbEncInStream_Read(void *pp, void *data, size_t *size) +{ + CSbEncInStream *p = (CSbEncInStream *)pp; + size_t sizeOriginal = *size; + if (sizeOriginal == 0) + return S_OK; + + for (;;) + { + if (p->enc.needRead && !p->enc.readWasFinished) + { + size_t processed = p->enc.needReadSizeMax; + RINOK(p->inStream->Read(p->inStream, p->enc.buf + p->enc.readPos, &processed)); + p->enc.readPos += processed; + if (processed == 0) + { + p->enc.readWasFinished = True; + p->enc.isFinalFinished = True; + } + p->enc.needRead = False; + } + + *size = sizeOriginal; + RINOK(SbEnc_Read(&p->enc, data, size)); + if (*size != 0 || !p->enc.needRead) + return S_OK; + } +} + +void SbEncInStream_Construct(CSbEncInStream *p, ISzAlloc *alloc) +{ + SbEnc_Construct(&p->enc, alloc); + p->p.Read = SbEncInStream_Read; +} + +SRes SbEncInStream_Init(CSbEncInStream *p) +{ + return SbEnc_Init(&p->enc); +} + +void SbEncInStream_Free(CSbEncInStream *p) +{ + SbEnc_Free(&p->enc); +} + +#endif + + +typedef struct +{ + CLzma2EncHandle lzma2; + #ifdef USE_SUBBLOCK + CSbEncInStream sb; + #endif + CSeqInFilter filter; + ISzAlloc *alloc; + ISzAlloc *bigAlloc; +} CLzma2WithFilters; + + +static void Lzma2WithFilters_Construct(CLzma2WithFilters *p, ISzAlloc *alloc, ISzAlloc *bigAlloc) +{ + p->alloc = alloc; + p->bigAlloc = bigAlloc; + p->lzma2 = NULL; + #ifdef USE_SUBBLOCK + SbEncInStream_Construct(&p->sb, alloc); + #endif + SeqInFilter_Construct(&p->filter); +} + +static SRes Lzma2WithFilters_Create(CLzma2WithFilters *p) +{ + p->lzma2 = Lzma2Enc_Create(p->alloc, p->bigAlloc); + if (!p->lzma2) + return SZ_ERROR_MEM; + return SZ_OK; +} + +static void Lzma2WithFilters_Free(CLzma2WithFilters *p) +{ + SeqInFilter_Free(&p->filter); + #ifdef USE_SUBBLOCK + SbEncInStream_Free(&p->sb); + #endif + if (p->lzma2) + { + Lzma2Enc_Destroy(p->lzma2); + p->lzma2 = NULL; + } +} + + +void XzProps_Init(CXzProps *p) +{ + p->lzma2Props = NULL; + p->filterProps = NULL; + p->checkId = XZ_CHECK_CRC32; +} + +void XzFilterProps_Init(CXzFilterProps *p) +{ + p->id = 0; + p->delta = 0; + p->ip = 0; + p->ipDefined = False; +} + + +static SRes Xz_Compress(CXzStream *xz, CLzma2WithFilters *lzmaf, + ISeqOutStream *outStream, ISeqInStream *inStream, + const CXzProps *props, ICompressProgress *progress) +{ + xz->flags = (Byte)props->checkId; + + RINOK(Lzma2Enc_SetProps(lzmaf->lzma2, props->lzma2Props)); + RINOK(Xz_WriteHeader(xz->flags, outStream)); + + { + CSeqCheckInStream checkInStream; + CSeqSizeOutStream seqSizeOutStream; + CXzBlock block; + unsigned filterIndex = 0; + CXzFilter *filter = NULL; + const CXzFilterProps *fp = props->filterProps; + + XzBlock_ClearFlags(&block); + XzBlock_SetNumFilters(&block, 1 + (fp ? 1 : 0)); + + if (fp) + { + filter = &block.filters[filterIndex++]; + filter->id = fp->id; + filter->propsSize = 0; + + if (fp->id == XZ_ID_Delta) + { + filter->props[0] = (Byte)(fp->delta - 1); + filter->propsSize = 1; + } + else if (fp->ipDefined) + { + SetUi32(filter->props, fp->ip); + filter->propsSize = 4; + } + } + + { + CXzFilter *f = &block.filters[filterIndex++]; + f->id = XZ_ID_LZMA2; + f->propsSize = 1; + f->props[0] = Lzma2Enc_WriteProperties(lzmaf->lzma2); + } + + seqSizeOutStream.p.Write = MyWrite; + seqSizeOutStream.realStream = outStream; + seqSizeOutStream.processed = 0; + + RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.p)); + + checkInStream.p.Read = SeqCheckInStream_Read; + checkInStream.realStream = inStream; + SeqCheckInStream_Init(&checkInStream, XzFlags_GetCheckType(xz->flags)); + + if (fp) + { + #ifdef USE_SUBBLOCK + if (fp->id == XZ_ID_Subblock) + { + lzmaf->sb.inStream = &checkInStream.p; + RINOK(SbEncInStream_Init(&lzmaf->sb)); + } + else + #endif + { + lzmaf->filter.realStream = &checkInStream.p; + RINOK(SeqInFilter_Init(&lzmaf->filter, filter)); + } + } + + { + UInt64 packPos = seqSizeOutStream.processed; + + SRes res = Lzma2Enc_Encode(lzmaf->lzma2, &seqSizeOutStream.p, + fp ? + #ifdef USE_SUBBLOCK + (fp->id == XZ_ID_Subblock) ? &lzmaf->sb.p: + #endif + &lzmaf->filter.p: + &checkInStream.p, + progress); + + RINOK(res); + block.unpackSize = checkInStream.processed; + block.packSize = seqSizeOutStream.processed - packPos; + } + + { + unsigned padSize = 0; + Byte buf[128]; + while ((((unsigned)block.packSize + padSize) & 3) != 0) + buf[padSize++] = 0; + SeqCheckInStream_GetDigest(&checkInStream, buf + padSize); + RINOK(WriteBytes(&seqSizeOutStream.p, buf, padSize + XzFlags_GetCheckSize(xz->flags))); + RINOK(Xz_AddIndexRecord(xz, block.unpackSize, seqSizeOutStream.processed - padSize, &g_Alloc)); + } + } + return Xz_WriteFooter(xz, outStream); +} + + +SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, + const CXzProps *props, ICompressProgress *progress) +{ + SRes res; + CXzStream xz; + CLzma2WithFilters lzmaf; + Xz_Construct(&xz); + Lzma2WithFilters_Construct(&lzmaf, &g_Alloc, &g_BigAlloc); + res = Lzma2WithFilters_Create(&lzmaf); + if (res == SZ_OK) + res = Xz_Compress(&xz, &lzmaf, outStream, inStream, props, progress); + Lzma2WithFilters_Free(&lzmaf); + Xz_Free(&xz, &g_Alloc); + return res; +} + + +SRes Xz_EncodeEmpty(ISeqOutStream *outStream) +{ + SRes res; + CXzStream xz; + Xz_Construct(&xz); + res = Xz_WriteHeader(xz.flags, outStream); + if (res == SZ_OK) + res = Xz_WriteFooter(&xz, outStream); + Xz_Free(&xz, &g_Alloc); + return res; +} diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzEnc.h b/Provenance/LzmaSDKObjC/lzma/C/XzEnc.h new file mode 100644 index 0000000000..e9cea34f7c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzEnc.h @@ -0,0 +1,39 @@ +/* XzEnc.h -- Xz Encode +2011-02-07 : Igor Pavlov : Public domain */ + +#ifndef __XZ_ENC_H +#define __XZ_ENC_H + +#include "Lzma2Enc.h" + +#include "Xz.h" + +EXTERN_C_BEGIN + +typedef struct +{ + UInt32 id; + UInt32 delta; + UInt32 ip; + int ipDefined; +} CXzFilterProps; + +void XzFilterProps_Init(CXzFilterProps *p); + +typedef struct +{ + const CLzma2EncProps *lzma2Props; + const CXzFilterProps *filterProps; + unsigned checkId; +} CXzProps; + +void XzProps_Init(CXzProps *p); + +SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, + const CXzProps *props, ICompressProgress *progress); + +SRes Xz_EncodeEmpty(ISeqOutStream *outStream); + +EXTERN_C_END + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/C/XzIn.c b/Provenance/LzmaSDKObjC/lzma/C/XzIn.c new file mode 100644 index 0000000000..aaa0597305 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/C/XzIn.c @@ -0,0 +1,313 @@ +/* XzIn.c - Xz input +2015-11-08 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zCrc.h" +#include "CpuArch.h" +#include "Xz.h" + +SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) +{ + Byte sig[XZ_STREAM_HEADER_SIZE]; + RINOK(SeqInStream_Read2(inStream, sig, XZ_STREAM_HEADER_SIZE, SZ_ERROR_NO_ARCHIVE)); + if (memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0) + return SZ_ERROR_NO_ARCHIVE; + return Xz_ParseHeader(p, sig); +} + +#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ + { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ + if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } + +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, Bool *isIndex, UInt32 *headerSizeRes) +{ + Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; + unsigned headerSize; + *headerSizeRes = 0; + RINOK(SeqInStream_ReadByte(inStream, &header[0])); + headerSize = ((unsigned)header[0] << 2) + 4; + if (headerSize == 0) + { + *headerSizeRes = 1; + *isIndex = True; + return SZ_OK; + } + + *isIndex = False; + *headerSizeRes = headerSize; + RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1)); + return XzBlock_Parse(p, header); +} + +#define ADD_SIZE_CHECH(size, val) \ + { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; } + +UInt64 Xz_GetUnpackSize(const CXzStream *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->numBlocks; i++) + ADD_SIZE_CHECH(size, p->blocks[i].unpackSize); + return size; +} + +UInt64 Xz_GetPackSize(const CXzStream *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->numBlocks; i++) + ADD_SIZE_CHECH(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3); + return size; +} + +/* +SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream) +{ + return SeqInStream_Read(inStream, p->check, XzFlags_GetCheckSize(f)); +} +*/ + +static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAlloc *alloc) +{ + size_t numBlocks, pos = 1; + UInt32 crc; + + if (size < 5 || buf[0] != 0) + return SZ_ERROR_ARCHIVE; + + size -= 4; + crc = CrcCalc(buf, size); + if (crc != GetUi32(buf + size)) + return SZ_ERROR_ARCHIVE; + + { + UInt64 numBlocks64; + READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64); + numBlocks = (size_t)numBlocks64; + if (numBlocks != numBlocks64 || numBlocks * 2 > size) + return SZ_ERROR_ARCHIVE; + } + + Xz_Free(p, alloc); + if (numBlocks != 0) + { + size_t i; + p->numBlocks = numBlocks; + p->numBlocksAllocated = numBlocks; + p->blocks = alloc->Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks); + if (p->blocks == 0) + return SZ_ERROR_MEM; + for (i = 0; i < numBlocks; i++) + { + CXzBlockSizes *block = &p->blocks[i]; + READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize); + READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize); + if (block->totalSize == 0) + return SZ_ERROR_ARCHIVE; + } + } + while ((pos & 3) != 0) + if (buf[pos++] != 0) + return SZ_ERROR_ARCHIVE; + return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; +} + +static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAlloc *alloc) +{ + SRes res; + size_t size; + Byte *buf; + if (indexSize > ((UInt32)1 << 31)) + return SZ_ERROR_UNSUPPORTED; + size = (size_t)indexSize; + if (size != indexSize) + return SZ_ERROR_UNSUPPORTED; + buf = alloc->Alloc(alloc, size); + if (buf == 0) + return SZ_ERROR_MEM; + res = LookInStream_Read2(stream, buf, size, SZ_ERROR_UNSUPPORTED); + if (res == SZ_OK) + res = Xz_ReadIndex2(p, buf, size, alloc); + alloc->Free(alloc, buf); + return res; +} + +static SRes LookInStream_SeekRead_ForArc(ILookInStream *stream, UInt64 offset, void *buf, size_t size) +{ + RINOK(LookInStream_SeekTo(stream, offset)); + return LookInStream_Read(stream, buf, size); + /* return LookInStream_Read2(stream, buf, size, SZ_ERROR_NO_ARCHIVE); */ +} + +static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAlloc *alloc) +{ + UInt64 indexSize; + Byte buf[XZ_STREAM_FOOTER_SIZE]; + UInt64 pos = *startOffset; + + if ((pos & 3) != 0 || pos < XZ_STREAM_FOOTER_SIZE) + return SZ_ERROR_NO_ARCHIVE; + + pos -= XZ_STREAM_FOOTER_SIZE; + RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); + + if (memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) != 0) + { + UInt32 total = 0; + pos += XZ_STREAM_FOOTER_SIZE; + + for (;;) + { + size_t i; + #define TEMP_BUF_SIZE (1 << 10) + Byte temp[TEMP_BUF_SIZE]; + + i = (pos > TEMP_BUF_SIZE) ? TEMP_BUF_SIZE : (size_t)pos; + pos -= i; + RINOK(LookInStream_SeekRead_ForArc(stream, pos, temp, i)); + total += (UInt32)i; + for (; i != 0; i--) + if (temp[i - 1] != 0) + break; + if (i != 0) + { + if ((i & 3) != 0) + return SZ_ERROR_NO_ARCHIVE; + pos += i; + break; + } + if (pos < XZ_STREAM_FOOTER_SIZE || total > (1 << 16)) + return SZ_ERROR_NO_ARCHIVE; + } + + if (pos < XZ_STREAM_FOOTER_SIZE) + return SZ_ERROR_NO_ARCHIVE; + pos -= XZ_STREAM_FOOTER_SIZE; + RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); + if (memcmp(buf + 10, XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) != 0) + return SZ_ERROR_NO_ARCHIVE; + } + + p->flags = (CXzStreamFlags)GetBe16(buf + 8); + + if (!XzFlags_IsSupported(p->flags)) + return SZ_ERROR_UNSUPPORTED; + + if (GetUi32(buf) != CrcCalc(buf + 4, 6)) + return SZ_ERROR_ARCHIVE; + + indexSize = ((UInt64)GetUi32(buf + 4) + 1) << 2; + + if (pos < indexSize) + return SZ_ERROR_ARCHIVE; + + pos -= indexSize; + RINOK(LookInStream_SeekTo(stream, pos)); + RINOK(Xz_ReadIndex(p, stream, indexSize, alloc)); + + { + UInt64 totalSize = Xz_GetPackSize(p); + if (totalSize == XZ_SIZE_OVERFLOW + || totalSize >= ((UInt64)1 << 63) + || pos < totalSize + XZ_STREAM_HEADER_SIZE) + return SZ_ERROR_ARCHIVE; + pos -= (totalSize + XZ_STREAM_HEADER_SIZE); + RINOK(LookInStream_SeekTo(stream, pos)); + *startOffset = pos; + } + { + CXzStreamFlags headerFlags; + CSecToRead secToRead; + SecToRead_CreateVTable(&secToRead); + secToRead.realStream = stream; + + RINOK(Xz_ReadHeader(&headerFlags, &secToRead.s)); + return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE; + } +} + + +/* ---------- Xz Streams ---------- */ + +void Xzs_Construct(CXzs *p) +{ + p->num = p->numAllocated = 0; + p->streams = 0; +} + +void Xzs_Free(CXzs *p, ISzAlloc *alloc) +{ + size_t i; + for (i = 0; i < p->num; i++) + Xz_Free(&p->streams[i], alloc); + alloc->Free(alloc, p->streams); + p->num = p->numAllocated = 0; + p->streams = 0; +} + +UInt64 Xzs_GetNumBlocks(const CXzs *p) +{ + UInt64 num = 0; + size_t i; + for (i = 0; i < p->num; i++) + num += p->streams[i].numBlocks; + return num; +} + +UInt64 Xzs_GetUnpackSize(const CXzs *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->num; i++) + ADD_SIZE_CHECH(size, Xz_GetUnpackSize(&p->streams[i])); + return size; +} + +/* +UInt64 Xzs_GetPackSize(const CXzs *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->num; i++) + ADD_SIZE_CHECH(size, Xz_GetTotalSize(&p->streams[i])); + return size; +} +*/ + +SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAlloc *alloc) +{ + Int64 endOffset = 0; + RINOK(stream->Seek(stream, &endOffset, SZ_SEEK_END)); + *startOffset = endOffset; + for (;;) + { + CXzStream st; + SRes res; + Xz_Construct(&st); + res = Xz_ReadBackward(&st, stream, startOffset, alloc); + st.startOffset = *startOffset; + RINOK(res); + if (p->num == p->numAllocated) + { + size_t newNum = p->num + p->num / 4 + 1; + Byte *data = (Byte *)alloc->Alloc(alloc, newNum * sizeof(CXzStream)); + if (data == 0) + return SZ_ERROR_MEM; + p->numAllocated = newNum; + if (p->num != 0) + memcpy(data, p->streams, p->num * sizeof(CXzStream)); + alloc->Free(alloc, p->streams); + p->streams = (CXzStream *)data; + } + p->streams[p->num++] = st; + if (*startOffset == 0) + break; + RINOK(LookInStream_SeekTo(stream, *startOffset)); + if (progress && progress->Progress(progress, endOffset - *startOffset, (UInt64)(Int64)-1) != SZ_OK) + return SZ_ERROR_PROGRESS; + } + return SZ_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp new file mode 100644 index 0000000000..232c638203 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp @@ -0,0 +1,3 @@ +// CompressionMethod.cpp + +#include "StdAfx.h" diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h new file mode 100644 index 0000000000..80e4154521 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h @@ -0,0 +1,74 @@ +// 7zCompressionMode.h + +#ifndef __7Z_COMPRESSION_MODE_H +#define __7Z_COMPRESSION_MODE_H + +#include "../../Common/MethodId.h" +#include "../../Common/MethodProps.h" + +namespace NArchive { +namespace N7z { + +struct CMethodFull: public CMethodProps +{ + CMethodId Id; + UInt32 NumStreams; + + bool IsSimpleCoder() const { return NumStreams == 1; } +}; + +struct CBond2 +{ + UInt32 OutCoder; + UInt32 OutStream; + UInt32 InCoder; +}; + +struct CCompressionMethodMode +{ + /* + if (Bonds.Empty()), then default bonds must be created + if (Filter_was_Inserted) + { + Methods[0] is filter method + Bonds don't contain bonds for filter (these bonds must be created) + } + */ + + CObjectVector Methods; + CRecordVector Bonds; + + bool IsThereBond_to_Coder(unsigned coderIndex) const + { + FOR_VECTOR(i, Bonds) + if (Bonds[i].InCoder == coderIndex) + return true; + return false; + } + + bool DefaultMethod_was_Inserted; + bool Filter_was_Inserted; + + #ifndef _7ZIP_ST + UInt32 NumThreads; + bool MultiThreadMixer; + #endif + + bool PasswordIsDefined; + UString Password; + + bool IsEmpty() const { return (Methods.IsEmpty() && !PasswordIsDefined); } + CCompressionMethodMode(): + DefaultMethod_was_Inserted(false), + Filter_was_Inserted(false), + PasswordIsDefined(false) + #ifndef _7ZIP_ST + , NumThreads(1) + , MultiThreadMixer(true) + #endif + {} +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zDecode.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zDecode.cpp new file mode 100644 index 0000000000..1f709cbe37 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zDecode.cpp @@ -0,0 +1,543 @@ +// 7zDecode.cpp + +#include "StdAfx.h" + +#include "../../Common/LimitedStreams.h" +#include "../../Common/ProgressUtils.h" +#include "../../Common/StreamObjects.h" + +#include "7zDecode.h" + +namespace NArchive { +namespace N7z { + +class CDecProgress: + public ICompressProgressInfo, + public CMyUnknownImp +{ + CMyComPtr _progress; +public: + CDecProgress(ICompressProgressInfo *progress): _progress(progress) {} + + MY_UNKNOWN_IMP1(ICompressProgressInfo) + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); +}; + +STDMETHODIMP CDecProgress::SetRatioInfo(const UInt64 * /* inSize */, const UInt64 *outSize) +{ + return _progress->SetRatioInfo(NULL, outSize); +} + +static void Convert_FolderInfo_to_BindInfo(const CFolderEx &folder, CBindInfoEx &bi) +{ + bi.Clear(); + + bi.Bonds.ClearAndSetSize(folder.Bonds.Size()); + unsigned i; + for (i = 0; i < folder.Bonds.Size(); i++) + { + NCoderMixer2::CBond &bond = bi.Bonds[i]; + const N7z::CBond &folderBond = folder.Bonds[i]; + bond.PackIndex = folderBond.PackIndex; + bond.UnpackIndex = folderBond.UnpackIndex; + } + + bi.Coders.ClearAndSetSize(folder.Coders.Size()); + bi.CoderMethodIDs.ClearAndSetSize(folder.Coders.Size()); + for (i = 0; i < folder.Coders.Size(); i++) + { + const CCoderInfo &coderInfo = folder.Coders[i]; + bi.Coders[i].NumStreams = coderInfo.NumStreams; + bi.CoderMethodIDs[i] = coderInfo.MethodID; + } + + /* + if (!bi.SetUnpackCoder()) + throw 1112; + */ + bi.UnpackCoder = folder.UnpackCoder; + bi.PackStreams.ClearAndSetSize(folder.PackStreams.Size()); + for (i = 0; i < folder.PackStreams.Size(); i++) + bi.PackStreams[i] = folder.PackStreams[i]; +} + +static inline bool AreCodersEqual( + const NCoderMixer2::CCoderStreamsInfo &a1, + const NCoderMixer2::CCoderStreamsInfo &a2) +{ + return (a1.NumStreams == a2.NumStreams); +} + +static inline bool AreBondsEqual( + const NCoderMixer2::CBond &a1, + const NCoderMixer2::CBond &a2) +{ + return + (a1.PackIndex == a2.PackIndex) && + (a1.UnpackIndex == a2.UnpackIndex); +} + +static bool AreBindInfoExEqual(const CBindInfoEx &a1, const CBindInfoEx &a2) +{ + if (a1.Coders.Size() != a2.Coders.Size()) + return false; + unsigned i; + for (i = 0; i < a1.Coders.Size(); i++) + if (!AreCodersEqual(a1.Coders[i], a2.Coders[i])) + return false; + + if (a1.Bonds.Size() != a2.Bonds.Size()) + return false; + for (i = 0; i < a1.Bonds.Size(); i++) + if (!AreBondsEqual(a1.Bonds[i], a2.Bonds[i])) + return false; + + for (i = 0; i < a1.CoderMethodIDs.Size(); i++) + if (a1.CoderMethodIDs[i] != a2.CoderMethodIDs[i]) + return false; + + if (a1.PackStreams.Size() != a2.PackStreams.Size()) + return false; + for (i = 0; i < a1.PackStreams.Size(); i++) + if (a1.PackStreams[i] != a2.PackStreams[i]) + return false; + + /* + if (a1.UnpackCoder != a2.UnpackCoder) + return false; + */ + return true; +} + +CDecoder::CDecoder(bool useMixerMT): + _bindInfoPrev_Defined(false), + _useMixerMT(useMixerMT) +{} + + +struct CLockedInStream: + public IUnknown, + public CMyUnknownImp +{ + CMyComPtr Stream; + UInt64 Pos; + + MY_UNKNOWN_IMP + + #ifdef USE_MIXER_MT + NWindows::NSynchronization::CCriticalSection CriticalSection; + #endif +}; + + +#ifdef USE_MIXER_MT + +class CLockedSequentialInStreamMT: + public ISequentialInStream, + public CMyUnknownImp +{ + CLockedInStream *_glob; + UInt64 _pos; + CMyComPtr _globRef; +public: + void Init(CLockedInStream *lockedInStream, UInt64 startPos) + { + _globRef = lockedInStream; + _glob = lockedInStream; + _pos = startPos; + } + + MY_UNKNOWN_IMP1(ISequentialInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CLockedSequentialInStreamMT::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + NWindows::NSynchronization::CCriticalSectionLock lock(_glob->CriticalSection); + + if (_pos != _glob->Pos) + { + RINOK(_glob->Stream->Seek(_pos, STREAM_SEEK_SET, NULL)); + _glob->Pos = _pos; + } + + UInt32 realProcessedSize = 0; + HRESULT res = _glob->Stream->Read(data, size, &realProcessedSize); + _pos += realProcessedSize; + _glob->Pos = _pos; + if (processedSize) + *processedSize = realProcessedSize; + return res; +} + +#endif + + +#ifdef USE_MIXER_ST + +class CLockedSequentialInStreamST: + public ISequentialInStream, + public CMyUnknownImp +{ + CLockedInStream *_glob; + UInt64 _pos; + CMyComPtr _globRef; +public: + void Init(CLockedInStream *lockedInStream, UInt64 startPos) + { + _globRef = lockedInStream; + _glob = lockedInStream; + _pos = startPos; + } + + MY_UNKNOWN_IMP1(ISequentialInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CLockedSequentialInStreamST::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (_pos != _glob->Pos) + { + RINOK(_glob->Stream->Seek(_pos, STREAM_SEEK_SET, NULL)); + _glob->Pos = _pos; + } + + UInt32 realProcessedSize = 0; + HRESULT res = _glob->Stream->Read(data, size, &realProcessedSize); + _pos += realProcessedSize; + _glob->Pos = _pos; + if (processedSize) + *processedSize = realProcessedSize; + return res; +} + +#endif + + + +HRESULT CDecoder::Decode( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + UInt64 startPos, + const CFolders &folders, unsigned folderIndex, + const UInt64 *unpackSize + + , ISequentialOutStream *outStream + , ICompressProgressInfo *compressProgress + , ISequentialInStream ** + + #ifdef USE_MIXER_ST + inStreamMainRes + #endif + + _7Z_DECODER_CRYPRO_VARS_DECL + + #if !defined(_7ZIP_ST) && !defined(_SFX) + , bool mtMode, UInt32 numThreads + #endif + ) +{ + const UInt64 *packPositions = &folders.PackPositions[folders.FoStartPackStreamIndex[folderIndex]]; + CFolderEx folderInfo; + folders.ParseFolderEx(folderIndex, folderInfo); + + if (!folderInfo.IsDecodingSupported()) + return E_NOTIMPL; + + CBindInfoEx bindInfo; + Convert_FolderInfo_to_BindInfo(folderInfo, bindInfo); + if (!bindInfo.CalcMapsAndCheck()) + return E_NOTIMPL; + + UInt64 folderUnpackSize = folders.GetFolderUnpackSize(folderIndex); + bool fullUnpack = true; + if (unpackSize) + { + if (*unpackSize > folderUnpackSize) + return E_FAIL; + fullUnpack = (*unpackSize == folderUnpackSize); + } + + /* + We don't need to init isEncrypted and passwordIsDefined + We must upgrade them only + + #ifndef _NO_CRYPTO + isEncrypted = false; + passwordIsDefined = false; + #endif + */ + + if (!_bindInfoPrev_Defined || !AreBindInfoExEqual(bindInfo, _bindInfoPrev)) + { + _mixerRef.Release(); + + #ifdef USE_MIXER_MT + #ifdef USE_MIXER_ST + if (_useMixerMT) + #endif + { + _mixerMT = new NCoderMixer2::CMixerMT(false); + _mixerRef = _mixerMT; + _mixer = _mixerMT; + } + #ifdef USE_MIXER_ST + else + #endif + #endif + { + #ifdef USE_MIXER_ST + _mixerST = new NCoderMixer2::CMixerST(false); + _mixerRef = _mixerST; + _mixer = _mixerST; + #endif + } + + RINOK(_mixer->SetBindInfo(bindInfo)); + + FOR_VECTOR(i, folderInfo.Coders) + { + const CCoderInfo &coderInfo = folderInfo.Coders[i]; + + #ifndef _SFX + // we don't support RAR codecs here + if ((coderInfo.MethodID >> 8) == 0x403) + return E_NOTIMPL; + #endif + + CCreatedCoder cod; + RINOK(CreateCoder( + EXTERNAL_CODECS_LOC_VARS + coderInfo.MethodID, false, cod)); + + if (coderInfo.IsSimpleCoder()) + { + if (!cod.Coder) + return E_NOTIMPL; + // CMethodId m = coderInfo.MethodID; + // isFilter = (IsFilterMethod(m) || m == k_AES); + } + else + { + if (!cod.Coder2 || cod.NumStreams != coderInfo.NumStreams) + return E_NOTIMPL; + } + _mixer->AddCoder(cod); + + // now there is no codec that uses another external codec + /* + #ifdef EXTERNAL_CODECS + CMyComPtr setCompressCodecsInfo; + decoderUnknown.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); + if (setCompressCodecsInfo) + { + // we must use g_ExternalCodecs also + RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(__externalCodecs->GetCodecs)); + } + #endif + */ + } + + _bindInfoPrev = bindInfo; + _bindInfoPrev_Defined = true; + } + + _mixer->ReInit(); + + UInt32 packStreamIndex = 0; + UInt32 unpackStreamIndexStart = folders.FoToCoderUnpackSizes[folderIndex]; + + unsigned i; + + for (i = 0; i < folderInfo.Coders.Size(); i++) + { + const CCoderInfo &coderInfo = folderInfo.Coders[i]; + IUnknown *decoder = _mixer->GetCoder(i).GetUnknown(); + + { + CMyComPtr setDecoderProperties; + decoder->QueryInterface(IID_ICompressSetDecoderProperties2, (void **)&setDecoderProperties); + if (setDecoderProperties) + { + const CByteBuffer &props = coderInfo.Props; + size_t size = props.Size(); + if (size > 0xFFFFFFFF) + return E_NOTIMPL; + HRESULT res = setDecoderProperties->SetDecoderProperties2((const Byte *)props, (UInt32)size); + if (res == E_INVALIDARG) + res = E_NOTIMPL; + RINOK(res); + } + } + + #if !defined(_7ZIP_ST) && !defined(_SFX) + if (mtMode) + { + CMyComPtr setCoderMt; + decoder->QueryInterface(IID_ICompressSetCoderMt, (void **)&setCoderMt); + if (setCoderMt) + { + RINOK(setCoderMt->SetNumberOfThreads(numThreads)); + } + } + #endif + + #ifndef _NO_CRYPTO + { + CMyComPtr cryptoSetPassword; + decoder->QueryInterface(IID_ICryptoSetPassword, (void **)&cryptoSetPassword); + if (cryptoSetPassword) + { + isEncrypted = true; + if (!getTextPassword) + return E_NOTIMPL; + CMyComBSTR passwordBSTR; + RINOK(getTextPassword->CryptoGetTextPassword(&passwordBSTR)); + passwordIsDefined = true; + password.Empty(); + size_t len = 0; + if (passwordBSTR) + { + password = passwordBSTR; + len = password.Len(); + } + CByteBuffer buffer(len * 2); + for (size_t k = 0; k < len; k++) + { + wchar_t c = passwordBSTR[k]; + ((Byte *)buffer)[k * 2] = (Byte)c; + ((Byte *)buffer)[k * 2 + 1] = (Byte)(c >> 8); + } + RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, (UInt32)buffer.Size())); + } + } + #endif + + { + CMyComPtr setFinishMode; + decoder->QueryInterface(IID_ICompressSetFinishMode, (void **)&setFinishMode); + if (setFinishMode) + { + RINOK(setFinishMode->SetFinishMode(BoolToInt(fullUnpack))); + } + } + + UInt32 numStreams = (UInt32)coderInfo.NumStreams; + + CObjArray packSizes(numStreams); + CObjArray packSizesPointers(numStreams); + + for (UInt32 j = 0; j < numStreams; j++, packStreamIndex++) + { + int bond = folderInfo.FindBond_for_PackStream(packStreamIndex); + + if (bond >= 0) + packSizesPointers[j] = &folders.CoderUnpackSizes[unpackStreamIndexStart + folderInfo.Bonds[(unsigned)bond].UnpackIndex]; + else + { + int index = folderInfo.Find_in_PackStreams(packStreamIndex); + if (index < 0) + return E_NOTIMPL; + packSizes[j] = packPositions[(unsigned)index + 1] - packPositions[(unsigned)index]; + packSizesPointers[j] = &packSizes[j]; + } + } + + const UInt64 *unpackSizesPointer = + (unpackSize && i == bindInfo.UnpackCoder) ? + unpackSize : + &folders.CoderUnpackSizes[unpackStreamIndexStart + i]; + + _mixer->SetCoderInfo(i, unpackSizesPointer, packSizesPointers); + } + + if (outStream) + { + _mixer->SelectMainCoder(!fullUnpack); + } + + CObjectVector< CMyComPtr > inStreams; + + CLockedInStream *lockedInStreamSpec = new CLockedInStream; + CMyComPtr lockedInStream = lockedInStreamSpec; + + bool needMtLock = false; + + if (folderInfo.PackStreams.Size() > 1) + { + // lockedInStream.Pos = (UInt64)(Int64)-1; + // RINOK(inStream->Seek(0, STREAM_SEEK_CUR, &lockedInStream.Pos)); + RINOK(inStream->Seek(startPos + packPositions[0], STREAM_SEEK_SET, &lockedInStreamSpec->Pos)); + lockedInStreamSpec->Stream = inStream; + + #ifdef USE_MIXER_ST + if (_mixer->IsThere_ExternalCoder_in_PackTree(_mixer->MainCoderIndex)) + #endif + needMtLock = true; + } + + for (unsigned j = 0; j < folderInfo.PackStreams.Size(); j++) + { + CMyComPtr packStream; + UInt64 packPos = startPos + packPositions[j]; + + if (folderInfo.PackStreams.Size() == 1) + { + RINOK(inStream->Seek(packPos, STREAM_SEEK_SET, NULL)); + packStream = inStream; + } + else + { + #ifdef USE_MIXER_MT + #ifdef USE_MIXER_ST + if (_useMixerMT || needMtLock) + #endif + { + CLockedSequentialInStreamMT *lockedStreamImpSpec = new CLockedSequentialInStreamMT; + packStream = lockedStreamImpSpec; + lockedStreamImpSpec->Init(lockedInStreamSpec, packPos); + } + #ifdef USE_MIXER_ST + else + #endif + #endif + { + #ifdef USE_MIXER_ST + CLockedSequentialInStreamST *lockedStreamImpSpec = new CLockedSequentialInStreamST; + packStream = lockedStreamImpSpec; + lockedStreamImpSpec->Init(lockedInStreamSpec, packPos); + #endif + } + } + + CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; + inStreams.AddNew() = streamSpec; + streamSpec->SetStream(packStream); + streamSpec->Init(packPositions[j + 1] - packPositions[j]); + } + + unsigned num = inStreams.Size(); + CObjArray inStreamPointers(num); + for (i = 0; i < num; i++) + inStreamPointers[i] = inStreams[i]; + + if (outStream) + { + CMyComPtr progress2; + if (compressProgress && !_mixer->Is_PackSize_Correct_for_Coder(_mixer->MainCoderIndex)) + progress2 = new CDecProgress(compressProgress); + + ISequentialOutStream *outStreamPointer = outStream; + return _mixer->Code(inStreamPointers, &outStreamPointer, progress2 ? (ICompressProgressInfo *)progress2 : compressProgress); + } + + #ifdef USE_MIXER_ST + return _mixerST->GetMainUnpackStream(inStreamPointers, inStreamMainRes); + #else + return E_FAIL; + #endif +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zDecode.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zDecode.h new file mode 100644 index 0000000000..051f843649 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zDecode.h @@ -0,0 +1,68 @@ +// 7zDecode.h + +#ifndef __7Z_DECODE_H +#define __7Z_DECODE_H + +#include "../Common/CoderMixer2.h" + +#include "7zIn.h" + +namespace NArchive { +namespace N7z { + +struct CBindInfoEx: public NCoderMixer2::CBindInfo +{ + CRecordVector CoderMethodIDs; + + void Clear() + { + CBindInfo::Clear(); + CoderMethodIDs.Clear(); + } +}; + +class CDecoder +{ + bool _bindInfoPrev_Defined; + CBindInfoEx _bindInfoPrev; + + bool _useMixerMT; + + #ifdef USE_MIXER_ST + NCoderMixer2::CMixerST *_mixerST; + #endif + + #ifdef USE_MIXER_MT + NCoderMixer2::CMixerMT *_mixerMT; + #endif + + NCoderMixer2::CMixer *_mixer; + CMyComPtr _mixerRef; + +public: + + CDecoder(bool useMixerMT); + + HRESULT Decode( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + UInt64 startPos, + const CFolders &folders, unsigned folderIndex, + const UInt64 *unpackSize // if (!unpackSize), then full folder is required + // if (unpackSize), then only *unpackSize bytes from folder are required + + , ISequentialOutStream *outStream + , ICompressProgressInfo *compressProgress + , ISequentialInStream **inStreamMainRes + + _7Z_DECODER_CRYPRO_VARS_DECL + + #if !defined(_7ZIP_ST) && !defined(_SFX) + , bool mtMode, UInt32 numThreads + #endif + ); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zEncode.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zEncode.cpp new file mode 100644 index 0000000000..7636c608f1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zEncode.cpp @@ -0,0 +1,656 @@ +// 7zEncode.cpp + +#include "StdAfx.h" + +#include "../../Common/CreateCoder.h" +#include "../../Common/FilterCoder.h" +#include "../../Common/LimitedStreams.h" +#include "../../Common/InOutTempBuffer.h" +#include "../../Common/ProgressUtils.h" +#include "../../Common/StreamObjects.h" + +#include "7zEncode.h" +#include "7zSpecStream.h" + +namespace NArchive { +namespace N7z { + +void CEncoder::InitBindConv() +{ + unsigned numIn = _bindInfo.Coders.Size(); + + _SrcIn_to_DestOut.ClearAndSetSize(numIn); + _DestOut_to_SrcIn.ClearAndSetSize(numIn); + + unsigned numOut = _bindInfo.GetNum_Bonds_and_PackStreams(); + _SrcOut_to_DestIn.ClearAndSetSize(numOut); + // _DestIn_to_SrcOut.ClearAndSetSize(numOut); + + UInt32 destIn = 0; + UInt32 destOut = 0; + + for (unsigned i = _bindInfo.Coders.Size(); i != 0;) + { + i--; + + const NCoderMixer2::CCoderStreamsInfo &coder = _bindInfo.Coders[i]; + + numIn--; + numOut -= coder.NumStreams; + + _SrcIn_to_DestOut[numIn] = destOut; + _DestOut_to_SrcIn[destOut] = numIn; + + destOut++; + + for (UInt32 j = 0; j < coder.NumStreams; j++, destIn++) + { + UInt32 index = numOut + j; + _SrcOut_to_DestIn[index] = destIn; + // _DestIn_to_SrcOut[destIn] = index; + } + } +} + +void CEncoder::SetFolder(CFolder &folder) +{ + folder.Bonds.SetSize(_bindInfo.Bonds.Size()); + + unsigned i; + + for (i = 0; i < _bindInfo.Bonds.Size(); i++) + { + CBond &fb = folder.Bonds[i]; + const NCoderMixer2::CBond &mixerBond = _bindInfo.Bonds[_bindInfo.Bonds.Size() - 1 - i]; + fb.PackIndex = _SrcOut_to_DestIn[mixerBond.PackIndex]; + fb.UnpackIndex = _SrcIn_to_DestOut[mixerBond.UnpackIndex]; + } + + folder.Coders.SetSize(_bindInfo.Coders.Size()); + + for (i = 0; i < _bindInfo.Coders.Size(); i++) + { + CCoderInfo &coderInfo = folder.Coders[i]; + const NCoderMixer2::CCoderStreamsInfo &coderStreamsInfo = _bindInfo.Coders[_bindInfo.Coders.Size() - 1 - i]; + + coderInfo.NumStreams = coderStreamsInfo.NumStreams; + coderInfo.MethodID = _decompressionMethods[i]; + // we don't free coderInfo.Props here. So coderInfo.Props can be non-empty. + } + + folder.PackStreams.SetSize(_bindInfo.PackStreams.Size()); + + for (i = 0; i < _bindInfo.PackStreams.Size(); i++) + folder.PackStreams[i] = _SrcOut_to_DestIn[_bindInfo.PackStreams[i]]; +} + + + +static HRESULT SetCoderProps2(const CProps &props, const UInt64 *dataSizeReduce, IUnknown *coder) +{ + CMyComPtr setCoderProperties; + coder->QueryInterface(IID_ICompressSetCoderProperties, (void **)&setCoderProperties); + if (setCoderProperties) + return props.SetCoderProps(setCoderProperties, dataSizeReduce); + return props.AreThereNonOptionalProps() ? E_INVALIDARG : S_OK; +} + + + +void CMtEncMultiProgress::Init(ICompressProgressInfo *progress) +{ + _progress = progress; + OutSize = 0; +} + +STDMETHODIMP CMtEncMultiProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 * /* outSize */) +{ + UInt64 outSize2; + { + #ifndef _7ZIP_ST + NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection); + #endif + outSize2 = OutSize; + } + + if (_progress) + return _progress->SetRatioInfo(inSize, &outSize2); + + return S_OK; +} + + + +HRESULT CEncoder::CreateMixerCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + const UInt64 *inSizeForReduce) +{ + #ifdef USE_MIXER_MT + #ifdef USE_MIXER_ST + if (_options.MultiThreadMixer) + #endif + { + _mixerMT = new NCoderMixer2::CMixerMT(true); + _mixerRef = _mixerMT; + _mixer = _mixerMT; + } + #ifdef USE_MIXER_ST + else + #endif + #endif + { + #ifdef USE_MIXER_ST + _mixerST = new NCoderMixer2::CMixerST(true); + _mixerRef = _mixerST; + _mixer = _mixerST; + #endif + } + + RINOK(_mixer->SetBindInfo(_bindInfo)); + + FOR_VECTOR (m, _options.Methods) + { + const CMethodFull &methodFull = _options.Methods[m]; + + CCreatedCoder cod; + + RINOK(CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodFull.Id, true, cod)); + + if (cod.NumStreams != methodFull.NumStreams) + return E_FAIL; + if (!cod.Coder && !cod.Coder2) + return E_FAIL; + + CMyComPtr encoderCommon = cod.Coder ? (IUnknown *)cod.Coder : (IUnknown *)cod.Coder2; + + #ifndef _7ZIP_ST + { + CMyComPtr setCoderMt; + encoderCommon.QueryInterface(IID_ICompressSetCoderMt, &setCoderMt); + if (setCoderMt) + { + RINOK(setCoderMt->SetNumberOfThreads(_options.NumThreads)); + } + } + #endif + + RINOK(SetCoderProps2(methodFull, inSizeForReduce, encoderCommon)); + + /* + CMyComPtr resetSalt; + encoderCommon.QueryInterface(IID_ICryptoResetSalt, (void **)&resetSalt); + if (resetSalt) + { + resetSalt->ResetSalt(); + } + */ + + // now there is no codec that uses another external codec + /* + #ifdef EXTERNAL_CODECS + CMyComPtr setCompressCodecsInfo; + encoderCommon.QueryInterface(IID_ISetCompressCodecsInfo, (void **)&setCompressCodecsInfo); + if (setCompressCodecsInfo) + { + // we must use g_ExternalCodecs also + RINOK(setCompressCodecsInfo->SetCompressCodecsInfo(__externalCodecs->GetCodecs)); + } + #endif + */ + + CMyComPtr cryptoSetPassword; + encoderCommon.QueryInterface(IID_ICryptoSetPassword, &cryptoSetPassword); + + if (cryptoSetPassword) + { + const unsigned sizeInBytes = _options.Password.Len() * 2; + CByteBuffer buffer(sizeInBytes); + for (unsigned i = 0; i < _options.Password.Len(); i++) + { + wchar_t c = _options.Password[i]; + ((Byte *)buffer)[i * 2] = (Byte)c; + ((Byte *)buffer)[i * 2 + 1] = (Byte)(c >> 8); + } + RINOK(cryptoSetPassword->CryptoSetPassword((const Byte *)buffer, (UInt32)sizeInBytes)); + } + + _mixer->AddCoder(cod); + } + return S_OK; +} + + + +class CSequentialOutTempBufferImp2: + public ISequentialOutStream, + public CMyUnknownImp +{ + CInOutTempBuffer *_buf; +public: + CMtEncMultiProgress *_mtProgresSpec; + + CSequentialOutTempBufferImp2(): _buf(0), _mtProgresSpec(NULL) {} + void Init(CInOutTempBuffer *buffer) { _buf = buffer; } + MY_UNKNOWN_IMP1(ISequentialOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CSequentialOutTempBufferImp2::Write(const void *data, UInt32 size, UInt32 *processed) +{ + if (!_buf->Write(data, size)) + { + if (processed) + *processed = 0; + return E_FAIL; + } + if (processed) + *processed = size; + if (_mtProgresSpec) + _mtProgresSpec->AddOutSize(size); + return S_OK; +} + + +class CSequentialOutMtNotify: + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + CMyComPtr _stream; + CMtEncMultiProgress *_mtProgresSpec; + + CSequentialOutMtNotify(): _mtProgresSpec(NULL) {} + MY_UNKNOWN_IMP1(ISequentialOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CSequentialOutMtNotify::Write(const void *data, UInt32 size, UInt32 *processed) +{ + UInt32 realProcessed = 0; + HRESULT res = _stream->Write(data, size, &realProcessed); + if (processed) + *processed = realProcessed; + if (_mtProgresSpec) + _mtProgresSpec->AddOutSize(size); + return res; +} + + + +HRESULT CEncoder::Encode( + DECL_EXTERNAL_CODECS_LOC_VARS + ISequentialInStream *inStream, + // const UInt64 *inStreamSize, + const UInt64 *inSizeForReduce, + CFolder &folderItem, + CRecordVector &coderUnpackSizes, + UInt64 &unpackSize, + ISequentialOutStream *outStream, + CRecordVector &packSizes, + ICompressProgressInfo *compressProgress) +{ + RINOK(EncoderConstr()); + + if (!_mixerRef) + { + RINOK(CreateMixerCoder(EXTERNAL_CODECS_LOC_VARS inSizeForReduce)); + } + + _mixer->ReInit(); + + CMtEncMultiProgress *mtProgressSpec = NULL; + CMyComPtr mtProgress; + + CSequentialOutMtNotify *mtOutStreamNotifySpec = NULL; + CMyComPtr mtOutStreamNotify; + + CObjectVector inOutTempBuffers; + CObjectVector tempBufferSpecs; + CObjectVector > tempBuffers; + + unsigned numMethods = _bindInfo.Coders.Size(); + + unsigned i; + + for (i = 1; i < _bindInfo.PackStreams.Size(); i++) + { + CInOutTempBuffer &iotb = inOutTempBuffers.AddNew(); + iotb.Create(); + iotb.InitWriting(); + } + + for (i = 1; i < _bindInfo.PackStreams.Size(); i++) + { + CSequentialOutTempBufferImp2 *tempBufferSpec = new CSequentialOutTempBufferImp2; + CMyComPtr tempBuffer = tempBufferSpec; + tempBufferSpec->Init(&inOutTempBuffers[i - 1]); + tempBuffers.Add(tempBuffer); + tempBufferSpecs.Add(tempBufferSpec); + } + + for (i = 0; i < numMethods; i++) + _mixer->SetCoderInfo(i, NULL, NULL); + + + /* inStreamSize can be used by BCJ2 to set optimal range of conversion. + But current BCJ2 encoder uses also another way to check exact size of current file. + So inStreamSize is not required. */ + + /* + if (inStreamSize) + _mixer->SetCoderInfo(_bindInfo.UnpackCoder, inStreamSize, NULL); + */ + + + CSequentialInStreamSizeCount2 *inStreamSizeCountSpec = new CSequentialInStreamSizeCount2; + CMyComPtr inStreamSizeCount = inStreamSizeCountSpec; + + CSequentialOutStreamSizeCount *outStreamSizeCountSpec = NULL; + CMyComPtr outStreamSizeCount; + + inStreamSizeCountSpec->Init(inStream); + + ISequentialInStream *inStreamPointer = inStreamSizeCount; + CRecordVector outStreamPointers; + + SetFolder(folderItem); + + for (i = 0; i < numMethods; i++) + { + IUnknown *coder = _mixer->GetCoder(i).GetUnknown(); + + CMyComPtr resetInitVector; + coder->QueryInterface(IID_ICryptoResetInitVector, (void **)&resetInitVector); + if (resetInitVector) + { + resetInitVector->ResetInitVector(); + } + + CMyComPtr writeCoderProperties; + coder->QueryInterface(IID_ICompressWriteCoderProperties, (void **)&writeCoderProperties); + + CByteBuffer &props = folderItem.Coders[numMethods - 1 - i].Props; + + if (writeCoderProperties) + { + CDynBufSeqOutStream *outStreamSpec = new CDynBufSeqOutStream; + CMyComPtr dynOutStream(outStreamSpec); + outStreamSpec->Init(); + writeCoderProperties->WriteCoderProperties(dynOutStream); + outStreamSpec->CopyToBuffer(props); + } + else + props.Free(); + } + + _mixer->SelectMainCoder(false); + UInt32 mainCoder = _mixer->MainCoderIndex; + + bool useMtProgress = false; + if (!_mixer->Is_PackSize_Correct_for_Coder(mainCoder)) + { + #ifdef _7ZIP_ST + if (!_mixer->IsThere_ExternalCoder_in_PackTree(mainCoder)) + #endif + useMtProgress = true; + } + + if (useMtProgress) + { + mtProgressSpec = new CMtEncMultiProgress; + mtProgress = mtProgressSpec; + mtProgressSpec->Init(compressProgress); + + mtOutStreamNotifySpec = new CSequentialOutMtNotify; + mtOutStreamNotify = mtOutStreamNotifySpec; + mtOutStreamNotifySpec->_stream = outStream; + mtOutStreamNotifySpec->_mtProgresSpec = mtProgressSpec; + + FOR_VECTOR(t, tempBufferSpecs) + { + tempBufferSpecs[t]->_mtProgresSpec = mtProgressSpec; + } + } + + + if (_bindInfo.PackStreams.Size() != 0) + { + outStreamSizeCountSpec = new CSequentialOutStreamSizeCount; + outStreamSizeCount = outStreamSizeCountSpec; + outStreamSizeCountSpec->SetStream(mtOutStreamNotify ? (ISequentialOutStream *)mtOutStreamNotify : outStream); + outStreamSizeCountSpec->Init(); + outStreamPointers.Add(outStreamSizeCount); + } + + for (i = 1; i < _bindInfo.PackStreams.Size(); i++) + outStreamPointers.Add(tempBuffers[i - 1]); + + RINOK(_mixer->Code( + &inStreamPointer, + &outStreamPointers.Front(), + mtProgress ? (ICompressProgressInfo *)mtProgress : compressProgress)); + + if (_bindInfo.PackStreams.Size() != 0) + packSizes.Add(outStreamSizeCountSpec->GetSize()); + + for (i = 1; i < _bindInfo.PackStreams.Size(); i++) + { + CInOutTempBuffer &inOutTempBuffer = inOutTempBuffers[i - 1]; + RINOK(inOutTempBuffer.WriteToStream(outStream)); + packSizes.Add(inOutTempBuffer.GetDataSize()); + } + + unpackSize = 0; + + for (i = 0; i < _bindInfo.Coders.Size(); i++) + { + int bond = _bindInfo.FindBond_for_UnpackStream(_DestOut_to_SrcIn[i]); + UInt64 streamSize; + if (bond < 0) + { + streamSize = inStreamSizeCountSpec->GetSize(); + unpackSize = streamSize; + } + else + streamSize = _mixer->GetBondStreamSize(bond); + coderUnpackSizes.Add(streamSize); + } + + return S_OK; +} + + +CEncoder::CEncoder(const CCompressionMethodMode &options): + _constructed(false) +{ + if (options.IsEmpty()) + throw 1; + + _options = options; + + #ifdef USE_MIXER_ST + _mixerST = NULL; + #endif + + #ifdef USE_MIXER_MT + _mixerMT = NULL; + #endif + + _mixer = NULL; +} + + +HRESULT CEncoder::EncoderConstr() +{ + if (_constructed) + return S_OK; + if (_options.Methods.IsEmpty()) + { + // it has only password method; + if (!_options.PasswordIsDefined) + throw 1; + if (!_options.Bonds.IsEmpty()) + throw 1; + + CMethodFull method; + method.Id = k_AES; + method.NumStreams = 1; + _options.Methods.Add(method); + + NCoderMixer2::CCoderStreamsInfo coderStreamsInfo; + coderStreamsInfo.NumStreams = 1; + _bindInfo.Coders.Add(coderStreamsInfo); + + _bindInfo.PackStreams.Add(0); + _bindInfo.UnpackCoder = 0; + } + else + { + + UInt32 numOutStreams = 0; + unsigned i; + + for (i = 0; i < _options.Methods.Size(); i++) + { + const CMethodFull &methodFull = _options.Methods[i]; + NCoderMixer2::CCoderStreamsInfo cod; + + cod.NumStreams = methodFull.NumStreams; + + if (_options.Bonds.IsEmpty()) + { + // if there are no bonds in options, we create bonds via first streams of coders + if (i != _options.Methods.Size() - 1) + { + NCoderMixer2::CBond bond; + bond.PackIndex = numOutStreams; + bond.UnpackIndex = i + 1; // it's next coder + _bindInfo.Bonds.Add(bond); + } + else if (cod.NumStreams != 0) + _bindInfo.PackStreams.Insert(0, numOutStreams); + + for (UInt32 j = 1; j < cod.NumStreams; j++) + _bindInfo.PackStreams.Add(numOutStreams + j); + } + + numOutStreams += cod.NumStreams; + + _bindInfo.Coders.Add(cod); + } + + if (!_options.Bonds.IsEmpty()) + { + for (i = 0; i < _options.Bonds.Size(); i++) + { + NCoderMixer2::CBond mixerBond; + const CBond2 &bond = _options.Bonds[i]; + if (bond.InCoder >= _bindInfo.Coders.Size() + || bond.OutCoder >= _bindInfo.Coders.Size() + || bond.OutStream >= _bindInfo.Coders[bond.OutCoder].NumStreams) + return E_INVALIDARG; + mixerBond.PackIndex = _bindInfo.GetStream_for_Coder(bond.OutCoder) + bond.OutStream; + mixerBond.UnpackIndex = bond.InCoder; + _bindInfo.Bonds.Add(mixerBond); + } + + for (i = 0; i < numOutStreams; i++) + if (_bindInfo.FindBond_for_PackStream(i) == -1) + _bindInfo.PackStreams.Add(i); + } + + if (!_bindInfo.SetUnpackCoder()) + return E_INVALIDARG; + + if (!_bindInfo.CalcMapsAndCheck()) + return E_INVALIDARG; + + if (_bindInfo.PackStreams.Size() != 1) + { + /* main_PackStream is pack stream of main path of coders tree. + We find main_PackStream, and place to start of list of out streams. + It allows to use more optimal memory usage for temp buffers, + if main_PackStream is largest stream. */ + + UInt32 ci = _bindInfo.UnpackCoder; + + for (;;) + { + if (_bindInfo.Coders[ci].NumStreams == 0) + break; + + UInt32 outIndex = _bindInfo.Coder_to_Stream[ci]; + int bond = _bindInfo.FindBond_for_PackStream(outIndex); + if (bond >= 0) + { + ci = _bindInfo.Bonds[bond].UnpackIndex; + continue; + } + + int si = _bindInfo.FindStream_in_PackStreams(outIndex); + if (si >= 0) + _bindInfo.PackStreams.MoveToFront(si); + break; + } + } + + if (_options.PasswordIsDefined) + { + unsigned numCryptoStreams = _bindInfo.PackStreams.Size(); + + unsigned numInStreams = _bindInfo.Coders.Size(); + + for (i = 0; i < numCryptoStreams; i++) + { + NCoderMixer2::CBond bond; + bond.UnpackIndex = numInStreams + i; + bond.PackIndex = _bindInfo.PackStreams[i]; + _bindInfo.Bonds.Add(bond); + } + _bindInfo.PackStreams.Clear(); + + /* + if (numCryptoStreams == 0) + numCryptoStreams = 1; + */ + + for (i = 0; i < numCryptoStreams; i++) + { + CMethodFull method; + method.NumStreams = 1; + method.Id = k_AES; + _options.Methods.Add(method); + + NCoderMixer2::CCoderStreamsInfo cod; + cod.NumStreams = 1; + _bindInfo.Coders.Add(cod); + + _bindInfo.PackStreams.Add(numOutStreams++); + } + } + + } + + for (unsigned i = _options.Methods.Size(); i != 0;) + _decompressionMethods.Add(_options.Methods[--i].Id); + + if (_bindInfo.Coders.Size() > 16) + return E_INVALIDARG; + if (_bindInfo.GetNum_Bonds_and_PackStreams() > 16) + return E_INVALIDARG; + + if (!_bindInfo.CalcMapsAndCheck()) + return E_INVALIDARG; + + InitBindConv(); + _constructed = true; + return S_OK; +} + +CEncoder::~CEncoder() {} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zEncode.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zEncode.h new file mode 100644 index 0000000000..434cbecd3c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zEncode.h @@ -0,0 +1,92 @@ +// 7zEncode.h + +#ifndef __7Z_ENCODE_H +#define __7Z_ENCODE_H + +#include "7zCompressionMode.h" + +#include "../Common/CoderMixer2.h" + +#include "7zItem.h" + +namespace NArchive { +namespace N7z { + +class CMtEncMultiProgress: + public ICompressProgressInfo, + public CMyUnknownImp +{ + CMyComPtr _progress; + #ifndef _7ZIP_ST + NWindows::NSynchronization::CCriticalSection CriticalSection; + #endif + +public: + UInt64 OutSize; + + CMtEncMultiProgress(): OutSize(0) {} + + void Init(ICompressProgressInfo *progress); + + void AddOutSize(UInt64 addOutSize) + { + #ifndef _7ZIP_ST + NWindows::NSynchronization::CCriticalSectionLock lock(CriticalSection); + #endif + OutSize += addOutSize; + } + + MY_UNKNOWN_IMP1(ICompressProgressInfo) + + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); +}; + +class CEncoder +{ + #ifdef USE_MIXER_ST + NCoderMixer2::CMixerST *_mixerST; + #endif + #ifdef USE_MIXER_MT + NCoderMixer2::CMixerMT *_mixerMT; + #endif + + NCoderMixer2::CMixer *_mixer; + CMyComPtr _mixerRef; + + CCompressionMethodMode _options; + NCoderMixer2::CBindInfo _bindInfo; + CRecordVector _decompressionMethods; + + CRecordVector _SrcIn_to_DestOut; + CRecordVector _SrcOut_to_DestIn; + // CRecordVector _DestIn_to_SrcOut; + CRecordVector _DestOut_to_SrcIn; + + void InitBindConv(); + void SetFolder(CFolder &folder); + + HRESULT CreateMixerCoder(DECL_EXTERNAL_CODECS_LOC_VARS + const UInt64 *inSizeForReduce); + + bool _constructed; +public: + + CEncoder(const CCompressionMethodMode &options); + ~CEncoder(); + HRESULT EncoderConstr(); + HRESULT Encode( + DECL_EXTERNAL_CODECS_LOC_VARS + ISequentialInStream *inStream, + // const UInt64 *inStreamSize, + const UInt64 *inSizeForReduce, + CFolder &folderItem, + CRecordVector &coderUnpackSizes, + UInt64 &unpackSize, + ISequentialOutStream *outStream, + CRecordVector &packSizes, + ICompressProgressInfo *compressProgress); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zExtract.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zExtract.cpp new file mode 100644 index 0000000000..a675797cf7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zExtract.cpp @@ -0,0 +1,408 @@ +// 7zExtract.cpp + +#include "StdAfx.h" + +#include "../../../../C/7zCrc.h" + +#include "../../../Common/ComTry.h" + +#include "../../Common/ProgressUtils.h" + +#include "7zDecode.h" +#include "7zHandler.h" + +// EXTERN_g_ExternalCodecs + +namespace NArchive { +namespace N7z { + +class CFolderOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; +public: + bool TestMode; + bool CheckCrc; +private: + bool _fileIsOpen; + bool _calcCrc; + UInt32 _crc; + UInt64 _rem; + + const UInt32 *_indexes; + unsigned _numFiles; + unsigned _fileIndex; + + HRESULT OpenFile(bool isCorrupted = false); + HRESULT CloseFile_and_SetResult(Int32 res); + HRESULT CloseFile(); + HRESULT ProcessEmptyFiles(); + +public: + MY_UNKNOWN_IMP1(ISequentialOutStream) + + const CDbEx *_db; + CMyComPtr ExtractCallback; + + bool ExtraWriteWasCut; + + CFolderOutStream(): + TestMode(false), + CheckCrc(true) + {} + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + + HRESULT Init(unsigned startIndex, const UInt32 *indexes, unsigned numFiles); + HRESULT FlushCorrupted(Int32 callbackOperationResult); + + bool WasWritingFinished() const { return _numFiles == 0; } +}; + + +HRESULT CFolderOutStream::Init(unsigned startIndex, const UInt32 *indexes, unsigned numFiles) +{ + _fileIndex = startIndex; + _indexes = indexes; + _numFiles = numFiles; + + _fileIsOpen = false; + ExtraWriteWasCut = false; + + return ProcessEmptyFiles(); +} + +HRESULT CFolderOutStream::OpenFile(bool isCorrupted) +{ + const CFileItem &fi = _db->Files[_fileIndex]; + UInt32 nextFileIndex = (_indexes ? *_indexes : _fileIndex); + Int32 askMode = (_fileIndex == nextFileIndex) ? + (TestMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract) : + NExtract::NAskMode::kSkip; + + if (isCorrupted + && askMode == NExtract::NAskMode::kExtract + && !_db->IsItemAnti(_fileIndex) + && !fi.IsDir) + askMode = NExtract::NAskMode::kTest; + + CMyComPtr realOutStream; + RINOK(ExtractCallback->GetStream(_fileIndex, &realOutStream, askMode)); + + _stream = realOutStream; + _crc = CRC_INIT_VAL; + _calcCrc = (CheckCrc && fi.CrcDefined && !fi.IsDir); + + _fileIsOpen = true; + _rem = fi.Size; + + if (askMode == NExtract::NAskMode::kExtract + && !realOutStream + && !_db->IsItemAnti(_fileIndex) + && !fi.IsDir) + askMode = NExtract::NAskMode::kSkip; + return ExtractCallback->PrepareOperation(askMode); +} + +HRESULT CFolderOutStream::CloseFile_and_SetResult(Int32 res) +{ + _stream.Release(); + _fileIsOpen = false; + + if (!_indexes) + _numFiles--; + else if (*_indexes == _fileIndex) + { + _indexes++; + _numFiles--; + } + + _fileIndex++; + return ExtractCallback->SetOperationResult(res); +} + +HRESULT CFolderOutStream::CloseFile() +{ + const CFileItem &fi = _db->Files[_fileIndex]; + return CloseFile_and_SetResult((!_calcCrc || fi.Crc == CRC_GET_DIGEST(_crc)) ? + NExtract::NOperationResult::kOK : + NExtract::NOperationResult::kCRCError); +} + +HRESULT CFolderOutStream::ProcessEmptyFiles() +{ + while (_numFiles != 0 && _db->Files[_fileIndex].Size == 0) + { + RINOK(OpenFile()); + RINOK(CloseFile()); + } + return S_OK; +} + +STDMETHODIMP CFolderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + while (size != 0) + { + if (_fileIsOpen) + { + UInt32 cur = (size < _rem ? size : (UInt32)_rem); + HRESULT result = S_OK; + if (_stream) + result = _stream->Write(data, cur, &cur); + if (_calcCrc) + _crc = CrcUpdate(_crc, data, cur); + if (processedSize) + *processedSize += cur; + data = (const Byte *)data + cur; + size -= cur; + _rem -= cur; + if (_rem == 0) + { + RINOK(CloseFile()); + RINOK(ProcessEmptyFiles()); + } + RINOK(result); + if (cur == 0) + break; + continue; + } + + RINOK(ProcessEmptyFiles()); + if (_numFiles == 0) + { + // we support partial extracting + /* + if (processedSize) + *processedSize += size; + break; + */ + ExtraWriteWasCut = true; + // return S_FALSE; + return k_My_HRESULT_WritingWasCut; + } + RINOK(OpenFile()); + } + + return S_OK; +} + +HRESULT CFolderOutStream::FlushCorrupted(Int32 callbackOperationResult) +{ + while (_numFiles != 0) + { + if (_fileIsOpen) + { + RINOK(CloseFile_and_SetResult(callbackOperationResult)); + } + else + { + RINOK(OpenFile(true)); + } + } + return S_OK; +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testModeSpec, IArchiveExtractCallback *extractCallbackSpec) +{ + COM_TRY_BEGIN + + CMyComPtr extractCallback = extractCallbackSpec; + + UInt64 importantTotalUnpacked = 0; + + // numItems = (UInt32)(Int32)-1; + + bool allFilesMode = (numItems == (UInt32)(Int32)-1); + if (allFilesMode) + numItems = _db.Files.Size(); + + if (numItems == 0) + return S_OK; + + { + CNum prevFolder = kNumNoIndex; + UInt32 nextFile = 0; + + UInt32 i; + + for (i = 0; i < numItems; i++) + { + UInt32 fileIndex = allFilesMode ? i : indices[i]; + CNum folderIndex = _db.FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex == kNumNoIndex) + continue; + if (folderIndex != prevFolder || fileIndex < nextFile) + nextFile = _db.FolderStartFileIndex[folderIndex]; + for (CNum index = nextFile; index <= fileIndex; index++) + importantTotalUnpacked += _db.Files[index].Size; + nextFile = fileIndex + 1; + prevFolder = folderIndex; + } + } + + RINOK(extractCallback->SetTotal(importantTotalUnpacked)); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr progress = lps; + lps->Init(extractCallback, false); + + CDecoder decoder( + #if !defined(USE_MIXER_MT) + false + #elif !defined(USE_MIXER_ST) + true + #elif !defined(__7Z_SET_PROPERTIES) + #ifdef _7ZIP_ST + false + #else + true + #endif + #else + _useMultiThreadMixer + #endif + ); + + UInt64 curPacked, curUnpacked; + + CMyComPtr callbackMessage; + extractCallback.QueryInterface(IID_IArchiveExtractCallbackMessage, &callbackMessage); + + CFolderOutStream *folderOutStream = new CFolderOutStream; + CMyComPtr outStream(folderOutStream); + + folderOutStream->_db = &_db; + folderOutStream->ExtractCallback = extractCallback; + folderOutStream->TestMode = (testModeSpec != 0); + folderOutStream->CheckCrc = (_crcSize != 0); + + for (UInt32 i = 0;; lps->OutSize += curUnpacked, lps->InSize += curPacked) + { + RINOK(lps->SetCur()); + + if (i >= numItems) + break; + + curUnpacked = 0; + curPacked = 0; + + UInt32 fileIndex = allFilesMode ? i : indices[i]; + CNum folderIndex = _db.FileIndexToFolderIndexMap[fileIndex]; + + UInt32 numSolidFiles = 1; + + if (folderIndex != kNumNoIndex) + { + curPacked = _db.GetFolderFullPackSize(folderIndex); + UInt32 nextFile = fileIndex + 1; + fileIndex = _db.FolderStartFileIndex[folderIndex]; + UInt32 k; + + for (k = i + 1; k < numItems; k++) + { + UInt32 fileIndex2 = allFilesMode ? k : indices[k]; + if (_db.FileIndexToFolderIndexMap[fileIndex2] != folderIndex + || fileIndex2 < nextFile) + break; + nextFile = fileIndex2 + 1; + } + + numSolidFiles = k - i; + + for (k = fileIndex; k < nextFile; k++) + curUnpacked += _db.Files[k].Size; + } + + { + HRESULT result = folderOutStream->Init(fileIndex, + allFilesMode ? NULL : indices + i, + numSolidFiles); + + i += numSolidFiles; + + RINOK(result); + } + + // to test solid block with zero unpacked size we disable that code + if (folderOutStream->WasWritingFinished()) + continue; + + #ifndef _NO_CRYPTO + CMyComPtr getTextPassword; + if (extractCallback) + extractCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword); + #endif + + try + { + #ifndef _NO_CRYPTO + bool isEncrypted = false; + bool passwordIsDefined = false; + UString password; + #endif + + + HRESULT result = decoder.Decode( + EXTERNAL_CODECS_VARS + _inStream, + _db.ArcInfo.DataStartPosition, + _db, folderIndex, + &curUnpacked, + + outStream, + progress, + NULL // *inStreamMainRes + + _7Z_DECODER_CRYPRO_VARS + #if !defined(_7ZIP_ST) && !defined(_SFX) + , true, _numThreads + #endif + ); + + if (result == S_FALSE || result == E_NOTIMPL) + { + bool wasFinished = folderOutStream->WasWritingFinished(); + + int resOp = (result == S_FALSE ? + NExtract::NOperationResult::kDataError : + NExtract::NOperationResult::kUnsupportedMethod); + + RINOK(folderOutStream->FlushCorrupted(resOp)); + + if (wasFinished) + { + // we don't show error, if it's after required files + if (/* !folderOutStream->ExtraWriteWasCut && */ callbackMessage) + { + RINOK(callbackMessage->ReportExtractResult(NEventIndexType::kBlockIndex, folderIndex, resOp)); + } + } + continue; + } + + if (result != S_OK) + return result; + + RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError)); + continue; + } + catch(...) + { + RINOK(folderOutStream->FlushCorrupted(NExtract::NOperationResult::kDataError)); + // continue; + return E_FAIL; + } + } + + return S_OK; + + COM_TRY_END +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp new file mode 100644 index 0000000000..51a6f689eb --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp @@ -0,0 +1,136 @@ +// 7zFolderInStream.cpp + +#include "StdAfx.h" + +#include "7zFolderInStream.h" + +namespace NArchive { +namespace N7z { + +void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback, + const UInt32 *indexes, unsigned numFiles) +{ + _updateCallback = updateCallback; + _indexes = indexes; + _numFiles = numFiles; + _index = 0; + + Processed.ClearAndReserve(numFiles); + CRCs.ClearAndReserve(numFiles); + Sizes.ClearAndReserve(numFiles); + + _pos = 0; + _crc = CRC_INIT_VAL; + _size_Defined = false; + _size = 0; + + _stream.Release(); +} + +HRESULT CFolderInStream::OpenStream() +{ + _pos = 0; + _crc = CRC_INIT_VAL; + _size_Defined = false; + _size = 0; + + while (_index < _numFiles) + { + CMyComPtr stream; + HRESULT result = _updateCallback->GetStream(_indexes[_index], &stream); + if (result != S_OK) + { + if (result != S_FALSE) + return result; + } + + _stream = stream; + + if (stream) + { + CMyComPtr streamGetSize; + stream.QueryInterface(IID_IStreamGetSize, &streamGetSize); + if (streamGetSize) + { + if (streamGetSize->GetSize(&_size) == S_OK) + _size_Defined = true; + } + return S_OK; + } + + _index++; + RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); + AddFileInfo(result == S_OK); + } + return S_OK; +} + +void CFolderInStream::AddFileInfo(bool isProcessed) +{ + Processed.Add(isProcessed); + Sizes.Add(_pos); + CRCs.Add(CRC_GET_DIGEST(_crc)); +} + +STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + while (size != 0) + { + if (_stream) + { + UInt32 processed2; + RINOK(_stream->Read(data, size, &processed2)); + if (processed2 != 0) + { + _crc = CrcUpdate(_crc, data, processed2); + _pos += processed2; + if (processedSize) + *processedSize = processed2; + return S_OK; + } + + _stream.Release(); + _index++; + AddFileInfo(true); + + _pos = 0; + _crc = CRC_INIT_VAL; + _size_Defined = false; + _size = 0; + + RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); + } + + if (_index >= _numFiles) + break; + RINOK(OpenStream()); + } + return S_OK; +} + +STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value) +{ + *value = 0; + if (subStream > Sizes.Size()) + return S_FALSE; // E_FAIL; + + unsigned index = (unsigned)subStream; + if (index < Sizes.Size()) + { + *value = Sizes[index]; + return S_OK; + } + + if (!_size_Defined) + { + *value = _pos; + return S_FALSE; + } + + *value = (_pos > _size ? _pos : _size); + return S_OK; +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h new file mode 100644 index 0000000000..f2b1c599ae --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h @@ -0,0 +1,61 @@ +// 7zFolderInStream.h + +#ifndef __7Z_FOLDER_IN_STREAM_H +#define __7Z_FOLDER_IN_STREAM_H + +#include "../../../../C/7zCrc.h" + +#include "../../../Common/MyCom.h" +#include "../../../Common/MyVector.h" + +#include "../../ICoder.h" +#include "../IArchive.h" + +namespace NArchive { +namespace N7z { + +class CFolderInStream: + public ISequentialInStream, + public ICompressGetSubStreamSize, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _pos; + UInt32 _crc; + bool _size_Defined; + UInt64 _size; + + const UInt32 *_indexes; + unsigned _numFiles; + unsigned _index; + + CMyComPtr _updateCallback; + + HRESULT OpenStream(); + void AddFileInfo(bool isProcessed); + +public: + CRecordVector Processed; + CRecordVector CRCs; + CRecordVector Sizes; + + MY_UNKNOWN_IMP2(ISequentialInStream, ICompressGetSubStreamSize) + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); + + void Init(IArchiveUpdateCallback *updateCallback, const UInt32 *indexes, unsigned numFiles); + + bool WasFinished() const { return _index == _numFiles; } + + UInt64 GetFullSize() const + { + UInt64 size = 0; + FOR_VECTOR (i, Sizes) + size += Sizes[i]; + return size; + } +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandler.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandler.cpp new file mode 100644 index 0000000000..0142fba61c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandler.cpp @@ -0,0 +1,757 @@ +// 7zHandler.cpp + +#include "StdAfx.h" + +#include "../../../../C/CpuArch.h" + +#include "../../../Common/ComTry.h" +#include "../../../Common/IntToString.h" + +#ifndef __7Z_SET_PROPERTIES +#if !defined(__APPLE__) +#include "../../../Windows/System.h" +#endif +#endif + +#include "../Common/ItemNameUtils.h" + +#include "7zHandler.h" +#include "7zProperties.h" + +#ifdef __7Z_SET_PROPERTIES +#ifdef EXTRACT_ONLY +#include "../Common/ParseProperties.h" +#endif +#endif + +using namespace NWindows; +using namespace NCOM; + +namespace NArchive { +namespace N7z { + +CHandler::CHandler() +{ + #ifndef _NO_CRYPTO + _isEncrypted = false; + _passwordIsDefined = false; + #endif + + #ifdef EXTRACT_ONLY + + _crcSize = 4; + + #ifdef __7Z_SET_PROPERTIES + _numThreads = NSystem::GetNumberOfProcessors(); + _useMultiThreadMixer = true; + #endif + + #endif +} + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = _db.Files.Size(); + return S_OK; +} + +#ifdef _SFX + +IMP_IInArchive_ArcProps_NO_Table + +STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps) +{ + *numProps = 0; + return S_OK; +} + +STDMETHODIMP CHandler::GetPropertyInfo(UInt32 /* index */, + BSTR * /* name */, PROPID * /* propID */, VARTYPE * /* varType */) +{ + return E_NOTIMPL; +} + +#else + +static const Byte kArcProps[] = +{ + kpidHeadersSize, + kpidMethod, + kpidSolid, + kpidNumBlocks + // , kpidIsTree +}; + +IMP_IInArchive_ArcProps + +static inline char GetHex(unsigned value) +{ + return (char)((value < 10) ? ('0' + value) : ('A' + (value - 10))); +} + +static unsigned ConvertMethodIdToString_Back(char *s, UInt64 id) +{ + int len = 0; + do + { + s[--len] = GetHex((unsigned)id & 0xF); id >>= 4; + s[--len] = GetHex((unsigned)id & 0xF); id >>= 4; + } + while (id != 0); + return (unsigned)-len; +} + +static void ConvertMethodIdToString(AString &res, UInt64 id) +{ + const unsigned kLen = 32; + char s[kLen]; + unsigned len = kLen - 1; + s[len] = 0; + res += s + len - ConvertMethodIdToString_Back(s + len, id); +} + +static unsigned GetStringForSizeValue(char *s, UInt32 val) +{ + unsigned i; + for (i = 0; i <= 31; i++) + if (((UInt32)1 << i) == val) + { + if (i < 10) + { + s[0] = (char)('0' + i); + s[1] = 0; + return 1; + } + if (i < 20) { s[0] = '1'; s[1] = (char)('0' + i - 10); } + else if (i < 30) { s[0] = '2'; s[1] = (char)('0' + i - 20); } + else { s[0] = '3'; s[1] = (char)('0' + i - 30); } + s[2] = 0; + return 2; + } + char c = 'b'; + if ((val & ((1 << 20) - 1)) == 0) { val >>= 20; c = 'm'; } + else if ((val & ((1 << 10) - 1)) == 0) { val >>= 10; c = 'k'; } + ::ConvertUInt32ToString(val, s); + unsigned pos = MyStringLen(s); + s[pos++] = c; + s[pos] = 0; + return pos; +} + +/* +static inline void AddHexToString(UString &res, Byte value) +{ + res += GetHex((Byte)(value >> 4)); + res += GetHex((Byte)(value & 0xF)); +} +*/ + +static char *AddProp32(char *s, const char *name, UInt32 v) +{ + *s++ = ':'; + s = MyStpCpy(s, name); + ::ConvertUInt32ToString(v, s); + return s + MyStringLen(s); +} + +void CHandler::AddMethodName(AString &s, UInt64 id) +{ + AString name; + FindMethod(EXTERNAL_CODECS_VARS id, name); + if (name.IsEmpty()) + ConvertMethodIdToString(s, id); + else + s += name; +} + +#endif + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + #ifndef _SFX + COM_TRY_BEGIN + #endif + NCOM::CPropVariant prop; + switch (propID) + { + #ifndef _SFX + case kpidMethod: + { + AString s; + const CParsedMethods &pm = _db.ParsedMethods; + FOR_VECTOR (i, pm.IDs) + { + UInt64 id = pm.IDs[i]; + s.Add_Space_if_NotEmpty(); + char temp[16]; + if (id == k_LZMA2) + { + s += "LZMA2:"; + if ((pm.Lzma2Prop & 1) == 0) + ConvertUInt32ToString((pm.Lzma2Prop >> 1) + 12, temp); + else + GetStringForSizeValue(temp, 3 << ((pm.Lzma2Prop >> 1) + 11)); + s += temp; + } + else if (id == k_LZMA) + { + s += "LZMA:"; + GetStringForSizeValue(temp, pm.LzmaDic); + s += temp; + } + else + AddMethodName(s, id); + } + prop = s; + break; + } + case kpidSolid: prop = _db.IsSolid(); break; + case kpidNumBlocks: prop = (UInt32)_db.NumFolders; break; + case kpidHeadersSize: prop = _db.HeadersSize; break; + case kpidPhySize: prop = _db.PhySize; break; + case kpidOffset: if (_db.ArcInfo.StartPosition != 0) prop = _db.ArcInfo.StartPosition; break; + /* + case kpidIsTree: if (_db.IsTree) prop = true; break; + case kpidIsAltStream: if (_db.ThereAreAltStreams) prop = true; break; + case kpidIsAux: if (_db.IsTree) prop = true; break; + */ + // case kpidError: if (_db.ThereIsHeaderError) prop = "Header error"; break; + #endif + + case kpidWarningFlags: + { + UInt32 v = 0; + if (_db.StartHeaderWasRecovered) v |= kpv_ErrorFlags_HeadersError; + if (_db.UnsupportedFeatureWarning) v |= kpv_ErrorFlags_UnsupportedFeature; + if (v != 0) + prop = v; + break; + } + + case kpidErrorFlags: + { + UInt32 v = 0; + if (!_db.IsArc) v |= kpv_ErrorFlags_IsNotArc; + if (_db.ThereIsHeaderError) v |= kpv_ErrorFlags_HeadersError; + if (_db.UnexpectedEnd) v |= kpv_ErrorFlags_UnexpectedEnd; + // if (_db.UnsupportedVersion) v |= kpv_ErrorFlags_Unsupported; + if (_db.UnsupportedFeatureError) v |= kpv_ErrorFlags_UnsupportedFeature; + prop = v; + break; + } + } + prop.Detach(value); + return S_OK; + #ifndef _SFX + COM_TRY_END + #endif +} + +static void SetFileTimeProp_From_UInt64Def(PROPVARIANT *prop, const CUInt64DefVector &v, int index) +{ + UInt64 value; + if (v.GetItem(index, value)) + PropVarEm_Set_FileTime64(prop, value); +} + +bool CHandler::IsFolderEncrypted(CNum folderIndex) const +{ + if (folderIndex == kNumNoIndex) + return false; + size_t startPos = _db.FoCodersDataOffset[folderIndex]; + const Byte *p = _db.CodersData + startPos; + size_t size = _db.FoCodersDataOffset[folderIndex + 1] - startPos; + CInByte2 inByte; + inByte.Init(p, size); + + CNum numCoders = inByte.ReadNum(); + for (; numCoders != 0; numCoders--) + { + Byte mainByte = inByte.ReadByte(); + unsigned idSize = (mainByte & 0xF); + const Byte *longID = inByte.GetPtr(); + UInt64 id64 = 0; + for (unsigned j = 0; j < idSize; j++) + id64 = ((id64 << 8) | longID[j]); + inByte.SkipDataNoCheck(idSize); + if (id64 == k_AES) + return true; + if ((mainByte & 0x20) != 0) + inByte.SkipDataNoCheck(inByte.ReadNum()); + } + return false; +} + +STDMETHODIMP CHandler::GetNumRawProps(UInt32 *numProps) +{ + *numProps = 0; + return S_OK; +} + +STDMETHODIMP CHandler::GetRawPropInfo(UInt32 /* index */, BSTR *name, PROPID *propID) +{ + *name = NULL; + *propID = kpidNtSecure; + return S_OK; +} + +STDMETHODIMP CHandler::GetParent(UInt32 /* index */, UInt32 *parent, UInt32 *parentType) +{ + /* + const CFileItem &file = _db.Files[index]; + *parentType = (file.IsAltStream ? NParentType::kAltStream : NParentType::kDir); + *parent = (UInt32)(Int32)file.Parent; + */ + *parentType = NParentType::kDir; + *parent = (UInt32)(Int32)-1; + return S_OK; +} + +STDMETHODIMP CHandler::GetRawProp(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType) +{ + *data = NULL; + *dataSize = 0; + *propType = 0; + + if (/* _db.IsTree && propID == kpidName || + !_db.IsTree && */ propID == kpidPath) + { + if (_db.NameOffsets && _db.NamesBuf) + { + size_t offset = _db.NameOffsets[index]; + size_t size = (_db.NameOffsets[index + 1] - offset) * 2; + if (size < ((UInt32)1 << 31)) + { + *data = (const void *)(_db.NamesBuf + offset * 2); + *dataSize = (UInt32)size; + *propType = NPropDataType::kUtf16z; + } + } + return S_OK; + } + /* + if (propID == kpidNtSecure) + { + if (index < (UInt32)_db.SecureIDs.Size()) + { + int id = _db.SecureIDs[index]; + size_t offs = _db.SecureOffsets[id]; + size_t size = _db.SecureOffsets[id + 1] - offs; + if (size >= 0) + { + *data = _db.SecureBuf + offs; + *dataSize = (UInt32)size; + *propType = NPropDataType::kRaw; + } + } + } + */ + return S_OK; +} + +#ifndef _SFX + +HRESULT CHandler::SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const +{ + PropVariant_Clear(prop); + if (folderIndex == kNumNoIndex) + return S_OK; + // for (int ttt = 0; ttt < 1; ttt++) { + const unsigned kTempSize = 256; + char temp[kTempSize]; + unsigned pos = kTempSize; + temp[--pos] = 0; + + size_t startPos = _db.FoCodersDataOffset[folderIndex]; + const Byte *p = _db.CodersData + startPos; + size_t size = _db.FoCodersDataOffset[folderIndex + 1] - startPos; + CInByte2 inByte; + inByte.Init(p, size); + + // numCoders == 0 ??? + CNum numCoders = inByte.ReadNum(); + bool needSpace = false; + + for (; numCoders != 0; numCoders--, needSpace = true) + { + if (pos < 32) // max size of property + break; + Byte mainByte = inByte.ReadByte(); + unsigned idSize = (mainByte & 0xF); + const Byte *longID = inByte.GetPtr(); + UInt64 id64 = 0; + for (unsigned j = 0; j < idSize; j++) + id64 = ((id64 << 8) | longID[j]); + inByte.SkipDataNoCheck(idSize); + + if ((mainByte & 0x10) != 0) + { + inByte.ReadNum(); // NumInStreams + inByte.ReadNum(); // NumOutStreams + } + + CNum propsSize = 0; + const Byte *props = NULL; + if ((mainByte & 0x20) != 0) + { + propsSize = inByte.ReadNum(); + props = inByte.GetPtr(); + inByte.SkipDataNoCheck(propsSize); + } + + const char *name = NULL; + char s[32]; + s[0] = 0; + + if (id64 <= (UInt32)0xFFFFFFFF) + { + UInt32 id = (UInt32)id64; + if (id == k_LZMA) + { + name = "LZMA"; + if (propsSize == 5) + { + UInt32 dicSize = GetUi32((const Byte *)props + 1); + char *dest = s + GetStringForSizeValue(s, dicSize); + UInt32 d = props[0]; + if (d != 0x5D) + { + UInt32 lc = d % 9; + d /= 9; + UInt32 pb = d / 5; + UInt32 lp = d % 5; + if (lc != 3) dest = AddProp32(dest, "lc", lc); + if (lp != 0) dest = AddProp32(dest, "lp", lp); + if (pb != 2) dest = AddProp32(dest, "pb", pb); + } + } + } + else if (id == k_LZMA2) + { + name = "LZMA2"; + if (propsSize == 1) + { + Byte d = props[0]; + if ((d & 1) == 0) + ConvertUInt32ToString((UInt32)((d >> 1) + 12), s); + else + GetStringForSizeValue(s, 3 << ((d >> 1) + 11)); + } + } + else if (id == k_PPMD) + { + name = "PPMD"; + if (propsSize == 5) + { + Byte order = *props; + char *dest = s; + *dest++ = 'o'; + ConvertUInt32ToString(order, dest); + dest += MyStringLen(dest); + dest = MyStpCpy(dest, ":mem"); + GetStringForSizeValue(dest, GetUi32(props + 1)); + } + } + else if (id == k_Delta) + { + name = "Delta"; + if (propsSize == 1) + ConvertUInt32ToString((UInt32)props[0] + 1, s); + } + else if (id == k_BCJ2) name = "BCJ2"; + else if (id == k_BCJ) name = "BCJ"; + else if (id == k_AES) + { + name = "7zAES"; + if (propsSize >= 1) + { + Byte firstByte = props[0]; + UInt32 numCyclesPower = firstByte & 0x3F; + ConvertUInt32ToString(numCyclesPower, s); + } + } + } + + if (name) + { + unsigned nameLen = MyStringLen(name); + unsigned propsLen = MyStringLen(s); + unsigned totalLen = nameLen + propsLen; + if (propsLen != 0) + totalLen++; + if (needSpace) + totalLen++; + if (totalLen + 5 >= pos) + break; + pos -= totalLen; + MyStringCopy(temp + pos, name); + if (propsLen != 0) + { + char *dest = temp + pos + nameLen; + *dest++ = ':'; + MyStringCopy(dest, s); + } + if (needSpace) + temp[pos + totalLen - 1] = ' '; + } + else + { + AString methodName; + FindMethod(EXTERNAL_CODECS_VARS id64, methodName); + if (needSpace) + temp[--pos] = ' '; + if (methodName.IsEmpty()) + pos -= ConvertMethodIdToString_Back(temp + pos, id64); + else + { + unsigned len = methodName.Len(); + if (len + 5 > pos) + break; + pos -= len; + for (unsigned i = 0; i < len; i++) + temp[pos + i] = methodName[i]; + } + } + } + + if (numCoders != 0 && pos >= 4) + { + temp[--pos] = ' '; + temp[--pos] = '.'; + temp[--pos] = '.'; + temp[--pos] = '.'; + } + + return PropVarEm_Set_Str(prop, temp + pos); + // } +} + +#endif + +STDMETHODIMP CHandler::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + PropVariant_Clear(value); + // COM_TRY_BEGIN + // NCOM::CPropVariant prop; + + /* + const CRef2 &ref2 = _refs[index]; + if (ref2.Refs.IsEmpty()) + return E_FAIL; + const CRef &ref = ref2.Refs.Front(); + */ + + const CFileItem &item = _db.Files[index]; + UInt32 index2 = index; + + switch (propID) + { + case kpidIsDir: PropVarEm_Set_Bool(value, item.IsDir); break; + case kpidSize: + { + PropVarEm_Set_UInt64(value, item.Size); + // prop = ref2.Size; + break; + } + case kpidPackSize: + { + // prop = ref2.PackSize; + { + CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + { + if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2) + PropVarEm_Set_UInt64(value, _db.GetFolderFullPackSize(folderIndex)); + /* + else + PropVarEm_Set_UInt64(value, 0); + */ + } + else + PropVarEm_Set_UInt64(value, 0); + } + break; + } + // case kpidIsAux: prop = _db.IsItemAux(index2); break; + case kpidPosition: { UInt64 v; if (_db.StartPos.GetItem(index2, v)) PropVarEm_Set_UInt64(value, v); break; } + case kpidCTime: SetFileTimeProp_From_UInt64Def(value, _db.CTime, index2); break; + case kpidATime: SetFileTimeProp_From_UInt64Def(value, _db.ATime, index2); break; + case kpidMTime: SetFileTimeProp_From_UInt64Def(value, _db.MTime, index2); break; + case kpidAttrib: if (item.AttribDefined) PropVarEm_Set_UInt32(value, item.Attrib); break; + case kpidCRC: if (item.CrcDefined) PropVarEm_Set_UInt32(value, item.Crc); break; + case kpidEncrypted: PropVarEm_Set_Bool(value, IsFolderEncrypted(_db.FileIndexToFolderIndexMap[index2])); break; + case kpidIsAnti: PropVarEm_Set_Bool(value, _db.IsItemAnti(index2)); break; + /* + case kpidIsAltStream: prop = item.IsAltStream; break; + case kpidNtSecure: + { + int id = _db.SecureIDs[index]; + size_t offs = _db.SecureOffsets[id]; + size_t size = _db.SecureOffsets[id + 1] - offs; + if (size >= 0) + { + prop.SetBlob(_db.SecureBuf + offs, (ULONG)size); + } + break; + } + */ + + case kpidPath: return _db.GetPath_Prop(index, value); + + #ifndef _SFX + + case kpidMethod: return SetMethodToProp(_db.FileIndexToFolderIndexMap[index2], value); + case kpidBlock: + { + CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + PropVarEm_Set_UInt32(value, (UInt32)folderIndex); + } + break; + /* + case kpidPackedSize0: + case kpidPackedSize1: + case kpidPackedSize2: + case kpidPackedSize3: + case kpidPackedSize4: + { + CNum folderIndex = _db.FileIndexToFolderIndexMap[index2]; + if (folderIndex != kNumNoIndex) + { + if (_db.FolderStartFileIndex[folderIndex] == (CNum)index2 && + _db.FoStartPackStreamIndex[folderIndex + 1] - + _db.FoStartPackStreamIndex[folderIndex] > (propID - kpidPackedSize0)) + { + PropVarEm_Set_UInt64(value, _db.GetFolderPackStreamSize(folderIndex, propID - kpidPackedSize0)); + } + } + else + PropVarEm_Set_UInt64(value, 0); + } + break; + */ + + #endif + } + // prop.Detach(value); + return S_OK; + // COM_TRY_END +} + +STDMETHODIMP CHandler::Open(IInStream *stream, + const UInt64 *maxCheckStartPosition, + IArchiveOpenCallback *openArchiveCallback) +{ + COM_TRY_BEGIN + Close(); + #ifndef _SFX + _fileInfoPopIDs.Clear(); + #endif + + try + { + CMyComPtr openArchiveCallbackTemp = openArchiveCallback; + + #ifndef _NO_CRYPTO + CMyComPtr getTextPassword; + if (openArchiveCallback) + openArchiveCallbackTemp.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword); + #endif + + CInArchive archive( + #ifdef __7Z_SET_PROPERTIES + _useMultiThreadMixer + #else + true + #endif + ); + _db.IsArc = false; + RINOK(archive.Open(stream, maxCheckStartPosition)); + _db.IsArc = true; + + HRESULT result = archive.ReadDatabase( + EXTERNAL_CODECS_VARS + _db + #ifndef _NO_CRYPTO + , getTextPassword, _isEncrypted, _passwordIsDefined, _password + #endif + ); + RINOK(result); + + _inStream = stream; + } + catch(...) + { + Close(); + // return E_INVALIDARG; + // return S_FALSE; + // we must return out_of_memory here + return E_OUTOFMEMORY; + } + // _inStream = stream; + #ifndef _SFX + FillPopIDs(); + #endif + return S_OK; + COM_TRY_END +} + +STDMETHODIMP CHandler::Close() +{ + COM_TRY_BEGIN + _inStream.Release(); + _db.Clear(); + #ifndef _NO_CRYPTO + _isEncrypted = false; + _passwordIsDefined = false; + _password.Empty(); + #endif + return S_OK; + COM_TRY_END +} + +#ifdef __7Z_SET_PROPERTIES +#ifdef EXTRACT_ONLY + +STDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps) +{ + COM_TRY_BEGIN + const UInt32 numProcessors = NSystem::GetNumberOfProcessors(); + _numThreads = numProcessors; + _useMultiThreadMixer = true; + + for (UInt32 i = 0; i < numProps; i++) + { + UString name = names[i]; + name.MakeLower_Ascii(); + if (name.IsEmpty()) + return E_INVALIDARG; + const PROPVARIANT &value = values[i]; + UInt32 number; + unsigned index = ParseStringToUInt32(name, number); + if (index == 0) + { + if (name.IsEqualTo("mtf")) + { + RINOK(PROPVARIANT_to_bool(value, _useMultiThreadMixer)); + continue; + } + if (name.IsPrefixedBy_Ascii_NoCase("mt")) + { + RINOK(ParseMtProp(name.Ptr(2), value, numProcessors, _numThreads)); + continue; + } + else + return E_INVALIDARG; + } + } + return S_OK; + COM_TRY_END +} + +#endif +#endif + +IMPL_ISetCompressCodecsInfo + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandler.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandler.h new file mode 100644 index 0000000000..00a8e834da --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandler.h @@ -0,0 +1,173 @@ +// 7z/Handler.h + +#ifndef __7Z_HANDLER_H +#define __7Z_HANDLER_H + +#include "../../ICoder.h" +#include "../IArchive.h" + +#include "../../Common/CreateCoder.h" + +#ifndef EXTRACT_ONLY +#include "../Common/HandlerOut.h" +#endif + +#include "7zCompressionMode.h" +#include "7zIn.h" + +namespace NArchive { +namespace N7z { + +#ifndef __7Z_SET_PROPERTIES + +#ifdef EXTRACT_ONLY + #if !defined(_7ZIP_ST) && !defined(_SFX) + #define __7Z_SET_PROPERTIES + #endif +#else + #define __7Z_SET_PROPERTIES +#endif + +#endif + + +#ifndef EXTRACT_ONLY + +class COutHandler: public CMultiMethodProps +{ + HRESULT SetSolidFromString(const UString &s); + HRESULT SetSolidFromPROPVARIANT(const PROPVARIANT &value); +public: + bool _removeSfxBlock; + + UInt64 _numSolidFiles; + UInt64 _numSolidBytes; + bool _numSolidBytesDefined; + bool _solidExtension; + bool _useTypeSorting; + + bool _compressHeaders; + bool _encryptHeadersSpecified; + bool _encryptHeaders; + // bool _useParents; 9.26 + + CBoolPair Write_CTime; + CBoolPair Write_ATime; + CBoolPair Write_MTime; + + bool _useMultiThreadMixer; + + // bool _volumeMode; + + void InitSolidFiles() { _numSolidFiles = (UInt64)(Int64)(-1); } + void InitSolidSize() { _numSolidBytes = (UInt64)(Int64)(-1); } + void InitSolid() + { + InitSolidFiles(); + InitSolidSize(); + _solidExtension = false; + _numSolidBytesDefined = false; + } + + void InitProps(); + + COutHandler() { InitProps(); } + + HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value); +}; + +#endif + +class CHandler: + public IInArchive, + public IArchiveGetRawProps, + #ifdef __7Z_SET_PROPERTIES + public ISetProperties, + #endif + #ifndef EXTRACT_ONLY + public IOutArchive, + #endif + PUBLIC_ISetCompressCodecsInfo + public CMyUnknownImp + #ifndef EXTRACT_ONLY + , public COutHandler + #endif +{ +public: + MY_QUERYINTERFACE_BEGIN2(IInArchive) + MY_QUERYINTERFACE_ENTRY(IArchiveGetRawProps) + #ifdef __7Z_SET_PROPERTIES + MY_QUERYINTERFACE_ENTRY(ISetProperties) + #endif + #ifndef EXTRACT_ONLY + MY_QUERYINTERFACE_ENTRY(IOutArchive) + #endif + QUERY_ENTRY_ISetCompressCodecsInfo + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + + INTERFACE_IInArchive(;) + INTERFACE_IArchiveGetRawProps(;) + + #ifdef __7Z_SET_PROPERTIES + STDMETHOD(SetProperties)(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps); + #endif + + #ifndef EXTRACT_ONLY + INTERFACE_IOutArchive(;) + #endif + + DECL_ISetCompressCodecsInfo + + CHandler(); + +private: + CMyComPtr _inStream; + NArchive::N7z::CDbEx _db; + + #ifndef _NO_CRYPTO + bool _isEncrypted; + bool _passwordIsDefined; + UString _password; + #endif + + #ifdef EXTRACT_ONLY + + #ifdef __7Z_SET_PROPERTIES + UInt32 _numThreads; + bool _useMultiThreadMixer; + #endif + + UInt32 _crcSize; + + #else + + CRecordVector _bonds; + + HRESULT PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m); + HRESULT SetHeaderMethod(CCompressionMethodMode &headerMethod); + HRESULT SetMainMethod(CCompressionMethodMode &method + #ifndef _7ZIP_ST + , UInt32 numThreads + #endif + ); + + + #endif + + bool IsFolderEncrypted(CNum folderIndex) const; + #ifndef _SFX + + CRecordVector _fileInfoPopIDs; + void FillPopIDs(); + void AddMethodName(AString &s, UInt64 id); + HRESULT SetMethodToProp(CNum folderIndex, PROPVARIANT *prop) const; + + #endif + + DECL_EXTERNAL_CODECS_VARS +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp new file mode 100644 index 0000000000..956a04d3e1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp @@ -0,0 +1,921 @@ +// 7zHandlerOut.cpp + +#include "StdAfx.h" + +#include "../../../Common/ComTry.h" +#include "../../../Common/StringToInt.h" +#include "../../../Common/Wildcard.h" + +#include "../Common/ItemNameUtils.h" +#include "../Common/ParseProperties.h" + +#include "7zHandler.h" +#include "7zOut.h" +#include "7zUpdate.h" + +using namespace NWindows; + +namespace NArchive { +namespace N7z { + +static const char *k_LZMA_Name = "LZMA"; +static const char *kDefaultMethodName = "LZMA2"; +static const char *k_Copy_Name = "Copy"; + +static const char *k_MatchFinder_ForHeaders = "BT2"; +#if defined(LZMASDKOBJC_OMIT_UNUSED_CODE) +#define k_NumFastBytes_ForHeaders 273 +#define k_Level_ForHeaders 5 +#else +static const UInt32 k_NumFastBytes_ForHeaders = 273; +static const UInt32 k_Level_ForHeaders = 5; +#endif +static const UInt32 k_Dictionary_ForHeaders = +#ifdef UNDER_CE + 1 << 18; +#else + 1 << 20; +#endif + +STDMETHODIMP CHandler::GetFileTimeType(UInt32 *type) +{ + *type = NFileTimeType::kWindows; + return S_OK; +} + +HRESULT CHandler::PropsMethod_To_FullMethod(CMethodFull &dest, const COneMethodInfo &m) +{ + if (!FindMethod( + EXTERNAL_CODECS_VARS + m.MethodName, dest.Id, dest.NumStreams)) + return E_INVALIDARG; + (CProps &)dest = (CProps &)m; + return S_OK; +} + +HRESULT CHandler::SetHeaderMethod(CCompressionMethodMode &headerMethod) +{ + if (!_compressHeaders) + return S_OK; + COneMethodInfo m; + m.MethodName = k_LZMA_Name; + m.AddProp_Ascii(NCoderPropID::kMatchFinder, k_MatchFinder_ForHeaders); + m.AddProp_Level(k_Level_ForHeaders); + m.AddProp32(NCoderPropID::kNumFastBytes, k_NumFastBytes_ForHeaders); + m.AddProp32(NCoderPropID::kDictionarySize, k_Dictionary_ForHeaders); + m.AddProp_NumThreads(1); + + CMethodFull &methodFull = headerMethod.Methods.AddNew(); + return PropsMethod_To_FullMethod(methodFull, m); +} + +HRESULT CHandler::SetMainMethod( + CCompressionMethodMode &methodMode + #ifndef _7ZIP_ST + , UInt32 numThreads + #endif + ) +{ + methodMode.Bonds = _bonds; + + CObjectVector methods = _methods; + + { + FOR_VECTOR (i, methods) + { + AString &methodName = methods[i].MethodName; + if (methodName.IsEmpty()) + methodName = kDefaultMethodName; + } + if (methods.IsEmpty()) + { + COneMethodInfo &m = methods.AddNew(); + m.MethodName = (GetLevel() == 0 ? k_Copy_Name : kDefaultMethodName); + methodMode.DefaultMethod_was_Inserted = true; + } + } + + if (!_filterMethod.MethodName.IsEmpty()) + { + // if (methodMode.Bonds.IsEmpty()) + { + FOR_VECTOR (k, methodMode.Bonds) + { + CBond2 &bond = methodMode.Bonds[k]; + bond.InCoder++; + bond.OutCoder++; + } + methods.Insert(0, _filterMethod); + methodMode.Filter_was_Inserted = true; + } + } + + const UInt64 kSolidBytes_Min = (1 << 24); + const UInt64 kSolidBytes_Max = ((UInt64)1 << 32) - 1; + + bool needSolid = false; + + FOR_VECTOR (i, methods) + { + COneMethodInfo &oneMethodInfo = methods[i]; + SetGlobalLevelAndThreads(oneMethodInfo + #ifndef _7ZIP_ST + , numThreads + #endif + ); + + CMethodFull &methodFull = methodMode.Methods.AddNew(); + RINOK(PropsMethod_To_FullMethod(methodFull, oneMethodInfo)); + + if (methodFull.Id != k_Copy) + needSolid = true; + + if (_numSolidBytesDefined) + continue; + + UInt32 dicSize; + switch (methodFull.Id) + { + case k_LZMA: + case k_LZMA2: dicSize = oneMethodInfo.Get_Lzma_DicSize(); break; + case k_PPMD: dicSize = oneMethodInfo.Get_Ppmd_MemSize(); break; + case k_Deflate: dicSize = (UInt32)1 << 15; break; + case k_BZip2: dicSize = oneMethodInfo.Get_BZip2_BlockSize(); break; + default: continue; + } + + _numSolidBytes = (UInt64)dicSize << 7; + if (_numSolidBytes < kSolidBytes_Min) _numSolidBytes = kSolidBytes_Min; + if (_numSolidBytes > kSolidBytes_Max) _numSolidBytes = kSolidBytes_Max; + _numSolidBytesDefined = true; + } + + if (!_numSolidBytesDefined) { + if (needSolid) { + _numSolidBytes = kSolidBytes_Max; + } + else { + _numSolidBytes = 0; + } + } + _numSolidBytesDefined = true; + return S_OK; +} + +static HRESULT GetTime(IArchiveUpdateCallback *updateCallback, int index, PROPID propID, UInt64 &ft, bool &ftDefined) +{ + // ft = 0; + // ftDefined = false; + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(index, propID, &prop)); + if (prop.vt == VT_FILETIME) + { + ft = prop.filetime.dwLowDateTime | ((UInt64)prop.filetime.dwHighDateTime << 32); + ftDefined = true; + } + else if (prop.vt != VT_EMPTY) + return E_INVALIDARG; + else + { + ft = 0; + ftDefined = false; + } + return S_OK; +} + +/* + +#ifdef _WIN32 +static const wchar_t kDirDelimiter1 = L'\\'; +#endif +static const wchar_t kDirDelimiter2 = L'/'; + +static inline bool IsCharDirLimiter(wchar_t c) +{ + return ( + #ifdef _WIN32 + c == kDirDelimiter1 || + #endif + c == kDirDelimiter2); +} + +static int FillSortIndex(CObjectVector &treeFolders, int cur, int curSortIndex) +{ + CTreeFolder &tf = treeFolders[cur]; + tf.SortIndex = curSortIndex++; + for (int i = 0; i < tf.SubFolders.Size(); i++) + curSortIndex = FillSortIndex(treeFolders, tf.SubFolders[i], curSortIndex); + tf.SortIndexEnd = curSortIndex; + return curSortIndex; +} + +static int FindSubFolder(const CObjectVector &treeFolders, int cur, const UString &name, int &insertPos) +{ + const CIntVector &subFolders = treeFolders[cur].SubFolders; + int left = 0, right = subFolders.Size(); + insertPos = -1; + for (;;) + { + if (left == right) + { + insertPos = left; + return -1; + } + int mid = (left + right) / 2; + int midFolder = subFolders[mid]; + int compare = CompareFileNames(name, treeFolders[midFolder].Name); + if (compare == 0) + return midFolder; + if (compare < 0) + right = mid; + else + left = mid + 1; + } +} + +static int AddFolder(CObjectVector &treeFolders, int cur, const UString &name) +{ + int insertPos; + int folderIndex = FindSubFolder(treeFolders, cur, name, insertPos); + if (folderIndex < 0) + { + folderIndex = treeFolders.Size(); + CTreeFolder &newFolder = treeFolders.AddNew(); + newFolder.Parent = cur; + newFolder.Name = name; + treeFolders[cur].SubFolders.Insert(insertPos, folderIndex); + } + // else if (treeFolders[folderIndex].IsAltStreamFolder != isAltStreamFolder) throw 1123234234; + return folderIndex; +} +*/ + +STDMETHODIMP CHandler::UpdateItems(ISequentialOutStream *outStream, UInt32 numItems, + IArchiveUpdateCallback *updateCallback) +{ + COM_TRY_BEGIN + + const CDbEx *db = 0; + #ifdef _7Z_VOL + if (_volumes.Size() > 1) + return E_FAIL; + const CVolume *volume = 0; + if (_volumes.Size() == 1) + { + volume = &_volumes.Front(); + db = &volume->Database; + } + #else + if (_inStream != 0) + db = &_db; + #endif + + /* + CMyComPtr getRawProps; + updateCallback->QueryInterface(IID_IArchiveGetRawProps, (void **)&getRawProps); + + CUniqBlocks secureBlocks; + secureBlocks.AddUniq(NULL, 0); + + CObjectVector treeFolders; + { + CTreeFolder folder; + folder.Parent = -1; + treeFolders.Add(folder); + } + */ + + CObjectVector updateItems; + + bool need_CTime = (Write_CTime.Def && Write_CTime.Val); + bool need_ATime = (Write_ATime.Def && Write_ATime.Val); + bool need_MTime = ((Write_MTime.Def && Write_MTime.Val) || !Write_MTime.Def); + + if (db && !db->Files.IsEmpty()) + { + if (!Write_CTime.Def) need_CTime = !db->CTime.Defs.IsEmpty(); + if (!Write_ATime.Def) need_ATime = !db->ATime.Defs.IsEmpty(); + if (!Write_MTime.Def) need_MTime = !db->MTime.Defs.IsEmpty(); + } + + UString s; + + for (UInt32 i = 0; i < numItems; i++) + { + Int32 newData, newProps; + UInt32 indexInArchive; + if (!updateCallback) + return E_FAIL; + RINOK(updateCallback->GetUpdateItemInfo(i, &newData, &newProps, &indexInArchive)); + CUpdateItem ui; + ui.NewProps = IntToBool(newProps); + ui.NewData = IntToBool(newData); + ui.IndexInArchive = indexInArchive; + ui.IndexInClient = i; + ui.IsAnti = false; + ui.Size = 0; + + UString name; + // bool isAltStream = false; + if (ui.IndexInArchive != -1) + { + if (db == 0 || (unsigned)ui.IndexInArchive >= db->Files.Size()) + return E_INVALIDARG; + const CFileItem &fi = db->Files[ui.IndexInArchive]; + if (!ui.NewProps) + { + _db.GetPath(ui.IndexInArchive, name); + } + ui.IsDir = fi.IsDir; + ui.Size = fi.Size; + // isAltStream = fi.IsAltStream; + ui.IsAnti = db->IsItemAnti(ui.IndexInArchive); + + if (!ui.NewProps) + { + ui.CTimeDefined = db->CTime.GetItem(ui.IndexInArchive, ui.CTime); + ui.ATimeDefined = db->ATime.GetItem(ui.IndexInArchive, ui.ATime); + ui.MTimeDefined = db->MTime.GetItem(ui.IndexInArchive, ui.MTime); + } + } + + if (ui.NewProps) + { + bool folderStatusIsDefined; + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(i, kpidAttrib, &prop)); + if (prop.vt == VT_EMPTY) + ui.AttribDefined = false; + else if (prop.vt != VT_UI4) + return E_INVALIDARG; + else + { + ui.Attrib = prop.ulVal; + ui.AttribDefined = true; + } + } + + // we need MTime to sort files. + if (need_CTime) RINOK(GetTime(updateCallback, i, kpidCTime, ui.CTime, ui.CTimeDefined)); + if (need_ATime) RINOK(GetTime(updateCallback, i, kpidATime, ui.ATime, ui.ATimeDefined)); + if (need_MTime) RINOK(GetTime(updateCallback, i, kpidMTime, ui.MTime, ui.MTimeDefined)); + + /* + if (getRawProps) + { + const void *data; + UInt32 dataSize; + UInt32 propType; + + getRawProps->GetRawProp(i, kpidNtSecure, &data, &dataSize, &propType); + if (dataSize != 0 && propType != NPropDataType::kRaw) + return E_FAIL; + ui.SecureIndex = secureBlocks.AddUniq((const Byte *)data, dataSize); + } + */ + + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(i, kpidPath, &prop)); + if (prop.vt == VT_EMPTY) + { + } + else if (prop.vt != VT_BSTR) + return E_INVALIDARG; + else + { + name = NItemName::MakeLegalName(prop.bstrVal); + } + } + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(i, kpidIsDir, &prop)); + if (prop.vt == VT_EMPTY) + folderStatusIsDefined = false; + else if (prop.vt != VT_BOOL) + return E_INVALIDARG; + else + { + ui.IsDir = (prop.boolVal != VARIANT_FALSE); + folderStatusIsDefined = true; + } + } + + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(i, kpidIsAnti, &prop)); + if (prop.vt == VT_EMPTY) + ui.IsAnti = false; + else if (prop.vt != VT_BOOL) + return E_INVALIDARG; + else + ui.IsAnti = (prop.boolVal != VARIANT_FALSE); + } + + /* + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(i, kpidIsAltStream, &prop)); + if (prop.vt == VT_EMPTY) + isAltStream = false; + else if (prop.vt != VT_BOOL) + return E_INVALIDARG; + else + isAltStream = (prop.boolVal != VARIANT_FALSE); + } + */ + + if (ui.IsAnti) + { + ui.AttribDefined = false; + + ui.CTimeDefined = false; + ui.ATimeDefined = false; + ui.MTimeDefined = false; + + ui.Size = 0; + } + + if (!folderStatusIsDefined && ui.AttribDefined) + ui.SetDirStatusFromAttrib(); + } + else + { + /* + if (_db.SecureIDs.IsEmpty()) + ui.SecureIndex = secureBlocks.AddUniq(NULL, 0); + else + { + int id = _db.SecureIDs[ui.IndexInArchive]; + size_t offs = _db.SecureOffsets[id]; + size_t size = _db.SecureOffsets[id + 1] - offs; + ui.SecureIndex = secureBlocks.AddUniq(_db.SecureBuf + offs, size); + } + */ + } + + /* + { + int folderIndex = 0; + if (_useParents) + { + int j; + s.Empty(); + for (j = 0; j < name.Len(); j++) + { + wchar_t c = name[j]; + if (IsCharDirLimiter(c)) + { + folderIndex = AddFolder(treeFolders, folderIndex, s); + s.Empty(); + continue; + } + s += c; + } + if (isAltStream) + { + int colonPos = s.Find(':'); + if (colonPos < 0) + { + // isAltStream = false; + return E_INVALIDARG; + } + UString mainName = s.Left(colonPos); + int newFolderIndex = AddFolder(treeFolders, folderIndex, mainName); + if (treeFolders[newFolderIndex].UpdateItemIndex < 0) + { + for (int j = updateItems.Size() - 1; j >= 0; j--) + { + CUpdateItem &ui2 = updateItems[j]; + if (ui2.ParentFolderIndex == folderIndex + && ui2.Name == mainName) + { + ui2.TreeFolderIndex = newFolderIndex; + treeFolders[newFolderIndex].UpdateItemIndex = j; + } + } + } + folderIndex = newFolderIndex; + s.Delete(0, colonPos + 1); + } + ui.Name = s; + } + else + ui.Name = name; + ui.IsAltStream = isAltStream; + ui.ParentFolderIndex = folderIndex; + ui.TreeFolderIndex = -1; + if (ui.IsDir && !s.IsEmpty()) + { + ui.TreeFolderIndex = AddFolder(treeFolders, folderIndex, s); + treeFolders[ui.TreeFolderIndex].UpdateItemIndex = updateItems.Size(); + } + } + */ + ui.Name = name; + + if (ui.NewData) + { + ui.Size = 0; + if (!ui.IsDir) + { + NCOM::CPropVariant prop; + RINOK(updateCallback->GetProperty(i, kpidSize, &prop)); + if (prop.vt != VT_UI8) + return E_INVALIDARG; + ui.Size = (UInt64)prop.uhVal.QuadPart; + if (ui.Size != 0 && ui.IsAnti) + return E_INVALIDARG; + } + } + + updateItems.Add(ui); + } + + /* + FillSortIndex(treeFolders, 0, 0); + for (i = 0; i < (UInt32)updateItems.Size(); i++) + { + CUpdateItem &ui = updateItems[i]; + ui.ParentSortIndex = treeFolders[ui.ParentFolderIndex].SortIndex; + ui.ParentSortIndexEnd = treeFolders[ui.ParentFolderIndex].SortIndexEnd; + } + */ + + CCompressionMethodMode methodMode, headerMethod; + + HRESULT res = SetMainMethod(methodMode + #ifndef _7ZIP_ST + , _numThreads + #endif + ); + RINOK(res); + + RINOK(SetHeaderMethod(headerMethod)); + + #ifndef _7ZIP_ST + methodMode.NumThreads = _numThreads; + methodMode.MultiThreadMixer = _useMultiThreadMixer; + headerMethod.NumThreads = 1; + headerMethod.MultiThreadMixer = _useMultiThreadMixer; + #endif + + CMyComPtr getPassword2; + updateCallback->QueryInterface(IID_ICryptoGetTextPassword2, (void **)&getPassword2); + + methodMode.PasswordIsDefined = false; + methodMode.Password.Empty(); + if (getPassword2) + { + CMyComBSTR password; + Int32 passwordIsDefined; + RINOK(getPassword2->CryptoGetTextPassword2(&passwordIsDefined, &password)); + methodMode.PasswordIsDefined = IntToBool(passwordIsDefined); + if (methodMode.PasswordIsDefined && password) + methodMode.Password = password; + } + + bool compressMainHeader = _compressHeaders; // check it + + bool encryptHeaders = false; + + #ifndef _NO_CRYPTO + if (!methodMode.PasswordIsDefined && _passwordIsDefined) + { + // if header is compressed, we use that password for updated archive + methodMode.PasswordIsDefined = true; + methodMode.Password = _password; + } + #endif + + if (methodMode.PasswordIsDefined) + { + if (_encryptHeadersSpecified) + encryptHeaders = _encryptHeaders; + #ifndef _NO_CRYPTO + else + encryptHeaders = _passwordIsDefined; + #endif + compressMainHeader = true; + if (encryptHeaders) + { + headerMethod.PasswordIsDefined = methodMode.PasswordIsDefined; + headerMethod.Password = methodMode.Password; + } + } + + if (numItems < 2) + compressMainHeader = false; + + int level = GetLevel(); + + CUpdateOptions options; + options.Method = &methodMode; + options.HeaderMethod = (_compressHeaders || encryptHeaders) ? &headerMethod : NULL; + options.UseFilters = (level != 0 && _autoFilter && !methodMode.Filter_was_Inserted); + options.MaxFilter = (level >= 8); + options.AnalysisLevel = GetAnalysisLevel(); + + options.HeaderOptions.CompressMainHeader = compressMainHeader; + /* + options.HeaderOptions.WriteCTime = Write_CTime; + options.HeaderOptions.WriteATime = Write_ATime; + options.HeaderOptions.WriteMTime = Write_MTime; + */ + + options.NumSolidFiles = _numSolidFiles; + options.NumSolidBytes = _numSolidBytes; + options.SolidExtension = _solidExtension; + options.UseTypeSorting = _useTypeSorting; + + options.RemoveSfxBlock = _removeSfxBlock; + // options.VolumeMode = _volumeMode; + + options.MultiThreadMixer = _useMultiThreadMixer; + + COutArchive archive; + CArchiveDatabaseOut newDatabase; + + CMyComPtr getPassword; + updateCallback->QueryInterface(IID_ICryptoGetTextPassword, (void **)&getPassword); + + /* + if (secureBlocks.Sorted.Size() > 1) + { + secureBlocks.GetReverseMap(); + for (int i = 0; i < updateItems.Size(); i++) + { + int &secureIndex = updateItems[i].SecureIndex; + secureIndex = secureBlocks.BufIndexToSortedIndex[secureIndex]; + } + } + */ + + res = Update( + EXTERNAL_CODECS_VARS + #ifdef _7Z_VOL + volume ? volume->Stream: 0, + volume ? db : 0, + #else + _inStream, + db, + #endif + updateItems, + // treeFolders, + // secureBlocks, + archive, newDatabase, outStream, updateCallback, options + #ifndef _NO_CRYPTO + , getPassword + #endif + ); + + RINOK(res); + + updateItems.ClearAndFree(); + + return archive.WriteDatabase(EXTERNAL_CODECS_VARS + newDatabase, options.HeaderMethod, options.HeaderOptions); + + COM_TRY_END +} + +static HRESULT ParseBond(UString &srcString, UInt32 &coder, UInt32 &stream) +{ + stream = 0; + { + unsigned index = ParseStringToUInt32(srcString, coder); + if (index == 0) + return E_INVALIDARG; + srcString.DeleteFrontal(index); + } + if (srcString[0] == 's') + { + srcString.Delete(0); + unsigned index = ParseStringToUInt32(srcString, stream); + if (index == 0) + return E_INVALIDARG; + srcString.DeleteFrontal(index); + } + return S_OK; +} + +void COutHandler::InitProps() +{ + CMultiMethodProps::Init(); + + _removeSfxBlock = false; + _compressHeaders = true; + _encryptHeadersSpecified = false; + _encryptHeaders = false; + // _useParents = false; + + Write_CTime.Init(); + Write_ATime.Init(); + Write_MTime.Init(); + + _useMultiThreadMixer = true; + + // _volumeMode = false; + + InitSolid(); + _useTypeSorting = false; +} + +HRESULT COutHandler::SetSolidFromString(const UString &s) +{ + UString s2 = s; + s2.MakeLower_Ascii(); + for (unsigned i = 0; i < s2.Len();) + { + const wchar_t *start = ((const wchar_t *)s2) + i; + const wchar_t *end; + UInt64 v = ConvertStringToUInt64(start, &end); + if (start == end) + { + if (s2[i++] != 'e') + return E_INVALIDARG; + _solidExtension = true; + continue; + } + i += (int)(end - start); + if (i == s2.Len()) + return E_INVALIDARG; + wchar_t c = s2[i++]; + if (c == 'f') + { + if (v < 1) + v = 1; + _numSolidFiles = v; + } + else + { + unsigned numBits; + switch (c) + { + case 'b': numBits = 0; break; + case 'k': numBits = 10; break; + case 'm': numBits = 20; break; + case 'g': numBits = 30; break; + case 't': numBits = 40; break; + default: return E_INVALIDARG; + } + _numSolidBytes = (v << numBits); + _numSolidBytesDefined = true; + } + } + return S_OK; +} + +HRESULT COutHandler::SetSolidFromPROPVARIANT(const PROPVARIANT &value) +{ + bool isSolid; + switch (value.vt) + { + case VT_EMPTY: isSolid = true; break; + case VT_BOOL: isSolid = (value.boolVal != VARIANT_FALSE); break; + case VT_BSTR: + if (StringToBool(value.bstrVal, isSolid)) + break; + return SetSolidFromString(value.bstrVal); + default: return E_INVALIDARG; + } + if (isSolid) + InitSolid(); + else + _numSolidFiles = 1; + return S_OK; +} + +static HRESULT PROPVARIANT_to_BoolPair(const PROPVARIANT &prop, CBoolPair &dest) +{ + RINOK(PROPVARIANT_to_bool(prop, dest.Val)); + dest.Def = true; + return S_OK; +} + +HRESULT COutHandler::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value) +{ + UString name = nameSpec; + name.MakeLower_Ascii(); + if (name.IsEmpty()) + return E_INVALIDARG; + + if (name[0] == L's') + { + name.Delete(0); + if (name.IsEmpty()) + return SetSolidFromPROPVARIANT(value); + if (value.vt != VT_EMPTY) + return E_INVALIDARG; + return SetSolidFromString(name); + } + + UInt32 number; + int index = ParseStringToUInt32(name, number); + // UString realName = name.Ptr(index); + if (index == 0) + { + if (name.IsEqualTo("rsfx")) return PROPVARIANT_to_bool(value, _removeSfxBlock); + if (name.IsEqualTo("hc")) return PROPVARIANT_to_bool(value, _compressHeaders); + // if (name.IsEqualToNoCase(L"HS")) return PROPVARIANT_to_bool(value, _useParents); + + if (name.IsEqualTo("hcf")) + { + bool compressHeadersFull = true; + RINOK(PROPVARIANT_to_bool(value, compressHeadersFull)); + return compressHeadersFull ? S_OK: E_INVALIDARG; + } + + if (name.IsEqualTo("he")) + { + RINOK(PROPVARIANT_to_bool(value, _encryptHeaders)); + _encryptHeadersSpecified = true; + return S_OK; + } + + if (name.IsEqualTo("tc")) return PROPVARIANT_to_BoolPair(value, Write_CTime); + if (name.IsEqualTo("ta")) return PROPVARIANT_to_BoolPair(value, Write_ATime); + if (name.IsEqualTo("tm")) return PROPVARIANT_to_BoolPair(value, Write_MTime); + + if (name.IsEqualTo("mtf")) return PROPVARIANT_to_bool(value, _useMultiThreadMixer); + + if (name.IsEqualTo("qs")) return PROPVARIANT_to_bool(value, _useTypeSorting); + + // if (name.IsEqualTo("v")) return PROPVARIANT_to_bool(value, _volumeMode); + } + return CMultiMethodProps::SetProperty(name, value); +} + +STDMETHODIMP CHandler::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps) +{ + COM_TRY_BEGIN + _bonds.Clear(); + InitProps(); + + for (UInt32 i = 0; i < numProps; i++) + { + UString name = names[i]; + name.MakeLower_Ascii(); + if (name.IsEmpty()) + return E_INVALIDARG; + + const PROPVARIANT &value = values[i]; + + if (name[0] == 'b') + { + if (value.vt != VT_EMPTY) + return E_INVALIDARG; + name.Delete(0); + + CBond2 bond; + RINOK(ParseBond(name, bond.OutCoder, bond.OutStream)); + if (name[0] != ':') + return E_INVALIDARG; + name.Delete(0); + UInt32 inStream = 0; + RINOK(ParseBond(name, bond.InCoder, inStream)); + if (inStream != 0) + return E_INVALIDARG; + if (!name.IsEmpty()) + return E_INVALIDARG; + _bonds.Add(bond); + continue; + } + + RINOK(SetProperty(name, value)); + } + + unsigned numEmptyMethods = GetNumEmptyMethods(); + if (numEmptyMethods > 0) + { + unsigned k; + for (k = 0; k < _bonds.Size(); k++) + { + const CBond2 &bond = _bonds[k]; + if (bond.InCoder < (UInt32)numEmptyMethods || + bond.OutCoder < (UInt32)numEmptyMethods) + return E_INVALIDARG; + } + for (k = 0; k < _bonds.Size(); k++) + { + CBond2 &bond = _bonds[k]; + bond.InCoder -= (UInt32)numEmptyMethods; + bond.OutCoder -= (UInt32)numEmptyMethods; + } + _methods.DeleteFrontal(numEmptyMethods); + } + + FOR_VECTOR (k, _bonds) + { + const CBond2 &bond = _bonds[k]; + if (bond.InCoder >= (UInt32)_methods.Size() || + bond.OutCoder >= (UInt32)_methods.Size()) + return E_INVALIDARG; + } + + return S_OK; + COM_TRY_END +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHeader.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHeader.cpp new file mode 100644 index 0000000000..de3990961b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHeader.cpp @@ -0,0 +1,19 @@ +// 7zHeader.cpp + +#include "StdAfx.h" + +#include "7zHeader.h" + +namespace NArchive { +namespace N7z { + +Byte kSignature[kSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; +#ifdef _7Z_VOL +Byte kFinishSignature[kSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C + 1}; +#endif + +// We can change signature. So file doesn't contain correct signature. +// struct SignatureInitializer { SignatureInitializer() { kSignature[0]--; } }; +// static SignatureInitializer g_SignatureInitializer; + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHeader.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHeader.h new file mode 100644 index 0000000000..7de6eee85d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zHeader.h @@ -0,0 +1,148 @@ +// 7z/7zHeader.h + +#ifndef __7Z_HEADER_H +#define __7Z_HEADER_H + +#include "../../../Common/MyTypes.h" + +namespace NArchive { +namespace N7z { + +const unsigned kSignatureSize = 6; +extern Byte kSignature[kSignatureSize]; + +// #define _7Z_VOL +// 7z-MultiVolume is not finished yet. +// It can work already, but I still do not like some +// things of that new multivolume format. +// So please keep it commented. + +#ifdef _7Z_VOL +extern Byte kFinishSignature[kSignatureSize]; +#endif + +struct CArchiveVersion +{ + Byte Major; + Byte Minor; +}; + +const Byte kMajorVersion = 0; + +struct CStartHeader +{ + UInt64 NextHeaderOffset; + UInt64 NextHeaderSize; + UInt32 NextHeaderCRC; +}; + +const UInt32 kStartHeaderSize = 20; + +#ifdef _7Z_VOL +struct CFinishHeader: public CStartHeader +{ + UInt64 ArchiveStartOffset; // data offset from end if that struct + UInt64 AdditionalStartBlockSize; // start signature & start header size +}; + +const UInt32 kFinishHeaderSize = kStartHeaderSize + 16; +#endif + +namespace NID +{ + enum EEnum + { + kEnd, + + kHeader, + + kArchiveProperties, + + kAdditionalStreamsInfo, + kMainStreamsInfo, + kFilesInfo, + + kPackInfo, + kUnpackInfo, + kSubStreamsInfo, + + kSize, + kCRC, + + kFolder, + + kCodersUnpackSize, + kNumUnpackStream, + + kEmptyStream, + kEmptyFile, + kAnti, + + kName, + kCTime, + kATime, + kMTime, + kWinAttrib, + kComment, + + kEncodedHeader, + + kStartPos, + kDummy + + // kNtSecure, + // kParent, + // kIsAux + }; +} + + +const UInt32 k_Copy = 0; +const UInt32 k_Delta = 3; + +const UInt32 k_LZMA2 = 0x21; + +const UInt32 k_SWAP2 = 0x20302; +const UInt32 k_SWAP4 = 0x20304; + +const UInt32 k_LZMA = 0x30101; +const UInt32 k_PPMD = 0x30401; + +const UInt32 k_Deflate = 0x40108; +const UInt32 k_BZip2 = 0x40202; + +const UInt32 k_BCJ = 0x3030103; +const UInt32 k_BCJ2 = 0x303011B; +const UInt32 k_PPC = 0x3030205; +const UInt32 k_IA64 = 0x3030401; +const UInt32 k_ARM = 0x3030501; +const UInt32 k_ARMT = 0x3030701; +const UInt32 k_SPARC = 0x3030805; + +const UInt32 k_AES = 0x6F10701; + + +static inline bool IsFilterMethod(UInt64 m) +{ + if (m > (UInt64)0xFFFFFFFF) + return false; + switch ((UInt32)m) + { + case k_Delta: + case k_BCJ: + case k_BCJ2: + case k_PPC: + case k_IA64: + case k_ARM: + case k_ARMT: + case k_SPARC: + case k_SWAP2: + case k_SWAP4: + return true; + } + return false; +} + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zIn.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zIn.cpp new file mode 100644 index 0000000000..bbb8e13f6d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zIn.cpp @@ -0,0 +1,1643 @@ +// 7zIn.cpp + +#include "StdAfx.h" + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "../../../../C/7zCrc.h" +#include "../../../../C/CpuArch.h" + +#include "../../Common/StreamObjects.h" +#include "../../Common/StreamUtils.h" + +#include "7zDecode.h" +#include "7zIn.h" + +#define Get16(p) GetUi16(p) +#define Get32(p) GetUi32(p) +#define Get64(p) GetUi64(p) + +// define FORMAT_7Z_RECOVERY if you want to recover multivolume archives with empty StartHeader +#ifndef _SFX +#define FORMAT_7Z_RECOVERY +#endif + +using namespace NWindows; +using namespace NCOM; + +namespace NArchive { +namespace N7z { + +static void BoolVector_Fill_False(CBoolVector &v, unsigned size) +{ + v.ClearAndSetSize(size); + bool *p = &v[0]; + for (unsigned i = 0; i < size; i++) + p[i] = false; +} + +class CInArchiveException {}; +class CUnsupportedFeatureException: public CInArchiveException {}; + +static void ThrowException() { throw CInArchiveException(); } +static inline void ThrowEndOfData() { ThrowException(); } +static inline void ThrowUnsupported() { throw CUnsupportedFeatureException(); } +static inline void ThrowIncorrect() { ThrowException(); } + +class CStreamSwitch +{ + CInArchive *_archive; + bool _needRemove; + bool _needUpdatePos; +public: + CStreamSwitch(): _needRemove(false), _needUpdatePos(false) {} + ~CStreamSwitch() { Remove(); } + void Remove(); + void Set(CInArchive *archive, const Byte *data, size_t size, bool needUpdatePos); + void Set(CInArchive *archive, const CByteBuffer &byteBuffer); + void Set(CInArchive *archive, const CObjectVector *dataVector); +}; + +void CStreamSwitch::Remove() +{ + if (_needRemove) + { + if (_archive->_inByteBack->GetRem() != 0) + _archive->ThereIsHeaderError = true; + _archive->DeleteByteStream(_needUpdatePos); + _needRemove = false; + } +} + +void CStreamSwitch::Set(CInArchive *archive, const Byte *data, size_t size, bool needUpdatePos) +{ + Remove(); + _archive = archive; + _archive->AddByteStream(data, size); + _needRemove = true; + _needUpdatePos = needUpdatePos; +} + +void CStreamSwitch::Set(CInArchive *archive, const CByteBuffer &byteBuffer) +{ + Set(archive, byteBuffer, byteBuffer.Size(), false); +} + +void CStreamSwitch::Set(CInArchive *archive, const CObjectVector *dataVector) +{ + Remove(); + Byte external = archive->ReadByte(); + if (external != 0) + { + if (!dataVector) + ThrowIncorrect(); + CNum dataIndex = archive->ReadNum(); + if (dataIndex >= dataVector->Size()) + ThrowIncorrect(); + Set(archive, (*dataVector)[dataIndex]); + } +} + +void CInArchive::AddByteStream(const Byte *buf, size_t size) +{ + if (_numInByteBufs == kNumBufLevelsMax) + ThrowIncorrect(); + _inByteBack = &_inByteVector[_numInByteBufs++]; + _inByteBack->Init(buf, size); +} + + +Byte CInByte2::ReadByte() +{ + if (_pos >= _size) + ThrowEndOfData(); + return _buffer[_pos++]; +} + +void CInByte2::ReadBytes(Byte *data, size_t size) +{ + if (size == 0) + return; + if (size > _size - _pos) + ThrowEndOfData(); + memcpy(data, _buffer + _pos, size); + _pos += size; +} + +void CInByte2::SkipData(UInt64 size) +{ + if (size > _size - _pos) + ThrowEndOfData(); + _pos += (size_t)size; +} + +void CInByte2::SkipData() +{ + SkipData(ReadNumber()); +} + +static UInt64 ReadNumberSpec(const Byte *p, size_t size, size_t &processed) +{ + if (size == 0) + { + processed = 0; + return 0; + } + + unsigned b = *p++; + size--; + + if ((b & 0x80) == 0) + { + processed = 1; + return b; + } + + if (size == 0) + { + processed = 0; + return 0; + } + + UInt64 value = (UInt64)*p; + p++; + size--; + + for (unsigned i = 1; i < 8; i++) + { + unsigned mask = (unsigned)0x80 >> i; + if ((b & mask) == 0) + { + UInt64 high = b & (mask - 1); + value |= (high << (i * 8)); + processed = i + 1; + return value; + } + + if (size == 0) + { + processed = 0; + return 0; + } + + value |= ((UInt64)*p << (i * 8)); + p++; + size--; + } + + processed = 9; + return value; +} + +UInt64 CInByte2::ReadNumber() +{ + size_t processed; + UInt64 res = ReadNumberSpec(_buffer + _pos, _size - _pos, processed); + if (processed == 0) + ThrowEndOfData(); + _pos += processed; + return res; +} + +CNum CInByte2::ReadNum() +{ + /* + if (_pos < _size) + { + Byte val = _buffer[_pos]; + if ((unsigned)val < 0x80) + { + _pos++; + return (unsigned)val; + } + } + */ + UInt64 value = ReadNumber(); + if (value > kNumMax) + ThrowUnsupported(); + return (CNum)value; +} + +UInt32 CInByte2::ReadUInt32() +{ + if (_pos + 4 > _size) + ThrowEndOfData(); + UInt32 res = Get32(_buffer + _pos); + _pos += 4; + return res; +} + +UInt64 CInByte2::ReadUInt64() +{ + if (_pos + 8 > _size) + ThrowEndOfData(); + UInt64 res = Get64(_buffer + _pos); + _pos += 8; + return res; +} + +#define CHECK_SIGNATURE if (p[0] != '7' || p[1] != 'z' || p[2] != 0xBC || p[3] != 0xAF || p[4] != 0x27 || p[5] != 0x1C) return false; + +static inline bool TestSignature(const Byte *p) +{ + CHECK_SIGNATURE + return CrcCalc(p + 12, 20) == Get32(p + 8); +} + +#ifdef FORMAT_7Z_RECOVERY +static inline bool TestSignature2(const Byte *p) +{ + CHECK_SIGNATURE; + if (CrcCalc(p + 12, 20) == Get32(p + 8)) + return true; + for (unsigned i = 8; i < kHeaderSize; i++) + if (p[i] != 0) + return false; + return (p[6] != 0 || p[7] != 0); +} +#else +#define TestSignature2(p) TestSignature(p) +#endif + +HRESULT CInArchive::FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit) +{ + RINOK(ReadStream_FALSE(stream, _header, kHeaderSize)); + + if (TestSignature2(_header)) + return S_OK; + if (searchHeaderSizeLimit && *searchHeaderSizeLimit == 0) + return S_FALSE; + + const UInt32 kBufSize = 1 << 15; + CByteArr buf(kBufSize); + memcpy(buf, _header, kHeaderSize); + UInt64 offset = 0; + + for (;;) + { + UInt32 readSize = kBufSize - kHeaderSize; + if (searchHeaderSizeLimit) + { + UInt64 rem = *searchHeaderSizeLimit - offset; + if (readSize > rem) + readSize = (UInt32)rem; + if (readSize == 0) + return S_FALSE; + } + + UInt32 processed = 0; + RINOK(stream->Read(buf + kHeaderSize, readSize, &processed)); + if (processed == 0) + return S_FALSE; + + for (UInt32 pos = 0;;) + { + const Byte *p = buf + pos + 1; + const Byte *lim = buf + processed; + for (; p <= lim; p += 4) + { + if (p[0] == '7') break; + if (p[1] == '7') { p += 1; break; } + if (p[2] == '7') { p += 2; break; } + if (p[3] == '7') { p += 3; break; } + }; + if (p > lim) + break; + pos = (UInt32)(p - buf); + if (TestSignature(p)) + { + memcpy(_header, p, kHeaderSize); + _arhiveBeginStreamPosition += offset + pos; + return stream->Seek(_arhiveBeginStreamPosition + kHeaderSize, STREAM_SEEK_SET, NULL); + } + } + + offset += processed; + memmove(buf, buf + processed, kHeaderSize); + } +} + +// S_FALSE means that file is not archive +HRESULT CInArchive::Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit) +{ + HeadersSize = 0; + Close(); + RINOK(stream->Seek(0, STREAM_SEEK_CUR, &_arhiveBeginStreamPosition)) + RINOK(stream->Seek(0, STREAM_SEEK_END, &_fileEndPosition)) + RINOK(stream->Seek(_arhiveBeginStreamPosition, STREAM_SEEK_SET, NULL)) + RINOK(FindAndReadSignature(stream, searchHeaderSizeLimit)); + _stream = stream; + return S_OK; +} + +void CInArchive::Close() +{ + _numInByteBufs = 0; + _stream.Release(); + ThereIsHeaderError = false; +} + +void CInArchive::ReadArchiveProperties(CInArchiveInfo & /* archiveInfo */) +{ + for (;;) + { + if (ReadID() == NID::kEnd) + break; + SkipData(); + } +} + +// CFolder &folder can be non empty. So we must set all fields + +void CInByte2::ParseFolder(CFolder &folder) +{ + UInt32 numCoders = ReadNum(); + + if (numCoders == 0) + ThrowUnsupported(); + + folder.Coders.SetSize(numCoders); + + UInt32 numInStreams = 0; + UInt32 i; + for (i = 0; i < numCoders; i++) + { + CCoderInfo &coder = folder.Coders[i]; + { + Byte mainByte = ReadByte(); + if ((mainByte & 0xC0) != 0) + ThrowUnsupported(); + unsigned idSize = (mainByte & 0xF); + if (idSize > 8 || idSize > GetRem()) + ThrowUnsupported(); + const Byte *longID = GetPtr(); + UInt64 id = 0; + for (unsigned j = 0; j < idSize; j++) + id = ((id << 8) | longID[j]); + SkipDataNoCheck(idSize); + coder.MethodID = id; + + if ((mainByte & 0x10) != 0) + { + coder.NumStreams = ReadNum(); + /* numOutStreams = */ ReadNum(); + } + else + { + coder.NumStreams = 1; + } + + if ((mainByte & 0x20) != 0) + { + CNum propsSize = ReadNum(); + coder.Props.Alloc((size_t)propsSize); + ReadBytes((Byte *)coder.Props, (size_t)propsSize); + } + else + coder.Props.Free(); + } + numInStreams += coder.NumStreams; + } + + UInt32 numBonds = numCoders - 1; + folder.Bonds.SetSize(numBonds); + for (i = 0; i < numBonds; i++) + { + CBond &bp = folder.Bonds[i]; + bp.PackIndex = ReadNum(); + bp.UnpackIndex = ReadNum(); + } + + if (numInStreams < numBonds) + ThrowUnsupported(); + UInt32 numPackStreams = numInStreams - numBonds; + folder.PackStreams.SetSize(numPackStreams); + + if (numPackStreams == 1) + { + for (i = 0; i < numInStreams; i++) + if (folder.FindBond_for_PackStream(i) < 0) + { + folder.PackStreams[0] = i; + break; + } + if (i == numInStreams) + ThrowUnsupported(); + } + else + for (i = 0; i < numPackStreams; i++) + folder.PackStreams[i] = ReadNum(); +} + +void CFolders::ParseFolderInfo(unsigned folderIndex, CFolder &folder) const +{ + size_t startPos = FoCodersDataOffset[folderIndex]; + CInByte2 inByte; + inByte.Init(CodersData + startPos, FoCodersDataOffset[folderIndex + 1] - startPos); + inByte.ParseFolder(folder); + if (inByte.GetRem() != 0) + throw 20120424; +} + + +void CDatabase::GetPath(unsigned index, UString &path) const +{ + path.Empty(); + if (!NameOffsets || !NamesBuf) + return; + + size_t offset = NameOffsets[index]; + size_t size = NameOffsets[index + 1] - offset; + + if (size >= (1 << 28)) + return; + + wchar_t *s = path.GetBuf((unsigned)size - 1); + + const Byte *p = ((const Byte *)NamesBuf + offset * 2); + + #if defined(_WIN32) && defined(MY_CPU_LE) + + wmemcpy(s, (const wchar_t *)p, size); + + #else + + for (size_t i = 0; i < size; i++) + { + *s = Get16(p); + p += 2; + s++; + } + + #endif + + path.ReleaseBuf_SetLen((unsigned)size - 1); +} + +HRESULT CDatabase::GetPath_Prop(unsigned index, PROPVARIANT *path) const throw() +{ + PropVariant_Clear(path); + if (!NameOffsets || !NamesBuf) + return S_OK; + + size_t offset = NameOffsets[index]; + size_t size = NameOffsets[index + 1] - offset; + + if (size >= (1 << 14)) + return S_OK; + + RINOK(PropVarEm_Alloc_Bstr(path, (unsigned)size - 1)); + wchar_t *s = path->bstrVal; + + const Byte *p = ((const Byte *)NamesBuf + offset * 2); + + for (size_t i = 0; i < size; i++) + { + wchar_t c = Get16(p); + p += 2; + #if WCHAR_PATH_SEPARATOR != L'/' + if (c == L'/') + c = WCHAR_PATH_SEPARATOR; + #endif + *s++ = c; + } + + return S_OK; + + /* + unsigned cur = index; + unsigned size = 0; + + for (int i = 0;; i++) + { + size_t len = NameOffsets[cur + 1] - NameOffsets[cur]; + size += (unsigned)len; + if (i > 256 || len > (1 << 14) || size > (1 << 14)) + return PropVarEm_Set_Str(path, "[TOO-LONG]"); + cur = Files[cur].Parent; + if (cur < 0) + break; + } + size--; + + RINOK(PropVarEm_Alloc_Bstr(path, size)); + wchar_t *s = path->bstrVal; + s += size; + *s = 0; + cur = index; + + for (;;) + { + unsigned len = (unsigned)(NameOffsets[cur + 1] - NameOffsets[cur] - 1); + const Byte *p = (const Byte *)NamesBuf + (NameOffsets[cur + 1] * 2) - 2; + for (; len != 0; len--) + { + p -= 2; + --s; + wchar_t c = Get16(p); + if (c == '/') + c = WCHAR_PATH_SEPARATOR; + *s = c; + } + + const CFileItem &file = Files[cur]; + cur = file.Parent; + if (cur < 0) + return S_OK; + *(--s) = (file.IsAltStream ? ':' : WCHAR_PATH_SEPARATOR); + } + */ +} + +void CInArchive::WaitId(UInt64 id) +{ + for (;;) + { + UInt64 type = ReadID(); + if (type == id) + return; + if (type == NID::kEnd) + ThrowIncorrect(); + SkipData(); + } +} + +void CInArchive::ReadHashDigests(unsigned numItems, CUInt32DefVector &crcs) +{ + ReadBoolVector2(numItems, crcs.Defs); + crcs.Vals.ClearAndSetSize(numItems); + UInt32 *p = &crcs.Vals[0]; + const bool *defs = &crcs.Defs[0]; + for (unsigned i = 0; i < numItems; i++) + { + UInt32 crc = 0; + if (defs[i]) + crc = ReadUInt32(); + p[i] = crc; + } +} + +#define k_Scan_NumCoders_MAX 64 +#define k_Scan_NumCodersStreams_in_Folder_MAX 64 + +void CInArchive::ReadPackInfo(CFolders &f) +{ + CNum numPackStreams = ReadNum(); + + WaitId(NID::kSize); + f.PackPositions.Alloc(numPackStreams + 1); + f.NumPackStreams = numPackStreams; + UInt64 sum = 0; + for (CNum i = 0; i < numPackStreams; i++) + { + f.PackPositions[i] = sum; + UInt64 packSize = ReadNumber(); + sum += packSize; + if (sum < packSize) + ThrowIncorrect(); + } + f.PackPositions[numPackStreams] = sum; + + UInt64 type; + for (;;) + { + type = ReadID(); + if (type == NID::kEnd) + return; + if (type == NID::kCRC) + { + CUInt32DefVector PackCRCs; + ReadHashDigests(numPackStreams, PackCRCs); + continue; + } + SkipData(); + } +} + +void CInArchive::ReadUnpackInfo( + const CObjectVector *dataVector, + CFolders &folders) +{ + WaitId(NID::kFolder); + CNum numFolders = ReadNum(); + + CNum numCodersOutStreams = 0; + { + CStreamSwitch streamSwitch; + streamSwitch.Set(this, dataVector); + const Byte *startBufPtr = _inByteBack->GetPtr(); + folders.NumFolders = numFolders; + + folders.FoStartPackStreamIndex.Alloc(numFolders + 1); + folders.FoToMainUnpackSizeIndex.Alloc(numFolders); + folders.FoCodersDataOffset.Alloc(numFolders + 1); + folders.FoToCoderUnpackSizes.Alloc(numFolders + 1); + + CBoolVector StreamUsed; + CBoolVector CoderUsed; + + CNum packStreamIndex = 0; + CNum fo; + CInByte2 *inByte = _inByteBack; + + for (fo = 0; fo < numFolders; fo++) + { + UInt32 indexOfMainStream = 0; + UInt32 numPackStreams = 0; + folders.FoCodersDataOffset[fo] = _inByteBack->GetPtr() - startBufPtr; + + CNum numInStreams = 0; + CNum numCoders = inByte->ReadNum(); + + if (numCoders == 0 || numCoders > k_Scan_NumCoders_MAX) + ThrowUnsupported(); + + for (CNum ci = 0; ci < numCoders; ci++) + { + Byte mainByte = inByte->ReadByte(); + if ((mainByte & 0xC0) != 0) + ThrowUnsupported(); + + unsigned idSize = (mainByte & 0xF); + if (idSize > 8) + ThrowUnsupported(); + if (idSize > inByte->GetRem()) + ThrowEndOfData(); + const Byte *longID = inByte->GetPtr(); + UInt64 id = 0; + for (unsigned j = 0; j < idSize; j++) + id = ((id << 8) | longID[j]); + inByte->SkipDataNoCheck(idSize); + if (folders.ParsedMethods.IDs.Size() < 128) + folders.ParsedMethods.IDs.AddToUniqueSorted(id); + + CNum coderInStreams = 1; + if ((mainByte & 0x10) != 0) + { + coderInStreams = inByte->ReadNum(); + if (coderInStreams > k_Scan_NumCodersStreams_in_Folder_MAX) + ThrowUnsupported(); + if (inByte->ReadNum() != 1) + ThrowUnsupported(); + } + + numInStreams += coderInStreams; + if (numInStreams > k_Scan_NumCodersStreams_in_Folder_MAX) + ThrowUnsupported(); + + if ((mainByte & 0x20) != 0) + { + CNum propsSize = inByte->ReadNum(); + if (propsSize > inByte->GetRem()) + ThrowEndOfData(); + if (id == k_LZMA2 && propsSize == 1) + { + Byte v = *_inByteBack->GetPtr(); + if (folders.ParsedMethods.Lzma2Prop < v) + folders.ParsedMethods.Lzma2Prop = v; + } + else if (id == k_LZMA && propsSize == 5) + { + UInt32 dicSize = GetUi32(_inByteBack->GetPtr() + 1); + if (folders.ParsedMethods.LzmaDic < dicSize) + folders.ParsedMethods.LzmaDic = dicSize; + } + inByte->SkipDataNoCheck((size_t)propsSize); + } + } + + if (numCoders == 1 && numInStreams == 1) + { + indexOfMainStream = 0; + numPackStreams = 1; + } + else + { + UInt32 i; + CNum numBonds = numCoders - 1; + if (numInStreams < numBonds) + ThrowUnsupported(); + + BoolVector_Fill_False(StreamUsed, numInStreams); + BoolVector_Fill_False(CoderUsed, numCoders); + + for (i = 0; i < numBonds; i++) + { + CNum index = ReadNum(); + if (index >= numInStreams || StreamUsed[index]) + ThrowUnsupported(); + StreamUsed[index] = true; + + index = ReadNum(); + if (index >= numCoders || CoderUsed[index]) + ThrowUnsupported(); + CoderUsed[index] = true; + } + + numPackStreams = numInStreams - numBonds; + + if (numPackStreams != 1) + for (i = 0; i < numPackStreams; i++) + { + CNum index = inByte->ReadNum(); // PackStreams + if (index >= numInStreams || StreamUsed[index]) + ThrowUnsupported(); + StreamUsed[index] = true; + } + + for (i = 0; i < numCoders; i++) + if (!CoderUsed[i]) + { + indexOfMainStream = i; + break; + } + + if (i == numCoders) + ThrowUnsupported(); + } + + folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams; + numCodersOutStreams += numCoders; + folders.FoStartPackStreamIndex[fo] = packStreamIndex; + if (numPackStreams > folders.NumPackStreams - packStreamIndex) + ThrowIncorrect(); + packStreamIndex += numPackStreams; + folders.FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream; + } + + size_t dataSize = _inByteBack->GetPtr() - startBufPtr; + folders.FoToCoderUnpackSizes[fo] = numCodersOutStreams; + folders.FoStartPackStreamIndex[fo] = packStreamIndex; + folders.FoCodersDataOffset[fo] = _inByteBack->GetPtr() - startBufPtr; + folders.CodersData.CopyFrom(startBufPtr, dataSize); + + // if (folders.NumPackStreams != packStreamIndex) ThrowUnsupported(); + } + + WaitId(NID::kCodersUnpackSize); + folders.CoderUnpackSizes.Alloc(numCodersOutStreams); + for (CNum i = 0; i < numCodersOutStreams; i++) + folders.CoderUnpackSizes[i] = ReadNumber(); + + for (;;) + { + UInt64 type = ReadID(); + if (type == NID::kEnd) + return; + if (type == NID::kCRC) + { + ReadHashDigests(numFolders, folders.FolderCRCs); + continue; + } + SkipData(); + } +} + +void CInArchive::ReadSubStreamsInfo( + CFolders &folders, + CRecordVector &unpackSizes, + CUInt32DefVector &digests) +{ + folders.NumUnpackStreamsVector.Alloc(folders.NumFolders); + CNum i; + for (i = 0; i < folders.NumFolders; i++) + folders.NumUnpackStreamsVector[i] = 1; + + UInt64 type; + + for (;;) + { + type = ReadID(); + if (type == NID::kNumUnpackStream) + { + for (i = 0; i < folders.NumFolders; i++) + folders.NumUnpackStreamsVector[i] = ReadNum(); + continue; + } + if (type == NID::kCRC || type == NID::kSize || type == NID::kEnd) + break; + SkipData(); + } + + if (type == NID::kSize) + { + for (i = 0; i < folders.NumFolders; i++) + { + // v3.13 incorrectly worked with empty folders + // v4.07: we check that folder is empty + CNum numSubstreams = folders.NumUnpackStreamsVector[i]; + if (numSubstreams == 0) + continue; + UInt64 sum = 0; + for (CNum j = 1; j < numSubstreams; j++) + { + UInt64 size = ReadNumber(); + unpackSizes.Add(size); + sum += size; + if (sum < size) + ThrowIncorrect(); + } + UInt64 folderUnpackSize = folders.GetFolderUnpackSize(i); + if (folderUnpackSize < sum) + ThrowIncorrect(); + unpackSizes.Add(folderUnpackSize - sum); + } + type = ReadID(); + } + else + { + for (i = 0; i < folders.NumFolders; i++) + { + /* v9.26 - v9.29 incorrectly worked: + if (folders.NumUnpackStreamsVector[i] == 0), it threw error */ + CNum val = folders.NumUnpackStreamsVector[i]; + if (val > 1) + ThrowIncorrect(); + if (val == 1) + unpackSizes.Add(folders.GetFolderUnpackSize(i)); + } + } + + unsigned numDigests = 0; + for (i = 0; i < folders.NumFolders; i++) + { + CNum numSubstreams = folders.NumUnpackStreamsVector[i]; + if (numSubstreams != 1 || !folders.FolderCRCs.ValidAndDefined(i)) + numDigests += numSubstreams; + } + + for (;;) + { + if (type == NID::kEnd) + break; + if (type == NID::kCRC) + { + // CUInt32DefVector digests2; + // ReadHashDigests(numDigests, digests2); + CBoolVector digests2; + ReadBoolVector2(numDigests, digests2); + + digests.ClearAndSetSize(unpackSizes.Size()); + + unsigned k = 0; + unsigned k2 = 0; + + for (i = 0; i < folders.NumFolders; i++) + { + CNum numSubstreams = folders.NumUnpackStreamsVector[i]; + if (numSubstreams == 1 && folders.FolderCRCs.ValidAndDefined(i)) + { + digests.Defs[k] = true; + digests.Vals[k] = folders.FolderCRCs.Vals[i]; + k++; + } + else for (CNum j = 0; j < numSubstreams; j++) + { + bool defined = digests2[k2++]; + digests.Defs[k] = defined; + UInt32 crc = 0; + if (defined) + crc = ReadUInt32(); + digests.Vals[k] = crc; + k++; + } + } + // if (k != unpackSizes.Size()) throw 1234567; + } + else + SkipData(); + + type = ReadID(); + } + + if (digests.Defs.Size() != unpackSizes.Size()) + { + digests.ClearAndSetSize(unpackSizes.Size()); + unsigned k = 0; + for (i = 0; i < folders.NumFolders; i++) + { + CNum numSubstreams = folders.NumUnpackStreamsVector[i]; + if (numSubstreams == 1 && folders.FolderCRCs.ValidAndDefined(i)) + { + digests.Defs[k] = true; + digests.Vals[k] = folders.FolderCRCs.Vals[i]; + k++; + } + else for (CNum j = 0; j < numSubstreams; j++) + { + digests.Defs[k] = false; + digests.Vals[k] = 0; + k++; + } + } + } +} + +void CInArchive::ReadStreamsInfo( + const CObjectVector *dataVector, + UInt64 &dataOffset, + CFolders &folders, + CRecordVector &unpackSizes, + CUInt32DefVector &digests) +{ + UInt64 type = ReadID(); + + if (type == NID::kPackInfo) + { + dataOffset = ReadNumber(); + ReadPackInfo(folders); + type = ReadID(); + } + + if (type == NID::kUnpackInfo) + { + ReadUnpackInfo(dataVector, folders); + type = ReadID(); + } + + if (folders.NumFolders != 0 && !folders.PackPositions) + { + // if there are folders, we need PackPositions also + folders.PackPositions.Alloc(1); + folders.PackPositions[0] = 0; + } + + if (type == NID::kSubStreamsInfo) + { + ReadSubStreamsInfo(folders, unpackSizes, digests); + type = ReadID(); + } + else + { + folders.NumUnpackStreamsVector.Alloc(folders.NumFolders); + /* If digests.Defs.Size() == 0, it means that there are no crcs. + So we don't need to fill digests with values. */ + // digests.Vals.ClearAndSetSize(folders.NumFolders); + // BoolVector_Fill_False(digests.Defs, folders.NumFolders); + for (CNum i = 0; i < folders.NumFolders; i++) + { + folders.NumUnpackStreamsVector[i] = 1; + unpackSizes.Add(folders.GetFolderUnpackSize(i)); + // digests.Vals[i] = 0; + } + } + + if (type != NID::kEnd) + ThrowIncorrect(); +} + +void CInArchive::ReadBoolVector(unsigned numItems, CBoolVector &v) +{ + v.ClearAndSetSize(numItems); + Byte b = 0; + Byte mask = 0; + bool *p = &v[0]; + for (unsigned i = 0; i < numItems; i++) + { + if (mask == 0) + { + b = ReadByte(); + mask = 0x80; + } + p[i] = ((b & mask) != 0); + mask >>= 1; + } +} + +void CInArchive::ReadBoolVector2(unsigned numItems, CBoolVector &v) +{ + Byte allAreDefined = ReadByte(); + if (allAreDefined == 0) + { + ReadBoolVector(numItems, v); + return; + } + v.ClearAndSetSize(numItems); + bool *p = &v[0]; + for (unsigned i = 0; i < numItems; i++) + p[i] = true; +} + +void CInArchive::ReadUInt64DefVector(const CObjectVector &dataVector, + CUInt64DefVector &v, unsigned numItems) +{ + ReadBoolVector2(numItems, v.Defs); + + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + + v.Vals.ClearAndSetSize(numItems); + UInt64 *p = &v.Vals[0]; + const bool *defs = &v.Defs[0]; + + for (unsigned i = 0; i < numItems; i++) + { + UInt64 t = 0; + if (defs[i]) + t = ReadUInt64(); + p[i] = t; + } +} + +HRESULT CInArchive::ReadAndDecodePackedStreams( + DECL_EXTERNAL_CODECS_LOC_VARS + UInt64 baseOffset, + UInt64 &dataOffset, CObjectVector &dataVector + _7Z_DECODER_CRYPRO_VARS_DECL + ) +{ + CFolders folders; + CRecordVector unpackSizes; + CUInt32DefVector digests; + + ReadStreamsInfo(NULL, + dataOffset, + folders, + unpackSizes, + digests); + + CDecoder decoder(_useMixerMT); + + for (CNum i = 0; i < folders.NumFolders; i++) + { + CByteBuffer &data = dataVector.AddNew(); + UInt64 unpackSize64 = folders.GetFolderUnpackSize(i); + size_t unpackSize = (size_t)unpackSize64; + if (unpackSize != unpackSize64) + ThrowUnsupported(); + data.Alloc(unpackSize); + + CBufPtrSeqOutStream *outStreamSpec = new CBufPtrSeqOutStream; + CMyComPtr outStream = outStreamSpec; + outStreamSpec->Init(data, unpackSize); + + HRESULT result = decoder.Decode( + EXTERNAL_CODECS_LOC_VARS + _stream, baseOffset + dataOffset, + folders, i, + NULL, // *unpackSize + + outStream, + NULL, // *compressProgress + NULL // **inStreamMainRes + + _7Z_DECODER_CRYPRO_VARS + #if !defined(_7ZIP_ST) && !defined(_SFX) + , false // mtMode + , 1 // numThreads + #endif + ); + RINOK(result); + + if (folders.FolderCRCs.ValidAndDefined(i)) + if (CrcCalc(data, unpackSize) != folders.FolderCRCs.Vals[i]) + ThrowIncorrect(); + } + + if (folders.PackPositions) + HeadersSize += folders.PackPositions[folders.NumPackStreams]; + + return S_OK; +} + +HRESULT CInArchive::ReadHeader( + DECL_EXTERNAL_CODECS_LOC_VARS + CDbEx &db + _7Z_DECODER_CRYPRO_VARS_DECL + ) +{ + UInt64 type = ReadID(); + + if (type == NID::kArchiveProperties) + { + ReadArchiveProperties(db.ArcInfo); + type = ReadID(); + } + + CObjectVector dataVector; + + if (type == NID::kAdditionalStreamsInfo) + { + HRESULT result = ReadAndDecodePackedStreams( + EXTERNAL_CODECS_LOC_VARS + db.ArcInfo.StartPositionAfterHeader, + db.ArcInfo.DataStartPosition2, + dataVector + _7Z_DECODER_CRYPRO_VARS + ); + RINOK(result); + db.ArcInfo.DataStartPosition2 += db.ArcInfo.StartPositionAfterHeader; + type = ReadID(); + } + + CRecordVector unpackSizes; + CUInt32DefVector digests; + + if (type == NID::kMainStreamsInfo) + { + ReadStreamsInfo(&dataVector, + db.ArcInfo.DataStartPosition, + (CFolders &)db, + unpackSizes, + digests); + db.ArcInfo.DataStartPosition += db.ArcInfo.StartPositionAfterHeader; + type = ReadID(); + } + + db.Files.Clear(); + + if (type == NID::kFilesInfo) + { + + const CNum numFiles = ReadNum(); + db.Files.ClearAndSetSize(numFiles); + /* + db.Files.Reserve(numFiles); + CNum i; + for (i = 0; i < numFiles; i++) + db.Files.Add(CFileItem()); + */ + + db.ArcInfo.FileInfoPopIDs.Add(NID::kSize); + // if (!db.PackSizes.IsEmpty()) + db.ArcInfo.FileInfoPopIDs.Add(NID::kPackInfo); + if (numFiles > 0 && !digests.Defs.IsEmpty()) + db.ArcInfo.FileInfoPopIDs.Add(NID::kCRC); + + CBoolVector emptyStreamVector; + BoolVector_Fill_False(emptyStreamVector, (unsigned)numFiles); + CBoolVector emptyFileVector; + CBoolVector antiFileVector; + CNum numEmptyStreams = 0; + + for (;;) + { + const UInt64 type2 = ReadID(); + if (type2 == NID::kEnd) + break; + UInt64 size = ReadNumber(); + if (size > _inByteBack->GetRem()) + ThrowIncorrect(); + CStreamSwitch switchProp; + switchProp.Set(this, _inByteBack->GetPtr(), (size_t)size, true); + bool addPropIdToList = true; + bool isKnownType = true; + if (type2 > ((UInt32)1 << 30)) + isKnownType = false; + else switch ((UInt32)type2) + { + case NID::kName: + { + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + size_t rem = _inByteBack->GetRem(); + db.NamesBuf.Alloc(rem); + ReadBytes(db.NamesBuf, rem); + db.NameOffsets.Alloc(db.Files.Size() + 1); + size_t pos = 0; + unsigned i; + for (i = 0; i < db.Files.Size(); i++) + { + size_t curRem = (rem - pos) / 2; + const UInt16 *buf = (const UInt16 *)(db.NamesBuf + pos); + size_t j; + for (j = 0; j < curRem && buf[j] != 0; j++); + if (j == curRem) + ThrowEndOfData(); + db.NameOffsets[i] = pos / 2; + pos += j * 2 + 2; + } + db.NameOffsets[i] = pos / 2; + if (pos != rem) + ThereIsHeaderError = true; + break; + } + case NID::kWinAttrib: + { + CBoolVector boolVector; + ReadBoolVector2(db.Files.Size(), boolVector); + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + for (CNum i = 0; i < numFiles; i++) + { + CFileItem &file = db.Files[i]; + file.AttribDefined = boolVector[i]; + if (file.AttribDefined) + file.Attrib = ReadUInt32(); + } + break; + } + /* + case NID::kIsAux: + { + ReadBoolVector(db.Files.Size(), db.IsAux); + break; + } + case NID::kParent: + { + db.IsTree = true; + // CBoolVector boolVector; + // ReadBoolVector2(db.Files.Size(), boolVector); + // CStreamSwitch streamSwitch; + // streamSwitch.Set(this, &dataVector); + CBoolVector boolVector; + ReadBoolVector2(db.Files.Size(), boolVector); + + db.ThereAreAltStreams = false; + for (i = 0; i < numFiles; i++) + { + CFileItem &file = db.Files[i]; + // file.Parent = -1; + // if (boolVector[i]) + file.Parent = (int)ReadUInt32(); + file.IsAltStream = !boolVector[i]; + if (file.IsAltStream) + db.ThereAreAltStreams = true; + } + break; + } + */ + case NID::kEmptyStream: + { + ReadBoolVector(numFiles, emptyStreamVector); + numEmptyStreams = 0; + for (CNum i = 0; i < (CNum)emptyStreamVector.Size(); i++) + if (emptyStreamVector[i]) + numEmptyStreams++; + + BoolVector_Fill_False(emptyFileVector, numEmptyStreams); + BoolVector_Fill_False(antiFileVector, numEmptyStreams); + + break; + } + case NID::kEmptyFile: ReadBoolVector(numEmptyStreams, emptyFileVector); break; + case NID::kAnti: ReadBoolVector(numEmptyStreams, antiFileVector); break; + case NID::kStartPos: ReadUInt64DefVector(dataVector, db.StartPos, (unsigned)numFiles); break; + case NID::kCTime: ReadUInt64DefVector(dataVector, db.CTime, (unsigned)numFiles); break; + case NID::kATime: ReadUInt64DefVector(dataVector, db.ATime, (unsigned)numFiles); break; + case NID::kMTime: ReadUInt64DefVector(dataVector, db.MTime, (unsigned)numFiles); break; + case NID::kDummy: + { + for (UInt64 j = 0; j < size; j++) + if (ReadByte() != 0) + ThereIsHeaderError = true; + addPropIdToList = false; + break; + } + /* + case NID::kNtSecure: + { + try + { + { + CStreamSwitch streamSwitch; + streamSwitch.Set(this, &dataVector); + UInt32 numDescriptors = ReadUInt32(); + size_t offset = 0; + db.SecureOffsets.Clear(); + for (i = 0; i < numDescriptors; i++) + { + UInt32 size = ReadUInt32(); + db.SecureOffsets.Add(offset); + offset += size; + } + // ThrowIncorrect();; + db.SecureOffsets.Add(offset); + db.SecureBuf.SetCapacity(offset); + for (i = 0; i < numDescriptors; i++) + { + offset = db.SecureOffsets[i]; + ReadBytes(db.SecureBuf + offset, db.SecureOffsets[i + 1] - offset); + } + db.SecureIDs.Clear(); + for (unsigned i = 0; i < db.Files.Size(); i++) + { + db.SecureIDs.Add(ReadNum()); + // db.SecureIDs.Add(ReadUInt32()); + } + // ReadUInt32(); + if (_inByteBack->GetRem() != 0) + ThrowIncorrect();; + } + } + catch(CInArchiveException &) + { + ThereIsHeaderError = true; + addPropIdToList = isKnownType = false; + db.ClearSecure(); + } + break; + } + */ + default: + addPropIdToList = isKnownType = false; + } + if (isKnownType) + { + if (addPropIdToList) + db.ArcInfo.FileInfoPopIDs.Add(type2); + } + else + { + db.UnsupportedFeatureWarning = true; + _inByteBack->SkipRem(); + } + // SkipData worked incorrectly in some versions before v4.59 (7zVer <= 0.02) + if (_inByteBack->GetRem() != 0) + ThrowIncorrect(); + } + + type = ReadID(); // Read (NID::kEnd) end of headers + + if (numFiles - numEmptyStreams != unpackSizes.Size()) + ThrowUnsupported(); + + CNum emptyFileIndex = 0; + CNum sizeIndex = 0; + + CNum numAntiItems = 0; + + CNum i; + + for (i = 0; i < numEmptyStreams; i++) + if (antiFileVector[i]) + numAntiItems++; + + for (i = 0; i < numFiles; i++) + { + CFileItem &file = db.Files[i]; + bool isAnti; + file.HasStream = !emptyStreamVector[i]; + file.Crc = 0; + if (file.HasStream) + { + file.IsDir = false; + isAnti = false; + file.Size = unpackSizes[sizeIndex]; + file.CrcDefined = digests.ValidAndDefined(sizeIndex); + if (file.CrcDefined) + file.Crc = digests.Vals[sizeIndex]; + sizeIndex++; + } + else + { + file.IsDir = !emptyFileVector[emptyFileIndex]; + isAnti = antiFileVector[emptyFileIndex]; + emptyFileIndex++; + file.Size = 0; + file.CrcDefined = false; + } + if (numAntiItems != 0) + db.IsAnti.Add(isAnti); + } + } + db.FillLinks(); + /* + if (type != NID::kEnd) + ThrowIncorrect(); + if (_inByteBack->GetRem() != 0) + ThrowIncorrect(); + */ + return S_OK; +} + +void CDbEx::FillLinks() +{ + FolderStartFileIndex.Alloc(NumFolders); + FileIndexToFolderIndexMap.Alloc(Files.Size()); + + CNum folderIndex = 0; + CNum indexInFolder = 0; + unsigned i; + + for (i = 0; i < Files.Size(); i++) + { + bool emptyStream = !Files[i].HasStream; + if (indexInFolder == 0) + { + if (emptyStream) + { + FileIndexToFolderIndexMap[i] = kNumNoIndex; + continue; + } + // v3.13 incorrectly worked with empty folders + // v4.07: we skip empty folders + for (;;) + { + if (folderIndex >= NumFolders) + ThrowIncorrect(); + FolderStartFileIndex[folderIndex] = i; + if (NumUnpackStreamsVector[folderIndex] != 0) + break; + folderIndex++; + } + } + FileIndexToFolderIndexMap[i] = folderIndex; + if (emptyStream) + continue; + if (++indexInFolder >= NumUnpackStreamsVector[folderIndex]) + { + folderIndex++; + indexInFolder = 0; + } + } + + if (indexInFolder != 0) + folderIndex++; + /* + if (indexInFolder != 0) + ThrowIncorrect(); + */ + + for (;;) + { + if (folderIndex >= NumFolders) + return; + FolderStartFileIndex[folderIndex] = i; + /* + if (NumUnpackStreamsVector[folderIndex] != 0) + ThrowIncorrect();; + */ + folderIndex++; + } +} + +HRESULT CInArchive::ReadDatabase2( + DECL_EXTERNAL_CODECS_LOC_VARS + CDbEx &db + _7Z_DECODER_CRYPRO_VARS_DECL + ) +{ + db.Clear(); + db.ArcInfo.StartPosition = _arhiveBeginStreamPosition; + + db.ArcInfo.Version.Major = _header[6]; + db.ArcInfo.Version.Minor = _header[7]; + + if (db.ArcInfo.Version.Major != kMajorVersion) + { + // db.UnsupportedVersion = true; + return S_FALSE; + } + + UInt64 nextHeaderOffset = Get64(_header + 12); + UInt64 nextHeaderSize = Get64(_header + 20); + UInt32 nextHeaderCRC = Get32(_header + 28); + + #ifdef FORMAT_7Z_RECOVERY + UInt32 crcFromArc = Get32(_header + 8); + if (crcFromArc == 0 && nextHeaderOffset == 0 && nextHeaderSize == 0 && nextHeaderCRC == 0) + { + UInt64 cur, fileSize; + RINOK(_stream->Seek(0, STREAM_SEEK_CUR, &cur)); + const unsigned kCheckSize = 512; + Byte buf[kCheckSize]; + RINOK(_stream->Seek(0, STREAM_SEEK_END, &fileSize)); + UInt64 rem = fileSize - cur; + unsigned checkSize = kCheckSize; + if (rem < kCheckSize) + checkSize = (unsigned)(rem); + if (checkSize < 3) + return S_FALSE; + RINOK(_stream->Seek(fileSize - checkSize, STREAM_SEEK_SET, NULL)); + RINOK(ReadStream_FALSE(_stream, buf, (size_t)checkSize)); + + if (buf[checkSize - 1] != 0) + return S_FALSE; + + unsigned i; + for (i = checkSize - 2;; i--) + { + if ((buf[i] == NID::kEncodedHeader && buf[i + 1] == NID::kPackInfo) || + (buf[i] == NID::kHeader && buf[i + 1] == NID::kMainStreamsInfo)) + break; + if (i == 0) + return S_FALSE; + } + nextHeaderSize = checkSize - i; + nextHeaderOffset = rem - nextHeaderSize; + nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize); + RINOK(_stream->Seek(cur, STREAM_SEEK_SET, NULL)); + db.StartHeaderWasRecovered = true; + } + else + #endif + { + // Crc was tested already at signature check + // if (CrcCalc(_header + 12, 20) != crcFromArchive) ThrowIncorrect(); + } + + db.ArcInfo.StartPositionAfterHeader = _arhiveBeginStreamPosition + kHeaderSize; + db.PhySize = kHeaderSize; + + db.IsArc = false; + if ((Int64)nextHeaderOffset < 0 || + nextHeaderSize > ((UInt64)1 << 62)) + return S_FALSE; + if (nextHeaderSize == 0) + { + if (nextHeaderOffset != 0) + return S_FALSE; + db.IsArc = true; + return S_OK; + } + + if (!db.StartHeaderWasRecovered) + db.IsArc = true; + + HeadersSize += kHeaderSize + nextHeaderSize; + db.PhySize = kHeaderSize + nextHeaderOffset + nextHeaderSize; + if (_fileEndPosition - db.ArcInfo.StartPositionAfterHeader < nextHeaderOffset + nextHeaderSize) + { + db.UnexpectedEnd = true; + return S_FALSE; + } + RINOK(_stream->Seek(nextHeaderOffset, STREAM_SEEK_CUR, NULL)); + + size_t nextHeaderSize_t = (size_t)nextHeaderSize; + if (nextHeaderSize_t != nextHeaderSize) + return E_OUTOFMEMORY; + CByteBuffer buffer2(nextHeaderSize_t); + + RINOK(ReadStream_FALSE(_stream, buffer2, nextHeaderSize_t)); + + if (CrcCalc(buffer2, nextHeaderSize_t) != nextHeaderCRC) + ThrowIncorrect(); + + if (!db.StartHeaderWasRecovered) + db.PhySizeWasConfirmed = true; + + CStreamSwitch streamSwitch; + streamSwitch.Set(this, buffer2); + + CObjectVector dataVector; + + UInt64 type = ReadID(); + if (type != NID::kHeader) + { + if (type != NID::kEncodedHeader) + ThrowIncorrect(); + HRESULT result = ReadAndDecodePackedStreams( + EXTERNAL_CODECS_LOC_VARS + db.ArcInfo.StartPositionAfterHeader, + db.ArcInfo.DataStartPosition2, + dataVector + _7Z_DECODER_CRYPRO_VARS + ); + RINOK(result); + if (dataVector.Size() == 0) + return S_OK; + if (dataVector.Size() > 1) + ThrowIncorrect(); + streamSwitch.Remove(); + streamSwitch.Set(this, dataVector.Front()); + if (ReadID() != NID::kHeader) + ThrowIncorrect(); + } + + db.IsArc = true; + + db.HeadersSize = HeadersSize; + + return ReadHeader( + EXTERNAL_CODECS_LOC_VARS + db + _7Z_DECODER_CRYPRO_VARS + ); +} + +HRESULT CInArchive::ReadDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + CDbEx &db + _7Z_DECODER_CRYPRO_VARS_DECL + ) +{ + try + { + HRESULT res = ReadDatabase2( + EXTERNAL_CODECS_LOC_VARS db + _7Z_DECODER_CRYPRO_VARS + ); + if (ThereIsHeaderError) + db.ThereIsHeaderError = true; + if (res == E_NOTIMPL) + ThrowUnsupported(); + return res; + } + catch(CUnsupportedFeatureException &) + { + db.UnsupportedFeatureError = true; + return S_FALSE; + } + catch(CInArchiveException &) + { + db.ThereIsHeaderError = true; + return S_FALSE; + } +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zIn.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zIn.h new file mode 100644 index 0000000000..260d8f7628 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zIn.h @@ -0,0 +1,431 @@ +// 7zIn.h + +#ifndef __7Z_IN_H +#define __7Z_IN_H + +#include "../../../Common/MyCom.h" + +#include "../../../Windows/PropVariant.h" + +#include "../../IPassword.h" +#include "../../IStream.h" + +#include "../../Common/CreateCoder.h" +#include "../../Common/InBuffer.h" + +#include "7zItem.h" + +namespace NArchive { +namespace N7z { + +/* + We don't need to init isEncrypted and passwordIsDefined + We must upgrade them only */ + +#ifdef _NO_CRYPTO +#define _7Z_DECODER_CRYPRO_VARS_DECL +#define _7Z_DECODER_CRYPRO_VARS +#else +#define _7Z_DECODER_CRYPRO_VARS_DECL , ICryptoGetTextPassword *getTextPassword, bool &isEncrypted, bool &passwordIsDefined, UString &password +#define _7Z_DECODER_CRYPRO_VARS , getTextPassword, isEncrypted, passwordIsDefined, password +#endif + +struct CParsedMethods +{ + Byte Lzma2Prop; + UInt32 LzmaDic; + CRecordVector IDs; + + CParsedMethods(): Lzma2Prop(0), LzmaDic(0) {} +}; + +struct CFolderEx: public CFolder +{ + unsigned UnpackCoder; +}; + +struct CFolders +{ + CNum NumPackStreams; + CNum NumFolders; + + CObjArray PackPositions; // NumPackStreams + 1 + // CUInt32DefVector PackCRCs; // we don't use PackCRCs now + + CUInt32DefVector FolderCRCs; // NumFolders + CObjArray NumUnpackStreamsVector; // NumFolders + + CObjArray CoderUnpackSizes; // including unpack sizes of bond coders + CObjArray FoToCoderUnpackSizes; // NumFolders + 1 + CObjArray FoStartPackStreamIndex; // NumFolders + 1 + CObjArray FoToMainUnpackSizeIndex; // NumFolders + + CObjArray FoCodersDataOffset; // NumFolders + 1 + CByteBuffer CodersData; + + CParsedMethods ParsedMethods; + + void ParseFolderInfo(unsigned folderIndex, CFolder &folder) const; + void ParseFolderEx(unsigned folderIndex, CFolderEx &folder) const + { + ParseFolderInfo(folderIndex, folder); + folder.UnpackCoder = FoToMainUnpackSizeIndex[folderIndex]; + } + + unsigned GetNumFolderUnpackSizes(unsigned folderIndex) const + { + return (unsigned)(FoToCoderUnpackSizes[folderIndex + 1] - FoToCoderUnpackSizes[folderIndex]); + } + + UInt64 GetFolderUnpackSize(unsigned folderIndex) const + { + return CoderUnpackSizes[FoToCoderUnpackSizes[folderIndex] + FoToMainUnpackSizeIndex[folderIndex]]; + } + + UInt64 GetStreamPackSize(unsigned index) const + { + return PackPositions[index + 1] - PackPositions[index]; + } + + CFolders(): NumPackStreams(0), NumFolders(0) {} + + void Clear() + { + NumPackStreams = 0; + PackPositions.Free(); + // PackCRCs.Clear(); + + NumFolders = 0; + FolderCRCs.Clear(); + NumUnpackStreamsVector.Free(); + CoderUnpackSizes.Free(); + FoToCoderUnpackSizes.Free(); + FoStartPackStreamIndex.Free(); + FoToMainUnpackSizeIndex.Free(); + FoCodersDataOffset.Free(); + CodersData.Free(); + } +}; + +struct CDatabase: public CFolders +{ + CRecordVector Files; + + CUInt64DefVector CTime; + CUInt64DefVector ATime; + CUInt64DefVector MTime; + CUInt64DefVector StartPos; + CBoolVector IsAnti; + /* + CBoolVector IsAux; + CByteBuffer SecureBuf; + CRecordVector SecureIDs; + */ + + CByteBuffer NamesBuf; + CObjArray NameOffsets; // numFiles + 1, offsets of utf-16 symbols + + /* + void ClearSecure() + { + SecureBuf.Free(); + SecureIDs.Clear(); + } + */ + + void Clear() + { + CFolders::Clear(); + // ClearSecure(); + + NamesBuf.Free(); + NameOffsets.Free(); + + Files.Clear(); + CTime.Clear(); + ATime.Clear(); + MTime.Clear(); + StartPos.Clear(); + IsAnti.Clear(); + // IsAux.Clear(); + } + + bool IsSolid() const + { + for (CNum i = 0; i < NumFolders; i++) + if (NumUnpackStreamsVector[i] > 1) + return true; + return false; + } + bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); } + // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); } + + /* + const void* GetName(unsigned index) const + { + if (!NameOffsets || !NamesBuf) + return NULL; + return (void *)((const Byte *)NamesBuf + NameOffsets[index] * 2); + }; + */ + void GetPath(unsigned index, UString &path) const; + HRESULT GetPath_Prop(unsigned index, PROPVARIANT *path) const throw(); +}; + +struct CInArchiveInfo +{ + CArchiveVersion Version; + UInt64 StartPosition; + UInt64 StartPositionAfterHeader; + UInt64 DataStartPosition; + UInt64 DataStartPosition2; + CRecordVector FileInfoPopIDs; + + void Clear() + { + StartPosition = 0; + StartPositionAfterHeader = 0; + DataStartPosition = 0; + DataStartPosition2 = 0; + FileInfoPopIDs.Clear(); + } +}; + +struct CDbEx: public CDatabase +{ + CInArchiveInfo ArcInfo; + + CObjArray FolderStartFileIndex; + CObjArray FileIndexToFolderIndexMap; + + UInt64 HeadersSize; + UInt64 PhySize; + + /* + CRecordVector SecureOffsets; + bool IsTree; + bool ThereAreAltStreams; + */ + + bool IsArc; + bool PhySizeWasConfirmed; + + bool ThereIsHeaderError; + bool UnexpectedEnd; + // bool UnsupportedVersion; + + bool StartHeaderWasRecovered; + bool UnsupportedFeatureWarning; + bool UnsupportedFeatureError; + + /* + void ClearSecureEx() + { + ClearSecure(); + SecureOffsets.Clear(); + } + */ + + void Clear() + { + IsArc = false; + PhySizeWasConfirmed = false; + + ThereIsHeaderError = false; + UnexpectedEnd = false; + // UnsupportedVersion = false; + + StartHeaderWasRecovered = false; + UnsupportedFeatureError = false; + UnsupportedFeatureWarning = false; + + /* + IsTree = false; + ThereAreAltStreams = false; + */ + + CDatabase::Clear(); + + // SecureOffsets.Clear(); + ArcInfo.Clear(); + FolderStartFileIndex.Free(); + FileIndexToFolderIndexMap.Free(); + + HeadersSize = 0; + PhySize = 0; + } + + void FillLinks(); + + UInt64 GetFolderStreamPos(CNum folderIndex, unsigned indexInFolder) const + { + return ArcInfo.DataStartPosition + + PackPositions[FoStartPackStreamIndex[folderIndex] + indexInFolder]; + } + + UInt64 GetFolderFullPackSize(CNum folderIndex) const + { + return + PackPositions[FoStartPackStreamIndex[folderIndex + 1]] - + PackPositions[FoStartPackStreamIndex[folderIndex]]; + } + + UInt64 GetFolderPackStreamSize(CNum folderIndex, unsigned streamIndex) const + { + size_t i = FoStartPackStreamIndex[folderIndex] + streamIndex; + return PackPositions[i + 1] - PackPositions[i]; + } + + UInt64 GetFilePackSize(CNum fileIndex) const + { + CNum folderIndex = FileIndexToFolderIndexMap[fileIndex]; + if (folderIndex != kNumNoIndex) + if (FolderStartFileIndex[folderIndex] == fileIndex) + return GetFolderFullPackSize(folderIndex); + return 0; + } +}; + +const unsigned kNumBufLevelsMax = 4; + +struct CInByte2 +{ + const Byte *_buffer; +public: + size_t _size; + size_t _pos; + + size_t GetRem() const { return _size - _pos; } + const Byte *GetPtr() const { return _buffer + _pos; } + void Init(const Byte *buffer, size_t size) + { + _buffer = buffer; + _size = size; + _pos = 0; + } + Byte ReadByte(); + void ReadBytes(Byte *data, size_t size); + void SkipDataNoCheck(UInt64 size) { _pos += (size_t)size; } + void SkipData(UInt64 size); + + void SkipData(); + void SkipRem() { _pos = _size; } + UInt64 ReadNumber(); + CNum ReadNum(); + UInt32 ReadUInt32(); + UInt64 ReadUInt64(); + + void ParseFolder(CFolder &folder); +}; + +class CStreamSwitch; + +const UInt32 kHeaderSize = 32; + +class CInArchive +{ + friend class CStreamSwitch; + + CMyComPtr _stream; + + unsigned _numInByteBufs; + CInByte2 _inByteVector[kNumBufLevelsMax]; + + CInByte2 *_inByteBack; + bool ThereIsHeaderError; + + UInt64 _arhiveBeginStreamPosition; + UInt64 _fileEndPosition; + + Byte _header[kHeaderSize]; + + UInt64 HeadersSize; + + bool _useMixerMT; + + void AddByteStream(const Byte *buffer, size_t size); + + void DeleteByteStream(bool needUpdatePos) + { + _numInByteBufs--; + if (_numInByteBufs > 0) + { + _inByteBack = &_inByteVector[_numInByteBufs - 1]; + if (needUpdatePos) + _inByteBack->_pos += _inByteVector[_numInByteBufs]._pos; + } + } + + HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit); + + void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); } + Byte ReadByte() { return _inByteBack->ReadByte(); } + UInt64 ReadNumber() { return _inByteBack->ReadNumber(); } + CNum ReadNum() { return _inByteBack->ReadNum(); } + UInt64 ReadID() { return _inByteBack->ReadNumber(); } + UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); } + UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); } + void SkipData(UInt64 size) { _inByteBack->SkipData(size); } + void SkipData() { _inByteBack->SkipData(); } + void WaitId(UInt64 id); + + void ReadArchiveProperties(CInArchiveInfo &archiveInfo); + void ReadHashDigests(unsigned numItems, CUInt32DefVector &crcs); + + void ReadPackInfo(CFolders &f); + + void ReadUnpackInfo( + const CObjectVector *dataVector, + CFolders &folders); + + void ReadSubStreamsInfo( + CFolders &folders, + CRecordVector &unpackSizes, + CUInt32DefVector &digests); + + void ReadStreamsInfo( + const CObjectVector *dataVector, + UInt64 &dataOffset, + CFolders &folders, + CRecordVector &unpackSizes, + CUInt32DefVector &digests); + + void ReadBoolVector(unsigned numItems, CBoolVector &v); + void ReadBoolVector2(unsigned numItems, CBoolVector &v); + void ReadUInt64DefVector(const CObjectVector &dataVector, + CUInt64DefVector &v, unsigned numItems); + HRESULT ReadAndDecodePackedStreams( + DECL_EXTERNAL_CODECS_LOC_VARS + UInt64 baseOffset, UInt64 &dataOffset, + CObjectVector &dataVector + _7Z_DECODER_CRYPRO_VARS_DECL + ); + HRESULT ReadHeader( + DECL_EXTERNAL_CODECS_LOC_VARS + CDbEx &db + _7Z_DECODER_CRYPRO_VARS_DECL + ); + HRESULT ReadDatabase2( + DECL_EXTERNAL_CODECS_LOC_VARS + CDbEx &db + _7Z_DECODER_CRYPRO_VARS_DECL + ); +public: + CInArchive(bool useMixerMT): + _numInByteBufs(0), + _useMixerMT(useMixerMT) + {} + + HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive + void Close(); + + HRESULT ReadDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + CDbEx &db + _7Z_DECODER_CRYPRO_VARS_DECL + ); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zItem.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zItem.h new file mode 100644 index 0000000000..935ee439cd --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zItem.h @@ -0,0 +1,183 @@ +// 7zItem.h + +#ifndef __7Z_ITEM_H +#define __7Z_ITEM_H + +#include "../../../Common/MyBuffer.h" +#include "../../../Common/MyString.h" + +#include "../../Common/MethodId.h" + +#include "7zHeader.h" + +namespace NArchive { +namespace N7z { + +typedef UInt32 CNum; +const CNum kNumMax = 0x7FFFFFFF; +const CNum kNumNoIndex = 0xFFFFFFFF; + +struct CCoderInfo +{ + CMethodId MethodID; + CByteBuffer Props; + UInt32 NumStreams; + + bool IsSimpleCoder() const { return NumStreams == 1; } +}; + +struct CBond +{ + UInt32 PackIndex; + UInt32 UnpackIndex; +}; + +struct CFolder +{ + CLASS_NO_COPY(CFolder) +public: + CObjArray2 Coders; + CObjArray2 Bonds; + CObjArray2 PackStreams; + + CFolder() {} + + bool IsDecodingSupported() const { return Coders.Size() <= 32; } + + int Find_in_PackStreams(UInt32 packStream) const + { + FOR_VECTOR(i, PackStreams) + if (PackStreams[i] == packStream) + return i; + return -1; + } + + int FindBond_for_PackStream(UInt32 packStream) const + { + FOR_VECTOR(i, Bonds) + if (Bonds[i].PackIndex == packStream) + return i; + return -1; + } + + /* + int FindBond_for_UnpackStream(UInt32 unpackStream) const + { + FOR_VECTOR(i, Bonds) + if (Bonds[i].UnpackIndex == unpackStream) + return i; + return -1; + } + + int FindOutCoder() const + { + for (int i = (int)Coders.Size() - 1; i >= 0; i--) + if (FindBond_for_UnpackStream(i) < 0) + return i; + return -1; + } + */ + + bool IsEncrypted() const + { + FOR_VECTOR(i, Coders) + if (Coders[i].MethodID == k_AES) + return true; + return false; + } +}; + +struct CUInt32DefVector +{ + CBoolVector Defs; + CRecordVector Vals; + + void ClearAndSetSize(unsigned newSize) + { + Defs.ClearAndSetSize(newSize); + Vals.ClearAndSetSize(newSize); + } + + void Clear() + { + Defs.Clear(); + Vals.Clear(); + } + + void ReserveDown() + { + Defs.ReserveDown(); + Vals.ReserveDown(); + } + + bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; } +}; + +struct CUInt64DefVector +{ + CBoolVector Defs; + CRecordVector Vals; + + void Clear() + { + Defs.Clear(); + Vals.Clear(); + } + + void ReserveDown() + { + Defs.ReserveDown(); + Vals.ReserveDown(); + } + + bool GetItem(unsigned index, UInt64 &value) const + { + if (index < Defs.Size() && Defs[index]) + { + value = Vals[index]; + return true; + } + value = 0; + return false; + } + + void SetItem(unsigned index, bool defined, UInt64 value); + + bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; } +}; + +struct CFileItem +{ + UInt64 Size; + UInt32 Attrib; + UInt32 Crc; + /* + int Parent; + bool IsAltStream; + */ + bool HasStream; // Test it !!! it means that there is + // stream in some folder. It can be empty stream + bool IsDir; + bool CrcDefined; + bool AttribDefined; + + CFileItem(): + /* + Parent(-1), + IsAltStream(false), + */ + HasStream(true), + IsDir(false), + CrcDefined(false), + AttribDefined(false) + {} + void SetAttrib(UInt32 attrib) + { + AttribDefined = true; + Attrib = attrib; + } +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zOut.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zOut.cpp new file mode 100644 index 0000000000..0989978cc7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zOut.cpp @@ -0,0 +1,916 @@ +// 7zOut.cpp + +#include "StdAfx.h" + +#include "../../../../C/7zCrc.h" + +#include "../../../Common/AutoPtr.h" + +#include "../../Common/StreamObjects.h" + +#include "7zOut.h" + +namespace NArchive { +namespace N7z { + +HRESULT COutArchive::WriteSignature() +{ + Byte buf[8]; + memcpy(buf, kSignature, kSignatureSize); + buf[kSignatureSize] = kMajorVersion; + buf[kSignatureSize + 1] = 4; + return WriteDirect(buf, 8); +} + +#ifdef _7Z_VOL +HRESULT COutArchive::WriteFinishSignature() +{ + RINOK(WriteDirect(kFinishSignature, kSignatureSize)); + CArchiveVersion av; + av.Major = kMajorVersion; + av.Minor = 2; + RINOK(WriteDirectByte(av.Major)); + return WriteDirectByte(av.Minor); +} +#endif + +static void SetUInt32(Byte *p, UInt32 d) +{ + for (int i = 0; i < 4; i++, d >>= 8) + p[i] = (Byte)d; +} + +static void SetUInt64(Byte *p, UInt64 d) +{ + for (int i = 0; i < 8; i++, d >>= 8) + p[i] = (Byte)d; +} + +HRESULT COutArchive::WriteStartHeader(const CStartHeader &h) +{ + Byte buf[24]; + SetUInt64(buf + 4, h.NextHeaderOffset); + SetUInt64(buf + 12, h.NextHeaderSize); + SetUInt32(buf + 20, h.NextHeaderCRC); + SetUInt32(buf, CrcCalc(buf + 4, 20)); + return WriteDirect(buf, 24); +} + +#ifdef _7Z_VOL +HRESULT COutArchive::WriteFinishHeader(const CFinishHeader &h) +{ + CCRC crc; + crc.UpdateUInt64(h.NextHeaderOffset); + crc.UpdateUInt64(h.NextHeaderSize); + crc.UpdateUInt32(h.NextHeaderCRC); + crc.UpdateUInt64(h.ArchiveStartOffset); + crc.UpdateUInt64(h.AdditionalStartBlockSize); + RINOK(WriteDirectUInt32(crc.GetDigest())); + RINOK(WriteDirectUInt64(h.NextHeaderOffset)); + RINOK(WriteDirectUInt64(h.NextHeaderSize)); + RINOK(WriteDirectUInt32(h.NextHeaderCRC)); + RINOK(WriteDirectUInt64(h.ArchiveStartOffset)); + return WriteDirectUInt64(h.AdditionalStartBlockSize); +} +#endif + +HRESULT COutArchive::Create(ISequentialOutStream *stream, bool endMarker) +{ + Close(); + #ifdef _7Z_VOL + // endMarker = false; + _endMarker = endMarker; + #endif + SeqStream = stream; + if (!endMarker) + { + SeqStream.QueryInterface(IID_IOutStream, &Stream); + if (!Stream) + { + return E_NOTIMPL; + // endMarker = true; + } + } + #ifdef _7Z_VOL + if (endMarker) + { + /* + CStartHeader sh; + sh.NextHeaderOffset = (UInt32)(Int32)-1; + sh.NextHeaderSize = (UInt32)(Int32)-1; + sh.NextHeaderCRC = 0; + WriteStartHeader(sh); + */ + } + else + #endif + { + if (!Stream) + return E_FAIL; + RINOK(WriteSignature()); + RINOK(Stream->Seek(0, STREAM_SEEK_CUR, &_prefixHeaderPos)); + } + return S_OK; +} + +void COutArchive::Close() +{ + SeqStream.Release(); + Stream.Release(); +} + +HRESULT COutArchive::SkipPrefixArchiveHeader() +{ + #ifdef _7Z_VOL + if (_endMarker) + return S_OK; + #endif + Byte buf[24]; + memset(buf, 0, 24); + return WriteDirect(buf, 24); +} + +UInt64 COutArchive::GetPos() const +{ + if (_countMode) + return _countSize; + if (_writeToStream) + return _outByte.GetProcessedSize(); + return _outByte2.GetPos(); +} + +void COutArchive::WriteBytes(const void *data, size_t size) +{ + if (_countMode) + _countSize += size; + else if (_writeToStream) + { + _outByte.WriteBytes(data, size); + _crc = CrcUpdate(_crc, data, size); + } + else + _outByte2.WriteBytes(data, size); +} + +void COutArchive::WriteByte(Byte b) +{ + if (_countMode) + _countSize++; + else if (_writeToStream) + { + _outByte.WriteByte(b); + _crc = CRC_UPDATE_BYTE(_crc, b); + } + else + _outByte2.WriteByte(b); +} + +void COutArchive::WriteUInt32(UInt32 value) +{ + for (int i = 0; i < 4; i++) + { + WriteByte((Byte)value); + value >>= 8; + } +} + +void COutArchive::WriteUInt64(UInt64 value) +{ + for (int i = 0; i < 8; i++) + { + WriteByte((Byte)value); + value >>= 8; + } +} + +void COutArchive::WriteNumber(UInt64 value) +{ + Byte firstByte = 0; + Byte mask = 0x80; + int i; + for (i = 0; i < 8; i++) + { + if (value < ((UInt64(1) << ( 7 * (i + 1))))) + { + firstByte |= Byte(value >> (8 * i)); + break; + } + firstByte |= mask; + mask >>= 1; + } + WriteByte(firstByte); + for (; i > 0; i--) + { + WriteByte((Byte)value); + value >>= 8; + } +} + +static UInt32 GetBigNumberSize(UInt64 value) +{ + int i; + for (i = 1; i < 9; i++) + if (value < (((UInt64)1 << (i * 7)))) + break; + return i; +} + +#ifdef _7Z_VOL +UInt32 COutArchive::GetVolHeadersSize(UInt64 dataSize, int nameLength, bool props) +{ + UInt32 result = GetBigNumberSize(dataSize) * 2 + 41; + if (nameLength != 0) + { + nameLength = (nameLength + 1) * 2; + result += nameLength + GetBigNumberSize(nameLength) + 2; + } + if (props) + { + result += 20; + } + if (result >= 128) + result++; + result += kSignatureSize + 2 + kFinishHeaderSize; + return result; +} + +UInt64 COutArchive::GetVolPureSize(UInt64 volSize, int nameLength, bool props) +{ + UInt32 headersSizeBase = COutArchive::GetVolHeadersSize(1, nameLength, props); + int testSize; + if (volSize > headersSizeBase) + testSize = volSize - headersSizeBase; + else + testSize = 1; + UInt32 headersSize = COutArchive::GetVolHeadersSize(testSize, nameLength, props); + UInt64 pureSize = 1; + if (volSize > headersSize) + pureSize = volSize - headersSize; + return pureSize; +} +#endif + +void COutArchive::WriteFolder(const CFolder &folder) +{ + WriteNumber(folder.Coders.Size()); + unsigned i; + + for (i = 0; i < folder.Coders.Size(); i++) + { + const CCoderInfo &coder = folder.Coders[i]; + { + UInt64 id = coder.MethodID; + unsigned idSize; + for (idSize = 1; idSize < sizeof(id); idSize++) + if ((id >> (8 * idSize)) == 0) + break; + idSize &= 0xF; + Byte temp[16]; + for (unsigned t = idSize; t != 0; t--, id >>= 8) + temp[t] = (Byte)(id & 0xFF); + + Byte b = (Byte)(idSize); + bool isComplex = !coder.IsSimpleCoder(); + b |= (isComplex ? 0x10 : 0); + + size_t propsSize = coder.Props.Size(); + b |= ((propsSize != 0) ? 0x20 : 0); + temp[0] = b; + WriteBytes(temp, idSize + 1); + if (isComplex) + { + WriteNumber(coder.NumStreams); + WriteNumber(1); // NumOutStreams; + } + if (propsSize == 0) + continue; + WriteNumber(propsSize); + WriteBytes(coder.Props, propsSize); + } + } + + for (i = 0; i < folder.Bonds.Size(); i++) + { + const CBond &bond = folder.Bonds[i]; + WriteNumber(bond.PackIndex); + WriteNumber(bond.UnpackIndex); + } + + if (folder.PackStreams.Size() > 1) + for (i = 0; i < folder.PackStreams.Size(); i++) + WriteNumber(folder.PackStreams[i]); +} + +void COutArchive::WriteBoolVector(const CBoolVector &boolVector) +{ + Byte b = 0; + Byte mask = 0x80; + FOR_VECTOR (i, boolVector) + { + if (boolVector[i]) + b |= mask; + mask >>= 1; + if (mask == 0) + { + WriteByte(b); + mask = 0x80; + b = 0; + } + } + if (mask != 0x80) + WriteByte(b); +} + +static inline unsigned Bv_GetSizeInBytes(const CBoolVector &v) { return ((unsigned)v.Size() + 7) / 8; } + +void COutArchive::WritePropBoolVector(Byte id, const CBoolVector &boolVector) +{ + WriteByte(id); + WriteNumber(Bv_GetSizeInBytes(boolVector)); + WriteBoolVector(boolVector); +} + +void COutArchive::WriteHashDigests(const CUInt32DefVector &digests) +{ + unsigned numDefined = 0; + unsigned i; + for (i = 0; i < digests.Defs.Size(); i++) + if (digests.Defs[i]) + numDefined++; + if (numDefined == 0) + return; + + WriteByte(NID::kCRC); + if (numDefined == digests.Defs.Size()) + WriteByte(1); + else + { + WriteByte(0); + WriteBoolVector(digests.Defs); + } + for (i = 0; i < digests.Defs.Size(); i++) + if (digests.Defs[i]) + WriteUInt32(digests.Vals[i]); +} + +void COutArchive::WritePackInfo( + UInt64 dataOffset, + const CRecordVector &packSizes, + const CUInt32DefVector &packCRCs) +{ + if (packSizes.IsEmpty()) + return; + WriteByte(NID::kPackInfo); + WriteNumber(dataOffset); + WriteNumber(packSizes.Size()); + WriteByte(NID::kSize); + FOR_VECTOR (i, packSizes) + WriteNumber(packSizes[i]); + + WriteHashDigests(packCRCs); + + WriteByte(NID::kEnd); +} + +void COutArchive::WriteUnpackInfo(const CObjectVector &folders, const COutFolders &outFolders) +{ + if (folders.IsEmpty()) + return; + + WriteByte(NID::kUnpackInfo); + + WriteByte(NID::kFolder); + WriteNumber(folders.Size()); + { + WriteByte(0); + FOR_VECTOR (i, folders) + WriteFolder(folders[i]); + } + + WriteByte(NID::kCodersUnpackSize); + FOR_VECTOR (i, outFolders.CoderUnpackSizes) + WriteNumber(outFolders.CoderUnpackSizes[i]); + + WriteHashDigests(outFolders.FolderUnpackCRCs); + + WriteByte(NID::kEnd); +} + +void COutArchive::WriteSubStreamsInfo(const CObjectVector &folders, + const COutFolders &outFolders, + const CRecordVector &unpackSizes, + const CUInt32DefVector &digests) +{ + const CRecordVector &numUnpackStreamsInFolders = outFolders.NumUnpackStreamsVector; + WriteByte(NID::kSubStreamsInfo); + + unsigned i; + for (i = 0; i < numUnpackStreamsInFolders.Size(); i++) + if (numUnpackStreamsInFolders[i] != 1) + { + WriteByte(NID::kNumUnpackStream); + for (i = 0; i < numUnpackStreamsInFolders.Size(); i++) + WriteNumber(numUnpackStreamsInFolders[i]); + break; + } + + for (i = 0; i < numUnpackStreamsInFolders.Size(); i++) + if (numUnpackStreamsInFolders[i] > 1) + { + WriteByte(NID::kSize); + CNum index = 0; + for (i = 0; i < numUnpackStreamsInFolders.Size(); i++) + { + CNum num = numUnpackStreamsInFolders[i]; + for (CNum j = 0; j < num; j++) + { + if (j + 1 != num) + WriteNumber(unpackSizes[index]); + index++; + } + } + break; + } + + CUInt32DefVector digests2; + + unsigned digestIndex = 0; + for (i = 0; i < folders.Size(); i++) + { + unsigned numSubStreams = (unsigned)numUnpackStreamsInFolders[i]; + if (numSubStreams == 1 && outFolders.FolderUnpackCRCs.ValidAndDefined(i)) + digestIndex++; + else + for (unsigned j = 0; j < numSubStreams; j++, digestIndex++) + { + digests2.Defs.Add(digests.Defs[digestIndex]); + digests2.Vals.Add(digests.Vals[digestIndex]); + } + } + WriteHashDigests(digests2); + WriteByte(NID::kEnd); +} + +// 7-Zip 4.50 - 4.58 contain BUG, so they do not support .7z archives with Unknown field. + +void COutArchive::SkipAlign(unsigned pos, unsigned alignSize) +{ + if (!_useAlign) + return; + pos += (unsigned)GetPos(); + pos &= (alignSize - 1); + if (pos == 0) + return; + unsigned skip = alignSize - pos; + if (skip < 2) + skip += alignSize; + skip -= 2; + WriteByte(NID::kDummy); + WriteByte((Byte)skip); + for (unsigned i = 0; i < skip; i++) + WriteByte(0); +} + +void COutArchive::WriteAlignedBoolHeader(const CBoolVector &v, unsigned numDefined, Byte type, unsigned itemSize) +{ + const unsigned bvSize = (numDefined == v.Size()) ? 0 : Bv_GetSizeInBytes(v); + const UInt64 dataSize = (UInt64)numDefined * itemSize + bvSize + 2; + SkipAlign(3 + (unsigned)bvSize + (unsigned)GetBigNumberSize(dataSize), itemSize); + + WriteByte(type); + WriteNumber(dataSize); + if (numDefined == v.Size()) + WriteByte(1); + else + { + WriteByte(0); + WriteBoolVector(v); + } + WriteByte(0); +} + +void COutArchive::WriteUInt64DefVector(const CUInt64DefVector &v, Byte type) +{ + unsigned numDefined = 0; + + unsigned i; + for (i = 0; i < v.Defs.Size(); i++) + if (v.Defs[i]) + numDefined++; + + if (numDefined == 0) + return; + + WriteAlignedBoolHeader(v.Defs, numDefined, type, 8); + + for (i = 0; i < v.Defs.Size(); i++) + if (v.Defs[i]) + WriteUInt64(v.Vals[i]); +} + +HRESULT COutArchive::EncodeStream( + DECL_EXTERNAL_CODECS_LOC_VARS + CEncoder &encoder, const CByteBuffer &data, + CRecordVector &packSizes, CObjectVector &folders, COutFolders &outFolders) +{ + CBufInStream *streamSpec = new CBufInStream; + CMyComPtr stream = streamSpec; + streamSpec->Init(data, data.Size()); + outFolders.FolderUnpackCRCs.Defs.Add(true); + outFolders.FolderUnpackCRCs.Vals.Add(CrcCalc(data, data.Size())); + // outFolders.NumUnpackStreamsVector.Add(1); + UInt64 dataSize64 = data.Size(); + UInt64 unpackSize; + RINOK(encoder.Encode( + EXTERNAL_CODECS_LOC_VARS + stream, + // NULL, + &dataSize64, + folders.AddNew(), outFolders.CoderUnpackSizes, unpackSize, SeqStream, packSizes, NULL)) + return S_OK; +} + +void COutArchive::WriteHeader( + const CArchiveDatabaseOut &db, + // const CHeaderOptions &headerOptions, + UInt64 &headerOffset) +{ + /* + bool thereIsSecure = (db.SecureBuf.Size() != 0); + */ + _useAlign = true; + + { + UInt64 packSize = 0; + FOR_VECTOR (i, db.PackSizes) + packSize += db.PackSizes[i]; + headerOffset = packSize; + } + + + WriteByte(NID::kHeader); + + // Archive Properties + + if (db.Folders.Size() > 0) + { + WriteByte(NID::kMainStreamsInfo); + WritePackInfo(0, db.PackSizes, db.PackCRCs); + WriteUnpackInfo(db.Folders, (const COutFolders &)db); + + CRecordVector unpackSizes; + CUInt32DefVector digests; + FOR_VECTOR (i, db.Files) + { + const CFileItem &file = db.Files[i]; + if (!file.HasStream) + continue; + unpackSizes.Add(file.Size); + digests.Defs.Add(file.CrcDefined); + digests.Vals.Add(file.Crc); + } + + WriteSubStreamsInfo(db.Folders, (const COutFolders &)db, unpackSizes, digests); + WriteByte(NID::kEnd); + } + + if (db.Files.IsEmpty()) + { + WriteByte(NID::kEnd); + return; + } + + WriteByte(NID::kFilesInfo); + WriteNumber(db.Files.Size()); + + { + /* ---------- Empty Streams ---------- */ + CBoolVector emptyStreamVector; + emptyStreamVector.ClearAndSetSize(db.Files.Size()); + unsigned numEmptyStreams = 0; + { + FOR_VECTOR (i, db.Files) + if (db.Files[i].HasStream) + emptyStreamVector[i] = false; + else + { + emptyStreamVector[i] = true; + numEmptyStreams++; + } + } + + if (numEmptyStreams != 0) + { + WritePropBoolVector(NID::kEmptyStream, emptyStreamVector); + + CBoolVector emptyFileVector, antiVector; + emptyFileVector.ClearAndSetSize(numEmptyStreams); + antiVector.ClearAndSetSize(numEmptyStreams); + bool thereAreEmptyFiles = false, thereAreAntiItems = false; + unsigned cur = 0; + + FOR_VECTOR (i, db.Files) + { + const CFileItem &file = db.Files[i]; + if (file.HasStream) + continue; + emptyFileVector[cur] = !file.IsDir; + if (!file.IsDir) + thereAreEmptyFiles = true; + bool isAnti = db.IsItemAnti(i); + antiVector[cur] = isAnti; + if (isAnti) + thereAreAntiItems = true; + cur++; + } + + if (thereAreEmptyFiles) + WritePropBoolVector(NID::kEmptyFile, emptyFileVector); + if (thereAreAntiItems) + WritePropBoolVector(NID::kAnti, antiVector); + } + } + + + { + /* ---------- Names ---------- */ + + unsigned numDefined = 0; + size_t namesDataSize = 0; + FOR_VECTOR (i, db.Files) + { + const UString &name = db.Names[i]; + if (!name.IsEmpty()) + numDefined++; + namesDataSize += (name.Len() + 1) * 2; + } + + if (numDefined > 0) + { + namesDataSize++; + SkipAlign(2 + GetBigNumberSize(namesDataSize), 16); + + WriteByte(NID::kName); + WriteNumber(namesDataSize); + WriteByte(0); + FOR_VECTOR (i, db.Files) + { + const UString &name = db.Names[i]; + for (unsigned t = 0; t <= name.Len(); t++) + { + wchar_t c = name[t]; + WriteByte((Byte)c); + WriteByte((Byte)(c >> 8)); + } + } + } + } + + /* if (headerOptions.WriteCTime) */ WriteUInt64DefVector(db.CTime, NID::kCTime); + /* if (headerOptions.WriteATime) */ WriteUInt64DefVector(db.ATime, NID::kATime); + /* if (headerOptions.WriteMTime) */ WriteUInt64DefVector(db.MTime, NID::kMTime); + WriteUInt64DefVector(db.StartPos, NID::kStartPos); + + { + /* ---------- Write Attrib ---------- */ + CBoolVector boolVector; + boolVector.ClearAndSetSize(db.Files.Size()); + unsigned numDefined = 0; + + { + FOR_VECTOR (i, db.Files) + { + bool defined = db.Files[i].AttribDefined; + boolVector[i] = defined; + if (defined) + numDefined++; + } + } + + if (numDefined != 0) + { + WriteAlignedBoolHeader(boolVector, numDefined, NID::kWinAttrib, 4); + FOR_VECTOR (i, db.Files) + { + const CFileItem &file = db.Files[i]; + if (file.AttribDefined) + WriteUInt32(file.Attrib); + } + } + } + + /* + { + // ---------- Write IsAux ---------- + unsigned numAux = 0; + const CBoolVector &isAux = db.IsAux; + for (i = 0; i < isAux.Size(); i++) + if (isAux[i]) + numAux++; + if (numAux > 0) + { + const unsigned bvSize = Bv_GetSizeInBytes(isAux); + WriteByte(NID::kIsAux); + WriteNumber(bvSize); + WriteBoolVector(isAux); + } + } + + { + // ---------- Write Parent ---------- + CBoolVector boolVector; + boolVector.Reserve(db.Files.Size()); + unsigned numIsDir = 0; + unsigned numParentLinks = 0; + for (i = 0; i < db.Files.Size(); i++) + { + const CFileItem &file = db.Files[i]; + bool defined = !file.IsAltStream; + boolVector.Add(defined); + if (defined) + numIsDir++; + if (file.Parent >= 0) + numParentLinks++; + } + if (numParentLinks > 0) + { + // WriteAlignedBoolHeader(boolVector, numDefined, NID::kParent, 4); + const unsigned bvSize = (numIsDir == boolVector.Size()) ? 0 : Bv_GetSizeInBytes(boolVector); + const UInt64 dataSize = (UInt64)db.Files.Size() * 4 + bvSize + 1; + SkipAlign(2 + (unsigned)bvSize + (unsigned)GetBigNumberSize(dataSize), 4); + + WriteByte(NID::kParent); + WriteNumber(dataSize); + if (numIsDir == boolVector.Size()) + WriteByte(1); + else + { + WriteByte(0); + WriteBoolVector(boolVector); + } + for (i = 0; i < db.Files.Size(); i++) + { + const CFileItem &file = db.Files[i]; + // if (file.Parent >= 0) + WriteUInt32(file.Parent); + } + } + } + + if (thereIsSecure) + { + UInt64 secureDataSize = 1 + 4 + + db.SecureBuf.Size() + + db.SecureSizes.Size() * 4; + // secureDataSize += db.SecureIDs.Size() * 4; + for (i = 0; i < db.SecureIDs.Size(); i++) + secureDataSize += GetBigNumberSize(db.SecureIDs[i]); + SkipAlign(2 + GetBigNumberSize(secureDataSize), 4); + WriteByte(NID::kNtSecure); + WriteNumber(secureDataSize); + WriteByte(0); + WriteUInt32(db.SecureSizes.Size()); + for (i = 0; i < db.SecureSizes.Size(); i++) + WriteUInt32(db.SecureSizes[i]); + WriteBytes(db.SecureBuf, db.SecureBuf.Size()); + for (i = 0; i < db.SecureIDs.Size(); i++) + { + WriteNumber(db.SecureIDs[i]); + // WriteUInt32(db.SecureIDs[i]); + } + } + */ + + WriteByte(NID::kEnd); // for files + WriteByte(NID::kEnd); // for headers +} + +HRESULT COutArchive::WriteDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + const CArchiveDatabaseOut &db, + const CCompressionMethodMode *options, + const CHeaderOptions &headerOptions) +{ + if (!db.CheckNumFiles()) + return E_FAIL; + + UInt64 headerOffset; + UInt32 headerCRC; + UInt64 headerSize; + if (db.IsEmpty()) + { + headerSize = 0; + headerOffset = 0; + headerCRC = CrcCalc(0, 0); + } + else + { + bool encodeHeaders = false; + if (options != 0) + if (options->IsEmpty()) + options = 0; + if (options != 0) + if (options->PasswordIsDefined || headerOptions.CompressMainHeader) + encodeHeaders = true; + + _outByte.SetStream(SeqStream); + _outByte.Init(); + _crc = CRC_INIT_VAL; + _countMode = encodeHeaders; + _writeToStream = true; + _countSize = 0; + WriteHeader(db, /* headerOptions, */ headerOffset); + + if (encodeHeaders) + { + CByteBuffer buf(_countSize); + _outByte2.Init((Byte *)buf, _countSize); + + _countMode = false; + _writeToStream = false; + WriteHeader(db, /* headerOptions, */ headerOffset); + + if (_countSize != _outByte2.GetPos()) + return E_FAIL; + + CCompressionMethodMode encryptOptions; + encryptOptions.PasswordIsDefined = options->PasswordIsDefined; + encryptOptions.Password = options->Password; + CEncoder encoder(headerOptions.CompressMainHeader ? *options : encryptOptions); + CRecordVector packSizes; + CObjectVector folders; + COutFolders outFolders; + + RINOK(EncodeStream( + EXTERNAL_CODECS_LOC_VARS + encoder, buf, + packSizes, folders, outFolders)); + + _writeToStream = true; + + if (folders.Size() == 0) + throw 1; + + WriteID(NID::kEncodedHeader); + WritePackInfo(headerOffset, packSizes, CUInt32DefVector()); + WriteUnpackInfo(folders, outFolders); + WriteByte(NID::kEnd); + FOR_VECTOR (i, packSizes) + headerOffset += packSizes[i]; + } + RINOK(_outByte.Flush()); + headerCRC = CRC_GET_DIGEST(_crc); + headerSize = _outByte.GetProcessedSize(); + } + #ifdef _7Z_VOL + if (_endMarker) + { + CFinishHeader h; + h.NextHeaderSize = headerSize; + h.NextHeaderCRC = headerCRC; + h.NextHeaderOffset = + UInt64(0) - (headerSize + + 4 + kFinishHeaderSize); + h.ArchiveStartOffset = h.NextHeaderOffset - headerOffset; + h.AdditionalStartBlockSize = 0; + RINOK(WriteFinishHeader(h)); + return WriteFinishSignature(); + } + else + #endif + { + CStartHeader h; + h.NextHeaderSize = headerSize; + h.NextHeaderCRC = headerCRC; + h.NextHeaderOffset = headerOffset; + RINOK(Stream->Seek(_prefixHeaderPos, STREAM_SEEK_SET, NULL)); + return WriteStartHeader(h); + } +} + +void CUInt64DefVector::SetItem(unsigned index, bool defined, UInt64 value) +{ + while (index >= Defs.Size()) + Defs.Add(false); + Defs[index] = defined; + if (!defined) + return; + while (index >= Vals.Size()) + Vals.Add(0); + Vals[index] = value; +} + +void CArchiveDatabaseOut::AddFile(const CFileItem &file, const CFileItem2 &file2, const UString &name) +{ + unsigned index = Files.Size(); + CTime.SetItem(index, file2.CTimeDefined, file2.CTime); + ATime.SetItem(index, file2.ATimeDefined, file2.ATime); + MTime.SetItem(index, file2.MTimeDefined, file2.MTime); + StartPos.SetItem(index, file2.StartPosDefined, file2.StartPos); + SetItem_Anti(index, file2.IsAnti); + // SetItem_Aux(index, file2.IsAux); + Names.Add(name); + Files.Add(file); +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zOut.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zOut.h new file mode 100644 index 0000000000..86034f3593 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zOut.h @@ -0,0 +1,321 @@ +// 7zOut.h + +#ifndef __7Z_OUT_H +#define __7Z_OUT_H + +#include "7zCompressionMode.h" +#include "7zEncode.h" +#include "7zHeader.h" +#include "7zItem.h" + +#include "../../Common/OutBuffer.h" +#include "../../Common/StreamUtils.h" + +namespace NArchive { +namespace N7z { + +class CWriteBufferLoc +{ + Byte *_data; + size_t _size; + size_t _pos; +public: + CWriteBufferLoc(): _size(0), _pos(0) {} + void Init(Byte *data, size_t size) + { + _data = data; + _size = size; + _pos = 0; + } + void WriteBytes(const void *data, size_t size) + { + if (size == 0) + return; + if (size > _size - _pos) + throw 1; + memcpy(_data + _pos, data, size); + _pos += size; + } + void WriteByte(Byte b) + { + if (_size == _pos) + throw 1; + _data[_pos++] = b; + } + size_t GetPos() const { return _pos; } +}; + +struct CHeaderOptions +{ + bool CompressMainHeader; + /* + bool WriteCTime; + bool WriteATime; + bool WriteMTime; + */ + + CHeaderOptions(): + CompressMainHeader(true) + /* + , WriteCTime(false) + , WriteATime(false) + , WriteMTime(true) + */ + {} +}; + + +struct CFileItem2 +{ + UInt64 CTime; + UInt64 ATime; + UInt64 MTime; + UInt64 StartPos; + bool CTimeDefined; + bool ATimeDefined; + bool MTimeDefined; + bool StartPosDefined; + bool IsAnti; + // bool IsAux; + + void Init() + { + CTimeDefined = false; + ATimeDefined = false; + MTimeDefined = false; + StartPosDefined = false; + IsAnti = false; + // IsAux = false; + } +}; + +struct COutFolders +{ + CUInt32DefVector FolderUnpackCRCs; // Now we use it for headers only. + + CRecordVector NumUnpackStreamsVector; + CRecordVector CoderUnpackSizes; // including unpack sizes of bond coders + + void OutFoldersClear() + { + FolderUnpackCRCs.Clear(); + NumUnpackStreamsVector.Clear(); + CoderUnpackSizes.Clear(); + } + + void OutFoldersReserveDown() + { + FolderUnpackCRCs.ReserveDown(); + NumUnpackStreamsVector.ReserveDown(); + CoderUnpackSizes.ReserveDown(); + } +}; + +struct CArchiveDatabaseOut: public COutFolders +{ + CRecordVector PackSizes; + CUInt32DefVector PackCRCs; + CObjectVector Folders; + + CRecordVector Files; + UStringVector Names; + CUInt64DefVector CTime; + CUInt64DefVector ATime; + CUInt64DefVector MTime; + CUInt64DefVector StartPos; + CRecordVector IsAnti; + + /* + CRecordVector IsAux; + + CByteBuffer SecureBuf; + CRecordVector SecureSizes; + CRecordVector SecureIDs; + + void ClearSecure() + { + SecureBuf.Free(); + SecureSizes.Clear(); + SecureIDs.Clear(); + } + */ + + void Clear() + { + OutFoldersClear(); + + PackSizes.Clear(); + PackCRCs.Clear(); + Folders.Clear(); + + Files.Clear(); + Names.Clear(); + CTime.Clear(); + ATime.Clear(); + MTime.Clear(); + StartPos.Clear(); + IsAnti.Clear(); + + /* + IsAux.Clear(); + ClearSecure(); + */ + } + + void ReserveDown() + { + OutFoldersReserveDown(); + + PackSizes.ReserveDown(); + PackCRCs.ReserveDown(); + Folders.ReserveDown(); + + Files.ReserveDown(); + Names.ReserveDown(); + CTime.ReserveDown(); + ATime.ReserveDown(); + MTime.ReserveDown(); + StartPos.ReserveDown(); + IsAnti.ReserveDown(); + + /* + IsAux.ReserveDown(); + */ + } + + bool IsEmpty() const + { + return ( + PackSizes.IsEmpty() && + NumUnpackStreamsVector.IsEmpty() && + Folders.IsEmpty() && + Files.IsEmpty()); + } + + bool CheckNumFiles() const + { + unsigned size = Files.Size(); + return ( + CTime.CheckSize(size) && + ATime.CheckSize(size) && + MTime.CheckSize(size) && + StartPos.CheckSize(size) && + (size == IsAnti.Size() || IsAnti.Size() == 0)); + } + + bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); } + // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); } + + void SetItem_Anti(unsigned index, bool isAnti) + { + while (index >= IsAnti.Size()) + IsAnti.Add(false); + IsAnti[index] = isAnti; + } + /* + void SetItem_Aux(unsigned index, bool isAux) + { + while (index >= IsAux.Size()) + IsAux.Add(false); + IsAux[index] = isAux; + } + */ + + void AddFile(const CFileItem &file, const CFileItem2 &file2, const UString &name); +}; + +class COutArchive +{ + UInt64 _prefixHeaderPos; + + HRESULT WriteDirect(const void *data, UInt32 size) { return WriteStream(SeqStream, data, size); } + + UInt64 GetPos() const; + void WriteBytes(const void *data, size_t size); + void WriteBytes(const CByteBuffer &data) { WriteBytes(data, data.Size()); } + void WriteByte(Byte b); + void WriteUInt32(UInt32 value); + void WriteUInt64(UInt64 value); + void WriteNumber(UInt64 value); + void WriteID(UInt64 value) { WriteNumber(value); } + + void WriteFolder(const CFolder &folder); + HRESULT WriteFileHeader(const CFileItem &itemInfo); + void WriteBoolVector(const CBoolVector &boolVector); + void WritePropBoolVector(Byte id, const CBoolVector &boolVector); + + void WriteHashDigests(const CUInt32DefVector &digests); + + void WritePackInfo( + UInt64 dataOffset, + const CRecordVector &packSizes, + const CUInt32DefVector &packCRCs); + + void WriteUnpackInfo( + const CObjectVector &folders, + const COutFolders &outFolders); + + void WriteSubStreamsInfo( + const CObjectVector &folders, + const COutFolders &outFolders, + const CRecordVector &unpackSizes, + const CUInt32DefVector &digests); + + void SkipAlign(unsigned pos, unsigned alignSize); + void WriteAlignedBoolHeader(const CBoolVector &v, unsigned numDefined, Byte type, unsigned itemSize); + void WriteUInt64DefVector(const CUInt64DefVector &v, Byte type); + + HRESULT EncodeStream( + DECL_EXTERNAL_CODECS_LOC_VARS + CEncoder &encoder, const CByteBuffer &data, + CRecordVector &packSizes, CObjectVector &folders, COutFolders &outFolders); + void WriteHeader( + const CArchiveDatabaseOut &db, + // const CHeaderOptions &headerOptions, + UInt64 &headerOffset); + + bool _countMode; + bool _writeToStream; + size_t _countSize; + UInt32 _crc; + COutBuffer _outByte; + CWriteBufferLoc _outByte2; + + #ifdef _7Z_VOL + bool _endMarker; + #endif + + bool _useAlign; + + HRESULT WriteSignature(); + #ifdef _7Z_VOL + HRESULT WriteFinishSignature(); + #endif + HRESULT WriteStartHeader(const CStartHeader &h); + #ifdef _7Z_VOL + HRESULT WriteFinishHeader(const CFinishHeader &h); + #endif + CMyComPtr Stream; +public: + + COutArchive() { _outByte.Create(1 << 16); } + CMyComPtr SeqStream; + HRESULT Create(ISequentialOutStream *stream, bool endMarker); + void Close(); + HRESULT SkipPrefixArchiveHeader(); + HRESULT WriteDatabase( + DECL_EXTERNAL_CODECS_LOC_VARS + const CArchiveDatabaseOut &db, + const CCompressionMethodMode *options, + const CHeaderOptions &headerOptions); + + #ifdef _7Z_VOL + static UInt32 GetVolHeadersSize(UInt64 dataSize, int nameLength = 0, bool props = false); + static UInt64 GetVolPureSize(UInt64 volSize, int nameLength = 0, bool props = false); + #endif + +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zProperties.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zProperties.cpp new file mode 100644 index 0000000000..388ac766c6 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zProperties.cpp @@ -0,0 +1,174 @@ +// 7zProperties.cpp + +#include "StdAfx.h" + +#include "7zProperties.h" +#include "7zHeader.h" +#include "7zHandler.h" + +// #define _MULTI_PACK + +namespace NArchive { +namespace N7z { + +struct CPropMap +{ + UInt32 FilePropID; + CStatProp StatProp; +}; + +static const CPropMap kPropMap[] = +{ + { NID::kName, { NULL, kpidPath, VT_BSTR } }, + { NID::kSize, { NULL, kpidSize, VT_UI8 } }, + { NID::kPackInfo, { NULL, kpidPackSize, VT_UI8 } }, + + #ifdef _MULTI_PACK + { 100, { "Pack0", kpidPackedSize0, VT_UI8 } }, + { 101, { "Pack1", kpidPackedSize1, VT_UI8 } }, + { 102, { "Pack2", kpidPackedSize2, VT_UI8 } }, + { 103, { "Pack3", kpidPackedSize3, VT_UI8 } }, + { 104, { "Pack4", kpidPackedSize4, VT_UI8 } }, + #endif + + { NID::kCTime, { NULL, kpidCTime, VT_FILETIME } }, + { NID::kMTime, { NULL, kpidMTime, VT_FILETIME } }, + { NID::kATime, { NULL, kpidATime, VT_FILETIME } }, + { NID::kWinAttrib, { NULL, kpidAttrib, VT_UI4 } }, + { NID::kStartPos, { NULL, kpidPosition, VT_UI8 } }, + + { NID::kCRC, { NULL, kpidCRC, VT_UI4 } }, + +// { NID::kIsAux, { NULL, kpidIsAux, VT_BOOL } }, + { NID::kAnti, { NULL, kpidIsAnti, VT_BOOL } } + + #ifndef _SFX + , + { 97, { NULL, kpidEncrypted, VT_BOOL } }, + { 98, { NULL, kpidMethod, VT_BSTR } }, + { 99, { NULL, kpidBlock, VT_UI4 } } + #endif +}; + +static void CopyOneItem(CRecordVector &src, + CRecordVector &dest, UInt32 item) +{ + FOR_VECTOR (i, src) + if (src[i] == item) + { + dest.Add(item); + src.Delete(i); + return; + } +} + +static void RemoveOneItem(CRecordVector &src, UInt32 item) +{ + FOR_VECTOR (i, src) + if (src[i] == item) + { + src.Delete(i); + return; + } +} + +static void InsertToHead(CRecordVector &dest, UInt32 item) +{ + FOR_VECTOR (i, dest) + if (dest[i] == item) + { + dest.Delete(i); + break; + } + dest.Insert(0, item); +} + +#define COPY_ONE_ITEM(id) CopyOneItem(fileInfoPopIDs, _fileInfoPopIDs, NID::id); + +void CHandler::FillPopIDs() +{ + _fileInfoPopIDs.Clear(); + + #ifdef _7Z_VOL + if (_volumes.Size() < 1) + return; + const CVolume &volume = _volumes.Front(); + const CArchiveDatabaseEx &_db = volume.Database; + #endif + + CRecordVector fileInfoPopIDs = _db.ArcInfo.FileInfoPopIDs; + + RemoveOneItem(fileInfoPopIDs, NID::kEmptyStream); + RemoveOneItem(fileInfoPopIDs, NID::kEmptyFile); + /* + RemoveOneItem(fileInfoPopIDs, NID::kParent); + RemoveOneItem(fileInfoPopIDs, NID::kNtSecure); + */ + + COPY_ONE_ITEM(kName); + COPY_ONE_ITEM(kAnti); + COPY_ONE_ITEM(kSize); + COPY_ONE_ITEM(kPackInfo); + COPY_ONE_ITEM(kCTime); + COPY_ONE_ITEM(kMTime); + COPY_ONE_ITEM(kATime); + COPY_ONE_ITEM(kWinAttrib); + COPY_ONE_ITEM(kCRC); + COPY_ONE_ITEM(kComment); + + _fileInfoPopIDs += fileInfoPopIDs; + + #ifndef _SFX + _fileInfoPopIDs.Add(97); + _fileInfoPopIDs.Add(98); + _fileInfoPopIDs.Add(99); + #endif + + #ifdef _MULTI_PACK + _fileInfoPopIDs.Add(100); + _fileInfoPopIDs.Add(101); + _fileInfoPopIDs.Add(102); + _fileInfoPopIDs.Add(103); + _fileInfoPopIDs.Add(104); + #endif + + #ifndef _SFX + InsertToHead(_fileInfoPopIDs, NID::kMTime); + InsertToHead(_fileInfoPopIDs, NID::kPackInfo); + InsertToHead(_fileInfoPopIDs, NID::kSize); + InsertToHead(_fileInfoPopIDs, NID::kName); + #endif +} + +STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps) +{ + *numProps = _fileInfoPopIDs.Size(); + return S_OK; +} + +STDMETHODIMP CHandler::GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) +{ + if (index >= _fileInfoPopIDs.Size()) + return E_INVALIDARG; + UInt64 id = _fileInfoPopIDs[index]; + for (unsigned i = 0; i < ARRAY_SIZE(kPropMap); i++) + { + const CPropMap &pr = kPropMap[i]; + if (pr.FilePropID == id) + { + const CStatProp &st = pr.StatProp; + *propID = st.PropID; + *varType = st.vt; + /* + if (st.lpwstrName) + *name = ::SysAllocString(st.lpwstrName); + else + */ + *name = NULL; + return S_OK; + } + } + return E_INVALIDARG; +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zProperties.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zProperties.h new file mode 100644 index 0000000000..7b78130ef5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zProperties.h @@ -0,0 +1,22 @@ +// 7zProperties.h + +#ifndef __7Z_PROPERTIES_H +#define __7Z_PROPERTIES_H + +#include "../../PropID.h" + +namespace NArchive { +namespace N7z { + +enum +{ + kpidPackedSize0 = kpidUserDefined, + kpidPackedSize1, + kpidPackedSize2, + kpidPackedSize3, + kpidPackedSize4 +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zRegister.cpp new file mode 100644 index 0000000000..3e8cfb6645 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zRegister.cpp @@ -0,0 +1,21 @@ +// 7zRegister.cpp + +#include "StdAfx.h" + +#include "../../Common/RegisterArc.h" + +#include "7zHandler.h" + +namespace NArchive { +namespace N7z { + +static Byte k_Signature_Dec[kSignatureSize] = {'7' + 1, 'z', 0xBC, 0xAF, 0x27, 0x1C}; + +REGISTER_ARC_IO_DECREMENT_SIG( + "7z", "7z", NULL, 7, + k_Signature_Dec, + 0, + NArcInfoFlags::kFindSignature, + NULL); + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp new file mode 100644 index 0000000000..e9671a87e9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp @@ -0,0 +1,22 @@ +// 7zSpecStream.cpp + +#include "StdAfx.h" + +#include "7zSpecStream.h" + +STDMETHODIMP CSequentialInStreamSizeCount2::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Read(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize) + *processedSize = realProcessedSize; + return result; +} + +STDMETHODIMP CSequentialInStreamSizeCount2::GetSubStreamSize(UInt64 subStream, UInt64 *value) +{ + if (!_getSubStreamSize) + return E_NOTIMPL; + return _getSubStreamSize->GetSubStreamSize(subStream, value); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zSpecStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zSpecStream.h new file mode 100644 index 0000000000..09941287d6 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zSpecStream.h @@ -0,0 +1,35 @@ +// 7zSpecStream.h + +#ifndef __7Z_SPEC_STREAM_H +#define __7Z_SPEC_STREAM_H + +#include "../../../Common/MyCom.h" + +#include "../../ICoder.h" + +class CSequentialInStreamSizeCount2: + public ISequentialInStream, + public ICompressGetSubStreamSize, + public CMyUnknownImp +{ + CMyComPtr _stream; + CMyComPtr _getSubStreamSize; + UInt64 _size; +public: + void Init(ISequentialInStream *stream) + { + _size = 0; + _getSubStreamSize.Release(); + _stream = stream; + _stream.QueryInterface(IID_ICompressGetSubStreamSize, &_getSubStreamSize); + } + UInt64 GetSize() const { return _size; } + + MY_UNKNOWN_IMP2(ISequentialInStream, ICompressGetSubStreamSize) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp new file mode 100644 index 0000000000..509a3302b7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp @@ -0,0 +1,2469 @@ +// 7zUpdate.cpp + +#include "StdAfx.h" + +#include "../../../../C/CpuArch.h" + +#include "../../../Common/Wildcard.h" + +#include "../../Common/CreateCoder.h" +#include "../../Common/LimitedStreams.h" +#include "../../Common/ProgressUtils.h" + +#include "../../Compress/CopyCoder.h" + +#include "../Common/ItemNameUtils.h" + +#include "7zDecode.h" +#include "7zEncode.h" +#include "7zFolderInStream.h" +#include "7zHandler.h" +#include "7zOut.h" +#include "7zUpdate.h" + +namespace NArchive { +namespace N7z { + + +#define k_X86 k_BCJ + +struct CFilterMode +{ + UInt32 Id; + UInt32 Delta; + + CFilterMode(): Id(0), Delta(0) {} + + void SetDelta() + { + if (Id == k_IA64) + Delta = 16; + else if (Id == k_ARM || Id == k_PPC || Id == k_SPARC) + Delta = 4; + else if (Id == k_ARMT) + Delta = 2; + else + Delta = 0; + } +}; + + +/* ---------- PE ---------- */ + +#define MZ_SIG 0x5A4D + +#define PE_SIG 0x00004550 +#define PE_OptHeader_Magic_32 0x10B +#define PE_OptHeader_Magic_64 0x20B +#define PE_SectHeaderSize 40 +#define PE_SECT_EXECUTE 0x20000000 + +static int Parse_EXE(const Byte *buf, size_t size, CFilterMode *filterMode) +{ + if (size < 512 || GetUi16(buf) != MZ_SIG) + return 0; + + const Byte *p; + UInt32 peOffset, optHeaderSize, filterId; + + peOffset = GetUi32(buf + 0x3C); + if (peOffset >= 0x1000 || peOffset + 512 > size || (peOffset & 7) != 0) + return 0; + p = buf + peOffset; + if (GetUi32(p) != PE_SIG) + return 0; + p += 4; + + switch (GetUi16(p)) + { + case 0x014C: + case 0x8664: filterId = k_X86; break; + + /* + IMAGE_FILE_MACHINE_ARM 0x01C0 // ARM LE + IMAGE_FILE_MACHINE_THUMB 0x01C2 // ARM Thumb / Thumb-2 LE + IMAGE_FILE_MACHINE_ARMNT 0x01C4 // ARM Thumb-2, LE + Note: We use ARM filter for 0x01C2. (WinCE 5 - 0x01C2) files mostly contain ARM code (not Thumb/Thumb-2). + */ + + case 0x01C0: // WinCE old + case 0x01C2: filterId = k_ARM; break; // WinCE new + case 0x01C4: filterId = k_ARMT; break; // WinRT + + case 0x0200: filterId = k_IA64; break; + default: return 0; + } + + optHeaderSize = GetUi16(p + 16); + if (optHeaderSize > (1 << 10)) + return 0; + + p += 20; /* headerSize */ + + switch (GetUi16(p)) + { + case PE_OptHeader_Magic_32: + case PE_OptHeader_Magic_64: + break; + default: + return 0; + } + + filterMode->Id = filterId; + return 1; +} + + +/* ---------- ELF ---------- */ + +#define ELF_SIG 0x464C457F + +#define ELF_CLASS_32 1 +#define ELF_CLASS_64 2 + +#define ELF_DATA_2LSB 1 +#define ELF_DATA_2MSB 2 + +static UInt16 Get16(const Byte *p, Bool be) { if (be) return (UInt16)GetBe16(p); return (UInt16)GetUi16(p); } +static UInt32 Get32(const Byte *p, Bool be) { if (be) return GetBe32(p); return GetUi32(p); } +// static UInt64 Get64(const Byte *p, Bool be) { if (be) return GetBe64(p); return GetUi64(p); } + +static int Parse_ELF(const Byte *buf, size_t size, CFilterMode *filterMode) +{ + Bool /* is32, */ be; + UInt32 filterId; + + if (size < 512 || buf[6] != 1) /* ver */ + return 0; + + if (GetUi32(buf) != ELF_SIG) + return 0; + + switch (buf[4]) + { + case ELF_CLASS_32: /* is32 = True; */ break; + case ELF_CLASS_64: /* is32 = False; */ break; + default: return 0; + } + + switch (buf[5]) + { + case ELF_DATA_2LSB: be = False; break; + case ELF_DATA_2MSB: be = True; break; + default: return 0; + } + + switch (Get16(buf + 0x12, be)) + { + case 3: + case 6: + case 62: filterId = k_X86; break; + case 2: + case 18: + case 43: filterId = k_SPARC; break; + case 20: + case 21: if (!be) return 0; filterId = k_PPC; break; + case 40: if ( be) return 0; filterId = k_ARM; break; + + /* Some IA-64 ELF exacutable have size that is not aligned for 16 bytes. + So we don't use IA-64 filter for IA-64 ELF */ + // case 50: if ( be) return 0; filterId = k_IA64; break; + + default: return 0; + } + + filterMode->Id = filterId; + return 1; +} + + + +/* ---------- Mach-O ---------- */ + +#define MACH_SIG_BE_32 0xCEFAEDFE +#define MACH_SIG_BE_64 0xCFFAEDFE +#define MACH_SIG_LE_32 0xFEEDFACE +#define MACH_SIG_LE_64 0xFEEDFACF + +#define MACH_ARCH_ABI64 (1 << 24) +#define MACH_MACHINE_386 7 +#define MACH_MACHINE_ARM 12 +#define MACH_MACHINE_SPARC 14 +#define MACH_MACHINE_PPC 18 +#define MACH_MACHINE_PPC64 (MACH_ARCH_ABI64 | MACH_MACHINE_PPC) +#define MACH_MACHINE_AMD64 (MACH_ARCH_ABI64 | MACH_MACHINE_386) + +static unsigned Parse_MACH(const Byte *buf, size_t size, CFilterMode *filterMode) +{ + UInt32 filterId, numCommands, commandsSize; + + if (size < 512) + return 0; + + Bool /* mode64, */ be; + switch (GetUi32(buf)) + { + case MACH_SIG_BE_32: /* mode64 = False; */ be = True; break; + case MACH_SIG_BE_64: /* mode64 = True; */ be = True; break; + case MACH_SIG_LE_32: /* mode64 = False; */ be = False; break; + case MACH_SIG_LE_64: /* mode64 = True; */ be = False; break; + default: return 0; + } + + switch (Get32(buf + 4, be)) + { + case MACH_MACHINE_386: + case MACH_MACHINE_AMD64: filterId = k_X86; break; + case MACH_MACHINE_ARM: if ( be) return 0; filterId = k_ARM; break; + case MACH_MACHINE_SPARC: if (!be) return 0; filterId = k_SPARC; break; + case MACH_MACHINE_PPC: + case MACH_MACHINE_PPC64: if (!be) return 0; filterId = k_PPC; break; + default: return 0; + } + + numCommands = Get32(buf + 0x10, be); + commandsSize = Get32(buf + 0x14, be); + + if (commandsSize > (1 << 24) || numCommands > (1 << 18)) + return 0; + + filterMode->Id = filterId; + return 1; +} + + +/* ---------- WAV ---------- */ + +#define WAV_SUBCHUNK_fmt 0x20746D66 +#define WAV_SUBCHUNK_data 0x61746164 + +#define RIFF_SIG 0x46464952 + +static Bool Parse_WAV(const Byte *buf, size_t size, CFilterMode *filterMode) +{ + UInt32 subChunkSize, pos; + if (size < 0x2C) + return False; + + if (GetUi32(buf + 0) != RIFF_SIG || + GetUi32(buf + 8) != 0x45564157 || // WAVE + GetUi32(buf + 0xC) != WAV_SUBCHUNK_fmt) + return False; + subChunkSize = GetUi32(buf + 0x10); + /* [0x14 = format] = 1 (PCM) */ + if (subChunkSize < 0x10 || subChunkSize > 0x12 || GetUi16(buf + 0x14) != 1) + return False; + + unsigned numChannels = GetUi16(buf + 0x16); + unsigned bitsPerSample = GetUi16(buf + 0x22); + + if ((bitsPerSample & 0x7) != 0 || bitsPerSample >= 256 || numChannels >= 256) + return False; + + pos = 0x14 + subChunkSize; + + const int kNumSubChunksTests = 10; + // Do we need to scan more than 3 sub-chunks? + for (int i = 0; i < kNumSubChunksTests; i++) + { + if (pos + 8 > size) + return False; + subChunkSize = GetUi32(buf + pos + 4); + if (GetUi32(buf + pos) == WAV_SUBCHUNK_data) + { + unsigned delta = numChannels * (bitsPerSample >> 3); + if (delta >= 256) + return False; + filterMode->Id = k_Delta; + filterMode->Delta = delta; + return True; + } + if (subChunkSize > (1 << 16)) + return False; + pos += subChunkSize + 8; + } + return False; +} + +static Bool ParseFile(const Byte *buf, size_t size, CFilterMode *filterMode) +{ + filterMode->Id = 0; + filterMode->Delta = 0; + + if (Parse_EXE(buf, size, filterMode)) return True; + if (Parse_ELF(buf, size, filterMode)) return True; + if (Parse_MACH(buf, size, filterMode)) return True; + return Parse_WAV(buf, size, filterMode); +} + + + + +struct CFilterMode2: public CFilterMode +{ + bool Encrypted; + unsigned GroupIndex; + + CFilterMode2(): Encrypted(false) {} + + int Compare(const CFilterMode2 &m) const + { + if (!Encrypted) + { + if (m.Encrypted) + return -1; + } + else if (!m.Encrypted) + return 1; + + if (Id < m.Id) return -1; + if (Id > m.Id) return 1; + + if (Delta < m.Delta) return -1; + if (Delta > m.Delta) return 1; + + return 0; + } + + bool operator ==(const CFilterMode2 &m) const + { + return Id == m.Id && Delta == m.Delta && Encrypted == m.Encrypted; + } +}; + +static unsigned GetGroup(CRecordVector &filters, const CFilterMode2 &m) +{ + unsigned i; + for (i = 0; i < filters.Size(); i++) + { + const CFilterMode2 &m2 = filters[i]; + if (m == m2) + return i; + /* + if (m.Encrypted != m2.Encrypted) + { + if (!m.Encrypted) + break; + continue; + } + + if (m.Id < m2.Id) break; + if (m.Id != m2.Id) continue; + + if (m.Delta < m2.Delta) break; + if (m.Delta != m2.Delta) continue; + */ + } + // filters.Insert(i, m); + // return i; + return filters.Add(m); +} + +static inline bool Is86Filter(CMethodId m) +{ + return (m == k_BCJ || m == k_BCJ2); +} + +static inline bool IsExeFilter(CMethodId m) +{ + switch (m) + { + case k_BCJ: + case k_BCJ2: + case k_ARM: + case k_ARMT: + case k_PPC: + case k_SPARC: + case k_IA64: + return true; + } + return false; +} + +static unsigned Get_FilterGroup_for_Folder( + CRecordVector &filters, const CFolderEx &f, bool extractFilter) +{ + CFilterMode2 m; + m.Id = 0; + m.Delta = 0; + m.Encrypted = f.IsEncrypted(); + + if (extractFilter) + { + const CCoderInfo &coder = f.Coders[f.UnpackCoder]; + + if (coder.MethodID == k_Delta) + { + if (coder.Props.Size() == 1) + { + m.Delta = (unsigned)coder.Props[0] + 1; + m.Id = k_Delta; + } + } + else if (IsExeFilter(coder.MethodID)) + { + m.Id = (UInt32)coder.MethodID; + if (m.Id == k_BCJ2) + m.Id = k_BCJ; + m.SetDelta(); + } + } + + return GetGroup(filters, m); +} + + + + +static HRESULT WriteRange(IInStream *inStream, ISequentialOutStream *outStream, + UInt64 position, UInt64 size, ICompressProgressInfo *progress) +{ + RINOK(inStream->Seek(position, STREAM_SEEK_SET, 0)); + CLimitedSequentialInStream *streamSpec = new CLimitedSequentialInStream; + CMyComPtr inStreamLimited(streamSpec); + streamSpec->SetStream(inStream); + streamSpec->Init(size); + + NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; + CMyComPtr copyCoder = copyCoderSpec; + RINOK(copyCoder->Code(inStreamLimited, outStream, NULL, NULL, progress)); + return (copyCoderSpec->TotalSize == size ? S_OK : E_FAIL); +} + +/* +unsigned CUpdateItem::GetExtensionPos() const +{ + int slashPos = Name.ReverseFind_PathSepar(); + int dotPos = Name.ReverseFind_Dot(); + if (dotPos <= slashPos) + return Name.Len(); + return dotPos + 1; +} + +UString CUpdateItem::GetExtension() const +{ + return Name.Ptr(GetExtensionPos()); +} +*/ + +#define RINOZ(x) { int __tt = (x); if (__tt != 0) return __tt; } + +#define RINOZ_COMP(a, b) RINOZ(MyCompare(a, b)) + +/* +static int CompareBuffers(const CByteBuffer &a1, const CByteBuffer &a2) +{ + size_t c1 = a1.GetCapacity(); + size_t c2 = a2.GetCapacity(); + RINOZ_COMP(c1, c2); + for (size_t i = 0; i < c1; i++) + RINOZ_COMP(a1[i], a2[i]); + return 0; +} + +static int CompareCoders(const CCoderInfo &c1, const CCoderInfo &c2) +{ + RINOZ_COMP(c1.NumInStreams, c2.NumInStreams); + RINOZ_COMP(c1.NumOutStreams, c2.NumOutStreams); + RINOZ_COMP(c1.MethodID, c2.MethodID); + return CompareBuffers(c1.Props, c2.Props); +} + +static int CompareBonds(const CBond &b1, const CBond &b2) +{ + RINOZ_COMP(b1.InIndex, b2.InIndex); + return MyCompare(b1.OutIndex, b2.OutIndex); +} + +static int CompareFolders(const CFolder &f1, const CFolder &f2) +{ + int s1 = f1.Coders.Size(); + int s2 = f2.Coders.Size(); + RINOZ_COMP(s1, s2); + int i; + for (i = 0; i < s1; i++) + RINOZ(CompareCoders(f1.Coders[i], f2.Coders[i])); + s1 = f1.Bonds.Size(); + s2 = f2.Bonds.Size(); + RINOZ_COMP(s1, s2); + for (i = 0; i < s1; i++) + RINOZ(CompareBonds(f1.Bonds[i], f2.Bonds[i])); + return 0; +} +*/ + +/* +static int CompareFiles(const CFileItem &f1, const CFileItem &f2) +{ + return CompareFileNames(f1.Name, f2.Name); +} +*/ + +struct CFolderRepack +{ + unsigned FolderIndex; + CNum NumCopyFiles; +}; + +/* +static int CompareFolderRepacks(const CFolderRepack *p1, const CFolderRepack *p2, void *) +{ + int i1 = p1->FolderIndex; + int i2 = p2->FolderIndex; + // In that version we don't want to parse folders here, so we don't compare folders + // probably it must be improved in future + // const CDbEx &db = *(const CDbEx *)param; + // RINOZ(CompareFolders( + // db.Folders[i1], + // db.Folders[i2])); + + return MyCompare(i1, i2); + + // RINOZ_COMP( + // db.NumUnpackStreamsVector[i1], + // db.NumUnpackStreamsVector[i2]); + // if (db.NumUnpackStreamsVector[i1] == 0) + // return 0; + // return CompareFiles( + // db.Files[db.FolderStartFileIndex[i1]], + // db.Files[db.FolderStartFileIndex[i2]]); +} +*/ + +/* + we sort empty files and dirs in such order: + - Dir.NonAnti (name sorted) + - File.NonAnti (name sorted) + - File.Anti (name sorted) + - Dir.Anti (reverse name sorted) +*/ + +static int CompareEmptyItems(const unsigned *p1, const unsigned *p2, void *param) +{ + const CObjectVector &updateItems = *(const CObjectVector *)param; + const CUpdateItem &u1 = updateItems[*p1]; + const CUpdateItem &u2 = updateItems[*p2]; + // NonAnti < Anti + if (u1.IsAnti != u2.IsAnti) + return (u1.IsAnti ? 1 : -1); + if (u1.IsDir != u2.IsDir) + { + // Dir.NonAnti < File < Dir.Anti + if (u1.IsDir) + return (u1.IsAnti ? 1 : -1); + return (u2.IsAnti ? -1 : 1); + } + int n = CompareFileNames(u1.Name, u2.Name); + return (u1.IsDir && u1.IsAnti) ? -n : n; +} + +static const char *g_Exts = + " 7z xz lzma ace arc arj bz tbz bz2 tbz2 cab deb gz tgz ha lha lzh lzo lzx pak rar rpm sit zoo" + " zip jar ear war msi" + " 3gp avi mov mpeg mpg mpe wmv" + " aac ape fla flac la mp3 m4a mp4 ofr ogg pac ra rm rka shn swa tta wv wma wav" + " swf" + " chm hxi hxs" + " gif jpeg jpg jp2 png tiff bmp ico psd psp" + " awg ps eps cgm dxf svg vrml wmf emf ai md" + " cad dwg pps key sxi" + " max 3ds" + " iso bin nrg mdf img pdi tar cpio xpi" + " vfd vhd vud vmc vsv" + " vmdk dsk nvram vmem vmsd vmsn vmss vmtm" + " inl inc idl acf asa" + " h hpp hxx c cpp cxx m mm go swift" + " rc java cs rs pas bas vb cls ctl frm dlg def" + " f77 f f90 f95" + " asm s" + " sql manifest dep" + " mak clw csproj vcproj sln dsp dsw" + " class" + " bat cmd bash sh" + " xml xsd xsl xslt hxk hxc htm html xhtml xht mht mhtml htw asp aspx css cgi jsp shtml" + " awk sed hta js json php php3 php4 php5 phptml pl pm py pyo rb tcl ts vbs" + " text txt tex ans asc srt reg ini doc docx mcw dot rtf hlp xls xlr xlt xlw ppt pdf" + " sxc sxd sxi sxg sxw stc sti stw stm odt ott odg otg odp otp ods ots odf" + " abw afp cwk lwp wpd wps wpt wrf wri" + " abf afm bdf fon mgf otf pcf pfa snf ttf" + " dbf mdb nsf ntf wdb db fdb gdb" + " exe dll ocx vbx sfx sys tlb awx com obj lib out o so" + " pdb pch idb ncb opt"; + +static unsigned GetExtIndex(const char *ext) +{ + unsigned extIndex = 1; + const char *p = g_Exts; + for (;;) + { + char c = *p++; + if (c == 0) + return extIndex; + if (c == ' ') + continue; + unsigned pos = 0; + for (;;) + { + char c2 = ext[pos++]; + if (c2 == 0 && (c == 0 || c == ' ')) + return extIndex; + if (c != c2) + break; + c = *p++; + } + extIndex++; + for (;;) + { + if (c == 0) + return extIndex; + if (c == ' ') + break; + c = *p++; + } + } +} + +struct CRefItem +{ + const CUpdateItem *UpdateItem; + UInt32 Index; + unsigned ExtensionPos; + unsigned NamePos; + unsigned ExtensionIndex; + + CRefItem() {}; + CRefItem(UInt32 index, const CUpdateItem &ui, bool sortByType): + UpdateItem(&ui), + Index(index), + ExtensionPos(0), + NamePos(0), + ExtensionIndex(0) + { + if (sortByType) + { + int slashPos = ui.Name.ReverseFind_PathSepar(); + NamePos = slashPos + 1; + int dotPos = ui.Name.ReverseFind_Dot(); + if (dotPos <= slashPos) + ExtensionPos = ui.Name.Len(); + else + { + ExtensionPos = dotPos + 1; + if (ExtensionPos != ui.Name.Len()) + { + AString s; + for (unsigned pos = ExtensionPos;; pos++) + { + wchar_t c = ui.Name[pos]; + if (c >= 0x80) + break; + if (c == 0) + { + ExtensionIndex = GetExtIndex(s); + break; + } + s += (char)MyCharLower_Ascii((char)c); + } + } + } + } + } +}; + +struct CSortParam +{ + // const CObjectVector *TreeFolders; + bool SortByType; +}; + +/* + we sort files in such order: + - Dir.NonAnti (name sorted) + - alt streams + - Dirs + - Dir.Anti (reverse name sorted) +*/ + + +static int CompareUpdateItems(const CRefItem *p1, const CRefItem *p2, void *param) +{ + const CRefItem &a1 = *p1; + const CRefItem &a2 = *p2; + const CUpdateItem &u1 = *a1.UpdateItem; + const CUpdateItem &u2 = *a2.UpdateItem; + + /* + if (u1.IsAltStream != u2.IsAltStream) + return u1.IsAltStream ? 1 : -1; + */ + + // Actually there are no dirs that time. They were stored in other steps + // So that code is unused? + if (u1.IsDir != u2.IsDir) + return u1.IsDir ? 1 : -1; + if (u1.IsDir) + { + if (u1.IsAnti != u2.IsAnti) + return (u1.IsAnti ? 1 : -1); + int n = CompareFileNames(u1.Name, u2.Name); + return -n; + } + + // bool sortByType = *(bool *)param; + const CSortParam *sortParam = (const CSortParam *)param; + bool sortByType = sortParam->SortByType; + if (sortByType) + { + RINOZ_COMP(a1.ExtensionIndex, a2.ExtensionIndex); + RINOZ(CompareFileNames(u1.Name.Ptr(a1.ExtensionPos), u2.Name.Ptr(a2.ExtensionPos))); + RINOZ(CompareFileNames(u1.Name.Ptr(a1.NamePos), u2.Name.Ptr(a2.NamePos))); + if (!u1.MTimeDefined && u2.MTimeDefined) return 1; + if (u1.MTimeDefined && !u2.MTimeDefined) return -1; + if (u1.MTimeDefined && u2.MTimeDefined) RINOZ_COMP(u1.MTime, u2.MTime); + RINOZ_COMP(u1.Size, u2.Size); + } + /* + int par1 = a1.UpdateItem->ParentFolderIndex; + int par2 = a2.UpdateItem->ParentFolderIndex; + const CTreeFolder &tf1 = (*sortParam->TreeFolders)[par1]; + const CTreeFolder &tf2 = (*sortParam->TreeFolders)[par2]; + + int b1 = tf1.SortIndex, e1 = tf1.SortIndexEnd; + int b2 = tf2.SortIndex, e2 = tf2.SortIndexEnd; + if (b1 < b2) + { + if (e1 <= b2) + return -1; + // p2 in p1 + int par = par2; + for (;;) + { + const CTreeFolder &tf = (*sortParam->TreeFolders)[par]; + par = tf.Parent; + if (par == par1) + { + RINOZ(CompareFileNames(u1.Name, tf.Name)); + break; + } + } + } + else if (b2 < b1) + { + if (e2 <= b1) + return 1; + // p1 in p2 + int par = par1; + for (;;) + { + const CTreeFolder &tf = (*sortParam->TreeFolders)[par]; + par = tf.Parent; + if (par == par2) + { + RINOZ(CompareFileNames(tf.Name, u2.Name)); + break; + } + } + } + */ + // RINOZ_COMP(a1.UpdateItem->ParentSortIndex, a2.UpdateItem->ParentSortIndex); + RINOK(CompareFileNames(u1.Name, u2.Name)); + RINOZ_COMP(a1.UpdateItem->IndexInClient, a2.UpdateItem->IndexInClient); + RINOZ_COMP(a1.UpdateItem->IndexInArchive, a2.UpdateItem->IndexInArchive); + return 0; +} + +struct CSolidGroup +{ + CRecordVector Indices; + + CRecordVector folderRefs; +}; + +static const char * const g_ExeExts[] = +{ + "dll" + , "exe" + , "ocx" + , "sfx" + , "sys" +}; + +static bool IsExeExt(const wchar_t *ext) +{ + for (unsigned i = 0; i < ARRAY_SIZE(g_ExeExts); i++) + if (StringsAreEqualNoCase_Ascii(ext, g_ExeExts[i])) + return true; + return false; +} + +struct CAnalysis +{ + CMyComPtr Callback; + CByteBuffer Buffer; + + bool ParseWav; + bool ParseExe; + bool ParseAll; + + CAnalysis(): + ParseWav(true), + ParseExe(false), + ParseAll(false) + {} + + HRESULT GetFilterGroup(UInt32 index, const CUpdateItem &ui, CFilterMode &filterMode); +}; + +static const size_t kAnalysisBufSize = 1 << 14; + +HRESULT CAnalysis::GetFilterGroup(UInt32 index, const CUpdateItem &ui, CFilterMode &filterMode) +{ + filterMode.Id = 0; + filterMode.Delta = 0; + + CFilterMode filterModeTemp = filterMode; + + int slashPos = ui.Name.ReverseFind_PathSepar(); + int dotPos = ui.Name.ReverseFind_Dot(); + + // if (dotPos > slashPos) + { + bool needReadFile = ParseAll; + + bool probablyIsSameIsa = false; + + if (!needReadFile || !Callback) + { + const wchar_t *ext; + if (dotPos > slashPos) + ext = ui.Name.Ptr(dotPos + 1); + else + ext = ui.Name.RightPtr(0); + + // p7zip uses the trick to store posix attributes in high 16 bits + if (ui.Attrib & 0x8000) + { + unsigned st_mode = ui.Attrib >> 16; + // st_mode = 00111; + if ((st_mode & 00111) && (ui.Size >= 2048)) + { + #ifndef _WIN32 + probablyIsSameIsa = true; + #endif + needReadFile = true; + } + } + + if (IsExeExt(ext)) + { + needReadFile = true; + #ifdef _WIN32 + probablyIsSameIsa = true; + needReadFile = ParseExe; + #endif + } + else if (StringsAreEqualNoCase_Ascii(ext, "wav")) + { + needReadFile = ParseWav; + } + /* + else if (!needReadFile && ParseUnixExt) + { + if (StringsAreEqualNoCase_Ascii(ext, "so") + || StringsAreEqualNoCase_Ascii(ext, "")) + + needReadFile = true; + } + */ + } + + if (needReadFile && Callback) + { + if (Buffer.Size() != kAnalysisBufSize) + { + Buffer.Alloc(kAnalysisBufSize); + } + { + CMyComPtr stream; + HRESULT result = Callback->GetStream2(index, &stream, NUpdateNotifyOp::kAnalyze); + if (result == S_OK && stream) + { + size_t size = kAnalysisBufSize; + result = ReadStream(stream, Buffer, &size); + stream.Release(); + // RINOK(Callback->SetOperationResult2(index, NUpdate::NOperationResult::kOK)); + if (result == S_OK) + { + Bool parseRes = ParseFile(Buffer, size, &filterModeTemp); + if (parseRes && filterModeTemp.Delta == 0) + { + filterModeTemp.SetDelta(); + if (filterModeTemp.Delta != 0 && filterModeTemp.Id != k_Delta) + { + if (ui.Size % filterModeTemp.Delta != 0) + { + parseRes = false; + } + } + } + if (!parseRes) + { + filterModeTemp.Id = 0; + filterModeTemp.Delta = 0; + } + } + } + } + } + else if ((needReadFile && !Callback) || probablyIsSameIsa) + { + #ifdef MY_CPU_X86_OR_AMD64 + if (probablyIsSameIsa) + filterModeTemp.Id = k_X86; + #endif + } + } + + filterMode = filterModeTemp; + return S_OK; +} + +static inline void GetMethodFull(UInt64 methodID, UInt32 numStreams, CMethodFull &m) +{ + m.Id = methodID; + m.NumStreams = numStreams; +} + +static HRESULT AddBondForFilter(CCompressionMethodMode &mode) +{ + for (unsigned c = 1; c < mode.Methods.Size(); c++) + { + if (!mode.IsThereBond_to_Coder(c)) + { + CBond2 bond; + bond.OutCoder = 0; + bond.OutStream = 0; + bond.InCoder = c; + mode.Bonds.Add(bond); + return S_OK; + } + } + return E_INVALIDARG; +} + +static HRESULT AddFilterBond(CCompressionMethodMode &mode) +{ + if (!mode.Bonds.IsEmpty()) + return AddBondForFilter(mode); + return S_OK; +} + +static HRESULT AddBcj2Methods(CCompressionMethodMode &mode) +{ + // mode.Methods[0] must be k_BCJ2 method ! + + CMethodFull m; + GetMethodFull(k_LZMA, 1, m); + + m.AddProp32(NCoderPropID::kDictionarySize, 1 << 20); + m.AddProp32(NCoderPropID::kNumFastBytes, 128); + m.AddProp32(NCoderPropID::kNumThreads, 1); + m.AddProp32(NCoderPropID::kLitPosBits, 2); + m.AddProp32(NCoderPropID::kLitContextBits, 0); + // m.AddProp_Ascii(NCoderPropID::kMatchFinder, "BT2"); + + unsigned methodIndex = mode.Methods.Size(); + + if (mode.Bonds.IsEmpty()) + { + for (unsigned i = 1; i + 1 < mode.Methods.Size(); i++) + { + CBond2 bond; + bond.OutCoder = i; + bond.OutStream = 0; + bond.InCoder = i + 1; + mode.Bonds.Add(bond); + } + } + + mode.Methods.Add(m); + mode.Methods.Add(m); + + RINOK(AddBondForFilter(mode)); + CBond2 bond; + bond.OutCoder = 0; + bond.InCoder = methodIndex; bond.OutStream = 1; mode.Bonds.Add(bond); + bond.InCoder = methodIndex + 1; bond.OutStream = 2; mode.Bonds.Add(bond); + return S_OK; +} + +static HRESULT MakeExeMethod(CCompressionMethodMode &mode, + const CFilterMode &filterMode, /* bool addFilter, */ bool bcj2Filter) +{ + if (mode.Filter_was_Inserted) + { + const CMethodFull &m = mode.Methods[0]; + CMethodId id = m.Id; + if (id == k_BCJ2) + return AddBcj2Methods(mode); + if (!m.IsSimpleCoder()) + return E_NOTIMPL; + // if (Bonds.IsEmpty()) we can create bonds later + return AddFilterBond(mode); + } + + if (filterMode.Id == 0) + return S_OK; + + CMethodFull &m = mode.Methods.InsertNew(0); + + { + FOR_VECTOR(k, mode.Bonds) + { + CBond2 &bond = mode.Bonds[k]; + bond.InCoder++; + bond.OutCoder++; + } + } + + HRESULT res; + + if (bcj2Filter && Is86Filter(filterMode.Id)) + { + GetMethodFull(k_BCJ2, 4, m); + res = AddBcj2Methods(mode); + } + else + { + GetMethodFull(filterMode.Id, 1, m); + if (filterMode.Id == k_Delta) + m.AddProp32(NCoderPropID::kDefaultProp, filterMode.Delta); + res = AddFilterBond(mode); + + int alignBits = -1; + if (filterMode.Id == k_Delta || filterMode.Delta != 0) + { + if (filterMode.Delta == 1) alignBits = 0; + else if (filterMode.Delta == 2) alignBits = 1; + else if (filterMode.Delta == 4) alignBits = 2; + else if (filterMode.Delta == 8) alignBits = 3; + else if (filterMode.Delta == 16) alignBits = 4; + } + else + { + // alignBits = GetAlignForFilterMethod(filterMode.Id); + } + + if (res == S_OK && alignBits >= 0) + { + unsigned nextCoder = 1; + if (!mode.Bonds.IsEmpty()) + { + nextCoder = mode.Bonds.Back().InCoder; + } + if (nextCoder < mode.Methods.Size()) + { + CMethodFull &nextMethod = mode.Methods[nextCoder]; + if (nextMethod.Id == k_LZMA || nextMethod.Id == k_LZMA2) + { + if (!nextMethod.Are_Lzma_Model_Props_Defined()) + { + if (alignBits != 0) + { + if (alignBits > 2 || filterMode.Id == k_Delta) + nextMethod.AddProp32(NCoderPropID::kPosStateBits, alignBits); + unsigned lc = 0; + if (alignBits < 3) + lc = 3 - alignBits; + nextMethod.AddProp32(NCoderPropID::kLitContextBits, lc); + nextMethod.AddProp32(NCoderPropID::kLitPosBits, alignBits); + } + } + } + } + } + } + + return res; +} + + +static void FromUpdateItemToFileItem(const CUpdateItem &ui, + CFileItem &file, CFileItem2 &file2) +{ + if (ui.AttribDefined) + file.SetAttrib(ui.Attrib); + + file2.CTime = ui.CTime; file2.CTimeDefined = ui.CTimeDefined; + file2.ATime = ui.ATime; file2.ATimeDefined = ui.ATimeDefined; + file2.MTime = ui.MTime; file2.MTimeDefined = ui.MTimeDefined; + file2.IsAnti = ui.IsAnti; + // file2.IsAux = false; + file2.StartPosDefined = false; + + file.Size = ui.Size; + file.IsDir = ui.IsDir; + file.HasStream = ui.HasStream(); + // file.IsAltStream = ui.IsAltStream; +} + +class CRepackInStreamWithSizes: + public ISequentialInStream, + public ICompressGetSubStreamSize, + public CMyUnknownImp +{ + CMyComPtr _stream; + // UInt64 _size; + const CBoolVector *_extractStatuses; + UInt32 _startIndex; +public: + const CDbEx *_db; + + void Init(ISequentialInStream *stream, UInt32 startIndex, const CBoolVector *extractStatuses) + { + _startIndex = startIndex; + _extractStatuses = extractStatuses; + // _size = 0; + _stream = stream; + } + // UInt64 GetSize() const { return _size; } + + MY_UNKNOWN_IMP2(ISequentialInStream, ICompressGetSubStreamSize) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); +}; + +STDMETHODIMP CRepackInStreamWithSizes::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + return _stream->Read(data, size, processedSize); + /* + UInt32 realProcessedSize; + HRESULT result = _stream->Read(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize) + *processedSize = realProcessedSize; + return result; + */ +} + +STDMETHODIMP CRepackInStreamWithSizes::GetSubStreamSize(UInt64 subStream, UInt64 *value) +{ + *value = 0; + if (subStream >= _extractStatuses->Size()) + return S_FALSE; // E_FAIL; + unsigned index = (unsigned)subStream; + if ((*_extractStatuses)[index]) + { + const CFileItem &fi = _db->Files[_startIndex + index]; + if (fi.HasStream) + *value = fi.Size; + } + return S_OK; +} + + +class CRepackStreamBase +{ +protected: + bool _needWrite; + bool _fileIsOpen; + bool _calcCrc; + UInt32 _crc; + UInt64 _rem; + + const CBoolVector *_extractStatuses; + UInt32 _startIndex; + unsigned _currentIndex; + + HRESULT OpenFile(); + HRESULT CloseFile(); + HRESULT ProcessEmptyFiles(); + +public: + const CDbEx *_db; + CMyComPtr _opCallback; + CMyComPtr _extractCallback; + + HRESULT Init(UInt32 startIndex, const CBoolVector *extractStatuses); + HRESULT CheckFinishedState() const { return (_currentIndex == _extractStatuses->Size()) ? S_OK: E_FAIL; } +}; + +HRESULT CRepackStreamBase::Init(UInt32 startIndex, const CBoolVector *extractStatuses) +{ + _startIndex = startIndex; + _extractStatuses = extractStatuses; + + _currentIndex = 0; + _fileIsOpen = false; + + return ProcessEmptyFiles(); +} + +HRESULT CRepackStreamBase::OpenFile() +{ + UInt32 arcIndex = _startIndex + _currentIndex; + const CFileItem &fi = _db->Files[arcIndex]; + + _needWrite = (*_extractStatuses)[_currentIndex]; + if (_opCallback) + { + RINOK(_opCallback->ReportOperation( + NEventIndexType::kInArcIndex, arcIndex, + _needWrite ? + NUpdateNotifyOp::kRepack : + NUpdateNotifyOp::kSkip)); + } + + _crc = CRC_INIT_VAL; + _calcCrc = (fi.CrcDefined && !fi.IsDir); + + _fileIsOpen = true; + _rem = fi.Size; + return S_OK; +} + +const HRESULT k_My_HRESULT_CRC_ERROR = 0x20000002; + +HRESULT CRepackStreamBase::CloseFile() +{ + UInt32 arcIndex = _startIndex + _currentIndex; + const CFileItem &fi = _db->Files[arcIndex]; + _fileIsOpen = false; + _currentIndex++; + if (!_calcCrc || fi.Crc == CRC_GET_DIGEST(_crc)) + return S_OK; + + if (_extractCallback) + { + RINOK(_extractCallback->ReportExtractResult( + NEventIndexType::kInArcIndex, arcIndex, + NExtract::NOperationResult::kCRCError)); + } + // return S_FALSE; + return k_My_HRESULT_CRC_ERROR; +} + +HRESULT CRepackStreamBase::ProcessEmptyFiles() +{ + while (_currentIndex < _extractStatuses->Size() && _db->Files[_startIndex + _currentIndex].Size == 0) + { + RINOK(OpenFile()); + RINOK(CloseFile()); + } + return S_OK; +} + + + +#ifndef _7ZIP_ST + +class CFolderOutStream2: + public CRepackStreamBase, + public ISequentialOutStream, + public CMyUnknownImp +{ +public: + CMyComPtr _stream; + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CFolderOutStream2::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + while (size != 0) + { + if (_fileIsOpen) + { + UInt32 cur = (size < _rem ? size : (UInt32)_rem); + HRESULT result = S_OK; + if (_needWrite) + result = _stream->Write(data, cur, &cur); + if (_calcCrc) + _crc = CrcUpdate(_crc, data, cur); + if (processedSize) + *processedSize += cur; + data = (const Byte *)data + cur; + size -= cur; + _rem -= cur; + if (_rem == 0) + { + RINOK(CloseFile()); + RINOK(ProcessEmptyFiles()); + } + RINOK(result); + if (cur == 0) + break; + continue; + } + + RINOK(ProcessEmptyFiles()); + if (_currentIndex == _extractStatuses->Size()) + { + // we don't support write cut here + return E_FAIL; + } + RINOK(OpenFile()); + } + + return S_OK; +} + +#endif + + + +static const UInt32 kTempBufSize = 1 << 16; + +class CFolderInStream2: + public CRepackStreamBase, + public ISequentialInStream, + public CMyUnknownImp +{ + Byte *_buf; +public: + CMyComPtr _inStream; + HRESULT Result; + + MY_UNKNOWN_IMP + + CFolderInStream2(): + Result(S_OK) + { + _buf = new Byte[kTempBufSize]; + } + + ~CFolderInStream2() + { + delete []_buf; + } + + void Init() { Result = S_OK; } + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +STDMETHODIMP CFolderInStream2::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + while (size != 0) + { + if (_fileIsOpen) + { + UInt32 cur = (size < _rem ? size : (UInt32)_rem); + + void *buf; + if (_needWrite) + buf = data; + else + { + buf = _buf; + if (cur > kTempBufSize) + cur = kTempBufSize; + } + + HRESULT result = _inStream->Read(buf, cur, &cur); + _crc = CrcUpdate(_crc, buf, cur); + _rem -= cur; + + if (_needWrite) + { + data = (Byte *)data + cur; + size -= cur; + if (processedSize) + *processedSize += cur; + } + + if (result != S_OK) + Result = result; + + if (_rem == 0) + { + RINOK(CloseFile()); + RINOK(ProcessEmptyFiles()); + } + + RINOK(result); + + if (cur == 0) + return E_FAIL; + + continue; + } + + RINOK(ProcessEmptyFiles()); + if (_currentIndex == _extractStatuses->Size()) + { + return S_OK; + } + RINOK(OpenFile()); + } + + return S_OK; +} + + +class CThreadDecoder + #ifndef _7ZIP_ST + : public CVirtThread + #endif +{ +public: + CDecoder Decoder; + + CThreadDecoder(bool multiThreadMixer): + Decoder(multiThreadMixer) + { + #ifndef _7ZIP_ST + if (multiThreadMixer) + { + MtMode = false; + NumThreads = 1; + FosSpec = new CFolderOutStream2; + Fos = FosSpec; + Result = E_FAIL; + } + #endif + // UnpackSize = 0; + // send_UnpackSize = false; + } + + #ifndef _7ZIP_ST + + HRESULT Result; + CMyComPtr InStream; + + CFolderOutStream2 *FosSpec; + CMyComPtr Fos; + + UInt64 StartPos; + const CFolders *Folders; + int FolderIndex; + + // bool send_UnpackSize; + // UInt64 UnpackSize; + + #ifndef _NO_CRYPTO + CMyComPtr getTextPassword; + #endif + + DECL_EXTERNAL_CODECS_LOC_VARS2; + + #ifndef _7ZIP_ST + bool MtMode; + UInt32 NumThreads; + #endif + + + ~CThreadDecoder() { CVirtThread::WaitThreadFinish(); } + virtual void Execute(); + + #endif +}; + +#ifndef _7ZIP_ST + +void CThreadDecoder::Execute() +{ + try + { + #ifndef _NO_CRYPTO + bool isEncrypted = false; + bool passwordIsDefined = false; + UString password; + #endif + + Result = Decoder.Decode( + EXTERNAL_CODECS_LOC_VARS + InStream, + StartPos, + *Folders, FolderIndex, + + // send_UnpackSize ? &UnpackSize : NULL, + NULL, // unpackSize : FULL unpack + + Fos, + NULL, // compressProgress + NULL // *inStreamMainRes + + _7Z_DECODER_CRYPRO_VARS + #ifndef _7ZIP_ST + , MtMode, NumThreads + #endif + ); + } + catch(...) + { + Result = E_FAIL; + } + + /* + if (Result == S_OK) + Result = FosSpec->CheckFinishedState(); + */ + FosSpec->_stream.Release(); +} + +#endif + +#ifndef _NO_CRYPTO + +class CCryptoGetTextPassword: + public ICryptoGetTextPassword, + public CMyUnknownImp +{ +public: + UString Password; + + MY_UNKNOWN_IMP + STDMETHOD(CryptoGetTextPassword)(BSTR *password); +}; + +STDMETHODIMP CCryptoGetTextPassword::CryptoGetTextPassword(BSTR *password) +{ + return StringToBstr(Password, password); +} + +#endif + + +static void GetFile(const CDatabase &inDb, unsigned index, CFileItem &file, CFileItem2 &file2) +{ + file = inDb.Files[index]; + file2.CTimeDefined = inDb.CTime.GetItem(index, file2.CTime); + file2.ATimeDefined = inDb.ATime.GetItem(index, file2.ATime); + file2.MTimeDefined = inDb.MTime.GetItem(index, file2.MTime); + file2.StartPosDefined = inDb.StartPos.GetItem(index, file2.StartPos); + file2.IsAnti = inDb.IsItemAnti(index); + // file2.IsAux = inDb.IsItemAux(index); +} + +HRESULT Update( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + const CDbEx *db, + const CObjectVector &updateItems, + // const CObjectVector &treeFolders, + // const CUniqBlocks &secureBlocks, + COutArchive &archive, + CArchiveDatabaseOut &newDatabase, + ISequentialOutStream *seqOutStream, + IArchiveUpdateCallback *updateCallback, + const CUpdateOptions &options + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getDecoderPassword + #endif + ) +{ + UInt64 numSolidFiles = options.NumSolidFiles; + if (numSolidFiles == 0) + numSolidFiles = 1; + + CMyComPtr opCallback; + updateCallback->QueryInterface(IID_IArchiveUpdateCallbackFile, (void **)&opCallback); + + CMyComPtr extractCallback; + updateCallback->QueryInterface(IID_IArchiveExtractCallbackMessage, (void **)&extractCallback); + + // size_t totalSecureDataSize = (size_t)secureBlocks.GetTotalSizeInBytes(); + + /* + CMyComPtr outStream; + RINOK(seqOutStream->QueryInterface(IID_IOutStream, (void **)&outStream)); + if (!outStream) + return E_NOTIMPL; + */ + + UInt64 startBlockSize = db ? db->ArcInfo.StartPosition: 0; + if (startBlockSize > 0 && !options.RemoveSfxBlock) + { + RINOK(WriteRange(inStream, seqOutStream, 0, startBlockSize, NULL)); + } + + CIntArr fileIndexToUpdateIndexMap; + UInt64 complexity = 0; + UInt64 inSizeForReduce2 = 0; + bool needEncryptedRepack = false; + + CRecordVector filters; + CObjectVector groups; + bool thereAreRepacks = false; + + bool useFilters = options.UseFilters; + if (useFilters) + { + const CCompressionMethodMode &method = *options.Method; + + FOR_VECTOR (i, method.Methods) + if (IsFilterMethod(method.Methods[i].Id)) + { + useFilters = false; + break; + } + } + + if (db) + { + fileIndexToUpdateIndexMap.Alloc(db->Files.Size()); + unsigned i; + + for (i = 0; i < db->Files.Size(); i++) + fileIndexToUpdateIndexMap[i] = -1; + + for (i = 0; i < updateItems.Size(); i++) + { + int index = updateItems[i].IndexInArchive; + if (index != -1) + fileIndexToUpdateIndexMap[(unsigned)index] = i; + } + + for (i = 0; i < db->NumFolders; i++) + { + CNum indexInFolder = 0; + CNum numCopyItems = 0; + CNum numUnpackStreams = db->NumUnpackStreamsVector[i]; + UInt64 repackSize = 0; + + for (CNum fi = db->FolderStartFileIndex[i]; indexInFolder < numUnpackStreams; fi++) + { + const CFileItem &file = db->Files[fi]; + if (file.HasStream) + { + indexInFolder++; + int updateIndex = fileIndexToUpdateIndexMap[fi]; + if (updateIndex >= 0 && !updateItems[updateIndex].NewData) + { + numCopyItems++; + repackSize += file.Size; + } + } + } + + if (numCopyItems == 0) + continue; + + CFolderRepack rep; + rep.FolderIndex = i; + rep.NumCopyFiles = numCopyItems; + CFolderEx f; + db->ParseFolderEx(i, f); + + const bool isEncrypted = f.IsEncrypted(); + const bool needCopy = (numCopyItems == numUnpackStreams); + const bool extractFilter = (useFilters || needCopy); + + unsigned groupIndex = Get_FilterGroup_for_Folder(filters, f, extractFilter); + + while (groupIndex >= groups.Size()) + groups.AddNew(); + + groups[groupIndex].folderRefs.Add(rep); + + if (needCopy) + complexity += db->GetFolderFullPackSize(i); + else + { + thereAreRepacks = true; + complexity += repackSize; + if (inSizeForReduce2 < repackSize) + inSizeForReduce2 = repackSize; + if (isEncrypted) + needEncryptedRepack = true; + } + } + } + + UInt64 inSizeForReduce = 0; + { + FOR_VECTOR (i, updateItems) + { + const CUpdateItem &ui = updateItems[i]; + if (ui.NewData) + { + complexity += ui.Size; + if (numSolidFiles != 1) + inSizeForReduce += ui.Size; + else if (inSizeForReduce < ui.Size) + inSizeForReduce = ui.Size; + } + } + } + + if (inSizeForReduce < inSizeForReduce2) + inSizeForReduce = inSizeForReduce2; + + RINOK(updateCallback->SetTotal(complexity)); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr progress = lps; + lps->Init(updateCallback, true); + + #ifndef _7ZIP_ST + + CStreamBinder sb; + if (options.MultiThreadMixer) + { + RINOK(sb.CreateEvents()); + } + + #endif + + CThreadDecoder threadDecoder(options.MultiThreadMixer); + + #ifndef _7ZIP_ST + if (options.MultiThreadMixer && thereAreRepacks) + { + #ifdef EXTERNAL_CODECS + threadDecoder.__externalCodecs = __externalCodecs; + #endif + RINOK(threadDecoder.Create()); + } + #endif + + { + CAnalysis analysis; + if (options.AnalysisLevel == 0) + { + analysis.ParseWav = false; + analysis.ParseExe = false; + analysis.ParseAll = false; + } + else + { + analysis.Callback = opCallback; + if (options.AnalysisLevel > 0) + { + analysis.ParseWav = true; + if (options.AnalysisLevel >= 7) + { + analysis.ParseExe = true; + if (options.AnalysisLevel >= 9) + analysis.ParseAll = true; + } + } + } + + // ---------- Split files to groups ---------- + + const CCompressionMethodMode &method = *options.Method; + + FOR_VECTOR (i, updateItems) + { + const CUpdateItem &ui = updateItems[i]; + if (!ui.NewData || !ui.HasStream()) + continue; + + CFilterMode2 fm; + if (useFilters) + { + RINOK(analysis.GetFilterGroup(i, ui, fm)); + } + fm.Encrypted = method.PasswordIsDefined; + + unsigned groupIndex = GetGroup(filters, fm); + while (groupIndex >= groups.Size()) + groups.AddNew(); + groups[groupIndex].Indices.Add(i); + } + } + + + #ifndef _NO_CRYPTO + + CCryptoGetTextPassword *getPasswordSpec = NULL; + CMyComPtr getTextPassword; + if (needEncryptedRepack) + { + getPasswordSpec = new CCryptoGetTextPassword; + getTextPassword = getPasswordSpec; + + #ifndef _7ZIP_ST + threadDecoder.getTextPassword = getPasswordSpec; + #endif + + if (options.Method->PasswordIsDefined) + getPasswordSpec->Password = options.Method->Password; + else + { + if (!getDecoderPassword) + return E_NOTIMPL; + CMyComBSTR password; + RINOK(getDecoderPassword->CryptoGetTextPassword(&password)); + if (password) + getPasswordSpec->Password = password; + } + } + + #endif + + + // ---------- Compress ---------- + + RINOK(archive.Create(seqOutStream, false)); + RINOK(archive.SkipPrefixArchiveHeader()); + + /* + CIntVector treeFolderToArcIndex; + treeFolderToArcIndex.Reserve(treeFolders.Size()); + for (i = 0; i < treeFolders.Size(); i++) + treeFolderToArcIndex.Add(-1); + // ---------- Write Tree (only AUX dirs) ---------- + for (i = 1; i < treeFolders.Size(); i++) + { + const CTreeFolder &treeFolder = treeFolders[i]; + CFileItem file; + CFileItem2 file2; + file2.Init(); + int secureID = 0; + if (treeFolder.UpdateItemIndex < 0) + { + // we can store virtual dir item wuthout attrib, but we want all items have attrib. + file.SetAttrib(FILE_ATTRIBUTE_DIRECTORY); + file2.IsAux = true; + } + else + { + const CUpdateItem &ui = updateItems[treeFolder.UpdateItemIndex]; + // if item is not dir, then it's parent for alt streams. + // we will write such items later + if (!ui.IsDir) + continue; + secureID = ui.SecureIndex; + if (ui.NewProps) + FromUpdateItemToFileItem(ui, file, file2); + else + GetFile(*db, ui.IndexInArchive, file, file2); + } + file.Size = 0; + file.HasStream = false; + file.IsDir = true; + file.Parent = treeFolder.Parent; + + treeFolderToArcIndex[i] = newDatabase.Files.Size(); + newDatabase.AddFile(file, file2, treeFolder.Name); + + if (totalSecureDataSize != 0) + newDatabase.SecureIDs.Add(secureID); + } + */ + + { + /* ---------- Write non-AUX dirs and Empty files ---------- */ + CUIntVector emptyRefs; + + unsigned i; + + for (i = 0; i < updateItems.Size(); i++) + { + const CUpdateItem &ui = updateItems[i]; + if (ui.NewData) + { + if (ui.HasStream()) + continue; + } + else if (ui.IndexInArchive != -1 && db->Files[ui.IndexInArchive].HasStream) + continue; + /* + if (ui.TreeFolderIndex >= 0) + continue; + */ + emptyRefs.Add(i); + } + + emptyRefs.Sort(CompareEmptyItems, (void *)&updateItems); + + for (i = 0; i < emptyRefs.Size(); i++) + { + const CUpdateItem &ui = updateItems[emptyRefs[i]]; + CFileItem file; + CFileItem2 file2; + UString name; + if (ui.NewProps) + { + FromUpdateItemToFileItem(ui, file, file2); + name = ui.Name; + } + else + { + GetFile(*db, ui.IndexInArchive, file, file2); + db->GetPath(ui.IndexInArchive, name); + } + + /* + if (totalSecureDataSize != 0) + newDatabase.SecureIDs.Add(ui.SecureIndex); + file.Parent = ui.ParentFolderIndex; + */ + newDatabase.AddFile(file, file2, name); + } + } + + lps->ProgressOffset = 0; + + { + // ---------- Sort Filters ---------- + + FOR_VECTOR (i, filters) + { + filters[i].GroupIndex = i; + } + filters.Sort2(); + } + + for (unsigned groupIndex = 0; groupIndex < filters.Size(); groupIndex++) + { + const CFilterMode2 &filterMode = filters[groupIndex]; + + CCompressionMethodMode method = *options.Method; + { + HRESULT res = MakeExeMethod(method, filterMode, + #ifdef _7ZIP_ST + false + #else + options.MaxFilter && options.MultiThreadMixer + #endif + ); + + RINOK(res); + } + + if (filterMode.Encrypted) + { + if (!method.PasswordIsDefined) + { + #ifndef _NO_CRYPTO + if (getPasswordSpec) + method.Password = getPasswordSpec->Password; + #endif + method.PasswordIsDefined = true; + } + } + else + { + method.PasswordIsDefined = false; + method.Password.Empty(); + } + + CEncoder encoder(method); + + // ---------- Repack and copy old solid blocks ---------- + + const CSolidGroup &group = groups[filterMode.GroupIndex]; + + FOR_VECTOR(folderRefIndex, group.folderRefs) + { + const CFolderRepack &rep = group.folderRefs[folderRefIndex]; + + unsigned folderIndex = rep.FolderIndex; + + CNum numUnpackStreams = db->NumUnpackStreamsVector[folderIndex]; + + if (rep.NumCopyFiles == numUnpackStreams) + { + if (opCallback) + { + RINOK(opCallback->ReportOperation( + NEventIndexType::kBlockIndex, (UInt32)folderIndex, + NUpdateNotifyOp::kReplicate)); + + // ---------- Copy old solid block ---------- + { + CNum indexInFolder = 0; + for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++) + { + if (db->Files[fi].HasStream) + { + indexInFolder++; + RINOK(opCallback->ReportOperation( + NEventIndexType::kInArcIndex, (UInt32)fi, + NUpdateNotifyOp::kReplicate)); + } + } + } + } + + UInt64 packSize = db->GetFolderFullPackSize(folderIndex); + RINOK(WriteRange(inStream, archive.SeqStream, + db->GetFolderStreamPos(folderIndex, 0), packSize, progress)); + lps->ProgressOffset += packSize; + + CFolder &folder = newDatabase.Folders.AddNew(); + db->ParseFolderInfo(folderIndex, folder); + CNum startIndex = db->FoStartPackStreamIndex[folderIndex]; + FOR_VECTOR(j, folder.PackStreams) + { + newDatabase.PackSizes.Add(db->GetStreamPackSize(startIndex + j)); + // newDatabase.PackCRCsDefined.Add(db.PackCRCsDefined[startIndex + j]); + // newDatabase.PackCRCs.Add(db.PackCRCs[startIndex + j]); + } + + size_t indexStart = db->FoToCoderUnpackSizes[folderIndex]; + size_t indexEnd = db->FoToCoderUnpackSizes[folderIndex + 1]; + for (; indexStart < indexEnd; indexStart++) + newDatabase.CoderUnpackSizes.Add(db->CoderUnpackSizes[indexStart]); + } + else + { + // ---------- Repack old solid block ---------- + + CBoolVector extractStatuses; + + CNum indexInFolder = 0; + + if (opCallback) + { + RINOK(opCallback->ReportOperation( + NEventIndexType::kBlockIndex, (UInt32)folderIndex, + NUpdateNotifyOp::kRepack)) + } + + /* We could reduce data size of decoded folder, if we don't need to repack + last files in folder. But the gain in speed is small in most cases. + So we unpack full folder. */ + + UInt64 sizeToEncode = 0; + + /* + UInt64 importantUnpackSize = 0; + unsigned numImportantFiles = 0; + UInt64 decodeSize = 0; + */ + + for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++) + { + bool needExtract = false; + const CFileItem &file = db->Files[fi]; + + if (file.HasStream) + { + indexInFolder++; + int updateIndex = fileIndexToUpdateIndexMap[fi]; + if (updateIndex >= 0 && !updateItems[updateIndex].NewData) + needExtract = true; + // decodeSize += file.Size; + } + + extractStatuses.Add(needExtract); + if (needExtract) + { + sizeToEncode += file.Size; + /* + numImportantFiles = extractStatuses.Size(); + importantUnpackSize = decodeSize; + */ + } + } + + // extractStatuses.DeleteFrom(numImportantFiles); + + unsigned startPackIndex = newDatabase.PackSizes.Size(); + UInt64 curUnpackSize; + { + + CMyComPtr sbInStream; + CRepackStreamBase *repackBase; + CFolderInStream2 *FosSpec2 = NULL; + + CRepackInStreamWithSizes *inStreamSizeCountSpec = new CRepackInStreamWithSizes; + CMyComPtr inStreamSizeCount = inStreamSizeCountSpec; + { + #ifndef _7ZIP_ST + if (options.MultiThreadMixer) + { + repackBase = threadDecoder.FosSpec; + CMyComPtr sbOutStream; + sb.CreateStreams(&sbInStream, &sbOutStream); + sb.ReInit(); + + threadDecoder.FosSpec->_stream = sbOutStream; + + threadDecoder.InStream = inStream; + threadDecoder.StartPos = db->ArcInfo.DataStartPosition; // db->GetFolderStreamPos(folderIndex, 0); + threadDecoder.Folders = (const CFolders *)db; + threadDecoder.FolderIndex = folderIndex; + + // threadDecoder.UnpackSize = importantUnpackSize; + // threadDecoder.send_UnpackSize = true; + } + else + #endif + { + FosSpec2 = new CFolderInStream2; + FosSpec2->Init(); + sbInStream = FosSpec2; + repackBase = FosSpec2; + + #ifndef _NO_CRYPTO + bool isEncrypted = false; + bool passwordIsDefined = false; + UString password; + #endif + + CMyComPtr decodedStream; + HRESULT res = threadDecoder.Decoder.Decode( + EXTERNAL_CODECS_LOC_VARS + inStream, + db->ArcInfo.DataStartPosition, // db->GetFolderStreamPos(folderIndex, 0);, + *db, folderIndex, + // &importantUnpackSize, // *unpackSize + NULL, // *unpackSize : FULL unpack + + NULL, // *outStream + NULL, // *compressProgress + &decodedStream + + _7Z_DECODER_CRYPRO_VARS + #ifndef _7ZIP_ST + , false // mtMode + , 1 // numThreads + #endif + ); + + RINOK(res); + if (!decodedStream) + return E_FAIL; + + FosSpec2->_inStream = decodedStream; + } + + repackBase->_db = db; + repackBase->_opCallback = opCallback; + repackBase->_extractCallback = extractCallback; + + UInt32 startIndex = db->FolderStartFileIndex[folderIndex]; + RINOK(repackBase->Init(startIndex, &extractStatuses)); + + inStreamSizeCountSpec->_db = db; + inStreamSizeCountSpec->Init(sbInStream, startIndex, &extractStatuses); + + #ifndef _7ZIP_ST + if (options.MultiThreadMixer) + { + threadDecoder.Start(); + } + #endif + } + + + HRESULT encodeRes = encoder.Encode( + EXTERNAL_CODECS_LOC_VARS + inStreamSizeCount, + // NULL, + &inSizeForReduce, + newDatabase.Folders.AddNew(), newDatabase.CoderUnpackSizes, curUnpackSize, + archive.SeqStream, newDatabase.PackSizes, progress); + + if (encodeRes == k_My_HRESULT_CRC_ERROR) + return E_FAIL; + + #ifndef _7ZIP_ST + if (options.MultiThreadMixer) + { + // 16.00: hang was fixed : for case if decoding was not finished. + // We close CBinderInStream and it calls CStreamBinder::CloseRead() + inStreamSizeCount.Release(); + sbInStream.Release(); + + threadDecoder.WaitExecuteFinish(); + + HRESULT decodeRes = threadDecoder.Result; + // if (res == k_My_HRESULT_CRC_ERROR) + if (decodeRes == S_FALSE) + { + if (extractCallback) + { + RINOK(extractCallback->ReportExtractResult( + NEventIndexType::kInArcIndex, db->FolderStartFileIndex[folderIndex], + // NEventIndexType::kBlockIndex, (UInt32)folderIndex, + NExtract::NOperationResult::kDataError)); + } + return E_FAIL; + } + RINOK(decodeRes); + if (encodeRes == S_OK) + if (sb.ProcessedSize != sizeToEncode) + encodeRes = E_FAIL; + } + else + #endif + { + if (FosSpec2->Result == S_FALSE) + { + if (extractCallback) + { + RINOK(extractCallback->ReportExtractResult( + NEventIndexType::kBlockIndex, (UInt32)folderIndex, + NExtract::NOperationResult::kDataError)); + } + return E_FAIL; + } + RINOK(FosSpec2->Result); + } + + RINOK(encodeRes); + RINOK(repackBase->CheckFinishedState()); + + if (curUnpackSize != sizeToEncode) + return E_FAIL; + } + + for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++) + lps->OutSize += newDatabase.PackSizes[startPackIndex]; + lps->InSize += curUnpackSize; + } + + newDatabase.NumUnpackStreamsVector.Add(rep.NumCopyFiles); + + CNum indexInFolder = 0; + for (CNum fi = db->FolderStartFileIndex[folderIndex]; indexInFolder < numUnpackStreams; fi++) + { + CFileItem file; + CFileItem2 file2; + GetFile(*db, fi, file, file2); + UString name; + db->GetPath(fi, name); + if (file.HasStream) + { + indexInFolder++; + int updateIndex = fileIndexToUpdateIndexMap[fi]; + if (updateIndex >= 0) + { + const CUpdateItem &ui = updateItems[updateIndex]; + if (ui.NewData) + continue; + if (ui.NewProps) + { + CFileItem uf; + FromUpdateItemToFileItem(ui, uf, file2); + uf.Size = file.Size; + uf.Crc = file.Crc; + uf.CrcDefined = file.CrcDefined; + uf.HasStream = file.HasStream; + file = uf; + name = ui.Name; + } + /* + file.Parent = ui.ParentFolderIndex; + if (ui.TreeFolderIndex >= 0) + treeFolderToArcIndex[ui.TreeFolderIndex] = newDatabase.Files.Size(); + if (totalSecureDataSize != 0) + newDatabase.SecureIDs.Add(ui.SecureIndex); + */ + newDatabase.AddFile(file, file2, name); + } + } + } + } + + + // ---------- Compress files to new solid blocks ---------- + + unsigned numFiles = group.Indices.Size(); + if (numFiles == 0) + continue; + CRecordVector refItems; + refItems.ClearAndSetSize(numFiles); + bool sortByType = (options.UseTypeSorting && numSolidFiles > 1); + + unsigned i; + + for (i = 0; i < numFiles; i++) + refItems[i] = CRefItem(group.Indices[i], updateItems[group.Indices[i]], sortByType); + + CSortParam sortParam; + // sortParam.TreeFolders = &treeFolders; + sortParam.SortByType = sortByType; + refItems.Sort(CompareUpdateItems, (void *)&sortParam); + + CObjArray indices(numFiles); + + for (i = 0; i < numFiles; i++) + { + UInt32 index = refItems[i].Index; + indices[i] = index; + /* + const CUpdateItem &ui = updateItems[index]; + CFileItem file; + if (ui.NewProps) + FromUpdateItemToFileItem(ui, file); + else + file = db.Files[ui.IndexInArchive]; + if (file.IsAnti || file.IsDir) + return E_FAIL; + newDatabase.Files.Add(file); + */ + } + + for (i = 0; i < numFiles;) + { + UInt64 totalSize = 0; + unsigned numSubFiles; + + const wchar_t *prevExtension = NULL; + + for (numSubFiles = 0; i + numSubFiles < numFiles && numSubFiles < numSolidFiles; numSubFiles++) + { + const CUpdateItem &ui = updateItems[indices[i + numSubFiles]]; + totalSize += ui.Size; + if (totalSize > options.NumSolidBytes) + break; + if (options.SolidExtension) + { + int slashPos = ui.Name.ReverseFind_PathSepar(); + int dotPos = ui.Name.ReverseFind_Dot(); + const wchar_t *ext = ui.Name.Ptr(dotPos <= slashPos ? ui.Name.Len() : dotPos + 1); + if (numSubFiles == 0) + prevExtension = ext; + else if (!StringsAreEqualNoCase(ext, prevExtension)) + break; + } + } + + if (numSubFiles < 1) + numSubFiles = 1; + + RINOK(lps->SetCur()); + + CFolderInStream *inStreamSpec = new CFolderInStream; + CMyComPtr solidInStream(inStreamSpec); + inStreamSpec->Init(updateCallback, &indices[i], numSubFiles); + + unsigned startPackIndex = newDatabase.PackSizes.Size(); + UInt64 curFolderUnpackSize; + RINOK(encoder.Encode( + EXTERNAL_CODECS_LOC_VARS + solidInStream, + // NULL, + &inSizeForReduce, + newDatabase.Folders.AddNew(), newDatabase.CoderUnpackSizes, curFolderUnpackSize, + archive.SeqStream, newDatabase.PackSizes, progress)); + + if (!inStreamSpec->WasFinished()) + return E_FAIL; + + for (; startPackIndex < newDatabase.PackSizes.Size(); startPackIndex++) + lps->OutSize += newDatabase.PackSizes[startPackIndex]; + + lps->InSize += curFolderUnpackSize; + // for () + // newDatabase.PackCRCsDefined.Add(false); + // newDatabase.PackCRCs.Add(0); + + CNum numUnpackStreams = 0; + UInt64 skippedSize = 0; + + for (unsigned subIndex = 0; subIndex < numSubFiles; subIndex++) + { + const CUpdateItem &ui = updateItems[indices[i + subIndex]]; + CFileItem file; + CFileItem2 file2; + UString name; + if (ui.NewProps) + { + FromUpdateItemToFileItem(ui, file, file2); + name = ui.Name; + } + else + { + GetFile(*db, ui.IndexInArchive, file, file2); + db->GetPath(ui.IndexInArchive, name); + } + if (file2.IsAnti || file.IsDir) + return E_FAIL; + + /* + CFileItem &file = newDatabase.Files[ + startFileIndexInDatabase + i + subIndex]; + */ + if (!inStreamSpec->Processed[subIndex]) + { + skippedSize += ui.Size; + continue; + // file.Name.AddAscii(".locked"); + } + + file.Crc = inStreamSpec->CRCs[subIndex]; + file.Size = inStreamSpec->Sizes[subIndex]; + + // if (file.Size >= 0) // test purposes + if (file.Size != 0) + { + file.CrcDefined = true; + file.HasStream = true; + numUnpackStreams++; + } + else + { + file.CrcDefined = false; + file.HasStream = false; + } + + /* + file.Parent = ui.ParentFolderIndex; + if (ui.TreeFolderIndex >= 0) + treeFolderToArcIndex[ui.TreeFolderIndex] = newDatabase.Files.Size(); + if (totalSecureDataSize != 0) + newDatabase.SecureIDs.Add(ui.SecureIndex); + */ + newDatabase.AddFile(file, file2, name); + } + + // numUnpackStreams = 0 is very bad case for locked files + // v3.13 doesn't understand it. + newDatabase.NumUnpackStreamsVector.Add(numUnpackStreams); + i += numSubFiles; + + if (skippedSize != 0 && complexity >= skippedSize) + { + complexity -= skippedSize; + RINOK(updateCallback->SetTotal(complexity)); + } + } + } + + RINOK(lps->SetCur()); + + /* + fileIndexToUpdateIndexMap.ClearAndFree(); + groups.ClearAndFree(); + */ + + /* + for (i = 0; i < newDatabase.Files.Size(); i++) + { + CFileItem &file = newDatabase.Files[i]; + file.Parent = treeFolderToArcIndex[file.Parent]; + } + + if (totalSecureDataSize != 0) + { + newDatabase.SecureBuf.SetCapacity(totalSecureDataSize); + size_t pos = 0; + newDatabase.SecureSizes.Reserve(secureBlocks.Sorted.Size()); + for (i = 0; i < secureBlocks.Sorted.Size(); i++) + { + const CByteBuffer &buf = secureBlocks.Bufs[secureBlocks.Sorted[i]]; + size_t size = buf.GetCapacity(); + if (size != 0) + memcpy(newDatabase.SecureBuf + pos, buf, size); + newDatabase.SecureSizes.Add((UInt32)size); + pos += size; + } + } + */ + newDatabase.ReserveDown(); + + if (opCallback) + RINOK(opCallback->ReportOperation(NEventIndexType::kNoIndex, (UInt32)(Int32)-1, NUpdateNotifyOp::kHeader)); + + return S_OK; +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zUpdate.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zUpdate.h new file mode 100644 index 0000000000..06a0b05fb0 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/7zUpdate.h @@ -0,0 +1,139 @@ +// 7zUpdate.h + +#ifndef __7Z_UPDATE_H +#define __7Z_UPDATE_H + +#include "../IArchive.h" + +// #include "../../Common/UniqBlocks.h" + +#include "7zCompressionMode.h" +#include "7zIn.h" +#include "7zOut.h" + +namespace NArchive { +namespace N7z { + +/* +struct CTreeFolder +{ + UString Name; + int Parent; + CIntVector SubFolders; + int UpdateItemIndex; + int SortIndex; + int SortIndexEnd; + + CTreeFolder(): UpdateItemIndex(-1) {} +}; +*/ + +struct CUpdateItem +{ + int IndexInArchive; + int IndexInClient; + + UInt64 CTime; + UInt64 ATime; + UInt64 MTime; + + UInt64 Size; + UString Name; + /* + bool IsAltStream; + int ParentFolderIndex; + int TreeFolderIndex; + */ + + // that code is not used in 9.26 + // int ParentSortIndex; + // int ParentSortIndexEnd; + + UInt32 Attrib; + + bool NewData; + bool NewProps; + + bool IsAnti; + bool IsDir; + + bool AttribDefined; + bool CTimeDefined; + bool ATimeDefined; + bool MTimeDefined; + + // int SecureIndex; // 0 means (no_security) + + bool HasStream() const { return !IsDir && !IsAnti && Size != 0; } + // bool HasStream() const { return !IsDir && !IsAnti /* && Size != 0 */; } // for test purposes + + CUpdateItem(): + // ParentSortIndex(-1), + // IsAltStream(false), + IsAnti(false), + IsDir(false), + AttribDefined(false), + CTimeDefined(false), + ATimeDefined(false), + MTimeDefined(false) + // SecureIndex(0) + {} + void SetDirStatusFromAttrib() { IsDir = ((Attrib & FILE_ATTRIBUTE_DIRECTORY) != 0); } + + // unsigned GetExtensionPos() const; + // UString GetExtension() const; +}; + +struct CUpdateOptions +{ + const CCompressionMethodMode *Method; + const CCompressionMethodMode *HeaderMethod; + bool UseFilters; // use additional filters for some files + bool MaxFilter; // use BCJ2 filter instead of BCJ + int AnalysisLevel; + + CHeaderOptions HeaderOptions; + + UInt64 NumSolidFiles; + UInt64 NumSolidBytes; + bool SolidExtension; + + bool UseTypeSorting; + + bool RemoveSfxBlock; + bool MultiThreadMixer; + + CUpdateOptions(): + Method(NULL), + HeaderMethod(NULL), + UseFilters(false), + MaxFilter(false), + AnalysisLevel(-1), + NumSolidFiles((UInt64)(Int64)(-1)), + NumSolidBytes((UInt64)(Int64)(-1)), + SolidExtension(false), + UseTypeSorting(true), + RemoveSfxBlock(false), + MultiThreadMixer(true) + {} +}; + +HRESULT Update( + DECL_EXTERNAL_CODECS_LOC_VARS + IInStream *inStream, + const CDbEx *db, + const CObjectVector &updateItems, + // const CObjectVector &treeFolders, // treeFolders[0] is root + // const CUniqBlocks &secureBlocks, + COutArchive &archive, + CArchiveDatabaseOut &newDatabase, + ISequentialOutStream *seqOutStream, + IArchiveUpdateCallback *updateCallback, + const CUpdateOptions &options + #ifndef _NO_CRYPTO + , ICryptoGetTextPassword *getDecoderPassword + #endif + ); +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/StdAfx.h new file mode 100644 index 0000000000..a68dc7e3ff --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/7z/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/Common.h" +#include "../../../../../src/LzmaAppleCommon.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/ArchiveExports.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/ArchiveExports.cpp new file mode 100644 index 0000000000..6de844edf2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/ArchiveExports.cpp @@ -0,0 +1,157 @@ +// ArchiveExports.cpp + +#include "StdAfx.h" + +#include "../../../C/7zVersion.h" + +#include "../../Common/ComTry.h" + +#include "../../Windows/PropVariant.h" + +#include "../Common/RegisterArc.h" + +#if defined(LZMASDKOBJC_OMIT_UNUSED_CODE) +static const uint8_t kNumArcsMax = 16; +static uint8_t g_NumArcs = 0; +static uint8_t g_DefaultArcIndex = 0; +#else +static const unsigned kNumArcsMax = 64; +static unsigned g_NumArcs = 0; +static unsigned g_DefaultArcIndex = 0; +#endif +static const CArcInfo *g_Arcs[kNumArcsMax]; + +void RegisterArc(const CArcInfo *arcInfo) throw() +{ + if (g_NumArcs < kNumArcsMax) + { + const char *p = arcInfo->Name; + if (p[0] == '7' && p[1] == 'z' && p[2] == 0) + g_DefaultArcIndex = g_NumArcs; + g_Arcs[g_NumArcs++] = arcInfo; + } +} + +DEFINE_GUID(CLSID_CArchiveHandler, + k_7zip_GUID_Data1, + k_7zip_GUID_Data2, + k_7zip_GUID_Data3_Common, + 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); + +#define CLS_ARC_ID_ITEM(cls) ((cls).Data4[5]) + +static inline HRESULT SetPropStrFromBin(const char *s, unsigned size, PROPVARIANT *value) +{ + if ((value->bstrVal = ::SysAllocStringByteLen(s, size)) != 0) + value->vt = VT_BSTR; + return S_OK; +} + +static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) +{ + return SetPropStrFromBin((const char *)&guid, sizeof(guid), value); +} + +int FindFormatCalssId(const GUID *clsid) +{ + GUID cls = *clsid; + CLS_ARC_ID_ITEM(cls) = 0; + if (cls != CLSID_CArchiveHandler) + return -1; + Byte id = CLS_ARC_ID_ITEM(*clsid); + for (unsigned i = 0; i < g_NumArcs; i++) + if (g_Arcs[i]->Id == id) + return (int)i; + return -1; +} + +STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject) +{ + COM_TRY_BEGIN + { + int needIn = (*iid == IID_IInArchive); + int needOut = (*iid == IID_IOutArchive); + if (!needIn && !needOut) + return E_NOINTERFACE; + int formatIndex = FindFormatCalssId(clsid); + if (formatIndex < 0) + return CLASS_E_CLASSNOTAVAILABLE; + + const CArcInfo &arc = *g_Arcs[formatIndex]; + if (needIn) + { + *outObject = arc.CreateInArchive(); + ((IInArchive *)*outObject)->AddRef(); + } + else + { + if (!arc.CreateOutArchive) + return CLASS_E_CLASSNOTAVAILABLE; + *outObject = arc.CreateOutArchive(); + ((IOutArchive *)*outObject)->AddRef(); + } + } + COM_TRY_END + return S_OK; +} + +STDAPI GetHandlerProperty2(UInt32 formatIndex, PROPID propID, PROPVARIANT *value) +{ + COM_TRY_BEGIN + NWindows::NCOM::PropVariant_Clear(value); + if (formatIndex >= g_NumArcs) + return E_INVALIDARG; + const CArcInfo &arc = *g_Arcs[formatIndex]; + NWindows::NCOM::CPropVariant prop; + switch (propID) + { + case NArchive::NHandlerPropID::kName: prop = arc.Name; break; + case NArchive::NHandlerPropID::kClassID: + { + GUID clsId = CLSID_CArchiveHandler; + CLS_ARC_ID_ITEM(clsId) = arc.Id; + return SetPropGUID(clsId, value); + } + case NArchive::NHandlerPropID::kExtension: if (arc.Ext) prop = arc.Ext; break; + case NArchive::NHandlerPropID::kAddExtension: if (arc.AddExt) prop = arc.AddExt; break; + case NArchive::NHandlerPropID::kUpdate: prop = (bool)(arc.CreateOutArchive != NULL); break; + case NArchive::NHandlerPropID::kKeepName: prop = ((arc.Flags & NArcInfoFlags::kKeepName) != 0); break; + case NArchive::NHandlerPropID::kAltStreams: prop = ((arc.Flags & NArcInfoFlags::kAltStreams) != 0); break; + case NArchive::NHandlerPropID::kNtSecure: prop = ((arc.Flags & NArcInfoFlags::kNtSecure) != 0); break; + case NArchive::NHandlerPropID::kFlags: prop = (UInt32)arc.Flags; break; + case NArchive::NHandlerPropID::kSignatureOffset: prop = (UInt32)arc.SignatureOffset; break; + // case NArchive::NHandlerPropID::kVersion: prop = (UInt32)MY_VER_MIX; break; + + case NArchive::NHandlerPropID::kSignature: + if (arc.SignatureSize != 0 && !arc.IsMultiSignature()) + return SetPropStrFromBin((const char *)arc.Signature, arc.SignatureSize, value); + break; + case NArchive::NHandlerPropID::kMultiSignature: + if (arc.SignatureSize != 0 && arc.IsMultiSignature()) + return SetPropStrFromBin((const char *)arc.Signature, arc.SignatureSize, value); + break; + } + prop.Detach(value); + return S_OK; + COM_TRY_END +} + +STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value) +{ + return GetHandlerProperty2(g_DefaultArcIndex, propID, value); +} + +STDAPI GetNumberOfFormats(UINT32 *numFormats) +{ + *numFormats = g_NumArcs; + return S_OK; +} + +STDAPI GetIsArc(UInt32 formatIndex, Func_IsArc *isArc) +{ + *isArc = NULL; + if (formatIndex >= g_NumArcs) + return E_INVALIDARG; + *isArc = g_Arcs[formatIndex]->IsArc; + return S_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp new file mode 100644 index 0000000000..aeb1d38123 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp @@ -0,0 +1,1044 @@ +// CoderMixer2.cpp + +#include "StdAfx.h" + +#include "CoderMixer2.h" + +#ifdef USE_MIXER_ST + +STDMETHODIMP CSequentialInStreamCalcSize::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessed = 0; + HRESULT result = S_OK; + if (_stream) + result = _stream->Read(data, size, &realProcessed); + _size += realProcessed; + if (size != 0 && realProcessed == 0) + _wasFinished = true; + if (processedSize) + *processedSize = realProcessed; + return result; +} + + +STDMETHODIMP COutStreamCalcSize::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + HRESULT result = S_OK; + if (_stream) + result = _stream->Write(data, size, &size); + _size += size; + if (processedSize) + *processedSize = size; + return result; +} + +STDMETHODIMP COutStreamCalcSize::OutStreamFinish() +{ + HRESULT result = S_OK; + if (_stream) + { + CMyComPtr outStreamFinish; + _stream.QueryInterface(IID_IOutStreamFinish, &outStreamFinish); + if (outStreamFinish) + result = outStreamFinish->OutStreamFinish(); + } + return result; +} + +#endif + + + + +namespace NCoderMixer2 { + +static void BoolVector_Fill_False(CBoolVector &v, unsigned size) +{ + v.ClearAndSetSize(size); + bool *p = &v[0]; + for (unsigned i = 0; i < size; i++) + p[i] = false; +} + +class CBondsChecks +{ + CBoolVector _coderUsed; + + bool Init(); + bool CheckCoder(unsigned coderIndex); +public: + const CBindInfo *BindInfo; + + bool Check(); +}; + +bool CBondsChecks::CheckCoder(unsigned coderIndex) +{ + const CCoderStreamsInfo &coder = BindInfo->Coders[coderIndex]; + + if (coderIndex >= _coderUsed.Size() || _coderUsed[coderIndex]) + return false; + _coderUsed[coderIndex] = true; + + UInt32 start = BindInfo->Coder_to_Stream[coderIndex]; + + for (unsigned i = 0; i < coder.NumStreams; i++) + { + UInt32 ind = start + i; + + if (BindInfo->IsStream_in_PackStreams(ind)) + continue; + + int bond = BindInfo->FindBond_for_PackStream(ind); + if (bond < 0) + return false; + if (!CheckCoder(BindInfo->Bonds[bond].UnpackIndex)) + return false; + } + + return true; +} + +bool CBondsChecks::Check() +{ + BoolVector_Fill_False(_coderUsed, BindInfo->Coders.Size()); + + if (!CheckCoder(BindInfo->UnpackCoder)) + return false; + + FOR_VECTOR(i, _coderUsed) + if (!_coderUsed[i]) + return false; + + return true; +} + +void CBindInfo::ClearMaps() +{ + Coder_to_Stream.Clear(); + Stream_to_Coder.Clear(); +} + +bool CBindInfo::CalcMapsAndCheck() +{ + ClearMaps(); + + UInt32 numStreams = 0; + + if (Coders.Size() == 0) + return false; + if (Coders.Size() - 1 != Bonds.Size()) + return false; + + FOR_VECTOR(i, Coders) + { + Coder_to_Stream.Add(numStreams); + + const CCoderStreamsInfo &c = Coders[i]; + + for (unsigned j = 0; j < c.NumStreams; j++) + Stream_to_Coder.Add(i); + + numStreams += c.NumStreams; + } + + if (numStreams != GetNum_Bonds_and_PackStreams()) + return false; + + CBondsChecks bc; + bc.BindInfo = this; + return bc.Check(); +} + + +void CCoder::SetCoderInfo(const UInt64 *unpackSize, const UInt64 * const *packSizes) +{ + if (unpackSize) + { + UnpackSize = *unpackSize; + UnpackSizePointer = &UnpackSize; + } + else + { + UnpackSize = 0; + UnpackSizePointer = NULL; + } + + PackSizes.ClearAndSetSize((unsigned)NumStreams); + PackSizePointers.ClearAndSetSize((unsigned)NumStreams); + + for (unsigned i = 0; i < NumStreams; i++) + { + if (packSizes && packSizes[i]) + { + PackSizes[i] = *(packSizes[i]); + PackSizePointers[i] = &PackSizes[i]; + } + else + { + PackSizes[i] = 0; + PackSizePointers[i] = NULL; + } + } +} + +bool CMixer::Is_UnpackSize_Correct_for_Coder(UInt32 coderIndex) +{ + if (coderIndex == _bi.UnpackCoder) + return true; + + int bond = _bi.FindBond_for_UnpackStream(coderIndex); + if (bond < 0) + throw 20150213; + + /* + UInt32 coderIndex, coderStreamIndex; + _bi.GetCoder_for_Stream(_bi.Bonds[bond].PackIndex, coderIndex, coderStreamIndex); + */ + UInt32 nextCoder = _bi.Stream_to_Coder[_bi.Bonds[bond].PackIndex]; + + if (!IsFilter_Vector[nextCoder]) + return false; + + return Is_UnpackSize_Correct_for_Coder(nextCoder); +} + +bool CMixer::Is_PackSize_Correct_for_Stream(UInt32 streamIndex) +{ + if (_bi.IsStream_in_PackStreams(streamIndex)) + return true; + + int bond = _bi.FindBond_for_PackStream(streamIndex); + if (bond < 0) + throw 20150213; + + UInt32 nextCoder = _bi.Bonds[bond].UnpackIndex; + + if (!IsFilter_Vector[nextCoder]) + return false; + + return Is_PackSize_Correct_for_Coder(nextCoder); +} + +bool CMixer::Is_PackSize_Correct_for_Coder(UInt32 coderIndex) +{ + UInt32 startIndex = _bi.Coder_to_Stream[coderIndex]; + UInt32 numStreams = _bi.Coders[coderIndex].NumStreams; + for (UInt32 i = 0; i < numStreams; i++) + if (!Is_PackSize_Correct_for_Stream(startIndex + i)) + return false; + return true; +} + +bool CMixer::IsThere_ExternalCoder_in_PackTree(UInt32 coderIndex) +{ + if (IsExternal_Vector[coderIndex]) + return true; + UInt32 startIndex = _bi.Coder_to_Stream[coderIndex]; + UInt32 numStreams = _bi.Coders[coderIndex].NumStreams; + for (UInt32 i = 0; i < numStreams; i++) + { + UInt32 si = startIndex + i; + if (_bi.IsStream_in_PackStreams(si)) + continue; + + int bond = _bi.FindBond_for_PackStream(si); + if (bond < 0) + throw 20150213; + + if (IsThere_ExternalCoder_in_PackTree(_bi.Bonds[bond].UnpackIndex)) + return true; + } + return false; +} + + + + +#ifdef USE_MIXER_ST + +CMixerST::CMixerST(bool encodeMode): + CMixer(encodeMode) + {} + +CMixerST::~CMixerST() {} + +void CMixerST::AddCoder(const CCreatedCoder &cod) +{ + IsFilter_Vector.Add(cod.IsFilter); + IsExternal_Vector.Add(cod.IsExternal); + // const CCoderStreamsInfo &c = _bi.Coders[_coders.Size()]; + CCoderST &c2 = _coders.AddNew(); + c2.NumStreams = cod.NumStreams; + c2.Coder = cod.Coder; + c2.Coder2 = cod.Coder2; + + /* + if (isFilter) + { + c2.CanRead = true; + c2.CanWrite = true; + } + else + */ + { + IUnknown *unk = (cod.Coder ? (IUnknown *)cod.Coder : (IUnknown *)cod.Coder2); + { + CMyComPtr s; + unk->QueryInterface(IID_ISequentialInStream, (void**)&s); + c2.CanRead = (s != NULL); + } + { + CMyComPtr s; + unk->QueryInterface(IID_ISequentialOutStream, (void**)&s); + c2.CanWrite = (s != NULL); + } + } +} + +CCoder &CMixerST::GetCoder(unsigned index) +{ + return _coders[index]; +} + +void CMixerST::ReInit() {} + +HRESULT CMixerST::GetInStream2( + ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */ + UInt32 outStreamIndex, ISequentialInStream **inStreamRes) +{ + UInt32 coderIndex = outStreamIndex, coderStreamIndex = 0; + + if (EncodeMode) + { + _bi.GetCoder_for_Stream(outStreamIndex, coderIndex, coderStreamIndex); + if (coderStreamIndex != 0) + return E_NOTIMPL; + } + + const CCoder &coder = _coders[coderIndex]; + + CMyComPtr seqInStream; + coder.QueryInterface(IID_ISequentialInStream, (void **)&seqInStream); + if (!seqInStream) + return E_NOTIMPL; + + UInt32 numInStreams = EncodeMode ? 1 : coder.NumStreams; + UInt32 startIndex = EncodeMode ? coderIndex : _bi.Coder_to_Stream[coderIndex]; + + bool isSet = false; + + if (numInStreams == 1) + { + CMyComPtr setStream; + coder.QueryInterface(IID_ICompressSetInStream, (void **)&setStream); + if (setStream) + { + CMyComPtr seqInStream2; + RINOK(GetInStream(inStreams, /* inSizes, */ startIndex + 0, &seqInStream2)); + RINOK(setStream->SetInStream(seqInStream2)); + isSet = true; + } + } + + if (!isSet && numInStreams != 0) + { + CMyComPtr setStream2; + coder.QueryInterface(IID_ICompressSetInStream2, (void **)&setStream2); + if (!setStream2) + return E_NOTIMPL; + + for (UInt32 i = 0; i < numInStreams; i++) + { + CMyComPtr seqInStream2; + RINOK(GetInStream(inStreams, /* inSizes, */ startIndex + i, &seqInStream2)); + RINOK(setStream2->SetInStream2(i, seqInStream2)); + } + } + + *inStreamRes = seqInStream.Detach(); + return S_OK; +} + + +HRESULT CMixerST::GetInStream( + ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */ + UInt32 inStreamIndex, ISequentialInStream **inStreamRes) +{ + CMyComPtr seqInStream; + + { + int index = -1; + if (EncodeMode) + { + if (_bi.UnpackCoder == inStreamIndex) + index = 0; + } + else + index = _bi.FindStream_in_PackStreams(inStreamIndex); + + if (index >= 0) + { + seqInStream = inStreams[(unsigned)index]; + *inStreamRes = seqInStream.Detach(); + return S_OK; + } + } + + int bond = FindBond_for_Stream( + true, // forInputStream + inStreamIndex); + if (bond < 0) + return E_INVALIDARG; + + RINOK(GetInStream2(inStreams, /* inSizes, */ + _bi.Bonds[bond].Get_OutIndex(EncodeMode), &seqInStream)); + + while (_binderStreams.Size() <= (unsigned)bond) + _binderStreams.AddNew(); + CStBinderStream &bs = _binderStreams[bond]; + + if (bs.StreamRef || bs.InStreamSpec) + return E_NOTIMPL; + + CSequentialInStreamCalcSize *spec = new CSequentialInStreamCalcSize; + bs.StreamRef = spec; + bs.InStreamSpec = spec; + + spec->SetStream(seqInStream); + spec->Init(); + + seqInStream = bs.InStreamSpec; + + *inStreamRes = seqInStream.Detach(); + return S_OK; +} + + +HRESULT CMixerST::GetOutStream( + ISequentialOutStream * const *outStreams, /* const UInt64 * const *outSizes, */ + UInt32 outStreamIndex, ISequentialOutStream **outStreamRes) +{ + CMyComPtr seqOutStream; + + { + int index = -1; + if (!EncodeMode) + { + if (_bi.UnpackCoder == outStreamIndex) + index = 0; + } + else + index = _bi.FindStream_in_PackStreams(outStreamIndex); + + if (index >= 0) + { + seqOutStream = outStreams[(unsigned)index]; + *outStreamRes = seqOutStream.Detach(); + return S_OK; + } + } + + int bond = FindBond_for_Stream( + false, // forInputStream + outStreamIndex); + if (bond < 0) + return E_INVALIDARG; + + UInt32 inStreamIndex = _bi.Bonds[bond].Get_InIndex(EncodeMode); + + UInt32 coderIndex = inStreamIndex; + UInt32 coderStreamIndex = 0; + + if (!EncodeMode) + _bi.GetCoder_for_Stream(inStreamIndex, coderIndex, coderStreamIndex); + + CCoder &coder = _coders[coderIndex]; + + /* + if (!coder.Coder) + return E_NOTIMPL; + */ + + coder.QueryInterface(IID_ISequentialOutStream, (void **)&seqOutStream); + if (!seqOutStream) + return E_NOTIMPL; + + UInt32 numOutStreams = EncodeMode ? coder.NumStreams : 1; + UInt32 startIndex = EncodeMode ? _bi.Coder_to_Stream[coderIndex]: coderIndex; + + bool isSet = false; + + if (numOutStreams == 1) + { + CMyComPtr setOutStream; + coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream); + if (setOutStream) + { + CMyComPtr seqOutStream2; + RINOK(GetOutStream(outStreams, /* outSizes, */ startIndex + 0, &seqOutStream2)); + RINOK(setOutStream->SetOutStream(seqOutStream2)); + isSet = true; + } + } + + if (!isSet && numOutStreams != 0) + { + return E_NOTIMPL; + /* + CMyComPtr setStream2; + coder.QueryInterface(IID_ICompressSetOutStream2, (void **)&setStream2); + if (!setStream2) + return E_NOTIMPL; + for (UInt32 i = 0; i < numOutStreams; i++) + { + CMyComPtr seqOutStream2; + RINOK(GetOutStream(outStreams, startIndex + i, &seqOutStream2)); + RINOK(setStream2->SetOutStream2(i, seqOutStream2)); + } + */ + } + + while (_binderStreams.Size() <= (unsigned)bond) + _binderStreams.AddNew(); + CStBinderStream &bs = _binderStreams[bond]; + + if (bs.StreamRef || bs.OutStreamSpec) + return E_NOTIMPL; + + COutStreamCalcSize *spec = new COutStreamCalcSize; + bs.StreamRef = (ISequentialOutStream *)spec; + bs.OutStreamSpec = spec; + + spec->SetStream(seqOutStream); + spec->Init(); + + seqOutStream = bs.OutStreamSpec; + + *outStreamRes = seqOutStream.Detach(); + return S_OK; +} + + +static HRESULT GetError(HRESULT res, HRESULT res2) +{ + if (res == res2) + return res; + if (res == S_OK) + return res2; + if (res == k_My_HRESULT_WritingWasCut) + { + if (res2 != S_OK) + return res2; + } + return res; +} + + +HRESULT CMixerST::FinishStream(UInt32 streamIndex) +{ + { + int index = -1; + if (!EncodeMode) + { + if (_bi.UnpackCoder == streamIndex) + index = 0; + } + else + index = _bi.FindStream_in_PackStreams(streamIndex); + + if (index >= 0) + return S_OK; + } + + int bond = FindBond_for_Stream( + false, // forInputStream + streamIndex); + if (bond < 0) + return E_INVALIDARG; + + UInt32 inStreamIndex = _bi.Bonds[bond].Get_InIndex(EncodeMode); + + UInt32 coderIndex = inStreamIndex; + UInt32 coderStreamIndex = 0; + if (!EncodeMode) + _bi.GetCoder_for_Stream(inStreamIndex, coderIndex, coderStreamIndex); + + CCoder &coder = _coders[coderIndex]; + CMyComPtr finish; + coder.QueryInterface(IID_IOutStreamFinish, (void **)&finish); + HRESULT res = S_OK; + if (finish) + { + res = finish->OutStreamFinish(); + } + return GetError(res, FinishCoder(coderIndex)); +} + + +HRESULT CMixerST::FinishCoder(UInt32 coderIndex) +{ + CCoder &coder = _coders[coderIndex]; + + UInt32 numOutStreams = EncodeMode ? coder.NumStreams : 1; + UInt32 startIndex = EncodeMode ? _bi.Coder_to_Stream[coderIndex]: coderIndex; + + HRESULT res = S_OK; + for (unsigned i = 0; i < numOutStreams; i++) + res = GetError(res, FinishStream(startIndex + i)); + return res; +} + + +void CMixerST::SelectMainCoder(bool useFirst) +{ + unsigned ci = _bi.UnpackCoder; + + int firstNonFilter = -1; + int firstAllowed = ci; + + for (;;) + { + const CCoderST &coder = _coders[ci]; + // break; + + if (ci != _bi.UnpackCoder) + if (EncodeMode ? !coder.CanWrite : !coder.CanRead) + { + firstAllowed = ci; + firstNonFilter = -2; + } + + if (coder.NumStreams != 1) + break; + + UInt32 st = _bi.Coder_to_Stream[ci]; + if (_bi.IsStream_in_PackStreams(st)) + break; + int bond = _bi.FindBond_for_PackStream(st); + if (bond < 0) + throw 20150213; + + if (EncodeMode ? !coder.CanRead : !coder.CanWrite) + break; + + if (firstNonFilter == -1 && !IsFilter_Vector[ci]) + firstNonFilter = ci; + + ci = _bi.Bonds[bond].UnpackIndex; + } + + if (useFirst) + ci = firstAllowed; + else if (firstNonFilter >= 0) + ci = firstNonFilter; + + MainCoderIndex = ci; +} + + +HRESULT CMixerST::Code( + ISequentialInStream * const *inStreams, + ISequentialOutStream * const *outStreams, + ICompressProgressInfo *progress) +{ + _binderStreams.Clear(); + unsigned ci = MainCoderIndex; + + const CCoder &mainCoder = _coders[MainCoderIndex]; + + CObjectVector< CMyComPtr > seqInStreams; + CObjectVector< CMyComPtr > seqOutStreams; + + UInt32 numInStreams = EncodeMode ? 1 : mainCoder.NumStreams; + UInt32 numOutStreams = !EncodeMode ? 1 : mainCoder.NumStreams; + + UInt32 startInIndex = EncodeMode ? ci : _bi.Coder_to_Stream[ci]; + UInt32 startOutIndex = !EncodeMode ? ci : _bi.Coder_to_Stream[ci]; + + UInt32 i; + + for (i = 0; i < numInStreams; i++) + { + CMyComPtr seqInStream; + RINOK(GetInStream(inStreams, /* inSizes, */ startInIndex + i, &seqInStream)); + seqInStreams.Add(seqInStream); + } + + for (i = 0; i < numOutStreams; i++) + { + CMyComPtr seqOutStream; + RINOK(GetOutStream(outStreams, /* outSizes, */ startOutIndex + i, &seqOutStream)); + seqOutStreams.Add(seqOutStream); + } + + CRecordVector< ISequentialInStream * > seqInStreamsSpec; + CRecordVector< ISequentialOutStream * > seqOutStreamsSpec; + + for (i = 0; i < numInStreams; i++) + seqInStreamsSpec.Add(seqInStreams[i]); + for (i = 0; i < numOutStreams; i++) + seqOutStreamsSpec.Add(seqOutStreams[i]); + + for (i = 0; i < _coders.Size(); i++) + { + if (i == ci) + continue; + + CCoder &coder = _coders[i]; + + if (EncodeMode) + { + CMyComPtr initEncoder; + coder.QueryInterface(IID_ICompressInitEncoder, (void **)&initEncoder); + if (initEncoder) + RINOK(initEncoder->InitEncoder()); + } + else + { + CMyComPtr setOutStreamSize; + coder.QueryInterface(IID_ICompressSetOutStreamSize, (void **)&setOutStreamSize); + if (setOutStreamSize) + RINOK(setOutStreamSize->SetOutStreamSize( + EncodeMode ? coder.PackSizePointers[0] : coder.UnpackSizePointer)); + } + } + + const UInt64 * const *isSizes2 = EncodeMode ? &mainCoder.UnpackSizePointer : &mainCoder.PackSizePointers.Front(); + const UInt64 * const *outSizes2 = EncodeMode ? &mainCoder.PackSizePointers.Front() : &mainCoder.UnpackSizePointer; + + HRESULT res; + if (mainCoder.Coder) + { + res = mainCoder.Coder->Code( + seqInStreamsSpec[0], seqOutStreamsSpec[0], + isSizes2[0], outSizes2[0], + progress); + } + else + { + res = mainCoder.Coder2->Code( + &seqInStreamsSpec.Front(), isSizes2, numInStreams, + &seqOutStreamsSpec.Front(), outSizes2, numOutStreams, + progress); + } + + if (res == k_My_HRESULT_WritingWasCut) + res = S_OK; + + if (res == S_OK || res == S_FALSE) + { + res = GetError(res, FinishCoder(ci)); + } + + for (i = 0; i < _binderStreams.Size(); i++) + { + const CStBinderStream &bs = _binderStreams[i]; + if (bs.InStreamSpec) + bs.InStreamSpec->ReleaseStream(); + else + bs.OutStreamSpec->ReleaseStream(); + } + + if (res == k_My_HRESULT_WritingWasCut) + res = S_OK; + return res; +} + + +HRESULT CMixerST::GetMainUnpackStream( + ISequentialInStream * const *inStreams, + ISequentialInStream **inStreamRes) +{ + CMyComPtr seqInStream; + + RINOK(GetInStream2(inStreams, /* inSizes, */ + _bi.UnpackCoder, &seqInStream)) + + FOR_VECTOR (i, _coders) + { + CCoder &coder = _coders[i]; + CMyComPtr setOutStreamSize; + coder.QueryInterface(IID_ICompressSetOutStreamSize, (void **)&setOutStreamSize); + if (setOutStreamSize) + { + RINOK(setOutStreamSize->SetOutStreamSize(coder.UnpackSizePointer)); + } + } + + *inStreamRes = seqInStream.Detach(); + return S_OK; +} + + +UInt64 CMixerST::GetBondStreamSize(unsigned bondIndex) const +{ + const CStBinderStream &bs = _binderStreams[bondIndex]; + if (bs.InStreamSpec) + return bs.InStreamSpec->GetSize(); + return bs.OutStreamSpec->GetSize(); +} + +#endif + + + + + + +#ifdef USE_MIXER_MT + + +void CCoderMT::Execute() +{ + try + { + Code(NULL); + } + catch(...) + { + Result = E_FAIL; + } +} + +void CCoderMT::Code(ICompressProgressInfo *progress) +{ + unsigned numInStreams = EncodeMode ? 1 : NumStreams; + unsigned numOutStreams = EncodeMode ? NumStreams : 1; + + InStreamPointers.ClearAndReserve(numInStreams); + OutStreamPointers.ClearAndReserve(numOutStreams); + + unsigned i; + + for (i = 0; i < numInStreams; i++) + InStreamPointers.AddInReserved((ISequentialInStream *)InStreams[i]); + + for (i = 0; i < numOutStreams; i++) + OutStreamPointers.AddInReserved((ISequentialOutStream *)OutStreams[i]); + + // we suppose that UnpackSizePointer and PackSizePointers contain correct pointers. + /* + if (UnpackSizePointer) + UnpackSizePointer = &UnpackSize; + for (i = 0; i < NumStreams; i++) + if (PackSizePointers[i]) + PackSizePointers[i] = &PackSizes[i]; + */ + + CReleaser releaser(*this); + + if (Coder) + Result = Coder->Code(InStreamPointers[0], OutStreamPointers[0], + EncodeMode ? UnpackSizePointer : PackSizePointers[0], + EncodeMode ? PackSizePointers[0] : UnpackSizePointer, + progress); + else + Result = Coder2->Code( + &InStreamPointers.Front(), EncodeMode ? &UnpackSizePointer : &PackSizePointers.Front(), numInStreams, + &OutStreamPointers.Front(), EncodeMode ? &PackSizePointers.Front(): &UnpackSizePointer, numOutStreams, + progress); +} + +HRESULT CMixerMT::SetBindInfo(const CBindInfo &bindInfo) +{ + CMixer::SetBindInfo(bindInfo); + + _streamBinders.Clear(); + FOR_VECTOR (i, _bi.Bonds) + { + RINOK(_streamBinders.AddNew().CreateEvents()); + } + return S_OK; +} + +void CMixerMT::AddCoder(const CCreatedCoder &cod) +{ + IsFilter_Vector.Add(cod.IsFilter); + IsExternal_Vector.Add(cod.IsExternal); + // const CCoderStreamsInfo &c = _bi.Coders[_coders.Size()]; + CCoderMT &c2 = _coders.AddNew(); + c2.NumStreams = cod.NumStreams; + c2.Coder = cod.Coder; + c2.Coder2 = cod.Coder2; + c2.EncodeMode = EncodeMode; +} + +CCoder &CMixerMT::GetCoder(unsigned index) +{ + return _coders[index]; +} + +void CMixerMT::ReInit() +{ + FOR_VECTOR (i, _streamBinders) + _streamBinders[i].ReInit(); +} + +void CMixerMT::SelectMainCoder(bool useFirst) +{ + unsigned ci = _bi.UnpackCoder; + + if (!useFirst) + for (;;) + { + if (_coders[ci].NumStreams != 1) + break; + if (!IsFilter_Vector[ci]) + break; + + UInt32 st = _bi.Coder_to_Stream[ci]; + if (_bi.IsStream_in_PackStreams(st)) + break; + int bond = _bi.FindBond_for_PackStream(st); + if (bond < 0) + throw 20150213; + ci = _bi.Bonds[bond].UnpackIndex; + } + + MainCoderIndex = ci; +} + +HRESULT CMixerMT::Init(ISequentialInStream * const *inStreams, ISequentialOutStream * const *outStreams) +{ + unsigned i; + + for (i = 0; i < _coders.Size(); i++) + { + CCoderMT &coderInfo = _coders[i]; + const CCoderStreamsInfo &csi = _bi.Coders[i]; + + UInt32 j; + + unsigned numInStreams = EncodeMode ? 1 : csi.NumStreams; + unsigned numOutStreams = EncodeMode ? csi.NumStreams : 1; + + coderInfo.InStreams.Clear(); + for (j = 0; j < numInStreams; j++) + coderInfo.InStreams.AddNew(); + + coderInfo.OutStreams.Clear(); + for (j = 0; j < numOutStreams; j++) + coderInfo.OutStreams.AddNew(); + } + + for (i = 0; i < _bi.Bonds.Size(); i++) + { + const CBond &bond = _bi.Bonds[i]; + + UInt32 inCoderIndex, inCoderStreamIndex; + UInt32 outCoderIndex, outCoderStreamIndex; + + { + UInt32 coderIndex, coderStreamIndex; + _bi.GetCoder_for_Stream(bond.PackIndex, coderIndex, coderStreamIndex); + + inCoderIndex = EncodeMode ? bond.UnpackIndex : coderIndex; + outCoderIndex = EncodeMode ? coderIndex : bond.UnpackIndex; + + inCoderStreamIndex = EncodeMode ? 0 : coderStreamIndex; + outCoderStreamIndex = EncodeMode ? coderStreamIndex : 0; + } + + _streamBinders[i].CreateStreams( + &_coders[inCoderIndex].InStreams[inCoderStreamIndex], + &_coders[outCoderIndex].OutStreams[outCoderStreamIndex]); + + CMyComPtr inSetSize, outSetSize; + _coders[inCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&inSetSize); + _coders[outCoderIndex].QueryInterface(IID_ICompressSetBufSize, (void **)&outSetSize); + if (inSetSize && outSetSize) + { + const UInt32 kBufSize = 1 << 19; + inSetSize->SetInBufSize(inCoderStreamIndex, kBufSize); + outSetSize->SetOutBufSize(outCoderStreamIndex, kBufSize); + } + } + + { + CCoderMT &cod = _coders[_bi.UnpackCoder]; + if (EncodeMode) + cod.InStreams[0] = inStreams[0]; + else + cod.OutStreams[0] = outStreams[0]; + } + + for (i = 0; i < _bi.PackStreams.Size(); i++) + { + UInt32 coderIndex, coderStreamIndex; + _bi.GetCoder_for_Stream(_bi.PackStreams[i], coderIndex, coderStreamIndex); + CCoderMT &cod = _coders[coderIndex]; + if (EncodeMode) + cod.OutStreams[coderStreamIndex] = outStreams[i]; + else + cod.InStreams[coderStreamIndex] = inStreams[i]; + } + + return S_OK; +} + +HRESULT CMixerMT::ReturnIfError(HRESULT code) +{ + FOR_VECTOR (i, _coders) + if (_coders[i].Result == code) + return code; + return S_OK; +} + +HRESULT CMixerMT::Code( + ISequentialInStream * const *inStreams, + ISequentialOutStream * const *outStreams, + ICompressProgressInfo *progress) +{ + Init(inStreams, outStreams); + + unsigned i; + for (i = 0; i < _coders.Size(); i++) + if (i != MainCoderIndex) + { + RINOK(_coders[i].Create()); + } + + for (i = 0; i < _coders.Size(); i++) + if (i != MainCoderIndex) + _coders[i].Start(); + + _coders[MainCoderIndex].Code(progress); + + for (i = 0; i < _coders.Size(); i++) + if (i != MainCoderIndex) + _coders[i].WaitExecuteFinish(); + + RINOK(ReturnIfError(E_ABORT)); + RINOK(ReturnIfError(E_OUTOFMEMORY)); + + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result != S_OK + && result != k_My_HRESULT_WritingWasCut + && result != S_FALSE + && result != E_FAIL) + return result; + } + + RINOK(ReturnIfError(S_FALSE)); + + for (i = 0; i < _coders.Size(); i++) + { + HRESULT result = _coders[i].Result; + if (result != S_OK && result != k_My_HRESULT_WritingWasCut) + return result; + } + + return S_OK; +} + +UInt64 CMixerMT::GetBondStreamSize(unsigned bondIndex) const +{ + return _streamBinders[bondIndex].ProcessedSize; +} + +#endif + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/CoderMixer2.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/CoderMixer2.h new file mode 100644 index 0000000000..8232e4905d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/CoderMixer2.h @@ -0,0 +1,441 @@ +// CoderMixer2.h + +#ifndef __CODER_MIXER2_H +#define __CODER_MIXER2_H + +#include "../../../Common/MyCom.h" +#include "../../../Common/MyVector.h" + +#include "../../ICoder.h" + +#include "../../Common/CreateCoder.h" + +#ifdef _7ZIP_ST + #ifndef USE_MIXER_ST + #define USE_MIXER_ST 1 + #endif +#else + #define USE_MIXER_MT + #ifndef _SFX + #ifndef USE_MIXER_ST + #define USE_MIXER_ST 1 + #endif + #endif +#endif + +#ifdef USE_MIXER_MT +#include "../../Common/StreamBinder.h" +#include "../../Common/VirtThread.h" +#endif + + + +#ifdef USE_MIXER_ST + +class CSequentialInStreamCalcSize: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(ISequentialInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +private: + CMyComPtr _stream; + UInt64 _size; + bool _wasFinished; +public: + void SetStream(ISequentialInStream *stream) { _stream = stream; } + void Init() + { + _size = 0; + _wasFinished = false; + } + void ReleaseStream() { _stream.Release(); } + UInt64 GetSize() const { return _size; } + bool WasFinished() const { return _wasFinished; } +}; + + +class COutStreamCalcSize: + public ISequentialOutStream, + public IOutStreamFinish, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; +public: + MY_UNKNOWN_IMP2(ISequentialOutStream, IOutStreamFinish) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(OutStreamFinish)(); + + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void ReleaseStream() { _stream.Release(); } + void Init() { _size = 0; } + UInt64 GetSize() const { return _size; } +}; + +#endif + + + +namespace NCoderMixer2 { + +struct CBond +{ + UInt32 PackIndex; + UInt32 UnpackIndex; + + UInt32 Get_InIndex(bool encodeMode) const { return encodeMode ? UnpackIndex : PackIndex; } + UInt32 Get_OutIndex(bool encodeMode) const { return encodeMode ? PackIndex : UnpackIndex; } +}; + + +struct CCoderStreamsInfo +{ + UInt32 NumStreams; +}; + + +struct CBindInfo +{ + CRecordVector Coders; + CRecordVector Bonds; + CRecordVector PackStreams; + unsigned UnpackCoder; + + unsigned GetNum_Bonds_and_PackStreams() const { return Bonds.Size() + PackStreams.Size(); } + + int FindBond_for_PackStream(UInt32 packStream) const + { + FOR_VECTOR (i, Bonds) + if (Bonds[i].PackIndex == packStream) + return i; + return -1; + } + + int FindBond_for_UnpackStream(UInt32 unpackStream) const + { + FOR_VECTOR (i, Bonds) + if (Bonds[i].UnpackIndex == unpackStream) + return i; + return -1; + } + + bool SetUnpackCoder() + { + bool isOk = false; + FOR_VECTOR(i, Coders) + { + if (FindBond_for_UnpackStream(i) < 0) + { + if (isOk) + return false; + UnpackCoder = i; + isOk = true; + } + } + return isOk; + } + + bool IsStream_in_PackStreams(UInt32 streamIndex) const + { + return FindStream_in_PackStreams(streamIndex) >= 0; + } + + int FindStream_in_PackStreams(UInt32 streamIndex) const + { + FOR_VECTOR(i, PackStreams) + if (PackStreams[i] == streamIndex) + return i; + return -1; + } + + + // that function is used before Maps is calculated + + UInt32 GetStream_for_Coder(UInt32 coderIndex) const + { + UInt32 streamIndex = 0; + for (UInt32 i = 0; i < coderIndex; i++) + streamIndex += Coders[i].NumStreams; + return streamIndex; + } + + // ---------- Maps Section ---------- + + CRecordVector Coder_to_Stream; + CRecordVector Stream_to_Coder; + + void ClearMaps(); + bool CalcMapsAndCheck(); + + // ---------- End of Maps Section ---------- + + void Clear() + { + Coders.Clear(); + Bonds.Clear(); + PackStreams.Clear(); + + ClearMaps(); + } + + void GetCoder_for_Stream(UInt32 streamIndex, UInt32 &coderIndex, UInt32 &coderStreamIndex) const + { + coderIndex = Stream_to_Coder[streamIndex]; + coderStreamIndex = streamIndex - Coder_to_Stream[coderIndex]; + } +}; + + + +class CCoder +{ + CLASS_NO_COPY(CCoder); +public: + CMyComPtr Coder; + CMyComPtr Coder2; + UInt32 NumStreams; + + UInt64 UnpackSize; + const UInt64 *UnpackSizePointer; + + CRecordVector PackSizes; + CRecordVector PackSizePointers; + + CCoder() {} + + void SetCoderInfo(const UInt64 *unpackSize, const UInt64 * const *packSizes); + + IUnknown *GetUnknown() const + { + return Coder ? (IUnknown *)Coder : (IUnknown *)Coder2; + } + + HRESULT QueryInterface(REFGUID iid, void** pp) const + { + return GetUnknown()->QueryInterface(iid, pp); + } +}; + + + +class CMixer +{ + bool Is_PackSize_Correct_for_Stream(UInt32 streamIndex); + +protected: + CBindInfo _bi; + + int FindBond_for_Stream(bool forInputStream, UInt32 streamIndex) const + { + if (EncodeMode == forInputStream) + return _bi.FindBond_for_UnpackStream(streamIndex); + else + return _bi.FindBond_for_PackStream(streamIndex); + } + + CBoolVector IsFilter_Vector; + CBoolVector IsExternal_Vector; + bool EncodeMode; +public: + unsigned MainCoderIndex; + + CMixer(bool encodeMode): + EncodeMode(encodeMode), + MainCoderIndex(0) + {} + + /* + Sequence of calling: + + SetBindInfo(); + for each coder + AddCoder(); + SelectMainCoder(); + + for each file + { + ReInit() + for each coder + SetCoderInfo(); + Code(); + } + */ + + virtual HRESULT SetBindInfo(const CBindInfo &bindInfo) + { + _bi = bindInfo; + IsFilter_Vector.Clear(); + MainCoderIndex = 0; + return S_OK; + } + + virtual void AddCoder(const CCreatedCoder &cod) = 0; + virtual CCoder &GetCoder(unsigned index) = 0; + virtual void SelectMainCoder(bool useFirst) = 0; + virtual void ReInit() = 0; + virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes) = 0; + virtual HRESULT Code( + ISequentialInStream * const *inStreams, + ISequentialOutStream * const *outStreams, + ICompressProgressInfo *progress) = 0; + virtual UInt64 GetBondStreamSize(unsigned bondIndex) const = 0; + + bool Is_UnpackSize_Correct_for_Coder(UInt32 coderIndex); + bool Is_PackSize_Correct_for_Coder(UInt32 coderIndex); + bool IsThere_ExternalCoder_in_PackTree(UInt32 coderIndex); +}; + + + + +#ifdef USE_MIXER_ST + +struct CCoderST: public CCoder +{ + bool CanRead; + bool CanWrite; + + CCoderST(): CanRead(false), CanWrite(false) {} +}; + + +struct CStBinderStream +{ + CSequentialInStreamCalcSize *InStreamSpec; + COutStreamCalcSize *OutStreamSpec; + CMyComPtr StreamRef; + + CStBinderStream(): InStreamSpec(NULL), OutStreamSpec(NULL) {} +}; + + +class CMixerST: + public IUnknown, + public CMixer, + public CMyUnknownImp +{ + HRESULT GetInStream2(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */ + UInt32 outStreamIndex, ISequentialInStream **inStreamRes); + HRESULT GetInStream(ISequentialInStream * const *inStreams, /* const UInt64 * const *inSizes, */ + UInt32 inStreamIndex, ISequentialInStream **inStreamRes); + HRESULT GetOutStream(ISequentialOutStream * const *outStreams, /* const UInt64 * const *outSizes, */ + UInt32 outStreamIndex, ISequentialOutStream **outStreamRes); + + HRESULT FinishStream(UInt32 streamIndex); + HRESULT FinishCoder(UInt32 coderIndex); + +public: + CObjectVector _coders; + + CObjectVector _binderStreams; + + MY_UNKNOWN_IMP + + CMixerST(bool encodeMode); + ~CMixerST(); + + virtual void AddCoder(const CCreatedCoder &cod); + virtual CCoder &GetCoder(unsigned index); + virtual void SelectMainCoder(bool useFirst); + virtual void ReInit(); + virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes) + { _coders[coderIndex].SetCoderInfo(unpackSize, packSizes); } + virtual HRESULT Code( + ISequentialInStream * const *inStreams, + ISequentialOutStream * const *outStreams, + ICompressProgressInfo *progress); + virtual UInt64 GetBondStreamSize(unsigned bondIndex) const; + + HRESULT GetMainUnpackStream( + ISequentialInStream * const *inStreams, + ISequentialInStream **inStreamRes); +}; + +#endif + + + + +#ifdef USE_MIXER_MT + +class CCoderMT: public CCoder, public CVirtThread +{ + CLASS_NO_COPY(CCoderMT) + CRecordVector InStreamPointers; + CRecordVector OutStreamPointers; + +private: + void Execute(); +public: + bool EncodeMode; + HRESULT Result; + CObjectVector< CMyComPtr > InStreams; + CObjectVector< CMyComPtr > OutStreams; + + void Release() + { + InStreamPointers.Clear(); + OutStreamPointers.Clear(); + unsigned i; + for (i = 0; i < InStreams.Size(); i++) + InStreams[i].Release(); + for (i = 0; i < OutStreams.Size(); i++) + OutStreams[i].Release(); + } + + class CReleaser + { + CLASS_NO_COPY(CReleaser) + CCoderMT &_c; + public: + CReleaser(CCoderMT &c): _c(c) {} + ~CReleaser() { _c.Release(); } + }; + + CCoderMT(): EncodeMode(false) {} + ~CCoderMT() { CVirtThread::WaitThreadFinish(); } + + void Code(ICompressProgressInfo *progress); +}; + + +class CMixerMT: + public IUnknown, + public CMixer, + public CMyUnknownImp +{ + CObjectVector _streamBinders; + + HRESULT Init(ISequentialInStream * const *inStreams, ISequentialOutStream * const *outStreams); + HRESULT ReturnIfError(HRESULT code); + +public: + CObjectVector _coders; + + MY_UNKNOWN_IMP + + virtual HRESULT SetBindInfo(const CBindInfo &bindInfo); + virtual void AddCoder(const CCreatedCoder &cod); + virtual CCoder &GetCoder(unsigned index); + virtual void SelectMainCoder(bool useFirst); + virtual void ReInit(); + virtual void SetCoderInfo(unsigned coderIndex, const UInt64 *unpackSize, const UInt64 * const *packSizes) + { _coders[coderIndex].SetCoderInfo(unpackSize, packSizes); } + virtual HRESULT Code( + ISequentialInStream * const *inStreams, + ISequentialOutStream * const *outStreams, + ICompressProgressInfo *progress); + virtual UInt64 GetBondStreamSize(unsigned bondIndex) const; + + CMixerMT(bool encodeMode): CMixer(encodeMode) {} +}; + +#endif + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp new file mode 100644 index 0000000000..c7d45e7f9e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp @@ -0,0 +1,17 @@ +// DummyOutStream.cpp + +#include "StdAfx.h" + +#include "DummyOutStream.h" + +STDMETHODIMP CDummyOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = size; + HRESULT res = S_OK; + if (_stream) + res = _stream->Write(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize) + *processedSize = realProcessedSize; + return res; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/DummyOutStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/DummyOutStream.h new file mode 100644 index 0000000000..30e84c55da --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/DummyOutStream.h @@ -0,0 +1,25 @@ +// DummyOutStream.h + +#ifndef __DUMMY_OUT_STREAM_H +#define __DUMMY_OUT_STREAM_H + +#include "../../../Common/MyCom.h" + +#include "../../IStream.h" + +class CDummyOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; +public: + void SetStream(ISequentialOutStream *outStream) { _stream = outStream; } + void ReleaseStream() { _stream.Release(); } + void Init() { _size = 0; } + MY_UNKNOWN_IMP + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + UInt64 GetSize() const { return _size; } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp new file mode 100644 index 0000000000..3200fd282b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp @@ -0,0 +1,157 @@ +// HandlerOut.cpp + +#include "StdAfx.h" + +#ifndef _7ZIP_ST +#include "../../../Windows/System.h" +#endif + +#include "../Common/ParseProperties.h" + +#include "HandlerOut.h" + +using namespace NWindows; + +namespace NArchive { + +static void SetMethodProp32(COneMethodInfo &m, PROPID propID, UInt32 value) +{ + if (m.FindProp(propID) < 0) + m.AddProp32(propID, value); +} + +void CMultiMethodProps::SetGlobalLevelAndThreads(COneMethodInfo &oneMethodInfo + #ifndef _7ZIP_ST + , UInt32 numThreads + #endif + ) +{ + UInt32 level = _level; + if (level != (UInt32)(Int32)-1) + SetMethodProp32(oneMethodInfo, NCoderPropID::kLevel, (UInt32)level); + + #ifndef _7ZIP_ST + SetMethodProp32(oneMethodInfo, NCoderPropID::kNumThreads, numThreads); + #endif +} + +void CMultiMethodProps::Init() +{ + #ifndef _7ZIP_ST + _numProcessors = _numThreads = NSystem::GetNumberOfProcessors(); + #endif + + _level = (UInt32)(Int32)-1; + _analysisLevel = -1; + + _autoFilter = true; + _crcSize = 4; + _filterMethod.Clear(); + _methods.Clear(); +} + +HRESULT CMultiMethodProps::SetProperty(const wchar_t *nameSpec, const PROPVARIANT &value) +{ + UString name = nameSpec; + name.MakeLower_Ascii(); + if (name.IsEmpty()) + return E_INVALIDARG; + + if (name[0] == 'x') + { + name.Delete(0); + _level = 9; + return ParsePropToUInt32(name, value, _level); + } + + if (name.IsPrefixedBy_Ascii_NoCase("yx")) + { + name.Delete(0, 2); + UInt32 v = 9; + RINOK(ParsePropToUInt32(name, value, v)); + _analysisLevel = (int)v; + return S_OK; + } + + if (name.IsEqualTo("crc")) + { + name.Delete(0, 3); + _crcSize = 4; + return ParsePropToUInt32(name, value, _crcSize); + } + + UInt32 number; + unsigned index = ParseStringToUInt32(name, number); + UString realName = name.Ptr(index); + if (index == 0) + { + if (name.IsPrefixedBy_Ascii_NoCase("mt")) + { + #ifndef _7ZIP_ST + RINOK(ParseMtProp(name.Ptr(2), value, _numProcessors, _numThreads)); + #endif + + return S_OK; + } + if (name.IsEqualTo("f")) + { + HRESULT res = PROPVARIANT_to_bool(value, _autoFilter); + if (res == S_OK) + return res; + if (value.vt != VT_BSTR) + return E_INVALIDARG; + return _filterMethod.ParseMethodFromPROPVARIANT(UString(), value); + } + number = 0; + } + if (number > 64) + return E_FAIL; + for (int j = _methods.Size(); j <= (int)number; j++) + _methods.Add(COneMethodInfo()); + return _methods[number].ParseMethodFromPROPVARIANT(realName, value); +} + +void CSingleMethodProps::Init() +{ + Clear(); + _level = (UInt32)(Int32)-1; + + #ifndef _7ZIP_ST + _numProcessors = _numThreads = NWindows::NSystem::GetNumberOfProcessors(); + AddProp_NumThreads(_numThreads); + #endif +} + +HRESULT CSingleMethodProps::SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps) +{ + Init(); + for (UInt32 i = 0; i < numProps; i++) + { + UString name = names[i]; + name.MakeLower_Ascii(); + if (name.IsEmpty()) + return E_INVALIDARG; + const PROPVARIANT &value = values[i]; + if (name[0] == L'x') + { + UInt32 a = 9; + RINOK(ParsePropToUInt32(name.Ptr(1), value, a)); + _level = a; + AddProp_Level(a); + } + else if (name.IsPrefixedBy_Ascii_NoCase("mt")) + { + #ifndef _7ZIP_ST + RINOK(ParseMtProp(name.Ptr(2), value, _numProcessors, _numThreads)); + AddProp_NumThreads(_numThreads); + #endif + } + else + { + RINOK(ParseMethodFromPROPVARIANT(names[i], value)); + } + } + return S_OK; +} + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/HandlerOut.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/HandlerOut.h new file mode 100644 index 0000000000..44dee097f0 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/HandlerOut.h @@ -0,0 +1,67 @@ +// HandlerOut.h + +#ifndef __HANDLER_OUT_H +#define __HANDLER_OUT_H + +#include "../../Common/MethodProps.h" + +namespace NArchive { + +class CMultiMethodProps +{ + UInt32 _level; + int _analysisLevel; +public: + #ifndef _7ZIP_ST + UInt32 _numThreads; + UInt32 _numProcessors; + #endif + + UInt32 _crcSize; + CObjectVector _methods; + COneMethodInfo _filterMethod; + bool _autoFilter; + + void SetGlobalLevelAndThreads(COneMethodInfo &oneMethodInfo + #ifndef _7ZIP_ST + , UInt32 numThreads + #endif + ); + + unsigned GetNumEmptyMethods() const + { + unsigned i; + for (i = 0; i < _methods.Size(); i++) + if (!_methods[i].IsEmpty()) + break; + return i; + } + + int GetLevel() const { return _level == (UInt32)(Int32)-1 ? 5 : (int)_level; } + int GetAnalysisLevel() const { return _analysisLevel; } + + void Init(); + + CMultiMethodProps() { Init(); } + HRESULT SetProperty(const wchar_t *name, const PROPVARIANT &value); +}; + +class CSingleMethodProps: public COneMethodInfo +{ + UInt32 _level; + +public: + #ifndef _7ZIP_ST + UInt32 _numThreads; + UInt32 _numProcessors; + #endif + + void Init(); + CSingleMethodProps() { Init(); } + int GetLevel() const { return _level == (UInt32)(Int32)-1 ? 5 : (int)_level; } + HRESULT SetProperties(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps); +}; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp new file mode 100644 index 0000000000..cddc083d64 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp @@ -0,0 +1,46 @@ +// InStreamWithCRC.cpp + +#include "StdAfx.h" + +#include "InStreamWithCRC.h" + +STDMETHODIMP CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessed = 0; + HRESULT result = S_OK; + if (_stream) + result = _stream->Read(data, size, &realProcessed); + _size += realProcessed; + if (size != 0 && realProcessed == 0) + _wasFinished = true; + _crc = CrcUpdate(_crc, data, realProcessed); + if (processedSize) + *processedSize = realProcessed; + return result; +} + +STDMETHODIMP CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessed = 0; + HRESULT result = S_OK; + if (_stream) + result = _stream->Read(data, size, &realProcessed); + _size += realProcessed; + /* + if (size != 0 && realProcessed == 0) + _wasFinished = true; + */ + _crc = CrcUpdate(_crc, data, realProcessed); + if (processedSize) + *processedSize = realProcessed; + return result; +} + +STDMETHODIMP CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if (seekOrigin != STREAM_SEEK_SET || offset != 0) + return E_FAIL; + _size = 0; + _crc = CRC_INIT_VAL; + return _stream->Seek(offset, seekOrigin, newPosition); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h new file mode 100644 index 0000000000..1a4b2c907e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h @@ -0,0 +1,67 @@ +// InStreamWithCRC.h + +#ifndef __IN_STREAM_WITH_CRC_H +#define __IN_STREAM_WITH_CRC_H + +#include "../../../../C/7zCrc.h" + +#include "../../../Common/MyCom.h" + +#include "../../IStream.h" + +class CSequentialInStreamWithCRC: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +private: + CMyComPtr _stream; + UInt64 _size; + UInt32 _crc; + bool _wasFinished; +public: + void SetStream(ISequentialInStream *stream) { _stream = stream; } + void Init() + { + _size = 0; + _wasFinished = false; + _crc = CRC_INIT_VAL; + } + void ReleaseStream() { _stream.Release(); } + UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } + UInt64 GetSize() const { return _size; } + bool WasFinished() const { return _wasFinished; } +}; + +class CInStreamWithCRC: + public IInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +private: + CMyComPtr _stream; + UInt64 _size; + UInt32 _crc; + // bool _wasFinished; +public: + void SetStream(IInStream *stream) { _stream = stream; } + void Init() + { + _size = 0; + // _wasFinished = false; + _crc = CRC_INIT_VAL; + } + void ReleaseStream() { _stream.Release(); } + UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } + UInt64 GetSize() const { return _size; } + // bool WasFinished() const { return _wasFinished; } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp new file mode 100644 index 0000000000..1608949d5c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp @@ -0,0 +1,88 @@ +// Archive/Common/ItemNameUtils.cpp + +#include "StdAfx.h" + +#include "ItemNameUtils.h" + +namespace NArchive { +namespace NItemName { + +static const wchar_t kOSDirDelimiter = WCHAR_PATH_SEPARATOR; +static const wchar_t kDirDelimiter = L'/'; + +void ReplaceToOsPathSeparator(wchar_t *s) +{ + #ifdef _WIN32 + for (;;) + { + wchar_t c = *s; + if (c == 0) + break; + if (c == kDirDelimiter) + *s = kOSDirDelimiter; + s++; + } + #endif +} + +UString MakeLegalName(const UString &name) +{ + UString zipName = name; + zipName.Replace(kOSDirDelimiter, kDirDelimiter); + return zipName; +} + +UString GetOSName(const UString &name) +{ + UString newName = name; + newName.Replace(kDirDelimiter, kOSDirDelimiter); + return newName; +} + +UString GetOSName2(const UString &name) +{ + if (name.IsEmpty()) + return UString(); + UString newName = GetOSName(name); + if (newName.Back() == kOSDirDelimiter) + newName.DeleteBack(); + return newName; +} + +void ConvertToOSName2(UString &name) +{ + if (!name.IsEmpty()) + { + name.Replace(kDirDelimiter, kOSDirDelimiter); + if (name.Back() == kOSDirDelimiter) + name.DeleteBack(); + } +} + +bool HasTailSlash(const AString &name, UINT + #if defined(_WIN32) && !defined(UNDER_CE) + codePage + #endif + ) +{ + if (name.IsEmpty()) + return false; + LPCSTR prev = + #if defined(_WIN32) && !defined(UNDER_CE) + CharPrevExA((WORD)codePage, name, &name[name.Len()], 0); + #else + (LPCSTR)(name) + (name.Len() - 1); + #endif + return (*prev == '/'); +} + +#ifndef _WIN32 +UString WinNameToOSName(const UString &name) +{ + UString newName = name; + newName.Replace(L'\\', kOSDirDelimiter); + return newName; +} +#endif + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h new file mode 100644 index 0000000000..8ee2d0f49b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h @@ -0,0 +1,27 @@ +// Archive/Common/ItemNameUtils.h + +#ifndef __ARCHIVE_ITEM_NAME_UTILS_H +#define __ARCHIVE_ITEM_NAME_UTILS_H + +#include "../../../Common/MyString.h" + +namespace NArchive { +namespace NItemName { + + void ReplaceToOsPathSeparator(wchar_t *s); + + UString MakeLegalName(const UString &name); + UString GetOSName(const UString &name); + UString GetOSName2(const UString &name); + void ConvertToOSName2(UString &name); + bool HasTailSlash(const AString &name, UINT codePage); + + #ifdef _WIN32 + inline UString WinNameToOSName(const UString &name) { return name; } + #else + UString WinNameToOSName(const UString &name); + #endif + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/MultiStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/MultiStream.cpp new file mode 100644 index 0000000000..39d15217f2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/MultiStream.cpp @@ -0,0 +1,191 @@ +// MultiStream.cpp + +#include "StdAfx.h" + +#include "MultiStream.h" + +STDMETHODIMP CMultiStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + if (_pos >= _totalLength) + return S_OK; + + { + unsigned left = 0, mid = _streamIndex, right = Streams.Size(); + for (;;) + { + CSubStreamInfo &m = Streams[mid]; + if (_pos < m.GlobalOffset) + right = mid; + else if (_pos >= m.GlobalOffset + m.Size) + left = mid + 1; + else + { + _streamIndex = mid; + break; + } + mid = (left + right) / 2; + } + _streamIndex = mid; + } + + CSubStreamInfo &s = Streams[_streamIndex]; + UInt64 localPos = _pos - s.GlobalOffset; + if (localPos != s.LocalPos) + { + RINOK(s.Stream->Seek(localPos, STREAM_SEEK_SET, &s.LocalPos)); + } + UInt64 rem = s.Size - localPos; + if (size > rem) + size = (UInt32)rem; + HRESULT result = s.Stream->Read(data, size, &size); + _pos += size; + s.LocalPos += size; + if (processedSize) + *processedSize = size; + return result; +} + +STDMETHODIMP CMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _pos; break; + case STREAM_SEEK_END: offset += _totalLength; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _pos = offset; + if (newPosition) + *newPosition = offset; + return S_OK; +} + + +/* +class COutVolumeStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + unsigned _volIndex; + UInt64 _volSize; + UInt64 _curPos; + CMyComPtr _volumeStream; + COutArchive _archive; + CCRC _crc; + +public: + MY_UNKNOWN_IMP + + CFileItem _file; + CUpdateOptions _options; + CMyComPtr VolumeCallback; + void Init(IArchiveUpdateCallback2 *volumeCallback, + const UString &name) + { + _file.Name = name; + _file.IsStartPosDefined = true; + _file.StartPos = 0; + + VolumeCallback = volumeCallback; + _volIndex = 0; + _volSize = 0; + } + + HRESULT Flush(); + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +HRESULT COutVolumeStream::Flush() +{ + if (_volumeStream) + { + _file.UnPackSize = _curPos; + _file.FileCRC = _crc.GetDigest(); + RINOK(WriteVolumeHeader(_archive, _file, _options)); + _archive.Close(); + _volumeStream.Release(); + _file.StartPos += _file.UnPackSize; + } + return S_OK; +} +*/ + +/* +STDMETHODIMP COutMultiStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + while (size > 0) + { + if (_streamIndex >= Streams.Size()) + { + CSubStreamInfo subStream; + RINOK(VolumeCallback->GetVolumeSize(Streams.Size(), &subStream.Size)); + RINOK(VolumeCallback->GetVolumeStream(Streams.Size(), &subStream.Stream)); + subStream.Pos = 0; + Streams.Add(subStream); + continue; + } + CSubStreamInfo &subStream = Streams[_streamIndex]; + if (_offsetPos >= subStream.Size) + { + _offsetPos -= subStream.Size; + _streamIndex++; + continue; + } + if (_offsetPos != subStream.Pos) + { + CMyComPtr outStream; + RINOK(subStream.Stream.QueryInterface(IID_IOutStream, &outStream)); + RINOK(outStream->Seek(_offsetPos, STREAM_SEEK_SET, NULL)); + subStream.Pos = _offsetPos; + } + + UInt32 curSize = (UInt32)MyMin((UInt64)size, subStream.Size - subStream.Pos); + UInt32 realProcessed; + RINOK(subStream.Stream->Write(data, curSize, &realProcessed)); + data = (void *)((Byte *)data + realProcessed); + size -= realProcessed; + subStream.Pos += realProcessed; + _offsetPos += realProcessed; + _absPos += realProcessed; + if (_absPos > _length) + _length = _absPos; + if (processedSize) + *processedSize += realProcessed; + if (subStream.Pos == subStream.Size) + { + _streamIndex++; + _offsetPos = 0; + } + if (realProcessed != curSize && realProcessed == 0) + return E_FAIL; + } + return S_OK; +} + +STDMETHODIMP COutMultiStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _absPos; break; + case STREAM_SEEK_END: offset += _length; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _absPos = offset; + _offsetPos = _absPos; + _streamIndex = 0; + if (newPosition) + *newPosition = offset; + return S_OK; +} +*/ diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/MultiStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/MultiStream.h new file mode 100644 index 0000000000..39e041def7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/MultiStream.h @@ -0,0 +1,89 @@ +// MultiStream.h + +#ifndef __MULTI_STREAM_H +#define __MULTI_STREAM_H + +#include "../../../Common/MyCom.h" +#include "../../../Common/MyVector.h" + +#include "../../IStream.h" + +class CMultiStream: + public IInStream, + public CMyUnknownImp +{ + UInt64 _pos; + UInt64 _totalLength; + unsigned _streamIndex; + +public: + + struct CSubStreamInfo + { + CMyComPtr Stream; + UInt64 Size; + UInt64 GlobalOffset; + UInt64 LocalPos; + + CSubStreamInfo(): Size(0), GlobalOffset(0), LocalPos(0) {} + }; + + CObjectVector Streams; + + HRESULT Init() + { + UInt64 total = 0; + FOR_VECTOR (i, Streams) + { + CSubStreamInfo &s = Streams[i]; + s.GlobalOffset = total; + total += Streams[i].Size; + RINOK(s.Stream->Seek(0, STREAM_SEEK_CUR, &s.LocalPos)); + } + _totalLength = total; + _pos = 0; + _streamIndex = 0; + return S_OK; + } + + MY_UNKNOWN_IMP1(IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; + +/* +class COutMultiStream: + public IOutStream, + public CMyUnknownImp +{ + unsigned _streamIndex; // required stream + UInt64 _offsetPos; // offset from start of _streamIndex index + UInt64 _absPos; + UInt64 _length; + + struct CSubStreamInfo + { + CMyComPtr Stream; + UInt64 Size; + UInt64 Pos; + }; + CObjectVector Streams; +public: + CMyComPtr VolumeCallback; + void Init() + { + _streamIndex = 0; + _offsetPos = 0; + _absPos = 0; + _length = 0; + } + + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; +*/ + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp new file mode 100644 index 0000000000..e0d3894b52 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp @@ -0,0 +1,18 @@ +// OutStreamWithCRC.cpp + +#include "StdAfx.h" + +#include "OutStreamWithCRC.h" + +STDMETHODIMP COutStreamWithCRC::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + HRESULT result = S_OK; + if (_stream) + result = _stream->Write(data, size, &size); + if (_calculate) + _crc = CrcUpdate(_crc, data, size); + _size += size; + if (processedSize != NULL) + *processedSize = size; + return result; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h new file mode 100644 index 0000000000..0cc9a859f8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h @@ -0,0 +1,37 @@ +// OutStreamWithCRC.h + +#ifndef __OUT_STREAM_WITH_CRC_H +#define __OUT_STREAM_WITH_CRC_H + +#include "../../../../C/7zCrc.h" + +#include "../../../Common/MyCom.h" + +#include "../../IStream.h" + +class COutStreamWithCRC: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; + UInt32 _crc; + bool _calculate; +public: + MY_UNKNOWN_IMP + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void ReleaseStream() { _stream.Release(); } + void Init(bool calculate = true) + { + _size = 0; + _calculate = calculate; + _crc = CRC_INIT_VAL; + } + void EnableCalc(bool calculate) { _calculate = calculate; } + void InitCRC() { _crc = CRC_INIT_VAL; } + UInt64 GetSize() const { return _size; } + UInt32 GetCRC() const { return CRC_GET_DIGEST(_crc); } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp new file mode 100644 index 0000000000..0fe89b3d20 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp @@ -0,0 +1,3 @@ +// ParseProperties.cpp + +#include "StdAfx.h" diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ParseProperties.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ParseProperties.h new file mode 100644 index 0000000000..f4367a76f2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/ParseProperties.h @@ -0,0 +1,6 @@ +// ParseProperties.h + +#ifndef __PARSE_PROPERTIES_H +#define __PARSE_PROPERTIES_H + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/StdAfx.h new file mode 100644 index 0000000000..a68dc7e3ff --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/Common/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../../Common/Common.h" +#include "../../../../../src/LzmaAppleCommon.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/DllExports2.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/DllExports2.cpp new file mode 100644 index 0000000000..4b8c941903 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/DllExports2.cpp @@ -0,0 +1,126 @@ +// DLLExports2.cpp + +#include "StdAfx.h" +#include "DllExports2.h" +#include "../../Common/MyWindows.h" + +#include "../../Common/MyInitGuid.h" + +#if defined(_7ZIP_LARGE_PAGES) +#include "../../../C/Alloc.h" +#endif + +#include "../../Common/ComTry.h" + +#if !defined(__APPLE__) +#include "../../Windows/NtCheck.h" +#endif +#include "../../Windows/PropVariant.h" + +#include "../ICoder.h" +#include "../IPassword.h" + +#include "../Common/CreateCoder.h" + +#include "IArchive.h" + +#if !defined(__APPLE__) +HINSTANCE g_hInstance; + +#define NT_CHECK_FAIL_ACTION return FALSE; + +#ifdef _WIN32 +extern "C" +BOOL WINAPI DllMain( + #ifdef UNDER_CE + HANDLE + #else + HINSTANCE + #endif + hInstance, DWORD dwReason, LPVOID /*lpReserved*/) +{ + if (dwReason == DLL_PROCESS_ATTACH) + { + // OutputDebugStringA("7z.dll DLL_PROCESS_ATTACH"); + g_hInstance = (HINSTANCE)hInstance; + NT_CHECK; + } + /* + if (dwReason == DLL_PROCESS_DETACH) + { + OutputDebugStringA("7z.dll DLL_PROCESS_DETACH"); + } + */ + return TRUE; +} +#endif +#endif + +DEFINE_GUID(CLSID_CArchiveHandler, + k_7zip_GUID_Data1, + k_7zip_GUID_Data2, + k_7zip_GUID_Data3_Common, + 0x10, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00); + +STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject); +STDAPI CreateHasher(const GUID *clsid, IHasher **hasher); +STDAPI CreateArchiver(const GUID *clsid, const GUID *iid, void **outObject); + +STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject) +{ + // COM_TRY_BEGIN + *outObject = 0; + if (*iid == IID_ICompressCoder || + *iid == IID_ICompressCoder2 || + *iid == IID_ICompressFilter) + return CreateCoder(clsid, iid, outObject); + if (*iid == IID_IHasher) + return CreateHasher(clsid, (IHasher **)outObject); + return CreateArchiver(clsid, iid, outObject); + // COM_TRY_END +} + +STDAPI SetLargePageMode() +{ + #if defined(_7ZIP_LARGE_PAGES) + SetLargePageSize(); + #endif + return S_OK; +} + +extern bool g_CaseSensitive; + +STDAPI SetCaseSensitive(Int32 caseSensitive) +{ + g_CaseSensitive = (caseSensitive != 0); + return S_OK; +} + +#ifdef EXTERNAL_CODECS + +CExternalCodecs g_ExternalCodecs; + +STDAPI SetCodecs(ICompressCodecsInfo *compressCodecsInfo) +{ + COM_TRY_BEGIN + + // OutputDebugStringA(compressCodecsInfo ? "SetCodecs" : "SetCodecs NULL"); + if (compressCodecsInfo) + { + g_ExternalCodecs.GetCodecs = compressCodecsInfo; + return g_ExternalCodecs.Load(); + } + g_ExternalCodecs.ClearAndRelease(); + return S_OK; + + COM_TRY_END +} + +#else + +STDAPI SetCodecs(ICompressCodecsInfo *) +{ + return S_OK; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/DllExports2.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/DllExports2.h new file mode 100644 index 0000000000..72bc896878 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/DllExports2.h @@ -0,0 +1,10 @@ + +#ifndef __DLLEXPORTS2_H__ +#define __DLLEXPORTS2_H__ 1 + +#include "../../Common/MyGuidDef.h" + +STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject); + +#endif + diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/IArchive.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/IArchive.h new file mode 100644 index 0000000000..848dc7c0ba --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/IArchive.h @@ -0,0 +1,598 @@ +// IArchive.h + +#ifndef __IARCHIVE_H +#define __IARCHIVE_H + +#include "../IProgress.h" +#include "../IStream.h" +#include "../PropID.h" + +#define ARCHIVE_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 6, x) +#define ARCHIVE_INTERFACE(i, x) ARCHIVE_INTERFACE_SUB(i, IUnknown, x) + +namespace NFileTimeType +{ + enum EEnum + { + kWindows, + kUnix, + kDOS + }; +} + +namespace NArcInfoFlags +{ + const UInt32 kKeepName = 1 << 0; // keep name of file in archive name + const UInt32 kAltStreams = 1 << 1; // the handler supports alt streams + const UInt32 kNtSecure = 1 << 2; // the handler supports NT security + const UInt32 kFindSignature = 1 << 3; // the handler can find start of archive + const UInt32 kMultiSignature = 1 << 4; // there are several signatures + const UInt32 kUseGlobalOffset = 1 << 5; // the seek position of stream must be set as global offset + const UInt32 kStartOpen = 1 << 6; // call handler for each start position + const UInt32 kPureStartOpen = 1 << 7; // call handler only for start of file + const UInt32 kBackwardOpen = 1 << 8; // archive can be open backward + const UInt32 kPreArc = 1 << 9; // such archive can be stored before real archive (like SFX stub) + const UInt32 kSymLinks = 1 << 10; // the handler supports symbolic links + const UInt32 kHardLinks = 1 << 11; // the handler supports hard links +} + +namespace NArchive +{ + namespace NHandlerPropID + { + enum + { + kName = 0, // VT_BSTR + kClassID, // binary GUID in VT_BSTR + kExtension, // VT_BSTR + kAddExtension, // VT_BSTR + kUpdate, // VT_BOOL + kKeepName, // VT_BOOL + kSignature, // binary in VT_BSTR + kMultiSignature, // binary in VT_BSTR + kSignatureOffset, // VT_UI4 + kAltStreams, // VT_BOOL + kNtSecure, // VT_BOOL + kFlags // VT_UI4 + // kVersion // VT_UI4 ((VER_MAJOR << 8) | VER_MINOR) + }; + } + + namespace NExtract + { + namespace NAskMode + { + enum + { + kExtract = 0, + kTest, + kSkip + }; + } + + namespace NOperationResult + { + enum + { + kOK = 0, + kUnsupportedMethod, + kDataError, + kCRCError, + kUnavailable, + kUnexpectedEnd, + kDataAfterEnd, + kIsNotArc, + kHeadersError, + kWrongPassword + }; + } + } + + namespace NEventIndexType + { + enum + { + kNoIndex = 0, + kInArcIndex, + kBlockIndex, + kOutArcIndex + }; + } + + namespace NUpdate + { + namespace NOperationResult + { + enum + { + kOK = 0 + , // kError + }; + } + } +} + +#define INTERFACE_IArchiveOpenCallback(x) \ + STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes) x; \ + STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes) x; \ + +ARCHIVE_INTERFACE(IArchiveOpenCallback, 0x10) +{ + INTERFACE_IArchiveOpenCallback(PURE); +}; + +/* +IArchiveExtractCallback:: + +7-Zip doesn't call IArchiveExtractCallback functions + GetStream() + PrepareOperation() + SetOperationResult() +from different threads simultaneously. +But 7-Zip can call functions for IProgress or ICompressProgressInfo functions +from another threads simultaneously with calls for IArchiveExtractCallback interface. + +IArchiveExtractCallback::GetStream() + UInt32 index - index of item in Archive + Int32 askExtractMode (Extract::NAskMode) + if (askMode != NExtract::NAskMode::kExtract) + { + then the callee can not real stream: (*inStream == NULL) + } + + Out: + (*inStream == NULL) - for directories + (*inStream == NULL) - if link (hard link or symbolic link) was created + if (*inStream == NULL && askMode == NExtract::NAskMode::kExtract) + { + then the caller must skip extracting of that file. + } + + returns: + S_OK : OK + S_FALSE : data error (for decoders) + +if (IProgress::SetTotal() was called) +{ + IProgress::SetCompleted(completeValue) uses + packSize - for some stream formats (xz, gz, bz2, lzma, z, ppmd). + unpackSize - for another formats. +} +else +{ + IProgress::SetCompleted(completeValue) uses packSize. +} + +SetOperationResult() + 7-Zip calls SetOperationResult at the end of extracting, + so the callee can close the file, set attributes, timestamps and security information. + + Int32 opRes (NExtract::NOperationResult) +*/ + +#define INTERFACE_IArchiveExtractCallback(x) \ + INTERFACE_IProgress(x) \ + STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode) x; \ + STDMETHOD(PrepareOperation)(Int32 askExtractMode) x; \ + STDMETHOD(SetOperationResult)(Int32 opRes) x; \ + +ARCHIVE_INTERFACE_SUB(IArchiveExtractCallback, IProgress, 0x20) +{ + INTERFACE_IArchiveExtractCallback(PURE) +}; + + + +/* +IArchiveExtractCallbackMessage can be requested from IArchiveExtractCallback object + by Extract() or UpdateItems() functions to report about extracting errors +ReportExtractResult() + UInt32 indexType (NEventIndexType) + UInt32 index + Int32 opRes (NExtract::NOperationResult) +*/ + +#define INTERFACE_IArchiveExtractCallbackMessage(x) \ + STDMETHOD(ReportExtractResult)(UInt32 indexType, UInt32 index, Int32 opRes) x; \ + +ARCHIVE_INTERFACE_SUB(IArchiveExtractCallbackMessage, IProgress, 0x21) +{ + INTERFACE_IArchiveExtractCallbackMessage(PURE) +}; + + +#define INTERFACE_IArchiveOpenVolumeCallback(x) \ + STDMETHOD(GetProperty)(PROPID propID, PROPVARIANT *value) x; \ + STDMETHOD(GetStream)(const wchar_t *name, IInStream **inStream) x; \ + +ARCHIVE_INTERFACE(IArchiveOpenVolumeCallback, 0x30) +{ + INTERFACE_IArchiveOpenVolumeCallback(PURE); +}; + + +ARCHIVE_INTERFACE(IInArchiveGetStream, 0x40) +{ + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream) PURE; +}; + + +ARCHIVE_INTERFACE(IArchiveOpenSetSubArchiveName, 0x50) +{ + STDMETHOD(SetSubArchiveName)(const wchar_t *name) PURE; +}; + + +/* +IInArchive::Open + stream + if (kUseGlobalOffset), stream current position can be non 0. + if (!kUseGlobalOffset), stream current position is 0. + if (maxCheckStartPosition == NULL), the handler can try to search archive start in stream + if (*maxCheckStartPosition == 0), the handler must check only current position as archive start + +IInArchive::Extract: + indices must be sorted + numItems = (UInt32)(Int32)-1 = 0xFFFFFFFF means "all files" + testMode != 0 means "test files without writing to outStream" + +IInArchive::GetArchiveProperty: + kpidOffset - start offset of archive. + VT_EMPTY : means offset = 0. + VT_UI4, VT_UI8, VT_I8 : result offset; negative values is allowed + kpidPhySize - size of archive. VT_EMPTY means unknown size. + kpidPhySize is allowed to be larger than file size. In that case it must show + supposed size. + + kpidIsDeleted: + kpidIsAltStream: + kpidIsAux: + kpidINode: + must return VARIANT_TRUE (VT_BOOL), if archive can support that property in GetProperty. + + +Notes: + Don't call IInArchive functions for same IInArchive object from different threads simultaneously. + Some IInArchive handlers will work incorrectly in that case. +*/ + +#ifdef _MSC_VER + #define MY_NO_THROW_DECL_ONLY throw() +#else + #define MY_NO_THROW_DECL_ONLY +#endif + +#define INTERFACE_IInArchive(x) \ + STDMETHOD(Open)(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openCallback) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(Close)() MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetNumberOfItems)(UInt32 *numItems) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(Extract)(const UInt32* indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetArchiveProperty)(PROPID propID, PROPVARIANT *value) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetNumberOfProperties)(UInt32 *numProps) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetPropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetNumberOfArchiveProperties)(UInt32 *numProps) MY_NO_THROW_DECL_ONLY x; \ + STDMETHOD(GetArchivePropertyInfo)(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) MY_NO_THROW_DECL_ONLY x; \ + +ARCHIVE_INTERFACE(IInArchive, 0x60) +{ + INTERFACE_IInArchive(PURE) +}; + +namespace NParentType +{ + enum + { + kDir = 0, + kAltStream + }; +}; + +namespace NPropDataType +{ + const UInt32 kMask_ZeroEnd = 1 << 4; + // const UInt32 kMask_BigEndian = 1 << 5; + const UInt32 kMask_Utf = 1 << 6; + const UInt32 kMask_Utf8 = kMask_Utf | 0; + const UInt32 kMask_Utf16 = kMask_Utf | 1; + // const UInt32 kMask_Utf32 = kMask_Utf | 2; + + const UInt32 kNotDefined = 0; + const UInt32 kRaw = 1; + + const UInt32 kUtf8z = kMask_Utf8 | kMask_ZeroEnd; + const UInt32 kUtf16z = kMask_Utf16 | kMask_ZeroEnd; +}; + +// UTF string (pointer to wchar_t) with zero end and little-endian. +#define PROP_DATA_TYPE_wchar_t_PTR_Z_LE ((NPropDataType::kMask_Utf | NPropDataType::kMask_ZeroEnd) + (sizeof(wchar_t) >> 1)) + +/* +GetRawProp: + Result: + S_OK - even if property is not set +*/ + +#define INTERFACE_IArchiveGetRawProps(x) \ + STDMETHOD(GetParent)(UInt32 index, UInt32 *parent, UInt32 *parentType) x; \ + STDMETHOD(GetRawProp)(UInt32 index, PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType) x; \ + STDMETHOD(GetNumRawProps)(UInt32 *numProps) x; \ + STDMETHOD(GetRawPropInfo)(UInt32 index, BSTR *name, PROPID *propID) x; + +ARCHIVE_INTERFACE(IArchiveGetRawProps, 0x70) +{ + INTERFACE_IArchiveGetRawProps(PURE) +}; + +#define INTERFACE_IArchiveGetRootProps(x) \ + STDMETHOD(GetRootProp)(PROPID propID, PROPVARIANT *value) x; \ + STDMETHOD(GetRootRawProp)(PROPID propID, const void **data, UInt32 *dataSize, UInt32 *propType) x; \ + +ARCHIVE_INTERFACE(IArchiveGetRootProps, 0x71) +{ + INTERFACE_IArchiveGetRootProps(PURE) +}; + +ARCHIVE_INTERFACE(IArchiveOpenSeq, 0x61) +{ + STDMETHOD(OpenSeq)(ISequentialInStream *stream) PURE; +}; + +/* + OpenForSize + Result: + S_FALSE - is not archive + ? - DATA error +*/ + +/* +const UInt32 kOpenFlags_RealPhySize = 1 << 0; +const UInt32 kOpenFlags_NoSeek = 1 << 1; +// const UInt32 kOpenFlags_BeforeExtract = 1 << 2; +*/ + +/* +Flags: + 0 - opens archive with IInStream, if IInStream interface is supported + - if phySize is not available, it doesn't try to make full parse to get phySize + kOpenFlags_NoSeek - ArcOpen2 function doesn't use IInStream interface, even if it's available + kOpenFlags_RealPhySize - the handler will try to get PhySize, even if it requires full decompression for file + + if handler is not allowed to use IInStream and the flag kOpenFlags_RealPhySize is not specified, + the handler can return S_OK, but it doesn't check even Signature. + So next Extract can be called for that sequential stream. +*/ + +/* +ARCHIVE_INTERFACE(IArchiveOpen2, 0x62) +{ + STDMETHOD(ArcOpen2)(ISequentialInStream *stream, UInt32 flags, IArchiveOpenCallback *openCallback) PURE; +}; +*/ + +// ---------- UPDATE ---------- + +/* +GetUpdateItemInfo outs: +*newData *newProps + 0 0 - Copy data and properties from archive + 0 1 - Copy data from archive, request new properties + 1 0 - that combination is unused now + 1 1 - Request new data and new properties. It can be used even for folders + + indexInArchive = -1 if there is no item in archive, or if it doesn't matter. + + +GetStream out: + Result: + S_OK: + (*inStream == NULL) - only for directories + - the bug was fixed in 9.33: (*Stream == NULL) was in case of anti-file + (*inStream != NULL) - for any file, even for empty file or anti-file + S_FALSE - skip that file (don't add item to archive) - (client code can't open stream of that file by some reason) + (*inStream == NULL) + +The order of calling for hard links: + - GetStream() + - GetProperty(kpidHardLink) + +SetOperationResult() + Int32 opRes (NExtract::NOperationResult::kOK) +*/ + +#define INTERFACE_IArchiveUpdateCallback(x) \ + INTERFACE_IProgress(x); \ + STDMETHOD(GetUpdateItemInfo)(UInt32 index, Int32 *newData, Int32 *newProps, UInt32 *indexInArchive) x; \ + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) x; \ + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream) x; \ + STDMETHOD(SetOperationResult)(Int32 operationResult) x; \ + +ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback, IProgress, 0x80) +{ + INTERFACE_IArchiveUpdateCallback(PURE); +}; + +#define INTERFACE_IArchiveUpdateCallback2(x) \ + INTERFACE_IArchiveUpdateCallback(x) \ + STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size) x; \ + STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream) x; \ + +ARCHIVE_INTERFACE_SUB(IArchiveUpdateCallback2, IArchiveUpdateCallback, 0x82) +{ + INTERFACE_IArchiveUpdateCallback2(PURE); +}; + +namespace NUpdateNotifyOp +{ + enum + { + kAdd = 0, + kUpdate, + kAnalyze, + kReplicate, + kRepack, + kSkip, + kDelete, + kHeader + + // kNumDefined + }; +}; + +/* +IArchiveUpdateCallbackFile::ReportOperation + UInt32 indexType (NEventIndexType) + UInt32 index + UInt32 notifyOp (NUpdateNotifyOp) +*/ + +#define INTERFACE_IArchiveUpdateCallbackFile(x) \ + STDMETHOD(GetStream2)(UInt32 index, ISequentialInStream **inStream, UInt32 notifyOp) x; \ + STDMETHOD(ReportOperation)(UInt32 indexType, UInt32 index, UInt32 notifyOp) x; \ + +ARCHIVE_INTERFACE(IArchiveUpdateCallbackFile, 0x83) +{ + INTERFACE_IArchiveUpdateCallbackFile(PURE); +}; + + +/* +UpdateItems() +------------- + + outStream: output stream. (the handler) MUST support the case when + Seek position in outStream is not ZERO. + but the caller calls with empty outStream and seek position is ZERO?? + + archives with stub: + + If archive is open and the handler and (Offset > 0), then the handler + knows about stub size. + UpdateItems(): + 1) the handler MUST copy that stub to outStream + 2) the caller MUST NOT copy the stub to outStream, if + "rsfx" property is set with SetProperties + + the handler must support the case where + ISequentialOutStream *outStream +*/ + + +#define INTERFACE_IOutArchive(x) \ + STDMETHOD(UpdateItems)(ISequentialOutStream *outStream, UInt32 numItems, IArchiveUpdateCallback *updateCallback) x; \ + STDMETHOD(GetFileTimeType)(UInt32 *type) x; + +ARCHIVE_INTERFACE(IOutArchive, 0xA0) +{ + INTERFACE_IOutArchive(PURE) +}; + + +ARCHIVE_INTERFACE(ISetProperties, 0x03) +{ + STDMETHOD(SetProperties)(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps) PURE; +}; + +ARCHIVE_INTERFACE(IArchiveKeepModeForNextOpen, 0x04) +{ + STDMETHOD(KeepModeForNextOpen)() PURE; +}; + +/* Exe handler: the handler for executable format (PE, ELF, Mach-O). + SFX archive: executable stub + some tail data. + before 9.31: exe handler didn't parse SFX archives as executable format. + for 9.31+: exe handler parses SFX archives as executable format, only if AllowTail(1) was called */ + +ARCHIVE_INTERFACE(IArchiveAllowTail, 0x05) +{ + STDMETHOD(AllowTail)(Int32 allowTail) PURE; +}; + + +#define IMP_IInArchive_GetProp(k) \ + (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ + { if (index >= ARRAY_SIZE(k)) return E_INVALIDARG; \ + *propID = k[index]; *varType = k7z_PROPID_To_VARTYPE[(unsigned)*propID]; *name = 0; return S_OK; } \ + +#if !defined(__APPLE__) +struct CStatProp +{ + const char *Name; + UInt32 PropID; + VARTYPE vt; +}; +#endif +namespace NWindows { +namespace NCOM { +// PropVariant.cpp +BSTR AllocBstrFromAscii(const char *s) throw(); +}} + +#define IMP_IInArchive_GetProp_WITH_NAME(k) \ + (UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType) \ + { if (index >= ARRAY_SIZE(k)) return E_INVALIDARG; \ + const CStatProp &prop = k[index]; \ + *propID = (PROPID)prop.PropID; *varType = prop.vt; \ + *name = NWindows::NCOM::AllocBstrFromAscii(prop.Name); return S_OK; } \ + +#define IMP_IInArchive_Props \ + STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps) \ + { *numProps = ARRAY_SIZE(kProps); return S_OK; } \ + STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp(kProps) + +#define IMP_IInArchive_Props_WITH_NAME \ + STDMETHODIMP CHandler::GetNumberOfProperties(UInt32 *numProps) \ + { *numProps = ARRAY_SIZE(kProps); return S_OK; } \ + STDMETHODIMP CHandler::GetPropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kProps) + + +#define IMP_IInArchive_ArcProps \ + STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProps) \ + { *numProps = ARRAY_SIZE(kArcProps); return S_OK; } \ + STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp(kArcProps) + +#define IMP_IInArchive_ArcProps_WITH_NAME \ + STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProps) \ + { *numProps = ARRAY_SIZE(kArcProps); return S_OK; } \ + STDMETHODIMP CHandler::GetArchivePropertyInfo IMP_IInArchive_GetProp_WITH_NAME(kArcProps) + +#define IMP_IInArchive_ArcProps_NO_Table \ + STDMETHODIMP CHandler::GetNumberOfArchiveProperties(UInt32 *numProps) \ + { *numProps = 0; return S_OK; } \ + STDMETHODIMP CHandler::GetArchivePropertyInfo(UInt32, BSTR *, PROPID *, VARTYPE *) \ + { return E_NOTIMPL; } \ + +#define IMP_IInArchive_ArcProps_NO \ + IMP_IInArchive_ArcProps_NO_Table \ + STDMETHODIMP CHandler::GetArchiveProperty(PROPID, PROPVARIANT *value) \ + { value->vt = VT_EMPTY; return S_OK; } + + + +#define k_IsArc_Res_NO 0 +#define k_IsArc_Res_YES 1 +#define k_IsArc_Res_NEED_MORE 2 +// #define k_IsArc_Res_YES_LOW_PROB 3 + +#define API_FUNC_IsArc EXTERN_C UInt32 WINAPI +#define API_FUNC_static_IsArc extern "C" { static UInt32 WINAPI + +extern "C" +{ + typedef HRESULT (WINAPI *Func_CreateObject)(const GUID *clsID, const GUID *iid, void **outObject); + + typedef UInt32 (WINAPI *Func_IsArc)(const Byte *p, size_t size); + typedef HRESULT (WINAPI *Func_GetIsArc)(UInt32 formatIndex, Func_IsArc *isArc); + + typedef HRESULT (WINAPI *Func_GetNumberOfFormats)(UInt32 *numFormats); + typedef HRESULT (WINAPI *Func_GetHandlerProperty)(PROPID propID, PROPVARIANT *value); + typedef HRESULT (WINAPI *Func_GetHandlerProperty2)(UInt32 index, PROPID propID, PROPVARIANT *value); + + typedef HRESULT (WINAPI *Func_SetCaseSensitive)(Int32 caseSensitive); + typedef HRESULT (WINAPI *Func_SetLargePageMode)(); + + typedef IOutArchive * (*Func_CreateOutArchive)(); + typedef IInArchive * (*Func_CreateInArchive)(); +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/LzmaHandler.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/LzmaHandler.cpp new file mode 100644 index 0000000000..1312aba3a7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/LzmaHandler.cpp @@ -0,0 +1,573 @@ +// LzmaHandler.cpp + +#include "StdAfx.h" + +#include "../../../C/CpuArch.h" + +#include "../../Common/ComTry.h" +#include "../../Common/IntToString.h" + +#include "../../Windows/PropVariant.h" + +#include "../Common/FilterCoder.h" +#include "../Common/ProgressUtils.h" +#include "../Common/RegisterArc.h" +#include "../Common/StreamUtils.h" + +#include "../Compress/BcjCoder.h" +#include "../Compress/LzmaDecoder.h" + +#include "Common/DummyOutStream.h" + +using namespace NWindows; + +namespace NArchive { +namespace NLzma { + +static bool CheckDicSize(const Byte *p) +{ + UInt32 dicSize = GetUi32(p); + if (dicSize == 1) + return true; + for (unsigned i = 0; i <= 30; i++) + if (dicSize == ((UInt32)2 << i) || dicSize == ((UInt32)3 << i)) + return true; + return (dicSize == 0xFFFFFFFF); +} + +static const Byte kProps[] = +{ + kpidSize, + kpidPackSize, + kpidMethod +}; + +static const Byte kArcProps[] = +{ + kpidNumStreams +}; + +struct CHeader +{ + UInt64 Size; + Byte FilterID; + Byte LzmaProps[5]; + + UInt32 GetDicSize() const { return GetUi32(LzmaProps + 1); } + bool HasSize() const { return (Size != (UInt64)(Int64)-1); } + bool Parse(const Byte *buf, bool isThereFilter); +}; + +bool CHeader::Parse(const Byte *buf, bool isThereFilter) +{ + FilterID = 0; + if (isThereFilter) + FilterID = buf[0]; + const Byte *sig = buf + (isThereFilter ? 1 : 0); + for (int i = 0; i < 5; i++) + LzmaProps[i] = sig[i]; + Size = GetUi64(sig + 5); + return + LzmaProps[0] < 5 * 5 * 9 && + FilterID < 2 && + (!HasSize() || Size < ((UInt64)1 << 56)) + && CheckDicSize(LzmaProps + 1); +} + +class CDecoder +{ + CMyComPtr _bcjStream; + CFilterCoder *_filterCoder; + CMyComPtr _lzmaDecoder; +public: + NCompress::NLzma::CDecoder *_lzmaDecoderSpec; + + ~CDecoder(); + HRESULT Create(bool filtered, ISequentialInStream *inStream); + + HRESULT Code(const CHeader &header, ISequentialOutStream *outStream, ICompressProgressInfo *progress); + + UInt64 GetInputProcessedSize() const { return _lzmaDecoderSpec->GetInputProcessedSize(); } + + void ReleaseInStream() { if (_lzmaDecoder) _lzmaDecoderSpec->ReleaseInStream(); } + + HRESULT ReadInput(Byte *data, UInt32 size, UInt32 *processedSize) + { return _lzmaDecoderSpec->ReadFromInputStream(data, size, processedSize); } +}; + +HRESULT CDecoder::Create(bool filteredMode, ISequentialInStream *inStream) +{ + if (!_lzmaDecoder) + { + _lzmaDecoderSpec = new NCompress::NLzma::CDecoder; + _lzmaDecoderSpec->FinishStream = true; + _lzmaDecoder = _lzmaDecoderSpec; + } + + if (filteredMode) + { + if (!_bcjStream) + { + _filterCoder = new CFilterCoder(false); + CMyComPtr coder = _filterCoder; + _filterCoder->Filter = new NCompress::NBcj::CCoder(false); + _bcjStream = _filterCoder; + } + } + + return _lzmaDecoderSpec->SetInStream(inStream); +} + +CDecoder::~CDecoder() +{ + ReleaseInStream(); +} + +HRESULT CDecoder::Code(const CHeader &header, ISequentialOutStream *outStream, + ICompressProgressInfo *progress) +{ + if (header.FilterID > 1) + return E_NOTIMPL; + + { + CMyComPtr setDecoderProperties; + _lzmaDecoder.QueryInterface(IID_ICompressSetDecoderProperties2, &setDecoderProperties); + if (!setDecoderProperties) + return E_NOTIMPL; + RINOK(setDecoderProperties->SetDecoderProperties2(header.LzmaProps, 5)); + } + + bool filteredMode = (header.FilterID == 1); + + if (filteredMode) + { + RINOK(_filterCoder->SetOutStream(outStream)); + outStream = _bcjStream; + RINOK(_filterCoder->SetOutStreamSize(NULL)); + } + + const UInt64 *Size = header.HasSize() ? &header.Size : NULL; + HRESULT res = _lzmaDecoderSpec->CodeResume(outStream, Size, progress); + + if (filteredMode) + { + { + HRESULT res2 = _filterCoder->OutStreamFinish(); + if (res == S_OK) + res = res2; + } + HRESULT res2 = _filterCoder->ReleaseOutStream(); + if (res == S_OK) + res = res2; + } + + RINOK(res); + + if (header.HasSize()) + if (_lzmaDecoderSpec->GetOutputProcessedSize() != header.Size) + return S_FALSE; + + return S_OK; +} + + +class CHandler: + public IInArchive, + public IArchiveOpenSeq, + public CMyUnknownImp +{ + CHeader _header; + bool _lzma86; + CMyComPtr _stream; + CMyComPtr _seqStream; + + bool _isArc; + bool _needSeekToStart; + bool _dataAfterEnd; + bool _needMoreInput; + + bool _packSize_Defined; + bool _unpackSize_Defined; + bool _numStreams_Defined; + + bool _unsupported; + bool _dataError; + + UInt64 _packSize; + UInt64 _unpackSize; + UInt64 _numStreams; + +public: + MY_UNKNOWN_IMP2(IInArchive, IArchiveOpenSeq) + + INTERFACE_IInArchive(;) + STDMETHOD(OpenSeq)(ISequentialInStream *stream); + + CHandler(bool lzma86) { _lzma86 = lzma86; } + + unsigned GetHeaderSize() const { return 5 + 8 + (_lzma86 ? 1 : 0); } + +}; + +IMP_IInArchive_Props +IMP_IInArchive_ArcProps + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + NCOM::CPropVariant prop; + switch (propID) + { + case kpidPhySize: if (_packSize_Defined) prop = _packSize; break; + case kpidNumStreams: if (_numStreams_Defined) prop = _numStreams; break; + case kpidUnpackSize: if (_unpackSize_Defined) prop = _unpackSize; break; + case kpidErrorFlags: + { + UInt32 v = 0; + if (!_isArc) v |= kpv_ErrorFlags_IsNotArc;; + if (_needMoreInput) v |= kpv_ErrorFlags_UnexpectedEnd; + if (_dataAfterEnd) v |= kpv_ErrorFlags_DataAfterEnd; + if (_unsupported) v |= kpv_ErrorFlags_UnsupportedMethod; + if (_dataError) v |= kpv_ErrorFlags_DataError; + prop = v; + } + } + prop.Detach(value); + return S_OK; +} + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = 1; + return S_OK; +} + +static void DictSizeToString(UInt32 value, char *s) +{ + for (int i = 0; i <= 31; i++) + if (((UInt32)1 << i) == value) + { + ::ConvertUInt32ToString(i, s); + return; + } + char c = 'b'; + if ((value & ((1 << 20) - 1)) == 0) { value >>= 20; c = 'm'; } + else if ((value & ((1 << 10) - 1)) == 0) { value >>= 10; c = 'k'; } + ::ConvertUInt32ToString(value, s); + s += MyStringLen(s); + *s++ = c; + *s = 0; +} + +STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) +{ + NCOM::CPropVariant prop; + switch (propID) + { + case kpidSize: if (_stream && _header.HasSize()) prop = _header.Size; break; + case kpidPackSize: if (_packSize_Defined) prop = _packSize; break; + case kpidMethod: + if (_stream) + { + char sz[64]; + char *s = sz; + if (_header.FilterID != 0) + s = MyStpCpy(s, "BCJ "); + s = MyStpCpy(s, "LZMA:"); + DictSizeToString(_header.GetDicSize(), s); + prop = sz; + } + break; + } + prop.Detach(value); + return S_OK; +} + +API_FUNC_static_IsArc IsArc_Lzma(const Byte *p, size_t size) +{ + const UInt32 kHeaderSize = 1 + 4 + 8; + if (size < kHeaderSize) + return k_IsArc_Res_NEED_MORE; + if (p[0] >= 5 * 5 * 9) + return k_IsArc_Res_NO; + UInt64 unpackSize = GetUi64(p + 1 + 4); + if (unpackSize != (UInt64)(Int64)-1) + { + if ((UInt64)size >= ((UInt64)1 << 56)) + return k_IsArc_Res_NO; + } + if (unpackSize != 0) + { + if (size < kHeaderSize + 2) + return k_IsArc_Res_NEED_MORE; + if (p[kHeaderSize] != 0) + return k_IsArc_Res_NO; + if (unpackSize != (UInt64)(Int64)-1) + { + if ((p[kHeaderSize + 1] & 0x80) != 0) + return k_IsArc_Res_NO; + } + } + if (!CheckDicSize(p + 1)) + // return k_IsArc_Res_YES_LOW_PROB; + return k_IsArc_Res_NO; + return k_IsArc_Res_YES; +} +} + +API_FUNC_static_IsArc IsArc_Lzma86(const Byte *p, size_t size) +{ + if (size < 1) + return k_IsArc_Res_NEED_MORE; + Byte filterID = p[0]; + if (filterID != 0 && filterID != 1) + return k_IsArc_Res_NO; + return IsArc_Lzma(p + 1, size - 1); +} +} + +STDMETHODIMP CHandler::Open(IInStream *inStream, const UInt64 *, IArchiveOpenCallback *) +{ + Close(); + + const UInt32 kBufSize = 1 + 5 + 8 + 2; + Byte buf[kBufSize]; + + RINOK(ReadStream_FALSE(inStream, buf, kBufSize)); + + if (!_header.Parse(buf, _lzma86)) + return S_FALSE; + const Byte *start = buf + GetHeaderSize(); + if (start[0] != 0 /* || (start[1] & 0x80) != 0 */ ) // empty stream with EOS is not 0x80 + return S_FALSE; + + RINOK(inStream->Seek(0, STREAM_SEEK_END, &_packSize)); + if (_packSize >= 24 && _header.Size == 0 && _header.FilterID == 0 && _header.LzmaProps[0] == 0) + return S_FALSE; + _isArc = true; + _stream = inStream; + _seqStream = inStream; + _needSeekToStart = true; + return S_OK; +} + +STDMETHODIMP CHandler::OpenSeq(ISequentialInStream *stream) +{ + Close(); + _isArc = true; + _seqStream = stream; + return S_OK; +} + +STDMETHODIMP CHandler::Close() +{ + _isArc = false; + _packSize_Defined = false; + _unpackSize_Defined = false; + _numStreams_Defined = false; + + _dataAfterEnd = false; + _needMoreInput = false; + _unsupported = false; + _dataError = false; + + _packSize = 0; + + _needSeekToStart = false; + + _stream.Release(); + _seqStream.Release(); + return S_OK; +} + +class CCompressProgressInfoImp: + public ICompressProgressInfo, + public CMyUnknownImp +{ + CMyComPtr Callback; +public: + UInt64 Offset; + + MY_UNKNOWN_IMP1(ICompressProgressInfo) + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); + void Init(IArchiveOpenCallback *callback) { Callback = callback; } +}; + +STDMETHODIMP CCompressProgressInfoImp::SetRatioInfo(const UInt64 *inSize, const UInt64 * /* outSize */) +{ + if (Callback) + { + UInt64 files = 0; + UInt64 value = Offset + *inSize; + return Callback->SetCompleted(&files, &value); + } + return S_OK; +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) +{ + COM_TRY_BEGIN + + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)(Int32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; + + if (_packSize_Defined) + extractCallback->SetTotal(_packSize); + + + CMyComPtr realOutStream; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; + RINOK(extractCallback->GetStream(0, &realOutStream, askMode)); + if (!testMode && !realOutStream) + return S_OK; + + extractCallback->PrepareOperation(askMode); + + CDummyOutStream *outStreamSpec = new CDummyOutStream; + CMyComPtr outStream(outStreamSpec); + outStreamSpec->SetStream(realOutStream); + outStreamSpec->Init(); + realOutStream.Release(); + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr progress = lps; + lps->Init(extractCallback, true); + + if (_needSeekToStart) + { + if (!_stream) + return E_FAIL; + RINOK(_stream->Seek(0, STREAM_SEEK_SET, NULL)); + } + else + _needSeekToStart = true; + + CDecoder decoder; + HRESULT result = decoder.Create(_lzma86, _seqStream); + RINOK(result); + + bool firstItem = true; + + UInt64 packSize = 0; + UInt64 unpackSize = 0; + UInt64 numStreams = 0; + + bool dataAfterEnd = false; + + for (;;) + { + lps->InSize = packSize; + lps->OutSize = unpackSize; + RINOK(lps->SetCur()); + + const UInt32 kBufSize = 1 + 5 + 8; + Byte buf[kBufSize]; + const UInt32 headerSize = GetHeaderSize(); + UInt32 processed; + RINOK(decoder.ReadInput(buf, headerSize, &processed)); + if (processed != headerSize) + { + if (processed != 0) + dataAfterEnd = true; + break; + } + + CHeader st; + if (!st.Parse(buf, _lzma86)) + { + dataAfterEnd = true; + break; + } + numStreams++; + firstItem = false; + + result = decoder.Code(st, outStream, progress); + + packSize = decoder.GetInputProcessedSize(); + unpackSize = outStreamSpec->GetSize(); + + if (result == E_NOTIMPL) + { + _unsupported = true; + result = S_FALSE; + break; + } + if (result == S_FALSE) + break; + RINOK(result); + } + + if (firstItem) + { + _isArc = false; + result = S_FALSE; + } + else if (result == S_OK || result == S_FALSE) + { + if (dataAfterEnd) + _dataAfterEnd = true; + else if (decoder._lzmaDecoderSpec->NeedMoreInput) + _needMoreInput = true; + + _packSize = packSize; + _unpackSize = unpackSize; + _numStreams = numStreams; + + _packSize_Defined = true; + _unpackSize_Defined = true; + _numStreams_Defined = true; + } + + Int32 opResult = NExtract::NOperationResult::kOK; + + if (!_isArc) + opResult = NExtract::NOperationResult::kIsNotArc; + else if (_needMoreInput) + opResult = NExtract::NOperationResult::kUnexpectedEnd; + else if (_unsupported) + opResult = NExtract::NOperationResult::kUnsupportedMethod; + else if (_dataAfterEnd) + opResult = NExtract::NOperationResult::kDataAfterEnd; + else if (result == S_FALSE) + opResult = NExtract::NOperationResult::kDataError; + else if (result == S_OK) + opResult = NExtract::NOperationResult::kOK; + else + return result; + + outStream.Release(); + return extractCallback->SetOperationResult(opResult); + + COM_TRY_END +} + +namespace NLzmaAr { + +// 2, { 0x5D, 0x00 }, + +REGISTER_ARC_I_CLS_NO_SIG( + CHandler(false), + "lzma", "lzma", 0, 0xA, + 0, + NArcInfoFlags::kStartOpen | + NArcInfoFlags::kKeepName, + IsArc_Lzma) + +} + +namespace NLzma86Ar { + +REGISTER_ARC_I_CLS_NO_SIG( + CHandler(true), + "lzma86", "lzma86", 0, 0xB, + 0, + NArcInfoFlags::kKeepName, + IsArc_Lzma86) + +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/SplitHandler.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/SplitHandler.cpp new file mode 100644 index 0000000000..f20680dfc3 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/SplitHandler.cpp @@ -0,0 +1,359 @@ +// SplitHandler.cpp + +#include "StdAfx.h" + +#include "../../Common/ComTry.h" +#include "../../Common/MyString.h" + +#include "../../Windows/PropVariant.h" + +#include "../Common/ProgressUtils.h" +#include "../Common/RegisterArc.h" + +#include "../Compress/CopyCoder.h" + +#include "Common/MultiStream.h" + +using namespace NWindows; + +namespace NArchive { +namespace NSplit { + +static const Byte kProps[] = +{ + kpidPath, + kpidSize +}; + +static const Byte kArcProps[] = +{ + kpidNumVolumes, + kpidTotalPhySize +}; + +class CHandler: + public IInArchive, + public IInArchiveGetStream, + public CMyUnknownImp +{ + CObjectVector > _streams; + CRecordVector _sizes; + UString _subName; + UInt64 _totalSize; + + HRESULT Open2(IInStream *stream, IArchiveOpenCallback *callback); +public: + MY_UNKNOWN_IMP2(IInArchive, IInArchiveGetStream) + INTERFACE_IInArchive(;) + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream); +}; + +IMP_IInArchive_Props +IMP_IInArchive_ArcProps + +STDMETHODIMP CHandler::GetArchiveProperty(PROPID propID, PROPVARIANT *value) +{ + NCOM::CPropVariant prop; + switch (propID) + { + case kpidMainSubfile: prop = (UInt32)0; break; + case kpidPhySize: if (!_sizes.IsEmpty()) prop = _sizes[0]; break; + case kpidTotalPhySize: prop = _totalSize; break; + case kpidNumVolumes: prop = (UInt32)_streams.Size(); break; + } + prop.Detach(value); + return S_OK; +} + +struct CSeqName +{ + UString _unchangedPart; + UString _changedPart; + bool _splitStyle; + + bool GetNextName(UString &s) + { + { + unsigned i = _changedPart.Len(); + for (;;) + { + wchar_t c = _changedPart[--i]; + + if (_splitStyle) + { + if (c == 'z') + { + _changedPart.ReplaceOneCharAtPos(i, L'a'); + if (i == 0) + return false; + continue; + } + else if (c == 'Z') + { + _changedPart.ReplaceOneCharAtPos(i, L'A'); + if (i == 0) + return false; + continue; + } + } + else + { + if (c == '9') + { + _changedPart.ReplaceOneCharAtPos(i, L'0'); + if (i == 0) + { + _changedPart.InsertAtFront(L'1'); + break; + } + continue; + } + } + + c++; + _changedPart.ReplaceOneCharAtPos(i, c); + break; + } + } + + s = _unchangedPart + _changedPart; + return true; + } +}; + +HRESULT CHandler::Open2(IInStream *stream, IArchiveOpenCallback *callback) +{ + Close(); + if (!callback) + return S_FALSE; + + CMyComPtr volumeCallback; + callback->QueryInterface(IID_IArchiveOpenVolumeCallback, (void **)&volumeCallback); + if (!volumeCallback) + return S_FALSE; + + UString name; + { + NCOM::CPropVariant prop; + RINOK(volumeCallback->GetProperty(kpidName, &prop)); + if (prop.vt != VT_BSTR) + return S_FALSE; + name = prop.bstrVal; + } + + int dotPos = name.ReverseFind_Dot(); + const UString prefix = name.Left(dotPos + 1); + const UString ext = name.Ptr(dotPos + 1); + UString ext2 = ext; + ext2.MakeLower_Ascii(); + + CSeqName seqName; + + unsigned numLetters = 2; + bool splitStyle = false; + + if (ext2.Len() >= 2 && StringsAreEqual_Ascii(ext2.RightPtr(2), "aa")) + { + splitStyle = true; + while (numLetters < ext2.Len()) + { + if (ext2[ext2.Len() - numLetters - 1] != 'a') + break; + numLetters++; + } + } + else if (ext.Len() >= 2 && StringsAreEqual_Ascii(ext2.RightPtr(2), "01")) + { + while (numLetters < ext2.Len()) + { + if (ext2[ext2.Len() - numLetters - 1] != '0') + break; + numLetters++; + } + if (numLetters != ext.Len()) + return S_FALSE; + } + else + return S_FALSE; + + seqName._unchangedPart = prefix + ext.Left(ext2.Len() - numLetters); + seqName._changedPart = ext.RightPtr(numLetters); + seqName._splitStyle = splitStyle; + + if (prefix.Len() < 1) + _subName.SetFromAscii("file"); + else + _subName.SetFrom(prefix, prefix.Len() - 1); + + UInt64 size; + { + /* + NCOM::CPropVariant prop; + RINOK(volumeCallback->GetProperty(kpidSize, &prop)); + if (prop.vt != VT_UI8) + return E_INVALIDARG; + size = prop.uhVal.QuadPart; + */ + RINOK(stream->Seek(0, STREAM_SEEK_END, &size)); + RINOK(stream->Seek(0, STREAM_SEEK_SET, NULL)); + } + + _totalSize += size; + _sizes.Add(size); + _streams.Add(stream); + + { + const UInt64 numFiles = _streams.Size(); + RINOK(callback->SetCompleted(&numFiles, NULL)); + } + + for (;;) + { + UString fullName; + if (!seqName.GetNextName(fullName)) + break; + CMyComPtr nextStream; + HRESULT result = volumeCallback->GetStream(fullName, &nextStream); + if (result == S_FALSE) + break; + if (result != S_OK) + return result; + if (!nextStream) + break; + { + /* + NCOM::CPropVariant prop; + RINOK(volumeCallback->GetProperty(kpidSize, &prop)); + if (prop.vt != VT_UI8) + return E_INVALIDARG; + size = prop.uhVal.QuadPart; + */ + RINOK(nextStream->Seek(0, STREAM_SEEK_END, &size)); + RINOK(nextStream->Seek(0, STREAM_SEEK_SET, NULL)); + } + _totalSize += size; + _sizes.Add(size); + _streams.Add(nextStream); + { + const UInt64 numFiles = _streams.Size(); + RINOK(callback->SetCompleted(&numFiles, NULL)); + } + } + + if (_streams.Size() == 1) + { + if (splitStyle) + return S_FALSE; + } + return S_OK; +} + +STDMETHODIMP CHandler::Open(IInStream *stream, const UInt64 *, IArchiveOpenCallback *callback) +{ + COM_TRY_BEGIN + HRESULT res = Open2(stream, callback); + if (res != S_OK) + Close(); + return res; + COM_TRY_END +} + +STDMETHODIMP CHandler::Close() +{ + _totalSize = 0; + _subName.Empty(); + _streams.Clear(); + _sizes.Clear(); + return S_OK; +} + +STDMETHODIMP CHandler::GetNumberOfItems(UInt32 *numItems) +{ + *numItems = _streams.IsEmpty() ? 0 : 1; + return S_OK; +} + +STDMETHODIMP CHandler::GetProperty(UInt32 /* index */, PROPID propID, PROPVARIANT *value) +{ + NCOM::CPropVariant prop; + switch (propID) + { + case kpidPath: prop = _subName; break; + case kpidSize: + case kpidPackSize: + prop = _totalSize; + break; + } + prop.Detach(value); + return S_OK; +} + +STDMETHODIMP CHandler::Extract(const UInt32 *indices, UInt32 numItems, + Int32 testMode, IArchiveExtractCallback *extractCallback) +{ + COM_TRY_BEGIN + if (numItems == 0) + return S_OK; + if (numItems != (UInt32)(Int32)-1 && (numItems != 1 || indices[0] != 0)) + return E_INVALIDARG; + + UInt64 currentTotalSize = 0; + RINOK(extractCallback->SetTotal(_totalSize)); + CMyComPtr outStream; + Int32 askMode = testMode ? + NExtract::NAskMode::kTest : + NExtract::NAskMode::kExtract; + RINOK(extractCallback->GetStream(0, &outStream, askMode)); + if (!testMode && !outStream) + return S_OK; + RINOK(extractCallback->PrepareOperation(askMode)); + + NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; + CMyComPtr copyCoder = copyCoderSpec; + + CLocalProgress *lps = new CLocalProgress; + CMyComPtr progress = lps; + lps->Init(extractCallback, false); + + FOR_VECTOR (i, _streams) + { + lps->InSize = lps->OutSize = currentTotalSize; + RINOK(lps->SetCur()); + IInStream *inStream = _streams[i]; + RINOK(inStream->Seek(0, STREAM_SEEK_SET, NULL)); + RINOK(copyCoder->Code(inStream, outStream, NULL, NULL, progress)); + currentTotalSize += copyCoderSpec->TotalSize; + } + outStream.Release(); + return extractCallback->SetOperationResult(NExtract::NOperationResult::kOK); + COM_TRY_END +} + +STDMETHODIMP CHandler::GetStream(UInt32 index, ISequentialInStream **stream) +{ + COM_TRY_BEGIN + if (index != 0) + return E_INVALIDARG; + *stream = 0; + CMultiStream *streamSpec = new CMultiStream; + CMyComPtr streamTemp = streamSpec; + FOR_VECTOR (i, _streams) + { + CMultiStream::CSubStreamInfo subStreamInfo; + subStreamInfo.Stream = _streams[i]; + subStreamInfo.Size = _sizes[i]; + streamSpec->Streams.Add(subStreamInfo); + } + streamSpec->Init(); + *stream = streamTemp.Detach(); + return S_OK; + COM_TRY_END +} + +REGISTER_ARC_I_NO_SIG( + "Split", "001", 0, 0xEA, + 0, + 0, + NULL) + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/StdAfx.h new file mode 100644 index 0000000000..eac94d6c65 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Archive/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../Common/Common.h" +#include "../../../../src/LzmaAppleCommon.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CWrappers.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CWrappers.cpp new file mode 100644 index 0000000000..8bf3718f4a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CWrappers.cpp @@ -0,0 +1,230 @@ +// CWrappers.h + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "CWrappers.h" + +#include "StreamUtils.h" + +#define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1) + +#define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x) + +static SRes CompressProgress(void *pp, UInt64 inSize, UInt64 outSize) throw() +{ + CCompressProgressWrap *p = (CCompressProgressWrap *)pp; + p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize)); + return (SRes)p->Res; +} + +CCompressProgressWrap::CCompressProgressWrap(ICompressProgressInfo *progress) throw() +{ + p.Progress = CompressProgress; + Progress = progress; + Res = SZ_OK; +} + +static const UInt32 kStreamStepSize = (UInt32)1 << 31; + +SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes) +{ + switch (res) + { + case S_OK: return SZ_OK; + case E_OUTOFMEMORY: return SZ_ERROR_MEM; + case E_INVALIDARG: return SZ_ERROR_PARAM; + case E_ABORT: return SZ_ERROR_PROGRESS; + case S_FALSE: return SZ_ERROR_DATA; + case E_NOTIMPL: return SZ_ERROR_UNSUPPORTED; + } + return defaultRes; +} + +static SRes MyRead(void *object, void *data, size_t *size) throw() +{ + CSeqInStreamWrap *p = (CSeqInStreamWrap *)object; + UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize); + p->Res = (p->Stream->Read(data, curSize, &curSize)); + *size = curSize; + p->Processed += curSize; + if (p->Res == S_OK) + return SZ_OK; + return HRESULT_To_SRes(p->Res, SZ_ERROR_READ); +} + +static size_t MyWrite(void *object, const void *data, size_t size) throw() +{ + CSeqOutStreamWrap *p = (CSeqOutStreamWrap *)object; + if (p->Stream) + { + p->Res = WriteStream(p->Stream, data, size); + if (p->Res != 0) + return 0; + } + else + p->Res = S_OK; + p->Processed += size; + return size; +} + +CSeqInStreamWrap::CSeqInStreamWrap(ISequentialInStream *stream) throw() +{ + p.Read = MyRead; + Stream = stream; + Processed = 0; +} + +CSeqOutStreamWrap::CSeqOutStreamWrap(ISequentialOutStream *stream) throw() +{ + p.Write = MyWrite; + Stream = stream; + Res = SZ_OK; + Processed = 0; +} + +HRESULT SResToHRESULT(SRes res) throw() +{ + switch (res) + { + case SZ_OK: return S_OK; + case SZ_ERROR_MEM: return E_OUTOFMEMORY; + case SZ_ERROR_PARAM: return E_INVALIDARG; + case SZ_ERROR_PROGRESS: return E_ABORT; + case SZ_ERROR_DATA: return S_FALSE; + case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL; + } + return E_FAIL; +} + +static SRes InStreamWrap_Read(void *pp, void *data, size_t *size) throw() +{ + CSeekInStreamWrap *p = (CSeekInStreamWrap *)pp; + UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize); + p->Res = p->Stream->Read(data, curSize, &curSize); + *size = curSize; + return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ; +} + +static SRes InStreamWrap_Seek(void *pp, Int64 *offset, ESzSeek origin) throw() +{ + CSeekInStreamWrap *p = (CSeekInStreamWrap *)pp; + UInt32 moveMethod; + switch (origin) + { + case SZ_SEEK_SET: moveMethod = STREAM_SEEK_SET; break; + case SZ_SEEK_CUR: moveMethod = STREAM_SEEK_CUR; break; + case SZ_SEEK_END: moveMethod = STREAM_SEEK_END; break; + default: return SZ_ERROR_PARAM; + } + UInt64 newPosition; + p->Res = p->Stream->Seek(*offset, moveMethod, &newPosition); + *offset = (Int64)newPosition; + return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ; +} + +CSeekInStreamWrap::CSeekInStreamWrap(IInStream *stream) throw() +{ + Stream = stream; + p.Read = InStreamWrap_Read; + p.Seek = InStreamWrap_Seek; + Res = S_OK; +} + + +/* ---------- CByteInBufWrap ---------- */ + +void CByteInBufWrap::Free() throw() +{ + ::MidFree(Buf); + Buf = 0; +} + +bool CByteInBufWrap::Alloc(UInt32 size) throw() +{ + if (Buf == 0 || size != Size) + { + Free(); + Lim = Cur = Buf = (Byte *)::MidAlloc((size_t)size); + Size = size; + } + return (Buf != 0); +} + +Byte CByteInBufWrap::ReadByteFromNewBlock() throw() +{ + if (Res == S_OK) + { + UInt32 avail; + Processed += (Cur - Buf); + Res = Stream->Read(Buf, Size, &avail); + Cur = Buf; + Lim = Buf + avail; + if (avail != 0) + return *Cur++; + } + Extra = true; + return 0; +} + +static Byte Wrap_ReadByte(void *pp) throw() +{ + CByteInBufWrap *p = (CByteInBufWrap *)pp; + if (p->Cur != p->Lim) + return *p->Cur++; + return p->ReadByteFromNewBlock(); +} + +CByteInBufWrap::CByteInBufWrap(): Buf(0) +{ + p.Read = Wrap_ReadByte; +} + + +/* ---------- CByteOutBufWrap ---------- */ + +void CByteOutBufWrap::Free() throw() +{ + ::MidFree(Buf); + Buf = 0; +} + +bool CByteOutBufWrap::Alloc(size_t size) throw() +{ + if (Buf == 0 || size != Size) + { + Free(); + Buf = (Byte *)::MidAlloc(size); + Size = size; + } + return (Buf != 0); +} + +HRESULT CByteOutBufWrap::Flush() throw() +{ + if (Res == S_OK) + { + size_t size = (Cur - Buf); + Res = WriteStream(Stream, Buf, size); + if (Res == S_OK) + Processed += size; + Cur = Buf; + } + return Res; +} + +static void Wrap_WriteByte(void *pp, Byte b) throw() +{ + CByteOutBufWrap *p = (CByteOutBufWrap *)pp; + Byte *dest = p->Cur; + *dest = b; + p->Cur = ++dest; + if (dest == p->Lim) + p->Flush(); +} + +CByteOutBufWrap::CByteOutBufWrap() throw(): Buf(0) +{ + p.Write = Wrap_WriteByte; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CWrappers.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CWrappers.h new file mode 100644 index 0000000000..08721333cb --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CWrappers.h @@ -0,0 +1,114 @@ +// CWrappers.h + +#ifndef __C_WRAPPERS_H +#define __C_WRAPPERS_H + +#include "../ICoder.h" +#include "../../Common/MyCom.h" + +struct CCompressProgressWrap +{ + ICompressProgress p; + ICompressProgressInfo *Progress; + HRESULT Res; + + CCompressProgressWrap(ICompressProgressInfo *progress) throw(); +}; + +struct CSeqInStreamWrap +{ + ISeqInStream p; + ISequentialInStream *Stream; + HRESULT Res; + UInt64 Processed; + + CSeqInStreamWrap(ISequentialInStream *stream) throw(); +}; + +struct CSeekInStreamWrap +{ + ISeekInStream p; + IInStream *Stream; + HRESULT Res; + + CSeekInStreamWrap(IInStream *stream) throw(); +}; + +struct CSeqOutStreamWrap +{ + ISeqOutStream p; + ISequentialOutStream *Stream; + HRESULT Res; + UInt64 Processed; + + CSeqOutStreamWrap(ISequentialOutStream *stream) throw(); +}; + +HRESULT SResToHRESULT(SRes res) throw(); + +struct CByteInBufWrap +{ + IByteIn p; + const Byte *Cur; + const Byte *Lim; + Byte *Buf; + UInt32 Size; + ISequentialInStream *Stream; + UInt64 Processed; + bool Extra; + HRESULT Res; + + CByteInBufWrap(); + ~CByteInBufWrap() { Free(); } + void Free() throw(); + bool Alloc(UInt32 size) throw(); + void Init() + { + Lim = Cur = Buf; + Processed = 0; + Extra = false; + Res = S_OK; + } + UInt64 GetProcessed() const { return Processed + (Cur - Buf); } + Byte ReadByteFromNewBlock() throw(); + Byte ReadByte() + { + if (Cur != Lim) + return *Cur++; + return ReadByteFromNewBlock(); + } +}; + +struct CByteOutBufWrap +{ + IByteOut p; + Byte *Cur; + const Byte *Lim; + Byte *Buf; + size_t Size; + ISequentialOutStream *Stream; + UInt64 Processed; + HRESULT Res; + + CByteOutBufWrap() throw(); + ~CByteOutBufWrap() { Free(); } + void Free() throw(); + bool Alloc(size_t size) throw(); + void Init() + { + Cur = Buf; + Lim = Buf + Size; + Processed = 0; + Res = S_OK; + } + UInt64 GetProcessed() const { return Processed + (Cur - Buf); } + HRESULT Flush() throw(); + void WriteByte(Byte b) + { + *Cur++ = b; + if (Cur == Lim) + Flush(); + } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CreateCoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CreateCoder.cpp new file mode 100644 index 0000000000..b3f84f1a40 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CreateCoder.cpp @@ -0,0 +1,471 @@ +// CreateCoder.cpp + +#include "StdAfx.h" + +#include "../../Windows/Defs.h" +#include "../../Windows/PropVariant.h" + +#include "CreateCoder.h" + +#include "FilterCoder.h" +#include "RegisterCodec.h" + +#if defined(LZMASDKOBJC_OMIT_UNUSED_CODE) +static const uint8_t kNumCodecsMax = 20; +uint8_t g_NumCodecs = 0; +#else +static const unsigned kNumCodecsMax = 64; +unsigned g_NumCodecs = 0; +#endif +const CCodecInfo *g_Codecs[kNumCodecsMax]; + +// We use g_ExternalCodecs in other stages. +/* +#ifdef EXTERNAL_CODECS +extern CExternalCodecs g_ExternalCodecs; +#define CHECK_GLOBAL_CODECS \ + if (!__externalCodecs || !__externalCodecs->IsSet()) __externalCodecs = &g_ExternalCodecs; +#endif +*/ + +#define CHECK_GLOBAL_CODECS + +void RegisterCodec(const CCodecInfo *codecInfo) throw() +{ + if (g_NumCodecs < kNumCodecsMax) + g_Codecs[g_NumCodecs++] = codecInfo; +} + +#if defined(LZMASDKOBJC_OMIT_UNUSED_CODE) +static const uint8_t kNumHashersMax = 10; +uint8_t g_NumHashers = 0; +#else +static const unsigned kNumHashersMax = 16; +unsigned g_NumHashers = 0; +#endif +const CHasherInfo *g_Hashers[kNumHashersMax]; + +void RegisterHasher(const CHasherInfo *hashInfo) throw() +{ + if (g_NumHashers < kNumHashersMax) + g_Hashers[g_NumHashers++] = hashInfo; +} + + +#ifdef EXTERNAL_CODECS + +static HRESULT ReadNumberOfStreams(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, UInt32 &res) +{ + NWindows::NCOM::CPropVariant prop; + RINOK(codecsInfo->GetProperty(index, propID, &prop)); + if (prop.vt == VT_EMPTY) + res = 1; + else if (prop.vt == VT_UI4) + res = prop.ulVal; + else + return E_INVALIDARG; + return S_OK; +} + +static HRESULT ReadIsAssignedProp(ICompressCodecsInfo *codecsInfo, UInt32 index, PROPID propID, bool &res) +{ + NWindows::NCOM::CPropVariant prop; + RINOK(codecsInfo->GetProperty(index, propID, &prop)); + if (prop.vt == VT_EMPTY) + res = true; + else if (prop.vt == VT_BOOL) + res = VARIANT_BOOLToBool(prop.boolVal); + else + return E_INVALIDARG; + return S_OK; +} + +HRESULT CExternalCodecs::Load() +{ + Codecs.Clear(); + Hashers.Clear(); + + if (GetCodecs) + { + CCodecInfoEx info; + + UString s; + UInt32 num; + RINOK(GetCodecs->GetNumMethods(&num)); + + for (UInt32 i = 0; i < num; i++) + { + NWindows::NCOM::CPropVariant prop; + + RINOK(GetCodecs->GetProperty(i, NMethodPropID::kID, &prop)); + if (prop.vt != VT_UI8) + continue; // old Interface + info.Id = prop.uhVal.QuadPart; + + prop.Clear(); + + info.Name.Empty(); + RINOK(GetCodecs->GetProperty(i, NMethodPropID::kName, &prop)); + if (prop.vt == VT_BSTR) + info.Name.SetFromWStr_if_Ascii(prop.bstrVal); + else if (prop.vt != VT_EMPTY) + continue; + + RINOK(ReadNumberOfStreams(GetCodecs, i, NMethodPropID::kPackStreams, info.NumStreams)); + { + UInt32 numUnpackStreams = 1; + RINOK(ReadNumberOfStreams(GetCodecs, i, NMethodPropID::kUnpackStreams, numUnpackStreams)); + if (numUnpackStreams != 1) + continue; + } + RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kEncoderIsAssigned, info.EncoderIsAssigned)); + RINOK(ReadIsAssignedProp(GetCodecs, i, NMethodPropID::kDecoderIsAssigned, info.DecoderIsAssigned)); + + Codecs.Add(info); + } + } + + if (GetHashers) + { + UInt32 num = GetHashers->GetNumHashers(); + CHasherInfoEx info; + + for (UInt32 i = 0; i < num; i++) + { + NWindows::NCOM::CPropVariant prop; + + RINOK(GetHashers->GetHasherProp(i, NMethodPropID::kID, &prop)); + if (prop.vt != VT_UI8) + continue; + info.Id = prop.uhVal.QuadPart; + + prop.Clear(); + + info.Name.Empty(); + RINOK(GetHashers->GetHasherProp(i, NMethodPropID::kName, &prop)); + if (prop.vt == VT_BSTR) + info.Name.SetFromWStr_if_Ascii(prop.bstrVal); + else if (prop.vt != VT_EMPTY) + continue; + + Hashers.Add(info); + } + } + + return S_OK; +} + +#endif + + +bool FindMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + const AString &name, + CMethodId &methodId, UInt32 &numStreams) +{ + unsigned i; + for (i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (StringsAreEqualNoCase_Ascii(name, codec.Name)) + { + methodId = codec.Id; + numStreams = codec.NumStreams; + return true; + } + } + + #ifdef EXTERNAL_CODECS + + CHECK_GLOBAL_CODECS + + if (__externalCodecs) + for (i = 0; i < __externalCodecs->Codecs.Size(); i++) + { + const CCodecInfoEx &codec = __externalCodecs->Codecs[i]; + if (StringsAreEqualNoCase_Ascii(name, codec.Name)) + { + methodId = codec.Id; + numStreams = codec.NumStreams; + return true; + } + } + + #endif + + return false; +} + +bool FindMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + AString &name) +{ + name.Empty(); + + unsigned i; + for (i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (methodId == codec.Id) + { + name = codec.Name; + return true; + } + } + + #ifdef EXTERNAL_CODECS + + CHECK_GLOBAL_CODECS + + if (__externalCodecs) + for (i = 0; i < __externalCodecs->Codecs.Size(); i++) + { + const CCodecInfoEx &codec = __externalCodecs->Codecs[i]; + if (methodId == codec.Id) + { + name = codec.Name; + return true; + } + } + + #endif + + return false; +} + +bool FindHashMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + const AString &name, + CMethodId &methodId) +{ + unsigned i; + for (i = 0; i < g_NumHashers; i++) + { + const CHasherInfo &codec = *g_Hashers[i]; + if (StringsAreEqualNoCase_Ascii(name, codec.Name)) + { + methodId = codec.Id; + return true; + } + } + + #ifdef EXTERNAL_CODECS + + CHECK_GLOBAL_CODECS + + if (__externalCodecs) + for (i = 0; i < __externalCodecs->Hashers.Size(); i++) + { + const CHasherInfoEx &codec = __externalCodecs->Hashers[i]; + if (StringsAreEqualNoCase_Ascii(name, codec.Name)) + { + methodId = codec.Id; + return true; + } + } + + #endif + + return false; +} + +void GetHashMethods( + DECL_EXTERNAL_CODECS_LOC_VARS + CRecordVector &methods) +{ + methods.ClearAndSetSize(g_NumHashers); + unsigned i; + for (i = 0; i < g_NumHashers; i++) + methods[i] = (*g_Hashers[i]).Id; + + #ifdef EXTERNAL_CODECS + + CHECK_GLOBAL_CODECS + + if (__externalCodecs) + for (i = 0; i < __externalCodecs->Hashers.Size(); i++) + methods.Add(__externalCodecs->Hashers[i].Id); + + #endif +} + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CMyComPtr &filter, + CCreatedCoder &cod) +{ + cod.IsExternal = false; + cod.IsFilter = false; + cod.NumStreams = 1; + + unsigned i; + for (i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + if (codec.Id == methodId) + { + if (encode) + { + if (codec.CreateEncoder) + { + void *p = codec.CreateEncoder(); + if (codec.IsFilter) filter = (ICompressFilter *)p; + else if (codec.NumStreams == 1) cod.Coder = (ICompressCoder *)p; + else { cod.Coder2 = (ICompressCoder2 *)p; cod.NumStreams = codec.NumStreams; } + return S_OK; + } + } + else + if (codec.CreateDecoder) + { + void *p = codec.CreateDecoder(); + if (codec.IsFilter) filter = (ICompressFilter *)p; + else if (codec.NumStreams == 1) cod.Coder = (ICompressCoder *)p; + else { cod.Coder2 = (ICompressCoder2 *)p; cod.NumStreams = codec.NumStreams; } + return S_OK; + } + } + } + + #ifdef EXTERNAL_CODECS + + CHECK_GLOBAL_CODECS + + if (__externalCodecs) + { + cod.IsExternal = true; + for (i = 0; i < __externalCodecs->Codecs.Size(); i++) + { + const CCodecInfoEx &codec = __externalCodecs->Codecs[i]; + if (codec.Id == methodId) + { + if (encode) + { + if (codec.EncoderIsAssigned) + { + if (codec.NumStreams == 1) + { + HRESULT res = __externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressCoder, (void **)&cod.Coder); + if (res != S_OK && res != E_NOINTERFACE && res != CLASS_E_CLASSNOTAVAILABLE) + return res; + if (cod.Coder) + return res; + return __externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressFilter, (void **)&filter); + } + cod.NumStreams = codec.NumStreams; + return __externalCodecs->GetCodecs->CreateEncoder(i, &IID_ICompressCoder2, (void **)&cod.Coder2); + } + } + else + if (codec.DecoderIsAssigned) + { + if (codec.NumStreams == 1) + { + HRESULT res = __externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressCoder, (void **)&cod.Coder); + if (res != S_OK && res != E_NOINTERFACE && res != CLASS_E_CLASSNOTAVAILABLE) + return res; + if (cod.Coder) + return res; + return __externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressFilter, (void **)&filter); + } + cod.NumStreams = codec.NumStreams; + return __externalCodecs->GetCodecs->CreateDecoder(i, &IID_ICompressCoder2, (void **)&cod.Coder2); + } + } + } + } + #endif + + return S_OK; +} + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CCreatedCoder &cod) +{ + CMyComPtr filter; + HRESULT res = CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodId, encode, + filter, cod); + + if (filter) + { + cod.IsFilter = true; + CFilterCoder *coderSpec = new CFilterCoder(encode); + cod.Coder = coderSpec; + coderSpec->Filter = filter; + } + + return res; +} + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CMyComPtr &coder) +{ + CCreatedCoder cod; + HRESULT res = CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodId, encode, + cod); + coder = cod.Coder; + return res; +} + +HRESULT CreateFilter( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CMyComPtr &filter) +{ + CCreatedCoder cod; + return CreateCoder( + EXTERNAL_CODECS_LOC_VARS + methodId, encode, + filter, cod); +} + + +HRESULT CreateHasher( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + AString &name, + CMyComPtr &hasher) +{ + name.Empty(); + + unsigned i; + for (i = 0; i < g_NumHashers; i++) + { + const CHasherInfo &codec = *g_Hashers[i]; + if (codec.Id == methodId) + { + hasher = codec.CreateHasher(); + name = codec.Name; + break; + } + } + + #ifdef EXTERNAL_CODECS + + CHECK_GLOBAL_CODECS + + if (!hasher && __externalCodecs) + for (i = 0; i < __externalCodecs->Hashers.Size(); i++) + { + const CHasherInfoEx &codec = __externalCodecs->Hashers[i]; + if (codec.Id == methodId) + { + name = codec.Name; + return __externalCodecs->GetHashers->CreateHasher((UInt32)i, &hasher); + } + } + + #endif + + return S_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CreateCoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CreateCoder.h new file mode 100644 index 0000000000..e0956e14f0 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/CreateCoder.h @@ -0,0 +1,182 @@ +// CreateCoder.h + +#ifndef __CREATE_CODER_H +#define __CREATE_CODER_H + +#include "../../Common/MyCom.h" +#include "../../Common/MyString.h" + +#include "../ICoder.h" + +#include "MethodId.h" + +/* + if EXTERNAL_CODECS is not defined, the code supports only codecs that + are statically linked at compile-time and link-time. + + if EXTERNAL_CODECS is defined, the code supports also codecs from another + executable modules, that can be linked dynamically at run-time: + - EXE module can use codecs from external DLL files. + - DLL module can use codecs from external EXE and DLL files. + + CExternalCodecs contains information about codecs and interfaces to create them. + + The order of codecs: + 1) Internal codecs + 2) External codecs +*/ + +#ifdef EXTERNAL_CODECS + +struct CCodecInfoEx +{ + CMethodId Id; + AString Name; + UInt32 NumStreams; + bool EncoderIsAssigned; + bool DecoderIsAssigned; + + CCodecInfoEx(): EncoderIsAssigned(false), DecoderIsAssigned(false) {} +}; + +struct CHasherInfoEx +{ + CMethodId Id; + AString Name; +}; + +#define PUBLIC_ISetCompressCodecsInfo public ISetCompressCodecsInfo, +#define QUERY_ENTRY_ISetCompressCodecsInfo MY_QUERYINTERFACE_ENTRY(ISetCompressCodecsInfo) +#define DECL_ISetCompressCodecsInfo STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo); +#define IMPL_ISetCompressCodecsInfo2(x) \ +STDMETHODIMP x::SetCompressCodecsInfo(ICompressCodecsInfo *compressCodecsInfo) { \ + COM_TRY_BEGIN __externalCodecs.GetCodecs = compressCodecsInfo; return __externalCodecs.Load(); COM_TRY_END } +#define IMPL_ISetCompressCodecsInfo IMPL_ISetCompressCodecsInfo2(CHandler) + +struct CExternalCodecs +{ + CMyComPtr GetCodecs; + CMyComPtr GetHashers; + + CObjectVector Codecs; + CObjectVector Hashers; + + bool IsSet() const { return GetCodecs != NULL || GetHashers != NULL; } + + HRESULT Load(); + + void ClearAndRelease() + { + Hashers.Clear(); + Codecs.Clear(); + GetHashers.Release(); + GetCodecs.Release(); + } + + ~CExternalCodecs() + { + GetHashers.Release(); + GetCodecs.Release(); + } +}; + +extern CExternalCodecs g_ExternalCodecs; + +#define EXTERNAL_CODECS_VARS2 (__externalCodecs.IsSet() ? &__externalCodecs : &g_ExternalCodecs) +#define EXTERNAL_CODECS_VARS2_L (&__externalCodecs) +#define EXTERNAL_CODECS_VARS2_G (&g_ExternalCodecs) + +#define DECL_EXTERNAL_CODECS_VARS CExternalCodecs __externalCodecs; + +#define EXTERNAL_CODECS_VARS EXTERNAL_CODECS_VARS2, +#define EXTERNAL_CODECS_VARS_L EXTERNAL_CODECS_VARS2_L, +#define EXTERNAL_CODECS_VARS_G EXTERNAL_CODECS_VARS2_G, + +#define DECL_EXTERNAL_CODECS_LOC_VARS2 const CExternalCodecs *__externalCodecs +#define EXTERNAL_CODECS_LOC_VARS2 __externalCodecs + +#define DECL_EXTERNAL_CODECS_LOC_VARS DECL_EXTERNAL_CODECS_LOC_VARS2, +#define EXTERNAL_CODECS_LOC_VARS EXTERNAL_CODECS_LOC_VARS2, + +#else + +#define PUBLIC_ISetCompressCodecsInfo +#define QUERY_ENTRY_ISetCompressCodecsInfo +#define DECL_ISetCompressCodecsInfo +#define IMPL_ISetCompressCodecsInfo +#define EXTERNAL_CODECS_VARS2 +#define DECL_EXTERNAL_CODECS_VARS +#define EXTERNAL_CODECS_VARS +#define EXTERNAL_CODECS_VARS_L +#define EXTERNAL_CODECS_VARS_G +#define DECL_EXTERNAL_CODECS_LOC_VARS2 +#define EXTERNAL_CODECS_LOC_VARS2 +#define DECL_EXTERNAL_CODECS_LOC_VARS +#define EXTERNAL_CODECS_LOC_VARS + +#endif + + + + +bool FindMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + const AString &name, + CMethodId &methodId, UInt32 &numStreams); + +bool FindMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + AString &name); + +bool FindHashMethod( + DECL_EXTERNAL_CODECS_LOC_VARS + const AString &name, + CMethodId &methodId); + +void GetHashMethods( + DECL_EXTERNAL_CODECS_LOC_VARS + CRecordVector &methods); + + +struct CCreatedCoder +{ + CMyComPtr Coder; + CMyComPtr Coder2; + + bool IsExternal; + bool IsFilter; // = true, if Coder was created from filter + UInt32 NumStreams; + + // CCreatedCoder(): IsExternal(false), IsFilter(false), NumStreams(1) {} +}; + + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CMyComPtr &filter, + CCreatedCoder &cod); + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CCreatedCoder &cod); + +HRESULT CreateCoder( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CMyComPtr &coder); + +HRESULT CreateFilter( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, bool encode, + CMyComPtr &filter); + +HRESULT CreateHasher( + DECL_EXTERNAL_CODECS_LOC_VARS + CMethodId methodId, + AString &name, + CMyComPtr &hasher); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilePathAutoRename.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilePathAutoRename.cpp new file mode 100644 index 0000000000..6cbadf51ac --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilePathAutoRename.cpp @@ -0,0 +1,51 @@ +// FilePathAutoRename.cpp + +#include "StdAfx.h" + +#include "../../Common/Defs.h" +#include "../../Common/IntToString.h" + +#include "../../Windows/FileFind.h" + +#include "FilePathAutoRename.h" + +using namespace NWindows; + +static bool MakeAutoName(const FString &name, + const FString &extension, UInt32 value, FString &path) +{ + char temp[16]; + ConvertUInt32ToString(value, temp); + path = name; + path.AddAscii(temp); + path += extension; + return NFile::NFind::DoesFileOrDirExist(path); +} + +bool AutoRenamePath(FString &path) +{ + int dotPos = path.ReverseFind_Dot(); + int slashPos = path.ReverseFind_PathSepar(); + + FString name = path; + FString extension; + if (dotPos > slashPos + 1) + { + name.DeleteFrom(dotPos); + extension = path.Ptr(dotPos); + } + name += FTEXT('_'); + + FString temp; + + UInt32 left = 1, right = ((UInt32)1 << 30); + while (left != right) + { + UInt32 mid = (left + right) / 2; + if (MakeAutoName(name, extension, mid, temp)) + left = mid + 1; + else + right = mid; + } + return !MakeAutoName(name, extension, right, path); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilePathAutoRename.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilePathAutoRename.h new file mode 100644 index 0000000000..cb2d71b409 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilePathAutoRename.h @@ -0,0 +1,10 @@ +// FilePathAutoRename.h + +#ifndef __FILE_PATH_AUTO_RENAME_H +#define __FILE_PATH_AUTO_RENAME_H + +#include "../../Common/MyString.h" + +bool AutoRenamePath(FString &fullProcessedPath); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FileStreams.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FileStreams.cpp new file mode 100644 index 0000000000..844d733984 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FileStreams.cpp @@ -0,0 +1,478 @@ +// FileStreams.cpp + +#include "StdAfx.h" + +#ifndef _WIN32 +#include +#include +#include +#endif + +#ifdef SUPPORT_DEVICE_FILE +#include "../../../C/Alloc.h" +#include "../../Common/Defs.h" +#endif + +#include "FileStreams.h" + +static inline HRESULT ConvertBoolToHRESULT(bool result) +{ + #ifdef _WIN32 + if (result) + return S_OK; + DWORD lastError = ::GetLastError(); + if (lastError == 0) + return E_FAIL; + return HRESULT_FROM_WIN32(lastError); + #else + return result ? S_OK: E_FAIL; + #endif +} + + +#if !defined(LZMASDKOBJC_OMIT_UNUSED_CODE) +static const UInt32 kClusterSize = 1 << 18; +#endif + +CInFileStream::CInFileStream(): + #ifdef SUPPORT_DEVICE_FILE + VirtPos(0), + PhyPos(0), + Buf(0), + BufSize(0), + #endif + SupportHardLinks(false), + Callback(NULL), + CallbackRef(0) +{ +} + +CInFileStream::~CInFileStream() +{ + #ifdef SUPPORT_DEVICE_FILE + MidFree(Buf); + #endif + + if (Callback) + Callback->InFileStream_On_Destroy(CallbackRef); +} + +STDMETHODIMP CInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef USE_WIN_FILE + + #ifdef SUPPORT_DEVICE_FILE + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + if (File.IsDeviceFile) + { + if (File.SizeDefined) + { + if (VirtPos >= File.Size) + return VirtPos == File.Size ? S_OK : E_FAIL; + UInt64 rem = File.Size - VirtPos; + if (size > rem) + size = (UInt32)rem; + } + for (;;) + { + const UInt32 mask = kClusterSize - 1; + const UInt64 mask2 = ~(UInt64)mask; + UInt64 alignedPos = VirtPos & mask2; + if (BufSize > 0 && BufStartPos == alignedPos) + { + UInt32 pos = (UInt32)VirtPos & mask; + if (pos >= BufSize) + return S_OK; + UInt32 rem = MyMin(BufSize - pos, size); + memcpy(data, Buf + pos, rem); + VirtPos += rem; + if (processedSize) + *processedSize += rem; + return S_OK; + } + + bool useBuf = false; + if ((VirtPos & mask) != 0 || ((ptrdiff_t)data & mask) != 0 ) + useBuf = true; + else + { + UInt64 end = VirtPos + size; + if ((end & mask) != 0) + { + end &= mask2; + if (end <= VirtPos) + useBuf = true; + else + size = (UInt32)(end - VirtPos); + } + } + if (!useBuf) + break; + if (alignedPos != PhyPos) + { + UInt64 realNewPosition; + bool result = File.Seek(alignedPos, FILE_BEGIN, realNewPosition); + if (!result) + return ConvertBoolToHRESULT(result); + PhyPos = realNewPosition; + } + + BufStartPos = alignedPos; + UInt32 readSize = kClusterSize; + if (File.SizeDefined) + readSize = (UInt32)MyMin(File.Size - PhyPos, (UInt64)kClusterSize); + + if (!Buf) + { + Buf = (Byte *)MidAlloc(kClusterSize); + if (!Buf) + return E_OUTOFMEMORY; + } + bool result = File.Read1(Buf, readSize, BufSize); + if (!result) + return ConvertBoolToHRESULT(result); + + if (BufSize == 0) + return S_OK; + PhyPos += BufSize; + } + + if (VirtPos != PhyPos) + { + UInt64 realNewPosition; + bool result = File.Seek(VirtPos, FILE_BEGIN, realNewPosition); + if (!result) + return ConvertBoolToHRESULT(result); + PhyPos = VirtPos = realNewPosition; + } + } + #endif + + UInt32 realProcessedSize; + bool result = File.ReadPart(data, size, realProcessedSize); + if (processedSize) + *processedSize = realProcessedSize; + + #ifdef SUPPORT_DEVICE_FILE + VirtPos += realProcessedSize; + PhyPos += realProcessedSize; + #endif + + if (result) + return S_OK; + + { + DWORD error = ::GetLastError(); + + if (Callback) + return Callback->InFileStream_On_Error(CallbackRef, error); + if (error == 0) + return E_FAIL; + + return HRESULT_FROM_WIN32(error); + } + + #else + + if (processedSize) + *processedSize = 0; + ssize_t res = File.Read(data, (size_t)size); + if (res == -1) + { + if (Callback) + return Callback->InFileStream_On_Error(CallbackRef, E_FAIL); + return E_FAIL; + } + if (processedSize) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#ifdef UNDER_CE +STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + size_t s2 = fread(data, 1, size, stdin); + int error = ferror(stdin); + if (processedSize) + *processedSize = s2; + if (s2 <= size && error == 0) + return S_OK; + return E_FAIL; +} +#else +STDMETHODIMP CStdInFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef _WIN32 + + DWORD realProcessedSize; + UInt32 sizeTemp = (1 << 20); + if (sizeTemp > size) + sizeTemp = size; + BOOL res = ::ReadFile(GetStdHandle(STD_INPUT_HANDLE), data, sizeTemp, &realProcessedSize, NULL); + if (processedSize) + *processedSize = realProcessedSize; + if (res == FALSE && GetLastError() == ERROR_BROKEN_PIPE) + return S_OK; + return ConvertBoolToHRESULT(res != FALSE); + + #else + + if (processedSize) + *processedSize = 0; + ssize_t res; + do + { + res = read(0, data, (size_t)size); + } + while (res < 0 && (errno == EINTR)); + if (res == -1) + return E_FAIL; + if (processedSize) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#endif + +STDMETHODIMP CInFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if (seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + + #ifdef USE_WIN_FILE + + #ifdef SUPPORT_DEVICE_FILE + if (File.IsDeviceFile && (File.SizeDefined || seekOrigin != STREAM_SEEK_END)) + { + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += VirtPos; break; + case STREAM_SEEK_END: offset += File.Size; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + VirtPos = offset; + if (newPosition) + *newPosition = offset; + return S_OK; + } + #endif + + UInt64 realNewPosition; + bool result = File.Seek(offset, seekOrigin, realNewPosition); + + #ifdef SUPPORT_DEVICE_FILE + PhyPos = VirtPos = realNewPosition; + #endif + + if (newPosition) + *newPosition = realNewPosition; + return ConvertBoolToHRESULT(result); + + #else + + off_t res = File.Seek((off_t)offset, seekOrigin); + if (res == -1) + return E_FAIL; + if (newPosition) + *newPosition = (UInt64)res; + return S_OK; + + #endif +} + +STDMETHODIMP CInFileStream::GetSize(UInt64 *size) +{ + return ConvertBoolToHRESULT(File.GetLength(*size)); +} + +#ifdef USE_WIN_FILE + +STDMETHODIMP CInFileStream::GetProps(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib) +{ + BY_HANDLE_FILE_INFORMATION info; + if (File.GetFileInformation(&info)) + { + if (size) *size = (((UInt64)info.nFileSizeHigh) << 32) + info.nFileSizeLow; + if (cTime) *cTime = info.ftCreationTime; + if (aTime) *aTime = info.ftLastAccessTime; + if (mTime) *mTime = info.ftLastWriteTime; + if (attrib) *attrib = info.dwFileAttributes; + return S_OK; + } + return GetLastError(); +} + +STDMETHODIMP CInFileStream::GetProps2(CStreamFileProps *props) +{ + BY_HANDLE_FILE_INFORMATION info; + if (File.GetFileInformation(&info)) + { + props->Size = (((UInt64)info.nFileSizeHigh) << 32) + info.nFileSizeLow; + props->VolID = info.dwVolumeSerialNumber; + props->FileID_Low = (((UInt64)info.nFileIndexHigh) << 32) + info.nFileIndexLow; + props->FileID_High = 0; + props->NumLinks = SupportHardLinks ? info.nNumberOfLinks : 1; + props->Attrib = info.dwFileAttributes; + props->CTime = info.ftCreationTime; + props->ATime = info.ftLastAccessTime; + props->MTime = info.ftLastWriteTime; + return S_OK; + } + return GetLastError(); +} + +#endif + +////////////////////////// +// COutFileStream + +HRESULT COutFileStream::Close() +{ + return ConvertBoolToHRESULT(File.Close()); +} + +STDMETHODIMP COutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + #ifdef USE_WIN_FILE + + UInt32 realProcessedSize; + bool result = File.Write(data, size, realProcessedSize); + ProcessedSize += realProcessedSize; + if (processedSize) + *processedSize = realProcessedSize; + return ConvertBoolToHRESULT(result); + + #else + + if (processedSize) + *processedSize = 0; + ssize_t res = File.Write(data, (size_t)size); + if (res == -1) + return E_FAIL; + if (processedSize) + *processedSize = (UInt32)res; + ProcessedSize += res; + return S_OK; + + #endif +} + +STDMETHODIMP COutFileStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + if (seekOrigin >= 3) + return STG_E_INVALIDFUNCTION; + + #ifdef USE_WIN_FILE + + UInt64 realNewPosition; + bool result = File.Seek(offset, seekOrigin, realNewPosition); + if (newPosition) + *newPosition = realNewPosition; + return ConvertBoolToHRESULT(result); + + #else + + off_t res = File.Seek((off_t)offset, seekOrigin); + if (res == -1) + return E_FAIL; + if (newPosition) + *newPosition = (UInt64)res; + return S_OK; + + #endif +} + +STDMETHODIMP COutFileStream::SetSize(UInt64 newSize) +{ + #ifdef USE_WIN_FILE + + UInt64 currentPos; + if (!File.Seek(0, FILE_CURRENT, currentPos)) + return E_FAIL; + bool result = File.SetLength(newSize); + UInt64 currentPos2; + result = result && File.Seek(currentPos, currentPos2); + return result ? S_OK : E_FAIL; + + #else + + return E_FAIL; + + #endif +} + +HRESULT COutFileStream::GetSize(UInt64 *size) +{ + return ConvertBoolToHRESULT(File.GetLength(*size)); +} + +#ifdef UNDER_CE + +STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + size_t s2 = fwrite(data, 1, size, stdout); + if (processedSize) + *processedSize = s2; + return (s2 == size) ? S_OK : E_FAIL; +} + +#else + +STDMETHODIMP CStdOutFileStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + #ifdef _WIN32 + + UInt32 realProcessedSize; + BOOL res = TRUE; + if (size > 0) + { + // Seems that Windows doesn't like big amounts writing to stdout. + // So we limit portions by 32KB. + UInt32 sizeTemp = (1 << 15); + if (sizeTemp > size) + sizeTemp = size; + res = ::WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), + data, sizeTemp, (DWORD *)&realProcessedSize, NULL); + _size += realProcessedSize; + size -= realProcessedSize; + data = (const void *)((const Byte *)data + realProcessedSize); + if (processedSize) + *processedSize += realProcessedSize; + } + return ConvertBoolToHRESULT(res != FALSE); + + #else + + ssize_t res; + + do + { + res = write(1, data, (size_t)size); + } + while (res < 0 && (errno == EINTR)); + + if (res == -1) + return E_FAIL; + + _size += (size_t)res; + if (processedSize) + *processedSize = (UInt32)res; + return S_OK; + + #endif +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FileStreams.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FileStreams.h new file mode 100644 index 0000000000..a0996f80ac --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FileStreams.h @@ -0,0 +1,166 @@ +// FileStreams.h + +#ifndef __FILE_STREAMS_H +#define __FILE_STREAMS_H + +#ifdef _WIN32 +#define USE_WIN_FILE +#endif + +#include "../../Common/MyString.h" + +#ifdef USE_WIN_FILE +#include "../../Windows/FileIO.h" +#else +#include "../../Common/C_FileIO.h" +#endif + +#include "../../Common/MyCom.h" + +#include "../IStream.h" + +#ifdef _WIN32 +typedef UINT_PTR My_UINT_PTR; +#else +typedef UINT My_UINT_PTR; +#endif + +struct IInFileStream_Callback +{ + virtual HRESULT InFileStream_On_Error(My_UINT_PTR val, DWORD error) = 0; + virtual void InFileStream_On_Destroy(My_UINT_PTR val) = 0; +}; + +class CInFileStream: + public IInStream, + public IStreamGetSize, + #ifdef USE_WIN_FILE + public IStreamGetProps, + public IStreamGetProps2, + #endif + public CMyUnknownImp +{ +public: + #ifdef USE_WIN_FILE + NWindows::NFile::NIO::CInFile File; + + #ifdef SUPPORT_DEVICE_FILE + UInt64 VirtPos; + UInt64 PhyPos; + UInt64 BufStartPos; + Byte *Buf; + UInt32 BufSize; + #endif + + #else + NC::NFile::NIO::CInFile File; + #endif + + bool SupportHardLinks; + + IInFileStream_Callback *Callback; + My_UINT_PTR CallbackRef; + + virtual ~CInFileStream(); + + CInFileStream(); + + bool Open(CFSTR fileName) + { + return File.Open(fileName); + } + + bool OpenShared(CFSTR fileName, bool shareForWrite) + { + return File.OpenShared(fileName, shareForWrite); + } + + MY_QUERYINTERFACE_BEGIN2(IInStream) + MY_QUERYINTERFACE_ENTRY(IStreamGetSize) + #ifdef USE_WIN_FILE + MY_QUERYINTERFACE_ENTRY(IStreamGetProps) + MY_QUERYINTERFACE_ENTRY(IStreamGetProps2) + #endif + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + + STDMETHOD(GetSize)(UInt64 *size); + #ifdef USE_WIN_FILE + STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib); + STDMETHOD(GetProps2)(CStreamFileProps *props); + #endif +}; + +class CStdInFileStream: + public ISequentialInStream, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP + + virtual ~CStdInFileStream() {} + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); +}; + +class COutFileStream: + public IOutStream, + public CMyUnknownImp +{ +public: + #ifdef USE_WIN_FILE + NWindows::NFile::NIO::COutFile File; + #else + NC::NFile::NIO::COutFile File; + #endif + virtual ~COutFileStream() {} + bool Create(CFSTR fileName, bool createAlways) + { + ProcessedSize = 0; + return File.Create(fileName, createAlways); + } + bool Open(CFSTR fileName, DWORD creationDisposition) + { + ProcessedSize = 0; + return File.Open(fileName, creationDisposition); + } + + HRESULT Close(); + + UInt64 ProcessedSize; + + #ifdef USE_WIN_FILE + bool SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) + { + return File.SetTime(cTime, aTime, mTime); + } + bool SetMTime(const FILETIME *mTime) { return File.SetMTime(mTime); } + #endif + + + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(UInt64 newSize); + + HRESULT GetSize(UInt64 *size); +}; + +class CStdOutFileStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + UInt64 _size; +public: + MY_UNKNOWN_IMP + + UInt64 GetSize() const { return _size; } + CStdOutFileStream(): _size(0) {} + virtual ~CStdOutFileStream() {} + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilterCoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilterCoder.cpp new file mode 100644 index 0000000000..c836e7f00a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilterCoder.cpp @@ -0,0 +1,424 @@ +// FilterCoder.cpp + +#include "StdAfx.h" + +#include "../../Common/Defs.h" + +#include "FilterCoder.h" +#include "StreamUtils.h" + +/* + AES filters need 16-bytes alignment for HARDWARE-AES instructions. + So we call IFilter::Filter(, size), where (size != 16 * N) only for last data block. + + AES-CBC filters need data size aligned for 16-bytes. + So the encoder can add zeros to the end of original stream. + + Some filters (BCJ and others) don't process data at the end of stream in some cases. + So the encoder and decoder write such last bytes without change. +*/ + +#if !defined(__APPLE__) +static const UInt32 kBufSize = 1 << 20; +#endif + +STDMETHODIMP CFilterCoder::SetInBufSize(UInt32 , UInt32 size) { _inBufSize = size; return S_OK; } +STDMETHODIMP CFilterCoder::SetOutBufSize(UInt32 , UInt32 size) { _outBufSize = size; return S_OK; } + +HRESULT CFilterCoder::Alloc() +{ + UInt32 size = MyMin(_inBufSize, _outBufSize); + /* minimal bufSize is 16 bytes for AES and IA64 filter. + bufSize for AES must be aligned for 16 bytes. + We use (1 << 12) min size to support future aligned filters. */ + const UInt32 kMinSize = 1 << 12; + size &= ~(UInt32)(kMinSize - 1); + if (size < kMinSize) + size = kMinSize; + if (!_buf || _bufSize != size) + { + AllocAlignedMask(size, 16 - 1); + if (!_buf) + return E_OUTOFMEMORY; + _bufSize = size; + } + return S_OK; +} + +HRESULT CFilterCoder::Init_and_Alloc() +{ + RINOK(Filter->Init()); + return Alloc(); +} + +CFilterCoder::CFilterCoder(bool encodeMode): + _bufSize(0), +#if defined(__APPLE__) + _inBufSize(kLzmaSDKObjCStreamReadSize), + _outBufSize(kLzmaSDKObjCStreamReadSize), +#else + _inBufSize(kBufSize), + _outBufSize(kBufSize), +#endif + _encodeMode(encodeMode), + _outSizeIsDefined(false), + _outSize(0), + _nowPos64(0) + {} + +CFilterCoder::~CFilterCoder() +{ +} + +STDMETHODIMP CFilterCoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) +{ + RINOK(Init_and_Alloc()); + + UInt64 nowPos64 = 0; + bool inputFinished = false; + UInt32 pos = 0; + + while (!outSize || nowPos64 < *outSize) + { + UInt32 endPos = pos; + + if (!inputFinished) + { + size_t processedSize = _bufSize - pos; + RINOK(ReadStream(inStream, _buf + pos, &processedSize)); + endPos = pos + (UInt32)processedSize; + inputFinished = (endPos != _bufSize); + } + + pos = Filter->Filter(_buf, endPos); + + if (pos > endPos) + { + // AES + if (!inputFinished || pos > _bufSize) + return E_FAIL; + if (!_encodeMode) + return S_FALSE; + + do + _buf[endPos] = 0; + while (++endPos != pos); + + if (pos != Filter->Filter(_buf, pos)) + return E_FAIL; + } + + if (endPos == 0) + return S_OK; + + UInt32 size = (pos != 0 ? pos : endPos); + if (outSize) + { + UInt64 remSize = *outSize - nowPos64; + if (size > remSize) + size = (UInt32)remSize; + } + + RINOK(WriteStream(outStream, _buf, size)); + nowPos64 += size; + + if (pos == 0) + return S_OK; + + if (progress) + RINOK(progress->SetRatioInfo(&nowPos64, &nowPos64)); + + UInt32 i = 0; + while (pos < endPos) + _buf[i++] = _buf[pos++]; + pos = i; + } + + return S_OK; +} + + + +// ---------- Write to Filter ---------- + +STDMETHODIMP CFilterCoder::SetOutStream(ISequentialOutStream *outStream) +{ + _outStream = outStream; + return S_OK; +} + +STDMETHODIMP CFilterCoder::ReleaseOutStream() +{ + _outStream.Release(); + return S_OK; +} + +HRESULT CFilterCoder::Flush2() +{ + while (_convSize != 0) + { + UInt32 num = _convSize; + if (_outSizeIsDefined) + { + UInt64 rem = _outSize - _nowPos64; + if (num > rem) + num = (UInt32)rem; + if (num == 0) + return k_My_HRESULT_WritingWasCut; + } + + UInt32 processed = 0; + HRESULT res = _outStream->Write(_buf + _convPos, num, &processed); + if (processed == 0) + return res != S_OK ? res : E_FAIL; + + _convPos += processed; + _convSize -= processed; + _nowPos64 += processed; + RINOK(res); + } + + if (_convPos != 0) + { + UInt32 num = _bufPos - _convPos; + for (UInt32 i = 0; i < num; i++) + _buf[i] = _buf[_convPos + i]; + _bufPos = num; + _convPos = 0; + } + + return S_OK; +} + +STDMETHODIMP CFilterCoder::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + while (size != 0) + { + RINOK(Flush2()); + + // _convSize is 0 + // _convPos is 0 + // _bufPos is small + + if (_bufPos != _bufSize) + { + UInt32 num = MyMin(size, _bufSize - _bufPos); + memcpy(_buf + _bufPos, data, num); + size -= num; + data = (const Byte *)data + num; + if (processedSize) + *processedSize += num; + _bufPos += num; + if (_bufPos != _bufSize) + continue; + } + + // _bufPos == _bufSize + _convSize = Filter->Filter(_buf, _bufPos); + + if (_convSize == 0) + break; + if (_convSize > _bufPos) + { + // that case is not possible. + _convSize = 0; + return E_FAIL; + } + } + + return S_OK; +} + +STDMETHODIMP CFilterCoder::OutStreamFinish() +{ + for (;;) + { + RINOK(Flush2()); + if (_bufPos == 0) + break; + _convSize = Filter->Filter(_buf, _bufPos); + if (_convSize == 0) + _convSize = _bufPos; + else if (_convSize > _bufPos) + { + // AES + if (_convSize > _bufSize) + { + _convSize = 0; + return E_FAIL; + } + if (!_encodeMode) + { + _convSize = 0; + return S_FALSE; + } + for (; _bufPos < _convSize; _bufPos++) + _buf[_bufPos] = 0; + _convSize = Filter->Filter(_buf, _bufPos); + if (_convSize != _bufPos) + return E_FAIL; + } + } + + CMyComPtr finish; + _outStream.QueryInterface(IID_IOutStreamFinish, &finish); + if (finish) + return finish->OutStreamFinish(); + return S_OK; +} + +// ---------- Init functions ---------- + +STDMETHODIMP CFilterCoder::InitEncoder() +{ + InitSpecVars(); + return Init_and_Alloc(); +} + +HRESULT CFilterCoder::Init_NoSubFilterInit() +{ + InitSpecVars(); + return Alloc(); +} + +STDMETHODIMP CFilterCoder::SetOutStreamSize(const UInt64 *outSize) +{ + InitSpecVars(); + if (outSize) + { + _outSize = *outSize; + _outSizeIsDefined = true; + } + return Init_and_Alloc(); +} + +// ---------- Read from Filter ---------- + +STDMETHODIMP CFilterCoder::SetInStream(ISequentialInStream *inStream) +{ + _inStream = inStream; + return S_OK; +} + +STDMETHODIMP CFilterCoder::ReleaseInStream() +{ + _inStream.Release(); + return S_OK; +} + + +STDMETHODIMP CFilterCoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + while (size != 0) + { + if (_convSize != 0) + { + if (size > _convSize) + size = _convSize; + if (_outSizeIsDefined) + { + UInt64 rem = _outSize - _nowPos64; + if (size > rem) + size = (UInt32)rem; + } + memcpy(data, _buf + _convPos, size); + _convPos += size; + _convSize -= size; + _nowPos64 += size; + if (processedSize) + *processedSize = size; + break; + } + + if (_convPos != 0) + { + UInt32 num = _bufPos - _convPos; + for (UInt32 i = 0; i < num; i++) + _buf[i] = _buf[_convPos + i]; + _bufPos = num; + _convPos = 0; + } + + { + size_t readSize = _bufSize - _bufPos; + HRESULT res = ReadStream(_inStream, _buf + _bufPos, &readSize); + _bufPos += (UInt32)readSize; + RINOK(res); + } + + _convSize = Filter->Filter(_buf, _bufPos); + + if (_convSize == 0) + { + if (_bufPos == 0) + break; + // BCJ + _convSize = _bufPos; + continue; + } + + if (_convSize > _bufPos) + { + // AES + if (_convSize > _bufSize) + return E_FAIL; + if (!_encodeMode) + return S_FALSE; + + do + _buf[_bufPos] = 0; + while (++_bufPos != _convSize); + + _convSize = Filter->Filter(_buf, _convSize); + if (_convSize != _bufPos) + return E_FAIL; + } + } + + return S_OK; +} + + +#ifndef _NO_CRYPTO + +STDMETHODIMP CFilterCoder::CryptoSetPassword(const Byte *data, UInt32 size) + { return _SetPassword->CryptoSetPassword(data, size); } + +STDMETHODIMP CFilterCoder::SetKey(const Byte *data, UInt32 size) + { return _CryptoProperties->SetKey(data, size); } + +STDMETHODIMP CFilterCoder::SetInitVector(const Byte *data, UInt32 size) + { return _CryptoProperties->SetInitVector(data, size); } + +#endif + + +#ifndef EXTRACT_ONLY + +STDMETHODIMP CFilterCoder::SetCoderProperties(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties) + { return _SetCoderProperties->SetCoderProperties(propIDs, properties, numProperties); } + +STDMETHODIMP CFilterCoder::WriteCoderProperties(ISequentialOutStream *outStream) + { return _WriteCoderProperties->WriteCoderProperties(outStream); } + +/* +STDMETHODIMP CFilterCoder::ResetSalt() + { return _CryptoResetSalt->ResetSalt(); } +*/ + +STDMETHODIMP CFilterCoder::ResetInitVector() + { return _CryptoResetInitVector->ResetInitVector(); } + +#endif + + +STDMETHODIMP CFilterCoder::SetDecoderProperties2(const Byte *data, UInt32 size) + { return _SetDecoderProperties2->SetDecoderProperties2(data, size); } diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilterCoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilterCoder.h new file mode 100644 index 0000000000..7890e563da --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/FilterCoder.h @@ -0,0 +1,226 @@ +// FilterCoder.h + +#ifndef __FILTER_CODER_H +#define __FILTER_CODER_H + +#include "../../../C/Alloc.h" + +#include "../../Common/MyCom.h" +#include "../ICoder.h" + +#ifndef _NO_CRYPTO +#include "../IPassword.h" +#endif + +#define MY_QUERYINTERFACE_ENTRY_AG(i, sub0, sub) else if (iid == IID_ ## i) \ + { if (!sub) RINOK(sub0->QueryInterface(IID_ ## i, (void **)&sub)) \ + *outObject = (void *)(i *)this; } + + +struct CAlignedMidBuffer +{ + #ifdef _WIN32 + + Byte *_buf; + + CAlignedMidBuffer(): _buf(NULL) {} + ~CAlignedMidBuffer() { ::MidFree(_buf); } + + void AllocAlignedMask(size_t size, size_t) + { + ::MidFree(_buf); + _buf = (Byte *)::MidAlloc(size); + } + + #else + + Byte *_bufBase; + Byte *_buf; + + CAlignedMidBuffer(): _bufBase(NULL), _buf(NULL) {} + ~CAlignedMidBuffer() { ::MidFree(_bufBase); } + + void AllocAlignedMask(size_t size, size_t alignMask) + { + ::MidFree(_bufBase); + _buf = NULL; + _bufBase = (Byte *)::MidAlloc(size + alignMask); + + if (_bufBase) + { + // _buf = (Byte *)(((uintptr_t)_bufBase + alignMask) & ~(uintptr_t)alignMask); + _buf = (Byte *)(((ptrdiff_t)_bufBase + alignMask) & ~(ptrdiff_t)alignMask); + } + } + + #endif +}; + +class CFilterCoder: + public ICompressCoder, + + public ICompressSetOutStreamSize, + public ICompressInitEncoder, + + public ICompressSetInStream, + public ISequentialInStream, + + public ICompressSetOutStream, + public ISequentialOutStream, + public IOutStreamFinish, + + public ICompressSetBufSize, + + #ifndef _NO_CRYPTO + public ICryptoSetPassword, + public ICryptoProperties, + #endif + + #ifndef EXTRACT_ONLY + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + // public ICryptoResetSalt, + public ICryptoResetInitVector, + #endif + + public ICompressSetDecoderProperties2, + public CMyUnknownImp, + public CAlignedMidBuffer +{ + UInt32 _bufSize; + UInt32 _inBufSize; + UInt32 _outBufSize; + + bool _encodeMode; + bool _outSizeIsDefined; + UInt64 _outSize; + UInt64 _nowPos64; + + CMyComPtr _inStream; + CMyComPtr _outStream; + UInt32 _bufPos; + UInt32 _convPos; // current pos in buffer for converted data + UInt32 _convSize; // size of converted data starting from _convPos + + void InitSpecVars() + { + _bufPos = 0; + _convPos = 0; + _convSize = 0; + + _outSizeIsDefined = false; + _outSize = 0; + _nowPos64 = 0; + } + + HRESULT Alloc(); + HRESULT Init_and_Alloc(); + HRESULT Flush2(); + + #ifndef _NO_CRYPTO + CMyComPtr _SetPassword; + CMyComPtr _CryptoProperties; + #endif + + #ifndef EXTRACT_ONLY + CMyComPtr _SetCoderProperties; + CMyComPtr _WriteCoderProperties; + // CMyComPtr _CryptoResetSalt; + CMyComPtr _CryptoResetInitVector; + #endif + + CMyComPtr _SetDecoderProperties2; + +public: + CMyComPtr Filter; + + CFilterCoder(bool encodeMode); + ~CFilterCoder(); + + class C_InStream_Releaser + { + public: + CFilterCoder *FilterCoder; + C_InStream_Releaser(): FilterCoder(NULL) {} + ~C_InStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseInStream(); } + }; + + class C_OutStream_Releaser + { + public: + CFilterCoder *FilterCoder; + C_OutStream_Releaser(): FilterCoder(NULL) {} + ~C_OutStream_Releaser() { if (FilterCoder) FilterCoder->ReleaseOutStream(); } + }; + + MY_QUERYINTERFACE_BEGIN2(ICompressCoder) + + MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize) + MY_QUERYINTERFACE_ENTRY(ICompressInitEncoder) + + MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) + MY_QUERYINTERFACE_ENTRY(ISequentialInStream) + + MY_QUERYINTERFACE_ENTRY(ICompressSetOutStream) + MY_QUERYINTERFACE_ENTRY(ISequentialOutStream) + MY_QUERYINTERFACE_ENTRY(IOutStreamFinish) + + MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize) + + #ifndef _NO_CRYPTO + MY_QUERYINTERFACE_ENTRY_AG(ICryptoSetPassword, Filter, _SetPassword) + MY_QUERYINTERFACE_ENTRY_AG(ICryptoProperties, Filter, _CryptoProperties) + #endif + + #ifndef EXTRACT_ONLY + MY_QUERYINTERFACE_ENTRY_AG(ICompressSetCoderProperties, Filter, _SetCoderProperties) + MY_QUERYINTERFACE_ENTRY_AG(ICompressWriteCoderProperties, Filter, _WriteCoderProperties) + // MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetSalt, Filter, _CryptoResetSalt) + MY_QUERYINTERFACE_ENTRY_AG(ICryptoResetInitVector, Filter, _CryptoResetInitVector) + #endif + + MY_QUERYINTERFACE_ENTRY_AG(ICompressSetDecoderProperties2, Filter, _SetDecoderProperties2) + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + STDMETHOD(InitEncoder)(); + + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream); + STDMETHOD(ReleaseOutStream)(); + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(OutStreamFinish)(); + + STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size); + STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size); + + #ifndef _NO_CRYPTO + STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); + + STDMETHOD(SetKey)(const Byte *data, UInt32 size); + STDMETHOD(SetInitVector)(const Byte *data, UInt32 size); + #endif + + #ifndef EXTRACT_ONLY + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, + const PROPVARIANT *properties, UInt32 numProperties); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + // STDMETHOD(ResetSalt)(); + STDMETHOD(ResetInitVector)(); + #endif + + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + + + HRESULT Init_NoSubFilterInit(); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InBuffer.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InBuffer.cpp new file mode 100644 index 0000000000..7765d1b7bb --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InBuffer.cpp @@ -0,0 +1,135 @@ +// InBuffer.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "InBuffer.h" + +CInBufferBase::CInBufferBase() throw(): + _buf(0), + _bufLim(0), + _bufBase(0), + _stream(0), + _processedSize(0), + _bufSize(0), + _wasFinished(false), + NumExtraBytes(0) +{} + +bool CInBuffer::Create(size_t bufSize) throw() +{ + const unsigned kMinBlockSize = 1; + if (bufSize < kMinBlockSize) + bufSize = kMinBlockSize; + if (_bufBase != 0 && _bufSize == bufSize) + return true; + Free(); + _bufSize = bufSize; + _bufBase = (Byte *)::MidAlloc(bufSize); + return (_bufBase != 0); +} + +void CInBuffer::Free() throw() +{ + ::MidFree(_bufBase); + _bufBase = 0; +} + +void CInBufferBase::Init() throw() +{ + _processedSize = 0; + _buf = _bufBase; + _bufLim = _buf; + _wasFinished = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif + NumExtraBytes = 0; +} + +bool CInBufferBase::ReadBlock() +{ + #ifdef _NO_EXCEPTIONS + if (ErrorCode != S_OK) + return false; + #endif + if (_wasFinished) + return false; + _processedSize += (_buf - _bufBase); + _buf = _bufBase; + _bufLim = _bufBase; + UInt32 processed; + // FIX_ME: we can improve it to support (_bufSize >= (1 << 32)) + HRESULT result = _stream->Read(_bufBase, (UInt32)_bufSize, &processed); + #ifdef _NO_EXCEPTIONS + ErrorCode = result; + #else + if (result != S_OK) + throw CInBufferException(result); + #endif + _bufLim = _buf + processed; + _wasFinished = (processed == 0); + return !_wasFinished; +} + +bool CInBufferBase::ReadByte_FromNewBlock(Byte &b) +{ + if (!ReadBlock()) + { + NumExtraBytes++; + b = 0xFF; + return false; + } + b = *_buf++; + return true; +} + +Byte CInBufferBase::ReadByte_FromNewBlock() +{ + if (!ReadBlock()) + { + NumExtraBytes++; + return 0xFF; + } + return *_buf++; +} + +size_t CInBufferBase::ReadBytes(Byte *buf, size_t size) +{ + if ((size_t)(_bufLim - _buf) >= size) + { + const Byte *src = _buf; + for (size_t i = 0; i < size; i++) + buf[i] = src[i]; + _buf += size; + return size; + } + for (size_t i = 0; i < size; i++) + { + if (_buf >= _bufLim) + if (!ReadBlock()) + return i; + buf[i] = *_buf++; + } + return size; +} + +size_t CInBufferBase::Skip(size_t size) +{ + size_t processed = 0; + for (;;) + { + size_t rem = (_bufLim - _buf); + if (rem >= size) + { + _buf += size; + return processed + size; + } + _buf += rem; + processed += rem; + size -= rem; + if (!ReadBlock()) + return processed; + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InBuffer.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InBuffer.h new file mode 100644 index 0000000000..f353b37370 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InBuffer.h @@ -0,0 +1,90 @@ +// InBuffer.h + +#ifndef __IN_BUFFER_H +#define __IN_BUFFER_H + +#include "../../Common/MyException.h" +#include "../IStream.h" + +#ifndef _NO_EXCEPTIONS +struct CInBufferException: public CSystemException +{ + CInBufferException(HRESULT errorCode): CSystemException(errorCode) {} +}; +#endif + +class CInBufferBase +{ +protected: + Byte *_buf; + Byte *_bufLim; + Byte *_bufBase; + + ISequentialInStream *_stream; + UInt64 _processedSize; + size_t _bufSize; // actually it's number of Bytes for next read. The buf can be larger + // only up to 32-bits values now are supported! + bool _wasFinished; + + bool ReadBlock(); + bool ReadByte_FromNewBlock(Byte &b); + Byte ReadByte_FromNewBlock(); + +public: + #ifdef _NO_EXCEPTIONS + HRESULT ErrorCode; + #endif + UInt32 NumExtraBytes; + + CInBufferBase() throw(); + + UInt64 GetStreamSize() const { return _processedSize + (_buf - _bufBase); } + UInt64 GetProcessedSize() const { return _processedSize + NumExtraBytes + (_buf - _bufBase); } + bool WasFinished() const { return _wasFinished; } + + void SetStream(ISequentialInStream *stream) { _stream = stream; } + + void SetBuf(Byte *buf, size_t bufSize, size_t end, size_t pos) + { + _bufBase = buf; + _bufSize = bufSize; + _processedSize = 0; + _buf = buf + pos; + _bufLim = buf + end; + _wasFinished = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif + NumExtraBytes = 0; + } + + void Init() throw(); + + bool ReadByte(Byte &b) + { + if (_buf >= _bufLim) + return ReadByte_FromNewBlock(b); + b = *_buf++; + return true; + } + + Byte ReadByte() + { + if (_buf >= _bufLim) + return ReadByte_FromNewBlock(); + return *_buf++; + } + + size_t ReadBytes(Byte *buf, size_t size); + size_t Skip(size_t size); +}; + +class CInBuffer: public CInBufferBase +{ +public: + ~CInBuffer() { Free(); } + bool Create(size_t bufSize) throw(); // only up to 32-bits values now are supported! + void Free() throw(); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InOutTempBuffer.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InOutTempBuffer.cpp new file mode 100644 index 0000000000..adadbb1844 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InOutTempBuffer.cpp @@ -0,0 +1,141 @@ +// InOutTempBuffer.cpp + +#include "StdAfx.h" + +#include "../../../C/7zCrc.h" + +#include "../../Common/Defs.h" + +#include "InOutTempBuffer.h" +#include "StreamUtils.h" + +#if !defined(__APPLE__) +using namespace NWindows; +using namespace NFile; +using namespace NDir; +#endif + +static const size_t kTempBufSize = (1 << 20); + +#if !defined(__APPLE__) +static CFSTR kTempFilePrefixString = FTEXT("7zt"); +#endif + +CInOutTempBuffer::CInOutTempBuffer(): _buf(NULL) { } + +void CInOutTempBuffer::Create() +{ + if (!_buf) + _buf = new Byte[kTempBufSize]; +} + +CInOutTempBuffer::~CInOutTempBuffer() +{ + delete []_buf; +} + +void CInOutTempBuffer::InitWriting() +{ + _bufPos = 0; + _tempFileCreated = false; + _size = 0; + _crc = CRC_INIT_VAL; +} + +bool CInOutTempBuffer::WriteToFile(const void *data, UInt32 size) +{ +#if defined(__APPLE__) + assert(0); + return true; +#else + if (size == 0) + return true; + if (!_tempFileCreated) + { + if (!_tempFile.CreateRandomInTempFolder(kTempFilePrefixString, &_outFile)) + return false; + _tempFileCreated = true; + } + UInt32 processed; + if (!_outFile.Write(data, size, processed)) + return false; + _crc = CrcUpdate(_crc, data, processed); + _size += processed; + return (processed == size); +#endif +} + +bool CInOutTempBuffer::Write(const void *data, UInt32 size) +{ + if (size == 0) + return true; + size_t cur = kTempBufSize - _bufPos; + if (cur != 0) + { + if (cur > size) + cur = size; + memcpy(_buf + _bufPos, data, cur); + _crc = CrcUpdate(_crc, data, cur); + _bufPos += cur; + _size += cur; + size -= (UInt32)cur; + data = ((const Byte *)data) + cur; + } + return WriteToFile(data, size); +} + +HRESULT CInOutTempBuffer::WriteToStream(ISequentialOutStream *stream) +{ +#if defined(__APPLE__) + assert(0); + return S_OK; +#else + if (!_outFile.Close()) + return E_FAIL; + + UInt64 size = 0; + UInt32 crc = CRC_INIT_VAL; + + if (_bufPos != 0) + { + RINOK(WriteStream(stream, _buf, _bufPos)); + crc = CrcUpdate(crc, _buf, _bufPos); + size += _bufPos; + } + + if (_tempFileCreated) + { + NIO::CInFile inFile; + if (!inFile.Open(_tempFile.GetPath())) + return E_FAIL; + while (size < _size) + { + UInt32 processed; + if (!inFile.ReadPart(_buf, kTempBufSize, processed)) + return E_FAIL; + if (processed == 0) + break; + RINOK(WriteStream(stream, _buf, processed)); + crc = CrcUpdate(crc, _buf, processed); + size += processed; + } + } + + return (_crc == crc && size == _size) ? S_OK : E_FAIL; +#endif +} + +/* +STDMETHODIMP CSequentialOutTempBufferImp::Write(const void *data, UInt32 size, UInt32 *processed) +{ + if (!_buf->Write(data, size)) + { + if (processed) + *processed = 0; + return E_FAIL; + } + if (processed) + *processed = size; + return S_OK; +} +*/ diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InOutTempBuffer.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InOutTempBuffer.h new file mode 100644 index 0000000000..70b8f2f938 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/InOutTempBuffer.h @@ -0,0 +1,59 @@ +// InOutTempBuffer.h + +#ifndef __IN_OUT_TEMP_BUFFER_H +#define __IN_OUT_TEMP_BUFFER_H + +#include "../../Common/MyCom.h" +#if !defined(__APPLE__) +#include "../../Windows/FileDir.h" +#endif + +#include "../IStream.h" + +#if defined(__APPLE__) +#include "../../Common/C_FileIO.h" +#endif + +class CInOutTempBuffer +{ +#if defined(__APPLE__) + // NWindows::NFile::NDirectory::CTempFile _tempFile; + NC::NFile::NIO::COutFile _outFile; +#else + NWindows::NFile::NDir::CTempFile _tempFile; + NWindows::NFile::NIO::COutFile _outFile; +#endif + Byte *_buf; + size_t _bufPos; + UInt64 _size; + UInt32 _crc; + bool _tempFileCreated; + + bool WriteToFile(const void *data, UInt32 size); +public: + CInOutTempBuffer(); + ~CInOutTempBuffer(); + void Create(); + + void InitWriting(); + bool Write(const void *data, UInt32 size); + + HRESULT WriteToStream(ISequentialOutStream *stream); + UInt64 GetDataSize() const { return _size; } +}; + +/* +class CSequentialOutTempBufferImp: + public ISequentialOutStream, + public CMyUnknownImp +{ + CInOutTempBuffer *_buf; +public: + void Init(CInOutTempBuffer *buffer) { _buf = buffer; } + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; +*/ + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LimitedStreams.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LimitedStreams.cpp new file mode 100644 index 0000000000..fc7e794cf8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LimitedStreams.cpp @@ -0,0 +1,367 @@ +// LimitedStreams.cpp + +#include "StdAfx.h" + +#include + +#include "LimitedStreams.h" + +STDMETHODIMP CLimitedSequentialInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = 0; + { + const UInt64 rem = _size - _pos; + if (size > rem) + size = (UInt32)rem; + } + HRESULT result = S_OK; + if (size != 0) + { + result = _stream->Read(data, size, &realProcessedSize); + _pos += realProcessedSize; + if (realProcessedSize == 0) + _wasFinished = true; + } + if (processedSize) + *processedSize = realProcessedSize; + return result; +} + +STDMETHODIMP CLimitedInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (_virtPos >= _size) + { + // 9.31: Fixed. Windows doesn't return error in ReadFile and IStream->Read in that case. + return S_OK; + // return (_virtPos == _size) ? S_OK: E_FAIL; // ERROR_HANDLE_EOF + } + { + const UInt64 rem = _size - _virtPos; + if (size > rem) + size = (UInt32)rem; + } + UInt64 newPos = _startOffset + _virtPos; + if (newPos != _physPos) + { + _physPos = newPos; + RINOK(SeekToPhys()); + } + HRESULT res = _stream->Read(data, size, &size); + if (processedSize) + *processedSize = size; + _physPos += size; + _virtPos += size; + return res; +} + +STDMETHODIMP CLimitedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _virtPos; break; + case STREAM_SEEK_END: offset += _size; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _virtPos = offset; + if (newPosition) + *newPosition = _virtPos; + return S_OK; +} + +HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream) +{ + *resStream = 0; + CLimitedInStream *streamSpec = new CLimitedInStream; + CMyComPtr streamTemp = streamSpec; + streamSpec->SetStream(inStream); + RINOK(streamSpec->InitAndSeek(pos, size)); + streamSpec->SeekToStart(); + *resStream = streamTemp.Detach(); + return S_OK; +} + +STDMETHODIMP CClusterInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (_virtPos >= Size) + return S_OK; + { + UInt64 rem = Size - _virtPos; + if (size > rem) + size = (UInt32)rem; + } + if (size == 0) + return S_OK; + + if (_curRem == 0) + { + const UInt32 blockSize = (UInt32)1 << BlockSizeLog; + const UInt32 virtBlock = (UInt32)(_virtPos >> BlockSizeLog); + const UInt32 offsetInBlock = (UInt32)_virtPos & (blockSize - 1); + const UInt32 phyBlock = Vector[virtBlock]; + + UInt64 newPos = StartOffset + ((UInt64)phyBlock << BlockSizeLog) + offsetInBlock; + if (newPos != _physPos) + { + _physPos = newPos; + RINOK(SeekToPhys()); + } + + _curRem = blockSize - offsetInBlock; + + for (int i = 1; i < 64 && (virtBlock + i) < (UInt32)Vector.Size() && phyBlock + i == Vector[virtBlock + i]; i++) + _curRem += (UInt32)1 << BlockSizeLog; + } + + if (size > _curRem) + size = _curRem; + HRESULT res = Stream->Read(data, size, &size); + if (processedSize) + *processedSize = size; + _physPos += size; + _virtPos += size; + _curRem -= size; + return res; +} + +STDMETHODIMP CClusterInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _virtPos; break; + case STREAM_SEEK_END: offset += Size; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + if (_virtPos != (UInt64)offset) + _curRem = 0; + _virtPos = offset; + if (newPosition) + *newPosition = offset; + return S_OK; +} + + +STDMETHODIMP CExtentsStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (_virtPos >= Extents.Back().Virt) + return S_OK; + if (size == 0) + return S_OK; + + unsigned left = 0, right = Extents.Size() - 1; + for (;;) + { + unsigned mid = (left + right) / 2; + if (mid == left) + break; + if (_virtPos < Extents[mid].Virt) + right = mid; + else + left = mid; + } + + const CSeekExtent &extent = Extents[left]; + UInt64 phyPos = extent.Phy + (_virtPos - extent.Virt); + if (_needStartSeek || _phyPos != phyPos) + { + _needStartSeek = false; + _phyPos = phyPos; + RINOK(SeekToPhys()); + } + + UInt64 rem = Extents[left + 1].Virt - _virtPos; + if (size > rem) + size = (UInt32)rem; + + HRESULT res = Stream->Read(data, size, &size); + _phyPos += size; + _virtPos += size; + if (processedSize) + *processedSize = size; + return res; +} + +STDMETHODIMP CExtentsStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _virtPos; break; + case STREAM_SEEK_END: offset += Extents.Back().Virt; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _virtPos = offset; + if (newPosition) + *newPosition = _virtPos; + return S_OK; +} + + +STDMETHODIMP CLimitedSequentialOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + HRESULT result = S_OK; + if (processedSize) + *processedSize = 0; + if (size > _size) + { + if (_size == 0) + { + _overflow = true; + if (!_overflowIsAllowed) + return E_FAIL; + if (processedSize) + *processedSize = size; + return S_OK; + } + size = (UInt32)_size; + } + if (_stream) + result = _stream->Write(data, size, &size); + _size -= size; + if (processedSize) + *processedSize = size; + return result; +} + + +STDMETHODIMP CTailInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 cur; + HRESULT res = Stream->Read(data, size, &cur); + if (processedSize) + *processedSize = cur; + _virtPos += cur; + return res; +} + +STDMETHODIMP CTailInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _virtPos; break; + case STREAM_SEEK_END: + { + UInt64 pos = 0; + RINOK(Stream->Seek(offset, STREAM_SEEK_END, &pos)); + if (pos < Offset) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _virtPos = pos - Offset; + if (newPosition) + *newPosition = _virtPos; + return S_OK; + } + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _virtPos = offset; + if (newPosition) + *newPosition = _virtPos; + return Stream->Seek(Offset + _virtPos, STREAM_SEEK_SET, NULL); +} + +STDMETHODIMP CLimitedCachedInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (_virtPos >= _size) + { + // 9.31: Fixed. Windows doesn't return error in ReadFile and IStream->Read in that case. + return S_OK; + // return (_virtPos == _size) ? S_OK: E_FAIL; // ERROR_HANDLE_EOF + } + UInt64 rem = _size - _virtPos; + if (rem < size) + size = (UInt32)rem; + + UInt64 newPos = _startOffset + _virtPos; + UInt64 offsetInCache = newPos - _cachePhyPos; + HRESULT res = S_OK; + if (newPos >= _cachePhyPos && + offsetInCache <= _cacheSize && + size <= _cacheSize - (size_t)offsetInCache) + { + if (size != 0) + memcpy(data, _cache + (size_t)offsetInCache, size); + } + else + { + if (newPos != _physPos) + { + _physPos = newPos; + RINOK(SeekToPhys()); + } + res = _stream->Read(data, size, &size); + _physPos += size; + } + if (processedSize) + *processedSize = size; + _virtPos += size; + return res; +} + +STDMETHODIMP CLimitedCachedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _virtPos; break; + case STREAM_SEEK_END: offset += _size; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _virtPos = offset; + if (newPosition) + *newPosition = _virtPos; + return S_OK; +} + +STDMETHODIMP CTailOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 cur; + HRESULT res = Stream->Write(data, size, &cur); + if (processedSize) + *processedSize = cur; + _virtPos += cur; + if (_virtSize < _virtPos) + _virtSize = _virtPos; + return res; +} + +STDMETHODIMP CTailOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _virtPos; break; + case STREAM_SEEK_END: offset += _virtSize; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _virtPos = offset; + if (newPosition) + *newPosition = _virtPos; + return Stream->Seek(Offset + _virtPos, STREAM_SEEK_SET, NULL); +} + +STDMETHODIMP CTailOutStream::SetSize(UInt64 newSize) +{ + _virtSize = newSize; + return Stream->SetSize(Offset + newSize); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LimitedStreams.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LimitedStreams.h new file mode 100644 index 0000000000..2e55aa0b64 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LimitedStreams.h @@ -0,0 +1,252 @@ +// LimitedStreams.h + +#ifndef __LIMITED_STREAMS_H +#define __LIMITED_STREAMS_H + +#include "../../Common/MyBuffer.h" +#include "../../Common/MyCom.h" +#include "../../Common/MyVector.h" +#include "../IStream.h" + +class CLimitedSequentialInStream: + public ISequentialInStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; + UInt64 _pos; + bool _wasFinished; +public: + void SetStream(ISequentialInStream *stream) { _stream = stream; } + void ReleaseStream() { _stream.Release(); } + void Init(UInt64 streamSize) + { + _size = streamSize; + _pos = 0; + _wasFinished = false; + } + + MY_UNKNOWN_IMP1(ISequentialInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + UInt64 GetSize() const { return _pos; } + UInt64 GetRem() const { return _size - _pos; } + bool WasFinished() const { return _wasFinished; } +}; + +class CLimitedInStream: + public IInStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _virtPos; + UInt64 _physPos; + UInt64 _size; + UInt64 _startOffset; + + HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); } +public: + void SetStream(IInStream *stream) { _stream = stream; } + HRESULT InitAndSeek(UInt64 startOffset, UInt64 size) + { + _startOffset = startOffset; + _physPos = startOffset; + _virtPos = 0; + _size = size; + return SeekToPhys(); + } + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + + HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); } +}; + +HRESULT CreateLimitedInStream(IInStream *inStream, UInt64 pos, UInt64 size, ISequentialInStream **resStream); + +class CClusterInStream: + public IInStream, + public CMyUnknownImp +{ + UInt64 _virtPos; + UInt64 _physPos; + UInt32 _curRem; +public: + unsigned BlockSizeLog; + UInt64 Size; + CMyComPtr Stream; + CRecordVector Vector; + UInt64 StartOffset; + + HRESULT SeekToPhys() { return Stream->Seek(_physPos, STREAM_SEEK_SET, NULL); } + + HRESULT InitAndSeek() + { + _curRem = 0; + _virtPos = 0; + _physPos = StartOffset; + if (Vector.Size() > 0) + { + _physPos = StartOffset + (Vector[0] << BlockSizeLog); + return SeekToPhys(); + } + return S_OK; + } + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; + +struct CSeekExtent +{ + UInt64 Phy; + UInt64 Virt; +}; + +class CExtentsStream: + public IInStream, + public CMyUnknownImp +{ + UInt64 _phyPos; + UInt64 _virtPos; + bool _needStartSeek; + + HRESULT SeekToPhys() { return Stream->Seek(_phyPos, STREAM_SEEK_SET, NULL); } + +public: + CMyComPtr Stream; + CRecordVector Extents; + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + void ReleaseStream() { Stream.Release(); } + + void Init() + { + _virtPos = 0; + _phyPos = 0; + _needStartSeek = true; + } +}; + +class CLimitedSequentialOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; + bool _overflow; + bool _overflowIsAllowed; +public: + MY_UNKNOWN_IMP1(ISequentialOutStream) + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void ReleaseStream() { _stream.Release(); } + void Init(UInt64 size, bool overflowIsAllowed = false) + { + _size = size; + _overflow = false; + _overflowIsAllowed = overflowIsAllowed; + } + bool IsFinishedOK() const { return (_size == 0 && !_overflow); } + UInt64 GetRem() const { return _size; } +}; + + +class CTailInStream: + public IInStream, + public CMyUnknownImp +{ + UInt64 _virtPos; +public: + CMyComPtr Stream; + UInt64 Offset; + + void Init() + { + _virtPos = 0; + } + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + + HRESULT SeekToStart() { return Stream->Seek(Offset, STREAM_SEEK_SET, NULL); } +}; + +class CLimitedCachedInStream: + public IInStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _virtPos; + UInt64 _physPos; + UInt64 _size; + UInt64 _startOffset; + + const Byte *_cache; + size_t _cacheSize; + size_t _cachePhyPos; + + + HRESULT SeekToPhys() { return _stream->Seek(_physPos, STREAM_SEEK_SET, NULL); } +public: + CByteBuffer Buffer; + + void SetStream(IInStream *stream) { _stream = stream; } + void SetCache(size_t cacheSize, size_t cachePos) + { + _cache = Buffer; + _cacheSize = cacheSize; + _cachePhyPos = cachePos; + } + + HRESULT InitAndSeek(UInt64 startOffset, UInt64 size) + { + _startOffset = startOffset; + _physPos = startOffset; + _virtPos = 0; + _size = size; + return SeekToPhys(); + } + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + + HRESULT SeekToStart() { return Seek(0, STREAM_SEEK_SET, NULL); } +}; + +class CTailOutStream: + public IOutStream, + public CMyUnknownImp +{ + UInt64 _virtPos; + UInt64 _virtSize; +public: + CMyComPtr Stream; + UInt64 Offset; + + virtual ~CTailOutStream() {} + + MY_UNKNOWN_IMP2(ISequentialOutStream, IOutStream) + + void Init() + { + _virtPos = 0; + _virtSize = 0; + } + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(UInt64 newSize); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LockedStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LockedStream.cpp new file mode 100644 index 0000000000..1223efe857 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LockedStream.cpp @@ -0,0 +1,3 @@ +// LockedStream.cpp + +#include "StdAfx.h" diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LockedStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LockedStream.h new file mode 100644 index 0000000000..5bf5c85a44 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/LockedStream.h @@ -0,0 +1,6 @@ +// LockedStream.h + +#ifndef __LOCKED_STREAM_H +#define __LOCKED_STREAM_H + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodId.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodId.cpp new file mode 100644 index 0000000000..9a07e4c9a1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodId.cpp @@ -0,0 +1,3 @@ +// MethodId.cpp + +#include "StdAfx.h" diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodId.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodId.h new file mode 100644 index 0000000000..1ba9f49afc --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodId.h @@ -0,0 +1,10 @@ +// MethodId.h + +#ifndef __7Z_METHOD_ID_H +#define __7Z_METHOD_ID_H + +#include "../../Common/MyTypes.h" + +typedef UInt64 CMethodId; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodProps.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodProps.cpp new file mode 100644 index 0000000000..7036572b6f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodProps.cpp @@ -0,0 +1,458 @@ +// MethodProps.cpp + +#include "StdAfx.h" + +#include "../../Common/StringToInt.h" + +#include "MethodProps.h" + +using namespace NWindows; + +bool StringToBool(const UString &s, bool &res) +{ + if (s.IsEmpty() || (s[0] == '+' && s[1] == 0) || StringsAreEqualNoCase_Ascii(s, "ON")) + { + res = true; + return true; + } + if ((s[0] == '-' && s[1] == 0) || StringsAreEqualNoCase_Ascii(s, "OFF")) + { + res = false; + return true; + } + return false; +} + +HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest) +{ + switch (prop.vt) + { + case VT_EMPTY: dest = true; return S_OK; + case VT_BOOL: dest = (prop.boolVal != VARIANT_FALSE); return S_OK; + case VT_BSTR: return StringToBool(prop.bstrVal, dest) ? S_OK : E_INVALIDARG; + } + return E_INVALIDARG; +} + +unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number) +{ + const wchar_t *start = srcString; + const wchar_t *end; + number = ConvertStringToUInt32(start, &end); + return (unsigned)(end - start); +} + +HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue) +{ + // =VT_UI4 + // =VT_EMPTY + // {stringUInt32}=VT_EMPTY + + if (prop.vt == VT_UI4) + { + if (!name.IsEmpty()) + return E_INVALIDARG; + resValue = prop.ulVal; + return S_OK; + } + if (prop.vt != VT_EMPTY) + return E_INVALIDARG; + if (name.IsEmpty()) + return S_OK; + UInt32 v; + if (ParseStringToUInt32(name, v) != name.Len()) + return E_INVALIDARG; + resValue = v; + return S_OK; +} + +HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads) +{ + if (name.IsEmpty()) + { + switch (prop.vt) + { + case VT_UI4: + numThreads = prop.ulVal; + break; + default: + { + bool val; + RINOK(PROPVARIANT_to_bool(prop, val)); + numThreads = (val ? defaultNumThreads : 1); + break; + } + } + return S_OK; + } + if (prop.vt != VT_EMPTY) + return E_INVALIDARG; + return ParsePropToUInt32(name, prop, numThreads); +} + + +static HRESULT StringToDictSize(const UString &s, NCOM::CPropVariant &destProp) +{ + const wchar_t *end; + UInt32 number = ConvertStringToUInt32(s, &end); + unsigned numDigits = (unsigned)(end - s); + if (numDigits == 0 || s.Len() > numDigits + 1) + return E_INVALIDARG; + + if (s.Len() == numDigits) + { + if (number >= 64) + return E_INVALIDARG; + if (number < 32) + destProp = (UInt32)((UInt32)1 << (unsigned)number); + else + destProp = (UInt64)((UInt64)1 << (unsigned)number); + return S_OK; + } + + unsigned numBits; + + switch (MyCharLower_Ascii(s[numDigits])) + { + case 'b': destProp = number; return S_OK; + case 'k': numBits = 10; break; + case 'm': numBits = 20; break; + case 'g': numBits = 30; break; + default: return E_INVALIDARG; + } + + if (number < ((UInt32)1 << (32 - numBits))) + destProp = (UInt32)(number << numBits); + else + destProp = (UInt64)((UInt64)number << numBits); + + return S_OK; +} + + +static HRESULT PROPVARIANT_to_DictSize(const PROPVARIANT &prop, NCOM::CPropVariant &destProp) +{ + if (prop.vt == VT_UI4) + { + UInt32 v = prop.ulVal; + if (v >= 64) + return E_INVALIDARG; + if (v < 32) + destProp = (UInt32)((UInt32)1 << (unsigned)v); + else + destProp = (UInt64)((UInt64)1 << (unsigned)v); + return S_OK; + } + if (prop.vt == VT_BSTR) + return StringToDictSize(prop.bstrVal, destProp); + return E_INVALIDARG; +} + + +void CProps::AddProp32(PROPID propid, UInt32 level) +{ + CProp &prop = Props.AddNew(); + prop.IsOptional = true; + prop.Id = propid; + prop.Value = (UInt32)level; +} + +class CCoderProps +{ + PROPID *_propIDs; + NCOM::CPropVariant *_props; + unsigned _numProps; + unsigned _numPropsMax; +public: + CCoderProps(unsigned numPropsMax) + { + _numPropsMax = numPropsMax; + _numProps = 0; + _propIDs = new PROPID[numPropsMax]; + _props = new NCOM::CPropVariant[numPropsMax]; + } + ~CCoderProps() + { + delete []_propIDs; + delete []_props; + } + void AddProp(const CProp &prop); + HRESULT SetProps(ICompressSetCoderProperties *setCoderProperties) + { + return setCoderProperties->SetCoderProperties(_propIDs, _props, _numProps); + } +}; + +void CCoderProps::AddProp(const CProp &prop) +{ + if (_numProps >= _numPropsMax) + throw 1; + _propIDs[_numProps] = prop.Id; + _props[_numProps] = prop.Value; + _numProps++; +} + +HRESULT CProps::SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const +{ + CCoderProps coderProps(Props.Size() + (dataSizeReduce ? 1 : 0)); + FOR_VECTOR (i, Props) + coderProps.AddProp(Props[i]); + if (dataSizeReduce) + { + CProp prop; + prop.Id = NCoderPropID::kReduceSize; + prop.Value = *dataSizeReduce; + coderProps.AddProp(prop); + } + return coderProps.SetProps(scp); +} + + +int CMethodProps::FindProp(PROPID id) const +{ + for (int i = Props.Size() - 1; i >= 0; i--) + if (Props[i].Id == id) + return i; + return -1; +} + +int CMethodProps::GetLevel() const +{ + int i = FindProp(NCoderPropID::kLevel); + if (i < 0) + return 5; + if (Props[i].Value.vt != VT_UI4) + return 9; + UInt32 level = Props[i].Value.ulVal; + return level > 9 ? 9 : (int)level; +} + +struct CNameToPropID +{ + VARTYPE VarType; + const char *Name; +}; + +static const CNameToPropID g_NameToPropID[] = +{ + { VT_UI4, "" }, + { VT_UI4, "d" }, + { VT_UI4, "mem" }, + { VT_UI4, "o" }, + { VT_UI4, "c" }, + { VT_UI4, "pb" }, + { VT_UI4, "lc" }, + { VT_UI4, "lp" }, + { VT_UI4, "fb" }, + { VT_BSTR, "mf" }, + { VT_UI4, "mc" }, + { VT_UI4, "pass" }, + { VT_UI4, "a" }, + { VT_UI4, "mt" }, + { VT_BOOL, "eos" }, + { VT_UI4, "x" }, + { VT_UI4, "reduceSize" } +}; + +static int FindPropIdExact(const UString &name) +{ + for (unsigned i = 0; i < ARRAY_SIZE(g_NameToPropID); i++) + if (StringsAreEqualNoCase_Ascii(name, g_NameToPropID[i].Name)) + return i; + return -1; +} + +static bool ConvertProperty(const PROPVARIANT &srcProp, VARTYPE varType, NCOM::CPropVariant &destProp) +{ + if (varType == srcProp.vt) + { + destProp = srcProp; + return true; + } + if (varType == VT_BOOL) + { + bool res; + if (PROPVARIANT_to_bool(srcProp, res) != S_OK) + return false; + destProp = res; + return true; + } + if (srcProp.vt == VT_EMPTY) + { + destProp = srcProp; + return true; + } + return false; +} + +static void SplitParams(const UString &srcString, UStringVector &subStrings) +{ + subStrings.Clear(); + UString s; + unsigned len = srcString.Len(); + if (len == 0) + return; + for (unsigned i = 0; i < len; i++) + { + wchar_t c = srcString[i]; + if (c == L':') + { + subStrings.Add(s); + s.Empty(); + } + else + s += c; + } + subStrings.Add(s); +} + +static void SplitParam(const UString ¶m, UString &name, UString &value) +{ + int eqPos = param.Find(L'='); + if (eqPos >= 0) + { + name.SetFrom(param, eqPos); + value = param.Ptr(eqPos + 1); + return; + } + unsigned i; + for (i = 0; i < param.Len(); i++) + { + wchar_t c = param[i]; + if (c >= L'0' && c <= L'9') + break; + } + name.SetFrom(param, i); + value = param.Ptr(i); +} + +static bool IsLogSizeProp(PROPID propid) +{ + switch (propid) + { + case NCoderPropID::kDictionarySize: + case NCoderPropID::kUsedMemorySize: + case NCoderPropID::kBlockSize: + case NCoderPropID::kReduceSize: + return true; + } + return false; +} + +HRESULT CMethodProps::SetParam(const UString &name, const UString &value) +{ + int index = FindPropIdExact(name); + if (index < 0) + return E_INVALIDARG; + const CNameToPropID &nameToPropID = g_NameToPropID[(unsigned)index]; + CProp prop; + prop.Id = index; + + if (IsLogSizeProp(prop.Id)) + { + RINOK(StringToDictSize(value, prop.Value)); + } + else + { + NCOM::CPropVariant propValue; + if (nameToPropID.VarType == VT_BSTR) + propValue = value; + else if (nameToPropID.VarType == VT_BOOL) + { + bool res; + if (!StringToBool(value, res)) + return E_INVALIDARG; + propValue = res; + } + else if (!value.IsEmpty()) + { + UInt32 number; + if (ParseStringToUInt32(value, number) == value.Len()) + propValue = number; + else + propValue = value; + } + if (!ConvertProperty(propValue, nameToPropID.VarType, prop.Value)) + return E_INVALIDARG; + } + Props.Add(prop); + return S_OK; +} + +HRESULT CMethodProps::ParseParamsFromString(const UString &srcString) +{ + UStringVector params; + SplitParams(srcString, params); + FOR_VECTOR (i, params) + { + const UString ¶m = params[i]; + UString name, value; + SplitParam(param, name, value); + RINOK(SetParam(name, value)); + } + return S_OK; +} + +HRESULT CMethodProps::ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value) +{ + if (realName.Len() == 0) + { + // [empty]=method + return E_INVALIDARG; + } + if (value.vt == VT_EMPTY) + { + // {realName}=[empty] + UString name, valueStr; + SplitParam(realName, name, valueStr); + return SetParam(name, valueStr); + } + + // {realName}=value + int index = FindPropIdExact(realName); + if (index < 0) + return E_INVALIDARG; + const CNameToPropID &nameToPropID = g_NameToPropID[(unsigned)index]; + CProp prop; + prop.Id = index; + + if (IsLogSizeProp(prop.Id)) + { + RINOK(PROPVARIANT_to_DictSize(value, prop.Value)); + } + else + { + if (!ConvertProperty(value, nameToPropID.VarType, prop.Value)) + return E_INVALIDARG; + } + Props.Add(prop); + return S_OK; +} + +HRESULT COneMethodInfo::ParseMethodFromString(const UString &s) +{ + MethodName.Empty(); + int splitPos = s.Find(L':'); + { + UString temp = s; + if (splitPos >= 0) + temp.DeleteFrom(splitPos); + if (!temp.IsAscii()) + return E_INVALIDARG; + MethodName.SetFromWStr_if_Ascii(temp); + } + if (splitPos < 0) + return S_OK; + PropsString = s.Ptr(splitPos + 1); + return ParseParamsFromString(PropsString); +} + +HRESULT COneMethodInfo::ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value) +{ + if (!realName.IsEmpty() && !StringsAreEqualNoCase_Ascii(realName, "m")) + return ParseParamsFromPROPVARIANT(realName, value); + // -m{N}=method + if (value.vt != VT_BSTR) + return E_INVALIDARG; + return ParseMethodFromString(value.bstrVal); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodProps.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodProps.h new file mode 100644 index 0000000000..3f31c77bf5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/MethodProps.h @@ -0,0 +1,194 @@ +// MethodProps.h + +#ifndef __7Z_METHOD_PROPS_H +#define __7Z_METHOD_PROPS_H + +#include "../../Common/MyString.h" + +#include "../../Windows/PropVariant.h" + +#include "../ICoder.h" + +bool StringToBool(const UString &s, bool &res); +HRESULT PROPVARIANT_to_bool(const PROPVARIANT &prop, bool &dest); +unsigned ParseStringToUInt32(const UString &srcString, UInt32 &number); +HRESULT ParsePropToUInt32(const UString &name, const PROPVARIANT &prop, UInt32 &resValue); + +HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads); + +struct CProp +{ + PROPID Id; + bool IsOptional; + NWindows::NCOM::CPropVariant Value; + CProp(): IsOptional(false) {} +}; + +struct CProps +{ + CObjectVector Props; + + void Clear() { Props.Clear(); } + + bool AreThereNonOptionalProps() const + { + FOR_VECTOR (i, Props) + if (!Props[i].IsOptional) + return true; + return false; + } + + void AddProp32(PROPID propid, UInt32 level); + + void AddProp_Ascii(PROPID propid, const char *s) + { + CProp &prop = Props.AddNew(); + prop.IsOptional = true; + prop.Id = propid; + prop.Value = s; + } + + HRESULT SetCoderProps(ICompressSetCoderProperties *scp, const UInt64 *dataSizeReduce) const; +}; + +class CMethodProps: public CProps +{ + HRESULT SetParam(const UString &name, const UString &value); +public: + int GetLevel() const; + int Get_NumThreads() const + { + int i = FindProp(NCoderPropID::kNumThreads); + if (i >= 0) + if (Props[i].Value.vt == VT_UI4) + return (int)Props[i].Value.ulVal; + return -1; + } + + bool Get_DicSize(UInt32 &res) const + { + res = 0; + int i = FindProp(NCoderPropID::kDictionarySize); + if (i >= 0) + if (Props[i].Value.vt == VT_UI4) + { + res = Props[i].Value.ulVal; + return true; + } + return false; + } + + int FindProp(PROPID id) const; + + UInt32 Get_Lzma_Algo() const + { + int i = FindProp(NCoderPropID::kAlgorithm); + if (i >= 0) + if (Props[i].Value.vt == VT_UI4) + return Props[i].Value.ulVal; + return GetLevel() >= 5 ? 1 : 0; + } + + UInt32 Get_Lzma_DicSize() const + { + int i = FindProp(NCoderPropID::kDictionarySize); + if (i >= 0) + if (Props[i].Value.vt == VT_UI4) + return Props[i].Value.ulVal; + int level = GetLevel(); + return level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26)); + } + + bool Are_Lzma_Model_Props_Defined() const + { + if (FindProp(NCoderPropID::kPosStateBits) >= 0) return true; + if (FindProp(NCoderPropID::kLitContextBits) >= 0) return true; + if (FindProp(NCoderPropID::kLitPosBits) >= 0) return true; + return false; + } + + UInt32 Get_Lzma_NumThreads(bool &fixedNumber) const + { + fixedNumber = false; + int numThreads = Get_NumThreads(); + if (numThreads >= 0) + { + fixedNumber = true; + return numThreads < 2 ? 1 : 2; + } + return Get_Lzma_Algo() == 0 ? 1 : 2; + } + + UInt32 Get_BZip2_NumThreads(bool &fixedNumber) const + { + fixedNumber = false; + int numThreads = Get_NumThreads(); + if (numThreads >= 0) + { + fixedNumber = true; + if (numThreads < 1) return 1; + if (numThreads > 64) return 64; + return numThreads; + } + return 1; + } + + UInt32 Get_BZip2_BlockSize() const + { + int i = FindProp(NCoderPropID::kDictionarySize); + if (i >= 0) + if (Props[i].Value.vt == VT_UI4) + { + UInt32 blockSize = Props[i].Value.ulVal; + const UInt32 kDicSizeMin = 100000; + const UInt32 kDicSizeMax = 900000; + if (blockSize < kDicSizeMin) blockSize = kDicSizeMin; + if (blockSize > kDicSizeMax) blockSize = kDicSizeMax; + return blockSize; + } + int level = GetLevel(); + return 100000 * (level >= 5 ? 9 : (level >= 1 ? level * 2 - 1: 1)); + } + + UInt32 Get_Ppmd_MemSize() const + { + int i = FindProp(NCoderPropID::kUsedMemorySize); + if (i >= 0) + if (Props[i].Value.vt == VT_UI4) + return Props[i].Value.ulVal; + int level = GetLevel(); + return level >= 9 ? (192 << 20) : ((UInt32)1 << (level + 19)); + } + + void AddProp_Level(UInt32 level) + { + AddProp32(NCoderPropID::kLevel, level); + } + + void AddProp_NumThreads(UInt32 numThreads) + { + AddProp32(NCoderPropID::kNumThreads, numThreads); + } + + HRESULT ParseParamsFromString(const UString &srcString); + HRESULT ParseParamsFromPROPVARIANT(const UString &realName, const PROPVARIANT &value); +}; + +class COneMethodInfo: public CMethodProps +{ +public: + AString MethodName; + UString PropsString; + + void Clear() + { + CMethodProps::Clear(); + MethodName.Empty(); + PropsString.Empty(); + } + bool IsEmpty() const { return MethodName.IsEmpty() && Props.IsEmpty(); } + HRESULT ParseMethodFromPROPVARIANT(const UString &realName, const PROPVARIANT &value); + HRESULT ParseMethodFromString(const UString &s); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OffsetStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OffsetStream.cpp new file mode 100644 index 0000000000..3b01c7f651 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OffsetStream.cpp @@ -0,0 +1,39 @@ +// OffsetStream.cpp + +#include "StdAfx.h" + +#include "../../Common/Defs.h" + +#include "OffsetStream.h" + +HRESULT COffsetOutStream::Init(IOutStream *stream, UInt64 offset) +{ + _offset = offset; + _stream = stream; + return _stream->Seek(offset, STREAM_SEEK_SET, NULL); +} + +STDMETHODIMP COffsetOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + return _stream->Write(data, size, processedSize); +} + +STDMETHODIMP COffsetOutStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + UInt64 absoluteNewPosition; + if (seekOrigin == STREAM_SEEK_SET) + { + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + offset += _offset; + } + HRESULT result = _stream->Seek(offset, seekOrigin, &absoluteNewPosition); + if (newPosition) + *newPosition = absoluteNewPosition - _offset; + return result; +} + +STDMETHODIMP COffsetOutStream::SetSize(UInt64 newSize) +{ + return _stream->SetSize(_offset + newSize); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OffsetStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OffsetStream.h new file mode 100644 index 0000000000..ad835f2dfc --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OffsetStream.h @@ -0,0 +1,26 @@ +// OffsetStream.h + +#ifndef __OFFSET_STREAM_H +#define __OFFSET_STREAM_H + +#include "../../Common/MyCom.h" + +#include "../IStream.h" + +class COffsetOutStream: + public IOutStream, + public CMyUnknownImp +{ + UInt64 _offset; + CMyComPtr _stream; +public: + HRESULT Init(IOutStream *stream, UInt64 offset); + + MY_UNKNOWN_IMP + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(UInt64 newSize); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OutBuffer.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OutBuffer.cpp new file mode 100644 index 0000000000..fb8dc8d16d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OutBuffer.cpp @@ -0,0 +1,111 @@ +// OutBuffer.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "OutBuffer.h" + +bool COutBuffer::Create(UInt32 bufSize) throw() +{ + const UInt32 kMinBlockSize = 1; + if (bufSize < kMinBlockSize) + bufSize = kMinBlockSize; + if (_buf != 0 && _bufSize == bufSize) + return true; + Free(); + _bufSize = bufSize; + _buf = (Byte *)::MidAlloc(bufSize); + return (_buf != 0); +} + +void COutBuffer::Free() throw() +{ + ::MidFree(_buf); + _buf = 0; +} + +void COutBuffer::Init() throw() +{ + _streamPos = 0; + _limitPos = _bufSize; + _pos = 0; + _processedSize = 0; + _overDict = false; + #ifdef _NO_EXCEPTIONS + ErrorCode = S_OK; + #endif +} + +UInt64 COutBuffer::GetProcessedSize() const throw() +{ + UInt64 res = _processedSize + _pos - _streamPos; + if (_streamPos > _pos) + res += _bufSize; + return res; +} + + +HRESULT COutBuffer::FlushPart() throw() +{ + // _streamPos < _bufSize + UInt32 size = (_streamPos >= _pos) ? (_bufSize - _streamPos) : (_pos - _streamPos); + HRESULT result = S_OK; + #ifdef _NO_EXCEPTIONS + result = ErrorCode; + #endif + if (_buf2 != 0) + { + memcpy(_buf2, _buf + _streamPos, size); + _buf2 += size; + } + + if (_stream != 0 + #ifdef _NO_EXCEPTIONS + && (ErrorCode == S_OK) + #endif + ) + { + UInt32 processedSize = 0; + result = _stream->Write(_buf + _streamPos, size, &processedSize); + size = processedSize; + } + _streamPos += size; + if (_streamPos == _bufSize) + _streamPos = 0; + if (_pos == _bufSize) + { + _overDict = true; + _pos = 0; + } + _limitPos = (_streamPos > _pos) ? _streamPos : _bufSize; + _processedSize += size; + return result; +} + +HRESULT COutBuffer::Flush() throw() +{ + #ifdef _NO_EXCEPTIONS + if (ErrorCode != S_OK) + return ErrorCode; + #endif + + while (_streamPos != _pos) + { + HRESULT result = FlushPart(); + if (result != S_OK) + return result; + } + return S_OK; +} + +void COutBuffer::FlushWithCheck() +{ + HRESULT result = Flush(); + #ifdef _NO_EXCEPTIONS + ErrorCode = result; + #else + if (result != S_OK) + throw COutBufferException(result); + #endif +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OutBuffer.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OutBuffer.h new file mode 100644 index 0000000000..90ce25d6f9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/OutBuffer.h @@ -0,0 +1,63 @@ +// OutBuffer.h + +#ifndef __OUT_BUFFER_H +#define __OUT_BUFFER_H + +#include "../IStream.h" +#include "../../Common/MyCom.h" +#include "../../Common/MyException.h" + +#ifndef _NO_EXCEPTIONS +struct COutBufferException: public CSystemException +{ + COutBufferException(HRESULT errorCode): CSystemException(errorCode) {} +}; +#endif + +class COutBuffer +{ +protected: + Byte *_buf; + UInt32 _pos; + UInt32 _limitPos; + UInt32 _streamPos; + UInt32 _bufSize; + ISequentialOutStream *_stream; + UInt64 _processedSize; + Byte *_buf2; + bool _overDict; + + HRESULT FlushPart() throw(); +public: + #ifdef _NO_EXCEPTIONS + HRESULT ErrorCode; + #endif + + COutBuffer(): _buf(0), _pos(0), _stream(0), _buf2(0) {} + ~COutBuffer() { Free(); } + + bool Create(UInt32 bufSize) throw(); + void Free() throw(); + + void SetMemStream(Byte *buf) { _buf2 = buf; } + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void Init() throw(); + HRESULT Flush() throw(); + void FlushWithCheck(); + + void WriteByte(Byte b) + { + _buf[_pos++] = b; + if (_pos == _limitPos) + FlushWithCheck(); + } + void WriteBytes(const void *data, size_t size) + { + for (size_t i = 0; i < size; i++) + WriteByte(((const Byte *)data)[i]); + } + + UInt64 GetProcessedSize() const throw(); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/ProgressUtils.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/ProgressUtils.cpp new file mode 100644 index 0000000000..86f1e78268 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/ProgressUtils.cpp @@ -0,0 +1,51 @@ +// ProgressUtils.cpp + +#include "StdAfx.h" + +#include "ProgressUtils.h" + +CLocalProgress::CLocalProgress(): + ProgressOffset(0), + InSize(0), + OutSize(0), + SendRatio(true), + SendProgress(true) + {} + +void CLocalProgress::Init(IProgress *progress, bool inSizeIsMain) +{ + _ratioProgress.Release(); + _progress = progress; + _progress.QueryInterface(IID_ICompressProgressInfo, &_ratioProgress); + _inSizeIsMain = inSizeIsMain; +} + +STDMETHODIMP CLocalProgress::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) +{ + UInt64 inSize2 = InSize; + UInt64 outSize2 = OutSize; + + if (inSize) + inSize2 += (*inSize); + if (outSize) + outSize2 += (*outSize); + + if (SendRatio && _ratioProgress) + { + RINOK(_ratioProgress->SetRatioInfo(&inSize2, &outSize2)); + } + + if (SendProgress) + { + inSize2 += ProgressOffset; + outSize2 += ProgressOffset; + return _progress->SetCompleted(_inSizeIsMain ? &inSize2 : &outSize2); + } + + return S_OK; +} + +HRESULT CLocalProgress::SetCur() +{ + return SetRatioInfo(NULL, NULL); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/ProgressUtils.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/ProgressUtils.h new file mode 100644 index 0000000000..176e8bb438 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/ProgressUtils.h @@ -0,0 +1,35 @@ +// ProgressUtils.h + +#ifndef __PROGRESS_UTILS_H +#define __PROGRESS_UTILS_H + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" +#include "../IProgress.h" + +class CLocalProgress: + public ICompressProgressInfo, + public CMyUnknownImp +{ + CMyComPtr _progress; + CMyComPtr _ratioProgress; + bool _inSizeIsMain; +public: + UInt64 ProgressOffset; + UInt64 InSize; + UInt64 OutSize; + bool SendRatio; + bool SendProgress; + + CLocalProgress(); + + void Init(IProgress *progress, bool inSizeIsMain); + HRESULT SetCur(); + + MY_UNKNOWN_IMP1(ICompressProgressInfo) + + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/PropId.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/PropId.cpp new file mode 100644 index 0000000000..96f8f0564f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/PropId.cpp @@ -0,0 +1,108 @@ +// PropId.cpp + +#include "StdAfx.h" + +#include "../../Common/MyWindows.h" + +#include "../PropID.h" + +// VARTYPE +const Byte k7z_PROPID_To_VARTYPE[kpid_NUM_DEFINED] = +{ + VT_EMPTY, + VT_UI4, + VT_UI4, + VT_BSTR, + VT_BSTR, + VT_BSTR, + VT_BOOL, + VT_UI8, + VT_UI8, + VT_UI4, + VT_FILETIME, + VT_FILETIME, + VT_FILETIME, + VT_BOOL, + VT_BOOL, + VT_BOOL, + VT_BOOL, + VT_BOOL, + VT_UI4, + VT_UI4, + VT_BSTR, + VT_BOOL, + VT_BSTR, + VT_BSTR, + VT_BSTR, + VT_BSTR, + VT_BSTR, + VT_UI8, + VT_BSTR, + VT_UI8, + VT_BSTR, + VT_UI8, + VT_UI8, + VT_BSTR, // or VT_UI8 kpidUnpackVer + VT_UI4, // or VT_UI8 kpidVolume + VT_BOOL, + VT_UI8, + VT_UI8, + VT_UI8, + VT_UI8, + VT_UI4, + VT_BOOL, + VT_BOOL, + VT_BSTR, + VT_UI8, + VT_UI8, + VT_UI4, // kpidChecksum + VT_BSTR, + VT_UI8, + VT_BSTR, // or VT_UI8 kpidId + VT_BSTR, + VT_BSTR, + VT_UI4, + VT_UI4, + VT_BSTR, + VT_BSTR, + VT_UI8, + VT_UI8, + VT_UI4, + VT_BSTR, + VT_BSTR, + VT_BSTR, + VT_BSTR, // kpidNtSecure + VT_BOOL, + VT_BOOL, + VT_BOOL, + VT_BOOL, + VT_BSTR, // SHA-1 + VT_BSTR, // SHA-256 + VT_BSTR, + VT_UI8, + VT_UI4, + VT_UI4, + VT_BSTR, + VT_UI8, + VT_UI8, + VT_UI8, + VT_UI8, + VT_UI8, + VT_UI8, + VT_UI8, + VT_BSTR, + VT_BSTR, + VT_BSTR, + VT_BOOL, + VT_BOOL, + VT_BOOL, + VT_UI8, + VT_UI8, + VT_BSTR, // kpidNtReparse + VT_BSTR, + VT_UI8, + VT_UI8, + VT_BOOL, + VT_BSTR, + VT_BSTR +}; diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/RegisterArc.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/RegisterArc.h new file mode 100644 index 0000000000..08aa2d478e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/RegisterArc.h @@ -0,0 +1,78 @@ +// RegisterArc.h + +#ifndef __REGISTER_ARC_H +#define __REGISTER_ARC_H + +#include "../Archive/IArchive.h" + +struct CArcInfo +{ + UInt16 Flags; + Byte Id; + Byte SignatureSize; + UInt16 SignatureOffset; + + const Byte *Signature; + const char *Name; + const char *Ext; + const char *AddExt; + + Func_CreateInArchive CreateInArchive; + Func_CreateOutArchive CreateOutArchive; + Func_IsArc IsArc; + + bool IsMultiSignature() const { return (Flags & NArcInfoFlags::kMultiSignature) != 0; } +}; + +void RegisterArc(const CArcInfo *arcInfo) throw(); + + +#define IMP_CreateArcIn_2(c) \ + static IInArchive *CreateArc() { return new c; } + +#define IMP_CreateArcIn IMP_CreateArcIn_2(CHandler()) + +#ifdef EXTRACT_ONLY + #define IMP_CreateArcOut + #define CreateArcOut NULL +#else + #define IMP_CreateArcOut static IOutArchive *CreateArcOut() { return new CHandler(); } +#endif + +#define REGISTER_ARC_V(n, e, ae, id, sigSize, sig, offs, flags, crIn, crOut, isArc) \ + static const CArcInfo g_ArcInfo = { flags, id, sigSize, offs, sig, n, e, ae, crIn, crOut, isArc } ; \ + +#define REGISTER_ARC_R(n, e, ae, id, sigSize, sig, offs, flags, crIn, crOut, isArc) \ + REGISTER_ARC_V(n, e, ae, id, sigSize, sig, offs, flags, crIn, crOut, isArc) \ + struct CRegisterArc { CRegisterArc() { RegisterArc(&g_ArcInfo); }}; \ + static CRegisterArc g_RegisterArc; + + +#define REGISTER_ARC_I_CLS(cls, n, e, ae, id, sig, offs, flags, isArc) \ + IMP_CreateArcIn_2(cls) \ + REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, CreateArc, NULL, isArc) + +#define REGISTER_ARC_I_CLS_NO_SIG(cls, n, e, ae, id, offs, flags, isArc) \ + IMP_CreateArcIn_2(cls) \ + REGISTER_ARC_R(n, e, ae, id, 0, NULL, offs, flags, CreateArc, NULL, isArc) + +#define REGISTER_ARC_I(n, e, ae, id, sig, offs, flags, isArc) \ + REGISTER_ARC_I_CLS(CHandler(), n, e, ae, id, sig, offs, flags, isArc) + +#define REGISTER_ARC_I_NO_SIG(n, e, ae, id, offs, flags, isArc) \ + REGISTER_ARC_I_CLS_NO_SIG(CHandler(), n, e, ae, id, offs, flags, isArc) + + +#define REGISTER_ARC_IO(n, e, ae, id, sig, offs, flags, isArc) \ + IMP_CreateArcIn \ + IMP_CreateArcOut \ + REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, CreateArc, CreateArcOut, isArc) + +#define REGISTER_ARC_IO_DECREMENT_SIG(n, e, ae, id, sig, offs, flags, isArc) \ + IMP_CreateArcIn \ + IMP_CreateArcOut \ + REGISTER_ARC_V(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, CreateArc, CreateArcOut, isArc) \ + struct CRegisterArcDecSig { CRegisterArcDecSig() { sig[0]--; RegisterArc(&g_ArcInfo); }}; \ + static CRegisterArcDecSig g_RegisterArc; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/RegisterCodec.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/RegisterCodec.h new file mode 100644 index 0000000000..b5660658fd --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/RegisterCodec.h @@ -0,0 +1,106 @@ +// RegisterCodec.h + +#ifndef __REGISTER_CODEC_H +#define __REGISTER_CODEC_H + +#include "../Common/MethodId.h" + +#include "../ICoder.h" + +typedef void * (*CreateCodecP)(); + +struct CCodecInfo +{ + CreateCodecP CreateDecoder; + CreateCodecP CreateEncoder; + CMethodId Id; + const char *Name; + UInt32 NumStreams; + bool IsFilter; +}; + +void RegisterCodec(const CCodecInfo *codecInfo) throw(); + + +#define REGISTER_CODEC_CREATE_2(name, cls, i) static void *name() { return (void *)(i *)(new cls); } +#define REGISTER_CODEC_CREATE(name, cls) REGISTER_CODEC_CREATE_2(name, cls, ICompressCoder) + +#define REGISTER_CODEC_NAME(x) CRegisterCodec ## x +#define REGISTER_CODEC_VAR static const CCodecInfo g_CodecInfo = + +#define REGISTER_CODEC(x) struct REGISTER_CODEC_NAME(x) { \ + REGISTER_CODEC_NAME(x)() { RegisterCodec(&g_CodecInfo); }}; \ + static REGISTER_CODEC_NAME(x) g_RegisterCodec; + + +#define REGISTER_CODECS_NAME(x) CRegisterCodecs ## x +#define REGISTER_CODECS_VAR static const CCodecInfo g_CodecsInfo[] = + +#define REGISTER_CODECS(x) struct REGISTER_CODECS_NAME(x) { \ + REGISTER_CODECS_NAME(x)() { for (unsigned i = 0; i < ARRAY_SIZE(g_CodecsInfo); i++) \ + RegisterCodec(&g_CodecsInfo[i]); }}; \ + static REGISTER_CODECS_NAME(x) g_RegisterCodecs; + + +#define REGISTER_CODEC_2(x, crDec, crEnc, id, name) \ + REGISTER_CODEC_VAR \ + { crDec, crEnc, id, name, 1, false }; \ + REGISTER_CODEC(x) + + +#ifdef EXTRACT_ONLY + #define REGISTER_CODEC_E(x, clsDec, clsEnc, id, name) \ + REGISTER_CODEC_CREATE(CreateDec, clsDec) \ + REGISTER_CODEC_2(x, CreateDec, NULL, id, name) +#else + #define REGISTER_CODEC_E(x, clsDec, clsEnc, id, name) \ + REGISTER_CODEC_CREATE(CreateDec, clsDec) \ + REGISTER_CODEC_CREATE(CreateEnc, clsEnc) \ + REGISTER_CODEC_2(x, CreateDec, CreateEnc, id, name) +#endif + + + +#define REGISTER_FILTER_CREATE(name, cls) REGISTER_CODEC_CREATE_2(name, cls, ICompressFilter) + +#define REGISTER_FILTER_ITEM(crDec, crEnc, id, name) \ + { crDec, crEnc, id, name, 1, true } + +#define REGISTER_FILTER(x, crDec, crEnc, id, name) \ + REGISTER_CODEC_VAR \ + REGISTER_FILTER_ITEM(crDec, crEnc, id, name); \ + REGISTER_CODEC(x) + +#ifdef EXTRACT_ONLY + #define REGISTER_FILTER_E(x, clsDec, clsEnc, id, name) \ + REGISTER_FILTER_CREATE(CreateDec, clsDec) \ + REGISTER_FILTER(x, CreateDec, NULL, id, name) +#else + #define REGISTER_FILTER_E(x, clsDec, clsEnc, id, name) \ + REGISTER_FILTER_CREATE(CreateDec, clsDec) \ + REGISTER_FILTER_CREATE(CreateEnc, clsEnc) \ + REGISTER_FILTER(x, CreateDec, CreateEnc, id, name) +#endif + + + +struct CHasherInfo +{ + IHasher * (*CreateHasher)(); + CMethodId Id; + const char *Name; + UInt32 DigestSize; +}; + +void RegisterHasher(const CHasherInfo *hasher) throw(); + +#define REGISTER_HASHER_NAME(x) CRegHasher_ ## x + +#define REGISTER_HASHER(cls, id, name, size) \ + STDMETHODIMP_(UInt32) cls::GetDigestSize() throw() { return size; } \ + static IHasher *CreateHasherSpec() { return new cls(); } \ + static const CHasherInfo g_HasherInfo = { CreateHasherSpec, id, name, size }; \ + struct REGISTER_HASHER_NAME(cls) { REGISTER_HASHER_NAME(cls)() { RegisterHasher(&g_HasherInfo); }}; \ + static REGISTER_HASHER_NAME(cls) g_RegisterHasher; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StdAfx.h new file mode 100644 index 0000000000..0b4cb3d0bb --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StdAfx.h @@ -0,0 +1,10 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../Common/Common.h" +#include "../../../../src/LzmaAppleCommon.h" +#include "../../../../src/LzmaSDKObjCExtern.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamBinder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamBinder.cpp new file mode 100644 index 0000000000..a6627db213 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamBinder.cpp @@ -0,0 +1,156 @@ +// StreamBinder.cpp + +#include "StdAfx.h" + +#include "../../Common/MyCom.h" + +#include "StreamBinder.h" + +class CBinderInStream: + public ISequentialInStream, + public CMyUnknownImp +{ + CStreamBinder *_binder; +public: + MY_UNKNOWN_IMP1(ISequentialInStream) + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + ~CBinderInStream() { _binder->CloseRead(); } + CBinderInStream(CStreamBinder *binder): _binder(binder) {} +}; + +STDMETHODIMP CBinderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) + { return _binder->Read(data, size, processedSize); } + +class CBinderOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + CStreamBinder *_binder; +public: + MY_UNKNOWN_IMP1(ISequentialOutStream) + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + ~CBinderOutStream() { _binder->CloseWrite(); } + CBinderOutStream(CStreamBinder *binder): _binder(binder) {} +}; + +STDMETHODIMP CBinderOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) + { return _binder->Write(data, size, processedSize); } + + + +WRes CStreamBinder::CreateEvents() +{ + RINOK(_canWrite_Event.Create()); + RINOK(_canRead_Event.Create()); + return _readingWasClosed_Event.Create(); +} + +void CStreamBinder::ReInit() +{ + _canWrite_Event.Reset(); + _canRead_Event.Reset(); + _readingWasClosed_Event.Reset(); + + // _readingWasClosed = false; + _readingWasClosed2 = false; + + _waitWrite = true; + _bufSize = 0; + _buf = NULL; + ProcessedSize = 0; + // WritingWasCut = false; +} + + +void CStreamBinder::CreateStreams(ISequentialInStream **inStream, ISequentialOutStream **outStream) +{ + // _readingWasClosed = false; + _readingWasClosed2 = false; + + _waitWrite = true; + _bufSize = 0; + _buf = NULL; + ProcessedSize = 0; + // WritingWasCut = false; + + CBinderInStream *inStreamSpec = new CBinderInStream(this); + CMyComPtr inStreamLoc(inStreamSpec); + *inStream = inStreamLoc.Detach(); + + CBinderOutStream *outStreamSpec = new CBinderOutStream(this); + CMyComPtr outStreamLoc(outStreamSpec); + *outStream = outStreamLoc.Detach(); +} + +// (_canRead_Event && _bufSize == 0) means that stream is finished. + +HRESULT CStreamBinder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size != 0) + { + if (_waitWrite) + { + RINOK(_canRead_Event.Lock()); + _waitWrite = false; + } + if (size > _bufSize) + size = _bufSize; + if (size != 0) + { + memcpy(data, _buf, size); + _buf = ((const Byte *)_buf) + size; + ProcessedSize += size; + if (processedSize) + *processedSize = size; + _bufSize -= size; + if (_bufSize == 0) + { + _waitWrite = true; + _canRead_Event.Reset(); + _canWrite_Event.Set(); + } + } + } + return S_OK; +} + +HRESULT CStreamBinder::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + + if (!_readingWasClosed2) + { + _buf = data; + _bufSize = size; + _canRead_Event.Set(); + + /* + _canWrite_Event.Lock(); + if (_readingWasClosed) + _readingWasClosed2 = true; + */ + + HANDLE events[2] = { _canWrite_Event, _readingWasClosed_Event }; + DWORD waitResult = ::WaitForMultipleObjects(2, events, FALSE, INFINITE); + if (waitResult >= WAIT_OBJECT_0 + 2) + return E_FAIL; + + size -= _bufSize; + if (size != 0) + { + if (processedSize) + *processedSize = size; + return S_OK; + } + // if (waitResult == WAIT_OBJECT_0 + 1) + _readingWasClosed2 = true; + } + + // WritingWasCut = true; + return k_My_HRESULT_WritingWasCut; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamBinder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamBinder.h new file mode 100644 index 0000000000..f4d4f3b42c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamBinder.h @@ -0,0 +1,60 @@ +// StreamBinder.h + +#ifndef __STREAM_BINDER_H +#define __STREAM_BINDER_H + +#include "../../Windows/Synchronization.h" + +#include "../IStream.h" + +/* +We don't use probably UNSAFE version: +reader thread: + _canWrite_Event.Set(); + _readingWasClosed = true + _canWrite_Event.Set(); +writer thread: + _canWrite_Event.Wait() + if (_readingWasClosed) +Can second call of _canWrite_Event.Set() be executed without memory barrier, if event is already set? +*/ + +class CStreamBinder +{ + NWindows::NSynchronization::CAutoResetEvent _canWrite_Event; + NWindows::NSynchronization::CManualResetEvent _canRead_Event; + NWindows::NSynchronization::CManualResetEvent _readingWasClosed_Event; + + // bool _readingWasClosed; + bool _readingWasClosed2; + // bool WritingWasCut; + bool _waitWrite; + UInt32 _bufSize; + const void *_buf; +public: + UInt64 ProcessedSize; + + WRes CreateEvents(); + void CreateStreams(ISequentialInStream **inStream, ISequentialOutStream **outStream); + + void ReInit(); + + HRESULT Read(void *data, UInt32 size, UInt32 *processedSize); + HRESULT Write(const void *data, UInt32 size, UInt32 *processedSize); + + void CloseRead() + { + _readingWasClosed_Event.Set(); + // _readingWasClosed = true; + // _canWrite_Event.Set(); + } + + void CloseWrite() + { + _buf = NULL; + _bufSize = 0; + _canRead_Event.Set(); + } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamObjects.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamObjects.cpp new file mode 100644 index 0000000000..4cd9cc65be --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamObjects.cpp @@ -0,0 +1,285 @@ +// StreamObjects.cpp + +#include "StdAfx.h" + +#include + +#include "../../../C/Alloc.h" + +#include "StreamObjects.h" + +STDMETHODIMP CBufferInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + if (_pos >= Buf.Size()) + return S_OK; + size_t rem = Buf.Size() - (size_t)_pos; + if (rem > size) + rem = (size_t)size; + memcpy(data, (const Byte *)Buf + (size_t)_pos, rem); + _pos += rem; + if (processedSize) + *processedSize = (UInt32)rem; + return S_OK; +} + +STDMETHODIMP CBufferInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _pos; break; + case STREAM_SEEK_END: offset += Buf.Size(); break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _pos = offset; + if (newPosition) + *newPosition = offset; + return S_OK; +} + +STDMETHODIMP CBufInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + if (_pos >= _size) + return S_OK; + size_t rem = _size - (size_t)_pos; + if (rem > size) + rem = (size_t)size; + memcpy(data, _data + (size_t)_pos, rem); + _pos += rem; + if (processedSize) + *processedSize = (UInt32)rem; + return S_OK; +} + +STDMETHODIMP CBufInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _pos; break; + case STREAM_SEEK_END: offset += _size; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _pos = offset; + if (newPosition) + *newPosition = offset; + return S_OK; +} + +void Create_BufInStream_WithReference(const void *data, size_t size, IUnknown *ref, ISequentialInStream **stream) +{ + *stream = NULL; + CBufInStream *inStreamSpec = new CBufInStream; + CMyComPtr streamTemp = inStreamSpec; + inStreamSpec->Init((const Byte *)data, size, ref); + *stream = streamTemp.Detach(); +} + +void Create_BufInStream_WithNewBuffer(const void *data, size_t size, ISequentialInStream **stream) +{ + *stream = NULL; + CBufferInStream *inStreamSpec = new CBufferInStream; + CMyComPtr streamTemp = inStreamSpec; + inStreamSpec->Buf.CopyFrom((const Byte *)data, size); + inStreamSpec->Init(); + *stream = streamTemp.Detach(); +} + +void CByteDynBuffer::Free() throw() +{ + free(_buf); + _buf = 0; + _capacity = 0; +} + +bool CByteDynBuffer::EnsureCapacity(size_t cap) throw() +{ + if (cap <= _capacity) + return true; + size_t delta; + if (_capacity > 64) + delta = _capacity / 4; + else if (_capacity > 8) + delta = 16; + else + delta = 4; + cap = MyMax(_capacity + delta, cap); + Byte *buf = (Byte *)realloc(_buf, cap); + if (!buf) + return false; + _buf = buf; + _capacity = cap; + return true; +} + +Byte *CDynBufSeqOutStream::GetBufPtrForWriting(size_t addSize) +{ + addSize += _size; + if (addSize < _size) + return NULL; + if (!_buffer.EnsureCapacity(addSize)) + return NULL; + return (Byte *)_buffer + _size; +} + +void CDynBufSeqOutStream::CopyToBuffer(CByteBuffer &dest) const +{ + dest.CopyFrom((const Byte *)_buffer, _size); +} + +STDMETHODIMP CDynBufSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + Byte *buf = GetBufPtrForWriting(size); + if (!buf) + return E_OUTOFMEMORY; + memcpy(buf, data, size); + UpdateSize(size); + if (processedSize) + *processedSize = size; + return S_OK; +} + +STDMETHODIMP CBufPtrSeqOutStream::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + size_t rem = _size - _pos; + if (rem > size) + rem = (size_t)size; + if (rem != 0) + { + memcpy(_buffer + _pos, data, rem); + _pos += rem; + } + if (processedSize) + *processedSize = (UInt32)rem; + return (rem != 0 || size == 0) ? S_OK : E_FAIL; +} + +STDMETHODIMP CSequentialOutStreamSizeCount::Write(const void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize; + HRESULT result = _stream->Write(data, size, &realProcessedSize); + _size += realProcessedSize; + if (processedSize) + *processedSize = realProcessedSize; + return result; +} + +static const UInt64 kEmptyTag = (UInt64)(Int64)-1; + +void CCachedInStream::Free() throw() +{ + MyFree(_tags); + _tags = 0; + MidFree(_data); + _data = 0; +} + +bool CCachedInStream::Alloc(unsigned blockSizeLog, unsigned numBlocksLog) throw() +{ + unsigned sizeLog = blockSizeLog + numBlocksLog; + if (sizeLog >= sizeof(size_t) * 8) + return false; + size_t dataSize = (size_t)1 << sizeLog; + if (_data == 0 || dataSize != _dataSize) + { + MidFree(_data); + _data = (Byte *)MidAlloc(dataSize); + if (_data == 0) + return false; + _dataSize = dataSize; + } + if (_tags == 0 || numBlocksLog != _numBlocksLog) + { + MyFree(_tags); + _tags = (UInt64 *)MyAlloc(sizeof(UInt64) << numBlocksLog); + if (_tags == 0) + return false; + _numBlocksLog = numBlocksLog; + } + _blockSizeLog = blockSizeLog; + return true; +} + +void CCachedInStream::Init(UInt64 size) throw() +{ + _size = size; + _pos = 0; + size_t numBlocks = (size_t)1 << _numBlocksLog; + for (size_t i = 0; i < numBlocks; i++) + _tags[i] = kEmptyTag; +} + +STDMETHODIMP CCachedInStream::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + if (size == 0) + return S_OK; + if (_pos >= _size) + return S_OK; + + { + UInt64 rem = _size - _pos; + if (size > rem) + size = (UInt32)rem; + } + + while (size != 0) + { + UInt64 cacheTag = _pos >> _blockSizeLog; + size_t cacheIndex = (size_t)cacheTag & (((size_t)1 << _numBlocksLog) - 1); + Byte *p = _data + (cacheIndex << _blockSizeLog); + if (_tags[cacheIndex] != cacheTag) + { + UInt64 remInBlock = _size - (cacheTag << _blockSizeLog); + size_t blockSize = (size_t)1 << _blockSizeLog; + if (blockSize > remInBlock) + blockSize = (size_t)remInBlock; + RINOK(ReadBlock(cacheTag, p, blockSize)); + _tags[cacheIndex] = cacheTag; + } + size_t offset = (size_t)_pos & (((size_t)1 << _blockSizeLog) - 1); + UInt32 cur = (UInt32)MyMin(((size_t)1 << _blockSizeLog) - offset, (size_t)size); + memcpy(data, p + offset, cur); + if (processedSize) + *processedSize += cur; + data = (void *)((const Byte *)data + cur); + _pos += cur; + size -= cur; + } + + return S_OK; +} + +STDMETHODIMP CCachedInStream::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) +{ + switch (seekOrigin) + { + case STREAM_SEEK_SET: break; + case STREAM_SEEK_CUR: offset += _pos; break; + case STREAM_SEEK_END: offset += _size; break; + default: return STG_E_INVALIDFUNCTION; + } + if (offset < 0) + return HRESULT_WIN32_ERROR_NEGATIVE_SEEK; + _pos = offset; + if (newPosition) + *newPosition = offset; + return S_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamObjects.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamObjects.h new file mode 100644 index 0000000000..c3e083747f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamObjects.h @@ -0,0 +1,157 @@ +// StreamObjects.h + +#ifndef __STREAM_OBJECTS_H +#define __STREAM_OBJECTS_H + +#include "../../Common/MyBuffer.h" +#include "../../Common/MyCom.h" +#include "../../Common/MyVector.h" + +#include "../IStream.h" + +class CBufferInStream: + public IInStream, + public CMyUnknownImp +{ + UInt64 _pos; +public: + CByteBuffer Buf; + void Init() { _pos = 0; } + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; + +struct CReferenceBuf: + public IUnknown, + public CMyUnknownImp +{ + CByteBuffer Buf; + MY_UNKNOWN_IMP +}; + +class CBufInStream: + public IInStream, + public CMyUnknownImp +{ + const Byte *_data; + UInt64 _pos; + size_t _size; + CMyComPtr _ref; +public: + void Init(const Byte *data, size_t size, IUnknown *ref = 0) + { + _data = data; + _size = size; + _pos = 0; + _ref = ref; + } + void Init(CReferenceBuf *ref) { Init(ref->Buf, ref->Buf.Size(), ref); } + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; + +void Create_BufInStream_WithReference(const void *data, size_t size, IUnknown *ref, ISequentialInStream **stream); +void Create_BufInStream_WithNewBuffer(const void *data, size_t size, ISequentialInStream **stream); +inline void Create_BufInStream_WithNewBuffer(const CByteBuffer &buf, ISequentialInStream **stream) + { Create_BufInStream_WithNewBuffer(buf, buf.Size(), stream); } + +class CByteDynBuffer +{ + size_t _capacity; + Byte *_buf; +public: + CByteDynBuffer(): _capacity(0), _buf(0) {}; + // there is no copy constructor. So don't copy this object. + ~CByteDynBuffer() { Free(); } + void Free() throw(); + size_t GetCapacity() const { return _capacity; } + operator Byte*() const { return _buf; } + operator const Byte*() const { return _buf; } + bool EnsureCapacity(size_t capacity) throw(); +}; + +class CDynBufSeqOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + CByteDynBuffer _buffer; + size_t _size; +public: + CDynBufSeqOutStream(): _size(0) {} + void Init() { _size = 0; } + size_t GetSize() const { return _size; } + const Byte *GetBuffer() const { return _buffer; } + void CopyToBuffer(CByteBuffer &dest) const; + Byte *GetBufPtrForWriting(size_t addSize); + void UpdateSize(size_t addSize) { _size += addSize; } + + MY_UNKNOWN_IMP1(ISequentialOutStream) + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +class CBufPtrSeqOutStream: + public ISequentialOutStream, + public CMyUnknownImp +{ + Byte *_buffer; + size_t _size; + size_t _pos; +public: + void Init(Byte *buffer, size_t size) + { + _buffer = buffer; + _pos = 0; + _size = size; + } + size_t GetPos() const { return _pos; } + + MY_UNKNOWN_IMP1(ISequentialOutStream) + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +class CSequentialOutStreamSizeCount: + public ISequentialOutStream, + public CMyUnknownImp +{ + CMyComPtr _stream; + UInt64 _size; +public: + void SetStream(ISequentialOutStream *stream) { _stream = stream; } + void Init() { _size = 0; } + UInt64 GetSize() const { return _size; } + + MY_UNKNOWN_IMP1(ISequentialOutStream) + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); +}; + +class CCachedInStream: + public IInStream, + public CMyUnknownImp +{ + UInt64 *_tags; + Byte *_data; + size_t _dataSize; + unsigned _blockSizeLog; + unsigned _numBlocksLog; + UInt64 _size; + UInt64 _pos; +protected: + virtual HRESULT ReadBlock(UInt64 blockIndex, Byte *dest, size_t blockSize) = 0; +public: + CCachedInStream(): _tags(0), _data(0) {} + virtual ~CCachedInStream() { Free(); } // the destructor must be virtual (release calls it) !!! + void Free() throw(); + bool Alloc(unsigned blockSizeLog, unsigned numBlocksLog) throw(); + void Init(UInt64 size) throw(); + + MY_UNKNOWN_IMP2(ISequentialInStream, IInStream) + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamUtils.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamUtils.cpp new file mode 100644 index 0000000000..2031828518 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamUtils.cpp @@ -0,0 +1,66 @@ +// StreamUtils.cpp + +#include "StdAfx.h" + +#include "StreamUtils.h" + +#if !defined(__APPLE__) +static const UInt32 kBlockSize = ((UInt32)1 << 31); +#endif + +HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize) throw() +{ + size_t size = *processedSize; + *processedSize = 0; + while (size != 0) + { +#if defined(__APPLE__) + UInt32 curSize = (size < kLzmaSDKObjCStreamReadSize) ? (UInt32)size : kLzmaSDKObjCStreamReadSize; +#else + UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize; +#endif + UInt32 processedSizeLoc; + HRESULT res = stream->Read(data, curSize, &processedSizeLoc); + *processedSize += processedSizeLoc; + data = (void *)((Byte *)data + processedSizeLoc); + size -= processedSizeLoc; + RINOK(res); + if (processedSizeLoc == 0) + return S_OK; + } + return S_OK; +} + +HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) throw() +{ + size_t processedSize = size; + RINOK(ReadStream(stream, data, &processedSize)); + return (size == processedSize) ? S_OK : S_FALSE; +} + +HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) throw() +{ + size_t processedSize = size; + RINOK(ReadStream(stream, data, &processedSize)); + return (size == processedSize) ? S_OK : E_FAIL; +} + +HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) throw() +{ + while (size != 0) + { +#if defined(__APPLE__) + UInt32 curSize = (size < kLzmaSDKObjCStreamWriteSize) ? (UInt32)size : kLzmaSDKObjCStreamWriteSize; +#else + UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize; +#endif + UInt32 processedSizeLoc; + HRESULT res = stream->Write(data, curSize, &processedSizeLoc); + data = (const void *)((const Byte *)data + processedSizeLoc); + size -= processedSizeLoc; + RINOK(res); + if (processedSizeLoc == 0) + return E_FAIL; + } + return S_OK; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamUtils.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamUtils.h new file mode 100644 index 0000000000..799a8b9db1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/StreamUtils.h @@ -0,0 +1,13 @@ +// StreamUtils.h + +#ifndef __STREAM_UTILS_H +#define __STREAM_UTILS_H + +#include "../IStream.h" + +HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *size) throw(); +HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) throw(); +HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) throw(); +HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) throw(); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/UniqBlocks.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/UniqBlocks.cpp new file mode 100644 index 0000000000..5baf1a4953 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/UniqBlocks.cpp @@ -0,0 +1,57 @@ +// UniqBlocks.cpp + +#include "StdAfx.h" + +#include + +#include "UniqBlocks.h" + +unsigned CUniqBlocks::AddUniq(const Byte *data, size_t size) +{ + unsigned left = 0, right = Sorted.Size(); + while (left != right) + { + unsigned mid = (left + right) / 2; + unsigned index = Sorted[mid]; + const CByteBuffer &buf = Bufs[index]; + size_t sizeMid = buf.Size(); + if (size < sizeMid) + right = mid; + else if (size > sizeMid) + left = mid + 1; + else + { + if (size == 0) + return index; + int cmp = memcmp(data, buf, size); + if (cmp == 0) + return index; + if (cmp < 0) + right = mid; + else + left = mid + 1; + } + } + unsigned index = Bufs.Size(); + Sorted.Insert(left, index); + Bufs.AddNew().CopyFrom(data, size); + return index; +} + +UInt64 CUniqBlocks::GetTotalSizeInBytes() const +{ + UInt64 size = 0; + FOR_VECTOR (i, Bufs) + size += Bufs[i].Size(); + return size; +} + +void CUniqBlocks::GetReverseMap() +{ + unsigned num = Sorted.Size(); + BufIndexToSortedIndex.ClearAndSetSize(num); + unsigned *p = &BufIndexToSortedIndex[0]; + const unsigned *sorted = &Sorted[0]; + for (unsigned i = 0; i < num; i++) + p[sorted[i]] = i; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/UniqBlocks.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/UniqBlocks.h new file mode 100644 index 0000000000..78602bb0f7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/UniqBlocks.h @@ -0,0 +1,26 @@ +// UniqBlocks.h + +#ifndef __UNIQ_BLOCKS_H +#define __UNIQ_BLOCKS_H + +#include "../../Common/MyTypes.h" +#include "../../Common/MyBuffer.h" +#include "../../Common/MyVector.h" + +struct CUniqBlocks +{ + CObjectVector Bufs; + CUIntVector Sorted; + CUIntVector BufIndexToSortedIndex; + + unsigned AddUniq(const Byte *data, size_t size); + UInt64 GetTotalSizeInBytes() const; + void GetReverseMap(); + + bool IsOnlyEmpty() const + { + return (Bufs.Size() == 0 || (Bufs.Size() == 1 && Bufs[0].Size() == 0)); + } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/VirtThread.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/VirtThread.cpp new file mode 100644 index 0000000000..3cf9acd3ea --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/VirtThread.cpp @@ -0,0 +1,48 @@ +// VirtThread.cpp + +#include "StdAfx.h" + +#include "VirtThread.h" + +static THREAD_FUNC_DECL CoderThread(void *p) +{ + for (;;) + { + CVirtThread *t = (CVirtThread *)p; + t->StartEvent.Lock(); + if (t->Exit) + return 0; + t->Execute(); + t->FinishedEvent.Set(); + } +} + +WRes CVirtThread::Create() +{ + RINOK(StartEvent.CreateIfNotCreated()); + RINOK(FinishedEvent.CreateIfNotCreated()); + StartEvent.Reset(); + FinishedEvent.Reset(); + Exit = false; + if (Thread.IsCreated()) + return S_OK; + return Thread.Create(CoderThread, this); +} + +void CVirtThread::Start() +{ + Exit = false; + StartEvent.Set(); +} + +void CVirtThread::WaitThreadFinish() +{ + Exit = true; + if (StartEvent.IsCreated()) + StartEvent.Set(); + if (Thread.IsCreated()) + { + Thread.Wait(); + Thread.Close(); + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/VirtThread.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/VirtThread.h new file mode 100644 index 0000000000..a2711036ad --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Common/VirtThread.h @@ -0,0 +1,24 @@ +// VirtThread.h + +#ifndef __VIRT_THREAD_H +#define __VIRT_THREAD_H + +#include "../../Windows/Synchronization.h" +#include "../../Windows/Thread.h" + +struct CVirtThread +{ + NWindows::NSynchronization::CAutoResetEvent StartEvent; + NWindows::NSynchronization::CAutoResetEvent FinishedEvent; + NWindows::CThread Thread; + bool Exit; + + ~CVirtThread() { WaitThreadFinish(); } + void WaitThreadFinish(); // call it in destructor of child class ! + WRes Create(); + void Start(); + virtual void Execute() = 0; + void WaitExecuteFinish() { FinishedEvent.Lock(); } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Coder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Coder.cpp new file mode 100644 index 0000000000..261a626c0c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Coder.cpp @@ -0,0 +1,658 @@ +// Bcj2Coder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "../Common/StreamUtils.h" + +#include "Bcj2Coder.h" + +namespace NCompress { +namespace NBcj2 { + +CBaseCoder::CBaseCoder() +{ + for (int i = 0; i < BCJ2_NUM_STREAMS + 1; i++) + { + _bufs[i] = NULL; + _bufsCurSizes[i] = 0; + _bufsNewSizes[i] = (1 << 18); + } +} + +CBaseCoder::~CBaseCoder() +{ + for (int i = 0; i < BCJ2_NUM_STREAMS + 1; i++) + ::MidFree(_bufs[i]); +} + +HRESULT CBaseCoder::Alloc(bool allocForOrig) +{ + unsigned num = allocForOrig ? BCJ2_NUM_STREAMS + 1 : BCJ2_NUM_STREAMS; + for (unsigned i = 0; i < num; i++) + { + UInt32 newSize = _bufsNewSizes[i]; + const UInt32 kMinBufSize = 1; + if (newSize < kMinBufSize) + newSize = kMinBufSize; + if (!_bufs[i] || newSize != _bufsCurSizes[i]) + { + if (_bufs[i]) + { + ::MidFree(_bufs[i]); + _bufs[i] = 0; + } + _bufsCurSizes[i] = 0; + Byte *buf = (Byte *)::MidAlloc(newSize); + _bufs[i] = buf; + if (!buf) + return E_OUTOFMEMORY; + _bufsCurSizes[i] = newSize; + } + } + return S_OK; +} + + + +#ifndef EXTRACT_ONLY + +CEncoder::CEncoder(): _relatLim(BCJ2_RELAT_LIMIT) {} +CEncoder::~CEncoder() {} + +STDMETHODIMP CEncoder::SetInBufSize(UInt32, UInt32 size) { _bufsNewSizes[BCJ2_NUM_STREAMS] = size; return S_OK; } +STDMETHODIMP CEncoder::SetOutBufSize(UInt32 streamIndex, UInt32 size) { _bufsNewSizes[streamIndex] = size; return S_OK; } + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps) +{ + UInt32 relatLim = BCJ2_RELAT_LIMIT; + + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = props[i]; + PROPID propID = propIDs[i]; + if (propID >= NCoderPropID::kReduceSize) + continue; + switch (propID) + { + /* + case NCoderPropID::kDefaultProp: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 v = prop.ulVal; + if (v > 31) + return E_INVALIDARG; + relatLim = (UInt32)1 << v; + break; + } + */ + case NCoderPropID::kDictionarySize: + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + relatLim = prop.ulVal; + if (relatLim > ((UInt32)1 << 31)) + return E_INVALIDARG; + break; + } + + case NCoderPropID::kNumThreads: + continue; + case NCoderPropID::kLevel: + continue; + + default: return E_INVALIDARG; + } + } + + _relatLim = relatLim; + + return S_OK; +} + + +HRESULT CEncoder::CodeReal(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const * /* outSizes */, UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + if (numInStreams != 1 || numOutStreams != BCJ2_NUM_STREAMS) + return E_INVALIDARG; + + RINOK(Alloc()); + + UInt32 fileSize_for_Conv = 0; + if (inSizes && inSizes[0]) + { + UInt64 inSize = *inSizes[0]; + if (inSize <= BCJ2_FileSize_MAX) + fileSize_for_Conv = (UInt32)inSize; + } + + CMyComPtr getSubStreamSize; + inStreams[0]->QueryInterface(IID_ICompressGetSubStreamSize, (void **)&getSubStreamSize); + + CBcj2Enc enc; + + enc.src = _bufs[BCJ2_NUM_STREAMS]; + enc.srcLim = enc.src; + + { + for (int i = 0; i < BCJ2_NUM_STREAMS; i++) + { + enc.bufs[i] = _bufs[i]; + enc.lims[i] = _bufs[i] + _bufsCurSizes[i]; + } + } + + size_t numBytes_in_ReadBuf = 0; + UInt64 prevProgress = 0; + UInt64 totalStreamRead = 0; // size read from InputStream + UInt64 currentInPos = 0; // data that was processed, it doesn't include data in input buffer and data in enc.temp + UInt64 outSizeRc = 0; + + Bcj2Enc_Init(&enc); + + enc.fileIp = 0; + enc.fileSize = fileSize_for_Conv; + + enc.relatLimit = _relatLim; + + enc.finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; + + bool needSubSize = false; + UInt64 subStreamIndex = 0; + UInt64 subStreamStartPos = 0; + bool readWasFinished = false; + + for (;;) + { + if (needSubSize && getSubStreamSize) + { + enc.fileIp = 0; + enc.fileSize = fileSize_for_Conv; + enc.finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; + + for (;;) + { + UInt64 subStreamSize = 0; + HRESULT result = getSubStreamSize->GetSubStreamSize(subStreamIndex, &subStreamSize); + needSubSize = false; + + if (result == S_OK) + { + UInt64 newEndPos = subStreamStartPos + subStreamSize; + + bool isAccurateEnd = (newEndPos < totalStreamRead || + (newEndPos <= totalStreamRead && readWasFinished)); + + if (newEndPos <= currentInPos && isAccurateEnd) + { + subStreamStartPos = newEndPos; + subStreamIndex++; + continue; + } + + enc.srcLim = _bufs[BCJ2_NUM_STREAMS] + numBytes_in_ReadBuf; + + if (isAccurateEnd) + { + // data in enc.temp is possible here + size_t rem = (size_t)(totalStreamRead - newEndPos); + + /* Pos_of(enc.src) <= old newEndPos <= newEndPos + in another case, it's fail in some code */ + if ((size_t)(enc.srcLim - enc.src) < rem) + return E_FAIL; + + enc.srcLim -= rem; + enc.finishMode = BCJ2_ENC_FINISH_MODE_END_BLOCK; + } + + if (subStreamSize <= BCJ2_FileSize_MAX) + { + enc.fileIp = enc.ip + (UInt32)(subStreamStartPos - currentInPos); + enc.fileSize = (UInt32)subStreamSize; + } + break; + } + + if (result == S_FALSE) + break; + if (result == E_NOTIMPL) + { + getSubStreamSize.Release(); + break; + } + return result; + } + } + + if (readWasFinished && totalStreamRead - currentInPos == Bcj2Enc_Get_InputData_Size(&enc)) + enc.finishMode = BCJ2_ENC_FINISH_MODE_END_STREAM; + + Bcj2Enc_Encode(&enc); + + currentInPos = totalStreamRead - numBytes_in_ReadBuf + (enc.src - _bufs[BCJ2_NUM_STREAMS]) - enc.tempPos; + + if (Bcj2Enc_IsFinished(&enc)) + break; + + if (enc.state < BCJ2_NUM_STREAMS) + { + size_t curSize = enc.bufs[enc.state] - _bufs[enc.state]; + // printf("Write stream = %2d %6d\n", enc.state, curSize); + RINOK(WriteStream(outStreams[enc.state], _bufs[enc.state], curSize)); + if (enc.state == BCJ2_STREAM_RC) + outSizeRc += curSize; + + enc.bufs[enc.state] = _bufs[enc.state]; + enc.lims[enc.state] = _bufs[enc.state] + _bufsCurSizes[enc.state]; + } + else if (enc.state != BCJ2_ENC_STATE_ORIG) + return E_FAIL; + else + { + needSubSize = true; + + if (numBytes_in_ReadBuf != (size_t)(enc.src - _bufs[BCJ2_NUM_STREAMS])) + { + enc.srcLim = _bufs[BCJ2_NUM_STREAMS] + numBytes_in_ReadBuf; + continue; + } + + if (readWasFinished) + continue; + + numBytes_in_ReadBuf = 0; + enc.src = _bufs[BCJ2_NUM_STREAMS]; + enc.srcLim = _bufs[BCJ2_NUM_STREAMS]; + + UInt32 curSize = _bufsCurSizes[BCJ2_NUM_STREAMS]; + RINOK(inStreams[0]->Read(_bufs[BCJ2_NUM_STREAMS], curSize, &curSize)); + + // printf("Read %6d bytes\n", curSize); + if (curSize == 0) + { + readWasFinished = true; + continue; + } + + numBytes_in_ReadBuf = curSize; + totalStreamRead += numBytes_in_ReadBuf; + enc.srcLim = _bufs[BCJ2_NUM_STREAMS] + numBytes_in_ReadBuf; + } + + if (progress && currentInPos - prevProgress >= (1 << 20)) + { + UInt64 outSize2 = currentInPos + outSizeRc + enc.bufs[BCJ2_STREAM_RC] - enc.bufs[BCJ2_STREAM_RC]; + prevProgress = currentInPos; + // printf("progress %8d, %8d\n", (int)inSize2, (int)outSize2); + RINOK(progress->SetRatioInfo(¤tInPos, &outSize2)); + } + } + + for (int i = 0; i < BCJ2_NUM_STREAMS; i++) + { + RINOK(WriteStream(outStreams[i], _bufs[i], enc.bufs[i] - _bufs[i])); + } + + // if (currentInPos != subStreamStartPos + subStreamSize) return E_FAIL; + + return S_OK; +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + try + { + return CodeReal(inStreams, inSizes, numInStreams, outStreams, outSizes,numOutStreams, progress); + } + catch(...) { return E_FAIL; } +} + +#endif + + + + + + +STDMETHODIMP CDecoder::SetInBufSize(UInt32 streamIndex, UInt32 size) { _bufsNewSizes[streamIndex] = size; return S_OK; } +STDMETHODIMP CDecoder::SetOutBufSize(UInt32 , UInt32 size) { _bufsNewSizes[BCJ2_NUM_STREAMS] = size; return S_OK; } + +CDecoder::CDecoder(): _finishMode(false), _outSizeDefined(false), _outSize(0) +{} + +STDMETHODIMP CDecoder::SetFinishMode(UInt32 finishMode) +{ + _finishMode = (finishMode != 0); + return S_OK; +} + +void CDecoder::InitCommon() +{ + { + for (int i = 0; i < BCJ2_NUM_STREAMS; i++) + dec.lims[i] = dec.bufs[i] = _bufs[i]; + } + + { + for (int i = 0; i < BCJ2_NUM_STREAMS; i++) + { + _extraReadSizes[i] = 0; + _inStreamsProcessed[i] = 0; + _readRes[i] = S_OK; + } + } + + Bcj2Dec_Init(&dec); +} + +HRESULT CDecoder::Code(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, + ICompressProgressInfo *progress) +{ + if (numInStreams != BCJ2_NUM_STREAMS || numOutStreams != 1) + return E_INVALIDARG; + + RINOK(Alloc()); + + InitCommon(); + + dec.destLim = dec.dest = _bufs[BCJ2_NUM_STREAMS]; + + UInt64 outSizeProcessed = 0; + UInt64 prevProgress = 0; + + HRESULT res = S_OK; + + for (;;) + { + if (Bcj2Dec_Decode(&dec) != SZ_OK) + return S_FALSE; + + if (dec.state < BCJ2_NUM_STREAMS) + { + size_t totalRead = _extraReadSizes[dec.state]; + { + Byte *buf = _bufs[dec.state]; + for (size_t i = 0; i < totalRead; i++) + buf[i] = dec.bufs[dec.state][i]; + dec.lims[dec.state] = + dec.bufs[dec.state] = buf; + } + + if (_readRes[dec.state] != S_OK) + { + res = _readRes[dec.state]; + break; + } + + do + { + UInt32 curSize = _bufsCurSizes[dec.state] - (UInt32)totalRead; + /* + we want to call Read even even if size is 0 + if (inSizes && inSizes[dec.state]) + { + UInt64 rem = *inSizes[dec.state] - _inStreamsProcessed[dec.state]; + if (curSize > rem) + curSize = (UInt32)rem; + } + */ + + HRESULT res2 = inStreams[dec.state]->Read(_bufs[dec.state] + totalRead, curSize, &curSize); + _readRes[dec.state] = res2; + if (curSize == 0) + break; + _inStreamsProcessed[dec.state] += curSize; + totalRead += curSize; + if (res2 != S_OK) + break; + } + while (totalRead < 4 && BCJ2_IS_32BIT_STREAM(dec.state)); + + if (_readRes[dec.state] != S_OK) + res = _readRes[dec.state]; + + if (totalRead == 0) + break; + + // res == S_OK; + + if (BCJ2_IS_32BIT_STREAM(dec.state)) + { + unsigned extraSize = ((unsigned)totalRead & 3); + _extraReadSizes[dec.state] = extraSize; + if (totalRead < 4) + { + res = (_readRes[dec.state] != S_OK) ? _readRes[dec.state] : S_FALSE; + break; + } + totalRead -= extraSize; + } + + dec.lims[dec.state] = _bufs[dec.state] + totalRead; + } + else // if (dec.state <= BCJ2_STATE_ORIG) + { + size_t curSize = dec.dest - _bufs[BCJ2_NUM_STREAMS]; + if (curSize != 0) + { + outSizeProcessed += curSize; + RINOK(WriteStream(outStreams[0], _bufs[BCJ2_NUM_STREAMS], curSize)); + } + dec.dest = _bufs[BCJ2_NUM_STREAMS]; + { + size_t rem = _bufsCurSizes[BCJ2_NUM_STREAMS]; + if (outSizes && outSizes[0]) + { + UInt64 outSize = *outSizes[0] - outSizeProcessed; + if (rem > outSize) + rem = (size_t)outSize; + } + dec.destLim = dec.dest + rem; + if (rem == 0) + break; + } + } + + if (progress) + { + UInt64 outSize2 = outSizeProcessed + (dec.dest - _bufs[BCJ2_NUM_STREAMS]); + if (outSize2 - prevProgress >= (1 << 22)) + { + UInt64 inSize2 = outSize2 + _inStreamsProcessed[BCJ2_STREAM_RC] - (dec.lims[BCJ2_STREAM_RC] - dec.bufs[BCJ2_STREAM_RC]); + RINOK(progress->SetRatioInfo(&inSize2, &outSize2)); + prevProgress = outSize2; + } + } + } + + size_t curSize = dec.dest - _bufs[BCJ2_NUM_STREAMS]; + if (curSize != 0) + { + outSizeProcessed += curSize; + RINOK(WriteStream(outStreams[0], _bufs[BCJ2_NUM_STREAMS], curSize)); + } + + if (res != S_OK) + return res; + + if (_finishMode) + { + if (!Bcj2Dec_IsFinished(&dec)) + return S_FALSE; + + // we still allow the cases when input streams are larger than required for decoding. + // so the case (dec.state == BCJ2_STATE_ORIG) is also allowed, if MAIN stream is larger than required. + if (dec.state != BCJ2_STREAM_MAIN && + dec.state != BCJ2_DEC_STATE_ORIG) + return S_FALSE; + + if (inSizes) + { + for (int i = 0; i < BCJ2_NUM_STREAMS; i++) + { + size_t rem = dec.lims[i] - dec.bufs[i] + _extraReadSizes[i]; + /* + if (rem != 0) + return S_FALSE; + */ + if (inSizes[i] && *inSizes[i] != _inStreamsProcessed[i] - rem) + return S_FALSE; + } + } + } + + return S_OK; +} + +STDMETHODIMP CDecoder::SetInStream2(UInt32 streamIndex, ISequentialInStream *inStream) +{ + _inStreams[streamIndex] = inStream; + return S_OK; +} + +STDMETHODIMP CDecoder::ReleaseInStream2(UInt32 streamIndex) +{ + _inStreams[streamIndex].Release(); + return S_OK; +} + +STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) +{ + _outSizeDefined = (outSize != NULL); + _outSize = 0; + if (_outSizeDefined) + _outSize = *outSize; + + _outSize_Processed = 0; + + HRESULT res = Alloc(false); + + InitCommon(); + dec.destLim = dec.dest = NULL; + + return res; +} + + +STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + + if (size == 0) + return S_OK; + + UInt32 totalProcessed = 0; + + if (_outSizeDefined) + { + UInt64 rem = _outSize - _outSize_Processed; + if (size > rem) + size = (UInt32)rem; + } + dec.dest = (Byte *)data; + dec.destLim = (const Byte *)data + size; + + HRESULT res = S_OK; + + for (;;) + { + SRes sres = Bcj2Dec_Decode(&dec); + if (sres != SZ_OK) + return S_FALSE; + + { + UInt32 curSize = (UInt32)(dec.dest - (Byte *)data); + if (curSize != 0) + { + totalProcessed += curSize; + if (processedSize) + *processedSize = totalProcessed; + data = (void *)((Byte *)data + curSize); + size -= curSize; + _outSize_Processed += curSize; + } + } + + if (dec.state >= BCJ2_NUM_STREAMS) + break; + + { + size_t totalRead = _extraReadSizes[dec.state]; + { + Byte *buf = _bufs[dec.state]; + for (size_t i = 0; i < totalRead; i++) + buf[i] = dec.bufs[dec.state][i]; + dec.lims[dec.state] = + dec.bufs[dec.state] = buf; + } + + if (_readRes[dec.state] != S_OK) + return _readRes[dec.state]; + + do + { + UInt32 curSize = _bufsCurSizes[dec.state] - (UInt32)totalRead; + HRESULT res2 = _inStreams[dec.state]->Read(_bufs[dec.state] + totalRead, curSize, &curSize); + _readRes[dec.state] = res2; + if (curSize == 0) + break; + _inStreamsProcessed[dec.state] += curSize; + totalRead += curSize; + if (res2 != S_OK) + break; + } + while (totalRead < 4 && BCJ2_IS_32BIT_STREAM(dec.state)); + + if (totalRead == 0) + { + if (totalProcessed == 0) + res = _readRes[dec.state]; + break; + } + + if (BCJ2_IS_32BIT_STREAM(dec.state)) + { + unsigned extraSize = ((unsigned)totalRead & 3); + _extraReadSizes[dec.state] = extraSize; + if (totalRead < 4) + { + if (totalProcessed != 0) + return S_OK; + return (_readRes[dec.state] != S_OK) ? _readRes[dec.state] : S_FALSE; + } + totalRead -= extraSize; + } + + dec.lims[dec.state] = _bufs[dec.state] + totalRead; + } + } + + if (_finishMode && _outSizeDefined && _outSize == _outSize_Processed) + { + if (!Bcj2Dec_IsFinished(&dec)) + return S_FALSE; + + if (dec.state != BCJ2_STREAM_MAIN && + dec.state != BCJ2_DEC_STATE_ORIG) + return S_FALSE; + + /* + for (int i = 0; i < BCJ2_NUM_STREAMS; i++) + if (dec.bufs[i] != dec.lims[i] || _extraReadSizes[i] != 0) + return S_FALSE; + */ + } + + return res; +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Coder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Coder.h new file mode 100644 index 0000000000..ec58dabef8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Coder.h @@ -0,0 +1,117 @@ +// Bcj2Coder.h + +#ifndef __COMPRESS_BCJ2_CODER_H +#define __COMPRESS_BCJ2_CODER_H + +#include "../../../C/Bcj2.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCompress { +namespace NBcj2 { + +class CBaseCoder +{ +protected: + Byte *_bufs[BCJ2_NUM_STREAMS + 1]; + UInt32 _bufsCurSizes[BCJ2_NUM_STREAMS + 1]; + UInt32 _bufsNewSizes[BCJ2_NUM_STREAMS + 1]; + + HRESULT Alloc(bool allocForOrig = true); +public: + CBaseCoder(); + ~CBaseCoder(); +}; + + +#ifndef EXTRACT_ONLY + +class CEncoder: + public ICompressCoder2, + public ICompressSetCoderProperties, + public ICompressSetBufSize, + public CMyUnknownImp, + public CBaseCoder +{ + UInt32 _relatLim; + + HRESULT CodeReal(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, + ICompressProgressInfo *progress); + +public: + MY_UNKNOWN_IMP3(ICompressCoder2, ICompressSetCoderProperties, ICompressSetBufSize) + + STDMETHOD(Code)(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, + ICompressProgressInfo *progress); + + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); + + STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size); + STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size); + + CEncoder(); + ~CEncoder(); +}; + +#endif + +class CDecoder: + public ICompressCoder2, + public ICompressSetFinishMode, + public ICompressSetInStream2, + public ISequentialInStream, + public ICompressSetOutStreamSize, + public ICompressSetBufSize, + public CMyUnknownImp, + public CBaseCoder +{ + unsigned _extraReadSizes[BCJ2_NUM_STREAMS]; + UInt64 _inStreamsProcessed[BCJ2_NUM_STREAMS]; + HRESULT _readRes[BCJ2_NUM_STREAMS]; + CMyComPtr _inStreams[BCJ2_NUM_STREAMS]; + + bool _finishMode; + bool _outSizeDefined; + UInt64 _outSize; + UInt64 _outSize_Processed; + CBcj2Dec dec; + + void InitCommon(); + // HRESULT ReadSpec(); + +public: + MY_UNKNOWN_IMP6( + ICompressCoder2, + ICompressSetFinishMode, + ICompressSetInStream2, + ISequentialInStream, + ICompressSetOutStreamSize, + ICompressSetBufSize + ); + + STDMETHOD(Code)(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, + ICompressProgressInfo *progress); + + STDMETHOD(SetFinishMode)(UInt32 finishMode); + + STDMETHOD(SetInStream2)(UInt32 streamIndex, ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream2)(UInt32 streamIndex); + + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + + STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size); + STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size); + + CDecoder(); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Register.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Register.cpp new file mode 100644 index 0000000000..bce617892f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Bcj2Register.cpp @@ -0,0 +1,24 @@ +// Bcj2Register.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "Bcj2Coder.h" + +namespace NCompress { +namespace NBcj2 { + +REGISTER_CODEC_CREATE_2(CreateCodec, CDecoder(), ICompressCoder2) +#ifndef EXTRACT_ONLY +REGISTER_CODEC_CREATE_2(CreateCodecOut, CEncoder(), ICompressCoder2) +#else +#define CreateCodecOut NULL +#endif + +REGISTER_CODEC_VAR + { CreateCodec, CreateCodecOut, 0x303011B, "BCJ2", 4, false }; + +REGISTER_CODEC(BCJ2) + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjCoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjCoder.cpp new file mode 100644 index 0000000000..a50360c190 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjCoder.cpp @@ -0,0 +1,24 @@ +// BcjCoder.cpp + +#include "StdAfx.h" + +#include "BcjCoder.h" + +namespace NCompress { +namespace NBcj { + +STDMETHODIMP CCoder::Init() +{ + _bufferPos = 0; + x86_Convert_Init(_prevMask); + return S_OK; +} + +STDMETHODIMP_(UInt32) CCoder::Filter(Byte *data, UInt32 size) +{ + UInt32 processed = (UInt32)::x86_Convert(data, size, _bufferPos, &_prevMask, _encode); + _bufferPos += processed; + return processed; +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjCoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjCoder.h new file mode 100644 index 0000000000..475dfe55a4 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjCoder.h @@ -0,0 +1,31 @@ +// BcjCoder.h + +#ifndef __COMPRESS_BCJ_CODER_H +#define __COMPRESS_BCJ_CODER_H + +#include "../../../C/Bra.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCompress { +namespace NBcj { + +class CCoder: + public ICompressFilter, + public CMyUnknownImp +{ + UInt32 _bufferPos; + UInt32 _prevMask; + int _encode; +public: + MY_UNKNOWN_IMP1(ICompressFilter); + INTERFACE_ICompressFilter(;) + + CCoder(int encode): _bufferPos(0), _encode(encode) { x86_Convert_Init(_prevMask); } +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjRegister.cpp new file mode 100644 index 0000000000..48cc057fa1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BcjRegister.cpp @@ -0,0 +1,17 @@ +// BcjRegister.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "BcjCoder.h" + +namespace NCompress { +namespace NBcj { + +REGISTER_FILTER_E(BCJ, + CCoder(false), + CCoder(true), + 0x3030103, "BCJ") + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchMisc.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchMisc.cpp new file mode 100644 index 0000000000..d5a90f1794 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchMisc.cpp @@ -0,0 +1,23 @@ +// BranchMisc.cpp + +#include "StdAfx.h" + +#include "BranchMisc.h" + +namespace NCompress { +namespace NBranch { + +STDMETHODIMP CCoder::Init() +{ + _bufferPos = 0; + return S_OK; +} + +STDMETHODIMP_(UInt32) CCoder::Filter(Byte *data, UInt32 size) +{ + UInt32 processed = (UInt32)BraFunc(data, size, _bufferPos, _encode); + _bufferPos += processed; + return processed; +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchMisc.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchMisc.h new file mode 100644 index 0000000000..02a56c3903 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchMisc.h @@ -0,0 +1,35 @@ +// BranchMisc.h + +#ifndef __COMPRESS_BRANCH_MISC_H +#define __COMPRESS_BRANCH_MISC_H + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +EXTERN_C_BEGIN + +typedef SizeT (*Func_Bra)(Byte *data, SizeT size, UInt32 ip, int encoding); + +EXTERN_C_END + +namespace NCompress { +namespace NBranch { + +class CCoder: + public ICompressFilter, + public CMyUnknownImp +{ + UInt32 _bufferPos; + int _encode; + Func_Bra BraFunc; +public: + MY_UNKNOWN_IMP1(ICompressFilter); + INTERFACE_ICompressFilter(;) + + CCoder(Func_Bra bra, int encode): _bufferPos(0), _encode(encode), BraFunc(bra) {} +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchRegister.cpp new file mode 100644 index 0000000000..b83c6bcbd3 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/BranchRegister.cpp @@ -0,0 +1,41 @@ +// BranchRegister.cpp + +#include "StdAfx.h" + +#include "../../../C/Bra.h" + +#include "../Common/RegisterCodec.h" + +#include "BranchMisc.h" + +namespace NCompress { +namespace NBranch { + +#define CREATE_BRA(n) \ + REGISTER_FILTER_CREATE(CreateBra_Decoder_ ## n, CCoder(n ## _Convert, false)) \ + REGISTER_FILTER_CREATE(CreateBra_Encoder_ ## n, CCoder(n ## _Convert, true)) \ + +CREATE_BRA(PPC) +CREATE_BRA(IA64) +CREATE_BRA(ARM) +CREATE_BRA(ARMT) +CREATE_BRA(SPARC) + +#define METHOD_ITEM(n, id, name) \ + REGISTER_FILTER_ITEM( \ + CreateBra_Decoder_ ## n, \ + CreateBra_Encoder_ ## n, \ + 0x3030000 + id, name) + +REGISTER_CODECS_VAR +{ + METHOD_ITEM(PPC, 0x205, "PPC"), + METHOD_ITEM(IA64, 0x401, "IA64"), + METHOD_ITEM(ARM, 0x501, "ARM"), + METHOD_ITEM(ARMT, 0x701, "ARMT"), + METHOD_ITEM(SPARC, 0x805, "SPARC") +}; + +REGISTER_CODECS(Branch) + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/ByteSwap.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/ByteSwap.cpp new file mode 100644 index 0000000000..ee103afe7a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/ByteSwap.cpp @@ -0,0 +1,92 @@ +// ByteSwap.cpp + +#include "StdAfx.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +#include "../Common/RegisterCodec.h" + +namespace NCompress { +namespace NByteSwap { + +class CByteSwap2: + public ICompressFilter, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(ICompressFilter); + INTERFACE_ICompressFilter(;) +}; + +class CByteSwap4: + public ICompressFilter, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(ICompressFilter); + INTERFACE_ICompressFilter(;) +}; + +STDMETHODIMP CByteSwap2::Init() { return S_OK; } + +STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size) +{ + const UInt32 kStep = 2; + if (size < kStep) + return 0; + size &= ~(kStep - 1); + + const Byte *end = data + (size_t)size; + + do + { + Byte b0 = data[0]; + data[0] = data[1]; + data[1] = b0; + data += kStep; + } + while (data != end); + + return size; +} + +STDMETHODIMP CByteSwap4::Init() { return S_OK; } + +STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size) +{ + const UInt32 kStep = 4; + if (size < kStep) + return 0; + size &= ~(kStep - 1); + + const Byte *end = data + (size_t)size; + + do + { + Byte b0 = data[0]; + Byte b1 = data[1]; + data[0] = data[3]; + data[1] = data[2]; + data[2] = b1; + data[3] = b0; + data += kStep; + } + while (data != end); + + return size; +} + +REGISTER_FILTER_CREATE(CreateFilter2, CByteSwap2()) +REGISTER_FILTER_CREATE(CreateFilter4, CByteSwap4()) + +REGISTER_CODECS_VAR +{ + REGISTER_FILTER_ITEM(CreateFilter2, CreateFilter2, 0x20302, "Swap2"), + REGISTER_FILTER_ITEM(CreateFilter4, CreateFilter4, 0x20304, "Swap4") +}; + +REGISTER_CODECS(ByteSwap) + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CodecExports.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CodecExports.cpp new file mode 100644 index 0000000000..7be496c243 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CodecExports.cpp @@ -0,0 +1,344 @@ +// CodecExports.cpp + +#include "StdAfx.h" + +#include "../../../C/CpuArch.h" + +#include "../../Common/ComTry.h" +#include "../../Common/MyCom.h" + +#include "../../Windows/Defs.h" + +#include "../ICoder.h" + +#include "../Common/RegisterCodec.h" + +extern unsigned g_NumCodecs; +extern const CCodecInfo *g_Codecs[]; + +extern unsigned g_NumHashers; +extern const CHasherInfo *g_Hashers[]; + +static void SetPropFromAscii(const char *s, PROPVARIANT *prop) throw() +{ + UINT len = (UINT)strlen(s); + BSTR dest = ::SysAllocStringLen(NULL, len); + if (dest) + { + for (UINT i = 0; i <= len; i++) + dest[i] = (Byte)s[i]; + prop->bstrVal = dest; + prop->vt = VT_BSTR; + } +} + +static inline HRESULT SetPropGUID(const GUID &guid, PROPVARIANT *value) throw() +{ + if ((value->bstrVal = ::SysAllocStringByteLen((const char *)&guid, sizeof(guid))) != NULL) + value->vt = VT_BSTR; + return S_OK; +} + +static HRESULT MethodToClassID(UInt16 typeId, CMethodId id, PROPVARIANT *value) throw() +{ + GUID clsId; + clsId.Data1 = k_7zip_GUID_Data1; + clsId.Data2 = k_7zip_GUID_Data2; + clsId.Data3 = typeId; + SetUi64(clsId.Data4, id); + return SetPropGUID(clsId, value); +} + +static HRESULT FindCodecClassId(const GUID *clsid, bool isCoder2, bool isFilter, bool &encode, int &index) throw() +{ + index = -1; + if (clsid->Data1 != k_7zip_GUID_Data1 || + clsid->Data2 != k_7zip_GUID_Data2) + return S_OK; + + encode = true; + + if (clsid->Data3 == k_7zip_GUID_Data3_Decoder) encode = false; + else if (clsid->Data3 != k_7zip_GUID_Data3_Encoder) return S_OK; + + UInt64 id = GetUi64(clsid->Data4); + + for (unsigned i = 0; i < g_NumCodecs; i++) + { + const CCodecInfo &codec = *g_Codecs[i]; + + if (id != codec.Id + || (encode ? !codec.CreateEncoder : !codec.CreateDecoder) + || (isFilter ? !codec.IsFilter : codec.IsFilter)) + continue; + + if (codec.NumStreams == 1 ? isCoder2 : !isCoder2) + return E_NOINTERFACE; + + index = i; + return S_OK; + } + + return S_OK; +} + +static HRESULT CreateCoderMain(unsigned index, bool encode, void **coder) +{ + COM_TRY_BEGIN + + const CCodecInfo &codec = *g_Codecs[index]; + + void *c; + if (encode) + c = codec.CreateEncoder(); + else + c = codec.CreateDecoder(); + + if (c) + { + IUnknown *unk; + if (codec.IsFilter) + unk = (IUnknown *)(ICompressFilter *)c; + else if (codec.NumStreams != 1) + unk = (IUnknown *)(ICompressCoder2 *)c; + else + unk = (IUnknown *)(ICompressCoder *)c; + unk->AddRef(); + *coder = c; + } + return S_OK; + + COM_TRY_END +} + +static HRESULT CreateCoder2(bool encode, UInt32 index, const GUID *iid, void **outObject) +{ + *outObject = NULL; + + const CCodecInfo &codec = *g_Codecs[index]; + + if (encode ? !codec.CreateEncoder : !codec.CreateDecoder) + return CLASS_E_CLASSNOTAVAILABLE; + + if (codec.IsFilter) + { + if (*iid != IID_ICompressFilter) return E_NOINTERFACE; + } + else if (codec.NumStreams != 1) + { + if (*iid != IID_ICompressCoder2) return E_NOINTERFACE; + } + else + { + if (*iid != IID_ICompressCoder) return E_NOINTERFACE; + } + + return CreateCoderMain(index, encode, outObject); +} + +STDAPI CreateDecoder(UInt32 index, const GUID *iid, void **outObject) +{ + return CreateCoder2(false, index, iid, outObject); +} + +STDAPI CreateEncoder(UInt32 index, const GUID *iid, void **outObject) +{ + return CreateCoder2(true, index, iid, outObject); +} + +STDAPI CreateCoder(const GUID *clsid, const GUID *iid, void **outObject) +{ + *outObject = NULL; + + bool isFilter = false; + bool isCoder2 = false; + bool isCoder = (*iid == IID_ICompressCoder) != 0; + if (!isCoder) + { + isFilter = (*iid == IID_ICompressFilter) != 0; + if (!isFilter) + { + isCoder2 = (*iid == IID_ICompressCoder2) != 0; + if (!isCoder2) + return E_NOINTERFACE; + } + } + + bool encode; + int codecIndex; + HRESULT res = FindCodecClassId(clsid, isCoder2, isFilter, encode, codecIndex); + if (res != S_OK) + return res; + if (codecIndex < 0) + return CLASS_E_CLASSNOTAVAILABLE; + + return CreateCoderMain(codecIndex, encode, outObject); +} + +STDAPI GetMethodProperty(UInt32 codecIndex, PROPID propID, PROPVARIANT *value) +{ + ::VariantClear((VARIANTARG *)value); + const CCodecInfo &codec = *g_Codecs[codecIndex]; + switch (propID) + { + case NMethodPropID::kID: + value->uhVal.QuadPart = (UInt64)codec.Id; + value->vt = VT_UI8; + break; + case NMethodPropID::kName: + SetPropFromAscii(codec.Name, value); + break; + case NMethodPropID::kDecoder: + if (codec.CreateDecoder) + return MethodToClassID(k_7zip_GUID_Data3_Decoder, codec.Id, value); + break; + case NMethodPropID::kEncoder: + if (codec.CreateEncoder) + return MethodToClassID(k_7zip_GUID_Data3_Encoder, codec.Id, value); + break; + case NMethodPropID::kDecoderIsAssigned: + value->vt = VT_BOOL; + value->boolVal = BoolToVARIANT_BOOL(codec.CreateDecoder != NULL); + break; + case NMethodPropID::kEncoderIsAssigned: + value->vt = VT_BOOL; + value->boolVal = BoolToVARIANT_BOOL(codec.CreateEncoder != NULL); + break; + case NMethodPropID::kPackStreams: + if (codec.NumStreams != 1) + { + value->vt = VT_UI4; + value->ulVal = (ULONG)codec.NumStreams; + } + break; + /* + case NMethodPropID::kIsFilter: + // if (codec.IsFilter) + { + value->vt = VT_BOOL; + value->boolVal = BoolToVARIANT_BOOL(codec.IsFilter); + } + break; + */ + /* + case NMethodPropID::kDecoderFlags: + { + value->vt = VT_UI4; + value->ulVal = (ULONG)codec.DecoderFlags; + } + break; + case NMethodPropID::kEncoderFlags: + { + value->vt = VT_UI4; + value->ulVal = (ULONG)codec.EncoderFlags; + } + break; + */ + } + return S_OK; +} + +STDAPI GetNumberOfMethods(UINT32 *numCodecs) +{ + *numCodecs = g_NumCodecs; + return S_OK; +} + + +// ---------- Hashers ---------- + +static int FindHasherClassId(const GUID *clsid) throw() +{ + if (clsid->Data1 != k_7zip_GUID_Data1 || + clsid->Data2 != k_7zip_GUID_Data2 || + clsid->Data3 != k_7zip_GUID_Data3_Hasher) + return -1; + UInt64 id = GetUi64(clsid->Data4); + for (unsigned i = 0; i < g_NumCodecs; i++) + if (id == g_Hashers[i]->Id) + return i; + return -1; +} + +static HRESULT CreateHasher2(UInt32 index, IHasher **hasher) +{ + COM_TRY_BEGIN + *hasher = g_Hashers[index]->CreateHasher(); + if (*hasher) + (*hasher)->AddRef(); + return S_OK; + COM_TRY_END +} + +STDAPI CreateHasher(const GUID *clsid, IHasher **outObject) +{ + COM_TRY_BEGIN + *outObject = 0; + int index = FindHasherClassId(clsid); + if (index < 0) + return CLASS_E_CLASSNOTAVAILABLE; + return CreateHasher2(index, outObject); + COM_TRY_END +} + +STDAPI GetHasherProp(UInt32 codecIndex, PROPID propID, PROPVARIANT *value) +{ + ::VariantClear((VARIANTARG *)value); + const CHasherInfo &codec = *g_Hashers[codecIndex]; + switch (propID) + { + case NMethodPropID::kID: + value->uhVal.QuadPart = (UInt64)codec.Id; + value->vt = VT_UI8; + break; + case NMethodPropID::kName: + SetPropFromAscii(codec.Name, value); + break; + case NMethodPropID::kEncoder: + if (codec.CreateHasher) + return MethodToClassID(k_7zip_GUID_Data3_Hasher, codec.Id, value); + break; + case NMethodPropID::kDigestSize: + value->ulVal = (ULONG)codec.DigestSize; + value->vt = VT_UI4; + break; + } + return S_OK; +} + +class CHashers: + public IHashers, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP1(IHashers) + + STDMETHOD_(UInt32, GetNumHashers)(); + STDMETHOD(GetHasherProp)(UInt32 index, PROPID propID, PROPVARIANT *value); + STDMETHOD(CreateHasher)(UInt32 index, IHasher **hasher); +}; + +STDAPI GetHashers(IHashers **hashers) +{ + COM_TRY_BEGIN + *hashers = new CHashers; + if (*hashers) + (*hashers)->AddRef(); + return S_OK; + COM_TRY_END +} + +STDMETHODIMP_(UInt32) CHashers::GetNumHashers() +{ + return g_NumHashers; +} + +STDMETHODIMP CHashers::GetHasherProp(UInt32 index, PROPID propID, PROPVARIANT *value) +{ + return ::GetHasherProp(index, propID, value); +} + +STDMETHODIMP CHashers::CreateHasher(UInt32 index, IHasher **hasher) +{ + return ::CreateHasher2(index, hasher); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyCoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyCoder.cpp new file mode 100644 index 0000000000..925493f395 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyCoder.cpp @@ -0,0 +1,115 @@ +// Compress/CopyCoder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "CopyCoder.h" + +namespace NCompress { + +static const UInt32 kBufSize = 1 << 17; + +CCopyCoder::~CCopyCoder() +{ + ::MidFree(_buf); +} + +STDMETHODIMP CCopyCoder::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 *outSize, + ICompressProgressInfo *progress) +{ + if (!_buf) + { + _buf = (Byte *)::MidAlloc(kBufSize); + if (!_buf) + return E_OUTOFMEMORY; + } + + TotalSize = 0; + + for (;;) + { + UInt32 size = kBufSize; + if (outSize && size > *outSize - TotalSize) + size = (UInt32)(*outSize - TotalSize); + if (size == 0) + return S_OK; + + HRESULT readRes = inStream->Read(_buf, size, &size); + + if (size == 0) + return readRes; + + if (outStream) + { + UInt32 pos = 0; + do + { + UInt32 curSize = size - pos; + HRESULT res = outStream->Write(_buf + pos, curSize, &curSize); + pos += curSize; + TotalSize += curSize; + RINOK(res); + if (curSize == 0) + return E_FAIL; + } + while (pos < size); + } + else + TotalSize += size; + + RINOK(readRes); + + if (progress) + { + RINOK(progress->SetRatioInfo(&TotalSize, &TotalSize)); + } + } +} + +STDMETHODIMP CCopyCoder::SetInStream(ISequentialInStream *inStream) +{ + _inStream = inStream; + TotalSize = 0; + return S_OK; +} + +STDMETHODIMP CCopyCoder::ReleaseInStream() +{ + _inStream.Release(); + return S_OK; +} + +STDMETHODIMP CCopyCoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 realProcessedSize = 0; + HRESULT res = _inStream->Read(data, size, &realProcessedSize); + TotalSize += realProcessedSize; + if (processedSize) + *processedSize = realProcessedSize; + return res; +} + +STDMETHODIMP CCopyCoder::GetInStreamProcessedSize(UInt64 *value) +{ + *value = TotalSize; + return S_OK; +} + +HRESULT CopyStream(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress) +{ + CMyComPtr copyCoder = new CCopyCoder; + return copyCoder->Code(inStream, outStream, NULL, NULL, progress); +} + +HRESULT CopyStream_ExactSize(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt64 size, ICompressProgressInfo *progress) +{ + NCompress::CCopyCoder *copyCoderSpec = new NCompress::CCopyCoder; + CMyComPtr copyCoder = copyCoderSpec; + RINOK(copyCoder->Code(inStream, outStream, NULL, &size, progress)); + return copyCoderSpec->TotalSize == size ? S_OK : E_FAIL; +} + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyCoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyCoder.h new file mode 100644 index 0000000000..f2620f126b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyCoder.h @@ -0,0 +1,46 @@ +// Compress/CopyCoder.h + +#ifndef __COMPRESS_COPY_CODER_H +#define __COMPRESS_COPY_CODER_H + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCompress { + +class CCopyCoder: + public ICompressCoder, + public ICompressSetInStream, + public ISequentialInStream, + public ICompressGetInStreamProcessedSize, + public CMyUnknownImp +{ + Byte *_buf; + CMyComPtr _inStream; +public: + UInt64 TotalSize; + + CCopyCoder(): _buf(0), TotalSize(0) {}; + ~CCopyCoder(); + + MY_UNKNOWN_IMP4( + ICompressCoder, + ICompressSetInStream, + ISequentialInStream, + ICompressGetInStreamProcessedSize) + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); +}; + +HRESULT CopyStream(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress); +HRESULT CopyStream_ExactSize(ISequentialInStream *inStream, ISequentialOutStream *outStream, UInt64 size, ICompressProgressInfo *progress); + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyRegister.cpp new file mode 100644 index 0000000000..1c59fe0c00 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/CopyRegister.cpp @@ -0,0 +1,15 @@ +// CopyRegister.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "CopyCoder.h" + +namespace NCompress { + +REGISTER_CODEC_CREATE(CreateCodec, CCopyCoder()) + +REGISTER_CODEC_2(Copy, CreateCodec, CreateCodec, 0, "Copy") + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/DeltaFilter.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/DeltaFilter.cpp new file mode 100644 index 0000000000..cdbd33d4c7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/DeltaFilter.cpp @@ -0,0 +1,128 @@ +// DeltaFilter.cpp + +#include "StdAfx.h" + +#include "../../../C/Delta.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +#include "../Common/RegisterCodec.h" + +namespace NCompress { +namespace NDelta { + +struct CDelta +{ + unsigned _delta; + Byte _state[DELTA_STATE_SIZE]; + + CDelta(): _delta(1) {} + void DeltaInit() { Delta_Init(_state); } +}; + + +#ifndef EXTRACT_ONLY + +class CEncoder: + public ICompressFilter, + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + CDelta, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP3(ICompressFilter, ICompressSetCoderProperties, ICompressWriteCoderProperties) + INTERFACE_ICompressFilter(;) + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); +}; + +STDMETHODIMP CEncoder::Init() +{ + DeltaInit(); + return S_OK; +} + +STDMETHODIMP_(UInt32) CEncoder::Filter(Byte *data, UInt32 size) +{ + Delta_Encode(_state, _delta, data, size); + return size; +} + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps) +{ + UInt32 delta = _delta; + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = props[i]; + PROPID propID = propIDs[i]; + if (propID >= NCoderPropID::kReduceSize) + continue; + if (prop.vt != VT_UI4) + return E_INVALIDARG; + switch (propID) + { + case NCoderPropID::kDefaultProp: + delta = (UInt32)prop.ulVal; + if (delta < 1 || delta > 256) + return E_INVALIDARG; + break; + case NCoderPropID::kNumThreads: break; + case NCoderPropID::kLevel: break; + default: return E_INVALIDARG; + } + } + _delta = delta; + return S_OK; +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + Byte prop = (Byte)(_delta - 1); + return outStream->Write(&prop, 1, NULL); +} + +#endif + + +class CDecoder: + public ICompressFilter, + public ICompressSetDecoderProperties2, + CDelta, + public CMyUnknownImp +{ +public: + MY_UNKNOWN_IMP2(ICompressFilter, ICompressSetDecoderProperties2) + INTERFACE_ICompressFilter(;) + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); +}; + +STDMETHODIMP CDecoder::Init() +{ + DeltaInit(); + return S_OK; +} + +STDMETHODIMP_(UInt32) CDecoder::Filter(Byte *data, UInt32 size) +{ + Delta_Decode(_state, _delta, data, size); + return size; +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size) +{ + if (size != 1) + return E_INVALIDARG; + _delta = (unsigned)props[0] + 1; + return S_OK; +} + + +REGISTER_FILTER_E(Delta, + CDecoder(), + CEncoder(), + 3, "Delta") + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Decoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Decoder.cpp new file mode 100644 index 0000000000..a69ae7a590 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Decoder.cpp @@ -0,0 +1,271 @@ +// Lzma2Decoder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "../Common/StreamUtils.h" + +#include "Lzma2Decoder.h" + +static HRESULT SResToHRESULT(SRes res) +{ + switch (res) + { + case SZ_OK: return S_OK; + case SZ_ERROR_MEM: return E_OUTOFMEMORY; + case SZ_ERROR_PARAM: return E_INVALIDARG; + // case SZ_ERROR_PROGRESS: return E_ABORT; + case SZ_ERROR_DATA: return S_FALSE; + } + return E_FAIL; +} + +namespace NCompress { +namespace NLzma2 { + +CDecoder::CDecoder(): + _inBuf(NULL), + _inBufSize(0), +#if defined(__APPLE__) + _inBufSizeNew(kLzmaSDKObjCDecoderReadSize), + _outStepSize(kLzmaSDKObjCDecoderWriteSize), +#else + _inBufSizeNew(1 << 20), + _outStepSize(1 << 22), +#endif + _outSizeDefined(false), + _finishMode(false) +{ + Lzma2Dec_Construct(&_state); +} + +STDMETHODIMP CDecoder::SetInBufSize(UInt32 , UInt32 size) { _inBufSizeNew = size; return S_OK; } +STDMETHODIMP CDecoder::SetOutBufSize(UInt32 , UInt32 size) { _outStepSize = size; return S_OK; } + +CDecoder::~CDecoder() +{ + Lzma2Dec_Free(&_state, &g_Alloc); + MidFree(_inBuf); +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size) +{ + if (size != 1) + return E_NOTIMPL; + + RINOK(SResToHRESULT(Lzma2Dec_Allocate(&_state, prop[0], &g_Alloc))); + if (!_inBuf || _inBufSize != _inBufSizeNew) + { + MidFree(_inBuf); + _inBufSize = 0; + _inBuf = (Byte *)MidAlloc(_inBufSizeNew); + if (!_inBuf) + return E_OUTOFMEMORY; + _inBufSize = _inBufSizeNew; + } + + return S_OK; +} + +STDMETHODIMP CDecoder::GetInStreamProcessedSize(UInt64 *value) { *value = _inSizeProcessed; return S_OK; } +STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; } +STDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; } + +STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) +{ + _outSizeDefined = (outSize != NULL); + _outSize = 0; + if (_outSizeDefined) + _outSize = *outSize; + + Lzma2Dec_Init(&_state); + + _inPos = _inSize = 0; + _inSizeProcessed = _outSizeProcessed = 0; + return S_OK; +} + +STDMETHODIMP CDecoder::SetFinishMode(UInt32 finishMode) +{ + _finishMode = (finishMode != 0); + return S_OK; +} + +STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, + ISequentialOutStream *outStream, const UInt64 *inSize, + const UInt64 *outSize, ICompressProgressInfo *progress) +{ + if (!_inBuf) + return S_FALSE; + SetOutStreamSize(outSize); + + UInt32 step = _outStepSize; + const UInt32 kOutStepSize_Min = 1 << 12; + if (step < kOutStepSize_Min) + step = kOutStepSize_Min; + + SizeT wrPos = _state.decoder.dicPos; + + SizeT next = (_state.decoder.dicBufSize - _state.decoder.dicPos < step) ? + _state.decoder.dicBufSize : + _state.decoder.dicPos + step; + + HRESULT hres = S_OK; + + for (;;) + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + hres = inStream->Read(_inBuf, _inBufSize, &_inSize); + if (hres != S_OK) + break; + } + + SizeT dicPos = _state.decoder.dicPos; + SizeT curSize = next - dicPos; + + ELzmaFinishMode finishMode = LZMA_FINISH_ANY; + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outSizeProcessed; + if (curSize >= rem) + { + curSize = (SizeT)rem; + if (_finishMode) + finishMode = LZMA_FINISH_END; + } + } + + SizeT inSizeProcessed = _inSize - _inPos; + ELzmaStatus status; + SRes res = Lzma2Dec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status); + + _inPos += (UInt32)inSizeProcessed; + _inSizeProcessed += inSizeProcessed; + SizeT outSizeProcessed = _state.decoder.dicPos - dicPos; + _outSizeProcessed += outSizeProcessed; + + bool finished = ((inSizeProcessed == 0 && outSizeProcessed == 0) + || status == LZMA_STATUS_FINISHED_WITH_MARK); + bool outFinished = (_outSizeDefined && _outSizeProcessed >= _outSize); + + if (res != 0 + || _state.decoder.dicPos >= next + || finished + || outFinished) + { + HRESULT res2 = WriteStream(outStream, _state.decoder.dic + wrPos, _state.decoder.dicPos - wrPos); + + if (_state.decoder.dicPos == _state.decoder.dicBufSize) + _state.decoder.dicPos = 0; + + wrPos = _state.decoder.dicPos; + + next = (_state.decoder.dicBufSize - _state.decoder.dicPos < step) ? + _state.decoder.dicBufSize : + _state.decoder.dicPos + step; + + if (res != 0) + return S_FALSE; + RINOK(res2); + + if (finished) + { + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + { + if (_finishMode && inSize && *inSize != _inSizeProcessed) + return S_FALSE; + if (finishMode == LZMA_FINISH_END && !outFinished) + return S_FALSE; + return S_OK; + } + return (finishMode == LZMA_FINISH_END) ? S_FALSE : S_OK; + } + + if (outFinished && finishMode == LZMA_FINISH_ANY) + return S_OK; + } + + if (progress) + { + RINOK(progress->SetRatioInfo(&_inSizeProcessed, &_outSizeProcessed)); + } + } + + HRESULT res2 = WriteStream(outStream, _state.decoder.dic + wrPos, _state.decoder.dicPos - wrPos); + if (hres != S_OK) + return hres; + return res2; +} + +#ifndef NO_READ_FROM_CODER + +STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + UInt32 totalProcessed = 0; + + if (processedSize) + *processedSize = 0; + + for (;;) + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + RINOK(_inStream->Read(_inBuf, _inBufSize, &_inSize)); + } + { + ELzmaFinishMode finishMode = LZMA_FINISH_ANY; + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outSizeProcessed; + if (rem <= size) + { + size = (UInt32)rem; + if (_finishMode) + finishMode = LZMA_FINISH_END; + } + } + + SizeT outProcessed = size; + SizeT inProcessed = _inSize - _inPos; + + ELzmaStatus status; + SRes res = Lzma2Dec_DecodeToBuf(&_state, (Byte *)data, &outProcessed, + _inBuf + _inPos, &inProcessed, finishMode, &status); + + _inPos += (UInt32)inProcessed; + _inSizeProcessed += inProcessed; + _outSizeProcessed += outProcessed; + size -= (UInt32)outProcessed; + data = (Byte *)data + outProcessed; + + totalProcessed += (UInt32)outProcessed; + if (processedSize) + *processedSize = totalProcessed; + + if (res != SZ_OK) + { + if (totalProcessed != 0) + return S_OK; + return SResToHRESULT(res); + } + + if (inProcessed == 0 && outProcessed == 0) + return S_OK; + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + return S_OK; + if (outProcessed != 0) + { + if (finishMode != LZMA_FINISH_END || _outSize != _outSizeProcessed) + return S_OK; + } + } + } +} + +#endif + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Decoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Decoder.h new file mode 100644 index 0000000000..0ae43b00a4 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Decoder.h @@ -0,0 +1,88 @@ +// Lzma2Decoder.h + +#ifndef __LZMA2_DECODER_H +#define __LZMA2_DECODER_H + +#include "../../../C/Lzma2Dec.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCompress { +namespace NLzma2 { + +class CDecoder: + public ICompressCoder, + public ICompressSetDecoderProperties2, + public ICompressSetFinishMode, + public ICompressGetInStreamProcessedSize, + public ICompressSetBufSize, + #ifndef NO_READ_FROM_CODER + public ICompressSetInStream, + public ICompressSetOutStreamSize, + public ISequentialInStream, + #endif + public CMyUnknownImp +{ + CMyComPtr _inStream; + Byte *_inBuf; + UInt32 _inPos; + UInt32 _inSize; + + bool _finishMode; + bool _outSizeDefined; + UInt64 _outSize; + + UInt64 _inSizeProcessed; + UInt64 _outSizeProcessed; + + UInt32 _inBufSize; + UInt32 _inBufSizeNew; + UInt32 _outStepSize; + + CLzma2Dec _state; +public: + + MY_QUERYINTERFACE_BEGIN2(ICompressCoder) + MY_QUERYINTERFACE_ENTRY(ICompressSetDecoderProperties2) + MY_QUERYINTERFACE_ENTRY(ICompressSetFinishMode) + MY_QUERYINTERFACE_ENTRY(ICompressGetInStreamProcessedSize) + MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize) + #ifndef NO_READ_FROM_CODER + MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) + MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize) + MY_QUERYINTERFACE_ENTRY(ISequentialInStream) + #endif + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + + STDMETHOD(SetFinishMode)(UInt32 finishMode); + + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value); + + STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size); + STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size); + + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + + #ifndef NO_READ_FROM_CODER + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + #endif + + CDecoder(); + virtual ~CDecoder(); + +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp new file mode 100644 index 0000000000..7fea9cc6b7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp @@ -0,0 +1,99 @@ +// Lzma2Encoder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "../Common/CWrappers.h" +#include "../Common/StreamUtils.h" + +#include "Lzma2Encoder.h" + +namespace NCompress { + +namespace NLzma { + +HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep); + +} + +namespace NLzma2 { + +CEncoder::CEncoder() +{ + _encoder = 0; + _encoder = Lzma2Enc_Create(&g_Alloc, &g_BigAlloc); + if (_encoder == 0) + throw 1; +} + +CEncoder::~CEncoder() +{ + if (_encoder != 0) + Lzma2Enc_Destroy(_encoder); +} + +HRESULT SetLzma2Prop(PROPID propID, const PROPVARIANT &prop, CLzma2EncProps &lzma2Props) +{ + switch (propID) + { + case NCoderPropID::kBlockSize: + { + if (prop.vt == VT_UI4) + lzma2Props.blockSize = prop.ulVal; + else if (prop.vt == VT_UI8) + { + size_t v = (size_t)prop.uhVal.QuadPart; + if (v != prop.uhVal.QuadPart) + return E_INVALIDARG; + lzma2Props.blockSize = v; + } + else + return E_INVALIDARG; + break; + } + case NCoderPropID::kNumThreads: + if (prop.vt != VT_UI4) return E_INVALIDARG; lzma2Props.numTotalThreads = (int)(prop.ulVal); break; + default: + RINOK(NLzma::SetLzmaProp(propID, prop, lzma2Props.lzmaProps)); + } + return S_OK; +} + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, + const PROPVARIANT *coderProps, UInt32 numProps) +{ + CLzma2EncProps lzma2Props; + Lzma2EncProps_Init(&lzma2Props); + + for (UInt32 i = 0; i < numProps; i++) + { + RINOK(SetLzma2Prop(propIDs[i], coderProps[i], lzma2Props)); + } + return SResToHRESULT(Lzma2Enc_SetProps(_encoder, &lzma2Props)); +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + Byte prop = Lzma2Enc_WriteProperties(_encoder); + return WriteStream(outStream, &prop, 1); +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) +{ + CSeqInStreamWrap inWrap(inStream); + CSeqOutStreamWrap outWrap(outStream); + CCompressProgressWrap progressWrap(progress); + + SRes res = Lzma2Enc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL); + if (res == SZ_ERROR_READ && inWrap.Res != S_OK) + return inWrap.Res; + if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK) + return outWrap.Res; + if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK) + return progressWrap.Res; + return SResToHRESULT(res); +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Encoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Encoder.h new file mode 100644 index 0000000000..3b3d218c3e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Encoder.h @@ -0,0 +1,36 @@ +// Lzma2Encoder.h + +#ifndef __LZMA2_ENCODER_H +#define __LZMA2_ENCODER_H + +#include "../../../C/Lzma2Enc.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCompress { +namespace NLzma2 { + +class CEncoder: + public ICompressCoder, + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + public CMyUnknownImp +{ + CLzma2EncHandle _encoder; +public: + MY_UNKNOWN_IMP3(ICompressCoder, ICompressSetCoderProperties, ICompressWriteCoderProperties) + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + + CEncoder(); + virtual ~CEncoder(); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Register.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Register.cpp new file mode 100644 index 0000000000..4367105635 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/Lzma2Register.cpp @@ -0,0 +1,22 @@ +// Lzma2Register.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "Lzma2Decoder.h" + +#ifndef EXTRACT_ONLY +#include "Lzma2Encoder.h" +#endif + +namespace NCompress { +namespace NLzma2 { + +REGISTER_CODEC_E(LZMA2, + CDecoder(), + CEncoder(), + 0x21, + "LZMA2") + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaDecoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaDecoder.cpp new file mode 100644 index 0000000000..0c77a2f0fc --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaDecoder.cpp @@ -0,0 +1,273 @@ +// LzmaDecoder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "../Common/StreamUtils.h" + +#include "LzmaDecoder.h" + +static HRESULT SResToHRESULT(SRes res) +{ + switch (res) + { + case SZ_OK: return S_OK; + case SZ_ERROR_MEM: return E_OUTOFMEMORY; + case SZ_ERROR_PARAM: return E_INVALIDARG; + case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL; + case SZ_ERROR_DATA: return S_FALSE; + } + return E_FAIL; +} + +namespace NCompress { +namespace NLzma { + +CDecoder::CDecoder(): _inBuf(0), _propsWereSet(false), _outSizeDefined(false), +#if defined(__APPLE__) + _inBufSize(kLzmaSDKObjCDecoderReadSize), + _outBufSize(kLzmaSDKObjCDecoderWriteSize), +#else + _inBufSize(1 << 20), + _outBufSize(1 << 22), +#endif + FinishStream(false), + NeedMoreInput(false) +{ + _inSizeProcessed = 0; + _inPos = _inSize = 0; + LzmaDec_Construct(&_state); +} + +CDecoder::~CDecoder() +{ + LzmaDec_Free(&_state, &g_Alloc); + MyFree(_inBuf); +} + +STDMETHODIMP CDecoder::SetInBufSize(UInt32 , UInt32 size) { _inBufSize = size; return S_OK; } +STDMETHODIMP CDecoder::SetOutBufSize(UInt32 , UInt32 size) { _outBufSize = size; return S_OK; } + +HRESULT CDecoder::CreateInputBuffer() +{ + if (_inBuf == 0 || _inBufSize != _inBufSizeAllocated) + { + MyFree(_inBuf); + _inBuf = (Byte *)MyAlloc(_inBufSize); + if (_inBuf == 0) + return E_OUTOFMEMORY; + _inBufSizeAllocated = _inBufSize; + } + return S_OK; +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *prop, UInt32 size) +{ + RINOK(SResToHRESULT(LzmaDec_Allocate(&_state, prop, size, &g_Alloc))); + _propsWereSet = true; + return CreateInputBuffer(); +} + +void CDecoder::SetOutStreamSizeResume(const UInt64 *outSize) +{ + _outSizeDefined = (outSize != NULL); + if (_outSizeDefined) + _outSize = *outSize; + _outSizeProcessed = 0; + _wrPos = 0; + LzmaDec_Init(&_state); +} + +STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) +{ + _inSizeProcessed = 0; + _inPos = _inSize = 0; + NeedMoreInput = false; + SetOutStreamSizeResume(outSize); + return S_OK; +} + +STDMETHODIMP CDecoder::SetFinishMode(UInt32 finishMode) +{ + FinishStream = (finishMode != 0); + return S_OK; +} + +HRESULT CDecoder::CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress) +{ + if (_inBuf == 0 || !_propsWereSet) + return S_FALSE; + + UInt64 startInProgress = _inSizeProcessed; + + SizeT next = (_state.dicBufSize - _state.dicPos < _outBufSize) ? _state.dicBufSize : (_state.dicPos + _outBufSize); + for (;;) + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + RINOK(inStream->Read(_inBuf, _inBufSizeAllocated, &_inSize)); + } + + SizeT dicPos = _state.dicPos; + SizeT curSize = next - dicPos; + + ELzmaFinishMode finishMode = LZMA_FINISH_ANY; + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outSizeProcessed; + if (rem <= curSize) + { + curSize = (SizeT)rem; + if (FinishStream) + finishMode = LZMA_FINISH_END; + } + } + + SizeT inSizeProcessed = _inSize - _inPos; + ELzmaStatus status; + SRes res = LzmaDec_DecodeToDic(&_state, dicPos + curSize, _inBuf + _inPos, &inSizeProcessed, finishMode, &status); + + _inPos += (UInt32)inSizeProcessed; + _inSizeProcessed += inSizeProcessed; + SizeT outSizeProcessed = _state.dicPos - dicPos; + _outSizeProcessed += outSizeProcessed; + + bool finished = (inSizeProcessed == 0 && outSizeProcessed == 0); + bool stopDecoding = (_outSizeDefined && _outSizeProcessed >= _outSize); + + if (res != 0 || _state.dicPos == next || finished || stopDecoding) + { + HRESULT res2 = WriteStream(outStream, _state.dic + _wrPos, _state.dicPos - _wrPos); + + _wrPos = _state.dicPos; + if (_state.dicPos == _state.dicBufSize) + { + _state.dicPos = 0; + _wrPos = 0; + } + next = (_state.dicBufSize - _state.dicPos < _outBufSize) ? _state.dicBufSize : (_state.dicPos + _outBufSize); + + if (res != 0) + return S_FALSE; + RINOK(res2); + if (stopDecoding) + { + if (status == LZMA_STATUS_NEEDS_MORE_INPUT) + NeedMoreInput = true; + if (FinishStream && + status != LZMA_STATUS_FINISHED_WITH_MARK && + status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) + return S_FALSE; + return S_OK; + } + if (finished) + { + if (status == LZMA_STATUS_NEEDS_MORE_INPUT) + NeedMoreInput = true; + return (status == LZMA_STATUS_FINISHED_WITH_MARK ? S_OK : S_FALSE); + } + } + if (progress) + { + UInt64 inSize = _inSizeProcessed - startInProgress; + RINOK(progress->SetRatioInfo(&inSize, &_outSizeProcessed)); + } + } +} + +STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) +{ + if (_inBuf == 0) + return E_INVALIDARG; + SetOutStreamSize(outSize); + return CodeSpec(inStream, outStream, progress); +} + +#ifndef NO_READ_FROM_CODER + +STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) { _inStream = inStream; return S_OK; } +STDMETHODIMP CDecoder::ReleaseInStream() { _inStream.Release(); return S_OK; } + +STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + if (processedSize) + *processedSize = 0; + do + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + RINOK(_inStream->Read(_inBuf, _inBufSizeAllocated, &_inSize)); + } + { + SizeT inProcessed = _inSize - _inPos; + + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _outSizeProcessed; + if (rem < size) + size = (UInt32)rem; + } + + SizeT outProcessed = size; + ELzmaStatus status; + SRes res = LzmaDec_DecodeToBuf(&_state, (Byte *)data, &outProcessed, + _inBuf + _inPos, &inProcessed, LZMA_FINISH_ANY, &status); + _inPos += (UInt32)inProcessed; + _inSizeProcessed += inProcessed; + _outSizeProcessed += outProcessed; + size -= (UInt32)outProcessed; + data = (Byte *)data + outProcessed; + if (processedSize) + *processedSize += (UInt32)outProcessed; + RINOK(SResToHRESULT(res)); + if (inProcessed == 0 && outProcessed == 0) + return S_OK; + } + } + while (size != 0); + return S_OK; +} + +HRESULT CDecoder::CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress) +{ + SetOutStreamSizeResume(outSize); + return CodeSpec(_inStream, outStream, progress); +} + +HRESULT CDecoder::ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize) +{ + RINOK(CreateInputBuffer()); + if (processedSize) + *processedSize = 0; + while (size > 0) + { + if (_inPos == _inSize) + { + _inPos = _inSize = 0; + RINOK(_inStream->Read(_inBuf, _inBufSizeAllocated, &_inSize)); + if (_inSize == 0) + break; + } + { + UInt32 curSize = _inSize - _inPos; + if (curSize > size) + curSize = size; + memcpy(data, _inBuf + _inPos, curSize); + _inPos += curSize; + _inSizeProcessed += curSize; + size -= curSize; + data = (Byte *)data + curSize; + if (processedSize) + *processedSize += curSize; + } + } + return S_OK; +} + +#endif + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaDecoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaDecoder.h new file mode 100644 index 0000000000..a4d720658d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaDecoder.h @@ -0,0 +1,91 @@ +// LzmaDecoder.h + +#ifndef __LZMA_DECODER_H +#define __LZMA_DECODER_H + +#include "../../../C/LzmaDec.h" + +#include "../../Common/MyCom.h" +#include "../ICoder.h" + +namespace NCompress { +namespace NLzma { + +class CDecoder: + public ICompressCoder, + public ICompressSetDecoderProperties2, + public ICompressSetFinishMode, + public ICompressSetBufSize, + #ifndef NO_READ_FROM_CODER + public ICompressSetInStream, + public ICompressSetOutStreamSize, + public ISequentialInStream, + #endif + public CMyUnknownImp +{ + CMyComPtr _inStream; + Byte *_inBuf; + UInt32 _inPos; + UInt32 _inSize; + CLzmaDec _state; + bool _propsWereSet; + bool _outSizeDefined; + UInt64 _outSize; + UInt64 _inSizeProcessed; + UInt64 _outSizeProcessed; + + UInt32 _inBufSizeAllocated; + UInt32 _inBufSize; + UInt32 _outBufSize; + SizeT _wrPos; + + HRESULT CreateInputBuffer(); + HRESULT CodeSpec(ISequentialInStream *inStream, ISequentialOutStream *outStream, ICompressProgressInfo *progress); + void SetOutStreamSizeResume(const UInt64 *outSize); + +public: + MY_QUERYINTERFACE_BEGIN2(ICompressCoder) + MY_QUERYINTERFACE_ENTRY(ICompressSetDecoderProperties2) + MY_QUERYINTERFACE_ENTRY(ICompressSetFinishMode) + MY_QUERYINTERFACE_ENTRY(ICompressSetBufSize) + #ifndef NO_READ_FROM_CODER + MY_QUERYINTERFACE_ENTRY(ICompressSetInStream) + MY_QUERYINTERFACE_ENTRY(ICompressSetOutStreamSize) + MY_QUERYINTERFACE_ENTRY(ISequentialInStream) + #endif + MY_QUERYINTERFACE_END + MY_ADDREF_RELEASE + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + STDMETHOD(SetFinishMode)(UInt32 finishMode); + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size); + STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size); + + #ifndef NO_READ_FROM_CODER + + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + HRESULT CodeResume(ISequentialOutStream *outStream, const UInt64 *outSize, ICompressProgressInfo *progress); + HRESULT ReadFromInputStream(void *data, UInt32 size, UInt32 *processedSize); + UInt64 GetInputProcessedSize() const { return _inSizeProcessed; } + + #endif + + bool FinishStream; // set it before decoding, if you need to decode full LZMA stream + + bool NeedMoreInput; // it's set by decoder, if it needs more input data to decode stream + + CDecoder(); + virtual ~CDecoder(); + + UInt64 GetOutputProcessedSize() const { return _outSizeProcessed; } +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaEncoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaEncoder.cpp new file mode 100644 index 0000000000..10af8c5fcc --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaEncoder.cpp @@ -0,0 +1,152 @@ +// LzmaEncoder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" + +#include "../Common/CWrappers.h" +#include "../Common/StreamUtils.h" + +#include "LzmaEncoder.h" + +namespace NCompress { +namespace NLzma { + +CEncoder::CEncoder() +{ + _encoder = NULL; + _encoder = LzmaEnc_Create(&g_Alloc); + if (!_encoder) + throw 1; +} + +CEncoder::~CEncoder() +{ + if (_encoder) + LzmaEnc_Destroy(_encoder, &g_Alloc, &g_BigAlloc); +} + +static inline wchar_t GetUpperChar(wchar_t c) +{ + if (c >= 'a' && c <= 'z') + c -= 0x20; + return c; +} + +static int ParseMatchFinder(const wchar_t *s, int *btMode, int *numHashBytes) +{ + wchar_t c = GetUpperChar(*s++); + if (c == L'H') + { + if (GetUpperChar(*s++) != L'C') + return 0; + int numHashBytesLoc = (int)(*s++ - L'0'); + if (numHashBytesLoc < 4 || numHashBytesLoc > 4) + return 0; + if (*s != 0) + return 0; + *btMode = 0; + *numHashBytes = numHashBytesLoc; + return 1; + } + + if (c != L'B') + return 0; + if (GetUpperChar(*s++) != L'T') + return 0; + int numHashBytesLoc = (int)(*s++ - L'0'); + if (numHashBytesLoc < 2 || numHashBytesLoc > 4) + return 0; + if (*s != 0) + return 0; + *btMode = 1; + *numHashBytes = numHashBytesLoc; + return 1; +} + +#define SET_PROP_32(_id_, _dest_) case NCoderPropID::_id_: ep._dest_ = v; break; + +HRESULT SetLzmaProp(PROPID propID, const PROPVARIANT &prop, CLzmaEncProps &ep) +{ + if (propID == NCoderPropID::kMatchFinder) + { + if (prop.vt != VT_BSTR) + return E_INVALIDARG; + return ParseMatchFinder(prop.bstrVal, &ep.btMode, &ep.numHashBytes) ? S_OK : E_INVALIDARG; + } + if (propID > NCoderPropID::kReduceSize) + return S_OK; + if (propID == NCoderPropID::kReduceSize) + { + if (prop.vt == VT_UI8) + ep.reduceSize = prop.uhVal.QuadPart; + return S_OK; + } + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 v = prop.ulVal; + switch (propID) + { + case NCoderPropID::kDefaultProp: if (v > 31) return E_INVALIDARG; ep.dictSize = (UInt32)1 << (unsigned)v; break; + SET_PROP_32(kLevel, level) + SET_PROP_32(kNumFastBytes, fb) + SET_PROP_32(kMatchFinderCycles, mc) + SET_PROP_32(kAlgorithm, algo) + SET_PROP_32(kDictionarySize, dictSize) + SET_PROP_32(kPosStateBits, pb) + SET_PROP_32(kLitPosBits, lp) + SET_PROP_32(kLitContextBits, lc) + SET_PROP_32(kNumThreads, numThreads) + default: return E_INVALIDARG; + } + return S_OK; +} + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, + const PROPVARIANT *coderProps, UInt32 numProps) +{ + CLzmaEncProps props; + LzmaEncProps_Init(&props); + + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = coderProps[i]; + PROPID propID = propIDs[i]; + switch (propID) + { + case NCoderPropID::kEndMarker: + if (prop.vt != VT_BOOL) return E_INVALIDARG; props.writeEndMark = (prop.boolVal != VARIANT_FALSE); break; + default: + RINOK(SetLzmaProp(propID, prop, props)); + } + } + return SResToHRESULT(LzmaEnc_SetProps(_encoder, &props)); +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + Byte props[LZMA_PROPS_SIZE]; + size_t size = LZMA_PROPS_SIZE; + RINOK(LzmaEnc_WriteProperties(_encoder, props, &size)); + return WriteStream(outStream, props, size); +} + +STDMETHODIMP CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) +{ + CSeqInStreamWrap inWrap(inStream); + CSeqOutStreamWrap outWrap(outStream); + CCompressProgressWrap progressWrap(progress); + + SRes res = LzmaEnc_Encode(_encoder, &outWrap.p, &inWrap.p, progress ? &progressWrap.p : NULL, &g_Alloc, &g_BigAlloc); + _inputProcessed = inWrap.Processed; + if (res == SZ_ERROR_READ && inWrap.Res != S_OK) + return inWrap.Res; + if (res == SZ_ERROR_WRITE && outWrap.Res != S_OK) + return outWrap.Res; + if (res == SZ_ERROR_PROGRESS && progressWrap.Res != S_OK) + return progressWrap.Res; + return SResToHRESULT(res); +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaEncoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaEncoder.h new file mode 100644 index 0000000000..7feafc2f3d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaEncoder.h @@ -0,0 +1,38 @@ +// LzmaEncoder.h + +#ifndef __LZMA_ENCODER_H +#define __LZMA_ENCODER_H + +#include "../../../C/LzmaEnc.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCompress { +namespace NLzma { + +class CEncoder: + public ICompressCoder, + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + public CMyUnknownImp +{ + CLzmaEncHandle _encoder; + UInt64 _inputProcessed; +public: + MY_UNKNOWN_IMP3(ICompressCoder, ICompressSetCoderProperties, ICompressWriteCoderProperties) + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + + CEncoder(); + virtual ~CEncoder(); + UInt64 GetInputProcessedSize() const { return _inputProcessed; } +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaRegister.cpp new file mode 100644 index 0000000000..4397595081 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/LzmaRegister.cpp @@ -0,0 +1,22 @@ +// LzmaRegister.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "LzmaDecoder.h" + +#ifndef EXTRACT_ONLY +#include "LzmaEncoder.h" +#endif + +namespace NCompress { +namespace NLzma { + +REGISTER_CODEC_E(LZMA, + CDecoder(), + CEncoder(), + 0x30101, + "LZMA") + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdDecoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdDecoder.cpp new file mode 100644 index 0000000000..89c0457cc6 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdDecoder.cpp @@ -0,0 +1,177 @@ +// PpmdDecoder.cpp +// 2009-03-11 : Igor Pavlov : Public domain + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" +#include "../../../C/CpuArch.h" + +#include "../Common/StreamUtils.h" + +#include "PpmdDecoder.h" + +namespace NCompress { +namespace NPpmd { + +#if !defined(__APPLE__) +static const UInt32 kBufSize = (1 << 20); +#endif + +enum +{ + kStatus_NeedInit, + kStatus_Normal, + kStatus_Finished, + kStatus_Error +}; + +CDecoder::~CDecoder() +{ + ::MidFree(_outBuf); + Ppmd7_Free(&_ppmd, &g_BigAlloc); +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size) +{ + if (size < 5) + return E_INVALIDARG; + _order = props[0]; + UInt32 memSize = GetUi32(props + 1); + if (_order < PPMD7_MIN_ORDER || + _order > PPMD7_MAX_ORDER || + memSize < PPMD7_MIN_MEM_SIZE || + memSize > PPMD7_MAX_MEM_SIZE) + return E_NOTIMPL; +#if defined(__APPLE__) + if (!_inStream.Alloc(kLzmaSDKObjCDecoderReadSize)) +#else + if (!_inStream.Alloc(1 << 20)) +#endif + return E_OUTOFMEMORY; + if (!Ppmd7_Alloc(&_ppmd, memSize, &g_BigAlloc)) + return E_OUTOFMEMORY; + return S_OK; +} + +HRESULT CDecoder::CodeSpec(Byte *memStream, UInt32 size) +{ + switch (_status) + { + case kStatus_Finished: return S_OK; + case kStatus_Error: return S_FALSE; + case kStatus_NeedInit: + _inStream.Init(); + if (!Ppmd7z_RangeDec_Init(&_rangeDec)) + { + _status = kStatus_Error; + return S_FALSE; + } + _status = kStatus_Normal; + Ppmd7_Init(&_ppmd, _order); + break; + } + if (_outSizeDefined) + { + const UInt64 rem = _outSize - _processedSize; + if (size > rem) + size = (UInt32)rem; + } + + UInt32 i; + int sym = 0; + for (i = 0; i != size; i++) + { + sym = Ppmd7_DecodeSymbol(&_ppmd, &_rangeDec.p); + if (_inStream.Extra || sym < 0) + break; + memStream[i] = (Byte)sym; + } + + _processedSize += i; + if (_inStream.Extra) + { + _status = kStatus_Error; + return _inStream.Res; + } + if (sym < 0) + _status = (sym < -1) ? kStatus_Error : kStatus_Finished; + return S_OK; +} + +STDMETHODIMP CDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress) +{ + if (!_outBuf) + { +#if defined(__APPLE__) + _outBuf = (Byte *)::MidAlloc(kLzmaSDKObjCDecoderWriteSize); +#else + _outBuf = (Byte *)::MidAlloc(kBufSize); +#endif + if (!_outBuf) + return E_OUTOFMEMORY; + } + + _inStream.Stream = inStream; + SetOutStreamSize(outSize); + + do + { + const UInt64 startPos = _processedSize; +#if defined(__APPLE__) + HRESULT res = CodeSpec(_outBuf, kLzmaSDKObjCDecoderWriteSize); +#else + HRESULT res = CodeSpec(_outBuf, kBufSize); +#endif + size_t processed = (size_t)(_processedSize - startPos); + RINOK(WriteStream(outStream, _outBuf, processed)); + RINOK(res); + if (_status == kStatus_Finished) + break; + if (progress) + { + UInt64 inSize = _inStream.GetProcessed(); + RINOK(progress->SetRatioInfo(&inSize, &_processedSize)); + } + } + while (!_outSizeDefined || _processedSize < _outSize); + return S_OK; +} + +STDMETHODIMP CDecoder::SetOutStreamSize(const UInt64 *outSize) +{ + _outSizeDefined = (outSize != NULL); + if (_outSizeDefined) + _outSize = *outSize; + _processedSize = 0; + _status = kStatus_NeedInit; + return S_OK; +} + +#ifndef NO_READ_FROM_CODER + +STDMETHODIMP CDecoder::SetInStream(ISequentialInStream *inStream) +{ + InSeqStream = inStream; + _inStream.Stream = inStream; + return S_OK; +} + +STDMETHODIMP CDecoder::ReleaseInStream() +{ + InSeqStream.Release(); + return S_OK; +} + +STDMETHODIMP CDecoder::Read(void *data, UInt32 size, UInt32 *processedSize) +{ + const UInt64 startPos = _processedSize; + HRESULT res = CodeSpec((Byte *)data, size); + if (processedSize) + *processedSize = (UInt32)(_processedSize - startPos); + return res; +} + +#endif + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdDecoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdDecoder.h new file mode 100644 index 0000000000..c61d1d098c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdDecoder.h @@ -0,0 +1,78 @@ +// PpmdDecoder.h +// 2009-03-11 : Igor Pavlov : Public domain + +#ifndef __COMPRESS_PPMD_DECODER_H +#define __COMPRESS_PPMD_DECODER_H + +#include "../../../C/Ppmd7.h" + +#include "../../Common/MyCom.h" + +#include "../Common/CWrappers.h" + +#include "../ICoder.h" + +namespace NCompress { +namespace NPpmd { + +class CDecoder : + public ICompressCoder, + public ICompressSetDecoderProperties2, + #ifndef NO_READ_FROM_CODER + public ICompressSetInStream, + public ICompressSetOutStreamSize, + public ISequentialInStream, + #endif + public CMyUnknownImp +{ + Byte *_outBuf; + CPpmd7z_RangeDec _rangeDec; + CByteInBufWrap _inStream; + CPpmd7 _ppmd; + + Byte _order; + bool _outSizeDefined; + int _status; + UInt64 _outSize; + UInt64 _processedSize; + + HRESULT CodeSpec(Byte *memStream, UInt32 size); + +public: + + #ifndef NO_READ_FROM_CODER + CMyComPtr InSeqStream; + MY_UNKNOWN_IMP4( + ICompressSetDecoderProperties2, + ICompressSetInStream, + ICompressSetOutStreamSize, + ISequentialInStream) + #else + MY_UNKNOWN_IMP1( + ICompressSetDecoderProperties2) + #endif + + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize); + + #ifndef NO_READ_FROM_CODER + STDMETHOD(SetInStream)(ISequentialInStream *inStream); + STDMETHOD(ReleaseInStream)(); + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + #endif + + CDecoder(): _outBuf(NULL), _outSizeDefined(false) + { + Ppmd7z_RangeDec_CreateVTable(&_rangeDec); + _rangeDec.Stream = &_inStream.p; + Ppmd7_Construct(&_ppmd); + } + + ~CDecoder(); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdEncoder.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdEncoder.cpp new file mode 100644 index 0000000000..203d613abe --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdEncoder.cpp @@ -0,0 +1,166 @@ +// PpmdEncoder.cpp + +#include "StdAfx.h" + +#include "../../../C/Alloc.h" +#include "../../../C/CpuArch.h" + +#include "../Common/StreamUtils.h" + +#include "PpmdEncoder.h" + +namespace NCompress { +namespace NPpmd { + +#if !defined(__APPLE__) +static const UInt32 kBufSize = (1 << 20); +#endif + +static const Byte kOrders[10] = { 3, 4, 4, 5, 5, 6, 8, 16, 24, 32 }; + +void CEncProps::Normalize(int level) +{ + if (level < 0) level = 5; + if (level > 9) level = 9; + if (MemSize == (UInt32)(Int32)-1) + MemSize = level >= 9 ? ((UInt32)192 << 20) : ((UInt32)1 << (level + 19)); + const unsigned kMult = 16; + if (MemSize / kMult > ReduceSize) + { + for (unsigned i = 16; i <= 31; i++) + { + UInt32 m = (UInt32)1 << i; + if (ReduceSize <= m / kMult) + { + if (MemSize > m) + MemSize = m; + break; + } + } + } + if (Order == -1) Order = kOrders[(unsigned)level]; +} + +CEncoder::CEncoder(): + _inBuf(NULL) +{ + _props.Normalize(-1); + _rangeEnc.Stream = &_outStream.p; + Ppmd7_Construct(&_ppmd); +} + +CEncoder::~CEncoder() +{ + ::MidFree(_inBuf); + Ppmd7_Free(&_ppmd, &g_BigAlloc); +} + +STDMETHODIMP CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps) +{ + int level = -1; + CEncProps props; + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = coderProps[i]; + PROPID propID = propIDs[i]; + if (propID > NCoderPropID::kReduceSize) + continue; + if (propID == NCoderPropID::kReduceSize) + { + if (prop.vt == VT_UI8 && prop.uhVal.QuadPart < (UInt32)(Int32)-1) + props.ReduceSize = (UInt32)prop.uhVal.QuadPart; + continue; + } + if (prop.vt != VT_UI4) + return E_INVALIDARG; + UInt32 v = (UInt32)prop.ulVal; + switch (propID) + { + case NCoderPropID::kUsedMemorySize: + if (v < (1 << 16) || v > PPMD7_MAX_MEM_SIZE || (v & 3) != 0) + return E_INVALIDARG; + props.MemSize = v; + break; + case NCoderPropID::kOrder: + if (v < 2 || v > 32) + return E_INVALIDARG; + props.Order = (Byte)v; + break; + case NCoderPropID::kNumThreads: break; + case NCoderPropID::kLevel: level = (int)v; break; + default: return E_INVALIDARG; + } + } + props.Normalize(level); + _props = props; + return S_OK; +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + const UInt32 kPropSize = 5; + Byte props[kPropSize]; + props[0] = (Byte)_props.Order; + SetUi32(props + 1, _props.MemSize); + return WriteStream(outStream, props, kPropSize); +} + +HRESULT CEncoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 * /* inSize */, const UInt64 * /* outSize */, ICompressProgressInfo *progress) +{ + if (!_inBuf) + { +#if defined(__APPLE__) + _inBuf = (Byte *)::MidAlloc(kLzmaSDKObjCDecoderReadSize); +#else + _inBuf = (Byte *)::MidAlloc(kBufSize); +#endif + if (!_inBuf) + return E_OUTOFMEMORY; + } +#if defined(__APPLE__) + if (!_outStream.Alloc(kLzmaSDKObjCDecoderWriteSize)) +#else + if (!_outStream.Alloc(1 << 20)) +#endif + return E_OUTOFMEMORY; + if (!Ppmd7_Alloc(&_ppmd, _props.MemSize, &g_BigAlloc)) + return E_OUTOFMEMORY; + + _outStream.Stream = outStream; + _outStream.Init(); + + Ppmd7z_RangeEnc_Init(&_rangeEnc); + Ppmd7_Init(&_ppmd, _props.Order); + + UInt64 processed = 0; + for (;;) + { + UInt32 size; +#if defined(__APPLE__) + RINOK(inStream->Read(_inBuf, kLzmaSDKObjCDecoderReadSize, &size)); +#else + RINOK(inStream->Read(_inBuf, kBufSize, &size)); +#endif + if (size == 0) + { + // We don't write EndMark in PPMD-7z. + // Ppmd7_EncodeSymbol(&_ppmd, &_rangeEnc, -1); + Ppmd7z_RangeEnc_FlushData(&_rangeEnc); + return _outStream.Flush(); + } + for (UInt32 i = 0; i < size; i++) + { + Ppmd7_EncodeSymbol(&_ppmd, &_rangeEnc, _inBuf[i]); + RINOK(_outStream.Res); + } + processed += size; + if (progress) + { + UInt64 outSize = _outStream.GetProcessed(); + RINOK(progress->SetRatioInfo(&processed, &outSize)); + } + } +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdEncoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdEncoder.h new file mode 100644 index 0000000000..cdb0352b7b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdEncoder.h @@ -0,0 +1,58 @@ +// PpmdEncoder.h + +#ifndef __COMPRESS_PPMD_ENCODER_H +#define __COMPRESS_PPMD_ENCODER_H + +#include "../../../C/Ppmd7.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +#include "../Common/CWrappers.h" + +namespace NCompress { +namespace NPpmd { + +struct CEncProps +{ + UInt32 MemSize; + UInt32 ReduceSize; + int Order; + + CEncProps() + { + MemSize = (UInt32)(Int32)-1; + ReduceSize = (UInt32)(Int32)-1; + Order = -1; + } + void Normalize(int level); +}; + +class CEncoder : + public ICompressCoder, + public ICompressSetCoderProperties, + public ICompressWriteCoderProperties, + public CMyUnknownImp +{ + Byte *_inBuf; + CByteOutBufWrap _outStream; + CPpmd7z_RangeEnc _rangeEnc; + CPpmd7 _ppmd; + CEncProps _props; +public: + MY_UNKNOWN_IMP3( + ICompressCoder, + ICompressSetCoderProperties, + ICompressWriteCoderProperties) + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, ICompressProgressInfo *progress); + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + CEncoder(); + ~CEncoder(); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdRegister.cpp new file mode 100644 index 0000000000..c7486966cb --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/PpmdRegister.cpp @@ -0,0 +1,22 @@ +// PpmdRegister.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "PpmdDecoder.h" + +#ifndef EXTRACT_ONLY +#include "PpmdEncoder.h" +#endif + +namespace NCompress { +namespace NPpmd { + +REGISTER_CODEC_E(PPMD, + CDecoder(), + CEncoder(), + 0x30401, + "PPMD") + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/StdAfx.h new file mode 100644 index 0000000000..0b4cb3d0bb --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Compress/StdAfx.h @@ -0,0 +1,10 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../Common/Common.h" +#include "../../../../src/LzmaAppleCommon.h" +#include "../../../../src/LzmaSDKObjCExtern.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAes.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAes.cpp new file mode 100644 index 0000000000..f412bf9d14 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAes.cpp @@ -0,0 +1,280 @@ +// 7zAes.cpp + +#include "StdAfx.h" + +#include "../../../C/Sha256.h" + +#include "../../Common/ComTry.h" + +#ifndef _7ZIP_ST +#include "../../Windows/Synchronization.h" +#endif + +#include "../Common/StreamUtils.h" + +#include "7zAes.h" +#include "MyAes.h" + +#ifndef EXTRACT_ONLY +#include "RandGen.h" +#endif + +namespace NCrypto { +namespace N7z { + +static const unsigned k_NumCyclesPower_Supported_MAX = 24; + +bool CKeyInfo::IsEqualTo(const CKeyInfo &a) const +{ + if (SaltSize != a.SaltSize || NumCyclesPower != a.NumCyclesPower) + return false; + for (unsigned i = 0; i < SaltSize; i++) + if (Salt[i] != a.Salt[i]) + return false; + return (Password == a.Password); +} + +void CKeyInfo::CalcKey() +{ + if (NumCyclesPower == 0x3F) + { + unsigned pos; + for (pos = 0; pos < SaltSize; pos++) + Key[pos] = Salt[pos]; + for (unsigned i = 0; i < Password.Size() && pos < kKeySize; i++) + Key[pos++] = Password[i]; + for (; pos < kKeySize; pos++) + Key[pos] = 0; + } + else + { + size_t bufSize = 8 + SaltSize + Password.Size(); + CObjArray buf(bufSize); + memcpy(buf, Salt, SaltSize); + memcpy(buf + SaltSize, Password, Password.Size()); + + CSha256 sha; + Sha256_Init(&sha); + + Byte *ctr = buf + SaltSize + Password.Size(); + + for (unsigned i = 0; i < 8; i++) + ctr[i] = 0; + + UInt64 numRounds = (UInt64)1 << NumCyclesPower; + + do + { + Sha256_Update(&sha, buf, bufSize); + for (unsigned i = 0; i < 8; i++) + if (++(ctr[i]) != 0) + break; + } + while (--numRounds != 0); + + Sha256_Final(&sha, Key); + } +} + +bool CKeyInfoCache::GetKey(CKeyInfo &key) +{ + FOR_VECTOR (i, Keys) + { + const CKeyInfo &cached = Keys[i]; + if (key.IsEqualTo(cached)) + { + for (unsigned j = 0; j < kKeySize; j++) + key.Key[j] = cached.Key[j]; + if (i != 0) + Keys.MoveToFront(i); + return true; + } + } + return false; +} + +void CKeyInfoCache::FindAndAdd(const CKeyInfo &key) +{ + FOR_VECTOR (i, Keys) + { + const CKeyInfo &cached = Keys[i]; + if (key.IsEqualTo(cached)) + { + if (i != 0) + Keys.MoveToFront(i); + return; + } + } + Add(key); +} + +void CKeyInfoCache::Add(const CKeyInfo &key) +{ + if (Keys.Size() >= Size) + Keys.DeleteBack(); + Keys.Insert(0, key); +} + +static CKeyInfoCache g_GlobalKeyCache(32); + +#ifndef _7ZIP_ST + static NWindows::NSynchronization::CCriticalSection g_GlobalKeyCacheCriticalSection; + #define MT_LOCK NWindows::NSynchronization::CCriticalSectionLock lock(g_GlobalKeyCacheCriticalSection); +#else + #define MT_LOCK +#endif + +CBase::CBase(): + _cachedKeys(16), + _ivSize(0) +{ + for (unsigned i = 0; i < sizeof(_iv); i++) + _iv[i] = 0; +} + +void CBase::PrepareKey() +{ + // BCJ2 threads use same password. So we use long lock. + MT_LOCK + + bool finded = false; + if (!_cachedKeys.GetKey(_key)) + { + finded = g_GlobalKeyCache.GetKey(_key); + if (!finded) + _key.CalcKey(); + _cachedKeys.Add(_key); + } + if (!finded) + g_GlobalKeyCache.FindAndAdd(_key); +} + +#ifndef EXTRACT_ONLY + +/* +STDMETHODIMP CEncoder::ResetSalt() +{ + _key.SaltSize = 4; + g_RandomGenerator.Generate(_key.Salt, _key.SaltSize); + return S_OK; +} +*/ + +STDMETHODIMP CEncoder::ResetInitVector() +{ + for (unsigned i = 0; i < sizeof(_iv); i++) + _iv[i] = 0; + _ivSize = 8; + g_RandomGenerator.Generate(_iv, _ivSize); + return S_OK; +} + +STDMETHODIMP CEncoder::WriteCoderProperties(ISequentialOutStream *outStream) +{ + Byte props[2 + sizeof(_key.Salt) + sizeof(_iv)]; + unsigned propsSize = 1; + + props[0] = (Byte)(_key.NumCyclesPower + | (_key.SaltSize == 0 ? 0 : (1 << 7)) + | (_ivSize == 0 ? 0 : (1 << 6))); + + if (_key.SaltSize != 0 || _ivSize != 0) + { + props[1] = (Byte)( + ((_key.SaltSize == 0 ? 0 : _key.SaltSize - 1) << 4) + | (_ivSize == 0 ? 0 : _ivSize - 1)); + memcpy(props + 2, _key.Salt, _key.SaltSize); + propsSize = 2 + _key.SaltSize; + memcpy(props + propsSize, _iv, _ivSize); + propsSize += _ivSize; + } + + return WriteStream(outStream, props, propsSize); +} + +CEncoder::CEncoder() +{ + // _key.SaltSize = 4; g_RandomGenerator.Generate(_key.Salt, _key.SaltSize); + // _key.NumCyclesPower = 0x3F; + _key.NumCyclesPower = 19; + _aesFilter = new CAesCbcEncoder(kKeySize); +} + +#endif + +CDecoder::CDecoder() +{ + _aesFilter = new CAesCbcDecoder(kKeySize); +} + +STDMETHODIMP CDecoder::SetDecoderProperties2(const Byte *data, UInt32 size) +{ + _key.ClearProps(); + + _ivSize = 0; + unsigned i; + for (i = 0; i < sizeof(_iv); i++) + _iv[i] = 0; + + if (size == 0) + return S_OK; + + Byte b0 = data[0]; + + _key.NumCyclesPower = b0 & 0x3F; + if ((b0 & 0xC0) == 0) + return size == 1 ? S_OK : E_INVALIDARG; + + if (size <= 1) + return E_INVALIDARG; + + Byte b1 = data[1]; + + unsigned saltSize = ((b0 >> 7) & 1) + (b1 >> 4); + unsigned ivSize = ((b0 >> 6) & 1) + (b1 & 0x0F); + + if (size != 2 + saltSize + ivSize) + return E_INVALIDARG; + _key.SaltSize = saltSize; + data += 2; + for (i = 0; i < saltSize; i++) + _key.Salt[i] = *data++; + for (i = 0; i < ivSize; i++) + _iv[i] = *data++; + return (_key.NumCyclesPower <= k_NumCyclesPower_Supported_MAX + || _key.NumCyclesPower == 0x3F) ? S_OK : E_NOTIMPL; +} + + +STDMETHODIMP CBaseCoder::CryptoSetPassword(const Byte *data, UInt32 size) +{ + COM_TRY_BEGIN + + _key.Password.CopyFrom(data, (size_t)size); + return S_OK; + + COM_TRY_END +} + +STDMETHODIMP CBaseCoder::Init() +{ + COM_TRY_BEGIN + + PrepareKey(); + CMyComPtr cp; + RINOK(_aesFilter.QueryInterface(IID_ICryptoProperties, &cp)); + if (!cp) + return E_FAIL; + RINOK(cp->SetKey(_key.Key, kKeySize)); + RINOK(cp->SetInitVector(_iv, sizeof(_iv))); + return _aesFilter->Init(); + + COM_TRY_END +} + +STDMETHODIMP_(UInt32) CBaseCoder::Filter(Byte *data, UInt32 size) +{ + return _aesFilter->Filter(data, size); +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAes.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAes.h new file mode 100644 index 0000000000..5a09436079 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAes.h @@ -0,0 +1,118 @@ +// 7zAes.h + +#ifndef __CRYPTO_7Z_AES_H +#define __CRYPTO_7Z_AES_H + +#include "../../Common/MyBuffer.h" +#include "../../Common/MyCom.h" +#include "../../Common/MyVector.h" + +#include "../ICoder.h" +#include "../IPassword.h" + +namespace NCrypto { +namespace N7z { + +const unsigned kKeySize = 32; +const unsigned kSaltSizeMax = 16; +const unsigned kIvSizeMax = 16; // AES_BLOCK_SIZE; + +class CKeyInfo +{ +public: + unsigned NumCyclesPower; + unsigned SaltSize; + Byte Salt[kSaltSizeMax]; + CByteBuffer Password; + Byte Key[kKeySize]; + + bool IsEqualTo(const CKeyInfo &a) const; + void CalcKey(); + + CKeyInfo() { ClearProps(); } + void ClearProps() + { + NumCyclesPower = 0; + SaltSize = 0; + for (unsigned i = 0; i < sizeof(Salt); i++) + Salt[i] = 0; + } +}; + +class CKeyInfoCache +{ + unsigned Size; + CObjectVector Keys; +public: + CKeyInfoCache(unsigned size): Size(size) {} + bool GetKey(CKeyInfo &key); + void Add(const CKeyInfo &key); + void FindAndAdd(const CKeyInfo &key); +}; + +class CBase +{ + CKeyInfoCache _cachedKeys; +protected: + CKeyInfo _key; + Byte _iv[kIvSizeMax]; + unsigned _ivSize; + + void PrepareKey(); + CBase(); +}; + +class CBaseCoder: + public ICompressFilter, + public ICryptoSetPassword, + public CMyUnknownImp, + public CBase +{ +protected: + CMyComPtr _aesFilter; + +public: + INTERFACE_ICompressFilter(;) + + STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size); +}; + +#ifndef EXTRACT_ONLY + +class CEncoder: + public CBaseCoder, + public ICompressWriteCoderProperties, + // public ICryptoResetSalt, + public ICryptoResetInitVector +{ +public: + MY_UNKNOWN_IMP4( + ICompressFilter, + ICryptoSetPassword, + ICompressWriteCoderProperties, + // ICryptoResetSalt, + ICryptoResetInitVector) + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream); + // STDMETHOD(ResetSalt)(); + STDMETHOD(ResetInitVector)(); + CEncoder(); +}; + +#endif + +class CDecoder: + public CBaseCoder, + public ICompressSetDecoderProperties2 +{ +public: + MY_UNKNOWN_IMP3( + ICompressFilter, + ICryptoSetPassword, + ICompressSetDecoderProperties2) + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size); + CDecoder(); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAesRegister.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAesRegister.cpp new file mode 100644 index 0000000000..c0b2060939 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/7zAesRegister.cpp @@ -0,0 +1,17 @@ +// 7zAesRegister.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "7zAes.h" + +namespace NCrypto { +namespace N7z { + +REGISTER_FILTER_E(7zAES, + CDecoder(), + CEncoder(), + 0x6F10701, "7zAES") + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAes.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAes.cpp new file mode 100644 index 0000000000..1d399d707f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAes.cpp @@ -0,0 +1,112 @@ +// Crypto/MyAes.cpp + +#include "StdAfx.h" + +#include "../../../C/CpuArch.h" + +#include "MyAes.h" + +namespace NCrypto { + +static struct CAesTabInit { CAesTabInit() { AesGenTables();} } g_AesTabInit; + +CAesCbcCoder::CAesCbcCoder(bool encodeMode, unsigned keySize): + _keySize(keySize), + _keyIsSet(false), + _encodeMode(encodeMode) +{ + _offset = ((0 - (unsigned)(ptrdiff_t)_aes) & 0xF) / sizeof(UInt32); + memset(_iv, 0, AES_BLOCK_SIZE); + SetFunctions(0); +} + +STDMETHODIMP CAesCbcCoder::Init() +{ + AesCbc_Init(_aes + _offset, _iv); + return _keyIsSet ? S_OK : E_FAIL; +} + +STDMETHODIMP_(UInt32) CAesCbcCoder::Filter(Byte *data, UInt32 size) +{ + if (!_keyIsSet) + return 0; + if (size == 0) + return 0; + if (size < AES_BLOCK_SIZE) + return AES_BLOCK_SIZE; + size >>= 4; + _codeFunc(_aes + _offset, data, size); + return size << 4; +} + +STDMETHODIMP CAesCbcCoder::SetKey(const Byte *data, UInt32 size) +{ + if ((size & 0x7) != 0 || size < 16 || size > 32) + return E_INVALIDARG; + if (_keySize != 0 && size != _keySize) + return E_INVALIDARG; + AES_SET_KEY_FUNC setKeyFunc = _encodeMode ? Aes_SetKey_Enc : Aes_SetKey_Dec; + setKeyFunc(_aes + _offset + 4, data, size); + _keyIsSet = true; + return S_OK; +} + +STDMETHODIMP CAesCbcCoder::SetInitVector(const Byte *data, UInt32 size) +{ + if (size != AES_BLOCK_SIZE) + return E_INVALIDARG; + memcpy(_iv, data, size); + CAesCbcCoder::Init(); // don't call virtual function here !!! + return S_OK; +} + +EXTERN_C_BEGIN + +void MY_FAST_CALL AesCbc_Encode(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCbc_Decode(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCtr_Code(UInt32 *ivAes, Byte *data, size_t numBlocks); + +void MY_FAST_CALL AesCbc_Encode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCbc_Decode_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks); +void MY_FAST_CALL AesCtr_Code_Intel(UInt32 *ivAes, Byte *data, size_t numBlocks); + +EXTERN_C_END + +bool CAesCbcCoder::SetFunctions(UInt32 algo) +{ + _codeFunc = _encodeMode ? + g_AesCbc_Encode : + g_AesCbc_Decode; + if (algo == 1) + { + _codeFunc = _encodeMode ? + AesCbc_Encode: + AesCbc_Decode; + } + if (algo == 2) + { + #ifdef MY_CPU_X86_OR_AMD64 + if (g_AesCbc_Encode != AesCbc_Encode_Intel) + #endif + return false; + } + return true; +} + +STDMETHODIMP CAesCbcCoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps) +{ + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = coderProps[i]; + if (propIDs[i] == NCoderPropID::kDefaultProp) + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + if (!SetFunctions(prop.ulVal)) + return E_NOTIMPL; + } + } + return S_OK; +} + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAes.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAes.h new file mode 100644 index 0000000000..2c10048e73 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAes.h @@ -0,0 +1,55 @@ +// Crypto/MyAes.h + +#ifndef __CRYPTO_MY_AES_H +#define __CRYPTO_MY_AES_H + +#include "../../../C/Aes.h" + +#include "../../Common/MyCom.h" + +#include "../ICoder.h" + +namespace NCrypto { + +class CAesCbcCoder: + public ICompressFilter, + public ICryptoProperties, + public ICompressSetCoderProperties, + public CMyUnknownImp +{ + AES_CODE_FUNC _codeFunc; + unsigned _offset; + unsigned _keySize; + bool _keyIsSet; + bool _encodeMode; + UInt32 _aes[AES_NUM_IVMRK_WORDS + 3]; + Byte _iv[AES_BLOCK_SIZE]; + + bool SetFunctions(UInt32 algo); + +public: + CAesCbcCoder(bool encodeMode, unsigned keySize); + + MY_UNKNOWN_IMP3(ICompressFilter, ICryptoProperties, ICompressSetCoderProperties) + + INTERFACE_ICompressFilter(;) + + STDMETHOD(SetKey)(const Byte *data, UInt32 size); + STDMETHOD(SetInitVector)(const Byte *data, UInt32 size); + + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); +}; + +struct CAesCbcEncoder: public CAesCbcCoder +{ + CAesCbcEncoder(unsigned keySize = 0): CAesCbcCoder(true, keySize) {} +}; + +struct CAesCbcDecoder: public CAesCbcCoder +{ + CAesCbcDecoder(unsigned keySize = 0): CAesCbcCoder(false, keySize) {} +}; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAesReg.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAesReg.cpp new file mode 100644 index 0000000000..3427ad6257 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/MyAesReg.cpp @@ -0,0 +1,16 @@ +// MyAesReg.cpp + +#include "StdAfx.h" + +#include "../Common/RegisterCodec.h" + +#include "MyAes.h" + +namespace NCrypto { + +REGISTER_FILTER_E(AES256CBC, + CAesCbcDecoder(32), + CAesCbcEncoder(32), + 0x6F00181, "AES256CBC") + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/RandGen.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/RandGen.cpp new file mode 100644 index 0000000000..542f39bd56 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/RandGen.cpp @@ -0,0 +1,124 @@ +// RandGen.cpp + +#include "StdAfx.h" + +#ifndef _7ZIP_ST +#include "../../Windows/Synchronization.h" +#endif + +#include "RandGen.h" + +#ifndef _WIN32 +#include +#define USE_POSIX_TIME +#define USE_POSIX_TIME2 +#endif + +#ifdef USE_POSIX_TIME +#include +#ifdef USE_POSIX_TIME2 +#include +#endif +#endif + +// This is not very good random number generator. +// Please use it only for salt. +// First generated data block depends from timer and processID. +// Other generated data blocks depend from previous state +// Maybe it's possible to restore original timer value from generated value. + +#define HASH_UPD(x) Sha256_Update(&hash, (const Byte *)&x, sizeof(x)); + +void CRandomGenerator::Init() +{ + CSha256 hash; + Sha256_Init(&hash); + + #ifdef _WIN32 + DWORD w = ::GetCurrentProcessId(); + HASH_UPD(w); + w = ::GetCurrentThreadId(); + HASH_UPD(w); + #else + pid_t pid = getpid(); + HASH_UPD(pid); + pid = getppid(); + HASH_UPD(pid); + #endif + + for (unsigned i = 0; i < + #ifdef _DEBUG + 2; + #else + 1000; + #endif + i++) + { + #ifdef _WIN32 + LARGE_INTEGER v; + if (::QueryPerformanceCounter(&v)) + HASH_UPD(v.QuadPart); + #endif + + #ifdef USE_POSIX_TIME + #ifdef USE_POSIX_TIME2 + timeval v; + if (gettimeofday(&v, 0) == 0) + { + HASH_UPD(v.tv_sec); + HASH_UPD(v.tv_usec); + } + #endif + time_t v2 = time(NULL); + HASH_UPD(v2); + #endif + + #ifdef _WIN32 + DWORD tickCount = ::GetTickCount(); + HASH_UPD(tickCount); + #endif + + for (unsigned j = 0; j < 100; j++) + { + Sha256_Final(&hash, _buff); + Sha256_Init(&hash); + Sha256_Update(&hash, _buff, SHA256_DIGEST_SIZE); + } + } + Sha256_Final(&hash, _buff); + _needInit = false; +} + +#ifndef _7ZIP_ST + static NWindows::NSynchronization::CCriticalSection g_CriticalSection; + #define MT_LOCK NWindows::NSynchronization::CCriticalSectionLock lock(g_CriticalSection); +#else + #define MT_LOCK +#endif + +void CRandomGenerator::Generate(Byte *data, unsigned size) +{ + MT_LOCK + + if (_needInit) + Init(); + while (size != 0) + { + CSha256 hash; + + Sha256_Init(&hash); + Sha256_Update(&hash, _buff, SHA256_DIGEST_SIZE); + Sha256_Final(&hash, _buff); + + Sha256_Init(&hash); + UInt32 salt = 0xF672ABD1; + HASH_UPD(salt); + Sha256_Update(&hash, _buff, SHA256_DIGEST_SIZE); + Byte buff[SHA256_DIGEST_SIZE]; + Sha256_Final(&hash, buff); + for (unsigned i = 0; i < SHA256_DIGEST_SIZE && size != 0; i++, size--) + *data++ = buff[i]; + } +} + +CRandomGenerator g_RandomGenerator; diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/RandGen.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/RandGen.h new file mode 100644 index 0000000000..ff44450f8f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/RandGen.h @@ -0,0 +1,21 @@ +// RandGen.h + +#ifndef __CRYPTO_RAND_GEN_H +#define __CRYPTO_RAND_GEN_H + +#include "../../../C/Sha256.h" + +class CRandomGenerator +{ + Byte _buff[SHA256_DIGEST_SIZE]; + bool _needInit; + + void Init(); +public: + CRandomGenerator(): _needInit(true) {}; + void Generate(Byte *data, unsigned size); +}; + +extern CRandomGenerator g_RandomGenerator; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/StdAfx.h new file mode 100644 index 0000000000..eac94d6c65 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/Crypto/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../../Common/Common.h" +#include "../../../../src/LzmaAppleCommon.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/ICoder.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/ICoder.h new file mode 100644 index 0000000000..454240d9d1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/ICoder.h @@ -0,0 +1,371 @@ +// ICoder.h + +#ifndef __ICODER_H +#define __ICODER_H + +#include "IStream.h" + +#define CODER_INTERFACE(i, x) DECL_INTERFACE(i, 4, x) + +CODER_INTERFACE(ICompressProgressInfo, 0x04) +{ + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE; + + /* (inSize) can be NULL, if unknown + (outSize) can be NULL, if unknown + + returns: + S_OK + E_ABORT : Break by user + another error codes + */ +}; + +CODER_INTERFACE(ICompressCoder, 0x05) +{ + STDMETHOD(Code)(ISequentialInStream *inStream, ISequentialOutStream *outStream, + const UInt64 *inSize, const UInt64 *outSize, + ICompressProgressInfo *progress) PURE; +}; + +CODER_INTERFACE(ICompressCoder2, 0x18) +{ + STDMETHOD(Code)(ISequentialInStream * const *inStreams, const UInt64 * const *inSizes, UInt32 numInStreams, + ISequentialOutStream * const *outStreams, const UInt64 * const *outSizes, UInt32 numOutStreams, + ICompressProgressInfo *progress) PURE; +}; + +/* + ICompressCoder::Code + ICompressCoder2::Code + + returns: + S_OK : OK + S_FALSE : data error (for decoders) + E_OUTOFMEMORY : memory allocation error + another error code : some error. For example, it can be error code received from inStream or outStream function. + + Parameters: + (inStream != NULL) + (outStream != NULL) + + if (inSize != NULL) + { + Encoders in 7-Zip ignore (inSize). + Decoder can use (*inSize) to check that stream was decoded correctly. + Some decoder in 7-Zip check it, if (full_decoding mode was set via ICompressSetFinishMode) + } + + If it's required to limit the reading from input stream (inStream), it can + be done with ISequentialInStream implementation. + + if (outSize != NULL) + { + Encoders in 7-Zip ignore (outSize). + Decoder unpacks no more than (*outSize) bytes. + } + + (progress == NULL) is allowed. + + + Decoding with Code() function + ----------------------------- + + You can request some interfaces before decoding + - ICompressSetDecoderProperties2 + - ICompressSetFinishMode + + If you need to decode full stream: + { + 1) try to set full_decoding mode with ICompressSetFinishMode::SetFinishMode(1); + 2) call the Code() function with specified (inSize) and (outSize), if these sizes are known. + } + + If you need to decode only part of stream: + { + 1) try to set partial_decoding mode with ICompressSetFinishMode::SetFinishMode(0); + 2) Call the Code() function with specified (inSize = NULL) and specified (outSize). + } + + Encoding with Code() function + ----------------------------- + + You can request some interfaces : + - ICompressSetCoderProperties - use it before encoding to set properties + - ICompressWriteCoderProperties - use it before or after encoding to request encoded properties. + + ICompressCoder2 is used when (numInStreams != 1 || numOutStreams != 1) + The rules are similar to ICompressCoder rules +*/ + + +namespace NCoderPropID +{ + enum EEnum + { + kDefaultProp = 0, + kDictionarySize, + kUsedMemorySize, + kOrder, + kBlockSize, + kPosStateBits, + kLitContextBits, + kLitPosBits, + kNumFastBytes, + kMatchFinder, + kMatchFinderCycles, + kNumPasses, + kAlgorithm, + kNumThreads, + kEndMarker, + kLevel, + kReduceSize // estimated size of data that will be compressed. Encoder can use this value to reduce dictionary size. + }; +} + +CODER_INTERFACE(ICompressSetCoderProperties, 0x20) +{ + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps) PURE; +}; + +/* +CODER_INTERFACE(ICompressSetCoderProperties, 0x21) +{ + STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE; +}; +*/ + +CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22) +{ + /* returns: + S_OK + E_NOTIMP : unsupported properties + E_INVALIDARG : incorrect (or unsupported) properties + E_OUTOFMEMORY : memory allocation error + */ + STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICompressWriteCoderProperties, 0x23) +{ + STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStream) PURE; +}; + +CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24) +{ + STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE; +}; + +CODER_INTERFACE(ICompressSetCoderMt, 0x25) +{ + STDMETHOD(SetNumberOfThreads)(UInt32 numThreads) PURE; +}; + +CODER_INTERFACE(ICompressSetFinishMode, 0x26) +{ + STDMETHOD(SetFinishMode)(UInt32 finishMode) PURE; + + /* finishMode: + 0 : partial decoding is allowed. It's default mode for ICompressCoder::Code(), if (outSize) is defined. + 1 : full decoding. The stream must be finished at the end of decoding. */ +}; + + +CODER_INTERFACE(ICompressGetSubStreamSize, 0x30) +{ + STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE; + + /* returns: + S_OK : (*value) contains the size or estimated size (can be incorrect size) + S_FALSE : size is undefined + E_NOTIMP : the feature is not implemented + + Let's (read_size) is size of data that was already read by ISequentialInStream::Read(). + The caller should call GetSubStreamSize() after each Read() and check sizes: + if (start_of_subStream + *value < read_size) + { + // (*value) is correct, and it's allowed to call GetSubStreamSize() for next subStream: + start_of_subStream += *value; + subStream++; + } + */ +}; + +CODER_INTERFACE(ICompressSetInStream, 0x31) +{ + STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE; + STDMETHOD(ReleaseInStream)() PURE; +}; + +CODER_INTERFACE(ICompressSetOutStream, 0x32) +{ + STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE; + STDMETHOD(ReleaseOutStream)() PURE; +}; + +/* +CODER_INTERFACE(ICompressSetInStreamSize, 0x33) +{ + STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE; +}; +*/ + +CODER_INTERFACE(ICompressSetOutStreamSize, 0x34) +{ + STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE; + + /* That function initializes decoder structures. + Call this function only for stream version of decoder. + if (outSize == NULL), then output size is unknown + if (outSize != NULL), then the decoder must stop decoding after (*outSize) bytes. */ +}; + +CODER_INTERFACE(ICompressSetBufSize, 0x35) +{ + STDMETHOD(SetInBufSize)(UInt32 streamIndex, UInt32 size) PURE; + STDMETHOD(SetOutBufSize)(UInt32 streamIndex, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICompressInitEncoder, 0x36) +{ + STDMETHOD(InitEncoder)() PURE; + + /* That function initializes encoder structures. + Call this function only for stream version of encoder. */ +}; + +CODER_INTERFACE(ICompressSetInStream2, 0x37) +{ + STDMETHOD(SetInStream2)(UInt32 streamIndex, ISequentialInStream *inStream) PURE; + STDMETHOD(ReleaseInStream2)(UInt32 streamIndex) PURE; +}; + +/* +CODER_INTERFACE(ICompressSetOutStream2, 0x38) +{ + STDMETHOD(SetOutStream2)(UInt32 streamIndex, ISequentialOutStream *outStream) PURE; + STDMETHOD(ReleaseOutStream2)(UInt32 streamIndex) PURE; +}; + +CODER_INTERFACE(ICompressSetInStreamSize2, 0x39) +{ + STDMETHOD(SetInStreamSize2)(UInt32 streamIndex, const UInt64 *inSize) PURE; +}; +*/ + + +/* + ICompressFilter + Filter() converts as most as possible bytes + returns: (outSize): + if (outSize <= size) : Filter have converted outSize bytes + if (outSize > size) : Filter have not converted anything. + and it needs at least outSize bytes to convert one block + (it's for crypto block algorithms). +*/ + +#define INTERFACE_ICompressFilter(x) \ + STDMETHOD(Init)() x; \ + STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) x; \ + +CODER_INTERFACE(ICompressFilter, 0x40) +{ + INTERFACE_ICompressFilter(PURE); +}; + + +CODER_INTERFACE(ICompressCodecsInfo, 0x60) +{ + STDMETHOD(GetNumMethods)(UInt32 *numMethods) PURE; + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(CreateDecoder)(UInt32 index, const GUID *iid, void **coder) PURE; + STDMETHOD(CreateEncoder)(UInt32 index, const GUID *iid, void **coder) PURE; +}; + +CODER_INTERFACE(ISetCompressCodecsInfo, 0x61) +{ + STDMETHOD(SetCompressCodecsInfo)(ICompressCodecsInfo *compressCodecsInfo) PURE; +}; + +CODER_INTERFACE(ICryptoProperties, 0x80) +{ + STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE; + STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE; +}; + +/* +CODER_INTERFACE(ICryptoResetSalt, 0x88) +{ + STDMETHOD(ResetSalt)() PURE; +}; +*/ + +CODER_INTERFACE(ICryptoResetInitVector, 0x8C) +{ + STDMETHOD(ResetInitVector)() PURE; + + /* Call ResetInitVector() only for encoding. + Call ResetInitVector() before encoding and before WriteCoderProperties(). + Crypto encoder can create random IV in that function. */ +}; + +CODER_INTERFACE(ICryptoSetPassword, 0x90) +{ + STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE; +}; + +CODER_INTERFACE(ICryptoSetCRC, 0xA0) +{ + STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE; +}; + + +namespace NMethodPropID +{ + enum EEnum + { + kID, + kName, + kDecoder, + kEncoder, + kPackStreams, + kUnpackStreams, + kDescription, + kDecoderIsAssigned, + kEncoderIsAssigned, + kDigestSize + }; +} + + +#define INTERFACE_IHasher(x) \ + STDMETHOD_(void, Init)() throw() x; \ + STDMETHOD_(void, Update)(const void *data, UInt32 size) throw() x; \ + STDMETHOD_(void, Final)(Byte *digest) throw() x; \ + STDMETHOD_(UInt32, GetDigestSize)() throw() x; \ + +CODER_INTERFACE(IHasher, 0xC0) +{ + INTERFACE_IHasher(PURE) +}; + +CODER_INTERFACE(IHashers, 0xC1) +{ + STDMETHOD_(UInt32, GetNumHashers)() PURE; + STDMETHOD(GetHasherProp)(UInt32 index, PROPID propID, PROPVARIANT *value) PURE; + STDMETHOD(CreateHasher)(UInt32 index, IHasher **hasher) PURE; +}; + +extern "C" +{ + typedef HRESULT (WINAPI *Func_GetNumberOfMethods)(UInt32 *numMethods); + typedef HRESULT (WINAPI *Func_GetMethodProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); + typedef HRESULT (WINAPI *Func_CreateDecoder)(UInt32 index, const GUID *iid, void **outObject); + typedef HRESULT (WINAPI *Func_CreateEncoder)(UInt32 index, const GUID *iid, void **outObject); + + typedef HRESULT (WINAPI *Func_GetHashers)(IHashers **hashers); + + typedef HRESULT (WINAPI *Func_SetCodecs)(ICompressCodecsInfo *compressCodecsInfo); +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IDecl.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IDecl.h new file mode 100644 index 0000000000..5a34b0e441 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IDecl.h @@ -0,0 +1,28 @@ +// IDecl.h + +#ifndef __IDECL_H +#define __IDECL_H + +#include "../Common/MyUnknown.h" + +#define k_7zip_GUID_Data1 0x23170F69 +#define k_7zip_GUID_Data2 0x40C1 + +#define k_7zip_GUID_Data3_Common 0x278A + +#define k_7zip_GUID_Data3_Decoder 0x2790 +#define k_7zip_GUID_Data3_Encoder 0x2791 +#define k_7zip_GUID_Data3_Hasher 0x2792 + + +#define DECL_INTERFACE_SUB(i, base, groupId, subId) \ + DEFINE_GUID(IID_ ## i, \ + k_7zip_GUID_Data1, \ + k_7zip_GUID_Data2, \ + k_7zip_GUID_Data3_Common, \ + 0, 0, 0, (groupId), 0, (subId), 0, 0); \ + struct i: public base + +#define DECL_INTERFACE(i, groupId, subId) DECL_INTERFACE_SUB(i, IUnknown, groupId, subId) + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IPassword.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IPassword.h new file mode 100644 index 0000000000..e366007041 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IPassword.h @@ -0,0 +1,23 @@ +// IPassword.h + +#ifndef __IPASSWORD_H +#define __IPASSWORD_H + +#include "../Common/MyTypes.h" +#include "../Common/MyUnknown.h" + +#include "IDecl.h" + +#define PASSWORD_INTERFACE(i, x) DECL_INTERFACE(i, 5, x) + +PASSWORD_INTERFACE(ICryptoGetTextPassword, 0x10) +{ + STDMETHOD(CryptoGetTextPassword)(BSTR *password) PURE; +}; + +PASSWORD_INTERFACE(ICryptoGetTextPassword2, 0x11) +{ + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password) PURE; +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IProgress.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IProgress.h new file mode 100644 index 0000000000..d54529ca80 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IProgress.h @@ -0,0 +1,19 @@ +// IProgress.h + +#ifndef __IPROGRESS_H +#define __IPROGRESS_H + +#include "../Common/MyTypes.h" + +#include "IDecl.h" + +#define INTERFACE_IProgress(x) \ + STDMETHOD(SetTotal)(UInt64 total) x; \ + STDMETHOD(SetCompleted)(const UInt64 *completeValue) x; \ + +DECL_INTERFACE(IProgress, 0, 5) +{ + INTERFACE_IProgress(PURE) +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IStream.h new file mode 100644 index 0000000000..436e91987f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/IStream.h @@ -0,0 +1,127 @@ +// IStream.h + +#ifndef __ISTREAM_H +#define __ISTREAM_H + +#include "../Common/MyTypes.h" +#include "../Common/MyWindows.h" + +#include "IDecl.h" + +#define STREAM_INTERFACE_SUB(i, base, x) DECL_INTERFACE_SUB(i, base, 3, x) +#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x) + +STREAM_INTERFACE(ISequentialInStream, 0x01) +{ + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE; + + /* + The requirement for caller: (processedSize != NULL). + The callee can allow (processedSize == NULL) for compatibility reasons. + + if (size == 0), this function returns S_OK and (*processedSize) is set to 0. + + if (size != 0) + { + Partial read is allowed: (*processedSize <= avail_size && *processedSize <= size), + where (avail_size) is the size of remaining bytes in stream. + If (avail_size != 0), this function must read at least 1 byte: (*processedSize > 0). + You must call Read() in loop, if you need to read exact amount of data. + } + + If seek pointer before Read() call was changed to position past the end of stream: + if (seek_pointer >= stream_size), this function returns S_OK and (*processedSize) is set to 0. + + ERROR CASES: + If the function returns error code, then (*processedSize) is size of + data written to (data) buffer (it can be data before error or data with errors). + The recommended way for callee to work with reading errors: + 1) write part of data before error to (data) buffer and return S_OK. + 2) return error code for further calls of Read(). + */ +}; + +STREAM_INTERFACE(ISequentialOutStream, 0x02) +{ + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE; + + /* + The requirement for caller: (processedSize != NULL). + The callee can allow (processedSize == NULL) for compatibility reasons. + + if (size != 0) + { + Partial write is allowed: (*processedSize <= size), + but this function must write at least 1 byte: (*processedSize > 0). + You must call Write() in loop, if you need to write exact amount of data. + } + + ERROR CASES: + If the function returns error code, then (*processedSize) is size of + data written from (data) buffer. + */ +}; + +#ifdef __HRESULT_FROM_WIN32 +#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK) +#else +#define HRESULT_WIN32_ERROR_NEGATIVE_SEEK HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK) +#endif + +/* Seek() Function + If you seek before the beginning of the stream, Seek() function returns error code: + Recommended error code is __HRESULT_FROM_WIN32(ERROR_NEGATIVE_SEEK). + or STG_E_INVALIDFUNCTION + + It is allowed to seek past the end of the stream. + + + if Seek() returns error, then the value of *newPosition is undefined. +*/ + +STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; +}; + +STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04) +{ + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE; + STDMETHOD(SetSize)(UInt64 newSize) PURE; +}; + +STREAM_INTERFACE(IStreamGetSize, 0x06) +{ + STDMETHOD(GetSize)(UInt64 *size) PURE; +}; + +STREAM_INTERFACE(IOutStreamFinish, 0x07) +{ + STDMETHOD(OutStreamFinish)() PURE; +}; + + +STREAM_INTERFACE(IStreamGetProps, 0x08) +{ + STDMETHOD(GetProps)(UInt64 *size, FILETIME *cTime, FILETIME *aTime, FILETIME *mTime, UInt32 *attrib) PURE; +}; + +struct CStreamFileProps +{ + UInt64 Size; + UInt64 VolID; + UInt64 FileID_Low; + UInt64 FileID_High; + UInt32 NumLinks; + UInt32 Attrib; + FILETIME CTime; + FILETIME ATime; + FILETIME MTime; +}; + +STREAM_INTERFACE(IStreamGetProps2, 0x09) +{ + STDMETHOD(GetProps2)(CStreamFileProps *props) PURE; +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/MyVersion.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/MyVersion.h new file mode 100644 index 0000000000..0d50f94269 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/MyVersion.h @@ -0,0 +1,2 @@ +#define USE_COPYRIGHT_CR +#include "../../C/7zVersion.h" diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/7zip/PropID.h b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/PropID.h new file mode 100644 index 0000000000..126af67857 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/7zip/PropID.h @@ -0,0 +1,127 @@ +// PropID.h + +#ifndef __7ZIP_PROP_ID_H +#define __7ZIP_PROP_ID_H + +#include "../Common/MyTypes.h" + +enum +{ + kpidNoProperty = 0, + kpidMainSubfile, + kpidHandlerItemIndex, + kpidPath, + kpidName, + kpidExtension, + kpidIsDir, + kpidSize, + kpidPackSize, + kpidAttrib, + kpidCTime, + kpidATime, + kpidMTime, + kpidSolid, + kpidCommented, + kpidEncrypted, + kpidSplitBefore, + kpidSplitAfter, + kpidDictionarySize, + kpidCRC, + kpidType, + kpidIsAnti, + kpidMethod, + kpidHostOS, + kpidFileSystem, + kpidUser, + kpidGroup, + kpidBlock, + kpidComment, + kpidPosition, + kpidPrefix, + kpidNumSubDirs, + kpidNumSubFiles, + kpidUnpackVer, + kpidVolume, + kpidIsVolume, + kpidOffset, + kpidLinks, + kpidNumBlocks, + kpidNumVolumes, + kpidTimeType, + kpidBit64, + kpidBigEndian, + kpidCpu, + kpidPhySize, + kpidHeadersSize, + kpidChecksum, + kpidCharacts, + kpidVa, + kpidId, + kpidShortName, + kpidCreatorApp, + kpidSectorSize, + kpidPosixAttrib, + kpidSymLink, + kpidError, + kpidTotalSize, + kpidFreeSpace, + kpidClusterSize, + kpidVolumeName, + kpidLocalName, + kpidProvider, + kpidNtSecure, + kpidIsAltStream, + kpidIsAux, + kpidIsDeleted, + kpidIsTree, + kpidSha1, + kpidSha256, + kpidErrorType, + kpidNumErrors, + kpidErrorFlags, + kpidWarningFlags, + kpidWarning, + kpidNumStreams, + kpidNumAltStreams, + kpidAltStreamsSize, + kpidVirtualSize, + kpidUnpackSize, + kpidTotalPhySize, + kpidVolumeIndex, + kpidSubType, + kpidShortComment, + kpidCodePage, + kpidIsNotArcType, + kpidPhySizeCantBeDetected, + kpidZerosTailIsAllowed, + kpidTailSize, + kpidEmbeddedStubSize, + kpidNtReparse, + kpidHardLink, + kpidINode, + kpidStreamId, + kpidReadOnly, + kpidOutName, + kpidCopyLink, + + kpid_NUM_DEFINED, + + kpidUserDefined = 0x10000 +}; + +extern const Byte k7z_PROPID_To_VARTYPE[kpid_NUM_DEFINED]; // VARTYPE + +const UInt32 kpv_ErrorFlags_IsNotArc = 1 << 0; +const UInt32 kpv_ErrorFlags_HeadersError = 1 << 1; +const UInt32 kpv_ErrorFlags_EncryptedHeadersError = 1 << 2; +const UInt32 kpv_ErrorFlags_UnavailableStart = 1 << 3; +const UInt32 kpv_ErrorFlags_UnconfirmedStart = 1 << 4; +const UInt32 kpv_ErrorFlags_UnexpectedEnd = 1 << 5; +const UInt32 kpv_ErrorFlags_DataAfterEnd = 1 << 6; +const UInt32 kpv_ErrorFlags_UnsupportedMethod = 1 << 7; +const UInt32 kpv_ErrorFlags_UnsupportedFeature = 1 << 8; +const UInt32 kpv_ErrorFlags_DataError = 1 << 9; +const UInt32 kpv_ErrorFlags_CrcError = 1 << 10; +// const UInt32 kpv_ErrorFlags_Unsupported = 1 << 11; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/AutoPtr.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/AutoPtr.h new file mode 100644 index 0000000000..e53fb7f5d5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/AutoPtr.h @@ -0,0 +1,35 @@ +// Common/AutoPtr.h + +#ifndef __COMMON_AUTOPTR_H +#define __COMMON_AUTOPTR_H + +template class CMyAutoPtr +{ + T *_p; +public: + CMyAutoPtr(T *p = 0) : _p(p) {} + CMyAutoPtr(CMyAutoPtr& p): _p(p.release()) {} + CMyAutoPtr& operator=(CMyAutoPtr& p) + { + reset(p.release()); + return (*this); + } + ~CMyAutoPtr() { delete _p; } + T& operator*() const { return *_p; } + // T* operator->() const { return (&**this); } + T* get() const { return _p; } + T* release() + { + T *tmp = _p; + _p = 0; + return tmp; + } + void reset(T* p = 0) + { + if (p != _p) + delete _p; + _p = p; + } +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/CRC.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CRC.cpp new file mode 100644 index 0000000000..6ac52c4c12 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CRC.cpp @@ -0,0 +1,7 @@ +// Common/CRC.cpp + +#include "StdAfx.h" + +#include "../../C/7zCrc.h" + +struct CCRCTableInit { CCRCTableInit() { CrcGenerateTable(); } } g_CRCTableInit; diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/C_FileIO.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/C_FileIO.cpp new file mode 100644 index 0000000000..d68a427793 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/C_FileIO.cpp @@ -0,0 +1,92 @@ +// Common/C_FileIO.cpp + +#include "C_FileIO.h" + +#include +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace NC { +namespace NFile { +namespace NIO { + +bool CFileBase::OpenBinary(const char *name, int flags) +{ + #ifdef O_BINARY + flags |= O_BINARY; + #endif + Close(); + _handle = ::open(name, flags, 0666); + return _handle != -1; +} + +bool CFileBase::Close() +{ + if (_handle == -1) + return true; + if (close(_handle) != 0) + return false; + _handle = -1; + return true; +} + +bool CFileBase::GetLength(UInt64 &length) const +{ + off_t curPos = Seek(0, SEEK_CUR); + off_t lengthTemp = Seek(0, SEEK_END); + Seek(curPos, SEEK_SET); + length = (UInt64)lengthTemp; + return true; +} + +off_t CFileBase::Seek(off_t distanceToMove, int moveMethod) const +{ + return ::lseek(_handle, distanceToMove, moveMethod); +} + +///////////////////////// +// CInFile + +bool CInFile::Open(const char *name) +{ + return CFileBase::OpenBinary(name, O_RDONLY); +} + +bool CInFile::OpenShared(const char *name, bool) +{ + return Open(name); +} + +ssize_t CInFile::Read(void *data, size_t size) +{ + return read(_handle, data, size); +} + +///////////////////////// +// COutFile + +bool COutFile::Create(const char *name, bool createAlways) +{ + if (createAlways) + { + Close(); + _handle = ::creat(name, 0666); + return _handle != -1; + } + return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY); +} + +bool COutFile::Open(const char *name, DWORD creationDisposition) +{ + return Create(name, false); +} + +ssize_t COutFile::Write(const void *data, size_t size) +{ + return write(_handle, data, size); +} + +}}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/C_FileIO.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/C_FileIO.h new file mode 100644 index 0000000000..4c400b41f2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/C_FileIO.h @@ -0,0 +1,53 @@ +// Common/C_FileIO.h + +#ifndef __COMMON_C_FILEIO_H +#define __COMMON_C_FILEIO_H + +#include +#include + +#include "MyTypes.h" +#include "MyWindows.h" + +#ifdef _WIN32 +#ifdef _MSC_VER +typedef size_t ssize_t; +#endif +#endif + +namespace NC { +namespace NFile { +namespace NIO { + +class CFileBase +{ +protected: + int _handle; + bool OpenBinary(const char *name, int flags); +public: + CFileBase(): _handle(-1) {}; + ~CFileBase() { Close(); } + bool Close(); + bool GetLength(UInt64 &length) const; + off_t Seek(off_t distanceToMove, int moveMethod) const; +}; + +class CInFile: public CFileBase +{ +public: + bool Open(const char *name); + bool OpenShared(const char *name, bool shareForWrite); + ssize_t Read(void *data, size_t size); +}; + +class COutFile: public CFileBase +{ +public: + bool Create(const char *name, bool createAlways); + bool Open(const char *name, DWORD creationDisposition); + ssize_t Write(const void *data, size_t size); +}; + +}}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/ComTry.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/ComTry.h new file mode 100644 index 0000000000..b2b3029bce --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/ComTry.h @@ -0,0 +1,17 @@ +// ComTry.h + +#ifndef __COM_TRY_H +#define __COM_TRY_H + +#include "MyWindows.h" +// #include "Exception.h" +// #include "NewHandler.h" + +#define COM_TRY_BEGIN try { +#define COM_TRY_END } catch(...) { return E_OUTOFMEMORY; } + + // catch(const CNewException &) { return E_OUTOFMEMORY; } + // catch(const CSystemException &e) { return e.ErrorCode; } + // catch(...) { return E_FAIL; } + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/CommandLineParser.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CommandLineParser.cpp new file mode 100644 index 0000000000..42edd8d37a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CommandLineParser.cpp @@ -0,0 +1,203 @@ +// CommandLineParser.cpp + +#include "StdAfx.h" + +#include "CommandLineParser.h" + +static bool IsString1PrefixedByString2_NoCase(const wchar_t *u, const char *a) +{ + for (;;) + { + char c = *a; + if (c == 0) + return true; + if ((unsigned char)MyCharLower_Ascii(c) != MyCharLower_Ascii(*u)) + return false; + a++; + u++; + } +} + +namespace NCommandLineParser { + +bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2) +{ + dest1.Empty(); + dest2.Empty(); + bool quoteMode = false; + unsigned i; + for (i = 0; i < src.Len(); i++) + { + wchar_t c = src[i]; + if ((c == L' ' || c == L'\t') && !quoteMode) + { + dest2 = src.Ptr(i + 1); + return i != 0; + } + if (c == L'\"') + quoteMode = !quoteMode; + else + dest1 += c; + } + return i != 0; +} + +void SplitCommandLine(const UString &s, UStringVector &parts) +{ + UString sTemp = s; + sTemp.Trim(); + parts.Clear(); + for (;;) + { + UString s1, s2; + if (SplitCommandLine(sTemp, s1, s2)) + parts.Add(s1); + if (s2.IsEmpty()) + break; + sTemp = s2; + } +} + + +static const char *kStopSwitchParsing = "--"; + +static bool inline IsItSwitchChar(wchar_t c) +{ + return (c == '-'); +} + +CParser::CParser(unsigned numSwitches): + _numSwitches(numSwitches), + _switches(0) +{ + _switches = new CSwitchResult[numSwitches]; +} + +CParser::~CParser() +{ + delete []_switches; +} + + +// if (s) contains switch then function updates switch structures +// out: true, if (s) is a switch +bool CParser::ParseString(const UString &s, const CSwitchForm *switchForms) +{ + if (s.IsEmpty() || !IsItSwitchChar(s[0])) + return false; + + unsigned pos = 1; + unsigned switchIndex = 0; + int maxLen = -1; + + for (unsigned i = 0; i < _numSwitches; i++) + { + const char *key = switchForms[i].Key; + unsigned switchLen = MyStringLen(key); + if ((int)switchLen <= maxLen || pos + switchLen > s.Len()) + continue; + if (IsString1PrefixedByString2_NoCase((const wchar_t *)s + pos, key)) + { + switchIndex = i; + maxLen = switchLen; + } + } + + if (maxLen < 0) + { + ErrorMessage = "Unknown switch:"; + return false; + } + + pos += maxLen; + + CSwitchResult &sw = _switches[switchIndex]; + const CSwitchForm &form = switchForms[switchIndex]; + + if (!form.Multi && sw.ThereIs) + { + ErrorMessage = "Multiple instances for switch:"; + return false; + } + + sw.ThereIs = true; + + int rem = s.Len() - pos; + if (rem < form.MinLen) + { + ErrorMessage = "Too short switch:"; + return false; + } + + sw.WithMinus = false; + sw.PostCharIndex = -1; + + switch (form.Type) + { + case NSwitchType::kMinus: + if (rem == 1) + { + sw.WithMinus = (s[pos] == '-'); + if (sw.WithMinus) + return true; + ErrorMessage = "Incorrect switch postfix:"; + return false; + } + break; + + case NSwitchType::kChar: + if (rem == 1) + { + wchar_t c = s[pos]; + if (c <= 0x7F) + { + sw.PostCharIndex = FindCharPosInString(form.PostCharSet, (char)c); + if (sw.PostCharIndex >= 0) + return true; + } + ErrorMessage = "Incorrect switch postfix:"; + return false; + } + break; + + case NSwitchType::kString: + sw.PostStrings.Add((const wchar_t *)s + pos); + return true; + } + + if (pos != s.Len()) + { + ErrorMessage = "Too long switch:"; + return false; + } + return true; +} + +bool CParser::ParseStrings(const CSwitchForm *switchForms, const UStringVector &commandStrings) +{ + ErrorLine.Empty(); + bool stopSwitch = false; + FOR_VECTOR (i, commandStrings) + { + const UString &s = commandStrings[i]; + if (!stopSwitch) + { + if (s.IsEqualTo(kStopSwitchParsing)) + { + stopSwitch = true; + continue; + } + if (!s.IsEmpty() && IsItSwitchChar(s[0])) + { + if (ParseString(s, switchForms)) + continue; + ErrorLine = s; + return false; + } + } + NonSwitchStrings.Add(s); + } + return true; +} + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/CommandLineParser.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CommandLineParser.h new file mode 100644 index 0000000000..446619c25f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CommandLineParser.h @@ -0,0 +1,63 @@ +// Common/CommandLineParser.h + +#ifndef __COMMON_COMMAND_LINE_PARSER_H +#define __COMMON_COMMAND_LINE_PARSER_H + +#include "MyString.h" + +namespace NCommandLineParser { + +bool SplitCommandLine(const UString &src, UString &dest1, UString &dest2); +void SplitCommandLine(const UString &s, UStringVector &parts); + +namespace NSwitchType +{ + enum EEnum + { + kSimple, + kMinus, + kString, + kChar + }; +} + +struct CSwitchForm +{ + const char *Key; + Byte Type; + bool Multi; + Byte MinLen; + // int MaxLen; + const char *PostCharSet; +}; + +struct CSwitchResult +{ + bool ThereIs; + bool WithMinus; + int PostCharIndex; + UStringVector PostStrings; + + CSwitchResult(): ThereIs(false) {}; +}; + +class CParser +{ + unsigned _numSwitches; + CSwitchResult *_switches; + + bool ParseString(const UString &s, const CSwitchForm *switchForms); +public: + UStringVector NonSwitchStrings; + AString ErrorMessage; + UString ErrorLine; + + CParser(unsigned numSwitches); + ~CParser(); + bool ParseStrings(const CSwitchForm *switchForms, const UStringVector &commandStrings); + const CSwitchResult& operator[](size_t index) const { return _switches[index]; } +}; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/Common.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Common.h new file mode 100644 index 0000000000..47f728660d --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Common.h @@ -0,0 +1,15 @@ +// Common.h + +#ifndef __COMMON_COMMON_H +#define __COMMON_COMMON_H + +#include "../../C/Compiler.h" + +#include "MyWindows.h" +#include "NewHandler.h" + +#include "../../../src/LzmaAppleCommon.h" + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[1])) + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/CrcReg.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CrcReg.cpp new file mode 100644 index 0000000000..1d9d009038 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/CrcReg.cpp @@ -0,0 +1,98 @@ +// CrcReg.cpp + +#include "StdAfx.h" + +#include "../../C/7zCrc.h" +#include "../../C/CpuArch.h" + +#include "../Common/MyCom.h" + +#include "../7zip/Common/RegisterCodec.h" + +EXTERN_C_BEGIN + +typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table); + +UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table); + +extern CRC_FUNC g_CrcUpdate; +extern CRC_FUNC g_CrcUpdateT8; +extern CRC_FUNC g_CrcUpdateT4; + +EXTERN_C_END + +class CCrcHasher: + public IHasher, + public ICompressSetCoderProperties, + public CMyUnknownImp +{ + UInt32 _crc; + CRC_FUNC _updateFunc; + Byte mtDummy[1 << 7]; + + bool SetFunctions(UInt32 tSize); +public: + CCrcHasher(): _crc(CRC_INIT_VAL) { SetFunctions(0); } + + MY_UNKNOWN_IMP2(IHasher, ICompressSetCoderProperties) + INTERFACE_IHasher(;) + STDMETHOD(SetCoderProperties)(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps); +}; + +bool CCrcHasher::SetFunctions(UInt32 tSize) +{ + _updateFunc = g_CrcUpdate; + + if (tSize == 1) + _updateFunc = CrcUpdateT1; + else if (tSize == 4) + { + if (g_CrcUpdateT4) + _updateFunc = g_CrcUpdateT4; + else + return false; + } + else if (tSize == 8) + { + if (g_CrcUpdateT8) + _updateFunc = g_CrcUpdateT8; + else + return false; + } + + return true; +} + +STDMETHODIMP CCrcHasher::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *coderProps, UInt32 numProps) +{ + for (UInt32 i = 0; i < numProps; i++) + { + const PROPVARIANT &prop = coderProps[i]; + if (propIDs[i] == NCoderPropID::kDefaultProp) + { + if (prop.vt != VT_UI4) + return E_INVALIDARG; + if (!SetFunctions(prop.ulVal)) + return E_NOTIMPL; + } + } + return S_OK; +} + +STDMETHODIMP_(void) CCrcHasher::Init() throw() +{ + _crc = CRC_INIT_VAL; +} + +STDMETHODIMP_(void) CCrcHasher::Update(const void *data, UInt32 size) throw() +{ + _crc = _updateFunc(_crc, data, size, g_CrcTable); +} + +STDMETHODIMP_(void) CCrcHasher::Final(Byte *digest) throw() +{ + UInt32 val = CRC_GET_DIGEST(_crc); + SetUi32(digest, val); +} + +REGISTER_HASHER(CCrcHasher, 0x1, "CRC32", 4) diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/Defs.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Defs.h new file mode 100644 index 0000000000..9416098132 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Defs.h @@ -0,0 +1,15 @@ +// Common/Defs.h + +#ifndef __COMMON_DEFS_H +#define __COMMON_DEFS_H + +template inline T MyMin(T a, T b) { return a < b ? a : b; } +template inline T MyMax(T a, T b) { return a > b ? a : b; } + +template inline int MyCompare(T a, T b) + { return a == b ? 0 : (a < b ? -1 : 1); } + +inline int BoolToInt(bool v) { return (v ? 1 : 0); } +inline bool IntToBool(int v) { return (v != 0); } + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/DynamicBuffer.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/DynamicBuffer.h new file mode 100644 index 0000000000..16c925010e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/DynamicBuffer.h @@ -0,0 +1,64 @@ +// Common/DynamicBuffer.h + +#ifndef __COMMON_DYNAMIC_BUFFER_H +#define __COMMON_DYNAMIC_BUFFER_H + +template class CDynamicBuffer +{ + T *_items; + size_t _size; + size_t _pos; + + CDynamicBuffer(const CDynamicBuffer &buffer); + void operator=(const CDynamicBuffer &buffer); + + void Grow(size_t size) + { + size_t delta = _size >= 64 ? _size : 64; + if (delta < size) + delta = size; + size_t newCap = _size + delta; + if (newCap < delta) + { + newCap = _size + size; + if (newCap < size) + throw 20120116; + } + + T *newBuffer = new T[newCap]; + if (_pos != 0) + memcpy(newBuffer, _items, _pos * sizeof(T)); + delete []_items; + _items = newBuffer; + _size = newCap; + } + +public: + CDynamicBuffer(): _items(0), _size(0), _pos(0) {} + // operator T *() { return _items; } + operator const T *() const { return _items; } + ~CDynamicBuffer() { delete []_items; } + + T *GetCurPtrAndGrow(size_t addSize) + { + size_t rem = _size - _pos; + if (rem < addSize) + Grow(addSize - rem); + T *res = _items + _pos; + _pos += addSize; + return res; + } + + void AddData(const T *data, size_t size) + { + memcpy(GetCurPtrAndGrow(size), data, size * sizeof(T)); + } + + const size_t GetPos() const { return _pos; } + + // void Empty() { _pos = 0; } +}; + +typedef CDynamicBuffer CByteDynamicBuffer; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/IntToString.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/IntToString.cpp new file mode 100644 index 0000000000..d0351154cd --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/IntToString.cpp @@ -0,0 +1,146 @@ +// Common/IntToString.cpp + +#include "StdAfx.h" + +#include "IntToString.h" + +#define CONVERT_INT_TO_STR(charType, tempSize) \ + unsigned char temp[tempSize]; unsigned i = 0; \ + while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ + *s++ = (charType)('0' + (unsigned)val); \ + while (i != 0) { i--; *s++ = temp[i]; } \ + *s = 0; + +void ConvertUInt32ToString(UInt32 val, char *s) throw() +{ + CONVERT_INT_TO_STR(char, 16); +} + +void ConvertUInt64ToString(UInt64 val, char *s) throw() +{ + if (val <= (UInt32)0xFFFFFFFF) + { + ConvertUInt32ToString((UInt32)val, s); + return; + } + CONVERT_INT_TO_STR(char, 24); +} + +void ConvertUInt64ToOct(UInt64 val, char *s) throw() +{ + UInt64 v = val; + unsigned i; + for (i = 1;; i++) + { + v >>= 3; + if (v == 0) + break; + } + s[i] = 0; + do + { + unsigned t = (unsigned)(val & 0x7); + val >>= 3; + s[--i] = (char)('0' + t); + } + while (i); +} + +void ConvertUInt32ToHex(UInt32 val, char *s) throw() +{ + UInt32 v = val; + unsigned i; + for (i = 1;; i++) + { + v >>= 4; + if (v == 0) + break; + } + s[i] = 0; + do + { + unsigned t = (unsigned)((val & 0xF)); + val >>= 4; + s[--i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10))); + } + while (i); +} + +void ConvertUInt64ToHex(UInt64 val, char *s) throw() +{ + UInt64 v = val; + unsigned i; + for (i = 1;; i++) + { + v >>= 4; + if (v == 0) + break; + } + s[i] = 0; + do + { + unsigned t = (unsigned)((val & 0xF)); + val >>= 4; + s[--i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10))); + } + while (i); +} + +void ConvertUInt32ToHex8Digits(UInt32 val, char *s) throw() +{ + s[8] = 0; + for (int i = 7; i >= 0; i--) + { + unsigned t = val & 0xF; + val >>= 4; + s[i] = (char)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))); + } +} + +/* +void ConvertUInt32ToHex8Digits(UInt32 val, wchar_t *s) +{ + s[8] = 0; + for (int i = 7; i >= 0; i--) + { + unsigned t = val & 0xF; + val >>= 4; + s[i] = (wchar_t)(((t < 10) ? ('0' + t) : ('A' + (t - 10)))); + } +} +*/ + +void ConvertUInt32ToString(UInt32 val, wchar_t *s) throw() +{ + CONVERT_INT_TO_STR(wchar_t, 16); +} + +void ConvertUInt64ToString(UInt64 val, wchar_t *s) throw() +{ + if (val <= (UInt32)0xFFFFFFFF) + { + ConvertUInt32ToString((UInt32)val, s); + return; + } + CONVERT_INT_TO_STR(wchar_t, 24); +} + +void ConvertInt64ToString(Int64 val, char *s) throw() +{ + if (val < 0) + { + *s++ = '-'; + val = -val; + } + ConvertUInt64ToString(val, s); +} + +void ConvertInt64ToString(Int64 val, wchar_t *s) throw() +{ + if (val < 0) + { + *s++ = L'-'; + val = -val; + } + ConvertUInt64ToString(val, s); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/IntToString.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/IntToString.h new file mode 100644 index 0000000000..77509340e8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/IntToString.h @@ -0,0 +1,24 @@ +// Common/IntToString.h + +#ifndef __COMMON_INT_TO_STRING_H +#define __COMMON_INT_TO_STRING_H + +#include "MyTypes.h" + +void ConvertUInt32ToString(UInt32 value, char *s) throw(); +void ConvertUInt64ToString(UInt64 value, char *s) throw(); + +void ConvertUInt32ToString(UInt32 value, wchar_t *s) throw(); +void ConvertUInt64ToString(UInt64 value, wchar_t *s) throw(); + +void ConvertUInt64ToOct(UInt64 value, char *s) throw(); + +void ConvertUInt32ToHex(UInt32 value, char *s) throw(); +void ConvertUInt64ToHex(UInt64 value, char *s) throw(); +void ConvertUInt32ToHex8Digits(UInt32 value, char *s) throw(); +// void ConvertUInt32ToHex8Digits(UInt32 value, wchar_t *s) throw(); + +void ConvertInt64ToString(Int64 value, char *s) throw(); +void ConvertInt64ToString(Int64 value, wchar_t *s) throw(); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/ListFileUtils.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/ListFileUtils.cpp new file mode 100644 index 0000000000..b4b84cff6a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/ListFileUtils.cpp @@ -0,0 +1,117 @@ +// Common/ListFileUtils.cpp + +#include "StdAfx.h" + +#include "../../C/CpuArch.h" + +#include "../Windows/FileIO.h" + +#include "ListFileUtils.h" +#include "MyBuffer.h" +#include "StringConvert.h" +#include "UTFConvert.h" + +static const char kQuoteChar = '\"'; + +static void AddName(UStringVector &strings, UString &s) +{ + s.Trim(); + if (s.Len() >= 2 && s[0] == kQuoteChar && s.Back() == kQuoteChar) + { + s.DeleteBack(); + s.Delete(0); + } + if (!s.IsEmpty()) + strings.Add(s); +} + +bool ReadNamesFromListFile(CFSTR fileName, UStringVector &strings, UINT codePage) +{ + NWindows::NFile::NIO::CInFile file; + if (!file.Open(fileName)) + return false; + UInt64 fileSize; + if (!file.GetLength(fileSize)) + return false; + if (fileSize >= ((UInt32)1 << 31) - 32) + return false; + UString u; + if (codePage == MY__CP_UTF16 || codePage == MY__CP_UTF16BE) + { + if ((fileSize & 1) != 0) + return false; + CByteArr buf((size_t)fileSize); + UInt32 processed; + if (!file.Read(buf, (UInt32)fileSize, processed)) + return false; + if (processed != fileSize) + return false; + file.Close(); + unsigned num = (unsigned)fileSize / 2; + wchar_t *p = u.GetBuf(num); + if (codePage == MY__CP_UTF16) + for (unsigned i = 0; i < num; i++) + { + wchar_t c = GetUi16(buf + i * 2); + if (c == 0) + return false; + p[i] = c; + } + else + for (unsigned i = 0; i < num; i++) + { + wchar_t c = (wchar_t)GetBe16(buf + i * 2); + if (c == 0) + return false; + p[i] = c; + } + p[num] = 0; + u.ReleaseBuf_SetLen(num); + } + else + { + AString s; + char *p = s.GetBuf((unsigned)fileSize); + UInt32 processed; + if (!file.Read(p, (UInt32)fileSize, processed)) + return false; + if (processed != fileSize) + return false; + file.Close(); + s.ReleaseBuf_CalcLen((unsigned)processed); + if (s.Len() != processed) + return false; + + // #ifdef CP_UTF8 + if (codePage == CP_UTF8) + { + if (!ConvertUTF8ToUnicode(s, u)) + return false; + } + else + // #endif + MultiByteToUnicodeString2(u, s, codePage); + } + + const wchar_t kGoodBOM = 0xFEFF; + const wchar_t kBadBOM = 0xFFFE; + + UString s; + unsigned i = 0; + for (; i < u.Len() && u[i] == kGoodBOM; i++); + for (; i < u.Len(); i++) + { + wchar_t c = u[i]; + if (c == kGoodBOM || c == kBadBOM) + return false; + if (c == L'\n' || c == 0xD) + { + AddName(strings, s); + s.Empty(); + } + else + s += c; + } + AddName(strings, s); + return true; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/ListFileUtils.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/ListFileUtils.h new file mode 100644 index 0000000000..ec32d8e048 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/ListFileUtils.h @@ -0,0 +1,14 @@ +// Common/ListFileUtils.h + +#ifndef __COMMON_LIST_FILE_UTILS_H +#define __COMMON_LIST_FILE_UTILS_H + +#include "MyString.h" +#include "MyTypes.h" + +#define MY__CP_UTF16 1200 +#define MY__CP_UTF16BE 1201 + +bool ReadNamesFromListFile(CFSTR fileName, UStringVector &strings, UINT codePage = CP_OEMCP); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyBuffer.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyBuffer.h new file mode 100644 index 0000000000..2b5e9462f1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyBuffer.h @@ -0,0 +1,244 @@ +// Common/MyBuffer.h + +#ifndef __COMMON_MY_BUFFER_H +#define __COMMON_MY_BUFFER_H + +#include "Defs.h" + +template class CBuffer +{ + T *_items; + size_t _size; + +public: + void Free() + { + if (_items) + { + delete []_items; + _items = 0; + } + _size = 0; + } + + CBuffer(): _items(0), _size(0) {}; + CBuffer(size_t size): _items(0), _size(0) { _items = new T[size]; _size = size; } + CBuffer(const CBuffer &buffer): _items(0), _size(0) + { + size_t size = buffer._size; + if (size != 0) + { + _items = new T[size]; + memcpy(_items, buffer._items, size * sizeof(T)); + _size = size; + } + } + + ~CBuffer() { delete []_items; } + + operator T *() { return _items; } + operator const T *() const { return _items; } + size_t Size() const { return _size; } + + void Alloc(size_t size) + { + if (size != _size) + { + Free(); + if (size != 0) + { + _items = new T[size]; + _size = size; + } + } + } + + void AllocAtLeast(size_t size) + { + if (size > _size) + { + Free(); + _items = new T[size]; + _size = size; + } + } + + void CopyFrom(const T *data, size_t size) + { + Alloc(size); + if (size != 0) + memcpy(_items, data, size * sizeof(T)); + } + + void ChangeSize_KeepData(size_t newSize, size_t keepSize) + { + if (newSize == _size) + return; + T *newBuffer = NULL; + if (newSize != 0) + { + newBuffer = new T[newSize]; + if (keepSize > _size) + keepSize = _size; + if (keepSize != 0) + memcpy(newBuffer, _items, MyMin(keepSize, newSize) * sizeof(T)); + } + delete []_items; + _items = newBuffer; + _size = newSize; + } + + CBuffer& operator=(const CBuffer &buffer) + { + if (&buffer != this) + CopyFrom(buffer, buffer._size); + return *this; + } +}; + +template +bool operator==(const CBuffer& b1, const CBuffer& b2) +{ + size_t size1 = b1.Size(); + if (size1 != b2.Size()) + return false; + if (size1 == 0) + return true; + return memcmp(b1, b2, size1 * sizeof(T)) == 0; +} + +template +bool operator!=(const CBuffer& b1, const CBuffer& b2) +{ + size_t size1 = b1.Size(); + if (size1 != b2.Size()) + return true; + if (size1 == 0) + return false; + return memcmp(b1, b2, size1 * sizeof(T)) != 0; +} + + +typedef CBuffer CCharBuffer; +// typedef CBuffer CWCharBuffer; +typedef CBuffer CByteBuffer; + + +template class CObjArray +{ +protected: + T *_items; +private: + // we disable constructors + CObjArray(const CObjArray &buffer); + void operator=(const CObjArray &buffer); +public: + void Free() + { + delete []_items; + _items = 0; + } + CObjArray(size_t size): _items(0) { if (size != 0) _items = new T[size]; } + CObjArray(): _items(0) {}; + ~CObjArray() { delete []_items; } + + operator T *() { return _items; } + operator const T *() const { return _items; } + + void Alloc(size_t newSize) + { + delete []_items; + _items = 0; + _items = new T[newSize]; + } +}; + +typedef CObjArray CByteArr; +typedef CObjArray CBoolArr; +typedef CObjArray CIntArr; +typedef CObjArray CUIntArr; + + +template class CObjArray2 +{ + T *_items; + unsigned _size; + + CObjArray2(const CObjArray2 &buffer); + void operator=(const CObjArray2 &buffer); +public: + + void Free() + { + delete []_items; + _items = 0; + _size = 0; + } + CObjArray2(): _items(0), _size(0) {}; + /* + CObjArray2(const CObjArray2 &buffer): _items(0), _size(0) + { + size_t newSize = buffer._size; + if (newSize != 0) + { + T *newBuffer = new T[newSize];; + _items = newBuffer; + _size = newSize; + const T *src = buffer; + for (size_t i = 0; i < newSize; i++) + newBuffer[i] = src[i]; + } + } + */ + /* + CObjArray2(size_t size): _items(0), _size(0) + { + if (size != 0) + { + _items = new T[size]; + _size = size; + } + } + */ + + ~CObjArray2() { delete []_items; } + + operator T *() { return _items; } + operator const T *() const { return _items; } + + unsigned Size() const { return (unsigned)_size; } + bool IsEmpty() const { return _size == 0; } + + // SetSize doesn't keep old items. It allocates new array if size is not equal + void SetSize(unsigned size) + { + if (size == _size) + return; + T *newBuffer = NULL; + if (size != 0) + newBuffer = new T[size]; + delete []_items; + _items = newBuffer; + _size = size; + } + + /* + CObjArray2& operator=(const CObjArray2 &buffer) + { + Free(); + size_t newSize = buffer._size; + if (newSize != 0) + { + T *newBuffer = new T[newSize];; + _items = newBuffer; + _size = newSize; + const T *src = buffer; + for (size_t i = 0; i < newSize; i++) + newBuffer[i] = src[i]; + } + return *this; + } + */ +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyCom.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyCom.h new file mode 100644 index 0000000000..3e3f8cef20 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyCom.h @@ -0,0 +1,262 @@ +// MyCom.h + +#ifndef __MY_COM_H +#define __MY_COM_H + +#include "MyWindows.h" +#include "NewHandler.h" + +#ifndef RINOK +#define RINOK(x) { HRESULT __result_ = (x); if (__result_ != S_OK) return __result_; } +#endif + +template +class CMyComPtr +{ + T* _p; +public: + CMyComPtr(): _p(NULL) {} + CMyComPtr(T* p) throw() { if ((_p = p) != NULL) p->AddRef(); } + CMyComPtr(const CMyComPtr& lp) throw() { if ((_p = lp._p) != NULL) _p->AddRef(); } + ~CMyComPtr() { if (_p) _p->Release(); } + void Release() { if (_p) { _p->Release(); _p = NULL; } } + operator T*() const { return (T*)_p; } + // T& operator*() const { return *_p; } + T** operator&() { return &_p; } + T* operator->() const { return _p; } + T* operator=(T* p) + { + if (p) + p->AddRef(); + if (_p) + _p->Release(); + _p = p; + return p; + } + T* operator=(const CMyComPtr& lp) { return (*this = lp._p); } + bool operator!() const { return (_p == NULL); } + // bool operator==(T* pT) const { return _p == pT; } + void Attach(T* p2) + { + Release(); + _p = p2; + } + T* Detach() + { + T* pt = _p; + _p = NULL; + return pt; + } + #ifdef _WIN32 + HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p); + } + #endif + /* + HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) + { + CLSID clsid; + HRESULT hr = CLSIDFromProgID(szProgID, &clsid); + ATLASSERT(_p == NULL); + if (SUCCEEDED(hr)) + hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p); + return hr; + } + */ + template + HRESULT QueryInterface(REFGUID iid, Q** pp) const throw() + { + return _p->QueryInterface(iid, (void**)pp); + } +}; + +////////////////////////////////////////////////////////// + +inline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr) +{ + *bstr = ::SysAllocString(src); + return (*bstr) ? S_OK : E_OUTOFMEMORY; +} + +class CMyComBSTR +{ + BSTR m_str; + +public: + CMyComBSTR(): m_str(NULL) {} + ~CMyComBSTR() { ::SysFreeString(m_str); } + BSTR* operator&() { return &m_str; } + operator LPCOLESTR() const { return m_str; } + // operator bool() const { return m_str != NULL; } + // bool operator!() const { return m_str == NULL; } +private: + // operator BSTR() const { return m_str; } + + CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); } + // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); } + // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize); } + CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); } + + /* + CMyComBSTR(REFGUID src) + { + LPOLESTR szGuid; + StringFromCLSID(src, &szGuid); + m_str = ::SysAllocString(szGuid); + CoTaskMemFree(szGuid); + } + */ + + CMyComBSTR& operator=(const CMyComBSTR& src) + { + if (m_str != src.m_str) + { + if (m_str) + ::SysFreeString(m_str); + m_str = src.MyCopy(); + } + return *this; + } + + CMyComBSTR& operator=(LPCOLESTR src) + { + ::SysFreeString(m_str); + m_str = ::SysAllocString(src); + return *this; + } + + unsigned Len() const { return ::SysStringLen(m_str); } + + BSTR MyCopy() const + { + // We don't support Byte BSTRs here + return ::SysAllocStringLen(m_str, ::SysStringLen(m_str)); + /* + UINT byteLen = ::SysStringByteLen(m_str); + BSTR res = ::SysAllocStringByteLen(NULL, byteLen); + if (res && byteLen != 0 && m_str) + memcpy(res, m_str, byteLen); + return res; + */ + } + + /* + void Attach(BSTR src) { m_str = src; } + BSTR Detach() + { + BSTR s = m_str; + m_str = NULL; + return s; + } + */ + + void Empty() + { + ::SysFreeString(m_str); + m_str = NULL; + } +}; + +////////////////////////////////////////////////////////// + +class CMyUnknownImp +{ +public: + ULONG __m_RefCount; + CMyUnknownImp(): __m_RefCount(0) {} + + // virtual ~CMyUnknownImp() {}; +}; + +#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \ +(REFGUID iid, void **outObject) throw() { *outObject = NULL; + +#define MY_QUERYINTERFACE_ENTRY(i) else if (iid == IID_ ## i) \ + { *outObject = (void *)(i *)this; } + +#define MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) if (iid == IID_IUnknown) \ + { *outObject = (void *)(IUnknown *)(i *)this; } + +#define MY_QUERYINTERFACE_BEGIN2(i) MY_QUERYINTERFACE_BEGIN \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ + MY_QUERYINTERFACE_ENTRY(i) + +#define MY_QUERYINTERFACE_END else return E_NOINTERFACE; ++__m_RefCount; /* AddRef(); */ return S_OK; } + +#define MY_ADDREF_RELEASE \ +STDMETHOD_(ULONG, AddRef)() throw() { return ++__m_RefCount; } \ +STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0) \ + return __m_RefCount; delete this; return 0; } + +#define MY_UNKNOWN_IMP_SPEC(i) \ + MY_QUERYINTERFACE_BEGIN \ + i \ + MY_QUERYINTERFACE_END \ + MY_ADDREF_RELEASE + + +#define MY_UNKNOWN_IMP MY_QUERYINTERFACE_BEGIN \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(IUnknown) \ + MY_QUERYINTERFACE_END \ + MY_ADDREF_RELEASE + +#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i) \ + MY_QUERYINTERFACE_ENTRY(i) \ + ) + +#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + ) + +#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + ) + +#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + ) + +#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + MY_QUERYINTERFACE_ENTRY(i5) \ + ) + +#define MY_UNKNOWN_IMP6(i1, i2, i3, i4, i5, i6) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + MY_QUERYINTERFACE_ENTRY(i5) \ + MY_QUERYINTERFACE_ENTRY(i6) \ + ) + +#define MY_UNKNOWN_IMP7(i1, i2, i3, i4, i5, i6, i7) MY_UNKNOWN_IMP_SPEC( \ + MY_QUERYINTERFACE_ENTRY_UNKNOWN(i1) \ + MY_QUERYINTERFACE_ENTRY(i1) \ + MY_QUERYINTERFACE_ENTRY(i2) \ + MY_QUERYINTERFACE_ENTRY(i3) \ + MY_QUERYINTERFACE_ENTRY(i4) \ + MY_QUERYINTERFACE_ENTRY(i5) \ + MY_QUERYINTERFACE_ENTRY(i6) \ + MY_QUERYINTERFACE_ENTRY(i7) \ + ) + +const HRESULT k_My_HRESULT_WritingWasCut = 0x20000010; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyException.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyException.h new file mode 100644 index 0000000000..cd9fe6948b --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyException.h @@ -0,0 +1,14 @@ +// Common/Exception.h + +#ifndef __COMMON_EXCEPTION_H +#define __COMMON_EXCEPTION_H + +#include "MyWindows.h" + +struct CSystemException +{ + HRESULT ErrorCode; + CSystemException(HRESULT errorCode): ErrorCode(errorCode) {} +}; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyGuidDef.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyGuidDef.h new file mode 100644 index 0000000000..ce8586c7f5 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyGuidDef.h @@ -0,0 +1,70 @@ +// Common/MyGuidDef.h + +#ifndef GUID_DEFINED +#define GUID_DEFINED + +#include "MyTypes.h" + +typedef struct { + UInt32 Data1; + UInt16 Data2; + UInt16 Data3; + unsigned char Data4[8]; +} GUID; + +#ifdef __cplusplus +#define REFGUID const GUID & +#else +#define REFGUID const GUID * +#endif + +#define REFCLSID REFGUID +#define REFIID REFGUID + +#ifdef __cplusplus +inline int operator==(REFGUID g1, REFGUID g2) +{ + for (int i = 0; i < (int)sizeof(g1); i++) + if (((unsigned char *)&g1)[i] != ((unsigned char *)&g2)[i]) + return 0; + return 1; +} +inline int operator!=(REFGUID g1, REFGUID g2) { return !(g1 == g2); } +#endif + +#ifdef __cplusplus + #define MY_EXTERN_C extern "C" +#else + #define MY_EXTERN_C extern +#endif + +#endif + +#if defined(__APPLE__) +#ifdef ENV_HAVE_GCCVISIBILITYPATCH +#define DLLEXPORT __attribute__ ((visibility("default"))) +#else +#define DLLEXPORT +#endif +#ifdef __cplusplus +#define STDAPI extern "C" DLLEXPORT HRESULT +#else +#define STDAPI extern DLLEXPORT HRESULT +#endif /* __cplusplus */ +typedef GUID IID; +typedef GUID CLSID; +#endif + +#ifdef DEFINE_GUID +#undef DEFINE_GUID +#endif + +#ifdef INITGUID + #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + MY_EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#else + #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + MY_EXTERN_C const GUID name +#endif + +#define CONSTRUCT_GUID(l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyInitGuid.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyInitGuid.h new file mode 100644 index 0000000000..79fea19ab8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyInitGuid.h @@ -0,0 +1,45 @@ +// Common/MyInitGuid.h + +#ifndef __COMMON_MY_INITGUID_H +#define __COMMON_MY_INITGUID_H + +/* +This file must be included only to one C++ file in project before +declarations of COM interfaces with DEFINE_GUID macro. + +Each GUID must be initialized exactly once in project. +There are two different versions of the DEFINE_GUID macro in guiddef.h (MyGuidDef.h): + - if INITGUID is not defined: DEFINE_GUID declares an external reference to the symbol name. + - if INITGUID is defined: DEFINE_GUID initializes the symbol name to the value of the GUID. + +Also we need IID_IUnknown that is initialized in some file for linking: + MSVC: by default the linker uses some lib file that contains IID_IUnknown + MinGW: add -luuid switch for linker + WinCE: we define IID_IUnknown in this file + Other: we define IID_IUnknown in this file +*/ + +#ifdef _WIN32 + +#ifdef UNDER_CE +#include +#endif + +#include + +#ifdef UNDER_CE +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +#endif + +#else + +#define INITGUID +#include "MyGuidDef.h" +DEFINE_GUID(IID_IUnknown, +0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); + +#endif + + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyLinux.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyLinux.h new file mode 100644 index 0000000000..b4e7605226 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyLinux.h @@ -0,0 +1,42 @@ +// MyLinux.h + +#ifndef __MY_LIN_LINUX_H +#define __MY_LIN_LINUX_H + +#define MY_LIN_S_IFMT 00170000 +#define MY_LIN_S_IFSOCK 0140000 +#define MY_LIN_S_IFLNK 0120000 +#define MY_LIN_S_IFREG 0100000 +#define MY_LIN_S_IFBLK 0060000 +#define MY_LIN_S_IFDIR 0040000 +#define MY_LIN_S_IFCHR 0020000 +#define MY_LIN_S_IFIFO 0010000 + +#define MY_LIN_S_ISLNK(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFLNK) +#define MY_LIN_S_ISREG(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFREG) +#define MY_LIN_S_ISDIR(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFDIR) +#define MY_LIN_S_ISCHR(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFCHR) +#define MY_LIN_S_ISBLK(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFBLK) +#define MY_LIN_S_ISFIFO(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFIFO) +#define MY_LIN_S_ISSOCK(m) (((m) & MY_LIN_S_IFMT) == MY_LIN_S_IFSOCK) + +#define MY_LIN_S_ISUID 0004000 +#define MY_LIN_S_ISGID 0002000 +#define MY_LIN_S_ISVTX 0001000 + +#define MY_LIN_S_IRWXU 00700 +#define MY_LIN_S_IRUSR 00400 +#define MY_LIN_S_IWUSR 00200 +#define MY_LIN_S_IXUSR 00100 + +#define MY_LIN_S_IRWXG 00070 +#define MY_LIN_S_IRGRP 00040 +#define MY_LIN_S_IWGRP 00020 +#define MY_LIN_S_IXGRP 00010 + +#define MY_LIN_S_IRWXO 00007 +#define MY_LIN_S_IROTH 00004 +#define MY_LIN_S_IWOTH 00002 +#define MY_LIN_S_IXOTH 00001 + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyString.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyString.cpp new file mode 100644 index 0000000000..75b93266ae --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyString.cpp @@ -0,0 +1,1564 @@ +// Common/MyString.cpp + +#include "StdAfx.h" + +#ifdef _WIN32 +#include +#else +#include +#endif + +#if !defined(_UNICODE) || !defined(USE_UNICODE_FSTRING) +#include "StringConvert.h" +#endif + +#include "MyString.h" + +#define MY_STRING_NEW(_T_, _size_) new _T_[_size_] +// #define MY_STRING_NEW(_T_, _size_) ((_T_ *)my_new((size_t)(_size_) * sizeof(_T_))) + +/* +inline const char* MyStringGetNextCharPointer(const char *p) throw() +{ + #if defined(_WIN32) && !defined(UNDER_CE) + return CharNextA(p); + #else + return p + 1; + #endif +} +*/ + +int FindCharPosInString(const char *s, char c) throw() +{ + for (const char *p = s;; p++) + { + if (*p == c) + return (int)(p - s); + if (*p == 0) + return -1; + // MyStringGetNextCharPointer(p); + } +} + +int FindCharPosInString(const wchar_t *s, wchar_t c) throw() +{ + for (const wchar_t *p = s;; p++) + { + if (*p == c) + return (int)(p - s); + if (*p == 0) + return -1; + } +} + +/* +void MyStringUpper_Ascii(wchar_t *s) +{ + for (;;) + { + wchar_t c = *s; + if (c == 0) + return; + *s++ = MyCharUpper_Ascii(c); + } +} +*/ + +void MyStringLower_Ascii(char *s) throw() +{ + for (;;) + { + char c = *s; + if (c == 0) + return; + *s++ = MyCharLower_Ascii(c); + } +} + +void MyStringLower_Ascii(wchar_t *s) throw() +{ + for (;;) + { + wchar_t c = *s; + if (c == 0) + return; + *s++ = MyCharLower_Ascii(c); + } +} + +#ifdef _WIN32 + +#ifdef _UNICODE + +// wchar_t * MyStringUpper(wchar_t *s) { return CharUpperW(s); } +// wchar_t * MyStringLower(wchar_t *s) { return CharLowerW(s); } +// for WinCE - FString - char +// const char *MyStringGetPrevCharPointer(const char * /* base */, const char *p) { return p - 1; } + +#else + +// const char * MyStringGetPrevCharPointer(const char *base, const char *p) throw() { return CharPrevA(base, p); } +// char * MyStringUpper(char *s) { return CharUpperA(s); } +// char * MyStringLower(char *s) { return CharLowerA(s); } + +wchar_t MyCharUpper_WIN(wchar_t c) throw() +{ + wchar_t *res = CharUpperW((LPWSTR)(UINT_PTR)(unsigned)c); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return (wchar_t)(unsigned)(UINT_PTR)res; + const int kBufSize = 4; + char s[kBufSize + 1]; + int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufSize, 0, 0); + if (numChars == 0 || numChars > kBufSize) + return c; + s[numChars] = 0; + ::CharUpperA(s); + ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); + return c; +} + +/* +wchar_t MyCharLower_WIN(wchar_t c) +{ + wchar_t *res = CharLowerW((LPWSTR)(UINT_PTR)(unsigned)c); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return (wchar_t)(unsigned)(UINT_PTR)res; + const int kBufSize = 4; + char s[kBufSize + 1]; + int numChars = ::WideCharToMultiByte(CP_ACP, 0, &c, 1, s, kBufSize, 0, 0); + if (numChars == 0 || numChars > kBufSize) + return c; + s[numChars] = 0; + ::CharLowerA(s); + ::MultiByteToWideChar(CP_ACP, 0, s, numChars, &c, 1); + return c; +} +*/ + +/* +wchar_t * MyStringUpper(wchar_t *s) +{ + if (s == 0) + return 0; + wchar_t *res = CharUpperW(s); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return res; + AString a = UnicodeStringToMultiByte(s); + a.MakeUpper(); + MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); + return s; +} +*/ + +/* +wchar_t * MyStringLower(wchar_t *s) +{ + if (s == 0) + return 0; + wchar_t *res = CharLowerW(s); + if (res != 0 || ::GetLastError() != ERROR_CALL_NOT_IMPLEMENTED) + return res; + AString a = UnicodeStringToMultiByte(s); + a.MakeLower(); + MyStringCopy(s, (const wchar_t *)MultiByteToUnicodeString(a)); + return s; +} +*/ + +#endif + +#endif + +bool IsString1PrefixedByString2(const char *s1, const char *s2) throw() +{ + for (;;) + { + unsigned char c2 = (unsigned char)*s2++; if (c2 == 0) return true; + unsigned char c1 = (unsigned char)*s1++; if (c1 != c2) return false; + } +} + +bool StringsAreEqualNoCase(const wchar_t *s1, const wchar_t *s2) throw() +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 != c2 && MyCharUpper(c1) != MyCharUpper(c2)) return false; + if (c1 == 0) return true; + } +} + +// ---------- ASCII ---------- + +bool AString::IsPrefixedBy_Ascii_NoCase(const char *s) const throw() +{ + const char *s1 = _chars; + for (;;) + { + char c2 = *s++; + if (c2 == 0) + return true; + char c1 = *s1++; + if (MyCharLower_Ascii(c1) != + MyCharLower_Ascii(c2)) + return false; + } +} + +bool UString::IsPrefixedBy_Ascii_NoCase(const char *s) const throw() +{ + const wchar_t *s1 = _chars; + for (;;) + { + char c2 = *s++; + if (c2 == 0) + return true; + wchar_t c1 = *s1++; + if (MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2)) + return false; + } +} + +bool StringsAreEqual_Ascii(const wchar_t *u, const char *a) throw() +{ + for (;;) + { + unsigned char c = *a; + if (c != *u) + return false; + if (c == 0) + return true; + a++; + u++; + } +} + +bool StringsAreEqualNoCase_Ascii(const char *s1, const char *s2) throw() +{ + for (;;) + { + char c1 = *s1++; + char c2 = *s2++; + if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2)) + return false; + if (c1 == 0) + return true; + } +} + +bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const wchar_t *s2) throw() +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 != c2 && MyCharLower_Ascii(c1) != MyCharLower_Ascii(c2)) + return false; + if (c1 == 0) + return true; + } +} + +bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const char *s2) throw() +{ + for (;;) + { + wchar_t c1 = *s1++; + char c2 = *s2++; + if (c1 != (unsigned char)c2 && (c1 > 0x7F || MyCharLower_Ascii(c1) != (unsigned char)MyCharLower_Ascii(c2))) + return false; + if (c1 == 0) + return true; + } +} + +bool IsString1PrefixedByString2(const wchar_t *s1, const wchar_t *s2) throw() +{ + for (;;) + { + wchar_t c2 = *s2++; if (c2 == 0) return true; + wchar_t c1 = *s1++; if (c1 != c2) return false; + } +} + +bool IsString1PrefixedByString2_NoCase(const wchar_t *s1, const wchar_t *s2) throw() +{ + for (;;) + { + wchar_t c2 = *s2++; if (c2 == 0) return true; + wchar_t c1 = *s1++; + if (c1 != c2 && MyCharUpper(c1) != MyCharUpper(c2)) + return false; + } +} + +// NTFS order: uses upper case +int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) throw() +{ + for (;;) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 != c2) + { + wchar_t u1 = MyCharUpper(c1); + wchar_t u2 = MyCharUpper(c2); + if (u1 < u2) return -1; + if (u1 > u2) return 1; + } + if (c1 == 0) return 0; + } +} + +/* +int MyStringCompareNoCase_N(const wchar_t *s1, const wchar_t *s2, unsigned num) +{ + for (; num != 0; num--) + { + wchar_t c1 = *s1++; + wchar_t c2 = *s2++; + if (c1 != c2) + { + wchar_t u1 = MyCharUpper(c1); + wchar_t u2 = MyCharUpper(c2); + if (u1 < u2) return -1; + if (u1 > u2) return 1; + } + if (c1 == 0) return 0; + } + return 0; +} +*/ + +// ---------- AString ---------- + +void AString::InsertSpace(unsigned &index, unsigned size) +{ + Grow(size); + MoveItems(index + size, index); +} + +#define k_Alloc_Len_Limit 0x40000000 + +void AString::ReAlloc(unsigned newLimit) +{ + if (newLimit < _len || newLimit >= k_Alloc_Len_Limit) throw 20130220; + // MY_STRING_REALLOC(_chars, char, newLimit + 1, _len + 1); + char *newBuf = MY_STRING_NEW(char, newLimit + 1); + memcpy(newBuf, _chars, (size_t)(_len + 1)); \ + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = newLimit; +} + +void AString::ReAlloc2(unsigned newLimit) +{ + if (newLimit >= k_Alloc_Len_Limit) throw 20130220; + // MY_STRING_REALLOC(_chars, char, newLimit + 1, 0); + char *newBuf = MY_STRING_NEW(char, newLimit + 1); + newBuf[0] = 0; + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = newLimit; +} + +void AString::SetStartLen(unsigned len) +{ + _chars = 0; + _chars = MY_STRING_NEW(char, len + 1); + _len = len; + _limit = len; +} + +void AString::Grow_1() +{ + unsigned next = _len; + next += next / 2; + next += 16; + next &= ~(unsigned)15; + ReAlloc(next - 1); +} + +void AString::Grow(unsigned n) +{ + unsigned freeSize = _limit - _len; + if (n <= freeSize) + return; + + unsigned next = _len + n; + next += next / 2; + next += 16; + next &= ~(unsigned)15; + ReAlloc(next - 1); +} + +/* +AString::AString(unsigned num, const char *s) +{ + unsigned len = MyStringLen(s); + if (num > len) + num = len; + SetStartLen(num); + memcpy(_chars, s, num); + _chars[num] = 0; +} +*/ + +AString::AString(unsigned num, const AString &s) +{ + if (num > s._len) + num = s._len; + SetStartLen(num); + memcpy(_chars, s._chars, num); + _chars[num] = 0; +} + +AString::AString(const AString &s, char c) +{ + SetStartLen(s.Len() + 1); + char *chars = _chars; + unsigned len = s.Len(); + memcpy(chars, s, len); + chars[len] = c; + chars[len + 1] = 0; +} + +AString::AString(const char *s1, unsigned num1, const char *s2, unsigned num2) +{ + SetStartLen(num1 + num2); + char *chars = _chars; + memcpy(chars, s1, num1); + memcpy(chars + num1, s2, num2 + 1); +} + +AString operator+(const AString &s1, const AString &s2) { return AString(s1, s1.Len(), s2, s2.Len()); } +AString operator+(const AString &s1, const char *s2) { return AString(s1, s1.Len(), s2, MyStringLen(s2)); } +AString operator+(const char *s1, const AString &s2) { return AString(s1, MyStringLen(s1), s2, s2.Len()); } + +AString::AString() +{ + _chars = 0; + _chars = MY_STRING_NEW(char, 4); + _len = 0; + _limit = 4 - 1; + _chars[0] = 0; +} + +AString::AString(char c) +{ + SetStartLen(1); + _chars[0] = c; + _chars[1] = 0; +} + +AString::AString(const char *s) +{ + SetStartLen(MyStringLen(s)); + MyStringCopy(_chars, s); +} + +AString::AString(const AString &s) +{ + SetStartLen(s._len); + MyStringCopy(_chars, s._chars); +} + +AString &AString::operator=(char c) +{ + if (1 > _limit) + { + char *newBuf = MY_STRING_NEW(char, 1 + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = 1; + } + _len = 1; + _chars[0] = c; + _chars[1] = 0; + return *this; +} + +AString &AString::operator=(const char *s) +{ + unsigned len = MyStringLen(s); + if (len > _limit) + { + char *newBuf = MY_STRING_NEW(char, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + MyStringCopy(_chars, s); + return *this; +} + +AString &AString::operator=(const AString &s) +{ + if (&s == this) + return *this; + unsigned len = s._len; + if (len > _limit) + { + char *newBuf = MY_STRING_NEW(char, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + MyStringCopy(_chars, s._chars); + return *this; +} + +void AString::SetFromWStr_if_Ascii(const wchar_t *s) +{ + unsigned len = 0; + { + for (;; len++) + { + wchar_t c = s[len]; + if (c == 0) + break; + if (c >= 0x80) + return; + } + } + if (len > _limit) + { + char *newBuf = MY_STRING_NEW(char, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + char *dest = _chars; + unsigned i; + for (i = 0; i < len; i++) + dest[i] = (char)s[i]; + dest[i] = 0; +} + +/* +void AString::SetFromBstr_if_Ascii(BSTR s) +{ + unsigned len = ::SysStringLen(s); + { + for (unsigned i = 0; i < len; i++) + if (s[i] <= 0 || s[i] >= 0x80) + return; + } + if (len > _limit) + { + char *newBuf = MY_STRING_NEW(char, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + char *dest = _chars; + unsigned i; + for (i = 0; i < len; i++) + dest[i] = (char)s[i]; + dest[i] = 0; +} +*/ + +void AString::Add_Space() { operator+=(' '); } +void AString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); } +void AString::Add_LF() { operator+=('\n'); } + +AString &AString::operator+=(const char *s) +{ + unsigned len = MyStringLen(s); + Grow(len); + MyStringCopy(_chars + _len, s); + _len += len; + return *this; +} + +AString &AString::operator+=(const AString &s) +{ + Grow(s._len); + MyStringCopy(_chars + _len, s._chars); + _len += s._len; + return *this; +} + +void AString::SetFrom(const char *s, unsigned len) // no check +{ + if (len > _limit) + { + char *newBuf = MY_STRING_NEW(char, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + if (len != 0) + memcpy(_chars, s, len); + _chars[len] = 0; + _len = len; +} + +void AString::SetFrom_CalcLen(const char *s, unsigned len) // no check +{ + unsigned i; + for (i = 0; i < len; i++) + if (s[i] == 0) + break; + SetFrom(s, i); +} + +int AString::Find(const char *s, unsigned startIndex) const throw() +{ + const char *fs = strstr(_chars + startIndex, s); + if (!fs) + return -1; + return (int)(fs - _chars); + + /* + if (s[0] == 0) + return startIndex; + unsigned len = MyStringLen(s); + const char *p = _chars + startIndex; + for (;; p++) + { + const char c = *p; + if (c != s[0]) + { + if (c == 0) + return -1; + continue; + } + unsigned i; + for (i = 1; i < len; i++) + if (p[i] != s[i]) + break; + if (i == len) + return (int)(p - _chars); + } + */ +} + +int AString::ReverseFind(char c) const throw() +{ + if (_len == 0) + return -1; + const char *p = _chars + _len - 1; + for (;;) + { + if (*p == c) + return (int)(p - _chars); + if (p == _chars) + return -1; + p--; // p = GetPrevCharPointer(_chars, p); + } +} + +int AString::ReverseFind_PathSepar() const throw() +{ + if (_len == 0) + return -1; + const char *p = _chars + _len - 1; + for (;;) + { + char c = *p; + if (IS_PATH_SEPAR(c)) + return (int)(p - _chars); + if (p == _chars) + return -1; + p--; + } +} + +void AString::TrimLeft() throw() +{ + const char *p = _chars; + for (;; p++) + { + char c = *p; + if (c != ' ' && c != '\n' && c != '\t') + break; + } + unsigned pos = (unsigned)(p - _chars); + if (pos != 0) + { + MoveItems(0, pos); + _len -= pos; + } +} + +void AString::TrimRight() throw() +{ + const char *p = _chars; + unsigned i; + for (i = _len; i != 0; i--) + { + char c = p[i - 1]; + if (c != ' ' && c != '\n' && c != '\t') + break; + } + if (i != _len) + { + _chars[i] = 0; + _len = i; + } +} + +void AString::InsertAtFront(char c) +{ + if (_limit == _len) + Grow_1(); + MoveItems(1, 0); + _chars[0] = c; + _len++; +} + +/* +void AString::Insert(unsigned index, char c) +{ + InsertSpace(index, 1); + _chars[index] = c; + _len++; +} +*/ + +void AString::Insert(unsigned index, const char *s) +{ + unsigned num = MyStringLen(s); + if (num != 0) + { + InsertSpace(index, num); + memcpy(_chars + index, s, num); + _len += num; + } +} + +void AString::Insert(unsigned index, const AString &s) +{ + unsigned num = s.Len(); + if (num != 0) + { + InsertSpace(index, num); + memcpy(_chars + index, s, num); + _len += num; + } +} + +void AString::RemoveChar(char ch) throw() +{ + char *src = _chars; + + for (;;) + { + char c = *src++; + if (c == 0) + return; + if (c == ch) + break; + } + + char *dest = src - 1; + + for (;;) + { + char c = *src++; + if (c == 0) + break; + if (c != ch) + *dest++ = c; + } + + *dest = 0; + _len = (unsigned)(dest - _chars); +} + +// !!!!!!!!!!!!!!! test it if newChar = '\0' +void AString::Replace(char oldChar, char newChar) throw() +{ + if (oldChar == newChar) + return; // 0; + // unsigned number = 0; + int pos = 0; + while ((unsigned)pos < _len) + { + pos = Find(oldChar, pos); + if (pos < 0) + break; + _chars[(unsigned)pos] = newChar; + pos++; + // number++; + } + return; // number; +} + +void AString::Replace(const AString &oldString, const AString &newString) +{ + if (oldString.IsEmpty()) + return; // 0; + if (oldString == newString) + return; // 0; + unsigned oldLen = oldString.Len(); + unsigned newLen = newString.Len(); + // unsigned number = 0; + int pos = 0; + while ((unsigned)pos < _len) + { + pos = Find(oldString, pos); + if (pos < 0) + break; + Delete(pos, oldLen); + Insert(pos, newString); + pos += newLen; + // number++; + } + // return number; +} + +void AString::Delete(unsigned index) throw() +{ + MoveItems(index, index + 1); + _len--; +} + +void AString::Delete(unsigned index, unsigned count) throw() +{ + if (index + count > _len) + count = _len - index; + if (count > 0) + { + MoveItems(index, index + count); + _len -= count; + } +} + +void AString::DeleteFrontal(unsigned num) throw() +{ + if (num != 0) + { + MoveItems(0, num); + _len -= num; + } +} + +/* +AString operator+(const AString &s1, const AString &s2) +{ + AString result(s1); + result += s2; + return result; +} + +AString operator+(const AString &s, const char *chars) +{ + AString result(s); + result += chars; + return result; +} + +AString operator+(const char *chars, const AString &s) +{ + AString result(chars); + result += s; + return result; +} + +AString operator+(const AString &s, char c) +{ + AString result(s); + result += c; + return result; +} +*/ + +/* +AString operator+(char c, const AString &s) +{ + AString result(c); + result += s; + return result; +} +*/ + + + + +// ---------- UString ---------- + +void UString::InsertSpace(unsigned index, unsigned size) +{ + Grow(size); + MoveItems(index + size, index); +} + +void UString::ReAlloc(unsigned newLimit) +{ + if (newLimit < _len || newLimit >= k_Alloc_Len_Limit) throw 20130221; + // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, _len + 1); + wchar_t *newBuf = MY_STRING_NEW(wchar_t, newLimit + 1); + wmemcpy(newBuf, _chars, _len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = newLimit; +} + +void UString::ReAlloc2(unsigned newLimit) +{ + if (newLimit >= k_Alloc_Len_Limit) throw 20130221; + // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0); + wchar_t *newBuf = MY_STRING_NEW(wchar_t, newLimit + 1); + newBuf[0] = 0; + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = newLimit; +} + +void UString::SetStartLen(unsigned len) +{ + _chars = 0; + _chars = MY_STRING_NEW(wchar_t, len + 1); + _len = len; + _limit = len; +} + +void UString::Grow_1() +{ + unsigned next = _len; + next += next / 2; + next += 16; + next &= ~(unsigned)15; + ReAlloc(next - 1); +} + +void UString::Grow(unsigned n) +{ + unsigned freeSize = _limit - _len; + if (n <= freeSize) + return; + + unsigned next = _len + n; + next += next / 2; + next += 16; + next &= ~(unsigned)15; + ReAlloc(next - 1); +} + + +UString::UString(unsigned num, const wchar_t *s) +{ + unsigned len = MyStringLen(s); + if (num > len) + num = len; + SetStartLen(num); + wmemcpy(_chars, s, num); + _chars[num] = 0; +} + + +UString::UString(unsigned num, const UString &s) +{ + if (num > s._len) + num = s._len; + SetStartLen(num); + wmemcpy(_chars, s._chars, num); + _chars[num] = 0; +} + +UString::UString(const UString &s, wchar_t c) +{ + SetStartLen(s.Len() + 1); + wchar_t *chars = _chars; + unsigned len = s.Len(); + wmemcpy(chars, s, len); + chars[len] = c; + chars[len + 1] = 0; +} + +UString::UString(const wchar_t *s1, unsigned num1, const wchar_t *s2, unsigned num2) +{ + SetStartLen(num1 + num2); + wchar_t *chars = _chars; + wmemcpy(chars, s1, num1); + wmemcpy(chars + num1, s2, num2 + 1); +} + +UString operator+(const UString &s1, const UString &s2) { return UString(s1, s1.Len(), s2, s2.Len()); } +UString operator+(const UString &s1, const wchar_t *s2) { return UString(s1, s1.Len(), s2, MyStringLen(s2)); } +UString operator+(const wchar_t *s1, const UString &s2) { return UString(s1, MyStringLen(s1), s2, s2.Len()); } + +UString::UString() +{ + _chars = 0; + _chars = MY_STRING_NEW(wchar_t, 4); + _len = 0; + _limit = 4 - 1; + _chars[0] = 0; +} + +UString::UString(wchar_t c) +{ + SetStartLen(1); + _chars[0] = c; + _chars[1] = 0; +} + +UString::UString(const wchar_t *s) +{ + unsigned len = MyStringLen(s); + SetStartLen(len); + wmemcpy(_chars, s, len + 1); +} + +UString::UString(const UString &s) +{ + SetStartLen(s._len); + wmemcpy(_chars, s._chars, s._len + 1); +} + +UString &UString::operator=(wchar_t c) +{ + if (1 > _limit) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, 1 + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = 1; + } + _len = 1; + _chars[0] = c; + _chars[1] = 0; + return *this; +} + +UString &UString::operator=(const wchar_t *s) +{ + unsigned len = MyStringLen(s); + if (len > _limit) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + wmemcpy(_chars, s, len + 1); + return *this; +} + +UString &UString::operator=(const UString &s) +{ + if (&s == this) + return *this; + unsigned len = s._len; + if (len > _limit) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + wmemcpy(_chars, s._chars, len + 1); + return *this; +} + +void UString::SetFromBstr(BSTR s) +{ + unsigned len = ::SysStringLen(s); + if (len > _limit) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + _len = len; + // if (s) + wmemcpy(_chars, s, len + 1); +} + +void UString::Add_Space() { operator+=(L' '); } +void UString::Add_Space_if_NotEmpty() { if (!IsEmpty()) Add_Space(); } + +void UString::Add_LF() +{ + if (_limit == _len) + Grow_1(); + unsigned len = _len; + wchar_t *chars = _chars; + chars[len++] = L'\n'; + chars[len] = 0; + _len = len; +} + +UString &UString::operator+=(const wchar_t *s) +{ + unsigned len = MyStringLen(s); + Grow(len); + wmemcpy(_chars + _len, s, len + 1); + _len += len; + return *this; +} + +UString &UString::operator+=(const UString &s) +{ + Grow(s._len); + wmemcpy(_chars + _len, s._chars, s._len + 1); + _len += s._len; + return *this; +} + +void UString::SetFrom(const wchar_t *s, unsigned len) // no check +{ + if (len > _limit) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + if (len != 0) + wmemcpy(_chars, s, len); + _chars[len] = 0; + _len = len; +} + +void UString::SetFromAscii(const char *s) +{ + unsigned len = MyStringLen(s); + if (len > _limit) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + MY_STRING_DELETE(_chars); + _chars = newBuf; + _limit = len; + } + wchar_t *chars = _chars; + for (unsigned i = 0; i < len; i++) + chars[i] = (unsigned char)s[i]; + chars[len] = 0; + _len = len; +} + +void UString::AddAscii(const char *s) +{ + unsigned len = MyStringLen(s); + Grow(len); + wchar_t *chars = _chars + _len; + for (unsigned i = 0; i < len; i++) + chars[i] = (unsigned char)s[i]; + chars[len] = 0; + _len += len; +} + + + +int UString::Find(const wchar_t *s, unsigned startIndex) const throw() +{ + const wchar_t *fs = wcsstr(_chars + startIndex, s); + if (!fs) + return -1; + return (int)(fs - _chars); + + /* + if (s[0] == 0) + return startIndex; + unsigned len = MyStringLen(s); + const wchar_t *p = _chars + startIndex; + for (;; p++) + { + const wchar_t c = *p; + if (c != s[0]) + { + if (c == 0) + return -1; + continue; + } + unsigned i; + for (i = 1; i < len; i++) + if (p[i] != s[i]) + break; + if (i == len) + return (int)(p - _chars); + } + */ +} + +int UString::ReverseFind(wchar_t c) const throw() +{ + if (_len == 0) + return -1; + const wchar_t *p = _chars + _len - 1; + for (;;) + { + if (*p == c) + return (int)(p - _chars); + if (p == _chars) + return -1; + p--; + } +} + +int UString::ReverseFind_PathSepar() const throw() +{ + if (_len == 0) + return -1; + const wchar_t *p = _chars + _len - 1; + for (;;) + { + wchar_t c = *p; + if (IS_PATH_SEPAR(c)) + return (int)(p - _chars); + if (p == _chars) + return -1; + p--; + } +} + +void UString::TrimLeft() throw() +{ + const wchar_t *p = _chars; + for (;; p++) + { + wchar_t c = *p; + if (c != ' ' && c != '\n' && c != '\t') + break; + } + unsigned pos = (unsigned)(p - _chars); + if (pos != 0) + { + MoveItems(0, pos); + _len -= pos; + } +} + +void UString::TrimRight() throw() +{ + const wchar_t *p = _chars; + unsigned i; + for (i = _len; i != 0; i--) + { + wchar_t c = p[i - 1]; + if (c != ' ' && c != '\n' && c != '\t') + break; + } + if (i != _len) + { + _chars[i] = 0; + _len = i; + } +} + +void UString::InsertAtFront(wchar_t c) +{ + if (_limit == _len) + Grow_1(); + MoveItems(1, 0); + _chars[0] = c; + _len++; +} + +/* +void UString::Insert(unsigned index, wchar_t c) +{ + InsertSpace(index, 1); + _chars[index] = c; + _len++; +} +*/ + +void UString::Insert(unsigned index, const wchar_t *s) +{ + unsigned num = MyStringLen(s); + if (num != 0) + { + InsertSpace(index, num); + wmemcpy(_chars + index, s, num); + _len += num; + } +} + +void UString::Insert(unsigned index, const UString &s) +{ + unsigned num = s.Len(); + if (num != 0) + { + InsertSpace(index, num); + wmemcpy(_chars + index, s, num); + _len += num; + } +} + +void UString::RemoveChar(wchar_t ch) throw() +{ + wchar_t *src = _chars; + + for (;;) + { + wchar_t c = *src++; + if (c == 0) + return; + if (c == ch) + break; + } + + wchar_t *dest = src - 1; + + for (;;) + { + wchar_t c = *src++; + if (c == 0) + break; + if (c != ch) + *dest++ = c; + } + + *dest = 0; + _len = (unsigned)(dest - _chars); +} + +// !!!!!!!!!!!!!!! test it if newChar = '\0' +void UString::Replace(wchar_t oldChar, wchar_t newChar) throw() +{ + if (oldChar == newChar) + return; // 0; + // unsigned number = 0; + int pos = 0; + while ((unsigned)pos < _len) + { + pos = Find(oldChar, pos); + if (pos < 0) + break; + _chars[(unsigned)pos] = newChar; + pos++; + // number++; + } + return; // number; +} + +void UString::Replace(const UString &oldString, const UString &newString) +{ + if (oldString.IsEmpty()) + return; // 0; + if (oldString == newString) + return; // 0; + unsigned oldLen = oldString.Len(); + unsigned newLen = newString.Len(); + // unsigned number = 0; + int pos = 0; + while ((unsigned)pos < _len) + { + pos = Find(oldString, pos); + if (pos < 0) + break; + Delete(pos, oldLen); + Insert(pos, newString); + pos += newLen; + // number++; + } + // return number; +} + +void UString::Delete(unsigned index) throw() +{ + MoveItems(index, index + 1); + _len--; +} + +void UString::Delete(unsigned index, unsigned count) throw() +{ + if (index + count > _len) + count = _len - index; + if (count > 0) + { + MoveItems(index, index + count); + _len -= count; + } +} + +void UString::DeleteFrontal(unsigned num) throw() +{ + if (num != 0) + { + MoveItems(0, num); + _len -= num; + } +} + + +// ---------- UString2 ---------- + +void UString2::ReAlloc2(unsigned newLimit) +{ + if (newLimit >= k_Alloc_Len_Limit) throw 20130221; + // MY_STRING_REALLOC(_chars, wchar_t, newLimit + 1, 0); + _chars = MY_STRING_NEW(wchar_t, newLimit + 1); +} + +void UString2::SetStartLen(unsigned len) +{ + _chars = 0; + _chars = MY_STRING_NEW(wchar_t, len + 1); + _len = len; +} + + +/* +UString2::UString2(wchar_t c) +{ + SetStartLen(1); + _chars[0] = c; + _chars[1] = 0; +} +*/ + +UString2::UString2(const wchar_t *s) +{ + unsigned len = MyStringLen(s); + SetStartLen(len); + wmemcpy(_chars, s, len + 1); +} + +UString2::UString2(const UString2 &s): _chars(NULL), _len(0) +{ + if (s._chars) + { + SetStartLen(s._len); + wmemcpy(_chars, s._chars, s._len + 1); + } +} + +/* +UString2 &UString2::operator=(wchar_t c) +{ + if (1 > _len) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, 1 + 1); + if (_chars) + MY_STRING_DELETE(_chars); + _chars = newBuf; + } + _len = 1; + _chars[0] = c; + _chars[1] = 0; + return *this; +} +*/ + +UString2 &UString2::operator=(const wchar_t *s) +{ + unsigned len = MyStringLen(s); + if (len > _len) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + if (_chars) + MY_STRING_DELETE(_chars); + _chars = newBuf; + } + _len = len; + MyStringCopy(_chars, s); + return *this; +} + +void UString2::SetFromAscii(const char *s) +{ + unsigned len = MyStringLen(s); + if (len > _len) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + if (_chars) + MY_STRING_DELETE(_chars); + _chars = newBuf; + } + wchar_t *chars = _chars; + for (unsigned i = 0; i < len; i++) + chars[i] = (unsigned char)s[i]; + chars[len] = 0; + _len = len; +} + +UString2 &UString2::operator=(const UString2 &s) +{ + if (&s == this) + return *this; + unsigned len = s._len; + if (len > _len) + { + wchar_t *newBuf = MY_STRING_NEW(wchar_t, len + 1); + if (_chars) + MY_STRING_DELETE(_chars); + _chars = newBuf; + } + _len = len; + MyStringCopy(_chars, s._chars); + return *this; +} + +bool operator==(const UString2 &s1, const UString2 &s2) +{ + return s1.Len() == s2.Len() && (s1.IsEmpty() || wcscmp(s1.GetRawPtr(), s2.GetRawPtr()) == 0); +} + +bool operator==(const UString2 &s1, const wchar_t *s2) +{ + if (s1.IsEmpty()) + return (*s2 == 0); + return wcscmp(s1.GetRawPtr(), s2) == 0; +} + +bool operator==(const wchar_t *s1, const UString2 &s2) +{ + if (s2.IsEmpty()) + return (*s1 == 0); + return wcscmp(s1, s2.GetRawPtr()) == 0; +} + + + +// ---------------------------------------- + +/* +int MyStringCompareNoCase(const char *s1, const char *s2) +{ + return MyStringCompareNoCase(MultiByteToUnicodeString(s1), MultiByteToUnicodeString(s2)); +} +*/ + +static inline UINT GetCurrentCodePage() +{ + #if defined(UNDER_CE) || !defined(_WIN32) + return CP_ACP; + #else + return ::AreFileApisANSI() ? CP_ACP : CP_OEMCP; + #endif +} + +#ifdef USE_UNICODE_FSTRING + +#ifndef _UNICODE + +AString fs2fas(CFSTR s) +{ + return UnicodeStringToMultiByte(s, GetCurrentCodePage()); +} + +FString fas2fs(const AString &s) +{ + return MultiByteToUnicodeString(s, GetCurrentCodePage()); +} + +#endif + +#else + +UString fs2us(const FString &s) +{ + return MultiByteToUnicodeString((AString)s, GetCurrentCodePage()); +} + +FString us2fs(const wchar_t *s) +{ + return UnicodeStringToMultiByte(s, GetCurrentCodePage()); +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyString.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyString.h new file mode 100644 index 0000000000..be848e4039 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyString.h @@ -0,0 +1,784 @@ +// Common/String.h + +#ifndef __COMMON_STRING_H +#define __COMMON_STRING_H + +#include + +#ifndef _WIN32 +#include +#include +#endif + +#include "MyWindows.h" +#include "MyTypes.h" +#include "MyVector.h" + +#ifdef _WIN32 +#define IS_PATH_SEPAR(c) ((c) == '\\' || (c) == '/') +#else +#define IS_PATH_SEPAR(c) ((c) == CHAR_PATH_SEPARATOR) +#endif + +inline bool IsPathSepar(char c) { return IS_PATH_SEPAR(c); } +inline bool IsPathSepar(wchar_t c) { return IS_PATH_SEPAR(c); } + +inline unsigned MyStringLen(const char *s) +{ + unsigned i; + for (i = 0; s[i] != 0; i++); + return i; +} + +inline void MyStringCopy(char *dest, const char *src) +{ + while ((*dest++ = *src++) != 0); +} + +inline char *MyStpCpy(char *dest, const char *src) +{ + for (;;) + { + char c = *src; + *dest = c; + if (c == 0) + return dest; + src++; + dest++; + } +} + +inline unsigned MyStringLen(const wchar_t *s) +{ + unsigned i; + for (i = 0; s[i] != 0; i++); + return i; +} + +inline void MyStringCopy(wchar_t *dest, const wchar_t *src) +{ + while ((*dest++ = *src++) != 0); +} + +/* +inline wchar_t *MyWcpCpy(wchar_t *dest, const wchar_t *src) +{ + for (;;) + { + wchar_t c = *src; + *dest = c; + if (c == 0) + return dest; + src++; + dest++; + } +} +*/ + +int FindCharPosInString(const char *s, char c) throw(); +int FindCharPosInString(const wchar_t *s, wchar_t c) throw(); + +#ifdef _WIN32 + #ifndef _UNICODE + #define STRING_UNICODE_THROW + #endif +#endif + +#ifndef STRING_UNICODE_THROW + #define STRING_UNICODE_THROW throw() +#endif + +/* +inline char MyCharUpper_Ascii(char c) +{ + if (c >= 'a' && c <= 'z') + return (char)(c - 0x20); + return c; +} +inline wchar_t MyCharUpper_Ascii(wchar_t c) +{ + if (c >= 'a' && c <= 'z') + return (wchar_t)(c - 0x20); + return c; +} +*/ + +inline char MyCharLower_Ascii(char c) +{ + if (c >= 'A' && c <= 'Z') + return (char)((unsigned char)c + 0x20); + return c; +} + +inline wchar_t MyCharLower_Ascii(wchar_t c) +{ + if (c >= 'A' && c <= 'Z') + return (wchar_t)(c + 0x20); + return c; +} + +wchar_t MyCharUpper_WIN(wchar_t c) throw(); + +inline wchar_t MyCharUpper(wchar_t c) throw() +{ + if (c < 'a') return c; + if (c <= 'z') return (wchar_t)(c - 0x20); + if (c <= 0x7F) return c; + #ifdef _WIN32 + #ifdef _UNICODE + return (wchar_t)(unsigned)(UINT_PTR)CharUpperW((LPWSTR)(UINT_PTR)(unsigned)c); + #else + return (wchar_t)MyCharUpper_WIN(c); + #endif + #else + return (wchar_t)towupper(c); + #endif +} + +/* +wchar_t MyCharLower_WIN(wchar_t c) throw(); + +inline wchar_t MyCharLower(wchar_t c) throw() +{ + if (c < 'A') return c; + if (c <= 'Z') return (wchar_t)(c + 0x20); + if (c <= 0x7F) return c; + #ifdef _WIN32 + #ifdef _UNICODE + return (wchar_t)(unsigned)(UINT_PTR)CharLowerW((LPWSTR)(UINT_PTR)(unsigned)c); + #else + return (wchar_t)MyCharLower_WIN(c); + #endif + #else + return (wchar_t)tolower(c); + #endif +} +*/ + +// char *MyStringUpper(char *s) throw(); +// char *MyStringLower(char *s) throw(); + +// void MyStringUpper_Ascii(wchar_t *s) throw(); +void MyStringLower_Ascii(char *s) throw(); +void MyStringLower_Ascii(wchar_t *s) throw(); +// wchar_t *MyStringUpper(wchar_t *s) STRING_UNICODE_THROW; +// wchar_t *MyStringLower(wchar_t *s) STRING_UNICODE_THROW; + +bool StringsAreEqualNoCase(const wchar_t *s1, const wchar_t *s2) throw(); + +bool IsString1PrefixedByString2(const char *s1, const char *s2) throw(); +bool IsString1PrefixedByString2(const wchar_t *s1, const wchar_t *s2) throw(); +bool IsString1PrefixedByString2_NoCase(const wchar_t *s1, const wchar_t *s2) throw(); + +int MyStringCompareNoCase(const wchar_t *s1, const wchar_t *s2) throw(); +// int MyStringCompareNoCase_N(const wchar_t *s1, const wchar_t *s2, unsigned num) throw(); + +// ---------- ASCII ---------- +// char values in ASCII strings must be less then 128 +bool StringsAreEqual_Ascii(const wchar_t *u, const char *a) throw(); +bool StringsAreEqualNoCase_Ascii(const char *s1, const char *s2) throw(); +bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const char *s2) throw(); +bool StringsAreEqualNoCase_Ascii(const wchar_t *s1, const wchar_t *s2) throw(); + +#define MY_STRING_DELETE(_p_) delete []_p_; +// #define MY_STRING_DELETE(_p_) my_delete(_p_); + +class AString +{ + char *_chars; + unsigned _len; + unsigned _limit; + + void MoveItems(unsigned dest, unsigned src) + { + memmove(_chars + dest, _chars + src, (size_t)(_len - src + 1) * sizeof(char)); + } + + void InsertSpace(unsigned &index, unsigned size); + + void ReAlloc(unsigned newLimit); + void ReAlloc2(unsigned newLimit); + void SetStartLen(unsigned len); + void Grow_1(); + void Grow(unsigned n); + + // AString(unsigned num, const char *s); + AString(unsigned num, const AString &s); + AString(const AString &s, char c); // it's for String + char + AString(const char *s1, unsigned num1, const char *s2, unsigned num2); + + friend AString operator+(const AString &s, char c) { return AString(s, c); } ; + // friend AString operator+(char c, const AString &s); // is not supported + + friend AString operator+(const AString &s1, const AString &s2); + friend AString operator+(const AString &s1, const char *s2); + friend AString operator+(const char *s1, const AString &s2); + + // ---------- forbidden functions ---------- + AString &operator+=(wchar_t c); + AString &operator=(wchar_t c); + AString(wchar_t c); + void Find(wchar_t c) const; + void Find(wchar_t c, unsigned startIndex) const; + void ReverseFind(wchar_t c) const; + void InsertAtFront(wchar_t c); + void RemoveChar(wchar_t ch); + void Replace(wchar_t oldChar, wchar_t newChar); + +public: + AString(); + AString(char c); + AString(const char *s); + AString(const AString &s); + ~AString() { MY_STRING_DELETE(_chars); } + + unsigned Len() const { return _len; } + bool IsEmpty() const { return _len == 0; } + void Empty() { _len = 0; _chars[0] = 0; } + + operator const char *() const { return _chars; } + const char *Ptr() const { return _chars; } + const char *Ptr(unsigned pos) const { return _chars + pos; } + const char *RightPtr(unsigned num) const { return _chars + _len - num; } + char Back() const { return _chars[_len - 1]; } + + void ReplaceOneCharAtPos(unsigned pos, char c) { _chars[pos] = c; } + + /* GetBuf(minLen): provides the buffer that can store + at least (minLen) characters and additional null terminator. + 9.35: GetBuf doesn't preserve old characters and terminator */ + char *GetBuf(unsigned minLen) + { + if (minLen > _limit) + ReAlloc2(minLen); + return _chars; + } + char *GetBuf_SetEnd(unsigned minLen) + { + if (minLen > _limit) + ReAlloc2(minLen); + char *chars = _chars; + chars[minLen] = 0; + _len = minLen; + return chars; + } + + void ReleaseBuf_SetLen(unsigned newLen) { _len = newLen; } + void ReleaseBuf_SetEnd(unsigned newLen) { _len = newLen; _chars[newLen] = 0; } + void ReleaseBuf_CalcLen(unsigned maxLen) + { + char *chars = _chars; + chars[maxLen] = 0; + _len = MyStringLen(chars); + } + + AString &operator=(char c); + AString &operator=(const char *s); + AString &operator=(const AString &s); + void SetFromWStr_if_Ascii(const wchar_t *s); + // void SetFromBstr_if_Ascii(BSTR s); + + AString &operator+=(char c) + { + if (_limit == _len) + Grow_1(); + unsigned len = _len; + char *chars = _chars; + chars[len++] = c; + chars[len] = 0; + _len = len; + return *this; + } + + void Add_Space(); + void Add_Space_if_NotEmpty(); + void Add_LF(); + void Add_PathSepar() { operator+=(CHAR_PATH_SEPARATOR); } + + AString &operator+=(const char *s); + AString &operator+=(const AString &s); + void AddAscii(const char *s) { operator+=(s); } + + void SetFrom(const char *s, unsigned len); // no check + void SetFrom_CalcLen(const char *s, unsigned len); + // void SetFromAscii(const char *s) { operator+=(s); } + + AString Mid(unsigned startIndex, unsigned count) const { return AString(count, _chars + startIndex); } + AString Left(unsigned count) const { return AString(count, *this); } + + // void MakeUpper() { MyStringUpper(_chars); } + // void MakeLower() { MyStringLower(_chars); } + void MakeLower_Ascii() { MyStringLower_Ascii(_chars); } + + + bool IsEqualTo(const char *s) const { return strcmp(_chars, s) == 0; } + bool IsEqualTo_Ascii_NoCase(const char *s) const { return StringsAreEqualNoCase_Ascii(_chars, s); } + // int Compare(const char *s) const { return MyStringCompare(_chars, s); } + // int Compare(const AString &s) const { return MyStringCompare(_chars, s._chars); } + // int CompareNoCase(const char *s) const { return MyStringCompareNoCase(_chars, s); } + // int CompareNoCase(const AString &s) const { return MyStringCompareNoCase(_chars, s._chars); } + bool IsPrefixedBy(const char *s) const { return IsString1PrefixedByString2(_chars, s); } + bool IsPrefixedBy_Ascii_NoCase(const char *s) const throw(); + + bool IsAscii() const + { + unsigned len = Len(); + const char *s = _chars; + for (unsigned i = 0; i < len; i++) + if ((unsigned char)s[i] >= 0x80) + return false; + return true; + } + int Find(char c) const { return FindCharPosInString(_chars, c); } + int Find(char c, unsigned startIndex) const + { + int pos = FindCharPosInString(_chars + startIndex, c); + return pos < 0 ? -1 : (int)startIndex + pos; + } + + int ReverseFind(char c) const throw(); + int ReverseFind_Dot() const throw() { return ReverseFind('.'); } + int ReverseFind_PathSepar() const throw(); + + int Find(const char *s) const { return Find(s, 0); } + int Find(const char *s, unsigned startIndex) const throw(); + + void TrimLeft() throw(); + void TrimRight() throw(); + void Trim() + { + TrimRight(); + TrimLeft(); + } + + void InsertAtFront(char c); + // void Insert(unsigned index, char c); + void Insert(unsigned index, const char *s); + void Insert(unsigned index, const AString &s); + + void RemoveChar(char ch) throw(); + + void Replace(char oldChar, char newChar) throw(); + void Replace(const AString &oldString, const AString &newString); + + void Delete(unsigned index) throw(); + void Delete(unsigned index, unsigned count) throw(); + void DeleteFrontal(unsigned num) throw(); + void DeleteBack() { _chars[--_len] = 0; } + void DeleteFrom(unsigned index) + { + if (index < _len) + { + _len = index; + _chars[index] = 0; + } + } +}; + +bool operator<(const AString &s1, const AString &s2); +bool operator>(const AString &s1, const AString &s2); + +/* +bool operator==(const AString &s1, const AString &s2); +bool operator==(const AString &s1, const char *s2); +bool operator==(const char *s1, const AString &s2); + +bool operator!=(const AString &s1, const AString &s2); +bool operator!=(const AString &s1, const char *s2); +bool operator!=(const char *s1, const AString &s2); +*/ + +inline bool operator==(const AString &s1, const AString &s2) { return s1.Len() == s2.Len() && strcmp(s1, s2) == 0; } +inline bool operator==(const AString &s1, const char *s2) { return strcmp(s1, s2) == 0; } +inline bool operator==(const char *s1, const AString &s2) { return strcmp(s1, s2) == 0; } + +inline bool operator!=(const AString &s1, const AString &s2) { return s1.Len() != s2.Len() || strcmp(s1, s2) != 0; } +inline bool operator!=(const AString &s1, const char *s2) { return strcmp(s1, s2) != 0; } +inline bool operator!=(const char *s1, const AString &s2) { return strcmp(s1, s2) != 0; } + +// ---------- forbidden functions ---------- + +void operator==(char c1, const AString &s2); +void operator==(const AString &s1, char c2); + +void operator+(char c, const AString &s); // this function can be OK, but we don't use it + +void operator+(const AString &s, int c); +void operator+(const AString &s, unsigned c); +void operator+(int c, const AString &s); +void operator+(unsigned c, const AString &s); +void operator-(const AString &s, int c); +void operator-(const AString &s, unsigned c); + + +class UString +{ + wchar_t *_chars; + unsigned _len; + unsigned _limit; + + void MoveItems(unsigned dest, unsigned src) + { + memmove(_chars + dest, _chars + src, (size_t)(_len - src + 1) * sizeof(wchar_t)); + } + + void InsertSpace(unsigned index, unsigned size); + + void ReAlloc(unsigned newLimit); + void ReAlloc2(unsigned newLimit); + void SetStartLen(unsigned len); + void Grow_1(); + void Grow(unsigned n); + + UString(unsigned num, const wchar_t *s); // for Mid + UString(unsigned num, const UString &s); // for Left + UString(const UString &s, wchar_t c); // it's for String + char + UString(const wchar_t *s1, unsigned num1, const wchar_t *s2, unsigned num2); + + friend UString operator+(const UString &s, wchar_t c) { return UString(s, c); } ; + // friend UString operator+(wchar_t c, const UString &s); // is not supported + + friend UString operator+(const UString &s1, const UString &s2); + friend UString operator+(const UString &s1, const wchar_t *s2); + friend UString operator+(const wchar_t *s1, const UString &s2); + + // ---------- forbidden functions ---------- + + UString &operator+=(char c); + UString &operator+=(unsigned char c); + UString &operator=(char c); + UString &operator=(unsigned char c); + UString(char c); + UString(unsigned char c); + void Find(char c) const; + void Find(unsigned char c) const; + void Find(char c, unsigned startIndex) const; + void Find(unsigned char c, unsigned startIndex) const; + void ReverseFind(char c) const; + void ReverseFind(unsigned char c) const; + void InsertAtFront(char c); + void InsertAtFront(unsigned char c); + void RemoveChar(char ch); + void RemoveChar(unsigned char ch); + void Replace(char oldChar, char newChar); + void Replace(unsigned char oldChar, unsigned char newChar); + +public: + UString(); + UString(wchar_t c); + UString(const wchar_t *s); + UString(const UString &s); + ~UString() { MY_STRING_DELETE(_chars); } + + unsigned Len() const { return _len; } + bool IsEmpty() const { return _len == 0; } + void Empty() { _len = 0; _chars[0] = 0; } + + operator const wchar_t *() const { return _chars; } + const wchar_t *Ptr() const { return _chars; } + const wchar_t *Ptr(unsigned pos) const { return _chars + pos; } + const wchar_t *RightPtr(unsigned num) const { return _chars + _len - num; } + wchar_t Back() const { return _chars[_len - 1]; } + + void ReplaceOneCharAtPos(unsigned pos, wchar_t c) { _chars[pos] = c; } + + wchar_t *GetBuf(unsigned minLen) + { + if (minLen > _limit) + ReAlloc2(minLen); + return _chars; + } + wchar_t *GetBuf_SetEnd(unsigned minLen) + { + if (minLen > _limit) + ReAlloc2(minLen); + wchar_t *chars = _chars; + chars[minLen] = 0; + _len = minLen; + return chars; + } + + void ReleaseBuf_SetLen(unsigned newLen) { _len = newLen; } + void ReleaseBuf_SetEnd(unsigned newLen) { _len = newLen; _chars[newLen] = 0; } + void ReleaseBuf_CalcLen(unsigned maxLen) + { + wchar_t *chars = _chars; + chars[maxLen] = 0; + _len = MyStringLen(chars); + } + + UString &operator=(wchar_t c); + UString &operator=(const wchar_t *s); + UString &operator=(const UString &s); + void SetFromBstr(BSTR s); + + UString &operator+=(wchar_t c) + { + if (_limit == _len) + Grow_1(); + unsigned len = _len; + wchar_t *chars = _chars; + chars[len++] = c; + chars[len] = 0; + _len = len; + return *this; + } + + void Add_Space(); + void Add_Space_if_NotEmpty(); + void Add_LF(); + void Add_PathSepar() { operator+=(WCHAR_PATH_SEPARATOR); } + + UString &operator+=(const wchar_t *s); + UString &operator+=(const UString &s); + + void SetFrom(const wchar_t *s, unsigned len); // no check + + void SetFromAscii(const char *s); + void AddAscii(const char *s); + + UString Mid(unsigned startIndex, unsigned count) const { return UString(count, _chars + startIndex); } + UString Left(unsigned count) const { return UString(count, *this); } + + // void MakeUpper() { MyStringUpper(_chars); } + // void MakeUpper() { MyStringUpper_Ascii(_chars); } + // void MakeUpper_Ascii() { MyStringUpper_Ascii(_chars); } + void MakeLower_Ascii() { MyStringLower_Ascii(_chars); } + + bool IsEqualTo(const char *s) const { return StringsAreEqual_Ascii(_chars, s); } + bool IsEqualTo_NoCase(const wchar_t *s) const { return StringsAreEqualNoCase(_chars, s); } + bool IsEqualTo_Ascii_NoCase(const char *s) const { return StringsAreEqualNoCase_Ascii(_chars, s); } + int Compare(const wchar_t *s) const { return wcscmp(_chars, s); } + // int Compare(const UString &s) const { return MyStringCompare(_chars, s._chars); } + // int CompareNoCase(const wchar_t *s) const { return MyStringCompareNoCase(_chars, s); } + // int CompareNoCase(const UString &s) const { return MyStringCompareNoCase(_chars, s._chars); } + bool IsPrefixedBy(const wchar_t *s) const { return IsString1PrefixedByString2(_chars, s); } + bool IsPrefixedBy_NoCase(const wchar_t *s) const { return IsString1PrefixedByString2_NoCase(_chars, s); } + bool IsPrefixedBy_Ascii_NoCase(const char *s) const throw(); + + bool IsAscii() const + { + unsigned len = Len(); + const wchar_t *s = _chars; + for (unsigned i = 0; i < len; i++) + if (s[i] >= 0x80) + return false; + return true; + } + int Find(wchar_t c) const { return FindCharPosInString(_chars, c); } + int Find(wchar_t c, unsigned startIndex) const + { + int pos = FindCharPosInString(_chars + startIndex, c); + return pos < 0 ? -1 : (int)startIndex + pos; + } + + int ReverseFind(wchar_t c) const throw(); + int ReverseFind_Dot() const throw() { return ReverseFind(L'.'); } + int ReverseFind_PathSepar() const throw(); + + int Find(const wchar_t *s) const { return Find(s, 0); } + int Find(const wchar_t *s, unsigned startIndex) const throw(); + + void TrimLeft() throw(); + void TrimRight() throw(); + void Trim() + { + TrimRight(); + TrimLeft(); + } + + void InsertAtFront(wchar_t c); + // void Insert(unsigned index, wchar_t c); + void Insert(unsigned index, const wchar_t *s); + void Insert(unsigned index, const UString &s); + + void RemoveChar(wchar_t ch) throw(); + + void Replace(wchar_t oldChar, wchar_t newChar) throw(); + void Replace(const UString &oldString, const UString &newString); + + void Delete(unsigned index) throw(); + void Delete(unsigned index, unsigned count) throw(); + void DeleteFrontal(unsigned num) throw(); + void DeleteBack() { _chars[--_len] = 0; } + void DeleteFrom(unsigned index) + { + if (index < _len) + { + _len = index; + _chars[index] = 0; + } + } +}; + +bool operator<(const UString &s1, const UString &s2); +bool operator>(const UString &s1, const UString &s2); + +inline bool operator==(const UString &s1, const UString &s2) { return s1.Len() == s2.Len() && wcscmp(s1, s2) == 0; } +inline bool operator==(const UString &s1, const wchar_t *s2) { return wcscmp(s1, s2) == 0; } +inline bool operator==(const wchar_t *s1, const UString &s2) { return wcscmp(s1, s2) == 0; } + +inline bool operator!=(const UString &s1, const UString &s2) { return s1.Len() != s2.Len() || wcscmp(s1, s2) != 0; } +inline bool operator!=(const UString &s1, const wchar_t *s2) { return wcscmp(s1, s2) != 0; } +inline bool operator!=(const wchar_t *s1, const UString &s2) { return wcscmp(s1, s2) != 0; } + + +// ---------- forbidden functions ---------- + +void operator==(wchar_t c1, const UString &s2); +void operator==(const UString &s1, wchar_t c2); + +void operator+(wchar_t c, const UString &s); // this function can be OK, but we don't use it + +void operator+(const UString &s, char c); +void operator+(const UString &s, unsigned char c); +void operator+(char c, const UString &s); +void operator+(unsigned char c, const UString &s); +void operator-(const UString &s1, wchar_t c); + +#ifdef _WIN32 +// can we forbid these functions, if wchar_t is 32-bit ? +void operator+(const UString &s, int c); +void operator+(const UString &s, unsigned c); +void operator+(int c, const UString &s); +void operator+(unsigned c, const UString &s); +void operator-(const UString &s1, int c); +void operator-(const UString &s1, unsigned c); +#endif + + + + + + + +class UString2 +{ + wchar_t *_chars; + unsigned _len; + + void ReAlloc2(unsigned newLimit); + void SetStartLen(unsigned len); + + // ---------- forbidden functions ---------- + + UString2 &operator=(char c); + UString2 &operator=(unsigned char c); + UString2 &operator=(wchar_t c); + UString2(char c); + UString2(unsigned char c); + +public: + UString2(): _chars(NULL), _len(0) {} + // UString2(wchar_t c); + UString2(const wchar_t *s); + UString2(const UString2 &s); + ~UString2() { if (_chars) MY_STRING_DELETE(_chars); } + + unsigned Len() const { return _len; } + bool IsEmpty() const { return _len == 0; } + // void Empty() { _len = 0; _chars[0] = 0; } + + // operator const wchar_t *() const { return _chars; } + const wchar_t *GetRawPtr() const { return _chars; } + + wchar_t *GetBuf(unsigned minLen) + { + if (!_chars || minLen > _len) + ReAlloc2(minLen); + return _chars; + } + void ReleaseBuf_SetLen(unsigned newLen) { _len = newLen; } + + UString2 &operator=(const wchar_t *s); + UString2 &operator=(const UString2 &s); + void SetFromAscii(const char *s); +}; + +bool operator==(const UString2 &s1, const UString2 &s2); +bool operator==(const UString2 &s1, const wchar_t *s2); +bool operator==(const wchar_t *s1, const UString2 &s2); + +inline bool operator!=(const UString2 &s1, const UString2 &s2) { return !(s1 == s2); } +inline bool operator!=(const UString2 &s1, const wchar_t *s2) { return !(s1 == s2); } +inline bool operator!=(const wchar_t *s1, const UString2 &s2) { return !(s1 == s2); } + + +// ---------- forbidden functions ---------- + +void operator==(wchar_t c1, const UString2 &s2); +void operator==(const UString2 &s1, wchar_t c2); +bool operator<(const UString2 &s1, const UString2 &s2); +bool operator>(const UString2 &s1, const UString2 &s2); + +void operator+(const UString2 &s1, const UString2 &s2); +void operator+(const UString2 &s1, const wchar_t *s2); +void operator+(const wchar_t *s1, const UString2 &s2); +void operator+(wchar_t c, const UString2 &s); +void operator+(const UString2 &s, wchar_t c); +void operator+(const UString2 &s, char c); +void operator+(const UString2 &s, unsigned char c); +void operator+(char c, const UString2 &s); +void operator+(unsigned char c, const UString2 &s); +void operator-(const UString2 &s1, wchar_t c); + + + + + + +typedef CObjectVector AStringVector; +typedef CObjectVector UStringVector; + +#ifdef _UNICODE + typedef UString CSysString; +#else + typedef AString CSysString; +#endif + +typedef CObjectVector CSysStringVector; + + +// ---------- FString ---------- + +#ifdef _WIN32 + #define USE_UNICODE_FSTRING +#endif + +#ifdef USE_UNICODE_FSTRING + + #define __FTEXT(quote) L##quote + + typedef wchar_t FChar; + typedef UString FString; + + #define fs2us(_x_) (_x_) + #define us2fs(_x_) (_x_) + FString fas2fs(const AString &s); + AString fs2fas(const FChar *s); + +#else + + #define __FTEXT(quote) quote + + typedef char FChar; + typedef AString FString; + + UString fs2us(const FString &s); + FString us2fs(const wchar_t *s); + #define fas2fs(_x_) (_x_) + #define fs2fas(_x_) (_x_) + +#endif + +#define FTEXT(quote) __FTEXT(quote) + +#define FCHAR_PATH_SEPARATOR FTEXT(CHAR_PATH_SEPARATOR) +#define FSTRING_PATH_SEPARATOR FTEXT(STRING_PATH_SEPARATOR) +#define FCHAR_ANY_MASK FTEXT('*') +#define FSTRING_ANY_MASK FTEXT("*") +typedef const FChar *CFSTR; + +typedef CObjectVector FStringVector; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyTypes.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyTypes.h new file mode 100644 index 0000000000..6e73aca31e --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyTypes.h @@ -0,0 +1,35 @@ +// Common/MyTypes.h + +#ifndef __COMMON_MY_TYPES_H +#define __COMMON_MY_TYPES_H + +#include "../../C/7zTypes.h" + +typedef int HRes; + +struct CBoolPair +{ + bool Val; + bool Def; + + CBoolPair(): Val(false), Def(false) {} + + void Init() + { + Val = false; + Def = false; + } + + void SetTrueTrue() + { + Val = true; + Def = true; + } +}; + +#define CLASS_NO_COPY(cls) \ + private: \ + cls(const cls &); \ + cls &operator=(const cls &); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyUnknown.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyUnknown.h new file mode 100644 index 0000000000..b1d476ffb8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyUnknown.h @@ -0,0 +1,17 @@ +// MyUnknown.h + +#ifndef __MY_UNKNOWN_H +#define __MY_UNKNOWN_H + +#include "MyWindows.h" + +/* +#ifdef _WIN32 +#include +#include +#else +#include "MyWindows.h" +#endif +*/ + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyVector.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyVector.cpp new file mode 100644 index 0000000000..9a6d1d5aee --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyVector.cpp @@ -0,0 +1,3 @@ +// Common/MyVector.cpp + +#include "StdAfx.h" diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyVector.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyVector.h new file mode 100644 index 0000000000..4bc91d5094 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyVector.h @@ -0,0 +1,626 @@ +// Common/MyVector.h + +#ifndef __COMMON_MY_VECTOR_H +#define __COMMON_MY_VECTOR_H + +#include + +template +class CRecordVector +{ + T *_items; + unsigned _size; + unsigned _capacity; + + void MoveItems(unsigned destIndex, unsigned srcIndex) + { + memmove(_items + destIndex, _items + srcIndex, (size_t)(_size - srcIndex) * sizeof(T)); + } + + void ReserveOnePosition() + { + if (_size == _capacity) + { + unsigned newCapacity = _capacity + (_capacity >> 2) + 1; + T *p = new T[newCapacity]; + if (_size != 0) + memcpy(p, _items, (size_t)_size * sizeof(T)); + delete []_items; + _items = p; + _capacity = newCapacity; + } + } + +public: + + CRecordVector(): _items(0), _size(0), _capacity(0) {} + + CRecordVector(const CRecordVector &v): _items(0), _size(0), _capacity(0) + { + unsigned size = v.Size(); + if (size != 0) + { + _items = new T[size]; + _size = size; + _capacity = size; + memcpy(_items, v._items, (size_t)size * sizeof(T)); + } + } + + unsigned Size() const { return _size; } + bool IsEmpty() const { return _size == 0; } + + void ConstructReserve(unsigned size) + { + if (size != 0) + { + _items = new T[size]; + _capacity = size; + } + } + + void Reserve(unsigned newCapacity) + { + if (newCapacity > _capacity) + { + T *p = new T[newCapacity]; + if (_size != 0) + memcpy(p, _items, (size_t)_size * sizeof(T)); + delete []_items; + _items = p; + _capacity = newCapacity; + } + } + + void ClearAndReserve(unsigned newCapacity) + { + Clear(); + if (newCapacity > _capacity) + { + delete []_items; + _items = NULL; + _capacity = 0; + _items = new T[newCapacity]; + _capacity = newCapacity; + } + } + + void ClearAndSetSize(unsigned newSize) + { + ClearAndReserve(newSize); + _size = newSize; + } + + void ChangeSize_KeepData(unsigned newSize) + { + if (newSize > _capacity) + { + T *p = new T[newSize]; + if (_size != 0) + memcpy(p, _items, (size_t)_size * sizeof(T)); + delete []_items; + _items = p; + _capacity = newSize; + } + _size = newSize; + } + + void ReserveDown() + { + if (_size == _capacity) + return; + T *p = NULL; + if (_size != 0) + { + p = new T[_size]; + memcpy(p, _items, (size_t)_size * sizeof(T)); + } + delete []_items; + _items = p; + _capacity = _size; + } + + ~CRecordVector() { delete []_items; } + + void ClearAndFree() + { + delete []_items; + _items = NULL; + _size = 0; + _capacity = 0; + } + + void Clear() { _size = 0; } + + void DeleteBack() { _size--; } + + void DeleteFrom(unsigned index) + { + // if (index <= _size) + _size = index; + } + + void DeleteFrontal(unsigned num) + { + if (num != 0) + { + MoveItems(0, num); + _size -= num; + } + } + + void Delete(unsigned index) + { + MoveItems(index, index + 1); + _size -= 1; + } + + /* + void Delete(unsigned index, unsigned num) + { + if (num > 0) + { + MoveItems(index, index + num); + _size -= num; + } + } + */ + + CRecordVector& operator=(const CRecordVector &v) + { + if (&v == this) + return *this; + unsigned size = v.Size(); + if (size > _capacity) + { + delete []_items; + _capacity = 0; + _size = 0; + _items = NULL; + _items = new T[size]; + _capacity = size; + } + _size = size; + if (size != 0) + memcpy(_items, v._items, (size_t)size * sizeof(T)); + return *this; + } + + CRecordVector& operator+=(const CRecordVector &v) + { + unsigned size = v.Size(); + Reserve(_size + size); + if (size != 0) + memcpy(_items + _size, v._items, (size_t)size * sizeof(T)); + _size += size; + return *this; + } + + unsigned Add(const T item) + { + ReserveOnePosition(); + _items[_size] = item; + return _size++; + } + + void AddInReserved(const T item) + { + _items[_size++] = item; + } + + void Insert(unsigned index, const T item) + { + ReserveOnePosition(); + MoveItems(index + 1, index); + _items[index] = item; + _size++; + } + + void MoveToFront(unsigned index) + { + if (index != 0) + { + T temp = _items[index]; + memmove(_items + 1, _items, (size_t)index * sizeof(T)); + _items[0] = temp; + } + } + + const T& operator[](unsigned index) const { return _items[index]; } + T& operator[](unsigned index) { return _items[index]; } + const T& Front() const { return _items[0]; } + T& Front() { return _items[0]; } + const T& Back() const { return _items[_size - 1]; } + T& Back() { return _items[_size - 1]; } + + /* + void Swap(unsigned i, unsigned j) + { + T temp = _items[i]; + _items[i] = _items[j]; + _items[j] = temp; + } + */ + + int FindInSorted(const T item, unsigned left, unsigned right) const + { + while (left != right) + { + unsigned mid = (left + right) / 2; + const T midVal = (*this)[mid]; + if (item == midVal) + return mid; + if (item < midVal) + right = mid; + else + left = mid + 1; + } + return -1; + } + + int FindInSorted2(const T &item, unsigned left, unsigned right) const + { + while (left != right) + { + unsigned mid = (left + right) / 2; + const T& midVal = (*this)[mid]; + int comp = item.Compare(midVal); + if (comp == 0) + return mid; + if (comp < 0) + right = mid; + else + left = mid + 1; + } + return -1; + } + + int FindInSorted(const T item) const + { + return FindInSorted(item, 0, _size); + } + + int FindInSorted2(const T &item) const + { + return FindInSorted2(item, 0, _size); + } + + unsigned AddToUniqueSorted(const T item) + { + unsigned left = 0, right = _size; + while (left != right) + { + unsigned mid = (left + right) / 2; + const T midVal = (*this)[mid]; + if (item == midVal) + return mid; + if (item < midVal) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + unsigned AddToUniqueSorted2(const T &item) + { + unsigned left = 0, right = _size; + while (left != right) + { + unsigned mid = (left + right) / 2; + const T& midVal = (*this)[mid]; + int comp = item.Compare(midVal); + if (comp == 0) + return mid; + if (comp < 0) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + static void SortRefDown(T* p, unsigned k, unsigned size, int (*compare)(const T*, const T*, void *), void *param) + { + T temp = p[k]; + for (;;) + { + unsigned s = (k << 1); + if (s > size) + break; + if (s < size && compare(p + s + 1, p + s, param) > 0) + s++; + if (compare(&temp, p + s, param) >= 0) + break; + p[k] = p[s]; + k = s; + } + p[k] = temp; + } + + void Sort(int (*compare)(const T*, const T*, void *), void *param) + { + unsigned size = _size; + if (size <= 1) + return; + T* p = (&Front()) - 1; + { + unsigned i = size >> 1; + do + SortRefDown(p, i, size, compare, param); + while (--i != 0); + } + do + { + T temp = p[size]; + p[size--] = p[1]; + p[1] = temp; + SortRefDown(p, 1, size, compare, param); + } + while (size > 1); + } + + static void SortRefDown2(T* p, unsigned k, unsigned size) + { + T temp = p[k]; + for (;;) + { + unsigned s = (k << 1); + if (s > size) + break; + if (s < size && p[s + 1].Compare(p[s]) > 0) + s++; + if (temp.Compare(p[s]) >= 0) + break; + p[k] = p[s]; + k = s; + } + p[k] = temp; + } + + void Sort2() + { + unsigned size = _size; + if (size <= 1) + return; + T* p = (&Front()) - 1; + { + unsigned i = size >> 1; + do + SortRefDown2(p, i, size); + while (--i != 0); + } + do + { + T temp = p[size]; + p[size--] = p[1]; + p[1] = temp; + SortRefDown2(p, 1, size); + } + while (size > 1); + } +}; + +typedef CRecordVector CIntVector; +typedef CRecordVector CUIntVector; +typedef CRecordVector CBoolVector; +typedef CRecordVector CByteVector; +typedef CRecordVector CPointerVector; + +template +class CObjectVector +{ + CPointerVector _v; +public: + unsigned Size() const { return _v.Size(); } + bool IsEmpty() const { return _v.IsEmpty(); } + void ReserveDown() { _v.ReserveDown(); } + // void Reserve(unsigned newCapacity) { _v.Reserve(newCapacity); } + void ClearAndReserve(unsigned newCapacity) { Clear(); _v.ClearAndReserve(newCapacity); } + + CObjectVector() {}; + CObjectVector(const CObjectVector &v) + { + unsigned size = v.Size(); + _v.ConstructReserve(size); + for (unsigned i = 0; i < size; i++) + _v.AddInReserved(new T(v[i])); + } + CObjectVector& operator=(const CObjectVector &v) + { + if (&v == this) + return *this; + Clear(); + unsigned size = v.Size(); + _v.Reserve(size); + for (unsigned i = 0; i < size; i++) + _v.AddInReserved(new T(v[i])); + return *this; + } + + CObjectVector& operator+=(const CObjectVector &v) + { + unsigned size = v.Size(); + _v.Reserve(Size() + size); + for (unsigned i = 0; i < size; i++) + _v.AddInReserved(new T(v[i])); + return *this; + } + + const T& operator[](unsigned index) const { return *((T *)_v[index]); } + T& operator[](unsigned index) { return *((T *)_v[index]); } + const T& Front() const { return operator[](0); } + T& Front() { return operator[](0); } + const T& Back() const { return operator[](_v.Size() - 1); } + T& Back() { return operator[](_v.Size() - 1); } + + void MoveToFront(unsigned index) { _v.MoveToFront(index); } + + unsigned Add(const T& item) { return _v.Add(new T(item)); } + + void AddInReserved(const T& item) { _v.AddInReserved(new T(item)); } + + T& AddNew() + { + T *p = new T; + _v.Add(p); + return *p; + } + + T& AddNewInReserved() + { + T *p = new T; + _v.AddInReserved(p); + return *p; + } + + void Insert(unsigned index, const T& item) { _v.Insert(index, new T(item)); } + + T& InsertNew(unsigned index) + { + T *p = new T; + _v.Insert(index, p); + return *p; + } + + ~CObjectVector() + { + for (unsigned i = _v.Size(); i != 0;) + delete (T *)_v[--i]; + } + + void ClearAndFree() + { + Clear(); + _v.ClearAndFree(); + } + + void Clear() + { + for (unsigned i = _v.Size(); i != 0;) + delete (T *)_v[--i]; + _v.Clear(); + } + + void DeleteFrom(unsigned index) + { + unsigned size = _v.Size(); + for (unsigned i = index; i < size; i++) + delete (T *)_v[i]; + _v.DeleteFrom(index); + } + + void DeleteFrontal(unsigned num) + { + for (unsigned i = 0; i < num; i++) + delete (T *)_v[i]; + _v.DeleteFrontal(num); + } + + void DeleteBack() + { + delete (T *)_v[_v.Size() - 1]; + _v.DeleteBack(); + } + + void Delete(unsigned index) + { + delete (T *)_v[index]; + _v.Delete(index); + } + + /* + void Delete(unsigned index, unsigned num) + { + for (unsigned i = 0; i < num; i++) + delete (T *)_v[index + i]; + _v.Delete(index, num); + } + */ + + /* + int Find(const T& item) const + { + unsigned size = Size(); + for (unsigned i = 0; i < size; i++) + if (item == (*this)[i]) + return i; + return -1; + } + */ + + int FindInSorted(const T& item) const + { + unsigned left = 0, right = Size(); + while (left != right) + { + unsigned mid = (left + right) / 2; + const T& midVal = (*this)[mid]; + int comp = item.Compare(midVal); + if (comp == 0) + return mid; + if (comp < 0) + right = mid; + else + left = mid + 1; + } + return -1; + } + + unsigned AddToUniqueSorted(const T& item) + { + unsigned left = 0, right = Size(); + while (left != right) + { + unsigned mid = (left + right) / 2; + const T& midVal = (*this)[mid]; + int comp = item.Compare(midVal); + if (comp == 0) + return mid; + if (comp < 0) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + + /* + unsigned AddToSorted(const T& item) + { + unsigned left = 0, right = Size(); + while (left != right) + { + unsigned mid = (left + right) / 2; + const T& midVal = (*this)[mid]; + int comp = item.Compare(midVal); + if (comp == 0) + { + right = mid + 1; + break; + } + if (comp < 0) + right = mid; + else + left = mid + 1; + } + Insert(right, item); + return right; + } + */ + + void Sort(int (*compare)(void *const *, void *const *, void *), void *param) + { _v.Sort(compare, param); } + + static int CompareObjectItems(void *const *a1, void *const *a2, void * /* param */) + { return (*(*((const T **)a1))).Compare(*(*((const T **)a2))); } + + void Sort() { _v.Sort(CompareObjectItems, 0); } +}; + +#define FOR_VECTOR(_i_, _v_) for (unsigned _i_ = 0; _i_ < (_v_).Size(); _i_++) + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyWindows.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyWindows.cpp new file mode 100644 index 0000000000..b26012f081 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyWindows.cpp @@ -0,0 +1,282 @@ +// MyWindows.cpp + +#include "StdAfx.h" + +#ifndef _WIN32 + +#include + +#include "MyWindows.h" + +#if defined(__APPLE__) +#include "Synchronization.h" +#endif + +static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); } +static inline void FreeForBSTR(void *pv) { ::free(pv);} + +/* Win32 uses DWORD (32-bit) type to store size of string before (OLECHAR *) string. + We must select CBstrSizeType for another systems (not Win32): + + if (CBstrSizeType is UINT32), + then we support only strings smaller than 4 GB. + Win32 version always has that limitation. + + if (CBstrSizeType is UINT), + (UINT can be 16/32/64-bit) + We can support strings larger than 4 GB (if UINT is 64-bit), + but sizeof(UINT) can be different in parts compiled by + different compilers/settings, + and we can't send such BSTR strings between such parts. + */ + +typedef UINT32 CBstrSizeType; +// typedef UINT CBstrSizeType; + +#define k_BstrSize_Max 0xFFFFFFFF +// #define k_BstrSize_Max UINT_MAX +// #define k_BstrSize_Max ((UINT)(INT)-1) + +BSTR SysAllocStringByteLen(LPCSTR s, UINT len) +{ + /* Original SysAllocStringByteLen in Win32 maybe fills only unaligned null OLECHAR at the end. + We provide also aligned null OLECHAR at the end. */ + + if (len >= (k_BstrSize_Max - sizeof(OLECHAR) - sizeof(OLECHAR) - sizeof(CBstrSizeType))) + return NULL; + + UINT size = (len + sizeof(OLECHAR) + sizeof(OLECHAR) - 1) & ~(sizeof(OLECHAR) - 1); + void *p = AllocateForBSTR(size + sizeof(CBstrSizeType)); + if (!p) + return NULL; + *(CBstrSizeType *)p = (CBstrSizeType)len; + BSTR bstr = (BSTR)((CBstrSizeType *)p + 1); + if (s) + memcpy(bstr, s, len); + for (; len < size; len++) + ((Byte *)bstr)[len] = 0; + return bstr; +} + +BSTR SysAllocStringLen(const OLECHAR *s, UINT len) +{ + if (len >= (k_BstrSize_Max - sizeof(OLECHAR) - sizeof(CBstrSizeType)) / sizeof(OLECHAR)) + return NULL; + + UINT size = len * sizeof(OLECHAR); + void *p = AllocateForBSTR(size + sizeof(CBstrSizeType) + sizeof(OLECHAR)); + if (!p) + return NULL; + *(CBstrSizeType *)p = (CBstrSizeType)size; + BSTR bstr = (BSTR)((CBstrSizeType *)p + 1); + if (s) + memcpy(bstr, s, size); + bstr[len] = 0; + return bstr; +} + +BSTR SysAllocString(const OLECHAR *s) +{ + if (!s) + return 0; + const OLECHAR *s2 = s; + while (*s2 != 0) + s2++; + return SysAllocStringLen(s, (UINT)(s2 - s)); +} + +void SysFreeString(BSTR bstr) +{ + if (bstr) + FreeForBSTR((CBstrSizeType *)bstr - 1); +} + +UINT SysStringByteLen(BSTR bstr) +{ + if (!bstr) + return 0; + return *((CBstrSizeType *)bstr - 1); +} + +UINT SysStringLen(BSTR bstr) +{ + if (!bstr) + return 0; + return *((CBstrSizeType *)bstr - 1) / sizeof(OLECHAR); +} + + +HRESULT VariantClear(VARIANTARG *prop) +{ + if (prop->vt == VT_BSTR) + SysFreeString(prop->bstrVal); + prop->vt = VT_EMPTY; + return S_OK; +} + +HRESULT VariantCopy(VARIANTARG *dest, const VARIANTARG *src) +{ + HRESULT res = ::VariantClear(dest); + if (res != S_OK) + return res; + if (src->vt == VT_BSTR) + { + dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal, + SysStringByteLen(src->bstrVal)); + if (!dest->bstrVal) + return E_OUTOFMEMORY; + dest->vt = VT_BSTR; + } + else + *dest = *src; + return S_OK; +} + +LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2) +{ + if (ft1->dwHighDateTime < ft2->dwHighDateTime) return -1; + if (ft1->dwHighDateTime > ft2->dwHighDateTime) return 1; + if (ft1->dwLowDateTime < ft2->dwLowDateTime) return -1; + if (ft1->dwLowDateTime > ft2->dwLowDateTime) return 1; + return 0; +} + +#if defined(__APPLE__) +static NWindows::NSynchronization::CCriticalSection gbl_criticalSection; + +#define myEnter() gbl_criticalSection.Enter() +#define myLeave() gbl_criticalSection.Leave() +#define myYield() gbl_criticalSection.WaitCond() + +DWORD WINAPI WaitForMultipleObjects(DWORD count, const HANDLE *handles, Bool wait_all, DWORD timeout) +{ + unsigned int wait_count = 1; + unsigned int wait_delta = 0; + + switch (timeout) + { + case 0 : wait_delta = 1; break; // trick - one "while" + case INFINITE : wait_delta = 0; break; // trick - infinite "while" + default: + printf("\n\n INTERNAL ERROR - WaitForMultipleObjects(...) timeout(%u) != 0 or INFINITE\n\n",(unsigned)timeout); + abort(); + } + + myEnter(); + if (wait_all) { + while(wait_count) { + bool found_all = true; + for(DWORD i=0;itype) + { + case NWindows::NSynchronization::CBaseHandle::EVENT : + if (hitem->u.event._state == false) { + found_all = false; + } + break; + case NWindows::NSynchronization::CBaseHandle::SEMAPHORE : + if (hitem->u.sema.count == 0) { + found_all = false; + } + break; + default: + printf("\n\n INTERNAL ERROR - WaitForMultipleObjects(...,true) with unknown type (%d)\n\n",hitem->type); + abort(); + } + } + if (found_all) { + for(DWORD i=0;itype) + { + case NWindows::NSynchronization::CBaseHandle::EVENT : + if (hitem->u.event._manual_reset == false) { + hitem->u.event._state = false; + } + break; + case NWindows::NSynchronization::CBaseHandle::SEMAPHORE : + hitem->u.sema.count--; + break; + default: + printf("\n\n INTERNAL ERROR - WaitForMultipleObjects(...,true) with unknown type (%d)\n\n",hitem->type); + abort(); + } + } + myLeave(); + return WAIT_OBJECT_0; + } else { + wait_count -= wait_delta; + if (wait_count) myYield(); + } + } + } else { + while(wait_count) { + for(DWORD i=0;itype) + { + case NWindows::NSynchronization::CBaseHandle::EVENT : + if (hitem->u.event._state == true) { + if (hitem->u.event._manual_reset == false) { + hitem->u.event._state = false; + } + myLeave(); + return WAIT_OBJECT_0+i; + } + break; + case NWindows::NSynchronization::CBaseHandle::SEMAPHORE : + if (hitem->u.sema.count > 0) { + hitem->u.sema.count--; + myLeave(); + return WAIT_OBJECT_0+i; + } + break; + default: + printf("\n\n INTERNAL ERROR - WaitForMultipleObjects(...,true) with unknown type (%d)\n\n",hitem->type); + abort(); + } + } + wait_count -= wait_delta; + if (wait_count) myYield(); + } + } + myLeave(); + return WAIT_TIMEOUT; +} + +Bool WINAPI RtlTimeToSecondsSince1970(const LARGE_INTEGER *Time, DWORD *Seconds) +{ + ULONGLONG tmp = Time->QuadPart; + // TRACEN((printf("RtlTimeToSecondsSince1970-1 %llx\n",tmp))) + tmp /= TICKSPERSEC; + tmp -= SECS_1601_TO_1970; + // TRACEN((printf("RtlTimeToSecondsSince1970-2 %llx\n",tmp))) + if (tmp > 0xffffffff) return FALSE; + *Seconds = (DWORD)tmp; + return TRUE; +} + +DWORD WINAPI GetTickCount(void) +{ + // fprintf(stdout, "DWORD WINAPI GetTickCount \n"); + struct timeval tv; + if(gettimeofday(&tv, NULL) != 0) + return 0; + return DWORD(tv.tv_sec * 1000) + (tv.tv_usec / 1000); +} + +#else + +#endif + +DWORD GetLastError() +{ + return 0; +} + +#endif + diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyWindows.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyWindows.h new file mode 100644 index 0000000000..b9a1b76366 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/MyWindows.h @@ -0,0 +1,417 @@ +// MyWindows.h + +#ifndef __MY_WINDOWS_H +#define __MY_WINDOWS_H + +#include "../../../src/LzmaAppleCommon.h" + +#ifdef _WIN32 + +#include + +#ifdef UNDER_CE +#undef VARIANT_TRUE +#define VARIANT_TRUE ((VARIANT_BOOL)-1) +#endif + +#else + +#include // for wchar_t +#include + +#include "MyGuidDef.h" + +#define WINAPI + +typedef char CHAR; +typedef unsigned char UCHAR; + +#undef BYTE +typedef unsigned char BYTE; + +typedef short SHORT; +typedef unsigned short USHORT; + +#undef WORD +typedef unsigned short WORD; +typedef short VARIANT_BOOL; + +typedef int INT; +typedef Int32 INT32; +typedef unsigned int UINT; +typedef UInt32 UINT32; +typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit +typedef UINT32 ULONG; + +#undef DWORD + +#if defined(__APPLE__) +#ifndef DWORD_SIZE +#define DWORD_SIZE 4 +typedef uint32_t DWORD; +#endif +#else +typedef UINT32 DWORD; +#endif + +typedef Int64 LONGLONG; +typedef UInt64 ULONGLONG; +typedef UInt64 UINT64; +typedef Int64 INT64; + +typedef struct _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER; +typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart; } ULARGE_INTEGER; + +typedef const CHAR *LPCSTR; +typedef CHAR TCHAR; +typedef const TCHAR *LPCTSTR; +typedef wchar_t WCHAR; +typedef WCHAR OLECHAR; +typedef const WCHAR *LPCWSTR; +typedef OLECHAR *BSTR; +typedef const OLECHAR *LPCOLESTR; +typedef OLECHAR *LPOLESTR; + +#if defined(__APPLE__) +typedef CHAR *LPSTR; +typedef DWORD *LPDWORD; +typedef TCHAR *LPTSTR; +#if defined(__APPLE_64__) +typedef uint64_t ULONG_PTR; +#else +typedef unsigned long ULONG_PTR; +#endif +typedef ULONG_PTR DWORD_PTR; +#endif + +typedef struct _FILETIME +{ + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME; + +#if defined(__APPLE__) +typedef struct _BY_HANDLE_FILE_INFORMATION { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD dwVolumeSerialNumber; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD nNumberOfLinks; + DWORD nFileIndexHigh; + DWORD nFileIndexLow; +} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION; + +//typedef struct _OVERLAPPED { +// ULONG_PTR Internal; +// ULONG_PTR InternalHigh; +// union { +// struct { +// DWORD Offset; +// DWORD OffsetHigh; +// }; +// PVOID Pointer; +// }; +// HANDLE hEvent; +//} OVERLAPPED, *LPOVERLAPPED; +typedef enum _MEDIA_TYPE { + Unknown = 0x00, + F5_1Pt2_512 = 0x01, + F3_1Pt44_512 = 0x02, + F3_2Pt88_512 = 0x03, + F3_20Pt8_512 = 0x04, + F3_720_512 = 0x05, + F5_360_512 = 0x06, + F5_320_512 = 0x07, + F5_320_1024 = 0x08, + F5_180_512 = 0x09, + F5_160_512 = 0x0a, + RemovableMedia = 0x0b, + FixedMedia = 0x0c, + F3_120M_512 = 0x0d, + F3_640_512 = 0x0e, + F5_640_512 = 0x0f, + F5_720_512 = 0x10, + F3_1Pt2_512 = 0x11, + F3_1Pt23_1024 = 0x12, + F5_1Pt23_1024 = 0x13, + F3_128Mb_512 = 0x14, + F3_230Mb_512 = 0x15, + F8_256_128 = 0x16, + F3_200Mb_512 = 0x17, + F3_240M_512 = 0x18, + F3_32M_512 = 0x19 +} MEDIA_TYPE; +typedef struct _DISK_GEOMETRY { + LARGE_INTEGER Cylinders; + MEDIA_TYPE MediaType; + DWORD TracksPerCylinder; + DWORD SectorsPerTrack; + DWORD BytesPerSector; +} DISK_GEOMETRY; +typedef struct _SYSTEMTIME { + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEMTIME, *PSYSTEMTIME; +#define FILE_ATTRIBUTE_READONLY 1 +#define FILE_ATTRIBUTE_HIDDEN 2 +#define FILE_ATTRIBUTE_SYSTEM 4 +#define FILE_ATTRIBUTE_DIRECTORY 16 +#define FILE_ATTRIBUTE_ARCHIVE 32 +#define FILE_ATTRIBUTE_DEVICE 64 +#define FILE_ATTRIBUTE_NORMAL 128 +#define FILE_ATTRIBUTE_TEMPORARY 256 +#define FILE_ATTRIBUTE_SPARSE_FILE 512 +#define FILE_ATTRIBUTE_REPARSE_POINT 1024 +#define FILE_ATTRIBUTE_COMPRESSED 2048 +#define FILE_ATTRIBUTE_OFFLINE 0x1000 +#define FILE_ATTRIBUTE_ENCRYPTED 0x4000 +#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ +#define INVALID_HANDLE_VALUE 0 +#define STATUS_SUCCESS 0x00000000 + +#define TICKSPERSEC 10000000 +#define TICKSPERMSEC 10000 +#define SECSPERDAY 86400 +#define SECSPERHOUR 3600 +#define SECSPERMIN 60 +#define MINSPERHOUR 60 +#define HOURSPERDAY 24 +#define EPOCHWEEKDAY 1 /* Jan 1, 1601 was Monday */ +#define DAYSPERWEEK 7 +#define EPOCHYEAR 1601 +#define DAYSPERNORMALYEAR 365 +#define DAYSPERLEAPYEAR 366 +#define MONSPERYEAR 12 +#define DAYSPERQUADRICENTENNIUM (365 * 400 + 97) +#define DAYSPERNORMALCENTURY (365 * 100 + 24) +#define DAYSPERNORMALQUADRENNIUM (365 * 4 + 1) + +/* 1601 to 1970 is 369 years plus 89 leap days */ +#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY) +#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC) +/* 1601 to 1980 is 379 years plus 91 leap days */ +#define SECS_1601_TO_1980 ((379 * 365 + 91) * (ULONGLONG)SECSPERDAY) +#define TICKS_1601_TO_1980 (SECS_1601_TO_1980 * TICKSPERSEC) + +#define EBADF 9 // Bad file number +#define EINTR 4 // Interrupted system call +#define NO_ERROR 0L +#define ERROR_ALREADY_EXISTS EEXIST +#define ERROR_FILE_EXISTS EEXIST +#define ERROR_INVALID_HANDLE EBADF +#define ERROR_PATH_NOT_FOUND ENOENT +#define ERROR_DISK_FULL ENOSPC +#define ERROR_NO_MORE_FILES 0x100123 // FIXME +#define WAIT_TIMEOUT ETIMEDOUT +#define WAIT_OBJECT_0 0 +#define INFINITE 0xFFFFFFFF +#define ERROR_NEGATIVE_SEEK 131L +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef MAX_PATHNAME_LEN +#define MAX_PATHNAME_LEN 1024 +#endif + +#ifndef MAX_PATH +#define MAX_PATH MAX_PATHNAME_LEN +#endif + +#endif + + +#define HRESULT LONG +#define FAILED(Status) ((HRESULT)(Status)<0) +typedef ULONG PROPID; +typedef LONG SCODE; + +#define S_OK ((HRESULT)0x00000000L) +#define S_FALSE ((HRESULT)0x00000001L) +#define E_NOTIMPL ((HRESULT)0x80004001L) +#define E_NOINTERFACE ((HRESULT)0x80004002L) +#define E_ABORT ((HRESULT)0x80004004L) +#define E_FAIL ((HRESULT)0x80004005L) +#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) +#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) +#define E_INVALIDARG ((HRESULT)0x80070057L) +#if defined(__APPLE__) +#define CLASS_E_CLASSNOTAVAILABLE ((HRESULT)0x80040111L) + +// +// HRESULT_FROM_WIN32(x) used to be a macro, however we now run it as an inline function +// to prevent double evaluation of 'x'. If you still need the macro, you can use __HRESULT_FROM_WIN32(x) +// +#define __HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000))) +#define FACILITY_WIN32 0x0007 +#ifndef __midl +inline HRESULT HRESULT_FROM_WIN32(unsigned long x) { + return (HRESULT)(x) <= 0 ? (HRESULT)(x) : (HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000); +} +#else +#define HRESULT_FROM_WIN32(x) __HRESULT_FROM_WIN32(x) +#endif + +#endif + +#ifdef _MSC_VER +#define STDMETHODCALLTYPE __stdcall +#else +#define STDMETHODCALLTYPE +#endif + +#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f +#define STDMETHOD(f) STDMETHOD_(HRESULT, f) +#define STDMETHODIMP_(type) type STDMETHODCALLTYPE +#define STDMETHODIMP STDMETHODIMP_(HRESULT) + +#define PURE = 0 + +#define MIDL_INTERFACE(x) struct + +#ifdef __cplusplus + +DEFINE_GUID(IID_IUnknown, + 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); +struct IUnknown +{ + STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE; + STDMETHOD_(ULONG, AddRef)() PURE; + STDMETHOD_(ULONG, Release)() PURE; +#ifndef _WIN32 + virtual ~IUnknown() {} +#endif +}; + +typedef IUnknown *LPUNKNOWN; + +#endif + +#define VARIANT_TRUE ((VARIANT_BOOL)-1) +#define VARIANT_FALSE ((VARIANT_BOOL)0) + +enum VARENUM +{ + VT_EMPTY = 0, + VT_NULL = 1, + VT_I2 = 2, + VT_I4 = 3, + VT_R4 = 4, + VT_R8 = 5, + VT_CY = 6, + VT_DATE = 7, + VT_BSTR = 8, + VT_DISPATCH = 9, + VT_ERROR = 10, + VT_BOOL = 11, + VT_VARIANT = 12, + VT_UNKNOWN = 13, + VT_DECIMAL = 14, + VT_I1 = 16, + VT_UI1 = 17, + VT_UI2 = 18, + VT_UI4 = 19, + VT_I8 = 20, + VT_UI8 = 21, + VT_INT = 22, + VT_UINT = 23, + VT_VOID = 24, + VT_HRESULT = 25, + VT_FILETIME = 64 +}; + +typedef unsigned short VARTYPE; +typedef WORD PROPVAR_PAD1; +typedef WORD PROPVAR_PAD2; +typedef WORD PROPVAR_PAD3; + +typedef struct tagPROPVARIANT +{ + VARTYPE vt; + PROPVAR_PAD1 wReserved1; + PROPVAR_PAD2 wReserved2; + PROPVAR_PAD3 wReserved3; + union + { + CHAR cVal; + UCHAR bVal; + SHORT iVal; + USHORT uiVal; + LONG lVal; + ULONG ulVal; + INT intVal; + UINT uintVal; + LARGE_INTEGER hVal; + ULARGE_INTEGER uhVal; + VARIANT_BOOL boolVal; + SCODE scode; + FILETIME filetime; + BSTR bstrVal; + }; +} PROPVARIANT; + +typedef PROPVARIANT tagVARIANT; +typedef tagVARIANT VARIANT; +typedef VARIANT VARIANTARG; + +MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop); +MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, const VARIANTARG *src); + +#ifndef CSTATPROP_DEFINED +#define CSTATPROP_DEFINED 1 +typedef struct tagSTATPROPSTG +{ + LPOLESTR lpwstrName; + union + { + PROPID PropID; + PROPID propid; + }; + VARTYPE vt; +} CStatProp, STATPROPSTG; +#endif + +MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len); +MY_EXTERN_C BSTR SysAllocStringLen(const OLECHAR *sz, UINT len); +MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz); +MY_EXTERN_C void SysFreeString(BSTR bstr); +MY_EXTERN_C UINT SysStringByteLen(BSTR bstr); +MY_EXTERN_C UINT SysStringLen(BSTR bstr); + +//MY_EXTERN_C DWORD GetLastError(); +MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2); + +#if defined(__APPLE__) +DWORD WINAPI WaitForMultipleObjects(DWORD count, const HANDLE *handles, Bool wait_all, DWORD timeout); +Bool WINAPI RtlTimeToSecondsSince1970(const LARGE_INTEGER *Time, DWORD *Seconds); +DWORD WINAPI GetTickCount(void); +const TCHAR kAnyStringWildcard = '*'; + +#endif + +#define CP_ACP 0 +#define CP_OEMCP 1 +#define CP_UTF8 65001 + +typedef enum tagSTREAM_SEEK +{ + STREAM_SEEK_SET = 0, + STREAM_SEEK_CUR = 1, + STREAM_SEEK_END = 2 +} STREAM_SEEK; + +#endif +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/NewHandler.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/NewHandler.cpp new file mode 100644 index 0000000000..2dfa289a44 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/NewHandler.cpp @@ -0,0 +1,163 @@ +// NewHandler.cpp + +#include "StdAfx.h" + +#include + +#include "NewHandler.h" + +// #define DEBUG_MEMORY_LEAK + +#ifndef DEBUG_MEMORY_LEAK + +#ifdef _WIN32 + +/* +void * my_new(size_t size) +{ + // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} + +void my_delete(void *p) throw() +{ + // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p); + ::free(p); +} + +void * my_Realloc(void *p, size_t newSize, size_t oldSize) +{ + void *newBuf = my_new(newSize); + if (oldSize != 0) + memcpy(newBuf, p, oldSize); + my_delete(p); + return newBuf; +} +*/ + +void * +#ifdef _MSC_VER +__cdecl +#endif +operator new(size_t size) +{ + // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} + +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete(void *p) throw() +{ + // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p); + ::free(p); +} + +/* +void * +#ifdef _MSC_VER +__cdecl +#endif +operator new[](size_t size) +{ + // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} + +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete[](void *p) throw() +{ + // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p); + ::free(p); +} +*/ + +#endif + +#else + +#include + +// #pragma init_seg(lib) +const int kDebugSize = 1000000; +static void *a[kDebugSize]; +static int index = 0; + +static int numAllocs = 0; +void * __cdecl operator new(size_t size) +{ + numAllocs++; + void *p = HeapAlloc(GetProcessHeap(), 0, size); + if (index < kDebugSize) + { + a[index] = p; + index++; + } + if (p == 0) + throw CNewException(); + printf("Alloc %6d, size = %8u\n", numAllocs, (unsigned)size); + return p; +} + +class CC +{ +public: + CC() + { + for (int i = 0; i < kDebugSize; i++) + a[i] = 0; + } + ~CC() + { + for (int i = 0; i < kDebugSize; i++) + if (a[i] != 0) + return; + } +} g_CC; + + +void __cdecl operator delete(void *p) +{ + if (p == 0) + return; + /* + for (int i = 0; i < index; i++) + if (a[i] == p) + a[i] = 0; + */ + HeapFree(GetProcessHeap(), 0, p); + numAllocs--; + printf("Free %d\n", numAllocs); +} + +#endif + +/* +int MemErrorVC(size_t) +{ + throw CNewException(); + // return 1; +} +CNewHandlerSetter::CNewHandlerSetter() +{ + // MemErrorOldVCFunction = _set_new_handler(MemErrorVC); +} +CNewHandlerSetter::~CNewHandlerSetter() +{ + // _set_new_handler(MemErrorOldVCFunction); +} +*/ diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/NewHandler.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/NewHandler.h new file mode 100644 index 0000000000..f6ca552f2f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/NewHandler.h @@ -0,0 +1,69 @@ +// Common/NewHandler.h + +#ifndef __COMMON_NEW_HANDLER_H +#define __COMMON_NEW_HANDLER_H + +/* +This file must be included before any code that uses operators "delete" or "new". +Also you must compile and link "NewHandler.cpp", if you use MSVC 6.0. +The operator "new" in MSVC 6.0 doesn't throw exception "bad_alloc". +So we define another version of operator "new" that throws "CNewException" on failure. + +If you use compiler that throws exception in "new" operator (GCC or new version of MSVC), +you can compile without "NewHandler.cpp". So standard exception "bad_alloc" will be used. + +It's still allowed to use redefined version of operator "new" from "NewHandler.cpp" +with any compiler. 7-Zip's code can work with "bad_alloc" and "CNewException" exceptions. +But if you use some additional code (outside of 7-Zip's code), you must check +that redefined version of operator "new" (that throws CNewException) is not +problem for your code. + +Also we declare delete(void *p) throw() that creates smaller code. +*/ + +#include + +class CNewException {}; + +#ifdef WIN32 +// We can compile my_new and my_delete with _fastcall +/* +void * my_new(size_t size); +void my_delete(void *p) throw(); +// void * my_Realloc(void *p, size_t newSize, size_t oldSize); +*/ +#endif + +#ifdef _WIN32 + +void * +#ifdef _MSC_VER +__cdecl +#endif +operator new(size_t size); + +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete(void *p) throw(); + +#endif + +/* +#ifdef _WIN32 +void * +#ifdef _MSC_VER +__cdecl +#endif +operator new[](size_t size); + +void +#ifdef _MSC_VER +__cdecl +#endif +operator delete[](void *p) throw(); +#endif +*/ + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/Sha256Reg.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Sha256Reg.cpp new file mode 100644 index 0000000000..14a3652377 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Sha256Reg.cpp @@ -0,0 +1,40 @@ +// Sha256Reg.cpp + +#include "StdAfx.h" + +#include "../../C/Sha256.h" + +#include "../Common/MyCom.h" + +#include "../7zip/Common/RegisterCodec.h" + +class CSha256Hasher: + public IHasher, + public CMyUnknownImp +{ + CSha256 _sha; + Byte mtDummy[1 << 7]; + +public: + CSha256Hasher() { Sha256_Init(&_sha); } + + MY_UNKNOWN_IMP1(IHasher) + INTERFACE_IHasher(;) +}; + +STDMETHODIMP_(void) CSha256Hasher::Init() throw() +{ + Sha256_Init(&_sha); +} + +STDMETHODIMP_(void) CSha256Hasher::Update(const void *data, UInt32 size) throw() +{ + Sha256_Update(&_sha, (const Byte *)data, size); +} + +STDMETHODIMP_(void) CSha256Hasher::Final(Byte *digest) throw() +{ + Sha256_Final(&_sha, digest); +} + +REGISTER_HASHER(CSha256Hasher, 0xA, "SHA256", SHA256_DIGEST_SIZE) diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdAfx.h new file mode 100644 index 0000000000..a19ebb4ee2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "Common.h" +#include "../../../src/LzmaAppleCommon.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdInStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdInStream.cpp new file mode 100644 index 0000000000..0799c2c76c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdInStream.cpp @@ -0,0 +1,94 @@ +// Common/StdInStream.cpp + +#include "StdAfx.h" + +#include + +#include "StdInStream.h" +#include "StringConvert.h" +#include "UTFConvert.h" + +static const char kNewLineChar = '\n'; + +static const char *kEOFMessage = "Unexpected end of input stream"; +static const char *kReadErrorMessage ="Error reading input stream"; +static const char *kIllegalCharMessage = "Illegal character in input stream"; + +static LPCTSTR kFileOpenMode = TEXT("r"); + +extern int g_CodePage; + +CStdInStream g_StdIn(stdin); + +bool CStdInStream::Open(LPCTSTR fileName) throw() +{ + Close(); + _stream = _tfopen(fileName, kFileOpenMode); + _streamIsOpen = (_stream != 0); + return _streamIsOpen; +} + +bool CStdInStream::Close() throw() +{ + if (!_streamIsOpen) + return true; + _streamIsOpen = (fclose(_stream) != 0); + return !_streamIsOpen; +} + +AString CStdInStream::ScanStringUntilNewLine(bool allowEOF) +{ + AString s; + for (;;) + { + int intChar = GetChar(); + if (intChar == EOF) + { + if (allowEOF) + break; + throw kEOFMessage; + } + char c = (char)intChar; + if (c == 0) + throw kIllegalCharMessage; + if (c == kNewLineChar) + break; + s += c; + } + return s; +} + +UString CStdInStream::ScanUStringUntilNewLine() +{ + AString s = ScanStringUntilNewLine(true); + int codePage = g_CodePage; + if (codePage == -1) + codePage = CP_OEMCP; + UString dest; + if (codePage == CP_UTF8) + ConvertUTF8ToUnicode(s, dest); + else + dest = MultiByteToUnicodeString(s, (UINT)codePage); + return dest; +} + +void CStdInStream::ReadToString(AString &resultString) +{ + resultString.Empty(); + int c; + while ((c = GetChar()) != EOF) + resultString += (char)c; +} + +bool CStdInStream::Eof() throw() +{ + return (feof(_stream) != 0); +} + +int CStdInStream::GetChar() +{ + int c = fgetc(_stream); // getc() doesn't work in BeOS? + if (c == EOF && !Eof()) + throw kReadErrorMessage; + return c; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdInStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdInStream.h new file mode 100644 index 0000000000..c017d0a3f8 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdInStream.h @@ -0,0 +1,33 @@ +// Common/StdInStream.h + +#ifndef __COMMON_STD_IN_STREAM_H +#define __COMMON_STD_IN_STREAM_H + +#include + +#include "MyString.h" +#include "MyTypes.h" + +class CStdInStream +{ + FILE *_stream; + bool _streamIsOpen; +public: + CStdInStream(): _stream(0), _streamIsOpen(false) {}; + CStdInStream(FILE *stream): _stream(stream), _streamIsOpen(false) {}; + ~CStdInStream() { Close(); } + + bool Open(LPCTSTR fileName) throw(); + bool Close() throw(); + + AString ScanStringUntilNewLine(bool allowEOF = false); + void ReadToString(AString &resultString); + UString ScanUStringUntilNewLine(); + + bool Eof() throw(); + int GetChar(); +}; + +extern CStdInStream g_StdIn; + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdOutStream.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdOutStream.cpp new file mode 100644 index 0000000000..eec83bbb2a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdOutStream.cpp @@ -0,0 +1,106 @@ +// Common/StdOutStream.cpp + +#include "StdAfx.h" + +#include + +#include "IntToString.h" +#include "StdOutStream.h" +#include "StringConvert.h" +#include "UTFConvert.h" + +static const char kNewLineChar = '\n'; + +static const char *kFileOpenMode = "wt"; + +extern int g_CodePage; + +CStdOutStream g_StdOut(stdout); +CStdOutStream g_StdErr(stderr); + +bool CStdOutStream::Open(const char *fileName) throw() +{ + Close(); + _stream = fopen(fileName, kFileOpenMode); + _streamIsOpen = (_stream != 0); + return _streamIsOpen; +} + +bool CStdOutStream::Close() throw() +{ + if (!_streamIsOpen) + return true; + if (fclose(_stream) != 0) + return false; + _stream = 0; + _streamIsOpen = false; + return true; +} + +bool CStdOutStream::Flush() throw() +{ + return (fflush(_stream) == 0); +} + +CStdOutStream & endl(CStdOutStream & outStream) throw() +{ + return outStream << kNewLineChar; +} + +CStdOutStream & CStdOutStream::operator<<(const wchar_t *s) +{ + int codePage = g_CodePage; + if (codePage == -1) + codePage = CP_OEMCP; + AString dest; + if (codePage == CP_UTF8) + ConvertUnicodeToUTF8(s, dest); + else + UnicodeStringToMultiByte2(dest, s, (UINT)codePage); + return operator<<((const char *)dest); +} + +void StdOut_Convert_UString_to_AString(const UString &s, AString &temp) +{ + int codePage = g_CodePage; + if (codePage == -1) + codePage = CP_OEMCP; + if (codePage == CP_UTF8) + ConvertUnicodeToUTF8(s, temp); + else + UnicodeStringToMultiByte2(temp, s, (UINT)codePage); +} + +void CStdOutStream::PrintUString(const UString &s, AString &temp) +{ + StdOut_Convert_UString_to_AString(s, temp); + *this << (const char *)temp; +} + +CStdOutStream & CStdOutStream::operator<<(Int32 number) throw() +{ + char s[32]; + ConvertInt64ToString(number, s); + return operator<<(s); +} + +CStdOutStream & CStdOutStream::operator<<(Int64 number) throw() +{ + char s[32]; + ConvertInt64ToString(number, s); + return operator<<(s); +} + +CStdOutStream & CStdOutStream::operator<<(UInt32 number) throw() +{ + char s[16]; + ConvertUInt32ToString(number, s); + return operator<<(s); +} + +CStdOutStream & CStdOutStream::operator<<(UInt64 number) throw() +{ + char s[32]; + ConvertUInt64ToString(number, s); + return operator<<(s); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdOutStream.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdOutStream.h new file mode 100644 index 0000000000..45738b2682 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StdOutStream.h @@ -0,0 +1,62 @@ +// Common/StdOutStream.h + +#ifndef __COMMON_STD_OUT_STREAM_H +#define __COMMON_STD_OUT_STREAM_H + +#include + +#include "MyString.h" +#include "MyTypes.h" + +class CStdOutStream +{ + FILE *_stream; + bool _streamIsOpen; +public: + CStdOutStream(): _stream(0), _streamIsOpen(false) {}; + CStdOutStream(FILE *stream): _stream(stream), _streamIsOpen(false) {}; + ~CStdOutStream() { Close(); } + + // void AttachStdStream(FILE *stream) { _stream = stream; _streamIsOpen = false; } + // bool IsDefined() const { return _stream != NULL; } + + operator FILE *() { return _stream; } + bool Open(const char *fileName) throw(); + bool Close() throw(); + bool Flush() throw(); + + CStdOutStream & operator<<(CStdOutStream & (* func)(CStdOutStream &)) + { + (*func)(*this); + return *this; + } + + CStdOutStream & operator<<(const char *s) throw() + { + fputs(s, _stream); + return *this; + } + + CStdOutStream & operator<<(char c) throw() + { + fputc((unsigned char)c, _stream); + return *this; + } + + CStdOutStream & operator<<(Int32 number) throw(); + CStdOutStream & operator<<(Int64 number) throw(); + CStdOutStream & operator<<(UInt32 number) throw(); + CStdOutStream & operator<<(UInt64 number) throw(); + + CStdOutStream & operator<<(const wchar_t *s); + void PrintUString(const UString &s, AString &temp); +}; + +CStdOutStream & endl(CStdOutStream & outStream) throw(); + +extern CStdOutStream g_StdOut; +extern CStdOutStream g_StdErr; + +void StdOut_Convert_UString_to_AString(const UString &s, AString &temp); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringConvert.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringConvert.cpp new file mode 100644 index 0000000000..ae66d14f44 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringConvert.cpp @@ -0,0 +1,313 @@ +// Common/StringConvert.cpp + +#include "StdAfx.h" + +#include "StringConvert.h" + +#ifndef _WIN32 +#include +#endif + +static const char k_DefultChar = '_'; + +#ifdef _WIN32 + +/* +MultiByteToWideChar(CodePage, DWORD dwFlags, + LPCSTR lpMultiByteStr, int cbMultiByte, + LPWSTR lpWideCharStr, int cchWideChar) + + if (cbMultiByte == 0) + return: 0. ERR: ERROR_INVALID_PARAMETER + + if (cchWideChar == 0) + return: the required buffer size in characters. + + if (supplied buffer size was not large enough) + return: 0. ERR: ERROR_INSUFFICIENT_BUFFER + The number of filled characters in lpWideCharStr can be smaller than cchWideChar (if last character is complex) + + If there are illegal characters: + if MB_ERR_INVALID_CHARS is set in dwFlags: + - the function stops conversion on illegal character. + - Return: 0. ERR: ERROR_NO_UNICODE_TRANSLATION. + + if MB_ERR_INVALID_CHARS is NOT set in dwFlags: + before Vista: illegal character is dropped (skipped). WinXP-64: GetLastError() returns 0. + in Vista+: illegal character is not dropped (MSDN). Undocumented: illegal + character is converted to U+FFFD, which is REPLACEMENT CHARACTER. +*/ + + +void MultiByteToUnicodeString2(UString &dest, const AString &src, UINT codePage) +{ + dest.Empty(); + if (src.IsEmpty()) + return; + { + /* + wchar_t *d = dest.GetBuf(src.Len()); + const char *s = (const char *)src; + unsigned i; + + for (i = 0;;) + { + Byte c = (Byte)s[i]; + if (c >= 0x80 || c == 0) + break; + d[i++] = (wchar_t)c; + } + + if (i != src.Len()) + { + unsigned len = MultiByteToWideChar(codePage, 0, s + i, + src.Len() - i, d + i, + src.Len() + 1 - i); + if (len == 0) + throw 282228; + i += len; + } + + d[i] = 0; + dest.ReleaseBuf_SetLen(i); + */ + unsigned len = MultiByteToWideChar(codePage, 0, src, src.Len(), NULL, 0); + if (len == 0) + { + if (GetLastError() != 0) + throw 282228; + } + else + { + len = MultiByteToWideChar(codePage, 0, src, src.Len(), dest.GetBuf(len), len); + if (len == 0) + throw 282228; + dest.ReleaseBuf_SetEnd(len); + } + } +} + +/* + int WideCharToMultiByte( + UINT CodePage, DWORD dwFlags, + LPCWSTR lpWideCharStr, int cchWideChar, + LPSTR lpMultiByteStr, int cbMultiByte, + LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar); + +if (lpDefaultChar == NULL), + - it uses system default value. + +if (CodePage == CP_UTF7 || CodePage == CP_UTF8) + if (lpDefaultChar != NULL || lpUsedDefaultChar != NULL) + return: 0. ERR: ERROR_INVALID_PARAMETER. + +The function operates most efficiently, if (lpDefaultChar == NULL && lpUsedDefaultChar == NULL) + +*/ + +static void UnicodeStringToMultiByte2(AString &dest, const UString &src, UINT codePage, char defaultChar, bool &defaultCharWasUsed) +{ + dest.Empty(); + defaultCharWasUsed = false; + if (src.IsEmpty()) + return; + { + /* + unsigned numRequiredBytes = src.Len() * 2; + char *d = dest.GetBuf(numRequiredBytes); + const wchar_t *s = (const wchar_t *)src; + unsigned i; + + for (i = 0;;) + { + wchar_t c = s[i]; + if (c >= 0x80 || c == 0) + break; + d[i++] = (char)c; + } + + if (i != src.Len()) + { + BOOL defUsed = FALSE; + defaultChar = defaultChar; + + bool isUtf = (codePage == CP_UTF8 || codePage == CP_UTF7); + unsigned len = WideCharToMultiByte(codePage, 0, s + i, src.Len() - i, + d + i, numRequiredBytes + 1 - i, + (isUtf ? NULL : &defaultChar), + (isUtf ? NULL : &defUsed)); + defaultCharWasUsed = (defUsed != FALSE); + if (len == 0) + throw 282229; + i += len; + } + + d[i] = 0; + dest.ReleaseBuf_SetLen(i); + */ + + /* + if (codePage != CP_UTF7) + { + const wchar_t *s = (const wchar_t *)src; + unsigned i; + for (i = 0;; i++) + { + wchar_t c = s[i]; + if (c >= 0x80 || c == 0) + break; + } + + if (s[i] == 0) + { + char *d = dest.GetBuf(src.Len()); + for (i = 0;;) + { + wchar_t c = s[i]; + if (c == 0) + break; + d[i++] = (char)c; + } + d[i] = 0; + dest.ReleaseBuf_SetLen(i); + return; + } + } + */ + + unsigned len = WideCharToMultiByte(codePage, 0, src, src.Len(), NULL, 0, NULL, NULL); + if (len == 0) + { + if (GetLastError() != 0) + throw 282228; + } + else + { + BOOL defUsed = FALSE; + bool isUtf = (codePage == CP_UTF8 || codePage == CP_UTF7); + // defaultChar = defaultChar; + len = WideCharToMultiByte(codePage, 0, src, src.Len(), + dest.GetBuf(len), len, + (isUtf ? NULL : &defaultChar), + (isUtf ? NULL : &defUsed) + ); + if (!isUtf) + defaultCharWasUsed = (defUsed != FALSE); + if (len == 0) + throw 282228; + dest.ReleaseBuf_SetEnd(len); + } + } +} + +/* +#ifndef UNDER_CE +AString SystemStringToOemString(const CSysString &src) +{ + AString dest; + const unsigned len = src.Len() * 2; + CharToOem(src, dest.GetBuf(len)); + dest.ReleaseBuf_CalcLen(len); + return dest; +} +#endif +*/ + +#else + +void MultiByteToUnicodeString2(UString &dest, const AString &src, UINT /* codePage */) +{ + dest.Empty(); + if (src.IsEmpty()) + return; + + size_t limit = ((size_t)src.Len() + 1) * 2; + wchar_t *d = dest.GetBuf((unsigned)limit); + size_t len = mbstowcs(d, src, limit); + if (len != (size_t)-1) + { + dest.ReleaseBuf_SetEnd((unsigned)len); + return; + } + + { + unsigned i; + const char *s = (const char *)src; + for (i = 0;;) + { + Byte c = (Byte)s[i]; + if (c == 0) + break; + d[i++] = (wchar_t)c; + } + d[i] = 0; + dest.ReleaseBuf_SetLen(i); + } +} + +static void UnicodeStringToMultiByte2(AString &dest, const UString &src, UINT /* codePage */, char defaultChar, bool &defaultCharWasUsed) +{ + dest.Empty(); + defaultCharWasUsed = false; + if (src.IsEmpty()) + return; + + size_t limit = ((size_t)src.Len() + 1) * 6; + char *d = dest.GetBuf((unsigned)limit); + size_t len = wcstombs(d, src, limit); + if (len != (size_t)-1) + { + dest.ReleaseBuf_SetEnd((unsigned)len); + return; + } + + { + const wchar_t *s = (const wchar_t *)src; + unsigned i; + for (i = 0;;) + { + wchar_t c = s[i]; + if (c == 0) + break; + if (c >= 0x100) + { + c = defaultChar; + defaultCharWasUsed = true; + } + d[i++] = (char)c; + } + d[i] = 0; + dest.ReleaseBuf_SetLen(i); + } +} + +#endif + + +UString MultiByteToUnicodeString(const AString &src, UINT codePage) +{ + UString dest; + MultiByteToUnicodeString2(dest, src, codePage); + return dest; +} + +void UnicodeStringToMultiByte2(AString &dest, const UString &src, UINT codePage) +{ + bool defaultCharWasUsed; + UnicodeStringToMultiByte2(dest, src, codePage, k_DefultChar, defaultCharWasUsed); +} + +AString UnicodeStringToMultiByte(const UString &src, UINT codePage, char defaultChar, bool &defaultCharWasUsed) +{ + AString dest; + UnicodeStringToMultiByte2(dest, src, codePage, defaultChar, defaultCharWasUsed); + return dest; +} + +AString UnicodeStringToMultiByte(const UString &src, UINT codePage) +{ + AString dest; + bool defaultCharWasUsed; + UnicodeStringToMultiByte2(dest, src, codePage, k_DefultChar, defaultCharWasUsed); + return dest; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringConvert.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringConvert.h new file mode 100644 index 0000000000..7f387b1d84 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringConvert.h @@ -0,0 +1,77 @@ +// Common/StringConvert.h + +#ifndef __COMMON_STRING_CONVERT_H +#define __COMMON_STRING_CONVERT_H + +#include "MyString.h" +#include "MyWindows.h" + +UString MultiByteToUnicodeString(const AString &srcString, UINT codePage = CP_ACP); + +// optimized versions that work faster for ASCII strings +void MultiByteToUnicodeString2(UString &dest, const AString &srcString, UINT codePage = CP_ACP); +// void UnicodeStringToMultiByte2(AString &dest, const UString &s, UINT codePage, char defaultChar, bool &defaultCharWasUsed); +void UnicodeStringToMultiByte2(AString &dest, const UString &srcString, UINT codePage); + +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage, char defaultChar, bool &defaultCharWasUsed); +AString UnicodeStringToMultiByte(const UString &srcString, UINT codePage = CP_ACP); + +inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString) + { return unicodeString; } +inline const UString& GetUnicodeString(const UString &unicodeString) + { return unicodeString; } +inline UString GetUnicodeString(const AString &ansiString) + { return MultiByteToUnicodeString(ansiString); } +inline UString GetUnicodeString(const AString &multiByteString, UINT codePage) + { return MultiByteToUnicodeString(multiByteString, codePage); } +inline const wchar_t* GetUnicodeString(const wchar_t* unicodeString, UINT) + { return unicodeString; } +inline const UString& GetUnicodeString(const UString &unicodeString, UINT) + { return unicodeString; } + +inline const char* GetAnsiString(const char* ansiString) + { return ansiString; } +inline const AString& GetAnsiString(const AString &ansiString) + { return ansiString; } +inline AString GetAnsiString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString); } + +inline const char* GetOemString(const char* oemString) + { return oemString; } +inline const AString& GetOemString(const AString &oemString) + { return oemString; } +inline AString GetOemString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString, CP_OEMCP); } + + +#ifdef _UNICODE + inline const wchar_t* GetSystemString(const wchar_t* unicodeString) + { return unicodeString;} + inline const UString& GetSystemString(const UString &unicodeString) + { return unicodeString;} + inline const wchar_t* GetSystemString(const wchar_t* unicodeString, UINT /* codePage */) + { return unicodeString;} + inline const UString& GetSystemString(const UString &unicodeString, UINT /* codePage */) + { return unicodeString;} + inline UString GetSystemString(const AString &multiByteString, UINT codePage) + { return MultiByteToUnicodeString(multiByteString, codePage);} + inline UString GetSystemString(const AString &multiByteString) + { return MultiByteToUnicodeString(multiByteString);} +#else + inline const char* GetSystemString(const char *ansiString) + { return ansiString; } + inline const AString& GetSystemString(const AString &multiByteString, UINT) + { return multiByteString; } + inline const char * GetSystemString(const char *multiByteString, UINT) + { return multiByteString; } + inline AString GetSystemString(const UString &unicodeString) + { return UnicodeStringToMultiByte(unicodeString); } + inline AString GetSystemString(const UString &unicodeString, UINT codePage) + { return UnicodeStringToMultiByte(unicodeString, codePage); } +#endif + +#ifndef UNDER_CE +AString SystemStringToOemString(const CSysString &srcString); +#endif + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringToInt.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringToInt.cpp new file mode 100644 index 0000000000..295816e16f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringToInt.cpp @@ -0,0 +1,144 @@ +// Common/StringToInt.cpp + +#include "StdAfx.h" + +#include "StringToInt.h" + +static const UInt32 k_UInt32_max = 0xFFFFFFFF; +static const UInt64 k_UInt64_max = UINT64_CONST(0xFFFFFFFFFFFFFFFF); +// static const UInt64 k_UInt64_max = (UInt64)(Int64)-1; + +#define CONVERT_STRING_TO_UINT_FUNC(uintType, charType, charTypeUnsigned) \ + uintType ConvertStringTo ## uintType(const charType *s, const charType **end) throw() { \ + if (end) *end = s; \ + uintType res = 0; \ + for (;; s++) { \ + charTypeUnsigned c = (charTypeUnsigned)*s; \ + if (c < '0' || c > '9') { if (end) *end = s; return res; } \ + if (res > (k_ ## uintType ## _max) / 10) return 0; \ + res *= 10; \ + unsigned v = (c - '0'); \ + if (res > (k_ ## uintType ## _max) - v) return 0; \ + res += v; }} + +CONVERT_STRING_TO_UINT_FUNC(UInt32, char, Byte) +CONVERT_STRING_TO_UINT_FUNC(UInt32, wchar_t, wchar_t) +CONVERT_STRING_TO_UINT_FUNC(UInt64, char, Byte) +CONVERT_STRING_TO_UINT_FUNC(UInt64, wchar_t, wchar_t) + +Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw() +{ + if (end) + *end = s; + const wchar_t *s2 = s; + if (*s == '-') + s2++; + if (*s2 == 0) + return 0; + const wchar_t *end2; + UInt32 res = ConvertStringToUInt32(s2, &end2); + if (*s == '-') + { + if (res > ((UInt32)1 << (32 - 1))) + return 0; + } + else if ((res & ((UInt32)1 << (32 - 1))) != 0) + return 0; + if (end) + *end = end2; + if (*s == '-') + return -(Int32)res; + return (Int32)res; +} + +UInt32 ConvertOctStringToUInt32(const char *s, const char **end) throw() +{ + if (end) + *end = s; + UInt32 res = 0; + for (;; s++) + { + unsigned c = (unsigned char)*s; + if (c < '0' || c > '7') + { + if (end) + *end = s; + return res; + } + if ((res & (UInt32)7 << (32 - 3)) != 0) + return 0; + res <<= 3; + res |= (unsigned)(c - '0'); + } +} + +UInt64 ConvertOctStringToUInt64(const char *s, const char **end) throw() +{ + if (end) + *end = s; + UInt64 res = 0; + for (;; s++) + { + unsigned c = (unsigned char)*s; + if (c < '0' || c > '7') + { + if (end) + *end = s; + return res; + } + if ((res & (UInt64)7 << (64 - 3)) != 0) + return 0; + res <<= 3; + res |= (unsigned)(c - '0'); + } +} + +UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw() +{ + if (end) + *end = s; + UInt32 res = 0; + for (;; s++) + { + unsigned c = (Byte)*s; + unsigned v; + if (c >= '0' && c <= '9') v = (c - '0'); + else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A'); + else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a'); + else + { + if (end) + *end = s; + return res; + } + if ((res & (UInt32)0xF << (32 - 4)) != 0) + return 0; + res <<= 4; + res |= v; + } +} + +UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw() +{ + if (end) + *end = s; + UInt64 res = 0; + for (;; s++) + { + unsigned c = (Byte)*s; + unsigned v; + if (c >= '0' && c <= '9') v = (c - '0'); + else if (c >= 'A' && c <= 'F') v = 10 + (c - 'A'); + else if (c >= 'a' && c <= 'f') v = 10 + (c - 'a'); + else + { + if (end) + *end = s; + return res; + } + if ((res & (UInt64)0xF << (64 - 4)) != 0) + return 0; + res <<= 4; + res |= v; + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringToInt.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringToInt.h new file mode 100644 index 0000000000..140d1ee2dd --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/StringToInt.h @@ -0,0 +1,21 @@ +// Common/StringToInt.h + +#ifndef __COMMON_STRING_TO_INT_H +#define __COMMON_STRING_TO_INT_H + +#include "MyTypes.h" + +UInt32 ConvertStringToUInt32(const char *s, const char **end) throw(); +UInt64 ConvertStringToUInt64(const char *s, const char **end) throw(); +UInt32 ConvertStringToUInt32(const wchar_t *s, const wchar_t **end) throw(); +UInt64 ConvertStringToUInt64(const wchar_t *s, const wchar_t **end) throw(); + +Int32 ConvertStringToInt32(const wchar_t *s, const wchar_t **end) throw(); + +UInt32 ConvertOctStringToUInt32(const char *s, const char **end) throw(); +UInt64 ConvertOctStringToUInt64(const char *s, const char **end) throw(); + +UInt32 ConvertHexStringToUInt32(const char *s, const char **end) throw(); +UInt64 ConvertHexStringToUInt64(const char *s, const char **end) throw(); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/TextConfig.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/TextConfig.cpp new file mode 100644 index 0000000000..f6b70089e7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/TextConfig.cpp @@ -0,0 +1,124 @@ +// Common/TextConfig.cpp + +#include "StdAfx.h" + +#include "TextConfig.h" +#include "UTFConvert.h" + +static inline bool IsDelimitChar(char c) +{ + return (c == ' ' || c == 0x0A || c == 0x0D || c == '\0' || c == '\t'); +} + +static AString GetIDString(const char *s, unsigned &finishPos) +{ + AString result; + for (finishPos = 0; ; finishPos++) + { + char c = s[finishPos]; + if (IsDelimitChar(c) || c == '=') + break; + result += c; + } + return result; +} + +static bool WaitNextLine(const AString &s, unsigned &pos) +{ + for (; pos < s.Len(); pos++) + if (s[pos] == 0x0A) + return true; + return false; +} + +static bool SkipSpaces(const AString &s, unsigned &pos) +{ + for (; pos < s.Len(); pos++) + { + char c = s[pos]; + if (!IsDelimitChar(c)) + { + if (c != ';') + return true; + if (!WaitNextLine(s, pos)) + return false; + } + } + return false; +} + +bool GetTextConfig(const AString &s, CObjectVector &pairs) +{ + pairs.Clear(); + unsigned pos = 0; + + ///////////////////// + // read strings + + for (;;) + { + if (!SkipSpaces(s, pos)) + break; + CTextConfigPair pair; + unsigned finishPos; + AString temp = GetIDString(((const char *)s) + pos, finishPos); + if (!ConvertUTF8ToUnicode(temp, pair.ID)) + return false; + if (finishPos == 0) + return false; + pos += finishPos; + if (!SkipSpaces(s, pos)) + return false; + if (s[pos] != '=') + return false; + pos++; + if (!SkipSpaces(s, pos)) + return false; + if (s[pos] != '\"') + return false; + pos++; + AString message; + for (;;) + { + if (pos >= s.Len()) + return false; + char c = s[pos++]; + if (c == '\"') + break; + if (c == '\\') + { + c = s[pos++]; + switch (c) + { + case 'n': message += '\n'; break; + case 't': message += '\t'; break; + case '\\': message += '\\'; break; + case '\"': message += '\"'; break; + default: message += '\\'; message += c; break; + } + } + else + message += c; + } + if (!ConvertUTF8ToUnicode(message, pair.String)) + return false; + pairs.Add(pair); + } + return true; +} + +int FindTextConfigItem(const CObjectVector &pairs, const UString &id) throw() +{ + FOR_VECTOR (i, pairs) + if (pairs[i].ID == id) + return i; + return -1; +} + +UString GetTextConfigValue(const CObjectVector &pairs, const UString &id) +{ + int index = FindTextConfigItem(pairs, id); + if (index < 0) + return UString(); + return pairs[index].String; +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/TextConfig.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/TextConfig.h new file mode 100644 index 0000000000..fd9605c990 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/TextConfig.h @@ -0,0 +1,19 @@ +// Common/TextConfig.h + +#ifndef __COMMON_TEXT_CONFIG_H +#define __COMMON_TEXT_CONFIG_H + +#include "MyString.h" + +struct CTextConfigPair +{ + UString ID; + UString String; +}; + +bool GetTextConfig(const AString &text, CObjectVector &pairs); + +int FindTextConfigItem(const CObjectVector &pairs, const UString &id) throw(); +UString GetTextConfigValue(const CObjectVector &pairs, const UString &id); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/UTFConvert.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/UTFConvert.cpp new file mode 100644 index 0000000000..b09bbcdb37 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/UTFConvert.cpp @@ -0,0 +1,288 @@ +// UTFConvert.cpp + +#include "StdAfx.h" + +#include "MyTypes.h" +#include "UTFConvert.h" + +#ifdef _WIN32 +#define _WCHART_IS_16BIT 1 +#endif + +/* + _UTF8_START(n) - is a base value for start byte (head), if there are (n) additional bytes after start byte + + n : _UTF8_START(n) : Bits of code point + + 0 : 0x80 : : unused + 1 : 0xC0 : 11 : + 2 : 0xE0 : 16 : Basic Multilingual Plane + 3 : 0xF0 : 21 : Unicode space + 3 : 0xF8 : 26 : + 5 : 0xFC : 31 : UCS-4 + 6 : 0xFE : 36 : We can use it, if we want to encode any 32-bit value + 7 : 0xFF : +*/ + +#define _UTF8_START(n) (0x100 - (1 << (7 - (n)))) + +#define _UTF8_HEAD_PARSE2(n) if (c < _UTF8_START((n) + 1)) { numBytes = (n); c -= _UTF8_START(n); } + +#define _UTF8_HEAD_PARSE \ + _UTF8_HEAD_PARSE2(1) \ + else _UTF8_HEAD_PARSE2(2) \ + else _UTF8_HEAD_PARSE2(3) \ + else _UTF8_HEAD_PARSE2(4) \ + else _UTF8_HEAD_PARSE2(5) \ + + // else _UTF8_HEAD_PARSE2(6) + +bool CheckUTF8(const char *src, bool allowReduced) throw() +{ + for (;;) + { + Byte c = *src++; + if (c == 0) + return true; + + if (c < 0x80) + continue; + if (c < 0xC0) // (c < 0xC0 + 2) // if we support only optimal encoding chars + return false; + + unsigned numBytes; + _UTF8_HEAD_PARSE + else + return false; + + UInt32 val = c; + + do + { + Byte c2 = *src++; + if (c2 < 0x80 || c2 >= 0xC0) + return allowReduced && c2 == 0; + val <<= 6; + val |= (c2 - 0x80); + } + while (--numBytes); + + if (val >= 0x110000) + return false; + } +} + + +#define _ERROR_UTF8 \ + { if (dest) dest[destPos] = (wchar_t)0xFFFD; destPos++; ok = false; continue; } + +static bool Utf8_To_Utf16(wchar_t *dest, size_t *destLen, const char *src, const char *srcLim) throw() +{ + size_t destPos = 0; + bool ok = true; + + for (;;) + { + Byte c; + if (src == srcLim) + { + *destLen = destPos; + return ok; + } + c = *src++; + + if (c < 0x80) + { + if (dest) + dest[destPos] = (wchar_t)c; + destPos++; + continue; + } + if (c < 0xC0) + _ERROR_UTF8 + + unsigned numBytes; + _UTF8_HEAD_PARSE + else + _ERROR_UTF8 + + UInt32 val = c; + + do + { + Byte c2; + if (src == srcLim) + break; + c2 = *src; + if (c2 < 0x80 || c2 >= 0xC0) + break; + src++; + val <<= 6; + val |= (c2 - 0x80); + } + while (--numBytes); + + if (numBytes != 0) + _ERROR_UTF8 + + if (val < 0x10000) + { + if (dest) + dest[destPos] = (wchar_t)val; + destPos++; + } + else + { + val -= 0x10000; + if (val >= 0x100000) + _ERROR_UTF8 + if (dest) + { + dest[destPos + 0] = (wchar_t)(0xD800 + (val >> 10)); + dest[destPos + 1] = (wchar_t)(0xDC00 + (val & 0x3FF)); + } + destPos += 2; + } + } +} + +#define _UTF8_RANGE(n) (((UInt32)1) << ((n) * 5 + 6)) + +#define _UTF8_HEAD(n, val) ((char)(_UTF8_START(n) + (val >> (6 * (n))))) +#define _UTF8_CHAR(n, val) ((char)(0x80 + (((val) >> (6 * (n))) & 0x3F))) + +static size_t Utf16_To_Utf8_Calc(const wchar_t *src, const wchar_t *srcLim) +{ + size_t size = srcLim - src; + for (;;) + { + if (src == srcLim) + return size; + + UInt32 val = *src++; + + if (val < 0x80) + continue; + + if (val < _UTF8_RANGE(1)) + { + size++; + continue; + } + + if (val >= 0xD800 && val < 0xDC00 && src != srcLim) + { + UInt32 c2 = *src; + if (c2 >= 0xDC00 && c2 < 0xE000) + { + src++; + size += 2; + continue; + } + } + + #ifdef _WCHART_IS_16BIT + + size += 2; + + #else + + if (val < _UTF8_RANGE(2)) size += 2; + else if (val < _UTF8_RANGE(3)) size += 3; + else if (val < _UTF8_RANGE(4)) size += 4; + else if (val < _UTF8_RANGE(5)) size += 5; + else size += 6; + + #endif + } +} + +static char *Utf16_To_Utf8(char *dest, const wchar_t *src, const wchar_t *srcLim) +{ + for (;;) + { + if (src == srcLim) + return dest; + + UInt32 val = *src++; + + if (val < 0x80) + { + *dest++ = (char)val; + continue; + } + + if (val < _UTF8_RANGE(1)) + { + dest[0] = _UTF8_HEAD(1, val); + dest[1] = _UTF8_CHAR(0, val); + dest += 2; + continue; + } + + if (val >= 0xD800 && val < 0xDC00 && src != srcLim) + { + UInt32 c2 = *src; + if (c2 >= 0xDC00 && c2 < 0xE000) + { + src++; + val = (((val - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000; + dest[0] = _UTF8_HEAD(3, val); + dest[1] = _UTF8_CHAR(2, val); + dest[2] = _UTF8_CHAR(1, val); + dest[3] = _UTF8_CHAR(0, val); + dest += 4; + continue; + } + } + + #ifndef _WCHART_IS_16BIT + if (val < _UTF8_RANGE(2)) + #endif + { + dest[0] = _UTF8_HEAD(2, val); + dest[1] = _UTF8_CHAR(1, val); + dest[2] = _UTF8_CHAR(0, val); + dest += 3; + continue; + } + + #ifndef _WCHART_IS_16BIT + + UInt32 b; + unsigned numBits; + if (val < _UTF8_RANGE(3)) { numBits = 6 * 3; b = _UTF8_HEAD(3, val); } + else if (val < _UTF8_RANGE(4)) { numBits = 6 * 4; b = _UTF8_HEAD(4, val); } + else if (val < _UTF8_RANGE(5)) { numBits = 6 * 5; b = _UTF8_HEAD(5, val); } + else { numBits = 6 * 6; b = _UTF8_START(6); } + + *dest++ = (Byte)b; + + do + { + numBits -= 6; + *dest++ = (char)(0x80 + ((val >> numBits) & 0x3F)); + } + while (numBits != 0); + + #endif + } +} + +bool ConvertUTF8ToUnicode(const AString &src, UString &dest) +{ + dest.Empty(); + size_t destLen = 0; + Utf8_To_Utf16(NULL, &destLen, src, src.Ptr(src.Len())); + bool res = Utf8_To_Utf16(dest.GetBuf((unsigned)destLen), &destLen, src, src.Ptr(src.Len())); + dest.ReleaseBuf_SetEnd((unsigned)destLen); + return res; +} + +void ConvertUnicodeToUTF8(const UString &src, AString &dest) +{ + dest.Empty(); + size_t destLen = Utf16_To_Utf8_Calc(src, src.Ptr(src.Len())); + Utf16_To_Utf8(dest.GetBuf((unsigned)destLen), src, src.Ptr(src.Len())); + dest.ReleaseBuf_SetEnd((unsigned)destLen); +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/UTFConvert.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/UTFConvert.h new file mode 100644 index 0000000000..11831700c7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/UTFConvert.h @@ -0,0 +1,12 @@ +// Common/UTFConvert.h + +#ifndef __COMMON_UTF_CONVERT_H +#define __COMMON_UTF_CONVERT_H + +#include "MyString.h" + +bool CheckUTF8(const char *src, bool allowReduced = false) throw(); +bool ConvertUTF8ToUnicode(const AString &utfString, UString &resultString); +void ConvertUnicodeToUTF8(const UString &unicodeString, AString &resultString); + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/Wildcard.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Wildcard.cpp new file mode 100644 index 0000000000..7e19f84622 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Wildcard.cpp @@ -0,0 +1,687 @@ +// Common/Wildcard.cpp + +#include "StdAfx.h" + +#include "Wildcard.h" + +bool g_CaseSensitive = + #ifdef _WIN32 + false; + #else + true; + #endif + + +bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2) +{ + if (g_CaseSensitive) + return IsString1PrefixedByString2(s1, s2); + return IsString1PrefixedByString2_NoCase(s1, s2); +} + +int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW +{ + if (g_CaseSensitive) + return wcscmp(s1, s2); + return MyStringCompareNoCase(s1, s2); +} + +#ifndef USE_UNICODE_FSTRING +int CompareFileNames(const char *s1, const char *s2) +{ + if (g_CaseSensitive) + return wcscmp(fs2us(s1), fs2us(s2)); + return MyStringCompareNoCase(fs2us(s1), fs2us(s2)); +} +#endif + +// ----------------------------------------- +// this function compares name with mask +// ? - any char +// * - any char or empty + +static bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name) +{ + for (;;) + { + wchar_t m = *mask; + wchar_t c = *name; + if (m == 0) + return (c == 0); + if (m == '*') + { + if (EnhancedMaskTest(mask + 1, name)) + return true; + if (c == 0) + return false; + } + else + { + if (m == '?') + { + if (c == 0) + return false; + } + else if (m != c) + if (g_CaseSensitive || MyCharUpper(m) != MyCharUpper(c)) + return false; + mask++; + } + name++; + } +} + +// -------------------------------------------------- +// Splits path to strings + +void SplitPathToParts(const UString &path, UStringVector &pathParts) +{ + pathParts.Clear(); + unsigned len = path.Len(); + if (len == 0) + return; + UString name; + unsigned prev = 0; + for (unsigned i = 0; i < len; i++) + if (IsPathSepar(path[i])) + { + name.SetFrom(path.Ptr(prev), i - prev); + pathParts.Add(name); + prev = i + 1; + } + name.SetFrom(path.Ptr(prev), len - prev); + pathParts.Add(name); +} + +void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name) +{ + const wchar_t *start = path; + const wchar_t *p = start + path.Len(); + for (; p != start; p--) + if (IsPathSepar(*(p - 1))) + break; + dirPrefix.SetFrom(path, (unsigned)(p - start)); + name = p; +} + +void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name) +{ + const wchar_t *start = path; + const wchar_t *p = start + path.Len(); + if (p != start) + { + if (IsPathSepar(*(p - 1))) + p--; + for (; p != start; p--) + if (IsPathSepar(*(p - 1))) + break; + } + dirPrefix.SetFrom(path, (unsigned)(p - start)); + name = p; +} + +UString ExtractDirPrefixFromPath(const UString &path) +{ + const wchar_t *start = path; + const wchar_t *p = start + path.Len(); + for (; p != start; p--) + if (IsPathSepar(*(p - 1))) + break; + return path.Left((unsigned)(p - start)); +} + +UString ExtractFileNameFromPath(const UString &path) +{ + const wchar_t *start = path; + const wchar_t *p = start + path.Len(); + for (; p != start; p--) + if (IsPathSepar(*(p - 1))) + break; + return p; +} + + +bool DoesWildcardMatchName(const UString &mask, const UString &name) +{ + return EnhancedMaskTest(mask, name); +} + +bool DoesNameContainWildcard(const UString &path) +{ + for (unsigned i = 0; i < path.Len(); i++) + { + wchar_t c = path[i]; + if (c == '*' || c == '?') + return true; + } + return false; +} + + +// ----------------------------------------------------------' +// NWildcard + +namespace NWildcard { + +/* + +M = MaskParts.Size(); +N = TestNameParts.Size(); + + File Dir +ForFile rec M<=N [N-M, N) - +!ForDir nonrec M=N [0, M) - + +ForDir rec M 1) + return true; + } + return false; +} + +bool CCensorNode::AreThereIncludeItems() const +{ + if (IncludeItems.Size() > 0) + return true; + FOR_VECTOR (i, SubNodes) + if (SubNodes[i].AreThereIncludeItems()) + return true; + return false; +} + +bool CCensorNode::CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const +{ + const CObjectVector &items = include ? IncludeItems : ExcludeItems; + FOR_VECTOR (i, items) + if (items[i].CheckPath(pathParts, isFile)) + return true; + return false; +} + +bool CCensorNode::CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const +{ + if (CheckPathCurrent(false, pathParts, isFile)) + { + include = false; + return true; + } + include = true; + bool finded = CheckPathCurrent(true, pathParts, isFile); + if (pathParts.Size() <= 1) + return finded; + int index = FindSubNode(pathParts.Front()); + if (index >= 0) + { + UStringVector pathParts2 = pathParts; + pathParts2.Delete(0); + if (SubNodes[index].CheckPathVect(pathParts2, isFile, include)) + return true; + } + return finded; +} + +/* +bool CCensorNode::CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const +{ + UStringVector pathParts; + SplitPathToParts(path, pathParts); + if (CheckPathVect(pathParts, isFile, include)) + { + if (!include || !isAltStream) + return true; + } + if (isAltStream && !pathParts.IsEmpty()) + { + UString &back = pathParts.Back(); + int pos = back.Find(L':'); + if (pos > 0) + { + back.DeleteFrom(pos); + return CheckPathVect(pathParts, isFile, include); + } + } + return false; +} + +bool CCensorNode::CheckPath(bool isAltStream, const UString &path, bool isFile) const +{ + bool include; + if (CheckPath2(isAltStream, path, isFile, include)) + return include; + return false; +} +*/ + +bool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const +{ + if (CheckPathCurrent(include, pathParts, isFile)) + return true; + if (Parent == 0) + return false; + pathParts.Insert(0, Name); + return Parent->CheckPathToRoot(include, pathParts, isFile); +} + +/* +bool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const +{ + UStringVector pathParts; + SplitPathToParts(path, pathParts); + return CheckPathToRoot(include, pathParts, isFile); +} +*/ + +void CCensorNode::AddItem2(bool include, const UString &path, bool recursive, bool wildcardMatching) +{ + if (path.IsEmpty()) + return; + bool forFile = true; + bool forFolder = true; + UString path2 = path; + if (IsPathSepar(path.Back())) + { + path2.DeleteBack(); + forFile = false; + } + AddItem(include, path2, recursive, forFile, forFolder, wildcardMatching); +} + +void CCensorNode::ExtendExclude(const CCensorNode &fromNodes) +{ + ExcludeItems += fromNodes.ExcludeItems; + FOR_VECTOR (i, fromNodes.SubNodes) + { + const CCensorNode &node = fromNodes.SubNodes[i]; + int subNodeIndex = FindSubNode(node.Name); + if (subNodeIndex < 0) + subNodeIndex = SubNodes.Add(CCensorNode(node.Name, this)); + SubNodes[subNodeIndex].ExtendExclude(node); + } +} + +int CCensor::FindPrefix(const UString &prefix) const +{ + FOR_VECTOR (i, Pairs) + if (CompareFileNames(Pairs[i].Prefix, prefix) == 0) + return i; + return -1; +} + +#ifdef _WIN32 + +bool IsDriveColonName(const wchar_t *s) +{ + wchar_t c = s[0]; + return c != 0 && s[1] == ':' && s[2] == 0 && (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'); +} + +unsigned GetNumPrefixParts_if_DrivePath(UStringVector &pathParts) +{ + if (pathParts.IsEmpty()) + return 0; + + unsigned testIndex = 0; + if (pathParts[0].IsEmpty()) + { + if (pathParts.Size() < 4 + || !pathParts[1].IsEmpty() + || pathParts[2] != L"?") + return 0; + testIndex = 3; + } + if (NWildcard::IsDriveColonName(pathParts[testIndex])) + return testIndex + 1; + return 0; +} + +#endif + +static unsigned GetNumPrefixParts(const UStringVector &pathParts) +{ + if (pathParts.IsEmpty()) + return 0; + + #ifdef _WIN32 + + if (IsDriveColonName(pathParts[0])) + return 1; + if (!pathParts[0].IsEmpty()) + return 0; + + if (pathParts.Size() == 1) + return 1; + if (!pathParts[1].IsEmpty()) + return 1; + if (pathParts.Size() == 2) + return 2; + if (pathParts[2] == L".") + return 3; + + unsigned networkParts = 2; + if (pathParts[2] == L"?") + { + if (pathParts.Size() == 3) + return 3; + if (IsDriveColonName(pathParts[3])) + return 4; + if (!pathParts[3].IsEqualTo_Ascii_NoCase("UNC")) + return 3; + networkParts = 4; + } + + networkParts += + // 2; // server/share + 1; // server + if (pathParts.Size() <= networkParts) + return pathParts.Size(); + return networkParts; + + #else + + return pathParts[0].IsEmpty() ? 1 : 0; + + #endif +} + +void CCensor::AddItem(ECensorPathMode pathMode, bool include, const UString &path, bool recursive, bool wildcardMatching) +{ + if (path.IsEmpty()) + throw "Empty file path"; + + UStringVector pathParts; + SplitPathToParts(path, pathParts); + + bool forFile = true; + if (pathParts.Back().IsEmpty()) + { + forFile = false; + pathParts.DeleteBack(); + } + + UString prefix; + + int ignoreWildcardIndex = -1; + + // #ifdef _WIN32 + // we ignore "?" wildcard in "\\?\" prefix. + if (pathParts.Size() >= 3 + && pathParts[0].IsEmpty() + && pathParts[1].IsEmpty() + && pathParts[2] == L"?") + ignoreWildcardIndex = 2; + // #endif + + if (pathMode != k_AbsPath) + { + ignoreWildcardIndex = -1; + + const unsigned numPrefixParts = GetNumPrefixParts(pathParts); + unsigned numSkipParts = numPrefixParts; + + if (pathMode != k_FullPath) + { + if (numPrefixParts != 0 && pathParts.Size() > numPrefixParts) { + numSkipParts = pathParts.Size() - 1; + } + } + { + int dotsIndex = -1; + for (unsigned i = numPrefixParts; i < pathParts.Size(); i++) + { + const UString &part = pathParts[i]; + if (part == L".." || part == L".") { + dotsIndex = i; + } + } + + if (dotsIndex >= 0) { + if (dotsIndex == (int)pathParts.Size() - 1) { + numSkipParts = pathParts.Size(); + } + else { + numSkipParts = pathParts.Size() - 1; + } + } + } + + for (unsigned i = 0; i < numSkipParts; i++) + { + { + const UString &front = pathParts.Front(); + // WIN32 doesn't support wildcards in file names + if (wildcardMatching) + if (i >= numPrefixParts && DoesNameContainWildcard(front)) + break; + prefix += front; + prefix.Add_PathSepar(); + } + pathParts.Delete(0); + } + } + + int index = FindPrefix(prefix); + if (index < 0) { + index = Pairs.Add(CPair(prefix)); + } + if (pathMode != k_AbsPath) + { + if (pathParts.IsEmpty() || (pathParts.Size() == 1 && pathParts[0].IsEmpty())) + { + // we create universal item, if we skip all parts as prefix (like \ or L:\ ) + pathParts.Clear(); + pathParts.Add(L"*"); + forFile = true; + wildcardMatching = true; + recursive = false; + } + } + + CItem item; + item.PathParts = pathParts; + item.ForDir = true; + item.ForFile = forFile; + item.Recursive = recursive; + item.WildcardMatching = wildcardMatching; + Pairs[index].Head.AddItem(include, item, ignoreWildcardIndex); +} + +/* +bool CCensor::CheckPath(bool isAltStream, const UString &path, bool isFile) const +{ + bool finded = false; + FOR_VECTOR (i, Pairs) + { + bool include; + if (Pairs[i].Head.CheckPath2(isAltStream, path, isFile, include)) + { + if (!include) + return false; + finded = true; + } + } + return finded; +} +*/ + +void CCensor::ExtendExclude() +{ + unsigned i; + for (i = 0; i < Pairs.Size(); i++) + if (Pairs[i].Prefix.IsEmpty()) + break; + if (i == Pairs.Size()) + return; + unsigned index = i; + for (i = 0; i < Pairs.Size(); i++) + if (index != i) + Pairs[i].Head.ExtendExclude(Pairs[index].Head); +} + +void CCensor::AddPathsToCensor(ECensorPathMode censorPathMode) +{ + FOR_VECTOR(i, CensorPaths) + { + const CCensorPath &cp = CensorPaths[i]; + AddItem(censorPathMode, cp.Include, cp.Path, cp.Recursive, cp.WildcardMatching); + } + CensorPaths.Clear(); +} + +void CCensor::AddPreItem(bool include, const UString &path, bool recursive, bool wildcardMatching) +{ + CCensorPath &cp = CensorPaths.AddNew(); + cp.Path = path; + cp.Include = include; + cp.Recursive = recursive; + cp.WildcardMatching = wildcardMatching; +} + +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/Wildcard.h b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Wildcard.h new file mode 100644 index 0000000000..2ed7298212 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/Wildcard.h @@ -0,0 +1,149 @@ +// Common/Wildcard.h + +#ifndef __COMMON_WILDCARD_H +#define __COMMON_WILDCARD_H + +#include "MyString.h" + +int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW; +#ifndef USE_UNICODE_FSTRING + int CompareFileNames(const char *s1, const char *s2); +#endif + +bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2); + +void SplitPathToParts(const UString &path, UStringVector &pathParts); +void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name); +void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name); // ignores dir delimiter at the end of (path) + +UString ExtractDirPrefixFromPath(const UString &path); +UString ExtractFileNameFromPath(const UString &path); + +bool DoesNameContainWildcard(const UString &path); +bool DoesWildcardMatchName(const UString &mask, const UString &name); + +namespace NWildcard { + +#ifdef _WIN32 +// returns true, if name is like "a:", "c:", ... +bool IsDriveColonName(const wchar_t *s); +unsigned GetNumPrefixParts_if_DrivePath(UStringVector &pathParts); +#endif + +struct CItem +{ + UStringVector PathParts; + bool Recursive; + bool ForFile; + bool ForDir; + bool WildcardMatching; + + #ifdef _WIN32 + bool IsDriveItem() const + { + return PathParts.Size() == 1 && !ForFile && ForDir && IsDriveColonName(PathParts[0]); + } + #endif + + // CItem(): WildcardMatching(true) {} + + bool AreAllAllowed() const; + bool CheckPath(const UStringVector &pathParts, bool isFile) const; +}; + +class CCensorNode +{ + CCensorNode *Parent; + + bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const; + void AddItemSimple(bool include, CItem &item); +public: + bool CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const; + + CCensorNode(): Parent(0) { }; + CCensorNode(const UString &name, CCensorNode *parent): Name(name), Parent(parent) { }; + + UString Name; // WIN32 doesn't support wildcards in file names + CObjectVector SubNodes; + CObjectVector IncludeItems; + CObjectVector ExcludeItems; + + bool AreAllAllowed() const; + + int FindSubNode(const UString &path) const; + + void AddItem(bool include, CItem &item, int ignoreWildcardIndex = -1); + void AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir, bool wildcardMatching); + void AddItem2(bool include, const UString &path, bool recursive, bool wildcardMatching); + + bool NeedCheckSubDirs() const; + bool AreThereIncludeItems() const; + + // bool CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const; + // bool CheckPath(bool isAltStream, const UString &path, bool isFile) const; + + bool CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const; + // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const; + void ExtendExclude(const CCensorNode &fromNodes); +}; + +struct CPair +{ + UString Prefix; + CCensorNode Head; + + CPair(const UString &prefix): Prefix(prefix) { }; +}; + +enum ECensorPathMode +{ + k_RelatPath, // absolute prefix as Prefix, remain path in Tree + k_FullPath, // drive prefix as Prefix, remain path in Tree + k_AbsPath // full path in Tree +}; + +struct CCensorPath +{ + UString Path; + bool Include; + bool Recursive; + bool WildcardMatching; + + CCensorPath(): + Include(true), + Recursive(false), + WildcardMatching(true) + {} +}; + +class CCensor +{ + int FindPrefix(const UString &prefix) const; +public: + CObjectVector Pairs; + + CObjectVector CensorPaths; + + bool AllAreRelative() const + { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); } + + void AddItem(ECensorPathMode pathMode, bool include, const UString &path, bool recursive, bool wildcardMatching); + // bool CheckPath(bool isAltStream, const UString &path, bool isFile) const; + void ExtendExclude(); + + void AddPathsToCensor(NWildcard::ECensorPathMode censorPathMode); + void AddPreItem(bool include, const UString &path, bool recursive, bool wildcardMatching); + void AddPreItem(const UString &path) + { + AddPreItem(true, path, false, false); + } + void AddPreItem_Wildcard() + { + AddPreItem(true, L"*", false, true); + } +}; + + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Common/XzCrc64Reg.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Common/XzCrc64Reg.cpp new file mode 100644 index 0000000000..92fce0a1a0 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Common/XzCrc64Reg.cpp @@ -0,0 +1,42 @@ +// XzCrc64Reg.cpp + +#include "StdAfx.h" + +#include "../../C/CpuArch.h" +#include "../../C/XzCrc64.h" + +#include "../Common/MyCom.h" + +#include "../7zip/Common/RegisterCodec.h" + +class CXzCrc64Hasher: + public IHasher, + public CMyUnknownImp +{ + UInt64 _crc; + Byte mtDummy[1 << 7]; + +public: + CXzCrc64Hasher(): _crc(CRC64_INIT_VAL) {} + + MY_UNKNOWN_IMP1(IHasher) + INTERFACE_IHasher(;) +}; + +STDMETHODIMP_(void) CXzCrc64Hasher::Init() throw() +{ + _crc = CRC64_INIT_VAL; +} + +STDMETHODIMP_(void) CXzCrc64Hasher::Update(const void *data, UInt32 size) throw() +{ + _crc = Crc64Update(_crc, data, size); +} + +STDMETHODIMP_(void) CXzCrc64Hasher::Final(Byte *digest) throw() +{ + UInt64 val = CRC64_GET_DIGEST(_crc); + SetUi64(digest, val); +} + +REGISTER_HASHER(CXzCrc64Hasher, 0x4, "CRC64", 8) diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Defs.h b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Defs.h new file mode 100644 index 0000000000..f3d692f3dd --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Defs.h @@ -0,0 +1,17 @@ +// Windows/Defs.h + +#ifndef __WINDOWS_DEFS_H +#define __WINDOWS_DEFS_H + +#include "../Common/MyWindows.h" + +#ifdef _WIN32 +inline bool LRESULTToBool(LRESULT v) { return (v != FALSE); } +inline bool BOOLToBool(BOOL v) { return (v != FALSE); } +inline BOOL BoolToBOOL(bool v) { return (v ? TRUE: FALSE); } +#endif + +inline VARIANT_BOOL BoolToVARIANT_BOOL(bool v) { return (v ? VARIANT_TRUE: VARIANT_FALSE); } +inline bool VARIANT_BOOLToBool(VARIANT_BOOL v) { return (v != VARIANT_FALSE); } + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/FileIO.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/FileIO.cpp new file mode 100644 index 0000000000..a1d52c0fe0 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/FileIO.cpp @@ -0,0 +1,432 @@ +// Windows/FileIO.cpp + +#include "StdAfx.h" + +#ifdef SUPPORT_DEVICE_FILE +#include "../../C/Alloc.h" +#endif + +#include "FileIO.h" +#include "FileName.h" + +#ifndef _UNICODE +extern bool g_IsNT; +#endif + +using namespace NWindows; +using namespace NFile; +using namespace NName; + +namespace NWindows { +namespace NFile { + +#ifdef SUPPORT_DEVICE_FILE + +namespace NSystem +{ +bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize); +} +#endif + +namespace NIO { + +/* +WinXP-64 CreateFile(): + "" - ERROR_PATH_NOT_FOUND + :stream - OK + .:stream - ERROR_PATH_NOT_FOUND + .\:stream - OK + + folder\:stream - ERROR_INVALID_NAME + folder:stream - OK + + c:\:stream - OK + + c::stream - ERROR_INVALID_NAME, if current dir is NOT ROOT ( c:\dir1 ) + c::stream - OK, if current dir is ROOT ( c:\ ) +*/ + +bool CFileBase::Create(CFSTR path, DWORD desiredAccess, + DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) +{ + if (!Close()) + return false; + + #ifdef SUPPORT_DEVICE_FILE + IsDeviceFile = false; + #endif + + #ifndef _UNICODE + if (!g_IsNT) + { + _handle = ::CreateFile(fs2fas(path), desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); + } + else + #endif + { + IF_USE_MAIN_PATH + _handle = ::CreateFileW(fs2us(path), desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); + #ifdef WIN_LONG_PATH + if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH) + { + UString superPath; + if (GetSuperPath(path, superPath, USE_MAIN_PATH)) + _handle = ::CreateFileW(superPath, desiredAccess, shareMode, + (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); + } + #endif + } + return (_handle != INVALID_HANDLE_VALUE); +} + +bool CFileBase::Close() throw() +{ + if (_handle == INVALID_HANDLE_VALUE) + return true; + if (!::CloseHandle(_handle)) + return false; + _handle = INVALID_HANDLE_VALUE; + return true; +} + +bool CFileBase::GetPosition(UInt64 &position) const throw() +{ + return Seek(0, FILE_CURRENT, position); +} + +bool CFileBase::GetLength(UInt64 &length) const throw() +{ + #ifdef SUPPORT_DEVICE_FILE + if (IsDeviceFile && SizeDefined) + { + length = Size; + return true; + } + #endif + + DWORD sizeHigh; + DWORD sizeLow = ::GetFileSize(_handle, &sizeHigh); + if (sizeLow == 0xFFFFFFFF) + if (::GetLastError() != NO_ERROR) + return false; + length = (((UInt64)sizeHigh) << 32) + sizeLow; + return true; +} + +bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw() +{ + #ifdef SUPPORT_DEVICE_FILE + if (IsDeviceFile && SizeDefined && moveMethod == FILE_END) + { + distanceToMove += Size; + moveMethod = FILE_BEGIN; + } + #endif + + LONG high = (LONG)(distanceToMove >> 32); + DWORD low = ::SetFilePointer(_handle, (LONG)(distanceToMove & 0xFFFFFFFF), &high, moveMethod); + if (low == 0xFFFFFFFF) + if (::GetLastError() != NO_ERROR) + return false; + newPosition = (((UInt64)(UInt32)high) << 32) + low; + return true; +} + +bool CFileBase::Seek(UInt64 position, UInt64 &newPosition) const throw() +{ + return Seek(position, FILE_BEGIN, newPosition); +} + +bool CFileBase::SeekToBegin() const throw() +{ + UInt64 newPosition; + return Seek(0, newPosition); +} + +bool CFileBase::SeekToEnd(UInt64 &newPosition) const throw() +{ + return Seek(0, FILE_END, newPosition); +} + +// ---------- CInFile --------- + +#ifdef SUPPORT_DEVICE_FILE + +void CInFile::CorrectDeviceSize() +{ + // maybe we must decrease kClusterSize to 1 << 12, if we want correct size at tail + static const UInt32 kClusterSize = 1 << 14; + UInt64 pos = Size & ~(UInt64)(kClusterSize - 1); + UInt64 realNewPosition; + if (!Seek(pos, realNewPosition)) + return; + Byte *buf = (Byte *)MidAlloc(kClusterSize); + + bool needbackward = true; + + for (;;) + { + UInt32 processed = 0; + // up test is slow for "PhysicalDrive". + // processed size for latest block for "PhysicalDrive0" is 0. + if (!Read1(buf, kClusterSize, processed)) + break; + if (processed == 0) + break; + needbackward = false; + Size = pos + processed; + if (processed != kClusterSize) + break; + pos += kClusterSize; + } + + if (needbackward && pos != 0) + { + pos -= kClusterSize; + for (;;) + { + // break; + if (!Seek(pos, realNewPosition)) + break; + if (!buf) + { + buf = (Byte *)MidAlloc(kClusterSize); + if (!buf) + break; + } + UInt32 processed = 0; + // that code doesn't work for "PhysicalDrive0" + if (!Read1(buf, kClusterSize, processed)) + break; + if (processed != 0) + { + Size = pos + processed; + break; + } + if (pos == 0) + break; + pos -= kClusterSize; + } + } + MidFree(buf); +} + + +void CInFile::CalcDeviceSize(CFSTR s) +{ + SizeDefined = false; + Size = 0; + if (_handle == INVALID_HANDLE_VALUE || !IsDeviceFile) + return; + #ifdef UNDER_CE + + SizeDefined = true; + Size = 128 << 20; + + #else + + PARTITION_INFORMATION partInfo; + bool needCorrectSize = true; + + /* + WinXP 64-bit: + + HDD \\.\PhysicalDrive0 (MBR): + GetPartitionInfo == GeometryEx : corrrect size? (includes tail) + Geometry : smaller than GeometryEx (no tail, maybe correct too?) + MyGetDiskFreeSpace : FAIL + Size correction is slow and block size (kClusterSize) must be small? + + HDD partition \\.\N: (NTFS): + MyGetDiskFreeSpace : Size of NTFS clusters. Same size can be calculated after correction + GetPartitionInfo : size of partition data: NTFS clusters + TAIL; TAIL contains extra empty sectors and copy of first sector of NTFS + Geometry / CdRomGeometry / GeometryEx : size of HDD (not that partition) + + CD-ROM drive (ISO): + MyGetDiskFreeSpace : correct size. Same size can be calculated after correction + Geometry == CdRomGeometry : smaller than corrrect size + GetPartitionInfo == GeometryEx : larger than corrrect size + + Floppy \\.\a: (FAT): + Geometry : correct size. + CdRomGeometry / GeometryEx / GetPartitionInfo / MyGetDiskFreeSpace - FAIL + correction works OK for FAT. + correction works OK for non-FAT, if kClusterSize = 512. + */ + + if (GetPartitionInfo(&partInfo)) + { + Size = partInfo.PartitionLength.QuadPart; + SizeDefined = true; + needCorrectSize = false; + if ((s)[0] == '\\' && (s)[1] == '\\' && (s)[2] == '.' && (s)[3] == '\\' && (s)[5] == ':' && (s)[6] == 0) + { + FChar path[4] = { s[4], ':', '\\', 0 }; + UInt64 clusterSize, totalSize, freeSize; + if (NSystem::MyGetDiskFreeSpace(path, clusterSize, totalSize, freeSize)) + Size = totalSize; + else + needCorrectSize = true; + } + } + + if (!SizeDefined) + { + my_DISK_GEOMETRY_EX geomEx; + SizeDefined = GetGeometryEx(&geomEx); + if (SizeDefined) + Size = geomEx.DiskSize.QuadPart; + else + { + DISK_GEOMETRY geom; + SizeDefined = GetGeometry(&geom); + if (!SizeDefined) + SizeDefined = GetCdRomGeometry(&geom); + if (SizeDefined) + Size = geom.Cylinders.QuadPart * geom.TracksPerCylinder * geom.SectorsPerTrack * geom.BytesPerSector; + } + } + + if (needCorrectSize && SizeDefined && Size != 0) + { + CorrectDeviceSize(); + SeekToBegin(); + } + + // SeekToBegin(); + #endif +} + +// ((desiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA | GENERIC_WRITE)) == 0 && + +#define MY_DEVICE_EXTRA_CODE \ + IsDeviceFile = IsDevicePath(fileName); \ + CalcDeviceSize(fileName); +#else +#define MY_DEVICE_EXTRA_CODE +#endif + +bool CInFile::Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) +{ + bool res = Create(fileName, GENERIC_READ, shareMode, creationDisposition, flagsAndAttributes); + MY_DEVICE_EXTRA_CODE + return res; +} + +bool CInFile::OpenShared(CFSTR fileName, bool shareForWrite) +{ return Open(fileName, FILE_SHARE_READ | (shareForWrite ? FILE_SHARE_WRITE : 0), OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL); } + +bool CInFile::Open(CFSTR fileName) + { return OpenShared(fileName, false); } + +// ReadFile and WriteFile functions in Windows have BUG: +// If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) +// from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES +// (Insufficient system resources exist to complete the requested service). + +// Probably in some version of Windows there are problems with other sizes: +// for 32 MB (maybe also for 16 MB). +// And message can be "Network connection was lost" + +static UInt32 kChunkSizeMax = (1 << 22); + +bool CInFile::Read1(void *data, UInt32 size, UInt32 &processedSize) throw() +{ + DWORD processedLoc = 0; + bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL)); + processedSize = (UInt32)processedLoc; + return res; +} + +bool CInFile::ReadPart(void *data, UInt32 size, UInt32 &processedSize) throw() +{ + if (size > kChunkSizeMax) + size = kChunkSizeMax; + return Read1(data, size, processedSize); +} + +bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) throw() +{ + processedSize = 0; + do + { + UInt32 processedLoc = 0; + bool res = ReadPart(data, size, processedLoc); + processedSize += processedLoc; + if (!res) + return false; + if (processedLoc == 0) + return true; + data = (void *)((unsigned char *)data + processedLoc); + size -= processedLoc; + } + while (size > 0); + return true; +} + +// ---------- COutFile --------- + +static inline DWORD GetCreationDisposition(bool createAlways) + { return createAlways? CREATE_ALWAYS: CREATE_NEW; } + +bool COutFile::Open(CFSTR fileName, DWORD shareMode, DWORD creationDisposition, DWORD flagsAndAttributes) + { return CFileBase::Create(fileName, GENERIC_WRITE, shareMode, creationDisposition, flagsAndAttributes); } + +bool COutFile::Open(CFSTR fileName, DWORD creationDisposition) + { return Open(fileName, FILE_SHARE_READ, creationDisposition, FILE_ATTRIBUTE_NORMAL); } + +bool COutFile::Create(CFSTR fileName, bool createAlways) + { return Open(fileName, GetCreationDisposition(createAlways)); } + +bool COutFile::CreateAlways(CFSTR fileName, DWORD flagsAndAttributes) + { return Open(fileName, FILE_SHARE_READ, GetCreationDisposition(true), flagsAndAttributes); } + +bool COutFile::SetTime(const FILETIME *cTime, const FILETIME *aTime, const FILETIME *mTime) throw() + { return BOOLToBool(::SetFileTime(_handle, cTime, aTime, mTime)); } + +bool COutFile::SetMTime(const FILETIME *mTime) throw() { return SetTime(NULL, NULL, mTime); } + +bool COutFile::WritePart(const void *data, UInt32 size, UInt32 &processedSize) throw() +{ + if (size > kChunkSizeMax) + size = kChunkSizeMax; + DWORD processedLoc = 0; + bool res = BOOLToBool(::WriteFile(_handle, data, size, &processedLoc, NULL)); + processedSize = (UInt32)processedLoc; + return res; +} + +bool COutFile::Write(const void *data, UInt32 size, UInt32 &processedSize) throw() +{ + processedSize = 0; + do + { + UInt32 processedLoc = 0; + bool res = WritePart(data, size, processedLoc); + processedSize += processedLoc; + if (!res) + return false; + if (processedLoc == 0) + return true; + data = (const void *)((const unsigned char *)data + processedLoc); + size -= processedLoc; + } + while (size > 0); + return true; +} + +bool COutFile::SetEndOfFile() throw() { return BOOLToBool(::SetEndOfFile(_handle)); } + +bool COutFile::SetLength(UInt64 length) throw() +{ + UInt64 newPosition; + if (!Seek(length, newPosition)) + return false; + if (newPosition != length) + return false; + return SetEndOfFile(); +} + +}}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariant.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariant.cpp new file mode 100644 index 0000000000..6b3f20bba9 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariant.cpp @@ -0,0 +1,347 @@ +// Windows/PropVariant.cpp + +#include "StdAfx.h" + +#include "../Common/Defs.h" + +#include "PropVariant.h" + +namespace NWindows { +namespace NCOM { + +BSTR AllocBstrFromAscii(const char *s) throw() +{ + if (!s) + return NULL; + UINT len = (UINT)strlen(s); + BSTR p = ::SysAllocStringLen(NULL, len); + if (p) + { + for (UINT i = 0; i <= len; i++) + p[i] = (Byte)s[i]; + } + return p; +} + +HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw() +{ + p->bstrVal = ::SysAllocStringLen(NULL, numChars); + if (!p->bstrVal) + { + p->vt = VT_ERROR; + p->scode = E_OUTOFMEMORY; + return E_OUTOFMEMORY; + } + p->vt = VT_BSTR; + return S_OK; +} + +HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw() +{ + p->bstrVal = AllocBstrFromAscii(s); + if (p->bstrVal) + { + p->vt = VT_BSTR; + return S_OK; + } + p->vt = VT_ERROR; + p->scode = E_OUTOFMEMORY; + return E_OUTOFMEMORY; +} + +CPropVariant::CPropVariant(const PROPVARIANT &varSrc) +{ + vt = VT_EMPTY; + InternalCopy(&varSrc); +} + +CPropVariant::CPropVariant(const CPropVariant &varSrc) +{ + vt = VT_EMPTY; + InternalCopy(&varSrc); +} + +CPropVariant::CPropVariant(BSTR bstrSrc) +{ + vt = VT_EMPTY; + *this = bstrSrc; +} + +CPropVariant::CPropVariant(LPCOLESTR lpszSrc) +{ + vt = VT_EMPTY; + *this = lpszSrc; +} + +CPropVariant& CPropVariant::operator=(const CPropVariant &varSrc) +{ + InternalCopy(&varSrc); + return *this; +} + +CPropVariant& CPropVariant::operator=(const PROPVARIANT &varSrc) +{ + InternalCopy(&varSrc); + return *this; +} + +CPropVariant& CPropVariant::operator=(BSTR bstrSrc) +{ + *this = (LPCOLESTR)bstrSrc; + return *this; +} + +static const char *kMemException = "out of memory"; + +CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc) +{ + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + bstrVal = ::SysAllocString(lpszSrc); + if (!bstrVal && lpszSrc) + { + throw kMemException; + // vt = VT_ERROR; + // scode = E_OUTOFMEMORY; + } + return *this; +} + +CPropVariant& CPropVariant::operator=(const UString &s) +{ + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + bstrVal = ::SysAllocStringLen(s, s.Len()); + if (!bstrVal) + throw kMemException; + return *this; +} + +CPropVariant& CPropVariant::operator=(const UString2 &s) +{ + /* + if (s.IsEmpty()) + *this = L""; + else + */ + { + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + bstrVal = ::SysAllocStringLen(s.GetRawPtr(), s.Len()); + if (!bstrVal) + throw kMemException; + /* SysAllocStringLen probably appends a null-terminating character for NULL string. + But it doesn't specified in MSDN. + But we suppose that it works + + if (!s.GetRawPtr()) + { + *bstrVal = 0; + } + */ + + /* MSDN: Windows CE: SysAllocStringLen() : Passing invalid (and under some circumstances NULL) + pointers to this function causes an unexpected termination of the application. + Is it safe? Maybe we must chamnge the code for that case ? */ + } + return *this; +} + +CPropVariant& CPropVariant::operator=(const char *s) +{ + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + bstrVal = AllocBstrFromAscii(s); + if (!bstrVal) + { + throw kMemException; + // vt = VT_ERROR; + // scode = E_OUTOFMEMORY; + } + return *this; +} + +CPropVariant& CPropVariant::operator=(bool bSrc) throw() +{ + if (vt != VT_BOOL) + { + InternalClear(); + vt = VT_BOOL; + } + boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; + return *this; +} + +BSTR CPropVariant::AllocBstr(unsigned numChars) +{ + if (vt != VT_EMPTY) + InternalClear(); + vt = VT_BSTR; + wReserved1 = 0; + bstrVal = ::SysAllocStringLen(NULL, numChars); + if (!bstrVal) + { + throw kMemException; + // vt = VT_ERROR; + // scode = E_OUTOFMEMORY; + } + return bstrVal; +} + +#define SET_PROP_FUNC(type, id, dest) \ + CPropVariant& CPropVariant::operator=(type value) throw() \ + { if (vt != id) { InternalClear(); vt = id; } \ + dest = value; return *this; } + +SET_PROP_FUNC(Byte, VT_UI1, bVal) +// SET_PROP_FUNC(Int16, VT_I2, iVal) +SET_PROP_FUNC(Int32, VT_I4, lVal) +SET_PROP_FUNC(UInt32, VT_UI4, ulVal) +SET_PROP_FUNC(UInt64, VT_UI8, uhVal.QuadPart) +SET_PROP_FUNC(Int64, VT_I8, hVal.QuadPart) +SET_PROP_FUNC(const FILETIME &, VT_FILETIME, filetime) + +HRESULT PropVariant_Clear(PROPVARIANT *prop) throw() +{ + switch (prop->vt) + { + case VT_EMPTY: + case VT_UI1: + case VT_I1: + case VT_I2: + case VT_UI2: + case VT_BOOL: + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_INT: + case VT_UINT: + case VT_ERROR: + case VT_FILETIME: + case VT_UI8: + case VT_R8: + case VT_CY: + case VT_DATE: + prop->vt = VT_EMPTY; + prop->wReserved1 = 0; + prop->wReserved2 = 0; + prop->wReserved3 = 0; + prop->uhVal.QuadPart = 0; + return S_OK; + } + return ::VariantClear((VARIANTARG *)prop); + // return ::PropVariantClear(prop); + // PropVariantClear can clear VT_BLOB. +} + +HRESULT CPropVariant::Clear() throw() +{ + if (vt == VT_EMPTY) + return S_OK; + return PropVariant_Clear(this); +} + +HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) throw() +{ + ::VariantClear((tagVARIANT *)this); + switch (pSrc->vt) + { + case VT_UI1: + case VT_I1: + case VT_I2: + case VT_UI2: + case VT_BOOL: + case VT_I4: + case VT_UI4: + case VT_R4: + case VT_INT: + case VT_UINT: + case VT_ERROR: + case VT_FILETIME: + case VT_UI8: + case VT_R8: + case VT_CY: + case VT_DATE: + memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT)); + return S_OK; + } + return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)const_cast(pSrc)); +} + + +HRESULT CPropVariant::Attach(PROPVARIANT *pSrc) throw() +{ + HRESULT hr = Clear(); + if (FAILED(hr)) + return hr; + memcpy(this, pSrc, sizeof(PROPVARIANT)); + pSrc->vt = VT_EMPTY; + return S_OK; +} + +HRESULT CPropVariant::Detach(PROPVARIANT *pDest) throw() +{ + if (pDest->vt != VT_EMPTY) + { + HRESULT hr = PropVariant_Clear(pDest); + if (FAILED(hr)) + return hr; + } + memcpy(pDest, this, sizeof(PROPVARIANT)); + vt = VT_EMPTY; + return S_OK; +} + +HRESULT CPropVariant::InternalClear() throw() +{ + if (vt == VT_EMPTY) + return S_OK; + HRESULT hr = Clear(); + if (FAILED(hr)) + { + vt = VT_ERROR; + scode = hr; + } + return hr; +} + +void CPropVariant::InternalCopy(const PROPVARIANT *pSrc) +{ + HRESULT hr = Copy(pSrc); + if (FAILED(hr)) + { + if (hr == E_OUTOFMEMORY) + throw kMemException; + vt = VT_ERROR; + scode = hr; + } +} + +int CPropVariant::Compare(const CPropVariant &a) throw() +{ + if (vt != a.vt) + return MyCompare(vt, a.vt); + switch (vt) + { + case VT_EMPTY: return 0; + // case VT_I1: return MyCompare(cVal, a.cVal); + case VT_UI1: return MyCompare(bVal, a.bVal); + case VT_I2: return MyCompare(iVal, a.iVal); + case VT_UI2: return MyCompare(uiVal, a.uiVal); + case VT_I4: return MyCompare(lVal, a.lVal); + case VT_UI4: return MyCompare(ulVal, a.ulVal); + // case VT_UINT: return MyCompare(uintVal, a.uintVal); + case VT_I8: return MyCompare(hVal.QuadPart, a.hVal.QuadPart); + case VT_UI8: return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart); + case VT_BOOL: return -MyCompare(boolVal, a.boolVal); + case VT_FILETIME: return ::CompareFileTime(&filetime, &a.filetime); + case VT_BSTR: return 0; // Not implemented + default: return 0; + } +} + +}} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariant.h b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariant.h new file mode 100644 index 0000000000..03045653f2 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariant.h @@ -0,0 +1,112 @@ +// Windows/PropVariant.h + +#ifndef __WINDOWS_PROP_VARIANT_H +#define __WINDOWS_PROP_VARIANT_H + +#include "../Common/MyTypes.h" +#include "../Common/MyWindows.h" +#include "../Common/MyString.h" + +namespace NWindows { +namespace NCOM { + +BSTR AllocBstrFromAscii(const char *s) throw(); + +HRESULT PropVariant_Clear(PROPVARIANT *p) throw(); + +HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw(); +HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw(); + +inline void PropVarEm_Set_UInt32(PROPVARIANT *p, UInt32 v) throw() +{ + p->vt = VT_UI4; + p->ulVal = v; +} + +inline void PropVarEm_Set_UInt64(PROPVARIANT *p, UInt64 v) throw() +{ + p->vt = VT_UI8; + p->uhVal.QuadPart = v; +} + +inline void PropVarEm_Set_FileTime64(PROPVARIANT *p, UInt64 v) throw() +{ + p->vt = VT_FILETIME; + p->filetime.dwLowDateTime = (DWORD)v; + p->filetime.dwHighDateTime = (DWORD)(v >> 32); +} + +inline void PropVarEm_Set_Bool(PROPVARIANT *p, bool b) throw() +{ + p->vt = VT_BOOL; + p->boolVal = (b ? VARIANT_TRUE : VARIANT_FALSE); +} + + +class CPropVariant : public tagPROPVARIANT +{ +public: + CPropVariant() + { + vt = VT_EMPTY; + wReserved1 = 0; + // wReserved2 = 0; + // wReserved3 = 0; + // uhVal.QuadPart = 0; + bstrVal = 0; + } + ~CPropVariant() throw() { Clear(); } + CPropVariant(const PROPVARIANT &varSrc); + CPropVariant(const CPropVariant &varSrc); + CPropVariant(BSTR bstrSrc); + CPropVariant(LPCOLESTR lpszSrc); + CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); } + CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; } + +private: + CPropVariant(Int16 value); // { vt = VT_I2; wReserved1 = 0; iVal = value; } + CPropVariant(Int32 value); // { vt = VT_I4; wReserved1 = 0; lVal = value; } + +public: + CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; } + CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal.QuadPart = value; } + CPropVariant(Int64 value) { vt = VT_I8; wReserved1 = 0; hVal.QuadPart = value; } + CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; } + + CPropVariant& operator=(const CPropVariant &varSrc); + CPropVariant& operator=(const PROPVARIANT &varSrc); + CPropVariant& operator=(BSTR bstrSrc); + CPropVariant& operator=(LPCOLESTR lpszSrc); + CPropVariant& operator=(const UString &s); + CPropVariant& operator=(const UString2 &s); + CPropVariant& operator=(const char *s); + + CPropVariant& operator=(bool bSrc) throw(); + CPropVariant& operator=(Byte value) throw(); + +private: + CPropVariant& operator=(Int16 value) throw(); + +public: + CPropVariant& operator=(Int32 value) throw(); + CPropVariant& operator=(UInt32 value) throw(); + CPropVariant& operator=(UInt64 value) throw(); + CPropVariant& operator=(Int64 value) throw(); + CPropVariant& operator=(const FILETIME &value) throw(); + + BSTR AllocBstr(unsigned numChars); + + HRESULT Clear() throw(); + HRESULT Copy(const PROPVARIANT *pSrc) throw(); + HRESULT Attach(PROPVARIANT *pSrc) throw(); + HRESULT Detach(PROPVARIANT *pDest) throw(); + + HRESULT InternalClear() throw(); + void InternalCopy(const PROPVARIANT *pSrc); + + int Compare(const CPropVariant &a) throw(); +}; + +}} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariantConv.cpp b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariantConv.cpp new file mode 100644 index 0000000000..81e2e3c191 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariantConv.cpp @@ -0,0 +1,114 @@ +// PropVariantConvert.cpp + +#include "StdAfx.h" + +#include "../Common/IntToString.h" + +#include "Defs.h" +#include "PropVariantConv.h" + +#define UINT_TO_STR_2(c, val) { s[0] = (c); s[1] = (char)('0' + (val) / 10); s[2] = (char)('0' + (val) % 10); s += 3; } + +bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime, bool includeSeconds) throw() +{ +#if defined(__APPLE__) + assert(0); + return true; +#else + SYSTEMTIME st; + if (!BOOLToBool(FileTimeToSystemTime(&ft, &st))) + { + *s = 0; + return false; + } + unsigned val = st.wYear; + if (val >= 10000) + { + *s++ = (char)('0' + val / 10000); + val %= 10000; + } + { + s[3] = (char)('0' + val % 10); val /= 10; + s[2] = (char)('0' + val % 10); val /= 10; + s[1] = (char)('0' + val % 10); + s[0] = (char)('0' + val / 10); + s += 4; + } + UINT_TO_STR_2('-', st.wMonth); + UINT_TO_STR_2('-', st.wDay); + if (includeTime) + { + UINT_TO_STR_2(' ', st.wHour); + UINT_TO_STR_2(':', st.wMinute); + if (includeSeconds) + { + UINT_TO_STR_2(':', st.wSecond); + /* + *s++ = '.'; + unsigned val = st.wMilliseconds; + s[2] = (char)('0' + val % 10); val /= 10; + s[1] = (char)('0' + val % 10); + s[0] = (char)('0' + val / 10); + s += 3; + */ + } + } + *s = 0; + return true; +#endif +} + +void ConvertFileTimeToString(const FILETIME &ft, wchar_t *dest, bool includeTime, bool includeSeconds) throw() +{ + char s[32]; + ConvertFileTimeToString(ft, s, includeTime, includeSeconds); + for (unsigned i = 0;; i++) + { + unsigned char c = s[i]; + dest[i] = c; + if (c == 0) + return; + } +} + +void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw() +{ + *dest = 0; + switch (prop.vt) + { + case VT_EMPTY: return; + case VT_BSTR: dest[0] = '?'; dest[1] = 0; return; + case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return; + case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return; + case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return; + case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return; + case VT_FILETIME: ConvertFileTimeToString(prop.filetime, dest, true, true); return; + // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return; + case VT_I2: ConvertInt64ToString(prop.iVal, dest); return; + case VT_I4: ConvertInt64ToString(prop.lVal, dest); return; + case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return; + case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? '+' : '-'; dest[1] = 0; return; + default: dest[0] = '?'; dest[1] = ':'; ConvertUInt64ToString(prop.vt, dest + 2); + } +} + +void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw() +{ + *dest = 0; + switch (prop.vt) + { + case VT_EMPTY: return; + case VT_BSTR: dest[0] = '?'; dest[1] = 0; return; + case VT_UI1: ConvertUInt32ToString(prop.bVal, dest); return; + case VT_UI2: ConvertUInt32ToString(prop.uiVal, dest); return; + case VT_UI4: ConvertUInt32ToString(prop.ulVal, dest); return; + case VT_UI8: ConvertUInt64ToString(prop.uhVal.QuadPart, dest); return; + case VT_FILETIME: ConvertFileTimeToString(prop.filetime, dest, true, true); return; + // case VT_I1: return ConvertInt64ToString(prop.cVal, dest); return; + case VT_I2: ConvertInt64ToString(prop.iVal, dest); return; + case VT_I4: ConvertInt64ToString(prop.lVal, dest); return; + case VT_I8: ConvertInt64ToString(prop.hVal.QuadPart, dest); return; + case VT_BOOL: dest[0] = VARIANT_BOOLToBool(prop.boolVal) ? (wchar_t)'+' : (wchar_t)'-'; dest[1] = 0; return; + default: dest[0] = '?'; dest[1] = ':'; ConvertUInt32ToString(prop.vt, dest + 2); + } +} diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariantConv.h b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariantConv.h new file mode 100644 index 0000000000..3e8297ddc4 --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/PropVariantConv.h @@ -0,0 +1,30 @@ +// Windows/PropVariantConv.h + +#ifndef __PROP_VARIANT_CONV_H +#define __PROP_VARIANT_CONV_H + +#include "../Common/MyTypes.h" + +// provide at least 32 bytes for buffer including zero-end +bool ConvertFileTimeToString(const FILETIME &ft, char *s, bool includeTime = true, bool includeSeconds = true) throw(); +void ConvertFileTimeToString(const FILETIME &ft, wchar_t *s, bool includeTime = true, bool includeSeconds = true) throw(); + +// provide at least 32 bytes for buffer including zero-end +// don't send VT_BSTR to these functions +void ConvertPropVariantToShortString(const PROPVARIANT &prop, char *dest) throw(); +void ConvertPropVariantToShortString(const PROPVARIANT &prop, wchar_t *dest) throw(); + +inline bool ConvertPropVariantToUInt64(const PROPVARIANT &prop, UInt64 &value) +{ + switch (prop.vt) + { + case VT_UI8: value = (UInt64)prop.uhVal.QuadPart; return true; + case VT_UI4: value = prop.ulVal; return true; + case VT_UI2: value = prop.uiVal; return true; + case VT_UI1: value = prop.bVal; return true; + case VT_EMPTY: return false; + default: throw 151199; + } +} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/StdAfx.h b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/StdAfx.h new file mode 100644 index 0000000000..4b3d21049f --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/StdAfx.h @@ -0,0 +1,9 @@ +// StdAfx.h + +#ifndef __STDAFX_H +#define __STDAFX_H + +#include "../Common/Common.h" +#include "../../../src/LzmaAppleCommon.h" + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Synchronization.h b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Synchronization.h new file mode 100644 index 0000000000..f35cd9823a --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Synchronization.h @@ -0,0 +1,209 @@ +// Windows/Synchronization.h + +#ifndef __WINDOWS_SYNCHRONIZATION_H +#define __WINDOWS_SYNCHRONIZATION_H + +#include "../../C/Threads.h" + +#include "Defs.h" + +#ifdef _WIN32 +#include "Handle.h" +#endif + +namespace NWindows { + namespace NSynchronization { +#if defined(__APPLE__) + struct CBaseHandle + { + typedef enum { EVENT , SEMAPHORE } t_type; + + CBaseHandle(t_type t) { type = t; } + + t_type type; + union + { + struct + { + bool _manual_reset; + bool _state; + } event; + struct + { + LONG count; + LONG maxCount; + } sema; + } u; + operator HANDLE() { return ((HANDLE)this); } + bool Close() { return true; } + }; +#endif + class CBaseEvent + { + protected: + ::CEvent _object; + public: + bool IsCreated() { return Event_IsCreated(&_object) != 0; } + operator HANDLE() { return &_object; } + CBaseEvent() { Event_Construct(&_object); } + ~CBaseEvent() { Close(); } + WRes Close() { return Event_Close(&_object); } +#ifdef _WIN32 + WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) + { + _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); + if (name == NULL && _object != 0) + return 0; + return ::GetLastError(); + } + WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + { + _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); + if (_object != 0) + return 0; + return ::GetLastError(); + } +#endif + + WRes Set() { return Event_Set(&_object); } + // bool Pulse() { return BOOLToBool(::PulseEvent(_handle)); } + WRes Reset() { return Event_Reset(&_object); } + WRes Lock() { return Event_Wait(&_object); } + }; + + class CManualResetEvent: public CBaseEvent + { + public: + WRes Create(bool initiallyOwn = false) + { + return ManualResetEvent_Create(&_object, initiallyOwn ? 1: 0); + } + WRes CreateIfNotCreated() + { + if (IsCreated()) + return 0; + return ManualResetEvent_CreateNotSignaled(&_object); + } +#ifdef _WIN32 + WRes CreateWithName(bool initiallyOwn, LPCTSTR name) + { + return CBaseEvent::Create(true, initiallyOwn, name); + } +#endif + }; + + class CAutoResetEvent: public CBaseEvent + { + public: + WRes Create() + { + return AutoResetEvent_CreateNotSignaled(&_object); + } + WRes CreateIfNotCreated() + { + if (IsCreated()) + return 0; + return AutoResetEvent_CreateNotSignaled(&_object); + } + }; + +#ifdef _WIN32 + class CObject: public CHandle + { + public: + WRes Lock(DWORD timeoutInterval = INFINITE) + { return (::WaitForSingleObject(_handle, timeoutInterval) == WAIT_OBJECT_0 ? 0 : ::GetLastError()); } + }; + class CMutex: public CObject + { + public: + WRes Create(bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) + { + _handle = ::CreateMutex(sa, BoolToBOOL(initiallyOwn), name); + if (name == NULL && _handle != 0) + return 0; + return ::GetLastError(); + } +#ifndef UNDER_CE + WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) + { + _handle = ::OpenMutex(desiredAccess, BoolToBOOL(inheritHandle), name); + if (_handle != 0) + return 0; + return ::GetLastError(); + } +#endif + WRes Release() + { + return ::ReleaseMutex(_handle) ? 0 : ::GetLastError(); + } + }; + class CMutexLock + { + CMutex *_object; + public: + CMutexLock(CMutex &object): _object(&object) { _object->Lock(); } + ~CMutexLock() { _object->Release(); } + }; +#endif + + class CSemaphore + { + ::CSemaphore _object; + public: + CSemaphore() { Semaphore_Construct(&_object); } + ~CSemaphore() { Close(); } + WRes Close() { return Semaphore_Close(&_object); } + operator HANDLE() { return &_object; } + WRes Create(UInt32 initiallyCount, UInt32 maxCount) + { + return Semaphore_Create(&_object, initiallyCount, maxCount); + } + WRes Release() { return Semaphore_Release1(&_object); } + WRes Release(UInt32 releaseCount) { return Semaphore_ReleaseN(&_object, releaseCount); } + WRes Lock() { return Semaphore_Wait(&_object); } + }; + +#if defined (__APPLE__) + class CCriticalSection + { + pthread_mutex_t _object; + pthread_cond_t _cond; + public: + CCriticalSection() { + ::pthread_mutex_init(&_object,0); + ::pthread_cond_init(&_cond,0); + } + ~CCriticalSection() { + ::pthread_mutex_destroy(&_object); + ::pthread_cond_destroy(&_cond); + } + void Enter() { ::pthread_mutex_lock(&_object); } + void Leave() { ::pthread_mutex_unlock(&_object); } + void WaitCond() { ::pthread_cond_wait(&_cond, &_object); } + void SignalCond() { ::pthread_cond_broadcast(&_cond); } + }; +#else + class CCriticalSection + { + ::CCriticalSection _object; + public: + CCriticalSection() { CriticalSection_Init(&_object); } + ~CCriticalSection() { CriticalSection_Delete(&_object); } + void Enter() { CriticalSection_Enter(&_object); } + void Leave() { CriticalSection_Leave(&_object); } + }; +#endif + + class CCriticalSectionLock + { + CCriticalSection *_object; + void Unlock() { _object->Leave(); } + public: + CCriticalSectionLock(CCriticalSection &object): _object(&object) {_object->Enter(); } + ~CCriticalSectionLock() { Unlock(); } + }; + + }} + +#endif diff --git a/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Thread.h b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Thread.h new file mode 100644 index 0000000000..1b5863ce4c --- /dev/null +++ b/Provenance/LzmaSDKObjC/lzma/CPP/Windows/Thread.h @@ -0,0 +1,38 @@ +// Windows/Thread.h + +#ifndef __WINDOWS_THREAD_H +#define __WINDOWS_THREAD_H + +#include "../../C/Threads.h" + +#include "Defs.h" + +namespace NWindows { + +class CThread +{ + ::CThread thread; +public: + CThread() { Thread_Construct(&thread); } + ~CThread() { Close(); } + bool IsCreated() { return Thread_WasCreated(&thread) != 0; } + WRes Close() { return Thread_Close(&thread); } + WRes Create(THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter) + { return Thread_Create(&thread, startAddress, parameter); } + WRes Wait() { return Thread_Wait(&thread); } + + #ifdef _WIN32 + operator HANDLE() { return thread; } + void Attach(HANDLE handle) { thread = handle; } + HANDLE Detach() { HANDLE h = thread; thread = NULL; return h; } + DWORD Resume() { return ::ResumeThread(thread); } + DWORD Suspend() { return ::SuspendThread(thread); } + bool Terminate(DWORD exitCode) { return BOOLToBool(::TerminateThread(thread, exitCode)); } + int GetPriority() { return ::GetThreadPriority(thread); } + bool SetPriority(int priority) { return BOOLToBool(::SetThreadPriority(thread, priority)); } + #endif +}; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaAppleCommon.h b/Provenance/LzmaSDKObjC/src/LzmaAppleCommon.h new file mode 100644 index 0000000000..84bdd62514 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaAppleCommon.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMAAPPLECOMMON_H__ +#define __LZMAAPPLECOMMON_H__ 1 + +#if defined(__APPLE__) || defined(TARGET_OS_MAC) || defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR) || defined(TARGET_OS_EMBEDDED) +#ifndef __APPLE__ +#define __APPLE__ 1 +#endif + +#define LZMASDKOBJC_OMIT_UNUSED_CODE 1 + +#if defined(_UNICODE) +#undef _UNICODE +#endif + +#ifndef ENV_HAVE_GCCVISIBILITYPATCH +#define ENV_HAVE_GCCVISIBILITYPATCH 1 +#endif + +#if ( defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_AMD64_) || defined(_M_AMD64) ) +#define __APPLE_64__ 1 +#endif + +#ifndef __APPLE_64__ +#if ( defined(__LP64__) || defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(__ia64) || defined(_M_IA64) ) +#define __APPLE_64__ 1 +#endif +#endif + +#ifndef __APPLE_64__ +#if ( defined(_WIN64) || defined(__X86_64__) || defined(WIN64) || defined(_LP64) || defined(ppc64) || defined(x86_64) ) +#define __APPLE_64__ 1 +#endif +#endif + +#ifndef __APPLE_64__ +#if ( defined(__x86_64__) || defined(__ppc64__) ) +#define __APPLE_64__ 1 +#endif +#endif + + +#ifndef __APPLE_64__ +#define __APPLE_32__ 1 +#endif + +#endif + +#if !defined(LZMASDKOBJC_EXTERN) +#if defined(__cplusplus) || defined(_cplusplus) +#define LZMASDKOBJC_EXTERN extern "C" +#else +#define LZMASDKOBJC_EXTERN extern +#endif +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef void *PVOID, *LPVOID; +typedef PVOID HANDLE; + +#ifndef DWORD_SIZE +#define DWORD_SIZE 4 +typedef uint32_t DWORD; +#endif + + +// MyWindows.h - removed prev. definition & MyWindows.cpp - implemented +LZMASDKOBJC_EXTERN DWORD GetLastError(); + +// unused +// void SetLastError(DWORD err) { errno = err; } + +#if !defined(__OBJC__) +typedef signed char BOOL; +#endif + +#if !defined(__cplusplus) && !defined(_cplusplus) +#define TRUE 1 +#define FALSE 0 +#endif + + +#ifndef USE_MIXER_ST +#define USE_MIXER_ST 1 +#endif + +#ifndef _7ZIP_ST +#define _7ZIP_ST 1 +#endif + +#endif + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjC.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjC.h new file mode 100644 index 0000000000..6db36b4566 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjC.h @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJC_H__ +#define __LZMASDKOBJC_H__ 1 + + +/* + * Lzma SDK for Objective-C based on extended functionality of the C++ LZMA code + * + * Changes on version 2.0.13 (current): + * - Added all default (de)coders. + * + * Changes on version 2.0.12: + * - Add BCJ2 and PPMdH (de)coders. + * + * Changes on version 2.0.10: + * - Update C++ source to version 16.04 (1604 - latest for now). + * + * Changes on version 2.0.9: + * - Update C++ source to version 16.03 (1603 - latest for now). + * + * Changes on version 2.0.8: + * - Fix Cocoapod script. + * + * Changes on version 2.0.5: + * - Omin some unused code. + * - Disable Unicode, used UTF8 instead. + * + * Changes on version 2.0.3: + * - Remove redurant string conversion code. + * + * Changes on version 2.0.2: + * - Fix encode settings count. + * + * Changes on version 2.0.1: + * - Remove xz support. + * - Customize all writer settings. + * + * Changes on version 2.0.0: + * - Reduce ammount of static variables. + * - Error domain, e.g. `kLzmaSDKObjCErrorDomain` was changed to `LzmaSDKObjC`. + * - Deprecated xz decoding, will be removed in next release. + * - 7z archive writer. + * + * Changes on version 1.1.5: + * - Added error possible failure reason description. + * Use `NSLocalizedFailureReasonErrorKey` to get possible failure string. + * + * Changes on version 1.1.4: + * - Update C++ source to version 16.02 (1602 - latest for now). + * + * Changes on version 1.1.3: + * - Update C++ source to version 16.00. + * + * Changes on version 1.1.2: + * - Added functionality for compress/decompress single NSData buffer object with LZMA2. + * + * Changes on version 1.0.7: + * - Fix Undefined value access. + * + * Changes on version 1.0.4: + * - Add nullability delegate flag to Objective-C reader. + * + * Changes on version 1.0.3: + * - Ignore debug log messages via LZMASDKOBJC_NO_DEBUG_LOG. + * + * Changes on version 1.0.2: + * - Move additional includes to private part of the code. + * + * Changes on version 1.0.1: + * - Lzma & lzma2 test reader. + * + * Changes on version 1.0.0: + * - Stable reader. + * + * Changes on version 0.1.2: + * - Update C++ source to version 15.14. + * + * Changes on version 0.1.1: + * - Update C++ source to version 15.12. + * + * Changes on version 0.1.0: + * - iOS min version 8.0. + * - Cocoapods framework. + * + * Changes on version 0.0.10: + * - Added iOS framework target. + * + * Changes on version 0.0.9: + * - Extract empty archive folders. + * + * Changes on version 0.0.8: + * - Update LZMA SDK to version 15.12. + * Note: If you use XZ code from LZMA SDK, it's recommended to upgrade to new XZ code from 7-Zip 15.12. + * That new code fixes some bugs. + * + * Changes on version 0.0.7: + * - Enabled test functionality. + * + * Changes on version 0.0.6: + * - Add missed folder creation functionality during extract. + * - Add initial error processing. + * + * Changes on version 0.0.5: + * - LzmaSDKObjCItem strong field references. + * + * Changes on version 0.0.4: + * - LzmaSDKObjCReader strong field references. + * + * Changes on version 0.0.3: + * - Less static consts & variables. + * - Exclude some unused code with preprocessor define. + * - Test archive items CRC. + * + * Changes on version 0.0.2: + * - Define memory size allocation for list and extract functionality. + * - Fix closing last extracted file before deallocating reader. + * - Code description. + * + * Version 0.0.1: + * - Implemented list and extract of the Lzma & Lzma2 7z files. + */ + + +#define LZMASDKOBJC_VERSION_MAJOR 2 +#define LZMASDKOBJC_VERSION_MINOR 0 +#define LZMASDKOBJC_VERSION_PATCH 13 + + +#import "LzmaSDKObjCTypes.h" +#import "LzmaSDKObjCReader.h" +#import "LzmaSDKObjCWriter.h" + + +/** + Convert `NSString` to wide character string with NULL terminated character at the end. + @warning Call `free` ater using the result. + */ +LZMASDKOBJC_EXTERN wchar_t * _Nullable NSStringToWideCharactersString(NSString * _Nullable string); + + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjC.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjC.mm new file mode 100644 index 0000000000..8d22d59e10 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjC.mm @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjC.h" + +wchar_t * _Nullable NSStringToWideCharactersString(NSString * _Nullable string) { + const size_t charsCount = string ? [string length] : 0; + if (charsCount < 1) return NULL; + const size_t bufferSize = sizeof(wchar_t) * (charsCount + 2); + wchar_t * buffer = (wchar_t *)malloc(bufferSize); + if (buffer) { + memset(buffer, 0, bufferSize); + NSData * dataString = [string dataUsingEncoding:NSUTF32LittleEndianStringEncoding]; + const size_t dataSize = dataString ? [dataString length] : 0; + const size_t copySize = MIN(dataSize, bufferSize); + if (copySize) { + memcpy(buffer, [dataString bytes], copySize); + buffer[charsCount] = 0; + return buffer; + } + free(buffer); + } + return NULL; +} diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBaseCoder.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBaseCoder.cpp new file mode 100644 index 0000000000..f7e665fc72 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBaseCoder.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCBaseCoder.h" + +#include "../lzma/CPP/Common/IntToString.h" +#include "../lzma/CPP/Common/StringConvert.h" + +#include "../lzma/CPP/7zip/Archive/DllExports2.h" // custom header with `STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject);` +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" + +namespace LzmaSDKObjC { + + void BaseCoder::createObject(const LzmaSDKObjCFileType type, const GUID * iid, void ** outObject) { + this->clearLastError(); + if (type) { + const GUID * clsid = NULL; + const GUID clsid7z = Common::CLSIDFormat7z(); + switch (type) { + case LzmaSDKObjCFileType7z: clsid = &clsid7z; break; + default: + this->setLastError(-1, __LINE__, __FILE__, "Can't find codec for unsupported file type: %i", (int)type); + this->setLastErrorReason("Not one of the: ['7z']"); + return; + break; + } + + if (CreateObject(clsid, iid, outObject) != S_OK) { + this->setLastError(-1, __LINE__, __FILE__, "Can't create archive object file type: %i", (int)type); + this->setLastErrorReason("- Unsupported archive GUID.\n" + "- Codec was not compiled in or stripped by static linking. Make sure you are using 'use_frameworks!' and/or dynamic linking."); + } + } else { + this->setLastError(-1, __LINE__, __FILE__, "Type of the archive is undefined, create reader with manual type"); + } + } + + void BaseCoder::onProgress(const float progress) { + if (context && setFloatCallback2) setFloatCallback2(context, progress); + } + + bool BaseCoder::requiredCallback1() const { + return false; + } + + UString BaseCoder::onGetVoidCallback1() { + wchar_t * w = (context && getVoidCallback1) ? (wchar_t *)getVoidCallback1(context) : NULL; + if (w) { + UString r(w); + free(w); + return r; + } + return UString(); + } + + BaseCoder::BaseCoder() : LzmaSDKObjC::LastErrorHolder(), + context(NULL), + getVoidCallback1(NULL), + setFloatCallback2(NULL) { + LzmaSDKObjC::Common::initialize(); + } + + BaseCoder::~BaseCoder() { + + } + +} diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBaseCoder.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBaseCoder.h new file mode 100644 index 0000000000..5f4c1f2a21 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBaseCoder.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCBASECODER_H__ +#define __LZMASDKOBJCBASECODER_H__ 1 + +#include "LzmaAppleCommon.h" +#include "LzmaSDKObjCTypes.h" +#include "LzmaSDKObjCCommon.h" +#include "LzmaSDKObjCError.h" + +#include "../lzma/CPP/Common/MyGuidDef.h" + +namespace LzmaSDKObjC { + + class BaseCoder : public LzmaSDKObjC::LastErrorHolder { + protected: + void createObject(const LzmaSDKObjCFileType type, const GUID * iid, void ** outObject); + + public: + void * context; + LzmaSDKObjCGetVoidCallback getVoidCallback1; + LzmaSDKObjCSetFloatCallback setFloatCallback2; + + // callbacks section + void onProgress(const float progress); // encode/decode + virtual bool requiredCallback1() const; // pwd, default is `false`. + UString onGetVoidCallback1(); // pwd + + // Required + // find codec, create encode/decode object and check error. + virtual bool prepare(const LzmaSDKObjCFileType type) = 0; + + virtual bool openFile(const char * path) = 0; + + BaseCoder(); + virtual ~BaseCoder(); + }; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBufferProcessor.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBufferProcessor.h new file mode 100644 index 0000000000..c5415c0e1e --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBufferProcessor.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCTypes.h" + +/** + @brief Compress non-empty buffer object with LZMA2. + @warning First byte of the return data is LZMA2 properties. + @warning Input buffer should be less or equal to 4Gb. + @param dataForCompress Non-empty buffer to compress. + @param compressionRatio Compression ratio in range [0.0f; 1.0f] + @return Compressed data or nil on error. + */ +LZMASDKOBJC_EXTERN NSData * _Nullable LzmaSDKObjCBufferCompressLZMA2(NSData * _Nonnull dataForCompress, const float compressionRatio); + + +/** + @brief Decompress non-empty buffer object compressed with LZMA2 and have first byte as properties. + @warning First byte of input data should be is LZMA2 properties. + @warning Input buffer should be less or equal to 4Gb. + @param dataForDecompress Non-empty compressed buffer. + @return Decompressed data or nil on error. + */ +LZMASDKOBJC_EXTERN NSData * _Nullable LzmaSDKObjCBufferDecompressLZMA2(NSData * _Nonnull dataForDecompress); diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBufferProcessor.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBufferProcessor.mm new file mode 100644 index 0000000000..6325812529 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCBufferProcessor.mm @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import + +#include "LzmaSDKObjCBufferProcessor.h" + +#include "../lzma/C/Lzma2Enc.h" +#include "../lzma/C/Lzma2Dec.h" + + +static void * LzmaSDKObjCBufferProcessorAlloc(size_t size) { return (size > 0) ? malloc(size) : NULL; } +static void LzmaSDKObjCBufferProcessorFree(void *address) { if (address) free(address); } +static void * LzmaSDKObjCBufferProcessorSzAlloc(void *p, size_t size) { return LzmaSDKObjCBufferProcessorAlloc(size); } +static void LzmaSDKObjCBufferProcessorSzFree(void *p, void *address) { LzmaSDKObjCBufferProcessorFree(address); } + +typedef struct _LzmaSDKObjCBufferProcessorReader : ISeqInStream { + const unsigned char * data; + unsigned int dataSize; + unsigned int offset; +} LzmaSDKObjCBufferProcessorReader; + +typedef struct _LzmaSDKObjCBufferProcessorWriter : ISeqOutStream { + __strong NSMutableData * data; +} LzmaSDKObjCBufferProcessorWriter; + + +static size_t LzmaSDKObjCBufferProcessorWrite(void *pp, const void *data, size_t size) { + LzmaSDKObjCBufferProcessorWriter * p = (LzmaSDKObjCBufferProcessorWriter *)pp; + [p->data appendBytes:data length:size]; + return size; +} + +static SRes LzmaSDKObjCBufferProcessorRead(void *pp, void *data, size_t *size) { + LzmaSDKObjCBufferProcessorReader * p = (LzmaSDKObjCBufferProcessorReader *)pp; + size_t sizeToRead = *size; + size_t avaiableSize = p->dataSize - p->offset; + if (avaiableSize < sizeToRead) sizeToRead = avaiableSize; + memcpy(data, &p->data[p->offset], sizeToRead); + p->offset += sizeToRead; + *size = sizeToRead; + return SZ_OK; +} + +NSData * _Nullable LzmaSDKObjCBufferCompressLZMA2(NSData * _Nonnull dataForCompress, const float compressionRatio) { + if (!dataForCompress) return nil; + const unsigned char * data = (const unsigned char *)[dataForCompress bytes]; + const unsigned int dataSize = (unsigned int)[dataForCompress length]; + if (!data || dataSize <= LZMA_PROPS_SIZE) return nil; + + ISzAlloc localAlloc = { LzmaSDKObjCBufferProcessorSzAlloc, LzmaSDKObjCBufferProcessorSzFree }; + + CLzma2EncHandle handle = Lzma2Enc_Create(&localAlloc, &localAlloc); + if (!handle) return nil; + + CLzma2EncProps props; + Lzma2EncProps_Init(&props); + props.lzmaProps.writeEndMark = 1; + props.lzmaProps.numThreads = 1; + props.numTotalThreads = 1; + + if (compressionRatio < 0.0f) props.lzmaProps.level = 0; + else if (compressionRatio > 1.0f) props.lzmaProps.level = 9; + else props.lzmaProps.level = compressionRatio * 9.0f; + + SRes res = Lzma2Enc_SetProps(handle, &props); + if (res != SZ_OK) return nil; + const Byte properties = Lzma2Enc_WriteProperties(handle); + + LzmaSDKObjCBufferProcessorWriter outStream; + memset(&outStream, 0, sizeof(LzmaSDKObjCBufferProcessorWriter)); + outStream.data = [NSMutableData dataWithCapacity:dataSize / 4]; + [outStream.data appendBytes:&properties length:sizeof(Byte)]; + outStream.Write = LzmaSDKObjCBufferProcessorWrite; + + LzmaSDKObjCBufferProcessorReader inStream; + memset(&inStream, 0, sizeof(LzmaSDKObjCBufferProcessorReader)); + inStream.data = data; + inStream.dataSize = dataSize; + inStream.Read = LzmaSDKObjCBufferProcessorRead; + + res = Lzma2Enc_Encode(handle, + (ISeqOutStream *)&outStream, + (ISeqInStream *)&inStream, + NULL); + + Lzma2Enc_Destroy(handle); + return [outStream.data length] > sizeof(Byte) ? outStream.data : nil; +} + +NSData * _Nullable LzmaSDKObjCBufferDecompressLZMA2(NSData * _Nonnull dataForDecompress) { + if (!dataForDecompress) return nil; + const unsigned char * data = (const unsigned char *)[dataForDecompress bytes]; + const unsigned int dataSize = (unsigned int)[dataForDecompress length]; + if (!data || dataSize <= sizeof(Byte)) return nil; + + CLzma2Dec dec; + Lzma2Dec_Construct(&dec); + + const Byte * inData = data; + SizeT inSize = dataSize; + const Byte properties = *(inData); + inData++; + inSize--; + + ISzAlloc localAlloc = { LzmaSDKObjCBufferProcessorSzAlloc, LzmaSDKObjCBufferProcessorSzFree }; + + SRes res = Lzma2Dec_AllocateProbs(&dec, properties, &localAlloc); + if (res != SZ_OK) return nil; + + res = Lzma2Dec_Allocate(&dec, properties, &localAlloc); + if (res != SZ_OK) return nil; + + Lzma2Dec_Init(&dec); + + NSMutableData * outData = [NSMutableData dataWithCapacity:dataSize]; + Byte dstBuff[10240]; + while ((inSize > 0) && (res == SZ_OK)) { + ELzmaStatus status = LZMA_STATUS_NOT_SPECIFIED; + SizeT dstSize = 10240; + SizeT srcSize = inSize; + + res = Lzma2Dec_DecodeToBuf(&dec, + dstBuff, + &dstSize, + inData, + &srcSize, + LZMA_FINISH_ANY, + &status); + if ((inSize >= srcSize) && (res == SZ_OK)) { + inData += srcSize; + inSize -= srcSize; + [outData appendBytes:dstBuff length:dstSize]; + } else { + break; + } + } + + Lzma2Dec_FreeProbs(&dec, &localAlloc); + Lzma2Dec_Free(&dec, &localAlloc); + + return [outData length] > 0 ? outData : nil; +} diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCCommon.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCCommon.cpp new file mode 100644 index 0000000000..3c1342c2c7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCCommon.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCCommon.h" +#include "../lzma/CPP/Common/MyGuidDef.h" + +#include "../lzma/C/7zVersion.h" +#include "../lzma/C/7zCrc.h" +#include "../lzma/C/Aes.h" +#include "../lzma/C/XzCrc64.h" + +namespace LzmaSDKObjC { + + bool Common::_isInitialized = false; + + void Common::initialize() { + if (_isInitialized) return; + _isInitialized = true; + + CrcGenerateTable(); + AesGenTables(); + Crc64GenerateTable(); + } + + GUID Common::CLSIDFormat7z() { + return CONSTRUCT_GUID(0x23170F69, 0x40C1, 0x278A, 0x10, 0x00, 0x00, 0x01, 0x10, 0x07, 0x00, 0x00); + } + + uint64_t Common::PROPVARIANTGetUInt64(PROPVARIANT * prop) { + switch (prop->vt) { + case VT_UI8: return prop->uhVal.QuadPart; + + case VT_HRESULT: + case VT_UI4: + return prop->ulVal; + + case VT_UINT: return prop->uintVal; + case VT_I8: return prop->hVal.QuadPart; + case VT_UI1: return prop->bVal; + case VT_I4: return prop->lVal; + case VT_INT: return prop->intVal; + + default: break; + } + return 0; + } + + bool Common::PROPVARIANTGetBool(PROPVARIANT * prop) { + switch (prop->vt) { + case VT_BOOL: return (prop->boolVal == 0) ? false : true; + default: break; + } + return (PROPVARIANTGetUInt64(prop) == 0) ? false : true; + } + + time_t Common::FILETIMEToUnixTime(const FILETIME filetime) { + uint64_t t = filetime.dwHighDateTime; + t <<= 32; + t += filetime.dwLowDateTime; + t -= 116444736000000000LL; + return (time_t)(t / 10000000); + } + + FILETIME Common::UnixTimeToFILETIME(const time_t t) { + uint64_t ll = t; + ll *= 10000000; + ll += 116444736000000000LL; + + FILETIME FT; + FT.dwLowDateTime = (DWORD)ll; + FT.dwHighDateTime = (DWORD)(ll >> 32); + return FT; + } +} diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCCommon.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCCommon.h new file mode 100644 index 0000000000..2f4460d1f1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCCommon.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCCOMMON_H__ +#define __LZMASDKOBJCCOMMON_H__ 1 + +#include +#include + +#include "../lzma/CPP/Common/MyGuidDef.h" +#include "../lzma/CPP/Common/MyWindows.h" +#include "LzmaSDKObjCTypes.h" + +namespace LzmaSDKObjC { + + class Common { + private: + static bool _isInitialized; + + public: + static void initialize(); + + static GUID CLSIDFormat7z(); + + static uint64_t PROPVARIANTGetUInt64(PROPVARIANT * prop); + + static bool PROPVARIANTGetBool(PROPVARIANT * prop); + + static time_t FILETIMEToUnixTime(const FILETIME filetime); + + static FILETIME UnixTimeToFILETIME(const time_t t); + }; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCError.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCError.h new file mode 100644 index 0000000000..2c00c05b8e --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCError.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCERROR_H__ +#define __LZMASDKOBJCERROR_H__ 1 + +#include "LzmaAppleCommon.h" +#include "../lzma/CPP/Common/StringConvert.h" + +namespace LzmaSDKObjC { + + class Error { + public: + AString description; + AString possibleReason; + AString file; + int64_t code; + int line; + + Error(); + virtual ~Error() { } + }; + + + class LastErrorHolder { + private: + LzmaSDKObjC::Error * _lastError; + public: + void setLastError(LzmaSDKObjC::LastErrorHolder * holder); + void setLastError(int64_t code, int line, const char * file, const char * format, ...); + void setLastErrorReason(const char * format, ...); + LzmaSDKObjC::Error * lastError() const { return _lastError; } + void clearLastError(); + LastErrorHolder(); + virtual ~LastErrorHolder(); + }; +} + + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCError.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCError.mm new file mode 100644 index 0000000000..63bf6bda85 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCError.mm @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCError.h" +#include "LzmaSDKObjCTypes.h" + +namespace LzmaSDKObjC { + + Error::Error() : + code(-1), + line(-1) { + + } + + void LastErrorHolder::clearLastError() { + if (_lastError) { + delete _lastError; + _lastError = NULL; + } + } + + void LastErrorHolder::setLastError(LzmaSDKObjC::LastErrorHolder * holder) { + this->clearLastError(); + if (!holder) return; + if (holder->_lastError) { + _lastError = new LzmaSDKObjC::Error(); + if (_lastError) { + _lastError->file = holder->_lastError->file; + _lastError->line = holder->_lastError->line; + _lastError->code = holder->_lastError->code; + _lastError->description = holder->_lastError->description; + _lastError->possibleReason = holder->_lastError->possibleReason; + } + } + } + + void LastErrorHolder::setLastError(int64_t code, int line, const char * file, const char * format, ...) { + if (_lastError) delete _lastError; + _lastError = new LzmaSDKObjC::Error(); + if (_lastError) { + _lastError->code = code; + _lastError->line = line; + if (file) _lastError->file = file; + if (format) { + va_list args; + va_start(args, format); + char buff[1024]; + vsprintf(buff, format, args); + va_end(args); + _lastError->description = buff; + + LZMASDK_DEBUG_LOG("ERROR: code = %lli, file = \'%s\', line = %i, description = %s", code, file, line, buff) + } + } + } + + void LastErrorHolder::setLastErrorReason(const char * format, ...) { + if (_lastError && format) { + va_list args; + va_start(args, format); + char buff[1024]; + vsprintf(buff, format, args); + va_end(args); + _lastError->possibleReason = buff; + LZMASDK_DEBUG_LOG("ERROR REASON: %s", buff) + } + } + + LastErrorHolder::LastErrorHolder() : + _lastError(NULL) { + + } + + LastErrorHolder::~LastErrorHolder() { + if (_lastError) delete _lastError; + } +} + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtern.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtern.h new file mode 100644 index 0000000000..e9ac59cf7d --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtern.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCEXTERN_H__ +#define __LZMASDKOBJCEXTERN_H__ 1 + + +#include "LzmaSDKObjCTypes.h" + + +/** + @brief Size in bytes of the read block size per single request. + @detailed +
  • @b CFilterCoder allocate buff for reading, was (1 << 20) +
  • @b ISequentialOutStream max read block size, or available size, was (1 << 31) + @warning This ammount of size will be allocated. + */ +LZMASDKOBJC_EXTERN unsigned int kLzmaSDKObjCStreamReadSize; + + +/** + @brief Size in bytes for write per single request. + @detailed +
  • @b ISequentialOutStream max write block size, or available size, was (1 << 31) + @warning This ammount of size will be allocated. + */ +LZMASDKOBJC_EXTERN unsigned int kLzmaSDKObjCStreamWriteSize; + + +/** + @brief Size in bytes for internal decoder buffer for holding coded data. + @detailed +
  • Lzma CDecoder in buffer, buff with coded data, was (1 << 20) +
  • Lzma2 CDecoder in buffer, buff with coded data, was (1 << 20) + @warning This ammount of size will be allocated. + */ +LZMASDKOBJC_EXTERN unsigned int kLzmaSDKObjCDecoderReadSize; + + +/** + @brief Size in bytes for internal decoder buffer for holding decoded data. + @detailed +
  • Lzma CDecoder out buffer, buff for decoded data, was (1 << 22) +
  • Lzma2 CDecoder out buffer, buff for decoded data, was (1 << 22) + @warning This ammount of size will be allocated. + */ +LZMASDKOBJC_EXTERN unsigned int kLzmaSDKObjCDecoderWriteSize; + + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtern.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtern.mm new file mode 100644 index 0000000000..3b3f4354cd --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtern.mm @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCExtern.h" + + +/** + @brief 12 = 4 Kb min + @brief 13 = 8 Kb + @brief 14 = 16 Kb + @brief 15 = 32 Kb + @brief 16 = 64 Kb + @brief 17 = 128 Kb + @brief 18 = 256 Kb + @brief 19 = 512 Kb + @brief 20 = 1 Mb + @brief 21 = 2 Mb + @brief 22 = 4 Mb + @brief 31 = 1 Gb + */ + +unsigned int kLzmaSDKObjCStreamReadSize = ((unsigned int)1 << 16); + + +unsigned int kLzmaSDKObjCStreamWriteSize = ((unsigned int)1 << 16); + + +unsigned int kLzmaSDKObjCDecoderReadSize = ((unsigned int)1 << 16); + + +unsigned int kLzmaSDKObjCDecoderWriteSize = ((unsigned int)1 << 18); + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtractCallback.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtractCallback.h new file mode 100644 index 0000000000..500d50e253 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtractCallback.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCEXTRACTCALLBACK_H__ +#define __LZMASDKOBJCEXTRACTCALLBACK_H__ 1 + +#include "LzmaSDKObjCBaseCoder.h" + +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" +#include "../lzma/CPP/7zip/ICoder.h" +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" +#include "../lzma/CPP/7zip/Common/FileStreams.h" + +#include "LzmaSDKObjCOutFile.h" + +namespace LzmaSDKObjC { + + class ExtractCallback : + public IArchiveExtractCallback, + public IArchiveExtractCallbackMessage, + public ICryptoGetTextPassword, + public ICryptoGetTextPassword2, + public ICompressProgressInfo, + public CMyUnknownImp, + public LzmaSDKObjC::LastErrorHolder { + private: + LzmaSDKObjC::OutFile * _outFileStreamRef; + LzmaSDKObjC::BaseCoder * _coder; + IInArchive * _archive; + CMyComPtr _outFileStream; + + AString _dstPath; + uint64_t _total; + int32_t _mode; + bool _isFullPath; + + + HRESULT getTestStream(uint32_t index, ISequentialOutStream **outStream); + HRESULT getExtractStream(uint32_t index, ISequentialOutStream **outStream); + + public: + MY_UNKNOWN_IMP4(IArchiveExtractCallbackMessage, ICryptoGetTextPassword, ICryptoGetTextPassword2, ICompressProgressInfo) + + INTERFACE_IArchiveExtractCallback(;) + INTERFACE_IArchiveExtractCallbackMessage(;) + + STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); + + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *password); + + // ICryptoGetTextPassword2 + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); + + void setCoder(LzmaSDKObjC::BaseCoder * coder) { _coder = coder; } + void setArchive(IInArchive * a) { _archive = a; } + void setMode(int32_t mode) { _mode = mode; } + + bool prepare(const char * extractPath, bool isFullPath); + + ExtractCallback(); + virtual ~ExtractCallback(); + }; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtractCallback.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtractCallback.mm new file mode 100644 index 0000000000..4a13ce2ebc --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCExtractCallback.mm @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include + +#include "LzmaSDKObjCExtractCallback.h" +#include "LzmaSDKObjCCommon.h" + +#include "../lzma/CPP/Common/Defs.h" +#include "../lzma/CPP/Windows/PropVariant.h" +#include "../lzma/CPP/7zip/Archive/Common/DummyOutStream.h" + +namespace LzmaSDKObjC { + + STDMETHODIMP ExtractCallback::ReportExtractResult(UInt32 indexType, UInt32 index, Int32 opRes) { + return S_OK; + } + + STDMETHODIMP ExtractCallback::SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) { + return S_OK; + } + + STDMETHODIMP ExtractCallback::SetTotal(UInt64 size) { + _total = size; + if (_coder) _coder->onProgress(0); + return S_OK; + } + + STDMETHODIMP ExtractCallback::SetCompleted(const UInt64 * completeValue) { + if (completeValue && _coder) { + const long double complete = *completeValue; + const float progress = (_total > 0) ? (float)(complete / _total) : 0; + _coder->onProgress(progress); + } + return S_OK; + } + + HRESULT ExtractCallback::getTestStream(uint32_t index, ISequentialOutStream **outStream) { + CDummyOutStream * dummy = new CDummyOutStream(); + if (!dummy) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create out test stream"); + return E_ABORT; + } + + CMyComPtr outStreamLoc = dummy; + + _outFileStream = outStreamLoc; + *outStream = outStreamLoc.Detach(); + + return S_OK; + } + + HRESULT ExtractCallback::getExtractStream(uint32_t index, ISequentialOutStream **outStream) { + NWindows::NCOM::CPropVariant pathProp; + if (_archive->GetProperty(index, kpidPath, &pathProp) != S_OK) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't read path property by index: %i", (int)index); + return E_ABORT; + } + + NSString * archivePath = [[NSString alloc] initWithBytes:pathProp.bstrVal + length:wcslen(pathProp.bstrVal) * sizeof(wchar_t) + encoding:NSUTF32LittleEndianStringEncoding]; + if (!archivePath || [archivePath length] == 0) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't initialize path object"); + return E_ABORT; + } + + NSString * fullPath = [NSString stringWithUTF8String:_dstPath]; + NSString * fileName = [archivePath lastPathComponent]; + if (!fileName || [fileName length] == 0) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't initialize path file name"); + return E_ABORT; + } + + if (_isFullPath) { + NSString * subPath = [archivePath stringByDeletingLastPathComponent]; + if (subPath && [subPath length] > 0) { + NSFileManager * manager = [[NSFileManager alloc] init]; + if (![manager changeCurrentDirectoryPath:fullPath]) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't change current directory to: [%s]", [fullPath UTF8String]); + return E_ABORT; + } + + BOOL isDir = NO; + NSError * error = nil; + if ([manager fileExistsAtPath:subPath isDirectory:&isDir]) { + if (!isDir) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Destination path: [%s] exists in directory: [%s] and it's file", [subPath UTF8String], [fullPath UTF8String]); + return E_ABORT; + } + } else if (![manager createDirectoryAtPath:subPath withIntermediateDirectories:YES attributes:nil error:&error] || error) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create subdirectory: [%s] in directory: [%s]", [subPath UTF8String], [fullPath UTF8String]); + return E_ABORT; + } + + fullPath = [fullPath stringByAppendingPathComponent:subPath]; + } + } + + fullPath = [fullPath stringByAppendingPathComponent:fileName]; + + PROPVARIANT isDirProp = {0}; + HRESULT res = _archive->GetProperty(index, kpidIsDir, &isDirProp); + if (res != S_OK) { + this->setLastError(res, __LINE__, __FILE__, "Can't get property of the item by index: %u", (unsigned int)index); + return res; + } + + if (Common::PROPVARIANTGetBool(&isDirProp)) { + NSError * error = nil; + if (![[NSFileManager defaultManager] createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:&error] || error) { + this->setLastError(S_FALSE, __LINE__, __FILE__, "Can't create directory: [%s]", [fullPath UTF8String]); + return E_ABORT; + } + } else { + LzmaSDKObjC::OutFile * outFile = new LzmaSDKObjC::OutFile(); + if (!outFile) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create out file stream"); + return E_ABORT; + } + + if (!outFile->open([fullPath UTF8String])) { + delete outFile; + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't open destination for write: [%s]", [fullPath UTF8String]); + return E_ABORT; + } + + _outFileStreamRef = outFile; + CMyComPtr outStreamLoc = _outFileStreamRef; + + _outFileStream = outStreamLoc; + *outStream = outStreamLoc.Detach(); + } + + return S_OK; + } + + STDMETHODIMP ExtractCallback::GetStream(UInt32 index, + ISequentialOutStream **outStream, + Int32 askExtractMode) { + *outStream = NULL; + _outFileStream.Release(); + _outFileStreamRef = NULL; + + if (!_archive) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "No input archive"); + return E_ABORT; + } + + switch (_mode) { + case NArchive::NExtract::NAskMode::kExtract: + return this->getExtractStream(index, outStream); + break; + + case NArchive::NExtract::NAskMode::kTest: + return this->getTestStream(index, outStream); + break; + + case NArchive::NExtract::NAskMode::kSkip: + return S_OK; + break; + } + + return E_FAIL; + } + + STDMETHODIMP ExtractCallback::PrepareOperation(Int32 askExtractMode) { + return S_OK; + } + + STDMETHODIMP ExtractCallback::SetOperationResult(Int32 operationResult) { + HRESULT res = E_FAIL; + switch (operationResult) { + case NArchive::NExtract::NOperationResult::kOK: + res = S_OK; + break; + + case NArchive::NExtract::NOperationResult::kUnsupportedMethod: + this->setLastError(operationResult, __LINE__, __FILE__, "kUnsupportedMethod"); + break; + + case NArchive::NExtract::NOperationResult::kCRCError: + this->setLastError(operationResult, __LINE__, __FILE__, "kCRCError"); + break; + + case NArchive::NExtract::NOperationResult::kDataError: + this->setLastError(operationResult, __LINE__, __FILE__, "kDataError"); + break; + + case NArchive::NExtract::NOperationResult::kUnavailable: + this->setLastError(operationResult, __LINE__, __FILE__, "kUnavailable"); + break; + + case NArchive::NExtract::NOperationResult::kUnexpectedEnd: + this->setLastError(operationResult, __LINE__, __FILE__, "kUnexpectedEnd"); + break; + + case NArchive::NExtract::NOperationResult::kDataAfterEnd: + this->setLastError(operationResult, __LINE__, __FILE__, "kDataAfterEnd"); + break; + + case NArchive::NExtract::NOperationResult::kIsNotArc: + this->setLastError(operationResult, __LINE__, __FILE__, "kIsNotArc"); + break; + + case NArchive::NExtract::NOperationResult::kHeadersError: + this->setLastError(operationResult, __LINE__, __FILE__, "kHeadersError"); + break; + + default: + break; + } + + if (_outFileStream != NULL) { + if (_outFileStreamRef) _outFileStreamRef->close(); + } + _outFileStream.Release(); + _outFileStreamRef = NULL; + return res; + } + + STDMETHODIMP ExtractCallback::CryptoGetTextPassword(BSTR *password) { + if (_coder) { + UString w(_coder->onGetVoidCallback1()); + if (w.Len() > 0) return StringToBstr(w, password); + } + return S_OK; + } + + STDMETHODIMP ExtractCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) { + if (passwordIsDefined) *passwordIsDefined = BoolToInt(false); + if (_coder) { + UString w(_coder->onGetVoidCallback1()); + if (w.Len() > 0) { + if (passwordIsDefined) *passwordIsDefined = BoolToInt(true); + return StringToBstr(w, password); + } + } + return S_OK; + } + + bool ExtractCallback::prepare(const char * extractPath, bool isFullPath) { + _dstPath = extractPath; + _isFullPath = isFullPath; + + NSString * path = [NSString stringWithUTF8String:extractPath]; + + NSFileManager * manager = [[NSFileManager alloc] init]; + BOOL isDir = NO; + if ([manager fileExistsAtPath:path isDirectory:&isDir]) { + if (!isDir) { + this->setLastError(-1, __LINE__, __FILE__, "Extract path: [%s] exists and it's file", extractPath); + return false; + } + } else { + NSError * error = nil; + if (![manager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error] || error) { + this->setLastError(-1, __LINE__, __FILE__, "Can't create directory path: [%s]", [path UTF8String]); + return false; + } + } + + return true; + } + + ExtractCallback::ExtractCallback() : LzmaSDKObjC::LastErrorHolder(), + _outFileStreamRef(NULL), + _coder(NULL), + _archive(NULL), + _total(0), + _mode(NArchive::NExtract::NAskMode::kSkip), + _isFullPath(false) { + + } + + ExtractCallback::~ExtractCallback() { + + } + +} + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileDecoder.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileDecoder.cpp new file mode 100644 index 0000000000..28d6016737 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileDecoder.cpp @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCFileDecoder.h" + +#include "../lzma/CPP/Common/MyWindows.h" +#include "../lzma/CPP/Common/Defs.h" +#include "../lzma/CPP/Common/MyGuidDef.h" +#include "../lzma/CPP/Common/IntToString.h" +#include "../lzma/CPP/Common/StringConvert.h" + +#include "../lzma/CPP/Windows/PropVariant.h" +#include "../lzma/CPP/Windows/PropVariantConv.h" + +#include "../lzma/CPP/7zip/Common/FileStreams.h" +#include "../lzma/CPP/7zip/Archive/DllExports2.h" // custom header with `STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject);` +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" + +#include "LzmaSDKObjCCommon.h" +#include "LzmaSDKObjCInFile.h" +#include "LzmaSDKObjCOpenCallback.h" +#include "LzmaSDKObjCOutFile.h" + + +namespace LzmaSDKObjC { + + bool FileDecoder::process(const uint32_t * itemsIndices, + const uint32_t itemsCount, + const char * path /* = NULL */, + bool isWithFullPaths /* = false */) { + this->cleanExtractCallbackRef(); + this->clearLastError(); + + _extractCallbackRef = new LzmaSDKObjC::ExtractCallback(); + _extractCallback = CMyComPtr(_extractCallbackRef); + if (!_extractCallbackRef) { + this->setLastError(-1, __LINE__, __FILE__, "Can't create extract object"); + return false; + } + + int32_t mode = NArchive::NExtract::NAskMode::kSkip; + if (path) { + if (_extractCallbackRef->prepare(path, isWithFullPaths)) { + mode = NArchive::NExtract::NAskMode::kExtract; + } else { + this->setLastError(_extractCallbackRef); + return false; + } + } else { + mode = NArchive::NExtract::NAskMode::kTest; + } + + _extractCallbackRef->setCoder(this); + _extractCallbackRef->setArchive(_archive); + _extractCallbackRef->setMode(mode); + + const HRESULT result = _archive->Extract(itemsIndices, itemsCount, mode, _extractCallback); + _extractCallbackRef->setArchive(NULL); + + if (result != S_OK) { + this->setLastError(result, __LINE__, __FILE__, "Archive extract error with result: %lli", (long long)result); + return false; + } + + return true; + } + + bool FileDecoder::readIteratorProperty(PROPVARIANT * property, const uint32_t identifier) { + return (_iterateIndex < _itemsCount) ? (_archive->GetProperty(_iterateIndex, identifier, property) == S_OK) : false; + } + + bool FileDecoder::prepare(const LzmaSDKObjCFileType type) { + this->clearLastError(); + this->createObject(type, &IID_IInArchive, (void **)&_archive); + return (_archive != NULL && this->lastError() == NULL); + } + + bool FileDecoder::openFile(const char * path) { + this->cleanOpenCallbackRef(); + this->cleanExtractCallbackRef(); + this->clearLastError(); + + LzmaSDKObjC::InFile * inFile = new LzmaSDKObjC::InFile(); + if (!inFile) { + this->setLastError(-1, __LINE__, __FILE__, "Can't open file for reading: [%s]", path); + return false; + } + + _inFile = inFile; + + _openCallbackRef = new LzmaSDKObjC::OpenCallback(); + _openCallback = CMyComPtr(_openCallbackRef); + if (!_openCallbackRef) { + this->setLastError(-1, __LINE__, __FILE__, "Can't create open callback"); + return false; + } + + _openCallbackRef->setCoder(this); + + if (!inFile->open(path)) { + this->setLastError(-1, __LINE__, __FILE__, "Can't open file for reading: [%s]", path); + this->setLastErrorReason("- File not exists.\n" + "- File have no read permissions for the current user."); + return false; + } + + HRESULT res = _archive->Open(_inFile, 0, _openCallback); + if (res == S_OK) { + UInt32 numItems = 0; + res = _archive->GetNumberOfItems(&numItems); + if (res != S_OK) { + this->setLastError(res, __LINE__, __FILE__, "Can't receive number of archive items with result: %lli", (long long)res); + return false; + } + _itemsCount = numItems; + return true; + } + + this->setLastError(res, __LINE__, __FILE__, "Can't open archive file with result: %lli", (long long)res); + return false; + } + + uint32_t FileDecoder::itemsCount() const { return _itemsCount; } + void FileDecoder::iterateStart() { _iterateIndex = 0; } + bool FileDecoder::iterateNext() { return (++_iterateIndex < _itemsCount); } + uint32_t FileDecoder::iteratorIndex() const { return _iterateIndex; }; + + FileDecoder::FileDecoder() : LzmaSDKObjC::BaseCoder(), + _openCallbackRef(NULL), + _extractCallbackRef(NULL), + _itemsCount(0), + _iterateIndex(0) { + + } + + void FileDecoder::cleanOpenCallbackRef() { + CMyComPtr op = _openCallback; + if (op != NULL && _openCallbackRef) { + _openCallbackRef->setCoder(NULL); + } + + _openCallbackRef = NULL; + _openCallback.Release(); + } + + void FileDecoder::cleanExtractCallbackRef() { + CMyComPtr ep = _extractCallback; + if (ep != NULL && _extractCallbackRef) { + _extractCallbackRef->setCoder(NULL); + } + + _extractCallbackRef = NULL; + _extractCallback.Release(); + } + + FileDecoder::~FileDecoder() { + this->cleanOpenCallbackRef(); + this->cleanExtractCallbackRef(); + } + +} + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileDecoder.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileDecoder.h new file mode 100644 index 0000000000..c6d8ef4c27 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileDecoder.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCFILEDECODER_H__ +#define __LZMASDKOBJCFILEDECODER_H__ 1 + +#include "LzmaSDKObjCBaseCoder.h" + +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" +#include "../lzma/CPP/Windows/PropVariant.h" + +#include "LzmaSDKObjCOpenCallback.h" +#include "LzmaSDKObjCExtractCallback.h" + +namespace LzmaSDKObjC { + + class FileDecoder : public LzmaSDKObjC::BaseCoder { + private: + LzmaSDKObjC::OpenCallback * _openCallbackRef; + LzmaSDKObjC::ExtractCallback * _extractCallbackRef; + + CMyComPtr _archive; + CMyComPtr _inFile; + CMyComPtr _openCallback; + CMyComPtr _extractCallback; + + uint32_t _itemsCount; + uint32_t _iterateIndex; + + void cleanOpenCallbackRef(); + void cleanExtractCallbackRef(); + + public: + uint32_t itemsCount() const; + void iterateStart(); + bool iterateNext(); + uint32_t iteratorIndex() const; + + bool readIteratorProperty(PROPVARIANT * property, const uint32_t identifier); + + bool process(const uint32_t * itemsIndices, + const uint32_t itemsCount, + const char * path = NULL, + bool isWithFullPaths = false); + + // Required section, `LzmaSDKObjC::BaseCoder` + // find codec, create encode/decode object and check error. + virtual bool prepare(const LzmaSDKObjCFileType type); + + virtual bool openFile(const char * path); + + FileDecoder(); + virtual ~FileDecoder(); + }; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileEncoder.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileEncoder.cpp new file mode 100644 index 0000000000..dd252b0aef --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileEncoder.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCFileEncoder.h" +#include "LzmaSDKObjCUpdateCallback.h" + +#include "../lzma/CPP/7zip/Archive/DllExports2.h" // custom header with `STDAPI CreateObject(const GUID *clsid, const GUID *iid, void **outObject);` +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" + +namespace LzmaSDKObjC { + + void FileEncoder::cleanUpdateCallbackRef() { + CMyComPtr updateCallback = _updateCallback; + if (updateCallback != NULL && _updateCallbackRef) { + _updateCallbackRef->coder = NULL; + } + + _updateCallbackRef = NULL; + _updateCallback.Release(); + } + + void FileEncoder::cleanOutFileStreamRef() { + CMyComPtr outFileStream = _outFileStream; + if (outFileStream != NULL && _outFileStreamRef) { + _outFileStreamRef->Close(); + } + + _outFileStreamRef = NULL; + _outFileStream.Release(); + } + + bool FileEncoder::requiredCallback1() const { + return settingsValue(LZMAOBJC_ENC_ENC_CONTENT) || settingsValue(LZMAOBJC_ENC_ENC_HEADER); + } + + bool FileEncoder::prepare(const LzmaSDKObjCFileType type) { + this->clearLastError(); + if (type != LzmaSDKObjCFileType7z) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Unsupported encoding type: %i", (int)type); + return false; + } + createObject(type, &IID_IOutArchive, (void **)&_archive); + return (_archive != NULL && this->lastError() == NULL); + } + +#define LZMAOBJC_SETTINGS_COUNT 9 + + void FileEncoder::upplySettings() { + const wchar_t * names[LZMAOBJC_SETTINGS_COUNT] = { + L"0", // method + L"s", // solid + L"x", // compression level + L"hc", // compress header + L"he", // encode header + L"tc", // write creation time + L"ta", // write access time + L"tm", // write modification time + + L"hcf" // compress header full, true - add, false - don't add/ignore + }; + NWindows::NCOM::CPropVariant values[LZMAOBJC_SETTINGS_COUNT] = { + (UInt32)0, // method dummy value + settingsValue(LZMAOBJC_ENC_SOLID), // solid mode ON + (UInt32)compressionLevel, // compression level = 9 - ultra + settingsValue(LZMAOBJC_ENC_COMPR_HDR), // compress header + settingsValue(LZMAOBJC_ENC_ENC_HEADER), // encode header + settingsValue(LZMAOBJC_ENC_WRITE_CTIME), // write creation time + settingsValue(LZMAOBJC_ENC_WRITE_ATIME), // write access time + settingsValue(LZMAOBJC_ENC_WRITE_MTIME), // write modification time + + true // compress header full, true - add, false - don't add/ignore + }; + + switch ((LzmaSDKObjCMethod)method) { + case LzmaSDKObjCMethodLZMA: values[0] = L"LZMA"; break; + case LzmaSDKObjCMethodLZMA2: values[0] = L"LZMA2"; break; + default: break; + } + + CMyComPtr setProperties; + _archive->QueryInterface(IID_ISetProperties, (void **)&setProperties); + if (setProperties) { + const bool compressHeaderFull = settingsValue(LZMAOBJC_ENC_COMPR_HDR_FULL); + setProperties->SetProperties(names, values, compressHeaderFull ? LZMAOBJC_SETTINGS_COUNT : LZMAOBJC_SETTINGS_COUNT - 1); + } + } + + bool FileEncoder::openFile(const char * path) { + this->cleanOutFileStreamRef(); + this->cleanUpdateCallbackRef(); + this->clearLastError(); + + _outFileStreamRef = new COutFileStream(); + if (!_outFileStreamRef) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create archive out stream object for path: %s", path); + return false; + } + + _outFileStream = CMyComPtr(_outFileStreamRef); + if (!_outFileStreamRef->Create(path, false)) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create archive out file for path: %s", path); + return false; + } + + _updateCallbackRef = new LzmaSDKObjC::UpdateCallback(); + if (!_updateCallbackRef) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create archive update callback object for path: %s", path); + return false; + } + + _updateCallback = CMyComPtr(_updateCallbackRef); + this->upplySettings(); + + return true; + } + + bool FileEncoder::encodeItems(void * items, const uint32_t numItems) { + this->clearLastError(); + if (_updateCallbackRef) { + _updateCallbackRef->clearLastError(); + _updateCallbackRef->items = items; + _updateCallbackRef->coder = this; + const HRESULT result = _archive->UpdateItems(_outFileStream, numItems, _updateCallback); + if (result == S_OK) return true; + this->setLastError(_updateCallbackRef); + } + return S_FALSE; + } + + FileEncoder::FileEncoder() : LzmaSDKObjC::BaseCoder(), + _updateCallbackRef(NULL), + _outFileStreamRef(NULL), + _settings(0), + compressionLevel(7), + method((unsigned char)LzmaSDKObjCMethodLZMA2) { + setSettingsValue(true, LZMAOBJC_ENC_SOLID); + setSettingsValue(true, LZMAOBJC_ENC_COMPR_HDR); + setSettingsValue(true, LZMAOBJC_ENC_COMPR_HDR_FULL); + setSettingsValue(true, LZMAOBJC_ENC_WRITE_CTIME); + setSettingsValue(true, LZMAOBJC_ENC_WRITE_ATIME); + setSettingsValue(true, LZMAOBJC_ENC_WRITE_MTIME); + } + + FileEncoder::~FileEncoder() { + this->cleanOutFileStreamRef(); + this->cleanUpdateCallbackRef(); + } + + // Settings + void FileEncoder::setSettingsValue(const bool value, const unsigned char flag) { + if (value) { + _settings |= flag; + } else { + _settings &= ~flag; + } + } + + bool FileEncoder::settingsValue(const unsigned char flag) const { + return (_settings & flag) ? true : false; + } +} diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileEncoder.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileEncoder.h new file mode 100644 index 0000000000..eb443c9cad --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCFileEncoder.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCFILEENCODER_H__ +#define __LZMASDKOBJCFILEENCODER_H__ 1 + +#include "LzmaSDKObjCBaseCoder.h" + +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" +#include "../lzma/CPP/7zip/Common/FileStreams.h" +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" +#include "../lzma/CPP/Windows/PropVariant.h" + +#define LZMAOBJC_ENC_SOLID 1 +#define LZMAOBJC_ENC_COMPR_HDR (1 << 1) +#define LZMAOBJC_ENC_COMPR_HDR_FULL (1 << 2) +#define LZMAOBJC_ENC_ENC_CONTENT (1 << 3) +#define LZMAOBJC_ENC_ENC_HEADER (1 << 4) +#define LZMAOBJC_ENC_WRITE_CTIME (1 << 5) +#define LZMAOBJC_ENC_WRITE_MTIME (1 << 6) +#define LZMAOBJC_ENC_WRITE_ATIME (1 << 7) + +namespace LzmaSDKObjC { + + class UpdateCallback; + + class FileEncoder : public LzmaSDKObjC::BaseCoder { + private: + LzmaSDKObjC::UpdateCallback * _updateCallbackRef; + COutFileStream * _outFileStreamRef; + + CMyComPtr _archive; + CMyComPtr _updateCallback; + CMyComPtr _outFileStream; + + unsigned char _settings; + + void cleanUpdateCallbackRef(); + void cleanOutFileStreamRef(); + void upplySettings(); + public: + bool encodeItems(void * items, const uint32_t numItems); + + virtual bool requiredCallback1() const; // pwd. + + // Required section, `LzmaSDKObjC::BaseCoder` + // find codec, create encode/decode object and check error. + virtual bool prepare(const LzmaSDKObjCFileType type); + + virtual bool openFile(const char * path); + + // Properties + void setSettingsValue(const bool value, const unsigned char flag); + bool settingsValue(const unsigned char flag) const; + unsigned char compressionLevel; //[1 .. 9] + unsigned char method; + + FileEncoder(); + virtual ~FileEncoder(); + }; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCInFile.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCInFile.cpp new file mode 100644 index 0000000000..900cb6835b --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCInFile.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCInFile.h" + +namespace LzmaSDKObjC { + + STDMETHODIMP InFile::Read(void *data, UInt32 size, UInt32 *processedSize) { + if (processedSize) *processedSize = 0; + if (_f && size > 0) { + const size_t r = fread(data, 1, size, _f); + if (processedSize) *processedSize = (UInt32)r; + } + return S_OK; + } + + STDMETHODIMP InFile::Seek(Int64 offset, uint32_t seekOrigin, UInt64 *newPosition) { + if (newPosition) *newPosition = 0; + if (_f) { + if (fseeko(_f, offset, seekOrigin) == 0) { + if (newPosition) *newPosition = ftello(_f); + return S_OK; + } + } + return S_FALSE; + } + + bool InFile::open(const char * p) { + if (p) _f = fopen(p, "rb"); + return (_f != NULL); + } + + void InFile::close() { + if (_f) { + fclose(_f); + _f = NULL; + } + } + + InFile::InFile() : + _f(NULL) { + + } + + InFile::~InFile() { + this->close(); + } + +} + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCInFile.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCInFile.h new file mode 100644 index 0000000000..249d4fac42 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCInFile.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCINFILE_H__ +#define __LZMASDKOBJCINFILE_H__ 1 + +#include "LzmaAppleCommon.h" +#include "LzmaSDKObjCTypes.h" + +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" +#include "../lzma/CPP/7zip/Common/FileStreams.h" + +namespace LzmaSDKObjC { + + class InFile : public IInStream, public CMyUnknownImp { + private: + FILE * _f; + + public: + MY_UNKNOWN_IMP1(IInStream) + + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + + bool open(const char * p); + void close(); + + InFile(); + virtual ~InFile(); + }; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem+Private.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem+Private.h new file mode 100644 index 0000000000..9baa4c920d --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem+Private.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCITEM_PRIVATE_H__ +#define __LZMASDKOBJCITEM_PRIVATE_H__ 1 + +#define LzmaObjcItemFlagIsEncrypted (uint8_t)(1) +#define LzmaObjcItemFlagIsDir (uint8_t)(1 << 1) + +#include +#import "NSString+Inlineobjc.h" +#import "NSArray+Inlineobjc.h" + +@interface LzmaSDKObjCItem() { +@public + __strong NSString * _path; + + uint64_t _orgSize; + uint32_t _index; + uint32_t _crc; + time_t _cDate; + time_t _aDate; + time_t _mDate; + uint8_t _flags; +} + +@end + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem.h new file mode 100644 index 0000000000..f11635361c --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import + + +/** + @brief Archive item class for the file or directory. + */ +@interface LzmaSDKObjCItem : NSObject + + +/** + @brief Getter for orinal file size. + */ +@property (nonatomic, assign, readonly) unsigned long long originalSize; + + +/** + @bief Item CRC32 if available. + */ +@property (nonatomic, assign, readonly) NSUInteger crc32; + + +/** + @brief Getter for check archive item is encrypted with password or not. + */ +@property (nonatomic, assign, readonly) BOOL isEncrypted; + + +/** + @brief Check archive item is directory. + */ +@property (nonatomic, assign, readonly) BOOL isDirectory; + + +/** + @brief Getter for the file name. + @warning If item is directory this propoerty return nil. + */ +@property (nonatomic, strong, readonly) NSString * _Nullable fileName; + + +/** + @brief Getter for the directory path where item located or nil. + @code + // If full item path is=dir1/subdir2/readme.txt + // then directoryPath=dir1/subdir2 + @endcode + */ +@property (nonatomic, strong, readonly) NSString * _Nullable directoryPath; + + +/** + @brief Getter for the modification date if available, or nil. + */ +@property (nonatomic, strong, readonly) NSDate * _Nullable modificationDate; + + +/** + @brief Getter for the creation date if available, or nil. + */ +@property (nonatomic, strong, readonly) NSDate * _Nullable creationDate; + + +/** + @brief Getter for the last access date time if available, or nil. + */ +@property (nonatomic, strong, readonly) NSDate * _Nullable accessDate; + +@end + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem.mm new file mode 100644 index 0000000000..e848ffcce7 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCItem.mm @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import "LzmaSDKObjCItem.h" +#import "LzmaSDKObjCItem+Private.h" + +@implementation LzmaSDKObjCItem + +- (unsigned long long) originalSize { + return _orgSize; +} + +- (NSUInteger) crc32 { + return _crc; +} + +- (BOOL) isEncrypted { + return (_flags & LzmaObjcItemFlagIsEncrypted) ? YES : NO; +} + +- (BOOL) isDirectory { + return (_flags & LzmaObjcItemFlagIsDir) ? YES : NO; +} + +- (NSString *) fileName { + return (NSStringIsNotEmpty(_path) && !self.isDirectory) ? [_path lastPathComponent] : nil; +} + +- (NSString *) directoryPath { + if (NSStringIsNotEmpty(_path)) { + if (self.isDirectory) return _path; + else { + NSString * path = [_path stringByDeletingLastPathComponent]; + if (NSStringIsNotEmpty(path)) return path; + } + } + return nil; +} + +- (NSDate *) modificationDate { + return _mDate ? [NSDate dateWithTimeIntervalSince1970:NSTimeInterval(_mDate)] : nil; +} + +- (NSDate *) creationDate { + return _cDate ? [NSDate dateWithTimeIntervalSince1970:NSTimeInterval(_cDate)] : nil; +} + +- (NSDate *) accessDate { + return _aDate ? [NSDate dateWithTimeIntervalSince1970:NSTimeInterval(_aDate)] : nil; +} + +#if defined(DEBUG) || defined(_DEBUG) +- (NSString *) debugDescription { + return [NSString stringWithFormat:@"[\npath=%@\nsize=%llu\nmodf.date=%@\ncret.date=%@\naccs.date=%@\nencrypted=%@\nCRC=%u\ndirectory=%@\n]", + _path, + _orgSize, + self.modificationDate, + self.creationDate, + self.accessDate, + self.isEncrypted ? @"YES" : @"NO", + _crc, + self.isDirectory ? @"YES" : @"NO" + ]; +} + +- (NSString *) description { + return [self debugDescription]; +} +#endif + +- (void) dealloc { + _path = nil; +} + + +@end diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem+Private.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem+Private.h new file mode 100644 index 0000000000..bf08f51b67 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem+Private.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCMUTABLEITEM_PRIVATE_H__ +#define __LZMASDKOBJCMUTABLEITEM_PRIVATE_H__ 1 + +@interface LzmaSDKObjCMutableItem() { +@public + __strong NSObject * _content; +} + +@end + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem.h new file mode 100644 index 0000000000..a2b814cd90 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import "LzmaSDKObjCItem.h" + +@interface LzmaSDKObjCMutableItem : LzmaSDKObjCItem + +/** + @brief Full item path. + If file - no "/" at the end. + If directory - "/" at the end. + */ +@property (nonatomic, strong, readonly) NSString * _Nonnull path; + + +/** + @brief File path asociated with item. + */ +@property (nonatomic, strong, readonly) NSString * _Nullable sourceFilePath; + + +/** + @brief Set custom data for the file. + If data not empty - mark item as file and set all dates to `now`. + */ +@property (nonatomic, strong) NSData * _Nullable fileData; + + +/** + @brief Modification date if available, or nil. + */ +@property (nonatomic, strong, setter=setModificationDate:) NSDate * _Nullable modificationDate; + + +/** + @brief Creation date if available, or nil. + */ +@property (nonatomic, strong, setter=setCreationDate:) NSDate * _Nullable creationDate; + + +/** + @brief Last access date time if available, or nil. + */ +@property (nonatomic, strong, setter=setAccessDate:) NSDate * _Nullable accessDate; + + +- (void) setAccessDate:(nullable NSDate *) date; + +- (void) setCreationDate:(nullable NSDate *) date; + +- (void) setModificationDate:(nullable NSDate *) date; + +/** + @brief Set full item path with directory flag. + */ +- (void) setPath:(nonnull NSString *) path isDirectory:(BOOL) isDirectory; + +@end diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem.mm new file mode 100644 index 0000000000..5a2015ecdb --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCMutableItem.mm @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import "LzmaSDKObjCMutableItem.h" +#import "LzmaSDKObjCItem+Private.h" +#import "LzmaSDKObjCMutableItem+Private.h" + +@implementation LzmaSDKObjCMutableItem + +// getters in superclass, setters here. +@dynamic modificationDate; +@dynamic creationDate; +@dynamic accessDate; + +- (NSString *) path { + return _path; +} + +- (NSString *) sourceFilePath { + return (_content && [_content isKindOfClass:[NSString class]]) ? (NSString*)_content : nil; +} + +- (void) setPath:(nonnull NSString *) path isDirectory:(BOOL) isDirectory { + NSParameterAssert(path); + _path = path; + if (isDirectory) { + _flags |= LzmaObjcItemFlagIsDir; + _content = nil; + } else { + _flags &= ~(LzmaObjcItemFlagIsDir); + }; +} + +- (NSData *) fileData { + return (_content && [_content isKindOfClass:[NSData class]]) ? (NSData*)_content : nil; +} + +- (void) setFileData:(NSData *) fileData { + const uint64_t size = fileData ? [fileData length] : 0; + if (size) { + _content = fileData; + _orgSize = size; + _flags &= ~(LzmaObjcItemFlagIsDir); + _mDate = _cDate = _aDate = (time_t)[[NSDate date] timeIntervalSince1970]; + } else { + _content = nil; + _orgSize = 0; + } +} + +- (void) setAccessDate:(nullable NSDate *) date { + _aDate = date ? (time_t)[date timeIntervalSince1970] : 0; +} + +- (void) setCreationDate:(nullable NSDate *) date { + _cDate = date ? (time_t)[date timeIntervalSince1970] : 0; +} + +- (void) setModificationDate:(nullable NSDate *) date { + _mDate = date ? (time_t)[date timeIntervalSince1970] : 0; +} + +- (void) dealloc { + _content = nil; +} + +@end diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOpenCallback.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOpenCallback.cpp new file mode 100644 index 0000000000..725319a5c4 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOpenCallback.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCOpenCallback.h" + +#include "../lzma/CPP/Common/Defs.h" + +namespace LzmaSDKObjC { + + STDMETHODIMP OpenCallback::SetTotal(const UInt64 * files, const UInt64 * bytes) { + return S_OK; + } + + STDMETHODIMP OpenCallback::SetCompleted(const UInt64 * files, const UInt64 * bytes) { + return S_OK; + } + + STDMETHODIMP OpenCallback::CryptoGetTextPassword(BSTR *password) { + if (_coder) { + UString w(_coder->onGetVoidCallback1()); + if (w.Len() > 0) return StringToBstr(w, password); + } + return S_OK; + } + + STDMETHODIMP OpenCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) { + if (passwordIsDefined) *passwordIsDefined = BoolToInt(false); + if (_coder) { + UString w(_coder->onGetVoidCallback1()); + if (w.Len() > 0) { + if (passwordIsDefined) *passwordIsDefined = BoolToInt(true); + return StringToBstr(w, password); + } + } + return S_OK; + } + + OpenCallback::OpenCallback() : LzmaSDKObjC::LastErrorHolder(), + _coder(NULL) { + + } + + OpenCallback::~OpenCallback() { + + } + +} + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOpenCallback.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOpenCallback.h new file mode 100644 index 0000000000..8438d37df0 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOpenCallback.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCOPENCALLBACK_H__ +#define __LZMASDKOBJCOPENCALLBACK_H__ 1 + +#include "LzmaSDKObjCBaseCoder.h" + +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" + +namespace LzmaSDKObjC { + + class OpenCallback : + public IArchiveOpenCallback, + public ICryptoGetTextPassword, + public ICryptoGetTextPassword2, + public CMyUnknownImp, + public LzmaSDKObjC::LastErrorHolder { + private: + LzmaSDKObjC::BaseCoder * _coder; + + public: + MY_UNKNOWN_IMP3(IArchiveOpenCallback, ICryptoGetTextPassword, ICryptoGetTextPassword2) + + // IArchiveOpenCallback + STDMETHOD(SetTotal)(const UInt64 *files, const UInt64 *bytes); + STDMETHOD(SetCompleted)(const UInt64 *files, const UInt64 *bytes); + + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *password); + + // ICryptoGetTextPassword2 + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); + + void setCoder(LzmaSDKObjC::BaseCoder * coder) { _coder = coder; } + + OpenCallback(); + virtual ~OpenCallback(); + }; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOutFile.cpp b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOutFile.cpp new file mode 100644 index 0000000000..e305bbcaff --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOutFile.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "LzmaSDKObjCOutFile.h" +#include + +namespace LzmaSDKObjC { + + STDMETHODIMP OutFile::Write(const void *data, UInt32 size, UInt32 *processedSize) { + if (_f) { + const size_t writed = fwrite(data, 1, size, _f); + if (processedSize) *processedSize = (UInt32)writed; + } + return S_OK; + } + + STDMETHODIMP OutFile::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) { + if (_f) { + if (fseeko(_f, offset, seekOrigin) == 0) { + if (newPosition) *newPosition = ftello(_f); + } else { + return S_FALSE; + } + } + return S_OK; + } + + STDMETHODIMP OutFile::SetSize(UInt64 newSize) { + return S_OK; + } + + bool OutFile::open(const char * path) { + if (path) _f = fopen(path, "w+b"); + return (_f != NULL); + } + + void OutFile::close() { + if (_f) { + fclose(_f); + _f = NULL; + } + } + + OutFile::OutFile() : + _f(NULL) { + + } + + OutFile::~OutFile() { + this->close(); + } + +} + + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOutFile.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOutFile.h new file mode 100644 index 0000000000..664b499b71 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCOutFile.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCOUTFILE_H__ +#define __LZMASDKOBJCOUTFILE_H__ 1 + +#include "LzmaAppleCommon.h" +#include "LzmaSDKObjCTypes.h" +#include "LzmaSDKObjCCommon.h" + +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" +#include "../lzma/CPP/7zip/Common/FileStreams.h" +#include "../lzma/C/7zCrc.h" + +namespace LzmaSDKObjC { + + class OutFile : public IOutStream, public CMyUnknownImp { + private: + FILE * _f; + + public: + MY_UNKNOWN_IMP1(IOutStream) + + STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize); + STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition); + STDMETHOD(SetSize)(UInt64 newSize); + + bool open(const char * path); + void close(); + + OutFile(); + virtual ~OutFile(); + }; + +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCReader.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCReader.h new file mode 100644 index 0000000000..7adf8fa39a --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCReader.h @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import + +#include "LzmaSDKObjCTypes.h" +#include "LzmaSDKObjCItem.h" +#include "LzmaSDKObjC.h" + +/** + @brief Lower case string of the 7zip file extension. + @return @b 7z. + */ +LZMASDKOBJC_EXTERN NSString * const _Nonnull kLzmaSDKObjCFileExt7z; + + +/** + @brief Error domain for the reader errors. + @return @b LzmaSDKObjC + */ +LZMASDKOBJC_EXTERN NSString * const _Nonnull kLzmaSDKObjCErrorDomain; + + +/** + @brief Error description when internal decoder/encoder not initialized + due to input params assertion. + */ +LZMASDKOBJC_EXTERN NSString * const _Nonnull kLzmaSDKObjCErrorDescrEncDecNotCreated; + + +@class LzmaSDKObjCReader; + + +/** + @brief Reader delegate. All methods is optional & called from main thread. + */ +@protocol LzmaSDKObjCReaderDelegate + +@optional +/** + @brief Reports extract progress of file(s). Called after all internal buffers was writed. + Quality depends on size of the @b kLzmaSDKObjCStreamWriteSize, @b kLzmaSDKObjCDecoderWriteSize. + @param progress Extract progress [0.0; 1.0] + */ +- (void) onLzmaSDKObjCReader:(nonnull LzmaSDKObjCReader *) reader + extractProgress:(float) progress; + +@end + + +/** + @brief Lzma file reader/extractor. + */ +@interface LzmaSDKObjCReader : NSObject + + +/** + @brief Type of the assigned archive. Determined during initialization. + @warning Readonly property. If can't be determined - create reader with custom type. + */ +@property (nonatomic, assign, readonly) LzmaSDKObjCFileType fileType; + + +/** + @brief URL to the archive file. + */ +@property (nonatomic, strong, readonly) NSURL * _Nullable fileURL; + + +/** + @brief Number of the archive items. + @warning Available only after open archive. + */ +@property (nonatomic, assign, readonly) NSUInteger itemsCount; + + +/** + @brief Archive reader delegate. + */ +@property (nonatomic, weak) id _Nullable delegate; + + +/** + @brief Getter to the archive password. + */ +@property (nonatomic, copy) NSString * _Nullable (^ _Nullable passwordGetter)(void); + + +/** + @brief Last error from operation. + */ +@property (nonatomic, strong, readonly) NSError * _Nullable lastError; + + +/** + @brief Initialize archive with file url. + @warning Type detected from archive file extension using @b LzmaSDKObjCDetectFileType function. + @param fileURL File url to the archive. Can't be nil. + */ +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL; + + +/** + @brief Initialize archive with file url and archive type. + @param fileURL File url to the archive. Can't be nil. + @param type Manualy defined type of the archive. + */ +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL andType:(LzmaSDKObjCFileType) type; + + +/** + @brief Open archive. + @param error Open error. Same error can be received via @b lastError property. + */ +- (BOOL) open:(NSError * _Nullable * _Nullable) error; + + +/** + @brief Iterate thought all archive items. + Items created during each iteration, so track, filter & store for the next use. + */ +- (BOOL) iterateWithHandler:(BOOL(^ _Nonnull)(LzmaSDKObjCItem * _Nonnull item, NSError * _Nullable error)) handler; + + +/** + @brief Extracts array of items stored during iteration. + @param items Array with @b LzmaSDKObjCItem objects. + @param path Path to extract provided items. + @param isFullPaths Create directory structure for the file items(YES) or store all files to extract path(NO). + In case of just store to path, files with the same names will rewrite automaticaly. + */ +- (BOOL) extract:(nullable NSArray *) items + toPath:(nullable NSString *) path + withFullPaths:(BOOL) isFullPaths; + + +/** + @brief Test archive items. Calculates CRC & compare with header value. + @param items Array with @b LzmaSDKObjCItem objects. + */ +- (BOOL) test:(nullable NSArray *) items; + +@end + + +/** + @brief Get archive type from path by it's extension. + @warning See supported file path extensions @b kLzmaSDKObjCFileExt7z and @b kLzmaSDKObjCFileExtXz. + Case is ignored. + @return Type by the path extension or @b LzmaSDKObjCFileTypeUndefined + */ +LZMASDKOBJC_EXTERN LzmaSDKObjCFileType LzmaSDKObjCDetectFileType(NSURL * _Nullable fileURL); + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCReader.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCReader.mm new file mode 100644 index 0000000000..2b2a547c56 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCReader.mm @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import "LzmaSDKObjCReader.h" + +#include "LzmaSDKObjCFileDecoder.h" +#include "LzmaSDKObjCCommon.h" + +#import "LzmaSDKObjCItem+Private.h" + +#include + +NSString * const _Nonnull kLzmaSDKObjCFileExt7z = @"7z"; +NSString * const _Nonnull kLzmaSDKObjCErrorDomain = @"LzmaSDKObjC"; +NSString * const _Nonnull kLzmaSDKObjCErrorDescrEncDecNotCreated = @"Encoder or decoder not created. Check initialization input parameters and try again later."; + +@interface LzmaSDKObjCReader() { +@private + LzmaSDKObjC::FileDecoder * _decoder; + + __strong NSURL * _fileURL; +} + +@end + +@implementation LzmaSDKObjCReader + +static void _LzmaSDKObjCReaderSetFloatCallback(void * context, float value) { + LzmaSDKObjCReader * r = (__bridge LzmaSDKObjCReader *)context; + id d = r ? r.delegate : nil; + if (d && [d respondsToSelector:@selector(onLzmaSDKObjCReader:extractProgress:)]) { + if ([NSThread isMainThread]) [d onLzmaSDKObjCReader:r extractProgress:value]; + else dispatch_async(dispatch_get_main_queue(), ^{ [d onLzmaSDKObjCReader:r extractProgress:value]; }); + } +} + +static void * _LzmaSDKObjCReaderGetVoidCallback1(void * context) { + LzmaSDKObjCReader * r = (__bridge LzmaSDKObjCReader *)context; + if (r) return r->_passwordGetter ? NSStringToWideCharactersString(r->_passwordGetter()) : NULL; + return NULL; +} + +- (BOOL) openPath:(NSString *) path withError:(NSError **) error { + BOOL isDir = YES; + if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir]) { + if (isDir) { + _decoder->setLastError(-1, __LINE__, __FILE__, "Archive path is directory: [%s]", [path UTF8String]); + } else { + _decoder->context = (__bridge void *)self; + _decoder->getVoidCallback1 = _LzmaSDKObjCReaderGetVoidCallback1; + if (_decoder->openFile([path UTF8String])) return YES; + } + } else { + _decoder->setLastError(-1, __LINE__, __FILE__, "File path doesn't exists: [%s]", [path UTF8String]); + } + + if (error) *error = self.lastError; + return NO; +} + +- (BOOL) iterateWithHandler:(BOOL(^ _Nonnull)(LzmaSDKObjCItem * _Nonnull item, NSError * _Nullable error)) handler { + NSParameterAssert(handler); + if (handler && _decoder) { + _decoder->clearLastError(); + _decoder->iterateStart(); + LzmaSDKObjCItem * item = nil; + NSError * error = nil; + do { + item = nil; + error = nil; + PROPVARIANT prop, name; + memset(&prop, 0, sizeof(PROPVARIANT)); + memset(&name, 0, sizeof(PROPVARIANT)); + bool r = _decoder->readIteratorProperty(&prop, kpidSize); + r |= _decoder->readIteratorProperty(&name, kpidPath); + if (r) { + item = [[LzmaSDKObjCItem alloc] init]; + if (item) { + item->_index = _decoder->iteratorIndex(); + item->_orgSize = LzmaSDKObjC::Common::PROPVARIANTGetUInt64(&prop); + memset(&prop, 0, sizeof(PROPVARIANT)); + + if (name.vt == VT_BSTR && name.bstrVal) + item->_path = [[NSString alloc] initWithBytes:name.bstrVal length:sizeof(wchar_t) * wcslen(name.bstrVal) encoding:NSUTF32LittleEndianStringEncoding]; + + memset(&prop, 0, sizeof(PROPVARIANT)); + if (_decoder->readIteratorProperty(&prop, kpidCTime)) + if (prop.vt == VT_FILETIME) item->_cDate = LzmaSDKObjC::Common::FILETIMEToUnixTime(prop.filetime); + + memset(&prop, 0, sizeof(PROPVARIANT)); + if (_decoder->readIteratorProperty(&prop, kpidATime)) + if (prop.vt == VT_FILETIME) item->_aDate = LzmaSDKObjC::Common::FILETIMEToUnixTime(prop.filetime); + + memset(&prop, 0, sizeof(PROPVARIANT)); + if (_decoder->readIteratorProperty(&prop, kpidMTime)) + if (prop.vt == VT_FILETIME) item->_mDate = LzmaSDKObjC::Common::FILETIMEToUnixTime(prop.filetime); + + memset(&prop, 0, sizeof(PROPVARIANT)); + if (_decoder->readIteratorProperty(&prop, kpidEncrypted)) + if (prop.vt == VT_BOOL && prop.boolVal) item->_flags |= LzmaObjcItemFlagIsEncrypted; + + memset(&prop, 0, sizeof(PROPVARIANT)); + if (_decoder->readIteratorProperty(&prop, kpidCRC)) + item->_crc = (uint32_t)LzmaSDKObjC::Common::PROPVARIANTGetUInt64(&prop); + + memset(&prop, 0, sizeof(PROPVARIANT)); + if (_decoder->readIteratorProperty(&prop, kpidIsDir)) + if (prop.vt == VT_BOOL && prop.boolVal) item->_flags |= LzmaObjcItemFlagIsDir; + } else { + error = [NSError errorWithDomain:kLzmaSDKObjCErrorDomain code:-1 userInfo:nil]; + } + } + NWindows::NCOM::PropVariant_Clear(&name); + } + while (handler(item, error) && _decoder->iterateNext()); + return YES; + } + return NO; +} + +- (BOOL) process:(NSArray *) items + toPath:(const char *) path + withFullPaths:(BOOL) isFullPaths { + const uint32_t count = items ? (uint32_t)[items count] : 0; + if (count && _decoder) { + BOOL isOK = NO; + const unsigned int indexesMemSize = count * sizeof(uint32_t); + uint32_t * itemsIndices = (uint32_t *)malloc(indexesMemSize); + if (itemsIndices) { + uint32_t index = 0; + for (LzmaSDKObjCItem * item in items) itemsIndices[index++] = item->_index; + _decoder->context = (__bridge void *)self; + _decoder->setFloatCallback2 = _LzmaSDKObjCReaderSetFloatCallback; + if (_decoder->process(itemsIndices, count, path, path ? (bool)isFullPaths : false)) isOK = YES; + free(itemsIndices); + } else { + _decoder->setLastError(-1, __LINE__, __FILE__, "Can't allocate enough memory for items indexes: [%u] bytes", indexesMemSize); + } + return isOK; + } + return NO; +} + +- (BOOL) extract:(nullable NSArray *) items + toPath:(nullable NSString *) path + withFullPaths:(BOOL) isFullPaths { + const char * cPath = path ? [path UTF8String] : NULL; + return cPath ? [self process:items toPath:cPath withFullPaths:isFullPaths] : NO; +} + +- (BOOL) test:(nullable NSArray *) items { + return [self process:items toPath:NULL withFullPaths:NO]; +} + +- (BOOL) open:(NSError * _Nullable * _Nullable) error { + if (!_decoder) { + if (error) *error = [NSError errorWithDomain:kLzmaSDKObjCErrorDomain + code:-1 + userInfo:@{ NSLocalizedDescriptionKey : kLzmaSDKObjCErrorDescrEncDecNotCreated }]; + return NO; + } + + if (!_decoder->prepare(_fileType)) { + if (error) *error = self.lastError; + return NO; + } + + if (!_fileURL) { + _decoder->setLastError(-1, __LINE__, __FILE__, "No file URL provided"); + if (error) *error = self.lastError; + return NO; + } + + NSString * path = [_fileURL path]; + if (path) { + if ([self openPath:path withError:error]) return YES; + } + + if (error) *error = self.lastError; + return NO; +} + +- (NSError *) lastError { + LzmaSDKObjC::Error * error = _decoder ? _decoder->lastError() : NULL; + if (error) { + return [NSError errorWithDomain:kLzmaSDKObjCErrorDomain + code:(NSInteger)error->code + userInfo:@{ NSLocalizedDescriptionKey : [NSString stringWithUTF8String:error->description.Ptr() ? error->description.Ptr() : ""], + NSFilePathErrorKey : [NSString stringWithUTF8String:error->file.Ptr() ? error->file.Ptr() : ""], + @"line" : [NSNumber numberWithInt:error->line], + @"code" : [NSNumber numberWithLongLong:error->code], + NSLocalizedFailureReasonErrorKey : [NSString stringWithUTF8String:error->possibleReason.Ptr() ? error->possibleReason.Ptr() : ""]}]; + } + return nil; +} + +- (NSURL *) fileURL { + return _fileURL; +} + +- (NSUInteger) itemsCount { + return _decoder->itemsCount(); +} + +#if defined(DEBUG) || defined(_DEBUG) +- (nullable id) init { + LZMASDK_DEBUG_ERR("Reader can't be initialized with `init`, use 'initWithFileURL' instead"); + NSAssert(0, @"Use 'initWithFileURL' instead"); + return nil; +} +#endif + +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL { + self = [super init]; + if (self) { + NSParameterAssert(fileURL); + + _fileType = LzmaSDKObjCDetectFileType(fileURL); + _fileURL = fileURL; + + _decoder = new LzmaSDKObjC::FileDecoder(); + NSAssert(_decoder, @"Can't create decoder object"); + } + return self; +} + +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL andType:(LzmaSDKObjCFileType) type { + self = [super init]; + if (self) { + NSParameterAssert(fileURL); + + _fileURL = fileURL; + _fileType = type; + + _decoder = new LzmaSDKObjC::FileDecoder(); + NSAssert(_decoder, @"Can't create decoder object"); + } + return self; +} + +- (void) dealloc { + if (_decoder) { + _decoder->context = NULL; + delete _decoder; + } + + _fileURL = nil; + _passwordGetter = nil; +} + +@end + +LzmaSDKObjCFileType LzmaSDKObjCDetectFileType(NSURL * _Nullable fileURL) { + if (fileURL) { + NSString * ext = [[fileURL pathExtension] lowercaseString]; + if (ext) { + if ([ext isEqualToString:kLzmaSDKObjCFileExt7z]) return LzmaSDKObjCFileType7z; + } + } + return LzmaSDKObjCFileTypeUndefined; +} + diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCTypes.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCTypes.h new file mode 100644 index 0000000000..0c954239ef --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCTypes.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCTYPES_H__ +#define __LZMASDKOBJCTYPES_H__ 1 + +/** + no #include + */ + + +#if !defined(LZMASDKOBJC_EXTERN) +#if defined(__cplusplus) || defined(_cplusplus) +#define LZMASDKOBJC_EXTERN extern "C" +#else +#define LZMASDKOBJC_EXTERN extern +#endif +#endif + +typedef enum _LzmaSDKObjCFileType { + LzmaSDKObjCFileTypeUndefined = 0, + LzmaSDKObjCFileType7z = 1 +} LzmaSDKObjCFileType; + +typedef enum _LzmaSDKObjCMethod { + LzmaSDKObjCMethodLZMA = 0, + LzmaSDKObjCMethodLZMA2 = 1 +} LzmaSDKObjCMethod; + +typedef void * (*LzmaSDKObjCGetVoidCallback)(void * context); +typedef void (*LzmaSDKObjCSetFloatCallback)(void * context, float value); + +#if (defined(DEBUG) || defined(_DEBUG)) && !defined(LZMASDKOBJC_NO_DEBUG_LOG) +#define LZMASDK_DEBUG_LOG(M, ...) fprintf(stdout, "LZMA DEBUG %d: " M "\n", __LINE__, ##__VA_ARGS__); +#define LZMASDK_DEBUG_ERR(M, ...) fprintf(stderr, "LZMA ERROR %d: " M "\n", __LINE__, ##__VA_ARGS__); +#else +#define LZMASDK_DEBUG_LOG(M, ...) +#define LZMASDK_DEBUG_ERR(M, ...) +#endif + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCUpdateCallback.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCUpdateCallback.h new file mode 100644 index 0000000000..edad297685 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCUpdateCallback.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef __LZMASDKOBJCUPDATECALLBACK_H__ +#define __LZMASDKOBJCUPDATECALLBACK_H__ 1 + +#include "LzmaSDKObjCBaseCoder.h" + +#include "../lzma/CPP/7zip/Archive/IArchive.h" +#include "../lzma/CPP/7zip/IPassword.h" +#include "../lzma/CPP/7zip/ICoder.h" +#include "../lzma/CPP/Common/MyCom.h" +#include "../lzma/CPP/Common/MyString.h" +#include "../lzma/CPP/7zip/Common/FileStreams.h" + +#include "LzmaSDKObjCOutFile.h" + +namespace LzmaSDKObjC { + + class UpdateCallback: + public IArchiveUpdateCallback2, + public ICryptoGetTextPassword, + public ICryptoGetTextPassword2, + public CMyUnknownImp, + public LzmaSDKObjC::LastErrorHolder { + private: + UInt64 _total; + + public: + + MY_UNKNOWN_IMP3(IArchiveUpdateCallback2, ICryptoGetTextPassword, ICryptoGetTextPassword2) + + // IProgress + STDMETHOD(SetTotal)(UInt64 size); + STDMETHOD(SetCompleted)(const UInt64 *completeValue); + + // IUpdateCallback2 + STDMETHOD(GetUpdateItemInfo)(UInt32 index, Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive); + STDMETHOD(GetProperty)(UInt32 index, PROPID propID, PROPVARIANT *value); + STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **inStream); + STDMETHOD(SetOperationResult)(Int32 operationResult); + STDMETHOD(GetVolumeSize)(UInt32 index, UInt64 *size); + STDMETHOD(GetVolumeStream)(UInt32 index, ISequentialOutStream **volumeStream); + + // ICryptoGetTextPassword + STDMETHOD(CryptoGetTextPassword)(BSTR *password); + + // ICryptoGetTextPassword2 + STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); + + void * items; + LzmaSDKObjC::BaseCoder * coder; + + UpdateCallback(); + + virtual ~UpdateCallback(); + }; +} + +#endif diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCUpdateCallback.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCUpdateCallback.mm new file mode 100644 index 0000000000..271ecc6b60 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCUpdateCallback.mm @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include + +#import "LzmaSDKObjCUpdateCallback.h" +#include "../lzma/CPP/Common/Defs.h" +#include "../lzma/CPP/Windows/PropVariant.h" + +#import "LzmaSDKObjCMutableItem.h" +#import "LzmaSDKObjCMutableItem+Private.h" +#import "LzmaSDKObjCItem+Private.h" + +namespace LzmaSDKObjC { + + class NSDataFileStream: public ISequentialInStream, public CMyUnknownImp { + private: + NSData * _data; + NSUInteger _pos; + public: + MY_UNKNOWN_IMP1(ISequentialInStream) + STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); + NSDataFileStream(NSData * data) : _data(data), _pos(0) { } + }; + + STDMETHODIMP NSDataFileStream::Read(void *data, UInt32 size, UInt32 *processedSize) { + NSRange range = NSMakeRange(_pos, 0); + if (size > 0) { + const NSUInteger len = [_data length]; + const NSUInteger left = len > range.location ? len - range.location : 0; + range.length = MIN(left, size); + if (range.length) { + _pos += range.length; + [_data getBytes:data range:range]; + } + } + + if (processedSize) *processedSize = (UInt32)range.length; + return S_OK; + } + + STDMETHODIMP UpdateCallback::SetTotal(UInt64 size) { + _total = size; + if (coder) coder->onProgress(0); + return S_OK; + } + + STDMETHODIMP UpdateCallback::SetCompleted(const UInt64 * completeValue) { + if (completeValue && coder) { + const long double complete = *completeValue; + const float progress = (_total > 0) ? (float)(complete / _total) : 0; + coder->onProgress(progress); + } + return S_OK; + } + + STDMETHODIMP UpdateCallback::GetUpdateItemInfo(UInt32 index, Int32 *newData, Int32 *newProperties, UInt32 *indexInArchive) { + if (newData) { + *newData = BoolToInt(true); + } + + if (newProperties) { + *newProperties = BoolToInt(true); + } + + if (indexInArchive) { + *indexInArchive = (UInt32)(Int32)-1; + } + + return S_OK; + } + + STDMETHODIMP UpdateCallback::GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value) { + NSMutableArray * arr = (__bridge NSMutableArray *)items; + LzmaSDKObjCMutableItem * item = (arr && index < [arr count]) ? [arr objectAtIndex:index] : nil; + if (!item) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't locate item at index: %lu.", (unsigned long)index); + return E_ABORT; + } + + NWindows::NCOM::CPropVariant prop; + if (propID == kpidIsAnti) { + prop = false; + prop.Detach(value); + return S_OK; + } + + switch (propID) { + case kpidPath: prop = UString((const wchar_t*)[item.path cStringUsingEncoding:NSUTF32LittleEndianStringEncoding]); break; + case kpidIsDir: prop = item.isDirectory ? true : false; break; + case kpidSize: prop = item->_orgSize; break; +// case kpidAttrib: prop = dirItem.Attrib; break; + case kpidCTime: prop = Common::UnixTimeToFILETIME(item->_cDate); break; + case kpidATime: prop = Common::UnixTimeToFILETIME(item->_aDate); break; + case kpidMTime: prop = Common::UnixTimeToFILETIME(item->_mDate); break; + } + prop.Detach(value); + return S_OK; + } + + STDMETHODIMP UpdateCallback::GetStream(UInt32 index, ISequentialInStream **inStream) { + NSMutableArray * arr = (__bridge NSMutableArray *)items; + LzmaSDKObjCMutableItem * item = (arr && index < [arr count]) ? [arr objectAtIndex:index] : nil; + + if (!item) return S_FALSE; + if (item.isDirectory) return S_OK; + + NSData * data = item.fileData; + if (data) { + NSDataFileStream * stream = new NSDataFileStream(data); + if (!stream) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create NSData stream object."); + return E_ABORT; + } + + CMyComPtr inStreamLoc(stream); + *inStream = inStreamLoc.Detach(); + return S_OK; + } + + NSString * path = item.sourceFilePath; + if (path) { + const char * utf8Path = [path UTF8String]; + CInFileStream * inStreamSpec = new CInFileStream(); + if (!inStreamSpec) { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't create file stream object for path: %s", utf8Path); + return E_ABORT; + } + + CMyComPtr inStreamLoc(inStreamSpec); + if (inStreamSpec->Open(utf8Path)) { + *inStream = inStreamLoc.Detach(); + return S_OK; + } else { + this->setLastError(E_ABORT, __LINE__, __FILE__, "Can't open file for reading at path: %s", utf8Path); + return E_ABORT; + } + } + + LZMASDK_DEBUG_LOG("UpdateCallback::GetStream error: no source info for stream") + return S_OK; + } + + STDMETHODIMP UpdateCallback::SetOperationResult(Int32 operationResult) { + return S_OK; + } + + STDMETHODIMP UpdateCallback::GetVolumeSize(UInt32 index, UInt64 *size) { + return S_OK; + } + + STDMETHODIMP UpdateCallback::GetVolumeStream(UInt32 index, ISequentialOutStream **volumeStream) { + return S_OK; + } + + STDMETHODIMP UpdateCallback::CryptoGetTextPassword(BSTR *password) { + if (coder) { + if (coder->requiredCallback1()) { + UString w(coder->onGetVoidCallback1()); + if (w.Len() > 0) return StringToBstr(w, password); + } + } + return S_OK; + } + + STDMETHODIMP UpdateCallback::CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) { + if (passwordIsDefined) *passwordIsDefined = BoolToInt(false); + if (coder) { + if (coder->requiredCallback1()) { + UString w(coder->onGetVoidCallback1()); + if (w.Len() > 0) { + if (passwordIsDefined) *passwordIsDefined = BoolToInt(true); + return StringToBstr(w, password); + } + } + } + return S_OK; + } + + UpdateCallback::UpdateCallback() : LzmaSDKObjC::LastErrorHolder(), + _total(0), + items(NULL), + coder(NULL) { + + } + + UpdateCallback::~UpdateCallback() { + + } +} diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCWriter.h b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCWriter.h new file mode 100644 index 0000000000..efcd23f302 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCWriter.h @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import "LzmaSDKObjCReader.h" +#import "LzmaSDKObjCMutableItem.h" + +@class LzmaSDKObjCWriter; + +/** + @brief Writer delegate. All methods is optional & called from main thread. + */ +@protocol LzmaSDKObjCWriterDelegate + +@optional +/** + @brief Reports write/archive progress for all file(s). + Quality depends on size of the @b kLzmaSDKObjCStreamWriteSize, @b kLzmaSDKObjCDecoderWriteSize. + @param progress Write/compress progress [0.0; 1.0] + */ +- (void) onLzmaSDKObjCWriter:(nonnull LzmaSDKObjCWriter *) writer + writeProgress:(float) progress; + +@end + +@interface LzmaSDKObjCWriter : NSObject + +/** + @brief Archive password getter. + Called when @b encodeContent and/or @b encodeHeader is YES. + */ +@property (nonatomic, copy) NSString * _Nullable (^ _Nullable passwordGetter)(void); + + +/** + @brief Type of the assigned archive. Determined during initialization. + @warning Readonly property. If can't be determined - create writer with custom type. + */ +@property (nonatomic, assign, readonly) LzmaSDKObjCFileType fileType; + + +/** + @brief URL to the archive file. Destination archive file. + */ +@property (nonatomic, strong, readonly) NSURL * _Nullable fileURL; + + +/** + @brief Last error from operation. + */ +@property (nonatomic, strong, readonly) NSError * _Nullable lastError; + + +/** + @brief Archive writer delegate. + */ +@property (nonatomic, weak) id _Nullable delegate; + + +/** + Compression method. + Default is `LzmaSDKObjCMethodLZMA2`. + */ +@property (nonatomic) LzmaSDKObjCMethod method; + + +/** + @brief Create solid archive. + Default is `YES`. + */ +@property (nonatomic) BOOL solid; + + +/** + Compression level, [1..9]. 9 - ultra. + Default is 7. + */ +@property (nonatomic) unsigned char compressionLevel; + + +/** + Compress archive header. + Default is `YES`. + */ +@property (nonatomic) BOOL compressHeader; + + +/** + Full process archive header. + Default is `YES`. + */ +@property (nonatomic) BOOL compressHeaderFull; + + +/** + Encode archive content, e.g. items/files encoded with password. + Required password for test/extract archive content. + Also required `passwordGetter` block. + Default is `NO`. + */ +@property (nonatomic) BOOL encodeContent; + + +/** + Encode archive header, e.g. no visible content. + Required password for open/list archive content. + Also required `passwordGetter` block. + Default is `NO`. + */ +@property (nonatomic) BOOL encodeHeader; + + +/** + Write creation time to header. + Default is `YES`. + */ +@property (nonatomic) BOOL writeCreationTime; + + +/** + Write access time to header. + Default is `YES`. + */ +@property (nonatomic) BOOL writeAccessTime; + + +/** + Write modification time to header. + Default is `YES`. + */ +@property (nonatomic) BOOL writeModificationTime; + + +/** + @brief Initialize archive with file url. + @warning If `fileURL` is nil -> assertion. + @warning Prev. path will be deleted. + @warning Type detected from archive file extension using @b LzmaSDKObjCDetectFileType function. + @param fileURL File url to the archive. Can't be nil. + */ +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL; + + +/** + @brief Initialize archive with file url and archive type. + @warning If `fileURL` is nil -> assertion. + @warning Prev. path will be deleted. + @param fileURL File url to the archive. Can't be nil. + @param type Manualy defined type of the archive. + */ +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL andType:(LzmaSDKObjCFileType) type; + + +/** + @brief Add file data with a given file path in archive. + @param data File data to encode. Should not be nil or empty. + @param path Path in arcvive. Example: `file.txt` or `dir/file.txt`, etc. + @warning If `data` is nil -> assertion. + @warning If `path` is nil -> assertion. + @return YES - stored and added, otherwice NO. + */ +- (BOOL) addData:(nonnull NSData *) data forPath:(nonnull NSString *) path; + + +/** + @brief Add source full path, e.g. file or directory full path with a given file path in archive. + If source path is directory - all directory content will be added. + @param aPath File or directory full path. Should not be nil. + @param path Path in arcvive. Example: `file.txt` or `dir/file.txt`, etc. + @return YES - source path exists and readable, and item(s) stored and added, otherwice NO. + */ +- (BOOL) addPath:(nonnull NSString *) aPath forPath:(nonnull NSString *) path; + + +/** + @brief Open archive with `fileURL`. + @warning Prev. path will be deleted. + @param error Open error. Same error can be received via @b lastError property. + @return YES - output file was opened and prepared, otherwice NO(check @b lastError property). + */ +- (BOOL) open:(NSError * _Nullable * _Nullable) error; + + +/** + @brief Encode, e.g. compress all items to `fileURL`. + @warning Call after all items are added and archive is opened. + Can be called within separate thread. + @return YES - all items processed, otherwice NO(check @b lastError property). + */ +- (BOOL) write; + +@end diff --git a/Provenance/LzmaSDKObjC/src/LzmaSDKObjCWriter.mm b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCWriter.mm new file mode 100644 index 0000000000..c5a2dbc0e1 --- /dev/null +++ b/Provenance/LzmaSDKObjC/src/LzmaSDKObjCWriter.mm @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2015 - 2017 Kulykov Oleh + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#import "LzmaSDKObjCWriter.h" +#include "LzmaSDKObjCFileEncoder.h" +#import "LzmaSDKObjCMutableItem+Private.h" +#import "LzmaSDKObjCItem+Private.h" + +@interface LzmaSDKObjCWriter() { +@private + LzmaSDKObjC::FileEncoder * _encoder; + + __strong NSURL * _fileURL; + __strong NSMutableArray * _items; +} + +@end + +@implementation LzmaSDKObjCWriter + +static void * _LzmaSDKObjCWriterGetVoidCallback1(void * context) { + LzmaSDKObjCWriter * w = (__bridge LzmaSDKObjCWriter *)context; + if (w) return w->_passwordGetter ? NSStringToWideCharactersString(w->_passwordGetter()) : NULL; + return NULL; +} + +static void _LzmaSDKObjCWriterSetFloatCallback(void * context, float value) { + LzmaSDKObjCWriter * w = (__bridge LzmaSDKObjCWriter *)context; + id d = w ? w.delegate : nil; + if (d && [d respondsToSelector:@selector(onLzmaSDKObjCWriter:writeProgress:)]) { + if ([NSThread isMainThread]) [d onLzmaSDKObjCWriter:w writeProgress:value]; + else dispatch_async(dispatch_get_main_queue(), ^{ [d onLzmaSDKObjCWriter:w writeProgress:value]; }); + } +} + +- (NSError *) lastError { + LzmaSDKObjC::Error * error = _encoder ? _encoder->lastError() : NULL; + if (error) { + return [NSError errorWithDomain:kLzmaSDKObjCErrorDomain + code:(NSInteger)error->code + userInfo:@{ NSLocalizedDescriptionKey : [NSString stringWithUTF8String:error->description.Ptr() ? error->description.Ptr() : ""], + NSFilePathErrorKey : [NSString stringWithUTF8String:error->file.Ptr() ? error->file.Ptr() : ""], + @"line" : [NSNumber numberWithInt:error->line], + @"code" : [NSNumber numberWithLongLong:error->code], + NSLocalizedFailureReasonErrorKey : [NSString stringWithUTF8String:error->possibleReason.Ptr() ? error->possibleReason.Ptr() : ""]}]; + } + return nil; +} + +- (NSURL *) fileURL { + return _fileURL; +} + +#if defined(DEBUG) || defined(_DEBUG) +- (nullable id) init { + LZMASDK_DEBUG_ERR("Writer can't be initialized with `init`, use 'initWithFileURL' instead"); + NSAssert(0, @"Use 'initWithFileURL' instead"); + return nil; +} +#endif + +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL { + self = [super init]; + if (self) { + NSParameterAssert(fileURL); + + _fileType = LzmaSDKObjCDetectFileType(fileURL); + _fileURL = fileURL; + + _encoder = new LzmaSDKObjC::FileEncoder(); + NSAssert(_encoder, @"Can't create encoder object"); + } + return self; +} + +- (nonnull id) initWithFileURL:(nonnull NSURL *) fileURL andType:(LzmaSDKObjCFileType) type { + self = [super init]; + if (self) { + NSParameterAssert(fileURL); + + _fileURL = fileURL; + _fileType = type; + + _encoder = new LzmaSDKObjC::FileEncoder(); + NSAssert(_encoder, @"Can't create encoder object"); + } + return self; +} + +- (BOOL) openPath:(NSString *) path withError:(NSError **) error { + [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; + _encoder->context = (__bridge void *)self; + _encoder->getVoidCallback1 = _LzmaSDKObjCWriterGetVoidCallback1; + _encoder->setFloatCallback2 = _LzmaSDKObjCWriterSetFloatCallback; + if (_encoder->openFile([path UTF8String])) return YES; + + if (error) *error = self.lastError; + return NO; +} + +- (BOOL) open:(NSError * _Nullable * _Nullable) error { + if (!_encoder) { + if (error) *error = [NSError errorWithDomain:kLzmaSDKObjCErrorDomain + code:-1 + userInfo:@{ NSLocalizedDescriptionKey : kLzmaSDKObjCErrorDescrEncDecNotCreated }]; + return NO; + } + + if (!_encoder->prepare(_fileType)) { + if (error) *error = self.lastError; + return NO; + } + + if (!_fileURL) { + _encoder->setLastError(-1, __LINE__, __FILE__, "No file URL provided"); + if (error) *error = self.lastError; + return NO; + } + + NSString * path = [_fileURL path]; + if (path) { + if ([self openPath:path withError:error]) return YES; + } + + if (error) *error = self.lastError; + return NO; +} + +- (BOOL) write { + if (!_encoder) return NO; + _encoder->clearLastError(); + _encoder->encodeItems((__bridge void *)_items, (uint32_t)[_items count]); + return _encoder->lastError() ? NO : YES; +} + +- (BOOL) addData:(nonnull NSData *) data forPath:(nonnull NSString *) path { + if (!_encoder) return NO; + NSParameterAssert(data); + NSParameterAssert(path); + LzmaSDKObjCMutableItem * item = [[LzmaSDKObjCMutableItem alloc] init]; + NSAssert(item, @"Can't create item"); + [item setPath:path isDirectory:NO]; + item.fileData = data; + if (_items) [_items addObject:item]; + else _items = [NSMutableArray arrayWithObject:item]; + return YES; +} + +- (BOOL) addPath:(nonnull NSString *) aPath forPath:(nonnull NSString *) path { + if (!_encoder) return NO; + NSParameterAssert(aPath); + NSParameterAssert(path); + BOOL isDir = NO; + NSError * error = nil; + if ([[NSFileManager defaultManager] fileExistsAtPath:aPath isDirectory:&isDir]) { + if (isDir) { + NSArray * contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:aPath error:&error]; + if (error) return NO; + if (contents) { + for (NSString * subName in contents) { + NSString * aSubPath = [aPath stringByAppendingPathComponent:subName]; + NSString * subPath = [path stringByAppendingPathComponent:subName]; + if (aSubPath && subPath) [self addPath:aSubPath forPath:subPath]; + } + } + return YES; + } else { + NSDictionary * attribs = [[NSFileManager defaultManager] attributesOfItemAtPath:aPath error:&error]; + if (!attribs || error) return NO; + + NSNumber * number = [attribs objectForKey:NSFileSize]; + if (!number) return NO; + + LzmaSDKObjCMutableItem * item = [[LzmaSDKObjCMutableItem alloc] init]; + NSAssert(item, @"Can't create item"); + + [item setPath:path isDirectory:NO]; + item->_orgSize = (uint64_t)[number unsignedLongLongValue]; + item->_content = aPath; + NSDate * now = [NSDate date]; + NSDate * date = [attribs objectForKey:NSFileCreationDate]; + item.creationDate = date ? date : now; + date = [attribs objectForKey:NSFileModificationDate]; + item.modificationDate = date ? date : now; + item.accessDate = now; + + if (_items) [_items addObject:item]; + else _items = [NSMutableArray arrayWithObject:item]; + return YES; + } + } + return NO; +} + +- (LzmaSDKObjCMethod) method { + return _encoder ? (LzmaSDKObjCMethod)_encoder->method : (LzmaSDKObjCMethod)0; +} + +- (void) setMethod:(LzmaSDKObjCMethod) value { + if (_encoder) _encoder->method = (unsigned char)value; +} + +- (BOOL) solid { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_SOLID) ? YES : NO) : NO; +} + +- (void) setSolid:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_SOLID); +} + +- (unsigned char) compressionLevel { + return _encoder ? _encoder->compressionLevel : 0; +} + +- (void) setCompressionLevel:(unsigned char) level { + if (!_encoder) return; + if (level) _encoder->compressionLevel = (level > 9) ? 9 : level; + else _encoder->compressionLevel = 1; +} + +- (BOOL) compressHeader { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_COMPR_HDR) ? YES : NO) : NO; +} + +- (void) setCompressHeader:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_COMPR_HDR); +} + +- (BOOL) compressHeaderFull { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_COMPR_HDR_FULL) ? YES : NO) : NO; +} + +- (void) setCompressHeaderFull:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_COMPR_HDR_FULL); +} + +- (BOOL) encodeContent { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_ENC_CONTENT) ? YES : NO) : NO; +} + +- (void) setEncodeContent:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_ENC_CONTENT); +} + +- (BOOL) encodeHeader { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_ENC_HEADER) ? YES : NO) : NO; +} + +- (void) setEncodeHeader:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_ENC_HEADER); +} + +- (BOOL) writeCreationTime { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_WRITE_CTIME) ? YES : NO) : NO; +} + +- (void) setWriteCreationTime:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_WRITE_CTIME); +} + +- (BOOL) writeAccessTime { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_WRITE_ATIME) ? YES : NO) : NO; +} + +- (void) setWriteAccessTime:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_WRITE_ATIME); +} + +- (BOOL) writeModificationTime { + return _encoder ? (_encoder->settingsValue(LZMAOBJC_ENC_WRITE_MTIME) ? YES : NO) : NO; +} + +- (void) setWriteModificationTime:(BOOL) value { + if (_encoder) _encoder->setSettingsValue(value ? true : false, LZMAOBJC_ENC_WRITE_MTIME); +} + +- (void) dealloc { + if (_encoder) { + _encoder->context = NULL; + delete _encoder; + } + + _passwordGetter = nil; +} + +@end diff --git a/Provenance/Provenance-Info.plist b/Provenance/Provenance-Info.plist index c1a12ea8a0..6b57df58fa 100644 --- a/Provenance/Provenance-Info.plist +++ b/Provenance/Provenance-Info.plist @@ -16,6 +16,7 @@ LSItemContentTypes public.data + org.7-zip.7-zip-archive diff --git a/Provenance/Resources/systems.plist b/Provenance/Resources/systems.plist index 371fba7bd0..5830ce1042 100644 --- a/Provenance/Resources/systems.plist +++ b/Provenance/Resources/systems.plist @@ -2,6 +2,763 @@ + + PVBIOSNames + + + Description + PlayStation (JP) SCPH-5500 BIOS + MD5 + 8dd7d5296a650fac7319bce665a6a53c + Name + scph5500.bin + Size + 524288 + + + Description + PlayStation (NA) SCPH-5501 BIOS + MD5 + 490f666e1afb15b7362b406ed1cea246 + Name + scph5501.bin + Size + 524288 + + + Description + PlayStation (EU) SCPH-5502 BIOS + MD5 + 32736f17079d0b2b7024407c39bd3050 + Name + scph5502.bin + Size + 524288 + + + PVUsesCDs + + PVRequiresBIOS + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + + PVControlFrame + {{60,116},{60,60}} + + + PVControlType + PVButton + PVControlTitle + + PVControlFrame + {{60,4},{60,60}} + + + PVControlType + PVButton + PVControlTitle + + PVControlFrame + {{4,60},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Start + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Select + PVControlSize + {62,22} + + + PVControlType + PVLeftShoulderButton + PVControlTitle + L1 + PVControlSize + {62,22} + + + PVControlType + PVRightShoulderButton + PVControlTitle + R1 + PVControlSize + {62,22} + + + PVSupportedExtensions + + cue + + PVDatabaseID + 38 + PVSystemIdentifier + com.provenance.psx + PVShortSystemName + PSX + PVSystemName + Playstation + + + PVControlLayout + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + A + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + B + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVStartButton + PVControlTitle + Option 1 + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Option 2 + PVControlSize + {62,22} + + + PVSupportedExtensions + + lnx + + PVDatabaseID + 6 + PVRequiresBIOS + + PVBIOSNames + + + Description + Lynx boot ROM + MD5 + fcd403db69f54290b51035d82f835e7b + Name + lynxboot.img + Size + 512 + + + PVSystemIdentifier + com.provenance.lynx + PVShortSystemName + Lynx + PVSystemName + Atari Lynx + + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + B + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + A + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Option + PVControlSize + {62,22} + + + PVSupportedExtensions + + ngp + + PVDatabaseID + 36 + PVRequiresBIOS + + PVSystemIdentifier + com.provenance.ngp + PVShortSystemName + NGP + PVSystemName + NGK Neo Geo Pocket + + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + B + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + A + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Option + PVControlSize + {62,22} + + + PVSupportedExtensions + + ngc + ngpc + npc + + PVDatabaseID + 37 + PVRequiresBIOS + + PVSystemIdentifier + com.provenance.ngpc + PVShortSystemName + NGPC + PVSystemName + NGK Neo Geo Pocket Color + + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + A + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + B + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Start + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Select + PVControlSize + {62,22} + + + PVControlType + PVLeftShoulderButton + PVControlTitle + L + PVControlSize + {62,22} + + + PVControlType + PVRightShoulderButton + PVControlTitle + R + PVControlSize + {62,22} + + + PVSupportedExtensions + + vb + + PVDatabaseID + 27 + PVSystemIdentifier + com.provenance.vb + PVShortSystemName + Virtual Boy + PVSystemName + Nintendo Virtual Boy + + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + A + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + B + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVDPad + PVControlTitle + Y + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Start + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Sound + PVControlSize + {62,22} + + + PVSupportedExtensions + + ws + wsc + + PVDatabaseID + 9 + PVSystemIdentifier + com.provenance.ws + PVShortSystemName + WonderSwan + PVSystemName + Bandai WonderSwan + + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + II + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + I + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Run + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Select + PVControlSize + {62,22} + + + PVSupportedExtensions + + pce + + PVDatabaseID + 14 + PVSystemIdentifier + com.provenance.pce + PVShortSystemName + PCE + PVSystemName + NEC PC Engine/TurboGrafx-16 + + + PVUsesCDs + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {180, 180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + II + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + I + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Start + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Select + PVControlSize + {62,22} + + + PVControlType + PVLeftShoulderButton + PVControlTitle + L + PVControlSize + {62,22} + + + PVControlType + PVRightShoulderButton + PVControlTitle + R + PVControlSize + {62,22} + + + PVSupportedExtensions + + cue + + PVDatabaseID + 15 + PVSystemIdentifier + com.provenance.pcecd + PVShortSystemName + PCECD + PVSystemName + NEC PC Engine CD/TurboGrafx-CD + PVRequiresBIOS + + PVBIOSNames + + + Description + TurboGrafx-CD/PC Engine CD BIOS + MD5 + ff1a674273fe3540ccef576376407d1d + Name + syscard3.pce + Size + 262656 + + + + + PVUsesCDs + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {212,160} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + III + PVControlFrame + {{8,92},{60,60}} + + + PVControlType + PVButton + PVControlTitle + II + PVControlFrame + {{76,84},{60,60}} + + + PVControlType + PVButton + PVControlTitle + I + PVControlFrame + {{144,76},{60,60}} + + + PVControlType + PVButton + PVControlTitle + iV + PVControlFrame + {{8,24},{60,60}} + + + PVControlType + PVButton + PVControlTitle + V + PVControlFrame + {{76,16},{60,60}} + + + PVControlType + PVButton + PVControlTitle + VI + PVControlFrame + {{144,8},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Run + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Select + PVControlSize + {62,22} + + + PVSupportedExtensions + + cue + + PVDatabaseID + 16 + PVSystemIdentifier + com.provenance.pcfx + PVShortSystemName + PCFX + PVSystemName + NEC PC-FX + PVRequiresBIOS + + PVBIOSNames + + + Description + PC-FX BIOS + MD5 + 08e36edbea28a017f79f8d4f7ff9b6d7 + Name + pcfx.rom + Size + 1048576 + + + PVSystemName SegaCD @@ -17,9 +774,36 @@ PVBIOSNames - bios_CD_E.bin - bios_CD_U.bin - bios_CD_J.bin + + Description + Mega-CD Model 1 (EU 921027) BIOS 1.00 + MD5 + e66fa1dc5820d254611fdcdba0662372 + Name + bios_CD_E.bin + Size + 131072 + + + Description + Sega CD Model 1 (US 921011) BIOS 1.10 + MD5 + 2efd74e3232ff260e371b99f84024f7f + Name + bios_CD_U.bin + Size + 131072 + + + Description + Mega-CD Model 1 (JP 911217) BIOS 1.00p + MD5 + 278a9397d192149e84e820ac621a8edd + Name + bios_CD_J.bin + Size + 131072 + PVSupportedExtensions @@ -688,7 +1472,16 @@ PVBIOSNames - disksys.rom + + Description + Disk System BIOS + MD5 + ca30b50f880eb660a320674ed365ef7a + Name + disksys.rom + Size + 8192 + PVSupportedExtensions @@ -1010,5 +1803,181 @@ + + PVBIOSNames + + + Description + Atari 5200 BIOS + MD5 + 281f20ea4320404ec820fb7ec0693b38 + Name + 5200.rom + Size + 2048 + + + PVSystemName + Atari 5200 + PVRequiresBIOS + + PVShortSystemName + 5200 + PVSystemIdentifier + com.provenance.5200 + PVDatabaseID + 4 + PVSupportedExtensions + + a52 + + PVControlLayout + + + PVControlType + PVLeftShoulderButton + PVControlTitle + Reset + PVControlSize + {62,22} + + + PVControlType + PVButtonGroup + PVControlSize + {180,180} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + Fire 2 + PVControlFrame + {{116,60},{60,60}} + + + PVControlType + PVButton + PVControlTitle + Fire 1 + PVControlFrame + {{60,116},{60,60}} + + + + + PVControlType + PVStartButton + PVControlTitle + Start + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Pause + PVControlSize + {62,22} + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + + + PVRequiresBIOS + + PVBIOSNames + + + Description + Pokémon mini BIOS + MD5 + 1e4fb124a3a886865acb574f388c803d + Name + bios.min + Optional + + Size + 4096 + + + PVSystemName + Pokémon mini + PVShortSystemName + Pokémon mini + PVSystemIdentifier + com.provenance.pokemonmini + PVDatabaseID + 0 + PVSupportedExtensions + + min + + PVControlLayout + + + PVControlType + PVButtonGroup + PVControlSize + {212,160} + PVGroupedButtons + + + PVControlType + PVButton + PVControlTitle + A + PVControlFrame + {{8,92},{60,60}} + + + PVControlType + PVButton + PVControlTitle + B + PVControlFrame + {{76,84},{60,60}} + + + PVControlType + PVButton + PVControlTitle + C + PVControlFrame + {{144,76},{60,60}} + + + + + PVControlType + PVDPad + PVControlSize + {180,180} + + + PVControlType + PVStartButton + PVControlTitle + Power + PVControlSize + {62,22} + + + PVControlType + PVSelectButton + PVControlTitle + Shake + PVControlSize + {62,22} + + + diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServer.h b/Provenance/http/GCDWebServer/Core/GCDWebServer.h index b446035ca5..ca0f5a6c59 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServer.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServer.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -52,7 +52,7 @@ typedef GCDWebServerRequest* (^GCDWebServerMatchBlock)(NSString* requestMethod, * recommended to return a GCDWebServerErrorResponse on error so more useful * information can be returned to the client. */ -typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(GCDWebServerRequest* request); +typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request); /** * The GCDWebServerAsynchronousProcessBlock works like the GCDWebServerProcessBlock @@ -65,7 +65,7 @@ typedef GCDWebServerResponse* (^GCDWebServerProcessBlock)(GCDWebServerRequest* r * useful information can be returned to the client. */ typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* response); -typedef void (^GCDWebServerAsyncProcessBlock)(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock); +typedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock); /** * The port used by the GCDWebServer (NSNumber / NSUInteger). @@ -90,14 +90,26 @@ extern NSString* const GCDWebServerOption_BonjourName; */ extern NSString* const GCDWebServerOption_BonjourType; +/** + * Request a port mapping in the NAT gateway (NSNumber / BOOL). + * + * This uses the DNSService API under the hood which supports IPv4 mappings only. + * + * The default value is NO. + * + * @warning The external port set up by the NAT gateway may be different than + * the one used by the GCDWebServer. + */ +extern NSString* const GCDWebServerOption_RequestNATPortMapping; + /** * Only accept HTTP requests coming from localhost i.e. not from the outside * network (NSNumber / BOOL). * * The default value is NO. * - * @warning Bonjour should be disabled if using this option since the server - * will not be reachable from the outside network anyway. + * @warning Bonjour and NAT port mapping should be disabled if using this option + * since the server will not be reachable from the outside network anyway. */ extern NSString* const GCDWebServerOption_BindToLocalhost; @@ -164,6 +176,15 @@ extern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET; */ extern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval; +/** + * Set the dispatch queue priority on which server connection will be + * run (NSNumber / long). + * + * + * The default value is DISPATCH_QUEUE_PRIORITY_DEFAULT. + */ +extern NSString* const GCDWebServerOption_DispatchQueuePriority; + #if TARGET_OS_IPHONE /** @@ -213,9 +234,21 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; /** * This method is called after the Bonjour registration for the server has * successfully completed. + * + * Use the "bonjourServerURL" property to retrieve the Bonjour address of the + * server. */ - (void)webServerDidCompleteBonjourRegistration:(GCDWebServer*)server; +/** + * This method is called after the NAT port mapping for the server has been + * updated. + * + * Use the "publicServerURL" property to retrieve the public address of the + * server. + */ +- (void)webServerDidUpdateNATPortMapping:(GCDWebServer*)server; + /** * This method is called when the first GCDWebServerConnection is opened by the * server to serve a series of HTTP requests. @@ -362,6 +395,14 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; */ @property(nonatomic, readonly) NSURL* bonjourServerURL; +/** + * Returns the server's public URL. + * + * @warning This property is only valid if the server is running and NAT port + * mapping is active. + */ +@property(nonatomic, readonly) NSURL* publicServerURL; + /** * Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS) * using the default Bonjour name. @@ -505,12 +546,10 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * GWS_LOG_INFO(...) * GWS_LOG_WARNING(...) * GWS_LOG_ERROR(...) - * GWS_LOG_EXCEPTION(__EXCEPTION__) * - * IMPORTANT: Except for GWS_LOG_EXCEPTION() which gets passed an NSException, - * these macros must behave like NSLog(). Furthermore the GWS_LOG_DEBUG() macro - * should not do anything unless the preprocessor constant "DEBUG" evaluates to - * non-zero. + * IMPORTANT: These macros must behave like NSLog(). Furthermore the GWS_LOG_DEBUG() + * macro should not do anything unless the preprocessor constant "DEBUG" evaluates + * to non-zero. * * The logging methods below send log messages to the same logging facility * used by GCDWebServer. They can be used for consistency wherever you interact @@ -530,34 +569,28 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; * INFO = 2 * WARNING = 3 * ERROR = 4 - * EXCEPTION = 5 */ + (void)setLogLevel:(int)level; /** * Logs a message to the logging facility at the VERBOSE level. */ -- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the INFO level. */ -- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the WARNING level. */ -- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); +- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); /** * Logs a message to the logging facility at the ERROR level. */ -- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); - -/** - * Logs an exception to the logging facility at the EXCEPTION level. - */ -- (void)logException:(NSException*)exception; +- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2); @end diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServer.m b/Provenance/http/GCDWebServer/Core/GCDWebServer.m index 92475fb71c..7e115d36b0 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServer.m +++ b/Provenance/http/GCDWebServer/Core/GCDWebServer.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -38,6 +38,7 @@ #endif #endif #import +#import #import "GCDWebServerPrivate.h" @@ -47,9 +48,12 @@ #define kDefaultPort 8080 #endif +#define kBonjourResolutionTimeout 5.0 + NSString* const GCDWebServerOption_Port = @"Port"; NSString* const GCDWebServerOption_BonjourName = @"BonjourName"; NSString* const GCDWebServerOption_BonjourType = @"BonjourType"; +NSString* const GCDWebServerOption_RequestNATPortMapping = @"RequestNATPortMapping"; NSString* const GCDWebServerOption_BindToLocalhost = @"BindToLocalhost"; NSString* const GCDWebServerOption_MaxPendingConnections = @"MaxPendingConnections"; NSString* const GCDWebServerOption_ServerName = @"ServerName"; @@ -59,6 +63,7 @@ NSString* const GCDWebServerOption_ConnectionClass = @"ConnectionClass"; NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET = @"AutomaticallyMapHEADToGET"; NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval = @"ConnectedStateCoalescingInterval"; +NSString* const GCDWebServerOption_DispatchQueuePriority = @"DispatchQueuePriority"; #if TARGET_OS_IPHONE NSString* const GCDWebServerOption_AutomaticallySuspendInBackground = @"AutomaticallySuspendInBackground"; #endif @@ -87,7 +92,7 @@ #ifdef __GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__ void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) { - static const char* levelNames[] = {"DEBUG", "VERBOSE", "INFO", "WARNING", "ERROR", "EXCEPTION"}; + static const char* levelNames[] = {"DEBUG", "VERBOSE", "INFO", "WARNING", "ERROR"}; static int enableLogging = -1; if (enableLogging < 0) { enableLogging = (isatty(STDERR_FILENO) ? 1 : 0); @@ -136,7 +141,7 @@ @interface GCDWebServerHandler () { @implementation GCDWebServerHandler -@synthesize matchBlock=_matchBlock, asyncProcessBlock=_asyncProcessBlock; +@synthesize matchBlock = _matchBlock, asyncProcessBlock = _asyncProcessBlock; - (id)initWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock { if ((self = [super init])) { @@ -157,7 +162,7 @@ @interface GCDWebServer () { NSInteger _activeConnections; // Accessed through _syncQueue only BOOL _connected; // Accessed on main thread only CFRunLoopTimerRef _disconnectTimer; // Accessed on main thread only - + NSDictionary* _options; NSString* _serverName; NSString* _authenticationRealm; @@ -166,11 +171,17 @@ @interface GCDWebServer () { Class _connectionClass; BOOL _mapHEADToGET; CFTimeInterval _disconnectDelay; + dispatch_queue_priority_t _dispatchQueuePriority; NSUInteger _port; dispatch_source_t _source4; dispatch_source_t _source6; CFNetServiceRef _registrationService; CFNetServiceRef _resolutionService; + DNSServiceRef _dnsService; + CFSocketRef _dnsSocket; + CFRunLoopSourceRef _dnsSource; + NSString* _dnsAddress; + NSUInteger _dnsPort; BOOL _bindToLocalhost; #if TARGET_OS_IPHONE BOOL _suspendInBackground; @@ -184,9 +195,9 @@ @interface GCDWebServer () { @implementation GCDWebServer -@synthesize delegate=_delegate, handlers=_handlers, port=_port, serverName=_serverName, authenticationRealm=_authenticationRealm, - authenticationBasicAccounts=_authenticationBasicAccounts, authenticationDigestAccounts=_authenticationDigestAccounts, - shouldAutomaticallyMapHEADToGET=_mapHEADToGET; +@synthesize delegate = _delegate, handlers = _handlers, port = _port, serverName = _serverName, authenticationRealm = _authenticationRealm, + authenticationBasicAccounts = _authenticationBasicAccounts, authenticationDigestAccounts = _authenticationDigestAccounts, + shouldAutomaticallyMapHEADToGET = _mapHEADToGET, dispatchQueuePriority = _dispatchQueuePriority; + (void)initialize { GCDWebServerInitializeFunctions(); @@ -209,7 +220,7 @@ - (void)dealloc { GWS_DCHECK(_activeConnections == 0); GWS_DCHECK(_options == nil); // The server can never be dealloc'ed while running because of the retain-cycle with the dispatch source GWS_DCHECK(_disconnectTimer == NULL); // The server can never be dealloc'ed while the disconnect timer is pending because of the retain-cycle - + #if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE dispatch_release(_sourceGroup); dispatch_release(_syncQueue); @@ -224,10 +235,10 @@ - (void)_startBackgroundTask { if (_backgroundTask == UIBackgroundTaskInvalid) { GWS_LOG_DEBUG(@"Did start background task"); _backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - + GWS_LOG_WARNING(@"Application is being suspended while %@ is still connected", [self class]); [self _endBackgroundTask]; - + }]; } else { GWS_DNOT_REACHED(); @@ -242,13 +253,13 @@ - (void)_didConnect { GWS_DCHECK(_connected == NO); _connected = YES; GWS_LOG_DEBUG(@"Did connect"); - + #if TARGET_OS_IPHONE if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) { [self _startBackgroundTask]; } #endif - + if ([_delegate respondsToSelector:@selector(webServerDidConnect:)]) { [_delegate webServerDidConnect:self]; } @@ -256,7 +267,7 @@ - (void)_didConnect { - (void)willStartConnection:(GCDWebServerConnection*)connection { dispatch_sync(_syncQueue, ^{ - + GWS_DCHECK(_activeConnections >= 0); if (_activeConnections == 0) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -271,7 +282,7 @@ - (void)willStartConnection:(GCDWebServerConnection*)connection { }); } _activeConnections += 1; - + }); } @@ -298,11 +309,11 @@ - (void)_didDisconnect { GWS_DCHECK(_connected == YES); _connected = NO; GWS_LOG_DEBUG(@"Did disconnect"); - + #if TARGET_OS_IPHONE [self _endBackgroundTask]; #endif - + if ([_delegate respondsToSelector:@selector(webServerDidDisconnect:)]) { [_delegate webServerDidDisconnect:self]; } @@ -345,9 +356,10 @@ - (NSString*)bonjourType { } - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock { - [self addHandlerWithMatchBlock:matchBlock asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(processBlock(request)); - }]; + [self addHandlerWithMatchBlock:matchBlock + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(processBlock(request)); + }]; } - (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock { @@ -369,7 +381,10 @@ static void _NetServiceRegisterCallBack(CFNetServiceRef service, CFStreamError* } else { GCDWebServer* server = (__bridge GCDWebServer*)info; GWS_LOG_VERBOSE(@"Bonjour registration complete for %@", [server class]); - CFNetServiceResolveWithTimeout(server->_resolutionService, 1.0, NULL); + if (!CFNetServiceResolveWithTimeout(server->_resolutionService, kBonjourResolutionTimeout, NULL)) { + GWS_LOG_ERROR(@"Failed starting Bonjour resolution"); + GWS_DNOT_REACHED(); + } } } } @@ -383,7 +398,7 @@ static void _NetServiceResolveCallBack(CFNetServiceRef service, CFStreamError* e } } else { GCDWebServer* server = (__bridge GCDWebServer*)info; - GWS_LOG_INFO(@"%@ now reachable at %@", [server class], server.bonjourServerURL); + GWS_LOG_INFO(@"%@ now locally reachable at %@", [server class], server.bonjourServerURL); if ([server.delegate respondsToSelector:@selector(webServerDidCompleteBonjourRegistration:)]) { [server.delegate webServerDidCompleteBonjourRegistration:server]; } @@ -391,6 +406,41 @@ static void _NetServiceResolveCallBack(CFNetServiceRef service, CFStreamError* e } } +static void _DNSServiceCallBack(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, uint32_t externalAddress, DNSServiceProtocol protocol, uint16_t internalPort, uint16_t externalPort, uint32_t ttl, void* context) { + GWS_DCHECK([NSThread isMainThread]); + @autoreleasepool { + GCDWebServer* server = (__bridge GCDWebServer*)context; + if ((errorCode == kDNSServiceErr_NoError) || (errorCode == kDNSServiceErr_DoubleNAT)) { + struct sockaddr_in addr4; + bzero(&addr4, sizeof(addr4)); + addr4.sin_len = sizeof(addr4); + addr4.sin_family = AF_INET; + addr4.sin_addr.s_addr = externalAddress; // Already in network byte order + server->_dnsAddress = GCDWebServerStringFromSockAddr((const struct sockaddr*)&addr4, NO); + server->_dnsPort = ntohs(externalPort); + GWS_LOG_INFO(@"%@ now publicly reachable at %@", [server class], server.publicServerURL); + } else { + GWS_LOG_ERROR(@"DNS service error %i", errorCode); + server->_dnsAddress = nil; + server->_dnsPort = 0; + } + if ([server.delegate respondsToSelector:@selector(webServerDidUpdateNATPortMapping:)]) { + [server.delegate webServerDidUpdateNATPortMapping:server]; + } + } +} + +static void _SocketCallBack(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void* data, void* info) { + GWS_DCHECK([NSThread isMainThread]); + @autoreleasepool { + GCDWebServer* server = (__bridge GCDWebServer*)info; + DNSServiceErrorType status = DNSServiceProcessResult(server->_dnsService); + if (status != kDNSServiceErr_NoError) { + GWS_LOG_ERROR(@"DNS service error %i", status); + } + } +} + static inline id _GetOption(NSDictionary* options, NSString* key, id defaultValue) { id value = [options objectForKey:key]; return value ? value : defaultValue; @@ -415,7 +465,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6 if (listeningSocket > 0) { int yes = 1; setsockopt(listeningSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); - + if (bind(listeningSocket, address, length) == 0) { if (listen(listeningSocket, (int)maxPendingConnections) == 0) { GWS_LOG_DEBUG(@"Did open %s listening socket %i", useIPv6 ? "IPv6" : "IPv4", listeningSocket); @@ -434,7 +484,7 @@ - (int)_createListeningSocket:(BOOL)useIPv6 GWS_LOG_ERROR(@"Failed binding %s listening socket: %s (%i)", useIPv6 ? "IPv6" : "IPv4", strerror(errno), errno); close(listeningSocket); } - + } else { if (error) { *error = GCDWebServerMakePosixError(errno); @@ -446,9 +496,9 @@ - (int)_createListeningSocket:(BOOL)useIPv6 - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSocket isIPv6:(BOOL)isIPv6 { dispatch_group_enter(_sourceGroup); - dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, kGCDWebServerGCDQueue); + dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, dispatch_get_global_queue(_dispatchQueuePriority, 0)); dispatch_source_set_cancel_handler(source, ^{ - + @autoreleasepool { int result = close(listeningSocket); if (result != 0) { @@ -458,17 +508,17 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock } } dispatch_group_leave(_sourceGroup); - + }); dispatch_source_set_event_handler(source, ^{ - + @autoreleasepool { struct sockaddr_storage remoteSockAddr; socklen_t remoteAddrLen = sizeof(remoteSockAddr); int socket = accept(listeningSocket, (struct sockaddr*)&remoteSockAddr, &remoteAddrLen); if (socket > 0) { NSData* remoteAddress = [NSData dataWithBytes:&remoteSockAddr length:remoteAddrLen]; - + struct sockaddr_storage localSockAddr; socklen_t localAddrLen = sizeof(localSockAddr); NSData* localAddress = nil; @@ -478,28 +528,28 @@ - (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSock } else { GWS_DNOT_REACHED(); } - + int noSigPipe = 1; setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe)); // Make sure this socket cannot generate SIG_PIPE - + GCDWebServerConnection* connection = [[_connectionClass alloc] initWithServer:self localAddress:localAddress remoteAddress:remoteAddress socket:socket]; // Connection will automatically retain itself while opened [connection self]; // Prevent compiler from complaining about unused variable / useless statement } else { GWS_LOG_ERROR(@"Failed accepting %s socket: %s (%i)", isIPv6 ? "IPv6" : "IPv4", strerror(errno), errno); } } - + }); return source; } - (BOOL)_start:(NSError**)error { GWS_DCHECK(_source4 == NULL); - + NSUInteger port = [_GetOption(_options, GCDWebServerOption_Port, @0) unsignedIntegerValue]; BOOL bindToLocalhost = [_GetOption(_options, GCDWebServerOption_BindToLocalhost, @NO) boolValue]; NSUInteger maxPendingConnections = [_GetOption(_options, GCDWebServerOption_MaxPendingConnections, @16) unsignedIntegerValue]; - + struct sockaddr_in addr4; bzero(&addr4, sizeof(addr4)); addr4.sin_len = sizeof(addr4); @@ -519,7 +569,7 @@ - (BOOL)_start:(NSError**)error { GWS_LOG_ERROR(@"Failed retrieving socket address: %s (%i)", strerror(errno), errno); } } - + struct sockaddr_in6 addr6; bzero(&addr6, sizeof(addr6)); addr6.sin6_len = sizeof(addr6); @@ -531,7 +581,7 @@ - (BOOL)_start:(NSError**)error { close(listeningSocket4); return NO; } - + _serverName = [_GetOption(_options, GCDWebServerOption_ServerName, NSStringFromClass([self class])) copy]; NSString* authenticationMethod = _GetOption(_options, GCDWebServerOption_AuthenticationMethod, nil); if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_Basic]) { @@ -552,34 +602,60 @@ - (BOOL)_start:(NSError**)error { _connectionClass = _GetOption(_options, GCDWebServerOption_ConnectionClass, [GCDWebServerConnection class]); _mapHEADToGET = [_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue]; _disconnectDelay = [_GetOption(_options, GCDWebServerOption_ConnectedStateCoalescingInterval, @1.0) doubleValue]; - + _dispatchQueuePriority = [_GetOption(_options, GCDWebServerOption_DispatchQueuePriority, @(DISPATCH_QUEUE_PRIORITY_DEFAULT)) longValue]; + _source4 = [self _createDispatchSourceWithListeningSocket:listeningSocket4 isIPv6:NO]; _source6 = [self _createDispatchSourceWithListeningSocket:listeningSocket6 isIPv6:YES]; _port = port; _bindToLocalhost = bindToLocalhost; - + NSString* bonjourName = _GetOption(_options, GCDWebServerOption_BonjourName, nil); NSString* bonjourType = _GetOption(_options, GCDWebServerOption_BonjourType, @"_http._tcp"); if (bonjourName) { _registrationService = CFNetServiceCreate(kCFAllocatorDefault, CFSTR("local."), (__bridge CFStringRef)bonjourType, (__bridge CFStringRef)(bonjourName.length ? bonjourName : _serverName), (SInt32)_port); if (_registrationService) { CFNetServiceClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL}; - + CFNetServiceSetClient(_registrationService, _NetServiceRegisterCallBack, &context); CFNetServiceScheduleWithRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes); CFStreamError streamError = {0}; CFNetServiceRegisterWithOptions(_registrationService, 0, &streamError); - + _resolutionService = CFNetServiceCreateCopy(kCFAllocatorDefault, _registrationService); if (_resolutionService) { CFNetServiceSetClient(_resolutionService, _NetServiceResolveCallBack, &context); CFNetServiceScheduleWithRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes); + } else { + GWS_LOG_ERROR(@"Failed creating CFNetService for resolution"); + } + } else { + GWS_LOG_ERROR(@"Failed creating CFNetService for registration"); + } + } + + if ([_GetOption(_options, GCDWebServerOption_RequestNATPortMapping, @NO) boolValue]) { + DNSServiceErrorType status = DNSServiceNATPortMappingCreate(&_dnsService, 0, 0, kDNSServiceProtocol_TCP, htons(port), htons(port), 0, _DNSServiceCallBack, (__bridge void*)self); + if (status == kDNSServiceErr_NoError) { + CFSocketContext context = {0, (__bridge void*)self, NULL, NULL, NULL}; + _dnsSocket = CFSocketCreateWithNative(kCFAllocatorDefault, DNSServiceRefSockFD(_dnsService), kCFSocketReadCallBack, _SocketCallBack, &context); + if (_dnsSocket) { + CFSocketSetSocketFlags(_dnsSocket, CFSocketGetSocketFlags(_dnsSocket) & ~kCFSocketCloseOnInvalidate); + _dnsSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _dnsSocket, 0); + if (_dnsSource) { + CFRunLoopAddSource(CFRunLoopGetMain(), _dnsSource, kCFRunLoopCommonModes); + } else { + GWS_LOG_ERROR(@"Failed creating CFRunLoopSource"); + GWS_DNOT_REACHED(); + } + } else { + GWS_LOG_ERROR(@"Failed creating CFSocket"); + GWS_DNOT_REACHED(); } } else { - GWS_LOG_ERROR(@"Failed creating CFNetService"); + GWS_LOG_ERROR(@"Failed creating NAT port mapping (%i)", status); } } - + dispatch_resume(_source4); dispatch_resume(_source6); GWS_LOG_INFO(@"%@ started on port %i and reachable at %@", [self class], (int)_port, self.serverURL); @@ -588,13 +664,29 @@ - (BOOL)_start:(NSError**)error { [_delegate webServerDidStart:self]; }); } - + return YES; } - (void)_stop { GWS_DCHECK(_source4 != NULL); - + + if (_dnsService) { + _dnsAddress = nil; + _dnsPort = 0; + if (_dnsSource) { + CFRunLoopSourceInvalidate(_dnsSource); + CFRelease(_dnsSource); + _dnsSource = NULL; + } + if (_dnsSocket) { + CFRelease(_dnsSocket); + _dnsSocket = NULL; + } + DNSServiceRefDeallocate(_dnsService); + _dnsService = NULL; + } + if (_registrationService) { if (_resolutionService) { CFNetServiceUnscheduleFromRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes); @@ -609,7 +701,7 @@ - (void)_stop { CFRelease(_registrationService); _registrationService = NULL; } - + dispatch_source_cancel(_source6); dispatch_source_cancel(_source4); dispatch_group_wait(_sourceGroup, DISPATCH_TIME_FOREVER); // Wait until the cancellation handlers have been called which guarantees the listening sockets are closed @@ -623,12 +715,12 @@ - (void)_stop { _source4 = NULL; _port = 0; _bindToLocalhost = NO; - + _serverName = nil; _authenticationRealm = nil; _authenticationBasicAccounts = nil; _authenticationDigestAccounts = nil; - + dispatch_async(dispatch_get_main_queue(), ^{ if (_disconnectTimer) { CFRunLoopTimerInvalidate(_disconnectTimer); @@ -637,7 +729,7 @@ - (void)_stop { [self _didDisconnect]; } }); - + GWS_LOG_INFO(@"%@ stopped", [self class]); if ([_delegate respondsToSelector:@selector(webServerDidStop:)]) { dispatch_async(dispatch_get_main_queue(), ^{ @@ -746,6 +838,17 @@ - (NSURL*)bonjourServerURL { return nil; } +- (NSURL*)publicServerURL { + if (_source4 && _dnsService && _dnsAddress && _dnsPort) { + if (_dnsPort != 80) { + return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%i/", _dnsAddress, (int)_dnsPort]]; + } else { + return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@/", _dnsAddress]]; + } + } + return nil; +} + - (BOOL)start { return [self startWithPort:kDefaultPort bonjourName:@""]; } @@ -794,32 +897,38 @@ - (BOOL)runWithOptions:(NSDictionary*)options error:(NSError**)error { @implementation GCDWebServer (Handlers) - (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addDefaultHandlerForMethod:method requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addDefaultHandlerForMethod:method + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addHandlerForMethod:method path:path requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addHandlerForMethod:method + path:path + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { if ([path hasPrefix:@"/"] && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } @@ -827,24 +936,28 @@ - (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass: return nil; } return [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } else { GWS_DNOT_REACHED(); } } - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block { - [self addHandlerForMethod:method pathRegex:regex requestClass:aClass asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { - completionBlock(block(request)); - }]; + [self addHandlerForMethod:method + pathRegex:regex + requestClass:aClass + asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) { + completionBlock(block(request)); + }]; } - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block { NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:NULL]; if (expression && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) { - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:method]) { return nil; } @@ -858,15 +971,21 @@ - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex request for (NSTextCheckingResult* result in matches) { // Start at 1; index 0 is the whole string for (NSUInteger i = 1; i < result.numberOfRanges; i++) { - [captures addObject:[urlPath substringWithRange:[result rangeAtIndex:i]]]; + NSRange range = [result rangeAtIndex:i]; + // range is {NSNotFound, 0} "if one of the capture groups did not participate in this particular match" + // see discussion in -[NSRegularExpression firstMatchInString:options:range:] + if (range.location != NSNotFound) { + [captures addObject:[urlPath substringWithRange:range]]; + } } } GCDWebServerRequest* request = [[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; [request setAttribute:captures forKey:GCDWebServerRequestAttribute_RegexCaptures]; return request; - - } asyncProcessBlock:block]; + + } + asyncProcessBlock:block]; } else { GWS_DNOT_REACHED(); } @@ -877,29 +996,35 @@ - (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex request @implementation GCDWebServer (GETHandlers) - (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge { - [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType]; - response.cacheControlMaxAge = cacheAge; - return response; - - }]; + [self addHandlerForMethod:@"GET" + path:path + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType]; + response.cacheControlMaxAge = cacheAge; + return response; + + }]; } - (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests { - [self addHandlerForMethod:@"GET" path:path requestClass:[GCDWebServerRequest class] processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = nil; - if (allowRangeRequests) { - response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment]; - [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; - } else { - response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment]; - } - response.cacheControlMaxAge = cacheAge; - return response; - - }]; + [self addHandlerForMethod:@"GET" + path:path + requestClass:[GCDWebServerRequest class] + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = nil; + if (allowRangeRequests) { + response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment]; + [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + } else { + response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment]; + } + response.cacheControlMaxAge = cacheAge; + return response; + + }]; } - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { @@ -914,9 +1039,10 @@ - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { for (NSString* file in enumerator) { if (![file hasPrefix:@"."]) { NSString* type = [[enumerator fileAttributes] objectForKey:NSFileType]; - NSString* escapedFile = nil; - escapedFile = [file stringByAddingPercentEncodingWithAllowedCharacters:[[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?%#[]"] invertedSet]]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSString* escapedFile = [file stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +#pragma clang diagnostic pop GWS_DCHECK(escapedFile); if ([type isEqualToString:NSFileTypeRegular]) { [html appendFormat:@"
  • %@
  • \n", escapedFile, file]; @@ -934,8 +1060,8 @@ - (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path { - (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests { if ([basePath hasPrefix:@"/"] && [basePath hasSuffix:@"/"]) { GCDWebServer* __unsafe_unretained server = self; - [self addHandlerWithMatchBlock:^GCDWebServerRequest *(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { - + [self addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary* requestHeaders, NSString* urlPath, NSDictionary* urlQuery) { + if (![requestMethod isEqualToString:@"GET"]) { return nil; } @@ -943,39 +1069,40 @@ - (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)di return nil; } return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery]; - - } processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) { - - GCDWebServerResponse* response = nil; - NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]]; - NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; - if (fileType) { - if ([fileType isEqualToString:NSFileTypeDirectory]) { - if (indexFilename) { - NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename]; - NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType]; - if ([indexType isEqualToString:NSFileTypeRegular]) { - return [GCDWebServerFileResponse responseWithFile:indexPath]; + + } + processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) { + + GCDWebServerResponse* response = nil; + NSString* filePath = [directoryPath stringByAppendingPathComponent:[request.path substringFromIndex:basePath.length]]; + NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType]; + if (fileType) { + if ([fileType isEqualToString:NSFileTypeDirectory]) { + if (indexFilename) { + NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename]; + NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType]; + if ([indexType isEqualToString:NSFileTypeRegular]) { + return [GCDWebServerFileResponse responseWithFile:indexPath]; + } + } + response = [server _responseWithContentsOfDirectory:filePath]; + } else if ([fileType isEqualToString:NSFileTypeRegular]) { + if (allowRangeRequests) { + response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; + [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + } else { + response = [GCDWebServerFileResponse responseWithFile:filePath]; + } } } - response = [server _responseWithContentsOfDirectory:filePath]; - } else if ([fileType isEqualToString:NSFileTypeRegular]) { - if (allowRangeRequests) { - response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange]; - [response setValue:@"bytes" forAdditionalHeader:@"Accept-Ranges"]; + if (response) { + response.cacheControlMaxAge = cacheAge; } else { - response = [GCDWebServerFileResponse responseWithFile:filePath]; + response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; } - } - } - if (response) { - response.cacheControlMaxAge = cacheAge; - } else { - response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound]; - } - return response; - - }]; + return response; + + }]; } else { GWS_DNOT_REACHED(); } @@ -1023,10 +1150,6 @@ - (void)logError:(NSString*)format, ... { va_end(arguments); } -- (void)logException:(NSException*)exception { - GWS_LOG_EXCEPTION(exception); -} - @end #ifdef __GCDWEBSERVER_ENABLE_TESTING__ @@ -1100,11 +1223,11 @@ static void _LogResult(NSString* format, ...) { - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)path { GWS_DCHECK([NSThread isMainThread]); - NSArray* ignoredHeaders = @[@"Date", @"Etag"]; // Dates are always different by definition and ETags depend on file system node IDs + NSArray* ignoredHeaders = @[ @"Date", @"Etag" ]; // Dates are always different by definition and ETags depend on file system node IDs NSInteger result = -1; if ([self startWithOptions:options error:NULL]) { _ExecuteMainThreadRunLoopSources(); - + result = 0; NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL]; for (NSString* requestFile in files) { @@ -1126,19 +1249,19 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p if ([responseFile hasPrefix:prefix] && [responseFile hasSuffix:@".response"]) { NSData* responseData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:responseFile]]; if (responseData) { - CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO); + CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO); if (expectedResponse) { CFHTTPMessageRef actualResponse = _CreateHTTPMessageFromPerformingRequest(requestData, self.port); if (actualResponse) { success = YES; - + CFIndex expectedStatusCode = CFHTTPMessageGetResponseStatusCode(expectedResponse); CFIndex actualStatusCode = CFHTTPMessageGetResponseStatusCode(actualResponse); if (actualStatusCode != expectedStatusCode) { _LogResult(@" Status code not matching:\n Expected: %i\n Actual: %i", (int)expectedStatusCode, (int)actualStatusCode); success = NO; } - + NSDictionary* expectedHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(expectedResponse)); NSDictionary* actualHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(actualResponse)); for (NSString* expectedHeader in expectedHeaders) { @@ -1158,7 +1281,7 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p success = NO; } } - + NSString* expectedContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(expectedResponse, CFSTR("Content-Length"))); NSData* expectedBody = CFBridgingRelease(CFHTTPMessageCopyBody(expectedResponse)); NSString* actualContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(actualResponse, CFSTR("Content-Length"))); @@ -1177,14 +1300,14 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p if ([expectedBody writeToFile:expectedPath atomically:YES] && [actualBody writeToFile:actualPath atomically:YES]) { NSTask* task = [[NSTask alloc] init]; [task setLaunchPath:@"/usr/bin/opendiff"]; - [task setArguments:@[expectedPath, actualPath]]; + [task setArguments:@[ expectedPath, actualPath ]]; [task launch]; } } #endif #endif } - + CFRelease(actualResponse); } CFRelease(expectedResponse); @@ -1207,9 +1330,9 @@ - (NSInteger)runTestsWithOptions:(NSDictionary*)options inDirectory:(NSString*)p } _ExecuteMainThreadRunLoopSources(); } - + [self stop]; - + _ExecuteMainThreadRunLoopSources(); } return result; diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.h b/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.h index 8e4aaf5dd6..d353c8b961 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.m b/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.m index 40911facab..e3e21f464f 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.m +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerConnection.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -66,14 +66,14 @@ @interface GCDWebServerConnection () { NSUInteger _bytesRead; NSUInteger _bytesWritten; BOOL _virtualHEAD; - + CFHTTPMessageRef _requestMessage; GCDWebServerRequest* _request; GCDWebServerHandler* _handler; CFHTTPMessageRef _responseMessage; GCDWebServerResponse* _response; NSInteger _statusCode; - + BOOL _opened; #ifdef __GCDWEBSERVER_ENABLE_TESTING__ NSUInteger _connectionIndex; @@ -88,8 +88,8 @@ @interface GCDWebServerConnection () { @implementation GCDWebServerConnection (Read) - (void)_readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block { - dispatch_read(_socket, length, kGCDWebServerGCDQueue, ^(dispatch_data_t buffer, int error) { - + dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) { + @autoreleasepool { if (error == 0) { size_t size = dispatch_data_get_size(buffer); @@ -114,68 +114,72 @@ - (void)_readData:(NSMutableData*)data withLength:(NSUInteger)length completionB block(NO); } } - + }); } - (void)_readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block { GWS_DCHECK(_requestMessage); - [self _readData:headersData withLength:NSUIntegerMax completionBlock:^(BOOL success) { - - if (success) { - NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)]; - if (range.location == NSNotFound) { - [self _readHeaders:headersData withCompletionBlock:block]; - } else { - NSUInteger length = range.location + range.length; - if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) { - if (CFHTTPMessageIsHeaderComplete(_requestMessage)) { - block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]); + [self _readData:headersData + withLength:NSUIntegerMax + completionBlock:^(BOOL success) { + + if (success) { + NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)]; + if (range.location == NSNotFound) { + [self _readHeaders:headersData withCompletionBlock:block]; } else { - GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket); - block(nil); + NSUInteger length = range.location + range.length; + if (CFHTTPMessageAppendBytes(_requestMessage, headersData.bytes, length)) { + if (CFHTTPMessageIsHeaderComplete(_requestMessage)) { + block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]); + } else { + GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket); + block(nil); + } + } else { + GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket); + block(nil); + } } } else { - GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket); block(nil); } - } - } else { - block(nil); - } - - }]; + + }]; } - (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block { GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]); NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity]; - [self _readData:bodyData withLength:length completionBlock:^(BOOL success) { - - if (success) { - if (bodyData.length <= length) { - NSError* error = nil; - if ([_request performWriteData:bodyData error:&error]) { - NSUInteger remainingLength = length - bodyData.length; - if (remainingLength) { - [self _readBodyWithRemainingLength:remainingLength completionBlock:block]; + [self _readData:bodyData + withLength:length + completionBlock:^(BOOL success) { + + if (success) { + if (bodyData.length <= length) { + NSError* error = nil; + if ([_request performWriteData:bodyData error:&error]) { + NSUInteger remainingLength = length - bodyData.length; + if (remainingLength) { + [self _readBodyWithRemainingLength:remainingLength completionBlock:block]; + } else { + block(YES); + } + } else { + GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); + block(NO); + } } else { - block(YES); + GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket); + block(NO); + GWS_DNOT_REACHED(); } } else { - GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); block(NO); } - } else { - GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket); - block(NO); - GWS_DNOT_REACHED(); - } - } else { - block(NO); - } - - }]; + + }]; } static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) { @@ -189,7 +193,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) { - (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block { GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]); - + while (1) { NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)]; if (range.location == NSNotFound) { @@ -230,16 +234,18 @@ - (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCo return; } } - - [self _readData:chunkData withLength:NSUIntegerMax completionBlock:^(BOOL success) { - - if (success) { - [self _readNextBodyChunk:chunkData completionBlock:block]; - } else { - block(NO); - } - - }]; + + [self _readData:chunkData + withLength:NSUIntegerMax + completionBlock:^(BOOL success) { + + if (success) { + [self _readNextBodyChunk:chunkData completionBlock:block]; + } else { + block(NO); + } + + }]; } @end @@ -247,11 +253,11 @@ - (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCo @implementation GCDWebServerConnection (Write) - (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block { - dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, kGCDWebServerGCDQueue, ^{ + dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{ [data self]; // Keeps ARC from releasing data too early }); - dispatch_write(_socket, buffer, kGCDWebServerGCDQueue, ^(dispatch_data_t remainingData, int error) { - + dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) { + @autoreleasepool { if (error == 0) { GWS_DCHECK(remainingData == NULL); @@ -262,7 +268,7 @@ - (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)b block(NO); } } - + }); #if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE dispatch_release(buffer); @@ -279,7 +285,7 @@ - (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block { - (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { GWS_DCHECK([_response hasBody]); [_response performReadDataWithCompletion:^(NSData* data, NSError* error) { - + if (data) { if (data.length) { if (_response.usesChunkedTransferEncoding) { @@ -302,22 +308,24 @@ - (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { *ptr = '\n'; data = chunk; } - [self _writeData:data withCompletionBlock:^(BOOL success) { - - if (success) { - [self _writeBodyWithCompletionBlock:block]; - } else { - block(NO); - } - - }]; + [self _writeData:data + withCompletionBlock:^(BOOL success) { + + if (success) { + [self _writeBodyWithCompletionBlock:block]; + } else { + block(NO); + } + + }]; } else { if (_response.usesChunkedTransferEncoding) { - [self _writeData:_lastChunkData withCompletionBlock:^(BOOL success) { - - block(success); - - }]; + [self _writeData:_lastChunkData + withCompletionBlock:^(BOOL success) { + + block(success); + + }]; } else { block(YES); } @@ -326,7 +334,7 @@ - (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error); block(NO); } - + }]; } @@ -334,7 +342,7 @@ - (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block { @implementation GCDWebServerConnection -@synthesize server=_server, localAddressData=_localAddress, remoteAddressData=_remoteAddress, totalBytesRead=_bytesRead, totalBytesWritten=_bytesWritten; +@synthesize server = _server, localAddressData = _localAddress, remoteAddressData = _remoteAddress, totalBytesRead = _bytesRead, totalBytesWritten = _bytesWritten; + (void)initialize { if (_CRLFData == nil) { @@ -376,14 +384,15 @@ - (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode { - (void)_startProcessingRequest { GWS_DCHECK(_responseMessage == NULL); - + GCDWebServerResponse* preflightResponse = [self preflightRequest:_request]; if (preflightResponse) { [self _finishProcessingRequest:preflightResponse]; } else { - [self processRequest:_request completion:^(GCDWebServerResponse* processResponse) { - [self _finishProcessingRequest:processResponse]; - }]; + [self processRequest:_request + completion:^(GCDWebServerResponse* processResponse) { + [self _finishProcessingRequest:processResponse]; + }]; } } @@ -391,7 +400,7 @@ - (void)_startProcessingRequest { - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { GWS_DCHECK(_responseMessage == NULL); BOOL hasBody = NO; - + if (response) { response = [self overrideResponse:response forRequest:_request]; } @@ -407,7 +416,7 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { _response = response; } } - + if (_response) { [self _initializeResponseHeadersWithStatusCode:_response.statusCode]; if (_response.lastModifiedDate) { @@ -436,24 +445,23 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response { CFHTTPMessageSetHeaderFieldValue(_responseMessage, (__bridge CFStringRef)key, (__bridge CFStringRef)obj); }]; [self _writeHeadersWithCompletionBlock:^(BOOL success) { - + if (success) { if (hasBody) { [self _writeBodyWithCompletionBlock:^(BOOL successInner) { - + [_response performClose]; // TODO: There's nothing we can do on failure as headers have already been sent - + }]; } } else if (hasBody) { [_response performClose]; } - + }]; } else { [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; } - } - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData { @@ -463,7 +471,7 @@ - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; return; } - + if (initialData.length) { if (![_request performWriteData:initialData error:&error]) { GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error); @@ -475,19 +483,20 @@ - (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData } length -= initialData.length; } - + if (length) { - [self _readBodyWithRemainingLength:length completionBlock:^(BOOL success) { - - NSError* localError = nil; - if ([_request performClose:&localError]) { - [self _startProcessingRequest]; - } else { - GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + [self _readBodyWithRemainingLength:length + completionBlock:^(BOOL success) { + + NSError* localError = nil; + if ([_request performClose:&localError]) { + [self _startProcessingRequest]; + } else { + GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + } + + }]; } else { if ([_request performClose:&error]) { [self _startProcessingRequest]; @@ -505,100 +514,103 @@ - (void)_readChunkedBodyWithInitialData:(NSData*)initialData { [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; return; } - + NSMutableData* chunkData = [[NSMutableData alloc] initWithData:initialData]; - [self _readNextBodyChunk:chunkData completionBlock:^(BOOL success) { - - NSError* localError = nil; - if ([_request performClose:&localError]) { - [self _startProcessingRequest]; - } else { - GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + [self _readNextBodyChunk:chunkData + completionBlock:^(BOOL success) { + + NSError* localError = nil; + if ([_request performClose:&localError]) { + [self _startProcessingRequest]; + } else { + GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + } + + }]; } - (void)_readRequestHeaders { _requestMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true); NSMutableData* headersData = [[NSMutableData alloc] initWithCapacity:kHeadersReadCapacity]; - [self _readHeaders:headersData withCompletionBlock:^(NSData* extraData) { - - if (extraData) { - NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase - if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) { - requestMethod = @"GET"; - _virtualHEAD = YES; - } - NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones - NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage)); - if (requestURL) { - requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders]; - GWS_DCHECK(requestURL); - } - NSString* requestPath = requestURL ? GCDWebServerUnescapeURLString(CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL))) : nil; // Don't use -[NSURL path] which strips the ending slash - NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped; - NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{}; - if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) { - for (_handler in _server.handlers) { - _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery); - if (_request) { - break; + [self _readHeaders:headersData + withCompletionBlock:^(NSData* extraData) { + + if (extraData) { + NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(_requestMessage)); // Method verbs are case-sensitive and uppercase + if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@"HEAD"]) { + requestMethod = @"GET"; + _virtualHEAD = YES; } - } - if (_request) { - _request.localAddressData = self.localAddressData; - _request.remoteAddressData = self.remoteAddressData; - if ([_request hasBody]) { - [_request prepareForWriting]; - if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) { - NSString* expectHeader = [requestHeaders objectForKey:@"Expect"]; - if (expectHeader) { - if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing - [self _writeData:_continueData withCompletionBlock:^(BOOL success) { - - if (success) { - if (_request.usesChunkedTransferEncoding) { - [self _readChunkedBodyWithInitialData:extraData]; - } else { - [self _readBodyWithLength:_request.contentLength initialData:extraData]; - } + NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones + NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(_requestMessage)); + if (requestURL) { + requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders]; + GWS_DCHECK(requestURL); + } + NSString* requestPath = requestURL ? GCDWebServerUnescapeURLString(CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL))) : nil; // Don't use -[NSURL path] which strips the ending slash + NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped; + NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{}; + if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) { + for (_handler in _server.handlers) { + _request = _handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery); + if (_request) { + break; + } + } + if (_request) { + _request.localAddressData = self.localAddressData; + _request.remoteAddressData = self.remoteAddressData; + if ([_request hasBody]) { + [_request prepareForWriting]; + if (_request.usesChunkedTransferEncoding || (extraData.length <= _request.contentLength)) { + NSString* expectHeader = [requestHeaders objectForKey:@"Expect"]; + if (expectHeader) { + if ([expectHeader caseInsensitiveCompare:@"100-continue"] == NSOrderedSame) { // TODO: Actually validate request before continuing + [self _writeData:_continueData + withCompletionBlock:^(BOOL success) { + + if (success) { + if (_request.usesChunkedTransferEncoding) { + [self _readChunkedBodyWithInitialData:extraData]; + } else { + [self _readBodyWithLength:_request.contentLength initialData:extraData]; + } + } + + }]; + } else { + GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed]; + } + } else { + if (_request.usesChunkedTransferEncoding) { + [self _readChunkedBodyWithInitialData:extraData]; + } else { + [self _readBodyWithLength:_request.contentLength initialData:extraData]; } - - }]; + } } else { - GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed]; + GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest]; } } else { - if (_request.usesChunkedTransferEncoding) { - [self _readChunkedBodyWithInitialData:extraData]; - } else { - [self _readBodyWithLength:_request.contentLength initialData:extraData]; - } + [self _startProcessingRequest]; } } else { - GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest]; + _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery]; + GWS_DCHECK(_request); + [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_MethodNotAllowed]; } } else { - [self _startProcessingRequest]; + [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; + GWS_DNOT_REACHED(); } } else { - _request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery]; - GWS_DCHECK(_request); - [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_MethodNotAllowed]; + [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; } - } else { - [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - GWS_DNOT_REACHED(); - } - } else { - [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError]; - } - - }]; + + }]; } - (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket { @@ -608,15 +620,15 @@ - (id)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress re _remoteAddress = remoteAddress; _socket = socket; GWS_LOG_DEBUG(@"Did open connection on socket %i", _socket); - + [_server willStartConnection:self]; - + if (![self open]) { close(_socket); return nil; } _opened = YES; - + [self _readRequestHeaders]; } return self; @@ -637,17 +649,17 @@ - (void)dealloc { } else { GWS_LOG_DEBUG(@"Did close connection on socket %i", _socket); } - + if (_opened) { [self close]; } - + [_server didEndConnection:self]; - + if (_requestMessage) { CFRelease(_requestMessage); } - + if (_responseMessage) { CFRelease(_responseMessage); } @@ -660,25 +672,28 @@ @implementation GCDWebServerConnection (Subclassing) - (BOOL)open { #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if (_server.recordingEnabled) { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" _connectionIndex = OSAtomicIncrement32(&_connectionCounter); - +#pragma clang diagnostic pop + _requestPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]; _requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); GWS_DCHECK(_requestFD > 0); - + _responsePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]; _responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); GWS_DCHECK(_responseFD > 0); } #endif - + return YES; } - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length { GWS_LOG_DEBUG(@"Connection received %lu bytes on socket %i", (unsigned long)length, _socket); _bytesRead += length; - + #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if ((_requestFD > 0) && (write(_requestFD, bytes, length) != (ssize_t)length)) { GWS_LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno); @@ -691,7 +706,7 @@ - (void)didReadBytes:(const void*)bytes length:(NSUInteger)length { - (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length { GWS_LOG_DEBUG(@"Connection sent %lu bytes on socket %i", (unsigned long)length, _socket); _bytesWritten += length; - + #ifdef __GCDWEBSERVER_ENABLE_TESTING__ if ((_responseFD > 0) && (write(_responseFD, bytes, length) != (ssize_t)length)) { GWS_LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno); @@ -758,12 +773,7 @@ - (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request { - (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion { GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead); - @try { - _handler.asyncProcessBlock(request, completion); - } - @catch (NSException* exception) { - GWS_LOG_EXCEPTION(exception); - } + _handler.asyncProcessBlock(request, [completion copy]); } // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 @@ -824,7 +834,7 @@ - (void)close { } unlink([_requestPath fileSystemRepresentation]); } - + if (_responsePath) { BOOL success = NO; NSError* error = nil; @@ -840,7 +850,7 @@ - (void)close { unlink([_responsePath fileSystemRepresentation]); } #endif - + if (_request) { GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten); } else { diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.h b/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.h index a8b2857042..e5be05cf23 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.m b/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.m index 71f20dafad..bcfc102809 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.m +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerFunctions.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -163,8 +163,8 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { static NSDictionary* _overrides = nil; if (_overrides == nil) { _overrides = [[NSDictionary alloc] initWithObjectsAndKeys: - @"text/css", @"css", - nil]; + @"text/css", @"css", + nil]; } NSString* mimeType = nil; extension = [extension lowercaseString]; @@ -182,11 +182,17 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { } NSString* GCDWebServerEscapeURLString(NSString* string) { - return [string stringByAddingPercentEncodingWithAllowedCharacters:[[NSCharacterSet characterSetWithCharactersInString:@":@/?&=+,"] invertedSet]]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR(":@/?&=+"), kCFStringEncodingUTF8)); +#pragma clang diagnostic pop } NSString* GCDWebServerUnescapeURLString(NSString* string) { - return [string stringByRemovingPercentEncoding]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)string, CFSTR(""), kCFStringEncodingUTF8)); +#pragma clang diagnostic pop } NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form) { @@ -199,13 +205,13 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { break; } [scanner setScanLocation:([scanner scanLocation] + 1)]; - + NSString* value = nil; [scanner scanUpToString:@"&" intoString:&value]; if (value == nil) { value = @""; } - + key = [key stringByReplacingOccurrencesOfString:@"+" withString:@" "]; NSString* unescapedKey = key ? GCDWebServerUnescapeURLString(key) : nil; value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "]; @@ -216,7 +222,7 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { GWS_LOG_WARNING(@"Failed parsing URL encoded form for key \"%@\" and value \"%@\"", key, value); GWS_DNOT_REACHED(); } - + if ([scanner isAtEnd]) { break; } @@ -240,7 +246,7 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { NSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6) { NSString* address = nil; #if TARGET_OS_IPHONE -#if !TARGET_IPHONE_SIMULATOR +#if !TARGET_IPHONE_SIMULATOR && !TARGET_OS_TV const char* primaryInterface = "en0"; // WiFi interface on iOS #endif #else @@ -261,8 +267,10 @@ BOOL GCDWebServerIsTextContentType(NSString* type) { struct ifaddrs* list; if (getifaddrs(&list) >= 0) { for (struct ifaddrs* ifap = list; ifap; ifap = ifap->ifa_next) { -#if TARGET_IPHONE_SIMULATOR - if (strcmp(ifap->ifa_name, "en0") && strcmp(ifap->ifa_name, "en1")) // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator +#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV + // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator + // Assumption holds for Apple TV running tvOS + if (strcmp(ifap->ifa_name, "en0") && strcmp(ifap->ifa_name, "en1")) #else if (strcmp(ifap->ifa_name, primaryInterface)) #endif diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h b/Provenance/http/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h index 7af51a2004..6e983810f3 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerPrivate.h b/Provenance/http/GCDWebServer/Core/GCDWebServerPrivate.h index 5f9d800f5e..6b70a59d08 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerPrivate.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerPrivate.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -77,7 +77,6 @@ #define GWS_LOG_INFO(...) XLOG_INFO(__VA_ARGS__) #define GWS_LOG_WARNING(...) XLOG_WARNING(__VA_ARGS__) #define GWS_LOG_ERROR(...) XLOG_ERROR(__VA_ARGS__) -#define GWS_LOG_EXCEPTION(__EXCEPTION__) XLOG_EXCEPTION(__EXCEPTION__) #define GWS_DCHECK(__CONDITION__) XLOG_DEBUG_CHECK(__CONDITION__) #define GWS_DNOT_REACHED() XLOG_DEBUG_UNREACHABLE() @@ -102,7 +101,6 @@ extern DDLogLevel GCDWebServerLogLevel; #define GWS_LOG_INFO(...) DDLogInfo(__VA_ARGS__) #define GWS_LOG_WARNING(...) DDLogWarn(__VA_ARGS__) #define GWS_LOG_ERROR(...) DDLogError(__VA_ARGS__) -#define GWS_LOG_EXCEPTION(__EXCEPTION__) DDLogError(@"%@", __EXCEPTION__) /** * If all of the above fail, then use GCDWebServer built-in @@ -118,23 +116,36 @@ typedef NS_ENUM(int, GCDWebServerLoggingLevel) { kGCDWebServerLoggingLevel_Verbose, kGCDWebServerLoggingLevel_Info, kGCDWebServerLoggingLevel_Warning, - kGCDWebServerLoggingLevel_Error, - kGCDWebServerLoggingLevel_Exception + kGCDWebServerLoggingLevel_Error }; extern GCDWebServerLoggingLevel GCDWebServerLogLevel; extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) NS_FORMAT_FUNCTION(2, 3); #if DEBUG -#define GWS_LOG_DEBUG(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); } while (0) +#define GWS_LOG_DEBUG(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); \ + } while (0) #else #define GWS_LOG_DEBUG(...) #endif -#define GWS_LOG_VERBOSE(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); } while (0) -#define GWS_LOG_INFO(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); } while (0) -#define GWS_LOG_WARNING(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); } while (0) -#define GWS_LOG_ERROR(...) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); } while (0) -#define GWS_LOG_EXCEPTION(__EXCEPTION__) do { if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Exception) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Exception, @"%@", __EXCEPTION__); } while (0) +#define GWS_LOG_VERBOSE(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_INFO(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_WARNING(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); \ + } while (0) +#define GWS_LOG_ERROR(...) \ + do { \ + if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); \ + } while (0) #endif @@ -147,10 +158,10 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for #if DEBUG #define GWS_DCHECK(__CONDITION__) \ - do { \ - if (!(__CONDITION__)) { \ - abort(); \ - } \ + do { \ + if (!(__CONDITION__)) { \ + abort(); \ + } \ } while (0) #define GWS_DNOT_REACHED() abort() @@ -168,7 +179,6 @@ extern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* for */ #define kGCDWebServerDefaultMimeType @"application/octet-stream" -#define kGCDWebServerGCDQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) #define kGCDWebServerErrorDomain @"GCDWebServerErrorDomain" static inline BOOL GCDWebServerIsValidByteRange(NSRange range) { @@ -176,7 +186,7 @@ static inline BOOL GCDWebServerIsValidByteRange(NSRange range) { } static inline NSError* GCDWebServerMakePosixError(int code) { - return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithUTF8String:strerror(code)]}]; + return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey : [NSString stringWithUTF8String:strerror(code)]}]; } extern void GCDWebServerInitializeFunctions(void); @@ -186,7 +196,7 @@ extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSStr extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset); extern BOOL GCDWebServerIsTextContentType(NSString* type); extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType); -extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1,2); +extern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1, 2); extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService); @interface GCDWebServerConnection () @@ -200,6 +210,7 @@ extern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOO @property(nonatomic, readonly) NSDictionary* authenticationBasicAccounts; @property(nonatomic, readonly) NSDictionary* authenticationDigestAccounts; @property(nonatomic, readonly) BOOL shouldAutomaticallyMapHEADToGET; +@property(nonatomic, readonly) dispatch_queue_priority_t dispatchQueuePriority; - (void)willStartConnection:(GCDWebServerConnection*)connection; - (void)didEndConnection:(GCDWebServerConnection*)connection; @end diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.h b/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.h index 698d974d63..c7bc31bf73 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.m b/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.m index 6a8c77bbc5..5365f59cb4 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.m +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerRequest.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -94,7 +94,7 @@ - (BOOL)open:(NSError**)error { return NO; } if (![super open:error]) { - deflateEnd(&_stream); + inflateEnd(&_stream); return NO; } return YES; @@ -159,7 +159,7 @@ @interface GCDWebServerRequest () { BOOL _gzipAccepted; NSData* _localAddress; NSData* _remoteAddress; - + BOOL _opened; NSMutableArray* _decoders; NSMutableDictionary* _attributes; @@ -169,8 +169,8 @@ @interface GCDWebServerRequest () { @implementation GCDWebServerRequest : NSObject -@synthesize method=_method, URL=_url, headers=_headers, path=_path, query=_query, contentType=_type, contentLength=_length, ifModifiedSince=_modifiedSince, ifNoneMatch=_noneMatch, - byteRange=_range, acceptsGzipContentEncoding=_gzipAccepted, usesChunkedTransferEncoding=_chunked, localAddressData=_localAddress, remoteAddressData=_remoteAddress; +@synthesize method = _method, URL = _url, headers = _headers, path = _path, query = _query, contentType = _type, contentLength = _length, ifModifiedSince = _modifiedSince, ifNoneMatch = _noneMatch, + byteRange = _range, acceptsGzipContentEncoding = _gzipAccepted, usesChunkedTransferEncoding = _chunked, localAddressData = _localAddress, remoteAddressData = _remoteAddress; - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query { if ((self = [super init])) { @@ -179,7 +179,7 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict _headers = headers; _path = [path copy]; _query = query; - + _type = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Content-Type"]); _chunked = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Transfer-Encoding"]) isEqualToString:@"chunked"]; NSString* lengthHeader = [_headers objectForKey:@"Content-Length"]; @@ -206,13 +206,13 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict } _length = NSUIntegerMax; } - + NSString* modifiedHeader = [_headers objectForKey:@"If-Modified-Since"]; if (modifiedHeader) { _modifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy]; } _noneMatch = [_headers objectForKey:@"If-None-Match"]; - + _range = NSMakeRange(NSUIntegerMax, 0); NSString* rangeHeader = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@"Range"]); if (rangeHeader) { @@ -242,11 +242,11 @@ - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDict GWS_LOG_WARNING(@"Failed to parse 'Range' header \"%@\" for url: %@", rangeHeader, url); } } - + if ([[_headers objectForKey:@"Accept-Encoding"] rangeOfString:@"gzip"].location != NSNotFound) { _gzipAccepted = YES; } - + _decoders = [[NSMutableArray alloc] init]; _attributes = [[NSMutableDictionary alloc] init]; } diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.h b/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.h index 01ef2abed1..2ec2deefff 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.h +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.m b/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.m index c3d7c5828e..b5eb57c368 100644 --- a/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.m +++ b/Provenance/http/GCDWebServer/Core/GCDWebServerResponse.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -168,7 +168,7 @@ @interface GCDWebServerResponse () { NSMutableDictionary* _headers; BOOL _chunked; BOOL _gzipped; - + BOOL _opened; NSMutableArray* _encoders; id __unsafe_unretained _reader; @@ -177,8 +177,8 @@ @interface GCDWebServerResponse () { @implementation GCDWebServerResponse -@synthesize contentType=_type, contentLength=_length, statusCode=_status, cacheControlMaxAge=_maxAge, lastModifiedDate=_lastModified, eTag=_eTag, - gzipContentEncodingEnabled=_gzipped, additionalHeaders=_headers; +@synthesize contentType = _type, contentLength = _length, statusCode = _status, cacheControlMaxAge = _maxAge, lastModifiedDate = _lastModified, eTag = _eTag, + gzipContentEncodingEnabled = _gzipped, additionalHeaders = _headers; + (instancetype)response { return [[[self class] alloc] init]; @@ -241,8 +241,9 @@ - (BOOL)performOpen:(NSError**)error { } - (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block { + GWS_DCHECK(_opened); if ([_reader respondsToSelector:@selector(asyncReadDataWithCompletion:)]) { - [_reader asyncReadDataWithCompletion:block]; + [_reader asyncReadDataWithCompletion:[block copy]]; } else { NSError* error = nil; NSData* data = [_reader readData:&error]; diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.h b/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.h index ef94b9715f..5048d08035 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.h +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.m b/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.m index 518fe69fe3..861ab52d90 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.m +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerDataRequest.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ @interface GCDWebServerDataRequest () { @private NSMutableData* _data; - + NSString* _text; id _jsonObject; } @@ -42,7 +42,7 @@ @interface GCDWebServerDataRequest () { @implementation GCDWebServerDataRequest -@synthesize data=_data; +@synthesize data = _data; - (BOOL)open:(NSError**)error { if (self.contentLength != NSUIntegerMax) { @@ -52,7 +52,7 @@ - (BOOL)open:(NSError**)error { } if (_data == nil) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed allocating memory"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed allocating memory" }]; } return NO; } diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.h b/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.h index 427a800e35..ad29eaba8e 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.h +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.m b/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.m index f0705b0d16..0309d6404d 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.m +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerFileRequest.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -40,7 +40,7 @@ @interface GCDWebServerFileRequest () { @implementation GCDWebServerFileRequest -@synthesize temporaryPath=_temporaryPath; +@synthesize temporaryPath = _temporaryPath; - (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query { if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) { @@ -85,14 +85,14 @@ - (BOOL)close:(NSError**)error { NSString* creationDateHeader = [self.headers objectForKey:@"X-GCDWebServer-CreationDate"]; if (creationDateHeader) { NSDate* date = GCDWebServerParseISO8601(creationDateHeader); - if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:_temporaryPath error:error]) { + if (!date || ![[NSFileManager defaultManager] setAttributes:@{ NSFileCreationDate : date } ofItemAtPath:_temporaryPath error:error]) { return NO; } } NSString* modifiedDateHeader = [self.headers objectForKey:@"X-GCDWebServer-ModifiedDate"]; if (modifiedDateHeader) { NSDate* date = GCDWebServerParseRFC822(modifiedDateHeader); - if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: date} ofItemAtPath:_temporaryPath error:error]) { + if (!date || ![[NSFileManager defaultManager] setAttributes:@{ NSFileModificationDate : date } ofItemAtPath:_temporaryPath error:error]) { return NO; } } diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h b/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h index 2463ca292c..832c2e7173 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m b/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m index fb06bcba6d..c6cb4856fb 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -61,7 +61,7 @@ @interface GCDWebServerMultiPart () { @implementation GCDWebServerMultiPart -@synthesize controlName=_controlName, contentType=_contentType, mimeType=_mimeType; +@synthesize controlName = _controlName, contentType = _contentType, mimeType = _mimeType; - (id)initWithControlName:(NSString*)name contentType:(NSString*)type { if ((self = [super init])) { @@ -83,12 +83,12 @@ @interface GCDWebServerMultiPartArgument () { @implementation GCDWebServerMultiPartArgument -@synthesize data=_data, string=_string; +@synthesize data = _data, string = _string; - (id)initWithControlName:(NSString*)name contentType:(NSString*)type data:(NSData*)data { if ((self = [super initWithControlName:name contentType:type])) { _data = data; - + if ([self.contentType hasPrefix:@"text/"]) { NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); _string = [[NSString alloc] initWithData:_data encoding:GCDWebServerStringEncodingFromCharset(charset)]; @@ -112,7 +112,7 @@ @interface GCDWebServerMultiPartFile () { @implementation GCDWebServerMultiPartFile -@synthesize fileName=_fileName, temporaryPath=_temporaryPath; +@synthesize fileName = _fileName, temporaryPath = _temporaryPath; - (id)initWithControlName:(NSString*)name contentType:(NSString*)type fileName:(NSString*)fileName temporaryPath:(NSString*)temporaryPath { if ((self = [super initWithControlName:name contentType:type])) { @@ -140,7 +140,7 @@ @interface GCDWebServerMIMEStreamParser () { NSMutableData* _data; NSMutableArray* _arguments; NSMutableArray* _files; - + NSString* _controlName; NSString* _fileName; NSString* _contentType; @@ -194,11 +194,10 @@ - (void)dealloc { // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 - (BOOL)_parseData { BOOL success = YES; - + if (_state == kParserState_Headers) { NSRange range = [_data rangeOfData:_newlinesData options:0 range:NSMakeRange(0, _data.length)]; if (range.location != NSNotFound) { - _controlName = nil; _fileName = nil; _contentType = nil; @@ -256,12 +255,12 @@ - (BOOL)_parseData { GWS_DNOT_REACHED(); success = NO; } - + [_data replaceBytesInRange:NSMakeRange(0, range.location + range.length) withBytes:NULL length:0]; _state = kParserState_Content; } } - + if ((_state == kParserState_Start) || (_state == kParserState_Content)) { NSRange range = [_data rangeOfData:_boundary options:0 range:NSMakeRange(0, _data.length)]; if (range.location != NSNotFound) { @@ -269,7 +268,6 @@ - (BOOL)_parseData { NSRange subRange1 = [_data rangeOfData:_newlineData options:NSDataSearchAnchored range:subRange]; NSRange subRange2 = [_data rangeOfData:_dashNewlineData options:NSDataSearchAnchored range:subRange]; if ((subRange1.location != NSNotFound) || (subRange2.location != NSNotFound)) { - if (_state == kParserState_Content) { const void* dataBytes = _data.bytes; NSUInteger dataLength = range.location - 2; @@ -301,7 +299,7 @@ - (BOOL)_parseData { [_arguments addObject:argument]; } } - + if (subRange1.location != NSNotFound) { [_data replaceBytesInRange:NSMakeRange(0, subRange1.location + subRange1.length) withBytes:NULL length:0]; _state = kParserState_Headers; @@ -333,7 +331,7 @@ - (BOOL)_parseData { } } } - + return success; } @@ -358,7 +356,7 @@ @interface GCDWebServerMultiPartFormRequest () { @implementation GCDWebServerMultiPartFormRequest -@synthesize arguments=_arguments, files=_files; +@synthesize arguments = _arguments, files = _files; + (NSString*)mimeType { return @"multipart/form-data"; @@ -377,7 +375,7 @@ - (BOOL)open:(NSError**)error { _parser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:nil arguments:_arguments files:_files]; if (_parser == nil) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed starting to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed starting to parse multipart form data" }]; } return NO; } @@ -387,7 +385,7 @@ - (BOOL)open:(NSError**)error { - (BOOL)writeData:(NSData*)data error:(NSError**)error { if (![_parser appendBytes:data.bytes length:data.length]) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed continuing to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed continuing to parse multipart form data" }]; } return NO; } @@ -399,7 +397,7 @@ - (BOOL)close:(NSError**)error { _parser = nil; if (!atEnd) { if (error) { - *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Failed finishing to parse multipart form data"}]; + *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{ NSLocalizedDescriptionKey : @"Failed finishing to parse multipart form data" }]; } return NO; } diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h b/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h index e36eac3933..973538044f 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m b/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m index f210fa0ec9..328fd75510 100644 --- a/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m +++ b/Provenance/http/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -39,7 +39,7 @@ @interface GCDWebServerURLEncodedFormRequest () { @implementation GCDWebServerURLEncodedFormRequest -@synthesize arguments=_arguments; +@synthesize arguments = _arguments; + (NSString*)mimeType { return @"application/x-www-form-urlencoded"; @@ -49,12 +49,12 @@ - (BOOL)close:(NSError**)error { if (![super close:error]) { return NO; } - + NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset"); NSString* string = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)]; _arguments = GCDWebServerParseURLEncodedForm(string); GWS_DCHECK(_arguments); - + return YES; } diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.h b/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.h index b0c64938e5..6e06cd89c6 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.h +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.m b/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.m index ea02799b7d..3bffb25bb4 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.m +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerDataResponse.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -49,10 +49,10 @@ - (instancetype)initWithData:(NSData*)data contentType:(NSString*)type { GWS_DNOT_REACHED(); return nil; } - + if ((self = [super init])) { _data = data; - + self.contentType = type; self.contentLength = data.length; } diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.h b/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.h index 381b1224ea..f80c7ff913 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.h +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -37,45 +37,45 @@ /** * Creates a client error response with the corresponding HTTP status code. */ -+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); ++ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Creates a server error response with the corresponding HTTP status code. */ -+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); ++ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Creates a client error response with the corresponding HTTP status code * and an underlying NSError. */ -+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); ++ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Creates a server error response with the corresponding HTTP status code * and an underlying NSError. */ -+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); ++ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Initializes a client error response with the corresponding HTTP status code. */ -- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); +- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Initializes a server error response with the corresponding HTTP status code. */ -- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2,3); +- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3); /** * Initializes a client error response with the corresponding HTTP status code * and an underlying NSError. */ -- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); +- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); /** * Initializes a server error response with the corresponding HTTP status code * and an underlying NSError. */ -- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3,4); +- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4); @end diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.m b/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.m index c2e44227e6..ef6a991d2f 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.m +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerErrorResponse.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.h b/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.h index 19d284d4db..050e92f88b 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.h +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.m b/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.m index 86de0731f1..3e717a3a2a 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.m +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerFileResponse.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -91,7 +91,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme } #endif NSUInteger fileSize = (NSUInteger)info.st_size; - + BOOL hasByteRange = GCDWebServerIsValidByteRange(range); if (hasByteRange) { if (range.location != NSUIntegerMax) { @@ -108,7 +108,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme range.location = 0; range.length = fileSize; } - + if ((self = [super init])) { _path = [path copy]; _offset = range.location; @@ -118,7 +118,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme [self setValue:[NSString stringWithFormat:@"bytes %lu-%lu/%lu", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), (unsigned long)fileSize] forAdditionalHeader:@"Content-Range"]; GWS_LOG_DEBUG(@"Using content bytes range [%lu-%lu] for file \"%@\"", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), path); } - + if (attachment) { NSString* fileName = [path lastPathComponent]; NSData* data = [[fileName stringByReplacingOccurrencesOfString:@"\"" withString:@""] dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES]; @@ -130,7 +130,7 @@ - (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachme GWS_DNOT_REACHED(); } } - + self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension]); self.contentLength = _size; self.lastModifiedDate = _NSDateFromTimeSpec(&info.st_mtimespec); diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.h b/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.h index 53b6eba530..2731b7c656 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.h +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.h @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.m b/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.m index 7f96943e05..2ed01c19ae 100644 --- a/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.m +++ b/Provenance/http/GCDWebServer/Responses/GCDWebServerStreamedResponse.m @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without @@ -48,19 +48,20 @@ + (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWeb } - (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block { - return [self initWithContentType:type asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { - - NSError* error = nil; - NSData* data = block(&error); - completionBlock(data, error); - - }]; + return [self initWithContentType:type + asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) { + + NSError* error = nil; + NSData* data = block(&error); + completionBlock(data, error); + + }]; } - (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block { if ((self = [super init])) { _block = [block copy]; - + self.contentType = type; } return self; diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Info.plist b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Info.plist similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Info.plist rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Info.plist diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap-theme.css b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap-theme.css similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap-theme.css rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap-theme.css diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap.css b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap.css similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/bootstrap.css rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/bootstrap.css diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/index.css b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/index.css similarity index 98% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/index.css rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/index.css index aed15e49b9..53b0247a9c 100644 --- a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/index.css +++ b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/index.css @@ -1,5 +1,5 @@ /* - Copyright (c) 2012-2014, Pierre-Olivier Latour + Copyright (c) 2012-2015, Pierre-Olivier Latour All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/jquery.fileupload.css b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/jquery.fileupload.css similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/css/jquery.fileupload.css rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/css/jquery.fileupload.css diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/en.lproj/Localizable.strings b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/en.lproj/Localizable.strings similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/en.lproj/Localizable.strings rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/en.lproj/Localizable.strings diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.eot b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.eot rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.eot diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.svg b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.svg rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.svg diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.ttf b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.ttf rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.ttf diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.woff b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/fonts/glyphicons-halflings-regular.woff rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/fonts/glyphicons-halflings-regular.woff diff --git a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/index.html b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/index.html similarity index 86% rename from Provenance/http/GCDWebUploader/GCDWebUploader.bundle/index.html rename to Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/index.html index d985df2a9a..1bfd28e110 100644 --- a/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/index.html +++ b/Provenance/http/GCDWebUploader/GCDWebUploader.bundle/Contents/Resources/index.html @@ -1,5 +1,5 @@